diff --git a/AndroidKernel.mk b/AndroidKernel.mk index 3db9ac9f0bcb6..ae8176f420e55 100644 --- a/AndroidKernel.mk +++ b/AndroidKernel.mk @@ -32,6 +32,16 @@ ifeq ($(TARGET_ARCH),arm) KERNEL_CONFIG_OVERRIDE := CONFIG_ANDROID_BINDER_IPC_32BIT=y endif endif +ifeq ($(WT_FINAL_RELEASE),yes) +KERNEL_CONFIG_OVERRIDE += CONFIG_DYNAMIC_DEBUG=n +KERNEL_CONFIG_OVERRIDE += CONFIG_DEBUG_RODATA=n +KERNEL_CONFIG_OVERRIDE += CONFIG_DEBUG_SPINLOCK=n +KERNEL_CONFIG_OVERRIDE += CONFIG_MSM_DEBUG_LAR_UNLOCK=n +KERNEL_CONFIG_OVERRIDE += CONFIG_CORESIGHT_DBGUI=n +KERNEL_CONFIG_OVERRIDE += CONFIG_MSM_RTB=n +KERNEL_CONFIG_OVERRIDE += CONFIG_MSM_RTB_SEPARATE_CPUS=n +KERNEL_CONFIG_OVERRIDE += CONFIG_IKCONFIG=n +endif TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)) ifeq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) @@ -50,22 +60,22 @@ endif mkfile_path := $(abspath $(lastword $(MAKEFILE_LIST))) current_dir := $(notdir $(patsubst %/,%,$(dir $(mkfile_path)))) ifeq ($(TARGET_KERNEL_VERSION),) - TARGET_KERNEL_VERSION := 3.18 + TARGET_KERNEL_VERSION := 3.18 endif TARGET_KERNEL := msm-$(TARGET_KERNEL_VERSION) ifeq ($(TARGET_KERNEL),$(current_dir)) - # New style, kernel/msm-version - BUILD_ROOT_LOC := ../../ - TARGET_KERNEL_SOURCE := kernel/$(TARGET_KERNEL) - KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/kernel/$(TARGET_KERNEL) - KERNEL_SYMLINK := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ - KERNEL_USR := $(KERNEL_SYMLINK)/usr + # New style, kernel/msm-version + BUILD_ROOT_LOC := ../../ + TARGET_KERNEL_SOURCE := kernel/$(TARGET_KERNEL) + KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/kernel/$(TARGET_KERNEL) + KERNEL_SYMLINK := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ + KERNEL_USR := $(KERNEL_SYMLINK)/usr else - # Legacy style, kernel source directly under kernel - KERNEL_LEGACY_DIR := true - BUILD_ROOT_LOC := ../ - TARGET_KERNEL_SOURCE := kernel - KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ + # Legacy style, kernel source directly under kernel + KERNEL_LEGACY_DIR := true + BUILD_ROOT_LOC := ../ + TARGET_KERNEL_SOURCE := kernel + KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ endif KERNEL_CONFIG := $(KERNEL_OUT)/.config @@ -127,7 +137,7 @@ $(KERNEL_CONFIG): $(KERNEL_OUT) $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG) $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ - echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ + for CONFIG_OVERRIDE in $(KERNEL_CONFIG_OVERRIDE);do echo $$CONFIG_OVERRIDE >> $(KERNEL_OUT)/.config;done; \ $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) oldconfig; fi $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_OUT) $(KERNEL_HEADERS_INSTALL) @@ -150,7 +160,7 @@ $(KERNEL_HEADERS_INSTALL): $(KERNEL_OUT) $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG); fi $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ - echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \ + for CONFIG_OVERRIDE in $(KERNEL_CONFIG_OVERRIDE);do echo $$CONFIG_OVERRIDE >> $(KERNEL_OUT)/.config;done; \ $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(BUILD_ROOT_LOC)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) oldconfig; fi kerneltags: $(KERNEL_OUT) $(KERNEL_CONFIG) diff --git a/Documentation/device-mapper/verity.txt b/Documentation/device-mapper/verity.txt index ac71f1f632185..d1655d2b44196 100644 --- a/Documentation/device-mapper/verity.txt +++ b/Documentation/device-mapper/verity.txt @@ -17,11 +17,11 @@ Construction Parameters 0 is the original format used in the Chromium OS. The salt is appended when hashing, digests are stored continuously and - the rest of the block is padded with zeros. + the rest of the block is padded with zeroes. 1 is the current format that should be used for new devices. The salt is prepended when hashing and each digest is - padded with zeros to the power of two. + padded with zeroes to the power of two. This is the device containing data, the integrity of which needs to be @@ -72,6 +72,37 @@ Construction Parameters notify user space. +ignore_zero_blocks + Do not verify blocks that are expected to contain zeroes and always return + zeroes instead. This may be useful if the partition contains unused blocks + that are not guaranteed to contain zeroes. + +use_fec_from_device + Use forward error correction (FEC) to recover from corruption if hash + verification fails. Use encoding data from the specified device. This + may be the same device where data and hash blocks reside, in which case + fec_start must be outside data and hash areas. + + If the encoding data covers additional metadata, it must be accessible + on the hash device after the hash blocks. + + Note: block sizes for data and hash devices must match. Also, if the + verity is encrypted the should be too. + +fec_roots + Number of generator roots. This equals to the number of parity bytes in + the encoding data. For example, in RS(M, N) encoding, the number of roots + is M-N. + +fec_blocks + The number of encoding data blocks on the FEC device. The block size for + the FEC device is . + +fec_start + This is the offset, in blocks, from the start of the + FEC device to the beginning of the encoding data. + + Theory of operation =================== @@ -91,6 +122,11 @@ per-block basis. This allows for a lightweight hash computation on first read into the page cache. Block hashes are stored linearly, aligned to the nearest block size. +If forward error correction (FEC) support is enabled any recovery of +corrupted data will be verified using the cryptographic hash of the +corresponding data. This is why combining error correction with +integrity checking is essential. + Hash Tree --------- diff --git a/Documentation/devicetree/bindings/arm/msm/clock-controller.txt b/Documentation/devicetree/bindings/arm/msm/clock-controller.txt index 20b46dc5dfeff..7d060b169494c 100644 --- a/Documentation/devicetree/bindings/arm/msm/clock-controller.txt +++ b/Documentation/devicetree/bindings/arm/msm/clock-controller.txt @@ -27,6 +27,7 @@ Required properties: "qcom,gcc-spm-8937" "qcom,gcc-8953" "qcom,gcc-8940" + "qcom,gcc-8920" "qcom,rpmcc-8994" "qcom,rpmcc-8992" "qcom,rpmcc-8916" @@ -46,6 +47,7 @@ Required properties: "qcom,cc-debug-8937" "qcom,cc-debug-8917" "qcom,cc-debug-8940" + "qcom,cc-debug-8920" "qcom,gcc-mdss-8936" "qcom,gcc-mdss-8909" "qcom,gcc-mdss-8916" @@ -54,6 +56,7 @@ Required properties: "qcom,gcc-mdss-8917" "qcom,gcc-mdss-8953" "qcom,gcc-mdss-8940" + "qcom,gcc-mdss-8920" "qcom,mmsscc-8994v2" "qcom,mmsscc-8994" "qcom,mmsscc-8992" @@ -67,6 +70,7 @@ Required properties: "qcom,gpucc-8996-v3.0" "qcom,gpucc-8996-pro" "qcom,gcc-gfx-8953" + "qcom,gcc-gfx-sdm450" "qcom,gcc-californium" "qcom,cc-debug-californium" "qcom,gcc-mdm9607" diff --git a/Documentation/devicetree/bindings/arm/msm/msm.txt b/Documentation/devicetree/bindings/arm/msm/msm.txt index 738ca1015380f..6cd7ceb88dcef 100644 --- a/Documentation/devicetree/bindings/arm/msm/msm.txt +++ b/Documentation/devicetree/bindings/arm/msm/msm.txt @@ -101,6 +101,9 @@ SoCs: - MSM8953 compatible = "qcom,msm8953" +- SDM450 + compatible = "qcom,sdm450" + - MSM8937 compatible = "qcom,msm8937" @@ -223,6 +226,8 @@ compatible = "qcom,msm8917-qrd-sku5" compatible = "qcom,msm8917-qgp-tmo" compatible = "qcom,msm8920-cdp" compatible = "qcom,msm8920-mtp" +compatible = "qcom,msm8920-qrd" +compatible = "qcom,msm8920-qrd-sku7" compatible = "qcom,msm8940-cdp" compatible = "qcom,msm8940-mtp" compatible = "qcom,msm8940-rumi" @@ -289,6 +294,9 @@ compatible = "qcom,msm8953-cdp" compatible = "qcom,msm8953-mtp" compatible = "qcom,msm8953-qrd" compatible = "qcom,msm8953-qrd-sku3" +compatible = "qcom,sdm450-cdp" +compatible = "qcom,sdm450-mtp" +compatible = "qcom,sdm450-qrd" compatible = "qcom,mdm9640-cdp" compatible = "qcom,mdm9640-mtp" compatible = "qcom,mdm9640-rumi" diff --git a/Documentation/devicetree/bindings/arm/msm/msm_bandwidth_monitor.txt b/Documentation/devicetree/bindings/arm/msm/msm_bandwidth_monitor.txt new file mode 100644 index 0000000000000..22ec10672687b --- /dev/null +++ b/Documentation/devicetree/bindings/arm/msm/msm_bandwidth_monitor.txt @@ -0,0 +1,52 @@ +Bandwidth Monitor driver(BW_MONITOR) +===================================== + +Bandwidth Monitor driver creates logical sensor nodes with thermal core +framework for the specified bus. This logical sensor will be used to monitor +and mitigate the bus bandwidth. This driver can be configured to register +any bus bandwidth as a sensor for it to be monitored. + +The device tree parameters for bandwidth monitor driver(BW_MONITOR) driver are: + +Properties: + +- compatible: + Usage: required + Value type: + Definition: shall be "qcom,bm-sensors" + +- + Usage: required + Definition: Each child node represents a bandwidth sensor and name of + the node will be used as bandwidth sensor name. Each + sensor can represent either single bus bandwidth or + aggregation of multiple bus bandwidth. + +Child node Properties: +- qcom,bm-sensor: + Usage: required + Value type: + Definition: This bandwidth sensor monitors aggregated bandwidth of + these bus bandwidth. + +- qcom,bm-sensor-field: + Usage: required + Value type: + Definition: This property defines the bandwidth to be monitored, + either average bandwidth(ab) or instantaneous + bandwidth(ib). + +Example: + qcom,bm-sensors { + compatible = "qcom,bm-sensors"; + + bw_mm { + qcom,bm-sensor = <&slv_snoc_bimc_0 &slv_snoc_bimc_2>; + qcom,bm-sensor-field = "ab"; + }; + + bw_apps { + qcom,bm-sensor = <&mas_apps_proc>; + qcom,bm-sensor-field = "ib"; + }; + }; diff --git a/Documentation/devicetree/bindings/arm/msm/msm_bus_rules.txt b/Documentation/devicetree/bindings/arm/msm/msm_bus_rules.txt index b68284c8970d2..ed1b9bba50b68 100644 --- a/Documentation/devicetree/bindings/arm/msm/msm_bus_rules.txt +++ b/Documentation/devicetree/bindings/arm/msm/msm_bus_rules.txt @@ -16,17 +16,18 @@ conditions to be monitored. The mandatory properties for the rules are - qcom,src-nodes: An array of phandles denoting the source nodes whose bandwidth votes need to be monitored. -- qcom,src-field: This field represents the voted field of the - source node to be monitored. Possible values - are FLD_IB/FLD_AB/FLD_CLK -- qcom,src-op: The operand to be used when evaluating a node's - bandwidth vote with a threshold.Possible values - are OP_LE/OP_LT/OP_GT/OP_GE. -- qcom,thresh: The threshold in Kbytes/s to be used in vote - evaluation. +- qcom,src-field: An array of fields represents the voted field + of the source node to be monitored. Possible + values are FLD_IB/FLD_AB/FLD_CLK. +- qcom,src-op: An array of operands to be used when evaluating + a node's bandwidth vote with a threshold. + Possible values are OP_LE/OP_LT/OP_GT/OP_GE. +- qcom,thresh: An array of thresholds in Kbytes/s + (in FLD_IB/FLD_AB case) or KHz (in FLD_CLK case) + to be used in vote evaluation. - qcom,mode: The QoS mode to be applied when this rule's criterion are satisfied. Possible values are - THROTTLE_ON/THROTTLE_OFF + THROTTLE_ON/THROTTLE_OFF. - qcom,dest-node: An array of phandles representing the nodes to which the QoS mode is to be applied. @@ -34,6 +35,9 @@ The optional properties for the rule node are: - qcom,dest-bw: The destination bandwidth value in Kbytes/s to be used toward the QoS mode for the destination node. +- qcom,combo-op: A property that is only required when there + are multiple comparison operands to multiple + thresholds, can be OP_AND or OP_OR. Example: static-rules { @@ -42,13 +46,14 @@ Example: #size-cells = <0>; rule@0 { - qcom,src-nodes = <&mas_apss>; - qcom,src-field = ; - qcom,src-op = ; - qcom,thresh = <1599078>; + qcom,src-nodes = <&mas_apss &mas_mdp>; + qcom,src-field = ; + qcom,src-op = ; + qcom,thresh = <1599078 0>; qcom,mode = ; qcom,dest-node = <&mas_apss>; qcom,dest-bw = <1599078>; + qcom,combo-op = ; }; rule@1 { diff --git a/Documentation/devicetree/bindings/cnss/cnss-wlan.txt b/Documentation/devicetree/bindings/cnss/cnss-wlan.txt index e954ca8ace842..5b441b4430bcc 100644 --- a/Documentation/devicetree/bindings/cnss/cnss-wlan.txt +++ b/Documentation/devicetree/bindings/cnss/cnss-wlan.txt @@ -47,8 +47,6 @@ Optional properties: - vdd-wlan-en-supply: WLAN_EN fixed regulator specified by QCA6174 specifications. - qcom,wlan-en-vreg-support: Boolean property to decide the whether the WLAN_EN pin is a gpio or fixed regulator. - - qcom,enable-bootstrap-gpio: Boolean property to decide whether wlan bootstrap - gpio should be enabled or not in this platform. Example: diff --git a/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt b/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt index 924ebeacecfbf..27785e73bd013 100644 --- a/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt +++ b/Documentation/devicetree/bindings/fb/mdss-dsi-panel.txt @@ -326,6 +326,28 @@ Optional properties: 2A/2B command. - qcom,dcs-cmd-by-left: Boolean to indicate that dcs command are sent through the left DSI controller only in a dual-dsi configuration +- qcom,mdss-dsi-panel-hdr-enabled: Boolean to indicate HDR support in panel. +- qcom,mdss-dsi-panel-hdr-color-primaries: + Array of 8 unsigned integers denoting chromaticity of panel.These + values are specified in nits units. The value range is 0 through 50000. + To obtain real chromacity, these values should be divided by factor of + 50000. The structure of array is defined in below order + value 1: x value of white chromaticity of display panel + value 2: y value of white chromaticity of display panel + value 3: x value of red chromaticity of display panel + value 4: y value of red chromaticity of display panel + value 5: x value of green chromaticity of display panel + value 6: y value of green chromaticity of display panel + value 7: x value of blue chromaticity of display panel + value 8: y value of blue chromaticity of display panel +- qcom,mdss-dsi-panel-peak-brightness: Maximum brightness supported by panel.In absence of maximum value + typical value becomes peak brightness. Value is specified in nits units. + To obtail real peak brightness, this value should be divided by factor of + 10000. +- qcom,mdss-dsi-panel-blackness-level: Blackness level supported by panel. Blackness level is defined as + ratio of peak brightness to contrast. Value is specified in nits units. + To obtail real blackness level, this value should be divided by factor of + 10000. - qcom,mdss-dsi-lp11-init: Boolean used to enable the DSI clocks and data lanes (low power 11) before issuing hardware reset line. - qcom,mdss-dsi-init-delay-us: Delay in microseconds(us) before performing any DSI activity in lp11 diff --git a/Documentation/devicetree/bindings/gpu/adreno.txt b/Documentation/devicetree/bindings/gpu/adreno.txt index df1004161c604..8c10323053258 100644 --- a/Documentation/devicetree/bindings/gpu/adreno.txt +++ b/Documentation/devicetree/bindings/gpu/adreno.txt @@ -80,6 +80,9 @@ DCVS Core info Optional Properties: - qcom,initial-powerlevel: This value indicates which qcom,gpu-pwrlevel should be used at start time and when coming back out of resume +- qcom,restrict-powerlevel: This value to limit max GPU power level jump during the clock switch and + while coming back out of slumber. Max GPU power level jump still allowed + from the restricted-pwerlevel. - qcom,bus-control: Boolean. Enables an independent bus vote from the gpu frequency - qcom,bus-width: Bus width in number of bytes. This enables dynamic AB bus voting based on bus width and actual bus transactions. @@ -148,6 +151,10 @@ Optional Properties: baseAddr - base address of the gpu channels in the qdss stm memory region size - size of the gpu stm region +- qcom,tsens-name: + Specify the name of GPU temperature sensor. This name will be used + to get the temperature from the thermal driver API. + GPU Quirks: - qcom,gpu-quirk-two-pass-use-wfi: Signal the GPU to set Set TWOPASSUSEWFI bit in diff --git a/Documentation/devicetree/bindings/input/touchscreen/msg21xx-ts.txt b/Documentation/devicetree/bindings/input/touchscreen/msg21xx-ts.txt deleted file mode 100644 index 0d6289779d8cc..0000000000000 --- a/Documentation/devicetree/bindings/input/touchscreen/msg21xx-ts.txt +++ /dev/null @@ -1,71 +0,0 @@ -Mstar touch controller - -The mstar controller is connected to host processor -via i2c. The controller generates interrupts when the -user touches the panel. The host controller is expected -to read the touch coordinates over i2c and pass the coordinates -to the rest of the system. - -Required properties: - - - compatible : should be "mstar,msg21xx" - - reg : i2c slave address of the device - - interrupt-parent : parent of interrupt - - interrupts : touch sample interrupt to indicate presense or release - of fingers on the panel. - - vdd-supply : Power supply needed to power up the device - - vcc_i2c-supply : Power source required to power up i2c bus - - mstar,irq-gpio : irq gpio which is to provide interrupts to host, - same as "interrupts" node. It will also - contain active low or active high information. - - mstar,reset-gpio : reset gpio to control the reset of chip - - mstar,display-coords : display coords in pixels. It is a four - tuple consisting of min x, min y, max x and - max y values - - pinctrl-names : This should be defined if a target uses pinctrl framework. - See "pinctrl" in Documentation/devicetree/bindings/pinctrl/msm-pinctrl.txt. - Specify the names of the configs that pinctrl can install in driver. - Following are the pinctrl configs that can be installed: - "pmx_ts_active" : Active configuration of pins, this should specify active - config defined in pin groups of interrupt and reset gpio. - "pmx_ts_suspend" : Disabled configuration of pins, this should specify sleep - config defined in pin groups of interrupt and reset gpio. - "pmx_ts_release" : Release configuration of pins, this should specify - release config defined in pin groups of interrupt and reset gpio. - - mstar,num-max-touches: It defines the maximum number of touch supported by the controller. - - mstar,hard-reset-delay-ms : hard reset delay in ms - - mstar,post-hard-reset-delay-ms : post hard reset delay in ms - -Optional properties: - - - mstar,button-map : button map of key codes. It is a three tuple consisting of key codes. - - mstar,panel-coords : panel coords for the chip in pixels. - It is a four tuple consisting of min x, - min y, max x and max y values - - mstar,ic-type : It defines the ic-type of the controller. Values are as folows: - 1 -> msg2133. - 2 -> msg21xxA. - 3 -> msg26xxM. - -Example: - i2c@78b9000 { /* BLSP1 QUP5 */ - mstar@26 { - compatible = "mstar,msg21xx"; - reg = <0x26>; - interrupt-parent = <&msm_gpio>; - interrupts = <13 0x2008>; - mstar,irq-gpio = <&msm_gpio 13 0x00000001>; - mstar,reset-gpio = <&msm_gpio 12 0x0>; - vdd-supply = <&pm8916_l17>; - vcc_i2c-supply = <&pm8916_l6>; - mstar,display-coords = <0 0 480 854>; - pinctrl-names = "pmx_ts_active","pmx_ts_suspend"; - pinctrl-0 = <&ts_int_active &ts_reset_active>; - pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; - mstar,button-map = <172 139 158>; - mstar,ic-type = <2>; - mstar,num_max_touches = <2>; - mstar,hard-reset-delay-ms = <100>; - mstar,post-hard-reset-delay-ms = <100>; - }; - }; diff --git a/Documentation/devicetree/bindings/leds/leds-qpnp-wled.txt b/Documentation/devicetree/bindings/leds/leds-qpnp-wled.txt index 14066d613f0e6..be46d708a6ecf 100644 --- a/Documentation/devicetree/bindings/leds/leds-qpnp-wled.txt +++ b/Documentation/devicetree/bindings/leds/leds-qpnp-wled.txt @@ -25,7 +25,8 @@ Optional properties for WLED: are "wled1", "wled2", "wled3", "wled4" and "auto". default is "auto". - qcom,vref-mv : maximum reference voltage in mv. default is 350. - qcom,switch-freq-khz : switch frequency in khz. default is 800. -- qcom,ovp-mv : over voltage protection value in mv. default is 17800. +- qcom,ovp-mv : Over voltage protection threshold in mV. Default is + 29500. - qcom,ilim-ma : maximum current limiter in ma. default is 980. - qcom,boost-duty-ns : maximum boost duty cycle in ns. default is 104. - qcom,mod-freq-khz : modulation frequency in khz. default is 9600. diff --git a/Documentation/devicetree/bindings/media/video/msm-cci.txt b/Documentation/devicetree/bindings/media/video/msm-cci.txt index 009754132974f..3fdd91ca65382 100644 --- a/Documentation/devicetree/bindings/media/video/msm-cci.txt +++ b/Documentation/devicetree/bindings/media/video/msm-cci.txt @@ -166,6 +166,10 @@ Optional properties: property should contain phandle of respective eeprom nodes - qcom,ois-src : if optical image stabilization is supported by this sensor, this property should contain phandle of respective ois node +- qcom,ir-led-src : if ir led is supported by this sensor, this property + should contain phandle of respective ir-led node +- qcom,ir-cut-src : if ir cut is supported by this sensor, this property + should contain phandle of respective ir-cut node * Qualcomm MSM ACTUATOR diff --git a/Documentation/devicetree/bindings/media/video/msm-ir-cut.txt b/Documentation/devicetree/bindings/media/video/msm-ir-cut.txt new file mode 100644 index 0000000000000..96cb28d692c1e --- /dev/null +++ b/Documentation/devicetree/bindings/media/video/msm-ir-cut.txt @@ -0,0 +1,26 @@ +* QTI MSM IR CUT + +Required properties: +- cell-index : ir cut filter hardware core index +- compatible : + - "qcom,ir-cut" + +Optional properties: +- gpios : should specify the gpios to be used for the ir cut filter. +- qcom,gpio-req-tbl-num : should contain index to gpios specific to ir cut filter +- qcom,gpio-req-tbl-flags : should contain direction of gpios present in + qcom,gpio-req-tbl-num property (in the same order) +- qcom,gpio-req-tbl-label : should contain name of gpios present in + qcom,gpio-req-tbl-num property (in the same order) +- label : should contain unique ir cut filter name +Example: + +qcom,ir-cut@60 { + cell-index = <0>; + compatible = "qcom,ir-cut"; + label = "led-ir-label"; + gpios = <&tlmm 60 0>; + qcom,gpio-req-tbl-num = <0>; + qcom,gpio-req-tbl-flags = <0>; + qcom,gpio-req-tbl-label = "LED_IR_EN"; + }; diff --git a/Documentation/devicetree/bindings/media/video/msm-ir-led.txt b/Documentation/devicetree/bindings/media/video/msm-ir-led.txt new file mode 100644 index 0000000000000..7e66fa0cef5bf --- /dev/null +++ b/Documentation/devicetree/bindings/media/video/msm-ir-led.txt @@ -0,0 +1,26 @@ +* QTI MSM IR LED + +Required properties: +- cell-index : ir led hardware core index +- compatible : + - "qcom,ir-led" + +Optional properties: +- gpios : should specify the gpios to be used for the ir led. +- qcom,gpio-req-tbl-num : should contain index to gpios specific to ir led +- qcom,gpio-req-tbl-flags : should contain direction of gpios present in + qcom,gpio-req-tbl-num property (in the same order) +- qcom,gpio-req-tbl-label : should contain name of gpios present in + qcom,gpio-req-tbl-num property (in the same order) +- label : should contain unique ir led name +Example: + +qcom,ir-led { + cell-index = <0>; + compatible = "qcom,ir-led"; + label = "led-ir-label"; + gpios = <&tlmm 60 0>; + qcom,gpio-req-tbl-num = <0>; + qcom,gpio-req-tbl-flags = <0>; + qcom,gpio-req-tbl-label = "LED_IR_EN"; + }; diff --git a/Documentation/devicetree/bindings/media/video/msm-jpegdma.txt b/Documentation/devicetree/bindings/media/video/msm-jpegdma.txt index 2b05659da7628..bc0eb14b38d3c 100644 --- a/Documentation/devicetree/bindings/media/video/msm-jpegdma.txt +++ b/Documentation/devicetree/bindings/media/video/msm-jpegdma.txt @@ -19,13 +19,18 @@ Required properties: - clocks : clocks required for the device. - qcom,clock-rates: should specify clock rates in Hz to each clocks property defined. +- Refer to "Documentation/devicetree/bindings/arm/msm/msm_bus.txt" for + below optional properties: + - qcom,msm-bus,name + - qcom,msm-bus,num-cases + - qcom,msm-bus,num-paths + - qcom,msm-bus,vectors-KBps + Optional properties: -- qcom,qos-regs: relative address offsets of QoS registers. -- qcom,qos-settings: QoS values to be written to QoS registers. -- qcom,vbif-regs: relative address offsets of VBIF registers. -- qcom,vbif-settings: VBIF values to be written to VBIF registers. -- qcom,prefetch-regs: relative address offsets of MMU prefetch registers. -- qcom,prefetch-settings: values to be written to MMU Prefetch registers. +- qcom,vbif-reg-settings: relative address offsets and value pairs for VBIF registers. +- qcom,qos-reg-settings: relative address offsets and value pairs for QoS registers. +- qcom,prefetch-reg-settings: relative address offsets and value pairs for + MMU prefetch registers. Example: qcom,jpegdma@aa0000 { @@ -53,10 +58,14 @@ Example: <&clock_gcc clk_mmssnoc_axi_clk>, <&clock_mmss clk_mmagic_camss_axi_clk>; qcom,clock-rates = <266670000 0 0 0 0 0 0 0 0>, - <400000000 0 0 0 0 0 0 0 0>; - qcom,vbif-regs = <0x4 0xDC 0x124 0x160>; - qcom,vbif-settings = <0x1 0x7 0x1 0x22222222>; - qcom,prefetch-regs = <0x18C 0x1A0 0x1B0>; - qcom,prefetch-settings = <0x11 0x31 0x31>; + qcom,vbif-reg-settings = <0x4 0x1>; + qcom,prefetch-reg-settings = <0x18c 0x11>, + <0x1a0 0x31>, + <0x1b0 0x31>; + qcom,msm-bus,name = "msm_camera_jpeg_dma"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = <62 512 0 0>, + <62 512 666675 666675>; status = "ok"; }; diff --git a/Documentation/devicetree/bindings/media/video/msm-vfe.txt b/Documentation/devicetree/bindings/media/video/msm-vfe.txt index 39a4bd1601e6d..c41bd4ed86ed4 100644 --- a/Documentation/devicetree/bindings/media/video/msm-vfe.txt +++ b/Documentation/devicetree/bindings/media/video/msm-vfe.txt @@ -23,6 +23,7 @@ Required properties for child node: Only needed for child node. - "vfe" - Required. - "vfe_vbif" - Optional for "vfe32". Required for "vfe40". + - "vfe_fuse" - Optional. - interrupts : should contain the vfe interrupt. - interrupt-names : should specify relevant names to each interrupts property defined. @@ -52,9 +53,10 @@ Example: vfe0: qcom,vfe0@fda10000 { cell-index = <0>; compatible = "qcom,vfe44"; - reg = <0xfda10000 0x1000>; - <0xfda40000 0x200>; - reg-names = "vfe", "vfe_vbif"; + reg = <0xfda10000 0x1000>, + <0xfda40000 0x200>, + <0xa4174 0x8>; + reg-names = "vfe", "vfe_vbif", "vfe_fuse"; interrupts = <0 57 0>; interrupt-names = "vfe"; vdd-supply = <&gdsc_vfe>; @@ -105,9 +107,10 @@ vfe0: qcom,vfe0@fda10000 { vfe1: qcom,vfe1@fda14000 { cell-index = <1>; compatible = "qcom,vfe44"; - reg = <0xfda14000 0x1000>; - <0xfda40000 0x200>; - reg-names = "vfe", "vfe_vbif"; + reg = <0xfda14000 0x1000>, + <0xfda40000 0x200>, + <0xa4174 0x8>; + reg-names = "vfe", "vfe_vbif", "vfe_fuse"; interrupts = <0 58 0>; interrupt-names = "vfe"; vdd-supply = <&gdsc_vfe>; diff --git a/Documentation/devicetree/bindings/media/video/msm-vidc.txt b/Documentation/devicetree/bindings/media/video/msm-vidc.txt index 1c90f98c29549..378a26e143b1d 100644 --- a/Documentation/devicetree/bindings/media/video/msm-vidc.txt +++ b/Documentation/devicetree/bindings/media/video/msm-vidc.txt @@ -17,6 +17,8 @@ Optional properties: - interrupts : should contain the vidc interrupt. - qcom,platform-version : mask and shift of the platform version bits in efuse register. +- qcom,capability-version : mask and shift of the capability version bits + in efuse register. - qcom,load-freq-tbl : load (in macroblocks/sec) and corresponding vcodec clock required along with codec's config, which is a bitmap that describes what the clock is used for. The bitmaps are as follows: diff --git a/Documentation/devicetree/bindings/platform/msm/qpnp-power-on.txt b/Documentation/devicetree/bindings/platform/msm/qpnp-power-on.txt index d5e79dba0b6d3..e673d9629a8ce 100644 --- a/Documentation/devicetree/bindings/platform/msm/qpnp-power-on.txt +++ b/Documentation/devicetree/bindings/platform/msm/qpnp-power-on.txt @@ -71,6 +71,8 @@ Optional properties: but this applies for the system hard reset case. - qcom,shutdown-poweroff-type Same description as qcom,warm-reset-poweroff-type but this applies for the system shutdown case. +- qcom,kpdpwr-sw-debounce Boolean property to enable the debounce logic + on the KPDPWR_N rising edge. All the below properties are in the sub-node section (properties of the child diff --git a/Documentation/devicetree/bindings/platform/msm/usb-bam.txt b/Documentation/devicetree/bindings/platform/msm/usb-bam.txt index 7d2e31ec84f58..9af22e2cbcbe9 100644 --- a/Documentation/devicetree/bindings/platform/msm/usb-bam.txt +++ b/Documentation/devicetree/bindings/platform/msm/usb-bam.txt @@ -36,7 +36,6 @@ Optional properties: - qcom,reset-bam-on-connect: If present then BAM is RESET before connecting pipe. This may be required if BAM peripheral is also reset before connect. - qcom,reset-bam-on-disconnect: If present then BAM is RESET after disconnecting pipes. -- qcom,enable-hsusb-bam-on-boot: If present then BAM is enabled at bootup itself. A number of USB BAM pipe parameters are represented as sub-nodes: diff --git a/Documentation/devicetree/bindings/qseecom/qseecom.txt b/Documentation/devicetree/bindings/qseecom/qseecom.txt index a6bf4147460ea..dfc62b78f58dc 100644 --- a/Documentation/devicetree/bindings/qseecom/qseecom.txt +++ b/Documentation/devicetree/bindings/qseecom/qseecom.txt @@ -26,6 +26,7 @@ Optional properties: - vdd-hba-supply : handle for fixed power regulator - qcom,qsee-reentrancy-support: indicates the qsee reentrancy phase supported by the target - qcom,commonlib64-loaded-by-uefi: indicates commonlib64 is loaded by uefi already + - qcom,fde-key-size: indicates which FDE key size is used in device. Example: qcom,qseecom@fe806000 { @@ -46,6 +47,7 @@ Example: qcom,msm_bus,num_paths = <1>; qcom,no-clock-support; qcom,appsbl-qseecom-support; + qcom,fde-key-size; qcom,msm_bus,vectors = <55 512 0 0>, <55 512 3936000000 393600000>, @@ -72,6 +74,7 @@ Example: The following dts setup is the same as the example above. qcom,msm_bus,num_paths = <1>; qcom,no-clock-support; qcom,appsbl-qseecom-support; + qcom,fde-key-size; qcom,msm_bus,vectors = <55 512 0 0>, <55 512 3936000000 393600000>, diff --git a/Documentation/devicetree/bindings/regulator/mem-acc-regulator.txt b/Documentation/devicetree/bindings/regulator/mem-acc-regulator.txt index d217a4ea9fc8b..528b433b4b1b5 100644 --- a/Documentation/devicetree/bindings/regulator/mem-acc-regulator.txt +++ b/Documentation/devicetree/bindings/regulator/mem-acc-regulator.txt @@ -159,6 +159,21 @@ Optional properties: not specified, then "qcom,override-cornerX-reg-config" must contain a single register configuration sequence list which is then applied unconditionally. This property can only be specified if qcom,cornerX-reg-config property is already defined. +- qcom,override-acc-range-fuse-list: Array of tuples define the selection parameters used for selecting the override + mem-acc configuration. The fused values for these selection parameters are used by the + qcom,override-fuse-range-map to identify the correct set of override properties. + Each tuple contains 4 elements as defined below: + [0] => the fuse row number of the selector + [1] => LSB bit position of the bits + [2] => number of bits + [3] => fuse reading method, 0 for direct reading or 1 for SCM reading +- qcom,override-fuse-range-map: Array of tuples where each tuple specifies the allowed range for all the selection parameters + defined in qcom,override-acc-range-fuse-list. The fused values of these selection parameters + are compared against their allowed range in each tuple starting from 0th tuple and use the + first matched tuple index to select the right tuples from the other override properties. + Either qcom,override-fuse-range-map or qcom,override-fuse-version-map is used to select + the override configuration. The qcom,override-fuse-range-map is used if both the + properties are specified. mem_acc_vreg_corner: regulator@fd4aa044 { compatible = "qcom,mem-acc-regulator"; @@ -184,6 +199,13 @@ mem_acc_vreg_corner: regulator@fd4aa044 { qcom,override-fuse-version-map = <0>, <2>, <(-1)>; + qcom,override-acc-range-fuse-list = + <37 40 3 0>, + <36 30 8 0>; + qcom,override-fuse-range-map = + <0 0>, < 0 0>, <49 63>, + <1 1>, < 0 0>, <50 63>, + <0 1>, < 95 255>, < 0 63>; qcom,override-corner-acc-map = <0 0 1>, <0 1 2>, <0 1 1>; diff --git a/Documentation/devicetree/bindings/sound/qcom-usb-audio-qmi-dev.txt b/Documentation/devicetree/bindings/sound/qcom-usb-audio-qmi-dev.txt new file mode 100644 index 0000000000000..9d3fb78f96a77 --- /dev/null +++ b/Documentation/devicetree/bindings/sound/qcom-usb-audio-qmi-dev.txt @@ -0,0 +1,26 @@ +QTI USB Audio QMI Device + +USB Audio QMI device is used to attach to remote processor IOMMU and +map USB Audio driver specific memory to iova to share with remote +processor. + +Required Properties: + +- compatible : "qcom,usb-audio-qmi-dev" + +- iommus : A list of phandle and IOMMU specifier pairs that describe the + IOMMU master interfaces of the device. + +- qcom,usb-audio-stream-id : Stream id is prepended to iova before passing + iova to remote processor. This allows remote processor to access iova. + +- qcom,usb-audio-intr-num : Interrupter number for external sub system + destination. + +Example: + usb_audio_qmi_dev { + compatible = "qcom,usb-audio-qmi-dev"; + iommus = <&lpass_q6_smmu 12>; + qcom,usb-audio-stream-id = <12>; + qcom,usb-audio-intr-num = <1>; + }; diff --git a/Documentation/devicetree/bindings/usb/msm-phy.txt b/Documentation/devicetree/bindings/usb/msm-phy.txt index 38f0431a0efb9..f741d39cfe0be 100644 --- a/Documentation/devicetree/bindings/usb/msm-phy.txt +++ b/Documentation/devicetree/bindings/usb/msm-phy.txt @@ -163,6 +163,7 @@ Optional properties: "emu_phy_base" : phy base address used for programming emulation target phy. "ref_clk_addr" : ref_clk bcr address used for on/off ref_clk before reset. "tcsr_phy_clk_scheme_sel": address used to determine QUSB PHY clk source. + "tcsr_phy_level_shift_keeper": address used to clamp QUSB PHY level shifter. - reg-names: Should be "qscratch_base". The qscratch register bank allows us to manipulate QUSB PHY bits eg. to enable D+ pull-up using s/w control in device mode. The reg-names property is required if the diff --git a/Documentation/sysctl/kernel.txt b/Documentation/sysctl/kernel.txt index 6c98ffa61d8fa..ad67729df395a 100644 --- a/Documentation/sysctl/kernel.txt +++ b/Documentation/sysctl/kernel.txt @@ -56,8 +56,9 @@ show up in /proc/sys/kernel: - overflowuid - panic - panic_on_oops -- panic_on_unrecovered_nmi - panic_on_stackoverflow +- panic_on_unrecovered_nmi +- perf_event_paranoid - pid_max - powersave-nap [ PPC only ] - printk @@ -552,19 +553,6 @@ the recommended setting is 60. ============================================================== -panic_on_unrecovered_nmi: - -The default Linux behaviour on an NMI of either memory or unknown is -to continue operation. For many environments such as scientific -computing it is preferable that the box is taken out and the error -dealt with than an uncorrected parity/ECC error get propagated. - -A small number of systems do generate NMI's for bizarre random reasons -such as power management so the default is off. That sysctl works like -the existing panic controls already in that directory. - -============================================================== - panic_on_oops: Controls the kernel's behaviour when an oops or BUG is encountered. @@ -584,7 +572,6 @@ This file shows up if CONFIG_DEBUG_STACKOVERFLOW is enabled. 0: try to continue operation. -1: panic immediately. ============================================================== @@ -614,6 +601,32 @@ allowed to execute. ============================================================== +panic_on_unrecovered_nmi: + +The default Linux behaviour on an NMI of either memory or unknown is +to continue operation. For many environments such as scientific +computing it is preferable that the box is taken out and the error +dealt with than an uncorrected parity/ECC error get propagated. + +A small number of systems do generate NMI's for bizarre random reasons +such as power management so the default is off. That sysctl works like +the existing panic controls already in that directory. + +============================================================== + +perf_event_paranoid: + +Controls use of the performance events system by unprivileged +users (without CAP_SYS_ADMIN). The default value is 3 if +CONFIG_SECURITY_PERF_EVENTS_RESTRICT is set, or 1 otherwise. + + -1: Allow use of (almost) all events by all users +>=0: Disallow raw tracepoint access by users without CAP_IOC_LOCK +>=1: Disallow CPU event access by users without CAP_SYS_ADMIN +>=2: Disallow kernel profiling by users without CAP_SYS_ADMIN +>=3: Disallow all event access by users without CAP_SYS_ADMIN + +============================================================== pid_max: diff --git a/Makefile b/Makefile index b03ca98f7a366..d63eefa7fb3c4 100644 --- a/Makefile +++ b/Makefile @@ -694,6 +694,8 @@ else # Use make W=1 to enable this warning (see scripts/Makefile.build) KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable) endif +# transport MTK_CDEFS ( mtk compile macros ) to .c for compile +KBUILD_CFLAGS += $(MTK_CDEFS) ifdef CONFIG_FRAME_POINTER KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls @@ -779,6 +781,13 @@ ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC)), y) KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTO endif +ifeq ($(WT_COMPILE_FACTORY_VERSION),yes) + KBUILD_CFLAGS += -DWT_COMPILE_FACTORY_VERSION +endif +ifeq ($(WT_FINAL_RELEASE),yes) + KBUILD_CFLAGS += -DWT_FINAL_RELEASE +endif + include $(srctree)/scripts/Makefile.kasan include $(srctree)/scripts/Makefile.extrawarn include $(srctree)/scripts/Makefile.ubsan diff --git a/arch/arm/boot/dts/qcom/Makefile b/arch/arm/boot/dts/qcom/Makefile index ff09bda32dcf4..40af15110b1ba 100644 --- a/arch/arm/boot/dts/qcom/Makefile +++ b/arch/arm/boot/dts/qcom/Makefile @@ -186,14 +186,17 @@ dtb-$(CONFIG_ARCH_MSM8917) += msm8917-rumi.dtb \ msm8917-pmi8937-rcm.dtb \ msm8917-pmi8950-rcm.dtb \ msm8917-qgp-tmo.dtb \ - msm8917-pmi8937-qrd-sku5.dtb + msm8917-pmi8937-qrd-sku5.dtb \ + msm8917-pmi8937-qrd-sku5_S88503.dtb \ + msm8917-pmi8937-qrd-sku5_S88505.dtb dtb-$(CONFIG_ARCH_MSM8920) += msm8920-pmi8937-cdp.dtb \ msm8920-pmi8937-mtp.dtb \ msm8920-pmi8950-cdp.dtb \ msm8920-pmi8950-mtp.dtb \ msm8920-pmi8937-rcm.dtb \ - msm8920-pmi8950-rcm.dtb + msm8920-pmi8950-rcm.dtb \ + msm8920-pmi8940-qrd-sku7.dtb dtb-$(CONFIG_ARCH_MSM8940) += msm8940-pmi8937-cdp.dtb \ msm8940-pmi8937-mtp.dtb \ @@ -207,7 +210,8 @@ dtb-$(CONFIG_ARCH_MSM8940) += msm8940-pmi8937-cdp.dtb \ msm8940-pmi8940-mtp.dtb \ msm8940-pmi8940-cdp.dtb \ msm8940-pmi8940-rcm.dtb \ - msm8940-pmi8940-qrd-sku7.dtb + msm8940-pmi8940-qrd-sku7.dtb \ + msm8940-pmi8950-qrd-sku7_S88536AA2.dtb dtb-$(CONFIG_ARCH_MSM8953) += msm8953-sim.dtb \ msm8953-rumi.dtb \ @@ -222,7 +226,22 @@ dtb-$(CONFIG_ARCH_MSM8953) += msm8953-sim.dtb \ apq8053-ext-audio-mtp.dtb \ msm8953-cdp-1200p.dtb \ msm8953-iot-mtp.dtb \ - apq8053-iot-mtp.dtb + apq8053-iot-mtp.dtb \ + msm8953-pmi8940-cdp.dtb \ + msm8953-pmi8940-mtp.dtb \ + msm8953-pmi8937-cdp.dtb \ + msm8953-pmi8937-mtp.dtb \ + msm8953-pmi8940-ext-codec-mtp.dtb \ + msm8953-pmi8937-ext-codec-mtp.dtb + +dtb-$(CONFIG_ARCH_SDM450) += sdm450-rcm.dtb \ + sdm450-cdp.dtb \ + sdm450-mtp.dtb \ + sdm450-qrd.dtb \ + sdm450-pmi8940-mtp.dtb \ + sdm450-pmi8937-mtp.dtb \ + sdm450-qrd_rosy.dtb + dtb-$(CONFIG_ARCH_MDM9607) += mdm9607-rumi.dtb \ mdm9607-cdp.dtb \ @@ -231,9 +250,9 @@ dtb-$(CONFIG_ARCH_MDM9607) += mdm9607-rumi.dtb \ mdm9607-mtp-sdcard.dtb dtb-$(CONFIG_ARCH_MSM8916) += msm8952-qrd-skum.dtb \ - msm8952-cdp.dtb \ - msm8952-ext-codec-cdp.dtb \ - msm8952-mtp.dtb + msm8952-cdp.dtb \ + msm8952-ext-codec-cdp.dtb \ + msm8952-mtp.dtb dtb-$(CONFIG_ARCH_MSM8909) += msm8909-pm8916-mtp.dtb \ msm8909w-wtp.dtb \ @@ -270,7 +289,7 @@ targets += dtbs targets += $(addprefix ../, $(dtb-y)) $(obj)/../%.dtb: $(src)/%.dts FORCE - $(call if_changed_dep,dtc) + $(call if_changed_dep,dtc) dtbs: $(addprefix $(obj)/,$(dtb-y)) endif diff --git a/arch/arm/boot/dts/qcom/apq8053-cdp.dts b/arch/arm/boot/dts/qcom/apq8053-cdp.dts index 3f2220aa80e45..10e9808bbf856 100644 --- a/arch/arm/boot/dts/qcom/apq8053-cdp.dts +++ b/arch/arm/boot/dts/qcom/apq8053-cdp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -14,10 +14,18 @@ /dts-v1/; #include "apq8053.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. APQ8053 CDP"; + model = "Qualcomm Technologies, Inc. APQ8053 + PMI8950 CDP"; compatible = "qcom,apq8053-cdp", "qcom,apq8053", "qcom,cdp"; qcom,board-id= <1 0>; }; + +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/apq8053-ext-audio-mtp.dts b/arch/arm/boot/dts/qcom/apq8053-ext-audio-mtp.dts index c5d65bf382820..1c97af6bd2d62 100644 --- a/arch/arm/boot/dts/qcom/apq8053-ext-audio-mtp.dts +++ b/arch/arm/boot/dts/qcom/apq8053-ext-audio-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -14,14 +14,37 @@ /dts-v1/; #include "apq8053.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. APQ8053 External Codec MTP"; + model = "Qualcomm Technologies, Inc. APQ8053 + PMI8950 Ext Codec MTP"; compatible = "qcom,apq8053-mtp", "qcom,apq8053", "qcom,mtp"; qcom,board-id= <8 1>; }; +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; + &int_codec { status = "disabled"; }; diff --git a/arch/arm/boot/dts/qcom/apq8053-iot-mtp.dts b/arch/arm/boot/dts/qcom/apq8053-iot-mtp.dts index 34955afdfe894..b7fcc7de00b28 100644 --- a/arch/arm/boot/dts/qcom/apq8053-iot-mtp.dts +++ b/arch/arm/boot/dts/qcom/apq8053-iot-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -14,10 +14,13 @@ /dts-v1/; #include "apq8053.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. APQ8053 IOT MTP"; + model = "Qualcomm Technologies, Inc. APQ8053 + PMI8950 IOT MTP"; compatible = "qcom,apq8053-mtp", "qcom,apq8053", "qcom,mtp"; qcom,board-id= <8 2>; }; @@ -47,3 +50,23 @@ }; }; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/apq8053-mtp.dts b/arch/arm/boot/dts/qcom/apq8053-mtp.dts index 1d2ca54d91aa0..266dbdb859e4c 100644 --- a/arch/arm/boot/dts/qcom/apq8053-mtp.dts +++ b/arch/arm/boot/dts/qcom/apq8053-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -14,10 +14,13 @@ /dts-v1/; #include "apq8053.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. APQ8053 MTP"; + model = "Qualcomm Technologies, Inc. APQ8053 + PMI8950 MTP"; compatible = "qcom,apq8053-mtp", "qcom,apq8053", "qcom,mtp"; qcom,board-id= <8 0>; }; @@ -34,7 +37,24 @@ }; }; +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + &pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; /* use external rsense for parallel charging */ qcom,ext-sense-type; }; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-D1_Default-4v4-3300mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-D1_Default-4v4-3300mah.dtsi new file mode 100644 index 0000000000000..00eabd9b38f6b --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-D1_Default-4v4-3300mah.dtsi @@ -0,0 +1,48 @@ + +qcom,3049735_wingtech_s88567aa1scud_3300mah_default { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <3300>; + qcom,batt-id-kohm = <1000>; + qcom,battery-beta = <3380>; + qcom,battery-type = "Generic_Battery"; + qcom,chg-rslow-comp-c1 = <3506249>; + qcom,chg-rslow-comp-c2 = <4896078>; + qcom,chg-rs-to-rslow = <1106835>; + qcom,chg-rslow-comp-thr = <0xA3>; + qcom,checksum = <0x574F>; + qcom,gui-version = "PMI8950GUI - 2.0.0.16"; + qcom,fg-profile-data = [ + DB 83 95 7C + E9 80 EF 76 + 60 83 E8 6E + F3 88 2C 94 + 3D 82 78 99 + 7B BC F9 C8 + 55 0E 79 83 + 12 6C DB 78 + EF 6C 40 83 + 56 78 5E 84 + 4E 7B 7D 82 + 80 93 1A B5 + 80 C0 70 0F + BB 0C 10 5A + 14 70 77 FD + 40 3C AE 45 + CA 41 00 00 + 49 4C 63 39 + 07 41 00 00 + 00 00 00 00 + 00 00 00 00 + 85 70 D6 6A + E6 60 85 89 + 43 76 09 6B + 63 55 2D 7A + FD 6F FE 63 + 68 56 DE A2 + 24 48 68 02 + 66 A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-Scud-4v4-3300mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-Scud-4v4-3300mah.dtsi new file mode 100644 index 0000000000000..c914f35dbaf62 --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-Scud-4v4-3300mah.dtsi @@ -0,0 +1,48 @@ + +qcom,3049735_wingtech_s88567aa1scud_3300mah_averaged_masterslave_aug9th2017 { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <3300>; + qcom,batt-id-kohm = <68>; + qcom,battery-beta = <3380>; + qcom,battery-type = "D1-qrd-scud-4v4-3300mah"; + qcom,chg-rslow-comp-c1 = <3506249>; + qcom,chg-rslow-comp-c2 = <4896078>; + qcom,chg-rs-to-rslow = <1106835>; + qcom,chg-rslow-comp-thr = <0xA3>; + qcom,checksum = <0x574F>; + qcom,gui-version = "PMI8950GUI - 2.0.0.16"; + qcom,fg-profile-data = [ + DB 83 95 7C + E9 80 EF 76 + 60 83 E8 6E + F3 88 2C 94 + 3D 82 78 99 + 7B BC F9 C8 + 55 0E 79 83 + 12 6C DB 78 + EF 6C 40 83 + 56 78 5E 84 + 4E 7B 7D 82 + 80 93 1A B5 + 80 C0 70 0F + BB 0C 10 5A + 14 70 77 FD + 40 3C AE 45 + CA 41 00 00 + 49 4C 63 39 + 07 41 00 00 + 00 00 00 00 + 00 00 00 00 + 85 70 D6 6A + E6 60 85 89 + 43 76 09 6B + 63 55 2D 7A + FD 6F FE 63 + 68 56 DE A2 + 24 48 68 02 + 66 A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-Sunwoda-4v4-3300mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-Sunwoda-4v4-3300mah.dtsi new file mode 100644 index 0000000000000..bb6e994c7e2cc --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-Sunwoda-4v4-3300mah.dtsi @@ -0,0 +1,48 @@ + +qcom,qrd_sdm450_4v4_3300mAh_sept11th2017 { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <3300>; + qcom,batt-id-kohm = <330>; + qcom,battery-beta = <3380>; + qcom,battery-type = "D1-qrd-sunwoda-4v4-3300mah"; + qcom,chg-rslow-comp-c1 = <3898419>; + qcom,chg-rslow-comp-c2 = <6564992>; + qcom,chg-rs-to-rslow = <1234327>; + qcom,chg-rslow-comp-thr = <0xB4>; + qcom,checksum = <0xB04E>; + qcom,gui-version = "PMI8950GUI - 2.0.0.16"; + qcom,fg-profile-data = [ + DF 83 CB 7C + 13 81 3E 77 + 62 83 56 6F + 0A 89 3B 94 + 31 82 9E 99 + 8B BC FB C8 + 56 0F 0D 88 + 5A 7E 17 82 + 79 7C 48 83 + 81 72 2D 77 + 4A 51 59 82 + 2F 99 45 BC + BB C8 5E 0D + DF 0C E1 59 + 14 70 77 FD + 32 31 FE 45 + 6E 33 00 00 + 66 45 F2 30 + 8D 36 00 00 + 00 00 00 00 + 00 00 00 00 + DC 71 31 70 + 23 84 5C 82 + A3 7C 03 72 + DB 67 51 79 + 8F 75 37 6A + 7E 60 C1 A0 + 33 22 62 B7 + 5F A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-qrd-Atl-4v4-4100mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-qrd-Atl-4v4-4100mah.dtsi new file mode 100644 index 0000000000000..017e1d587029b --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-qrd-Atl-4v4-4100mah.dtsi @@ -0,0 +1,48 @@ + +qcom,2312470_wingtech_a12atl_4000mah_averaged_masterslave_feb1st2016 { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <4100>; + qcom,batt-id-kohm = <68>; + qcom,battery-beta = <4150>; + qcom,battery-type = "qrd_msm8937_Atl_4100mah"; + qcom,chg-rslow-comp-c1 = <3011278>; + qcom,chg-rslow-comp-c2 = <4185582>; + qcom,chg-rs-to-rslow = <966005>; + qcom,chg-rslow-comp-thr = <0xA3>; + qcom,checksum = <0x90C2>; + qcom,gui-version = "PMI8950GUI - 2.0.0.15"; + qcom,fg-profile-data = [ + E1 83 CD 7C + FA 80 DE 76 + 69 83 6B 75 + 2B 8A 24 95 + 12 82 86 9A + 72 BD 12 CA + 56 11 EC 83 + B5 7C C8 80 + 55 76 5A 83 + A6 60 5E 81 + ED 8D 54 82 + 99 99 E9 BC + CD C9 54 0E + 65 10 A4 58 + 14 70 EE FC + 0F 36 44 3D + FD 2E 00 00 + 60 3F 44 33 + 35 3F 00 00 + 00 00 00 00 + 00 00 00 00 + F7 6B DA 6A + 5F 63 D8 80 + EB 6F 3C 62 + B5 57 6B 78 + DF 6E AE 60 + 8A 84 5B A3 + 17 A8 63 2D + 65 A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-qrd-Coslight-4v4-4100mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-qrd-Coslight-4v4-4100mah.dtsi new file mode 100644 index 0000000000000..cd5f348a00758 --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-qrd-Coslight-4v4-4100mah.dtsi @@ -0,0 +1,48 @@ + +qcom,2336567_wingtech_s88537a1coslight_4000mah_averaged_masterslave_mar3rd2016 { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <4100>; + qcom,batt-id-kohm = <100>; + qcom,battery-beta = <4250>; + qcom,battery-type = "qrd_msm8937_Coslight_4100mah"; + qcom,chg-rslow-comp-c1 = <3658227>; + qcom,chg-rslow-comp-c2 = <6007355>; + qcom,chg-rs-to-rslow = <1091156>; + qcom,chg-rslow-comp-thr = <0xB2>; + qcom,checksum = <0xA765>; + qcom,gui-version = "PMI8950GUI - 2.0.0.15"; + qcom,fg-profile-data = [ + E1 83 E0 7C + 31 81 88 77 + 62 83 1C 74 + 4E 89 60 94 + 40 82 A6 98 + 79 B6 08 C2 + 52 17 07 88 + 0A 7E F7 81 + 73 7C 36 83 + 40 79 08 86 + 9D 81 6B 82 + 6B 98 D0 B6 + 25 C3 5E 15 + 32 10 42 59 + 14 70 EE FC + 04 36 DC 44 + DE 3B 00 00 + 7C 4C FD 31 + E6 41 00 00 + 00 00 00 00 + 00 00 00 00 + 4F 71 C5 6B + 5B 74 71 88 + 88 7C E6 71 + 60 74 15 72 + A2 75 71 6A + B9 66 5C A3 + 23 91 60 87 + 5E A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-qrd-Default-4v4-4100mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-qrd-Default-4v4-4100mah.dtsi new file mode 100644 index 0000000000000..107390fd21061 --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-qrd-Default-4v4-4100mah.dtsi @@ -0,0 +1,48 @@ + +qcom,2312470_wingtech_a12atl_4000mah_default { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <4000>; + qcom,batt-id-kohm = <1>; + qcom,battery-beta = <4150>; + qcom,battery-type = "Generic_Battery"; + qcom,chg-rslow-comp-c1 = <3011278>; + qcom,chg-rslow-comp-c2 = <4185582>; + qcom,chg-rs-to-rslow = <966005>; + qcom,chg-rslow-comp-thr = <0xA3>; + qcom,checksum = <0x90C2>; + qcom,gui-version = "PMI8950GUI - 2.0.0.15"; + qcom,fg-profile-data = [ + E1 83 CD 7C + FA 80 DE 76 + 69 83 6B 75 + 2B 8A 24 95 + 12 82 86 9A + 72 BD 12 CA + 56 11 EC 83 + B5 7C C8 80 + 55 76 5A 83 + A6 60 5E 81 + ED 8D 54 82 + 99 99 E9 BC + CD C9 54 0E + 65 10 A4 58 + 14 70 EE FC + 0F 36 44 3D + FD 2E 00 00 + 60 3F 44 33 + 35 3F 00 00 + 00 00 00 00 + 00 00 00 00 + F7 6B DA 6A + 5F 63 D8 80 + EB 6F 3C 62 + B5 57 6B 78 + DF 6E AE 60 + 8A 84 5B A3 + 17 A8 63 2D + 65 A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-qrd-Desay-4v4-4100mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-qrd-Desay-4v4-4100mah.dtsi new file mode 100644 index 0000000000000..a5e3b5c71616b --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-qrd-Desay-4v4-4100mah.dtsi @@ -0,0 +1,48 @@ + +qcom,2312442_wingtech_a12desay_4000mah_averaged_masterslave_feb1st2016 { + qcom,max-voltage-uv = <4400000>; + qcom,nom-batt-capacity-mah = <4100>; + qcom,batt-id-kohm = <30>; + qcom,battery-beta = <4100>; + qcom,battery-type = "qrd_msm8937_Desay_4100mah"; + qcom,chg-rslow-comp-c1 = <3278930>; + qcom,chg-rslow-comp-c2 = <4973220>; + qcom,chg-rs-to-rslow = <1125247>; + qcom,chg-rslow-comp-thr = <0xAC>; + qcom,checksum = <0xAB22>; + qcom,gui-version = "PMI8950GUI - 2.0.0.15"; + qcom,fg-profile-data = [ + D6 83 5E 7C + BB 80 9B 76 + 64 83 81 74 + A6 89 BC 94 + 9D 82 F3 91 + E0 AF 03 BB + 52 16 FE 83 + 7E 7D 8B 81 + 0B 7C 6A 83 + 62 6F B7 89 + 29 95 49 82 + 32 9A B0 BD + 0A CB 52 0D + 1B 10 B3 59 + 14 70 EE FC + 78 3E 7B 3F + 0B 40 00 00 + 5A 46 C1 2B + 1E 2A 00 00 + 00 00 00 00 + 00 00 00 00 + BA 70 4D 6B + 31 63 73 88 + BF 75 02 6B + DE 60 EF 7B + D4 6E 44 63 + D6 75 4F A0 + 1E E4 60 FF + 5E A0 71 0C + 28 00 FF 36 + F0 11 30 03 + 00 00 00 0C + ]; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-qrd-sku1-4v4-2800mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-qrd-sku1-4v4-2800mah.dtsi index da520398cbaa0..87679f8c5d0ff 100644 --- a/arch/arm/boot/dts/qcom/batterydata-qrd-sku1-4v4-2800mah.dtsi +++ b/arch/arm/boot/dts/qcom/batterydata-qrd-sku1-4v4-2800mah.dtsi @@ -14,7 +14,7 @@ qcom,qrd_msm8937_sku1_2920mah { /* #QRD8937_2800mAh_China_data_averaged_MasterSlave_Oct30th2015*/ qcom,max-voltage-uv = <4400000>; qcom,nom-batt-capacity-mah = <2800>; - qcom,batt-id-kohm = <90>; + qcom,batt-id-kohm = <68>; qcom,battery-beta = <3380>; qcom,battery-type = "qrd_msm8937_sku1_2800mah"; qcom,fastchg-current-ma = <2600>; diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-desai_SAMSUNG-4v4-4000mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-desai_SAMSUNG-4v4-4000mah.dtsi new file mode 100644 index 0000000000000..ac7e8290df24f --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-desai_SAMSUNG-4v4-4000mah.dtsi @@ -0,0 +1,117 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + + +qcom,wingtech-desai-4v4-4000mah-data { + qcom,default-rbatt-mohm = <116>; + qcom,max-voltage-uv = <4400000>; + qcom,fcc-mah = <4000>; + qcom,rbatt-capacitive-mohm = <10>; + qcom,v-cutoff-uv = <3400000>; + qcom,chg-term-ua = <100000>; + qcom,batt-id-kohm = <10>; + qcom,flat-ocv-threshold-uv = <3800000>; + qcom,battery-type = "wingtech-desai-4v4-3000mah"; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <4133 4132 4130 4121 4095>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 45 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4360 4360 4360 4360 4360>, + <4260 4302 4308 4306 4302>, + <4188 4240 4249 4248 4244>, + <4124 4185 4193 4191 4187>, + <4088 4132 4138 4136 4132>, + <4030 4082 4086 4084 4080>, + <3935 4024 4041 4038 4032>, + <3890 3942 3976 3982 3988>, + <3846 3909 3944 3948 3946>, + <3821 3878 3895 3902 3902>, + <3805 3848 3856 3857 3856>, + <3790 3821 3829 3830 3828>, + <3774 3798 3808 3808 3807>, + <3758 3780 3790 3791 3789>, + <3742 3767 3776 3774 3770>, + <3726 3753 3761 3754 3744>, + <3709 3734 3743 3734 3720>, + <3693 3718 3722 3712 3699>, + <3678 3708 3698 3689 3676>, + <3604 3679 3680 3670 3657>, + <3582 3661 3668 3652 3636>, + <3552 3628 3624 3610 3590>, + <3510 3576 3564 3550 3530>, + <3444 3498 3480 3467 3445>, + <3322 3368 3345 3341 3310>, + <3000 3000 3000 3018 3000>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>; + qcom,lut-data = <1382 266 100 84 79>, + <1379 266 100 84 79>, + <1278 267 100 85 79>, + <1186 269 103 87 80>, + <1162 274 107 90 79>, + <1091 280 112 92 81>, + <974 286 121 98 84>, + <964 241 122 99 87>, + <949 243 128 105 91>, + <977 241 109 102 93>, + <1021 240 98 85 79>, + <1071 241 98 84 79>, + <1124 240 101 87 81>, + <1178 246 104 90 84>, + <1231 262 105 90 84>, + <1292 282 105 87 81>, + <1360 297 103 86 81>, + <1410 309 104 86 81>, + <1322 312 100 83 77>, + <1381 324 99 84 78>, + <1416 334 101 85 79>, + <1453 345 103 88 83>, + <1485 359 107 91 88>, + <1525 379 112 97 93>, + <1576 393 117 102 97>, + <1634 405 120 97 90>, + <1745 412 109 91 84>, + <2055 432 110 91 86>, + <2583 466 115 95 90>, + <5166 565 160 109 109>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 250 500 1000 1500 2000>; + qcom,lut-data =<4066 4081 4072>, + <2422 4004 4006>, + <1628 3880 3989>, + <492 3340 3943>, + <110 2576 3850>, + <50 1987 3666>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-3030mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-3030mah.dtsi new file mode 100644 index 0000000000000..932109d640125 --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-3030mah.dtsi @@ -0,0 +1,120 @@ +/* Copyright (c) 2014, 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. + */ + +qcom,wingtech-feimaotui-4v4-3030mah-data { + qcom,default-rbatt-mohm = <140>; + qcom,max-voltage-uv = <4400000>; + qcom,rbatt-capacitive-mohm = <50>; + qcom,v-cutoff-uv = <3400000>; + qcom,chg-term-ua = <100000>; + qcom,batt-id-kohm = <30>; + qcom,flat-ocv-threshold-uv = <3800000>; + qcom,battery-type = "wingtech-feimaotui-4v4-3030mah"; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <2343 2340 2338 2336 2328>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 45 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4328 4328 4328 4328 4086>, + <4240 4262 4266 4264 4076>, + <4172 4206 4208 4206 4056>, + <4106 4154 4154 4152 4046>, + <4070 4102 4102 4100 4036>, + <3995 4058 4062 4054 4020>, + <3919 3962 3992 3998 4002>, + <3882 3923 3960 3963 3961>, + <3843 3897 3914 3920 3919>, + <3808 3864 3870 3870 3869>, + <3791 3836 3840 3840 3840>, + <3778 3812 3818 3818 3817>, + <3766 3792 3800 3800 3798>, + <3756 3778 3784 3784 3782>, + <3744 3768 3770 3767 3762>, + <3734 3756 3756 3746 3734>, + <3720 3738 3736 3726 3713>, + <3706 3718 3714 3705 3691>, + <3692 3706 3696 3688 3675>, + <3680 3700 3690 3682 3670>, + <3672 3698 3689 3681 3669>, + <3662 3694 3688 3680 3668>, + <3651 3692 3686 3678 3666>, + <3636 3686 3682 3674 3660>, + <3618 3674 3670 3659 3640>, + <3594 3646 3639 3626 3602>, + <3560 3606 3592 3577 3552>, + <3514 3548 3530 3516 3490>, + <3446 3466 3448 3432 3404>, + <3322 3341 3320 3303 3274>, + <3000 3000 3000 3000 3006>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <1043 230 99 86 81>, + <1043 230 99 86 81>, + <1019 239 101 86 81>, + <984 247 104 87 82>, + <1009 251 109 91 84>, + <948 267 119 95 84>, + <893 223 119 96 86>, + <909 222 131 103 90>, + <906 230 119 108 95>, + <909 229 102 89 83>, + <950 228 100 86 81>, + <997 230 100 87 82>, + <1050 233 102 89 84>, + <1109 236 104 91 86>, + <1172 247 103 90 84>, + <1244 259 101 85 80>, + <1326 269 101 86 81>, + <1387 273 103 87 81>, + <1409 284 101 86 81>, + <1307 281 101 86 82>, + <1342 286 102 87 83>, + <1385 297 104 89 85>, + <1431 309 107 91 88>, + <1492 320 111 94 89>, + <1656 328 111 93 86>, + <1879 329 106 90 84>, + <2169 339 108 91 87>, + <2589 366 112 95 90>, + <3226 413 119 103 96>, + <5120 493 147 131 133>, + <53073 27234 27502 34136 15022>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 250 500 1000>; + qcom,lut-data = <2296 2305 2292>, + <1000 2256 2274>, + <626 2164 2262>, + <70 1732 2232>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-4000mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-4000mah.dtsi new file mode 100644 index 0000000000000..acebd0803ad8f --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-feimaotui_SONY-4v4-4000mah.dtsi @@ -0,0 +1,122 @@ +/* Copyright (c) 2014, 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. + */ + + +qcom,wingtech-feimaotui-4v4-4000mah-data { + qcom,default-rbatt-mohm = <140>; + qcom,max-voltage-uv = <4400000>; + qcom,fcc-mah = <2300>; + qcom,rbatt-capacitive-mohm = <50>; + qcom,v-cutoff-uv = <3400000>; + qcom,chg-term-ua = <100000>; + qcom,batt-id-kohm = <30>; + qcom,flat-ocv-threshold-uv = <3800000>; + qcom,battery-type = "wingtech-feimaotui-4v4-3000mah"; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <2343 2340 2338 2336 2328>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 45 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4328 4328 4328 4328 4086>, + <4240 4262 4266 4264 4076>, + <4172 4206 4208 4206 4056>, + <4106 4154 4154 4152 4046>, + <4070 4102 4102 4100 4036>, + <3995 4058 4062 4054 4020>, + <3919 3962 3992 3998 4002>, + <3882 3923 3960 3963 3961>, + <3843 3897 3914 3920 3919>, + <3808 3864 3870 3870 3869>, + <3791 3836 3840 3840 3840>, + <3778 3812 3818 3818 3817>, + <3766 3792 3800 3800 3798>, + <3756 3778 3784 3784 3782>, + <3744 3768 3770 3767 3762>, + <3734 3756 3756 3746 3734>, + <3720 3738 3736 3726 3713>, + <3706 3718 3714 3705 3691>, + <3692 3706 3696 3688 3675>, + <3680 3700 3690 3682 3670>, + <3672 3698 3689 3681 3669>, + <3662 3694 3688 3680 3668>, + <3651 3692 3686 3678 3666>, + <3636 3686 3682 3674 3660>, + <3618 3674 3670 3659 3640>, + <3594 3646 3639 3626 3602>, + <3560 3606 3592 3577 3552>, + <3514 3548 3530 3516 3490>, + <3446 3466 3448 3432 3404>, + <3322 3341 3320 3303 3274>, + <3000 3000 3000 3000 3006>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <1043 230 99 86 81>, + <1043 230 99 86 81>, + <1019 239 101 86 81>, + <984 247 104 87 82>, + <1009 251 109 91 84>, + <948 267 119 95 84>, + <893 223 119 96 86>, + <909 222 131 103 90>, + <906 230 119 108 95>, + <909 229 102 89 83>, + <950 228 100 86 81>, + <997 230 100 87 82>, + <1050 233 102 89 84>, + <1109 236 104 91 86>, + <1172 247 103 90 84>, + <1244 259 101 85 80>, + <1326 269 101 86 81>, + <1387 273 103 87 81>, + <1409 284 101 86 81>, + <1307 281 101 86 82>, + <1342 286 102 87 83>, + <1385 297 104 89 85>, + <1431 309 107 91 88>, + <1492 320 111 94 89>, + <1656 328 111 93 86>, + <1879 329 106 90 84>, + <2169 339 108 91 87>, + <2589 366 112 95 90>, + <3226 413 119 103 96>, + <5120 493 147 131 133>, + <53073 27234 27502 34136 15022>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 250 500 1000>; + qcom,lut-data = <2296 2305 2292>, + <1000 2256 2274>, + <626 2164 2262>, + <70 1732 2232>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-guangyu_Coslight-4v4-4000mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-guangyu_Coslight-4v4-4000mah.dtsi new file mode 100644 index 0000000000000..b7d38ca5e47df --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-guangyu_Coslight-4v4-4000mah.dtsi @@ -0,0 +1,111 @@ + +qcom,Wingtech4000-batterydata { + qcom,battery-type = "wingtech-guangyu-4v4-3000mah"; + qcom,batt-id-kohm = <100>; + qcom,chg-term-ua = <120000>; + qcom,default-rbatt-mohm = <112>; + qcom,fcc-mah = <4000>; + qcom,max-voltage-uv = <4400000>; + qcom,rbatt-capacitive-mohm = <50>; + qcom,v-cutoff-uv = <3400000>; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <4037 4050 4050 4046 4018>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 500 800 1000 1500>, + <2000>; + qcom,lut-data = <3968 3991 3988>, + <714 3850 3920>, + <448 3490 3906>, + <248 3193 3896>, + <48 2452 3826>, + <12 1878 3688>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4389 4385 4379 4374 4367>, + <4246 4302 4314 4312 4306>, + <4150 4237 4256 4254 4249>, + <4070 4178 4198 4197 4192>, + <3988 4122 4142 4140 4137>, + <3934 4068 4088 4087 4084>, + <3890 4004 4038 4036 4034>, + <3861 3946 3985 3989 3988>, + <3839 3906 3938 3943 3943>, + <3820 3870 3888 3890 3890>, + <3804 3840 3854 3854 3854>, + <3788 3814 3828 3828 3828>, + <3773 3794 3806 3806 3806>, + <3756 3778 3786 3788 3786>, + <3739 3766 3769 3768 3766>, + <3720 3750 3753 3747 3736>, + <3699 3730 3735 3726 3714>, + <3678 3712 3714 3706 3694>, + <3660 3696 3694 3686 3674>, + <3646 3688 3686 3680 3668>, + <3639 3686 3684 3678 3667>, + <3628 3680 3682 3676 3665>, + <3616 3676 3680 3674 3662>, + <3602 3670 3676 3670 3658>, + <3584 3659 3668 3661 3649>, + <3562 3640 3650 3640 3626>, + <3535 3606 3609 3596 3584>, + <3496 3554 3550 3536 3526>, + <3434 3475 3466 3451 3444>, + <3316 3337 3324 3309 3312>, + <3000 3000 3000 3000 3000>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>; + qcom,lut-data = <1427 317 100 81 73>, + <1427 316 100 81 73>, + <1289 303 100 81 73>, + <1186 293 100 81 75>, + <1084 285 103 83 77>, + <1039 279 104 85 78>, + <1016 264 107 87 79>, + <1020 244 111 90 81>, + <1032 243 108 92 82>, + <1058 240 95 80 75>, + <1087 241 93 79 73>, + <1124 243 94 79 74>, + <1177 249 96 80 75>, + <1233 259 96 81 76>, + <1298 272 96 81 75>, + <1366 290 96 80 75>, + <1446 314 97 80 76>, + <1514 338 98 81 76>, + <1571 361 98 80 74>, + <1569 373 99 80 75>, + <1587 387 100 82 77>, + <1638 400 102 84 79>, + <1732 417 105 88 82>, + <1883 436 110 91 85>, + <2069 461 113 93 86>, + <2304 480 113 90 82>, + <2620 505 108 86 79>, + <3055 536 111 88 79>, + <3730 584 115 90 82>, + <5181 704 141 120 91>; + }; +}; +/* TEST_DB_ID=TEST_ID_NOT_SET */ diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-3030mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-3030mah.dtsi new file mode 100644 index 0000000000000..fcc71ffda47f2 --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-3030mah.dtsi @@ -0,0 +1,116 @@ +/* Copyright (c) 2014, 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. + */ + +qcom,wingtech-xingwangda-4v4-3030mah-data { + qcom,default-rbatt-mohm = <120>; + qcom,max-voltage-uv = <4400000>; + qcom,rbatt-capacitive-mohm = <10>; + qcom,v-cutoff-uv = <3400000>; + qcom,chg-term-ua = <100000>; + qcom,batt-id-kohm = <50>; + qcom,flat-ocv-threshold-uv = <3800000>; + qcom,battery-type = "wingtech-xingwangda-4v4-3030mah"; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <4025 4035 4034 4030 4020>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 45 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4360 4360 4360 4360 4360>, + <4278 4311 4314 4310 4305>, + <4199 4248 4254 4251 4246>, + <4128 4188 4195 4194 4188>, + <4080 4130 4138 4136 4133>, + <4000 4075 4084 4083 4080>, + <3946 4010 4033 4033 4030>, + <3903 3952 3984 3986 3984>, + <3866 3915 3935 3942 3940>, + <3834 3880 3888 3890 3889>, + <3812 3847 3854 3854 3854>, + <3794 3820 3828 3828 3828>, + <3778 3797 3806 3807 3806>, + <3762 3779 3788 3789 3788>, + <3743 3766 3772 3771 3765>, + <3724 3750 3756 3749 3738>, + <3700 3734 3738 3730 3716>, + <3679 3720 3718 3710 3696>, + <3660 3708 3700 3692 3680>, + <3644 3700 3690 3682 3670>, + <3554 3640 3648 3640 3617>, + <3516 3598 3606 3596 3574>, + <3458 3539 3548 3537 3512>, + <3367 3454 3467 3456 3427>, + <3223 3318 3338 3327 3304>, + <3019 3000 3000 3000 3036>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data =<1351 292 100 81 73>, + <1351 292 100 81 73>, + <1232 292 102 82 74>, + <1143 289 104 84 75>, + <1113 287 108 86 78>, + <1048 282 111 89 79>, + <1027 273 116 92 81>, + <1018 265 123 97 83>, + <1016 264 114 100 87>, + <1020 260 101 85 78>, + <1035 260 99 81 74>, + <1063 260 99 82 76>, + <1103 262 102 84 79>, + <1160 267 105 88 82>, + <1231 273 106 88 80>, + <1318 282 103 83 77>, + <1423 297 103 83 77>, + <1575 317 103 83 77>, + <1747 341 102 82 76>, + <1864 360 102 82 75>, + <1881 367 102 84 78>, + <1805 357 104 85 80>, + <1664 352 108 88 82>, + <1835 363 112 91 86>, + <2064 375 114 92 86>, + <2373 388 112 88 79>, + <2802 408 109 88 80>, + <3500 448 112 89 82>, + <5633 516 118 92 83>, + <11267 1032 148 118 94>, + <22533 2063 295 235 188>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 500 800 1000 1500 2000>; + qcom,lut-data =<3944 3954 3974>, + <300 3793 3930>, + <86 3332 3905>, + <76 2939 3883>, + <17 2118 3797>, + <11 1552 3622>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-4000mah.dtsi b/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-4000mah.dtsi new file mode 100644 index 0000000000000..ce537fba7e52f --- /dev/null +++ b/arch/arm/boot/dts/qcom/batterydata-wingtech-xingwangda_ATL-4v4-4000mah.dtsi @@ -0,0 +1,119 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + + +qcom,wingtech-xingwangda-4v4-4000mah-data { + qcom,default-rbatt-mohm = <120>; + qcom,max-voltage-uv = <4400000>; + qcom,fcc-mah = <4000>; + qcom,rbatt-capacitive-mohm = <10>; + qcom,v-cutoff-uv = <3400000>; + qcom,chg-term-ua = <100000>; + qcom,batt-id-kohm = <50>; + qcom,flat-ocv-threshold-uv = <3800000>; + qcom,battery-type = "wingtech-xingwangda-4v4-3000mah"; + + qcom,fcc-temp-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-data = <4025 4035 4034 4030 4020>; + }; + + qcom,pc-temp-ocv-lut { + qcom,lut-col-legend = <(-20) 0 25 45 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <5 4 3 2 1>, + <0>; + qcom,lut-data = <4360 4360 4360 4360 4360>, + <4278 4311 4314 4310 4305>, + <4199 4248 4254 4251 4246>, + <4128 4188 4195 4194 4188>, + <4080 4130 4138 4136 4133>, + <4000 4075 4084 4083 4080>, + <3946 4010 4033 4033 4030>, + <3903 3952 3984 3986 3984>, + <3866 3915 3935 3942 3940>, + <3834 3880 3888 3890 3889>, + <3812 3847 3854 3854 3854>, + <3794 3820 3828 3828 3828>, + <3778 3797 3806 3807 3806>, + <3762 3779 3788 3789 3788>, + <3743 3766 3772 3771 3765>, + <3724 3750 3756 3749 3738>, + <3700 3734 3738 3730 3716>, + <3679 3720 3718 3710 3696>, + <3660 3708 3700 3692 3680>, + <3644 3700 3690 3682 3670>, + <3554 3640 3648 3640 3617>, + <3516 3598 3606 3596 3574>, + <3458 3539 3548 3537 3512>, + <3367 3454 3467 3456 3427>, + <3223 3318 3338 3327 3304>, + <3019 3000 3000 3000 3036>; + }; + + qcom,rbatt-sf-lut { + qcom,lut-col-legend = <(-20) 0 25 40 60>; + qcom,lut-row-legend = <100 95 90 85 80>, + <75 70 65 60 55>, + <50 45 40 35 30>, + <25 20 16 13 11>, + <10 9 8 7 6>, + <5 4 3 2 1>, + <0>; + qcom,lut-data =<1351 292 100 81 73>, + <1351 292 100 81 73>, + <1232 292 102 82 74>, + <1143 289 104 84 75>, + <1113 287 108 86 78>, + <1048 282 111 89 79>, + <1027 273 116 92 81>, + <1018 265 123 97 83>, + <1016 264 114 100 87>, + <1020 260 101 85 78>, + <1035 260 99 81 74>, + <1063 260 99 82 76>, + <1103 262 102 84 79>, + <1160 267 105 88 82>, + <1231 273 106 88 80>, + <1318 282 103 83 77>, + <1423 297 103 83 77>, + <1575 317 103 83 77>, + <1747 341 102 82 76>, + <1864 360 102 82 75>, + <1881 367 102 84 78>, + <1805 357 104 85 80>, + <1664 352 108 88 82>, + <1835 363 112 91 86>, + <2064 375 114 92 86>, + <2373 388 112 88 79>, + <2802 408 109 88 80>, + <3500 448 112 89 82>, + <5633 516 118 92 83>, + <11267 1032 148 118 94>, + <22533 2063 295 235 188>; + }; + + qcom,ibat-acc-lut { + qcom,lut-col-legend = <(-20) 0 25>; + qcom,lut-row-legend = <0 500 800 1000 1500 2000>; + qcom,lut-data =<3944 3954 3974>, + <300 3793 3930>, + <86 3332 3905>, + <76 2939 3883>, + <17 2118 3797>, + <11 1552 3622>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ft8006m-boe-5p7-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ft8006m-boe-5p7-720p-video.dtsi new file mode 100644 index 0000000000000..1667ef07c0e72 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ft8006m-boe-5p7-720p-video.dtsi @@ -0,0 +1,110 @@ +/* Copyright (c) 2013, 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ft8006m_boe_5p7_720p_video: qcom,mdss_dsi_ft8006m_boe_5p7_720p_video { + qcom,mdss-dsi-panel-name = "ft8006m_boe_5p7_720p_video"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,min-refresh-rate = <48>; + qcom,max-refresh-rate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1440>; + qcom,mdss-pan-physical-width-dimension = <65>; + qcom,mdss-pan-physical-height-dimension = <129>; + qcom,mdss-dsi-h-front-porch = <45>; + qcom,mdss-dsi-h-back-porch = <25>; + qcom,mdss-dsi-h-pulse-width = <14>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <37>; + qcom,mdss-dsi-v-front-porch = <65>; + qcom,mdss-dsi-v-pulse-width = <8>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 78 00 02 11 00 + 39 00 00 00 00 00 03 50 5A 0E + 39 00 00 00 00 00 04 83 AC B4 6D + 39 00 00 00 00 00 03 50 5A 19 + 39 00 00 00 00 00 08 90 fc 6f f6 ef cf af 0f + 39 00 00 00 00 00 03 A1 00 44 + 39 00 00 00 00 00 11 80 ea d3 c6 b8 af a6 9e 98 92 8e 8a 85 00 60 f6 cf + 39 00 00 00 00 00 03 50 5A 23 + 39 00 00 00 00 00 07 90 ff 0f 00 00 2C 00 + 39 01 00 00 00 00 02 50 00 + 39 01 00 00 02 00 02 29 00 + ]; + qcom,mdss-dsi-off-command = [ + 05 01 00 00 14 00 02 28 00 + 05 01 00 00 78 00 02 10 00 + 39 01 00 00 00 00 02 04 5A + 39 01 00 00 00 00 02 05 5A]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + + qcom,mdss-dsi-panel-cabc-off-command = [39 01 00 00 00 00 03 50 5A 23 + 39 01 00 00 00 00 02 95 00 + 39 01 00 00 00 00 02 50 00]; + qcom,mdss-dsi-panel-cabc-on-command = [39 01 00 00 00 00 03 50 5A 23 + 39 01 00 00 00 00 02 95 01 + 39 01 00 00 00 00 02 50 00]; + qcom,mdss-dsi-panel-cabc-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-panel-timings-phy-v2 = [1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 0E 04 05 02 03 04 A0]; + qcom,mdss-dsi-t-clk-post = <0x0A>; + qcom,mdss-dsi-t-clk-pre = <0x1E>; + qcom,mdss-dsi-bl-min-level = <7>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-brightness-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <5000>; + qcom,mdss-dsi-reset-sequence = <1 35>, <0 5>, <1 10>; + qcom,mdss-dsi-pwr-off-rst-pull-high = <1>; + + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 9c]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ft8613-csot-5p7-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-csot-5p7-720p-video.dtsi new file mode 100644 index 0000000000000..a4a8680c7c705 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-csot-5p7-720p-video.dtsi @@ -0,0 +1,204 @@ +/* Copyright (c) 2013, 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ft8613_csot_5p7_720p_video: qcom,mdss_dsi_ft8613_csot_5p7_720p_video { + qcom,mdss-dsi-panel-name = "ft8613_csot_5p7_720p_video"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,min-refresh-rate = <48>; + qcom,max-refresh-rate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1440>; + qcom,mdss-pan-physical-width-dimension = <65>; + qcom,mdss-pan-physical-height-dimension = <129>; + qcom,mdss-dsi-h-front-porch = <32>; + qcom,mdss-dsi-h-back-porch = <32>; + qcom,mdss-dsi-h-pulse-width = <2>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <16>; + qcom,mdss-dsi-v-front-porch = <16>; + qcom,mdss-dsi-v-pulse-width = <2>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 04 FF 87 16 01 + 39 01 00 00 00 00 02 00 80 + 39 01 00 00 00 00 03 FF 87 16 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 19 E1 00 06 18 2B 36 42 55 64 6B 74 7D 87 70 68 65 5E 50 45 37 2D 25 16 09 07 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 19 E2 00 06 18 2B 36 42 55 64 6B 74 7D 87 70 68 65 5E 50 45 37 2D 25 16 09 07 + 39 01 00 00 00 00 02 00 81 + 39 01 00 00 00 00 0D F3 40 89 C0 40 89 C0 40 81 C0 40 81 C0 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 05 2A 00 00 02 CF + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 05 2B 00 00 05 9F + 39 01 00 00 00 00 02 00 81 + 39 01 00 00 00 00 0a CA b9 ff b9 ff b9 ff 00 00 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 10 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 bb bc aa cd 9a bb 8c 88 88 78 66 56 55 55 55 55 55 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 11 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 ab ac aa cc 9a ba 8b 88 88 78 66 66 66 66 55 55 55 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 12 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 aa 9c 9b cc 99 ba 8a 88 88 78 66 66 66 66 66 66 55 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 13 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9b 9c 9a bc 9a a9 8b 88 88 88 66 66 66 66 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 14 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9a 9c 9a ca 99 a9 8b 88 88 88 77 67 66 66 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 15 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9a 9b 9a c9 99 99 8a 88 88 88 77 77 77 67 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 16 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9a 9a 8a c9 99 99 8a 88 88 88 77 77 77 77 67 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 17 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 99 9a 8a b9 99 99 89 88 88 88 77 77 77 77 77 77 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 18 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 9a 8a 99 a9 99 98 89 88 88 88 78 77 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 19 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 99 99 99 b8 89 89 89 88 88 88 88 78 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1a + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 99 99 98 a8 89 89 89 88 88 88 88 88 78 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1b + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 98 99 89 98 99 88 89 88 88 88 88 88 88 78 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1c + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 98 98 89 98 89 98 88 88 88 88 88 88 88 88 78 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1d + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 89 89 98 79 89 88 88 88 88 88 88 88 88 88 78 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1e + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 98 88 98 88 89 88 88 88 88 88 88 88 88 88 88 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1f + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 88 88 88 89 88 88 88 88 88 88 88 88 88 88 88 88 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 00 + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 53 24 + 39 01 00 00 00 00 02 55 00 + 39 01 00 00 78 00 02 11 00 + 39 01 00 00 02 00 02 29 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-off-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 05 01 00 00 14 00 02 28 00 + 05 01 00 00 78 00 02 10 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 05 F7 5A A5 87 16 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + + qcom,mdss-dsi-panel-cabc-off-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 39 01 00 00 00 00 02 55 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-panel-cabc-on-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 39 01 00 00 00 00 02 55 01 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-panel-cabc-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-panel-timings-phy-v2 = [1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 0E 03 05 02 03 04 A0]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1D>; + qcom,mdss-dsi-bl-min-level = <8>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-brightness-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <5000>; + qcom,mdss-dsi-reset-sequence = <1 10>, <0 5>, <1 30>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 AC 00 + 06 01 00 01 05 00 02 0A 9C]; + qcom,mdss-dsi-panel-status-command-num = <2>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1 1>; + qcom,mdss-dsi-panel-status-value = <0x00>,<0x9C>; + qcom,mdss-dsi-panel-status-read-length = <1 1>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi new file mode 100644 index 0000000000000..2a92adab6a51f --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi @@ -0,0 +1,99 @@ +/* Copyright (c) 2013, 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ft8613_ebbg_5p5_1080p_video: qcom,mdss_dsi_ft8613_ebbg_5p5_1080p_video { + qcom,mdss-dsi-panel-name = "ft8613_ebbg_5p5_1080p_video"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <1080>; + qcom,mdss-dsi-panel-height = <1920>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <88>; + qcom,mdss-dsi-h-back-porch = <98>; + qcom,mdss-dsi-h-pulse-width = <20>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <20>; + qcom,mdss-dsi-v-front-porch = <20>; + qcom,mdss-dsi-v-pulse-width = <2>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 04 FF 87 16 01 + 39 00 00 00 00 00 02 00 80 + 39 00 00 00 00 00 03 FF 87 16 + 39 00 00 00 00 00 02 00 81 + 39 00 00 00 00 00 0A CA B4 FF B9 FF B9 FF 00 00 00 + 39 00 00 00 00 00 02 00 B0 + 39 00 00 00 00 00 02 CA 04 + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 53 2C + 39 01 00 00 00 00 02 55 02 + 39 01 00 00 78 00 02 11 00 + 39 01 00 00 02 00 02 29 00 + ]; + qcom,mdss-dsi-off-command = [ + 05 00 00 00 14 00 02 28 00 + 05 01 00 00 78 00 02 10 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 05 F7 5A A5 87 16]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-panel-timings-phy-v2 = [24 1F 08 09 05 03 04 A0 + 24 1F 08 09 05 03 04 A0 + 24 1F 08 09 05 03 04 A0 + 24 1F 08 09 05 03 04 A0 + 24 1B 08 09 05 03 04 A0]; + qcom,mdss-dsi-t-clk-post = <0x0D>; + qcom,mdss-dsi-t-clk-pre = <0x30>; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <5000>; + qcom,mdss-dsi-reset-sequence = <1 10>, <0 5>, <1 10>; + + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi new file mode 100644 index 0000000000000..2dbb4a31abb68 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi @@ -0,0 +1,216 @@ +/* Copyright (c) 2013, 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ft8613_ebbg_5p7_720p_video: qcom,mdss_dsi_ft8613_ebbg_5p7_720p_video { + qcom,mdss-dsi-panel-name = "ft8613_ebbg_5p7_720p_video"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_porch_mode_vfp"; + qcom,min-refresh-rate = <48>; + qcom,max-refresh-rate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1440>; + qcom,mdss-pan-physical-width-dimension = <65>; + qcom,mdss-pan-physical-height-dimension = <129>; + qcom,mdss-dsi-h-front-porch = <32>; + qcom,mdss-dsi-h-back-porch = <32>; + qcom,mdss-dsi-h-pulse-width = <2>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <16>; + qcom,mdss-dsi-v-front-porch = <16>; + qcom,mdss-dsi-v-pulse-width = <2>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 04 FF 87 16 01 + 39 01 00 00 00 00 02 00 80 + 39 01 00 00 00 00 03 FF 87 16 + 39 01 00 00 00 00 02 00 81 + 39 01 00 00 00 00 0D F3 00 82 C0 00 82 C0 00 84 C0 00 84 C0 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 05 2A 00 00 02 CF + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 05 2B 00 00 05 9F + 39 00 00 00 00 00 02 00 81 + 39 00 00 00 00 00 0A CA B4 FF B9 FF B9 FF 00 00 00 + 39 00 00 00 00 00 02 00 B0 + 39 00 00 00 00 00 02 CA 04 + 39 00 00 00 00 00 02 00 88 + 39 00 00 00 00 00 05 C2 90 0C 12 00 + 39 00 00 00 00 00 02 00 CA + 39 00 00 00 00 00 02 CB 02 + 39 00 00 00 00 00 02 00 8A + 39 00 00 00 00 00 02 CC 04 + 39 00 00 00 00 00 02 00 9A + 39 00 00 00 00 00 02 CC 04 + 39 00 00 00 00 00 02 00 AB + 39 00 00 00 00 00 02 CD 0B + 39 00 00 00 00 00 02 00 8B + 39 00 00 00 00 00 02 CD 0B + 39 01 00 00 00 00 02 00 81 + 39 01 00 00 00 00 0a CA b9 ff b9 ff b9 ff 00 00 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 10 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 bb 9c bb dc aa 8b 88 88 78 66 66 66 66 66 66 66 56 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 11 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 ab 9c aa cd aa 8a 88 88 88 77 66 66 66 66 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 12 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 a0 aa 9c 9a bd 9b 8a 88 88 88 77 77 67 66 66 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 13 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9b ab 9a cb aa 89 88 88 88 77 77 77 77 66 66 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 14 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 aa 8b aa ca a9 89 88 88 88 77 77 77 77 77 67 66 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 15 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9a 8b 9a bb a9 89 88 88 88 77 77 77 77 77 77 67 66 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 16 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 9a 8a 9a ba 99 89 88 88 88 77 77 77 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 17 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 90 99 9a 89 ba 99 89 88 88 88 88 77 77 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 18 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 9a 99 99 a9 99 89 88 88 88 88 88 77 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 19 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 99 8a 99 a8 99 89 88 88 88 88 88 88 77 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1a + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 99 89 99 a8 89 89 88 88 88 88 88 88 88 77 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1b + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 89 89 99 a8 98 88 88 88 88 88 88 88 88 88 77 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1c + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 98 89 98 a8 88 88 88 88 88 88 88 88 88 88 88 77 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1d + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 89 98 98 98 88 88 88 88 88 88 88 88 88 88 78 77 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1e + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 98 88 88 89 88 88 88 88 88 88 88 88 88 88 88 78 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 1f + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 13 C7 80 88 88 88 88 89 88 88 88 88 88 88 88 88 88 88 88 88 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 C6 00 + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 53 24 + 39 01 00 00 00 00 02 55 00 + 39 01 00 00 78 00 02 11 00 + 39 01 00 00 02 00 02 29 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-off-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 05 00 00 00 14 00 02 28 00 + 05 01 00 00 78 00 02 10 00 + 39 00 00 00 00 00 02 00 00 + 39 01 00 00 00 00 05 f7 5a a5 87 16 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + + qcom,mdss-dsi-panel-cabc-off-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 39 01 00 00 00 00 02 55 00 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-panel-cabc-on-command = [ + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 95 27 + 39 01 00 00 00 00 02 55 01 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 03 99 00 00 + ]; + qcom,mdss-dsi-panel-cabc-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-panel-timings-phy-v2 = [1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 1B 04 06 02 03 04 A0 + 1E 0E 03 05 02 03 04 A0]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1D>; + qcom,mdss-dsi-bl-min-level = <9>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-brightness-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <5000>; + qcom,mdss-dsi-reset-sequence = <1 10>, <0 5>, <1 30>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 AC 00 + 06 01 00 01 05 00 02 0A 9C]; + qcom,mdss-dsi-panel-status-command-num = <2>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1 1>; + qcom,mdss-dsi-panel-status-value = <0x00>,<0x9C>; + qcom,mdss-dsi-panel-status-read-length = <1 1>; +}; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-720p-video.dtsi new file mode 100644 index 0000000000000..abd23f54b489b --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-720p-video.dtsi @@ -0,0 +1,128 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_hx8394f_boe_720_vid: qcom,mdss_dsi_hx8394f_boe_720p_video { + qcom,mdss-dsi-panel-name = "hx8394F_HD720p_video_BOE"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-dsi-h-front-porch = <160>; + qcom,mdss-dsi-h-back-porch = <160>; + qcom,mdss-dsi-h-pulse-width = <24>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <12>; + qcom,mdss-dsi-v-front-porch = <15>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 B9 FF 83 94 + 39 01 00 00 78 00 02 11 00 + 39 01 00 00 14 00 02 29 00 + 39 01 00 00 00 00 02 51 FF + 39 01 00 00 05 00 0A C9 13 00 13 1E 31 1E 00 91 00 + 39 01 00 00 05 00 02 55 00 + 39 01 00 00 00 00 02 53 2C]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 + 39 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0C 18 24 30 3A 43 4A 52 59 5F 66 6D 74 7B 83 8A 91 99 A0 A7 AE B5 BC C3 CA D1 D9 E0 E7 EF F7 FF 15 B3 59 B8 1E 00 AC 63 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0B 16 21 2C 36 3E 46 4D 54 5A 60 66 6C 73 79 7F 86 8D 93 9B A0 A6 AD B3 B9 BF C6 CD D3 DA E0 E6 06 9D 40 21 E3 3C 6E 62 C0 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 14 1E 28 32 3B 43 4A 51 57 5D 62 69 6F 75 7B 82 88 8F 95 9C A2 A7 AE B4 BA C0 C6 CD D2 D9 DE 16 BE 95 DB CD E3 01 8C C0 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-cool-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 11 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3C 43 4B 52 59 5F 66 6D 74 7B 82 8A 92 9A A0 A8 AF B7 BD C7 CE D5 DD E6 EE F7 FF 16 E3 11 59 A4 8D C3 84 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 31 3B 43 4A 51 57 5E 64 6B 72 79 80 87 8F 97 9E A4 AB B3 BA C1 C9 D0 D7 DF E6 EE F6 0F F0 1D AA B4 7C 01 C8 00 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 32 3C 44 4C 53 5A 60 68 6F 76 7D 85 8C 94 9C A3 AA B2 B9 C0 C8 D0 D8 DF E7 EE F6 FE 0E 56 27 1B 7E B5 F8 8B 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-nature-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 09 12 1B 24 2E 38 41 48 4F 56 5C 62 69 70 77 7E 85 8C 93 9B A2 A8 AF B6 BD C4 CC D3 DA E1 E8 F0 15 7C 62 A9 1B 8B 4C 2E 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-ce-std-command = [ + 39 01 00 00 05 00 02 55 00 + 39 01 00 00 0A 00 03 E4 01 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [ + 39 01 00 00 05 00 02 55 11 + 39 01 00 00 14 00 03 E4 01 42 + 39 01 00 00 14 00 20 E5 00 00 0B 08 01 00 00 00 00 00 00 05 1D 19 1F 05 ED 09 20 00 00 04 0B 02 01 08 08 07 02 04 02 + 39 01 00 00 14 00 16 E6 00 08 00 05 05 10 10 10 20 20 20 10 10 10 10 10 03 A0 01 0F 11]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-panel-timings = [8C 1E 14 00 46 48 1A 22 18 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 01 D9 + 06 01 00 01 05 00 01 09 + ]; + qcom,mdss-dsi-panel-status-command-num = <2>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-read-length = <4 4>; + qcom,mdss-dsi-panel-status-valid-params = <1 3>; + qcom,mdss-dsi-panel-status-value = + <0x80 0x80 0x73 0x04 >, + <0x80 0x80 0x73 0x04 >; + + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-reset-sequence = <1 50>, <0 20>, <1 5>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-tx-eot-append; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3a-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3a-720p-video.dtsi new file mode 100644 index 0000000000000..62c2c25525f1b --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3a-720p-video.dtsi @@ -0,0 +1,175 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_hx8394f_boe_720_vid: qcom,mdss_dsi_hx8394f_boe_720p_video { + qcom,mdss-dsi-panel-name = "hx8394F_HD720p_video_BOE_c3a"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-dsi-h-front-porch = <160>; + qcom,mdss-dsi-h-back-porch = <160>; + qcom,mdss-dsi-h-pulse-width = <24>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <12>; + qcom,mdss-dsi-v-front-porch = <15>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 B9 FF 83 94 + 05 01 00 00 78 00 02 11 00 + 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 + 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0C 18 24 30 3A 43 4A 52 59 5F 66 6D 74 7B 83 8A 91 99 A0 A7 AE B5 BC C3 CA D1 D9 E0 E7 EF F7 FF 15 B3 59 B8 1E 00 AC 63 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0B 16 21 2C 36 3E 46 4D 54 5A 60 66 6C 73 79 7F 86 8D 93 9B A0 A6 AD B3 B9 BF C6 CD D3 DA E0 E6 06 9D 40 21 E3 3C 6E 62 C0 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 14 1E 28 32 3B 43 4A 51 57 5D 62 69 6F 75 7B 82 88 8F 95 9C A2 A7 AE B4 BA C0 C6 CD D2 D9 DE 16 BE 95 DB CD E3 01 8C C0 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-cool-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 11 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3C 43 4B 52 59 5F 66 6D 74 7B 82 8A 92 9A A0 A8 AF B7 BD C7 CE D5 DD E6 EE F7 FF 16 E3 11 59 A4 8D C3 84 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 31 3B 43 4A 51 57 5E 64 6B 72 79 80 87 8F 97 9E A4 AB B3 BA C1 C9 D0 D7 DF E6 EE F6 0F F0 1D AA B4 7C 01 C8 00 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 32 3C 44 4C 53 5A 60 68 6F 76 7D 85 8C 94 9C A3 AA B2 B9 C0 C8 D0 D8 DF E7 EE F6 FE 0E 56 27 1B 7E B5 F8 8B 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-nature-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 09 12 1B 24 2E 38 41 48 4F 56 5C 62 69 70 77 7E 85 8C 93 9B A2 A8 AF B6 BD C4 CC D3 DA E1 E8 F0 15 7C 62 A9 1B 8B 4C 2E 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 0A 00 03 E4 00 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 01 00 00 14 00 02 E4 00 + 39 01 00 00 14 00 20 E5 00 00 0B 08 01 00 00 00 00 00 00 05 1D 19 1F 05 ED 09 20 00 00 04 0B 02 01 08 08 07 02 04 02 + 39 01 00 00 14 00 16 E6 00 08 00 05 05 10 10 10 20 20 20 10 10 10 10 10 03 A0 01 0F 11 + 39 01 00 00 14 00 03 E4 00 41]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_lp_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 08 11 19 22 2C 35 3D 44 4B 51 57 5D 64 6A 71 77 7E 85 8C 93 99 9F A6 AC B3 BA C1 C8 CF D6 DC E3 37 5E 9A 48 50 6E C9 01 80 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command02 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 08 10 18 20 2A 33 3A 40 47 4D 53 58 5E 65 6B 71 77 7E 84 8B 91 97 9E A3 A9 B0 B7 BD C4 CB D1 D7 16 81 D4 B0 77 E8 FD E0 C0 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command03 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 07 0F 17 1E 27 30 37 3D 43 49 4E 53 59 5F 65 6B 71 77 7D 84 8A 8F 95 9B A1 A7 AD B3 BA C0 C6 CC 38 F5 B7 FE 6F 8B 4B C4 80 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command04 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 07 0E 15 1D 25 2D 34 39 3F 44 4A 4E 54 5A 5F 64 6A 70 76 7C 81 87 8C 92 97 9D A3 A9 AF B4 BA C0 1B 14 EC E2 F9 B3 1A 0D 40 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command05 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0D 14 1B 23 2A 31 36 3B 40 45 4A 4F 54 59 5F 64 6A 6F 75 7A 7F 84 89 8E 94 99 9F A4 AA AF B5 3E 5C BF 6F 21 52 A7 35 00 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command06 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0C 13 19 21 28 2E 33 38 3D 41 46 4B 50 54 59 5E 63 69 6E 73 77 7D 81 86 8C 91 96 9B A0 A5 AA 2D D5 63 03 BC 9C 90 19 C0 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command07 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0C 12 18 1F 25 2B 30 34 39 3D 41 46 4A 4F 53 58 5D 62 67 6B 70 74 79 7D 82 87 8C 91 96 9A 9F 00 08 31 4D E4 63 2E 42 80 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command08 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 05 0B 10 16 1C 22 27 2C 30 34 38 3C 40 45 49 4D 51 56 5A 5F 63 67 6B 6F 74 78 7D 81 86 8A 8E 93 22 6F 7F 70 76 57 CC 8A 40 + 39 01 00 00 00 00 02 BD 00]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-panel-timings = [8C 20 14 00 46 48 1A 22 18 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-reset-sequence = <1 50>, <0 20>, <1 5>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-tx-eot-append; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3b-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3b-720p-video.dtsi new file mode 100644 index 0000000000000..d26a2d4317246 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-hx8394f-boe-c3b-720p-video.dtsi @@ -0,0 +1,197 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_hx8394f_boe_720_vid: qcom,mdss_dsi_hx8394f_boe_c3b_720p_video { + qcom,mdss-dsi-panel-name = "hx8394F_HD720p_video_BOE_c3b"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-model = "BOE HD HX8394F VIDEO PANEL"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-dsi-h-front-porch = <160>; + qcom,mdss-dsi-h-back-porch = <160>; + qcom,mdss-dsi-h-pulse-width = <24>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <12>; + qcom,mdss-dsi-v-front-porch = <15>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-color-order = "rgb_swap_rgb"; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 B9 FF 83 94 + 05 01 00 00 78 00 02 11 00 + 05 01 00 00 14 00 02 29 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 32 00 02 28 00 + 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0C 18 24 30 3A 43 4A 52 59 5F 66 6D 74 7B 83 8A 91 99 A0 A7 AE B5 BC C3 CA D1 D9 E0 E7 EF F7 FF 15 B3 59 B8 1E 00 AC 63 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0B 16 21 2C 36 3E 46 4D 54 5A 60 66 6C 73 79 7F 86 8D 93 9B A0 A6 AD B3 B9 BF C6 CD D3 DA E0 E6 06 9D 40 21 E3 3C 6E 62 C0 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 14 1E 28 32 3B 43 4A 51 57 5D 62 69 6F 75 7B 82 88 8F 95 9C A2 A7 AE B4 BA C0 C6 CD D2 D9 DE 16 BE 95 DB CD E3 01 8C C0 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-cool-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 11 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3C 43 4B 52 59 5F 66 6D 74 7B 82 8A 92 9A A0 A8 AF B7 BD C7 CE D5 DD E6 EE F7 FF 16 E3 11 59 A4 8D C3 84 C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 31 3B 43 4A 51 57 5E 64 6B 72 79 80 87 8F 97 9E A4 AB B3 BA C1 C9 D0 D7 DF E6 EE F6 0F F0 1D AA B4 7C 01 C8 00 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 0A 13 1D 27 32 3C 44 4C 53 5A 60 68 6F 76 7D 85 8C 94 9C A3 AA B2 B9 C0 C8 D0 D8 DF E7 EE F6 FE 0E 56 27 1B 7E B5 F8 8B 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-nature-command = [39 01 00 00 01 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 01 00 02 BD 00 + 39 01 00 00 01 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 01 00 02 BD 01 + 39 01 00 00 01 00 2B C1 00 09 13 1D 26 30 39 41 48 4F 55 5C 62 68 6F 76 7D 84 8B 92 9A A0 A7 AE B5 BC C3 CB D2 D9 E0 E7 EF 24 85 5C 39 07 79 44 1A 80 + 39 01 00 00 01 00 02 BD 02 + 39 01 00 00 01 00 2B C1 00 09 12 1B 24 2E 38 41 48 4F 56 5C 62 69 70 77 7E 85 8C 93 9B A2 A8 AF B6 BD C4 CC D3 DA E1 E8 F0 15 7C 62 A9 1B 8B 4C 2E 00 + 39 01 00 00 01 00 02 BD 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 0A 00 03 E4 00 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 01 00 00 14 00 02 E4 00 + 39 01 00 00 14 00 20 E5 00 00 0B 08 01 00 00 00 00 00 00 05 1D 19 1F 05 ED 09 20 00 00 04 0B 02 01 08 08 07 02 04 02 + 39 01 00 00 14 00 16 E6 00 08 00 05 05 10 10 10 20 20 20 10 10 10 10 10 03 A0 01 0F 11 + 39 01 00 00 14 00 03 E4 00 41]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_lp_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 12 1C 25 2E 37 3F 46 4D 53 59 5F 66 6C 73 7A 81 88 8F 96 9D A3 AA B1 B7 BE C6 CD D4 DB E2 EA 1D BF 9F DE 01 C9 3D 55 00 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 08 11 19 22 2C 36 3E 44 4B 52 58 5D 64 6B 71 78 7F 86 8C 94 9A A0 A7 AD B4 BB C2 C9 D0 D7 DD E4 37 A0 F1 E7 03 6E DA 57 C0 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command02 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 09 12 1B 24 2D 36 3E 44 4B 51 57 5D 63 6A 70 77 7D 84 8C 93 99 9F A6 AC B3 BA C1 C8 CF D6 DC E4 06 B9 EF 77 7C 1C D6 53 40 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 08 10 18 21 2A 33 3B 41 48 4E 54 59 60 66 6C 72 79 80 86 8D 93 99 A0 A6 AC B3 B9 C0 C7 CD D3 DA 1B 28 D5 86 D2 A8 03 0B 80 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command03 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 08 11 1B 23 2C 35 3C 43 4A 50 55 5B 61 68 6E 74 7B 82 89 90 96 9C A2 A9 AF B6 BD C4 CB D1 D8 DF 3C FB 83 B2 D0 0B 66 0D C0 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 08 0F 17 1F 28 31 38 3E 45 4A 50 55 5B 61 67 6D 73 79 80 86 8C 92 98 9E A4 AA B1 B7 BD C3 C9 D0 0E 65 89 AA 6D E6 0C 2F 40 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command04 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 08 11 1A 23 2B 34 3B 41 48 4E 53 59 5F 65 6B 71 78 7E 85 8C 92 98 9E A5 AB B1 B8 BF C5 CC D2 DA 29 21 C3 5A DE 9A 1F 7B 00 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 07 0F 16 1D 26 2E 35 3B 41 46 4C 51 57 5C 62 67 6D 73 79 80 85 8B 90 96 9B A2 A8 AE B4 BA BF C6 21 EE AD 4D FF 63 75 13 00 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command05 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 08 11 19 22 2A 33 3A 40 46 4C 52 57 5D 63 69 6F 75 7C 82 89 8F 95 9B A1 A7 AE B4 BB C1 C8 CE D5 13 70 64 55 63 95 A3 21 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 07 0E 15 1C 24 2C 32 38 3E 43 48 4D 52 57 5D 62 68 6D 73 79 7E 83 89 8E 93 99 9F A5 AA B0 B5 BB 05 67 85 2D 8E AD BE 3B 80 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command06 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 08 10 19 21 29 31 38 3E 44 4A 4F 55 5A 60 66 6C 72 78 7F 85 8B 91 97 9D A3 A9 B0 B6 BC C2 C8 CF 08 6A B7 3E AD E5 44 6F C0 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0D 14 1A 22 29 30 35 3A 3F 44 48 4D 53 58 5D 62 67 6D 72 77 7C 81 86 8B 91 96 9B A1 A6 AB B1 34 EC 79 F0 1C EB A7 DF 40 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command07 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 07 10 18 20 28 30 36 3C 42 48 4D 52 58 5D 63 69 6E 75 7B 81 87 8C 92 98 9E A4 AA B0 B6 BC C2 C9 31 53 A1 49 31 8D 42 AA 40 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0C 13 19 21 28 2E 33 38 3C 41 45 4A 4F 54 59 5E 63 68 6E 72 77 7C 80 85 8B 90 95 9A 9F A4 A9 2D 80 1D A9 16 25 F1 6E C0 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command08 = [39 01 00 00 00 00 3B E0 07 08 09 0D 10 14 16 13 24 36 48 4A 58 6F 76 80 97 A5 A8 B5 C6 62 63 68 6F 72 78 7F 7F 00 02 08 0D 0C 0E 0F 10 24 36 48 4A 58 6F 78 82 99 A4 A0 B1 C0 5E 5E 64 6B 6C 73 7F 7F + 39 01 00 00 00 00 02 BD 00 + 39 01 00 00 00 00 2C C1 01 00 0A 14 1E 28 32 3B 43 4A 52 58 5F 65 6D 74 7B 82 8A 92 99 A1 A8 AE B6 BE C5 CD D6 DC E5 ED F6 FF 15 8F C9 C5 97 4F 3C CB C0 + 39 01 00 00 00 00 02 BD 01 + 39 01 00 00 00 00 2B C1 00 07 0F 17 1F 27 2E 35 3B 40 46 4B 50 55 5B 60 66 6B 71 77 7E 83 88 8E 94 99 9F A5 AB B1 B7 BD C3 3A 4D 30 22 3F 1D 2B A4 80 + 39 01 00 00 00 00 02 BD 02 + 39 01 00 00 00 00 2B C1 00 06 0C 12 18 1F 25 2B 30 35 39 3D 41 46 4B 4F 54 59 5D 62 67 6C 70 75 79 7E 83 88 8D 92 96 9B A0 00 1D 4B E2 0F DA D9 0D 40 + 39 01 00 00 00 00 02 BD 00 + ]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-lane-map = "lane_map_0123"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + qcom,mdss-dsi-panel-timings = [8C 20 14 00 46 48 1A 22 18 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-reset-sequence = <1 50>, <0 20>, <1 5>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-tx-eot-append; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 01 D9 + 06 01 00 01 05 00 01 09 + ]; + qcom,mdss-dsi-panel-status-command-num = <2>; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-read-length = <4 4>; + qcom,mdss-dsi-panel-status-valid-params = <1 3>; + qcom,mdss-dsi-panel-status-value = + <0x80 0x80 0x73 0x04 >, + <0x80 0x80 0x73 0x04 >; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-720p-video.dtsi new file mode 100644 index 0000000000000..6efda422408a6 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-720p-video.dtsi @@ -0,0 +1,818 @@ +/* Copyright (c) 2013, 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_ebbg_720p_video: qcom,mdss_dsi_ili9881c_ebbg_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_Ebbg"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <114>; + qcom,mdss-dsi-h-back-porch = <180>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <10>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 00 00 00 00 00 05 FF 98 81 00 FF + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 00 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 B4 00 02 11 00 + 39 00 00 00 00 00 02 29 00 + 39 00 00 00 0A 00 02 35 00 + 39 00 00 00 00 00 03 51 0F FF + 39 00 00 00 00 00 02 53 2C + 39 00 00 00 00 00 02 55 00 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 03 5E 00 FF + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 04 16 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 40 + 39 00 00 00 00 00 02 07 04 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + qcom,mdss-dsi-off-command = [ + 39 00 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 00 + 05 00 00 00 0A 00 02 28 00 + 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1A + 39 00 00 00 00 00 02 A2 29 + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2B + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 8D + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 76 + 39 00 00 00 00 00 02 AC 1A + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 29 + 39 00 00 00 00 00 02 B1 4F + 39 00 00 00 00 00 02 B2 5D + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1A + 39 00 00 00 00 00 02 C2 29 + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2B + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 8D + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 76 + 39 00 00 00 00 00 02 CC 1A + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 4F + 39 00 00 00 00 00 02 D2 5D + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 28 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 39 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 4C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 5F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 73 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 A6 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 B6 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 C6 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D F7 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 08 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 18 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 37 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 48 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 58 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 69 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 79 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 89 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 98 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A8 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B7 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D6 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 F5 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 14 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 34 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 53 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 71 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 91 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 AC + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C9 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 E6 + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 26 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 43 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 63 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 81 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A1 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BF + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E5 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B FF + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 12 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 42 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 52 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AD + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BB + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C8 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D7 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F E8 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 F8 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 07 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 16 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 23 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 30 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 3E + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 4C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 5A + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 68 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 77 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 A0 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 BB + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D6 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F1 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0C + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 45 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 5E + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 78 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 95 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B B3 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D CC + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F E6 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 00 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 1E + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 39 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 53 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 70 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 8A + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 41 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4C + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 56 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 64 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 73 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 9B + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AA + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B8 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C4 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 E0 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 EF + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 0B + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 18 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 24 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 31 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3D + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 4A + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 58 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 65 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 7F + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 98 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B1 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D C9 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F E2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 FA + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 2D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 47 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 5E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 76 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F AB + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 C4 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 DA + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 F2 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 0C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 27 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 3E + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + + qcom,mdss-dsi-panel-cool-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 19 + 39 00 00 00 00 00 02 A5 2C + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 95 + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 27 + 39 00 00 00 00 00 02 AB 7F + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 27 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 63 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 19 + 39 00 00 00 00 00 02 C5 2C + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 95 + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 27 + 39 00 00 00 00 00 02 CB 7F + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 27 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 63 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 18 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 29 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 3A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 4C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 5E + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 71 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 92 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 A4 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 B4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 C5 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D FB + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 08 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 18 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 37 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 46 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 57 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 67 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 78 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 88 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A7 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B6 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D5 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 F4 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 13 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 34 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 53 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 70 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 8F + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 B0 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 CE + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 EB + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 4B 0B + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 2D + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 49 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 6A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A7 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C6 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E2 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 13 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 25 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 57 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 67 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 78 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 87 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 96 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A7 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F7 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 17 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 25 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 33 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 42 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 61 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 70 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 7F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 8E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 9C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B9 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F4 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 32 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 4F + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 6A + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 A6 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 C4 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B DE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D FB + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 1A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 37 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 53 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 72 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 8E + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B C9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 61 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A2 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B2 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C1 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D0 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F2 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 03 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 12 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 20 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 2E + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 3B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 4B + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 5A + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 69 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 78 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 87 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B1 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 CE + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B EC + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 0A + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 29 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 47 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 61 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 7D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 9B + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 BA + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B D4 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D EF + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 0C + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 2C + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 46 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 64 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 80 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 9E + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B BA + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-nature-command = [39 01 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 02 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 11 00 + 39 01 00 00 00 00 04 FF 98 81 03 + 39 01 00 00 00 00 04 FF 98 81 03 + 39 01 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-init-last; + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 55 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 02 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 00 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 04 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 55 01]; + + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <20000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + + qcom,esd-check-enabled; + + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08 + 06 01 00 01 05 00 02 0D 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1 1>; + qcom,mdss-dsi-panel-status-value = <0x9c 0x00>; + qcom,mdss-dsi-panel-status-read-length = <1 1>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3a-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3a-720p-video.dtsi new file mode 100644 index 0000000000000..b50934b491985 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3a-720p-video.dtsi @@ -0,0 +1,3418 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_ebbg_720p_video: qcom,mdss_dsi_ili9881c_ebbg_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_Ebbg_c3a"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <116>; + qcom,mdss-dsi-h-back-porch = <180>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <10>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 02 E5 00 + 39 01 00 00 0A 00 04 FF 98 81 00 + 39 01 00 00 96 00 02 11 00 + 39 01 00 00 00 00 02 29 00 + 39 01 00 00 0A 00 02 35 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-off-command = [39 00 00 00 00 00 04 FF 98 81 00 + 05 00 00 00 0A 00 02 28 00 + 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 17 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 89 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 74 + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 4F + 39 00 00 00 00 00 02 B2 5D + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 89 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 74 + 39 00 00 00 00 00 02 CC 1B + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 D1 4F + 39 00 00 00 00 00 02 D2 5D + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 13 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 30 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 42 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 95 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F6 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 16 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 24 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 32 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 94 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A4 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C3 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E2 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 02 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1D + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3F + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7B + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BE + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DA + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FA + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1C + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3C + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7B + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BC + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DB + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 29 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 45 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 54 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 62 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 70 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 98 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D0 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 DF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 EE + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 0B + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 18 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 24 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 31 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 4A + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 59 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 67 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 83 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 9E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B9 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D D4 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F EE + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 0A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 26 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 43 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 5C + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 77 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 92 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D AF + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F CA + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 E4 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 21 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 39 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 55 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 70 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0A + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 13 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 25 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 30 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 43 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 51 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7B + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A2 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B0 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E4 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F2 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 0B + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 18 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 23 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 39 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 46 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 60 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 79 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 93 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C5 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 DD + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F6 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 0F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 29 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 43 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 5A + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 73 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A6 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C0 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DB + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 EF + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 0B + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 25 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-cool-command = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 19 + 39 00 00 00 00 00 02 A2 29 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 91 + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 7E + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 51 + 39 00 00 00 00 00 02 AF 26 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 57 + 39 00 00 00 00 00 02 B2 66 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 19 + 39 00 00 00 00 00 02 C2 29 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 91 + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 7E + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 51 + 39 00 00 00 00 00 02 CF 26 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 57 + 39 00 00 00 00 00 02 D2 66 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 27 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B5 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C4 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E9 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F FA + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 17 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 25 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 34 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 42 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 54 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 64 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 74 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A2 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1F + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 41 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5F + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DD + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FB + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 20 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3B + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7C + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C3 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E3 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 12 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 21 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3D + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 5A + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 69 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 77 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 94 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A4 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D1 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F E1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 11 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1F + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 2B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 39 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 47 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 56 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 66 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 75 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 A1 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 BE + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B DB + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F6 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 14 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 33 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 4F + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 6C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 8A + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A9 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B C5 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 00 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 21 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 3F + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 61 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 7C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 9B + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B B6 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 09 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 16 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 26 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 43 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4F + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6D + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 9E + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EC + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FC + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0C + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1A + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 35 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7E + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B9 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D5 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F1 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 65 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D DA + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F6 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 17 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 37 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 56 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 72 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8F + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B AB + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-nature-command = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 02 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 0A 00 02 11 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-init-last; + + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 02 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 00 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 04 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 16 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 23 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 32 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 83 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 93 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 50 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 E9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FA + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 17 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 26 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 33 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 41 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 50 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 5F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D2 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D ED + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0A + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 47 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 61 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 7E + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9C + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BC + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D5 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F1 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 0F + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 2F + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4B + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6A + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 08 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 11 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 20 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2E + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3A + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 44 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 52 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 61 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 70 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8C + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 9A + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C2 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 CF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 DD + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 ED + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 FB + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 09 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 16 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 24 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 30 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 3C + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 49 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 57 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 72 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 8D + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B A8 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D C1 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F DA + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 F3 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 0E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 29 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 44 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 5D + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 76 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 91 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F AE + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 C8 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 DF + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 F9 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 15 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 31 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 4A + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command02 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 16 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 32 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 83 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 93 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 50 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 84 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 92 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DA + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FB + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 18 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 34 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 61 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D3 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0C + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 48 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 64 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 80 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D7 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F3 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 12 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 32 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4E + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6D + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 89 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A8 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 07 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0F + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 1B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 34 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 3D + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 4C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5A + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 68 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 77 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 84 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 91 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 9E + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B8 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C4 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D0 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 DE + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 ED + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FA + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 08 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 14 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 21 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2D + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 38 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 45 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 5E + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 78 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 92 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AA + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 DA + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F2 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 0B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 24 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 40 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 57 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 6E + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 87 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A1 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 BD + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 D2 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 EA + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 03 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 1E + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command03 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 16 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 32 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 50 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DA + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FA + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 18 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 26 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 33 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D3 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0C + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 48 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 63 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 80 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BD + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D7 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F3 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 11 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 31 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4D + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6D + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 88 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A7 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 06 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 15 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 25 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 2F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 36 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 44 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 53 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 61 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 6F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 7C + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 88 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D A1 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F AE + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 BA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 C4 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D0 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 DD + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 EB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B F8 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 11 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 1D + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 28 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 33 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 4A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 63 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 7A + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 94 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F AA + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 C1 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 D8 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 EF + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 1E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 37 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 4F + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 65 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 7B + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 94 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 AD + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 C5 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 D9 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B F0 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command04 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 E9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FA + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 08 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 17 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 26 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 33 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 41 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 4F + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 5F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D1 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D ED + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0A + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 46 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 61 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 7D + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9C + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BB + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D5 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F1 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 0E + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 2F + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4A + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 69 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0A + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 10 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 1E + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 28 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 2D + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 3B + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 4B + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 58 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 65 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 72 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 7E + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 89 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 95 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F A1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 AD + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 B9 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 C3 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 CD + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 D9 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B E6 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D F3 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F FF + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 0B + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 16 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 21 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 35 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 4B + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 62 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 79 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 90 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 A6 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 BB + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 D0 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 E6 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 FB + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 11 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 29 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 40 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 55 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 6A + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 7F + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 96 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 AE + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B C5 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command05 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FA + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 18 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 26 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 33 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 50 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D2 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 29 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 48 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 63 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 7F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BD + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D6 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F2 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 11 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 31 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4D + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 88 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A7 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 09 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 17 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 21 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 25 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 33 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 43 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 51 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 5D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 69 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 75 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 81 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 8B + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 96 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 A2 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 AD + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 B7 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 C1 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 CB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B D6 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D E2 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F EE + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 F9 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 10 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 24 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 37 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 4B + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 62 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 77 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 8C + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 A1 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 B6 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 C9 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 DD + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B F1 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 06 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 1B + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 31 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 46 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 5A + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 6D + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 82 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 97 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command06 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 57 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 75 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AF + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FA + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 18 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 26 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 33 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 50 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D2 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 29 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 48 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 63 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 7F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BD + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D6 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F2 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 11 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 31 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4D + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 88 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A7 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 07 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 0F + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 16 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 18 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 29 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 39 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 47 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 54 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 5F + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 6A + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 76 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 80 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 8A + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 94 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 9F + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 A9 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 B3 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 BD + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B C5 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D CF + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F DA + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 E5 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 F0 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 FA + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 0F + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 22 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 34 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 47 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 5B + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 6F + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 83 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 96 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 A9 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 BC + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B CE + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D E2 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F F4 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 07 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 1A + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 2E + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 43 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 55 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 67 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command07 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1E + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 58 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 67 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 76 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 84 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 92 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A1 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DA + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EB + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FB + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 19 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 34 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 43 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 61 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 70 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7E + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9B + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D4 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F0 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0D + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 64 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 81 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9F + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D8 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F4 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 13 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 33 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4F + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6E + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8A + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 07 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 10 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 14 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 18 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 1C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 2F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 3D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 4A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 56 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 60 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 6B + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 75 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 7F + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 88 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 92 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 9B + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 A5 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 AF + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B B8 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D C0 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F C8 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 D2 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 DC + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 E6 + 39 00 00 00 00 00 02 36 00 + 39 00 00 00 00 00 02 37 FA + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 0E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 1F + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 30 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 41 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 54 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 66 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 79 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 8B + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 9D + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B AE + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D C0 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F D1 + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 51 E3 + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 53 F3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 06 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 18 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 2A + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 3E + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command08 = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 18 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 94 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B3 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F5 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 23 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 31 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 93 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 20 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5B + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 79 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9B + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BD + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D8 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F7 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 19 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BD + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E0 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1E + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 49 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 58 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 66 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 76 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 84 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 92 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A1 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DA + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EB + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FB + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 19 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 34 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 43 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 61 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7E + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9B + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D3 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F0 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0C + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 64 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 81 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 9F + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D D7 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F4 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 13 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 32 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 4F + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 6E + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8A + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 06 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 08 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 0C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 0F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 12 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 15 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 23 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 32 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 40 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 4C + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 56 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 5F + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 69 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 73 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 7C + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 85 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 8D + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 96 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 A0 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B A9 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D B1 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F BA + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 C1 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 C9 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 D2 + 39 00 00 00 00 00 02 36 00 + 39 00 00 00 00 00 02 37 E4 + 39 00 00 00 00 00 02 38 00 + 39 00 00 00 00 00 02 39 F7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 09 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 1A + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 29 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 39 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 5A + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 6B + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 7C + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B 8D + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D 9E + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F AE + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 51 BE + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 53 CE + 39 00 00 00 00 00 02 54 01 + 39 00 00 00 00 00 02 55 DE + 39 00 00 00 00 00 02 56 01 + 39 00 00 00 00 00 02 57 EE + 39 00 00 00 00 00 02 58 01 + 39 00 00 00 00 00 02 59 FE + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 0F + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 22 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1c>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-pwm-gpio = <&pm8937_mpps 4 0>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3b-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3b-720p-video.dtsi new file mode 100644 index 0000000000000..e221636beb001 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbg-c3b-720p-video.dtsi @@ -0,0 +1,3748 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_ebbg_720p_video: qcom,mdss_dsi_ili9881c_ebbg_c3b_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_Ebbg_c3b"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-model = "EBBG HD ILI9881C VIDEO PANEL"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <116>; + qcom,mdss-dsi-h-back-porch = <180>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <10>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 02 E5 00 + 39 01 00 00 0A 00 04 FF 98 81 00 + 39 01 00 00 96 00 02 11 00 + 39 01 00 00 00 00 02 29 00 + 39 01 00 00 0A 00 02 35 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-off-command = [39 00 00 00 00 00 04 FF 98 81 00 + 05 00 00 00 0A 00 02 28 00 + 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 17 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 89 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 74 + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 4F + 39 00 00 00 00 00 02 B2 5D + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 89 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 74 + 39 00 00 00 00 00 02 CC 1B + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 D1 4F + 39 00 00 00 00 00 02 D2 5D + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 13 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 30 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 42 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 95 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F6 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 16 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 24 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 32 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 94 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A4 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C3 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E2 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 02 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1D + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3F + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7B + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BE + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DA + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FA + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1C + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3C + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7B + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BC + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DB + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 29 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 45 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 54 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 62 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 70 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 98 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D0 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 DF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 EE + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 0B + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 18 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 24 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 31 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 4A + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 59 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 67 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 83 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 9E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B9 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D D4 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F EE + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 0A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 26 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 43 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 5C + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 77 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 92 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D AF + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F CA + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 E4 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 21 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 39 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 55 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 70 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0A + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 13 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 25 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 30 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 43 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 51 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7B + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A2 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B0 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E4 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F2 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 0B + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 18 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 23 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 39 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 46 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 60 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 79 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 93 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C5 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 DD + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F6 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 0F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 29 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 43 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 5A + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 73 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A6 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C0 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DB + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 EF + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 0B + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 25 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-cool-command = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 19 + 39 00 00 00 00 00 02 A2 29 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 91 + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 7E + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 51 + 39 00 00 00 00 00 02 AF 26 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 57 + 39 00 00 00 00 00 02 B2 66 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 19 + 39 00 00 00 00 00 02 C2 29 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 91 + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 7E + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 51 + 39 00 00 00 00 00 02 CF 26 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 57 + 39 00 00 00 00 00 02 D2 66 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 27 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B5 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C4 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E9 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F FA + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 17 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 25 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 34 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 42 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 54 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 64 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 74 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A2 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1F + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 41 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5F + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DD + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FB + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 20 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3B + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7C + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C3 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E3 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 12 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 21 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3D + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 5A + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 69 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 77 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 94 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A4 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D1 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F E1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 11 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1F + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 2B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 39 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 47 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 56 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 66 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 75 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 A1 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 BE + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B DB + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F6 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 14 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 33 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 4F + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 6C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 8A + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A9 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B C5 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 00 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 21 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 3F + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 61 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 7C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 9B + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B B6 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 09 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 16 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 26 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 43 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4F + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6D + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 9E + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EC + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FC + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0C + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1A + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 35 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7E + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B9 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D5 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F1 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 65 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D DA + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F6 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 17 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 37 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 56 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 72 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8F + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B AB + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-nature-command = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 18 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 17 + 39 00 00 00 00 00 02 A5 2B + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 22 + 39 00 00 00 00 00 02 A8 95 + 39 00 00 00 00 00 02 A9 1B + 39 00 00 00 00 00 02 AA 27 + 39 00 00 00 00 00 02 AB 87 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1F + 39 00 00 00 00 00 02 AE 54 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2C + 39 00 00 00 00 00 02 B1 5C + 39 00 00 00 00 00 02 B2 6A + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 18 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 2B + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 22 + 39 00 00 00 00 00 02 C8 95 + 39 00 00 00 00 00 02 C9 1B + 39 00 00 00 00 00 02 CA 27 + 39 00 00 00 00 00 02 CB 87 + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1F + 39 00 00 00 00 00 02 CE 54 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2C + 39 00 00 00 00 00 02 D1 5C + 39 00 00 00 00 00 02 D2 6A + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 26 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 58 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 69 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 7B + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 8C + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 9D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 AF + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 BE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D F5 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 19 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 34 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 44 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 55 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 66 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 76 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 86 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 95 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A5 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B4 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 EF + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 0E + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 2D + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 4B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 69 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 A9 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C4 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DF + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 20 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3F + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5D + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7C + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C2 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DF + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 14 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 30 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 40 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 5E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 6E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 7E + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8C + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9C + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AC + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BB + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D9 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 2A + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 37 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 46 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 56 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 66 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 74 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 91 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 AD + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 C8 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B E4 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 1B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 38 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 53 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 6D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 89 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A6 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B C4 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D E0 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F FB + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 1B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 39 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 54 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 71 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8C + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 11 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 19 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2F + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4D + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5D + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 80 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DD + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0E + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1D + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 2B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 38 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 47 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 56 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 65 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 73 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 81 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D1 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EB + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 05 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 20 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 3C + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 55 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 70 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 8A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B A7 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D C4 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F DD + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 F8 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 14 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 32 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 4B + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 67 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 81 + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 02 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 0A 00 02 11 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-init-last; + + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 6a 06 + 39 00 00 00 00 00 02 6b 06 + 39 00 00 00 00 00 02 6c 06 + 39 00 00 00 00 00 02 6D 06 + 39 00 00 00 00 00 02 6E 06 + 39 00 00 00 00 00 02 6F 06 + 39 00 00 00 00 00 02 70 06 + 39 00 00 00 00 00 02 71 06 + 39 00 00 00 00 00 02 72 06 + 39 00 00 00 00 00 02 73 06 + 39 00 00 00 00 00 02 74 06 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 76 06 + 39 00 00 00 00 00 02 77 06 + 39 00 00 00 00 00 02 78 06 + 39 00 00 00 00 00 02 79 06 + 39 00 00 00 00 00 02 7A 06 + 39 00 00 00 00 00 02 7B 06 + 39 00 00 00 00 00 02 7C 06 + 39 00 00 00 00 00 02 7D 06 + 39 00 00 00 00 00 02 7E 05 + 39 00 00 00 00 00 02 7F 05 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 52 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 61 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 7F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CA + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FB + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 33 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 74 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 48 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 55 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 63 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 71 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 99 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F CE + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 DD + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 ED + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FB + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 09 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 16 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 23 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 2F + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3B + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 49 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 58 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 67 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 A0 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B BC + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D D8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F F4 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 11 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 2E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 4C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 69 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B A7 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D C6 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F E1 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 1E + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 3C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 59 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 77 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 93 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 1B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 39 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 44 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 52 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 60 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8A + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 98 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BF + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 CB + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D9 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E8 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F5 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 03 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 10 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 1C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 28 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 33 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 3F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 4C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 69 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 84 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D B8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F D3 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 EC + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 22 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 3F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 75 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 92 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F B0 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 CB + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 E5 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 01 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 21 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 3A + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 55 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command02 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 18 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FB + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 38 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 46 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 53 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 60 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6D + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7B + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 88 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 95 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D BD + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 D7 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 E6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 F4 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 02 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 0F + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 1C + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 28 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 34 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 40 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 4E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 5D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 79 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 95 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B0 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D CB + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F E6 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 02 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 1E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 3C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 58 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 75 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 93 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D B2 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F CE + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 E9 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 26 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 42 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 5F + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 7B + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0B + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 14 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 27 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 34 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 3E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 4C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5A + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 69 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 77 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 90 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AB + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B7 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C3 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 CE + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 DC + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 EA + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F7 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 04 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 10 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 1C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 27 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 32 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 3C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 57 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 71 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 8B + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D A5 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F BE + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 D7 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F0 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 09 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 23 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 3E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 58 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 72 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8E + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 AA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C5 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DE + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 F7 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 15 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 31 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command03 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 19 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 25 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 37 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 45 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 52 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6B + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 79 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 86 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 92 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B AD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D BA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 D4 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 E1 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 F0 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 FE + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 0B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 17 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 24 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 2F + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 3B + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 48 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 56 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 72 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 8D + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B A9 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D C3 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F DE + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 F9 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 31 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 4D + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 69 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 85 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D A4 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F C2 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 DC + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 F7 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 14 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 33 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 4E + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 6C + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 16 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 22 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 2F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 38 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 47 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 55 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 63 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 70 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 7D + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 96 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D A2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F AF + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 BA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 C6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D1 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 DE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 EB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B F8 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 10 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 1B + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 26 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 30 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 46 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 5F + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 79 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 92 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F AA + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 C2 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 DA + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 F2 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 0A + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 23 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 3D + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 56 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 6E + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 88 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 A3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 BF + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 D5 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 EE + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command04 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1A + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 26 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 63 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1B + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 29 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 43 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 50 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 69 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 76 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8E + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 9C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C2 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 CD + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 DB + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E9 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F7 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 04 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 10 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 1C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 28 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 33 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 3F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 4D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 68 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 83 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D B8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F D2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 EB + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 06 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 21 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 3E + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 58 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 74 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F AF + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 CA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 E3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 1C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 39 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 53 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 09 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 11 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 1B + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 29 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 31 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 41 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 50 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 5C + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 69 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 76 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 8D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 99 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F A6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 B1 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 BC + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 C7 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 D2 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 DE + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B EB + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D F7 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 03 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 0E + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 19 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 23 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 37 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 4D + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 66 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 7E + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 95 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 AC + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 C2 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 D9 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 F0 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 07 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 1F + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 38 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 4F + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 67 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 7F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 99 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 B3 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 CA + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B E0 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command05 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 27 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 45 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 63 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 73 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1A + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 28 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 34 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 42 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 66 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 73 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 80 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8B + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 98 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BD + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E3 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F1 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FE + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 0A + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 16 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 22 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2D + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 38 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 44 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 5F + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 79 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 94 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C7 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 E0 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F9 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 14 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 2F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 4A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 64 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 7F + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 9C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 BA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 D2 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 EC + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 07 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 24 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 3F + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 03 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 08 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 16 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 21 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 2A + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 3A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 49 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 56 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 63 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 6F + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 7B + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 86 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 91 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 9D + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 A8 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 B3 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 BD + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 C8 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 D2 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B DE + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D EA + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F F5 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 01 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 0C + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 16 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 2A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 3C + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 53 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 6B + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 81 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 97 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 AD + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 C2 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 D8 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 ED + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 03 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 31 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 48 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 5F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 75 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 8D + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 A5 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B BF + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command06 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 28 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 37 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 45 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 55 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 73 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 90 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1A + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 27 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 33 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 40 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4C + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 58 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 64 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 71 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 88 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AE + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C5 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D0 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 DD + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 EB + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F8 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 10 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 1C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 27 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 32 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 3D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 57 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 71 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 8A + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D A4 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F BD + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 D5 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 EE + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 21 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 3D + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 56 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 70 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A7 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DB + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 F4 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 11 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 2E + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 06 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 11 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 19 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 22 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 33 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 43 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 51 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 5C + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 68 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 74 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 7F + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 89 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 94 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 9F + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 AA + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 B5 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 BE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 C8 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B D2 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D DD + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F E9 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 F4 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 FE + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 09 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 1C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 2F + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 41 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 57 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 6D + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 83 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 98 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 AD + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 D6 + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B EA + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 14 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 2A + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 40 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 56 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 6B + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 81 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 99 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command07 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1C + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 29 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 37 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 55 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 90 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AF + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0C + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 19 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 26 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 32 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3E + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4B + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 56 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 62 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 91 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C1 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 CB + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D8 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 E5 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F2 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 0B + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 16 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 21 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 2C + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 36 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 4E + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 68 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 81 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 9A + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F B2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 CA + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 E2 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 FB + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 14 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 2E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 48 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 62 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 7B + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 97 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 B3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 CC + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 E3 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 FD + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 17 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 05 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 07 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 0A + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 14 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 2A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 3C + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 4A + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 56 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 61 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 6C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 77 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 81 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 8B + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 95 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 A0 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 AA + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 B4 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 BD + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B C7 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D D0 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F DA + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 E5 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 F0 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 FA + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 0E + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 20 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 31 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 43 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 58 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 6D + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 81 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 95 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 A9 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 BD + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B D0 + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F F7 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 0B + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 1F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 34 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 49 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 5D + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 71 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command08 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1F + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 38 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 56 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A0 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AF + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CC + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DB + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0D + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 64 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 24 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 30 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3C + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 49 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 54 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6A + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 77 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 8C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 99 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D A5 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 BC + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 C6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D2 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 DE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 EB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B F7 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 0F + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 1A + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 25 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 2F + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 44 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 5E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 76 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 8E + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F A6 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 BE + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 D5 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 EC + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 04 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 1D + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 37 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 50 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 68 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 81 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 9C + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 B8 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 CF + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 E6 + 39 00 00 00 00 00 02 5A 02 + 39 01 00 00 00 00 02 5B FF + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 11 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 17 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 1B + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 1F + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 33 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 42 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 4F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 59 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 64 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 6E + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 79 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 82 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 8B + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 95 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 9F + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 A9 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 B3 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B BB + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D C4 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F CC + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 D7 + 39 00 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 E0 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 EB + 39 00 00 00 00 00 02 36 00 + 39 00 00 00 00 00 02 37 FE + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 10 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 21 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 31 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 42 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 55 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 6A + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 7D + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 90 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 A2 + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B B4 + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D C7 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F D9 + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 51 EB + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 53 FE + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 11 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 24 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 39 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 4B + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 22 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1c>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-pwm-gpio = <&pm8937_mpps 4 0>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi new file mode 100644 index 0000000000000..a55a2fe3aa615 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi @@ -0,0 +1,819 @@ +/* Copyright (c) 2013, 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_ebbgDJN_720p_video: qcom,mdss_dsi_ili9881c_ebbgDJN_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_EbbgDJN"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <114>; + qcom,mdss-dsi-h-back-porch = <180>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <10>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 00 00 00 00 00 05 FF 98 81 00 FF + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 00 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 B4 00 02 11 00 + 39 00 00 00 00 00 02 29 00 + 39 00 00 00 0A 00 02 35 00 + 39 00 00 00 00 00 03 51 0F FF + 39 00 00 00 00 00 02 53 2C + 39 00 00 00 00 00 02 55 00 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 03 5E 00 FF + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 04 16 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 40 + 39 00 00 00 00 00 02 07 04 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + qcom,mdss-dsi-off-command = [ + 39 00 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 00 + 05 00 00 00 0A 00 02 28 00 + 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1A + 39 00 00 00 00 00 02 A2 29 + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2B + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 8D + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 76 + 39 00 00 00 00 00 02 AC 1A + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 29 + 39 00 00 00 00 00 02 B1 4F + 39 00 00 00 00 00 02 B2 5D + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1A + 39 00 00 00 00 00 02 C2 29 + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2B + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 8D + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 76 + 39 00 00 00 00 00 02 CC 1A + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 4F + 39 00 00 00 00 00 02 D2 5D + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 28 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 39 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 4C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 5F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 73 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 A6 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 B6 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 C6 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D F7 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 08 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 18 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 37 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 48 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 58 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 69 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 79 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 89 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 98 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A8 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B7 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D6 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 F5 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 14 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 34 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 53 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 71 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 91 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 AC + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C9 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 E6 + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 26 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 43 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 63 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 81 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A1 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BF + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E5 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B FF + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 12 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 42 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 52 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AD + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BB + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C8 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D7 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F E8 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 F8 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 07 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 16 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 23 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 30 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 3E + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 4C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 5A + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 68 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 77 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 A0 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 BB + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D6 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F1 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0C + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 45 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 5E + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 78 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 95 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B B3 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D CC + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F E6 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 00 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 1E + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 39 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 53 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 70 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 8A + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 41 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4C + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 56 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 64 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 73 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 9B + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AA + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B8 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C4 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 E0 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 EF + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 0B + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 18 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 24 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 31 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3D + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 4A + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 58 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 65 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 7F + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 98 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B1 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D C9 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F E2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 FA + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 2D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 47 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 5E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 76 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F AB + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 C4 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 DA + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 F2 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 0C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 27 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 3E + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + + qcom,mdss-dsi-panel-cool-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 19 + 39 00 00 00 00 00 02 A5 2C + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 95 + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 27 + 39 00 00 00 00 00 02 AB 7F + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 27 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 63 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 19 + 39 00 00 00 00 00 02 C5 2C + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 95 + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 27 + 39 00 00 00 00 00 02 CB 7F + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 27 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 63 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 18 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 29 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 3A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 4C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 5E + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 71 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 92 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 A4 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 B4 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 C5 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D FB + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 08 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 18 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 37 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 46 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 57 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 67 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 78 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 88 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A7 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B6 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D5 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 F4 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 13 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 34 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 53 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 70 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 8F + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 B0 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 CE + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 EB + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 4B 0B + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 2D + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 49 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 6A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A7 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C6 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E2 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 13 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 25 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 57 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 67 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 78 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 87 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 96 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A7 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F7 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 17 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 25 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 33 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 42 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 61 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 70 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 7F + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 8E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 9C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B9 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D6 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F4 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 32 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 4F + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 6A + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 A6 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 C4 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B DE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D FB + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 1A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 37 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 53 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 72 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 8E + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B C9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 61 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A2 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B2 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C1 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D0 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F2 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 03 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 12 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 20 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 2E + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 3B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 4B + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 5A + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 69 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 78 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 87 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B1 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 CE + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B EC + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 0A + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 29 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 47 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 61 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 7D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 9B + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 BA + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B D4 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D EF + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 0C + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 2C + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 46 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 64 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 80 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 9E + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B BA + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-nature-command = [39 01 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 02 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 11 00 + 39 01 00 00 00 00 04 FF 98 81 03 + 39 01 00 00 00 00 04 FF 98 81 03 + 39 01 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-init-last; + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 55 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 02 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 00 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 04 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 02 55 01]; + + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 30 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <20000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + qcom,mdss-night-brightness = <8 26 46 68>; + + qcom,esd-check-enabled; + + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08 + 06 01 00 01 05 00 02 0D 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1 1>; + qcom,mdss-dsi-panel-status-value = <0x9c 0x00>; + qcom,mdss-dsi-panel-status-read-length = <1 1>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-c3b-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-c3b-720p-video.dtsi new file mode 100644 index 0000000000000..61d549f4fadb3 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-ebbgDJN-c3b-720p-video.dtsi @@ -0,0 +1,3748 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_ebbgDJN_720p_video: qcom,mdss_dsi_ili9881c_ebbgDJN_c3b_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_EbbgDJN_c3b"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <112>; + qcom,mdss-dsi-h-back-porch = <180>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <12>; + qcom,mdss-dsi-v-pulse-width = <4>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 02 E5 00 + 39 01 00 00 0A 00 04 FF 98 81 00 + 39 01 00 00 96 00 02 11 00 + 39 01 00 00 00 00 02 29 00 + 39 01 00 00 0A 00 02 35 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-off-command = [39 00 00 00 00 00 04 FF 98 81 00 + 05 00 00 00 0A 00 02 28 00 + 05 01 00 00 96 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 17 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 89 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 74 + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 4F + 39 00 00 00 00 00 02 B2 5D + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 89 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 74 + 39 00 00 00 00 00 02 CC 1B + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 D1 4F + 39 00 00 00 00 00 02 D2 5D + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 13 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 30 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 42 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 95 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C6 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F F6 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 16 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 24 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 32 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 41 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 51 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 62 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 72 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 82 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 94 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A4 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C3 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E2 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 02 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1D + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 3F + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7B + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 BE + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DA + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FA + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1C + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3C + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7B + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BC + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DB + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 29 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 45 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 54 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 62 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 70 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 98 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F D0 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 DF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 EE + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 0B + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 18 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 24 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 31 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 4A + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 59 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 67 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 83 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 9E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B9 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D D4 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F EE + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 0A + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 26 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 43 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 5C + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 77 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 92 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D AF + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F CA + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 E4 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 21 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 39 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 55 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 70 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0A + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 13 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 25 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 30 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 43 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 51 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7B + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A2 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B0 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E4 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F2 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 0B + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 18 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 23 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2F + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 39 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 46 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 60 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 79 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 93 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C5 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 DD + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F6 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 0F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 29 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 43 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 5A + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 73 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A6 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C0 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DB + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 EF + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 0B + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 25 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-cool-command = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 19 + 39 00 00 00 00 00 02 A2 29 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 20 + 39 00 00 00 00 00 02 A8 91 + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 7E + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 51 + 39 00 00 00 00 00 02 AF 26 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 57 + 39 00 00 00 00 00 02 B2 66 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 19 + 39 00 00 00 00 00 02 C2 29 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 20 + 39 00 00 00 00 00 02 C8 91 + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 7E + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 51 + 39 00 00 00 00 00 02 CF 26 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 57 + 39 00 00 00 00 00 02 D2 66 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 27 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 76 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 B5 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 C4 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B D6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D E9 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F FA + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 17 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 25 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 34 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 42 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 54 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 64 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 74 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 83 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 A2 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 E1 + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 00 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 1F + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 41 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 5F + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 7E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 9F + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DD + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FB + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 20 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3B + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7C + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A0 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C3 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 E3 + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 12 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 21 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3D + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4B + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 5A + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 69 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 77 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 94 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A4 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C3 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D1 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F E1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 11 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1F + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 2B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 39 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 47 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 56 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 66 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 75 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 A1 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 BE + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B DB + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F6 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 14 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 33 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 4F + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 6C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 8A + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A9 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B C5 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 00 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 21 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 3F + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 61 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 7C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 9B + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B B6 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 09 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 16 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 26 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 43 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4F + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6D + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 9E + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 AD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EC + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FC + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0C + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1A + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 27 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 35 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 42 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 51 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 60 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 6F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 7E + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B9 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D5 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D F1 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 2C + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 49 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 65 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B BE + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D DA + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F F6 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 17 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 37 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 56 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 72 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8F + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B AB + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-nature-command = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 18 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 15 + 39 00 00 00 00 00 02 A4 17 + 39 00 00 00 00 00 02 A5 2B + 39 00 00 00 00 00 02 A6 20 + 39 00 00 00 00 00 02 A7 22 + 39 00 00 00 00 00 02 A8 95 + 39 00 00 00 00 00 02 A9 1B + 39 00 00 00 00 00 02 AA 27 + 39 00 00 00 00 00 02 AB 87 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1F + 39 00 00 00 00 00 02 AE 54 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2C + 39 00 00 00 00 00 02 B1 5C + 39 00 00 00 00 00 02 B2 6A + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 18 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 15 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 2B + 39 00 00 00 00 00 02 C6 20 + 39 00 00 00 00 00 02 C7 22 + 39 00 00 00 00 00 02 C8 95 + 39 00 00 00 00 00 02 C9 1B + 39 00 00 00 00 00 02 CA 27 + 39 00 00 00 00 00 02 CB 87 + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1F + 39 00 00 00 00 00 02 CE 54 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2C + 39 00 00 00 00 00 02 D1 5C + 39 00 00 00 00 00 02 D2 6A + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 26 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 58 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 69 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 7B + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 8C + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 9D + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 AF + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 BE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 D0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B E1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D F5 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 20 01 + 39 00 00 00 00 00 02 21 19 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 28 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 34 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 44 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 55 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 66 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 76 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 86 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 95 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 A5 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 B4 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 D2 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 EF + 39 00 00 00 00 00 02 3A 02 + 39 00 00 00 00 00 02 3B 0E + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 2D + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 4B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 69 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 A9 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 C4 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 DF + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 20 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3F + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5D + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7C + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 C2 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DF + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 14 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 22 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 30 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 40 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 4F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 5E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 6E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 7E + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8C + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9C + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AC + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BB + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B C9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D D9 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 2A + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 37 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 46 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 56 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 66 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 74 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 91 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 AD + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 C8 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B E4 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 1B + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 38 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 53 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 6D + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 89 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 A6 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B C4 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D E0 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F FB + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 1B + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 39 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 54 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 71 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 8C + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B A9 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 11 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 19 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2F + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4D + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5D + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 80 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 A0 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 B0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F DD + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 EF + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 0E + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 1D + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 2B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 38 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 47 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 56 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 65 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 73 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 81 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 9C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 B7 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B D1 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D EB + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 05 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 20 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 3C + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 55 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 70 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 8A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B A7 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D C4 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F DD + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 F8 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 14 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 32 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 4B + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 67 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 81 + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 E5 02 + 39 00 00 00 0A 00 04 FF 98 81 00 + 39 00 00 00 0A 00 02 11 00 + 39 00 00 00 00 00 04 FF 98 81 03 + 39 00 00 00 00 00 02 2C 0C + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-init-last; + + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 6a 06 + 39 00 00 00 00 00 02 6b 06 + 39 00 00 00 00 00 02 6c 06 + 39 00 00 00 00 00 02 6D 06 + 39 00 00 00 00 00 02 6E 06 + 39 00 00 00 00 00 02 6F 06 + 39 00 00 00 00 00 02 70 06 + 39 00 00 00 00 00 02 71 06 + 39 00 00 00 00 00 02 72 06 + 39 00 00 00 00 00 02 73 06 + 39 00 00 00 00 00 02 74 06 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 76 06 + 39 00 00 00 00 00 02 77 06 + 39 00 00 00 00 00 02 78 06 + 39 00 00 00 00 00 02 79 06 + 39 00 00 00 00 00 02 7A 06 + 39 00 00 00 00 00 02 7B 06 + 39 00 00 00 00 00 02 7C 06 + 39 00 00 00 00 00 02 7D 06 + 39 00 00 00 00 00 02 7E 05 + 39 00 00 00 00 00 02 7F 05 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 17 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 33 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 52 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 61 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 7F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CA + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FB + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 33 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 74 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0F + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 48 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 55 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 63 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 71 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 99 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A7 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D C2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F CE + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 DD + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 ED + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 FB + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 09 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 16 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 23 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 2F + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 3B + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 49 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 58 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 67 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 A0 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B BC + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D D8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F F4 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 11 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 2E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 4C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 69 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B A7 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D C6 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F E1 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 1E + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 3C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 59 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 77 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 93 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 1B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 2C + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 39 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 44 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 52 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 60 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8A + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 98 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B3 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BF + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 CB + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D9 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E8 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F5 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 03 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 10 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 1C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 28 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 33 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 3F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 4C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 69 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 84 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D B8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F D3 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 EC + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 22 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 3F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 75 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 92 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F B0 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 CB + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 E5 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 01 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 21 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 3A + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 55 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + qcom,mdss-dsi-panel-eye-command02 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 18 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 24 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 43 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 71 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FB + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 38 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 46 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 53 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 60 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6D + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 7B + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 88 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 95 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A3 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B B1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D BD + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 D7 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 E6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 F4 + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 02 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 0F + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 1C + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 28 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 34 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 40 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 4E + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 5D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 79 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 95 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B B0 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D CB + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F E6 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 02 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 1E + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 3C + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 58 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 75 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 93 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D B2 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F CE + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 E9 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 26 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 42 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 5F + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 7B + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0B + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 14 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 27 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 34 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 3E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 4C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5A + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 69 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 77 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 90 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AB + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B7 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C3 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 CE + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 DC + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 EA + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F7 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 04 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 10 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 1C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 27 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 32 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 3C + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 57 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 71 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 8B + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D A5 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F BE + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 D7 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F0 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 09 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 23 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 3E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 58 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 72 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8E + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 AA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C5 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DE + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 F7 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 15 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 31 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command03 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 19 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 25 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 53 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 62 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BC + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 26 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 52 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 2A + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 37 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 45 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 52 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5E + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 6B + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 79 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 86 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 92 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 A0 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B AD + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D BA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 D4 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 E1 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 F0 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 FE + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 0B + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 17 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 24 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 2F + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 3B + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 48 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 56 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 72 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 8D + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B A9 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D C3 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F DE + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 F9 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 31 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 4D + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 69 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 85 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D A4 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F C2 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 DC + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 F7 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 14 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 33 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 4E + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 6C + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 05 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 16 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 22 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 2F + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 38 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 47 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 55 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 63 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 70 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 7D + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 96 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D A2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F AF + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 BA + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 C6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D1 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 DE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 EB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B F8 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 10 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 1B + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 26 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 30 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 46 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 5F + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 79 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 92 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F AA + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 C2 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 DA + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 F2 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 0A + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 23 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 3D + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 56 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 6E + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 88 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 A3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 BF + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 D5 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 EE + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command04 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1A + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 26 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 35 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 44 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 63 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 72 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 80 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1A + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1B + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 29 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 36 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 43 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 50 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5C + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 69 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 76 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8E + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 9C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A9 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B6 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F C2 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 CD + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 DB + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E9 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F7 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 04 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 10 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 1C + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 28 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 33 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 3F + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 4D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 68 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 83 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D B8 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F D2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 EB + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 06 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 21 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 3E + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 58 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 74 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F AF + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 CA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 E3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 1C + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 39 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 53 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 04 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 09 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 11 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 1B + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 29 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 31 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 41 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 50 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 5C + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 69 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 76 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 8D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 99 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F A6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 B1 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 BC + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 C7 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 D2 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 DE + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B EB + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D F7 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 03 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 0E + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 19 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 23 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 37 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 4D + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 66 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 7E + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 95 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 AC + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 C2 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 D9 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 F0 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 07 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 1F + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 38 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 4F + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 67 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 7F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 99 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 B3 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 CA + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B E0 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command05 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 27 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 36 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 45 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 54 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 63 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 73 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EB + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D3 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1A + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 28 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 34 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 42 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4E + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 5A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 66 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 73 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 80 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 8B + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 98 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A5 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D B2 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F BD + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C9 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 E3 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 F1 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 FE + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 0A + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 16 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 22 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 2D + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 38 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 44 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 5F + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 79 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 94 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F C7 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 E0 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 F9 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 14 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 2F + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 4A + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 64 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 7F + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 9C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 BA + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 D2 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 EC + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 07 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 24 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 3F + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 03 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 08 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0F + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 16 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 21 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 2A + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 3A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 49 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 56 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 63 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 6F + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 7B + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 86 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 91 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 9D + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 A8 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 B3 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 BD + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 C8 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 D2 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B DE + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D EA + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F F5 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 01 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 0C + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 16 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 2A + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 3C + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 53 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 6B + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 81 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 97 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 AD + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 C2 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 D8 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 ED + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 03 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 31 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 48 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 5F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 75 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 8D + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 A5 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B BF + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command06 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 28 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 37 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 45 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 55 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 73 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 90 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1A + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 27 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 33 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 40 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4C + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 58 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 64 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 71 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7D + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 88 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B A1 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AE + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B9 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C5 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 D0 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 DD + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 EB + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F8 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 10 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 1C + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 27 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 32 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 3D + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 57 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 71 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 8A + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D A4 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F BD + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 D5 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 EE + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 21 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 3D + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 56 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 70 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 8C + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 A7 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 C3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 DB + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 F4 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 11 + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 2E + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 06 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0B + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 11 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 19 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 22 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 33 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 43 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 51 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 5C + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 68 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 74 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 7F + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 89 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 94 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 9F + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 AA + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 B5 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 BE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 C8 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B D2 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D DD + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F E9 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 F4 + 39 01 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 FE + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 09 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 1C + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 2F + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 41 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 57 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 6D + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 83 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 98 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 AD + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 D6 + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B EA + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 14 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 2A + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 40 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 56 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 6B + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 81 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 99 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command07 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1C + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 29 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 37 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 46 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 55 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 64 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 90 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 9F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AF + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0C + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0C + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 19 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 26 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 32 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3E + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 4B + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 56 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 62 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6E + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 7A + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 91 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D AA + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B6 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 C1 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 CB + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D8 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 E5 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 F2 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 0B + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 16 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 21 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 2C + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 36 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 4E + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 68 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 81 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 9A + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F B2 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 CA + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 E2 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 FB + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 14 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 2E + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 48 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 62 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 7B + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 97 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 B3 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 CC + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 E3 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 FD + 39 00 00 00 00 00 02 5A 03 + 39 01 00 00 00 00 02 5B 17 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 05 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 07 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 0A + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 14 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 2A + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 3C + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 4A + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 56 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 61 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 6C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 77 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 81 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 8B + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 95 + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 A0 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 AA + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 B4 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 BD + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B C7 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D D0 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F DA + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 E5 + 39 01 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 F0 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 FA + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 0E + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 20 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 31 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 43 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 58 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 6D + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 81 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 95 + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 A9 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 BD + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B D0 + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F F7 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 0B + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 1F + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 34 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 49 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 5D + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 71 + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00 ]; + qcom,mdss-dsi-panel-eye-command08 = [ + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 17 + 39 00 00 00 00 00 02 A2 27 + 39 00 00 00 00 00 02 A3 16 + 39 00 00 00 00 00 02 A4 18 + 39 00 00 00 00 00 02 A5 2A + 39 00 00 00 00 00 02 A6 1F + 39 00 00 00 00 00 02 A7 21 + 39 00 00 00 00 00 02 A8 8C + 39 00 00 00 00 00 02 A9 1C + 39 00 00 00 00 00 02 AA 28 + 39 00 00 00 00 00 02 AB 78 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1D + 39 00 00 00 00 00 02 AE 52 + 39 00 00 00 00 00 02 AF 28 + 39 00 00 00 00 00 02 B0 2B + 39 00 00 00 00 00 02 B1 56 + 39 00 00 00 00 00 02 B2 64 + 39 00 00 00 00 00 02 B3 32 + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 17 + 39 00 00 00 00 00 02 C2 27 + 39 00 00 00 00 00 02 C3 16 + 39 00 00 00 00 00 02 C4 18 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1F + 39 00 00 00 00 00 02 C7 21 + 39 00 00 00 00 00 02 C8 8C + 39 00 00 00 00 00 02 C9 1C + 39 00 00 00 00 00 02 CA 28 + 39 00 00 00 00 00 02 CB 78 + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1D + 39 00 00 00 00 00 02 CE 52 + 39 00 00 00 00 00 02 CF 28 + 39 00 00 00 00 00 02 D0 2B + 39 00 00 00 00 00 02 D1 56 + 39 00 00 00 00 00 02 D2 64 + 39 01 00 00 00 00 02 D3 32 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 85 48 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 1D + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 1F + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 38 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 56 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 65 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 74 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 A0 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 AF + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B CC + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D DB + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F EC + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 FC + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 0D + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 1B + 39 00 00 00 00 00 02 26 01 + 39 00 00 00 00 00 02 27 27 + 39 00 00 00 00 00 02 28 01 + 39 00 00 00 00 00 02 29 34 + 39 00 00 00 00 00 02 2A 01 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 53 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 64 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 75 + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 95 + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 B4 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 D4 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B F3 + 39 00 00 00 00 00 02 3C 02 + 39 00 00 00 00 00 02 3D 13 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 34 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 50 + 39 00 00 00 00 00 02 42 02 + 39 00 00 00 00 00 02 43 70 + 39 00 00 00 00 00 02 44 02 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 B7 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B F5 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 3A + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 5A + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 7A + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 9C + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 BE + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 DD + 39 00 00 00 00 00 02 5A 00 + 39 01 00 00 00 00 02 5B 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 0B + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 0C + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 24 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 30 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 3C + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 49 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 54 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 5F + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 6A + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 77 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 8C + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 99 + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D A5 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F B1 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 BC + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 C6 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 D2 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 DE + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 EB + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B F7 + 39 00 00 00 00 00 02 2C 01 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 0F + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 1A + 39 01 00 00 00 00 02 32 01 + 39 00 00 00 00 00 02 33 25 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 35 2F + 39 00 00 00 00 00 02 36 01 + 39 00 00 00 00 00 02 37 44 + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 5E + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 76 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 8E + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F A6 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 BE + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 D5 + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 EC + 39 00 00 00 00 00 02 46 02 + 39 00 00 00 00 00 02 47 04 + 39 00 00 00 00 00 02 48 02 + 39 00 00 00 00 00 02 49 1D + 39 00 00 00 00 00 02 4A 02 + 39 00 00 00 00 00 02 4B 37 + 39 00 00 00 00 00 02 4C 02 + 39 00 00 00 00 00 02 4D 50 + 39 00 00 00 00 00 02 4E 02 + 39 00 00 00 00 00 02 4F 68 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 81 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 9C + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 B8 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 CF + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 E6 + 39 00 00 00 00 00 02 5A 02 + 39 01 00 00 00 00 02 5B FF + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 0C + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 11 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 17 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 1B + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 1F + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 33 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 42 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 4F + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 59 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 64 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 6E + 39 00 00 00 00 00 02 1C 00 + 39 00 00 00 00 00 02 1D 79 + 39 00 00 00 00 00 02 1E 00 + 39 00 00 00 00 00 02 1F 82 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 8B + 39 00 00 00 00 00 02 22 00 + 39 00 00 00 00 00 02 23 95 + 39 00 00 00 00 00 02 24 00 + 39 00 00 00 00 00 02 25 9F + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 A9 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 B3 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B BB + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D C4 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F CC + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 D7 + 39 01 00 00 00 00 02 32 00 + 39 00 00 00 00 00 02 33 E0 + 39 00 00 00 00 00 02 34 00 + 39 00 00 00 00 00 02 35 EB + 39 00 00 00 00 00 02 36 00 + 39 00 00 00 00 00 02 37 FE + 39 00 00 00 00 00 02 38 01 + 39 00 00 00 00 00 02 39 10 + 39 00 00 00 00 00 02 3A 01 + 39 00 00 00 00 00 02 3B 21 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 31 + 39 00 00 00 00 00 02 3E 01 + 39 00 00 00 00 00 02 3F 42 + 39 00 00 00 00 00 02 40 01 + 39 00 00 00 00 00 02 41 55 + 39 00 00 00 00 00 02 42 01 + 39 00 00 00 00 00 02 43 6A + 39 00 00 00 00 00 02 44 01 + 39 00 00 00 00 00 02 45 7D + 39 00 00 00 00 00 02 46 01 + 39 00 00 00 00 00 02 47 90 + 39 00 00 00 00 00 02 48 01 + 39 00 00 00 00 00 02 49 A2 + 39 00 00 00 00 00 02 4A 01 + 39 00 00 00 00 00 02 4B B4 + 39 00 00 00 00 00 02 4C 01 + 39 00 00 00 00 00 02 4D C7 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F D9 + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 51 EB + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 53 FE + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 11 + 39 00 00 00 00 00 02 56 02 + 39 00 00 00 00 00 02 57 24 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 39 + 39 00 00 00 00 00 02 5A 02 + 39 00 00 00 00 00 02 5B 4B + 39 00 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 46 18 20 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1c>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-pwm-gpio = <&pm8937_mpps 4 0>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-tianma-c3b-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-tianma-c3b-720p-video.dtsi new file mode 100644 index 0000000000000..a538d8f776e99 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-ili9881c-tianma-c3b-720p-video.dtsi @@ -0,0 +1,18892 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_ili9881c_tianma_720p_video: qcom,mdss_dsi_ili9881c_tianma_c3b_720p_video { + qcom,mdss-dsi-panel-name = "ili9881c_HD720p_video_tianma_c3b"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-model = "TIANMA HD ILI9881C VIDEO PANEL"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <112>; + qcom,mdss-dsi-h-back-porch = <160>; + qcom,mdss-dsi-h-pulse-width = <8>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <18>; + qcom,mdss-dsi-v-front-porch = <40>; + qcom,mdss-dsi-v-pulse-width = <4>; + + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <0>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0xff>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [39 01 00 00 00 00 04 FF 98 81 00 + 39 01 00 00 78 00 02 11 00 + 39 01 00 00 0A 00 02 29 00 + 39 01 00 00 00 00 04 FF 98 81 04 + 39 01 00 00 00 00 02 92 0F + 39 01 00 00 00 00 02 21 B0 + 39 01 00 00 00 00 04 FF 98 81 05 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 7F 81 + 39 01 00 00 00 00 04 FF 98 81 06 + 39 01 00 00 00 00 02 00 81 + 39 01 00 00 00 00 02 7F 83 + 39 01 00 00 00 00 04 FF 98 81 07 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 7F 89 + 39 01 00 00 00 00 04 FF 98 81 08 + 39 01 00 00 00 00 02 00 89 + 39 01 00 00 00 00 02 7F 93 + 39 01 00 00 00 00 04 FF 98 81 09 + 39 01 00 00 00 00 02 00 00 + 39 01 00 00 00 00 02 7F 93 + 39 01 00 00 00 00 04 FF 98 81 0A + 39 01 00 00 00 00 02 00 93 + 39 01 00 00 00 00 02 7F b3 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-off-command = [39 00 00 00 00 00 04 FF 98 81 00 + 05 01 00 00 1F 00 02 28 00 + 05 01 00 00 8c 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_lp_mode"; + + + qcom,mdss-dsi-panel-nature-command = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 03 + 39 00 00 00 00 00 02 09 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 03 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 25 04 + 39 00 00 00 00 00 02 26 04 + 39 00 00 00 00 00 02 27 04 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 2B 04 + 39 00 00 00 00 00 02 2C 04 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 30 03 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 32 02 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 34 03 + 39 00 00 00 00 00 02 35 03 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 37 04 + 39 00 00 00 00 00 02 38 04 + 39 00 00 00 00 00 02 39 04 + 39 00 00 00 00 00 02 3A 05 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3D 06 + 39 00 00 00 00 00 02 3E 06 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 48 07 + 39 00 00 00 00 00 02 49 08 + 39 00 00 00 00 00 02 4A 07 + 39 00 00 00 00 00 02 4B 07 + 39 00 00 00 00 00 02 4C 06 + 39 00 00 00 00 00 02 4D 06 + 39 00 00 00 00 00 02 4E 05 + 39 00 00 00 00 00 02 4F 05 + 39 00 00 00 00 00 02 50 05 + 39 00 00 00 00 00 02 51 05 + 39 00 00 00 00 00 02 52 06 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 54 05 + 39 00 00 00 00 00 02 55 05 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 63 03 + 39 00 00 00 00 00 02 64 03 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 68 02 + 39 00 00 00 00 00 02 69 02 + 39 00 00 00 00 00 02 6A 02 + 39 00 00 00 00 00 02 6B 02 + 39 00 00 00 00 00 02 6C 02 + 39 00 00 00 00 00 02 6D 02 + 39 00 00 00 00 00 02 6E 02 + 39 00 00 00 00 00 02 6F 01 + 39 00 00 00 00 00 02 70 01 + 39 00 00 00 00 00 02 71 01 + 39 00 00 00 00 00 02 72 01 + 39 00 00 00 00 00 02 73 00 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 75 00 + 39 00 00 00 00 00 02 76 00 + 39 00 00 00 00 00 02 77 81 + 39 00 00 00 00 00 02 78 81 + 39 00 00 00 00 00 02 79 81 + 39 00 00 00 00 00 02 7A 81 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7E 82 + 39 00 00 00 00 00 02 7F 82 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 11 83 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1C 83 + 39 00 00 00 00 00 02 1D 83 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 23 83 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 28 85 + 39 00 00 00 00 00 02 29 85 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2F 85 + 39 00 00 00 00 00 02 30 86 + 39 00 00 00 00 00 02 31 86 + 39 00 00 00 00 00 02 32 87 + 39 00 00 00 00 00 02 33 87 + 39 00 00 00 00 00 02 34 88 + 39 00 00 00 00 00 02 35 89 + 39 00 00 00 00 00 02 36 88 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 38 87 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 42 85 + 39 00 00 00 00 00 02 43 85 + 39 00 00 00 00 00 02 44 85 + 39 00 00 00 00 00 02 45 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4C 86 + 39 00 00 00 00 00 02 4D 86 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4F 87 + 39 00 00 00 00 00 02 50 88 + 39 00 00 00 00 00 02 51 88 + 39 00 00 00 00 00 02 52 89 + 39 00 00 00 00 00 02 53 89 + 39 00 00 00 00 00 02 54 89 + 39 00 00 00 00 00 02 55 89 + 39 00 00 00 00 00 02 56 89 + 39 00 00 00 00 00 02 57 89 + 39 00 00 00 00 00 02 58 89 + 39 00 00 00 00 00 02 59 89 + 39 00 00 00 00 00 02 5A 89 + 39 00 00 00 00 00 02 5B 89 + 39 00 00 00 00 00 02 5C 89 + 39 00 00 00 00 00 02 5D 89 + 39 00 00 00 00 00 02 5E 8A + 39 00 00 00 00 00 02 5F 8A + 39 00 00 00 00 00 02 60 8A + 39 00 00 00 00 00 02 61 8A + 39 00 00 00 00 00 02 62 8B + 39 00 00 00 00 00 02 63 8B + 39 00 00 00 00 00 02 64 8B + 39 00 00 00 00 00 02 65 8B + 39 00 00 00 00 00 02 66 8B + 39 00 00 00 00 00 02 67 8C + 39 00 00 00 00 00 02 68 8C + 39 00 00 00 00 00 02 69 8C + 39 00 00 00 00 00 02 6A 8C + 39 00 00 00 00 00 02 6B 8D + 39 00 00 00 00 00 02 6C 8D + 39 00 00 00 00 00 02 6D 8D + 39 00 00 00 00 00 02 6E 8D + 39 00 00 00 00 00 02 6F 8E + 39 00 00 00 00 00 02 70 8D + 39 00 00 00 00 00 02 71 8D + 39 00 00 00 00 00 02 72 8E + 39 00 00 00 00 00 02 73 8E + 39 00 00 00 00 00 02 74 8F + 39 00 00 00 00 00 02 75 8F + 39 00 00 00 00 00 02 76 8F + 39 00 00 00 00 00 02 77 90 + 39 00 00 00 00 00 02 78 90 + 39 00 00 00 00 00 02 79 90 + 39 00 00 00 00 00 02 7A 90 + 39 00 00 00 00 00 02 7B 91 + 39 00 00 00 00 00 02 7C 91 + 39 00 00 00 00 00 02 7D 91 + 39 00 00 00 00 00 02 7E 91 + 39 00 00 00 00 00 02 7F 92 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1C 81 + 39 00 00 00 00 00 02 1D 81 + 39 00 00 00 00 00 02 1E 81 + 39 00 00 00 00 00 02 1F 81 + 39 00 00 00 00 00 02 20 82 + 39 00 00 00 00 00 02 21 82 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 23 81 + 39 00 00 00 00 00 02 24 81 + 39 00 00 00 00 00 02 25 82 + 39 00 00 00 00 00 02 26 82 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2E 83 + 39 00 00 00 00 00 02 2F 83 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 31 84 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 3B 84 + 39 00 00 00 00 00 02 3C 84 + 39 00 00 00 00 00 02 3D 83 + 39 00 00 00 00 00 02 3E 83 + 39 00 00 00 00 00 02 3F 83 + 39 00 00 00 00 00 02 40 83 + 39 00 00 00 00 00 02 41 83 + 39 00 00 00 00 00 02 42 82 + 39 00 00 00 00 00 02 43 82 + 39 00 00 00 00 00 02 44 82 + 39 00 00 00 00 00 02 45 82 + 39 00 00 00 00 00 02 46 82 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 48 83 + 39 00 00 00 00 00 02 49 83 + 39 00 00 00 00 00 02 4A 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 50 85 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 57 86 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5C 86 + 39 00 00 00 00 00 02 5D 86 + 39 00 00 00 00 00 02 5E 87 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 60 87 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 62 88 + 39 00 00 00 00 00 02 63 88 + 39 00 00 00 00 00 02 64 88 + 39 00 00 00 00 00 02 65 88 + 39 00 00 00 00 00 02 66 88 + 39 00 00 00 00 00 02 67 89 + 39 00 00 00 00 00 02 68 89 + 39 00 00 00 00 00 02 69 89 + 39 00 00 00 00 00 02 6A 89 + 39 00 00 00 00 00 02 6B 8A + 39 00 00 00 00 00 02 6C 8A + 39 00 00 00 00 00 02 6D 8A + 39 00 00 00 00 00 02 6E 8A + 39 00 00 00 00 00 02 6F 8A + 39 00 00 00 00 00 02 70 8A + 39 00 00 00 00 00 02 71 8B + 39 00 00 00 00 00 02 72 8B + 39 00 00 00 00 00 02 73 8C + 39 00 00 00 00 00 02 74 8C + 39 00 00 00 00 00 02 75 8C + 39 00 00 00 00 00 02 76 8D + 39 00 00 00 00 00 02 77 8D + 39 00 00 00 00 00 02 78 8D + 39 00 00 00 00 00 02 79 8D + 39 00 00 00 00 00 02 7A 8E + 39 00 00 00 00 00 02 7B 8E + 39 00 00 00 00 00 02 7C 8E + 39 00 00 00 00 00 02 7D 8E + 39 00 00 00 00 00 02 7E 8F + 39 00 00 00 00 00 02 7F 8F + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 83 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 17 84 + 39 00 00 00 00 00 02 18 84 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 1B 85 + 39 00 00 00 00 00 02 1C 85 + 39 00 00 00 00 00 02 1D 85 + 39 00 00 00 00 00 02 1E 85 + 39 00 00 00 00 00 02 1F 85 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 21 86 + 39 00 00 00 00 00 02 22 86 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 25 86 + 39 00 00 00 00 00 02 26 86 + 39 00 00 00 00 00 02 27 86 + 39 00 00 00 00 00 02 28 86 + 39 00 00 00 00 00 02 29 86 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2F 84 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 31 85 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 37 87 + 39 00 00 00 00 00 02 38 88 + 39 00 00 00 00 00 02 39 88 + 39 00 00 00 00 00 02 3A 88 + 39 00 00 00 00 00 02 3B 88 + 39 00 00 00 00 00 02 3C 89 + 39 00 00 00 00 00 02 3D 89 + 39 00 00 00 00 00 02 3E 89 + 39 00 00 00 00 00 02 3F 89 + 39 00 00 00 00 00 02 40 89 + 39 00 00 00 00 00 02 41 89 + 39 00 00 00 00 00 02 42 89 + 39 00 00 00 00 00 02 43 89 + 39 00 00 00 00 00 02 44 89 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 47 88 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 50 87 + 39 00 00 00 00 00 02 51 87 + 39 00 00 00 00 00 02 52 88 + 39 00 00 00 00 00 02 53 88 + 39 00 00 00 00 00 02 54 88 + 39 00 00 00 00 00 02 55 88 + 39 00 00 00 00 00 02 56 88 + 39 00 00 00 00 00 02 57 88 + 39 00 00 00 00 00 02 58 88 + 39 00 00 00 00 00 02 59 88 + 39 00 00 00 00 00 02 5A 88 + 39 00 00 00 00 00 02 5B 88 + 39 00 00 00 00 00 02 5C 87 + 39 00 00 00 00 00 02 5D 87 + 39 00 00 00 00 00 02 5E 88 + 39 00 00 00 00 00 02 5F 88 + 39 00 00 00 00 00 02 60 88 + 39 00 00 00 00 00 02 61 89 + 39 00 00 00 00 00 02 62 89 + 39 00 00 00 00 00 02 63 89 + 39 00 00 00 00 00 02 64 89 + 39 00 00 00 00 00 02 65 89 + 39 00 00 00 00 00 02 66 88 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 68 88 + 39 00 00 00 00 00 02 69 87 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 6B 88 + 39 00 00 00 00 00 02 6C 88 + 39 00 00 00 00 00 02 6D 88 + 39 00 00 00 00 00 02 6E 88 + 39 00 00 00 00 00 02 6F 88 + 39 00 00 00 00 00 02 70 88 + 39 00 00 00 00 00 02 71 87 + 39 00 00 00 00 00 02 72 87 + 39 00 00 00 00 00 02 73 87 + 39 00 00 00 00 00 02 74 87 + 39 00 00 00 00 00 02 75 87 + 39 00 00 00 00 00 02 76 87 + 39 00 00 00 00 00 02 77 87 + 39 00 00 00 00 00 02 78 87 + 39 00 00 00 00 00 02 79 87 + 39 00 00 00 00 00 02 7A 87 + 39 00 00 00 00 00 02 7B 87 + 39 00 00 00 00 00 02 7C 86 + 39 00 00 00 00 00 02 7D 86 + 39 00 00 00 00 00 02 7E 87 + 39 00 00 00 00 00 02 7F 87 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 92 + 39 00 00 00 00 00 02 02 92 + 39 00 00 00 00 00 02 03 92 + 39 00 00 00 00 00 02 04 92 + 39 00 00 00 00 00 02 05 92 + 39 00 00 00 00 00 02 06 93 + 39 00 00 00 00 00 02 07 93 + 39 00 00 00 00 00 02 08 93 + 39 00 00 00 00 00 02 09 93 + 39 00 00 00 00 00 02 0A 93 + 39 00 00 00 00 00 02 0B 93 + 39 00 00 00 00 00 02 0C 93 + 39 00 00 00 00 00 02 0D 93 + 39 00 00 00 00 00 02 0E 93 + 39 00 00 00 00 00 02 0F 93 + 39 00 00 00 00 00 02 10 93 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 12 92 + 39 00 00 00 00 00 02 13 93 + 39 00 00 00 00 00 02 14 92 + 39 00 00 00 00 00 02 15 93 + 39 00 00 00 00 00 02 16 93 + 39 00 00 00 00 00 02 17 93 + 39 00 00 00 00 00 02 18 94 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 1A 95 + 39 00 00 00 00 00 02 1B 95 + 39 00 00 00 00 00 02 1C 95 + 39 00 00 00 00 00 02 1D 96 + 39 00 00 00 00 00 02 1E 96 + 39 00 00 00 00 00 02 1F 96 + 39 00 00 00 00 00 02 20 96 + 39 00 00 00 00 00 02 21 97 + 39 00 00 00 00 00 02 22 97 + 39 00 00 00 00 00 02 23 97 + 39 00 00 00 00 00 02 24 97 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 26 98 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 28 98 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 2A 97 + 39 00 00 00 00 00 02 2B 97 + 39 00 00 00 00 00 02 2C 98 + 39 00 00 00 00 00 02 2D 98 + 39 00 00 00 00 00 02 2E 98 + 39 00 00 00 00 00 02 2F 97 + 39 00 00 00 00 00 02 30 97 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 32 97 + 39 00 00 00 00 00 02 33 97 + 39 00 00 00 00 00 02 34 96 + 39 00 00 00 00 00 02 35 96 + 39 00 00 00 00 00 02 36 97 + 39 00 00 00 00 00 02 37 97 + 39 00 00 00 00 00 02 38 98 + 39 00 00 00 00 00 02 39 99 + 39 00 00 00 00 00 02 3A 99 + 39 00 00 00 00 00 02 3B 99 + 39 00 00 00 00 00 02 3C 9A + 39 00 00 00 00 00 02 3D 9A + 39 00 00 00 00 00 02 3E 9B + 39 00 00 00 00 00 02 3F 9B + 39 00 00 00 00 00 02 40 9B + 39 00 00 00 00 00 02 41 9B + 39 00 00 00 00 00 02 42 9B + 39 00 00 00 00 00 02 43 9C + 39 00 00 00 00 00 02 44 9C + 39 00 00 00 00 00 02 45 9C + 39 00 00 00 00 00 02 46 9C + 39 00 00 00 00 00 02 47 9C + 39 00 00 00 00 00 02 48 9C + 39 00 00 00 00 00 02 49 9B + 39 00 00 00 00 00 02 4A 9B + 39 00 00 00 00 00 02 4B 9B + 39 00 00 00 00 00 02 4C 9A + 39 00 00 00 00 00 02 4D 9A + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4F 99 + 39 00 00 00 00 00 02 50 99 + 39 00 00 00 00 00 02 51 98 + 39 00 00 00 00 00 02 52 99 + 39 00 00 00 00 00 02 53 99 + 39 00 00 00 00 00 02 54 9A + 39 00 00 00 00 00 02 55 9B + 39 00 00 00 00 00 02 56 9B + 39 00 00 00 00 00 02 57 9B + 39 00 00 00 00 00 02 58 9C + 39 00 00 00 00 00 02 59 9C + 39 00 00 00 00 00 02 5A 9C + 39 00 00 00 00 00 02 5B 9C + 39 00 00 00 00 00 02 5C 9C + 39 00 00 00 00 00 02 5D 9D + 39 00 00 00 00 00 02 5E 9C + 39 00 00 00 00 00 02 5F 9C + 39 00 00 00 00 00 02 60 9C + 39 00 00 00 00 00 02 61 9C + 39 00 00 00 00 00 02 62 9C + 39 00 00 00 00 00 02 63 9C + 39 00 00 00 00 00 02 64 9D + 39 00 00 00 00 00 02 65 9D + 39 00 00 00 00 00 02 66 9D + 39 00 00 00 00 00 02 67 9E + 39 00 00 00 00 00 02 68 9E + 39 00 00 00 00 00 02 69 9E + 39 00 00 00 00 00 02 6A 9E + 39 00 00 00 00 00 02 6B 9E + 39 00 00 00 00 00 02 6C 9D + 39 00 00 00 00 00 02 6D 9D + 39 00 00 00 00 00 02 6E 9D + 39 00 00 00 00 00 02 6F 9D + 39 00 00 00 00 00 02 70 9E + 39 00 00 00 00 00 02 71 9E + 39 00 00 00 00 00 02 72 9E + 39 00 00 00 00 00 02 73 9E + 39 00 00 00 00 00 02 74 9E + 39 00 00 00 00 00 02 75 9E + 39 00 00 00 00 00 02 76 9E + 39 00 00 00 00 00 02 77 9D + 39 00 00 00 00 00 02 78 9D + 39 00 00 00 00 00 02 79 9D + 39 00 00 00 00 00 02 7A 9D + 39 00 00 00 00 00 02 7B 9E + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7D 9E + 39 00 00 00 00 00 02 7E 9E + 39 00 00 00 00 00 02 7F 9E + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 90 + 39 00 00 00 00 00 02 02 90 + 39 00 00 00 00 00 02 03 90 + 39 00 00 00 00 00 02 04 90 + 39 00 00 00 00 00 02 05 90 + 39 00 00 00 00 00 02 06 90 + 39 00 00 00 00 00 02 07 91 + 39 00 00 00 00 00 02 08 91 + 39 00 00 00 00 00 02 09 91 + 39 00 00 00 00 00 02 0A 91 + 39 00 00 00 00 00 02 0B 91 + 39 00 00 00 00 00 02 0C 91 + 39 00 00 00 00 00 02 0D 91 + 39 00 00 00 00 00 02 0E 91 + 39 00 00 00 00 00 02 0F 91 + 39 00 00 00 00 00 02 10 91 + 39 00 00 00 00 00 02 11 91 + 39 00 00 00 00 00 02 12 91 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 91 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 92 + 39 00 00 00 00 00 02 17 92 + 39 00 00 00 00 00 02 18 93 + 39 00 00 00 00 00 02 19 93 + 39 00 00 00 00 00 02 1A 94 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1C 94 + 39 00 00 00 00 00 02 1D 95 + 39 00 00 00 00 00 02 1E 95 + 39 00 00 00 00 00 02 1F 95 + 39 00 00 00 00 00 02 20 96 + 39 00 00 00 00 00 02 21 96 + 39 00 00 00 00 00 02 22 96 + 39 00 00 00 00 00 02 23 97 + 39 00 00 00 00 00 02 24 97 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 26 97 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 28 98 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 2A 98 + 39 00 00 00 00 00 02 2B 98 + 39 00 00 00 00 00 02 2C 98 + 39 00 00 00 00 00 02 2D 98 + 39 00 00 00 00 00 02 2E 98 + 39 00 00 00 00 00 02 2F 98 + 39 00 00 00 00 00 02 30 98 + 39 00 00 00 00 00 02 31 98 + 39 00 00 00 00 00 02 32 98 + 39 00 00 00 00 00 02 33 98 + 39 00 00 00 00 00 02 34 98 + 39 00 00 00 00 00 02 35 98 + 39 00 00 00 00 00 02 36 99 + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 38 9A + 39 00 00 00 00 00 02 39 9A + 39 00 00 00 00 00 02 3A 9B + 39 00 00 00 00 00 02 3B 9C + 39 00 00 00 00 00 02 3C 9C + 39 00 00 00 00 00 02 3D 9D + 39 00 00 00 00 00 02 3E 9D + 39 00 00 00 00 00 02 3F 9E + 39 00 00 00 00 00 02 40 9E + 39 00 00 00 00 00 02 41 9E + 39 00 00 00 00 00 02 42 9F + 39 00 00 00 00 00 02 43 9F + 39 00 00 00 00 00 02 44 9F + 39 00 00 00 00 00 02 45 A0 + 39 00 00 00 00 00 02 46 A0 + 39 00 00 00 00 00 02 47 A0 + 39 00 00 00 00 00 02 48 A0 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 4A A0 + 39 00 00 00 00 00 02 4B A0 + 39 00 00 00 00 00 02 4C A0 + 39 00 00 00 00 00 02 4D A0 + 39 00 00 00 00 00 02 4E A0 + 39 00 00 00 00 00 02 4F A0 + 39 00 00 00 00 00 02 50 A0 + 39 00 00 00 00 00 02 51 A0 + 39 00 00 00 00 00 02 52 9F + 39 00 00 00 00 00 02 53 9F + 39 00 00 00 00 00 02 54 A0 + 39 00 00 00 00 00 02 55 A1 + 39 00 00 00 00 00 02 56 A1 + 39 00 00 00 00 00 02 57 A2 + 39 00 00 00 00 00 02 58 A3 + 39 00 00 00 00 00 02 59 A4 + 39 00 00 00 00 00 02 5A A4 + 39 00 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 02 5C A5 + 39 00 00 00 00 00 02 5D A5 + 39 00 00 00 00 00 02 5E A6 + 39 00 00 00 00 00 02 5F A6 + 39 00 00 00 00 00 02 60 A6 + 39 00 00 00 00 00 02 61 A7 + 39 00 00 00 00 00 02 62 A7 + 39 00 00 00 00 00 02 63 A7 + 39 00 00 00 00 00 02 64 A7 + 39 00 00 00 00 00 02 65 A7 + 39 00 00 00 00 00 02 66 A8 + 39 00 00 00 00 00 02 67 A9 + 39 00 00 00 00 00 02 68 AA + 39 00 00 00 00 00 02 69 AA + 39 00 00 00 00 00 02 6A AB + 39 00 00 00 00 00 02 6B AB + 39 00 00 00 00 00 02 6C AC + 39 00 00 00 00 00 02 6D AC + 39 00 00 00 00 00 02 6E AD + 39 00 00 00 00 00 02 6F AD + 39 00 00 00 00 00 02 70 AD + 39 00 00 00 00 00 02 71 AD + 39 00 00 00 00 00 02 72 AD + 39 00 00 00 00 00 02 73 AE + 39 00 00 00 00 00 02 74 AF + 39 00 00 00 00 00 02 75 B0 + 39 00 00 00 00 00 02 76 B0 + 39 00 00 00 00 00 02 77 B1 + 39 00 00 00 00 00 02 78 B2 + 39 00 00 00 00 00 02 79 B2 + 39 00 00 00 00 00 02 7A B3 + 39 00 00 00 00 00 02 7B B3 + 39 00 00 00 00 00 02 7C B3 + 39 00 00 00 00 00 02 7D B4 + 39 00 00 00 00 00 02 7E B5 + 39 00 00 00 00 00 02 7F B5 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 82 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 82 + 39 00 00 00 00 00 02 7F 87 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 92 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 92 + 39 00 00 00 00 00 02 7F 9E + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 8F + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 8F + 39 00 00 00 00 00 02 7F B5 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F B5 + 39 00 00 00 00 00 02 7E B5 + 39 00 00 00 00 00 02 7D B4 + 39 00 00 00 00 00 02 7C B3 + 39 00 00 00 00 00 02 7B B3 + 39 00 00 00 00 00 02 7A B3 + 39 00 00 00 00 00 02 79 B2 + 39 00 00 00 00 00 02 78 B2 + 39 00 00 00 00 00 02 77 B1 + 39 00 00 00 00 00 02 76 B0 + 39 00 00 00 00 00 02 75 B0 + 39 00 00 00 00 00 02 74 AF + 39 00 00 00 00 00 02 73 AE + 39 00 00 00 00 00 02 72 AD + 39 00 00 00 00 00 02 71 AD + 39 00 00 00 00 00 02 70 AD + 39 00 00 00 00 00 02 6F AD + 39 00 00 00 00 00 02 6E AD + 39 00 00 00 00 00 02 6D AC + 39 00 00 00 00 00 02 6C AC + 39 00 00 00 00 00 02 6B AB + 39 00 00 00 00 00 02 6A AB + 39 00 00 00 00 00 02 69 AA + 39 00 00 00 00 00 02 68 AA + 39 00 00 00 00 00 02 67 A9 + 39 00 00 00 00 00 02 66 A8 + 39 00 00 00 00 00 02 65 A7 + 39 00 00 00 00 00 02 64 A7 + 39 00 00 00 00 00 02 63 A7 + 39 00 00 00 00 00 02 62 A7 + 39 00 00 00 00 00 02 61 A7 + 39 00 00 00 00 00 02 60 A6 + 39 00 00 00 00 00 02 5F A6 + 39 00 00 00 00 00 02 5E A6 + 39 00 00 00 00 00 02 5D A5 + 39 00 00 00 00 00 02 5C A5 + 39 00 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 02 5A A4 + 39 00 00 00 00 00 02 59 A4 + 39 00 00 00 00 00 02 58 A3 + 39 00 00 00 00 00 02 57 A2 + 39 00 00 00 00 00 02 56 A1 + 39 00 00 00 00 00 02 55 A1 + 39 00 00 00 00 00 02 54 A0 + 39 00 00 00 00 00 02 53 9F + 39 00 00 00 00 00 02 52 9F + 39 00 00 00 00 00 02 51 A0 + 39 00 00 00 00 00 02 50 A0 + 39 00 00 00 00 00 02 4F A0 + 39 00 00 00 00 00 02 4E A0 + 39 00 00 00 00 00 02 4D A0 + 39 00 00 00 00 00 02 4C A0 + 39 00 00 00 00 00 02 4B A0 + 39 00 00 00 00 00 02 4A A0 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 48 A0 + 39 00 00 00 00 00 02 47 A0 + 39 00 00 00 00 00 02 46 A0 + 39 00 00 00 00 00 02 45 A0 + 39 00 00 00 00 00 02 44 9F + 39 00 00 00 00 00 02 43 9F + 39 00 00 00 00 00 02 42 9F + 39 00 00 00 00 00 02 41 9E + 39 00 00 00 00 00 02 40 9E + 39 00 00 00 00 00 02 3F 9E + 39 00 00 00 00 00 02 3E 9D + 39 00 00 00 00 00 02 3D 9D + 39 00 00 00 00 00 02 3C 9C + 39 00 00 00 00 00 02 3B 9C + 39 00 00 00 00 00 02 3A 9B + 39 00 00 00 00 00 02 39 9A + 39 00 00 00 00 00 02 38 9A + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 36 99 + 39 00 00 00 00 00 02 35 98 + 39 00 00 00 00 00 02 34 98 + 39 00 00 00 00 00 02 33 98 + 39 00 00 00 00 00 02 32 98 + 39 00 00 00 00 00 02 31 98 + 39 00 00 00 00 00 02 30 98 + 39 00 00 00 00 00 02 2F 98 + 39 00 00 00 00 00 02 2E 98 + 39 00 00 00 00 00 02 2D 98 + 39 00 00 00 00 00 02 2C 98 + 39 00 00 00 00 00 02 2B 98 + 39 00 00 00 00 00 02 2A 98 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 28 98 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 26 97 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 24 97 + 39 00 00 00 00 00 02 23 97 + 39 00 00 00 00 00 02 22 96 + 39 00 00 00 00 00 02 21 96 + 39 00 00 00 00 00 02 20 96 + 39 00 00 00 00 00 02 1F 95 + 39 00 00 00 00 00 02 1E 95 + 39 00 00 00 00 00 02 1D 95 + 39 00 00 00 00 00 02 1C 94 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1A 94 + 39 00 00 00 00 00 02 19 93 + 39 00 00 00 00 00 02 18 93 + 39 00 00 00 00 00 02 17 92 + 39 00 00 00 00 00 02 16 92 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 14 91 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 12 91 + 39 00 00 00 00 00 02 11 91 + 39 00 00 00 00 00 02 10 91 + 39 00 00 00 00 00 02 0F 91 + 39 00 00 00 00 00 02 0E 91 + 39 00 00 00 00 00 02 0D 91 + 39 00 00 00 00 00 02 0C 91 + 39 00 00 00 00 00 02 0B 91 + 39 00 00 00 00 00 02 0A 91 + 39 00 00 00 00 00 02 09 91 + 39 00 00 00 00 00 02 08 91 + 39 00 00 00 00 00 02 07 91 + 39 00 00 00 00 00 02 06 90 + 39 00 00 00 00 00 02 05 90 + 39 00 00 00 00 00 02 04 90 + 39 00 00 00 00 00 02 03 90 + 39 00 00 00 00 00 02 02 90 + 39 00 00 00 00 00 02 01 90 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 87 + 39 00 00 00 00 00 02 7E 87 + 39 00 00 00 00 00 02 7D 86 + 39 00 00 00 00 00 02 7C 86 + 39 00 00 00 00 00 02 7B 87 + 39 00 00 00 00 00 02 7A 87 + 39 00 00 00 00 00 02 79 87 + 39 00 00 00 00 00 02 78 87 + 39 00 00 00 00 00 02 77 87 + 39 00 00 00 00 00 02 76 87 + 39 00 00 00 00 00 02 75 87 + 39 00 00 00 00 00 02 74 87 + 39 00 00 00 00 00 02 73 87 + 39 00 00 00 00 00 02 72 87 + 39 00 00 00 00 00 02 71 87 + 39 00 00 00 00 00 02 70 88 + 39 00 00 00 00 00 02 6F 88 + 39 00 00 00 00 00 02 6E 88 + 39 00 00 00 00 00 02 6D 88 + 39 00 00 00 00 00 02 6C 88 + 39 00 00 00 00 00 02 6B 88 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 69 87 + 39 00 00 00 00 00 02 68 88 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 66 88 + 39 00 00 00 00 00 02 65 89 + 39 00 00 00 00 00 02 64 89 + 39 00 00 00 00 00 02 63 89 + 39 00 00 00 00 00 02 62 89 + 39 00 00 00 00 00 02 61 89 + 39 00 00 00 00 00 02 60 88 + 39 00 00 00 00 00 02 5F 88 + 39 00 00 00 00 00 02 5E 88 + 39 00 00 00 00 00 02 5D 87 + 39 00 00 00 00 00 02 5C 87 + 39 00 00 00 00 00 02 5B 88 + 39 00 00 00 00 00 02 5A 88 + 39 00 00 00 00 00 02 59 88 + 39 00 00 00 00 00 02 58 88 + 39 00 00 00 00 00 02 57 88 + 39 00 00 00 00 00 02 56 88 + 39 00 00 00 00 00 02 55 88 + 39 00 00 00 00 00 02 54 88 + 39 00 00 00 00 00 02 53 88 + 39 00 00 00 00 00 02 52 88 + 39 00 00 00 00 00 02 51 87 + 39 00 00 00 00 00 02 50 87 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 47 88 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 44 89 + 39 00 00 00 00 00 02 43 89 + 39 00 00 00 00 00 02 42 89 + 39 00 00 00 00 00 02 41 89 + 39 00 00 00 00 00 02 40 89 + 39 00 00 00 00 00 02 3F 89 + 39 00 00 00 00 00 02 3E 89 + 39 00 00 00 00 00 02 3D 89 + 39 00 00 00 00 00 02 3C 89 + 39 00 00 00 00 00 02 3B 88 + 39 00 00 00 00 00 02 3A 88 + 39 00 00 00 00 00 02 39 88 + 39 00 00 00 00 00 02 38 88 + 39 00 00 00 00 00 02 37 87 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 31 85 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 2F 84 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 29 86 + 39 00 00 00 00 00 02 28 86 + 39 00 00 00 00 00 02 27 86 + 39 00 00 00 00 00 02 26 86 + 39 00 00 00 00 00 02 25 86 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 22 86 + 39 00 00 00 00 00 02 21 86 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 1F 85 + 39 00 00 00 00 00 02 1E 85 + 39 00 00 00 00 00 02 1D 85 + 39 00 00 00 00 00 02 1C 85 + 39 00 00 00 00 00 02 1B 85 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 18 84 + 39 00 00 00 00 00 02 17 84 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 14 83 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F 9E + 39 00 00 00 00 00 02 7E 9E + 39 00 00 00 00 00 02 7D 9E + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7B 9E + 39 00 00 00 00 00 02 7A 9D + 39 00 00 00 00 00 02 79 9D + 39 00 00 00 00 00 02 78 9D + 39 00 00 00 00 00 02 77 9D + 39 00 00 00 00 00 02 76 9E + 39 00 00 00 00 00 02 75 9E + 39 00 00 00 00 00 02 74 9E + 39 00 00 00 00 00 02 73 9E + 39 00 00 00 00 00 02 72 9E + 39 00 00 00 00 00 02 71 9E + 39 00 00 00 00 00 02 70 9E + 39 00 00 00 00 00 02 6F 9D + 39 00 00 00 00 00 02 6E 9D + 39 00 00 00 00 00 02 6D 9D + 39 00 00 00 00 00 02 6C 9D + 39 00 00 00 00 00 02 6B 9E + 39 00 00 00 00 00 02 6A 9E + 39 00 00 00 00 00 02 69 9E + 39 00 00 00 00 00 02 68 9E + 39 00 00 00 00 00 02 67 9E + 39 00 00 00 00 00 02 66 9D + 39 00 00 00 00 00 02 65 9D + 39 00 00 00 00 00 02 64 9D + 39 00 00 00 00 00 02 63 9C + 39 00 00 00 00 00 02 62 9C + 39 00 00 00 00 00 02 61 9C + 39 00 00 00 00 00 02 60 9C + 39 00 00 00 00 00 02 5F 9C + 39 00 00 00 00 00 02 5E 9C + 39 00 00 00 00 00 02 5D 9D + 39 00 00 00 00 00 02 5C 9C + 39 00 00 00 00 00 02 5B 9C + 39 00 00 00 00 00 02 5A 9C + 39 00 00 00 00 00 02 59 9C + 39 00 00 00 00 00 02 58 9C + 39 00 00 00 00 00 02 57 9B + 39 00 00 00 00 00 02 56 9B + 39 00 00 00 00 00 02 55 9B + 39 00 00 00 00 00 02 54 9A + 39 00 00 00 00 00 02 53 99 + 39 00 00 00 00 00 02 52 99 + 39 00 00 00 00 00 02 51 98 + 39 00 00 00 00 00 02 50 99 + 39 00 00 00 00 00 02 4F 99 + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4D 9A + 39 00 00 00 00 00 02 4C 9A + 39 00 00 00 00 00 02 4B 9B + 39 00 00 00 00 00 02 4A 9B + 39 00 00 00 00 00 02 49 9B + 39 00 00 00 00 00 02 48 9C + 39 00 00 00 00 00 02 47 9C + 39 00 00 00 00 00 02 46 9C + 39 00 00 00 00 00 02 45 9C + 39 00 00 00 00 00 02 44 9C + 39 00 00 00 00 00 02 43 9C + 39 00 00 00 00 00 02 42 9B + 39 00 00 00 00 00 02 41 9B + 39 00 00 00 00 00 02 40 9B + 39 00 00 00 00 00 02 3F 9B + 39 00 00 00 00 00 02 3E 9B + 39 00 00 00 00 00 02 3D 9A + 39 00 00 00 00 00 02 3C 9A + 39 00 00 00 00 00 02 3B 99 + 39 00 00 00 00 00 02 3A 99 + 39 00 00 00 00 00 02 39 99 + 39 00 00 00 00 00 02 38 98 + 39 00 00 00 00 00 02 37 97 + 39 00 00 00 00 00 02 36 97 + 39 00 00 00 00 00 02 35 96 + 39 00 00 00 00 00 02 34 96 + 39 00 00 00 00 00 02 33 97 + 39 00 00 00 00 00 02 32 97 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 30 97 + 39 00 00 00 00 00 02 2F 97 + 39 00 00 00 00 00 02 2E 98 + 39 00 00 00 00 00 02 2D 98 + 39 00 00 00 00 00 02 2C 98 + 39 00 00 00 00 00 02 2B 97 + 39 00 00 00 00 00 02 2A 97 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 28 98 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 26 98 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 24 97 + 39 00 00 00 00 00 02 23 97 + 39 00 00 00 00 00 02 22 97 + 39 00 00 00 00 00 02 21 97 + 39 00 00 00 00 00 02 20 96 + 39 00 00 00 00 00 02 1F 96 + 39 00 00 00 00 00 02 1E 96 + 39 00 00 00 00 00 02 1D 96 + 39 00 00 00 00 00 02 1C 95 + 39 00 00 00 00 00 02 1B 95 + 39 00 00 00 00 00 02 1A 95 + 39 00 00 00 00 00 02 19 94 + 39 00 00 00 00 00 02 18 94 + 39 00 00 00 00 00 02 17 93 + 39 00 00 00 00 00 02 16 93 + 39 00 00 00 00 00 02 15 93 + 39 00 00 00 00 00 02 14 92 + 39 00 00 00 00 00 02 13 93 + 39 00 00 00 00 00 02 12 92 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 10 93 + 39 00 00 00 00 00 02 0F 93 + 39 00 00 00 00 00 02 0E 93 + 39 00 00 00 00 00 02 0D 93 + 39 00 00 00 00 00 02 0C 93 + 39 00 00 00 00 00 02 0B 93 + 39 00 00 00 00 00 02 0A 93 + 39 00 00 00 00 00 02 09 93 + 39 00 00 00 00 00 02 08 93 + 39 00 00 00 00 00 02 07 93 + 39 00 00 00 00 00 02 06 93 + 39 00 00 00 00 00 02 05 92 + 39 00 00 00 00 00 02 04 92 + 39 00 00 00 00 00 02 03 92 + 39 00 00 00 00 00 02 02 92 + 39 00 00 00 00 00 02 01 92 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 82 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 82 + 39 00 00 00 00 00 02 7F 87 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 92 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 92 + 39 00 00 00 00 00 02 7F 9E + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 8F + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 8F + 39 00 00 00 00 00 02 7F B5 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 8F + 39 00 00 00 00 00 02 7E 8F + 39 00 00 00 00 00 02 7D 8E + 39 00 00 00 00 00 02 7C 8E + 39 00 00 00 00 00 02 7B 8E + 39 00 00 00 00 00 02 7A 8E + 39 00 00 00 00 00 02 79 8D + 39 00 00 00 00 00 02 78 8D + 39 00 00 00 00 00 02 77 8D + 39 00 00 00 00 00 02 76 8D + 39 00 00 00 00 00 02 75 8C + 39 00 00 00 00 00 02 74 8C + 39 00 00 00 00 00 02 73 8C + 39 00 00 00 00 00 02 72 8B + 39 00 00 00 00 00 02 71 8B + 39 00 00 00 00 00 02 70 8A + 39 00 00 00 00 00 02 6F 8A + 39 00 00 00 00 00 02 6E 8A + 39 00 00 00 00 00 02 6D 8A + 39 00 00 00 00 00 02 6C 8A + 39 00 00 00 00 00 02 6B 8A + 39 00 00 00 00 00 02 6A 89 + 39 00 00 00 00 00 02 69 89 + 39 00 00 00 00 00 02 68 89 + 39 00 00 00 00 00 02 67 89 + 39 00 00 00 00 00 02 66 88 + 39 00 00 00 00 00 02 65 88 + 39 00 00 00 00 00 02 64 88 + 39 00 00 00 00 00 02 63 88 + 39 00 00 00 00 00 02 62 88 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 60 87 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 5E 87 + 39 00 00 00 00 00 02 5D 86 + 39 00 00 00 00 00 02 5C 86 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 57 86 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 50 85 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4A 83 + 39 00 00 00 00 00 02 49 83 + 39 00 00 00 00 00 02 48 83 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 46 82 + 39 00 00 00 00 00 02 45 82 + 39 00 00 00 00 00 02 44 82 + 39 00 00 00 00 00 02 43 82 + 39 00 00 00 00 00 02 42 82 + 39 00 00 00 00 00 02 41 83 + 39 00 00 00 00 00 02 40 83 + 39 00 00 00 00 00 02 3F 83 + 39 00 00 00 00 00 02 3E 83 + 39 00 00 00 00 00 02 3D 83 + 39 00 00 00 00 00 02 3C 84 + 39 00 00 00 00 00 02 3B 84 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 33 85 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 31 84 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 2F 83 + 39 00 00 00 00 00 02 2E 83 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 26 82 + 39 00 00 00 00 00 02 25 82 + 39 00 00 00 00 00 02 24 81 + 39 00 00 00 00 00 02 23 81 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 21 82 + 39 00 00 00 00 00 02 20 82 + 39 00 00 00 00 00 02 1F 81 + 39 00 00 00 00 00 02 1E 81 + 39 00 00 00 00 00 02 1D 81 + 39 00 00 00 00 00 02 1C 81 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 82 + 39 00 00 00 00 00 02 7E 82 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 81 + 39 00 00 00 00 00 02 79 81 + 39 00 00 00 00 00 02 78 81 + 39 00 00 00 00 00 02 77 81 + 39 00 00 00 00 00 02 76 00 + 39 00 00 00 00 00 02 75 00 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 73 00 + 39 00 00 00 00 00 02 72 01 + 39 00 00 00 00 00 02 71 01 + 39 00 00 00 00 00 02 70 01 + 39 00 00 00 00 00 02 6F 01 + 39 00 00 00 00 00 02 6E 02 + 39 00 00 00 00 00 02 6D 02 + 39 00 00 00 00 00 02 6C 02 + 39 00 00 00 00 00 02 6B 02 + 39 00 00 00 00 00 02 6A 02 + 39 00 00 00 00 00 02 69 02 + 39 00 00 00 00 00 02 68 02 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 64 03 + 39 00 00 00 00 00 02 63 03 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 55 05 + 39 00 00 00 00 00 02 54 05 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 52 06 + 39 00 00 00 00 00 02 51 05 + 39 00 00 00 00 00 02 50 05 + 39 00 00 00 00 00 02 4F 05 + 39 00 00 00 00 00 02 4E 05 + 39 00 00 00 00 00 02 4D 06 + 39 00 00 00 00 00 02 4C 06 + 39 00 00 00 00 00 02 4B 07 + 39 00 00 00 00 00 02 4A 07 + 39 00 00 00 00 00 02 49 08 + 39 00 00 00 00 00 02 48 07 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 06 + 39 00 00 00 00 00 02 3D 06 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3A 05 + 39 00 00 00 00 00 02 39 04 + 39 00 00 00 00 00 02 38 04 + 39 00 00 00 00 00 02 37 04 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 35 03 + 39 00 00 00 00 00 02 34 03 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 32 02 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 30 03 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2D 04 + 39 00 00 00 00 00 02 2C 04 + 39 00 00 00 00 00 02 2B 04 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 27 04 + 39 00 00 00 00 00 02 26 04 + 39 00 00 00 00 00 02 25 04 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 03 + 39 00 00 00 00 00 02 08 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F 92 + 39 00 00 00 00 00 02 7E 91 + 39 00 00 00 00 00 02 7D 91 + 39 00 00 00 00 00 02 7C 91 + 39 00 00 00 00 00 02 7B 91 + 39 00 00 00 00 00 02 7A 90 + 39 00 00 00 00 00 02 79 90 + 39 00 00 00 00 00 02 78 90 + 39 00 00 00 00 00 02 77 90 + 39 00 00 00 00 00 02 76 8F + 39 00 00 00 00 00 02 75 8F + 39 00 00 00 00 00 02 74 8F + 39 00 00 00 00 00 02 73 8E + 39 00 00 00 00 00 02 72 8E + 39 00 00 00 00 00 02 71 8D + 39 00 00 00 00 00 02 70 8D + 39 00 00 00 00 00 02 6F 8E + 39 00 00 00 00 00 02 6E 8D + 39 00 00 00 00 00 02 6D 8D + 39 00 00 00 00 00 02 6C 8D + 39 00 00 00 00 00 02 6B 8D + 39 00 00 00 00 00 02 6A 8C + 39 00 00 00 00 00 02 69 8C + 39 00 00 00 00 00 02 68 8C + 39 00 00 00 00 00 02 67 8C + 39 00 00 00 00 00 02 66 8B + 39 00 00 00 00 00 02 65 8B + 39 00 00 00 00 00 02 64 8B + 39 00 00 00 00 00 02 63 8B + 39 00 00 00 00 00 02 62 8B + 39 00 00 00 00 00 02 61 8A + 39 00 00 00 00 00 02 60 8A + 39 00 00 00 00 00 02 5F 8A + 39 00 00 00 00 00 02 5E 8A + 39 00 00 00 00 00 02 5D 89 + 39 00 00 00 00 00 02 5C 89 + 39 00 00 00 00 00 02 5B 89 + 39 00 00 00 00 00 02 5A 89 + 39 00 00 00 00 00 02 59 89 + 39 00 00 00 00 00 02 58 89 + 39 00 00 00 00 00 02 57 89 + 39 00 00 00 00 00 02 56 89 + 39 00 00 00 00 00 02 55 89 + 39 00 00 00 00 00 02 54 89 + 39 00 00 00 00 00 02 53 89 + 39 00 00 00 00 00 02 52 89 + 39 00 00 00 00 00 02 51 88 + 39 00 00 00 00 00 02 50 88 + 39 00 00 00 00 00 02 4F 87 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4D 86 + 39 00 00 00 00 00 02 4C 86 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 45 85 + 39 00 00 00 00 00 02 44 85 + 39 00 00 00 00 00 02 43 85 + 39 00 00 00 00 00 02 42 85 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 38 87 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 36 88 + 39 00 00 00 00 00 02 35 89 + 39 00 00 00 00 00 02 34 88 + 39 00 00 00 00 00 02 33 87 + 39 00 00 00 00 00 02 32 87 + 39 00 00 00 00 00 02 31 86 + 39 00 00 00 00 00 02 30 86 + 39 00 00 00 00 00 02 2F 85 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 29 85 + 39 00 00 00 00 00 02 28 85 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 23 83 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1D 83 + 39 00 00 00 00 00 02 1C 83 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 11 83 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 0F 82 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + + ]; + + + qcom,mdss-dsi-panel-warm-command = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 26 04 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 30 03 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 32 02 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 37 04 + 39 00 00 00 00 00 02 38 04 + 39 00 00 00 00 00 02 39 05 + 39 00 00 00 00 00 02 3A 05 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 47 08 + 39 00 00 00 00 00 02 48 08 + 39 00 00 00 00 00 02 49 08 + 39 00 00 00 00 00 02 4A 08 + 39 00 00 00 00 00 02 4B 07 + 39 00 00 00 00 00 02 4C 07 + 39 00 00 00 00 00 02 4D 06 + 39 00 00 00 00 00 02 4E 06 + 39 00 00 00 00 00 02 4F 06 + 39 00 00 00 00 00 02 50 06 + 39 00 00 00 00 00 02 51 06 + 39 00 00 00 00 00 02 52 06 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 55 06 + 39 00 00 00 00 00 02 56 06 + 39 00 00 00 00 00 02 57 06 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 03 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6E 02 + 39 00 00 00 00 00 02 6F 02 + 39 00 00 00 00 00 02 70 02 + 39 00 00 00 00 00 02 71 02 + 39 00 00 00 00 00 02 72 01 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 76 00 + 39 00 00 00 00 00 02 77 00 + 39 00 00 00 00 00 02 78 00 + 39 00 00 00 00 00 02 79 00 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7F 81 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0F 84 + 39 00 00 00 00 00 02 10 84 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 12 85 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 14 85 + 39 00 00 00 00 00 02 15 85 + 39 00 00 00 00 00 02 16 85 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 86 + 39 00 00 00 00 00 02 19 86 + 39 00 00 00 00 00 02 1A 87 + 39 00 00 00 00 00 02 1B 87 + 39 00 00 00 00 00 02 1C 87 + 39 00 00 00 00 00 02 1D 86 + 39 00 00 00 00 00 02 1E 86 + 39 00 00 00 00 00 02 1F 87 + 39 00 00 00 00 00 02 20 87 + 39 00 00 00 00 00 02 21 87 + 39 00 00 00 00 00 02 22 88 + 39 00 00 00 00 00 02 23 88 + 39 00 00 00 00 00 02 24 87 + 39 00 00 00 00 00 02 25 87 + 39 00 00 00 00 00 02 26 88 + 39 00 00 00 00 00 02 27 89 + 39 00 00 00 00 00 02 28 89 + 39 00 00 00 00 00 02 29 8A + 39 00 00 00 00 00 02 2A 8A + 39 00 00 00 00 00 02 2B 8A + 39 00 00 00 00 00 02 2C 8A + 39 00 00 00 00 00 02 2D 8A + 39 00 00 00 00 00 02 2E 8B + 39 00 00 00 00 00 02 2F 8B + 39 00 00 00 00 00 02 30 8B + 39 00 00 00 00 00 02 31 8C + 39 00 00 00 00 00 02 32 8C + 39 00 00 00 00 00 02 33 8D + 39 00 00 00 00 00 02 34 8D + 39 00 00 00 00 00 02 35 8E + 39 00 00 00 00 00 02 36 8F + 39 00 00 00 00 00 02 37 8F + 39 00 00 00 00 00 02 38 8F + 39 00 00 00 00 00 02 39 8F + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 3B 8F + 39 00 00 00 00 00 02 3C 8F + 39 00 00 00 00 00 02 3D 8F + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3F 8E + 39 00 00 00 00 00 02 40 8E + 39 00 00 00 00 00 02 41 8E + 39 00 00 00 00 00 02 42 8E + 39 00 00 00 00 00 02 43 8E + 39 00 00 00 00 00 02 44 8E + 39 00 00 00 00 00 02 45 8E + 39 00 00 00 00 00 02 46 8E + 39 00 00 00 00 00 02 47 8E + 39 00 00 00 00 00 02 48 8E + 39 00 00 00 00 00 02 49 8E + 39 00 00 00 00 00 02 4A 8F + 39 00 00 00 00 00 02 4B 8F + 39 00 00 00 00 00 02 4C 8F + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4E 90 + 39 00 00 00 00 00 02 4F 8F + 39 00 00 00 00 00 02 50 90 + 39 00 00 00 00 00 02 51 91 + 39 00 00 00 00 00 02 52 91 + 39 00 00 00 00 00 02 53 92 + 39 00 00 00 00 00 02 54 93 + 39 00 00 00 00 00 02 55 93 + 39 00 00 00 00 00 02 56 93 + 39 00 00 00 00 00 02 57 93 + 39 00 00 00 00 00 02 58 93 + 39 00 00 00 00 00 02 59 94 + 39 00 00 00 00 00 02 5A 94 + 39 00 00 00 00 00 02 5B 94 + 39 00 00 00 00 00 02 5C 94 + 39 00 00 00 00 00 02 5D 95 + 39 00 00 00 00 00 02 5E 95 + 39 00 00 00 00 00 02 5F 95 + 39 00 00 00 00 00 02 60 95 + 39 00 00 00 00 00 02 61 96 + 39 00 00 00 00 00 02 62 96 + 39 00 00 00 00 00 02 63 96 + 39 00 00 00 00 00 02 64 97 + 39 00 00 00 00 00 02 65 97 + 39 00 00 00 00 00 02 66 97 + 39 00 00 00 00 00 02 67 98 + 39 00 00 00 00 00 02 68 98 + 39 00 00 00 00 00 02 69 98 + 39 00 00 00 00 00 02 6A 99 + 39 00 00 00 00 00 02 6B 99 + 39 00 00 00 00 00 02 6C 9A + 39 00 00 00 00 00 02 6D 9A + 39 00 00 00 00 00 02 6E 9A + 39 00 00 00 00 00 02 6F 9B + 39 00 00 00 00 00 02 70 9B + 39 00 00 00 00 00 02 71 9B + 39 00 00 00 00 00 02 72 9C + 39 00 00 00 00 00 02 73 9C + 39 00 00 00 00 00 02 74 9B + 39 00 00 00 00 00 02 75 9C + 39 00 00 00 00 00 02 76 9D + 39 00 00 00 00 00 02 77 9D + 39 00 00 00 00 00 02 78 9E + 39 00 00 00 00 00 02 79 9E + 39 00 00 00 00 00 02 7A 9F + 39 00 00 00 00 00 02 7B 9F + 39 00 00 00 00 00 02 7C 9F + 39 00 00 00 00 00 02 7D 9F + 39 00 00 00 00 00 02 7E A0 + 39 00 00 00 00 00 02 7F A0 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0E 85 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 12 87 + 39 00 00 00 00 00 02 13 87 + 39 00 00 00 00 00 02 14 87 + 39 00 00 00 00 00 02 15 87 + 39 00 00 00 00 00 02 16 88 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 88 + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 1A 8A + 39 00 00 00 00 00 02 1B 8A + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1D 8A + 39 00 00 00 00 00 02 1E 8A + 39 00 00 00 00 00 02 1F 8A + 39 00 00 00 00 00 02 20 8A + 39 00 00 00 00 00 02 21 8B + 39 00 00 00 00 00 02 22 8B + 39 00 00 00 00 00 02 23 8C + 39 00 00 00 00 00 02 24 8C + 39 00 00 00 00 00 02 25 8C + 39 00 00 00 00 00 02 26 8B + 39 00 00 00 00 00 02 27 8D + 39 00 00 00 00 00 02 28 8E + 39 00 00 00 00 00 02 29 8E + 39 00 00 00 00 00 02 2A 8F + 39 00 00 00 00 00 02 2B 8F + 39 00 00 00 00 00 02 2C 8F + 39 00 00 00 00 00 02 2D 8F + 39 00 00 00 00 00 02 2E 90 + 39 00 00 00 00 00 02 2F 90 + 39 00 00 00 00 00 02 30 91 + 39 00 00 00 00 00 02 31 91 + 39 00 00 00 00 00 02 32 91 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 34 93 + 39 00 00 00 00 00 02 35 93 + 39 00 00 00 00 00 02 36 94 + 39 00 00 00 00 00 02 37 95 + 39 00 00 00 00 00 02 38 96 + 39 00 00 00 00 00 02 39 96 + 39 00 00 00 00 00 02 3A 96 + 39 00 00 00 00 00 02 3B 96 + 39 00 00 00 00 00 02 3C 96 + 39 00 00 00 00 00 02 3D 96 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3F 96 + 39 00 00 00 00 00 02 40 96 + 39 00 00 00 00 00 02 41 96 + 39 00 00 00 00 00 02 42 96 + 39 00 00 00 00 00 02 43 96 + 39 00 00 00 00 00 02 44 96 + 39 00 00 00 00 00 02 45 96 + 39 00 00 00 00 00 02 46 96 + 39 00 00 00 00 00 02 47 97 + 39 00 00 00 00 00 02 48 97 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 4A 97 + 39 00 00 00 00 00 02 4B 98 + 39 00 00 00 00 00 02 4C 98 + 39 00 00 00 00 00 02 4D 98 + 39 00 00 00 00 00 02 4E 99 + 39 00 00 00 00 00 02 4F 99 + 39 00 00 00 00 00 02 50 9A + 39 00 00 00 00 00 02 51 9A + 39 00 00 00 00 00 02 52 9A + 39 00 00 00 00 00 02 53 9B + 39 00 00 00 00 00 02 54 9C + 39 00 00 00 00 00 02 55 9D + 39 00 00 00 00 00 02 56 9D + 39 00 00 00 00 00 02 57 9E + 39 00 00 00 00 00 02 58 9E + 39 00 00 00 00 00 02 59 9F + 39 00 00 00 00 00 02 5A 9F + 39 00 00 00 00 00 02 5B 9F + 39 00 00 00 00 00 02 5C 9F + 39 00 00 00 00 00 02 5D A0 + 39 00 00 00 00 00 02 5E A0 + 39 00 00 00 00 00 02 5F A1 + 39 00 00 00 00 00 02 60 A1 + 39 00 00 00 00 00 02 61 A2 + 39 00 00 00 00 00 02 62 A2 + 39 00 00 00 00 00 02 63 A2 + 39 00 00 00 00 00 02 64 A3 + 39 00 00 00 00 00 02 65 A3 + 39 00 00 00 00 00 02 66 A4 + 39 00 00 00 00 00 02 67 A4 + 39 00 00 00 00 00 02 68 A5 + 39 00 00 00 00 00 02 69 A5 + 39 00 00 00 00 00 02 6A A6 + 39 00 00 00 00 00 02 6B A6 + 39 00 00 00 00 00 02 6C A7 + 39 00 00 00 00 00 02 6D A7 + 39 00 00 00 00 00 02 6E A8 + 39 00 00 00 00 00 02 6F A8 + 39 00 00 00 00 00 02 70 A9 + 39 00 00 00 00 00 02 71 A9 + 39 00 00 00 00 00 02 72 AA + 39 00 00 00 00 00 02 73 AA + 39 00 00 00 00 00 02 74 AB + 39 00 00 00 00 00 02 75 AB + 39 00 00 00 00 00 02 76 AC + 39 00 00 00 00 00 02 77 AC + 39 00 00 00 00 00 02 78 AC + 39 00 00 00 00 00 02 79 AD + 39 00 00 00 00 00 02 7A AE + 39 00 00 00 00 00 02 7B AE + 39 00 00 00 00 00 02 7C AF + 39 00 00 00 00 00 02 7D AF + 39 00 00 00 00 00 02 7E B0 + 39 00 00 00 00 00 02 7F B1 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 21 85 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 23 85 + 39 00 00 00 00 00 02 24 85 + 39 00 00 00 00 00 02 25 85 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 27 85 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 29 84 + 39 00 00 00 00 00 02 2A 84 + 39 00 00 00 00 00 02 2B 84 + 39 00 00 00 00 00 02 2C 84 + 39 00 00 00 00 00 02 2D 84 + 39 00 00 00 00 00 02 2E 83 + 39 00 00 00 00 00 02 2F 83 + 39 00 00 00 00 00 02 30 83 + 39 00 00 00 00 00 02 31 84 + 39 00 00 00 00 00 02 32 84 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 86 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 38 87 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 46 87 + 39 00 00 00 00 00 02 47 86 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 49 85 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 4B 84 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4D 84 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 58 87 + 39 00 00 00 00 00 02 59 87 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5C 86 + 39 00 00 00 00 00 02 5D 86 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 60 87 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 62 87 + 39 00 00 00 00 00 02 63 87 + 39 00 00 00 00 00 02 64 87 + 39 00 00 00 00 00 02 65 87 + 39 00 00 00 00 00 02 66 87 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 68 86 + 39 00 00 00 00 00 02 69 86 + 39 00 00 00 00 00 02 6A 86 + 39 00 00 00 00 00 02 6B 87 + 39 00 00 00 00 00 02 6C 87 + 39 00 00 00 00 00 02 6D 87 + 39 00 00 00 00 00 02 6E 87 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 77 85 + 39 00 00 00 00 00 02 78 85 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 7A 85 + 39 00 00 00 00 00 02 7B 85 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7F 85 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 A1 + 39 00 00 00 00 00 02 02 A1 + 39 00 00 00 00 00 02 03 A2 + 39 00 00 00 00 00 02 04 A2 + 39 00 00 00 00 00 02 05 A2 + 39 00 00 00 00 00 02 06 A3 + 39 00 00 00 00 00 02 07 A3 + 39 00 00 00 00 00 02 08 A3 + 39 00 00 00 00 00 02 09 A3 + 39 00 00 00 00 00 02 0A A4 + 39 00 00 00 00 00 02 0B A4 + 39 00 00 00 00 00 02 0C A4 + 39 00 00 00 00 00 02 0D A4 + 39 00 00 00 00 00 02 0E A5 + 39 00 00 00 00 00 02 0F A5 + 39 00 00 00 00 00 02 10 A5 + 39 00 00 00 00 00 02 11 A5 + 39 00 00 00 00 00 02 12 A5 + 39 00 00 00 00 00 02 13 A5 + 39 00 00 00 00 00 02 14 A5 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 16 A5 + 39 00 00 00 00 00 02 17 A5 + 39 00 00 00 00 00 02 18 A5 + 39 00 00 00 00 00 02 19 A5 + 39 00 00 00 00 00 02 1A A6 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1C A7 + 39 00 00 00 00 00 02 1D A7 + 39 00 00 00 00 00 02 1E A8 + 39 00 00 00 00 00 02 1F A8 + 39 00 00 00 00 00 02 20 A9 + 39 00 00 00 00 00 02 21 A9 + 39 00 00 00 00 00 02 22 AA + 39 00 00 00 00 00 02 23 AA + 39 00 00 00 00 00 02 24 AA + 39 00 00 00 00 00 02 25 AB + 39 00 00 00 00 00 02 26 AB + 39 00 00 00 00 00 02 27 AC + 39 00 00 00 00 00 02 28 AC + 39 00 00 00 00 00 02 29 AC + 39 00 00 00 00 00 02 2A AC + 39 00 00 00 00 00 02 2B AD + 39 00 00 00 00 00 02 2C AD + 39 00 00 00 00 00 02 2D AE + 39 00 00 00 00 00 02 2E AD + 39 00 00 00 00 00 02 2F AD + 39 00 00 00 00 00 02 30 AD + 39 00 00 00 00 00 02 31 AD + 39 00 00 00 00 00 02 32 AE + 39 00 00 00 00 00 02 33 AE + 39 00 00 00 00 00 02 34 AE + 39 00 00 00 00 00 02 35 AE + 39 00 00 00 00 00 02 36 AE + 39 00 00 00 00 00 02 37 AE + 39 00 00 00 00 00 02 38 AE + 39 00 00 00 00 00 02 39 AD + 39 00 00 00 00 00 02 3A AD + 39 00 00 00 00 00 02 3B AE + 39 00 00 00 00 00 02 3C AE + 39 00 00 00 00 00 02 3D AF + 39 00 00 00 00 00 02 3E B0 + 39 00 00 00 00 00 02 3F B0 + 39 00 00 00 00 00 02 40 B1 + 39 00 00 00 00 00 02 41 B1 + 39 00 00 00 00 00 02 42 B2 + 39 00 00 00 00 00 02 43 B3 + 39 00 00 00 00 00 02 44 B3 + 39 00 00 00 00 00 02 45 B3 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 47 B4 + 39 00 00 00 00 00 02 48 B4 + 39 00 00 00 00 00 02 49 B4 + 39 00 00 00 00 00 02 4A B5 + 39 00 00 00 00 00 02 4B B5 + 39 00 00 00 00 00 02 4C B5 + 39 00 00 00 00 00 02 4D B5 + 39 00 00 00 00 00 02 4E B5 + 39 00 00 00 00 00 02 4F B5 + 39 00 00 00 00 00 02 50 B5 + 39 00 00 00 00 00 02 51 B5 + 39 00 00 00 00 00 02 52 B5 + 39 00 00 00 00 00 02 53 B4 + 39 00 00 00 00 00 02 54 B4 + 39 00 00 00 00 00 02 55 B4 + 39 00 00 00 00 00 02 56 B4 + 39 00 00 00 00 00 02 57 B3 + 39 00 00 00 00 00 02 58 B3 + 39 00 00 00 00 00 02 59 B4 + 39 00 00 00 00 00 02 5A B5 + 39 00 00 00 00 00 02 5B B5 + 39 00 00 00 00 00 02 5C B6 + 39 00 00 00 00 00 02 5D B6 + 39 00 00 00 00 00 02 5E B7 + 39 00 00 00 00 00 02 5F B7 + 39 00 00 00 00 00 02 60 B8 + 39 00 00 00 00 00 02 61 B8 + 39 00 00 00 00 00 02 62 B8 + 39 00 00 00 00 00 02 63 B8 + 39 00 00 00 00 00 02 64 B9 + 39 00 00 00 00 00 02 65 B9 + 39 00 00 00 00 00 02 66 B9 + 39 00 00 00 00 00 02 67 B9 + 39 00 00 00 00 00 02 68 B9 + 39 00 00 00 00 00 02 69 B9 + 39 00 00 00 00 00 02 6A B9 + 39 00 00 00 00 00 02 6B BA + 39 00 00 00 00 00 02 6C BA + 39 00 00 00 00 00 02 6D BB + 39 00 00 00 00 00 02 6E BB + 39 00 00 00 00 00 02 6F BB + 39 00 00 00 00 00 02 70 BB + 39 00 00 00 00 00 02 71 BC + 39 00 00 00 00 00 02 72 BC + 39 00 00 00 00 00 02 73 BC + 39 00 00 00 00 00 02 74 BC + 39 00 00 00 00 00 02 75 BB + 39 00 00 00 00 00 02 76 BB + 39 00 00 00 00 00 02 77 BC + 39 00 00 00 00 00 02 78 BC + 39 00 00 00 00 00 02 79 BD + 39 00 00 00 00 00 02 7A BD + 39 00 00 00 00 00 02 7B BD + 39 00 00 00 00 00 02 7C BD + 39 00 00 00 00 00 02 7D BD + 39 00 00 00 00 00 02 7E BD + 39 00 00 00 00 00 02 7F BD + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 B2 + 39 00 00 00 00 00 02 02 B2 + 39 00 00 00 00 00 02 03 B3 + 39 00 00 00 00 00 02 04 B4 + 39 00 00 00 00 00 02 05 B4 + 39 00 00 00 00 00 02 06 B4 + 39 00 00 00 00 00 02 07 B5 + 39 00 00 00 00 00 02 08 B6 + 39 00 00 00 00 00 02 09 B6 + 39 00 00 00 00 00 02 0A B7 + 39 00 00 00 00 00 02 0B B7 + 39 00 00 00 00 00 02 0C B8 + 39 00 00 00 00 00 02 0D B8 + 39 00 00 00 00 00 02 0E B8 + 39 00 00 00 00 00 02 0F B9 + 39 00 00 00 00 00 02 10 B9 + 39 00 00 00 00 00 02 11 BA + 39 00 00 00 00 00 02 12 BA + 39 00 00 00 00 00 02 13 BB + 39 00 00 00 00 00 02 14 BB + 39 00 00 00 00 00 02 15 BB + 39 00 00 00 00 00 02 16 BC + 39 00 00 00 00 00 02 17 BC + 39 00 00 00 00 00 02 18 BC + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A BD + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1C BD + 39 00 00 00 00 00 02 1D BE + 39 00 00 00 00 00 02 1E BE + 39 00 00 00 00 00 02 1F BE + 39 00 00 00 00 00 02 20 BF + 39 00 00 00 00 00 02 21 BF + 39 00 00 00 00 00 02 22 C0 + 39 00 00 00 00 00 02 23 C1 + 39 00 00 00 00 00 02 24 C2 + 39 00 00 00 00 00 02 25 C2 + 39 00 00 00 00 00 02 26 C3 + 39 00 00 00 00 00 02 27 C4 + 39 00 00 00 00 00 02 28 C4 + 39 00 00 00 00 00 02 29 C5 + 39 00 00 00 00 00 02 2A C6 + 39 00 00 00 00 00 02 2B C6 + 39 00 00 00 00 00 02 2C C7 + 39 00 00 00 00 00 02 2D C7 + 39 00 00 00 00 00 02 2E C8 + 39 00 00 00 00 00 02 2F C8 + 39 00 00 00 00 00 02 30 C9 + 39 00 00 00 00 00 02 31 C9 + 39 00 00 00 00 00 02 32 CA + 39 00 00 00 00 00 02 33 CB + 39 00 00 00 00 00 02 34 CC + 39 00 00 00 00 00 02 35 CC + 39 00 00 00 00 00 02 36 CC + 39 00 00 00 00 00 02 37 CC + 39 00 00 00 00 00 02 38 CC + 39 00 00 00 00 00 02 39 CD + 39 00 00 00 00 00 02 3A CD + 39 00 00 00 00 00 02 3B CD + 39 00 00 00 00 00 02 3C CE + 39 00 00 00 00 00 02 3D CE + 39 00 00 00 00 00 02 3E CE + 39 00 00 00 00 00 02 3F CF + 39 00 00 00 00 00 02 40 CF + 39 00 00 00 00 00 02 41 CF + 39 00 00 00 00 00 02 42 CF + 39 00 00 00 00 00 02 43 CF + 39 00 00 00 00 00 02 44 D0 + 39 00 00 00 00 00 02 45 D1 + 39 00 00 00 00 00 02 46 D2 + 39 00 00 00 00 00 02 47 D3 + 39 00 00 00 00 00 02 48 D4 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 4A D5 + 39 00 00 00 00 00 02 4B D6 + 39 00 00 00 00 00 02 4C D7 + 39 00 00 00 00 00 02 4D D8 + 39 00 00 00 00 00 02 4E D8 + 39 00 00 00 00 00 02 4F D9 + 39 00 00 00 00 00 02 50 DA + 39 00 00 00 00 00 02 51 DA + 39 00 00 00 00 00 02 52 DB + 39 00 00 00 00 00 02 53 DB + 39 00 00 00 00 00 02 54 DC + 39 00 00 00 00 00 02 55 DC + 39 00 00 00 00 00 02 56 DD + 39 00 00 00 00 00 02 57 DD + 39 00 00 00 00 00 02 58 DE + 39 00 00 00 00 00 02 59 DE + 39 00 00 00 00 00 02 5A DE + 39 00 00 00 00 00 02 5B DE + 39 00 00 00 00 00 02 5C DF + 39 00 00 00 00 00 02 5D DF + 39 00 00 00 00 00 02 5E DF + 39 00 00 00 00 00 02 5F DF + 39 00 00 00 00 00 02 60 DF + 39 00 00 00 00 00 02 61 E0 + 39 00 00 00 00 00 02 62 E0 + 39 00 00 00 00 00 02 63 E0 + 39 00 00 00 00 00 02 64 E1 + 39 00 00 00 00 00 02 65 E2 + 39 00 00 00 00 00 02 66 E3 + 39 00 00 00 00 00 02 67 E4 + 39 00 00 00 00 00 02 68 E4 + 39 00 00 00 00 00 02 69 E5 + 39 00 00 00 00 00 02 6A E6 + 39 00 00 00 00 00 02 6B E7 + 39 00 00 00 00 00 02 6C E8 + 39 00 00 00 00 00 02 6D E9 + 39 00 00 00 00 00 02 6E E9 + 39 00 00 00 00 00 02 6F EA + 39 00 00 00 00 00 02 70 EA + 39 00 00 00 00 00 02 71 EB + 39 00 00 00 00 00 02 72 EC + 39 00 00 00 00 00 02 73 EC + 39 00 00 00 00 00 02 74 EC + 39 00 00 00 00 00 02 75 ED + 39 00 00 00 00 00 02 76 ED + 39 00 00 00 00 00 02 77 EE + 39 00 00 00 00 00 02 78 EF + 39 00 00 00 00 00 02 79 F0 + 39 00 00 00 00 00 02 7A F1 + 39 00 00 00 00 00 02 7B F2 + 39 00 00 00 00 00 02 7C F3 + 39 00 00 00 00 00 02 7D F3 + 39 00 00 00 00 00 02 7E F4 + 39 00 00 00 00 00 02 7F F5 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 81 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F a0 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 a1 + 39 00 00 00 00 00 02 7F bd + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F b1 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 b1 + 39 00 00 00 00 00 02 7F f5 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F F5 + 39 00 00 00 00 00 02 7E F4 + 39 00 00 00 00 00 02 7D F3 + 39 00 00 00 00 00 02 7C F3 + 39 00 00 00 00 00 02 7B F2 + 39 00 00 00 00 00 02 7A F1 + 39 00 00 00 00 00 02 79 F0 + 39 00 00 00 00 00 02 78 EF + 39 00 00 00 00 00 02 77 EE + 39 00 00 00 00 00 02 76 ED + 39 00 00 00 00 00 02 75 ED + 39 00 00 00 00 00 02 74 EC + 39 00 00 00 00 00 02 73 EC + 39 00 00 00 00 00 02 72 EC + 39 00 00 00 00 00 02 71 EB + 39 00 00 00 00 00 02 70 EA + 39 00 00 00 00 00 02 6F EA + 39 00 00 00 00 00 02 6E E9 + 39 00 00 00 00 00 02 6D E9 + 39 00 00 00 00 00 02 6C E8 + 39 00 00 00 00 00 02 6B E7 + 39 00 00 00 00 00 02 6A E6 + 39 00 00 00 00 00 02 69 E5 + 39 00 00 00 00 00 02 68 E4 + 39 00 00 00 00 00 02 67 E4 + 39 00 00 00 00 00 02 66 E3 + 39 00 00 00 00 00 02 65 E2 + 39 00 00 00 00 00 02 64 E1 + 39 00 00 00 00 00 02 63 E0 + 39 00 00 00 00 00 02 62 E0 + 39 00 00 00 00 00 02 61 E0 + 39 00 00 00 00 00 02 60 DF + 39 00 00 00 00 00 02 5F DF + 39 00 00 00 00 00 02 5E DF + 39 00 00 00 00 00 02 5D DF + 39 00 00 00 00 00 02 5C DF + 39 00 00 00 00 00 02 5B DE + 39 00 00 00 00 00 02 5A DE + 39 00 00 00 00 00 02 59 DE + 39 00 00 00 00 00 02 58 DE + 39 00 00 00 00 00 02 57 DD + 39 00 00 00 00 00 02 56 DD + 39 00 00 00 00 00 02 55 DC + 39 00 00 00 00 00 02 54 DC + 39 00 00 00 00 00 02 53 DB + 39 00 00 00 00 00 02 52 DB + 39 00 00 00 00 00 02 51 DA + 39 00 00 00 00 00 02 50 DA + 39 00 00 00 00 00 02 4F D9 + 39 00 00 00 00 00 02 4E D8 + 39 00 00 00 00 00 02 4D D8 + 39 00 00 00 00 00 02 4C D7 + 39 00 00 00 00 00 02 4B D6 + 39 00 00 00 00 00 02 4A D5 + 39 00 00 00 00 00 02 49 D5 + 39 00 00 00 00 00 02 48 D4 + 39 00 00 00 00 00 02 47 D3 + 39 00 00 00 00 00 02 46 D2 + 39 00 00 00 00 00 02 45 D1 + 39 00 00 00 00 00 02 44 D0 + 39 00 00 00 00 00 02 43 CF + 39 00 00 00 00 00 02 42 CF + 39 00 00 00 00 00 02 41 CF + 39 00 00 00 00 00 02 40 CF + 39 00 00 00 00 00 02 3F CF + 39 00 00 00 00 00 02 3E CE + 39 00 00 00 00 00 02 3D CE + 39 00 00 00 00 00 02 3C CE + 39 00 00 00 00 00 02 3B CD + 39 00 00 00 00 00 02 3A CD + 39 00 00 00 00 00 02 39 CD + 39 00 00 00 00 00 02 38 CC + 39 00 00 00 00 00 02 37 CC + 39 00 00 00 00 00 02 36 CC + 39 00 00 00 00 00 02 35 CC + 39 00 00 00 00 00 02 34 CC + 39 00 00 00 00 00 02 33 CB + 39 00 00 00 00 00 02 32 CA + 39 00 00 00 00 00 02 31 C9 + 39 00 00 00 00 00 02 30 C9 + 39 00 00 00 00 00 02 2F C8 + 39 00 00 00 00 00 02 2E C8 + 39 00 00 00 00 00 02 2D C7 + 39 00 00 00 00 00 02 2C C7 + 39 00 00 00 00 00 02 2B C6 + 39 00 00 00 00 00 02 2A C6 + 39 00 00 00 00 00 02 29 C5 + 39 00 00 00 00 00 02 28 C4 + 39 00 00 00 00 00 02 27 C4 + 39 00 00 00 00 00 02 26 C3 + 39 00 00 00 00 00 02 25 C2 + 39 00 00 00 00 00 02 24 C2 + 39 00 00 00 00 00 02 23 C1 + 39 00 00 00 00 00 02 22 C0 + 39 00 00 00 00 00 02 21 BF + 39 00 00 00 00 00 02 20 BF + 39 00 00 00 00 00 02 1F BE + 39 00 00 00 00 00 02 1E BE + 39 00 00 00 00 00 02 1D BE + 39 00 00 00 00 00 02 1C BD + 39 00 00 00 00 00 02 1B BD + 39 00 00 00 00 00 02 1A BD + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 18 BC + 39 00 00 00 00 00 02 17 BC + 39 00 00 00 00 00 02 16 BC + 39 00 00 00 00 00 02 15 BB + 39 00 00 00 00 00 02 14 BB + 39 00 00 00 00 00 02 13 BB + 39 00 00 00 00 00 02 12 BA + 39 00 00 00 00 00 02 11 BA + 39 00 00 00 00 00 02 10 B9 + 39 00 00 00 00 00 02 0F B9 + 39 00 00 00 00 00 02 0E B8 + 39 00 00 00 00 00 02 0D B8 + 39 00 00 00 00 00 02 0C B8 + 39 00 00 00 00 00 02 0B B7 + 39 00 00 00 00 00 02 0A B7 + 39 00 00 00 00 00 02 09 B6 + 39 00 00 00 00 00 02 08 B6 + 39 00 00 00 00 00 02 07 B5 + 39 00 00 00 00 00 02 06 B4 + 39 00 00 00 00 00 02 05 B4 + 39 00 00 00 00 00 02 04 B4 + 39 00 00 00 00 00 02 03 B3 + 39 00 00 00 00 00 02 02 B2 + 39 00 00 00 00 00 02 01 B2 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7B 85 + 39 00 00 00 00 00 02 7A 85 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 78 85 + 39 00 00 00 00 00 02 77 85 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 6E 87 + 39 00 00 00 00 00 02 6D 87 + 39 00 00 00 00 00 02 6C 87 + 39 00 00 00 00 00 02 6B 87 + 39 00 00 00 00 00 02 6A 86 + 39 00 00 00 00 00 02 69 86 + 39 00 00 00 00 00 02 68 86 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 66 87 + 39 00 00 00 00 00 02 65 87 + 39 00 00 00 00 00 02 64 87 + 39 00 00 00 00 00 02 63 87 + 39 00 00 00 00 00 02 62 87 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 60 87 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5D 86 + 39 00 00 00 00 00 02 5C 86 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 59 87 + 39 00 00 00 00 00 02 58 87 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4D 84 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4B 84 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 49 85 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 47 86 + 39 00 00 00 00 00 02 46 87 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 38 87 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 36 86 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 84 + 39 00 00 00 00 00 02 31 84 + 39 00 00 00 00 00 02 30 83 + 39 00 00 00 00 00 02 2F 83 + 39 00 00 00 00 00 02 2E 83 + 39 00 00 00 00 00 02 2D 84 + 39 00 00 00 00 00 02 2C 84 + 39 00 00 00 00 00 02 2B 84 + 39 00 00 00 00 00 02 2A 84 + 39 00 00 00 00 00 02 29 84 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 27 85 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 25 85 + 39 00 00 00 00 00 02 24 85 + 39 00 00 00 00 00 02 23 85 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 21 85 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F BD + 39 00 00 00 00 00 02 7E BD + 39 00 00 00 00 00 02 7D BD + 39 00 00 00 00 00 02 7C BD + 39 00 00 00 00 00 02 7B BD + 39 00 00 00 00 00 02 7A BD + 39 00 00 00 00 00 02 79 BD + 39 00 00 00 00 00 02 78 BC + 39 00 00 00 00 00 02 77 BC + 39 00 00 00 00 00 02 76 BB + 39 00 00 00 00 00 02 75 BB + 39 00 00 00 00 00 02 74 BC + 39 00 00 00 00 00 02 73 BC + 39 00 00 00 00 00 02 72 BC + 39 00 00 00 00 00 02 71 BC + 39 00 00 00 00 00 02 70 BB + 39 00 00 00 00 00 02 6F BB + 39 00 00 00 00 00 02 6E BB + 39 00 00 00 00 00 02 6D BB + 39 00 00 00 00 00 02 6C BA + 39 00 00 00 00 00 02 6B BA + 39 00 00 00 00 00 02 6A B9 + 39 00 00 00 00 00 02 69 B9 + 39 00 00 00 00 00 02 68 B9 + 39 00 00 00 00 00 02 67 B9 + 39 00 00 00 00 00 02 66 B9 + 39 00 00 00 00 00 02 65 B9 + 39 00 00 00 00 00 02 64 B9 + 39 00 00 00 00 00 02 63 B8 + 39 00 00 00 00 00 02 62 B8 + 39 00 00 00 00 00 02 61 B8 + 39 00 00 00 00 00 02 60 B8 + 39 00 00 00 00 00 02 5F B7 + 39 00 00 00 00 00 02 5E B7 + 39 00 00 00 00 00 02 5D B6 + 39 00 00 00 00 00 02 5C B6 + 39 00 00 00 00 00 02 5B B5 + 39 00 00 00 00 00 02 5A B5 + 39 00 00 00 00 00 02 59 B4 + 39 00 00 00 00 00 02 58 B3 + 39 00 00 00 00 00 02 57 B3 + 39 00 00 00 00 00 02 56 B4 + 39 00 00 00 00 00 02 55 B4 + 39 00 00 00 00 00 02 54 B4 + 39 00 00 00 00 00 02 53 B4 + 39 00 00 00 00 00 02 52 B5 + 39 00 00 00 00 00 02 51 B5 + 39 00 00 00 00 00 02 50 B5 + 39 00 00 00 00 00 02 4F B5 + 39 00 00 00 00 00 02 4E B5 + 39 00 00 00 00 00 02 4D B5 + 39 00 00 00 00 00 02 4C B5 + 39 00 00 00 00 00 02 4B B5 + 39 00 00 00 00 00 02 4A B5 + 39 00 00 00 00 00 02 49 B4 + 39 00 00 00 00 00 02 48 B4 + 39 00 00 00 00 00 02 47 B4 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 45 B3 + 39 00 00 00 00 00 02 44 B3 + 39 00 00 00 00 00 02 43 B3 + 39 00 00 00 00 00 02 42 B2 + 39 00 00 00 00 00 02 41 B1 + 39 00 00 00 00 00 02 40 B1 + 39 00 00 00 00 00 02 3F B0 + 39 00 00 00 00 00 02 3E B0 + 39 00 00 00 00 00 02 3D AF + 39 00 00 00 00 00 02 3C AE + 39 00 00 00 00 00 02 3B AE + 39 00 00 00 00 00 02 3A AD + 39 00 00 00 00 00 02 39 AD + 39 00 00 00 00 00 02 38 AE + 39 00 00 00 00 00 02 37 AE + 39 00 00 00 00 00 02 36 AE + 39 00 00 00 00 00 02 35 AE + 39 00 00 00 00 00 02 34 AE + 39 00 00 00 00 00 02 33 AE + 39 00 00 00 00 00 02 32 AE + 39 00 00 00 00 00 02 31 AD + 39 00 00 00 00 00 02 30 AD + 39 00 00 00 00 00 02 2F AD + 39 00 00 00 00 00 02 2E AD + 39 00 00 00 00 00 02 2D AE + 39 00 00 00 00 00 02 2C AD + 39 00 00 00 00 00 02 2B AD + 39 00 00 00 00 00 02 2A AC + 39 00 00 00 00 00 02 29 AC + 39 00 00 00 00 00 02 28 AC + 39 00 00 00 00 00 02 27 AC + 39 00 00 00 00 00 02 26 AB + 39 00 00 00 00 00 02 25 AB + 39 00 00 00 00 00 02 24 AA + 39 00 00 00 00 00 02 23 AA + 39 00 00 00 00 00 02 22 AA + 39 00 00 00 00 00 02 21 A9 + 39 00 00 00 00 00 02 20 A9 + 39 00 00 00 00 00 02 1F A8 + 39 00 00 00 00 00 02 1E A8 + 39 00 00 00 00 00 02 1D A7 + 39 00 00 00 00 00 02 1C A7 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1A A6 + 39 00 00 00 00 00 02 19 A5 + 39 00 00 00 00 00 02 18 A5 + 39 00 00 00 00 00 02 17 A5 + 39 00 00 00 00 00 02 16 A5 + 39 00 00 00 00 00 02 15 A5 + 39 00 00 00 00 00 02 14 A5 + 39 00 00 00 00 00 02 13 A5 + 39 00 00 00 00 00 02 12 A5 + 39 00 00 00 00 00 02 11 A5 + 39 00 00 00 00 00 02 10 A5 + 39 00 00 00 00 00 02 0F A5 + 39 00 00 00 00 00 02 0E A5 + 39 00 00 00 00 00 02 0D A4 + 39 00 00 00 00 00 02 0C A4 + 39 00 00 00 00 00 02 0B A4 + 39 00 00 00 00 00 02 0A A4 + 39 00 00 00 00 00 02 09 A3 + 39 00 00 00 00 00 02 08 A3 + 39 00 00 00 00 00 02 07 A3 + 39 00 00 00 00 00 02 06 A3 + 39 00 00 00 00 00 02 05 A2 + 39 00 00 00 00 00 02 04 A2 + 39 00 00 00 00 00 02 03 A2 + 39 00 00 00 00 00 02 02 A1 + 39 00 00 00 00 00 02 01 A1 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 81 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F a0 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 a1 + 39 00 00 00 00 00 02 7F bd + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F b1 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 b1 + 39 00 00 00 00 00 02 7F f5 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F B1 + 39 00 00 00 00 00 02 7E B0 + 39 00 00 00 00 00 02 7D AF + 39 00 00 00 00 00 02 7C AF + 39 00 00 00 00 00 02 7B AE + 39 00 00 00 00 00 02 7A AE + 39 00 00 00 00 00 02 79 AD + 39 00 00 00 00 00 02 78 AC + 39 00 00 00 00 00 02 77 AC + 39 00 00 00 00 00 02 76 AC + 39 00 00 00 00 00 02 75 AB + 39 00 00 00 00 00 02 74 AB + 39 00 00 00 00 00 02 73 AA + 39 00 00 00 00 00 02 72 AA + 39 00 00 00 00 00 02 71 A9 + 39 00 00 00 00 00 02 70 A9 + 39 00 00 00 00 00 02 6F A8 + 39 00 00 00 00 00 02 6E A8 + 39 00 00 00 00 00 02 6D A7 + 39 00 00 00 00 00 02 6C A7 + 39 00 00 00 00 00 02 6B A6 + 39 00 00 00 00 00 02 6A A6 + 39 00 00 00 00 00 02 69 A5 + 39 00 00 00 00 00 02 68 A5 + 39 00 00 00 00 00 02 67 A4 + 39 00 00 00 00 00 02 66 A4 + 39 00 00 00 00 00 02 65 A3 + 39 00 00 00 00 00 02 64 A3 + 39 00 00 00 00 00 02 63 A2 + 39 00 00 00 00 00 02 62 A2 + 39 00 00 00 00 00 02 61 A2 + 39 00 00 00 00 00 02 60 A1 + 39 00 00 00 00 00 02 5F A1 + 39 00 00 00 00 00 02 5E A0 + 39 00 00 00 00 00 02 5D A0 + 39 00 00 00 00 00 02 5C 9F + 39 00 00 00 00 00 02 5B 9F + 39 00 00 00 00 00 02 5A 9F + 39 00 00 00 00 00 02 59 9F + 39 00 00 00 00 00 02 58 9E + 39 00 00 00 00 00 02 57 9E + 39 00 00 00 00 00 02 56 9D + 39 00 00 00 00 00 02 55 9D + 39 00 00 00 00 00 02 54 9C + 39 00 00 00 00 00 02 53 9B + 39 00 00 00 00 00 02 52 9A + 39 00 00 00 00 00 02 51 9A + 39 00 00 00 00 00 02 50 9A + 39 00 00 00 00 00 02 4F 99 + 39 00 00 00 00 00 02 4E 99 + 39 00 00 00 00 00 02 4D 98 + 39 00 00 00 00 00 02 4C 98 + 39 00 00 00 00 00 02 4B 98 + 39 00 00 00 00 00 02 4A 97 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 48 97 + 39 00 00 00 00 00 02 47 97 + 39 00 00 00 00 00 02 46 96 + 39 00 00 00 00 00 02 45 96 + 39 00 00 00 00 00 02 44 96 + 39 00 00 00 00 00 02 43 96 + 39 00 00 00 00 00 02 42 96 + 39 00 00 00 00 00 02 41 96 + 39 00 00 00 00 00 02 40 96 + 39 00 00 00 00 00 02 3F 96 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3D 96 + 39 00 00 00 00 00 02 3C 96 + 39 00 00 00 00 00 02 3B 96 + 39 00 00 00 00 00 02 3A 96 + 39 00 00 00 00 00 02 39 96 + 39 00 00 00 00 00 02 38 96 + 39 00 00 00 00 00 02 37 95 + 39 00 00 00 00 00 02 36 94 + 39 00 00 00 00 00 02 35 93 + 39 00 00 00 00 00 02 34 93 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 32 91 + 39 00 00 00 00 00 02 31 91 + 39 00 00 00 00 00 02 30 91 + 39 00 00 00 00 00 02 2F 90 + 39 00 00 00 00 00 02 2E 90 + 39 00 00 00 00 00 02 2D 8F + 39 00 00 00 00 00 02 2C 8F + 39 00 00 00 00 00 02 2B 8F + 39 00 00 00 00 00 02 2A 8F + 39 00 00 00 00 00 02 29 8E + 39 00 00 00 00 00 02 28 8E + 39 00 00 00 00 00 02 27 8D + 39 00 00 00 00 00 02 26 8B + 39 00 00 00 00 00 02 25 8C + 39 00 00 00 00 00 02 24 8C + 39 00 00 00 00 00 02 23 8C + 39 00 00 00 00 00 02 22 8B + 39 00 00 00 00 00 02 21 8B + 39 00 00 00 00 00 02 20 8A + 39 00 00 00 00 00 02 1F 8A + 39 00 00 00 00 00 02 1E 8A + 39 00 00 00 00 00 02 1D 8A + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1B 8A + 39 00 00 00 00 00 02 1A 8A + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 18 88 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 16 88 + 39 00 00 00 00 00 02 15 87 + 39 00 00 00 00 00 02 14 87 + 39 00 00 00 00 00 02 13 87 + 39 00 00 00 00 00 02 12 87 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 0E 85 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 79 00 + 39 00 00 00 00 00 02 78 00 + 39 00 00 00 00 00 02 77 00 + 39 00 00 00 00 00 02 76 00 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 72 01 + 39 00 00 00 00 00 02 71 02 + 39 00 00 00 00 00 02 70 02 + 39 00 00 00 00 00 02 6F 02 + 39 00 00 00 00 00 02 6E 02 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6C 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 57 06 + 39 00 00 00 00 00 02 56 06 + 39 00 00 00 00 00 02 55 06 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 53 06 + 39 00 00 00 00 00 02 52 06 + 39 00 00 00 00 00 02 51 06 + 39 00 00 00 00 00 02 50 06 + 39 00 00 00 00 00 02 4F 06 + 39 00 00 00 00 00 02 4E 06 + 39 00 00 00 00 00 02 4D 06 + 39 00 00 00 00 00 02 4C 07 + 39 00 00 00 00 00 02 4B 07 + 39 00 00 00 00 00 02 4A 08 + 39 00 00 00 00 00 02 49 08 + 39 00 00 00 00 00 02 48 08 + 39 00 00 00 00 00 02 47 08 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3A 05 + 39 00 00 00 00 00 02 39 05 + 39 00 00 00 00 00 02 38 04 + 39 00 00 00 00 00 02 37 04 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 32 02 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 30 03 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 26 04 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F A0 + 39 00 00 00 00 00 02 7E A0 + 39 00 00 00 00 00 02 7D 9F + 39 00 00 00 00 00 02 7C 9F + 39 00 00 00 00 00 02 7B 9F + 39 00 00 00 00 00 02 7A 9F + 39 00 00 00 00 00 02 79 9E + 39 00 00 00 00 00 02 78 9E + 39 00 00 00 00 00 02 77 9D + 39 00 00 00 00 00 02 76 9D + 39 00 00 00 00 00 02 75 9C + 39 00 00 00 00 00 02 74 9B + 39 00 00 00 00 00 02 73 9C + 39 00 00 00 00 00 02 72 9C + 39 00 00 00 00 00 02 71 9B + 39 00 00 00 00 00 02 70 9B + 39 00 00 00 00 00 02 6F 9B + 39 00 00 00 00 00 02 6E 9A + 39 00 00 00 00 00 02 6D 9A + 39 00 00 00 00 00 02 6C 9A + 39 00 00 00 00 00 02 6B 99 + 39 00 00 00 00 00 02 6A 99 + 39 00 00 00 00 00 02 69 98 + 39 00 00 00 00 00 02 68 98 + 39 00 00 00 00 00 02 67 98 + 39 00 00 00 00 00 02 66 97 + 39 00 00 00 00 00 02 65 97 + 39 00 00 00 00 00 02 64 97 + 39 00 00 00 00 00 02 63 96 + 39 00 00 00 00 00 02 62 96 + 39 00 00 00 00 00 02 61 96 + 39 00 00 00 00 00 02 60 95 + 39 00 00 00 00 00 02 5F 95 + 39 00 00 00 00 00 02 5E 95 + 39 00 00 00 00 00 02 5D 95 + 39 00 00 00 00 00 02 5C 94 + 39 00 00 00 00 00 02 5B 94 + 39 00 00 00 00 00 02 5A 94 + 39 00 00 00 00 00 02 59 94 + 39 00 00 00 00 00 02 58 93 + 39 00 00 00 00 00 02 57 93 + 39 00 00 00 00 00 02 56 93 + 39 00 00 00 00 00 02 55 93 + 39 00 00 00 00 00 02 54 93 + 39 00 00 00 00 00 02 53 92 + 39 00 00 00 00 00 02 52 91 + 39 00 00 00 00 00 02 51 91 + 39 00 00 00 00 00 02 50 90 + 39 00 00 00 00 00 02 4F 8F + 39 00 00 00 00 00 02 4E 90 + 39 00 00 00 00 00 02 4D 90 + 39 00 00 00 00 00 02 4C 8F + 39 00 00 00 00 00 02 4B 8F + 39 00 00 00 00 00 02 4A 8F + 39 00 00 00 00 00 02 49 8E + 39 00 00 00 00 00 02 48 8E + 39 00 00 00 00 00 02 47 8E + 39 00 00 00 00 00 02 46 8E + 39 00 00 00 00 00 02 45 8E + 39 00 00 00 00 00 02 44 8E + 39 00 00 00 00 00 02 43 8E + 39 00 00 00 00 00 02 42 8E + 39 00 00 00 00 00 02 41 8E + 39 00 00 00 00 00 02 40 8E + 39 00 00 00 00 00 02 3F 8E + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3D 8F + 39 00 00 00 00 00 02 3C 8F + 39 00 00 00 00 00 02 3B 8F + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 39 8F + 39 00 00 00 00 00 02 38 8F + 39 00 00 00 00 00 02 37 8F + 39 00 00 00 00 00 02 36 8F + 39 00 00 00 00 00 02 35 8E + 39 00 00 00 00 00 02 34 8D + 39 00 00 00 00 00 02 33 8D + 39 00 00 00 00 00 02 32 8C + 39 00 00 00 00 00 02 31 8C + 39 00 00 00 00 00 02 30 8B + 39 00 00 00 00 00 02 2F 8B + 39 00 00 00 00 00 02 2E 8B + 39 00 00 00 00 00 02 2D 8A + 39 00 00 00 00 00 02 2C 8A + 39 00 00 00 00 00 02 2B 8A + 39 00 00 00 00 00 02 2A 8A + 39 00 00 00 00 00 02 29 8A + 39 00 00 00 00 00 02 28 89 + 39 00 00 00 00 00 02 27 89 + 39 00 00 00 00 00 02 26 88 + 39 00 00 00 00 00 02 25 87 + 39 00 00 00 00 00 02 24 87 + 39 00 00 00 00 00 02 23 88 + 39 00 00 00 00 00 02 22 88 + 39 00 00 00 00 00 02 21 87 + 39 00 00 00 00 00 02 20 87 + 39 00 00 00 00 00 02 1F 87 + 39 00 00 00 00 00 02 1E 86 + 39 00 00 00 00 00 02 1D 86 + 39 00 00 00 00 00 02 1C 87 + 39 00 00 00 00 00 02 1B 87 + 39 00 00 00 00 00 02 1A 87 + 39 00 00 00 00 00 02 19 86 + 39 00 00 00 00 00 02 18 86 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 16 85 + 39 00 00 00 00 00 02 15 85 + 39 00 00 00 00 00 02 14 85 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 12 85 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 10 84 + 39 00 00 00 00 00 02 0F 84 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + + qcom,mdss-dsi-panel-cool-command = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 30 04 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 32 03 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 37 05 + 39 00 00 00 00 00 02 38 05 + 39 00 00 00 00 00 02 39 05 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 47 08 + 39 00 00 00 00 00 02 48 08 + 39 00 00 00 00 00 02 49 09 + 39 00 00 00 00 00 02 4A 08 + 39 00 00 00 00 00 02 4B 08 + 39 00 00 00 00 00 02 4C 07 + 39 00 00 00 00 00 02 4D 07 + 39 00 00 00 00 00 02 4E 06 + 39 00 00 00 00 00 02 4F 06 + 39 00 00 00 00 00 02 50 06 + 39 00 00 00 00 00 02 51 06 + 39 00 00 00 00 00 02 52 07 + 39 00 00 00 00 00 02 53 07 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 55 06 + 39 00 00 00 00 00 02 56 06 + 39 00 00 00 00 00 02 57 06 + 39 00 00 00 00 00 02 58 06 + 39 00 00 00 00 00 02 59 06 + 39 00 00 00 00 00 02 5A 06 + 39 00 00 00 00 00 02 5B 06 + 39 00 00 00 00 00 02 5C 06 + 39 00 00 00 00 00 02 5D 06 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 03 + 39 00 00 00 00 00 02 6F 03 + 39 00 00 00 00 00 02 70 02 + 39 00 00 00 00 00 02 71 02 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 73 02 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 76 01 + 39 00 00 00 00 00 02 77 01 + 39 00 00 00 00 00 02 78 01 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 7B 00 + 39 00 00 00 00 00 02 7C 00 + 39 00 00 00 00 00 02 7D 00 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7F 00 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 07 01 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 01 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 00 + 39 00 00 00 00 00 02 18 81 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 1B 00 + 39 00 00 00 00 00 02 1C 01 + 39 00 00 00 00 00 02 1D 01 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1F 01 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 21 00 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 23 01 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 25 00 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 27 00 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 29 00 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 2B 00 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2D 00 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 30 81 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 34 82 + 39 00 00 00 00 00 02 35 81 + 39 00 00 00 00 00 02 36 81 + 39 00 00 00 00 00 02 37 81 + 39 00 00 00 00 00 02 38 81 + 39 00 00 00 00 00 02 39 00 + 39 00 00 00 00 00 02 3A 00 + 39 00 00 00 00 00 02 3B 01 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3D 02 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3F 02 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 41 03 + 39 00 00 00 00 00 02 42 03 + 39 00 00 00 00 00 02 43 03 + 39 00 00 00 00 00 02 44 03 + 39 00 00 00 00 00 02 45 03 + 39 00 00 00 00 00 02 46 03 + 39 00 00 00 00 00 02 47 03 + 39 00 00 00 00 00 02 48 03 + 39 00 00 00 00 00 02 49 03 + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 4B 03 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 02 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4F 01 + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 51 01 + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 53 01 + 39 00 00 00 00 00 02 54 01 + 39 00 00 00 00 00 02 55 01 + 39 00 00 00 00 00 02 56 01 + 39 00 00 00 00 00 02 57 01 + 39 00 00 00 00 00 02 58 01 + 39 00 00 00 00 00 02 59 01 + 39 00 00 00 00 00 02 5A 01 + 39 00 00 00 00 00 02 5B 01 + 39 00 00 00 00 00 02 5C 01 + 39 00 00 00 00 00 02 5D 01 + 39 00 00 00 00 00 02 5E 01 + 39 00 00 00 00 00 02 5F 01 + 39 00 00 00 00 00 02 60 01 + 39 00 00 00 00 00 02 61 01 + 39 00 00 00 00 00 02 62 01 + 39 00 00 00 00 00 02 63 00 + 39 00 00 00 00 00 02 64 00 + 39 00 00 00 00 00 02 65 00 + 39 00 00 00 00 00 02 66 00 + 39 00 00 00 00 00 02 67 00 + 39 00 00 00 00 00 02 68 00 + 39 00 00 00 00 00 02 69 00 + 39 00 00 00 00 00 02 6A 00 + 39 00 00 00 00 00 02 6B 81 + 39 00 00 00 00 00 02 6C 81 + 39 00 00 00 00 00 02 6D 00 + 39 00 00 00 00 00 02 6E 00 + 39 00 00 00 00 00 02 6F 81 + 39 00 00 00 00 00 02 70 81 + 39 00 00 00 00 00 02 71 81 + 39 00 00 00 00 00 02 72 81 + 39 00 00 00 00 00 02 73 82 + 39 00 00 00 00 00 02 74 82 + 39 00 00 00 00 00 02 75 82 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7F 83 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 05 02 + 39 00 00 00 00 00 02 06 02 + 39 00 00 00 00 00 02 07 02 + 39 00 00 00 00 00 02 08 02 + 39 00 00 00 00 00 02 09 02 + 39 00 00 00 00 00 02 0A 02 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0C 02 + 39 00 00 00 00 00 02 0D 02 + 39 00 00 00 00 00 02 0E 02 + 39 00 00 00 00 00 02 0F 02 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 03 + 39 00 00 00 00 00 02 12 03 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 20 07 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 22 07 + 39 00 00 00 00 00 02 23 07 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 07 + 39 00 00 00 00 00 02 26 07 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 29 08 + 39 00 00 00 00 00 02 2A 08 + 39 00 00 00 00 00 02 2B 08 + 39 00 00 00 00 00 02 2C 08 + 39 00 00 00 00 00 02 2D 08 + 39 00 00 00 00 00 02 2E 08 + 39 00 00 00 00 00 02 2F 08 + 39 00 00 00 00 00 02 30 07 + 39 00 00 00 00 00 02 31 07 + 39 00 00 00 00 00 02 32 08 + 39 00 00 00 00 00 02 33 08 + 39 00 00 00 00 00 02 34 09 + 39 00 00 00 00 00 02 35 09 + 39 00 00 00 00 00 02 36 0A + 39 00 00 00 00 00 02 37 0A + 39 00 00 00 00 00 02 38 0B + 39 00 00 00 00 00 02 39 0C + 39 00 00 00 00 00 02 3A 0C + 39 00 00 00 00 00 02 3B 0D + 39 00 00 00 00 00 02 3C 0D + 39 00 00 00 00 00 02 3D 0E + 39 00 00 00 00 00 02 3E 0E + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 40 0F + 39 00 00 00 00 00 02 41 0F + 39 00 00 00 00 00 02 42 0F + 39 00 00 00 00 00 02 43 0F + 39 00 00 00 00 00 02 44 0F + 39 00 00 00 00 00 02 45 0F + 39 00 00 00 00 00 02 46 10 + 39 00 00 00 00 00 02 47 10 + 39 00 00 00 00 00 02 48 10 + 39 00 00 00 00 00 02 49 10 + 39 00 00 00 00 00 02 4A 0F + 39 00 00 00 00 00 02 4B 0F + 39 00 00 00 00 00 02 4C 0F + 39 00 00 00 00 00 02 4D 0F + 39 00 00 00 00 00 02 4E 0F + 39 00 00 00 00 00 02 4F 0F + 39 00 00 00 00 00 02 50 10 + 39 00 00 00 00 00 02 51 10 + 39 00 00 00 00 00 02 52 10 + 39 00 00 00 00 00 02 53 10 + 39 00 00 00 00 00 02 54 10 + 39 00 00 00 00 00 02 55 10 + 39 00 00 00 00 00 02 56 11 + 39 00 00 00 00 00 02 57 11 + 39 00 00 00 00 00 02 58 11 + 39 00 00 00 00 00 02 59 11 + 39 00 00 00 00 00 02 5A 11 + 39 00 00 00 00 00 02 5B 11 + 39 00 00 00 00 00 02 5C 11 + 39 00 00 00 00 00 02 5D 11 + 39 00 00 00 00 00 02 5E 11 + 39 00 00 00 00 00 02 5F 11 + 39 00 00 00 00 00 02 60 11 + 39 00 00 00 00 00 02 61 11 + 39 00 00 00 00 00 02 62 11 + 39 00 00 00 00 00 02 63 11 + 39 00 00 00 00 00 02 64 11 + 39 00 00 00 00 00 02 65 11 + 39 00 00 00 00 00 02 66 11 + 39 00 00 00 00 00 02 67 11 + 39 00 00 00 00 00 02 68 11 + 39 00 00 00 00 00 02 69 12 + 39 00 00 00 00 00 02 6A 11 + 39 00 00 00 00 00 02 6B 11 + 39 00 00 00 00 00 02 6C 11 + 39 00 00 00 00 00 02 6D 11 + 39 00 00 00 00 00 02 6E 11 + 39 00 00 00 00 00 02 6F 10 + 39 00 00 00 00 00 02 70 11 + 39 00 00 00 00 00 02 71 11 + 39 00 00 00 00 00 02 72 10 + 39 00 00 00 00 00 02 73 10 + 39 00 00 00 00 00 02 74 11 + 39 00 00 00 00 00 02 75 10 + 39 00 00 00 00 00 02 76 10 + 39 00 00 00 00 00 02 77 10 + 39 00 00 00 00 00 02 78 10 + 39 00 00 00 00 00 02 79 10 + 39 00 00 00 00 00 02 7A 10 + 39 00 00 00 00 00 02 7B 11 + 39 00 00 00 00 00 02 7C 11 + 39 00 00 00 00 00 02 7D 11 + 39 00 00 00 00 00 02 7E 11 + 39 00 00 00 00 00 02 7F 11 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 1A 83 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1C 83 + 39 00 00 00 00 00 02 1D 83 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 3B 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 45 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 48 84 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 4A 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4C 82 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 57 85 + 39 00 00 00 00 00 02 58 85 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 5A 85 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 67 85 + 39 00 00 00 00 00 02 68 84 + 39 00 00 00 00 00 02 69 84 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 6B 85 + 39 00 00 00 00 00 02 6C 85 + 39 00 00 00 00 00 02 6D 85 + 39 00 00 00 00 00 02 6E 85 + 39 00 00 00 00 00 02 6F 84 + 39 00 00 00 00 00 02 70 84 + 39 00 00 00 00 00 02 71 84 + 39 00 00 00 00 00 02 72 84 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 75 84 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 79 83 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7F 83 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 39 84 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3C 85 + 39 00 00 00 00 00 02 3D 85 + 39 00 00 00 00 00 02 3E 85 + 39 00 00 00 00 00 02 3F 85 + 39 00 00 00 00 00 02 40 85 + 39 00 00 00 00 00 02 41 85 + 39 00 00 00 00 00 02 42 84 + 39 00 00 00 00 00 02 43 84 + 39 00 00 00 00 00 02 44 84 + 39 00 00 00 00 00 02 45 83 + 39 00 00 00 00 00 02 46 83 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 48 82 + 39 00 00 00 00 00 02 49 81 + 39 00 00 00 00 00 02 4A 81 + 39 00 00 00 00 00 02 4B 00 + 39 00 00 00 00 00 02 4C 81 + 39 00 00 00 00 00 02 4D 81 + 39 00 00 00 00 00 02 4E 81 + 39 00 00 00 00 00 02 4F 82 + 39 00 00 00 00 00 02 50 82 + 39 00 00 00 00 00 02 51 83 + 39 00 00 00 00 00 02 52 83 + 39 00 00 00 00 00 02 53 83 + 39 00 00 00 00 00 02 54 83 + 39 00 00 00 00 00 02 55 83 + 39 00 00 00 00 00 02 56 83 + 39 00 00 00 00 00 02 57 83 + 39 00 00 00 00 00 02 58 82 + 39 00 00 00 00 00 02 59 82 + 39 00 00 00 00 00 02 5A 82 + 39 00 00 00 00 00 02 5B 82 + 39 00 00 00 00 00 02 5C 82 + 39 00 00 00 00 00 02 5D 82 + 39 00 00 00 00 00 02 5E 82 + 39 00 00 00 00 00 02 5F 83 + 39 00 00 00 00 00 02 60 83 + 39 00 00 00 00 00 02 61 83 + 39 00 00 00 00 00 02 62 83 + 39 00 00 00 00 00 02 63 83 + 39 00 00 00 00 00 02 64 82 + 39 00 00 00 00 00 02 65 82 + 39 00 00 00 00 00 02 66 82 + 39 00 00 00 00 00 02 67 81 + 39 00 00 00 00 00 02 68 81 + 39 00 00 00 00 00 02 69 82 + 39 00 00 00 00 00 02 6A 82 + 39 00 00 00 00 00 02 6B 82 + 39 00 00 00 00 00 02 6C 82 + 39 00 00 00 00 00 02 6D 82 + 39 00 00 00 00 00 02 6E 81 + 39 00 00 00 00 00 02 6F 81 + 39 00 00 00 00 00 02 70 81 + 39 00 00 00 00 00 02 71 81 + 39 00 00 00 00 00 02 72 00 + 39 00 00 00 00 00 02 73 00 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 75 81 + 39 00 00 00 00 00 02 76 81 + 39 00 00 00 00 00 02 77 81 + 39 00 00 00 00 00 02 78 81 + 39 00 00 00 00 00 02 79 81 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 7B 00 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7F 00 + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 11 + 39 00 00 00 00 00 02 02 11 + 39 00 00 00 00 00 02 03 11 + 39 00 00 00 00 00 02 04 11 + 39 00 00 00 00 00 02 05 12 + 39 00 00 00 00 00 02 06 12 + 39 00 00 00 00 00 02 07 13 + 39 00 00 00 00 00 02 08 13 + 39 00 00 00 00 00 02 09 13 + 39 00 00 00 00 00 02 0A 13 + 39 00 00 00 00 00 02 0B 14 + 39 00 00 00 00 00 02 0C 13 + 39 00 00 00 00 00 02 0D 13 + 39 00 00 00 00 00 02 0E 13 + 39 00 00 00 00 00 02 0F 13 + 39 00 00 00 00 00 02 10 12 + 39 00 00 00 00 00 02 11 12 + 39 00 00 00 00 00 02 12 12 + 39 00 00 00 00 00 02 13 12 + 39 00 00 00 00 00 02 14 12 + 39 00 00 00 00 00 02 15 12 + 39 00 00 00 00 00 02 16 12 + 39 00 00 00 00 00 02 17 12 + 39 00 00 00 00 00 02 18 12 + 39 00 00 00 00 00 02 19 12 + 39 00 00 00 00 00 02 1A 12 + 39 00 00 00 00 00 02 1B 12 + 39 00 00 00 00 00 02 1C 11 + 39 00 00 00 00 00 02 1D 11 + 39 00 00 00 00 00 02 1E 12 + 39 00 00 00 00 00 02 1F 12 + 39 00 00 00 00 00 02 20 12 + 39 00 00 00 00 00 02 21 13 + 39 00 00 00 00 00 02 22 13 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 24 13 + 39 00 00 00 00 00 02 25 13 + 39 00 00 00 00 00 02 26 14 + 39 00 00 00 00 00 02 27 14 + 39 00 00 00 00 00 02 28 14 + 39 00 00 00 00 00 02 29 15 + 39 00 00 00 00 00 02 2A 15 + 39 00 00 00 00 00 02 2B 14 + 39 00 00 00 00 00 02 2C 14 + 39 00 00 00 00 00 02 2D 14 + 39 00 00 00 00 00 02 2E 13 + 39 00 00 00 00 00 02 2F 13 + 39 00 00 00 00 00 02 30 13 + 39 00 00 00 00 00 02 31 12 + 39 00 00 00 00 00 02 32 12 + 39 00 00 00 00 00 02 33 12 + 39 00 00 00 00 00 02 34 12 + 39 00 00 00 00 00 02 35 11 + 39 00 00 00 00 00 02 36 11 + 39 00 00 00 00 00 02 37 11 + 39 00 00 00 00 00 02 38 11 + 39 00 00 00 00 00 02 39 11 + 39 00 00 00 00 00 02 3A 11 + 39 00 00 00 00 00 02 3B 11 + 39 00 00 00 00 00 02 3C 11 + 39 00 00 00 00 00 02 3D 11 + 39 00 00 00 00 00 02 3E 12 + 39 00 00 00 00 00 02 3F 12 + 39 00 00 00 00 00 02 40 13 + 39 00 00 00 00 00 02 41 13 + 39 00 00 00 00 00 02 42 13 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 44 14 + 39 00 00 00 00 00 02 45 15 + 39 00 00 00 00 00 02 46 15 + 39 00 00 00 00 00 02 47 14 + 39 00 00 00 00 00 02 48 14 + 39 00 00 00 00 00 02 49 13 + 39 00 00 00 00 00 02 4A 13 + 39 00 00 00 00 00 02 4B 12 + 39 00 00 00 00 00 02 4C 12 + 39 00 00 00 00 00 02 4D 12 + 39 00 00 00 00 00 02 4E 11 + 39 00 00 00 00 00 02 4F 11 + 39 00 00 00 00 00 02 50 11 + 39 00 00 00 00 00 02 51 11 + 39 00 00 00 00 00 02 52 11 + 39 00 00 00 00 00 02 53 11 + 39 00 00 00 00 00 02 54 11 + 39 00 00 00 00 00 02 55 11 + 39 00 00 00 00 00 02 56 11 + 39 00 00 00 00 00 02 57 11 + 39 00 00 00 00 00 02 58 11 + 39 00 00 00 00 00 02 59 10 + 39 00 00 00 00 00 02 5A 10 + 39 00 00 00 00 00 02 5B 0F + 39 00 00 00 00 00 02 5C 0F + 39 00 00 00 00 00 02 5D 0F + 39 00 00 00 00 00 02 5E 0E + 39 00 00 00 00 00 02 5F 0E + 39 00 00 00 00 00 02 60 0E + 39 00 00 00 00 00 02 61 0E + 39 00 00 00 00 00 02 62 0E + 39 00 00 00 00 00 02 63 0E + 39 00 00 00 00 00 02 64 0E + 39 00 00 00 00 00 02 65 0D + 39 00 00 00 00 00 02 66 0D + 39 00 00 00 00 00 02 67 0C + 39 00 00 00 00 00 02 68 0C + 39 00 00 00 00 00 02 69 0B + 39 00 00 00 00 00 02 6A 0B + 39 00 00 00 00 00 02 6B 0B + 39 00 00 00 00 00 02 6C 0B + 39 00 00 00 00 00 02 6D 0B + 39 00 00 00 00 00 02 6E 0A + 39 00 00 00 00 00 02 6F 0A + 39 00 00 00 00 00 02 70 0A + 39 00 00 00 00 00 02 71 09 + 39 00 00 00 00 00 02 72 08 + 39 00 00 00 00 00 02 73 07 + 39 00 00 00 00 00 02 74 06 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 76 05 + 39 00 00 00 00 00 02 77 04 + 39 00 00 00 00 00 02 78 04 + 39 00 00 00 00 00 02 79 03 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7F 85 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 83 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 11 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 11 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 79 03 + 39 00 00 00 00 00 02 78 04 + 39 00 00 00 00 00 02 77 04 + 39 00 00 00 00 00 02 76 05 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 74 06 + 39 00 00 00 00 00 02 73 07 + 39 00 00 00 00 00 02 72 08 + 39 00 00 00 00 00 02 71 09 + 39 00 00 00 00 00 02 70 0A + 39 00 00 00 00 00 02 6F 0A + 39 00 00 00 00 00 02 6E 0A + 39 00 00 00 00 00 02 6D 0B + 39 00 00 00 00 00 02 6C 0B + 39 00 00 00 00 00 02 6B 0B + 39 00 00 00 00 00 02 6A 0B + 39 00 00 00 00 00 02 69 0B + 39 00 00 00 00 00 02 68 0C + 39 00 00 00 00 00 02 67 0C + 39 00 00 00 00 00 02 66 0D + 39 00 00 00 00 00 02 65 0D + 39 00 00 00 00 00 02 64 0E + 39 00 00 00 00 00 02 63 0E + 39 00 00 00 00 00 02 62 0E + 39 00 00 00 00 00 02 61 0E + 39 00 00 00 00 00 02 60 0E + 39 00 00 00 00 00 02 5F 0E + 39 00 00 00 00 00 02 5E 0E + 39 00 00 00 00 00 02 5D 0F + 39 00 00 00 00 00 02 5C 0F + 39 00 00 00 00 00 02 5B 0F + 39 00 00 00 00 00 02 5A 10 + 39 00 00 00 00 00 02 59 10 + 39 00 00 00 00 00 02 58 11 + 39 00 00 00 00 00 02 57 11 + 39 00 00 00 00 00 02 56 11 + 39 00 00 00 00 00 02 55 11 + 39 00 00 00 00 00 02 54 11 + 39 00 00 00 00 00 02 53 11 + 39 00 00 00 00 00 02 52 11 + 39 00 00 00 00 00 02 51 11 + 39 00 00 00 00 00 02 50 11 + 39 00 00 00 00 00 02 4F 11 + 39 00 00 00 00 00 02 4E 11 + 39 00 00 00 00 00 02 4D 12 + 39 00 00 00 00 00 02 4C 12 + 39 00 00 00 00 00 02 4B 12 + 39 00 00 00 00 00 02 4A 13 + 39 00 00 00 00 00 02 49 13 + 39 00 00 00 00 00 02 48 14 + 39 00 00 00 00 00 02 47 14 + 39 00 00 00 00 00 02 46 15 + 39 00 00 00 00 00 02 45 15 + 39 00 00 00 00 00 02 44 14 + 39 00 00 00 00 00 02 43 14 + 39 00 00 00 00 00 02 42 13 + 39 00 00 00 00 00 02 41 13 + 39 00 00 00 00 00 02 40 13 + 39 00 00 00 00 00 02 3F 12 + 39 00 00 00 00 00 02 3E 12 + 39 00 00 00 00 00 02 3D 11 + 39 00 00 00 00 00 02 3C 11 + 39 00 00 00 00 00 02 3B 11 + 39 00 00 00 00 00 02 3A 11 + 39 00 00 00 00 00 02 39 11 + 39 00 00 00 00 00 02 38 11 + 39 00 00 00 00 00 02 37 11 + 39 00 00 00 00 00 02 36 11 + 39 00 00 00 00 00 02 35 11 + 39 00 00 00 00 00 02 34 12 + 39 00 00 00 00 00 02 33 12 + 39 00 00 00 00 00 02 32 12 + 39 00 00 00 00 00 02 31 12 + 39 00 00 00 00 00 02 30 13 + 39 00 00 00 00 00 02 2F 13 + 39 00 00 00 00 00 02 2E 13 + 39 00 00 00 00 00 02 2D 14 + 39 00 00 00 00 00 02 2C 14 + 39 00 00 00 00 00 02 2B 14 + 39 00 00 00 00 00 02 2A 15 + 39 00 00 00 00 00 02 29 15 + 39 00 00 00 00 00 02 28 14 + 39 00 00 00 00 00 02 27 14 + 39 00 00 00 00 00 02 26 14 + 39 00 00 00 00 00 02 25 13 + 39 00 00 00 00 00 02 24 13 + 39 00 00 00 00 00 02 23 13 + 39 00 00 00 00 00 02 22 13 + 39 00 00 00 00 00 02 21 13 + 39 00 00 00 00 00 02 20 12 + 39 00 00 00 00 00 02 1F 12 + 39 00 00 00 00 00 02 1E 12 + 39 00 00 00 00 00 02 1D 11 + 39 00 00 00 00 00 02 1C 11 + 39 00 00 00 00 00 02 1B 12 + 39 00 00 00 00 00 02 1A 12 + 39 00 00 00 00 00 02 19 12 + 39 00 00 00 00 00 02 18 12 + 39 00 00 00 00 00 02 17 12 + 39 00 00 00 00 00 02 16 12 + 39 00 00 00 00 00 02 15 12 + 39 00 00 00 00 00 02 14 12 + 39 00 00 00 00 00 02 13 12 + 39 00 00 00 00 00 02 12 12 + 39 00 00 00 00 00 02 11 12 + 39 00 00 00 00 00 02 10 12 + 39 00 00 00 00 00 02 0F 13 + 39 00 00 00 00 00 02 0E 13 + 39 00 00 00 00 00 02 0D 13 + 39 00 00 00 00 00 02 0C 13 + 39 00 00 00 00 00 02 0B 14 + 39 00 00 00 00 00 02 0A 13 + 39 00 00 00 00 00 02 09 13 + 39 00 00 00 00 00 02 08 13 + 39 00 00 00 00 00 02 07 13 + 39 00 00 00 00 00 02 06 12 + 39 00 00 00 00 00 02 05 12 + 39 00 00 00 00 00 02 04 11 + 39 00 00 00 00 00 02 03 11 + 39 00 00 00 00 00 02 02 11 + 39 00 00 00 00 00 02 01 11 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 79 83 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 75 84 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 72 84 + 39 00 00 00 00 00 02 71 84 + 39 00 00 00 00 00 02 70 84 + 39 00 00 00 00 00 02 6F 84 + 39 00 00 00 00 00 02 6E 85 + 39 00 00 00 00 00 02 6D 85 + 39 00 00 00 00 00 02 6C 85 + 39 00 00 00 00 00 02 6B 85 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 69 84 + 39 00 00 00 00 00 02 68 84 + 39 00 00 00 00 00 02 67 85 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5A 85 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 58 85 + 39 00 00 00 00 00 02 57 85 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4C 82 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4A 83 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 48 84 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 45 85 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3B 86 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1D 83 + 39 00 00 00 00 00 02 1C 83 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1A 83 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 17 82 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 01 00 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7B 00 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 79 81 + 39 00 00 00 00 00 02 78 81 + 39 00 00 00 00 00 02 77 81 + 39 00 00 00 00 00 02 76 81 + 39 00 00 00 00 00 02 75 81 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 73 00 + 39 00 00 00 00 00 02 72 00 + 39 00 00 00 00 00 02 71 81 + 39 00 00 00 00 00 02 70 81 + 39 00 00 00 00 00 02 6F 81 + 39 00 00 00 00 00 02 6E 81 + 39 00 00 00 00 00 02 6D 82 + 39 00 00 00 00 00 02 6C 82 + 39 00 00 00 00 00 02 6B 82 + 39 00 00 00 00 00 02 6A 82 + 39 00 00 00 00 00 02 69 82 + 39 00 00 00 00 00 02 68 81 + 39 00 00 00 00 00 02 67 81 + 39 00 00 00 00 00 02 66 82 + 39 00 00 00 00 00 02 65 82 + 39 00 00 00 00 00 02 64 82 + 39 00 00 00 00 00 02 63 83 + 39 00 00 00 00 00 02 62 83 + 39 00 00 00 00 00 02 61 83 + 39 00 00 00 00 00 02 60 83 + 39 00 00 00 00 00 02 5F 83 + 39 00 00 00 00 00 02 5E 82 + 39 00 00 00 00 00 02 5D 82 + 39 00 00 00 00 00 02 5C 82 + 39 00 00 00 00 00 02 5B 82 + 39 00 00 00 00 00 02 5A 82 + 39 00 00 00 00 00 02 59 82 + 39 00 00 00 00 00 02 58 82 + 39 00 00 00 00 00 02 57 83 + 39 00 00 00 00 00 02 56 83 + 39 00 00 00 00 00 02 55 83 + 39 00 00 00 00 00 02 54 83 + 39 00 00 00 00 00 02 53 83 + 39 00 00 00 00 00 02 52 83 + 39 00 00 00 00 00 02 51 83 + 39 00 00 00 00 00 02 50 82 + 39 00 00 00 00 00 02 4F 82 + 39 00 00 00 00 00 02 4E 81 + 39 00 00 00 00 00 02 4D 81 + 39 00 00 00 00 00 02 4C 81 + 39 00 00 00 00 00 02 4B 00 + 39 00 00 00 00 00 02 4A 81 + 39 00 00 00 00 00 02 49 81 + 39 00 00 00 00 00 02 48 82 + 39 00 00 00 00 00 02 47 82 + 39 00 00 00 00 00 02 46 83 + 39 00 00 00 00 00 02 45 83 + 39 00 00 00 00 00 02 44 84 + 39 00 00 00 00 00 02 43 84 + 39 00 00 00 00 00 02 42 84 + 39 00 00 00 00 00 02 41 85 + 39 00 00 00 00 00 02 40 85 + 39 00 00 00 00 00 02 3F 85 + 39 00 00 00 00 00 02 3E 85 + 39 00 00 00 00 00 02 3D 85 + 39 00 00 00 00 00 02 3C 85 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 39 84 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 82 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 0E 82 + 39 00 00 00 00 00 02 0D 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 83 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 11 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 11 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 11 + 39 00 00 00 00 00 02 7E 11 + 39 00 00 00 00 00 02 7D 11 + 39 00 00 00 00 00 02 7C 11 + 39 00 00 00 00 00 02 7B 11 + 39 00 00 00 00 00 02 7A 10 + 39 00 00 00 00 00 02 79 10 + 39 00 00 00 00 00 02 78 10 + 39 00 00 00 00 00 02 77 10 + 39 00 00 00 00 00 02 76 10 + 39 00 00 00 00 00 02 75 10 + 39 00 00 00 00 00 02 74 11 + 39 00 00 00 00 00 02 73 10 + 39 00 00 00 00 00 02 72 10 + 39 00 00 00 00 00 02 71 11 + 39 00 00 00 00 00 02 70 11 + 39 00 00 00 00 00 02 6F 10 + 39 00 00 00 00 00 02 6E 11 + 39 00 00 00 00 00 02 6D 11 + 39 00 00 00 00 00 02 6C 11 + 39 00 00 00 00 00 02 6B 11 + 39 00 00 00 00 00 02 6A 11 + 39 00 00 00 00 00 02 69 12 + 39 00 00 00 00 00 02 68 11 + 39 00 00 00 00 00 02 67 11 + 39 00 00 00 00 00 02 66 11 + 39 00 00 00 00 00 02 65 11 + 39 00 00 00 00 00 02 64 11 + 39 00 00 00 00 00 02 63 11 + 39 00 00 00 00 00 02 62 11 + 39 00 00 00 00 00 02 61 11 + 39 00 00 00 00 00 02 60 11 + 39 00 00 00 00 00 02 5F 11 + 39 00 00 00 00 00 02 5E 11 + 39 00 00 00 00 00 02 5D 11 + 39 00 00 00 00 00 02 5C 11 + 39 00 00 00 00 00 02 5B 11 + 39 00 00 00 00 00 02 5A 11 + 39 00 00 00 00 00 02 59 11 + 39 00 00 00 00 00 02 58 11 + 39 00 00 00 00 00 02 57 11 + 39 00 00 00 00 00 02 56 11 + 39 00 00 00 00 00 02 55 10 + 39 00 00 00 00 00 02 54 10 + 39 00 00 00 00 00 02 53 10 + 39 00 00 00 00 00 02 52 10 + 39 00 00 00 00 00 02 51 10 + 39 00 00 00 00 00 02 50 10 + 39 00 00 00 00 00 02 4F 0F + 39 00 00 00 00 00 02 4E 0F + 39 00 00 00 00 00 02 4D 0F + 39 00 00 00 00 00 02 4C 0F + 39 00 00 00 00 00 02 4B 0F + 39 00 00 00 00 00 02 4A 0F + 39 00 00 00 00 00 02 49 10 + 39 00 00 00 00 00 02 48 10 + 39 00 00 00 00 00 02 47 10 + 39 00 00 00 00 00 02 46 10 + 39 00 00 00 00 00 02 45 0F + 39 00 00 00 00 00 02 44 0F + 39 00 00 00 00 00 02 43 0F + 39 00 00 00 00 00 02 42 0F + 39 00 00 00 00 00 02 41 0F + 39 00 00 00 00 00 02 40 0F + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 3E 0E + 39 00 00 00 00 00 02 3D 0E + 39 00 00 00 00 00 02 3C 0D + 39 00 00 00 00 00 02 3B 0D + 39 00 00 00 00 00 02 3A 0C + 39 00 00 00 00 00 02 39 0C + 39 00 00 00 00 00 02 38 0B + 39 00 00 00 00 00 02 37 0A + 39 00 00 00 00 00 02 36 0A + 39 00 00 00 00 00 02 35 09 + 39 00 00 00 00 00 02 34 09 + 39 00 00 00 00 00 02 33 08 + 39 00 00 00 00 00 02 32 08 + 39 00 00 00 00 00 02 31 07 + 39 00 00 00 00 00 02 30 07 + 39 00 00 00 00 00 02 2F 08 + 39 00 00 00 00 00 02 2E 08 + 39 00 00 00 00 00 02 2D 08 + 39 00 00 00 00 00 02 2C 08 + 39 00 00 00 00 00 02 2B 08 + 39 00 00 00 00 00 02 2A 08 + 39 00 00 00 00 00 02 29 08 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 07 + 39 00 00 00 00 00 02 25 07 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 07 + 39 00 00 00 00 00 02 22 07 + 39 00 00 00 00 00 02 21 08 + 39 00 00 00 00 00 02 20 07 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 03 + 39 00 00 00 00 00 02 11 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 02 + 39 00 00 00 00 00 02 0E 02 + 39 00 00 00 00 00 02 0D 02 + 39 00 00 00 00 00 02 0C 02 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0A 02 + 39 00 00 00 00 00 02 09 02 + 39 00 00 00 00 00 02 08 02 + 39 00 00 00 00 00 02 07 02 + 39 00 00 00 00 00 02 06 02 + 39 00 00 00 00 00 02 05 02 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7D 00 + 39 00 00 00 00 00 02 7C 00 + 39 00 00 00 00 00 02 7B 00 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 78 01 + 39 00 00 00 00 00 02 77 01 + 39 00 00 00 00 00 02 76 01 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 73 02 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 71 02 + 39 00 00 00 00 00 02 70 02 + 39 00 00 00 00 00 02 6F 03 + 39 00 00 00 00 00 02 6E 03 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 06 + 39 00 00 00 00 00 02 5C 06 + 39 00 00 00 00 00 02 5B 06 + 39 00 00 00 00 00 02 5A 06 + 39 00 00 00 00 00 02 59 06 + 39 00 00 00 00 00 02 58 06 + 39 00 00 00 00 00 02 57 06 + 39 00 00 00 00 00 02 56 06 + 39 00 00 00 00 00 02 55 06 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 53 07 + 39 00 00 00 00 00 02 52 07 + 39 00 00 00 00 00 02 51 06 + 39 00 00 00 00 00 02 50 06 + 39 00 00 00 00 00 02 4F 06 + 39 00 00 00 00 00 02 4E 06 + 39 00 00 00 00 00 02 4D 07 + 39 00 00 00 00 00 02 4C 07 + 39 00 00 00 00 00 02 4B 08 + 39 00 00 00 00 00 02 4A 08 + 39 00 00 00 00 00 02 49 09 + 39 00 00 00 00 00 02 48 08 + 39 00 00 00 00 00 02 47 08 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 39 05 + 39 00 00 00 00 00 02 38 05 + 39 00 00 00 00 00 02 37 05 + 39 00 00 00 00 00 02 36 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 32 03 + 39 00 00 00 00 00 02 31 03 + 39 00 00 00 00 00 02 30 04 + 39 00 00 00 00 00 02 2F 04 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2A 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 24 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 06 + 39 00 00 00 00 00 02 21 06 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 04 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 64 + 39 00 00 00 00 00 02 D1 54 + 39 00 00 00 00 00 02 D0 28 + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 CE 4F + 39 00 00 00 00 00 02 CD 1A + 39 00 00 00 00 00 02 CC 1C + 39 00 00 00 00 00 02 CB 8B + 39 00 00 00 00 00 02 CA 29 + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 98 + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1E + 39 00 00 00 00 00 02 C5 2A + 39 00 00 00 00 00 02 C4 17 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C2 2B + 39 00 00 00 00 00 02 C1 1C + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 65 + 39 00 00 00 00 00 02 B1 55 + 39 00 00 00 00 00 02 B0 27 + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AC 1B + 39 00 00 00 00 00 02 AB 8C + 39 00 00 00 00 00 02 AA 29 + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 99 + 39 00 00 00 00 00 02 A7 1F + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A3 14 + 39 00 00 00 00 00 02 A2 2C + 39 00 00 00 00 00 02 A1 1D + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 75 82 + 39 00 00 00 00 00 02 74 82 + 39 00 00 00 00 00 02 73 82 + 39 00 00 00 00 00 02 72 81 + 39 00 00 00 00 00 02 71 81 + 39 00 00 00 00 00 02 70 81 + 39 00 00 00 00 00 02 6F 81 + 39 00 00 00 00 00 02 6E 00 + 39 00 00 00 00 00 02 6D 00 + 39 00 00 00 00 00 02 6C 81 + 39 00 00 00 00 00 02 6B 81 + 39 00 00 00 00 00 02 6A 00 + 39 00 00 00 00 00 02 69 00 + 39 00 00 00 00 00 02 68 00 + 39 00 00 00 00 00 02 67 00 + 39 00 00 00 00 00 02 66 00 + 39 00 00 00 00 00 02 65 00 + 39 00 00 00 00 00 02 64 00 + 39 00 00 00 00 00 02 63 00 + 39 00 00 00 00 00 02 62 01 + 39 00 00 00 00 00 02 61 01 + 39 00 00 00 00 00 02 60 01 + 39 00 00 00 00 00 02 5F 01 + 39 00 00 00 00 00 02 5E 01 + 39 00 00 00 00 00 02 5D 01 + 39 00 00 00 00 00 02 5C 01 + 39 00 00 00 00 00 02 5B 01 + 39 00 00 00 00 00 02 5A 01 + 39 00 00 00 00 00 02 59 01 + 39 00 00 00 00 00 02 58 01 + 39 00 00 00 00 00 02 57 01 + 39 00 00 00 00 00 02 56 01 + 39 00 00 00 00 00 02 55 01 + 39 00 00 00 00 00 02 54 01 + 39 00 00 00 00 00 02 53 01 + 39 00 00 00 00 00 02 52 01 + 39 00 00 00 00 00 02 51 01 + 39 00 00 00 00 00 02 50 01 + 39 00 00 00 00 00 02 4F 01 + 39 00 00 00 00 00 02 4E 01 + 39 00 00 00 00 00 02 4D 02 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4B 03 + 39 00 00 00 00 00 02 4A 03 + 39 00 00 00 00 00 02 49 03 + 39 00 00 00 00 00 02 48 03 + 39 00 00 00 00 00 02 47 03 + 39 00 00 00 00 00 02 46 03 + 39 00 00 00 00 00 02 45 03 + 39 00 00 00 00 00 02 44 03 + 39 00 00 00 00 00 02 43 03 + 39 00 00 00 00 00 02 42 03 + 39 00 00 00 00 00 02 41 03 + 39 00 00 00 00 00 02 40 02 + 39 00 00 00 00 00 02 3F 02 + 39 00 00 00 00 00 02 3E 02 + 39 00 00 00 00 00 02 3D 02 + 39 00 00 00 00 00 02 3C 01 + 39 00 00 00 00 00 02 3B 01 + 39 00 00 00 00 00 02 3A 00 + 39 00 00 00 00 00 02 39 00 + 39 00 00 00 00 00 02 38 81 + 39 00 00 00 00 00 02 37 81 + 39 00 00 00 00 00 02 36 81 + 39 00 00 00 00 00 02 35 81 + 39 00 00 00 00 00 02 34 82 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 30 81 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2D 00 + 39 00 00 00 00 00 02 2C 00 + 39 00 00 00 00 00 02 2B 00 + 39 00 00 00 00 00 02 2A 00 + 39 00 00 00 00 00 02 29 00 + 39 00 00 00 00 00 02 28 00 + 39 00 00 00 00 00 02 27 00 + 39 00 00 00 00 00 02 26 00 + 39 00 00 00 00 00 02 25 00 + 39 00 00 00 00 00 02 24 01 + 39 00 00 00 00 00 02 23 01 + 39 00 00 00 00 00 02 22 01 + 39 00 00 00 00 00 02 21 00 + 39 00 00 00 00 00 02 20 00 + 39 00 00 00 00 00 02 1F 01 + 39 00 00 00 00 00 02 1E 01 + 39 00 00 00 00 00 02 1D 01 + 39 00 00 00 00 00 02 1C 01 + 39 00 00 00 00 00 02 1B 00 + 39 00 00 00 00 00 02 1A 00 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 18 81 + 39 00 00 00 00 00 02 17 00 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 15 01 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 07 01 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + + + qcom,mdss-dsi-panel-gamma-command-state = "dsi_hs_mode"; + + qcom,mdss-dsi-panel-eye-command01 = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 09 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2E 07 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 06 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 33 05 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 37 08 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 39 08 + 39 00 00 00 00 00 02 3A 08 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 66 06 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 6A 05 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 05 + 39 00 00 00 00 00 02 73 04 + 39 00 00 00 00 00 02 74 04 + 39 00 00 00 00 00 02 75 04 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 77 03 + 39 00 00 00 00 00 02 78 03 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7F 01 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 10 83 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 12 84 + 39 00 00 00 00 00 02 13 84 + 39 00 00 00 00 00 02 14 84 + 39 00 00 00 00 00 02 15 84 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 85 + 39 00 00 00 00 00 02 19 85 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 1B 85 + 39 00 00 00 00 00 02 1C 85 + 39 00 00 00 00 00 02 1D 85 + 39 00 00 00 00 00 02 1E 85 + 39 00 00 00 00 00 02 1F 85 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 21 85 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 25 87 + 39 00 00 00 00 00 02 26 87 + 39 00 00 00 00 00 02 27 85 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 84 + 39 00 00 00 00 00 02 2A 84 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2C 86 + 39 00 00 00 00 00 02 2D 86 + 39 00 00 00 00 00 02 2E 86 + 39 00 00 00 00 00 02 2F 87 + 39 00 00 00 00 00 02 30 87 + 39 00 00 00 00 00 02 31 88 + 39 00 00 00 00 00 02 32 88 + 39 00 00 00 00 00 02 33 88 + 39 00 00 00 00 00 02 34 89 + 39 00 00 00 00 00 02 35 8A + 39 00 00 00 00 00 02 36 8A + 39 00 00 00 00 00 02 37 8B + 39 00 00 00 00 00 02 38 8B + 39 00 00 00 00 00 02 39 8B + 39 00 00 00 00 00 02 3A 8A + 39 00 00 00 00 00 02 3B 89 + 39 00 00 00 00 00 02 3C 89 + 39 00 00 00 00 00 02 3D 89 + 39 00 00 00 00 00 02 3E 89 + 39 00 00 00 00 00 02 3F 8A + 39 00 00 00 00 00 02 40 8A + 39 00 00 00 00 00 02 41 8A + 39 00 00 00 00 00 02 42 8A + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 44 8A + 39 00 00 00 00 00 02 45 8B + 39 00 00 00 00 00 02 46 8B + 39 00 00 00 00 00 02 47 8B + 39 00 00 00 00 00 02 48 8C + 39 00 00 00 00 00 02 49 8C + 39 00 00 00 00 00 02 4A 8C + 39 00 00 00 00 00 02 4B 8D + 39 00 00 00 00 00 02 4C 8D + 39 00 00 00 00 00 02 4D 8E + 39 00 00 00 00 00 02 4E 8E + 39 00 00 00 00 00 02 4F 8F + 39 00 00 00 00 00 02 50 90 + 39 00 00 00 00 00 02 51 90 + 39 00 00 00 00 00 02 52 90 + 39 00 00 00 00 00 02 53 91 + 39 00 00 00 00 00 02 54 91 + 39 00 00 00 00 00 02 55 92 + 39 00 00 00 00 00 02 56 92 + 39 00 00 00 00 00 02 57 92 + 39 00 00 00 00 00 02 58 92 + 39 00 00 00 00 00 02 59 92 + 39 00 00 00 00 00 02 5A 92 + 39 00 00 00 00 00 02 5B 92 + 39 00 00 00 00 00 02 5C 92 + 39 00 00 00 00 00 02 5D 92 + 39 00 00 00 00 00 02 5E 92 + 39 00 00 00 00 00 02 5F 92 + 39 00 00 00 00 00 02 60 92 + 39 00 00 00 00 00 02 61 92 + 39 00 00 00 00 00 02 62 92 + 39 00 00 00 00 00 02 63 92 + 39 00 00 00 00 00 02 64 92 + 39 00 00 00 00 00 02 65 93 + 39 00 00 00 00 00 02 66 93 + 39 00 00 00 00 00 02 67 93 + 39 00 00 00 00 00 02 68 93 + 39 00 00 00 00 00 02 69 93 + 39 00 00 00 00 00 02 6A 94 + 39 00 00 00 00 00 02 6B 93 + 39 00 00 00 00 00 02 6C 94 + 39 00 00 00 00 00 02 6D 94 + 39 00 00 00 00 00 02 6E 94 + 39 00 00 00 00 00 02 6F 94 + 39 00 00 00 00 00 02 70 94 + 39 00 00 00 00 00 02 71 94 + 39 00 00 00 00 00 02 72 94 + 39 00 00 00 00 00 02 73 94 + 39 00 00 00 00 00 02 74 95 + 39 00 00 00 00 00 02 75 95 + 39 00 00 00 00 00 02 76 95 + 39 00 00 00 00 00 02 77 95 + 39 00 00 00 00 00 02 78 96 + 39 00 00 00 00 00 02 79 96 + 39 00 00 00 00 00 02 7A 97 + 39 00 00 00 00 00 02 7B 97 + 39 00 00 00 00 00 02 7C 98 + 39 00 00 00 00 00 02 7D 98 + 39 00 00 00 00 00 02 7E 99 + 39 00 00 00 00 00 02 7F 99 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0D 84 + 39 00 00 00 00 00 02 0E 84 + 39 00 00 00 00 00 02 0F 84 + 39 00 00 00 00 00 02 10 84 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 12 85 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 14 85 + 39 00 00 00 00 00 02 15 85 + 39 00 00 00 00 00 02 16 86 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 87 + 39 00 00 00 00 00 02 19 87 + 39 00 00 00 00 00 02 1A 87 + 39 00 00 00 00 00 02 1B 87 + 39 00 00 00 00 00 02 1C 87 + 39 00 00 00 00 00 02 1D 87 + 39 00 00 00 00 00 02 1E 87 + 39 00 00 00 00 00 02 1F 87 + 39 00 00 00 00 00 02 20 87 + 39 00 00 00 00 00 02 21 87 + 39 00 00 00 00 00 02 22 88 + 39 00 00 00 00 00 02 23 88 + 39 00 00 00 00 00 02 24 89 + 39 00 00 00 00 00 02 25 89 + 39 00 00 00 00 00 02 26 8A + 39 00 00 00 00 00 02 27 89 + 39 00 00 00 00 00 02 28 87 + 39 00 00 00 00 00 02 29 87 + 39 00 00 00 00 00 02 2A 87 + 39 00 00 00 00 00 02 2B 88 + 39 00 00 00 00 00 02 2C 89 + 39 00 00 00 00 00 02 2D 89 + 39 00 00 00 00 00 02 2E 8A + 39 00 00 00 00 00 02 2F 8A + 39 00 00 00 00 00 02 30 8A + 39 00 00 00 00 00 02 31 8B + 39 00 00 00 00 00 02 32 8B + 39 00 00 00 00 00 02 33 8C + 39 00 00 00 00 00 02 34 8C + 39 00 00 00 00 00 02 35 8D + 39 00 00 00 00 00 02 36 8E + 39 00 00 00 00 00 02 37 8F + 39 00 00 00 00 00 02 38 8F + 39 00 00 00 00 00 02 39 8F + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 3B 8F + 39 00 00 00 00 00 02 3C 8E + 39 00 00 00 00 00 02 3D 8D + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3F 8E + 39 00 00 00 00 00 02 40 8F + 39 00 00 00 00 00 02 41 8F + 39 00 00 00 00 00 02 42 8F + 39 00 00 00 00 00 02 43 90 + 39 00 00 00 00 00 02 44 90 + 39 00 00 00 00 00 02 45 90 + 39 00 00 00 00 00 02 46 90 + 39 00 00 00 00 00 02 47 91 + 39 00 00 00 00 00 02 48 91 + 39 00 00 00 00 00 02 49 91 + 39 00 00 00 00 00 02 4A 92 + 39 00 00 00 00 00 02 4B 92 + 39 00 00 00 00 00 02 4C 93 + 39 00 00 00 00 00 02 4D 93 + 39 00 00 00 00 00 02 4E 94 + 39 00 00 00 00 00 02 4F 94 + 39 00 00 00 00 00 02 50 95 + 39 00 00 00 00 00 02 51 96 + 39 00 00 00 00 00 02 52 96 + 39 00 00 00 00 00 02 53 97 + 39 00 00 00 00 00 02 54 97 + 39 00 00 00 00 00 02 55 98 + 39 00 00 00 00 00 02 56 99 + 39 00 00 00 00 00 02 57 99 + 39 00 00 00 00 00 02 58 9A + 39 00 00 00 00 00 02 59 9A + 39 00 00 00 00 00 02 5A 9A + 39 00 00 00 00 00 02 5B 9A + 39 00 00 00 00 00 02 5C 9A + 39 00 00 00 00 00 02 5D 9A + 39 00 00 00 00 00 02 5E 9A + 39 00 00 00 00 00 02 5F 9A + 39 00 00 00 00 00 02 60 9A + 39 00 00 00 00 00 02 61 9B + 39 00 00 00 00 00 02 62 9B + 39 00 00 00 00 00 02 63 9B + 39 00 00 00 00 00 02 64 9B + 39 00 00 00 00 00 02 65 9B + 39 00 00 00 00 00 02 66 9B + 39 00 00 00 00 00 02 67 9C + 39 00 00 00 00 00 02 68 9C + 39 00 00 00 00 00 02 69 9C + 39 00 00 00 00 00 02 6A 9C + 39 00 00 00 00 00 02 6B 9D + 39 00 00 00 00 00 02 6C 9D + 39 00 00 00 00 00 02 6D 9D + 39 00 00 00 00 00 02 6E 9D + 39 00 00 00 00 00 02 6F 9E + 39 00 00 00 00 00 02 70 9E + 39 00 00 00 00 00 02 71 9E + 39 00 00 00 00 00 02 72 9F + 39 00 00 00 00 00 02 73 9F + 39 00 00 00 00 00 02 74 9F + 39 00 00 00 00 00 02 75 9F + 39 00 00 00 00 00 02 76 A0 + 39 00 00 00 00 00 02 77 A0 + 39 00 00 00 00 00 02 78 A1 + 39 00 00 00 00 00 02 79 A1 + 39 00 00 00 00 00 02 7A A1 + 39 00 00 00 00 00 02 7B A1 + 39 00 00 00 00 00 02 7C A2 + 39 00 00 00 00 00 02 7D A3 + 39 00 00 00 00 00 02 7E A3 + 39 00 00 00 00 00 02 7F A4 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0E 01 + 39 00 00 00 00 00 02 0F 01 + 39 00 00 00 00 00 02 10 01 + 39 00 00 00 00 00 02 11 01 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 82 + 39 00 00 00 00 00 02 28 82 + 39 00 00 00 00 00 02 29 81 + 39 00 00 00 00 00 02 2A 81 + 39 00 00 00 00 00 02 2B 81 + 39 00 00 00 00 00 02 2C 81 + 39 00 00 00 00 00 02 2D 81 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 35 83 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 67 82 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6C 84 + 39 00 00 00 00 00 02 6D 84 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 70 83 + 39 00 00 00 00 00 02 71 83 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7F 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 9A + 39 00 00 00 00 00 02 02 9A + 39 00 00 00 00 00 02 03 9A + 39 00 00 00 00 00 02 04 9B + 39 00 00 00 00 00 02 05 9B + 39 00 00 00 00 00 02 06 9B + 39 00 00 00 00 00 02 07 9C + 39 00 00 00 00 00 02 08 9C + 39 00 00 00 00 00 02 09 9C + 39 00 00 00 00 00 02 0A 9C + 39 00 00 00 00 00 02 0B 9C + 39 00 00 00 00 00 02 0C 9D + 39 00 00 00 00 00 02 0D 9D + 39 00 00 00 00 00 02 0E 9D + 39 00 00 00 00 00 02 0F 9D + 39 00 00 00 00 00 02 10 9D + 39 00 00 00 00 00 02 11 9E + 39 00 00 00 00 00 02 12 9E + 39 00 00 00 00 00 02 13 9E + 39 00 00 00 00 00 02 14 9E + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 9E + 39 00 00 00 00 00 02 17 9E + 39 00 00 00 00 00 02 18 9E + 39 00 00 00 00 00 02 19 9E + 39 00 00 00 00 00 02 1A 9F + 39 00 00 00 00 00 02 1B 9F + 39 00 00 00 00 00 02 1C A0 + 39 00 00 00 00 00 02 1D A0 + 39 00 00 00 00 00 02 1E A1 + 39 00 00 00 00 00 02 1F A1 + 39 00 00 00 00 00 02 20 A1 + 39 00 00 00 00 00 02 21 A2 + 39 00 00 00 00 00 02 22 A2 + 39 00 00 00 00 00 02 23 A2 + 39 00 00 00 00 00 02 24 A3 + 39 00 00 00 00 00 02 25 A3 + 39 00 00 00 00 00 02 26 A3 + 39 00 00 00 00 00 02 27 A3 + 39 00 00 00 00 00 02 28 A3 + 39 00 00 00 00 00 02 29 A3 + 39 00 00 00 00 00 02 2A A4 + 39 00 00 00 00 00 02 2B A4 + 39 00 00 00 00 00 02 2C A4 + 39 00 00 00 00 00 02 2D A4 + 39 00 00 00 00 00 02 2E A5 + 39 00 00 00 00 00 02 2F A4 + 39 00 00 00 00 00 02 30 A4 + 39 00 00 00 00 00 02 31 A3 + 39 00 00 00 00 00 02 32 A4 + 39 00 00 00 00 00 02 33 A4 + 39 00 00 00 00 00 02 34 A3 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 A3 + 39 00 00 00 00 00 02 37 A3 + 39 00 00 00 00 00 02 38 A3 + 39 00 00 00 00 00 02 39 A4 + 39 00 00 00 00 00 02 3A A4 + 39 00 00 00 00 00 02 3B A5 + 39 00 00 00 00 00 02 3C A6 + 39 00 00 00 00 00 02 3D A6 + 39 00 00 00 00 00 02 3E A7 + 39 00 00 00 00 00 02 3F A7 + 39 00 00 00 00 00 02 40 A8 + 39 00 00 00 00 00 02 41 A8 + 39 00 00 00 00 00 02 42 A9 + 39 00 00 00 00 00 02 43 A9 + 39 00 00 00 00 00 02 44 AA + 39 00 00 00 00 00 02 45 AA + 39 00 00 00 00 00 02 46 AA + 39 00 00 00 00 00 02 47 AB + 39 00 00 00 00 00 02 48 AB + 39 00 00 00 00 00 02 49 AB + 39 00 00 00 00 00 02 4A AB + 39 00 00 00 00 00 02 4B AB + 39 00 00 00 00 00 02 4C AB + 39 00 00 00 00 00 02 4D AB + 39 00 00 00 00 00 02 4E AB + 39 00 00 00 00 00 02 4F AB + 39 00 00 00 00 00 02 50 AB + 39 00 00 00 00 00 02 51 AB + 39 00 00 00 00 00 02 52 AB + 39 00 00 00 00 00 02 53 AA + 39 00 00 00 00 00 02 54 AA + 39 00 00 00 00 00 02 55 AA + 39 00 00 00 00 00 02 56 AA + 39 00 00 00 00 00 02 57 AA + 39 00 00 00 00 00 02 58 AB + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 5A AC + 39 00 00 00 00 00 02 5B AC + 39 00 00 00 00 00 02 5C AC + 39 00 00 00 00 00 02 5D AD + 39 00 00 00 00 00 02 5E AD + 39 00 00 00 00 00 02 5F AD + 39 00 00 00 00 00 02 60 AD + 39 00 00 00 00 00 02 61 AD + 39 00 00 00 00 00 02 62 AD + 39 00 00 00 00 00 02 63 AD + 39 00 00 00 00 00 02 64 AC + 39 00 00 00 00 00 02 65 AC + 39 00 00 00 00 00 02 66 AC + 39 00 00 00 00 00 02 67 AC + 39 00 00 00 00 00 02 68 AD + 39 00 00 00 00 00 02 69 AD + 39 00 00 00 00 00 02 6A AE + 39 00 00 00 00 00 02 6B AE + 39 00 00 00 00 00 02 6C AE + 39 00 00 00 00 00 02 6D AE + 39 00 00 00 00 00 02 6E AE + 39 00 00 00 00 00 02 6F AE + 39 00 00 00 00 00 02 70 AE + 39 00 00 00 00 00 02 71 AE + 39 00 00 00 00 00 02 72 AE + 39 00 00 00 00 00 02 73 AE + 39 00 00 00 00 00 02 74 AF + 39 00 00 00 00 00 02 75 AF + 39 00 00 00 00 00 02 76 B0 + 39 00 00 00 00 00 02 77 B0 + 39 00 00 00 00 00 02 78 B0 + 39 00 00 00 00 00 02 79 B0 + 39 00 00 00 00 00 02 7A B0 + 39 00 00 00 00 00 02 7B B0 + 39 00 00 00 00 00 02 7C B0 + 39 00 00 00 00 00 02 7D B0 + 39 00 00 00 00 00 02 7E B0 + 39 00 00 00 00 00 02 7F B0 + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 A5 + 39 00 00 00 00 00 02 02 A6 + 39 00 00 00 00 00 02 03 A6 + 39 00 00 00 00 00 02 04 A7 + 39 00 00 00 00 00 02 05 A7 + 39 00 00 00 00 00 02 06 A7 + 39 00 00 00 00 00 02 07 A8 + 39 00 00 00 00 00 02 08 A8 + 39 00 00 00 00 00 02 09 A9 + 39 00 00 00 00 00 02 0A A9 + 39 00 00 00 00 00 02 0B AA + 39 00 00 00 00 00 02 0C AA + 39 00 00 00 00 00 02 0D AB + 39 00 00 00 00 00 02 0E AB + 39 00 00 00 00 00 02 0F AB + 39 00 00 00 00 00 02 10 AC + 39 00 00 00 00 00 02 11 AC + 39 00 00 00 00 00 02 12 AC + 39 00 00 00 00 00 02 13 AD + 39 00 00 00 00 00 02 14 AD + 39 00 00 00 00 00 02 15 AD + 39 00 00 00 00 00 02 16 AE + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 18 AE + 39 00 00 00 00 00 02 19 AE + 39 00 00 00 00 00 02 1A AE + 39 00 00 00 00 00 02 1B AF + 39 00 00 00 00 00 02 1C AF + 39 00 00 00 00 00 02 1D AF + 39 00 00 00 00 00 02 1E B0 + 39 00 00 00 00 00 02 1F B1 + 39 00 00 00 00 00 02 20 B1 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 22 B3 + 39 00 00 00 00 00 02 23 B3 + 39 00 00 00 00 00 02 24 B4 + 39 00 00 00 00 00 02 25 B4 + 39 00 00 00 00 00 02 26 B5 + 39 00 00 00 00 00 02 27 B5 + 39 00 00 00 00 00 02 28 B6 + 39 00 00 00 00 00 02 29 B6 + 39 00 00 00 00 00 02 2A B6 + 39 00 00 00 00 00 02 2B B7 + 39 00 00 00 00 00 02 2C B7 + 39 00 00 00 00 00 02 2D B8 + 39 00 00 00 00 00 02 2E B8 + 39 00 00 00 00 00 02 2F B8 + 39 00 00 00 00 00 02 30 B8 + 39 00 00 00 00 00 02 31 B9 + 39 00 00 00 00 00 02 32 BA + 39 00 00 00 00 00 02 33 BA + 39 00 00 00 00 00 02 34 BA + 39 00 00 00 00 00 02 35 BA + 39 00 00 00 00 00 02 36 BA + 39 00 00 00 00 00 02 37 BA + 39 00 00 00 00 00 02 38 BA + 39 00 00 00 00 00 02 39 BA + 39 00 00 00 00 00 02 3A BA + 39 00 00 00 00 00 02 3B BB + 39 00 00 00 00 00 02 3C BB + 39 00 00 00 00 00 02 3D BB + 39 00 00 00 00 00 02 3E BB + 39 00 00 00 00 00 02 3F BC + 39 00 00 00 00 00 02 40 BD + 39 00 00 00 00 00 02 41 BE + 39 00 00 00 00 00 02 42 BE + 39 00 00 00 00 00 02 43 BF + 39 00 00 00 00 00 02 44 C0 + 39 00 00 00 00 00 02 45 C1 + 39 00 00 00 00 00 02 46 C2 + 39 00 00 00 00 00 02 47 C2 + 39 00 00 00 00 00 02 48 C3 + 39 00 00 00 00 00 02 49 C4 + 39 00 00 00 00 00 02 4A C5 + 39 00 00 00 00 00 02 4B C5 + 39 00 00 00 00 00 02 4C C6 + 39 00 00 00 00 00 02 4D C6 + 39 00 00 00 00 00 02 4E C7 + 39 00 00 00 00 00 02 4F C7 + 39 00 00 00 00 00 02 50 C8 + 39 00 00 00 00 00 02 51 C8 + 39 00 00 00 00 00 02 52 C8 + 39 00 00 00 00 00 02 53 C9 + 39 00 00 00 00 00 02 54 C9 + 39 00 00 00 00 00 02 55 C9 + 39 00 00 00 00 00 02 56 CA + 39 00 00 00 00 00 02 57 CA + 39 00 00 00 00 00 02 58 CA + 39 00 00 00 00 00 02 59 CA + 39 00 00 00 00 00 02 5A CA + 39 00 00 00 00 00 02 5B CA + 39 00 00 00 00 00 02 5C CA + 39 00 00 00 00 00 02 5D CA + 39 00 00 00 00 00 02 5E CB + 39 00 00 00 00 00 02 5F CB + 39 00 00 00 00 00 02 60 CC + 39 00 00 00 00 00 02 61 CD + 39 00 00 00 00 00 02 62 CE + 39 00 00 00 00 00 02 63 CE + 39 00 00 00 00 00 02 64 CF + 39 00 00 00 00 00 02 65 D0 + 39 00 00 00 00 00 02 66 D0 + 39 00 00 00 00 00 02 67 D1 + 39 00 00 00 00 00 02 68 D1 + 39 00 00 00 00 00 02 69 D2 + 39 00 00 00 00 00 02 6A D2 + 39 00 00 00 00 00 02 6B D2 + 39 00 00 00 00 00 02 6C D3 + 39 00 00 00 00 00 02 6D D3 + 39 00 00 00 00 00 02 6E D3 + 39 00 00 00 00 00 02 6F D3 + 39 00 00 00 00 00 02 70 D3 + 39 00 00 00 00 00 02 71 D4 + 39 00 00 00 00 00 02 72 D5 + 39 00 00 00 00 00 02 73 D6 + 39 00 00 00 00 00 02 74 D7 + 39 00 00 00 00 00 02 75 D7 + 39 00 00 00 00 00 02 76 D8 + 39 00 00 00 00 00 02 77 D9 + 39 00 00 00 00 00 02 78 D9 + 39 00 00 00 00 00 02 79 DA + 39 00 00 00 00 00 02 7A DA + 39 00 00 00 00 00 02 7B DB + 39 00 00 00 00 00 02 7C DB + 39 00 00 00 00 00 02 7D DB + 39 00 00 00 00 00 02 7E DC + 39 00 00 00 00 00 02 7F DD + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 99 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 99 + 39 00 00 00 00 00 02 7F B0 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F A4 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 A5 + 39 00 00 00 00 00 02 7F DD + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F DD + 39 00 00 00 00 00 02 7E DC + 39 00 00 00 00 00 02 7D DB + 39 00 00 00 00 00 02 7C DB + 39 00 00 00 00 00 02 7B DB + 39 00 00 00 00 00 02 7A DA + 39 00 00 00 00 00 02 79 DA + 39 00 00 00 00 00 02 78 D9 + 39 00 00 00 00 00 02 77 D9 + 39 00 00 00 00 00 02 76 D8 + 39 00 00 00 00 00 02 75 D7 + 39 00 00 00 00 00 02 74 D7 + 39 00 00 00 00 00 02 73 D6 + 39 00 00 00 00 00 02 72 D5 + 39 00 00 00 00 00 02 71 D4 + 39 00 00 00 00 00 02 70 D3 + 39 00 00 00 00 00 02 6F D3 + 39 00 00 00 00 00 02 6E D3 + 39 00 00 00 00 00 02 6D D3 + 39 00 00 00 00 00 02 6C D3 + 39 00 00 00 00 00 02 6B D2 + 39 00 00 00 00 00 02 6A D2 + 39 00 00 00 00 00 02 69 D2 + 39 00 00 00 00 00 02 68 D1 + 39 00 00 00 00 00 02 67 D1 + 39 00 00 00 00 00 02 66 D0 + 39 00 00 00 00 00 02 65 D0 + 39 00 00 00 00 00 02 64 CF + 39 00 00 00 00 00 02 63 CE + 39 00 00 00 00 00 02 62 CE + 39 00 00 00 00 00 02 61 CD + 39 00 00 00 00 00 02 60 CC + 39 00 00 00 00 00 02 5F CB + 39 00 00 00 00 00 02 5E CB + 39 00 00 00 00 00 02 5D CA + 39 00 00 00 00 00 02 5C CA + 39 00 00 00 00 00 02 5B CA + 39 00 00 00 00 00 02 5A CA + 39 00 00 00 00 00 02 59 CA + 39 00 00 00 00 00 02 58 CA + 39 00 00 00 00 00 02 57 CA + 39 00 00 00 00 00 02 56 CA + 39 00 00 00 00 00 02 55 C9 + 39 00 00 00 00 00 02 54 C9 + 39 00 00 00 00 00 02 53 C9 + 39 00 00 00 00 00 02 52 C8 + 39 00 00 00 00 00 02 51 C8 + 39 00 00 00 00 00 02 50 C8 + 39 00 00 00 00 00 02 4F C7 + 39 00 00 00 00 00 02 4E C7 + 39 00 00 00 00 00 02 4D C6 + 39 00 00 00 00 00 02 4C C6 + 39 00 00 00 00 00 02 4B C5 + 39 00 00 00 00 00 02 4A C5 + 39 00 00 00 00 00 02 49 C4 + 39 00 00 00 00 00 02 48 C3 + 39 00 00 00 00 00 02 47 C2 + 39 00 00 00 00 00 02 46 C2 + 39 00 00 00 00 00 02 45 C1 + 39 00 00 00 00 00 02 44 C0 + 39 00 00 00 00 00 02 43 BF + 39 00 00 00 00 00 02 42 BE + 39 00 00 00 00 00 02 41 BE + 39 00 00 00 00 00 02 40 BD + 39 00 00 00 00 00 02 3F BC + 39 00 00 00 00 00 02 3E BB + 39 00 00 00 00 00 02 3D BB + 39 00 00 00 00 00 02 3C BB + 39 00 00 00 00 00 02 3B BB + 39 00 00 00 00 00 02 3A BA + 39 00 00 00 00 00 02 39 BA + 39 00 00 00 00 00 02 38 BA + 39 00 00 00 00 00 02 37 BA + 39 00 00 00 00 00 02 36 BA + 39 00 00 00 00 00 02 35 BA + 39 00 00 00 00 00 02 34 BA + 39 00 00 00 00 00 02 33 BA + 39 00 00 00 00 00 02 32 BA + 39 00 00 00 00 00 02 31 B9 + 39 00 00 00 00 00 02 30 B8 + 39 00 00 00 00 00 02 2F B8 + 39 00 00 00 00 00 02 2E B8 + 39 00 00 00 00 00 02 2D B8 + 39 00 00 00 00 00 02 2C B7 + 39 00 00 00 00 00 02 2B B7 + 39 00 00 00 00 00 02 2A B6 + 39 00 00 00 00 00 02 29 B6 + 39 00 00 00 00 00 02 28 B6 + 39 00 00 00 00 00 02 27 B5 + 39 00 00 00 00 00 02 26 B5 + 39 00 00 00 00 00 02 25 B4 + 39 00 00 00 00 00 02 24 B4 + 39 00 00 00 00 00 02 23 B3 + 39 00 00 00 00 00 02 22 B3 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 20 B1 + 39 00 00 00 00 00 02 1F B1 + 39 00 00 00 00 00 02 1E B0 + 39 00 00 00 00 00 02 1D AF + 39 00 00 00 00 00 02 1C AF + 39 00 00 00 00 00 02 1B AF + 39 00 00 00 00 00 02 1A AE + 39 00 00 00 00 00 02 19 AE + 39 00 00 00 00 00 02 18 AE + 39 00 00 00 00 00 02 17 AE + 39 00 00 00 00 00 02 16 AE + 39 00 00 00 00 00 02 15 AD + 39 00 00 00 00 00 02 14 AD + 39 00 00 00 00 00 02 13 AD + 39 00 00 00 00 00 02 12 AC + 39 00 00 00 00 00 02 11 AC + 39 00 00 00 00 00 02 10 AC + 39 00 00 00 00 00 02 0F AB + 39 00 00 00 00 00 02 0E AB + 39 00 00 00 00 00 02 0D AB + 39 00 00 00 00 00 02 0C AA + 39 00 00 00 00 00 02 0B AA + 39 00 00 00 00 00 02 0A A9 + 39 00 00 00 00 00 02 09 A9 + 39 00 00 00 00 00 02 08 A8 + 39 00 00 00 00 00 02 07 A8 + 39 00 00 00 00 00 02 06 A7 + 39 00 00 00 00 00 02 05 A7 + 39 00 00 00 00 00 02 04 A7 + 39 00 00 00 00 00 02 03 A6 + 39 00 00 00 00 00 02 02 A6 + 39 00 00 00 00 00 02 01 A5 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 71 83 + 39 00 00 00 00 00 02 70 83 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6D 84 + 39 00 00 00 00 00 02 6C 84 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 67 82 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 35 83 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2D 81 + 39 00 00 00 00 00 02 2C 81 + 39 00 00 00 00 00 02 2B 81 + 39 00 00 00 00 00 02 2A 81 + 39 00 00 00 00 00 02 29 81 + 39 00 00 00 00 00 02 28 82 + 39 00 00 00 00 00 02 27 82 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 11 01 + 39 00 00 00 00 00 02 10 01 + 39 00 00 00 00 00 02 0F 01 + 39 00 00 00 00 00 02 0E 01 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 01 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F B0 + 39 00 00 00 00 00 02 7E B0 + 39 00 00 00 00 00 02 7D B0 + 39 00 00 00 00 00 02 7C B0 + 39 00 00 00 00 00 02 7B B0 + 39 00 00 00 00 00 02 7A B0 + 39 00 00 00 00 00 02 79 B0 + 39 00 00 00 00 00 02 78 B0 + 39 00 00 00 00 00 02 77 B0 + 39 00 00 00 00 00 02 76 B0 + 39 00 00 00 00 00 02 75 AF + 39 00 00 00 00 00 02 74 AF + 39 00 00 00 00 00 02 73 AE + 39 00 00 00 00 00 02 72 AE + 39 00 00 00 00 00 02 71 AE + 39 00 00 00 00 00 02 70 AE + 39 00 00 00 00 00 02 6F AE + 39 00 00 00 00 00 02 6E AE + 39 00 00 00 00 00 02 6D AE + 39 00 00 00 00 00 02 6C AE + 39 00 00 00 00 00 02 6B AE + 39 00 00 00 00 00 02 6A AE + 39 00 00 00 00 00 02 69 AD + 39 00 00 00 00 00 02 68 AD + 39 00 00 00 00 00 02 67 AC + 39 00 00 00 00 00 02 66 AC + 39 00 00 00 00 00 02 65 AC + 39 00 00 00 00 00 02 64 AC + 39 00 00 00 00 00 02 63 AD + 39 00 00 00 00 00 02 62 AD + 39 00 00 00 00 00 02 61 AD + 39 00 00 00 00 00 02 60 AD + 39 00 00 00 00 00 02 5F AD + 39 00 00 00 00 00 02 5E AD + 39 00 00 00 00 00 02 5D AD + 39 00 00 00 00 00 02 5C AC + 39 00 00 00 00 00 02 5B AC + 39 00 00 00 00 00 02 5A AC + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 58 AB + 39 00 00 00 00 00 02 57 AA + 39 00 00 00 00 00 02 56 AA + 39 00 00 00 00 00 02 55 AA + 39 00 00 00 00 00 02 54 AA + 39 00 00 00 00 00 02 53 AA + 39 00 00 00 00 00 02 52 AB + 39 00 00 00 00 00 02 51 AB + 39 00 00 00 00 00 02 50 AB + 39 00 00 00 00 00 02 4F AB + 39 00 00 00 00 00 02 4E AB + 39 00 00 00 00 00 02 4D AB + 39 00 00 00 00 00 02 4C AB + 39 00 00 00 00 00 02 4B AB + 39 00 00 00 00 00 02 4A AB + 39 00 00 00 00 00 02 49 AB + 39 00 00 00 00 00 02 48 AB + 39 00 00 00 00 00 02 47 AB + 39 00 00 00 00 00 02 46 AA + 39 00 00 00 00 00 02 45 AA + 39 00 00 00 00 00 02 44 AA + 39 00 00 00 00 00 02 43 A9 + 39 00 00 00 00 00 02 42 A9 + 39 00 00 00 00 00 02 41 A8 + 39 00 00 00 00 00 02 40 A8 + 39 00 00 00 00 00 02 3F A7 + 39 00 00 00 00 00 02 3E A7 + 39 00 00 00 00 00 02 3D A6 + 39 00 00 00 00 00 02 3C A6 + 39 00 00 00 00 00 02 3B A5 + 39 00 00 00 00 00 02 3A A4 + 39 00 00 00 00 00 02 39 A4 + 39 00 00 00 00 00 02 38 A3 + 39 00 00 00 00 00 02 37 A3 + 39 00 00 00 00 00 02 36 A3 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 34 A3 + 39 00 00 00 00 00 02 33 A4 + 39 00 00 00 00 00 02 32 A4 + 39 00 00 00 00 00 02 31 A3 + 39 00 00 00 00 00 02 30 A4 + 39 00 00 00 00 00 02 2F A4 + 39 00 00 00 00 00 02 2E A5 + 39 00 00 00 00 00 02 2D A4 + 39 00 00 00 00 00 02 2C A4 + 39 00 00 00 00 00 02 2B A4 + 39 00 00 00 00 00 02 2A A4 + 39 00 00 00 00 00 02 29 A3 + 39 00 00 00 00 00 02 28 A3 + 39 00 00 00 00 00 02 27 A3 + 39 00 00 00 00 00 02 26 A3 + 39 00 00 00 00 00 02 25 A3 + 39 00 00 00 00 00 02 24 A3 + 39 00 00 00 00 00 02 23 A2 + 39 00 00 00 00 00 02 22 A2 + 39 00 00 00 00 00 02 21 A2 + 39 00 00 00 00 00 02 20 A1 + 39 00 00 00 00 00 02 1F A1 + 39 00 00 00 00 00 02 1E A1 + 39 00 00 00 00 00 02 1D A0 + 39 00 00 00 00 00 02 1C A0 + 39 00 00 00 00 00 02 1B 9F + 39 00 00 00 00 00 02 1A 9F + 39 00 00 00 00 00 02 19 9E + 39 00 00 00 00 00 02 18 9E + 39 00 00 00 00 00 02 17 9E + 39 00 00 00 00 00 02 16 9E + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 14 9E + 39 00 00 00 00 00 02 13 9E + 39 00 00 00 00 00 02 12 9E + 39 00 00 00 00 00 02 11 9E + 39 00 00 00 00 00 02 10 9D + 39 00 00 00 00 00 02 0F 9D + 39 00 00 00 00 00 02 0E 9D + 39 00 00 00 00 00 02 0D 9D + 39 00 00 00 00 00 02 0C 9D + 39 00 00 00 00 00 02 0B 9C + 39 00 00 00 00 00 02 0A 9C + 39 00 00 00 00 00 02 09 9C + 39 00 00 00 00 00 02 08 9C + 39 00 00 00 00 00 02 07 9C + 39 00 00 00 00 00 02 06 9B + 39 00 00 00 00 00 02 05 9B + 39 00 00 00 00 00 02 04 9B + 39 00 00 00 00 00 02 03 9A + 39 00 00 00 00 00 02 02 9A + 39 00 00 00 00 00 02 01 9A + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 99 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 99 + 39 00 00 00 00 00 02 7F B0 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F A4 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 A5 + 39 00 00 00 00 00 02 7F DD + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F A4 + 39 00 00 00 00 00 02 7E A3 + 39 00 00 00 00 00 02 7D A3 + 39 00 00 00 00 00 02 7C A2 + 39 00 00 00 00 00 02 7B A1 + 39 00 00 00 00 00 02 7A A1 + 39 00 00 00 00 00 02 79 A1 + 39 00 00 00 00 00 02 78 A1 + 39 00 00 00 00 00 02 77 A0 + 39 00 00 00 00 00 02 76 A0 + 39 00 00 00 00 00 02 75 9F + 39 00 00 00 00 00 02 74 9F + 39 00 00 00 00 00 02 73 9F + 39 00 00 00 00 00 02 72 9F + 39 00 00 00 00 00 02 71 9E + 39 00 00 00 00 00 02 70 9E + 39 00 00 00 00 00 02 6F 9E + 39 00 00 00 00 00 02 6E 9D + 39 00 00 00 00 00 02 6D 9D + 39 00 00 00 00 00 02 6C 9D + 39 00 00 00 00 00 02 6B 9D + 39 00 00 00 00 00 02 6A 9C + 39 00 00 00 00 00 02 69 9C + 39 00 00 00 00 00 02 68 9C + 39 00 00 00 00 00 02 67 9C + 39 00 00 00 00 00 02 66 9B + 39 00 00 00 00 00 02 65 9B + 39 00 00 00 00 00 02 64 9B + 39 00 00 00 00 00 02 63 9B + 39 00 00 00 00 00 02 62 9B + 39 00 00 00 00 00 02 61 9B + 39 00 00 00 00 00 02 60 9A + 39 00 00 00 00 00 02 5F 9A + 39 00 00 00 00 00 02 5E 9A + 39 00 00 00 00 00 02 5D 9A + 39 00 00 00 00 00 02 5C 9A + 39 00 00 00 00 00 02 5B 9A + 39 00 00 00 00 00 02 5A 9A + 39 00 00 00 00 00 02 59 9A + 39 00 00 00 00 00 02 58 9A + 39 00 00 00 00 00 02 57 99 + 39 00 00 00 00 00 02 56 99 + 39 00 00 00 00 00 02 55 98 + 39 00 00 00 00 00 02 54 97 + 39 00 00 00 00 00 02 53 97 + 39 00 00 00 00 00 02 52 96 + 39 00 00 00 00 00 02 51 96 + 39 00 00 00 00 00 02 50 95 + 39 00 00 00 00 00 02 4F 94 + 39 00 00 00 00 00 02 4E 94 + 39 00 00 00 00 00 02 4D 93 + 39 00 00 00 00 00 02 4C 93 + 39 00 00 00 00 00 02 4B 92 + 39 00 00 00 00 00 02 4A 92 + 39 00 00 00 00 00 02 49 91 + 39 00 00 00 00 00 02 48 91 + 39 00 00 00 00 00 02 47 91 + 39 00 00 00 00 00 02 46 90 + 39 00 00 00 00 00 02 45 90 + 39 00 00 00 00 00 02 44 90 + 39 00 00 00 00 00 02 43 90 + 39 00 00 00 00 00 02 42 8F + 39 00 00 00 00 00 02 41 8F + 39 00 00 00 00 00 02 40 8F + 39 00 00 00 00 00 02 3F 8E + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3D 8D + 39 00 00 00 00 00 02 3C 8E + 39 00 00 00 00 00 02 3B 8F + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 39 8F + 39 00 00 00 00 00 02 38 8F + 39 00 00 00 00 00 02 37 8F + 39 00 00 00 00 00 02 36 8E + 39 00 00 00 00 00 02 35 8D + 39 00 00 00 00 00 02 34 8C + 39 00 00 00 00 00 02 33 8C + 39 00 00 00 00 00 02 32 8B + 39 00 00 00 00 00 02 31 8B + 39 00 00 00 00 00 02 30 8A + 39 00 00 00 00 00 02 2F 8A + 39 00 00 00 00 00 02 2E 8A + 39 00 00 00 00 00 02 2D 89 + 39 00 00 00 00 00 02 2C 89 + 39 00 00 00 00 00 02 2B 88 + 39 00 00 00 00 00 02 2A 87 + 39 00 00 00 00 00 02 29 87 + 39 00 00 00 00 00 02 28 87 + 39 00 00 00 00 00 02 27 89 + 39 00 00 00 00 00 02 26 8A + 39 00 00 00 00 00 02 25 89 + 39 00 00 00 00 00 02 24 89 + 39 00 00 00 00 00 02 23 88 + 39 00 00 00 00 00 02 22 88 + 39 00 00 00 00 00 02 21 87 + 39 00 00 00 00 00 02 20 87 + 39 00 00 00 00 00 02 1F 87 + 39 00 00 00 00 00 02 1E 87 + 39 00 00 00 00 00 02 1D 87 + 39 00 00 00 00 00 02 1C 87 + 39 00 00 00 00 00 02 1B 87 + 39 00 00 00 00 00 02 1A 87 + 39 00 00 00 00 00 02 19 87 + 39 00 00 00 00 00 02 18 87 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 16 86 + 39 00 00 00 00 00 02 15 85 + 39 00 00 00 00 00 02 14 85 + 39 00 00 00 00 00 02 13 85 + 39 00 00 00 00 00 02 12 85 + 39 00 00 00 00 00 02 11 85 + 39 00 00 00 00 00 02 10 84 + 39 00 00 00 00 00 02 0F 84 + 39 00 00 00 00 00 02 0E 84 + 39 00 00 00 00 00 02 0D 84 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 78 03 + 39 00 00 00 00 00 02 77 03 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 75 04 + 39 00 00 00 00 00 02 74 04 + 39 00 00 00 00 00 02 73 04 + 39 00 00 00 00 00 02 72 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6A 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 66 06 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 08 + 39 00 00 00 00 00 02 39 08 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 37 08 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 33 05 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 31 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 07 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 09 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F 99 + 39 00 00 00 00 00 02 7E 99 + 39 00 00 00 00 00 02 7D 98 + 39 00 00 00 00 00 02 7C 98 + 39 00 00 00 00 00 02 7B 97 + 39 00 00 00 00 00 02 7A 97 + 39 00 00 00 00 00 02 79 96 + 39 00 00 00 00 00 02 78 96 + 39 00 00 00 00 00 02 77 95 + 39 00 00 00 00 00 02 76 95 + 39 00 00 00 00 00 02 75 95 + 39 00 00 00 00 00 02 74 95 + 39 00 00 00 00 00 02 73 94 + 39 00 00 00 00 00 02 72 94 + 39 00 00 00 00 00 02 71 94 + 39 00 00 00 00 00 02 70 94 + 39 00 00 00 00 00 02 6F 94 + 39 00 00 00 00 00 02 6E 94 + 39 00 00 00 00 00 02 6D 94 + 39 00 00 00 00 00 02 6C 94 + 39 00 00 00 00 00 02 6B 93 + 39 00 00 00 00 00 02 6A 94 + 39 00 00 00 00 00 02 69 93 + 39 00 00 00 00 00 02 68 93 + 39 00 00 00 00 00 02 67 93 + 39 00 00 00 00 00 02 66 93 + 39 00 00 00 00 00 02 65 93 + 39 00 00 00 00 00 02 64 92 + 39 00 00 00 00 00 02 63 92 + 39 00 00 00 00 00 02 62 92 + 39 00 00 00 00 00 02 61 92 + 39 00 00 00 00 00 02 60 92 + 39 00 00 00 00 00 02 5F 92 + 39 00 00 00 00 00 02 5E 92 + 39 00 00 00 00 00 02 5D 92 + 39 00 00 00 00 00 02 5C 92 + 39 00 00 00 00 00 02 5B 92 + 39 00 00 00 00 00 02 5A 92 + 39 00 00 00 00 00 02 59 92 + 39 00 00 00 00 00 02 58 92 + 39 00 00 00 00 00 02 57 92 + 39 00 00 00 00 00 02 56 92 + 39 00 00 00 00 00 02 55 92 + 39 00 00 00 00 00 02 54 91 + 39 00 00 00 00 00 02 53 91 + 39 00 00 00 00 00 02 52 90 + 39 00 00 00 00 00 02 51 90 + 39 00 00 00 00 00 02 50 90 + 39 00 00 00 00 00 02 4F 8F + 39 00 00 00 00 00 02 4E 8E + 39 00 00 00 00 00 02 4D 8E + 39 00 00 00 00 00 02 4C 8D + 39 00 00 00 00 00 02 4B 8D + 39 00 00 00 00 00 02 4A 8C + 39 00 00 00 00 00 02 49 8C + 39 00 00 00 00 00 02 48 8C + 39 00 00 00 00 00 02 47 8B + 39 00 00 00 00 00 02 46 8B + 39 00 00 00 00 00 02 45 8B + 39 00 00 00 00 00 02 44 8A + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 42 8A + 39 00 00 00 00 00 02 41 8A + 39 00 00 00 00 00 02 40 8A + 39 00 00 00 00 00 02 3F 8A + 39 00 00 00 00 00 02 3E 89 + 39 00 00 00 00 00 02 3D 89 + 39 00 00 00 00 00 02 3C 89 + 39 00 00 00 00 00 02 3B 89 + 39 00 00 00 00 00 02 3A 8A + 39 00 00 00 00 00 02 39 8B + 39 00 00 00 00 00 02 38 8B + 39 00 00 00 00 00 02 37 8B + 39 00 00 00 00 00 02 36 8A + 39 00 00 00 00 00 02 35 8A + 39 00 00 00 00 00 02 34 89 + 39 00 00 00 00 00 02 33 88 + 39 00 00 00 00 00 02 32 88 + 39 00 00 00 00 00 02 31 88 + 39 00 00 00 00 00 02 30 87 + 39 00 00 00 00 00 02 2F 87 + 39 00 00 00 00 00 02 2E 86 + 39 00 00 00 00 00 02 2D 86 + 39 00 00 00 00 00 02 2C 86 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2A 84 + 39 00 00 00 00 00 02 29 84 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 85 + 39 00 00 00 00 00 02 26 87 + 39 00 00 00 00 00 02 25 87 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 22 85 + 39 00 00 00 00 00 02 21 85 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 1F 85 + 39 00 00 00 00 00 02 1E 85 + 39 00 00 00 00 00 02 1D 85 + 39 00 00 00 00 00 02 1C 85 + 39 00 00 00 00 00 02 1B 85 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 19 85 + 39 00 00 00 00 00 02 18 85 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 15 84 + 39 00 00 00 00 00 02 14 84 + 39 00 00 00 00 00 02 13 84 + 39 00 00 00 00 00 02 12 84 + 39 00 00 00 00 00 02 11 84 + 39 00 00 00 00 00 02 10 83 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0C 82 + 39 00 00 00 00 00 02 0B 82 + 39 00 00 00 00 00 02 0A 82 + 39 00 00 00 00 00 02 09 82 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 83 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + + ]; + + + qcom,mdss-dsi-panel-eye-command02 = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 03 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 66 05 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7F 00 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0D 84 + 39 00 00 00 00 00 02 0E 84 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 10 85 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 12 86 + 39 00 00 00 00 00 02 13 86 + 39 00 00 00 00 00 02 14 86 + 39 00 00 00 00 00 02 15 86 + 39 00 00 00 00 00 02 16 87 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 18 88 + 39 00 00 00 00 00 02 19 88 + 39 00 00 00 00 00 02 1A 89 + 39 00 00 00 00 00 02 1B 89 + 39 00 00 00 00 00 02 1C 89 + 39 00 00 00 00 00 02 1D 89 + 39 00 00 00 00 00 02 1E 89 + 39 00 00 00 00 00 02 1F 89 + 39 00 00 00 00 00 02 20 89 + 39 00 00 00 00 00 02 21 89 + 39 00 00 00 00 00 02 22 89 + 39 00 00 00 00 00 02 23 8A + 39 00 00 00 00 00 02 24 8A + 39 00 00 00 00 00 02 25 8B + 39 00 00 00 00 00 02 26 8C + 39 00 00 00 00 00 02 27 8C + 39 00 00 00 00 00 02 28 8A + 39 00 00 00 00 00 02 29 89 + 39 00 00 00 00 00 02 2A 89 + 39 00 00 00 00 00 02 2B 8A + 39 00 00 00 00 00 02 2C 8A + 39 00 00 00 00 00 02 2D 8B + 39 00 00 00 00 00 02 2E 8C + 39 00 00 00 00 00 02 2F 8C + 39 00 00 00 00 00 02 30 8C + 39 00 00 00 00 00 02 31 8D + 39 00 00 00 00 00 02 32 8D + 39 00 00 00 00 00 02 33 8E + 39 00 00 00 00 00 02 34 8F + 39 00 00 00 00 00 02 35 8F + 39 00 00 00 00 00 02 36 90 + 39 00 00 00 00 00 02 37 91 + 39 00 00 00 00 00 02 38 92 + 39 00 00 00 00 00 02 39 92 + 39 00 00 00 00 00 02 3A 92 + 39 00 00 00 00 00 02 3B 92 + 39 00 00 00 00 00 02 3C 92 + 39 00 00 00 00 00 02 3D 90 + 39 00 00 00 00 00 02 3E 90 + 39 00 00 00 00 00 02 3F 91 + 39 00 00 00 00 00 02 40 91 + 39 00 00 00 00 00 02 41 92 + 39 00 00 00 00 00 02 42 92 + 39 00 00 00 00 00 02 43 92 + 39 00 00 00 00 00 02 44 93 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 46 93 + 39 00 00 00 00 00 02 47 93 + 39 00 00 00 00 00 02 48 94 + 39 00 00 00 00 00 02 49 94 + 39 00 00 00 00 00 02 4A 95 + 39 00 00 00 00 00 02 4B 95 + 39 00 00 00 00 00 02 4C 96 + 39 00 00 00 00 00 02 4D 96 + 39 00 00 00 00 00 02 4E 97 + 39 00 00 00 00 00 02 4F 97 + 39 00 00 00 00 00 02 50 98 + 39 00 00 00 00 00 02 51 99 + 39 00 00 00 00 00 02 52 99 + 39 00 00 00 00 00 02 53 9A + 39 00 00 00 00 00 02 54 9A + 39 00 00 00 00 00 02 55 9B + 39 00 00 00 00 00 02 56 9B + 39 00 00 00 00 00 02 57 9C + 39 00 00 00 00 00 02 58 9D + 39 00 00 00 00 00 02 59 9D + 39 00 00 00 00 00 02 5A 9D + 39 00 00 00 00 00 02 5B 9D + 39 00 00 00 00 00 02 5C 9D + 39 00 00 00 00 00 02 5D 9E + 39 00 00 00 00 00 02 5E 9E + 39 00 00 00 00 00 02 5F 9E + 39 00 00 00 00 00 02 60 9E + 39 00 00 00 00 00 02 61 9E + 39 00 00 00 00 00 02 62 9E + 39 00 00 00 00 00 02 63 9F + 39 00 00 00 00 00 02 64 9F + 39 00 00 00 00 00 02 65 9F + 39 00 00 00 00 00 02 66 9F + 39 00 00 00 00 00 02 67 9F + 39 00 00 00 00 00 02 68 A0 + 39 00 00 00 00 00 02 69 A0 + 39 00 00 00 00 00 02 6A A0 + 39 00 00 00 00 00 02 6B A0 + 39 00 00 00 00 00 02 6C A0 + 39 00 00 00 00 00 02 6D A1 + 39 00 00 00 00 00 02 6E A1 + 39 00 00 00 00 00 02 6F A1 + 39 00 00 00 00 00 02 70 A1 + 39 00 00 00 00 00 02 71 A2 + 39 00 00 00 00 00 02 72 A2 + 39 00 00 00 00 00 02 73 A2 + 39 00 00 00 00 00 02 74 A3 + 39 00 00 00 00 00 02 75 A3 + 39 00 00 00 00 00 02 76 A3 + 39 00 00 00 00 00 02 77 A3 + 39 00 00 00 00 00 02 78 A4 + 39 00 00 00 00 00 02 79 A4 + 39 00 00 00 00 00 02 7A A4 + 39 00 00 00 00 00 02 7B A4 + 39 00 00 00 00 00 02 7C A5 + 39 00 00 00 00 00 02 7D A6 + 39 00 00 00 00 00 02 7E A7 + 39 00 00 00 00 00 02 7F A7 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 84 + 39 00 00 00 00 00 02 09 85 + 39 00 00 00 00 00 02 0A 85 + 39 00 00 00 00 00 02 0B 85 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0D 87 + 39 00 00 00 00 00 02 0E 87 + 39 00 00 00 00 00 02 0F 88 + 39 00 00 00 00 00 02 10 88 + 39 00 00 00 00 00 02 11 89 + 39 00 00 00 00 00 02 12 8A + 39 00 00 00 00 00 02 13 8A + 39 00 00 00 00 00 02 14 8A + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 16 8B + 39 00 00 00 00 00 02 17 8C + 39 00 00 00 00 00 02 18 8D + 39 00 00 00 00 00 02 19 8D + 39 00 00 00 00 00 02 1A 8E + 39 00 00 00 00 00 02 1B 8E + 39 00 00 00 00 00 02 1C 8F + 39 00 00 00 00 00 02 1D 8F + 39 00 00 00 00 00 02 1E 8F + 39 00 00 00 00 00 02 1F 90 + 39 00 00 00 00 00 02 20 90 + 39 00 00 00 00 00 02 21 90 + 39 00 00 00 00 00 02 22 90 + 39 00 00 00 00 00 02 23 91 + 39 00 00 00 00 00 02 24 91 + 39 00 00 00 00 00 02 25 92 + 39 00 00 00 00 00 02 26 93 + 39 00 00 00 00 00 02 27 93 + 39 00 00 00 00 00 02 28 94 + 39 00 00 00 00 00 02 29 95 + 39 00 00 00 00 00 02 2A 94 + 39 00 00 00 00 00 02 2B 93 + 39 00 00 00 00 00 02 2C 92 + 39 00 00 00 00 00 02 2D 93 + 39 00 00 00 00 00 02 2E 94 + 39 00 00 00 00 00 02 2F 95 + 39 00 00 00 00 00 02 30 96 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 32 97 + 39 00 00 00 00 00 02 33 98 + 39 00 00 00 00 00 02 34 98 + 39 00 00 00 00 00 02 35 99 + 39 00 00 00 00 00 02 36 9A + 39 00 00 00 00 00 02 37 9B + 39 00 00 00 00 00 02 38 9C + 39 00 00 00 00 00 02 39 9C + 39 00 00 00 00 00 02 3A 9D + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3C 9F + 39 00 00 00 00 00 02 3D 9F + 39 00 00 00 00 00 02 3E A0 + 39 00 00 00 00 00 02 3F A0 + 39 00 00 00 00 00 02 40 9F + 39 00 00 00 00 00 02 41 9F + 39 00 00 00 00 00 02 42 9F + 39 00 00 00 00 00 02 43 A0 + 39 00 00 00 00 00 02 44 A1 + 39 00 00 00 00 00 02 45 A1 + 39 00 00 00 00 00 02 46 A2 + 39 00 00 00 00 00 02 47 A2 + 39 00 00 00 00 00 02 48 A3 + 39 00 00 00 00 00 02 49 A3 + 39 00 00 00 00 00 02 4A A4 + 39 00 00 00 00 00 02 4B A4 + 39 00 00 00 00 00 02 4C A5 + 39 00 00 00 00 00 02 4D A5 + 39 00 00 00 00 00 02 4E A6 + 39 00 00 00 00 00 02 4F A7 + 39 00 00 00 00 00 02 50 A7 + 39 00 00 00 00 00 02 51 A8 + 39 00 00 00 00 00 02 52 A9 + 39 00 00 00 00 00 02 53 AA + 39 00 00 00 00 00 02 54 AA + 39 00 00 00 00 00 02 55 AB + 39 00 00 00 00 00 02 56 AC + 39 00 00 00 00 00 02 57 AD + 39 00 00 00 00 00 02 58 AE + 39 00 00 00 00 00 02 59 AF + 39 00 00 00 00 00 02 5A AF + 39 00 00 00 00 00 02 5B B0 + 39 00 00 00 00 00 02 5C B1 + 39 00 00 00 00 00 02 5D B2 + 39 00 00 00 00 00 02 5E B3 + 39 00 00 00 00 00 02 5F B3 + 39 00 00 00 00 00 02 60 B3 + 39 00 00 00 00 00 02 61 B4 + 39 00 00 00 00 00 02 62 B4 + 39 00 00 00 00 00 02 63 B4 + 39 00 00 00 00 00 02 64 B5 + 39 00 00 00 00 00 02 65 B5 + 39 00 00 00 00 00 02 66 B5 + 39 00 00 00 00 00 02 67 B6 + 39 00 00 00 00 00 02 68 B6 + 39 00 00 00 00 00 02 69 B7 + 39 00 00 00 00 00 02 6A B7 + 39 00 00 00 00 00 02 6B B8 + 39 00 00 00 00 00 02 6C B8 + 39 00 00 00 00 00 02 6D B8 + 39 00 00 00 00 00 02 6E B9 + 39 00 00 00 00 00 02 6F B9 + 39 00 00 00 00 00 02 70 BA + 39 00 00 00 00 00 02 71 BB + 39 00 00 00 00 00 02 72 BB + 39 00 00 00 00 00 02 73 BB + 39 00 00 00 00 00 02 74 BC + 39 00 00 00 00 00 02 75 BD + 39 00 00 00 00 00 02 76 BD + 39 00 00 00 00 00 02 77 BD + 39 00 00 00 00 00 02 78 BE + 39 00 00 00 00 00 02 79 BF + 39 00 00 00 00 00 02 7A BF + 39 00 00 00 00 00 02 7B C0 + 39 00 00 00 00 00 02 7C C0 + 39 00 00 00 00 00 02 7D C1 + 39 00 00 00 00 00 02 7E C1 + 39 00 00 00 00 00 02 7F C2 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 26 85 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 44 88 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 52 87 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5C 85 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5F 86 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 65 86 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 67 85 + 39 00 00 00 00 00 02 68 85 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 6B 86 + 39 00 00 00 00 00 02 6C 86 + 39 00 00 00 00 00 02 6D 86 + 39 00 00 00 00 00 02 6E 86 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 79 84 + 39 00 00 00 00 00 02 7A 84 + 39 00 00 00 00 00 02 7B 84 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7F 85 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 A8 + 39 00 00 00 00 00 02 02 A9 + 39 00 00 00 00 00 02 03 A9 + 39 00 00 00 00 00 02 04 A9 + 39 00 00 00 00 00 02 05 AA + 39 00 00 00 00 00 02 06 AB + 39 00 00 00 00 00 02 07 AB + 39 00 00 00 00 00 02 08 AB + 39 00 00 00 00 00 02 09 AC + 39 00 00 00 00 00 02 0A AC + 39 00 00 00 00 00 02 0B AD + 39 00 00 00 00 00 02 0C AD + 39 00 00 00 00 00 02 0D AD + 39 00 00 00 00 00 02 0E AE + 39 00 00 00 00 00 02 0F AE + 39 00 00 00 00 00 02 10 AE + 39 00 00 00 00 00 02 11 AF + 39 00 00 00 00 00 02 12 AF + 39 00 00 00 00 00 02 13 AF + 39 00 00 00 00 00 02 14 B0 + 39 00 00 00 00 00 02 15 B0 + 39 00 00 00 00 00 02 16 B0 + 39 00 00 00 00 00 02 17 B1 + 39 00 00 00 00 00 02 18 B1 + 39 00 00 00 00 00 02 19 B1 + 39 00 00 00 00 00 02 1A B1 + 39 00 00 00 00 00 02 1B B1 + 39 00 00 00 00 00 02 1C B1 + 39 00 00 00 00 00 02 1D B1 + 39 00 00 00 00 00 02 1E B2 + 39 00 00 00 00 00 02 1F B3 + 39 00 00 00 00 00 02 20 B3 + 39 00 00 00 00 00 02 21 B4 + 39 00 00 00 00 00 02 22 B4 + 39 00 00 00 00 00 02 23 B5 + 39 00 00 00 00 00 02 24 B5 + 39 00 00 00 00 00 02 25 B6 + 39 00 00 00 00 00 02 26 B6 + 39 00 00 00 00 00 02 27 B7 + 39 00 00 00 00 00 02 28 B7 + 39 00 00 00 00 00 02 29 B7 + 39 00 00 00 00 00 02 2A B8 + 39 00 00 00 00 00 02 2B B8 + 39 00 00 00 00 00 02 2C B8 + 39 00 00 00 00 00 02 2D B9 + 39 00 00 00 00 00 02 2E B9 + 39 00 00 00 00 00 02 2F B9 + 39 00 00 00 00 00 02 30 B9 + 39 00 00 00 00 00 02 31 BA + 39 00 00 00 00 00 02 32 BA + 39 00 00 00 00 00 02 33 BB + 39 00 00 00 00 00 02 34 BB + 39 00 00 00 00 00 02 35 BA + 39 00 00 00 00 00 02 36 BA + 39 00 00 00 00 00 02 37 BA + 39 00 00 00 00 00 02 38 BA + 39 00 00 00 00 00 02 39 BA + 39 00 00 00 00 00 02 3A BA + 39 00 00 00 00 00 02 3B BA + 39 00 00 00 00 00 02 3C BA + 39 00 00 00 00 00 02 3D BA + 39 00 00 00 00 00 02 3E BA + 39 00 00 00 00 00 02 3F BB + 39 00 00 00 00 00 02 40 BC + 39 00 00 00 00 00 02 41 BD + 39 00 00 00 00 00 02 42 BE + 39 00 00 00 00 00 02 43 BE + 39 00 00 00 00 00 02 44 BF + 39 00 00 00 00 00 02 45 C0 + 39 00 00 00 00 00 02 46 C0 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 48 C2 + 39 00 00 00 00 00 02 49 C2 + 39 00 00 00 00 00 02 4A C3 + 39 00 00 00 00 00 02 4B C3 + 39 00 00 00 00 00 02 4C C3 + 39 00 00 00 00 00 02 4D C4 + 39 00 00 00 00 00 02 4E C4 + 39 00 00 00 00 00 02 4F C4 + 39 00 00 00 00 00 02 50 C5 + 39 00 00 00 00 00 02 51 C5 + 39 00 00 00 00 00 02 52 C5 + 39 00 00 00 00 00 02 53 C6 + 39 00 00 00 00 00 02 54 C6 + 39 00 00 00 00 00 02 55 C6 + 39 00 00 00 00 00 02 56 C6 + 39 00 00 00 00 00 02 57 C6 + 39 00 00 00 00 00 02 58 C5 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 5A C5 + 39 00 00 00 00 00 02 5B C5 + 39 00 00 00 00 00 02 5C C5 + 39 00 00 00 00 00 02 5D C5 + 39 00 00 00 00 00 02 5E C6 + 39 00 00 00 00 00 02 5F C6 + 39 00 00 00 00 00 02 60 C7 + 39 00 00 00 00 00 02 61 C7 + 39 00 00 00 00 00 02 62 C8 + 39 00 00 00 00 00 02 63 C8 + 39 00 00 00 00 00 02 64 C9 + 39 00 00 00 00 00 02 65 C9 + 39 00 00 00 00 00 02 66 C9 + 39 00 00 00 00 00 02 67 C9 + 39 00 00 00 00 00 02 68 CA + 39 00 00 00 00 00 02 69 C9 + 39 00 00 00 00 00 02 6A CA + 39 00 00 00 00 00 02 6B C9 + 39 00 00 00 00 00 02 6C C9 + 39 00 00 00 00 00 02 6D C9 + 39 00 00 00 00 00 02 6E C9 + 39 00 00 00 00 00 02 6F CA + 39 00 00 00 00 00 02 70 CB + 39 00 00 00 00 00 02 71 CB + 39 00 00 00 00 00 02 72 CC + 39 00 00 00 00 00 02 73 CC + 39 00 00 00 00 00 02 74 CC + 39 00 00 00 00 00 02 75 CD + 39 00 00 00 00 00 02 76 CD + 39 00 00 00 00 00 02 77 CD + 39 00 00 00 00 00 02 78 CD + 39 00 00 00 00 00 02 79 CD + 39 00 00 00 00 00 02 7A CC + 39 00 00 00 00 00 02 7B CD + 39 00 00 00 00 00 02 7C CE + 39 00 00 00 00 00 02 7D CE + 39 00 00 00 00 00 02 7E CF + 39 00 00 00 00 00 02 7F CF + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 C3 + 39 00 00 00 00 00 02 02 C3 + 39 00 00 00 00 00 02 03 C4 + 39 00 00 00 00 00 02 04 C5 + 39 00 00 00 00 00 02 05 C6 + 39 00 00 00 00 00 02 06 C7 + 39 00 00 00 00 00 02 07 C7 + 39 00 00 00 00 00 02 08 C8 + 39 00 00 00 00 00 02 09 C9 + 39 00 00 00 00 00 02 0A CA + 39 00 00 00 00 00 02 0B CB + 39 00 00 00 00 00 02 0C CB + 39 00 00 00 00 00 02 0D CC + 39 00 00 00 00 00 02 0E CD + 39 00 00 00 00 00 02 0F CD + 39 00 00 00 00 00 02 10 CE + 39 00 00 00 00 00 02 11 CF + 39 00 00 00 00 00 02 12 D0 + 39 00 00 00 00 00 02 13 D0 + 39 00 00 00 00 00 02 14 D1 + 39 00 00 00 00 00 02 15 D2 + 39 00 00 00 00 00 02 16 D2 + 39 00 00 00 00 00 02 17 D3 + 39 00 00 00 00 00 02 18 D4 + 39 00 00 00 00 00 02 19 D4 + 39 00 00 00 00 00 02 1A D5 + 39 00 00 00 00 00 02 1B D5 + 39 00 00 00 00 00 02 1C D6 + 39 00 00 00 00 00 02 1D D7 + 39 00 00 00 00 00 02 1E D7 + 39 00 00 00 00 00 02 1F D8 + 39 00 00 00 00 00 02 20 D8 + 39 00 00 00 00 00 02 21 D9 + 39 00 00 00 00 00 02 22 DA + 39 00 00 00 00 00 02 23 DA + 39 00 00 00 00 00 02 24 DA + 39 00 00 00 00 00 02 25 DB + 39 00 00 00 00 00 02 26 DB + 39 00 00 00 00 00 02 27 DB + 39 00 00 00 00 00 02 28 DC + 39 00 00 00 00 00 02 29 DD + 39 00 00 00 00 00 02 2A DE + 39 00 00 00 00 00 02 2B DF + 39 00 00 00 00 00 02 2C E0 + 39 00 00 00 00 00 02 2D E0 + 39 00 00 00 00 00 02 2E E1 + 39 00 00 00 00 00 02 2F E2 + 39 00 00 00 00 00 02 30 E3 + 39 00 00 00 00 00 02 31 E4 + 39 00 00 00 00 00 02 32 E4 + 39 00 00 00 00 00 02 33 E5 + 39 00 00 00 00 00 02 34 E6 + 39 00 00 00 00 00 02 35 E6 + 39 00 00 00 00 00 02 36 E7 + 39 00 00 00 00 00 02 37 E8 + 39 00 00 00 00 00 02 38 E8 + 39 00 00 00 00 00 02 39 E9 + 39 00 00 00 00 00 02 3A E9 + 39 00 00 00 00 00 02 3B EA + 39 00 00 00 00 00 02 3C EA + 39 00 00 00 00 00 02 3D EB + 39 00 00 00 00 00 02 3E EC + 39 00 00 00 00 00 02 3F ED + 39 00 00 00 00 00 02 40 ED + 39 00 00 00 00 00 02 41 ED + 39 00 00 00 00 00 02 42 EE + 39 00 00 00 00 00 02 43 EE + 39 00 00 00 00 00 02 44 EE + 39 00 00 00 00 00 02 45 EF + 39 00 00 00 00 00 02 46 EF + 39 00 00 00 00 00 02 47 F0 + 39 00 00 00 00 00 02 48 F0 + 39 00 00 00 00 00 02 49 F0 + 39 00 00 00 00 00 02 4A F0 + 39 00 00 00 00 00 02 4B F1 + 39 00 00 00 00 00 02 4C F2 + 39 00 00 00 00 00 02 4D F3 + 39 00 00 00 00 00 02 4E F4 + 39 00 00 00 00 00 02 4F F5 + 39 00 00 00 00 00 02 50 F6 + 39 00 00 00 00 00 02 51 F7 + 39 00 00 00 00 00 02 52 F8 + 39 00 00 00 00 00 02 53 F9 + 39 00 00 00 00 00 02 54 FA + 39 00 00 00 00 00 02 55 FB + 39 00 00 00 00 00 02 56 FC + 39 00 00 00 00 00 02 57 FD + 39 00 00 00 00 00 02 58 FE + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7F FF + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F A7 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 A8 + 39 00 00 00 00 00 02 7F CF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F C2 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 C2 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 58 FE + 39 00 00 00 00 00 02 57 FD + 39 00 00 00 00 00 02 56 FC + 39 00 00 00 00 00 02 55 FB + 39 00 00 00 00 00 02 54 FA + 39 00 00 00 00 00 02 53 F9 + 39 00 00 00 00 00 02 52 F8 + 39 00 00 00 00 00 02 51 F7 + 39 00 00 00 00 00 02 50 F6 + 39 00 00 00 00 00 02 4F F5 + 39 00 00 00 00 00 02 4E F4 + 39 00 00 00 00 00 02 4D F3 + 39 00 00 00 00 00 02 4C F2 + 39 00 00 00 00 00 02 4B F1 + 39 00 00 00 00 00 02 4A F0 + 39 00 00 00 00 00 02 49 F0 + 39 00 00 00 00 00 02 48 F0 + 39 00 00 00 00 00 02 47 F0 + 39 00 00 00 00 00 02 46 EF + 39 00 00 00 00 00 02 45 EF + 39 00 00 00 00 00 02 44 EE + 39 00 00 00 00 00 02 43 EE + 39 00 00 00 00 00 02 42 EE + 39 00 00 00 00 00 02 41 ED + 39 00 00 00 00 00 02 40 ED + 39 00 00 00 00 00 02 3F ED + 39 00 00 00 00 00 02 3E EC + 39 00 00 00 00 00 02 3D EB + 39 00 00 00 00 00 02 3C EA + 39 00 00 00 00 00 02 3B EA + 39 00 00 00 00 00 02 3A E9 + 39 00 00 00 00 00 02 39 E9 + 39 00 00 00 00 00 02 38 E8 + 39 00 00 00 00 00 02 37 E8 + 39 00 00 00 00 00 02 36 E7 + 39 00 00 00 00 00 02 35 E6 + 39 00 00 00 00 00 02 34 E6 + 39 00 00 00 00 00 02 33 E5 + 39 00 00 00 00 00 02 32 E4 + 39 00 00 00 00 00 02 31 E4 + 39 00 00 00 00 00 02 30 E3 + 39 00 00 00 00 00 02 2F E2 + 39 00 00 00 00 00 02 2E E1 + 39 00 00 00 00 00 02 2D E0 + 39 00 00 00 00 00 02 2C E0 + 39 00 00 00 00 00 02 2B DF + 39 00 00 00 00 00 02 2A DE + 39 00 00 00 00 00 02 29 DD + 39 00 00 00 00 00 02 28 DC + 39 00 00 00 00 00 02 27 DB + 39 00 00 00 00 00 02 26 DB + 39 00 00 00 00 00 02 25 DB + 39 00 00 00 00 00 02 24 DA + 39 00 00 00 00 00 02 23 DA + 39 00 00 00 00 00 02 22 DA + 39 00 00 00 00 00 02 21 D9 + 39 00 00 00 00 00 02 20 D8 + 39 00 00 00 00 00 02 1F D8 + 39 00 00 00 00 00 02 1E D7 + 39 00 00 00 00 00 02 1D D7 + 39 00 00 00 00 00 02 1C D6 + 39 00 00 00 00 00 02 1B D5 + 39 00 00 00 00 00 02 1A D5 + 39 00 00 00 00 00 02 19 D4 + 39 00 00 00 00 00 02 18 D4 + 39 00 00 00 00 00 02 17 D3 + 39 00 00 00 00 00 02 16 D2 + 39 00 00 00 00 00 02 15 D2 + 39 00 00 00 00 00 02 14 D1 + 39 00 00 00 00 00 02 13 D0 + 39 00 00 00 00 00 02 12 D0 + 39 00 00 00 00 00 02 11 CF + 39 00 00 00 00 00 02 10 CE + 39 00 00 00 00 00 02 0F CD + 39 00 00 00 00 00 02 0E CD + 39 00 00 00 00 00 02 0D CC + 39 00 00 00 00 00 02 0C CB + 39 00 00 00 00 00 02 0B CB + 39 00 00 00 00 00 02 0A CA + 39 00 00 00 00 00 02 09 C9 + 39 00 00 00 00 00 02 08 C8 + 39 00 00 00 00 00 02 07 C7 + 39 00 00 00 00 00 02 06 C7 + 39 00 00 00 00 00 02 05 C6 + 39 00 00 00 00 00 02 04 C5 + 39 00 00 00 00 00 02 03 C4 + 39 00 00 00 00 00 02 02 C3 + 39 00 00 00 00 00 02 01 C3 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7B 84 + 39 00 00 00 00 00 02 7A 84 + 39 00 00 00 00 00 02 79 84 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 6E 86 + 39 00 00 00 00 00 02 6D 86 + 39 00 00 00 00 00 02 6C 86 + 39 00 00 00 00 00 02 6B 86 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 68 85 + 39 00 00 00 00 00 02 67 85 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 65 86 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 5F 86 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5C 85 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 52 87 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 44 88 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 26 85 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F CF + 39 00 00 00 00 00 02 7E CF + 39 00 00 00 00 00 02 7D CE + 39 00 00 00 00 00 02 7C CE + 39 00 00 00 00 00 02 7B CD + 39 00 00 00 00 00 02 7A CC + 39 00 00 00 00 00 02 79 CD + 39 00 00 00 00 00 02 78 CD + 39 00 00 00 00 00 02 77 CD + 39 00 00 00 00 00 02 76 CD + 39 00 00 00 00 00 02 75 CD + 39 00 00 00 00 00 02 74 CC + 39 00 00 00 00 00 02 73 CC + 39 00 00 00 00 00 02 72 CC + 39 00 00 00 00 00 02 71 CB + 39 00 00 00 00 00 02 70 CB + 39 00 00 00 00 00 02 6F CA + 39 00 00 00 00 00 02 6E C9 + 39 00 00 00 00 00 02 6D C9 + 39 00 00 00 00 00 02 6C C9 + 39 00 00 00 00 00 02 6B C9 + 39 00 00 00 00 00 02 6A CA + 39 00 00 00 00 00 02 69 C9 + 39 00 00 00 00 00 02 68 CA + 39 00 00 00 00 00 02 67 C9 + 39 00 00 00 00 00 02 66 C9 + 39 00 00 00 00 00 02 65 C9 + 39 00 00 00 00 00 02 64 C9 + 39 00 00 00 00 00 02 63 C8 + 39 00 00 00 00 00 02 62 C8 + 39 00 00 00 00 00 02 61 C7 + 39 00 00 00 00 00 02 60 C7 + 39 00 00 00 00 00 02 5F C6 + 39 00 00 00 00 00 02 5E C6 + 39 00 00 00 00 00 02 5D C5 + 39 00 00 00 00 00 02 5C C5 + 39 00 00 00 00 00 02 5B C5 + 39 00 00 00 00 00 02 5A C5 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 58 C5 + 39 00 00 00 00 00 02 57 C6 + 39 00 00 00 00 00 02 56 C6 + 39 00 00 00 00 00 02 55 C6 + 39 00 00 00 00 00 02 54 C6 + 39 00 00 00 00 00 02 53 C6 + 39 00 00 00 00 00 02 52 C5 + 39 00 00 00 00 00 02 51 C5 + 39 00 00 00 00 00 02 50 C5 + 39 00 00 00 00 00 02 4F C4 + 39 00 00 00 00 00 02 4E C4 + 39 00 00 00 00 00 02 4D C4 + 39 00 00 00 00 00 02 4C C3 + 39 00 00 00 00 00 02 4B C3 + 39 00 00 00 00 00 02 4A C3 + 39 00 00 00 00 00 02 49 C2 + 39 00 00 00 00 00 02 48 C2 + 39 00 00 00 00 00 02 47 C1 + 39 00 00 00 00 00 02 46 C0 + 39 00 00 00 00 00 02 45 C0 + 39 00 00 00 00 00 02 44 BF + 39 00 00 00 00 00 02 43 BE + 39 00 00 00 00 00 02 42 BE + 39 00 00 00 00 00 02 41 BD + 39 00 00 00 00 00 02 40 BC + 39 00 00 00 00 00 02 3F BB + 39 00 00 00 00 00 02 3E BA + 39 00 00 00 00 00 02 3D BA + 39 00 00 00 00 00 02 3C BA + 39 00 00 00 00 00 02 3B BA + 39 00 00 00 00 00 02 3A BA + 39 00 00 00 00 00 02 39 BA + 39 00 00 00 00 00 02 38 BA + 39 00 00 00 00 00 02 37 BA + 39 00 00 00 00 00 02 36 BA + 39 00 00 00 00 00 02 35 BA + 39 00 00 00 00 00 02 34 BB + 39 00 00 00 00 00 02 33 BB + 39 00 00 00 00 00 02 32 BA + 39 00 00 00 00 00 02 31 BA + 39 00 00 00 00 00 02 30 B9 + 39 00 00 00 00 00 02 2F B9 + 39 00 00 00 00 00 02 2E B9 + 39 00 00 00 00 00 02 2D B9 + 39 00 00 00 00 00 02 2C B8 + 39 00 00 00 00 00 02 2B B8 + 39 00 00 00 00 00 02 2A B8 + 39 00 00 00 00 00 02 29 B7 + 39 00 00 00 00 00 02 28 B7 + 39 00 00 00 00 00 02 27 B7 + 39 00 00 00 00 00 02 26 B6 + 39 00 00 00 00 00 02 25 B6 + 39 00 00 00 00 00 02 24 B5 + 39 00 00 00 00 00 02 23 B5 + 39 00 00 00 00 00 02 22 B4 + 39 00 00 00 00 00 02 21 B4 + 39 00 00 00 00 00 02 20 B3 + 39 00 00 00 00 00 02 1F B3 + 39 00 00 00 00 00 02 1E B2 + 39 00 00 00 00 00 02 1D B1 + 39 00 00 00 00 00 02 1C B1 + 39 00 00 00 00 00 02 1B B1 + 39 00 00 00 00 00 02 1A B1 + 39 00 00 00 00 00 02 19 B1 + 39 00 00 00 00 00 02 18 B1 + 39 00 00 00 00 00 02 17 B1 + 39 00 00 00 00 00 02 16 B0 + 39 00 00 00 00 00 02 15 B0 + 39 00 00 00 00 00 02 14 B0 + 39 00 00 00 00 00 02 13 AF + 39 00 00 00 00 00 02 12 AF + 39 00 00 00 00 00 02 11 AF + 39 00 00 00 00 00 02 10 AE + 39 00 00 00 00 00 02 0F AE + 39 00 00 00 00 00 02 0E AE + 39 00 00 00 00 00 02 0D AD + 39 00 00 00 00 00 02 0C AD + 39 00 00 00 00 00 02 0B AD + 39 00 00 00 00 00 02 0A AC + 39 00 00 00 00 00 02 09 AC + 39 00 00 00 00 00 02 08 AB + 39 00 00 00 00 00 02 07 AB + 39 00 00 00 00 00 02 06 AB + 39 00 00 00 00 00 02 05 AA + 39 00 00 00 00 00 02 04 A9 + 39 00 00 00 00 00 02 03 A9 + 39 00 00 00 00 00 02 02 A9 + 39 00 00 00 00 00 02 01 A8 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F A7 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 A8 + 39 00 00 00 00 00 02 7F CF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F C2 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 C2 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F C2 + 39 00 00 00 00 00 02 7E C1 + 39 00 00 00 00 00 02 7D C1 + 39 00 00 00 00 00 02 7C C0 + 39 00 00 00 00 00 02 7B C0 + 39 00 00 00 00 00 02 7A BF + 39 00 00 00 00 00 02 79 BF + 39 00 00 00 00 00 02 78 BE + 39 00 00 00 00 00 02 77 BD + 39 00 00 00 00 00 02 76 BD + 39 00 00 00 00 00 02 75 BD + 39 00 00 00 00 00 02 74 BC + 39 00 00 00 00 00 02 73 BB + 39 00 00 00 00 00 02 72 BB + 39 00 00 00 00 00 02 71 BB + 39 00 00 00 00 00 02 70 BA + 39 00 00 00 00 00 02 6F B9 + 39 00 00 00 00 00 02 6E B9 + 39 00 00 00 00 00 02 6D B8 + 39 00 00 00 00 00 02 6C B8 + 39 00 00 00 00 00 02 6B B8 + 39 00 00 00 00 00 02 6A B7 + 39 00 00 00 00 00 02 69 B7 + 39 00 00 00 00 00 02 68 B6 + 39 00 00 00 00 00 02 67 B6 + 39 00 00 00 00 00 02 66 B5 + 39 00 00 00 00 00 02 65 B5 + 39 00 00 00 00 00 02 64 B5 + 39 00 00 00 00 00 02 63 B4 + 39 00 00 00 00 00 02 62 B4 + 39 00 00 00 00 00 02 61 B4 + 39 00 00 00 00 00 02 60 B3 + 39 00 00 00 00 00 02 5F B3 + 39 00 00 00 00 00 02 5E B3 + 39 00 00 00 00 00 02 5D B2 + 39 00 00 00 00 00 02 5C B1 + 39 00 00 00 00 00 02 5B B0 + 39 00 00 00 00 00 02 5A AF + 39 00 00 00 00 00 02 59 AF + 39 00 00 00 00 00 02 58 AE + 39 00 00 00 00 00 02 57 AD + 39 00 00 00 00 00 02 56 AC + 39 00 00 00 00 00 02 55 AB + 39 00 00 00 00 00 02 54 AA + 39 00 00 00 00 00 02 53 AA + 39 00 00 00 00 00 02 52 A9 + 39 00 00 00 00 00 02 51 A8 + 39 00 00 00 00 00 02 50 A7 + 39 00 00 00 00 00 02 4F A7 + 39 00 00 00 00 00 02 4E A6 + 39 00 00 00 00 00 02 4D A5 + 39 00 00 00 00 00 02 4C A5 + 39 00 00 00 00 00 02 4B A4 + 39 00 00 00 00 00 02 4A A4 + 39 00 00 00 00 00 02 49 A3 + 39 00 00 00 00 00 02 48 A3 + 39 00 00 00 00 00 02 47 A2 + 39 00 00 00 00 00 02 46 A2 + 39 00 00 00 00 00 02 45 A1 + 39 00 00 00 00 00 02 44 A1 + 39 00 00 00 00 00 02 43 A0 + 39 00 00 00 00 00 02 42 9F + 39 00 00 00 00 00 02 41 9F + 39 00 00 00 00 00 02 40 9F + 39 00 00 00 00 00 02 3F A0 + 39 00 00 00 00 00 02 3E A0 + 39 00 00 00 00 00 02 3D 9F + 39 00 00 00 00 00 02 3C 9F + 39 00 00 00 00 00 02 3B 9E + 39 00 00 00 00 00 02 3A 9D + 39 00 00 00 00 00 02 39 9C + 39 00 00 00 00 00 02 38 9C + 39 00 00 00 00 00 02 37 9B + 39 00 00 00 00 00 02 36 9A + 39 00 00 00 00 00 02 35 99 + 39 00 00 00 00 00 02 34 98 + 39 00 00 00 00 00 02 33 98 + 39 00 00 00 00 00 02 32 97 + 39 00 00 00 00 00 02 31 97 + 39 00 00 00 00 00 02 30 96 + 39 00 00 00 00 00 02 2F 95 + 39 00 00 00 00 00 02 2E 94 + 39 00 00 00 00 00 02 2D 93 + 39 00 00 00 00 00 02 2C 92 + 39 00 00 00 00 00 02 2B 93 + 39 00 00 00 00 00 02 2A 94 + 39 00 00 00 00 00 02 29 95 + 39 00 00 00 00 00 02 28 94 + 39 00 00 00 00 00 02 27 93 + 39 00 00 00 00 00 02 26 93 + 39 00 00 00 00 00 02 25 92 + 39 00 00 00 00 00 02 24 91 + 39 00 00 00 00 00 02 23 91 + 39 00 00 00 00 00 02 22 90 + 39 00 00 00 00 00 02 21 90 + 39 00 00 00 00 00 02 20 90 + 39 00 00 00 00 00 02 1F 90 + 39 00 00 00 00 00 02 1E 8F + 39 00 00 00 00 00 02 1D 8F + 39 00 00 00 00 00 02 1C 8F + 39 00 00 00 00 00 02 1B 8E + 39 00 00 00 00 00 02 1A 8E + 39 00 00 00 00 00 02 19 8D + 39 00 00 00 00 00 02 18 8D + 39 00 00 00 00 00 02 17 8C + 39 00 00 00 00 00 02 16 8B + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 14 8A + 39 00 00 00 00 00 02 13 8A + 39 00 00 00 00 00 02 12 8A + 39 00 00 00 00 00 02 11 89 + 39 00 00 00 00 00 02 10 88 + 39 00 00 00 00 00 02 0F 88 + 39 00 00 00 00 00 02 0E 87 + 39 00 00 00 00 00 02 0D 87 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0B 85 + 39 00 00 00 00 00 02 0A 85 + 39 00 00 00 00 00 02 09 85 + 39 00 00 00 00 00 02 08 84 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 66 05 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 03 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 00 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F A7 + 39 00 00 00 00 00 02 7E A7 + 39 00 00 00 00 00 02 7D A6 + 39 00 00 00 00 00 02 7C A5 + 39 00 00 00 00 00 02 7B A4 + 39 00 00 00 00 00 02 7A A4 + 39 00 00 00 00 00 02 79 A4 + 39 00 00 00 00 00 02 78 A4 + 39 00 00 00 00 00 02 77 A3 + 39 00 00 00 00 00 02 76 A3 + 39 00 00 00 00 00 02 75 A3 + 39 00 00 00 00 00 02 74 A3 + 39 00 00 00 00 00 02 73 A2 + 39 00 00 00 00 00 02 72 A2 + 39 00 00 00 00 00 02 71 A2 + 39 00 00 00 00 00 02 70 A1 + 39 00 00 00 00 00 02 6F A1 + 39 00 00 00 00 00 02 6E A1 + 39 00 00 00 00 00 02 6D A1 + 39 00 00 00 00 00 02 6C A0 + 39 00 00 00 00 00 02 6B A0 + 39 00 00 00 00 00 02 6A A0 + 39 00 00 00 00 00 02 69 A0 + 39 00 00 00 00 00 02 68 A0 + 39 00 00 00 00 00 02 67 9F + 39 00 00 00 00 00 02 66 9F + 39 00 00 00 00 00 02 65 9F + 39 00 00 00 00 00 02 64 9F + 39 00 00 00 00 00 02 63 9F + 39 00 00 00 00 00 02 62 9E + 39 00 00 00 00 00 02 61 9E + 39 00 00 00 00 00 02 60 9E + 39 00 00 00 00 00 02 5F 9E + 39 00 00 00 00 00 02 5E 9E + 39 00 00 00 00 00 02 5D 9E + 39 00 00 00 00 00 02 5C 9D + 39 00 00 00 00 00 02 5B 9D + 39 00 00 00 00 00 02 5A 9D + 39 00 00 00 00 00 02 59 9D + 39 00 00 00 00 00 02 58 9D + 39 00 00 00 00 00 02 57 9C + 39 00 00 00 00 00 02 56 9B + 39 00 00 00 00 00 02 55 9B + 39 00 00 00 00 00 02 54 9A + 39 00 00 00 00 00 02 53 9A + 39 00 00 00 00 00 02 52 99 + 39 00 00 00 00 00 02 51 99 + 39 00 00 00 00 00 02 50 98 + 39 00 00 00 00 00 02 4F 97 + 39 00 00 00 00 00 02 4E 97 + 39 00 00 00 00 00 02 4D 96 + 39 00 00 00 00 00 02 4C 96 + 39 00 00 00 00 00 02 4B 95 + 39 00 00 00 00 00 02 4A 95 + 39 00 00 00 00 00 02 49 94 + 39 00 00 00 00 00 02 48 94 + 39 00 00 00 00 00 02 47 93 + 39 00 00 00 00 00 02 46 93 + 39 00 00 00 00 00 02 45 93 + 39 00 00 00 00 00 02 44 93 + 39 00 00 00 00 00 02 43 92 + 39 00 00 00 00 00 02 42 92 + 39 00 00 00 00 00 02 41 92 + 39 00 00 00 00 00 02 40 91 + 39 00 00 00 00 00 02 3F 91 + 39 00 00 00 00 00 02 3E 90 + 39 00 00 00 00 00 02 3D 90 + 39 00 00 00 00 00 02 3C 92 + 39 00 00 00 00 00 02 3B 92 + 39 00 00 00 00 00 02 3A 92 + 39 00 00 00 00 00 02 39 92 + 39 00 00 00 00 00 02 38 92 + 39 00 00 00 00 00 02 37 91 + 39 00 00 00 00 00 02 36 90 + 39 00 00 00 00 00 02 35 8F + 39 00 00 00 00 00 02 34 8F + 39 00 00 00 00 00 02 33 8E + 39 00 00 00 00 00 02 32 8D + 39 00 00 00 00 00 02 31 8D + 39 00 00 00 00 00 02 30 8C + 39 00 00 00 00 00 02 2F 8C + 39 00 00 00 00 00 02 2E 8C + 39 00 00 00 00 00 02 2D 8B + 39 00 00 00 00 00 02 2C 8A + 39 00 00 00 00 00 02 2B 8A + 39 00 00 00 00 00 02 2A 89 + 39 00 00 00 00 00 02 29 89 + 39 00 00 00 00 00 02 28 8A + 39 00 00 00 00 00 02 27 8C + 39 00 00 00 00 00 02 26 8C + 39 00 00 00 00 00 02 25 8B + 39 00 00 00 00 00 02 24 8A + 39 00 00 00 00 00 02 23 8A + 39 00 00 00 00 00 02 22 89 + 39 00 00 00 00 00 02 21 89 + 39 00 00 00 00 00 02 20 89 + 39 00 00 00 00 00 02 1F 89 + 39 00 00 00 00 00 02 1E 89 + 39 00 00 00 00 00 02 1D 89 + 39 00 00 00 00 00 02 1C 89 + 39 00 00 00 00 00 02 1B 89 + 39 00 00 00 00 00 02 1A 89 + 39 00 00 00 00 00 02 19 88 + 39 00 00 00 00 00 02 18 88 + 39 00 00 00 00 00 02 17 87 + 39 00 00 00 00 00 02 16 87 + 39 00 00 00 00 00 02 15 86 + 39 00 00 00 00 00 02 14 86 + 39 00 00 00 00 00 02 13 86 + 39 00 00 00 00 00 02 12 86 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 10 85 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 0E 84 + 39 00 00 00 00 00 02 0D 84 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 08 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 83 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + + ]; + + + qcom,mdss-dsi-panel-eye-command04= [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 09 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2E 07 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 06 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 33 05 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 37 08 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 39 08 + 39 00 00 00 00 00 02 3A 08 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 66 06 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 6A 05 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 73 04 + 39 00 00 00 00 00 02 74 04 + 39 00 00 00 00 00 02 75 04 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 77 03 + 39 00 00 00 00 00 02 78 03 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7F 01 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 84 + 39 00 00 00 00 00 02 0A 84 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0C 85 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0E 86 + 39 00 00 00 00 00 02 0F 86 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 11 87 + 39 00 00 00 00 00 02 12 88 + 39 00 00 00 00 00 02 13 88 + 39 00 00 00 00 00 02 14 88 + 39 00 00 00 00 00 02 15 88 + 39 00 00 00 00 00 02 16 89 + 39 00 00 00 00 00 02 17 89 + 39 00 00 00 00 00 02 18 8A + 39 00 00 00 00 00 02 19 8A + 39 00 00 00 00 00 02 1A 8B + 39 00 00 00 00 00 02 1B 8B + 39 00 00 00 00 00 02 1C 8B + 39 00 00 00 00 00 02 1D 8B + 39 00 00 00 00 00 02 1E 8B + 39 00 00 00 00 00 02 1F 8C + 39 00 00 00 00 00 02 20 8C + 39 00 00 00 00 00 02 21 8C + 39 00 00 00 00 00 02 22 8C + 39 00 00 00 00 00 02 23 8C + 39 00 00 00 00 00 02 24 8D + 39 00 00 00 00 00 02 25 8E + 39 00 00 00 00 00 02 26 8E + 39 00 00 00 00 00 02 27 8F + 39 00 00 00 00 00 02 28 8F + 39 00 00 00 00 00 02 29 8E + 39 00 00 00 00 00 02 2A 8C + 39 00 00 00 00 00 02 2B 8D + 39 00 00 00 00 00 02 2C 8D + 39 00 00 00 00 00 02 2D 8E + 39 00 00 00 00 00 02 2E 8F + 39 00 00 00 00 00 02 2F 90 + 39 00 00 00 00 00 02 30 90 + 39 00 00 00 00 00 02 31 91 + 39 00 00 00 00 00 02 32 91 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 34 93 + 39 00 00 00 00 00 02 35 93 + 39 00 00 00 00 00 02 36 94 + 39 00 00 00 00 00 02 37 95 + 39 00 00 00 00 00 02 38 95 + 39 00 00 00 00 00 02 39 96 + 39 00 00 00 00 00 02 3A 97 + 39 00 00 00 00 00 02 3B 97 + 39 00 00 00 00 00 02 3C 97 + 39 00 00 00 00 00 02 3D 97 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3F 96 + 39 00 00 00 00 00 02 40 96 + 39 00 00 00 00 00 02 41 97 + 39 00 00 00 00 00 02 42 97 + 39 00 00 00 00 00 02 43 98 + 39 00 00 00 00 00 02 44 98 + 39 00 00 00 00 00 02 45 99 + 39 00 00 00 00 00 02 46 99 + 39 00 00 00 00 00 02 47 99 + 39 00 00 00 00 00 02 48 9A + 39 00 00 00 00 00 02 49 9A + 39 00 00 00 00 00 02 4A 9B + 39 00 00 00 00 00 02 4B 9B + 39 00 00 00 00 00 02 4C 9B + 39 00 00 00 00 00 02 4D 9C + 39 00 00 00 00 00 02 4E 9D + 39 00 00 00 00 00 02 4F 9D + 39 00 00 00 00 00 02 50 9E + 39 00 00 00 00 00 02 51 9E + 39 00 00 00 00 00 02 52 9F + 39 00 00 00 00 00 02 53 A0 + 39 00 00 00 00 00 02 54 A1 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 56 A2 + 39 00 00 00 00 00 02 57 A2 + 39 00 00 00 00 00 02 58 A3 + 39 00 00 00 00 00 02 59 A4 + 39 00 00 00 00 00 02 5A A5 + 39 00 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 02 5C A6 + 39 00 00 00 00 00 02 5D A6 + 39 00 00 00 00 00 02 5E A6 + 39 00 00 00 00 00 02 5F A6 + 39 00 00 00 00 00 02 60 A6 + 39 00 00 00 00 00 02 61 A6 + 39 00 00 00 00 00 02 62 A6 + 39 00 00 00 00 00 02 63 A7 + 39 00 00 00 00 00 02 64 A7 + 39 00 00 00 00 00 02 65 A7 + 39 00 00 00 00 00 02 66 A8 + 39 00 00 00 00 00 02 67 A8 + 39 00 00 00 00 00 02 68 A8 + 39 00 00 00 00 00 02 69 A8 + 39 00 00 00 00 00 02 6A A9 + 39 00 00 00 00 00 02 6B A9 + 39 00 00 00 00 00 02 6C A9 + 39 00 00 00 00 00 02 6D AA + 39 00 00 00 00 00 02 6E AA + 39 00 00 00 00 00 02 6F AA + 39 00 00 00 00 00 02 70 AB + 39 00 00 00 00 00 02 71 AB + 39 00 00 00 00 00 02 72 AB + 39 00 00 00 00 00 02 73 AC + 39 00 00 00 00 00 02 74 AC + 39 00 00 00 00 00 02 75 AD + 39 00 00 00 00 00 02 76 AD + 39 00 00 00 00 00 02 77 AD + 39 00 00 00 00 00 02 78 AD + 39 00 00 00 00 00 02 79 AE + 39 00 00 00 00 00 02 7A AE + 39 00 00 00 00 00 02 7B AF + 39 00 00 00 00 00 02 7C AF + 39 00 00 00 00 00 02 7D AF + 39 00 00 00 00 00 02 7E AF + 39 00 00 00 00 00 02 7F B1 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 04 84 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 07 84 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 0A 87 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0D 89 + 39 00 00 00 00 00 02 0E 8A + 39 00 00 00 00 00 02 0F 8B + 39 00 00 00 00 00 02 10 8B + 39 00 00 00 00 00 02 11 8C + 39 00 00 00 00 00 02 12 8D + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 8E + 39 00 00 00 00 00 02 15 8F + 39 00 00 00 00 00 02 16 8F + 39 00 00 00 00 00 02 17 90 + 39 00 00 00 00 00 02 18 91 + 39 00 00 00 00 00 02 19 92 + 39 00 00 00 00 00 02 1A 93 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1C 94 + 39 00 00 00 00 00 02 1D 95 + 39 00 00 00 00 00 02 1E 95 + 39 00 00 00 00 00 02 1F 96 + 39 00 00 00 00 00 02 20 6A + 39 00 00 00 00 00 02 21 69 + 39 00 00 00 00 00 02 22 69 + 39 00 00 00 00 00 02 23 68 + 39 00 00 00 00 00 02 24 68 + 39 00 00 00 00 00 02 25 67 + 39 00 00 00 00 00 02 26 67 + 39 00 00 00 00 00 02 27 66 + 39 00 00 00 00 00 02 28 65 + 39 00 00 00 00 00 02 29 64 + 39 00 00 00 00 00 02 2A 63 + 39 00 00 00 00 00 02 2B 62 + 39 00 00 00 00 00 02 2C 62 + 39 00 00 00 00 00 02 2D 63 + 39 00 00 00 00 00 02 2E 64 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 30 62 + 39 00 00 00 00 00 02 31 61 + 39 00 00 00 00 00 02 32 60 + 39 00 00 00 00 00 02 33 5F + 39 00 00 00 00 00 02 34 5E + 39 00 00 00 00 00 02 35 5D + 39 00 00 00 00 00 02 36 5D + 39 00 00 00 00 00 02 37 5C + 39 00 00 00 00 00 02 38 5B + 39 00 00 00 00 00 02 39 5A + 39 00 00 00 00 00 02 3A 59 + 39 00 00 00 00 00 02 3B 58 + 39 00 00 00 00 00 02 3C 57 + 39 00 00 00 00 00 02 3D 56 + 39 00 00 00 00 00 02 3E 55 + 39 00 00 00 00 00 02 3F 54 + 39 00 00 00 00 00 02 40 53 + 39 00 00 00 00 00 02 41 53 + 39 00 00 00 00 00 02 42 52 + 39 00 00 00 00 00 02 43 52 + 39 00 00 00 00 00 02 44 53 + 39 00 00 00 00 00 02 45 53 + 39 00 00 00 00 00 02 46 52 + 39 00 00 00 00 00 02 47 51 + 39 00 00 00 00 00 02 48 50 + 39 00 00 00 00 00 02 49 4F + 39 00 00 00 00 00 02 4A 4E + 39 00 00 00 00 00 02 4B 4E + 39 00 00 00 00 00 02 4C 4D + 39 00 00 00 00 00 02 4D 4D + 39 00 00 00 00 00 02 4E 4C + 39 00 00 00 00 00 02 4F 4B + 39 00 00 00 00 00 02 50 4A + 39 00 00 00 00 00 02 51 49 + 39 00 00 00 00 00 02 52 49 + 39 00 00 00 00 00 02 53 48 + 39 00 00 00 00 00 02 54 47 + 39 00 00 00 00 00 02 55 46 + 39 00 00 00 00 00 02 56 45 + 39 00 00 00 00 00 02 57 44 + 39 00 00 00 00 00 02 58 43 + 39 00 00 00 00 00 02 59 42 + 39 00 00 00 00 00 02 5A 41 + 39 00 00 00 00 00 02 5B 40 + 39 00 00 00 00 00 02 5C 3F + 39 00 00 00 00 00 02 5D 3E + 39 00 00 00 00 00 02 5E 3D + 39 00 00 00 00 00 02 5F 3D + 39 00 00 00 00 00 02 60 3C + 39 00 00 00 00 00 02 61 3A + 39 00 00 00 00 00 02 62 39 + 39 00 00 00 00 00 02 63 38 + 39 00 00 00 00 00 02 64 38 + 39 00 00 00 00 00 02 65 37 + 39 00 00 00 00 00 02 66 37 + 39 00 00 00 00 00 02 67 36 + 39 00 00 00 00 00 02 68 36 + 39 00 00 00 00 00 02 69 35 + 39 00 00 00 00 00 02 6A 35 + 39 00 00 00 00 00 02 6B 34 + 39 00 00 00 00 00 02 6C 34 + 39 00 00 00 00 00 02 6D 33 + 39 00 00 00 00 00 02 6E 32 + 39 00 00 00 00 00 02 6F 32 + 39 00 00 00 00 00 02 70 31 + 39 00 00 00 00 00 02 71 30 + 39 00 00 00 00 00 02 72 30 + 39 00 00 00 00 00 02 73 2F + 39 00 00 00 00 00 02 74 2E + 39 00 00 00 00 00 02 75 2E + 39 00 00 00 00 00 02 76 2D + 39 00 00 00 00 00 02 77 2C + 39 00 00 00 00 00 02 78 2C + 39 00 00 00 00 00 02 79 2B + 39 00 00 00 00 00 02 7A 2A + 39 00 00 00 00 00 02 7B 29 + 39 00 00 00 00 00 02 7C 29 + 39 00 00 00 00 00 02 7D 28 + 39 00 00 00 00 00 02 7E 28 + 39 00 00 00 00 00 02 7F 27 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0E 01 + 39 00 00 00 00 00 02 0F 01 + 39 00 00 00 00 00 02 10 01 + 39 00 00 00 00 00 02 11 01 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 82 + 39 00 00 00 00 00 02 28 82 + 39 00 00 00 00 00 02 29 81 + 39 00 00 00 00 00 02 2A 81 + 39 00 00 00 00 00 02 2B 81 + 39 00 00 00 00 00 02 2C 81 + 39 00 00 00 00 00 02 2D 81 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 35 83 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 67 83 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6C 84 + 39 00 00 00 00 00 02 6D 84 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 70 83 + 39 00 00 00 00 00 02 71 83 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7F 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 B2 + 39 00 00 00 00 00 02 02 B2 + 39 00 00 00 00 00 02 03 B3 + 39 00 00 00 00 00 02 04 B4 + 39 00 00 00 00 00 02 05 B4 + 39 00 00 00 00 00 02 06 B5 + 39 00 00 00 00 00 02 07 B5 + 39 00 00 00 00 00 02 08 B6 + 39 00 00 00 00 00 02 09 B7 + 39 00 00 00 00 00 02 0A B7 + 39 00 00 00 00 00 02 0B B7 + 39 00 00 00 00 00 02 0C B8 + 39 00 00 00 00 00 02 0D B9 + 39 00 00 00 00 00 02 0E B9 + 39 00 00 00 00 00 02 0F BA + 39 00 00 00 00 00 02 10 BA + 39 00 00 00 00 00 02 11 BA + 39 00 00 00 00 00 02 12 BB + 39 00 00 00 00 00 02 13 BB + 39 00 00 00 00 00 02 14 BC + 39 00 00 00 00 00 02 15 BC + 39 00 00 00 00 00 02 16 BC + 39 00 00 00 00 00 02 17 BD + 39 00 00 00 00 00 02 18 BD + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 1A BE + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1C BF + 39 00 00 00 00 00 02 1D BF + 39 00 00 00 00 00 02 1E BF + 39 00 00 00 00 00 02 1F BF + 39 00 00 00 00 00 02 20 BF + 39 00 00 00 00 00 02 21 C0 + 39 00 00 00 00 00 02 22 C1 + 39 00 00 00 00 00 02 23 C1 + 39 00 00 00 00 00 02 24 C2 + 39 00 00 00 00 00 02 25 C2 + 39 00 00 00 00 00 02 26 C3 + 39 00 00 00 00 00 02 27 C4 + 39 00 00 00 00 00 02 28 C4 + 39 00 00 00 00 00 02 29 C5 + 39 00 00 00 00 00 02 2A C5 + 39 00 00 00 00 00 02 2B C6 + 39 00 00 00 00 00 02 2C C6 + 39 00 00 00 00 00 02 2D C7 + 39 00 00 00 00 00 02 2E C7 + 39 00 00 00 00 00 02 2F C8 + 39 00 00 00 00 00 02 30 C8 + 39 00 00 00 00 00 02 31 C8 + 39 00 00 00 00 00 02 32 C9 + 39 00 00 00 00 00 02 33 C9 + 39 00 00 00 00 00 02 34 C9 + 39 00 00 00 00 00 02 35 C9 + 39 00 00 00 00 00 02 36 CA + 39 00 00 00 00 00 02 37 CB + 39 00 00 00 00 00 02 38 CB + 39 00 00 00 00 00 02 39 CA + 39 00 00 00 00 00 02 3A CA + 39 00 00 00 00 00 02 3B CB + 39 00 00 00 00 00 02 3C CB + 39 00 00 00 00 00 02 3D CB + 39 00 00 00 00 00 02 3E CB + 39 00 00 00 00 00 02 3F CB + 39 00 00 00 00 00 02 40 CB + 39 00 00 00 00 00 02 41 CB + 39 00 00 00 00 00 02 42 CB + 39 00 00 00 00 00 02 43 CC + 39 00 00 00 00 00 02 44 CD + 39 00 00 00 00 00 02 45 CE + 39 00 00 00 00 00 02 46 CF + 39 00 00 00 00 00 02 47 D0 + 39 00 00 00 00 00 02 48 D0 + 39 00 00 00 00 00 02 49 D1 + 39 00 00 00 00 00 02 4A D2 + 39 00 00 00 00 00 02 4B D2 + 39 00 00 00 00 00 02 4C D3 + 39 00 00 00 00 00 02 4D D4 + 39 00 00 00 00 00 02 4E D5 + 39 00 00 00 00 00 02 4F D5 + 39 00 00 00 00 00 02 50 D5 + 39 00 00 00 00 00 02 51 D6 + 39 00 00 00 00 00 02 52 D6 + 39 00 00 00 00 00 02 53 D7 + 39 00 00 00 00 00 02 54 D7 + 39 00 00 00 00 00 02 55 D8 + 39 00 00 00 00 00 02 56 D8 + 39 00 00 00 00 00 02 57 D8 + 39 00 00 00 00 00 02 58 D8 + 39 00 00 00 00 00 02 59 D9 + 39 00 00 00 00 00 02 5A D9 + 39 00 00 00 00 00 02 5B D9 + 39 00 00 00 00 00 02 5C D9 + 39 00 00 00 00 00 02 5D D9 + 39 00 00 00 00 00 02 5E D9 + 39 00 00 00 00 00 02 5F D9 + 39 00 00 00 00 00 02 60 D9 + 39 00 00 00 00 00 02 61 D9 + 39 00 00 00 00 00 02 62 D9 + 39 00 00 00 00 00 02 63 DA + 39 00 00 00 00 00 02 64 DA + 39 00 00 00 00 00 02 65 DB + 39 00 00 00 00 00 02 66 DC + 39 00 00 00 00 00 02 67 DC + 39 00 00 00 00 00 02 68 DD + 39 00 00 00 00 00 02 69 DD + 39 00 00 00 00 00 02 6A DE + 39 00 00 00 00 00 02 6B DE + 39 00 00 00 00 00 02 6C DE + 39 00 00 00 00 00 02 6D DE + 39 00 00 00 00 00 02 6E DE + 39 00 00 00 00 00 02 6F DF + 39 00 00 00 00 00 02 70 DF + 39 00 00 00 00 00 02 71 DE + 39 00 00 00 00 00 02 72 DE + 39 00 00 00 00 00 02 73 DF + 39 00 00 00 00 00 02 74 DF + 39 00 00 00 00 00 02 75 E0 + 39 00 00 00 00 00 02 76 E1 + 39 00 00 00 00 00 02 77 E1 + 39 00 00 00 00 00 02 78 E2 + 39 00 00 00 00 00 02 79 E2 + 39 00 00 00 00 00 02 7A E2 + 39 00 00 00 00 00 02 7B E3 + 39 00 00 00 00 00 02 7C E3 + 39 00 00 00 00 00 02 7D E3 + 39 00 00 00 00 00 02 7E E3 + 39 00 00 00 00 00 02 7F E3 + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 25 + 39 00 00 00 00 00 02 02 25 + 39 00 00 00 00 00 02 03 24 + 39 00 00 00 00 00 02 04 23 + 39 00 00 00 00 00 02 05 23 + 39 00 00 00 00 00 02 06 22 + 39 00 00 00 00 00 02 07 21 + 39 00 00 00 00 00 02 08 20 + 39 00 00 00 00 00 02 09 20 + 39 00 00 00 00 00 02 0A 1F + 39 00 00 00 00 00 02 0B 1E + 39 00 00 00 00 00 02 0C 1D + 39 00 00 00 00 00 02 0D 1B + 39 00 00 00 00 00 02 0E 1B + 39 00 00 00 00 00 02 0F 1A + 39 00 00 00 00 00 02 10 19 + 39 00 00 00 00 00 02 11 18 + 39 00 00 00 00 00 02 12 17 + 39 00 00 00 00 00 02 13 16 + 39 00 00 00 00 00 02 14 15 + 39 00 00 00 00 00 02 15 14 + 39 00 00 00 00 00 02 16 13 + 39 00 00 00 00 00 02 17 12 + 39 00 00 00 00 00 02 18 12 + 39 00 00 00 00 00 02 19 11 + 39 00 00 00 00 00 02 1A 10 + 39 00 00 00 00 00 02 1B 0F + 39 00 00 00 00 00 02 1C 0E + 39 00 00 00 00 00 02 1D 0D + 39 00 00 00 00 00 02 1E 0C + 39 00 00 00 00 00 02 1F 0C + 39 00 00 00 00 00 02 20 0B + 39 00 00 00 00 00 02 21 0A + 39 00 00 00 00 00 02 22 09 + 39 00 00 00 00 00 02 23 08 + 39 00 00 00 00 00 02 24 08 + 39 00 00 00 00 00 02 25 07 + 39 00 00 00 00 00 02 26 06 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 28 04 + 39 00 00 00 00 00 02 29 04 + 39 00 00 00 00 00 02 2A 03 + 39 00 00 00 00 00 02 2B 02 + 39 00 00 00 00 00 02 2C 02 + 39 00 00 00 00 00 02 2D 01 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 30 81 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 38 89 + 39 00 00 00 00 00 02 39 8A + 39 00 00 00 00 00 02 3A 8B + 39 00 00 00 00 00 02 3B 8B + 39 00 00 00 00 00 02 3C 8C + 39 00 00 00 00 00 02 3D 8D + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3F 8F + 39 00 00 00 00 00 02 40 90 + 39 00 00 00 00 00 02 41 91 + 39 00 00 00 00 00 02 42 91 + 39 00 00 00 00 00 02 43 92 + 39 00 00 00 00 00 02 44 93 + 39 00 00 00 00 00 02 45 94 + 39 00 00 00 00 00 02 46 94 + 39 00 00 00 00 00 02 47 95 + 39 00 00 00 00 00 02 48 96 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 4A 98 + 39 00 00 00 00 00 02 4B 99 + 39 00 00 00 00 00 02 4C 99 + 39 00 00 00 00 00 02 4D 99 + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 51 9C + 39 00 00 00 00 00 02 52 9C + 39 00 00 00 00 00 02 53 9D + 39 00 00 00 00 00 02 54 9D + 39 00 00 00 00 00 02 55 9E + 39 00 00 00 00 00 02 56 9E + 39 00 00 00 00 00 02 57 9F + 39 00 00 00 00 00 02 58 A0 + 39 00 00 00 00 00 02 59 A2 + 39 00 00 00 00 00 02 5A A3 + 39 00 00 00 00 00 02 5B A4 + 39 00 00 00 00 00 02 5C A5 + 39 00 00 00 00 00 02 5D A6 + 39 00 00 00 00 00 02 5E A7 + 39 00 00 00 00 00 02 5F A9 + 39 00 00 00 00 00 02 60 AA + 39 00 00 00 00 00 02 61 AB + 39 00 00 00 00 00 02 62 AC + 39 00 00 00 00 00 02 63 AD + 39 00 00 00 00 00 02 64 AE + 39 00 00 00 00 00 02 65 AF + 39 00 00 00 00 00 02 66 B0 + 39 00 00 00 00 00 02 67 B1 + 39 00 00 00 00 00 02 68 B2 + 39 00 00 00 00 00 02 69 B3 + 39 00 00 00 00 00 02 6A B4 + 39 00 00 00 00 00 02 6B B5 + 39 00 00 00 00 00 02 6C B6 + 39 00 00 00 00 00 02 6D B7 + 39 00 00 00 00 00 02 6E B7 + 39 00 00 00 00 00 02 6F B8 + 39 00 00 00 00 00 02 70 B9 + 39 00 00 00 00 00 02 71 BA + 39 00 00 00 00 00 02 72 BA + 39 00 00 00 00 00 02 73 BB + 39 00 00 00 00 00 02 74 BB + 39 00 00 00 00 00 02 75 BC + 39 00 00 00 00 00 02 76 BD + 39 00 00 00 00 00 02 77 BD + 39 00 00 00 00 00 02 78 BE + 39 00 00 00 00 00 02 79 BE + 39 00 00 00 00 00 02 7A BF + 39 00 00 00 00 00 02 7B BF + 39 00 00 00 00 00 02 7C C1 + 39 00 00 00 00 00 02 7D C2 + 39 00 00 00 00 00 02 7E C3 + 39 00 00 00 00 00 02 7F C4 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F B1 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 B1 + 39 00 00 00 00 00 02 7F E3 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 27 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 26 + 39 00 00 00 00 00 02 7F C4 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F C4 + 39 00 00 00 00 00 02 7E C3 + 39 00 00 00 00 00 02 7D C2 + 39 00 00 00 00 00 02 7C C1 + 39 00 00 00 00 00 02 7B BF + 39 00 00 00 00 00 02 7A BF + 39 00 00 00 00 00 02 79 BE + 39 00 00 00 00 00 02 78 BE + 39 00 00 00 00 00 02 77 BD + 39 00 00 00 00 00 02 76 BD + 39 00 00 00 00 00 02 75 BC + 39 00 00 00 00 00 02 74 BB + 39 00 00 00 00 00 02 73 BB + 39 00 00 00 00 00 02 72 BA + 39 00 00 00 00 00 02 71 BA + 39 00 00 00 00 00 02 70 B9 + 39 00 00 00 00 00 02 6F B8 + 39 00 00 00 00 00 02 6E B7 + 39 00 00 00 00 00 02 6D B7 + 39 00 00 00 00 00 02 6C B6 + 39 00 00 00 00 00 02 6B B5 + 39 00 00 00 00 00 02 6A B4 + 39 00 00 00 00 00 02 69 B3 + 39 00 00 00 00 00 02 68 B2 + 39 00 00 00 00 00 02 67 B1 + 39 00 00 00 00 00 02 66 B0 + 39 00 00 00 00 00 02 65 AF + 39 00 00 00 00 00 02 64 AE + 39 00 00 00 00 00 02 63 AD + 39 00 00 00 00 00 02 62 AC + 39 00 00 00 00 00 02 61 AB + 39 00 00 00 00 00 02 60 AA + 39 00 00 00 00 00 02 5F A9 + 39 00 00 00 00 00 02 5E A7 + 39 00 00 00 00 00 02 5D A6 + 39 00 00 00 00 00 02 5C A5 + 39 00 00 00 00 00 02 5B A4 + 39 00 00 00 00 00 02 5A A3 + 39 00 00 00 00 00 02 59 A2 + 39 00 00 00 00 00 02 58 A0 + 39 00 00 00 00 00 02 57 9F + 39 00 00 00 00 00 02 56 9E + 39 00 00 00 00 00 02 55 9E + 39 00 00 00 00 00 02 54 9D + 39 00 00 00 00 00 02 53 9D + 39 00 00 00 00 00 02 52 9C + 39 00 00 00 00 00 02 51 9C + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4D 99 + 39 00 00 00 00 00 02 4C 99 + 39 00 00 00 00 00 02 4B 99 + 39 00 00 00 00 00 02 4A 98 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 48 96 + 39 00 00 00 00 00 02 47 95 + 39 00 00 00 00 00 02 46 94 + 39 00 00 00 00 00 02 45 94 + 39 00 00 00 00 00 02 44 93 + 39 00 00 00 00 00 02 43 92 + 39 00 00 00 00 00 02 42 91 + 39 00 00 00 00 00 02 41 91 + 39 00 00 00 00 00 02 40 90 + 39 00 00 00 00 00 02 3F 8F + 39 00 00 00 00 00 02 3E 8E + 39 00 00 00 00 00 02 3D 8D + 39 00 00 00 00 00 02 3C 8C + 39 00 00 00 00 00 02 3B 8B + 39 00 00 00 00 00 02 3A 8B + 39 00 00 00 00 00 02 39 8A + 39 00 00 00 00 00 02 38 89 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 35 86 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 30 81 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 2E 01 + 39 00 00 00 00 00 02 2D 01 + 39 00 00 00 00 00 02 2C 02 + 39 00 00 00 00 00 02 2B 02 + 39 00 00 00 00 00 02 2A 03 + 39 00 00 00 00 00 02 29 04 + 39 00 00 00 00 00 02 28 04 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 26 06 + 39 00 00 00 00 00 02 25 07 + 39 00 00 00 00 00 02 24 08 + 39 00 00 00 00 00 02 23 08 + 39 00 00 00 00 00 02 22 09 + 39 00 00 00 00 00 02 21 0A + 39 00 00 00 00 00 02 20 0B + 39 00 00 00 00 00 02 1F 0C + 39 00 00 00 00 00 02 1E 0C + 39 00 00 00 00 00 02 1D 0D + 39 00 00 00 00 00 02 1C 0E + 39 00 00 00 00 00 02 1B 0F + 39 00 00 00 00 00 02 1A 10 + 39 00 00 00 00 00 02 19 11 + 39 00 00 00 00 00 02 18 12 + 39 00 00 00 00 00 02 17 12 + 39 00 00 00 00 00 02 16 13 + 39 00 00 00 00 00 02 15 14 + 39 00 00 00 00 00 02 14 15 + 39 00 00 00 00 00 02 13 16 + 39 00 00 00 00 00 02 12 17 + 39 00 00 00 00 00 02 11 18 + 39 00 00 00 00 00 02 10 19 + 39 00 00 00 00 00 02 0F 1A + 39 00 00 00 00 00 02 0E 1B + 39 00 00 00 00 00 02 0D 1B + 39 00 00 00 00 00 02 0C 1D + 39 00 00 00 00 00 02 0B 1E + 39 00 00 00 00 00 02 0A 1F + 39 00 00 00 00 00 02 09 20 + 39 00 00 00 00 00 02 08 20 + 39 00 00 00 00 00 02 07 21 + 39 00 00 00 00 00 02 06 22 + 39 00 00 00 00 00 02 05 23 + 39 00 00 00 00 00 02 04 23 + 39 00 00 00 00 00 02 03 24 + 39 00 00 00 00 00 02 02 25 + 39 00 00 00 00 00 02 01 25 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 02 7E 83 + 39 00 00 00 00 00 02 7D 83 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 71 83 + 39 00 00 00 00 00 02 70 83 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6D 84 + 39 00 00 00 00 00 02 6C 84 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 67 83 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 56 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 3F 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3B 85 + 39 00 00 00 00 00 02 3A 85 + 39 00 00 00 00 00 02 39 85 + 39 00 00 00 00 00 02 38 84 + 39 00 00 00 00 00 02 37 84 + 39 00 00 00 00 00 02 36 84 + 39 00 00 00 00 00 02 35 83 + 39 00 00 00 00 00 02 34 83 + 39 00 00 00 00 00 02 33 82 + 39 00 00 00 00 00 02 32 82 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 30 00 + 39 00 00 00 00 00 02 2F 00 + 39 00 00 00 00 00 02 2E 00 + 39 00 00 00 00 00 02 2D 81 + 39 00 00 00 00 00 02 2C 81 + 39 00 00 00 00 00 02 2B 81 + 39 00 00 00 00 00 02 2A 81 + 39 00 00 00 00 00 02 29 81 + 39 00 00 00 00 00 02 28 82 + 39 00 00 00 00 00 02 27 82 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 19 82 + 39 00 00 00 00 00 02 18 82 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 16 81 + 39 00 00 00 00 00 02 15 81 + 39 00 00 00 00 00 02 14 81 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 12 00 + 39 00 00 00 00 00 02 11 01 + 39 00 00 00 00 00 02 10 01 + 39 00 00 00 00 00 02 0F 01 + 39 00 00 00 00 00 02 0E 01 + 39 00 00 00 00 00 02 0D 00 + 39 00 00 00 00 00 02 0C 00 + 39 00 00 00 00 00 02 0B 00 + 39 00 00 00 00 00 02 0A 00 + 39 00 00 00 00 00 02 09 00 + 39 00 00 00 00 00 02 08 00 + 39 00 00 00 00 00 02 07 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 01 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F E3 + 39 00 00 00 00 00 02 7E E3 + 39 00 00 00 00 00 02 7D E3 + 39 00 00 00 00 00 02 7C E3 + 39 00 00 00 00 00 02 7B E3 + 39 00 00 00 00 00 02 7A E2 + 39 00 00 00 00 00 02 79 E2 + 39 00 00 00 00 00 02 78 E2 + 39 00 00 00 00 00 02 77 E1 + 39 00 00 00 00 00 02 76 E1 + 39 00 00 00 00 00 02 75 E0 + 39 00 00 00 00 00 02 74 DF + 39 00 00 00 00 00 02 73 DF + 39 00 00 00 00 00 02 72 DE + 39 00 00 00 00 00 02 71 DE + 39 00 00 00 00 00 02 70 DF + 39 00 00 00 00 00 02 6F DF + 39 00 00 00 00 00 02 6E DE + 39 00 00 00 00 00 02 6D DE + 39 00 00 00 00 00 02 6C DE + 39 00 00 00 00 00 02 6B DE + 39 00 00 00 00 00 02 6A DE + 39 00 00 00 00 00 02 69 DD + 39 00 00 00 00 00 02 68 DD + 39 00 00 00 00 00 02 67 DC + 39 00 00 00 00 00 02 66 DC + 39 00 00 00 00 00 02 65 DB + 39 00 00 00 00 00 02 64 DA + 39 00 00 00 00 00 02 63 DA + 39 00 00 00 00 00 02 62 D9 + 39 00 00 00 00 00 02 61 D9 + 39 00 00 00 00 00 02 60 D9 + 39 00 00 00 00 00 02 5F D9 + 39 00 00 00 00 00 02 5E D9 + 39 00 00 00 00 00 02 5D D9 + 39 00 00 00 00 00 02 5C D9 + 39 00 00 00 00 00 02 5B D9 + 39 00 00 00 00 00 02 5A D9 + 39 00 00 00 00 00 02 59 D9 + 39 00 00 00 00 00 02 58 D8 + 39 00 00 00 00 00 02 57 D8 + 39 00 00 00 00 00 02 56 D8 + 39 00 00 00 00 00 02 55 D8 + 39 00 00 00 00 00 02 54 D7 + 39 00 00 00 00 00 02 53 D7 + 39 00 00 00 00 00 02 52 D6 + 39 00 00 00 00 00 02 51 D6 + 39 00 00 00 00 00 02 50 D5 + 39 00 00 00 00 00 02 4F D5 + 39 00 00 00 00 00 02 4E D5 + 39 00 00 00 00 00 02 4D D4 + 39 00 00 00 00 00 02 4C D3 + 39 00 00 00 00 00 02 4B D2 + 39 00 00 00 00 00 02 4A D2 + 39 00 00 00 00 00 02 49 D1 + 39 00 00 00 00 00 02 48 D0 + 39 00 00 00 00 00 02 47 D0 + 39 00 00 00 00 00 02 46 CF + 39 00 00 00 00 00 02 45 CE + 39 00 00 00 00 00 02 44 CD + 39 00 00 00 00 00 02 43 CC + 39 00 00 00 00 00 02 42 CB + 39 00 00 00 00 00 02 41 CB + 39 00 00 00 00 00 02 40 CB + 39 00 00 00 00 00 02 3F CB + 39 00 00 00 00 00 02 3E CB + 39 00 00 00 00 00 02 3D CB + 39 00 00 00 00 00 02 3C CB + 39 00 00 00 00 00 02 3B CB + 39 00 00 00 00 00 02 3A CA + 39 00 00 00 00 00 02 39 CA + 39 00 00 00 00 00 02 38 CB + 39 00 00 00 00 00 02 37 CB + 39 00 00 00 00 00 02 36 CA + 39 00 00 00 00 00 02 35 C9 + 39 00 00 00 00 00 02 34 C9 + 39 00 00 00 00 00 02 33 C9 + 39 00 00 00 00 00 02 32 C9 + 39 00 00 00 00 00 02 31 C8 + 39 00 00 00 00 00 02 30 C8 + 39 00 00 00 00 00 02 2F C8 + 39 00 00 00 00 00 02 2E C7 + 39 00 00 00 00 00 02 2D C7 + 39 00 00 00 00 00 02 2C C6 + 39 00 00 00 00 00 02 2B C6 + 39 00 00 00 00 00 02 2A C5 + 39 00 00 00 00 00 02 29 C5 + 39 00 00 00 00 00 02 28 C4 + 39 00 00 00 00 00 02 27 C4 + 39 00 00 00 00 00 02 26 C3 + 39 00 00 00 00 00 02 25 C2 + 39 00 00 00 00 00 02 24 C2 + 39 00 00 00 00 00 02 23 C1 + 39 00 00 00 00 00 02 22 C1 + 39 00 00 00 00 00 02 21 C0 + 39 00 00 00 00 00 02 20 BF + 39 00 00 00 00 00 02 1F BF + 39 00 00 00 00 00 02 1E BF + 39 00 00 00 00 00 02 1D BF + 39 00 00 00 00 00 02 1C BF + 39 00 00 00 00 00 02 1B BE + 39 00 00 00 00 00 02 1A BE + 39 00 00 00 00 00 02 19 BD + 39 00 00 00 00 00 02 18 BD + 39 00 00 00 00 00 02 17 BD + 39 00 00 00 00 00 02 16 BC + 39 00 00 00 00 00 02 15 BC + 39 00 00 00 00 00 02 14 BC + 39 00 00 00 00 00 02 13 BB + 39 00 00 00 00 00 02 12 BB + 39 00 00 00 00 00 02 11 BA + 39 00 00 00 00 00 02 10 BA + 39 00 00 00 00 00 02 0F BA + 39 00 00 00 00 00 02 0E B9 + 39 00 00 00 00 00 02 0D B9 + 39 00 00 00 00 00 02 0C B8 + 39 00 00 00 00 00 02 0B B7 + 39 00 00 00 00 00 02 0A B7 + 39 00 00 00 00 00 02 09 B7 + 39 00 00 00 00 00 02 08 B6 + 39 00 00 00 00 00 02 07 B5 + 39 00 00 00 00 00 02 06 B5 + 39 00 00 00 00 00 02 05 B4 + 39 00 00 00 00 00 02 04 B4 + 39 00 00 00 00 00 02 03 B3 + 39 00 00 00 00 00 02 02 B2 + 39 00 00 00 00 00 02 01 B2 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F B1 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 B1 + 39 00 00 00 00 00 02 7F E3 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 27 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 26 + 39 00 00 00 00 00 02 7F C4 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 27 + 39 00 00 00 00 00 02 7E 28 + 39 00 00 00 00 00 02 7D 28 + 39 00 00 00 00 00 02 7C 29 + 39 00 00 00 00 00 02 7B 29 + 39 00 00 00 00 00 02 7A 2A + 39 00 00 00 00 00 02 79 2B + 39 00 00 00 00 00 02 78 2C + 39 00 00 00 00 00 02 77 2C + 39 00 00 00 00 00 02 76 2D + 39 00 00 00 00 00 02 75 2E + 39 00 00 00 00 00 02 74 2E + 39 00 00 00 00 00 02 73 2F + 39 00 00 00 00 00 02 72 30 + 39 00 00 00 00 00 02 71 30 + 39 00 00 00 00 00 02 70 31 + 39 00 00 00 00 00 02 6F 32 + 39 00 00 00 00 00 02 6E 32 + 39 00 00 00 00 00 02 6D 33 + 39 00 00 00 00 00 02 6C 34 + 39 00 00 00 00 00 02 6B 34 + 39 00 00 00 00 00 02 6A 35 + 39 00 00 00 00 00 02 69 35 + 39 00 00 00 00 00 02 68 36 + 39 00 00 00 00 00 02 67 36 + 39 00 00 00 00 00 02 66 37 + 39 00 00 00 00 00 02 65 37 + 39 00 00 00 00 00 02 64 38 + 39 00 00 00 00 00 02 63 38 + 39 00 00 00 00 00 02 62 39 + 39 00 00 00 00 00 02 61 3A + 39 00 00 00 00 00 02 60 3C + 39 00 00 00 00 00 02 5F 3D + 39 00 00 00 00 00 02 5E 3D + 39 00 00 00 00 00 02 5D 3E + 39 00 00 00 00 00 02 5C 3F + 39 00 00 00 00 00 02 5B 40 + 39 00 00 00 00 00 02 5A 41 + 39 00 00 00 00 00 02 59 42 + 39 00 00 00 00 00 02 58 43 + 39 00 00 00 00 00 02 57 44 + 39 00 00 00 00 00 02 56 45 + 39 00 00 00 00 00 02 55 46 + 39 00 00 00 00 00 02 54 47 + 39 00 00 00 00 00 02 53 48 + 39 00 00 00 00 00 02 52 49 + 39 00 00 00 00 00 02 51 49 + 39 00 00 00 00 00 02 50 4A + 39 00 00 00 00 00 02 4F 4B + 39 00 00 00 00 00 02 4E 4C + 39 00 00 00 00 00 02 4D 4D + 39 00 00 00 00 00 02 4C 4D + 39 00 00 00 00 00 02 4B 4E + 39 00 00 00 00 00 02 4A 4E + 39 00 00 00 00 00 02 49 4F + 39 00 00 00 00 00 02 48 50 + 39 00 00 00 00 00 02 47 51 + 39 00 00 00 00 00 02 46 52 + 39 00 00 00 00 00 02 45 53 + 39 00 00 00 00 00 02 44 53 + 39 00 00 00 00 00 02 43 52 + 39 00 00 00 00 00 02 42 52 + 39 00 00 00 00 00 02 41 53 + 39 00 00 00 00 00 02 40 53 + 39 00 00 00 00 00 02 3F 54 + 39 00 00 00 00 00 02 3E 55 + 39 00 00 00 00 00 02 3D 56 + 39 00 00 00 00 00 02 3C 57 + 39 00 00 00 00 00 02 3B 58 + 39 00 00 00 00 00 02 3A 59 + 39 00 00 00 00 00 02 39 5A + 39 00 00 00 00 00 02 38 5B + 39 00 00 00 00 00 02 37 5C + 39 00 00 00 00 00 02 36 5D + 39 00 00 00 00 00 02 35 5D + 39 00 00 00 00 00 02 34 5E + 39 00 00 00 00 00 02 33 5F + 39 00 00 00 00 00 02 32 60 + 39 00 00 00 00 00 02 31 61 + 39 00 00 00 00 00 02 30 62 + 39 00 00 00 00 00 02 2F 63 + 39 00 00 00 00 00 02 2E 64 + 39 00 00 00 00 00 02 2D 63 + 39 00 00 00 00 00 02 2C 62 + 39 00 00 00 00 00 02 2B 62 + 39 00 00 00 00 00 02 2A 63 + 39 00 00 00 00 00 02 29 64 + 39 00 00 00 00 00 02 28 65 + 39 00 00 00 00 00 02 27 66 + 39 00 00 00 00 00 02 26 67 + 39 00 00 00 00 00 02 25 67 + 39 00 00 00 00 00 02 24 68 + 39 00 00 00 00 00 02 23 68 + 39 00 00 00 00 00 02 22 69 + 39 00 00 00 00 00 02 21 69 + 39 00 00 00 00 00 02 20 6A + 39 00 00 00 00 00 02 1F 96 + 39 00 00 00 00 00 02 1E 95 + 39 00 00 00 00 00 02 1D 95 + 39 00 00 00 00 00 02 1C 94 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1A 93 + 39 00 00 00 00 00 02 19 92 + 39 00 00 00 00 00 02 18 91 + 39 00 00 00 00 00 02 17 90 + 39 00 00 00 00 00 02 16 8F + 39 00 00 00 00 00 02 15 8F + 39 00 00 00 00 00 02 14 8E + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 12 8D + 39 00 00 00 00 00 02 11 8C + 39 00 00 00 00 00 02 10 8B + 39 00 00 00 00 00 02 0F 8B + 39 00 00 00 00 00 02 0E 8A + 39 00 00 00 00 00 02 0D 89 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0A 87 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 07 84 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 04 84 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 78 03 + 39 00 00 00 00 00 02 77 03 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 75 04 + 39 00 00 00 00 00 02 74 04 + 39 00 00 00 00 00 02 73 04 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6A 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 66 06 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 56 05 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 45 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 08 + 39 00 00 00 00 00 02 39 08 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 37 08 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 33 05 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 31 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 07 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 09 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 06 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F B1 + 39 00 00 00 00 00 02 7E AF + 39 00 00 00 00 00 02 7D AF + 39 00 00 00 00 00 02 7C AF + 39 00 00 00 00 00 02 7B AF + 39 00 00 00 00 00 02 7A AE + 39 00 00 00 00 00 02 79 AE + 39 00 00 00 00 00 02 78 AD + 39 00 00 00 00 00 02 77 AD + 39 00 00 00 00 00 02 76 AD + 39 00 00 00 00 00 02 75 AD + 39 00 00 00 00 00 02 74 AC + 39 00 00 00 00 00 02 73 AC + 39 00 00 00 00 00 02 72 AB + 39 00 00 00 00 00 02 71 AB + 39 00 00 00 00 00 02 70 AB + 39 00 00 00 00 00 02 6F AA + 39 00 00 00 00 00 02 6E AA + 39 00 00 00 00 00 02 6D AA + 39 00 00 00 00 00 02 6C A9 + 39 00 00 00 00 00 02 6B A9 + 39 00 00 00 00 00 02 6A A9 + 39 00 00 00 00 00 02 69 A8 + 39 00 00 00 00 00 02 68 A8 + 39 00 00 00 00 00 02 67 A8 + 39 00 00 00 00 00 02 66 A8 + 39 00 00 00 00 00 02 65 A7 + 39 00 00 00 00 00 02 64 A7 + 39 00 00 00 00 00 02 63 A7 + 39 00 00 00 00 00 02 62 A6 + 39 00 00 00 00 00 02 61 A6 + 39 00 00 00 00 00 02 60 A6 + 39 00 00 00 00 00 02 5F A6 + 39 00 00 00 00 00 02 5E A6 + 39 00 00 00 00 00 02 5D A6 + 39 00 00 00 00 00 02 5C A6 + 39 00 00 00 00 00 02 5B A5 + 39 00 00 00 00 00 02 5A A5 + 39 00 00 00 00 00 02 59 A4 + 39 00 00 00 00 00 02 58 A3 + 39 00 00 00 00 00 02 57 A2 + 39 00 00 00 00 00 02 56 A2 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 54 A1 + 39 00 00 00 00 00 02 53 A0 + 39 00 00 00 00 00 02 52 9F + 39 00 00 00 00 00 02 51 9E + 39 00 00 00 00 00 02 50 9E + 39 00 00 00 00 00 02 4F 9D + 39 00 00 00 00 00 02 4E 9D + 39 00 00 00 00 00 02 4D 9C + 39 00 00 00 00 00 02 4C 9B + 39 00 00 00 00 00 02 4B 9B + 39 00 00 00 00 00 02 4A 9B + 39 00 00 00 00 00 02 49 9A + 39 00 00 00 00 00 02 48 9A + 39 00 00 00 00 00 02 47 99 + 39 00 00 00 00 00 02 46 99 + 39 00 00 00 00 00 02 45 99 + 39 00 00 00 00 00 02 44 98 + 39 00 00 00 00 00 02 43 98 + 39 00 00 00 00 00 02 42 97 + 39 00 00 00 00 00 02 41 97 + 39 00 00 00 00 00 02 40 96 + 39 00 00 00 00 00 02 3F 96 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3D 97 + 39 00 00 00 00 00 02 3C 97 + 39 00 00 00 00 00 02 3B 97 + 39 00 00 00 00 00 02 3A 97 + 39 00 00 00 00 00 02 39 96 + 39 00 00 00 00 00 02 38 95 + 39 00 00 00 00 00 02 37 95 + 39 00 00 00 00 00 02 36 94 + 39 00 00 00 00 00 02 35 93 + 39 00 00 00 00 00 02 34 93 + 39 00 00 00 00 00 02 33 92 + 39 00 00 00 00 00 02 32 91 + 39 00 00 00 00 00 02 31 91 + 39 00 00 00 00 00 02 30 90 + 39 00 00 00 00 00 02 2F 90 + 39 00 00 00 00 00 02 2E 8F + 39 00 00 00 00 00 02 2D 8E + 39 00 00 00 00 00 02 2C 8D + 39 00 00 00 00 00 02 2B 8D + 39 00 00 00 00 00 02 2A 8C + 39 00 00 00 00 00 02 29 8E + 39 00 00 00 00 00 02 28 8F + 39 00 00 00 00 00 02 27 8F + 39 00 00 00 00 00 02 26 8E + 39 00 00 00 00 00 02 25 8E + 39 00 00 00 00 00 02 24 8D + 39 00 00 00 00 00 02 23 8C + 39 00 00 00 00 00 02 22 8C + 39 00 00 00 00 00 02 21 8C + 39 00 00 00 00 00 02 20 8C + 39 00 00 00 00 00 02 1F 8C + 39 00 00 00 00 00 02 1E 8B + 39 00 00 00 00 00 02 1D 8B + 39 00 00 00 00 00 02 1C 8B + 39 00 00 00 00 00 02 1B 8B + 39 00 00 00 00 00 02 1A 8B + 39 00 00 00 00 00 02 19 8A + 39 00 00 00 00 00 02 18 8A + 39 00 00 00 00 00 02 17 89 + 39 00 00 00 00 00 02 16 89 + 39 00 00 00 00 00 02 15 88 + 39 00 00 00 00 00 02 14 88 + 39 00 00 00 00 00 02 13 88 + 39 00 00 00 00 00 02 12 88 + 39 00 00 00 00 00 02 11 87 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 0F 86 + 39 00 00 00 00 00 02 0E 86 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0C 85 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0A 84 + 39 00 00 00 00 00 02 09 84 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + + ]; + + + qcom,mdss-dsi-panel-eye-command05 = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 66 05 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 75 03 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7F 00 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 84 + 39 00 00 00 00 00 02 0A 84 + 39 00 00 00 00 00 02 0B 85 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0D 86 + 39 00 00 00 00 00 02 0E 87 + 39 00 00 00 00 00 02 0F 87 + 39 00 00 00 00 00 02 10 88 + 39 00 00 00 00 00 02 11 88 + 39 00 00 00 00 00 02 12 89 + 39 00 00 00 00 00 02 13 89 + 39 00 00 00 00 00 02 14 8A + 39 00 00 00 00 00 02 15 8A + 39 00 00 00 00 00 02 16 8A + 39 00 00 00 00 00 02 17 8B + 39 00 00 00 00 00 02 18 8C + 39 00 00 00 00 00 02 19 8C + 39 00 00 00 00 00 02 1A 8D + 39 00 00 00 00 00 02 1B 8D + 39 00 00 00 00 00 02 1C 8E + 39 00 00 00 00 00 02 1D 8E + 39 00 00 00 00 00 02 1E 8E + 39 00 00 00 00 00 02 1F 8E + 39 00 00 00 00 00 02 20 8F + 39 00 00 00 00 00 02 21 8F + 39 00 00 00 00 00 02 22 8F + 39 00 00 00 00 00 02 23 8F + 39 00 00 00 00 00 02 24 90 + 39 00 00 00 00 00 02 25 91 + 39 00 00 00 00 00 02 26 91 + 39 00 00 00 00 00 02 27 92 + 39 00 00 00 00 00 02 28 93 + 39 00 00 00 00 00 02 29 93 + 39 00 00 00 00 00 02 2A 92 + 39 00 00 00 00 00 02 2B 90 + 39 00 00 00 00 00 02 2C 91 + 39 00 00 00 00 00 02 2D 92 + 39 00 00 00 00 00 02 2E 93 + 39 00 00 00 00 00 02 2F 93 + 39 00 00 00 00 00 02 30 94 + 39 00 00 00 00 00 02 31 95 + 39 00 00 00 00 00 02 32 95 + 39 00 00 00 00 00 02 33 96 + 39 00 00 00 00 00 02 34 97 + 39 00 00 00 00 00 02 35 97 + 39 00 00 00 00 00 02 36 98 + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 38 9A + 39 00 00 00 00 00 02 39 9A + 39 00 00 00 00 00 02 3A 9B + 39 00 00 00 00 00 02 3B 9C + 39 00 00 00 00 00 02 3C 9D + 39 00 00 00 00 00 02 3D 9D + 39 00 00 00 00 00 02 3E 9D + 39 00 00 00 00 00 02 3F 9D + 39 00 00 00 00 00 02 40 9C + 39 00 00 00 00 00 02 41 9C + 39 00 00 00 00 00 02 42 9D + 39 00 00 00 00 00 02 43 9D + 39 00 00 00 00 00 02 44 9E + 39 00 00 00 00 00 02 45 9E + 39 00 00 00 00 00 02 46 9F + 39 00 00 00 00 00 02 47 9F + 39 00 00 00 00 00 02 48 9F + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 4A A0 + 39 00 00 00 00 00 02 4B A1 + 39 00 00 00 00 00 02 4C A2 + 39 00 00 00 00 00 02 4D A2 + 39 00 00 00 00 00 02 4E A3 + 39 00 00 00 00 00 02 4F A3 + 39 00 00 00 00 00 02 50 A4 + 39 00 00 00 00 00 02 51 A5 + 39 00 00 00 00 00 02 52 A5 + 39 00 00 00 00 00 02 53 A6 + 39 00 00 00 00 00 02 54 A7 + 39 00 00 00 00 00 02 55 A8 + 39 00 00 00 00 00 02 56 A9 + 39 00 00 00 00 00 02 57 AA + 39 00 00 00 00 00 02 58 AA + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 5A AC + 39 00 00 00 00 00 02 5B AD + 39 00 00 00 00 00 02 5C AD + 39 00 00 00 00 00 02 5D AE + 39 00 00 00 00 00 02 5E AE + 39 00 00 00 00 00 02 5F AE + 39 00 00 00 00 00 02 60 AF + 39 00 00 00 00 00 02 61 AF + 39 00 00 00 00 00 02 62 AF + 39 00 00 00 00 00 02 63 AF + 39 00 00 00 00 00 02 64 B0 + 39 00 00 00 00 00 02 65 B0 + 39 00 00 00 00 00 02 66 B0 + 39 00 00 00 00 00 02 67 B1 + 39 00 00 00 00 00 02 68 B1 + 39 00 00 00 00 00 02 69 B1 + 39 00 00 00 00 00 02 6A B2 + 39 00 00 00 00 00 02 6B B2 + 39 00 00 00 00 00 02 6C B2 + 39 00 00 00 00 00 02 6D B3 + 39 00 00 00 00 00 02 6E B3 + 39 00 00 00 00 00 02 6F B4 + 39 00 00 00 00 00 02 70 B4 + 39 00 00 00 00 00 02 71 B5 + 39 00 00 00 00 00 02 72 B5 + 39 00 00 00 00 00 02 73 B6 + 39 00 00 00 00 00 02 74 B6 + 39 00 00 00 00 00 02 75 B6 + 39 00 00 00 00 00 02 76 B7 + 39 00 00 00 00 00 02 77 B7 + 39 00 00 00 00 00 02 78 B8 + 39 00 00 00 00 00 02 79 B8 + 39 00 00 00 00 00 02 7A B8 + 39 00 00 00 00 00 02 7B B9 + 39 00 00 00 00 00 02 7C B9 + 39 00 00 00 00 00 02 7D BA + 39 00 00 00 00 00 02 7E BA + 39 00 00 00 00 00 02 7F BB + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 04 85 + 39 00 00 00 00 00 02 05 85 + 39 00 00 00 00 00 02 06 85 + 39 00 00 00 00 00 02 07 86 + 39 00 00 00 00 00 02 08 87 + 39 00 00 00 00 00 02 09 88 + 39 00 00 00 00 00 02 0A 89 + 39 00 00 00 00 00 02 0B 89 + 39 00 00 00 00 00 02 0C 8A + 39 00 00 00 00 00 02 0D 8B + 39 00 00 00 00 00 02 0E 8C + 39 00 00 00 00 00 02 0F 8D + 39 00 00 00 00 00 02 10 8E + 39 00 00 00 00 00 02 11 8F + 39 00 00 00 00 00 02 12 90 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 14 92 + 39 00 00 00 00 00 02 15 93 + 39 00 00 00 00 00 02 16 93 + 39 00 00 00 00 00 02 17 94 + 39 00 00 00 00 00 02 18 95 + 39 00 00 00 00 00 02 19 96 + 39 00 00 00 00 00 02 1A 97 + 39 00 00 00 00 00 02 1B 98 + 39 00 00 00 00 00 02 1C 99 + 39 00 00 00 00 00 02 1D 9A + 39 00 00 00 00 00 02 1E 9B + 39 00 00 00 00 00 02 1F 9B + 39 00 00 00 00 00 02 20 64 + 39 00 00 00 00 00 02 21 63 + 39 00 00 00 00 00 02 22 63 + 39 00 00 00 00 00 02 23 62 + 39 00 00 00 00 00 02 24 61 + 39 00 00 00 00 00 02 25 61 + 39 00 00 00 00 00 02 26 60 + 39 00 00 00 00 00 02 27 60 + 39 00 00 00 00 00 02 28 5F + 39 00 00 00 00 00 02 29 5E + 39 00 00 00 00 00 02 2A 5D + 39 00 00 00 00 00 02 2B 5B + 39 00 00 00 00 00 02 2C 5A + 39 00 00 00 00 00 02 2D 59 + 39 00 00 00 00 00 02 2E 58 + 39 00 00 00 00 00 02 2F 59 + 39 00 00 00 00 00 02 30 5A + 39 00 00 00 00 00 02 31 5A + 39 00 00 00 00 00 02 32 59 + 39 00 00 00 00 00 02 33 57 + 39 00 00 00 00 00 02 34 56 + 39 00 00 00 00 00 02 35 55 + 39 00 00 00 00 00 02 36 54 + 39 00 00 00 00 00 02 37 53 + 39 00 00 00 00 00 02 38 52 + 39 00 00 00 00 00 02 39 51 + 39 00 00 00 00 00 02 3A 50 + 39 00 00 00 00 00 02 3B 4F + 39 00 00 00 00 00 02 3C 4E + 39 00 00 00 00 00 02 3D 4D + 39 00 00 00 00 00 02 3E 4C + 39 00 00 00 00 00 02 3F 4A + 39 00 00 00 00 00 02 40 49 + 39 00 00 00 00 00 02 41 48 + 39 00 00 00 00 00 02 42 47 + 39 00 00 00 00 00 02 43 46 + 39 00 00 00 00 00 02 44 45 + 39 00 00 00 00 00 02 45 44 + 39 00 00 00 00 00 02 46 44 + 39 00 00 00 00 00 02 47 44 + 39 00 00 00 00 00 02 48 44 + 39 00 00 00 00 00 02 49 44 + 39 00 00 00 00 00 02 4A 43 + 39 00 00 00 00 00 02 4B 42 + 39 00 00 00 00 00 02 4C 41 + 39 00 00 00 00 00 02 4D 40 + 39 00 00 00 00 00 02 4E 3F + 39 00 00 00 00 00 02 4F 3E + 39 00 00 00 00 00 02 50 3D + 39 00 00 00 00 00 02 51 3C + 39 00 00 00 00 00 02 52 3B + 39 00 00 00 00 00 02 53 3B + 39 00 00 00 00 00 02 54 3A + 39 00 00 00 00 00 02 55 39 + 39 00 00 00 00 00 02 56 38 + 39 00 00 00 00 00 02 57 37 + 39 00 00 00 00 00 02 58 36 + 39 00 00 00 00 00 02 59 35 + 39 00 00 00 00 00 02 5A 34 + 39 00 00 00 00 00 02 5B 33 + 39 00 00 00 00 00 02 5C 32 + 39 00 00 00 00 00 02 5D 30 + 39 00 00 00 00 00 02 5E 2F + 39 00 00 00 00 00 02 5F 2E + 39 00 00 00 00 00 02 60 2D + 39 00 00 00 00 00 02 61 2C + 39 00 00 00 00 00 02 62 2A + 39 00 00 00 00 00 02 63 2A + 39 00 00 00 00 00 02 64 29 + 39 00 00 00 00 00 02 65 28 + 39 00 00 00 00 00 02 66 26 + 39 00 00 00 00 00 02 67 25 + 39 00 00 00 00 00 02 68 24 + 39 00 00 00 00 00 02 69 23 + 39 00 00 00 00 00 02 6A 22 + 39 00 00 00 00 00 02 6B 21 + 39 00 00 00 00 00 02 6C 21 + 39 00 00 00 00 00 02 6D 20 + 39 00 00 00 00 00 02 6E 1F + 39 00 00 00 00 00 02 6F 1F + 39 00 00 00 00 00 02 70 1E + 39 00 00 00 00 00 02 71 1D + 39 00 00 00 00 00 02 72 1C + 39 00 00 00 00 00 02 73 1C + 39 00 00 00 00 00 02 74 1B + 39 00 00 00 00 00 02 75 1A + 39 00 00 00 00 00 02 76 19 + 39 00 00 00 00 00 02 77 18 + 39 00 00 00 00 00 02 78 18 + 39 00 00 00 00 00 02 79 17 + 39 00 00 00 00 00 02 7A 16 + 39 00 00 00 00 00 02 7B 15 + 39 00 00 00 00 00 02 7C 14 + 39 00 00 00 00 00 02 7D 13 + 39 00 00 00 00 00 02 7E 12 + 39 00 00 00 00 00 02 7F 12 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 1A 83 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3D 87 + 39 00 00 00 00 00 02 3E 87 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 42 87 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 46 87 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 4B 85 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 53 86 + 39 00 00 00 00 00 02 54 86 + 39 00 00 00 00 00 02 55 86 + 39 00 00 00 00 00 02 56 86 + 39 00 00 00 00 00 02 57 86 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 5A 85 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 60 85 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 64 85 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 67 84 + 39 00 00 00 00 00 02 68 84 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 6B 85 + 39 00 00 00 00 00 02 6C 86 + 39 00 00 00 00 00 02 6D 86 + 39 00 00 00 00 00 02 6E 86 + 39 00 00 00 00 00 02 6F 85 + 39 00 00 00 00 00 02 70 85 + 39 00 00 00 00 00 02 71 85 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 79 84 + 39 00 00 00 00 00 02 7A 84 + 39 00 00 00 00 00 02 7B 84 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7F 84 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 BB + 39 00 00 00 00 00 02 02 BD + 39 00 00 00 00 00 02 03 BD + 39 00 00 00 00 00 02 04 BE + 39 00 00 00 00 00 02 05 BF + 39 00 00 00 00 00 02 06 BF + 39 00 00 00 00 00 02 07 C0 + 39 00 00 00 00 00 02 08 C1 + 39 00 00 00 00 00 02 09 C1 + 39 00 00 00 00 00 02 0A C2 + 39 00 00 00 00 00 02 0B C3 + 39 00 00 00 00 00 02 0C C3 + 39 00 00 00 00 00 02 0D C4 + 39 00 00 00 00 00 02 0E C4 + 39 00 00 00 00 00 02 0F C5 + 39 00 00 00 00 00 02 10 C6 + 39 00 00 00 00 00 02 11 C6 + 39 00 00 00 00 00 02 12 C7 + 39 00 00 00 00 00 02 13 C8 + 39 00 00 00 00 00 02 14 C8 + 39 00 00 00 00 00 02 15 C8 + 39 00 00 00 00 00 02 16 C9 + 39 00 00 00 00 00 02 17 C9 + 39 00 00 00 00 00 02 18 CA + 39 00 00 00 00 00 02 19 CA + 39 00 00 00 00 00 02 1A CB + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1C CC + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1E CD + 39 00 00 00 00 00 02 1F CD + 39 00 00 00 00 00 02 20 CD + 39 00 00 00 00 00 02 21 CD + 39 00 00 00 00 00 02 22 CE + 39 00 00 00 00 00 02 23 CE + 39 00 00 00 00 00 02 24 CE + 39 00 00 00 00 00 02 25 CF + 39 00 00 00 00 00 02 26 D0 + 39 00 00 00 00 00 02 27 D1 + 39 00 00 00 00 00 02 28 D1 + 39 00 00 00 00 00 02 29 D2 + 39 00 00 00 00 00 02 2A D3 + 39 00 00 00 00 00 02 2B D4 + 39 00 00 00 00 00 02 2C D4 + 39 00 00 00 00 00 02 2D D5 + 39 00 00 00 00 00 02 2E D5 + 39 00 00 00 00 00 02 2F D6 + 39 00 00 00 00 00 02 30 D6 + 39 00 00 00 00 00 02 31 D7 + 39 00 00 00 00 00 02 32 D8 + 39 00 00 00 00 00 02 33 D8 + 39 00 00 00 00 00 02 34 D8 + 39 00 00 00 00 00 02 35 D9 + 39 00 00 00 00 00 02 36 D9 + 39 00 00 00 00 00 02 37 DA + 39 00 00 00 00 00 02 38 DA + 39 00 00 00 00 00 02 39 DA + 39 00 00 00 00 00 02 3A DB + 39 00 00 00 00 00 02 3B DC + 39 00 00 00 00 00 02 3C DC + 39 00 00 00 00 00 02 3D DC + 39 00 00 00 00 00 02 3E DC + 39 00 00 00 00 00 02 3F DC + 39 00 00 00 00 00 02 40 DC + 39 00 00 00 00 00 02 41 DD + 39 00 00 00 00 00 02 42 DD + 39 00 00 00 00 00 02 43 DD + 39 00 00 00 00 00 02 44 DD + 39 00 00 00 00 00 02 45 DD + 39 00 00 00 00 00 02 46 DD + 39 00 00 00 00 00 02 47 DE + 39 00 00 00 00 00 02 48 DF + 39 00 00 00 00 00 02 49 E0 + 39 00 00 00 00 00 02 4A E1 + 39 00 00 00 00 00 02 4B E2 + 39 00 00 00 00 00 02 4C E2 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4E E4 + 39 00 00 00 00 00 02 4F E5 + 39 00 00 00 00 00 02 50 E6 + 39 00 00 00 00 00 02 51 E7 + 39 00 00 00 00 00 02 52 E7 + 39 00 00 00 00 00 02 53 E8 + 39 00 00 00 00 00 02 54 E9 + 39 00 00 00 00 00 02 55 E9 + 39 00 00 00 00 00 02 56 EA + 39 00 00 00 00 00 02 57 EA + 39 00 00 00 00 00 02 58 EB + 39 00 00 00 00 00 02 59 EB + 39 00 00 00 00 00 02 5A EC + 39 00 00 00 00 00 02 5B EC + 39 00 00 00 00 00 02 5C ED + 39 00 00 00 00 00 02 5D ED + 39 00 00 00 00 00 02 5E ED + 39 00 00 00 00 00 02 5F EE + 39 00 00 00 00 00 02 60 EE + 39 00 00 00 00 00 02 61 EE + 39 00 00 00 00 00 02 62 EE + 39 00 00 00 00 00 02 63 EE + 39 00 00 00 00 00 02 64 EE + 39 00 00 00 00 00 02 65 EE + 39 00 00 00 00 00 02 66 EE + 39 00 00 00 00 00 02 67 EE + 39 00 00 00 00 00 02 68 EF + 39 00 00 00 00 00 02 69 F0 + 39 00 00 00 00 00 02 6A F0 + 39 00 00 00 00 00 02 6B F1 + 39 00 00 00 00 00 02 6C F2 + 39 00 00 00 00 00 02 6D F2 + 39 00 00 00 00 00 02 6E F3 + 39 00 00 00 00 00 02 6F F3 + 39 00 00 00 00 00 02 70 F4 + 39 00 00 00 00 00 02 71 F4 + 39 00 00 00 00 00 02 72 F5 + 39 00 00 00 00 00 02 73 F5 + 39 00 00 00 00 00 02 74 F5 + 39 00 00 00 00 00 02 75 F5 + 39 00 00 00 00 00 02 76 F5 + 39 00 00 00 00 00 02 77 F5 + 39 00 00 00 00 00 02 78 F5 + 39 00 00 00 00 00 02 79 F6 + 39 00 00 00 00 00 02 7A F7 + 39 00 00 00 00 00 02 7B F7 + 39 00 00 00 00 00 02 7C F8 + 39 00 00 00 00 00 02 7D F9 + 39 00 00 00 00 00 02 7E F9 + 39 00 00 00 00 00 02 7F FA + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 10 + 39 00 00 00 00 00 02 02 0F + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 04 0D + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 06 0C + 39 00 00 00 00 00 02 07 0B + 39 00 00 00 00 00 02 08 0A + 39 00 00 00 00 00 02 09 09 + 39 00 00 00 00 00 02 0A 08 + 39 00 00 00 00 00 02 0B 07 + 39 00 00 00 00 00 02 0C 06 + 39 00 00 00 00 00 02 0D 06 + 39 00 00 00 00 00 02 0E 05 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 12 01 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 86 + 39 00 00 00 00 00 02 19 87 + 39 00 00 00 00 00 02 1A 88 + 39 00 00 00 00 00 02 1B 89 + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1D 8B + 39 00 00 00 00 00 02 1E 8D + 39 00 00 00 00 00 02 1F 8E + 39 00 00 00 00 00 02 20 8F + 39 00 00 00 00 00 02 21 90 + 39 00 00 00 00 00 02 22 91 + 39 00 00 00 00 00 02 23 92 + 39 00 00 00 00 00 02 24 93 + 39 00 00 00 00 00 02 25 94 + 39 00 00 00 00 00 02 26 95 + 39 00 00 00 00 00 02 27 96 + 39 00 00 00 00 00 02 28 97 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 2A 99 + 39 00 00 00 00 00 02 2B 99 + 39 00 00 00 00 00 02 2C 9A + 39 00 00 00 00 00 02 2D 9B + 39 00 00 00 00 00 02 2E 9C + 39 00 00 00 00 00 02 2F 9D + 39 00 00 00 00 00 02 30 9E + 39 00 00 00 00 00 02 31 9F + 39 00 00 00 00 00 02 32 A0 + 39 00 00 00 00 00 02 33 A1 + 39 00 00 00 00 00 02 34 A2 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 36 A3 + 39 00 00 00 00 00 02 37 A4 + 39 00 00 00 00 00 02 38 A5 + 39 00 00 00 00 00 02 39 A6 + 39 00 00 00 00 00 02 3A A7 + 39 00 00 00 00 00 02 3B A8 + 39 00 00 00 00 00 02 3C A9 + 39 00 00 00 00 00 02 3D AA + 39 00 00 00 00 00 02 3E AB + 39 00 00 00 00 00 02 3F AD + 39 00 00 00 00 00 02 40 AE + 39 00 00 00 00 00 02 41 AF + 39 00 00 00 00 00 02 42 B0 + 39 00 00 00 00 00 02 43 B1 + 39 00 00 00 00 00 02 44 B2 + 39 00 00 00 00 00 02 45 B3 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 47 B5 + 39 00 00 00 00 00 02 48 B6 + 39 00 00 00 00 00 02 49 B7 + 39 00 00 00 00 00 02 4A B8 + 39 00 00 00 00 00 02 4B B9 + 39 00 00 00 00 00 02 4C BA + 39 00 00 00 00 00 02 4D BB + 39 00 00 00 00 00 02 4E BC + 39 00 00 00 00 00 02 4F BD + 39 00 00 00 00 00 02 50 BE + 39 00 00 00 00 00 02 51 BF + 39 00 00 00 00 00 02 52 C0 + 39 00 00 00 00 00 02 53 C1 + 39 00 00 00 00 00 02 54 C2 + 39 00 00 00 00 00 02 55 C3 + 39 00 00 00 00 00 02 56 C4 + 39 00 00 00 00 00 02 57 C4 + 39 00 00 00 00 00 02 58 C5 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 5A C6 + 39 00 00 00 00 00 02 5B C7 + 39 00 00 00 00 00 02 5C C8 + 39 00 00 00 00 00 02 5D C9 + 39 00 00 00 00 00 02 5E C9 + 39 00 00 00 00 00 02 5F CA + 39 00 00 00 00 00 02 60 CB + 39 00 00 00 00 00 02 61 CB + 39 00 00 00 00 00 02 62 CC + 39 00 00 00 00 00 02 63 CD + 39 00 00 00 00 00 02 64 CF + 39 00 00 00 00 00 02 65 D0 + 39 00 00 00 00 00 02 66 D2 + 39 00 00 00 00 00 02 67 D3 + 39 00 00 00 00 00 02 68 D4 + 39 00 00 00 00 00 02 69 D5 + 39 00 00 00 00 00 02 6A D7 + 39 00 00 00 00 00 02 6B D8 + 39 00 00 00 00 00 02 6C D9 + 39 00 00 00 00 00 02 6D DB + 39 00 00 00 00 00 02 6E DC + 39 00 00 00 00 00 02 6F DD + 39 00 00 00 00 00 02 70 DE + 39 00 00 00 00 00 02 71 E0 + 39 00 00 00 00 00 02 72 E1 + 39 00 00 00 00 00 02 73 E2 + 39 00 00 00 00 00 02 74 E3 + 39 00 00 00 00 00 02 75 E4 + 39 00 00 00 00 00 02 76 E5 + 39 00 00 00 00 00 02 77 E6 + 39 00 00 00 00 00 02 78 E7 + 39 00 00 00 00 00 02 79 E8 + 39 00 00 00 00 00 02 7A E9 + 39 00 00 00 00 00 02 7B EA + 39 00 00 00 00 00 02 7C EB + 39 00 00 00 00 00 02 7D EC + 39 00 00 00 00 00 02 7E ED + 39 00 00 00 00 00 02 7F EE + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 84 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F bb + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 bb + 39 00 00 00 00 00 02 7F fa + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 12 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 11 + 39 00 00 00 00 00 02 7F ee + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F EE + 39 00 00 00 00 00 02 7E ED + 39 00 00 00 00 00 02 7D EC + 39 00 00 00 00 00 02 7C EB + 39 00 00 00 00 00 02 7B EA + 39 00 00 00 00 00 02 7A E9 + 39 00 00 00 00 00 02 79 E8 + 39 00 00 00 00 00 02 78 E7 + 39 00 00 00 00 00 02 77 E6 + 39 00 00 00 00 00 02 76 E5 + 39 00 00 00 00 00 02 75 E4 + 39 00 00 00 00 00 02 74 E3 + 39 00 00 00 00 00 02 73 E2 + 39 00 00 00 00 00 02 72 E1 + 39 00 00 00 00 00 02 71 E0 + 39 00 00 00 00 00 02 70 DE + 39 00 00 00 00 00 02 6F DD + 39 00 00 00 00 00 02 6E DC + 39 00 00 00 00 00 02 6D DB + 39 00 00 00 00 00 02 6C D9 + 39 00 00 00 00 00 02 6B D8 + 39 00 00 00 00 00 02 6A D7 + 39 00 00 00 00 00 02 69 D5 + 39 00 00 00 00 00 02 68 D4 + 39 00 00 00 00 00 02 67 D3 + 39 00 00 00 00 00 02 66 D2 + 39 00 00 00 00 00 02 65 D0 + 39 00 00 00 00 00 02 64 CF + 39 00 00 00 00 00 02 63 CD + 39 00 00 00 00 00 02 62 CC + 39 00 00 00 00 00 02 61 CB + 39 00 00 00 00 00 02 60 CB + 39 00 00 00 00 00 02 5F CA + 39 00 00 00 00 00 02 5E C9 + 39 00 00 00 00 00 02 5D C9 + 39 00 00 00 00 00 02 5C C8 + 39 00 00 00 00 00 02 5B C7 + 39 00 00 00 00 00 02 5A C6 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 58 C5 + 39 00 00 00 00 00 02 57 C4 + 39 00 00 00 00 00 02 56 C4 + 39 00 00 00 00 00 02 55 C3 + 39 00 00 00 00 00 02 54 C2 + 39 00 00 00 00 00 02 53 C1 + 39 00 00 00 00 00 02 52 C0 + 39 00 00 00 00 00 02 51 BF + 39 00 00 00 00 00 02 50 BE + 39 00 00 00 00 00 02 4F BD + 39 00 00 00 00 00 02 4E BC + 39 00 00 00 00 00 02 4D BB + 39 00 00 00 00 00 02 4C BA + 39 00 00 00 00 00 02 4B B9 + 39 00 00 00 00 00 02 4A B8 + 39 00 00 00 00 00 02 49 B7 + 39 00 00 00 00 00 02 48 B6 + 39 00 00 00 00 00 02 47 B5 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 45 B3 + 39 00 00 00 00 00 02 44 B2 + 39 00 00 00 00 00 02 43 B1 + 39 00 00 00 00 00 02 42 B0 + 39 00 00 00 00 00 02 41 AF + 39 00 00 00 00 00 02 40 AE + 39 00 00 00 00 00 02 3F AD + 39 00 00 00 00 00 02 3E AB + 39 00 00 00 00 00 02 3D AA + 39 00 00 00 00 00 02 3C A9 + 39 00 00 00 00 00 02 3B A8 + 39 00 00 00 00 00 02 3A A7 + 39 00 00 00 00 00 02 39 A6 + 39 00 00 00 00 00 02 38 A5 + 39 00 00 00 00 00 02 37 A4 + 39 00 00 00 00 00 02 36 A3 + 39 00 00 00 00 00 02 35 A3 + 39 00 00 00 00 00 02 34 A2 + 39 00 00 00 00 00 02 33 A1 + 39 00 00 00 00 00 02 32 A0 + 39 00 00 00 00 00 02 31 9F + 39 00 00 00 00 00 02 30 9E + 39 00 00 00 00 00 02 2F 9D + 39 00 00 00 00 00 02 2E 9C + 39 00 00 00 00 00 02 2D 9B + 39 00 00 00 00 00 02 2C 9A + 39 00 00 00 00 00 02 2B 99 + 39 00 00 00 00 00 02 2A 99 + 39 00 00 00 00 00 02 29 98 + 39 00 00 00 00 00 02 28 97 + 39 00 00 00 00 00 02 27 96 + 39 00 00 00 00 00 02 26 95 + 39 00 00 00 00 00 02 25 94 + 39 00 00 00 00 00 02 24 93 + 39 00 00 00 00 00 02 23 92 + 39 00 00 00 00 00 02 22 91 + 39 00 00 00 00 00 02 21 90 + 39 00 00 00 00 00 02 20 8F + 39 00 00 00 00 00 02 1F 8E + 39 00 00 00 00 00 02 1E 8D + 39 00 00 00 00 00 02 1D 8B + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1B 89 + 39 00 00 00 00 00 02 1A 88 + 39 00 00 00 00 00 02 19 87 + 39 00 00 00 00 00 02 18 86 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 15 83 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 00 + 39 00 00 00 00 00 02 12 01 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 05 + 39 00 00 00 00 00 02 0D 06 + 39 00 00 00 00 00 02 0C 06 + 39 00 00 00 00 00 02 0B 07 + 39 00 00 00 00 00 02 0A 08 + 39 00 00 00 00 00 02 09 09 + 39 00 00 00 00 00 02 08 0A + 39 00 00 00 00 00 02 07 0B + 39 00 00 00 00 00 02 06 0C + 39 00 00 00 00 00 02 05 0D + 39 00 00 00 00 00 02 04 0D + 39 00 00 00 00 00 02 03 0E + 39 00 00 00 00 00 02 02 0F + 39 00 00 00 00 00 02 01 10 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 84 + 39 00 00 00 00 00 02 7E 85 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7B 84 + 39 00 00 00 00 00 02 7A 84 + 39 00 00 00 00 00 02 79 84 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 75 85 + 39 00 00 00 00 00 02 74 85 + 39 00 00 00 00 00 02 73 85 + 39 00 00 00 00 00 02 72 85 + 39 00 00 00 00 00 02 71 85 + 39 00 00 00 00 00 02 70 85 + 39 00 00 00 00 00 02 6F 85 + 39 00 00 00 00 00 02 6E 86 + 39 00 00 00 00 00 02 6D 86 + 39 00 00 00 00 00 02 6C 86 + 39 00 00 00 00 00 02 6B 85 + 39 00 00 00 00 00 02 6A 85 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 68 84 + 39 00 00 00 00 00 02 67 84 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 64 85 + 39 00 00 00 00 00 02 63 86 + 39 00 00 00 00 00 02 62 86 + 39 00 00 00 00 00 02 61 86 + 39 00 00 00 00 00 02 60 85 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 5E 85 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5B 85 + 39 00 00 00 00 00 02 5A 85 + 39 00 00 00 00 00 02 59 86 + 39 00 00 00 00 00 02 58 86 + 39 00 00 00 00 00 02 57 86 + 39 00 00 00 00 00 02 56 86 + 39 00 00 00 00 00 02 55 86 + 39 00 00 00 00 00 02 54 86 + 39 00 00 00 00 00 02 53 86 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 51 86 + 39 00 00 00 00 00 02 50 86 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4D 85 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4B 85 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 49 86 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 46 87 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 42 87 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 3E 87 + 39 00 00 00 00 00 02 3D 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 26 84 + 39 00 00 00 00 00 02 25 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 20 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1B 83 + 39 00 00 00 00 00 02 1A 83 + 39 00 00 00 00 00 02 19 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 16 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 81 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 11 00 + 39 00 00 00 00 00 02 10 00 + 39 00 00 00 00 00 02 0F 00 + 39 00 00 00 00 00 02 0E 00 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 00 + 39 00 00 00 00 00 02 05 00 + 39 00 00 00 00 00 02 04 00 + 39 00 00 00 00 00 02 03 00 + 39 00 00 00 00 00 02 02 00 + 39 00 00 00 00 00 02 01 00 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F FA + 39 00 00 00 00 00 02 7E F9 + 39 00 00 00 00 00 02 7D F9 + 39 00 00 00 00 00 02 7C F8 + 39 00 00 00 00 00 02 7B F7 + 39 00 00 00 00 00 02 7A F7 + 39 00 00 00 00 00 02 79 F6 + 39 00 00 00 00 00 02 78 F5 + 39 00 00 00 00 00 02 77 F5 + 39 00 00 00 00 00 02 76 F5 + 39 00 00 00 00 00 02 75 F5 + 39 00 00 00 00 00 02 74 F5 + 39 00 00 00 00 00 02 73 F5 + 39 00 00 00 00 00 02 72 F5 + 39 00 00 00 00 00 02 71 F4 + 39 00 00 00 00 00 02 70 F4 + 39 00 00 00 00 00 02 6F F3 + 39 00 00 00 00 00 02 6E F3 + 39 00 00 00 00 00 02 6D F2 + 39 00 00 00 00 00 02 6C F2 + 39 00 00 00 00 00 02 6B F1 + 39 00 00 00 00 00 02 6A F0 + 39 00 00 00 00 00 02 69 F0 + 39 00 00 00 00 00 02 68 EF + 39 00 00 00 00 00 02 67 EE + 39 00 00 00 00 00 02 66 EE + 39 00 00 00 00 00 02 65 EE + 39 00 00 00 00 00 02 64 EE + 39 00 00 00 00 00 02 63 EE + 39 00 00 00 00 00 02 62 EE + 39 00 00 00 00 00 02 61 EE + 39 00 00 00 00 00 02 60 EE + 39 00 00 00 00 00 02 5F EE + 39 00 00 00 00 00 02 5E ED + 39 00 00 00 00 00 02 5D ED + 39 00 00 00 00 00 02 5C ED + 39 00 00 00 00 00 02 5B EC + 39 00 00 00 00 00 02 5A EC + 39 00 00 00 00 00 02 59 EB + 39 00 00 00 00 00 02 58 EB + 39 00 00 00 00 00 02 57 EA + 39 00 00 00 00 00 02 56 EA + 39 00 00 00 00 00 02 55 E9 + 39 00 00 00 00 00 02 54 E9 + 39 00 00 00 00 00 02 53 E8 + 39 00 00 00 00 00 02 52 E7 + 39 00 00 00 00 00 02 51 E7 + 39 00 00 00 00 00 02 50 E6 + 39 00 00 00 00 00 02 4F E5 + 39 00 00 00 00 00 02 4E E4 + 39 00 00 00 00 00 02 4D E3 + 39 00 00 00 00 00 02 4C E2 + 39 00 00 00 00 00 02 4B E2 + 39 00 00 00 00 00 02 4A E1 + 39 00 00 00 00 00 02 49 E0 + 39 00 00 00 00 00 02 48 DF + 39 00 00 00 00 00 02 47 DE + 39 00 00 00 00 00 02 46 DD + 39 00 00 00 00 00 02 45 DD + 39 00 00 00 00 00 02 44 DD + 39 00 00 00 00 00 02 43 DD + 39 00 00 00 00 00 02 42 DD + 39 00 00 00 00 00 02 41 DD + 39 00 00 00 00 00 02 40 DC + 39 00 00 00 00 00 02 3F DC + 39 00 00 00 00 00 02 3E DC + 39 00 00 00 00 00 02 3D DC + 39 00 00 00 00 00 02 3C DC + 39 00 00 00 00 00 02 3B DC + 39 00 00 00 00 00 02 3A DB + 39 00 00 00 00 00 02 39 DA + 39 00 00 00 00 00 02 38 DA + 39 00 00 00 00 00 02 37 DA + 39 00 00 00 00 00 02 36 D9 + 39 00 00 00 00 00 02 35 D9 + 39 00 00 00 00 00 02 34 D8 + 39 00 00 00 00 00 02 33 D8 + 39 00 00 00 00 00 02 32 D8 + 39 00 00 00 00 00 02 31 D7 + 39 00 00 00 00 00 02 30 D6 + 39 00 00 00 00 00 02 2F D6 + 39 00 00 00 00 00 02 2E D5 + 39 00 00 00 00 00 02 2D D5 + 39 00 00 00 00 00 02 2C D4 + 39 00 00 00 00 00 02 2B D4 + 39 00 00 00 00 00 02 2A D3 + 39 00 00 00 00 00 02 29 D2 + 39 00 00 00 00 00 02 28 D1 + 39 00 00 00 00 00 02 27 D1 + 39 00 00 00 00 00 02 26 D0 + 39 00 00 00 00 00 02 25 CF + 39 00 00 00 00 00 02 24 CE + 39 00 00 00 00 00 02 23 CE + 39 00 00 00 00 00 02 22 CE + 39 00 00 00 00 00 02 21 CD + 39 00 00 00 00 00 02 20 CD + 39 00 00 00 00 00 02 1F CD + 39 00 00 00 00 00 02 1E CD + 39 00 00 00 00 00 02 1D CC + 39 00 00 00 00 00 02 1C CC + 39 00 00 00 00 00 02 1B CB + 39 00 00 00 00 00 02 1A CB + 39 00 00 00 00 00 02 19 CA + 39 00 00 00 00 00 02 18 CA + 39 00 00 00 00 00 02 17 C9 + 39 00 00 00 00 00 02 16 C9 + 39 00 00 00 00 00 02 15 C8 + 39 00 00 00 00 00 02 14 C8 + 39 00 00 00 00 00 02 13 C8 + 39 00 00 00 00 00 02 12 C7 + 39 00 00 00 00 00 02 11 C6 + 39 00 00 00 00 00 02 10 C6 + 39 00 00 00 00 00 02 0F C5 + 39 00 00 00 00 00 02 0E C4 + 39 00 00 00 00 00 02 0D C4 + 39 00 00 00 00 00 02 0C C3 + 39 00 00 00 00 00 02 0B C3 + 39 00 00 00 00 00 02 0A C2 + 39 00 00 00 00 00 02 09 C1 + 39 00 00 00 00 00 02 08 C1 + 39 00 00 00 00 00 02 07 C0 + 39 00 00 00 00 00 02 06 BF + 39 00 00 00 00 00 02 05 BF + 39 00 00 00 00 00 02 04 BE + 39 00 00 00 00 00 02 03 BD + 39 00 00 00 00 00 02 02 BD + 39 00 00 00 00 00 02 01 BB + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 84 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F bb + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 bb + 39 00 00 00 00 00 02 7F fa + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 12 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 11 + 39 00 00 00 00 00 02 7F ee + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 12 + 39 00 00 00 00 00 02 7E 12 + 39 00 00 00 00 00 02 7D 13 + 39 00 00 00 00 00 02 7C 14 + 39 00 00 00 00 00 02 7B 15 + 39 00 00 00 00 00 02 7A 16 + 39 00 00 00 00 00 02 79 17 + 39 00 00 00 00 00 02 78 18 + 39 00 00 00 00 00 02 77 18 + 39 00 00 00 00 00 02 76 19 + 39 00 00 00 00 00 02 75 1A + 39 00 00 00 00 00 02 74 1B + 39 00 00 00 00 00 02 73 1C + 39 00 00 00 00 00 02 72 1C + 39 00 00 00 00 00 02 71 1D + 39 00 00 00 00 00 02 70 1E + 39 00 00 00 00 00 02 6F 1F + 39 00 00 00 00 00 02 6E 1F + 39 00 00 00 00 00 02 6D 20 + 39 00 00 00 00 00 02 6C 21 + 39 00 00 00 00 00 02 6B 21 + 39 00 00 00 00 00 02 6A 22 + 39 00 00 00 00 00 02 69 23 + 39 00 00 00 00 00 02 68 24 + 39 00 00 00 00 00 02 67 25 + 39 00 00 00 00 00 02 66 26 + 39 00 00 00 00 00 02 65 28 + 39 00 00 00 00 00 02 64 29 + 39 00 00 00 00 00 02 63 2A + 39 00 00 00 00 00 02 62 2A + 39 00 00 00 00 00 02 61 2C + 39 00 00 00 00 00 02 60 2D + 39 00 00 00 00 00 02 5F 2E + 39 00 00 00 00 00 02 5E 2F + 39 00 00 00 00 00 02 5D 30 + 39 00 00 00 00 00 02 5C 32 + 39 00 00 00 00 00 02 5B 33 + 39 00 00 00 00 00 02 5A 34 + 39 00 00 00 00 00 02 59 35 + 39 00 00 00 00 00 02 58 36 + 39 00 00 00 00 00 02 57 37 + 39 00 00 00 00 00 02 56 38 + 39 00 00 00 00 00 02 55 39 + 39 00 00 00 00 00 02 54 3A + 39 00 00 00 00 00 02 53 3B + 39 00 00 00 00 00 02 52 3B + 39 00 00 00 00 00 02 51 3C + 39 00 00 00 00 00 02 50 3D + 39 00 00 00 00 00 02 4F 3E + 39 00 00 00 00 00 02 4E 3F + 39 00 00 00 00 00 02 4D 40 + 39 00 00 00 00 00 02 4C 41 + 39 00 00 00 00 00 02 4B 42 + 39 00 00 00 00 00 02 4A 43 + 39 00 00 00 00 00 02 49 44 + 39 00 00 00 00 00 02 48 44 + 39 00 00 00 00 00 02 47 44 + 39 00 00 00 00 00 02 46 44 + 39 00 00 00 00 00 02 45 44 + 39 00 00 00 00 00 02 44 45 + 39 00 00 00 00 00 02 43 46 + 39 00 00 00 00 00 02 42 47 + 39 00 00 00 00 00 02 41 48 + 39 00 00 00 00 00 02 40 49 + 39 00 00 00 00 00 02 3F 4A + 39 00 00 00 00 00 02 3E 4C + 39 00 00 00 00 00 02 3D 4D + 39 00 00 00 00 00 02 3C 4E + 39 00 00 00 00 00 02 3B 4F + 39 00 00 00 00 00 02 3A 50 + 39 00 00 00 00 00 02 39 51 + 39 00 00 00 00 00 02 38 52 + 39 00 00 00 00 00 02 37 53 + 39 00 00 00 00 00 02 36 54 + 39 00 00 00 00 00 02 35 55 + 39 00 00 00 00 00 02 34 56 + 39 00 00 00 00 00 02 33 57 + 39 00 00 00 00 00 02 32 59 + 39 00 00 00 00 00 02 31 5A + 39 00 00 00 00 00 02 30 5A + 39 00 00 00 00 00 02 2F 59 + 39 00 00 00 00 00 02 2E 58 + 39 00 00 00 00 00 02 2D 59 + 39 00 00 00 00 00 02 2C 5A + 39 00 00 00 00 00 02 2B 5B + 39 00 00 00 00 00 02 2A 5D + 39 00 00 00 00 00 02 29 5E + 39 00 00 00 00 00 02 28 5F + 39 00 00 00 00 00 02 27 60 + 39 00 00 00 00 00 02 26 60 + 39 00 00 00 00 00 02 25 61 + 39 00 00 00 00 00 02 24 61 + 39 00 00 00 00 00 02 23 62 + 39 00 00 00 00 00 02 22 63 + 39 00 00 00 00 00 02 21 63 + 39 00 00 00 00 00 02 20 64 + 39 00 00 00 00 00 02 1F 9B + 39 00 00 00 00 00 02 1E 9B + 39 00 00 00 00 00 02 1D 9A + 39 00 00 00 00 00 02 1C 99 + 39 00 00 00 00 00 02 1B 98 + 39 00 00 00 00 00 02 1A 97 + 39 00 00 00 00 00 02 19 96 + 39 00 00 00 00 00 02 18 95 + 39 00 00 00 00 00 02 17 94 + 39 00 00 00 00 00 02 16 93 + 39 00 00 00 00 00 02 15 93 + 39 00 00 00 00 00 02 14 92 + 39 00 00 00 00 00 02 13 91 + 39 00 00 00 00 00 02 12 90 + 39 00 00 00 00 00 02 11 8F + 39 00 00 00 00 00 02 10 8E + 39 00 00 00 00 00 02 0F 8D + 39 00 00 00 00 00 02 0E 8C + 39 00 00 00 00 00 02 0D 8B + 39 00 00 00 00 00 02 0C 8A + 39 00 00 00 00 00 02 0B 89 + 39 00 00 00 00 00 02 0A 89 + 39 00 00 00 00 00 02 09 88 + 39 00 00 00 00 00 02 08 87 + 39 00 00 00 00 00 02 07 86 + 39 00 00 00 00 00 02 06 85 + 39 00 00 00 00 00 02 05 85 + 39 00 00 00 00 00 02 04 85 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 75 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 72 04 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 6E 05 + 39 00 00 00 00 00 02 6D 05 + 39 00 00 00 00 00 02 6C 05 + 39 00 00 00 00 00 02 6B 05 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 66 05 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 61 05 + 39 00 00 00 00 00 02 60 05 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 44 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 38 08 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 36 06 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 05 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2D 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 06 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 05 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F BB + 39 00 00 00 00 00 02 7E BA + 39 00 00 00 00 00 02 7D BA + 39 00 00 00 00 00 02 7C B9 + 39 00 00 00 00 00 02 7B B9 + 39 00 00 00 00 00 02 7A B8 + 39 00 00 00 00 00 02 79 B8 + 39 00 00 00 00 00 02 78 B8 + 39 00 00 00 00 00 02 77 B7 + 39 00 00 00 00 00 02 76 B7 + 39 00 00 00 00 00 02 75 B6 + 39 00 00 00 00 00 02 74 B6 + 39 00 00 00 00 00 02 73 B6 + 39 00 00 00 00 00 02 72 B5 + 39 00 00 00 00 00 02 71 B5 + 39 00 00 00 00 00 02 70 B4 + 39 00 00 00 00 00 02 6F B4 + 39 00 00 00 00 00 02 6E B3 + 39 00 00 00 00 00 02 6D B3 + 39 00 00 00 00 00 02 6C B2 + 39 00 00 00 00 00 02 6B B2 + 39 00 00 00 00 00 02 6A B2 + 39 00 00 00 00 00 02 69 B1 + 39 00 00 00 00 00 02 68 B1 + 39 00 00 00 00 00 02 67 B1 + 39 00 00 00 00 00 02 66 B0 + 39 00 00 00 00 00 02 65 B0 + 39 00 00 00 00 00 02 64 B0 + 39 00 00 00 00 00 02 63 AF + 39 00 00 00 00 00 02 62 AF + 39 00 00 00 00 00 02 61 AF + 39 00 00 00 00 00 02 60 AF + 39 00 00 00 00 00 02 5F AE + 39 00 00 00 00 00 02 5E AE + 39 00 00 00 00 00 02 5D AE + 39 00 00 00 00 00 02 5C AD + 39 00 00 00 00 00 02 5B AD + 39 00 00 00 00 00 02 5A AC + 39 00 00 00 00 00 02 59 AB + 39 00 00 00 00 00 02 58 AA + 39 00 00 00 00 00 02 57 AA + 39 00 00 00 00 00 02 56 A9 + 39 00 00 00 00 00 02 55 A8 + 39 00 00 00 00 00 02 54 A7 + 39 00 00 00 00 00 02 53 A6 + 39 00 00 00 00 00 02 52 A5 + 39 00 00 00 00 00 02 51 A5 + 39 00 00 00 00 00 02 50 A4 + 39 00 00 00 00 00 02 4F A3 + 39 00 00 00 00 00 02 4E A3 + 39 00 00 00 00 00 02 4D A2 + 39 00 00 00 00 00 02 4C A2 + 39 00 00 00 00 00 02 4B A1 + 39 00 00 00 00 00 02 4A A0 + 39 00 00 00 00 00 02 49 A0 + 39 00 00 00 00 00 02 48 9F + 39 00 00 00 00 00 02 47 9F + 39 00 00 00 00 00 02 46 9F + 39 00 00 00 00 00 02 45 9E + 39 00 00 00 00 00 02 44 9E + 39 00 00 00 00 00 02 43 9D + 39 00 00 00 00 00 02 42 9D + 39 00 00 00 00 00 02 41 9C + 39 00 00 00 00 00 02 40 9C + 39 00 00 00 00 00 02 3F 9D + 39 00 00 00 00 00 02 3E 9D + 39 00 00 00 00 00 02 3D 9D + 39 00 00 00 00 00 02 3C 9D + 39 00 00 00 00 00 02 3B 9C + 39 00 00 00 00 00 02 3A 9B + 39 00 00 00 00 00 02 39 9A + 39 00 00 00 00 00 02 38 9A + 39 00 00 00 00 00 02 37 99 + 39 00 00 00 00 00 02 36 98 + 39 00 00 00 00 00 02 35 97 + 39 00 00 00 00 00 02 34 97 + 39 00 00 00 00 00 02 33 96 + 39 00 00 00 00 00 02 32 95 + 39 00 00 00 00 00 02 31 95 + 39 00 00 00 00 00 02 30 94 + 39 00 00 00 00 00 02 2F 93 + 39 00 00 00 00 00 02 2E 93 + 39 00 00 00 00 00 02 2D 92 + 39 00 00 00 00 00 02 2C 91 + 39 00 00 00 00 00 02 2B 90 + 39 00 00 00 00 00 02 2A 92 + 39 00 00 00 00 00 02 29 93 + 39 00 00 00 00 00 02 28 93 + 39 00 00 00 00 00 02 27 92 + 39 00 00 00 00 00 02 26 91 + 39 00 00 00 00 00 02 25 91 + 39 00 00 00 00 00 02 24 90 + 39 00 00 00 00 00 02 23 8F + 39 00 00 00 00 00 02 22 8F + 39 00 00 00 00 00 02 21 8F + 39 00 00 00 00 00 02 20 8F + 39 00 00 00 00 00 02 1F 8E + 39 00 00 00 00 00 02 1E 8E + 39 00 00 00 00 00 02 1D 8E + 39 00 00 00 00 00 02 1C 8E + 39 00 00 00 00 00 02 1B 8D + 39 00 00 00 00 00 02 1A 8D + 39 00 00 00 00 00 02 19 8C + 39 00 00 00 00 00 02 18 8C + 39 00 00 00 00 00 02 17 8B + 39 00 00 00 00 00 02 16 8A + 39 00 00 00 00 00 02 15 8A + 39 00 00 00 00 00 02 14 8A + 39 00 00 00 00 00 02 13 89 + 39 00 00 00 00 00 02 12 89 + 39 00 00 00 00 00 02 11 88 + 39 00 00 00 00 00 02 10 88 + 39 00 00 00 00 00 02 0F 87 + 39 00 00 00 00 00 02 0E 87 + 39 00 00 00 00 00 02 0D 86 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0B 85 + 39 00 00 00 00 00 02 0A 84 + 39 00 00 00 00 00 02 09 84 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + + ]; + + + qcom,mdss-dsi-panel-eye-command06 = [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 03 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 04 + 39 00 00 00 00 00 02 1C 04 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 24 06 + 39 00 00 00 00 00 02 25 08 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 27 07 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 2B 06 + 39 00 00 00 00 00 02 2C 06 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2F 05 + 39 00 00 00 00 00 02 30 05 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 37 06 + 39 00 00 00 00 00 02 38 07 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3D 06 + 39 00 00 00 00 00 02 3E 06 + 39 00 00 00 00 00 02 3F 06 + 39 00 00 00 00 00 02 40 06 + 39 00 00 00 00 00 02 41 06 + 39 00 00 00 00 00 02 42 06 + 39 00 00 00 00 00 02 43 06 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 45 05 + 39 00 00 00 00 00 02 46 05 + 39 00 00 00 00 00 02 47 05 + 39 00 00 00 00 00 02 48 05 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 4A 04 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4D 03 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4F 02 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 51 02 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 02 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 55 02 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 57 03 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 59 03 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 5B 03 + 39 00 00 00 00 00 02 5C 03 + 39 00 00 00 00 00 02 5D 03 + 39 00 00 00 00 00 02 5E 03 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 60 03 + 39 00 00 00 00 00 02 61 03 + 39 00 00 00 00 00 02 62 03 + 39 00 00 00 00 00 02 63 03 + 39 00 00 00 00 00 02 64 03 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6C 03 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6E 03 + 39 00 00 00 00 00 02 6F 03 + 39 00 00 00 00 00 02 70 03 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 73 02 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 76 01 + 39 00 00 00 00 00 02 77 00 + 39 00 00 00 00 00 02 78 00 + 39 00 00 00 00 00 02 79 00 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7F 81 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 04 84 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 07 84 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 0A 86 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0D 88 + 39 00 00 00 00 00 02 0E 89 + 39 00 00 00 00 00 02 0F 8A + 39 00 00 00 00 00 02 10 8A + 39 00 00 00 00 00 02 11 8B + 39 00 00 00 00 00 02 12 8C + 39 00 00 00 00 00 02 13 8D + 39 00 00 00 00 00 02 14 8D + 39 00 00 00 00 00 02 15 8E + 39 00 00 00 00 00 02 16 8E + 39 00 00 00 00 00 02 17 8F + 39 00 00 00 00 00 02 18 90 + 39 00 00 00 00 00 02 19 90 + 39 00 00 00 00 00 02 1A 91 + 39 00 00 00 00 00 02 1B 92 + 39 00 00 00 00 00 02 1C 93 + 39 00 00 00 00 00 02 1D 93 + 39 00 00 00 00 00 02 1E 94 + 39 00 00 00 00 00 02 1F 94 + 39 00 00 00 00 00 02 20 95 + 39 00 00 00 00 00 02 21 95 + 39 00 00 00 00 00 02 22 95 + 39 00 00 00 00 00 02 23 96 + 39 00 00 00 00 00 02 24 96 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 26 97 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 28 99 + 39 00 00 00 00 00 02 29 9A + 39 00 00 00 00 00 02 2A 9B + 39 00 00 00 00 00 02 2B 9C + 39 00 00 00 00 00 02 2C 9B + 39 00 00 00 00 00 02 2D 99 + 39 00 00 00 00 00 02 2E 9A + 39 00 00 00 00 00 02 2F 9B + 39 00 00 00 00 00 02 30 9C + 39 00 00 00 00 00 02 31 9D + 39 00 00 00 00 00 02 32 9E + 39 00 00 00 00 00 02 33 9F + 39 00 00 00 00 00 02 34 9F + 39 00 00 00 00 00 02 35 A0 + 39 00 00 00 00 00 02 36 A1 + 39 00 00 00 00 00 02 37 A2 + 39 00 00 00 00 00 02 38 A3 + 39 00 00 00 00 00 02 39 A3 + 39 00 00 00 00 00 02 3A A4 + 39 00 00 00 00 00 02 3B A5 + 39 00 00 00 00 00 02 3C A6 + 39 00 00 00 00 00 02 3D A7 + 39 00 00 00 00 00 02 3E A9 + 39 00 00 00 00 00 02 3F A9 + 39 00 00 00 00 00 02 40 A9 + 39 00 00 00 00 00 02 41 AA + 39 00 00 00 00 00 02 42 AA + 39 00 00 00 00 00 02 43 A9 + 39 00 00 00 00 00 02 44 A9 + 39 00 00 00 00 00 02 45 AA + 39 00 00 00 00 00 02 46 AB + 39 00 00 00 00 00 02 47 AC + 39 00 00 00 00 00 02 48 AC + 39 00 00 00 00 00 02 49 AD + 39 00 00 00 00 00 02 4A AE + 39 00 00 00 00 00 02 4B AE + 39 00 00 00 00 00 02 4C AF + 39 00 00 00 00 00 02 4D AF + 39 00 00 00 00 00 02 4E B0 + 39 00 00 00 00 00 02 4F B1 + 39 00 00 00 00 00 02 50 B2 + 39 00 00 00 00 00 02 51 B2 + 39 00 00 00 00 00 02 52 B3 + 39 00 00 00 00 00 02 53 B4 + 39 00 00 00 00 00 02 54 B5 + 39 00 00 00 00 00 02 55 B5 + 39 00 00 00 00 00 02 56 B6 + 39 00 00 00 00 00 02 57 B7 + 39 00 00 00 00 00 02 58 B8 + 39 00 00 00 00 00 02 59 B9 + 39 00 00 00 00 00 02 5A BA + 39 00 00 00 00 00 02 5B BB + 39 00 00 00 00 00 02 5C BC + 39 00 00 00 00 00 02 5D BD + 39 00 00 00 00 00 02 5E BE + 39 00 00 00 00 00 02 5F BF + 39 00 00 00 00 00 02 60 C0 + 39 00 00 00 00 00 02 61 C1 + 39 00 00 00 00 00 02 62 C1 + 39 00 00 00 00 00 02 63 C2 + 39 00 00 00 00 00 02 64 C2 + 39 00 00 00 00 00 02 65 C3 + 39 00 00 00 00 00 02 66 C3 + 39 00 00 00 00 00 02 67 C3 + 39 00 00 00 00 00 02 68 C4 + 39 00 00 00 00 00 02 69 C4 + 39 00 00 00 00 00 02 6A C5 + 39 00 00 00 00 00 02 6B C5 + 39 00 00 00 00 00 02 6C C6 + 39 00 00 00 00 00 02 6D C7 + 39 00 00 00 00 00 02 6E C7 + 39 00 00 00 00 00 02 6F C8 + 39 00 00 00 00 00 02 70 C8 + 39 00 00 00 00 00 02 71 C9 + 39 00 00 00 00 00 02 72 C9 + 39 00 00 00 00 00 02 73 CA + 39 00 00 00 00 00 02 74 CA + 39 00 00 00 00 00 02 75 CB + 39 00 00 00 00 00 02 76 CC + 39 00 00 00 00 00 02 77 CC + 39 00 00 00 00 00 02 78 CD + 39 00 00 00 00 00 02 79 CD + 39 00 00 00 00 00 02 7A CE + 39 00 00 00 00 00 02 7B CE + 39 00 00 00 00 00 02 7C CF + 39 00 00 00 00 00 02 7D D0 + 39 00 00 00 00 00 02 7E D1 + 39 00 00 00 00 00 02 7F D1 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 03 86 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 06 87 + 39 00 00 00 00 00 02 07 87 + 39 00 00 00 00 00 02 08 88 + 39 00 00 00 00 00 02 09 89 + 39 00 00 00 00 00 02 0A 8B + 39 00 00 00 00 00 02 0B 8C + 39 00 00 00 00 00 02 0C 8D + 39 00 00 00 00 00 02 0D 8E + 39 00 00 00 00 00 02 0E 8F + 39 00 00 00 00 00 02 0F 90 + 39 00 00 00 00 00 02 10 92 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 12 94 + 39 00 00 00 00 00 02 13 95 + 39 00 00 00 00 00 02 14 96 + 39 00 00 00 00 00 02 15 97 + 39 00 00 00 00 00 02 16 99 + 39 00 00 00 00 00 02 17 99 + 39 00 00 00 00 00 02 18 9A + 39 00 00 00 00 00 02 19 9B + 39 00 00 00 00 00 02 1A 9C + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1C 9F + 39 00 00 00 00 00 02 1D A0 + 39 00 00 00 00 00 02 1E A1 + 39 00 00 00 00 00 02 1F A2 + 39 00 00 00 00 00 02 20 5D + 39 00 00 00 00 00 02 21 5B + 39 00 00 00 00 00 02 22 5B + 39 00 00 00 00 00 02 23 5A + 39 00 00 00 00 00 02 24 59 + 39 00 00 00 00 00 02 25 58 + 39 00 00 00 00 00 02 26 57 + 39 00 00 00 00 00 02 27 56 + 39 00 00 00 00 00 02 28 55 + 39 00 00 00 00 00 02 29 54 + 39 00 00 00 00 00 02 2A 54 + 39 00 00 00 00 00 02 2B 52 + 39 00 00 00 00 00 02 2C 51 + 39 00 00 00 00 00 02 2D 50 + 39 00 00 00 00 00 02 2E 4F + 39 00 00 00 00 00 02 2F 4D + 39 00 00 00 00 00 02 30 4C + 39 00 00 00 00 00 02 31 4B + 39 00 00 00 00 00 02 32 4A + 39 00 00 00 00 00 02 33 4B + 39 00 00 00 00 00 02 34 4C + 39 00 00 00 00 00 02 35 4B + 39 00 00 00 00 00 02 36 49 + 39 00 00 00 00 00 02 37 48 + 39 00 00 00 00 00 02 38 46 + 39 00 00 00 00 00 02 39 45 + 39 00 00 00 00 00 02 3A 43 + 39 00 00 00 00 00 02 3B 42 + 39 00 00 00 00 00 02 3C 41 + 39 00 00 00 00 00 02 3D 40 + 39 00 00 00 00 00 02 3E 3F + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 40 3C + 39 00 00 00 00 00 02 41 3B + 39 00 00 00 00 00 02 42 3A + 39 00 00 00 00 00 02 43 38 + 39 00 00 00 00 00 02 44 37 + 39 00 00 00 00 00 02 45 36 + 39 00 00 00 00 00 02 46 34 + 39 00 00 00 00 00 02 47 33 + 39 00 00 00 00 00 02 48 31 + 39 00 00 00 00 00 02 49 30 + 39 00 00 00 00 00 02 4A 30 + 39 00 00 00 00 00 02 4B 2F + 39 00 00 00 00 00 02 4C 2E + 39 00 00 00 00 00 02 4D 2E + 39 00 00 00 00 00 02 4E 2E + 39 00 00 00 00 00 02 4F 2D + 39 00 00 00 00 00 02 50 2C + 39 00 00 00 00 00 02 51 2A + 39 00 00 00 00 00 02 52 29 + 39 00 00 00 00 00 02 53 28 + 39 00 00 00 00 00 02 54 27 + 39 00 00 00 00 00 02 55 26 + 39 00 00 00 00 00 02 56 25 + 39 00 00 00 00 00 02 57 24 + 39 00 00 00 00 00 02 58 23 + 39 00 00 00 00 00 02 59 22 + 39 00 00 00 00 00 02 5A 20 + 39 00 00 00 00 00 02 5B 1F + 39 00 00 00 00 00 02 5C 1E + 39 00 00 00 00 00 02 5D 1D + 39 00 00 00 00 00 02 5E 1C + 39 00 00 00 00 00 02 5F 1A + 39 00 00 00 00 00 02 60 19 + 39 00 00 00 00 00 02 61 18 + 39 00 00 00 00 00 02 62 17 + 39 00 00 00 00 00 02 63 15 + 39 00 00 00 00 00 02 64 14 + 39 00 00 00 00 00 02 65 13 + 39 00 00 00 00 00 02 66 11 + 39 00 00 00 00 00 02 67 10 + 39 00 00 00 00 00 02 68 0F + 39 00 00 00 00 00 02 69 0D + 39 00 00 00 00 00 02 6A 0C + 39 00 00 00 00 00 02 6B 0B + 39 00 00 00 00 00 02 6C 0A + 39 00 00 00 00 00 02 6D 08 + 39 00 00 00 00 00 02 6E 07 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 75 81 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 77 83 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 7A 86 + 39 00 00 00 00 00 02 7B 87 + 39 00 00 00 00 00 02 7C 88 + 39 00 00 00 00 00 02 7D 89 + 39 00 00 00 00 00 02 7E 8A + 39 00 00 00 00 00 02 7F 8B + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 12 83 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 14 84 + 39 00 00 00 00 00 02 15 84 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 18 85 + 39 00 00 00 00 00 02 19 85 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 1B 86 + 39 00 00 00 00 00 02 1C 86 + 39 00 00 00 00 00 02 1D 86 + 39 00 00 00 00 00 02 1E 86 + 39 00 00 00 00 00 02 1F 86 + 39 00 00 00 00 00 02 20 86 + 39 00 00 00 00 00 02 21 86 + 39 00 00 00 00 00 02 22 86 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 25 86 + 39 00 00 00 00 00 02 26 87 + 39 00 00 00 00 00 02 27 86 + 39 00 00 00 00 00 02 28 86 + 39 00 00 00 00 00 02 29 86 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2F 84 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 31 85 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 33 86 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 35 87 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 38 88 + 39 00 00 00 00 00 02 39 89 + 39 00 00 00 00 00 02 3A 89 + 39 00 00 00 00 00 02 3B 89 + 39 00 00 00 00 00 02 3C 8A + 39 00 00 00 00 00 02 3D 8A + 39 00 00 00 00 00 02 3E 8A + 39 00 00 00 00 00 02 3F 8A + 39 00 00 00 00 00 02 40 8A + 39 00 00 00 00 00 02 41 8A + 39 00 00 00 00 00 02 42 8A + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 44 8A + 39 00 00 00 00 00 02 45 8A + 39 00 00 00 00 00 02 46 8A + 39 00 00 00 00 00 02 47 8A + 39 00 00 00 00 00 02 48 8A + 39 00 00 00 00 00 02 49 89 + 39 00 00 00 00 00 02 4A 89 + 39 00 00 00 00 00 02 4B 88 + 39 00 00 00 00 00 02 4C 88 + 39 00 00 00 00 00 02 4D 88 + 39 00 00 00 00 00 02 4E 88 + 39 00 00 00 00 00 02 4F 88 + 39 00 00 00 00 00 02 50 89 + 39 00 00 00 00 00 02 51 89 + 39 00 00 00 00 00 02 52 89 + 39 00 00 00 00 00 02 53 89 + 39 00 00 00 00 00 02 54 8A + 39 00 00 00 00 00 02 55 8A + 39 00 00 00 00 00 02 56 8A + 39 00 00 00 00 00 02 57 8A + 39 00 00 00 00 00 02 58 89 + 39 00 00 00 00 00 02 59 89 + 39 00 00 00 00 00 02 5A 89 + 39 00 00 00 00 00 02 5B 88 + 39 00 00 00 00 00 02 5C 88 + 39 00 00 00 00 00 02 5D 88 + 39 00 00 00 00 00 02 5E 88 + 39 00 00 00 00 00 02 5F 88 + 39 00 00 00 00 00 02 60 89 + 39 00 00 00 00 00 02 61 89 + 39 00 00 00 00 00 02 62 89 + 39 00 00 00 00 00 02 63 89 + 39 00 00 00 00 00 02 64 89 + 39 00 00 00 00 00 02 65 89 + 39 00 00 00 00 00 02 66 89 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 68 88 + 39 00 00 00 00 00 02 69 88 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 6B 89 + 39 00 00 00 00 00 02 6C 89 + 39 00 00 00 00 00 02 6D 89 + 39 00 00 00 00 00 02 6E 89 + 39 00 00 00 00 00 02 6F 89 + 39 00 00 00 00 00 02 70 89 + 39 00 00 00 00 00 02 71 89 + 39 00 00 00 00 00 02 72 89 + 39 00 00 00 00 00 02 73 89 + 39 00 00 00 00 00 02 74 89 + 39 00 00 00 00 00 02 75 88 + 39 00 00 00 00 00 02 76 88 + 39 00 00 00 00 00 02 77 88 + 39 00 00 00 00 00 02 78 88 + 39 00 00 00 00 00 02 79 87 + 39 00 00 00 00 00 02 7A 88 + 39 00 00 00 00 00 02 7B 88 + 39 00 00 00 00 00 02 7C 87 + 39 00 00 00 00 00 02 7D 87 + 39 00 00 00 00 00 02 7E 88 + 39 00 00 00 00 00 02 7F 89 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 D2 + 39 00 00 00 00 00 02 02 D3 + 39 00 00 00 00 00 02 03 D3 + 39 00 00 00 00 00 02 04 D4 + 39 00 00 00 00 00 02 05 D5 + 39 00 00 00 00 00 02 06 D5 + 39 00 00 00 00 00 02 07 D6 + 39 00 00 00 00 00 02 08 D7 + 39 00 00 00 00 00 02 09 D8 + 39 00 00 00 00 00 02 0A D9 + 39 00 00 00 00 00 02 0B DA + 39 00 00 00 00 00 02 0C DA + 39 00 00 00 00 00 02 0D DB + 39 00 00 00 00 00 02 0E DC + 39 00 00 00 00 00 02 0F DD + 39 00 00 00 00 00 02 10 DE + 39 00 00 00 00 00 02 11 DE + 39 00 00 00 00 00 02 12 DF + 39 00 00 00 00 00 02 13 E0 + 39 00 00 00 00 00 02 14 E1 + 39 00 00 00 00 00 02 15 E2 + 39 00 00 00 00 00 02 16 E2 + 39 00 00 00 00 00 02 17 E3 + 39 00 00 00 00 00 02 18 E4 + 39 00 00 00 00 00 02 19 E5 + 39 00 00 00 00 00 02 1A E6 + 39 00 00 00 00 00 02 1B E6 + 39 00 00 00 00 00 02 1C E7 + 39 00 00 00 00 00 02 1D E8 + 39 00 00 00 00 00 02 1E E8 + 39 00 00 00 00 00 02 1F E9 + 39 00 00 00 00 00 02 20 E9 + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 22 EB + 39 00 00 00 00 00 02 23 EB + 39 00 00 00 00 00 02 24 EC + 39 00 00 00 00 00 02 25 ED + 39 00 00 00 00 00 02 26 ED + 39 00 00 00 00 00 02 27 EE + 39 00 00 00 00 00 02 28 EE + 39 00 00 00 00 00 02 29 EF + 39 00 00 00 00 00 02 2A EF + 39 00 00 00 00 00 02 2B F0 + 39 00 00 00 00 00 02 2C F0 + 39 00 00 00 00 00 02 2D F1 + 39 00 00 00 00 00 02 2E F2 + 39 00 00 00 00 00 02 2F F3 + 39 00 00 00 00 00 02 30 F4 + 39 00 00 00 00 00 02 31 F5 + 39 00 00 00 00 00 02 32 F5 + 39 00 00 00 00 00 02 33 F6 + 39 00 00 00 00 00 02 34 F7 + 39 00 00 00 00 00 02 35 F8 + 39 00 00 00 00 00 02 36 F9 + 39 00 00 00 00 00 02 37 F9 + 39 00 00 00 00 00 02 38 FA + 39 00 00 00 00 00 02 39 FB + 39 00 00 00 00 00 02 3A FC + 39 00 00 00 00 00 02 3B FC + 39 00 00 00 00 00 02 3C FD + 39 00 00 00 00 00 02 3D FE + 39 00 00 00 00 00 02 3E FE + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7F FF + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 73 + 39 00 00 00 00 00 02 02 72 + 39 00 00 00 00 00 02 03 71 + 39 00 00 00 00 00 02 04 70 + 39 00 00 00 00 00 02 05 6F + 39 00 00 00 00 00 02 06 6E + 39 00 00 00 00 00 02 07 6D + 39 00 00 00 00 00 02 08 6C + 39 00 00 00 00 00 02 09 6B + 39 00 00 00 00 00 02 0A 69 + 39 00 00 00 00 00 02 0B 68 + 39 00 00 00 00 00 02 0C 67 + 39 00 00 00 00 00 02 0D 66 + 39 00 00 00 00 00 02 0E 65 + 39 00 00 00 00 00 02 0F 64 + 39 00 00 00 00 00 02 10 63 + 39 00 00 00 00 00 02 11 62 + 39 00 00 00 00 00 02 12 61 + 39 00 00 00 00 00 02 13 60 + 39 00 00 00 00 00 02 14 5F + 39 00 00 00 00 00 02 15 5D + 39 00 00 00 00 00 02 16 5C + 39 00 00 00 00 00 02 17 5B + 39 00 00 00 00 00 02 18 5A + 39 00 00 00 00 00 02 19 59 + 39 00 00 00 00 00 02 1A 58 + 39 00 00 00 00 00 02 1B 57 + 39 00 00 00 00 00 02 1C 56 + 39 00 00 00 00 00 02 1D 55 + 39 00 00 00 00 00 02 1E 53 + 39 00 00 00 00 00 02 1F 51 + 39 00 00 00 00 00 02 20 50 + 39 00 00 00 00 00 02 21 4F + 39 00 00 00 00 00 02 22 4E + 39 00 00 00 00 00 02 23 4C + 39 00 00 00 00 00 02 24 4B + 39 00 00 00 00 00 02 25 49 + 39 00 00 00 00 00 02 26 48 + 39 00 00 00 00 00 02 27 47 + 39 00 00 00 00 00 02 28 46 + 39 00 00 00 00 00 02 29 45 + 39 00 00 00 00 00 02 2A 43 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2C 41 + 39 00 00 00 00 00 02 2D 40 + 39 00 00 00 00 00 02 2E 3E + 39 00 00 00 00 00 02 2F 3D + 39 00 00 00 00 00 02 30 3C + 39 00 00 00 00 00 02 31 3A + 39 00 00 00 00 00 02 32 39 + 39 00 00 00 00 00 02 33 38 + 39 00 00 00 00 00 02 34 37 + 39 00 00 00 00 00 02 35 36 + 39 00 00 00 00 00 02 36 35 + 39 00 00 00 00 00 02 37 34 + 39 00 00 00 00 00 02 38 32 + 39 00 00 00 00 00 02 39 31 + 39 00 00 00 00 00 02 3A 30 + 39 00 00 00 00 00 02 3B 2F + 39 00 00 00 00 00 02 3C 2E + 39 00 00 00 00 00 02 3D 2C + 39 00 00 00 00 00 02 3E 2B + 39 00 00 00 00 00 02 3F 2A + 39 00 00 00 00 00 02 40 29 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 42 27 + 39 00 00 00 00 00 02 43 26 + 39 00 00 00 00 00 02 44 25 + 39 00 00 00 00 00 02 45 24 + 39 00 00 00 00 00 02 46 23 + 39 00 00 00 00 00 02 47 22 + 39 00 00 00 00 00 02 48 21 + 39 00 00 00 00 00 02 49 1F + 39 00 00 00 00 00 02 4A 1E + 39 00 00 00 00 00 02 4B 1D + 39 00 00 00 00 00 02 4C 1B + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4E 19 + 39 00 00 00 00 00 02 4F 17 + 39 00 00 00 00 00 02 50 16 + 39 00 00 00 00 00 02 51 15 + 39 00 00 00 00 00 02 52 13 + 39 00 00 00 00 00 02 53 12 + 39 00 00 00 00 00 02 54 11 + 39 00 00 00 00 00 02 55 0F + 39 00 00 00 00 00 02 56 0E + 39 00 00 00 00 00 02 57 0D + 39 00 00 00 00 00 02 58 0C + 39 00 00 00 00 00 02 59 0B + 39 00 00 00 00 00 02 5A 09 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 02 5C 07 + 39 00 00 00 00 00 02 5D 06 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 60 02 + 39 00 00 00 00 00 02 61 01 + 39 00 00 00 00 00 02 62 00 + 39 00 00 00 00 00 02 63 81 + 39 00 00 00 00 00 02 64 82 + 39 00 00 00 00 00 02 65 84 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 68 86 + 39 00 00 00 00 00 02 69 87 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 6B 89 + 39 00 00 00 00 00 02 6C 8A + 39 00 00 00 00 00 02 6D 8B + 39 00 00 00 00 00 02 6E 8C + 39 00 00 00 00 00 02 6F 8D + 39 00 00 00 00 00 02 70 8E + 39 00 00 00 00 00 02 71 8F + 39 00 00 00 00 00 02 72 90 + 39 00 00 00 00 00 02 73 91 + 39 00 00 00 00 00 02 74 92 + 39 00 00 00 00 00 02 75 94 + 39 00 00 00 00 00 02 76 95 + 39 00 00 00 00 00 02 77 97 + 39 00 00 00 00 00 02 78 99 + 39 00 00 00 00 00 02 79 9A + 39 00 00 00 00 00 02 7A 9C + 39 00 00 00 00 00 02 7B 9D + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7D A0 + 39 00 00 00 00 00 02 7E A2 + 39 00 00 00 00 00 02 7F A3 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 82 + 39 00 00 00 00 00 02 7F 89 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F d1 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 d2 + 39 00 00 00 00 00 02 7F ff + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 8b + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 74 + 39 00 00 00 00 00 02 7F a3 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F A3 + 39 00 00 00 00 00 02 7E A2 + 39 00 00 00 00 00 02 7D A0 + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7B 9D + 39 00 00 00 00 00 02 7A 9C + 39 00 00 00 00 00 02 79 9A + 39 00 00 00 00 00 02 78 99 + 39 00 00 00 00 00 02 77 97 + 39 00 00 00 00 00 02 76 95 + 39 00 00 00 00 00 02 75 94 + 39 00 00 00 00 00 02 74 92 + 39 00 00 00 00 00 02 73 91 + 39 00 00 00 00 00 02 72 90 + 39 00 00 00 00 00 02 71 8F + 39 00 00 00 00 00 02 70 8E + 39 00 00 00 00 00 02 6F 8D + 39 00 00 00 00 00 02 6E 8C + 39 00 00 00 00 00 02 6D 8B + 39 00 00 00 00 00 02 6C 8A + 39 00 00 00 00 00 02 6B 89 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 69 87 + 39 00 00 00 00 00 02 68 86 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 66 85 + 39 00 00 00 00 00 02 65 84 + 39 00 00 00 00 00 02 64 82 + 39 00 00 00 00 00 02 63 81 + 39 00 00 00 00 00 02 62 00 + 39 00 00 00 00 00 02 61 01 + 39 00 00 00 00 00 02 60 02 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 06 + 39 00 00 00 00 00 02 5C 07 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 02 5A 09 + 39 00 00 00 00 00 02 59 0B + 39 00 00 00 00 00 02 58 0C + 39 00 00 00 00 00 02 57 0D + 39 00 00 00 00 00 02 56 0E + 39 00 00 00 00 00 02 55 0F + 39 00 00 00 00 00 02 54 11 + 39 00 00 00 00 00 02 53 12 + 39 00 00 00 00 00 02 52 13 + 39 00 00 00 00 00 02 51 15 + 39 00 00 00 00 00 02 50 16 + 39 00 00 00 00 00 02 4F 17 + 39 00 00 00 00 00 02 4E 19 + 39 00 00 00 00 00 02 4D 1A + 39 00 00 00 00 00 02 4C 1B + 39 00 00 00 00 00 02 4B 1D + 39 00 00 00 00 00 02 4A 1E + 39 00 00 00 00 00 02 49 1F + 39 00 00 00 00 00 02 48 21 + 39 00 00 00 00 00 02 47 22 + 39 00 00 00 00 00 02 46 23 + 39 00 00 00 00 00 02 45 24 + 39 00 00 00 00 00 02 44 25 + 39 00 00 00 00 00 02 43 26 + 39 00 00 00 00 00 02 42 27 + 39 00 00 00 00 00 02 41 28 + 39 00 00 00 00 00 02 40 29 + 39 00 00 00 00 00 02 3F 2A + 39 00 00 00 00 00 02 3E 2B + 39 00 00 00 00 00 02 3D 2C + 39 00 00 00 00 00 02 3C 2E + 39 00 00 00 00 00 02 3B 2F + 39 00 00 00 00 00 02 3A 30 + 39 00 00 00 00 00 02 39 31 + 39 00 00 00 00 00 02 38 32 + 39 00 00 00 00 00 02 37 34 + 39 00 00 00 00 00 02 36 35 + 39 00 00 00 00 00 02 35 36 + 39 00 00 00 00 00 02 34 37 + 39 00 00 00 00 00 02 33 38 + 39 00 00 00 00 00 02 32 39 + 39 00 00 00 00 00 02 31 3A + 39 00 00 00 00 00 02 30 3C + 39 00 00 00 00 00 02 2F 3D + 39 00 00 00 00 00 02 2E 3E + 39 00 00 00 00 00 02 2D 40 + 39 00 00 00 00 00 02 2C 41 + 39 00 00 00 00 00 02 2B 42 + 39 00 00 00 00 00 02 2A 43 + 39 00 00 00 00 00 02 29 45 + 39 00 00 00 00 00 02 28 46 + 39 00 00 00 00 00 02 27 47 + 39 00 00 00 00 00 02 26 48 + 39 00 00 00 00 00 02 25 49 + 39 00 00 00 00 00 02 24 4B + 39 00 00 00 00 00 02 23 4C + 39 00 00 00 00 00 02 22 4E + 39 00 00 00 00 00 02 21 4F + 39 00 00 00 00 00 02 20 50 + 39 00 00 00 00 00 02 1F 51 + 39 00 00 00 00 00 02 1E 53 + 39 00 00 00 00 00 02 1D 55 + 39 00 00 00 00 00 02 1C 56 + 39 00 00 00 00 00 02 1B 57 + 39 00 00 00 00 00 02 1A 58 + 39 00 00 00 00 00 02 19 59 + 39 00 00 00 00 00 02 18 5A + 39 00 00 00 00 00 02 17 5B + 39 00 00 00 00 00 02 16 5C + 39 00 00 00 00 00 02 15 5D + 39 00 00 00 00 00 02 14 5F + 39 00 00 00 00 00 02 13 60 + 39 00 00 00 00 00 02 12 61 + 39 00 00 00 00 00 02 11 62 + 39 00 00 00 00 00 02 10 63 + 39 00 00 00 00 00 02 0F 64 + 39 00 00 00 00 00 02 0E 65 + 39 00 00 00 00 00 02 0D 66 + 39 00 00 00 00 00 02 0C 67 + 39 00 00 00 00 00 02 0B 68 + 39 00 00 00 00 00 02 0A 69 + 39 00 00 00 00 00 02 09 6B + 39 00 00 00 00 00 02 08 6C + 39 00 00 00 00 00 02 07 6D + 39 00 00 00 00 00 02 06 6E + 39 00 00 00 00 00 02 05 6F + 39 00 00 00 00 00 02 04 70 + 39 00 00 00 00 00 02 03 71 + 39 00 00 00 00 00 02 02 72 + 39 00 00 00 00 00 02 01 73 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 89 + 39 00 00 00 00 00 02 7E 88 + 39 00 00 00 00 00 02 7D 87 + 39 00 00 00 00 00 02 7C 87 + 39 00 00 00 00 00 02 7B 88 + 39 00 00 00 00 00 02 7A 88 + 39 00 00 00 00 00 02 79 87 + 39 00 00 00 00 00 02 78 88 + 39 00 00 00 00 00 02 77 88 + 39 00 00 00 00 00 02 76 88 + 39 00 00 00 00 00 02 75 88 + 39 00 00 00 00 00 02 74 89 + 39 00 00 00 00 00 02 73 89 + 39 00 00 00 00 00 02 72 89 + 39 00 00 00 00 00 02 71 89 + 39 00 00 00 00 00 02 70 89 + 39 00 00 00 00 00 02 6F 89 + 39 00 00 00 00 00 02 6E 89 + 39 00 00 00 00 00 02 6D 89 + 39 00 00 00 00 00 02 6C 89 + 39 00 00 00 00 00 02 6B 89 + 39 00 00 00 00 00 02 6A 88 + 39 00 00 00 00 00 02 69 88 + 39 00 00 00 00 00 02 68 88 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 66 89 + 39 00 00 00 00 00 02 65 89 + 39 00 00 00 00 00 02 64 89 + 39 00 00 00 00 00 02 63 89 + 39 00 00 00 00 00 02 62 89 + 39 00 00 00 00 00 02 61 89 + 39 00 00 00 00 00 02 60 89 + 39 00 00 00 00 00 02 5F 88 + 39 00 00 00 00 00 02 5E 88 + 39 00 00 00 00 00 02 5D 88 + 39 00 00 00 00 00 02 5C 88 + 39 00 00 00 00 00 02 5B 88 + 39 00 00 00 00 00 02 5A 89 + 39 00 00 00 00 00 02 59 89 + 39 00 00 00 00 00 02 58 89 + 39 00 00 00 00 00 02 57 8A + 39 00 00 00 00 00 02 56 8A + 39 00 00 00 00 00 02 55 8A + 39 00 00 00 00 00 02 54 8A + 39 00 00 00 00 00 02 53 89 + 39 00 00 00 00 00 02 52 89 + 39 00 00 00 00 00 02 51 89 + 39 00 00 00 00 00 02 50 89 + 39 00 00 00 00 00 02 4F 88 + 39 00 00 00 00 00 02 4E 88 + 39 00 00 00 00 00 02 4D 88 + 39 00 00 00 00 00 02 4C 88 + 39 00 00 00 00 00 02 4B 88 + 39 00 00 00 00 00 02 4A 89 + 39 00 00 00 00 00 02 49 89 + 39 00 00 00 00 00 02 48 8A + 39 00 00 00 00 00 02 47 8A + 39 00 00 00 00 00 02 46 8A + 39 00 00 00 00 00 02 45 8A + 39 00 00 00 00 00 02 44 8A + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 42 8A + 39 00 00 00 00 00 02 41 8A + 39 00 00 00 00 00 02 40 8A + 39 00 00 00 00 00 02 3F 8A + 39 00 00 00 00 00 02 3E 8A + 39 00 00 00 00 00 02 3D 8A + 39 00 00 00 00 00 02 3C 8A + 39 00 00 00 00 00 02 3B 89 + 39 00 00 00 00 00 02 3A 89 + 39 00 00 00 00 00 02 39 89 + 39 00 00 00 00 00 02 38 88 + 39 00 00 00 00 00 02 37 88 + 39 00 00 00 00 00 02 36 87 + 39 00 00 00 00 00 02 35 87 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 33 86 + 39 00 00 00 00 00 02 32 85 + 39 00 00 00 00 00 02 31 85 + 39 00 00 00 00 00 02 30 84 + 39 00 00 00 00 00 02 2F 84 + 39 00 00 00 00 00 02 2E 85 + 39 00 00 00 00 00 02 2D 85 + 39 00 00 00 00 00 02 2C 85 + 39 00 00 00 00 00 02 2B 85 + 39 00 00 00 00 00 02 2A 85 + 39 00 00 00 00 00 02 29 86 + 39 00 00 00 00 00 02 28 86 + 39 00 00 00 00 00 02 27 86 + 39 00 00 00 00 00 02 26 87 + 39 00 00 00 00 00 02 25 86 + 39 00 00 00 00 00 02 24 86 + 39 00 00 00 00 00 02 23 86 + 39 00 00 00 00 00 02 22 86 + 39 00 00 00 00 00 02 21 86 + 39 00 00 00 00 00 02 20 86 + 39 00 00 00 00 00 02 1F 86 + 39 00 00 00 00 00 02 1E 86 + 39 00 00 00 00 00 02 1D 86 + 39 00 00 00 00 00 02 1C 86 + 39 00 00 00 00 00 02 1B 86 + 39 00 00 00 00 00 02 1A 85 + 39 00 00 00 00 00 02 19 85 + 39 00 00 00 00 00 02 18 85 + 39 00 00 00 00 00 02 17 85 + 39 00 00 00 00 00 02 16 84 + 39 00 00 00 00 00 02 15 84 + 39 00 00 00 00 00 02 14 84 + 39 00 00 00 00 00 02 13 83 + 39 00 00 00 00 00 02 12 83 + 39 00 00 00 00 00 02 11 82 + 39 00 00 00 00 00 02 10 82 + 39 00 00 00 00 00 02 0F 83 + 39 00 00 00 00 00 02 0E 83 + 39 00 00 00 00 00 02 0D 83 + 39 00 00 00 00 00 02 0C 83 + 39 00 00 00 00 00 02 0B 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 82 + 39 00 00 00 00 00 02 02 82 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 3E FE + 39 00 00 00 00 00 02 3D FE + 39 00 00 00 00 00 02 3C FD + 39 00 00 00 00 00 02 3B FC + 39 00 00 00 00 00 02 3A FC + 39 00 00 00 00 00 02 39 FB + 39 00 00 00 00 00 02 38 FA + 39 00 00 00 00 00 02 37 F9 + 39 00 00 00 00 00 02 36 F9 + 39 00 00 00 00 00 02 35 F8 + 39 00 00 00 00 00 02 34 F7 + 39 00 00 00 00 00 02 33 F6 + 39 00 00 00 00 00 02 32 F5 + 39 00 00 00 00 00 02 31 F5 + 39 00 00 00 00 00 02 30 F4 + 39 00 00 00 00 00 02 2F F3 + 39 00 00 00 00 00 02 2E F2 + 39 00 00 00 00 00 02 2D F1 + 39 00 00 00 00 00 02 2C F0 + 39 00 00 00 00 00 02 2B F0 + 39 00 00 00 00 00 02 2A EF + 39 00 00 00 00 00 02 29 EF + 39 00 00 00 00 00 02 28 EE + 39 00 00 00 00 00 02 27 EE + 39 00 00 00 00 00 02 26 ED + 39 00 00 00 00 00 02 25 ED + 39 00 00 00 00 00 02 24 EC + 39 00 00 00 00 00 02 23 EB + 39 00 00 00 00 00 02 22 EB + 39 00 00 00 00 00 02 21 EA + 39 00 00 00 00 00 02 20 E9 + 39 00 00 00 00 00 02 1F E9 + 39 00 00 00 00 00 02 1E E8 + 39 00 00 00 00 00 02 1D E8 + 39 00 00 00 00 00 02 1C E7 + 39 00 00 00 00 00 02 1B E6 + 39 00 00 00 00 00 02 1A E6 + 39 00 00 00 00 00 02 19 E5 + 39 00 00 00 00 00 02 18 E4 + 39 00 00 00 00 00 02 17 E3 + 39 00 00 00 00 00 02 16 E2 + 39 00 00 00 00 00 02 15 E2 + 39 00 00 00 00 00 02 14 E1 + 39 00 00 00 00 00 02 13 E0 + 39 00 00 00 00 00 02 12 DF + 39 00 00 00 00 00 02 11 DE + 39 00 00 00 00 00 02 10 DE + 39 00 00 00 00 00 02 0F DD + 39 00 00 00 00 00 02 0E DC + 39 00 00 00 00 00 02 0D DB + 39 00 00 00 00 00 02 0C DA + 39 00 00 00 00 00 02 0B DA + 39 00 00 00 00 00 02 0A D9 + 39 00 00 00 00 00 02 09 D8 + 39 00 00 00 00 00 02 08 D7 + 39 00 00 00 00 00 02 07 D6 + 39 00 00 00 00 00 02 06 D5 + 39 00 00 00 00 00 02 05 D5 + 39 00 00 00 00 00 02 04 D4 + 39 00 00 00 00 00 02 03 D3 + 39 00 00 00 00 00 02 02 D3 + 39 00 00 00 00 00 02 01 D2 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 82 + 39 00 00 00 00 00 02 7F 89 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F d1 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 d2 + 39 00 00 00 00 00 02 7F ff + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 8b + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 74 + 39 00 00 00 00 00 02 7F a3 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 8B + 39 00 00 00 00 00 02 7E 8A + 39 00 00 00 00 00 02 7D 89 + 39 00 00 00 00 00 02 7C 88 + 39 00 00 00 00 00 02 7B 87 + 39 00 00 00 00 00 02 7A 86 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 77 83 + 39 00 00 00 00 00 02 76 82 + 39 00 00 00 00 00 02 75 81 + 39 00 00 00 00 00 02 74 00 + 39 00 00 00 00 00 02 73 01 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 6E 07 + 39 00 00 00 00 00 02 6D 08 + 39 00 00 00 00 00 02 6C 0A + 39 00 00 00 00 00 02 6B 0B + 39 00 00 00 00 00 02 6A 0C + 39 00 00 00 00 00 02 69 0D + 39 00 00 00 00 00 02 68 0F + 39 00 00 00 00 00 02 67 10 + 39 00 00 00 00 00 02 66 11 + 39 00 00 00 00 00 02 65 13 + 39 00 00 00 00 00 02 64 14 + 39 00 00 00 00 00 02 63 15 + 39 00 00 00 00 00 02 62 17 + 39 00 00 00 00 00 02 61 18 + 39 00 00 00 00 00 02 60 19 + 39 00 00 00 00 00 02 5F 1A + 39 00 00 00 00 00 02 5E 1C + 39 00 00 00 00 00 02 5D 1D + 39 00 00 00 00 00 02 5C 1E + 39 00 00 00 00 00 02 5B 1F + 39 00 00 00 00 00 02 5A 20 + 39 00 00 00 00 00 02 59 22 + 39 00 00 00 00 00 02 58 23 + 39 00 00 00 00 00 02 57 24 + 39 00 00 00 00 00 02 56 25 + 39 00 00 00 00 00 02 55 26 + 39 00 00 00 00 00 02 54 27 + 39 00 00 00 00 00 02 53 28 + 39 00 00 00 00 00 02 52 29 + 39 00 00 00 00 00 02 51 2A + 39 00 00 00 00 00 02 50 2C + 39 00 00 00 00 00 02 4F 2D + 39 00 00 00 00 00 02 4E 2E + 39 00 00 00 00 00 02 4D 2E + 39 00 00 00 00 00 02 4C 2E + 39 00 00 00 00 00 02 4B 2F + 39 00 00 00 00 00 02 4A 30 + 39 00 00 00 00 00 02 49 30 + 39 00 00 00 00 00 02 48 31 + 39 00 00 00 00 00 02 47 33 + 39 00 00 00 00 00 02 46 34 + 39 00 00 00 00 00 02 45 36 + 39 00 00 00 00 00 02 44 37 + 39 00 00 00 00 00 02 43 38 + 39 00 00 00 00 00 02 42 3A + 39 00 00 00 00 00 02 41 3B + 39 00 00 00 00 00 02 40 3C + 39 00 00 00 00 00 02 3F 3E + 39 00 00 00 00 00 02 3E 3F + 39 00 00 00 00 00 02 3D 40 + 39 00 00 00 00 00 02 3C 41 + 39 00 00 00 00 00 02 3B 42 + 39 00 00 00 00 00 02 3A 43 + 39 00 00 00 00 00 02 39 45 + 39 00 00 00 00 00 02 38 46 + 39 00 00 00 00 00 02 37 48 + 39 00 00 00 00 00 02 36 49 + 39 00 00 00 00 00 02 35 4B + 39 00 00 00 00 00 02 34 4C + 39 00 00 00 00 00 02 33 4B + 39 00 00 00 00 00 02 32 4A + 39 00 00 00 00 00 02 31 4B + 39 00 00 00 00 00 02 30 4C + 39 00 00 00 00 00 02 2F 4D + 39 00 00 00 00 00 02 2E 4F + 39 00 00 00 00 00 02 2D 50 + 39 00 00 00 00 00 02 2C 51 + 39 00 00 00 00 00 02 2B 52 + 39 00 00 00 00 00 02 2A 54 + 39 00 00 00 00 00 02 29 54 + 39 00 00 00 00 00 02 28 55 + 39 00 00 00 00 00 02 27 56 + 39 00 00 00 00 00 02 26 57 + 39 00 00 00 00 00 02 25 58 + 39 00 00 00 00 00 02 24 59 + 39 00 00 00 00 00 02 23 5A + 39 00 00 00 00 00 02 22 5B + 39 00 00 00 00 00 02 21 5B + 39 00 00 00 00 00 02 20 5D + 39 00 00 00 00 00 02 1F A2 + 39 00 00 00 00 00 02 1E A1 + 39 00 00 00 00 00 02 1D A0 + 39 00 00 00 00 00 02 1C 9F + 39 00 00 00 00 00 02 1B 9D + 39 00 00 00 00 00 02 1A 9C + 39 00 00 00 00 00 02 19 9B + 39 00 00 00 00 00 02 18 9A + 39 00 00 00 00 00 02 17 99 + 39 00 00 00 00 00 02 16 99 + 39 00 00 00 00 00 02 15 97 + 39 00 00 00 00 00 02 14 96 + 39 00 00 00 00 00 02 13 95 + 39 00 00 00 00 00 02 12 94 + 39 00 00 00 00 00 02 11 93 + 39 00 00 00 00 00 02 10 92 + 39 00 00 00 00 00 02 0F 90 + 39 00 00 00 00 00 02 0E 8F + 39 00 00 00 00 00 02 0D 8E + 39 00 00 00 00 00 02 0C 8D + 39 00 00 00 00 00 02 0B 8C + 39 00 00 00 00 00 02 0A 8B + 39 00 00 00 00 00 02 09 89 + 39 00 00 00 00 00 02 08 88 + 39 00 00 00 00 00 02 07 87 + 39 00 00 00 00 00 02 06 87 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 03 86 + 39 00 00 00 00 00 02 02 85 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 02 7E 81 + 39 00 00 00 00 00 02 7D 81 + 39 00 00 00 00 00 02 7C 81 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 00 + 39 00 00 00 00 00 02 79 00 + 39 00 00 00 00 00 02 78 00 + 39 00 00 00 00 00 02 77 00 + 39 00 00 00 00 00 02 76 01 + 39 00 00 00 00 00 02 75 01 + 39 00 00 00 00 00 02 74 01 + 39 00 00 00 00 00 02 73 02 + 39 00 00 00 00 00 02 72 02 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 70 03 + 39 00 00 00 00 00 02 6F 03 + 39 00 00 00 00 00 02 6E 03 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6C 03 + 39 00 00 00 00 00 02 6B 03 + 39 00 00 00 00 00 02 6A 03 + 39 00 00 00 00 00 02 69 03 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 67 03 + 39 00 00 00 00 00 02 66 03 + 39 00 00 00 00 00 02 65 03 + 39 00 00 00 00 00 02 64 03 + 39 00 00 00 00 00 02 63 03 + 39 00 00 00 00 00 02 62 03 + 39 00 00 00 00 00 02 61 03 + 39 00 00 00 00 00 02 60 03 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 5E 03 + 39 00 00 00 00 00 02 5D 03 + 39 00 00 00 00 00 02 5C 03 + 39 00 00 00 00 00 02 5B 03 + 39 00 00 00 00 00 02 5A 03 + 39 00 00 00 00 00 02 59 03 + 39 00 00 00 00 00 02 58 03 + 39 00 00 00 00 00 02 57 03 + 39 00 00 00 00 00 02 56 03 + 39 00 00 00 00 00 02 55 02 + 39 00 00 00 00 00 02 54 02 + 39 00 00 00 00 00 02 53 02 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 51 02 + 39 00 00 00 00 00 02 50 02 + 39 00 00 00 00 00 02 4F 02 + 39 00 00 00 00 00 02 4E 03 + 39 00 00 00 00 00 02 4D 03 + 39 00 00 00 00 00 02 4C 03 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4A 04 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 48 05 + 39 00 00 00 00 00 02 47 05 + 39 00 00 00 00 00 02 46 05 + 39 00 00 00 00 00 02 45 05 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 43 06 + 39 00 00 00 00 00 02 42 06 + 39 00 00 00 00 00 02 41 06 + 39 00 00 00 00 00 02 40 06 + 39 00 00 00 00 00 02 3F 06 + 39 00 00 00 00 00 02 3E 06 + 39 00 00 00 00 00 02 3D 06 + 39 00 00 00 00 00 02 3C 06 + 39 00 00 00 00 00 02 3B 06 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 38 07 + 39 00 00 00 00 00 02 37 06 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 05 + 39 00 00 00 00 00 02 2F 05 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2C 06 + 39 00 00 00 00 00 02 2B 06 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 27 07 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 25 08 + 39 00 00 00 00 00 02 24 06 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 21 04 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 04 + 39 00 00 00 00 00 02 1B 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 14 03 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 01 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F D1 + 39 00 00 00 00 00 02 7E D1 + 39 00 00 00 00 00 02 7D D0 + 39 00 00 00 00 00 02 7C CF + 39 00 00 00 00 00 02 7B CE + 39 00 00 00 00 00 02 7A CE + 39 00 00 00 00 00 02 79 CD + 39 00 00 00 00 00 02 78 CD + 39 00 00 00 00 00 02 77 CC + 39 00 00 00 00 00 02 76 CC + 39 00 00 00 00 00 02 75 CB + 39 00 00 00 00 00 02 74 CA + 39 00 00 00 00 00 02 73 CA + 39 00 00 00 00 00 02 72 C9 + 39 00 00 00 00 00 02 71 C9 + 39 00 00 00 00 00 02 70 C8 + 39 00 00 00 00 00 02 6F C8 + 39 00 00 00 00 00 02 6E C7 + 39 00 00 00 00 00 02 6D C7 + 39 00 00 00 00 00 02 6C C6 + 39 00 00 00 00 00 02 6B C5 + 39 00 00 00 00 00 02 6A C5 + 39 00 00 00 00 00 02 69 C4 + 39 00 00 00 00 00 02 68 C4 + 39 00 00 00 00 00 02 67 C3 + 39 00 00 00 00 00 02 66 C3 + 39 00 00 00 00 00 02 65 C3 + 39 00 00 00 00 00 02 64 C2 + 39 00 00 00 00 00 02 63 C2 + 39 00 00 00 00 00 02 62 C1 + 39 00 00 00 00 00 02 61 C1 + 39 00 00 00 00 00 02 60 C0 + 39 00 00 00 00 00 02 5F BF + 39 00 00 00 00 00 02 5E BE + 39 00 00 00 00 00 02 5D BD + 39 00 00 00 00 00 02 5C BC + 39 00 00 00 00 00 02 5B BB + 39 00 00 00 00 00 02 5A BA + 39 00 00 00 00 00 02 59 B9 + 39 00 00 00 00 00 02 58 B8 + 39 00 00 00 00 00 02 57 B7 + 39 00 00 00 00 00 02 56 B6 + 39 00 00 00 00 00 02 55 B5 + 39 00 00 00 00 00 02 54 B5 + 39 00 00 00 00 00 02 53 B4 + 39 00 00 00 00 00 02 52 B3 + 39 00 00 00 00 00 02 51 B2 + 39 00 00 00 00 00 02 50 B2 + 39 00 00 00 00 00 02 4F B1 + 39 00 00 00 00 00 02 4E B0 + 39 00 00 00 00 00 02 4D AF + 39 00 00 00 00 00 02 4C AF + 39 00 00 00 00 00 02 4B AE + 39 00 00 00 00 00 02 4A AE + 39 00 00 00 00 00 02 49 AD + 39 00 00 00 00 00 02 48 AC + 39 00 00 00 00 00 02 47 AC + 39 00 00 00 00 00 02 46 AB + 39 00 00 00 00 00 02 45 AA + 39 00 00 00 00 00 02 44 A9 + 39 00 00 00 00 00 02 43 A9 + 39 00 00 00 00 00 02 42 AA + 39 00 00 00 00 00 02 41 AA + 39 00 00 00 00 00 02 40 A9 + 39 00 00 00 00 00 02 3F A9 + 39 00 00 00 00 00 02 3E A9 + 39 00 00 00 00 00 02 3D A7 + 39 00 00 00 00 00 02 3C A6 + 39 00 00 00 00 00 02 3B A5 + 39 00 00 00 00 00 02 3A A4 + 39 00 00 00 00 00 02 39 A3 + 39 00 00 00 00 00 02 38 A3 + 39 00 00 00 00 00 02 37 A2 + 39 00 00 00 00 00 02 36 A1 + 39 00 00 00 00 00 02 35 A0 + 39 00 00 00 00 00 02 34 9F + 39 00 00 00 00 00 02 33 9F + 39 00 00 00 00 00 02 32 9E + 39 00 00 00 00 00 02 31 9D + 39 00 00 00 00 00 02 30 9C + 39 00 00 00 00 00 02 2F 9B + 39 00 00 00 00 00 02 2E 9A + 39 00 00 00 00 00 02 2D 99 + 39 00 00 00 00 00 02 2C 9B + 39 00 00 00 00 00 02 2B 9C + 39 00 00 00 00 00 02 2A 9B + 39 00 00 00 00 00 02 29 9A + 39 00 00 00 00 00 02 28 99 + 39 00 00 00 00 00 02 27 98 + 39 00 00 00 00 00 02 26 97 + 39 00 00 00 00 00 02 25 97 + 39 00 00 00 00 00 02 24 96 + 39 00 00 00 00 00 02 23 96 + 39 00 00 00 00 00 02 22 95 + 39 00 00 00 00 00 02 21 95 + 39 00 00 00 00 00 02 20 95 + 39 00 00 00 00 00 02 1F 94 + 39 00 00 00 00 00 02 1E 94 + 39 00 00 00 00 00 02 1D 93 + 39 00 00 00 00 00 02 1C 93 + 39 00 00 00 00 00 02 1B 92 + 39 00 00 00 00 00 02 1A 91 + 39 00 00 00 00 00 02 19 90 + 39 00 00 00 00 00 02 18 90 + 39 00 00 00 00 00 02 17 8F + 39 00 00 00 00 00 02 16 8E + 39 00 00 00 00 00 02 15 8E + 39 00 00 00 00 00 02 14 8D + 39 00 00 00 00 00 02 13 8D + 39 00 00 00 00 00 02 12 8C + 39 00 00 00 00 00 02 11 8B + 39 00 00 00 00 00 02 10 8A + 39 00 00 00 00 00 02 0F 8A + 39 00 00 00 00 00 02 0E 89 + 39 00 00 00 00 00 02 0D 88 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0A 86 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 07 84 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 04 84 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + + qcom,mdss-dsi-panel-eye-command07= [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 01 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A3 13 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 94 + 39 00 00 00 00 00 02 A9 1E + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 86 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 B0 26 + 39 00 00 00 00 00 02 B1 51 + 39 00 00 00 00 00 02 B2 60 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1B + 39 00 00 00 00 00 02 C2 2A + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 93 + 39 00 00 00 00 00 02 C9 1E + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 85 + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1B + 39 00 00 00 00 00 02 CE 4E + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 D1 50 + 39 00 00 00 00 00 02 D2 5F + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 02 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0F 04 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 11 05 + 39 00 00 00 00 00 02 12 05 + 39 00 00 00 00 00 02 13 05 + 39 00 00 00 00 00 02 14 05 + 39 00 00 00 00 00 02 15 05 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 18 05 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 1A 06 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1D 07 + 39 00 00 00 00 00 02 1E 08 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 20 07 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 24 04 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 29 06 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 2B 06 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 37 06 + 39 00 00 00 00 00 02 38 06 + 39 00 00 00 00 00 02 39 06 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4E 05 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 51 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 75 03 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7F 02 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 07 85 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 0A 87 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0D 89 + 39 00 00 00 00 00 02 0E 8B + 39 00 00 00 00 00 02 0F 8C + 39 00 00 00 00 00 02 10 8C + 39 00 00 00 00 00 02 11 8D + 39 00 00 00 00 00 02 12 8D + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 14 8F + 39 00 00 00 00 00 02 15 90 + 39 00 00 00 00 00 02 16 90 + 39 00 00 00 00 00 02 17 90 + 39 00 00 00 00 00 02 18 90 + 39 00 00 00 00 00 02 19 91 + 39 00 00 00 00 00 02 1A 92 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1C 95 + 39 00 00 00 00 00 02 1D 96 + 39 00 00 00 00 00 02 1E 96 + 39 00 00 00 00 00 02 1F 97 + 39 00 00 00 00 00 02 20 97 + 39 00 00 00 00 00 02 21 98 + 39 00 00 00 00 00 02 22 98 + 39 00 00 00 00 00 02 23 99 + 39 00 00 00 00 00 02 24 99 + 39 00 00 00 00 00 02 25 9A + 39 00 00 00 00 00 02 26 99 + 39 00 00 00 00 00 02 27 9A + 39 00 00 00 00 00 02 28 9B + 39 00 00 00 00 00 02 29 9D + 39 00 00 00 00 00 02 2A 9F + 39 00 00 00 00 00 02 2B A0 + 39 00 00 00 00 00 02 2C A2 + 39 00 00 00 00 00 02 2D A3 + 39 00 00 00 00 00 02 2E A3 + 39 00 00 00 00 00 02 2F A4 + 39 00 00 00 00 00 02 30 A4 + 39 00 00 00 00 00 02 31 A5 + 39 00 00 00 00 00 02 32 A5 + 39 00 00 00 00 00 02 33 A6 + 39 00 00 00 00 00 02 34 A6 + 39 00 00 00 00 00 02 35 A7 + 39 00 00 00 00 00 02 36 A8 + 39 00 00 00 00 00 02 37 A9 + 39 00 00 00 00 00 02 38 AA + 39 00 00 00 00 00 02 39 AB + 39 00 00 00 00 00 02 3A AC + 39 00 00 00 00 00 02 3B AC + 39 00 00 00 00 00 02 3C AC + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3E AF + 39 00 00 00 00 00 02 3F B0 + 39 00 00 00 00 00 02 40 B1 + 39 00 00 00 00 00 02 41 B2 + 39 00 00 00 00 00 02 42 B3 + 39 00 00 00 00 00 02 43 B3 + 39 00 00 00 00 00 02 44 B3 + 39 00 00 00 00 00 02 45 B4 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 47 B4 + 39 00 00 00 00 00 02 48 B5 + 39 00 00 00 00 00 02 49 B6 + 39 00 00 00 00 00 02 4A B6 + 39 00 00 00 00 00 02 4B B7 + 39 00 00 00 00 00 02 4C B7 + 39 00 00 00 00 00 02 4D B8 + 39 00 00 00 00 00 02 4E B8 + 39 00 00 00 00 00 02 4F B9 + 39 00 00 00 00 00 02 50 BA + 39 00 00 00 00 00 02 51 BB + 39 00 00 00 00 00 02 52 BC + 39 00 00 00 00 00 02 53 BC + 39 00 00 00 00 00 02 54 BD + 39 00 00 00 00 00 02 55 BE + 39 00 00 00 00 00 02 56 BE + 39 00 00 00 00 00 02 57 BF + 39 00 00 00 00 00 02 58 C0 + 39 00 00 00 00 00 02 59 C1 + 39 00 00 00 00 00 02 5A C3 + 39 00 00 00 00 00 02 5B C4 + 39 00 00 00 00 00 02 5C C5 + 39 00 00 00 00 00 02 5D C6 + 39 00 00 00 00 00 02 5E C7 + 39 00 00 00 00 00 02 5F C8 + 39 00 00 00 00 00 02 60 C9 + 39 00 00 00 00 00 02 61 CA + 39 00 00 00 00 00 02 62 CB + 39 00 00 00 00 00 02 63 CC + 39 00 00 00 00 00 02 64 CD + 39 00 00 00 00 00 02 65 CD + 39 00 00 00 00 00 02 66 CE + 39 00 00 00 00 00 02 67 CE + 39 00 00 00 00 00 02 68 CF + 39 00 00 00 00 00 02 69 D0 + 39 00 00 00 00 00 02 6A D0 + 39 00 00 00 00 00 02 6B D1 + 39 00 00 00 00 00 02 6C D2 + 39 00 00 00 00 00 02 6D D2 + 39 00 00 00 00 00 02 6E D3 + 39 00 00 00 00 00 02 6F D4 + 39 00 00 00 00 00 02 70 D4 + 39 00 00 00 00 00 02 71 D5 + 39 00 00 00 00 00 02 72 D6 + 39 00 00 00 00 00 02 73 D7 + 39 00 00 00 00 00 02 74 D7 + 39 00 00 00 00 00 02 75 D8 + 39 00 00 00 00 00 02 76 D9 + 39 00 00 00 00 00 02 77 DA + 39 00 00 00 00 00 02 78 DA + 39 00 00 00 00 00 02 79 DB + 39 00 00 00 00 00 02 7A DC + 39 00 00 00 00 00 02 7B DD + 39 00 00 00 00 00 02 7C DD + 39 00 00 00 00 00 02 7D DE + 39 00 00 00 00 00 02 7E DF + 39 00 00 00 00 00 02 7F E0 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 06 89 + 39 00 00 00 00 00 02 07 89 + 39 00 00 00 00 00 02 08 8A + 39 00 00 00 00 00 02 09 8B + 39 00 00 00 00 00 02 0A 8D + 39 00 00 00 00 00 02 0B 8E + 39 00 00 00 00 00 02 0C 90 + 39 00 00 00 00 00 02 0D 91 + 39 00 00 00 00 00 02 0E 92 + 39 00 00 00 00 00 02 0F 93 + 39 00 00 00 00 00 02 10 95 + 39 00 00 00 00 00 02 11 97 + 39 00 00 00 00 00 02 12 98 + 39 00 00 00 00 00 02 13 9A + 39 00 00 00 00 00 02 14 9B + 39 00 00 00 00 00 02 15 9C + 39 00 00 00 00 00 02 16 9D + 39 00 00 00 00 00 02 17 9F + 39 00 00 00 00 00 02 18 A0 + 39 00 00 00 00 00 02 19 A1 + 39 00 00 00 00 00 02 1A A2 + 39 00 00 00 00 00 02 1B A3 + 39 00 00 00 00 00 02 1C A4 + 39 00 00 00 00 00 02 1D A5 + 39 00 00 00 00 00 02 1E A7 + 39 00 00 00 00 00 02 1F A8 + 39 00 00 00 00 00 02 20 56 + 39 00 00 00 00 00 02 21 55 + 39 00 00 00 00 00 02 22 53 + 39 00 00 00 00 00 02 23 51 + 39 00 00 00 00 00 02 24 50 + 39 00 00 00 00 00 02 25 4F + 39 00 00 00 00 00 02 26 4E + 39 00 00 00 00 00 02 27 4D + 39 00 00 00 00 00 02 28 4C + 39 00 00 00 00 00 02 29 4B + 39 00 00 00 00 00 02 2A 49 + 39 00 00 00 00 00 02 2B 48 + 39 00 00 00 00 00 02 2C 47 + 39 00 00 00 00 00 02 2D 46 + 39 00 00 00 00 00 02 2E 45 + 39 00 00 00 00 00 02 2F 45 + 39 00 00 00 00 00 02 30 43 + 39 00 00 00 00 00 02 31 41 + 39 00 00 00 00 00 02 32 3F + 39 00 00 00 00 00 02 33 3D + 39 00 00 00 00 00 02 34 3B + 39 00 00 00 00 00 02 35 39 + 39 00 00 00 00 00 02 36 37 + 39 00 00 00 00 00 02 37 35 + 39 00 00 00 00 00 02 38 35 + 39 00 00 00 00 00 02 39 34 + 39 00 00 00 00 00 02 3A 32 + 39 00 00 00 00 00 02 3B 31 + 39 00 00 00 00 00 02 3C 30 + 39 00 00 00 00 00 02 3D 2F + 39 00 00 00 00 00 02 3E 2E + 39 00 00 00 00 00 02 3F 2D + 39 00 00 00 00 00 02 40 2B + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 42 29 + 39 00 00 00 00 00 02 43 27 + 39 00 00 00 00 00 02 44 26 + 39 00 00 00 00 00 02 45 24 + 39 00 00 00 00 00 02 46 23 + 39 00 00 00 00 00 02 47 21 + 39 00 00 00 00 00 02 48 20 + 39 00 00 00 00 00 02 49 20 + 39 00 00 00 00 00 02 4A 1E + 39 00 00 00 00 00 02 4B 1C + 39 00 00 00 00 00 02 4C 1A + 39 00 00 00 00 00 02 4D 18 + 39 00 00 00 00 00 02 4E 16 + 39 00 00 00 00 00 02 4F 15 + 39 00 00 00 00 00 02 50 14 + 39 00 00 00 00 00 02 51 13 + 39 00 00 00 00 00 02 52 12 + 39 00 00 00 00 00 02 53 11 + 39 00 00 00 00 00 02 54 10 + 39 00 00 00 00 00 02 55 0F + 39 00 00 00 00 00 02 56 0E + 39 00 00 00 00 00 02 57 0D + 39 00 00 00 00 00 02 58 0B + 39 00 00 00 00 00 02 59 0A + 39 00 00 00 00 00 02 5A 09 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 02 5C 07 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 60 02 + 39 00 00 00 00 00 02 61 00 + 39 00 00 00 00 00 02 62 81 + 39 00 00 00 00 00 02 63 82 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 66 87 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 68 89 + 39 00 00 00 00 00 02 69 8A + 39 00 00 00 00 00 02 6A 8C + 39 00 00 00 00 00 02 6B 8D + 39 00 00 00 00 00 02 6C 8F + 39 00 00 00 00 00 02 6D 91 + 39 00 00 00 00 00 02 6E 92 + 39 00 00 00 00 00 02 6F 94 + 39 00 00 00 00 00 02 70 96 + 39 00 00 00 00 00 02 71 97 + 39 00 00 00 00 00 02 72 99 + 39 00 00 00 00 00 02 73 9A + 39 00 00 00 00 00 02 74 9C + 39 00 00 00 00 00 02 75 9E + 39 00 00 00 00 00 02 76 9F + 39 00 00 00 00 00 02 77 A1 + 39 00 00 00 00 00 02 78 A2 + 39 00 00 00 00 00 02 79 A4 + 39 00 00 00 00 00 02 7A A5 + 39 00 00 00 00 00 02 7B A7 + 39 00 00 00 00 00 02 7C A8 + 39 00 00 00 00 00 02 7D A9 + 39 00 00 00 00 00 02 7E AA + 39 00 00 00 00 00 02 7F AC + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 05 02 + 39 00 00 00 00 00 02 06 02 + 39 00 00 00 00 00 02 07 02 + 39 00 00 00 00 00 02 08 02 + 39 00 00 00 00 00 02 09 02 + 39 00 00 00 00 00 02 0A 02 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 12 02 + 39 00 00 00 00 00 02 13 02 + 39 00 00 00 00 00 02 14 01 + 39 00 00 00 00 00 02 15 01 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 00 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 1A 81 + 39 00 00 00 00 00 02 1B 81 + 39 00 00 00 00 00 02 1C 81 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1F 82 + 39 00 00 00 00 00 02 20 82 + 39 00 00 00 00 00 02 21 82 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 24 82 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 82 + 39 00 00 00 00 00 02 2A 82 + 39 00 00 00 00 00 02 2B 82 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2E 81 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 3B 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 40 87 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 56 84 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 67 83 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 6B 83 + 39 00 00 00 00 00 02 6C 83 + 39 00 00 00 00 00 02 6D 83 + 39 00 00 00 00 00 02 6E 83 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 70 82 + 39 00 00 00 00 00 02 71 82 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 76 83 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7E 82 + 39 00 00 00 00 00 02 7F 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 E0 + 39 00 00 00 00 00 02 02 E1 + 39 00 00 00 00 00 02 03 E2 + 39 00 00 00 00 00 02 04 E3 + 39 00 00 00 00 00 02 05 E4 + 39 00 00 00 00 00 02 06 E4 + 39 00 00 00 00 00 02 07 E5 + 39 00 00 00 00 00 02 08 E6 + 39 00 00 00 00 00 02 09 E7 + 39 00 00 00 00 00 02 0A E8 + 39 00 00 00 00 00 02 0B E8 + 39 00 00 00 00 00 02 0C E9 + 39 00 00 00 00 00 02 0D EA + 39 00 00 00 00 00 02 0E EB + 39 00 00 00 00 00 02 0F EC + 39 00 00 00 00 00 02 10 ED + 39 00 00 00 00 00 02 11 EE + 39 00 00 00 00 00 02 12 EF + 39 00 00 00 00 00 02 13 F0 + 39 00 00 00 00 00 02 14 F0 + 39 00 00 00 00 00 02 15 F1 + 39 00 00 00 00 00 02 16 F2 + 39 00 00 00 00 00 02 17 F3 + 39 00 00 00 00 00 02 18 F3 + 39 00 00 00 00 00 02 19 F4 + 39 00 00 00 00 00 02 1A F5 + 39 00 00 00 00 00 02 1B F6 + 39 00 00 00 00 00 02 1C F7 + 39 00 00 00 00 00 02 1D F7 + 39 00 00 00 00 00 02 1E F8 + 39 00 00 00 00 00 02 1F F9 + 39 00 00 00 00 00 02 20 FA + 39 00 00 00 00 00 02 21 FA + 39 00 00 00 00 00 02 22 FB + 39 00 00 00 00 00 02 23 FC + 39 00 00 00 00 00 02 24 FC + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 26 FE + 39 00 00 00 00 00 02 27 FE + 39 00 00 00 00 00 02 28 FF + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 2A FF + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2C FF + 39 00 00 00 00 00 02 2D FF + 39 00 00 00 00 00 02 2E FF + 39 00 00 00 00 00 02 2F FF + 39 00 00 00 00 00 02 30 FF + 39 00 00 00 00 00 02 31 FF + 39 00 00 00 00 00 02 32 FF + 39 00 00 00 00 00 02 33 FF + 39 00 00 00 00 00 02 34 FF + 39 00 00 00 00 00 02 35 FF + 39 00 00 00 00 00 02 36 FF + 39 00 00 00 00 00 02 37 FF + 39 00 00 00 00 00 02 38 FF + 39 00 00 00 00 00 02 39 FF + 39 00 00 00 00 00 02 3A FF + 39 00 00 00 00 00 02 3B FF + 39 00 00 00 00 00 02 3C FF + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3E FF + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7F FF + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 52 + 39 00 00 00 00 00 02 02 51 + 39 00 00 00 00 00 02 03 4F + 39 00 00 00 00 00 02 04 4E + 39 00 00 00 00 00 02 05 4D + 39 00 00 00 00 00 02 06 4B + 39 00 00 00 00 00 02 07 4A + 39 00 00 00 00 00 02 08 49 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 0A 46 + 39 00 00 00 00 00 02 0B 44 + 39 00 00 00 00 00 02 0C 43 + 39 00 00 00 00 00 02 0D 42 + 39 00 00 00 00 00 02 0E 41 + 39 00 00 00 00 00 02 0F 3F + 39 00 00 00 00 00 02 10 3E + 39 00 00 00 00 00 02 11 3C + 39 00 00 00 00 00 02 12 3B + 39 00 00 00 00 00 02 13 3A + 39 00 00 00 00 00 02 14 38 + 39 00 00 00 00 00 02 15 37 + 39 00 00 00 00 00 02 16 36 + 39 00 00 00 00 00 02 17 34 + 39 00 00 00 00 00 02 18 33 + 39 00 00 00 00 00 02 19 32 + 39 00 00 00 00 00 02 1A 30 + 39 00 00 00 00 00 02 1B 2F + 39 00 00 00 00 00 02 1C 2E + 39 00 00 00 00 00 02 1D 2D + 39 00 00 00 00 00 02 1E 2C + 39 00 00 00 00 00 02 1F 2A + 39 00 00 00 00 00 02 20 28 + 39 00 00 00 00 00 02 21 27 + 39 00 00 00 00 00 02 22 25 + 39 00 00 00 00 00 02 23 24 + 39 00 00 00 00 00 02 24 23 + 39 00 00 00 00 00 02 25 21 + 39 00 00 00 00 00 02 26 20 + 39 00 00 00 00 00 02 27 1E + 39 00 00 00 00 00 02 28 1D + 39 00 00 00 00 00 02 29 1B + 39 00 00 00 00 00 02 2A 1A + 39 00 00 00 00 00 02 2B 19 + 39 00 00 00 00 00 02 2C 17 + 39 00 00 00 00 00 02 2D 16 + 39 00 00 00 00 00 02 2E 14 + 39 00 00 00 00 00 02 2F 13 + 39 00 00 00 00 00 02 30 11 + 39 00 00 00 00 00 02 31 10 + 39 00 00 00 00 00 02 32 0E + 39 00 00 00 00 00 02 33 0D + 39 00 00 00 00 00 02 34 0B + 39 00 00 00 00 00 02 35 0A + 39 00 00 00 00 00 02 36 08 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 38 05 + 39 00 00 00 00 00 02 39 04 + 39 00 00 00 00 00 02 3A 03 + 39 00 00 00 00 00 02 3B 01 + 39 00 00 00 00 00 02 3C 00 + 39 00 00 00 00 00 02 3D 82 + 39 00 00 00 00 00 02 3E 83 + 39 00 00 00 00 00 02 3F 85 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 41 87 + 39 00 00 00 00 00 02 42 89 + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 44 8C + 39 00 00 00 00 00 02 45 8D + 39 00 00 00 00 00 02 46 8E + 39 00 00 00 00 00 02 47 90 + 39 00 00 00 00 00 02 48 91 + 39 00 00 00 00 00 02 49 93 + 39 00 00 00 00 00 02 4A 94 + 39 00 00 00 00 00 02 4B 95 + 39 00 00 00 00 00 02 4C 96 + 39 00 00 00 00 00 02 4D 98 + 39 00 00 00 00 00 02 4E 99 + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 51 9D + 39 00 00 00 00 00 02 52 9E + 39 00 00 00 00 00 02 53 9F + 39 00 00 00 00 00 02 54 A1 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 56 A3 + 39 00 00 00 00 00 02 57 A4 + 39 00 00 00 00 00 02 58 A6 + 39 00 00 00 00 00 02 59 A7 + 39 00 00 00 00 00 02 5A A8 + 39 00 00 00 00 00 02 5B AA + 39 00 00 00 00 00 02 5C AC + 39 00 00 00 00 00 02 5D AD + 39 00 00 00 00 00 02 5E AF + 39 00 00 00 00 00 02 5F B0 + 39 00 00 00 00 00 02 60 B2 + 39 00 00 00 00 00 02 61 B4 + 39 00 00 00 00 00 02 62 B5 + 39 00 00 00 00 00 02 63 B7 + 39 00 00 00 00 00 02 64 B9 + 39 00 00 00 00 00 02 65 BA + 39 00 00 00 00 00 02 66 BC + 39 00 00 00 00 00 02 67 BD + 39 00 00 00 00 00 02 68 BF + 39 00 00 00 00 00 02 69 C1 + 39 00 00 00 00 00 02 6A C2 + 39 00 00 00 00 00 02 6B C4 + 39 00 00 00 00 00 02 6C C5 + 39 00 00 00 00 00 02 6D C7 + 39 00 00 00 00 00 02 6E C8 + 39 00 00 00 00 00 02 6F CA + 39 00 00 00 00 00 02 70 CC + 39 00 00 00 00 00 02 71 CE + 39 00 00 00 00 00 02 72 CF + 39 00 00 00 00 00 02 73 D0 + 39 00 00 00 00 00 02 74 D1 + 39 00 00 00 00 00 02 75 D3 + 39 00 00 00 00 00 02 76 D4 + 39 00 00 00 00 00 02 77 D6 + 39 00 00 00 00 00 02 78 D7 + 39 00 00 00 00 00 02 79 D9 + 39 00 00 00 00 00 02 7A DA + 39 00 00 00 00 00 02 7B DC + 39 00 00 00 00 00 02 7C DD + 39 00 00 00 00 00 02 7D DF + 39 00 00 00 00 00 02 7E E0 + 39 00 00 00 00 00 02 7F E1 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 02 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F E0 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 E0 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F ac + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 53 + 39 00 00 00 00 00 02 7F e1 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F E1 + 39 00 00 00 00 00 02 7E E0 + 39 00 00 00 00 00 02 7D DF + 39 00 00 00 00 00 02 7C DD + 39 00 00 00 00 00 02 7B DC + 39 00 00 00 00 00 02 7A DA + 39 00 00 00 00 00 02 79 D9 + 39 00 00 00 00 00 02 78 D7 + 39 00 00 00 00 00 02 77 D6 + 39 00 00 00 00 00 02 76 D4 + 39 00 00 00 00 00 02 75 D3 + 39 00 00 00 00 00 02 74 D1 + 39 00 00 00 00 00 02 73 D0 + 39 00 00 00 00 00 02 72 CF + 39 00 00 00 00 00 02 71 CE + 39 00 00 00 00 00 02 70 CC + 39 00 00 00 00 00 02 6F CA + 39 00 00 00 00 00 02 6E C8 + 39 00 00 00 00 00 02 6D C7 + 39 00 00 00 00 00 02 6C C5 + 39 00 00 00 00 00 02 6B C4 + 39 00 00 00 00 00 02 6A C2 + 39 00 00 00 00 00 02 69 C1 + 39 00 00 00 00 00 02 68 BF + 39 00 00 00 00 00 02 67 BD + 39 00 00 00 00 00 02 66 BC + 39 00 00 00 00 00 02 65 BA + 39 00 00 00 00 00 02 64 B9 + 39 00 00 00 00 00 02 63 B7 + 39 00 00 00 00 00 02 62 B5 + 39 00 00 00 00 00 02 61 B4 + 39 00 00 00 00 00 02 60 B2 + 39 00 00 00 00 00 02 5F B0 + 39 00 00 00 00 00 02 5E AF + 39 00 00 00 00 00 02 5D AD + 39 00 00 00 00 00 02 5C AC + 39 00 00 00 00 00 02 5B AA + 39 00 00 00 00 00 02 5A A8 + 39 00 00 00 00 00 02 59 A7 + 39 00 00 00 00 00 02 58 A6 + 39 00 00 00 00 00 02 57 A4 + 39 00 00 00 00 00 02 56 A3 + 39 00 00 00 00 00 02 55 A2 + 39 00 00 00 00 00 02 54 A1 + 39 00 00 00 00 00 02 53 9F + 39 00 00 00 00 00 02 52 9E + 39 00 00 00 00 00 02 51 9D + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 4E 99 + 39 00 00 00 00 00 02 4D 98 + 39 00 00 00 00 00 02 4C 96 + 39 00 00 00 00 00 02 4B 95 + 39 00 00 00 00 00 02 4A 94 + 39 00 00 00 00 00 02 49 93 + 39 00 00 00 00 00 02 48 91 + 39 00 00 00 00 00 02 47 90 + 39 00 00 00 00 00 02 46 8E + 39 00 00 00 00 00 02 45 8D + 39 00 00 00 00 00 02 44 8C + 39 00 00 00 00 00 02 43 8A + 39 00 00 00 00 00 02 42 89 + 39 00 00 00 00 00 02 41 87 + 39 00 00 00 00 00 02 40 86 + 39 00 00 00 00 00 02 3F 85 + 39 00 00 00 00 00 02 3E 83 + 39 00 00 00 00 00 02 3D 82 + 39 00 00 00 00 00 02 3C 00 + 39 00 00 00 00 00 02 3B 01 + 39 00 00 00 00 00 02 3A 03 + 39 00 00 00 00 00 02 39 04 + 39 00 00 00 00 00 02 38 05 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 36 08 + 39 00 00 00 00 00 02 35 0A + 39 00 00 00 00 00 02 34 0B + 39 00 00 00 00 00 02 33 0D + 39 00 00 00 00 00 02 32 0E + 39 00 00 00 00 00 02 31 10 + 39 00 00 00 00 00 02 30 11 + 39 00 00 00 00 00 02 2F 13 + 39 00 00 00 00 00 02 2E 14 + 39 00 00 00 00 00 02 2D 16 + 39 00 00 00 00 00 02 2C 17 + 39 00 00 00 00 00 02 2B 19 + 39 00 00 00 00 00 02 2A 1A + 39 00 00 00 00 00 02 29 1B + 39 00 00 00 00 00 02 28 1D + 39 00 00 00 00 00 02 27 1E + 39 00 00 00 00 00 02 26 20 + 39 00 00 00 00 00 02 25 21 + 39 00 00 00 00 00 02 24 23 + 39 00 00 00 00 00 02 23 24 + 39 00 00 00 00 00 02 22 25 + 39 00 00 00 00 00 02 21 27 + 39 00 00 00 00 00 02 20 28 + 39 00 00 00 00 00 02 1F 2A + 39 00 00 00 00 00 02 1E 2C + 39 00 00 00 00 00 02 1D 2D + 39 00 00 00 00 00 02 1C 2E + 39 00 00 00 00 00 02 1B 2F + 39 00 00 00 00 00 02 1A 30 + 39 00 00 00 00 00 02 19 32 + 39 00 00 00 00 00 02 18 33 + 39 00 00 00 00 00 02 17 34 + 39 00 00 00 00 00 02 16 36 + 39 00 00 00 00 00 02 15 37 + 39 00 00 00 00 00 02 14 38 + 39 00 00 00 00 00 02 13 3A + 39 00 00 00 00 00 02 12 3B + 39 00 00 00 00 00 02 11 3C + 39 00 00 00 00 00 02 10 3E + 39 00 00 00 00 00 02 0F 3F + 39 00 00 00 00 00 02 0E 41 + 39 00 00 00 00 00 02 0D 42 + 39 00 00 00 00 00 02 0C 43 + 39 00 00 00 00 00 02 0B 44 + 39 00 00 00 00 00 02 0A 46 + 39 00 00 00 00 00 02 09 47 + 39 00 00 00 00 00 02 08 49 + 39 00 00 00 00 00 02 07 4A + 39 00 00 00 00 00 02 06 4B + 39 00 00 00 00 00 02 05 4D + 39 00 00 00 00 00 02 04 4E + 39 00 00 00 00 00 02 03 4F + 39 00 00 00 00 00 02 02 51 + 39 00 00 00 00 00 02 01 52 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 02 7E 82 + 39 00 00 00 00 00 02 7D 82 + 39 00 00 00 00 00 02 7C 82 + 39 00 00 00 00 00 02 7B 81 + 39 00 00 00 00 00 02 7A 82 + 39 00 00 00 00 00 02 79 82 + 39 00 00 00 00 00 02 78 82 + 39 00 00 00 00 00 02 77 82 + 39 00 00 00 00 00 02 76 83 + 39 00 00 00 00 00 02 75 83 + 39 00 00 00 00 00 02 74 83 + 39 00 00 00 00 00 02 73 83 + 39 00 00 00 00 00 02 72 83 + 39 00 00 00 00 00 02 71 82 + 39 00 00 00 00 00 02 70 82 + 39 00 00 00 00 00 02 6F 83 + 39 00 00 00 00 00 02 6E 83 + 39 00 00 00 00 00 02 6D 83 + 39 00 00 00 00 00 02 6C 83 + 39 00 00 00 00 00 02 6B 83 + 39 00 00 00 00 00 02 6A 83 + 39 00 00 00 00 00 02 69 83 + 39 00 00 00 00 00 02 68 82 + 39 00 00 00 00 00 02 67 83 + 39 00 00 00 00 00 02 66 83 + 39 00 00 00 00 00 02 65 83 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 63 84 + 39 00 00 00 00 00 02 62 84 + 39 00 00 00 00 00 02 61 84 + 39 00 00 00 00 00 02 60 84 + 39 00 00 00 00 00 02 5F 84 + 39 00 00 00 00 00 02 5E 83 + 39 00 00 00 00 00 02 5D 83 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5B 83 + 39 00 00 00 00 00 02 5A 83 + 39 00 00 00 00 00 02 59 84 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 57 84 + 39 00 00 00 00 00 02 56 84 + 39 00 00 00 00 00 02 55 85 + 39 00 00 00 00 00 02 54 85 + 39 00 00 00 00 00 02 53 85 + 39 00 00 00 00 00 02 52 85 + 39 00 00 00 00 00 02 51 84 + 39 00 00 00 00 00 02 50 84 + 39 00 00 00 00 00 02 4F 84 + 39 00 00 00 00 00 02 4E 84 + 39 00 00 00 00 00 02 4D 83 + 39 00 00 00 00 00 02 4C 83 + 39 00 00 00 00 00 02 4B 83 + 39 00 00 00 00 00 02 4A 84 + 39 00 00 00 00 00 02 49 84 + 39 00 00 00 00 00 02 48 85 + 39 00 00 00 00 00 02 47 85 + 39 00 00 00 00 00 02 46 85 + 39 00 00 00 00 00 02 45 86 + 39 00 00 00 00 00 02 44 86 + 39 00 00 00 00 00 02 43 86 + 39 00 00 00 00 00 02 42 86 + 39 00 00 00 00 00 02 41 86 + 39 00 00 00 00 00 02 40 87 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 3E 86 + 39 00 00 00 00 00 02 3D 86 + 39 00 00 00 00 00 02 3C 86 + 39 00 00 00 00 00 02 3B 86 + 39 00 00 00 00 00 02 3A 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 38 85 + 39 00 00 00 00 00 02 37 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 84 + 39 00 00 00 00 00 02 34 84 + 39 00 00 00 00 00 02 33 83 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 81 + 39 00 00 00 00 00 02 2E 81 + 39 00 00 00 00 00 02 2D 82 + 39 00 00 00 00 00 02 2C 82 + 39 00 00 00 00 00 02 2B 82 + 39 00 00 00 00 00 02 2A 82 + 39 00 00 00 00 00 02 29 82 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 24 82 + 39 00 00 00 00 00 02 23 82 + 39 00 00 00 00 00 02 22 82 + 39 00 00 00 00 00 02 21 82 + 39 00 00 00 00 00 02 20 82 + 39 00 00 00 00 00 02 1F 82 + 39 00 00 00 00 00 02 1E 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1C 81 + 39 00 00 00 00 00 02 1B 81 + 39 00 00 00 00 00 02 1A 81 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 18 00 + 39 00 00 00 00 00 02 17 00 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 15 01 + 39 00 00 00 00 00 02 14 01 + 39 00 00 00 00 00 02 13 02 + 39 00 00 00 00 00 02 12 02 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0A 02 + 39 00 00 00 00 00 02 09 02 + 39 00 00 00 00 00 02 08 02 + 39 00 00 00 00 00 02 07 02 + 39 00 00 00 00 00 02 06 02 + 39 00 00 00 00 00 02 05 02 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 01 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 3E FF + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3C FF + 39 00 00 00 00 00 02 3B FF + 39 00 00 00 00 00 02 3A FF + 39 00 00 00 00 00 02 39 FF + 39 00 00 00 00 00 02 38 FF + 39 00 00 00 00 00 02 37 FF + 39 00 00 00 00 00 02 36 FF + 39 00 00 00 00 00 02 35 FF + 39 00 00 00 00 00 02 34 FF + 39 00 00 00 00 00 02 33 FF + 39 00 00 00 00 00 02 32 FF + 39 00 00 00 00 00 02 31 FF + 39 00 00 00 00 00 02 30 FF + 39 00 00 00 00 00 02 2F FF + 39 00 00 00 00 00 02 2E FF + 39 00 00 00 00 00 02 2D FF + 39 00 00 00 00 00 02 2C FF + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2A FF + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 28 FF + 39 00 00 00 00 00 02 27 FE + 39 00 00 00 00 00 02 26 FE + 39 00 00 00 00 00 02 25 FD + 39 00 00 00 00 00 02 24 FC + 39 00 00 00 00 00 02 23 FC + 39 00 00 00 00 00 02 22 FB + 39 00 00 00 00 00 02 21 FA + 39 00 00 00 00 00 02 20 FA + 39 00 00 00 00 00 02 1F F9 + 39 00 00 00 00 00 02 1E F8 + 39 00 00 00 00 00 02 1D F7 + 39 00 00 00 00 00 02 1C F7 + 39 00 00 00 00 00 02 1B F6 + 39 00 00 00 00 00 02 1A F5 + 39 00 00 00 00 00 02 19 F4 + 39 00 00 00 00 00 02 18 F3 + 39 00 00 00 00 00 02 17 F3 + 39 00 00 00 00 00 02 16 F2 + 39 00 00 00 00 00 02 15 F1 + 39 00 00 00 00 00 02 14 F0 + 39 00 00 00 00 00 02 13 F0 + 39 00 00 00 00 00 02 12 EF + 39 00 00 00 00 00 02 11 EE + 39 00 00 00 00 00 02 10 ED + 39 00 00 00 00 00 02 0F EC + 39 00 00 00 00 00 02 0E EB + 39 00 00 00 00 00 02 0D EA + 39 00 00 00 00 00 02 0C E9 + 39 00 00 00 00 00 02 0B E8 + 39 00 00 00 00 00 02 0A E8 + 39 00 00 00 00 00 02 09 E7 + 39 00 00 00 00 00 02 08 E6 + 39 00 00 00 00 00 02 07 E5 + 39 00 00 00 00 00 02 06 E4 + 39 00 00 00 00 00 02 05 E4 + 39 00 00 00 00 00 02 04 E3 + 39 00 00 00 00 00 02 03 E2 + 39 00 00 00 00 00 02 02 E1 + 39 00 00 00 00 00 02 01 E0 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 02 + 39 00 00 00 00 00 02 7F 81 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F E0 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 E0 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F ac + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 53 + 39 00 00 00 00 00 02 7F e1 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F AC + 39 00 00 00 00 00 02 7E AA + 39 00 00 00 00 00 02 7D A9 + 39 00 00 00 00 00 02 7C A8 + 39 00 00 00 00 00 02 7B A7 + 39 00 00 00 00 00 02 7A A5 + 39 00 00 00 00 00 02 79 A4 + 39 00 00 00 00 00 02 78 A2 + 39 00 00 00 00 00 02 77 A1 + 39 00 00 00 00 00 02 76 9F + 39 00 00 00 00 00 02 75 9E + 39 00 00 00 00 00 02 74 9C + 39 00 00 00 00 00 02 73 9A + 39 00 00 00 00 00 02 72 99 + 39 00 00 00 00 00 02 71 97 + 39 00 00 00 00 00 02 70 96 + 39 00 00 00 00 00 02 6F 94 + 39 00 00 00 00 00 02 6E 92 + 39 00 00 00 00 00 02 6D 91 + 39 00 00 00 00 00 02 6C 8F + 39 00 00 00 00 00 02 6B 8D + 39 00 00 00 00 00 02 6A 8C + 39 00 00 00 00 00 02 69 8A + 39 00 00 00 00 00 02 68 89 + 39 00 00 00 00 00 02 67 88 + 39 00 00 00 00 00 02 66 87 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 64 84 + 39 00 00 00 00 00 02 63 82 + 39 00 00 00 00 00 02 62 81 + 39 00 00 00 00 00 02 61 00 + 39 00 00 00 00 00 02 60 02 + 39 00 00 00 00 00 02 5F 03 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5C 07 + 39 00 00 00 00 00 02 5B 08 + 39 00 00 00 00 00 02 5A 09 + 39 00 00 00 00 00 02 59 0A + 39 00 00 00 00 00 02 58 0B + 39 00 00 00 00 00 02 57 0D + 39 00 00 00 00 00 02 56 0E + 39 00 00 00 00 00 02 55 0F + 39 00 00 00 00 00 02 54 10 + 39 00 00 00 00 00 02 53 11 + 39 00 00 00 00 00 02 52 12 + 39 00 00 00 00 00 02 51 13 + 39 00 00 00 00 00 02 50 14 + 39 00 00 00 00 00 02 4F 15 + 39 00 00 00 00 00 02 4E 16 + 39 00 00 00 00 00 02 4D 18 + 39 00 00 00 00 00 02 4C 1A + 39 00 00 00 00 00 02 4B 1C + 39 00 00 00 00 00 02 4A 1E + 39 00 00 00 00 00 02 49 20 + 39 00 00 00 00 00 02 48 20 + 39 00 00 00 00 00 02 47 21 + 39 00 00 00 00 00 02 46 23 + 39 00 00 00 00 00 02 45 24 + 39 00 00 00 00 00 02 44 26 + 39 00 00 00 00 00 02 43 27 + 39 00 00 00 00 00 02 42 29 + 39 00 00 00 00 00 02 41 2A + 39 00 00 00 00 00 02 40 2B + 39 00 00 00 00 00 02 3F 2D + 39 00 00 00 00 00 02 3E 2E + 39 00 00 00 00 00 02 3D 2F + 39 00 00 00 00 00 02 3C 30 + 39 00 00 00 00 00 02 3B 31 + 39 00 00 00 00 00 02 3A 32 + 39 00 00 00 00 00 02 39 34 + 39 00 00 00 00 00 02 38 35 + 39 00 00 00 00 00 02 37 35 + 39 00 00 00 00 00 02 36 37 + 39 00 00 00 00 00 02 35 39 + 39 00 00 00 00 00 02 34 3B + 39 00 00 00 00 00 02 33 3D + 39 00 00 00 00 00 02 32 3F + 39 00 00 00 00 00 02 31 41 + 39 00 00 00 00 00 02 30 43 + 39 00 00 00 00 00 02 2F 45 + 39 00 00 00 00 00 02 2E 45 + 39 00 00 00 00 00 02 2D 46 + 39 00 00 00 00 00 02 2C 47 + 39 00 00 00 00 00 02 2B 48 + 39 00 00 00 00 00 02 2A 49 + 39 00 00 00 00 00 02 29 4B + 39 00 00 00 00 00 02 28 4C + 39 00 00 00 00 00 02 27 4D + 39 00 00 00 00 00 02 26 4E + 39 00 00 00 00 00 02 25 4F + 39 00 00 00 00 00 02 24 50 + 39 00 00 00 00 00 02 23 51 + 39 00 00 00 00 00 02 22 53 + 39 00 00 00 00 00 02 21 55 + 39 00 00 00 00 00 02 20 56 + 39 00 00 00 00 00 02 1F A8 + 39 00 00 00 00 00 02 1E A7 + 39 00 00 00 00 00 02 1D A5 + 39 00 00 00 00 00 02 1C A4 + 39 00 00 00 00 00 02 1B A3 + 39 00 00 00 00 00 02 1A A2 + 39 00 00 00 00 00 02 19 A1 + 39 00 00 00 00 00 02 18 A0 + 39 00 00 00 00 00 02 17 9F + 39 00 00 00 00 00 02 16 9D + 39 00 00 00 00 00 02 15 9C + 39 00 00 00 00 00 02 14 9B + 39 00 00 00 00 00 02 13 9A + 39 00 00 00 00 00 02 12 98 + 39 00 00 00 00 00 02 11 97 + 39 00 00 00 00 00 02 10 95 + 39 00 00 00 00 00 02 0F 93 + 39 00 00 00 00 00 02 0E 92 + 39 00 00 00 00 00 02 0D 91 + 39 00 00 00 00 00 02 0C 90 + 39 00 00 00 00 00 02 0B 8E + 39 00 00 00 00 00 02 0A 8D + 39 00 00 00 00 00 02 09 8B + 39 00 00 00 00 00 02 08 8A + 39 00 00 00 00 00 02 07 89 + 39 00 00 00 00 00 02 06 89 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 02 + 39 00 00 00 00 00 02 7E 02 + 39 00 00 00 00 00 02 7D 02 + 39 00 00 00 00 00 02 7C 02 + 39 00 00 00 00 00 02 7B 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 76 03 + 39 00 00 00 00 00 02 75 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 69 05 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 67 05 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 65 05 + 39 00 00 00 00 00 02 64 05 + 39 00 00 00 00 00 02 63 05 + 39 00 00 00 00 00 02 62 05 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 5F 05 + 39 00 00 00 00 00 02 5E 05 + 39 00 00 00 00 00 02 5D 05 + 39 00 00 00 00 00 02 5C 05 + 39 00 00 00 00 00 02 5B 05 + 39 00 00 00 00 00 02 5A 05 + 39 00 00 00 00 00 02 59 05 + 39 00 00 00 00 00 02 58 05 + 39 00 00 00 00 00 02 57 05 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 51 04 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 4E 05 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 46 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 43 08 + 39 00 00 00 00 00 02 42 08 + 39 00 00 00 00 00 02 41 08 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 3F 08 + 39 00 00 00 00 00 02 3E 08 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 39 06 + 39 00 00 00 00 00 02 38 06 + 39 00 00 00 00 00 02 37 06 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2B 06 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 29 06 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 25 05 + 39 00 00 00 00 00 02 24 04 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 07 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 1E 08 + 39 00 00 00 00 00 02 1D 07 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1A 06 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 18 05 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 05 + 39 00 00 00 00 00 02 14 05 + 39 00 00 00 00 00 02 13 05 + 39 00 00 00 00 00 02 12 05 + 39 00 00 00 00 00 02 11 05 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 0F 04 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 04 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 04 02 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 00 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 5F + 39 00 00 00 00 00 02 D1 50 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 CE 4E + 39 00 00 00 00 00 02 CD 1B + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 85 + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1E + 39 00 00 00 00 00 02 C8 93 + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C2 2A + 39 00 00 00 00 00 02 C1 1B + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 60 + 39 00 00 00 00 00 02 B1 51 + 39 00 00 00 00 00 02 B0 26 + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AB 86 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1E + 39 00 00 00 00 00 02 A8 94 + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A3 13 + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 01 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F E0 + 39 00 00 00 00 00 02 7E DF + 39 00 00 00 00 00 02 7D DE + 39 00 00 00 00 00 02 7C DD + 39 00 00 00 00 00 02 7B DD + 39 00 00 00 00 00 02 7A DC + 39 00 00 00 00 00 02 79 DB + 39 00 00 00 00 00 02 78 DA + 39 00 00 00 00 00 02 77 DA + 39 00 00 00 00 00 02 76 D9 + 39 00 00 00 00 00 02 75 D8 + 39 00 00 00 00 00 02 74 D7 + 39 00 00 00 00 00 02 73 D7 + 39 00 00 00 00 00 02 72 D6 + 39 00 00 00 00 00 02 71 D5 + 39 00 00 00 00 00 02 70 D4 + 39 00 00 00 00 00 02 6F D4 + 39 00 00 00 00 00 02 6E D3 + 39 00 00 00 00 00 02 6D D2 + 39 00 00 00 00 00 02 6C D2 + 39 00 00 00 00 00 02 6B D1 + 39 00 00 00 00 00 02 6A D0 + 39 00 00 00 00 00 02 69 D0 + 39 00 00 00 00 00 02 68 CF + 39 00 00 00 00 00 02 67 CE + 39 00 00 00 00 00 02 66 CE + 39 00 00 00 00 00 02 65 CD + 39 00 00 00 00 00 02 64 CD + 39 00 00 00 00 00 02 63 CC + 39 00 00 00 00 00 02 62 CB + 39 00 00 00 00 00 02 61 CA + 39 00 00 00 00 00 02 60 C9 + 39 00 00 00 00 00 02 5F C8 + 39 00 00 00 00 00 02 5E C7 + 39 00 00 00 00 00 02 5D C6 + 39 00 00 00 00 00 02 5C C5 + 39 00 00 00 00 00 02 5B C4 + 39 00 00 00 00 00 02 5A C3 + 39 00 00 00 00 00 02 59 C1 + 39 00 00 00 00 00 02 58 C0 + 39 00 00 00 00 00 02 57 BF + 39 00 00 00 00 00 02 56 BE + 39 00 00 00 00 00 02 55 BE + 39 00 00 00 00 00 02 54 BD + 39 00 00 00 00 00 02 53 BC + 39 00 00 00 00 00 02 52 BC + 39 00 00 00 00 00 02 51 BB + 39 00 00 00 00 00 02 50 BA + 39 00 00 00 00 00 02 4F B9 + 39 00 00 00 00 00 02 4E B8 + 39 00 00 00 00 00 02 4D B8 + 39 00 00 00 00 00 02 4C B7 + 39 00 00 00 00 00 02 4B B7 + 39 00 00 00 00 00 02 4A B6 + 39 00 00 00 00 00 02 49 B6 + 39 00 00 00 00 00 02 48 B5 + 39 00 00 00 00 00 02 47 B4 + 39 00 00 00 00 00 02 46 B4 + 39 00 00 00 00 00 02 45 B4 + 39 00 00 00 00 00 02 44 B3 + 39 00 00 00 00 00 02 43 B3 + 39 00 00 00 00 00 02 42 B3 + 39 00 00 00 00 00 02 41 B2 + 39 00 00 00 00 00 02 40 B1 + 39 00 00 00 00 00 02 3F B0 + 39 00 00 00 00 00 02 3E AF + 39 00 00 00 00 00 02 3D AD + 39 00 00 00 00 00 02 3C AC + 39 00 00 00 00 00 02 3B AC + 39 00 00 00 00 00 02 3A AC + 39 00 00 00 00 00 02 39 AB + 39 00 00 00 00 00 02 38 AA + 39 00 00 00 00 00 02 37 A9 + 39 00 00 00 00 00 02 36 A8 + 39 00 00 00 00 00 02 35 A7 + 39 00 00 00 00 00 02 34 A6 + 39 00 00 00 00 00 02 33 A6 + 39 00 00 00 00 00 02 32 A5 + 39 00 00 00 00 00 02 31 A5 + 39 00 00 00 00 00 02 30 A4 + 39 00 00 00 00 00 02 2F A4 + 39 00 00 00 00 00 02 2E A3 + 39 00 00 00 00 00 02 2D A3 + 39 00 00 00 00 00 02 2C A2 + 39 00 00 00 00 00 02 2B A0 + 39 00 00 00 00 00 02 2A 9F + 39 00 00 00 00 00 02 29 9D + 39 00 00 00 00 00 02 28 9B + 39 00 00 00 00 00 02 27 9A + 39 00 00 00 00 00 02 26 99 + 39 00 00 00 00 00 02 25 9A + 39 00 00 00 00 00 02 24 99 + 39 00 00 00 00 00 02 23 99 + 39 00 00 00 00 00 02 22 98 + 39 00 00 00 00 00 02 21 98 + 39 00 00 00 00 00 02 20 97 + 39 00 00 00 00 00 02 1F 97 + 39 00 00 00 00 00 02 1E 96 + 39 00 00 00 00 00 02 1D 96 + 39 00 00 00 00 00 02 1C 95 + 39 00 00 00 00 00 02 1B 94 + 39 00 00 00 00 00 02 1A 92 + 39 00 00 00 00 00 02 19 91 + 39 00 00 00 00 00 02 18 90 + 39 00 00 00 00 00 02 17 90 + 39 00 00 00 00 00 02 16 90 + 39 00 00 00 00 00 02 15 90 + 39 00 00 00 00 00 02 14 8F + 39 00 00 00 00 00 02 13 8E + 39 00 00 00 00 00 02 12 8D + 39 00 00 00 00 00 02 11 8D + 39 00 00 00 00 00 02 10 8C + 39 00 00 00 00 00 02 0F 8C + 39 00 00 00 00 00 02 0E 8B + 39 00 00 00 00 00 02 0D 89 + 39 00 00 00 00 00 02 0C 88 + 39 00 00 00 00 00 02 0B 87 + 39 00 00 00 00 00 02 0A 87 + 39 00 00 00 00 00 02 09 86 + 39 00 00 00 00 00 02 08 85 + 39 00 00 00 00 00 02 07 85 + 39 00 00 00 00 00 02 06 84 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 82 + + + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + + + + + qcom,mdss-dsi-panel-eye-command03= [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 1B 04 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 38 07 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 51 02 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 55 03 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 74 02 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 01 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7C 00 + 39 00 00 00 00 00 02 7D 00 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7F 00 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0E 85 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 12 87 + 39 00 00 00 00 00 02 13 87 + 39 00 00 00 00 00 02 14 87 + 39 00 00 00 00 00 02 15 87 + 39 00 00 00 00 00 02 16 88 + 39 00 00 00 00 00 02 17 88 + 39 00 00 00 00 00 02 18 89 + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 1A 8A + 39 00 00 00 00 00 02 1B 8A + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1D 8A + 39 00 00 00 00 00 02 1E 8A + 39 00 00 00 00 00 02 1F 8A + 39 00 00 00 00 00 02 20 8A + 39 00 00 00 00 00 02 21 8A + 39 00 00 00 00 00 02 22 8B + 39 00 00 00 00 00 02 23 8B + 39 00 00 00 00 00 02 24 8C + 39 00 00 00 00 00 02 25 8C + 39 00 00 00 00 00 02 26 8D + 39 00 00 00 00 00 02 27 8E + 39 00 00 00 00 00 02 28 8D + 39 00 00 00 00 00 02 29 8B + 39 00 00 00 00 00 02 2A 8A + 39 00 00 00 00 00 02 2B 8B + 39 00 00 00 00 00 02 2C 8C + 39 00 00 00 00 00 02 2D 8D + 39 00 00 00 00 00 02 2E 8E + 39 00 00 00 00 00 02 2F 8E + 39 00 00 00 00 00 02 30 8E + 39 00 00 00 00 00 02 31 8F + 39 00 00 00 00 00 02 32 8F + 39 00 00 00 00 00 02 33 90 + 39 00 00 00 00 00 02 34 91 + 39 00 00 00 00 00 02 35 91 + 39 00 00 00 00 00 02 36 92 + 39 00 00 00 00 00 02 37 93 + 39 00 00 00 00 00 02 38 93 + 39 00 00 00 00 00 02 39 94 + 39 00 00 00 00 00 02 3A 94 + 39 00 00 00 00 00 02 3B 95 + 39 00 00 00 00 00 02 3C 95 + 39 00 00 00 00 00 02 3D 94 + 39 00 00 00 00 00 02 3E 93 + 39 00 00 00 00 00 02 3F 93 + 39 00 00 00 00 00 02 40 94 + 39 00 00 00 00 00 02 41 94 + 39 00 00 00 00 00 02 42 95 + 39 00 00 00 00 00 02 43 95 + 39 00 00 00 00 00 02 44 96 + 39 00 00 00 00 00 02 45 96 + 39 00 00 00 00 00 02 46 96 + 39 00 00 00 00 00 02 47 96 + 39 00 00 00 00 00 02 48 97 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 4A 98 + 39 00 00 00 00 00 02 4B 98 + 39 00 00 00 00 00 02 4C 99 + 39 00 00 00 00 00 02 4D 99 + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 51 9C + 39 00 00 00 00 00 02 52 9C + 39 00 00 00 00 00 02 53 9D + 39 00 00 00 00 00 02 54 9E + 39 00 00 00 00 00 02 55 9E + 39 00 00 00 00 00 02 56 9F + 39 00 00 00 00 00 02 57 9F + 39 00 00 00 00 00 02 58 A0 + 39 00 00 00 00 00 02 59 A1 + 39 00 00 00 00 00 02 5A A1 + 39 00 00 00 00 00 02 5B A1 + 39 00 00 00 00 00 02 5C A1 + 39 00 00 00 00 00 02 5D A2 + 39 00 00 00 00 00 02 5E A2 + 39 00 00 00 00 00 02 5F A2 + 39 00 00 00 00 00 02 60 A2 + 39 00 00 00 00 00 02 61 A2 + 39 00 00 00 00 00 02 62 A2 + 39 00 00 00 00 00 02 63 A3 + 39 00 00 00 00 00 02 64 A3 + 39 00 00 00 00 00 02 65 A3 + 39 00 00 00 00 00 02 66 A3 + 39 00 00 00 00 00 02 67 A3 + 39 00 00 00 00 00 02 68 A4 + 39 00 00 00 00 00 02 69 A4 + 39 00 00 00 00 00 02 6A A4 + 39 00 00 00 00 00 02 6B A5 + 39 00 00 00 00 00 02 6C A5 + 39 00 00 00 00 00 02 6D A5 + 39 00 00 00 00 00 02 6E A6 + 39 00 00 00 00 00 02 6F A6 + 39 00 00 00 00 00 02 70 A6 + 39 00 00 00 00 00 02 71 A6 + 39 00 00 00 00 00 02 72 A7 + 39 00 00 00 00 00 02 73 A7 + 39 00 00 00 00 00 02 74 A7 + 39 00 00 00 00 00 02 75 A8 + 39 00 00 00 00 00 02 76 A8 + 39 00 00 00 00 00 02 77 A8 + 39 00 00 00 00 00 02 78 A8 + 39 00 00 00 00 00 02 79 A9 + 39 00 00 00 00 00 02 7A A9 + 39 00 00 00 00 00 02 7B AA + 39 00 00 00 00 00 02 7C AA + 39 00 00 00 00 00 02 7D AA + 39 00 00 00 00 00 02 7E AB + 39 00 00 00 00 00 02 7F AC + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 08 84 + 39 00 00 00 00 00 02 09 85 + 39 00 00 00 00 00 02 0A 85 + 39 00 00 00 00 00 02 0B 86 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0D 87 + 39 00 00 00 00 00 02 0E 88 + 39 00 00 00 00 00 02 0F 88 + 39 00 00 00 00 00 02 10 89 + 39 00 00 00 00 00 02 11 89 + 39 00 00 00 00 00 02 12 8A + 39 00 00 00 00 00 02 13 8B + 39 00 00 00 00 00 02 14 8B + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 16 8C + 39 00 00 00 00 00 02 17 8D + 39 00 00 00 00 00 02 18 8D + 39 00 00 00 00 00 02 19 8E + 39 00 00 00 00 00 02 1A 8F + 39 00 00 00 00 00 02 1B 8F + 39 00 00 00 00 00 02 1C 90 + 39 00 00 00 00 00 02 1D 90 + 39 00 00 00 00 00 02 1E 90 + 39 00 00 00 00 00 02 1F 91 + 39 00 00 00 00 00 02 20 6F + 39 00 00 00 00 00 02 21 6F + 39 00 00 00 00 00 02 22 6E + 39 00 00 00 00 00 02 23 6E + 39 00 00 00 00 00 02 24 6E + 39 00 00 00 00 00 02 25 6D + 39 00 00 00 00 00 02 26 6C + 39 00 00 00 00 00 02 27 6B + 39 00 00 00 00 00 02 28 6B + 39 00 00 00 00 00 02 29 6A + 39 00 00 00 00 00 02 2A 6A + 39 00 00 00 00 00 02 2B 6B + 39 00 00 00 00 00 02 2C 6C + 39 00 00 00 00 00 02 2D 6C + 39 00 00 00 00 00 02 2E 6B + 39 00 00 00 00 00 02 2F 6A + 39 00 00 00 00 00 02 30 69 + 39 00 00 00 00 00 02 31 68 + 39 00 00 00 00 00 02 32 67 + 39 00 00 00 00 00 02 33 67 + 39 00 00 00 00 00 02 34 66 + 39 00 00 00 00 00 02 35 65 + 39 00 00 00 00 00 02 36 64 + 39 00 00 00 00 00 02 37 63 + 39 00 00 00 00 00 02 38 63 + 39 00 00 00 00 00 02 39 62 + 39 00 00 00 00 00 02 3A 61 + 39 00 00 00 00 00 02 3B 60 + 39 00 00 00 00 00 02 3C 5F + 39 00 00 00 00 00 02 3D 5E + 39 00 00 00 00 00 02 3E 5E + 39 00 00 00 00 00 02 3F 5E + 39 00 00 00 00 00 02 40 5E + 39 00 00 00 00 00 02 41 5F + 39 00 00 00 00 00 02 42 5F + 39 00 00 00 00 00 02 43 5E + 39 00 00 00 00 00 02 44 5D + 39 00 00 00 00 00 02 45 5D + 39 00 00 00 00 00 02 46 5C + 39 00 00 00 00 00 02 47 5B + 39 00 00 00 00 00 02 48 5B + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 4A 5A + 39 00 00 00 00 00 02 4B 59 + 39 00 00 00 00 00 02 4C 59 + 39 00 00 00 00 00 02 4D 58 + 39 00 00 00 00 00 02 4E 57 + 39 00 00 00 00 00 02 4F 57 + 39 00 00 00 00 00 02 50 56 + 39 00 00 00 00 00 02 51 55 + 39 00 00 00 00 00 02 52 55 + 39 00 00 00 00 00 02 53 54 + 39 00 00 00 00 00 02 54 53 + 39 00 00 00 00 00 02 55 52 + 39 00 00 00 00 00 02 56 51 + 39 00 00 00 00 00 02 57 51 + 39 00 00 00 00 00 02 58 50 + 39 00 00 00 00 00 02 59 4F + 39 00 00 00 00 00 02 5A 4E + 39 00 00 00 00 00 02 5B 4D + 39 00 00 00 00 00 02 5C 4C + 39 00 00 00 00 00 02 5D 4B + 39 00 00 00 00 00 02 5E 4A + 39 00 00 00 00 00 02 5F 4A + 39 00 00 00 00 00 02 60 49 + 39 00 00 00 00 00 02 61 49 + 39 00 00 00 00 00 02 62 49 + 39 00 00 00 00 00 02 63 48 + 39 00 00 00 00 00 02 64 48 + 39 00 00 00 00 00 02 65 48 + 39 00 00 00 00 00 02 66 47 + 39 00 00 00 00 00 02 67 47 + 39 00 00 00 00 00 02 68 46 + 39 00 00 00 00 00 02 69 46 + 39 00 00 00 00 00 02 6A 45 + 39 00 00 00 00 00 02 6B 45 + 39 00 00 00 00 00 02 6C 44 + 39 00 00 00 00 00 02 6D 44 + 39 00 00 00 00 00 02 6E 43 + 39 00 00 00 00 00 02 6F 43 + 39 00 00 00 00 00 02 70 42 + 39 00 00 00 00 00 02 71 42 + 39 00 00 00 00 00 02 72 41 + 39 00 00 00 00 00 02 73 41 + 39 00 00 00 00 00 02 74 40 + 39 00 00 00 00 00 02 75 40 + 39 00 00 00 00 00 02 76 3F + 39 00 00 00 00 00 02 77 3F + 39 00 00 00 00 00 02 78 3E + 39 00 00 00 00 00 02 79 3E + 39 00 00 00 00 00 02 7A 3D + 39 00 00 00 00 00 02 7B 3C + 39 00 00 00 00 00 02 7C 3C + 39 00 00 00 00 00 02 7D 3B + 39 00 00 00 00 00 02 7E 3B + 39 00 00 00 00 00 02 7F 3A + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 81 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 25 85 + 39 00 00 00 00 00 02 26 85 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 88 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 44 88 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4D 86 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 50 87 + 39 00 00 00 00 00 02 51 87 + 39 00 00 00 00 00 02 52 87 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 58 87 + 39 00 00 00 00 00 02 59 87 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5C 85 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5F 86 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 62 87 + 39 00 00 00 00 00 02 63 87 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 65 86 + 39 00 00 00 00 00 02 66 86 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 68 85 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 6A 86 + 39 00 00 00 00 00 02 6B 86 + 39 00 00 00 00 00 02 6C 87 + 39 00 00 00 00 00 02 6D 87 + 39 00 00 00 00 00 02 6E 87 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 72 86 + 39 00 00 00 00 00 02 73 86 + 39 00 00 00 00 00 02 74 86 + 39 00 00 00 00 00 02 75 86 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 77 85 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 7A 85 + 39 00 00 00 00 00 02 7B 85 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7E 86 + 39 00 00 00 00 00 02 7F 85 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 AD + 39 00 00 00 00 00 02 02 AE + 39 00 00 00 00 00 02 03 AE + 39 00 00 00 00 00 02 04 AF + 39 00 00 00 00 00 02 05 AF + 39 00 00 00 00 00 02 06 B0 + 39 00 00 00 00 00 02 07 B0 + 39 00 00 00 00 00 02 08 B1 + 39 00 00 00 00 00 02 09 B1 + 39 00 00 00 00 00 02 0A B2 + 39 00 00 00 00 00 02 0B B2 + 39 00 00 00 00 00 02 0C B3 + 39 00 00 00 00 00 02 0D B3 + 39 00 00 00 00 00 02 0E B4 + 39 00 00 00 00 00 02 0F B4 + 39 00 00 00 00 00 02 10 B4 + 39 00 00 00 00 00 02 11 B4 + 39 00 00 00 00 00 02 12 B5 + 39 00 00 00 00 00 02 13 B5 + 39 00 00 00 00 00 02 14 B6 + 39 00 00 00 00 00 02 15 B6 + 39 00 00 00 00 00 02 16 B6 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 18 B7 + 39 00 00 00 00 00 02 19 B7 + 39 00 00 00 00 00 02 1A B8 + 39 00 00 00 00 00 02 1B B8 + 39 00 00 00 00 00 02 1C B8 + 39 00 00 00 00 00 02 1D B8 + 39 00 00 00 00 00 02 1E B8 + 39 00 00 00 00 00 02 1F B8 + 39 00 00 00 00 00 02 20 B9 + 39 00 00 00 00 00 02 21 BA + 39 00 00 00 00 00 02 22 BA + 39 00 00 00 00 00 02 23 BB + 39 00 00 00 00 00 02 24 BC + 39 00 00 00 00 00 02 25 BC + 39 00 00 00 00 00 02 26 BD + 39 00 00 00 00 00 02 27 BD + 39 00 00 00 00 00 02 28 BE + 39 00 00 00 00 00 02 29 BE + 39 00 00 00 00 00 02 2A BF + 39 00 00 00 00 00 02 2B BF + 39 00 00 00 00 00 02 2C BF + 39 00 00 00 00 00 02 2D C0 + 39 00 00 00 00 00 02 2E C0 + 39 00 00 00 00 00 02 2F C0 + 39 00 00 00 00 00 02 30 C1 + 39 00 00 00 00 00 02 31 C1 + 39 00 00 00 00 00 02 32 C1 + 39 00 00 00 00 00 02 33 C1 + 39 00 00 00 00 00 02 34 C2 + 39 00 00 00 00 00 02 35 C3 + 39 00 00 00 00 00 02 36 C2 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 38 C2 + 39 00 00 00 00 00 02 39 C2 + 39 00 00 00 00 00 02 3A C2 + 39 00 00 00 00 00 02 3B C3 + 39 00 00 00 00 00 02 3C C3 + 39 00 00 00 00 00 02 3D C3 + 39 00 00 00 00 00 02 3E C3 + 39 00 00 00 00 00 02 3F C2 + 39 00 00 00 00 00 02 40 C3 + 39 00 00 00 00 00 02 41 C4 + 39 00 00 00 00 00 02 42 C4 + 39 00 00 00 00 00 02 43 C5 + 39 00 00 00 00 00 02 44 C6 + 39 00 00 00 00 00 02 45 C7 + 39 00 00 00 00 00 02 46 C7 + 39 00 00 00 00 00 02 47 C8 + 39 00 00 00 00 00 02 48 C9 + 39 00 00 00 00 00 02 49 CA + 39 00 00 00 00 00 02 4A CA + 39 00 00 00 00 00 02 4B CB + 39 00 00 00 00 00 02 4C CC + 39 00 00 00 00 00 02 4D CC + 39 00 00 00 00 00 02 4E CC + 39 00 00 00 00 00 02 4F CD + 39 00 00 00 00 00 02 50 CD + 39 00 00 00 00 00 02 51 CE + 39 00 00 00 00 00 02 52 CE + 39 00 00 00 00 00 02 53 CE + 39 00 00 00 00 00 02 54 CF + 39 00 00 00 00 00 02 55 CF + 39 00 00 00 00 00 02 56 CF + 39 00 00 00 00 00 02 57 CF + 39 00 00 00 00 00 02 58 CF + 39 00 00 00 00 00 02 59 CF + 39 00 00 00 00 00 02 5A CF + 39 00 00 00 00 00 02 5B CF + 39 00 00 00 00 00 02 5C CF + 39 00 00 00 00 00 02 5D CF + 39 00 00 00 00 00 02 5E CF + 39 00 00 00 00 00 02 5F CF + 39 00 00 00 00 00 02 60 CF + 39 00 00 00 00 00 02 61 D0 + 39 00 00 00 00 00 02 62 D1 + 39 00 00 00 00 00 02 63 D1 + 39 00 00 00 00 00 02 64 D2 + 39 00 00 00 00 00 02 65 D2 + 39 00 00 00 00 00 02 66 D3 + 39 00 00 00 00 00 02 67 D3 + 39 00 00 00 00 00 02 68 D3 + 39 00 00 00 00 00 02 69 D3 + 39 00 00 00 00 00 02 6A D4 + 39 00 00 00 00 00 02 6B D4 + 39 00 00 00 00 00 02 6C D4 + 39 00 00 00 00 00 02 6D D4 + 39 00 00 00 00 00 02 6E D4 + 39 00 00 00 00 00 02 6F D3 + 39 00 00 00 00 00 02 70 D4 + 39 00 00 00 00 00 02 71 D4 + 39 00 00 00 00 00 02 72 D5 + 39 00 00 00 00 00 02 73 D5 + 39 00 00 00 00 00 02 74 D6 + 39 00 00 00 00 00 02 75 D6 + 39 00 00 00 00 00 02 76 D7 + 39 00 00 00 00 00 02 77 D7 + 39 00 00 00 00 00 02 78 D7 + 39 00 00 00 00 00 02 79 D8 + 39 00 00 00 00 00 02 7A D8 + 39 00 00 00 00 00 02 7B D8 + 39 00 00 00 00 00 02 7C D8 + 39 00 00 00 00 00 02 7D D8 + 39 00 00 00 00 00 02 7E D8 + 39 00 00 00 00 00 02 7F D9 + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 39 + 39 00 00 00 00 00 02 02 38 + 39 00 00 00 00 00 02 03 38 + 39 00 00 00 00 00 02 04 38 + 39 00 00 00 00 00 02 05 36 + 39 00 00 00 00 00 02 06 35 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 08 34 + 39 00 00 00 00 00 02 09 33 + 39 00 00 00 00 00 02 0A 32 + 39 00 00 00 00 00 02 0B 31 + 39 00 00 00 00 00 02 0C 30 + 39 00 00 00 00 00 02 0D 30 + 39 00 00 00 00 00 02 0E 2F + 39 00 00 00 00 00 02 0F 2E + 39 00 00 00 00 00 02 10 2D + 39 00 00 00 00 00 02 11 2D + 39 00 00 00 00 00 02 12 2C + 39 00 00 00 00 00 02 13 2B + 39 00 00 00 00 00 02 14 2A + 39 00 00 00 00 00 02 15 2A + 39 00 00 00 00 00 02 16 29 + 39 00 00 00 00 00 02 17 28 + 39 00 00 00 00 00 02 18 28 + 39 00 00 00 00 00 02 19 27 + 39 00 00 00 00 00 02 1A 26 + 39 00 00 00 00 00 02 1B 26 + 39 00 00 00 00 00 02 1C 25 + 39 00 00 00 00 00 02 1D 25 + 39 00 00 00 00 00 02 1E 24 + 39 00 00 00 00 00 02 1F 23 + 39 00 00 00 00 00 02 20 23 + 39 00 00 00 00 00 02 21 22 + 39 00 00 00 00 00 02 22 21 + 39 00 00 00 00 00 02 23 21 + 39 00 00 00 00 00 02 24 20 + 39 00 00 00 00 00 02 25 20 + 39 00 00 00 00 00 02 26 20 + 39 00 00 00 00 00 02 27 1F + 39 00 00 00 00 00 02 28 1F + 39 00 00 00 00 00 02 29 1E + 39 00 00 00 00 00 02 2A 1D + 39 00 00 00 00 00 02 2B 1C + 39 00 00 00 00 00 02 2C 1B + 39 00 00 00 00 00 02 2D 1A + 39 00 00 00 00 00 02 2E 1A + 39 00 00 00 00 00 02 2F 19 + 39 00 00 00 00 00 02 30 18 + 39 00 00 00 00 00 02 31 17 + 39 00 00 00 00 00 02 32 16 + 39 00 00 00 00 00 02 33 16 + 39 00 00 00 00 00 02 34 15 + 39 00 00 00 00 00 02 35 14 + 39 00 00 00 00 00 02 36 13 + 39 00 00 00 00 00 02 37 13 + 39 00 00 00 00 00 02 38 12 + 39 00 00 00 00 00 02 39 11 + 39 00 00 00 00 00 02 3A 11 + 39 00 00 00 00 00 02 3B 10 + 39 00 00 00 00 00 02 3C 0F + 39 00 00 00 00 00 02 3D 0F + 39 00 00 00 00 00 02 3E 0E + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 40 0D + 39 00 00 00 00 00 02 41 0C + 39 00 00 00 00 00 02 42 0B + 39 00 00 00 00 00 02 43 0B + 39 00 00 00 00 00 02 44 0B + 39 00 00 00 00 00 02 45 0B + 39 00 00 00 00 00 02 46 0A + 39 00 00 00 00 00 02 47 0A + 39 00 00 00 00 00 02 48 09 + 39 00 00 00 00 00 02 49 09 + 39 00 00 00 00 00 02 4A 09 + 39 00 00 00 00 00 02 4B 08 + 39 00 00 00 00 00 02 4C 08 + 39 00 00 00 00 00 02 4D 08 + 39 00 00 00 00 00 02 4E 07 + 39 00 00 00 00 00 02 4F 05 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 53 01 + 39 00 00 00 00 00 02 54 00 + 39 00 00 00 00 00 02 55 81 + 39 00 00 00 00 00 02 56 82 + 39 00 00 00 00 00 02 57 83 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 5B 87 + 39 00 00 00 00 00 02 5C 88 + 39 00 00 00 00 00 02 5D 88 + 39 00 00 00 00 00 02 5E 89 + 39 00 00 00 00 00 02 5F 8A + 39 00 00 00 00 00 02 60 8B + 39 00 00 00 00 00 02 61 8B + 39 00 00 00 00 00 02 62 8C + 39 00 00 00 00 00 02 63 8D + 39 00 00 00 00 00 02 64 8E + 39 00 00 00 00 00 02 65 8E + 39 00 00 00 00 00 02 66 8F + 39 00 00 00 00 00 02 67 8F + 39 00 00 00 00 00 02 68 90 + 39 00 00 00 00 00 02 69 90 + 39 00 00 00 00 00 02 6A 91 + 39 00 00 00 00 00 02 6B 91 + 39 00 00 00 00 00 02 6C 91 + 39 00 00 00 00 00 02 6D 92 + 39 00 00 00 00 00 02 6E 92 + 39 00 00 00 00 00 02 6F 92 + 39 00 00 00 00 00 02 70 93 + 39 00 00 00 00 00 02 71 94 + 39 00 00 00 00 00 02 72 95 + 39 00 00 00 00 00 02 73 96 + 39 00 00 00 00 00 02 74 97 + 39 00 00 00 00 00 02 75 98 + 39 00 00 00 00 00 02 76 99 + 39 00 00 00 00 00 02 77 9A + 39 00 00 00 00 00 02 78 9B + 39 00 00 00 00 00 02 79 9B + 39 00 00 00 00 00 02 7A 9C + 39 00 00 00 00 00 02 7B 9D + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7D 9E + 39 00 00 00 00 00 02 7E 9F + 39 00 00 00 00 00 02 7F 9F + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F AC + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 AC + 39 00 00 00 00 00 02 7F D9 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 3A + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 3a + 39 00 00 00 00 00 02 7F 9F + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F 9F + 39 00 00 00 00 00 02 7E 9F + 39 00 00 00 00 00 02 7D 9E + 39 00 00 00 00 00 02 7C 9E + 39 00 00 00 00 00 02 7B 9D + 39 00 00 00 00 00 02 7A 9C + 39 00 00 00 00 00 02 79 9B + 39 00 00 00 00 00 02 78 9B + 39 00 00 00 00 00 02 77 9A + 39 00 00 00 00 00 02 76 99 + 39 00 00 00 00 00 02 75 98 + 39 00 00 00 00 00 02 74 97 + 39 00 00 00 00 00 02 73 96 + 39 00 00 00 00 00 02 72 95 + 39 00 00 00 00 00 02 71 94 + 39 00 00 00 00 00 02 70 93 + 39 00 00 00 00 00 02 6F 92 + 39 00 00 00 00 00 02 6E 92 + 39 00 00 00 00 00 02 6D 92 + 39 00 00 00 00 00 02 6C 91 + 39 00 00 00 00 00 02 6B 91 + 39 00 00 00 00 00 02 6A 91 + 39 00 00 00 00 00 02 69 90 + 39 00 00 00 00 00 02 68 90 + 39 00 00 00 00 00 02 67 8F + 39 00 00 00 00 00 02 66 8F + 39 00 00 00 00 00 02 65 8E + 39 00 00 00 00 00 02 64 8E + 39 00 00 00 00 00 02 63 8D + 39 00 00 00 00 00 02 62 8C + 39 00 00 00 00 00 02 61 8B + 39 00 00 00 00 00 02 60 8B + 39 00 00 00 00 00 02 5F 8A + 39 00 00 00 00 00 02 5E 89 + 39 00 00 00 00 00 02 5D 88 + 39 00 00 00 00 00 02 5C 88 + 39 00 00 00 00 00 02 5B 87 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 58 84 + 39 00 00 00 00 00 02 57 83 + 39 00 00 00 00 00 02 56 82 + 39 00 00 00 00 00 02 55 81 + 39 00 00 00 00 00 02 54 00 + 39 00 00 00 00 00 02 53 01 + 39 00 00 00 00 00 02 52 02 + 39 00 00 00 00 00 02 51 03 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 4F 05 + 39 00 00 00 00 00 02 4E 07 + 39 00 00 00 00 00 02 4D 08 + 39 00 00 00 00 00 02 4C 08 + 39 00 00 00 00 00 02 4B 08 + 39 00 00 00 00 00 02 4A 09 + 39 00 00 00 00 00 02 49 09 + 39 00 00 00 00 00 02 48 09 + 39 00 00 00 00 00 02 47 0A + 39 00 00 00 00 00 02 46 0A + 39 00 00 00 00 00 02 45 0B + 39 00 00 00 00 00 02 44 0B + 39 00 00 00 00 00 02 43 0B + 39 00 00 00 00 00 02 42 0B + 39 00 00 00 00 00 02 41 0C + 39 00 00 00 00 00 02 40 0D + 39 00 00 00 00 00 02 3F 0E + 39 00 00 00 00 00 02 3E 0E + 39 00 00 00 00 00 02 3D 0F + 39 00 00 00 00 00 02 3C 0F + 39 00 00 00 00 00 02 3B 10 + 39 00 00 00 00 00 02 3A 11 + 39 00 00 00 00 00 02 39 11 + 39 00 00 00 00 00 02 38 12 + 39 00 00 00 00 00 02 37 13 + 39 00 00 00 00 00 02 36 13 + 39 00 00 00 00 00 02 35 14 + 39 00 00 00 00 00 02 34 15 + 39 00 00 00 00 00 02 33 16 + 39 00 00 00 00 00 02 32 16 + 39 00 00 00 00 00 02 31 17 + 39 00 00 00 00 00 02 30 18 + 39 00 00 00 00 00 02 2F 19 + 39 00 00 00 00 00 02 2E 1A + 39 00 00 00 00 00 02 2D 1A + 39 00 00 00 00 00 02 2C 1B + 39 00 00 00 00 00 02 2B 1C + 39 00 00 00 00 00 02 2A 1D + 39 00 00 00 00 00 02 29 1E + 39 00 00 00 00 00 02 28 1F + 39 00 00 00 00 00 02 27 1F + 39 00 00 00 00 00 02 26 20 + 39 00 00 00 00 00 02 25 20 + 39 00 00 00 00 00 02 24 20 + 39 00 00 00 00 00 02 23 21 + 39 00 00 00 00 00 02 22 21 + 39 00 00 00 00 00 02 21 22 + 39 00 00 00 00 00 02 20 23 + 39 00 00 00 00 00 02 1F 23 + 39 00 00 00 00 00 02 1E 24 + 39 00 00 00 00 00 02 1D 25 + 39 00 00 00 00 00 02 1C 25 + 39 00 00 00 00 00 02 1B 26 + 39 00 00 00 00 00 02 1A 26 + 39 00 00 00 00 00 02 19 27 + 39 00 00 00 00 00 02 18 28 + 39 00 00 00 00 00 02 17 28 + 39 00 00 00 00 00 02 16 29 + 39 00 00 00 00 00 02 15 2A + 39 00 00 00 00 00 02 14 2A + 39 00 00 00 00 00 02 13 2B + 39 00 00 00 00 00 02 12 2C + 39 00 00 00 00 00 02 11 2D + 39 00 00 00 00 00 02 10 2D + 39 00 00 00 00 00 02 0F 2E + 39 00 00 00 00 00 02 0E 2F + 39 00 00 00 00 00 02 0D 30 + 39 00 00 00 00 00 02 0C 30 + 39 00 00 00 00 00 02 0B 31 + 39 00 00 00 00 00 02 0A 32 + 39 00 00 00 00 00 02 09 33 + 39 00 00 00 00 00 02 08 34 + 39 00 00 00 00 00 02 07 34 + 39 00 00 00 00 00 02 06 35 + 39 00 00 00 00 00 02 05 36 + 39 00 00 00 00 00 02 04 38 + 39 00 00 00 00 00 02 03 38 + 39 00 00 00 00 00 02 02 38 + 39 00 00 00 00 00 02 01 39 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 02 7E 86 + 39 00 00 00 00 00 02 7D 85 + 39 00 00 00 00 00 02 7C 84 + 39 00 00 00 00 00 02 7B 85 + 39 00 00 00 00 00 02 7A 85 + 39 00 00 00 00 00 02 79 85 + 39 00 00 00 00 00 02 78 84 + 39 00 00 00 00 00 02 77 85 + 39 00 00 00 00 00 02 76 85 + 39 00 00 00 00 00 02 75 86 + 39 00 00 00 00 00 02 74 86 + 39 00 00 00 00 00 02 73 86 + 39 00 00 00 00 00 02 72 86 + 39 00 00 00 00 00 02 71 86 + 39 00 00 00 00 00 02 70 86 + 39 00 00 00 00 00 02 6F 86 + 39 00 00 00 00 00 02 6E 87 + 39 00 00 00 00 00 02 6D 87 + 39 00 00 00 00 00 02 6C 87 + 39 00 00 00 00 00 02 6B 86 + 39 00 00 00 00 00 02 6A 86 + 39 00 00 00 00 00 02 69 85 + 39 00 00 00 00 00 02 68 85 + 39 00 00 00 00 00 02 67 86 + 39 00 00 00 00 00 02 66 86 + 39 00 00 00 00 00 02 65 86 + 39 00 00 00 00 00 02 64 86 + 39 00 00 00 00 00 02 63 87 + 39 00 00 00 00 00 02 62 87 + 39 00 00 00 00 00 02 61 87 + 39 00 00 00 00 00 02 60 86 + 39 00 00 00 00 00 02 5F 86 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5D 85 + 39 00 00 00 00 00 02 5C 85 + 39 00 00 00 00 00 02 5B 86 + 39 00 00 00 00 00 02 5A 86 + 39 00 00 00 00 00 02 59 87 + 39 00 00 00 00 00 02 58 87 + 39 00 00 00 00 00 02 57 87 + 39 00 00 00 00 00 02 56 87 + 39 00 00 00 00 00 02 55 87 + 39 00 00 00 00 00 02 54 87 + 39 00 00 00 00 00 02 53 87 + 39 00 00 00 00 00 02 52 87 + 39 00 00 00 00 00 02 51 87 + 39 00 00 00 00 00 02 50 87 + 39 00 00 00 00 00 02 4F 86 + 39 00 00 00 00 00 02 4E 86 + 39 00 00 00 00 00 02 4D 86 + 39 00 00 00 00 00 02 4C 85 + 39 00 00 00 00 00 02 4B 86 + 39 00 00 00 00 00 02 4A 86 + 39 00 00 00 00 00 02 49 87 + 39 00 00 00 00 00 02 48 87 + 39 00 00 00 00 00 02 47 87 + 39 00 00 00 00 00 02 46 88 + 39 00 00 00 00 00 02 45 88 + 39 00 00 00 00 00 02 44 88 + 39 00 00 00 00 00 02 43 88 + 39 00 00 00 00 00 02 42 88 + 39 00 00 00 00 00 02 41 88 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 3F 88 + 39 00 00 00 00 00 02 3E 88 + 39 00 00 00 00 00 02 3D 88 + 39 00 00 00 00 00 02 3C 88 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 39 87 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 84 + 39 00 00 00 00 00 02 27 84 + 39 00 00 00 00 00 02 26 85 + 39 00 00 00 00 00 02 25 85 + 39 00 00 00 00 00 02 24 84 + 39 00 00 00 00 00 02 23 84 + 39 00 00 00 00 00 02 22 84 + 39 00 00 00 00 00 02 21 84 + 39 00 00 00 00 00 02 20 85 + 39 00 00 00 00 00 02 1F 84 + 39 00 00 00 00 00 02 1E 84 + 39 00 00 00 00 00 02 1D 84 + 39 00 00 00 00 00 02 1C 84 + 39 00 00 00 00 00 02 1B 84 + 39 00 00 00 00 00 02 1A 84 + 39 00 00 00 00 00 02 19 84 + 39 00 00 00 00 00 02 18 83 + 39 00 00 00 00 00 02 17 83 + 39 00 00 00 00 00 02 16 83 + 39 00 00 00 00 00 02 15 82 + 39 00 00 00 00 00 02 14 82 + 39 00 00 00 00 00 02 13 82 + 39 00 00 00 00 00 02 12 81 + 39 00 00 00 00 00 02 11 81 + 39 00 00 00 00 00 02 10 81 + 39 00 00 00 00 00 02 0F 81 + 39 00 00 00 00 00 02 0E 81 + 39 00 00 00 00 00 02 0D 81 + 39 00 00 00 00 00 02 0C 81 + 39 00 00 00 00 00 02 0B 81 + 39 00 00 00 00 00 02 0A 81 + 39 00 00 00 00 00 02 09 81 + 39 00 00 00 00 00 02 08 81 + 39 00 00 00 00 00 02 07 81 + 39 00 00 00 00 00 02 06 81 + 39 00 00 00 00 00 02 05 81 + 39 00 00 00 00 00 02 04 81 + 39 00 00 00 00 00 02 03 81 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 81 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F D9 + 39 00 00 00 00 00 02 7E D8 + 39 00 00 00 00 00 02 7D D8 + 39 00 00 00 00 00 02 7C D8 + 39 00 00 00 00 00 02 7B D8 + 39 00 00 00 00 00 02 7A D8 + 39 00 00 00 00 00 02 79 D8 + 39 00 00 00 00 00 02 78 D7 + 39 00 00 00 00 00 02 77 D7 + 39 00 00 00 00 00 02 76 D7 + 39 00 00 00 00 00 02 75 D6 + 39 00 00 00 00 00 02 74 D6 + 39 00 00 00 00 00 02 73 D5 + 39 00 00 00 00 00 02 72 D5 + 39 00 00 00 00 00 02 71 D4 + 39 00 00 00 00 00 02 70 D4 + 39 00 00 00 00 00 02 6F D3 + 39 00 00 00 00 00 02 6E D4 + 39 00 00 00 00 00 02 6D D4 + 39 00 00 00 00 00 02 6C D4 + 39 00 00 00 00 00 02 6B D4 + 39 00 00 00 00 00 02 6A D4 + 39 00 00 00 00 00 02 69 D3 + 39 00 00 00 00 00 02 68 D3 + 39 00 00 00 00 00 02 67 D3 + 39 00 00 00 00 00 02 66 D3 + 39 00 00 00 00 00 02 65 D2 + 39 00 00 00 00 00 02 64 D2 + 39 00 00 00 00 00 02 63 D1 + 39 00 00 00 00 00 02 62 D1 + 39 00 00 00 00 00 02 61 D0 + 39 00 00 00 00 00 02 60 CF + 39 00 00 00 00 00 02 5F CF + 39 00 00 00 00 00 02 5E CF + 39 00 00 00 00 00 02 5D CF + 39 00 00 00 00 00 02 5C CF + 39 00 00 00 00 00 02 5B CF + 39 00 00 00 00 00 02 5A CF + 39 00 00 00 00 00 02 59 CF + 39 00 00 00 00 00 02 58 CF + 39 00 00 00 00 00 02 57 CF + 39 00 00 00 00 00 02 56 CF + 39 00 00 00 00 00 02 55 CF + 39 00 00 00 00 00 02 54 CF + 39 00 00 00 00 00 02 53 CE + 39 00 00 00 00 00 02 52 CE + 39 00 00 00 00 00 02 51 CE + 39 00 00 00 00 00 02 50 CD + 39 00 00 00 00 00 02 4F CD + 39 00 00 00 00 00 02 4E CC + 39 00 00 00 00 00 02 4D CC + 39 00 00 00 00 00 02 4C CC + 39 00 00 00 00 00 02 4B CB + 39 00 00 00 00 00 02 4A CA + 39 00 00 00 00 00 02 49 CA + 39 00 00 00 00 00 02 48 C9 + 39 00 00 00 00 00 02 47 C8 + 39 00 00 00 00 00 02 46 C7 + 39 00 00 00 00 00 02 45 C7 + 39 00 00 00 00 00 02 44 C6 + 39 00 00 00 00 00 02 43 C5 + 39 00 00 00 00 00 02 42 C4 + 39 00 00 00 00 00 02 41 C4 + 39 00 00 00 00 00 02 40 C3 + 39 00 00 00 00 00 02 3F C2 + 39 00 00 00 00 00 02 3E C3 + 39 00 00 00 00 00 02 3D C3 + 39 00 00 00 00 00 02 3C C3 + 39 00 00 00 00 00 02 3B C3 + 39 00 00 00 00 00 02 3A C2 + 39 00 00 00 00 00 02 39 C2 + 39 00 00 00 00 00 02 38 C2 + 39 00 00 00 00 00 02 37 C2 + 39 00 00 00 00 00 02 36 C2 + 39 00 00 00 00 00 02 35 C3 + 39 00 00 00 00 00 02 34 C2 + 39 00 00 00 00 00 02 33 C1 + 39 00 00 00 00 00 02 32 C1 + 39 00 00 00 00 00 02 31 C1 + 39 00 00 00 00 00 02 30 C1 + 39 00 00 00 00 00 02 2F C0 + 39 00 00 00 00 00 02 2E C0 + 39 00 00 00 00 00 02 2D C0 + 39 00 00 00 00 00 02 2C BF + 39 00 00 00 00 00 02 2B BF + 39 00 00 00 00 00 02 2A BF + 39 00 00 00 00 00 02 29 BE + 39 00 00 00 00 00 02 28 BE + 39 00 00 00 00 00 02 27 BD + 39 00 00 00 00 00 02 26 BD + 39 00 00 00 00 00 02 25 BC + 39 00 00 00 00 00 02 24 BC + 39 00 00 00 00 00 02 23 BB + 39 00 00 00 00 00 02 22 BA + 39 00 00 00 00 00 02 21 BA + 39 00 00 00 00 00 02 20 B9 + 39 00 00 00 00 00 02 1F B8 + 39 00 00 00 00 00 02 1E B8 + 39 00 00 00 00 00 02 1D B8 + 39 00 00 00 00 00 02 1C B8 + 39 00 00 00 00 00 02 1B B8 + 39 00 00 00 00 00 02 1A B8 + 39 00 00 00 00 00 02 19 B7 + 39 00 00 00 00 00 02 18 B7 + 39 00 00 00 00 00 02 17 B7 + 39 00 00 00 00 00 02 16 B6 + 39 00 00 00 00 00 02 15 B6 + 39 00 00 00 00 00 02 14 B6 + 39 00 00 00 00 00 02 13 B5 + 39 00 00 00 00 00 02 12 B5 + 39 00 00 00 00 00 02 11 B4 + 39 00 00 00 00 00 02 10 B4 + 39 00 00 00 00 00 02 0F B4 + 39 00 00 00 00 00 02 0E B4 + 39 00 00 00 00 00 02 0D B3 + 39 00 00 00 00 00 02 0C B3 + 39 00 00 00 00 00 02 0B B2 + 39 00 00 00 00 00 02 0A B2 + 39 00 00 00 00 00 02 09 B1 + 39 00 00 00 00 00 02 08 B1 + 39 00 00 00 00 00 02 07 B0 + 39 00 00 00 00 00 02 06 B0 + 39 00 00 00 00 00 02 05 AF + 39 00 00 00 00 00 02 04 AF + 39 00 00 00 00 00 02 03 AE + 39 00 00 00 00 00 02 02 AE + 39 00 00 00 00 00 02 01 AD + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 85 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F AC + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 AC + 39 00 00 00 00 00 02 7F D9 + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 3A + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 3a + 39 00 00 00 00 00 02 7F 9F + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F 3A + 39 00 00 00 00 00 02 7E 3B + 39 00 00 00 00 00 02 7D 3B + 39 00 00 00 00 00 02 7C 3C + 39 00 00 00 00 00 02 7B 3C + 39 00 00 00 00 00 02 7A 3D + 39 00 00 00 00 00 02 79 3E + 39 00 00 00 00 00 02 78 3E + 39 00 00 00 00 00 02 77 3F + 39 00 00 00 00 00 02 76 3F + 39 00 00 00 00 00 02 75 40 + 39 00 00 00 00 00 02 74 40 + 39 00 00 00 00 00 02 73 41 + 39 00 00 00 00 00 02 72 41 + 39 00 00 00 00 00 02 71 42 + 39 00 00 00 00 00 02 70 42 + 39 00 00 00 00 00 02 6F 43 + 39 00 00 00 00 00 02 6E 43 + 39 00 00 00 00 00 02 6D 44 + 39 00 00 00 00 00 02 6C 44 + 39 00 00 00 00 00 02 6B 45 + 39 00 00 00 00 00 02 6A 45 + 39 00 00 00 00 00 02 69 46 + 39 00 00 00 00 00 02 68 46 + 39 00 00 00 00 00 02 67 47 + 39 00 00 00 00 00 02 66 47 + 39 00 00 00 00 00 02 65 48 + 39 00 00 00 00 00 02 64 48 + 39 00 00 00 00 00 02 63 48 + 39 00 00 00 00 00 02 62 49 + 39 00 00 00 00 00 02 61 49 + 39 00 00 00 00 00 02 60 49 + 39 00 00 00 00 00 02 5F 4A + 39 00 00 00 00 00 02 5E 4A + 39 00 00 00 00 00 02 5D 4B + 39 00 00 00 00 00 02 5C 4C + 39 00 00 00 00 00 02 5B 4D + 39 00 00 00 00 00 02 5A 4E + 39 00 00 00 00 00 02 59 4F + 39 00 00 00 00 00 02 58 50 + 39 00 00 00 00 00 02 57 51 + 39 00 00 00 00 00 02 56 51 + 39 00 00 00 00 00 02 55 52 + 39 00 00 00 00 00 02 54 53 + 39 00 00 00 00 00 02 53 54 + 39 00 00 00 00 00 02 52 55 + 39 00 00 00 00 00 02 51 55 + 39 00 00 00 00 00 02 50 56 + 39 00 00 00 00 00 02 4F 57 + 39 00 00 00 00 00 02 4E 57 + 39 00 00 00 00 00 02 4D 58 + 39 00 00 00 00 00 02 4C 59 + 39 00 00 00 00 00 02 4B 59 + 39 00 00 00 00 00 02 4A 5A + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 48 5B + 39 00 00 00 00 00 02 47 5B + 39 00 00 00 00 00 02 46 5C + 39 00 00 00 00 00 02 45 5D + 39 00 00 00 00 00 02 44 5D + 39 00 00 00 00 00 02 43 5E + 39 00 00 00 00 00 02 42 5F + 39 00 00 00 00 00 02 41 5F + 39 00 00 00 00 00 02 40 5E + 39 00 00 00 00 00 02 3F 5E + 39 00 00 00 00 00 02 3E 5E + 39 00 00 00 00 00 02 3D 5E + 39 00 00 00 00 00 02 3C 5F + 39 00 00 00 00 00 02 3B 60 + 39 00 00 00 00 00 02 3A 61 + 39 00 00 00 00 00 02 39 62 + 39 00 00 00 00 00 02 38 63 + 39 00 00 00 00 00 02 37 63 + 39 00 00 00 00 00 02 36 64 + 39 00 00 00 00 00 02 35 65 + 39 00 00 00 00 00 02 34 66 + 39 00 00 00 00 00 02 33 67 + 39 00 00 00 00 00 02 32 67 + 39 00 00 00 00 00 02 31 68 + 39 00 00 00 00 00 02 30 69 + 39 00 00 00 00 00 02 2F 6A + 39 00 00 00 00 00 02 2E 6B + 39 00 00 00 00 00 02 2D 6C + 39 00 00 00 00 00 02 2C 6C + 39 00 00 00 00 00 02 2B 6B + 39 00 00 00 00 00 02 2A 6A + 39 00 00 00 00 00 02 29 6A + 39 00 00 00 00 00 02 28 6B + 39 00 00 00 00 00 02 27 6B + 39 00 00 00 00 00 02 26 6C + 39 00 00 00 00 00 02 25 6D + 39 00 00 00 00 00 02 24 6E + 39 00 00 00 00 00 02 23 6E + 39 00 00 00 00 00 02 22 6E + 39 00 00 00 00 00 02 21 6F + 39 00 00 00 00 00 02 20 6F + 39 00 00 00 00 00 02 1F 91 + 39 00 00 00 00 00 02 1E 90 + 39 00 00 00 00 00 02 1D 90 + 39 00 00 00 00 00 02 1C 90 + 39 00 00 00 00 00 02 1B 8F + 39 00 00 00 00 00 02 1A 8F + 39 00 00 00 00 00 02 19 8E + 39 00 00 00 00 00 02 18 8D + 39 00 00 00 00 00 02 17 8D + 39 00 00 00 00 00 02 16 8C + 39 00 00 00 00 00 02 15 8B + 39 00 00 00 00 00 02 14 8B + 39 00 00 00 00 00 02 13 8B + 39 00 00 00 00 00 02 12 8A + 39 00 00 00 00 00 02 11 89 + 39 00 00 00 00 00 02 10 89 + 39 00 00 00 00 00 02 0F 88 + 39 00 00 00 00 00 02 0E 88 + 39 00 00 00 00 00 02 0D 87 + 39 00 00 00 00 00 02 0C 86 + 39 00 00 00 00 00 02 0B 86 + 39 00 00 00 00 00 02 0A 85 + 39 00 00 00 00 00 02 09 85 + 39 00 00 00 00 00 02 08 84 + 39 00 00 00 00 00 02 07 83 + 39 00 00 00 00 00 02 06 83 + 39 00 00 00 00 00 02 05 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 84 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 00 + 39 00 00 00 00 00 02 7E 00 + 39 00 00 00 00 00 02 7D 00 + 39 00 00 00 00 00 02 7C 00 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7A 01 + 39 00 00 00 00 00 02 79 01 + 39 00 00 00 00 00 02 78 01 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 74 02 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 71 04 + 39 00 00 00 00 00 02 70 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 68 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 03 + 39 00 00 00 00 00 02 54 03 + 39 00 00 00 00 00 02 53 03 + 39 00 00 00 00 00 02 52 03 + 39 00 00 00 00 00 02 51 02 + 39 00 00 00 00 00 02 50 03 + 39 00 00 00 00 00 02 4F 03 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 04 + 39 00 00 00 00 00 02 4C 04 + 39 00 00 00 00 00 02 4B 04 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 49 05 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 06 + 39 00 00 00 00 00 02 46 06 + 39 00 00 00 00 00 02 45 06 + 39 00 00 00 00 00 02 44 06 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 07 + 39 00 00 00 00 00 02 39 07 + 39 00 00 00 00 00 02 38 07 + 39 00 00 00 00 00 02 37 07 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 35 05 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 04 + 39 00 00 00 00 00 02 32 05 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 06 + 39 00 00 00 00 00 02 2D 06 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 07 + 39 00 00 00 00 00 02 2A 07 + 39 00 00 00 00 00 02 29 07 + 39 00 00 00 00 00 02 28 07 + 39 00 00 00 00 00 02 27 08 + 39 00 00 00 00 00 02 26 08 + 39 00 00 00 00 00 02 25 09 + 39 00 00 00 00 00 02 24 07 + 39 00 00 00 00 00 02 23 04 + 39 00 00 00 00 00 02 22 05 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 05 + 39 00 00 00 00 00 02 1F 05 + 39 00 00 00 00 00 02 1E 05 + 39 00 00 00 00 00 02 1D 05 + 39 00 00 00 00 00 02 1C 05 + 39 00 00 00 00 00 02 1B 04 + 39 00 00 00 00 00 02 1A 04 + 39 00 00 00 00 00 02 19 04 + 39 00 00 00 00 00 02 18 04 + 39 00 00 00 00 00 02 17 03 + 39 00 00 00 00 00 02 16 03 + 39 00 00 00 00 00 02 15 03 + 39 00 00 00 00 00 02 14 04 + 39 00 00 00 00 00 02 13 04 + 39 00 00 00 00 00 02 12 04 + 39 00 00 00 00 00 02 11 04 + 39 00 00 00 00 00 02 10 03 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 03 + 39 00 00 00 00 00 02 0D 04 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 04 + 39 00 00 00 00 00 02 04 03 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 81 + 39 00 00 00 00 00 02 01 82 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 67 + 39 00 00 00 00 00 02 D1 58 + 39 00 00 00 00 00 02 D0 29 + 39 00 00 00 00 00 02 CF 24 + 39 00 00 00 00 00 02 CE 50 + 39 00 00 00 00 00 02 CD 1C + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 8F + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1D + 39 00 00 00 00 00 02 C8 9D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 13 + 39 00 00 00 00 00 02 C2 2D + 39 00 00 00 00 00 02 C1 1D + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 68 + 39 00 00 00 00 00 02 B1 59 + 39 00 00 00 00 00 02 B0 28 + 39 00 00 00 00 00 02 AF 23 + 39 00 00 00 00 00 02 AE 4F + 39 00 00 00 00 00 02 AD 1C + 39 00 00 00 00 00 02 AC 1D + 39 00 00 00 00 00 02 AB 90 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1D + 39 00 00 00 00 00 02 A8 9E + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 15 + 39 00 00 00 00 00 02 A3 12 + 39 00 00 00 00 00 02 A2 2E + 39 00 00 00 00 00 02 A1 1E + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 02 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F AC + 39 00 00 00 00 00 02 7E AB + 39 00 00 00 00 00 02 7D AA + 39 00 00 00 00 00 02 7C AA + 39 00 00 00 00 00 02 7B AA + 39 00 00 00 00 00 02 7A A9 + 39 00 00 00 00 00 02 79 A9 + 39 00 00 00 00 00 02 78 A8 + 39 00 00 00 00 00 02 77 A8 + 39 00 00 00 00 00 02 76 A8 + 39 00 00 00 00 00 02 75 A8 + 39 00 00 00 00 00 02 74 A7 + 39 00 00 00 00 00 02 73 A7 + 39 00 00 00 00 00 02 72 A7 + 39 00 00 00 00 00 02 71 A6 + 39 00 00 00 00 00 02 70 A6 + 39 00 00 00 00 00 02 6F A6 + 39 00 00 00 00 00 02 6E A6 + 39 00 00 00 00 00 02 6D A5 + 39 00 00 00 00 00 02 6C A5 + 39 00 00 00 00 00 02 6B A5 + 39 00 00 00 00 00 02 6A A4 + 39 00 00 00 00 00 02 69 A4 + 39 00 00 00 00 00 02 68 A4 + 39 00 00 00 00 00 02 67 A3 + 39 00 00 00 00 00 02 66 A3 + 39 00 00 00 00 00 02 65 A3 + 39 00 00 00 00 00 02 64 A3 + 39 00 00 00 00 00 02 63 A3 + 39 00 00 00 00 00 02 62 A2 + 39 00 00 00 00 00 02 61 A2 + 39 00 00 00 00 00 02 60 A2 + 39 00 00 00 00 00 02 5F A2 + 39 00 00 00 00 00 02 5E A2 + 39 00 00 00 00 00 02 5D A2 + 39 00 00 00 00 00 02 5C A1 + 39 00 00 00 00 00 02 5B A1 + 39 00 00 00 00 00 02 5A A1 + 39 00 00 00 00 00 02 59 A1 + 39 00 00 00 00 00 02 58 A0 + 39 00 00 00 00 00 02 57 9F + 39 00 00 00 00 00 02 56 9F + 39 00 00 00 00 00 02 55 9E + 39 00 00 00 00 00 02 54 9E + 39 00 00 00 00 00 02 53 9D + 39 00 00 00 00 00 02 52 9C + 39 00 00 00 00 00 02 51 9C + 39 00 00 00 00 00 02 50 9B + 39 00 00 00 00 00 02 4F 9A + 39 00 00 00 00 00 02 4E 9A + 39 00 00 00 00 00 02 4D 99 + 39 00 00 00 00 00 02 4C 99 + 39 00 00 00 00 00 02 4B 98 + 39 00 00 00 00 00 02 4A 98 + 39 00 00 00 00 00 02 49 97 + 39 00 00 00 00 00 02 48 97 + 39 00 00 00 00 00 02 47 96 + 39 00 00 00 00 00 02 46 96 + 39 00 00 00 00 00 02 45 96 + 39 00 00 00 00 00 02 44 96 + 39 00 00 00 00 00 02 43 95 + 39 00 00 00 00 00 02 42 95 + 39 00 00 00 00 00 02 41 94 + 39 00 00 00 00 00 02 40 94 + 39 00 00 00 00 00 02 3F 93 + 39 00 00 00 00 00 02 3E 93 + 39 00 00 00 00 00 02 3D 94 + 39 00 00 00 00 00 02 3C 95 + 39 00 00 00 00 00 02 3B 95 + 39 00 00 00 00 00 02 3A 94 + 39 00 00 00 00 00 02 39 94 + 39 00 00 00 00 00 02 38 93 + 39 00 00 00 00 00 02 37 93 + 39 00 00 00 00 00 02 36 92 + 39 00 00 00 00 00 02 35 91 + 39 00 00 00 00 00 02 34 91 + 39 00 00 00 00 00 02 33 90 + 39 00 00 00 00 00 02 32 8F + 39 00 00 00 00 00 02 31 8F + 39 00 00 00 00 00 02 30 8E + 39 00 00 00 00 00 02 2F 8E + 39 00 00 00 00 00 02 2E 8E + 39 00 00 00 00 00 02 2D 8D + 39 00 00 00 00 00 02 2C 8C + 39 00 00 00 00 00 02 2B 8B + 39 00 00 00 00 00 02 2A 8A + 39 00 00 00 00 00 02 29 8B + 39 00 00 00 00 00 02 28 8D + 39 00 00 00 00 00 02 27 8E + 39 00 00 00 00 00 02 26 8D + 39 00 00 00 00 00 02 25 8C + 39 00 00 00 00 00 02 24 8C + 39 00 00 00 00 00 02 23 8B + 39 00 00 00 00 00 02 22 8B + 39 00 00 00 00 00 02 21 8A + 39 00 00 00 00 00 02 20 8A + 39 00 00 00 00 00 02 1F 8A + 39 00 00 00 00 00 02 1E 8A + 39 00 00 00 00 00 02 1D 8A + 39 00 00 00 00 00 02 1C 8A + 39 00 00 00 00 00 02 1B 8A + 39 00 00 00 00 00 02 1A 8A + 39 00 00 00 00 00 02 19 89 + 39 00 00 00 00 00 02 18 89 + 39 00 00 00 00 00 02 17 88 + 39 00 00 00 00 00 02 16 88 + 39 00 00 00 00 00 02 15 87 + 39 00 00 00 00 00 02 14 87 + 39 00 00 00 00 00 02 13 87 + 39 00 00 00 00 00 02 12 87 + 39 00 00 00 00 00 02 11 86 + 39 00 00 00 00 00 02 10 86 + 39 00 00 00 00 00 02 0F 85 + 39 00 00 00 00 00 02 0E 85 + 39 00 00 00 00 00 02 0D 85 + 39 00 00 00 00 00 02 0C 84 + 39 00 00 00 00 00 02 0B 84 + 39 00 00 00 00 00 02 0A 83 + 39 00 00 00 00 00 02 09 83 + 39 00 00 00 00 00 02 08 83 + 39 00 00 00 00 00 02 07 82 + 39 00 00 00 00 00 02 06 82 + 39 00 00 00 00 00 02 05 82 + 39 00 00 00 00 00 02 04 82 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + qcom,mdss-dsi-panel-eye-command08= [39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 03 + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A3 13 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A8 94 + 39 00 00 00 00 00 02 A9 1E + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 AB 86 + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 B0 26 + 39 00 00 00 00 00 02 B1 51 + 39 00 00 00 00 00 02 B2 60 + 39 00 00 00 00 00 02 B3 39 + + 39 00 00 00 00 00 02 C0 00 + 39 00 00 00 00 00 02 C1 1B + 39 00 00 00 00 00 02 C2 2A + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C8 93 + 39 00 00 00 00 00 02 C9 1E + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 CB 85 + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CD 1B + 39 00 00 00 00 00 02 CE 4E + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 D1 50 + 39 00 00 00 00 00 02 D2 5F + 39 00 00 00 00 00 02 D3 39 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 01 00 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 04 02 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 11 05 + 39 00 00 00 00 00 02 12 05 + 39 00 00 00 00 00 02 13 05 + 39 00 00 00 00 00 02 14 05 + 39 00 00 00 00 00 02 15 05 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 18 05 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1E 08 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 20 06 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 23 03 + 39 00 00 00 00 00 02 24 04 + 39 00 00 00 00 00 02 25 04 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 37 05 + 39 00 00 00 00 00 02 38 06 + 39 00 00 00 00 00 02 39 06 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 51 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 70 03 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7F 01 + + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 06 85 + 39 00 00 00 00 00 02 07 85 + 39 00 00 00 00 00 02 08 86 + 39 00 00 00 00 00 02 09 87 + 39 00 00 00 00 00 02 0A 88 + 39 00 00 00 00 00 02 0B 88 + 39 00 00 00 00 00 02 0C 89 + 39 00 00 00 00 00 02 0D 8A + 39 00 00 00 00 00 02 0E 8B + 39 00 00 00 00 00 02 0F 8C + 39 00 00 00 00 00 02 10 8D + 39 00 00 00 00 00 02 11 8E + 39 00 00 00 00 00 02 12 8E + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 14 90 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 16 91 + 39 00 00 00 00 00 02 17 91 + 39 00 00 00 00 00 02 18 92 + 39 00 00 00 00 00 02 19 93 + 39 00 00 00 00 00 02 1A 94 + 39 00 00 00 00 00 02 1B 95 + 39 00 00 00 00 00 02 1C 96 + 39 00 00 00 00 00 02 1D 97 + 39 00 00 00 00 00 02 1E 98 + 39 00 00 00 00 00 02 1F 98 + 39 00 00 00 00 00 02 20 99 + 39 00 00 00 00 00 02 21 99 + 39 00 00 00 00 00 02 22 9A + 39 00 00 00 00 00 02 23 9B + 39 00 00 00 00 00 02 24 9B + 39 00 00 00 00 00 02 25 9C + 39 00 00 00 00 00 02 26 9C + 39 00 00 00 00 00 02 27 9C + 39 00 00 00 00 00 02 28 9D + 39 00 00 00 00 00 02 29 9F + 39 00 00 00 00 00 02 2A A0 + 39 00 00 00 00 00 02 2B A2 + 39 00 00 00 00 00 02 2C A4 + 39 00 00 00 00 00 02 2D A5 + 39 00 00 00 00 00 02 2E A6 + 39 00 00 00 00 00 02 2F A6 + 39 00 00 00 00 00 02 30 A7 + 39 00 00 00 00 00 02 31 A7 + 39 00 00 00 00 00 02 32 A8 + 39 00 00 00 00 00 02 33 A8 + 39 00 00 00 00 00 02 34 A9 + 39 00 00 00 00 00 02 35 AA + 39 00 00 00 00 00 02 36 AA + 39 00 00 00 00 00 02 37 AB + 39 00 00 00 00 00 02 38 AC + 39 00 00 00 00 00 02 39 AD + 39 00 00 00 00 00 02 3A AE + 39 00 00 00 00 00 02 3B AF + 39 00 00 00 00 00 02 3C B0 + 39 00 00 00 00 00 02 3D B0 + 39 00 00 00 00 00 02 3E B1 + 39 00 00 00 00 00 02 3F B3 + 39 00 00 00 00 00 02 40 B4 + 39 00 00 00 00 00 02 41 B5 + 39 00 00 00 00 00 02 42 B6 + 39 00 00 00 00 00 02 43 B7 + 39 00 00 00 00 00 02 44 B7 + 39 00 00 00 00 00 02 45 B7 + 39 00 00 00 00 00 02 46 B8 + 39 00 00 00 00 00 02 47 B8 + 39 00 00 00 00 00 02 48 B9 + 39 00 00 00 00 00 02 49 B9 + 39 00 00 00 00 00 02 4A BA + 39 00 00 00 00 00 02 4B BB + 39 00 00 00 00 00 02 4C BB + 39 00 00 00 00 00 02 4D BC + 39 00 00 00 00 00 02 4E BC + 39 00 00 00 00 00 02 4F BD + 39 00 00 00 00 00 02 50 BE + 39 00 00 00 00 00 02 51 BF + 39 00 00 00 00 00 02 52 C0 + 39 00 00 00 00 00 02 53 C0 + 39 00 00 00 00 00 02 54 C1 + 39 00 00 00 00 00 02 55 C2 + 39 00 00 00 00 00 02 56 C3 + 39 00 00 00 00 00 02 57 C3 + 39 00 00 00 00 00 02 58 C4 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 5A C6 + 39 00 00 00 00 00 02 5B C8 + 39 00 00 00 00 00 02 5C C9 + 39 00 00 00 00 00 02 5D CA + 39 00 00 00 00 00 02 5E CB + 39 00 00 00 00 00 02 5F CC + 39 00 00 00 00 00 02 60 CD + 39 00 00 00 00 00 02 61 CE + 39 00 00 00 00 00 02 62 CF + 39 00 00 00 00 00 02 63 D0 + 39 00 00 00 00 00 02 64 D1 + 39 00 00 00 00 00 02 65 D2 + 39 00 00 00 00 00 02 66 D3 + 39 00 00 00 00 00 02 67 D4 + 39 00 00 00 00 00 02 68 D4 + 39 00 00 00 00 00 02 69 D5 + 39 00 00 00 00 00 02 6A D6 + 39 00 00 00 00 00 02 6B D6 + 39 00 00 00 00 00 02 6C D7 + 39 00 00 00 00 00 02 6D D8 + 39 00 00 00 00 00 02 6E D9 + 39 00 00 00 00 00 02 6F DA + 39 00 00 00 00 00 02 70 DA + 39 00 00 00 00 00 02 71 DB + 39 00 00 00 00 00 02 72 DC + 39 00 00 00 00 00 02 73 DD + 39 00 00 00 00 00 02 74 DD + 39 00 00 00 00 00 02 75 DE + 39 00 00 00 00 00 02 76 DF + 39 00 00 00 00 00 02 77 DF + 39 00 00 00 00 00 02 78 E0 + 39 00 00 00 00 00 02 79 E1 + 39 00 00 00 00 00 02 7A E2 + 39 00 00 00 00 00 02 7B E3 + 39 00 00 00 00 00 02 7C E3 + 39 00 00 00 00 00 02 7D E4 + 39 00 00 00 00 00 02 7E E5 + 39 00 00 00 00 00 02 7F E6 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 01 83 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 06 89 + 39 00 00 00 00 00 02 07 8A + 39 00 00 00 00 00 02 08 8B + 39 00 00 00 00 00 02 09 8C + 39 00 00 00 00 00 02 0A 8E + 39 00 00 00 00 00 02 0B 8F + 39 00 00 00 00 00 02 0C 91 + 39 00 00 00 00 00 02 0D 92 + 39 00 00 00 00 00 02 0E 93 + 39 00 00 00 00 00 02 0F 95 + 39 00 00 00 00 00 02 10 97 + 39 00 00 00 00 00 02 11 98 + 39 00 00 00 00 00 02 12 9A + 39 00 00 00 00 00 02 13 9C + 39 00 00 00 00 00 02 14 9D + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 16 9F + 39 00 00 00 00 00 02 17 A1 + 39 00 00 00 00 00 02 18 A2 + 39 00 00 00 00 00 02 19 A4 + 39 00 00 00 00 00 02 1A A5 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1C A7 + 39 00 00 00 00 00 02 1D A8 + 39 00 00 00 00 00 02 1E A9 + 39 00 00 00 00 00 02 1F AB + 39 00 00 00 00 00 02 20 53 + 39 00 00 00 00 00 02 21 52 + 39 00 00 00 00 00 02 22 50 + 39 00 00 00 00 00 02 23 4E + 39 00 00 00 00 00 02 24 4D + 39 00 00 00 00 00 02 25 4B + 39 00 00 00 00 00 02 26 4A + 39 00 00 00 00 00 02 27 49 + 39 00 00 00 00 00 02 28 48 + 39 00 00 00 00 00 02 29 46 + 39 00 00 00 00 00 02 2A 45 + 39 00 00 00 00 00 02 2B 44 + 39 00 00 00 00 00 02 2C 42 + 39 00 00 00 00 00 02 2D 41 + 39 00 00 00 00 00 02 2E 40 + 39 00 00 00 00 00 02 2F 3F + 39 00 00 00 00 00 02 30 3E + 39 00 00 00 00 00 02 31 3D + 39 00 00 00 00 00 02 32 3B + 39 00 00 00 00 00 02 33 39 + 39 00 00 00 00 00 02 34 37 + 39 00 00 00 00 00 02 35 35 + 39 00 00 00 00 00 02 36 33 + 39 00 00 00 00 00 02 37 31 + 39 00 00 00 00 00 02 38 2F + 39 00 00 00 00 00 02 39 2D + 39 00 00 00 00 00 02 3A 2C + 39 00 00 00 00 00 02 3B 2B + 39 00 00 00 00 00 02 3C 2A + 39 00 00 00 00 00 02 3D 28 + 39 00 00 00 00 00 02 3E 27 + 39 00 00 00 00 00 02 3F 26 + 39 00 00 00 00 00 02 40 25 + 39 00 00 00 00 00 02 41 23 + 39 00 00 00 00 00 02 42 22 + 39 00 00 00 00 00 02 43 21 + 39 00 00 00 00 00 02 44 1F + 39 00 00 00 00 00 02 45 1E + 39 00 00 00 00 00 02 46 1C + 39 00 00 00 00 00 02 47 1A + 39 00 00 00 00 00 02 48 19 + 39 00 00 00 00 00 02 49 17 + 39 00 00 00 00 00 02 4A 16 + 39 00 00 00 00 00 02 4B 15 + 39 00 00 00 00 00 02 4C 14 + 39 00 00 00 00 00 02 4D 12 + 39 00 00 00 00 00 02 4E 10 + 39 00 00 00 00 00 02 4F 0E + 39 00 00 00 00 00 02 50 0C + 39 00 00 00 00 00 02 51 0A + 39 00 00 00 00 00 02 52 09 + 39 00 00 00 00 00 02 53 07 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 55 05 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 57 03 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 59 01 + 39 00 00 00 00 00 02 5A 00 + 39 00 00 00 00 00 02 5B 82 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5D 84 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 60 88 + 39 00 00 00 00 00 02 61 8A + 39 00 00 00 00 00 02 62 8B + 39 00 00 00 00 00 02 63 8C + 39 00 00 00 00 00 02 64 8E + 39 00 00 00 00 00 02 65 8F + 39 00 00 00 00 00 02 66 90 + 39 00 00 00 00 00 02 67 92 + 39 00 00 00 00 00 02 68 94 + 39 00 00 00 00 00 02 69 95 + 39 00 00 00 00 00 02 6A 97 + 39 00 00 00 00 00 02 6B 98 + 39 00 00 00 00 00 02 6C 99 + 39 00 00 00 00 00 02 6D 9A + 39 00 00 00 00 00 02 6E 9C + 39 00 00 00 00 00 02 6F 9E + 39 00 00 00 00 00 02 70 9F + 39 00 00 00 00 00 02 71 A1 + 39 00 00 00 00 00 02 72 A3 + 39 00 00 00 00 00 02 73 A5 + 39 00 00 00 00 00 02 74 A7 + 39 00 00 00 00 00 02 75 A8 + 39 00 00 00 00 00 02 76 AA + 39 00 00 00 00 00 02 77 AB + 39 00 00 00 00 00 02 78 AD + 39 00 00 00 00 00 02 79 AF + 39 00 00 00 00 00 02 7A B0 + 39 00 00 00 00 00 02 7B B2 + 39 00 00 00 00 00 02 7C B4 + 39 00 00 00 00 00 02 7D B6 + 39 00 00 00 00 00 02 7E B7 + 39 00 00 00 00 00 02 7F B9 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 01 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 07 01 + 39 00 00 00 00 00 02 08 01 + 39 00 00 00 00 00 02 09 01 + 39 00 00 00 00 00 02 0A 01 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0C 02 + 39 00 00 00 00 00 02 0D 02 + 39 00 00 00 00 00 02 0E 02 + 39 00 00 00 00 00 02 0F 02 + 39 00 00 00 00 00 02 10 02 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 12 01 + 39 00 00 00 00 00 02 13 01 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 15 00 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 18 81 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 22 83 + 39 00 00 00 00 00 02 23 83 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 32 84 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3D 87 + 39 00 00 00 00 00 02 3E 87 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 41 87 + 39 00 00 00 00 00 02 42 87 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 46 86 + 39 00 00 00 00 00 02 47 86 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 49 85 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 4B 84 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4D 84 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 50 85 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 53 86 + 39 00 00 00 00 00 02 54 86 + 39 00 00 00 00 00 02 55 86 + 39 00 00 00 00 00 02 56 86 + 39 00 00 00 00 00 02 57 85 + 39 00 00 00 00 00 02 58 85 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 5A 84 + 39 00 00 00 00 00 02 5B 84 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5D 84 + 39 00 00 00 00 00 02 5E 84 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 60 85 + 39 00 00 00 00 00 02 61 85 + 39 00 00 00 00 00 02 62 85 + 39 00 00 00 00 00 02 63 85 + 39 00 00 00 00 00 02 64 85 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 66 84 + 39 00 00 00 00 00 02 67 84 + 39 00 00 00 00 00 02 68 83 + 39 00 00 00 00 00 02 69 84 + 39 00 00 00 00 00 02 6A 84 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6C 85 + 39 00 00 00 00 00 02 6D 85 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6F 84 + 39 00 00 00 00 00 02 70 84 + 39 00 00 00 00 00 02 71 84 + 39 00 00 00 00 00 02 72 84 + 39 00 00 00 00 00 02 73 84 + 39 00 00 00 00 00 02 74 84 + 39 00 00 00 00 00 02 75 84 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 79 83 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7F 83 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 01 E7 + 39 00 00 00 00 00 02 02 E8 + 39 00 00 00 00 00 02 03 E8 + 39 00 00 00 00 00 02 04 E9 + 39 00 00 00 00 00 02 05 EA + 39 00 00 00 00 00 02 06 EB + 39 00 00 00 00 00 02 07 EC + 39 00 00 00 00 00 02 08 ED + 39 00 00 00 00 00 02 09 EE + 39 00 00 00 00 00 02 0A EF + 39 00 00 00 00 00 02 0B EF + 39 00 00 00 00 00 02 0C F0 + 39 00 00 00 00 00 02 0D F1 + 39 00 00 00 00 00 02 0E F2 + 39 00 00 00 00 00 02 0F F3 + 39 00 00 00 00 00 02 10 F4 + 39 00 00 00 00 00 02 11 F5 + 39 00 00 00 00 00 02 12 F6 + 39 00 00 00 00 00 02 13 F6 + 39 00 00 00 00 00 02 14 F7 + 39 00 00 00 00 00 02 15 F8 + 39 00 00 00 00 00 02 16 F9 + 39 00 00 00 00 00 02 17 FA + 39 00 00 00 00 00 02 18 FB + 39 00 00 00 00 00 02 19 FC + 39 00 00 00 00 00 02 1A FD + 39 00 00 00 00 00 02 1B FD + 39 00 00 00 00 00 02 1C FE + 39 00 00 00 00 00 02 1D FF + 39 00 00 00 00 00 02 1E FF + 39 00 00 00 00 00 02 1F FF + 39 00 00 00 00 00 02 20 FF + 39 00 00 00 00 00 02 21 FF + 39 00 00 00 00 00 02 22 FF + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 24 FF + 39 00 00 00 00 00 02 25 FF + 39 00 00 00 00 00 02 26 FF + 39 00 00 00 00 00 02 27 FF + 39 00 00 00 00 00 02 28 FF + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 2A FF + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2C FF + 39 00 00 00 00 00 02 2D FF + 39 00 00 00 00 00 02 2E FF + 39 00 00 00 00 00 02 2F FF + 39 00 00 00 00 00 02 30 FF + 39 00 00 00 00 00 02 31 FF + 39 00 00 00 00 00 02 32 FF + 39 00 00 00 00 00 02 33 FF + 39 00 00 00 00 00 02 34 FF + 39 00 00 00 00 00 02 35 FF + 39 00 00 00 00 00 02 36 FF + 39 00 00 00 00 00 02 37 FF + 39 00 00 00 00 00 02 38 FF + 39 00 00 00 00 00 02 39 FF + 39 00 00 00 00 00 02 3A FF + 39 00 00 00 00 00 02 3B FF + 39 00 00 00 00 00 02 3C FF + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3E FF + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7F FF + + + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 01 45 + 39 00 00 00 00 00 02 02 43 + 39 00 00 00 00 00 02 03 42 + 39 00 00 00 00 00 02 04 41 + 39 00 00 00 00 00 02 05 3F + 39 00 00 00 00 00 02 06 3E + 39 00 00 00 00 00 02 07 3C + 39 00 00 00 00 00 02 08 3B + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 0A 38 + 39 00 00 00 00 00 02 0B 37 + 39 00 00 00 00 00 02 0C 35 + 39 00 00 00 00 00 02 0D 34 + 39 00 00 00 00 00 02 0E 32 + 39 00 00 00 00 00 02 0F 31 + 39 00 00 00 00 00 02 10 2F + 39 00 00 00 00 00 02 11 2E + 39 00 00 00 00 00 02 12 2D + 39 00 00 00 00 00 02 13 2B + 39 00 00 00 00 00 02 14 2A + 39 00 00 00 00 00 02 15 28 + 39 00 00 00 00 00 02 16 27 + 39 00 00 00 00 00 02 17 25 + 39 00 00 00 00 00 02 18 24 + 39 00 00 00 00 00 02 19 22 + 39 00 00 00 00 00 02 1A 21 + 39 00 00 00 00 00 02 1B 1F + 39 00 00 00 00 00 02 1C 1E + 39 00 00 00 00 00 02 1D 1D + 39 00 00 00 00 00 02 1E 1B + 39 00 00 00 00 00 02 1F 1A + 39 00 00 00 00 00 02 20 18 + 39 00 00 00 00 00 02 21 17 + 39 00 00 00 00 00 02 22 15 + 39 00 00 00 00 00 02 23 14 + 39 00 00 00 00 00 02 24 13 + 39 00 00 00 00 00 02 25 12 + 39 00 00 00 00 00 02 26 10 + 39 00 00 00 00 00 02 27 0E + 39 00 00 00 00 00 02 28 0C + 39 00 00 00 00 00 02 29 0B + 39 00 00 00 00 00 02 2A 0A + 39 00 00 00 00 00 02 2B 08 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2F 02 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 35 87 + 39 00 00 00 00 00 02 36 89 + 39 00 00 00 00 00 02 37 8A + 39 00 00 00 00 00 02 38 8C + 39 00 00 00 00 00 02 39 8E + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 3B 91 + 39 00 00 00 00 00 02 3C 92 + 39 00 00 00 00 00 02 3D 94 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3F 97 + 39 00 00 00 00 00 02 40 68 + 39 00 00 00 00 00 02 41 66 + 39 00 00 00 00 00 02 42 64 + 39 00 00 00 00 00 02 43 63 + 39 00 00 00 00 00 02 44 61 + 39 00 00 00 00 00 02 45 60 + 39 00 00 00 00 00 02 46 5E + 39 00 00 00 00 00 02 47 5D + 39 00 00 00 00 00 02 48 5B + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 4A 58 + 39 00 00 00 00 00 02 4B 57 + 39 00 00 00 00 00 02 4C 55 + 39 00 00 00 00 00 02 4D 54 + 39 00 00 00 00 00 02 4E 52 + 39 00 00 00 00 00 02 4F 51 + 39 00 00 00 00 00 02 50 4F + 39 00 00 00 00 00 02 51 4E + 39 00 00 00 00 00 02 52 4D + 39 00 00 00 00 00 02 53 4B + 39 00 00 00 00 00 02 54 4A + 39 00 00 00 00 00 02 55 48 + 39 00 00 00 00 00 02 56 47 + 39 00 00 00 00 00 02 57 46 + 39 00 00 00 00 00 02 58 44 + 39 00 00 00 00 00 02 59 43 + 39 00 00 00 00 00 02 5A 42 + 39 00 00 00 00 00 02 5B 40 + 39 00 00 00 00 00 02 5C 3F + 39 00 00 00 00 00 02 5D 3D + 39 00 00 00 00 00 02 5E 3C + 39 00 00 00 00 00 02 5F 3B + 39 00 00 00 00 00 02 60 39 + 39 00 00 00 00 00 02 61 38 + 39 00 00 00 00 00 02 62 37 + 39 00 00 00 00 00 02 63 35 + 39 00 00 00 00 00 02 64 33 + 39 00 00 00 00 00 02 65 31 + 39 00 00 00 00 00 02 66 30 + 39 00 00 00 00 00 02 67 2E + 39 00 00 00 00 00 02 68 2C + 39 00 00 00 00 00 02 69 2B + 39 00 00 00 00 00 02 6A 29 + 39 00 00 00 00 00 02 6B 27 + 39 00 00 00 00 00 02 6C 25 + 39 00 00 00 00 00 02 6D 24 + 39 00 00 00 00 00 02 6E 22 + 39 00 00 00 00 00 02 6F 20 + 39 00 00 00 00 00 02 70 1F + 39 00 00 00 00 00 02 71 1D + 39 00 00 00 00 00 02 72 1B + 39 00 00 00 00 00 02 73 1A + 39 00 00 00 00 00 02 74 18 + 39 00 00 00 00 00 02 75 16 + 39 00 00 00 00 00 02 76 15 + 39 00 00 00 00 00 02 77 13 + 39 00 00 00 00 00 02 78 11 + 39 00 00 00 00 00 02 79 0F + 39 00 00 00 00 00 02 7A 0E + 39 00 00 00 00 00 02 7B 0C + 39 00 00 00 00 00 02 7C 0B + 39 00 00 00 00 00 02 7D 09 + 39 00 00 00 00 00 02 7E 08 + 39 00 00 00 00 00 02 7F 07 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F E6 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 E7 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F b9 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 46 + 39 00 00 00 00 00 02 7F 07 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B2 + 39 00 00 00 00 00 02 32 01 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 7F 07 + 39 00 00 00 00 00 02 7E 08 + 39 00 00 00 00 00 02 7D 09 + 39 00 00 00 00 00 02 7C 0B + 39 00 00 00 00 00 02 7B 0C + 39 00 00 00 00 00 02 7A 0E + 39 00 00 00 00 00 02 79 0F + 39 00 00 00 00 00 02 78 11 + 39 00 00 00 00 00 02 77 13 + 39 00 00 00 00 00 02 76 15 + 39 00 00 00 00 00 02 75 16 + 39 00 00 00 00 00 02 74 18 + 39 00 00 00 00 00 02 73 1A + 39 00 00 00 00 00 02 72 1B + 39 00 00 00 00 00 02 71 1D + 39 00 00 00 00 00 02 70 1F + 39 00 00 00 00 00 02 6F 20 + 39 00 00 00 00 00 02 6E 22 + 39 00 00 00 00 00 02 6D 24 + 39 00 00 00 00 00 02 6C 25 + 39 00 00 00 00 00 02 6B 27 + 39 00 00 00 00 00 02 6A 29 + 39 00 00 00 00 00 02 69 2B + 39 00 00 00 00 00 02 68 2C + 39 00 00 00 00 00 02 67 2E + 39 00 00 00 00 00 02 66 30 + 39 00 00 00 00 00 02 65 31 + 39 00 00 00 00 00 02 64 33 + 39 00 00 00 00 00 02 63 35 + 39 00 00 00 00 00 02 62 37 + 39 00 00 00 00 00 02 61 38 + 39 00 00 00 00 00 02 60 39 + 39 00 00 00 00 00 02 5F 3B + 39 00 00 00 00 00 02 5E 3C + 39 00 00 00 00 00 02 5D 3D + 39 00 00 00 00 00 02 5C 3F + 39 00 00 00 00 00 02 5B 40 + 39 00 00 00 00 00 02 5A 42 + 39 00 00 00 00 00 02 59 43 + 39 00 00 00 00 00 02 58 44 + 39 00 00 00 00 00 02 57 46 + 39 00 00 00 00 00 02 56 47 + 39 00 00 00 00 00 02 55 48 + 39 00 00 00 00 00 02 54 4A + 39 00 00 00 00 00 02 53 4B + 39 00 00 00 00 00 02 52 4D + 39 00 00 00 00 00 02 51 4E + 39 00 00 00 00 00 02 50 4F + 39 00 00 00 00 00 02 4F 51 + 39 00 00 00 00 00 02 4E 52 + 39 00 00 00 00 00 02 4D 54 + 39 00 00 00 00 00 02 4C 55 + 39 00 00 00 00 00 02 4B 57 + 39 00 00 00 00 00 02 4A 58 + 39 00 00 00 00 00 02 49 5A + 39 00 00 00 00 00 02 48 5B + 39 00 00 00 00 00 02 47 5D + 39 00 00 00 00 00 02 46 5E + 39 00 00 00 00 00 02 45 60 + 39 00 00 00 00 00 02 44 61 + 39 00 00 00 00 00 02 43 63 + 39 00 00 00 00 00 02 42 64 + 39 00 00 00 00 00 02 41 66 + 39 00 00 00 00 00 02 40 68 + 39 00 00 00 00 00 02 3F 97 + 39 00 00 00 00 00 02 3E 96 + 39 00 00 00 00 00 02 3D 94 + 39 00 00 00 00 00 02 3C 92 + 39 00 00 00 00 00 02 3B 91 + 39 00 00 00 00 00 02 3A 8F + 39 00 00 00 00 00 02 39 8E + 39 00 00 00 00 00 02 38 8C + 39 00 00 00 00 00 02 37 8A + 39 00 00 00 00 00 02 36 89 + 39 00 00 00 00 00 02 35 87 + 39 00 00 00 00 00 02 34 86 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 83 + 39 00 00 00 00 00 02 31 81 + 39 00 00 00 00 00 02 30 01 + 39 00 00 00 00 00 02 2F 02 + 39 00 00 00 00 00 02 2E 04 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2C 07 + 39 00 00 00 00 00 02 2B 08 + 39 00 00 00 00 00 02 2A 0A + 39 00 00 00 00 00 02 29 0B + 39 00 00 00 00 00 02 28 0C + 39 00 00 00 00 00 02 27 0E + 39 00 00 00 00 00 02 26 10 + 39 00 00 00 00 00 02 25 12 + 39 00 00 00 00 00 02 24 13 + 39 00 00 00 00 00 02 23 14 + 39 00 00 00 00 00 02 22 15 + 39 00 00 00 00 00 02 21 17 + 39 00 00 00 00 00 02 20 18 + 39 00 00 00 00 00 02 1F 1A + 39 00 00 00 00 00 02 1E 1B + 39 00 00 00 00 00 02 1D 1D + 39 00 00 00 00 00 02 1C 1E + 39 00 00 00 00 00 02 1B 1F + 39 00 00 00 00 00 02 1A 21 + 39 00 00 00 00 00 02 19 22 + 39 00 00 00 00 00 02 18 24 + 39 00 00 00 00 00 02 17 25 + 39 00 00 00 00 00 02 16 27 + 39 00 00 00 00 00 02 15 28 + 39 00 00 00 00 00 02 14 2A + 39 00 00 00 00 00 02 13 2B + 39 00 00 00 00 00 02 12 2D + 39 00 00 00 00 00 02 11 2E + 39 00 00 00 00 00 02 10 2F + 39 00 00 00 00 00 02 0F 31 + 39 00 00 00 00 00 02 0E 32 + 39 00 00 00 00 00 02 0D 34 + 39 00 00 00 00 00 02 0C 35 + 39 00 00 00 00 00 02 0B 37 + 39 00 00 00 00 00 02 0A 38 + 39 00 00 00 00 00 02 09 3A + 39 00 00 00 00 00 02 08 3B + 39 00 00 00 00 00 02 07 3C + 39 00 00 00 00 00 02 06 3E + 39 00 00 00 00 00 02 05 3F + 39 00 00 00 00 00 02 04 41 + 39 00 00 00 00 00 02 03 42 + 39 00 00 00 00 00 02 02 43 + 39 00 00 00 00 00 02 01 45 + + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 02 7E 84 + 39 00 00 00 00 00 02 7D 84 + 39 00 00 00 00 00 02 7C 83 + 39 00 00 00 00 00 02 7B 83 + 39 00 00 00 00 00 02 7A 83 + 39 00 00 00 00 00 02 79 83 + 39 00 00 00 00 00 02 78 83 + 39 00 00 00 00 00 02 77 84 + 39 00 00 00 00 00 02 76 84 + 39 00 00 00 00 00 02 75 84 + 39 00 00 00 00 00 02 74 84 + 39 00 00 00 00 00 02 73 84 + 39 00 00 00 00 00 02 72 84 + 39 00 00 00 00 00 02 71 84 + 39 00 00 00 00 00 02 70 84 + 39 00 00 00 00 00 02 6F 84 + 39 00 00 00 00 00 02 6E 84 + 39 00 00 00 00 00 02 6D 85 + 39 00 00 00 00 00 02 6C 85 + 39 00 00 00 00 00 02 6B 84 + 39 00 00 00 00 00 02 6A 84 + 39 00 00 00 00 00 02 69 84 + 39 00 00 00 00 00 02 68 83 + 39 00 00 00 00 00 02 67 84 + 39 00 00 00 00 00 02 66 84 + 39 00 00 00 00 00 02 65 85 + 39 00 00 00 00 00 02 64 85 + 39 00 00 00 00 00 02 63 85 + 39 00 00 00 00 00 02 62 85 + 39 00 00 00 00 00 02 61 85 + 39 00 00 00 00 00 02 60 85 + 39 00 00 00 00 00 02 5F 85 + 39 00 00 00 00 00 02 5E 84 + 39 00 00 00 00 00 02 5D 84 + 39 00 00 00 00 00 02 5C 84 + 39 00 00 00 00 00 02 5B 84 + 39 00 00 00 00 00 02 5A 84 + 39 00 00 00 00 00 02 59 85 + 39 00 00 00 00 00 02 58 85 + 39 00 00 00 00 00 02 57 85 + 39 00 00 00 00 00 02 56 86 + 39 00 00 00 00 00 02 55 86 + 39 00 00 00 00 00 02 54 86 + 39 00 00 00 00 00 02 53 86 + 39 00 00 00 00 00 02 52 86 + 39 00 00 00 00 00 02 51 85 + 39 00 00 00 00 00 02 50 85 + 39 00 00 00 00 00 02 4F 85 + 39 00 00 00 00 00 02 4E 85 + 39 00 00 00 00 00 02 4D 84 + 39 00 00 00 00 00 02 4C 84 + 39 00 00 00 00 00 02 4B 84 + 39 00 00 00 00 00 02 4A 85 + 39 00 00 00 00 00 02 49 85 + 39 00 00 00 00 00 02 48 86 + 39 00 00 00 00 00 02 47 86 + 39 00 00 00 00 00 02 46 86 + 39 00 00 00 00 00 02 45 87 + 39 00 00 00 00 00 02 44 87 + 39 00 00 00 00 00 02 43 87 + 39 00 00 00 00 00 02 42 87 + 39 00 00 00 00 00 02 41 87 + 39 00 00 00 00 00 02 40 88 + 39 00 00 00 00 00 02 3F 87 + 39 00 00 00 00 00 02 3E 87 + 39 00 00 00 00 00 02 3D 87 + 39 00 00 00 00 00 02 3C 87 + 39 00 00 00 00 00 02 3B 87 + 39 00 00 00 00 00 02 3A 87 + 39 00 00 00 00 00 02 39 86 + 39 00 00 00 00 00 02 38 86 + 39 00 00 00 00 00 02 37 86 + 39 00 00 00 00 00 02 36 85 + 39 00 00 00 00 00 02 35 85 + 39 00 00 00 00 00 02 34 85 + 39 00 00 00 00 00 02 33 84 + 39 00 00 00 00 00 02 32 84 + 39 00 00 00 00 00 02 31 83 + 39 00 00 00 00 00 02 30 82 + 39 00 00 00 00 00 02 2F 82 + 39 00 00 00 00 00 02 2E 82 + 39 00 00 00 00 00 02 2D 83 + 39 00 00 00 00 00 02 2C 83 + 39 00 00 00 00 00 02 2B 83 + 39 00 00 00 00 00 02 2A 83 + 39 00 00 00 00 00 02 29 83 + 39 00 00 00 00 00 02 28 83 + 39 00 00 00 00 00 02 27 83 + 39 00 00 00 00 00 02 26 83 + 39 00 00 00 00 00 02 25 83 + 39 00 00 00 00 00 02 24 83 + 39 00 00 00 00 00 02 23 83 + 39 00 00 00 00 00 02 22 83 + 39 00 00 00 00 00 02 21 83 + 39 00 00 00 00 00 02 20 83 + 39 00 00 00 00 00 02 1F 83 + 39 00 00 00 00 00 02 1E 83 + 39 00 00 00 00 00 02 1D 82 + 39 00 00 00 00 00 02 1C 82 + 39 00 00 00 00 00 02 1B 82 + 39 00 00 00 00 00 02 1A 82 + 39 00 00 00 00 00 02 19 81 + 39 00 00 00 00 00 02 18 81 + 39 00 00 00 00 00 02 17 81 + 39 00 00 00 00 00 02 16 00 + 39 00 00 00 00 00 02 15 00 + 39 00 00 00 00 00 02 14 00 + 39 00 00 00 00 00 02 13 01 + 39 00 00 00 00 00 02 12 01 + 39 00 00 00 00 00 02 11 02 + 39 00 00 00 00 00 02 10 02 + 39 00 00 00 00 00 02 0F 02 + 39 00 00 00 00 00 02 0E 02 + 39 00 00 00 00 00 02 0D 02 + 39 00 00 00 00 00 02 0C 02 + 39 00 00 00 00 00 02 0B 02 + 39 00 00 00 00 00 02 0A 01 + 39 00 00 00 00 00 02 09 01 + 39 00 00 00 00 00 02 08 01 + 39 00 00 00 00 00 02 07 01 + 39 00 00 00 00 00 02 06 01 + 39 00 00 00 00 00 02 05 01 + 39 00 00 00 00 00 02 04 01 + 39 00 00 00 00 00 02 03 01 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 01 + + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 02 7E FF + 39 00 00 00 00 00 02 7D FF + 39 00 00 00 00 00 02 7C FF + 39 00 00 00 00 00 02 7B FF + 39 00 00 00 00 00 02 7A FF + 39 00 00 00 00 00 02 79 FF + 39 00 00 00 00 00 02 78 FF + 39 00 00 00 00 00 02 77 FF + 39 00 00 00 00 00 02 76 FF + 39 00 00 00 00 00 02 75 FF + 39 00 00 00 00 00 02 74 FF + 39 00 00 00 00 00 02 73 FF + 39 00 00 00 00 00 02 72 FF + 39 00 00 00 00 00 02 71 FF + 39 00 00 00 00 00 02 70 FF + 39 00 00 00 00 00 02 6F FF + 39 00 00 00 00 00 02 6E FF + 39 00 00 00 00 00 02 6D FF + 39 00 00 00 00 00 02 6C FF + 39 00 00 00 00 00 02 6B FF + 39 00 00 00 00 00 02 6A FF + 39 00 00 00 00 00 02 69 FF + 39 00 00 00 00 00 02 68 FF + 39 00 00 00 00 00 02 67 FF + 39 00 00 00 00 00 02 66 FF + 39 00 00 00 00 00 02 65 FF + 39 00 00 00 00 00 02 64 FF + 39 00 00 00 00 00 02 63 FF + 39 00 00 00 00 00 02 62 FF + 39 00 00 00 00 00 02 61 FF + 39 00 00 00 00 00 02 60 FF + 39 00 00 00 00 00 02 5F FF + 39 00 00 00 00 00 02 5E FF + 39 00 00 00 00 00 02 5D FF + 39 00 00 00 00 00 02 5C FF + 39 00 00 00 00 00 02 5B FF + 39 00 00 00 00 00 02 5A FF + 39 00 00 00 00 00 02 59 FF + 39 00 00 00 00 00 02 58 FF + 39 00 00 00 00 00 02 57 FF + 39 00 00 00 00 00 02 56 FF + 39 00 00 00 00 00 02 55 FF + 39 00 00 00 00 00 02 54 FF + 39 00 00 00 00 00 02 53 FF + 39 00 00 00 00 00 02 52 FF + 39 00 00 00 00 00 02 51 FF + 39 00 00 00 00 00 02 50 FF + 39 00 00 00 00 00 02 4F FF + 39 00 00 00 00 00 02 4E FF + 39 00 00 00 00 00 02 4D FF + 39 00 00 00 00 00 02 4C FF + 39 00 00 00 00 00 02 4B FF + 39 00 00 00 00 00 02 4A FF + 39 00 00 00 00 00 02 49 FF + 39 00 00 00 00 00 02 48 FF + 39 00 00 00 00 00 02 47 FF + 39 00 00 00 00 00 02 46 FF + 39 00 00 00 00 00 02 45 FF + 39 00 00 00 00 00 02 44 FF + 39 00 00 00 00 00 02 43 FF + 39 00 00 00 00 00 02 42 FF + 39 00 00 00 00 00 02 41 FF + 39 00 00 00 00 00 02 40 FF + 39 00 00 00 00 00 02 3F FF + 39 00 00 00 00 00 02 3E FF + 39 00 00 00 00 00 02 3D FF + 39 00 00 00 00 00 02 3C FF + 39 00 00 00 00 00 02 3B FF + 39 00 00 00 00 00 02 3A FF + 39 00 00 00 00 00 02 39 FF + 39 00 00 00 00 00 02 38 FF + 39 00 00 00 00 00 02 37 FF + 39 00 00 00 00 00 02 36 FF + 39 00 00 00 00 00 02 35 FF + 39 00 00 00 00 00 02 34 FF + 39 00 00 00 00 00 02 33 FF + 39 00 00 00 00 00 02 32 FF + 39 00 00 00 00 00 02 31 FF + 39 00 00 00 00 00 02 30 FF + 39 00 00 00 00 00 02 2F FF + 39 00 00 00 00 00 02 2E FF + 39 00 00 00 00 00 02 2D FF + 39 00 00 00 00 00 02 2C FF + 39 00 00 00 00 00 02 2B FF + 39 00 00 00 00 00 02 2A FF + 39 00 00 00 00 00 02 29 FF + 39 00 00 00 00 00 02 28 FF + 39 00 00 00 00 00 02 27 FF + 39 00 00 00 00 00 02 26 FF + 39 00 00 00 00 00 02 25 FF + 39 00 00 00 00 00 02 24 FF + 39 00 00 00 00 00 02 23 FF + 39 00 00 00 00 00 02 22 FF + 39 00 00 00 00 00 02 21 FF + 39 00 00 00 00 00 02 20 FF + 39 00 00 00 00 00 02 1F FF + 39 00 00 00 00 00 02 1E FF + 39 00 00 00 00 00 02 1D FF + 39 00 00 00 00 00 02 1C FE + 39 00 00 00 00 00 02 1B FD + 39 00 00 00 00 00 02 1A FD + 39 00 00 00 00 00 02 19 FC + 39 00 00 00 00 00 02 18 FB + 39 00 00 00 00 00 02 17 FA + 39 00 00 00 00 00 02 16 F9 + 39 00 00 00 00 00 02 15 F8 + 39 00 00 00 00 00 02 14 F7 + 39 00 00 00 00 00 02 13 F6 + 39 00 00 00 00 00 02 12 F6 + 39 00 00 00 00 00 02 11 F5 + 39 00 00 00 00 00 02 10 F4 + 39 00 00 00 00 00 02 0F F3 + 39 00 00 00 00 00 02 0E F2 + 39 00 00 00 00 00 02 0D F1 + 39 00 00 00 00 00 02 0C F0 + 39 00 00 00 00 00 02 0B EF + 39 00 00 00 00 00 02 0A EF + 39 00 00 00 00 00 02 09 EE + 39 00 00 00 00 00 02 08 ED + 39 00 00 00 00 00 02 07 EC + 39 00 00 00 00 00 02 06 EB + 39 00 00 00 00 00 02 05 EA + 39 00 00 00 00 00 02 04 E9 + 39 00 00 00 00 00 02 03 E8 + 39 00 00 00 00 00 02 02 E8 + 39 00 00 00 00 00 02 01 E7 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 04 FF 98 81 06 + 39 00 00 00 00 00 02 00 01 + 39 00 00 00 00 00 02 7F 83 + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F E6 + 39 00 00 00 00 00 04 FF 98 81 08 + 39 00 00 00 00 00 02 00 E7 + 39 00 00 00 00 00 02 7F FF + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 00 00 + 39 00 00 00 00 00 02 7F b9 + 39 00 00 00 00 00 04 FF 98 81 0A + 39 00 00 00 00 00 02 00 46 + 39 00 00 00 00 00 02 7F 07 + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 80 01 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 09 + 39 00 00 00 00 00 02 7F B9 + 39 00 00 00 00 00 02 7E B7 + 39 00 00 00 00 00 02 7D B6 + 39 00 00 00 00 00 02 7C B4 + 39 00 00 00 00 00 02 7B B2 + 39 00 00 00 00 00 02 7A B0 + 39 00 00 00 00 00 02 79 AF + 39 00 00 00 00 00 02 78 AD + 39 00 00 00 00 00 02 77 AB + 39 00 00 00 00 00 02 76 AA + 39 00 00 00 00 00 02 75 A8 + 39 00 00 00 00 00 02 74 A7 + 39 00 00 00 00 00 02 73 A5 + 39 00 00 00 00 00 02 72 A3 + 39 00 00 00 00 00 02 71 A1 + 39 00 00 00 00 00 02 70 9F + 39 00 00 00 00 00 02 6F 9E + 39 00 00 00 00 00 02 6E 9C + 39 00 00 00 00 00 02 6D 9A + 39 00 00 00 00 00 02 6C 99 + 39 00 00 00 00 00 02 6B 98 + 39 00 00 00 00 00 02 6A 97 + 39 00 00 00 00 00 02 69 95 + 39 00 00 00 00 00 02 68 94 + 39 00 00 00 00 00 02 67 92 + 39 00 00 00 00 00 02 66 90 + 39 00 00 00 00 00 02 65 8F + 39 00 00 00 00 00 02 64 8E + 39 00 00 00 00 00 02 63 8C + 39 00 00 00 00 00 02 62 8B + 39 00 00 00 00 00 02 61 8A + 39 00 00 00 00 00 02 60 88 + 39 00 00 00 00 00 02 5F 87 + 39 00 00 00 00 00 02 5E 86 + 39 00 00 00 00 00 02 5D 84 + 39 00 00 00 00 00 02 5C 83 + 39 00 00 00 00 00 02 5B 82 + 39 00 00 00 00 00 02 5A 00 + 39 00 00 00 00 00 02 59 01 + 39 00 00 00 00 00 02 58 02 + 39 00 00 00 00 00 02 57 03 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 05 + 39 00 00 00 00 00 02 54 06 + 39 00 00 00 00 00 02 53 07 + 39 00 00 00 00 00 02 52 09 + 39 00 00 00 00 00 02 51 0A + 39 00 00 00 00 00 02 50 0C + 39 00 00 00 00 00 02 4F 0E + 39 00 00 00 00 00 02 4E 10 + 39 00 00 00 00 00 02 4D 12 + 39 00 00 00 00 00 02 4C 14 + 39 00 00 00 00 00 02 4B 15 + 39 00 00 00 00 00 02 4A 16 + 39 00 00 00 00 00 02 49 17 + 39 00 00 00 00 00 02 48 19 + 39 00 00 00 00 00 02 47 1A + 39 00 00 00 00 00 02 46 1C + 39 00 00 00 00 00 02 45 1E + 39 00 00 00 00 00 02 44 1F + 39 00 00 00 00 00 02 43 21 + 39 00 00 00 00 00 02 42 22 + 39 00 00 00 00 00 02 41 23 + 39 00 00 00 00 00 02 40 25 + 39 00 00 00 00 00 02 3F 26 + 39 00 00 00 00 00 02 3E 27 + 39 00 00 00 00 00 02 3D 28 + 39 00 00 00 00 00 02 3C 2A + 39 00 00 00 00 00 02 3B 2B + 39 00 00 00 00 00 02 3A 2C + 39 00 00 00 00 00 02 39 2D + 39 00 00 00 00 00 02 38 2F + 39 00 00 00 00 00 02 37 31 + 39 00 00 00 00 00 02 36 33 + 39 00 00 00 00 00 02 35 35 + 39 00 00 00 00 00 02 34 37 + 39 00 00 00 00 00 02 33 39 + 39 00 00 00 00 00 02 32 3B + 39 00 00 00 00 00 02 31 3D + 39 00 00 00 00 00 02 30 3E + 39 00 00 00 00 00 02 2F 3F + 39 00 00 00 00 00 02 2E 40 + 39 00 00 00 00 00 02 2D 41 + 39 00 00 00 00 00 02 2C 42 + 39 00 00 00 00 00 02 2B 44 + 39 00 00 00 00 00 02 2A 45 + 39 00 00 00 00 00 02 29 46 + 39 00 00 00 00 00 02 28 48 + 39 00 00 00 00 00 02 27 49 + 39 00 00 00 00 00 02 26 4A + 39 00 00 00 00 00 02 25 4B + 39 00 00 00 00 00 02 24 4D + 39 00 00 00 00 00 02 23 4E + 39 00 00 00 00 00 02 22 50 + 39 00 00 00 00 00 02 21 52 + 39 00 00 00 00 00 02 20 53 + 39 00 00 00 00 00 02 1F AB + 39 00 00 00 00 00 02 1E A9 + 39 00 00 00 00 00 02 1D A8 + 39 00 00 00 00 00 02 1C A7 + 39 00 00 00 00 00 02 1B A6 + 39 00 00 00 00 00 02 1A A5 + 39 00 00 00 00 00 02 19 A4 + 39 00 00 00 00 00 02 18 A2 + 39 00 00 00 00 00 02 17 A1 + 39 00 00 00 00 00 02 16 9F + 39 00 00 00 00 00 02 15 9E + 39 00 00 00 00 00 02 14 9D + 39 00 00 00 00 00 02 13 9C + 39 00 00 00 00 00 02 12 9A + 39 00 00 00 00 00 02 11 98 + 39 00 00 00 00 00 02 10 97 + 39 00 00 00 00 00 02 0F 95 + 39 00 00 00 00 00 02 0E 93 + 39 00 00 00 00 00 02 0D 92 + 39 00 00 00 00 00 02 0C 91 + 39 00 00 00 00 00 02 0B 8F + 39 00 00 00 00 00 02 0A 8E + 39 00 00 00 00 00 02 09 8C + 39 00 00 00 00 00 02 08 8B + 39 00 00 00 00 00 02 07 8A + 39 00 00 00 00 00 02 06 89 + 39 00 00 00 00 00 02 05 87 + 39 00 00 00 00 00 02 04 86 + 39 00 00 00 00 00 02 03 85 + 39 00 00 00 00 00 02 02 84 + 39 00 00 00 00 00 02 01 83 + + 39 00 00 00 00 00 04 FF 98 81 05 + 39 00 00 00 00 00 02 7F 01 + 39 00 00 00 00 00 02 7E 01 + 39 00 00 00 00 00 02 7D 01 + 39 00 00 00 00 00 02 7C 01 + 39 00 00 00 00 00 02 7B 01 + 39 00 00 00 00 00 02 7A 02 + 39 00 00 00 00 00 02 79 02 + 39 00 00 00 00 00 02 78 02 + 39 00 00 00 00 00 02 77 02 + 39 00 00 00 00 00 02 76 02 + 39 00 00 00 00 00 02 75 02 + 39 00 00 00 00 00 02 74 03 + 39 00 00 00 00 00 02 73 03 + 39 00 00 00 00 00 02 72 03 + 39 00 00 00 00 00 02 71 03 + 39 00 00 00 00 00 02 70 03 + 39 00 00 00 00 00 02 6F 04 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6D 04 + 39 00 00 00 00 00 02 6C 04 + 39 00 00 00 00 00 02 6B 04 + 39 00 00 00 00 00 02 6A 04 + 39 00 00 00 00 00 02 69 04 + 39 00 00 00 00 00 02 68 05 + 39 00 00 00 00 00 02 67 04 + 39 00 00 00 00 00 02 66 04 + 39 00 00 00 00 00 02 65 04 + 39 00 00 00 00 00 02 64 04 + 39 00 00 00 00 00 02 63 04 + 39 00 00 00 00 00 02 62 04 + 39 00 00 00 00 00 02 61 04 + 39 00 00 00 00 00 02 60 04 + 39 00 00 00 00 00 02 5F 04 + 39 00 00 00 00 00 02 5E 04 + 39 00 00 00 00 00 02 5D 04 + 39 00 00 00 00 00 02 5C 04 + 39 00 00 00 00 00 02 5B 04 + 39 00 00 00 00 00 02 5A 04 + 39 00 00 00 00 00 02 59 04 + 39 00 00 00 00 00 02 58 04 + 39 00 00 00 00 00 02 57 04 + 39 00 00 00 00 00 02 56 04 + 39 00 00 00 00 00 02 55 04 + 39 00 00 00 00 00 02 54 04 + 39 00 00 00 00 00 02 53 04 + 39 00 00 00 00 00 02 52 04 + 39 00 00 00 00 00 02 51 04 + 39 00 00 00 00 00 02 50 04 + 39 00 00 00 00 00 02 4F 04 + 39 00 00 00 00 00 02 4E 04 + 39 00 00 00 00 00 02 4D 05 + 39 00 00 00 00 00 02 4C 05 + 39 00 00 00 00 00 02 4B 05 + 39 00 00 00 00 00 02 4A 05 + 39 00 00 00 00 00 02 49 06 + 39 00 00 00 00 00 02 48 06 + 39 00 00 00 00 00 02 47 07 + 39 00 00 00 00 00 02 46 07 + 39 00 00 00 00 00 02 45 08 + 39 00 00 00 00 00 02 44 08 + 39 00 00 00 00 00 02 43 07 + 39 00 00 00 00 00 02 42 07 + 39 00 00 00 00 00 02 41 07 + 39 00 00 00 00 00 02 40 08 + 39 00 00 00 00 00 02 3F 07 + 39 00 00 00 00 00 02 3E 07 + 39 00 00 00 00 00 02 3D 07 + 39 00 00 00 00 00 02 3C 07 + 39 00 00 00 00 00 02 3B 07 + 39 00 00 00 00 00 02 3A 06 + 39 00 00 00 00 00 02 39 06 + 39 00 00 00 00 00 02 38 06 + 39 00 00 00 00 00 02 37 05 + 39 00 00 00 00 00 02 36 05 + 39 00 00 00 00 00 02 35 04 + 39 00 00 00 00 00 02 34 04 + 39 00 00 00 00 00 02 33 03 + 39 00 00 00 00 00 02 32 04 + 39 00 00 00 00 00 02 31 05 + 39 00 00 00 00 00 02 30 06 + 39 00 00 00 00 00 02 2F 06 + 39 00 00 00 00 00 02 2E 05 + 39 00 00 00 00 00 02 2D 05 + 39 00 00 00 00 00 02 2C 05 + 39 00 00 00 00 00 02 2B 05 + 39 00 00 00 00 00 02 2A 06 + 39 00 00 00 00 00 02 29 05 + 39 00 00 00 00 00 02 28 05 + 39 00 00 00 00 00 02 27 05 + 39 00 00 00 00 00 02 26 05 + 39 00 00 00 00 00 02 25 04 + 39 00 00 00 00 00 02 24 04 + 39 00 00 00 00 00 02 23 03 + 39 00 00 00 00 00 02 22 04 + 39 00 00 00 00 00 02 21 05 + 39 00 00 00 00 00 02 20 06 + 39 00 00 00 00 00 02 1F 07 + 39 00 00 00 00 00 02 1E 08 + 39 00 00 00 00 00 02 1D 06 + 39 00 00 00 00 00 02 1C 06 + 39 00 00 00 00 00 02 1B 06 + 39 00 00 00 00 00 02 1A 05 + 39 00 00 00 00 00 02 19 05 + 39 00 00 00 00 00 02 18 05 + 39 00 00 00 00 00 02 17 04 + 39 00 00 00 00 00 02 16 04 + 39 00 00 00 00 00 02 15 05 + 39 00 00 00 00 00 02 14 05 + 39 00 00 00 00 00 02 13 05 + 39 00 00 00 00 00 02 12 05 + 39 00 00 00 00 00 02 11 05 + 39 00 00 00 00 00 02 10 04 + 39 00 00 00 00 00 02 0F 03 + 39 00 00 00 00 00 02 0E 04 + 39 00 00 00 00 00 02 0D 03 + 39 00 00 00 00 00 02 0C 03 + 39 00 00 00 00 00 02 0B 03 + 39 00 00 00 00 00 02 0A 03 + 39 00 00 00 00 00 02 09 04 + 39 00 00 00 00 00 02 08 04 + 39 00 00 00 00 00 02 07 03 + 39 00 00 00 00 00 02 06 03 + 39 00 00 00 00 00 02 05 03 + 39 00 00 00 00 00 02 04 02 + 39 00 00 00 00 00 02 03 02 + 39 00 00 00 00 00 02 02 01 + 39 00 00 00 00 00 02 01 00 + + 39 00 00 00 00 00 04 FF 98 81 01 + 39 00 00 00 00 00 02 D3 39 + 39 00 00 00 00 00 02 D2 5F + 39 00 00 00 00 00 02 D1 50 + 39 00 00 00 00 00 02 D0 27 + 39 00 00 00 00 00 02 CF 23 + 39 00 00 00 00 00 02 CE 4E + 39 00 00 00 00 00 02 CD 1B + 39 00 00 00 00 00 02 CC 1D + 39 00 00 00 00 00 02 CB 85 + 39 00 00 00 00 00 02 CA 2A + 39 00 00 00 00 00 02 C9 1E + 39 00 00 00 00 00 02 C8 93 + 39 00 00 00 00 00 02 C7 1F + 39 00 00 00 00 00 02 C6 1D + 39 00 00 00 00 00 02 C5 29 + 39 00 00 00 00 00 02 C4 16 + 39 00 00 00 00 00 02 C3 14 + 39 00 00 00 00 00 02 C2 2A + 39 00 00 00 00 00 02 C1 1B + 39 00 00 00 00 00 02 C0 00 + + 39 00 00 00 00 00 02 B3 39 + 39 00 00 00 00 00 02 B2 60 + 39 00 00 00 00 00 02 B1 51 + 39 00 00 00 00 00 02 B0 26 + 39 00 00 00 00 00 02 AF 22 + 39 00 00 00 00 00 02 AE 4E + 39 00 00 00 00 00 02 AD 1A + 39 00 00 00 00 00 02 AC 1C + 39 00 00 00 00 00 02 AB 86 + 39 00 00 00 00 00 02 AA 2A + 39 00 00 00 00 00 02 A9 1E + 39 00 00 00 00 00 02 A8 94 + 39 00 00 00 00 00 02 A7 1E + 39 00 00 00 00 00 02 A6 1D + 39 00 00 00 00 00 02 A5 29 + 39 00 00 00 00 00 02 A4 16 + 39 00 00 00 00 00 02 A3 13 + 39 00 00 00 00 00 02 A2 2B + 39 00 00 00 00 00 02 A1 1C + 39 00 00 00 00 00 02 A0 00 + 39 00 00 00 00 00 02 34 01 + 39 00 00 00 00 00 02 f6 03 + + 39 00 00 00 00 00 04 FF 98 81 07 + 39 00 00 00 00 00 02 7F E6 + 39 00 00 00 00 00 02 7E E5 + 39 00 00 00 00 00 02 7D E4 + 39 00 00 00 00 00 02 7C E3 + 39 00 00 00 00 00 02 7B E3 + 39 00 00 00 00 00 02 7A E2 + 39 00 00 00 00 00 02 79 E1 + 39 00 00 00 00 00 02 78 E0 + 39 00 00 00 00 00 02 77 DF + 39 00 00 00 00 00 02 76 DF + 39 00 00 00 00 00 02 75 DE + 39 00 00 00 00 00 02 74 DD + 39 00 00 00 00 00 02 73 DD + 39 00 00 00 00 00 02 72 DC + 39 00 00 00 00 00 02 71 DB + 39 00 00 00 00 00 02 70 DA + 39 00 00 00 00 00 02 6F DA + 39 00 00 00 00 00 02 6E D9 + 39 00 00 00 00 00 02 6D D8 + 39 00 00 00 00 00 02 6C D7 + 39 00 00 00 00 00 02 6B D6 + 39 00 00 00 00 00 02 6A D6 + 39 00 00 00 00 00 02 69 D5 + 39 00 00 00 00 00 02 68 D4 + 39 00 00 00 00 00 02 67 D4 + 39 00 00 00 00 00 02 66 D3 + 39 00 00 00 00 00 02 65 D2 + 39 00 00 00 00 00 02 64 D1 + 39 00 00 00 00 00 02 63 D0 + 39 00 00 00 00 00 02 62 CF + 39 00 00 00 00 00 02 61 CE + 39 00 00 00 00 00 02 60 CD + 39 00 00 00 00 00 02 5F CC + 39 00 00 00 00 00 02 5E CB + 39 00 00 00 00 00 02 5D CA + 39 00 00 00 00 00 02 5C C9 + 39 00 00 00 00 00 02 5B C8 + 39 00 00 00 00 00 02 5A C6 + 39 00 00 00 00 00 02 59 C5 + 39 00 00 00 00 00 02 58 C4 + 39 00 00 00 00 00 02 57 C3 + 39 00 00 00 00 00 02 56 C3 + 39 00 00 00 00 00 02 55 C2 + 39 00 00 00 00 00 02 54 C1 + 39 00 00 00 00 00 02 53 C0 + 39 00 00 00 00 00 02 52 C0 + 39 00 00 00 00 00 02 51 BF + 39 00 00 00 00 00 02 50 BE + 39 00 00 00 00 00 02 4F BD + 39 00 00 00 00 00 02 4E BC + 39 00 00 00 00 00 02 4D BC + 39 00 00 00 00 00 02 4C BB + 39 00 00 00 00 00 02 4B BB + 39 00 00 00 00 00 02 4A BA + 39 00 00 00 00 00 02 49 B9 + 39 00 00 00 00 00 02 48 B9 + 39 00 00 00 00 00 02 47 B8 + 39 00 00 00 00 00 02 46 B8 + 39 00 00 00 00 00 02 45 B7 + 39 00 00 00 00 00 02 44 B7 + 39 00 00 00 00 00 02 43 B7 + 39 00 00 00 00 00 02 42 B6 + 39 00 00 00 00 00 02 41 B5 + 39 00 00 00 00 00 02 40 B4 + 39 00 00 00 00 00 02 3F B3 + 39 00 00 00 00 00 02 3E B1 + 39 00 00 00 00 00 02 3D B0 + 39 00 00 00 00 00 02 3C B0 + 39 00 00 00 00 00 02 3B AF + 39 00 00 00 00 00 02 3A AE + 39 00 00 00 00 00 02 39 AD + 39 00 00 00 00 00 02 38 AC + 39 00 00 00 00 00 02 37 AB + 39 00 00 00 00 00 02 36 AA + 39 00 00 00 00 00 02 35 AA + 39 00 00 00 00 00 02 34 A9 + 39 00 00 00 00 00 02 33 A8 + 39 00 00 00 00 00 02 32 A8 + 39 00 00 00 00 00 02 31 A7 + 39 00 00 00 00 00 02 30 A7 + 39 00 00 00 00 00 02 2F A6 + 39 00 00 00 00 00 02 2E A6 + 39 00 00 00 00 00 02 2D A5 + 39 00 00 00 00 00 02 2C A4 + 39 00 00 00 00 00 02 2B A2 + 39 00 00 00 00 00 02 2A A0 + 39 00 00 00 00 00 02 29 9F + 39 00 00 00 00 00 02 28 9D + 39 00 00 00 00 00 02 27 9C + 39 00 00 00 00 00 02 26 9C + 39 00 00 00 00 00 02 25 9C + 39 00 00 00 00 00 02 24 9B + 39 00 00 00 00 00 02 23 9B + 39 00 00 00 00 00 02 22 9A + 39 00 00 00 00 00 02 21 99 + 39 00 00 00 00 00 02 20 99 + 39 00 00 00 00 00 02 1F 98 + 39 00 00 00 00 00 02 1E 98 + 39 00 00 00 00 00 02 1D 97 + 39 00 00 00 00 00 02 1C 96 + 39 00 00 00 00 00 02 1B 95 + 39 00 00 00 00 00 02 1A 94 + 39 00 00 00 00 00 02 19 93 + 39 00 00 00 00 00 02 18 92 + 39 00 00 00 00 00 02 17 91 + 39 00 00 00 00 00 02 16 91 + 39 00 00 00 00 00 02 15 91 + 39 00 00 00 00 00 02 14 90 + 39 00 00 00 00 00 02 13 8F + 39 00 00 00 00 00 02 12 8E + 39 00 00 00 00 00 02 11 8E + 39 00 00 00 00 00 02 10 8D + 39 00 00 00 00 00 02 0F 8C + 39 00 00 00 00 00 02 0E 8B + 39 00 00 00 00 00 02 0D 8A + 39 00 00 00 00 00 02 0C 89 + 39 00 00 00 00 00 02 0B 88 + 39 00 00 00 00 00 02 0A 88 + 39 00 00 00 00 00 02 09 87 + 39 00 00 00 00 00 02 08 86 + 39 00 00 00 00 00 02 07 85 + 39 00 00 00 00 00 02 06 85 + 39 00 00 00 00 00 02 05 84 + 39 00 00 00 00 00 02 04 83 + 39 00 00 00 00 00 02 03 83 + 39 00 00 00 00 00 02 02 83 + 39 00 00 00 00 00 02 01 82 + 39 00 00 00 00 00 04 FF 98 81 04 + 39 00 00 00 00 00 02 21 B0 + 39 00 00 00 00 00 02 32 02 + 39 01 00 00 00 00 04 FF 98 81 00 + ]; + + + + qcom,mdss-dsi-panel-eye-command-num = <8>; + qcom,mdss-dsi-panel-ce-std-command = [39 01 00 00 00 00 04 FF 98 81 02 + 39 01 00 00 00 00 02 10 06 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-vivid-command = [39 00 00 00 00 00 04 FF 98 81 00 + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 10 16 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 69 20 + 39 00 00 00 00 00 02 6A 20 + 39 00 00 00 00 00 02 6B 01 + 39 00 00 00 00 00 02 6C 02 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 72 05 + 39 00 00 00 00 00 02 73 05 + 39 00 00 00 00 00 02 74 05 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 76 07 + 39 00 00 00 00 00 02 77 07 + 39 00 00 00 00 00 02 78 07 + 39 00 00 00 00 00 02 79 07 + 39 00 00 00 00 00 02 7A 07 + 39 00 00 00 00 00 02 7B 06 + 39 00 00 00 00 00 02 7C 03 + 39 00 00 00 00 00 02 7D 03 + 39 00 00 00 00 00 02 7E 03 + 39 00 00 00 00 00 02 7F 03 + 39 01 00 00 00 00 04 FF 98 81 00 + + 39 00 00 00 00 00 04 FF 98 81 02 + 39 00 00 00 00 00 02 7F 03 + 39 00 00 00 00 00 02 7E 03 + 39 00 00 00 00 00 02 7D 03 + 39 00 00 00 00 00 02 7C 03 + 39 00 00 00 00 00 02 7B 06 + 39 00 00 00 00 00 02 7A 07 + 39 00 00 00 00 00 02 79 07 + 39 00 00 00 00 00 02 78 07 + 39 00 00 00 00 00 02 77 07 + 39 00 00 00 00 00 02 76 07 + 39 00 00 00 00 00 02 75 06 + 39 00 00 00 00 00 02 74 05 + 39 00 00 00 00 00 02 73 05 + 39 00 00 00 00 00 02 72 05 + 39 00 00 00 00 00 02 71 05 + 39 00 00 00 00 00 02 70 05 + 39 00 00 00 00 00 02 6F 05 + 39 00 00 00 00 00 02 6E 04 + 39 00 00 00 00 00 02 6D 03 + 39 00 00 00 00 00 02 6C 02 + 39 00 00 00 00 00 02 6B 01 + 39 00 00 00 00 00 02 6A 20 + 39 00 00 00 00 00 02 69 20 + 39 00 00 00 00 00 02 68 03 + 39 00 00 00 00 00 02 10 16 + 39 01 00 00 00 00 04 FF 98 81 00]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_hs_mode"; + + + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "burst_mode"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-lane-3-state; + + qcom,mdss-dsi-panel-timings = [8B 1E 14 00 44 48 18 22 19 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x04>; + qcom,mdss-dsi-t-clk-pre = <0x1C>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-pwm-gpio = <&pm8937_mpps 4 0>; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-valid-params = <1>; + qcom,mdss-dsi-panel-status-value = <0x9c>; + qcom,mdss-dsi-panel-status-read-length = <1>; + + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-nt35521s-ebbg-c3a-720p-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-nt35521s-ebbg-c3a-720p-video.dtsi new file mode 100644 index 0000000000000..6fd0009f31f09 --- /dev/null +++ b/arch/arm/boot/dts/qcom/dsi-panel-nt35521s-ebbg-c3a-720p-video.dtsi @@ -0,0 +1,233 @@ +/* Copyright (c) 2013, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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 + See the + * GNU General Public License for more details. + */ + +/*--------------------------------------------------------------------------- + * This file is autogenerated file using gcdb parser. Please do not edit it. + * Update input XML file to add a new entry or update variable in this file + * VERSION = "1.0" + *---------------------------------------------------------------------------*/ +&mdss_mdp { + dsi_nt35521s_ebbg_720_video: qcom,mdss_dsi_nt35521s_ebbg_720p_video { + qcom,mdss-dsi-panel-name = "nt35521s_HD720p_video_EBBG_c3a"; + qcom,mdss-dsi-panel-controller = <&mdss_dsi0>; + qcom,mdss-dsi-panel-type = "dsi_video_mode"; + qcom,mdss-dsi-panel-destination = "display_1"; + qcom,mdss-dsi-panel-framerate = <60>; + qcom,mdss-dsi-virtual-channel-id = <0>; + qcom,mdss-dsi-stream = <0>; + qcom,mdss-dsi-panel-width = <720>; + qcom,mdss-dsi-panel-height = <1280>; + qcom,mdss-pan-physical-width-dimension = <62>; + qcom,mdss-pan-physical-height-dimension = <110>; + qcom,mdss-dsi-h-front-porch = <240>; + qcom,mdss-dsi-h-back-porch = <241>; + qcom,mdss-dsi-h-pulse-width = <20>; + qcom,mdss-dsi-h-sync-skew = <0>; + qcom,mdss-dsi-v-back-porch = <28>; + qcom,mdss-dsi-v-front-porch = <35>; + qcom,mdss-dsi-v-pulse-width = <2>; + qcom,mdss-dsi-h-left-border = <0>; + qcom,mdss-dsi-h-right-border = <0>; + qcom,mdss-dsi-v-top-border = <0>; + qcom,mdss-dsi-v-bottom-border = <20>; + qcom,mdss-dsi-bpp = <24>; + qcom,mdss-dsi-underflow-color = <0x00>; + qcom,mdss-dsi-border-color = <0>; + qcom,mdss-dsi-on-command = [29 01 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 B1 6C + 29 01 00 00 00 00 02 64 07 + 29 01 00 00 00 00 03 CC 40 00 + 29 01 00 00 00 00 11 D1 00 00 00 01 01 01 01 01 01 01 01 01 02 02 02 02 + 29 01 00 00 00 00 0D D7 00 00 00 00 00 00 00 00 00 00 00 00 + 29 01 00 00 00 00 0D D8 00 00 00 00 00 00 00 00 00 00 00 00 + 29 01 00 00 00 00 06 F0 55 AA 52 00 00 + 29 01 00 00 00 00 05 FF AA 55 25 01 + 29 01 00 00 00 00 02 6F 1A + 29 01 00 00 00 00 02 F7 05 + 29 01 00 00 00 00 02 6F 16 + 29 01 00 00 00 00 02 F7 10 + 29 01 00 00 00 00 02 6F 10 + 29 01 00 00 00 00 02 F7 1D + 29 01 00 00 00 00 05 FF AA 55 25 00 + 29 01 00 00 00 00 02 35 00 + 05 01 00 00 78 00 02 11 00 + 05 01 00 00 00 00 02 29 00 + 37 01 00 00 00 00 02 01 00]; + qcom,mdss-dsi-off-command = [05 01 00 00 00 00 02 28 00 + 05 01 00 00 78 00 02 10 00]; + qcom,mdss-dsi-on-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-off-command-state = "dsi_hs_mode"; + qcom,mdss-dsi-panel-warm-command = [29 01 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 26 01 + 29 01 00 00 00 00 02 26 02]; + qcom,mdss-dsi-panel-cool-command = [29 01 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 26 02 + 29 01 00 00 00 00 02 26 04]; + qcom,mdss-dsi-panel-nature-command = [29 01 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 26 02 + 29 01 00 00 00 00 02 26 01]; + qcom,mdss-dsi-panel-gamma-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-ce-std-command = [29 00 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 55 00]; + qcom,mdss-dsi-panel-ce-bright-command = [29 00 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 55 B0]; + qcom,mdss-dsi-panel-ce-vivid-command = [29 00 00 00 00 00 06 F0 55 AA 52 08 00 + 29 01 00 00 00 00 02 55 80]; + qcom,mdss-dsi-panel-ce-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-eye-command01 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 51 01 54 01 59 01 5F 01 64 01 6E 01 77 01 8A + 29 00 00 00 00 00 11 B9 01 9C 01 BC 01 D7 02 08 02 35 02 36 02 67 02 A5 + 29 00 00 00 00 00 11 BA 02 CF 03 07 03 29 03 56 03 71 03 8E 03 A2 03 CF + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command02 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 75 01 77 01 7B 01 80 01 84 01 8D 01 96 01 A5 + 29 00 00 00 00 00 11 B9 01 B4 01 CF 01 E7 02 14 02 3E 02 3F 02 70 02 AD + 29 00 00 00 00 00 11 BA 02 D6 03 0E 03 30 03 5B 03 75 03 90 03 A5 03 D1 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command03 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 91 01 93 01 97 01 9B 01 9F 01 A6 01 AD 01 BB + 29 00 00 00 00 00 11 B9 01 C8 01 E0 01 F6 02 1E 02 47 02 49 02 78 02 B5 + 29 00 00 00 00 00 11 BA 02 DE 03 14 03 36 03 60 03 79 03 94 03 A8 03 D2 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command04 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 B1 01 B2 01 B6 01 B9 01 BC 01 C2 01 C8 01 D3 + 29 00 00 00 00 00 11 B9 01 DE 01 F3 02 06 02 2C 02 53 02 54 02 83 02 BE + 29 00 00 00 00 00 11 BA 02 E7 03 1C 03 3D 03 67 03 80 03 99 03 AA 03 D2 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command05 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 C8 01 C9 01 CC 01 CF 01 D1 01 D6 01 DB 01 E6 + 29 00 00 00 00 00 11 B9 01 EF 02 02 02 14 02 37 02 5D 02 5E 02 8B 02 C7 + 29 00 00 00 00 00 11 BA 02 EF 03 23 03 43 03 6C 03 85 03 9D 03 AC 03 D2 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command06 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 DE 01 E0 01 E2 01 E5 01 E6 01 EB 01 F0 01 F8 + 29 00 00 00 00 00 11 B9 02 01 02 12 02 22 02 44 02 68 02 6A 02 96 02 D1 + 29 00 00 00 00 00 11 BA 02 F8 03 2A 03 4A 03 71 03 89 03 A1 03 C6 03 D3 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command07 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 01 F4 01 F5 01 F7 01 F9 01 FB 01 FF 02 02 02 0B + 29 00 00 00 00 00 11 B9 02 12 02 21 02 31 02 50 02 75 02 76 02 A1 02 DC + 29 00 00 00 00 00 11 BA 03 03 03 33 03 52 03 76 03 8C 03 A5 03 CA 03 D3 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command08 = [29 00 00 00 00 00 06 F0 55 AA 52 08 02 + 29 01 00 00 00 00 02 EE 03 + 29 00 00 00 00 00 11 B0 00 14 00 2C 00 51 00 6D 00 85 00 AB 00 CA 00 FC + 29 01 00 00 00 00 11 B1 01 24 01 60 01 8E 01 D7 02 10 02 12 02 47 02 89 + 29 00 00 00 00 00 11 B2 02 B4 02 EE 03 14 03 43 03 60 03 86 03 97 03 B0 + 29 01 00 00 00 00 05 B3 03 D3 03 D5 + 29 00 00 00 00 00 11 B4 01 02 01 06 01 0F 01 18 01 21 01 31 01 40 01 59 + 29 01 00 00 00 00 11 B5 01 70 01 98 01 BB 01 F3 02 24 02 26 02 59 02 98 + 29 00 00 00 00 00 11 B6 02 C3 02 FB 03 20 03 4E 03 6A 03 8C 03 9E 03 B4 + 29 01 00 00 00 00 05 B7 03 D0 03 D5 + 29 00 00 00 00 00 11 B8 02 07 02 08 02 0A 02 0B 02 0E 02 11 02 14 02 1B + 29 00 00 00 00 00 11 B9 02 23 02 31 02 3F 02 5E 02 81 02 82 02 AD 02 E7 + 29 00 00 00 00 00 11 BA 03 0D 03 3C 03 5A 03 7D 03 8E 03 A8 03 CE 03 D3 + 29 01 00 00 00 00 05 BB 03 D4 03 D5]; + qcom,mdss-dsi-panel-eye-command-num = <8>; + qcom,mdss-dsi-init-last; + qcom,mdss-dsi-h-sync-pulse = <1>; + qcom,mdss-dsi-traffic-mode = "non_burst_sync_event"; + qcom,mdss-dsi-bllp-eof-power-mode; + qcom,mdss-dsi-bllp-power-mode; + qcom,mdss-dsi-lane-0-state; + qcom,mdss-dsi-lane-1-state; + qcom,mdss-dsi-lane-2-state; + qcom,mdss-dsi-tx-eot-append; + qcom,mdss-dsi-hbp-power-mode; + qcom,mdss-dsi-panel-timings = [CF 32 20 00 5E 62 26 34 29 03 04 00]; + qcom,mdss-dsi-t-clk-post = <0x03>; + qcom,mdss-dsi-t-clk-pre = <0x27>; + qcom,mdss-dsi-bl-min-level = <4>; + qcom,mdss-dsi-bl-max-level = <255>; + qcom,mdss-dsi-bl-pmic-pwm-frequency = <100>; + qcom,mdss-dsi-bl-pmic-bank-select = <0>; + qcom,mdss-dsi-dma-trigger = "trigger_sw"; + qcom,mdss-dsi-mdp-trigger = "none"; + + qcom,esd-check-enabled; + qcom,mdss-dsi-panel-status-command = [06 01 00 01 05 00 02 0A 08]; + qcom,mdss-dsi-panel-status-command-state = "dsi_lp_mode"; + qcom,mdss-dsi-panel-status-check-mode = "reg_read"; + qcom,mdss-dsi-panel-status-value = <0x9C>; + qcom,mdss-dsi-panel-status-read-length = <1>; + + qcom,mdss-dsi-lp11-init; + qcom,mdss-dsi-init-delay-us = <50000>; + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_pwm"; + qcom,mdss-dsi-pwm-gpio = <&pm8937_mpps 4 0>; + qcom,mdss-dsi-reset-sequence = <1 5>, <0 10>, <1 80>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/dsi-panel-sharp-dualmipi-wqxga-video.dtsi b/arch/arm/boot/dts/qcom/dsi-panel-sharp-dualmipi-wqxga-video.dtsi index 2a5b8a2487305..8e0c1ba2f1b39 100644 --- a/arch/arm/boot/dts/qcom/dsi-panel-sharp-dualmipi-wqxga-video.dtsi +++ b/arch/arm/boot/dts/qcom/dsi-panel-sharp-dualmipi-wqxga-video.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, 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 @@ -64,7 +64,11 @@ qcom,mdss-dsi-panel-status-check-mode = "bta_check"; qcom,mdss-dsi-tx-eot-append; qcom,esd-check-enabled; - + qcom,mdss-dsi-panel-hdr-enabled; + qcom,mdss-dsi-panel-hdr-color-primaries = <14880 15935 32435 + 16555 14945 30910 7790 3415>; + qcom,mdss-dsi-panel-peak-brightness = <5643000>; + qcom,mdss-dsi-panel-blackness-level = <6134>; qcom,config-select = <&dsi_dual_sharp_video_config0>; dsi_dual_sharp_video_config0: config0 { diff --git a/arch/arm/boot/dts/qcom/mdm9640.dtsi b/arch/arm/boot/dts/qcom/mdm9640.dtsi index aa5d02c8c48c7..7ad58e56b7943 100644 --- a/arch/arm/boot/dts/qcom/mdm9640.dtsi +++ b/arch/arm/boot/dts/qcom/mdm9640.dtsi @@ -858,6 +858,7 @@ qcom,cnss { compatible = "qcom,cnss"; + wlan-en-gpio = <&tlmm_pinmux 95 0>; vdd-wlan-supply = <&wlan_vreg>; vdd-wlan-io-supply = <&pmd9635_l6>; vdd-wlan-sp2t-supply = <&pmd9635_l12>; diff --git a/arch/arm/boot/dts/qcom/mdmcalifornium.dtsi b/arch/arm/boot/dts/qcom/mdmcalifornium.dtsi index a4b799a9f7bc5..84452b7ef2621 100644 --- a/arch/arm/boot/dts/qcom/mdmcalifornium.dtsi +++ b/arch/arm/boot/dts/qcom/mdmcalifornium.dtsi @@ -879,6 +879,7 @@ cnss_pcie: qcom,cnss { compatible = "qcom,cnss"; + wlan-en-gpio = <&tlmm_pinmux 95 0>; vdd-wlan-supply = <&rome_vreg>; vdd-wlan-xtal-supply = <&pmdcalifornium_l5>; vdd-wlan-io-supply = <&pmdcalifornium_l6>; diff --git a/arch/arm/boot/dts/qcom/msm-audio.dtsi b/arch/arm/boot/dts/qcom/msm-audio.dtsi index ee732f71cce41..2e2eada23234f 100644 --- a/arch/arm/boot/dts/qcom/msm-audio.dtsi +++ b/arch/arm/boot/dts/qcom/msm-audio.dtsi @@ -317,17 +317,19 @@ qcom,msm-mclk-freq = <9600000>; qcom,msm-mbhc-hphl-swh = <0>; qcom,msm-mbhc-gnd-swh = <0>; - qcom,msm-hs-micbias-type = "external"; + qcom,msm-hs-micbias-type = "internal"; + ext-spk-amp-gpio = <&tlmm 124 0>; + headset-gpio = <&tlmm 129 0>; qcom,msm-micbias1-ext-cap; qcom,audio-routing = "RX_BIAS", "MCLK", "SPK_RX_BIAS", "MCLK", "INT_LDO_H", "MCLK", "MIC BIAS External", "Handset Mic", - "MIC BIAS External2", "Headset Mic", + "MIC BIAS Internal2", "Headset Mic", "MIC BIAS External", "Secondary Mic", "AMIC1", "MIC BIAS External", - "AMIC2", "MIC BIAS External2", + "AMIC2", "MIC BIAS Internal2", "AMIC3", "MIC BIAS External", "WSA_SPK OUT", "VDD_WSA_SWITCH", "SpkrMono WSA_IN", "WSA_SPK OUT"; diff --git a/arch/arm/boot/dts/qcom/msm-pm8937.dtsi b/arch/arm/boot/dts/qcom/msm-pm8937.dtsi index e523cbdfb5dce..b12393cc423e4 100644 --- a/arch/arm/boot/dts/qcom/msm-pm8937.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pm8937.dtsi @@ -35,10 +35,15 @@ "resin-bark", "kpdpwr-resin-bark"; qcom,pon-dbc-delay = <15625>; qcom,system-reset; + qcom,store-hard-reset-reason; qcom,pon_1 { qcom,pon-type = <0>; qcom,pull-up = <1>; + qcom,support-reset = <1>; + qcom,s1-timer = <4480>; + qcom,s2-timer = <2000>; + qcom,s2-type = <7>; linux,code = <116>; }; diff --git a/arch/arm/boot/dts/qcom/msm-pm8953-rpm-regulator.dtsi b/arch/arm/boot/dts/qcom/msm-pm8953-rpm-regulator.dtsi index 2db90e29a82f1..874027bbc16a2 100644 --- a/arch/arm/boot/dts/qcom/msm-pm8953-rpm-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pm8953-rpm-regulator.dtsi @@ -226,13 +226,13 @@ qcom,resource-id = <10>; qcom,regulator-type = <0>; qcom,hpm-min-load = <10000>; - status = "disabled"; + status = "okay"; regulator-l10 { compatible = "qcom,rpm-smd-regulator"; regulator-name = "pm8953_l10"; qcom,set = <3>; - status = "disabled"; + status = "okay"; }; }; diff --git a/arch/arm/boot/dts/qcom/msm-pm8953.dtsi b/arch/arm/boot/dts/qcom/msm-pm8953.dtsi index 7fad9be18b27d..d247da0d82cff 100644 --- a/arch/arm/boot/dts/qcom/msm-pm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pm8953.dtsi @@ -35,10 +35,15 @@ "resin-bark", "kpdpwr-resin-bark"; qcom,pon-dbc-delay = <15625>; qcom,system-reset; + qcom,store-hard-reset-reason; qcom,pon_1 { qcom,pon-type = <0>; qcom,pull-up = <1>; + qcom,support-reset = <1>; + qcom,s1-timer = <4480>; + qcom,s2-timer = <2000>; + qcom,s2-type = <7>; linux,code = <116>; }; diff --git a/arch/arm/boot/dts/qcom/msm-pm8994.dtsi b/arch/arm/boot/dts/qcom/msm-pm8994.dtsi index c913f53ce9ae4..719ae7a561f1e 100644 --- a/arch/arm/boot/dts/qcom/msm-pm8994.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pm8994.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2015, 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 @@ -49,6 +49,7 @@ qcom,pon-dbc-delay = <15625>; qcom,system-reset; qcom,store-hard-reset-reason; + qcom,kpdpwr-sw-debounce; qcom,pon_1 { qcom,pon-type = <0>; diff --git a/arch/arm/boot/dts/qcom/msm-pmi8940.dtsi b/arch/arm/boot/dts/qcom/msm-pmi8940.dtsi index 618daeb8c3796..d1b84d6add533 100644 --- a/arch/arm/boot/dts/qcom/msm-pmi8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pmi8940.dtsi @@ -493,6 +493,7 @@ qcom,sync-dly-us = <800>; qcom,fs-curr-ua = <20000>; qcom,en-phase-stag; + qcom,en-cabc; qcom,led-strings-list = [00 01]; qcom,en-ext-pfet-sc-pro; qcom,cons-sync-write-delay-us = <1000>; @@ -529,7 +530,7 @@ qcom,max-current = <1000>; qcom,duration = <1280>; qcom,id = <0>; - qcom,current = <625>; + qcom,current = <1000>; }; pmi8940_flash1: qcom,flash_1 { @@ -540,7 +541,7 @@ qcom,max-current = <1000>; qcom,duration = <1280>; qcom,id = <1>; - qcom,current = <625>; + qcom,current = <800>; }; pmi8940_torch0: qcom,torch_0 { @@ -560,7 +561,7 @@ "torch1_trigger"; qcom,max-current = <200>; qcom,id = <1>; - qcom,current = <120>; + qcom,current = <75>; }; pmi8940_switch: qcom,switch { @@ -587,13 +588,12 @@ vcc_pon-supply = <&pon_perph_reg>; qcom,play-mode = "direct"; qcom,wave-play-rate-us = <5263>; - qcom,actuator-type = "lra"; + qcom,actuator-type = "erm"; qcom,wave-shape = "square"; - qcom,vmax-mv = <2000>; + qcom,vmax-mv = <2900>; qcom,ilim-ma = <800>; qcom,sc-deb-cycles = <8>; qcom,int-pwm-freq-khz = <505>; - qcom,en-brake; qcom,brake-pattern = [03 03 00 00]; qcom,use-play-irq; qcom,use-sc-irq; diff --git a/arch/arm/boot/dts/qcom/msm-pmi8950.dtsi b/arch/arm/boot/dts/qcom/msm-pmi8950.dtsi index 25244c0506e53..7d18b019f490e 100644 --- a/arch/arm/boot/dts/qcom/msm-pmi8950.dtsi +++ b/arch/arm/boot/dts/qcom/msm-pmi8950.dtsi @@ -215,7 +215,6 @@ qcom,pmic-revid = <&pmi8950_revid>; qcom,force-aicl-rerun; qcom,aicl-rerun-period-s = <180>; - qcom,autoadjust-vfloat; qcom,chgr@1000 { reg = <0x1000 0x100>; @@ -528,6 +527,7 @@ qcom,hyb-thres = <625>; qcom,sync-dly-us = <800>; qcom,fs-curr-ua = <20000>; + qcom,en-cabc; qcom,led-strings-list = [00 01]; qcom,en-ext-pfet-sc-pro; qcom,cons-sync-write-delay-us = <1000>; @@ -585,7 +585,7 @@ "torch0_trigger"; qcom,max-current = <200>; qcom,id = <0>; - qcom,current = <120>; + qcom,current = <100>; }; pmi8950_torch1: qcom,torch_1 { @@ -595,7 +595,16 @@ "torch1_trigger"; qcom,max-current = <200>; qcom,id = <1>; - qcom,current = <120>; + qcom,current = <100>; + }; + pmi8950_torch2: qcom,torch_2 { + label = "torch"; + qcom,led-name = "flashlight"; + qcom,default-led-trigger = + "torch2_trigger"; + qcom,max-current = <200>; + qcom,id = <1>; + qcom,current = <100>; }; pmi8950_switch: qcom,switch { @@ -624,11 +633,10 @@ qcom,wave-play-rate-us = <5263>; qcom,actuator-type = "erm"; qcom,wave-shape = "square"; - qcom,vmax-mv = <2000>; + qcom,vmax-mv = <2700>; qcom,ilim-ma = <800>; qcom,sc-deb-cycles = <8>; qcom,int-pwm-freq-khz = <505>; - qcom,en-brake; qcom,brake-pattern = [03 03 00 00]; qcom,use-play-irq; qcom,use-sc-irq; diff --git a/arch/arm/boot/dts/qcom/msm8909-ion.dtsi b/arch/arm/boot/dts/qcom/msm8909-ion.dtsi index 662c14c484cf1..55be22bd454b7 100644 --- a/arch/arm/boot/dts/qcom/msm8909-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8909-ion.dtsi @@ -21,11 +21,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@27 { /* QSEECOM HEAP */ reg = <27>; memory-region = <&venus_qseecom_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8917-audio-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8917-audio-cdp.dtsi index dfb33a59f1d53..b402c85561dbe 100644 --- a/arch/arm/boot/dts/qcom/msm8917-audio-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-audio-cdp.dtsi @@ -13,7 +13,7 @@ &int_codec { status = "okay"; - qcom,msm-hs-micbias-type = "internal"; + qcom,msm-hs-micbias-type = "external"; asoc-wsa-codec-names = "wsa881x-i2c-codec.2-000f"; asoc-wsa-codec-prefixes = "SpkrMono"; diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-pinctrl.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-pinctrl.dtsi index a48b5dfc866f6..ce9315b0fa7d1 100644 --- a/arch/arm/boot/dts/qcom/msm8917-camera-pinctrl.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-camera-pinctrl.dtsi @@ -275,3 +275,16 @@ cam_sensor_front1_sleep: cam_sensor_front1_sleep { drive-strength = <2>; /* 2 MA */ }; }; + +SGM3780_default: SGM3780_default { + mux { + pins = "gpio90", "gpio93"; + function = "gpio"; + }; + + config { + pins = "gpio90", "gpio93"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88503.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88503.dtsi new file mode 100644 index 0000000000000..ebcdbb518ecbb --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88503.dtsi @@ -0,0 +1,459 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + +&soc { + flash_SGM3780:flashlight { + compatible = "qcom,leds-gpio-flash"; + status = "okay"; + pinctrl-names = "flash_default"; + pinctrl-0 = <&SGM3780_default>; + qcom,flash-en = <93>; + qcom,flash-now = <90>; + qcom,op-seq = "flash_en", "flash_now"; + qcom,torch-seq-val = <1 0>; + qcom,flash-seq-val = <0 1>; + linux,name = "flashlight"; + linux,default-trigger = "flashlight-trigger"; + }; + + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <3>; + qcom,flash-source = <&flash_SGM3780>; + qcom,torch-source = <&flash_SGM3780>; + }; + }; + +&cci { + actuator0: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + qcom,cci-master = <0>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + + eeprom0: qcom,eeprom@0 { + cell-index = <0>; + reg = <0x00>; + qcom,eeprom-name = "ov13850"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x20>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + qcom,page0 = <0 0x3d85 2 0x16 1 0>; + qcom,poll0 = <0 0x3d85 2 0x16 1 0>; + qcom,mem0 = <410 0x7220 2 0 1 1>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vana", + "cam_vio","cam_vdig", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 24000000 1 1>; + qcom,cam-power-seq-delay = <0 0 10 1 10 0>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom2: qcom,eeprom@2 { + cell-index = <2>; + reg = <0x02>; + qcom,eeprom-name = "s5k5e8_ofilm"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x20>; + qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <48 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom4: qcom,eeprom@4 { + cell-index = <4>; + reg = <0x04>; + qcom,eeprom-name = "s5k3l2"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xA0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x834 0x0 2 0 1 0>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vana", + "cam_vio","cam_vdig", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 24000000 1 1>; + qcom,cam-power-seq-delay = <0 0 10 1 10 0>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom5: qcom,eeprom@5{ + cell-index = <5>; + reg = <0x05>; + qcom,eeprom-name = "ov5675"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x6c>; + qcom,cci-master = <0>; + + qcom,num-blocks = <4>; + qcom,page0 = <1 0x3d88 2 7010 2 1>; + qcom,poll0 = <1 0x3d88 2 7010 2 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,poll1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,mem1 = <0 0x3d00 2 0 1 0>; + qcom,page2 = <1 0x3d85 2 0x6 1 1>; + qcom,poll2 = <1 0x3d85 2 0x6 1 1>; + qcom,mem2 = <0 0x3d00 2 0 1 0>; + qcom,page3 = <1 0x0100 2 0x1 1 1>; + qcom,pageen3 = <0 0x3d85 2 0x16 1 0>; + qcom,poll3 = <0 0x3d85 2 0x16 1 0>; + qcom,mem3 = <30 0x7010 2 0 1 1>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom6: qcom,eeprom@6 { + cell-index = <6>; + reg = <0x06>; + qcom,eeprom-name = "s5k5e8"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x30>; + qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <48 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + qcom,camera@0 { + cell-index = <0>; + compatible = "qcom,camera"; + reg = <0x0>; + qcom,csiphy-sd-index = <0>; + qcom,csid-sd-index = <0>; + qcom,mount-angle = <90>; + qcom,actuator-src = <&actuator0>; + qcom,led-flash-src = <&led_flash0>; + qcom,eeprom-src = <&eeprom0 &eeprom4>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep + &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,sensor-position = <0>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@2 { + cell-index = <2>; + compatible = "qcom,camera"; + reg = <0x01>; + qcom,csiphy-sd-index = <1>; + qcom,csid-sd-index = <1>; + qcom,eeprom-src = <&eeprom6 &eeprom5 &eeprom2>; + qcom,mount-angle = <270>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 0 2800000>; + qcom,cam-vreg-max-voltage = <1200000 0 2800000>; + qcom,cam-vreg-op-mode = <105000 0 80000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,sensor-position = <1>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88505.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88505.dtsi new file mode 100644 index 0000000000000..9312a920594df --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd-s88505.dtsi @@ -0,0 +1,405 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ +&soc { + flash_SGM3780:flashlight { + compatible = "qcom,leds-gpio-flash"; + status = "okay"; + pinctrl-names = "flash_default"; + pinctrl-0 = <&SGM3780_default>; + qcom,flash-en = <93>; + qcom,flash-now = <90>; + qcom,op-seq = "flash_en", "flash_now"; + qcom,torch-seq-val = <1 0>; + qcom,flash-seq-val = <0 1>; + linux,name = "flashlight"; + linux,default-trigger = "flashlight-trigger"; + }; + led_flash01: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <3>; + qcom,flash-source = <&flash_SGM3780>; + qcom,torch-source = <&flash_SGM3780>; + }; +}; +&cci { + actuator0: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + qcom,cci-master = <0>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + + eeprom0: qcom,eeprom@5 { + cell-index = <5>; + reg = <0x05>; + qcom,eeprom-name = "s5k3l8_ofilm_riva"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xa0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x848 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vana-supply = <&pm8917_l22>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 200000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "MCAM_RESET0", + "MCAM_STANDBY0"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 1 1 1 1 1 10 1>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom2: qcom,eeprom@2 { + cell-index = <2>; + reg = <0x02>; + qcom,eeprom-name = "s5k5e8_ofilm_riva"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x5a>; + qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <24 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vana-supply = <&pm8917_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <1 5 1 1 1 1 1 1 10>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + eeprom3: qcom,eeprom@3 { + cell-index = <3>; + reg = <0x03>; + qcom,eeprom-name = "s5k5e8_qtech_riva"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x5a>; + qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <24 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <1 5 1 1 1 1 1 1 10>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom4: qcom,eeprom@4 { + cell-index = <4>; + reg = <0x04>; + qcom,eeprom-name = "ov13855_qtech"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xa0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0xAE8 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vana-supply = <&pm8917_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 1 1 1 1 1 10 1>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@0 { + cell-index = <0>; + compatible = "qcom,camera"; + reg = <0x0>; + qcom,csiphy-sd-index = <0>; + qcom,csid-sd-index = <0>; + qcom,mount-angle = <90>; + qcom,actuator-src = <&actuator0>; + qcom,led-flash-src = <&led_flash0>; + qcom,eeprom-src = <&eeprom0 &eeprom4>; + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vana-supply = <&pm8917_l22>; + cam_vaf-supply = <&pm8917_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep + &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,sensor-position = <0>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@2 { + cell-index = <2>; + compatible = "qcom,camera"; + reg = <0x01>; + qcom,csiphy-sd-index = <1>; + qcom,csid-sd-index = <1>; + qcom,eeprom-src = <&eeprom2 &eeprom3>; + qcom,mount-angle = <270>; + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vana-supply = <&pm8917_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <105000 80000 80000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,sensor-position = <1>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi index 70d2d831f7242..b4167b81e8137 100644 --- a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-qrd.dtsi @@ -1,5 +1,6 @@ /* * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -10,6 +11,31 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ + +&soc { + flash_SGM3780:flashlight { + compatible = "qcom,leds-gpio-flash"; + status = "okay"; + pinctrl-names = "flash_default"; + pinctrl-0 = <&SGM3780_default>; + qcom,flash-en = <93>; + qcom,flash-now = <90>; + qcom,op-seq = "flash_en", "flash_now"; + qcom,torch-seq-val = <1 0>; + qcom,flash-seq-val = <0 1>; + linux,name = "flashlight"; + linux,default-trigger = "flashlight-trigger"; + }; + + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <3>; + qcom,flash-source = <&flash_SGM3780>; + qcom,torch-source = <&flash_SGM3780>; + }; +}; + &cci { actuator0: qcom,actuator@0 { cell-index = <0>; @@ -25,25 +51,40 @@ eeprom0: qcom,eeprom@0 { cell-index = <0>; + reg = <0x00>; + qcom,eeprom-name = "ov13850"; compatible = "qcom,eeprom"; + qcom,slave-addr = <0x20>; qcom,cci-master = <0>; - reg = <0x0>; + qcom,num-blocks = <4>; + qcom,page0 = <1 0x3d88 2 7010 2 1>; + qcom,poll0 = <1 0x3d88 2 7010 2 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,poll1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,mem1 = <0 0x3d00 2 0 1 0>; + qcom,page2 = <1 0x3d85 2 0x6 1 1>; + qcom,poll2 = <1 0x3d85 2 0x6 1 1>; + qcom,mem2 = <0 0x3d00 2 0 1 0>; + qcom,page3 = <1 0x0100 2 0x1 1 1>; + qcom,pageen3 = <0 0x3d85 2 0x16 1 0>; + qcom,poll3 = <0 0x3d85 2 0x16 1 0>; + qcom,mem3 = <478 0x7220 2 0 1 1>; cam_vdig-supply = <&pm8917_l23>; cam_vana-supply = <&pm8917_l22>; cam_vio-supply = <&pm8917_l6>; cam_vaf-supply = <&pm8917_l17>; qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", "cam_vaf"; - qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-op-mode = <200000 0 80000 100000>; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; pinctrl-names = "cam_default", "cam_suspend"; - pinctrl-0 = <&cam_sensor_mclk0_default - &cam_sensor_rear_default>; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; gpios = <&tlmm 26 0>, - <&tlmm 36 0>, - <&tlmm 35 0>; + <&tlmm 35 0>, + <&tlmm 36 0>; qcom,gpio-reset = <1>; qcom,gpio-standby = <2>; qcom,gpio-req-tbl-num = <0 1 2>; @@ -51,26 +92,180 @@ qcom,gpio-req-tbl-label = "CAMIF_MCLK0", "CAM_RESET0", "CAM_STANDBY0"; + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vana", + "cam_vio","cam_vdig", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 24000000 1 1>; + qcom,cam-power-seq-delay = <0 0 10 1 10 0>; status = "ok"; clocks = <&clock_gcc clk_mclk0_clk_src>, - <&clock_gcc clk_gcc_camss_mclk0_clk>; + <&clock_gcc clk_gcc_camss_mclk0_clk>; clock-names = "cam_src_clk", "cam_clk"; qcom,clock-rates = <19200000 0>; }; eeprom2: qcom,eeprom@2 { cell-index = <2>; - compatible = "qcom,eeprom"; reg = <0x02>; + qcom,eeprom-name = "s5k5e8_ofilm"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x20>; + qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <48 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom4: qcom,eeprom@4 { + cell-index = <4>; + reg = <0x04>; + qcom,eeprom-name = "s5k3l2"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xA0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x834 0x0 2 0 1 0>; cam_vdig-supply = <&pm8917_l23>; cam_vana-supply = <&pm8917_l22>; cam_vio-supply = <&pm8917_l6>; cam_vaf-supply = <&pm8917_l17>; qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", - "cam_vaf"; - qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-op-mode = <105000 0 80000 100000>; + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 35 0>, + <&tlmm 36 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vana", + "cam_vio","cam_vdig", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 24000000 1 1>; + qcom,cam-power-seq-delay = <0 0 10 1 10 0>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom5: qcom,eeprom@5{ + cell-index = <5>; + reg = <0x05>; + qcom,eeprom-name = "ov5675"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x6c>; + qcom,cci-master = <0>; + + qcom,num-blocks = <4>; + qcom,page0 = <1 0x3d88 2 7010 2 1>; + qcom,poll0 = <1 0x3d88 2 7010 2 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,poll1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,mem1 = <0 0x3d00 2 0 1 0>; + qcom,page2 = <1 0x3d85 2 0x6 1 1>; + qcom,poll2 = <1 0x3d85 2 0x6 1 1>; + qcom,mem2 = <0 0x3d00 2 0 1 0>; + qcom,page3 = <1 0x0100 2 0x1 1 1>; + qcom,pageen3 = <0 0x3d85 2 0x16 1 0>; + qcom,poll3 = <0 0x3d85 2 0x16 1 0>; + qcom,mem3 = <30 0x7010 2 0 1 1>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; qcom,gpio-no-mux = <0>; pinctrl-names = "cam_default", "cam_suspend"; pinctrl-0 = <&cam_sensor_mclk2_default @@ -87,7 +282,101 @@ qcom,gpio-req-tbl-label = "CAMIF_MCLK2", "CAM_RESET2", "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + + eeprom6: qcom,eeprom@6 { + cell-index = <6>; + reg = <0x06>; + qcom,eeprom-name = "s5k5e8"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x30>; qcom,cci-master = <0>; + + qcom,num-blocks = <5>; + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <48 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; status = "ok"; clocks = <&clock_gcc clk_mclk2_clk_src>, <&clock_gcc clk_gcc_camss_mclk2_clk>; @@ -103,25 +392,24 @@ qcom,csid-sd-index = <0>; qcom,mount-angle = <90>; qcom,actuator-src = <&actuator0>; - qcom,led-flash-src = <&led_flash0>; - qcom,eeprom-src = <&eeprom0>; + qcom,eeprom-src = <&eeprom0 &eeprom4>; cam_vdig-supply = <&pm8917_l23>; cam_vana-supply = <&pm8917_l22>; cam_vio-supply = <&pm8917_l6>; cam_vaf-supply = <&pm8917_l17>; qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", "cam_vaf"; - qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; - qcom,cam-vreg-op-mode = <200000 0 80000 100000>; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; pinctrl-names = "cam_default", "cam_suspend"; pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; gpios = <&tlmm 26 0>, - <&tlmm 36 0>, - <&tlmm 35 0>; + <&tlmm 35 0>, + <&tlmm 36 0>; qcom,gpio-reset = <1>; qcom,gpio-standby = <2>; qcom,gpio-req-tbl-num = <0 1 2>; @@ -144,7 +432,7 @@ reg = <0x01>; qcom,csiphy-sd-index = <1>; qcom,csid-sd-index = <1>; - qcom,eeprom-src = <&eeprom2>; + qcom,eeprom-src = <&eeprom6 &eeprom5 &eeprom2>; qcom,mount-angle = <270>; cam_vdig-supply = <&pm8917_l23>; cam_vana-supply = <&pm8917_l22>; diff --git a/arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi new file mode 100644 index 0000000000000..41b1f955108bd --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-camera-sensor-tmo.dtsi @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2016, 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. + */ +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8937_flash0>; + qcom,torch-source = <&pmi8937_torch0>; + qcom,switch-source = <&pmi8937_switch>; + }; +}; + +&pm8917_l22{ + regulator-max-microvolt = <2850000>; +}; + +&pm8917_l23{ + regulator-max-microvolt = <1600000>; +}; + +&tlmm{ + cam_sensor_rear_vreg_default: cam_sensor_rear_vreg_default { + /* VDIG */ + mux { + pins = "gpio62","gpio68","gpio129"; + function = "gpio"; + }; + + config { + pins = "gpio62","gpio68","gpio129"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_rear_vreg_sleep: cam_sensor_rear_vreg_sleep { + /* VDIG */ + mux { + pins = "gpio62","gpio68","gpio129"; + function = "gpio"; + }; + + config { + pins = "gpio62","gpio68","gpio129"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_front_vreg_default: cam_sensor_front_vreg_default { + /* VDIG */ + mux { + pins = "gpio96","gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio96","gpio68"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_front_vreg_sleep: cam_sensor_front_vreg_sleep { + /* VDIG */ + mux { + pins = "gpio96","gpio68"; + function = "gpio"; + }; + + config { + pins = "gpio96","gpio68"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; +}; + +&cci { + actuator0: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + qcom,cci-master = <0>; + cam_vaf-supply = <&pm8917_l22>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + + qcom,camera@0 { + cell-index = <0>; + compatible = "qcom,camera"; + reg = <0x0>; + qcom,csiphy-sd-index = <0>; + qcom,csid-sd-index = <0>; + qcom,mount-angle = <90>; + qcom,actuator-src = <&actuator0>; + qcom,led-flash-src = <&led_flash0>; + cam_vdig-supply = <&pm8917_l23>; + cam_vio-supply = <&pm8917_l6>; + cam_vaf-supply = <&pm8917_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 0 2850000>; + qcom,cam-vreg-max-voltage = <1200000 0 2850000>; + qcom,cam-vreg-op-mode = <200000 0 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default + &cam_sensor_rear_vreg_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep + &cam_sensor_rear_sleep + &cam_sensor_rear_vreg_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 36 0>, + <&tlmm 35 0>, + <&tlmm 68 0>, + <&tlmm 62 0>, + <&tlmm 129 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-vio = <3>; + qcom,gpio-vdig = <4>; + qcom,gpio-vana = <5>; + qcom,gpio-req-tbl-num = <0 1 2 3 4 5>; + qcom,gpio-req-tbl-flags = <1 0 0 0 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0", + "CAM_GPIO_VIO", + "CAM_GPIO_VDIG", + "CAM_GPIO_VANA"; + qcom,sensor-position = <0>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@2 { + cell-index = <2>; + compatible = "qcom,camera"; + reg = <0x01>; + qcom,csiphy-sd-index = <1>; + qcom,csid-sd-index = <1>; + qcom,mount-angle = <270>; + cam_vdig-supply = <&pm8917_l23>; + cam_vana-supply = <&pm8917_l22>; + cam_vio-supply = <&pm8917_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1500000 0 2800000>; + qcom,cam-vreg-max-voltage = <1500000 0 2800000>; + qcom,cam-vreg-op-mode = <105000 0 80000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default + &cam_sensor_front_vreg_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep + &cam_sensor_front_vreg_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>, + <&tlmm 68 0>, + <&tlmm 96 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-vio = <3>; + qcom,gpio-vana = <4>; + qcom,gpio-req-tbl-num = <0 1 2 3 4>; + qcom,gpio-req-tbl-flags = <1 0 0 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2", + "CAM_GPIO_VIO", + "CAM_GPIO_VANA"; + qcom,sensor-position = <1>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-cpu.dtsi b/arch/arm/boot/dts/qcom/msm8917-cpu.dtsi index 4cba7fbeec939..c825df3cb7b05 100644 --- a/arch/arm/boot/dts/qcom/msm8917-cpu.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-cpu.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -162,35 +162,35 @@ }; qcom,l1_i_cache100 { qcom,dump-node = <&L1_I_100>; - qcom,dump-id = <0x64>; + qcom,dump-id = <0x60>; }; qcom,l1_i_cache101 { qcom,dump-node = <&L1_I_101>; - qcom,dump-id = <0x65>; + qcom,dump-id = <0x61>; }; qcom,l1_i_cache102 { qcom,dump-node = <&L1_I_102>; - qcom,dump-id = <0x66>; + qcom,dump-id = <0x62>; }; qcom,l1_i_cache103 { qcom,dump-node = <&L1_I_103>; - qcom,dump-id = <0x67>; + qcom,dump-id = <0x63>; }; qcom,l1_d_cache100 { qcom,dump-node = <&L1_D_100>; - qcom,dump-id = <0x84>; + qcom,dump-id = <0x80>; }; qcom,l1_d_cache101 { qcom,dump-node = <&L1_D_101>; - qcom,dump-id = <0x85>; + qcom,dump-id = <0x81>; }; qcom,l1_d_cache102 { qcom,dump-node = <&L1_D_102>; - qcom,dump-id = <0x86>; + qcom,dump-id = <0x82>; }; qcom,l1_d_cache103 { qcom,dump-node = <&L1_D_103>; - qcom,dump-id = <0x87>; + qcom,dump-id = <0x83>; }; }; }; diff --git a/arch/arm/boot/dts/qcom/msm8917-ion.dtsi b/arch/arm/boot/dts/qcom/msm8917-ion.dtsi index 0ee9575f8065c..5af5e39e6e5c8 100644 --- a/arch/arm/boot/dts/qcom/msm8917-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-ion.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, 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 @@ -22,11 +22,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@8 { /* CP_MM HEAP */ reg = <8>; memory-region = <&secure_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8917-pinctrl.dtsi b/arch/arm/boot/dts/qcom/msm8917-pinctrl.dtsi index 6617e1aafefa1..89079ae9a1ac9 100644 --- a/arch/arm/boot/dts/qcom/msm8917-pinctrl.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-pinctrl.dtsi @@ -1,5 +1,6 @@ /* * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -68,7 +69,53 @@ }; }; }; - + smb_int_pin { + pins = "gpio61"; + qcom,num-grp-pins = <1>; + qcom,pin-func = <0>; + label = "smb_int_gpio"; + smb_int_default: smb_int_default { + drive-strength = <2>; /*8 MA */ + bias-pull-up; /* PULL UP*/ + }; + }; + bq_int_default: bq_int_default { + mux { + pins = "gpio25"; + function ="gpio"; + }; + config { + pins = "gpio25"; + drive-strength = <2>; /* 2 MA */ + bias-pull-up; + /* PULL UP*/ + }; + }; + tps65132_en_default: tps65132_en_default { + mux { + pins = "gpio126", "gpio127"; + function = "gpio"; + }; + config { + pins = "gpio126", "gpio127"; + drive-strength = <2>; + bias-pull-down; + }; + }; + gpio_led_pins { + gpio_led_off: gpio_led_off { + mux { + pins = "gpio45"; + function = "gpio"; + }; + config { + pins = "gpio45"; + drive-strength = <6>; + bias-pull-down; + output-low; + }; + }; + }; pmx_ts_reset_suspend { ts_reset_suspend: ts_reset_suspend { mux { @@ -871,24 +918,24 @@ pri-tlmm-lines { pri_tlmm_lines_act: pri_tlmm_lines_act { mux { - pins = "gpio85", "gpio88"; + pins = /*"gpio85", */"gpio88"; function = "pri_mi2s"; }; config { - pins = "gpio85", "gpio88"; + pins = /*"gpio85", */"gpio88"; drive-strength = <8>; }; }; pri_tlmm_lines_sus: pri_tlmm_lines_sus { mux { - pins = "gpio85", "gpio88"; + pins = /*"gpio85", */"gpio88"; function = "pri_mi2s"; }; config { - pins = "gpio85", "gpio88"; + pins = /*"gpio85", */"gpio88"; drive-strength = <2>; bias-pull-down; }; @@ -981,7 +1028,65 @@ }; }; }; + spi7 { + spi7_default: spi7_default { + /* active state */ + mux { + /* MOSI, MISO, CLK */ + pins = "gpio85", "gpio86", "gpio88"; + function = "blsp_spi7"; + }; + config { + pins = "gpio85", "gpio86", "gpio88"; + drive-strength = <12>; /* 12 MA */ + bias-disable = <0>; /* No PULL */ + }; + }; + + spi7_sleep: spi7_sleep { + /* suspended state */ + mux { + /* MOSI, MISO, CLK */ + pins = "gpio85", "gpio86", "gpio88"; + function = "gpio"; + }; + + config { + pins = "gpio85", "gpio86", "gpio88"; + drive-strength = <2>; /* 2 MA */ + bias-pull-down; /* PULL Down */ + }; + }; + + spi7_cs0_active: cs0_active { + /* CS */ + mux { + pins = "gpio87"; + function = "blsp_spi7"; + }; + + config { + pins = "gpio87"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + + spi7_cs0_sleep: cs0_sleep { + /* CS */ + mux { + pins = "gpio87"; + function = "gpio"; + }; + + config { + pins = "gpio87"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + }; i2c_2 { i2c_2_active: i2c_2_active { /* active state */ @@ -1007,7 +1112,7 @@ config { pins = "gpio6", "gpio7"; drive-strength = <2>; - bias-disable; + bias-pull-down; }; }; }; @@ -1182,12 +1287,12 @@ usbc_int_default: usbc_int_default { mux { - pins = "gpio97", "gpio131"; + pins = /*"gpio97",*/ "gpio131"; function = "gpio"; }; config { - pins = "gpio97", "gpio131"; + pins = /*"gpio97",*/ "gpio131"; drive-strength = <2>; bias-pull-up; }; diff --git a/arch/arm/boot/dts/qcom/msm8917-pm.dtsi b/arch/arm/boot/dts/qcom/msm8917-pm.dtsi index 20b5af542202d..1cf7cee0d0ae2 100644 --- a/arch/arm/boot/dts/qcom/msm8917-pm.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-pm.dtsi @@ -202,6 +202,7 @@ <0xff 155>, /* sdc1_irq(0) */ <0xff 157>, /* sdc2_irq(0) */ <0xff 167>, /* bam_irq(0) */ + <0xff 168>, <0xff 170>, /* sdc1_pwr_cmd_irq */ <0xff 173>, /* o_wcss_apss_smd_hi */ <0xff 174>, /* o_wcss_apss_smd_med */ @@ -235,8 +236,13 @@ <0xff 239>, /* crypto_bam_irq[1]*/ <0xff 240>, /* summary_irq_kpss */ <0xff 253>, /* sdcc_pwr_cmd_irq */ + <0xff 260>, /* ipa_irq[0] */ + <0xff 261>, /* ipa_irq[2] */ + <0xff 262>, /* ipa_bam_irq[0] */ + <0xff 263>, /* ipa_bam_irq[2] */ <0xff 269>, /* rpm_wdog_expired_irq */ <0xff 270>, /* blsp1_bam_irq[0] */ + <0xff 271>, /* sps interrupt */ <0xff 272>, /* smmu_intr_bus[17] */ <0xff 273>, /* smmu_bus_intr[18] */ <0xff 274>, /* smmu_bus_intr[19] */ diff --git a/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dts b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dts new file mode 100644 index 0000000000000..68989f098a838 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2016, 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. + */ + +/dts-v1/; + +#include "msm8917.dtsi" +#include "msm8917-pmi8937-qrd-sku5_S88503.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8917-PMI8937 QRD SKU5"; + compatible = "qcom,msm8917-qrd-sku5", "qcom,msm8917-qrd", + "qcom,msm8917", "qcom,qrd"; + qcom,board-id= <0x1000b 1>, <0x2000b 1>; +}; + +&int_codec { + qcom,model = "msm8917-sku5-snd-card"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dtsi b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dtsi new file mode 100644 index 0000000000000..928e626ce5b4f --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88503.dtsi @@ -0,0 +1,437 @@ +/* + * Copyright (c) 2016, 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 "msm8917-qrd.dtsi" +#include "msm8937-mdss-panels.dtsi" +#include "dsi-panel-hx8394f-boe-c3a-720p-video.dtsi" +#include "dsi-panel-nt35521s-ebbg-c3a-720p-video.dtsi" + +#include "dsi-panel-ili9881c-ebbg-c3a-720p-video.dtsi" + +#include "msm8917-qrd_S88503.dtsi" +#include "msm8917-camera-sensor-qrd-s88503.dtsi" + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_boe_720_vid>; + qcom,dsi-pref-sub-pan = <&dsi_nt35521s_ebbg_720_video>; + + qcom,dsi-pref-sub1-pan = <&dsi_ili9881c_ebbg_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active>; + pinctrl-1 = <&mdss_dsi_suspend>; + qcom,platform-te-gpio = <&tlmm 24 0>; + qcom,platform-reset-gpio = <&tlmm 60 0>; + lab-supply = <&tps65132_pos>; + ibb-supply = <&tps65132_neg>; + + qcom,regulator-ldo-mode; + qcom,platform-regulator-settings = [ 00 01 01 00 20 07 00]; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <5000000>; + qcom,supply-max-voltage = <5000000>; + qcom,supply-enable-load = <200>; + qcom,supply-disable-load = <0>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <5000000>; + qcom,supply-max-voltage = <5000000>; + qcom,supply-enable-load = <40>; + qcom,supply-disable-load = <0>; + qcom,supply-post-off-sleep = <3>; + }; +}; +&dsi_hx8394f_boe_720_vid { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; +&dsi_nt35521s_ebbg_720_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + + + + +&dsi_ili9881c_ebbg_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&soc { + i2c@78b6000 { /* i2c 2 */ + aw2013@45 { /*blink */ + compatible = "awinc,aw2013"; + reg = <0x45>; + rgb_led-supply = <&pm8917_l10>; + + red { + label = "red"; + linux,default-trigger = "battery-red"; + default-state = "off"; + retain-state-suspended; + }; + + green { + label = "green"; + linux,default-trigger = "battery-green"; + default-state = "off"; + retain-state-suspended; + }; + + blue { + label = "blue"; + linux,default-trigger = "battery-blue"; + default-state = "off"; + retain-state-suspended; + }; + white { + label = "white"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + yellow { + label = "yellow"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + cyan { + label = "cyan"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + purple { + label = "purple"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + }; +}; +gpio-leds { + compatible = "gpio-leds"; + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&gpio_led_off>; + + infred { + gpios = <&tlmm 45 0>; + label = "infrared"; + linux,default-trigger = "infra-red"; + default-state = "off"; + retain-state-suspended; + }; + + }; + gpio-vib { + compatible = "gpio-vibrator"; + vibrator { + gpios = <&tlmm 97 0>; + label = "vibrator"; + max_timeout = <50000>; + }; + }; +}; +&i2c_3 { /* BLSP1 QUP3 */ + status = "ok"; + ftech@38 { + compatible = "focaltech,5336"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + ftech,name = "ft5336"; + ftech,family-id = <0x36>; + ftech,reset-gpio = <&tlmm 64 0x00>; + ftech,irq-gpio = <&tlmm 65 0x2008>; + ftech,display-coords = <0 0 720 1280>; + ftech,panel-coords = <0 0 720 1280>; + ftech,virtual-key1 = <139 140 2000>;/*menu*/ + ftech,virtual-key2 = <172 360 2000>;/*home*/ + ftech,virtual-key3 = <158 580 2000>;/*back*/ + ftech,no-force-update; + ftech,i2c-pull-up; + ftech,group-id = <1>; + ftech,hard-reset-delay-ms = <20>; + ftech,soft-reset-delay-ms = <200>; + ftech,num-max-touches = <10>; + ftech,fw-delay-aa-ms = <30>; + ftech,fw-delay-55-ms = <30>; + ftech,fw-upgrade-id1 = <0x79>; + ftech,fw-upgrade-id2 = <0x18>; + ftech,fw-delay-readid-ms = <10>; + ftech,fw-delay-era-flsh-ms = <2000>; + ftech,fw-auto-cal; + ftech,ignore-id-check; + }; + goodix_ts@5d { + compatible = "goodix,gt9xx"; + reg = <0x5d>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd_ana-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + goodix,rst-gpio = <&tlmm 64 0x00>; + goodix,irq-gpio = <&tlmm 65 0x2008>; + goodix,cfg-group0 = [ + 41 D0 02 00 05 05 75 01 01 0F 24 + 0F 64 3C 03 05 00 00 00 02 00 00 + 00 16 19 1C 14 8C 0E 0E 24 00 31 + 0D 00 00 00 83 33 1D 00 41 00 00 + 00 00 00 08 0A 00 2B 1C 3C 94 D5 + 03 08 00 00 04 93 1E 00 82 23 00 + 74 29 00 69 2F 00 5F 37 00 5F 20 + 40 60 00 F0 40 30 55 50 27 00 00 + 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 14 19 00 00 + 50 50 02 04 06 08 0A 0C 0E 10 12 + 14 16 18 1A 1C 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 1D + 1E 1F 20 21 22 24 26 28 29 2A 1C + 18 16 14 13 12 10 0F 0C 0A 08 06 + 04 02 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 9C 01]; + }; + +}; + +&soc { + gen-vkeys_ft { + compatible = "qcom,gen-vkeys"; + label = "ft5346"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <2080>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; + gen-vkeys_gt { + compatible = "qcom,gen-vkeys_gt"; + label = "goodix-ts"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <2080>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; + +}; + +&i2c_2 { /* i2c 2 */ + tps65132@3e { + compatible = "ti,tps65132"; + reg = <0x3e>; + i2c-pwr-supply = <&pm8917_l5>; + ti,en-gpio-lpm; + pinctrl-names = "default"; + pinctrl-0 = <&tps65132_en_default>; + + regulators { + tps65132_pos: pos-boost { + regulator-name = "tps65132-pos"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + ti,discharge-enable; + ti,enable-time = <800>; + ti,current-limit = <200000>; + ti,en-gpio = <&tlmm 126 0>; + }; + + tps65132_neg: neg-boost { + regulator-name = "tps65132-neg"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + ti,discharge-enable; + ti,enable-time = <800>; + ti,current-limit = <40000>; + ti,en-gpio = <&tlmm 127 0>; + }; + }; + }; +}; + + + +&i2c_5 { + status = "ok"; + smb358_otg_vreg: smb358-charger@57 { + compatible = "qcom,smb358-charger"; + reg = <0x57>; + interrupt-parent = <&tlmm>; + interrupts = <61 0x0>; + pinctrl-names = "default"; + pinctrl-0 = <&smb_int_default>; + qcom,irq-gpio = <&tlmm 61 0x0>; + qcom,battid-gpio = <&pm8937_gpios 5 0>; + qcom,float-voltage-mv = <4400>; + qcom,recharge-mv = <50>; + regulator-name = "smb358_otg_vreg"; + qcom,thermal-mitigation = <1500 1000 700 700>; + qcom,fastchg-current-max-ma = <1500>; + qcom,bms-psy-name = "bms"; + + qcom,bms-controlled-charging; + qcom,chg-inhibit-disabled; + qcom,chg-vadc = <&pm8937_vadc>; + qcom,chg-adc_tm = <&pm8937_adc_tm>; + qcom,using-pmic-therm; + qcom,bat-present-decidegc = <(300)>; + qcom,disable-apsd; +/* + * Below properties are used for enable JEITA + */ + qcom,hot-bat-decidegc = <600>; + qcom,warm-bat-decidegc = <450>; + qcom,cool-bat-decidegc = <100>; + qcom,cold-bat-decidegc = <0>; + qcom,warm-bat-ma = <600>; + + qcom,cool-normal-bat-ma = <600>; + qcom,cool-cold-bat-ma = <300>; + qcom,iterm-ma = <150>; + qcom,warm-bat-mv = <4100>; + qcom,cool-bat-mv = <4400>; + + qcom,battery-fcc = <3030>; + status = "ok"; + }; + cw2015: cw2015@62 { + compatible = "cellwise,cw2015"; + reg = <0x62>; + vdd-supply = <&pm8917_l17>; + vcc_i2c-supply = <&pm8917_l5>; + interrupt-parent = <&tlmm>; + interrupts = <86 8>; + cw2015,irq-gpio=<86>; + }; +}; +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + }; +}; +&usb_otg { + + qcom,hsusb-otg-mode = <3>; + interrupts = <0 134 0>,<0 140 0>,<0 136 0>; + interrupt-names = "core_irq", "async_irq", "phy_irq"; + vbus_otg-supply = <&smb358_otg_vreg>; + qcom,hsusb-otg-phy-init-seq = + <0x39 0x81 0x37 0x82 0xffffffff>; +}; + +&pm8937_vadc{ + chan@13 { + label = "mpp4"; + reg = <0x13>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "absolute"; + qcom,scale-function = <0>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + }; +}; + +&pm8937_gpios { +gpio@c700 { + reg = <0xc700 0x100>; + qcom,pin-num = <8>; + qcom,mode = <1>; /*QPNP_PIN_MODE_DIG_OUT*/ + qcom,output-type = <0>; /*QPNP_PIN_OUT_BUF_CMOS*/ + qcom,invert = <0>; /*QPNP_PIN_INVERT_DISABLE*/ + qcom,pull = <5>; /*QPNP_PIN_PULL_NO*/ + qcom,vin-sel = <0>; /*QPNP_PIN_VIN2, VREG_S3A*/ + qcom,out-strength = <3>;/*QPNP_PIN_OUT_STRENGTH_MED*/ + qcom,src-sel = <5>; /*QPNP_PIN_SEL_FUNC_2*/ + qcom,master-en = <1>; /*Enable GPIO by default*/ + status = "ok"; + }; + gpio@c400 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; + + &pm8937_1{ + pm8937_pwm: pwm@bc00 { + status = "ok"; + compatible = "qcom,qpnp-pwm"; + reg = <0xbc00 0x100>; + reg-names = "qpnp-lpg-channel-base"; + qcom,channel-id = <0>; + qcom,supported-sizes = <6>, <9>; + qcom,force-pwm-size = <9>; + #pwm-cells = <2>; + }; + }; + +/ { +qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + qcom,rpull-up-kohm = <68>; + qcom,vref-batt-therm = <1800000>; + + #include "batterydata-wingtech-feimaotui_SONY-4v4-3030mah.dtsi" + #include "batterydata-wingtech-xingwangda_ATL-4v4-3030mah.dtsi" + + }; + +}; +&rpm_bus { + rpm-regulator-ldoa6 { + pm8917_l6: regulator-l6 { + regulator-always-on; + }; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dts b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dts new file mode 100644 index 0000000000000..04aa0b9b9fedc --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dts @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2016, 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. + */ + +/dts-v1/; + +#include "msm8917.dtsi" +#include "msm8917-pmi8937-qrd-sku5_S88505.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8917-PMI8937 QRD SKU5"; + compatible = "qcom,msm8917-qrd-sku5", "qcom,msm8917-qrd", + "qcom,msm8917", "qcom,qrd"; + qcom,board-id= <0x1000b 2>, <0x2000b 2>; +}; + +&int_codec { + qcom,model = "msm8917-sku5-snd-card"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dtsi b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dtsi new file mode 100644 index 0000000000000..758c8178d02d3 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-pmi8937-qrd-sku5_S88505.dtsi @@ -0,0 +1,442 @@ +/* + * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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 "msm8917-qrd.dtsi" +#include "msm8937-mdss-panels.dtsi" +#include "dsi-panel-hx8394f-boe-c3b-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbg-c3b-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbgDJN-c3b-720p-video.dtsi" +#include "dsi-panel-ili9881c-tianma-c3b-720p-video.dtsi" + +#include "msm8917-camera-sensor-qrd-s88505.dtsi" + +#include "msm8917-qrd_S88505.dtsi" + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_boe_720_vid>; + qcom,dsi-pref-sub-pan = <&dsi_ili9881c_ebbg_720p_video>; + qcom,dsi-pref-sub1-pan = <&dsi_ili9881c_ebbgDJN_720p_video>; + qcom,dsi-pref-sub2-pan = <&dsi_ili9881c_tianma_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active>; + pinctrl-1 = <&mdss_dsi_suspend>; + qcom,platform-te-gpio = <&tlmm 24 0>; + qcom,platform-reset-gpio = <&tlmm 60 0>; + lab-supply = <&tps65132_pos>; + ibb-supply = <&tps65132_neg>; + + qcom,regulator-ldo-mode; + qcom,platform-regulator-settings = [ 00 01 01 00 20 07 00]; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <5000000>; + qcom,supply-max-voltage = <5000000>; + qcom,supply-enable-load = <200>; + qcom,supply-disable-load = <0>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <5000000>; + qcom,supply-max-voltage = <5000000>; + qcom,supply-enable-load = <40>; + qcom,supply-disable-load = <0>; + qcom,supply-post-off-sleep = <3>; + }; +}; +&dsi_hx8394f_boe_720_vid { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ili9881c_ebbg_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ili9881c_ebbgDJN_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ili9881c_tianma_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + + +&soc { + i2c@78b7000 { + status = "ok"; + ftech@38 { + compatible = "focaltech,5336"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + ftech,name = "ft5336"; + ftech,family-id = <0x36>; + ftech,reset-gpio = <&tlmm 64 0x00>; + ftech,irq-gpio = <&tlmm 65 0x2008>; + ftech,display-coords = <0 0 720 1280>; + ftech,panel-coords = <0 0 720 1280>; + ftech,virtual-key1 = <139 140 2000>;/*menu*/ + ftech,virtual-key2 = <172 360 2000>;/*home*/ + ftech,virtual-key3 = <158 580 2000>;/*back*/ + ftech,no-force-update; + ftech,i2c-pull-up; + ftech,group-id = <1>; + ftech,hard-reset-delay-ms = <20>; + ftech,soft-reset-delay-ms = <200>; + ftech,num-max-touches = <10>; + ftech,fw-delay-aa-ms = <30>; + ftech,fw-delay-55-ms = <30>; + ftech,fw-upgrade-id1 = <0x79>; + ftech,fw-upgrade-id2 = <0x18>; + ftech,fw-delay-readid-ms = <10>; + ftech,fw-delay-era-flsh-ms = <2000>; + ftech,fw-auto-cal; + ftech,ignore-id-check; + }; + goodix_ts@5d { + compatible = "goodix,gt9xx"; + reg = <0x5d>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd_ana-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + goodix,rst-gpio = <&tlmm 64 0x00>; + goodix,irq-gpio = <&tlmm 65 0x2008>; + goodix,cfg-group0 = [ + 41 D0 02 00 05 05 75 01 01 0F 24 + 0F 64 3C 03 05 00 00 00 02 00 00 + 00 16 19 1C 14 8C 0E 0E 24 00 31 + 0D 00 00 00 83 33 1D 00 41 00 00 + 00 00 00 08 0A 00 2B 1C 3C 94 D5 + 03 08 00 00 04 93 1E 00 82 23 00 + 74 29 00 69 2F 00 5F 37 00 5F 20 + 40 60 00 F0 40 30 55 50 27 00 00 + 00 00 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 14 19 00 00 + 50 50 02 04 06 08 0A 0C 0E 10 12 + 14 16 18 1A 1C 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 00 00 1D + 1E 1F 20 21 22 24 26 28 29 2A 1C + 18 16 14 13 12 10 0F 0C 0A 08 06 + 04 02 00 00 00 00 00 00 00 00 00 + 00 00 00 00 00 00 00 00 9C 01]; + }; + + }; + + gen-vkeys { + compatible = "qcom,gen-vkeys"; + label = "ft5346"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <2080>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; + gen-vkeys_gt { + compatible = "qcom,gen-vkeys_gt"; + label = "goodix-ts"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <2080>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; + + i2c@78b6000 { /* i2c 2 */ + aw2013@45 { /*blink */ + compatible = "awinc,aw2013"; + reg = <0x45>; + rgb_led-supply = <&pm8917_l10>; + + red { + label = "red"; + linux,default-trigger = "battery-red"; + default-state = "off"; + retain-state-suspended; + }; + + green { + label = "green"; + linux,default-trigger = "battery-green"; + default-state = "off"; + retain-state-suspended; + }; + + blue { + label = "blue"; + linux,default-trigger = "battery-blue"; + default-state = "off"; + retain-state-suspended; + }; + white { + label = "white"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + yellow { + label = "yellow"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + cyan { + label = "cyan"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + purple { + label = "purple"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + }; +}; +gpio-vib { + compatible = "gpio-vibrator"; + vibrator { + gpios = <&tlmm 97 0>; + label = "vibrator"; + max_timeout = <50000>; + }; + }; +}; + + +&i2c_2 { /* i2c 2 */ + tps65132@3e { + compatible = "ti,tps65132"; + reg = <0x3e>; + i2c-pwr-supply = <&pm8917_l5>; + ti,en-gpio-lpm; + pinctrl-names = "default"; + pinctrl-0 = <&tps65132_en_default>; + + regulators { + tps65132_pos: pos-boost { + regulator-name = "tps65132-pos"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + ti,discharge-enable; + ti,enable-time = <800>; + ti,current-limit = <200000>; + ti,en-gpio = <&tlmm 126 0>; + }; + + tps65132_neg: neg-boost { + regulator-name = "tps65132-neg"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + ti,discharge-enable; + ti,enable-time = <800>; + ti,current-limit = <40000>; + ti,en-gpio = <&tlmm 127 0>; + }; + }; + }; +}; + + +&spi_7{ + status = "ok"; + spi_ir@1 { + compatible = "qcom,spi-msm-codec-slave"; + reg = <1>; + spi-max-frequency = <50000000>; + spi-cpol; + status = "ok"; + }; +}; + + +&i2c_5 { + status = "ok"; + +bq27426@55 { + compatible = "ti,bq27426"; + reg = <0x55>; + + vcc_i2c-supply = <&pm8917_l5>; + interrupt-parent = <&tlmm>; + interrupts = <25 2>; + qcom,battid-vadc = <&pm8937_vadc>; + pinctrl-names = "default"; + pinctrl-0 = <&bq_int_default>; +}; + +bq2560x_otg_supply: bq2560x@6B { + compatible = "ti,bq25601-charger"; + reg = <0x6B>; + interrupt-parent = <&tlmm>; + interrupts = <61 2>; + pinctrl-names = "default"; + pinctrl-0 = <&smb_int_default>; + + regulator-name = "bq2560x_otg_supply"; + vdd-supply = <&pm8917_l17>; + + + ti,bq2560x,chip-enable-gpio = <48>; + ti,bq2560x,usb-vlim = <4400>; + ti,bq2560x,usb-ilim = <500>; + ti,bq2560x,usb-vreg = <4400>; + ti,bq2560x,usb-ichg = <500>; + + ti,bq2560x,ta-vlim = <4400>; + ti,bq2560x,ta-ilim = <1000>; + ti,bq2560x,ta-vreg = <4400>; + ti,bq2560x,ta-ichg = <1500>; + qcom,thermal-mitigation = <1000 800 700 0>; + + ti,bq2560x,precharge-current = <256>; + ti,bq2560x,termination-current = <60>; + ti,bq2560x,boost-voltage = <4998>; + ti,bq2560x,boost-current = <500>; + ti,bq2560x,enable_term; + ti,bq2560x,stat-pin-ctrl = <0>; + ti,bq2560x,vac-ovp-threshold = <6500>; + + ti,bq2560x,jeita-hot-degc = <550>; + ti,bq2560x,jeita-warm-degc = <450>; + ti,bq2560x,jeita-cool-normal-degc = <150>; + ti,bq2560x,jeita-cold-cool-degc = <50>; + ti,bq2560x,jeita-cold-degc = <0>; + + ti,bq2560x,jeita-hot-hysteresis = <20>; + ti,bq2560x,jeita-cold-hysteresis = <10>; + + ti,bq2560x,jeita-cold-cool-ma = <300>; + ti,bq2560x,jeita-cool-normal-ma = <600>; + ti,bq2560x,jeita-cool-mv = <4400>; + ti,bq2560x,jeita-warm-ma = <1000>; + ti,bq2560x,jeita-warm-mv = <4100>; + + ti,bq2560x,software-jeita-supported; + }; +}; + +&pm8937_vadc { + chan@13 { + label = "mpp4"; + reg = <0x13>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "absolute"; + qcom,scale-function = <0>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + }; +}; + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + }; +}; +&usb_otg { + qcom,hsusb-otg-mode = <3>; + interrupts = <0 134 0>,<0 140 0>,<0 136 0>; + interrupt-names = "core_irq", "async_irq", "phy_irq"; + vbus_otg-supply = <&bq2560x_otg_supply>; + qcom,hsusb-otg-phy-init-seq = + <0x53 0x80 0x39 0x81 0x37 0x82 0xffffffff>; +}; +&pm8937_gpios { + gpio@c700 { + reg = <0xc700 0x100>; + qcom,pin-num = <8>; + qcom,mode = <1>; /*QPNP_PIN_MODE_DIG_OUT*/ + qcom,output-type = <0>; /*QPNP_PIN_OUT_BUF_CMOS*/ + qcom,invert = <0>; /*QPNP_PIN_INVERT_DISABLE*/ + qcom,pull = <5>; /*QPNP_PIN_PULL_NO*/ + qcom,vin-sel = <0>; /*QPNP_PIN_VIN2, VREG_S3A*/ + qcom,out-strength = <3>;/*QPNP_PIN_OUT_STRENGTH_MED*/ + qcom,src-sel = <5>; /*QPNP_PIN_SEL_FUNC_2*/ + qcom,master-en = <1>; /*Enable GPIO by default*/ + status = "ok"; + }; + gpio@c400 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; + + &pm8937_1{ + pm8937_pwm: pwm@bc00 { + status = "ok"; + compatible = "qcom,qpnp-pwm"; + reg = <0xbc00 0x100>; + reg-names = "qpnp-lpg-channel-base"; + qcom,channel-id = <0>; + qcom,supported-sizes = <6>, <9>; + qcom,force-pwm-size = <9>; + #pwm-cells = <2>; + }; + }; + +/ { +qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + qcom,rpull-up-kohm = <68>; + qcom,vref-batt-therm = <1800000>; + #include "batterydata-qrd-sku2-4v35-2590mah.dtsi" + #include "batterydata-wingtech-desai_SAMSUNG-4v4-4000mah.dtsi" + #include "batterydata-wingtech-feimaotui_SONY-4v4-4000mah.dtsi" + #include "batterydata-wingtech-xingwangda_ATL-4v4-4000mah.dtsi" + #include "batterydata-wingtech-guangyu_Coslight-4v4-4000mah.dtsi" + }; + +}; diff --git a/arch/arm/boot/dts/qcom/msm8917-qgp-tmo.dtsi b/arch/arm/boot/dts/qcom/msm8917-qgp-tmo.dtsi index 2c095c9e4c772..efb73168a9e93 100644 --- a/arch/arm/boot/dts/qcom/msm8917-qgp-tmo.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-qgp-tmo.dtsi @@ -13,6 +13,7 @@ #include "msm-pmi8937.dtsi" #include "msm8917-qrd.dtsi" +#include "msm8917-camera-sensor-tmo.dtsi" #include "msm8937-mdss-panels.dtsi" &pmi_haptic { @@ -89,9 +90,6 @@ debounce-interval = <15>; }; }; - - led_flash0: qcom,camera-flash { - }; }; &mdss_mdp { diff --git a/arch/arm/boot/dts/qcom/msm8917-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8917-qrd.dtsi index c0644c765e1b3..66e77fb5ef64d 100644 --- a/arch/arm/boot/dts/qcom/msm8917-qrd.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-qrd.dtsi @@ -12,7 +12,6 @@ */ #include "msm8917-pinctrl.dtsi" -#include "msm8917-camera-sensor-qrd.dtsi" &blsp1_uart2 { status = "ok"; @@ -25,6 +24,7 @@ vdd-supply = <&pm8917_l8>; qcom,vdd-voltage-level = <2900000 2900000>; qcom,vdd-current-level = <200 570000>; + qcom,vdd-always-on; /* device communication power supply */ vdd-io-supply = <&pm8917_l5>; diff --git a/arch/arm/boot/dts/qcom/msm8917-qrd_S88503.dtsi b/arch/arm/boot/dts/qcom/msm8917-qrd_S88503.dtsi new file mode 100644 index 0000000000000..25ee555dffa2d --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-qrd_S88503.dtsi @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2016, 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. + */ + +&int_codec { + status = "okay"; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-gpios = + "pri_i2s"; + qcom,pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-0 = <&cdc_pdm_lines_sus &cdc_pdm_lines_2_sus>; + pinctrl-1 = <&cdc_pdm_lines_act &cdc_pdm_lines_2_act>; + qcom,cdc-us-euro-gpios; + qcom,msm-hs-micbias-type = "internal"; + qcom,audio-routing = + "RX_BIAS", "MCLK", + "SPK_RX_BIAS", "MCLK", + "INT_LDO_H", "MCLK", + "MIC BIAS External", "Handset Mic", + "MIC BIAS Internal2", "Headset Mic", + "MIC BIAS External", "Secondary Mic", + "AMIC1", "MIC BIAS External", + "AMIC2", "MIC BIAS Internal2", + "AMIC3", "MIC BIAS External"; +}; + diff --git a/arch/arm/boot/dts/qcom/msm8917-qrd_S88505.dtsi b/arch/arm/boot/dts/qcom/msm8917-qrd_S88505.dtsi new file mode 100644 index 0000000000000..76e13b8cb4537 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8917-qrd_S88505.dtsi @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2016, 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. + */ + +&int_codec { + status = "okay"; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-gpios = + "pri_i2s"; + qcom,pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-0 = <&cdc_pdm_lines_sus &cdc_pdm_lines_2_sus>; + pinctrl-1 = <&cdc_pdm_lines_act &cdc_pdm_lines_2_act>; + qcom,cdc-us-euro-gpios; + ext-spk-amp-gpio; + qcom,msm-spk-ext-pa = <&tlmm 124 0>; + qcom,msm-hs-micbias-type = "internal"; + qcom,msm-micbias2-ext-cap; + qcom,audio-routing = + "RX_BIAS", "MCLK", + "SPK_RX_BIAS", "MCLK", + "INT_LDO_H", "MCLK", + "MIC BIAS External", "Handset Mic", + "MIC BIAS Internal2", "Headset Mic", + "MIC BIAS External", "Secondary Mic", + "AMIC1", "MIC BIAS External", + "AMIC2", "MIC BIAS Internal2", + "AMIC3", "MIC BIAS External"; +}; + diff --git a/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi index 996726ea5600d..43c11113423e7 100644 --- a/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917-regulator.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -372,7 +372,8 @@ qcom,override-acc-fuse-sel = <71 17 3 0>; qcom,override-fuse-version-map = <1>, <2>, - <3>; + <3>, + <4>; qcom,override-corner1-addr-val-map = /* 1st fuse version tuple matched */ /* SVS+ => SVS+ */ @@ -405,6 +406,17 @@ <(-1) (-1)>, /* SVS+ => TURBO/NOM+ */ < 3 0x1041041>, < 4 0x1041>, < 3 0x0>, + < 4 0x0>, + + /* 4th fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 3 0x1041043>, < 4 0x1041>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 3 0x1041041>, < 4 0x1041>, < 3 0x1>, < 4 0x0>; qcom,override-corner2-addr-val-map = @@ -430,7 +442,15 @@ /* NOM => NOM */ <(-1) (-1)>, <(-1) (-1)>, /* NOM => TURBO/NOM+ */ - < 3 0x0>, < 4 0x0>; + < 3 0x0>, < 4 0x0>, + + /* 4th fuse version tuple matched */ + /* NOM => SVS+ */ + < 3 0x30c30c3>, < 4 0x30c3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 3 0x1>, < 4 0x0>; qcom,override-corner3-addr-val-map = /* 1st fuse version tuple matched */ @@ -464,6 +484,17 @@ <(-1) (-1)>, /* TURBO/NOM+ => TURBO/NOM+ */ <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + + /* 4th fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 3 0x1041041>, < 4 0x1041>, < 3 0x30c30c3>, + < 4 0x30c3>, + /* TURBO/NOM+ => NOM */ + < 3 0x1041043>, < 4 0x1041>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>; }; @@ -537,18 +568,24 @@ qcom,cpr-fuse-revision = <69 39 3 0>; qcom,pvs-version-fuse-sel = <37 40 3 0>; /* foundry */ qcom,cpr-fuse-version-map = + < 1 0 3 (-1) (-1) (-1)>, + < 1 5 3 (-1) (-1) (-1)>, <(-1) 0 1 (-1) (-1) (-1)>, <(-1) 0 2 (-1) (-1) (-1)>, <(-1) 5 1 (-1) (-1) (-1)>, <(-1) 5 2 (-1) (-1) (-1)>, <(-1) (-1) (-1) (-1) (-1) (-1)>; qcom,cpr-quotient-adjustment = + <50 40 50>, + <0 0 40>, <50 40 100>, <50 40 50>, <0 0 100>, <0 0 50>, <0 0 0>; qcom,cpr-init-voltage-adjustment = + <30000 5000 10000>, + <0 0 0>, <30000 5000 35000>, <30000 5000 10000>, <0 0 20000>, diff --git a/arch/arm/boot/dts/qcom/msm8917.dtsi b/arch/arm/boot/dts/qcom/msm8917.dtsi index 9d28c350da9d7..e7a25b3191377 100644 --- a/arch/arm/boot/dts/qcom/msm8917.dtsi +++ b/arch/arm/boot/dts/qcom/msm8917.dtsi @@ -1,5 +1,6 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -40,6 +41,7 @@ smd21 = &smdtty_data21; smd36 = &smdtty_loopback; spi3 = &spi_3; + spi7 = &spi_7; i2c2 = &i2c_2; i2c5 = &i2c_5; i2c3 = &i2c_3; @@ -55,7 +57,7 @@ other_ext_mem: other_ext_region@0 { compatible = "removed-dma-pool"; no-map; - reg = <0x0 0x85b00000 0x0 0xd00000>; + reg = <0x0 0x84A00000 0x0 0x1E00000>; }; modem_mem: modem_region@0 { @@ -64,10 +66,16 @@ reg = <0x0 0x86800000 0x0 0x5000000>; }; - reloc_mem: reloc_region@0 { + adsp_fw_mem: adsp_fw_region@0 { compatible = "removed-dma-pool"; no-map; - reg = <0x0 0x8b800000 0x0 0x1800000>; + reg = <0x0 0x8b800000 0x0 0x1100000>; + }; + + wcnss_fw_mem: wcnss_fw_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x8c900000 0x0 0x700000>; }; venus_mem: venus_region@0 { @@ -83,7 +91,6 @@ reusable; alignment = <0 0x400000>; size = <0 0x7000000>; - status = "disabled"; }; qseecom_mem: qseecom_region@0 { @@ -393,7 +400,6 @@ qcom,freq-mitigation-temp = <105>; qcom,freq-mitigation-temp-hysteresis = <15>; qcom,freq-mitigation-value = <998400>; - qcom,therm-reset-temp = <115>; qcom,online-hotplug-core; qcom,synchronous-cluster-id = <1>; qcom,synchronous-cluster-map = <1 4 &CPU0 &CPU1 &CPU2 &CPU3>; @@ -552,6 +558,32 @@ dma-names = "tx", "rx"; }; + spi_7: spi@7af7000 { /* BLSP1 QUP3 */ + compatible = "qcom,spi-qup-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "spi_physical", "spi_bam_physical"; + reg = <0x7af7000 0x600>, + <0x7ac4000 0x1f000>; + interrupt-names = "spi_irq", "spi_bam_irq"; + interrupts = <0 301 0>, <0 239 0>; + spi-max-frequency = <50000000>; + pinctrl-names = "spi_default", "spi_sleep"; + pinctrl-0 = <&spi7_default &spi7_cs0_active>; + pinctrl-1 = <&spi7_sleep &spi7_cs0_sleep>; + clocks = <&clock_gcc clk_gcc_blsp2_ahb_clk>, + <&clock_gcc clk_gcc_blsp2_qup3_spi_apps_clk>; + clock-names = "iface_clk", "core_clk"; + qcom,use-bam; + qcom,use-pinctrl; + qcom,ver-reg-exists; + qcom,bam-consumer-pipe-index = <8>; + qcom,bam-producer-pipe-index = <9>; + qcom,master-id = <84>; + qcom,rt-priority; + status = "disabled"; + }; + rpm_bus: qcom,rpm-smd { compatible = "qcom,rpm-smd"; rpm-channel-name = "rpm_requests"; @@ -747,10 +779,10 @@ HSUSB_1p8-supply = <&pm8917_l7>; HSUSB_3p3-supply = <&pm8917_l13>; qcom,vdd-voltage-level = <0 1200000 1200000>; - vbus_otg-supply = <&smbcharger_charger_otg>; - + qcom,hsusb-otg-phy-init-seq = + <0x53 0x80 0x32 0x81 0x07 0x82 0x13 0x83 0xffffffff>; qcom,hsusb-otg-phy-type = <3>; /* SNPS Femto PHY */ - qcom,hsusb-otg-mode = <3>; /* OTG mode */ + qcom,hsusb-otg-mode = <1>; /* OTG mode */ qcom,hsusb-otg-otg-control = <2>; /* PMIC */ qcom,dp-manual-pullup; qcom,hsusb-otg-mpm-dpsehv-int = <49>; @@ -760,7 +792,7 @@ qcom,axi-prefetch-enable; qcom,enable-sdp-typec-current-limit; qcom,hsusb-otg-delay-lpm; - + qcom,hsusb-otg-default-mode = <1>; /* peripheral mode */ qcom,msm-bus,name = "usb2"; qcom,msm-bus,num-cases = <3>; qcom,msm-bus,num-paths = <1>; @@ -834,7 +866,8 @@ < 2929 /* 384 MHz */ >, < 4248 /* 556.8 MHz */ >, /*SVS+*/ < 4541 /* 595.2 MHz */ >, /*NOM*/ - < 5126 /* 672 MHz */ >; /*TURBO*/ + < 5126 /* 672 MHz */ >, /*NOM+*/ + < 5645 /* 740 MHz */ >; /*TURBO*/ }; mincpubw: qcom,mincpubw { @@ -849,7 +882,8 @@ < 2929 /* 384 MHz */ >, < 4248 /* 556.8 MHz */ >, < 4541 /* 595.2 MHz */ >, - < 5126 /* 672 MHz */ >; + < 5126 /* 672 MHz */ >, + < 5645 /* 740 MHz */ >; }; qcom,cpu-bwmon { @@ -867,7 +901,7 @@ cpu-to-dev-map = < 998400 4248 >, < 1094400 4541 >, - < 1497600 5126 >; + < 1497600 5645 >; }; mincpubw-cpufreq { @@ -908,7 +942,7 @@ label = "modem"; }; - qcom,client_3 { + mem_client_3_size: qcom,client_3 { compatible = "qcom,memshare-peripheral"; qcom,peripheral-size = <0x0>; qcom,client-id = <1>; @@ -1105,6 +1139,18 @@ }; }; + sn_fuse: snfuse@0xa0128 { + compatible = "qcom,sn-fuse"; + reg = <0xa0128 0x4>; + reg-names = "sn-base"; + }; + + sec_boot_fuse: secbootfuse@0xa41d0 { + compatible = "qcom,sec-boot-fuse"; + reg = <0xa41d0 0x4>; + reg-names = "sec-boot-base"; + }; + qcom,smdtty { compatible = "qcom,smdtty"; @@ -1246,6 +1292,8 @@ qcom,use-sw-aes-xts-algo; qcom,use-sw-aes-ccm-algo; qcom,use-sw-ahash-algo; + qcom,use-sw-hmac-algo; + qcom,use-sw-aead-algo; qcom,ce-opp-freq = <100000000>; }; @@ -1274,9 +1322,9 @@ qcom,ce-opp-freq = <100000000>; }; - qcom_seecom: qseecom@85b00000 { + qcom_seecom: qseecom@84A00000 { compatible = "qcom,qseecom"; - reg = <0x85b00000 0x800000>; + reg = <0x84A00000 0x1900000>; reg-names = "secapp-region"; qcom,hlos-num-ce-hw-instances = <1>; qcom,hlos-ce-hw-instance = <0>; @@ -1338,13 +1386,14 @@ qcom,fragmented-data; }; - qcom,bam_dmux@4044000 { + bam_dmux: qcom,bam_dmux@4044000 { compatible = "qcom,bam_dmux"; reg = <0x4044000 0x19000>; interrupts = ; qcom,rx-ring-size = <32>; qcom,max-rx-mtu = <4096>; qcom,fast-shutdown; + qcom,no-cpu-affinity; }; sdcc1_ice: sdcc1ice@7803000 { @@ -1386,12 +1435,12 @@ qcom,devfreq,freq-table = <50000000 200000000>; qcom,pm-qos-irq-type = "affine_irq"; - qcom,pm-qos-irq-latency = <13 281>; + qcom,pm-qos-irq-latency = <13 651>; qcom,pm-qos-cpu-groups = <0x0f>; - qcom,pm-qos-cmdq-latency-us = <13 281>; + qcom,pm-qos-cmdq-latency-us = <13 651>; - qcom,pm-qos-legacy-latency-us = <13 281>; + qcom,pm-qos-legacy-latency-us = <13 651>; qcom,msm-bus,name = "sdhc1"; qcom,msm-bus,num-cases = <9>; @@ -1430,10 +1479,10 @@ qcom,large-address-bus; qcom,pm-qos-irq-type = "affine_irq"; - qcom,pm-qos-irq-latency = <13 281>; + qcom,pm-qos-irq-latency = <13 651>; qcom,pm-qos-cpu-groups = <0x0f>; - qcom,pm-qos-legacy-latency-us = <13 281>; + qcom,pm-qos-legacy-latency-us = <13 651>; qcom,msm-bus,name = "sdhc2"; qcom,msm-bus,num-cases = <8>; @@ -1588,7 +1637,7 @@ /* GPIO output to lpass */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_2_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&adsp_fw_mem>; }; qcom,pronto@a21b000 { @@ -1626,7 +1675,7 @@ /* GPIO output to wcnss */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_4_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&wcnss_fw_mem>; }; qcom,venus@1de0000 { @@ -1760,6 +1809,7 @@ #size-cells = <0>; qcom,speed-bin = <0>; + qcom,initial-pwrlevel = <3>; /* TURBO */ qcom,gpu-pwrlevel@0 { @@ -1821,6 +1871,7 @@ #size-cells = <0>; qcom,speed-bin = <1>; + qcom,initial-pwrlevel = <3>; /* TURBO */ qcom,gpu-pwrlevel@0 { diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8937-mtp.dts b/arch/arm/boot/dts/qcom/msm8920-pmi8937-mtp.dts index cc97f7acf35e4..2ddb86b22e35d 100644 --- a/arch/arm/boot/dts/qcom/msm8920-pmi8937-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8937-mtp.dts @@ -22,3 +22,7 @@ qcom,board-id= <8 0>; qcom,pmic-id = <0x10019 0x020037 0x0 0x0>; }; + +&mem_client_3_size { + qcom,peripheral-size = <0x500000>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts new file mode 100644 index 0000000000000..0d8353297f1c5 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dts @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2016, 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. + */ + +/dts-v1/; + +#include "msm8920.dtsi" +#include "msm8920-pmi8940-qrd-sku7.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8920-PMI8940 QRD SKU7"; + compatible = "qcom,msm8920-qrd-sku7", "qcom,msm8920-qrd", + "qcom,msm8920", "qcom,qrd"; + qcom,board-id = <0x2000b 0>; + qcom,pmic-id = <0x10019 0x020040 0x0 0x0>; +}; + diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi new file mode 100644 index 0000000000000..e2f7a8666dcbe --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8940-qrd-sku7.dtsi @@ -0,0 +1,197 @@ +/* + * Copyright (c) 2016-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 "msm-pmi8940.dtsi" +#include "msm8920-qrd.dtsi" +#include "msm8937-mdss-panels.dtsi" +#include "msm8917-camera-sensor-qrd.dtsi" + +/ { + qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-qrd-sku2-4v35-2590mah.dtsi" + }; +}; + +&spmi_bus { + qcom,pmi8940@2 { + qcom,leds@a100 { + status = "okay"; + qcom,led_mpp_2 { + label = "mpp"; + linux,name = "green"; + linux,default-trigger = "none"; + qcom,default-state = "off"; + qcom,max-current = <40>; + qcom,current-setting = <5>; + qcom,id = <6>; + qcom,mode = "manual"; + qcom,source-sel = <1>; + qcom,mode-ctrl = <0x60>; + }; + }; + }; +}; + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8940_flash0>; + qcom,torch-source = <&pmi8940_torch0>; + qcom,switch-source = <&pmi8940_switch>; + }; + + i2c@78b7000 { + status = "ok"; + focaltech@38 { + compatible = "focaltech,5x06"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2>; + vdd-supply = <&pm8917_l10>; + vcc_i2c-supply = <&pm8917_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active", + "pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + focaltech,name = "ft5436"; + focaltech,family-id = <0x06>; + focaltech,reset-gpio = <&tlmm 64 0x0>; + focaltech,irq-gpio = <&tlmm 65 0x2008>; + focaltech,display-coords = <0 0 720 1280>; + focaltech,panel-coords = <0 0 720 1400>; + focaltech,button-map= <139 102 158>; + focaltech,no-force-update; + focaltech,i2c-pull-up; + focaltech,group-id = <1>; + focaltech,hard-reset-delay-ms = <20>; + focaltech,soft-reset-delay-ms = <200>; + focaltech,num-max-touches = <5>; + focaltech,fw-delay-aa-ms = <30>; + focaltech,fw-delay-55-ms = <30>; + focaltech,fw-upgrade-id1 = <0x79>; + focaltech,fw-upgrade-id2 = <0x08>; + focaltech,fw-delay-readid-ms = <10>; + focaltech,fw-delay-era-flsh-ms = <2000>; + focaltech,fw-auto-cal; + focaltech,ignore-id-check; + /* Underlying clocks used by secure touch */ + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup3_i2c_apps_clk>; + }; + }; + + gen-vkeys { + compatible = "qcom,gen-vkeys"; + label = "ft5x06_ts"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <1400>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; +}; + +&sdc2_data_on { + config { + drive-strength = <12>; + }; +}; + +&flash_led { + /delete-node/ qcom,flash_1; + /delete-node/ qcom,torch_1; +}; + +&pmi_haptic { + qcom,actuator-type = "erm"; +}; + +&pmi8940_charger { + qcom,battery-data = <&qrd_batterydata>; + qcom,float-voltage-mv = <4350>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + status = "okay"; +}; + +&pmi8940_fg { + qcom,battery-data = <&qrd_batterydata>; + qcom,cold-bat-decidegc = <(-100)>; + qcom,cool-bat-decidegc = <(-100)>; + qcom,hot-bat-decidegc = <550>; + qcom,warm-bat-decidegc = <550>; + qcom,bad-battery-detection-enable; + qcom,hold-soc-while-full; +}; + +&soc { + sound { + qcom,model = "msm8920-sku7-snd-card"; + }; +}; + +&i2c_2 { + pericom-type-c@1d { + status = "disabled"; + }; +}; + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + /delete-property/ lab-supply; + /delete-property/ ibb-supply; + /delete-property/ qcom,platform-te-gpio; + + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,platform-reset-gpio = <&tlmm 60 0>; +}; + +&labibb { + status = "disabled"; +}; + +&dsi_panel_pwr_supply { + /delete-node/ qcom,panel-supply-entry@2; + /delete-node/ qcom,panel-supply-entry@3; +}; + +&dsi_hx8394f_720p_video { + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&usb_otg { + qcom,hsusb-otg-phy-init-seq = + <0x39 0x81 0x37 0x82 0xffffffff>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8920-pmi8950-mtp.dts b/arch/arm/boot/dts/qcom/msm8920-pmi8950-mtp.dts index 4d9bdaaf20bac..be607e9425dbe 100644 --- a/arch/arm/boot/dts/qcom/msm8920-pmi8950-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8920-pmi8950-mtp.dts @@ -22,3 +22,7 @@ qcom,board-id= <8 0>; qcom,pmic-id = <0x10019 0x010011 0x0 0x0>; }; + +&mem_client_3_size { + qcom,peripheral-size = <0x500000>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi new file mode 100644 index 0000000000000..4a91431f0472e --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8920-qrd.dtsi @@ -0,0 +1,173 @@ +/* + * Copyright (c) 2016-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 "msm8917-pinctrl.dtsi" + +&soc { + gpio_keys { + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend"; + pinctrl-0 = <&gpio_key_active>; + pinctrl-1 = <&gpio_key_suspend>; + + vol_up { + label = "volume_up"; + gpios = <&tlmm 91 0x1>; + linux,input-type = <1>; + linux,code = <115>; + debounce-interval = <15>; + }; + }; +}; + +&wled { + qcom,cons-sync-write-delay-us = <1000>; +}; + +&int_codec { + status = "okay"; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-gpios = + "pri_i2s"; + qcom,pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-names = + "all_off", + "pri_i2s_act"; + pinctrl-0 = <&cdc_pdm_lines_sus &cdc_pdm_lines_2_sus>; + pinctrl-1 = <&cdc_pdm_lines_act &cdc_pdm_lines_2_act>; + qcom,cdc-us-euro-gpios; + qcom,msm-hs-micbias-type = "internal"; + qcom,audio-routing = + "RX_BIAS", "MCLK", + "SPK_RX_BIAS", "MCLK", + "INT_LDO_H", "MCLK", + "MIC BIAS External", "Handset Mic", + "MIC BIAS Internal2", "Headset Mic", + "MIC BIAS External", "Secondary Mic", + "AMIC1", "MIC BIAS External", + "AMIC2", "MIC BIAS Internal2", + "AMIC3", "MIC BIAS External"; +}; + + +&pm8937_cajon_dig { + status = "okay"; +}; + +&pm8937_cajon_analog { + status = "okay"; +}; + +&blsp1_uart2 { + status = "ok"; + pinctrl-names = "default"; + pinctrl-0 = <&uart_console_active>; +}; + +&sdhc_1 { + /* device core power supply */ + vdd-supply = <&pm8917_l8>; + qcom,vdd-voltage-level = <2900000 2900000>; + qcom,vdd-current-level = <200 570000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8917_l5>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <1800000 1800000>; + qcom,vdd-io-current-level = <200 325000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on &sdc1_rclk_on>; + pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off &sdc1_rclk_off>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 192000000 + 384000000>; + qcom,nonremovable; + qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v"; + + status = "ok"; +}; + +&sdhc_2 { + /* device core power supply */ + vdd-supply = <&pm8917_l11>; + qcom,vdd-voltage-level = <2950000 2950000>; + qcom,vdd-current-level = <15000 800000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8917_l12>; + qcom,vdd-io-voltage-level = <1800000 2950000>; + qcom,vdd-io-current-level = <200 22000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>; + pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>; + + #address-cells = <0>; + interrupt-parent = <&sdhc_2>; + interrupts = <0 1 2>; + #interrupt-cells = <1>; + interrupt-map-mask = <0xffffffff>; + interrupt-map = <0 &intc 0 125 0 + 1 &intc 0 221 0 + 2 &tlmm 67 0>; + interrupt-names = "hc_irq", "pwr_irq", "status_irq"; + cd-gpios = <&tlmm 67 0x1>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 + 200000000>; + qcom,bus-speed-mode = "SDR12", "SDR25", "SDR50", "DDR50", "SDR104"; + + status = "ok"; +}; + +&i2c_5 { /* BLSP2 QUP1 */ + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <&tlmm 17 0x00>; + qcom,nq-ven = <&tlmm 16 0x00>; + qcom,nq-firm = <&tlmm 130 0x00>; + qcom,nq-clkreq = <&pm8937_gpios 5 0x00>; + interrupt-parent = <&tlmm>; + qcom,clk-src = "BBCLK2"; + interrupts = <17 0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <&nfc_int_active &nfc_disable_active>; + pinctrl-1 = <&nfc_int_suspend &nfc_disable_suspend>; + clocks = <&clock_gcc clk_bb_clk2_pin>; + clock-names = "ref_clk"; + }; +}; + +&pm8937_gpios { + gpio@c400 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; + +&pm8937_vadc { + /delete-node/ chan@11; +}; diff --git a/arch/arm/boot/dts/qcom/msm8920.dtsi b/arch/arm/boot/dts/qcom/msm8920.dtsi index 98caed9797650..f8cc7d9a48f75 100644 --- a/arch/arm/boot/dts/qcom/msm8920.dtsi +++ b/arch/arm/boot/dts/qcom/msm8920.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -22,3 +22,377 @@ soc: soc { }; }; + +&modem_mem { + reg = <0x0 0x86800000 0x0 0x6a00000>; +}; + +&adsp_fw_mem { + reg = <0x0 0x8d200000 0x0 0x1100000>; +}; + +&wcnss_fw_mem { + reg = <0x0 0x8e300000 0x0 0x700000>; +}; + +&ad_hoc_bus { + mas_ipa: mas-ipa { + cell-id = ; + label = "mas-ipa"; + qcom,buswidth = <8>; + qcom,agg-ports = <1>; + qcom,ap-owned; + qcom,qport = <14>; + qcom,qos-mode = "fixed"; + qcom,connections = <&snoc_int_1 &slv_snoc_bimc_1>; + qcom,prio1 = <0>; + qcom,prio0 = <0>; + qcom,bus-dev = <&fab_snoc>; + qcom,mas-rpm-id = ; + }; +}; + +&clock_gcc { + compatible = "qcom,gcc-8920"; +}; + +&clock_debug { + compatible = "qcom,cc-debug-8920"; +}; + +&clock_gcc_mdss { + compatible = "qcom,gcc-mdss-8920"; +}; + +&usb_otg { + /delete-property/ clocks; + clocks = <&clock_gcc clk_gcc_usb_hs_ahb_clk>, + <&clock_gcc clk_gcc_usb_hs_system_clk>, + <&clock_gcc clk_gcc_usb2a_phy_sleep_clk>, + <&clock_gcc clk_bimc_usb_clk>, + <&clock_gcc clk_snoc_usb_clk>, + <&clock_gcc clk_pnoc_usb_clk>, + <&clock_gcc clk_gcc_qusb2_phy_clk>, + <&clock_gcc clk_gcc_usb2_hs_phy_only_clk>, + <&clock_gcc clk_gcc_usb_hs_phy_cfg_ahb_clk>, + <&clock_gcc clk_xo_otg_clk>; + + qcom,usbbam@78c4000 { + /delete-property/ qcom,reset-bam-on-disconnect; + /delete-node/ qcom,pipe0; + qcom,pipe0 { + label = "hsusb-ipa-out-0"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <0>; + qcom,pipe-num = <0>; + qcom,peer-bam = <1>; + qcom,src-bam-pipe-index = <1>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + qcom,pipe1 { + label = "hsusb-ipa-in-0"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <1>; + qcom,pipe-num = <0>; + qcom,peer-bam = <1>; + qcom,dst-bam-pipe-index = <0>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + qcom,pipe2 { + label = "hsusb-qdss-in-0"; + qcom,usb-bam-mem-type = <2>; + qcom,dir = <1>; + qcom,pipe-num = <0>; + qcom,peer-bam = <0>; + qcom,peer-bam-physical-address = <0x6044000>; + qcom,src-bam-pipe-index = <0>; + qcom,dst-bam-pipe-index = <2>; + qcom,data-fifo-offset = <0x0>; + qcom,data-fifo-size = <0xe00>; + qcom,descriptor-fifo-offset = <0xe00>; + qcom,descriptor-fifo-size = <0x200>; + }; + qcom,pipe3 { + label = "hsusb-dpl-ipa-in-1"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <1>; + qcom,pipe-num = <1>; + qcom,peer-bam = <1>; + qcom,dst-bam-pipe-index = <3>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + }; +}; + +&bam_dmux { + status = "disabled"; +}; + +&soc { + ipa_hw: qcom,ipa@07900000 { + compatible = "qcom,ipa"; + reg = <0x07900000 0x4effc>, <0x07904000 0x26934>; + reg-names = "ipa-base", "bam-base"; + interrupts = <0 228 0>, + <0 230 0>; + interrupt-names = "ipa-irq", "bam-irq"; + qcom,ipa-hw-ver = <6>; /* IPA core version = IPAv2.6L */ + qcom,ipa-hw-mode = <0>; /* IPA hw type = Normal */ + qcom,wan-rx-ring-size = <192>; /* IPA WAN-rx-ring-size*/ + qcom,lan-rx-ring-size = <192>; /* IPA LAN-rx-ring-size*/ + clock-names = "core_clk"; + clocks = <&clock_gcc clk_ipa_clk>; + qcom,ee = <0>; + qcom,use-ipa-tethering-bridge; + qcom,modem-cfg-emb-pipe-flt; + qcom,msm-bus,name = "ipa"; + qcom,msm-bus,num-cases = <3>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <90 512 0 0>, /* No BIMC vote (ab=0 Mbps, ib=0 Mbps ~ 0MHZ) */ + <90 512 100000 800000>, /* SVS (ab=100, ib=800 ~ 50MHz) */ + <90 512 100000 1200000>; /* PERF (ab=100, ib=1200 ~ 75MHz) */ + qcom,bus-vector-names = "MIN", "SVS", "PERF"; + qcom,rx-polling-sleep-ms = <2>; /* Polling sleep interval */ + qcom,ipa-polling-iteration = <5>; /* Polling Iteration */ + }; + + qcom,rmnet-ipa { + compatible = "qcom,rmnet-ipa"; + qcom,rmnet-ipa-ssr; + qcom,ipa-loaduC; + qcom,ipa-advertise-sg-support; + }; + + qcom,bm-sensors { + compatible = "qcom,bm-sensors"; + + bw_mm { + qcom,bm-sensor = <&slv_snoc_bimc_2 &mas_vfe0 &mas_vfe1>; + qcom,bm-sensor-field = "ab"; + }; + }; + + qcom,sensor-information { + sensor_information16: qcom,sensor-information-16 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "bw_mm"; + qcom,scaling-factor = <1000>; + }; + }; + + cpubw: qcom,cpubw { + qcom,bw-tbl = + < 769 /* 100.8 MHz */ >, + < 1611 /* 211.2 MHz */ >, + < 2270 /* 297.6 MHz */ >, /*SVS */ + < 2929 /* 384 MHz */ >, + < 4248 /* 556.8 MHz */ >, /*SVS+*/ + < 4541 /* 595.2 MHz */ >, /*NOM*/ + < 5126 /* 672 MHz */ >, /*NOM+*/ + < 5645 /* 740 MHz */ >; /*TURBO*/ + }; + + mincpubw: qcom,mincpubw { + qcom,bw-tbl = + < 769 /* 100.8 MHz */ >, + < 1611 /* 211.2 MHz */ >, + < 2270 /* 297.6 MHz */ >, + < 2929 /* 384 MHz */ >, + < 4248 /* 556.8 MHz */ >, + < 4541 /* 595.2 MHz */ >, + < 5126 /* 672 MHz */ >, + < 5645 /* 740 MHz */ >; + }; + + devfreq-cpufreq { + cpubw-cpufreq { + cpu-to-dev-map = + < 998400 4248 >, + < 1094400 4541 >, + < 1497600 5645 >; + }; + + }; + +}; + +&apc_vreg_corner { + /delete-property/ qcom,cpr-fuse-version-map; + /delete-property/ qcom,cpr-quotient-adjustment; + /delete-property/ qcom,cpr-init-voltage-adjustment; + /delete-property/ qcom,cpr-enable; + + qcom,cpr-speed-bin-max-corners = + <0 (-1) 1 2 4>, + <1 (-1) 1 2 5>; + + qcom,cpr-fuse-version-map = + /* Format: */ + < 0 0 1 (-1) (-1) (-1)>, + < 0 0 (-1) (-1) (-1) (-1)>, + < 0 1 1 (-1) (-1) (-1)>, + < 0 1 (-1) (-1) (-1) (-1)>, + < 0 5 (-1) (-1) (-1) (-1)>, + <(-1) (-1) (-1) (-1) (-1) (-1)>; + + qcom,cpr-init-voltage-adjustment = + < 0 0 0 >, + <15000 15000 25000>, + < 0 0 0 >, + <15000 5000 0 >, + < 5000 10000 5000>, + < 0 0 0 >; + + qcom,cpr-quotient-adjustment = + <(-19) (-28) (-19)>, /* SVSP(-10) NOM(-15) TUR(-10); KV(1.9) */ + <0 0 19 >, /* SVSP(-5) NOM(-10) TUR(-5); KV(1.9) */ + <(-38) (-28) (-38)>, /* SVSP(-20) NOM(-15) TUR(-20); KV(1.9) */ + <0 0 0 >, + <(-28) 0 10 >, /* SVSP(-15) TUR(5); KV(1.9) */ + <0 0 0 >; + + qcom,cpr-enable; +}; + +&funnel_apss { + coresight-child-ports = <3>; +}; + +&soc { + /delete-node/ cti@6124000; + cti_modem_cpu0: cti@6128000 { + compatible = "arm,coresight-cti"; + reg = <0x6128000 0x1000>; + reg-names = "cti-base"; + + coresight-id = <51>; + coresight-name = "coresight-cti-modem-cpu0"; + coresight-nr-inports = <0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + /* MSS_SCL */ + modem_etm0 { + coresight-child-ports = <2>; + }; + + cti_modem_cpu1: cti@6124000 { + compatible = "arm,coresight-cti"; + reg = <0x6124000 0x1000>; + reg-names = "cti-base"; + + coresight-id = <52>; + coresight-name = "coresight-cti-modem-cpu1"; + coresight-nr-inports = <0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + /* MSS_VEC */ + modem_etm1 { + compatible = "qcom,coresight-remote-etm"; + + coresight-id = <53>; + coresight-name = "coresight-modem-etm1"; + coresight-nr-inports = <0>; + coresight-outports = <0>; + coresight-child-list = <&funnel_right>; + coresight-child-ports = <1>; + + qcom,inst-id = <11>; + }; +}; + +&funnel_apss { + coresight-child-ports = <3>; +}; + +&soc { + /delete-node/ cti@6124000; + cti_modem_cpu0: cti@6128000 { + compatible = "arm,coresight-cti"; + reg = <0x6128000 0x1000>; + reg-names = "cti-base"; + + coresight-id = <51>; + coresight-name = "coresight-cti-modem-cpu0"; + coresight-nr-inports = <0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + /* MSS_SCL */ + modem_etm0 { + coresight-child-ports = <2>; + }; + + cti_modem_cpu1: cti@6124000 { + compatible = "arm,coresight-cti"; + reg = <0x6124000 0x1000>; + reg-names = "cti-base"; + + coresight-id = <52>; + coresight-name = "coresight-cti-modem-cpu1"; + coresight-nr-inports = <0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + /* MSS_VEC */ + modem_etm1 { + compatible = "qcom,coresight-remote-etm"; + + coresight-id = <53>; + coresight-name = "coresight-modem-etm1"; + coresight-nr-inports = <0>; + coresight-outports = <0>; + coresight-child-list = <&funnel_right>; + coresight-child-ports = <1>; + + qcom,inst-id = <11>; + }; +}; + +/* gpubw overrides */ +&gpubw { + /delete-property/ qcom,bw-tbl; + qcom,bw-tbl = + < 0 >, /* Off */ + < 769 >, /* 1. DDR:100.80 MHz BIMC: 201.60 MHz */ + < 1611>, /* 2. DDR:211.20 MHz BIMC: 422.40 MHz */ + < 2270>, /* 3. DDR:297.60 MHz BIMC: 595.20 MHz */ + < 2929>, /* 4. DDR:384.00 MHz BIMC: 768.00 MHz */ + < 4248>, /* 5. DDR:556.80 MHz BIMC: 1113.60 MHz */ + < 4541>, /* 6. DDR:595.20 MHz BIMC: 1190.40 MHz */ + < 5126>, /* 7. DDR:672.00 MHz BIMC: 1344.00 MHz */ + < 5639>; /* 8. DDR:739.20 MHz BIMC: 1478.40 MHz */ +}; + +/* GPU overrides */ +&msm_gpu { + + /delete-property/ qcom,msm-bus,vectors-KBps; + qcom,msm-bus,vectors-KBps = + <26 512 0 0>, /* off */ + <26 512 0 806400>, /* 1. 100.80 MHz */ + <26 512 0 1689600>, /* 2. 211.20 MHz */ + <26 512 0 2380800>, /* 3. 297.60 MHz */ + <26 512 0 3072000>, /* 4. 384.00 MHz */ + <26 512 0 4454400>, /* 5. 556.80 MHz */ + <26 512 0 4761600>, /* 6. 595.20 MHz */ + <26 512 0 5376000>, /* 7. 672.00 MHz */ + <26 512 0 5913600>; /* 8. 739.20 MHz */ +}; diff --git a/arch/arm/boot/dts/qcom/msm8937-audio-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8937-audio-cdp.dtsi index f4245f212975c..be24d3d789fd5 100644 --- a/arch/arm/boot/dts/qcom/msm8937-audio-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-audio-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, 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 @@ -13,7 +13,7 @@ &int_codec { status = "okay"; - qcom,msm-hs-micbias-type = "internal"; + qcom,msm-hs-micbias-type = "external"; asoc-wsa-codec-names = "wsa881x-i2c-codec.2-000f"; asoc-wsa-codec-prefixes = "SpkrMono"; diff --git a/arch/arm/boot/dts/qcom/msm8937-audio.dtsi b/arch/arm/boot/dts/qcom/msm8937-audio.dtsi index 8a2dd86562e23..0c2adc6f3214c 100644 --- a/arch/arm/boot/dts/qcom/msm8937-audio.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-audio.dtsi @@ -17,7 +17,7 @@ qcom,model = "msm8952-snd-card-mtp"; qcom,cdc-us-euro-gpios = <&tlmm 63 0>; - qcom,msm-mbhc-hphl-swh = <0>; + qcom,msm-mbhc-hphl-swh = <1>; qcom,msm-mbhc-gnd-swh = <0>; qcom,msm-hs-micbias-type = "external"; qcom,msm-micbias1-ext-cap; diff --git a/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi index c7e702c5b64ed..ab83251c8f576 100644 --- a/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-camera-sensor-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -36,6 +36,18 @@ qcom,cam-vreg-op-mode = <80000>; }; + actuator2: qcom,actuator@2 { + cell-index = <2>; + reg = <0x2>; + compatible = "qcom,actuator"; + qcom,cci-master = <1>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + eeprom0: qcom,eeprom@0 { cell-index = <0>; compatible = "qcom,eeprom"; @@ -151,6 +163,41 @@ qcom,clock-rates = <19200000 0>; }; + eeprom2: qcom,eeprom@2 { + cell-index = <2>; + compatible = "qcom,eeprom"; + qcom,cci-master = <1>; + reg = <0x2>; + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vana", "cam_vio", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 0 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_default + &cam_sensor_front_default>; + pinctrl-1 = <&cam_sensor_mclk1_sleep &cam_sensor_front_sleep>; + gpios = <&tlmm 27 0>, + <&tlmm 38 0>, + <&tlmm 50 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1", + "CAM_STANDBY1"; + status = "ok"; + clocks = <&clock_gcc clk_mclk1_clk_src>, + <&clock_gcc clk_gcc_camss_mclk1_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + qcom,camera@0 { cell-index = <0>; compatible = "qcom,camera"; @@ -204,6 +251,8 @@ qcom,csiphy-sd-index = <1>; qcom,csid-sd-index = <1>; qcom,mount-angle = <90>; + qcom,actuator-src = <&actuator2>; + qcom,eeprom-src = <&eeprom2>; cam_vdig-supply = <&pm8937_l23>; cam_vana-supply = <&pm8937_l22>; cam_vio-supply = <&pm8937_l6>; diff --git a/arch/arm/boot/dts/qcom/msm8937-camera-sensor-qrd-wt88536.dtsi b/arch/arm/boot/dts/qcom/msm8937-camera-sensor-qrd-wt88536.dtsi new file mode 100644 index 0000000000000..0e217d8ec3123 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8937-camera-sensor-qrd-wt88536.dtsi @@ -0,0 +1,425 @@ +/* + * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ +&cci { + actuator0: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + qcom,cci-master = <0>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + + eeprom0: qcom,eeprom@0 { + cell-index = <0>; + reg = <0x00>; + qcom,eeprom-name = "s5k3l8_ofilm"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xB0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x7E9 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 200000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 36 0>, + <&tlmm 35 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "MCAM_RESET0", + "MCAM_STANDBY0"; + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vio", + "cam_vana", "cam_vdig", "cam_vaf", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 1 24000000 0 0 1 1>; + qcom,cam-power-seq-delay = <1 1 5 1 10 5 5 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom1: qcom,eeprom@1 { + cell-index = <1>; + reg = <0x01>; + qcom,eeprom-name = "s5k3l8_sunny"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xB0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x7E9 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 200000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 36 0>, + <&tlmm 35 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "MCAM_RESET0", + "MCAM_STANDBY0"; + + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vio", + "cam_vana", "cam_vdig", "cam_vaf", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 1 24000000 0 0 1 1>; + qcom,cam-power-seq-delay = <1 1 5 5 10 5 5 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom2: qcom,eeprom@2{ + cell-index = <2>; + reg = <0x02>; + qcom,eeprom-name = "ov5675_ofilm"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x6c>; + qcom,cci-master = <0>; + qcom,num-blocks = <4>; + + qcom,page0 = <1 0x3d88 2 7010 2 1>; + qcom,poll0 = <1 0x3d88 2 7010 2 1>; + qcom,mem0 = <0 0x7010 2 0 1 1>; + qcom,page1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,poll1 = <1 0x3d8a 2 0x710f 2 1>; + qcom,mem1 = <0 0x7010 2 0 1 1>; + qcom,page2 = <1 0x3d85 2 0x6 1 1>; + qcom,poll2 = <1 0x3d85 2 0x6 1 1>; + qcom,mem2 = <0 0x7010 2 0 1 1>; + qcom,page3 = <1 0x0100 2 0x1 1 1>; + qcom,poll3 = <0 0x0100 2 0x1 1 1>; + qcom,mem3 = <0x18 0x7010 2 0 1 1>; + + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom3: qcom,eeprom@3{ + cell-index = <3>; + reg = <0x03>; + qcom,eeprom-name = "s5k5e8_sunny"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x5a>; + qcom,cci-master = <0>; + qcom,num-blocks = <5>; + + qcom,page0 = <1 0x0A00 2 0x04 1 1>; + qcom,poll0 = <0 0x0A00 2 0x04 1 1>; + qcom,mem0 = <0 0x0 2 0 1 0>; + qcom,page1 = <1 0x0A02 2 0x04 1 1>; + qcom,poll1 = <0 0x0A02 2 0x04 2 1>; + qcom,mem1 = <0 0x0 2 0 1 0>; + qcom,page2 = <1 0x0A00 2 0x01 1 1>; + qcom,poll2 = <0 0x0A00 2 0x01 1 1>; + qcom,mem2 = <24 0x0A04 2 0 1 1>; + qcom,page3 = <1 0x0A00 2 0x04 1 1>; + qcom,poll3 = <0 0x0A00 2 0x04 1 1>; + qcom,mem3 = <0 0x0 2 0 1 0>; + qcom,page4 = <1 0x0A00 2 0x00 1 1>; + qcom,poll4 = <0 0x0A00 2 0x00 1 0>; + qcom,mem4 = <0 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000>; + qcom,cam-vreg-op-mode = <200000 80000 100000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_gpio", + "sensor_clk", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_gpio"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_cam_mclk", + "cam_vdig", + "cam_vana", + "cam_vio", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <0 0 24000000 1 1 1 1 1>; + qcom,cam-power-seq-delay = <5 5 10 1 1 1 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + eeprom4: qcom,eeprom@4 { + cell-index = <4>; + reg = <0x04>; + qcom,eeprom-name = "ov13855_sunny"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xB0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x7E9 0x0 2 0 1 0>; + + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 200000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 36 0>, + <&tlmm 35 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "MCAM_RESET0", + "MCAM_STANDBY0"; + + qcom,cam-power-seq-type = "sensor_vreg", + "sensor_vreg", "sensor_vreg", "sensor_vreg", + "sensor_clk", + "sensor_gpio", "sensor_gpio", + "sensor_gpio", "sensor_gpio"; + qcom,cam-power-seq-val = "cam_vio", + "cam_vana", "cam_vdig", "cam_vaf", + "sensor_cam_mclk", + "sensor_gpio_reset", + "sensor_gpio_standby", + "sensor_gpio_reset", + "sensor_gpio_standby"; + qcom,cam-power-seq-cfg-val = <1 1 1 1 24000000 0 0 1 1>; + qcom,cam-power-seq-delay = <1 1 5 5 10 5 5 5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@0 { + cell-index = <0>; + compatible = "qcom,camera"; + reg = <0x0>; + qcom,csiphy-sd-index = <0>; + qcom,csid-sd-index = <0>; + qcom,mount-angle = <90>; + qcom,actuator-src = <&actuator0>; + qcom,led-flash-src = <&led_flash0>; + qcom,eeprom-src = <&eeprom0 &eeprom1 &eeprom4>; + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + cam_vaf-supply = <&pm8937_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 80000 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep + &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 36 0>, + <&tlmm 35 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0", + "CAM_STANDBY0"; + qcom,sensor-position = <0>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@2 { + cell-index = <2>; + compatible = "qcom,camera"; + reg = <0x02>; + qcom,csiphy-sd-index = <1>; + qcom,csid-sd-index = <1>; + qcom,eeprom-src = <&eeprom2 &eeprom3>; + qcom,mount-angle = <90>; + cam_vdig-supply = <&pm8937_l23>; + cam_vana-supply = <&pm8937_l22>; + cam_vio-supply = <&pm8937_l6>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 0 2800000>; + qcom,cam-vreg-max-voltage = <1200000 0 2800000>; + qcom,cam-vreg-op-mode = <105000 0 80000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 40 0>, + <&tlmm 39 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK2", + "CAM_RESET2", + "CAM_STANDBY2"; + qcom,sensor-position = <1>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8937-camera.dtsi b/arch/arm/boot/dts/qcom/msm8937-camera.dtsi index 00a7efd42dbb0..b66fd891667b5 100644 --- a/arch/arm/boot/dts/qcom/msm8937-camera.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-camera.dtsi @@ -35,13 +35,11 @@ <&clock_gcc clk_csi0phytimer_clk_src>, <&clock_gcc clk_gcc_camss_csi0phytimer_clk>, <&clock_gcc clk_camss_top_ahb_clk_src>, - <&clock_gcc clk_gcc_camss_csi0phy_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", - "camss_ahb_src", "csi_phy_clk", - "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 200000000 0 0 0 0>; + "camss_ahb_src", "camss_ahb_clk"; + qcom,clock-rates = <0 61540000 200000000 0 0 0>; }; qcom,csiphy@1b35000 { @@ -58,13 +56,11 @@ <&clock_gcc clk_csi1phytimer_clk_src>, <&clock_gcc clk_gcc_camss_csi1phytimer_clk>, <&clock_gcc clk_camss_top_ahb_clk_src>, - <&clock_gcc clk_gcc_camss_csi1phy_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", - "camss_ahb_src", "csi_phy_clk", - "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 200000000 0 0 0 0>; + "camss_ahb_src", "camss_ahb_clk"; + qcom,clock-rates = <0 61540000 200000000 0 0 0>; }; qcom,csid@1b30000 { @@ -81,15 +77,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi0_ahb_clk>, <&clock_gcc clk_csi0_clk_src>, + <&clock_gcc clk_gcc_camss_csi0phy_clk>, <&clock_gcc clk_gcc_camss_csi0_clk>, <&clock_gcc clk_gcc_camss_csi0pix_clk>, <&clock_gcc clk_gcc_camss_csi0rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi0_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,csid@1b30400 { @@ -106,15 +104,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi1_ahb_clk>, <&clock_gcc clk_csi1_clk_src>, + <&clock_gcc clk_gcc_camss_csi1phy_clk>, <&clock_gcc clk_gcc_camss_csi1_clk>, <&clock_gcc clk_gcc_camss_csi1pix_clk>, <&clock_gcc clk_gcc_camss_csi1rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi1_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,csid@1b30800 { @@ -131,15 +131,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi2_ahb_clk>, <&clock_gcc clk_csi2_clk_src>, + <&clock_gcc clk_gcc_camss_csi2phy_clk>, <&clock_gcc clk_gcc_camss_csi2_clk>, <&clock_gcc clk_gcc_camss_csi2pix_clk>, <&clock_gcc clk_gcc_camss_csi2rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi2_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,ispif@1b31000 { diff --git a/arch/arm/boot/dts/qcom/msm8937-ion.dtsi b/arch/arm/boot/dts/qcom/msm8937-ion.dtsi index 0ee9575f8065c..5af5e39e6e5c8 100644 --- a/arch/arm/boot/dts/qcom/msm8937-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-ion.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, 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 @@ -22,11 +22,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@8 { /* CP_MM HEAP */ reg = <8>; memory-region = <&secure_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8937-pinctrl.dtsi b/arch/arm/boot/dts/qcom/msm8937-pinctrl.dtsi index 63b7b94ffafd7..367891ded11e3 100644 --- a/arch/arm/boot/dts/qcom/msm8937-pinctrl.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-pinctrl.dtsi @@ -49,7 +49,20 @@ }; }; - + gpio_led_pins { + gpio_led_off: gpio_led_off { + mux { + pins = "gpio45"; + function = "gpio"; + }; + config { + pins = "gpio45"; + drive-strength = <6>; + bias-disable; + output-high; + }; + }; + }; i2c_2 { i2c_2_active: i2c_2_active { /* active state */ @@ -289,7 +302,102 @@ }; }; }; + fpc_spi_active: fpc_spi_active{ + mux { + pins = "gpio20", "gpio21", "gpio22", "gpio23"; + function = "blsp_spi6"; + }; + config { + pins = "gpio20", "gpio21", "gpio22", "gpio23"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + fpc_reset_reset: fpc_reset_reset{ + mux { + pins = "gpio8"; + function = "gpio"; + }; + config { + pins = "gpio8"; + drive-strength = <2>; + bias-disable = <0>; + output-low; + }; + }; + fpc_reset_active: fpc_reset_active{ + mux { + pins = "gpio8"; + function = "gpio"; + }; + config { + pins = "gpio8"; + drive-strength = <2>; + bias-disable = <0>; + output-high; + }; + }; + fpc_irq_active: fpc_irq_active { + mux { + pins = "gpio9"; + function = "gpio"; + }; + config { + pins = "gpio9"; + drive-strength = <2>; + bias-disable = <0>; + input-enable; + }; + }; + goodix_spi_active: goodix_spi_active{ + mux { + pins = "gpio20", "gpio21", "gpio22", "gpio23"; + function = "blsp_spi6"; + }; + config { + pins = "gpio20", "gpio21", "gpio22", "gpio23"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + goodix_reset_reset: goodix_reset_reset{ + mux { + pins = "gpio8"; + function = "gpio"; + }; + config { + pins = "gpio8"; + drive-strength = <2>; + bias-disable = <0>; + output-low; + }; + }; + goodix_reset_active: goodix_reset_active{ + mux { + pins = "gpio8"; + function = "gpio"; + }; + config { + pins = "gpio8"; + drive-strength = <2>; + bias-disable = <0>; + output-high; + }; + }; + + goodix_irq_active: goodix_irq_active { + mux { + pins = "gpio9"; + function = "gpio"; + }; + config { + pins = "gpio9"; + drive-strength = <2>; + bias-disable = <0>; + input-enable; + }; + }; wcnss_pmux_5wire { /* Active configuration of bus pins */ wcnss_default: wcnss_default { diff --git a/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi index 7d2a6c9b92720..34f425a975137 100644 --- a/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-pmi8950-mtp.dtsi @@ -14,6 +14,9 @@ #include "msm-pmi8950.dtsi" #include "msm8937-mtp.dtsi" #include "msm8937-audio-mtp.dtsi" +#include "dsi-panel-hx8394f-boe-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbg-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi" &soc { led_flash0: qcom,camera-flash { @@ -44,9 +47,31 @@ qcom,chg-led-support; }; +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + &mdss_dsi0 { lab-supply = <&lab_regulator>; ibb-supply = <&ibb_regulator>; + + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_boe_720_vid>; + qcom,dsi-pref-sub-pan = <&dsi_ili9881c_ebbg_720p_video>; + qcom,dsi-pref-sub1-pan = <&dsi_ili9881c_ebbgDJN_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,platform-te-gpio = <&tlmm 24 0>; + qcom,platform-reset-gpio = <&tlmm 60 0>; + + qcom,regulator-ldo-mode; + qcom,platform-regulator-settings = [ 00 01 01 00 20 07 00]; + }; &mdss_dsi1 { @@ -83,3 +108,31 @@ qcom,supply-post-on-sleep = <20>; }; }; +&dsi_hx8394f_boe_720_vid { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ili9881c_ebbg_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; +&dsi_ili9881c_ebbgDJN_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&spmi_bus { + qcom,pmi8950@3 { + labibb: qpnp-labibb-regulator { + ibb_regulator: qcom,ibb@dc00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5500000>; + }; + + lab_regulator: qcom,lab@de00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5500000>; + }; + }; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8937-pmi8950-qrd-sku1_S88536AA2.dtsi b/arch/arm/boot/dts/qcom/msm8937-pmi8950-qrd-sku1_S88536AA2.dtsi new file mode 100644 index 0000000000000..2794b17b50b06 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8937-pmi8950-qrd-sku1_S88536AA2.dtsi @@ -0,0 +1,328 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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 "msm-pmi8950.dtsi" +#include "msm8937-qrd.dtsi" +#include "msm8937-mdss-panels.dtsi" +#include "dsi-panel-hx8394f-boe-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbg-720p-video.dtsi" +#include "dsi-panel-ili9881c-ebbgDJN-720p-video.dtsi" +#include "msm8937-camera-sensor-qrd-wt88536.dtsi" + +&i2c_2 { /* i2c 6 */ + + aw2013@45 { /*blink */ + compatible = "awinic,aw2013"; + reg = <0x45>; + rgb_led-supply = <&pm8937_l10>; + + red { + label = "red"; + linux,default-trigger = "battery-red"; + default-state = "off"; + retain-state-suspended; + }; + + green { + label = "green"; + linux,default-trigger = "battery-green"; + default-state = "off"; + retain-state-suspended; + }; + + blue { + label = "blue"; + linux,default-trigger = "battery-blue"; + default-state = "off"; + retain-state-suspended; + }; + white { + label = "white"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + yellow { + label = "yellow"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + cyan { + label = "cyan"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + purple { + label = "purple"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + }; +}; + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8950_flash0>; + qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch2>; + qcom,switch-source = <&pmi8950_switch>; + }; + + i2c@78b7000 { + status = "ok"; + ftech@38 { + compatible = "focaltech,5336"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8937_l10>; + vcc_i2c-supply = <&pm8937_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + ftech,name = "ft5336"; + ftech,family-id = <0x36>; + ftech,reset-gpio = <&tlmm 64 0x00>; + ftech,irq-gpio = <&tlmm 65 0x2008>; + ftech,display-coords = <0 0 720 1280>; + ftech,panel-coords = <0 0 720 1280>; + ftech,virtual-key1 = <139 140 2000>;/*menu*/ + ftech,virtual-key2 = <172 360 2000>;/*home*/ + ftech,virtual-key3 = <158 580 2000>;/*back*/ + ftech,no-force-update; + ftech,i2c-pull-up; + ftech,group-id = <1>; + ftech,hard-reset-delay-ms = <20>; + ftech,soft-reset-delay-ms = <200>; + ftech,num-max-touches = <10>; + ftech,fw-delay-aa-ms = <30>; + ftech,fw-delay-55-ms = <30>; + ftech,fw-upgrade-id1 = <0x79>; + ftech,fw-upgrade-id2 = <0x18>; + ftech,fw-delay-readid-ms = <10>; + ftech,fw-delay-era-flsh-ms = <2000>; + ftech,fw-auto-cal; + ftech,ignore-id-check; + }; + }; + + gen-vkey1 { + compatible = "qcom,gen-vkeys"; + label = "ft5x06_720p"; + qcom,disp-maxx = <720>; + qcom,disp-maxy = <1280>; + qcom,panel-maxx = <720>; + qcom,panel-maxy = <1458>; + qcom,key-codes = <139 172 158>; + qcom,y-offset = <0>; + }; + + fpc1020 { + compatible = "soc:fpc1020"; + + interrupt-parent = <&tlmm>; + interrupts = <9 0x0>; + + fpc,gpio_rst = <&tlmm 8 0>; + fpc,gpio_irq = <&tlmm 9 0>; + + vcc_spi-supply = <&pm8937_l5>; + vdd_ana-supply = <&pm8937_l5>; + vdd_io-supply = <&pm8937_l5>; + + fpc,enable-on-boot; + /delete-property/ + fpc,enable-wakeup; + + fpc,spi-max-frequency = <4800000>; + + /* Only for SPI Clock Handled by Linux */ + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup1_spi_apps_clk>; + + pinctrl-names = "fpc1020_spi_active", + "fpc1020_reset_reset", + "fpc1020_reset_active", + "fpc1020_irq_active"; + + pinctrl-0 = <&fpc_spi_active>; + pinctrl-1 = <&fpc_reset_reset>; + pinctrl-2 = <&fpc_reset_active>; + pinctrl-3 = <&fpc_irq_active>; + }; + + goodix_fp { + compatible = "goodix,fingerprint"; + spi-max-frequency = <1000000>; + input-device-name = "gf3208"; + interrupt-parent = <&tlmm>; + interrupts = <9 0x0>; + + goodix,gpio_reset = <&tlmm 8 0>; + goodix,gpio_irq = <&tlmm 9 0>; + + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup1_spi_apps_clk>; + + pinctrl-names = "goodixfp_spi_active", + "goodixfp_reset_reset", + "goodixfp_reset_active", + "goodixfp_irq_active"; + + pinctrl-0 = <&goodix_spi_active>; + pinctrl-1 = <&goodix_reset_reset>; + pinctrl-2 = <&goodix_reset_active>; + pinctrl-3 = <&goodix_irq_active>; + }; + gpio-leds { + compatible = "gpio-leds"; + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&gpio_led_off>; + + infred { + gpios = <&tlmm 45 0>; + label = "infrared"; + linux,default-trigger = "infra-red"; + default-state = "off"; + retain-state-suspended; + }; + + }; +}; + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + + +&mdss_dsi0 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; + + + + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_boe_720_vid>; + qcom,dsi-pref-sub-pan = <&dsi_ili9881c_ebbg_720p_video>; + qcom,dsi-pref-sub1-pan = <&dsi_ili9881c_ebbgDJN_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,platform-te-gpio = <&tlmm 24 0>; + qcom,platform-reset-gpio = <&tlmm 60 0>; + + qcom,regulator-ldo-mode; + qcom,platform-regulator-settings = [ 00 01 01 00 20 07 00]; + +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&labibb { + status = "ok"; + qpnp,qpnp-labibb-mode = "lcd"; +}; + +&ibb_regulator { + qcom,qpnp-ibb-discharge-resistor = <32>; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <5>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <5>; + }; +}; + +&dsi_hx8394f_boe_720_vid { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ili9881c_ebbg_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; +&dsi_ili9881c_ebbgDJN_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&spmi_bus { + qcom,pmi8950@3 { + labibb: qpnp-labibb-regulator { + ibb_regulator: qcom,ibb@dc00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5500000>; + }; + + lab_regulator: qcom,lab@de00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5500000>; + }; + }; + }; +}; + +&sdc2_cmd_on { + config { + drive-strength = <12>; + }; +}; + +&sdc2_data_on { + config { + drive-strength = <12>; + }; +}; + +&flash_led { + /delete-node/ qcom,flash_1; + /delete-node/ qcom,torch_1; +}; diff --git a/arch/arm/boot/dts/qcom/msm8937-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8937-qrd.dtsi index 116de59bdfff1..7476cf921ff27 100644 --- a/arch/arm/boot/dts/qcom/msm8937-qrd.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-qrd.dtsi @@ -1,5 +1,6 @@ /* * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -12,7 +13,6 @@ */ #include "msm8937-pinctrl.dtsi" -#include "msm8937-camera-sensor-qrd.dtsi" &soc { gpio_keys { @@ -30,6 +30,11 @@ debounce-interval = <15>; }; }; + + + boardinfo { + compatible = "wt:boardinfo"; + }; }; &wled { @@ -83,6 +88,7 @@ vdd-supply = <&pm8937_l8>; qcom,vdd-voltage-level = <2900000 2900000>; qcom,vdd-current-level = <200 570000>; + qcom,vdd-always-on; /* device communication power supply */ vdd-io-supply = <&pm8937_l5>; diff --git a/arch/arm/boot/dts/qcom/msm8937-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8937-regulator.dtsi index ca571e27aebd4..20c93441fadef 100644 --- a/arch/arm/boot/dts/qcom/msm8937-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937-regulator.dtsi @@ -136,6 +136,7 @@ regulator-max-microvolt = <1800000>; qcom,init-voltage = <1800000>; status = "okay"; + regulator-always-on; }; }; @@ -296,6 +297,7 @@ pm8937_s5: spm-regulator@2000 { compatible = "qcom,spm-regulator"; reg = <0x2000 0x100>; + qcom,mode = "pwm"; regulator-name = "pm8937_s5"; regulator-min-microvolt = <1050000>; regulator-max-microvolt = <1350000>; @@ -360,7 +362,7 @@ qcom,cpr-fuse-corners = <3>; qcom,cpr-voltage-ceiling = <1155000 1225000 1350000>; - qcom,cpr-voltage-floor = <1050000 1050000 1090000>; + qcom,cpr-voltage-floor = <1150000 1150000 1250000>; vdd-apc-supply = <&pm8937_s5>; mem-acc-supply = <&mem_acc_vreg_corner>; diff --git a/arch/arm/boot/dts/qcom/msm8937.dtsi b/arch/arm/boot/dts/qcom/msm8937.dtsi index 32502fdb29019..3b63f95521ca4 100644 --- a/arch/arm/boot/dts/qcom/msm8937.dtsi +++ b/arch/arm/boot/dts/qcom/msm8937.dtsi @@ -33,7 +33,7 @@ other_ext_mem: other_ext_region@0 { compatible = "removed-dma-pool"; no-map; - reg = <0x0 0x85b00000 0x0 0xd00000>; + reg = <0x0 0x84A00000 0x0 0x1E00000>; }; modem_mem: modem_region@0 { @@ -42,12 +42,19 @@ reg = <0x0 0x86800000 0x0 0x5000000>; }; - reloc_mem: reloc_region@0 { + adsp_fw_mem: adsp_fw_region@0 { compatible = "removed-dma-pool"; no-map; - reg = <0x0 0x8b800000 0x0 0x1800000>; + reg = <0x0 0x8b800000 0x0 0x1100000>; }; + wcnss_fw_mem: wcnss_fw_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x8c900000 0x0 0x700000>; + }; + + venus_mem: venus_region@0 { compatible = "shared-dma-pool"; reusable; @@ -533,6 +540,11 @@ qcom,enable-load = <0>; qcom,disable-load = <0>; }; + aw87319@58{ /*AW87319 PA*/ + compatible = "awinic,aw87319_pa"; + reg = <0x58>; + qcom,ext_pa_spk_aw87319_rst = <&tlmm 124 0>; + }; }; i2c_3: i2c@78b7000 { /* BLSP1 QUP3 */ @@ -543,7 +555,7 @@ reg = <0x78b7000 0x600>; interrupt-names = "qup_irq"; interrupts = <0 97 0>; - qcom,clk-freq-out = <400000>; + qcom,clk-freq-out = <100000>; qcom,clk-freq-in = <19200000>; clock-names = "iface_clk", "core_clk"; clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, @@ -1486,6 +1498,8 @@ qcom,use-sw-aes-xts-algo; qcom,use-sw-aes-ccm-algo; qcom,use-sw-ahash-algo; + qcom,use-sw-hmac-algo; + qcom,use-sw-aead-algo; qcom,ce-opp-freq = <100000000>; }; @@ -1514,9 +1528,9 @@ qcom,ce-opp-freq = <100000000>; }; - qcom_seecom: qseecom@85b00000 { + qcom_seecom: qseecom@84A00000 { compatible = "qcom,qseecom"; - reg = <0x85b00000 0x800000>; + reg = <0x84A00000 0x1900000>; reg-names = "secapp-region"; qcom,hlos-num-ce-hw-instances = <1>; qcom,hlos-ce-hw-instance = <0>; @@ -1803,7 +1817,7 @@ label = "modem"; }; - qcom,client_3 { + mem_client_3_size: qcom,client_3 { compatible = "qcom,memshare-peripheral"; qcom,peripheral-size = <0x0>; qcom,client-id = <1>; @@ -1847,7 +1861,7 @@ /* GPIO output to lpass */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_2_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&adsp_fw_mem>; }; qcom,pronto@a21b000 { @@ -1885,7 +1899,7 @@ /* GPIO output to wcnss */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_4_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&wcnss_fw_mem>; }; qcom,venus@1de0000 { diff --git a/arch/arm/boot/dts/qcom/msm8940-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8940-mtp.dtsi index 62e89c895b68c..dff5233ec8c93 100644 --- a/arch/arm/boot/dts/qcom/msm8940-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940-mtp.dtsi @@ -14,5 +14,9 @@ #include "msm8937-mtp.dtsi" #include "msm8940-pinctrl.dtsi" +&mem_client_3_size { + qcom,peripheral-size = <0x500000>; +}; + &soc { }; diff --git a/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi b/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi index 965673222a11b..b6e678fb70ed1 100644 --- a/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940-pmi8940-qrd-sku7.dtsi @@ -153,3 +153,48 @@ }; }; +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + /delete-property/ lab-supply; + /delete-property/ ibb-supply; + /delete-property/ qcom,platform-te-gpio; + + qcom,dsi-pref-prim-pan = <&dsi_hx8394f_720p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,platform-reset-gpio = <&tlmm 60 0>; +}; + +&mdss_dsi1 { + status = "disabled"; +}; + +&labibb { + status = "disabled"; +}; + +&dsi_panel_pwr_supply { + /delete-node/ qcom,panel-supply-entry@2; + /delete-node/ qcom,panel-supply-entry@3; +}; + +&dsi_hx8394f_720p_video { + qcom,mdss-dsi-bl-pmic-control-type = "bl_ctrl_wled"; + qcom,mdss-dsi-bl-min-level = <1>; + qcom,mdss-dsi-bl-max-level = <4095>; + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&usb_otg { + qcom,hsusb-otg-phy-init-seq = + <0x39 0x81 0x37 0x82 0xffffffff>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8940-pmi8950-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8940-pmi8950-mtp.dtsi index 65b5097206e66..e04927561c21f 100644 --- a/arch/arm/boot/dts/qcom/msm8940-pmi8950-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940-pmi8950-mtp.dtsi @@ -15,4 +15,47 @@ #include "msm8940-mtp.dtsi" &soc { + + i2c@78b7000 { + status = "ok"; + ftech@38 { + compatible = "focaltech,5336"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8937_l10>; + vcc_i2c-supply = <&pm8937_l5>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + ftech,name = "ft5336"; + ftech,family-id = <0x36>; + ftech,reset-gpio = <&tlmm 64 0x00>; + ftech,irq-gpio = <&tlmm 65 0x2008>; + ftech,display-coords = <0 0 720 1280>; + ftech,panel-coords = <0 0 720 1280>; + ftech,virtual-key1 = <139 140 2000>;/*menu*/ + ftech,virtual-key2 = <172 360 2000>;/*home*/ + ftech,virtual-key3 = <158 580 2000>;/*back*/ + ftech,no-force-update; + ftech,i2c-pull-up; + ftech,group-id = <1>; + ftech,hard-reset-delay-ms = <20>; + ftech,soft-reset-delay-ms = <200>; + ftech,num-max-touches = <10>; + ftech,fw-delay-aa-ms = <30>; + ftech,fw-delay-55-ms = <30>; + ftech,fw-upgrade-id1 = <0x79>; + ftech,fw-upgrade-id2 = <0x18>; + ftech,fw-delay-readid-ms = <10>; + ftech,fw-delay-era-flsh-ms = <2000>; + ftech,fw-auto-cal; + ftech,ignore-id-check; + }; + + }; }; + diff --git a/arch/arm/boot/dts/qcom/msm8940-pmi8950-qrd-sku7_S88536AA2.dts b/arch/arm/boot/dts/qcom/msm8940-pmi8950-qrd-sku7_S88536AA2.dts new file mode 100644 index 0000000000000..8f32c9942cb04 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8940-pmi8950-qrd-sku7_S88536AA2.dts @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2016, 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. + */ + +/dts-v1/; + +#include "msm8940.dtsi" +#include "msm8937-pmi8950-qrd-sku1_S88536AA2.dtsi" +#include "msm8940-pinctrl.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8940-PMI8950 QRD SKU7"; + compatible = "qcom,msm8940-qrd-sku7", "qcom,msm8940-qrd", + "qcom,msm8940", "qcom,qrd"; + qcom,board-id= <0x1000b 1>, <0x2000b 1>; + qcom,pmic-id = <0x10019 0x010011 0x0 0x0>; +}; + +/ { + qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-qrd-Desay-4v4-4100mah.dtsi" + #include "batterydata-qrd-Atl-4v4-4100mah.dtsi" + #include "batterydata-qrd-Coslight-4v4-4100mah.dtsi" + #include "batterydata-qrd-Default-4v4-4100mah.dtsi" + }; +}; + +&pmi8950_charger { + qcom,battery-data = <&qrd_batterydata>; + qcom,float-voltage-mv = <4400>; + qcom,chg-inhibit-fg; + qcom,thermal-mitigation = <2000 1500 1200 700 0>; + status = "okay"; + qcom,vchg_sns-vadc = <&pmi8950_vadc>; + qcom,vchg-adc-channel-id = <3>; +}; + +&pmi8950_fg { + qcom,battery-data = <&qrd_batterydata>; + qcom,cold-bat-decidegc = <(0)>; + qcom,cool-bat-decidegc = <(150)>; + qcom,hot-bat-decidegc = <550>; + qcom,warm-bat-decidegc = <450>; + qcom,warm-bat-india-decidegc = <500>; + qcom,fg-iterm-ma = <180>; + qcom,fg-chg-iterm-ma = <130>; + qcom,resume-soc = <99>; + qcom,resume-soc-raw = <253>; + qcom,vbat-estimate-diff-mv = <100>; + qcom,fg-cutoff-voltage-mv = <3400>; + qcom,fg-cc-cv-threshold-mv = <4390>; + qcom,cl-max-increment-deciperc = <1>; + qcom,cl-max-decrement-deciperc = <1>; + qcom,fg-delta-soc = <1>; + qcom,bad-battery-detection-enable; + qcom,hold-soc-while-full; + qcom,thermal-coefficients = [B7 85 B2 49 71 35]; +}; + +&usb_otg { + qcom,usbin-vadc = <&pmi8950_vadc>; +}; +&soc { + sound { + qcom,model = "msm8920-sku7-snd-card"; + }; + + i2c@78b7000 { + synaptics@4b { + vdd-supply = <&pm8937_l10>; + }; + }; +}; + +&i2c_2 { + pericom-type-c@1d { + status="disabled"; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8940.dtsi b/arch/arm/boot/dts/qcom/msm8940.dtsi index b163dfd984ce1..f4bffec714799 100644 --- a/arch/arm/boot/dts/qcom/msm8940.dtsi +++ b/arch/arm/boot/dts/qcom/msm8940.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -38,8 +38,6 @@ <&clock_gcc clk_xo_otg_clk>; qcom,usbbam@78c4000 { - qcom,enable-hsusb-bam-on-boot; - /delete-property/ qcom,reset-bam-on-disconnect; /delete-node/ qcom,pipe0; qcom,pipe0 { @@ -155,8 +153,8 @@ <90 512 100000 800000>, /* SVS (ab=100, ib=800 ~ 50MHz) */ <90 512 100000 1200000>; /* PERF (ab=100, ib=1200 ~ 75MHz) */ qcom,bus-vector-names = "MIN", "SVS", "PERF"; - qcom,rx-polling-sleep-ms = <3>; /* Polling sleep interval */ - qcom,ipa-polling-iteration = <15>; /* Polling Iteration */ + qcom,rx-polling-sleep-ms = <2>; /* Polling sleep interval */ + qcom,ipa-polling-iteration = <5>; /* Polling Iteration */ }; qcom,rmnet-ipa { @@ -175,6 +173,8 @@ mem_acc_vreg_corner: regulator@01946004 { compatible = "qcom,mem-acc-regulator"; + reg = <0xa4000 0x1000>; + reg-names = "efuse_addr"; regulator-name = "mem_acc_corner"; regulator-min-microvolt = <1>; regulator-max-microvolt = <3>; @@ -225,6 +225,216 @@ <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>; + + qcom,override-acc-range-fuse-list = + <37 40 3 0>, /* foundry id */ + <36 30 8 0>, /* iddq apc on */ + <67 0 6 0>; /* turbo targ volt */ + + qcom,override-fuse-range-map = + <0 0>, < 0 0>, <49 63>, + <1 1>, < 0 0>, <50 63>, + <5 5>, < 0 0>, <51 63>, + <0 1>, < 95 255>, < 0 63>, + <5 5>, <100 255>, < 0 63>; + + qcom,override-corner1-addr-val-map = + /* 1st fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 2 0x555555 >, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 2nd fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 2 0x555555 >, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 3rd fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 2 0x555555 >, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 4th fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 2 0x555555 >, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 5th fuse version tuple matched */ + /* SVS+ => SVS+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* SVS+ => TURBO/NOM+ */ + < 2 0x555555 >, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>; + + qcom,override-corner2-addr-val-map = + /* 1st fuse version tuple matched */ + /* NOM => SVS+ */ + < 2 0x555555>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 2 0x555555>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 2nd fuse version tuple matched */ + /* NOM => SVS+ */ + < 2 0x555555>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 2 0x555555>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 3rd fuse version tuple matched */ + /* NOM => SVS+ */ + < 2 0x555555>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 2 0x555555>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 4th fuse version tuple matched */ + /* NOM => SVS+ */ + < 2 0x555555>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 2 0x555555>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>, + + /* 5th fuse version tuple matched */ + /* NOM => SVS+ */ + < 2 0x555555>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* NOM => NOM */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* NOM => TURBO/NOM+ */ + < 2 0x555555>, < 3 0x1>, < 4 0x1000>, + < 5 0x0>; + + qcom,override-corner3-addr-val-map = + /* 1st fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* TURBO/NOM+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + + /* 2nd fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* TURBO/NOM+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + + /* 3rd fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* TURBO/NOM+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + + /* 4th fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* TURBO/NOM+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + + /* 5th fuse version tuple matched */ + /* TURBO/NOM+ => SVS+ */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, < 3 0x30C30C3>, < 4 0x30C30C3>, + < 5 0x00000C3>, + /* TURBO/NOM+ => NOM */ + < 2 0x555555>, < 3 0x1041041>, < 4 0x1041041>, + < 5 0x0000041>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, + /* TURBO/NOM+ => TURBO/NOM+ */ + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>, <(-1) (-1)>, <(-1) (-1)>, + <(-1) (-1)>; }; }; @@ -235,22 +445,34 @@ /delete-property/ qcom,cpr-enable; qcom,pvs-version-fuse-sel = <37 40 3 0>; /* foundry */ + qcom,cpr-speed-bin-max-corners = + <0 (-1) 1 2 6>, + <1 (-1) 1 2 7>; + qcom,cpr-fuse-version-map = - <(-1) 0 (-1) (-1) (-1) (-1)>, - <(-1) 1 (-1) (-1) (-1) (-1)>, - <(-1) 5 (-1) (-1) (-1) (-1)>; + < 0 0 (-1) (-1) (-1) (-1)>, + < 0 1 (-1) (-1) (-1) (-1)>, + < 0 5 (-1) (-1) (-1) (-1)>, + < 1 0 (-1) (-1) (-1) (-1)>, + < 1 1 (-1) (-1) (-1) (-1)>, + < 1 5 (-1) (-1) (-1) (-1)>; qcom,cpr-init-voltage-adjustment = <0 0 0>, <0 0 20000>, - <0 0 15000>; + <0 0 20000>, + <0 0 20000>, + <0 0 20000>, + <0 0 25000>; qcom,cpr-quotient-adjustment = <0 0 0>, <38 0 28>, /* SVSP(20mv); TURBO(15mv); KV(1.9) */ - <0 0 19>; /* TURBO(10mv); KV(1.9) */ + <0 0 28>, /* TURBO(15mv); KV(1.9) */ + <0 0 28>, /* TURBO(15mv); KV(1.9) */ + <38 0 28>, /* SVSP(20mv); TURBO(15mv); KV(1.9) */ + <0 0 38>; /* TURBO(20mv); KV(1.9) */ - qcom,cpr-enable; }; &mdss_mdp { @@ -261,8 +483,12 @@ reg = <0x0 0x86800000 0x0 0x6a00000>; }; -&reloc_mem { - reg = <0x0 0x8d200000 0x0 0x1800000>; +&adsp_fw_mem { + reg = <0x0 0x8d200000 0x0 0x1100000>; +}; + +&wcnss_fw_mem { + reg = <0x0 0x8e300000 0x0 0x700000>; }; &funnel_apss { @@ -279,12 +505,27 @@ }; &soc { - cti_modem_cpu1: cti@6128000{ + /delete-node/ cti@6124000; + cti_modem_cpu0: cti@6128000{ compatible = "arm,coresight-cti"; reg = <0x6128000 0x1000>; reg-names = "cti-base"; coresight-id = <59>; + coresight-name = "coresight-cti-modem-cpu0"; + coresight-nr-inports = <0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + cti_modem_cpu1: cti@6124000{ + compatible = "arm,coresight-cti"; + reg = <0x6124000 0x1000>; + reg-names = "cti-base"; + + coresight-id = <60>; coresight-name = "coresight-cti-modem-cpu1"; coresight-nr-inports = <0>; @@ -297,7 +538,7 @@ modem_etm1 { compatible = "qcom,coresight-remote-etm"; - coresight-id = <60>; + coresight-id = <61>; coresight-name = "coresight-modem-etm1"; coresight-nr-inports = <0>; coresight-outports = <0>; @@ -306,85 +547,182 @@ qcom,inst-id = <11>; }; + + sn_fuse: snfuse@0xa0128 { + compatible = "qcom,sn-fuse"; + reg = <0xa0128 0x4>; + reg-names = "sn-base"; + }; + + sec_boot_fuse: secbootfuse@0xa41d0 { + compatible = "qcom,sec-boot-fuse"; + reg = <0xa41d0 0x4>; + reg-names = "sec-boot-base"; + }; + }; /* GPU overrides */ &msm_gpu { - /delete-property/qcom,initial-pwrlevel; - qcom,initial-pwrlevel = <3>; + qcom,restrict-pwrlevel = <1>; + /delete-property/qcom,gpu-speed-bin; + qcom,gpu-speed-bin = <0x0174 0x80000000 31>; + /delete-property/qcom,initial-pwrlevel; /delete-node/qcom,gpu-pwrlevel-bins; /delete-node/qcom,gpu-pwrlevels; - /* Power levels */ - qcom,gpu-pwrlevels { + + qcom,gpu-pwrlevel-bins { #address-cells = <1>; #size-cells = <0>; - compatible = "qcom,gpu-pwrlevels"; - - /* SUPER TURBO */ - qcom,gpu-pwrlevel@0 { - reg = <0>; - qcom,gpu-freq = <475000000>; - qcom,bus-freq = <10>; - qcom,bus-min = <10>; - qcom,bus-max = <10>; - }; - - /* TURBO */ - qcom,gpu-pwrlevel@1 { - reg = <1>; - qcom,gpu-freq = <450000000>; - qcom,bus-freq = <9>; - qcom,bus-min = <9>; - qcom,bus-max = <10>; - }; - - /* NOM+ */ - qcom,gpu-pwrlevel@2 { - reg = <2>; - qcom,gpu-freq = <400000000>; - qcom,bus-freq = <7>; - qcom,bus-min = <6>; - qcom,bus-max = <9>; - }; - - /* NOM */ - qcom,gpu-pwrlevel@3 { - reg = <3>; - qcom,gpu-freq = <375000000>; - qcom,bus-freq = <6>; - qcom,bus-min = <5>; - qcom,bus-max = <8>; + compatible="qcom,gpu-pwrlevel-bins"; + + /* Power levels */ + qcom,gpu-pwrlevels-0 { + #address-cells = <1>; + #size-cells = <0>; + + qcom,speed-bin = <0>; + qcom,initial-pwrlevel = <3>; + + /* SUPER TURBO */ + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <475000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <10>; + qcom,bus-max = <10>; + }; + + /* TURBO */ + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <450000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <9>; + qcom,bus-max = <10>; + }; + + /* NOM+ */ + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <400000000>; + qcom,bus-freq = <7>; + qcom,bus-min = <6>; + qcom,bus-max = <9>; + }; + + /* NOM */ + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <375000000>; + qcom,bus-freq = <6>; + qcom,bus-min = <5>; + qcom,bus-max = <8>; + }; + + /* SVS+ */ + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <300000000>; + qcom,bus-freq = <5>; + qcom,bus-min = <4>; + qcom,bus-max = <7>; + }; + + /* SVS */ + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <216000000>; + qcom,bus-freq = <3>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + + /* XO */ + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <19200000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + qcom,bus-max = <0>; + }; }; - /* SVS+ */ - qcom,gpu-pwrlevel@4 { - reg = <4>; - qcom,gpu-freq = <300000000>; - qcom,bus-freq = <5>; - qcom,bus-min = <4>; - qcom,bus-max = <7>; + /* Power levels */ + qcom,gpu-pwrlevels-1 { + #address-cells = <1>; + #size-cells = <0>; + + qcom,speed-bin = <1>; + qcom,initial-pwrlevel = <3>; + + /* SUPER TURBO */ + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <500000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <10>; + qcom,bus-max = <10>; + }; + + /* TURBO */ + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <450000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <9>; + qcom,bus-max = <10>; + }; + + /* NOM+ */ + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <400000000>; + qcom,bus-freq = <7>; + qcom,bus-min = <6>; + qcom,bus-max = <9>; + }; + + /* NOM */ + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <375000000>; + qcom,bus-freq = <6>; + qcom,bus-min = <5>; + qcom,bus-max = <8>; + }; + + /* SVS+ */ + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <300000000>; + qcom,bus-freq = <5>; + qcom,bus-min = <4>; + qcom,bus-max = <7>; + }; + + /* SVS */ + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <216000000>; + qcom,bus-freq = <3>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + + /* XO */ + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <19200000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + qcom,bus-max = <0>; + }; }; - /* SVS */ - qcom,gpu-pwrlevel@5 { - reg = <5>; - qcom,gpu-freq = <216000000>; - qcom,bus-freq = <3>; - qcom,bus-min = <1>; - qcom,bus-max = <4>; - }; - - /* XO */ - qcom,gpu-pwrlevel@6 { - reg = <6>; - qcom,gpu-freq = <19200000>; - qcom,bus-freq = <0>; - qcom,bus-min = <0>; - qcom,bus-max = <0>; - }; }; }; diff --git a/arch/arm/boot/dts/qcom/msm8952-ion.dtsi b/arch/arm/boot/dts/qcom/msm8952-ion.dtsi index 937c56bba1577..3d56279108e58 100644 --- a/arch/arm/boot/dts/qcom/msm8952-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8952-ion.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, 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 @@ -21,11 +21,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@8 { /* CP_MM HEAP */ reg = <8>; memory-region = <&secure_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8952-mdss-panels.dtsi b/arch/arm/boot/dts/qcom/msm8952-mdss-panels.dtsi index 17798d4384617..e4d20291c7cd0 100644 --- a/arch/arm/boot/dts/qcom/msm8952-mdss-panels.dtsi +++ b/arch/arm/boot/dts/qcom/msm8952-mdss-panels.dtsi @@ -35,6 +35,7 @@ qcom,supply-max-voltage = <1800000>; qcom,supply-enable-load = <100000>; qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <12>; }; qcom,panel-supply-entry@2 { @@ -44,6 +45,8 @@ qcom,supply-max-voltage = <6000000>; qcom,supply-enable-load = <100000>; qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <12>; + qcom,supply-pre-off-sleep = <2>; }; qcom,panel-supply-entry@3 { @@ -53,7 +56,8 @@ qcom,supply-max-voltage = <6000000>; qcom,supply-enable-load = <100000>; qcom,supply-disable-load = <100>; - qcom,supply-post-on-sleep = <20>; + qcom,supply-post-on-sleep = <2>; + qcom,supply-post-off-sleep = <4>; }; }; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-audio-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8953-audio-cdp.dtsi index 6da96a542289d..8e63bcc874445 100644 --- a/arch/arm/boot/dts/qcom/msm8953-audio-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-audio-cdp.dtsi @@ -13,7 +13,7 @@ &int_codec { status = "okay"; - qcom,msm-hs-micbias-type = "internal"; + qcom,msm-hs-micbias-type = "external"; }; &pm8953_diangu_dig { diff --git a/arch/arm/boot/dts/qcom/msm8953-audio.dtsi b/arch/arm/boot/dts/qcom/msm8953-audio.dtsi index 386bc5fc7b578..a9e33101f4c40 100644 --- a/arch/arm/boot/dts/qcom/msm8953-audio.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-audio.dtsi @@ -16,11 +16,11 @@ &int_codec { qcom,model = "msm8953-snd-card-mtp"; - qcom,cdc-us-euro-gpios = <&tlmm 63 0>; - qcom,msm-mbhc-hphl-swh = <0>; - qcom,msm-mbhc-gnd-swh = <0>; - qcom,msm-hs-micbias-type = "internal"; + qcom,cdc-us-euro-gpios; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-hs-micbias-type = "external"; qcom,msm-micbias1-ext-cap; + qcom,msm-micbias2-ext-cap; qcom,msm-gpios = "pri_i2s", diff --git a/arch/arm/boot/dts/qcom/msm8953-audio_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-audio_rosy.dtsi new file mode 100644 index 0000000000000..cae990dc42e94 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-audio_rosy.dtsi @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2015-2016, 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 "msm8953-wsa881x.dtsi" + +&int_codec { + qcom,model = "msm8953-snd-card-mtp"; + + qcom,cdc-us-euro-gpios; + qcom,msm-mbhc-hphl-swh = <1>; + qcom,msm-hs-micbias-type = "external"; + qcom,msm-micbias1-ext-cap; + qcom,msm-micbias2-ext-cap; + + qcom,msm-gpios = + "pri_i2s", + "us_eu_gpio", + "quin_i2s", + "comp_gpio"; + qcom,pinctrl-names = + "all_off", + "pri_i2s_act", + "us_eu_gpio_act", + "pri_i2s_us_eu_gpio_act", + "quin_act", + "quin_pri_i2s_act", + "quin_us_eu_gpio_act", + "quin_us_eu_gpio_pri_i2s_act", + "comp_gpio_act", + "comp_gpio_pri_i2s_act", + "comp_gpio_us_eu_gpio_act", + "comp_gpio_pri_i2s_us_eu_gpio_act", + "comp_gpio_quin_act", + "comp_gpio_quin_pri_i2s_act", + "comp_gpio_quin_us_eu_gpio_act", + "comp_gpio_quin_us_eu_gpio_pri_i2s_act"; + + pinctrl-names = + "all_off", + "pri_i2s_act", + "us_eu_gpio_act", + "pri_i2s_us_eu_gpio_act", + "quin_act", + "quin_pri_i2s_act", + "quin_us_eu_gpio_act", + "quin_us_eu_gpio_pri_i2s_act", + "comp_gpio_act", + "comp_gpio_pri_i2s_act", + "comp_gpio_us_eu_gpio_act", + "comp_gpio_pri_i2s_us_eu_gpio_act", + "comp_gpio_quin_act", + "comp_gpio_quin_pri_i2s_act", + "comp_gpio_quin_us_eu_gpio_act", + "comp_gpio_quin_us_eu_gpio_pri_i2s_act"; + + pinctrl-0 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_sus &cross_conn_det_sus + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-1 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_act &cross_conn_det_sus + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-2 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_sus &cross_conn_det_act + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-3 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_act &cross_conn_det_act + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-4 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_sus &cross_conn_det_sus + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-5 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_act &cross_conn_det_sus + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-6 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_sus &cross_conn_det_act + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-7 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_sus + &cdc_pdm_lines_2_act &cross_conn_det_act + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-8 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_sus &cross_conn_det_sus + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-9 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_act &cross_conn_det_sus + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-10 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_sus &cross_conn_det_act + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-11 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_act &cross_conn_det_act + &pri_tlmm_lines_sus &pri_tlmm_ws_sus>; + pinctrl-12 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_sus &cross_conn_det_sus + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-13 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_act &cross_conn_det_sus + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-14 = <&cdc_pdm_lines_sus &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_sus &cross_conn_det_act + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + pinctrl-15 = <&cdc_pdm_lines_act &cdc_pdm_comp_lines_act + &cdc_pdm_lines_2_act &cross_conn_det_act + &pri_tlmm_lines_act &pri_tlmm_ws_act>; + + asoc-codec = <&stub_codec>, <&pm8953_diangu_dig>, <&hdmi_dba>; + asoc-codec-names = "msm-stub-codec.1", "cajon_codec", + "msm-hdmi-dba-codec-rx"; +}; + +&pm8953_gpios { + gpio@c000 { + status = "ok"; + qcom,mode = <1>; + qcom,pull = <5>; + qcom,vin-sel = <0>; + qcom,src-sel = <2>; + qcom,master-en = <1>; + qcom,out-strength = <2>; + }; +}; + +&ext_codec { + qcom,model = "msm8953-tasha-snd-card"; + + qcom,cdc-us-euro-gpios = <&tlmm 63 0>; + qcom,msm-mbhc-hphl-swh = <0>; + qcom,msm-mbhc-gnd-swh = <0>; + + qcom,wsa-max-devs = <2>; + qcom,wsa-devs = <&wsa881x_211>, <&wsa881x_212>, + <&wsa881x_213>, <&wsa881x_214>; + qcom,wsa-aux-dev-prefix = "SpkrLeft", "SpkrRight", + "SpkrLeft", "SpkrRight"; +}; + +&wcd9xxx_intc { + interrupt-parent = <&tlmm>; + interrupts = <73 0>; + qcom,gpio-connect = <&tlmm 73 0>; +}; + +&clock_audio { + qcom,audio-ref-clk-gpio = <&pm8953_gpios 1 0>; + qcom,lpass-mclk-id = "pri_mclk"; + clocks = <&clock_gcc clk_div_clk2>; + pinctrl-names = "sleep", "active"; + pinctrl-0 = <&cdc_mclk2_sleep>; + pinctrl-1 = <&cdc_mclk2_active>; +}; + +&pm8953_1 { + pm8953_diangu_dig: 8953_wcd_codec@f000 { + compatible = "qcom,msm8x16_wcd_codec"; + reg = <0xf000 0x100>; + interrupt-parent = <&spmi_bus>; + interrupts = <0x1 0xf0 0x0>, + <0x1 0xf0 0x1>, + <0x1 0xf0 0x2>, + <0x1 0xf0 0x3>, + <0x1 0xf0 0x4>, + <0x1 0xf0 0x5>, + <0x1 0xf0 0x6>, + <0x1 0xf0 0x7>; + interrupt-names = "spk_cnp_int", + "spk_clip_int", + "spk_ocp_int", + "ins_rem_det1", + "but_rel_det", + "but_press_det", + "ins_rem_det", + "mbhc_int"; + + cdc-vdda-cp-supply = <&pm8953_s4>; + qcom,cdc-vdda-cp-voltage = <1900000 2050000>; + qcom,cdc-vdda-cp-current = <500000>; + + cdc-vdd-io-supply = <&pm8953_l5>; + qcom,cdc-vdd-io-voltage = <1800000 1800000>; + qcom,cdc-vdd-io-current = <5000>; + + cdc-vdd-pa-supply = <&pm8953_s4>; + qcom,cdc-vdd-pa-voltage = <1900000 2050000>; + qcom,cdc-vdd-pa-current = <260000>; + + cdc-vdd-mic-bias-supply = <&pm8953_l13>; + qcom,cdc-vdd-mic-bias-voltage = <3125000 3125000>; + qcom,cdc-vdd-mic-bias-current = <5000>; + + qcom,cdc-mclk-clk-rate = <9600000>; + + qcom,cdc-static-supplies = "cdc-vdd-io", + "cdc-vdd-pa", + "cdc-vdda-cp"; + + qcom,cdc-on-demand-supplies = "cdc-vdd-mic-bias"; + qcom,dig-cdc-base-addr = <0xc0f0000>; + }; + + pm8953_diangu_analog: 8953_wcd_codec@f100 { + compatible = "qcom,msm8x16_wcd_codec"; + reg = <0xf100 0x100>; + interrupt-parent = <&spmi_bus>; + interrupts = <0x1 0xf1 0x0>, + <0x1 0xf1 0x1>, + <0x1 0xf1 0x2>, + <0x1 0xf1 0x3>, + <0x1 0xf1 0x4>, + <0x1 0xf1 0x5>; + interrupt-names = "ear_ocp_int", + "hphr_ocp_int", + "hphl_ocp_det", + "ear_cnp_int", + "hphr_cnp_int", + "hphl_cnp_int"; + qcom,dig-cdc-base-addr = <0xc0f0000>; + }; +}; + +&wcd_rst_gpio { + qcom,cdc-rst-n-gpio = <&tlmm 67 0>; +}; + +&wcd9335 { + clock-names = "wcd_clk", "wcd_native_clk"; + clocks = <&clock_audio clk_audio_pmi_clk>, + <&clock_audio clk_audio_ap_clk2>; + + qcom,cdc-reset-gpio = <&tlmm 67 0>; + + cdc-vdd-buck-supply = <&eldo2_8953>; + qcom,cdc-vdd-buck-voltage = <1800000 1800000>; + qcom,cdc-vdd-buck-current = <650000>; + + cdc-buck-sido-supply = <&eldo2_8953>; + qcom,cdc-buck-sido-voltage = <1800000 1800000>; + qcom,cdc-buck-sido-current = <150000>; + + cdc-vdd-tx-h-supply = <&eldo2_8953>; + qcom,cdc-vdd-tx-h-voltage = <1800000 1800000>; + qcom,cdc-vdd-tx-h-current = <25000>; + + cdc-vdd-rx-h-supply = <&eldo2_8953>; + qcom,cdc-vdd-rx-h-voltage = <1800000 1800000>; + qcom,cdc-vdd-rx-h-current = <25000>; + + cdc-vdd-px-supply = <&eldo2_8953>; + qcom,cdc-vdd-px-voltage = <1800000 1800000>; + qcom,cdc-vdd-px-current = <10000>; + + cdc-vdd-mic-bias-supply = <&pm8953_l13>; + qcom,cdc-vdd-mic-bias-voltage = <3125000 3125000>; + qcom,cdc-vdd-mic-bias-current = <15000>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi index ab43d3d4cde62..a284dd59e6493 100644 --- a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -11,17 +11,6 @@ * GNU General Public License for more details. */ -&soc { - led_flash0: qcom,camera-flash { - cell-index = <0>; - compatible = "qcom,camera-flash"; - qcom,flash-type = <1>; - qcom,flash-source = <&pmi8950_flash0 &pmi8950_flash1>; - qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch1>; - qcom,switch-source = <&pmi8950_switch>; - }; -}; - &cci { actuator0: qcom,actuator@0 { cell-index = <0>; @@ -165,6 +154,42 @@ qcom,clock-rates = <19200000 0>; }; + eeprom2: qcom,eeprom@2 { + cell-index = <2>; + compatible = "qcom,eeprom"; + qcom,cci-master = <1>; + reg = <0x2>; + cam_vdig-supply = <&pm8953_l23>; + cam_vana-supply = <&pm8953_l22>; + cam_vio-supply = <&pm8953_l6>; + cam_vaf-supply = <&pm8953_l17>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana", + "cam_vaf"; + qcom,cam-vreg-min-voltage = <1200000 0 2800000 2850000>; + qcom,cam-vreg-max-voltage = <1200000 0 2800000 2850000>; + qcom,cam-vreg-op-mode = <200000 0 80000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk2_default + &cam_sensor_front_default>; + pinctrl-1 = <&cam_sensor_mclk2_sleep + &cam_sensor_front_sleep>; + gpios = <&tlmm 28 0>, + <&tlmm 131 0>, + <&tlmm 132 0>; + qcom,gpio-reset = <1>; + qcom,gpio-standby = <2>; + qcom,gpio-req-tbl-num = <0 1 2>; + qcom,gpio-req-tbl-flags = <1 0 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1", + "CAM_STANDBY1"; + status = "ok"; + clocks = <&clock_gcc clk_mclk2_clk_src>, + <&clock_gcc clk_gcc_camss_mclk2_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <19200000 0>; + }; + qcom,camera@0 { cell-index = <0>; compatible = "qcom,camera"; @@ -218,6 +243,8 @@ qcom,csiphy-sd-index = <1>; qcom,csid-sd-index = <1>; qcom,mount-angle = <90>; + qcom,eeprom-src = <&eeprom2>; + qcom,actuator-src = <&actuator1>; cam_vdig-supply = <&pm8953_l23>; cam_vana-supply = <&pm8953_l22>; cam_vio-supply = <&pm8953_l6>; diff --git a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi index 5e406d3c66e4e..0ccdc8efa9740 100644 --- a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -11,17 +11,6 @@ * GNU General Public License for more details. */ -&soc { - led_flash0: qcom,camera-flash { - cell-index = <0>; - compatible = "qcom,camera-flash"; - qcom,flash-type = <1>; - qcom,flash-source = <&pmi8950_flash0 &pmi8950_flash1>; - qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch1>; - qcom,switch-source = <&pmi8950_switch>; - }; -}; - &cci { actuator0: qcom,actuator@0 { cell-index = <0>; diff --git a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi index 66bf97249a8bf..da00fb4624aaa 100644 --- a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -11,17 +11,6 @@ * GNU General Public License for more details. */ -&soc { - led_flash0: qcom,camera-flash { - cell-index = <0>; - compatible = "qcom,camera-flash"; - qcom,flash-type = <1>; - qcom,flash-source = <&pmi8950_flash0>; - qcom,torch-source = <&pmi8950_torch0>; - qcom,switch-source = <&pmi8950_switch>; - }; -}; - &cci { actuator0: qcom,actuator@0 { cell-index = <0>; diff --git a/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd_rosy.dtsi new file mode 100644 index 0000000000000..6c2300162a114 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-camera-sensor-qrd_rosy.dtsi @@ -0,0 +1,323 @@ +/* + * Copyright (c) 2015-2016, 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. + */ + +&soc { + led_flash1: qcom,camera-flash@1 { + cell-index = <1>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8940_flash1>; + qcom,torch-source = <&pmi8940_torch1>; + qcom,switch-source = <&pmi8940_switch>; + }; + + led_flash0: qcom,camera-flash@0 { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8940_flash0>; + qcom,torch-source = <&pmi8940_torch0>; + qcom,switch-source = <&pmi8940_switch>; + }; +}; + +&cci { + actuator0: qcom,actuator@0 { + cell-index = <0>; + reg = <0x0>; + compatible = "qcom,actuator"; + qcom,cci-master = <0>; + cam_vaf-supply = <&pm8953_l17>; + qcom,cam-vreg-name = "cam_vaf"; + qcom,cam-vreg-min-voltage = <2850000>; + qcom,cam-vreg-max-voltage = <2850000>; + qcom,cam-vreg-op-mode = <80000>; + }; + + eeprom0: qcom,eeprom@0 { + cell-index = <0>; + reg = <0x0>; + qcom,eeprom-name = "ovt_ov12a10_i"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xB0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x18F6 0x0 2 0 1 0>; + + cam_vio-supply = <&pm8953_l6>; + cam_vaf-supply = <&pm8953_l17>; + qcom,cam-vreg-name = "cam_vio", "cam_vaf"; + qcom,cam-vreg-min-voltage = <1800000 2850000>; + qcom,cam-vreg-max-voltage = <1800000 2850000>; + qcom,cam-vreg-op-mode = <100000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 40 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0"; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vio", "cam_vaf"; + qcom,cam-power-seq-cfg-val = <1 1>; + qcom,cam-power-seq-delay = <5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + eeprom1: qcom,eeprom@1 { + cell-index = <1>; + reg = <0x1>; + qcom,eeprom-name = "sony_imx486_ii"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0xB0>; + qcom,cci-master = <0>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x0 2 0x01 1 1>; + qcom,poll0 = <0 0x0 2 0 1 1>; + qcom,mem0 = <0x18F6 0x0 2 0 1 0>; + + cam_vio-supply = <&pm8953_l6>; + cam_vaf-supply = <&pm8953_l17>; + qcom,cam-vreg-name = "cam_vio", "cam_vaf"; + qcom,cam-vreg-min-voltage = <1800000 2850000>; + qcom,cam-vreg-max-voltage = <1800000 2850000>; + qcom,cam-vreg-op-mode = <100000 100000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 40 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0"; + qcom,cam-power-seq-type = "sensor_vreg", "sensor_vreg"; + qcom,cam-power-seq-val = "cam_vio", "cam_vaf"; + qcom,cam-power-seq-cfg-val = <1 1>; + qcom,cam-power-seq-delay = <5 5>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom2: qcom,eeprom@2{ + cell-index = <2>; + reg = <0x02>; + qcom,eeprom-name = "ovt_ov5675_i"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x20>; + qcom,cci-master = <1>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x3d88 2 0x7010 2 1>; + qcom,poll0 = <0 0x3d88 2 0x7010 2 1>; + qcom,mem0 = <0x95 0x7010 2 0 1 1>; + + cam_vdig-supply = <&pm8953_l23>; + cam_vio-supply = <&pm8953_l6>; + cam_vana-supply = <&pm8953_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2900000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2900000>; + qcom,cam-vreg-op-mode = <105000 80000 80000>; + qcom,gpio-no-mux = <0>; + + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk1_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 27 0>, + <&tlmm 129 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1"; + + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_clk"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "cam_vio", + "cam_vana", + "cam_vdig", + "sensor_gpio_reset", + "sensor_cam_mclk"; + qcom,cam-power-seq-cfg-val = <0 1 1 1 1 24000000>; + qcom,cam-power-seq-delay = <5 1 1 5 10 10>; + + status = "ok"; + clocks = <&clock_gcc clk_mclk1_clk_src>, + <&clock_gcc clk_gcc_camss_mclk1_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + eeprom3: qcom,eeprom@3{ + cell-index = <3>; + reg = <0x03>; + qcom,eeprom-name = "ovt_ov5675_ii"; + compatible = "qcom,eeprom"; + qcom,slave-addr = <0x6c>; + qcom,cci-master = <1>; + qcom,num-blocks = <1>; + + qcom,page0 = <0 0x3d88 2 0x7010 2 1>; + qcom,poll0 = <0 0x3d88 2 0x7010 2 1>; + qcom,mem0 = <0x95 0x7010 2 0 1 1>; + + cam_vdig-supply = <&pm8953_l23>; + cam_vio-supply = <&pm8953_l6>; + cam_vana-supply = <&pm8953_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 1800000 2900000>; + qcom,cam-vreg-max-voltage = <1200000 1800000 2900000>; + qcom,cam-vreg-op-mode = <105000 80000 80000>; + qcom,gpio-no-mux = <0>; + + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk1_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 27 0>, + <&tlmm 129 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1"; + + qcom,cam-power-seq-type = + "sensor_gpio", + "sensor_vreg", + "sensor_vreg", + "sensor_vreg", + "sensor_gpio", + "sensor_clk"; + qcom,cam-power-seq-val = + "sensor_gpio_reset", + "cam_vio", + "cam_vana", + "cam_vdig", + "sensor_gpio_reset", + "sensor_cam_mclk"; + qcom,cam-power-seq-cfg-val = <0 1 1 1 1 24000000>; + qcom,cam-power-seq-delay = <5 1 1 5 10 10>; + + status = "ok"; + clocks = <&clock_gcc clk_mclk1_clk_src>, + <&clock_gcc clk_gcc_camss_mclk1_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + + qcom,camera@0 { + cell-index = <0>; + compatible = "qcom,camera"; + reg = <0x0>; + qcom,csiphy-sd-index = <0>; + qcom,csid-sd-index = <0>; + qcom,mount-angle = <270>; + qcom,actuator-src = <&actuator0>; + qcom,eeprom-src = <&eeprom0 &eeprom1>; + qcom,led-flash-src = <&led_flash0>; + cam_vio-supply = <&pm8953_l6>; + cam_vdig-supply = <&pm8953_l2>; + cam_vaf-supply = <&pm8953_l17>; + cam_vana-supply = <&pm8953_l22>; + qcom,cam-vreg-name = "cam_vio", "cam_vdig", "cam_vaf", + "cam_vana"; + qcom,cam-vreg-min-voltage = <0 1200000 2850000 2900000>; + qcom,cam-vreg-max-voltage = <0 1200000 2850000 2900000>; + qcom,cam-vreg-op-mode = <0 105000 100000 80000>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk0_default + &cam_sensor_rear_default>; + pinctrl-1 = <&cam_sensor_mclk0_sleep &cam_sensor_rear_sleep>; + gpios = <&tlmm 26 0>, + <&tlmm 40 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK0", + "CAM_RESET0"; + qcom,sensor-position = <0>; + qcom,sensor-mode = <0>; + qcom,cci-master = <0>; + status = "ok"; + clocks = <&clock_gcc clk_mclk0_clk_src>, + <&clock_gcc clk_gcc_camss_mclk0_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; + qcom,camera@2 { + cell-index = <2>; + compatible = "qcom,camera"; + reg = <0x02>; + qcom,csiphy-sd-index = <2>; + qcom,csid-sd-index = <2>; + qcom,mount-angle = <90>; + qcom,led-flash-src = <&led_flash1>; + qcom,eeprom-src = <&eeprom2 &eeprom3>; + cam_vdig-supply = <&pm8953_l23>; + cam_vio-supply = <&pm8953_l6>; + cam_vana-supply = <&pm8953_l22>; + qcom,cam-vreg-name = "cam_vdig", "cam_vio", "cam_vana"; + qcom,cam-vreg-min-voltage = <1200000 0 2900000>; + qcom,cam-vreg-max-voltage = <1200000 0 2900000>; + qcom,cam-vreg-op-mode = <105000 0 80000>; + qcom,gpio-no-mux = <0>; + pinctrl-names = "cam_default", "cam_suspend"; + pinctrl-0 = <&cam_sensor_mclk1_default + &cam_sensor_front1_default>; + pinctrl-1 = <&cam_sensor_mclk1_sleep + &cam_sensor_front1_sleep>; + gpios = <&tlmm 27 0>, + <&tlmm 129 0>; + qcom,gpio-reset = <1>; + qcom,gpio-req-tbl-num = <0 1>; + qcom,gpio-req-tbl-flags = <1 0>; + qcom,gpio-req-tbl-label = "CAMIF_MCLK1", + "CAM_RESET1"; + qcom,sensor-position = <1>; + qcom,sensor-mode = <0>; + qcom,cci-master = <1>; + status = "ok"; + clocks = <&clock_gcc clk_mclk1_clk_src>, + <&clock_gcc clk_gcc_camss_mclk1_clk>; + clock-names = "cam_src_clk", "cam_clk"; + qcom,clock-rates = <24000000 0>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-camera.dtsi b/arch/arm/boot/dts/qcom/msm8953-camera.dtsi index 27ee1e1f9ae37..3d4852966e95d 100644 --- a/arch/arm/boot/dts/qcom/msm8953-camera.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-camera.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -35,13 +35,11 @@ <&clock_gcc clk_csi0phytimer_clk_src>, <&clock_gcc clk_gcc_camss_csi0phytimer_clk>, <&clock_gcc clk_camss_top_ahb_clk_src>, - <&clock_gcc clk_gcc_camss_csi0phy_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", - "camss_ahb_src", "csi_phy_clk", - "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 200000000 0 0 0 0>; + "camss_ahb_src", "camss_ahb_clk"; + qcom,clock-rates = <0 61540000 200000000 0 0 0>; }; qcom,csiphy@1b35000 { @@ -58,13 +56,11 @@ <&clock_gcc clk_csi1phytimer_clk_src>, <&clock_gcc clk_gcc_camss_csi1phytimer_clk>, <&clock_gcc clk_camss_top_ahb_clk_src>, - <&clock_gcc clk_gcc_camss_csi1phy_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", - "camss_ahb_src", "csi_phy_clk", - "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 200000000 0 0 0 0>; + "camss_ahb_src", "camss_ahb_clk"; + qcom,clock-rates = <0 61540000 200000000 0 0 0>; }; qcom,csiphy@1b36000 { @@ -81,13 +77,11 @@ <&clock_gcc clk_csi2phytimer_clk_src>, <&clock_gcc clk_gcc_camss_csi2phytimer_clk>, <&clock_gcc clk_camss_top_ahb_clk_src>, - <&clock_gcc clk_gcc_camss_csi2phy_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", - "camss_ahb_src", "csi_phy_clk", - "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 200000000 0 0 0 0>; + "camss_ahb_src", "camss_ahb_clk"; + qcom,clock-rates = <0 61540000 200000000 0 0 0>; }; qcom,csid@1b30000 { @@ -104,15 +98,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi0_ahb_clk>, <&clock_gcc clk_csi0_clk_src>, + <&clock_gcc clk_gcc_camss_csi0phy_clk>, <&clock_gcc clk_gcc_camss_csi0_clk>, <&clock_gcc clk_gcc_camss_csi0pix_clk>, <&clock_gcc clk_gcc_camss_csi0rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi0_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,csid@1b30400 { @@ -129,15 +125,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi1_ahb_clk>, <&clock_gcc clk_csi1_clk_src>, + <&clock_gcc clk_gcc_camss_csi1phy_clk>, <&clock_gcc clk_gcc_camss_csi1_clk>, <&clock_gcc clk_gcc_camss_csi1pix_clk>, <&clock_gcc clk_gcc_camss_csi1rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi1_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,csid@1b30800 { @@ -154,15 +152,17 @@ <&clock_gcc clk_gcc_camss_ispif_ahb_clk>, <&clock_gcc clk_gcc_camss_csi2_ahb_clk>, <&clock_gcc clk_csi2_clk_src>, + <&clock_gcc clk_gcc_camss_csi2phy_clk>, <&clock_gcc clk_gcc_camss_csi2_clk>, <&clock_gcc clk_gcc_camss_csi2pix_clk>, <&clock_gcc clk_gcc_camss_csi2rdi_clk>, <&clock_gcc clk_gcc_camss_ahb_clk>; clock-names = "camss_top_ahb_clk", "ispif_ahb_clk", "csi_ahb_clk", "csi_src_clk", + "csi2_phy_clk", "csi_clk", "csi_pix_clk", "csi_rdi_clk", "camss_ahb_clk"; - qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0>; + qcom,clock-rates = <0 61540000 0 200000000 0 0 0 0 0>; }; qcom,ispif@1b31000 { @@ -232,8 +232,9 @@ cell-index = <0>; compatible = "qcom,vfe40"; reg = <0x1b10000 0x1000>, - <0x1b40000 0x200>; - reg-names = "vfe", "vfe_vbif"; + <0x1b40000 0x200>, + <0x00a4174 0x8>; + reg-names = "vfe", "vfe_vbif", "vfe_fuse"; interrupts = <0 57 0>; interrupt-names = "vfe"; vdd-supply = <&gdsc_vfe>; @@ -282,8 +283,9 @@ cell-index = <1>; compatible = "qcom,vfe40"; reg = <0x1b14000 0x1000>, - <0x1ba0000 0x200>; - reg-names = "vfe", "vfe_vbif"; + <0x1ba0000 0x200>, + <0x00a4174 0x8>; + reg-names = "vfe", "vfe_vbif", "vfe_fuse"; interrupts = <0 29 0>; interrupt-names = "vfe"; vdd-supply = <&gdsc_vfe1>; diff --git a/arch/arm/boot/dts/qcom/msm8953-cdp-1200p.dts b/arch/arm/boot/dts/qcom/msm8953-cdp-1200p.dts index 13d95f4b42066..e4d57a7563a8e 100644 --- a/arch/arm/boot/dts/qcom/msm8953-cdp-1200p.dts +++ b/arch/arm/boot/dts/qcom/msm8953-cdp-1200p.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -14,11 +14,14 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" #include "msm8953-audio-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 CDP"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 CDP"; compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; qcom,board-id= <1 1>; }; @@ -28,7 +31,6 @@ qcom,platform-enable-gpio = <&tlmm 12 0>; }; - &pm8953_pwm { status = "ok"; }; @@ -62,6 +64,11 @@ }; }; +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; + &hsuart_active { mux { pins = "gpio13", "gpio14", "gpio15"; diff --git a/arch/arm/boot/dts/qcom/msm8953-cdp.dts b/arch/arm/boot/dts/qcom/msm8953-cdp.dts index 94ea484112466..3f06f6ba0bd5d 100644 --- a/arch/arm/boot/dts/qcom/msm8953-cdp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-cdp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -14,10 +14,19 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 CDP"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 CDP"; compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; qcom,board-id= <1 0>; + qcom,pmic-id = <0x010016 0x010011 0x0 0x0>; +}; + +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-cdp.dtsi b/arch/arm/boot/dts/qcom/msm8953-cdp.dtsi index b04c1b9a37439..0cbc311953a3a 100644 --- a/arch/arm/boot/dts/qcom/msm8953-cdp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-cdp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -13,7 +13,6 @@ #include "msm8953-pinctrl.dtsi" #include "msm8953-audio-cdp.dtsi" -#include "msm8953-camera-sensor-cdp.dtsi" &spi_3 { /* BLSP1 QUP3 */ spi-max-frequency = <8000000>; @@ -143,7 +142,7 @@ }; }; -&pmi_haptic{ +&pmi_haptic { qcom,actuator-type = "lra"; qcom,lra-auto-res-mode="qwd"; qcom,lra-high-z="opt1"; @@ -195,11 +194,6 @@ qcom,platform-bklight-en-gpio = <&tlmm 59 0>; }; -&labibb { - status = "ok"; - qpnp,qpnp-labibb-mode = "lcd"; -}; - &dsi_truly_1080_vid { qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; qcom,mdss-dsi-pan-enable-dynamic-fps; @@ -293,11 +287,6 @@ pinctrl-0 = <&typec_ssmux_config>; }; -&pmi8950_charger { - qcom,external-typec; - qcom,typec-psy-name = "typec"; -}; - &pm8953_gpios { /* GPIO 2 (NFC_CLK_REQ) */ gpio@c100 { diff --git a/arch/arm/boot/dts/qcom/msm8953-coresight.dtsi b/arch/arm/boot/dts/qcom/msm8953-coresight.dtsi index 246c9c5027e33..d0e4cbc5f7fdd 100644 --- a/arch/arm/boot/dts/qcom/msm8953-coresight.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-coresight.dtsi @@ -751,9 +751,9 @@ clock-names = "core_clk", "core_a_clk"; }; - cti_modem_cpu0: cti@6124000 { + cti_modem_cpu0: cti@6128000 { compatible = "arm,coresight-cti"; - reg = <0x6124000 0x1000>; + reg = <0x6128000 0x1000>; reg-names = "cti-base"; coresight-id = <44>; @@ -765,9 +765,9 @@ clock-names = "core_clk", "core_a_clk"; }; - cti_modem_cpu1: cti@6128000{ + cti_modem_cpu1: cti@6124000{ compatible = "arm,coresight-cti"; - reg = <0x6128000 0x1000>; + reg = <0x6124000 0x1000>; reg-names = "cti-base"; coresight-id = <45>; diff --git a/arch/arm/boot/dts/qcom/msm8953-ext-codec-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-ext-codec-mtp.dts index f952c04adcf65..039c75045cc7c 100644 --- a/arch/arm/boot/dts/qcom/msm8953-ext-codec-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-ext-codec-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -14,12 +14,36 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 External Codec MTP"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 Ext Codec MTP"; compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; qcom,board-id= <8 1>; + qcom,pmic-id = <0x010016 0x010011 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; &int_codec { diff --git a/arch/arm/boot/dts/qcom/msm8953-ext-codec-rcm.dts b/arch/arm/boot/dts/qcom/msm8953-ext-codec-rcm.dts index dad5f5a9fc5c6..1751e8627fc30 100644 --- a/arch/arm/boot/dts/qcom/msm8953-ext-codec-rcm.dts +++ b/arch/arm/boot/dts/qcom/msm8953-ext-codec-rcm.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -14,10 +14,13 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 External Codec RCM"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 Ext Codec RCM"; compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; qcom,board-id= <21 1>; }; @@ -106,3 +109,8 @@ pins = "gpio85", "gpio86", "gpio87"; }; }; + +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-gpu.dtsi b/arch/arm/boot/dts/qcom/msm8953-gpu.dtsi index 670abab448ddc..52830c459e08b 100644 --- a/arch/arm/boot/dts/qcom/msm8953-gpu.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-gpu.dtsi @@ -178,7 +178,7 @@ reg = <3>; qcom,gpu-freq = <400000000>; qcom,bus-freq = <7>; - qcom,bus-min = <4>; + qcom,bus-min = <5>; qcom,bus-max = <8>; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-ion.dtsi b/arch/arm/boot/dts/qcom/msm8953-ion.dtsi index 4c8ef75038821..11d39ff5990ae 100644 --- a/arch/arm/boot/dts/qcom/msm8953-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-ion.dtsi @@ -21,11 +21,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@8 { /* CP_MM HEAP */ reg = <8>; memory-region = <&secure_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8953-iot-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-iot-mtp.dts index d5acbfb891e4e..8b4c392184b5a 100644 --- a/arch/arm/boot/dts/qcom/msm8953-iot-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-iot-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -14,10 +14,13 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 IOT MTP"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 IOT MTP"; compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; qcom,board-id= <8 2>; }; @@ -40,3 +43,23 @@ }; }; }; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-mdss-panels.dtsi b/arch/arm/boot/dts/qcom/msm8953-mdss-panels.dtsi index 14d742d19996f..9c857fd68f9d1 100644 --- a/arch/arm/boot/dts/qcom/msm8953-mdss-panels.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-mdss-panels.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -44,25 +44,6 @@ qcom,supply-enable-load = <100000>; qcom,supply-disable-load = <100>; }; - - qcom,panel-supply-entry@2 { - reg = <2>; - qcom,supply-name = "lab"; - qcom,supply-min-voltage = <4600000>; - qcom,supply-max-voltage = <6000000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - }; - - qcom,panel-supply-entry@3 { - reg = <3>; - qcom,supply-name = "ibb"; - qcom,supply-min-voltage = <4600000>; - qcom,supply-max-voltage = <6000000>; - qcom,supply-enable-load = <100000>; - qcom,supply-disable-load = <100>; - qcom,supply-post-on-sleep = <10>; - }; }; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-mdss.dtsi b/arch/arm/boot/dts/qcom/msm8953-mdss.dtsi index c3a428e18cb77..3770b53243a39 100644 --- a/arch/arm/boot/dts/qcom/msm8953-mdss.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-mdss.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -304,8 +304,6 @@ qcom,mdss-mdp = <&mdss_mdp>; vdd-supply = <&pm8953_l17>; vddio-supply = <&pm8953_l6>; - lab-supply = <&lab_regulator>; - ibb-supply = <&ibb_regulator>; clocks = <&clock_gcc_mdss clk_gcc_mdss_byte0_clk>, <&clock_gcc_mdss clk_gcc_mdss_pclk0_clk>, @@ -353,8 +351,6 @@ qcom,mdss-mdp = <&mdss_mdp>; vdd-supply = <&pm8953_l17>; vddio-supply = <&pm8953_l6>; - lab-supply = <&lab_regulator>; - ibb-supply = <&ibb_regulator>; clocks = <&clock_gcc_mdss clk_gcc_mdss_byte1_clk>, <&clock_gcc_mdss clk_gcc_mdss_pclk1_clk>, diff --git a/arch/arm/boot/dts/qcom/msm8953-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-mtp.dts index e90897b27525d..69198d6d03081 100644 --- a/arch/arm/boot/dts/qcom/msm8953-mtp.dts +++ b/arch/arm/boot/dts/qcom/msm8953-mtp.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -14,10 +14,34 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 MTP"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 MTP"; compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x010011 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-mtp.dtsi b/arch/arm/boot/dts/qcom/msm8953-mtp.dtsi index e9d1e325d0567..af1d61ae20b4f 100644 --- a/arch/arm/boot/dts/qcom/msm8953-mtp.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-mtp.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -13,7 +13,6 @@ #include "msm8953-pinctrl.dtsi" #include "msm8953-audio-mtp.dtsi" -#include "msm8953-camera-sensor-mtp.dtsi" &spi_3 { /* BLSP1 QUP3 */ spi-max-frequency = <16000000>; @@ -161,11 +160,6 @@ qcom,platform-bklight-en-gpio = <&tlmm 59 0>; }; -&labibb { - status = "ok"; - qpnp,qpnp-labibb-mode = "lcd"; -}; - &dsi_truly_1080_vid { qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; qcom,mdss-dsi-pan-enable-dynamic-fps; @@ -254,26 +248,6 @@ pinctrl-0 = <&typec_ssmux_config>; }; -/{ - mtp_batterydata: qcom,battery-data { - qcom,batt-id-range-pct = <15>; - #include "batterydata-itech-3000mah.dtsi" - #include "batterydata-ascent-3450mAh.dtsi" - }; -}; - -&pmi8950_fg { - qcom,battery-data = <&mtp_batterydata>; -}; - -&pmi8950_charger { - qcom,battery-data = <&mtp_batterydata>; - qcom,chg-led-sw-controls; - qcom,chg-led-support; - qcom,external-typec; - qcom,typec-psy-name = "typec"; -}; - &pm8953_gpios { /* GPIO 2 (NFC_CLK_REQ) */ gpio@c100 { diff --git a/arch/arm/boot/dts/qcom/msm8953-mtp_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-mtp_rosy.dtsi new file mode 100644 index 0000000000000..0693452033e89 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-mtp_rosy.dtsi @@ -0,0 +1,405 @@ +/* + * Copyright (c) 2015-2016, 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 "msm8953-pinctrl.dtsi" +#include "msm8953-audio-mtp.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" +#include "dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi" +#include "dsi-panel-ft8006m-boe-5p7-720p-video.dtsi" +#include "dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi" + +&spi_3 { /* BLSP1 QUP3 */ + spi-max-frequency = <16000000>; + maxim_sti@0 { + status = "disabled"; + compatible = "maxim,maxim_sti"; + reg = <0>; + interrupt-parent = <&tlmm>; + interrupts = <65 0>; + spi-max-frequency = <16000000>; + avdd-supply = <&pm8953_l10>; + dvdd-supply = <&pm8953_l5>; + maxim_sti,irq-gpio = <&tlmm 65 0x00>; + maxim_sti,reset-gpio = <&tlmm 64 0x00>; + maxim_sti,touch_fusion = "/vendor/bin/touch_fusion"; + maxim_sti,config_file = "/etc/firmware/qtc800s.cfg"; + maxim_sti,fw_name = "qtc800s.bin"; + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + }; +}; + +&i2c_5 { /* BLSP2 QUP1 (NFC) */ + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <&tlmm 17 0x00>; + qcom,nq-ven = <&tlmm 16 0x00>; + qcom,nq-firm = <&tlmm 62 0x00>; + qcom,nq-clkreq = <&pm8953_gpios 2 0x00>; + interrupt-parent = <&tlmm>; + qcom,clk-src = "BBCLK2"; + interrupts = <17 0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <&nfc_int_active &nfc_disable_active>; + pinctrl-1 = <&nfc_int_suspend &nfc_disable_suspend>; + clocks = <&clock_gcc clk_bb_clk2_pin>; + clock-names = "ref_clk"; + }; +}; + +&i2c_3 { + status = "ok"; + focaltech@38{ + compatible = "focaltech,fts"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8953_l10>; + vcc_i2c-suppy = <&pm8953_l6>; + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + focaltech,name = "fts_ts"; + focaltech,family-id = <0x54>; + focaltech,reset-gpio = <&tlmm 64 0x00>; + focaltech,irq-gpio = <&tlmm 65 0x2008>; + focaltech,display-coords = <0 0 1080 1920>; + focaltech,panel-coords = <0 0 1080 1920>; + /*ftech,button-map= <139 102 158>;*/ + focaltech,virtual-key1 = <139 560 2000>;/*menu*/ + focaltech,virtual-key2 = <102 360 2000>;/*home*/ + focaltech,virtual-key3 = <158 160 2000>;/*back*/ + focaltech,no-force-update; + focaltech,i2c-pull-up; + focaltech,group-id = <1>; + focaltech,hard-reset-delay-ms = <20>; + focaltech,soft-reset-delay-ms = <200>; + focaltech,num-max-touches = <10>; + focaltech,fw-delay-aa-ms = <30>; + focaltech,fw-delay-55-ms = <30>; + focaltech,fw-upgrade-id1 = <0x79>; + focaltech,fw-upgrade-id2 = <0x18>; + focaltech,fw-delay-readid-ms = <10>; + focaltech,fw-delay-era-flsh-ms = <2000>; + focaltech,fw-auto-cal; + focaltech,ignore-id-check; + }; +}; + +&pm8953_l10 { + regulator-max-microvolt = <2850000>; +}; + +&soc { + gpio_keys { + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend"; + pinctrl-0 = <&gpio_key_active>; + pinctrl-1 = <&gpio_key_suspend>; + + camera_focus { + label = "camera_focus"; + gpios = <&tlmm 87 0x1>; + linux,input-type = <1>; + linux,code = <0x210>; + debounce-interval = <15>; + }; + + camera_snapshot { + label = "camera_snapshot"; + gpios = <&tlmm 86 0x1>; + linux,input-type = <1>; + linux,code = <0x2fe>; + debounce-interval = <15>; + }; + + vol_up { + label = "volume_up"; + gpios = <&tlmm 85 0x1>; + linux,input-type = <1>; + linux,code = <115>; + debounce-interval = <15>; + }; + }; + + hbtp { + compatible = "qcom,hbtp-input"; + vcc_ana-supply = <&pm8953_l10>; + vcc_dig-supply = <&pm8953_l5>; + qcom,afe-load = <50000>; + qcom,afe-vtg-min = <2850000>; + qcom,afe-vtg-max = <2850000>; + qcom,dig-load = <15000>; + qcom,dig-vtg-min = <1800000>; + qcom,dig-vtg-max = <1800000>; + }; + i2c@78b6000 { /* i2c 2 */ + aw2013@45 { /*blink */ + compatible = "awinc,aw2013"; + reg = <0x45>; + rgb_led-supply = <&pm8953_l10>; + + red { + label = "red"; + linux,default-trigger = "battery-red"; + default-state = "off"; + retain-state-suspended; + }; + + green { + label = "green"; + linux,default-trigger = "battery-green"; + default-state = "off"; + retain-state-suspended; + }; + + blue { + label = "blue"; + linux,default-trigger = "battery-blue"; + default-state = "off"; + retain-state-suspended; + }; + white { + label = "white"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + yellow { + label = "yellow"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + cyan { + label = "cyan"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + purple { + label = "purple"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + }; + }; +}; + +&pmi_haptic{ + qcom,actuator-type = "lra"; + qcom,lra-auto-res-mode="qwd"; + qcom,lra-high-z="opt1"; + qcom,lra-res-cal-period = <0>; + qcom,wave-play-rate-us = <4165>; +}; + +&wled { + qcom,cons-sync-write-delay-us = <1000>; +}; + +&flash_led { + compatible = "qcom,qpnp-flash-led"; + reg = <0xd300 0x100>; + qcom,follow-otst2-rb-disabled; +}; + +#include "msm8953-mdss-panels.dtsi" + +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + qcom,dsi-pref-prim-pan = <&dsi_ft8613_ebbg_5p7_720p_video>; + qcom,dsi-pref-sub-pan = <&dsi_ft8006m_boe_5p7_720p_video>; + qcom,dsi-pref-sub1-pan = <&dsi_ft8613_ebbg_5p5_1080p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active>; + pinctrl-1 = <&mdss_dsi_suspend>; + + qcom,platform-reset-gpio = <&tlmm 61 0>; + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + status = "disabled"; + qcom,dsi-pref-prim-pan = <&dsi_adv7533_1080p>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active &mdss_te_active>; + pinctrl-1 = <&mdss_dsi_suspend &mdss_te_suspend>; + + qcom,pluggable; + qcom,platform-te-gpio = <&tlmm 24 0>; + qcom,platform-reset-gpio = <&tlmm 61 0>; + qcom,platform-bklight-en-gpio = <&tlmm 59 0>; +}; + +&labibb { + status = "ok"; + qpnp,qpnp-labibb-mode = "lcd"; +}; + +&dsi_ft8613_ebbg_5p7_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ft8006m_boe_5p7_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_ft8613_ebbg_5p5_1080p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_truly_1080_vid { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,mdss-dsi-pan-enable-dynamic-fps; + qcom,mdss-dsi-pan-fps-update = "dfps_immediate_clk_mode"; +}; + +&dsi_truly_1080_cmd { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,ulps-enabled; + qcom,partial-update-enabled; + qcom,panel-roi-alignment = <2 2 4 2 1080 2>; +}; + +&blsp1_uart0 { + status = "ok"; + pinctrl-names = "default"; + pinctrl-0 = <&uart_console_active>; +}; + +&mem_client_3_size { + qcom,peripheral-size = <0x500000>; +}; + +&sdhc_1 { + /* device core power supply */ + vdd-supply = <&pm8953_l8>; + qcom,vdd-voltage-level = <2900000 2900000>; + qcom,vdd-current-level = <200 570000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8953_l5>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <1800000 1800000>; + qcom,vdd-io-current-level = <200 325000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on &sdc1_rclk_on>; + pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off &sdc1_rclk_off>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 192000000 + 384000000>; + qcom,nonremovable; + qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v"; + + status = "ok"; +}; + +&sdhc_2 { + /* device core power supply */ + vdd-supply = <&pm8953_l11>; + qcom,vdd-voltage-level = <2950000 2950000>; + qcom,vdd-current-level = <15000 800000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8953_l12>; + qcom,vdd-io-voltage-level = <1800000 2950000>; + qcom,vdd-io-current-level = <200 22000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>; + pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off>; + + #address-cells = <0>; + interrupt-parent = <&sdhc_2>; + interrupts = <0 1 2>; + #interrupt-cells = <1>; + interrupt-map-mask = <0xffffffff>; + interrupt-map = <0 &intc 0 125 0 + 1 &intc 0 221 0 + 2 &tlmm 133 0>; + interrupt-names = "hc_irq", "pwr_irq", "status_irq"; + cd-gpios = <&tlmm 133 0x1>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 + 200000000>; + qcom,bus-speed-mode = "SDR12", "SDR25", "SDR50", "DDR50", "SDR104"; + + status = "ok"; +}; + +&pm8953_typec { + ss-mux-supply = <&pm8953_l13>; + qcom,ssmux-gpio = <&tlmm 139 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&typec_ssmux_config>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; + +&pm8953_gpios { + /* GPIO 2 (NFC_CLK_REQ) */ + gpio@c100 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pinctrl_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-pinctrl_rosy.dtsi new file mode 100644 index 0000000000000..9523453cfb500 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pinctrl_rosy.dtsi @@ -0,0 +1,1476 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + +&soc { + tlmm: pinctrl@1000000 { + compatible = "qcom,msm8953-pinctrl"; + reg = <0x1000000 0x300000>; + interrupts = <0 208 0>; + gpio-controller; + #gpio-cells = <2>; + interrupt-controller; + #interrupt-cells = <2>; + + pmx-uartconsole { + uart_console_active: uart_console_active { + mux { + pins = "gpio4", "gpio5"; + function = "blsp_uart2"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <2>; + bias-disable; + }; + }; + + uart_console_sleep: uart_console_sleep { + mux { + pins = "gpio4", "gpio5"; + function = "blsp_uart2"; + }; + + config { + pins = "gpio4", "gpio5"; + drive-strength = <2>; + bias-pull-down; + }; + }; + + }; + cci { + cci0_active: cci0_active { + /* cci0 active state */ + mux { + /* CLK, DATA */ + pins = "gpio29", "gpio30"; + function = "cci_i2c"; + }; + + config { + pins = "gpio29", "gpio30"; + drive-strength = <2>; /* 2 MA */ + bias-disable; /* No PULL */ + }; + }; + + cci0_suspend: cci0_suspend { + /* cci0 suspended state */ + mux { + /* CLK, DATA */ + pins = "gpio29", "gpio30"; + function = "cci_i2c"; + }; + + config { + pins = "gpio29", "gpio30"; + drive-strength = <2>; /* 2 MA */ + bias-disable; /* No PULL */ + }; + }; + + cci1_active: cci1_active { + /* cci1 active state */ + mux { + /* CLK, DATA */ + pins = "gpio31", "gpio32"; + function = "cci_i2c"; + }; + + config { + pins = "gpio31", "gpio32"; + drive-strength = <2>; /* 2 MA */ + bias-disable; /* No PULL */ + }; + }; + + cci1_suspend: cci1_suspend { + /* cci1 suspended state */ + mux { + /* CLK, DATA */ + pins = "gpio31", "gpio32"; + function = "cci_i2c"; + }; + + config { + pins = "gpio31", "gpio32"; + drive-strength = <2>; /* 2 MA */ + bias-disable; /* No PULL */ + }; + }; + }; + + /*sensors */ + cam_sensor_mclk0_default: cam_sensor_mclk0_default { + /* MCLK0 */ + mux { + /* CLK, DATA */ + pins = "gpio26"; + function = "cam_mclk"; + }; + + config { + pins = "gpio26"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_mclk0_sleep: cam_sensor_mclk0_sleep { + /* MCLK0 */ + mux { + /* CLK, DATA */ + pins = "gpio26"; + function = "cam_mclk"; + }; + + config { + pins = "gpio26"; + bias-pull-down; /* PULL DOWN */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_rear_default: cam_sensor_rear_default { + /* RESET, STANDBY */ + mux { + pins = "gpio40"; + function = "gpio"; + }; + + config { + pins = "gpio40"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_rear_sleep: cam_sensor_rear_sleep { + /* RESET, STANDBY */ + mux { + pins = "gpio40"; + function = "gpio"; + }; + + config { + pins = "gpio40"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_mclk1_default: cam_sensor_mclk1_default { + /* MCLK1 */ + mux { + /* CLK, DATA */ + pins = "gpio27"; + function = "cam_mclk"; + }; + + config { + pins = "gpio27"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_mclk1_sleep: cam_sensor_mclk1_sleep { + /* MCLK1 */ + mux { + /* CLK, DATA */ + pins = "gpio27"; + function = "cam_mclk"; + }; + + config { + pins = "gpio27"; + bias-pull-down; /* PULL DOWN */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_front1_default: cam_sensor_front1_default { + /* RESET, STANDBY */ + mux { + pins = "gpio129", "gpio130"; + function = "gpio"; + }; + + config { + pins = "gpio129", "gpio130"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + cam_sensor_front1_sleep: cam_sensor_front1_sleep { + /* RESET, STANDBY */ + mux { + pins = "gpio129", "gpio130"; + function = "gpio"; + }; + + config { + pins = "gpio129", "gpio130"; + bias-disable; /* No PULL */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + pmx_adv7533_int: pmx_adv7533_int { + adv7533_int_active: adv7533_int_active { + mux { + pins = "gpio90"; + function = "gpio"; + }; + + config { + pins = "gpio90"; + drive-strength = <16>; + bias-disable; + }; + }; + + adv7533_int_suspend: adv7533_int_suspend { + mux { + pins = "gpio90"; + function = "gpio"; + }; + + config { + pins = "gpio90"; + drive-strength = <16>; + bias-disable; + }; + }; + + }; + + pmx_mdss: pmx_mdss { + mdss_dsi_active: mdss_dsi_active { + mux { + pins = "gpio61", "gpio59"; + function = "gpio"; + }; + + config { + pins = "gpio61", "gpio59"; + drive-strength = <8>; /* 8 mA */ + bias-disable = <0>; /* no pull */ + output-high; + }; + }; + + mdss_dsi_suspend: mdss_dsi_suspend { + mux { + pins = "gpio61", "gpio59"; + function = "gpio"; + }; + + config { + pins = "gpio61", "gpio59"; + drive-strength = <2>; /* 2 mA */ + bias-pull-down; /* pull down */ + }; + }; + }; + + pmx_mdss_te { + mdss_te_active: mdss_te_active { + mux { + pins = "gpio24"; + function = "mdp_vsync"; + }; + config { + pins = "gpio24"; + drive-strength = <2>; /* 8 mA */ + bias-pull-down; /* pull down*/ + }; + }; + + mdss_te_suspend: mdss_te_suspend { + mux { + pins = "gpio24"; + function = "mdp_vsync"; + }; + config { + pins = "gpio24"; + drive-strength = <2>; /* 2 mA */ + bias-pull-down; /* pull down */ + }; + }; + }; + + /* SDC pin type */ + sdc1_clk_on: sdc1_clk_on { + config { + pins = "sdc1_clk"; + bias-disable; /* NO pull */ + drive-strength = <16>; /* 16 MA */ + }; + }; + + sdc1_clk_off: sdc1_clk_off { + config { + pins = "sdc1_clk"; + bias-disable; /* NO pull */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc1_cmd_on: sdc1_cmd_on { + config { + pins = "sdc1_cmd"; + bias-pull-up; /* pull up */ + drive-strength = <10>; /* 10 MA */ + }; + }; + + sdc1_cmd_off: sdc1_cmd_off { + config { + pins = "sdc1_cmd"; + num-grp-pins = <1>; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc1_data_on: sdc1_data_on { + config { + pins = "sdc1_data"; + bias-pull-up; /* pull up */ + drive-strength = <10>; /* 10 MA */ + }; + }; + + sdc1_data_off: sdc1_data_off { + config { + pins = "sdc1_data"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc1_rclk_on: sdc1_rclk_on { + config { + pins = "sdc1_rclk"; + bias-pull-down; /* pull down */ + }; + }; + + sdc1_rclk_off: sdc1_rclk_off { + config { + pins = "sdc1_rclk"; + bias-pull-down; /* pull down */ + }; + }; + + sdc2_clk_on: sdc2_clk_on { + config { + pins = "sdc2_clk"; + drive-strength = <16>; /* 16 MA */ + bias-disable; /* NO pull */ + }; + }; + + sdc2_clk_off: sdc2_clk_off { + config { + pins = "sdc2_clk"; + bias-disable; /* NO pull */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc2_cmd_on: sdc2_cmd_on { + config { + pins = "sdc2_cmd"; + bias-pull-up; /* pull up */ + drive-strength = <10>; /* 10 MA */ + }; + }; + + sdc2_cmd_off: sdc2_cmd_off { + config { + pins = "sdc2_cmd"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc2_data_on: sdc2_data_on { + config { + pins = "sdc2_data"; + bias-pull-up; /* pull up */ + drive-strength = <10>; /* 10 MA */ + }; + }; + + sdc2_data_off: sdc2_data_off { + config { + pins = "sdc2_data"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + + sdc2_cd_on: cd_on { + mux { + pins = "gpio133"; + function = "gpio"; + }; + + config { + pins = "gpio133"; + drive-strength = <2>; + bias-pull-up; + }; + }; + + sdc2_cd_off: cd_off { + mux { + pins = "gpio133"; + function = "gpio"; + }; + + config { + pins = "gpio133"; + drive-strength = <2>; + bias-disable; + }; + }; + gpio_led_pins { + gpio_led_off: gpio_led_off { + mux { + pins = "gpio20"; + function = "gpio"; + }; + config { + pins = "gpio20"; + drive-strength = <6>; + bias-pull-down; + output-low; + }; + }; + }; + i2c_2 { + i2c_2_active: i2c_2_active { + /* active state */ + mux { + pins = "gpio6", "gpio7"; + function = "blsp_i2c2"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <2>; + bias-disable; + }; + }; + + i2c_2_sleep: i2c_2_sleep { + /* suspended state */ + mux { + pins = "gpio6", "gpio7"; + function = "gpio"; + }; + + config { + pins = "gpio6", "gpio7"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + i2c_3 { + i2c_3_active: i2c_3_active { + /* active state */ + mux { + pins = "gpio10", "gpio11"; + function = "blsp_i2c3"; + }; + + config { + pins = "gpio10", "gpio11"; + drive-strength = <2>; + bias-disable; + }; + }; + + i2c_3_sleep: i2c_3_sleep { + /* suspended state */ + mux { + pins = "gpio10", "gpio11"; + function = "gpio"; + }; + + config { + pins = "gpio10", "gpio11"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + i2c_5 { + i2c_5_active: i2c_5_active { + /* active state */ + mux { + pins = "gpio18", "gpio19"; + function = "blsp_i2c5"; + }; + + config { + pins = "gpio18", "gpio19"; + drive-strength = <2>; + bias-disable; + }; + }; + + i2c_5_sleep: i2c_5_sleep { + /* suspended state */ + mux { + pins = "gpio18", "gpio19"; + function = "gpio"; + }; + + config { + pins = "gpio18", "gpio19"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + i2c_8{ + i2c_8_active:i2c_8_active{ + /* active state */ + mux{ + pins = "gpio98","gpio99"; + function = "blsp_i2c8"; + }; + + config{ + pins = "gpio98","gpio99"; + drive-strength = <2>; + bias-disable; + }; + }; + + i2c_8_sleep:i2c_8_sleep{ + /* suspended state */ + mux{ + pins = "gpio98","gpio99"; + function = "gpio"; + }; + + config{ + pins = "gpio98","gpio99"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + wcnss_pmux_5wire { + /* Active configuration of bus pins */ + wcnss_default: wcnss_default { + wcss_wlan2 { + pins = "gpio76"; + function = "wcss_wlan2"; + }; + wcss_wlan1 { + pins = "gpio77"; + function = "wcss_wlan1"; + }; + wcss_wlan0 { + pins = "gpio78"; + function = "wcss_wlan0"; + }; + wcss_wlan { + pins = "gpio79", "gpio80"; + function = "wcss_wlan"; + }; + + config { + pins = "gpio76", "gpio77", + "gpio78", "gpio79", + "gpio80"; + drive-strength = <6>; /* 6 MA */ + bias-pull-up; /* PULL UP */ + }; + }; + + wcnss_sleep: wcnss_sleep { + wcss_wlan2 { + pins = "gpio76"; + function = "wcss_wlan2"; + }; + wcss_wlan1 { + pins = "gpio77"; + function = "wcss_wlan1"; + }; + wcss_wlan0 { + pins = "gpio78"; + function = "wcss_wlan0"; + }; + wcss_wlan { + pins = "gpio79", "gpio80"; + function = "wcss_wlan"; + }; + + config { + pins = "gpio76", "gpio77", + "gpio78", "gpio79", + "gpio80"; + drive-strength = <2>; /* 2 MA */ + bias-pull-down; /* PULL Down */ + }; + }; + }; + + wcnss_pmux_gpio: wcnss_pmux_gpio { + wcnss_gpio_default: wcnss_gpio_default { + /* Active configuration of bus pins */ + mux { + /* Uses general purpose pins */ + pins = "gpio76", "gpio77", + "gpio78", "gpio79", + "gpio80"; + function = "gpio"; + }; + + config { + pins = "gpio76", "gpio77", + "gpio78", "gpio79", + "gpio80"; + drive-strength = <6>; /* 6 MA */ + bias-pull-up; /* PULL UP */ + }; + }; + }; + + wcd9xxx_intr { + wcd_intr_default: wcd_intr_default{ + mux { + pins = "gpio73"; + function = "gpio"; + }; + + config { + pins = "gpio73"; + drive-strength = <2>; /* 2 mA */ + bias-pull-down; /* pull down */ + input-enable; + }; + }; + }; + + cdc_reset_ctrl { + cdc_reset_sleep: cdc_reset_sleep { + mux { + pins = "gpio67"; + function = "gpio"; + }; + config { + pins = "gpio67"; + drive-strength = <16>; + bias-disable; + output-low; + }; + }; + cdc_reset_active:cdc_reset_active { + mux { + pins = "gpio67"; + function = "gpio"; + }; + config { + pins = "gpio67"; + drive-strength = <16>; + bias-pull-down; + output-high; + }; + }; + }; + + cdc_mclk2_pin { + cdc_mclk2_sleep: cdc_mclk2_sleep { + mux { + pins = "gpio66"; + function = "pri_mi2s"; + }; + config { + pins = "gpio66"; + drive-strength = <2>; /* 2 mA */ + bias-pull-down; /* PULL DOWN */ + }; + }; + cdc_mclk2_active: cdc_mclk2_active { + mux { + pins = "gpio66"; + function = "pri_mi2s"; + }; + config { + pins = "gpio66"; + drive-strength = <8>; /* 8 mA */ + bias-disable; /* NO PULL */ + }; + }; + }; + + cdc-pdm-2-lines { + cdc_pdm_lines_2_act: pdm_lines_2_on { + mux { + pins = "gpio70", "gpio71", "gpio72"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio70", "gpio71", "gpio72"; + drive-strength = <8>; + }; + }; + + cdc_pdm_lines_2_sus: pdm_lines_2_off { + mux { + pins = "gpio70", "gpio71", "gpio72"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio70", "gpio71", "gpio72"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + cdc-pdm-lines { + cdc_pdm_lines_act: pdm_lines_on { + mux { + pins = "gpio69", "gpio73", "gpio74"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio69", "gpio73", "gpio74"; + drive-strength = <8>; + }; + }; + cdc_pdm_lines_sus: pdm_lines_off { + mux { + pins = "gpio69", "gpio73", "gpio74"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio69", "gpio73", "gpio74"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + cdc-pdm-comp-lines { + cdc_pdm_comp_lines_act: pdm_comp_lines_on { + mux { + pins = "gpio67", "gpio68"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio67", "gpio68"; + drive-strength = <8>; + }; + }; + + cdc_pdm_comp_lines_sus: pdm_comp_lines_off { + mux { + pins = "gpio67", "gpio68"; + function = "cdc_pdm0"; + }; + + config { + pins = "gpio67", "gpio68"; + drive-strength = <2>; + bias-disable; + }; + }; + }; + + cross-conn-det { + cross_conn_det_act: lines_on { + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + drive-strength = <8>; + output-low; + bias-pull-down; + }; + }; + + cross_conn_det_sus: lines_off { + mux { + pins = "gpio63"; + function = "gpio"; + }; + + config { + pins = "gpio63"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + /* WSA VI sense */ + wsa-vi { + wsa_vi_on: wsa_vi_on { + mux { + pins = "gpio94", "gpio95"; + function = "wsa_io"; + }; + + config { + pins = "gpio94", "gpio95"; + drive-strength = <8>; /* 8 MA */ + bias-disable; /* NO pull */ + }; + }; + + wsa_vi_off: wsa_vi_off { + mux { + pins = "gpio94", "gpio95"; + function = "wsa_io"; + }; + + config { + pins = "gpio94", "gpio95"; + drive-strength = <2>; /* 2 MA */ + bias-pull-down; + }; + }; + }; + + /* WSA CLK */ + wsa_clk { + wsa_clk_on: wsa_clk_on { + mux { + pins = "gpio25"; + function = "pri_mi2s_mclk_a"; + }; + + config { + pins = "gpio25"; + drive-strength = <8>; /* 8 MA */ + output-high; + }; + }; + + wsa_clk_off: wsa_clk_off { + mux { + pins = "gpio25"; + function = "pri_mi2s_mclk_a"; + }; + + config { + pins = "gpio25"; + drive-strength = <2>; /* 2 MA */ + output-low; + bias-pull-down; + }; + }; + }; + + pri-tlmm-lines { + pri_tlmm_lines_act: pri_tlmm_lines_act { + mux { + pins = "gpio91", "gpio93"; + function = "pri_mi2s"; + }; + + config { + pins = "gpio91", "gpio93"; + drive-strength = <8>; + }; + }; + + pri_tlmm_lines_sus: pri_tlmm_lines_sus { + mux { + pins = "gpio91", "gpio93"; + function = "pri_mi2s"; + }; + + config { + pins = "gpio91", "gpio93"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + pri-tlmm-ws-lines { + pri_tlmm_ws_act: pri_tlmm_ws_act { + mux { + pins = "gpio92"; + function = "pri_mi2s_ws"; + }; + + config { + pins = "gpio92"; + drive-strength = <8>; + }; + }; + + pri_tlmm_ws_sus: pri_tlmm_ws_sus { + mux { + pins = "gpio92"; + function = "pri_mi2s_ws"; + }; + + config { + pins = "gpio92"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + fpc_spi_active: fpc_spi_active{ + mux { + pins = "gpio135", "gpio136", "gpio137", "gpio138"; + function = "blsp_spi7"; + }; + config { + pins = "gpio135", "gpio136", "gpio137", "gpio138"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + fpc_reset_reset: fpc_reset_reset{ + mux { + pins = "gpio140"; + function = "gpio"; + }; + config { + pins = "gpio140"; + drive-strength = <2>; + bias-disable = <0>; + output-low; + }; + }; + fpc_reset_active: fpc_reset_active{ + mux { + pins = "gpio140"; + function = "gpio"; + }; + config { + pins = "gpio140"; + drive-strength = <2>; + bias-disable = <0>; + output-high; + }; + }; + + fpc_irq_active: fpc_irq_active { + mux { + pins = "gpio48"; + function = "gpio"; + }; + config { + pins = "gpio48"; + drive-strength = <2>; + bias-disable = <0>; + input-enable; + }; + }; + goodix_spi_active: goodix_spi_active{ + mux { + pins = "gpio135", "gpio136", "gpio137", "gpio138"; + function = "blsp_spi7"; + }; + config { + pins = "gpio135", "gpio136", "gpio137", "gpio138"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + goodix_reset_reset: goodix_reset_reset{ + mux { + pins = "gpio140"; + function = "gpio"; + }; + config { + pins = "gpio140"; + drive-strength = <2>; + bias-disable = <0>; + output-low; + }; + }; + goodix_reset_active: goodix_reset_active{ + mux { + pins = "gpio140"; + function = "gpio"; + }; + config { + pins = "gpio140"; + drive-strength = <2>; + bias-disable = <0>; + output-high; + }; + }; + + goodix_irq_active: goodix_irq_active { + mux { + pins = "gpio48"; + function = "gpio"; + }; + config { + pins = "gpio48"; + drive-strength = <2>; + bias-disable = <0>; + input-enable; + }; + }; + + spi6 { + spi6_default: spi6_default { + /* active state */ + mux { + /* MOSI, MISO, CLK */ + pins = "gpio20", "gpio21", "gpio23"; + function = "blsp_spi6"; + }; + + config { + pins = "gpio20", "gpio21", "gpio23"; + drive-strength = <12>; /* 12 MA */ + bias-disable = <0>; /* No PULL */ + }; + }; + + spi6_sleep: spi6_sleep { + /* suspended state */ + mux { + /* MOSI, MISO, CLK */ + pins = "gpio20", "gpio21", "gpio23"; + function = "gpio"; + }; + + config { + pins = "gpio20", "gpio21", "gpio23"; + drive-strength = <2>; /* 2 MA */ + bias-pull-down; /* PULL Down */ + }; + }; + + spi6_cs0_active: cs0_active { + /* CS */ + mux { + pins = "gpio22"; + function = "blsp_spi6"; + }; + + config { + pins = "gpio22"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + + spi6_cs0_sleep: cs0_sleep { + /* CS */ + mux { + pins = "gpio22"; + function = "gpio"; + }; + + config { + pins = "gpio22"; + drive-strength = <2>; + bias-disable = <0>; + }; + }; + }; + /* add pingrp for touchscreen */ + pmx_ts_int_active { + ts_int_active: ts_int_active { + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + drive-strength = <8>; + bias-pull-up; + }; + }; + }; + + pmx_ts_int_suspend { + ts_int_suspend: ts_int_suspend { + mux { + pins = "gpio65"; + function = "gpio"; + }; + + config { + pins = "gpio65"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + pmx_ts_reset_active { + ts_reset_active: ts_reset_active { + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + drive-strength = <8>; + bias-pull-up; + }; + }; + }; + + pmx_ts_reset_suspend { + ts_reset_suspend: ts_reset_suspend { + mux { + pins = "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio64"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + pmx_ts_release { + ts_release: ts_release { + mux { + pins = "gpio65", "gpio64"; + function = "gpio"; + }; + + config { + pins = "gpio65", "gpio64"; + drive-strength = <2>; + bias-pull-down; + }; + }; + }; + + tlmm_gpio_key { + gpio_key_active: gpio_key_active { + mux { + pins = "gpio85", "gpio86", "gpio87"; + function = "gpio"; + }; + + config { + pins = "gpio85", "gpio86", "gpio87"; + drive-strength = <2>; + bias-pull-up; + }; + }; + + gpio_key_suspend: gpio_key_suspend { + mux { + pins = "gpio85", "gpio86", "gpio87"; + function = "gpio"; + }; + + config { + pins = "gpio85", "gpio86", "gpio87"; + drive-strength = <2>; + bias-pull-up; + }; + }; + }; + pmx_qdsd_clk { + qdsd_clk_sdcard: clk_sdcard { + config { + pins = "qdsd_clk"; + bias-disable;/* NO pull */ + drive-strength = <16>; /* 16 MA */ + }; + }; + qdsd_clk_trace: clk_trace { + config { + pins = "qdsd_clk"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_clk_swdtrc: clk_swdtrc { + config { + pins = "qdsd_clk"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_clk_spmi: clk_spmi { + config { + pins = "qdsd_clk"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + }; + + pmx_qdsd_cmd { + qdsd_cmd_sdcard: cmd_sdcard { + config { + pins = "qdsd_cmd"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_cmd_trace: cmd_trace { + config { + pins = "qdsd_cmd"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_cmd_swduart: cmd_uart { + config { + pins = "qdsd_cmd"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_cmd_swdtrc: cmd_swdtrc { + config { + pins = "qdsd_cmd"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_cmd_jtag: cmd_jtag { + config { + pins = "qdsd_cmd"; + bias-disable; /* NO pull */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_cmd_spmi: cmd_spmi { + config { + pins = "qdsd_cmd"; + bias-pull-down; /* pull down */ + drive-strength = <10>; /* 10 MA */ + }; + }; + }; + + pmx_qdsd_data0 { + qdsd_data0_sdcard: data0_sdcard { + config { + pins = "qdsd_data0"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data0_trace: data0_trace { + config { + pins = "qdsd_data0"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data0_swduart: data0_uart { + config { + pins = "qdsd_data0"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data0_swdtrc: data0_swdtrc { + config { + pins = "qdsd_data0"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data0_jtag: data0_jtag { + config { + pins = "qdsd_data0"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data0_spmi: data0_spmi { + config { + pins = "qdsd_data0"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + }; + + pmx_qdsd_data1 { + qdsd_data1_sdcard: data1_sdcard { + config { + pins = "qdsd_data1"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data1_trace: data1_trace { + config { + pins = "qdsd_data1"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data1_swduart: data1_uart { + config { + pins = "qdsd_data1"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data1_swdtrc: data1_swdtrc { + config { + pins = "qdsd_data1"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data1_jtag: data1_jtag { + config { + pins = "qdsd_data1"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + }; + + pmx_qdsd_data2 { + qdsd_data2_sdcard: data2_sdcard { + config { + pins = "qdsd_data2"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data2_trace: data2_trace { + config { + pins = "qdsd_data2"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data2_swduart: data2_uart { + config { + pins = "qdsd_data2"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data2_swdtrc: data2_swdtrc { + config { + pins = "qdsd_data2"; + bias-pull-down; /* pull down */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data2_jtag: data2_jtag { + config { + pins = "qdsd_data2"; + bias-pull-up; /* pull up */ + drive-strength = <8>; /* 8 MA */ + }; + }; + }; + + pmx_qdsd_data3 { + qdsd_data3_sdcard: data3_sdcard { + config { + pins = "qdsd_data3"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data3_trace: data3_trace { + config { + pins = "qdsd_data3"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + qdsd_data3_swduart: data3_uart { + config { + pins = "qdsd_data3"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data3_swdtrc: data3_swdtrc { + config { + pins = "qdsd_data3"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data3_jtag: data3_jtag { + config { + pins = "qdsd_data3"; + bias-pull-up; /* pull up */ + drive-strength = <2>; /* 2 MA */ + }; + }; + qdsd_data3_spmi: data3_spmi { + config { + pins = "qdsd_data3"; + bias-pull-down; /* pull down */ + drive-strength = <8>; /* 8 MA */ + }; + }; + }; + + typec_ssmux_config: typec_ssmux_config { + mux { + pins = "gpio139"; + function = "gpio"; + }; + + config { + pins = "gpio139"; + drive-strength = <2>; + bias-disable; + }; + }; + + radio_frequence_config: radio_frequence_config { + config { + pins = "gpio112"; + drive-strength = <2>; + bias-pull-up; + }; + }; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pm.dtsi b/arch/arm/boot/dts/qcom/msm8953-pm.dtsi index d30fe282fb356..ca4da0b8f9c41 100644 --- a/arch/arm/boot/dts/qcom/msm8953-pm.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-pm.dtsi @@ -402,6 +402,7 @@ <0xff 264>, /* arm-smmu context fault */ <0xff 269>, /* rpm_wdog_expired_irq */ <0xff 270>, /* blsp1_bam_irq[0] */ + <0xff 271>, /* sps interrupt */ <0xff 273>, /* smmu_bus_intr[18] */ <0xff 274>, /* smmu_bus_intr[19] */ <0xff 275>, /* rpm_ipc(30) */ @@ -455,6 +456,7 @@ <34 81>, <35 85>, <36 90>, + <37 112>, <50 67>, <51 73>, <52 74>, diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts new file mode 100644 index 0000000000000..a52679d346a8d --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937-cdp.dts @@ -0,0 +1,33 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8937.dtsi" +#include "msm8953-cdp.dtsi" +#include "msm8953-audio-cdp.dtsi" +#include "msm8953-pmi8937.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8937 CDP"; + compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; + qcom,board-id= <1 0>; + qcom,pmic-id = <0x010016 0x020037 0x0 0x0>; +}; + +&pmi8937_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts new file mode 100644 index 0000000000000..94d0ea36c4c0b --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937-ext-codec-mtp.dts @@ -0,0 +1,105 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8937.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-audio-mtp.dtsi" +#include "msm8953-pmi8937.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8937 Ext Codec MTP"; + compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; + qcom,board-id= <8 1>; + qcom,pmic-id = <0x010016 0x020037 0x0 0x0>; +}; + +&int_codec { + status = "disabled"; +}; + +&pm8953_diangu_dig { + status = "disabled"; +}; + +&pm8953_diangu_analog { + status = "disabled"; +}; + +&wsa881x_i2c_e { + status = "disabled"; +}; + +&wsa881x_i2c_44 { + status = "disabled"; +}; + +&wsa881x_i2c_f { + status = "disabled"; +}; + +&wsa881x_i2c_45 { + status = "disabled"; +}; + +&slim_msm { + status = "okay"; +}; + +&dai_slim { + status = "okay"; +}; + +&wcd9xxx_intc { + status = "okay"; +}; + +&clock_audio { + status = "okay"; +}; + +&wcd9335 { + status = "okay"; +}; + +&wcd_rst_gpio { + status = "okay"; +}; + +&ext_codec { + qcom,model = "msm8953-tasha-snd-card"; + status = "okay"; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8937_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8937_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts new file mode 100644 index 0000000000000..20a8304390d3f --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937-mtp.dts @@ -0,0 +1,48 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8937.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-audio-mtp.dtsi" +#include "msm8953-pmi8937.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8937 MTP"; + compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; + qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x020037 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8937_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8937_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8937.dtsi b/arch/arm/boot/dts/qcom/msm8953-pmi8937.dtsi new file mode 100644 index 0000000000000..fba91a7d40559 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8937.dtsi @@ -0,0 +1,27 @@ +/* + * 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. + */ + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8937_flash0 &pmi8937_flash1>; + qcom,torch-source = <&pmi8937_torch0 &pmi8937_torch1>; + qcom,switch-source = <&pmi8937_switch>; + }; +}; + +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts new file mode 100644 index 0000000000000..8aed7caacdae9 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940-cdp.dts @@ -0,0 +1,32 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8940.dtsi" +#include "msm8953-cdp.dtsi" +#include "msm8953-pmi8940.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8940 CDP"; + compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; + qcom,board-id= <1 0>; + qcom,pmic-id = <0x010016 0x020040 0x0 0x0>; +}; + +&pmi8940_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts new file mode 100644 index 0000000000000..0e5f2721e1009 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940-ext-codec-mtp.dts @@ -0,0 +1,104 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8940.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-pmi8940.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8940 Ext Codec MTP"; + compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; + qcom,board-id= <8 1>; + qcom,pmic-id = <0x010016 0x020040 0x0 0x0>; +}; + +&int_codec { + status = "disabled"; +}; + +&pm8953_diangu_dig { + status = "disabled"; +}; + +&pm8953_diangu_analog { + status = "disabled"; +}; + +&wsa881x_i2c_e { + status = "disabled"; +}; + +&wsa881x_i2c_44 { + status = "disabled"; +}; + +&wsa881x_i2c_f { + status = "disabled"; +}; + +&wsa881x_i2c_45 { + status = "disabled"; +}; + +&slim_msm { + status = "okay"; +}; + +&dai_slim { + status = "okay"; +}; + +&wcd9xxx_intc { + status = "okay"; +}; + +&clock_audio { + status = "okay"; +}; + +&wcd9335 { + status = "okay"; +}; + +&wcd_rst_gpio { + status = "okay"; +}; + +&ext_codec { + qcom,model = "msm8953-tasha-snd-card"; + status = "okay"; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8940_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8940_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts b/arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts new file mode 100644 index 0000000000000..99b54fe2ce70f --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940-mtp.dts @@ -0,0 +1,47 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8940.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-pmi8940.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8940 MTP"; + compatible = "qcom,msm8953-mtp", "qcom,msm8953", "qcom,mtp"; + qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x020040 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8940_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8940_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi b/arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi new file mode 100644 index 0000000000000..1f3010a6f9dfc --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8940.dtsi @@ -0,0 +1,69 @@ +/* + * 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 "msm8953-audio-mtp.dtsi" + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8940_flash0 &pmi8940_flash1>; + qcom,torch-source = <&pmi8940_torch0 &pmi8940_torch1>; + qcom,switch-source = <&pmi8940_switch>; + }; +}; + +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi0 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&labibb { + status = "ok"; + qpnp,qpnp-labibb-mode = "lcd"; +}; + +&ibb_regulator { + qcom,qpnp-ibb-discharge-resistor = <32>; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-pmi8950.dtsi b/arch/arm/boot/dts/qcom/msm8953-pmi8950.dtsi new file mode 100644 index 0000000000000..ad06bd43017ec --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-pmi8950.dtsi @@ -0,0 +1,63 @@ +/* + * 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. + */ + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8950_flash0 &pmi8950_flash1>; + qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch1>; + qcom,switch-source = <&pmi8950_switch>; + }; +}; + +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi0 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&labibb { + status = "ok"; + qpnp,qpnp-labibb-mode = "lcd"; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-qrd-sku3.dts b/arch/arm/boot/dts/qcom/msm8953-qrd-sku3.dts index dd65115017ebe..b6acd5abbae7f 100644 --- a/arch/arm/boot/dts/qcom/msm8953-qrd-sku3.dts +++ b/arch/arm/boot/dts/qcom/msm8953-qrd-sku3.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -14,12 +14,54 @@ /dts-v1/; #include "msm8953.dtsi" -#include "msm8953-qrd-sku3.dtsi" +#include "msm-pmi8950.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 QRD SKU3"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 QRD SKU3"; compatible = "qcom,msm8953-qrd-sku3", "qcom,msm8953-qrd", "qcom,msm8953", "qcom,qrd"; qcom,board-id= <0x2000b 0>; }; +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8950_flash0 &pmi8950_flash1>; + qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch1>; + qcom,switch-source = <&pmi8950_switch>; + }; +}; + +#include "msm8953-qrd-sku3.dtsi" + +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-qrd-sku3_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-qrd-sku3_rosy.dtsi new file mode 100644 index 0000000000000..100ee3ae777b5 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-qrd-sku3_rosy.dtsi @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2015-2016, 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 "msm8953-qrd_rosy.dtsi" +#include "msm8953-pinctrl_rosy.dtsi" +#include "msm8953-camera-sensor-qrd_rosy.dtsi" +#include "dsi-panel-ft8613-ebbg-5p7-720p-video.dtsi" +#include "dsi-panel-ft8006m-boe-5p7-720p-video.dtsi" +#include "dsi-panel-ft8613-ebbg-5p5-1080p-video.dtsi" +#include "dsi-panel-ft8613-csot-5p7-720p-video.dtsi" + +&spmi_bus { + qcom,pmi8940@3 { + labibb: qpnp-labibb-regulator { + ibb_regulator: qcom,ibb@dc00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5700000>; + }; + + lab_regulator: qcom,lab@de00 { + /delete-property/ + qcom,qpnp-ibb-use-default-voltage; + qcom,qpnp-ibb-init-lcd-voltage = <5700000>; + }; + }; + }; +}; + +#include "msm8953-mdss-panels.dtsi" + +&tlmm { + pmx_mdss { + mdss_dsi_active: mdss_dsi_active { + mux { + pins = "gpio61"; + }; + config { + pins = "gpio61"; + }; + }; + mdss_dsi_suspend: mdss_dsi_suspend { + mux { + pins = "gpio61"; + }; + config { + pins = "gpio61"; + }; + }; + }; +}; + +&dsi_r69006_1080p_cmd { + qcom,esd-check-enabled; +}; + +#include "msm8953-mdss-panels.dtsi" +&mdss_mdp { + qcom,mdss-pref-prim-intf = "dsi"; +}; + +&mdss_dsi { + hw-config = "single_dsi"; +}; + +&mdss_dsi0 { + qcom,dsi-pref-prim-pan = <&dsi_ft8613_ebbg_5p7_720p_video>; + qcom,dsi-pref-sub-pan = <&dsi_ft8006m_boe_5p7_720p_video>; + qcom,dsi-pref-sub1-pan = <&dsi_ft8613_csot_5p7_720p_video>; + qcom,dsi-pref-sub2-pan = <&dsi_ft8613_ebbg_5p5_1080p_video>; + pinctrl-names = "mdss_default", "mdss_sleep"; + pinctrl-0 = <&mdss_dsi_active>; + pinctrl-1 = <&mdss_dsi_suspend>; + + qcom,platform-reset-gpio = <&tlmm 61 0>; + iovdd_gpio-supply = <&iovdd_gpio_vreg>; + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + status = "disabled"; +}; + +&labibb { + status = "ok"; + qpnp,qpnp-labibb-mode = "lcd"; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@1 { + reg = <1>; + qcom,supply-name = "iovdd_gpio"; + qcom,supply-min-voltage = <1800000>; + qcom,supply-max-voltage = <1800000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; +}; + +&dsi_ft8613_ebbg_5p7_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,qpnp-ibb-init-lcd-voltage = <5800000>; + qcom,qpnp-lab-init-lcd-voltage = <5800000>; +}; + +&dsi_ft8006m_boe_5p7_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,qpnp-ibb-init-lcd-voltage = <6000000>; + qcom,qpnp-lab-init-lcd-voltage = <6000000>; +}; + +&dsi_ft8613_csot_5p7_720p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,qpnp-ibb-init-lcd-voltage = <5800000>; + qcom,qpnp-lab-init-lcd-voltage = <5800000>; +}; + +&dsi_ft8613_ebbg_5p5_1080p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; + qcom,qpnp-ibb-init-lcd-voltage = <5800000>; + qcom,qpnp-lab-init-lcd-voltage = <5800000>; +}; + +&dsi_r69006_1080p_cmd { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&dsi_r69006_1080p_video { + qcom,panel-supply-entries = <&dsi_panel_pwr_supply>; +}; + +&int_codec { + status = "okay"; + qcom,model = "msm8953-snd-card-mtp"; + qcom,msm-hs-micbias-type = "internal"; +}; + +&pm8953_diangu_dig { + status = "okay"; +}; + +&pm8953_diangu_analog { + status = "okay"; +}; +&wsa881x_i2c_e { + status = "disabled"; +}; + +&wsa881x_i2c_44 { + status = "disabled"; +}; + +&wsa881x_i2c_f { + status = "disabled"; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-qrd_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953-qrd_rosy.dtsi new file mode 100644 index 0000000000000..fe703e6b22442 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953-qrd_rosy.dtsi @@ -0,0 +1,479 @@ +/* + * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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 "msm8953-pinctrl_rosy.dtsi" +#include "msm8953-camera-sensor-qrd_rosy.dtsi" +#include +#include + +&soc { + radio_frequence { + compatible = "wingtech,radio_frequence_detection"; + pinctrl-names = "default"; + pinctrl-0 = <&radio_frequence_config>; + gpios = <&tlmm 112 GPIO_ACTIVE_HIGH>; + linux,input-type = <1>; + linux,code = ; + interrupts-extended = <&tlmm 112 0x3>; + debounce-interval = <30>; + }; + + gpio_keys { + compatible = "gpio-keys"; + input-name = "gpio-keys"; + pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend"; + pinctrl-0 = <&gpio_key_active>; + pinctrl-1 = <&gpio_key_suspend>; + + vol_up { + label = "volume_up"; + gpios = <&tlmm 85 0x1>; + linux,input-type = <1>; + linux,code = <115>; + debounce-interval = <15>; + }; + }; + + i2c@78b7000 { /* BLSP1 QUP3 */ + status = "okay"; + synaptics@4b { + compatible = "synaptics,dsx-i2c"; + reg = <0x4b>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd_ana-supply = <&vdd_vreg>; + vcc_i2c-supply = <&pm8953_l6>; + synaptics,pwr-reg-name = "vdd_ana"; + synaptics,bus-reg-name = "vcc_i2c"; + synaptics,irq-gpio = <&tlmm 65 0x2008>; + synaptics,irq-on-state = <0>; + synaptics,irq-flags = <0x2008>; + synaptics,power-delay-ms = <200>; + synaptics,reset-delay-ms = <200>; + synaptics,max-y-for-2d = <1919>; + synaptics,cap-button-codes = <139 158 172>; + synaptics,vir-button-codes = <139 180 2000 320 160 + 158 540 2000 320 160 + 172 900 2000 320 160>; + synaptics,resume-in-workqueue; + /* Underlying clocks used by secure touch */ + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup3_i2c_apps_clk>; + }; + }; + + vdd_vreg: vdd_vreg { + compatible = "regulator-fixed"; + status = "ok"; + regulator-name = "vdd_vreg"; + }; + fpc1020 { + compatible = "fpc,fpc1020"; + + interrupt-parent = <&tlmm>; + interrupts = <48 0x0>; + + fpc,gpio_rst = <&tlmm 140 0>; + fpc,gpio_irq = <&tlmm 48 0>; + fpc,gpio_pwr = <&tlmm 134 0>; + + vcc_spi-supply = <&pm8953_l5>; + vdd_ana-supply = <&pm8953_l5>; + vdd_io-supply = <&pm8953_l5>; + + fpc,enable-on-boot; + /delete-property/ + fpc,enable-wakeup; + + fpc,spi-max-frequency = <4800000>; + + /* Only for SPI Clock Handled by Linux */ + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup1_spi_apps_clk>; + + pinctrl-names = "fpc1020_spi_active", + "fpc1020_reset_reset", + "fpc1020_reset_active", + "fpc1020_irq_active"; + + pinctrl-0 = <&fpc_spi_active>; + pinctrl-1 = <&fpc_reset_reset>; + pinctrl-2 = <&fpc_reset_active>; + pinctrl-3 = <&fpc_irq_active>; + }; + + goodix_fp { + compatible = "goodix,fingerprint"; + interrupt-parent = <&tlmm>; + interrupts = <48 0x1>; + fp-gpio-irq = <&tlmm 48 0x00>; + fp-gpio-reset = <&tlmm 140 0x00>; + fp-gpio-power = <&tlmm 134 0x00>; + spi-max-frequency = <19200000>; + }; + gpio-leds { + compatible = "gpio-leds"; + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&gpio_led_off>; + + infred { + gpios = <&tlmm 20 0>; + label = "infrared"; + linux,default-trigger = "infra-red"; + default-state = "off"; + retain-state-suspended; + }; + + }; + + iovdd_gpio_vreg: iovdd_gpio_vreg { + compatible = "regulator-fixed"; + regulator-name="iovdd_gpio_vreg"; + gpio = <&tlmm 97 0>; /* iovdd - ldo6 */ + startup-delay-us = <300>; + enable-active-high; + regulator-boot-on; + status = "ok"; + }; + +}; +&i2c_2 { /* i2c 2 */ + aw2013@45 { /*blink */ + compatible = "awinc,aw2013"; + reg = <0x45>; + rgb_led-supply = <&pm8953_l10>; + + red { + label = "red"; + linux,default-trigger = "battery-red"; + default-state = "off"; + retain-state-suspended; + }; + + green { + label = "green"; + linux,default-trigger = "battery-green"; + default-state = "off"; + retain-state-suspended; + }; + + blue { + label = "blue"; + linux,default-trigger = "battery-blue"; + default-state = "off"; + retain-state-suspended; + }; + white { + label = "white"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + yellow { + label = "yellow"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + + cyan { + label = "cyan"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + purple { + label = "purple"; + linux,default-trigger = "none"; + default-state = "off"; + retain-state-suspended; + }; + }; + }; +&wled { + qcom,cons-sync-write-delay-us = <1000>; +}; + +/ { + qrd_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-Scud-4v4-3300mah.dtsi" + #include "batterydata-Sunwoda-4v4-3300mah.dtsi" + #include "batterydata-D1_Default-4v4-3300mah.dtsi" + }; +}; + +&pm8953_typec { + ss-mux-supply = <&pm8953_l6>; + qcom,ssmux-gpio = <&tlmm 139 GPIO_ACTIVE_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&typec_ssmux_config>; +}; + +&pmi8940_charger { + qcom,battery-data = <&qrd_batterydata>; + qcom,float-voltage-mv = <4400>; + qcom,chg-inhibit-fg; + qcom,thermal-mitigation = <2000 1800 1500 1200 1000 0>; + status = "okay"; + qcom,vchg_sns-vadc = <&pmi8940_vadc>; + qcom,vchg-adc-channel-id = <3>; + qcom,customize-cool-low-limit = <0>; + qcom,customize-cool-high-limit = <50>; + qcom,fastchg-current-customize-cool = <300>; + qcom,fastchg-current-bat-cool = <900>; + qcom,fastchg-current-ma = <2000>; + qcom,override-usb-current; +}; + +&pmi8940_fg { + qcom,battery-data = <&qrd_batterydata>; + qcom,cold-bat-decidegc = <(0)>; + qcom,cool-bat-decidegc = <(150)>; + qcom,hot-bat-decidegc = <550>; + qcom,warm-bat-decidegc = <450>; + qcom,warm-bat-india-decidegc = <500>; + qcom,fg-iterm-ma = <230>; + qcom,fg-chg-iterm-ma = <200>; + qcom,resume-soc = <99>; + qcom,resume-soc-raw = <253>; + qcom,vbat-estimate-diff-mv = <100>; + qcom,fg-cutoff-voltage-mv = <3400>; + qcom,fg-cc-cv-threshold-mv = <4390>; + qcom,cl-max-increment-deciperc = <1>; + qcom,cl-max-decrement-deciperc = <1>; + qcom,fg-delta-soc = <2>; + qcom,bad-battery-detection-enable; + qcom,hold-soc-while-full; + qcom,thermal-coefficients = [DA 86 F0 50 08 3C]; +}; + +&usb3 { + qcom,usbin-vadc = <&pmi8940_vadc>; + qcom,detect-dpdm-floating; +}; + +&blsp1_uart0 { + status = "ok"; + pinctrl-names = "default"; + pinctrl-0 = <&uart_console_active>; +}; + +&sdhc_1 { + /* device core power supply */ + vdd-supply = <&pm8953_l8>; + qcom,vdd-voltage-level = <2900000 2900000>; + qcom,vdd-current-level = <200 570000>; + qcom,vdd-always-on; + + /* device communication power supply */ + vdd-io-supply = <&pm8953_l5>; + qcom,vdd-io-always-on; + qcom,vdd-io-lpm-sup; + qcom,vdd-io-voltage-level = <1800000 1800000>; + qcom,vdd-io-current-level = <200 325000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc1_clk_on &sdc1_cmd_on &sdc1_data_on &sdc1_rclk_on>; + pinctrl-1 = <&sdc1_clk_off &sdc1_cmd_off &sdc1_data_off &sdc1_rclk_off>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 192000000 + 384000000>; + qcom,nonremovable; + qcom,bus-speed-mode = "HS400_1p8v", "HS200_1p8v", "DDR_1p8v"; + + status = "ok"; +}; + +&sdhc_2 { + /* device core power supply */ + vdd-supply = <&pm8953_l11>; + qcom,vdd-voltage-level = <2950000 2950000>; + qcom,vdd-current-level = <15000 800000>; + + /* device communication power supply */ + vdd-io-supply = <&pm8953_l12>; + qcom,vdd-io-voltage-level = <1800000 2950000>; + qcom,vdd-io-current-level = <200 22000>; + + pinctrl-names = "active", "sleep"; + pinctrl-0 = <&sdc2_clk_on &sdc2_cmd_on &sdc2_data_on &sdc2_cd_on>; + pinctrl-1 = <&sdc2_clk_off &sdc2_cmd_off &sdc2_data_off &sdc2_cd_off>; + + #address-cells = <0>; + interrupt-parent = <&sdhc_2>; + interrupts = <0 1 2>; + #interrupt-cells = <1>; + interrupt-map-mask = <0xffffffff>; + interrupt-map = <0 &intc 0 125 0 + 1 &intc 0 221 0 + 2 &tlmm 133 0>; + interrupt-names = "hc_irq", "pwr_irq", "status_irq"; + cd-gpios = <&tlmm 133 0x0>; + + qcom,clk-rates = <400000 20000000 25000000 50000000 100000000 + 200000000>; + qcom,bus-speed-mode = "SDR12", "SDR25", "SDR50", "DDR50", "SDR104"; + + status = "ok"; +}; + +&i2c_5 { /* BLSP2 QUP1 (NFC) */ + nq@28 { + compatible = "qcom,nq-nci"; + reg = <0x28>; + qcom,nq-irq = <&tlmm 17 0x00>; + qcom,nq-ven = <&tlmm 16 0x00>; + qcom,nq-firm = <&tlmm 62 0x00>; + qcom,nq-clkreq = <&pm8953_gpios 2 0x00>; + interrupt-parent = <&tlmm>; + qcom,clk-src = "BBCLK2"; + interrupts = <17 0>; + interrupt-names = "nfc_irq"; + pinctrl-names = "nfc_active", "nfc_suspend"; + pinctrl-0 = <&nfc_int_active &nfc_disable_active>; + pinctrl-1 = <&nfc_int_suspend &nfc_disable_suspend>; + clocks = <&clock_gcc clk_bb_clk2_pin>; + clock-names = "ref_clk"; + }; +}; + +&i2c_3 { + status = "ok"; + focaltech@38{ + compatible = "focaltech,fts"; + reg = <0x38>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8953_l10>; + vcc_i2c-suppy = <&pm8953_l5>; + panel_iovdd-supply = <&iovdd_gpio_vreg>; + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + focaltech,name = "fts_ts"; + focaltech,family-id = <0x54>; + focaltech,reset-gpio = <&tlmm 64 0x00>; + focaltech,irq-gpio = <&tlmm 65 0x2008>; + focaltech,display-coords = <0 0 720 1440>; + focaltech,panel-coords = <0 0 720 1440>; + /*ftech,button-map= <139 102 158>;*/ + focaltech,virtual-key1 = <139 560 2000>;/*menu*/ + focaltech,virtual-key2 = <102 360 2000>;/*home*/ + focaltech,virtual-key3 = <158 160 2000>;/*back*/ + focaltech,no-force-update; + focaltech,i2c-pull-up; + focaltech,group-id = <1>; + focaltech,hard-reset-delay-ms = <20>; + focaltech,soft-reset-delay-ms = <200>; + focaltech,num-max-touches = <10>; + focaltech,fw-delay-aa-ms = <30>; + focaltech,fw-delay-55-ms = <30>; + focaltech,fw-upgrade-id1 = <0x79>; + focaltech,fw-upgrade-id2 = <0x18>; + focaltech,fw-delay-readid-ms = <10>; + focaltech,fw-delay-era-flsh-ms = <2000>; + focaltech,fw-auto-cal; + focaltech,ignore-id-check; + }; + focaltech@39{ + compatible = "focaltech,ft8006m"; + reg = <0x39>; + interrupt-parent = <&tlmm>; + interrupts = <65 0x2008>; + vdd-supply = <&pm8953_l10>; + vcc_i2c-suppy = <&pm8953_l5>; + panel_iovdd-supply = <&iovdd_gpio_vreg>; + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; + /* pins used by touchscreen */ + pinctrl-names = "pmx_ts_active","pmx_ts_suspend", + "pmx_ts_release"; + pinctrl-0 = <&ts_int_active &ts_reset_active>; + pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>; + pinctrl-2 = <&ts_release>; + focaltech,name = "fts_ts"; + focaltech,family-id = <0x54>; + focaltech,reset-gpio = <&tlmm 64 0x00>; + focaltech,irq-gpio = <&tlmm 65 0x2008>; + focaltech,display-coords = <0 0 720 1440>; + focaltech,panel-coords = <0 0 720 1440>; + focaltech,virtual-key1 = <139 560 2000>;/*menu*/ + focaltech,virtual-key2 = <102 360 2000>;/*home*/ + focaltech,virtual-key3 = <158 160 2000>;/*back*/ + focaltech,no-force-update; + focaltech,i2c-pull-up; + focaltech,group-id = <1>; + focaltech,hard-reset-delay-ms = <20>; + focaltech,soft-reset-delay-ms = <200>; + focaltech,num-max-touches = <10>; + focaltech,fw-delay-aa-ms = <30>; + focaltech,fw-delay-55-ms = <30>; + focaltech,fw-upgrade-id1 = <0x79>; + focaltech,fw-upgrade-id2 = <0x18>; + focaltech,fw-delay-readid-ms = <10>; + focaltech,fw-delay-era-flsh-ms = <2000>; + focaltech,fw-auto-cal; + focaltech,ignore-id-check; + }; + +}; + +&pm8953_gpios { + /* GPIO 2 (NFC_CLK_REQ) */ + gpio@c100 { + qcom,mode = <0>; + qcom,output-type = <0>; + qcom,pull = <0>; + qcom,vin-sel = <2>; + qcom,out-strength = <3>; + qcom,src-sel = <0>; + qcom,master-en = <1>; + status = "okay"; + }; +}; + +&i2c_3 { + status = "ok"; +}; + +&led_flash0{ + qcom,flash-source = <&pmi8950_flash0>; + qcom,torch-source = <&pmi8950_torch0>; +}; + +&pm8953_vadc { + /delete-node/ chan@11; +}; + +&sdc2_cmd_on { + config { + drive-strength=<12>; + }; +}; + +&sdc2_data_on { + config { + drive-strength=<12>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8953-rcm.dts b/arch/arm/boot/dts/qcom/msm8953-rcm.dts index d1f0cf9bcf8c2..f265ba451d0e9 100644 --- a/arch/arm/boot/dts/qcom/msm8953-rcm.dts +++ b/arch/arm/boot/dts/qcom/msm8953-rcm.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -14,15 +14,23 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" #include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" #include "msm8953-audio-cdp.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 RCM"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 RCM"; compatible = "qcom,msm8953-cdp", "qcom,msm8953", "qcom,cdp"; qcom,board-id= <21 0>; }; +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; + &soc { gpio_keys { /delete-node/ home; diff --git a/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi index c4f606e896597..45c1e18536d1c 100644 --- a/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-regulator.dtsi @@ -172,6 +172,7 @@ regulator-max-microvolt = <1800000>; qcom,init-voltage = <1800000>; status = "okay"; + regulator-always-on; }; }; @@ -287,9 +288,9 @@ rpm-regulator-ldoa22 { status = "okay"; pm8953_l22: regulator-l22 { - regulator-min-microvolt = <2800000>; - regulator-max-microvolt = <2800000>; - qcom,init-voltage = <2800000>; + regulator-min-microvolt = <2900000>; + regulator-max-microvolt = <2900000>; + qcom,init-voltage = <2900000>; status = "okay"; }; }; @@ -400,7 +401,7 @@ qcom,cpr-fuse-combos = <64>; qcom,cpr-speed-bins = <8>; qcom,cpr-speed-bin-corners = - <9 0 7 0 0 0 0 9>; + <9 0 7 0 0 0 7 9>; qcom,cpr-corners = /* Speed bin 0 */ <9 9 9 9 9 9 9 9>, @@ -411,12 +412,14 @@ /* Speed bin 2 */ <7 7 7 7 7 7 7 7>, - /* Speed bin 3..6 */ - <0 0 0 0 0 0 0 0>, + /* Speed bin 3..5 */ <0 0 0 0 0 0 0 0>, <0 0 0 0 0 0 0 0>, <0 0 0 0 0 0 0 0>, + /* Speed bin 6 */ + <7 7 7 7 7 7 7 7>, + /* Speed bin 7 */ <9 9 9 9 9 9 9 9>; @@ -430,12 +433,14 @@ /* Speed bin 2 */ <1 2 4 7>, - /* Speed bin 3..6 */ - <0 0 0 0>, + /* Speed bin 3..5 */ <0 0 0 0>, <0 0 0 0>, <0 0 0 0>, + /* Speed bin 6 */ + <1 2 4 7>, + /* Speed bin 7 */ <1 2 4 9>; @@ -448,6 +453,10 @@ <715000 790000 860000 865000 920000 990000 1065000>, + /* Speed bin 6 */ + <715000 790000 860000 865000 920000 + 990000 1065000>, + /* Speed bin 7 */ <715000 790000 860000 865000 920000 990000 1065000 1065000 1065000>; @@ -461,6 +470,10 @@ <500000 500000 500000 500000 500000 500000 500000>, + /* Speed bin 6 */ + <500000 500000 500000 500000 500000 + 500000 500000>, + /* Speed bin 7 */ <500000 500000 500000 500000 500000 500000 500000 500000 500000>; @@ -502,6 +515,24 @@ <50000 50000 50000 50000 50000 50000 50000>, + /* Speed bin 6; CPR rev 0..7 */ + < 0 0 0 0 0 + 0 0>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + <50000 50000 50000 50000 50000 + 50000 50000>, + /* Speed bin 7; CPR rev 0..7 */ < 0 0 0 0 0 0 0 0 0>, @@ -533,6 +564,12 @@ < 0 0 30000 0 0 0 0>, + /* Speed bin 6; misc fuse 0..1 */ + < 0 0 0 0 0 + 0 0>, + < 0 0 30000 0 0 + 0 0>, + /* Speed bin 7; misc fuse 0..1 */ < 0 0 0 0 0 0 0 0 0>, @@ -546,23 +583,31 @@ /* Speed bin 2 */ <1 1 2 2 2 2 2>, + /* Speed bin 6 */ + <1 1 2 2 2 2 2>, + /* Speed bin 7 */ <1 1 2 2 2 2 2 2 2>; qcom,corner-frequencies = /* Speed bin 0 */ <652800000 1036800000 1401600000 - 1689600000 1843200000 1958400000 + 1689600000 1804800000 1958400000 2016000000 2150400000 2208000000>, /* Speed bin 2 */ <652800000 1036800000 1401600000 - 1689600000 1843200000 1958400000 + 1689600000 1804800000 1958400000 + 2016000000>, + + /* Speed bin 6 */ + <652800000 1036800000 1401600000 + 1689600000 1804800000 1958400000 2016000000>, /* Speed bin 7 */ <652800000 1036800000 1401600000 - 1689600000 1843200000 1958400000 + 1689600000 1804800000 1958400000 2016000000 2150400000 2208000000>; qcom,cpr-open-loop-voltage-fuse-adjustment = @@ -628,9 +673,9 @@ /* Speed bin 6; CPR rev 0..7 */ < 0 0 0 0>, - < 0 0 0 0>, - < 0 0 0 0>, - < 0 0 0 0>, + < 25000 0 5000 40000>, + < 25000 0 5000 40000>, + < 25000 0 5000 40000>, < 0 0 0 0>, < 0 0 0 0>, < 0 0 0 0>, @@ -709,9 +754,9 @@ /* Speed bin 6; CPR rev 0..7 */ < 0 0 0 0>, - < 0 0 0 0>, - < 0 0 0 0>, - < 0 0 0 0>, + < 10000 (-15000) 0 25000>, + < 10000 (-15000) 0 25000>, + <(-5000) (-30000) (-15000) 10000>, < 0 0 0 0>, < 0 0 0 0>, < 0 0 0 0>, @@ -762,6 +807,16 @@ <1 1 1 1 0 0 0>, <1 1 1 1 0 0 0>, + /* Speed bin 6; CPR rev 0..7 */ + <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 0 0 0>, + <1 1 1 1 0 0 0>, + <1 1 1 1 0 0 0>, + <1 1 1 1 0 0 0>, + <1 1 1 1 0 0 0>, + /* Speed bin 7; CPR rev 0..7 */ <0 0 0 0 0 0 0 0 0>, <0 0 0 0 0 0 0 0 0>, @@ -797,12 +852,14 @@ /* Speed bin 2 */ <0 0 0 1 1 1 1 1>, - /* Speed bin 3..6 */ - <0 0 0 0 0 0 0 0>, + /* Speed bin 3..5 */ <0 0 0 0 0 0 0 0>, <0 0 0 0 0 0 0 0>, <0 0 0 0 0 0 0 0>, + /* Speed bin 6 */ + <0 0 0 1 1 1 1 1>, + /* Speed bin 7 */ <0 0 0 1 1 1 1 1>; }; diff --git a/arch/arm/boot/dts/qcom/msm8953-rumi.dts b/arch/arm/boot/dts/qcom/msm8953-rumi.dts index 6ea00c992e0f3..d1e16ed00558e 100644 --- a/arch/arm/boot/dts/qcom/msm8953-rumi.dts +++ b/arch/arm/boot/dts/qcom/msm8953-rumi.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -14,13 +14,28 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" / { - model = "Qualcomm Technologies, Inc. MSM8953 RUMI"; + model = "Qualcomm Technologies, Inc. MSM8953 + PMI8950 RUMI"; compatible = "qcom,msm8953-rumi", "qcom,msm8953", "qcom,rumi"; qcom,board-id= <15 0>; }; +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi0 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + &soc { timer { clock-frequency = <10000000>; diff --git a/arch/arm/boot/dts/qcom/msm8953-sim.dts b/arch/arm/boot/dts/qcom/msm8953-sim.dts index 438443ff0bb1d..77ea5133330ae 100644 --- a/arch/arm/boot/dts/qcom/msm8953-sim.dts +++ b/arch/arm/boot/dts/qcom/msm8953-sim.dts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -14,13 +14,28 @@ /dts-v1/; #include "msm8953.dtsi" +#include "msm-pmi8950.dtsi" / { - model = "Qualcomm Technologies, Inc. MSMTitaninum Simulator"; + model = "Qualcomm Technologies, Inc. MSMTitaninum + PMI8950 Simulator"; compatible = "qcom,msm8953-sim", "qcom,msm8953", "qcom,sim"; qcom,board-id= <16 0>; }; +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi0 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + &blsp1_uart0 { status = "ok"; pinctrl-names = "default"; diff --git a/arch/arm/boot/dts/qcom/msm8953-vidc.dtsi b/arch/arm/boot/dts/qcom/msm8953-vidc.dtsi index c66313e0f5147..4e68f4a2a16e0 100644 --- a/arch/arm/boot/dts/qcom/msm8953-vidc.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953-vidc.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -14,9 +14,11 @@ qcom,vidc@1d00000 { compatible = "qcom,msm-vidc"; reg = <0x01d00000 0xff000>, - <0x000a4124 0x4>; - reg-names = "vidc", "efuse"; + <0x000a4124 0x4>, + <0x000a0164 0x4>; + reg-names = "vidc", "efuse", "efuse2"; qcom,platform-version = <0x00180000 0x13>; + qcom,capability-version = <0x00002000 0x0d>; interrupts = <0 44 0>; /* Regulators */ venus-supply = <&gdsc_venus>; diff --git a/arch/arm/boot/dts/qcom/msm8953.dtsi b/arch/arm/boot/dts/qcom/msm8953.dtsi index 0997f053c8c32..4004ff4bd41a5 100644 --- a/arch/arm/boot/dts/qcom/msm8953.dtsi +++ b/arch/arm/boot/dts/qcom/msm8953.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -43,10 +43,16 @@ reg = <0x0 0x86c00000 0x0 0x6a00000>; }; - reloc_mem: reloc_region@0 { + adsp_fw_mem: adsp_fw_region@0 { compatible = "removed-dma-pool"; no-map; - reg = <0x0 0x8d600000 0x0 0x1800000>; + reg = <0x0 0x8d600000 0x0 0x1100000>; + }; + + wcnss_fw_mem: wcnss_fw_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x8e700000 0x0 0x700000>; }; venus_mem: venus_region@0 { @@ -78,8 +84,8 @@ }; dfps_data_mem: dfps_data_mem@90000000 { - reg = <0 0x90000000 0 0x1000>; - label = "dfps_data_mem"; + reg = <0 0x90000000 0 0x1000>; + label = "dfps_data_mem"; }; cont_splash_mem: splash_region@0x90001000 { @@ -281,8 +287,10 @@ reg-names = "tsens_physical", "tsens_eeprom_physical"; interrupts = <0 184 0>, <0 314 0>; interrupt-names = "tsens-upper-lower", "tsens-critical"; - qcom,sensors = <16>; - qcom,slope = <3200 3200 3200 3200 3200 3200 3200 3200 3200 + qcom,client-id = <1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>; + qcom,sensor-id = <1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>; + qcom,sensors = <15>; + qcom,slope = <3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 3200 3200>; qcom,valid-status-check; }; @@ -742,7 +750,7 @@ dmas = <&dma_blsp1 8 64 0x20000020 0x20>, <&dma_blsp1 9 32 0x20000020 0x20>; dma-names = "tx", "rx"; - status = "disabled"; + status = "okay"; }; i2c_5: i2c@7af5000 { /* BLSP2 QUP1 */ @@ -865,7 +873,7 @@ < 1036800000 2>, < 1401600000 3>, < 1689600000 4>, - < 1843200000 5>, + < 1804800000 5>, < 1958400000 6>, < 2016000000 7>; qcom,speed0-bin-v0-cci = @@ -874,7 +882,7 @@ < 414720000 2>, < 560640000 3>, < 675840000 4>, - < 737280000 5>, + < 721920000 5>, < 783360000 6>, < 806400000 7>; qcom,speed2-bin-v0-cl = @@ -883,7 +891,7 @@ < 1036800000 2>, < 1401600000 3>, < 1689600000 4>, - < 1843200000 5>, + < 1804800000 5>, < 1958400000 6>, < 2016000000 7>; qcom,speed2-bin-v0-cci = @@ -892,7 +900,7 @@ < 414720000 2>, < 560640000 3>, < 675840000 4>, - < 737280000 5>, + < 721920000 5>, < 783360000 6>, < 806400000 7>; qcom,speed7-bin-v0-cl = @@ -901,7 +909,7 @@ < 1036800000 2>, < 1401600000 3>, < 1689600000 4>, - < 1843200000 5>, + < 1804800000 5>, < 1958400000 6>, < 2016000000 7>, < 2150400000 8>, @@ -912,11 +920,25 @@ < 414720000 2>, < 560640000 3>, < 675840000 4>, - < 737280000 5>, + < 721920000 5>, < 783360000 6>, < 806400000 7>, < 860160000 8>, < 883200000 9>; + qcom,speed6-bin-v0-cl = + < 0 0>, + < 652800000 1>, + < 1036800000 2>, + < 1401600000 3>, + < 1689600000 4>, + < 1804800000 5>; + qcom,speed6-bin-v0-cci = + < 0 0>, + < 261120000 1>, + < 414720000 2>, + < 560640000 3>, + < 675840000 4>, + < 721920000 5>; #clock-cells = <1>; }; @@ -940,7 +962,7 @@ < 1036800 >, < 1401600 >, < 1689600 >, - < 1843200 >, + < 1804800 >, < 1958400 >, < 2016000 >, < 2150400 >, @@ -1002,7 +1024,7 @@ < 1036800 3221>, < 1401600 5859>, < 1689600 6445>, - < 1843200 7104>, + < 1804800 7104>, < 1958400 7104>, < 2208000 7104>; }; @@ -1305,6 +1327,8 @@ interrupt-names = "ipa-irq", "bam-irq"; qcom,ipa-hw-ver = <6>; /* IPA core version = IPAv2.6L */ qcom,ipa-hw-mode = <0>; /* IPA hw type = Normal */ + qcom,wan-rx-ring-size = <192>; /* IPA WAN-rx-ring-size*/ + qcom,lan-rx-ring-size = <192>; /* IPA LAN-rx-ring-size*/ clock-names = "core_clk"; clocks = <&clock_gcc clk_ipa_clk>; qcom,ee = <0>; @@ -1901,7 +1925,7 @@ /* GPIO output to lpass */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_2_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&adsp_fw_mem>; }; qcom,venus@1de0000 { @@ -1981,7 +2005,7 @@ /* GPIO output to wcnss */ qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_4_out 0 0>; - memory-region = <&reloc_mem>; + memory-region = <&wcnss_fw_mem>; }; usb3: ssusb@7000000{ @@ -1998,7 +2022,6 @@ interrupt-names = "hs_phy_irq", "ss_phy_irq", "pwr_event_irq"; USB3_GDSC-supply = <&gdsc_usb30>; - vbus_dwc3-supply = <&smbcharger_charger_otg>; qcom,usb-dbm = <&dbm_1p5>; qcom,msm-bus,name = "usb3"; qcom,msm-bus,num-cases = <2>; @@ -2103,11 +2126,13 @@ reg = <0x079000 0x180>, <0x070f8800 0x400>, <0x01841030 0x4>, - <0x0193f044 0x4>; + <0x0193f044 0x4>, + <0x0193f020 0x4>; reg-names = "qusb_phy_base", "qscratch_base", "ref_clk_addr", - "tcsr_phy_clk_scheme_sel"; + "tcsr_phy_clk_scheme_sel", + "tcsr_phy_level_shift_keeper"; USB3_GDSC-supply = <&gdsc_usb30>; vdd-supply = <&pm8953_l3>; @@ -2251,6 +2276,11 @@ }; + usb_audio_qmi_dev { + compatible = "qcom,usb-audio-qmi-dev"; + qcom,usb-audio-intr-num = <2>; + }; + dbm_1p5: dbm@70f8000 { compatible = "qcom,usb-dbm-1p5"; reg = <0x070f8000 0x300>; @@ -2267,9 +2297,8 @@ #include "msm-pm8953-rpm-regulator.dtsi" #include "msm-pm8953.dtsi" #include "msm8953-regulator.dtsi" -#include "msm-pmi8950.dtsi" #include "msm-audio.dtsi" -#include "msm8953-audio.dtsi" +#include "msm8953-audio_rosy.dtsi" #include "msm-gdsc-8916.dtsi" #include "msm8953-camera.dtsi" #include "msm8953-mdss.dtsi" diff --git a/arch/arm/boot/dts/qcom/msm8953_rosy.dtsi b/arch/arm/boot/dts/qcom/msm8953_rosy.dtsi new file mode 100644 index 0000000000000..cdc676c4a0666 --- /dev/null +++ b/arch/arm/boot/dts/qcom/msm8953_rosy.dtsi @@ -0,0 +1,2591 @@ +/* + * Copyright (c) 2015-2016, 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 "skeleton64.dtsi" +#include +#include +#include + +/ { + model = "Qualcomm Technologies, Inc. MSM 8953"; + compatible = "qcom,msm8953"; + qcom,msm-id = <293 0x0>; + interrupt-parent = <&intc>; + + chosen { + bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1"; + }; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + other_ext_mem: other_ext_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x84A00000 0x0 0x1E00000>; + }; + + modem_mem: modem_region@0 { + compatible = "removed-dma-pool"; + no-map-fixup; + reg = <0x0 0x86c00000 0x0 0x6a00000>; + }; + + adsp_fw_mem: adsp_fw_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x8d600000 0x0 0x1100000>; + }; + + wcnss_fw_mem: wcnss_fw_region@0 { + compatible = "removed-dma-pool"; + no-map; + reg = <0x0 0x8e700000 0x0 0x700000>; + }; + + venus_mem: venus_region@0 { + compatible = "shared-dma-pool"; + reusable; + alloc-ranges = <0x0 0x80000000 0x0 0x10000000>; + alignment = <0 0x400000>; + size = <0 0x0800000>; + }; + + secure_mem: secure_region@0 { + compatible = "shared-dma-pool"; + reusable; + alignment = <0 0x400000>; + size = <0 0x09800000>; + }; + + qseecom_mem: qseecom_region@0 { + compatible = "shared-dma-pool"; + reusable; + alignment = <0 0x400000>; + size = <0 0x1000000>; + }; + + adsp_mem: adsp_region@0 { + compatible = "shared-dma-pool"; + reusable; + size = <0 0x400000>; + }; + + dfps_data_mem: dfps_data_mem@90000000 { + reg = <0 0x90000000 0 0x1000>; + label = "dfps_data_mem"; + }; + + cont_splash_mem: splash_region@0x90001000 { + reg = <0x0 0x90001000 0x0 0x13ff000>; + label = "cont_splash_mem"; + }; + + gpu_mem: gpu_region@0 { + compatible = "shared-dma-pool"; + reusable; + alloc-ranges = <0x0 0x80000000 0x0 0x10000000>; + alignment = <0 0x400000>; + size = <0 0x800000>; + }; + }; + + aliases { + /* smdtty devices */ + smd1 = &smdtty_apps_fm; + smd2 = &smdtty_apps_riva_bt_acl; + smd3 = &smdtty_apps_riva_bt_cmd; + smd4 = &smdtty_mbalbridge; + smd5 = &smdtty_apps_riva_ant_cmd; + smd6 = &smdtty_apps_riva_ant_data; + smd7 = &smdtty_data1; + smd8 = &smdtty_data4; + smd11 = &smdtty_data11; + smd21 = &smdtty_data21; + smd36 = &smdtty_loopback; + sdhc1 = &sdhc_1; /* SDC1 eMMC slot */ + sdhc2 = &sdhc_2; /* SDC2 for SD card */ + i2c2 = &i2c_2; + i2c3 = &i2c_3; + i2c5 = &i2c_5; + spi3 = &spi_3; + spi6 = &spi_6; + i2c8 = &i2c_8; + }; + + soc: soc { }; + +}; + +#include "msm8953-pinctrl.dtsi" +#include "msm8953-cpu.dtsi" +#include "msm8953-gpu.dtsi" +#include "msm8953-ion.dtsi" +#include "msm8953-smp2p.dtsi" +#include "msm-arm-smmu-8953.dtsi" +#include "msm8953-coresight.dtsi" +#include "msm8953-bus.dtsi" +#include "msm8953-iommu-domains.dtsi" +#include "msm8953-vidc.dtsi" +#include "msm8953-pm.dtsi" + +&soc { + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0 0 0xffffffff>; + compatible = "simple-bus"; + + apc_apm: apm@b111000 { + compatible = "qcom,msm8953-apm"; + reg = <0xb111000 0x1000>; + reg-names = "pm-apcc-glb"; + qcom,apm-post-halt-delay = <0x2>; + qcom,apm-halt-clk-delay = <0x11>; + qcom,apm-resume-clk-delay = <0x10>; + qcom,apm-sel-switch-delay = <0x01>; + }; + + intc: interrupt-controller@b000000 { + compatible = "qcom,msm-qgic2"; + interrupt-controller; + #interrupt-cells = <3>; + reg = <0x0b000000 0x1000>, + <0x0b002000 0x1000>; + }; + + arm64-cpu-erp { + compatible = "arm,arm64-cpu-erp"; + interrupts = <0 275 0>, + <0 276 0>, + <0 273 0>, + <0 274 0>; + interrupt-names = "pri-dbe-irq", + "sec-dbe-irq", + "pri-ext-irq", + "sec-ext-irq"; + poll-delay-ms = <5000>; + }; + + qcom,msm-gladiator@b1c0000 { + compatible = "qcom,msm-gladiator"; + reg = <0x0b1c0000 0x4000>; + reg-names = "gladiator_base"; + interrupts = <0 22 0>; + }; + + timer { + compatible = "arm,armv8-timer"; + interrupts = <1 2 0xff08>, + <1 3 0xff08>, + <1 4 0xff08>, + <1 1 0xff08>; + clock-frequency = <19200000>; + }; + + timer@b120000 { + #address-cells = <1>; + #size-cells = <1>; + ranges; + compatible = "arm,armv7-timer-mem"; + reg = <0xb120000 0x1000>; + clock-frequency = <19200000>; + + frame@b121000 { + frame-number = <0>; + interrupts = <0 8 0x4>, + <0 7 0x4>; + reg = <0xb121000 0x1000>, + <0xb122000 0x1000>; + }; + + frame@b123000 { + frame-number = <1>; + interrupts = <0 9 0x4>; + reg = <0xb123000 0x1000>; + status = "disabled"; + }; + + frame@b124000 { + frame-number = <2>; + interrupts = <0 10 0x4>; + reg = <0xb124000 0x1000>; + status = "disabled"; + }; + + frame@b125000 { + frame-number = <3>; + interrupts = <0 11 0x4>; + reg = <0xb125000 0x1000>; + status = "disabled"; + }; + + frame@b126000 { + frame-number = <4>; + interrupts = <0 12 0x4>; + reg = <0xb126000 0x1000>; + status = "disabled"; + }; + + frame@b127000 { + frame-number = <5>; + interrupts = <0 13 0x4>; + reg = <0xb127000 0x1000>; + status = "disabled"; + }; + + frame@b128000 { + frame-number = <6>; + interrupts = <0 14 0x4>; + reg = <0xb128000 0x1000>; + status = "disabled"; + }; + }; + qcom,rmtfs_sharedmem@00000000 { + compatible = "qcom,sharedmem-uio"; + reg = <0x00000000 0x00180000>; + reg-names = "rmtfs"; + qcom,client-id = <0x00000001>; + }; + + restart@4ab000 { + compatible = "qcom,pshold"; + reg = <0x4ab000 0x4>, + <0x193d100 0x4>; + reg-names = "pshold-base", "tcsr-boot-misc-detect"; + }; + + qcom,mpm2-sleep-counter@4a3000 { + compatible = "qcom,mpm2-sleep-counter"; + reg = <0x4a3000 0x1000>; + clock-frequency = <32768>; + }; + + cpu-pmu { + compatible = "arm,armv8-pmuv3"; + interrupts = <1 7 0xff00>; + }; + + qcom,sps { + compatible = "qcom,msm_sps_4k"; + qcom,pipe-attr-ee; + }; + + tsens: tsens@4a8000 { + compatible = "qcom,msm8953-tsens"; + reg = <0x4a8000 0x2000>, + <0xa4000 0x1000>; + reg-names = "tsens_physical", "tsens_eeprom_physical"; + interrupts = <0 184 0>, <0 314 0>; + interrupt-names = "tsens-upper-lower", "tsens-critical"; + qcom,client-id = <1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>; + qcom,sensor-id = <1 2 3 4 5 6 7 8 9 10 11 12 13 14 15>; + qcom,sensors = <15>; + qcom,slope = <3200 3200 3200 3200 3200 3200 3200 3200 + 3200 3200 3200 3200 3200 3200 3200>; + qcom,valid-status-check; + }; + + qcom,sensor-information { + compatible = "qcom,sensor-information"; + sensor_information0: qcom,sensor-information-0 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor0"; + qcom,scaling-factor = <10>; + }; + + sensor_information1: qcom,sensor-information-1 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor1"; + qcom,scaling-factor = <10>; + }; + + sensor_information2: qcom,sensor-information-2 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor2"; + qcom,alias-name = "pop_mem"; + qcom,scaling-factor = <10>; + }; + + sensor_information3: qcom,sensor-information-3 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor3"; + qcom,scaling-factor = <10>; + }; + + sensor_information4: qcom,sensor-information-4 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor4"; + qcom,scaling-factor = <10>; + }; + + sensor_information5: qcom,sensor-information-5 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor5"; + qcom,scaling-factor = <10>; + }; + + sensor_information6: qcom,sensor-information-6 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor6"; + qcom,scaling-factor = <10>; + }; + + sensor_information7: qcom,sensor-information-7 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor7"; + qcom,scaling-factor = <10>; + }; + + sensor_information8: qcom,sensor-information-8 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor8"; + qcom,scaling-factor = <10>; + qcom,alias-name = "L2_cache_1"; + }; + + sensor_information9: qcom,sensor-information-9 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor9"; + qcom,scaling-factor = <10>; + }; + + sensor_information10: qcom,sensor-information-10 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor10"; + qcom,scaling-factor = <10>; + }; + + sensor_information11: qcom,sensor-information-11 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor11"; + qcom,scaling-factor = <10>; + }; + + sensor_information12: qcom,sensor-information-12 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor12"; + qcom,scaling-factor = <10>; + }; + + sensor_information13: qcom,sensor-information-13 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor13"; + qcom,scaling-factor = <10>; + qcom,alias-name = "L2_cache_0"; + }; + + sensor_information14: qcom,sensor-information-14 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor14"; + qcom,scaling-factor = <10>; + }; + + sensor_information15: qcom,sensor-information-15 { + qcom,sensor-type = "tsens"; + qcom,sensor-name = "tsens_tz_sensor15"; + qcom,alias-name = "gpu"; + qcom,scaling-factor = <10>; + }; + + sensor_information16: qcom,sensor-information-16 { + qcom,sensor-type = "alarm"; + qcom,sensor-name = "pm8953_tz"; + qcom,scaling-factor = <1000>; + }; + + sensor_information17: qcom,sensor-information-17 { + qcom,sensor-type = "adc"; + qcom,sensor-name = "pa_therm0"; + }; + + sensor_information18: qcom,sensor-information-18 { + qcom,sensor-type = "adc"; + qcom,sensor-name = "pa_therm1"; + }; + + sensor_information19: qcom,sensor-information-19 { + qcom,sensor-type = "adc"; + qcom,sensor-name = "xo_therm"; + }; + + sensor_information20: qcom,sensor-information-20 { + qcom,sensor-type = "adc"; + qcom,sensor-name = "xo_therm_buf"; + }; + + sensor_information21: qcom,sensor-information-21 { + qcom,sensor-type = "adc"; + qcom,sensor-name = "case_therm"; + }; + }; + + mitigation_profile0: qcom,limit_info-0 { + qcom,temperature-sensor = <&sensor_information9>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile1: qcom,limit_info-1 { + qcom,temperature-sensor = <&sensor_information10>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile2: qcom,limit_info-2 { + qcom,temperature-sensor = <&sensor_information11>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile3: qcom,limit_info-3 { + qcom,temperature-sensor = <&sensor_information12>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile4: qcom,limit_info-4 { + qcom,temperature-sensor = <&sensor_information4>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile5: qcom,limit_info-5 { + qcom,temperature-sensor = <&sensor_information5>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile6: qcom,limit_info-6 { + qcom,temperature-sensor = <&sensor_information6>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + mitigation_profile7: qcom,limit_info-7 { + qcom,temperature-sensor = <&sensor_information7>; + qcom,boot-frequency-mitigate; + qcom,hotplug-mitigation-enable; + qcom,emergency-frequency-mitigate; + }; + + qcom,msm-thermal { + compatible = "qcom,msm-thermal"; + qcom,sensor-id = <9>; + qcom,poll-ms = <250>; + qcom,limit-temp = <60>; + qcom,temp-hysteresis = <10>; + qcom,freq-step = <2>; + qcom,core-limit-temp = <80>; + qcom,core-temp-hysteresis = <10>; + qcom,hotplug-temp = <105>; + qcom,hotplug-temp-hysteresis = <15>; + qcom,freq-mitigation-temp = <105>; + qcom,freq-mitigation-temp-hysteresis = <15>; + qcom,freq-mitigation-value = <1036800>; + qcom,therm-reset-temp = <115>; + qcom,online-hotplug-core; + qcom,synchronous-cluster-id = <0 1>; + qcom,synchronous-cluster-map = <0 4 &CPU0 &CPU1 &CPU2 &CPU3>, + <1 4 &CPU4 &CPU5 &CPU6 &CPU7>; + qcom,disable-cx-phase-ctrl; + qcom,disable-gfx-phase-ctrl; + qcom,disable-vdd-mx; + qcom,disable-psm; + qcom,disable-ocr; + qcom,vdd-restriction-temp = <5>; + qcom,vdd-restriction-temp-hysteresis = <10>; + vdd-dig-supply = <&pm8953_s2_floor_level>; + vdd-gfx-supply = <&gfx_vreg_corner>; + + qcom,vdd-dig-rstr { + qcom,vdd-rstr-reg = "vdd-dig"; + qcom,levels = ; + qcom,min-level = ; + }; + + qcom,vdd-gfx-rstr { + qcom,vdd-rstr-reg = "vdd-gfx"; + qcom,levels = <5 7 7>; /* Nominal, Turbo, Turbo */ + qcom,min-level = <1>; /* No Request */ + }; + + msm_thermal_freq: qcom,vdd-apps-rstr { + qcom,vdd-rstr-reg = "vdd-apps"; + qcom,levels = <1689600>; + qcom,freq-req; + }; + }; + + qcom,bcl { + compatible = "qcom,bcl"; + qcom,bcl-enable; + qcom,bcl-framework-interface; + qcom,bcl-freq-control-list = <&CPU0 &CPU1 &CPU2 &CPU3 + &CPU4 &CPU5 &CPU6 &CPU7>; + qcom,bcl-hotplug-list = <&CPU6 &CPU7>; + qcom,bcl-soc-hotplug-list = <&CPU4 &CPU5 &CPU6 &CPU7>; + qcom,ibat-monitor { + qcom,low-threshold-uamp = <3400000>; + qcom,high-threshold-uamp = <4200000>; + qcom,mitigation-freq-khz = <1689600>; + qcom,vph-high-threshold-uv = <3500000>; + qcom,vph-low-threshold-uv = <3200000>; + qcom,soc-low-threshold = <10>; + qcom,thermal-handle = <&msm_thermal_freq>; + }; + }; + + qcom,msm-core@a0000 { + compatible = "qcom,apss-core-ea"; + reg = <0xa0000 0x1000>; + qcom,low-hyst-temp = <10>; + qcom,high-hyst-temp = <5>; + + ea0: ea0 { + sensor = <&sensor_information9>; + }; + + ea1: ea1 { + sensor = <&sensor_information10>; + }; + + ea2: ea2 { + sensor = <&sensor_information11>; + }; + + ea3: ea3 { + sensor = <&sensor_information12>; + }; + + ea4: ea4 { + sensor = <&sensor_information4>; + }; + + ea5: ea5 { + sensor = <&sensor_information5>; + }; + + ea6: ea6 { + sensor = <&sensor_information6>; + }; + + ea7: ea7 { + sensor = <&sensor_information7>; + }; + }; + + blsp1_uart0: serial@78af000 { + compatible = "qcom,msm-lsuart-v14"; + reg = <0x78af000 0x200>; + interrupts = <0 107 0>; + status = "disabled"; + clocks = <&clock_gcc clk_gcc_blsp1_uart1_apps_clk>, + <&clock_gcc clk_gcc_blsp1_ahb_clk>; + clock-names = "core_clk", "iface_clk"; + }; + + blsp1_uart1: uart@78b0000 { + compatible = "qcom,msm-hsuart-v14"; + reg = <0x78b0000 0x200>, + <0x7884000 0x1f000>; + reg-names = "core_mem", "bam_mem"; + + interrupt-names = "core_irq", "bam_irq", "wakeup_irq"; + #address-cells = <0>; + interrupt-parent = <&blsp1_uart1>; + interrupts = <0 1 2>; + #interrupt-cells = <1>; + interrupt-map-mask = <0xffffffff>; + interrupt-map = <0 &intc 0 108 0 + 1 &intc 0 238 0 + 2 &tlmm 13 0>; + + qcom,inject-rx-on-wakeup; + qcom,rx-char-to-inject = <0xFD>; + qcom,master-id = <86>; + clock-names = "core_clk", "iface_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_uart2_apps_clk>, + <&clock_gcc clk_gcc_blsp1_ahb_clk>; + pinctrl-names = "sleep", "default"; + pinctrl-0 = <&hsuart_sleep>; + pinctrl-1 = <&hsuart_active>; + qcom,bam-tx-ep-pipe-index = <2>; + qcom,bam-rx-ep-pipe-index = <3>; + qcom,msm-bus,name = "blsp1_uart1"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <86 512 0 0>, + <86 512 500 800>; + status = "disabled"; + }; + + dma_blsp1: qcom,sps-dma@7884000 { /* BLSP1 */ + #dma-cells = <4>; + compatible = "qcom,sps-dma"; + reg = <0x7884000 0x1f000>; + interrupts = <0 238 0>; + qcom,summing-threshold = <10>; + }; + + dma_blsp2: qcom,sps-dma@7ac4000 { /* BLSP2 */ + #dma-cells = <4>; + compatible = "qcom,sps-dma"; + reg = <0x7ac4000 0x1f000>; + interrupts = <0 239 0>; + qcom,summing-threshold = <10>; + }; + + spi_3: spi@78b7000 { /* BLSP1 QUP3 */ + compatible = "qcom,spi-qup-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "spi_physical", "spi_bam_physical"; + reg = <0x78b7000 0x600>, + <0x7884000 0x1f000>; + interrupt-names = "spi_irq", "spi_bam_irq"; + interrupts = <0 97 0>, <0 238 0>; + spi-max-frequency = <19200000>; + pinctrl-names = "spi_default", "spi_sleep"; + pinctrl-0 = <&spi3_default &spi3_cs0_active>; + pinctrl-1 = <&spi3_sleep &spi3_cs0_sleep>; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup3_spi_apps_clk>; + clock-names = "iface_clk", "core_clk"; + qcom,infinite-mode = <0>; + qcom,use-bam; + qcom,use-pinctrl; + qcom,ver-reg-exists; + qcom,bam-consumer-pipe-index = <8>; + qcom,bam-producer-pipe-index = <9>; + qcom,master-id = <86>; + }; + + spi_6: spi@7af6000 { + compatible = "qcom,spi-qup-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "spi_physical", "spi_bam_physical"; + reg = <0x7af6000 0x600>, + <0x7ac4000 0x1f000>; + interrupt-names = "spi_irq", "spi_bam_irq"; + interrupts = <0 300 0>, <0 239 0>; + spi-max-frequency = <50000000>; + pinctrl-names = "spi_default", "spi_sleep"; + pinctrl-0 = <&spi6_default &spi6_cs0_active>; + pinctrl-1 = <&spi6_sleep &spi6_cs0_sleep>; + clocks = <&clock_gcc clk_gcc_blsp2_ahb_clk>, + <&clock_gcc clk_gcc_blsp2_qup2_spi_apps_clk>; + clock-names = "iface_clk", "core_clk"; + qcom,infinite-mode = <0>; + qcom,use-bam; + qcom,rt-priority; + qcom,use-pinctrl; + qcom,ver-reg-exists; + qcom,bam-consumer-pipe-index = <6>; + qcom,bam-producer-pipe-index = <7>; + qcom,master-id = <84>; + status = "ok"; + spi_ir@1 { + compatible = "qcom,spi-msm-codec-slave"; + reg = <1>; + spi-max-frequency = <50000000>; + spi-cpol; + status = "ok"; + }; + }; + + i2c_2: i2c@78b6000 { /* BLSP1 QUP2 */ + compatible = "qcom,i2c-msm-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "qup_phys_addr"; + reg = <0x78b6000 0x600>; + interrupt-names = "qup_irq"; + interrupts = <0 96 0>; + qcom,clk-freq-out = <400000>; + qcom,clk-freq-in = <19200000>; + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup2_i2c_apps_clk>; + + pinctrl-names = "i2c_active", "i2c_sleep"; + pinctrl-0 = <&i2c_2_active>; + pinctrl-1 = <&i2c_2_sleep>; + qcom,noise-rjct-scl = <0>; + qcom,noise-rjct-sda = <0>; + qcom,master-id = <86>; + dmas = <&dma_blsp1 6 64 0x20000020 0x20>, + <&dma_blsp1 7 32 0x20000020 0x20>; + dma-names = "tx", "rx"; + + /* DSI_TO_HDMI I2C configuration */ + adv7533@39 { + compatible = "adv7533"; + reg = <0x39>; + instance_id = <0>; + adi,video-mode = <3>; /* 3 = 1080p */ + adi,main-addr = <0x39>; + adi,cec-dsi-addr = <0x3C>; + adi,enable-audio; + pinctrl-names = "pmx_adv7533_active", + "pmx_adv7533_suspend"; + pinctrl-0 = <&adv7533_int_active>; + pinctrl-1 = <&adv7533_int_suspend>; + adi,irq-gpio = <&tlmm 90 0x2002>; + hpd-5v-en-supply = <&adv_vreg>; + qcom,supply-names = "hpd-5v-en"; + qcom,min-voltage-level = <0>; + qcom,max-voltage-level = <0>; + qcom,enable-load = <0>; + qcom,disable-load = <0>; + }; + }; + + i2c_3: i2c@78b7000 { /* BLSP1 QUP3 */ + compatible = "qcom,i2c-msm-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "qup_phys_addr"; + reg = <0x78b7000 0x600>; + interrupt-names = "qup_irq"; + interrupts = <0 97 0>; + qcom,clk-freq-out = <400000>; + qcom,clk-freq-in = <19200000>; + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp1_ahb_clk>, + <&clock_gcc clk_gcc_blsp1_qup3_i2c_apps_clk>; + + pinctrl-names = "i2c_active", "i2c_sleep"; + pinctrl-0 = <&i2c_3_active>; + pinctrl-1 = <&i2c_3_sleep>; + qcom,noise-rjct-scl = <0>; + qcom,noise-rjct-sda = <0>; + qcom,master-id = <86>; + dmas = <&dma_blsp1 8 64 0x20000020 0x20>, + <&dma_blsp1 9 32 0x20000020 0x20>; + dma-names = "tx", "rx"; + status = "okay"; + }; + + i2c_5: i2c@7af5000 { /* BLSP2 QUP1 */ + compatible = "qcom,i2c-msm-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "qup_phys_addr"; + reg = <0x7af5000 0x600>; + interrupt-names = "qup_irq"; + interrupts = <0 299 0>; + qcom,clk-freq-out = <400000>; + qcom,clk-freq-in = <19200000>; + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp2_ahb_clk>, + <&clock_gcc clk_gcc_blsp2_qup1_i2c_apps_clk>; + + pinctrl-names = "i2c_active", "i2c_sleep"; + pinctrl-0 = <&i2c_5_active>; + pinctrl-1 = <&i2c_5_sleep>; + qcom,noise-rjct-scl = <0>; + qcom,noise-rjct-sda = <0>; + qcom,master-id = <84>; + dmas = <&dma_blsp2 4 64 0x20000020 0x20>, + <&dma_blsp2 5 32 0x20000020 0x20>; + dma-names = "tx", "rx"; + }; + + i2c_8: i2c@7af8000 { /* BLSP2 QUP3 */ + compatible = "qcom,i2c-msm-v2"; + #address-cells = <1>; + #size-cells = <0>; + reg-names = "qup_phys_addr"; + reg = <0x7af8000 0x600>; + interrupt-names = "qup_irq"; + interrupts = <0 302 0>; + qcom,clk-freq-out = <400000>; + qcom,clk-freq-in = <19200000>; + clock-names = "iface_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_blsp2_ahb_clk>, + <&clock_gcc clk_gcc_blsp2_qup4_i2c_apps_clk>; + + pinctrl-names = "i2c_active", "i2c_sleep"; + pinctrl-0 = <&i2c_8_active>; + pinctrl-1 = <&i2c_8_sleep>; + qcom,noise-rjct-scl = <0>; + qcom,noise-rjct-sda = <0>; + qcom,master-id = <84>; + dmas = <&dma_blsp2 10 64 0x20000020 0x20>, + <&dma_blsp2 11 32 0x20000020 0x20>; + dma-names = "tx", "rx"; + + aw87319@58{ /*AW87319 PA*/ + compatible = "awinic,aw87319_pa"; + reg = <0x58>; + qcom,ext_pa_spk_aw87319_rst = <&tlmm 96 0>; + }; + }; + + slim_msm: slim@c140000{ + cell-index = <1>; + compatible = "qcom,slim-ngd"; + reg = <0xc140000 0x2c000>, + <0xc104000 0x2a000>; + reg-names = "slimbus_physical", "slimbus_bam_physical"; + interrupts = <0 163 0>, <0 180 0>; + interrupt-names = "slimbus_irq", "slimbus_bam_irq"; + qcom,apps-ch-pipes = <0x600000>; + qcom,ea-pc = <0x200>; + status = "disabled"; + }; + + dcc: dcc@b3000 { + compatible = "qcom,dcc"; + reg = <0xb3000 0x1000>, + <0xb4000 0x800>; + reg-names = "dcc-base", "dcc-ram-base"; + + clocks = <&clock_gcc clk_gcc_dcc_clk>; + clock-names = "dcc_clk"; + + qcom,save-reg; + }; + + clock_gcc: qcom,gcc@1800000 { + compatible = "qcom,gcc-8953"; + reg = <0x1800000 0x80000>; + reg-names = "cc_base"; + vdd_dig-supply = <&pm8953_s2_level>; + #clock-cells = <1>; + }; + + clock_gcc_mdss: qcom,gcc-mdss@1800000 { + compatible = "qcom,gcc-mdss-8953"; + reg = <0x1800000 0x80000>; + reg-names = "cc_base"; + clock-names = "pclk0_src", "pclk1_src", + "byte0_src", "byte1_src"; + clocks = <&mdss_dsi0_pll clk_dsi0pll_pixel_clk_mux>, + <&mdss_dsi1_pll clk_dsi1pll_pixel_clk_mux>, + <&mdss_dsi0_pll clk_dsi0pll_byte_clk_mux>, + <&mdss_dsi1_pll clk_dsi1pll_byte_clk_mux>; + #clock-cells = <1>; + }; + + clock_debug: qcom,cc-debug@1874000 { + compatible = "qcom,cc-debug-8953"; + reg = <0x1874000 0x4>; + reg-names = "cc_base"; + clocks = <&clock_cpu clk_cpu_debug_pri_mux>; + clock-names = "debug_cpu_clk"; + #clock-cells = <1>; + }; + + clock_gcc_gfx: qcom,gcc-gfx@1800000 { + compatible = "qcom,gcc-gfx-8953"; + reg = <0x1800000 0x80000>; + reg-names = "cc_base"; + vdd_gfx-supply = <&gfx_vreg_corner>; + qcom,gfxfreq-corner = + < 0 0 >, + < 133330000 1 >, /* Min SVS */ + < 216000000 2 >, /* Low SVS */ + < 320000000 3 >, /* SVS */ + < 400000000 4 >, /* SVS Plus */ + < 510000000 5 >, /* NOM */ + < 560000000 6 >, /* Nom Plus */ + < 650000000 7 >; /* Turbo */ + #clock-cells = <1>; + }; + + clock_cpu: qcom,cpu-clock-8953@b116000 { + compatible = "qcom,cpu-clock-8953"; + reg = <0xb114000 0x68>, + <0xb014000 0x68>, + <0xb116000 0x400>, + <0xb111050 0x08>, + <0xb011050 0x08>, + <0xb1d1050 0x08>, + <0x00a4124 0x08>; + reg-names = "rcgwr-c0-base", "rcgwr-c1-base", + "c0-pll", "c0-mux", "c1-mux", + "cci-mux", "efuse"; + vdd-mx-supply = <&pm8953_s7_level_ao>; + vdd-cl-supply = <&apc_vreg>; + clocks = <&clock_gcc clk_xo_a_clk_src>; + clock-names = "xo_a"; + qcom,num-clusters = <2>; + qcom,speed0-bin-v0-cl = + < 0 0>, + < 652800000 1>, + < 1036800000 2>, + < 1401600000 3>, + < 1689600000 4>, + < 1804800000 5>, + < 1958400000 6>, + < 2016000000 7>; + qcom,speed0-bin-v0-cci = + < 0 0>, + < 261120000 1>, + < 414720000 2>, + < 560640000 3>, + < 675840000 4>, + < 721920000 5>, + < 783360000 6>, + < 806400000 7>; + qcom,speed2-bin-v0-cl = + < 0 0>, + < 652800000 1>, + < 1036800000 2>, + < 1401600000 3>, + < 1689600000 4>, + < 1804800000 5>, + < 1958400000 6>, + < 2016000000 7>; + qcom,speed2-bin-v0-cci = + < 0 0>, + < 261120000 1>, + < 414720000 2>, + < 560640000 3>, + < 675840000 4>, + < 721920000 5>, + < 783360000 6>, + < 806400000 7>; + qcom,speed7-bin-v0-cl = + < 0 0>, + < 652800000 1>, + < 1036800000 2>, + < 1401600000 3>, + < 1689600000 4>, + < 1804800000 5>, + < 1958400000 6>, + < 2016000000 7>, + < 2150400000 8>, + < 2208000000 9>; + qcom,speed7-bin-v0-cci = + < 0 0>, + < 261120000 1>, + < 414720000 2>, + < 560640000 3>, + < 675840000 4>, + < 721920000 5>, + < 783360000 6>, + < 806400000 7>, + < 860160000 8>, + < 883200000 9>; + qcom,speed6-bin-v0-cl = + < 0 0>, + < 652800000 1>, + < 1036800000 2>, + < 1401600000 3>, + < 1689600000 4>, + < 1804800000 5>; + qcom,speed6-bin-v0-cci = + < 0 0>, + < 261120000 1>, + < 414720000 2>, + < 560640000 3>, + < 675840000 4>, + < 721920000 5>; + #clock-cells = <1>; + }; + + msm_cpufreq: qcom,msm-cpufreq { + compatible = "qcom,msm-cpufreq"; + clock-names = "l2_clk", "cpu0_clk", "cpu1_clk", "cpu2_clk", + "cpu3_clk", "cpu4_clk", "cpu5_clk", + "cpu6_clk", "cpu7_clk"; + clocks = <&clock_cpu clk_cci_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>, + <&clock_cpu clk_a53_pwr_clk>; + + qcom,cpufreq-table = + < 652800 >, + < 1036800 >, + < 1401600 >, + < 1689600 >, + < 1804800 >, + < 1958400 >, + < 2016000 >, + < 2150400 >, + < 2208000 >; + }; + + cpubw: qcom,cpubw { + compatible = "qcom,devbw"; + governor = "cpufreq"; + qcom,src-dst-ports = <1 512>; + qcom,active-only; + qcom,bw-tbl = + < 769 /* 100.8 MHz */ >, + < 1611 /* 211.2 MHz */ >, /*Low SVS*/ + < 2124 /* 278.4 MHz */ >, + < 2929 /* 384 MHz */ >, + < 3221 /* 422.4 MHz */ >, /* SVS */ + < 4248 /* 556.8 MHz */ >, + < 5126 /* 672 MHz */ >, + < 5859 /* 768 MHz */ >, /* SVS+ */ + < 6152 /* 806.4 MHz */ >, + < 6445 /* 844.8 MHz */ >, /* NOM */ + < 7104 /* 931.2 MHz */ >; /* TURBO */ + }; + + mincpubw: qcom,mincpubw { + compatible = "qcom,devbw"; + governor = "cpufreq"; + qcom,src-dst-ports = <1 512>; + qcom,active-only; + qcom,bw-tbl = + < 769 /* 100.8 MHz */ >, + < 1611 /* 211.2 MHz */ >, /*Low SVS*/ + < 2124 /* 278.4 MHz */ >, + < 2929 /* 384 MHz */ >, + < 3221 /* 422.4 MHz */ >, /* SVS */ + < 4248 /* 556.8 MHz */ >, + < 5126 /* 672 MHz */ >, + < 5859 /* 768 MHz */ >, /* SVS+ */ + < 6152 /* 806.4 MHz */ >, + < 6445 /* 844.8 MHz */ >, /* NOM */ + < 7104 /* 931.2 MHz */ >; /* TURBO */ + }; + + qcom,cpu-bwmon { + compatible = "qcom,bimc-bwmon2"; + reg = <0x408000 0x300>, <0x401000 0x200>; + reg-names = "base", "global_base"; + interrupts = <0 183 4>; + qcom,mport = <0>; + qcom,target-dev = <&cpubw>; + }; + + devfreq-cpufreq { + cpubw-cpufreq { + target-dev = <&cpubw>; + cpu-to-dev-map = + < 652800 1611>, + < 1036800 3221>, + < 1401600 5859>, + < 1689600 6445>, + < 1804800 7104>, + < 1958400 7104>, + < 2208000 7104>; + }; + + mincpubw-cpufreq { + target-dev = <&mincpubw>; + cpu-to-dev-map = + < 652800 1611 >, + < 1401600 3221 >, + < 2208000 5859 >; + }; + }; + + rpm_bus: qcom,rpm-smd { + compatible = "qcom,rpm-smd"; + rpm-channel-name = "rpm_requests"; + rpm-channel-type = <15>; /* SMD_APPS_RPM */ + }; + + qcom,ipc-spinlock@1905000 { + compatible = "qcom,ipc-spinlock-sfpb"; + reg = <0x1905000 0x8000>; + qcom,num-locks = <8>; + }; + + qcom,smem@86300000 { + compatible = "qcom,smem"; + reg = <0x86300000 0x100000>, + <0x0b011008 0x4>, + <0x60000 0x8000>, + <0x193d000 0x8>; + reg-names = "smem", "irq-reg-base", + "aux-mem1", "smem_targ_info_reg"; + qcom,mpu-enabled; + + qcom,smd-modem { + compatible = "qcom,smd"; + qcom,smd-edge = <0>; + qcom,smd-irq-offset = <0x0>; + qcom,smd-irq-bitmask = <0x1000>; + interrupts = <0 25 1>; + label = "modem"; + qcom,not-loadable; + }; + + qcom,smsm-modem { + compatible = "qcom,smsm"; + qcom,smsm-edge = <0>; + qcom,smsm-irq-offset = <0x0>; + qcom,smsm-irq-bitmask = <0x2000>; + interrupts = <0 26 1>; + }; + + qcom,smd-wcnss { + compatible = "qcom,smd"; + qcom,smd-edge = <6>; + qcom,smd-irq-offset = <0x0>; + qcom,smd-irq-bitmask = <0x20000>; + interrupts = <0 142 1>; + label = "wcnss"; + }; + + qcom,smsm-wcnss { + compatible = "qcom,smsm"; + qcom,smsm-edge = <6>; + qcom,smsm-irq-offset = <0x0>; + qcom,smsm-irq-bitmask = <0x80000>; + interrupts = <0 144 1>; + }; + + qcom,smd-adsp { + compatible = "qcom,smd"; + qcom,smd-edge = <1>; + qcom,smd-irq-offset = <0x0>; + qcom,smd-irq-bitmask = <0x100>; + interrupts = <0 289 1>; + label = "adsp"; + }; + + qcom,smsm-adsp { + compatible = "qcom,smsm"; + qcom,smsm-edge = <1>; + qcom,smsm-irq-offset = <0x0>; + qcom,smsm-irq-bitmask = <0x200>; + interrupts = <0 290 1>; + }; + + qcom,smd-rpm { + compatible = "qcom,smd"; + qcom,smd-edge = <15>; + qcom,smd-irq-offset = <0x0>; + qcom,smd-irq-bitmask = <0x1>; + interrupts = <0 168 1>; + label = "rpm"; + qcom,irq-no-suspend; + qcom,not-loadable; + }; + }; + + qcom,wdt@b017000 { + compatible = "qcom,msm-watchdog"; + reg = <0xb017000 0x1000>; + reg-names = "wdt-base"; + interrupts = <0 3 0>, <0 4 0>; + qcom,bark-time = <11000>; + qcom,pet-time = <10000>; + qcom,ipi-ping; + qcom,wakeup-enable; + }; + + qcom,chd { + compatible = "qcom,core-hang-detect"; + qcom,threshold-arr = <0xb1880b0 0xb1980b0 0xb1a80b0 + 0xb1b80b0 0xb0880b0 0xb0980b0 0xb0a80b0 0xb0b80b0>; + qcom,config-arr = <0xb1880b8 0xb1980b8 0xb1a80b8 + 0xb1b80b8 0xb0880b8 0xb0980b8 0xb0a80b8 0xb0b80b8>; + }; + + qcom,msm-rtb { + compatible = "qcom,msm-rtb"; + qcom,rtb-size = <0x100000>; + }; + + qcom,msm-imem@8600000 { + compatible = "qcom,msm-imem"; + reg = <0x08600000 0x1000>; + ranges = <0x0 0x08600000 0x1000>; + #address-cells = <1>; + #size-cells = <1>; + + mem_dump_table@10 { + compatible = "qcom,msm-imem-mem_dump_table"; + reg = <0x10 8>; + }; + + dload_type@18 { + compatible = "qcom,msm-imem-dload-type"; + reg = <0x18 4>; + }; + + restart_reason@65c { + compatible = "qcom,msm-imem-restart_reason"; + reg = <0x65c 4>; + }; + + boot_stats@6b0 { + compatible = "qcom,msm-imem-boot_stats"; + reg = <0x6b0 32>; + }; + + pil@94c { + compatible = "qcom,msm-imem-pil"; + reg = <0x94c 200>; + + }; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_1 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x200000>; + qcom,client-id = <0>; + qcom,allocate-boot-time; + label = "modem"; + }; + + qcom,client_2 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x300000>; + qcom,client-id = <2>; + label = "modem"; + }; + + mem_client_3_size: qcom,client_3 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x0>; + qcom,client-id = <1>; + label = "modem"; + }; + }; + + jtag_fuse: jtagfuse@a601c { + compatible = "qcom,jtag-fuse-v2"; + reg = <0xa601c 0x8>; + reg-names = "fuse-base"; + }; + sn_fuse: snfuse@0xa0128 { + compatible = "qcom,sn-fuse"; + reg = <0xa0128 0x4>; + reg-names = "sn-base"; + }; + + + sec_boot_fuse: secbootfuse@0xa41d0 { + compatible = "qcom,sec-boot-fuse"; + reg = <0xa41d0 0x4>; + reg-names = "sec-boot-base"; + }; + + jtag_mm0: jtagmm@619c000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x619c000 0x1000>, + <0x6190000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU0>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm1: jtagmm@619d000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x619d000 0x1000>, + <0x6192000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU1>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm2: jtagmm@619e000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x619e000 0x1000>, + <0x6194000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU2>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm3: jtagmm@619f000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x619f000 0x1000>, + <0x6196000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU3>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm4: jtagmm@61bc000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x61bc000 0x1000>, + <0x61b0000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU4>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm5: jtagmm@61bd000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x61bd000 0x1000>, + <0x61b2000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU5>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm6: jtagmm@61be000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x61be000 0x1000>, + <0x61b4000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU6>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + jtag_mm7: jtagmm@61bf000 { + compatible = "qcom,jtagv8-mm"; + reg = <0x61bf000 0x1000>, + <0x61b6000 0x1000>; + reg-names = "etm-base", "debug-base"; + + qcom,coresight-jtagmm-cpu = <&CPU7>; + + clocks = <&clock_gcc clk_qdss_clk>, + <&clock_gcc clk_qdss_a_clk>; + clock-names = "core_clk", "core_a_clk"; + }; + + ipa_hw: qcom,ipa@07900000 { + compatible = "qcom,ipa"; + reg = <0x07900000 0x4effc>, <0x07904000 0x26934>; + reg-names = "ipa-base", "bam-base"; + interrupts = <0 228 0>, + <0 230 0>; + interrupt-names = "ipa-irq", "bam-irq"; + qcom,ipa-hw-ver = <6>; /* IPA core version = IPAv2.6L */ + qcom,ipa-hw-mode = <0>; /* IPA hw type = Normal */ + qcom,wan-rx-ring-size = <192>; /* IPA WAN-rx-ring-size*/ + qcom,lan-rx-ring-size = <192>; /* IPA LAN-rx-ring-size*/ + clock-names = "core_clk"; + clocks = <&clock_gcc clk_ipa_clk>; + qcom,ee = <0>; + qcom,use-ipa-tethering-bridge; + qcom,modem-cfg-emb-pipe-flt; + qcom,msm-bus,name = "ipa"; + qcom,msm-bus,num-cases = <3>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <90 512 0 0>, /* No BIMC vote (ab=0 Mbps, ib=0 Mbps ~ 0MHZ) */ + <90 512 100000 800000>, /* SVS (ab=100, ib=800 ~ 50MHz) */ + <90 512 100000 1200000>; /* PERF (ab=100, ib=1200 ~ 75MHz) */ + qcom,bus-vector-names = "MIN", "SVS", "PERF"; + }; + + qcom,rmnet-ipa { + compatible = "qcom,rmnet-ipa"; + qcom,rmnet-ipa-ssr; + qcom,ipa-loaduC; + qcom,ipa-advertise-sg-support; + }; + + qcom,smdtty { + compatible = "qcom,smdtty"; + + smdtty_apps_fm: qcom,smdtty-apps-fm { + qcom,smdtty-remote = "wcnss"; + qcom,smdtty-port-name = "APPS_FM"; + }; + + smdtty_apps_riva_bt_acl: smdtty-apps-riva-bt-acl { + qcom,smdtty-remote = "wcnss"; + qcom,smdtty-port-name = "APPS_RIVA_BT_ACL"; + }; + + smdtty_apps_riva_bt_cmd: qcom,smdtty-apps-riva-bt-cmd { + qcom,smdtty-remote = "wcnss"; + qcom,smdtty-port-name = "APPS_RIVA_BT_CMD"; + }; + + smdtty_mbalbridge: qcom,smdtty-mbalbridge { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "MBALBRIDGE"; + }; + + smdtty_apps_riva_ant_cmd: smdtty-apps-riva-ant-cmd { + qcom,smdtty-remote = "wcnss"; + qcom,smdtty-port-name = "APPS_RIVA_ANT_CMD"; + }; + + smdtty_apps_riva_ant_data: smdtty-apps-riva-ant-data { + qcom,smdtty-remote = "wcnss"; + qcom,smdtty-port-name = "APPS_RIVA_ANT_DATA"; + }; + + smdtty_data1: qcom,smdtty-data1 { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "DATA1"; + }; + + smdtty_data4: qcom,smdtty-data4 { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "DATA4"; + }; + + smdtty_data11: qcom,smdtty-data11 { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "DATA11"; + }; + + smdtty_data21: qcom,smdtty-data21 { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "DATA21"; + }; + + smdtty_loopback: smdtty-loopback { + qcom,smdtty-remote = "modem"; + qcom,smdtty-port-name = "LOOPBACK"; + qcom,smdtty-dev-name = "LOOPBACK_TTY"; + }; + }; + + qcom,smdpkt { + compatible = "qcom,smdpkt"; + + qcom,smdpkt-data5-cntl { + qcom,smdpkt-remote = "modem"; + qcom,smdpkt-port-name = "DATA5_CNTL"; + qcom,smdpkt-dev-name = "smdcntl0"; + }; + + qcom,smdpkt-data22 { + qcom,smdpkt-remote = "modem"; + qcom,smdpkt-port-name = "DATA22"; + qcom,smdpkt-dev-name = "smd22"; + }; + + qcom,smdpkt-data40-cntl { + qcom,smdpkt-remote = "modem"; + qcom,smdpkt-port-name = "DATA40_CNTL"; + qcom,smdpkt-dev-name = "smdcntl8"; + }; + + qcom,smdpkt-apr-apps2 { + qcom,smdpkt-remote = "adsp"; + qcom,smdpkt-port-name = "apr_apps2"; + qcom,smdpkt-dev-name = "apr_apps2"; + }; + + qcom,smdpkt-loopback { + qcom,smdpkt-remote = "modem"; + qcom,smdpkt-port-name = "LOOPBACK"; + qcom,smdpkt-dev-name = "smd_pkt_loopback"; + }; + }; + + qcom,iris-fm { + compatible = "qcom,iris_fm"; + }; + + qcom,wcnss-wlan@0a000000 { + compatible = "qcom,wcnss_wlan"; + reg = <0x0a000000 0x280000>, + <0x0b011008 0x04>, + <0x0a21b000 0x3000>, + <0x03204000 0x00000100>, + <0x03200800 0x00000200>, + <0x0a100400 0x00000200>, + <0x0a205050 0x00000200>, + <0x0a219000 0x00000020>, + <0x0a080488 0x00000008>, + <0x0a080fb0 0x00000008>, + <0x0a08040c 0x00000008>, + <0x0a0120a8 0x00000008>, + <0x0a012448 0x00000008>, + <0x0a080c00 0x00000001>; + + reg-names = "wcnss_mmio", "wcnss_fiq", + "pronto_phy_base", "riva_phy_base", + "riva_ccu_base", "pronto_a2xb_base", + "pronto_ccpu_base", "pronto_saw2_base", + "wlan_tx_phy_aborts","wlan_brdg_err_source", + "wlan_tx_status", "alarms_txctl", + "alarms_tactl", "pronto_mcu_base"; + + interrupts = <0 145 0 0 146 0>; + interrupt-names = "wcnss_wlantx_irq", "wcnss_wlanrx_irq"; + + qcom,pronto-vddmx-supply = <&pm8953_s7_level_ao>; + qcom,pronto-vddcx-supply = <&pm8953_s2_level>; + qcom,pronto-vddpx-supply = <&pm8953_l5>; + qcom,iris-vddxo-supply = <&pm8953_l7>; + qcom,iris-vddrfa-supply = <&pm8953_l19>; + qcom,iris-vddpa-supply = <&pm8953_l9>; + qcom,iris-vdddig-supply = <&pm8953_l5>; + + qcom,iris-vddxo-voltage-level = <1800000 0 1800000>; + qcom,iris-vddrfa-voltage-level = <1300000 0 1300000>; + qcom,iris-vddpa-voltage-level = <3300000 0 3300000>; + qcom,iris-vdddig-voltage-level = <1800000 0 1800000>; + + qcom,vddmx-voltage-level = ; + qcom,vddcx-voltage-level = ; + qcom,vddpx-voltage-level = <1800000 0 1800000>; + + qcom,iris-vddxo-current = <10000>; + qcom,iris-vddrfa-current = <100000>; + qcom,iris-vddpa-current = <515000>; + qcom,iris-vdddig-current = <10000>; + + qcom,pronto-vddmx-current = <0>; + qcom,pronto-vddcx-current = <0>; + qcom,pronto-vddpx-current = <0>; + + pinctrl-names = "wcnss_default", "wcnss_sleep", + "wcnss_gpio_default"; + pinctrl-0 = <&wcnss_default>; + pinctrl-1 = <&wcnss_sleep>; + pinctrl-2 = <&wcnss_gpio_default>; + + gpios = <&tlmm 76 0>, <&tlmm 77 0>, <&tlmm 78 0>, + <&tlmm 79 0>, <&tlmm 80 0>; + + clocks = <&clock_gcc clk_xo_wlan_clk>, + <&clock_gcc clk_rf_clk2>, + <&clock_debug clk_gcc_debug_mux>, + <&clock_gcc clk_wcnss_m_clk>; + + clock-names = "xo", "rf_clk", "measure", "wcnss_debug"; + + qcom,has-autodetect-xo; + qcom,is-pronto-v3; + qcom,has-pronto-hw; + qcom,has-vsys-adc-channel; + qcom,has-a2xb-split-reg; + qcom,wcnss-adc_tm = <&pm8953_adc_tm>; + }; + + qcom_rng: qrng@e3000 { + compatible = "qcom,msm-rng"; + reg = <0xe3000 0x1000>; + qcom,msm-rng-iface-clk; + qcom,no-qrng-config; + qcom,msm-bus,name = "msm-rng-noc"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <1 618 0 0>, /* No vote */ + <1 618 0 800>; /* 100 MB/s */ + clocks = <&clock_gcc clk_gcc_prng_ahb_clk>; + clock-names = "iface_clk"; + }; + + qcom_tzlog: tz-log@08600720 { + compatible = "qcom,tz-log"; + reg = <0x08600720 0x2000>; + }; + + qcom_crypto: qcrypto@720000 { + compatible = "qcom,qcrypto"; + reg = <0x720000 0x20000>, + <0x704000 0x20000>; + reg-names = "crypto-base","crypto-bam-base"; + interrupts = <0 207 0>; + qcom,bam-pipe-pair = <2>; + qcom,ce-hw-instance = <0>; + qcom,ce-device = <0>; + qcom,ce-hw-shared; + qcom,clk-mgmt-sus-res; + qcom,msm-bus,name = "qcrypto-noc"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <55 512 0 0>, + <55 512 393600 393600>; + clocks = <&clock_gcc clk_crypto_clk_src>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>; + clock-names = "core_clk_src", "core_clk", + "iface_clk", "bus_clk"; + qcom,use-sw-aes-cbc-ecb-ctr-algo; + qcom,use-sw-aes-xts-algo; + qcom,use-sw-aes-ccm-algo; + qcom,use-sw-ahash-algo; + qcom,use-sw-hmac-algo; + qcom,use-sw-aead-algo; + qcom,ce-opp-freq = <100000000>; + }; + + qcom_cedev: qcedev@720000 { + compatible = "qcom,qcedev"; + reg = <0x720000 0x20000>, + <0x704000 0x20000>; + reg-names = "crypto-base","crypto-bam-base"; + interrupts = <0 207 0>; + qcom,bam-pipe-pair = <1>; + qcom,ce-hw-instance = <0>; + qcom,ce-device = <0>; + qcom,ce-hw-shared; + qcom,msm-bus,name = "qcedev-noc"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <55 512 0 0>, + <55 512 393600 393600>; + clocks = <&clock_gcc clk_crypto_clk_src>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>; + clock-names = "core_clk_src", "core_clk", + "iface_clk", "bus_clk"; + qcom,ce-opp-freq = <100000000>; + }; + + qcom_seecom: qseecom@84A00000 { + compatible = "qcom,qseecom"; + reg = <0x84A00000 0x1900000>; + reg-names = "secapp-region"; + qcom,hlos-num-ce-hw-instances = <1>; + qcom,hlos-ce-hw-instance = <0>; + qcom,qsee-ce-hw-instance = <0>; + qcom,disk-encrypt-pipe-pair = <2>; + qcom,support-fde; + qcom,msm-bus,name = "qseecom-noc"; + qcom,msm-bus,num-cases = <4>; + qcom,msm-bus,num-paths = <1>; + qcom,support-bus-scaling; + qcom,appsbl-qseecom-support; + qcom,msm-bus,vectors-KBps = + <55 512 0 0>, + <55 512 0 0>, + <55 512 120000 1200000>, + <55 512 393600 3936000>; + clocks = <&clock_gcc clk_crypto_clk_src>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>; + clock-names = "core_clk_src", "core_clk", + "iface_clk", "bus_clk"; + qcom,ce-opp-freq = <100000000>; + }; + + qcom,ipc_router { + compatible = "qcom,ipc_router"; + qcom,node-id = <1>; + }; + + qcom,ipc_router_modem_xprt { + compatible = "qcom,ipc_router_smd_xprt"; + qcom,ch-name = "IPCRTR"; + qcom,xprt-remote = "modem"; + qcom,xprt-linkid = <1>; + qcom,xprt-version = <1>; + qcom,fragmented-data; + qcom,disable-pil-loading; + }; + + qcom,ipc_router_q6_xprt { + compatible = "qcom,ipc_router_smd_xprt"; + qcom,ch-name = "IPCRTR"; + qcom,xprt-remote = "adsp"; + qcom,xprt-linkid = <1>; + qcom,xprt-version = <1>; + qcom,fragmented-data; + }; + + qcom,ipc_router_wcnss_xprt { + compatible = "qcom,ipc_router_smd_xprt"; + qcom,ch-name = "IPCRTR"; + qcom,xprt-remote = "wcnss"; + qcom,xprt-linkid = <1>; + qcom,xprt-version = <1>; + qcom,fragmented-data; + }; + + qcom,adsprpc-mem { + compatible = "qcom,msm-adsprpc-mem-region"; + memory-region = <&adsp_mem>; + }; + + qcom,adsprpc_domains { + compatible = "qcom,msm-fastrpc-legacy-compute-cb"; + qcom,msm_fastrpc_compute_cb { + qcom,adsp-shared-phandle = <&adsp_shared>; + qcom,adsp-shared-sids = + <0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf>; + qcom,virtual-addr-pool = <0x80000000 0x7FFFFFFF>; + }; + }; + + sdcc1_ice: sdcc1ice@7803000 { + compatible = "qcom,ice"; + reg = <0x7803000 0x8000>; + interrupt-names = "sdcc_ice_nonsec_level_irq", + "sdcc_ice_sec_level_irq"; + interrupts = <0 312 0>, <0 313 0>; + qcom,enable-ice-clk; + clock-names = "ice_core_clk_src", "ice_core_clk", + "bus_clk", "iface_clk"; + clocks = <&clock_gcc clk_sdcc1_ice_core_clk_src>, + <&clock_gcc clk_gcc_sdcc1_ice_core_clk>, + <&clock_gcc clk_gcc_sdcc1_apps_clk>, + <&clock_gcc clk_gcc_sdcc1_ahb_clk>; + qcom,op-freq-hz = <270000000>, <0>, <0>, <0>; + qcom,msm-bus,name = "sdcc_ice_noc"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <78 512 0 0>, /* No vote */ + <78 512 1000 0>; /* Max. bandwidth */ + qcom,bus-vector-names = "MIN", "MAX"; + qcom,instance-type = "sdcc"; + }; + + sdhc_1: sdhci@7824900 { + compatible = "qcom,sdhci-msm"; + reg = <0x7824900 0x500>, <0x7824000 0x800>, <0x7824e00 0x200>; + reg-names = "hc_mem", "core_mem", "cmdq_mem"; + + interrupts = <0 123 0>, <0 138 0>; + interrupt-names = "hc_irq", "pwr_irq"; + + sdhc-msm-crypto = <&sdcc1_ice>; + qcom,bus-width = <8>; + + qcom,devfreq,freq-table = <50000000 200000000>; + + qcom,pm-qos-irq-type = "affine_irq"; + qcom,pm-qos-irq-latency = <2 213>; + + qcom,pm-qos-cpu-groups = <0x0f 0xf0>; + qcom,pm-qos-cmdq-latency-us = <2 213>, <2 213>; + + qcom,pm-qos-legacy-latency-us = <2 213>, <2 213>; + + qcom,msm-bus,name = "sdhc1"; + qcom,msm-bus,num-cases = <9>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = <78 512 0 0>, /* No vote */ + <78 512 1046 3200>, /* 400 KB/s*/ + <78 512 52286 160000>, /* 20 MB/s */ + <78 512 65360 200000>, /* 25 MB/s */ + <78 512 130718 400000>, /* 50 MB/s */ + <78 512 130718 400000>, /* 100 MB/s */ + <78 512 261438 800000>, /* 200 MB/s */ + <78 512 261438 800000>, /* 400 MB/s */ + <78 512 1338562 4096000>; /* Max. bandwidth */ + qcom,bus-bw-vectors-bps = <0 400000 20000000 25000000 50000000 + 100000000 200000000 400000000 4294967295>; + + clocks = <&clock_gcc clk_gcc_sdcc1_ahb_clk>, + <&clock_gcc clk_gcc_sdcc1_apps_clk>, + <&clock_gcc clk_gcc_sdcc1_ice_core_clk>; + clock-names = "iface_clk", "core_clk", "ice_core_clk"; + qcom,ice-clk-rates = <270000000 160000000>; + qcom,large-address-bus; + + status = "disabled"; + }; + + sdhc_2: sdhci@7864900 { + compatible = "qcom,sdhci-msm"; + reg = <0x7864900 0x500>, <0x7864000 0x800>; + reg-names = "hc_mem", "core_mem"; + + interrupts = <0 125 0>, <0 221 0>; + interrupt-names = "hc_irq", "pwr_irq"; + + qcom,bus-width = <4>; + + qcom,pm-qos-irq-type = "affine_irq"; + qcom,pm-qos-irq-latency = <2 213>; + + qcom,pm-qos-cpu-groups = <0x0f 0xf0>; + qcom,pm-qos-legacy-latency-us = <2 213>, <2 213>; + + qcom,devfreq,freq-table = <50000000 200000000>; + + qcom,msm-bus,name = "sdhc2"; + qcom,msm-bus,num-cases = <8>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = <81 512 0 0>, /* No vote */ + <81 512 1046 3200>, /* 400 KB/s*/ + <81 512 52286 160000>, /* 20 MB/s */ + <81 512 65360 200000>, /* 25 MB/s */ + <81 512 130718 400000>, /* 50 MB/s */ + <81 512 261438 800000>, /* 100 MB/s */ + <81 512 261438 800000>, /* 200 MB/s */ + <81 512 1338562 4096000>; /* Max. bandwidth */ + qcom,bus-bw-vectors-bps = <0 400000 20000000 25000000 50000000 + 100000000 200000000 4294967295>; + + clocks = <&clock_gcc clk_gcc_sdcc2_ahb_clk>, + <&clock_gcc clk_gcc_sdcc2_apps_clk>; + clock-names = "iface_clk", "core_clk"; + + qcom,large-address-bus; + status = "disabled"; + }; + + spmi_bus: qcom,spmi@200f000 { + compatible = "qcom,spmi-pmic-arb"; + reg = <0x200f000 0x1000>, + <0x2400000 0x800000>, + <0x2c00000 0x800000>, + <0x3800000 0x200000>, + <0x200a000 0x2100>; + reg-names = "core", "chnls", "obsrvr", "intr", "cnfg"; + interrupts = <0 190 0>; + qcom,pmic-arb-channel = <0>; + qcom,pmic-arb-max-peripherals = <256>; + qcom,pmic-arb-max-periph-interrupts = <256>; + qcom,pmic-arb-ee = <0>; + #interrupt-cells = <3>; + interrupt-controller; + #address-cells = <1>; + #size-cells = <0>; + cell-index = <0>; + }; + + qcom,memshare { + compatible = "qcom,memshare"; + + qcom,client_1 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x200000>; + qcom,client-id = <0>; + qcom,allocate-boot-time; + label = "modem"; + }; + + qcom,client_2 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x300000>; + qcom,client-id = <2>; + label = "modem"; + }; + + qcom,client_3 { + compatible = "qcom,memshare-peripheral"; + qcom,peripheral-size = <0x0>; + qcom,client-id = <1>; + label = "modem"; + }; + }; + + qcom,mss@4080000 { + compatible = "qcom,pil-q6v55-mss"; + reg = <0x04080000 0x100>, + <0x0194f000 0x010>, + <0x01950000 0x008>, + <0x01951000 0x008>, + <0x04020000 0x040>, + <0x01871000 0x004>; + reg-names = "qdsp6_base", "halt_q6", "halt_modem", "halt_nc", + "rmb_base", "restart_reg"; + + interrupts = <0 24 1>; + vdd_mss-supply = <&pm8953_s1>; + vdd_cx-supply = <&pm8953_s2_level>; + vdd_cx-voltage = ; + vdd_mx-supply = <&pm8953_s7_level_ao>; + vdd_mx-uV = ; + vdd_pll-supply = <&pm8953_l7>; + qcom,vdd_pll = <1800000>; + + clocks = <&clock_gcc clk_xo_pil_mss_clk>, + <&clock_gcc clk_gcc_mss_cfg_ahb_clk>, + <&clock_gcc clk_gcc_mss_q6_bimc_axi_clk>, + <&clock_gcc clk_gcc_boot_rom_ahb_clk>; + clock-names = "xo", "iface_clk", "bus_clk", "mem_clk"; + qcom,proxy-clock-names = "xo"; + qcom,active-clock-names = "iface_clk", "bus_clk", "mem_clk"; + + qcom,pas-id = <5>; + qcom,pil-mss-memsetup; + qcom,firmware-name = "modem"; + qcom,pil-self-auth; + qcom,sysmon-id = <0>; + qcom,ssctl-instance-id = <0x12>; + qcom,qdsp6v56-1-10; + + /* GPIO inputs from mss */ + qcom,gpio-err-fatal = <&smp2pgpio_ssr_smp2p_1_in 0 0>; + qcom,gpio-err-ready = <&smp2pgpio_ssr_smp2p_1_in 1 0>; + qcom,gpio-proxy-unvote = <&smp2pgpio_ssr_smp2p_1_in 2 0>; + qcom,gpio-stop-ack = <&smp2pgpio_ssr_smp2p_1_in 3 0>; + qcom,gpio-shutdown-ack = <&smp2pgpio_ssr_smp2p_1_in 7 0>; + + /* GPIO output to mss */ + qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_1_out 0 0>; + memory-region = <&modem_mem>; + }; + + qcom,lpass@c200000 { + compatible = "qcom,pil-tz-generic"; + reg = <0xc200000 0x00100>; + interrupts = <0 293 1>; + + vdd_cx-supply = <&pm8953_s2_level>; + qcom,proxy-reg-names = "vdd_cx"; + qcom,vdd_cx-uV-uA = ; + + clocks = <&clock_gcc clk_xo_pil_lpass_clk>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>, + <&clock_gcc clk_crypto_clk_src>; + clock-names = "xo", "scm_core_clk", "scm_iface_clk", + "scm_bus_clk", "scm_core_clk_src"; + qcom,proxy-clock-names = "xo", "scm_core_clk", "scm_iface_clk", + "scm_bus_clk", "scm_core_clk_src"; + qcom,scm_core_clk_src-freq = <80000000>; + + qcom,pas-id = <1>; + qcom,complete-ramdump; + qcom,proxy-timeout-ms = <10000>; + qcom,smem-id = <423>; + qcom,sysmon-id = <1>; + qcom,ssctl-instance-id = <0x14>; + qcom,firmware-name = "adsp"; + + /* GPIO inputs from lpass */ + qcom,gpio-err-fatal = <&smp2pgpio_ssr_smp2p_2_in 0 0>; + qcom,gpio-proxy-unvote = <&smp2pgpio_ssr_smp2p_2_in 2 0>; + qcom,gpio-err-ready = <&smp2pgpio_ssr_smp2p_2_in 1 0>; + qcom,gpio-stop-ack = <&smp2pgpio_ssr_smp2p_2_in 3 0>; + + /* GPIO output to lpass */ + qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_2_out 0 0>; + + memory-region = <&adsp_fw_mem>; + }; + + qcom,venus@1de0000 { + compatible = "qcom,pil-tz-generic"; + reg = <0x1de0000 0x4000>; + + vdd-supply = <&gdsc_venus>; + qcom,proxy-reg-names = "vdd"; + + clocks = <&clock_gcc clk_gcc_venus0_vcodec0_clk>, + <&clock_gcc clk_gcc_venus0_ahb_clk>, + <&clock_gcc clk_gcc_venus0_axi_clk>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>, + <&clock_gcc clk_crypto_clk_src>; + + clock-names = "core_clk", "iface_clk", "bus_clk", + "scm_core_clk", "scm_iface_clk", + "scm_bus_clk", "scm_core_clk_src"; + + qcom,proxy-clock-names = "core_clk", "iface_clk", + "bus_clk", "scm_core_clk", + "scm_iface_clk", "scm_bus_clk", + "scm_core_clk_src"; + qcom,scm_core_clk_src-freq = <80000000>; + + qcom,msm-bus,name = "pil-venus"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <63 512 0 0>, + <63 512 0 304000>; + + qcom,pas-id = <9>; + qcom,proxy-timeout-ms = <100>; + qcom,firmware-name = "venus"; + memory-region = <&venus_mem>; + }; + + qcom,msm-ssc-sensors { + compatible = "qcom,msm-ssc-sensors"; + }; + + qcom,pronto@a21b000 { + compatible = "qcom,pil-tz-generic"; + reg = <0x0a21b000 0x3000>; + interrupts = <0 149 1>; + + vdd_pronto_pll-supply = <&pm8953_l7>; + proxy-reg-names = "vdd_pronto_pll"; + vdd_pronto_pll-uV-uA = <1800000 18000>; + clocks = <&clock_gcc clk_xo_pil_pronto_clk>, + <&clock_gcc clk_gcc_crypto_clk>, + <&clock_gcc clk_gcc_crypto_ahb_clk>, + <&clock_gcc clk_gcc_crypto_axi_clk>, + <&clock_gcc clk_crypto_clk_src>; + + clock-names = "xo", "scm_core_clk", "scm_iface_clk", + "scm_bus_clk", "scm_core_clk_src"; + qcom,proxy-clock-names = "xo", "scm_core_clk", "scm_iface_clk", + "scm_bus_clk", "scm_core_clk_src"; + qcom,scm_core_clk_src = <80000000>; + + qcom,pas-id = <6>; + qcom,proxy-timeout-ms = <10000>; + qcom,smem-id = <422>; + qcom,sysmon-id = <6>; + qcom,ssctl-instance-id = <0x13>; + qcom,firmware-name = "wcnss"; + + /* GPIO inputs from wcnss */ + qcom,gpio-err-fatal = <&smp2pgpio_ssr_smp2p_4_in 0 0>; + qcom,gpio-err-ready = <&smp2pgpio_ssr_smp2p_4_in 1 0>; + qcom,gpio-proxy-unvote = <&smp2pgpio_ssr_smp2p_4_in 2 0>; + qcom,gpio-stop-ack = <&smp2pgpio_ssr_smp2p_4_in 3 0>; + + /* GPIO output to wcnss */ + qcom,gpio-force-stop = <&smp2pgpio_ssr_smp2p_4_out 0 0>; + memory-region = <&wcnss_fw_mem>; + }; + + usb3: ssusb@7000000{ + compatible = "qcom,dwc-usb3-msm"; + reg = <0x07000000 0xfc000>, + <0x0007e000 0x400>; + reg-names = "core_base", + "ahb2phy_base"; + #address-cells = <1>; + #size-cells = <1>; + ranges; + + interrupts = <0 136 0>, <0 220 0>, <0 134 0>; + interrupt-names = "hs_phy_irq", "ss_phy_irq", "pwr_event_irq"; + + USB3_GDSC-supply = <&gdsc_usb30>; + vbus_dwc3-supply = <&smbcharger_charger_otg>; + qcom,usb-dbm = <&dbm_1p5>; + qcom,msm-bus,name = "usb3"; + qcom,msm-bus,num-cases = <2>; + qcom,msm-bus,num-paths = <1>; + qcom,msm-bus,vectors-KBps = + <61 512 0 0>, + <61 512 240000 800000>; + + qcom,dwc-usb3-msm-tx-fifo-size = <21288>; + + clocks = <&clock_gcc clk_gcc_usb30_master_clk>, + <&clock_gcc clk_gcc_pcnoc_usb3_axi_clk>, + <&clock_gcc clk_gcc_usb30_mock_utmi_clk>, + <&clock_gcc clk_gcc_usb30_sleep_clk>, + <&clock_gcc clk_xo_dwc3_clk>, + <&clock_gcc clk_gcc_usb_phy_cfg_ahb_clk>; + + clock-names = "core_clk", "iface_clk", "utmi_clk", + "sleep_clk", "xo", "cfg_ahb_clk"; + + dwc3@7000000 { + compatible = "snps,dwc3"; + reg = <0x07000000 0xc8d0>; + interrupt-parent = <&intc>; + interrupts = <0 140 0>; + usb-phy = <&qusb_phy>, <&ssphy>; + tx-fifo-resize; + snps,usb3-u1u2-disable; + snps,nominal-elastic-buffer; + snps,is-utmi-l1-suspend; + snps,hird-threshold = /bits/ 8 <0x0>; + }; + + qcom,usbbam@7104000 { + compatible = "qcom,usb-bam-msm"; + reg = <0x07104000 0x1a934>; + interrupt-parent = <&intc>; + interrupts = <0 135 0>; + + qcom,bam-type = <0>; + qcom,usb-bam-fifo-baseaddr = <0x08605000>; + qcom,usb-bam-num-pipes = <8>; + qcom,ignore-core-reset-ack; + qcom,disable-clk-gating; + qcom,usb-bam-override-threshold = <0x4001>; + qcom,usb-bam-max-mbps-highspeed = <400>; + qcom,usb-bam-max-mbps-superspeed = <3600>; + qcom,reset-bam-on-connect; + + qcom,pipe0 { + label = "ssusb-ipa-out-0"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <0>; + qcom,pipe-num = <0>; + qcom,peer-bam = <1>; + qcom,src-bam-pipe-index = <1>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + + qcom,pipe1 { + label = "ssusb-ipa-in-0"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <1>; + qcom,pipe-num = <0>; + qcom,peer-bam = <1>; + qcom,dst-bam-pipe-index = <0>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + + qcom,pipe2 { + label = "ssusb-qdss-in-0"; + qcom,usb-bam-mem-type = <2>; + qcom,dir = <1>; + qcom,pipe-num = <0>; + qcom,peer-bam = <0>; + qcom,peer-bam-physical-address = <0x06044000>; + qcom,src-bam-pipe-index = <0>; + qcom,dst-bam-pipe-index = <2>; + qcom,data-fifo-offset = <0x0>; + qcom,data-fifo-size = <0xe00>; + qcom,descriptor-fifo-offset = <0xe00>; + qcom,descriptor-fifo-size = <0x200>; + }; + + qcom,pipe3 { + label = "ssusb-dpl-ipa-in-1"; + qcom,usb-bam-mem-type = <1>; + qcom,dir = <1>; + qcom,pipe-num = <1>; + qcom,peer-bam = <1>; + qcom,dst-bam-pipe-index = <2>; + qcom,data-fifo-size = <0x8000>; + qcom,descriptor-fifo-size = <0x2000>; + }; + }; + }; + + qusb_phy: qusb@79000 { + compatible = "qcom,qusb2phy"; + reg = <0x079000 0x180>, + <0x070f8800 0x400>, + <0x01841030 0x4>, + <0x0193f044 0x4>, + <0x0193f020 0x4>; + reg-names = "qusb_phy_base", + "qscratch_base", + "ref_clk_addr", + "tcsr_phy_clk_scheme_sel", + "tcsr_phy_level_shift_keeper"; + + USB3_GDSC-supply = <&gdsc_usb30>; + vdd-supply = <&pm8953_l3>; + vdda18-supply = <&pm8953_l7>; + vdda33-supply = <&pm8953_l13>; + qcom,vdd-voltage-level = <0 925000 925000>; + + qcom,qusb-phy-init-seq = <0xF8 0x80 + 0x73 0x84 + 0x83 0x88 + 0xC7 0x8C + 0x14 0x9C + 0x30 0x08 + 0x79 0x0C + 0x21 0x10 + 0x00 0x90 + 0x9F 0x1C + 0x00 0x18>; + phy_type= "utmi"; + + clocks = <&clock_gcc clk_bb_clk1>, + <&clock_gcc clk_gcc_qusb_ref_clk>, + <&clock_gcc clk_gcc_usb_phy_cfg_ahb_clk>, + <&clock_gcc clk_gcc_qusb2_phy_reset>, + <&clock_gcc clk_gcc_pcnoc_usb3_axi_clk>, + <&clock_gcc clk_gcc_usb30_master_clk>; + + clock-names = "ref_clk_src", "ref_clk", "cfg_ahb_clk", + "phy_reset", "iface_clk", "core_clk"; + + }; + + usb_nop_phy: usb_nop_phy { + status = "disabled"; + compatible = "usb-nop-xceiv"; + }; + + + ssphy: ssphy@78000 { + compatible = "qcom,usb-ssphy-qmp"; + reg = <0x78000 0x9f8>, + <0x0193f244 0x4>, + <0x0193f044 0x4>; + reg-names = "qmp_phy_base", + "vls_clamp_reg", + "tcsr_phy_clk_scheme_sel"; + qcom,qmp-phy-init-seq = <0xac 0x14 0x1a 0x00 + 0x34 0x08 0x08 0x00 + 0x174 0x30 0x30 0x00 + 0x3c 0x06 0x06 0x00 + 0xb4 0x00 0x00 0x00 + 0xb8 0x08 0x08 0x00 + 0x194 0x06 0x06 0x3e8 + 0x19c 0x01 0x01 0x00 + 0x178 0x00 0x00 0x00 + 0xd0 0x82 0x82 0x00 + 0xdc 0x55 0x55 0x00 + 0xe0 0x55 0x55 0x00 + 0xe4 0x03 0x03 0x00 + 0x78 0x0b 0x0b 0x00 + 0x84 0x16 0x16 0x00 + 0x90 0x28 0x28 0x00 + 0x108 0x80 0x80 0x00 + 0x10c 0x00 0x00 0x00 + 0x184 0x0a 0x0a 0x00 + 0x4c 0x15 0x15 0x00 + 0x50 0x34 0x34 0x00 + 0x54 0x00 0x00 0x00 + 0xc8 0x00 0x00 0x00 + 0x18c 0x00 0x00 0x00 + 0xcc 0x00 0x00 0x00 + 0x128 0x00 0x00 0x00 + 0x0c 0x0a 0x0a 0x00 + 0x10 0x01 0x01 0x00 + 0x1c 0x31 0x31 0x00 + 0x20 0x01 0x01 0x00 + 0x14 0x00 0x00 0x00 + 0x18 0x00 0x00 0x00 + 0x24 0xde 0xde 0x00 + 0x28 0x07 0x07 0x00 + 0x48 0x0f 0x0f 0x00 + 0x70 0x0f 0x0f 0x00 + 0x100 0x80 0x80 0x00 + 0x440 0x0b 0x0b 0x00 + 0x4d8 0x02 0x02 0x00 + 0x4dc 0x6c 0x6c 0x00 + 0x4e0 0xbb 0xbb 0x00 + 0x508 0x77 0x77 0x00 + 0x50c 0x80 0x80 0x00 + 0x514 0x03 0x03 0x00 + 0x51c 0x16 0x16 0x00 + 0x448 0x75 0x75 0x00 + 0x454 0x00 0x00 0x00 + 0x40c 0x0a 0x0a 0x00 + 0x41c 0x06 0x06 0x00 + 0x510 0x00 0x00 0x00 + 0x268 0x45 0x45 0x00 + 0x2ac 0x12 0x12 0x00 + 0x294 0x06 0x06 0x00 + 0x254 0x00 0x00 0x00 + 0x8c8 0x83 0x83 0x00 + 0x8c4 0x02 0x02 0x00 + 0x8cc 0x09 0x09 0x00 + 0x8d0 0xa2 0xa2 0x00 + 0x8d4 0x85 0x85 0x00 + 0x880 0xd1 0xd1 0x00 + 0x884 0x1f 0x1f 0x00 + 0x888 0x47 0x47 0x00 + 0x80c 0x9f 0x9f 0x00 + 0x824 0x17 0x17 0x00 + 0x828 0x0f 0x0f 0x00 + 0x8b8 0x75 0x75 0x00 + 0x8bc 0x13 0x13 0x00 + 0x8b0 0x86 0x86 0x00 + 0x8a0 0x04 0x04 0x00 + 0x88c 0x44 0x44 0x00 + 0x870 0xe7 0xe7 0x00 + 0x874 0x03 0x03 0x00 + 0x878 0x40 0x40 0x00 + 0x87c 0x00 0x00 0x00 + 0x9d8 0x88 0x88 0x00 + 0xffffffff 0xffffffff 0x00 0x00>; + qcom,qmp-phy-reg-offset = <0x988 0x98c 0x990 0x994 + 0x974 0x8d8 0x8dc 0x804 0x800 + 0x808>; + vdd-supply = <&pm8953_l3>; + vdda18-supply = <&pm8953_l7>; + qcom,vdd-voltage-level = <0 925000 925000>; + qcom,vbus-valid-override; + + clocks = <&clock_gcc clk_gcc_usb3_aux_clk>, + <&clock_gcc clk_gcc_usb3_pipe_clk>, + <&clock_gcc clk_gcc_usb_phy_cfg_ahb_clk>, + <&clock_gcc clk_gcc_usb3_phy_reset>, + <&clock_gcc clk_gcc_usb3phy_phy_reset>, + <&clock_gcc clk_bb_clk1>, + <&clock_gcc clk_gcc_usb_ss_ref_clk>; + + clock-names = "aux_clk", "pipe_clk", "cfg_ahb_clk", "phy_reset", + "phy_phy_reset", "ref_clk_src", "ref_clk"; + + }; + + usb_audio_qmi_dev { + compatible = "qcom,usb-audio-qmi-dev"; + qcom,usb-audio-intr-num = <2>; + }; + + dbm_1p5: dbm@70f8000 { + compatible = "qcom,usb-dbm-1p5"; + reg = <0x070f8000 0x300>; + qcom,reset-ep-after-lpm-resume; + }; + + android_usb@86000c8 { + compatible = "qcom,android-usb"; + reg = <0x086000c8 0xc8>; + qcom,pm-qos-latency = <2 213 11028>; + }; +}; + +#include "msm-pm8953-rpm-regulator.dtsi" +#include "msm-pm8953.dtsi" +#include "msm8953-regulator.dtsi" +#include "msm-pmi8940.dtsi" +#include "msm-audio.dtsi" +#include "msm8953-audio_rosy.dtsi" +#include "msm-gdsc-8916.dtsi" +#include "msm8953-camera.dtsi" +#include "msm8953-mdss.dtsi" +#include "msm8953-mdss-pll.dtsi" + +&gdsc_venus { + clock-names = "bus_clk", "core_clk"; + clocks = <&clock_gcc clk_gcc_venus0_axi_clk>, + <&clock_gcc clk_gcc_venus0_vcodec0_clk>; + status = "okay"; +}; + +&gdsc_venus_core0 { + qcom,support-hw-trigger; + clock-names ="core0_clk"; + clocks = <&clock_gcc clk_gcc_venus0_core0_vcodec0_clk>; + status = "okay"; +}; + +&gdsc_mdss { + clock-names = "core_clk", "bus_clk"; + clocks = <&clock_gcc clk_gcc_mdss_mdp_clk>, + <&clock_gcc clk_gcc_mdss_axi_clk>; + proxy-supply = <&gdsc_mdss>; + qcom,proxy-consumer-enable; + status = "okay"; +}; + +&gdsc_oxili_gx { + clock-names = "core_root_clk"; + clocks =<&clock_gcc_gfx clk_gfx3d_clk_src>; + qcom,force-enable-root-clk; + parent-supply = <&gfx_vreg_corner>; + status = "okay"; +}; + +&gdsc_jpeg { + clock-names = "core_clk", "bus_clk"; + clocks = <&clock_gcc clk_gcc_camss_jpeg0_clk>, + <&clock_gcc clk_gcc_camss_jpeg_axi_clk>; + status = "okay"; +}; + +&gdsc_vfe { + clock-names = "core_clk", "bus_clk", "micro_clk", + "csi_clk"; + clocks = <&clock_gcc clk_gcc_camss_vfe0_clk>, + <&clock_gcc clk_gcc_camss_vfe_axi_clk>, + <&clock_gcc clk_gcc_camss_micro_ahb_clk>, + <&clock_gcc clk_gcc_camss_csi_vfe0_clk>; + status = "okay"; +}; + +&gdsc_vfe1 { + clock-names = "core_clk", "bus_clk", "micro_clk", + "csi_clk"; + clocks = <&clock_gcc clk_gcc_camss_vfe1_clk>, + <&clock_gcc clk_gcc_camss_vfe1_axi_clk>, + <&clock_gcc clk_gcc_camss_micro_ahb_clk>, + <&clock_gcc clk_gcc_camss_csi_vfe1_clk>; + status = "okay"; +}; + +&gdsc_cpp { + clock-names = "core_clk", "bus_clk"; + clocks = <&clock_gcc clk_gcc_camss_cpp_clk>, + <&clock_gcc clk_gcc_camss_cpp_axi_clk>; + status = "okay"; +}; + +&gdsc_oxili_cx { + clock-names = "core_clk"; + clocks = <&clock_gcc_gfx clk_gcc_oxili_gfx3d_clk>; + status = "okay"; +}; + +&gdsc_usb30 { + status = "okay"; +}; + +&pm8953_mpps { + mpp@a100 { + /* MPP2 - PA_THERM config */ + qcom,mode = <4>; /* AIN input */ + qcom,invert = <1>; /* Enable MPP */ + qcom,ain-route = <1>; /* AMUX 6 */ + qcom,master-en = <1>; + qcom,src-sel = <0>; /* Function constant */ + }; + + mpp@a300 { + /* MPP4 - CASE_THERM config */ + qcom,mode = <4>; /* AIN input */ + qcom,invert = <1>; /* Enable MPP */ + qcom,ain-route = <3>; /* AMUX 8 */ + qcom,master-en = <1>; + qcom,src-sel = <0>; /* Function constant */ + }; +}; + +&pm8953_vadc { + chan@5 { + label = "vcoin"; + reg = <5>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <1>; + qcom,calibration-type = "absolute"; + qcom,scale-function = <0>; + qcom,hw-settle-time = <0>; + qcom,fast-avg-setup = <0>; + }; + + chan@7 { + label = "vph_pwr"; + reg = <7>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <1>; + qcom,calibration-type = "absolute"; + qcom,scale-function = <0>; + qcom,hw-settle-time = <0>; + qcom,fast-avg-setup = <0>; + }; + + chan@36 { + label = "pa_therm0"; + reg = <0x36>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <2>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + }; + + chan@11 { + label = "pa_therm1"; + reg = <0x11>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <2>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + qcom,vadc-thermal-node; + }; + + chan@32 { + label = "xo_therm"; + reg = <0x32>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <4>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + qcom,vadc-thermal-node; + }; + + chan@3c { + label = "xo_therm_buf"; + reg = <0x3c>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <4>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + qcom,vadc-thermal-node; + }; + + chan@13 { + label = "case_therm"; + reg = <0x13>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <2>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + qcom,vadc-thermal-node; + }; +}; + +&pm8953_adc_tm { + chan@36 { + label = "pa_therm0"; + reg = <0x36>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <0>; + qcom,calibration-type = "ratiometric"; + qcom,scale-function = <2>; + qcom,hw-settle-time = <2>; + qcom,fast-avg-setup = <0>; + qcom,btm-channel-number = <0x48>; + qcom,thermal-node; + }; + + chan@7 { + label = "vph_pwr"; + reg = <0x7>; + qcom,decimation = <0>; + qcom,pre-div-channel-scaling = <1>; + qcom,calibration-type = "absolute"; + qcom,scale-function = <0>; + qcom,hw-settle-time = <0>; + qcom,fast-avg-setup = <0>; + qcom,btm-channel-number = <0x68>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/msm8996-camera.dtsi b/arch/arm/boot/dts/qcom/msm8996-camera.dtsi index 3e1a8891dfc60..e4960d0580ea7 100644 --- a/arch/arm/boot/dts/qcom/msm8996-camera.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-camera.dtsi @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-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 @@ -28,18 +28,24 @@ reg-names = "csiphy", "csiphy_clk_mux"; interrupts = <0 78 0>; interrupt-names = "csiphy"; - clocks = <&clock_mmss clk_camss_top_ahb_clk>, + qcom,csi-vdd-voltage = <1250000>; + qcom,mipi-csi-vdd-supply = <&pm8994_l2>; + mmagic-supply = <&gdsc_mmagic_camss>; + gdscr-supply = <&gdsc_camss_top>; + qcom,cam-vreg-name = "mmagic", "gdscr"; + clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>, + <&clock_mmss clk_camss_top_ahb_clk>, <&clock_mmss clk_camss_ispif_ahb_clk>, <&clock_mmss clk_csi0phytimer_clk_src>, <&clock_mmss clk_camss_csi0phytimer_clk>, <&clock_mmss clk_camss_ahb_clk>, <&clock_mmss clk_csiphy0_3p_clk_src>, <&clock_mmss clk_camss_csiphy0_3p_clk>; - clock-names = "camss_top_ahb_clk", + clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", "camss_ahb_clk", "csiphy_3p_clk_src", "csi_phy_3p_clk"; - qcom,clock-rates = <0 0 200000000 0 0 100000000 0>; + qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>; }; qcom,csiphy@a35000 { @@ -49,18 +55,24 @@ reg-names = "csiphy", "csiphy_clk_mux"; interrupts = <0 79 0>; interrupt-names = "csiphy"; - clocks = <&clock_mmss clk_camss_top_ahb_clk>, + qcom,csi-vdd-voltage = <1250000>; + qcom,mipi-csi-vdd-supply = <&pm8994_l2>; + mmagic-supply = <&gdsc_mmagic_camss>; + gdscr-supply = <&gdsc_camss_top>; + qcom,cam-vreg-name = "mmagic", "gdscr"; + clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>, + <&clock_mmss clk_camss_top_ahb_clk>, <&clock_mmss clk_camss_ispif_ahb_clk>, <&clock_mmss clk_csi1phytimer_clk_src>, <&clock_mmss clk_camss_csi1phytimer_clk>, <&clock_mmss clk_camss_ahb_clk>, <&clock_mmss clk_csiphy1_3p_clk_src>, <&clock_mmss clk_camss_csiphy1_3p_clk>; - clock-names = "camss_top_ahb_clk", + clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", "camss_ahb_clk", "csiphy_3p_clk_src", "csi_phy_3p_clk"; - qcom,clock-rates = <0 0 200000000 0 0 100000000 0>; + qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>; }; qcom,csiphy@a36000 { @@ -70,18 +82,24 @@ reg-names = "csiphy", "csiphy_clk_mux"; interrupts = <0 80 0>; interrupt-names = "csiphy"; - clocks = <&clock_mmss clk_camss_top_ahb_clk>, + qcom,csi-vdd-voltage = <1250000>; + qcom,mipi-csi-vdd-supply = <&pm8994_l2>; + mmagic-supply = <&gdsc_mmagic_camss>; + gdscr-supply = <&gdsc_camss_top>; + qcom,cam-vreg-name = "mmagic", "gdscr"; + clocks = <&clock_mmss clk_mmss_mmagic_ahb_clk>, + <&clock_mmss clk_camss_top_ahb_clk>, <&clock_mmss clk_camss_ispif_ahb_clk>, <&clock_mmss clk_csi2phytimer_clk_src>, <&clock_mmss clk_camss_csi2phytimer_clk>, <&clock_mmss clk_camss_ahb_clk>, <&clock_mmss clk_csiphy2_3p_clk_src>, <&clock_mmss clk_camss_csiphy2_3p_clk>; - clock-names = "camss_top_ahb_clk", + clock-names = "mmagic_ahb_clk", "camss_top_ahb_clk", "ispif_ahb_clk", "csiphy_timer_src_clk", "csiphy_timer_clk", "camss_ahb_clk", "csiphy_3p_clk_src", "csi_phy_3p_clk"; - qcom,clock-rates = <0 0 200000000 0 0 100000000 0>; + qcom,clock-rates = <0 0 0 200000000 0 0 100000000 0>; }; qcom,csid@a30000 { diff --git a/arch/arm/boot/dts/qcom/msm8996-gpu.dtsi b/arch/arm/boot/dts/qcom/msm8996-gpu.dtsi index 07423a601b35c..868c5eea1fdb7 100644 --- a/arch/arm/boot/dts/qcom/msm8996-gpu.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-gpu.dtsi @@ -81,6 +81,7 @@ qcom,gpu-qdss-stm = <0x081c0000 0x40000>; // base addr, size + qcom,tsens-name = "tsens_tz_sensor14"; /* Trace bus */ coresight-id = <300>; coresight-name = "coresight-gfx"; diff --git a/arch/arm/boot/dts/qcom/msm8996-ion.dtsi b/arch/arm/boot/dts/qcom/msm8996-ion.dtsi index 6b64e9b8976ad..9b287e3f23c5d 100644 --- a/arch/arm/boot/dts/qcom/msm8996-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-ion.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, 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 @@ -21,11 +21,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - system_contig_heap: qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@22 { /* ADSP HEAP */ reg = <22>; memory-region = <&adsp_mem>; diff --git a/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi b/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi index 6a20dac8e3f73..55a37c2798eb5 100644 --- a/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-regulator.dtsi @@ -623,15 +623,18 @@ qcom,cpr-pd-bypass-mask = <0x07>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <16 13>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <16 13 16>; qcom,cpr-corners = /* Speed bin 0 */ <16 16 16 16 16 16 16 16>, /* Speed bin 1 */ - <13 13 13 13 13 13 13 13>; + <13 13 13 13 13 13 13 13>, + + /* Speed bin 2 */ + <16 16 16 16 16 16 16 16>; qcom,ldo-min-headroom-voltage = <150000>; qcom,ldo-max-headroom-voltage = <470000>; @@ -643,7 +646,10 @@ <1 2 7 12 16>, /* Speed bin 1 */ - <1 2 7 12 13>; + <1 2 7 12 13>, + + /* Speed bin 2 */ + <1 2 7 12 16>; qcom,cpr-voltage-ceiling = /* Speed bin 0 */ @@ -655,7 +661,13 @@ /* Speed bin 1 */ <670000 670000 745000 745000 745000 745000 745000 905000 905000 905000 - 905000 905000 1140000>; + 905000 905000 1140000>, + + /* Speed bin 2 */ + <670000 670000 745000 745000 745000 + 745000 745000 905000 905000 905000 + 905000 905000 1140000 1140000 1140000 + 1140000>; qcom,cpr-voltage-floor = /* Speed bin 0 */ @@ -716,7 +728,41 @@ 470000 470000 470000>, <470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 - 470000 470000 470000>; + 470000 470000 470000>, + + /* Speed bin 2 */ + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000>; qcom,cpr-floor-to-ceiling-max-range = /* Speed bin 0 */ @@ -728,7 +774,13 @@ /* Speed bin 1 */ <50000 50000 80000 80000 80000 80000 80000 80000 80000 80000 - 80000 80000 80000>; + 80000 80000 80000>, + + /* Speed bin 2 */ + <50000 50000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000>; qcom,corner-frequencies = /* Speed bin 0 */ @@ -744,7 +796,15 @@ 556800000 652800000 729600000 844800000 960000000 1036800000 1113600000 1190400000 1228800000 - 1363200000>; + 1363200000>, + + /* Speed bin 2 */ + <307200000 422400000 480000000 + 556800000 652800000 729600000 + 844800000 960000000 1036800000 + 1113600000 1190400000 1228800000 + 1324800000 1401600000 1478400000 + 1593600000>; qcom,cpr-ro-scaling-factor = < 0 0 3112 2666 2947 2543 2271 1979 @@ -777,6 +837,16 @@ <35000 0 40000 10000 5000>, <35000 0 40000 10000 5000>, <35000 0 40000 10000 5000>, + <35000 0 40000 10000 5000>, + + /* Speed bin 2 */ + <20000 0 25000 (-5000) (-10000)>, + <20000 0 25000 (-5000) (-10000)>, + <20000 0 25000 (-5000) (-10000)>, + <35000 0 40000 10000 5000>, + <35000 0 40000 10000 5000>, + <35000 0 40000 10000 5000>, + <35000 0 40000 10000 5000>, <35000 0 40000 10000 5000>; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -798,6 +868,16 @@ <20000 10000 5000 (-5000) (-5000)>, <20000 10000 5000 (-5000) (-5000)>, <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, + + /* Speed bin 2 */ + <35000 35000 40000 40000 40000>, + <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, + <20000 10000 5000 (-5000) (-5000)>, <20000 10000 5000 (-5000) (-5000)>; qcom,cpr-open-loop-voltage-adjustment = @@ -811,14 +891,23 @@ <(-15000) (-15000) (-15000) (-15000) (-13000) (-14000) (-15000) (-18000) (-20000) (-22000) (-24000) (-25000) - (-26000)>; + (-26000)>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) + (-13000) (-14000) (-15000) (-18000) + (-20000) (-22000) (-24000) (-25000) + (-26000) (-27000) (-28000) (-30000)>; qcom,cpr-open-loop-voltage-min-diff = /* Speed bin 0 */ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0>, /* Speed bin 1 */ - <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0>; + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0>, + + /* Speed bin 2 */ + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0>; qcom,cpr-closed-loop-voltage-adjustment = /* Speed bin 0 */ @@ -831,20 +920,29 @@ <(-15000) (-15000) (-15000) (-15000) (-13000) (-14000) (-15000) (-18000) (-20000) (-22000) (-24000) (-25000) - (-26000)>; + (-26000)>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) + (-13000) (-14000) (-15000) (-18000) + (-20000) (-22000) (-24000) (-25000) + (-26000) (-27000) (-28000) (-30000)>; qcom,allow-voltage-interpolation; qcom,allow-quotient-interpolation; qcom,cpr-scaled-open-loop-voltage-as-ceiling; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <12 12>; + qcom,cpr-aging-ref-corner = <12 12 12>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = /* Speed bin 0 */ <0 0 0 1 1 1 1 1>, /* Speed bin 1 */ + <0 0 0 1 1 1 1 1>, + + /* Speed bin 2 */ <0 0 0 1 1 1 1 1>; }; @@ -858,22 +956,28 @@ qcom,cpr-pd-bypass-mask = <0x18>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <19 15>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <19 15 19>; qcom,cpr-corners = /* Speed bin 0 */ <19 19 19 19 19 19 19 19>, /* Speed bin 1 */ - <15 15 15 15 15 15 15 15>; + <15 15 15 15 15 15 15 15>, + + /* Speed bin 2 */ + <19 19 19 19 19 19 19 19>; qcom,cpr-corner-fmax-map = /* Speed bin 0 */ <1 2 5 13 19>, /* Speed bin 1 */ - <1 2 5 13 15>; + <1 2 5 13 15>, + + /* Speed bin 2 */ + <1 2 5 13 19>; qcom,cpr-voltage-ceiling = /* Speed bin 0 */ @@ -885,7 +989,13 @@ /* Speed bin 1 */ <670000 670000 745000 745000 745000 905000 905000 905000 905000 905000 - 905000 905000 905000 1140000 1140000>; + 905000 905000 905000 1140000 1140000>, + + /* Speed bin 2 */ + <670000 670000 745000 745000 745000 + 905000 905000 905000 905000 905000 + 905000 905000 905000 1140000 1140000 + 1140000 1140000 1140000 1140000>; qcom,cpr-voltage-floor = /* Speed bin 0 */ @@ -946,7 +1056,41 @@ 470000 470000 470000 470000 470000>, <470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 - 470000 470000 470000 470000 470000>; + 470000 470000 470000 470000 470000>, + + /* Speed bin 2 */ + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000>; qcom,cpr-floor-to-ceiling-max-range = /* Speed bin 0 */ @@ -958,7 +1102,13 @@ /* Speed bin 1 */ <50000 50000 80000 80000 80000 80000 80000 80000 80000 80000 - 80000 80000 80000 80000 80000>; + 80000 80000 80000 80000 80000>, + + /* Speed bin 2 */ + <50000 50000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000>; qcom,corner-frequencies = /* Speed bin 0 */ @@ -975,7 +1125,16 @@ 537600000 595200000 672000000 748800000 825600000 902400000 979200000 1056000000 1132800000 - 1190400000 1228800000 1305600000>; + 1190400000 1228800000 1305600000>, + + /* Speed bin 2 */ + <307200000 384000000 460800000 + 537600000 595200000 672000000 + 748800000 825600000 902400000 + 979200000 1056000000 1132800000 + 1190400000 1228800000 1305600000 + 1382400000 1459200000 1536000000 + 1593600000>; qcom,cpr-ro-scaling-factor = < 0 0 3112 2666 2947 2543 2271 1979 @@ -1008,6 +1167,16 @@ <45000 0 5000 5000 (-25000)>, <45000 0 5000 5000 (-25000)>, <45000 0 5000 5000 (-25000)>, + <45000 0 5000 5000 (-25000)>, + + /* Speed bin 2 */ + <30000 0 (-10000) (-10000) (-40000)>, + <30000 0 (-10000) (-10000) (-40000)>, + <30000 0 (-10000) (-10000) (-40000)>, + <45000 0 5000 5000 (-25000)>, + <45000 0 5000 5000 (-25000)>, + <45000 0 5000 5000 (-25000)>, + <45000 0 5000 5000 (-25000)>, <45000 0 5000 5000 (-25000)>; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -1029,6 +1198,16 @@ <10000 5000 (-20000) 0 (-35000)>, <10000 5000 (-20000) 0 (-35000)>, <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, + + /* Speed bin 2 */ + <10000 5000 0 0 0>, + <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, + <10000 5000 (-20000) 0 (-35000)>, <10000 5000 (-20000) 0 (-35000)>; qcom,allow-voltage-interpolation; @@ -1036,13 +1215,16 @@ qcom,cpr-scaled-open-loop-voltage-as-ceiling; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <13 13>; + qcom,cpr-aging-ref-corner = <13 13 13>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = /* Speed bin 0 */ <0 0 0 1 1 1 1 1>, /* Speed bin 1 */ + <0 0 0 1 1 1 1 1>, + + /* Speed bin 2 */ <0 0 0 1 1 1 1 1>; }; }; @@ -1061,15 +1243,18 @@ qcom,cpr-pd-bypass-mask = <0xe0>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <25 21>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <25 21 25>; qcom,cpr-corners = /* Speed bin 0 */ <25 25 25 25 25 25 25 25>, /* Speed bin 1 */ - <21 21 21 21 21 21 21 21>; + <21 21 21 21 21 21 21 21>, + + /* Speed bin 0 */ + <25 25 25 25 25 25 25 25>; qcom,ldo-min-headroom-voltage = <150000>; qcom,ldo-max-headroom-voltage = <470000>; @@ -1081,7 +1266,10 @@ <1 4 9 13 25>, /* Speed bin 1 */ - <1 4 9 13 21>; + <1 4 9 13 21>, + + /* Speed bin 2 */ + <1 4 9 13 25>; qcom,cpr-voltage-ceiling = /* Speed bin 0 */ @@ -1096,7 +1284,15 @@ 745000 745000 745000 745000 905000 905000 905000 905000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 - 1140000>; + 1140000>, + + /* Speed bin 2 */ + <670000 670000 670000 670000 745000 + 745000 745000 745000 745000 905000 + 905000 905000 905000 1140000 1140000 + 1140000 1140000 1140000 1140000 1140000 + 1140000 1140000 1140000 1140000 1140000>; + qcom,cpr-voltage-floor = /* Speed bin 0 */ @@ -1181,7 +1377,49 @@ 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 - 470000>; + 470000>, + + /* Speed bin 2 */ + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000 + 625000 625000 625000 625000 625000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000>, + <470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000>; qcom,cpr-floor-to-ceiling-max-range = /* Speed bin 0 */ @@ -1196,7 +1434,14 @@ 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 - 80000>; + 80000>, + + /* Speed bin 2 */ + <50000 50000 50000 50000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000>; qcom,corner-frequencies = /* Speed bin 0 */ @@ -1217,7 +1462,18 @@ 1036800000 1113600000 1190400000 1248000000 1324800000 1401600000 1478400000 1555200000 1632000000 - 1708800000 1785600000 1804800000>; + 1708800000 1785600000 1804800000>, + + /* Speed bin 2 */ + <307200000 403200000 480000000 + 556800000 652800000 729600000 + 806400000 883200000 940800000 + 1036800000 1113600000 1190400000 + 1248000000 1324800000 1401600000 + 1478400000 1555200000 1632000000 + 1708800000 1785600000 1824000000 + 1920000000 1996800000 2073600000 + 2150400000>; qcom,cpr-ro-scaling-factor = < 0 0 3112 2666 2947 2543 2271 1979 @@ -1250,6 +1506,16 @@ <35000 0 30000 15000 15000>, <35000 0 30000 15000 15000>, <35000 0 30000 15000 15000>, + <35000 0 30000 15000 15000>, + + /* Speed bin 2 */ + <20000 0 15000 (-55000) 0>, + <20000 0 15000 (-55000) 0>, + <20000 0 15000 0 0>, + <35000 0 30000 15000 15000>, + <35000 0 30000 15000 15000>, + <35000 0 30000 15000 15000>, + <35000 0 30000 15000 15000>, <35000 0 30000 15000 15000>; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -1271,6 +1537,16 @@ < 0 0 0 0 0>, < 0 0 0 0 0>, < 0 0 0 0 0>, + < 0 0 0 0 0>, + + /* Speed bin 2 */ + <35000 35000 40000 (-30000) 40000>, + < 0 0 0 (-70000) 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>; qcom,cpr-open-loop-voltage-adjustment = @@ -1289,7 +1565,17 @@ (-15000) (-18000) (-21000) (-23000) (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) (-28000) - (-28000)>; + (-28000)>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) + (-11000) (-12000) (-13000) (-14000) + (-15000) (-18000) (-21000) (-23000) + (-25000) (-25000) (-26000) (-26000) + (-27000) (-27000) (-28000) (-28000) + (-28000) (-29000) (-29000) (-30000) + (-30000)>; + qcom,cpr-open-loop-voltage-min-diff = /* Speed bin 0 */ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 @@ -1297,7 +1583,11 @@ /* Speed bin 1 */ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 - 0 0 0 0 0>; + 0 0 0 0 0>, + + /* Speed bin 2 */ + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 + 0 0 0 0 0 0 0 0 0>; qcom,cpr-closed-loop-voltage-adjustment = /* Speed bin 0 */ @@ -1315,20 +1605,32 @@ (-15000) (-18000) (-21000) (-23000) (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) (-28000) - (-28000)>; + (-28000)>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) + (-11000) (-12000) (-13000) (-14000) + (-15000) (-18000) (-21000) (-23000) + (-25000) (-25000) (-26000) (-26000) + (-27000) (-27000) (-28000) (-28000) + (-28000) (-29000) (-29000) (-30000) + (-30000)>; qcom,allow-voltage-interpolation; qcom,allow-quotient-interpolation; qcom,cpr-scaled-open-loop-voltage-as-ceiling; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <13 13>; + qcom,cpr-aging-ref-corner = <13 13 13>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = /* Speed bin 0 */ <0 0 0 1 1 1 1 1>, /* Speed bin 1 */ + <0 0 0 1 1 1 1 1>, + + /* Speed bin 2 */ <0 0 0 1 1 1 1 1>; qcom,cpr-dynamic-floor-corner = <1>; diff --git a/arch/arm/boot/dts/qcom/msm8996-v3.dtsi b/arch/arm/boot/dts/qcom/msm8996-v3.dtsi index c30e19eacc69f..8daa7441a6eda 100644 --- a/arch/arm/boot/dts/qcom/msm8996-v3.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996-v3.dtsi @@ -242,6 +242,71 @@ }; }; + qcom,gpu-pwrlevels-2 { + #address-cells = <1>; + #size-cells = <0>; + + qcom,speed-bin = <2>; + + qcom,initial-pwrlevel = <4>; + + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <560000000>; + qcom,bus-freq = <11>; + qcom,bus-min = <11>; + qcom,bus-max = <11>; + }; + + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <510000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <8>; + qcom,bus-max = <10>; + }; + + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <401800000>; + qcom,bus-freq = <8>; + qcom,bus-min = <7>; + qcom,bus-max = <9>; + }; + + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <315000000>; + qcom,bus-freq = <6>; + qcom,bus-min = <5>; + qcom,bus-max = <7>; + }; + + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <214000000>; + qcom,bus-freq = <4>; + qcom,bus-min = <3>; + qcom,bus-max = <5>; + }; + + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <133000000>; + qcom,bus-freq = <3>; + qcom,bus-min = <2>; + qcom,bus-max = <4>; + }; + + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <27000000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + qcom,bus-max = <0>; + + }; + }; }; }; diff --git a/arch/arm/boot/dts/qcom/msm8996.dtsi b/arch/arm/boot/dts/qcom/msm8996.dtsi index 01df4c72e1440..cb6ebd12297b0 100644 --- a/arch/arm/boot/dts/qcom/msm8996.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -21,7 +21,7 @@ interrupt-parent = <&intc>; chosen { - bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1"; + bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1 app_setting.use_32bit_app_setting=1"; }; aliases { @@ -2226,6 +2226,7 @@ qcom,cnss { compatible = "qcom,cnss"; + wlan-bootstrap-gpio = <&tlmm 46 0>; vdd-wlan-en-supply = <&wlan_en_vreg>; vdd-wlan-supply = <&rome_vreg>; vdd-wlan-io-supply = <&pm8994_s4>; @@ -2453,6 +2454,8 @@ qcom,use-sw-aes-xts-algo; qcom,use-sw-aes-ccm-algo; qcom,use-sw-ahash-algo; + qcom,use-sw-hmac-algo; + qcom,use-sw-aead-algo; }; qcom_cedev: qcedev@660000 { diff --git a/arch/arm/boot/dts/qcom/msm8996pro.dtsi b/arch/arm/boot/dts/qcom/msm8996pro.dtsi index 4366fa6a19e7f..1bf22f160dffc 100644 --- a/arch/arm/boot/dts/qcom/msm8996pro.dtsi +++ b/arch/arm/boot/dts/qcom/msm8996pro.dtsi @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -20,6 +20,10 @@ / { model = "Qualcomm Technologies, Inc. MSM 8996pro"; qcom,msm-id = <305 0x10000>; + + chosen { + bootargs = "sched_enable_hmp=1 sched_enable_power_aware=1 app_setting.use_32bit_app_setting_pro=1"; + }; }; &apc_apm { @@ -41,15 +45,18 @@ regulator-max-microvolt = <20>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <20 20>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <20 20 19>; qcom,cpr-corners = /* Speed bin 0 */ <20 20 20 20 20 20 20 20>, /* Speed bin 1 */ - <20 20 20 20 20 20 20 20>; + <20 20 20 20 20 20 20 20>, + + /* Speed bin 2 */ + <19 19 19 19 19 19 19 19>; qcom,cpr-corner-fmax-map = /* Speed bin 0 */ @@ -70,6 +77,16 @@ <3 6 9 14 19>, <3 6 9 14 19>, <3 6 9 14 19>, + <3 6 9 14 19>, + + /* Speed bin 2 */ + <1 6 9 14 19>, + <1 6 9 14 19>, + <3 6 9 14 19>, + <3 6 9 14 19>, + <3 6 9 14 19>, + <3 6 9 14 19>, + <3 6 9 14 19>, <3 6 9 14 19>; qcom,cpr-voltage-ceiling = @@ -81,7 +98,12 @@ /* Speed bin 1 */ <670000 670000 670000 670000 670000 670000 745000 745000 745000 905000 905000 905000 905000 905000 1140000 1140000 - 1140000 1140000 1140000 1140000>; + 1140000 1140000 1140000 1140000>, + + /* Speed bin 2 */ + <670000 670000 670000 670000 670000 670000 745000 745000 + 745000 905000 905000 905000 905000 905000 1140000 1140000 + 1140000 1140000 1140000>; qcom,cpr-voltage-floor = /* Speed bin 0 */ @@ -92,7 +114,12 @@ /* Speed bin 1 */ <470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 - 470000 470000 470000 470000>; + 470000 470000 470000 470000>, + + /* Speed bin 2 */ + <470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000>; qcom,cpr-floor-to-ceiling-max-range = /* Speed bin 0 */ @@ -103,7 +130,12 @@ /* Speed bin 1 */ <80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 - 80000 80000 80000 80000>; + 80000 80000 80000 80000>, + + /* Speed bin 2 */ + <80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000>; qcom,corner-frequencies = /* Speed bin 0 */ @@ -116,7 +148,13 @@ <307200000 384000000 460800000 537600000 614400000 691200000 768000000 844800000 902400000 979200000 1056000000 1132800000 1209600000 1286400000 1363200000 - 1440000000 1516800000 1593600000 1785600000 1996800000>; + 1440000000 1516800000 1593600000 1785600000 1996800000>, + + /* Speed bin 2 */ + <307200000 384000000 460800000 537600000 614400000 + 691200000 768000000 844800000 902400000 979200000 + 1056000000 1132800000 1209600000 1286400000 1363200000 + 1440000000 1516800000 1593600000 1785600000>; qcom,cpr-ro-scaling-factor = <0 0 3112 2666 2947 2543 2271 1979 2623 2317 2772 2450 0 0 0 0>, @@ -144,6 +182,16 @@ < 0 0 0 0 0 >, < 0 0 0 0 0 >, < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + + /* Speed bin 2 */ + <(-45000) 0 0 (-25000) 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 0 0 0 0 >; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -165,6 +213,16 @@ < 0 (-15000) (-15000) (-15000) (-15000)>, < 0 (-15000) (-15000) (-15000) (-15000)>, < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + + /* Speed bin 2 */ + <(-55000) (-25000) (-5000) (-20000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, + < 0 (-15000) (-15000) (-15000) (-15000)>, < 0 (-15000) (-15000) (-15000) (-15000)>; qcom,cpr-open-loop-voltage-adjustment = @@ -176,14 +234,22 @@ /* Speed bin 1 */ <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) (-25000) - (-26000) (-27000) (-27000) (-28000) (-30000) 70000>; + (-26000) (-27000) (-27000) (-28000) (-30000) 70000>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) + (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) (-25000) + (-26000) (-27000) (-27000) (-28000) (-30000)>; qcom,cpr-open-loop-voltage-min-diff = /* Speed bin 0 */ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>, /* Speed bin 1 */ - <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>; + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>, + + /* Speed bin 2 */ + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0>; qcom,cpr-closed-loop-voltage-adjustment = /* Speed bin 0 */ @@ -194,10 +260,15 @@ /* Speed bin 1 */ <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) (-25000) - (-26000) (-27000) (-27000) (-28000) (-30000) 60000>; + (-26000) (-27000) (-27000) (-28000) (-30000) 60000>, + + /* Speed bin 2 */ + <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) + (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) (-25000) + (-26000) (-27000) (-27000) (-28000) (-30000)>; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <14 14>; + qcom,cpr-aging-ref-corner = <14 14 14>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = <1>; qcom,allow-aging-open-loop-voltage-adjustment = <1>; @@ -213,14 +284,17 @@ qcom,proxy-consumer-voltage = <14 19>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <19 19>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <19 19 19>; qcom,cpr-corners = /* Speed bin 0 */ <19 19 19 19 19 19 19 19>, /* Speed bin 1 */ + <19 19 19 19 19 19 19 19>, + + /* Speed bin 2 */ <19 19 19 19 19 19 19 19>; qcom,cpr-corner-fmax-map = @@ -228,6 +302,9 @@ <1 4 7 14 19>, /* Speed bin 1 */ + <1 4 7 14 19>, + + /* Speed bin 2 */ <1 4 7 14 19>; qcom,cpr-voltage-ceiling = @@ -237,6 +314,11 @@ 1140000 1140000 1140000>, /* Speed bin 1 */ + <670000 670000 670000 670000 745000 745000 745000 905000 + 905000 905000 905000 905000 905000 905000 1140000 1140000 + 1140000 1140000 1140000>, + + /* Speed bin 2 */ <670000 670000 670000 670000 745000 745000 745000 905000 905000 905000 905000 905000 905000 905000 1140000 1140000 1140000 1140000 1140000>; @@ -248,6 +330,11 @@ 470000 470000 470000>, /* Speed bin 1 */ + <470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000>, + + /* Speed bin 2 */ <470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000>; @@ -259,6 +346,11 @@ 80000 80000 80000>, /* Speed bin 1 */ + <80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000>, + + /* Speed bin 2 */ <80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000>; @@ -271,6 +363,12 @@ 1363200000 1440000000 1516800000 1593600000>, /* Speed bin 1 */ + <192000000 307200000 384000000 441600000 537600000 + 614400000 691200000 768000000 844800000 902400000 + 979200000 1056000000 1132800000 1190400000 1286400000 + 1363200000 1440000000 1516800000 1593600000>, + + /* Speed bin 2 */ <192000000 307200000 384000000 441600000 537600000 614400000 691200000 768000000 844800000 902400000 979200000 1056000000 1132800000 1190400000 1286400000 @@ -302,6 +400,16 @@ < 0 0 0 15000 0 >, < 0 0 0 15000 0 >, < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, + + /* Speed bin 2 */ + <(-40000) 0 0 (-10000) (-50000)>, + < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, + < 0 0 0 15000 0 >, < 0 0 0 15000 0 >; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -323,10 +431,20 @@ <(-15000) (-10000) 5000 20000 0 >, <(-15000) (-10000) 5000 20000 0 >, <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, + + /* Speed bin 2 */ + <(-45000) (-25000) 10000 (-10000) (-40000)>, + <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, + <(-15000) (-10000) 5000 20000 0 >, <(-15000) (-10000) 5000 20000 0 >; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <14 14>; + qcom,cpr-aging-ref-corner = <14 14 14>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = <1>; qcom,allow-aging-open-loop-voltage-adjustment = <1>; @@ -337,14 +455,17 @@ regulator-max-microvolt = <27>; qcom,cpr-fuse-corners = <5>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <27 25>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <27 25 25>; qcom,cpr-corners = /* Speed bin 0 */ <27 27 27 27 27 27 27 27>, /* Speed bin 1 */ + <25 25 25 25 25 25 25 25>, + + /* Speed bin 2 */ <25 25 25 25 25 25 25 25>; qcom,cpr-corner-fmax-map = @@ -366,6 +487,16 @@ <4 7 10 15 25>, <4 7 10 15 25>, <4 7 10 15 25>, + <4 7 10 15 25>, + + /* Speed bin 2 */ + <1 7 10 15 25>, + <1 7 10 15 25>, + <4 7 10 15 25>, + <4 7 10 15 25>, + <4 7 10 15 25>, + <4 7 10 15 25>, + <4 7 10 15 25>, <4 7 10 15 25>; qcom,cpr-voltage-ceiling = @@ -379,6 +510,12 @@ <670000 670000 670000 670000 670000 670000 670000 745000 745000 745000 905000 905000 905000 905000 905000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 + 1140000>, + + /* Speed bin 2 */ + <670000 670000 670000 670000 670000 670000 670000 745000 + 745000 745000 905000 905000 905000 905000 905000 1140000 + 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000 1140000>; qcom,cpr-voltage-floor = @@ -389,6 +526,12 @@ 470000 470000 470000>, /* Speed bin 1 */ + <470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 470000 470000 470000 + 470000 470000 470000 470000 470000 470000 470000 470000 + 470000>, + + /* Speed bin 2 */ <470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 470000 @@ -402,6 +545,12 @@ 80000 80000 80000>, /* Speed bin 1 */ + <80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 80000 80000 80000 + 80000 80000 80000 80000 80000 80000 80000 80000 + 80000>, + + /* Speed bin 2 */ <80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 80000 @@ -421,6 +570,13 @@ 691200000 748800000 825600000 902400000 979200000 1056000000 1132800000 1209600000 1286400000 1363200000 1440000000 1516800000 1593600000 1670400000 1747200000 + 1824000000 1900800000 1977600000 2054400000 2150400000>, + + /* Speed bin 2 */ + <307200000 384000000 460800000 537600000 614400000 + 691200000 748800000 825600000 902400000 979200000 + 1056000000 1132800000 1209600000 1286400000 1363200000 + 1440000000 1516800000 1593600000 1670400000 1747200000 1824000000 1900800000 1977600000 2054400000 2150400000>; qcom,cpr-ro-scaling-factor = @@ -449,6 +605,16 @@ < 0 0 0 0 0 >, < 0 0 0 0 0 >, < 0 0 0 0 0 >, + < 0 0 0 0 0 >, + + /* Speed bin 2 */ + <(-45000) 0 15000 (-20000) 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 0 0 0 0 >; qcom,cpr-closed-loop-voltage-fuse-adjustment = @@ -470,6 +636,16 @@ < 0 (-10000) (-15000) 0 (-10000)>, < 0 (-10000) (-15000) 0 (-10000)>, < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + + /* Speed bin 2 */ + <(-55000) (-20000) 15000 (-15000) (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, + < 0 (-10000) (-15000) 0 (-10000)>, < 0 (-10000) (-15000) 0 (-10000)>; qcom,cpr-open-loop-voltage-adjustment = @@ -480,6 +656,12 @@ (-28000) (-29000) (-29000) (-30000) (-30000) (-30000)>, /* Speed bin 1 */ + <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) + (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) + (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) + (-28000) (-29000) (-29000) (-30000)>, + + /* Speed bin 2 */ <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) @@ -490,6 +672,9 @@ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>, /* Speed bin 1 */ + <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>, + + /* Speed bin 2 */ <0 0 0 0 (-50000) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>; qcom,cpr-closed-loop-voltage-adjustment = @@ -499,6 +684,12 @@ (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) (-28000) (-29000) (-29000) (-30000) (-30000) (-30000)>, + /* Speed bin 1 */ + <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) + (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) + (-25000) (-25000) (-26000) (-26000) (-27000) (-27000) (-28000) + (-28000) (-29000) (-29000) (-30000)>, + /* Speed bin 1 */ <(-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-15000) (-17000) (-19000) (-21000) (-23000) @@ -506,7 +697,7 @@ (-28000) (-29000) (-29000) (-30000)>; qcom,cpr-aging-max-voltage-adjustment = <15000>; - qcom,cpr-aging-ref-corner = <15 15>; + qcom,cpr-aging-ref-corner = <15 15 15>; qcom,cpr-aging-ro-scaling-factor = <3200>; qcom,allow-aging-voltage-adjustment = <1>; qcom,allow-aging-open-loop-voltage-adjustment = <1>; @@ -532,14 +723,17 @@ regulator-max-microvolt = <9>; qcom,cpr-fuse-corners = <4>; - qcom,cpr-fuse-combos = <16>; - qcom,cpr-speed-bins = <2>; - qcom,cpr-speed-bin-corners = <9 9>; + qcom,cpr-fuse-combos = <24>; + qcom,cpr-speed-bins = <3>; + qcom,cpr-speed-bin-corners = <9 9 9>; qcom,cpr-corners = /* Speed bin 0 */ <9 9 9 9 9 9 9 9>, /* Speed bin 1 */ + <9 9 9 9 9 9 9 9>, + + /* Speed bin 2 */ <9 9 9 9 9 9 9 9>; qcom,cpr-corner-fmax-map = @@ -547,6 +741,9 @@ <2 4 6 9>, /* Speed bin 1 */ + <2 4 6 9>, + + /* Speed bin 2 */ <2 4 6 9>; qcom,cpr-voltage-ceiling = @@ -556,6 +753,10 @@ /* Speed bin 1 */ <400000 670000 670000 745000 825000 905000 960000 1015000 + 1065000>, + + /* Speed bin 2 */ + <400000 670000 670000 745000 825000 905000 960000 1015000 1065000>; qcom,cpr-voltage-floor = @@ -564,6 +765,10 @@ 520000>, /* Speed bin 1 */ + <400000 520000 520000 520000 520000 520000 520000 520000 + 520000>, + + /* Speed bin 2 */ <400000 520000 520000 520000 520000 520000 520000 520000 520000>; @@ -572,6 +777,9 @@ <1 1 1 1 2 2 2 2 2>, /* Speed bin 1 */ + <1 1 1 1 2 2 2 2 2>, + + /* Speed bin 2 */ <1 1 1 1 2 2 2 2 2>; qcom,corner-frequencies = @@ -580,6 +788,10 @@ 624000000 652800000>, /* Speed bin 1 */ + <0 133000000 214000000 315000000 401800000 510000000 560000000 + 624000000 652800000>, + + /* Speed bin 2 */ <0 133000000 214000000 315000000 401800000 510000000 560000000 624000000 652800000>; @@ -604,6 +816,17 @@ <0 0 0 0 0 0 577 543 798 768 823 810 0 0 0 0>, <0 0 0 0 0 0 669 629 886 864 924 911 0 0 0 0>, <0 0 0 0 0 0 771 725 984 970 1036 1024 0 0 0 0>, + <0 0 0 0 0 0 908 868 1118 1106 1179 1174 0 0 0 0>, + + /* Speed bin 2 */ + <0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0>, + <0 0 0 0 0 0 185 179 291 299 304 319 0 0 0 0>, + <0 0 0 0 0 0 287 273 425 426 443 453 0 0 0 0>, + <0 0 0 0 0 0 414 392 584 576 608 612 0 0 0 0>, + <0 0 0 0 0 0 459 431 684 644 692 679 0 0 0 0>, + <0 0 0 0 0 0 577 543 798 768 823 810 0 0 0 0>, + <0 0 0 0 0 0 669 629 886 864 924 911 0 0 0 0>, + <0 0 0 0 0 0 771 725 984 970 1036 1024 0 0 0 0>, <0 0 0 0 0 0 908 868 1118 1106 1179 1174 0 0 0 0>; qcom,cpr-ro-scaling-factor = @@ -627,6 +850,17 @@ <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + + /* Speed bin 2 */ + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, + <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>, <0 0 0 0 0 0 2035 1917 1959 2131 2246 2253 0 0 0 0>; qcom,cpr-open-loop-voltage-fuse-adjustment = @@ -634,6 +868,9 @@ <(-85000) (-15000) (-15000) (-40000)>, /* Speed bin 1 */ + <(-85000) (-15000) (-15000) (-40000)>, + + /* Speed bin 2 */ <(-85000) (-15000) (-15000) (-40000)>; qcom,cpr-closed-loop-voltage-adjustment = @@ -641,6 +878,9 @@ <0 0 30000 10000 10000 45000 25000 25000 (-35000)>, /* Speed bin 1 */ + <0 0 30000 10000 10000 45000 25000 25000 (-35000)>, + + /* Speed bin 2 */ <0 0 30000 10000 10000 45000 25000 25000 (-35000)>; qcom,cpr-floor-to-ceiling-max-range = @@ -648,6 +888,9 @@ <0 70000 70000 75000 80000 90000 95000 100000 100000>, /* Speed bin 1 */ + <0 70000 70000 75000 80000 90000 95000 100000 100000>, + + /* Speed bin 2 */ <0 70000 70000 75000 80000 90000 95000 100000 100000>; qcom,cpr-fused-closed-loop-voltage-adjustment-map = @@ -655,6 +898,9 @@ <0 2 2 2 2 0 0 4 4>, /* Speed bin 1 */ + <0 2 2 2 2 0 0 4 4>, + + /* Speed bin 2 */ <0 2 2 2 2 0 0 4 4>; qcom,cpr-aging-max-voltage-adjustment = <15000>; @@ -716,6 +962,26 @@ < 1516800000 17 >, < 1593600000 18 >, < 1996800000 20 >; + qcom,pwrcl-speedbin2-v0 = + < 0 0 >, + < 307200000 1 >, + < 384000000 2 >, + < 460800000 3 >, + < 537600000 4 >, + < 614400000 5 >, + < 691200000 6 >, + < 768000000 7 >, + < 844800000 8 >, + < 902400000 9 >, + < 979200000 10 >, + < 1056000000 11 >, + < 1132800000 12 >, + < 1209600000 13 >, + < 1286400000 14 >, + < 1363200000 15 >, + < 1440000000 16 >, + < 1516800000 17 >, + < 1593600000 18 >; qcom,perfcl-speedbin0-v0 = < 0 0 >, < 307200000 1 >, @@ -772,6 +1038,30 @@ < 1977600000 23 >, < 2054400000 24 >, < 2150400000 25 >; + qcom,perfcl-speedbin2-v0 = + < 0 0 >, + < 307200000 1 >, + < 384000000 2 >, + < 460800000 3 >, + < 537600000 4 >, + < 614400000 5 >, + < 691200000 6 >, + < 748800000 7 >, + < 825600000 8 >, + < 902400000 9 >, + < 979200000 10 >, + < 1056000000 11 >, + < 1132800000 12 >, + < 1209600000 13 >, + < 1286400000 14 >, + < 1363200000 15 >, + < 1440000000 16 >, + < 1516800000 17 >, + < 1593600000 18 >, + < 1670400000 19 >, + < 1747200000 20 >, + < 1824000000 21 >, + < 1900800000 22 >; qcom,cbf-speedbin0-v0 = < 0 0 >, < 192000000 1 >, @@ -814,6 +1104,27 @@ < 1440000000 17 >, < 1516800000 18 >, < 1593600000 19 >; + qcom,cbf-speedbin2-v0 = + < 0 0 >, + < 192000000 1 >, + < 307200000 2 >, + < 384000000 3 >, + < 441600000 4 >, + < 537600000 5 >, + < 614400000 6 >, + < 691200000 7 >, + < 768000000 8 >, + < 844800000 9 >, + < 902400000 10 >, + < 979200000 11 >, + < 1056000000 12 >, + < 1132800000 13 >, + < 1190400000 14 >, + < 1286400000 15 >, + < 1363200000 16 >, + < 1440000000 17 >, + < 1516800000 18 >, + < 1593600000 19 >; }; &clock_mmss { @@ -864,6 +1175,20 @@ < 510000000 5 >, < 560000000 7 >, < 624000000 7 >; + qcom,gfxfreq-speedbin2 = + < 0 0 0 >, + < 133000000 2 4 >, + < 214000000 3 4 >, + < 315000000 4 4 >, + < 401800000 5 5 >, + < 510000000 6 5 >; + qcom,gfxfreq-mx-speedbin2 = + < 0 0 >, + < 133000000 4 >, + < 214000000 4 >, + < 315000000 4 >, + < 401800000 5 >, + < 510000000 5 >; }; &msm_cpufreq { @@ -1008,6 +1333,10 @@ qcom,poll-ms = <50>; qcom,limit-temp = <80>; qcom,core-limit-temp = <90>; + msm_thermal_freq: qcom,vdd-apps-rstr { + qcom,max-freq-level = <1209600>; + qcom,levels = <1056000 1516800 1516800>; + }; qcom,vdd-gfx-rstr{ qcom,levels = <6 8 9>; /* Nominal, Turbo, Turbo_L1 */ }; @@ -1182,5 +1511,90 @@ qcom,bus-max = <0>; }; }; + + qcom,gpu-pwrlevels-2 { + #address-cells = <1>; + #size-cells = <0>; + + qcom,speed-bin = <2>; + + qcom,initial-pwrlevel = <3>; + + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <510000000>; + qcom,bus-freq = <11>; + qcom,bus-min = <11>; + qcom,bus-max = <11>; + }; + + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <401800000>; + qcom,bus-freq = <8>; + qcom,bus-min = <7>; + qcom,bus-max = <9>; + }; + + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <315000000>; + qcom,bus-freq = <6>; + qcom,bus-min = <5>; + qcom,bus-max = <7>; + }; + + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <214000000>; + qcom,bus-freq = <4>; + qcom,bus-min = <3>; + qcom,bus-max = <5>; + }; + + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <133000000>; + qcom,bus-freq = <3>; + qcom,bus-min = <2>; + qcom,bus-max = <4>; + }; + + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <27000000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + qcom,bus-max = <0>; + }; + }; }; }; + +&qusb_phy0 { + qcom,qusb-phy-init-seq = <0xD0 0x80 + 0xB3 0x84 + 0x83 0x88 + 0xC0 0x8C + 0x02 0x90 + 0x30 0x08 + 0x79 0x0C + 0x21 0x10 + 0x14 0x9C + 0x9F 0x1C + 0x00 0x18>; +}; + +&qusb_phy1 { + qcom,qusb-phy-init-seq = <0xD0 0x80 + 0xB3 0x84 + 0x83 0x88 + 0xC0 0x8C + 0x02 0x90 + 0x30 0x08 + 0x79 0x0C + 0x21 0x10 + 0x14 0x9C + 0x9F 0x1C + 0x00 0x18>; +}; diff --git a/arch/arm/boot/dts/qcom/msmcobalt-ion.dtsi b/arch/arm/boot/dts/qcom/msmcobalt-ion.dtsi index 09a2b799d9aa3..efa90d047b67e 100644 --- a/arch/arm/boot/dts/qcom/msmcobalt-ion.dtsi +++ b/arch/arm/boot/dts/qcom/msmcobalt-ion.dtsi @@ -21,11 +21,6 @@ qcom,ion-heap-type = "SYSTEM"; }; - system_contig_heap: qcom,ion-heap@21 { - reg = <21>; - qcom,ion-heap-type = "SYSTEM_CONTIG"; - }; - qcom,ion-heap@22 { /* ADSP HEAP */ reg = <22>; memory-region = <&adsp_mem>; diff --git a/arch/arm/boot/dts/qcom/sdm450-cdp.dts b/arch/arm/boot/dts/qcom/sdm450-cdp.dts new file mode 100644 index 0000000000000..7ff6e9a7149db --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-cdp.dts @@ -0,0 +1,31 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "sdm450.dtsi" +#include "msm-pmi8950.dtsi" +#include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 + PMI8950 CDP"; + compatible = "qcom,sdm450-cdp", "qcom,sdm450", "qcom,cdp"; + qcom,board-id= <1 0>; +}; + +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-mtp.dts b/arch/arm/boot/dts/qcom/sdm450-mtp.dts new file mode 100644 index 0000000000000..be541332b1144 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-mtp.dts @@ -0,0 +1,47 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "sdm450.dtsi" +#include "msm-pmi8950.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 + PMI8950 MTP"; + compatible = "qcom,sdm450-mtp", "qcom,sdm450", "qcom,mtp"; + qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x010011 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8950_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8950_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts b/arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts new file mode 100644 index 0000000000000..1c413fa1fc80a --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-pmi8937-mtp.dts @@ -0,0 +1,48 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8937.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-audio-mtp.dtsi" +#include "msm8953-pmi8937.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 + PMI8937 MTP"; + compatible = "qcom,sdm450-mtp", "qcom,sdm450", "qcom,mtp"; + qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x020037 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8937_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8937_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts b/arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts new file mode 100644 index 0000000000000..2fda2dd22fbfc --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-pmi8940-mtp.dts @@ -0,0 +1,47 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "msm8953.dtsi" +#include "msm-pmi8940.dtsi" +#include "msm8953-mtp.dtsi" +#include "msm8953-pmi8940.dtsi" +#include "msm8953-camera-sensor-mtp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 + PMI8940 MTP"; + compatible = "qcom,sdm450-mtp", "qcom,sdm450", "qcom,mtp"; + qcom,board-id= <8 0>; + qcom,pmic-id = <0x010016 0x020040 0x0 0x0>; +}; + +/{ + mtp_batterydata: qcom,battery-data { + qcom,batt-id-range-pct = <15>; + #include "batterydata-itech-3000mah.dtsi" + #include "batterydata-ascent-3450mAh.dtsi" + }; +}; + +&pmi8940_fg { + qcom,battery-data = <&mtp_batterydata>; +}; + +&pmi8940_charger { + qcom,battery-data = <&mtp_batterydata>; + qcom,chg-led-sw-controls; + qcom,chg-led-support; + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-qrd.dts b/arch/arm/boot/dts/qcom/sdm450-qrd.dts new file mode 100644 index 0000000000000..b8b2c81540067 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-qrd.dts @@ -0,0 +1,66 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "sdm450.dtsi" +#include "msm-pmi8950.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 + PMI8950 QRD"; + compatible = "qcom,sdm450-qrd", "qcom,sdm450", "qcom,qrd"; + qcom,board-id = <0x0005000b 0>; +}; + +&soc { + led_flash0: qcom,camera-flash { + cell-index = <0>; + compatible = "qcom,camera-flash"; + qcom,flash-type = <1>; + qcom,flash-source = <&pmi8950_flash0 &pmi8950_flash1>; + qcom,torch-source = <&pmi8950_torch0 &pmi8950_torch1>; + qcom,switch-source = <&pmi8950_switch>; + }; +}; + +#include "msm8953-qrd-sku3.dtsi" + +&usb3 { + vbus_dwc3-supply = <&smbcharger_charger_otg>; +}; + +&mdss_dsi1 { + lab-supply = <&lab_regulator>; + ibb-supply = <&ibb_regulator>; +}; + +&dsi_panel_pwr_supply { + qcom,panel-supply-entry@2 { + reg = <2>; + qcom,supply-name = "lab"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + }; + + qcom,panel-supply-entry@3 { + reg = <3>; + qcom,supply-name = "ibb"; + qcom,supply-min-voltage = <4600000>; + qcom,supply-max-voltage = <6000000>; + qcom,supply-enable-load = <100000>; + qcom,supply-disable-load = <100>; + qcom,supply-post-on-sleep = <10>; + }; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-qrd_rosy.dts b/arch/arm/boot/dts/qcom/sdm450-qrd_rosy.dts new file mode 100644 index 0000000000000..163d7b1e86a03 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-qrd_rosy.dts @@ -0,0 +1,23 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "sdm450_rosy.dtsi" +#include "msm8953-qrd-sku3_rosy.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 QRD"; + compatible = "qcom,sdm450-qrd", "qcom,sdm450", "qcom,qrd"; + qcom,board-id = <11 1>; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450-rcm.dts b/arch/arm/boot/dts/qcom/sdm450-rcm.dts new file mode 100644 index 0000000000000..742f1c2a73610 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450-rcm.dts @@ -0,0 +1,31 @@ +/* + * 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. + */ + +/dts-v1/; + +#include "sdm450.dtsi" +#include "msm-pmi8950.dtsi" +#include "msm8953-cdp.dtsi" +#include "msm8953-pmi8950.dtsi" +#include "msm8953-camera-sensor-cdp.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450 + PMI8950 RCM"; + compatible = "qcom,sdm450-cdp", "qcom,sdm450", "qcom,cdp"; + qcom,board-id= <21 0>; +}; + +&pmi8950_charger { + qcom,external-typec; + qcom,typec-psy-name = "typec"; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450.dtsi b/arch/arm/boot/dts/qcom/sdm450.dtsi new file mode 100644 index 0000000000000..029e055b46d3b --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450.dtsi @@ -0,0 +1,120 @@ +/* + * 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 "skeleton64.dtsi" +#include "msm8953.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450"; + compatible = "qcom,sdm450"; + qcom,msm-id = <338 0x0>; + interrupt-parent = <&intc>; + + soc: soc { }; +}; + +&clock_gcc_gfx { + compatible = "qcom,gcc-gfx-sdm450"; + qcom,gfxfreq-corner = + < 0 0 >, + < 133330000 1 >, /* Min SVS */ + < 216000000 2 >, /* Low SVS */ + < 320000000 3 >, /* SVS */ + < 400000000 4 >, /* SVS Plus */ + < 510000000 5 >, /* NOM */ + < 560000000 6 >, /* Nom Plus */ + < 600000000 7 >; /* Turbo */ +}; + +/* GPU Overrides*/ +&msm_gpu { + + /delete-node/qcom,gpu-pwrlevels; + + qcom,gpu-pwrlevels { + #address-cells = <1>; + #size-cells = <0>; + + compatible = "qcom,gpu-pwrlevels"; + + /* TURBO */ + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <600000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <10>; + qcom,bus-max = <10>; + }; + + /* NOM+ */ + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <560000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <8>; + qcom,bus-max = <10>; + }; + + /* NOM */ + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <510000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <6>; + qcom,bus-max = <10>; + }; + + /* SVS+ */ + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <400000000>; + qcom,bus-freq = <7>; + qcom,bus-min = <5>; + qcom,bus-max = <8>; + }; + + /* SVS */ + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <320000000>; + qcom,bus-freq = <4>; + qcom,bus-min = <2>; + qcom,bus-max = <6>; + }; + + /* Low SVS */ + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <216000000>; + qcom,bus-freq = <1>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + + /* Min SVS */ + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <133300000>; + qcom,bus-freq = <1>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + /* XO */ + qcom,gpu-pwrlevel@7 { + reg = <7>; + qcom,gpu-freq = <19200000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + }; + }; +}; diff --git a/arch/arm/boot/dts/qcom/sdm450_rosy.dtsi b/arch/arm/boot/dts/qcom/sdm450_rosy.dtsi new file mode 100644 index 0000000000000..8be543d238321 --- /dev/null +++ b/arch/arm/boot/dts/qcom/sdm450_rosy.dtsi @@ -0,0 +1,120 @@ +/* + * 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 "skeleton64.dtsi" +#include "msm8953_rosy.dtsi" + +/ { + model = "Qualcomm Technologies, Inc. SDM450"; + compatible = "qcom,sdm450"; + qcom,msm-id = <338 0x0>; + interrupt-parent = <&intc>; + + soc: soc { }; +}; + +&clock_gcc_gfx { + compatible = "qcom,gcc-gfx-sdm450"; + qcom,gfxfreq-corner = + < 0 0 >, + < 133330000 1 >, /* Min SVS */ + < 216000000 2 >, /* Low SVS */ + < 320000000 3 >, /* SVS */ + < 400000000 4 >, /* SVS Plus */ + < 510000000 5 >, /* NOM */ + < 560000000 6 >, /* Nom Plus */ + < 600000000 7 >; /* Turbo */ +}; + +/* GPU Overrides*/ +&msm_gpu { + + /delete-node/qcom,gpu-pwrlevels; + + qcom,gpu-pwrlevels { + #address-cells = <1>; + #size-cells = <0>; + + compatible = "qcom,gpu-pwrlevels"; + + /* TURBO */ + qcom,gpu-pwrlevel@0 { + reg = <0>; + qcom,gpu-freq = <600000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <10>; + qcom,bus-max = <10>; + }; + + /* NOM+ */ + qcom,gpu-pwrlevel@1 { + reg = <1>; + qcom,gpu-freq = <560000000>; + qcom,bus-freq = <10>; + qcom,bus-min = <8>; + qcom,bus-max = <10>; + }; + + /* NOM */ + qcom,gpu-pwrlevel@2 { + reg = <2>; + qcom,gpu-freq = <510000000>; + qcom,bus-freq = <9>; + qcom,bus-min = <6>; + qcom,bus-max = <10>; + }; + + /* SVS+ */ + qcom,gpu-pwrlevel@3 { + reg = <3>; + qcom,gpu-freq = <400000000>; + qcom,bus-freq = <7>; + qcom,bus-min = <5>; + qcom,bus-max = <8>; + }; + + /* SVS */ + qcom,gpu-pwrlevel@4 { + reg = <4>; + qcom,gpu-freq = <320000000>; + qcom,bus-freq = <4>; + qcom,bus-min = <2>; + qcom,bus-max = <6>; + }; + + /* Low SVS */ + qcom,gpu-pwrlevel@5 { + reg = <5>; + qcom,gpu-freq = <216000000>; + qcom,bus-freq = <1>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + + /* Min SVS */ + qcom,gpu-pwrlevel@6 { + reg = <6>; + qcom,gpu-freq = <133300000>; + qcom,bus-freq = <1>; + qcom,bus-min = <1>; + qcom,bus-max = <4>; + }; + /* XO */ + qcom,gpu-pwrlevel@7 { + reg = <7>; + qcom,gpu-freq = <19200000>; + qcom,bus-freq = <0>; + qcom,bus-min = <0>; + }; + }; +}; diff --git a/arch/arm/configs/msm8909-perf_defconfig b/arch/arm/configs/msm8909-perf_defconfig index 63751bbc391a8..75e5abfa18043 100644 --- a/arch/arm/configs/msm8909-perf_defconfig +++ b/arch/arm/configs/msm8909-perf_defconfig @@ -25,6 +25,7 @@ CONFIG_KALLSYMS_ALL=y CONFIG_EMBEDDED=y CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -215,6 +216,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm/configs/msm8909_defconfig b/arch/arm/configs/msm8909_defconfig index 2d5649e24df1e..2c93d6ea48be3 100644 --- a/arch/arm/configs/msm8909_defconfig +++ b/arch/arm/configs/msm8909_defconfig @@ -27,6 +27,7 @@ CONFIG_PROFILING=y CONFIG_OPROFILE=m CONFIG_KPROBES=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -220,6 +221,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y diff --git a/arch/arm/configs/msm8909w-1gb-perf_defconfig b/arch/arm/configs/msm8909w-1gb-perf_defconfig index 98eb2d2ea039d..35fbc1751ce4a 100644 --- a/arch/arm/configs/msm8909w-1gb-perf_defconfig +++ b/arch/arm/configs/msm8909w-1gb-perf_defconfig @@ -221,6 +221,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_IFB=y @@ -435,7 +436,6 @@ CONFIG_MSM_SUBSYSTEM_RESTART=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm/configs/msm8909w-1gb_defconfig b/arch/arm/configs/msm8909w-1gb_defconfig index 67393eb27e90d..84dea5245b24d 100644 --- a/arch/arm/configs/msm8909w-1gb_defconfig +++ b/arch/arm/configs/msm8909w-1gb_defconfig @@ -223,6 +223,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_IFB=y @@ -438,7 +439,6 @@ CONFIG_MSM_SUBSYSTEM_RESTART=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm/configs/msm8909w-perf_defconfig b/arch/arm/configs/msm8909w-perf_defconfig index d7db427bc0b40..ae338bc6557ed 100644 --- a/arch/arm/configs/msm8909w-perf_defconfig +++ b/arch/arm/configs/msm8909w-perf_defconfig @@ -222,6 +222,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_IFB=y @@ -436,7 +437,6 @@ CONFIG_MSM_SUBSYSTEM_RESTART=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm/configs/msm8909w_defconfig b/arch/arm/configs/msm8909w_defconfig index a64f825f6e026..864b7e27c5151 100644 --- a/arch/arm/configs/msm8909w_defconfig +++ b/arch/arm/configs/msm8909w_defconfig @@ -224,6 +224,7 @@ CONFIG_SCSI_SCAN_ASYNC=y CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_IFB=y @@ -439,7 +440,6 @@ CONFIG_MSM_SUBSYSTEM_RESTART=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set diff --git a/arch/arm/configs/msm8937-perf_defconfig b/arch/arm/configs/msm8937-perf_defconfig index dd0494c4acebe..9df84f1574904 100644 --- a/arch/arm/configs/msm8937-perf_defconfig +++ b/arch/arm/configs/msm8937-perf_defconfig @@ -4,6 +4,7 @@ CONFIG_AUDIT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y @@ -15,6 +16,7 @@ CONFIG_RESOURCE_COUNTERS=y CONFIG_CGROUP_SCHED=y CONFIG_RT_GROUP_SCHED=y CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y CONFIG_SCHED_QHMP=y CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set @@ -28,6 +30,7 @@ CONFIG_EMBEDDED=y # CONFIG_SLUB_DEBUG is not set CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -51,7 +54,6 @@ CONFIG_ARM_PSCI=y CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y -# CONFIG_HW_PERF_EVENTS is not set CONFIG_CMA=y CONFIG_CMA_DEBUGFS=y CONFIG_ZSMALLOC=y @@ -96,6 +98,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y @@ -168,6 +171,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -184,6 +188,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y @@ -256,6 +261,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y @@ -468,6 +474,7 @@ CONFIG_MMC_PERF_PROFILING=y CONFIG_MMC_CLKGATE=y CONFIG_MMC_PARANOID_SD_INIT=y CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y CONFIG_MMC_TEST=m CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y @@ -508,6 +515,7 @@ CONFIG_SPS_SUPPORT_NDP_BAM=y CONFIG_IPA=y CONFIG_RMNET_IPA=y CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y CONFIG_MSM_SPMI=y CONFIG_MSM_SPMI_PMIC_ARB=y CONFIG_MSM_QPNP_INT=y @@ -547,10 +555,11 @@ CONFIG_MSM_SYSMON_COMM=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm/configs/msm8937_defconfig b/arch/arm/configs/msm8937_defconfig index 27925a7386a78..9c5bae1dc62f4 100644 --- a/arch/arm/configs/msm8937_defconfig +++ b/arch/arm/configs/msm8937_defconfig @@ -3,6 +3,7 @@ CONFIG_AUDIT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y @@ -15,6 +16,7 @@ CONFIG_RESOURCE_COUNTERS=y CONFIG_CGROUP_SCHED=y CONFIG_RT_GROUP_SCHED=y CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y CONFIG_SCHED_QHMP=y CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set @@ -29,6 +31,7 @@ CONFIG_PROFILING=y CONFIG_OPROFILE=m CONFIG_KPROBES=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -52,7 +55,6 @@ CONFIG_ARM_PSCI=y CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y -# CONFIG_HW_PERF_EVENTS is not set CONFIG_CMA=y CONFIG_CMA_DEBUGFS=y CONFIG_ZSMALLOC=y @@ -97,6 +99,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y @@ -169,6 +172,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -185,6 +189,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y @@ -258,6 +263,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y @@ -472,6 +478,7 @@ CONFIG_MMC_PERF_PROFILING=y CONFIG_MMC_CLKGATE=y CONFIG_MMC_PARANOID_SD_INIT=y CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y CONFIG_MMC_TEST=m CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y @@ -512,6 +519,7 @@ CONFIG_SPS_SUPPORT_NDP_BAM=y CONFIG_IPA=y CONFIG_RMNET_IPA=y CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y CONFIG_MSM_SPMI=y CONFIG_MSM_SPMI_PMIC_ARB=y CONFIG_MSM_QPNP_INT=y @@ -556,10 +564,11 @@ CONFIG_MSM_SYSMON_COMM=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm/configs/msmcortex-perf_defconfig b/arch/arm/configs/msmcortex-perf_defconfig index 4b3ac783cc586..34652e364366f 100644 --- a/arch/arm/configs/msmcortex-perf_defconfig +++ b/arch/arm/configs/msmcortex-perf_defconfig @@ -5,6 +5,7 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y @@ -28,6 +29,7 @@ CONFIG_EMBEDDED=y # CONFIG_SLUB_DEBUG is not set CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -41,6 +43,7 @@ CONFIG_ARCH_MSM8916=y CONFIG_ARCH_MSM8937=y CONFIG_ARCH_MSM8940=y CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_SDM450=y CONFIG_SMP=y CONFIG_SCHED_MC=y CONFIG_NR_CPUS=8 @@ -48,7 +51,6 @@ CONFIG_ARM_PSCI=y CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y -# CONFIG_HW_PERF_EVENTS is not set CONFIG_CMA=y CONFIG_CMA_DEBUGFS=y CONFIG_ZSMALLOC=y @@ -93,6 +95,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y @@ -163,6 +166,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -179,6 +183,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y @@ -251,6 +256,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y @@ -412,6 +418,7 @@ CONFIG_MSM_DBA_ADV7533=y CONFIG_FB_MSM_MDSS=y CONFIG_FB_MSM_MDSS_WRITEBACK=y CONFIG_FB_MSM_MDSS_HDMI_PANEL=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_SOUND=y CONFIG_SND=y @@ -540,9 +547,10 @@ CONFIG_MSM_SYSMON_COMM=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm/configs/msmcortex_defconfig b/arch/arm/configs/msmcortex_defconfig index 1bd8196e0b897..fb8466f99a22a 100644 --- a/arch/arm/configs/msmcortex_defconfig +++ b/arch/arm/configs/msmcortex_defconfig @@ -4,6 +4,7 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y @@ -29,6 +30,7 @@ CONFIG_PROFILING=y CONFIG_OPROFILE=m CONFIG_KPROBES=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -42,6 +44,7 @@ CONFIG_ARCH_MSM8916=y CONFIG_ARCH_MSM8937=y CONFIG_ARCH_MSM8940=y CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_SDM450=y CONFIG_SMP=y CONFIG_SCHED_MC=y CONFIG_NR_CPUS=8 @@ -49,7 +52,6 @@ CONFIG_ARM_PSCI=y CONFIG_PREEMPT=y CONFIG_AEABI=y CONFIG_HIGHMEM=y -# CONFIG_HW_PERF_EVENTS is not set CONFIG_CMA=y CONFIG_CMA_DEBUGFS=y CONFIG_ZSMALLOC=y @@ -91,6 +93,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y @@ -162,6 +165,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -178,6 +182,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y @@ -249,6 +254,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y @@ -407,6 +413,7 @@ CONFIG_MSM_DBA_ADV7533=y CONFIG_FB_MSM_MDSS=y CONFIG_FB_MSM_MDSS_WRITEBACK=y CONFIG_FB_MSM_MDSS_HDMI_PANEL=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y CONFIG_BACKLIGHT_LCD_SUPPORT=y # CONFIG_LCD_CLASS_DEVICE is not set CONFIG_BACKLIGHT_CLASS_DEVICE=y @@ -544,9 +551,10 @@ CONFIG_MSM_SYSMON_COMM=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm/kernel/perf_event.c b/arch/arm/kernel/perf_event.c index 266cba46db3ef..b72a5f19c8b57 100644 --- a/arch/arm/kernel/perf_event.c +++ b/arch/arm/kernel/perf_event.c @@ -252,20 +252,29 @@ armpmu_add(struct perf_event *event, int flags) } static int -validate_event(struct pmu_hw_events *hw_events, - struct perf_event *event) +validate_event(struct pmu *pmu, struct pmu_hw_events *hw_events, + struct perf_event *event) { - struct arm_pmu *armpmu = to_arm_pmu(event->pmu); + struct arm_pmu *armpmu; if (is_software_event(event)) return 1; + /* + * Reject groups spanning multiple HW PMUs (e.g. CPU + CCI). The + * core perf code won't check that the pmu->ctx == leader->ctx + * until after pmu->event_init(event). + */ + if (event->pmu != pmu) + return 0; + if (event->state < PERF_EVENT_STATE_OFF) return 1; if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec) return 1; + armpmu = to_arm_pmu(event->pmu); return armpmu->get_event_idx(hw_events, event) >= 0; } @@ -283,15 +292,15 @@ validate_group(struct perf_event *event) memset(fake_used_mask, 0, sizeof(fake_used_mask)); fake_pmu.used_mask = fake_used_mask; - if (!validate_event(&fake_pmu, leader)) + if (!validate_event(event->pmu, &fake_pmu, leader)) return -EINVAL; list_for_each_entry(sibling, &leader->sibling_list, group_entry) { - if (!validate_event(&fake_pmu, sibling)) + if (!validate_event(event->pmu, &fake_pmu, sibling)) return -EINVAL; } - if (!validate_event(&fake_pmu, event)) + if (!validate_event(event->pmu, &fake_pmu, event)) return -EINVAL; return 0; diff --git a/arch/arm/kernel/perf_event_cpu.c b/arch/arm/kernel/perf_event_cpu.c index eb2c4d55666b4..e7418fe4cd9b3 100644 --- a/arch/arm/kernel/perf_event_cpu.c +++ b/arch/arm/kernel/perf_event_cpu.c @@ -230,6 +230,7 @@ static struct of_device_id cpu_pmu_of_device_ids[] = { {.compatible = "arm,arm1176-pmu", .data = armv6_1176_pmu_init}, {.compatible = "arm,arm1136-pmu", .data = armv6_1136_pmu_init}, {.compatible = "qcom,krait-pmu", .data = krait_pmu_init}, + {.compatible = "arm,armv8-pmuv3", .data = armv8_pmuv3_pmu_init}, {}, }; diff --git a/arch/arm/kernel/perf_event_v7.c b/arch/arm/kernel/perf_event_v7.c index 65e626da1da10..e505f1ebc2ecb 100644 --- a/arch/arm/kernel/perf_event_v7.c +++ b/arch/arm/kernel/perf_event_v7.c @@ -1042,6 +1042,16 @@ static int armv7_a15_pmu_init(struct arm_pmu *cpu_pmu) return 0; } +static int armv8_pmuv3_pmu_init(struct arm_pmu *cpu_pmu) +{ + armv7pmu_init(cpu_pmu); + cpu_pmu->name = "ARMv8 Cortex-A53"; + cpu_pmu->map_event = armv7_a7_map_event; + cpu_pmu->num_events = armv7_read_num_pmnc_events(); + cpu_pmu->set_event_filter = armv7pmu_set_event_filter; + return 0; +} + static int armv7_a7_pmu_init(struct arm_pmu *cpu_pmu) { armv7pmu_init(cpu_pmu); diff --git a/arch/arm/kernel/sys_oabi-compat.c b/arch/arm/kernel/sys_oabi-compat.c index e90a3148f3854..eb821e7b80f94 100644 --- a/arch/arm/kernel/sys_oabi-compat.c +++ b/arch/arm/kernel/sys_oabi-compat.c @@ -193,15 +193,44 @@ struct oabi_flock64 { pid_t l_pid; } __attribute__ ((packed,aligned(4))); -asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd, +static long do_locks(unsigned int fd, unsigned int cmd, unsigned long arg) { - struct oabi_flock64 user; struct flock64 kernel; - mm_segment_t fs = USER_DS; /* initialized to kill a warning */ - unsigned long local_arg = arg; - int ret; + struct oabi_flock64 user; + mm_segment_t fs; + long ret; + + if (copy_from_user(&user, (struct oabi_flock64 __user *)arg, + sizeof(user))) + return -EFAULT; + kernel.l_type = user.l_type; + kernel.l_whence = user.l_whence; + kernel.l_start = user.l_start; + kernel.l_len = user.l_len; + kernel.l_pid = user.l_pid; + + fs = get_fs(); + set_fs(KERNEL_DS); + ret = sys_fcntl64(fd, cmd, (unsigned long)&kernel); + set_fs(fs); + + if (!ret && (cmd == F_GETLK64 || cmd == F_OFD_GETLK)) { + user.l_type = kernel.l_type; + user.l_whence = kernel.l_whence; + user.l_start = kernel.l_start; + user.l_len = kernel.l_len; + user.l_pid = kernel.l_pid; + if (copy_to_user((struct oabi_flock64 __user *)arg, + &user, sizeof(user))) + ret = -EFAULT; + } + return ret; +} +asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd, + unsigned long arg) +{ switch (cmd) { case F_OFD_GETLK: case F_OFD_SETLK: @@ -209,39 +238,11 @@ asmlinkage long sys_oabi_fcntl64(unsigned int fd, unsigned int cmd, case F_GETLK64: case F_SETLK64: case F_SETLKW64: - if (copy_from_user(&user, (struct oabi_flock64 __user *)arg, - sizeof(user))) - return -EFAULT; - kernel.l_type = user.l_type; - kernel.l_whence = user.l_whence; - kernel.l_start = user.l_start; - kernel.l_len = user.l_len; - kernel.l_pid = user.l_pid; - local_arg = (unsigned long)&kernel; - fs = get_fs(); - set_fs(KERNEL_DS); - } - - ret = sys_fcntl64(fd, cmd, local_arg); + return do_locks(fd, cmd, arg); - switch (cmd) { - case F_GETLK64: - if (!ret) { - user.l_type = kernel.l_type; - user.l_whence = kernel.l_whence; - user.l_start = kernel.l_start; - user.l_len = kernel.l_len; - user.l_pid = kernel.l_pid; - if (copy_to_user((struct oabi_flock64 __user *)arg, - &user, sizeof(user))) - ret = -EFAULT; - } - case F_SETLK64: - case F_SETLKW64: - set_fs(fs); + default: + return sys_fcntl64(fd, cmd, arg); } - - return ret; } struct oabi_epoll_event { diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig index a79e021c9008c..5ced75c31e8c5 100644 --- a/arch/arm/mach-msm/Kconfig +++ b/arch/arm/mach-msm/Kconfig @@ -254,6 +254,38 @@ config ARCH_MSM8953 select ARCH_WANT_KMAP_ATOMIC_FLUSH select ARCH_MSM8953_SOC_SETTINGS +config ARCH_SDM450 + bool "SDM450" + select MSM_CORTEX_A53 + select ARCH_MSM_CORTEXMP + select CPU_V7 + select HAVE_SMP + select ARM_GIC + select MSM_IRQ + select SPARSE_IRQ + select MULTI_IRQ_HANDLER + select HAVE_ARM_ARCH_TIMER + select MAY_HAVE_SPARSE_IRQ + select PINCTRL + select PINCTRL_MSM_TLMM + select USE_PINCTRL_IRQ + select MSM_PM if PM + select QMI_ENCDEC + select CPU_FREQ + select CPU_FREQ_MSM + select PM_DEVFREQ + select MSM_DEVFREQ_DEVBW + select DEVFREQ_SIMPLE_DEV + select DEVFREQ_GOV_MSM_BW_HWMON + select MSM_BIMC_BWMON + select MSM_QDSP6V2_CODECS + select MSM_AUDIO_QDSP6V2 if SND_SOC + select ARM_HAS_SG_CHAIN + select MSM_RPM_SMD + select MSM_JTAGV8 if CORESIGHT_ETMV4 + select ARCH_WANT_KMAP_ATOMIC_FLUSH + select ARCH_MSM8953_SOC_SETTINGS + config ARCH_MSM8909 bool "MSM8909" select ARCH_MSM_CORTEXMP diff --git a/arch/arm/mach-msm/Makefile b/arch/arm/mach-msm/Makefile index 3e1a2b391af00..530c79e1a8726 100644 --- a/arch/arm/mach-msm/Makefile +++ b/arch/arm/mach-msm/Makefile @@ -8,6 +8,7 @@ obj-$(CONFIG_ARCH_MSM8920) += board-8920.o obj-$(CONFIG_ARCH_MSM8937) += board-8937.o obj-$(CONFIG_ARCH_MSM8940) += board-8940.o obj-$(CONFIG_ARCH_MSM8953) += board-8953.o +obj-$(CONFIG_ARCH_SDM450) += board-sdm450.o obj-$(CONFIG_ARCH_MSM8909) += board-8909.o #SMP diff --git a/arch/arm/mach-msm/board-sdm450.c b/arch/arm/mach-msm/board-sdm450.c new file mode 100644 index 0000000000000..92bc036325781 --- /dev/null +++ b/arch/arm/mach-msm/board-sdm450.c @@ -0,0 +1,32 @@ +/* + * 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 +#include +#include "board-dt.h" + +static const char *sdm450_dt_match[] __initconst = { + "qcom,sdm450", + NULL +}; + +static void __init sdm450_init(void) +{ + board_dt_populate(NULL); +} + +DT_MACHINE_START(SDM450_DT, + "Qualcomm Technologies, Inc. SDM450 (Flattened Device Tree)") + .init_machine = sdm450_init, + .dt_compat = sdm450_dt_match, +MACHINE_END diff --git a/arch/arm/mach-nspire/Makefile.boot b/arch/arm/mach-nspire/Makefile.boot deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/arch/arm/mm/context.c b/arch/arm/mm/context.c index 8d676f842d61d..c82b65ea71ee8 100644 --- a/arch/arm/mm/context.c +++ b/arch/arm/mm/context.c @@ -167,13 +167,28 @@ static void flush_context(unsigned int cpu) __flush_icache_all(); } -static int is_reserved_asid(u64 asid) +static bool check_update_reserved_asid(u64 asid, u64 newasid) { int cpu; - for_each_possible_cpu(cpu) - if (per_cpu(reserved_asids, cpu) == asid) - return 1; - return 0; + bool hit = false; + + /* + * Iterate over the set of reserved ASIDs looking for a match. + * If we find one, then we can update our mm to use newasid + * (i.e. the same ASID in the current generation) but we can't + * exit the loop early, since we need to ensure that all copies + * of the old ASID are updated to reflect the mm. Failure to do + * so could result in us missing the reserved ASID in a future + * generation. + */ + for_each_possible_cpu(cpu) { + if (per_cpu(reserved_asids, cpu) == asid) { + hit = true; + per_cpu(reserved_asids, cpu) = newasid; + } + } + + return hit; } static u64 new_context(struct mm_struct *mm, unsigned int cpu) @@ -182,37 +197,46 @@ static u64 new_context(struct mm_struct *mm, unsigned int cpu) u64 asid = atomic64_read(&mm->context.id); u64 generation = atomic64_read(&asid_generation); - if (asid != 0 && is_reserved_asid(asid)) { + if (asid != 0) { + u64 newasid = generation | (asid & ~ASID_MASK); + /* - * Our current ASID was active during a rollover, we can - * continue to use it and this was just a false alarm. + * If our current ASID was active during a rollover, we + * can continue to use it and this was just a false alarm. */ - asid = generation | (asid & ~ASID_MASK); - } else { + if (check_update_reserved_asid(asid, newasid)) + return newasid; + /* - * Allocate a free ASID. If we can't find one, take a - * note of the currently active ASIDs and mark the TLBs - * as requiring flushes. We always count from ASID #1, - * as we reserve ASID #0 to switch via TTBR0 and to - * avoid speculative page table walks from hitting in - * any partial walk caches, which could be populated - * from overlapping level-1 descriptors used to map both - * the module area and the userspace stack. + * We had a valid ASID in a previous life, so try to re-use + * it if possible., */ - asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, cur_idx); - if (asid == NUM_USER_ASIDS) { - generation = atomic64_add_return(ASID_FIRST_VERSION, - &asid_generation); - flush_context(cpu); - asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, 1); - } - __set_bit(asid, asid_map); - cur_idx = asid; - asid |= generation; - cpumask_clear(mm_cpumask(mm)); + asid &= ~ASID_MASK; + if (!__test_and_set_bit(asid, asid_map)) + return newasid; + } + + /* + * Allocate a free ASID. If we can't find one, take a note of the + * currently active ASIDs and mark the TLBs as requiring flushes. + * We always count from ASID #1, as we reserve ASID #0 to switch + * via TTBR0 and to avoid speculative page table walks from hitting + * in any partial walk caches, which could be populated from + * overlapping level-1 descriptors used to map both the module + * area and the userspace stack. + */ + asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, cur_idx); + if (asid == NUM_USER_ASIDS) { + generation = atomic64_add_return(ASID_FIRST_VERSION, + &asid_generation); + flush_context(cpu); + asid = find_next_zero_bit(asid_map, NUM_USER_ASIDS, 1); } - return asid; + __set_bit(asid, asid_map); + cur_idx = asid; + cpumask_clear(mm_cpumask(mm)); + return asid | generation; } void check_and_switch_context(struct mm_struct *mm, struct task_struct *tsk) diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c index b8c6ab8f2c15a..b46dc09b3a645 100644 --- a/arch/arm/mm/dma-mapping.c +++ b/arch/arm/mm/dma-mapping.c @@ -808,6 +808,7 @@ static void arm_dma_unremap(struct device *dev, void *remapped_addr, unsigned int flags = VM_ARM_DMA_CONSISTENT | VM_USERMAP; struct vm_struct *area; + size = PAGE_ALIGN(size); remapped_addr = (void *)((unsigned long)remapped_addr & PAGE_MASK); area = find_vm_area(remapped_addr); diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c index 407dc786583ae..4b4058db0781f 100644 --- a/arch/arm/mm/mmap.c +++ b/arch/arm/mm/mmap.c @@ -173,8 +173,7 @@ unsigned long arch_mmap_rnd(void) { unsigned long rnd; - /* 8 bits of randomness in 20 address space bits */ - rnd = (unsigned long)get_random_int() % (1 << 8); + rnd = (unsigned long)get_random_int() & ((1 << mmap_rnd_bits) - 1); return rnd << PAGE_SHIFT; } diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index c8a4162311848..737117b5d6af0 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -98,31 +98,31 @@ config MMU def_bool y config ARCH_MMAP_RND_BITS_MIN - default 14 if ARM64_64K_PAGES - default 16 if ARM64_16K_PAGES - default 18 + default 14 if ARM64_64K_PAGES + default 16 if ARM64_16K_PAGES + default 18 # max bits determined by the following formula: # VA_BITS - PAGE_SHIFT - 3 config ARCH_MMAP_RND_BITS_MAX - default 19 if ARM64_VA_BITS=36 - default 24 if ARM64_VA_BITS=39 - default 27 if ARM64_VA_BITS=42 - default 30 if ARM64_VA_BITS=47 - default 29 if ARM64_VA_BITS=48 && ARM64_64K_PAGES - default 31 if ARM64_VA_BITS=48 && ARM64_16K_PAGES - default 33 if ARM64_VA_BITS=48 - default 14 if ARM64_64K_PAGES - default 16 if ARM64_16K_PAGES - default 18 + default 19 if ARM64_VA_BITS=36 + default 24 if ARM64_VA_BITS=39 + default 27 if ARM64_VA_BITS=42 + default 30 if ARM64_VA_BITS=47 + default 29 if ARM64_VA_BITS=48 && ARM64_64K_PAGES + default 31 if ARM64_VA_BITS=48 && ARM64_16K_PAGES + default 33 if ARM64_VA_BITS=48 + default 14 if ARM64_64K_PAGES + default 16 if ARM64_16K_PAGES + default 18 config ARCH_MMAP_RND_COMPAT_BITS_MIN - default 7 if ARM64_64K_PAGES - default 9 if ARM64_16K_PAGES - default 11 + default 7 if ARM64_64K_PAGES + default 9 if ARM64_16K_PAGES + default 11 config ARCH_MMAP_RND_COMPAT_BITS_MAX - default 16 + default 16 config NO_IOPORT_MAP def_bool y if !PCI @@ -155,7 +155,7 @@ config GENERIC_HWEIGHT def_bool y config GENERIC_CSUM - def_bool y + def_bool y config GENERIC_CALIBRATE_DELAY def_bool y @@ -309,6 +309,14 @@ config ARCH_MSM8953 This enables support for the MSM8953 chipset. If you don't know what to do here, say N +config ARCH_SDM450 + bool "Enable Support for Qualcomm Technologies Inc SDM450" + depends on ARCH_MSM + select ARCH_MSM8953_SOC_SETTINGS + help + This enables support for the SDM450 chipset. If you don't + know what to do here, say N + config ARCH_MSM8937 bool "Enable Support for Qualcomm Technologies Inc MSM8937" depends on ARCH_MSM @@ -616,9 +624,9 @@ config ARM64_PGTABLE_LEVELS default 4 if ARM64_4K_PAGES && ARM64_VA_BITS_48 config CPU_BIG_ENDIAN - bool "Build big-endian kernel" - help - Say Y if you plan on running a kernel in big-endian mode. + bool "Build big-endian kernel" + help + Say Y if you plan on running a kernel in big-endian mode. config ARM64_SEV_IN_LOCK_UNLOCK bool "Add explicit SEV in the spinlock unlock code path" @@ -692,14 +700,14 @@ config HOTPLUG_CPU # a multiplatform kernel, we just want the highest value required by the # selected platforms. config ARCH_NR_GPIO - int - default 1024 if ARCH_TEGRA - default 1024 if ARCH_MSM - default 256 - help - Maximum number of GPIOs in the system. + int + default 1024 if ARCH_TEGRA + default 1024 if ARCH_MSM + default 256 + help + Maximum number of GPIOs in the system. - If unsure, leave the default value. + If unsure, leave the default value. source kernel/Kconfig.preempt @@ -774,6 +782,13 @@ config HAVE_ARCH_TRANSPARENT_HUGEPAGE config ARCH_HAS_CACHE_LINE_SIZE def_bool y +config BOOT_INFO + bool "Boot information from bootloader" + default y + help + On embedded linux device, we try to collect more information from + bootloader to kernel. eg. powerup reason. + source "mm/Kconfig" config SECCOMP @@ -941,7 +956,7 @@ config EFI help This option provides support for runtime services provided by UEFI firmware (such as non-volatile variables, realtime - clock, and platform reset). A UEFI stub is also provided to + clock, and platform reset). A UEFI stub is also provided to allow the kernel to be booted as an EFI application. This is only useful on systems that have UEFI firmware. diff --git a/arch/arm64/configs/S88503AC1-perf_defconfig b/arch/arm64/configs/S88503AC1-perf_defconfig new file mode 100644 index 0000000000000..b8928d39a9525 --- /dev/null +++ b/arch/arm64/configs/S88503AC1-perf_defconfig @@ -0,0 +1,731 @@ +CONFIG_LOCALVERSION="-perf" +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_NOCB_CPU=y +CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=n +CONFIG_CGROUPS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y +CONFIG_SCHED_QHMP=y +CONFIG_C3N_SMB358=y +CONFIG_NAMESPACES=y +CONFIG_LEDS_AW2013=y +CONFIG_LEDS_GPIO=y +CONFIG_VIB_GPIO=y +# CONFIG_UTS_NS is not set +# CONFIG_PID_NS is not set +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_ACL=y +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="cp850" +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_KALLSYMS_ALL=y +CONFIG_EMBEDDED=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PROFILING=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SIG=y +CONFIG_MODULE_SIG_FORCE=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ARCH_MSM=y +CONFIG_ARCH_MSM8916=y +CONFIG_ARCH_MSM8917=y +CONFIG_ARCH_MSM8920=y +CONFIG_ARCH_MSM8940=y +CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_MSM8937=y +CONFIG_ARCH_MSMCOBALT=y +CONFIG_PCI_MSM=y +CONFIG_SMP=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_CLEANCACHE=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_ZSMALLOC=y +CONFIG_RTMM=y +CONFIG_ZCACHE=y +CONFIG_PROCESS_RECLAIM=y +CONFIG_SECCOMP=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_SWP_EMULATION=y +CONFIG_CP15_BARRIER_EMULATION=y +CONFIG_SETEND_EMULATION=y +CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=0 +# CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_DEBUG=y +CONFIG_SUSPEND_TIME=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_FREQ=y +CONFIG_SCHED_FREQ_INPUT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM_USER=y +CONFIG_XFRM_STATISTICS=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_HARDIDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +CONFIG_NETFILTER_XT_TARGET_NOTRACK=y +CONFIG_NETFILTER_XT_TARGET_TEE=y +CONFIG_NETFILTER_XT_TARGET_TPROXY=y +CONFIG_NETFILTER_XT_TARGET_TRACE=y +CONFIG_NETFILTER_XT_TARGET_SECMARK=y +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_DSCP=y +CONFIG_NETFILTER_XT_MATCH_ESP=y +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NATTYPE_MODULE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_RAW=y +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +CONFIG_BRIDGE_NF_EBTABLES=y +CONFIG_BRIDGE_EBT_BROUTE=y +CONFIG_L2TP=y +CONFIG_L2TP_DEBUGFS=y +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=y +CONFIG_L2TP_ETH=y +CONFIG_BRIDGE=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=y +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CMP=y +CONFIG_NET_EMATCH_NBYTE=y +CONFIG_NET_EMATCH_U32=y +CONFIG_NET_EMATCH_META=y +CONFIG_NET_EMATCH_TEXT=y +CONFIG_NET_CLS_ACT=y +CONFIG_RMNET_DATA=y +CONFIG_RMNET_DATA_FC=y +CONFIG_RMNET_DATA_DEBUG_PKT=n +CONFIG_SOCKEV_NLMCAST=y +CONFIG_BT=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=y +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=y +CONFIG_MSM_BT_POWER=y +CONFIG_CFG80211=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_RFKILL=y +CONFIG_NFC_NQ=n +CONFIG_IPC_ROUTER=y +CONFIG_IPC_ROUTER_SECURITY=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +CONFIG_DMA_CMA=y +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_UID_STAT=y +CONFIG_QSEECOM=y +CONFIG_HDCP_QSEECOM=y +CONFIG_UID_CPUTIME=y +CONFIG_USB_EXT_TYPE_C_PERICOM=n +CONFIG_MSM_ULTRASOUND=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_UFSHCD=y +CONFIG_SCSI_UFSHCD_PLATFORM=y +CONFIG_SCSI_UFS_QCOM=y +CONFIG_SCSI_UFS_QCOM_ICE=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_REQ_CRYPT=y +CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y +CONFIG_NETDEVICES=y +CONFIG_DUMMY=y +CONFIG_TUN=y +CONFIG_RNDIS_IPA=y +CONFIG_MSM_RMNET_BAM=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOL2TP=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_WCNSS_CORE=y +CONFIG_WCNSS_CORE_PRONTO=y +CONFIG_WCNSS_REGISTER_DUMP_ON_BITE=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y +CONFIG_CNSS_CRYPTO=y +CONFIG_ATH_CARDS=y +CONFIG_WIL6210=m +CONFIG_CNSS=y +CONFIG_CLD_LL_CORE=y +CONFIG_BUS_AUTO_SUSPEND=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_INPUT_KEYRESET=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v26=y +CONFIG_TOUCHSCREEN_LOCKDOWN_INFO=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GEN_VKEYS=y +CONFIG_TOUCHSCREEN_FT5346=y +CONFIG_TOUCHSCREEN_GT915L=y +CONFIG_FT_SECURE_TOUCH=y +CONFIG_TOUCHSCREEN_MAXIM_STI=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_HBTP_INPUT=n +CONFIG_INPUT_KEYCHORD=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_GPIO=y +# CONFIG_VT is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_DEVMEM is not set +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_MSM_HS=n +CONFIG_SERIAL_MSM_HSL=n +CONFIG_SERIAL_MSM_HSL_CONSOLE=n +CONFIG_SERIAL_MSM_SMD=y +CONFIG_DIAG_CHAR=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_MSM_SMD_PKT=y +CONFIG_MSM_ADSPRPC=y +CONFIG_MSM_RDBG=m +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MSM_V2=y +CONFIG_SLIMBUS=y +CONFIG_SLIMBUS_MSM_NGD=y +CONFIG_SOUNDWIRE=y +CONFIG_SPI=y +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=m +CONFIG_PINCTRL_MSM8952=y +CONFIG_PINCTRL_MSM8937=y +CONFIG_PINCTRL_MSMCOBALT=y +CONFIG_PINCTRL_MSM8917=y +CONFIG_PINCTRL_MSM8940=y +CONFIG_PINCTRL_MSM8953=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_QPNP_PIN=y +CONFIG_SMB1351_USB_CHARGER=n +CONFIG_SMB135X_CHARGER=n +CONFIG_QPNP_SMBCHARGER=n +CONFIG_QPNP_FG=n +#CONFIG_BATTERY_BCL=y +#CONFIG_MSM_BCL_CTL=y +#CONFIG_MSM_BCL_PERIPHERAL_CTL=y +CONFIG_SMB358_CHARGER=y +CONFIG_BATTERY_CW2015=y +CONFIG_POWER_RESET_MSM=y +CONFIG_MSM_DLOAD_MODE=y +CONFIG_MSM_PM=y +CONFIG_MSM_APM=y +CONFIG_SENSORS_EPM_ADC=y +CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y +CONFIG_SENSORS_QPNP_ADC_CURRENT=y +CONFIG_THERMAL=y +CONFIG_THERMAL_TSENS8974=y +CONFIG_LIMITS_MONITOR=y +CONFIG_LIMITS_LITE_HW=y +CONFIG_THERMAL_MONITOR=y +CONFIG_THERMAL_QPNP=y +CONFIG_THERMAL_QPNP_ADC_TM=y +CONFIG_WCD9335_CODEC=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_STUB=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_MEM_ACC=y +CONFIG_REGULATOR_RPM_SMD=y +CONFIG_REGULATOR_QPNP=y +CONFIG_REGULATOR_QPNP_LABIBB=y +CONFIG_REGULATOR_SPM=y +CONFIG_REGULATOR_CPR=y +CONFIG_REGULATOR_CPR3_HMSS=y +CONFIG_REGULATOR_CPR3_MMSS=y +CONFIG_REGULATOR_KRYO=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_PLATFORM=y +CONFIG_MSM_VIDC_V4L2=y +CONFIG_MSM_VIDC_VMEM=y +CONFIG_MSM_VIDC_GOVERNORS=y +CONFIG_MSM_CAMERA=y +CONFIG_MSMB_CAMERA=y +CONFIG_MSM_CAMERA_SENSOR=y +CONFIG_MSM_CPP=y +CONFIG_MSM_CCI=y +CONFIG_MSM_CSI20_HEADER=y +CONFIG_MSM_CSI22_HEADER=y +CONFIG_MSM_CSI30_HEADER=y +CONFIG_MSM_CSI31_HEADER=y +CONFIG_MSM_CSIPHY=y +CONFIG_MSM_CSID=y +CONFIG_MSM_EEPROM=y +CONFIG_MSM_ISPIF=y +CONFIG_MSM_ISPIF_V2=y +CONFIG_IMX134=y +CONFIG_IMX132=y +CONFIG_OV9724=y +CONFIG_OV5648=y +CONFIG_GC0339=y +CONFIG_OV8825=y +CONFIG_OV8865=y +CONFIG_s5k4e1=y +CONFIG_OV12830=y +CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE=y +CONFIG_MSMB_JPEG=y +CONFIG_MSM_FD=y +CONFIG_RADIO_IRIS=y +CONFIG_RADIO_IRIS_TRANSPORT=y +CONFIG_RADIO_SILABS=y +CONFIG_MSM_KGSL=y +CONFIG_FB=y +CONFIG_FB_MSM=y +CONFIG_MSM_DBA=y +CONFIG_MSM_DBA_ADV7533=y +CONFIG_FB_MSM_MDSS=y +CONFIG_FB_MSM_MDSS_WRITEBACK=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_MSM8X16=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_APPLE=y +CONFIG_HID_ELECOM=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MSM=y +CONFIG_USB_EHCI_MSM_HSIC=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_DWC3=y +CONFIG_USB_SERIAL=y +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MSM_HSPHY=y +CONFIG_USB_MSM_SSPHY_QMP=y +CONFIG_MSM_QUSB_PHY=y +CONFIG_DUAL_ROLE_USB_INTF=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_DEBUG_FS=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_CI13XXX_MSM=y +CONFIG_USB_G_ANDROID=y +CONFIG_MMC=y +CONFIG_MMC_PERF_PROFILING=n +CONFIG_MMC_CLKGATE=y +CONFIG_MMC_PARANOID_SD_INIT=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +CONFIG_MMC_TEST=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +CONFIG_MMC_CQ_HCI=y +CONFIG_LEDS_QPNP=y +CONFIG_LEDS_QPNP_FLASH=y +CONFIG_LEDS_QPNP_WLED=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_SWITCH=y +CONFIG_EDAC=y +CONFIG_EDAC_MM_EDAC=y +CONFIG_EDAC_CORTEX_ARM64=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_CE=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_QPNP=y +CONFIG_DMADEVICES=y +CONFIG_QCOM_SPS_DMA=y +CONFIG_UIO=y +CONFIG_UIO_MSM_SHAREDMEM=y +CONFIG_STAGING=y +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_TIMED_GPIO=y +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_SW_SYNC_USER=y +CONFIG_ION=y +CONFIG_ION_MSM=y +CONFIG_MSM_AVTIMER=y +CONFIG_MSM_BUS_SCALING=y +CONFIG_BUS_TOPOLOGY_ADHOC=y +CONFIG_QPNP_POWER_ON=y +CONFIG_QPNP_REVID=y +CONFIG_QPNP_COINCELL=y +CONFIG_SPS=y +CONFIG_USB_BAM=y +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_IPA=y +CONFIG_RMNET_IPA=y +CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y +CONFIG_MSM_SPMI=y +CONFIG_MSM_SPMI_PMIC_ARB=y +CONFIG_MSM_QPNP_INT=y +CONFIG_CP_ACCESS64=y +CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_MSM_MEMORY_DUMP_V2=y +CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CPUSS_DUMP=y +CONFIG_MSM_COMMON_LOG=y +CONFIG_MSM_DDR_HEALTH=y +CONFIG_MSM_WATCHDOG_V2=y +CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y +CONFIG_MSM_RPM_SMD=y +CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG=y +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_STATS_LOG=y +CONFIG_MSM_RUN_QUEUE_STATS=y +CONFIG_MSM_SCM=y +CONFIG_MSM_SCM_XPU=y +CONFIG_MSM_MPM_OF=y +CONFIG_MSM_SMEM=y +CONFIG_MSM_SMD=y +CONFIG_MSM_SMD_DEBUG=n +CONFIG_MSM_GLINK=y +CONFIG_MSM_GLINK_LOOPBACK_SERVER=y +CONFIG_MSM_GLINK_SMD_XPRT=y +CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y +CONFIG_MSM_SMEM_LOGGING=y +CONFIG_MSM_SMP2P=y +CONFIG_MSM_SMP2P_TEST=y +CONFIG_MSM_SPM=y +CONFIG_MSM_L2_SPM=y +CONFIG_MSM_QMI_INTERFACE=y +CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y +CONFIG_MSM_EVENT_TIMER=y +CONFIG_MSM_SUBSYSTEM_RESTART=y +CONFIG_MSM_SYSMON_COMM=y +CONFIG_MSM_PIL=y +CONFIG_MSM_PIL_SSR_GENERIC=y +CONFIG_MSM_PIL_MSS_QDSP6V5=y +CONFIG_MSM_BAM_DMUX=y +CONFIG_MSM_PERFORMANCE=y +# CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y +CONFIG_MEM_SHARE_QMI_SERVICE=y +CONFIG_MSM_CLK_CONTROLLER_V2=y +CONFIG_MSM_MDSS_PLL=y +CONFIG_REMOTE_SPINLOCK_MSM=y +CONFIG_MSM_IOMMU_V1=y +CONFIG_ARM_SMMU=y +CONFIG_IOMMU_DEBUG=y +CONFIG_IOMMU_TESTS=y +CONFIG_SPDM_SCM=y +CONFIG_DEVFREQ_SPDM=y +CONFIG_PWM=y +CONFIG_PWM_QPNP=y +CONFIG_ARM_GIC_PANIC_HANDLER=y +CONFIG_CORESIGHT=n +CONFIG_CORESIGHT_EVENT=n +CONFIG_CORESIGHT_FUSE=n +CONFIG_CORESIGHT_CTI=n +CONFIG_CORESIGHT_CTI_SAVE_DISABLE=n +CONFIG_CORESIGHT_TMC=n +CONFIG_CORESIGHT_TPIU=n +CONFIG_CORESIGHT_FUNNEL=n +CONFIG_CORESIGHT_REPLICATOR=n +CONFIG_CORESIGHT_STM=n +CONFIG_CORESIGHT_HWEVENT=n +CONFIG_SENSORS_SSC=y +CONFIG_MSM_TZ_LOG=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_INFO=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_RECURSIVE_FAULT=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_IPC_LOGGING=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_DEBUG_RODATA=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_LSM_MMAP_MIN_ADDR=4096 +CONFIG_SECURITY_SELINUX=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_DEV_QCRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_MSM_QCE=y +CONFIG_CRYPTO_DEV_QCEDEV=y +CONFIG_CRYPTO_DEV_OTA_CRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_ICE=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_QMI_ENCDEC=y +CONFIG_REGULATOR_TPS65132=y +CONFIG_SND_SOC_AW87319=y +CONFIG_SERIAL_NUM=y +CONFIG_SECBOOT_FUSE=y +CONFIG_PSTORE=y +CONFIG_PSTORE_CONSOLE=y +CONFIG_PSTORE_FTRACE=y +CONFIG_PSTORE_RAM=y +CONFIG_PSTORE_LAST_KMSG=y +CONFIG_CPUMAXFREQ=y +## MIUI ADD:START +## Multi userspace config support +CONFIG_ECRYPT_FS=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XTS=y +CONFIG_NAMESPACES=y +#CONFIG_UTS_NS=y +#CONFIG_IPC_NS=y +## do not turn on user-namespaces as it enables +## CONFIG_UIDGID_STRICT_TYPE_CHECKS, which results in several compile +## errors +#CONFIG_USER_NS=y +#CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_VETH=y +## END +CONFIG_DISABLE_TEMP_PROTECT=n +CONFIG_DIFFERENT_TP_COLOR=y +CONFIG_COLOFUL_RGB_FOR_PROJECT=y + +CONFIG_MSM_RTB=y +CONFIG_MSM_RTB_SEPARATE_CPUS=y + +ONFIG_ZRAM_DEBUG=y +CONFIG_SWAP=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_ANDROID_WHETSTONE=y +CONFIG_CGROUP_MEM_RES_CTLR=y +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y + +CONFIG_DUMP_ALL_STACKS=y +# CONFIG_FIRE_WATCHDOG is not set + +# sdcardfs +CONFIG_SDCARD_FS=y diff --git a/arch/arm64/configs/S88505AA1-perf_defconfig b/arch/arm64/configs/S88505AA1-perf_defconfig new file mode 100644 index 0000000000000..0db762863b3db --- /dev/null +++ b/arch/arm64/configs/S88505AA1-perf_defconfig @@ -0,0 +1,755 @@ +CONFIG_LOCALVERSION="-perf" +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_NOCB_CPU=y +CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=n +CONFIG_CGROUPS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_CPUSETS=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y +CONFIG_C3B_BQ2560X=y +CONFIG_CHARGER_BQ2560=y +CONFIG_GAUGE_BQ27426=y +CONFIG_DISABLE_TEMP_PROTECT=n +CONFIG_SCHED_QHMP=y +CONFIG_NAMESPACES=y +CONFIG_LEDS_AW2013=y +CONFIG_LEDS_GPIO=y +CONFIG_VIB_GPIO=y +# CONFIG_UTS_NS is not set +# CONFIG_PID_NS is not set +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +CONFIG_RTMM=y +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_ACL=y +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="cp850" +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_KALLSYMS_ALL=y +CONFIG_EMBEDDED=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PROFILING=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SIG=y +CONFIG_MODULE_SIG_FORCE=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ARCH_MSM=y +CONFIG_ARCH_MSM8916=y +CONFIG_ARCH_MSM8917=y +CONFIG_ARCH_MSM8920=y +CONFIG_ARCH_MSM8940=y +CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_MSM8937=y +CONFIG_ARCH_MSMCOBALT=y +CONFIG_PCI_MSM=y +CONFIG_SMP=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_CLEANCACHE=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_ZSMALLOC=y +CONFIG_ZCACHE=y +CONFIG_PROCESS_RECLAIM=y +CONFIG_SECCOMP=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_SWP_EMULATION=y +CONFIG_CP15_BARRIER_EMULATION=y +CONFIG_SETEND_EMULATION=y +CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=0 +# CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_DEBUG=n +CONFIG_SUSPEND_TIME=y +CONFIG_SUSPEND_SKIP_SYNC=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_FREQ=y +CONFIG_SCHED_FREQ_INPUT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM=y +CONFIG_XFRM_USER=y +CONFIG_XFRM_STATISTICS=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +CONFIG_INET_XFRM_TUNNEL=y +CONFIG_INET_XFRM_MODE_TRANSPORT=y +CONFIG_INET_XFRM_MODE_TUNNEL=y +CONFIG_INET_XFRM_MODE_BEET=y +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_HARDIDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +CONFIG_NETFILTER_XT_TARGET_NOTRACK=y +CONFIG_NETFILTER_XT_TARGET_TEE=y +CONFIG_NETFILTER_XT_TARGET_TPROXY=y +CONFIG_NETFILTER_XT_TARGET_TRACE=y +CONFIG_NETFILTER_XT_TARGET_SECMARK=y +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_DSCP=y +CONFIG_NETFILTER_XT_MATCH_ESP=y +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NATTYPE_MODULE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_RAW=y +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +CONFIG_BRIDGE_NF_EBTABLES=y +CONFIG_BRIDGE_EBT_BROUTE=y +CONFIG_L2TP=y +CONFIG_L2TP_DEBUGFS=y +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=y +CONFIG_L2TP_ETH=y +CONFIG_BRIDGE=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=y +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CMP=y +CONFIG_NET_EMATCH_NBYTE=y +CONFIG_NET_EMATCH_U32=y +CONFIG_NET_EMATCH_META=y +CONFIG_NET_EMATCH_TEXT=y +CONFIG_NET_CLS_ACT=y +CONFIG_RMNET_DATA=y +CONFIG_RMNET_DATA_FC=y +#CONFIG_RMNET_DATA_DEBUG_PKT=y +CONFIG_SOCKEV_NLMCAST=y +CONFIG_BT=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=y +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=y +CONFIG_MSM_BT_POWER=y +CONFIG_CFG80211=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_RFKILL=y +CONFIG_NFC_NQ=n +CONFIG_IPC_ROUTER=y +CONFIG_IPC_ROUTER_SECURITY=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +CONFIG_DMA_CMA=y +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_UID_STAT=y +CONFIG_QSEECOM=y +CONFIG_HDCP_QSEECOM=y +CONFIG_UID_CPUTIME=y +CONFIG_USB_EXT_TYPE_C_PERICOM=n +CONFIG_MSM_ULTRASOUND=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_UFSHCD=y +CONFIG_SCSI_UFSHCD_PLATFORM=y +CONFIG_SCSI_UFS_QCOM=y +CONFIG_SCSI_UFS_QCOM_ICE=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_REQ_CRYPT=y +CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y +CONFIG_NETDEVICES=y +CONFIG_DUMMY=y +CONFIG_TUN=y +CONFIG_RNDIS_IPA=y +CONFIG_MSM_RMNET_BAM=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOATM=m +CONFIG_PPPOL2TP=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_WCNSS_CORE=y +CONFIG_WCNSS_CORE_PRONTO=y +CONFIG_WCNSS_REGISTER_DUMP_ON_BITE=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y +CONFIG_CNSS_CRYPTO=y +CONFIG_ATH_CARDS=y +CONFIG_WIL6210=m +CONFIG_CNSS=y +CONFIG_CLD_LL_CORE=y +CONFIG_BUS_AUTO_SUSPEND=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_INPUT_KEYRESET=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v26=y +CONFIG_TOUCHSCREEN_LOCKDOWN_INFO=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GEN_VKEYS=y +CONFIG_TOUCHSCREEN_FT5346=y +CONFIG_TOUCHSCREEN_GT917D=y +CONFIG_FT_SECURE_TOUCH=y +CONFIG_TOUCHSCREEN_MAXIM_STI=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_HBTP_INPUT=n +CONFIG_INPUT_KEYCHORD=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_GPIO=y +# CONFIG_VT is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_DEVMEM is not set +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_MSM_HS=n +CONFIG_SERIAL_MSM_HSL=n +CONFIG_SERIAL_MSM_HSL_CONSOLE=n +CONFIG_SERIAL_MSM_SMD=y +CONFIG_DIAG_CHAR=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_MSM_SMD_PKT=y +CONFIG_MSM_ADSPRPC=y +CONFIG_MSM_RDBG=m +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MSM_V2=y +CONFIG_SLIMBUS=y +CONFIG_SLIMBUS_MSM_NGD=y +CONFIG_SOUNDWIRE=y +CONFIG_SPI=y +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=y +CONFIG_PINCTRL_MSM8952=y +CONFIG_PINCTRL_MSM8937=y +CONFIG_PINCTRL_MSMCOBALT=y +CONFIG_PINCTRL_MSM8917=y +CONFIG_PINCTRL_MSM8940=y +CONFIG_PINCTRL_MSM8953=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_QPNP_PIN=y +CONFIG_SMB1351_USB_CHARGER=n +CONFIG_SMB135X_CHARGER=n +CONFIG_QPNP_SMBCHARGER=n +CONFIG_QPNP_FG=n +#CONFIG_BATTERY_BCL=y +#CONFIG_MSM_BCL_CTL=y +#CONFIG_MSM_BCL_PERIPHERAL_CTL=y +CONFIG_SMB358_CHARGER=n +CONFIG_BATTERY_CW2015=n +CONFIG_POWER_RESET_MSM=y +CONFIG_MSM_DLOAD_MODE=y +CONFIG_MSM_PM=y +CONFIG_MSM_APM=y +CONFIG_SENSORS_EPM_ADC=y +CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y +CONFIG_SENSORS_QPNP_ADC_CURRENT=y +CONFIG_THERMAL=y +CONFIG_THERMAL_TSENS8974=y +CONFIG_LIMITS_MONITOR=y +CONFIG_LIMITS_LITE_HW=y +CONFIG_THERMAL_MONITOR=y +CONFIG_THERMAL_QPNP=y +CONFIG_THERMAL_QPNP_ADC_TM=y +CONFIG_WCD9335_CODEC=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_STUB=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_MEM_ACC=y +CONFIG_REGULATOR_RPM_SMD=y +CONFIG_REGULATOR_QPNP=y +CONFIG_REGULATOR_QPNP_LABIBB=y +CONFIG_REGULATOR_SPM=y +CONFIG_REGULATOR_CPR=y +CONFIG_REGULATOR_CPR3_HMSS=y +CONFIG_REGULATOR_CPR3_MMSS=y +CONFIG_REGULATOR_KRYO=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_PLATFORM=y +CONFIG_MSM_VIDC_V4L2=y +CONFIG_MSM_VIDC_VMEM=y +CONFIG_MSM_VIDC_GOVERNORS=y +CONFIG_MSM_CAMERA=y +CONFIG_MSMB_CAMERA=y +CONFIG_MSM_CAMERA_SENSOR=y +CONFIG_MSM_CPP=y +CONFIG_MSM_CCI=y +CONFIG_MSM_CSI20_HEADER=y +CONFIG_MSM_CSI22_HEADER=y +CONFIG_MSM_CSI30_HEADER=y +CONFIG_MSM_CSI31_HEADER=y +CONFIG_MSM_CSIPHY=y +CONFIG_MSM_CSID=y +CONFIG_MSM_EEPROM=y +CONFIG_MSM_ISPIF=y +CONFIG_MSM_ISPIF_V2=y +CONFIG_IMX134=y +CONFIG_IMX132=y +CONFIG_OV9724=y +CONFIG_OV5648=y +CONFIG_GC0339=y +CONFIG_OV8825=y +CONFIG_OV8865=y +CONFIG_s5k4e1=y +CONFIG_OV12830=y +CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE=y +CONFIG_MSMB_JPEG=y +CONFIG_MSM_FD=y +CONFIG_RADIO_IRIS=y +CONFIG_RADIO_IRIS_TRANSPORT=y +CONFIG_RADIO_SILABS=y +CONFIG_MSM_KGSL=y +CONFIG_FB=y +CONFIG_FB_MSM=y +CONFIG_MSM_DBA=y +CONFIG_MSM_DBA_ADV7533=y +CONFIG_FB_MSM_MDSS=y +CONFIG_FB_MSM_MDSS_WRITEBACK=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=n +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_MSM8X16=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_APPLE=y +CONFIG_HID_ELECOM=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MSM=y +CONFIG_USB_EHCI_MSM_HSIC=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_DWC3=y +CONFIG_USB_SERIAL=y +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MSM_HSPHY=y +CONFIG_USB_MSM_SSPHY_QMP=y +CONFIG_MSM_QUSB_PHY=y +CONFIG_DUAL_ROLE_USB_INTF=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_DEBUG_FS=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_CI13XXX_MSM=y +CONFIG_USB_G_ANDROID=y +CONFIG_MMC=y +#CONFIG_MMC_PERF_PROFILING=y +CONFIG_MMC_CLKGATE=y +CONFIG_MMC_PARANOID_SD_INIT=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +CONFIG_MMC_TEST=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +CONFIG_MMC_CQ_HCI=y +CONFIG_LEDS_QPNP=y +CONFIG_LEDS_QPNP_FLASH=y +CONFIG_LEDS_QPNP_WLED=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_SWITCH=y +CONFIG_EDAC=y +CONFIG_EDAC_MM_EDAC=y +CONFIG_EDAC_CORTEX_ARM64=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_CE=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_QPNP=y +CONFIG_DMADEVICES=y +CONFIG_QCOM_SPS_DMA=y +CONFIG_UIO=y +CONFIG_UIO_MSM_SHAREDMEM=y +CONFIG_STAGING=y +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_TIMED_GPIO=y +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_SW_SYNC_USER=y +CONFIG_ION=y +CONFIG_ION_MSM=y +CONFIG_MSM_AVTIMER=y +CONFIG_MSM_BUS_SCALING=y +CONFIG_BUS_TOPOLOGY_ADHOC=y +CONFIG_QPNP_POWER_ON=y +CONFIG_QPNP_REVID=y +CONFIG_QPNP_COINCELL=y +CONFIG_SPS=y +CONFIG_USB_BAM=y +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_IPA=y +CONFIG_RMNET_IPA=y +CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y +CONFIG_MSM_SPMI=y +CONFIG_MSM_SPMI_PMIC_ARB=y +CONFIG_MSM_QPNP_INT=y +CONFIG_CP_ACCESS64=y +CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_MSM_MEMORY_DUMP_V2=y +CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CPUSS_DUMP=y +CONFIG_MSM_COMMON_LOG=y +CONFIG_MSM_DDR_HEALTH=y +CONFIG_MSM_WATCHDOG_V2=y +CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y +CONFIG_MSM_RPM_SMD=y +CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG=y +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_STATS_LOG=y +CONFIG_MSM_RUN_QUEUE_STATS=y +CONFIG_MSM_SCM=y +CONFIG_MSM_SCM_XPU=y +CONFIG_MSM_MPM_OF=y +CONFIG_MSM_SMEM=y +CONFIG_MSM_SMD=y +#CONFIG_MSM_SMD_DEBUG=y +CONFIG_MSM_GLINK=y +CONFIG_MSM_GLINK_LOOPBACK_SERVER=y +CONFIG_MSM_GLINK_SMD_XPRT=y +CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y +CONFIG_MSM_SMEM_LOGGING=y +CONFIG_MSM_SMP2P=y +CONFIG_MSM_SMP2P_TEST=y +CONFIG_MSM_SPM=y +CONFIG_MSM_L2_SPM=y +CONFIG_MSM_QMI_INTERFACE=y +CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y +CONFIG_MSM_EVENT_TIMER=y +CONFIG_MSM_SUBSYSTEM_RESTART=y +CONFIG_MSM_SYSMON_COMM=y +CONFIG_MSM_PIL=y +CONFIG_MSM_PIL_SSR_GENERIC=y +CONFIG_MSM_PIL_MSS_QDSP6V5=y +CONFIG_MSM_BAM_DMUX=y +CONFIG_MSM_PERFORMANCE=y +# CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y +CONFIG_MEM_SHARE_QMI_SERVICE=y +CONFIG_MSM_CLK_CONTROLLER_V2=y +CONFIG_MSM_MDSS_PLL=y +CONFIG_REMOTE_SPINLOCK_MSM=y +CONFIG_MSM_IOMMU_V1=y +CONFIG_ARM_SMMU=y +CONFIG_IOMMU_DEBUG=n +CONFIG_IOMMU_TESTS=n +CONFIG_SPDM_SCM=y +CONFIG_DEVFREQ_SPDM=y +CONFIG_PWM=y +CONFIG_PWM_QPNP=y +CONFIG_ARM_GIC_PANIC_HANDLER=y +CONFIG_CORESIGHT=n +CONFIG_CORESIGHT_EVENT=n +CONFIG_CORESIGHT_FUSE=n +CONFIG_CORESIGHT_CTI=n +CONFIG_CORESIGHT_CTI_SAVE_DISABLE=n +CONFIG_CORESIGHT_TMC=n +CONFIG_CORESIGHT_TPIU=n +CONFIG_CORESIGHT_FUNNEL=n +CONFIG_CORESIGHT_REPLICATOR=n +CONFIG_CORESIGHT_STM=n +CONFIG_CORESIGHT_HWEVENT=n +CONFIG_SENSORS_SSC=y +CONFIG_MSM_TZ_LOG=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DEBUG_INFO=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_RECURSIVE_FAULT=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_IPC_LOGGING=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_DEBUG_RODATA=n +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_LSM_MMAP_MIN_ADDR=4096 +CONFIG_SECURITY_SELINUX=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_DEV_QCRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_MSM_QCE=y +CONFIG_CRYPTO_DEV_QCEDEV=y +CONFIG_CRYPTO_DEV_OTA_CRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_ICE=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_QMI_ENCDEC=y +CONFIG_SERIAL_NUM=y +CONFIG_SECBOOT_FUSE=y +CONFIG_REGULATOR_TPS65132=y +CONFIG_SND_SOC_AW87319=y +CONFIG_PSTORE=y +CONFIG_PSTORE_CONSOLE=y +CONFIG_PSTORE_PMSG=y +CONFIG_PSTORE_FTRACE=y +CONFIG_PSTORE_RAM=y +CONFIG_PSTORE_LAST_KMSG=y +CONFIG_CPUMAXFREQ=y +## MIUI ADD:START +## Multi userspace config support +CONFIG_ECRYPT_FS=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XTS=y +CONFIG_NAMESPACES=y +CONFIG_XFRM_MIGRATE=y +CONFIG_NET_KEY_MIGRATE=y + +#CONFIG_UTS_NS=y +#CONFIG_IPC_NS=y +## do not turn on user-namespaces as it enables +## CONFIG_UIDGID_STRICT_TYPE_CHECKS, which results in several compile +## errors +#CONFIG_USER_NS=y +#CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_VETH=y +## END + +#CONFIG_ZRAM_DEBUG=y +CONFIG_SWAP=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_ANDROID_WHETSTONE=y +CONFIG_CGROUP_MEM_RES_CTLR=y +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y + +#MIUI ADD +#Add CIFS Config +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_UTF8=y +#MIUI END + +CONFIG_BOOT_INFO=y +CONFIG_OF_FLATTREE=y + +CONFIG_DUMP_ALL_STACKS=y +# CONFIG_FIRE_WATCHDOG is not set + +# sdcardfs +CONFIG_SDCARD_FS=y diff --git a/arch/arm64/configs/S88536AA2-perf_defconfig b/arch/arm64/configs/S88536AA2-perf_defconfig new file mode 100644 index 0000000000000..dda1b31487f26 --- /dev/null +++ b/arch/arm64/configs/S88536AA2-perf_defconfig @@ -0,0 +1,727 @@ +CONFIG_LOCALVERSION="-perf" +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_NOCB_CPU=y +CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=n +CONFIG_CGROUPS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_CPUSETS=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y +CONFIG_SCHED_QHMP=y +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_PID_NS is not set +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_ACL=y +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="cp850" +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_KALLSYMS_ALL=y +CONFIG_PSTORE_LAST_KMSG=y +CONFIG_EMBEDDED=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PROFILING=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SIG=y +CONFIG_MODULE_SIG_FORCE=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ARCH_MSM=y +CONFIG_ARCH_MSM8916=y +CONFIG_ARCH_MSM8917=y +CONFIG_ARCH_MSM8920=y +CONFIG_ARCH_MSM8940=y +CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_MSM8937=y +CONFIG_ARCH_MSMCOBALT=y +CONFIG_PCI_MSM=y +CONFIG_SMP=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_CLEANCACHE=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_ZSMALLOC=y +CONFIG_ZSMALLOC_STAT=y +CONFIG_ZCACHE=y +CONFIG_PROCESS_RECLAIM=y +CONFIG_SECCOMP=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_SWP_EMULATION=y +CONFIG_CP15_BARRIER_EMULATION=y +CONFIG_SETEND_EMULATION=y +CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=0 +# CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_DEBUG=y +CONFIG_SUSPEND_TIME=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_FREQ=y +CONFIG_SCHED_FREQ_INPUT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM_USER=y +CONFIG_XFRM_STATISTICS=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_HARDIDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +CONFIG_NETFILTER_XT_TARGET_NOTRACK=y +CONFIG_NETFILTER_XT_TARGET_TEE=y +CONFIG_NETFILTER_XT_TARGET_TPROXY=y +CONFIG_NETFILTER_XT_TARGET_TRACE=y +CONFIG_NETFILTER_XT_TARGET_SECMARK=y +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_DSCP=y +CONFIG_NETFILTER_XT_MATCH_ESP=y +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NATTYPE_MODULE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_RAW=y +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +CONFIG_BRIDGE_NF_EBTABLES=y +CONFIG_BRIDGE_EBT_BROUTE=y +CONFIG_L2TP=y +CONFIG_L2TP_DEBUGFS=y +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=y +CONFIG_L2TP_ETH=y +CONFIG_BRIDGE=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=y +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CMP=y +CONFIG_NET_EMATCH_NBYTE=y +CONFIG_NET_EMATCH_U32=y +CONFIG_NET_EMATCH_META=y +CONFIG_NET_EMATCH_TEXT=y +CONFIG_NET_CLS_ACT=y +CONFIG_RMNET_DATA=y +CONFIG_RMNET_DATA_FC=y +CONFIG_RMNET_DATA_DEBUG_PKT=n +CONFIG_SOCKEV_NLMCAST=y +CONFIG_BT=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=y +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=y +CONFIG_MSM_BT_POWER=y +CONFIG_CFG80211=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_RFKILL=y +CONFIG_NFC_NQ=y +CONFIG_IPC_ROUTER=y +CONFIG_IPC_ROUTER_SECURITY=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +CONFIG_DMA_CMA=y +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_UID_STAT=y +CONFIG_QSEECOM=y +CONFIG_HDCP_QSEECOM=y +CONFIG_UID_CPUTIME=y +CONFIG_USB_EXT_TYPE_C_PERICOM=y +CONFIG_MSM_ULTRASOUND=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_UFSHCD=y +CONFIG_SCSI_UFSHCD_PLATFORM=y +CONFIG_SCSI_UFS_QCOM=y +CONFIG_SCSI_UFS_QCOM_ICE=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_REQ_CRYPT=y +CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y +CONFIG_NETDEVICES=y +CONFIG_DUMMY=y +CONFIG_TUN=y +CONFIG_RNDIS_IPA=y +CONFIG_MSM_RMNET_BAM=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOL2TP=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_WCNSS_CORE=y +CONFIG_WCNSS_CORE_PRONTO=y +CONFIG_WCNSS_REGISTER_DUMP_ON_BITE=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y +CONFIG_CNSS_CRYPTO=y +CONFIG_ATH_CARDS=y +CONFIG_WIL6210=m +CONFIG_CNSS=y +CONFIG_CLD_LL_CORE=y +CONFIG_BUS_AUTO_SUSPEND=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_INPUT_KEYRESET=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v26=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GEN_VKEYS=y +CONFIG_TOUCHSCREEN_FT5336=y +CONFIG_FT_SECURE_TOUCH=y +CONFIG_TOUCHSCREEN_MAXIM_STI=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_HBTP_INPUT=n +CONFIG_INPUT_KEYCHORD=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_GPIO=y +# CONFIG_VT is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_DEVMEM is not set +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_MSM_HS=y +CONFIG_SERIAL_MSM_SMD=y +CONFIG_DIAG_CHAR=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_MSM_SMD_PKT=y +CONFIG_MSM_ADSPRPC=y +CONFIG_MSM_RDBG=m +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MSM_V2=y +CONFIG_SLIMBUS=y +CONFIG_SLIMBUS_MSM_NGD=y +CONFIG_SOUNDWIRE=y +CONFIG_SPI=y +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=m +CONFIG_PINCTRL_MSM8952=y +CONFIG_PINCTRL_MSM8937=y +CONFIG_PINCTRL_MSMCOBALT=y +CONFIG_PINCTRL_MSM8917=y +CONFIG_PINCTRL_MSM8940=y +CONFIG_PINCTRL_MSM8953=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_QPNP_PIN=y +CONFIG_SMB1351_USB_CHARGER=n +CONFIG_SMB135X_CHARGER=n +CONFIG_QPNP_SMBCHARGER=y +CONFIG_QPNP_FG=y +CONFIG_BATTERY_BCL=y +CONFIG_MSM_BCL_CTL=y +CONFIG_MSM_BCL_PERIPHERAL_CTL=y +CONFIG_POWER_RESET_MSM=y +CONFIG_MSM_DLOAD_MODE=y +CONFIG_MSM_PM=y +CONFIG_MSM_APM=y +CONFIG_SENSORS_EPM_ADC=y +CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y +CONFIG_SENSORS_QPNP_ADC_CURRENT=y +CONFIG_THERMAL=y +CONFIG_THERMAL_TSENS8974=y +CONFIG_LIMITS_MONITOR=y +CONFIG_LIMITS_LITE_HW=y +CONFIG_THERMAL_MONITOR=y +CONFIG_THERMAL_QPNP=y +CONFIG_THERMAL_QPNP_ADC_TM=y +CONFIG_WCD9335_CODEC=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_STUB=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_MEM_ACC=y +CONFIG_REGULATOR_RPM_SMD=y +CONFIG_REGULATOR_QPNP=y +CONFIG_REGULATOR_QPNP_LABIBB=y +CONFIG_REGULATOR_SPM=y +CONFIG_REGULATOR_CPR=y +CONFIG_REGULATOR_CPR3_HMSS=y +CONFIG_REGULATOR_CPR3_MMSS=y +CONFIG_REGULATOR_KRYO=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_PLATFORM=y +CONFIG_MSM_VIDC_V4L2=y +CONFIG_MSM_VIDC_VMEM=y +CONFIG_MSM_VIDC_GOVERNORS=y +CONFIG_MSM_CAMERA=y +CONFIG_MSMB_CAMERA=y +CONFIG_MSM_CAMERA_SENSOR=y +CONFIG_MSM_CPP=y +CONFIG_MSM_CCI=y +CONFIG_MSM_CSI20_HEADER=y +CONFIG_MSM_CSI22_HEADER=y +CONFIG_MSM_CSI30_HEADER=y +CONFIG_MSM_CSI31_HEADER=y +CONFIG_MSM_CSIPHY=y +CONFIG_MSM_CSID=y +CONFIG_MSM_EEPROM=y +CONFIG_MSM_ISPIF=y +CONFIG_MSM_ISPIF_V2=y +CONFIG_IMX134=y +CONFIG_IMX132=y +CONFIG_OV9724=y +CONFIG_OV5648=y +CONFIG_GC0339=y +CONFIG_OV8825=y +CONFIG_OV8865=y +CONFIG_s5k4e1=y +CONFIG_OV12830=y +CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE=y +CONFIG_MSMB_JPEG=y +CONFIG_MSM_FD=y +CONFIG_RADIO_IRIS=y +CONFIG_RADIO_IRIS_TRANSPORT=y +CONFIG_RADIO_SILABS=y +CONFIG_MSM_KGSL=y +CONFIG_FB=y +CONFIG_FB_MSM=y +CONFIG_MSM_DBA=y +CONFIG_MSM_DBA_ADV7533=y +CONFIG_FB_MSM_MDSS=y +CONFIG_FB_MSM_MDSS_WRITEBACK=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_MSM8X16=y +CONFIG_SND_SOC_AW87319=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_APPLE=y +CONFIG_HID_ELECOM=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MSM=y +CONFIG_USB_EHCI_MSM_HSIC=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_DWC3=y +CONFIG_USB_SERIAL=y +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MSM_HSPHY=y +CONFIG_USB_MSM_SSPHY_QMP=y +CONFIG_MSM_QUSB_PHY=y +CONFIG_DUAL_ROLE_USB_INTF=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_DEBUG_FS=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_CI13XXX_MSM=y +CONFIG_USB_G_ANDROID=y +CONFIG_MMC=y +CONFIG_MMC_PERF_PROFILING=n +CONFIG_MMC_CLKGATE=y +CONFIG_MMC_PARANOID_SD_INIT=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +CONFIG_MMC_TEST=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +CONFIG_MMC_CQ_HCI=y +CONFIG_LEDS_QPNP=y +CONFIG_LEDS_QPNP_FLASH=y +CONFIG_LEDS_QPNP_WLED=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_SWITCH=y +CONFIG_EDAC=y +CONFIG_EDAC_MM_EDAC=y +CONFIG_EDAC_CORTEX_ARM64=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_CE=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_QPNP=y +CONFIG_DMADEVICES=y +CONFIG_QCOM_SPS_DMA=y +CONFIG_UIO=y +CONFIG_UIO_MSM_SHAREDMEM=y +CONFIG_STAGING=y +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_TIMED_GPIO=y +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_SW_SYNC_USER=y +CONFIG_ION=y +CONFIG_ION_MSM=y +CONFIG_MSM_AVTIMER=y +CONFIG_MSM_BUS_SCALING=y +CONFIG_BUS_TOPOLOGY_ADHOC=y +CONFIG_QPNP_POWER_ON=y +CONFIG_QPNP_REVID=y +CONFIG_QPNP_COINCELL=y +CONFIG_SPS=y +CONFIG_USB_BAM=y +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_IPA=y +CONFIG_RMNET_IPA=y +CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y +CONFIG_MSM_SPMI=y +CONFIG_MSM_SPMI_PMIC_ARB=y +CONFIG_MSM_QPNP_INT=y +CONFIG_CP_ACCESS64=y +CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_MSM_MEMORY_DUMP_V2=y +CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CPUSS_DUMP=y +CONFIG_MSM_COMMON_LOG=y +CONFIG_MSM_DDR_HEALTH=y +CONFIG_MSM_WATCHDOG_V2=y +CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y +CONFIG_MSM_RPM_SMD=y +CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG=y +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_STATS_LOG=y +CONFIG_MSM_RUN_QUEUE_STATS=y +CONFIG_MSM_SCM=y +CONFIG_MSM_SCM_XPU=y +CONFIG_MSM_MPM_OF=y +CONFIG_MSM_SMEM=y +CONFIG_MSM_SMD=y +CONFIG_MSM_SMD_DEBUG=n +CONFIG_MSM_GLINK=y +CONFIG_MSM_GLINK_LOOPBACK_SERVER=y +CONFIG_MSM_GLINK_SMD_XPRT=y +CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y +CONFIG_MSM_SMEM_LOGGING=y +CONFIG_MSM_SMP2P=y +CONFIG_MSM_SMP2P_TEST=y +CONFIG_MSM_SPM=y +CONFIG_MSM_L2_SPM=y +CONFIG_MSM_QMI_INTERFACE=y +CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y +CONFIG_MSM_EVENT_TIMER=y +CONFIG_MSM_SUBSYSTEM_RESTART=y +CONFIG_MSM_SYSMON_COMM=y +CONFIG_MSM_PIL=y +CONFIG_MSM_PIL_SSR_GENERIC=y +CONFIG_MSM_PIL_MSS_QDSP6V5=y +CONFIG_MSM_BAM_DMUX=y +CONFIG_MSM_PERFORMANCE=y +# CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y +CONFIG_MEM_SHARE_QMI_SERVICE=y +CONFIG_MSM_CLK_CONTROLLER_V2=y +CONFIG_MSM_MDSS_PLL=y +CONFIG_REMOTE_SPINLOCK_MSM=y +CONFIG_MSM_IOMMU_V1=y +CONFIG_ARM_SMMU=y +CONFIG_IOMMU_DEBUG=y +CONFIG_IOMMU_TESTS=y +CONFIG_SPDM_SCM=y +CONFIG_DEVFREQ_SPDM=y +CONFIG_PWM=y +CONFIG_PWM_QPNP=y +CONFIG_ARM_GIC_PANIC_HANDLER=y +CONFIG_CORESIGHT=n +CONFIG_CORESIGHT_EVENT=n +CONFIG_CORESIGHT_FUSE=n +CONFIG_CORESIGHT_CTI=n +CONFIG_CORESIGHT_CTI_SAVE_DISABLE=n +CONFIG_CORESIGHT_TMC=n +CONFIG_CORESIGHT_TPIU=n +CONFIG_CORESIGHT_FUNNEL=n +CONFIG_CORESIGHT_REPLICATOR=n +CONFIG_CORESIGHT_STM=n +CONFIG_CORESIGHT_HWEVENT=n +CONFIG_SENSORS_SSC=y +CONFIG_MSM_TZ_LOG=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_INFO=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_RECURSIVE_FAULT=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_IPC_LOGGING=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_DEBUG_RODATA=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_LSM_MMAP_MIN_ADDR=4096 +CONFIG_SECURITY_SELINUX=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_DEV_QCRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_MSM_QCE=y +CONFIG_CRYPTO_DEV_QCEDEV=y +CONFIG_CRYPTO_DEV_OTA_CRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_ICE=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_QMI_ENCDEC=y +CONFIG_CPUMAXFREQ=y +CONFIG_SERIAL_NUM=y +CONFIG_SECBOOT_FUSE=y +## MIUI ADD:START +## Multi userspace config support +CONFIG_ECRYPT_FS=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XTS=y +CONFIG_NAMESPACES=y +#CONFIG_UTS_NS=y +#CONFIG_IPC_NS=y +## do not turn on user-namespaces as it enables +## CONFIG_UIDGID_STRICT_TYPE_CHECKS, which results in several compile +## errors +#CONFIG_USER_NS=y +#CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_VETH=y +## END +CONFIG_FINGERPRINT=y +CONFIG_FINGERPRINT_GOODIX_GF3208=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_AW2013=y +CONFIG_FINGERPRINT_FPC1020=y + +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DISABLE_TEMP_PROTECT=n +CONFIG_A13N_PMI8952=y + +#CONFIG_ZRAM_DEBUG=y +CONFIG_SWAP=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_ANDROID_WHETSTONE=y +CONFIG_CGROUP_MEM_RES_CTLR=y +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y + +#MIUI ADD +#Add CIFS Config +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_UTF8=y +#MIUI END diff --git a/arch/arm64/configs/S88536AA2_defconfig b/arch/arm64/configs/S88536AA2_defconfig new file mode 100644 index 0000000000000..77d39e6ab7b60 --- /dev/null +++ b/arch/arm64/configs/S88536AA2_defconfig @@ -0,0 +1,773 @@ +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_NOCB_CPU=y +CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=n +CONFIG_CGROUPS=y +CONFIG_CGROUP_DEBUG=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_CPUSETS=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_CFS_BANDWIDTH=y +CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y +CONFIG_SCHED_QHMP=y +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_PID_NS is not set +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_NLS_UTF8=y +# CONFIG_CIFS_STATS is not set +CONFIG_CIFS_WEAK_PW_HASH=y +CONFIG_CIFS_UPCALL=y +CONFIG_CIFS_XATTR=y +CONFIG_CIFS_POSIX=y +# CONFIG_CIFS_DEBUG2 is not set +CONFIG_CIFS_DFS_UPCALL=y +CONFIG_CIFS_ACL=y +CONFIG_CIFS_EXPERIMENTAL=y +CONFIG_SMB_FS=m +CONFIG_SMB_NLS_DEFAULT=y +CONFIG_SMB_NLS_REMOTE="cp850" +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_KALLSYMS_ALL=y +CONFIG_PSTORE_LAST_KMSG=y +CONFIG_EMBEDDED=y +CONFIG_PROFILING=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SIG=y +CONFIG_MODULE_SIG_FORCE=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ARCH_MSM=y +CONFIG_ARCH_MSM8916=y +CONFIG_ARCH_MSM8917=y +CONFIG_ARCH_MSM8920=y +CONFIG_ARCH_MSM8940=y +CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_MSM8937=y +CONFIG_ARCH_MSMCOBALT=y +CONFIG_PCI_MSM=y +CONFIG_SMP=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_CLEANCACHE=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_ZSMALLOC=y +CONFIG_ZSMALLOC_STAT=y +CONFIG_ZCACHE=y +CONFIG_PROCESS_RECLAIM=y +CONFIG_SECCOMP=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_SWP_EMULATION=y +CONFIG_CP15_BARRIER_EMULATION=y +CONFIG_SETEND_EMULATION=y +CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=0 +# CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_DEBUG=y +CONFIG_SUSPEND_TIME=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_FREQ=y +CONFIG_SCHED_FREQ_INPUT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM_USER=y +CONFIG_XFRM_STATISTICS=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_HARDIDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +CONFIG_NETFILTER_XT_TARGET_NOTRACK=y +CONFIG_NETFILTER_XT_TARGET_TEE=y +CONFIG_NETFILTER_XT_TARGET_TPROXY=y +CONFIG_NETFILTER_XT_TARGET_TRACE=y +CONFIG_NETFILTER_XT_TARGET_SECMARK=y +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_DSCP=y +CONFIG_NETFILTER_XT_MATCH_ESP=y +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NATTYPE_MODULE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_RAW=y +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +CONFIG_BRIDGE_NF_EBTABLES=y +CONFIG_BRIDGE_EBT_BROUTE=y +CONFIG_L2TP=y +CONFIG_L2TP_DEBUGFS=y +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=y +CONFIG_L2TP_ETH=y +CONFIG_BRIDGE=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=y +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CMP=y +CONFIG_NET_EMATCH_NBYTE=y +CONFIG_NET_EMATCH_U32=y +CONFIG_NET_EMATCH_META=y +CONFIG_NET_EMATCH_TEXT=y +CONFIG_NET_CLS_ACT=y +CONFIG_RMNET_DATA=y +CONFIG_RMNET_DATA_FC=y +CONFIG_RMNET_DATA_DEBUG_PKT=y +CONFIG_SOCKEV_NLMCAST=y +CONFIG_BT=y +CONFIG_BT_RFCOMM=y +CONFIG_BT_RFCOMM_TTY=y +CONFIG_BT_BNEP=y +CONFIG_BT_BNEP_MC_FILTER=y +CONFIG_BT_BNEP_PROTO_FILTER=y +CONFIG_BT_HIDP=y +CONFIG_MSM_BT_POWER=y +CONFIG_CFG80211=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_RFKILL=y +CONFIG_NFC_NQ=y +CONFIG_IPC_ROUTER=y +CONFIG_IPC_ROUTER_SECURITY=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +CONFIG_DMA_CMA=y +CONFIG_CMA_SIZE_MBYTES=40 +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_UID_STAT=y +CONFIG_QSEECOM=y +CONFIG_HDCP_QSEECOM=y +CONFIG_UID_CPUTIME=y +CONFIG_USB_EXT_TYPE_C_PERICOM=y +CONFIG_MSM_ULTRASOUND=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_UFSHCD=y +CONFIG_SCSI_UFSHCD_PLATFORM=y +CONFIG_SCSI_UFS_QCOM=y +CONFIG_SCSI_UFS_QCOM_ICE=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_REQ_CRYPT=y +CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y +CONFIG_NETDEVICES=y +CONFIG_DUMMY=y +CONFIG_TUN=y +CONFIG_RNDIS_IPA=y +CONFIG_MSM_RMNET_BAM=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOL2TP=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_WCNSS_CORE=y +CONFIG_WCNSS_CORE_PRONTO=y +CONFIG_WCNSS_REGISTER_DUMP_ON_BITE=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y +CONFIG_CNSS_CRYPTO=y +CONFIG_ATH_CARDS=y +CONFIG_WIL6210=m +CONFIG_CNSS=y +CONFIG_CLD_LL_CORE=y +CONFIG_BUS_AUTO_SUSPEND=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_INPUT_KEYRESET=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v26=y +CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v26=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GEN_VKEYS=y +CONFIG_TOUCHSCREEN_FT5336=y +CONFIG_FT_SECURE_TOUCH=y +CONFIG_TOUCHSCREEN_MAXIM_STI=y +CONFIG_INPUT_MISC=y +CONFIG_INPUT_HBTP_INPUT=n +CONFIG_INPUT_KEYCHORD=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_GPIO=y +# CONFIG_VT is not set +# CONFIG_LEGACY_PTYS is not set +CONFIG_SERIAL_MSM_HS=y +CONFIG_SERIAL_MSM_HSL=y +CONFIG_SERIAL_MSM_HSL_CONSOLE=y +CONFIG_SERIAL_MSM_SMD=y +CONFIG_DIAG_CHAR=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_MSM_SMD_PKT=y +CONFIG_MSM_ADSPRPC=y +CONFIG_MSM_RDBG=m +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MSM_V2=y +CONFIG_SLIMBUS=y +CONFIG_SLIMBUS_MSM_NGD=y +CONFIG_SOUNDWIRE=y +CONFIG_SPI=y +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=m +CONFIG_PINCTRL_MSM8952=y +CONFIG_PINCTRL_MSM8937=y +CONFIG_PINCTRL_MSMCOBALT=y +CONFIG_PINCTRL_MSM8917=y +CONFIG_PINCTRL_MSM8940=y +CONFIG_PINCTRL_MSM8953=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_QPNP_PIN=y +CONFIG_SMB1351_USB_CHARGER=n +CONFIG_SMB135X_CHARGER=n +CONFIG_QPNP_SMBCHARGER=y +CONFIG_QPNP_FG=y +CONFIG_BATTERY_BCL=y +CONFIG_MSM_BCL_CTL=y +CONFIG_MSM_BCL_PERIPHERAL_CTL=y +CONFIG_POWER_RESET_MSM=y +CONFIG_MSM_DLOAD_MODE=y +CONFIG_MSM_PM=y +CONFIG_MSM_APM=y +CONFIG_SENSORS_EPM_ADC=y +CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y +CONFIG_SENSORS_QPNP_ADC_CURRENT=y +CONFIG_THERMAL=y +CONFIG_THERMAL_TSENS8974=y +CONFIG_LIMITS_MONITOR=y +CONFIG_LIMITS_LITE_HW=y +CONFIG_THERMAL_MONITOR=y +CONFIG_THERMAL_QPNP=y +CONFIG_THERMAL_QPNP_ADC_TM=y +CONFIG_WCD9335_CODEC=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_STUB=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_MEM_ACC=y +CONFIG_REGULATOR_RPM_SMD=y +CONFIG_REGULATOR_QPNP=y +CONFIG_REGULATOR_QPNP_LABIBB=y +CONFIG_REGULATOR_SPM=y +CONFIG_REGULATOR_CPR=y +CONFIG_REGULATOR_CPR3_HMSS=y +CONFIG_REGULATOR_CPR3_MMSS=y +CONFIG_REGULATOR_KRYO=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_PLATFORM=y +CONFIG_MSM_VIDC_V4L2=y +CONFIG_MSM_VIDC_VMEM=y +CONFIG_MSM_VIDC_GOVERNORS=y +CONFIG_MSM_CAMERA=y +CONFIG_MSM_CAMERA_DEBUG=y +CONFIG_MSMB_CAMERA=y +CONFIG_MSMB_CAMERA_DEBUG=y +CONFIG_MSM_CAMERA_SENSOR=y +CONFIG_MSM_CPP=y +CONFIG_MSM_CCI=y +CONFIG_MSM_CSI20_HEADER=y +CONFIG_MSM_CSI22_HEADER=y +CONFIG_MSM_CSI30_HEADER=y +CONFIG_MSM_CSI31_HEADER=y +CONFIG_MSM_CSIPHY=y +CONFIG_MSM_CSID=y +CONFIG_MSM_EEPROM=y +CONFIG_MSM_ISPIF_V2=y +CONFIG_IMX134=y +CONFIG_IMX132=y +CONFIG_OV9724=y +CONFIG_OV5648=y +CONFIG_GC0339=y +CONFIG_OV8825=y +CONFIG_OV8865=y +CONFIG_s5k4e1=y +CONFIG_OV12830=y +CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE=y +CONFIG_MSMB_JPEG=y +CONFIG_MSM_FD=y +CONFIG_RADIO_IRIS=y +CONFIG_RADIO_IRIS_TRANSPORT=y +CONFIG_RADIO_SILABS=y +CONFIG_MSM_KGSL=y +CONFIG_FB=y +CONFIG_FB_MSM=y +CONFIG_MSM_DBA=y +CONFIG_MSM_DBA_ADV7533=y +CONFIG_FB_MSM_MDSS=y +CONFIG_FB_MSM_MDSS_WRITEBACK=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_MSM8X16=y +CONFIG_SND_SOC_AW87319=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_APPLE=y +CONFIG_HID_ELECOM=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MSM=y +CONFIG_USB_EHCI_MSM_HSIC=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_DWC3=y +CONFIG_USB_SERIAL=y +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MSM_HSPHY=y +CONFIG_USB_MSM_SSPHY_QMP=y +CONFIG_MSM_QUSB_PHY=y +CONFIG_DUAL_ROLE_USB_INTF=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_DEBUG_FS=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_CI13XXX_MSM=y +CONFIG_USB_G_ANDROID=y +CONFIG_MMC=y +CONFIG_MMC_PERF_PROFILING=y +CONFIG_MMC_CLKGATE=y +CONFIG_MMC_PARANOID_SD_INIT=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +CONFIG_MMC_TEST=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +CONFIG_MMC_CQ_HCI=y +CONFIG_LEDS_QPNP=y +CONFIG_LEDS_QPNP_FLASH=y +CONFIG_LEDS_QPNP_WLED=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_SWITCH=y +CONFIG_EDAC=y +CONFIG_EDAC_MM_EDAC=y +CONFIG_EDAC_CORTEX_ARM64=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_CE=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_QPNP=y +CONFIG_DMADEVICES=y +CONFIG_QCOM_SPS_DMA=y +CONFIG_UIO=y +CONFIG_UIO_MSM_SHAREDMEM=y +CONFIG_STAGING=y +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_TIMED_GPIO=y +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_SW_SYNC_USER=y +CONFIG_ION=y +CONFIG_ION_MSM=y +CONFIG_MSM_AVTIMER=y +CONFIG_MSM_BUS_SCALING=y +CONFIG_BUS_TOPOLOGY_ADHOC=y +CONFIG_QPNP_POWER_ON=y +CONFIG_QPNP_REVID=y +CONFIG_QPNP_COINCELL=y +CONFIG_SPS=y +CONFIG_USB_BAM=y +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_IPA=y +CONFIG_RMNET_IPA=y +CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y +CONFIG_MSM_SPMI=y +CONFIG_MSM_SPMI_PMIC_ARB=y +CONFIG_MSM_QPNP_INT=y +CONFIG_CP_ACCESS64=y +CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_MSM_MEMORY_DUMP_V2=y +CONFIG_MSM_DEBUG_LAR_UNLOCK=y +CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CPUSS_DUMP=y +CONFIG_MSM_COMMON_LOG=y +CONFIG_MSM_DDR_HEALTH=y +CONFIG_MSM_WATCHDOG_V2=y +CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y +CONFIG_MSM_CORE_HANG_DETECT=y +CONFIG_MSM_RPM_SMD=y +CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG=y +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_STATS_LOG=y +CONFIG_MSM_RUN_QUEUE_STATS=y +CONFIG_MSM_SCM=y +CONFIG_MSM_SCM_XPU=y +CONFIG_MSM_MPM_OF=y +CONFIG_MSM_SMEM=y +CONFIG_MSM_SMD=y +CONFIG_MSM_SMD_DEBUG=y +CONFIG_MSM_GLINK=y +CONFIG_MSM_GLINK_LOOPBACK_SERVER=y +CONFIG_MSM_GLINK_SMD_XPRT=y +CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y +CONFIG_MSM_SMEM_LOGGING=y +CONFIG_MSM_SMP2P=y +CONFIG_MSM_SMP2P_TEST=y +CONFIG_MSM_SPM=y +CONFIG_MSM_L2_SPM=y +CONFIG_MSM_QMI_INTERFACE=y +CONFIG_MSM_DCC=y +CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y +CONFIG_MSM_EVENT_TIMER=y +CONFIG_MSM_IPC_ROUTER_GLINK_XPRT=y +CONFIG_MSM_GLINK_PKT=y +CONFIG_MSM_SUBSYSTEM_RESTART=y +CONFIG_MSM_SYSMON_COMM=y +CONFIG_MSM_PIL=y +CONFIG_MSM_PIL_SSR_GENERIC=y +CONFIG_MSM_PIL_MSS_QDSP6V5=y +CONFIG_TRACER_PKT=y +CONFIG_MSM_BAM_DMUX=y +CONFIG_MSM_PERFORMANCE=y +# CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y +CONFIG_MEM_SHARE_QMI_SERVICE=y +CONFIG_MSM_CLK_CONTROLLER_V2=y +CONFIG_MSM_MDSS_PLL=y +CONFIG_REMOTE_SPINLOCK_MSM=y +CONFIG_MSM_IOMMU_V1=y +CONFIG_ARM_SMMU=y +CONFIG_IOMMU_DEBUG=y +CONFIG_IOMMU_DEBUG_TRACKING=y +CONFIG_IOMMU_TESTS=y +CONFIG_SPDM_SCM=y +CONFIG_DEVFREQ_SPDM=y +CONFIG_PWM=y +CONFIG_PWM_QPNP=y +CONFIG_ARM_GIC_PANIC_HANDLER=y +CONFIG_CORESIGHT=y +CONFIG_CORESIGHT_EVENT=y +CONFIG_CORESIGHT_FUSE=y +CONFIG_CORESIGHT_CTI=y +CONFIG_CORESIGHT_TMC=y +CONFIG_CORESIGHT_TPIU=y +CONFIG_CORESIGHT_FUNNEL=y +CONFIG_CORESIGHT_REPLICATOR=y +CONFIG_CORESIGHT_TPDA=y +CONFIG_CORESIGHT_TPDM=y +CONFIG_CORESIGHT_DBGUI=y +CONFIG_CORESIGHT_STM=y +CONFIG_CORESIGHT_HWEVENT=y +CONFIG_CORESIGHT_ETMV4=y +CONFIG_CORESIGHT_REMOTE_ETM=y +CONFIG_CORESIGHT_QPDI=y +CONFIG_SENSORS_SSC=y +CONFIG_MSM_TZ_LOG=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_LOG_BUF_MAGIC=y +CONFIG_DYNAMIC_DEBUG=y +CONFIG_DEBUG_INFO=y +CONFIG_PAGE_OWNER=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_SLUB_DEBUG_PANIC_ON=y +CONFIG_DEBUG_OBJECTS=y +CONFIG_DEBUG_OBJECTS_FREE=y +CONFIG_DEBUG_OBJECTS_TIMERS=y +CONFIG_DEBUG_OBJECTS_WORK=y +CONFIG_DEBUG_OBJECTS_RCU_HEAD=y +CONFIG_DEBUG_OBJECTS_PERCPU_COUNTER=y +CONFIG_SLUB_DEBUG_ON=y +CONFIG_DEBUG_KMEMLEAK=y +CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=4000 +CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF=y +CONFIG_DEBUG_STACK_USAGE=y +CONFIG_DEBUG_MEMORY_INIT=y +CONFIG_LOCKUP_DETECTOR=y +CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC=y +# CONFIG_DETECT_HUNG_TASK is not set +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_RECURSIVE_FAULT=y +CONFIG_PANIC_ON_SCHED_BUG=y +CONFIG_PANIC_ON_RT_THROTTLING=y +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_DEBUG_SPINLOCK=y +CONFIG_DEBUG_MUTEXES=y +CONFIG_DEBUG_ATOMIC_SLEEP=y +CONFIG_DEBUG_LIST=y +CONFIG_FAULT_INJECTION=y +CONFIG_FAIL_PAGE_ALLOC=y +CONFIG_UFS_FAULT_INJECTION=y +CONFIG_FAULT_INJECTION_DEBUG_FS=y +CONFIG_FAULT_INJECTION_STACKTRACE_FILTER=y +CONFIG_MSM_RTB=y +CONFIG_MSM_RTB_SEPARATE_CPUS=y +CONFIG_IPC_LOGGING=y +CONFIG_BLK_DEV_IO_TRACE=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_PANIC_ON_DATA_CORRUPTION=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_FREE_PAGES_RDONLY=y +CONFIG_KERNEL_TEXT_RDONLY=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_LSM_MMAP_MIN_ADDR=4096 +CONFIG_SECURITY_SELINUX=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_DEV_QCRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_MSM_QCE=y +CONFIG_CRYPTO_DEV_QCEDEV=y +CONFIG_CRYPTO_DEV_OTA_CRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_ICE=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_QMI_ENCDEC=y +CONFIG_CPUMAXFREQ=y +CONFIG_SERIAL_NUM=y +CONFIG_SECBOOT_FUSE=y +## MIUI ADD:START +## Multi userspace config support +CONFIG_ECRYPT_FS=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XTS=y +CONFIG_NAMESPACES=y +#CONFIG_UTS_NS=y +#CONFIG_IPC_NS=y +## do not turn on user-namespaces as it enables +## CONFIG_UIDGID_STRICT_TYPE_CHECKS, which results in several compile +## errors +#CONFIG_USER_NS=y +#CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_VETH=y +## END +CONFIG_FINGERPRINT=y +CONFIG_FINGERPRINT_GOODIX_GF3208=y +CONFIG_LEDS_GPIO=y +CONFIG_LEDS_AW2013=y +CONFIG_FINGERPRINT_FPC1020=y +CONFIG_DISABLE_TEMP_PROTECT=n +CONFIG_A13N_PMI8952=y + +#CONFIG_ZRAM_DEBUG=y +CONFIG_SWAP=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_ANDROID_WHETSTONE=y +CONFIG_CGROUP_MEM_RES_CTLR=y +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y + +#MIUI ADD +#Add CIFS Config +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_UTF8=y +#MIUI END + diff --git a/arch/arm64/configs/msm-auto-perf_defconfig b/arch/arm64/configs/msm-auto-perf_defconfig index 8411926bde0ac..7a6c5cd59984d 100644 --- a/arch/arm64/configs/msm-auto-perf_defconfig +++ b/arch/arm64/configs/msm-auto-perf_defconfig @@ -40,6 +40,7 @@ CONFIG_ARCH_MSM=y CONFIG_ARCH_MSM8996=y CONFIG_PCI_MSM=y CONFIG_ENABLE_FP_SIMD_SETTINGS=y +CONFIG_MSM_APP_SETTINGS=y CONFIG_SMP=y CONFIG_SCHED_MC=y CONFIG_PREEMPT=y @@ -255,6 +256,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_BONDING=y CONFIG_DUMMY=y @@ -550,7 +552,6 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_QBT1000=y CONFIG_MSM_KERNEL_PROTECT=y diff --git a/arch/arm64/configs/msm-auto_defconfig b/arch/arm64/configs/msm-auto_defconfig index 9a1856e70ceeb..05ab497f2b095 100644 --- a/arch/arm64/configs/msm-auto_defconfig +++ b/arch/arm64/configs/msm-auto_defconfig @@ -39,6 +39,7 @@ CONFIG_ARCH_MSM8996=y CONFIG_ARCH_MSMCOBALT=y CONFIG_PCI_MSM=y CONFIG_ENABLE_FP_SIMD_SETTINGS=y +CONFIG_MSM_APP_SETTINGS=y CONFIG_SMP=y CONFIG_SCHED_MC=y CONFIG_PREEMPT=y @@ -256,6 +257,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_BONDING=y CONFIG_DUMMY=y @@ -559,7 +561,6 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_SERVICE_LOCATOR=y CONFIG_MSM_SERVICE_NOTIFIER=y @@ -596,7 +597,6 @@ CONFIG_CORESIGHT_REMOTE_ETM=y CONFIG_CORESIGHT_QPDI=y CONFIG_SENSORS_SSC=y CONFIG_MSM_TZ_LOG=y -CONFIG_MOBICORE_DRIVER=m CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT3_FS=y diff --git a/arch/arm64/configs/msm-perf_defconfig b/arch/arm64/configs/msm-perf_defconfig index f3f0bf7d2a087..0dc32620d9cae 100644 --- a/arch/arm64/configs/msm-perf_defconfig +++ b/arch/arm64/configs/msm-perf_defconfig @@ -28,6 +28,7 @@ CONFIG_EMBEDDED=y # CONFIG_SLUB_DEBUG is not set CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -87,6 +88,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y @@ -158,6 +160,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -173,6 +176,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y @@ -251,6 +255,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_BONDING=y CONFIG_DUMMY=y @@ -541,7 +546,6 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_POWER=y CONFIG_MSM_QBT1000=y diff --git a/arch/arm64/configs/msm8937-perf_defconfig b/arch/arm64/configs/msm8937-perf_defconfig index ec6f788e1dabc..fb40f929dedaf 100644 --- a/arch/arm64/configs/msm8937-perf_defconfig +++ b/arch/arm64/configs/msm8937-perf_defconfig @@ -3,6 +3,7 @@ CONFIG_AUDIT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y @@ -14,6 +15,7 @@ CONFIG_RESOURCE_COUNTERS=y CONFIG_CGROUP_SCHED=y CONFIG_RT_GROUP_SCHED=y CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y CONFIG_SCHED_QHMP=y CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set @@ -27,6 +29,7 @@ CONFIG_EMBEDDED=y # CONFIG_SLUB_DEBUG is not set CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -94,6 +97,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y @@ -164,6 +168,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -180,6 +185,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y @@ -252,6 +258,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y @@ -467,6 +474,7 @@ CONFIG_MMC_PERF_PROFILING=y CONFIG_MMC_CLKGATE=y CONFIG_MMC_PARANOID_SD_INIT=y CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y CONFIG_MMC_TEST=m CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y @@ -510,10 +518,11 @@ CONFIG_SPS_SUPPORT_NDP_BAM=y CONFIG_IPA=y CONFIG_RMNET_IPA=y CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y CONFIG_MSM_SPMI=y CONFIG_MSM_SPMI_PMIC_ARB=y CONFIG_MSM_QPNP_INT=y -CONFIG_CP_ACCESS64=y +# CONFIG_CP_ACCESS64 is not set CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y CONFIG_MSM_ADSP_LOADER=y CONFIG_MSM_MEMORY_DUMP_V2=y @@ -551,10 +560,11 @@ CONFIG_MSM_SYSMON_COMM=y CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm64/configs/msm8937_defconfig b/arch/arm64/configs/msm8937_defconfig index 0b9811eb76fa6..3a9eaaf251c58 100644 --- a/arch/arm64/configs/msm8937_defconfig +++ b/arch/arm64/configs/msm8937_defconfig @@ -2,6 +2,7 @@ CONFIG_AUDIT=y CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y @@ -14,6 +15,7 @@ CONFIG_RESOURCE_COUNTERS=y CONFIG_CGROUP_SCHED=y CONFIG_RT_GROUP_SCHED=y CONFIG_SCHED_HMP=y +CONFIG_SCHED_CORE_CTL=y CONFIG_SCHED_QHMP=y CONFIG_NAMESPACES=y # CONFIG_UTS_NS is not set @@ -26,6 +28,7 @@ CONFIG_KALLSYMS_ALL=y CONFIG_EMBEDDED=y CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -93,6 +96,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y @@ -163,6 +167,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -179,6 +184,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y @@ -252,6 +258,7 @@ CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y @@ -468,6 +475,7 @@ CONFIG_MMC_PERF_PROFILING=y CONFIG_MMC_CLKGATE=y CONFIG_MMC_PARANOID_SD_INIT=y CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y CONFIG_MMC_TEST=m CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI_PLTFM=y @@ -511,10 +519,11 @@ CONFIG_SPS_SUPPORT_NDP_BAM=y CONFIG_IPA=y CONFIG_RMNET_IPA=y CONFIG_QPNP_HAPTIC=y +CONFIG_BW_MONITOR=y CONFIG_MSM_SPMI=y CONFIG_MSM_SPMI_PMIC_ARB=y CONFIG_MSM_QPNP_INT=y -CONFIG_CP_ACCESS64=y +# CONFIG_CP_ACCESS64 is not set CONFIG_MSM_INRUSH_CURRENT_MITIGATION=y CONFIG_MSM_ADSP_LOADER=y CONFIG_MSM_MEMORY_DUMP_V2=y @@ -558,10 +567,11 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y # CONFIG_MSM_PERFORMANCE_HOTPLUG_ON is not set +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm64/configs/msm_defconfig b/arch/arm64/configs/msm_defconfig index ba3cd11a029af..c56c4af32672b 100644 --- a/arch/arm64/configs/msm_defconfig +++ b/arch/arm64/configs/msm_defconfig @@ -26,6 +26,7 @@ CONFIG_KALLSYMS_ALL=y CONFIG_EMBEDDED=y CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_REGULAR=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -88,6 +89,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y @@ -159,6 +161,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -174,6 +177,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y @@ -252,6 +256,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_BONDING=y CONFIG_DUMMY=y @@ -554,7 +559,6 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_PERFORMANCE=y CONFIG_MSM_POWER=y CONFIG_MSM_SERVICE_LOCATOR=y @@ -596,7 +600,6 @@ CONFIG_CORESIGHT_REMOTE_ETM=y CONFIG_CORESIGHT_QPDI=y CONFIG_SENSORS_SSC=y CONFIG_MSM_TZ_LOG=y -CONFIG_MOBICORE_DRIVER=m CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y CONFIG_EXT3_FS=y diff --git a/arch/arm64/configs/msmcortex-perf_defconfig b/arch/arm64/configs/msmcortex-perf_defconfig index 359a66a234099..09ba1abb42044 100644 --- a/arch/arm64/configs/msmcortex-perf_defconfig +++ b/arch/arm64/configs/msmcortex-perf_defconfig @@ -4,6 +4,7 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y @@ -27,6 +28,7 @@ CONFIG_EMBEDDED=y # CONFIG_SLUB_DEBUG is not set CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -39,6 +41,7 @@ CONFIG_ARCH_MSM=y CONFIG_ARCH_MSM8916=y CONFIG_ARCH_MSM8940=y CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_SDM450=y CONFIG_ARCH_MSM8937=y CONFIG_ARCH_MSMCOBALT=y CONFIG_PCI_MSM=y @@ -92,6 +95,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y @@ -162,6 +166,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -178,6 +183,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y @@ -251,6 +257,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y @@ -416,10 +423,12 @@ CONFIG_MSM_DBA_ADV7533=y CONFIG_FB_MSM_MDSS=y CONFIG_FB_MSM_MDSS_WRITEBACK=y CONFIG_FB_MSM_MDSS_HDMI_PANEL=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_USB_AUDIO=y +CONFIG_SND_USB_AUDIO_QMI=y CONFIG_SND_SOC=y CONFIG_SND_SOC_MSM8X16=y CONFIG_HIDRAW=y @@ -537,7 +546,6 @@ CONFIG_MSM_GLINK=y CONFIG_MSM_GLINK_LOOPBACK_SERVER=y CONFIG_MSM_GLINK_SMD_XPRT=y CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y -CONFIG_MSM_SPCOM=y CONFIG_MSM_SMEM_LOGGING=y CONFIG_MSM_SMP2P=y CONFIG_MSM_SMP2P_TEST=y @@ -553,9 +561,10 @@ CONFIG_MSM_PIL=y CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_ICNSS=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm64/configs/msmcortex_defconfig b/arch/arm64/configs/msmcortex_defconfig index 91efcd9ac0457..0a873462ae23e 100644 --- a/arch/arm64/configs/msmcortex_defconfig +++ b/arch/arm64/configs/msmcortex_defconfig @@ -3,6 +3,7 @@ CONFIG_NO_HZ=y CONFIG_HIGH_RES_TIMERS=y CONFIG_IRQ_TIME_ACCOUNTING=y CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y CONFIG_RCU_NOCB_CPU=y CONFIG_RCU_NOCB_CPU_ALL=y CONFIG_IKCONFIG=y @@ -26,6 +27,7 @@ CONFIG_KALLSYMS_ALL=y CONFIG_EMBEDDED=y CONFIG_PROFILING=y CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 CONFIG_MODULES=y CONFIG_MODULE_UNLOAD=y CONFIG_MODULE_FORCE_UNLOAD=y @@ -38,6 +40,7 @@ CONFIG_ARCH_MSM=y CONFIG_ARCH_MSM8916=y CONFIG_ARCH_MSM8940=y CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_SDM450=y CONFIG_ARCH_MSM8937=y CONFIG_ARCH_MSMCOBALT=y CONFIG_PCI_MSM=y @@ -91,6 +94,7 @@ CONFIG_INET_ESP=y CONFIG_INET_IPCOMP=y # CONFIG_INET_XFRM_MODE_BEET is not set # CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y CONFIG_IPV6=y CONFIG_IPV6_ROUTER_PREF=y CONFIG_IPV6_ROUTE_INFO=y @@ -161,6 +165,7 @@ CONFIG_NF_CONNTRACK_IPV4=y CONFIG_IP_NF_IPTABLES=y CONFIG_IP_NF_MATCH_AH=y CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y CONFIG_IP_NF_MATCH_TTL=y CONFIG_IP_NF_FILTER=y CONFIG_IP_NF_TARGET_REJECT=y @@ -177,6 +182,7 @@ CONFIG_IP_NF_ARPFILTER=y CONFIG_IP_NF_ARP_MANGLE=y CONFIG_NF_CONNTRACK_IPV6=y CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y CONFIG_IP6_NF_FILTER=y CONFIG_IP6_NF_TARGET_REJECT=y CONFIG_IP6_NF_MANGLE=y @@ -251,6 +257,7 @@ CONFIG_DM_CRYPT=y CONFIG_DM_REQ_CRYPT=y CONFIG_DM_UEVENT=y CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y CONFIG_NETDEVICES=y CONFIG_DUMMY=y CONFIG_TUN=y @@ -419,10 +426,12 @@ CONFIG_MSM_DBA_ADV7533=y CONFIG_FB_MSM_MDSS=y CONFIG_FB_MSM_MDSS_WRITEBACK=y CONFIG_FB_MSM_MDSS_HDMI_PANEL=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y CONFIG_BACKLIGHT_LCD_SUPPORT=y CONFIG_SOUND=y CONFIG_SND=y CONFIG_SND_USB_AUDIO=y +CONFIG_SND_USB_AUDIO_QMI=y CONFIG_SND_SOC=y CONFIG_SND_SOC_MSM8X16=y CONFIG_HIDRAW=y @@ -550,7 +559,6 @@ CONFIG_MSM_GLINK=y CONFIG_MSM_GLINK_LOOPBACK_SERVER=y CONFIG_MSM_GLINK_SMD_XPRT=y CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y -CONFIG_MSM_SPCOM=y CONFIG_MSM_SMEM_LOGGING=y CONFIG_MSM_SMP2P=y CONFIG_MSM_SMP2P_TEST=y @@ -570,9 +578,10 @@ CONFIG_MSM_PIL_SSR_GENERIC=y CONFIG_MSM_PIL_MSS_QDSP6V5=y CONFIG_TRACER_PKT=y CONFIG_ICNSS=y -CONFIG_MSM_CORE_CTL_HELPER=y CONFIG_MSM_BAM_DMUX=y CONFIG_MSM_PERFORMANCE=y +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y CONFIG_MEM_SHARE_QMI_SERVICE=y CONFIG_MSM_CLK_CONTROLLER_V2=y CONFIG_MSM_MDSS_PLL=y diff --git a/arch/arm64/configs/rosy-perf_defconfig b/arch/arm64/configs/rosy-perf_defconfig new file mode 100644 index 0000000000000..772a4b361c24a --- /dev/null +++ b/arch/arm64/configs/rosy-perf_defconfig @@ -0,0 +1,715 @@ +CONFIG_LOCALVERSION="-perf" +CONFIG_AUDIT=y +CONFIG_NO_HZ=y +CONFIG_HIGH_RES_TIMERS=y +CONFIG_IRQ_TIME_ACCOUNTING=y +CONFIG_RCU_FAST_NO_HZ=y +CONFIG_RCU_BOOST=y +CONFIG_RCU_NOCB_CPU=y +CONFIG_RCU_NOCB_CPU_ALL=y +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=n +CONFIG_CGROUPS=y +CONFIG_CGROUP_FREEZER=y +CONFIG_CPUSETS=y +CONFIG_CGROUP_CPUACCT=y +CONFIG_RESOURCE_COUNTERS=y +CONFIG_CGROUP_SCHED=y +CONFIG_RT_GROUP_SCHED=y +CONFIG_SCHED_HMP=y +CONFIG_NAMESPACES=y +# CONFIG_UTS_NS is not set +# CONFIG_PID_NS is not set +CONFIG_BLK_DEV_INITRD=y +CONFIG_RD_BZIP2=y +CONFIG_RD_LZMA=y +CONFIG_CC_OPTIMIZE_FOR_SIZE=y +CONFIG_KALLSYMS_ALL=y +CONFIG_EMBEDDED=y +# CONFIG_SLUB_DEBUG is not set +CONFIG_PROFILING=y +CONFIG_CC_STACKPROTECTOR_STRONG=y +CONFIG_ARCH_MMAP_RND_COMPAT_BITS=16 +CONFIG_MODULES=y +CONFIG_MODULE_UNLOAD=y +CONFIG_MODULE_FORCE_UNLOAD=y +CONFIG_MODVERSIONS=y +CONFIG_MODULE_SIG=y +CONFIG_MODULE_SIG_FORCE=y +CONFIG_MODULE_SIG_SHA512=y +CONFIG_PARTITION_ADVANCED=y +CONFIG_ARCH_MSM=y +CONFIG_ARCH_MSM8916=y +CONFIG_ARCH_MSM8940=y +CONFIG_ARCH_MSM8953=y +CONFIG_ARCH_SDM450=y +CONFIG_ARCH_MSM8937=y +CONFIG_ARCH_MSMCOBALT=y +CONFIG_PCI_MSM=y +CONFIG_SMP=y +CONFIG_SCHED_MC=y +CONFIG_PREEMPT=y +CONFIG_CLEANCACHE=y +CONFIG_CMA=y +CONFIG_CMA_DEBUGFS=y +CONFIG_ZSMALLOC=y +CONFIG_ZCACHE=y +CONFIG_PROCESS_RECLAIM=y +CONFIG_SECCOMP=y +CONFIG_RTMM=y +CONFIG_ARMV8_DEPRECATED=y +CONFIG_SWP_EMULATION=y +CONFIG_CP15_BARRIER_EMULATION=y +CONFIG_SETEND_EMULATION=y +CONFIG_BUILD_ARM64_APPENDED_DTB_IMAGE=y +# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set +CONFIG_COMPAT=y +CONFIG_PM_AUTOSLEEP=y +CONFIG_PM_WAKELOCKS=y +CONFIG_PM_WAKELOCKS_LIMIT=0 +# CONFIG_PM_WAKELOCKS_GC is not set +CONFIG_PM_RUNTIME=y +CONFIG_PM_DEBUG=y +CONFIG_SUSPEND_TIME=y +CONFIG_CPU_IDLE=y +CONFIG_CPU_FREQ=y +CONFIG_SCHED_FREQ_INPUT=y +CONFIG_CPU_FREQ_GOV_POWERSAVE=y +CONFIG_CPU_FREQ_GOV_USERSPACE=y +CONFIG_CPU_FREQ_GOV_ONDEMAND=y +CONFIG_CPU_FREQ_GOV_INTERACTIVE=y +CONFIG_CPU_FREQ_GOV_CONSERVATIVE=y +CONFIG_NET=y +CONFIG_PACKET=y +CONFIG_UNIX=y +CONFIG_XFRM_USER=y +CONFIG_XFRM_STATISTICS=y +CONFIG_NET_KEY=y +CONFIG_INET=y +CONFIG_IP_MULTICAST=y +CONFIG_IP_ADVANCED_ROUTER=y +CONFIG_IP_MULTIPLE_TABLES=y +CONFIG_IP_ROUTE_VERBOSE=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_INET_AH=y +CONFIG_INET_ESP=y +CONFIG_INET_IPCOMP=y +# CONFIG_INET_XFRM_MODE_BEET is not set +# CONFIG_INET_LRO is not set +CONFIG_INET_DIAG_DESTROY=y +CONFIG_IPV6=y +CONFIG_IPV6_ROUTER_PREF=y +CONFIG_IPV6_ROUTE_INFO=y +CONFIG_IPV6_OPTIMISTIC_DAD=y +CONFIG_INET6_AH=y +CONFIG_INET6_ESP=y +CONFIG_INET6_IPCOMP=y +CONFIG_IPV6_MIP6=y +CONFIG_IPV6_MULTIPLE_TABLES=y +CONFIG_IPV6_SUBTREES=y +CONFIG_NETFILTER=y +CONFIG_NF_CONNTRACK=y +CONFIG_NF_CONNTRACK_SECMARK=y +CONFIG_NF_CONNTRACK_EVENTS=y +CONFIG_NF_CT_PROTO_DCCP=y +CONFIG_NF_CT_PROTO_SCTP=y +CONFIG_NF_CT_PROTO_UDPLITE=y +CONFIG_NF_CONNTRACK_AMANDA=y +CONFIG_NF_CONNTRACK_FTP=y +CONFIG_NF_CONNTRACK_H323=y +CONFIG_NF_CONNTRACK_IRC=y +CONFIG_NF_CONNTRACK_NETBIOS_NS=y +CONFIG_NF_CONNTRACK_PPTP=y +CONFIG_NF_CONNTRACK_SANE=y +CONFIG_NF_CONNTRACK_TFTP=y +CONFIG_NF_CT_NETLINK=y +CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y +CONFIG_NETFILTER_XT_TARGET_CONNMARK=y +CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y +CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_HARDIDLETIMER=y +CONFIG_NETFILTER_XT_TARGET_LOG=y +CONFIG_NETFILTER_XT_TARGET_MARK=y +CONFIG_NETFILTER_XT_TARGET_NFLOG=y +CONFIG_NETFILTER_XT_TARGET_NFQUEUE=y +CONFIG_NETFILTER_XT_TARGET_NOTRACK=y +CONFIG_NETFILTER_XT_TARGET_TEE=y +CONFIG_NETFILTER_XT_TARGET_TPROXY=y +CONFIG_NETFILTER_XT_TARGET_TRACE=y +CONFIG_NETFILTER_XT_TARGET_SECMARK=y +CONFIG_NETFILTER_XT_TARGET_TCPMSS=y +CONFIG_NETFILTER_XT_MATCH_COMMENT=y +CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y +CONFIG_NETFILTER_XT_MATCH_CONNMARK=y +CONFIG_NETFILTER_XT_MATCH_CONNTRACK=y +CONFIG_NETFILTER_XT_MATCH_DSCP=y +CONFIG_NETFILTER_XT_MATCH_ESP=y +CONFIG_NETFILTER_XT_MATCH_HASHLIMIT=y +CONFIG_NETFILTER_XT_MATCH_HELPER=y +CONFIG_NETFILTER_XT_MATCH_IPRANGE=y +CONFIG_NETFILTER_XT_MATCH_LENGTH=y +CONFIG_NETFILTER_XT_MATCH_LIMIT=y +CONFIG_NETFILTER_XT_MATCH_MAC=y +CONFIG_NETFILTER_XT_MATCH_MARK=y +CONFIG_NETFILTER_XT_MATCH_MULTIPORT=y +CONFIG_NETFILTER_XT_MATCH_POLICY=y +CONFIG_NETFILTER_XT_MATCH_PKTTYPE=y +CONFIG_NETFILTER_XT_MATCH_QTAGUID=y +CONFIG_NETFILTER_XT_MATCH_QUOTA=y +CONFIG_NETFILTER_XT_MATCH_QUOTA2=y +CONFIG_NETFILTER_XT_MATCH_SOCKET=y +CONFIG_NETFILTER_XT_MATCH_STATE=y +CONFIG_NETFILTER_XT_MATCH_STATISTIC=y +CONFIG_NETFILTER_XT_MATCH_STRING=y +CONFIG_NETFILTER_XT_MATCH_TIME=y +CONFIG_NETFILTER_XT_MATCH_U32=y +CONFIG_NF_CONNTRACK_IPV4=y +CONFIG_IP_NF_IPTABLES=y +CONFIG_IP_NF_MATCH_AH=y +CONFIG_IP_NF_MATCH_ECN=y +CONFIG_IP_NF_MATCH_RPFILTER=y +CONFIG_IP_NF_MATCH_TTL=y +CONFIG_IP_NF_FILTER=y +CONFIG_IP_NF_TARGET_REJECT=y +CONFIG_IP_NF_NAT=y +CONFIG_IP_NF_TARGET_MASQUERADE=y +CONFIG_IP_NF_TARGET_NATTYPE_MODULE=y +CONFIG_IP_NF_TARGET_NETMAP=y +CONFIG_IP_NF_TARGET_REDIRECT=y +CONFIG_IP_NF_MANGLE=y +CONFIG_IP_NF_RAW=y +CONFIG_IP_NF_SECURITY=y +CONFIG_IP_NF_ARPTABLES=y +CONFIG_IP_NF_ARPFILTER=y +CONFIG_IP_NF_ARP_MANGLE=y +CONFIG_NF_CONNTRACK_IPV6=y +CONFIG_IP6_NF_IPTABLES=y +CONFIG_IP6_NF_MATCH_RPFILTER=y +CONFIG_IP6_NF_FILTER=y +CONFIG_IP6_NF_TARGET_REJECT=y +CONFIG_IP6_NF_MANGLE=y +CONFIG_IP6_NF_RAW=y +CONFIG_BRIDGE_NF_EBTABLES=y +CONFIG_BRIDGE_EBT_BROUTE=y +CONFIG_L2TP=y +CONFIG_L2TP_DEBUGFS=y +CONFIG_L2TP_V3=y +CONFIG_L2TP_IP=y +CONFIG_L2TP_ETH=y +CONFIG_BRIDGE=y +CONFIG_NET_SCHED=y +CONFIG_NET_SCH_HTB=y +CONFIG_NET_SCH_PRIO=y +CONFIG_NET_CLS_FW=y +CONFIG_NET_CLS_U32=y +CONFIG_CLS_U32_MARK=y +CONFIG_NET_CLS_FLOW=y +CONFIG_NET_EMATCH=y +CONFIG_NET_EMATCH_CMP=y +CONFIG_NET_EMATCH_NBYTE=y +CONFIG_NET_EMATCH_U32=y +CONFIG_NET_EMATCH_META=y +CONFIG_NET_EMATCH_TEXT=y +CONFIG_NET_CLS_ACT=y +CONFIG_RMNET_DATA=y +CONFIG_RMNET_DATA_FC=y +#CONFIG_RMNET_DATA_DEBUG_PKT=y +CONFIG_SOCKEV_NLMCAST=y +CONFIG_BT=y +CONFIG_MSM_BT_POWER=y +CONFIG_CFG80211=y +CONFIG_CFG80211_INTERNAL_REGDB=y +CONFIG_RFKILL=y +CONFIG_NFC_NQ=y +CONFIG_IPC_ROUTER=y +CONFIG_IPC_ROUTER_SECURITY=y +CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y +CONFIG_DMA_CMA=y +CONFIG_ZRAM=y +CONFIG_BLK_DEV_LOOP=y +CONFIG_BLK_DEV_RAM=y +CONFIG_BLK_DEV_RAM_SIZE=8192 +CONFIG_UID_STAT=y +CONFIG_QSEECOM=y +CONFIG_HDCP_QSEECOM=y +CONFIG_UID_CPUTIME=y +CONFIG_USB_EXT_TYPE_C_PERICOM=y +CONFIG_MSM_ULTRASOUND=y +CONFIG_SCSI=y +CONFIG_BLK_DEV_SD=y +CONFIG_CHR_DEV_SG=y +CONFIG_CHR_DEV_SCH=y +CONFIG_SCSI_CONSTANTS=y +CONFIG_SCSI_LOGGING=y +CONFIG_SCSI_SCAN_ASYNC=y +CONFIG_SCSI_UFSHCD=y +CONFIG_SCSI_UFSHCD_PLATFORM=y +CONFIG_SCSI_UFS_QCOM=y +CONFIG_SCSI_UFS_QCOM_ICE=y +CONFIG_MD=y +CONFIG_BLK_DEV_DM=y +CONFIG_DM_CRYPT=y +CONFIG_DM_REQ_CRYPT=y +CONFIG_DM_UEVENT=y +CONFIG_DM_VERITY=y +CONFIG_DM_VERITY_FEC=y +CONFIG_NETDEVICES=y +CONFIG_DUMMY=y +CONFIG_TUN=y +CONFIG_RNDIS_IPA=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MPPE=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPPOE=y +CONFIG_PPPOL2TP=y +CONFIG_PPPOLAC=y +CONFIG_PPPOPNS=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_WCNSS_CORE=y +CONFIG_WCNSS_CORE_PRONTO=y +CONFIG_WCNSS_REGISTER_DUMP_ON_BITE=y +CONFIG_WCNSS_MEM_PRE_ALLOC=y +CONFIG_CNSS_CRYPTO=y +CONFIG_ATH_CARDS=y +CONFIG_WIL6210=m +CONFIG_CLD_LL_CORE=y +CONFIG_INPUT_EVDEV=y +CONFIG_INPUT_EVBUG=m +CONFIG_INPUT_KEYRESET=y +CONFIG_KEYBOARD_GPIO=y +# CONFIG_INPUT_MOUSE is not set +CONFIG_INPUT_JOYSTICK=y +CONFIG_JOYSTICK_XPAD=y +CONFIG_INPUT_TABLET=y +CONFIG_INPUT_TOUCHSCREEN=y +CONFIG_TOUCHSCREEN_FTS=y +CONFIG_TOUCHSCREEN_FT8006M=y +CONFIG_TOUCHSCREEN_ATMEL_MXT=y +CONFIG_TOUCHSCREEN_GEN_VKEYS=y +CONFIG_TOUCHSCREEN_FT5X06=y +CONFIG_TOUCHSCREEN_MAXIM_STI=y +CONFIG_INPUT_MISC=y +#CONFIG_INPUT_HBTP_INPUT=y +CONFIG_INPUT_KEYCHORD=y +CONFIG_INPUT_UINPUT=y +CONFIG_INPUT_GPIO=y +# CONFIG_VT is not set +# CONFIG_LEGACY_PTYS is not set +# CONFIG_DEVMEM is not set +# CONFIG_DEVKMEM is not set +CONFIG_SERIAL_MSM_HS=y +CONFIG_SERIAL_MSM_SMD=y +CONFIG_DIAG_CHAR=y +CONFIG_HW_RANDOM=y +CONFIG_HW_RANDOM_MSM_LEGACY=y +CONFIG_MSM_SMD_PKT=y +CONFIG_MSM_ADSPRPC=y +CONFIG_MSM_RDBG=m +CONFIG_I2C_CHARDEV=y +CONFIG_I2C_MSM_V2=y +CONFIG_SLIMBUS=y +CONFIG_SLIMBUS_MSM_NGD=y +CONFIG_SOUNDWIRE=y +CONFIG_SPI=y +CONFIG_SPI_QUP=y +CONFIG_SPI_SPIDEV=y +CONFIG_PINCTRL_MSM8952=y +CONFIG_PINCTRL_MSM8937=y +CONFIG_PINCTRL_MSMCOBALT=y +CONFIG_PINCTRL_MSM8940=y +CONFIG_PINCTRL_MSM8953=y +CONFIG_GPIO_SYSFS=y +CONFIG_GPIO_QPNP_PIN=y +CONFIG_SMB1351_USB_CHARGER=y +CONFIG_SMB135X_CHARGER=y +CONFIG_QPNP_SMBCHARGER=y +CONFIG_QPNP_FG=y +CONFIG_BATTERY_BCL=y +CONFIG_QPNP_TYPEC=n +CONFIG_MSM_BCL_CTL=y +CONFIG_MSM_BCL_PERIPHERAL_CTL=y +CONFIG_POWER_RESET_MSM=y +CONFIG_MSM_DLOAD_MODE=y +CONFIG_MSM_PM=y +CONFIG_APSS_CORE_EA=y +CONFIG_MSM_APM=y +CONFIG_SENSORS_EPM_ADC=y +CONFIG_SENSORS_QPNP_ADC_VOLTAGE=y +CONFIG_SENSORS_QPNP_ADC_CURRENT=y +CONFIG_THERMAL=y +CONFIG_THERMAL_TSENS8974=y +CONFIG_LIMITS_MONITOR=y +CONFIG_LIMITS_LITE_HW=y +CONFIG_THERMAL_MONITOR=y +CONFIG_THERMAL_QPNP=y +CONFIG_THERMAL_QPNP_ADC_TM=y +CONFIG_WCD9335_CODEC=y +CONFIG_REGULATOR=y +CONFIG_REGULATOR_FIXED_VOLTAGE=y +CONFIG_REGULATOR_STUB=y +CONFIG_REGULATOR_FAN53555=y +CONFIG_REGULATOR_MSM_GFX_LDO=y +CONFIG_REGULATOR_MEM_ACC=y +CONFIG_REGULATOR_RPM_SMD=y +CONFIG_REGULATOR_QPNP=y +CONFIG_REGULATOR_QPNP_LABIBB=y +CONFIG_REGULATOR_SPM=y +CONFIG_REGULATOR_CPR=y +CONFIG_REGULATOR_CPR3_HMSS=y +CONFIG_REGULATOR_CPR3_MMSS=y +CONFIG_REGULATOR_CPR4_APSS=y +CONFIG_REGULATOR_CPRH_KBSS=y +CONFIG_REGULATOR_KRYO=y +CONFIG_MEDIA_SUPPORT=y +CONFIG_MEDIA_CAMERA_SUPPORT=y +CONFIG_MEDIA_RADIO_SUPPORT=y +CONFIG_MEDIA_CONTROLLER=y +CONFIG_VIDEO_V4L2_SUBDEV_API=y +CONFIG_V4L_PLATFORM_DRIVERS=y +CONFIG_SOC_CAMERA=y +CONFIG_SOC_CAMERA_PLATFORM=y +CONFIG_MSM_VIDC_V4L2=y +CONFIG_MSM_VIDC_VMEM=y +CONFIG_MSM_VIDC_GOVERNORS=y +CONFIG_MSM_CAMERA=y +CONFIG_MSMB_CAMERA=y +CONFIG_MSM_CAMERA_SENSOR=y +CONFIG_MSM_CPP=y +CONFIG_MSM_CCI=y +CONFIG_MSM_CSI20_HEADER=y +CONFIG_MSM_CSI22_HEADER=y +CONFIG_MSM_CSI30_HEADER=y +CONFIG_MSM_CSI31_HEADER=y +CONFIG_MSM_CSIPHY=y +CONFIG_MSM_CSID=y +CONFIG_MSM_EEPROM=y +CONFIG_MSM_ISPIF=y +CONFIG_IMX134=y +CONFIG_IMX132=y +CONFIG_OV9724=y +CONFIG_OV5648=y +CONFIG_GC0339=y +CONFIG_OV8825=y +CONFIG_OV8865=y +CONFIG_s5k4e1=y +CONFIG_OV12830=y +CONFIG_MSM_V4L2_VIDEO_OVERLAY_DEVICE=y +CONFIG_MSMB_JPEG=y +CONFIG_MSM_FD=y +CONFIG_MSM_SDE_ROTATOR=y +CONFIG_RADIO_IRIS=y +CONFIG_RADIO_IRIS_TRANSPORT=y +CONFIG_RADIO_SILABS=y +CONFIG_MSM_KGSL=y +CONFIG_FB=y +CONFIG_FB_MSM=y +CONFIG_MSM_DBA=y +CONFIG_MSM_DBA_ADV7533=y +CONFIG_FB_MSM_MDSS=y +CONFIG_FB_MSM_MDSS_WRITEBACK=y +CONFIG_FB_MSM_MDSS_HDMI_PANEL=y +CONFIG_FB_MSM_MDSS_XLOG_DEBUG=y +CONFIG_BACKLIGHT_LCD_SUPPORT=y +CONFIG_SOUND=y +CONFIG_SND=y +CONFIG_SND_USB_AUDIO=y +CONFIG_SND_USB_AUDIO_QMI=y +CONFIG_SND_SOC=y +CONFIG_SND_SOC_MSM8X16=y +CONFIG_SND_SOC_AW87319=y +CONFIG_HIDRAW=y +CONFIG_UHID=y +CONFIG_HID_APPLE=y +CONFIG_HID_ELECOM=y +CONFIG_HID_MAGICMOUSE=y +CONFIG_HID_MICROSOFT=y +CONFIG_HID_MULTITOUCH=y +CONFIG_USB_HIDDEV=y +CONFIG_USB_ANNOUNCE_NEW_DEVICES=y +CONFIG_USB_MON=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_MSM=y +CONFIG_USB_EHCI_MSM_HSIC=y +CONFIG_USB_ACM=y +CONFIG_USB_STORAGE=y +CONFIG_USB_STORAGE_DATAFAB=y +CONFIG_USB_STORAGE_FREECOM=y +CONFIG_USB_STORAGE_ISD200=y +CONFIG_USB_STORAGE_USBAT=y +CONFIG_USB_STORAGE_SDDR09=y +CONFIG_USB_STORAGE_SDDR55=y +CONFIG_USB_STORAGE_JUMPSHOT=y +CONFIG_USB_STORAGE_ALAUDA=y +CONFIG_USB_STORAGE_KARMA=y +CONFIG_USB_STORAGE_CYPRESS_ATACB=y +CONFIG_USB_DWC3=y +CONFIG_USB_SERIAL=y +CONFIG_USB_EHSET_TEST_FIXTURE=y +CONFIG_NOP_USB_XCEIV=y +CONFIG_USB_MSM_HSPHY=y +CONFIG_USB_MSM_SSPHY_QMP=y +CONFIG_MSM_QUSB_PHY=y +CONFIG_DUAL_ROLE_USB_INTF=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_DEBUG_FILES=y +CONFIG_USB_GADGET_DEBUG_FS=y +CONFIG_USB_GADGET_VBUS_DRAW=500 +CONFIG_USB_CI13XXX_MSM=y +CONFIG_USB_G_ANDROID=y +CONFIG_MMC=y +#CONFIG_MMC_PERF_PROFILING=y +CONFIG_MMC_CLKGATE=y +CONFIG_MMC_PARANOID_SD_INIT=y +CONFIG_MMC_BLOCK_MINORS=32 +CONFIG_MMC_BLOCK_DEFERRED_RESUME=y +CONFIG_MMC_TEST=m +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_PLTFM=y +CONFIG_MMC_SDHCI_MSM=y +CONFIG_MMC_SDHCI_MSM_ICE=y +CONFIG_MMC_CQ_HCI=y +CONFIG_LEDS_QPNP=y +CONFIG_LEDS_QPNP_FLASH=y +CONFIG_LEDS_QPNP_WLED=y +CONFIG_LEDS_TRIGGERS=y +CONFIG_SWITCH=y +CONFIG_EDAC=y +CONFIG_EDAC_MM_EDAC=y +CONFIG_EDAC_CORTEX_ARM64=y +CONFIG_EDAC_CORTEX_ARM64_DBE_IRQ_ONLY=y +CONFIG_EDAC_CORTEX_ARM64_PANIC_ON_UE=y +CONFIG_RTC_CLASS=y +CONFIG_RTC_DRV_QPNP=y +CONFIG_DMADEVICES=y +CONFIG_QCOM_SPS_DMA=y +CONFIG_UIO=y +CONFIG_UIO_MSM_SHAREDMEM=y +CONFIG_STAGING=y +CONFIG_ANDROID=y +CONFIG_ANDROID_BINDER_IPC=y +CONFIG_ASHMEM=y +CONFIG_ANDROID_TIMED_GPIO=y +CONFIG_ANDROID_LOW_MEMORY_KILLER=y +CONFIG_SW_SYNC_USER=y +CONFIG_ION=y +CONFIG_ION_MSM=y +CONFIG_MSM_AVTIMER=y +CONFIG_MSM_BUS_SCALING=y +CONFIG_BUS_TOPOLOGY_ADHOC=y +CONFIG_QPNP_POWER_ON=y +CONFIG_QPNP_REVID=y +CONFIG_QPNP_COINCELL=y +CONFIG_SPS=y +CONFIG_USB_BAM=y +CONFIG_SPS_SUPPORT_NDP_BAM=y +CONFIG_IPA=y +CONFIG_RMNET_IPA=y +CONFIG_QPNP_HAPTIC=y +CONFIG_MSM_SPMI=y +CONFIG_MSM_SPMI_PMIC_ARB=y +CONFIG_MSM_QPNP_INT=y +CONFIG_CP_ACCESS64=y +CONFIG_MSM_ADSP_LOADER=y +CONFIG_MSM_MEMORY_DUMP_V2=y +CONFIG_MSM_BOOT_STATS=y +CONFIG_MSM_CPUSS_DUMP=y +CONFIG_MSM_COMMON_LOG=y +CONFIG_MSM_DDR_HEALTH=y +CONFIG_MSM_WATCHDOG_V2=y +CONFIG_MSM_FORCE_WDOG_BITE_ON_PANIC=y +CONFIG_MSM_RPM_SMD=y +CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG=y +CONFIG_MSM_RPM_LOG=y +CONFIG_MSM_RPM_STATS_LOG=y +CONFIG_MSM_RUN_QUEUE_STATS=y +CONFIG_MSM_SCM=y +CONFIG_MSM_SCM_XPU=y +CONFIG_MSM_MPM_OF=y +CONFIG_MSM_SMEM=y +CONFIG_MSM_SMD=y +#CONFIG_MSM_SMD_DEBUG=y +CONFIG_MSM_GLINK=y +CONFIG_MSM_GLINK_LOOPBACK_SERVER=y +CONFIG_MSM_GLINK_SMD_XPRT=y +CONFIG_MSM_GLINK_SMEM_NATIVE_XPRT=y +#CONFIG_MSM_SPCOM=y +CONFIG_MSM_SMEM_LOGGING=y +CONFIG_MSM_SMP2P=y +CONFIG_MSM_SMP2P_TEST=y +CONFIG_MSM_SPM=y +CONFIG_MSM_L2_SPM=y +CONFIG_MSM_QMI_INTERFACE=y +CONFIG_MSM_IPC_ROUTER_SMD_XPRT=y +CONFIG_MSM_EVENT_TIMER=y +CONFIG_MSM_TZ_SMMU=y +CONFIG_MSM_SUBSYSTEM_RESTART=y +CONFIG_MSM_SYSMON_COMM=y +CONFIG_MSM_PIL=y +CONFIG_MSM_PIL_SSR_GENERIC=y +CONFIG_MSM_PIL_MSS_QDSP6V5=y +CONFIG_ICNSS=y +CONFIG_MSM_BAM_DMUX=y +CONFIG_MSM_PERFORMANCE=y +CONFIG_MSM_KERNEL_PROTECT=y +CONFIG_MSM_KERNEL_PROTECT_MPU=y +CONFIG_MEM_SHARE_QMI_SERVICE=y +CONFIG_MSM_CLK_CONTROLLER_V2=y +CONFIG_MSM_MDSS_PLL=y +CONFIG_REMOTE_SPINLOCK_MSM=y +CONFIG_MSM_IOMMU_V1=y +CONFIG_ARM_SMMU=y +CONFIG_IOMMU_DEBUG=y +CONFIG_IOMMU_TESTS=y +CONFIG_SPDM_SCM=y +CONFIG_DEVFREQ_SPDM=y +CONFIG_PWM=y +CONFIG_PWM_QPNP=y +CONFIG_ARM_GIC_PANIC_HANDLER=y +CONFIG_ARM_GIC_V3_ACL=y +#CONFIG_CORESIGHT=y +#CONFIG_CORESIGHT_EVENT=y +#CONFIG_CORESIGHT_FUSE=y +#CONFIG_CORESIGHT_CTI=y +#CONFIG_CORESIGHT_CTI_SAVE_DISABLE=y +#CONFIG_CORESIGHT_TMC=y +#CONFIG_CORESIGHT_TPIU=y +#CONFIG_CORESIGHT_FUNNEL=y +#CONFIG_CORESIGHT_REPLICATOR=y +#CONFIG_CORESIGHT_STM=y +#CONFIG_CORESIGHT_HWEVENT=y +CONFIG_SENSORS_SSC=y +CONFIG_MSM_TZ_LOG=y +CONFIG_EXT2_FS=y +CONFIG_EXT2_FS_XATTR=y +CONFIG_EXT3_FS=y +# CONFIG_EXT3_DEFAULTS_TO_ORDERED is not set +CONFIG_EXT4_FS=y +CONFIG_EXT4_FS_SECURITY=y +CONFIG_QUOTA=y +# CONFIG_PRINT_QUOTA_WARNING is not set +CONFIG_FUSE_FS=y +CONFIG_MSDOS_FS=y +CONFIG_VFAT_FS=y +CONFIG_TMPFS=y +CONFIG_TMPFS_POSIX_ACL=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_ASCII=y +CONFIG_NLS_ISO8859_1=y +CONFIG_PRINTK_TIME=y +CONFIG_DEBUG_INFO=y +CONFIG_MAGIC_SYSRQ=y +CONFIG_PANIC_TIMEOUT=5 +CONFIG_PANIC_ON_RECURSIVE_FAULT=y +# CONFIG_SCHED_DEBUG is not set +CONFIG_SCHEDSTATS=y +CONFIG_TIMER_STATS=y +CONFIG_IPC_LOGGING=y +CONFIG_CPU_FREQ_SWITCH_PROFILER=y +CONFIG_DEBUG_SET_MODULE_RONX=y +CONFIG_DEBUG_RODATA=y +CONFIG_SECURITY=y +CONFIG_SECURITY_NETWORK=y +CONFIG_LSM_MMAP_MIN_ADDR=4096 +CONFIG_SECURITY_SELINUX=y +CONFIG_CRYPTO_NULL=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XCBC=y +CONFIG_CRYPTO_MD4=y +CONFIG_CRYPTO_TWOFISH=y +CONFIG_CRYPTO_DEV_QCRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_MSM_QCE=y +CONFIG_CRYPTO_DEV_QCEDEV=y +CONFIG_CRYPTO_DEV_OTA_CRYPTO=y +CONFIG_CRYPTO_DEV_QCOM_ICE=y +CONFIG_ARM64_CRYPTO=y +CONFIG_CRYPTO_SHA1_ARM64_CE=y +CONFIG_CRYPTO_SHA2_ARM64_CE=y +CONFIG_CRYPTO_GHASH_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE=y +CONFIG_CRYPTO_AES_ARM64_CE_CCM=y +CONFIG_CRYPTO_AES_ARM64_CE_BLK=y +CONFIG_CRYPTO_AES_ARM64_NEON_BLK=y +CONFIG_QMI_ENCDEC=y +## MIUI ADD:START +## Multi userspace config support +CONFIG_ECRYPT_FS=y +CONFIG_KEYS=y +CONFIG_ENCRYPTED_KEYS=y +CONFIG_CRYPTO=y +CONFIG_CRYPTO_AES=y +CONFIG_CRYPTO_SHA1=y +CONFIG_CRYPTO_SHA256=y +CONFIG_CRYPTO_MD5=y +CONFIG_CRYPTO_GF128MUL=y +CONFIG_CRYPTO_SEQIV=y +CONFIG_CRYPTO_CTR=y +CONFIG_CRYPTO_XTS=y +CONFIG_NAMESPACES=y +#CONFIG_UTS_NS=y +#CONFIG_IPC_NS=y +## do not turn on user-namespaces as it enables +## CONFIG_UIDGID_STRICT_TYPE_CHECKS, which results in several compile +## errors +#CONFIG_USER_NS=y +#CONFIG_PID_NS=y +CONFIG_NET_NS=y +CONFIG_VETH=y +## END +CONFIG_LEDS_AW2013=y +CONFIG_D1_ROSY=y +CONFIG_CPUMAXFREQ=y +CONFIG_SERIAL_NUM=y +CONFIG_SECBOOT_FUSE=y +##enable RTB +#CONFIG_MSM_RTB=y +CONFIG_MSM_RTB_SEPARATE_CPUS=y +CONFIG_DYNAMIC_DEBUG=y +#CONFIG_DEBUG_SPINLOCK=y +CONFIG_MSM_DEBUG_LAR_UNLOCK=y +CONFIG_CORESIGHT_DBGUI=y +CONFIG_LEDS_GPIO=y +CONFIG_FINGERPRINT_ROSY=y +CONFIG_FINGERPRINT_GOODIX_GF3208_ROSY=y +CONFIG_FINGERPRINT_FPC1020_ROSY=y +CONFIG_SUSPEND_SKIP_SYNC=y +CONFIG_DISABLE_TEMP_PROTECT=n +CONFIG_PSTORE=y +CONFIG_PSTORE_CONSOLE=y +CONFIG_PSTORE_FTRACE=y +CONFIG_PSTORE_PMSG=y +CONFIG_PSTORE_RAM=y +CONFIG_PSTORE_LAST_KMSG=y + +CONFIG_DUMP_ALL_STACKS=y +# CONFIG_FIRE_WATCHDOG is not set + +CONFIG_BOOT_INFO=y +CONFIG_OF_FLATTREE=y + +#Add CIFS Config +CONFIG_NETWORK_FILESYSTEMS=y +CONFIG_CIFS=y +CONFIG_NLS=y +CONFIG_NLS_DEFAULT="iso8859-1" +CONFIG_NLS_CODEPAGE_936=y +CONFIG_NLS_CODEPAGE_950=y +CONFIG_NLS_CODEPAGE_437=y +CONFIG_NLS_UTF8=y + +#CONFIG_ZRAM_DEBUG=y +CONFIG_SWAP=y +CONFIG_MEMCG=y +CONFIG_MEMCG_SWAP=y +CONFIG_ANDROID_WHETSTONE=y +CONFIG_CGROUP_MEM_RES_CTLR=y +CONFIG_CGROUP_MEM_RES_CTLR_SWAP=y + +# sdcardfs +CONFIG_SDCARD_FS=y diff --git a/arch/arm64/include/asm/app_api.h b/arch/arm64/include/asm/app_api.h index 2162400fde13b..0e6a469cd6836 100644 --- a/arch/arm64/include/asm/app_api.h +++ b/arch/arm64/include/asm/app_api.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -27,16 +27,24 @@ #ifdef CONFIG_MSM_APP_API extern void set_app_setting_bit(uint32_t bit); extern void clear_app_setting_bit(uint32_t bit); +extern void set_app_setting_bit_for_32bit_apps(void); +extern void clear_app_setting_bit_for_32bit_apps(void); #else static inline void set_app_setting_bit(uint32_t bit) {} static inline void clear_app_setting_bit(uint32_t bit) {} +static inline void set_app_setting_bit_for_32bit_apps(void) {} +static inline void clear_app_setting_bit_for_32bit_apps(void) {} #endif #ifdef CONFIG_MSM_APP_SETTINGS extern void switch_app_setting_bit(struct task_struct *prev, struct task_struct *next); +extern void switch_32bit_app_setting_bit(struct task_struct *prev, + struct task_struct *next); extern void apply_app_setting_bit(struct file *file); extern bool use_app_setting; +extern bool use_32bit_app_setting; +extern bool use_32bit_app_setting_pro; #endif #endif diff --git a/arch/arm64/include/asm/bootinfo.h b/arch/arm64/include/asm/bootinfo.h new file mode 100644 index 0000000000000..b2db0353e4211 --- /dev/null +++ b/arch/arm64/include/asm/bootinfo.h @@ -0,0 +1,51 @@ +/* + * bootinfo.h + * + * 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 __ASMARM_BOOTINFO_H +#define __ASMARM_BOOTINFO_H + +#define HW_MAJOR_VERSION_SHIFT 4 +#define HW_MAJOR_VERSION_MASK 0xF0 +#define HW_MINOR_VERSION_SHIFT 0 +#define HW_MINOR_VERSION_MASK 0x0F + +typedef enum { + PU_REASON_EVENT_HWRST, + PU_REASON_EVENT_SMPL, + PU_REASON_EVENT_RTC, + PU_REASON_EVENT_DC_CHG, + PU_REASON_EVENT_USB_CHG, + PU_REASON_EVENT_PON1, + PU_REASON_EVENT_CABLE, + PU_REASON_EVENT_KPD, + PU_REASON_EVENT_WARMRST, + PU_REASON_EVENT_LPK, + PU_REASON_MAX +} powerup_reason_t; + +enum { + RS_REASON_EVENT_WDOG, + RS_REASON_EVENT_KPANIC, + RS_REASON_EVENT_NORMAL, + RS_REASON_EVENT_OTHER, + RS_REASON_MAX +}; + +#define RESTART_EVENT_WDOG 0x10000 +#define RESTART_EVENT_KPANIC 0x20000 +#define RESTART_EVENT_NORMAL 0x40000 +#define RESTART_EVENT_OTHER 0x80000 + +unsigned int get_powerup_reason(void); +int is_abnormal_powerup(void); +void set_powerup_reason(unsigned int powerup_reason); +unsigned int get_hw_version(void); +void set_hw_version(unsigned int hw_version); +unsigned int get_hw_version_major(void); +unsigned int get_hw_version_minor(void); +#endif diff --git a/arch/arm64/include/asm/cache.h b/arch/arm64/include/asm/cache.h index 7bdbfe85b0bf6..82e822bbb0e04 100644 --- a/arch/arm64/include/asm/cache.h +++ b/arch/arm64/include/asm/cache.h @@ -18,17 +18,17 @@ #include -#define L1_CACHE_SHIFT 7 +#define L1_CACHE_SHIFT 6 #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) /* * Memory returned by kmalloc() may be used for DMA, so we must make - * sure that all such allocations are cache aligned. Otherwise, - * unrelated code may cause parts of the buffer to be read into the - * cache before the transfer is done, causing old data to be seen by - * the CPU. + * sure that all such allocations are aligned to the maximum *known* + * cache line size on ARMv8 systems. Otherwise, unrelated code may cause + * parts of the buffer to be read into the cache before the transfer is + * done, causing old data to be seen by the CPU. */ -#define ARCH_DMA_MINALIGN L1_CACHE_BYTES +#define ARCH_DMA_MINALIGN (128) #ifndef __ASSEMBLY__ diff --git a/arch/arm64/include/asm/processor.h b/arch/arm64/include/asm/processor.h index bd4e7c7096055..d69981ac0765d 100644 --- a/arch/arm64/include/asm/processor.h +++ b/arch/arm64/include/asm/processor.h @@ -31,6 +31,7 @@ #include #include +#include #include #include diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 7b00b863c648f..0ad51096c9b6b 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -20,6 +20,7 @@ arm64-obj-y := cputable.o debug-monitors.o entry.o irq.o fpsimd.o \ hyp-stub.o psci.o psci-call.o cpu_ops.o insn.o \ return_address.o cpuinfo.o cpu_errata.o cpufeature.o alternative.o +arm64-obj-$(CONFIG_BOOT_INFO) += bootinfo.o arm64-obj-$(CONFIG_COMPAT) += sys32.o kuser32.o signal32.o \ sys_compat.o \ ../../arm/kernel/opcodes.o diff --git a/arch/arm64/kernel/app_api.c b/arch/arm64/kernel/app_api.c index 39eeee1a9029b..e995bbf3c7b4b 100644 --- a/arch/arm64/kernel/app_api.c +++ b/arch/arm64/kernel/app_api.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -18,6 +18,7 @@ #include static spinlock_t spinlock; +static spinlock_t spinlock_32bit_app; static DEFINE_PER_CPU(int, app_config_applied); static unsigned long app_config_set[NR_CPUS]; static unsigned long app_config_clear[NR_CPUS]; @@ -67,9 +68,68 @@ void clear_app_setting_bit(uint32_t bit) } EXPORT_SYMBOL(clear_app_setting_bit); +void set_app_setting_bit_for_32bit_apps(void) +{ + unsigned long flags; + uint64_t reg; + + spin_lock_irqsave(&spinlock_32bit_app, flags); + if (use_32bit_app_setting) { + asm volatile("mrs %0, S3_0_c15_c15_0 " : "=r" (reg)); + reg = reg | BIT(24); + isb(); + asm volatile("msr S3_0_c15_c15_0, %0" : : "r" (reg)); + isb(); + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg | BIT(18) | BIT(2) | BIT(0); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } else if (use_32bit_app_setting_pro) { + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg | BIT(18); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } + spin_unlock_irqrestore(&spinlock_32bit_app, flags); +} +EXPORT_SYMBOL(set_app_setting_bit_for_32bit_apps); + +void clear_app_setting_bit_for_32bit_apps(void) +{ + unsigned long flags; + uint64_t reg; + + spin_lock_irqsave(&spinlock_32bit_app, flags); + if (use_32bit_app_setting) { + asm volatile("mrs %0, S3_0_c15_c15_0 " : "=r" (reg)); + reg = reg & ~BIT(24); + isb(); + asm volatile("msr S3_0_c15_c15_0, %0" : : "r" (reg)); + isb(); + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg & ~BIT(18); + reg = reg & ~BIT(2); + reg = reg & ~BIT(0); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } else if (use_32bit_app_setting_pro) { + asm volatile("mrs %0, S3_0_c15_c15_1 " : "=r" (reg)); + reg = reg & ~BIT(18); + isb(); + asm volatile("msr S3_0_c15_c15_1, %0" : : "r" (reg)); + isb(); + } + spin_unlock_irqrestore(&spinlock_32bit_app, flags); +} +EXPORT_SYMBOL(clear_app_setting_bit_for_32bit_apps); + static int __init init_app_api(void) { spin_lock_init(&spinlock); + spin_lock_init(&spinlock_32bit_app); return 0; } early_initcall(init_app_api); diff --git a/arch/arm64/kernel/app_setting.c b/arch/arm64/kernel/app_setting.c index 6b4eb28d0e244..f45220c99404d 100644 --- a/arch/arm64/kernel/app_setting.c +++ b/arch/arm64/kernel/app_setting.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -35,6 +35,14 @@ bool use_app_setting = true; module_param(use_app_setting, bool, 0644); MODULE_PARM_DESC(use_app_setting, "control use of app specific settings"); +bool use_32bit_app_setting = false; +module_param(use_32bit_app_setting, bool, 0644); +MODULE_PARM_DESC(use_32bit_app_setting, "control use of 32 bit app specific settings"); + +bool use_32bit_app_setting_pro = false; +module_param(use_32bit_app_setting_pro, bool, 0644); +MODULE_PARM_DESC(use_32bit_app_setting_pro, "control use of 32 bit app specific settings"); + static int set_name(const char *str, struct kernel_param *kp) { int len = strlen(str); @@ -87,6 +95,17 @@ void switch_app_setting_bit(struct task_struct *prev, struct task_struct *next) } EXPORT_SYMBOL(switch_app_setting_bit); +void switch_32bit_app_setting_bit(struct task_struct *prev, + struct task_struct *next) +{ + if (prev->mm && unlikely(is_compat_thread(task_thread_info(prev)))) + clear_app_setting_bit_for_32bit_apps(); + + if (next->mm && unlikely(is_compat_thread(task_thread_info(next)))) + set_app_setting_bit_for_32bit_apps(); +} +EXPORT_SYMBOL(switch_32bit_app_setting_bit); + void apply_app_setting_bit(struct file *file) { bool found = false; diff --git a/arch/arm64/kernel/bootinfo.c b/arch/arm64/kernel/bootinfo.c new file mode 100644 index 0000000000000..b4c51395705cc --- /dev/null +++ b/arch/arm64/kernel/bootinfo.c @@ -0,0 +1,203 @@ +/* + * bootinfo.c + * + * Copyright (C) 2011 Xiaomi 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 +#include +#include +#include +#include +#include +#include +#include +#include + +static const char * const powerup_reasons[PU_REASON_MAX] = { + [PU_REASON_EVENT_KPD] = "keypad", + [PU_REASON_EVENT_RTC] = "rtc", + [PU_REASON_EVENT_CABLE] = "cable", + [PU_REASON_EVENT_SMPL] = "smpl", + [PU_REASON_EVENT_PON1] = "pon1", + [PU_REASON_EVENT_USB_CHG] = "usb_chg", + [PU_REASON_EVENT_DC_CHG] = "dc_chg", + [PU_REASON_EVENT_HWRST] = "hw_reset", + [PU_REASON_EVENT_LPK] = "long_power_key", +}; + +static const char * const reset_reasons[RS_REASON_MAX] = { + [RS_REASON_EVENT_WDOG] = "wdog", + [RS_REASON_EVENT_KPANIC] = "kpanic", + [RS_REASON_EVENT_NORMAL] = "reboot", + [RS_REASON_EVENT_OTHER] = "other", +}; + +static struct kobject *bootinfo_kobj = NULL; +static powerup_reason_t powerup_reason; +static unsigned int hw_version; + +#define bootinfo_attr(_name) \ +static struct kobj_attribute _name##_attr = { \ + .attr = { \ + .name = __stringify(_name), \ + .mode = 0644, \ + }, \ + .show = _name##_show, \ + .store = NULL, \ +} + +#define bootinfo_func_init(type,name,initval) \ + static type name = (initval); \ + type get_##name(void) \ + { \ + return name; \ + } \ + void set_##name(type __##name) \ + { \ + name = __##name; \ + } \ + EXPORT_SYMBOL(set_##name); \ + EXPORT_SYMBOL(get_##name); + +int is_abnormal_powerup(void) +{ + u32 pu_reason = get_powerup_reason(); + return (pu_reason & (RESTART_EVENT_KPANIC | RESTART_EVENT_WDOG)) | + (pu_reason & BIT(PU_REASON_EVENT_HWRST) & RESTART_EVENT_OTHER); +} + +static ssize_t powerup_reason_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) +{ + char *s = buf; + u32 pu_reason; + int pu_reason_index = PU_REASON_MAX; + u32 reset_reason; + int reset_reason_index = RS_REASON_MAX; + + pu_reason = get_powerup_reason(); + if (((pu_reason & BIT(PU_REASON_EVENT_HWRST)) + && qpnp_pon_is_ps_hold_reset()) || + (pu_reason & BIT(PU_REASON_EVENT_WARMRST))) { + reset_reason = pu_reason >> 16; + reset_reason_index = find_first_bit((unsigned long *)&reset_reason, + sizeof(reset_reason)*BITS_PER_BYTE); + if (reset_reason_index < RS_REASON_MAX && reset_reason_index >= 0) { + s += sprintf(s, "%s\n", reset_reasons[reset_reason_index]); + printk(KERN_DEBUG "%s: rs_reason [0x%x], first non-zero bit" + " %d\n", __func__, reset_reason, reset_reason_index); + goto out; + }; + } + if (qpnp_pon_is_lpk() && + (pu_reason & BIT(PU_REASON_EVENT_HWRST))) + pu_reason_index = PU_REASON_EVENT_LPK; + else if (pu_reason & BIT(PU_REASON_EVENT_HWRST)) + pu_reason_index = PU_REASON_EVENT_HWRST; + else if (pu_reason & BIT(PU_REASON_EVENT_SMPL)) + pu_reason_index = PU_REASON_EVENT_SMPL; + else if (pu_reason & BIT(PU_REASON_EVENT_RTC)) + pu_reason_index = PU_REASON_EVENT_RTC; + else if (pu_reason & BIT(PU_REASON_EVENT_USB_CHG)) + pu_reason_index = PU_REASON_EVENT_USB_CHG; + else if (pu_reason & BIT(PU_REASON_EVENT_DC_CHG)) + pu_reason_index = PU_REASON_EVENT_DC_CHG; + else if (pu_reason & BIT(PU_REASON_EVENT_KPD)) + pu_reason_index = PU_REASON_EVENT_KPD; + else if (pu_reason & BIT(PU_REASON_EVENT_PON1)) + pu_reason_index = PU_REASON_EVENT_PON1; + if (pu_reason_index < PU_REASON_MAX && pu_reason_index >=0) { + s += sprintf(s, "%s\n", powerup_reasons[pu_reason_index]); + printk(KERN_DEBUG "%s: pu_reason [0x%x] index %d\n", + __func__, pu_reason, pu_reason_index); + goto out; + } + s += sprintf(s, "unknown reboot\n"); +out: + return (s - buf); +} + +static ssize_t powerup_reason_details_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) +{ + u32 pu_reason; + + pu_reason = get_powerup_reason(); + + return sprintf(buf, "0x%x\n", pu_reason); +} + +static ssize_t hw_version_show(struct kobject *kobj, struct kobj_attribute *attr, char * buf) +{ + u32 hw_version; + + hw_version = get_hw_version(); + + return sprintf(buf, "0x%x\n", hw_version); +} + +bootinfo_attr(powerup_reason); +bootinfo_attr(powerup_reason_details); +bootinfo_attr(hw_version); +bootinfo_func_init(u32, powerup_reason, 0); +bootinfo_func_init(u32, hw_version, 0); + +unsigned int get_hw_version_major(void) { + return ((get_hw_version() & HW_MAJOR_VERSION_MASK) >> HW_MAJOR_VERSION_SHIFT); +} +EXPORT_SYMBOL(get_hw_version_major); + +unsigned int get_hw_version_minor(void) { + return ((get_hw_version() & HW_MINOR_VERSION_MASK) >> HW_MINOR_VERSION_SHIFT); +} + +static struct attribute * g[] = { + &powerup_reason_attr.attr, + &powerup_reason_details_attr.attr, + &hw_version_attr.attr, + NULL, +}; + +static struct attribute_group attr_group = { + .attrs = g, +}; + +static int __init bootinfo_init(void) +{ + int ret = -ENOMEM; + + bootinfo_kobj = kobject_create_and_add("bootinfo", NULL); + if (bootinfo_kobj == NULL) { + printk("bootinfo_init: subsystem_register failed\n"); + goto fail; + } + + ret = sysfs_create_group(bootinfo_kobj, &attr_group); + if (ret) { + printk("bootinfo_init: subsystem_register failed\n"); + goto sys_fail; + } + + return ret; + +sys_fail: + kobject_del(bootinfo_kobj); +fail: + return ret; + +} + +static void __exit bootinfo_exit(void) +{ + if (bootinfo_kobj) { + sysfs_remove_group(bootinfo_kobj, &attr_group); + kobject_del(bootinfo_kobj); + } +} + +core_initcall(bootinfo_init); +module_exit(bootinfo_exit); + diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index 1a4a85e7fa9d2..f2fe7c774732f 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c @@ -330,22 +330,31 @@ armpmu_add(struct perf_event *event, int flags) } static int -validate_event(struct pmu_hw_events *hw_events, - struct perf_event *event) +validate_event(struct pmu *pmu, struct pmu_hw_events *hw_events, + struct perf_event *event) { - struct arm_pmu *armpmu = to_arm_pmu(event->pmu); + struct arm_pmu *armpmu; struct hw_perf_event fake_event = event->hw; struct pmu *leader_pmu = event->group_leader->pmu; if (is_software_event(event)) return 1; + /* + * Reject groups spanning multiple HW PMUs (e.g. CPU + CCI). The + * core perf code won't check that the pmu->ctx == leader->ctx + * until after pmu->event_init(event). + */ + if (event->pmu != pmu) + return 0; + if (event->pmu != leader_pmu || event->state < PERF_EVENT_STATE_OFF) return 1; if (event->state == PERF_EVENT_STATE_OFF && !event->attr.enable_on_exec) return 1; + armpmu = to_arm_pmu(event->pmu); return armpmu->get_event_idx(hw_events, &fake_event) >= 0; } @@ -363,15 +372,15 @@ validate_group(struct perf_event *event) memset(fake_used_mask, 0, sizeof(fake_used_mask)); fake_pmu.used_mask = fake_used_mask; - if (!validate_event(&fake_pmu, leader)) + if (!validate_event(event->pmu, &fake_pmu, leader)) return -EINVAL; list_for_each_entry(sibling, &leader->sibling_list, group_entry) { - if (!validate_event(&fake_pmu, sibling)) + if (!validate_event(event->pmu, &fake_pmu, sibling)) return -EINVAL; } - if (!validate_event(&fake_pmu, event)) + if (!validate_event(event->pmu, &fake_pmu, event)) return -EINVAL; return 0; @@ -1614,7 +1623,9 @@ static struct notifier_block perf_cpu_idle_nb = { */ static const struct of_device_id armpmu_of_device_ids[] = { {.compatible = "arm,armv8-pmuv3"}, +#ifdef CONFIG_ARCH_MSM8996 {.compatible = "qcom,kryo-pmuv3", .data = kryo_pmu_init}, +#endif {}, }; diff --git a/arch/arm64/kernel/perf_trace_counters.c b/arch/arm64/kernel/perf_trace_counters.c index ffcf3d00bd5d4..0fb98052b5865 100644 --- a/arch/arm64/kernel/perf_trace_counters.c +++ b/arch/arm64/kernel/perf_trace_counters.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2014, 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 @@ -124,6 +124,7 @@ static ssize_t write_enabled_perftp_file_bool(struct file *file, char buf[32]; size_t buf_size; + buf[0] = 0; buf_size = min(count, (sizeof(buf)-1)); if (copy_from_user(buf, user_buf, buf_size)) return -EFAULT; diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index 52b19aee51b52..475f27fbff7b1 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -63,6 +63,7 @@ #include #include #include +#include unsigned int processor_id; EXPORT_SYMBOL(processor_id); @@ -85,6 +86,8 @@ unsigned int compat_elf_hwcap __read_mostly = COMPAT_ELF_HWCAP_DEFAULT; unsigned int compat_elf_hwcap2 __read_mostly; #endif +extern void pstore_ram_reserve_memory(void); + DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS); unsigned int boot_reason; @@ -246,9 +249,9 @@ static void __init setup_processor(void) if (!cwg) pr_warn("No Cache Writeback Granule information, assuming cache line size %d\n", cls); - if (L1_CACHE_BYTES < cls) - pr_warn("L1_CACHE_BYTES smaller than the Cache Writeback Granule (%d < %d)\n", - L1_CACHE_BYTES, cls); + if (ARCH_DMA_MINALIGN < cls) + pr_warn("ARCH_DMA_MINALIGN smaller than the Cache Writeback Granule (%d < %d)\n", + ARCH_DMA_MINALIGN, cls); /* * ID_AA64ISAR0_EL1 contains 4-bit wide signed feature blocks. @@ -380,6 +383,14 @@ static void __init request_standard_resources(void) request_resource(res, &kernel_data); } } +#ifdef CONFIG_OF_FLATTREE +void __init early_init_dt_setup_pureason_arch(unsigned long pu_reason) +{ + set_powerup_reason(pu_reason); + pr_info("Powerup reason=0x%x\n", get_powerup_reason()); +} +#endif + #ifdef CONFIG_BLK_DEV_INITRD /* @@ -496,6 +507,10 @@ void __init setup_arch(char **cmdline_p) smp_build_mpidr_hash(); #endif +#ifdef CONFIG_PSTORE + pstore_ram_reserve_memory(); +#endif + #ifdef CONFIG_VT #if defined(CONFIG_VGA_CONSOLE) conswitchp = &vga_con; diff --git a/arch/arm64/kernel/smp_spin_table.c b/arch/arm64/kernel/smp_spin_table.c index 0d9afcfcae92a..f189668566caf 100644 --- a/arch/arm64/kernel/smp_spin_table.c +++ b/arch/arm64/kernel/smp_spin_table.c @@ -25,6 +25,7 @@ #include #include #include +#include #include static phys_addr_t cpu_release_addr[NR_CPUS]; diff --git a/arch/arm64/kernel/sys.c b/arch/arm64/kernel/sys.c index 3fa98ff14f0ee..df20b79188549 100644 --- a/arch/arm64/kernel/sys.c +++ b/arch/arm64/kernel/sys.c @@ -50,7 +50,7 @@ asmlinkage long sys_mmap(unsigned long addr, unsigned long len, * The sys_call_table array must be 4K aligned to be accessible from * kernel/entry.S. */ -void *sys_call_table[__NR_syscalls] __aligned(4096) = { +void * const sys_call_table[__NR_syscalls] __aligned(4096) = { [0 ... __NR_syscalls - 1] = sys_ni_syscall, #include }; diff --git a/arch/arm64/mm/dma-mapping.c b/arch/arm64/mm/dma-mapping.c index 264fdd42e84e3..5d340f5098e1b 100644 --- a/arch/arm64/mm/dma-mapping.c +++ b/arch/arm64/mm/dma-mapping.c @@ -448,6 +448,7 @@ static void arm64_dma_unremap(struct device *dev, void *remapped_addr, { struct vm_struct *area; + size = PAGE_ALIGN(size); remapped_addr = (void *)((unsigned long)remapped_addr & PAGE_MASK); area = find_vm_area(remapped_addr); diff --git a/arch/arm64/mm/fault.c b/arch/arm64/mm/fault.c index bc3556c118a2d..0820cd98fbba4 100644 --- a/arch/arm64/mm/fault.c +++ b/arch/arm64/mm/fault.c @@ -226,7 +226,8 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr, if (esr & ESR_LNX_EXEC) { vm_flags = VM_EXEC; - } else if (esr & ESR_EL1_WRITE) { + } else if (((esr & ESR_EL1_WRITE) && !(esr & ESR_EL1_CM)) || + ((esr & ESR_EL1_CM) && !(mm_flags & FAULT_FLAG_USER))) { vm_flags = VM_WRITE; mm_flags |= FAULT_FLAG_WRITE; } diff --git a/block/blk-flush.c b/block/blk-flush.c index 10679fe62c8c3..d9a005037179d 100644 --- a/block/blk-flush.c +++ b/block/blk-flush.c @@ -112,6 +112,7 @@ #include "blk.h" #include "blk-mq.h" +#include "blk-mq-tag.h" /* FLUSH/FUA sequences */ enum { @@ -283,7 +284,12 @@ static void flush_end_io(struct request *flush_rq, int error) struct blk_flush_queue *fq = blk_get_flush_queue(q, flush_rq->mq_ctx); if (q->mq_ops) { + struct blk_mq_hw_ctx *hctx; + + /* release the tag's ownership to the req cloned from */ spin_lock_irqsave(&fq->mq_flush_lock, flags); + hctx = q->mq_ops->map_queue(q, flush_rq->mq_ctx->cpu); + blk_mq_tag_set_rq(hctx, flush_rq->tag, fq->orig_rq); flush_rq->tag = -1; } @@ -366,11 +372,18 @@ static bool blk_kick_flush(struct request_queue *q, struct blk_flush_queue *fq) /* * Borrow tag from the first request since they can't - * be in flight at the same time. + * be in flight at the same time. And acquire the tag's + * ownership for flush req. */ if (q->mq_ops) { + struct blk_mq_hw_ctx *hctx; + flush_rq->mq_ctx = first_rq->mq_ctx; flush_rq->tag = first_rq->tag; + fq->orig_rq = first_rq; + + hctx = q->mq_ops->map_queue(q, first_rq->mq_ctx->cpu); + blk_mq_tag_set_rq(hctx, first_rq->tag, flush_rq); } flush_rq->cmd_type = REQ_TYPE_FS; diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index 702ae29b8d90f..4fbc8d563777f 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c @@ -403,7 +403,7 @@ static void bt_for_each(struct blk_mq_hw_ctx *hctx, for (bit = find_first_bit(&bm->word, bm->depth); bit < bm->depth; bit = find_next_bit(&bm->word, bm->depth, bit + 1)) { - rq = blk_mq_tag_to_rq(hctx->tags, off + bit); + rq = hctx->tags->rqs[off + bit]; if (rq->q == hctx->queue) fn(hctx, rq, data, reserved); } diff --git a/block/blk-mq-tag.h b/block/blk-mq-tag.h index 6206ed17ef766..14c6e4c925564 100644 --- a/block/blk-mq-tag.h +++ b/block/blk-mq-tag.h @@ -85,4 +85,16 @@ static inline void blk_mq_tag_idle(struct blk_mq_hw_ctx *hctx) __blk_mq_tag_idle(hctx); } +/* + * This helper should only be used for flush request to share tag + * with the request cloned from, and both the two requests can't be + * in flight at the same time. The caller has to make sure the tag + * can't be freed. + */ +static inline void blk_mq_tag_set_rq(struct blk_mq_hw_ctx *hctx, + unsigned int tag, struct request *rq) +{ + hctx->tags->rqs[tag] = rq; +} + #endif diff --git a/block/blk-mq.c b/block/blk-mq.c index 691959ecb80fe..4b839c117c566 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -498,23 +498,9 @@ void blk_mq_kick_requeue_list(struct request_queue *q) } EXPORT_SYMBOL(blk_mq_kick_requeue_list); -static inline bool is_flush_request(struct request *rq, - struct blk_flush_queue *fq, unsigned int tag) -{ - return ((rq->cmd_flags & REQ_FLUSH_SEQ) && - fq->flush_rq->tag == tag); -} - struct request *blk_mq_tag_to_rq(struct blk_mq_tags *tags, unsigned int tag) { - struct request *rq = tags->rqs[tag]; - /* mq_ctx of flush rq is always cloned from the corresponding req */ - struct blk_flush_queue *fq = blk_get_flush_queue(rq->q, rq->mq_ctx); - - if (!is_flush_request(rq, fq, tag)) - return rq; - - return fq->flush_rq; + return tags->rqs[tag]; } EXPORT_SYMBOL(blk_mq_tag_to_rq); diff --git a/block/blk.h b/block/blk.h index 39471974401c5..5bc529f289215 100644 --- a/block/blk.h +++ b/block/blk.h @@ -22,6 +22,12 @@ struct blk_flush_queue { struct list_head flush_queue[2]; struct list_head flush_data_in_flight; struct request *flush_rq; + + /* + * flush_rq shares tag with this rq, both can't be active + * at the same time + */ + struct request *orig_rq; spinlock_t mq_flush_lock; }; diff --git a/block/genhd.c b/block/genhd.c index c675ad1ad69b8..b529e5024d235 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -829,6 +829,7 @@ static void disk_seqf_stop(struct seq_file *seqf, void *v) if (iter) { class_dev_iter_exit(iter); kfree(iter); + seqf->private = NULL; } } diff --git a/block/ioprio.c b/block/ioprio.c index 31666c92b46af..563435684c3c1 100644 --- a/block/ioprio.c +++ b/block/ioprio.c @@ -149,8 +149,10 @@ static int get_task_ioprio(struct task_struct *p) if (ret) goto out; ret = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, IOPRIO_NORM); + task_lock(p); if (p->io_context) ret = p->io_context->ioprio; + task_unlock(p); out: return ret; } diff --git a/crypto/algif_skcipher.c b/crypto/algif_skcipher.c index d2cacc7f079f8..ea51eb5f575ef 100644 --- a/crypto/algif_skcipher.c +++ b/crypto/algif_skcipher.c @@ -446,13 +446,6 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, char __user *from = iov->iov_base; while (seglen) { - sgl = list_first_entry(&ctx->tsgl, - struct skcipher_sg_list, list); - sg = sgl->sg; - - while (!sg->length) - sg++; - used = ctx->used; if (!used) { err = skcipher_wait_for_data(sk, flags); @@ -474,6 +467,13 @@ static int skcipher_recvmsg(struct kiocb *unused, struct socket *sock, if (!used) goto free; + sgl = list_first_entry(&ctx->tsgl, + struct skcipher_sg_list, list); + sg = sgl->sg; + + while (!sg->length) + sg++; + ablkcipher_request_set_crypt(&ctx->req, sg, ctx->rsgl.sg, used, ctx->iv); diff --git a/drivers/Kconfig b/drivers/Kconfig index fcff64188dd03..1c08080d114e6 100644 --- a/drivers/Kconfig +++ b/drivers/Kconfig @@ -198,6 +198,9 @@ source "drivers/firmware/Kconfig" source "drivers/bif/Kconfig" -source "drivers/gud/Kconfig" +#source "drivers/gud/Kconfig" +source "drivers/fingerprint/Kconfig" + +source "drivers/fingerprintrosy/Kconfig" endmenu diff --git a/drivers/Makefile b/drivers/Makefile index ffbf12cf9f43d..c8dc476ce7b05 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -172,4 +172,7 @@ obj-$(CONFIG_BIF) += bif/ obj-$(CONFIG_SENSORS_SSC) += sensors/ # driver_override, *cp; + char *driver_override, *old, *cp; if (count > PATH_MAX) return -EINVAL; @@ -740,12 +740,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); @@ -756,8 +759,12 @@ static ssize_t driver_override_show(struct device *dev, struct device_attribute *attr, char *buf) { struct platform_device *pdev = to_platform_device(dev); + ssize_t len; - return sprintf(buf, "%s\n", pdev->driver_override); + device_lock(dev); + len = sprintf(buf, "%s\n", pdev->driver_override); + device_unlock(dev); + return len; } static DEVICE_ATTR_RW(driver_override); diff --git a/drivers/block/zram/Kconfig b/drivers/block/zram/Kconfig index 6489c0fd0ea6e..386ba3d1a6ee8 100644 --- a/drivers/block/zram/Kconfig +++ b/drivers/block/zram/Kconfig @@ -23,12 +23,4 @@ config ZRAM_LZ4_COMPRESS default n help This option enables LZ4 compression algorithm support. Compression - algorithm can be changed using `comp_algorithm' device attribute. - -config ZRAM_DEBUG - bool "Compressed RAM block device debug support" - depends on ZRAM - default n - help - This option adds additional debugging code to the compressed - RAM block device driver. + algorithm can be changed using `comp_algorithm' device attribute. \ No newline at end of file diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 6fbb10ca73b10..b51a816d766bb 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "zcomp.h" #include "zcomp_lzo.h" @@ -20,29 +21,6 @@ #include "zcomp_lz4.h" #endif -/* - * single zcomp_strm backend - */ -struct zcomp_strm_single { - struct mutex strm_lock; - struct zcomp_strm *zstrm; -}; - -/* - * multi zcomp_strm backend - */ -struct zcomp_strm_multi { - /* protect strm list */ - spinlock_t strm_lock; - /* max possible number of zstrm streams */ - int max_strm; - /* number of available zstrm streams */ - int avail_strm; - /* list of available strms */ - struct list_head idle_strm; - wait_queue_head_t strm_wait; -}; - static struct zcomp_backend *backends[] = { &zcomp_lzo, #ifdef CONFIG_ZRAM_LZ4_COMPRESS @@ -74,18 +52,18 @@ static void zcomp_strm_free(struct zcomp *comp, struct zcomp_strm *zstrm) * allocate new zcomp_strm structure with ->private initialized by * backend, return NULL on error */ -static struct zcomp_strm *zcomp_strm_alloc(struct zcomp *comp) +static struct zcomp_strm *zcomp_strm_alloc(struct zcomp *comp, gfp_t flags) { - struct zcomp_strm *zstrm = kmalloc(sizeof(*zstrm), GFP_NOIO); + struct zcomp_strm *zstrm = kmalloc(sizeof(*zstrm), flags); if (!zstrm) return NULL; - zstrm->private = comp->backend->create(); + zstrm->private = comp->backend->create(flags); /* * allocate 2 pages. 1 for compressed data, plus 1 extra for the * case when compressed size is larger than the original one */ - zstrm->buffer = (void *)__get_free_pages(GFP_NOIO | __GFP_ZERO, 1); + zstrm->buffer = (void *)__get_free_pages(flags | __GFP_ZERO, 1); if (!zstrm->private || !zstrm->buffer) { zcomp_strm_free(comp, zstrm); zstrm = NULL; @@ -93,180 +71,6 @@ static struct zcomp_strm *zcomp_strm_alloc(struct zcomp *comp) return zstrm; } -/* - * get idle zcomp_strm or wait until other process release - * (zcomp_strm_release()) one for us - */ -static struct zcomp_strm *zcomp_strm_multi_find(struct zcomp *comp) -{ - struct zcomp_strm_multi *zs = comp->stream; - struct zcomp_strm *zstrm; - - while (1) { - spin_lock(&zs->strm_lock); - if (!list_empty(&zs->idle_strm)) { - zstrm = list_entry(zs->idle_strm.next, - struct zcomp_strm, list); - list_del(&zstrm->list); - spin_unlock(&zs->strm_lock); - return zstrm; - } - /* zstrm streams limit reached, wait for idle stream */ - if (zs->avail_strm >= zs->max_strm) { - spin_unlock(&zs->strm_lock); - wait_event(zs->strm_wait, !list_empty(&zs->idle_strm)); - continue; - } - /* allocate new zstrm stream */ - zs->avail_strm++; - spin_unlock(&zs->strm_lock); - - zstrm = zcomp_strm_alloc(comp); - if (!zstrm) { - spin_lock(&zs->strm_lock); - zs->avail_strm--; - spin_unlock(&zs->strm_lock); - wait_event(zs->strm_wait, !list_empty(&zs->idle_strm)); - continue; - } - break; - } - return zstrm; -} - -/* add stream back to idle list and wake up waiter or free the stream */ -static void zcomp_strm_multi_release(struct zcomp *comp, struct zcomp_strm *zstrm) -{ - struct zcomp_strm_multi *zs = comp->stream; - - spin_lock(&zs->strm_lock); - if (zs->avail_strm <= zs->max_strm) { - list_add(&zstrm->list, &zs->idle_strm); - spin_unlock(&zs->strm_lock); - wake_up(&zs->strm_wait); - return; - } - - zs->avail_strm--; - spin_unlock(&zs->strm_lock); - zcomp_strm_free(comp, zstrm); -} - -/* change max_strm limit */ -static bool zcomp_strm_multi_set_max_streams(struct zcomp *comp, int num_strm) -{ - struct zcomp_strm_multi *zs = comp->stream; - struct zcomp_strm *zstrm; - - spin_lock(&zs->strm_lock); - zs->max_strm = num_strm; - /* - * if user has lowered the limit and there are idle streams, - * immediately free as much streams (and memory) as we can. - */ - while (zs->avail_strm > num_strm && !list_empty(&zs->idle_strm)) { - zstrm = list_entry(zs->idle_strm.next, - struct zcomp_strm, list); - list_del(&zstrm->list); - zcomp_strm_free(comp, zstrm); - zs->avail_strm--; - } - spin_unlock(&zs->strm_lock); - return true; -} - -static void zcomp_strm_multi_destroy(struct zcomp *comp) -{ - struct zcomp_strm_multi *zs = comp->stream; - struct zcomp_strm *zstrm; - - while (!list_empty(&zs->idle_strm)) { - zstrm = list_entry(zs->idle_strm.next, - struct zcomp_strm, list); - list_del(&zstrm->list); - zcomp_strm_free(comp, zstrm); - } - kfree(zs); -} - -static int zcomp_strm_multi_create(struct zcomp *comp, int max_strm) -{ - struct zcomp_strm *zstrm; - struct zcomp_strm_multi *zs; - - comp->destroy = zcomp_strm_multi_destroy; - comp->strm_find = zcomp_strm_multi_find; - comp->strm_release = zcomp_strm_multi_release; - comp->set_max_streams = zcomp_strm_multi_set_max_streams; - zs = kmalloc(sizeof(struct zcomp_strm_multi), GFP_KERNEL); - if (!zs) - return -ENOMEM; - - comp->stream = zs; - spin_lock_init(&zs->strm_lock); - INIT_LIST_HEAD(&zs->idle_strm); - init_waitqueue_head(&zs->strm_wait); - zs->max_strm = max_strm; - zs->avail_strm = 1; - - zstrm = zcomp_strm_alloc(comp); - if (!zstrm) { - kfree(zs); - return -ENOMEM; - } - list_add(&zstrm->list, &zs->idle_strm); - return 0; -} - -static struct zcomp_strm *zcomp_strm_single_find(struct zcomp *comp) -{ - struct zcomp_strm_single *zs = comp->stream; - mutex_lock(&zs->strm_lock); - return zs->zstrm; -} - -static void zcomp_strm_single_release(struct zcomp *comp, - struct zcomp_strm *zstrm) -{ - struct zcomp_strm_single *zs = comp->stream; - mutex_unlock(&zs->strm_lock); -} - -static bool zcomp_strm_single_set_max_streams(struct zcomp *comp, int num_strm) -{ - /* zcomp_strm_single support only max_comp_streams == 1 */ - return false; -} - -static void zcomp_strm_single_destroy(struct zcomp *comp) -{ - struct zcomp_strm_single *zs = comp->stream; - zcomp_strm_free(comp, zs->zstrm); - kfree(zs); -} - -static int zcomp_strm_single_create(struct zcomp *comp) -{ - struct zcomp_strm_single *zs; - - comp->destroy = zcomp_strm_single_destroy; - comp->strm_find = zcomp_strm_single_find; - comp->strm_release = zcomp_strm_single_release; - comp->set_max_streams = zcomp_strm_single_set_max_streams; - zs = kmalloc(sizeof(struct zcomp_strm_single), GFP_KERNEL); - if (!zs) - return -ENOMEM; - - comp->stream = zs; - mutex_init(&zs->strm_lock); - zs->zstrm = zcomp_strm_alloc(comp); - if (!zs->zstrm) { - kfree(zs); - return -ENOMEM; - } - return 0; -} - /* show available compressors */ ssize_t zcomp_available_show(const char *comp, char *buf) { @@ -274,7 +78,7 @@ ssize_t zcomp_available_show(const char *comp, char *buf) int i = 0; while (backends[i]) { - if (sysfs_streq(comp, backends[i]->name)) + if (!strcmp(comp, backends[i]->name)) sz += scnprintf(buf + sz, PAGE_SIZE - sz - 2, "[%s] ", backends[i]->name); else @@ -286,19 +90,19 @@ ssize_t zcomp_available_show(const char *comp, char *buf) return sz; } -bool zcomp_set_max_streams(struct zcomp *comp, int num_strm) +bool zcomp_available_algorithm(const char *comp) { - return comp->set_max_streams(comp, num_strm); + return find_backend(comp) != NULL; } struct zcomp_strm *zcomp_strm_find(struct zcomp *comp) { - return comp->strm_find(comp); + return *get_cpu_ptr(comp->stream); } void zcomp_strm_release(struct zcomp *comp, struct zcomp_strm *zstrm) { - comp->strm_release(comp, zstrm); + put_cpu_ptr(comp->stream); } int zcomp_compress(struct zcomp *comp, struct zcomp_strm *zstrm, @@ -314,9 +118,83 @@ int zcomp_decompress(struct zcomp *comp, const unsigned char *src, return comp->backend->decompress(src, src_len, dst); } +static int __zcomp_cpu_notifier(struct zcomp *comp, + unsigned long action, unsigned long cpu) +{ + struct zcomp_strm *zstrm; + + switch (action) { + case CPU_UP_PREPARE: + if (WARN_ON(*per_cpu_ptr(comp->stream, cpu))) + break; + zstrm = zcomp_strm_alloc(comp, GFP_KERNEL); + if (IS_ERR_OR_NULL(zstrm)) { + pr_err("Can't allocate a compression stream\n"); + return NOTIFY_BAD; + } + *per_cpu_ptr(comp->stream, cpu) = zstrm; + break; + case CPU_DEAD: + case CPU_UP_CANCELED: + zstrm = *per_cpu_ptr(comp->stream, cpu); + if (!IS_ERR_OR_NULL(zstrm)) + zcomp_strm_free(comp, zstrm); + *per_cpu_ptr(comp->stream, cpu) = NULL; + break; + default: + break; + } + return NOTIFY_OK; +} + +static int zcomp_cpu_notifier(struct notifier_block *nb, + unsigned long action, void *pcpu) +{ + unsigned long cpu = (unsigned long)pcpu; + struct zcomp *comp = container_of(nb, typeof(*comp), notifier); + + return __zcomp_cpu_notifier(comp, action, cpu); +} + +static int zcomp_init(struct zcomp *comp) +{ + unsigned long cpu; + int ret; + + comp->notifier.notifier_call = zcomp_cpu_notifier; + + comp->stream = alloc_percpu(struct zcomp_strm *); + if (!comp->stream) + return -ENOMEM; + + cpu_notifier_register_begin(); + for_each_online_cpu(cpu) { + ret = __zcomp_cpu_notifier(comp, CPU_UP_PREPARE, cpu); + if (ret == NOTIFY_BAD) + goto cleanup; + } + __register_cpu_notifier(&comp->notifier); + cpu_notifier_register_done(); + return 0; + +cleanup: + for_each_online_cpu(cpu) + __zcomp_cpu_notifier(comp, CPU_UP_CANCELED, cpu); + cpu_notifier_register_done(); + return -ENOMEM; +} + void zcomp_destroy(struct zcomp *comp) { - comp->destroy(comp); + unsigned long cpu; + + cpu_notifier_register_begin(); + for_each_online_cpu(cpu) + __zcomp_cpu_notifier(comp, CPU_UP_CANCELED, cpu); + __unregister_cpu_notifier(&comp->notifier); + cpu_notifier_register_done(); + + free_percpu(comp->stream); kfree(comp); } @@ -326,9 +204,9 @@ void zcomp_destroy(struct zcomp *comp) * backend pointer or ERR_PTR if things went bad. ERR_PTR(-EINVAL) * if requested algorithm is not supported, ERR_PTR(-ENOMEM) in * case of allocation error, or any other error potentially - * returned by functions zcomp_strm_{multi,single}_create. + * returned by zcomp_init(). */ -struct zcomp *zcomp_create(const char *compress, int max_strm) +struct zcomp *zcomp_create(const char *compress) { struct zcomp *comp; struct zcomp_backend *backend; @@ -343,10 +221,7 @@ struct zcomp *zcomp_create(const char *compress, int max_strm) return ERR_PTR(-ENOMEM); comp->backend = backend; - if (max_strm > 1) - error = zcomp_strm_multi_create(comp, max_strm); - else - error = zcomp_strm_single_create(comp); + error = zcomp_init(comp); if (error) { kfree(comp); return ERR_PTR(error); diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index c59d1fca72c06..ffd88cb747fee 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -10,8 +10,6 @@ #ifndef _ZCOMP_H_ #define _ZCOMP_H_ -#include - struct zcomp_strm { /* compression/decompression buffer */ void *buffer; @@ -21,8 +19,6 @@ struct zcomp_strm { * working memory) */ void *private; - /* used in multi stream backend, protected by backend strm_lock */ - struct list_head list; }; /* static compression backend */ @@ -33,7 +29,7 @@ struct zcomp_backend { int (*decompress)(const unsigned char *src, size_t src_len, unsigned char *dst); - void *(*create)(void); + void *(*create)(gfp_t flags); void (*destroy)(void *private); const char *name; @@ -41,18 +37,15 @@ struct zcomp_backend { /* dynamic per-device compression frontend */ struct zcomp { - void *stream; + struct zcomp_strm * __percpu *stream; struct zcomp_backend *backend; - - struct zcomp_strm *(*strm_find)(struct zcomp *comp); - void (*strm_release)(struct zcomp *comp, struct zcomp_strm *zstrm); - bool (*set_max_streams)(struct zcomp *comp, int num_strm); - void (*destroy)(struct zcomp *comp); + struct notifier_block notifier; }; ssize_t zcomp_available_show(const char *comp, char *buf); +bool zcomp_available_algorithm(const char *comp); -struct zcomp *zcomp_create(const char *comp, int max_strm); +struct zcomp *zcomp_create(const char *comp); void zcomp_destroy(struct zcomp *comp); struct zcomp_strm *zcomp_strm_find(struct zcomp *comp); diff --git a/drivers/block/zram/zcomp_lz4.c b/drivers/block/zram/zcomp_lz4.c index dd6083124276f..0110086accba8 100644 --- a/drivers/block/zram/zcomp_lz4.c +++ b/drivers/block/zram/zcomp_lz4.c @@ -15,24 +15,14 @@ #include "zcomp_lz4.h" -static void *zcomp_lz4_create(void) +static void *zcomp_lz4_create(gfp_t flags) { void *ret; - /* - * This function can be called in swapout/fs write path - * so we can't use GFP_FS|IO. And it assumes we already - * have at least one stream in zram initialization so we - * don't do best effort to allocate more stream in here. - * A default stream will work well without further multiple - * streams. That's why we use NORETRY | NOWARN. - */ - ret = kzalloc(LZ4_MEM_COMPRESS, GFP_NOIO | __GFP_NORETRY | - __GFP_NOWARN); + ret = kmalloc(LZ4_MEM_COMPRESS, flags); if (!ret) ret = __vmalloc(LZ4_MEM_COMPRESS, - GFP_NOIO | __GFP_NORETRY | __GFP_NOWARN | - __GFP_ZERO | __GFP_HIGHMEM, + flags | __GFP_HIGHMEM, PAGE_KERNEL); return ret; } diff --git a/drivers/block/zram/zcomp_lzo.c b/drivers/block/zram/zcomp_lzo.c index edc549920fa06..ed7a1f0549ecf 100644 --- a/drivers/block/zram/zcomp_lzo.c +++ b/drivers/block/zram/zcomp_lzo.c @@ -15,24 +15,14 @@ #include "zcomp_lzo.h" -static void *lzo_create(void) +static void *lzo_create(gfp_t flags) { void *ret; - /* - * This function can be called in swapout/fs write path - * so we can't use GFP_FS|IO. And it assumes we already - * have at least one stream in zram initialization so we - * don't do best effort to allocate more stream in here. - * A default stream will work well without further multiple - * streams. That's why we use NORETRY | NOWARN. - */ - ret = kzalloc(LZO1X_MEM_COMPRESS, GFP_NOIO | __GFP_NORETRY | - __GFP_NOWARN); + ret = kmalloc(LZO1X_MEM_COMPRESS, flags); if (!ret) ret = __vmalloc(LZO1X_MEM_COMPRESS, - GFP_NOIO | __GFP_NORETRY | __GFP_NOWARN | - __GFP_ZERO | __GFP_HIGHMEM, + flags | __GFP_HIGHMEM, PAGE_KERNEL); return ret; } diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index 74fd2566b8757..21a367439a0cf 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -3,6 +3,7 @@ * * Copyright (C) 2008, 2009, 2010 Nitin Gupta * 2012, 2013 Minchan Kim + * Copyright (C) 2018 XiaoMi, Inc. * * This code is released using a dual license strategy: BSD/GPL * You can choose the licence that better fits your requirements. @@ -15,10 +16,6 @@ #define KMSG_COMPONENT "zram" #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt -#ifdef CONFIG_ZRAM_DEBUG -#define DEBUG -#endif - #include #include #include @@ -32,22 +29,18 @@ #include #include #include -#include -#include +#include +#include #include "zram_drv.h" -/* Globals */ +static DEFINE_IDR(zram_index_idr); +/* idr index must be protected */ +static DEFINE_MUTEX(zram_index_mutex); + static int zram_major; -static struct zram *zram_devices; static const char *default_compressor = "lzo"; -/* - * We don't need to see memory allocation errors more than once every 1 - * second to know that a problem is occurring. - */ -#define ALLOC_ERROR_LOG_RATE_MS 1000 - /* Module params (documentation at end) */ static unsigned int num_devices = 1; @@ -61,7 +54,7 @@ static inline void deprecated_attr_warn(const char *name) } #define ZRAM_ATTR_RO(name) \ -static ssize_t name##_show(struct device *d, \ +static ssize_t name##_show(struct device *d, \ struct device_attribute *attr, char *b) \ { \ struct zram *zram = dev_to_zram(d); \ @@ -77,81 +70,122 @@ static inline bool init_done(struct zram *zram) return zram->disksize; } -static int zram_show_mem_notifier(struct notifier_block *nb, - unsigned long action, - void *data) +static inline struct zram *dev_to_zram(struct device *dev) { - int i; + return (struct zram *)dev_to_disk(dev)->private_data; +} - if (!zram_devices) - return 0; +/* flag operations require table entry bit_spin_lock() being held */ +static int zram_test_flag(struct zram_meta *meta, u32 index, + enum zram_pageflags flag) +{ + return meta->table[index].value & BIT(flag); +} - for (i = 0; i < num_devices; i++) { - struct zram *zram = &zram_devices[i]; - struct zram_meta *meta = zram->meta; +static void zram_set_flag(struct zram_meta *meta, u32 index, + enum zram_pageflags flag) +{ + meta->table[index].value |= BIT(flag); +} - if (!down_read_trylock(&zram->init_lock)) - continue; +static void zram_clear_flag(struct zram_meta *meta, u32 index, + enum zram_pageflags flag) +{ + meta->table[index].value &= ~BIT(flag); +} - if (init_done(zram)) { - u64 val; - u64 data_size; - u64 orig_data_size; - - val = zs_get_total_pages(meta->mem_pool); - data_size = atomic64_read(&zram->stats.compr_data_size); - orig_data_size = atomic64_read( - &zram->stats.pages_stored); - pr_info("Zram[%d] mem_used_total = %llu\n", i, - val << PAGE_SHIFT); - pr_info("Zram[%d] compr_data_size = %llu\n", i, - (unsigned long long)data_size); - pr_info("Zram[%d] orig_data_size = %llu\n", i, - (unsigned long long)orig_data_size); - } +static size_t zram_get_obj_size(struct zram_meta *meta, u32 index) +{ + return meta->table[index].value & (BIT(ZRAM_FLAG_SHIFT) - 1); +} - up_read(&zram->init_lock); - } +static void zram_set_obj_size(struct zram_meta *meta, + u32 index, size_t size) +{ + unsigned long flags = meta->table[index].value >> ZRAM_FLAG_SHIFT; - return 0; + meta->table[index].value = (flags << ZRAM_FLAG_SHIFT) | size; } -static struct notifier_block zram_show_mem_notifier_block = { - .notifier_call = zram_show_mem_notifier -}; +static inline bool is_partial_io(struct bio_vec *bvec) +{ + return bvec->bv_len != PAGE_SIZE; +} -static inline struct zram *dev_to_zram(struct device *dev) +/* + * Check if request is within bounds and aligned on zram logical blocks. + */ +static inline bool valid_io_request(struct zram *zram, + sector_t start, unsigned int size) { - return (struct zram *)dev_to_disk(dev)->private_data; + u64 end, bound; + + /* unaligned request */ + if (unlikely(start & (ZRAM_SECTOR_PER_LOGICAL_BLOCK - 1))) + return false; + if (unlikely(size & (ZRAM_LOGICAL_BLOCK_SIZE - 1))) + return false; + + end = start + (size >> SECTOR_SHIFT); + bound = zram->disksize >> SECTOR_SHIFT; + /* out of range range */ + if (unlikely(start >= bound || end > bound || start > end)) + return false; + + /* I/O request is valid */ + return true; } -static ssize_t compact_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) +static void update_position(u32 *index, int *offset, struct bio_vec *bvec) { - unsigned long nr_migrated; - struct zram *zram = dev_to_zram(dev); - struct zram_meta *meta; + if (*offset + bvec->bv_len >= PAGE_SIZE) + (*index)++; + *offset = (*offset + bvec->bv_len) % PAGE_SIZE; +} - down_read(&zram->init_lock); - if (!init_done(zram)) { - up_read(&zram->init_lock); - return -EINVAL; - } +static inline void update_used_max(struct zram *zram, + const unsigned long pages) +{ + unsigned long old_max, cur_max; - meta = zram->meta; - nr_migrated = zs_compact(meta->mem_pool); - atomic64_add(nr_migrated, &zram->stats.num_migrated); - up_read(&zram->init_lock); + old_max = atomic_long_read(&zram->stats.max_used_pages); - return len; + do { + cur_max = old_max; + if (pages > cur_max) + old_max = atomic_long_cmpxchg( + &zram->stats.max_used_pages, cur_max, pages); + } while (old_max != cur_max); } -static ssize_t disksize_show(struct device *dev, - struct device_attribute *attr, char *buf) +static bool page_zero_filled(void *ptr) { - struct zram *zram = dev_to_zram(dev); + unsigned int pos; + unsigned long *page; - return scnprintf(buf, PAGE_SIZE, "%llu\n", zram->disksize); + page = (unsigned long *)ptr; + + for (pos = 0; pos != PAGE_SIZE / sizeof(*page); pos++) { + if (page[pos]) + return false; + } + + return true; +} + +static void handle_zero_page(struct bio_vec *bvec) +{ + struct page *page = bvec->bv_page; + void *user_mem; + + user_mem = kmap_atomic(page); + if (is_partial_io(bvec)) + memset(user_mem + bvec->bv_offset, 0, bvec->bv_len); + else + clear_page(user_mem); + kunmap_atomic(user_mem); + + flush_dcache_page(page); } static ssize_t initstate_show(struct device *dev, @@ -167,6 +201,14 @@ static ssize_t initstate_show(struct device *dev, return scnprintf(buf, PAGE_SIZE, "%u\n", val); } +static ssize_t disksize_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct zram *zram = dev_to_zram(dev); + + return scnprintf(buf, PAGE_SIZE, "%llu\n", zram->disksize); +} + static ssize_t orig_data_size_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -194,19 +236,6 @@ static ssize_t mem_used_total_show(struct device *dev, return scnprintf(buf, PAGE_SIZE, "%llu\n", val << PAGE_SHIFT); } -static ssize_t max_comp_streams_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int val; - struct zram *zram = dev_to_zram(dev); - - down_read(&zram->init_lock); - val = zram->max_comp_streams; - up_read(&zram->init_lock); - - return scnprintf(buf, PAGE_SIZE, "%d\n", val); -} - static ssize_t mem_limit_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -276,33 +305,25 @@ static ssize_t mem_used_max_store(struct device *dev, return len; } +/* + * We switched to per-cpu streams and this attr is not needed anymore. + * However, we will keep it around for some time, because: + * a) we may revert per-cpu streams in the future + * b) it's visible to user space and we need to follow our 2 years + * retirement rule; but we already have a number of 'soon to be + * altered' attrs, so max_comp_streams need to wait for the next + * layoff cycle. + */ +static ssize_t max_comp_streams_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%d\n", num_online_cpus()); +} + static ssize_t max_comp_streams_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { - int num; - struct zram *zram = dev_to_zram(dev); - int ret; - - ret = kstrtoint(buf, 0, &num); - if (ret < 0) - return ret; - if (num < 1) - return -EINVAL; - - down_write(&zram->init_lock); - if (init_done(zram)) { - if (!zcomp_set_max_streams(zram->comp, num)) { - pr_info("Cannot change max compression streams\n"); - ret = -EINVAL; - goto out; - } - } - - zram->max_comp_streams = num; - ret = len; -out: - up_write(&zram->init_lock); - return ret; + return len; } static ssize_t comp_algorithm_show(struct device *dev, @@ -322,6 +343,11 @@ static ssize_t comp_algorithm_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len) { struct zram *zram = dev_to_zram(dev); + size_t sz; + + if (!zcomp_available_algorithm(buf)) + return -EINVAL; + down_write(&zram->init_lock); if (init_done(zram)) { up_write(&zram->init_lock); @@ -329,78 +355,117 @@ static ssize_t comp_algorithm_store(struct device *dev, return -EBUSY; } strlcpy(zram->compressor, buf, sizeof(zram->compressor)); + + /* ignore trailing newline */ + sz = strlen(zram->compressor); + if (sz > 0 && zram->compressor[sz - 1] == '\n') + zram->compressor[sz - 1] = 0x00; + up_write(&zram->init_lock); return len; } -/* flag operations needs meta->tb_lock */ -static int zram_test_flag(struct zram_meta *meta, u32 index, - enum zram_pageflags flag) +static ssize_t compact_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) { - return meta->table[index].value & BIT(flag); -} + struct zram *zram = dev_to_zram(dev); + struct zram_meta *meta; -static void zram_set_flag(struct zram_meta *meta, u32 index, - enum zram_pageflags flag) -{ - meta->table[index].value |= BIT(flag); -} + down_read(&zram->init_lock); + if (!init_done(zram)) { + up_read(&zram->init_lock); + return -EINVAL; + } -static void zram_clear_flag(struct zram_meta *meta, u32 index, - enum zram_pageflags flag) -{ - meta->table[index].value &= ~BIT(flag); -} + meta = zram->meta; + zs_compact(meta->mem_pool); + up_read(&zram->init_lock); -static size_t zram_get_obj_size(struct zram_meta *meta, u32 index) -{ - return meta->table[index].value & (BIT(ZRAM_FLAG_SHIFT) - 1); + return len; } -static void zram_set_obj_size(struct zram_meta *meta, - u32 index, size_t size) +static ssize_t io_stat_show(struct device *dev, + struct device_attribute *attr, char *buf) { - unsigned long flags = meta->table[index].value >> ZRAM_FLAG_SHIFT; + struct zram *zram = dev_to_zram(dev); + ssize_t ret; - meta->table[index].value = (flags << ZRAM_FLAG_SHIFT) | size; -} + down_read(&zram->init_lock); + ret = scnprintf(buf, PAGE_SIZE, + "%8llu %8llu %8llu %8llu\n", + (u64)atomic64_read(&zram->stats.failed_reads), + (u64)atomic64_read(&zram->stats.failed_writes), + (u64)atomic64_read(&zram->stats.invalid_io), + (u64)atomic64_read(&zram->stats.notify_free)); + up_read(&zram->init_lock); -static inline int is_partial_io(struct bio_vec *bvec) -{ - return bvec->bv_len != PAGE_SIZE; + return ret; } -/* - * Check if request is within bounds and aligned on zram logical blocks. - */ -static inline int valid_io_request(struct zram *zram, - sector_t start, unsigned int size) +static ssize_t mm_stat_show(struct device *dev, + struct device_attribute *attr, char *buf) { - u64 end, bound; + struct zram *zram = dev_to_zram(dev); + struct zs_pool_stats pool_stats; + u64 orig_size, mem_used = 0; + long max_used; + ssize_t ret; - /* unaligned request */ - if (unlikely(start & (ZRAM_SECTOR_PER_LOGICAL_BLOCK - 1))) - return 0; - if (unlikely(size & (ZRAM_LOGICAL_BLOCK_SIZE - 1))) - return 0; + memset(&pool_stats, 0x00, sizeof(struct zs_pool_stats)); - end = start + (size >> SECTOR_SHIFT); - bound = zram->disksize >> SECTOR_SHIFT; - /* out of range range */ - if (unlikely(start >= bound || end > bound || start > end)) - return 0; + down_read(&zram->init_lock); + if (init_done(zram)) { + mem_used = zs_get_total_pages(zram->meta->mem_pool); + zs_pool_stats(zram->meta->mem_pool, &pool_stats); + } - /* I/O request is valid */ - return 1; -} + orig_size = atomic64_read(&zram->stats.pages_stored); + max_used = atomic_long_read(&zram->stats.max_used_pages); -static void zram_meta_free(struct zram_meta *meta, u64 disksize) -{ - size_t num_pages = disksize >> PAGE_SHIFT; - size_t index; + ret = scnprintf(buf, PAGE_SIZE, + "%8llu %8llu %8llu %8lu %8ld %8llu %8lu\n", + orig_size << PAGE_SHIFT, + (u64)atomic64_read(&zram->stats.compr_data_size), + mem_used << PAGE_SHIFT, + zram->limit_pages << PAGE_SHIFT, + max_used << PAGE_SHIFT, + (u64)atomic64_read(&zram->stats.zero_pages), + pool_stats.pages_compacted); + up_read(&zram->init_lock); - /* Free all pages that are still in this zram device */ - for (index = 0; index < num_pages; index++) { + return ret; +} + +static DEVICE_ATTR_RO(io_stat); +static DEVICE_ATTR_RO(mm_stat); +ZRAM_ATTR_RO(num_reads); +ZRAM_ATTR_RO(num_writes); +ZRAM_ATTR_RO(failed_reads); +ZRAM_ATTR_RO(failed_writes); +ZRAM_ATTR_RO(invalid_io); +ZRAM_ATTR_RO(notify_free); +ZRAM_ATTR_RO(zero_pages); +ZRAM_ATTR_RO(compr_data_size); + +static inline bool zram_meta_get(struct zram *zram) +{ + if (atomic_inc_not_zero(&zram->refcount)) + return true; + return false; +} + +static inline void zram_meta_put(struct zram *zram) +{ + atomic_dec(&zram->refcount); +} + +static void zram_meta_free(struct zram_meta *meta, u64 disksize) +{ + size_t num_pages = disksize >> PAGE_SHIFT; + size_t index; + + /* Free all pages that are still in this zram device */ + for (index = 0; index < num_pages; index++) { unsigned long handle = meta->table[index].handle; if (!handle) @@ -414,10 +479,9 @@ static void zram_meta_free(struct zram_meta *meta, u64 disksize) kfree(meta); } -static struct zram_meta *zram_meta_alloc(int device_id, u64 disksize) +static struct zram_meta *zram_meta_alloc(char *pool_name, u64 disksize) { size_t num_pages; - char pool_name[8]; struct zram_meta *meta = kmalloc(sizeof(*meta), GFP_KERNEL); if (!meta) @@ -430,8 +494,7 @@ static struct zram_meta *zram_meta_alloc(int device_id, u64 disksize) goto out_error; } - snprintf(pool_name, sizeof(pool_name), "zram%d", device_id); - meta->mem_pool = zs_create_pool(pool_name, GFP_NOIO | __GFP_HIGHMEM); + meta->mem_pool = zs_create_pool(pool_name); if (!meta->mem_pool) { pr_err("Error creating memory pool\n"); goto out_error; @@ -445,56 +508,6 @@ static struct zram_meta *zram_meta_alloc(int device_id, u64 disksize) return NULL; } -static inline bool zram_meta_get(struct zram *zram) -{ - if (atomic_inc_not_zero(&zram->refcount)) - return true; - return false; -} - -static inline void zram_meta_put(struct zram *zram) -{ - atomic_dec(&zram->refcount); -} - -static void update_position(u32 *index, int *offset, struct bio_vec *bvec) -{ - if (*offset + bvec->bv_len >= PAGE_SIZE) - (*index)++; - *offset = (*offset + bvec->bv_len) % PAGE_SIZE; -} - -static int page_zero_filled(void *ptr) -{ - unsigned int pos; - unsigned long *page; - - page = (unsigned long *)ptr; - - for (pos = 0; pos != PAGE_SIZE / sizeof(*page); pos++) { - if (page[pos]) - return 0; - } - - return 1; -} - -static void handle_zero_page(struct bio_vec *bvec) -{ - struct page *page = bvec->bv_page; - void *user_mem; - - user_mem = kmap_atomic(page); - if (is_partial_io(bvec)) - memset(user_mem + bvec->bv_offset, 0, bvec->bv_len); - else - clear_page(user_mem); - kunmap_atomic(user_mem); - - flush_dcache_page(page); -} - - /* * To protect concurrent access to the same index entry, * caller should hold this table index entry's bit_spinlock to @@ -589,7 +602,7 @@ static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, uncmem = user_mem; if (!uncmem) { - pr_info("Unable to allocate temp memory\n"); + pr_err("Unable to allocate temp memory\n"); ret = -ENOMEM; goto out_cleanup; } @@ -612,34 +625,17 @@ static int zram_bvec_read(struct zram *zram, struct bio_vec *bvec, return ret; } -static inline void update_used_max(struct zram *zram, - const unsigned long pages) -{ - unsigned long old_max, cur_max; - - old_max = atomic_long_read(&zram->stats.max_used_pages); - - do { - cur_max = old_max; - if (pages > cur_max) - old_max = atomic_long_cmpxchg( - &zram->stats.max_used_pages, cur_max, pages); - } while (old_max != cur_max); -} - static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, int offset) { int ret = 0; size_t clen; - unsigned long handle; + unsigned long handle = 0; struct page *page; unsigned char *user_mem, *cmem, *src, *uncmem = NULL; struct zram_meta *meta = zram->meta; - struct zcomp_strm *zstrm; - bool locked = false; + struct zcomp_strm *zstrm = NULL; unsigned long alloced_pages; - static unsigned long zram_rs_time; page = bvec->bv_page; if (is_partial_io(bvec)) { @@ -657,10 +653,8 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, goto out; } - zstrm = zcomp_strm_find(zram->comp); - locked = true; +compress_again: user_mem = kmap_atomic(page); - if (is_partial_io(bvec)) { memcpy(uncmem + offset, user_mem + bvec->bv_offset, bvec->bv_len); @@ -684,6 +678,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, goto out; } + zstrm = zcomp_strm_find(zram->comp); ret = zcomp_compress(zram->comp, zstrm, uncmem, &clen); if (!is_partial_io(bvec)) { kunmap_atomic(user_mem); @@ -695,6 +690,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, pr_err("Compression failed! err=%d\n", ret); goto out; } + src = zstrm->buffer; if (unlikely(clen > max_zpage_size)) { clen = PAGE_SIZE; @@ -702,26 +698,48 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, src = uncmem; } - handle = zs_malloc(meta->mem_pool, clen); + /* + * handle allocation has 2 paths: + * a) fast path is executed with preemption disabled (for + * per-cpu streams) and has __GFP_DIRECT_RECLAIM bit clear, + * since we can't sleep; + * b) slow path enables preemption and attempts to allocate + * the page with __GFP_DIRECT_RECLAIM bit set. we have to + * put per-cpu compression stream and, thus, to re-do + * the compression once handle is allocated. + * + * if we have a 'non-null' handle here then we are coming + * from the slow path and handle has already been allocated. + */ + if (!handle) + handle = zs_malloc(meta->mem_pool, clen, + + __GFP_NOWARN | + __GFP_HIGHMEM); if (!handle) { - if (printk_timed_ratelimit(&zram_rs_time, - ALLOC_ERROR_LOG_RATE_MS)) - pr_info("Error allocating memory for compressed page: %u, size=%zu\n", - index, clen); + zcomp_strm_release(zram->comp, zstrm); + zstrm = NULL; + handle = zs_malloc(meta->mem_pool, clen, + GFP_NOIO | __GFP_HIGHMEM); + if (handle) + goto compress_again; + + pr_err("Error allocating memory for compressed page: %u, size=%zu\n", + index, clen); ret = -ENOMEM; goto out; } alloced_pages = zs_get_total_pages(meta->mem_pool); + update_used_max(zram, alloced_pages); + if (zram->limit_pages && alloced_pages > zram->limit_pages) { zs_free(meta->mem_pool, handle); ret = -ENOMEM; goto out; } - update_used_max(zram, alloced_pages); - cmem = zs_map_object(meta->mem_pool, handle, ZS_MM_WO); if ((clen == PAGE_SIZE) && !is_partial_io(bvec)) { @@ -733,7 +751,7 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, } zcomp_strm_release(zram->comp, zstrm); - locked = false; + zstrm = NULL; zs_unmap_object(meta->mem_pool, handle); /* @@ -751,36 +769,13 @@ static int zram_bvec_write(struct zram *zram, struct bio_vec *bvec, u32 index, atomic64_add(clen, &zram->stats.compr_data_size); atomic64_inc(&zram->stats.pages_stored); out: - if (locked) + if (zstrm) zcomp_strm_release(zram->comp, zstrm); if (is_partial_io(bvec)) kfree(uncmem); return ret; } -static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, - int offset, int rw) -{ - int ret; - - if (rw == READ) { - atomic64_inc(&zram->stats.num_reads); - ret = zram_bvec_read(zram, bvec, index, offset); - } else { - atomic64_inc(&zram->stats.num_writes); - ret = zram_bvec_write(zram, bvec, index, offset); - } - - if (unlikely(ret)) { - if (rw == READ) - atomic64_inc(&zram->stats.failed_reads); - else - atomic64_inc(&zram->stats.failed_writes); - } - - return ret; -} - /* * zram_bio_discard - handler on discard request * @index: physical block index in PAGE_SIZE units @@ -820,217 +815,99 @@ static void zram_bio_discard(struct zram *zram, u32 index, } } -static void zram_reset_device(struct zram *zram) +static int zram_bvec_rw(struct zram *zram, struct bio_vec *bvec, u32 index, + int offset, int rw) { - struct zram_meta *meta; - struct zcomp *comp; - u64 disksize; - down_write(&zram->init_lock); + int ret; +/* + generic_start_io_acct(rw, bvec->bv_len >> SECTOR_SHIFT, + &zram->disk->part0); +*/ + if (rw == READ) { + atomic64_inc(&zram->stats.num_reads); + ret = zram_bvec_read(zram, bvec, index, offset); + } else { + atomic64_inc(&zram->stats.num_writes); + ret = zram_bvec_write(zram, bvec, index, offset); + } +/* + generic_end_io_acct(rw, &zram->disk->part0, start_time); +*/ + if (unlikely(ret)) { + if (rw == READ) + atomic64_inc(&zram->stats.failed_reads); + else + atomic64_inc(&zram->stats.failed_writes); + } - zram->limit_pages = 0; + return ret; +} - if (!init_done(zram)) { - up_write(&zram->init_lock); +static void __zram_make_request(struct zram *zram, struct bio *bio) +{ + int offset, rw; + u32 index; + struct bio_vec bvec; + struct bvec_iter iter; + + index = bio->bi_iter.bi_sector >> SECTORS_PER_PAGE_SHIFT; + offset = (bio->bi_iter.bi_sector & + (SECTORS_PER_PAGE - 1)) << SECTOR_SHIFT; + + if (unlikely(bio->bi_rw & REQ_DISCARD)) { + zram_bio_discard(zram, index, offset, bio); + bio_endio(bio, 0); return; } - meta = zram->meta; - comp = zram->comp; - disksize = zram->disksize; - /* - * Refcount will go down to 0 eventually and r/w handler - * cannot handle further I/O so it will bail out by - * check zram_meta_get. - */ - zram_meta_put(zram); - /* - * We want to free zram_meta in process context to avoid - * deadlock between reclaim path and any other locks. - */ - wait_event(zram->io_done, atomic_read(&zram->refcount) == 0); + rw = bio_data_dir(bio); + bio_for_each_segment(bvec, bio, iter) { + int max_transfer_size = PAGE_SIZE - offset; - /* Reset stats */ - memset(&zram->stats, 0, sizeof(zram->stats)); - zram->disksize = 0; - zram->max_comp_streams = 1; + if (bvec.bv_len > max_transfer_size) { + /* + * zram_bvec_rw() can only make operation on a single + * zram page. Split the bio vector. + */ + struct bio_vec bv; - set_capacity(zram->disk, 0); - part_stat_set_all(&zram->disk->part0, 0); + bv.bv_page = bvec.bv_page; + bv.bv_len = max_transfer_size; + bv.bv_offset = bvec.bv_offset; - up_write(&zram->init_lock); - /* I/O operation under all of CPU are done so let's free */ - zram_meta_free(meta, disksize); - zcomp_destroy(comp); + if (zram_bvec_rw(zram, &bv, index, offset, rw) < 0) + goto out; + + bv.bv_len = bvec.bv_len - max_transfer_size; + bv.bv_offset += max_transfer_size; + if (zram_bvec_rw(zram, &bv, index + 1, 0, rw) < 0) + goto out; + } else + if (zram_bvec_rw(zram, &bvec, index, offset, rw) < 0) + goto out; + + update_position(&index, &offset, &bvec); + } + + bio_endio(bio, 0); + return; + +out: + bio_io_error(bio); } -static ssize_t disksize_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) +/* + * Handler function for all zram I/O requests. + */ +static void zram_make_request(struct request_queue *queue, struct bio *bio) { - u64 disksize; - struct zcomp *comp; - struct zram_meta *meta; - struct zram *zram = dev_to_zram(dev); - int err; + struct zram *zram = queue->queuedata; - disksize = memparse(buf, NULL); - if (!disksize) - return -EINVAL; + if (unlikely(!zram_meta_get(zram))) + goto error; - disksize = PAGE_ALIGN(disksize); - meta = zram_meta_alloc(zram->disk->first_minor, disksize); - if (!meta) - return -ENOMEM; - comp = zcomp_create(zram->compressor, zram->max_comp_streams); - if (IS_ERR(comp)) { - pr_info("Cannot initialise %s compressing backend\n", - zram->compressor); - err = PTR_ERR(comp); - goto out_free_meta; - } - - down_write(&zram->init_lock); - if (init_done(zram)) { - pr_info("Cannot change disksize for initialized device\n"); - err = -EBUSY; - goto out_destroy_comp; - } - - init_waitqueue_head(&zram->io_done); - atomic_set(&zram->refcount, 1); - zram->meta = meta; - zram->comp = comp; - zram->disksize = disksize; - set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); - up_write(&zram->init_lock); - - /* - * Revalidate disk out of the init_lock to avoid lockdep splat. - * It's okay because disk's capacity is protected by init_lock - * so that revalidate_disk always sees up-to-date capacity. - */ - revalidate_disk(zram->disk); - - return len; - -out_destroy_comp: - up_write(&zram->init_lock); - zcomp_destroy(comp); -out_free_meta: - zram_meta_free(meta, disksize); - return err; -} - -static ssize_t reset_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t len) -{ - int ret; - unsigned short do_reset; - struct zram *zram; - struct block_device *bdev; - - zram = dev_to_zram(dev); - bdev = bdget_disk(zram->disk, 0); - - if (!bdev) - return -ENOMEM; - - mutex_lock(&bdev->bd_mutex); - /* Do not reset an active device! */ - if (bdev->bd_openers) { - ret = -EBUSY; - goto out; - } - - ret = kstrtou16(buf, 10, &do_reset); - if (ret) - goto out; - - if (!do_reset) { - ret = -EINVAL; - goto out; - } - - /* Make sure all pending I/O is finished */ - fsync_bdev(bdev); - zram_reset_device(zram); - - mutex_unlock(&bdev->bd_mutex); - revalidate_disk(zram->disk); - bdput(bdev); - - return len; - -out: - mutex_unlock(&bdev->bd_mutex); - bdput(bdev); - return ret; -} - -static void __zram_make_request(struct zram *zram, struct bio *bio) -{ - int offset, rw; - u32 index; - struct bio_vec bvec; - struct bvec_iter iter; - - index = bio->bi_iter.bi_sector >> SECTORS_PER_PAGE_SHIFT; - offset = (bio->bi_iter.bi_sector & - (SECTORS_PER_PAGE - 1)) << SECTOR_SHIFT; - - if (unlikely(bio->bi_rw & REQ_DISCARD)) { - zram_bio_discard(zram, index, offset, bio); - bio_endio(bio, 0); - return; - } - - rw = bio_data_dir(bio); - bio_for_each_segment(bvec, bio, iter) { - int max_transfer_size = PAGE_SIZE - offset; - - if (bvec.bv_len > max_transfer_size) { - /* - * zram_bvec_rw() can only make operation on a single - * zram page. Split the bio vector. - */ - struct bio_vec bv; - - bv.bv_page = bvec.bv_page; - bv.bv_len = max_transfer_size; - bv.bv_offset = bvec.bv_offset; - - if (zram_bvec_rw(zram, &bv, index, offset, rw) < 0) - goto out; - - bv.bv_len = bvec.bv_len - max_transfer_size; - bv.bv_offset += max_transfer_size; - if (zram_bvec_rw(zram, &bv, index + 1, 0, rw) < 0) - goto out; - } else - if (zram_bvec_rw(zram, &bvec, index, offset, rw) < 0) - goto out; - - update_position(&index, &offset, &bvec); - } - - set_bit(BIO_UPTODATE, &bio->bi_flags); - bio_endio(bio, 0); - return; - -out: - bio_io_error(bio); -} - -/* - * Handler function for all zram I/O requests. - */ -static void zram_make_request(struct request_queue *queue, struct bio *bio) -{ - struct zram *zram = queue->queuedata; - - if (unlikely(!zram_meta_get(zram))) - goto error; if (!valid_io_request(zram, bio->bi_iter.bi_sector, bio->bi_iter.bi_size)) { @@ -1045,6 +922,7 @@ static void zram_make_request(struct request_queue *queue, struct bio *bio) zram_meta_put(zram); error: bio_io_error(bio); + return; } static void zram_slot_free_notify(struct block_device *bdev, @@ -1104,80 +982,184 @@ static int zram_rw_page(struct block_device *bdev, sector_t sector, return err; } -static const struct block_device_operations zram_devops = { - .swap_slot_free_notify = zram_slot_free_notify, - .rw_page = zram_rw_page, - .owner = THIS_MODULE -}; +static void zram_reset_device(struct zram *zram) +{ + struct zram_meta *meta; + struct zcomp *comp; + u64 disksize; -static DEVICE_ATTR_WO(compact); -static DEVICE_ATTR_RW(disksize); -static DEVICE_ATTR_RO(initstate); -static DEVICE_ATTR_WO(reset); -static DEVICE_ATTR_RO(orig_data_size); -static DEVICE_ATTR_RO(mem_used_total); -static DEVICE_ATTR_RW(mem_limit); -static DEVICE_ATTR_RW(mem_used_max); -static DEVICE_ATTR_RW(max_comp_streams); -static DEVICE_ATTR_RW(comp_algorithm); + down_write(&zram->init_lock); -static ssize_t io_stat_show(struct device *dev, - struct device_attribute *attr, char *buf) + zram->limit_pages = 0; + + if (!init_done(zram)) { + up_write(&zram->init_lock); + return; + } + + meta = zram->meta; + comp = zram->comp; + disksize = zram->disksize; + /* + * Refcount will go down to 0 eventually and r/w handler + * cannot handle further I/O so it will bail out by + * check zram_meta_get. + */ + zram_meta_put(zram); + /* + * We want to free zram_meta in process context to avoid + * deadlock between reclaim path and any other locks. + */ + wait_event(zram->io_done, atomic_read(&zram->refcount) == 0); + + /* Reset stats */ + memset(&zram->stats, 0, sizeof(zram->stats)); + zram->disksize = 0; + + set_capacity(zram->disk, 0); + part_stat_set_all(&zram->disk->part0, 0); + + up_write(&zram->init_lock); + /* I/O operation under all of CPU are done so let's free */ + zram_meta_free(meta, disksize); + zcomp_destroy(comp); +} + +static ssize_t disksize_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) { + u64 disksize; + struct zcomp *comp; + struct zram_meta *meta; struct zram *zram = dev_to_zram(dev); - ssize_t ret; + int err; - down_read(&zram->init_lock); - ret = scnprintf(buf, PAGE_SIZE, - "%8llu %8llu %8llu %8llu\n", - (u64)atomic64_read(&zram->stats.failed_reads), - (u64)atomic64_read(&zram->stats.failed_writes), - (u64)atomic64_read(&zram->stats.invalid_io), - (u64)atomic64_read(&zram->stats.notify_free)); - up_read(&zram->init_lock); + disksize = memparse(buf, NULL); + if (!disksize) + return -EINVAL; - return ret; + disksize = PAGE_ALIGN(disksize); + meta = zram_meta_alloc(zram->disk->disk_name, disksize); + if (!meta) + return -ENOMEM; + + comp = zcomp_create(zram->compressor); + if (IS_ERR(comp)) { + pr_err("Cannot initialise %s compressing backend\n", + zram->compressor); + err = PTR_ERR(comp); + goto out_free_meta; + } + + down_write(&zram->init_lock); + if (init_done(zram)) { + pr_info("Cannot change disksize for initialized device\n"); + err = -EBUSY; + goto out_destroy_comp; + } + + init_waitqueue_head(&zram->io_done); + atomic_set(&zram->refcount, 1); + zram->meta = meta; + zram->comp = comp; + zram->disksize = disksize; + set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT); + up_write(&zram->init_lock); + + /* + * Revalidate disk out of the init_lock to avoid lockdep splat. + * It's okay because disk's capacity is protected by init_lock + * so that revalidate_disk always sees up-to-date capacity. + */ + revalidate_disk(zram->disk); + + return len; + +out_destroy_comp: + up_write(&zram->init_lock); + zcomp_destroy(comp); +out_free_meta: + zram_meta_free(meta, disksize); + return err; } -static ssize_t mm_stat_show(struct device *dev, - struct device_attribute *attr, char *buf) +static ssize_t reset_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) { - struct zram *zram = dev_to_zram(dev); - u64 orig_size, mem_used = 0; - long max_used; - ssize_t ret; + int ret; + unsigned short do_reset; + struct zram *zram; + struct block_device *bdev; - down_read(&zram->init_lock); - if (init_done(zram)) - mem_used = zs_get_total_pages(zram->meta->mem_pool); + ret = kstrtou16(buf, 10, &do_reset); + if (ret) + return ret; - orig_size = atomic64_read(&zram->stats.pages_stored); - max_used = atomic_long_read(&zram->stats.max_used_pages); + if (!do_reset) + return -EINVAL; - ret = scnprintf(buf, PAGE_SIZE, - "%8llu %8llu %8llu %8lu %8ld %8llu %8llu\n", - orig_size << PAGE_SHIFT, - (u64)atomic64_read(&zram->stats.compr_data_size), - mem_used << PAGE_SHIFT, - zram->limit_pages << PAGE_SHIFT, - max_used << PAGE_SHIFT, - (u64)atomic64_read(&zram->stats.zero_pages), - (u64)atomic64_read(&zram->stats.num_migrated)); - up_read(&zram->init_lock); + zram = dev_to_zram(dev); + bdev = bdget_disk(zram->disk, 0); + if (!bdev) + return -ENOMEM; + + mutex_lock(&bdev->bd_mutex); + /* Do not reset an active device or claimed device */ + if (bdev->bd_openers || zram->claim) { + mutex_unlock(&bdev->bd_mutex); + bdput(bdev); + return -EBUSY; + } + + /* From now on, anyone can't open /dev/zram[0-9] */ + zram->claim = true; + mutex_unlock(&bdev->bd_mutex); + + /* Make sure all the pending I/O are finished */ + fsync_bdev(bdev); + zram_reset_device(zram); + revalidate_disk(zram->disk); + bdput(bdev); + + mutex_lock(&bdev->bd_mutex); + zram->claim = false; + mutex_unlock(&bdev->bd_mutex); + + return len; +} + +static int zram_open(struct block_device *bdev, fmode_t mode) +{ + int ret = 0; + struct zram *zram; + + WARN_ON(!mutex_is_locked(&bdev->bd_mutex)); + + zram = bdev->bd_disk->private_data; + /* zram was claimed to reset so open request fails */ + if (zram->claim) + ret = -EBUSY; return ret; } -static DEVICE_ATTR_RO(io_stat); -static DEVICE_ATTR_RO(mm_stat); -ZRAM_ATTR_RO(num_reads); -ZRAM_ATTR_RO(num_writes); -ZRAM_ATTR_RO(failed_reads); -ZRAM_ATTR_RO(failed_writes); -ZRAM_ATTR_RO(invalid_io); -ZRAM_ATTR_RO(notify_free); -ZRAM_ATTR_RO(zero_pages); -ZRAM_ATTR_RO(compr_data_size); +static const struct block_device_operations zram_devops = { + .open = zram_open, + .swap_slot_free_notify = zram_slot_free_notify, + .rw_page = zram_rw_page, + .owner = THIS_MODULE +}; + +static DEVICE_ATTR_WO(compact); +static DEVICE_ATTR_RW(disksize); +static DEVICE_ATTR_RO(initstate); +static DEVICE_ATTR_WO(reset); +static DEVICE_ATTR_RO(orig_data_size); +static DEVICE_ATTR_RO(mem_used_total); +static DEVICE_ATTR_RW(mem_limit); +static DEVICE_ATTR_RW(mem_used_max); +static DEVICE_ATTR_RW(max_comp_streams); +static DEVICE_ATTR_RW(comp_algorithm); static struct attribute *zram_disk_attrs[] = { &dev_attr_disksize.attr, @@ -1207,10 +1189,24 @@ static struct attribute_group zram_disk_attr_group = { .attrs = zram_disk_attrs, }; -static int create_device(struct zram *zram, int device_id) +/* + * Allocate and initialize new zram device. the function returns + * '>= 0' device_id upon success, and negative value otherwise. + */ +static int zram_add(void) { + struct zram *zram; struct request_queue *queue; - int ret = -ENOMEM; + int ret, device_id; + + zram = kzalloc(sizeof(struct zram), GFP_KERNEL); + if (!zram) + return -ENOMEM; + + ret = idr_alloc(&zram_index_idr, zram, 0, 0, GFP_KERNEL); + if (ret < 0) + goto out_free_dev; + device_id = ret; init_rwsem(&zram->init_lock); @@ -1218,15 +1214,16 @@ static int create_device(struct zram *zram, int device_id) if (!queue) { pr_err("Error allocating disk queue for device %d\n", device_id); - goto out; + ret = -ENOMEM; + goto out_free_idr; } blk_queue_make_request(queue, zram_make_request); - /* gendisk structure */ + /* gendisk structure */ zram->disk = alloc_disk(1); if (!zram->disk) { - pr_warn("Error allocating disk structure for device %d\n", + pr_err("Error allocating disk structure for device %d\n", device_id); ret = -ENOMEM; goto out_free_queue; @@ -1240,7 +1237,6 @@ static int create_device(struct zram *zram, int device_id) zram->disk->private_data = zram; snprintf(zram->disk->disk_name, 16, "zram%d", device_id); - __set_bit(QUEUE_FLAG_FAST, &queue->queue_flags); /* Actual capacity set using syfs (/sys/block/zram/disksize */ set_capacity(zram->disk, 0); /* zram devices sort of resembles non-rotational disks */ @@ -1256,7 +1252,7 @@ static int create_device(struct zram *zram, int device_id) blk_queue_io_min(zram->disk->queue, PAGE_SIZE); blk_queue_io_opt(zram->disk->queue, PAGE_SIZE); zram->disk->queue->limits.discard_granularity = PAGE_SIZE; - zram->disk->queue->limits.max_discard_sectors = UINT_MAX; + blk_queue_max_discard_sectors(zram->disk->queue, UINT_MAX); /* * zram_bio_discard() will clear all logical blocks if logical block * size is identical with physical block size(PAGE_SIZE). But if it is @@ -1276,98 +1272,184 @@ static int create_device(struct zram *zram, int device_id) ret = sysfs_create_group(&disk_to_dev(zram->disk)->kobj, &zram_disk_attr_group); if (ret < 0) { - pr_warn("Error creating sysfs group"); + pr_err("Error creating sysfs group for device %d\n", + device_id); goto out_free_disk; } strlcpy(zram->compressor, default_compressor, sizeof(zram->compressor)); zram->meta = NULL; - zram->max_comp_streams = 1; - return 0; + + pr_info("Added device: %s\n", zram->disk->disk_name); + return device_id; out_free_disk: del_gendisk(zram->disk); put_disk(zram->disk); out_free_queue: blk_cleanup_queue(queue); -out: +out_free_idr: + idr_remove(&zram_index_idr, device_id); +out_free_dev: + kfree(zram); return ret; } -static void destroy_devices(unsigned int nr) +static int zram_remove(struct zram *zram) +{ + struct block_device *bdev; + + bdev = bdget_disk(zram->disk, 0); + if (!bdev) + return -ENOMEM; + + mutex_lock(&bdev->bd_mutex); + if (bdev->bd_openers || zram->claim) { + mutex_unlock(&bdev->bd_mutex); + bdput(bdev); + return -EBUSY; + } + + zram->claim = true; + mutex_unlock(&bdev->bd_mutex); + + /* + * Remove sysfs first, so no one will perform a disksize + * store while we destroy the devices. This also helps during + * hot_remove -- zram_reset_device() is the last holder of + * ->init_lock, no later/concurrent disksize_store() or any + * other sysfs handlers are possible. + */ + sysfs_remove_group(&disk_to_dev(zram->disk)->kobj, + &zram_disk_attr_group); + + /* Make sure all the pending I/O are finished */ + fsync_bdev(bdev); + zram_reset_device(zram); + bdput(bdev); + + pr_info("Removed device: %s\n", zram->disk->disk_name); + + blk_cleanup_queue(zram->disk->queue); + del_gendisk(zram->disk); + put_disk(zram->disk); + kfree(zram); + return 0; +} + +/* zram-control sysfs attributes */ +static ssize_t hot_add_show(struct class *class, + struct class_attribute *attr, + char *buf) +{ + int ret; + + mutex_lock(&zram_index_mutex); + ret = zram_add(); + mutex_unlock(&zram_index_mutex); + + if (ret < 0) + return ret; + return scnprintf(buf, PAGE_SIZE, "%d\n", ret); +} + +static ssize_t hot_remove_store(struct class *class, + struct class_attribute *attr, + const char *buf, + size_t count) { struct zram *zram; - unsigned int i; + int ret, dev_id; - for (i = 0; i < nr; i++) { - zram = &zram_devices[i]; - /* - * Remove sysfs first, so no one will perform a disksize - * store while we destroy the devices - */ - sysfs_remove_group(&disk_to_dev(zram->disk)->kobj, - &zram_disk_attr_group); + /* dev_id is gendisk->first_minor, which is `int' */ + ret = kstrtoint(buf, 10, &dev_id); + if (ret) + return ret; + if (dev_id < 0) + return -EINVAL; - zram_reset_device(zram); + mutex_lock(&zram_index_mutex); - blk_cleanup_queue(zram->disk->queue); - del_gendisk(zram->disk); - put_disk(zram->disk); + zram = idr_find(&zram_index_idr, dev_id); + if (zram) { + ret = zram_remove(zram); + idr_remove(&zram_index_idr, dev_id); + } else { + ret = -ENODEV; } - kfree(zram_devices); + mutex_unlock(&zram_index_mutex); + return ret ? ret : count; +} + +static struct class_attribute zram_control_class_attrs[] = { + __ATTR_RO(hot_add), + __ATTR_WO(hot_remove), + __ATTR_NULL, +}; + +static struct class zram_control_class = { + .name = "zram-control", + .owner = THIS_MODULE, + .class_attrs = zram_control_class_attrs, +}; + +static int zram_remove_cb(int id, void *ptr, void *data) +{ + zram_remove(ptr); + return 0; +} + +static void destroy_devices(void) +{ + class_unregister(&zram_control_class); + idr_for_each(&zram_index_idr, &zram_remove_cb, NULL); + idr_destroy(&zram_index_idr); unregister_blkdev(zram_major, "zram"); - pr_info("Destroyed %u device(s)\n", nr); } static int __init zram_init(void) { - int ret, dev_id; + int ret; - if (num_devices > max_num_devices) { - pr_warn("Invalid value for num_devices: %u\n", - num_devices); - return -EINVAL; + ret = class_register(&zram_control_class); + if (ret) { + pr_err("Unable to register zram-control class\n"); + return ret; } zram_major = register_blkdev(0, "zram"); if (zram_major <= 0) { - pr_warn("Unable to get major number\n"); + pr_err("Unable to get major number\n"); + class_unregister(&zram_control_class); return -EBUSY; } - /* Allocate the device array and initialize each one */ - zram_devices = kzalloc(num_devices * sizeof(struct zram), GFP_KERNEL); - if (!zram_devices) { - unregister_blkdev(zram_major, "zram"); - return -ENOMEM; - } - - for (dev_id = 0; dev_id < num_devices; dev_id++) { - ret = create_device(&zram_devices[dev_id], dev_id); - if (ret) + while (num_devices != 0) { + mutex_lock(&zram_index_mutex); + ret = zram_add(); + mutex_unlock(&zram_index_mutex); + if (ret < 0) goto out_error; + num_devices--; } - show_mem_notifier_register(&zram_show_mem_notifier_block); - pr_info("Created %u device(s) ...\n", num_devices); - return 0; out_error: - destroy_devices(dev_id); + destroy_devices(); return ret; } static void __exit zram_exit(void) { - destroy_devices(num_devices); + destroy_devices(); } module_init(zram_init); module_exit(zram_exit); module_param(num_devices, uint, 0); -MODULE_PARM_DESC(num_devices, "Number of zram devices"); +MODULE_PARM_DESC(num_devices, "Number of pre-created zram devices"); MODULE_LICENSE("Dual BSD/GPL"); MODULE_AUTHOR("Nitin Gupta "); diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index 570c598f4ce9a..06b1636f47221 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -20,12 +20,6 @@ #include "zcomp.h" -/* - * Some arbitrary value. This is just to catch - * invalid value for num_devices module parameter. - */ -static const unsigned max_num_devices = 32; - /*-- Configurable parameters */ /* @@ -84,7 +78,6 @@ struct zram_stats { atomic64_t compr_data_size; /* compressed size of pages stored */ atomic64_t num_reads; /* failed + successful */ atomic64_t num_writes; /* --do-- */ - atomic64_t num_migrated; /* no. of migrated object */ atomic64_t failed_reads; /* can happen when memory is too low */ atomic64_t failed_writes; /* can happen when memory is too low */ atomic64_t invalid_io; /* non-page-aligned I/O requests */ @@ -109,7 +102,6 @@ struct zram { * the number of pages zram can consume for storing compressed data */ unsigned long limit_pages; - int max_comp_streams; struct zram_stats stats; atomic_t refcount; /* refcount for zram_meta */ @@ -121,5 +113,9 @@ struct zram { */ u64 disksize; /* bytes */ char compressor[10]; + /* + * zram is claimed so open request will be failed + */ + bool claim; /* Protected by bdev->bd_mutex */ }; #endif diff --git a/drivers/bluetooth/btfm_slim.c b/drivers/bluetooth/btfm_slim.c index 5fb00b96a9d3c..1c6e256673e29 100644 --- a/drivers/bluetooth/btfm_slim.c +++ b/drivers/bluetooth/btfm_slim.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* 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 @@ -509,7 +509,6 @@ static int btfm_slim_remove(struct slim_device *slim) BTFMSLIM_DBG(""); mutex_destroy(&btfm_slim->io_lock); mutex_destroy(&btfm_slim->xfer_lock); - kfree(btfm_slim); snd_soc_unregister_codec(&slim->dev); BTFMSLIM_DBG("slim_remove_device() - btfm_slim->slim_ifd"); @@ -517,6 +516,8 @@ static int btfm_slim_remove(struct slim_device *slim) BTFMSLIM_DBG("slim_remove_device() - btfm_slim->slim_pgd"); slim_remove_device(slim); + + kfree(btfm_slim); return 0; } diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c index 23e1e8b7d04a4..28818b28a1a04 100644 --- a/drivers/char/adsprpc.c +++ b/drivers/char/adsprpc.c @@ -706,9 +706,9 @@ static int overlap_ptr_cmp(const void *a, const void *b) return st == 0 ? ed : st; } -static void context_build_overlap(struct smq_invoke_ctx *ctx) +static int context_build_overlap(struct smq_invoke_ctx *ctx) { - int i; + int i, err = 0; remote_arg_t *lpra = ctx->lpra; int inbufs = REMOTE_SCALARS_INBUFS(ctx->sc); int outbufs = REMOTE_SCALARS_OUTBUFS(ctx->sc); @@ -717,6 +717,11 @@ static void context_build_overlap(struct smq_invoke_ctx *ctx) for (i = 0; i < nbufs; ++i) { ctx->overs[i].start = (uintptr_t)lpra[i].buf.pv; ctx->overs[i].end = ctx->overs[i].start + lpra[i].buf.len; + if (lpra[i].buf.len) { + VERIFY(err, ctx->overs[i].end > ctx->overs[i].start); + if (err) + goto bail; + } ctx->overs[i].raix = i; ctx->overps[i] = &ctx->overs[i]; } @@ -742,6 +747,8 @@ static void context_build_overlap(struct smq_invoke_ctx *ctx) max = *ctx->overps[i]; } } +bail: + return err; } #define K_COPY_FROM_USER(err, kernel, dst, src, size) \ @@ -805,8 +812,11 @@ static int context_alloc(struct fastrpc_file *fl, uint32_t kernel, goto bail; } ctx->sc = invoke->sc; - if (bufs) - context_build_overlap(ctx); + if (bufs) { + VERIFY(err, 0 == context_build_overlap(ctx)); + if (err) + goto bail; + } ctx->retval = -1; ctx->pid = current->pid; ctx->tgid = current->tgid; @@ -972,6 +982,7 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx) /* calculate len requreed for copying */ for (oix = 0; oix < inbufs + outbufs; ++oix) { int i = ctx->overps[oix]->raix; + uintptr_t mstart, mend; ssize_t len = lpra[i].buf.len; if (!len) continue; @@ -979,7 +990,15 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx) continue; if (ctx->overps[oix]->offset == 0) copylen = ALIGN(copylen, BALIGN); - copylen += ctx->overps[oix]->mend - ctx->overps[oix]->mstart; + mstart = ctx->overps[oix]->mstart; + mend = ctx->overps[oix]->mend; + VERIFY(err, (mend - mstart) <= LONG_MAX); + if (err) + goto bail; + copylen += mend - mstart; + VERIFY(err, copylen >= 0); + if (err) + goto bail; } ctx->used = copylen; @@ -1044,7 +1063,7 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx) for (oix = 0; oix < inbufs + outbufs; ++oix) { int i = ctx->overps[oix]->raix; struct fastrpc_mmap *map = ctx->maps[i]; - int mlen = ctx->overps[oix]->mend - ctx->overps[oix]->mstart; + ssize_t mlen; uint64_t buf; ssize_t len = lpra[i].buf.len; if (!len) @@ -1055,6 +1074,7 @@ static int get_args(uint32_t kernel, struct smq_invoke_ctx *ctx) rlen -= ALIGN(args, BALIGN) - args; args = ALIGN(args, BALIGN); } + mlen = ctx->overps[oix]->mend - ctx->overps[oix]->mstart; VERIFY(err, rlen >= mlen); if (err) goto bail; @@ -1699,6 +1719,11 @@ static int fastrpc_file_free(struct fastrpc_file *fl) hlist_del_init(&fl->hn); spin_unlock(&fl->apps->hlock); + if (!fl->sctx) { + kfree(fl); + return 0; + } + (void)fastrpc_release_current_dsp_process(fl); fastrpc_context_list_dtor(fl); fastrpc_buf_list_free(fl); @@ -1854,7 +1879,10 @@ static void file_free_work_handler(struct work_struct *w) break; } mutex_unlock(&me->flfree_mutex); - fastrpc_file_free(freefl->fl); + if (freefl) { + fastrpc_file_free(freefl->fl); + kfree(freefl); + } mutex_lock(&me->flfree_mutex); if (hlist_empty(&me->fls)) { @@ -1864,7 +1892,6 @@ static void file_free_work_handler(struct work_struct *w) break; } mutex_unlock(&me->flfree_mutex); - kfree(freefl); } return; } diff --git a/drivers/char/diag/diag_dci.c b/drivers/char/diag/diag_dci.c index 62b0cf2e966f5..fd5157dda02e3 100644 --- a/drivers/char/diag/diag_dci.c +++ b/drivers/char/diag/diag_dci.c @@ -2767,6 +2767,8 @@ int diag_dci_register_client(struct diag_dci_reg_tbl_t *reg_entry) new_entry->num_buffers = 1; break; } + + new_entry->buffers = NULL; new_entry->real_time = MODE_REALTIME; new_entry->in_service = 0; INIT_LIST_HEAD(&new_entry->list_write_buf); @@ -2840,7 +2842,8 @@ int diag_dci_register_client(struct diag_dci_reg_tbl_t *reg_entry) fail_alloc: if (new_entry) { - for (i = 0; i < new_entry->num_buffers; i++) { + for (i = 0; ((i < new_entry->num_buffers) && + new_entry->buffers); i++) { proc_buf = &new_entry->buffers[i]; if (proc_buf) { mutex_destroy(&proc_buf->health_mutex); diff --git a/drivers/char/diag/diag_debugfs.c b/drivers/char/diag/diag_debugfs.c index f5e4eba1e96bc..b66c8cb8257c2 100644 --- a/drivers/char/diag/diag_debugfs.c +++ b/drivers/char/diag/diag_debugfs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -268,8 +268,10 @@ static ssize_t diag_dbgfs_read_table(struct file *file, char __user *ubuf, struct list_head *temp; struct diag_cmd_reg_t *item = NULL; + mutex_lock(&driver->cmd_reg_mutex); if (diag_dbgfs_table_index == driver->cmd_reg_count) { diag_dbgfs_table_index = 0; + mutex_unlock(&driver->cmd_reg_mutex); return 0; } @@ -278,6 +280,7 @@ static ssize_t diag_dbgfs_read_table(struct file *file, char __user *ubuf, buf = kzalloc(sizeof(char) * buf_size, GFP_KERNEL); if (ZERO_OR_NULL_PTR(buf)) { pr_err("diag: %s, Error allocating memory\n", __func__); + mutex_unlock(&driver->cmd_reg_mutex); return -ENOMEM; } buf_size = ksize(buf); @@ -322,6 +325,7 @@ static ssize_t diag_dbgfs_read_table(struct file *file, char __user *ubuf, break; } diag_dbgfs_table_index = i; + mutex_unlock(&driver->cmd_reg_mutex); *ppos = 0; ret = simple_read_from_buffer(ubuf, count, ppos, buf, bytes_in_buffer); diff --git a/drivers/char/diag/diag_masks.c b/drivers/char/diag/diag_masks.c index 9f694a052cb8f..de18a7a86dc41 100644 --- a/drivers/char/diag/diag_masks.c +++ b/drivers/char/diag/diag_masks.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-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 @@ -288,6 +288,7 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last) struct diag_mask_info *mask_info = NULL; struct diag_msg_mask_t *mask = NULL; struct diag_ctrl_msg_mask header; + uint8_t msg_mask_tbl_count_local; if (peripheral >= NUM_PERIPHERALS) return; @@ -308,8 +309,15 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last) if (!mask_info) return; + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)mask_info->ptr; + if (!mask->ptr) { + mutex_unlock(&driver->msg_mask_lock); + return; + } buf = mask_info->update_buf; + msg_mask_tbl_count_local = driver->msg_mask_tbl_count; + mutex_unlock(&driver->msg_mask_lock); mutex_lock(&mask_info->lock); switch (mask_info->status) { case DIAG_CTRL_MASK_ALL_DISABLED: @@ -326,9 +334,11 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last) goto err; } - for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { - if (((first < mask->ssid_first) || - (last > mask->ssid_last_tools)) && first != ALL_SSID) { + for (i = 0; i < msg_mask_tbl_count_local; i++, mask++) { + mutex_lock(&driver->msg_mask_lock); + if (((mask->ssid_first > first) || + (mask->ssid_last_tools < last)) && first != ALL_SSID) { + mutex_unlock(&driver->msg_mask_lock); continue; } @@ -369,12 +379,13 @@ static void diag_send_msg_mask_update(uint8_t peripheral, int first, int last) if (mask_size > 0) memcpy(buf + header_len, mask->ptr, mask_size); mutex_unlock(&mask->lock); + mutex_unlock(&driver->msg_mask_lock); err = diagfwd_write(peripheral, TYPE_CNTL, buf, header_len + mask_size); if (err && err != -ENODEV) - pr_err_ratelimited("diag: Unable to send msg masks to peripheral %d\n", - peripheral); + pr_err_ratelimited("diag: Unable to send msg masks to peripheral %d, error = %d\n", + peripheral, err); if (first != ALL_SSID) break; @@ -493,6 +504,7 @@ static int diag_cmd_get_ssid_range(unsigned char *src_buf, int src_len, if (!diag_apps_responds()) return 0; + mutex_lock(&driver->msg_mask_lock); rsp.cmd_code = DIAG_CMD_MSG_CONFIG; rsp.sub_cmd = DIAG_CMD_OP_GET_SSID_RANGE; rsp.status = MSG_STATUS_SUCCESS; @@ -500,7 +512,6 @@ static int diag_cmd_get_ssid_range(unsigned char *src_buf, int src_len, rsp.count = driver->msg_mask_tbl_count; memcpy(dest_buf, &rsp, sizeof(rsp)); write_len += sizeof(rsp); - mask_ptr = (struct diag_msg_mask_t *)mask_info->ptr; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask_ptr++) { if (write_len + sizeof(ssid_range) > dest_len) { @@ -513,6 +524,7 @@ static int diag_cmd_get_ssid_range(unsigned char *src_buf, int src_len, memcpy(dest_buf + write_len, &ssid_range, sizeof(ssid_range)); write_len += sizeof(ssid_range); } + mutex_unlock(&driver->msg_mask_lock); return write_len; } @@ -538,6 +550,7 @@ static int diag_cmd_get_build_mask(unsigned char *src_buf, int src_len, if (!diag_apps_responds()) return 0; + mutex_lock(&driver->msg_mask_lock); req = (struct diag_build_mask_req_t *)src_buf; rsp.cmd_code = DIAG_CMD_MSG_CONFIG; rsp.sub_cmd = DIAG_CMD_OP_GET_BUILD_MASK; @@ -545,9 +558,8 @@ static int diag_cmd_get_build_mask(unsigned char *src_buf, int src_len, rsp.ssid_last = req->ssid_last; rsp.status = MSG_STATUS_FAIL; rsp.padding = 0; - build_mask = (struct diag_msg_mask_t *)msg_bt_mask.ptr; - for (i = 0; i < driver->msg_mask_tbl_count; i++, build_mask++) { + for (i = 0; i < driver->bt_msg_mask_tbl_count; i++, build_mask++) { if (build_mask->ssid_first != req->ssid_first) continue; num_entries = req->ssid_last - req->ssid_first + 1; @@ -568,6 +580,7 @@ static int diag_cmd_get_build_mask(unsigned char *src_buf, int src_len, } memcpy(dest_buf, &rsp, sizeof(rsp)); write_len += sizeof(rsp); + mutex_unlock(&driver->msg_mask_lock); return write_len; } @@ -596,6 +609,7 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len, if (!diag_apps_responds()) return 0; + mutex_lock(&driver->msg_mask_lock); req = (struct diag_build_mask_req_t *)src_buf; rsp.cmd_code = DIAG_CMD_MSG_CONFIG; rsp.sub_cmd = DIAG_CMD_OP_GET_MSG_MASK; @@ -603,7 +617,6 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len, rsp.ssid_last = req->ssid_last; rsp.status = MSG_STATUS_FAIL; rsp.padding = 0; - mask = (struct diag_msg_mask_t *)mask_info->ptr; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { if ((req->ssid_first < mask->ssid_first) || @@ -621,6 +634,7 @@ static int diag_cmd_get_msg_mask(unsigned char *src_buf, int src_len, } memcpy(dest_buf, &rsp, sizeof(rsp)); write_len += sizeof(rsp); + mutex_unlock(&driver->msg_mask_lock); return write_len; } @@ -652,8 +666,8 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len, } req = (struct diag_msg_build_mask_t *)src_buf; - mutex_lock(&mask_info->lock); + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)mask_info->ptr; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { if (i < (driver->msg_mask_tbl_count - 1)) { @@ -693,6 +707,8 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len, pr_err_ratelimited("diag: In %s, unable to allocate memory for msg mask ptr, mask_size: %d\n", __func__, mask_size); mutex_unlock(&mask->lock); + mutex_unlock(&driver->msg_mask_lock); + mutex_unlock(&mask_info->lock); return -ENOMEM; } mask->ptr = temp; @@ -711,8 +727,8 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len, mask_info->status = DIAG_CTRL_MASK_VALID; break; } + mutex_unlock(&driver->msg_mask_lock); mutex_unlock(&mask_info->lock); - if (diag_check_update(APPS_DATA)) diag_update_userspace_clients(MSG_MASKS_TYPE); @@ -737,7 +753,9 @@ static int diag_cmd_set_msg_mask(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_msg_mask_update(i, req->ssid_first, req->ssid_last); + mutex_unlock(&driver->md_session_lock); } end: return write_len; @@ -766,8 +784,10 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len, req = (struct diag_msg_config_rsp_t *)src_buf; - mask = (struct diag_msg_mask_t *)mask_info->ptr; mutex_lock(&mask_info->lock); + mutex_lock(&driver->msg_mask_lock); + + mask = (struct diag_msg_mask_t *)mask_info->ptr; mask_info->status = (req->rt_mask) ? DIAG_CTRL_MASK_ALL_ENABLED : DIAG_CTRL_MASK_ALL_DISABLED; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { @@ -776,6 +796,7 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len, mask->range * sizeof(uint32_t)); mutex_unlock(&mask->lock); } + mutex_unlock(&driver->msg_mask_lock); mutex_unlock(&mask_info->lock); if (diag_check_update(APPS_DATA)) @@ -796,7 +817,9 @@ static int diag_cmd_set_all_msg_mask(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_msg_mask_update(i, ALL_SSID, ALL_SSID); + mutex_unlock(&driver->md_session_lock); } return write_len; @@ -890,7 +913,9 @@ static int diag_cmd_update_event_mask(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_event_mask_update(i); + mutex_unlock(&driver->md_session_lock); } return write_len; @@ -937,7 +962,9 @@ static int diag_cmd_toggle_events(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_event_mask_update(i); + mutex_unlock(&driver->md_session_lock); } memcpy(dest_buf, &header, sizeof(header)); write_len += sizeof(header); @@ -1191,7 +1218,9 @@ static int diag_cmd_set_log_mask(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_log_mask_update(i, req->equip_id); + mutex_unlock(&driver->md_session_lock); } end: return write_len; @@ -1242,7 +1271,9 @@ static int diag_cmd_disable_log_mask(unsigned char *src_buf, int src_len, for (i = 0; i < NUM_PERIPHERALS; i++) { if (!diag_check_update(i)) continue; + mutex_lock(&driver->md_session_lock); diag_send_log_mask_update(i, ALL_EQUIP_ID); + mutex_unlock(&driver->md_session_lock); } return write_len; @@ -1281,6 +1312,7 @@ static int diag_create_msg_mask_table(void) struct diag_ssid_range_t range; mutex_lock(&msg_mask.lock); + mutex_lock(&driver->msg_mask_lock); driver->msg_mask_tbl_count = MSG_MASK_TBL_CNT; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { range.ssid_first = msg_mask_tbl[i].ssid_first; @@ -1289,6 +1321,7 @@ static int diag_create_msg_mask_table(void) if (err) break; } + mutex_unlock(&driver->msg_mask_lock); mutex_unlock(&msg_mask.lock); return err; } @@ -1303,8 +1336,10 @@ static int diag_create_build_time_mask(void) struct diag_ssid_range_t range; mutex_lock(&msg_bt_mask.lock); + mutex_lock(&driver->msg_mask_lock); + driver->bt_msg_mask_tbl_count = MSG_MASK_TBL_CNT; build_mask = (struct diag_msg_mask_t *)msg_bt_mask.ptr; - for (i = 0; i < driver->msg_mask_tbl_count; i++, build_mask++) { + for (i = 0; i < driver->bt_msg_mask_tbl_count; i++, build_mask++) { range.ssid_first = msg_mask_tbl[i].ssid_first; range.ssid_last = msg_mask_tbl[i].ssid_last; err = diag_create_msg_mask_table_entry(build_mask, &range); @@ -1414,8 +1449,8 @@ static int diag_create_build_time_mask(void) } memcpy(build_mask->ptr, tbl, tbl_size); } + mutex_unlock(&driver->msg_mask_lock); mutex_unlock(&msg_bt_mask.lock); - return err; } @@ -1562,10 +1597,11 @@ static int diag_msg_mask_init(void) pr_err("diag: Unable to create msg masks, err: %d\n", err); return err; } + mutex_lock(&driver->msg_mask_lock); driver->msg_mask = &msg_mask; - for (i = 0; i < NUM_PERIPHERALS; i++) driver->max_ssid_count[i] = 0; + mutex_unlock(&driver->msg_mask_lock); return 0; } @@ -1584,8 +1620,8 @@ int diag_msg_mask_copy(struct diag_mask_info *dest, struct diag_mask_info *src) err = __diag_mask_init(dest, MSG_MASK_SIZE, APPS_BUF_SIZE); if (err) return err; - mutex_lock(&dest->lock); + mutex_lock(&driver->msg_mask_lock); src_mask = (struct diag_msg_mask_t *)src->ptr; dest_mask = (struct diag_msg_mask_t *)dest->ptr; @@ -1602,8 +1638,8 @@ int diag_msg_mask_copy(struct diag_mask_info *dest, struct diag_mask_info *src) src_mask++; dest_mask++; } + mutex_unlock(&driver->msg_mask_lock); mutex_unlock(&dest->lock); - return err; } @@ -1614,15 +1650,15 @@ void diag_msg_mask_free(struct diag_mask_info *mask_info) if (!mask_info) return; - mutex_lock(&mask_info->lock); + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)mask_info->ptr; for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { kfree(mask->ptr); mask->ptr = NULL; } + mutex_unlock(&driver->msg_mask_lock); mutex_unlock(&mask_info->lock); - __diag_mask_exit(mask_info); } @@ -1630,15 +1666,17 @@ static void diag_msg_mask_exit(void) { int i; struct diag_msg_mask_t *mask = NULL; - + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)(msg_mask.ptr); if (mask) { for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) kfree(mask->ptr); kfree(msg_mask.ptr); + msg_mask.ptr = NULL; } - kfree(msg_mask.update_buf); + msg_mask.update_buf = NULL; + mutex_unlock(&driver->msg_mask_lock); } static int diag_build_time_mask_init(void) @@ -1663,13 +1701,15 @@ static void diag_build_time_mask_exit(void) { int i; struct diag_msg_mask_t *mask = NULL; - + mutex_lock(&driver->msg_mask_lock); mask = (struct diag_msg_mask_t *)(msg_bt_mask.ptr); if (mask) { - for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) + for (i = 0; i < driver->bt_msg_mask_tbl_count; i++, mask++) kfree(mask->ptr); - kfree(msg_mask.ptr); + kfree(msg_bt_mask.ptr); + msg_bt_mask.ptr = NULL; } + mutex_unlock(&driver->msg_mask_lock); } static int diag_log_mask_init(void) @@ -1779,7 +1819,17 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count, if (!mask_info) return -EIO; + mutex_lock(&driver->diag_maskclear_mutex); + if (driver->mask_clear) { + DIAG_LOG(DIAG_DEBUG_PERIPHERALS, + "diag:%s: count = %zu\n", __func__, count); + mutex_unlock(&driver->diag_maskclear_mutex); + return -EIO; + } + mutex_unlock(&driver->diag_maskclear_mutex); mutex_lock(&mask_info->lock); + mutex_lock(&driver->msg_mask_lock); + mask = (struct diag_msg_mask_t *)(mask_info->ptr); for (i = 0; i < driver->msg_mask_tbl_count; i++, mask++) { ptr = mask_info->update_buf; @@ -1816,8 +1866,8 @@ int diag_copy_to_user_msg_mask(char __user *buf, size_t count, } total_len += len; } + mutex_unlock(&driver->msg_mask_lock); mutex_unlock(&mask_info->lock); - return err ? err : total_len; } @@ -1844,6 +1894,12 @@ int diag_copy_to_user_log_mask(char __user *buf, size_t count, mutex_lock(&mask_info->lock); mask = (struct diag_log_mask_t *)(mask_info->ptr); for (i = 0; i < MAX_EQUIP_ID; i++, mask++) { + if (!mask->ptr) { + pr_err("diag: In %s, mask->ptr==NULL, equip_id:%d\n", + __func__, mask->equip_id); + continue; + } + ptr = mask_info->update_buf; len = 0; mutex_lock(&mask->lock); @@ -1886,9 +1942,11 @@ void diag_send_updates_peripheral(uint8_t peripheral) diag_send_feature_mask_update(peripheral); if (driver->time_sync_enabled) diag_send_time_sync_update(peripheral); + mutex_lock(&driver->md_session_lock); diag_send_msg_mask_update(peripheral, ALL_SSID, ALL_SSID); diag_send_log_mask_update(peripheral, ALL_EQUIP_ID); diag_send_event_mask_update(peripheral); + mutex_unlock(&driver->md_session_lock); diag_send_real_time_update(peripheral, driver->real_time_mode[DIAG_LOCAL_PROC]); diag_send_peripheral_buffering_mode( diff --git a/drivers/char/diag/diag_usb.c b/drivers/char/diag/diag_usb.c index eb715cc8501c0..93c5076302cf9 100644 --- a/drivers/char/diag/diag_usb.c +++ b/drivers/char/diag/diag_usb.c @@ -213,17 +213,33 @@ static void usb_connect_work_fn(struct work_struct *work) * and synchronously when Diag wants to disconnect from USB * explicitly. */ -static void usb_disconnect(struct diag_usb_info *ch) +static void __usb_disconnect(struct diag_usb_info *ch, int skip) { + if (!ch) + return; + + WARN_ON(skip && !atomic_read(&ch->connected) && driver->usb_connected); + + if (!skip && !atomic_read(&ch->connected) && driver->usb_connected) + diag_clear_masks(NULL); + if (ch && ch->ops && ch->ops->close) ch->ops->close(ch->ctxt, DIAG_USB_MODE); } +static void usb_disconnect(struct diag_usb_info *ch) +{ + if (!ch) + return; + + __usb_disconnect(ch, ch->closing); +} + static void usb_disconnect_work_fn(struct work_struct *work) { struct diag_usb_info *ch = container_of(work, struct diag_usb_info, disconnect_work); - usb_disconnect(ch); + __usb_disconnect(ch, 0); } static void usb_read_work_fn(struct work_struct *work) @@ -348,12 +364,14 @@ static void diag_usb_notifier(void *priv, unsigned event, switch (event) { case USB_DIAG_CONNECT: usb_info->max_size = usb_diag_request_size(usb_info->hdl); + usb_info->closing = 0; atomic_set(&usb_info->connected, 1); pr_info("diag: USB channel %s connected\n", usb_info->name); queue_work(usb_info->usb_wq, &usb_info->connect_work); break; case USB_DIAG_DISCONNECT: + usb_info->closing = 1; atomic_set(&usb_info->connected, 0); pr_info("diag: USB channel %s disconnected\n", usb_info->name); queue_work(usb_info->usb_wq, diff --git a/drivers/char/diag/diag_usb.h b/drivers/char/diag/diag_usb.h index cf4d4db3e3c32..22bf9b7dc3cd1 100644 --- a/drivers/char/diag/diag_usb.h +++ b/drivers/char/diag/diag_usb.h @@ -53,6 +53,7 @@ struct diag_usb_info { atomic_t connected; atomic_t diag_state; atomic_t read_pending; + int closing; int enabled; int mempool; int max_size; diff --git a/drivers/char/diag/diagchar.h b/drivers/char/diag/diagchar.h index fb86f6e246b16..0e74a855eb149 100644 --- a/drivers/char/diag/diagchar.h +++ b/drivers/char/diag/diagchar.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-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 @@ -463,6 +463,8 @@ struct diagchar_dev { struct class *diagchar_class; struct device *diag_dev; int ref_count; + int mask_clear; + struct mutex diag_maskclear_mutex; struct mutex diagchar_mutex; struct mutex diag_file_mutex; wait_queue_head_t wait_q; @@ -503,7 +505,7 @@ struct diagchar_dev { struct list_head cmd_reg_list; struct mutex cmd_reg_mutex; uint32_t cmd_reg_count; - struct mutex diagfwd_channel_mutex; + struct mutex diagfwd_channel_mutex[NUM_PERIPHERALS]; /* Sizes that reflect memory pool sizes */ unsigned int poolsize; unsigned int poolsize_hdlc; @@ -535,6 +537,7 @@ struct diagchar_dev { unsigned char *buf_feature_mask_update; uint8_t hdlc_disabled; struct mutex hdlc_disable_mutex; + struct mutex hdlc_recovery_mutex; struct timer_list hdlc_reset_timer; struct mutex diag_hdlc_mutex; unsigned char *hdlc_buf; @@ -580,8 +583,10 @@ struct diagchar_dev { struct diag_mask_info *event_mask; struct diag_mask_info *build_time_mask; uint8_t msg_mask_tbl_count; + uint8_t bt_msg_mask_tbl_count; uint16_t event_mask_size; uint16_t last_event_id; + struct mutex msg_mask_lock; /* Variables for Mask Centralization */ uint16_t num_event_id[NUM_PERIPHERALS]; uint32_t num_equip_id[NUM_PERIPHERALS]; @@ -622,6 +627,7 @@ void diag_cmd_remove_reg(struct diag_cmd_reg_entry_t *entry, uint8_t proc); void diag_cmd_remove_reg_by_pid(int pid); void diag_cmd_remove_reg_by_proc(int proc); int diag_cmd_chk_polling(struct diag_cmd_reg_entry_t *entry); +void diag_clear_masks(struct diag_md_session_t *info); void diag_record_stats(int type, int flag); diff --git a/drivers/char/diag/diagchar_core.c b/drivers/char/diag/diagchar_core.c index ee11ba0a5dccc..f4f5bce730934 100644 --- a/drivers/char/diag/diagchar_core.c +++ b/drivers/char/diag/diagchar_core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-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 @@ -387,6 +387,27 @@ static uint32_t diag_translate_kernel_to_user_mask(uint32_t peripheral_mask) return ret; } +void diag_clear_masks(struct diag_md_session_t *info) +{ + int ret; + char cmd_disable_log_mask[] = { 0x73, 0, 0, 0, 0, 0, 0, 0}; + char cmd_disable_msg_mask[] = { 0x7D, 0x05, 0, 0, 0, 0, 0, 0}; + char cmd_disable_event_mask[] = { 0x60, 0}; + + DIAG_LOG(DIAG_DEBUG_PERIPHERALS, + "diag: %s: masks clear request upon %s\n", __func__, + ((info) ? "ODL exit" : "USB Disconnection")); + + ret = diag_process_apps_masks(cmd_disable_log_mask, + sizeof(cmd_disable_log_mask), info); + ret = diag_process_apps_masks(cmd_disable_msg_mask, + sizeof(cmd_disable_msg_mask), info); + ret = diag_process_apps_masks(cmd_disable_event_mask, + sizeof(cmd_disable_event_mask), info); + DIAG_LOG(DIAG_DEBUG_PERIPHERALS, + "diag:%s: masks cleared successfully\n", __func__); +} + static void diag_close_logging_process(const int pid) { int i; @@ -398,8 +419,16 @@ static void diag_close_logging_process(const int pid) if (!session_info) return; + diag_clear_masks(session_info); + + mutex_lock(&driver->diag_maskclear_mutex); + driver->mask_clear = 1; + mutex_unlock(&driver->diag_maskclear_mutex); + + mutex_lock(&driver->diagchar_mutex); session_peripheral_mask = session_info->peripheral_mask; diag_md_session_close(session_info); + mutex_unlock(&driver->diagchar_mutex); for (i = 0; i < NUM_MD_SESSIONS; i++) if (MD_PERIPHERAL_MASK(i) & session_peripheral_mask) diag_mux_close_peripheral(DIAG_LOCAL_PROC, i); @@ -473,9 +502,14 @@ static int diag_remove_client_entry(struct file *file) } static int diagchar_close(struct inode *inode, struct file *file) { + int ret; DIAG_LOG(DIAG_DEBUG_USERSPACE, "diag: process exit %s\n", current->comm); - return diag_remove_client_entry(file); + ret = diag_remove_client_entry(file); + mutex_lock(&driver->diag_maskclear_mutex); + driver->mask_clear = 0; + mutex_unlock(&driver->diag_maskclear_mutex); + return ret; } void diag_record_stats(int type, int flag) @@ -920,14 +954,34 @@ static int diag_send_raw_data_remote(int proc, void *buf, int len, else hdlc_disabled = driver->hdlc_disabled; if (hdlc_disabled) { + if (len < 4) { + pr_err("diag: In %s, invalid len: %d of non_hdlc pkt", + __func__, len); + return -EBADMSG; + } payload = *(uint16_t *)(buf + 2); + if (payload > DIAG_MAX_HDLC_BUF_SIZE) { + pr_err("diag: Dropping packet, payload size is %d\n", + payload); + return -EBADMSG; + } driver->hdlc_encode_buf_len = payload; /* - * Adding 4 bytes for start (1 byte), version (1 byte) and - * payload (2 bytes) + * Adding 5 bytes for start (1 byte), version (1 byte), + * payload (2 bytes) and end (1 byte) */ - memcpy(driver->hdlc_encode_buf, buf + 4, payload); - goto send_data; + if (len == (payload + 5)) { + /* + * Adding 4 bytes for start (1 byte), version (1 byte) + * and payload (2 bytes) + */ + memcpy(driver->hdlc_encode_buf, buf + 4, payload); + goto send_data; + } else { + pr_err("diag: In %s, invalid len: %d of non_hdlc pkt", + __func__, len); + return -EBADMSG; + } } if (hdlc_flag) { @@ -2152,7 +2206,9 @@ long diagchar_ioctl(struct file *filp, mutex_unlock(&driver->dci_mutex); break; case DIAG_IOCTL_DCI_EVENT_STATUS: + mutex_lock(&driver->dci_mutex); result = diag_ioctl_dci_event_status(ioarg); + mutex_unlock(&driver->dci_mutex); break; case DIAG_IOCTL_DCI_CLEAR_LOGS: mutex_lock(&driver->dci_mutex); @@ -3312,7 +3368,7 @@ static int diagchar_cleanup(void) static int __init diagchar_init(void) { dev_t dev; - int error, ret; + int error, ret, i; pr_debug("diagfwd initializing ..\n"); ret = 0; @@ -3354,10 +3410,14 @@ static int __init diagchar_init(void) non_hdlc_data.len = 0; mutex_init(&driver->hdlc_disable_mutex); mutex_init(&driver->diagchar_mutex); + mutex_init(&driver->diag_maskclear_mutex); mutex_init(&driver->diag_file_mutex); mutex_init(&driver->delayed_rsp_mutex); mutex_init(&apps_data_mutex); - mutex_init(&driver->diagfwd_channel_mutex); + mutex_init(&driver->msg_mask_lock); + mutex_init(&driver->hdlc_recovery_mutex); + for (i = 0; i < NUM_PERIPHERALS; i++) + mutex_init(&driver->diagfwd_channel_mutex[i]); init_waitqueue_head(&driver->wait_q); INIT_WORK(&(driver->diag_drain_work), diag_drain_work_fn); INIT_WORK(&(driver->update_user_clients), diff --git a/drivers/char/diag/diagfwd.c b/drivers/char/diag/diagfwd.c index 2fd19e8d219ac..1668274709b1a 100644 --- a/drivers/char/diag/diagfwd.c +++ b/drivers/char/diag/diagfwd.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -903,7 +904,11 @@ int diag_process_apps_pkt(unsigned char *buf, int len, pr_debug("diag: In %s, received cmd %02x %02x %02x\n", __func__, entry.cmd_code, entry.subsys_id, entry.cmd_code_hi); - +#ifdef WT_COMPILE_FACTORY_VERSION + if (entry.cmd_code == 0x4b && entry.subsys_id == 0x0b && (entry.cmd_code_hi == 0x36 || entry.cmd_code_hi == 0x34)) { + print_hex_dump(KERN_ERR, "wt_factory_cmd: ", DUMP_PREFIX_NONE, 16, 1, &buf[2], len > (3+5) ? 6 : (len-2), false); + } +#endif if (*buf == DIAG_CMD_LOG_ON_DMND && driver->log_on_demand_support && driver->feature[PERIPHERAL_MODEM].rcvd_feature_mask) { write_len = diag_cmd_log_on_demand(buf, len, @@ -1225,8 +1230,6 @@ static int diagfwd_mux_open(int id, int mode) static int diagfwd_mux_close(int id, int mode) { - uint8_t i; - switch (mode) { case DIAG_USB_MODE: driver->usb_connected = 0; @@ -1241,15 +1244,16 @@ static int diagfwd_mux_close(int id, int mode) driver->md_session_mode == DIAG_MD_NONE) || (driver->md_session_mode == DIAG_MD_PERIPHERAL)) { /* - * In this case the channel must not be closed. This case - * indicates that the USB is removed but there is a client - * running in background with Memory Device mode + * This case indicates that the USB is removed + * but there is a client running in background + * with Memory Device mode. */ } else { - for (i = 0; i < NUM_PERIPHERALS; i++) { - diagfwd_close(i, TYPE_DATA); - diagfwd_close(i, TYPE_CMD); - } + /* + * With clearing of masks on ODL exit and + * USB disconnection, closing of the channel is + * not needed.This enables read and drop of stale packets. + */ /* Re enable HDLC encoding */ pr_debug("diag: In %s, re-enabling HDLC encoding\n", __func__); @@ -1349,7 +1353,9 @@ static void diag_hdlc_start_recovery(unsigned char *buf, int len, if (start_ptr) { /* Discard any partial packet reads */ + mutex_lock(&driver->hdlc_recovery_mutex); driver->incoming_pkt.processing = 0; + mutex_unlock(&driver->hdlc_recovery_mutex); diag_process_non_hdlc_pkt(start_ptr, len - i, info); } } @@ -1363,18 +1369,24 @@ void diag_process_non_hdlc_pkt(unsigned char *buf, int len, const uint32_t header_len = sizeof(struct diag_pkt_frame_t); struct diag_pkt_frame_t *actual_pkt = NULL; unsigned char *data_ptr = NULL; - struct diag_partial_pkt_t *partial_pkt = &driver->incoming_pkt; + struct diag_partial_pkt_t *partial_pkt = NULL; - if (!buf || len <= 0) + mutex_lock(&driver->hdlc_recovery_mutex); + if (!buf || len <= 0) { + mutex_unlock(&driver->hdlc_recovery_mutex); return; - - if (!partial_pkt->processing) + } + partial_pkt = &driver->incoming_pkt; + if (!partial_pkt->processing) { + mutex_unlock(&driver->hdlc_recovery_mutex); goto start; + } if (partial_pkt->remaining > len) { if ((partial_pkt->read_len + len) > partial_pkt->capacity) { pr_err("diag: Invalid length %d, %d received in %s\n", partial_pkt->read_len, len, __func__); + mutex_unlock(&driver->hdlc_recovery_mutex); goto end; } memcpy(partial_pkt->data + partial_pkt->read_len, buf, len); @@ -1388,6 +1400,7 @@ void diag_process_non_hdlc_pkt(unsigned char *buf, int len, pr_err("diag: Invalid length during partial read %d, %d received in %s\n", partial_pkt->read_len, partial_pkt->remaining, __func__); + mutex_unlock(&driver->hdlc_recovery_mutex); goto end; } memcpy(partial_pkt->data + partial_pkt->read_len, buf, @@ -1401,20 +1414,27 @@ void diag_process_non_hdlc_pkt(unsigned char *buf, int len, if (partial_pkt->remaining == 0) { actual_pkt = (struct diag_pkt_frame_t *)(partial_pkt->data); data_ptr = partial_pkt->data + header_len; - if (*(uint8_t *)(data_ptr + actual_pkt->length) != CONTROL_CHAR) + if (*(uint8_t *)(data_ptr + actual_pkt->length) != + CONTROL_CHAR) { + mutex_unlock(&driver->hdlc_recovery_mutex); diag_hdlc_start_recovery(buf, len, info); + mutex_lock(&driver->hdlc_recovery_mutex); + } err = diag_process_apps_pkt(data_ptr, actual_pkt->length, info); if (err) { pr_err("diag: In %s, unable to process incoming data packet, err: %d\n", __func__, err); + mutex_unlock(&driver->hdlc_recovery_mutex); goto end; } partial_pkt->read_len = 0; partial_pkt->total_len = 0; partial_pkt->processing = 0; + mutex_unlock(&driver->hdlc_recovery_mutex); goto start; } + mutex_unlock(&driver->hdlc_recovery_mutex); goto end; start: @@ -1427,14 +1447,14 @@ void diag_process_non_hdlc_pkt(unsigned char *buf, int len, diag_send_error_rsp(buf, len); goto end; } - + mutex_lock(&driver->hdlc_recovery_mutex); if (pkt_len + header_len > partial_pkt->capacity) { pr_err("diag: In %s, incoming data is too large for the request buffer %d\n", __func__, pkt_len); + mutex_unlock(&driver->hdlc_recovery_mutex); diag_hdlc_start_recovery(buf, len, info); break; } - if ((pkt_len + header_len) > (len - read_bytes)) { partial_pkt->read_len = len - read_bytes; partial_pkt->total_len = pkt_len + header_len; @@ -1442,19 +1462,27 @@ void diag_process_non_hdlc_pkt(unsigned char *buf, int len, partial_pkt->read_len; partial_pkt->processing = 1; memcpy(partial_pkt->data, buf, partial_pkt->read_len); + mutex_unlock(&driver->hdlc_recovery_mutex); break; } data_ptr = buf + header_len; - if (*(uint8_t *)(data_ptr + actual_pkt->length) != CONTROL_CHAR) + if (*(uint8_t *)(data_ptr + actual_pkt->length) != + CONTROL_CHAR) { + mutex_unlock(&driver->hdlc_recovery_mutex); diag_hdlc_start_recovery(buf, len, info); + mutex_lock(&driver->hdlc_recovery_mutex); + } else hdlc_reset = 0; err = diag_process_apps_pkt(data_ptr, actual_pkt->length, info); - if (err) + if (err) { + mutex_unlock(&driver->hdlc_recovery_mutex); break; + } read_bytes += header_len + pkt_len + 1; buf += header_len + pkt_len + 1; /* advance to next pkt */ + mutex_unlock(&driver->hdlc_recovery_mutex); } end: return; diff --git a/drivers/char/diag/diagfwd_cntl.c b/drivers/char/diag/diagfwd_cntl.c index 594d3b1bf3b58..410790e116915 100644 --- a/drivers/char/diag/diagfwd_cntl.c +++ b/drivers/char/diag/diagfwd_cntl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -508,6 +508,7 @@ static void process_ssid_range_report(uint8_t *buf, uint32_t len, /* Don't account for pkt_id and length */ read_len += header_len - (2 * sizeof(uint32_t)); + mutex_lock(&driver->msg_mask_lock); driver->max_ssid_count[peripheral] = header->count; for (i = 0; i < header->count && read_len < len; i++) { ssid_range = (struct diag_ssid_range_t *)ptr; @@ -551,6 +552,7 @@ static void process_ssid_range_report(uint8_t *buf, uint32_t len, } driver->msg_mask_tbl_count += 1; } + mutex_unlock(&driver->msg_mask_lock); } static void diag_build_time_mask_update(uint8_t *buf, @@ -575,11 +577,11 @@ static void diag_build_time_mask_update(uint8_t *buf, __func__, range->ssid_first, range->ssid_last); return; } - + mutex_lock(&driver->msg_mask_lock); build_mask = (struct diag_msg_mask_t *)(driver->build_time_mask->ptr); num_items = range->ssid_last - range->ssid_first + 1; - for (i = 0; i < driver->msg_mask_tbl_count; i++, build_mask++) { + for (i = 0; i < driver->bt_msg_mask_tbl_count; i++, build_mask++) { if (build_mask->ssid_first != range->ssid_first) continue; found = 1; @@ -598,7 +600,7 @@ static void diag_build_time_mask_update(uint8_t *buf, if (found) goto end; - new_size = (driver->msg_mask_tbl_count + 1) * + new_size = (driver->bt_msg_mask_tbl_count + 1) * sizeof(struct diag_msg_mask_t); temp = krealloc(driver->build_time_mask->ptr, new_size, GFP_KERNEL); if (!temp) { @@ -613,8 +615,10 @@ static void diag_build_time_mask_update(uint8_t *buf, __func__, err); goto end; } - driver->msg_mask_tbl_count += 1; + driver->bt_msg_mask_tbl_count += 1; end: + mutex_unlock(&driver->msg_mask_lock); + return; } diff --git a/drivers/char/diag/diagfwd_peripheral.c b/drivers/char/diag/diagfwd_peripheral.c index 2ef7319cc448c..f353ad18f1111 100644 --- a/drivers/char/diag/diagfwd_peripheral.c +++ b/drivers/char/diag/diagfwd_peripheral.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -640,13 +640,12 @@ void diagfwd_close_transport(uint8_t transport, uint8_t peripheral) break; default: return; - } + mutex_lock(&driver->diagfwd_channel_mutex[peripheral]); fwd_info = &early_init_info[transport][peripheral]; if (fwd_info->p_ops && fwd_info->p_ops->close) fwd_info->p_ops->close(fwd_info->ctxt); - mutex_lock(&driver->diagfwd_channel_mutex); fwd_info = &early_init_info[transport_open][peripheral]; dest_info = &peripheral_info[TYPE_CNTL][peripheral]; dest_info->inited = 1; @@ -665,7 +664,7 @@ void diagfwd_close_transport(uint8_t transport, uint8_t peripheral) diagfwd_late_open(dest_info); diagfwd_cntl_open(dest_info); init_fn(peripheral); - mutex_unlock(&driver->diagfwd_channel_mutex); + mutex_unlock(&driver->diagfwd_channel_mutex[peripheral]); diagfwd_queue_read(&peripheral_info[TYPE_DATA][peripheral]); diagfwd_queue_read(&peripheral_info[TYPE_CMD][peripheral]); } @@ -909,8 +908,6 @@ void diagfwd_channel_read(struct diagfwd_info *fwd_info) } if (fwd_info->buf_1 && !atomic_read(&fwd_info->buf_1->in_busy)) { - temp_buf = fwd_info->buf_1; - atomic_set(&temp_buf->in_busy, 1); if (driver->feature[fwd_info->peripheral].encode_hdlc && (fwd_info->type == TYPE_DATA || fwd_info->type == TYPE_CMD)) { @@ -920,9 +917,11 @@ void diagfwd_channel_read(struct diagfwd_info *fwd_info) read_buf = fwd_info->buf_1->data; read_len = fwd_info->buf_1->len; } + if (read_buf) { + temp_buf = fwd_info->buf_1; + atomic_set(&temp_buf->in_busy, 1); + } } else if (fwd_info->buf_2 && !atomic_read(&fwd_info->buf_2->in_busy)) { - temp_buf = fwd_info->buf_2; - atomic_set(&temp_buf->in_busy, 1); if (driver->feature[fwd_info->peripheral].encode_hdlc && (fwd_info->type == TYPE_DATA || fwd_info->type == TYPE_CMD)) { @@ -932,6 +931,10 @@ void diagfwd_channel_read(struct diagfwd_info *fwd_info) read_buf = fwd_info->buf_2->data; read_len = fwd_info->buf_2->len; } + if (read_buf) { + temp_buf = fwd_info->buf_2; + atomic_set(&temp_buf->in_busy, 1); + } } else { pr_debug("diag: In %s, both buffers are empty for p: %d, t: %d\n", __func__, fwd_info->peripheral, fwd_info->type); diff --git a/drivers/char/diag/diagfwd_smd.c b/drivers/char/diag/diagfwd_smd.c index 3ee21101e2f22..0654e7eedc5eb 100644 --- a/drivers/char/diag/diagfwd_smd.c +++ b/drivers/char/diag/diagfwd_smd.c @@ -740,14 +740,13 @@ static int diag_smd_read(void *ctxt, unsigned char *buf, int buf_len) } /* - * In this case don't reset the buffers as there is no need to further - * read over peripherals. Also release the wake source hold earlier. + * Reset the buffers. Also release the wake source hold earlier. */ if (atomic_read(&smd_info->diag_state) == 0) { DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s closing read thread. diag state is closed\n", smd_info->name); - diag_ws_release(); + diagfwd_channel_read_done(smd_info->fwd_ctxt, buf, 0); return 0; } diff --git a/drivers/char/diag/diagfwd_socket.c b/drivers/char/diag/diagfwd_socket.c index 8a53b02b06702..93553d1e0882d 100644 --- a/drivers/char/diag/diagfwd_socket.c +++ b/drivers/char/diag/diagfwd_socket.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -925,9 +925,9 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len) (info->data_ready > 0) || (!info->hdl) || (atomic_read(&info->diag_state) == 0)); if (err) { - mutex_lock(&driver->diagfwd_channel_mutex); + mutex_lock(&driver->diagfwd_channel_mutex[info->peripheral]); diagfwd_channel_read_done(info->fwd_ctxt, buf, 0); - mutex_unlock(&driver->diagfwd_channel_mutex); + mutex_unlock(&driver->diagfwd_channel_mutex[info->peripheral]); return -ERESTARTSYS; } @@ -939,9 +939,9 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len) DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s closing read thread. diag state is closed\n", info->name); - mutex_lock(&driver->diagfwd_channel_mutex); + mutex_lock(&driver->diagfwd_channel_mutex[info->peripheral]); diagfwd_channel_read_done(info->fwd_ctxt, buf, 0); - mutex_unlock(&driver->diagfwd_channel_mutex); + mutex_unlock(&driver->diagfwd_channel_mutex[info->peripheral]); return 0; } @@ -1008,10 +1008,10 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len) if (total_recd > 0) { DIAG_LOG(DIAG_DEBUG_PERIPHERALS, "%s read total bytes: %d\n", info->name, total_recd); - mutex_lock(&driver->diagfwd_channel_mutex); + mutex_lock(&driver->diagfwd_channel_mutex[info->peripheral]); err = diagfwd_channel_read_done(info->fwd_ctxt, buf, total_recd); - mutex_unlock(&driver->diagfwd_channel_mutex); + mutex_unlock(&driver->diagfwd_channel_mutex[info->peripheral]); if (err) goto fail; } else { @@ -1024,9 +1024,9 @@ static int diag_socket_read(void *ctxt, unsigned char *buf, int buf_len) return 0; fail: - mutex_lock(&driver->diagfwd_channel_mutex); + mutex_lock(&driver->diagfwd_channel_mutex[info->peripheral]); diagfwd_channel_read_done(info->fwd_ctxt, buf, 0); - mutex_unlock(&driver->diagfwd_channel_mutex); + mutex_unlock(&driver->diagfwd_channel_mutex[info->peripheral]); return -EIO; } diff --git a/drivers/clk/msm/clock-alpha-pll.c b/drivers/clk/msm/clock-alpha-pll.c index f7ba7118a60ae..d86ac1175c7bc 100644 --- a/drivers/clk/msm/clock-alpha-pll.c +++ b/drivers/clk/msm/clock-alpha-pll.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-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 @@ -805,8 +805,15 @@ static enum handoff alpha_pll_handoff(struct clk *c) update_vco_tbl(pll); if (!is_locked(pll)) { - if (c->rate && alpha_pll_set_rate(c, c->rate)) - WARN(1, "%s: Failed to configure rate\n", c->dbg_name); + if (pll->slew) { + if (c->rate && dyna_alpha_pll_set_rate(c, c->rate)) + WARN(1, "%s: Failed to configure rate\n", + c->dbg_name); + } else { + if (c->rate && alpha_pll_set_rate(c, c->rate)) + WARN(1, "%s: Failed to configure rate\n", + c->dbg_name); + } __init_alpha_pll(c); return HANDOFF_DISABLED_CLK; } else if (pll->fsm_en_mask && !is_fsm_mode(MODE_REG(pll))) { diff --git a/drivers/clk/msm/clock-cpu-8939.c b/drivers/clk/msm/clock-cpu-8939.c index 66ebeb5ba8cb2..bdafa0cb9f388 100644 --- a/drivers/clk/msm/clock-cpu-8939.c +++ b/drivers/clk/msm/clock-cpu-8939.c @@ -700,6 +700,45 @@ static struct notifier_block clock_8939_pm_notifier_single_cluster = { .notifier_call = clock_8939_pm_event_single_cluster, }; +/** + * clock_panic_callback() - panic notification callback function. + * This function is invoked when a kernel panic occurs. + * @nfb: Notifier block pointer + * @event: Value passed unmodified to notifier function + * @data: Pointer passed unmodified to notifier function + * + * Return: NOTIFY_OK + */ +static int clock_panic_callback(struct notifier_block *nfb, + unsigned long event, void *data) +{ + bool single_cluster = 0; + unsigned long rate; + struct device_node *ofnode = of_find_compatible_node(NULL, NULL, + "qcom,cpu-clock-8939"); + if (!ofnode) + ofnode = of_find_compatible_node(NULL, NULL, + "qcom,cpu-clock-8917"); + if (ofnode) + single_cluster = of_property_read_bool(ofnode, + "qcom,num-cluster"); + + rate = (a53_bc_clk.c.count) ? a53_bc_clk.c.rate : 0; + pr_err("%s frequency: %10lu Hz\n", a53_bc_clk.c.dbg_name, rate); + + if (!single_cluster) { + rate = (a53_lc_clk.c.count) ? a53_lc_clk.c.rate : 0; + pr_err("%s frequency: %10lu Hz\n", a53_lc_clk.c.dbg_name, rate); + } + + return NOTIFY_OK; +} + +static struct notifier_block clock_panic_notifier = { + .notifier_call = clock_panic_callback, + .priority = 1, +}; + static int clock_a53_probe(struct platform_device *pdev) { int speed_bin, version, rc, cpu, mux_id, rate; @@ -798,6 +837,9 @@ static int clock_a53_probe(struct platform_device *pdev) populate_opp_table(pdev, single_cluster); + atomic_notifier_chain_register(&panic_notifier_list, + &clock_panic_notifier); + return 0; } diff --git a/drivers/clk/msm/clock-cpu-8953.c b/drivers/clk/msm/clock-cpu-8953.c index dc495721b9f00..83cd882971d19 100644 --- a/drivers/clk/msm/clock-cpu-8953.c +++ b/drivers/clk/msm/clock-cpu-8953.c @@ -753,6 +753,34 @@ static int cpu_parse_devicetree(struct platform_device *pdev) return 0; } +/** + * clock_panic_callback() - panic notification callback function. + * This function is invoked when a kernel panic occurs. + * @nfb: Notifier block pointer + * @event: Value passed unmodified to notifier function + * @data: Pointer passed unmodified to notifier function + * + * Return: NOTIFY_OK + */ +static int clock_panic_callback(struct notifier_block *nfb, + unsigned long event, void *data) +{ + unsigned long rate; + + rate = (a53_perf_clk.c.count) ? a53_perf_clk.c.rate : 0; + pr_err("%s frequency: %10lu Hz\n", a53_perf_clk.c.dbg_name, rate); + + rate = (a53_pwr_clk.c.count) ? a53_pwr_clk.c.rate : 0; + pr_err("%s frequency: %10lu Hz\n", a53_pwr_clk.c.dbg_name, rate); + + return NOTIFY_OK; +} + +static struct notifier_block clock_panic_notifier = { + .notifier_call = clock_panic_callback, + .priority = 1, +}; + static int clock_cpu_probe(struct platform_device *pdev) { int speed_bin, version, rc, cpu, mux_id; @@ -875,6 +903,9 @@ static int clock_cpu_probe(struct platform_device *pdev) a53_perf_clk.hw_low_power_ctrl = true; } + atomic_notifier_chain_register(&panic_notifier_list, + &clock_panic_notifier); + return 0; } diff --git a/drivers/clk/msm/clock-debug.c b/drivers/clk/msm/clock-debug.c index d0ff821eb2039..bbcfed53fb1f5 100644 --- a/drivers/clk/msm/clock-debug.c +++ b/drivers/clk/msm/clock-debug.c @@ -1,6 +1,7 @@ /* * Copyright (C) 2007 Google, Inc. * Copyright (c) 2007-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -34,7 +35,7 @@ static LIST_HEAD(clk_list); static DEFINE_MUTEX(clk_list_lock); static struct dentry *debugfs_base; -static u32 debug_suspend; +static u32 debug_suspend = 1; static int clock_debug_rate_set(void *data, u64 val) { diff --git a/drivers/clk/msm/clock-gcc-8952.c b/drivers/clk/msm/clock-gcc-8952.c index 1098946c984e8..9d149ddd58585 100644 --- a/drivers/clk/msm/clock-gcc-8952.c +++ b/drivers/clk/msm/clock-gcc-8952.c @@ -91,6 +91,9 @@ static DEFINE_CLK_VOTER(pnoc_usb_clk, &pnoc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(snoc_usb_clk, &snoc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(bimc_usb_clk, &bimc_clk.c, LONG_MAX); +static DEFINE_CLK_VOTER(snoc_wcnss_a_clk, &snoc_a_clk.c, LONG_MAX); +static DEFINE_CLK_VOTER(bimc_wcnss_a_clk, &bimc_a_clk.c, LONG_MAX); + /* Branch Voter clocks */ static DEFINE_CLK_BRANCH_VOTER(xo_gcc, &xo_clk_src.c); static DEFINE_CLK_BRANCH_VOTER(xo_otg_clk, &xo_clk_src.c); @@ -766,6 +769,27 @@ static struct clk_freq_tbl ftbl_gcc_oxili_gfx3d_clk_8937_475MHz[] = { F_END }; +static struct clk_freq_tbl ftbl_gcc_oxili_gfx3d_clk_8940_500MHz[] = { + F_SLEW( 19200000, FIXED_CLK_SRC, xo, 1, 0, 0), + F_SLEW( 50000000, FIXED_CLK_SRC, gpll0, 16, 0, 0), + F_SLEW( 80000000, FIXED_CLK_SRC, gpll0, 10, 0, 0), + F_SLEW( 100000000, FIXED_CLK_SRC, gpll0, 8, 0, 0), + F_SLEW( 160000000, FIXED_CLK_SRC, gpll0, 5, 0, 0), + F_SLEW( 200000000, FIXED_CLK_SRC, gpll0, 4, 0, 0), + F_SLEW( 216000000, FIXED_CLK_SRC, gpll6_aux, 5, 0, 0), + F_SLEW( 228570000, FIXED_CLK_SRC, gpll0, 3.5, 0, 0), + F_SLEW( 240000000, FIXED_CLK_SRC, gpll6_aux, 4.5, 0, 0), + F_SLEW( 266670000, FIXED_CLK_SRC, gpll0, 3, 0, 0), + F_SLEW( 300000000, 600000000, gpll3, 1, 0, 0), + F_SLEW( 320000000, FIXED_CLK_SRC, gpll0, 2.5, 0, 0), + F_SLEW( 375000000, 750000000, gpll3, 1, 0, 0), + F_SLEW( 400000000, FIXED_CLK_SRC, gpll0, 2, 0, 0), + F_SLEW( 450000000, 900000000, gpll3, 1, 0, 0), + F_SLEW( 475000000, 950000000, gpll3, 1, 0, 0), + F_SLEW( 500000000, 1000000000, gpll3, 1, 0, 0), + F_END +}; + static struct clk_freq_tbl ftbl_gcc_oxili_gfx3d_clk_8917[] = { F_SLEW( 19200000, FIXED_CLK_SRC, xo, 1, 0, 0), F_SLEW( 50000000, FIXED_CLK_SRC, gpll0, 16, 0, 0), @@ -1275,6 +1299,7 @@ static struct rcg_clk jpeg0_clk_src = { }; static struct clk_freq_tbl ftbl_gcc_camss_mclk0_2_clk[] = { + F( 19200000, xo, 1, 0, 0), F( 24000000, gpll6, 1, 1, 45), F( 66670000, gpll0, 12, 0, 0), F_END @@ -3761,6 +3786,9 @@ static struct clk_lookup msm_clocks_lookup_common[] = { CLK_LIST(snoc_usb_clk), CLK_LIST(bimc_usb_clk), + CLK_LIST(snoc_wcnss_a_clk), + CLK_LIST(bimc_wcnss_a_clk), + CLK_LIST(qdss_clk), CLK_LIST(qdss_a_clk), @@ -4014,6 +4042,22 @@ static struct clk_lookup msm_clocks_lookup_8917[] = { CLK_LIST(gcc_gtcu_ahb_clk), }; +static struct clk_lookup msm_clocks_lookup_8920[] = { + CLK_LIST(gpll0_clk_src_8937), + CLK_LIST(gpll0_ao_clk_src_8937), + CLK_LIST(gpll0_sleep_clk_src), + CLK_LIST(bimc_gpu_clk), + CLK_LIST(bimc_gpu_a_clk), + CLK_LIST(gcc_dcc_clk), + CLK_LIST(gcc_qdss_dap_clk), + CLK_LIST(gcc_gfx_tcu_clk), + CLK_LIST(gcc_gfx_tbu_clk), + CLK_LIST(gcc_gtcu_ahb_clk), + CLK_LIST(ipa_clk), + CLK_LIST(ipa_a_clk), + CLK_LIST(gcc_ipa_tbu_clk), +}; + static struct clk_lookup msm_clocks_lookup_8940[] = { CLK_LIST(gpll0_clk_src_8937), CLK_LIST(gpll0_ao_clk_src_8937), @@ -4259,6 +4303,7 @@ static int msm_gcc_probe(struct platform_device *pdev) bool compat_bin = false; bool compat_bin2 = false; bool compat_bin3 = false; + bool compat_bin4 = false; compat_bin = of_device_is_compatible(pdev->dev.of_node, "qcom,gcc-8937"); @@ -4269,11 +4314,14 @@ static int msm_gcc_probe(struct platform_device *pdev) compat_bin3 = of_device_is_compatible(pdev->dev.of_node, "qcom,gcc-8940"); + compat_bin4 = of_device_is_compatible(pdev->dev.of_node, + "qcom,gcc-8920"); + ret = vote_bimc(&bimc_clk, INT_MAX); if (ret < 0) return ret; - if (compat_bin2) + if (compat_bin2 || compat_bin4) nbases = APCS_C0_PLL_BASE; ret = get_mmio_addr(pdev, nbases); @@ -4301,7 +4349,7 @@ static int msm_gcc_probe(struct platform_device *pdev) return PTR_ERR(vdd_dig.regulator[0]); } - if (!compat_bin2) { + if (!compat_bin2 && !compat_bin4) { vdd_sr2_pll.regulator[0] = devm_regulator_get(&pdev->dev, "vdd_sr2_pll"); if (IS_ERR(vdd_sr2_pll.regulator[0])) { @@ -4355,11 +4403,19 @@ static int msm_gcc_probe(struct platform_device *pdev) override_for_8937(speed_bin); if (compat_bin3) { - gfx3d_clk_src.freq_tbl = + if (speed_bin) { + gfx3d_clk_src.freq_tbl = + ftbl_gcc_oxili_gfx3d_clk_8940_500MHz; + gfx3d_clk_src.c.fmax[VDD_DIG_SUPER_TUR] = + 500000000; + } else { + gfx3d_clk_src.freq_tbl = ftbl_gcc_oxili_gfx3d_clk_8937_475MHz; - gfx3d_clk_src.c.fmax[VDD_DIG_SUPER_TUR] = 475000000; + gfx3d_clk_src.c.fmax[VDD_DIG_SUPER_TUR] = + 475000000; + } } - } else if (compat_bin2) { + } else if (compat_bin2 || compat_bin4) { gpll0_clk_src.c.parent = &gpll0_clk_src_8937.c; gpll0_ao_clk_src.c.parent = &gpll0_ao_clk_src_8937.c; vdd_dig.num_levels = VDD_DIG_NUM_8917; @@ -4391,6 +4447,10 @@ static int msm_gcc_probe(struct platform_device *pdev) ret = of_msm_clock_register(pdev->dev.of_node, msm_clocks_lookup_8940, ARRAY_SIZE(msm_clocks_lookup_8940)); + else if (compat_bin4) + ret = of_msm_clock_register(pdev->dev.of_node, + msm_clocks_lookup_8920, + ARRAY_SIZE(msm_clocks_lookup_8920)); else ret = of_msm_clock_register(pdev->dev.of_node, msm_clocks_lookup_8952, @@ -4442,6 +4502,7 @@ static struct of_device_id msm_clock_gcc_match_table[] = { { .compatible = "qcom,gcc-8937" }, { .compatible = "qcom,gcc-8917" }, { .compatible = "qcom,gcc-8940" }, + { .compatible = "qcom,gcc-8920" }, {} }; @@ -4557,6 +4618,7 @@ static int msm_clock_debug_probe(struct platform_device *pdev) struct resource *res; bool compat_bin = false, compat_bin2 = false; bool compat_bin3 = false; + bool compat_bin4 = false; compat_bin = of_device_is_compatible(pdev->dev.of_node, "qcom,cc-debug-8937"); @@ -4567,6 +4629,9 @@ static int msm_clock_debug_probe(struct platform_device *pdev) compat_bin3 = of_device_is_compatible(pdev->dev.of_node, "qcom,cc-debug-8940"); + compat_bin4 = of_device_is_compatible(pdev->dev.of_node, + "qcom,cc-debug-8920"); + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "meas"); if (!res) { dev_err(&pdev->dev, "GLB clock diag base not defined.\n"); @@ -4585,7 +4650,7 @@ static int msm_clock_debug_probe(struct platform_device *pdev) if (compat_bin2) gcc_debug_mux_8937.post_div = 0x3; - if (!compat_bin && !compat_bin2 && !compat_bin3) + if (!compat_bin && !compat_bin2 && !compat_bin3 && !compat_bin4) ret = of_msm_clock_register(pdev->dev.of_node, msm_clocks_measure, ARRAY_SIZE(msm_clocks_measure)); else @@ -4606,6 +4671,7 @@ static struct of_device_id msm_clock_debug_match_table[] = { { .compatible = "qcom,cc-debug-8937" }, { .compatible = "qcom,cc-debug-8917" }, { .compatible = "qcom,cc-debug-8940" }, + { .compatible = "qcom,cc-debug-8920" }, {} }; @@ -4729,6 +4795,7 @@ static struct of_device_id msm_clock_mdss_match_table[] = { { .compatible = "qcom,gcc-mdss-8937" }, { .compatible = "qcom,gcc-mdss-8917" }, { .compatible = "qcom,gcc-mdss-8940" }, + { .compatible = "qcom,gcc-mdss-8920" }, {} }; diff --git a/drivers/clk/msm/clock-gcc-8953.c b/drivers/clk/msm/clock-gcc-8953.c index 1d420d1bb7661..d96fc42282be3 100644 --- a/drivers/clk/msm/clock-gcc-8953.c +++ b/drivers/clk/msm/clock-gcc-8953.c @@ -66,6 +66,7 @@ static DEFINE_CLK_VOTER(bimc_msmbus_clk, &bimc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(bimc_msmbus_a_clk, &bimc_a_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(bimc_usb_clk, &bimc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(bimc_usb_a_clk, &bimc_a_clk.c, LONG_MAX); +static DEFINE_CLK_VOTER(bimc_wcnss_a_clk, &bimc_a_clk.c, LONG_MAX); /* PCNOC Voter */ static DEFINE_CLK_VOTER(pcnoc_keepalive_a_clk, &pcnoc_a_clk.c, LONG_MAX); @@ -79,6 +80,7 @@ static DEFINE_CLK_VOTER(snoc_msmbus_clk, &snoc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(snoc_msmbus_a_clk, &snoc_a_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(snoc_usb_clk, &snoc_clk.c, LONG_MAX); static DEFINE_CLK_VOTER(snoc_usb_a_clk, &snoc_a_clk.c, LONG_MAX); +static DEFINE_CLK_VOTER(snoc_wcnss_a_clk, &snoc_a_clk.c, LONG_MAX); /* SYSMMNOC Voter */ static DEFINE_CLK_VOTER(sysmmnoc_msmbus_clk, &sysmmnoc_clk.c, LONG_MAX); @@ -389,6 +391,25 @@ static struct clk_freq_tbl ftbl_gfx3d_clk_src[] = { F_END }; +static struct clk_freq_tbl ftbl_gfx3d_clk_src_sdm450[] = { + F_MM( 19200000, FIXED_CLK_SRC, xo, 1, 0, 0), + F_MM( 50000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 8, 0, 0), + F_MM( 80000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 5, 0, 0), + F_MM( 100000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 4, 0, 0), + F_MM( 133330000, FIXED_CLK_SRC, gpll0_main_div2_mm, 3, 0, 0), + F_MM( 160000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 2.5, 0, 0), + F_MM( 200000000, FIXED_CLK_SRC, gpll0_main_div2_mm, 2, 0, 0), + F_MM( 216000000, FIXED_CLK_SRC, gpll6_main_div2_gfx, 2.5, 0, 0), + F_MM( 266670000, FIXED_CLK_SRC, gpll0, 3, 0, 0), + F_MM( 320000000, FIXED_CLK_SRC, gpll0, 2.5, 0, 0), + F_MM( 400000000, FIXED_CLK_SRC, gpll0, 2, 0, 0), + F_MM( 460800000, FIXED_CLK_SRC, gpll4_out_aux, 2.5, 0, 0), + F_MM( 510000000, 1020000000, gpll3, 1, 0, 0), + F_MM( 560000000, 1120000000, gpll3, 1, 0, 0), + F_MM( 600000000, 1200000000, gpll3, 1, 0, 0), + F_END +}; + static struct rcg_clk gfx3d_clk_src = { .cmd_rcgr_reg = GFX3D_CMD_RCGR, .set_rate = set_rate_hid, @@ -3438,6 +3459,7 @@ static struct clk_lookup msm_clocks_lookup[] = { CLK_LIST(bimc_msmbus_a_clk), CLK_LIST(bimc_usb_clk), CLK_LIST(bimc_usb_a_clk), + CLK_LIST(bimc_wcnss_a_clk), CLK_LIST(pcnoc_keepalive_a_clk), CLK_LIST(pcnoc_msmbus_clk), CLK_LIST(pcnoc_msmbus_a_clk), @@ -3447,6 +3469,7 @@ static struct clk_lookup msm_clocks_lookup[] = { CLK_LIST(snoc_msmbus_a_clk), CLK_LIST(snoc_usb_clk), CLK_LIST(snoc_usb_a_clk), + CLK_LIST(snoc_wcnss_a_clk), CLK_LIST(sysmmnoc_msmbus_clk), CLK_LIST(sysmmnoc_msmbus_a_clk), CLK_LIST(xo_dwc3_clk), @@ -3980,6 +4003,7 @@ static int msm_gcc_gfx_probe(struct platform_device *pdev) struct resource *res; int ret; u32 regval; + bool compat_bin = false; res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cc_base"); if (!res) { @@ -4001,6 +4025,11 @@ static int msm_gcc_gfx_probe(struct platform_device *pdev) return PTR_ERR(vdd_gfx.regulator[0]); } + compat_bin = of_device_is_compatible(pdev->dev.of_node, + "qcom,gcc-gfx-sdm450"); + if (compat_bin) + gfx3d_clk_src.freq_tbl = ftbl_gfx3d_clk_src_sdm450; + ret = of_get_fmax_vdd_class(pdev, &gcc_oxili_gfx3d_clk.c, "qcom,gfxfreq-corner"); if (ret) { @@ -4023,6 +4052,7 @@ static int msm_gcc_gfx_probe(struct platform_device *pdev) static struct of_device_id msm_clock_gfx_match_table[] = { { .compatible = "qcom,gcc-gfx-8953" }, + { .compatible = "qcom,gcc-gfx-sdm450" }, {} }; diff --git a/drivers/clk/msm/mdss/mdss-dsi-pll-8996-util.c b/drivers/clk/msm/mdss/mdss-dsi-pll-8996-util.c index 9e26647e7c081..7a50282159509 100644 --- a/drivers/clk/msm/mdss/mdss-dsi-pll-8996-util.c +++ b/drivers/clk/msm/mdss/mdss-dsi-pll-8996-util.c @@ -821,6 +821,10 @@ static void pll_db_commit_8996(struct mdss_pll_resources *pll, MDSS_PLL_REG_W(pll_base, DSIPHY_CMN_CTRL_1, 0); wmb(); /* make sure register committed */ + MDSS_PLL_REG_W(pll_base, DSIPHY_PLL_PLL_VCO_TUNE, 0); + MDSS_PLL_REG_W(pll_base, DSIPHY_PLL_KVCO_CODE, 0); + wmb(); /* make sure register committed */ + data = pdb->in.dsiclk_sel; /* set dsiclk_sel = 1 */ MDSS_PLL_REG_W(pll_base, DSIPHY_CMN_CLK_CFG1, data); diff --git a/drivers/clk/msm/mdss/mdss-pll.h b/drivers/clk/msm/mdss/mdss-pll.h index 50c1fcf5b9fe5..35d8c74d543fc 100644 --- a/drivers/clk/msm/mdss/mdss-pll.h +++ b/drivers/clk/msm/mdss/mdss-pll.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -70,6 +70,7 @@ struct dfps_info { struct dfps_panel_info panel_dfps; struct dfps_codes_info codes_dfps[DFPS_MAX_NUM_OF_FRAME_RATES]; void *dfps_fb_base; + uint32_t chip_serial; }; struct mdss_pll_resources { diff --git a/drivers/coresight/coresight-csr.c b/drivers/coresight/coresight-csr.c index 390f8791386d5..3f8f8771b0bf5 100644 --- a/drivers/coresight/coresight-csr.c +++ b/drivers/coresight/coresight-csr.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2013, 2015 The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2013, 2015-2016 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 @@ -190,8 +190,6 @@ static int csr_probe(struct platform_device *pdev) drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; - /* Store the driver data pointer for use in exported functions */ - csrdrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); @@ -220,6 +218,9 @@ static int csr_probe(struct platform_device *pdev) if (IS_ERR(drvdata->csdev)) return PTR_ERR(drvdata->csdev); + /* Store the driver data pointer for use in exported functions */ + csrdrvdata = drvdata; + dev_info(dev, "CSR initialized\n"); return 0; } diff --git a/drivers/coresight/coresight-etmv4.c b/drivers/coresight/coresight-etmv4.c index 2a6c793083148..8cfe242e665b0 100644 --- a/drivers/coresight/coresight-etmv4.c +++ b/drivers/coresight/coresight-etmv4.c @@ -3702,8 +3702,10 @@ static int etm_probe(struct platform_device *pdev) unregister_hotcpu_notifier(&etm_cpu_notifier); unregister_hotcpu_notifier(&etm_cpu_dying_notifier); } + etmdrvdata[cpu] = NULL; err0: wakeup_source_trash(&drvdata->ws); + platform_set_drvdata(pdev, NULL); return ret; } diff --git a/drivers/coresight/coresight-fuse.c b/drivers/coresight/coresight-fuse.c index 70e6136a55c53..f146dfb2b0fba 100644 --- a/drivers/coresight/coresight-fuse.c +++ b/drivers/coresight/coresight-fuse.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2016, 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 @@ -303,8 +303,6 @@ static int fuse_probe(struct platform_device *pdev) drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; - /* Store the driver data pointer for use in exported functions */ - fusedrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); @@ -368,6 +366,9 @@ static int fuse_probe(struct platform_device *pdev) if (IS_ERR(drvdata->csdev)) return PTR_ERR(drvdata->csdev); + /* Store the driver data pointer for use in exported functions */ + fusedrvdata = drvdata; + dev_info(dev, "Fuse initialized\n"); return 0; } diff --git a/drivers/coresight/coresight-tmc.c b/drivers/coresight/coresight-tmc.c index f94a5cf98d8b5..c9844d2fb2813 100644 --- a/drivers/coresight/coresight-tmc.c +++ b/drivers/coresight/coresight-tmc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -849,6 +849,14 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) return ret; mutex_lock(&drvdata->usb_lock); + spin_lock_irqsave(&drvdata->spinlock, flags); + if (drvdata->reading) { + ret = -EBUSY; + spin_unlock_irqrestore(&drvdata->spinlock, flags); + goto err0; + } + spin_unlock_irqrestore(&drvdata->spinlock, flags); + if (drvdata->config_type == TMC_CONFIG_TYPE_ETB) { coresight_cti_map_trigout(drvdata->cti_flush, 1, 0); coresight_cti_map_trigin(drvdata->cti_reset, 2, 0); @@ -895,10 +903,6 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) } spin_lock_irqsave(&drvdata->spinlock, flags); - if (drvdata->reading) { - ret = -EBUSY; - goto err1; - } if (drvdata->config_type == TMC_CONFIG_TYPE_ETB) { __tmc_etb_enable(drvdata); @@ -928,11 +932,6 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) dev_info(drvdata->dev, "TMC enabled\n"); return 0; -err1: - spin_unlock_irqrestore(&drvdata->spinlock, flags); - if (drvdata->config_type == TMC_CONFIG_TYPE_ETR) - if (drvdata->out_mode == TMC_ETR_OUT_MODE_USB) - usb_qdss_close(drvdata->usbch); err0: mutex_unlock(&drvdata->usb_lock); clk_disable_unprepare(drvdata->clk); @@ -1327,6 +1326,7 @@ static int tmc_read_prepare(struct tmc_drvdata *drvdata) unsigned long flags; enum tmc_mode mode; + mutex_lock(&drvdata->usb_lock); spin_lock_irqsave(&drvdata->spinlock, flags); if (!drvdata->sticky_enable) { dev_err(drvdata->dev, "enable tmc once before reading\n"); @@ -1357,11 +1357,13 @@ static int tmc_read_prepare(struct tmc_drvdata *drvdata) out: drvdata->reading = true; spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->usb_lock); dev_info(drvdata->dev, "TMC read start\n"); return 0; err: spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->usb_lock); return ret; } @@ -1543,8 +1545,12 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, { struct tmc_drvdata *drvdata = container_of(file->private_data, struct tmc_drvdata, miscdev); - char *bufp = drvdata->buf + *ppos; - char *end = (char *)(drvdata->vaddr + drvdata->size); + char *bufp, *end; + + mutex_lock(&drvdata->usb_lock); + + bufp = drvdata->buf + *ppos; + end = (char *)(drvdata->vaddr + drvdata->size); if (*ppos + len > drvdata->size) len = drvdata->size - *ppos; @@ -1571,6 +1577,7 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, if (copy_to_user(data, bufp, len)) { dev_dbg(drvdata->dev, "%s: copy_to_user failed\n", __func__); + mutex_unlock(&drvdata->usb_lock); return -EFAULT; } @@ -1578,6 +1585,8 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, out: dev_dbg(drvdata->dev, "%s: %zu bytes copied, %d bytes left\n", __func__, len, (int) (drvdata->size - *ppos)); + + mutex_unlock(&drvdata->usb_lock); return len; } diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 84092ca48dcc7..27ffe70cc0d40 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -1514,8 +1514,10 @@ static int __cpufreq_remove_dev_finish(struct device *dev, list_del(&policy->policy_list); write_unlock_irqrestore(&cpufreq_driver_lock, flags); - if (!cpufreq_suspended) + if (!cpufreq_suspended) { + flush_work(&policy->update); cpufreq_policy_free(policy); + } } else if (has_target()) { ret = __cpufreq_governor(policy, CPUFREQ_GOV_START); if (!ret) diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c index 789a131fec7a5..bdac1d22b5282 100644 --- a/drivers/cpufreq/cpufreq_interactive.c +++ b/drivers/cpufreq/cpufreq_interactive.c @@ -31,6 +31,7 @@ #include #include #include +#include #define CREATE_TRACE_POINTS #include @@ -662,6 +663,14 @@ static void cpufreq_interactive_timer(unsigned long data) ppol->policy->cur, new_freq); ppol->target_freq = new_freq; + + if ((ppol->target_freq != ppol->policy->cur) + && (ppol->target_freq > ppol->policy->max)) { + ktrace_add_cpufreq_event(KTRACE_CPUFREQ_TYPE_MITIGATION, + current->pid, ktime_to_ns(ktime_get()), max_cpu, + ppol->target_freq, ppol->policy->max); + } + spin_unlock_irqrestore(&ppol->target_freq_lock, flags); spin_lock_irqsave(&speedchange_cpumask_lock, flags); cpumask_set_cpu(max_cpu, &speedchange_cpumask); @@ -1796,6 +1805,12 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, case CPUFREQ_GOV_LIMITS: ppol = per_cpu(polinfo, policy->cpu); + if (policy->max < policy->cpuinfo.max_freq) { + ktrace_cpufreq_set_mitigated(current->comm, policy->cpu, policy->related_cpus, policy->max); + } else { + ktrace_cpufreq_set_mitigated(current->comm, policy->cpu, policy->related_cpus, 0); + } + __cpufreq_driver_target(policy, ppol->target_freq, CPUFREQ_RELATION_L); diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c index 25dee6fc0abe6..8e093a5d48f90 100644 --- a/drivers/cpufreq/cpufreq_stats.c +++ b/drivers/cpufreq/cpufreq_stats.c @@ -602,6 +602,9 @@ static int cpufreq_stat_notifier_policy(struct notifier_block *nb, if (val == CPUFREQ_UPDATE_POLICY_CPU) { cpufreq_stats_update_policy_cpu(policy); return 0; + } else if (val == CPUFREQ_REMOVE_POLICY) { + __cpufreq_stats_free_table(policy); + return 0; } table = cpufreq_frequency_get_table(cpu); @@ -621,8 +624,6 @@ static int cpufreq_stat_notifier_policy(struct notifier_block *nb, if (val == CPUFREQ_CREATE_POLICY) ret = __cpufreq_stats_create_table(policy, table, count); - else if (val == CPUFREQ_REMOVE_POLICY) - __cpufreq_stats_free_table(policy); return ret; } diff --git a/drivers/cpuidle/lpm-levels-of.c b/drivers/cpuidle/lpm-levels-of.c index 057b00bdd5a2a..adfabeeb3577a 100644 --- a/drivers/cpuidle/lpm-levels-of.c +++ b/drivers/cpuidle/lpm-levels-of.c @@ -720,7 +720,7 @@ static int calculate_residency(struct power_params *base_pwr, residency /= (int32_t)(base_pwr->ss_power - next_pwr->ss_power); if (residency < 0) { - __WARN_printf("%s: Incorrect power attributes for LPM\n", + pr_err("%s: residency < 0 for LPM\n", __func__); return next_pwr->time_overhead_us; } diff --git a/drivers/cpuidle/lpm-levels.c b/drivers/cpuidle/lpm-levels.c index 9015b0bae7a39..7efa1b9482974 100644 --- a/drivers/cpuidle/lpm-levels.c +++ b/drivers/cpuidle/lpm-levels.c @@ -607,7 +607,7 @@ static int cluster_select(struct lpm_cluster *cluster, bool from_idle) best_level = i; - if (sleep_us <= pwr_params->max_residency) + if (from_idle && sleep_us <= pwr_params->max_residency) break; } diff --git a/drivers/crypto/msm/compat_qcedev.c b/drivers/crypto/msm/compat_qcedev.c index c69dc2b86a682..90e5fa804e471 100644 --- a/drivers/crypto/msm/compat_qcedev.c +++ b/drivers/crypto/msm/compat_qcedev.c @@ -1,7 +1,7 @@ /* * QTI CE 32-bit compatibility syscall for 64-bit systems * - * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2015, 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 @@ -97,7 +97,6 @@ static int compat_get_qcedev_vbuf_info( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, &vbuf32->src[i].vaddr); - vbuf->src[i].vaddr = NULL; err |= put_user(vaddr, (compat_uptr_t *)&vbuf->src[i].vaddr); err |= get_user(len, &vbuf32->src[i].len); err |= put_user(len, &vbuf->src[i].len); @@ -105,7 +104,6 @@ static int compat_get_qcedev_vbuf_info( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, &vbuf32->dst[i].vaddr); - vbuf->dst[i].vaddr = NULL; err |= put_user(vaddr, (compat_uptr_t *)&vbuf->dst[i].vaddr); err |= get_user(len, &vbuf32->dst[i].len); err |= put_user(len, &vbuf->dst[i].len); @@ -123,7 +121,6 @@ static int compat_put_qcedev_vbuf_info( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, (compat_uptr_t *)&vbuf->src[i].vaddr); - vbuf32->src[i].vaddr = 0; err |= put_user(vaddr, &vbuf32->src[i].vaddr); err |= get_user(len, &vbuf->src[i].len); err |= put_user(len, &vbuf32->src[i].len); @@ -131,7 +128,6 @@ static int compat_put_qcedev_vbuf_info( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, (compat_uptr_t *)&vbuf->dst[i].vaddr); - vbuf32->dst[i].vaddr = 0; err |= put_user(vaddr, &vbuf32->dst[i].vaddr); err |= get_user(len, &vbuf->dst[i].len); err |= put_user(len, &vbuf32->dst[i].len); @@ -276,7 +272,6 @@ static int compat_get_qcedev_sha_op_req( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, &data32->data[i].vaddr); - data->data[i].vaddr = 0; err |= put_user(vaddr, (compat_uptr_t *)&data->data[i].vaddr); err |= get_user(len, &data32->data[i].len); err |= put_user(len, &data->data[i].len); @@ -295,7 +290,6 @@ static int compat_get_qcedev_sha_op_req( err |= get_user(diglen, &data32->diglen); err |= put_user(diglen, &data->diglen); err |= get_user(authkey, &data32->authkey); - data->authkey = NULL; err |= put_user(authkey, (compat_uptr_t *)&data->authkey); err |= get_user(authklen, &data32->authklen); err |= put_user(authklen, &data->authklen); @@ -322,7 +316,6 @@ static int compat_put_qcedev_sha_op_req( for (i = 0; i < QCEDEV_MAX_BUFFERS; i++) { err |= get_user(vaddr, (compat_uptr_t *)&data->data[i].vaddr); - data32->data[i].vaddr = 0; err |= put_user(vaddr, &data32->data[i].vaddr); err |= get_user(len, &data->data[i].len); err |= put_user(len, &data32->data[i].len); @@ -341,7 +334,6 @@ static int compat_put_qcedev_sha_op_req( err |= get_user(diglen, &data->diglen); err |= put_user(diglen, &data32->diglen); err |= get_user(authkey, (compat_uptr_t *)&data->authkey); - data32->authkey = 0; err |= put_user(authkey, &data32->authkey); err |= get_user(authklen, &data->authklen); err |= put_user(authklen, &data32->authklen); diff --git a/drivers/crypto/msm/ice.c b/drivers/crypto/msm/ice.c index fb7590b6c7a62..233dbeed2af59 100644 --- a/drivers/crypto/msm/ice.c +++ b/drivers/crypto/msm/ice.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -1601,7 +1601,18 @@ static int enable_ice_setup(struct ice_device *ice_dev) out_clocks: qcom_ice_enable_clocks(ice_dev, false); out_reg: - regulator_disable(ice_dev->reg); + if (ice_dev->is_regulator_available) { + if (qcom_ice_get_vreg(ice_dev)) { + pr_err("%s: Could not get regulator\n", __func__); + goto out; + } + ret = regulator_disable(ice_dev->reg); + if (ret) { + pr_err("%s:%pK: Could not disable regulator\n", + __func__, ice_dev); + goto out; + } + } out: return ret; } @@ -1651,6 +1662,9 @@ int qcom_ice_setup_ice_hw(const char *storage_type, int enable) struct ice_device *ice_dev = NULL; ice_dev = get_ice_device_from_storage_type(storage_type); + if (ice_dev == ERR_PTR(-EPROBE_DEFER)) + return -EPROBE_DEFER; + if (!ice_dev) return ret; diff --git a/drivers/crypto/msm/ota_crypto.c b/drivers/crypto/msm/ota_crypto.c index 8aa0d04f14fd5..416623fb0883c 100644 --- a/drivers/crypto/msm/ota_crypto.c +++ b/drivers/crypto/msm/ota_crypto.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -884,8 +884,8 @@ static ssize_t _debug_stats_read(struct file *file, char __user *buf, int len; len = _disp_stats(); - - rc = simple_read_from_buffer((void __user *) buf, len, + if (len <= count) + rc = simple_read_from_buffer((void __user *) buf, len, ppos, (void *) _debug_read_buf, len); return rc; diff --git a/drivers/crypto/msm/qce.c b/drivers/crypto/msm/qce.c index 7ddbb1938400e..4cf95b90a2dfe 100644 --- a/drivers/crypto/msm/qce.c +++ b/drivers/crypto/msm/qce.c @@ -1,6 +1,6 @@ /* Qualcomm Crypto Engine driver. * - * Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2010-2016, 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 @@ -1962,8 +1962,8 @@ int qce_aead_req(void *handle, struct qce_req *q_req) else q_req->cryptlen = areq->cryptlen - authsize; - if ((q_req->cryptlen > ULONG_MAX - ivsize) || - (q_req->cryptlen + ivsize > ULONG_MAX - areq->assoclen)) { + if ((q_req->cryptlen > UINT_MAX - ivsize) || + (q_req->cryptlen + ivsize > UINT_MAX - areq->assoclen)) { pr_err("Integer overflow on total aead req length.\n"); return -EINVAL; } diff --git a/drivers/crypto/msm/qce50.c b/drivers/crypto/msm/qce50.c index 6b305d69b3025..7056aaf6a0c55 100644 --- a/drivers/crypto/msm/qce50.c +++ b/drivers/crypto/msm/qce50.c @@ -94,7 +94,6 @@ enum qce_owner { struct dummy_request { struct qce_sha_req sreq; - uint8_t *in_buf; struct scatterlist sg; struct ahash_request areq; }; @@ -154,6 +153,7 @@ struct qce_device { atomic_t bunch_cmd_seq; atomic_t last_intr_seq; bool cadence_flag; + uint8_t *dummyreq_in_buf; }; static void print_notify_debug(struct sps_event_notify *notify); @@ -1360,7 +1360,8 @@ static int _ce_setup_hash_direct(struct qce_device *pce_dev, CRYPTO_CONFIG_REG)); /* issue go to crypto */ if (use_hw_key == false) { - QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), + QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), pce_dev->iobase + CRYPTO_GOPROC_REG); } else { QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), @@ -1541,7 +1542,8 @@ static int _ce_setup_aead_direct(struct qce_device *pce_dev, CRYPTO_CONFIG_REG)); /* issue go to crypto */ - QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), + QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), pce_dev->iobase + CRYPTO_GOPROC_REG); /* * Ensure previous instructions (setting the GO register) @@ -1860,7 +1862,8 @@ static int _ce_setup_cipher_direct(struct qce_device *pce_dev, CRYPTO_CONFIG_REG)); /* issue go to crypto */ if (use_hw_key == false) { - QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), + QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), pce_dev->iobase + CRYPTO_GOPROC_REG); } else { QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), @@ -1948,7 +1951,8 @@ static int _ce_f9_setup_direct(struct qce_device *pce_dev, QCE_WRITE_REG(pce_dev->reg.crypto_cfg_le, (pce_dev->iobase + CRYPTO_CONFIG_REG)); /* write go */ - QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), + QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), pce_dev->iobase + CRYPTO_GOPROC_REG); /* * Ensure previous instructions (setting the GO register) @@ -2025,7 +2029,8 @@ static int _ce_f8_setup_direct(struct qce_device *pce_dev, QCE_WRITE_REG(pce_dev->reg.crypto_cfg_le, (pce_dev->iobase + CRYPTO_CONFIG_REG)); /* write go */ - QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), + QCE_WRITE_REG(((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), pce_dev->iobase + CRYPTO_GOPROC_REG); /* * Ensure previous instructions (setting the GO register) @@ -2163,6 +2168,10 @@ static int _sha_complete(struct qce_device *pce_dev, int req_info) pce_sps_data = &preq_info->ce_sps; qce_callback = preq_info->qce_cb; areq = (struct ahash_request *) preq_info->areq; + if (!areq) { + pr_err("sha operation error. areq is NULL\n"); + return -ENXIO; + } qce_dma_unmap_sg(pce_dev->pdev, areq->src, preq_info->src_nents, DMA_TO_DEVICE); memcpy(digest, (char *)(&pce_sps_data->result->auth_iv[0]), @@ -2910,7 +2919,7 @@ static inline int qce_alloc_req_info(struct qce_device *pce_dev) request_index++; if (request_index >= MAX_QCE_BAM_REQ) request_index = 0; - if (xchg(&pce_dev->ce_request_info[request_index]. + if (atomic_xchg(&pce_dev->ce_request_info[request_index]. in_use, true) == false) { pce_dev->ce_request_index = request_index; return request_index; @@ -2926,7 +2935,8 @@ static inline void qce_free_req_info(struct qce_device *pce_dev, int req_info, bool is_complete) { pce_dev->ce_request_info[req_info].xfer_type = QCE_XFER_TYPE_LAST; - if (xchg(&pce_dev->ce_request_info[req_info].in_use, false) == true) { + if (atomic_xchg(&pce_dev->ce_request_info[req_info].in_use, + false) == true) { if (req_info < MAX_QCE_BAM_REQ && is_complete) atomic_dec(&pce_dev->no_of_queued_req); } else @@ -3278,8 +3288,8 @@ static int _setup_cipher_aes_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -3392,8 +3402,8 @@ static int _setup_cipher_des_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -3436,8 +3446,8 @@ static int _setup_cipher_null_cmdlistptrs(struct qce_device *pdev, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -3614,8 +3624,8 @@ static int _setup_auth_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -3831,8 +3841,8 @@ static int _setup_aead_cmdlistptrs(struct qce_device *pdev, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -3964,8 +3974,8 @@ static int _setup_aead_ccm_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -4050,8 +4060,8 @@ static int _setup_f8_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -4132,8 +4142,8 @@ static int _setup_f9_cmdlistptrs(struct qce_device *pdev, int cri_index, pdev->reg.crypto_cfg_le, NULL); qce_add_cmd_element(pdev, &ce_vaddr, CRYPTO_GOPROC_REG, - ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP)), - &pcl_info->go_proc); + ((1 << CRYPTO_GO) | (1 << CRYPTO_RESULTS_DUMP) | + (1 << CRYPTO_CLR_CNTXT)), &pcl_info->go_proc); pcl_info->size = (uintptr_t)ce_vaddr - (uintptr_t)ce_vaddr_start; *pvaddr = (unsigned char *) ce_vaddr; @@ -4306,8 +4316,6 @@ static int qce_setup_ce_sps_data(struct qce_device *pce_dev) (uintptr_t)vaddr; vaddr += pce_dev->ce_bam_info.ce_burst_size * 2; } - pce_dev->dummyreq.in_buf = (uint8_t *)vaddr; - vaddr += DUMMY_REQ_DATA_LEN; if ((vaddr - pce_dev->coh_vmem) > pce_dev->memsize || iovec_memsize < 0) panic("qce50: Not enough coherent memory. Allocate %x , need %lx\n", @@ -4539,7 +4547,7 @@ static int qce_dummy_req(struct qce_device *pce_dev) { int ret = 0; - if (!(xchg(&pce_dev->ce_request_info[DUMMY_REQ_INDEX]. + if (!(atomic_xchg(&pce_dev->ce_request_info[DUMMY_REQ_INDEX]. in_use, true) == false)) return -EBUSY; ret = qce_process_sha_req(pce_dev, NULL); @@ -4915,6 +4923,12 @@ int qce_aead_req(void *handle, struct qce_req *q_req) else q_req->cryptlen = areq->cryptlen - authsize; + if ((q_req->cryptlen > UINT_MAX - areq->assoclen) || + (q_req->cryptlen + areq->assoclen > UINT_MAX - ivsize)) { + pr_err("Integer overflow on total aead req length.\n"); + return -EINVAL; + } + totallen = q_req->cryptlen + areq->assoclen + ivsize; if (pce_dev->support_cmd_dscr) { @@ -5900,8 +5914,8 @@ static int setup_dummy_req(struct qce_device *pce_dev) "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopqopqrpqrs"; int len = DUMMY_REQ_DATA_LEN; - memcpy(pce_dev->dummyreq.in_buf, input, len); - sg_set_buf(&pce_dev->dummyreq.sg, pce_dev->dummyreq.in_buf, len); + memcpy(pce_dev->dummyreq_in_buf, input, len); + sg_set_buf(&pce_dev->dummyreq.sg, pce_dev->dummyreq_in_buf, len); sg_mark_end(&pce_dev->dummyreq.sg); pce_dev->dummyreq.sreq.alg = QCE_HASH_SHA1; @@ -5951,7 +5965,7 @@ void *qce_open(struct platform_device *pdev, int *rc) } for (i = 0; i < MAX_QCE_ALLOC_BAM_REQ; i++) - pce_dev->ce_request_info[i].in_use = false; + atomic_set(&pce_dev->ce_request_info[i].in_use, false); pce_dev->ce_request_index = 0; pce_dev->memsize = 10 * PAGE_SIZE * MAX_QCE_ALLOC_BAM_REQ; @@ -5970,6 +5984,10 @@ void *qce_open(struct platform_device *pdev, int *rc) if (pce_dev->iovec_vmem == NULL) goto err_mem; + pce_dev->dummyreq_in_buf = kzalloc(DUMMY_REQ_DATA_LEN, GFP_KERNEL); + if (pce_dev->dummyreq_in_buf == NULL) + goto err_mem; + *rc = __qce_init_clk(pce_dev); if (*rc) goto err_mem; @@ -6009,6 +6027,7 @@ void *qce_open(struct platform_device *pdev, int *rc) __qce_deinit_clk(pce_dev); err_mem: + kfree(pce_dev->dummyreq_in_buf); kfree(pce_dev->iovec_vmem); if (pce_dev->coh_vmem) dma_free_coherent(pce_dev->pdev, pce_dev->memsize, @@ -6040,6 +6059,7 @@ int qce_close(void *handle) if (pce_dev->coh_vmem) dma_free_coherent(pce_dev->pdev, pce_dev->memsize, pce_dev->coh_vmem, pce_dev->coh_pmem); + kfree(pce_dev->dummyreq_in_buf); kfree(pce_dev->iovec_vmem); qce_disable_clk(pce_dev); @@ -6109,12 +6129,13 @@ EXPORT_SYMBOL(qce_hw_support); void qce_dump_req(void *handle) { int i; + bool req_in_use; struct qce_device *pce_dev = (struct qce_device *)handle; for (i = 0; i < MAX_QCE_BAM_REQ; i++) { - pr_info("qce_dump_req %d %d\n", i, - pce_dev->ce_request_info[i].in_use); - if (pce_dev->ce_request_info[i].in_use == true) + req_in_use = atomic_read(&pce_dev->ce_request_info[i].in_use); + pr_info("qce_dump_req %d %d\n", i, req_in_use); + if (req_in_use == true) _qce_dump_descr_fifos(pce_dev, i); } } diff --git a/drivers/crypto/msm/qce50.h b/drivers/crypto/msm/qce50.h index b2e96fe13c6ee..765eede0b583c 100644 --- a/drivers/crypto/msm/qce50.h +++ b/drivers/crypto/msm/qce50.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -214,7 +214,7 @@ struct ce_sps_data { }; struct ce_request_info { - bool in_use; + atomic_t in_use; bool in_prog; enum qce_xfer_type_enum xfer_type; struct ce_sps_data ce_sps; diff --git a/drivers/crypto/msm/qcedev.c b/drivers/crypto/msm/qcedev.c index e63f061175adb..df7cca7e295f3 100644 --- a/drivers/crypto/msm/qcedev.c +++ b/drivers/crypto/msm/qcedev.c @@ -56,6 +56,7 @@ static uint8_t _std_init_vector_sha256_uint8[] = { static DEFINE_MUTEX(send_cmd_lock); static DEFINE_MUTEX(qcedev_sent_bw_req); +static DEFINE_MUTEX(hash_access_lock); static void qcedev_ce_high_bw_req(struct qcedev_control *podev, bool high_bw_req) @@ -603,7 +604,7 @@ static int qcedev_sha_update_max_xfer(struct qcedev_async_req *qcedev_areq, while (len > 0) { user_src = (void __user *)qcedev_areq->sha_op_req.data[i].vaddr; - if (user_src && __copy_from_user(k_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[i].len)) return -EFAULT; @@ -639,7 +640,7 @@ static int qcedev_sha_update_max_xfer(struct qcedev_async_req *qcedev_areq, /* Copy data from user src(s) */ user_src = (void __user *)qcedev_areq->sha_op_req.data[0].vaddr; - if (user_src && __copy_from_user(k_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[0].len)) { kzfree(k_buf_src); @@ -648,7 +649,7 @@ static int qcedev_sha_update_max_xfer(struct qcedev_async_req *qcedev_areq, k_src += qcedev_areq->sha_op_req.data[0].len; for (i = 1; i < qcedev_areq->sha_op_req.entries; i++) { user_src = (void __user *)qcedev_areq->sha_op_req.data[i].vaddr; - if (user_src && __copy_from_user(k_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[i].len)) { kzfree(k_buf_src); @@ -702,13 +703,6 @@ static int qcedev_sha_update(struct qcedev_async_req *qcedev_areq, return -EINVAL; } - /* verify address src(s) */ - for (i = 0; i < qcedev_areq->sha_op_req.entries; i++) - if (!access_ok(VERIFY_READ, - (void __user *)qcedev_areq->sha_op_req.data[i].vaddr, - qcedev_areq->sha_op_req.data[i].len)) - return -EFAULT; - if (qcedev_areq->sha_op_req.data_len > QCE_MAX_OPER_DATA) { struct qcedev_sha_op_req *saved_req; @@ -868,19 +862,7 @@ static int qcedev_hash_cmac(struct qcedev_async_req *qcedev_areq, total = qcedev_areq->sha_op_req.data_len; - /* verify address src(s) */ - for (i = 0; i < qcedev_areq->sha_op_req.entries; i++) - if (!access_ok(VERIFY_READ, - (void __user *)qcedev_areq->sha_op_req.data[i].vaddr, - qcedev_areq->sha_op_req.data[i].len)) - return -EFAULT; - - /* Verify Source Address */ - if (!access_ok(VERIFY_READ, - (void __user *)qcedev_areq->sha_op_req.authkey, - qcedev_areq->sha_op_req.authklen)) - return -EFAULT; - if (__copy_from_user(&handle->sha_ctxt.authkey[0], + if (copy_from_user(&handle->sha_ctxt.authkey[0], (void __user *)qcedev_areq->sha_op_req.authkey, qcedev_areq->sha_op_req.authklen)) return -EFAULT; @@ -900,7 +882,7 @@ static int qcedev_hash_cmac(struct qcedev_async_req *qcedev_areq, for (i = 0; i < qcedev_areq->sha_op_req.entries; i++) { user_src = (void __user *)qcedev_areq->sha_op_req.data[i].vaddr; - if (user_src && __copy_from_user(k_src, (void __user *)user_src, + if (user_src && copy_from_user(k_src, (void __user *)user_src, qcedev_areq->sha_op_req.data[i].len)) { kzfree(k_buf_src); return -EFAULT; @@ -928,12 +910,7 @@ static int qcedev_set_hmac_auth_key(struct qcedev_async_req *areq, if (areq->sha_op_req.authklen <= QCEDEV_MAX_KEY_SIZE) { qcedev_sha_init(areq, handle); - /* Verify Source Address */ - if (!access_ok(VERIFY_READ, - (void __user *)areq->sha_op_req.authkey, - areq->sha_op_req.authklen)) - return -EFAULT; - if (__copy_from_user(&handle->sha_ctxt.authkey[0], + if (copy_from_user(&handle->sha_ctxt.authkey[0], (void __user *)areq->sha_op_req.authkey, areq->sha_op_req.authklen)) return -EFAULT; @@ -1146,7 +1123,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, byteoffset = areq->cipher_op_req.byteoffset; user_src = (void __user *)areq->cipher_op_req.vbuf.src[0].vaddr; - if (user_src && __copy_from_user((k_align_src + byteoffset), + if (user_src && copy_from_user((k_align_src + byteoffset), (void __user *)user_src, areq->cipher_op_req.vbuf.src[0].len)) return -EFAULT; @@ -1156,7 +1133,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, for (i = 1; i < areq->cipher_op_req.entries; i++) { user_src = (void __user *)areq->cipher_op_req.vbuf.src[i].vaddr; - if (user_src && __copy_from_user(k_align_src, + if (user_src && copy_from_user(k_align_src, (void __user *)user_src, areq->cipher_op_req.vbuf.src[i].len)) { return -EFAULT; @@ -1188,7 +1165,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, while (creq->data_len > 0) { if (creq->vbuf.dst[dst_i].len <= creq->data_len) { - if (err == 0 && __copy_to_user( + if (err == 0 && copy_to_user( (void __user *)creq->vbuf.dst[dst_i].vaddr, (k_align_dst + byteoffset), creq->vbuf.dst[dst_i].len)) @@ -1199,7 +1176,7 @@ static int qcedev_vbuf_ablk_cipher_max_xfer(struct qcedev_async_req *areq, creq->data_len -= creq->vbuf.dst[dst_i].len; dst_i++; } else { - if (err == 0 && __copy_to_user( + if (err == 0 && copy_to_user( (void __user *)creq->vbuf.dst[dst_i].vaddr, (k_align_dst + byteoffset), creq->data_len)) @@ -1234,44 +1211,6 @@ static int qcedev_vbuf_ablk_cipher(struct qcedev_async_req *areq, struct qcedev_cipher_op_req *saved_req; struct qcedev_cipher_op_req *creq = &areq->cipher_op_req; - /* Verify Source Address's */ - for (i = 0; i < areq->cipher_op_req.entries; i++) - if (!access_ok(VERIFY_READ, - (void __user *)areq->cipher_op_req.vbuf.src[i].vaddr, - areq->cipher_op_req.vbuf.src[i].len)) - return -EFAULT; - - /* Verify Destination Address's */ - if (creq->in_place_op != 1) { - for (i = 0, total = 0; i < QCEDEV_MAX_BUFFERS; i++) { - if ((areq->cipher_op_req.vbuf.dst[i].vaddr != 0) && - (total < creq->data_len)) { - if (!access_ok(VERIFY_WRITE, - (void __user *)creq->vbuf.dst[i].vaddr, - creq->vbuf.dst[i].len)) { - pr_err("%s:DST WR_VERIFY err %d=0x%lx\n", - __func__, i, (uintptr_t) - creq->vbuf.dst[i].vaddr); - return -EFAULT; - } - total += creq->vbuf.dst[i].len; - } - } - } else { - for (i = 0, total = 0; i < creq->entries; i++) { - if (total < creq->data_len) { - if (!access_ok(VERIFY_WRITE, - (void __user *)creq->vbuf.src[i].vaddr, - creq->vbuf.src[i].len)) { - pr_err("%s:SRC WR_VERIFY err %d=0x%lx\n", - __func__, i, (uintptr_t) - creq->vbuf.src[i].vaddr); - return -EFAULT; - } - total += creq->vbuf.src[i].len; - } - } - } total = 0; if (areq->cipher_op_req.mode == QCEDEV_AES_MODE_CTR) @@ -1507,6 +1446,15 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, pr_err("%s: Invalid byte offset\n", __func__); goto error; } + total = req->byteoffset; + for (i = 0; i < req->entries; i++) { + if (total > U32_MAX - req->vbuf.src[i].len) { + pr_err("%s:Integer overflow on total src len\n", + __func__); + goto error; + } + total += req->vbuf.src[i].len; + } } if (req->data_len < req->byteoffset) { @@ -1542,7 +1490,12 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, } } /* Check for sum of all dst length is equal to data_len */ - for (i = 0; i < req->entries; i++) { + for (i = 0, total = 0; i < req->entries; i++) { + if (!req->vbuf.dst[i].vaddr && req->vbuf.dst[i].len) { + pr_err("%s: NULL req dst vbuf[%d] with length %d\n", + __func__, i, req->vbuf.dst[i].len); + goto error; + } if (req->vbuf.dst[i].len >= U32_MAX - total) { pr_err("%s: Integer overflow on total req dst vbuf length\n", __func__); @@ -1557,6 +1510,11 @@ static int qcedev_check_cipher_params(struct qcedev_cipher_op_req *req, } /* Check for sum of all src length is equal to data_len */ for (i = 0, total = 0; i < req->entries; i++) { + if (!req->vbuf.src[i].vaddr && req->vbuf.src[i].len) { + pr_err("%s: NULL req src vbuf[%d] with length %d\n", + __func__, i, req->vbuf.src[i].len); + goto error; + } if (req->vbuf.src[i].len > U32_MAX - total) { pr_err("%s: Integer overflow on total req src vbuf length\n", __func__); @@ -1664,11 +1622,7 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) switch (cmd) { case QCEDEV_IOCTL_ENC_REQ: case QCEDEV_IOCTL_DEC_REQ: - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_cipher_op_req))) - return -EFAULT; - - if (__copy_from_user(&qcedev_areq.cipher_op_req, + if (copy_from_user(&qcedev_areq.cipher_op_req, (void __user *)arg, sizeof(struct qcedev_cipher_op_req))) return -EFAULT; @@ -1681,32 +1635,35 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) err = qcedev_vbuf_ablk_cipher(&qcedev_areq, handle); if (err) return err; - if (__copy_to_user((void __user *)arg, + if (copy_to_user((void __user *)arg, &qcedev_areq.cipher_op_req, sizeof(struct qcedev_cipher_op_req))) - return -EFAULT; + return -EFAULT; break; case QCEDEV_IOCTL_SHA_INIT_REQ: { struct scatterlist sg_src; - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) + mutex_lock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { + mutex_unlock(&hash_access_lock); return -EINVAL; + } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; err = qcedev_hash_init(&qcedev_areq, handle, &sg_src); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + } + mutex_unlock(&hash_access_lock); + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) - return -EFAULT; + return -EFAULT; } handle->sha_ctxt.init_done = true; break; @@ -1716,36 +1673,48 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) case QCEDEV_IOCTL_SHA_UPDATE_REQ: { struct scatterlist sg_src; - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) + mutex_lock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { + mutex_unlock(&hash_access_lock); return -EINVAL; + } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; if (qcedev_areq.sha_op_req.alg == QCEDEV_ALG_AES_CMAC) { err = qcedev_hash_cmac(&qcedev_areq, handle, &sg_src); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } } else { if (handle->sha_ctxt.init_done == false) { pr_err("%s Init was not called\n", __func__); + mutex_unlock(&hash_access_lock); return -EINVAL; } err = qcedev_hash_update(&qcedev_areq, handle, &sg_src); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } } + if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { + pr_err("Invalid sha_ctxt.diglen %d\n", + handle->sha_ctxt.diglen); + mutex_unlock(&hash_access_lock); + return -EINVAL; + } memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + mutex_unlock(&hash_access_lock); + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; } @@ -1757,25 +1726,33 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) pr_err("%s Init was not called\n", __func__); return -EINVAL; } - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) + mutex_lock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { + mutex_unlock(&hash_access_lock); return -EINVAL; + } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; err = qcedev_hash_final(&qcedev_areq, handle); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } + if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { + pr_err("Invalid sha_ctxt.diglen %d\n", + handle->sha_ctxt.diglen); + mutex_unlock(&hash_access_lock); + return -EINVAL; + } qcedev_areq.sha_op_req.diglen = handle->sha_ctxt.diglen; memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + mutex_unlock(&hash_access_lock); + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; handle->sha_ctxt.init_done = false; @@ -1784,29 +1761,40 @@ long qcedev_ioctl(struct file *file, unsigned cmd, unsigned long arg) case QCEDEV_IOCTL_GET_SHA_REQ: { struct scatterlist sg_src; - if (!access_ok(VERIFY_WRITE, (void __user *)arg, - sizeof(struct qcedev_sha_op_req))) - return -EFAULT; - if (__copy_from_user(&qcedev_areq.sha_op_req, + if (copy_from_user(&qcedev_areq.sha_op_req, (void __user *)arg, sizeof(struct qcedev_sha_op_req))) return -EFAULT; - if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) + mutex_lock(&hash_access_lock); + if (qcedev_check_sha_params(&qcedev_areq.sha_op_req, podev)) { + mutex_unlock(&hash_access_lock); return -EINVAL; + } qcedev_areq.op_type = QCEDEV_CRYPTO_OPER_SHA; qcedev_hash_init(&qcedev_areq, handle, &sg_src); err = qcedev_hash_update(&qcedev_areq, handle, &sg_src); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } err = qcedev_hash_final(&qcedev_areq, handle); - if (err) + if (err) { + mutex_unlock(&hash_access_lock); return err; + } + if (handle->sha_ctxt.diglen > QCEDEV_MAX_SHA_DIGEST) { + pr_err("Invalid sha_ctxt.diglen %d\n", + handle->sha_ctxt.diglen); + mutex_unlock(&hash_access_lock); + return -EINVAL; + } qcedev_areq.sha_op_req.diglen = handle->sha_ctxt.diglen; memcpy(&qcedev_areq.sha_op_req.digest[0], &handle->sha_ctxt.digest[0], handle->sha_ctxt.diglen); - if (__copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, + mutex_unlock(&hash_access_lock); + if (copy_to_user((void __user *)arg, &qcedev_areq.sha_op_req, sizeof(struct qcedev_sha_op_req))) return -EFAULT; } @@ -2052,9 +2040,9 @@ static ssize_t _debug_stats_read(struct file *file, char __user *buf, len = _disp_stats(qcedev); - rc = simple_read_from_buffer((void __user *) buf, len, + if (len <= count) + rc = simple_read_from_buffer((void __user *) buf, len, ppos, (void *) _debug_read_buf, len); - return rc; } diff --git a/drivers/crypto/msm/qcrypto.c b/drivers/crypto/msm/qcrypto.c index 3324c9d164c41..d73c7789fb14b 100644 --- a/drivers/crypto/msm/qcrypto.c +++ b/drivers/crypto/msm/qcrypto.c @@ -1,6 +1,6 @@ /* Qualcomm Crypto driver * - * Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2010-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 @@ -4240,6 +4240,7 @@ static int _sha1_hmac_setkey(struct crypto_ahash *tfm, const u8 *key, unsigned int len) { struct qcrypto_sha_ctx *sha_ctx = crypto_tfm_ctx(&tfm->base); + int ret = 0; memset(&sha_ctx->authkey[0], 0, SHA1_BLOCK_SIZE); if (len <= SHA1_BLOCK_SIZE) { memcpy(&sha_ctx->authkey[0], key, len); @@ -4247,16 +4248,19 @@ static int _sha1_hmac_setkey(struct crypto_ahash *tfm, const u8 *key, } else { sha_ctx->alg = QCE_HASH_SHA1; sha_ctx->diglen = SHA1_DIGEST_SIZE; - _sha_hmac_setkey(tfm, key, len); + ret = _sha_hmac_setkey(tfm, key, len); + if (ret) + pr_err("SHA1 hmac setkey failed\n"); sha_ctx->authkey_in_len = SHA1_BLOCK_SIZE; } - return 0; + return ret; } static int _sha256_hmac_setkey(struct crypto_ahash *tfm, const u8 *key, unsigned int len) { struct qcrypto_sha_ctx *sha_ctx = crypto_tfm_ctx(&tfm->base); + int ret = 0; memset(&sha_ctx->authkey[0], 0, SHA256_BLOCK_SIZE); if (len <= SHA256_BLOCK_SIZE) { @@ -4265,11 +4269,13 @@ static int _sha256_hmac_setkey(struct crypto_ahash *tfm, const u8 *key, } else { sha_ctx->alg = QCE_HASH_SHA256; sha_ctx->diglen = SHA256_DIGEST_SIZE; - _sha_hmac_setkey(tfm, key, len); + ret = _sha_hmac_setkey(tfm, key, len); + if (ret) + pr_err("SHA256 hmac setkey failed\n"); sha_ctx->authkey_in_len = SHA256_BLOCK_SIZE; } - return 0; + return ret; } static int _sha_hmac_init_ihash(struct ahash_request *req, @@ -5742,9 +5748,9 @@ static ssize_t _debug_stats_read(struct file *file, char __user *buf, len = _disp_stats(qcrypto); - rc = simple_read_from_buffer((void __user *) buf, len, + if (len <= count) + rc = simple_read_from_buffer((void __user *) buf, len, ppos, (void *) _debug_read_buf, len); - return rc; } diff --git a/drivers/devfreq/governor_bw_vbif.c b/drivers/devfreq/governor_bw_vbif.c index d6498bb0f1c0a..83196e1b31d55 100644 --- a/drivers/devfreq/governor_bw_vbif.c +++ b/drivers/devfreq/governor_bw_vbif.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2014, 2016 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 @@ -74,6 +74,8 @@ static int devfreq_vbif_ev_handler(struct devfreq *devfreq, int ret; struct devfreq_dev_status stat; + memset(&stat, 0, sizeof(stat)); + switch (event) { case DEVFREQ_GOV_START: mutex_lock(&df_lock); diff --git a/drivers/devfreq/governor_msm_adreno_tz.c b/drivers/devfreq/governor_msm_adreno_tz.c index f6a45318239a9..f24a504c3f484 100644 --- a/drivers/devfreq/governor_msm_adreno_tz.c +++ b/drivers/devfreq/governor_msm_adreno_tz.c @@ -92,14 +92,15 @@ static ssize_t gpu_load_show(struct device *dev, struct device_attribute *attr, char *buf) { - unsigned long sysfs_busy_perc; + unsigned long sysfs_busy_perc = 0; /* * Average out the samples taken since last read * This will keep the average value in sync with * with the client sampling duration. */ spin_lock(&sample_lock); - sysfs_busy_perc = (acc_relative_busy * 100) / acc_total; + if (acc_total) + sysfs_busy_perc = (acc_relative_busy * 100) / acc_total; /* Reset the parameters */ acc_total = 0; diff --git a/drivers/fingerprint/Kconfig b/drivers/fingerprint/Kconfig new file mode 100755 index 0000000000000..fc1ec096771d1 --- /dev/null +++ b/drivers/fingerprint/Kconfig @@ -0,0 +1,7 @@ +config FINGERPRINT + tristate "Fingerprint driver support" + help + Say Y here to enable goodix fingerprint driver support! + +source "drivers/fingerprint/goodix/Kconfig" +source "drivers/fingerprint/fpc/Kconfig" diff --git a/drivers/fingerprint/Makefile b/drivers/fingerprint/Makefile new file mode 100755 index 0000000000000..28d1360d2205c --- /dev/null +++ b/drivers/fingerprint/Makefile @@ -0,0 +1,2 @@ +obj-$(CONFIG_FINGERPRINT_GOODIX_GF3208) += goodix/ +obj-$(CONFIG_FINGERPRINT_FPC1020) += fpc/ diff --git a/drivers/fingerprint/fpc/Kconfig b/drivers/fingerprint/fpc/Kconfig new file mode 100755 index 0000000000000..49cbae40d8ce8 --- /dev/null +++ b/drivers/fingerprint/fpc/Kconfig @@ -0,0 +1,5 @@ +config FINGERPRINT_FPC1020 + tristate "FingerPrint Cards fingerprint drvier support" + depends on FINGERPRINT + help + Say Y here to enable goodix fingerprint driver support! diff --git a/drivers/fingerprint/fpc/Makefile b/drivers/fingerprint/fpc/Makefile new file mode 100755 index 0000000000000..2a107b89704d4 --- /dev/null +++ b/drivers/fingerprint/fpc/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_FINGERPRINT_FPC1020) += fpc1020_tee.o diff --git a/drivers/fingerprint/fpc/fpc1020_tee.c b/drivers/fingerprint/fpc/fpc1020_tee.c new file mode 100644 index 0000000000000..3588b8b634fd6 --- /dev/null +++ b/drivers/fingerprint/fpc/fpc1020_tee.c @@ -0,0 +1,715 @@ +/* + * FPC1020 Fingerprint sensor device driver + * + * This driver will control the platform resources that the FPC fingerprint + * sensor needs to operate. The major things are probing the sensor to check + * that it is actually connected and let the Kernel know this and with that also + * enabling and disabling of regulators, enabling and disabling of platform + * clocks, controlling GPIOs such as SPI chip select, sensor reset line, sensor + * IRQ line, MISO and MOSI lines. + * + * The driver will expose most of its available functionality in sysfs which + * enables dynamic control of these features from eg. a user space process. + * + * The sensor's IRQ events will be pushed to Kernel's event handling system and + * are exposed in the drivers event node. This makes it possible for a user + * space process to poll the input node and receive IRQ events easily. Usually + * this node is available under /dev/input/eventX where 'X' is a number given by + * the event system. A user space process will need to traverse all the event + * nodes and ask for its parent's name (through EVIOCGNAME) which should match + * the value in device tree named input-device-name. + * + * This driver will NOT send any SPI commands to the sensor it only controls the + * electrical parts. + * + * + * Copyright (c) 2015 Fingerprint Cards AB + * Copyright (C) 2018 XiaoMi, 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FPC1020_RESET_LOW_US 1000 +#define FPC1020_RESET_HIGH1_US 100 +#define FPC1020_RESET_HIGH2_US 1250 +#define PWR_ON_STEP_SLEEP 100 +#define PWR_ON_STEP_RANGE1 100 +#define PWR_ON_STEP_RANGE2 900 +#define FPC_TTW_HOLD_TIME 2000 +#define FP_UNLOCK_REJECTION_TIMEOUT (FPC_TTW_HOLD_TIME - 500) +#define NUM_PARAMS_REG_ENABLE_SET 2 + +static const char * const pctl_names[] = { + "fpc1020_spi_active", + "fpc1020_reset_reset", + "fpc1020_reset_active", + "fpc1020_irq_active", +}; + + +struct fpc1020_data { + struct device *dev; + struct pinctrl *fingerprint_pinctrl; + struct pinctrl_state *pinctrl_state[ARRAY_SIZE(pctl_names)]; +#ifdef LINUX_CONTROL_SPI_CLK + u32 max_speed_hz; + struct clk *iface_clk; + struct clk *core_clk; +#endif + + struct wake_lock ttw_wl; + int irq_gpio; + int rst_gpio; + struct mutex lock; + bool prepared; + bool wakeup_enabled; + bool compatible_enabled; +#ifdef LINUX_CONTROL_SPI_CLK + bool clocks_enabled; + bool clocks_suspended; +#endif + struct notifier_block fb_notifier; + bool fb_black; + bool wait_finger_down; + struct work_struct work; +}; +char boardid_info_fingerprint[HARDWARE_MAX_ITEM_LONGTH] = {0,}; +static irqreturn_t fpc1020_irq_handler(int irq, void *handle); +static int fpc1020_request_named_gpio(struct fpc1020_data *fpc1020, + const char *label, int *gpio); +static int hw_reset(struct fpc1020_data *fpc1020); + +#ifdef LINUX_CONTROL_SPI_CLK +static int set_clks(struct fpc1020_data *fpc1020, bool enable) +{ + int rc = 0; + mutex_lock(&fpc1020->lock); + + if (enable == fpc1020->clocks_enabled) + goto out; + + if (enable) { + rc = clk_set_rate(fpc1020->core_clk, fpc1020->max_speed_hz); + if (rc) { + dev_err(fpc1020->dev, + "%s: Error setting clk_rate: %u, %d\n", + __func__, fpc1020->max_speed_hz, + rc); + goto out; + } + rc = clk_prepare_enable(fpc1020->core_clk); + if (rc) { + dev_err(fpc1020->dev, + "%s: Error enabling core clk: %d\n", + __func__, rc); + goto out; + } + + rc = clk_prepare_enable(fpc1020->iface_clk); + if (rc) { + dev_err(fpc1020->dev, + "%s: Error enabling iface clk: %d\n", + __func__, rc); + clk_disable_unprepare(fpc1020->core_clk); + goto out; + } + dev_dbg(fpc1020->dev, "%s ok. clk rate %u hz\n", __func__, + fpc1020->max_speed_hz); + + fpc1020->clocks_enabled = true; + } else { + clk_disable_unprepare(fpc1020->iface_clk); + clk_disable_unprepare(fpc1020->core_clk); + fpc1020->clocks_enabled = false; + } + +out: + mutex_unlock(&fpc1020->lock); + return rc; +} + +static ssize_t clk_enable_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + return set_clks(fpc1020, (*buf == '1')) ? : count; +} + +static DEVICE_ATTR(clk_enable, S_IWUSR, NULL, clk_enable_set); +#endif +/** + * Will try to select the set of pins (GPIOS) defined in a pin control node of + * the device tree named @p name. + * + * The node can contain several eg. GPIOs that is controlled when selecting it. + * The node may activate or deactivate the pins it contains, the action is + * defined in the device tree node itself and not here. The states used + * internally is fetched at probe time. + * + * @see pctl_names + * @see fpc1020_probe + */ +static int select_pin_ctl(struct fpc1020_data *fpc1020, const char *name) +{ + size_t i; + int rc; + struct device *dev = fpc1020->dev; + for (i = 0; i < ARRAY_SIZE(fpc1020->pinctrl_state); i++) { + const char *n = pctl_names[i]; + if (!strncmp(n, name, strlen(n))) { + rc = pinctrl_select_state(fpc1020->fingerprint_pinctrl, + fpc1020->pinctrl_state[i]); + if (rc) + dev_err(dev, "cannot select '%s'\n", name); + else + dev_dbg(dev, "Selected '%s'\n", name); + goto exit; + } + } + rc = -EINVAL; + dev_err(dev, "%s:'%s' not found\n", __func__, name); +exit: + return rc; +} + +static ssize_t pinctl_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + int rc = select_pin_ctl(fpc1020, buf); + return rc ? rc : count; +} +static DEVICE_ATTR(pinctl_set, S_IWUSR, NULL, pinctl_set); + +static int hw_reset(struct fpc1020_data *fpc1020) +{ + int irq_gpio; + struct device *dev = fpc1020->dev; + + int rc = select_pin_ctl(fpc1020, "fpc1020_reset_active"); + if (rc) + goto exit; + usleep_range(FPC1020_RESET_HIGH1_US, FPC1020_RESET_HIGH1_US + 100); + + rc = select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + if (rc) + goto exit; + usleep_range(FPC1020_RESET_LOW_US, FPC1020_RESET_LOW_US + 100); + + rc = select_pin_ctl(fpc1020, "fpc1020_reset_active"); + if (rc) + goto exit; + usleep_range(FPC1020_RESET_HIGH1_US, FPC1020_RESET_HIGH1_US + 100); + + irq_gpio = gpio_get_value(fpc1020->irq_gpio); + dev_info(dev, "IRQ after reset %d\n", irq_gpio); +exit: + return rc; +} + +static ssize_t hw_reset_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + if (!strncmp(buf, "reset", strlen("reset"))) + rc = hw_reset(fpc1020); + else + return -EINVAL; + return rc ? rc : count; +} +static DEVICE_ATTR(hw_reset, S_IWUSR, NULL, hw_reset_set); + +/** + * Will setup clocks, GPIOs, and regulators to correctly initialize the touch + * sensor to be ready for work. + * + * In the correct order according to the sensor spec this function will + * enable/disable regulators, SPI platform clocks, and reset line, all to set + * the sensor in a correct power on or off state "electrical" wise. + * + * @see spi_prepare_set + * @note This function will not send any commands to the sensor it will only + * control it "electrically". + */ +static int device_prepare(struct fpc1020_data *fpc1020, bool enable) +{ + int rc; + + mutex_lock(&fpc1020->lock); + if (enable && !fpc1020->prepared) { + fpc1020->prepared = true; + select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + + usleep_range(PWR_ON_STEP_SLEEP, PWR_ON_STEP_RANGE2); + + (void)select_pin_ctl(fpc1020, "fpc1020_reset_active"); + usleep_range(PWR_ON_STEP_SLEEP, PWR_ON_STEP_RANGE1); + } else if (!enable && fpc1020->prepared) { + rc = 0; + + (void)select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + usleep_range(PWR_ON_STEP_SLEEP, PWR_ON_STEP_RANGE2); + + fpc1020->prepared = false; + } else { + rc = 0; + } + mutex_unlock(&fpc1020->lock); + return rc; +} + +static ssize_t spi_prepare_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + if (!strncmp(buf, "enable", strlen("enable"))) + rc = device_prepare(fpc1020, true); + else if (!strncmp(buf, "disable", strlen("disable"))) + rc = device_prepare(fpc1020, false); + else + return -EINVAL; + return rc ? rc : count; +} +static DEVICE_ATTR(spi_prepare, S_IWUSR, NULL, spi_prepare_set); + +/** + * sysf node to check the interrupt status of the sensor, the interrupt + * handler should perform sysf_notify to allow userland to poll the node. + */ +static ssize_t irq_get(struct device *device, + struct device_attribute *attribute, + char *buffer) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(device); + int irq = gpio_get_value(fpc1020->irq_gpio); + return scnprintf(buffer, PAGE_SIZE, "%i\n", irq); +} + + +/** + * writing to the irq node will just drop a printk message + * and return success, used for latency measurement. + */ +static ssize_t irq_ack(struct device *device, + struct device_attribute *attribute, + const char *buffer, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(device); + dev_dbg(fpc1020->dev, "%s\n", __func__); + return count; +} + +static DEVICE_ATTR(irq, S_IRUSR | S_IWUSR, irq_get, irq_ack); + +static ssize_t fingerdown_wait_set(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + dev_dbg(fpc1020->dev, "%s\n", __func__); + if (!strncmp(buf, "enable", strlen("enable"))) + fpc1020->wait_finger_down = true; + else if (!strncmp(buf, "disable", strlen("disable"))) + fpc1020->wait_finger_down = false; + else + return -EINVAL; + + return count; +} +static DEVICE_ATTR(fingerdown_wait, S_IWUSR, NULL, fingerdown_wait_set); + +static ssize_t compatible_all_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + int i; + int irqf; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + dev_err(dev, "compatible all enter %d\n", fpc1020->compatible_enabled); + if (!strncmp(buf, "enable", strlen("enable")) && fpc1020->compatible_enabled != 1) { + rc = fpc1020_request_named_gpio(fpc1020, "fpc,gpio_irq", + &fpc1020->irq_gpio); + if (rc) + goto exit; + rc = fpc1020_request_named_gpio(fpc1020, "fpc,gpio_rst", + &fpc1020->rst_gpio); + if (rc) + goto exit; + + fpc1020->fingerprint_pinctrl = devm_pinctrl_get(dev); + if (IS_ERR(fpc1020->fingerprint_pinctrl)) { + if (PTR_ERR(fpc1020->fingerprint_pinctrl) == -EPROBE_DEFER) { + dev_info(dev, "pinctrl not ready\n"); + rc = -EPROBE_DEFER; + goto exit; + } + dev_err(dev, "Target does not use pinctrl\n"); + fpc1020->fingerprint_pinctrl = NULL; + rc = -EINVAL; + goto exit; + } + + for (i = 0; i < ARRAY_SIZE(fpc1020->pinctrl_state); i++) { + const char *n = pctl_names[i]; + struct pinctrl_state *state = + pinctrl_lookup_state(fpc1020->fingerprint_pinctrl, n); + if (IS_ERR(state)) { + dev_err(dev, "cannot find '%s'\n", n); + rc = -EINVAL; + goto exit; + } + dev_info(dev, "found pin control %s\n", n); + fpc1020->pinctrl_state[i] = state; + } + + rc = select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + if (rc) + goto exit; + rc = select_pin_ctl(fpc1020, "fpc1020_irq_active"); + if (rc) + goto exit; + irqf = IRQF_TRIGGER_RISING | IRQF_ONESHOT; + if (1) { + dev_err(dev, "enable-wakeup request irq %d\n", fpc1020->compatible_enabled); + irqf |= IRQF_NO_SUSPEND; + device_init_wakeup(dev, 1); + rc = devm_request_threaded_irq(dev, gpio_to_irq(fpc1020->irq_gpio), + NULL, fpc1020_irq_handler, irqf, + dev_name(dev), fpc1020); + if (rc) { + dev_err(dev, "could not request irq %d\n", + gpio_to_irq(fpc1020->irq_gpio)); + goto exit; + } + dev_err(dev, "requested irq %d\n", gpio_to_irq(fpc1020->irq_gpio)); + } + + /* Request that the interrupt should be wakeable */ + enable_irq_wake(gpio_to_irq(fpc1020->irq_gpio)); + fpc1020->compatible_enabled = 1; + if (of_property_read_bool(dev->of_node, "fpc,enable-on-boot")) { + dev_info(dev, "Enabling hardware\n"); + (void)device_prepare(fpc1020, true); + #ifdef LINUX_CONTROL_SPI_CLK + (void)set_clks(fpc1020, false); + #endif + } + } else if (!strncmp(buf, "disable", strlen("disable")) && fpc1020->compatible_enabled != 0) { + if (gpio_is_valid(fpc1020->irq_gpio)) { + devm_gpio_free(dev, fpc1020->irq_gpio); + pr_info("remove irq_gpio success\n"); + } + if (gpio_is_valid(fpc1020->rst_gpio)) { + devm_gpio_free(dev, fpc1020->rst_gpio); + pr_info("remove rst_gpio success\n"); + } + devm_free_irq(dev, gpio_to_irq(fpc1020->irq_gpio), fpc1020); + fpc1020->compatible_enabled = 0; + } else + goto exit; + hw_reset(fpc1020); + return count; +exit: + return -EINVAL; +} +static DEVICE_ATTR(compatible_all, S_IWUSR, NULL, compatible_all_set); +static struct attribute *attributes[] = { + &dev_attr_pinctl_set.attr, + &dev_attr_spi_prepare.attr, + &dev_attr_hw_reset.attr, + &dev_attr_compatible_all.attr, +#ifdef LINUX_CONTROL_SPI_CLK + &dev_attr_clk_enable.attr, +#endif + &dev_attr_irq.attr, + &dev_attr_fingerdown_wait.attr, + NULL +}; + +static const struct attribute_group attribute_group = { + .attrs = attributes, +}; + +static void notification_work(struct work_struct *work) +{ + mdss_prim_panel_fb_unblank(FP_UNLOCK_REJECTION_TIMEOUT); + pr_debug("unblank\n"); +} + +static irqreturn_t fpc1020_irq_handler(int irq, void *handle) +{ + struct fpc1020_data *fpc1020 = handle; + dev_dbg(fpc1020->dev, "%s\n", __func__); + + /* Make sure 'wakeup_enabled' is updated before using it + ** since this is interrupt context (other thread...) */ + smp_rmb(); + + if (fpc1020->wakeup_enabled) { + wake_lock_timeout(&fpc1020->ttw_wl, + msecs_to_jiffies(FPC_TTW_HOLD_TIME)); + } + + sysfs_notify(&fpc1020->dev->kobj, NULL, dev_attr_irq.attr.name); + + if (fpc1020->wait_finger_down && fpc1020->fb_black) { + pr_debug("%s enter\n", __func__); + fpc1020->wait_finger_down = false; + schedule_work(&fpc1020->work); + } + return IRQ_HANDLED; +} + +static int fpc1020_request_named_gpio(struct fpc1020_data *fpc1020, + const char *label, int *gpio) +{ + struct device *dev = fpc1020->dev; + struct device_node *np = dev->of_node; + int rc = of_get_named_gpio(np, label, 0); + if (rc < 0) { + dev_err(dev, "failed to get '%s'\n", label); + return rc; + } + *gpio = rc; + rc = devm_gpio_request(dev, *gpio, label); + if (rc) { + dev_err(dev, "failed to request gpio %d\n", *gpio); + return rc; + } + dev_dbg(dev, "%s %d\n", label, *gpio); + return 0; +} + +static int fpc_fb_notif_callback(struct notifier_block *nb, + unsigned long val, void *data) +{ + struct fpc1020_data *fpc1020 = container_of(nb, struct fpc1020_data, + fb_notifier); + struct fb_event *evdata = data; + unsigned int blank; + + if (!fpc1020) + return 0; + + if (val != FB_EVENT_BLANK) + return 0; + + pr_debug("[info] %s value = %d\n", __func__, (int)val); + + if (evdata && evdata->data && val == FB_EVENT_BLANK) { + blank = *(int *)(evdata->data); + switch (blank) { + case FB_BLANK_POWERDOWN: + fpc1020->fb_black = true; + break; + case FB_BLANK_UNBLANK: + fpc1020->fb_black = false; + break; + default: + pr_debug("%s defalut\n", __func__); + break; + } + } + return NOTIFY_OK; +} + + +static struct notifier_block fpc_notif_block = { + .notifier_call = fpc_fb_notif_callback, +}; + + +void parse_cmldine_for_fingerprint(struct device *dev) +{ + char *boadrid_start; + boadrid_start = strstr(saved_command_line, "board_id="); + if (boadrid_start != NULL) { + strncpy(boardid_info_fingerprint, boadrid_start+sizeof("board_id=")-1, 12); + dev_info(dev, "%s: is ok %s \n", __func__, boardid_info_fingerprint); + } else { + pr_debug("boarid not define!\n"); + } +} + +static int fpc1020_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + int rc = 0; + + struct device_node *np = dev->of_node; + + struct fpc1020_data *fpc1020 = devm_kzalloc(dev, sizeof(*fpc1020), + GFP_KERNEL); + if (!fpc1020) { + dev_err(dev, + "failed to allocate memory for struct fpc1020_data\n"); + rc = -ENOMEM; + goto exit; + } + + parse_cmldine_for_fingerprint(dev); + if (strcmp(boardid_info_fingerprint, "S88537DC1:bo") == 0) { + devm_kfree(dev, fpc1020); + dev_info(dev, "%s: exit fpc probe\n", __func__); + return -EPERM; + } + + fpc1020->dev = dev; + dev_set_drvdata(dev, fpc1020); + + if (!np) { + dev_err(dev, "no of node found\n"); + rc = -EINVAL; + goto exit; + } + +#ifdef LINUX_CONTROL_SPI_CLK + if (of_property_read_u32(dev->of_node, "fpc,spi-max-frequency", &fpc1020->max_speed_hz)) { + fpc1020->max_speed_hz = 4800000; + dev_err(dev, "%s: Failed to get spi-max-frequency\n", __func__); + } + + fpc1020->iface_clk = clk_get(dev, "iface_clk"); + if (IS_ERR(fpc1020->iface_clk)) { + dev_err(dev, "%s: Failed to get iface_clk\n", __func__); + rc = -EINVAL; + goto exit; + } + + fpc1020->core_clk = clk_get(dev, "core_clk"); + if (IS_ERR(fpc1020->core_clk)) { + dev_err(dev, "%s: Failed to get core_clk\n", __func__); + rc = -EINVAL; + goto exit; + } +#endif + fpc1020->wakeup_enabled = true; +#ifdef LINUX_CONTROL_SPI_CLK + fpc1020->clocks_enabled = false; + fpc1020->clocks_suspended = false; +#endif + + mutex_init(&fpc1020->lock); + wake_lock_init(&fpc1020->ttw_wl, WAKE_LOCK_SUSPEND, "fpc_ttw_wl"); + + rc = sysfs_create_group(&dev->kobj, &attribute_group); + if (rc) { + dev_err(dev, "could not create sysfs\n"); + goto exit; + } + + dev_info(dev, "%s: ok\n", __func__); + fpc1020->fb_black = false; + fpc1020->wait_finger_down = false; + INIT_WORK(&fpc1020->work, notification_work); + fpc1020->fb_notifier = fpc_notif_block; + fb_register_client(&fpc1020->fb_notifier); +exit: + return rc; +} + +static int fpc1020_remove(struct platform_device *pdev) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(&pdev->dev); + + fb_unregister_client(&fpc1020->fb_notifier); + sysfs_remove_group(&pdev->dev.kobj, &attribute_group); + mutex_destroy(&fpc1020->lock); + wake_lock_destroy(&fpc1020->ttw_wl); + dev_info(&pdev->dev, "%s\n", __func__); + return 0; +} + +#ifdef LINUX_CONTROL_SPI_CLK +static int fpc1020_suspend(struct device *dev) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + fpc1020->clocks_suspended = fpc1020->clocks_enabled; + set_clks(fpc1020, false); + return 0; +} + +static int fpc1020_resume(struct device *dev) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + if (fpc1020->clocks_suspended) + set_clks(fpc1020, true); + + return 0; +} + +static const struct dev_pm_ops fpc1020_pm_ops = { + .suspend = fpc1020_suspend, + .resume = fpc1020_resume, +}; +#endif + +static struct of_device_id fpc1020_of_match[] = { + { .compatible = "soc:fpc1020", }, + {} +}; +MODULE_DEVICE_TABLE(of, fpc1020_of_match); + +static struct platform_driver fpc1020_driver = { + .driver = { + .name = "fpc1020", + .owner = THIS_MODULE, + .of_match_table = fpc1020_of_match, +#ifdef LINUX_CONTROL_SPI_CLK + .pm = &fpc1020_pm_ops, +#endif + }, + .probe = fpc1020_probe, + .remove = fpc1020_remove, +}; + +static int __init fpc1020_init(void) +{ + int rc = platform_driver_register(&fpc1020_driver); + if (!rc) + pr_info("%s OK\n", __func__); + else + pr_err("%s %d\n", __func__, rc); + return rc; +} + +static void __exit fpc1020_exit(void) +{ + pr_info("%s\n", __func__); + platform_driver_unregister(&fpc1020_driver); +} + +module_init(fpc1020_init); +module_exit(fpc1020_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Aleksej Makarov"); +MODULE_AUTHOR("Henrik Tillman "); +MODULE_DESCRIPTION("FPC1020 Fingerprint sensor device driver."); diff --git a/drivers/fingerprint/goodix/Kconfig b/drivers/fingerprint/goodix/Kconfig new file mode 100755 index 0000000000000..3b2d98e01b097 --- /dev/null +++ b/drivers/fingerprint/goodix/Kconfig @@ -0,0 +1,5 @@ +config FINGERPRINT_GOODIX_GF3208 + tristate "Goodix GF3208 fingerprint drvier support" + depends on FINGERPRINT + help + Say Y here to enable goodix fingerprint driver support! diff --git a/drivers/fingerprint/goodix/Makefile b/drivers/fingerprint/goodix/Makefile new file mode 100755 index 0000000000000..54c40263f5623 --- /dev/null +++ b/drivers/fingerprint/goodix/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_FINGERPRINT_GOODIX_GF3208) += gf_spi.o platform.o netlink.o \ No newline at end of file diff --git a/drivers/fingerprint/goodix/gf_spi.c b/drivers/fingerprint/goodix/gf_spi.c new file mode 100755 index 0000000000000..7243cb2acfdb7 --- /dev/null +++ b/drivers/fingerprint/goodix/gf_spi.c @@ -0,0 +1,925 @@ + /*Simple synchronous userspace interface to SPI devices + * + * Copyright (C) 2006 SWAPP + * Andrea Paterniani + * Copyright (C) 2007 David Brownell (simplification, cleanup) + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gf_spi.h" + +#if defined(USE_SPI_BUS) +#include +#include +#elif defined(USE_PLATFORM_BUS) +#include +#endif + +#define WAKELOCK_HOLD_TIME 2000 /* in ms */ +#define FP_UNLOCK_REJECTION_TIMEOUT (WAKELOCK_HOLD_TIME - 500) + +#define GF_SPIDEV_NAME "goodix,fingerprint" +/*device name after register in charater*/ +#define GF_DEV_NAME "goodix_fp" +#define GF_INPUT_NAME "gf3208" /*"goodix_fp" */ + +#define CHRD_DRIVER_NAME "goodix_fp_spi" +#define CLASS_NAME "goodix_fp" +#define SPIDEV_MAJOR 225 /* assigned */ +#define N_SPI_MINORS 32 /* ... up to 256 */ + + +struct gf_key_map key_map[] = { + { "POWER", KEY_POWER }, + { "HOME" , KEY_HOME }, + { "MENU" , KEY_MENU }, + { "BACK" , KEY_BACK }, + { "UP" , KEY_UP }, + { "DOWN" , KEY_DOWN }, + { "LEFT" , KEY_LEFT }, + { "RIGHT", KEY_RIGHT }, + { "CAMERA", KEY_CAMERA }, + { "ENTER", KEY_SELECT}, + { "FORCE", KEY_F9 }, + { "CLICK", KEY_F19 }, +}; + +/**************************debug******************************/ +#define GF_DEBUG +/*#undef GF_DEBUG*/ + +#ifdef GF_DEBUG +#define gf_dbg(fmt, args...) do { \ + pr_warn("gf:" fmt, ##args);\ + } while (0) +#define FUNC_ENTRY() pr_warn("gf:%s, entry\n", __func__) +#define FUNC_EXIT() pr_warn("gf:%s, exit\n", __func__) +#else +#define gf_dbg(fmt, args...) +#define FUNC_ENTRY() +#define FUNC_EXIT() +#endif + +/*Global variables*/ +/*static MODE g_mode = GF_IMAGE_MODE;*/ +static DECLARE_BITMAP(minors, N_SPI_MINORS); +static LIST_HEAD(device_list); +static DEFINE_MUTEX(device_list_lock); +static struct gf_dev gf; +static struct class *gf_class; +static int driver_init_partial(struct gf_dev *gf_dev); + +static void gf_enable_irq(struct gf_dev *gf_dev) +{ + if (gf_dev->irq_enabled) { + pr_warn("IRQ has been enabled.\n"); + } else { + enable_irq(gf_dev->irq); + gf_dev->irq_enabled = 1; + } +} + +static void gf_disable_irq(struct gf_dev *gf_dev) +{ + if (gf_dev->irq_enabled) { + gf_dev->irq_enabled = 0; + disable_irq(gf_dev->irq); + } else { + pr_warn("IRQ has been disabled.\n"); + } +} + +#ifdef AP_CONTROL_CLK +static long spi_clk_max_rate(struct clk *clk, unsigned long rate) +{ + long lowest_available, nearest_low, step_size, cur; + long step_direction = -1; + long guess = rate; + int max_steps = 10; + + cur = clk_round_rate(clk, rate); + if (cur == rate) + return rate; + + /* if we got here then: cur > rate */ + lowest_available = clk_round_rate(clk, 0); + if (lowest_available > rate) + return -EINVAL; + + step_size = (rate - lowest_available) >> 1; + nearest_low = lowest_available; + + while (max_steps-- && step_size) { + guess += step_size * step_direction; + cur = clk_round_rate(clk, guess); + + if ((cur < rate) && (cur > nearest_low)) + nearest_low = cur; + /* + * if we stepped too far, then start stepping in the other + * direction with half the step size + */ + if (((cur > rate) && (step_direction > 0)) + || ((cur < rate) && (step_direction < 0))) { + step_direction = -step_direction; + step_size >>= 1; + } + } + return nearest_low; +} + +static void spi_clock_set(struct gf_dev *gf_dev, int speed) +{ + long rate; + int rc; + + rate = spi_clk_max_rate(gf_dev->core_clk, speed); + if (rate < 0) { + pr_info("%s: no match found for requested clock frequency:%d", + __func__, speed); + return; + } + + rc = clk_set_rate(gf_dev->core_clk, rate); +} + +static int gfspi_ioctl_clk_init(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + data->clk_enabled = 0; + data->core_clk = clk_get(&data->spi->dev, "core_clk"); + if (IS_ERR_OR_NULL(data->core_clk)) { + pr_err("%s: fail to get core_clk\n", __func__); + return -EPERM; + } + data->iface_clk = clk_get(&data->spi->dev, "iface_clk"); + if (IS_ERR_OR_NULL(data->iface_clk)) { + pr_err("%s: fail to get iface_clk\n", __func__); + clk_put(data->core_clk); + data->core_clk = NULL; + return -ENOENT; + } + return 0; +} + +static int gfspi_ioctl_clk_enable(struct gf_dev *data) +{ + int err; + + pr_debug("%s: enter\n", __func__); + + if (data->clk_enabled) + return 0; + + err = clk_prepare_enable(data->core_clk); + if (err) { + pr_err("%s: fail to enable core_clk\n", __func__); + return -EPERM; + } + + err = clk_prepare_enable(data->iface_clk); + if (err) { + pr_err("%s: fail to enable iface_clk\n", __func__); + clk_disable_unprepare(data->core_clk); + return -ENOENT; + } + + data->clk_enabled = 1; + + return 0; +} + +static int gfspi_ioctl_clk_disable(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + if (!data->clk_enabled) + return 0; + + clk_disable_unprepare(data->core_clk); + clk_disable_unprepare(data->iface_clk); + data->clk_enabled = 0; + + return 0; +} + +static int gfspi_ioctl_clk_uninit(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + if (data->clk_enabled) + gfspi_ioctl_clk_disable(data); + + if (!IS_ERR_OR_NULL(data->core_clk)) { + clk_put(data->core_clk); + data->core_clk = NULL; + } + + if (!IS_ERR_OR_NULL(data->iface_clk)) { + clk_put(data->iface_clk); + data->iface_clk = NULL; + } + + return 0; +} +#endif + +static long gf_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + struct gf_dev *gf_dev = &gf; + struct gf_key gf_key = { 0 }; + int retval = 0; + int i; +#ifdef AP_CONTROL_CLK + unsigned int speed = 0; +#endif + FUNC_ENTRY(); + if (_IOC_TYPE(cmd) != GF_IOC_MAGIC) + return -ENODEV; + + if (_IOC_DIR(cmd) & _IOC_READ) + retval = + !access_ok(VERIFY_WRITE, (void __user *)arg, + _IOC_SIZE(cmd)); + if ((retval == 0) && (_IOC_DIR(cmd) & _IOC_WRITE)) + retval = + !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + if (retval) + return -EFAULT; + + if (gf_dev->device_available == 0) { + if ((cmd == GF_IOC_POWER_ON) || (cmd == GF_IOC_POWER_OFF) || (cmd == GF_IOC_ENABLE_GPIO)) { + pr_info("power cmd\n"); + } else { + pr_info("Sensor is power off currently. \n"); + return -ENODEV; + } + } + + switch (cmd) { + case GF_IOC_ENABLE_GPIO: + driver_init_partial(gf_dev); + break; + case GF_IOC_RELEASE_GPIO: + gf_cleanup(gf_dev); + break; + case GF_IOC_DISABLE_IRQ: + gf_disable_irq(gf_dev); + break; + case GF_IOC_ENABLE_IRQ: + gf_enable_irq(gf_dev); + break; + case GF_IOC_SETSPEED: +#ifdef AP_CONTROL_CLK + retval = __get_user(speed, (u32 __user *) arg); + if (retval == 0) { + if (speed > 12 * 1000 * 1000) { + pr_warn("Set speed:%d is larger than 12Mbps.\n", speed); + } else { + spi_clock_set(gf_dev, speed); + } + } else { + pr_warn("Failed to get speed from user. retval = %d\n", retval); + } +#else + pr_info("This kernel doesn't support control clk in AP\n"); +#endif + break; + case GF_IOC_RESET: + gf_hw_reset(gf_dev, 3); + break; + case GF_IOC_COOLBOOT: + gf_power_off(gf_dev); + mdelay(5); + gf_power_on(gf_dev); + break; + case GF_IOC_SENDKEY: + if (copy_from_user + (&gf_key, (struct gf_key *)arg, sizeof(struct gf_key))) { + pr_warn("Failed to copy data from user space.\n"); + retval = -EFAULT; + break; + } + + for (i = 0; i < ARRAY_SIZE(key_map); i++) { + if (key_map[i].val == gf_key.key) { + if (KEY_CAMERA == gf_key.key) { + input_report_key(gf_dev->input, KEY_SELECT, gf_key.value); + input_sync(gf_dev->input); + } else{ + input_report_key(gf_dev->input, gf_key.key, gf_key.value); + input_sync(gf_dev->input); + + } + break; + } + } + if (i == ARRAY_SIZE(key_map)) { + pr_warn("key %d not support yet \n", gf_key.key); + retval = -EFAULT; + } + + break; + case GF_IOC_CLK_READY: +#ifdef AP_CONTROL_CLK + gfspi_ioctl_clk_enable(gf_dev); +#else + pr_info("Doesn't support control clock.\n"); +#endif + break; + case GF_IOC_CLK_UNREADY: +#ifdef AP_CONTROL_CLK + gfspi_ioctl_clk_disable(gf_dev); +#else + pr_info("Doesn't support control clock.\n"); +#endif + break; + case GF_IOC_PM_FBCABCK: + __put_user(gf_dev->fb_black, (u8 __user *) arg); + break; + case GF_IOC_POWER_ON: + if (gf_dev->device_available == 1) + pr_info("Sensor has already powered-on.\n"); + else + gf_power_on(gf_dev); + gf_dev->device_available = 1; + break; + case GF_IOC_POWER_OFF: + if (gf_dev->device_available == 0) + pr_info("Sensor has already powered-off.\n"); + else + gf_power_off(gf_dev); + gf_dev->device_available = 0; + break; + default: + gf_dbg("Unsupport cmd:0x%x\n", cmd); + break; + } + + FUNC_EXIT(); + return retval; +} + +#ifdef CONFIG_COMPAT +static long +gf_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + return gf_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); +} +#endif /*CONFIG_COMPAT*/ + +static void notification_work(struct work_struct *work) +{ + mdss_prim_panel_fb_unblank(FP_UNLOCK_REJECTION_TIMEOUT); + pr_debug("unblank\n"); +} + +static irqreturn_t gf_irq(int irq, void *handle) +{ + +#if defined(GF_NETLINK_ENABLE) + + struct gf_dev *gf_dev = &gf; + char temp = GF_NET_EVENT_IRQ; + gf_dbg("enter irq %s\n", __func__); + + wake_lock_timeout(&gf_dev->ttw_wl, msecs_to_jiffies(WAKELOCK_HOLD_TIME)); + + sendnlmsg(&temp); + if ((gf_dev->wait_finger_down == true) && (gf_dev->device_available == 1) && (gf_dev->fb_black == 1)) { + gf_dev->wait_finger_down = false; + schedule_work(&gf_dev->work); + } +#elif defined (GF_FASYNC) + + struct gf_dev *gf_dev = &gf; + if (gf_dev->async) + kill_fasync(&gf_dev->async, SIGIO, POLL_IN); +#endif + + return IRQ_HANDLED; + +} + +static int driver_init_partial(struct gf_dev *gf_dev) +{ + int ret = 0; + FUNC_ENTRY(); + pr_warn("--------driver_init_partial start.--------\n"); + + gf_dev->device_available = 1; + + if (gf_parse_dts(gf_dev)) + goto error; + + gf_dev->irq = gf_irq_num(gf_dev); + ret = devm_request_threaded_irq(&gf_dev->spi->dev, + gf_dev->irq, + NULL, + gf_irq, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "gf", gf_dev); + if (ret) { + pr_err("Could not request irq %d\n", gpio_to_irq(gf_dev->irq_gpio)); + goto error; + } + if (!ret) { + enable_irq_wake(gf_dev->irq); + gf_enable_irq(gf_dev); + gf_disable_irq(gf_dev); + } + + gf_hw_reset(gf_dev, 360); + + FUNC_EXIT(); + return 0; + +error: + + gf_cleanup(gf_dev); + + gf_dev->device_available = 0; + + return -EPERM; + + +} +static int gf_open(struct inode *inode, struct file *filp) +{ + struct gf_dev *gf_dev; + int status = -ENXIO; + + FUNC_ENTRY(); + mutex_lock(&device_list_lock); + + list_for_each_entry(gf_dev, &device_list, device_entry) { + if (gf_dev->devt == inode->i_rdev) { + gf_dbg("Found\n"); + status = 0; + break; + } + } + + if (status == 0) { + if (status == 0) { + gf_dev->users++; + filp->private_data = gf_dev; + nonseekable_open(inode, filp); + gf_dbg("Succeed to open device. irq = %d\n", + gf_dev->irq); + + gf_dev->device_available = 1; + } + } else { + gf_dbg("No device for minor %d\n", iminor(inode)); + } + mutex_unlock(&device_list_lock); + FUNC_EXIT(); + return status; +} + +#ifdef GF_FASYNC +static int gf_fasync(int fd, struct file *filp, int mode) +{ + struct gf_dev *gf_dev = filp->private_data; + int ret; + + FUNC_ENTRY(); + ret = fasync_helper(fd, filp, mode, &gf_dev->async); + FUNC_EXIT(); + gf_dbg("ret = %d\n", ret); + return ret; +} +#endif + +static int gf_release(struct inode *inode, struct file *filp) +{ + struct gf_dev *gf_dev; + int status = 0; + + FUNC_ENTRY(); + mutex_lock(&device_list_lock); + gf_dev = filp->private_data; + filp->private_data = NULL; + + gf_dev->users--; + if (!gf_dev->users) { + + gf_dbg("disble_irq. irq = %d\n", gf_dev->irq); + gf_disable_irq(gf_dev); + + + + + devm_free_irq(&gf_dev->spi->dev, gf_dev->irq, gf_dev); + + /*power off the sensor*/ + gf_dev->device_available = 0; + gf_power_off(gf_dev); + } + mutex_unlock(&device_list_lock); + FUNC_EXIT(); + + return status; +} + +static const struct file_operations gf_fops = { + .owner = THIS_MODULE, + /* REVISIT switch to aio primitives, so that userspace + * gets more complete API coverage. It'll simplify things + * too, except for the locking. + */ + .unlocked_ioctl = gf_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = gf_compat_ioctl, +#endif /*CONFIG_COMPAT*/ + .open = gf_open, + .release = gf_release, +#ifdef GF_FASYNC + .fasync = gf_fasync, +#endif +}; + +static int goodix_fb_state_chg_callback(struct notifier_block *nb, + unsigned long val, void *data) +{ + struct gf_dev *gf_dev; + struct fb_event *evdata = data; + unsigned int blank; + +#if defined(GF_NETLINK_ENABLE) + char temp = 0; +#endif + + if (val != FB_EVENT_BLANK) + return 0; + pr_info("[info] %s go to the goodix_fb_state_chg_callback value = %d\n", + __func__, (int)val); + gf_dev = container_of(nb, struct gf_dev, notifier); + if (evdata && evdata->data && val == FB_EVENT_BLANK && gf_dev) { + blank = *(int *)(evdata->data); + switch (blank) { + case FB_BLANK_POWERDOWN: + if (gf_dev->device_available == 1) { + gf_dev->fb_black = 1; + gf_dev->wait_finger_down = true; +#if defined(GF_NETLINK_ENABLE) + temp = GF_NET_EVENT_FB_BLACK; + sendnlmsg(&temp); +#elif defined (GF_FASYNC) + if (gf_dev->async) { + kill_fasync(&gf_dev->async, SIGIO, + POLL_IN); + } +#endif + /*device unavailable */ + + } + break; + case FB_BLANK_UNBLANK: + if (gf_dev->device_available == 1) { + gf_dev->fb_black = 0; +#if defined(GF_NETLINK_ENABLE) + temp = GF_NET_EVENT_FB_UNBLACK; + sendnlmsg(&temp); +#elif defined (GF_FASYNC) + if (gf_dev->async) { + kill_fasync(&gf_dev->async, SIGIO, + POLL_IN); + } +#endif + /*device available */ + + } + break; + default: + pr_info("%s defalut\n", __func__); + break; + } + } + return NOTIFY_OK; +} + +static struct notifier_block goodix_noti_block = { + .notifier_call = goodix_fb_state_chg_callback, +}; + +static void gf_reg_key_kernel(struct gf_dev *gf_dev) +{ + int i; + + set_bit(EV_KEY, gf_dev->input->evbit); + for (i = 0; i < ARRAY_SIZE(key_map); i++) { + set_bit(key_map[i].val, gf_dev->input->keybit); + } + + gf_dev->input->name = GF_INPUT_NAME; + if (input_register_device(gf_dev->input)) + pr_warn("Failed to register GF as input device.\n"); +} + + +#if defined(USE_SPI_BUS) +static int gf_probe(struct spi_device *spi) +#elif defined(USE_PLATFORM_BUS) +static int gf_probe(struct platform_device *pdev) +#endif +{ + struct gf_dev *gf_dev = &gf; + int status = -EINVAL; + unsigned long minor; + + FUNC_ENTRY(); + + pr_warn("--------gf_probe start.--------\n"); + /* Initialize the driver data */ + INIT_LIST_HEAD(&gf_dev->device_entry); + +#if defined(USE_SPI_BUS) + gf_dev->spi = spi; +#elif defined(USE_PLATFORM_BUS) + gf_dev->spi = pdev; +#endif + + gf_dev->irq_gpio = -EINVAL; + gf_dev->reset_gpio = -EINVAL; + gf_dev->pwr_gpio = -EINVAL; + gf_dev->device_available = 0; + gf_dev->fb_black = 0; + gf_dev->irq_enabled = 0; + gf_dev->fingerprint_pinctrl = NULL; + gf_dev->wait_finger_down = false; + INIT_WORK(&gf_dev->work, notification_work); + + /* If we can allocate a minor number, hook up this device. + * Reusing minors is fine so long as udev or mdev is working. + */ + mutex_lock(&device_list_lock); + minor = find_first_zero_bit(minors, N_SPI_MINORS); + if (minor < N_SPI_MINORS) { + struct device *dev; + + gf_dev->devt = MKDEV(SPIDEV_MAJOR, minor); + dev = device_create(gf_class, &gf_dev->spi->dev, gf_dev->devt, + gf_dev, GF_DEV_NAME); + status = IS_ERR(dev) ? PTR_ERR(dev) : 0; + } else { + dev_dbg(&gf_dev->spi->dev, "no minor number available!\n"); + status = -ENODEV; + } + + if (status == 0) { + set_bit(minor, minors); + list_add(&gf_dev->device_entry, &device_list); + } else { + gf_dev->devt = 0; + } + mutex_unlock(&device_list_lock); + + if (status == 0) { + /*input device subsystem */ + gf_dev->input = input_allocate_device(); + if (gf_dev->input == NULL) { + dev_dbg(&gf_dev->input->dev, + "Faile to allocate input device.\n"); + status = -ENOMEM; + goto error; + } +#ifdef AP_CONTROL_CLK + pr_info("Get the clk resource.\n"); + /* Enable spi clock */ + if (gfspi_ioctl_clk_init(gf_dev)) + goto gfspi_probe_clk_init_failed; + + + if (gfspi_ioctl_clk_enable(gf_dev)) + goto gfspi_probe_clk_enable_failed; + + spi_clock_set(gf_dev, 4.8*1000*1000); +#endif + + gf_dev->notifier = goodix_noti_block; + fb_register_client(&gf_dev->notifier); + gf_reg_key_kernel(gf_dev); + + wake_lock_init(&gf_dev->ttw_wl, WAKE_LOCK_SUSPEND, "goodix_ttw_wl"); + } + + pr_warn("--------gf_probe end---OK.--------\n"); + return status; + +error: + gf_cleanup(gf_dev); + gf_dev->device_available = 0; + if (gf_dev->devt != 0) { + pr_info("Err: status = %d\n", status); + mutex_lock(&device_list_lock); + list_del(&gf_dev->device_entry); + device_destroy(gf_class, gf_dev->devt); + clear_bit(MINOR(gf_dev->devt), minors); + mutex_unlock(&device_list_lock); + +#ifdef AP_CONTROL_CLK +gfspi_probe_clk_enable_failed: + gfspi_ioctl_clk_uninit(gf_dev); +gfspi_probe_clk_init_failed: +#endif + if (gf_dev->input != NULL) + input_unregister_device(gf_dev->input); + } + + FUNC_EXIT(); + return status; +} + +/*static int __devexit gf_remove(struct spi_device *spi)*/ +#if defined(USE_SPI_BUS) +static int gf_remove(struct spi_device *spi) +#elif defined(USE_PLATFORM_BUS) +static int gf_remove(struct platform_device *pdev) +#endif +{ + struct gf_dev *gf_dev = &gf; + FUNC_ENTRY(); + + /* make sure ops on existing fds can abort cleanly */ + if (gf_dev->irq) + free_irq(gf_dev->irq, gf_dev); + + if (gf_dev->input != NULL) + input_unregister_device(gf_dev->input); + input_free_device(gf_dev->input); + + /* prevent new opens */ + mutex_lock(&device_list_lock); + list_del(&gf_dev->device_entry); + device_destroy(gf_class, gf_dev->devt); + clear_bit(MINOR(gf_dev->devt), minors); + if (gf_dev->users == 0) + kfree(gf_dev); + + mutex_unlock(&device_list_lock); + + wake_lock_destroy(&gf_dev->ttw_wl); + + FUNC_EXIT(); + return 0; +} + +#if defined(USE_SPI_BUS) +static int gf_suspend(struct spi_device *spi, pm_message_t mesg) +#elif defined(USE_PLATFORM_BUS) +static int gf_suspend(struct platform_device *pdev, pm_message_t state) +#endif +{ + + gf_dbg("gf_suspend_test.\n"); + return 0; +} + +#if defined(USE_SPI_BUS) +static int gf_resume(struct spi_device *spi) +#elif defined(USE_PLATFORM_BUS) +static int gf_resume(struct platform_device *pdev) +#endif +{ + gf_dbg("gf_resume_test.\n"); + return 0; +} + +static struct of_device_id gx_match_table[] = { + {.compatible = GF_SPIDEV_NAME,}, + {}, +}; + +#if defined(USE_SPI_BUS) +static struct spi_driver gf_driver = { +#elif defined(USE_PLATFORM_BUS) +static struct platform_driver gf_driver = { +#endif + .driver = { + .name = GF_DEV_NAME, + .owner = THIS_MODULE, +#if defined(USE_SPI_BUS) + +#endif + .of_match_table = gx_match_table, + }, + .probe = gf_probe, + .remove = gf_remove, + .suspend = gf_suspend, + .resume = gf_resume, +}; + +static int __init gf_init(void) +{ + int status; + FUNC_ENTRY(); + + pr_warn("--------gf_init start.--------\n"); + /* Claim our 256 reserved device numbers. Then register a class + * that will key udev/mdev to add/remove /dev nodes. Last, register + * the driver which manages those device numbers. + */ + + BUILD_BUG_ON(N_SPI_MINORS > 256); + status = register_chrdev(SPIDEV_MAJOR, CHRD_DRIVER_NAME, &gf_fops); + if (status < 0) { + pr_warn("Failed to register char device!\n"); + FUNC_EXIT(); + return status; + } + gf_class = class_create(THIS_MODULE, CLASS_NAME); + if (IS_ERR(gf_class)) { + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); + pr_warn("Failed to create class.\n"); + FUNC_EXIT(); + return PTR_ERR(gf_class); + } +#if defined(USE_PLATFORM_BUS) + status = platform_driver_register(&gf_driver); +#elif defined(USE_SPI_BUS) + status = spi_register_driver(&gf_driver); +#endif + if (status < 0) { + class_destroy(gf_class); + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); + pr_warn("Failed to register SPI driver.\n"); + } + +#ifdef GF_NETLINK_ENABLE + netlink_init(); +#endif + pr_info(" status = 0x%x\n", status); + FUNC_EXIT(); + + pr_warn("--------gf_init end---OK.--------\n"); + return 0; +} + +module_init(gf_init); + +static void __exit gf_exit(void) +{ + FUNC_ENTRY(); +#ifdef GF_NETLINK_ENABLE + netlink_exit(); +#endif +#if defined(USE_PLATFORM_BUS) + platform_driver_unregister(&gf_driver); +#elif defined(USE_SPI_BUS) + spi_unregister_driver(&gf_driver); +#endif + class_destroy(gf_class); + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); + FUNC_EXIT(); +} + +module_exit(gf_exit); + +MODULE_AUTHOR("Jiangtao Yi, "); +MODULE_DESCRIPTION("User mode SPI device interface"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("spi:gf-spi"); diff --git a/drivers/fingerprint/goodix/gf_spi.h b/drivers/fingerprint/goodix/gf_spi.h new file mode 100755 index 0000000000000..bcbe4d98740ee --- /dev/null +++ b/drivers/fingerprint/goodix/gf_spi.h @@ -0,0 +1,108 @@ +#ifndef __GF_SPI_H +#define __GF_SPI_H + +#include +#include +#include +/**********************************************************/ +enum FP_MODE{ + GF_IMAGE_MODE = 0, + GF_KEY_MODE, + GF_SLEEP_MODE, + GF_FF_MODE, + GF_DEBUG_MODE = 0x56 +}; + +struct gf_key { + unsigned int key; + int value; +}; + + +struct gf_key_map { + char *name; + unsigned short val; +}; + +#define GF_IOC_MAGIC 'G' +#define GF_IOC_DISABLE_IRQ _IO(GF_IOC_MAGIC, 0) +#define GF_IOC_ENABLE_IRQ _IO(GF_IOC_MAGIC, 1) +#define GF_IOC_SETSPEED _IOW(GF_IOC_MAGIC, 2, unsigned int) +#define GF_IOC_RESET _IO(GF_IOC_MAGIC, 3) +#define GF_IOC_COOLBOOT _IO(GF_IOC_MAGIC, 4) +#define GF_IOC_SENDKEY _IOW(GF_IOC_MAGIC, 5, struct gf_key) +#define GF_IOC_CLK_READY _IO(GF_IOC_MAGIC, 6) +#define GF_IOC_CLK_UNREADY _IO(GF_IOC_MAGIC, 7) +#define GF_IOC_PM_FBCABCK _IO(GF_IOC_MAGIC, 8) +#define GF_IOC_POWER_ON _IO(GF_IOC_MAGIC, 9) +#define GF_IOC_POWER_OFF _IO(GF_IOC_MAGIC, 10) +#define GF_IOC_ENABLE_GPIO _IO(GF_IOC_MAGIC, 11) +#define GF_IOC_RELEASE_GPIO _IO(GF_IOC_MAGIC, 12) + +#define GF_IOC_MAXNR 13 + + +#define USE_PLATFORM_BUS 1 + + +#define GF_NETLINK_ENABLE 1 +#define GF_NET_EVENT_IRQ 0 +#define GF_NET_EVENT_FB_BLACK 1 +#define GF_NET_EVENT_FB_UNBLACK 2 + + +static const char * const pctl_names[] = { + + "goodixfp_reset_reset", + "goodixfp_reset_active", + "goodixfp_irq_active", +}; + + +struct gf_dev { + dev_t devt; + struct list_head device_entry; +#if defined(USE_SPI_BUS) + struct spi_device *spi; +#elif defined(USE_PLATFORM_BUS) + struct platform_device *spi; +#endif + struct clk *core_clk; + struct clk *iface_clk; + + struct pinctrl *fingerprint_pinctrl; + struct pinctrl_state *pinctrl_state[ARRAY_SIZE(pctl_names)]; + + struct input_dev *input; + /* buffer is NULL unless this device is open (users > 0) */ + unsigned users; + signed irq_gpio; + signed reset_gpio; + signed pwr_gpio; + int irq; + int irq_enabled; + int clk_enabled; +#ifdef GF_FASYNC + struct fasync_struct *async; +#endif + struct notifier_block notifier; + char device_available; + char fb_black; + struct wake_lock ttw_wl; + char wait_finger_down; + struct work_struct work; +}; + +int gf_parse_dts(struct gf_dev *gf_dev); +void gf_cleanup(struct gf_dev *gf_dev); + +int gf_power_on(struct gf_dev *gf_dev); +int gf_power_off(struct gf_dev *gf_dev); + +int gf_hw_reset(struct gf_dev *gf_dev, unsigned int delay_ms); +int gf_irq_num(struct gf_dev *gf_dev); + +void sendnlmsg(char *message); +int netlink_init(void); +void netlink_exit(void); +#endif /*__GF_SPI_H*/ diff --git a/drivers/fingerprint/goodix/netlink.c b/drivers/fingerprint/goodix/netlink.c new file mode 100755 index 0000000000000..e53bb41d23f0f --- /dev/null +++ b/drivers/fingerprint/goodix/netlink.c @@ -0,0 +1,97 @@ +#include +#include +#include +#include +#include +#include +#include + +#define NETLINK_TEST 25 +#define MAX_MSGSIZE 4*1024 +int stringlength(char *s); +void sendnlmsg(char *message); +int pid; +int err; +struct sock *nl_sk = NULL; +int flag = 0; + + +struct gf_uk_channel{ + int channel_id; + int reserved; + char buf[3*1024]; + int len; +}; + + +void sendnlmsg(char *message) +{ + struct sk_buff *skb_1; + struct nlmsghdr *nlh; + int len = NLMSG_SPACE(MAX_MSGSIZE); + int slen = 0; + if (!message || !nl_sk) { + return ; + } + skb_1 = alloc_skb(len, GFP_KERNEL); + if (!skb_1) { + printk(KERN_ERR "my_net_link:alloc_skb_1 error\n"); + } + slen = strlen(message); + nlh = nlmsg_put(skb_1, 0, 0, 0, MAX_MSGSIZE, 0); + + NETLINK_CB(skb_1).portid = 0; + NETLINK_CB(skb_1).dst_group = 0; + + message[slen] = '\0'; + memcpy(NLMSG_DATA(nlh), message, slen+1); + + + netlink_unicast(nl_sk, skb_1, pid, MSG_DONTWAIT); + +} + + +void nl_data_ready(struct sk_buff *__skb) +{ + struct sk_buff *skb; + struct nlmsghdr *nlh; + char str[100]; + skb = skb_get (__skb); + if (skb->len >= NLMSG_SPACE(0)) { + nlh = nlmsg_hdr(skb); + + memcpy(str, NLMSG_DATA(nlh), sizeof(str)); + pid = nlh->nlmsg_pid; + kfree_skb(skb); + } + +} + + +int netlink_init(void) +{ + + struct netlink_kernel_cfg netlink_cfg; + netlink_cfg.groups = 0; + netlink_cfg.flags = 0; + netlink_cfg.input = nl_data_ready; + netlink_cfg.cb_mutex = NULL; + + nl_sk = netlink_kernel_create(&init_net, NETLINK_TEST, &netlink_cfg); + + if (!nl_sk) { + printk(KERN_ERR "my_net_link: create netlink socket error.\n"); + return 1; + } + return 0; +} + +void netlink_exit(void) +{ + if (nl_sk != NULL) { + sock_release(nl_sk->sk_socket); + } + + printk("my_net_link: self module exited\n"); +} diff --git a/drivers/fingerprint/goodix/platform.c b/drivers/fingerprint/goodix/platform.c new file mode 100755 index 0000000000000..131970b30cf27 --- /dev/null +++ b/drivers/fingerprint/goodix/platform.c @@ -0,0 +1,198 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "gf_spi.h" + +#if defined(USE_SPI_BUS) +#include +#include +#elif defined(USE_PLATFORM_BUS) +#include +#endif + +#define gf_dbg(fmt, args...) do { \ + pr_warn("gf:" fmt, ##args);\ + } while (0) + + +static int gf3208_request_named_gpio(struct gf_dev *gf_dev, const char *label, int *gpio) +{ + struct device *dev = &gf_dev->spi->dev; + struct device_node *np = dev->of_node; + int rc = of_get_named_gpio(np, label, 0); + if (rc < 0) { + dev_err(dev, "failed to get '%s'\n", label); + return rc; + } + *gpio = rc; + rc = devm_gpio_request(dev, *gpio, label); + if (rc) { + dev_err(dev, "failed to request gpio %d\n", *gpio); + return rc; + } + dev_err(dev, "%s %d\n", label, *gpio); + return 0; +} + +static int select_pin_ctl(struct gf_dev *gf_dev, const char *name) +{ + size_t i; + int rc; + struct device *dev = &gf_dev->spi->dev; + + for (i = 0; i < ARRAY_SIZE(gf_dev->pinctrl_state); i++) { + const char *n = pctl_names[i]; + if (!strncmp(n, name, strlen(n))) { + rc = pinctrl_select_state(gf_dev->fingerprint_pinctrl, gf_dev->pinctrl_state[i]); + + if (rc) + dev_err(dev, "cannot select '%s'\n", name); + else + dev_err(dev, "Selected '%s'\n", name); + goto exit; + } + } + rc = -EINVAL; + dev_err(dev, "%s:'%s' not found\n", __func__, name); +exit: + return rc; +} + + +/*GPIO pins reference.*/ +int gf_parse_dts(struct gf_dev *gf_dev) +{ + int rc = 0; + int i = 0; + pr_warn("--------gf_parse_dts start.--------\n"); + + /*get reset resource*/ + rc = gf3208_request_named_gpio(gf_dev, "goodix, gpio_reset", &gf_dev->reset_gpio); + if (rc) { + + gf_dbg("Failed to request RESET GPIO. rc = %d\n", rc); + return -EPERM; + } + + /*get irq resourece*/ + rc = gf3208_request_named_gpio(gf_dev, "goodix, gpio_irq", &gf_dev->irq_gpio); + if (rc) { + gf_dbg("Failed to request IRQ GPIO. rc = %d\n", rc); + return -EPERM; + } + + gf_dev->fingerprint_pinctrl = devm_pinctrl_get(&gf_dev->spi->dev); + for (i = 0; i < ARRAY_SIZE(gf_dev->pinctrl_state); i++) { + const char *n = pctl_names[i]; + struct pinctrl_state *state = + pinctrl_lookup_state(gf_dev->fingerprint_pinctrl, n); + if (IS_ERR(state)) { + pr_err("cannot find '%s'\n", n); + rc = -EINVAL; + } + pr_info("found pin control %s\n", n); + gf_dev->pinctrl_state[i] = state; + } + + rc = select_pin_ctl(gf_dev, "goodixfp_reset_active"); + if (rc) + goto exit; + rc = select_pin_ctl(gf_dev, "goodixfp_irq_active"); + if (rc) + goto exit; + pr_warn("--------gf_parse_dts end---OK.--------\n"); + +exit: + return rc; +} + +void gf_cleanup(struct gf_dev *gf_dev) +{ + gf_dbg("[info] enter%s\n", __func__); + + if (gpio_is_valid(gf_dev->irq_gpio)) { + + devm_gpio_free(&gf_dev->spi->dev, gf_dev->irq_gpio); + gf_dbg("remove irq_gpio success\n"); + } + + if (gpio_is_valid(gf_dev->reset_gpio)) { + + devm_gpio_free(&gf_dev->spi->dev, gf_dev->reset_gpio); + gf_dbg("remove reset_gpio success\n"); + } + + if (gf_dev->fingerprint_pinctrl != NULL) { + devm_pinctrl_put(gf_dev->fingerprint_pinctrl); + gf_dev->fingerprint_pinctrl = NULL; + gf_dbg("gx fingerprint_pinctrl release success\n"); + } +} + +/*power management*/ +int gf_power_on(struct gf_dev *gf_dev) +{ + int rc = 0; + msleep(10); + pr_info("---- power on ok ----\n"); + + return rc; +} + +int gf_power_off(struct gf_dev *gf_dev) +{ + int rc = 0; + pr_info("---- power off ----\n"); + return rc; +} + +static int hw_reset(struct gf_dev *gf_dev) +{ + int irq_gpio; + struct device *dev = &gf_dev->spi->dev; + int rc = select_pin_ctl(gf_dev, "goodixfp_reset_reset"); + if (rc) + goto exit; + mdelay(3); + + rc = select_pin_ctl(gf_dev, "goodixfp_reset_active"); + if (rc) + goto exit; + + irq_gpio = gpio_get_value(gf_dev->irq_gpio); + dev_info(dev, "IRQ after reset %d\n", irq_gpio); +exit: + return rc; +} + + +/******************************************************************** + *CPU output low level in RST pin to reset GF. This is the MUST action for GF. + *Take care of this function. IO Pin driver strength / glitch and so on. + ********************************************************************/ +int gf_hw_reset(struct gf_dev *gf_dev, unsigned int delay_ms) +{ + if (gf_dev == NULL) { + pr_info("Input buff is NULL.\n"); + return -EPERM; + } + hw_reset(gf_dev); + mdelay(delay_ms); + return 0; +} + +int gf_irq_num(struct gf_dev *gf_dev) +{ + if (gf_dev == NULL) { + pr_info("Input buff is NULL.\n"); + return -EPERM; + } else { + return gpio_to_irq(gf_dev->irq_gpio); + } +} + diff --git a/drivers/fingerprintrosy/Kconfig b/drivers/fingerprintrosy/Kconfig new file mode 100755 index 0000000000000..8911f4ea55903 --- /dev/null +++ b/drivers/fingerprintrosy/Kconfig @@ -0,0 +1,8 @@ +config FINGERPRINT_ROSY + tristate "ROSY Fingerprint driver support" + help + Say Y here to enable goodix fingerprint driver support! + +source "drivers/fingerprintrosy/goodixrosy/Kconfig" +source "drivers/fingerprintrosy/fpcrosy/Kconfig" + diff --git a/drivers/fingerprintrosy/Makefile b/drivers/fingerprintrosy/Makefile new file mode 100755 index 0000000000000..572f9928d6a5f --- /dev/null +++ b/drivers/fingerprintrosy/Makefile @@ -0,0 +1,3 @@ +obj-$(CONFIG_FINGERPRINT_GOODIX_GF3208_ROSY) += goodixrosy/ +obj-$(CONFIG_FINGERPRINT_FPC1020_ROSY) += fpcrosy/ + diff --git a/drivers/fingerprintrosy/fpcrosy/Kconfig b/drivers/fingerprintrosy/fpcrosy/Kconfig new file mode 100755 index 0000000000000..71cd2a83e4a7d --- /dev/null +++ b/drivers/fingerprintrosy/fpcrosy/Kconfig @@ -0,0 +1,6 @@ +config FINGERPRINT_FPC1020_ROSY + tristate "FingerPrint Cards fingerprint drvier support" + depends on FINGERPRINT_ROSY + help + Say Y here to enable goodix fingerprint driver support! + diff --git a/drivers/fingerprintrosy/fpcrosy/Makefile b/drivers/fingerprintrosy/fpcrosy/Makefile new file mode 100755 index 0000000000000..57eaf267c406d --- /dev/null +++ b/drivers/fingerprintrosy/fpcrosy/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_FINGERPRINT_FPC1020_ROSY) += fpc1020_tee.o diff --git a/drivers/fingerprintrosy/fpcrosy/fpc1020_tee.c b/drivers/fingerprintrosy/fpcrosy/fpc1020_tee.c new file mode 100644 index 0000000000000..8539a6a794e66 --- /dev/null +++ b/drivers/fingerprintrosy/fpcrosy/fpc1020_tee.c @@ -0,0 +1,647 @@ +/* + * FPC1020 Fingerprint sensor device driver + * + * This driver will control the platform resources that the FPC fingerprint + * sensor needs to operate. The major things are probing the sensor to check + * that it is actually connected and let the Kernel know this and with that also + * enabling and disabling of regulators, controlling GPIOs such as sensor reset + * line, sensor IRQ line. + * + * The driver will expose most of its available functionality in sysfs which + * enables dynamic control of these features from eg. a user space process. + * + * The sensor's IRQ events will be pushed to Kernel's event handling system and + * are exposed in the drivers event node. + * + * This driver will NOT send any commands to the sensor it only controls the + * electrical parts. + * + * + * Copyright (c) 2015 Fingerprint Cards AB + * Copyright (C) 2018 XiaoMi, 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. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define FPC_TTW_HOLD_TIME 2000 +#define FP_UNLOCK_REJECTION_TIMEOUT (FPC_TTW_HOLD_TIME - 500) + + +#define RESET_LOW_SLEEP_MIN_US 5000 +#define RESET_LOW_SLEEP_MAX_US (RESET_LOW_SLEEP_MIN_US + 100) +#define RESET_HIGH_SLEEP1_MIN_US 100 +#define RESET_HIGH_SLEEP1_MAX_US (RESET_HIGH_SLEEP1_MIN_US + 100) +#define RESET_HIGH_SLEEP2_MIN_US 5000 +#define RESET_HIGH_SLEEP2_MAX_US (RESET_HIGH_SLEEP2_MIN_US + 100) +#define PWR_ON_SLEEP_MIN_US 100 +#define PWR_ON_SLEEP_MAX_US (PWR_ON_SLEEP_MIN_US + 900) + +#define NUM_PARAMS_REG_ENABLE_SET 2 + +static const char * const pctl_names[] = { + "fpc1020_reset_reset", + "fpc1020_reset_active", + "fpc1020_irq_active", +}; + +struct fpc1020_data { + struct device *dev; + + struct pinctrl *fingerprint_pinctrl; + struct pinctrl_state *pinctrl_state[ARRAY_SIZE(pctl_names)]; + + + struct wake_lock ttw_wl; + int irq_gpio; + int rst_gpio; + struct mutex lock; /* To set/get exported values in sysfs */ + bool prepared; + bool compatible_enabled; + atomic_t wakeup_enabled; /* Used both in ISR and non-ISR */ + + struct notifier_block fb_notifier; + bool fb_black; + bool wait_finger_down; + struct work_struct work; + +}; + +static irqreturn_t fpc1020_irq_handler(int irq, void *handle); +static int fpc1020_request_named_gpio(struct fpc1020_data *fpc1020, + const char *label, int *gpio); +static int hw_reset(struct fpc1020_data *fpc1020); + +/** + * sysfs node for controlling clocks. + * + * This is disabled in platform variant of this driver but kept for + * backwards compatibility. Only prints a debug print that it is + * disabled. + */ +static ssize_t clk_enable_set(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + dev_dbg(dev, + "clk_enable sysfs node not enabled in platform driver\n"); + + return count; +} +static DEVICE_ATTR(clk_enable, S_IWUSR, NULL, clk_enable_set); + +/** + * Will try to select the set of pins (GPIOS) defined in a pin control node of + * the device tree named @p name. + * + * The node can contain several eg. GPIOs that is controlled when selecting it. + * The node may activate or deactivate the pins it contains, the action is + * defined in the device tree node itself and not here. The states used + * internally is fetched at probe time. + * + * @see pctl_names + * @see fpc1020_probe + */ +static int select_pin_ctl(struct fpc1020_data *fpc1020, const char *name) +{ + size_t i; + int rc; + struct device *dev = fpc1020->dev; + + for (i = 0; i < ARRAY_SIZE(fpc1020->pinctrl_state); i++) { + const char *n = pctl_names[i]; + + if (!strncmp(n, name, strlen(n))) { + rc = pinctrl_select_state(fpc1020->fingerprint_pinctrl, + fpc1020->pinctrl_state[i]); + if (rc) + dev_err(dev, "cannot select '%s'\n", name); + else + dev_dbg(dev, "Selected '%s'\n", name); + goto exit; + } + } + + rc = -EINVAL; + dev_err(dev, "%s:'%s' not found\n", __func__, name); + +exit: + return rc; +} + +static ssize_t pinctl_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + int rc; + + mutex_lock(&fpc1020->lock); + rc = select_pin_ctl(fpc1020, buf); + mutex_unlock(&fpc1020->lock); + + return rc ? rc : count; +} +static DEVICE_ATTR(pinctl_set, S_IWUSR, NULL, pinctl_set); + +static int hw_reset(struct fpc1020_data *fpc1020) +{ + int irq_gpio; + struct device *dev = fpc1020->dev; + int rc = select_pin_ctl(fpc1020, "fpc1020_reset_active"); + + if (rc) + goto exit; + usleep_range(RESET_HIGH_SLEEP1_MIN_US, RESET_HIGH_SLEEP1_MAX_US); + + rc = select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + if (rc) + goto exit; + usleep_range(RESET_LOW_SLEEP_MIN_US, RESET_LOW_SLEEP_MAX_US); + + rc = select_pin_ctl(fpc1020, "fpc1020_reset_active"); + if (rc) + goto exit; + usleep_range(RESET_HIGH_SLEEP2_MIN_US, RESET_HIGH_SLEEP2_MAX_US); + + irq_gpio = gpio_get_value(fpc1020->irq_gpio); + dev_info(dev, "IRQ after reset %d\n", irq_gpio); + +exit: + return rc; +} + +static ssize_t hw_reset_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + if (!strncmp(buf, "reset", strlen("reset"))) { + mutex_lock(&fpc1020->lock); + rc = hw_reset(fpc1020); + mutex_unlock(&fpc1020->lock); + } else { + return -EINVAL; + } + + return rc ? rc : count; +} +static DEVICE_ATTR(hw_reset, S_IWUSR, NULL, hw_reset_set); + +/** + * Will setup GPIOs, and regulators to correctly initialize the touch sensor to + * be ready for work. + * + * In the correct order according to the sensor spec this function will + * enable/disable regulators, and reset line, all to set the sensor in a + * correct power on or off state "electrical" wise. + * + * @see device_prepare_set + * @note This function will not send any commands to the sensor it will only + * control it "electrically". + */ +static int device_prepare(struct fpc1020_data *fpc1020, bool enable) +{ + int rc; + + mutex_lock(&fpc1020->lock); + if (enable && !fpc1020->prepared) { + fpc1020->prepared = true; + select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + + usleep_range(PWR_ON_SLEEP_MIN_US, PWR_ON_SLEEP_MAX_US); + + /* As we can't control chip select here the other part of the + * sensor driver eg. the TEE driver needs to do a _SOFT_ reset + * on the sensor after power up to be sure that the sensor is + * in a good state after power up. Okeyed by ASIC. */ + + (void)select_pin_ctl(fpc1020, "fpc1020_reset_active"); + } else if (!enable && fpc1020->prepared) { + rc = 0; + (void)select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + + usleep_range(PWR_ON_SLEEP_MIN_US, PWR_ON_SLEEP_MAX_US); + fpc1020->prepared = false; + } else { + rc = 0; + } + mutex_unlock(&fpc1020->lock); + + return rc; +} + +/** + * sysfs node to enable/disable (power up/power down) the touch sensor + * + * @see device_prepare + */ +static ssize_t device_prepare_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + if (!strncmp(buf, "enable", strlen("enable"))) + rc = device_prepare(fpc1020, true); + else if (!strncmp(buf, "disable", strlen("disable"))) + rc = device_prepare(fpc1020, false); + else + return -EINVAL; + + return rc ? rc : count; +} +static DEVICE_ATTR(device_prepare, S_IWUSR, NULL, device_prepare_set); + +/** + * sysfs node for controlling whether the driver is allowed + * to wake up the platform on interrupt. + */ +static ssize_t wakeup_enable_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + ssize_t ret = count; + + mutex_lock(&fpc1020->lock); + if (!strncmp(buf, "enable", strlen("enable"))) + atomic_set(&fpc1020->wakeup_enabled, 1); + else if (!strncmp(buf, "disable", strlen("disable"))) + atomic_set(&fpc1020->wakeup_enabled, 1); + else + ret = -EINVAL; + mutex_unlock(&fpc1020->lock); + + return ret; +} +static DEVICE_ATTR(wakeup_enable, S_IWUSR, NULL, wakeup_enable_set); + +/** + * sysf node to check the interrupt status of the sensor, the interrupt + * handler should perform sysf_notify to allow userland to poll the node. + */ +static ssize_t irq_get(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + int irq = gpio_get_value(fpc1020->irq_gpio); + + return scnprintf(buf, PAGE_SIZE, "%i\n", irq); +} + +/** + * writing to the irq node will just drop a printk message + * and return success, used for latency measurement. + */ +static ssize_t irq_ack(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + dev_dbg(fpc1020->dev, "%s\n", __func__); + + return count; +} +static DEVICE_ATTR(irq, S_IRUSR | S_IWUSR, irq_get, irq_ack); + +static ssize_t fingerdown_wait_set(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + + dev_dbg(fpc1020->dev, "%s\n", __func__); + if (!strncmp(buf, "enable", strlen("enable"))) + fpc1020->wait_finger_down = true; + else if (!strncmp(buf, "disable", strlen("disable"))) + fpc1020->wait_finger_down = false; + else + return -EINVAL; + + return count; +} +static DEVICE_ATTR(fingerdown_wait, S_IWUSR, NULL, fingerdown_wait_set); + +static ssize_t compatible_all_set(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int rc; + int i; + int irqf; + struct fpc1020_data *fpc1020 = dev_get_drvdata(dev); + dev_err(dev, "compatible all enter %d\n", fpc1020->compatible_enabled); + if (!strncmp(buf, "enable", strlen("enable")) && fpc1020->compatible_enabled != 1) { + rc = fpc1020_request_named_gpio(fpc1020, "fpc,gpio_irq", + &fpc1020->irq_gpio); + if (rc) + goto exit; + + rc = fpc1020_request_named_gpio(fpc1020, "fpc,gpio_rst", + &fpc1020->rst_gpio); + dev_err(dev, "fpc request reset result = %d\n", rc); + if (rc) + goto exit; + fpc1020->fingerprint_pinctrl = devm_pinctrl_get(dev); + if (IS_ERR(fpc1020->fingerprint_pinctrl)) { + if (PTR_ERR(fpc1020->fingerprint_pinctrl) == -EPROBE_DEFER) { + dev_info(dev, "pinctrl not ready\n"); + rc = -EPROBE_DEFER; + goto exit; + } + dev_err(dev, "Target does not use pinctrl\n"); + fpc1020->fingerprint_pinctrl = NULL; + rc = -EINVAL; + goto exit; + } + + for (i = 0; i < ARRAY_SIZE(fpc1020->pinctrl_state); i++) { + const char *n = pctl_names[i]; + struct pinctrl_state *state = + pinctrl_lookup_state(fpc1020->fingerprint_pinctrl, n); + if (IS_ERR(state)) { + dev_err(dev, "cannot find '%s'\n", n); + rc = -EINVAL; + goto exit; + } + dev_info(dev, "found pin control %s\n", n); + fpc1020->pinctrl_state[i] = state; + } + rc = select_pin_ctl(fpc1020, "fpc1020_reset_reset"); + if (rc) + goto exit; + rc = select_pin_ctl(fpc1020, "fpc1020_irq_active"); + if (rc) + goto exit; + irqf = IRQF_TRIGGER_RISING | IRQF_ONESHOT; + if (of_property_read_bool(dev->of_node, "fpc,enable-wakeup")) { + irqf |= IRQF_NO_SUSPEND; + device_init_wakeup(dev, 1); + } + rc = devm_request_threaded_irq(dev, gpio_to_irq(fpc1020->irq_gpio), + NULL, fpc1020_irq_handler, irqf, + dev_name(dev), fpc1020); + if (rc) { + dev_err(dev, "could not request irq %d\n", + gpio_to_irq(fpc1020->irq_gpio)); + goto exit; + } + dev_dbg(dev, "requested irq %d\n", gpio_to_irq(fpc1020->irq_gpio)); + + /* Request that the interrupt should be wakeable */ + enable_irq_wake(gpio_to_irq(fpc1020->irq_gpio)); + fpc1020->compatible_enabled = 1; + if (of_property_read_bool(dev->of_node, "fpc,enable-on-boot")) { + dev_info(dev, "Enabling hardware\n"); + (void)device_prepare(fpc1020, true); +#ifdef LINUX_CONTROL_SPI_CLK + (void)set_clks(fpc1020, false); +#endif + } + } else if (!strncmp(buf, "disable", strlen("disable")) && fpc1020->compatible_enabled != 0) { + if (gpio_is_valid(fpc1020->irq_gpio)) { + devm_gpio_free(dev, fpc1020->irq_gpio); + pr_info("remove irq_gpio success\n"); + } + if (gpio_is_valid(fpc1020->rst_gpio)) { + devm_gpio_free(dev, fpc1020->rst_gpio); + pr_info("remove rst_gpio success\n"); + } + devm_free_irq(dev, gpio_to_irq(fpc1020->irq_gpio), fpc1020); + fpc1020->compatible_enabled = 0; + } + hw_reset(fpc1020); + return count; +exit: + return -EINVAL; +} +static DEVICE_ATTR(compatible_all, S_IWUSR, NULL, compatible_all_set); +static struct attribute *attributes[] = { + &dev_attr_pinctl_set.attr, + &dev_attr_device_prepare.attr, + + &dev_attr_hw_reset.attr, + &dev_attr_wakeup_enable.attr, + &dev_attr_clk_enable.attr, + &dev_attr_irq.attr, + &dev_attr_compatible_all.attr, + &dev_attr_fingerdown_wait.attr, + NULL +}; + +static const struct attribute_group attribute_group = { + .attrs = attributes, +}; + +static void notification_work(struct work_struct *work) +{ + mdss_prim_panel_fb_unblank(FP_UNLOCK_REJECTION_TIMEOUT); + pr_debug("unblank\n"); +} + +static irqreturn_t fpc1020_irq_handler(int irq, void *handle) +{ + struct fpc1020_data *fpc1020 = handle; + + dev_dbg(fpc1020->dev, "%s\n", __func__); + + if (atomic_read(&fpc1020->wakeup_enabled)) { + wake_lock_timeout(&fpc1020->ttw_wl, + msecs_to_jiffies(FPC_TTW_HOLD_TIME)); + } + + sysfs_notify(&fpc1020->dev->kobj, NULL, dev_attr_irq.attr.name); + + if (fpc1020->wait_finger_down && fpc1020->fb_black) { + pr_debug("%s enter\n", __func__); + fpc1020->wait_finger_down = false; + schedule_work(&fpc1020->work); + } + + return IRQ_HANDLED; +} + +static int fpc1020_request_named_gpio(struct fpc1020_data *fpc1020, + const char *label, int *gpio) +{ + struct device *dev = fpc1020->dev; + struct device_node *np = dev->of_node; + int rc = of_get_named_gpio(np, label, 0); + + if (rc < 0) { + dev_err(dev, "failed to get '%s'\n", label); + return rc; + } + *gpio = rc; + + rc = devm_gpio_request(dev, *gpio, label); + if (rc) { + dev_err(dev, "failed to request gpio %d\n", *gpio); + return rc; + } + dev_dbg(dev, "%s %d\n", label, *gpio); + + return 0; +} + +static int fpc_fb_notif_callback(struct notifier_block *nb, + unsigned long val, void *data) +{ + struct fpc1020_data *fpc1020 = container_of(nb, struct fpc1020_data, + fb_notifier); + struct fb_event *evdata = data; + unsigned int blank; + + if (!fpc1020) + return 0; + + if (val != FB_EVENT_BLANK) + return 0; + + pr_debug("[info] %s value = %d\n", __func__, (int)val); + + if (evdata && evdata->data && val == FB_EVENT_BLANK) { + blank = *(int *)(evdata->data); + switch (blank) { + case FB_BLANK_POWERDOWN: + fpc1020->fb_black = true; + break; + case FB_BLANK_UNBLANK: + fpc1020->fb_black = false; + break; + default: + pr_debug("%s defalut\n", __func__); + break; + } + } + return NOTIFY_OK; +} + + +static struct notifier_block fpc_notif_block = { + .notifier_call = fpc_fb_notif_callback, +}; + +static int fpc1020_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + int rc = 0; + + + struct device_node *np = dev->of_node; + struct fpc1020_data *fpc1020 = devm_kzalloc(dev, sizeof(*fpc1020), + GFP_KERNEL); + + if (!fpc1020) { + dev_err(dev, + "failed to allocate memory for struct fpc1020_data\n"); + rc = -ENOMEM; + goto exit; + } + + fpc1020->dev = dev; + platform_set_drvdata(pdev, fpc1020); + + if (!np) { + dev_err(dev, "no of node found\n"); + rc = -EINVAL; + goto exit; + } + + atomic_set(&fpc1020->wakeup_enabled, 1); + mutex_init(&fpc1020->lock); + + wake_lock_init(&fpc1020->ttw_wl, WAKE_LOCK_SUSPEND, "fpc_ttw_wl"); + + rc = sysfs_create_group(&dev->kobj, &attribute_group); + if (rc) { + dev_err(dev, "could not create sysfs\n"); + goto exit; + } + + dev_info(dev, "%s: ok\n", __func__); + + fpc1020->fb_black = false; + fpc1020->wait_finger_down = false; + INIT_WORK(&fpc1020->work, notification_work); + fpc1020->fb_notifier = fpc_notif_block; + fb_register_client(&fpc1020->fb_notifier); + + +exit: + return rc; +} + +static int fpc1020_remove(struct platform_device *pdev) +{ + struct fpc1020_data *fpc1020 = platform_get_drvdata(pdev); + + fb_unregister_client(&fpc1020->fb_notifier); + sysfs_remove_group(&pdev->dev.kobj, &attribute_group); + mutex_destroy(&fpc1020->lock); + wake_lock_destroy(&fpc1020->ttw_wl); + dev_info(&pdev->dev, "%s\n", __func__); + + return 0; +} + +static struct of_device_id fpc1020_of_match[] = { + { .compatible = "fpc,fpc1020", }, + {} +}; +MODULE_DEVICE_TABLE(of, fpc1020_of_match); + +static struct platform_driver fpc1020_driver = { + .driver = { + .name = "fpc1020", + .owner = THIS_MODULE, + .of_match_table = fpc1020_of_match, + }, + .probe = fpc1020_probe, + .remove = fpc1020_remove, +}; + +static int __init fpc1020_init(void) +{ + int rc = platform_driver_register(&fpc1020_driver); + + if (!rc) + pr_info("%s OK\n", __func__); + else + pr_err("%s %d\n", __func__, rc); + + return rc; +} + +static void __exit fpc1020_exit(void) +{ + pr_info("%s\n", __func__); + platform_driver_unregister(&fpc1020_driver); +} + +module_init(fpc1020_init); +module_exit(fpc1020_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Aleksej Makarov"); +MODULE_AUTHOR("Henrik Tillman "); +MODULE_DESCRIPTION("FPC1020 Fingerprint sensor device driver."); diff --git a/drivers/fingerprintrosy/goodixrosy/Kconfig b/drivers/fingerprintrosy/goodixrosy/Kconfig new file mode 100755 index 0000000000000..c23fedcbddc6b --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/Kconfig @@ -0,0 +1,5 @@ +config FINGERPRINT_GOODIX_GF3208_ROSY + tristate "generic goodix fingerprint driver" + depends on FINGERPRINT_ROSY + help + add support for goodix fingerprint driver. diff --git a/drivers/fingerprintrosy/goodixrosy/Makefile b/drivers/fingerprintrosy/goodixrosy/Makefile new file mode 100755 index 0000000000000..d8e1d2169d31f --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_FINGERPRINT_GOODIX_GF3208_ROSY) += gf_spi.o platform.o netlink.o diff --git a/drivers/fingerprintrosy/goodixrosy/gf_spi.c b/drivers/fingerprintrosy/goodixrosy/gf_spi.c new file mode 100644 index 0000000000000..87943b2dd746e --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/gf_spi.c @@ -0,0 +1,940 @@ +/* + * TEE driver for goodix fingerprint sensor + * Copyright (C) 2016 Goodix + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + */ +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "gf_spi.h" + +#if defined(USE_SPI_BUS) +#include +#include +#elif defined(USE_PLATFORM_BUS) +#include +#endif + +#include +#define VER_MAJOR 1 +#define VER_MINOR 2 +#define PATCH_LEVEL 10 + +#define WAKELOCK_HOLD_TIME 2000 /* in ms */ +#define FP_UNLOCK_REJECTION_TIMEOUT (WAKELOCK_HOLD_TIME - 500) + +#define GF_SPIDEV_NAME "goodix,fingerprint" +/*device name after register in charater*/ +#define GF_DEV_NAME "goodix_fp" +#define GF_INPUT_NAME "uinput-goodix" /*"goodix_fp" */ + +#define CHRD_DRIVER_NAME "goodix_fp_spi" +#define CLASS_NAME "goodix_fp" + +#define N_SPI_MINORS 32 /* ... up to 256 */ +static int SPIDEV_MAJOR; + +static DECLARE_BITMAP(minors, N_SPI_MINORS); +static LIST_HEAD(device_list); +static DEFINE_MUTEX(device_list_lock); +static struct wake_lock fp_wakelock; +static struct gf_dev gf; + +static struct gf_key_map maps[] = { + { EV_KEY, GF_KEY_INPUT_HOME }, + { EV_KEY, GF_KEY_INPUT_MENU }, + { EV_KEY, GF_KEY_INPUT_BACK }, + { EV_KEY, GF_KEY_INPUT_POWER }, +#if defined(SUPPORT_NAV_EVENT) + { EV_KEY, GF_NAV_INPUT_UP }, + { EV_KEY, GF_NAV_INPUT_DOWN }, + { EV_KEY, GF_NAV_INPUT_RIGHT }, + { EV_KEY, GF_NAV_INPUT_LEFT }, + { EV_KEY, GF_KEY_INPUT_CAMERA }, + { EV_KEY, GF_NAV_INPUT_CLICK }, + { EV_KEY, GF_NAV_INPUT_DOUBLE_CLICK }, + { EV_KEY, GF_NAV_INPUT_LONG_PRESS }, + { EV_KEY, GF_NAV_INPUT_HEAVY }, +#endif + { EV_KEY, GF_KEY_INPUT_SELECT}, +}; + +static void notification_work(struct work_struct *work) +{ + mdss_prim_panel_fb_unblank(FP_UNLOCK_REJECTION_TIMEOUT); + pr_debug("unblank\n"); +} + +static void gf_enable_irq(struct gf_dev *gf_dev) +{ + if (gf_dev->irq_enabled) { + pr_warn("IRQ has been enabled.\n"); + } else { + enable_irq(gf_dev->irq); + gf_dev->irq_enabled = 1; + } +} + +static void gf_disable_irq(struct gf_dev *gf_dev) +{ + if (gf_dev->irq_enabled) { + gf_dev->irq_enabled = 0; + disable_irq(gf_dev->irq); + } else { + pr_warn("IRQ has been disabled.\n"); + } +} + +#ifdef AP_CONTROL_CLK +static long spi_clk_max_rate(struct clk *clk, unsigned long rate) +{ + long lowest_available, nearest_low, step_size, cur; + long step_direction = -1; + long guess = rate; + int max_steps = 10; + + cur = clk_round_rate(clk, rate); + if (cur == rate) + return rate; + + /* if we got here then: cur > rate */ + lowest_available = clk_round_rate(clk, 0); + if (lowest_available > rate) + return -EINVAL; + + step_size = (rate - lowest_available) >> 1; + nearest_low = lowest_available; + + while (max_steps-- && step_size) { + guess += step_size * step_direction; + cur = clk_round_rate(clk, guess); + + if ((cur < rate) && (cur > nearest_low)) + nearest_low = cur; + /* + * if we stepped too far, then start stepping in the other + * direction with half the step size + */ + if (((cur > rate) && (step_direction > 0)) + || ((cur < rate) && (step_direction < 0))) { + step_direction = -step_direction; + step_size >>= 1; + } + } + return nearest_low; +} + +static void spi_clock_set(struct gf_dev *gf_dev, int speed) +{ + long rate; + int rc; + + rate = spi_clk_max_rate(gf_dev->core_clk, speed); + if (rate < 0) { + pr_info("%s: no match found for requested clock frequency:%d", + __func__, speed); + return; + } + + rc = clk_set_rate(gf_dev->core_clk, rate); +} + +static int gfspi_ioctl_clk_init(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + data->clk_enabled = 0; + data->core_clk = clk_get(&data->spi->dev, "core_clk"); + if (IS_ERR_OR_NULL(data->core_clk)) { + pr_err("%s: fail to get core_clk\n", __func__); + return -EPERM; + } + data->iface_clk = clk_get(&data->spi->dev, "iface_clk"); + if (IS_ERR_OR_NULL(data->iface_clk)) { + pr_err("%s: fail to get iface_clk\n", __func__); + clk_put(data->core_clk); + data->core_clk = NULL; + return -ENOENT; + } + return 0; +} + +static int gfspi_ioctl_clk_enable(struct gf_dev *data) +{ + int err; + + pr_debug("%s: enter\n", __func__); + + if (data->clk_enabled) + return 0; + + err = clk_prepare_enable(data->core_clk); + if (err) { + pr_err("%s: fail to enable core_clk\n", __func__); + return -EPERM; + } + + err = clk_prepare_enable(data->iface_clk); + if (err) { + pr_err("%s: fail to enable iface_clk\n", __func__); + clk_disable_unprepare(data->core_clk); + return -ENOENT; + } + + data->clk_enabled = 1; + + return 0; +} + +static int gfspi_ioctl_clk_disable(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + if (!data->clk_enabled) + return 0; + + clk_disable_unprepare(data->core_clk); + clk_disable_unprepare(data->iface_clk); + data->clk_enabled = 0; + + return 0; +} + +static int gfspi_ioctl_clk_uninit(struct gf_dev *data) +{ + pr_debug("%s: enter\n", __func__); + + if (data->clk_enabled) + gfspi_ioctl_clk_disable(data); + + if (!IS_ERR_OR_NULL(data->core_clk)) { + clk_put(data->core_clk); + data->core_clk = NULL; + } + + if (!IS_ERR_OR_NULL(data->iface_clk)) { + clk_put(data->iface_clk); + data->iface_clk = NULL; + } + + return 0; +} +#endif + +static void nav_event_input(struct gf_dev *gf_dev, gf_nav_event_t nav_event) +{ + uint32_t nav_input = 0; + + switch (nav_event) { + case GF_NAV_FINGER_DOWN: + pr_debug("%s nav finger down\n", __func__); + break; + + case GF_NAV_FINGER_UP: + pr_debug("%s nav finger up\n", __func__); + break; + + case GF_NAV_DOWN: + nav_input = GF_NAV_INPUT_DOWN; + pr_debug("%s nav down\n", __func__); + break; + + case GF_NAV_UP: + nav_input = GF_NAV_INPUT_UP; + pr_debug("%s nav up\n", __func__); + break; + + case GF_NAV_LEFT: + nav_input = GF_NAV_INPUT_LEFT; + pr_debug("%s nav left\n", __func__); + break; + + case GF_NAV_RIGHT: + nav_input = GF_NAV_INPUT_RIGHT; + pr_debug("%s nav right\n", __func__); + break; + + case GF_NAV_CLICK: + nav_input = GF_NAV_INPUT_CLICK; + pr_debug("%s nav click\n", __func__); + break; + + case GF_NAV_HEAVY: + nav_input = GF_NAV_INPUT_HEAVY; + pr_debug("%s nav heavy\n", __func__); + break; + + case GF_NAV_LONG_PRESS: + nav_input = GF_NAV_INPUT_LONG_PRESS; + pr_debug("%s nav long press\n", __func__); + break; + + case GF_NAV_DOUBLE_CLICK: + nav_input = GF_NAV_INPUT_DOUBLE_CLICK; + pr_debug("%s nav double click\n", __func__); + break; + + default: + pr_warn("%s unknown nav event: %d\n", __func__, nav_event); + break; + } + + if ((nav_event != GF_NAV_FINGER_DOWN) && + (nav_event != GF_NAV_FINGER_UP)) { + input_report_key(gf_dev->input, nav_input, 1); + input_sync(gf_dev->input); + input_report_key(gf_dev->input, nav_input, 0); + input_sync(gf_dev->input); + } +} + +static irqreturn_t gf_irq(int irq, void *handle) +{ +#if defined(GF_NETLINK_ENABLE) + char msg = GF_NET_EVENT_IRQ; + struct gf_dev *gf_dev = &gf; + + wake_lock_timeout(&fp_wakelock, msecs_to_jiffies(WAKELOCK_HOLD_TIME)); + sendnlmsg(&msg); + + if ((gf_dev->wait_finger_down == true) && (gf_dev->device_available == 1) && (gf_dev->fb_black == 1)) { + gf_dev->wait_finger_down = false; + schedule_work(&gf_dev->work); + } + +#elif defined(GF_FASYNC) + struct gf_dev *gf_dev = &gf; + + if (gf_dev->async) + kill_fasync(&gf_dev->async, SIGIO, POLL_IN); +#endif + + return IRQ_HANDLED; +} + +static int irq_setup(struct gf_dev *gf_dev) +{ + int status; + + gf_dev->irq = gf_irq_num(gf_dev); + status = request_threaded_irq(gf_dev->irq, NULL, gf_irq, + IRQF_TRIGGER_RISING | IRQF_ONESHOT, + "gf", gf_dev); + + if (status) { + pr_err("failed to request IRQ:%d\n", gf_dev->irq); + return status; + } + enable_irq_wake(gf_dev->irq); + gf_dev->irq_enabled = 1; + + return status; +} + +static void irq_cleanup(struct gf_dev *gf_dev) +{ + gf_dev->irq_enabled = 0; + disable_irq(gf_dev->irq); + disable_irq_wake(gf_dev->irq); + free_irq(gf_dev->irq, gf_dev); +} + +static void gf_kernel_key_input(struct gf_dev *gf_dev, struct gf_key *gf_key) +{ + uint32_t key_input = 0; + + if (gf_key->key == GF_KEY_HOME) { + key_input = GF_KEY_INPUT_SELECT; + pr_info("fp keycode home-SELECT \n"); + } else if (gf_key->key == GF_KEY_POWER) { + key_input = GF_KEY_INPUT_SELECT; + pr_info("fp keycode power \n"); + } else if (gf_key->key == GF_KEY_CAMERA) { + key_input = GF_KEY_INPUT_SELECT; + pr_info("fp keycode camera \n"); + } else { + /* add special key define */ + key_input = gf_key->key; + } + pr_info("%s: received key event[%d], key=%d, value=%d\n", + __func__, key_input, gf_key->key, gf_key->value); + + if ((GF_KEY_POWER == gf_key->key || GF_KEY_CAMERA == gf_key->key) + && (gf_key->value == 1)) { + #ifndef WT_COMPILE_FACTORY_VERSION + input_report_key(gf_dev->input, key_input, 1); + input_sync(gf_dev->input); + input_report_key(gf_dev->input, key_input, 0); + input_sync(gf_dev->input); + #endif + } + + if (gf_key->key == GF_KEY_HOME) { + #ifndef WT_COMPILE_FACTORY_VERSION + + input_report_key(gf_dev->input, key_input, gf_key->value); + input_sync(gf_dev->input); + #endif + } +} + +static long gf_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + struct gf_dev *gf_dev = &gf; + struct gf_key gf_key; +#if defined(SUPPORT_NAV_EVENT) + gf_nav_event_t nav_event = GF_NAV_NONE; +#endif + int retval = 0; + u8 netlink_route = NETLINK_TEST; + struct gf_ioc_chip_info info; + + if (_IOC_TYPE(cmd) != GF_IOC_MAGIC) + return -ENODEV; + + if (_IOC_DIR(cmd) & _IOC_READ) + retval = !access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd)); + else if (_IOC_DIR(cmd) & _IOC_WRITE) + retval = !access_ok(VERIFY_READ, (void __user *)arg, _IOC_SIZE(cmd)); + if (retval) + return -EFAULT; + + switch (cmd) { + case GF_IOC_INIT: + pr_debug("%s GF_IOC_INIT\n", __func__); + if (copy_to_user((void __user *)arg, (void *)&netlink_route, sizeof(u8))) { + pr_err("GF_IOC_INIT failed\n"); + retval = -EFAULT; + break; + } + break; + + case GF_IOC_EXIT: + pr_debug("%s GF_IOC_EXIT\n", __func__); + break; + + case GF_IOC_DISABLE_IRQ: + pr_debug("%s GF_IOC_DISABEL_IRQ\n", __func__); + gf_disable_irq(gf_dev); + break; + + case GF_IOC_ENABLE_IRQ: + pr_debug("%s GF_IOC_ENABLE_IRQ\n", __func__); + gf_enable_irq(gf_dev); + break; + + case GF_IOC_RESET: + pr_debug("%s GF_IOC_RESET\n", __func__); + gf_hw_reset(gf_dev, 3); + break; + + case GF_IOC_INPUT_KEY_EVENT: + if (copy_from_user(&gf_key, (void __user *)arg, sizeof(struct gf_key))) { + pr_err("failed to copy input key event from user to kernel\n"); + retval = -EFAULT; + break; + } + + gf_kernel_key_input(gf_dev, &gf_key); + break; + +#if defined(SUPPORT_NAV_EVENT) + case GF_IOC_NAV_EVENT: + pr_debug("%s GF_IOC_NAV_EVENT\n", __func__); + if (copy_from_user(&nav_event, (void __user *)arg, sizeof(gf_nav_event_t))) { + pr_err("failed to copy nav event from user to kernel\n"); + retval = -EFAULT; + break; + } + + nav_event_input(gf_dev, nav_event); + break; +#endif + + case GF_IOC_ENABLE_SPI_CLK: + pr_debug("%s GF_IOC_ENABLE_SPI_CLK\n", __func__); +#ifdef AP_CONTROL_CLK + gfspi_ioctl_clk_enable(gf_dev); +#else + pr_debug("doesn't support control clock!\n"); +#endif + break; + + case GF_IOC_DISABLE_SPI_CLK: + pr_debug("%s GF_IOC_DISABLE_SPI_CLK\n", __func__); +#ifdef AP_CONTROL_CLK + gfspi_ioctl_clk_disable(gf_dev); +#else + pr_debug("doesn't support control clock!\n"); +#endif + break; + + case GF_IOC_ENABLE_POWER: + pr_debug("%s GF_IOC_ENABLE_POWER\n", __func__); + gf_power_on(gf_dev); + break; + + case GF_IOC_DISABLE_POWER: + pr_debug("%s GF_IOC_DISABLE_POWER\n", __func__); + gf_power_off(gf_dev); + break; + + case GF_IOC_ENTER_SLEEP_MODE: + pr_debug("%s GF_IOC_ENTER_SLEEP_MODE\n", __func__); + break; + + case GF_IOC_GET_FW_INFO: + pr_debug("%s GF_IOC_GET_FW_INFO\n", __func__); + break; + + case GF_IOC_REMOVE: + pr_debug("%s GF_IOC_REMOVE\n", __func__); + irq_cleanup(gf_dev); + gf_cleanup(gf_dev); + break; + + case GF_IOC_CHIP_INFO: + pr_debug("%s GF_IOC_CHIP_INFO\n", __func__); + if (copy_from_user(&info, (void __user *)arg, sizeof(struct gf_ioc_chip_info))) { + retval = -EFAULT; + break; + } + pr_info("vendor_id : 0x%x\n", info.vendor_id); + pr_info("mode : 0x%x\n", info.mode); + pr_info("operation: 0x%x\n", info.operation); + break; + + default: + pr_warn("unsupport cmd:0x%x\n", cmd); + break; + } + + return retval; +} + +#ifdef CONFIG_COMPAT +static long gf_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + return gf_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); +} +#endif /*CONFIG_COMPAT*/ + + +static int gf_open(struct inode *inode, struct file *filp) +{ + struct gf_dev *gf_dev = &gf; + int status = -ENXIO; + + mutex_lock(&device_list_lock); + + list_for_each_entry(gf_dev, &device_list, device_entry) { + if (gf_dev->devt == inode->i_rdev) { + pr_info("Found\n"); + status = 0; + break; + } + } + + if (status == 0) { + if (status == 0) { + gf_dev->users++; + filp->private_data = gf_dev; + nonseekable_open(inode, filp); + pr_info("Succeed to open device. irq = %d\n", + gf_dev->irq); + if (gf_dev->users == 1) { + status = gf_parse_dts(gf_dev); + if (status) + goto err_parse_dt; + + status = irq_setup(gf_dev); + if (status) + goto err_irq; + } + gf_hw_reset(gf_dev, 3); + gf_dev->device_available = 1; + } + } else { + pr_info("No device for minor %d\n", iminor(inode)); + } + mutex_unlock(&device_list_lock); + + return status; +err_irq: + gf_cleanup(gf_dev); +err_parse_dt: + return status; +} + +#ifdef GF_FASYNC +static int gf_fasync(int fd, struct file *filp, int mode) +{ + struct gf_dev *gf_dev = filp->private_data; + int ret; + + ret = fasync_helper(fd, filp, mode, &gf_dev->async); + pr_info("ret = %d\n", ret); + return ret; +} +#endif + +static int gf_release(struct inode *inode, struct file *filp) +{ + struct gf_dev *gf_dev = &gf; + int status = 0; + + struct device *dev = &gf_dev->spi->dev; + mutex_lock(&device_list_lock); + gf_dev = filp->private_data; + filp->private_data = NULL; + + /*last close?? */ + gf_dev->users--; + if (!gf_dev->users) { + + pr_info("disble_irq. irq = %d\n", gf_dev->irq); + gf_disable_irq(gf_dev); + /*power off the sensor*/ + gf_dev->device_available = 0; + if (gpio_is_valid(gf_dev->reset_gpio)) { + devm_gpio_free(dev, gf_dev->reset_gpio); + pr_err(" gf_release === reset"); + } + if (gpio_is_valid(gf_dev->irq_gpio)) { + devm_gpio_free(dev, gf_dev->irq_gpio); + pr_err(" gf_release === irq"); + } + devm_free_irq(dev, gpio_to_irq(gf_dev->irq_gpio), gf_dev); + gf_power_off(gf_dev); + } + mutex_unlock(&device_list_lock); + return status; +} + +static const struct file_operations gf_fops = { + .owner = THIS_MODULE, + /* REVISIT switch to aio primitives, so that userspace + * gets more complete API coverage. It'll simplify things + * too, except for the locking. + */ + .unlocked_ioctl = gf_ioctl, +#ifdef CONFIG_COMPAT + .compat_ioctl = gf_compat_ioctl, +#endif /*CONFIG_COMPAT*/ + .open = gf_open, + .release = gf_release, +#ifdef GF_FASYNC + .fasync = gf_fasync, +#endif +}; + +static int goodix_fb_state_chg_callback(struct notifier_block *nb, + unsigned long val, void *data) +{ + struct gf_dev *gf_dev; + struct fb_event *evdata = data; + unsigned int blank; + char msg = 0; + + if (val != FB_EVENT_BLANK) + return 0; + pr_info("[info] %s go to the goodix_fb_state_chg_callback value = %d\n", + __func__, (int)val); + gf_dev = container_of(nb, struct gf_dev, notifier); + if (evdata && evdata->data && val == FB_EVENT_BLANK && gf_dev) { + blank = *(int *)(evdata->data); + switch (blank) { + case FB_BLANK_POWERDOWN: + if (gf_dev->device_available == 1) { + gf_dev->fb_black = 1; + gf_dev->wait_finger_down = true; +#if defined(GF_NETLINK_ENABLE) + msg = GF_NET_EVENT_FB_BLACK; + sendnlmsg(&msg); +#elif defined(GF_FASYNC) + if (gf_dev->async) + kill_fasync(&gf_dev->async, SIGIO, POLL_IN); +#endif + } + break; + case FB_BLANK_UNBLANK: + if (gf_dev->device_available == 1) { + gf_dev->fb_black = 0; +#if defined(GF_NETLINK_ENABLE) + msg = GF_NET_EVENT_FB_UNBLACK; + sendnlmsg(&msg); +#elif defined(GF_FASYNC) + if (gf_dev->async) + kill_fasync(&gf_dev->async, SIGIO, POLL_IN); +#endif + } + break; + default: + pr_info("%s defalut\n", __func__); + break; + } + } + return NOTIFY_OK; +} + +static struct notifier_block goodix_noti_block = { + .notifier_call = goodix_fb_state_chg_callback, +}; + +static struct class *gf_class; +#if defined(USE_SPI_BUS) +static int gf_probe(struct spi_device *spi) +#elif defined(USE_PLATFORM_BUS) +static int gf_probe(struct platform_device *pdev) +#endif +{ + struct gf_dev *gf_dev = &gf; + int status = -EINVAL; + unsigned long minor; + int i; + + /* Initialize the driver data */ + INIT_LIST_HEAD(&gf_dev->device_entry); +#if defined(USE_SPI_BUS) + gf_dev->spi = spi; +#elif defined(USE_PLATFORM_BUS) + gf_dev->spi = pdev; +#endif + gf_dev->irq_gpio = -EINVAL; + gf_dev->reset_gpio = -EINVAL; + gf_dev->pwr_gpio = -EINVAL; + gf_dev->device_available = 0; + gf_dev->fb_black = 0; + + gf_dev->wait_finger_down = false; + INIT_WORK(&gf_dev->work, notification_work); + + + /* If we can allocate a minor number, hook up this device. + * Reusing minors is fine so long as udev or mdev is working. + */ + mutex_lock(&device_list_lock); + minor = find_first_zero_bit(minors, N_SPI_MINORS); + if (minor < N_SPI_MINORS) { + struct device *dev; + + gf_dev->devt = MKDEV(SPIDEV_MAJOR, minor); + dev = device_create(gf_class, &gf_dev->spi->dev, gf_dev->devt, + gf_dev, GF_DEV_NAME); + status = IS_ERR(dev) ? PTR_ERR(dev) : 0; + } else { + dev_dbg(&gf_dev->spi->dev, "no minor number available!\n"); + status = -ENODEV; + mutex_unlock(&device_list_lock); + goto error_hw; + } + + if (status == 0) { + set_bit(minor, minors); + list_add(&gf_dev->device_entry, &device_list); + } else { + gf_dev->devt = 0; + goto error_hw; + } + mutex_unlock(&device_list_lock); + + gf_dev->input = input_allocate_device(); + if (gf_dev->input == NULL) { + pr_err("%s, failed to allocate input device\n", __func__); + status = -ENOMEM; + goto error_dev; + } + for (i = 0; i < ARRAY_SIZE(maps); i++) + input_set_capability(gf_dev->input, maps[i].type, maps[i].code); + + gf_dev->input->name = GF_INPUT_NAME; + status = input_register_device(gf_dev->input); + if (status) { + pr_err("failed to register input device\n"); + goto error_input; + } + +#ifdef AP_CONTROL_CLK + pr_info("Get the clk resource.\n"); + /* Enable spi clock */ + if (gfspi_ioctl_clk_init(gf_dev)) + goto gfspi_probe_clk_init_failed; + + if (gfspi_ioctl_clk_enable(gf_dev)) + goto gfspi_probe_clk_enable_failed; + + spi_clock_set(gf_dev, 1000000); +#endif + + gf_dev->notifier = goodix_noti_block; + fb_register_client(&gf_dev->notifier); + + wake_lock_init(&fp_wakelock, WAKE_LOCK_SUSPEND, "fp_wakelock"); + + pr_info("version V%d.%d.%02d\n", VER_MAJOR, VER_MINOR, PATCH_LEVEL); + + return status; + +#ifdef AP_CONTROL_CLK +gfspi_probe_clk_enable_failed: + gfspi_ioctl_clk_uninit(gf_dev); +gfspi_probe_clk_init_failed: +#endif + +error_input: + if (gf_dev->input != NULL) + input_free_device(gf_dev->input); +error_dev: + if (gf_dev->devt != 0) { + pr_info("Err: status = %d\n", status); + mutex_lock(&device_list_lock); + list_del(&gf_dev->device_entry); + device_destroy(gf_class, gf_dev->devt); + clear_bit(MINOR(gf_dev->devt), minors); + mutex_unlock(&device_list_lock); + } +error_hw: + gf_dev->device_available = 0; + + return status; +} + +#if defined(USE_SPI_BUS) +static int gf_remove(struct spi_device *spi) +#elif defined(USE_PLATFORM_BUS) +static int gf_remove(struct platform_device *pdev) +#endif +{ + struct gf_dev *gf_dev = &gf; + + wake_lock_destroy(&fp_wakelock); + fb_unregister_client(&gf_dev->notifier); + if (gf_dev->input) + input_unregister_device(gf_dev->input); + input_free_device(gf_dev->input); + + /* prevent new opens */ + mutex_lock(&device_list_lock); + list_del(&gf_dev->device_entry); + device_destroy(gf_class, gf_dev->devt); + clear_bit(MINOR(gf_dev->devt), minors); + mutex_unlock(&device_list_lock); + + return 0; +} + +static const struct of_device_id gx_match_table[] = { + { .compatible = GF_SPIDEV_NAME }, + {}, +}; + +#if defined(USE_SPI_BUS) +static struct spi_driver gf_driver = { +#elif defined(USE_PLATFORM_BUS) +static struct platform_driver gf_driver = { +#endif + .driver = { + .name = GF_DEV_NAME, + .owner = THIS_MODULE, + .of_match_table = gx_match_table, + }, + .probe = gf_probe, + .remove = gf_remove, +}; + +static int __init gf_init(void) +{ + int status; + + /* Claim our 256 reserved device numbers. Then register a class + * that will key udev/mdev to add/remove /dev nodes. Last, register + * the driver which manages those device numbers. + */ + + BUILD_BUG_ON(N_SPI_MINORS > 256); + status = register_chrdev(SPIDEV_MAJOR, CHRD_DRIVER_NAME, &gf_fops); + if (status < 0) { + pr_warn("Failed to register char device!\n"); + return status; + } + SPIDEV_MAJOR = status; + gf_class = class_create(THIS_MODULE, CLASS_NAME); + if (IS_ERR(gf_class)) { + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); + pr_warn("Failed to create class.\n"); + return PTR_ERR(gf_class); + } +#if defined(USE_PLATFORM_BUS) + status = platform_driver_register(&gf_driver); +#elif defined(USE_SPI_BUS) + status = spi_register_driver(&gf_driver); +#endif + if (status < 0) { + class_destroy(gf_class); + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); + pr_warn("Failed to register SPI driver.\n"); + } + +#ifdef GF_NETLINK_ENABLE + netlink_init(); +#endif + pr_info("status = 0x%x\n", status); + return 0; +} +module_init(gf_init); + +static void __exit gf_exit(void) +{ +#ifdef GF_NETLINK_ENABLE + netlink_exit(); +#endif +#if defined(USE_PLATFORM_BUS) + platform_driver_unregister(&gf_driver); +#elif defined(USE_SPI_BUS) + spi_unregister_driver(&gf_driver); +#endif + class_destroy(gf_class); + unregister_chrdev(SPIDEV_MAJOR, gf_driver.driver.name); +} +module_exit(gf_exit); + +MODULE_AUTHOR("Jiangtao Yi, "); +MODULE_AUTHOR("Jandy Gou, "); +MODULE_DESCRIPTION("goodix fingerprint sensor device driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/fingerprintrosy/goodixrosy/gf_spi.h b/drivers/fingerprintrosy/goodixrosy/gf_spi.h new file mode 100644 index 0000000000000..f0e8b2e77f26b --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/gf_spi.h @@ -0,0 +1,158 @@ +/* + * driver definition for sensor driver + * + * Coypright (c) 2017 Goodix + */ +#ifndef __GF_SPI_H +#define __GF_SPI_H + +#include +#include +/**********************************************************/ +enum FP_MODE{ + GF_IMAGE_MODE = 0, + GF_KEY_MODE, + GF_SLEEP_MODE, + GF_FF_MODE, + GF_DEBUG_MODE = 0x56 +}; + +#define SUPPORT_NAV_EVENT + +#if defined(SUPPORT_NAV_EVENT) +#define GF_NAV_INPUT_UP KEY_UP +#define GF_NAV_INPUT_DOWN KEY_DOWN +#define GF_NAV_INPUT_LEFT KEY_LEFT +#define GF_NAV_INPUT_RIGHT KEY_RIGHT +#define GF_NAV_INPUT_CLICK KEY_VOLUMEDOWN +#define GF_NAV_INPUT_DOUBLE_CLICK KEY_VOLUMEUP +#define GF_NAV_INPUT_LONG_PRESS KEY_SEARCH +#define GF_NAV_INPUT_HEAVY KEY_CHAT +#endif + +#define GF_KEY_INPUT_HOME KEY_HOME +#define GF_KEY_INPUT_MENU KEY_MENU +#define GF_KEY_INPUT_BACK KEY_BACK +#define GF_KEY_INPUT_POWER KEY_POWER +#define GF_KEY_INPUT_CAMERA KEY_CAMERA +#define GF_KEY_INPUT_SELECT KEY_SELECT + +#if defined(SUPPORT_NAV_EVENT) +typedef enum gf_nav_event { + GF_NAV_NONE = 0, + GF_NAV_FINGER_UP, + GF_NAV_FINGER_DOWN, + GF_NAV_UP, + GF_NAV_DOWN, + GF_NAV_LEFT, + GF_NAV_RIGHT, + GF_NAV_CLICK, + GF_NAV_HEAVY, + GF_NAV_LONG_PRESS, + GF_NAV_DOUBLE_CLICK, +} gf_nav_event_t; +#endif + +typedef enum gf_key_event { + GF_KEY_NONE = 0, + GF_KEY_HOME, + GF_KEY_POWER, + GF_KEY_MENU, + GF_KEY_BACK, + GF_KEY_CAMERA, +} gf_key_event_t; + +struct gf_key { + enum gf_key_event key; + uint32_t value; /* key down = 1, key up = 0 */ +}; + +struct gf_key_map { + unsigned int type; + unsigned int code; +}; + +struct gf_ioc_chip_info { + unsigned char vendor_id; + unsigned char mode; + unsigned char operation; + unsigned char reserved[5]; +}; + +#define GF_IOC_MAGIC 'g' +#define GF_IOC_INIT _IOR(GF_IOC_MAGIC, 0, uint8_t) +#define GF_IOC_EXIT _IO(GF_IOC_MAGIC, 1) +#define GF_IOC_RESET _IO(GF_IOC_MAGIC, 2) +#define GF_IOC_ENABLE_IRQ _IO(GF_IOC_MAGIC, 3) +#define GF_IOC_DISABLE_IRQ _IO(GF_IOC_MAGIC, 4) +#define GF_IOC_ENABLE_SPI_CLK _IOW(GF_IOC_MAGIC, 5, uint32_t) +#define GF_IOC_DISABLE_SPI_CLK _IO(GF_IOC_MAGIC, 6) +#define GF_IOC_ENABLE_POWER _IO(GF_IOC_MAGIC, 7) +#define GF_IOC_DISABLE_POWER _IO(GF_IOC_MAGIC, 8) +#define GF_IOC_INPUT_KEY_EVENT _IOW(GF_IOC_MAGIC, 9, struct gf_key) +#define GF_IOC_ENTER_SLEEP_MODE _IO(GF_IOC_MAGIC, 10) +#define GF_IOC_GET_FW_INFO _IOR(GF_IOC_MAGIC, 11, uint8_t) +#define GF_IOC_REMOVE _IO(GF_IOC_MAGIC, 12) +#define GF_IOC_CHIP_INFO _IOW(GF_IOC_MAGIC, 13, struct gf_ioc_chip_info) + +#if defined(SUPPORT_NAV_EVENT) +#define GF_IOC_NAV_EVENT _IOW(GF_IOC_MAGIC, 14, gf_nav_event_t) +#define GF_IOC_MAXNR 15 /* THIS MACRO IS NOT USED NOW... */ +#else +#define GF_IOC_MAXNR 14 /* THIS MACRO IS NOT USED NOW... */ +#endif + + +#define USE_PLATFORM_BUS 1 + + +#define GF_NETLINK_ENABLE 1 +#define GF_NET_EVENT_IRQ 1 +#define GF_NET_EVENT_FB_BLACK 2 +#define GF_NET_EVENT_FB_UNBLACK 3 +#define NETLINK_TEST 25 + +struct gf_dev { + dev_t devt; + struct list_head device_entry; +#if defined(USE_SPI_BUS) + struct spi_device *spi; +#elif defined(USE_PLATFORM_BUS) + struct platform_device *spi; +#endif + struct clk *core_clk; + struct clk *iface_clk; + + struct input_dev *input; + /* buffer is NULL unless this device is open (users > 0) */ + unsigned users; + signed irq_gpio; + signed reset_gpio; + signed pwr_gpio; + int irq; + int irq_enabled; + int clk_enabled; +#ifdef GF_FASYNC + struct fasync_struct *async; +#endif + struct notifier_block notifier; + char device_available; + char fb_black; + + char wait_finger_down; + struct work_struct work; +}; + +int gf_parse_dts(struct gf_dev *gf_dev); +void gf_cleanup(struct gf_dev *gf_dev); + +int gf_power_on(struct gf_dev *gf_dev); +int gf_power_off(struct gf_dev *gf_dev); + +int gf_hw_reset(struct gf_dev *gf_dev, unsigned int delay_ms); +int gf_irq_num(struct gf_dev *gf_dev); + +void sendnlmsg(char *msg); +int netlink_init(void); +void netlink_exit(void); +#endif /*__GF_SPI_H*/ diff --git a/drivers/fingerprintrosy/goodixrosy/netlink.c b/drivers/fingerprintrosy/goodixrosy/netlink.c new file mode 100644 index 0000000000000..6691186c240aa --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/netlink.c @@ -0,0 +1,97 @@ +/* + * netlink interface + * + * Copyright (c) 2017 Goodix + */ +#include +#include +#include +#include +#include +#include +#include +#include "gf_spi.h" + +#define NETLINK_TEST 25 +#define MAX_MSGSIZE 32 + +static int pid = -1; +static struct sock *nl_sk; + +void sendnlmsg(char *msg) +{ + struct sk_buff *skb_1; + struct nlmsghdr *nlh; + int len = NLMSG_SPACE(MAX_MSGSIZE); + int ret = 0; + + if (!msg || !nl_sk || !pid) + return; + + skb_1 = alloc_skb(len, GFP_KERNEL); + if (!skb_1) + return; + + nlh = nlmsg_put(skb_1, 0, 0, 0, MAX_MSGSIZE, 0); + + NETLINK_CB(skb_1).portid = 0; + NETLINK_CB(skb_1).dst_group = 0; + + memcpy(NLMSG_DATA(nlh), msg, sizeof(char)); + pr_debug("send message: %d\n", *(char *)NLMSG_DATA(nlh)); + + ret = netlink_unicast(nl_sk, skb_1, pid, MSG_DONTWAIT); + if (ret) + pr_err("failed to send msg error:0x%x\n", ret); +} + +static void nl_data_ready(struct sk_buff *__skb) +{ + struct sk_buff *skb; + struct nlmsghdr *nlh; + char str[100]; + + skb = skb_get(__skb); + if (skb->len >= NLMSG_SPACE(0)) { + nlh = nlmsg_hdr(skb); + + memcpy(str, NLMSG_DATA(nlh), sizeof(str)); + pid = nlh->nlmsg_pid; + + kfree_skb(skb); + } + +} + + +int netlink_init(void) +{ + struct netlink_kernel_cfg netlink_cfg; + + memset(&netlink_cfg, 0, sizeof(struct netlink_kernel_cfg)); + + netlink_cfg.groups = 0; + netlink_cfg.flags = 0; + netlink_cfg.input = nl_data_ready; + netlink_cfg.cb_mutex = NULL; + + nl_sk = netlink_kernel_create(&init_net, NETLINK_TEST, + &netlink_cfg); + + if (!nl_sk) { + pr_err("create netlink socket error\n"); + return 1; + } + + return 0; +} + +void netlink_exit(void) +{ + if (nl_sk != NULL) { + netlink_kernel_release(nl_sk); + nl_sk = NULL; + } + + pr_info("self module exited\n"); +} diff --git a/drivers/fingerprintrosy/goodixrosy/platform.c b/drivers/fingerprintrosy/goodixrosy/platform.c new file mode 100644 index 0000000000000..3792780375bf0 --- /dev/null +++ b/drivers/fingerprintrosy/goodixrosy/platform.c @@ -0,0 +1,113 @@ +/* + * platform indepent driver interface + * + * Coypritht (c) 2017 Goodix + */ +#include +#include +#include +#include +#include +#include +#include + +#include "gf_spi.h" + +#if defined(USE_SPI_BUS) +#include +#include +#elif defined(USE_PLATFORM_BUS) +#include +#endif + +int gf_parse_dts(struct gf_dev *gf_dev) +{ + int rc = 0; + struct device *dev = &gf_dev->spi->dev; + struct device_node *np = dev->of_node; + gf_dev->reset_gpio = of_get_named_gpio(np, "fp-gpio-reset", 0); + if (gf_dev->reset_gpio < 0) { + pr_err("falied to get reset gpio!\n"); + return gf_dev->reset_gpio; + } + + rc = devm_gpio_request(dev, gf_dev->reset_gpio, "goodix_reset"); + if (rc) { + pr_err("failed to request reset gpio, rc = %d\n", rc); + goto err_reset; + } + gpio_direction_output(gf_dev->reset_gpio, 1); + + gf_dev->irq_gpio = of_get_named_gpio(np, "fp-gpio-irq", 0); + if (gf_dev->irq_gpio < 0) { + pr_err("falied to get irq gpio!\n"); + return gf_dev->irq_gpio; + } + + rc = devm_gpio_request(dev, gf_dev->irq_gpio, "goodix_irq"); + if (rc) { + pr_err("failed to request irq gpio, rc = %d\n", rc); + goto err_irq; + } + gpio_direction_input(gf_dev->irq_gpio); + +err_irq: + devm_gpio_free(dev, gf_dev->reset_gpio); +err_reset: + return rc; +} + +void gf_cleanup(struct gf_dev *gf_dev) +{ + pr_info("[info] %s\n", __func__); + + if (gpio_is_valid(gf_dev->irq_gpio)) { + gpio_free(gf_dev->irq_gpio); + pr_info("remove irq_gpio success\n"); + } + if (gpio_is_valid(gf_dev->reset_gpio)) { + gpio_free(gf_dev->reset_gpio); + pr_info("remove reset_gpio success\n"); + } +} + +int gf_power_on(struct gf_dev *gf_dev) +{ + int rc = 0; + + /* TODO: add your power control here */ + return rc; +} + +int gf_power_off(struct gf_dev *gf_dev) +{ + int rc = 0; + + /* TODO: add your power control here */ + + return rc; +} + +int gf_hw_reset(struct gf_dev *gf_dev, unsigned int delay_ms) +{ + if (gf_dev == NULL) { + pr_info("Input buff is NULL.\n"); + return -EPERM; + } + gpio_direction_output(gf_dev->reset_gpio, 1); + gpio_set_value(gf_dev->reset_gpio, 0); + mdelay(5); + gpio_set_value(gf_dev->reset_gpio, 1); + mdelay(delay_ms); + return 0; +} + +int gf_irq_num(struct gf_dev *gf_dev) +{ + if (gf_dev == NULL) { + pr_info("Input buff is NULL.\n"); + return -EPERM; + } else { + return gpio_to_irq(gf_dev->irq_gpio); + } +} diff --git a/drivers/gpio/gpio-msm-smp2p.c b/drivers/gpio/gpio-msm-smp2p.c index bde81f0473bdb..ee7be47f115f9 100644 --- a/drivers/gpio/gpio-msm-smp2p.c +++ b/drivers/gpio/gpio-msm-smp2p.c @@ -1,6 +1,6 @@ /* drivers/gpio/gpio-msm-smp2p.c * - * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014, 2016 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 @@ -368,7 +368,7 @@ static int smp2p_irq_map(struct irq_domain *domain_ptr, unsigned int virq, chip = domain_ptr->host_data; if (!chip) { - SMP2P_ERR("%s: invalid domain ptr %p\n", __func__, domain_ptr); + SMP2P_ERR("%s: invalid domain ptr\n", __func__); return -ENODEV; } diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c index c81bda0ec2cf1..a8d6a0ef1b0cb 100644 --- a/drivers/gpio/gpiolib.c +++ b/drivers/gpio/gpiolib.c @@ -989,14 +989,6 @@ static int _gpiod_direction_output_raw(struct gpio_desc *desc, int value) struct gpio_chip *chip; int status = -EINVAL; - /* GPIOs used for IRQs shall not be set as output */ - if (test_bit(FLAG_USED_AS_IRQ, &desc->flags)) { - gpiod_err(desc, - "%s: tried to set a GPIO tied to an IRQ as output\n", - __func__); - return -EIO; - } - /* Open drain pin should not be driven to 1 */ if (value && test_bit(FLAG_OPEN_DRAIN, &desc->flags)) return gpiod_direction_input(desc); diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index cd0554f68316e..395d0248a38d7 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -34,10 +34,13 @@ static inline void __user *to_user_ptr(u64 address) } static struct msm_gem_submit *submit_create(struct drm_device *dev, - struct msm_gpu *gpu, int nr) + struct msm_gpu *gpu, uint32_t nr) { struct msm_gem_submit *submit; - int sz = sizeof(*submit) + (nr * sizeof(submit->bos[0])); + uint64_t sz = sizeof(*submit) + (nr * sizeof(submit->bos[0])); + + if (sz > SIZE_MAX) + return NULL; submit = kmalloc(sz, GFP_TEMPORARY | __GFP_NOWARN | __GFP_NORETRY); if (submit) { @@ -360,7 +363,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, void __user *userptr = to_user_ptr(args->cmds + (i * sizeof(submit_cmd))); struct msm_gem_object *msm_obj; - uint32_t iova; + uint64_t iova; + size_t size; ret = copy_from_user(&submit_cmd, userptr, sizeof(submit_cmd)); if (ret) { @@ -392,9 +396,12 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data, goto out; } - if ((submit_cmd.size + submit_cmd.submit_offset) >= - msm_obj->base.size) { - DRM_ERROR("invalid cmdstream size: %u\n", submit_cmd.size); + size = submit_cmd.size + submit_cmd.submit_offset; + + if (!submit_cmd.size || (size < submit_cmd.size) || + (size > msm_obj->base.size)) { + DRM_ERROR("invalid cmdstream offset/size: %u/%u\n", + submit_cmd.submit_offset, submit_cmd.size); ret = -EINVAL; goto out; } diff --git a/drivers/gpu/drm/nouveau/nouveau_usif.c b/drivers/gpu/drm/nouveau/nouveau_usif.c index cb1182d7e80ea..8d4fcc17b2b4e 100644 --- a/drivers/gpu/drm/nouveau/nouveau_usif.c +++ b/drivers/gpu/drm/nouveau/nouveau_usif.c @@ -316,6 +316,12 @@ usif_ioctl(struct drm_file *filp, void __user *user, u32 argc) } else goto done; + object = (void *)(unsigned long)argv->v0.token; + if (!access_ok(VERIFY_READ, object, sizeof(struct usif_object))) { + ret = -EINVAL; + goto done; + } + mutex_lock(&cli->mutex); switch (argv->v0.type) { case NVIF_IOCTL_V0_NEW: @@ -340,7 +346,6 @@ usif_ioctl(struct drm_file *filp, void __user *user, u32 argc) break; } if (argv->v0.route == NVDRM_OBJECT_USIF) { - object = (void *)(unsigned long)argv->v0.token; argv->v0.route = object->route; argv->v0.token = object->token; if (ret == 0 && argv->v0.type == NVIF_IOCTL_V0_DEL) { diff --git a/drivers/gpu/msm/a5xx_reg.h b/drivers/gpu/msm/a5xx_reg.h index e3974f0b0071f..f25b01823313f 100644 --- a/drivers/gpu/msm/a5xx_reg.h +++ b/drivers/gpu/msm/a5xx_reg.h @@ -640,6 +640,7 @@ /* UCHE registers */ #define A5XX_UCHE_ADDR_MODE_CNTL 0xE80 +#define A5XX_UCHE_MODE_CNTL 0xE81 #define A5XX_UCHE_WRITE_THRU_BASE_LO 0xE87 #define A5XX_UCHE_WRITE_THRU_BASE_HI 0xE88 #define A5XX_UCHE_TRAP_BASE_LO 0xE89 diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index d814f6754c25f..99654dcec4aed 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-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 @@ -579,7 +579,6 @@ void adreno_cp_callback(struct adreno_device *adreno_dev, int bit) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); - kgsl_schedule_work(&device->event_work); adreno_dispatcher_schedule(device); } @@ -589,11 +588,24 @@ static irqreturn_t adreno_irq_handler(struct kgsl_device *device) struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev); struct adreno_irq *irq_params = gpudev->irq; irqreturn_t ret = IRQ_NONE; - unsigned int status = 0, tmp; + unsigned int status = 0, tmp, int_bit; int i; + atomic_inc(&adreno_dev->pending_irq_refcnt); + smp_mb__after_atomic(); + adreno_readreg(adreno_dev, ADRENO_REG_RBBM_INT_0_STATUS, &status); + /* + * Clear all the interrupt bits but ADRENO_INT_RBBM_AHB_ERROR. Because + * even if we clear it here, it will stay high until it is cleared + * in its respective handler. Otherwise, the interrupt handler will + * fire again. + */ + int_bit = ADRENO_INT_BIT(adreno_dev, ADRENO_INT_RBBM_AHB_ERROR); + adreno_writereg(adreno_dev, ADRENO_REG_RBBM_INT_CLEAR_CMD, + status & ~int_bit); + /* Loop through all set interrupts and call respective handlers */ for (tmp = status; tmp != 0;) { i = fls(tmp) - 1; @@ -612,9 +624,18 @@ static irqreturn_t adreno_irq_handler(struct kgsl_device *device) gpudev->irq_trace(adreno_dev, status); - if (status) + /* + * Clear ADRENO_INT_RBBM_AHB_ERROR bit after this interrupt has been + * cleared in its respective handler + */ + if (status & int_bit) adreno_writereg(adreno_dev, ADRENO_REG_RBBM_INT_CLEAR_CMD, - status); + int_bit); + + smp_mb__before_atomic(); + atomic_dec(&adreno_dev->pending_irq_refcnt); + smp_mb__after_atomic(); + return ret; } @@ -1197,7 +1218,8 @@ static int adreno_init(struct kgsl_device *device) if (!adreno_is_a3xx(adreno_dev)) { int r = kgsl_allocate_global(device, - &adreno_dev->cmdbatch_profile_buffer, PAGE_SIZE, 0, 0); + &adreno_dev->cmdbatch_profile_buffer, PAGE_SIZE, + 0, 0, "alwayson"); adreno_dev->cmdbatch_profile_index = 0; @@ -2054,7 +2076,7 @@ static int adreno_setproperty(struct kgsl_device_private *dev_priv, KGSL_STATE_ACTIVE); device->pwrctrl.ctrl_flags = KGSL_PWR_ON; adreno_fault_detect_stop(adreno_dev); - kgsl_pwrscale_disable(device); + kgsl_pwrscale_disable(device, true); } mutex_unlock(&device->mutex); @@ -2106,7 +2128,18 @@ inline unsigned int adreno_irq_pending(struct adreno_device *adreno_dev) adreno_readreg(adreno_dev, ADRENO_REG_RBBM_INT_0_STATUS, &status); - return (status & gpudev->irq->mask) ? 1 : 0; + /* + * IRQ handler clears the RBBM INT0 status register immediately + * entering the ISR before actually serving the interrupt because + * of this we can't rely only on RBBM INT0 status only. + * Use pending_irq_refcnt along with RBBM INT0 to correctly + * determine whether any IRQ is pending or not. + */ + if ((status & gpudev->irq->mask) || + atomic_read(&adreno_dev->pending_irq_refcnt)) + return 1; + else + return 0; } @@ -2778,6 +2811,18 @@ static void adreno_regulator_disable_poll(struct kgsl_device *device) adreno_iommu_sync(device, false); } +static void adreno_gpu_model(struct kgsl_device *device, char *str, + size_t bufsz) +{ + struct adreno_device *adreno_dev = ADRENO_DEVICE(device); + + snprintf(str, bufsz, "Adreno%d%d%dv%d", + ADRENO_CHIPID_CORE(adreno_dev->chipid), + ADRENO_CHIPID_MAJOR(adreno_dev->chipid), + ADRENO_CHIPID_MINOR(adreno_dev->chipid), + ADRENO_CHIPID_PATCH(adreno_dev->chipid) + 1); +} + static const struct kgsl_functable adreno_functable = { /* Mandatory functions */ .regread = adreno_regread, @@ -2814,6 +2859,7 @@ static const struct kgsl_functable adreno_functable = { .regulator_disable = adreno_regulator_disable, .pwrlevel_change_settings = adreno_pwrlevel_change_settings, .regulator_disable_poll = adreno_regulator_disable_poll, + .gpu_model = adreno_gpu_model, }; static struct platform_driver adreno_platform_driver = { diff --git a/drivers/gpu/msm/adreno.h b/drivers/gpu/msm/adreno.h index 40c1178c852dd..bace2cb4cd07f 100644 --- a/drivers/gpu/msm/adreno.h +++ b/drivers/gpu/msm/adreno.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-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 @@ -196,6 +196,10 @@ struct adreno_gpudev; /* Time to allow preemption to complete (in ms) */ #define ADRENO_PREEMPT_TIMEOUT 10000 +#define ADRENO_INT_BIT(a, _bit) (((a)->gpucore->gpudev->int_bits) ? \ + (adreno_get_int(a, _bit) < 0 ? 0 : \ + BIT(adreno_get_int(a, _bit))) : 0) + /** * enum adreno_preempt_states * ADRENO_PREEMPT_NONE: No preemption is scheduled @@ -342,6 +346,7 @@ struct adreno_gpu_core { * @ram_cycles_lo: Number of DDR clock cycles for the monitor session * @perfctr_pwr_lo: Number of cycles VBIF is stalled by DDR * @halt: Atomic variable to check whether the GPU is currently halted + * @pending_irq_refcnt: Atomic variable to keep track of running IRQ handlers * @ctx_d_debugfs: Context debugfs node * @pwrctrl_flag: Flag to hold adreno specific power attributes * @cmdbatch_profile_buffer: Memdesc holding the cmdbatch profiling buffer @@ -399,6 +404,7 @@ struct adreno_device { unsigned int starved_ram_lo; unsigned int perfctr_pwr_lo; atomic_t halt; + atomic_t pending_irq_refcnt; struct dentry *ctx_d_debugfs; unsigned long pwrctrl_flag; @@ -572,6 +578,11 @@ enum adreno_regs { ADRENO_REG_REGISTER_MAX, }; +enum adreno_int_bits { + ADRENO_INT_RBBM_AHB_ERROR, + ADRENO_INT_BITS_MAX, +}; + /** * adreno_reg_offsets: Holds array of register offsets * @offsets: Offset array of size defined by enum adreno_regs @@ -587,6 +598,7 @@ struct adreno_reg_offsets { #define ADRENO_REG_UNUSED 0xFFFFFFFF #define ADRENO_REG_SKIP 0xFFFFFFFE #define ADRENO_REG_DEFINE(_offset, _reg) [_offset] = _reg +#define ADRENO_INT_DEFINE(_offset, _val) ADRENO_REG_DEFINE(_offset, _val) /* * struct adreno_vbif_data - Describes vbif register value pair @@ -724,6 +736,7 @@ struct adreno_gpudev { * so define them in the structure and use them as variables. */ const struct adreno_reg_offsets *reg_offsets; + unsigned int *const int_bits; const struct adreno_ft_perf_counters *ft_perf_counters; unsigned int ft_perf_counters_count; @@ -1088,6 +1101,23 @@ static inline unsigned int adreno_getreg(struct adreno_device *adreno_dev, return gpudev->reg_offsets->offsets[offset_name]; } +/* + * adreno_get_int() - Returns the offset value of an interrupt bit from + * the interrupt bit array in the gpudev node + * @adreno_dev: Pointer to the the adreno device + * @bit_name: The interrupt bit enum whose bit is returned + */ +static inline unsigned int adreno_get_int(struct adreno_device *adreno_dev, + enum adreno_int_bits bit_name) +{ + struct adreno_gpudev *gpudev = ADRENO_GPU_DEVICE(adreno_dev); + + if (bit_name >= ADRENO_INT_BITS_MAX) + return -ERANGE; + + return gpudev->int_bits[bit_name]; +} + /** * adreno_gpu_fault() - Return the current state of the GPU * @adreno_dev: A pointer to the adreno_device to query diff --git a/drivers/gpu/msm/adreno_a3xx.c b/drivers/gpu/msm/adreno_a3xx.c index 157f57bf80cd3..423071811b43b 100644 --- a/drivers/gpu/msm/adreno_a3xx.c +++ b/drivers/gpu/msm/adreno_a3xx.c @@ -211,7 +211,7 @@ static int _a3xx_pwron_fixup(struct adreno_device *adreno_dev) ret = kgsl_allocate_global(KGSL_DEVICE(adreno_dev), &adreno_dev->pwron_fixup, PAGE_SIZE, - KGSL_MEMFLAGS_GPUREADONLY, 0); + KGSL_MEMFLAGS_GPUREADONLY, 0, "pwron_fixup"); if (ret) return ret; @@ -1465,6 +1465,10 @@ static struct adreno_coresight a3xx_coresight = { .groups = a3xx_coresight_groups, }; +static unsigned int a3xx_int_bits[ADRENO_INT_BITS_MAX] = { + ADRENO_INT_DEFINE(ADRENO_INT_RBBM_AHB_ERROR, A3XX_INT_RBBM_AHB_ERROR), +}; + /* Register offset defines for A3XX */ static unsigned int a3xx_register_offsets[ADRENO_REG_REGISTER_MAX] = { ADRENO_REG_DEFINE(ADRENO_REG_CP_ME_RAM_WADDR, A3XX_CP_ME_RAM_WADDR), @@ -1893,6 +1897,7 @@ int a3xx_microcode_load(struct adreno_device *adreno_dev, struct adreno_gpudev adreno_a3xx_gpudev = { .reg_offsets = &a3xx_reg_offsets, + .int_bits = a3xx_int_bits, .ft_perf_counters = a3xx_ft_perf_counters, .ft_perf_counters_count = ARRAY_SIZE(a3xx_ft_perf_counters), .perfcounters = &a3xx_perfcounters, diff --git a/drivers/gpu/msm/adreno_a4xx.c b/drivers/gpu/msm/adreno_a4xx.c index b15d23cfbe0a9..41042b0fd7e10 100644 --- a/drivers/gpu/msm/adreno_a4xx.c +++ b/drivers/gpu/msm/adreno_a4xx.c @@ -727,6 +727,10 @@ static void a4xx_err_callback(struct adreno_device *adreno_dev, int bit) } } +static unsigned int a4xx_int_bits[ADRENO_INT_BITS_MAX] = { + ADRENO_INT_DEFINE(ADRENO_INT_RBBM_AHB_ERROR, A4XX_INT_RBBM_AHB_ERROR), +}; + /* Register offset defines for A4XX, in order of enum adreno_regs */ static unsigned int a4xx_register_offsets[ADRENO_REG_REGISTER_MAX] = { ADRENO_REG_DEFINE(ADRENO_REG_CP_ME_RAM_WADDR, A4XX_CP_ME_RAM_WADDR), @@ -1360,7 +1364,7 @@ static int _a4xx_pwron_fixup(struct adreno_device *adreno_dev) ret = kgsl_allocate_global(KGSL_DEVICE(adreno_dev), &adreno_dev->pwron_fixup, PAGE_SIZE, - KGSL_MEMFLAGS_GPUREADONLY, 0); + KGSL_MEMFLAGS_GPUREADONLY, 0, "pwron_fixup"); if (ret) return ret; @@ -1753,6 +1757,7 @@ static struct adreno_snapshot_data a4xx_snapshot_data = { struct adreno_gpudev adreno_a4xx_gpudev = { .reg_offsets = &a4xx_reg_offsets, + .int_bits = a4xx_int_bits, .ft_perf_counters = a4xx_ft_perf_counters, .ft_perf_counters_count = ARRAY_SIZE(a4xx_ft_perf_counters), .perfcounters = &a4xx_perfcounters, diff --git a/drivers/gpu/msm/adreno_a5xx.c b/drivers/gpu/msm/adreno_a5xx.c index 9cccc24b46e59..adad5dd6d0e8e 100644 --- a/drivers/gpu/msm/adreno_a5xx.c +++ b/drivers/gpu/msm/adreno_a5xx.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -244,12 +244,13 @@ static int a5xx_critical_packet_construct(struct adreno_device *adreno_dev) ret = kgsl_allocate_global(&adreno_dev->dev, &crit_pkts, PAGE_SIZE, - KGSL_MEMFLAGS_GPUREADONLY, 0); + KGSL_MEMFLAGS_GPUREADONLY, + 0, "crit_pkts"); if (ret) return ret; ret = kgsl_allocate_user(&adreno_dev->dev, &crit_pkts_refbuf0, - NULL, PAGE_SIZE, KGSL_MEMFLAGS_SECURE); + PAGE_SIZE, KGSL_MEMFLAGS_SECURE); if (ret) return ret; @@ -258,19 +259,19 @@ static int a5xx_critical_packet_construct(struct adreno_device *adreno_dev) ret = kgsl_allocate_global(&adreno_dev->dev, &crit_pkts_refbuf1, - PAGE_SIZE, 0, 0); + PAGE_SIZE, 0, 0, "crit_pkts_refbuf1"); if (ret) return ret; ret = kgsl_allocate_global(&adreno_dev->dev, &crit_pkts_refbuf2, - PAGE_SIZE, 0, 0); + PAGE_SIZE, 0, 0, "crit_pkts_refbuf2"); if (ret) return ret; ret = kgsl_allocate_global(&adreno_dev->dev, &crit_pkts_refbuf3, - PAGE_SIZE, 0, 0); + PAGE_SIZE, 0, 0, "crit_pkts_refbuf3"); if (ret) return ret; @@ -649,6 +650,10 @@ static int _load_gpmu_firmware(struct adreno_device *adreno_dev) if (ret) goto err; + /* Integer overflow check for cmd_size */ + if (data[2] > (data[0] - 2)) + goto err; + cmds = data + data[2] + 3; cmd_size = data[0] - data[2] - 2; @@ -1843,11 +1848,11 @@ static void a5xx_start(struct adreno_device *adreno_dev) set_bit(ADRENO_DEVICE_HANG_INTR, &adreno_dev->priv); gpudev->irq->mask |= (1 << A5XX_INT_MISC_HANG_DETECT); /* - * Set hang detection threshold to 1 million cycles - * (0xFFFF*16) + * Set hang detection threshold to 4 million cycles + * (0x3FFFF*16) */ kgsl_regwrite(device, A5XX_RBBM_INTERFACE_HANG_INT_CNTL, - (1 << 30) | 0xFFFF); + (1 << 30) | 0x3FFFF); } @@ -1942,6 +1947,11 @@ static void a5xx_start(struct adreno_device *adreno_dev) */ kgsl_regrmw(device, A5XX_RB_DBG_ECO_CNT, 0, (1 << 9)); } + /* + * Disable UCHE global filter as SP can invalidate/flush + * independently + */ + kgsl_regwrite(device, A5XX_UCHE_MODE_CNTL, BIT(29)); /* Set the USE_RETENTION_FLOPS chicken bit */ kgsl_regwrite(device, A5XX_CP_CHICKEN_DBG, 0x02000000); @@ -2456,7 +2466,7 @@ static int _load_firmware(struct kgsl_device *device, const char *fwfile, } ret = kgsl_allocate_global(device, ucode, fw->size - 4, - KGSL_MEMFLAGS_GPUREADONLY, 0); + KGSL_MEMFLAGS_GPUREADONLY, 0, "ucode"); if (ret) goto done; @@ -2944,6 +2954,10 @@ static struct adreno_ft_perf_counters a5xx_ft_perf_counters[] = { {KGSL_PERFCOUNTER_GROUP_TSE, A5XX_TSE_INPUT_PRIM_NUM}, }; +static unsigned int a5xx_int_bits[ADRENO_INT_BITS_MAX] = { + ADRENO_INT_DEFINE(ADRENO_INT_RBBM_AHB_ERROR, A5XX_INT_RBBM_AHB_ERROR), +}; + /* Register offset defines for A5XX, in order of enum adreno_regs */ static unsigned int a5xx_register_offsets[ADRENO_REG_REGISTER_MAX] = { ADRENO_REG_DEFINE(ADRENO_REG_CP_WFI_PEND_CTR, A5XX_CP_WFI_PEND_CTR), @@ -3172,7 +3186,6 @@ static void a5xx_irq_storm_worker(struct work_struct *work) mutex_unlock(&device->mutex); /* Reschedule just to make sure everything retires */ - kgsl_schedule_work(&device->event_work); adreno_dispatcher_schedule(device); } @@ -3223,8 +3236,6 @@ static void a5xx_cp_callback(struct adreno_device *adreno_dev, int bit) } a5xx_preemption_trigger(adreno_dev); - - kgsl_schedule_work(&device->event_work); adreno_dispatcher_schedule(device); } @@ -3579,6 +3590,7 @@ static struct adreno_coresight a5xx_coresight = { struct adreno_gpudev adreno_a5xx_gpudev = { .reg_offsets = &a5xx_reg_offsets, + .int_bits = a5xx_int_bits, .ft_perf_counters = a5xx_ft_perf_counters, .ft_perf_counters_count = ARRAY_SIZE(a5xx_ft_perf_counters), .coresight = &a5xx_coresight, diff --git a/drivers/gpu/msm/adreno_a5xx_preempt.c b/drivers/gpu/msm/adreno_a5xx_preempt.c index 27c3e85adeea5..4883a5e94a8fa 100644 --- a/drivers/gpu/msm/adreno_a5xx_preempt.c +++ b/drivers/gpu/msm/adreno_a5xx_preempt.c @@ -311,6 +311,8 @@ void a5xx_preempt_callback(struct adreno_device *adreno_dev, int bit) adreno_dev->cur_rb->dispatch_q.expires); adreno_set_preempt_state(adreno_dev, ADRENO_PREEMPT_NONE); + + a5xx_preemption_trigger(adreno_dev); } void a5xx_preemption_schedule(struct adreno_device *adreno_dev) @@ -490,7 +492,8 @@ static int a5xx_preemption_ringbuffer_init(struct adreno_device *adreno_dev, int ret; ret = kgsl_allocate_global(device, &rb->preemption_desc, - A5XX_CP_CTXRECORD_SIZE_IN_BYTES, 0, KGSL_MEMDESC_PRIVILEGED); + A5XX_CP_CTXRECORD_SIZE_IN_BYTES, 0, KGSL_MEMDESC_PRIVILEGED, + "preemption_desc"); if (ret) return ret; @@ -525,7 +528,8 @@ static int a5xx_preemption_iommu_init(struct adreno_device *adreno_dev) /* Allocate mem for storing preemption smmu record */ return kgsl_allocate_global(device, &iommu->smmu_info, PAGE_SIZE, - KGSL_MEMFLAGS_GPUREADONLY, KGSL_MEMDESC_PRIVILEGED); + KGSL_MEMFLAGS_GPUREADONLY, KGSL_MEMDESC_PRIVILEGED, + "smmu_info"); } #else static int a5xx_preemption_iommu_init(struct adreno_device *adreno_dev) @@ -555,7 +559,8 @@ int a5xx_preemption_init(struct adreno_device *adreno_dev) /* Allocate mem for storing preemption counters */ ret = kgsl_allocate_global(device, &preempt->counters, adreno_dev->num_ringbuffers * - A5XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE, 0, 0); + A5XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE, 0, 0, + "preemption_counters"); if (ret) return ret; diff --git a/drivers/gpu/msm/adreno_a5xx_snapshot.c b/drivers/gpu/msm/adreno_a5xx_snapshot.c index 04d82844a5e9b..aeffeab2f6dc0 100644 --- a/drivers/gpu/msm/adreno_a5xx_snapshot.c +++ b/drivers/gpu/msm/adreno_a5xx_snapshot.c @@ -1033,11 +1033,11 @@ void a5xx_crashdump_init(struct adreno_device *adreno_dev) /* The script buffers needs 2 extra qwords on the end */ if (kgsl_allocate_global(device, &capturescript, script_size + 16, KGSL_MEMFLAGS_GPUREADONLY, - KGSL_MEMDESC_PRIVILEGED)) + KGSL_MEMDESC_PRIVILEGED, "capturescript")) return; if (kgsl_allocate_global(device, ®isters, data_size, 0, - KGSL_MEMDESC_PRIVILEGED)) { + KGSL_MEMDESC_PRIVILEGED, "capturescript_regs")) { kgsl_free_global(KGSL_DEVICE(adreno_dev), &capturescript); return; } diff --git a/drivers/gpu/msm/adreno_debugfs.c b/drivers/gpu/msm/adreno_debugfs.c index 9cbcd06d76585..7cb482aabc774 100644 --- a/drivers/gpu/msm/adreno_debugfs.c +++ b/drivers/gpu/msm/adreno_debugfs.c @@ -131,6 +131,8 @@ typedef void (*reg_read_fill_t)(struct kgsl_device *device, int i, static void sync_event_print(struct seq_file *s, struct kgsl_cmdbatch_sync_event *sync_event) { + unsigned long flags; + switch (sync_event->type) { case KGSL_CMD_SYNCPOINT_TYPE_TIMESTAMP: { seq_printf(s, "sync: ctx: %d ts: %d", @@ -138,9 +140,13 @@ static void sync_event_print(struct seq_file *s, break; } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: - seq_printf(s, "sync: [%p] %s", sync_event->handle, + spin_lock_irqsave(&sync_event->handle_lock, flags); + + seq_printf(s, "sync: [%pK] %s", sync_event->handle, (sync_event->handle && sync_event->handle->fence) ? sync_event->handle->fence->name : "NULL"); + + spin_unlock_irqrestore(&sync_event->handle_lock, flags); break; default: seq_printf(s, "sync: type: %d", sync_event->type); diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c index bfc547fe16d10..370848ecd2835 100644 --- a/drivers/gpu/msm/adreno_dispatch.c +++ b/drivers/gpu/msm/adreno_dispatch.c @@ -1769,8 +1769,12 @@ static int dispatcher_do_fault(struct adreno_device *adreno_dev) /* Turn off all the timers */ del_timer_sync(&dispatcher->timer); del_timer_sync(&dispatcher->fault_timer); - del_timer_sync(&adreno_dev->preempt.timer); - + /* + * Deleting uninitialized timer will block for ever on kernel debug + * disable build. Hence skip del timer if it is not initialized. + */ + if (adreno_is_preemption_enabled(adreno_dev)) + del_timer_sync(&adreno_dev->preempt.timer); mutex_lock(&device->mutex); /* hang opcode */ @@ -1814,7 +1818,7 @@ static int dispatcher_do_fault(struct adreno_device *adreno_dev) } } - if (!adreno_cmdqueue_is_empty(dispatch_q)) { + if (dispatch_q && !adreno_cmdqueue_is_empty(dispatch_q)) { cmdbatch = dispatch_q->cmd_q[dispatch_q->head]; trace_adreno_cmdbatch_fault(cmdbatch, fault); } @@ -2123,19 +2127,18 @@ static void adreno_dispatcher_work(struct work_struct *work) break; } + kgsl_process_event_groups(device); + /* * dispatcher_do_fault() returns 0 if no faults occurred. If that is the * case, then clean up preemption and try to schedule more work */ if (dispatcher_do_fault(adreno_dev) == 0) { + /* Clean up after preemption */ if (gpudev->preemption_schedule) gpudev->preemption_schedule(adreno_dev); - /* Re-kick the event engine to catch stragglers */ - if (dispatcher->inflight == 0 && count != 0) - kgsl_schedule_work(&device->event_work); - /* Run the scheduler for to dispatch new commands */ _adreno_dispatcher_issuecmds(adreno_dev); } diff --git a/drivers/gpu/msm/adreno_profile.c b/drivers/gpu/msm/adreno_profile.c index c4fab8a5528ab..d8af520b2fe60 100644 --- a/drivers/gpu/msm/adreno_profile.c +++ b/drivers/gpu/msm/adreno_profile.c @@ -1071,7 +1071,8 @@ void adreno_profile_init(struct adreno_device *adreno_dev) /* allocate shared_buffer, which includes pre_ib and post_ib */ profile->shared_size = ADRENO_PROFILE_SHARED_BUF_SIZE_DWORDS; ret = kgsl_allocate_global(device, &profile->shared_buffer, - profile->shared_size * sizeof(unsigned int), 0, 0); + profile->shared_size * sizeof(unsigned int), + 0, 0, "profile"); if (ret) { profile->shared_size = 0; diff --git a/drivers/gpu/msm/adreno_ringbuffer.c b/drivers/gpu/msm/adreno_ringbuffer.c index dbcf9fc02a976..e601bf2c0fb8d 100644 --- a/drivers/gpu/msm/adreno_ringbuffer.c +++ b/drivers/gpu/msm/adreno_ringbuffer.c @@ -256,12 +256,12 @@ static int _adreno_ringbuffer_probe(struct adreno_device *adreno_dev, * switch pagetable */ ret = kgsl_allocate_global(KGSL_DEVICE(adreno_dev), &rb->pagetable_desc, - PAGE_SIZE, 0, KGSL_MEMDESC_PRIVILEGED); + PAGE_SIZE, 0, KGSL_MEMDESC_PRIVILEGED, "pagetable_desc"); if (ret) return ret; - return kgsl_allocate_global(KGSL_DEVICE(adreno_dev), &rb->buffer_desc, - KGSL_RB_SIZE, KGSL_MEMFLAGS_GPUREADONLY, 0); + KGSL_RB_SIZE, KGSL_MEMFLAGS_GPUREADONLY, + 0, "ringbuffer"); } int adreno_ringbuffer_probe(struct adreno_device *adreno_dev, bool nopreempt) diff --git a/drivers/gpu/msm/kgsl.c b/drivers/gpu/msm/kgsl.c index f6f1e4a0aabdd..dbc227a72522a 100644 --- a/drivers/gpu/msm/kgsl.c +++ b/drivers/gpu/msm/kgsl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-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 @@ -166,9 +166,10 @@ int kgsl_memfree_find_entry(pid_t ptname, uint64_t *gpuaddr, return 0; } -static void kgsl_memfree_purge(pid_t ptname, uint64_t gpuaddr, - uint64_t size) +static void kgsl_memfree_purge(struct kgsl_pagetable *pagetable, + uint64_t gpuaddr, uint64_t size) { + pid_t ptname = pagetable ? pagetable->name : 0; int i; if (memfree.list == NULL) @@ -249,8 +250,11 @@ kgsl_mem_entry_create(void) { struct kgsl_mem_entry *entry = kzalloc(sizeof(*entry), GFP_KERNEL); - if (entry != NULL) + if (entry != NULL) { kref_init(&entry->refcount); + /* put this ref in the caller functions after init */ + kref_get(&entry->refcount); + } return entry; } @@ -332,60 +336,24 @@ kgsl_mem_entry_destroy(struct kref *kref) } EXPORT_SYMBOL(kgsl_mem_entry_destroy); -/** - * kgsl_mem_entry_track_gpuaddr - Insert a mem_entry in the address tree and - * assign it with a gpu address space before insertion - * @process: the process that owns the memory - * @entry: the memory entry - * - * @returns - 0 on succcess else error code - * - * Insert the kgsl_mem_entry in to the rb_tree for searching by GPU address. - * The assignment of gpu address and insertion into list needs to - * happen with the memory lock held to avoid race conditions between - * gpu address being selected and some other thread looking through the - * rb list in search of memory based on gpuaddr - * This function should be called with processes memory spinlock held - */ -static int -kgsl_mem_entry_track_gpuaddr(struct kgsl_process_private *process, - struct kgsl_mem_entry *entry) +/* Allocate a IOVA for memory objects that don't use SVM */ +static int kgsl_mem_entry_track_gpuaddr(struct kgsl_device *device, + struct kgsl_process_private *process, + struct kgsl_mem_entry *entry) { - struct kgsl_pagetable *pagetable = process->pagetable; + struct kgsl_pagetable *pagetable; /* - * If cpu=gpu map is used then caller needs to set the - * gpu address + * If SVM is enabled for this object then the address needs to be + * assigned elsewhere */ - if (kgsl_memdesc_use_cpu_map(&entry->memdesc)) { - if (!entry->memdesc.gpuaddr) - return 0; - } else if (entry->memdesc.gpuaddr) { - WARN_ONCE(1, "gpuaddr assigned w/o holding memory lock\n"); - return -EINVAL; - } - if (kgsl_memdesc_is_secured(&entry->memdesc)) - pagetable = pagetable->mmu->securepagetable; - - return kgsl_mmu_get_gpuaddr(pagetable, &entry->memdesc); -} + if (kgsl_memdesc_use_cpu_map(&entry->memdesc)) + return 0; -/** - * kgsl_mem_entry_untrack_gpuaddr() - Untrack memory that is previously tracked - * process - Pointer to process private to which memory belongs - * entry - Memory entry to untrack - * - * Function just does the opposite of kgsl_mem_entry_track_gpuaddr. Needs to be - * called with processes spin lock held - */ -static void -kgsl_mem_entry_untrack_gpuaddr(struct kgsl_process_private *process, - struct kgsl_mem_entry *entry) -{ - struct kgsl_pagetable *pagetable = entry->memdesc.pagetable; + pagetable = kgsl_memdesc_is_secured(&entry->memdesc) ? + device->mmu.securepagetable : process->pagetable; - if (entry->memdesc.gpuaddr) - kgsl_mmu_put_gpuaddr(pagetable, &entry->memdesc); + return kgsl_mmu_get_gpuaddr(pagetable, &entry->memdesc); } /* Commit the entry to the process so it can be accessed by other operations */ @@ -399,33 +367,25 @@ static void kgsl_mem_entry_commit_process(struct kgsl_mem_entry *entry) spin_unlock(&entry->priv->mem_lock); } -/** - * kgsl_mem_entry_attach_process - Attach a mem_entry to its owner process - * @entry: the memory entry - * @process: the owner process - * - * Attach a newly created mem_entry to its owner process so that - * it can be found later. The mem_entry will be added to mem_idr and have - * its 'id' field assigned. - * - * @returns - 0 on success or error code on failure. +/* + * Attach the memory object to a process by (possibly) getting a GPU address and + * (possibly) mapping it */ -int -kgsl_mem_entry_attach_process(struct kgsl_mem_entry *entry, - struct kgsl_device_private *dev_priv) +static int kgsl_mem_entry_attach_process(struct kgsl_device *device, + struct kgsl_process_private *process, + struct kgsl_mem_entry *entry) { - int id; - int ret; - struct kgsl_process_private *process = dev_priv->process_priv; - struct kgsl_pagetable *pagetable = NULL; + int id, ret; ret = kgsl_process_private_get(process); if (!ret) return -EBADF; - ret = kgsl_mem_entry_track_gpuaddr(process, entry); - if (ret) - goto err_put_proc_priv; + ret = kgsl_mem_entry_track_gpuaddr(device, process, entry); + if (ret) { + kgsl_process_private_put(process); + return ret; + } idr_preload(GFP_KERNEL); spin_lock(&process->mem_lock); @@ -435,43 +395,37 @@ kgsl_mem_entry_attach_process(struct kgsl_mem_entry *entry, idr_preload_end(); if (id < 0) { - ret = id; - kgsl_mem_entry_untrack_gpuaddr(process, entry); - goto err_put_proc_priv; + if (!kgsl_memdesc_use_cpu_map(&entry->memdesc)) + kgsl_mmu_put_gpuaddr(&entry->memdesc); + kgsl_process_private_put(process); + return id; } entry->id = id; entry->priv = process; - /* map the memory after unlocking if gpuaddr has been assigned */ + /* + * Map the memory if a GPU address is already assigned, either through + * kgsl_mem_entry_track_gpuaddr() or via some other SVM process + */ if (entry->memdesc.gpuaddr) { - /* if a secured buffer map it to secure global pagetable */ - if (kgsl_memdesc_is_secured(&entry->memdesc)) - pagetable = process->pagetable->mmu->securepagetable; - else - pagetable = process->pagetable; + ret = kgsl_mmu_map(entry->memdesc.pagetable, &entry->memdesc); - entry->memdesc.pagetable = pagetable; - ret = kgsl_mmu_map(pagetable, &entry->memdesc); if (ret) kgsl_mem_entry_detach_process(entry); } - kgsl_memfree_purge(pagetable ? pagetable->name : 0, - entry->memdesc.gpuaddr, entry->memdesc.size); - - return ret; + kgsl_memfree_purge(entry->memdesc.pagetable, entry->memdesc.gpuaddr, + entry->memdesc.size); -err_put_proc_priv: - kgsl_process_private_put(process); return ret; } /* Detach a memory entry from a process and unmap it from the MMU */ - static void kgsl_mem_entry_detach_process(struct kgsl_mem_entry *entry) { unsigned int type; + if (entry == NULL) return; @@ -488,9 +442,7 @@ static void kgsl_mem_entry_detach_process(struct kgsl_mem_entry *entry) entry->priv->stats[type].cur -= entry->memdesc.size; spin_unlock(&entry->priv->mem_lock); - kgsl_mmu_unmap(entry->memdesc.pagetable, &entry->memdesc); - - kgsl_mem_entry_untrack_gpuaddr(entry->priv, entry); + kgsl_mmu_put_gpuaddr(&entry->memdesc); kgsl_process_private_put(entry->priv); @@ -525,21 +477,18 @@ void kgsl_context_dump(struct kgsl_context *context) EXPORT_SYMBOL(kgsl_context_dump); /* Allocate a new context ID */ -static int _kgsl_get_context_id(struct kgsl_device *device, - struct kgsl_context *context) +static int _kgsl_get_context_id(struct kgsl_device *device) { int id; idr_preload(GFP_KERNEL); write_lock(&device->context_lock); - id = idr_alloc(&device->context_idr, context, 1, + /* Allocate the slot but don't put a pointer in it yet */ + id = idr_alloc(&device->context_idr, NULL, 1, KGSL_MEMSTORE_MAX, GFP_NOWAIT); write_unlock(&device->context_lock); idr_preload_end(); - if (id > 0) - context->id = id; - return id; } @@ -563,7 +512,7 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv, char name[64]; int ret = 0, id; - id = _kgsl_get_context_id(device, context); + id = _kgsl_get_context_id(device); if (id == -ENOSPC) { /* * Before declaring that there are no contexts left try @@ -572,7 +521,7 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv, */ flush_workqueue(device->events_wq); - id = _kgsl_get_context_id(device, context); + id = _kgsl_get_context_id(device); } if (id < 0) { @@ -584,6 +533,8 @@ int kgsl_context_init(struct kgsl_device_private *dev_priv, return id; } + context->id = id; + kref_init(&context->refcount); /* * Get a refernce to the process private so its not destroyed, until @@ -1713,7 +1664,13 @@ long kgsl_ioctl_drawctxt_create(struct kgsl_device_private *dev_priv, goto done; } trace_kgsl_context_create(dev_priv->device, context, param->flags); + + /* Commit the pointer to the context in context_idr */ + write_lock(&device->context_lock); + idr_replace(&device->context_idr, context, context->id); param->drawctxt_id = context->id; + write_unlock(&device->context_lock); + done: return result; } @@ -2066,10 +2023,21 @@ static int kgsl_setup_anon_useraddr(struct kgsl_pagetable *pagetable, entry->memdesc.pagetable = pagetable; entry->memdesc.size = (uint64_t) size; entry->memdesc.useraddr = hostptr; - if (kgsl_memdesc_use_cpu_map(&entry->memdesc)) - entry->memdesc.gpuaddr = (uint64_t) entry->memdesc.useraddr; entry->memdesc.flags |= KGSL_MEMFLAGS_USERMEM_ADDR; + if (kgsl_memdesc_use_cpu_map(&entry->memdesc)) { + int ret; + + /* Register the address in the database */ + ret = kgsl_mmu_set_svm_region(pagetable, + (uint64_t) entry->memdesc.useraddr, (uint64_t) size); + + if (ret) + return ret; + + entry->memdesc.gpuaddr = (uint64_t) entry->memdesc.useraddr; + } + return memdesc_sg_virt(&entry->memdesc, NULL); } @@ -2142,21 +2110,23 @@ static int kgsl_setup_dmabuf_useraddr(struct kgsl_device *device, if (fd != 0) dmabuf = dma_buf_get(fd - 1); } - up_read(¤t->mm->mmap_sem); - if (IS_ERR_OR_NULL(dmabuf)) + if (IS_ERR_OR_NULL(dmabuf)) { + up_read(¤t->mm->mmap_sem); return dmabuf ? PTR_ERR(dmabuf) : -ENODEV; + } ret = kgsl_setup_dma_buf(device, pagetable, entry, dmabuf); if (ret) { dma_buf_put(dmabuf); + up_read(¤t->mm->mmap_sem); return ret; } /* Setup the user addr/cache mode for cache operations */ entry->memdesc.useraddr = hostptr; _setup_cache_mode(entry, vma); - + up_read(¤t->mm->mmap_sem); return 0; } #else @@ -2193,7 +2163,7 @@ static long _gpuobj_map_useraddr(struct kgsl_device *device, struct kgsl_mem_entry *entry, struct kgsl_gpuobj_import *param) { - struct kgsl_gpuobj_import_useraddr useraddr; + struct kgsl_gpuobj_import_useraddr useraddr = {0}; int ret; param->flags &= KGSL_MEMFLAGS_GPUREADONLY @@ -2319,7 +2289,7 @@ long kgsl_ioctl_gpuobj_import(struct kgsl_device_private *dev_priv, param->flags = entry->memdesc.flags; - ret = kgsl_mem_entry_attach_process(entry, dev_priv); + ret = kgsl_mem_entry_attach_process(dev_priv->device, private, entry); if (ret) goto unmap; @@ -2335,6 +2305,9 @@ long kgsl_ioctl_gpuobj_import(struct kgsl_device_private *dev_priv, trace_kgsl_mem_map(entry, fd); kgsl_mem_entry_commit_process(entry); + + /* put the extra refcount for kgsl_mem_entry_create() */ + kgsl_mem_entry_put(entry); return 0; unmap: @@ -2434,6 +2407,8 @@ static int kgsl_setup_dma_buf(struct kgsl_device *device, meta->dmabuf = dmabuf; meta->attach = attach; + attach->priv = entry; + entry->priv_data = meta; entry->memdesc.pagetable = pagetable; entry->memdesc.size = 0; @@ -2484,6 +2459,45 @@ static int kgsl_setup_dma_buf(struct kgsl_device *device, } #endif +#ifdef CONFIG_DMA_SHARED_BUFFER +void kgsl_get_egl_counts(struct kgsl_mem_entry *entry, + int *egl_surface_count, int *egl_image_count) +{ + struct kgsl_dma_buf_meta *meta = entry->priv_data; + struct dma_buf *dmabuf = meta->dmabuf; + struct dma_buf_attachment *mem_entry_buf_attachment = meta->attach; + struct device *buf_attachment_dev = mem_entry_buf_attachment->dev; + struct dma_buf_attachment *attachment = NULL; + + mutex_lock(&dmabuf->lock); + list_for_each_entry(attachment, &dmabuf->attachments, node) { + struct kgsl_mem_entry *scan_mem_entry = NULL; + + if (attachment->dev != buf_attachment_dev) + continue; + + scan_mem_entry = attachment->priv; + if (!scan_mem_entry) + continue; + + switch (kgsl_memdesc_get_memtype(&scan_mem_entry->memdesc)) { + case KGSL_MEMTYPE_EGL_SURFACE: + (*egl_surface_count)++; + break; + case KGSL_MEMTYPE_EGL_IMAGE: + (*egl_image_count)++; + break; + } + } + mutex_unlock(&dmabuf->lock); +} +#else +void kgsl_get_egl_counts(struct kgsl_mem_entry *entry, + int *egl_surface_count, int *egl_image_count) +{ +} +#endif + long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv, unsigned int cmd, void *data) { @@ -2582,7 +2596,8 @@ long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv, /* echo back flags */ param->flags = (unsigned int) entry->memdesc.flags; - result = kgsl_mem_entry_attach_process(entry, dev_priv); + result = kgsl_mem_entry_attach_process(dev_priv->device, private, + entry); if (result) goto error_attach; @@ -2599,6 +2614,9 @@ long kgsl_ioctl_map_user_mem(struct kgsl_device_private *dev_priv, trace_kgsl_mem_map(entry, param->fd); kgsl_mem_entry_commit_process(entry); + + /* put the extra refcount for kgsl_mem_entry_create() */ + kgsl_mem_entry_put(entry); return result; error_attach: @@ -2975,11 +2993,11 @@ static struct kgsl_mem_entry *gpumem_alloc_entry( entry->memdesc.priv |= KGSL_MEMDESC_SECURE; ret = kgsl_allocate_user(dev_priv->device, &entry->memdesc, - private->pagetable, size, flags); + size, flags); if (ret != 0) goto err; - ret = kgsl_mem_entry_attach_process(entry, dev_priv); + ret = kgsl_mem_entry_attach_process(dev_priv->device, private, entry); if (ret != 0) { kgsl_sharedmem_free(&entry->memdesc); goto err; @@ -3037,6 +3055,8 @@ long kgsl_ioctl_gpuobj_alloc(struct kgsl_device_private *dev_priv, param->mmapsize = kgsl_memdesc_footprint(&entry->memdesc); param->id = entry->id; + /* put the extra refcount for kgsl_mem_entry_create() */ + kgsl_mem_entry_put(entry); return 0; } @@ -3060,6 +3080,8 @@ long kgsl_ioctl_gpumem_alloc(struct kgsl_device_private *dev_priv, param->size = (size_t) entry->memdesc.size; param->flags = (unsigned int) entry->memdesc.flags; + /* put the extra refcount for kgsl_mem_entry_create() */ + kgsl_mem_entry_put(entry); return 0; } @@ -3083,6 +3105,8 @@ long kgsl_ioctl_gpumem_alloc_id(struct kgsl_device_private *dev_priv, param->mmapsize = (size_t) kgsl_memdesc_footprint(&entry->memdesc); param->gpuaddr = (unsigned long) entry->memdesc.gpuaddr; + /* put the extra refcount for kgsl_mem_entry_create() */ + kgsl_mem_entry_put(entry); return 0; } @@ -3396,16 +3420,16 @@ static unsigned long _gpu_set_svm_region(struct kgsl_process_private *private, return ret; entry->memdesc.gpuaddr = (uint64_t) addr; + entry->memdesc.pagetable = private->pagetable; ret = kgsl_mmu_map(private->pagetable, &entry->memdesc); if (ret) { - kgsl_mmu_put_gpuaddr(private->pagetable, - &entry->memdesc); + kgsl_mmu_put_gpuaddr(&entry->memdesc); return ret; } - kgsl_memfree_purge(private->pagetable ? private->pagetable->name : 0, - entry->memdesc.gpuaddr, entry->memdesc.size); + kgsl_memfree_purge(private->pagetable, entry->memdesc.gpuaddr, + entry->memdesc.size); return addr; } @@ -3890,9 +3914,8 @@ int kgsl_device_platform_probe(struct kgsl_device *device) disable_irq(device->pwrctrl.interrupt_num); KGSL_DRV_INFO(device, - "dev_id %d regs phys 0x%08lx size 0x%08x virt %p\n", - device->id, device->reg_phys, device->reg_len, - device->reg_virt); + "dev_id %d regs phys 0x%08lx size 0x%08x\n", + device->id, device->reg_phys, device->reg_len); rwlock_init(&device->context_lock); @@ -3908,13 +3931,13 @@ int kgsl_device_platform_probe(struct kgsl_device *device) goto error_close_mmu; status = kgsl_allocate_global(device, &device->memstore, - KGSL_MEMSTORE_SIZE, 0, KGSL_MEMDESC_CONTIG); + KGSL_MEMSTORE_SIZE, 0, KGSL_MEMDESC_CONTIG, "memstore"); if (status != 0) goto error_close_mmu; status = kgsl_allocate_global(device, &device->scratch, - PAGE_SIZE, 0, 0); + PAGE_SIZE, 0, 0, "scratch"); if (status != 0) goto error_free_memstore; @@ -3952,8 +3975,8 @@ int kgsl_device_platform_probe(struct kgsl_device *device) PM_QOS_DEFAULT_VALUE); } - - device->events_wq = create_singlethread_workqueue("kgsl-events"); + device->events_wq = alloc_workqueue("kgsl-events", + WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0); /* Initalize the snapshot engine */ kgsl_device_snapshot_init(device); @@ -4096,7 +4119,8 @@ static int __init kgsl_core_init(void) INIT_LIST_HEAD(&kgsl_driver.pagetable_list); - kgsl_driver.workqueue = create_singlethread_workqueue("kgsl-workqueue"); + kgsl_driver.workqueue = alloc_workqueue("kgsl-workqueue", + WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_SYSFS, 0); kgsl_driver.mem_workqueue = alloc_workqueue("kgsl-mementry", WQ_UNBOUND | WQ_MEM_RECLAIM, 0); diff --git a/drivers/gpu/msm/kgsl.h b/drivers/gpu/msm/kgsl.h index ee7149e1fd41c..d5a40e841b3f7 100644 --- a/drivers/gpu/msm/kgsl.h +++ b/drivers/gpu/msm/kgsl.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-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 @@ -31,7 +31,7 @@ /* The number of memstore arrays limits the number of contexts allowed. * If more contexts are needed, update multiple for MEMSTORE_SIZE */ -#define KGSL_MEMSTORE_SIZE ((int)(PAGE_SIZE * 2)) +#define KGSL_MEMSTORE_SIZE ((int)(PAGE_SIZE * 8)) #define KGSL_MEMSTORE_GLOBAL (0) #define KGSL_PRIORITY_MAX_RB_LEVELS 4 #define KGSL_MEMSTORE_MAX (KGSL_MEMSTORE_SIZE / \ @@ -379,6 +379,9 @@ long kgsl_ioctl_gpuobj_set_info(struct kgsl_device_private *dev_priv, void kgsl_mem_entry_destroy(struct kref *kref); +void kgsl_get_egl_counts(struct kgsl_mem_entry *entry, + int *egl_surface_count, int *egl_image_count); + struct kgsl_mem_entry * __must_check kgsl_sharedmem_find(struct kgsl_process_private *private, uint64_t gpuaddr); @@ -542,4 +545,19 @@ static inline void __user *to_user_ptr(uint64_t address) return (void __user *)(uintptr_t)address; } +static inline void kgsl_gpu_sysfs_add_link(struct kobject *dst, + struct kobject *src, const char *src_name, + const char *dst_name) +{ + struct kernfs_node *old; + + if (dst == NULL || src == NULL) + return; + + old = sysfs_get_dirent(src->sd, src_name); + if (IS_ERR_OR_NULL(old)) + return; + + kernfs_create_link(dst->sd, dst_name, old); +} #endif /* __KGSL_H */ diff --git a/drivers/gpu/msm/kgsl_cffdump.c b/drivers/gpu/msm/kgsl_cffdump.c index 2e90f78a303c8..8e783f8ce017e 100644 --- a/drivers/gpu/msm/kgsl_cffdump.c +++ b/drivers/gpu/msm/kgsl_cffdump.c @@ -513,10 +513,6 @@ EXPORT_SYMBOL(kgsl_cffdump_waitirq); static int subbuf_start_handler(struct rchan_buf *buf, void *subbuf, void *prev_subbuf, size_t prev_padding) { - pr_debug("kgsl: cffdump: subbuf_start_handler(subbuf=%p, prev_subbuf" - "=%p, prev_padding=%08zx)\n", subbuf, prev_subbuf, - prev_padding); - if (relay_buf_full(buf)) { if (!suspended) { suspended = 1; @@ -573,9 +569,6 @@ static struct rchan *create_channel(unsigned subbuf_size, unsigned n_subbufs) { struct rchan *chan; - pr_info("kgsl: cffdump: relay: create_channel: subbuf_size %u, " - "n_subbufs %u, dir 0x%p\n", subbuf_size, n_subbufs, dir); - chan = relay_open("cpu", dir, subbuf_size, n_subbufs, &relay_callbacks, NULL); if (!chan) { diff --git a/drivers/gpu/msm/kgsl_cmdbatch.c b/drivers/gpu/msm/kgsl_cmdbatch.c index ceca8b1e15226..19730d3f425db 100644 --- a/drivers/gpu/msm/kgsl_cmdbatch.c +++ b/drivers/gpu/msm/kgsl_cmdbatch.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-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 @@ -57,6 +57,7 @@ void kgsl_dump_syncpoints(struct kgsl_device *device, { struct kgsl_cmdbatch_sync_event *event; unsigned int i; + unsigned long flags; for (i = 0; i < cmdbatch->numsyncs; i++) { event = &cmdbatch->synclist[i]; @@ -79,12 +80,16 @@ void kgsl_dump_syncpoints(struct kgsl_device *device, break; } case KGSL_CMD_SYNCPOINT_TYPE_FENCE: + spin_lock_irqsave(&event->handle_lock, flags); + if (event->handle) - dev_err(device->dev, " fence: [%p] %s\n", + dev_err(device->dev, " fence: [%pK] %s\n", event->handle->fence, event->handle->name); else dev_err(device->dev, " fence: invalid\n"); + + spin_unlock_irqrestore(&event->handle_lock, flags); break; } } @@ -96,6 +101,7 @@ static void _kgsl_cmdbatch_timer(unsigned long data) struct kgsl_cmdbatch *cmdbatch = (struct kgsl_cmdbatch *) data; struct kgsl_cmdbatch_sync_event *event; unsigned int i; + unsigned long flags; if (cmdbatch == NULL || cmdbatch->context == NULL) return; @@ -124,12 +130,16 @@ static void _kgsl_cmdbatch_timer(unsigned long data) i, event->context->id, event->timestamp); break; case KGSL_CMD_SYNCPOINT_TYPE_FENCE: + spin_lock_irqsave(&event->handle_lock, flags); + if (event->handle != NULL) { dev_err(device->dev, " [%d] FENCE %s\n", i, event->handle->fence ? event->handle->fence->name : "NULL"); kgsl_sync_fence_log(event->handle->fence); } + + spin_unlock_irqrestore(&event->handle_lock, flags); break; } } @@ -221,7 +231,7 @@ static inline void _free_memobj_list(struct list_head *list) void kgsl_cmdbatch_destroy(struct kgsl_cmdbatch *cmdbatch) { unsigned int i; - unsigned long pending; + unsigned long pending, flags; if (IS_ERR_OR_NULL(cmdbatch)) return; @@ -255,8 +265,17 @@ void kgsl_cmdbatch_destroy(struct kgsl_cmdbatch *cmdbatch) kgsl_cmdbatch_sync_func, event); break; case KGSL_CMD_SYNCPOINT_TYPE_FENCE: - if (kgsl_sync_fence_async_cancel(event->handle)) + spin_lock_irqsave(&event->handle_lock, flags); + + if (kgsl_sync_fence_async_cancel(event->handle)) { + event->handle = NULL; + spin_unlock_irqrestore( + &event->handle_lock, flags); kgsl_cmdbatch_put(cmdbatch); + } else { + spin_unlock_irqrestore( + &event->handle_lock, flags); + } break; } } @@ -293,12 +312,23 @@ EXPORT_SYMBOL(kgsl_cmdbatch_destroy); */ static void kgsl_cmdbatch_sync_fence_func(void *priv) { + unsigned long flags; struct kgsl_cmdbatch_sync_event *event = priv; + kgsl_cmdbatch_sync_expire(event->device, event); + trace_syncpoint_fence_expire(event->cmdbatch, event->handle ? event->handle->name : "unknown"); - kgsl_cmdbatch_sync_expire(event->device, event); + spin_lock_irqsave(&event->handle_lock, flags); + + /* + * Setting the event->handle to NULL here make sure that + * other function does not dereference a invalid pointer. + */ + event->handle = NULL; + + spin_unlock_irqrestore(&event->handle_lock, flags); kgsl_cmdbatch_put(event->cmdbatch); } @@ -315,7 +345,14 @@ static int kgsl_cmdbatch_add_sync_fence(struct kgsl_device *device, { struct kgsl_cmd_syncpoint_fence *sync = priv; struct kgsl_cmdbatch_sync_event *event; + struct sync_fence *fence = NULL; unsigned int id; + unsigned long flags; + int ret = 0; + + fence = sync_fence_fdget(sync->fd); + if (fence == NULL) + return -EINVAL; kref_get(&cmdbatch->refcount); @@ -329,32 +366,38 @@ static int kgsl_cmdbatch_add_sync_fence(struct kgsl_device *device, event->device = device; event->context = NULL; + spin_lock_init(&event->handle_lock); set_bit(event->id, &cmdbatch->pending); + trace_syncpoint_fence(cmdbatch, fence->name); + + spin_lock_irqsave(&event->handle_lock, flags); + event->handle = kgsl_sync_fence_async_wait(sync->fd, kgsl_cmdbatch_sync_fence_func, event); if (IS_ERR_OR_NULL(event->handle)) { - int ret = PTR_ERR(event->handle); + ret = PTR_ERR(event->handle); - clear_bit(event->id, &cmdbatch->pending); event->handle = NULL; + spin_unlock_irqrestore(&event->handle_lock, flags); + clear_bit(event->id, &cmdbatch->pending); kgsl_cmdbatch_put(cmdbatch); /* - * If ret == 0 the fence was already signaled - print a trace - * message so we can track that - */ - if (ret == 0) - trace_syncpoint_fence_expire(cmdbatch, "signaled"); - - return ret; + * Print a syncpoint_fence_expire trace if + * fence is already signaled or there is + * a failure in registering the fence waiter. + */ + trace_syncpoint_fence_expire(cmdbatch, (ret < 0) ? + "error" : fence->name); + } else { + spin_unlock_irqrestore(&event->handle_lock, flags); } - trace_syncpoint_fence(cmdbatch, event->handle->name); - - return 0; + sync_fence_put(fence); + return ret; } /* kgsl_cmdbatch_add_sync_timestamp() - Add a new sync point for a cmdbatch diff --git a/drivers/gpu/msm/kgsl_cmdbatch.h b/drivers/gpu/msm/kgsl_cmdbatch.h index d5cbf375b5d35..b37f432f3e7d1 100644 --- a/drivers/gpu/msm/kgsl_cmdbatch.h +++ b/drivers/gpu/msm/kgsl_cmdbatch.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2008-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 @@ -84,6 +84,7 @@ struct kgsl_cmdbatch { * @context: Pointer to the KGSL context that owns the cmdbatch * @timestamp: Pending timestamp for the event * @handle: Pointer to a sync fence handle + * @handle_lock: Spin lock to protect handle * @device: Pointer to the KGSL device */ struct kgsl_cmdbatch_sync_event { @@ -93,6 +94,7 @@ struct kgsl_cmdbatch_sync_event { struct kgsl_context *context; unsigned int timestamp; struct kgsl_sync_fence_waiter *handle; + spinlock_t handle_lock; struct kgsl_device *device; }; diff --git a/drivers/gpu/msm/kgsl_debugfs.c b/drivers/gpu/msm/kgsl_debugfs.c index 93ac790f3a551..b7ca9f0e86ca1 100644 --- a/drivers/gpu/msm/kgsl_debugfs.c +++ b/drivers/gpu/msm/kgsl_debugfs.c @@ -125,13 +125,15 @@ static char get_cacheflag(const struct kgsl_memdesc *m) } -static int print_mem_entry(int id, void *ptr, void *data) +static int print_mem_entry(void *data, void *ptr) { struct seq_file *s = data; struct kgsl_mem_entry *entry = ptr; char flags[9]; char usage[16]; struct kgsl_memdesc *m = &entry->memdesc; + unsigned int usermem_type = kgsl_memdesc_usermem_type(m); + int egl_surface_count = 0, egl_image_count = 0; flags[0] = kgsl_memdesc_is_global(m) ? 'g' : '-'; flags[1] = '-'; @@ -145,12 +147,17 @@ static int print_mem_entry(int id, void *ptr, void *data) kgsl_get_memory_usage(usage, sizeof(usage), m->flags); - seq_printf(s, "%pK %pK %16llu %5d %9s %10s %16s %5d %16llu", + if (usermem_type == KGSL_MEM_ENTRY_ION) + kgsl_get_egl_counts(entry, &egl_surface_count, + &egl_image_count); + + seq_printf(s, "%pK %pK %16llu %5d %9s %10s %16s %5d %16llu %6d %6d", (uint64_t *)(uintptr_t) m->gpuaddr, (unsigned long *) m->useraddr, m->size, entry->id, flags, - memtype_str(kgsl_memdesc_usermem_type(m)), - usage, (m->sgt ? m->sgt->nents : 0), m->mapsize); + memtype_str(usermem_type), + usage, (m->sgt ? m->sgt->nents : 0), m->mapsize, + egl_surface_count, egl_image_count); if (entry->metadata[0] != 0) seq_printf(s, " %s", entry->metadata); @@ -160,25 +167,83 @@ static int print_mem_entry(int id, void *ptr, void *data) return 0; } -static int process_mem_print(struct seq_file *s, void *unused) +static struct kgsl_mem_entry *process_mem_seq_find(struct seq_file *s, + void *ptr, loff_t pos) { + struct kgsl_mem_entry *entry = ptr; struct kgsl_process_private *private = s->private; + int id = 0; + loff_t temp_pos = 1; - seq_printf(s, "%16s %16s %16s %5s %9s %10s %16s %5s %16s\n", - "gpuaddr", "useraddr", "size", "id", "flags", "type", - "usage", "sglen", "mapsize"); + if (entry != SEQ_START_TOKEN) + id = entry->id + 1; spin_lock(&private->mem_lock); - idr_for_each(&private->mem_idr, print_mem_entry, s); + for (entry = idr_get_next(&private->mem_idr, &id); entry; + id++, entry = idr_get_next(&private->mem_idr, &id), + temp_pos++) { + if (temp_pos == pos && kgsl_mem_entry_get(entry)) { + spin_unlock(&private->mem_lock); + goto found; + } + } spin_unlock(&private->mem_lock); - return 0; + entry = NULL; +found: + if (ptr != SEQ_START_TOKEN) + kgsl_mem_entry_put(ptr); + + return entry; } +static void *process_mem_seq_start(struct seq_file *s, loff_t *pos) +{ + loff_t seq_file_offset = *pos; + + if (seq_file_offset == 0) + return SEQ_START_TOKEN; + else + return process_mem_seq_find(s, SEQ_START_TOKEN, + seq_file_offset); +} + +static void process_mem_seq_stop(struct seq_file *s, void *ptr) +{ + if (ptr && ptr != SEQ_START_TOKEN) + kgsl_mem_entry_put(ptr); +} + +static void *process_mem_seq_next(struct seq_file *s, void *ptr, + loff_t *pos) +{ + ++*pos; + return process_mem_seq_find(s, ptr, 1); +} + +static int process_mem_seq_show(struct seq_file *s, void *ptr) +{ + if (ptr == SEQ_START_TOKEN) { + seq_printf(s, "%16s %16s %16s %5s %9s %10s %16s %5s %16s %6s %6s\n", + "gpuaddr", "useraddr", "size", "id", "flags", "type", + "usage", "sglen", "mapsize", "eglsrf", "eglimg"); + return 0; + } else + return print_mem_entry(s, ptr); +} + +static const struct seq_operations process_mem_seq_fops = { + .start = process_mem_seq_start, + .stop = process_mem_seq_stop, + .next = process_mem_seq_next, + .show = process_mem_seq_show, +}; + static int process_mem_open(struct inode *inode, struct file *file) { int ret; pid_t pid = (pid_t) (unsigned long) inode->i_private; + struct seq_file *s = NULL; struct kgsl_process_private *private = NULL; private = kgsl_process_private_find(pid); @@ -186,9 +251,13 @@ static int process_mem_open(struct inode *inode, struct file *file) if (!private) return -ENODEV; - ret = single_open(file, process_mem_print, private); + ret = seq_open(file, &process_mem_seq_fops); if (ret) kgsl_process_private_put(private); + else { + s = file->private_data; + s->private = private; + } return ret; } @@ -201,7 +270,7 @@ static int process_mem_release(struct inode *inode, struct file *file) if (private) kgsl_process_private_put(private); - return single_release(inode, file); + return seq_release(inode, file); } static const struct file_operations process_mem_fops = { @@ -212,6 +281,29 @@ static const struct file_operations process_mem_fops = { }; +static int globals_print(struct seq_file *s, void *unused) +{ + kgsl_print_global_pt_entries(s); + return 0; +} + +static int globals_open(struct inode *inode, struct file *file) +{ + return single_open(file, globals_print, NULL); +} + +static int globals_release(struct inode *inode, struct file *file) +{ + return single_release(inode, file); +} + +static const struct file_operations global_fops = { + .open = globals_open, + .read = seq_read, + .llseek = seq_lseek, + .release = globals_release, +}; + /** * kgsl_process_init_debugfs() - Initialize debugfs for a process * @private: Pointer to process private structure created for the process @@ -259,6 +351,9 @@ void kgsl_core_debugfs_init(void) kgsl_debugfs_dir = debugfs_create_dir("kgsl", NULL); + debugfs_create_file("globals", 0444, kgsl_debugfs_dir, NULL, + &global_fops); + debug_dir = debugfs_create_dir("debug", kgsl_debugfs_dir); debugfs_create_file("strict_memory", 0644, debug_dir, NULL, diff --git a/drivers/gpu/msm/kgsl_device.h b/drivers/gpu/msm/kgsl_device.h index f864a9479bce7..6240015f0e3c6 100644 --- a/drivers/gpu/msm/kgsl_device.h +++ b/drivers/gpu/msm/kgsl_device.h @@ -169,6 +169,8 @@ struct kgsl_functable { void (*pwrlevel_change_settings)(struct kgsl_device *device, unsigned int prelevel, unsigned int postlevel, bool post); void (*regulator_disable_poll)(struct kgsl_device *device); + void (*gpu_model)(struct kgsl_device *device, char *str, + size_t bufsz); }; struct kgsl_ioctl { @@ -275,7 +277,6 @@ struct kgsl_device { int mem_log; int pwr_log; struct kgsl_pwrscale pwrscale; - struct work_struct event_work; int reset_counter; /* Track how many GPU core resets have occured */ int cff_dump_enable; @@ -285,6 +286,7 @@ struct kgsl_device { /* Number of active contexts seen globally for this device */ int active_context_count; + struct kobject *gpu_sysfs_kobj; }; #define KGSL_MMU_DEVICE(_mmu) \ @@ -295,8 +297,6 @@ struct kgsl_device { .cmdbatch_gate = COMPLETION_INITIALIZER((_dev).cmdbatch_gate),\ .idle_check_ws = __WORK_INITIALIZER((_dev).idle_check_ws,\ kgsl_idle_check),\ - .event_work = __WORK_INITIALIZER((_dev).event_work,\ - kgsl_process_events),\ .context_idr = IDR_INIT((_dev).context_idr),\ .wait_queue = __WAIT_QUEUE_HEAD_INITIALIZER((_dev).wait_queue),\ .active_cnt_wq = __WAIT_QUEUE_HEAD_INITIALIZER((_dev).active_cnt_wq),\ @@ -617,7 +617,7 @@ void kgsl_process_event_group(struct kgsl_device *device, struct kgsl_event_group *group); void kgsl_flush_event_group(struct kgsl_device *device, struct kgsl_event_group *group); -void kgsl_process_events(struct work_struct *work); +void kgsl_process_event_groups(struct kgsl_device *device); void kgsl_context_destroy(struct kref *kref); diff --git a/drivers/gpu/msm/kgsl_events.c b/drivers/gpu/msm/kgsl_events.c index 6f70b9ddd3763..6e8abf36c50f9 100644 --- a/drivers/gpu/msm/kgsl_events.c +++ b/drivers/gpu/msm/kgsl_events.c @@ -314,22 +314,16 @@ EXPORT_SYMBOL(kgsl_add_event); static DEFINE_RWLOCK(group_lock); static LIST_HEAD(group_list); -/** - * kgsl_process_events() - Work queue for processing new timestamp events - * @work: Pointer to a work_struct - */ -void kgsl_process_events(struct work_struct *work) +void kgsl_process_event_groups(struct kgsl_device *device) { struct kgsl_event_group *group; - struct kgsl_device *device = container_of(work, struct kgsl_device, - event_work); read_lock(&group_lock); list_for_each_entry(group, &group_list, group) _process_event_group(device, group, false); read_unlock(&group_lock); } -EXPORT_SYMBOL(kgsl_process_events); +EXPORT_SYMBOL(kgsl_process_event_groups); /** * kgsl_del_event_group() - Remove a GPU event group diff --git a/drivers/gpu/msm/kgsl_iommu.c b/drivers/gpu/msm/kgsl_iommu.c index b467ef81d2577..724d129aab1a8 100644 --- a/drivers/gpu/msm/kgsl_iommu.c +++ b/drivers/gpu/msm/kgsl_iommu.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -38,6 +38,10 @@ #define _IOMMU_PRIV(_mmu) (&((_mmu)->priv.iommu)) +#define ADDR_IN_GLOBAL(_a) \ + (((_a) >= KGSL_IOMMU_GLOBAL_MEM_BASE) && \ + ((_a) < (KGSL_IOMMU_GLOBAL_MEM_BASE + KGSL_IOMMU_GLOBAL_MEM_SIZE))) + static struct kgsl_mmu_pt_ops iommu_pt_ops; static bool need_iommu_sync; @@ -92,19 +96,41 @@ static struct kmem_cache *addr_entry_cache; #define GLOBAL_PT_ENTRIES 32 -static struct kgsl_memdesc *global_pt_entries[GLOBAL_PT_ENTRIES]; +struct global_pt_entry { + struct kgsl_memdesc *memdesc; + char name[32]; +}; + +static struct global_pt_entry global_pt_entries[GLOBAL_PT_ENTRIES]; static struct kgsl_memdesc *kgsl_global_secure_pt_entry; static int global_pt_count; uint64_t global_pt_alloc; static struct kgsl_memdesc gpu_qdss_desc; +void kgsl_print_global_pt_entries(struct seq_file *s) +{ + int i; + + for (i = 0; i < global_pt_count; i++) { + struct kgsl_memdesc *memdesc = global_pt_entries[i].memdesc; + + if (memdesc == NULL) + continue; + + seq_printf(s, "0x%16.16llX-0x%16.16llX %16llu %s\n", + memdesc->gpuaddr, memdesc->gpuaddr + memdesc->size - 1, + memdesc->size, global_pt_entries[i].name); + } +} + static void kgsl_iommu_unmap_globals(struct kgsl_pagetable *pagetable) { unsigned int i; for (i = 0; i < global_pt_count; i++) { - if (global_pt_entries[i] != NULL) - kgsl_mmu_unmap(pagetable, global_pt_entries[i]); + if (global_pt_entries[i].memdesc != NULL) + kgsl_mmu_unmap(pagetable, + global_pt_entries[i].memdesc); } } @@ -113,8 +139,9 @@ static void kgsl_iommu_map_globals(struct kgsl_pagetable *pagetable) unsigned int i; for (i = 0; i < global_pt_count; i++) { - if (global_pt_entries[i] != NULL) { - int ret = kgsl_mmu_map(pagetable, global_pt_entries[i]); + if (global_pt_entries[i].memdesc != NULL) { + int ret = kgsl_mmu_map(pagetable, + global_pt_entries[i].memdesc); BUG_ON(ret); } @@ -152,17 +179,17 @@ static void kgsl_iommu_remove_global(struct kgsl_mmu *mmu, return; for (i = 0; i < global_pt_count; i++) { - if (global_pt_entries[i] == memdesc) { + if (global_pt_entries[i].memdesc == memdesc) { memdesc->gpuaddr = 0; memdesc->priv &= ~KGSL_MEMDESC_GLOBAL; - global_pt_entries[i] = NULL; + global_pt_entries[i].memdesc = NULL; return; } } } static void kgsl_iommu_add_global(struct kgsl_mmu *mmu, - struct kgsl_memdesc *memdesc) + struct kgsl_memdesc *memdesc, const char *name) { if (memdesc->gpuaddr != 0) return; @@ -174,7 +201,10 @@ static void kgsl_iommu_add_global(struct kgsl_mmu *mmu, memdesc->priv |= KGSL_MEMDESC_GLOBAL; global_pt_alloc += memdesc->size; - global_pt_entries[global_pt_count++] = memdesc; + global_pt_entries[global_pt_count].memdesc = memdesc; + strlcpy(global_pt_entries[global_pt_count].name, name, + sizeof(global_pt_entries[global_pt_count].name)); + global_pt_count++; } void kgsl_add_global_secure_entry(struct kgsl_device *device, @@ -220,7 +250,7 @@ static void kgsl_setup_qdss_desc(struct kgsl_device *device) return; } - kgsl_mmu_add_global(device, &gpu_qdss_desc); + kgsl_mmu_add_global(device, &gpu_qdss_desc, "gpu-qdss"); } static inline void kgsl_cleanup_qdss_desc(struct kgsl_mmu *mmu) @@ -323,8 +353,8 @@ static int _iommu_map_sync_pc(struct kgsl_pagetable *pt, _unlock_if_secure_mmu(memdesc, pt->mmu); if (ret) { - KGSL_CORE_ERR("map err: %p, 0x%016llX, 0x%llx, 0x%x, %d\n", - iommu_pt->domain, gpuaddr, size, flags, ret); + KGSL_CORE_ERR("map err: 0x%016llX, 0x%llx, 0x%x, %d\n", + gpuaddr, size, flags, ret); return -ENODEV; } @@ -351,8 +381,8 @@ static int _iommu_unmap_sync_pc(struct kgsl_pagetable *pt, _unlock_if_secure_mmu(memdesc, pt->mmu); if (unmapped != size) { - KGSL_CORE_ERR("unmap err: %p, 0x%016llx, 0x%llx, %zd\n", - iommu_pt->domain, addr, size, unmapped); + KGSL_CORE_ERR("unmap err: 0x%016llx, 0x%llx, %zd\n", + addr, size, unmapped); return -ENODEV; } @@ -421,8 +451,8 @@ static int _iommu_map_sg_offset_sync_pc(struct kgsl_pagetable *pt, if (size != 0) { /* Cleanup on error */ _iommu_unmap_sync_pc(pt, memdesc, addr, mapped); - KGSL_CORE_ERR("map err: %p, 0x%016llX, %d, %x, %zd\n", - iommu_pt->domain, addr, nents, flags, mapped); + KGSL_CORE_ERR("map err: 0x%016llX, %d, %x, %zd\n", + addr, nents, flags, mapped); return -ENODEV; } @@ -451,8 +481,8 @@ static int _iommu_map_sg_sync_pc(struct kgsl_pagetable *pt, _unlock_if_secure_mmu(memdesc, pt->mmu); if (mapped == 0) { - KGSL_CORE_ERR("map err: %p, 0x%016llX, %d, %x, %zd\n", - iommu_pt->domain, addr, nents, flags, mapped); + KGSL_CORE_ERR("map err: 0x%016llX, %d, %x, %zd\n", + addr, nents, flags, mapped); return -ENODEV; } @@ -485,8 +515,62 @@ struct _mem_entry { unsigned int priv; int pending_free; pid_t pid; + char name[32]; }; +static void _get_global_entries(uint64_t faultaddr, + struct _mem_entry *prev, + struct _mem_entry *next) +{ + int i; + uint64_t prevaddr = 0; + struct global_pt_entry *p = NULL; + + uint64_t nextaddr = (uint64_t) -1; + struct global_pt_entry *n = NULL; + + for (i = 0; i < global_pt_count; i++) { + uint64_t addr; + + if (global_pt_entries[i].memdesc == NULL) + continue; + + addr = global_pt_entries[i].memdesc->gpuaddr; + if ((addr < faultaddr) && (addr > prevaddr)) { + prevaddr = addr; + p = &global_pt_entries[i]; + } + + if ((addr > faultaddr) && (addr < nextaddr)) { + nextaddr = addr; + n = &global_pt_entries[i]; + } + } + + if (p != NULL) { + prev->gpuaddr = p->memdesc->gpuaddr; + prev->size = p->memdesc->size; + prev->flags = p->memdesc->flags; + prev->priv = p->memdesc->priv; + prev->pid = 0; + strlcpy(prev->name, p->name, sizeof(prev->name)); + } + + if (n != NULL) { + next->gpuaddr = n->memdesc->gpuaddr; + next->size = n->memdesc->size; + next->flags = n->memdesc->flags; + next->priv = n->memdesc->priv; + next->pid = 0; + strlcpy(next->name, n->name, sizeof(next->name)); + } +} + +void __kgsl_get_memory_usage(struct _mem_entry *entry) +{ + kgsl_get_memory_usage(entry->name, sizeof(entry->name), entry->flags); +} + static void _get_entries(struct kgsl_process_private *private, uint64_t faultaddr, struct _mem_entry *prev, struct _mem_entry *next) @@ -521,6 +605,7 @@ static void _get_entries(struct kgsl_process_private *private, prev->priv = p->memdesc.priv; prev->pending_free = p->pending_free; prev->pid = private->pid; + __kgsl_get_memory_usage(prev); } if (n != NULL) { @@ -530,6 +615,7 @@ static void _get_entries(struct kgsl_process_private *private, next->priv = n->memdesc.priv; next->pending_free = n->pending_free; next->pid = private->pid; + __kgsl_get_memory_usage(next); } } @@ -545,7 +631,9 @@ static void _find_mem_entries(struct kgsl_mmu *mmu, uint64_t faultaddr, /* Set the maximum possible size as an initial value */ nextentry->gpuaddr = (uint64_t) -1; - if (context) { + if (ADDR_IN_GLOBAL(faultaddr)) { + _get_global_entries(faultaddr, preventry, nextentry); + } else if (context) { private = context->proc_priv; spin_lock(&private->mem_lock); _get_entries(private, faultaddr, preventry, nextentry); @@ -555,18 +643,13 @@ static void _find_mem_entries(struct kgsl_mmu *mmu, uint64_t faultaddr, static void _print_entry(struct kgsl_device *device, struct _mem_entry *entry) { - char name[32]; - memset(name, 0, sizeof(name)); - - kgsl_get_memory_usage(name, sizeof(name) - 1, entry->flags); - KGSL_LOG_DUMP(device, "[%016llX - %016llX] %s %s (pid = %d) (%s)\n", entry->gpuaddr, entry->gpuaddr + entry->size, entry->priv & KGSL_MEMDESC_GUARD_PAGE ? "(+guard)" : "", entry->pending_free ? "(pending free)" : "", - entry->pid, name); + entry->pid, entry->name); } static void _check_if_freed(struct kgsl_iommu_context *ctx, @@ -1319,17 +1402,16 @@ static int _setstate_alloc(struct kgsl_device *device, { int ret; - ret = kgsl_sharedmem_alloc_contig(device, &iommu->setstate, NULL, - PAGE_SIZE); - if (ret) - return ret; + ret = kgsl_sharedmem_alloc_contig(device, &iommu->setstate, PAGE_SIZE); - /* Mark the setstate memory as read only */ - iommu->setstate.flags |= KGSL_MEMFLAGS_GPUREADONLY; + if (!ret) { + /* Mark the setstate memory as read only */ + iommu->setstate.flags |= KGSL_MEMFLAGS_GPUREADONLY; - kgsl_sharedmem_set(device, &iommu->setstate, 0, 0, PAGE_SIZE); + kgsl_sharedmem_set(device, &iommu->setstate, 0, 0, PAGE_SIZE); + } - return 0; + return ret; } static int kgsl_iommu_init(struct kgsl_mmu *mmu) @@ -1382,7 +1464,7 @@ static int kgsl_iommu_init(struct kgsl_mmu *mmu) } } - kgsl_iommu_add_global(mmu, &iommu->setstate); + kgsl_iommu_add_global(mmu, &iommu->setstate, "setstate"); kgsl_setup_qdss_desc(device); done: @@ -1580,7 +1662,7 @@ static int _iommu_map_guard_page(struct kgsl_pagetable *pt, if (!kgsl_secure_guard_page_memdesc.sgt) { if (kgsl_allocate_user(KGSL_MMU_DEVICE(pt->mmu), - &kgsl_secure_guard_page_memdesc, pt, + &kgsl_secure_guard_page_memdesc, sgp_size, KGSL_MEMFLAGS_SECURE)) { KGSL_CORE_ERR( "Secure guard page alloc failed\n"); @@ -2106,10 +2188,6 @@ static uint64_t kgsl_iommu_find_svm_region(struct kgsl_pagetable *pagetable, return addr; } -#define ADDR_IN_GLOBAL(_a) \ - (((_a) >= KGSL_IOMMU_GLOBAL_MEM_BASE) && \ - ((_a) < (KGSL_IOMMU_GLOBAL_MEM_BASE + KGSL_IOMMU_GLOBAL_MEM_SIZE))) - static int kgsl_iommu_set_svm_region(struct kgsl_pagetable *pagetable, uint64_t gpuaddr, uint64_t size) { @@ -2185,23 +2263,27 @@ static int kgsl_iommu_get_gpuaddr(struct kgsl_pagetable *pagetable, } ret = _insert_gpuaddr(pagetable, addr, size); - if (ret == 0) + if (ret == 0) { memdesc->gpuaddr = addr; + memdesc->pagetable = pagetable; + } out: spin_unlock(&pagetable->lock); return ret; } -static void kgsl_iommu_put_gpuaddr(struct kgsl_pagetable *pagetable, - struct kgsl_memdesc *memdesc) +static void kgsl_iommu_put_gpuaddr(struct kgsl_memdesc *memdesc) { - spin_lock(&pagetable->lock); + if (memdesc->pagetable == NULL) + return; - if (_remove_gpuaddr(pagetable, memdesc->gpuaddr)) + spin_lock(&memdesc->pagetable->lock); + + if (_remove_gpuaddr(memdesc->pagetable, memdesc->gpuaddr)) BUG(); - spin_unlock(&pagetable->lock); + spin_unlock(&memdesc->pagetable->lock); } static int kgsl_iommu_svm_range(struct kgsl_pagetable *pagetable, diff --git a/drivers/gpu/msm/kgsl_mmu.c b/drivers/gpu/msm/kgsl_mmu.c index 75ce0795436c8..99dff79bf03f0 100644 --- a/drivers/gpu/msm/kgsl_mmu.c +++ b/drivers/gpu/msm/kgsl_mmu.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-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 @@ -419,17 +419,29 @@ EXPORT_SYMBOL(kgsl_mmu_map); * @pagetable: Pagetable to release the memory from * @memdesc: Memory descriptor containing the GPU address to free */ -void kgsl_mmu_put_gpuaddr(struct kgsl_pagetable *pagetable, - struct kgsl_memdesc *memdesc) +void kgsl_mmu_put_gpuaddr(struct kgsl_memdesc *memdesc) { + struct kgsl_pagetable *pagetable = memdesc->pagetable; + int unmap_fail = 0; + if (memdesc->size == 0 || memdesc->gpuaddr == 0) return; - if (PT_OP_VALID(pagetable, put_gpuaddr)) - pagetable->pt_ops->put_gpuaddr(pagetable, memdesc); + if (!kgsl_memdesc_is_global(memdesc)) + unmap_fail = kgsl_mmu_unmap(pagetable, memdesc); + + /* + * Do not free the gpuaddr/size if unmap fails. Because if we + * try to map this range in future, the iommu driver will throw + * a BUG_ON() because it feels we are overwriting a mapping. + */ + if (PT_OP_VALID(pagetable, put_gpuaddr) && (unmap_fail == 0)) + pagetable->pt_ops->put_gpuaddr(memdesc); if (!kgsl_memdesc_is_global(memdesc)) memdesc->gpuaddr = 0; + + memdesc->pagetable = NULL; } EXPORT_SYMBOL(kgsl_mmu_put_gpuaddr); @@ -512,12 +524,12 @@ void kgsl_mmu_remove_global(struct kgsl_device *device, EXPORT_SYMBOL(kgsl_mmu_remove_global); void kgsl_mmu_add_global(struct kgsl_device *device, - struct kgsl_memdesc *memdesc) + struct kgsl_memdesc *memdesc, const char *name) { struct kgsl_mmu *mmu = &device->mmu; if (MMU_OP_VALID(mmu, mmu_add_global)) - mmu->mmu_ops->mmu_add_global(mmu, memdesc); + mmu->mmu_ops->mmu_add_global(mmu, memdesc, name); } EXPORT_SYMBOL(kgsl_mmu_add_global); @@ -580,7 +592,12 @@ static int nommu_get_gpuaddr(struct kgsl_pagetable *pagetable, memdesc->gpuaddr = (uint64_t) sg_phys(memdesc->sgt->sgl); - return memdesc->gpuaddr != 0 ? 0 : -ENOMEM; + if (memdesc->gpuaddr) { + memdesc->pagetable = pagetable; + return 0; + } + + return -ENOMEM; } static struct kgsl_mmu_pt_ops nommu_pt_ops = { @@ -589,7 +606,7 @@ static struct kgsl_mmu_pt_ops nommu_pt_ops = { }; static void nommu_add_global(struct kgsl_mmu *mmu, - struct kgsl_memdesc *memdesc) + struct kgsl_memdesc *memdesc, const char *name) { memdesc->gpuaddr = (uint64_t) sg_phys(memdesc->sgt->sgl); } diff --git a/drivers/gpu/msm/kgsl_mmu.h b/drivers/gpu/msm/kgsl_mmu.h index 99d096f497bfc..d191b1ca4b3fb 100644 --- a/drivers/gpu/msm/kgsl_mmu.h +++ b/drivers/gpu/msm/kgsl_mmu.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-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 @@ -75,7 +75,7 @@ struct kgsl_mmu_ops { (struct kgsl_mmu *mmu); int (*mmu_init_pt)(struct kgsl_mmu *mmu, struct kgsl_pagetable *); void (*mmu_add_global)(struct kgsl_mmu *mmu, - struct kgsl_memdesc *memdesc); + struct kgsl_memdesc *memdesc, const char *name); void (*mmu_remove_global)(struct kgsl_mmu *mmu, struct kgsl_memdesc *memdesc); struct kgsl_pagetable * (*mmu_getpagetable)(struct kgsl_mmu *mmu, @@ -92,7 +92,7 @@ struct kgsl_mmu_pt_ops { u64 (*get_ttbr0)(struct kgsl_pagetable *); u32 (*get_contextidr)(struct kgsl_pagetable *); int (*get_gpuaddr)(struct kgsl_pagetable *, struct kgsl_memdesc *); - void (*put_gpuaddr)(struct kgsl_pagetable *, struct kgsl_memdesc *); + void (*put_gpuaddr)(struct kgsl_memdesc *); uint64_t (*find_svm_region)(struct kgsl_pagetable *, uint64_t, uint64_t, uint64_t, uint64_t); int (*set_svm_region)(struct kgsl_pagetable *, uint64_t, uint64_t); @@ -171,6 +171,7 @@ struct kgsl_pagetable *kgsl_mmu_getpagetable_ptbase(struct kgsl_mmu *, void kgsl_add_global_secure_entry(struct kgsl_device *device, struct kgsl_memdesc *memdesc); +void kgsl_print_global_pt_entries(struct seq_file *s); void kgsl_mmu_putpagetable(struct kgsl_pagetable *pagetable); int kgsl_mmu_get_gpuaddr(struct kgsl_pagetable *pagetable, @@ -179,8 +180,7 @@ int kgsl_mmu_map(struct kgsl_pagetable *pagetable, struct kgsl_memdesc *memdesc); int kgsl_mmu_unmap(struct kgsl_pagetable *pagetable, struct kgsl_memdesc *memdesc); -void kgsl_mmu_put_gpuaddr(struct kgsl_pagetable *pagetable, - struct kgsl_memdesc *memdesc); +void kgsl_mmu_put_gpuaddr(struct kgsl_memdesc *memdesc); unsigned int kgsl_virtaddr_to_physaddr(void *virtaddr); unsigned int kgsl_mmu_log_fault_addr(struct kgsl_mmu *mmu, u64 ttbr0, uint64_t addr); @@ -195,7 +195,7 @@ int kgsl_mmu_find_region(struct kgsl_pagetable *pagetable, uint64_t *gpuaddr, uint64_t size, unsigned int align); void kgsl_mmu_add_global(struct kgsl_device *device, - struct kgsl_memdesc *memdesc); + struct kgsl_memdesc *memdesc, const char *name); void kgsl_mmu_remove_global(struct kgsl_device *device, struct kgsl_memdesc *memdesc); diff --git a/drivers/gpu/msm/kgsl_pool.c b/drivers/gpu/msm/kgsl_pool.c index f5402fdc7e572..214bd50a6bb4e 100644 --- a/drivers/gpu/msm/kgsl_pool.c +++ b/drivers/gpu/msm/kgsl_pool.c @@ -21,21 +21,18 @@ #include "kgsl_device.h" #include "kgsl_pool.h" -/** - * struct kgsl_page_pool - Structure to hold information for the pool - * @pool_order: Page order describing the size of the page - * @page_count: Number of pages currently present in the pool - * @reserved_pages: Number of pages reserved at init for the pool - * @allocation_allowed: Tells if reserved pool gets exhausted, can we allocate - * from system memory - * @list_lock: Spinlock for page list in the pool - * @page_list: List of pages held/reserved in this pool +/* + * Maximum pool size in terms of pages + * = (Number of pools * Max size per pool) */ +#define KGSL_POOL_MAX_PAGES (2 * 4096) + +/* Set the max pool size to 8192 pages */ +static unsigned int kgsl_pool_max_pages = KGSL_POOL_MAX_PAGES; + struct kgsl_page_pool { unsigned int pool_order; int page_count; - unsigned int reserved_pages; - bool allocation_allowed; spinlock_t list_lock; struct list_head page_list; }; @@ -43,34 +40,15 @@ struct kgsl_page_pool { static struct kgsl_page_pool kgsl_pools[] = { { .pool_order = 0, - .reserved_pages = 2048, - .allocation_allowed = true, .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[0].list_lock), .page_list = LIST_HEAD_INIT(kgsl_pools[0].page_list), }, #ifndef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS { - .pool_order = 1, - .reserved_pages = 1024, - .allocation_allowed = true, + .pool_order = 4, .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[1].list_lock), .page_list = LIST_HEAD_INIT(kgsl_pools[1].page_list), }, - { - .pool_order = 4, - .reserved_pages = 256, - .allocation_allowed = false, - .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[2].list_lock), - .page_list = LIST_HEAD_INIT(kgsl_pools[2].page_list), - }, - { - .pool_order = 8, - .reserved_pages = 32, - .allocation_allowed = false, - .list_lock = __SPIN_LOCK_UNLOCKED(kgsl_pools[3].list_lock), - .page_list = LIST_HEAD_INIT(kgsl_pools[3].page_list), - }, - #endif }; @@ -90,28 +68,10 @@ _kgsl_get_pool_from_order(unsigned int order) return NULL; } -/* Map the page into kernel and zero it out */ -static void -_kgsl_pool_zero_page(struct page *p, unsigned int pool_order) -{ - int i; - - for (i = 0; i < (1 << pool_order); i++) { - struct page *page = nth_page(p, i); - void *addr = kmap_atomic(page); - - memset(addr, 0, PAGE_SIZE); - dmac_flush_range(addr, addr + PAGE_SIZE); - kunmap_atomic(addr); - } -} - /* Add a page to specified pool */ static void _kgsl_pool_add_page(struct kgsl_page_pool *pool, struct page *p) { - _kgsl_pool_zero_page(p, pool->pool_order); - spin_lock(&pool->list_lock); list_add_tail(&p->lru, &pool->page_list); pool->page_count++; @@ -196,28 +156,20 @@ _kgsl_pool_shrink(struct kgsl_page_pool *pool, int num_pages) * (current_pool_size - target_pages) pages from pool * starting from higher order pool. */ -static unsigned long -kgsl_pool_reduce(unsigned int target_pages, bool exit) +static int +kgsl_pool_reduce(unsigned int target_pages) { int total_pages = 0; int i; int nr_removed; struct kgsl_page_pool *pool; - unsigned long pcount = 0; + unsigned int pcount = 0; total_pages = kgsl_pool_size_total(); for (i = (KGSL_NUM_POOLS - 1); i >= 0; i--) { pool = &kgsl_pools[i]; - /* - * Only reduce the pool sizes for pools which are allowed to - * allocate memory unless we are at close, in which case the - * reserved memory for all pools needs to be freed - */ - if (!pool->allocation_allowed && !exit) - continue; - total_pages -= pcount; nr_removed = total_pages - target_pages; @@ -296,16 +248,6 @@ void kgsl_pool_free_pages(struct page **pages, unsigned int pcount) kgsl_pool_free_page(p); } } -static int kgsl_pool_idx_lookup(unsigned int order) -{ - int i; - - for (i = 0; i < KGSL_NUM_POOLS; i++) - if (order == kgsl_pools[i].pool_order) - return i; - - return -ENOMEM; -} /** * kgsl_pool_alloc_page() - Allocate a page of requested size @@ -316,56 +258,37 @@ static int kgsl_pool_idx_lookup(unsigned int order) * * Return total page count on success and negative value on failure */ -int kgsl_pool_alloc_page(int *page_size, struct page **pages, - unsigned int pages_len, unsigned int *align) +int kgsl_pool_alloc_page(int page_size, struct page **pages, + unsigned int pages_len) { int j; int pcount = 0; struct kgsl_page_pool *pool; struct page *page = NULL; struct page *p = NULL; - int order = get_order(*page_size); - int pool_idx; - if ((pages == NULL) || pages_len < (*page_size >> PAGE_SHIFT)) + if ((pages == NULL) || pages_len < (page_size >> PAGE_SHIFT)) return -EINVAL; - pool = _kgsl_get_pool_from_order(order); + pool = _kgsl_get_pool_from_order(get_order(page_size)); + if (pool == NULL) return -EINVAL; - pool_idx = kgsl_pool_idx_lookup(order); page = _kgsl_pool_get_page(pool); /* Allocate a new page if not allocated from pool */ if (page == NULL) { - gfp_t gfp_mask = kgsl_gfp_mask(order); - - /* Only allocate non-reserved memory for certain pools */ - if (!pool->allocation_allowed && pool_idx > 0) { - *page_size = PAGE_SIZE << - kgsl_pools[pool_idx-1].pool_order; - *align = ilog2(*page_size); - return -EAGAIN; - } + gfp_t gfp_mask = kgsl_gfp_mask(get_order(page_size)); - page = alloc_pages(gfp_mask, order); - - if (!page) { - if (pool_idx > 0) { - /* Retry with lower order pages */ - *page_size = PAGE_SIZE << - kgsl_pools[pool_idx-1].pool_order; - *align = ilog2(*page_size); - return -EAGAIN; - } else - return -ENOMEM; - } + page = alloc_pages(gfp_mask, + get_order(page_size)); - _kgsl_pool_zero_page(page, order); + if (!page) + return -ENOMEM; } - for (j = 0; j < (*page_size >> PAGE_SHIFT); j++) { + for (j = 0; j < (page_size >> PAGE_SHIFT); j++) { p = nth_page(page, j); pages[pcount] = p; pcount++; @@ -384,34 +307,18 @@ void kgsl_pool_free_page(struct page *page) page_order = compound_order(page); - pool = _kgsl_get_pool_from_order(page_order); - if (pool != NULL) { - _kgsl_pool_add_page(pool, page); - return; + if (kgsl_pool_size_total() < kgsl_pool_max_pages) { + pool = _kgsl_get_pool_from_order(page_order); + if (pool != NULL) { + _kgsl_pool_add_page(pool, page); + return; + } } /* Give back to system as not added to pool */ __free_pages(page, page_order); } -static void kgsl_pool_reserve_pages(void) -{ - int i, j; - - for (i = 0; i < KGSL_NUM_POOLS; i++) { - struct page *page; - - for (j = 0; j < kgsl_pools[i].reserved_pages; j++) { - int order = kgsl_pools[i].pool_order; - gfp_t gfp_mask = kgsl_gfp_mask(order); - - page = alloc_pages(gfp_mask, order); - if (page != NULL) - _kgsl_pool_add_page(&kgsl_pools[i], page); - } - } -} - /* Functions for the shrinker */ static unsigned long @@ -426,7 +333,7 @@ kgsl_pool_shrink_scan_objects(struct shrinker *shrinker, int target_pages = (nr > total_pages) ? 0 : (total_pages - nr); /* Reduce pool size to target_pages */ - return kgsl_pool_reduce(target_pages, false); + return kgsl_pool_reduce(target_pages); } static unsigned long @@ -447,9 +354,6 @@ static struct shrinker kgsl_pool_shrinker = { void kgsl_init_page_pools(void) { - /* Reserve the appropriate number of pages for each pool */ - kgsl_pool_reserve_pages(); - /* Initialize shrinker */ register_shrinker(&kgsl_pool_shrinker); } @@ -457,7 +361,7 @@ void kgsl_init_page_pools(void) void kgsl_exit_page_pools(void) { /* Release all pages in pools, if any.*/ - kgsl_pool_reduce(0, true); + kgsl_pool_reduce(0); /* Unregister shrinker */ unregister_shrinker(&kgsl_pool_shrinker); diff --git a/drivers/gpu/msm/kgsl_pool.h b/drivers/gpu/msm/kgsl_pool.h index 198e4fde74168..34ddbefa88cba 100644 --- a/drivers/gpu/msm/kgsl_pool.h +++ b/drivers/gpu/msm/kgsl_pool.h @@ -37,8 +37,8 @@ void kgsl_pool_free_sgt(struct sg_table *sgt); void kgsl_pool_free_pages(struct page **pages, unsigned int page_count); void kgsl_init_page_pools(void); void kgsl_exit_page_pools(void); -int kgsl_pool_alloc_page(int *page_size, struct page **pages, - unsigned int pages_len, unsigned int *align); +int kgsl_pool_alloc_page(int page_size, struct page **pages, + unsigned int pages_len); void kgsl_pool_free_page(struct page *p); #endif /* __KGSL_POOL_H */ diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c index 2eb213db39d6c..5f11f74d3cb80 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.c +++ b/drivers/gpu/msm/kgsl_pwrctrl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -21,6 +21,7 @@ #include #include #include +#include #include "kgsl.h" #include "kgsl_pwrscale.h" @@ -33,6 +34,7 @@ #define KGSL_PWRFLAGS_AXI_ON 2 #define KGSL_PWRFLAGS_IRQ_ON 3 #define KGSL_PWRFLAGS_RETENTION_ON 4 +#define KGSL_PWRFLAGS_RESTRICT_MAX_LEVEL_JUMP 6 #define UPDATE_BUSY_VAL 1000000 @@ -343,6 +345,16 @@ void kgsl_pwrctrl_pwrlevel_change(struct kgsl_device *device, */ kgsl_pwrctrl_set_thermal_cycle(pwr, new_level); + /* Check any restriction over new level jump */ + if (test_bit(KGSL_PWRFLAGS_RESTRICT_MAX_LEVEL_JUMP, + &device->pwrctrl.ctrl_flags)) { + if (new_level == 0 && + old_level > device->pwrctrl.restrict_pwrlevel) + new_level = device->pwrctrl.restrict_pwrlevel; + else if (new_level == 0 && old_level == 0) + new_level = device->pwrctrl.restrict_pwrlevel; + } + if (new_level == old_level) return; @@ -574,22 +586,10 @@ static ssize_t kgsl_pwrctrl_max_pwrlevel_show(struct device *dev, return snprintf(buf, PAGE_SIZE, "%u\n", pwr->max_pwrlevel); } -static ssize_t kgsl_pwrctrl_min_pwrlevel_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) -{ struct kgsl_device *device = kgsl_device_from_dev(dev); - struct kgsl_pwrctrl *pwr; - int ret; - unsigned int level = 0; - - if (device == NULL) - return 0; - - pwr = &device->pwrctrl; - - ret = kgsl_sysfs_store(buf, &level); - if (ret) - return ret; +static void kgsl_pwrctrl_min_pwrlevel_set(struct kgsl_device *device, + int level) +{ + struct kgsl_pwrctrl *pwr = &device->pwrctrl; mutex_lock(&device->mutex); if (level > pwr->num_pwrlevels - 2) @@ -605,6 +605,24 @@ static ssize_t kgsl_pwrctrl_min_pwrlevel_store(struct device *dev, kgsl_pwrctrl_pwrlevel_change(device, pwr->active_pwrlevel); mutex_unlock(&device->mutex); +} + +static ssize_t kgsl_pwrctrl_min_pwrlevel_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + int ret; + unsigned int level = 0; + + if (device == NULL) + return 0; + + ret = kgsl_sysfs_store(buf, &level); + if (ret) + return ret; + + kgsl_pwrctrl_min_pwrlevel_set(device, level); return count; } @@ -648,24 +666,13 @@ static int _get_nearest_pwrlevel(struct kgsl_pwrctrl *pwr, unsigned int clock) return -ERANGE; } -static ssize_t kgsl_pwrctrl_max_gpuclk_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t count) +static void kgsl_pwrctrl_max_clock_set(struct kgsl_device *device, int val) { - struct kgsl_device *device = kgsl_device_from_dev(dev); struct kgsl_pwrctrl *pwr; - unsigned int val = 0; - int level, ret; - - if (device == NULL) - return 0; + int level; pwr = &device->pwrctrl; - ret = kgsl_sysfs_store(buf, &val); - if (ret) - return ret; - mutex_lock(&device->mutex); level = _get_nearest_pwrlevel(pwr, val); /* If the requested power level is not supported by hw, try cycling */ @@ -699,21 +706,37 @@ static ssize_t kgsl_pwrctrl_max_gpuclk_store(struct device *dev, if (pwr->sysfs_pwr_limit) kgsl_pwr_limits_set_freq(pwr->sysfs_pwr_limit, pwr->pwrlevels[level].gpu_freq); - return count; + return; err: mutex_unlock(&device->mutex); - return count; } -static ssize_t kgsl_pwrctrl_max_gpuclk_show(struct device *dev, - struct device_attribute *attr, - char *buf) +static ssize_t kgsl_pwrctrl_max_gpuclk_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) { - struct kgsl_device *device = kgsl_device_from_dev(dev); + unsigned int val = 0; + int ret; + + if (device == NULL) + return 0; + + ret = kgsl_sysfs_store(buf, &val); + if (ret) + return ret; + + kgsl_pwrctrl_max_clock_set(device, val); + + return count; +} + +static unsigned int kgsl_pwrctrl_max_clock_get(struct kgsl_device *device) +{ struct kgsl_pwrctrl *pwr; unsigned int freq; + if (device == NULL) return 0; pwr = &device->pwrctrl; @@ -727,7 +750,17 @@ static ssize_t kgsl_pwrctrl_max_gpuclk_show(struct device *dev, (TH_HZ - pwr->thermal_timeout) * (hfreq / TH_HZ); } - return snprintf(buf, PAGE_SIZE, "%d\n", freq); + return freq; +} + +static ssize_t kgsl_pwrctrl_max_gpuclk_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + + return snprintf(buf, PAGE_SIZE, "%d\n", + kgsl_pwrctrl_max_clock_get(device)); } static ssize_t kgsl_pwrctrl_gpuclk_store(struct device *dev, @@ -910,9 +943,14 @@ static ssize_t kgsl_pwrctrl_gpu_available_frequencies_show( if (device == NULL) return 0; pwr = &device->pwrctrl; - for (index = 0; index < pwr->num_pwrlevels - 1; index++) - num_chars += snprintf(buf + num_chars, PAGE_SIZE, "%d ", - pwr->pwrlevels[index].gpu_freq); + for (index = 0; index < pwr->num_pwrlevels - 1; index++) { + num_chars += scnprintf(buf + num_chars, + PAGE_SIZE - num_chars - 1, + "%d ", pwr->pwrlevels[index].gpu_freq); + /* One space for trailing null and another for the newline */ + if (num_chars >= PAGE_SIZE - 2) + break; + } buf[num_chars++] = '\n'; return num_chars; } @@ -1181,6 +1219,237 @@ static ssize_t kgsl_popp_show(struct device *dev, test_bit(POPP_ON, &device->pwrscale.popp_state)); } +static ssize_t kgsl_pwrctrl_pwrscale_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + int ret; + unsigned int enable = 0; + + if (device == NULL) + return 0; + + ret = kgsl_sysfs_store(buf, &enable); + if (ret) + return ret; + + mutex_lock(&device->mutex); + + if (enable) + kgsl_pwrscale_enable(device); + else + kgsl_pwrscale_disable(device, false); + + mutex_unlock(&device->mutex); + + return count; +} + +static ssize_t kgsl_pwrctrl_pwrscale_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + struct kgsl_pwrscale *psc; + + if (device == NULL) + return 0; + psc = &device->pwrscale; + + return snprintf(buf, PAGE_SIZE, "%u\n", psc->enabled); +} + +static ssize_t kgsl_pwrctrl_gpu_model_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + char model_str[32] = {0}; + + if (device == NULL) + return 0; + + device->ftbl->gpu_model(device, model_str, sizeof(model_str)); + + return snprintf(buf, PAGE_SIZE, "%s\n", model_str); +} + +static ssize_t kgsl_pwrctrl_gpu_busy_percentage_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + int ret; + struct kgsl_device *device = kgsl_device_from_dev(dev); + struct kgsl_clk_stats *stats; + unsigned int busy_percent = 0; + + if (device == NULL) + return 0; + stats = &device->pwrctrl.clk_stats; + + if (stats->total_old != 0) + busy_percent = (stats->busy_old * 100) / stats->total_old; + + ret = snprintf(buf, PAGE_SIZE, "%d %%\n", busy_percent); + + /* Reset the stats if GPU is OFF */ + if (!test_bit(KGSL_PWRFLAGS_AXI_ON, &device->pwrctrl.power_flags)) { + stats->busy_old = 0; + stats->total_old = 0; + } + return ret; +} + +static ssize_t kgsl_pwrctrl_min_clock_mhz_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + struct kgsl_pwrctrl *pwr; + + if (device == NULL) + return 0; + pwr = &device->pwrctrl; + + return snprintf(buf, PAGE_SIZE, "%d\n", + pwr->pwrlevels[pwr->min_pwrlevel].gpu_freq / 1000000); +} + +static ssize_t kgsl_pwrctrl_min_clock_mhz_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + int level, ret; + unsigned int freq; + struct kgsl_pwrctrl *pwr; + + if (device == NULL) + return 0; + + pwr = &device->pwrctrl; + + ret = kgsl_sysfs_store(buf, &freq); + if (ret) + return ret; + + freq *= 1000000; + level = _get_nearest_pwrlevel(pwr, freq); + + if (level >= 0) + kgsl_pwrctrl_min_pwrlevel_set(device, level); + + return count; +} + +static ssize_t kgsl_pwrctrl_max_clock_mhz_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + unsigned int freq; + + if (device == NULL) + return 0; + + freq = kgsl_pwrctrl_max_clock_get(device); + + return snprintf(buf, PAGE_SIZE, "%d\n", freq / 1000000); +} + +static ssize_t kgsl_pwrctrl_max_clock_mhz_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + unsigned int val = 0; + int ret; + + if (device == NULL) + return 0; + + ret = kgsl_sysfs_store(buf, &val); + if (ret) + return ret; + + val *= 1000000; + kgsl_pwrctrl_max_clock_set(device, val); + + return count; +} + +static ssize_t kgsl_pwrctrl_clock_mhz_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + + if (device == NULL) + return 0; + + return snprintf(buf, PAGE_SIZE, "%ld\n", + kgsl_pwrctrl_active_freq(&device->pwrctrl) / 1000000); +} + +static ssize_t kgsl_pwrctrl_freq_table_mhz_show( + struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + struct kgsl_pwrctrl *pwr; + int index, num_chars = 0; + + if (device == NULL) + return 0; + + pwr = &device->pwrctrl; + for (index = 0; index < pwr->num_pwrlevels - 1; index++) { + num_chars += scnprintf(buf + num_chars, + PAGE_SIZE - num_chars - 1, + "%d ", pwr->pwrlevels[index].gpu_freq / 1000000); + /* One space for trailing null and another for the newline */ + if (num_chars >= PAGE_SIZE - 2) + break; + } + + buf[num_chars++] = '\n'; + + return num_chars; +} + +static ssize_t kgsl_pwrctrl_temp_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct kgsl_device *device = kgsl_device_from_dev(dev); + struct kgsl_pwrctrl *pwr; + int ret, id = 0; + long temperature = 0; + + if (device == NULL) + goto done; + + pwr = &device->pwrctrl; + + if (!pwr->tsens_name) + goto done; + + id = sensor_get_id((char *)pwr->tsens_name); + if (id < 0) + goto done; + + ret = sensor_get_temp(id, &temperature); + if (ret) + goto done; + + return snprintf(buf, PAGE_SIZE, "%ld\n", + temperature); +done: + return 0; +} + static DEVICE_ATTR(gpuclk, 0644, kgsl_pwrctrl_gpuclk_show, kgsl_pwrctrl_gpuclk_store); static DEVICE_ATTR(max_gpuclk, 0644, kgsl_pwrctrl_max_gpuclk_show, @@ -1234,6 +1503,20 @@ static DEVICE_ATTR(popp, 0644, kgsl_popp_show, kgsl_popp_store); static DEVICE_ATTR(force_non_retention_on, 0644, kgsl_pwrctrl_force_non_retention_on_show, kgsl_pwrctrl_force_non_retention_on_store); +static DEVICE_ATTR(pwrscale, 0644, + kgsl_pwrctrl_pwrscale_show, + kgsl_pwrctrl_pwrscale_store); +static DEVICE_ATTR(gpu_model, 0444, kgsl_pwrctrl_gpu_model_show, NULL); +static DEVICE_ATTR(gpu_busy_percentage, 0444, + kgsl_pwrctrl_gpu_busy_percentage_show, NULL); +static DEVICE_ATTR(min_clock_mhz, 0644, kgsl_pwrctrl_min_clock_mhz_show, + kgsl_pwrctrl_min_clock_mhz_store); +static DEVICE_ATTR(max_clock_mhz, 0644, kgsl_pwrctrl_max_clock_mhz_show, + kgsl_pwrctrl_max_clock_mhz_store); +static DEVICE_ATTR(clock_mhz, 0444, kgsl_pwrctrl_clock_mhz_show, NULL); +static DEVICE_ATTR(freq_table_mhz, 0444, + kgsl_pwrctrl_freq_table_mhz_show, NULL); +static DEVICE_ATTR(temp, 0444, kgsl_pwrctrl_temp_show, NULL); static const struct device_attribute *pwrctrl_attr_list[] = { &dev_attr_gpuclk, @@ -1256,12 +1539,51 @@ static const struct device_attribute *pwrctrl_attr_list[] = { &dev_attr_bus_split, &dev_attr_default_pwrlevel, &dev_attr_popp, + &dev_attr_pwrscale, + &dev_attr_gpu_model, + &dev_attr_gpu_busy_percentage, + &dev_attr_min_clock_mhz, + &dev_attr_max_clock_mhz, + &dev_attr_clock_mhz, + &dev_attr_freq_table_mhz, + &dev_attr_temp, NULL }; +struct sysfs_link { + const char *src; + const char *dst; +}; + +static struct sysfs_link link_names[] = { + { "gpu_model", "gpu_model",}, + { "gpu_busy_percentage", "gpu_busy",}, + { "min_clock_mhz", "gpu_min_clock",}, + { "max_clock_mhz", "gpu_max_clock",}, + { "clock_mhz", "gpu_clock",}, + { "freq_table_mhz", "gpu_freq_table",}, + { "temp", "gpu_tmu",}, +}; + int kgsl_pwrctrl_init_sysfs(struct kgsl_device *device) { - return kgsl_create_device_sysfs_files(device->dev, pwrctrl_attr_list); + int i, ret; + + ret = kgsl_create_device_sysfs_files(device->dev, pwrctrl_attr_list); + if (ret) + return ret; + + device->gpu_sysfs_kobj = kobject_create_and_add("gpu", kernel_kobj); + if (IS_ERR_OR_NULL(device->gpu_sysfs_kobj)) + return (device->gpu_sysfs_kobj == NULL) ? + -ENOMEM : PTR_ERR(device->gpu_sysfs_kobj); + + for (i = 0; i < ARRAY_SIZE(link_names); i++) + kgsl_gpu_sysfs_add_link(device->gpu_sysfs_kobj, + &device->dev->kobj, link_names[i].src, + link_names[i].dst); + + return 0; } void kgsl_pwrctrl_uninit_sysfs(struct kgsl_device *device) @@ -1738,6 +2060,11 @@ int kgsl_pwrctrl_init(struct kgsl_device *device) pwr->power_flags = BIT(KGSL_PWRFLAGS_RETENTION_ON); + if (!of_property_read_u32(pdev->dev.of_node, "qcom,restrict-pwrlevel", + &pwr->restrict_pwrlevel)) + device->pwrctrl.ctrl_flags |= + BIT(KGSL_PWRFLAGS_RESTRICT_MAX_LEVEL_JUMP); + if (pwr->num_pwrlevels == 0) { KGSL_PWR_ERR(device, "No power levels are defined\n"); return -EINVAL; @@ -1881,6 +2208,10 @@ int kgsl_pwrctrl_init(struct kgsl_device *device) (unsigned long) device); devfreq_vbif_register_callback(kgsl_get_bw); + /* temperature sensor name */ + of_property_read_string(pdev->dev.of_node, "qcom,tsens-name", + &pwr->tsens_name); + return result; } @@ -2079,6 +2410,7 @@ static int _wake(struct kgsl_device *device) { struct kgsl_pwrctrl *pwr = &device->pwrctrl; int status = 0; + bool limit_max_pwrlevel = false; switch (device->state) { case KGSL_STATE_SUSPEND: @@ -2101,6 +2433,16 @@ static int _wake(struct kgsl_device *device) kgsl_pwrctrl_axi(device, KGSL_PWRFLAGS_ON); kgsl_pwrscale_wake(device); kgsl_pwrctrl_irq(device, KGSL_PWRFLAGS_ON); + /* + * Check any restriction on max power level, clk_set_rate() + * wil set based on the active_pwrlevel. + */ + if (test_bit(KGSL_PWRFLAGS_RESTRICT_MAX_LEVEL_JUMP, + &pwr->ctrl_flags) && + (pwr->active_pwrlevel == 0)) { + pwr->active_pwrlevel = pwr->restrict_pwrlevel; + limit_max_pwrlevel = true; + } /* fall through */ case KGSL_STATE_DEEP_NAP: pm_qos_update_request(&device->pwrctrl.pm_qos_req_dma, @@ -2126,7 +2468,10 @@ static int _wake(struct kgsl_device *device) kgsl_pwrctrl_pwrlevel_change_settings(device, 0); kgsl_pwrctrl_pwrlevel_change_settings(device, 1); /* All settings for power level transitions are complete*/ - pwr->previous_pwrlevel = pwr->active_pwrlevel; + if (limit_max_pwrlevel) + pwr->previous_pwrlevel = 0; + else + pwr->previous_pwrlevel = pwr->active_pwrlevel; mod_timer(&device->idle_timer, jiffies + device->pwrctrl.interval_timeout); del_timer_sync(&device->pwrctrl.deep_nap_timer); diff --git a/drivers/gpu/msm/kgsl_pwrctrl.h b/drivers/gpu/msm/kgsl_pwrctrl.h index a99fd4d3e1154..a1b75cb76170e 100644 --- a/drivers/gpu/msm/kgsl_pwrctrl.h +++ b/drivers/gpu/msm/kgsl_pwrctrl.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -116,6 +116,7 @@ struct kgsl_regulator { * @previous_pwrlevel - The power level before transition * @thermal_pwrlevel - maximum powerlevel constraint from thermal * @default_pwrlevel - device wake up power level + * @restrict_pwrlevel - maximum power level jump to restrict * @max_pwrlevel - maximum allowable powerlevel per the user * @min_pwrlevel - minimum allowable powerlevel per the user * @num_pwrlevels - number of available power levels @@ -154,6 +155,7 @@ struct kgsl_regulator { * @deep_nap_timer - Timer struct for entering deep nap * @deep_nap_timeout - Timeout for entering deep nap * @gx_retention - true if retention voltage is allowed + * @tsens_name - pointer to temperature sensor name of GPU temperature sensor */ struct kgsl_pwrctrl { @@ -168,6 +170,7 @@ struct kgsl_pwrctrl { unsigned int previous_pwrlevel; unsigned int thermal_pwrlevel; unsigned int default_pwrlevel; + unsigned int restrict_pwrlevel; unsigned int wakeup_maxpwrlevel; unsigned int max_pwrlevel; unsigned int min_pwrlevel; @@ -209,6 +212,7 @@ struct kgsl_pwrctrl { bool gx_retention; unsigned int gpu_bimc_int_clk_freq; bool gpu_bimc_interface_enabled; + const char *tsens_name; }; int kgsl_pwrctrl_init(struct kgsl_device *device); diff --git a/drivers/gpu/msm/kgsl_pwrscale.c b/drivers/gpu/msm/kgsl_pwrscale.c index ad01d43a9ef02..c68fe136b193e 100644 --- a/drivers/gpu/msm/kgsl_pwrscale.c +++ b/drivers/gpu/msm/kgsl_pwrscale.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -189,19 +189,21 @@ EXPORT_SYMBOL(kgsl_pwrscale_update); /* * kgsl_pwrscale_disable - temporarily disable the governor * @device: The device + * @turbo: Indicates if pwrlevel should be forced to turbo * * Temporarily disable the governor, to prevent interference * with profiling tools that expect a fixed clock frequency. * This function must be called with the device mutex locked. */ -void kgsl_pwrscale_disable(struct kgsl_device *device) +void kgsl_pwrscale_disable(struct kgsl_device *device, bool turbo) { BUG_ON(!mutex_is_locked(&device->mutex)); if (device->pwrscale.devfreqptr) queue_work(device->pwrscale.devfreq_wq, &device->pwrscale.devfreq_suspend_ws); device->pwrscale.enabled = false; - kgsl_pwrctrl_pwrlevel_change(device, KGSL_PWRLEVEL_TURBO); + if (turbo) + kgsl_pwrctrl_pwrlevel_change(device, KGSL_PWRLEVEL_TURBO); } EXPORT_SYMBOL(kgsl_pwrscale_disable); @@ -447,7 +449,8 @@ int kgsl_devfreq_target(struct device *dev, unsigned long *freq, u32 flags) struct kgsl_device *device = dev_get_drvdata(dev); struct kgsl_pwrctrl *pwr; struct kgsl_pwrlevel *pwr_level; - int level, i; + int level; + unsigned int i; unsigned long cur_freq; if (device == NULL) @@ -475,7 +478,12 @@ int kgsl_devfreq_target(struct device *dev, unsigned long *freq, u32 flags) /* If the governor recommends a new frequency, update it here */ if (*freq != cur_freq) { level = pwr->max_pwrlevel; - for (i = pwr->min_pwrlevel; i >= pwr->max_pwrlevel; i--) + /* + * Array index of pwrlevels[] should be within the permitted + * power levels, i.e., from max_pwrlevel to min_pwrlevel. + */ + for (i = pwr->min_pwrlevel; (i >= pwr->max_pwrlevel + && i <= pwr->min_pwrlevel); i--) if (*freq <= pwr->pwrlevels[i].gpu_freq) { if (pwr->thermal_cycle == CYCLE_ACTIVE) level = _thermal_adjust(pwr, i); @@ -874,6 +882,14 @@ int kgsl_pwrscale_init(struct device *dev, const char *governor) pwrscale->history[i].type = i; } + /* Add links to the devfreq sysfs nodes */ + kgsl_gpu_sysfs_add_link(device->gpu_sysfs_kobj, + &pwrscale->devfreqptr->dev.kobj, "governor", + "gpu_governor"); + kgsl_gpu_sysfs_add_link(device->gpu_sysfs_kobj, + &pwrscale->devfreqptr->dev.kobj, + "available_governors", "gpu_available_governor"); + return 0; } EXPORT_SYMBOL(kgsl_pwrscale_init); diff --git a/drivers/gpu/msm/kgsl_pwrscale.h b/drivers/gpu/msm/kgsl_pwrscale.h index c85317869f1db..0756a4490f22a 100644 --- a/drivers/gpu/msm/kgsl_pwrscale.h +++ b/drivers/gpu/msm/kgsl_pwrscale.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2016, 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 @@ -123,7 +123,7 @@ void kgsl_pwrscale_sleep(struct kgsl_device *device); void kgsl_pwrscale_wake(struct kgsl_device *device); void kgsl_pwrscale_enable(struct kgsl_device *device); -void kgsl_pwrscale_disable(struct kgsl_device *device); +void kgsl_pwrscale_disable(struct kgsl_device *device, bool turbo); int kgsl_devfreq_target(struct device *dev, unsigned long *freq, u32 flags); int kgsl_devfreq_get_dev_status(struct device *, struct devfreq_dev_status *); diff --git a/drivers/gpu/msm/kgsl_sharedmem.c b/drivers/gpu/msm/kgsl_sharedmem.c index 73edc3f7e1465..bc201a2e14fb7 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.c +++ b/drivers/gpu/msm/kgsl_sharedmem.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-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 @@ -318,12 +318,11 @@ static int kgsl_cma_alloc_secure(struct kgsl_device *device, static int kgsl_allocate_secure(struct kgsl_device *device, struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size) { int ret; if (MMU_FEATURE(&device->mmu, KGSL_MMU_HYP_SECURE_ALLOC)) - ret = kgsl_sharedmem_page_alloc_user(memdesc, pagetable, size); + ret = kgsl_sharedmem_page_alloc_user(memdesc, size); else ret = kgsl_cma_alloc_secure(device, memdesc, size); @@ -332,7 +331,6 @@ static int kgsl_allocate_secure(struct kgsl_device *device, int kgsl_allocate_user(struct kgsl_device *device, struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size, uint64_t flags) { int ret; @@ -340,12 +338,11 @@ int kgsl_allocate_user(struct kgsl_device *device, memdesc->flags = flags; if (kgsl_mmu_get_mmutype(device) == KGSL_MMU_TYPE_NONE) - ret = kgsl_sharedmem_alloc_contig(device, memdesc, - pagetable, size); + ret = kgsl_sharedmem_alloc_contig(device, memdesc, size); else if (flags & KGSL_MEMFLAGS_SECURE) - ret = kgsl_allocate_secure(device, memdesc, pagetable, size); + ret = kgsl_allocate_secure(device, memdesc, size); else - ret = kgsl_sharedmem_page_alloc_user(memdesc, pagetable, size); + ret = kgsl_sharedmem_page_alloc_user(memdesc, size); return ret; } @@ -563,71 +560,139 @@ static inline unsigned int _fixup_cache_range_op(unsigned int op) } #endif -int kgsl_cache_range_op(struct kgsl_memdesc *memdesc, uint64_t offset, - uint64_t size, unsigned int op) +static int kgsl_do_cache_op(struct page *page, void *addr, + uint64_t offset, uint64_t size, unsigned int op) { + void (*cache_op)(const void *, const void *); + /* - * If the buffer is mapped in the kernel operate on that address - * otherwise use the user address + * The dmac_xxx_range functions handle addresses and sizes that + * are not aligned to the cacheline size correctly. */ + switch (_fixup_cache_range_op(op)) { + case KGSL_CACHE_OP_FLUSH: + cache_op = dmac_flush_range; + break; + case KGSL_CACHE_OP_CLEAN: + cache_op = dmac_clean_range; + break; + case KGSL_CACHE_OP_INV: + cache_op = dmac_inv_range; + break; + default: + return -EINVAL; + } - void *addr = (memdesc->hostptr) ? - memdesc->hostptr : (void *) memdesc->useraddr; + if (page != NULL) { + unsigned long pfn = page_to_pfn(page) + offset / PAGE_SIZE; + /* + * page_address() returns the kernel virtual address of page. + * For high memory kernel virtual address exists only if page + * has been mapped. So use a version of kmap rather than + * page_address() for high memory. + */ + if (PageHighMem(page)) { + offset &= ~PAGE_MASK; - /* Make sure that size is non-zero */ - if (!size) - return -EINVAL; + do { + unsigned int len = size; - /* Make sure that the offset + size isn't bigger than we can handle */ - if ((offset + size) > ULONG_MAX) - return -ERANGE; + if (len + offset > PAGE_SIZE) + len = PAGE_SIZE - offset; + + page = pfn_to_page(pfn++); + addr = kmap_atomic(page); + cache_op(addr + offset, addr + offset + len); + kunmap_atomic(addr); - /* Make sure the offset + size do not overflow the address */ - if (addr + ((size_t) offset + (size_t) size) < addr) + size -= len; + offset = 0; + } while (size); + + return 0; + } + + addr = page_address(page); + } + + cache_op(addr + offset, addr + offset + (size_t) size); + return 0; +} + +int kgsl_cache_range_op(struct kgsl_memdesc *memdesc, uint64_t offset, + uint64_t size, unsigned int op) +{ + void *addr = NULL; + int ret = 0; + + if (size == 0 || size > UINT_MAX) + return -EINVAL; + + /* Make sure that the offset + size does not overflow */ + if ((offset + size < offset) || (offset + size < size)) return -ERANGE; /* Check that offset+length does not exceed memdesc->size */ if (offset + size > memdesc->size) return -ERANGE; - /* Return quietly if the buffer isn't mapped on the CPU */ - if (addr == NULL) - return 0; + if (memdesc->hostptr) { + addr = memdesc->hostptr; + /* Make sure the offset + size do not overflow the address */ + if (addr + ((size_t) offset + (size_t) size) < addr) + return -ERANGE; - addr = addr + offset; + ret = kgsl_do_cache_op(NULL, addr, offset, size, op); + return ret; + } /* - * The dmac_xxx_range functions handle addresses and sizes that - * are not aligned to the cacheline size correctly. + * If the buffer is not to mapped to kernel, perform cache + * operations after mapping to kernel. */ + if (memdesc->sgt != NULL) { + struct scatterlist *sg; + unsigned int i, pos = 0; - switch (_fixup_cache_range_op(op)) { - case KGSL_CACHE_OP_FLUSH: - dmac_flush_range(addr, addr + (size_t) size); - break; - case KGSL_CACHE_OP_CLEAN: - dmac_clean_range(addr, addr + (size_t) size); - break; - case KGSL_CACHE_OP_INV: - dmac_inv_range(addr, addr + (size_t) size); - break; - } + for_each_sg(memdesc->sgt->sgl, sg, memdesc->sgt->nents, i) { + uint64_t sg_offset, sg_left; - return 0; + if (offset >= (pos + sg->length)) { + pos += sg->length; + continue; + } + sg_offset = offset > pos ? offset - pos : 0; + sg_left = (sg->length - sg_offset > size) ? size : + sg->length - sg_offset; + ret = kgsl_do_cache_op(sg_page(sg), NULL, sg_offset, + sg_left, op); + size -= sg_left; + if (size == 0) + break; + pos += sg->length; + } + } else if (memdesc->pages != NULL) { + addr = vmap(memdesc->pages, memdesc->page_count, + VM_IOREMAP, pgprot_writecombine(PAGE_KERNEL)); + if (addr == NULL) + return -ENOMEM; + + /* Make sure the offset + size do not overflow the address */ + if (addr + ((size_t) offset + (size_t) size) < addr) + return -ERANGE; + + ret = kgsl_do_cache_op(NULL, addr, offset, size, op); + vunmap(addr); + } + return ret; } EXPORT_SYMBOL(kgsl_cache_range_op); #ifndef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS static inline int get_page_size(size_t size, unsigned int align) { - if (align >= ilog2(SZ_1M) && size >= SZ_1M) - return SZ_1M; - else if (align >= ilog2(SZ_64K) && size >= SZ_64K) - return SZ_64K; - else if (align >= ilog2(SZ_8K) && size >= SZ_8K) - return SZ_8K; - else - return PAGE_SIZE; + return (align >= ilog2(SZ_64K) && size >= SZ_64K) + ? SZ_64K : PAGE_SIZE; } #else static inline int get_page_size(size_t size, unsigned int align) @@ -636,9 +701,58 @@ static inline int get_page_size(size_t size, unsigned int align) } #endif +static void kgsl_zero_pages(struct page **pages, unsigned int pcount) +{ + unsigned int j; + unsigned int step = ((VMALLOC_END - VMALLOC_START)/8) >> PAGE_SHIFT; + pgprot_t page_prot = pgprot_writecombine(PAGE_KERNEL); + void *ptr; + + /* + * All memory that goes to the user has to be zeroed out before it gets + * exposed to userspace. This means that the memory has to be mapped in + * the kernel, zeroed (memset) and then unmapped. This also means that + * the dcache has to be flushed to ensure coherency between the kernel + * and user pages. We used to pass __GFP_ZERO to alloc_page which mapped + * zeroed and unmaped each individual page, and then we had to turn + * around and call flush_dcache_page() on that page to clear the caches. + * This was killing us for performance. Instead, we found it is much + * faster to allocate the pages without GFP_ZERO, map a chunk of the + * range ('step' pages), memset it, flush it and then unmap + * - this results in a factor of 4 improvement for speed for large + * buffers. There is a small decrease in speed for small buffers, + * but only on the order of a few microseconds at best. The 'step' + * size is based on a guess at the amount of free vmalloc space, but + * will scale down if there's not enough free space. + */ + for (j = 0; j < pcount; j += step) { + step = min(step, pcount - j); + + ptr = vmap(&pages[j], step, VM_IOREMAP, page_prot); + + if (ptr != NULL) { + memset(ptr, 0, step * PAGE_SIZE); + dmac_flush_range(ptr, ptr + step * PAGE_SIZE); + vunmap(ptr); + } else { + int k; + /* Very, very, very slow path */ + + for (k = j; k < j + step; k++) { + ptr = kmap_atomic(pages[k]); + memset(ptr, 0, PAGE_SIZE); + dmac_flush_range(ptr, ptr + PAGE_SIZE); + kunmap_atomic(ptr); + } + /* scale down the step size to avoid this path */ + if (step > 1) + step >>= 1; + } + } +} + int kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size) { int ret = 0; @@ -660,10 +774,8 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, * larger however to accomodate hardware quirks */ - if (align < ilog2(page_size)) { + if (align < ilog2(page_size)) kgsl_memdesc_set_align(memdesc, ilog2(page_size)); - align = ilog2(page_size); - } /* * There needs to be enough room in the page array to be able to @@ -672,7 +784,6 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, len_alloc = PAGE_ALIGN(size) >> PAGE_SHIFT; - memdesc->pagetable = pagetable; memdesc->ops = &kgsl_page_alloc_ops; /* @@ -695,13 +806,18 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, while (len > 0) { int page_count; - page_count = kgsl_pool_alloc_page(&page_size, + /* don't waste space at the end of the allocation*/ + if (len < page_size) + page_size = PAGE_SIZE; + + page_count = kgsl_pool_alloc_page(page_size, memdesc->pages + pcount, - len_alloc - pcount, - &align); + len_alloc - pcount); if (page_count <= 0) { - if (page_count == -EAGAIN) + if (page_size != PAGE_SIZE) { + page_size = PAGE_SIZE; continue; + } /* * Update sglen and memdesc size,as requested allocation @@ -723,9 +839,6 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, len -= page_size; memdesc->size += page_size; memdesc->page_count += page_count; - - /* Get the needed page size for the next iteration */ - page_size = get_page_size(len, align); } /* Call to the hypervisor to lock any secure buffer allocations */ @@ -783,6 +896,11 @@ kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, KGSL_STATS_ADD(memdesc->size, &kgsl_driver.stats.page_alloc, &kgsl_driver.stats.page_alloc_max); + /* + * Zero out the pages. + */ + kgsl_zero_pages(memdesc->pages, pcount); + done: if (ret) { if (memdesc->pages) { @@ -806,10 +924,8 @@ void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc) if (memdesc == NULL || memdesc->size == 0) return; - if (memdesc->gpuaddr) { - kgsl_mmu_unmap(memdesc->pagetable, memdesc); - kgsl_mmu_put_gpuaddr(memdesc->pagetable, memdesc); - } + /* Make sure the memory object has been unmapped */ + kgsl_mmu_put_gpuaddr(memdesc); if (memdesc->ops && memdesc->ops->free) memdesc->ops->free(memdesc); @@ -989,8 +1105,7 @@ void kgsl_get_memory_usage(char *name, size_t name_size, uint64_t memflags) EXPORT_SYMBOL(kgsl_get_memory_usage); int kgsl_sharedmem_alloc_contig(struct kgsl_device *device, - struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size) + struct kgsl_memdesc *memdesc, uint64_t size) { int result = 0; @@ -999,7 +1114,6 @@ int kgsl_sharedmem_alloc_contig(struct kgsl_device *device, return -EINVAL; memdesc->size = size; - memdesc->pagetable = pagetable; memdesc->ops = &kgsl_cma_ops; memdesc->dev = device->dev->parent; @@ -1090,7 +1204,6 @@ static int kgsl_cma_alloc_secure(struct kgsl_device *device, { struct kgsl_iommu *iommu = KGSL_IOMMU_PRIV(device); int result = 0; - struct kgsl_pagetable *pagetable = device->mmu.securepagetable; size_t aligned; /* Align size to 1M boundaries */ @@ -1110,7 +1223,6 @@ static int kgsl_cma_alloc_secure(struct kgsl_device *device, memdesc->priv &= ~KGSL_MEMDESC_GUARD_PAGE; memdesc->size = aligned; - memdesc->pagetable = pagetable; memdesc->ops = &kgsl_cma_ops; memdesc->dev = iommu->ctx[KGSL_IOMMU_CONTEXT_SECURE].dev; diff --git a/drivers/gpu/msm/kgsl_sharedmem.h b/drivers/gpu/msm/kgsl_sharedmem.h index c05aaecb52841..19477f57812ca 100644 --- a/drivers/gpu/msm/kgsl_sharedmem.h +++ b/drivers/gpu/msm/kgsl_sharedmem.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2002,2007-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2002,2007-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 @@ -26,7 +26,7 @@ struct kgsl_process_private; int kgsl_sharedmem_alloc_contig(struct kgsl_device *device, struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size); + uint64_t size); void kgsl_sharedmem_free(struct kgsl_memdesc *memdesc); @@ -66,13 +66,11 @@ void kgsl_sharedmem_uninit_sysfs(void); int kgsl_allocate_user(struct kgsl_device *device, struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size, uint64_t flags); void kgsl_get_memory_usage(char *str, size_t len, uint64_t memflags); int kgsl_sharedmem_page_alloc_user(struct kgsl_memdesc *memdesc, - struct kgsl_pagetable *pagetable, uint64_t size); #define MEMFLAGS(_flags, _mask, _shift) \ @@ -263,7 +261,7 @@ kgsl_memdesc_footprint(const struct kgsl_memdesc *memdesc) */ static inline int kgsl_allocate_global(struct kgsl_device *device, struct kgsl_memdesc *memdesc, uint64_t size, uint64_t flags, - unsigned int priv) + unsigned int priv, const char *name) { int ret; @@ -271,17 +269,16 @@ static inline int kgsl_allocate_global(struct kgsl_device *device, memdesc->priv = priv; if ((memdesc->priv & KGSL_MEMDESC_CONTIG) != 0) - ret = kgsl_sharedmem_alloc_contig(device, memdesc, NULL, + ret = kgsl_sharedmem_alloc_contig(device, memdesc, (size_t) size); else { - ret = kgsl_sharedmem_page_alloc_user(memdesc, NULL, - (size_t) size); + ret = kgsl_sharedmem_page_alloc_user(memdesc, (size_t) size); if (ret == 0) kgsl_memdesc_map(memdesc); } if (ret == 0) - kgsl_mmu_add_global(device, memdesc); + kgsl_mmu_add_global(device, memdesc, name); return ret; } diff --git a/drivers/gpu/msm/kgsl_snapshot.c b/drivers/gpu/msm/kgsl_snapshot.c index 17106079f053a..ea4dab4aea508 100644 --- a/drivers/gpu/msm/kgsl_snapshot.c +++ b/drivers/gpu/msm/kgsl_snapshot.c @@ -1060,6 +1060,9 @@ void kgsl_snapshot_save_frozen_objs(struct work_struct *work) size_t size = 0; void *ptr; + if (IS_ERR_OR_NULL(device)) + return; + kgsl_snapshot_process_ib_obj_list(snapshot); list_for_each_entry(obj, &snapshot->obj_list, node) { @@ -1074,9 +1077,6 @@ void kgsl_snapshot_save_frozen_objs(struct work_struct *work) goto done; snapshot->mempool = vmalloc(size); - if (snapshot->mempool != NULL) - KGSL_DRV_ERR(device, "snapshot: mempool address %p, size %zx\n", - snapshot->mempool, size); ptr = snapshot->mempool; snapshot->mempool_size = 0; diff --git a/drivers/gud/Kconfig b/drivers/gud/Kconfig deleted file mode 100644 index 0e030bf60878d..0000000000000 --- a/drivers/gud/Kconfig +++ /dev/null @@ -1,35 +0,0 @@ -# -# MobiCore configuration -# -config MOBICORE_DRIVER - tristate "MobiCore Driver" - ---help--- - Enable Linux Kernel MobiCore Support - -config MOBICORE_DEBUG - bool "MobiCore Module debug mode" - depends on MOBICORE_DRIVER - ---help--- - Enable Debug mode in the MobiCore Driver. - It enables printing information about mobicore operations - -config MOBICORE_VERBOSE - bool "MobiCore Module verbose debug mode" - depends on MOBICORE_DEBUG - ---help--- - Enable Verbose Debug mode in the MobiCore Driver. - It enables printing extra information about mobicore operations - Beware: this is only useful for debuging deep in the driver because - it prints too much logs - -config TRUSTONIC_TRUSTED_UI - tristate " -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "mci/mcloadformat.h" - -#include "main.h" -#include "debug.h" -#include "mmu.h" /* For load_check and load_token */ -#include "mcp.h" -#include "client.h" -#include "api.h" -#include "admin.h" - -/* We need 2 devices for admin and user interface*/ -#define MC_DEV_MAX 2 - -static struct admin_ctx { - struct device *dev; - atomic_t daemon_counter; - /* Define a MobiCore device structure for use with dev_debug() etc */ - struct device_driver mc_dev_name; - dev_t mc_dev_admin; - struct cdev mc_admin_cdev; - int (*tee_start_cb)(void); -} g_admin_ctx; - -static struct mc_admin_driver_request { - /* Global */ - struct mutex mutex; /* Protects access to this struct */ - struct mutex states_mutex; /* Protect access to the states */ - enum client_state { - IDLE, - REQUEST_SENT, - BUFFERS_READY, - } client_state; - enum server_state { - NOT_CONNECTED, /* Device not open */ - READY, /* Waiting for requests */ - REQUEST_RECEIVED, /* Got a request, is working */ - RESPONSE_SENT, /* Has sent a response header */ - DATA_SENT, /* Blocked until data is consumed */ - } server_state; - /* Request */ - uint32_t request_id; - struct mc_admin_request request; - struct completion client_complete; - /* Response */ - struct mc_admin_response response; - struct completion server_complete; - void *buffer; /* Reception buffer (pre-allocated) */ - size_t size; /* Size of the reception buffer */ -} g_request; - -static struct tbase_object *tbase_object_alloc(bool is_sp_trustlet, - size_t length) -{ - struct tbase_object *obj; - size_t size = sizeof(*obj) + length; - size_t header_length = 0; - - /* Determine required size */ - if (is_sp_trustlet) { - /* Need space for lengths info and containers */ - header_length = sizeof(struct mc_blob_len_info); - size += header_length + 3 * MAX_SO_CONT_SIZE; - } - - /* Allocate memory */ - obj = vzalloc(size); - if (!obj) - return NULL; - - /* A non-zero header_length indicates that we have a SP trustlet */ - obj->header_length = header_length; - obj->length = length; - return obj; -} - -void tbase_object_free(struct tbase_object *robj) -{ - vfree(robj); -} - -static inline void client_state_change(enum client_state state) -{ - mutex_lock(&g_request.states_mutex); - g_request.client_state = state; - mutex_unlock(&g_request.states_mutex); -} - -static inline bool client_state_is(enum client_state state) -{ - bool is; - - mutex_lock(&g_request.states_mutex); - is = g_request.client_state == state; - mutex_unlock(&g_request.states_mutex); - return is; -} - -static inline void server_state_change(enum server_state state) -{ - mutex_lock(&g_request.states_mutex); - g_request.server_state = state; - mutex_unlock(&g_request.states_mutex); -} - -static inline bool server_state_is(enum server_state state) -{ - bool is; - - mutex_lock(&g_request.states_mutex); - is = g_request.server_state == state; - mutex_unlock(&g_request.states_mutex); - return is; -} - -static void request_cancel(void); - -static int request_send(uint32_t command, const struct mc_uuid_t *uuid, - uint32_t is_gp, uint32_t spid) -{ - struct device *dev = g_admin_ctx.dev; - int counter = 10; - int ret; - - /* Prepare request */ - mutex_lock(&g_request.states_mutex); - /* Wait a little for daemon to connect */ - while ((g_request.server_state == NOT_CONNECTED) && counter--) { - mutex_unlock(&g_request.states_mutex); - ssleep(1); - mutex_lock(&g_request.states_mutex); - } - - BUG_ON(g_request.client_state != IDLE); - if (g_request.server_state != READY) { - mutex_unlock(&g_request.states_mutex); - if (g_request.server_state != NOT_CONNECTED) { - /* TODO: can we recover? */ - dev_err(dev, "%s: invalid daemon state %d\n", __func__, - g_request.server_state); - ret = -EPROTO; - goto end; - } else { - dev_err(dev, "%s: daemon not connected\n", __func__); - ret = -ENOTCONN; - goto end; - } - } - - memset(&g_request.request, 0, sizeof(g_request.request)); - memset(&g_request.response, 0, sizeof(g_request.response)); - g_request.request.request_id = g_request.request_id++; - g_request.request.command = command; - if (uuid) - memcpy(&g_request.request.uuid, uuid, sizeof(*uuid)); - else - memset(&g_request.request.uuid, 0, sizeof(*uuid)); - - g_request.request.is_gp = is_gp; - g_request.request.spid = spid; - g_request.client_state = REQUEST_SENT; - mutex_unlock(&g_request.states_mutex); - - /* Send request */ - complete(&g_request.client_complete); - - /* Wait for header (could be interruptible, but then needs more work) */ - wait_for_completion(&g_request.server_complete); - - /* Server should be waiting with some data for us */ - mutex_lock(&g_request.states_mutex); - switch (g_request.server_state) { - case NOT_CONNECTED: - /* Daemon gone */ - ret = -EPIPE; - break; - case READY: - /* No data to come, likely an error */ - ret = -g_request.response.error_no; - break; - case RESPONSE_SENT: - case DATA_SENT: - /* Normal case, data to come */ - ret = 0; - break; - default: - /* Should not happen as complete means the state changed */ - dev_err(dev, "%s: daemon is in a bad state: %d\n", __func__, - g_request.server_state); - ret = -EPIPE; - break; - } - - mutex_unlock(&g_request.states_mutex); - -end: - if (ret) - request_cancel(); - - return ret; -} - -static int request_receive(void *address, uint32_t size) -{ - /* - * At this point we have received the header and prepared some buffers - * to receive data that we know are coming from the server. - */ - - /* Check server state */ - bool server_ok; - - mutex_lock(&g_request.states_mutex); - server_ok = (g_request.server_state == RESPONSE_SENT) || - (g_request.server_state == DATA_SENT); - mutex_unlock(&g_request.states_mutex); - if (!server_ok) { - /* TODO: can we recover? */ - request_cancel(); - return -EPIPE; - } - - /* Setup reception buffer */ - g_request.buffer = address; - g_request.size = size; - client_state_change(BUFFERS_READY); - - /* Unlock write of data */ - complete(&g_request.client_complete); - - /* Wait for data (far too late to be interruptible) */ - wait_for_completion(&g_request.server_complete); - - /* Reset reception buffer */ - g_request.buffer = NULL; - g_request.size = 0; - - /* Return to idle state */ - client_state_change(IDLE); - return 0; -} - -/* Must be called instead of request_receive() to cancel a pending request */ -static void request_cancel(void) -{ - /* Unlock write of data */ - mutex_lock(&g_request.states_mutex); - if (g_request.server_state == DATA_SENT) - complete(&g_request.client_complete); - - /* Return to idle state */ - g_request.client_state = IDLE; - mutex_unlock(&g_request.states_mutex); -} - -static int admin_get_root_container(void *address) -{ - struct device *dev = g_admin_ctx.dev; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_ROOT_CONTAINER, 0, 0, 0); - if (ret) - goto end; - - /* Check length against max */ - if (g_request.response.length >= MAX_SO_CONT_SIZE) { - request_cancel(); - dev_err(dev, "%s: response length exceeds maximum\n", __func__); - ret = EREMOTEIO; - goto end; - } - - /* Get data */ - ret = request_receive(address, g_request.response.length); - if (!ret) - ret = g_request.response.length; - -end: - mutex_unlock(&g_request.mutex); - return ret; -} - -static int admin_get_sp_container(void *address, uint32_t spid) -{ - struct device *dev = g_admin_ctx.dev; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_SP_CONTAINER, 0, 0, spid); - if (ret) - goto end; - - /* Check length against max */ - if (g_request.response.length >= MAX_SO_CONT_SIZE) { - request_cancel(); - dev_err(dev, "%s: response length exceeds maximum\n", __func__); - ret = EREMOTEIO; - goto end; - } - - /* Get data */ - ret = request_receive(address, g_request.response.length); - if (!ret) - ret = g_request.response.length; - -end: - mutex_unlock(&g_request.mutex); - return ret; -} - -static int admin_get_trustlet_container(void *address, - const struct mc_uuid_t *uuid, - uint32_t spid) -{ - struct device *dev = g_admin_ctx.dev; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_TRUSTLET_CONTAINER, uuid, 0, spid); - if (ret) - goto end; - - /* Check length against max */ - if (g_request.response.length >= MAX_SO_CONT_SIZE) { - request_cancel(); - dev_err(dev, "%s: response length exceeds maximum\n", __func__); - ret = EREMOTEIO; - goto end; - } - - /* Get data */ - ret = request_receive(address, g_request.response.length); - if (!ret) - ret = g_request.response.length; - -end: - mutex_unlock(&g_request.mutex); - return ret; -} - -static struct tbase_object *admin_get_trustlet(const struct mc_uuid_t *uuid, - uint32_t is_gp, uint32_t *spid) -{ - struct tbase_object *obj = NULL; - bool is_sp_tl; - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_GET_TRUSTLET, uuid, is_gp, 0); - if (ret) - goto end; - - /* Allocate memory */ - is_sp_tl = g_request.response.service_type == SERVICE_TYPE_SP_TRUSTLET; - obj = tbase_object_alloc(is_sp_tl, g_request.response.length); - if (!obj) { - request_cancel(); - ret = -ENOMEM; - goto end; - } - - /* Get data */ - ret = request_receive(&obj->data[obj->header_length], obj->length); - *spid = g_request.response.spid; - -end: - mutex_unlock(&g_request.mutex); - if (ret) - return ERR_PTR(ret); - - return obj; -} - -static void mc_admin_sendcrashdump(void) -{ - int ret = 0; - - /* Lock communication channel */ - mutex_lock(&g_request.mutex); - - /* Send request and wait for header */ - ret = request_send(MC_DRV_SIGNAL_CRASH, NULL, false, 0); - if (ret) - goto end; - - /* Done */ - request_cancel(); - -end: - mutex_unlock(&g_request.mutex); -} - -static int tbase_object_make(uint32_t spid, struct tbase_object *obj) -{ - struct mc_blob_len_info *l_info = (struct mc_blob_len_info *)obj->data; - uint8_t *address = &obj->data[obj->header_length + obj->length]; - struct mclf_header_v2 *thdr; - int ret; - - /* Get root container */ - ret = admin_get_root_container(address); - if (ret < 0) - goto err; - - l_info->root_size = ret; - address += ret; - - /* Get SP container */ - ret = admin_get_sp_container(address, spid); - if (ret < 0) - goto err; - - l_info->sp_size = ret; - address += ret; - - /* Get trustlet container */ - thdr = (struct mclf_header_v2 *)&obj->data[obj->header_length]; - ret = admin_get_trustlet_container(address, &thdr->uuid, spid); - if (ret < 0) - goto err; - - l_info->ta_size = ret; - address += ret; - - /* Setup lengths information */ - l_info->magic = MC_TLBLOBLEN_MAGIC; - obj->length += sizeof(*l_info); - obj->length += l_info->root_size + l_info->sp_size + l_info->ta_size; - ret = 0; - -err: - return ret; -} - -struct tbase_object *tbase_object_read(uint32_t spid, uintptr_t address, - size_t length) -{ - struct device *dev = g_admin_ctx.dev; - char __user *addr = (char __user *)address; - struct tbase_object *obj; - uint8_t *data; - struct mclf_header_v2 thdr; - int ret; - - /* Check length */ - if (length < sizeof(thdr)) { - dev_err(dev, "%s: buffer shorter than header size\n", __func__); - return ERR_PTR(-EFAULT); - } - - /* Read header */ - if (copy_from_user(&thdr, addr, sizeof(thdr))) { - dev_err(dev, "%s: header: copy_from_user failed\n", __func__); - return ERR_PTR(-EFAULT); - } - - /* Allocate memory */ - obj = tbase_object_alloc(thdr.service_type == SERVICE_TYPE_SP_TRUSTLET, - length); - if (!obj) - return ERR_PTR(-ENOMEM); - - /* Copy header */ - data = &obj->data[obj->header_length]; - memcpy(data, &thdr, sizeof(thdr)); - /* Copy the rest of the data */ - data += sizeof(thdr); - if (copy_from_user(data, &addr[sizeof(thdr)], length - sizeof(thdr))) { - dev_err(dev, "%s: data: copy_from_user failed\n", __func__); - vfree(obj); - return ERR_PTR(-EFAULT); - } - - if (obj->header_length) { - ret = tbase_object_make(spid, obj); - if (ret) { - vfree(obj); - return ERR_PTR(ret); - } - } - - return obj; -} - -struct tbase_object *tbase_object_select(const struct mc_uuid_t *uuid) -{ - struct tbase_object *obj; - struct mclf_header_v2 *thdr; - - obj = tbase_object_alloc(false, sizeof(*thdr)); - if (!obj) - return ERR_PTR(-ENOMEM); - - thdr = (struct mclf_header_v2 *)&obj->data[obj->header_length]; - memcpy(&thdr->uuid, uuid, sizeof(thdr->uuid)); - return obj; -} - -struct tbase_object *tbase_object_get(const struct mc_uuid_t *uuid, - uint32_t is_gp_uuid) -{ - struct tbase_object *obj; - uint32_t spid = 0; - - /* admin_get_trustlet creates the right object based on service type */ - obj = admin_get_trustlet(uuid, is_gp_uuid, &spid); - if (IS_ERR(obj)) - return obj; - - /* SP trustlet: create full secure object with all containers */ - if (obj->header_length) { - int ret; - - /* Do not return EINVAL in this case as SPID was not found */ - if (!spid) { - vfree(obj); - return ERR_PTR(-ENOENT); - } - - ret = tbase_object_make(spid, obj); - if (ret) { - vfree(obj); - return ERR_PTR(ret); - } - } - - return obj; -} - -static inline int load_driver(struct tbase_client *client, - struct mc_admin_load_info *info) -{ - struct tbase_object *obj; - struct mclf_header_v2 *thdr; - struct mc_identity identity = { - .login_type = TEEC_LOGIN_PUBLIC, - }; - uintptr_t dci = 0; - uint32_t dci_len = 0; - uint32_t sid; - int ret; - - obj = tbase_object_read(info->spid, info->address, info->length); - if (IS_ERR(obj)) - return PTR_ERR(obj); - - thdr = (struct mclf_header_v2 *)&obj->data[obj->header_length]; - if (!(thdr->flags & MC_SERVICE_HEADER_FLAGS_NO_CONTROL_INTERFACE)) { - /* - * The driver requires a DCI, although we won't be able to use - * it to communicate. - */ - dci_len = PAGE_SIZE; - ret = api_malloc_cbuf(client, dci_len, &dci, NULL); - if (ret) - goto end; - } - - /* Open session */ - ret = client_add_session(client, obj, dci, dci_len, &sid, false, - &identity); - if (ret) - api_free_cbuf(client, dci); - else - dev_dbg(g_admin_ctx.dev, "driver loaded with sid %x", sid); - -end: - vfree(obj); - return ret; -} - -static inline int load_token(struct mc_admin_load_info *token) -{ - struct tbase_mmu *mmu; - struct mcp_buffer_map map; - int ret; - - mmu = tbase_mmu_create(current, (void *)(uintptr_t)token->address, - token->length); - if (IS_ERR(mmu)) - return PTR_ERR(mmu); - - tbase_mmu_buffer(mmu, &map); - ret = mcp_load_token(token->address, &map); - tbase_mmu_delete(mmu); - return ret; -} - -static inline int load_check(struct mc_admin_load_info *info) -{ - struct tbase_object *obj; - struct tbase_mmu *mmu; - struct mcp_buffer_map map; - int ret; - - obj = tbase_object_read(info->spid, info->address, info->length); - if (IS_ERR(obj)) - return PTR_ERR(obj); - - mmu = tbase_mmu_create(NULL, obj->data, obj->length); - if (IS_ERR(mmu)) - return PTR_ERR(mmu); - - tbase_mmu_buffer(mmu, &map); - ret = mcp_load_check(obj, &map); - tbase_mmu_delete(mmu); - return ret; -} - -static ssize_t admin_write(struct file *file, const char __user *user, - size_t len, loff_t *off) -{ - int ret; - - /* No offset allowed [yet] */ - if (*off) { - g_request.response.error_no = EPIPE; - ret = -ECOMM; - goto err; - } - - if (server_state_is(REQUEST_RECEIVED)) { - /* Check client state */ - if (!client_state_is(REQUEST_SENT)) { - g_request.response.error_no = EPIPE; - ret = -EPIPE; - goto err; - } - - /* Receive response header */ - if (copy_from_user(&g_request.response, user, - sizeof(g_request.response))) { - g_request.response.error_no = EPIPE; - ret = -ECOMM; - goto err; - } - - /* Check request ID */ - if (g_request.request.request_id != - g_request.response.request_id) { - g_request.response.error_no = EPIPE; - ret = -EBADE; - goto err; - } - - /* Response header is acceptable */ - ret = sizeof(g_request.response); - if (g_request.response.length) - server_state_change(RESPONSE_SENT); - else - server_state_change(READY); - - goto end; - } else if (server_state_is(RESPONSE_SENT)) { - /* Server is waiting */ - server_state_change(DATA_SENT); - - /* Get data */ - ret = wait_for_completion_interruptible( - &g_request.client_complete); - - /* Server received a signal, let see if it tries again */ - if (ret) { - server_state_change(RESPONSE_SENT); - return ret; - } - - /* Check client state */ - if (!client_state_is(BUFFERS_READY)) { - g_request.response.error_no = EPIPE; - ret = -EPIPE; - goto err; - } - - /* TODO deal with several writes */ - if (len != g_request.size) - len = g_request.size; - - ret = copy_from_user(g_request.buffer, user, len); - if (ret) { - g_request.response.error_no = EPIPE; - ret = -ECOMM; - goto err; - } - - ret = len; - server_state_change(READY); - goto end; - } else { - ret = -ECOMM; - goto err; - } - -err: - server_state_change(READY); -end: - complete(&g_request.server_complete); - return ret; -} - -static long admin_ioctl(struct file *file, unsigned int cmd, - unsigned long arg) -{ - struct tbase_client *client = file->private_data; - void __user *uarg = (void __user *)arg; - int ret = -EINVAL; - - MCDRV_DBG("%u from %s", _IOC_NR(cmd), current->comm); - - if (WARN(!client, "No client data available")) - return -EFAULT; - - switch (cmd) { - case MC_ADMIN_IO_GET_DRIVER_REQUEST: { - /* Block until a request is available */ - ret = wait_for_completion_interruptible( - &g_request.client_complete); - if (ret) - /* Interrupted by signal */ - break; - - /* Check client state */ - if (!client_state_is(REQUEST_SENT)) { - g_request.response.error_no = EPIPE; - complete(&g_request.server_complete); - ret = -EPIPE; - break; - } - - /* Send request (the driver request mutex is held) */ - ret = copy_to_user(uarg, &g_request.request, - sizeof(g_request.request)); - if (ret) { - server_state_change(READY); - complete(&g_request.server_complete); - ret = -EPROTO; - break; - } - - server_state_change(REQUEST_RECEIVED); - break; - } - case MC_ADMIN_IO_GET_INFO: { - struct mc_admin_driver_info info; - - info.drv_version = MC_VERSION(MCDRVMODULEAPI_VERSION_MAJOR, - MCDRVMODULEAPI_VERSION_MINOR); - info.initial_cmd_id = g_request.request_id; - ret = copy_to_user(uarg, &info, sizeof(info)); - break; - } - case MC_ADMIN_IO_LOAD_DRIVER: { - struct mc_admin_load_info info; - - ret = copy_from_user(&info, uarg, sizeof(info)); - if (ret) - ret = -EFAULT; - else - ret = load_driver(client, &info); - - break; - } - case MC_ADMIN_IO_LOAD_TOKEN: { - struct mc_admin_load_info info; - - ret = copy_from_user(&info, uarg, sizeof(info)); - if (ret) - ret = -EFAULT; - else - ret = load_token(&info); - - break; - } - case MC_ADMIN_IO_LOAD_CHECK: { - struct mc_admin_load_info info; - - ret = copy_from_user(&info, uarg, sizeof(info)); - if (ret) - ret = -EFAULT; - else - ret = load_check(&info); - - break; - } - default: - ret = -ENOIOCTLCMD; - } - - return ret; -} - -/* - * mc_fd_release() - This function will be called from user space as close(...) - * The client data are freed and the associated memory pages are unreserved. - * - * @inode - * @file - * - * Returns 0 - */ -static int admin_release(struct inode *inode, struct file *file) -{ - struct tbase_client *client = file->private_data; - struct device *dev = g_admin_ctx.dev; - - if (!client) - return -EPROTO; - - api_close_device(client); - file->private_data = NULL; - - /* Requests from driver to daemon */ - mutex_lock(&g_request.states_mutex); - dev_warn(dev, "%s: daemon disconnected\n", __func__); - g_request.server_state = NOT_CONNECTED; - /* A non-zero command indicates that a thread is waiting */ - if (g_request.client_state != IDLE) { - g_request.response.error_no = ESHUTDOWN; - complete(&g_request.server_complete); - } - - mutex_unlock(&g_request.states_mutex); - atomic_set(&g_admin_ctx.daemon_counter, 0); - /* - * ret is quite irrelevant here as most apps don't care about the - * return value from close() and it's quite difficult to recover - */ - return 0; -} - -static int admin_open(struct inode *inode, struct file *file) -{ - struct device *dev = g_admin_ctx.dev; - struct tbase_client *client; - int err; - - /* - * If the daemon is already set we can't allow anybody else to open - * the admin interface. - */ - if (atomic_cmpxchg(&g_admin_ctx.daemon_counter, 0, 1) != 0) { - MCDRV_ERROR("Daemon is already connected"); - return -EPROTO; - } - - /* Any value will do */ - g_request.request_id = 42; - - /* Setup the usual variables */ - MCDRV_DBG("accept %s as tbase daemon", current->comm); - - /* - * daemon is connected so now we can safely suppose - * the secure world is loaded too - */ - if (!IS_ERR_OR_NULL(g_admin_ctx.tee_start_cb)) - g_admin_ctx.tee_start_cb = ERR_PTR(g_admin_ctx.tee_start_cb()); - if (IS_ERR(g_admin_ctx.tee_start_cb)) { - MCDRV_ERROR("Failed initializing the SW"); - err = PTR_ERR(g_admin_ctx.tee_start_cb); - goto fail_connection; -} - - /* Create client */ - client = api_open_device(true); - if (!client) { - err = -ENOMEM; - goto fail_connection; - } - - /* Store client in user file */ - file->private_data = client; - - /* Requests from driver to daemon */ - server_state_change(READY); - dev_info(dev, "%s: daemon connected\n", __func__); - - return 0; - -fail_connection: - atomic_set(&g_admin_ctx.daemon_counter, 0); - return err; -} - -/* function table structure of this device driver. */ -static const struct file_operations mc_admin_fops = { - .owner = THIS_MODULE, - .open = admin_open, - .release = admin_release, - .unlocked_ioctl = admin_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = admin_ioctl, -#endif - .write = admin_write, -}; - -int mc_admin_init(struct class *mc_device_class, dev_t *out_dev, - int (*tee_start_cb)(void)) -{ - int err = 0; - - if (!out_dev || !mc_device_class) - return -EINVAL; - - atomic_set(&g_admin_ctx.daemon_counter, 0); - - /* Requests from driver to daemon */ - mutex_init(&g_request.mutex); - mutex_init(&g_request.states_mutex); - init_completion(&g_request.client_complete); - init_completion(&g_request.server_complete); - mcp_register_crashhandler(mc_admin_sendcrashdump); - - /* Create char device */ - cdev_init(&g_admin_ctx.mc_admin_cdev, &mc_admin_fops); - err = alloc_chrdev_region(&g_admin_ctx.mc_dev_admin, 0, MC_DEV_MAX, - "trustonic_tee"); - if (err < 0) { - MCDRV_ERROR("failed to allocate char dev region"); - goto fail_alloc_chrdev_region; - } - - err = cdev_add(&g_admin_ctx.mc_admin_cdev, g_admin_ctx.mc_dev_admin, 1); - if (err) { - MCDRV_ERROR("admin device register failed"); - goto fail_cdev_add; - } - - g_admin_ctx.mc_admin_cdev.owner = THIS_MODULE; - g_admin_ctx.dev = device_create(mc_device_class, NULL, - g_admin_ctx.mc_dev_admin, NULL, - MC_ADMIN_DEVNODE); - if (IS_ERR(g_admin_ctx.dev)) { - err = PTR_ERR(g_admin_ctx.dev); - goto fail_dev_create; - } - - g_admin_ctx.mc_dev_name.name = "driver = &g_admin_ctx.mc_dev_name; - *out_dev = g_admin_ctx.mc_dev_admin; - - /* Register the call back for starting the secure world */ - g_admin_ctx.tee_start_cb = tee_start_cb; - - MCDRV_DBG("done"); - return 0; - -fail_dev_create: - cdev_del(&g_admin_ctx.mc_admin_cdev); - -fail_cdev_add: - unregister_chrdev_region(g_admin_ctx.mc_dev_admin, MC_DEV_MAX); - -fail_alloc_chrdev_region: - MCDRV_ERROR("fail with %d", err); - return err; -} - -void mc_admin_exit(struct class *mc_device_class) -{ - device_destroy(mc_device_class, g_admin_ctx.mc_dev_admin); - cdev_del(&g_admin_ctx.mc_admin_cdev); - unregister_chrdev_region(g_admin_ctx.mc_dev_admin, MC_DEV_MAX); - /* Requests from driver to daemon */ - mutex_destroy(&g_request.states_mutex); - MCDRV_DBG("done"); -} diff --git a/drivers/gud/MobiCoreDriver/admin.h b/drivers/gud/MobiCoreDriver/admin.h deleted file mode 100644 index 5a78d943752da..0000000000000 --- a/drivers/gud/MobiCoreDriver/admin.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 ADMIN_FD_H_ -#define ADMIN_FD_H_ - -struct mc_uuid_t; -struct tbase_object; - -int mc_admin_init(struct class *mc_device_class, dev_t *out_dev, - int (*tee_start_cb)(void)); -void mc_admin_exit(struct class *mc_device_class); - -struct tbase_object *tbase_object_select(const struct mc_uuid_t *uuid); -struct tbase_object *tbase_object_get(const struct mc_uuid_t *uuid, - uint32_t is_gp_uuid); -struct tbase_object *tbase_object_read(uint32_t spid, uintptr_t address, - size_t length); -void tbase_object_free(struct tbase_object *out_robj); - -#endif /* ADMIN_FD_H_ */ diff --git a/drivers/gud/MobiCoreDriver/api.c b/drivers/gud/MobiCoreDriver/api.c deleted file mode 100644 index 0d2abaf617aea..0000000000000 --- a/drivers/gud/MobiCoreDriver/api.c +++ /dev/null @@ -1,419 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 -#include -#include -#include -#include - -#include /* MC_MAP_MAX */ -#include "main.h" -#include "debug.h" -#include "mcp.h" -#include "admin.h" -#include "session.h" -#include "client.h" -#include "api.h" - -static struct api_ctx { - struct mutex clients_lock; /* Clients list + temp notifs */ - struct list_head clients; /* List of user-space clients */ -} api_ctx; - -/* - * Initialize a new tbase client object - * @return client pointer or NULL if no allocation was possible. - */ -struct tbase_client *api_open_device(bool is_from_kernel) -{ - struct tbase_client *client; - - /* Allocate and init client object */ - client = client_create(is_from_kernel); - if (!client) { - MCDRV_ERROR("Could not create client"); - return NULL; - } - - /* Add client to list of clients */ - mutex_lock(&api_ctx.clients_lock); - list_add_tail(&client->list, &api_ctx.clients); - mutex_unlock(&api_ctx.clients_lock); - - MCDRV_DBG("created client %p", client); - return client; -} - -/* - * Try and mark client as "closing" - * @return tbase driver error code - */ -int api_freeze_device(struct tbase_client *client) -{ - int err = 0; - - if (!client_set_closing(client)) - err = -ENOTEMPTY; - - MCDRV_DBG("client %p, exit with %d\n", client, err); - return err; -} - -/* - * Release a client and the session+cbuf objects it contains. - * @param client_t client - * @return tbase driver error code - */ -void api_close_device(struct tbase_client *client) -{ - /* Remove client from list of active clients */ - mutex_lock(&api_ctx.clients_lock); - list_del(&client->list); - mutex_unlock(&api_ctx.clients_lock); - /* Close all remaining sessions */ - client_close_sessions(client); - client_put(client); - MCDRV_DBG("client %p closed\n", client); -} - -/* - * Open TA for given client. TA binary is provided by the daemon. - * @param - * @return tbase driver error code - */ -int api_open_session(struct tbase_client *client, - uint32_t *p_session_id, - const struct mc_uuid_t *uuid, - uintptr_t tci, - size_t tci_len, - bool is_gp_uuid, - struct mc_identity *identity) -{ - int err = 0; - uint32_t sid = 0; - struct tbase_object *obj; - - /* Check parameters */ - if (!p_session_id) - return -EINVAL; - - if (!uuid) - return -EINVAL; - - /* Get secure object */ - obj = tbase_object_get(uuid, is_gp_uuid); - if (IS_ERR(obj)) { - /* Try to select secure object inside the SWd if not found */ - if ((PTR_ERR(obj) == -ENOENT) && g_ctx.f_ta_auth) - obj = tbase_object_select(uuid); - - if (IS_ERR(obj)) { - err = PTR_ERR(obj); - goto end; - } - } - - /* Open session */ - err = client_add_session(client, obj, tci, tci_len, &sid, is_gp_uuid, - identity); - /* Fill in return parameter */ - if (!err) - *p_session_id = sid; - - /* Delete secure object */ - tbase_object_free(obj); - -end: - - MCDRV_DBG("session %x, exit with %d\n", sid, err); - return err; -} - -/* - * Open TA for given client. TA binary is provided by the client. - * @param - * @return tbase driver error code - */ -int api_open_trustlet(struct tbase_client *client, - uint32_t *p_session_id, - uint32_t spid, - uintptr_t trustlet, - size_t trustlet_len, - uintptr_t tci, - size_t tci_len) -{ - struct tbase_object *obj; - struct mc_identity identity = { - .login_type = TEEC_LOGIN_PUBLIC, - }; - uint32_t sid = 0; - int err = 0; - - /* Check parameters */ - if (!p_session_id) - return -EINVAL; - - /* Create secure object from user-space trustlet binary */ - obj = tbase_object_read(spid, trustlet, trustlet_len); - if (IS_ERR(obj)) { - err = PTR_ERR(obj); - goto end; - } - - /* Open session */ - err = client_add_session(client, obj, tci, tci_len, &sid, false, - &identity); - /* Fill in return parameter */ - if (!err) - *p_session_id = sid; - - /* Delete secure object */ - tbase_object_free(obj); - -end: - MCDRV_DBG("session %x, exit with %d\n", sid, err); - return err; -} - -/* - * Close a TA - * @param - * @return tbase driver error code - */ -int api_close_session(struct tbase_client *client, uint32_t session_id) -{ - int ret = client_remove_session(client, session_id); - - MCDRV_DBG("session %x, exit with %d\n", session_id, ret); - return ret; -} - -/* - * Send a notification to TA - * @return tbase driver error code - */ -int api_notify(struct tbase_client *client, uint32_t session_id) -{ - int err = 0; - struct tbase_session *session = NULL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - /* Send command to SWd */ - if (!session) { - err = -ENXIO; - } else { - err = session_notify_swd(session); - - /* Release session */ - client_unref_session(session); - } - - MCDRV_DBG("session %x, exit with %d\n", session_id, err); - return err; -} - -/* - * Wait for a notification from TA - * @return tbase driver error code - */ -int api_wait_notification(struct tbase_client *client, - uint32_t session_id, - int32_t timeout) -{ - int err = 0; - struct tbase_session *session = NULL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - /* Wait for notification */ - if (!session) { - err = -ENXIO; - } else { - err = session_waitnotif(session, timeout); - - /* Release session */ - client_unref_session(session); - } - - MCDRV_DBG("session %x, exit with %d\n", session_id, err); - return err; -} - -/* - * Allocate a contiguous buffer (cbuf) for given client - * - * @param client client - * @param len size of the cbuf - * @param **p_addr pointer to the cbuf kva - * @return tbase driver error code - */ -int api_malloc_cbuf(struct tbase_client *client, uint32_t len, - uintptr_t *addr, struct vm_area_struct *vmarea) -{ - int err = tbase_cbuf_alloc(client, len, addr, vmarea); - - MCDRV_DBG("exit with %d\n", err); - return err; -} - -/* - * Free a contiguous buffer from given client - * @param client - * @param addr kernel virtual address of the buffer - * - * @return tbase driver error code - */ -int api_free_cbuf(struct tbase_client *client, uintptr_t addr) -{ - int err = tbase_cbuf_free(client, addr); - - MCDRV_DBG("@ 0x%lx, exit with %d\n", addr, err); - return err; -} - -/* Share a buffer with given TA in SWd */ -int api_map_wsms(struct tbase_client *client, uint32_t session_id, - struct mc_ioctl_buffer *bufs) -{ - struct tbase_session *session = NULL; - int err = 0; - - if (!client) - return -EINVAL; - - if (!bufs) - return -EINVAL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - if (session) { - /* Add buffer to the session */ - err = session_wsms_add(session, bufs); - - /* Release session */ - client_unref_session(session); - } else { - err = -ENXIO; - } - - MCDRV_DBG("exit with %d\n", err); - return err; -} - -/* Stop sharing a buffer with SWd */ -int api_unmap_wsms(struct tbase_client *client, uint32_t session_id, - const struct mc_ioctl_buffer *bufs) -{ - struct tbase_session *session = NULL; - int err = 0; - - if (!client) - return -EINVAL; - - if (!bufs) - return -EINVAL; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - if (!session) { - err = -ENXIO; - } else { - /* Remove buffer from session */ - err = session_wsms_remove(session, bufs); - /* Release session */ - client_unref_session(session); - } - - MCDRV_DBG("exit with %d\n", err); - return err; -} - -/* - * Read session exit/termination code - */ -int api_get_session_exitcode(struct tbase_client *client, uint32_t session_id, - int32_t *exit_code) -{ - int err = 0; - struct tbase_session *session; - - /* Acquire session */ - session = client_ref_session(client, session_id); - - if (!session) { - err = -ENXIO; - } else { - /* Retrieve error */ - *exit_code = session_exitcode(session); - - /* Release session */ - client_unref_session(session); - - err = 0; - } - - MCDRV_DBG("session %x, exit with %d\n", session_id, err); - return err; -} - -void api_init(void) -{ - INIT_LIST_HEAD(&api_ctx.clients); - mutex_init(&api_ctx.clients_lock); - - INIT_LIST_HEAD(&g_ctx.closing_sess); - mutex_init(&g_ctx.closing_lock); -} - -int api_info(struct kasnprintf_buf *buf) -{ - struct tbase_client *client; - struct tbase_session *session; - ssize_t ret = 0; - - mutex_lock(&api_ctx.clients_lock); - if (list_empty(&api_ctx.clients)) - goto done; - - list_for_each_entry(client, &api_ctx.clients, list) { - ret = client_info(client, buf); - if (ret < 0) - break; - } - -done: - mutex_unlock(&api_ctx.clients_lock); - - if (ret >= 0) { - mutex_lock(&g_ctx.closing_lock); - if (!list_empty(&g_ctx.closing_sess)) - ret = kasnprintf(buf, "closing sessions:\n"); - - list_for_each_entry(session, &g_ctx.closing_sess, list) { - ret = session_info(session, buf); - if (ret < 0) - break; - } - - mutex_unlock(&g_ctx.closing_lock); - } - - return ret; -} diff --git a/drivers/gud/MobiCoreDriver/api.h b/drivers/gud/MobiCoreDriver/api.h deleted file mode 100644 index 740ec7fb2d5b9..0000000000000 --- a/drivers/gud/MobiCoreDriver/api.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _API_H_ -#define _API_H_ - -struct tbase_client; - -struct tbase_client *api_open_device(bool is_from_kernel); -int api_freeze_device(struct tbase_client *client); -void api_close_device(struct tbase_client *client); -int api_open_session(struct tbase_client *client, uint32_t *session_id, - const struct mc_uuid_t *uuid, - uintptr_t tci, size_t tci_len, bool is_gp_uuid, - struct mc_identity *identity); -int api_open_trustlet(struct tbase_client *client, uint32_t *session_id, - uint32_t spid, uintptr_t trustlet, size_t trustlet_len, - uintptr_t tci, size_t tci_len); -int api_close_session(struct tbase_client *client, uint32_t session_id); -int api_notify(struct tbase_client *client, uint32_t session_id); -int api_wait_notification(struct tbase_client *client, uint32_t session_id, - int32_t timeout); -int api_malloc_cbuf(struct tbase_client *client, uint32_t len, uintptr_t *addr, - struct vm_area_struct *vmarea); -int api_free_cbuf(struct tbase_client *client, uintptr_t addr); -int api_map_wsms(struct tbase_client *client, uint32_t session_id, - struct mc_ioctl_buffer *bufs); -int api_unmap_wsms(struct tbase_client *client, uint32_t session_id, - const struct mc_ioctl_buffer *bufs); -int api_get_session_exitcode(struct tbase_client *client, uint32_t session_id, - int32_t *exit_code); -void api_init(void); -int api_info(struct kasnprintf_buf *buf); - -#endif /* _API_H_ */ diff --git a/drivers/gud/MobiCoreDriver/arm.h b/drivers/gud/MobiCoreDriver/arm.h deleted file mode 100644 index 58d91f11f789c..0000000000000 --- a/drivers/gud/MobiCoreDriver/arm.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * 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. - * - * 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 _MC_ARM_H_ -#define _MC_ARM_H_ - -#include "debug.h" - -#ifdef CONFIG_ARM64 -inline bool has_security_extensions(void) -{ - return true; -} - -inline bool is_secure_mode(void) -{ - return false; -} -#else -/* - * ARM Trustzone specific masks and modes - * Vanilla Linux is unaware of TrustZone extension. - * I.e. arch/arm/include/asm/ptrace.h does not define monitor mode. - * Also TZ bits in cpuid are not defined, ARM port uses magic numbers, - * see arch/arm/kernel/setup.c - */ -#define ARM_MONITOR_MODE (0x16) /*(0b10110)*/ -#define ARM_SECURITY_EXTENSION_MASK (0x30) - -/* check if CPU supports the ARM TrustZone Security Extensions */ -inline bool has_security_extensions(void) -{ - u32 fea = 0; - - asm volatile( - "mrc p15, 0, %[fea], cr0, cr1, 0" : - [fea]"=r" (fea)); - - MCDRV_DBG_VERBOSE("CPU Features: 0x%X", fea); - - /* - * If the CPU features ID has 0 for security features then the CPU - * doesn't support TrustZone at all! - */ - if ((fea & ARM_SECURITY_EXTENSION_MASK) == 0) - return false; - - return true; -} - -/* check if running in secure mode */ -inline bool is_secure_mode(void) -{ - u32 cpsr = 0; - u32 nsacr = 0; - - asm volatile( - "mrc p15, 0, %[nsacr], cr1, cr1, 2\n" - "mrs %[cpsr], cpsr\n" : - [nsacr]"=r" (nsacr), - [cpsr]"=r"(cpsr)); - - MCDRV_DBG_VERBOSE("CPRS.M = set to 0x%X\n", cpsr & MODE_MASK); - MCDRV_DBG_VERBOSE("SCR.NS = set to 0x%X\n", nsacr); - - /* - * If the NSACR contains the reset value(=0) then most likely we are - * running in Secure MODE. - * If the cpsr mode is set to monitor mode then we cannot load! - */ - if (nsacr == 0 || ((cpsr & MODE_MASK) == ARM_MONITOR_MODE)) - return true; - - return false; -} -#endif - -#endif /* _MC_ARM_H_ */ diff --git a/drivers/gud/MobiCoreDriver/build_tag.h b/drivers/gud/MobiCoreDriver/build_tag.h deleted file mode 100644 index 51a5d3e0ae7f5..0000000000000 --- a/drivers/gud/MobiCoreDriver/build_tag.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * 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. - * - * 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. - */ -#define MOBICORE_COMPONENT_BUILD_TAG \ - "t-base-QC-MSM8996-Android-302B-V001-20150529_084320_16" diff --git a/drivers/gud/MobiCoreDriver/client.c b/drivers/gud/MobiCoreDriver/client.c deleted file mode 100644 index c8bdc07b8742d..0000000000000 --- a/drivers/gud/MobiCoreDriver/client.c +++ /dev/null @@ -1,572 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "main.h" -#include "debug.h" -#include "mcp.h" -#include "mmu.h" -#include "session.h" -#include "client.h" - -/* - * Contiguous buffer allocated to TLCs. - * These buffers are used as world shared memory (wsm) to share with - * secure world. - */ -struct tbase_cbuf { - /* Client this cbuf belongs to */ - struct tbase_client *client; - /* List element for client's list of cbuf's */ - struct list_head list; - /* Number of references kept to this buffer */ - struct kref kref; - /* virtual Kernel start address */ - uintptr_t addr; - /* virtual Userspace start address */ - uintptr_t uaddr; - /* physical start address */ - phys_addr_t phys; - /* 2^order = number of pages allocated */ - unsigned int order; - /* Length of memory mapped to user */ - uint32_t len; -}; - -/* - * Map a kernel contiguous buffer to user space - */ -static int map_cbuf(struct vm_area_struct *vmarea, uintptr_t addr, uint32_t len, - uintptr_t *uaddr) -{ - int ret; - - if (WARN(!uaddr, "No uaddr pointer available")) - return -EINVAL; - - if (WARN(!vmarea, "No vma available")) - return -EINVAL; - - if (WARN(!addr, "No addr available")) - return -EINVAL; - - if (len != (uint32_t)(vmarea->vm_end - vmarea->vm_start)) { - MCDRV_ERROR("cbuf incompatible with vma"); - return -EINVAL; - } - - vmarea->vm_flags |= VM_IO; - - /* CPI todo: use io_remap_page_range() to be consistent with VM_IO ? */ - ret = remap_pfn_range(vmarea, vmarea->vm_start, - page_to_pfn(virt_to_page(addr)), - vmarea->vm_end - vmarea->vm_start, - vmarea->vm_page_prot); - if (ret) { - *uaddr = 0; - MCDRV_ERROR("User mapping failed"); - return ret; - } - - *uaddr = vmarea->vm_start; - return 0; -} - -/* - * Allocate and initialize a client object - */ -struct tbase_client *client_create(bool is_from_kernel) -{ - struct tbase_client *client; - - /* allocate client structure */ - client = kzalloc(sizeof(*client), GFP_KERNEL); - if (!client) { - MCDRV_ERROR("Allocation failure"); - return NULL; - } - - /* init members */ - client->pid = is_from_kernel ? 0 : current->pid; - memcpy(client->comm, current->comm, sizeof(client->comm)); - kref_init(&client->kref); - INIT_LIST_HEAD(&client->cbufs); - mutex_init(&client->cbufs_lock); - INIT_LIST_HEAD(&client->sessions); - mutex_init(&client->sessions_lock); - INIT_LIST_HEAD(&client->list); - - return client; -} - -/* - * At this point, nobody has access to the client anymore, so no new sessions - * are coming. - */ -void client_close_sessions(struct tbase_client *client) -{ - struct tbase_session *session; - - mutex_lock(&client->sessions_lock); - while (!list_empty(&client->sessions)) { - session = list_first_entry(&client->sessions, - struct tbase_session, list); - - /* Move session to closing sessions list */ - mutex_lock(&g_ctx.closing_lock); - list_move(&session->list, &g_ctx.closing_sess); - mutex_unlock(&g_ctx.closing_lock); - /* Call session_close without lock */ - mutex_unlock(&client->sessions_lock); - session_close(session); - mutex_lock(&client->sessions_lock); - } - - mutex_unlock(&client->sessions_lock); -} - -/* - * Free client object + all objects it contains. - * Can be called only by last user referencing the client, - * therefore mutex lock seems overkill - */ -static void client_release(struct kref *kref) -{ - struct tbase_client *client; - - client = container_of(kref, struct tbase_client, kref); - kfree(client); -} - -void client_put(struct tbase_client *client) -{ - kref_put(&client->kref, client_release); -} - -/* - * Returns true if client is a kernel object. - */ -bool client_is_kernel(struct tbase_client *client) -{ - return !client->pid; -} - -/* - * Set client "closing" state, only if it contains no session. - * Once in "closing" state, system "close" can be called. - * Return: true if this state could be set. - */ -bool client_set_closing(struct tbase_client *client) -{ - bool clear = false; - - /* Check for sessions */ - mutex_lock(&client->sessions_lock); - clear = list_empty(&client->sessions); - client->closing = clear; - mutex_unlock(&client->sessions_lock); - MCDRV_DBG("return %d", clear); - return clear; -} - -/* - * Opens a TA and add corresponding session object to given client - * return: t-base driver error code - */ -int client_add_session(struct tbase_client *client, - const struct tbase_object *obj, uintptr_t tci, - size_t len, uint32_t *session_id, bool is_gp, - struct mc_identity *identity) -{ - struct tbase_session *session = NULL; - struct tbase_mmu *obj_mmu = NULL; - int ret = 0; - - /* - * Create session object with temp sid=0 BEFORE session is started, - * otherwise if a GP TA is started and NWd session object allocation - * fails, we cannot handle the potentially delayed GP closing. - * Adding session to list must be done AFTER it is started (once we have - * sid), therefore it cannot be done within session_create(). - */ - session = session_create(client, is_gp, identity); - if (IS_ERR(session)) - return PTR_ERR(session); - - /* Create blob L2 table (blob is allocated by driver, so task=NULL) */ - obj_mmu = tbase_mmu_create(NULL, obj->data, obj->length); - if (IS_ERR(obj_mmu)) { - ret = PTR_ERR(obj_mmu); - goto err; - } - - /* Open session */ - ret = session_open(session, obj, obj_mmu, tci, len); - /* Blob table no more needed in any case */ - tbase_mmu_delete(obj_mmu); - if (ret) - goto err; - - mutex_lock(&client->sessions_lock); - if (unlikely(client->closing)) { - /* Client has been frozen, no more sessions allowed */ - ret = -ENODEV; - } else { - /* Add session to client */ - list_add(&session->list, &client->sessions); - /* Set sid returned by SWd */ - *session_id = session->mcp_session.id; - } - - mutex_unlock(&client->sessions_lock); - -err: - /* Close or free session on error */ - if (ret == -ENODEV) { - /* The session must enter the closing process... */ - mutex_lock(&g_ctx.closing_lock); - list_add(&session->list, &g_ctx.closing_sess); - mutex_unlock(&g_ctx.closing_lock); - session_close(session); - } else if (ret) { - session_put(session); - } - - return ret; -} - -/* - * Remove a session object from client and close corresponding TA - * Return: true if session was found and closed - */ -int client_remove_session(struct tbase_client *client, uint32_t session_id) -{ - struct tbase_session *session = NULL, *candidate; - - /* Move session from main list to closing list */ - mutex_lock(&client->sessions_lock); - list_for_each_entry(candidate, &client->sessions, list) { - if (candidate->mcp_session.id == session_id) { - session = candidate; - mutex_lock(&g_ctx.closing_lock); - list_move(&session->list, &g_ctx.closing_sess); - mutex_unlock(&g_ctx.closing_lock); - break; - } - } - - mutex_unlock(&client->sessions_lock); - - /* Close session */ - return session_close(session); -} - -/* - * Find a session object and increment its reference counter. - * Object cannot be freed until its counter reaches 0. - * return: pointer to the object, NULL if not found. - */ -struct tbase_session *client_ref_session(struct tbase_client *client, - uint32_t session_id) -{ - struct tbase_session *session = NULL, *candidate; - - mutex_lock(&client->sessions_lock); - list_for_each_entry(candidate, &client->sessions, list) { - if (candidate->mcp_session.id == session_id) { - session = candidate; - session_get(session); - break; - } - } - - mutex_unlock(&client->sessions_lock); - return session; -} - -/* - * Decrement a session object's reference counter, and frees the object if it - * was the last reference. - * No lookup since session may have been removed from list - */ -void client_unref_session(struct tbase_session *session) -{ - session_put(session); -} - -static inline int cbuf_info(struct tbase_cbuf *cbuf, - struct kasnprintf_buf *buf); - -int client_info(struct tbase_client *client, struct kasnprintf_buf *buf) -{ - struct tbase_cbuf *cbuf; - struct tbase_session *session; - int ret; - - if (client->pid) - ret = kasnprintf(buf, "client %p: %s (%d)\n", client, - client->comm, client->pid); - else - ret = kasnprintf(buf, "client %p: [kernel]\n", client); - - if (ret < 0) - return ret; - - /* Buffers */ - mutex_lock(&client->cbufs_lock); - if (list_empty(&client->cbufs)) - goto done_cbufs; - - list_for_each_entry(cbuf, &client->cbufs, list) { - ret = cbuf_info(cbuf, buf); - if (ret < 0) - goto done_cbufs; - } - -done_cbufs: - mutex_unlock(&client->cbufs_lock); - if (ret < 0) - return ret; - - /* Sessions */ - mutex_lock(&client->sessions_lock); - if (list_empty(&client->sessions)) - goto done_sessions; - - list_for_each_entry(session, &client->sessions, list) { - ret = session_info(session, buf); - if (ret < 0) - goto done_sessions; - } - -done_sessions: - mutex_unlock(&client->sessions_lock); - - if (ret < 0) - return ret; - - return 0; -} - -/* - * This callback is called on remap - */ -static void cbuf_vm_open(struct vm_area_struct *vmarea) -{ - struct tbase_cbuf *cbuf = vmarea->vm_private_data; - - tbase_cbuf_get(cbuf); -} - -/* - * This callback is called on unmap - */ -static void cbuf_vm_close(struct vm_area_struct *vmarea) -{ - struct tbase_cbuf *cbuf = vmarea->vm_private_data; - - tbase_cbuf_put(cbuf); -} - -static struct vm_operations_struct cbuf_vm_ops = { - .open = cbuf_vm_open, - .close = cbuf_vm_close, -}; - -/* - * Create a cbuf object and add it to client - */ -int tbase_cbuf_alloc(struct tbase_client *client, uint32_t len, - uintptr_t *p_addr, - struct vm_area_struct *vmarea) -{ - int err = 0; - struct tbase_cbuf *cbuf = NULL; - unsigned int order; - - if (WARN(!client, "No client available")) - return -EINVAL; - - if (WARN(!len, "No len available")) - return -EINVAL; - - order = get_order(len); - if (order > MAX_ORDER) { - MCDRV_DBG_WARN("Buffer size too large"); - return -ENOMEM; - } - - /* Allocate buffer descriptor structure */ - cbuf = kzalloc(sizeof(*cbuf), GFP_KERNEL); - if (!cbuf) { - MCDRV_DBG_WARN("kzalloc failed"); - return -ENOMEM; - } - - /* Allocate buffer */ - cbuf->addr = __get_free_pages(GFP_USER | __GFP_ZERO, order); - if (!cbuf->addr) { - MCDRV_DBG_WARN("get_free_pages failed"); - kfree(cbuf); - return -ENOMEM; - } - - /* Map to user space if applicable */ - if (!client_is_kernel(client)) { - err = map_cbuf(vmarea, cbuf->addr, len, &cbuf->uaddr); - if (err) { - free_pages(cbuf->addr, order); - kfree(cbuf); - return err; - } - } - - /* Init descriptor members */ - cbuf->client = client; - cbuf->phys = virt_to_phys((void *)cbuf->addr); - cbuf->len = len; - cbuf->order = order; - kref_init(&cbuf->kref); - INIT_LIST_HEAD(&cbuf->list); - - /* Keep cbuf in VMA private data for refcounting (user-space clients) */ - if (vmarea) { - vmarea->vm_private_data = cbuf; - vmarea->vm_ops = &cbuf_vm_ops; - } - - /* Fill return parameter for k-api */ - if (p_addr) - *p_addr = cbuf->addr; - - /* Get a token on the client */ - client_get(client); - - /* Add buffer to list */ - mutex_lock(&client->cbufs_lock); - list_add(&cbuf->list, &client->cbufs); - mutex_unlock(&client->cbufs_lock); - MCDRV_DBG("created cbuf %p: client %p addr %lx uaddr %lx len %u", - cbuf, client, cbuf->addr, cbuf->uaddr, cbuf->len); - return err; -} - -/* - * Remove a cbuf object from client, and mark it for freeing. - * Freeing will happen once all current references are released. - */ -int tbase_cbuf_free(struct tbase_client *client, uintptr_t addr) -{ - struct tbase_cbuf *cbuf = tbase_cbuf_get_by_addr(client, addr); - - if (!cbuf) - return -EINVAL; - - /* Two references to put: the caller's and the one we just took */ - tbase_cbuf_put(cbuf); - tbase_cbuf_put(cbuf); - return 0; -} - -/* - * Find a contiguous buffer (cbuf) in the cbuf list of given client that - * contains given address and take a reference on it. - * Return pointer to the object, or NULL if not found. - */ -struct tbase_cbuf *tbase_cbuf_get_by_addr(struct tbase_client *client, - uintptr_t addr) -{ - struct tbase_cbuf *cbuf = NULL, *candidate; - bool is_kernel = client_is_kernel(client); - - mutex_lock(&client->cbufs_lock); - list_for_each_entry(candidate, &client->cbufs, list) { - /* Compare Vs kernel va OR user va depending on client type */ - uintptr_t start = is_kernel ? - candidate->addr : candidate->uaddr; - uintptr_t end = start + candidate->len; - - /* Check that (user) cbuf has not been unmapped */ - if (!start) - break; - - if ((addr >= start) && (addr < end)) { - cbuf = candidate; - break; - } - } - - if (cbuf) - tbase_cbuf_get(cbuf); - - mutex_unlock(&client->cbufs_lock); - return cbuf; -} - -void tbase_cbuf_get(struct tbase_cbuf *cbuf) -{ - kref_get(&cbuf->kref); -} - -static void cbuf_release(struct kref *kref) -{ - struct tbase_cbuf *cbuf = container_of(kref, struct tbase_cbuf, kref); - struct tbase_client *client = cbuf->client; - - /* Unlist from client */ - mutex_lock(&client->cbufs_lock); - list_del_init(&cbuf->list); - mutex_unlock(&client->cbufs_lock); - /* Release client token */ - client_put(client); - /* Free */ - free_pages(cbuf->addr, cbuf->order); - MCDRV_DBG("freed cbuf %p: client %p addr %lx uaddr %lx len %u", - cbuf, client, cbuf->addr, cbuf->uaddr, cbuf->len); - kfree(cbuf); -} - -void tbase_cbuf_put(struct tbase_cbuf *cbuf) -{ - kref_put(&cbuf->kref, cbuf_release); -} - -uintptr_t tbase_cbuf_addr(struct tbase_cbuf *cbuf) -{ - return cbuf->addr; -} - -uintptr_t tbase_cbuf_uaddr(struct tbase_cbuf *cbuf) -{ - return cbuf->uaddr; -} - -uint32_t tbase_cbuf_len(struct tbase_cbuf *cbuf) -{ - return cbuf->len; -} - -static inline int cbuf_info(struct tbase_cbuf *cbuf, struct kasnprintf_buf *buf) -{ - return kasnprintf(buf, "\tcbuf %p: addr %lx uaddr %lx len %u\n", - cbuf, cbuf->addr, cbuf->uaddr, cbuf->len); -} diff --git a/drivers/gud/MobiCoreDriver/client.h b/drivers/gud/MobiCoreDriver/client.h deleted file mode 100644 index 3cc833eeffb87..0000000000000 --- a/drivers/gud/MobiCoreDriver/client.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _CLIENT_H_ -#define _CLIENT_H_ - -#include -#include /* TASK_COMM_LEN */ - -struct task_struct; -struct tbase_object; -struct tbase_session; - -struct tbase_client { - /* PID of task that opened the device, 0 if kernel */ - pid_t pid; - /* Command for task*/ - char comm[TASK_COMM_LEN]; - /* Number of references kept to this object */ - struct kref kref; - /* List of contiguous buffers allocated by mcMallocWsm for the client */ - struct list_head cbufs; - struct mutex cbufs_lock; /* lock for the cbufs list */ - /* List of tbase TA sessions opened by this client */ - struct list_head sessions; - struct mutex sessions_lock; /* sessions list + closing */ - /* Client state */ - bool closing; - /* The list entry to attach to "ctx.clients" list */ - struct list_head list; -}; - -struct tbase_client *client_create(bool is_from_kernel); - -void client_close_sessions(struct tbase_client *client); - -static inline void client_get(struct tbase_client *client) -{ - kref_get(&client->kref); -} - -void client_put(struct tbase_client *client); - -bool client_is_kernel(struct tbase_client *client); - -bool client_set_closing(struct tbase_client *client); - -int client_add_session(struct tbase_client *client, - const struct tbase_object *obj, uintptr_t tci, - size_t len, uint32_t *p_sid, bool is_gp_uuid, - struct mc_identity *identity); - -int client_remove_session(struct tbase_client *client, uint32_t session_id); - -struct tbase_session *client_ref_session(struct tbase_client *client, - uint32_t session_id); - -void client_unref_session(struct tbase_session *session); - -int client_info(struct tbase_client *client, struct kasnprintf_buf *buf); - -/* - * Contiguous buffer allocated to TLCs. - * These buffers are uses as world shared memory (wsm) and shared with - * secure world. - * The virtual kernel address is added for a simpler search algorithm. - */ -struct tbase_cbuf; - -int tbase_cbuf_alloc(struct tbase_client *client, uint32_t len, - uintptr_t *addr, struct vm_area_struct *vmarea); - -int tbase_cbuf_free(struct tbase_client *client, uintptr_t addr); - -struct tbase_cbuf *tbase_cbuf_get_by_addr(struct tbase_client *client, - uintptr_t addr); - -void tbase_cbuf_get(struct tbase_cbuf *cbuf); - -void tbase_cbuf_put(struct tbase_cbuf *cbuf); - -uintptr_t tbase_cbuf_addr(struct tbase_cbuf *cbuf); - -uintptr_t tbase_cbuf_uaddr(struct tbase_cbuf *cbuf); - -uint32_t tbase_cbuf_len(struct tbase_cbuf *cbuf); - -#endif /* _CLIENT_H_ */ diff --git a/drivers/gud/MobiCoreDriver/clientlib.c b/drivers/gud/MobiCoreDriver/clientlib.c deleted file mode 100644 index c7d6d023b3a80..0000000000000 --- a/drivers/gud/MobiCoreDriver/clientlib.c +++ /dev/null @@ -1,433 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" -#include "public/mobicore_driver_api.h" - -#include "main.h" -#include "debug.h" -#include "client.h" -#include "session.h" -#include "api.h" - -enum mc_result convert(int err) -{ - switch (-err) { - case 0: - return MC_DRV_OK; - case ENOMSG: - return MC_DRV_NO_NOTIFICATION; - case EBADMSG: - return MC_DRV_ERR_NOTIFICATION; - case EAGAIN: - return MC_DRV_ERR_OUT_OF_RESOURCES; - case EHOSTDOWN: - return MC_DRV_ERR_INIT; - case ENODEV: - return MC_DRV_ERR_UNKNOWN_DEVICE; - case ENXIO: - return MC_DRV_ERR_UNKNOWN_SESSION; - case EPERM: - return MC_DRV_ERR_INVALID_OPERATION; - case EBADE: - return MC_DRV_ERR_INVALID_RESPONSE; - case ETIME: - return MC_DRV_ERR_TIMEOUT; - case ENOMEM: - return MC_DRV_ERR_NO_FREE_MEMORY; - case EUCLEAN: - return MC_DRV_ERR_FREE_MEMORY_FAILED; - case ENOTEMPTY: - return MC_DRV_ERR_SESSION_PENDING; - case EHOSTUNREACH: - return MC_DRV_ERR_DAEMON_UNREACHABLE; - case ENOENT: - return MC_DRV_ERR_INVALID_DEVICE_FILE; - case EINVAL: - return MC_DRV_ERR_INVALID_PARAMETER; - case EPROTO: - return MC_DRV_ERR_KERNEL_MODULE; - case EADDRINUSE: - return MC_DRV_ERR_BULK_MAPPING; - case EADDRNOTAVAIL: - return MC_DRV_ERR_BULK_UNMAPPING; - case ECOMM: - return MC_DRV_INFO_NOTIFICATION; - case EUNATCH: - return MC_DRV_ERR_NQ_FAILED; - default: - MCDRV_DBG("error is %d", err); - return MC_DRV_ERR_UNKNOWN; - } -} - -static inline bool is_valid_device(uint32_t device_id) -{ - return MC_DEVICE_ID_DEFAULT == device_id; -} - -static struct tbase_client *client; -static int open_count; -static DEFINE_MUTEX(dev_mutex); /* Lock for the device */ - -static bool clientlib_client_get(void) -{ - int ret = true; - - mutex_lock(&dev_mutex); - if (!client) - ret = false; - else - client_get(client); - - mutex_unlock(&dev_mutex); - return ret; -} - -static void clientlib_client_put(void) -{ - mutex_lock(&dev_mutex); - client_put(client); - mutex_unlock(&dev_mutex); -} - -enum mc_result mc_open_device(uint32_t device_id) -{ - enum mc_result mc_result = MC_DRV_OK; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - mutex_lock(&dev_mutex); - if (!open_count) - client = api_open_device(true); - - if (client) { - open_count++; - MCDRV_DBG("Successfully opened the device."); - } else { - mc_result = MC_DRV_ERR_INVALID_DEVICE_FILE; - MCDRV_DBG("Could not open device"); - } - - mutex_unlock(&dev_mutex); - return mc_result; -} -EXPORT_SYMBOL(mc_open_device); - -enum mc_result mc_close_device(uint32_t device_id) -{ - enum mc_result mc_result = MC_DRV_OK; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - mutex_lock(&dev_mutex); - if (!client) { - mc_result = MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - goto end; - } - - if (open_count > 1) { - open_count--; - goto end; - } - - /* Check sessions and freeze client */ - mc_result = convert(api_freeze_device(client)); - if (MC_DRV_OK != mc_result) - goto end; - - /* Close the device */ - api_close_device(client); - client = NULL; - open_count = 0; - -end: - mutex_unlock(&dev_mutex); - return mc_result; -} -EXPORT_SYMBOL(mc_close_device); - -enum mc_result mc_open_session(struct mc_session_handle *session, - const struct mc_uuid_t *uuid, - uint8_t *tci, uint32_t len) -{ - struct mc_identity identity = { - .login_type = TEEC_LOGIN_PUBLIC, - }; - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_open_session(client, &session->session_id, uuid, - (uintptr_t)tci, len, false, &identity)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_open_session); - -enum mc_result mc_open_trustlet(struct mc_session_handle *session, - uint32_t spid, - uint8_t *trustlet, uint32_t trustlet_len, - uint8_t *tci, uint32_t len) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_open_trustlet(client, &session->session_id, spid, - (uintptr_t)trustlet, trustlet_len, - (uintptr_t)tci, len)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_open_trustlet); - -enum mc_result mc_close_session(struct mc_session_handle *session) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_close_session(client, session->session_id)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_close_session); - -enum mc_result mc_notify(struct mc_session_handle *session) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_notify(client, session->session_id)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_notify); - -enum mc_result mc_wait_notification(struct mc_session_handle *session, - int32_t timeout) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_wait_notification(client, session->session_id, - timeout)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_wait_notification); - -enum mc_result mc_malloc_wsm(uint32_t device_id, uint32_t align, uint32_t len, - uint8_t **wsm, uint32_t wsm_flags) -{ - enum mc_result ret; - uintptr_t va; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!len) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!wsm) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_malloc_cbuf(client, len, &va, NULL)); - if (ret == MC_DRV_OK) - *wsm = (uint8_t *)va; - - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_malloc_wsm); - -enum mc_result mc_free_wsm(uint32_t device_id, uint8_t *wsm) -{ - enum mc_result ret; - uintptr_t va = (uintptr_t)wsm; - - /* Check parameters */ - if (!is_valid_device(device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_free_cbuf(client, va)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_free_wsm); - -enum mc_result mc_map(struct mc_session_handle *session, void *address, - uint32_t length, struct mc_bulk_map *map_info) -{ - enum mc_result ret; - struct mc_ioctl_buffer bufs[MC_MAP_MAX]; - uint32_t i; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!map_info) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - bufs[0].va = (uintptr_t)address; - bufs[0].len = length; - for (i = 1; i < MC_MAP_MAX; i++) - bufs[i].va = 0; - - ret = convert(api_map_wsms(client, session->session_id, bufs)); - if (ret == MC_DRV_OK) { - map_info->secure_virt_addr = bufs[0].sva; - map_info->secure_virt_len = bufs[0].len; - } - - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_map); - -enum mc_result mc_unmap(struct mc_session_handle *session, void *address, - struct mc_bulk_map *map_info) -{ - enum mc_result ret; - struct mc_ioctl_buffer bufs[MC_MAP_MAX]; - uint32_t i; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!map_info) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - bufs[0].va = (uintptr_t)address; - bufs[0].len = map_info->secure_virt_len; - bufs[0].sva = map_info->secure_virt_addr; - for (i = 1; i < MC_MAP_MAX; i++) - bufs[i].va = 0; - - ret = convert(api_unmap_wsms(client, session->session_id, bufs)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_unmap); - -enum mc_result mc_get_session_error_code(struct mc_session_handle *session, - int32_t *exit_code) -{ - enum mc_result ret; - - /* Check parameters */ - if (!session) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!is_valid_device(session->device_id)) - return MC_DRV_ERR_UNKNOWN_DEVICE; - - if (!exit_code) - return MC_DRV_ERR_INVALID_PARAMETER; - - if (!clientlib_client_get()) - return MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN; - - /* Call core api */ - ret = convert(api_get_session_exitcode(client, session->session_id, - exit_code)); - clientlib_client_put(); - return ret; -} -EXPORT_SYMBOL(mc_get_session_error_code); diff --git a/drivers/gud/MobiCoreDriver/clock.c b/drivers/gud/MobiCoreDriver/clock.c deleted file mode 100644 index 0195ab794f205..0000000000000 --- a/drivers/gud/MobiCoreDriver/clock.c +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 "platform.h" - -#ifdef MC_CRYPTO_CLOCK_MANAGEMENT - -#include -#include -#include -#include - -#include "debug.h" -#include "clock.h" - -static struct clk_context { - struct clk *mc_ce_iface_clk; - struct clk *mc_ce_core_clk; - struct clk *mc_ce_bus_clk; - struct clk *mc_ce_core_src_clk; -} clk_ctx; - -int mc_clock_init(void) -{ - int ret = 0; -#ifdef MC_CLOCK_CORESRC_DEFAULTRATE - int core_src_rate = MC_CLOCK_CORESRC_DEFAULTRATE; - - /* Get core clk src */ - clk_ctx.mc_ce_core_src_clk = clk_get(g_ctx.mcd, "core_clk_src"); - if (IS_ERR(clk_ctx.mc_ce_core_src_clk)) { - ret = PTR_ERR(clk_ctx.mc_ce_core_src_clk); - MCDRV_ERROR("cannot get core src clock: %d", ret); - goto error; - } - -#ifdef MC_CRYPTO_CLOCK_CORESRC_PROPNAME - if (of_property_read_u32(g_ctx.mcd->of_node, - MC_CRYPTO_CLOCK_CORESRC_PROPNAME, - &core_src_rate)) { - core_src_rate = MC_CLOCK_CORESRC_DEFAULTRATE; - MCDRV_ERROR("cannot get ce clock frequency from DT, use %d", - core_src_rate); - } -#endif /* MC_CRYPTO_CLOCK_CORESRC_PROPNAME */ - - ret = clk_set_rate(clk_ctx.mc_ce_core_src_clk, core_src_rate); - if (ret) { - clk_put(clk_ctx.mc_ce_core_src_clk); - clk_ctx.mc_ce_core_src_clk = NULL; - MCDRV_ERROR("cannot set core clock src rate: %d", ret); - ret = -EIO; - goto error; - } -#endif /* MC_CLOCK_CORESRC_DEFAULTRATE */ - - /* Get core clk */ - clk_ctx.mc_ce_core_clk = clk_get(g_ctx.mcd, "core_clk"); - if (IS_ERR(clk_ctx.mc_ce_core_clk)) { - ret = PTR_ERR(clk_ctx.mc_ce_core_clk); - MCDRV_ERROR("cannot get core clock: %d", ret); - goto error; - } - /* Get Interface clk */ - clk_ctx.mc_ce_iface_clk = clk_get(g_ctx.mcd, "iface_clk"); - if (IS_ERR(clk_ctx.mc_ce_iface_clk)) { - clk_put(clk_ctx.mc_ce_core_clk); - ret = PTR_ERR(clk_ctx.mc_ce_iface_clk); - MCDRV_ERROR("cannot get iface clock: %d", ret); - goto error; - } - /* Get AXI clk */ - clk_ctx.mc_ce_bus_clk = clk_get(g_ctx.mcd, "bus_clk"); - if (IS_ERR(clk_ctx.mc_ce_bus_clk)) { - clk_put(clk_ctx.mc_ce_iface_clk); - clk_put(clk_ctx.mc_ce_core_clk); - ret = PTR_ERR(clk_ctx.mc_ce_bus_clk); - MCDRV_ERROR("cannot get AXI bus clock: %d", ret); - goto error; - } - return ret; - -error: - clk_ctx.mc_ce_core_clk = NULL; - clk_ctx.mc_ce_iface_clk = NULL; - clk_ctx.mc_ce_bus_clk = NULL; - clk_ctx.mc_ce_core_src_clk = NULL; - return ret; -} - -void mc_clock_exit(void) -{ - if (clk_ctx.mc_ce_iface_clk) - clk_put(clk_ctx.mc_ce_iface_clk); - - if (clk_ctx.mc_ce_core_clk) - clk_put(clk_ctx.mc_ce_core_clk); - - if (clk_ctx.mc_ce_bus_clk) - clk_put(clk_ctx.mc_ce_bus_clk); - - if (clk_ctx.mc_ce_core_src_clk) - clk_put(clk_ctx.mc_ce_core_src_clk); -} - -int mc_clock_enable(void) -{ - int rc; - - rc = clk_prepare_enable(clk_ctx.mc_ce_core_clk); - if (rc) { - MCDRV_ERROR("cannot enable core clock"); - goto err_core; - } - - rc = clk_prepare_enable(clk_ctx.mc_ce_iface_clk); - if (rc) { - MCDRV_ERROR("cannot enable interface clock"); - goto err_iface; - } - - rc = clk_prepare_enable(clk_ctx.mc_ce_bus_clk); - if (rc) { - MCDRV_ERROR("cannot enable bus clock"); - goto err_bus; - } - - return 0; - -err_bus: - clk_disable_unprepare(clk_ctx.mc_ce_iface_clk); -err_iface: - clk_disable_unprepare(clk_ctx.mc_ce_core_clk); -err_core: - return rc; -} - -void mc_clock_disable(void) -{ - if (clk_ctx.mc_ce_iface_clk) - clk_disable_unprepare(clk_ctx.mc_ce_iface_clk); - - if (clk_ctx.mc_ce_core_clk) - clk_disable_unprepare(clk_ctx.mc_ce_core_clk); - - if (clk_ctx.mc_ce_bus_clk) - clk_disable_unprepare(clk_ctx.mc_ce_bus_clk); -} - -#endif /* MC_CRYPTO_CLOCK_MANAGEMENT */ diff --git a/drivers/gud/MobiCoreDriver/clock.h b/drivers/gud/MobiCoreDriver/clock.h deleted file mode 100644 index 21095499efb53..0000000000000 --- a/drivers/gud/MobiCoreDriver/clock.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _MC_CLOCK_H_ -#define _MC_CLOCK_H_ - -#include "platform.h" /* MC_CRYPTO_CLOCK_MANAGEMENT */ - -#ifdef MC_CRYPTO_CLOCK_MANAGEMENT - -/* Initialize secure crypto clocks */ -int mc_clock_init(void); -/* Free secure crypto clocks */ -void mc_clock_exit(void); -/* Enable secure crypto clocks */ -int mc_clock_enable(void); -/* Disable secure crypto clocks */ -void mc_clock_disable(void); - -#else /* MC_CRYPTO_CLOCK_MANAGEMENT */ - -static inline int mc_clock_init(void) -{ - return 0; -} - -static inline void mc_clock_exit(void) -{ -} - -static inline int mc_clock_enable(void) -{ - return 0; -} - -static inline void mc_clock_disable(void) -{ -} - -#endif /* !MC_CRYPTO_CLOCK_MANAGEMENT */ - -#endif /* _MC_CLOCK_H_ */ diff --git a/drivers/gud/MobiCoreDriver/debug.h b/drivers/gud/MobiCoreDriver/debug.h deleted file mode 100644 index 9d6a52ab955b6..0000000000000 --- a/drivers/gud/MobiCoreDriver/debug.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _MC_DEBUG_H_ -#define _MC_DEBUG_H_ - -#include "main.h" /* g_ctx */ - -#define MCDRV_ERROR(txt, ...) \ - dev_err(g_ctx.mcd, "%s() ### ERROR: " txt "\n", \ - __func__, \ - ##__VA_ARGS__) - -/* dummy function helper macro. */ -#define DUMMY_FUNCTION() do {} while (0) - -#ifdef DEBUG - -#ifdef DEBUG_VERBOSE -#define MCDRV_DBG_VERBOSE MCDRV_DBG -#else -#define MCDRV_DBG_VERBOSE(...) DUMMY_FUNCTION() -#endif - -#define MCDRV_DBG(txt, ...) \ - dev_info(g_ctx.mcd, "%s(): " txt "\n", \ - __func__, \ - ##__VA_ARGS__) - -#define MCDRV_DBG_WARN(txt, ...) \ - dev_warn(g_ctx.mcd, "%s() WARNING: " txt "\n", \ - __func__, \ - ##__VA_ARGS__) - -#define MCDRV_ASSERT(cond) \ - do { \ - if (unlikely(!(cond))) { \ - panic("Assertion failed: %s:%d\n", \ - __FILE__, __LINE__); \ - } \ - } while (0) - -#else /* DEBUG */ - -#define MCDRV_DBG_VERBOSE(...) DUMMY_FUNCTION() -#define MCDRV_DBG(...) DUMMY_FUNCTION() -#define MCDRV_DBG_WARN(...) DUMMY_FUNCTION() - -#define MCDRV_ASSERT(...) DUMMY_FUNCTION() - -#endif /* !DEBUG */ - -#endif /* _MC_DEBUG_H_ */ diff --git a/drivers/gud/MobiCoreDriver/fastcall.c b/drivers/gud/MobiCoreDriver/fastcall.c deleted file mode 100644 index ee612632331c8..0000000000000 --- a/drivers/gud/MobiCoreDriver/fastcall.c +++ /dev/null @@ -1,512 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_linux_api.h" - -#include "mci/mcifc.h" - -#include "platform.h" /* MC_FASTCALL_WORKER_THREAD and more */ -#include "debug.h" -#include "clock.h" /* mc_clock_enable, mc_clock_disable */ -#include "fastcall.h" - -struct fastcall_work { -#ifdef MC_FASTCALL_WORKER_THREAD - struct kthread_work work; -#else - struct work_struct work; -#endif - void *data; -}; - -/* generic fast call parameters */ -union mc_fc_generic { - struct { - uint32_t cmd; - uint32_t param[3]; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t param[2]; - } as_out; -}; - -/* fast call init */ -union mc_fc_init { - union mc_fc_generic as_generic; - struct { - uint32_t cmd; - uint32_t base; - uint32_t nq_info; - uint32_t mcp_info; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t rfu[2]; - } as_out; -}; - -/* fast call info parameters */ -union mc_fc_info { - union mc_fc_generic as_generic; - struct { - uint32_t cmd; - uint32_t ext_info_id; - uint32_t rfu[2]; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t state; - uint32_t ext_info; - } as_out; -}; - -#ifdef TBASE_CORE_SWITCHER -/* fast call switch Core parameters */ -union mc_fc_swich_core { - union mc_fc_generic as_generic; - struct { - uint32_t cmd; - uint32_t core_id; - uint32_t rfu[2]; - } as_in; - struct { - uint32_t resp; - uint32_t ret; - uint32_t state; - uint32_t ext_info; - } as_out; -}; -#endif - -#ifdef MC_FASTCALL_WORKER_THREAD -static struct task_struct *fastcall_thread; -static DEFINE_KTHREAD_WORKER(fastcall_worker); -#endif - -/* - * _smc() - fast call to MobiCore - * - * @data: pointer to fast call data - */ -static inline int _smc(union mc_fc_generic *mc_fc_generic) -{ - if (!mc_fc_generic) - return -EINVAL; - -#ifdef MC_SMC_FASTCALL - return smc_fastcall(mc_fc_generic, sizeof(*mc_fc_generic)); -#else /* MC_SMC_FASTCALL */ - { -#ifdef CONFIG_ARM64 - /* SMC expect values in x0-x3 */ - register u64 reg0 __asm__("x0") = mc_fc_generic->as_in.cmd; - register u64 reg1 __asm__("x1") = mc_fc_generic->as_in.param[0]; - register u64 reg2 __asm__("x2") = mc_fc_generic->as_in.param[1]; - register u64 reg3 __asm__("x3") = mc_fc_generic->as_in.param[2]; - - /* - * According to AARCH64 SMC Calling Convention (ARM DEN 0028A), - * section 3.1: registers x4-x17 are unpredictable/scratch - * registers. So we have to make sure that the compiler does - * not allocate any of those registers by letting him know that - * the asm code might clobber them. - */ - __asm__ volatile ( - "smc #0\n" - : "+r"(reg0), "+r"(reg1), "+r"(reg2), "+r"(reg3) - : - : "x4", "x5", "x6", "x7", "x8", "x9", "x10", "x11", - "x12", "x13", "x14", "x15", "x16", "x17" - ); -#else /* CONFIG_ARM64 */ - /* SMC expect values in r0-r3 */ - register u32 reg0 __asm__("r0") = mc_fc_generic->as_in.cmd; - register u32 reg1 __asm__("r1") = mc_fc_generic->as_in.param[0]; - register u32 reg2 __asm__("r2") = mc_fc_generic->as_in.param[1]; - register u32 reg3 __asm__("r3") = mc_fc_generic->as_in.param[2]; - - __asm__ volatile ( -#ifdef MC_ARCH_EXTENSION_SEC - /* This pseudo op is supported and required from - * binutils 2.21 on */ - ".arch_extension sec\n" -#endif /* MC_ARCH_EXTENSION_SEC */ - "smc #0\n" - : "+r"(reg0), "+r"(reg1), "+r"(reg2), "+r"(reg3) - ); - -#ifdef __ARM_VE_A9X4_QEMU__ - /* Qemu does not return to the address following the SMC - * instruction so we have to insert several nop instructions to - * workaround this Qemu bug. */ - __asm__ volatile ( - "nop\n" - "nop\n" - "nop\n" - "nop" - ); -#endif /* __ARM_VE_A9X4_QEMU__ */ -#endif /* !CONFIG_ARM64 */ - - /* set response */ - mc_fc_generic->as_out.resp = reg0; - mc_fc_generic->as_out.ret = reg1; - mc_fc_generic->as_out.param[0] = reg2; - mc_fc_generic->as_out.param[1] = reg3; - } - return 0; -#endif /* !MC_SMC_FASTCALL */ -} - -#ifdef TBASE_CORE_SWITCHER -static uint32_t active_cpu; - -#ifdef MC_FASTCALL_WORKER_THREAD -static void mc_cpu_offline(int cpu) -{ - int i; - - if (active_cpu != cpu) { - MCDRV_DBG("not active CPU, no action taken\n"); - return; - } - - /* Chose the first online CPU and switch! */ - for_each_online_cpu(i) { - if (cpu != i) { - MCDRV_DBG("CPU %d is dying, switching to %d\n", cpu, i); - mc_switch_core(i); - break; - } - - MCDRV_DBG("Skipping CPU %d\n", cpu); - } -} - -static int mobicore_cpu_callback(struct notifier_block *nfb, - unsigned long action, void *hcpu) -{ - unsigned int cpu = (unsigned long)hcpu; - - switch (action) { - case CPU_DOWN_PREPARE: - case CPU_DOWN_PREPARE_FROZEN: - dev_info(g_ctx.mcd, "Cpu %u is going to die\n", cpu); - mc_cpu_offline(cpu); - break; - case CPU_DEAD: - case CPU_DEAD_FROZEN: - dev_info(g_ctx.mcd, "Cpu %u is dead\n", cpu); - break; - } - return NOTIFY_OK; -} - -static struct notifier_block mobicore_cpu_notifer = { - .notifier_call = mobicore_cpu_callback, -}; -#endif /* MC_FASTCALL_WORKER_THREAD */ - -static cpumask_t mc_exec_core_switch(union mc_fc_generic *mc_fc_generic) -{ - cpumask_t cpu; - uint32_t new_cpu; - uint32_t cpu_id[] = CPU_IDS; - - new_cpu = mc_fc_generic->as_in.param[0]; - mc_fc_generic->as_in.param[0] = cpu_id[mc_fc_generic->as_in.param[0]]; - - if (_smc(mc_fc_generic) != 0 || mc_fc_generic->as_out.ret != 0) { - MCDRV_DBG("CoreSwap failed %d -> %d (cpu %d still active)\n", - raw_smp_processor_id(), - mc_fc_generic->as_in.param[0], - raw_smp_processor_id()); - } else { - active_cpu = new_cpu; - MCDRV_DBG("CoreSwap ok %d -> %d\n", - raw_smp_processor_id(), active_cpu); - } - cpumask_clear(&cpu); - cpumask_set_cpu(active_cpu, &cpu); - return cpu; -} -#else /* TBASE_CORE_SWITCHER */ -static inline cpumask_t mc_exec_core_switch(union mc_fc_generic *mc_fc_generic) -{ - return CPU_MASK_CPU0; -} -#endif /* !TBASE_CORE_SWITCHER */ - -#ifdef MC_FASTCALL_WORKER_THREAD -static void fastcall_work_func(struct kthread_work *work) -#else -static void fastcall_work_func(struct work_struct *work) -#endif -{ - struct fastcall_work *fc_work = - container_of(work, struct fastcall_work, work); - union mc_fc_generic *mc_fc_generic = fc_work->data; - - if (!mc_fc_generic) - return; - - mc_clock_enable(); - - if (mc_fc_generic->as_in.cmd == MC_FC_SWAP_CPU) { -#ifdef MC_FASTCALL_WORKER_THREAD - cpumask_t new_msk = mc_exec_core_switch(mc_fc_generic); - - set_cpus_allowed(fastcall_thread, new_msk); -#else - mc_exec_core_switch(mc_fc_generic); -#endif - } else { - _smc(mc_fc_generic); - } - - mc_clock_disable(); -} - -static bool mc_fastcall(void *data) -{ -#ifdef MC_FASTCALL_WORKER_THREAD - struct fastcall_work fc_work = { - KTHREAD_WORK_INIT(fc_work.work, fastcall_work_func), - .data = data, - }; - - if (!queue_kthread_work(&fastcall_worker, &fc_work.work)) - return false; - - /* If work is queued or executing, wait for it to finish execution */ - flush_kthread_work(&fc_work.work); -#else - struct fastcall_work fc_work = { - .data = data, - }; - - INIT_WORK_ONSTACK(&fc_work.work, fastcall_work_func); - - if (!schedule_work_on(0, &fc_work.work)) - return false; - - flush_work(&fc_work.work); -#endif - return true; -} - -int mc_fastcall_init(void) -{ - int ret = mc_clock_init(); - - if (ret) - return ret; - -#ifdef MC_FASTCALL_WORKER_THREAD - fastcall_thread = kthread_create(kthread_worker_fn, &fastcall_worker, - "mc_fastcall"); - if (IS_ERR(fastcall_thread)) { - ret = PTR_ERR(fastcall_thread); - fastcall_thread = NULL; - MCDRV_ERROR("cannot create fastcall wq (%d)", ret); - return ret; - } - - /* this thread MUST run on CPU 0 at startup */ - set_cpus_allowed(fastcall_thread, CPU_MASK_CPU0); - - wake_up_process(fastcall_thread); -#ifdef TBASE_CORE_SWITCHER - ret = register_cpu_notifier(&mobicore_cpu_notifer); -#endif -#endif /* MC_FASTCALL_WORKER_THREAD */ - return ret; -} - -void mc_fastcall_exit(void) -{ -#ifdef MC_FASTCALL_WORKER_THREAD - if (!IS_ERR_OR_NULL(fastcall_thread)) { -#ifdef TBASE_CORE_SWITCHER - unregister_cpu_notifier(&mobicore_cpu_notifer); -#endif - kthread_stop(fastcall_thread); - fastcall_thread = NULL; - } -#endif /* MC_FASTCALL_WORKER_THREAD */ - mc_clock_exit(); -} - -/* - * convert fast call return code to linux driver module error code - */ -static int convert_fc_ret(uint32_t ret) -{ - switch (ret) { - case MC_FC_RET_OK: - return 0; - case MC_FC_RET_ERR_INVALID: - return -EINVAL; - case MC_FC_RET_ERR_ALREADY_INITIALIZED: - return -EBUSY; - default: - return -EFAULT; - } -} - -int mc_fc_init(uintptr_t base_pa, ptrdiff_t off, size_t q_len, size_t buf_len) -{ -#ifdef CONFIG_ARM64 - uint32_t base_high = (uint32_t)(base_pa >> 32); -#else - uint32_t base_high = 0; -#endif - union mc_fc_init fc_init; - - /* Call the INIT fastcall to setup MobiCore initialization */ - memset(&fc_init, 0, sizeof(fc_init)); - fc_init.as_in.cmd = MC_FC_INIT; - /* base address of mci buffer PAGE_SIZE (default is 4KB) aligned */ - fc_init.as_in.base = (uint32_t)base_pa; - /* notification buffer start/length [16:16] [start, length] */ - fc_init.as_in.nq_info = - ((base_high & 0xFFFF) << 16) | (q_len & 0xFFFF); - /* mcp buffer start/length [16:16] [start, length] */ - fc_init.as_in.mcp_info = (off << 16) | (buf_len & 0xFFFF); - MCDRV_DBG("cmd=0x%08x, base=0x%08x,nq_info=0x%08x, mcp_info=0x%08x", - fc_init.as_in.cmd, fc_init.as_in.base, fc_init.as_in.nq_info, - fc_init.as_in.mcp_info); - mc_fastcall(&fc_init.as_generic); - MCDRV_DBG("out cmd=0x%08x, ret=0x%08x", fc_init.as_out.resp, - fc_init.as_out.ret); - return convert_fc_ret(fc_init.as_out.ret); -} - -int mc_fc_info(uint32_t ext_info_id, uint32_t *state, uint32_t *ext_info) -{ - union mc_fc_info fc_info; - int ret = 0; - - memset(&fc_info, 0, sizeof(fc_info)); - fc_info.as_in.cmd = MC_FC_INFO; - fc_info.as_in.ext_info_id = ext_info_id; - mc_fastcall(&fc_info.as_generic); - ret = convert_fc_ret(fc_info.as_out.ret); - if (ret) { - if (state) - *state = MC_STATUS_NOT_INITIALIZED; - - if (ext_info) - *ext_info = 0; - - MCDRV_ERROR("code %d for idx %d", ret, ext_info_id); - } else { - if (state) - *state = fc_info.as_out.state; - - if (ext_info) - *ext_info = fc_info.as_out.ext_info; - } - - return ret; -} - -int mc_fc_mem_trace(phys_addr_t buffer, uint32_t size) -{ - union mc_fc_generic mc_fc_generic; - - memset(&mc_fc_generic, 0, sizeof(mc_fc_generic)); - mc_fc_generic.as_in.cmd = MC_FC_MEM_TRACE; - mc_fc_generic.as_in.param[0] = (uint32_t)buffer; -#ifdef CONFIG_ARM64 - mc_fc_generic.as_in.param[1] = (uint32_t)(buffer >> 32); -#endif - mc_fc_generic.as_in.param[2] = size; - mc_fastcall(&mc_fc_generic); - return convert_fc_ret(mc_fc_generic.as_out.ret); -} - -int mc_fc_nsiq(void) -{ - union mc_fc_generic fc; - int ret; - - memset(&fc, 0, sizeof(fc)); - fc.as_in.cmd = MC_SMC_N_SIQ; - mc_fastcall(&fc); - ret = convert_fc_ret(fc.as_out.ret); - if (ret) - MCDRV_ERROR("failed: %d", ret); - - return ret; -} - -int mc_fc_yield(void) -{ - union mc_fc_generic fc; - int ret; - - memset(&fc, 0, sizeof(fc)); - fc.as_in.cmd = MC_SMC_N_YIELD; - mc_fastcall(&fc); - ret = convert_fc_ret(fc.as_out.ret); - if (ret) - MCDRV_ERROR("failed: %d", ret); - - return ret; -} - -#ifdef TBASE_CORE_SWITCHER -uint32_t mc_active_core(void) -{ - return active_cpu; -} - -int mc_switch_core(uint32_t core_num) -{ - int32_t ret = 0; - union mc_fc_swich_core fc_switch_core; - - if (!cpu_online(core_num)) - return 1; - - MCDRV_DBG_VERBOSE("enter\n"); - memset(&fc_switch_core, 0, sizeof(fc_switch_core)); - fc_switch_core.as_in.cmd = MC_FC_SWAP_CPU; - if (core_num < COUNT_OF_CPUS) - fc_switch_core.as_in.core_id = core_num; - else - fc_switch_core.as_in.core_id = 0; - - MCDRV_DBG("<- cmd=0x%08x, core_id=0x%08x\n", - fc_switch_core.as_in.cmd, fc_switch_core.as_in.core_id); - MCDRV_DBG("<- core_num=0x%08x, active_cpu=0x%08x\n", - core_num, active_cpu); - mc_fastcall(&fc_switch_core.as_generic); - ret = convert_fc_ret(fc_switch_core.as_out.ret); - MCDRV_DBG_VERBOSE("exit with %d/0x%08X\n", ret, ret); - return ret; -} -#endif diff --git a/drivers/gud/MobiCoreDriver/fastcall.h b/drivers/gud/MobiCoreDriver/fastcall.h deleted file mode 100644 index b19b27687ff38..0000000000000 --- a/drivers/gud/MobiCoreDriver/fastcall.h +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _TBASE_FASTCALL_H_ -#define _TBASE_FASTCALL_H_ - -/* Use the arch_extension sec pseudo op before switching to secure world */ -#if defined(__GNUC__) && \ - defined(__GNUC_MINOR__) && \ - defined(__GNUC_PATCHLEVEL__) && \ - ((__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)) \ - >= 40502 -#ifndef CONFIG_ARM64 -#define MC_ARCH_EXTENSION_SEC -#endif -#endif - -int mc_fc_init(uintptr_t base_pa, ptrdiff_t off, size_t q_len, size_t buf_len); -int mc_fc_info(uint32_t ext_info_id, uint32_t *state, uint32_t *ext_info); -int mc_fc_mem_trace(phys_addr_t buffer, uint32_t size); -int mc_fc_nsiq(void); -int mc_fc_yield(void); - -int mc_fastcall_init(void); -void mc_fastcall_exit(void); - -#endif /* _TBASE_FASTCALL_H_ */ diff --git a/drivers/gud/MobiCoreDriver/logging.c b/drivers/gud/MobiCoreDriver/logging.c deleted file mode 100644 index 953de5f149f78..0000000000000 --- a/drivers/gud/MobiCoreDriver/logging.c +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 -#include -#include - -#include "fastcall.h" -#include "main.h" -#include "logging.h" - -#ifndef CONFIG_TRUSTONIC_TEE_NO_TRACES - -/* Supported log buffer version */ -#define MC_LOG_VERSION 2 - -/* Default length of the log ring buffer 256KiB */ -#define LOG_BUF_ORDER 6 - -/* Max Len of a log line for printing */ -#define LOG_LINE_SIZE 256 - -/* Definitions for log version 2 */ -#define LOG_TYPE_MASK (0x0007) -#define LOG_TYPE_CHAR 0 -#define LOG_TYPE_INTEGER 1 - -/* Field length */ -#define LOG_LENGTH_MASK (0x00F8) -#define LOG_LENGTH_SHIFT 3 - -/* Extra attributes */ -#define LOG_EOL (0x0100) -#define LOG_INTEGER_DECIMAL (0x0200) -#define LOG_INTEGER_SIGNED (0x0400) - -struct mc_logmsg { - uint16_t ctrl; /* Type and format of data */ - uint16_t source; /* Unique value for each event source */ - uint32_t log_data; /* Value, if any */ -}; - -/* MobiCore internal trace buffer structure. */ -struct mc_trace_buf { - uint32_t version; /* version of trace buffer */ - uint32_t length; /* length of buff */ - uint32_t head; /* last write position */ - uint8_t buff[]; /* start of the log buffer */ -}; - -static struct logging_ctx { - struct work_struct work; - union { - struct mc_trace_buf *trace_buf; /* Circular log buffer */ - unsigned long trace_page; - }; - bool buffer_is_shared; /* Log buffer cannot be freed */ - uint32_t tail; /* MobiCore log read position */ - uint32_t line_len; /* Log Line buffer current length */ - int thread_err; - uint16_t prev_source; /* Previous Log source */ - char line[LOG_LINE_SIZE]; /* Log Line buffer */ - bool dead; -} log_ctx; - -static inline void log_eol(uint16_t source) -{ - if (!strnlen(log_ctx.line, LOG_LINE_SIZE)) { - /* In case a TA tries to print a 0x0 */ - log_ctx.line_len = 0; - return; - } - - if (log_ctx.prev_source) - /* MobiCore Userspace */ - dev_info(g_ctx.mcd, "%03x|%s\n", log_ctx.prev_source, - log_ctx.line); - else - /* MobiCore kernel */ - dev_info(g_ctx.mcd, "%s\n", log_ctx.line); - - log_ctx.line_len = 0; - log_ctx.line[0] = 0; -} - -/* - * Collect chars in log_ctx.line buffer and output the buffer when it is full. - * No locking needed because only "mobicore_log" thread updates this buffer. - */ -static inline void log_char(char ch, uint16_t source) -{ - if (ch == '\n' || ch == '\r') { - log_eol(source); - return; - } - - if ((log_ctx.line_len >= (LOG_LINE_SIZE - 1)) || - (source != log_ctx.prev_source)) - log_eol(source); - - log_ctx.line[log_ctx.line_len++] = ch; - log_ctx.line[log_ctx.line_len] = 0; - log_ctx.prev_source = source; -} - -static inline void log_string(uint32_t ch, uint16_t source) -{ - while (ch) { - log_char(ch & 0xFF, source); - ch >>= 8; - } -} - -static inline void log_number(uint32_t format, uint32_t value, uint16_t source) -{ - int width = (format & LOG_LENGTH_MASK) >> LOG_LENGTH_SHIFT; - char fmt[16]; - char buffer[32]; - const char *reader = buffer; - - if (format & LOG_INTEGER_DECIMAL) - if (format & LOG_INTEGER_SIGNED) - snprintf(fmt, sizeof(fmt), "%%%ud", width); - else - snprintf(fmt, sizeof(fmt), "%%%uu", width); - else - snprintf(fmt, sizeof(fmt), "%%0%ux", width); - - snprintf(buffer, sizeof(buffer), fmt, value); - while (*reader) - log_char(*reader++, source); -} - -static inline int log_msg(void *data) -{ - struct mc_logmsg *msg = (struct mc_logmsg *)data; - int log_type = msg->ctrl & LOG_TYPE_MASK; - - switch (log_type) { - case LOG_TYPE_CHAR: - log_string(msg->log_data, msg->source); - break; - case LOG_TYPE_INTEGER: - log_number(msg->ctrl, msg->log_data, msg->source); - break; - } - if (msg->ctrl & LOG_EOL) - log_eol(msg->source); - - return sizeof(*msg); -} - -static void log_worker(struct work_struct *work) -{ - while (log_ctx.trace_buf->head != log_ctx.tail) { - if (log_ctx.trace_buf->version != MC_LOG_VERSION) { - dev_err(g_ctx.mcd, - "Bad log data v%d (exp. v%d), stop.\n", - log_ctx.trace_buf->version, - MC_LOG_VERSION); - log_ctx.dead = true; - break; - } - - log_ctx.tail += log_msg(&log_ctx.trace_buf->buff[log_ctx.tail]); - /* Wrap over if no space left for a complete message */ - if ((log_ctx.tail + sizeof(struct mc_logmsg)) > - log_ctx.trace_buf->length) - log_ctx.tail = 0; - } -} - -/* - * Wake up the log reader thread - * This should be called from the places where calls into MobiCore have - * generated some logs(eg, yield, SIQ...) - */ -void mc_logging_run(void) -{ - if (!log_ctx.dead && (log_ctx.trace_buf->head != log_ctx.tail)) - schedule_work(&log_ctx.work); -} - -int mc_logging_start(void) -{ - int ret = mc_fc_mem_trace(virt_to_phys((void *)(log_ctx.trace_page)), - BIT(LOG_BUF_ORDER) * PAGE_SIZE); - - if (ret) { - dev_err(g_ctx.mcd, "shared traces setup failed\n"); - return ret; - } - - log_ctx.buffer_is_shared = true; - dev_dbg(g_ctx.mcd, "fc_log version %u\n", log_ctx.trace_buf->version); - mc_logging_run(); - return 0; -} - -void mc_logging_stop(void) -{ - if (!mc_fc_mem_trace(0, 0)) - log_ctx.buffer_is_shared = false; - - mc_logging_run(); - flush_work(&log_ctx.work); -} - -/* - * Setup MobiCore kernel log. It assumes it's running on CORE 0! - * The fastcall will complain is that is not the case! - */ -int mc_logging_init(void) -{ - /* - * We are going to map this buffer into virtual address space in SWd. - * To reduce complexity there, we use a contiguous buffer. - */ - log_ctx.trace_page = __get_free_pages(GFP_KERNEL | __GFP_ZERO, - LOG_BUF_ORDER); - if (!log_ctx.trace_page) - return -ENOMEM; - - INIT_WORK(&log_ctx.work, log_worker); - return 0; -} - -void mc_logging_exit(void) -{ - /* - * This is not racey as the only caller for mc_logging_run is the - * scheduler which gets stopped before us, and long before we exit. - */ - if (!log_ctx.buffer_is_shared) - free_pages(log_ctx.trace_page, LOG_BUF_ORDER); - else - dev_err(g_ctx.mcd, "log buffer unregister not supported\n"); -} - -#endif /* !CONFIG_TRUSTONIC_TEE_NO_TRACES */ diff --git a/drivers/gud/MobiCoreDriver/logging.h b/drivers/gud/MobiCoreDriver/logging.h deleted file mode 100644 index 744b41880ea31..0000000000000 --- a/drivers/gud/MobiCoreDriver/logging.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _MC_LOGGING_H_ -#define _MC_LOGGING_H_ - -#include "platform.h" /* CONFIG_TRUSTONIC_TEE_NO_TRACES */ - -/* MobiCore internal trace log setup. */ -#ifndef CONFIG_TRUSTONIC_TEE_NO_TRACES -void mc_logging_run(void); -int mc_logging_init(void); -void mc_logging_exit(void); -int mc_logging_start(void); -void mc_logging_stop(void); -#else /* !CONFIG_TRUSTONIC_TEE_NO_TRACES */ -static inline void mc_logging_run(void) -{ -} - -static inline long mc_logging_init(void) -{ - return 0; -} - -static inline void mc_logging_exit(void) -{ -} - -static inline int mc_logging_start(void) -{ - return 0; -} - -static inline void mc_logging_stop(void) -{ -} - -#endif /* CONFIG_TRUSTONIC_TEE_NO_TRACES */ - -#endif /* _MC_LOGGING_H_ */ diff --git a/drivers/gud/MobiCoreDriver/main.c b/drivers/gud/MobiCoreDriver/main.c deleted file mode 100644 index 66b232e5bc8b5..0000000000000 --- a/drivers/gud/MobiCoreDriver/main.c +++ /dev/null @@ -1,750 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "main.h" -#include "fastcall.h" -#include "arm.h" -#include "mmu.h" -#include "scheduler.h" -#include "pm.h" -#include "debug.h" -#include "logging.h" -#include "admin.h" -#include "mcp.h" -#include "session.h" -#include "client.h" -#include "api.h" - -#include "build_tag.h" - -/* Define a MobiCore device structure for use with dev_debug() etc */ -static struct device_driver driver = { - .name = "Trustonic" -}; - -static struct device device = { - .driver = &driver -}; - -struct mc_device_ctx g_ctx = { - .mcd = &device -}; - -/* device admin */ -static dev_t mc_dev_admin; -/* device user */ -static dev_t mc_dev_user; - -/* Need to discover a chrdev region for the driver */ -static struct cdev mc_user_cdev; -/* Device class for the driver assigned major */ -static struct class *mc_device_class; - -/* - * Get client object from file pointer - */ -static inline struct tbase_client *get_client(struct file *file) -{ - return (struct tbase_client *)file->private_data; -} - -/* - * Callback for system mmap() - */ -static int mc_fd_user_mmap(struct file *file, struct vm_area_struct *vmarea) -{ - struct tbase_client *client = get_client(file); - uint32_t len = (uint32_t)(vmarea->vm_end - vmarea->vm_start); - - /* Alloc contiguous buffer for this client */ - return api_malloc_cbuf(client, len, NULL, vmarea); -} - -/* - * Check r/w access to referenced memory - */ -static inline int ioctl_check_pointer(unsigned int cmd, int __user *uarg) -{ - int err = 0; - - if (_IOC_DIR(cmd) & _IOC_READ) - err = !access_ok(VERIFY_WRITE, uarg, _IOC_SIZE(cmd)); - else if (_IOC_DIR(cmd) & _IOC_WRITE) - err = !access_ok(VERIFY_READ, uarg, _IOC_SIZE(cmd)); - - if (err) - return -EFAULT; - - return 0; -} - -/* - * Callback for system ioctl() - * Implement most of ClientLib API functions - * @file pointer to file - * @cmd command - * @arg arguments - * - * Returns 0 for OK and an errno in case of error - */ -static long mc_fd_user_ioctl(struct file *file, unsigned int id, - unsigned long arg) -{ - struct tbase_client *client = get_client(file); - int __user *uarg = (int __user *)arg; - int ret = -EINVAL; - - MCDRV_DBG("%u from %s", _IOC_NR(id), current->comm); - - if (WARN(!client, "No client data available")) - return -EPROTO; - - if (ioctl_check_pointer(id, uarg)) - return -EFAULT; - - switch (id) { - case MC_IO_FREEZE: - /* Freeze the client */ - ret = api_freeze_device(client); - break; - - case MC_IO_OPEN_SESSION: { - struct mc_ioctl_open_sess sess; - - if (copy_from_user(&sess, uarg, sizeof(sess))) { - ret = -EFAULT; - break; - } - - ret = api_open_session(client, &sess.sid, &sess.uuid, sess.tci, - sess.tcilen, sess.is_gp_uuid, - &sess.identity); - if (ret) - break; - - if (copy_to_user(uarg, &sess, sizeof(sess))) { - ret = -EFAULT; - api_close_session(client, sess.sid); - break; - } - break; - } - case MC_IO_OPEN_TRUSTLET: { - struct mc_ioctl_open_trustlet ta_desc; - - if (copy_from_user(&ta_desc, uarg, sizeof(ta_desc))) { - ret = -EFAULT; - break; - } - - /* Call internal api */ - ret = api_open_trustlet(client, &ta_desc.sid, ta_desc.spid, - ta_desc.buffer, ta_desc.tlen, - ta_desc.tci, ta_desc.tcilen); - if (ret) - break; - - if (copy_to_user(uarg, &ta_desc, sizeof(ta_desc))) { - ret = -EFAULT; - api_close_session(client, ta_desc.sid); - break; - } - break; - } - case MC_IO_CLOSE_SESSION: { - uint32_t sid = (uint32_t)arg; - - ret = api_close_session(client, sid); - break; - } - case MC_IO_NOTIFY: { - uint32_t sid = (uint32_t)arg; - - ret = api_notify(client, sid); - break; - } - case MC_IO_WAIT: { - struct mc_ioctl_wait wait; - - if (copy_from_user(&wait, uarg, sizeof(wait))) { - ret = -EFAULT; - break; - } - ret = api_wait_notification(client, wait.sid, wait.timeout); - break; - } - case MC_IO_MAP: { - struct mc_ioctl_map map; - - if (copy_from_user(&map, uarg, sizeof(map))) { - ret = -EFAULT; - break; - } - ret = api_map_wsms(client, map.sid, map.bufs); - if (ret) - break; - - /* Fill in return struct */ - if (copy_to_user(uarg, &map, sizeof(map))) { - ret = -EFAULT; - api_unmap_wsms(client, map.sid, map.bufs); - break; - } - break; - } - case MC_IO_UNMAP: { - struct mc_ioctl_map map; - - if (copy_from_user(&map, uarg, sizeof(map))) { - ret = -EFAULT; - break; - } - - ret = api_unmap_wsms(client, map.sid, map.bufs); - break; - } - case MC_IO_ERR: { - struct mc_ioctl_geterr *uerr = (struct mc_ioctl_geterr *)uarg; - uint32_t sid; - int32_t exit_code; - - if (get_user(sid, &uerr->sid)) { - ret = -EFAULT; - break; - } - - ret = api_get_session_exitcode(client, sid, &exit_code); - if (ret) - break; - - /* Fill in return struct */ - if (put_user(exit_code, &uerr->value)) { - ret = -EFAULT; - break; - } - - break; - } - case MC_IO_VERSION: { - struct mc_version_info version_info; - - ret = mcp_get_version(&version_info); - if (ret) - break; - - if (copy_to_user(uarg, &version_info, sizeof(version_info))) - ret = -EFAULT; - - break; - } - case MC_IO_DR_VERSION: { - uint32_t version = MC_VERSION(MCDRVMODULEAPI_VERSION_MAJOR, - MCDRVMODULEAPI_VERSION_MINOR); - - ret = put_user(version, uarg); - break; - } - default: - MCDRV_ERROR("unsupported cmd=0x%x", id); - ret = -ENOIOCTLCMD; - } - - return ret; -} - -/* - * Callback for system open() - * A set of internal client data are created and initialized. - * - * @inode - * @file - * Returns 0 if OK or -ENOMEM if no allocation was possible. - */ -static int mc_fd_user_open(struct inode *inode, struct file *file) -{ - struct tbase_client *client; - - MCDRV_DBG("from %s", current->comm); - - /* Create client */ - client = api_open_device(false); - if (!client) - return -ENOMEM; - - /* Store client in user file */ - file->private_data = client; - return 0; -} - -/* - * Callback for system close() - * The client object is freed. - * @inode - * @file - * Returns 0 - */ -static int mc_fd_user_release(struct inode *inode, struct file *file) -{ - struct tbase_client *client = get_client(file); - - MCDRV_DBG("from %s", current->comm); - - if (WARN(!client, "No client data available")) - return -EPROTO; - - /* Detach client from user file */ - file->private_data = NULL; - - /* Destroy client, including remaining sessions */ - api_close_device(client); - return 0; -} - -static const struct file_operations mc_user_fops = { - .owner = THIS_MODULE, - .open = mc_fd_user_open, - .release = mc_fd_user_release, - .unlocked_ioctl = mc_fd_user_ioctl, -#ifdef CONFIG_COMPAT - .compat_ioctl = mc_fd_user_ioctl, -#endif - .mmap = mc_fd_user_mmap, -}; - -int kasnprintf(struct kasnprintf_buf *buf, const char *fmt, ...) -{ - va_list args; - int max_size = buf->size - buf->off; - int i; - - va_start(args, fmt); - i = vsnprintf(buf->buf + buf->off, max_size, fmt, args); - if (i >= max_size) { - int new_size = PAGE_ALIGN(buf->size + i + 1); - char *new_buf = krealloc(buf->buf, new_size, buf->gfp); - - if (!new_buf) { - i = -ENOMEM; - } else { - buf->buf = new_buf; - buf->size = new_size; - max_size = buf->size - buf->off; - i = vsnprintf(buf->buf + buf->off, max_size, fmt, args); - } - } - - if (i > 0) - buf->off += i; - - va_end(args); - return i; -} - -static ssize_t debug_info_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - /* Add/update buffer */ - if (!file->private_data || !*ppos) { - struct kasnprintf_buf *buf, *old_buf; - int ret; - - buf = kzalloc(GFP_KERNEL, sizeof(*buf)); - if (!buf) - return -ENOMEM; - - buf->gfp = GFP_KERNEL; - ret = api_info(buf); - if (ret < 0) { - kfree(buf); - return ret; - } - - old_buf = file->private_data; - file->private_data = buf; - kfree(old_buf); - } - - if (file->private_data) { - struct kasnprintf_buf *buf = file->private_data; - - return simple_read_from_buffer(user_buf, count, ppos, buf->buf, - buf->off); - } - - return 0; -} - -static int debug_info_release(struct inode *inode, struct file *file) -{ - kfree(file->private_data); - return 0; -} - -static const struct file_operations mc_debug_info_ops = { - .read = debug_info_read, - .llseek = default_llseek, - .release = debug_info_release, -}; - -static inline int device_admin_init(int (*tee_start_cb)(void)) -{ - int ret = 0; - - cdev_init(&mc_user_cdev, &mc_user_fops); - - mc_device_class = class_create(THIS_MODULE, "trustonic_tee"); - if (IS_ERR(mc_device_class)) { - MCDRV_ERROR("failed to create device class"); - return PTR_ERR(mc_device_class); - } - - /* Create the ADMIN node */ - ret = mc_admin_init(mc_device_class, &mc_dev_admin, tee_start_cb); - if (ret < 0) { - MCDRV_ERROR("failed to init mobicore device"); - class_destroy(mc_device_class); - return ret; - } - return 0; -} - -static inline int device_user_init(void) -{ - int ret = 0; - struct device *dev; - - mc_dev_user = MKDEV(MAJOR(mc_dev_admin), 1); - /* Create the user node */ - ret = cdev_add(&mc_user_cdev, mc_dev_user, 1); - if (ret) { - MCDRV_ERROR("user device register failed"); - goto err_cdev_add; - } - mc_user_cdev.owner = THIS_MODULE; - dev = device_create(mc_device_class, NULL, mc_dev_user, NULL, - MC_USER_DEVNODE); - if (IS_ERR(dev)) { - ret = PTR_ERR(dev); - goto err_device_create; - } - - /* Create debugfs info entry */ - debugfs_create_file("info", 0400, g_ctx.debug_dir, NULL, - &mc_debug_info_ops); - - return 0; - -err_device_create: - cdev_del(&mc_user_cdev); -err_cdev_add: - mc_admin_exit(mc_device_class); - class_destroy(mc_device_class); - MCDRV_DBG("failed with %d", ret); - return ret; -} - -static void devices_exit(void) -{ - device_destroy(mc_device_class, mc_dev_user); - cdev_del(&mc_user_cdev); - mc_admin_exit(mc_device_class); - class_destroy(mc_device_class); -} - -static inline int mobicore_start(void) -{ - int ret; - struct mc_version_info version_info; - - ret = mcp_start(); - if (ret) { - MCDRV_ERROR("TEE start failed"); - goto err_mcp; - } - - ret = mc_logging_start(); - if (ret) { - MCDRV_ERROR("Log start failed"); - goto err_log; - } - - ret = mc_scheduler_start(); - if (ret) { - MCDRV_ERROR("Scheduler start failed"); - goto err_sched; - } - - ret = mc_pm_start(); - if (ret) { - MCDRV_ERROR("Power Management start failed"); - goto err_pm; - } - - ret = mcp_get_version(&version_info); - if (ret) - goto err_mcp_cmd; - - MCDRV_DBG("\n" - " product_id = %s\n" - " version_so = 0x%x\n" - " version_mci = 0x%x\n" - " version_mclf = 0x%x\n" - " version_container = 0x%x\n" - " version_mc_config = 0x%x\n" - " version_tl_api = 0x%x\n" - " version_dr_api = 0x%x\n" - " version_cmp = 0x%x\n", - version_info.product_id, - version_info.version_mci, - version_info.version_so, - version_info.version_mclf, - version_info.version_container, - version_info.version_mc_config, - version_info.version_tl_api, - version_info.version_dr_api, - version_info.version_cmp); - - if (MC_VERSION_MAJOR(version_info.version_mci) > 1) { - pr_err("MCI version %d.%d is too recent for this driver", - MC_VERSION_MAJOR(version_info.version_mci), - MC_VERSION_MINOR(version_info.version_mci)); - goto err_version; - } - - if ((MC_VERSION_MAJOR(version_info.version_mci) == 0) && - (MC_VERSION_MINOR(version_info.version_mci) < 6)) { - pr_err("MCI version %d.%d is too old for this driver", - MC_VERSION_MAJOR(version_info.version_mci), - MC_VERSION_MINOR(version_info.version_mci)); - goto err_version; - } - - dev_info(g_ctx.mcd, "MobiCore MCI version is %d.%d\n", - MC_VERSION_MAJOR(version_info.version_mci), - MC_VERSION_MINOR(version_info.version_mci)); - - /* Determine which features are supported */ - switch (version_info.version_mci) { - case MC_VERSION(1, 2): /* 310 */ - g_ctx.f_client_login = true; - /* Fall through */ - case MC_VERSION(1, 1): - g_ctx.f_multimap = true; - /* Fall through */ - case MC_VERSION(1, 0): /* 302 */ - g_ctx.f_mem_ext = true; - g_ctx.f_ta_auth = true; - /* Fall through */ - case MC_VERSION(0, 7): - g_ctx.f_timeout = true; - /* Fall through */ - case MC_VERSION(0, 6): /* 301 */ - break; - } - - ret = device_user_init(); - if (ret) - goto err_create_dev_user; - - return 0; - -err_create_dev_user: -err_version: -err_mcp_cmd: - mc_pm_stop(); -err_pm: - mc_scheduler_stop(); -err_sched: - mc_logging_stop(); -err_log: - mcp_stop(); -err_mcp: - return ret; -} - -static inline void mobicore_stop(void) -{ - mc_pm_stop(); - mc_scheduler_stop(); - mc_logging_stop(); - mcp_stop(); -} - -/* - * This function is called by the kernel during startup or by a insmod command. - * This device is installed and registered as cdev, then interrupt and - * queue handling is set up - */ -static int mobicore_init(void) -{ - int err = 0; - - dev_set_name(g_ctx.mcd, "TEE"); - - /* Do not remove or change the following trace. - * The string "MobiCore" is used to detect if Cannot continue! */ - if (!has_security_extensions()) { - MCDRV_ERROR("Hardware doesn't support ARM TrustZone!"); - return -ENODEV; - } - - /* Running in secure mode -> Cannot load the driver! */ - if (is_secure_mode()) { - MCDRV_ERROR("Running in secure MODE!"); - return -ENODEV; - } - - /* Init common API layer */ - api_init(); - - /* Init plenty of nice features */ - err = mc_fastcall_init(); - if (err) { - MCDRV_ERROR("Fastcall support init failed!"); - goto fail_fastcall_init; - } - - err = mcp_init(); - if (err) { - MCDRV_ERROR("MCP init failed!"); - goto fail_mcp_init; - } - - err = mc_logging_init(); - if (err) { - MCDRV_ERROR("Log init failed!"); - goto fail_log_init; - } - - /* The scheduler is the first to create a debugfs entry */ - g_ctx.debug_dir = debugfs_create_dir("trustonic_tee", NULL); - err = mc_scheduler_init(); - if (err) { - MCDRV_ERROR("Scheduler init failed!"); - goto fail_mc_device_sched_init; - } - - /* - * Create admin dev so that daemon can already communicate with - * the driver - */ - err = device_admin_init(mobicore_start); - if (err) - goto fail_creat_dev_admin; - - return 0; - -fail_creat_dev_admin: - mc_scheduler_exit(); -fail_mc_device_sched_init: - debugfs_remove(g_ctx.debug_dir); - mc_logging_exit(); -fail_log_init: - mcp_exit(); -fail_mcp_init: - mc_fastcall_exit(); -fail_fastcall_init: - return err; -} - -/* - * This function removes this device driver from the Linux device manager . - */ -static void mobicore_exit(void) -{ - MCDRV_DBG("enter"); - - devices_exit(); - mobicore_stop(); - mc_scheduler_exit(); - mc_logging_exit(); - mcp_exit(); - mc_fastcall_exit(); - debugfs_remove_recursive(g_ctx.debug_dir); - - MCDRV_DBG("exit"); -} - -/* Linux Driver Module Macros */ - -#ifdef MC_DEVICE_PROPNAME - -static int mobicore_probe(struct platform_device *pdev) -{ - g_ctx.mcd->of_node = pdev->dev.of_node; - mobicore_init(); - return 0; -} - -static const struct of_device_id of_match_table[] = { - { .compatible = MC_DEVICE_PROPNAME }, - { } -}; - -static struct platform_driver mc_plat_driver = { - .probe = mobicore_probe, - .driver = { - .name = "mcd", - .owner = THIS_MODULE, - .of_match_table = of_match_table, - } -}; - -static int mobicore_register(void) -{ - return platform_driver_register(&mc_plat_driver); -} - -static void mobicore_unregister(void) -{ - platform_driver_unregister(&mc_plat_driver); - mobicore_exit(); -} - -module_init(mobicore_register); -module_exit(mobicore_unregister); - -#else /* MC_DEVICE_PROPNAME */ - -module_init(mobicore_init); -module_exit(mobicore_exit); - -#endif /* !MC_DEVICE_PROPNAME */ - -MODULE_AUTHOR("Trustonic Limited"); -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("MobiCore driver"); diff --git a/drivers/gud/MobiCoreDriver/main.h b/drivers/gud/MobiCoreDriver/main.h deleted file mode 100644 index cadc3d766147a..0000000000000 --- a/drivers/gud/MobiCoreDriver/main.h +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _MC_MAIN_H_ -#define _MC_MAIN_H_ - -#include /* gfp_t */ - -#define MC_VERSION(major, minor) \ - (((major & 0x0000ffff) << 16) | (minor & 0x0000ffff)) -#define MC_VERSION_MAJOR(x) ((x) >> 16) -#define MC_VERSION_MINOR(x) ((x) & 0xffff) - -/* MobiCore Driver Kernel Module context data. */ -struct mc_device_ctx { - struct device *mcd; - /* debugfs root */ - struct dentry *debug_dir; - - /* GP sessions waiting final close notif */ - struct list_head closing_sess; - struct mutex closing_lock; /* Closing sessions list */ - - /* Features */ - /* - SWd can set a time out to get scheduled at a future time */ - bool f_timeout; - /* - SWd supports memory extension which allows for bigger TAs */ - bool f_mem_ext; - /* - SWd supports TA authorisation */ - bool f_ta_auth; - /* - SWd can map several buffers at once */ - bool f_multimap; - /* - SWd supports GP client authentication */ - bool f_client_login; -}; - -extern struct mc_device_ctx g_ctx; - -struct kasnprintf_buf { - gfp_t gfp; - void *buf; - int size; - int off; -}; - -extern __printf(2, 3) -int kasnprintf(struct kasnprintf_buf *buf, const char *fmt, ...); - -#endif /* _MC_MAIN_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mci/mcifc.h b/drivers/gud/MobiCoreDriver/mci/mcifc.h deleted file mode 100644 index 4848c9e047fba..0000000000000 --- a/drivers/gud/MobiCoreDriver/mci/mcifc.h +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * 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. - * - * 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 MCIFC_H_ -#define MCIFC_H_ - -#include "platform.h" - -/** @name MobiCore FastCall Defines - * Defines for the two different FastCall's. - */ -/** @{ */ - -#include "platform.h" - -/* --- global ---- */ -#define MC_FC_INVALID ((uint32_t)0) /**< Invalid FastCall ID */ - -#if defined(CONFIG_ARM64) && !defined(MC_ARMV7_FC) - -/* These should be handled as 64-bit FCs; now they are more like 32bits... */ -#define MC_FC_STD64_BASE ((uint32_t)0xFF000000) -#define MC_FC_STD64(x) ((uint32_t)(MC_FC_STD64_BASE + (x))) - -#define MC_FC_INIT MC_FC_STD64(1) /**< Initializing FastCall. */ -#define MC_FC_INFO MC_FC_STD64(2) /**< Info FastCall. */ -#define MC_FC_MEM_TRACE MC_FC_STD64(10) /**< Enable SWd tracing via memory */ -#define MC_FC_SWAP_CPU MC_FC_STD64(54) /**< Change new active Core */ - -#else - -#define MC_FC_INIT ((uint32_t)(-1)) /**< Initializing FastCall. */ -#define MC_FC_INFO ((uint32_t)(-2)) /**< Info FastCall. */ -#define MC_FC_MEM_TRACE ((uint32_t)(-31)) /**< Enable SWd tracing via memory */ -#define MC_FC_SWAP_CPU ((uint32_t)(0x84000005)) /**< Change new active Core */ - -#endif - -/** @} */ - -/** @name MobiCore SMC Defines - * Defines the different secure monitor calls (SMC) for world switching. - * @{ */ -/**< Yield to switch from NWd to SWd. */ -#define MC_SMC_N_YIELD 3 -/**< SIQ to switch from NWd to SWd. */ -#define MC_SMC_N_SIQ 4 -/** @} */ - -/** @name MobiCore status - * MobiCore status information. - * @{ */ -/**< MobiCore is not yet initialized. FastCall FcInit() to set up MobiCore.*/ -#define MC_STATUS_NOT_INITIALIZED 0 -/**< Bad parameters have been passed in FcInit(). */ -#define MC_STATUS_BAD_INIT 1 -/**< MobiCore did initialize properly. */ -#define MC_STATUS_INITIALIZED 2 -/**< MobiCore kernel halted due to an unrecoverable exception. Further - * information is available extended info */ -#define MC_STATUS_HALT 3 -/** @} */ - -/** @name Extended Info Identifiers - * Extended info parameters for MC_FC_INFO to obtain further information depending on MobiCore state. - * @{ */ -/**< Version of the MobiCore Control Interface (MCI) */ -#define MC_EXT_INFO_ID_MCI_VERSION 0 -/**< MobiCore control flags */ -#define MC_EXT_INFO_ID_FLAGS 1 -/**< MobiCore halt condition code */ -#define MC_EXT_INFO_ID_HALT_CODE 2 -/**< MobiCore halt condition instruction pointer */ -#define MC_EXT_INFO_ID_HALT_IP 3 -/**< MobiCore fault counter */ -#define MC_EXT_INFO_ID_FAULT_CNT 4 -/**< MobiCore last fault cause */ -#define MC_EXT_INFO_ID_FAULT_CAUSE 5 -/**< MobiCore last fault meta */ -#define MC_EXT_INFO_ID_FAULT_META 6 -/**< MobiCore last fault threadid */ -#define MC_EXT_INFO_ID_FAULT_THREAD 7 -/**< MobiCore last fault instruction pointer */ -#define MC_EXT_INFO_ID_FAULT_IP 8 -/**< MobiCore last fault stack pointer */ -#define MC_EXT_INFO_ID_FAULT_SP 9 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_DFSR 10 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_ADFSR 11 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_DFAR 12 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_IFSR 13 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_AIFSR 14 -/**< MobiCore last fault ARM arch information */ -#define MC_EXT_INFO_ID_FAULT_ARCH_IFAR 15 -/**< MobiCore configured by Daemon via fc_init flag */ -#define MC_EXT_INFO_ID_MC_CONFIGURED 16 -/**< MobiCore scheduling status: idle/non-idle */ -#define MC_EXT_INFO_ID_MC_SCHED_STATUS 17 -/**< MobiCore runtime status: initialized, halted */ -#define MC_EXT_INFO_ID_MC_STATUS 18 -/**< MobiCore exception handler last partner */ -#define MC_EXT_INFO_ID_MC_EXC_PARTNER 19 -/**< MobiCore exception handler last peer */ -#define MC_EXT_INFO_ID_MC_EXC_IPCPEER 20 -/**< MobiCore exception handler last IPC message */ -#define MC_EXT_INFO_ID_MC_EXC_IPCMSG 21 -/**< MobiCore exception handler last IPC data */ -#define MC_EXT_INFO_ID_MC_EXC_IPCDATA 22 -/**< MobiCore exception handler last UUID (uses 4 slots: 23 to 26) */ -#define MC_EXT_INFO_ID_MC_EXC_UUID 23 -#define MC_EXT_INFO_ID_MC_EXC_UUID1 24 -#define MC_EXT_INFO_ID_MC_EXC_UUID2 25 -#define MC_EXT_INFO_ID_MC_EXC_UUID3 26 - -/** @} */ - -/** @name FastCall return values - * Return values of the MobiCore FastCalls. - * @{ */ -/**< No error. Everything worked fine. */ -#define MC_FC_RET_OK 0 -/**< FastCall was not successful. */ -#define MC_FC_RET_ERR_INVALID 1 -/**< MobiCore has already been initialized. */ -#define MC_FC_RET_ERR_ALREADY_INITIALIZED 5 -/** @} */ - -#endif /** MCIFC_H_ */ - -/** @} */ diff --git a/drivers/gud/MobiCoreDriver/mci/mcimcp.h b/drivers/gud/MobiCoreDriver/mci/mcimcp.h deleted file mode 100644 index 3eb2efea2c30c..0000000000000 --- a/drivers/gud/MobiCoreDriver/mci/mcimcp.h +++ /dev/null @@ -1,508 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 MCP_H_ -#define MCP_H_ - -#include "mci/mcloadformat.h" - -/** Indicates a response */ -#define FLAG_RESPONSE BIT(31) - -/** Maximum number of buffers that can be mapped at once */ -#define MCP_MAP_MAX_BUF 4 - -/** MobiCore Return Code Defines. - * List of the possible MobiCore return codes. - */ -enum mcp_result { - /** Memory has successfully been mapped */ - MC_MCP_RET_OK = 0, - /** The session ID is invalid */ - MC_MCP_RET_ERR_INVALID_SESSION = 1, - /** The UUID of the Trustlet is unknown */ - MC_MCP_RET_ERR_UNKNOWN_UUID = 2, - /** The ID of the driver is unknown */ - MC_MCP_RET_ERR_UNKNOWN_DRIVER_ID = 3, - /** No more session are allowed */ - MC_MCP_RET_ERR_NO_MORE_SESSIONS = 4, - /** The container is invalid */ - MC_MCP_RET_ERR_CONTAINER_INVALID = 5, - /** The Trustlet is invalid */ - MC_MCP_RET_ERR_TRUSTLET_INVALID = 6, - /** The memory block has already been mapped before */ - MC_MCP_RET_ERR_ALREADY_MAPPED = 7, - /** Alignment or length error in the command parameters */ - MC_MCP_RET_ERR_INVALID_PARAM = 8, - /** No space left in the virtual address space of the session */ - MC_MCP_RET_ERR_OUT_OF_RESOURCES = 9, - /** WSM type unknown or broken WSM */ - MC_MCP_RET_ERR_INVALID_WSM = 10, - /** unknown error */ - MC_MCP_RET_ERR_UNKNOWN = 11, - /** Length of map invalid */ - MC_MCP_RET_ERR_INVALID_MAPPING_LENGTH = 12, - /** Map can only be applied to Trustlet session */ - MC_MCP_RET_ERR_MAPPING_TARGET = 13, - /** Couldn't open crypto session */ - MC_MCP_RET_ERR_OUT_OF_CRYPTO_RESOURCES = 14, - /** System Trustlet signature verification failed */ - MC_MCP_RET_ERR_SIGNATURE_VERIFICATION_FAILED = 15, - /** System Trustlet public key is wrong */ - MC_MCP_RET_ERR_WRONG_PUBLIC_KEY = 16, - /** Wrong containter type(s) */ - MC_MCP_RET_ERR_CONTAINER_TYPE_MISMATCH = 17, - /** Container is locked (or not activated) */ - MC_MCP_RET_ERR_CONTAINER_LOCKED = 18, - /** SPID is not registered with root container */ - MC_MCP_RET_ERR_SP_NO_CHILD = 19, - /** UUID is not registered with sp container */ - MC_MCP_RET_ERR_TL_NO_CHILD = 20, - /** Unwrapping of root container failed */ - MC_MCP_RET_ERR_UNWRAP_ROOT_FAILED = 21, - /** Unwrapping of service provider container failed */ - MC_MCP_RET_ERR_UNWRAP_SP_FAILED = 22, - /** Unwrapping of Trustlet container failed */ - MC_MCP_RET_ERR_UNWRAP_TRUSTLET_FAILED = 23, - /** Container version mismatch */ - MC_MCP_RET_ERR_CONTAINER_VERSION_MISMATCH = 24, - /** Decryption of service provider trustlet failed */ - MC_MCP_RET_ERR_SP_TL_DECRYPTION_FAILED = 25, - /** Hash check of service provider trustlet failed */ - MC_MCP_RET_ERR_SP_TL_HASH_CHECK_FAILED = 26, - /** Activation/starting of task failed */ - MC_MCP_RET_ERR_LAUNCH_TASK_FAILED = 27, - /** Closing of task not yet possible, try again later */ - MC_MCP_RET_ERR_CLOSE_TASK_FAILED = 28, - /**< Service is blocked and a session cannot be opened to it */ - MC_MCP_RET_ERR_SERVICE_BLOCKED = 29, - /**< Service is locked and a session cannot be opened to it */ - MC_MCP_RET_ERR_SERVICE_LOCKED = 30, - /**< Service was forcefully killed (due to an administrative command) */ - MC_MCP_RET_ERR_SERVICE_KILLED = 31, - /** The command is unknown */ - MC_MCP_RET_ERR_UNKNOWN_COMMAND = 50, - /** The command data is invalid */ - MC_MCP_RET_ERR_INVALID_DATA = 51 -}; - -/** Possible MCP Command IDs - * Command ID must be between 0 and 0x7FFFFFFF. - */ -enum cmd_id { - /** Invalid command ID */ - MC_MCP_CMD_ID_INVALID = 0x00, - /** Open a session */ - MC_MCP_CMD_OPEN_SESSION = 0x01, - /** Close an existing session */ - MC_MCP_CMD_CLOSE_SESSION = 0x03, - /** Map WSM to session */ - MC_MCP_CMD_MAP = 0x04, - /** Unmap WSM from session */ - MC_MCP_CMD_UNMAP = 0x05, - /** Prepare for suspend */ - MC_MCP_CMD_SUSPEND = 0x06, - /** Resume from suspension */ - MC_MCP_CMD_RESUME = 0x07, - /** Get MobiCore version information */ - MC_MCP_CMD_GET_MOBICORE_VERSION = 0x09, - /** Close MCP and unmap MCI */ - MC_MCP_CMD_CLOSE_MCP = 0x0A, - /** Load token for device attestation */ - MC_MCP_CMD_LOAD_TOKEN = 0x0B, - /** Check that TA can be loaded */ - MC_MCP_CMD_CHECK_LOAD_TA = 0x0C, - /** Map multiple WSMs to session */ - MC_MCP_CMD_MULTIMAP = 0x0D, - /** Unmap multiple WSMs to session */ - MC_MCP_CMD_MULTIUNMAP = 0x0E, -}; - -/* - * Types of WSM known to the MobiCore. - */ -#define WSM_TYPE_MASK 0xFF -#define WSM_INVALID 0 /** Invalid memory type */ -#define WSM_L2 2 /** Buffer mapping uses L2/L3 table */ -#define WSM_L1 3 /** Buffer mapping uses fake L1 table */ - -/** Magic number used to identify if Open Command supports GP client - * authentication. - */ -#define MC_GP_CLIENT_AUTH_MAGIC 0x47504131 /* "GPA1" */ - -/** Command header. - * It just contains the command ID. Only values specified in cmd_id are - * allowed as command IDs. If the command ID is unspecified the MobiCore - * returns an empty response with the result set to - * MC_MCP_RET_ERR_UNKNOWN_COMMAND. - */ -struct cmd_header { - enum cmd_id cmd_id; /** Command ID of the command */ -}; - -/** Response header. - * MobiCore will reply to every MCP command with an MCP response. Like the MCP - * command the response consists of a header followed by response data. The - * response is written to the same memory location as the MCP command. - */ -struct rsp_header { - uint32_t rsp_id; /** Command ID | FLAG_RESPONSE */ - enum mcp_result result; /** Result of the command execution */ -}; - -/** @defgroup CMD MCP Commands - */ - -/** @defgroup ASMCMD Administrative Commands - */ - -/** @defgroup MCPGETMOBICOREVERSION GET_MOBICORE_VERSION - * Get MobiCore version info. - * - */ - -/** Get MobiCore Version Command */ -struct cmd_get_version { - struct cmd_header cmd_header; /** Command header */ -}; - -/** Get MobiCore Version Command Response */ -struct rsp_get_version { - struct rsp_header rsp_header; /** Response header */ - struct mc_version_info version_info; /** MobiCore version info */ -}; - -/** @defgroup POWERCMD Power Management Commands - */ - -/** @defgroup MCPSUSPEND SUSPEND - * Prepare MobiCore suspension. - * This command allows MobiCore and MobiCore drivers to release or clean - * resources and save device state. - * - */ - -/** Suspend Command */ -struct cmd_suspend { - struct cmd_header cmd_header; /** Command header */ -}; - -/** Suspend Command Response */ -struct rsp_suspend { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPRESUME RESUME - * Resume MobiCore from suspension. - * This command allows MobiCore and MobiCore drivers to reinitialize hardware - * affected by suspension. - * - */ - -/** Resume Command */ -struct cmd_resume { - struct cmd_header cmd_header; /** Command header */ -}; - -/** Resume Command Response */ -struct rsp_resume { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup SESSCMD Session Management Commands - */ - -/** @defgroup MCPOPEN OPEN - * Load and open a session to a Trustlet. - * The OPEN command loads Trustlet data to the MobiCore context and opens a - * session to the Trustlet. If wsm_data_type is WSM_INVALID MobiCore tries to - * start a pre-installed Trustlet associated with the uuid passed. The uuid - * passed must match the uuid contained in the load data (if available). - * On success, MobiCore returns the session ID which can be used for further - * communication. - */ - -/** GP client authentication data */ -struct cmd_open_data { - uint32_t mclf_magic; /** ASCII "MCLF" on older versions */ - struct identity identity; /** Login method and data */ -}; - -/** Open Command */ -struct cmd_open { - struct cmd_header cmd_header; /** Command header */ - struct mc_uuid_t uuid; /** Service UUID */ - uint8_t unused[4]; /** Padding to be 64-bit aligned */ - uint64_t adr_tci_buffer; /** Physical address of the TCI MMU */ - uint64_t adr_load_data; /** Physical address of the data MMU */ - uint32_t ofs_tci_buffer; /** Offset to the data */ - uint32_t len_tci_buffer; /** Length of the TCI */ - uint32_t wsmtype_tci; /** Type of WSM used for the TCI */ - uint32_t wsm_data_type; /** Type of MMU */ - uint32_t ofs_load_data; /** Offset to the data */ - uint32_t len_load_data; /** Length of the data to load */ - union { - struct cmd_open_data cmd_open_data; /** Client login data */ - union mclf_header tl_header; /** Service header */ - }; - uint32_t is_gpta; /** true if looking for an SD/GP-TA */ -}; - -/** Open Command Response */ -struct rsp_open { - struct rsp_header rsp_header; /** Response header */ - uint32_t session_id; /** Session ID */ -}; - -/** TA Load Check Command */ -struct cmd_check_load { - struct cmd_header cmd_header; /** Command header */ - struct mc_uuid_t uuid; /** Service UUID */ - uint64_t adr_load_data; /** Physical address of the data */ - uint32_t wsm_data_type; /** Type of MMU */ - uint32_t ofs_load_data; /** Offset to the data */ - uint32_t len_load_data; /** Length of the data to load */ - union mclf_header tl_header; /** Service header */ -}; - -/** TA Load Check Response */ -struct rsp_check_load { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPCLOSE CLOSE - * Close an existing session to a Trustlet. - * The CLOSE command terminates a session and frees all resources in the - * MobiCore system which are currently occupied by the session. Before closing - * the session, the MobiCore runtime management waits until all pending - * operations, like calls to drivers, invoked by the Trustlet have been - * terminated. Mapped memory will automatically be unmapped from the MobiCore - * context. The NWd is responsible for processing the freed memory according to - * the Rich-OS needs. - * - */ - -/** Close Command */ -struct cmd_close { - struct cmd_header cmd_header; /** Command header */ - uint32_t session_id; /** Session ID */ -}; - -/** Close Command Response */ -struct rsp_close { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPMAP MAP - * Map a portion of memory to a session. - * The MAP command provides a block of memory to the context of a service. - * The memory then becomes world-shared memory (WSM). - * The only allowed memory type here is WSM_L2. - */ - -/** Map Command */ -struct cmd_map { - struct cmd_header cmd_header; /** Command header */ - uint32_t session_id; /** Session ID */ - uint32_t wsm_type; /** Type of MMU */ - uint32_t ofs_buffer; /** Offset to the payload */ - uint64_t adr_buffer; /** Physical address of the MMU */ - uint32_t len_buffer; /** Length of the buffer */ -}; - -#define MCP_MAP_MAX 0x100000 /** Maximum length for MCP map */ - -/** Map Command Response */ -struct rsp_map { - struct rsp_header rsp_header; /** Response header */ - /** Virtual address the WSM is mapped to, may include an offset! */ - uint32_t secure_va; -}; - -/** @defgroup MCPUNMAP UNMAP - * Unmap a portion of world-shared memory from a session. - * The UNMAP command is used to unmap a previously mapped block of - * world shared memory from the context of a session. - * - * Attention: The memory block will be immediately unmapped from the specified - * session. If the service is still accessing the memory, the service will - * trigger a segmentation fault. - */ - -/** Unmap Command */ -struct cmd_unmap { - struct cmd_header cmd_header; /** Command header */ - uint32_t session_id; /** Session ID */ - uint32_t wsm_type; /** Type of WSM used of the memory */ - /** Virtual address the WSM is mapped to, may include an offset! */ - uint32_t secure_va; - uint32_t virtual_buffer_len; /** Length of virtual buffer */ -}; - -/** Unmap Command Response */ -struct rsp_unmap { - struct rsp_header rsp_header; /** Response header */ -}; - -/** @defgroup MCPLOADTOKEN - * Load a token from the normal world and share it with type of - * function. elementCnt must be a power of two and the power needs - * to be smaller than power of uint32_t (obviously 32). - */ -struct notification_queue { - struct notification_queue_header hdr; /** Queue header */ - struct notification notification[MIN_NQ_ELEM]; /** Elements */ -}; - -#endif /** NQ_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mci/mcloadformat.h b/drivers/gud/MobiCoreDriver/mci/mcloadformat.h deleted file mode 100644 index f12f618bb0dc6..0000000000000 --- a/drivers/gud/MobiCoreDriver/mci/mcloadformat.h +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 MCLOADFORMAT_H_ -#define MCLOADFORMAT_H_ - -/** Trustlet Blob length info */ -#define MC_TLBLOBLEN_MAGIC 0x7672746C /* Magic for SWd: vrtl */ -#define MAX_SO_CONT_SIZE 512 /* Max size for a container */ - -/** MCLF flags */ -/**< Loaded service cannot be unloaded from MobiCore. */ -#define MC_SERVICE_HEADER_FLAGS_PERMANENT BIT(0) -/**< Service has no WSM control interface. */ -#define MC_SERVICE_HEADER_FLAGS_NO_CONTROL_INTERFACE BIT(1) -/**< Service can be debugged. */ -#define MC_SERVICE_HEADER_FLAGS_DEBUGGABLE BIT(2) -/**< New-layout trusted application or trusted driver. */ -#define MC_SERVICE_HEADER_FLAGS_EXTENDED_LAYOUT BIT(3) - -/** Service type. - * The service type defines the type of executable. - */ -enum service_type { - SERVICE_TYPE_ILLEGAL = 0, - SERVICE_TYPE_DRIVER = 1, - SERVICE_TYPE_SP_TRUSTLET = 2, - SERVICE_TYPE_SYSTEM_TRUSTLET = 3, - SERVICE_TYPE_MIDDLEWARE = 4, - SERVICE_TYPE_LAST_ENTRY = 5, -}; - -/** - * Descriptor for a memory segment. - */ -struct segment_descriptor { - uint32_t start; /**< Virtual start address */ - uint32_t len; /**< Segment length in bytes */ -}; - -/** - * MCLF intro for data structure identification. - * Must be the first element of a valid MCLF file. - */ -struct mclf_intro { - uint32_t magic; /**< Header magic value ASCII "MCLF" */ - uint32_t version; /**< Version the MCLF header struct */ -}; - -/** - * @defgroup MCLF_VER_V2 MCLF Version 32 - * @ingroup MCLF_VER - * - * @addtogroup MCLF_VER_V2 - */ - -/* - * GP TA identity. - */ -struct identity { - /**< GP TA login type */ - uint32_t login_type; - /**< GP TA login data */ - uint8_t login_data[16]; -}; - -/** - * Version 2.1/2.2 MCLF header. - */ -struct mclf_header_v2 { - /**< MCLF header start with the mandatory intro */ - struct mclf_intro intro; - /**< Service flags */ - uint32_t flags; - /**< Type of memory the service must be executed from */ - uint32_t mem_type; - /**< Type of service */ - enum service_type service_type; - /**< Number of instances which can be run simultaneously */ - uint32_t num_instances; - /**< Loadable service unique identifier (UUID) */ - struct mc_uuid_t uuid; - /**< If the service_type is SERVICE_TYPE_DRIVER the Driver ID is used */ - uint32_t driver_id; - /**< - * Number of threads (N) in a service: - * SERVICE_TYPE_SP_TRUSTLET: N = 1 - * SERVICE_TYPE_SYSTEM_TRUSTLET: N = 1 - * SERVICE_TYPE_DRIVER: N >= 1 - */ - uint32_t num_threads; - /**< Virtual text segment */ - struct segment_descriptor text; - /**< Virtual data segment */ - struct segment_descriptor data; - /**< Length of the BSS segment in bytes. MUST be at least 8 byte */ - uint32_t bss_len; - /**< Virtual start address of service code */ - uint32_t entry; - /**< Version of the interface the driver exports */ - uint32_t service_version; -}; - -/** - * @addtogroup MCLF - */ - -/** MCLF header */ -union mclf_header { - /**< Intro for data identification */ - struct mclf_intro intro; - /**< Version 2 header */ - struct mclf_header_v2 mclf_header_v2; -}; - -struct mc_blob_len_info { - uint32_t magic; /**< New blob format magic number */ - uint32_t root_size; /**< Root container size */ - uint32_t sp_size; /**< SP container size */ - uint32_t ta_size; /**< TA container size */ - uint32_t reserved[4]; /**< Reserved for further Use */ -}; - -#endif /* MCLOADFORMAT_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mcp.c b/drivers/gud/MobiCoreDriver/mcp.c deleted file mode 100644 index 693fd42e2d4b5..0000000000000 --- a/drivers/gud/MobiCoreDriver/mcp.c +++ /dev/null @@ -1,1067 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "mci/mcimcp.h" -#include "mci/mcifc.h" -#include "mci/mcinq.h" /* SID_MCP */ - -#include "platform.h" /* IRQ number */ -#include "fastcall.h" -#include "debug.h" -#include "logging.h" -#include "mcp.h" - -/* respond timeout for MCP notification, in secs */ -#define MCP_TIMEOUT 10 -#define MCP_RETRIES 5 -#define MCP_NF_QUEUE_SZ 8 -#define NQ_NUM_ELEMS 16 - -static void mc_irq_worker(struct work_struct *data); -DECLARE_WORK(irq_work, mc_irq_worker); - -static const struct { - unsigned int index; - const char *msg; -} status_map[] = { - /**< MobiCore control flags */ - { MC_EXT_INFO_ID_FLAGS, "flags"}, - /**< MobiCore halt condition code */ - { MC_EXT_INFO_ID_HALT_CODE, "haltCode"}, - /**< MobiCore halt condition instruction pointer */ - { MC_EXT_INFO_ID_HALT_IP, "haltIp"}, - /**< MobiCore fault counter */ - { MC_EXT_INFO_ID_FAULT_CNT, "faultRec.cnt"}, - /**< MobiCore last fault cause */ - { MC_EXT_INFO_ID_FAULT_CAUSE, "faultRec.cause"}, - /**< MobiCore last fault meta */ - { MC_EXT_INFO_ID_FAULT_META, "faultRec.meta"}, - /**< MobiCore last fault threadid */ - { MC_EXT_INFO_ID_FAULT_THREAD, "faultRec.thread"}, - /**< MobiCore last fault instruction pointer */ - { MC_EXT_INFO_ID_FAULT_IP, "faultRec.ip"}, - /**< MobiCore last fault stack pointer */ - { MC_EXT_INFO_ID_FAULT_SP, "faultRec.sp"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_DFSR, "faultRec.arch.dfsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_ADFSR, "faultRec.arch.adfsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_DFAR, "faultRec.arch.dfar"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_IFSR, "faultRec.arch.ifsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_AIFSR, "faultRec.arch.aifsr"}, - /**< MobiCore last fault ARM arch information */ - { MC_EXT_INFO_ID_FAULT_ARCH_IFAR, "faultRec.arch.ifar"}, - /**< MobiCore configured by Daemon via fc_init flag */ - { MC_EXT_INFO_ID_MC_CONFIGURED, "mcData.flags"}, - /**< MobiCore exception handler last partner */ - { MC_EXT_INFO_ID_MC_EXC_PARTNER, "mcExcep.partner"}, - /**< MobiCore exception handler last peer */ - { MC_EXT_INFO_ID_MC_EXC_IPCPEER, "mcExcep.peer"}, - /**< MobiCore exception handler last IPC message */ - { MC_EXT_INFO_ID_MC_EXC_IPCMSG, "mcExcep.cause"}, - /**< MobiCore exception handler last IPC data */ - {MC_EXT_INFO_ID_MC_EXC_IPCDATA, "mcExcep.meta"}, -}; - -static struct mcp_context { - struct mutex buffer_lock; /* Lock on SWd communication buffer */ - struct mutex queue_lock; /* Lock for MCP messages */ - struct mcp_buffer *mcp_buffer; - struct tbase_session *session; - struct completion complete; - bool mcp_dead; - int irq; - int (*scheduler_cb)(enum mcp_scheduler_commands); - void (*crashhandler_cb)(void); - /* MobiCore MCI information */ - unsigned int order; - union { - void *base; - struct { - struct notification_queue *tx; - struct notification_queue *rx; - } nq; - }; - /* - * This notifications list is to be used to queue notifications when the - * notification queue overflows, so no session gets its notification - * lost, especially MCP. - */ - struct mutex notifications_mutex; - struct list_head notifications; - struct mcp_session mcp_session; /* Pseudo session for MCP */ - /* Unexpected notification (during MCP open) */ - struct mutex unexp_notif_mutex; - struct notification unexp_notif; - /* Sessions */ - struct mutex sessions_lock; - struct list_head sessions; - /* Dump buffer */ - struct kasnprintf_buf dump; -} mcp_ctx; - -static inline void mark_mcp_dead(void) -{ - mcp_ctx.mcp_dead = true; - complete(&mcp_ctx.complete); -} - -static inline int mcp_set_sleep_mode_rq(uint16_t sleep_req) -{ - mutex_lock(&mcp_ctx.buffer_lock); - mcp_ctx.mcp_buffer->mc_flags.sleep_mode.sleep_req = sleep_req; - mutex_unlock(&mcp_ctx.buffer_lock); - return 0; -} - -static ssize_t debug_crashdump_read(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) -{ - if (mcp_ctx.dump.off) - return simple_read_from_buffer(user_buf, count, ppos, - mcp_ctx.dump.buf, - mcp_ctx.dump.off); - - return 0; -} - -static const struct file_operations mc_debug_crashdump_ops = { - .read = debug_crashdump_read, - .llseek = default_llseek, -}; - -static void mcp_dump_mobicore_status(void) -{ - char uuid_str[33]; - int ret = 0; - int i; - - if (mcp_ctx.dump.off) - ret = -EBUSY; - - /* read additional info about exception-point and print */ - dev_err(g_ctx.mcd, "= 0) - ret = kasnprintf(&mcp_ctx.dump, - "%-20s= 0x%08x\n", - status_map[i].msg, info); - } - } - - /* construct UUID string */ - for (i = 0; i < 4; i++) { - uint32_t info; - int j; - - if (mc_fc_info(MC_EXT_INFO_ID_MC_EXC_UUID + i, NULL, &info)) - return; - - for (j = 0; j < sizeof(info); j++) { - snprintf(&uuid_str[(i * sizeof(info) + j) * 2], 3, - "%02x", (info >> (j * 8)) & 0xff); - } - } - - dev_err(g_ctx.mcd, " %-20s= 0x%s\n", "mcExcep.uuid", uuid_str); - if (ret >= 0) - ret = kasnprintf(&mcp_ctx.dump, "%-20s= 0x%s\n", "mcExcep.uuid", - uuid_str); - - if (ret < 0) { - kfree(mcp_ctx.dump.buf); - mcp_ctx.dump.off = 0; - return; - } - - debugfs_create_file("crashdump", 0400, g_ctx.debug_dir, NULL, - &mc_debug_crashdump_ops); - if (mcp_ctx.crashhandler_cb) - mcp_ctx.crashhandler_cb(); -} - -void mcp_session_init(struct mcp_session *session, bool is_gp, - const struct identity *identity) -{ - /* close_work is initialized by the caller */ - INIT_LIST_HEAD(&session->list); - INIT_LIST_HEAD(&session->notifications_list); - mutex_init(&session->notif_wait_lock); - init_completion(&session->completion); - mutex_init(&session->exit_code_lock); - session->state = MCP_SESSION_RUNNING; - session->is_gp = is_gp; - if (is_gp) - session->identity = *identity; -} - -static inline bool mcp_session_isrunning(struct mcp_session *session) -{ - bool ret; - - mutex_lock(&mcp_ctx.sessions_lock); - ret = session->state == MCP_SESSION_RUNNING; - mutex_unlock(&mcp_ctx.sessions_lock); - return ret; -} - -/* - * session remains valid thanks to the upper layers reference counters, but the - * SWd session may have died, in which case we are informed. - */ -int mcp_session_waitnotif(struct mcp_session *session, int32_t timeout) -{ - int ret = 0; - - mutex_lock(&session->notif_wait_lock); - if (!mcp_session_isrunning(session)) { - ret = -ENXIO; - goto end; - } - - if (mcp_session_exitcode(session)) { - ret = -ECOMM; - goto end; - } - - if (timeout < 0) { - ret = wait_for_completion_interruptible(&session->completion); - if (ret) - goto end; - } else { - ret = wait_for_completion_interruptible_timeout( - &session->completion, timeout * HZ / 1000); - if (ret < 0) - /* Interrupted */ - goto end; - - if (!ret) { - /* Timed out */ - ret = -ETIME; - goto end; - } - - ret = 0; - } - - if (mcp_session_exitcode(session)) { - ret = -ECOMM; - goto end; - } - - if (!mcp_session_isrunning(session)) { - ret = -ENXIO; - goto end; - } - -end: - mutex_unlock(&session->notif_wait_lock); - if (ret) - dev_info(g_ctx.mcd, "%s session %x ec %d ret %d\n", __func__, - session->id, session->exit_code, ret); - - return ret; -} - -int32_t mcp_session_exitcode(struct mcp_session *session) -{ - int32_t exit_code; - - mutex_lock(&session->exit_code_lock); - exit_code = session->exit_code; - mutex_unlock(&session->exit_code_lock); - if (exit_code) - dev_info(g_ctx.mcd, "%s session %x ec %d\n", __func__, - session->id, exit_code); - - return exit_code; -} - -int mcp_suspend(void) -{ - return mcp_set_sleep_mode_rq(MC_FLAG_REQ_TO_SLEEP); -} - -int mcp_resume(void) -{ - return mcp_set_sleep_mode_rq(MC_FLAG_NO_SLEEP_REQ); -} - -bool mcp_suspended(void) -{ - struct mcp_flags *flags = &mcp_ctx.mcp_buffer->mc_flags; - bool ret; - - mutex_lock(&mcp_ctx.buffer_lock); - ret = flags->sleep_mode.ready_to_sleep & MC_STATE_READY_TO_SLEEP; - if (!ret) { - MCDRV_DBG("IDLE=%d!", flags->schedule); - MCDRV_DBG("Request Sleep=%d!", flags->sleep_mode.sleep_req); - MCDRV_DBG("Sleep Ready=%d!", flags->sleep_mode.ready_to_sleep); - } - - mutex_unlock(&mcp_ctx.buffer_lock); - return ret; -} - -bool mcp_get_idle_timeout(int32_t *timeout) -{ - uint32_t schedule; - bool ret; - - mutex_lock(&mcp_ctx.buffer_lock); - schedule = mcp_ctx.mcp_buffer->mc_flags.schedule; - if (schedule == MC_FLAG_SCHEDULE_IDLE) { - if (g_ctx.f_timeout) - *timeout = mcp_ctx.mcp_buffer->mc_flags.timeout_ms; - else - *timeout = -1; - - ret = true; - } else { - ret = false; - } - - mutex_unlock(&mcp_ctx.buffer_lock); - return ret; -} - -void mcp_reset_idle_timeout(void) -{ - mutex_lock(&mcp_ctx.buffer_lock); - mcp_ctx.mcp_buffer->mc_flags.timeout_ms = -1; - mutex_unlock(&mcp_ctx.buffer_lock); -} - -static inline int wait_mcp_notification(void) -{ - unsigned long timeout = msecs_to_jiffies(MCP_TIMEOUT * 1000); - int try; - - /* - * Total timeout is MCP_TIMEOUT * MCP_RETRIES, but we check for a crash - * to try and terminate before then if things go wrong. - */ - for (try = 1; try <= MCP_RETRIES; try++) { - uint32_t status; - int ret; - - /* - * Wait non-interruptible to keep MCP synchronised even if caller - * is interrupted by signal. - */ - ret = wait_for_completion_timeout(&mcp_ctx.complete, timeout); - if (ret > 0) - return 0; - - MCDRV_ERROR("No answer after %ds", MCP_TIMEOUT * try); - - /* If SWd halted, exit now */ - if (!mc_fc_info(MC_EXT_INFO_ID_MCI_VERSION, &status, NULL) && - (status == MC_STATUS_HALT)) - break; - } - - /* mcp_message; - enum cmd_id cmd_id = cmd->cmd_header.cmd_id; - - mutex_lock(&mcp_ctx.queue_lock); - if (mcp_ctx.mcp_dead) - goto out; - - /* Copy message to MCP buffer */ - memcpy(msg, cmd, sizeof(*msg)); - - /* Poke tbase */ - err = mcp_notify(&mcp_ctx.mcp_session); - if (!err) - err = wait_mcp_notification(); - - if (err) - goto out; - - /* Check response ID */ - if (msg->rsp_header.rsp_id != (cmd_id | FLAG_RESPONSE)) { - MCDRV_ERROR("MCP command got invalid response (0x%X)", - msg->rsp_header.rsp_id); - err = -EBADE; - goto out; - } - - /* Convert result */ - switch (msg->rsp_header.result) { - case MC_MCP_RET_OK: - err = 0; - break; - case MC_MCP_RET_ERR_CLOSE_TASK_FAILED: - case MC_MCP_RET_ERR_NO_MORE_SESSIONS: - err = -EBUSY; - break; - case MC_MCP_RET_ERR_OUT_OF_RESOURCES: - err = -ENOSPC; - break; - case MC_MCP_RET_ERR_UNKNOWN_UUID: - err = -ENOENT; - break; - case MC_MCP_RET_ERR_WRONG_PUBLIC_KEY: - err = -EKEYREJECTED; - break; - case MC_MCP_RET_ERR_SERVICE_BLOCKED: - err = -ECONNREFUSED; - break; - case MC_MCP_RET_ERR_SERVICE_LOCKED: - err = -ECONNABORTED; - break; - case MC_MCP_RET_ERR_SERVICE_KILLED: - err = -ECONNRESET; - break; - default: - MCDRV_ERROR("cmd %d returned %d.", cmd_id, - msg->rsp_header.result); - err = -EPERM; - goto out; - } - - /* Copy response back to caller struct */ - memcpy(cmd, msg, sizeof(*cmd)); - -out: - mutex_unlock(&mcp_ctx.queue_lock); - return err; -} - -int mcp_get_version(struct mc_version_info *version_info) -{ - union mcp_message cmd; - int ret; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_GET_MOBICORE_VERSION; - ret = mcp_cmd(&cmd); - if (!ret) - memcpy(version_info, &cmd.rsp_get_version.version_info, - sizeof(*version_info)); - - return ret; -} - -int mcp_load_token(uintptr_t data, const struct mcp_buffer_map *map) -{ - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_LOAD_TOKEN; - cmd.cmd_load_token.wsm_data_type = map->type; - cmd.cmd_load_token.adr_load_data = map->phys_addr; - cmd.cmd_load_token.ofs_load_data = map->offset; - cmd.cmd_load_token.len_load_data = map->length; - return mcp_cmd(&cmd); -} - -int mcp_load_check(const struct tbase_object *obj, - const struct mcp_buffer_map *map) -{ - const union mclf_header *header; - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_CHECK_LOAD_TA; - /* Data */ - cmd.cmd_check_load.wsm_data_type = map->type; - cmd.cmd_check_load.adr_load_data = map->phys_addr; - cmd.cmd_check_load.ofs_load_data = map->offset; - cmd.cmd_check_load.len_load_data = map->length; - /* Header */ - header = (union mclf_header *)(obj->data + obj->header_length); - cmd.cmd_check_load.uuid = header->mclf_header_v2.uuid; - return mcp_cmd(&cmd); -} - -int mcp_open_session(struct mcp_session *session, - const struct tbase_object *obj, - const struct mcp_buffer_map *map, - const struct mcp_buffer_map *tci_map) -{ - static DEFINE_MUTEX(local_mutex); - const union mclf_header *header; - union mcp_message cmd; - int ret; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_OPEN_SESSION; - /* Data */ - cmd.cmd_open.wsm_data_type = map->type; - cmd.cmd_open.adr_load_data = map->phys_addr; - cmd.cmd_open.ofs_load_data = map->offset; - cmd.cmd_open.len_load_data = map->length; - /* Buffer */ - if (tci_map) { - cmd.cmd_open.wsmtype_tci = tci_map->type; - cmd.cmd_open.adr_tci_buffer = tci_map->phys_addr; - cmd.cmd_open.ofs_tci_buffer = tci_map->offset; - cmd.cmd_open.len_tci_buffer = tci_map->length; - } else { - cmd.cmd_open.wsmtype_tci = WSM_INVALID; - } - /* Header */ - header = (union mclf_header *)(obj->data + obj->header_length); - cmd.cmd_open.uuid = header->mclf_header_v2.uuid; - cmd.cmd_open.is_gpta = session->is_gp; - /* Reset unexpected notification */ - mutex_lock(&local_mutex); - mcp_ctx.unexp_notif.session_id = SID_MCP; /* Cannot be */ - if (!g_ctx.f_client_login) { - memcpy(&cmd.cmd_open.tl_header, header, - sizeof(cmd.cmd_open.tl_header)); - } else { - cmd.cmd_open.cmd_open_data.mclf_magic = MC_GP_CLIENT_AUTH_MAGIC; - if (session->is_gp) - cmd.cmd_open.cmd_open_data.identity = session->identity; - } - - /* Send MCP open command */ - ret = mcp_cmd(&cmd); - if (!ret) { - session->id = cmd.rsp_open.session_id; - /* Add to list of sessions */ - mutex_lock(&mcp_ctx.sessions_lock); - list_add(&session->list, &mcp_ctx.sessions); - mutex_unlock(&mcp_ctx.sessions_lock); - /* Check for spurious notification */ - mutex_lock(&mcp_ctx.unexp_notif_mutex); - if (mcp_ctx.unexp_notif.session_id == session->id) { - mutex_lock(&session->exit_code_lock); - session->exit_code = mcp_ctx.unexp_notif.payload; - mutex_unlock(&session->exit_code_lock); - complete(&session->completion); - } - - mutex_unlock(&mcp_ctx.unexp_notif_mutex); - } - - mutex_unlock(&local_mutex); - return ret; -} - -/* - * Legacy and GP TAs close differently: - * - GP TAs always send a notification with payload, whether on close or crash - * - Legacy TAs only send a notification with payload on crash - * - GP TAs may take time to close, and we get -EBUSY back from mcp_cmd - * - Legacy TAs always close when asked, unless they are driver in which case - * they just don't close at all - */ -int mcp_close_session(struct mcp_session *session) -{ - union mcp_message cmd; - int ret; - - /* state is either MCP_SESSION_RUNNING or MCP_SESSION_CLOSING_GP */ - mutex_lock(&mcp_ctx.sessions_lock); - if (session->state == MCP_SESSION_RUNNING) - session->state = MCP_SESSION_CLOSE_PREPARE; - - mutex_unlock(&mcp_ctx.sessions_lock); - /* Signal an eventual waiter that SWd session is going away */ - complete(&session->completion); - /* Send MCP command */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_CLOSE_SESSION; - cmd.cmd_close.session_id = session->id; - ret = mcp_cmd(&cmd); - mutex_lock(&mcp_ctx.sessions_lock); - /* - * The GP TA may already have sent its exit code, in which case the - * state has also been changed to MCP_SESSION_CLOSE_NOTIFIED. - */ - if (!ret) { - session->state = MCP_SESSION_CLOSED; - list_del(&session->list); - mutex_lock(&mcp_ctx.notifications_mutex); - list_del(&session->notifications_list); - mutex_unlock(&mcp_ctx.notifications_mutex); - } else if (ret == -EBUSY) { - if (session->state == MCP_SESSION_CLOSE_NOTIFIED) - /* GP TA already closed */ - schedule_work(&session->close_work); - - session->state = MCP_SESSION_CLOSING_GP; - } else { - /* Something is not right, assume session is still running */ - session->state = MCP_SESSION_RUNNING; - } - - mutex_unlock(&mcp_ctx.sessions_lock); - return ret; -} - -int mcp_map(uint32_t session_id, struct mcp_buffer_map *map) -{ - union mcp_message cmd; - int ret; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_MAP; - cmd.cmd_map.session_id = session_id; - cmd.cmd_map.wsm_type = map->type; - cmd.cmd_map.adr_buffer = map->phys_addr; - cmd.cmd_map.ofs_buffer = map->offset; - cmd.cmd_map.len_buffer = map->length; - ret = mcp_cmd(&cmd); - if (!ret) - map->secure_va = cmd.rsp_map.secure_va; - - return ret; -} - -int mcp_unmap(uint32_t session_id, const struct mcp_buffer_map *map) -{ - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_UNMAP; - cmd.cmd_unmap.session_id = session_id; - cmd.cmd_unmap.wsm_type = map->type; - cmd.cmd_unmap.virtual_buffer_len = map->length; - cmd.cmd_unmap.secure_va = map->secure_va; - return mcp_cmd(&cmd); -} - -int mcp_multimap(uint32_t session_id, struct mcp_buffer_map *maps) -{ - struct mcp_buffer_map *map = maps; - union mcp_message cmd; - struct buffer_map *buf = cmd.cmd_multimap.bufs; - int ret = 0; - uint32_t i; - - /* Prepare command */ - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_MULTIMAP; - cmd.cmd_multimap.session_id = session_id; - for (i = 0; i < MC_MAP_MAX; i++, map++, buf++) { - buf->wsm_type = map->type; - buf->adr_buffer = map->phys_addr; - buf->ofs_buffer = map->offset; - buf->len_buffer = map->length; - } - - ret = mcp_cmd(&cmd); - if (ret) - return ret; - - /* Return secure virtual addresses */ - map = maps; - for (i = 0; i < MC_MAP_MAX; i++, map++) - map->secure_va = cmd.rsp_multimap.secure_va[i]; - - return 0; -} - -int mcp_multiunmap(uint32_t session_id, const struct mcp_buffer_map *maps) -{ - const struct mcp_buffer_map *map = maps; - union mcp_message cmd; - struct buffer_unmap *buf = cmd.cmd_multiunmap.bufs; - uint32_t i; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_MULTIUNMAP; - cmd.cmd_multiunmap.session_id = session_id; - for (i = 0; i < MC_MAP_MAX; i++, map++, buf++) { - buf->secure_va = map->secure_va; - buf->len_buffer = map->length; - } - - return mcp_cmd(&cmd); -} - -static int mcp_close(void) -{ - union mcp_message cmd; - - memset(&cmd, 0, sizeof(cmd)); - cmd.cmd_header.cmd_id = MC_MCP_CMD_CLOSE_MCP; - return mcp_cmd(&cmd); -} - -static inline bool notif_queue_full(void) -{ - struct notification_queue *tx = mcp_ctx.nq.tx; - - return (tx->hdr.write_cnt - tx->hdr.read_cnt) == tx->hdr.queue_size; -} - -static inline void notif_queue_push(uint32_t session_id) -{ - struct notification_queue_header *hdr = &mcp_ctx.nq.tx->hdr; - uint32_t i = hdr->write_cnt % hdr->queue_size; - - mcp_ctx.nq.tx->notification[i].session_id = session_id; - mcp_ctx.nq.tx->notification[i].payload = 0; - hdr->write_cnt++; -} - -static inline bool mcp_notifications_flush_nolock(void) -{ - bool flushed = false; - - while (!list_empty(&mcp_ctx.notifications) && !notif_queue_full()) { - struct mcp_session *session; - - session = list_first_entry(&mcp_ctx.notifications, - struct mcp_session, - notifications_list); - dev_dbg(g_ctx.mcd, "pop %x\n", session->id); - notif_queue_push(session->id); - list_del_init(&session->notifications_list); - flushed = true; - } - - return flushed; -} - -bool mcp_notifications_flush(void) -{ - bool flushed = false; - - mutex_lock(&mcp_ctx.notifications_mutex); - flushed = mcp_notifications_flush_nolock(); - mutex_unlock(&mcp_ctx.notifications_mutex); - return flushed; -} - -int mcp_notify(struct mcp_session *session) -{ - int ret = 0; - - if (!mcp_ctx.scheduler_cb) - return -EAGAIN; - - mutex_lock(&mcp_ctx.notifications_mutex); - if (session->id == SID_MCP) - dev_dbg(g_ctx.mcd, "notify MCP"); - else - dev_dbg(g_ctx.mcd, "notify %x", session->id); - - /* Notify TEE */ - if (!list_empty(&mcp_ctx.notifications) || notif_queue_full()) { - if (!list_empty(&session->notifications_list)) { - ret = -EAGAIN; - dev_dbg(g_ctx.mcd, "skip %x\n", session->id); - } else { - list_add(&session->notifications_list, - &mcp_ctx.notifications); - dev_dbg(g_ctx.mcd, "push %x\n", session->id); - } - - mcp_notifications_flush_nolock(); - - if (mcp_ctx.scheduler_cb(MCP_YIELD)) { - MCDRV_ERROR("MC_SMC_N_YIELD failed"); - ret = -EPROTO; - } - } else { - notif_queue_push(session->id); - if (mcp_ctx.scheduler_cb(MCP_NSIQ)) { - MCDRV_ERROR("MC_SMC_N_SIQ failed"); - ret = -EPROTO; - } - } - - mutex_unlock(&mcp_ctx.notifications_mutex); - return ret; -} - -static inline void handle_mcp_notif(uint32_t exit_code) -{ - dev_dbg(g_ctx.mcd, "notification from MCP ec %d\n", exit_code); - complete(&mcp_ctx.complete); -} - -static inline void handle_session_notif(uint32_t session_id, uint32_t exit_code) -{ - struct mcp_session *session = NULL, *s; - - dev_dbg(g_ctx.mcd, "notification from %x ec %d\n", session_id, - exit_code); - mutex_lock(&mcp_ctx.sessions_lock); - list_for_each_entry(s, &mcp_ctx.sessions, list) { - if (s->id == session_id) { - session = s; - break; - } - } - - if (session) { - /* TA has terminated */ - if (exit_code) { - /* Update exit code, or not */ - mutex_lock(&session->exit_code_lock); - /* - * In GP, the only way to recover the sessions exit code - * is to call TEEC_InvokeCommand which will notify. But - * notifying a dead session would change the exit code - * to ERR_SID_NOT_ACTIVE, hence the check below. - */ - if (!session->is_gp || !session->exit_code || - (exit_code != ERR_SID_NOT_ACTIVE)) - session->exit_code = exit_code; - - mutex_unlock(&session->exit_code_lock); - - /* Update state or schedule close worker */ - if (session->state == MCP_SESSION_CLOSE_PREPARE) - session->state = MCP_SESSION_CLOSE_NOTIFIED; - else if (session->state == MCP_SESSION_CLOSING_GP) - schedule_work(&session->close_work); - } - - /* Unblock waiter */ - complete(&session->completion); - } - mutex_unlock(&mcp_ctx.sessions_lock); - - /* Unknown session, probably being started */ - if (!session) { - mutex_lock(&mcp_ctx.unexp_notif_mutex); - mcp_ctx.unexp_notif.session_id = session_id; - mcp_ctx.unexp_notif.payload = exit_code; - mutex_unlock(&mcp_ctx.unexp_notif_mutex); - } -} - -static void mc_irq_worker(struct work_struct *data) -{ - struct notification_queue *rx = mcp_ctx.nq.rx; - - /* Deal with all pending notifications in one go */ - while ((rx->hdr.write_cnt - rx->hdr.read_cnt) > 0) { - struct notification nf; - - nf = rx->notification[rx->hdr.read_cnt++ % rx->hdr.queue_size]; - if (nf.session_id == SID_MCP) - handle_mcp_notif(nf.payload); - else - handle_session_notif(nf.session_id, nf.payload); - } - - /* - * Finished processing notifications. It does not matter whether - * there actually were any notification or not. S-SIQs can also - * be triggered by an SWd driver which was waiting for a FIQ. - * In this case the S-SIQ tells NWd that SWd is no longer idle - * an will need scheduling again. - */ - if (mcp_ctx.scheduler_cb) - mcp_ctx.scheduler_cb(MCP_NSIQ); -} - -/* - * This function represents the interrupt function of the mcDrvModule. - * It signals by incrementing of an event counter and the start of the read - * waiting queue, the read function a interrupt has occurred. - */ -static irqreturn_t irq_handler(int intr, void *arg) -{ - /* wake up thread to continue handling this interrupt */ - schedule_work(&irq_work); - return IRQ_HANDLED; -} - -void mcp_register_scheduler(int (*scheduler_cb)(enum mcp_scheduler_commands)) -{ - mcp_ctx.scheduler_cb = scheduler_cb; -} - -void mcp_register_crashhandler(void (*crashhandler_cb)(void)) -{ - mcp_ctx.crashhandler_cb = crashhandler_cb; -} - -int mcp_start(void) -{ - size_t q_len = ALIGN(2 * (sizeof(struct notification_queue_header) + - NQ_NUM_ELEMS * sizeof(struct notification)), 4); - int ret; - - /* Make sure we have an interrupt number before going on */ -#if defined(CONFIG_OF) - mcp_ctx.irq = irq_of_parse_and_map(g_ctx.mcd->of_node, 0); -#endif -#if defined(MC_INTR_SSIQ) - if (mcp_ctx.irq <= 0) - mcp_ctx.irq = MC_INTR_SSIQ; -#endif - - if (mcp_ctx.irq <= 0) { - MCDRV_ERROR("No IRQ number, aborting"); - return -EINVAL; - } - - /* Call the INIT fastcall to setup shared buffers */ - ret = mc_fc_init(virt_to_phys(mcp_ctx.base), - (uintptr_t)mcp_ctx.mcp_buffer - - (uintptr_t)mcp_ctx.base, - q_len, sizeof(*mcp_ctx.mcp_buffer)); - if (ret) - return ret; - - /* First empty N-SIQ to setup of the MCI structure */ - ret = mc_fc_nsiq(); - if (ret) - return ret; - - /* - * Wait until (uint16_t)-1) { - MCDRV_DBG_WARN("queues too large (more than 64k), sorry..."); - return -EINVAL; - } - - mcp_ctx.order = get_order(q_len + sizeof(*mcp_ctx.mcp_buffer)); - mci = __get_free_pages(GFP_USER | __GFP_ZERO, mcp_ctx.order); - if (!mci) - return -ENOMEM; - - mcp_ctx.nq.tx = (struct notification_queue *)mci; - mcp_ctx.nq.tx->hdr.queue_size = NQ_NUM_ELEMS; - mci += sizeof(struct notification_queue_header) + - mcp_ctx.nq.tx->hdr.queue_size * sizeof(struct notification); - - mcp_ctx.nq.rx = (struct notification_queue *)mci; - mcp_ctx.nq.rx->hdr.queue_size = NQ_NUM_ELEMS; - mci += sizeof(struct notification_queue_header) + - mcp_ctx.nq.rx->hdr.queue_size * sizeof(struct notification); - - mcp_ctx.mcp_buffer = (void *)ALIGN(mci, 4); - return 0; -} - -void mcp_exit(void) -{ - mark_mcp_dead(); - if (mcp_ctx.dump.off) - kfree(mcp_ctx.dump.buf); - - free_pages((unsigned long)mcp_ctx.base, mcp_ctx.order); -} diff --git a/drivers/gud/MobiCoreDriver/mcp.h b/drivers/gud/MobiCoreDriver/mcp.h deleted file mode 100644 index 0eefe573de8bf..0000000000000 --- a/drivers/gud/MobiCoreDriver/mcp.h +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _MC_MCP_H_ -#define _MC_MCP_H_ - -#include "mci/mcloadformat.h" /* struct identity */ - -/* Structure to hold the TA/driver descriptor to pass to MCP */ -struct tbase_object { - uint32_t length; /* Total length */ - uint32_t header_length; /* Length of header before payload */ - uint8_t data[]; /* Header followed by payload */ -}; - -/* Structure to hold all mapped buffer data to pass to MCP */ -struct mcp_buffer_map { - uint64_t phys_addr; /** Page-aligned physical address */ - uint64_t secure_va; /** Page-aligned physical address */ - uint32_t offset; /** Data offset inside the first page */ - uint32_t length; /** Length of the data */ - uint32_t type; /** Type of MMU */ -}; - -struct mcp_session { - /* Work descriptor to handle delayed closing, set by upper layer */ - struct work_struct close_work; - /* Sessions list (protected by mcp sessions_lock) */ - struct list_head list; - /* Notifications list (protected by mcp notifications_mutex) */ - struct list_head notifications_list; - /* Notification waiter lock */ - struct mutex notif_wait_lock; /* Only one at a time */ - /* Notification received */ - struct completion completion; - /* Notification lock */ - struct mutex exit_code_lock; - /* Last notification */ - int32_t exit_code; - /* Session id */ - uint32_t id; - /* Session state (protected by mcp sessions_lock) */ - enum mcp_session_state { - MCP_SESSION_RUNNING, - MCP_SESSION_CLOSE_PREPARE, - MCP_SESSION_CLOSE_NOTIFIED, - MCP_SESSION_CLOSING_GP, - MCP_SESSION_CLOSED, - } state; - /* This TA is of Global Platform type, set by upper layer */ - bool is_gp; - /* GP TAs have login information */ - struct identity identity; -}; - -/* Init for the mcp_session structure */ -void mcp_session_init(struct mcp_session *session, bool is_gp, - const struct identity *identity); -int mcp_session_waitnotif(struct mcp_session *session, int32_t timeout); -int32_t mcp_session_exitcode(struct mcp_session *mcp_session); - -/* SWd suspend/resume */ -int mcp_suspend(void); -int mcp_resume(void); -bool mcp_suspended(void); - -/* Callback to scheduler registration */ -enum mcp_scheduler_commands { - MCP_YIELD, - MCP_NSIQ, -}; - -void mcp_register_scheduler(int (*scheduler_cb)(enum mcp_scheduler_commands)); -bool mcp_notifications_flush(void); -void mcp_register_crashhandler(void (*crashhandler_cb)(void)); - -/* - * Get the requested SWd sleep timeout value (ms) - * - if the timeout is -1, wait indefinitely - * - if the timeout is 0, re-schedule immediately (timeouts in µs in the SWd) - * - otherwise sleep for the required time - * returns true if sleep is required, false otherwise - */ -bool mcp_get_idle_timeout(int32_t *timeout); -void mcp_reset_idle_timeout(void); - -/* MCP commands */ -int mcp_get_version(struct mc_version_info *version_info); -int mcp_load_token(uintptr_t data, const struct mcp_buffer_map *buffer_map); -int mcp_load_check(const struct tbase_object *obj, - const struct mcp_buffer_map *buffer_map); -int mcp_open_session(struct mcp_session *session, - const struct tbase_object *obj, - const struct mcp_buffer_map *map, - const struct mcp_buffer_map *tci_map); -int mcp_close_session(struct mcp_session *session); -int mcp_map(uint32_t session_id, struct mcp_buffer_map *buffer_map); -int mcp_unmap(uint32_t session_id, const struct mcp_buffer_map *buffer_map); -int mcp_multimap(uint32_t session_id, struct mcp_buffer_map *buffer_maps); -int mcp_multiunmap(uint32_t session_id, - const struct mcp_buffer_map *buffer_maps); -int mcp_notify(struct mcp_session *mcp_session); - -/* MCP initialisation/cleanup */ -int mcp_init(void); -void mcp_exit(void); -int mcp_start(void); -void mcp_stop(void); - -#endif /* _MC_MCP_H_ */ diff --git a/drivers/gud/MobiCoreDriver/mmu.c b/drivers/gud/MobiCoreDriver/mmu.c deleted file mode 100644 index fc769be4d15db..0000000000000 --- a/drivers/gud/MobiCoreDriver/mmu.c +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "mci/mcimcp.h" - -#include "platform.h" /* CONFIG_TRUSTONIC_TEE_LPAE */ -#include "main.h" -#include "debug.h" -#include "mcp.h" /* mcp_buffer_map */ -#include "mmu.h" - -#ifdef CONFIG_TRUSTONIC_TEE_LPAE -#define MMU_TYPE_PAGE (3 << 0) -#define MMU_BUFFERABLE BIT(2) /* AttrIndx[0] */ -#define MMU_CACHEABLE BIT(3) /* AttrIndx[1] */ -#define MMU_NS BIT(5) -#define MMU_AP_RW_ALL BIT(6) /* AP[2:1], RW, at any privilege level */ -#define MMU_EXT_SHARED (3 << 8) /* SH[1:0], inner shareable */ -#define MMU_EXT_AF BIT(10) /* Access Flag */ -#define MMU_EXT_NG BIT(11) -#define MMU_EXT_XN (((uint64_t)1) << 54) /* XN */ -#else -#define MMU_TYPE_EXT (3 << 0) /* v5 */ -#define MMU_TYPE_SMALL (2 << 0) -#define MMU_BUFFERABLE BIT(2) -#define MMU_CACHEABLE BIT(3) -#define MMU_EXT_AP0 BIT(4) -#define MMU_EXT_AP1 (2 << 4) -#define MMU_EXT_TEX(x) ((x) << 6) /* v5 */ -#define MMU_EXT_SHARED BIT(10) /* v6 */ -#define MMU_EXT_NG BIT(11) /* v6 */ -#endif - -/* - * MobiCore specific page tables for world shared memory. - * Linux uses shadow page tables, see arch/arm/include/asm/pgtable-2level. - * MobiCore uses the default ARM format. - * - * Number of page table entries in one L2 MMU table. This is ARM specific, an - * MMU table covers 1 MiB by using 256 entries referring to 4KiB pages each. - */ -#define L2_ENTRIES_MAX 256 - -/* - * Small buffers (below 1MiB) are mapped using the legacy L2 table, but bigger - * buffers now use a fake L1 table that holds 64-bit pointers to L2 tables. As - * this must be exactly one page, we can hold up to 512 entries. - */ -#define L1_ENTRIES_MAX 512 - -#ifdef CONFIG_TRUSTONIC_TEE_LPAE - -/* - * Secure world uses 64-bit physical addresses - */ -typedef u64 tbase_pte_t; - -/* - * Linux uses different mappings for SMP systems(the sharing flag is set for - * the pte. In order not to confuse things too much in Mobicore make sure the - * shared buffers have the same flags. This should also be done in SWD side. - */ -static tbase_pte_t pte_flags = MMU_BUFFERABLE | MMU_CACHEABLE | MMU_EXT_NG | -#ifdef CONFIG_SMP - MMU_EXT_SHARED | -#endif /* CONFIG_SMP */ - MMU_EXT_XN | MMU_EXT_AF | MMU_AP_RW_ALL | - MMU_NS | MMU_TYPE_PAGE; - -#else /* CONFIG_TRUSTONIC_TEE_LPAE */ - -/* - * Secure world uses 32-bit physical addresses - */ -typedef u32 tbase_pte_t; - -/* - * Linux uses different mappings for SMP systems(the sharing flag is set for - * the pte. In order not to confuse things too much in Mobicore make sure the - * shared buffers have the same flags. This should also be done in SWD side. - */ -static tbase_pte_t pte_flags = MMU_BUFFERABLE | MMU_CACHEABLE | MMU_EXT_NG | -#ifdef CONFIG_SMP - MMU_EXT_SHARED | MMU_EXT_TEX(1) | -#endif /* CONFIG_SMP */ - MMU_EXT_AP1 | MMU_EXT_AP0 | - MMU_TYPE_SMALL | MMU_TYPE_EXT; - -#endif /* !CONFIG_TRUSTONIC_TEE_LPAE */ - -/* - * Fake L1 MMU table. - */ -union l1_table { - u64 *pages_phys; /* Array of physical page addresses */ - unsigned long page; -}; - -/* - * L2 MMU table, which is more a L3 table in the LPAE case. - */ -union l2_table { - tbase_pte_t *ptes; /* Array of PTEs */ - unsigned long page; -}; - -/* - * MMU table allocated to the Daemon or a TLC describing a world shared - * buffer. - * When users map a malloc()ed area into SWd, a MMU table is allocated. - * In addition, the area of maximum 1MB virtual address space is mapped into - * the MMU table and a handle for this table is returned to the user. - */ -struct tbase_mmu { - union l2_table l2_tables[L1_ENTRIES_MAX]; /* L2 tables */ - size_t l2_tables_nr; /* Actual number of L2 tables */ - union l1_table l1_table; /* Fake L1 table */ - union l2_table l1_l2_table; /* L2 table for the L1 table */ - uint32_t offset; - uint32_t length; - bool user; /* Pages are from user space */ -}; - -static void free_all_pages(struct tbase_mmu *mmu_table) -{ - union l2_table *l2_table = &mmu_table->l2_tables[0]; - size_t i; - - for (i = 0; i < mmu_table->l2_tables_nr; i++, l2_table++) { - if (!l2_table->page) - break; - - free_page(l2_table->page); - } - - if (mmu_table->l1_l2_table.page) - free_page(mmu_table->l1_l2_table.page); - - if (mmu_table->l1_table.page) - free_page(mmu_table->l1_table.page); -} - -/* - * Create a MMU table for a buffer or trustlet. - */ -static inline int map_buffer(struct task_struct *task, const void *data, - unsigned int length, struct tbase_mmu *mmu_table) -{ - const void *reader = (const void *)((uintptr_t)data & PAGE_MASK); - struct page **pages; /* Same as above, conveniently typed */ - unsigned long pages_page; /* Page to contain the page pointers */ - size_t chunk; - unsigned long total_pages_nr; - int l1_entries_max; - int ret = 0; - - /* Check that we have enough space to map data */ - mmu_table->length = length; - mmu_table->offset = (uintptr_t)data & ~PAGE_MASK; - total_pages_nr = PAGE_ALIGN(mmu_table->offset + length) / PAGE_SIZE; - if (g_ctx.f_mem_ext) - l1_entries_max = L1_ENTRIES_MAX; - else - l1_entries_max = 1; - - if (total_pages_nr > (l1_entries_max * L2_ENTRIES_MAX)) { - dev_err(g_ctx.mcd, "data mapping exceeds %d pages", - l1_entries_max * L2_ENTRIES_MAX); - return -EINVAL; - } - - /* Get number of L2 tables needed */ - mmu_table->l2_tables_nr = (total_pages_nr + L2_ENTRIES_MAX - 1) / - L2_ENTRIES_MAX; - dev_dbg(g_ctx.mcd, "total_pages_nr %lu l2_tables_nr %zu", - total_pages_nr, mmu_table->l2_tables_nr); - - /* Get a page to store page pointers */ - pages_page = get_zeroed_page(GFP_KERNEL); - if (!pages_page) - return -ENOMEM; - - pages = (struct page **)pages_page; - - /* Allocate a page for the L1 table */ - if (mmu_table->l2_tables_nr > 1) { - tbase_pte_t *pte; - - mmu_table->l1_table.page = get_zeroed_page(GFP_KERNEL); - mmu_table->l1_l2_table.page = get_zeroed_page(GFP_KERNEL); - if (!mmu_table->l1_table.page || !mmu_table->l1_l2_table.page) { - ret = -ENOMEM; - goto end; - } - - /* Map it */ - pte = &mmu_table->l1_l2_table.ptes[0]; - *pte = virt_to_phys(mmu_table->l1_table.pages_phys); - *pte |= pte_flags; - } - - for (chunk = 0; chunk < mmu_table->l2_tables_nr; chunk++) { - unsigned long pages_nr, i; - tbase_pte_t *pte; - struct page **page_ptr; - - /* Size to map for this chunk */ - if (chunk == (mmu_table->l2_tables_nr - 1)) - pages_nr = ((total_pages_nr - 1) % L2_ENTRIES_MAX) + 1; - else - pages_nr = L2_ENTRIES_MAX; - - /* Allocate a page for the MMU descriptor */ - mmu_table->l2_tables[chunk].page = get_zeroed_page(GFP_KERNEL); - if (!mmu_table->l2_tables[chunk].page) { - ret = -ENOMEM; - goto end; - } - - /* Add page address to L1 table if needed */ - if (mmu_table->l1_table.page) - mmu_table->l1_table.pages_phys[chunk] = - virt_to_phys(mmu_table->l2_tables[chunk].ptes); - - /* Get pages */ - if (task) { - long gup_ret; - - /* Buffer was allocated in user space */ - down_read(&task->mm->mmap_sem); - gup_ret = get_user_pages(task, task->mm, - (uintptr_t)reader, pages_nr, - 1, 0, pages, 0); - reader += pages_nr * PAGE_SIZE; - up_read(&task->mm->mmap_sem); - if (gup_ret < 0) { - ret = gup_ret; - dev_err(g_ctx.mcd, - "failed to get user pages: %d", ret); - goto end; - } - - /* check if we could lock all pages. */ - if (gup_ret != pages_nr) { - dev_err(g_ctx.mcd, - "get_user_pages() failed, ret: %ld", - gup_ret); - release_pages(pages, gup_ret, 0); - ret = -ENOMEM; - goto end; - } - - mmu_table->user = true; - } else if (is_vmalloc_addr(data)) { - /* Buffer vmalloc'ed in kernel space */ - page_ptr = &pages[0]; - for (i = 0; i < pages_nr; i++) { - struct page *page = vmalloc_to_page(reader); - - if (!page) { - dev_err(g_ctx.mcd, - "failed to map address"); - ret = -EINVAL; - goto end; - } - - *page_ptr++ = page; - reader += PAGE_SIZE; - } - } else { - /* Buffer kmalloc'ed in kernel space */ - struct page *page = virt_to_page(reader); - - reader += pages_nr * PAGE_SIZE; - page_ptr = &pages[0]; - for (i = 0; i < pages_nr; i++) - *page_ptr++ = page++; - } - - /* Create MMU Table entries */ - page_ptr = &pages[0]; - pte = &mmu_table->l2_tables[chunk].ptes[0]; - for (i = 0; i < pages_nr; i++, page_ptr++, pte++) { - /* - * Create MMU table entry, see ARM MMU docu for details - * about flags stored in the lowest 12 bits. As a side - * reference, the Article "ARM's multiply-mapped memory - * mess" found in the collection at - * http://lwn.net/Articles/409032/ is also worth reading. - */ - unsigned long phys = page_to_phys(*page_ptr); -#if defined CONFIG_ARM64 && !defined CONFIG_TRUSTONIC_TEE_LPAE - if (phys & 0xffffffff00000000) { - dev_err(g_ctx.mcd, - "Pointer too big for non-LPAE: 0x%16lx", - phys); - ret = -EFAULT; - goto end; - } -#endif - *pte = phys; - *pte |= pte_flags; - } - } - -end: - if (ret) - free_all_pages(mmu_table); - - free_page(pages_page); - return ret; -} - -static inline void unmap_buffer(struct tbase_mmu *mmu_table) -{ - int t; - - dev_dbg(g_ctx.mcd, "clear MMU table, virt %p", mmu_table); - if (!mmu_table->user) - goto end; - - /* Release all locked user space pages */ - for (t = 0; t < mmu_table->l2_tables_nr; t++) { - tbase_pte_t *pte = mmu_table->l2_tables[t].ptes; - int i; - - for (i = 0; i < L2_ENTRIES_MAX; i++, pte++) { - struct page *page; - - /* If not all entries are used, unused ones are 0 */ - if (!*pte) - break; - - /* pte_page() cannot return NULL */ - page = pte_page(*pte); - dev_dbg(g_ctx.mcd, "MMU entry %d: 0x%llx, virt %p", - i, (u64)*pte, page); - - page_cache_release(page); - } - } - -end: - free_all_pages(mmu_table); -} - -/* - * Delete a MMU table. - */ -void tbase_mmu_delete(struct tbase_mmu *mmu) -{ - if (WARN(!mmu, "NULL mmu pointer given")) - return; - - unmap_buffer(mmu); - MCDRV_DBG("freed mmu %p: %s len %u off %u table %lx type L%d", - mmu, mmu->user ? "user" : "kernel", mmu->length, mmu->offset, - (uintptr_t)(mmu->l1_table.page ? mmu->l1_l2_table.ptes : - mmu->l2_tables[0].ptes), - mmu->l1_table.page ? 1 : 2); - kfree(mmu); -} - -/* - * Allocate MMU table and map buffer into it. - * That is, create respective table entries. - */ -struct tbase_mmu *tbase_mmu_create(struct task_struct *task, - const void *addr, - unsigned int length) -{ - struct tbase_mmu *mmu; - int ret; - - /* Check input arguments */ - if (WARN(!addr, "data address is NULL")) - return ERR_PTR(-EINVAL); - - if (WARN(!length, "data length is 0")) - return ERR_PTR(-EINVAL); - - /* Allocate the struct */ - mmu = kmalloc(sizeof(*mmu), GFP_KERNEL | __GFP_ZERO); - if (!mmu) - return ERR_PTR(-ENOMEM); - - /* Create the MMU mapping for the data */ - ret = map_buffer(task, addr, length, mmu); - if (ret) { - kfree(mmu); - return ERR_PTR(ret); - } - - MCDRV_DBG("created mmu %p: %s addr %p len %u off %u table %lx type L%d", - mmu, mmu->user ? "user" : "kernel", addr, mmu->length, - mmu->offset, - (uintptr_t)(mmu->l1_table.page ? mmu->l1_l2_table.ptes : - mmu->l2_tables[0].ptes), - mmu->l1_table.page ? 1 : 2); - return mmu; -} - -void tbase_mmu_buffer(const struct tbase_mmu *mmu, struct mcp_buffer_map *map) -{ - if (mmu->l1_table.page) { - map->phys_addr = virt_to_phys(mmu->l1_l2_table.ptes); - map->type = WSM_L1; - } else { - map->phys_addr = virt_to_phys(mmu->l2_tables[0].ptes); - map->type = WSM_L2; - } - - map->secure_va = 0; - map->offset = mmu->offset; - map->length = mmu->length; -} - -int tbase_mmu_info(const struct tbase_mmu *mmu, struct kasnprintf_buf *buf) -{ - return kasnprintf(buf, - "\t\t\tmmu %p: %s len %u off %u table %lx type L%d\n", - mmu, mmu->user ? "user" : "kernel", mmu->length, - mmu->offset, - (uintptr_t)(mmu->l1_table.page ? - mmu->l1_l2_table.ptes : mmu->l2_tables[0].ptes), - mmu->l1_table.page ? 1 : 2); -} diff --git a/drivers/gud/MobiCoreDriver/mmu.h b/drivers/gud/MobiCoreDriver/mmu.h deleted file mode 100644 index 09efea480bef8..0000000000000 --- a/drivers/gud/MobiCoreDriver/mmu.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _TBASE_MEM_H_ -#define _TBASE_MEM_H_ - -struct tbase_mmu; -struct mcp_buffer_map; - -/* - * Allocate MMU table and map buffer into it. - * That is, create respective table entries. - */ -struct tbase_mmu *tbase_mmu_create(struct task_struct *task, - const void *wsm_buffer, - unsigned int wsm_len); - -/* - * Delete a used MMU table. - */ -void tbase_mmu_delete(struct tbase_mmu *mmu); - -/* - * Fill in buffer info for MMU table. - */ -void tbase_mmu_buffer(const struct tbase_mmu *mmu, struct mcp_buffer_map *map); - -/* - * Add info to debug buffer. - */ -int tbase_mmu_info(const struct tbase_mmu *mmu, struct kasnprintf_buf *buf); - -#endif /* _TBASE_MEM_H_ */ diff --git a/drivers/gud/MobiCoreDriver/platform.h b/drivers/gud/MobiCoreDriver/platform.h deleted file mode 100644 index f9c801450f64e..0000000000000 --- a/drivers/gud/MobiCoreDriver/platform.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * 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. - * - * 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 _MC_PLATFORM_H_ -#define _MC_PLATFORM_H_ - -/* MobiCore Interrupt for Qualcomm (DT IRQ has priority if present) */ -#define MC_INTR_SSIQ 280 - -/* Use SMC for fastcalls */ -#define MC_SMC_FASTCALL - -#include - -/*--------------- Implementation -------------- */ -#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || \ - defined(CONFIG_ARCH_MSM8994) || defined(CONFIG_ARCH_MSM8909) || \ - defined(CONFIG_ARCH_MSM8996) - -#include - -#if defined(CONFIG_ARM64) || defined(CONFIG_ARCH_MSM8916) - - #include - #include - #include - #include - #include - #include - - #define SCM_MOBIOS_FNID(s, c) (((((s) & 0xFF) << 8) | ((c) & 0xFF)) \ - | 0x33000000) - - #define TZ_EXECUTIVE_EXT_ID_PARAM_ID \ - TZ_SYSCALL_CREATE_PARAM_ID_4( \ - TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ - TZ_SYSCALL_PARAM_TYPE_VAL, \ - TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ - TZ_SYSCALL_PARAM_TYPE_VAL) - -#endif - -#else -#include -#endif - -/* from following file */ -#define SCM_SVC_MOBICORE 250 -#define SCM_CMD_MOBICORE 1 - -static inline int smc_fastcall(void *fc_generic, size_t size) -{ -#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || \ - defined(CONFIG_ARCH_MSM8994) || defined(CONFIG_ARCH_MSM8996) - if (is_scm_armv8()) { - struct scm_desc desc = {0}; - int ret; - void *scm_buf = NULL; - - scm_buf = kzalloc(PAGE_ALIGN(size), GFP_KERNEL); - if (!scm_buf) - return -ENOMEM; - memcpy(scm_buf, fc_generic, size); - dmac_flush_range(scm_buf, scm_buf + size); - - desc.arginfo = TZ_EXECUTIVE_EXT_ID_PARAM_ID; - desc.args[0] = virt_to_phys(scm_buf); - desc.args[1] = (u32)size; - desc.args[2] = virt_to_phys(scm_buf); - desc.args[3] = (u32)size; - - ret = scm_call2( - SCM_MOBIOS_FNID(SCM_SVC_MOBICORE, SCM_CMD_MOBICORE), - &desc); - - dmac_flush_range(scm_buf, scm_buf + size); - - memcpy(fc_generic, scm_buf, size); - kfree(scm_buf); - return ret; - } -#endif - - return scm_call(SCM_SVC_MOBICORE, SCM_CMD_MOBICORE, - fc_generic, size, - fc_generic, size); -} - -/* Fastcall value should be the one for armv7, even if on armv8, - * as long as the __aarch32__ flag is not activated in SW. - * But for 8996, architecture is armv8 with __aarch32__ in Sw. - */ -#if !defined(CONFIG_ARCH_MSM8996) -#define MC_ARMV7_FC -#endif - -#if defined(CONFIG_ARCH_MSM8996) -#define CONFIG_TRUSTONIC_TEE_LPAE -#endif - -/* - * Perform crypto clock enable/disable - * of clocks - * "bus_clk" - * "core_clk" - * "iface_clk" - */ -#if (!defined(CONFIG_ARCH_MSM8960) && !defined(CONFIG_ARCH_MSM8994)) || \ - defined(CONFIG_ARCH_MSM8996) -#define MC_CRYPTO_CLOCK_MANAGEMENT -#endif - -/* - * Perform clock enable/disable for clock "core_clk_src" - */ -#if defined(CONFIG_ARCH_MSM8916) || defined(CONFIG_ARCH_MSM8909) || \ - defined(CONFIG_ARCH_MSM8996) -#define MC_DEVICE_PROPNAME "qcom,mcd" -#if defined(MC_CRYPTO_CLOCK_MANAGEMENT) -#define MC_CLOCK_CORESRC_PROPNAME "qcom,ce-opp-freq" -#define MC_CLOCK_CORESRC_DEFAULTRATE 100000000 -#endif /* MC_CRYPTO_CLOCK_MANAGEMENT */ -#endif - - -#if !defined(CONFIG_ARCH_MSM8996) -/* uid/gid behave like old kernels but with new types */ -/* This flag does not exist on 8996 3.10 kernel version */ -#if !defined(CONFIG_UIDGID_STRICT_TYPE_CHECKS) -#define MC_UIDGID_OLDSTYLE -#endif -/* Fastcall value should be the one for armv7, even if on armv8, - * as long as the __aarch32__ flag is not activated in SW. - * But for 8996, architecture is armv8 with __aarch32__ in Sw. - */ -#define MC_ARMV7_FC -#endif /* not CONFIG_ARCH_MSM8996 */ - -#endif /* _MC_PLATFORM_H_ */ - diff --git a/drivers/gud/MobiCoreDriver/pm.c b/drivers/gud/MobiCoreDriver/pm.c deleted file mode 100644 index 98310f73dfeab..0000000000000 --- a/drivers/gud/MobiCoreDriver/pm.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 -#include -#include -#include - -#include "public/mc_linux.h" - -#include "platform.h" /* MC_PM_RUNTIME */ -#include "debug.h" -#include "scheduler.h" /* SWd suspend/resume commands */ -#include "pm.h" - -#ifdef MC_PM_RUNTIME -static struct pm_context { - struct notifier_block pm_notifier; -} pm_ctx; - -static int mc_suspend_notifier(struct notifier_block *nb, unsigned long event, - void *dummy) -{ - switch (event) { - case PM_SUSPEND_PREPARE: - return mc_scheduler_suspend(); - case PM_POST_SUSPEND: - return mc_scheduler_resume(); - } - - return 0; -} - - -/* CPI todo: inconsistent handling of ret in below 2 functions */ -int mc_pm_start(void) -{ - int ret = 0; - - pm_ctx.pm_notifier.notifier_call = mc_suspend_notifier; - ret = register_pm_notifier(&pm_ctx.pm_notifier); - MCDRV_DBG_VERBOSE("done, ret = %d", ret); - - return ret; -} - -void mc_pm_stop(void) -{ - unregister_pm_notifier(&pm_ctx.pm_notifier); -} - -#endif /* MC_PM_RUNTIME */ diff --git a/drivers/gud/MobiCoreDriver/pm.h b/drivers/gud/MobiCoreDriver/pm.h deleted file mode 100644 index 999599a70b1ab..0000000000000 --- a/drivers/gud/MobiCoreDriver/pm.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _MC_PM_H_ -#define _MC_PM_H_ - -#include "platform.h" /* MC_PM_RUNTIME */ - -#ifdef MC_PM_RUNTIME -/* Initialize Power Management */ -int mc_pm_start(void); -/* Free all Power Management resources*/ -void mc_pm_stop(void); -#else -static inline int mc_pm_start(void) -{ - return 0; -} - -static inline void mc_pm_stop(void) -{ -} -#endif - -#endif /* _MC_PM_H_ */ diff --git a/drivers/gud/MobiCoreDriver/public/mc_admin.h b/drivers/gud/MobiCoreDriver/public/mc_admin.h deleted file mode 100644 index 3a4078dd6fc30..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mc_admin.h +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * 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. - * - * 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 __MC_ADMIN_IOCTL_H__ -#define __MC_ADMIN_IOCTL_H__ - -#ifdef __cplusplus -extern "C" { -#endif - -#define MC_ADMIN_DEVNODE "mobicore" - -/* Driver/daemon commands */ -enum { - /* Command 0 is reserved */ - MC_DRV_GET_ROOT_CONTAINER = 1, - MC_DRV_GET_SP_CONTAINER = 2, - MC_DRV_GET_TRUSTLET_CONTAINER = 3, - MC_DRV_GET_TRUSTLET = 4, - MC_DRV_SIGNAL_CRASH = 5, -}; - -/* MobiCore IOCTL magic number */ -#define MC_IOC_MAGIC 'M' - -struct mc_admin_request { - uint32_t request_id; /* Unique request identifier */ - uint32_t command; /* Command to daemon */ - struct mc_uuid_t uuid; /* UUID of trustlet, if relevant */ - uint32_t is_gp; /* Whether trustlet is GP */ - uint32_t spid; /* SPID of trustlet, if relevant */ -}; - -struct mc_admin_response { - uint32_t request_id; /* Unique request identifier */ - uint32_t error_no; /* Errno from daemon */ - uint32_t spid; /* SPID of trustlet, if relevant */ - uint32_t service_type; /* Type of trustlet being returned */ - uint32_t length; /* Length of data to get */ - /* Any data follows */ -}; - -struct mc_admin_driver_info { - /* Version, and something else..*/ - uint32_t drv_version; - uint32_t initial_cmd_id; -}; - -struct mc_admin_load_info { - uint32_t spid; /* SPID of trustlet, if relevant */ - uint64_t address; /* Address of the data */ - uint32_t length; /* Length of data to get */ -}; - -#define MC_ADMIN_IO_GET_DRIVER_REQUEST \ - _IOR(MC_IOC_MAGIC, 0, struct mc_admin_request) -#define MC_ADMIN_IO_GET_INFO \ - _IOR(MC_IOC_MAGIC, 1, struct mc_admin_driver_info) -#define MC_ADMIN_IO_LOAD_DRIVER \ - _IOW(MC_IOC_MAGIC, 2, struct mc_admin_load_info) -#define MC_ADMIN_IO_LOAD_TOKEN \ - _IOW(MC_IOC_MAGIC, 3, struct mc_admin_load_info) -#define MC_ADMIN_IO_LOAD_CHECK \ - _IOW(MC_IOC_MAGIC, 4, struct mc_admin_load_info) - -#ifdef __cplusplus -} -#endif -#endif /* __MC_ADMIN_IOCTL_H__ */ diff --git a/drivers/gud/MobiCoreDriver/public/mc_linux.h b/drivers/gud/MobiCoreDriver/public/mc_linux.h deleted file mode 100644 index 2368653f8890d..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mc_linux.h +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _MC_LINUX_H_ -#define _MC_LINUX_H_ - -#define MCDRVMODULEAPI_VERSION_MAJOR 2 -#define MCDRVMODULEAPI_VERSION_MINOR 1 - -#ifndef __KERNEL__ -#include -#endif - -#define MC_USER_DEVNODE "mobicore-user" - -/** Maximum length of MobiCore product ID string. */ -#define MC_PRODUCT_ID_LEN 64 - -/** Number of buffers that can be mapped at once */ -#define MC_MAP_MAX 4 - -/* - * Universally Unique Identifier (UUID) according to ISO/IEC 11578. - */ -struct mc_uuid_t { - uint8_t value[16]; /* Value of the UUID. */ -}; - -/* - * GP TA login types. - */ -enum mc_login_type { - TEEC_LOGIN_PUBLIC = 0, - TEEC_LOGIN_USER, - TEEC_LOGIN_GROUP, - TEEC_LOGIN_APPLICATION = 4, - TEEC_LOGIN_USER_APPLICATION, - TEEC_LOGIN_GROUP_APPLICATION, -}; - -/* - * GP TA identity structure. - */ -struct mc_identity { - enum mc_login_type login_type; - union { - uint8_t login_data[16]; - gid_t gid; /* Requested group id */ - struct { - uid_t euid; - uid_t ruid; - } uid; - }; -}; - -/* - * Data exchange structure of the MC_IO_OPEN_SESSION ioctl command. - */ -struct mc_ioctl_open_sess { - struct mc_uuid_t uuid; /* trustlet uuid */ - uint32_t is_gp_uuid; /* uuid is for GP TA */ - uint32_t sid; /* session id (out) */ - uint64_t tci; /* tci buffer pointer */ - uint32_t tcilen; /* tci length */ - struct mc_identity identity; /* GP TA identity */ -}; - -/* - * Data exchange structure of the MC_IO_OPEN_TRUSTLET ioctl command. - */ -struct mc_ioctl_open_trustlet { - uint32_t sid; /* session id (out) */ - uint32_t spid; /* trustlet spid */ - uint64_t buffer; /* trustlet binary pointer */ - uint32_t tlen; /* binary length */ - uint64_t tci; /* tci buffer pointer */ - uint32_t tcilen; /* tci length */ -}; - -/* - * Data exchange structure of the MC_IO_WAIT ioctl command. - */ -struct mc_ioctl_wait { - uint32_t sid; /* session id (in) */ - int32_t timeout; /* notification timeout */ -}; - -/* - * Data exchange structure of the MC_IO_ALLOC ioctl command. - */ -struct mc_ioctl_alloc { - uint32_t len; /* buffer length */ - uint32_t handle; /* user handle for the buffer (out) */ -}; - -/* - * Buffer mapping incoming and outgoing information. - */ -struct mc_ioctl_buffer { - uint64_t va; /* user space address of buffer */ - uint32_t len; /* buffer length */ - uint64_t sva; /* SWd virt address of buffer (out) */ -}; - -/* - * Data exchange structure of the MC_IO_MAP and MC_IO_UNMAP ioctl commands. - */ -struct mc_ioctl_map { - uint32_t sid; /* session id */ - struct mc_ioctl_buffer bufs[MC_MAP_MAX];/* buffers info */ -}; - -/* - * Data exchange structure of the MC_IO_ERR ioctl command. - */ -struct mc_ioctl_geterr { - uint32_t sid; /* session id */ - int32_t value; /* error value (out) */ -}; - -/* - * Global MobiCore Version Information. - */ -struct mc_version_info { - char product_id[MC_PRODUCT_ID_LEN]; /** Product ID string */ - uint32_t version_mci; /** Mobicore Control Interface */ - uint32_t version_so; /** Secure Objects */ - uint32_t version_mclf; /** MobiCore Load Format */ - uint32_t version_container; /** MobiCore Container Format */ - uint32_t version_mc_config; /** MobiCore Config. Block Format */ - uint32_t version_tl_api; /** MobiCore Trustlet API */ - uint32_t version_dr_api; /** MobiCore Driver API */ - uint32_t version_cmp; /** Content Management Protocol */ -}; - -/* - * defines for the ioctl mobicore driver module function call from user space. - */ -/* MobiCore IOCTL magic number */ -#define MC_IOC_MAGIC 'M' - -/* - * Implement corresponding functions from user api - */ -#define MC_IO_OPEN_SESSION \ - _IOWR(MC_IOC_MAGIC, 0, struct mc_ioctl_open_sess) -#define MC_IO_OPEN_TRUSTLET \ - _IOWR(MC_IOC_MAGIC, 1, struct mc_ioctl_open_trustlet) -#define MC_IO_CLOSE_SESSION _IO(MC_IOC_MAGIC, 2) -#define MC_IO_NOTIFY _IO(MC_IOC_MAGIC, 3) -#define MC_IO_WAIT _IOW(MC_IOC_MAGIC, 4, struct mc_ioctl_wait) -#define MC_IO_MAP _IOWR(MC_IOC_MAGIC, 5, struct mc_ioctl_map) -#define MC_IO_UNMAP _IOW(MC_IOC_MAGIC, 6, struct mc_ioctl_map) -#define MC_IO_ERR _IOWR(MC_IOC_MAGIC, 7, struct mc_ioctl_geterr) -#define MC_IO_FREEZE _IO(MC_IOC_MAGIC, 8) -#define MC_IO_VERSION _IOR(MC_IOC_MAGIC, 9, struct mc_version_info) -#define MC_IO_DR_VERSION _IOR(MC_IOC_MAGIC, 10, uint32_t) - -#endif /* _MC_LINUX_H_ */ diff --git a/drivers/gud/MobiCoreDriver/public/mc_linux_api.h b/drivers/gud/MobiCoreDriver/public/mc_linux_api.h deleted file mode 100644 index 211bc2682b754..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mc_linux_api.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2013-2014 TRUSTONIC LIMITED - * 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. - * - * 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 _MC_LINUX_API_H_ -#define _MC_LINUX_API_H_ - -/* - * Switch tbase active core to core_num, defined as linux - * core id - */ -int mc_switch_core(uint32_t core_num); - -/* - * Return tbase active core as Linux core id - */ -uint32_t mc_active_core(void); - -#endif /* _MC_LINUX_API_H_ */ diff --git a/drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h b/drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h deleted file mode 100644 index 005099532d73a..0000000000000 --- a/drivers/gud/MobiCoreDriver/public/mobicore_driver_api.h +++ /dev/null @@ -1,450 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _MOBICORE_DRIVER_API_H_ -#define _MOBICORE_DRIVER_API_H_ - -#include "mc_linux.h" - -#define __MC_CLIENT_LIB_API - -/* - * Return values of MobiCore driver functions. - */ -enum mc_result { - /* Function call succeeded. */ - MC_DRV_OK = 0, - /* No notification available. */ - MC_DRV_NO_NOTIFICATION = 1, - /* Error during notification on communication level. */ - MC_DRV_ERR_NOTIFICATION = 2, - /* Function not implemented. */ - MC_DRV_ERR_NOT_IMPLEMENTED = 3, - /* No more resources available. */ - MC_DRV_ERR_OUT_OF_RESOURCES = 4, - /* Driver initialization failed. */ - MC_DRV_ERR_INIT = 5, - /* Unknown error. */ - MC_DRV_ERR_UNKNOWN = 6, - /* The specified device is unknown. */ - MC_DRV_ERR_UNKNOWN_DEVICE = 7, - /* The specified session is unknown.*/ - MC_DRV_ERR_UNKNOWN_SESSION = 8, - /* The specified operation is not allowed. */ - MC_DRV_ERR_INVALID_OPERATION = 9, - /* The response header from the MC is invalid. */ - MC_DRV_ERR_INVALID_RESPONSE = 10, - /* Function call timed out. */ - MC_DRV_ERR_TIMEOUT = 11, - /* Can not allocate additional memory. */ - MC_DRV_ERR_NO_FREE_MEMORY = 12, - /* Free memory failed. */ - MC_DRV_ERR_FREE_MEMORY_FAILED = 13, - /* Still some open sessions pending. */ - MC_DRV_ERR_SESSION_PENDING = 14, - /* MC daemon not reachable */ - MC_DRV_ERR_DAEMON_UNREACHABLE = 15, - /* The device file of the kernel module could not be opened. */ - MC_DRV_ERR_INVALID_DEVICE_FILE = 16, - /* Invalid parameter. */ - MC_DRV_ERR_INVALID_PARAMETER = 17, - /* Unspecified error from Kernel Module*/ - MC_DRV_ERR_KERNEL_MODULE = 18, - /* Error during mapping of additional bulk memory to session. */ - MC_DRV_ERR_BULK_MAPPING = 19, - /* Error during unmapping of additional bulk memory to session. */ - MC_DRV_ERR_BULK_UNMAPPING = 20, - /* Notification received, exit code available. */ - MC_DRV_INFO_NOTIFICATION = 21, - /* Set up of NWd connection failed. */ - MC_DRV_ERR_NQ_FAILED = 22, - /* Wrong daemon version. */ - MC_DRV_ERR_DAEMON_VERSION = 23, - /* Wrong container version. */ - MC_DRV_ERR_CONTAINER_VERSION = 24, - /* System Trustlet public key is wrong. */ - MC_DRV_ERR_WRONG_PUBLIC_KEY = 25, - /* Wrong container type(s). */ - MC_DRV_ERR_CONTAINER_TYPE_MISMATCH = 26, - /* Container is locked (or not activated). */ - MC_DRV_ERR_CONTAINER_LOCKED = 27, - /* SPID is not registered with root container. */ - MC_DRV_ERR_SP_NO_CHILD = 28, - /* UUID is not registered with sp container. */ - MC_DRV_ERR_TL_NO_CHILD = 29, - /* Unwrapping of root container failed. */ - MC_DRV_ERR_UNWRAP_ROOT_FAILED = 30, - /* Unwrapping of service provider container failed. */ - MC_DRV_ERR_UNWRAP_SP_FAILED = 31, - /* Unwrapping of Trustlet container failed. */ - MC_DRV_ERR_UNWRAP_TRUSTLET_FAILED = 32, - /* No device associated with connection. */ - MC_DRV_ERR_DAEMON_DEVICE_NOT_OPEN = 33, - /* TA blob attestation is incorrect. */ - MC_DRV_ERR_TA_ATTESTATION_ERROR = 34, - /* Interrupted system call. */ - MC_DRV_ERR_INTERRUPTED_BY_SIGNAL = 35, - /* Service is blocked and opensession is thus not allowed. */ - MC_DRV_ERR_SERVICE_BLOCKED = 36, - /* Service is locked and opensession is thus not allowed. */ - MC_DRV_ERR_SERVICE_LOCKED = 37, - /* Service was killed by the TEE (due to an administrative command). */ - MC_DRV_ERR_SERVICE_KILLED = 38, - /* All permitted instances to the service are used */ - MC_DRV_ERR_NO_FREE_INSTANCES = 39, - /* TA blob header is incorrect. */ - MC_DRV_ERR_TA_HEADER_ERROR = 40, -}; - -/* - * Structure of Session Handle, includes the Session ID and the Device ID the - * Session belongs to. - * The session handle will be used for session-based MobiCore communication. - * It will be passed to calls which address a communication end point in the - * MobiCore environment. - */ -struct mc_session_handle { - uint32_t session_id; /* MobiCore session ID */ - uint32_t device_id; /* Device ID the session belongs to */ -}; - -/* - * Information structure about additional mapped Bulk buffer between the - * Trustlet Connector (NWd) and the Trustlet (SWd). This structure is - * initialized from a Trustlet Connector by calling mc_map(). - * In order to use the memory within a Trustlet the Trustlet Connector has to - * inform the Trustlet with the content of this structure via the TCI. - */ -struct mc_bulk_map { - /* The virtual address of the Bulk buffer regarding the address space - * of the Trustlet, already includes a possible offset! */ - uint32_t secure_virt_addr; - uint32_t secure_virt_len; /* Length of the mapped Bulk buffer */ -}; - -/* The default device ID */ -#define MC_DEVICE_ID_DEFAULT 0 -/* Wait infinite for a response of the MC. */ -#define MC_INFINITE_TIMEOUT ((int32_t)(-1)) -/* Do not wait for a response of the MC. */ -#define MC_NO_TIMEOUT 0 -/* TCI/DCI must not exceed 1MiB */ -#define MC_MAX_TCI_LEN 0x100000 - -/** - * mc_open_device() - Open a new connection to a MobiCore device. - * @device_id: Identifier for the MobiCore device to be used. - * MC_DEVICE_ID_DEFAULT refers to the default device. - * - * Initializes all device specific resources required to communicate with a - * MobiCore instance located on the specified device in the system. If the - * device does not exist the function will return MC_DRV_ERR_UNKNOWN_DEVICE. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_ERR_INVALID_OPERATION: device already opened - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon - * MC_DRV_ERR_UNKNOWN_DEVICE: device_id unknown - * MC_DRV_ERR_INVALID_DEVICE_FILE: kernel module under /dev/mobicore - * cannot be opened - */ -__MC_CLIENT_LIB_API enum mc_result mc_open_device(uint32_t device_id); - -/** - * mc_close_device() - Close the connection to a MobiCore device. - * @device_id: Identifier for the MobiCore device. - * - * When closing a device, active sessions have to be closed beforehand. - * Resources associated with the device will be released. - * The device may be opened again after it has been closed. - * - * MC_DEVICE_ID_DEFAULT refers to the default device. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_SESSION_PENDING: a session is still open - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - */ -__MC_CLIENT_LIB_API enum mc_result mc_close_device(uint32_t device_id); - -/** - * mc_open_session() - Open a new session to a Trustlet. - * @session: On success, the session data will be returned - * @uuid: UUID of the Trustlet to be opened - * @tci: TCI buffer for communicating with the Trustlet - * @tci_len: Length of the TCI buffer. Maximum allowed value - * is MC_MAX_TCI_LEN - * - * The Trustlet with the given UUID has to be available in the flash filesystem. - * - * Write MCP open message to buffer and notify MobiCore about the availability - * of a new command. - * - * Waits till the MobiCore responses with the new session ID (stored in the MCP - * buffer). - * - * Note that session.device_id has to be the device id of an opened device. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon socket occur - * MC_DRV_ERR_NQ_FAILED: daemon returns an error - */ -__MC_CLIENT_LIB_API enum mc_result mc_open_session( - struct mc_session_handle *session, const struct mc_uuid_t *uuid, - uint8_t *tci, uint32_t tci_len); - -/** - * mc_open_trustlet() - Open a new session to the provided Trustlet. - * @session: On success, the session data will be returned - * @spid: Service Provider ID (for SP trustlets otherwise ignored) - * @trustlet Memory buffer containing the Trusted Application binary - * @trustlet_len Trusted Application length - * @tci: TCI buffer for communicating with the Trustlet - * @tci_len: Length of the TCI buffer. Maximum allowed value - * is MC_MAX_TCI_LEN - * - * Write MCP open message to buffer and notify MobiCore about the availability - * of a new command. - * - * Waits till the MobiCore responses with the new session ID (stored in the MCP - * buffer). - * - * Note that session.device_id has to be the device id of an opened device. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon socket occur - * MC_DRV_ERR_NQ_FAILED: daemon returns an error - */ -__MC_CLIENT_LIB_API enum mc_result mc_open_trustlet( - struct mc_session_handle *session, uint32_t spid, - uint8_t *trustlet, uint32_t trustlet_len, uint8_t *tci, uint32_t len); - -/** - * mc_close_session() - Close a Trustlet session. - * @session: Session to be closed. - * - * Closes the specified MobiCore session. The call will block until the - * session has been closed. - * - * Device device_id has to be opened in advance. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - * MC_DRV_ERR_INVALID_DEVICE_FILE: daemon cannot open Trustlet file - */ -__MC_CLIENT_LIB_API enum mc_result mc_close_session( - struct mc_session_handle *session); - -/** - * mc_notify() - Notify a session. - * @session: The session to be notified. - * - * Notifies the session end point about available message data. - * If the session parameter is correct, notify will always succeed. - * Corresponding errors can only be received by mc_wait_notification(). - * - * A session has to be opened in advance. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: session parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - */ -__MC_CLIENT_LIB_API enum mc_result mc_notify(struct mc_session_handle *session); - -/** - * mc_wait_notification() - Wait for a notification. - * @session: The session the notification should correspond to. - * @timeout: Time in milliseconds to wait - * (MC_NO_TIMEOUT : direct return, > 0 : milliseconds, - * MC_INFINITE_TIMEOUT : wait infinitely) - * - * Wait for a notification issued by the MobiCore for a specific session. - * The timeout parameter specifies the number of milliseconds the call will wait - * for a notification. - * - * If the caller passes 0 as timeout value the call will immediately return. - * If timeout value is below 0 the call will block until a notification for the - * session has been received. - * - * If timeout is below 0, call will block. - * - * Caller has to trust the other side to send a notification to wake him up - * again. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_ERR_TIMEOUT: no notification arrived in time - * MC_DRV_INFO_NOTIFICATION: a problem with the session was - * encountered. Get more details with - * mc_get_session_error_code() - * MC_DRV_ERR_NOTIFICATION: a problem with the socket occurred - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - */ -__MC_CLIENT_LIB_API enum mc_result mc_wait_notification( - struct mc_session_handle *session, int32_t timeout); - -/** - * mc_malloc_wsm() - Allocate a block of world shared memory (WSM). - * @device_id: The ID of an opened device to retrieve the WSM from. - * @align: The alignment (number of pages) of the memory block - * (e.g. 0x00000001 for 4kb). - * @len: Length of the block in bytes. - * @wsm: Virtual address of the world shared memory block. - * @wsm_flags: Platform specific flags describing the memory to - * be allocated. - * - * The MC driver allocates a contiguous block of memory which can be used as - * WSM. - * This implicates that the allocated memory is aligned according to the - * alignment parameter. - * - * Always returns a buffer of size WSM_SIZE aligned to 4K. - * - * Align and wsm_flags are currently ignored - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id is invalid - * MC_DRV_ERR_NO_FREE_MEMORY: no more contiguous memory is - * available in this size or for this - * process - */ -__MC_CLIENT_LIB_API enum mc_result mc_malloc_wsm( - uint32_t device_id, - uint32_t align, - uint32_t len, - uint8_t **wsm, - uint32_t wsm_flags -); - -/** - * mc_free_wsm() - Free a block of world shared memory (WSM). - * @device_id: The ID to which the given address belongs - * @wsm: Address of WSM block to be freed - * - * The MC driver will free a block of world shared memory (WSM) previously - * allocated with mc_malloc_wsm(). The caller has to assure that the address - * handed over to the driver is a valid WSM address. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: when device id is invalid - * MC_DRV_ERR_FREE_MEMORY_FAILED: on failure - */ -__MC_CLIENT_LIB_API enum mc_result mc_free_wsm(uint32_t device_id, - uint8_t *wsm); - -/** - *mc_map() - Map additional bulk buffer between a Trustlet Connector (TLC) - * and the Trustlet (TL) for a session - * @session: Session handle with information of the device_id and - * the session_id. The given buffer is mapped to the - * session specified in the sessionHandle - * @buf: Virtual address of a memory portion (relative to TLC) - * to be shared with the Trustlet, already includes a - * possible offset! - * @len: length of buffer block in bytes. - * @map_info: Information structure about the mapped Bulk buffer - * between the TLC (NWd) and the TL (SWd). - * - * Memory allocated in user space of the TLC can be mapped as additional - * communication channel (besides TCI) to the Trustlet. Limitation of the - * Trustlet memory structure apply: only 6 chunks can be mapped with a maximum - * chunk size of 1 MiB each. - * - * It is up to the application layer (TLC) to inform the Trustlet - * about the additional mapped bulk memory. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - * MC_DRV_ERR_BULK_MAPPING: buf is already uses as bulk buffer or - * when registering the buffer failed - */ -__MC_CLIENT_LIB_API enum mc_result mc_map( - struct mc_session_handle *session, void *buf, uint32_t len, - struct mc_bulk_map *map_info); - -/** - * mc_unmap() - Remove additional mapped bulk buffer between Trustlet Connector - * (TLC) and the Trustlet (TL) for a session - * @session: Session handle with information of the device_id and - * the session_id. The given buffer is unmapped from the - * session specified in the sessionHandle. - * @buf: Virtual address of a memory portion (relative to TLC) - * shared with the TL, already includes a possible offset! - * @map_info: Information structure about the mapped Bulk buffer - * between the TLC (NWd) and the TL (SWd) - * - * The bulk buffer will immediately be unmapped from the session context. - * - * The application layer (TLC) must inform the TL about unmapping of the - * additional bulk memory before calling mc_unmap! - * - * The clientlib currently ignores the len field in map_info. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - * MC_DRV_ERR_DAEMON_UNREACHABLE: problems with daemon occur - * MC_DRV_ERR_BULK_UNMAPPING: buf was not registered earlier - * or when unregistering failed - */ -__MC_CLIENT_LIB_API enum mc_result mc_unmap( - struct mc_session_handle *session, void *buf, - struct mc_bulk_map *map_info); - -/* - * mc_get_session_error_code() - Get additional error information of the last - * error that occurred on a session. - * @session: Session handle with information of the device_id and - * the session_id - * @exit_code: >0 Trustlet has terminated itself with this value, - * <0 Trustlet is dead because of an error within the - * MobiCore (e.g. Kernel exception). See also MCI - * definition. - * - * After the request the stored error code will be deleted. - * - * Return codes: - * MC_DRV_OK: operation completed successfully - * MC_DRV_INVALID_PARAMETER: a parameter is invalid - * MC_DRV_ERR_UNKNOWN_SESSION: session id is invalid - * MC_DRV_ERR_UNKNOWN_DEVICE: device id of session is invalid - */ -__MC_CLIENT_LIB_API enum mc_result mc_get_session_error_code( - struct mc_session_handle *session, int32_t *exit_code); - -#endif /* _MOBICORE_DRIVER_API_H_ */ diff --git a/drivers/gud/MobiCoreDriver/scheduler.c b/drivers/gud/MobiCoreDriver/scheduler.c deleted file mode 100644 index 444f839d8ad1d..0000000000000 --- a/drivers/gud/MobiCoreDriver/scheduler.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" - -#include "main.h" -#include "fastcall.h" -#include "debug.h" -#include "logging.h" -#include "mcp.h" -#include "scheduler.h" - -#define SCHEDULING_FREQ 5 /**< N-SIQ every n-th time */ - -static struct sched_ctx { - struct task_struct *thread; - bool thread_run; - struct completion idle_complete; /* Unblock scheduler thread */ - struct completion sleep_complete; /* Wait for sleep status */ - struct mutex sleep_mutex; /* Protect sleep request */ - struct mutex request_mutex; /* Protect all below */ - /* The order of this enum matters */ - enum { - NONE, /* No specific request */ - YIELD, /* Run the SWd */ - NSIQ, /* Schedule the SWd */ - SUSPEND, /* Suspend the SWd */ - RESUME, /* Resume the SWd */ - } request; - bool suspended; -} sched_ctx; - -static int mc_scheduler_command(int command) -{ - if (IS_ERR_OR_NULL(sched_ctx.thread)) - return -EFAULT; - - mutex_lock(&sched_ctx.request_mutex); - if (sched_ctx.request < command) { - sched_ctx.request = command; - complete(&sched_ctx.idle_complete); - } - - mutex_unlock(&sched_ctx.request_mutex); - return 0; -} - -static int mc_scheduler_pm_command(int command) -{ - int ret = -EPERM; - - if (IS_ERR_OR_NULL(sched_ctx.thread)) - return -EFAULT; - - mutex_lock(&sched_ctx.sleep_mutex); - - /* Send request */ - mc_scheduler_command(command); - - /* Wait for scheduler to reply */ - wait_for_completion(&sched_ctx.sleep_complete); - mutex_lock(&sched_ctx.request_mutex); - if (command == SUSPEND) { - if (sched_ctx.suspended) - ret = 0; - } else { - if (!sched_ctx.suspended) - ret = 0; - } - - mutex_unlock(&sched_ctx.request_mutex); - - mutex_unlock(&sched_ctx.sleep_mutex); - return ret; -} - -static int mc_dev_command(enum mcp_scheduler_commands command) -{ - switch (command) { - case MCP_YIELD: - return mc_scheduler_command(YIELD); - case MCP_NSIQ: - return mc_scheduler_command(NSIQ); - } - - return -EINVAL; -} - -int mc_scheduler_suspend(void) -{ - return mc_scheduler_pm_command(SUSPEND); -} - -int mc_scheduler_resume(void) -{ - return mc_scheduler_pm_command(RESUME); -} - -/* - * This thread, and only this thread, schedules the SWd. Hence, reading the idle - * status and its associated timeout is safe from race conditions. - */ -static int tee_scheduler(void *arg) -{ - int timeslice = 0; /* Actually scheduling period */ - int ret = 0; - - MCDRV_DBG("enter"); - while (1) { - int32_t timeout_ms = -1; - bool pm_request = false; - - if (sched_ctx.suspended || mcp_get_idle_timeout(&timeout_ms)) { - /* If timeout is 0 we keep scheduling the SWd */ - if (!timeout_ms) - mc_scheduler_command(NSIQ); - else if (timeout_ms < 0) - wait_for_completion(&sched_ctx.idle_complete); - else if (!wait_for_completion_timeout( - &sched_ctx.idle_complete, - msecs_to_jiffies(timeout_ms))) - /* Timed out, force SWd schedule */ - mc_scheduler_command(NSIQ); - } - - if (kthread_should_stop() || !sched_ctx.thread_run) - break; - - /* Get requested command if any */ - mutex_lock(&sched_ctx.request_mutex); - if (sched_ctx.request == YIELD) - /* Yield forced: increment timeslice */ - timeslice++; - else if (sched_ctx.request >= NSIQ) { - /* Force N_SIQ, also to suspend/resume SWd */ - timeslice = 0; - if (sched_ctx.request == SUSPEND) { - mcp_suspend(); - pm_request = true; - } else if (sched_ctx.request == RESUME) { - mcp_resume(); - pm_request = true; - } - } - - sched_ctx.request = NONE; - mutex_unlock(&sched_ctx.request_mutex); - - /* Reset timeout so we don't loop if SWd halted */ - mcp_reset_idle_timeout(); - if (timeslice--) { - /* Resume SWd from where it was */ - ret = mc_fc_yield(); - } else { - timeslice = SCHEDULING_FREQ; - /* Call SWd scheduler */ - ret = mc_fc_nsiq(); - } - - /* Always flush log buffer after the SWd has run */ - mc_logging_run(); - if (ret) - break; - - /* Should have suspended by now if requested */ - mutex_lock(&sched_ctx.request_mutex); - if (pm_request) { - sched_ctx.suspended = mcp_suspended(); - complete(&sched_ctx.sleep_complete); - } - - mutex_unlock(&sched_ctx.request_mutex); - - /* Flush pending notifications if possible */ - if (mcp_notifications_flush()) - complete(&sched_ctx.idle_complete); - } - - MCDRV_DBG("exit, ret is %d", ret); - return ret; -} - -int mc_scheduler_start(void) -{ - sched_ctx.thread_run = true; - sched_ctx.thread = kthread_run(tee_scheduler, NULL, "tee_scheduler"); - if (IS_ERR(sched_ctx.thread)) { - MCDRV_ERROR("tee_scheduler thread creation failed"); - return PTR_ERR(sched_ctx.thread); - } - - mcp_register_scheduler(mc_dev_command); - complete(&sched_ctx.idle_complete); - return 0; -} - -void mc_scheduler_stop(void) -{ - mcp_register_scheduler(NULL); - sched_ctx.thread_run = false; - complete(&sched_ctx.idle_complete); - kthread_stop(sched_ctx.thread); -} - -int mc_scheduler_init(void) -{ - init_completion(&sched_ctx.idle_complete); - init_completion(&sched_ctx.sleep_complete); - mutex_init(&sched_ctx.sleep_mutex); - mutex_init(&sched_ctx.request_mutex); - return 0; -} diff --git a/drivers/gud/MobiCoreDriver/scheduler.h b/drivers/gud/MobiCoreDriver/scheduler.h deleted file mode 100644 index c3c17f1c9017c..0000000000000 --- a/drivers/gud/MobiCoreDriver/scheduler.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 __MC_SCHEDULER_H__ -#define __MC_SCHEDULER_H__ - -int mc_scheduler_init(void); -static inline void mc_scheduler_exit(void) {} -int mc_scheduler_start(void); -void mc_scheduler_stop(void); -int mc_scheduler_suspend(void); -int mc_scheduler_resume(void); - -#endif /* __MC_SCHEDULER_H__ */ diff --git a/drivers/gud/MobiCoreDriver/session.c b/drivers/gud/MobiCoreDriver/session.c deleted file mode 100644 index 1dbb8900b2b3a..0000000000000 --- a/drivers/gud/MobiCoreDriver/session.c +++ /dev/null @@ -1,779 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "public/mc_linux.h" -#include "public/mc_admin.h" - -#include "platform.h" /* MC_UIDGID_OLDSTYLE */ -#include "main.h" -#include "debug.h" -#include "mmu.h" -#include "mcp.h" -#include "client.h" /* *cbuf* */ -#include "session.h" -#include "mci/mcimcp.h" - -#define SHA1_HASH_SIZE 20 - -struct tbase_wsm { - /* Buffer NWd addr (uva or kva, used only for lookup) */ - uintptr_t va; - /* buffer length */ - uint32_t len; - /* Buffer SWd addr */ - uint32_t sva; - /* mmu L2 table */ - struct tbase_mmu *mmu; - /* possibly a pointer to a cbuf */ - struct tbase_cbuf *cbuf; - /* list node */ - struct list_head list; -}; - -/* - * Postponed closing for GP TAs. - * Implemented as a worker because cannot be executed from within isr_worker. - */ -static void session_close_worker(struct work_struct *work) -{ - struct mcp_session *mcp_session; - struct tbase_session *session; - - mcp_session = container_of(work, struct mcp_session, close_work); - session = container_of(mcp_session, struct tbase_session, mcp_session); - session_close(session); -} - -/* Forward declarations */ -static struct tbase_wsm *wsm_create(struct tbase_session *session, - uintptr_t buf, uint32_t len); -static void wsm_free(struct tbase_wsm *wsm); - -static int hash_path_and_data(char *hash, const void *data, - unsigned int data_len) -{ - struct mm_struct *mm = current->mm; - struct hash_desc desc; - struct scatterlist sg; - char *buf; - char *path; - unsigned int path_len; - int ret = 0; - - buf = (char *)__get_free_page(GFP_KERNEL); - if (!buf) - return -ENOMEM; - - down_read(&mm->mmap_sem); - if (!mm->exe_file) { - ret = -ENOENT; - goto end; - } - - path = d_path(&mm->exe_file->f_path, buf, PAGE_SIZE); - if (IS_ERR(path)) { - ret = PTR_ERR(path); - goto end; - } - - MCDRV_DBG("current process path = "); - { - char *c; - - for (c = path; *c; c++) - MCDRV_DBG("%c %d", *c, *c); - } - - path_len = strnlen(path, PAGE_SIZE); - MCDRV_DBG("path_len = %u", path_len); - desc.tfm = crypto_alloc_hash("sha1", 0, CRYPTO_ALG_ASYNC); - if (IS_ERR(desc.tfm)) { - ret = PTR_ERR(desc.tfm); - MCDRV_DBG("could not alloc hash = %d", ret); - goto end; - } - - desc.flags = 0; - sg_init_one(&sg, path, path_len); - crypto_hash_init(&desc); - crypto_hash_update(&desc, &sg, path_len); - if (data) { - MCDRV_DBG("current process path: hashing additional data\n"); - sg_init_one(&sg, data, data_len); - crypto_hash_update(&desc, &sg, data_len); - } - - crypto_hash_final(&desc, hash); - crypto_free_hash(desc.tfm); - -end: - up_read(&mm->mmap_sem); - free_page((unsigned long)buf); - - return ret; -} - -static int check_prepare_identity(const struct mc_identity *identity, - struct identity *mcp_identity) -{ - struct mc_identity *mcp_id = (struct mc_identity *)mcp_identity; - uint8_t hash[SHA1_HASH_SIZE]; - bool application = false; - const void *data; - unsigned int data_len; - - /* Mobicore doesn't support GP client authentication. */ - if (!g_ctx.f_client_login && - (identity->login_type != TEEC_LOGIN_PUBLIC)) { - MCDRV_DBG_WARN("Unsupported login type %d", - identity->login_type); - return -EINVAL; - } - - /* Copy login type */ - mcp_identity->login_type = identity->login_type; - - /* Fill in uid field */ - if ((identity->login_type == TEEC_LOGIN_USER) || - (identity->login_type == TEEC_LOGIN_USER_APPLICATION)) { - /* Set euid and ruid of the process. */ -#if !defined(KUIDT_INIT) || defined(MC_UIDGID_OLDSTYLE) - mcp_id->uid.euid = current_euid(); - mcp_id->uid.ruid = current_uid(); -#else - mcp_id->uid.euid = current_euid().val; - mcp_id->uid.ruid = current_uid().val; -#endif - } - - /* Check gid field */ - if ((identity->login_type == TEEC_LOGIN_GROUP) || - (identity->login_type == TEEC_LOGIN_GROUP_APPLICATION)) { -#if !defined(KUIDT_INIT) || defined(MC_UIDGID_OLDSTYLE) - gid_t gid = identity->gid; -#else - kgid_t gid = { - .val = identity->gid, - }; -#endif - /* Check if gid is one of: egid of the process, its rgid or one - * of its supplementary groups */ - if (!in_egroup_p(gid) && !in_group_p(gid)) { - MCDRV_DBG("group %d not allowed", identity->gid); - return -EACCES; - } - - MCDRV_DBG("group %d found", identity->gid); - mcp_id->gid = identity->gid; - } - - switch (identity->login_type) { - case TEEC_LOGIN_PUBLIC: - case TEEC_LOGIN_USER: - case TEEC_LOGIN_GROUP: - break; - case TEEC_LOGIN_APPLICATION: - application = true; - data = NULL; - data_len = 0; - break; - case TEEC_LOGIN_USER_APPLICATION: - application = true; - data = &mcp_id->uid; - data_len = sizeof(mcp_id->uid); - break; - case TEEC_LOGIN_GROUP_APPLICATION: - application = true; - data = &identity->gid; - data_len = sizeof(identity->gid); - break; - default: - /* Any other login_type value is invalid. */ - MCDRV_DBG_WARN("Invalid login type"); - return -EINVAL; - } - - if (application) { - if (hash_path_and_data(hash, data, data_len)) { - MCDRV_DBG("error in hash calculation"); - return -EAGAIN; - } - - memcpy(&mcp_id->login_data, hash, sizeof(mcp_id->login_data)); - } - - return 0; -} - -/* - * Create a session object. - * Note: object is not attached to client yet. - */ -struct tbase_session *session_create(struct tbase_client *client, bool is_gp, - struct mc_identity *identity) -{ - struct tbase_session *session; - struct identity mcp_identity; - - if (is_gp) { - /* Check identity method and data. */ - int ret = check_prepare_identity(identity, &mcp_identity); - - if (ret) - return ERR_PTR(ret); - } - - /* Allocate session object */ - session = kzalloc(sizeof(*session), GFP_KERNEL); - if (!session) - return ERR_PTR(-ENOMEM); - - mutex_init(&session->close_lock); - /* Initialise object members */ - mcp_session_init(&session->mcp_session, is_gp, &mcp_identity); - INIT_WORK(&session->mcp_session.close_work, session_close_worker); - session->client = client; - kref_init(&session->kref); - INIT_LIST_HEAD(&session->list); - mutex_init(&session->wsms_lock); - INIT_LIST_HEAD(&session->wsms); - MCDRV_DBG("created session %p: client %p", session, session->client); - return session; -} - -int session_open(struct tbase_session *session, const struct tbase_object *obj, - const struct tbase_mmu *obj_mmu, uintptr_t tci, size_t len) -{ - struct mcp_buffer_map map; - - tbase_mmu_buffer(obj_mmu, &map); - /* Create wsm object for tci */ - if (tci && len) { - struct tbase_wsm *wsm; - struct mcp_buffer_map tci_map; - int ret = 0; - - mutex_lock(&session->wsms_lock); - wsm = wsm_create(session, tci, len); - if (IS_ERR(wsm)) - ret = PTR_ERR(wsm); - - mutex_unlock(&session->wsms_lock); - if (ret) - return ret; - - tbase_mmu_buffer(wsm->mmu, &tci_map); - ret = mcp_open_session(&session->mcp_session, obj, &map, - &tci_map); - if (ret) { - mutex_lock(&session->wsms_lock); - wsm_free(wsm); - mutex_unlock(&session->wsms_lock); - } - - return ret; - } - - if (tci || len) { - MCDRV_ERROR("Tci pointer and length are incoherent"); - return -EINVAL; - } - - return mcp_open_session(&session->mcp_session, obj, &map, NULL); -} - -/* - * Close TA and unreference session object. - * Object will be freed if reference reaches 0. - * Session object is assumed to have been removed from main list, which means - * that session_close cannot be called anymore. - */ -int session_close(struct tbase_session *session) -{ - int ret = 0; - - if (!session) - return -ENXIO; - - mutex_lock(&session->close_lock); - switch (mcp_close_session(&session->mcp_session)) { - case 0: - /* TA is closed, remove from closing list */ - mutex_lock(&g_ctx.closing_lock); - list_del(&session->list); - mutex_unlock(&g_ctx.closing_lock); - /* Remove the ref we took on creation, exit if session freed */ - if (session_put(session)) - return 0; - - break; - case -EBUSY: - /* - * (GP) TA needs time to close. The "TA closed" notification - * will trigger a new call to session_close(). - * Return OK but do not unref. - */ - break; - default: - MCDRV_ERROR("Failed to close session %x in SWd", - session->mcp_session.id); - ret = -EPERM; - } - - mutex_unlock(&session->close_lock); - return ret; -} - -/* - * Free session object and all objects it contains (wsm). - */ -static void session_free(struct kref *kref) -{ - struct tbase_session *session; - struct tbase_wsm *wsm, *next; - - /* Remove remaining shared buffers (unmapped in SWd by mcp_close) */ - session = container_of(kref, struct tbase_session, kref); - list_for_each_entry_safe(wsm, next, &session->wsms, list) { - MCDRV_DBG("session %p: free wsm %p", session, wsm); - wsm_free(wsm); - } - - MCDRV_DBG("freed session %p: client %p id %x", - session, session->client, session->mcp_session.id); - kfree(session); -} - -/* - * Unreference session. - * Free session object if reference reaches 0. - */ -int session_put(struct tbase_session *session) -{ - return kref_put(&session->kref, session_free); -} - -/* - * Send a notification to TA - */ -int session_notify_swd(struct tbase_session *session) -{ - if (!session) { - MCDRV_ERROR("Session pointer is null"); - return -EINVAL; - } - - return mcp_notify(&session->mcp_session); -} - -/* - * Read and clear last notification received from TA - */ -int32_t session_exitcode(struct tbase_session *session) -{ - return mcp_session_exitcode(&session->mcp_session); -} - -/* - * Free a WSM object - */ -static void wsm_free(struct tbase_wsm *wsm) -{ - /* Remove wsm from its parent session's list */ - list_del(&wsm->list); - /* Free MMU table */ - if (!IS_ERR_OR_NULL(wsm->mmu)) - tbase_mmu_delete(wsm->mmu); - - /* Unref cbuf if applicable */ - if (wsm->cbuf) - tbase_cbuf_put(wsm->cbuf); - - /* Delete wsm object */ - MCDRV_DBG("freed wsm %p: mmu %p cbuf %p va %lx len %u", - wsm, wsm->mmu, wsm->cbuf, wsm->va, wsm->len); - kfree(wsm); -} - -static struct tbase_wsm *wsm_create(struct tbase_session *session, - uintptr_t buf, uint32_t len) -{ - struct tbase_wsm *wsm; - struct task_struct *task = NULL; - uintptr_t va; - int ret; - - /* Allocate structure */ - wsm = kzalloc(sizeof(*wsm), GFP_KERNEL); - if (!wsm) { - ret = -ENOMEM; - goto err_no_wsm; - } - - /* Add wsm to list so destroy can find it */ - list_add(&wsm->list, &session->wsms); - - /* Check if buffer is contained in a cbuf */ - wsm->cbuf = tbase_cbuf_get_by_addr(session->client, buf); - if (wsm->cbuf) { - uintptr_t offset; - - if (client_is_kernel(session->client)) - offset = buf - tbase_cbuf_addr(wsm->cbuf); - else - offset = buf - tbase_cbuf_uaddr(wsm->cbuf); - - if ((offset + len) > tbase_cbuf_len(wsm->cbuf)) { - ret = -EINVAL; - MCDRV_ERROR("crosses cbuf boundary"); - goto err; - } - /* Provide kernel virtual address */ - va = tbase_cbuf_addr(wsm->cbuf) + offset; - } else { - /* Not a cbuf. va is uva or kva depending on client. */ - /* Provide "task" if client is user */ - va = buf; - if (!client_is_kernel(session->client)) - task = current; - } - - /* Build MMU table for buffer */ - wsm->mmu = tbase_mmu_create(task, (void *)va, len); - if (IS_ERR(wsm->mmu)) { - ret = PTR_ERR(wsm->mmu); - goto err; - } - - wsm->va = buf; - wsm->len = len; - MCDRV_DBG("created wsm %p: mmu %p cbuf %p va %lx len %u", - wsm, wsm->mmu, wsm->cbuf, wsm->va, wsm->len); - goto end; - -err: - wsm_free(wsm); -err_no_wsm: - wsm = ERR_PTR(ret); -end: - return wsm; -} - -static inline int wsm_check(struct tbase_session *session, - struct mc_ioctl_buffer *buf) -{ - struct tbase_wsm *wsm; - - list_for_each_entry(wsm, &session->wsms, list) { - if ((buf->va < (wsm->va + wsm->len)) && - ((buf->va + buf->len) > wsm->va)) { - MCDRV_ERROR("buffer %lx overlaps with existing wsm", - wsm->va); - return -EADDRINUSE; - } - } - - return 0; -} - -static inline struct tbase_wsm *wsm_find(struct tbase_session *session, - uintptr_t va) -{ - struct tbase_wsm *wsm; - - list_for_each_entry(wsm, &session->wsms, list) - if (wsm->va == va) - return wsm; - - return NULL; -} - -static inline int wsm_info(struct tbase_wsm *wsm, struct kasnprintf_buf *buf) -{ - ssize_t ret; - - ret = kasnprintf(buf, "\t\twsm %p: mmu %p cbuf %p va %lx len %u\n", - wsm, wsm->mmu, wsm->cbuf, wsm->va, wsm->len); - if (ret < 0) - return ret; - - if (wsm->mmu) { - ret = tbase_mmu_info(wsm->mmu, buf); - if (ret < 0) - return ret; - } - - return 0; -} - -/* - * Share buffers with SWd and add corresponding WSM objects to session. - */ -int session_wsms_add(struct tbase_session *session, - struct mc_ioctl_buffer *bufs) -{ - struct mc_ioctl_buffer *buf; - struct mcp_buffer_map maps[MC_MAP_MAX]; - struct mcp_buffer_map *map; - int i, ret = 0; - uint32_t n_null_buf = 0; - - /* Check parameters */ - if (!session) - return -ENXIO; - - /* Lock the session */ - mutex_lock(&session->wsms_lock); - - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - if (!buf->va) { - n_null_buf++; - continue; - } - - /* Avoid mapping overlaps */ - if (wsm_check(session, buf)) { - ret = -EADDRINUSE; - MCDRV_ERROR("maps[%d] va=%llx already map'd", i, - buf->va); - goto unlock; - } - } - - if (n_null_buf >= MC_MAP_MAX) { - ret = -EINVAL; - MCDRV_ERROR("va=NULL"); - goto unlock; - } - - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - struct tbase_wsm *wsm; - - if (!buf->va) { - map->type = WSM_INVALID; - continue; - } - - wsm = wsm_create(session, buf->va, buf->len); - if (IS_ERR(wsm)) { - ret = PTR_ERR(wsm); - MCDRV_ERROR("maps[%d] va=%llx create failed: %d", i, - buf->va, ret); - goto end; - } - - tbase_mmu_buffer(wsm->mmu, map); - MCDRV_DBG("maps[%d] va=%llx: t:%u a:%llx o:%u l:%u", i, buf->va, - map->type, map->phys_addr, map->offset, map->length); - } - - /* Map buffers */ - if (g_ctx.f_multimap) { - /* Send MCP message to map buffers in SWd */ - ret = mcp_multimap(session->mcp_session.id, maps); - if (ret) - MCDRV_ERROR("multimap failed: %d", ret); - } else { - /* Map each buffer */ - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, - map++) { - if (!buf->va) - continue; - - /* Send MCP message to map buffer in SWd */ - ret = mcp_map(session->mcp_session.id, map); - if (ret) { - MCDRV_ERROR("maps[%d] va=%llx map failed: %d", - i, buf->va, ret); - break; - } - } - } - -end: - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - struct tbase_wsm *wsm = wsm_find(session, buf->va); - - if (!buf->va) - continue; - - if (ret) { - if (!wsm) - break; - - /* Destroy mapping */ - wsm_free(wsm); - } else { - /* Store mapping */ - buf->sva = map->secure_va; - wsm->sva = buf->sva; - MCDRV_DBG("maps[%d] va=%llx map'd len=%u sva=%llx", - i, buf->va, buf->len, buf->sva); - } - } - -unlock: - /* Unlock the session */ - mutex_unlock(&session->wsms_lock); - return ret; -} - -/* - * Stop sharing buffers and delete corrsponding WSM objects. - */ -int session_wsms_remove(struct tbase_session *session, - const struct mc_ioctl_buffer *bufs) -{ - const struct mc_ioctl_buffer *buf; - struct mcp_buffer_map maps[MC_MAP_MAX]; - struct mcp_buffer_map *map; - int i, ret = 0; - uint32_t n_null_buf = 0; - - if (!session) { - MCDRV_ERROR("session pointer is null"); - return -EINVAL; - } - - /* Lock the session */ - mutex_lock(&session->wsms_lock); - - /* Find, check and map buffer */ - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; i++, buf++, map++) { - struct tbase_wsm *wsm; - - if (!buf->va) { - n_null_buf++; - map->secure_va = 0; - continue; - } - - wsm = wsm_find(session, buf->va); - if (!wsm) { - ret = -EADDRNOTAVAIL; - MCDRV_ERROR("maps[%d] va=%llx not found", i, - buf->va); - goto out; - } - - /* Check input params consistency */ - /* TODO: fix the spec, "len" is NOT ignored anymore */ - if ((wsm->sva != buf->sva) || (wsm->len != buf->len)) { - MCDRV_ERROR("maps[%d] va=%llx no match: %x != %llx", - i, buf->va, wsm->sva, buf->sva); - MCDRV_ERROR("maps[%d] va=%llx no match: %u != %u", - i, buf->va, wsm->len, buf->len); - ret = -EINVAL; - goto out; - } - - tbase_mmu_buffer(wsm->mmu, map); - map->secure_va = buf->sva; - MCDRV_DBG("maps[%d] va=%llx: t:%u a:%llx o:%u l:%u s:%llx", i, - buf->va, map->type, map->phys_addr, map->offset, - map->length, map->secure_va); - } - - if (n_null_buf >= MC_MAP_MAX) { - ret = -EINVAL; - MCDRV_ERROR("va=NULL"); - goto out; - } - - if (g_ctx.f_multimap) { - /* Send MCP command to unmap buffers in SWd */ - ret = mcp_multiunmap(session->mcp_session.id, maps); - if (ret) - MCDRV_ERROR("mcp_multiunmap failed: %d", ret); - } else { - for (i = 0, buf = bufs, map = maps; i < MC_MAP_MAX; - i++, buf++, map++) { - if (!buf->va) - continue; - - /* Send MCP command to unmap buffer in SWd */ - ret = mcp_unmap(session->mcp_session.id, map); - if (ret) { - MCDRV_ERROR("maps[%d] va=%llx unmap failed: %d", - i, buf->va, ret); - break; - } - } - } - - for (i = 0, buf = bufs; i < MC_MAP_MAX; i++, buf++) { - struct tbase_wsm *wsm = wsm_find(session, buf->va); - - if (!wsm) - break; - - /* Free wsm */ - wsm_free(wsm); - MCDRV_DBG("maps[%d] va=%llx unmap'd len=%u sva=%llx", i, - buf->va, buf->len, buf->sva); - } - -out: - mutex_unlock(&session->wsms_lock); - return ret; -} - -/* - * Sleep until next notification from SWd. - */ -int session_waitnotif(struct tbase_session *session, int32_t timeout) -{ - return mcp_session_waitnotif(&session->mcp_session, timeout); -} - -int session_info(struct tbase_session *session, struct kasnprintf_buf *buf) -{ - struct tbase_wsm *wsm; - int32_t exit_code = mcp_session_exitcode(&session->mcp_session); - int ret; - - ret = kasnprintf(buf, "\tsession %p: %x rc %d\n", session, - session->mcp_session.id, exit_code); - if (ret < 0) - return ret; - - /* WMSs */ - mutex_lock(&session->wsms_lock); - if (list_empty(&session->wsms)) - goto done; - - list_for_each_entry(wsm, &session->wsms, list) { - ret = wsm_info(wsm, buf); - if (ret < 0) - goto done; - } - -done: - mutex_unlock(&session->wsms_lock); - if (ret < 0) - return ret; - - return 0; -} diff --git a/drivers/gud/MobiCoreDriver/session.h b/drivers/gud/MobiCoreDriver/session.h deleted file mode 100644 index aec0c09ae9c9a..0000000000000 --- a/drivers/gud/MobiCoreDriver/session.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (c) 2013-2015 TRUSTONIC LIMITED - * 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. - * - * 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 _SESSION_H_ -#define _SESSION_H_ - -#include - -#include "mcp.h" - -struct tbase_object; -struct tbase_mmu; -struct mc_ioctl_buffer; - -struct tbase_session { - /* Session list lock */ - struct mutex close_lock; - /* MCP session descriptor (MUST BE FIRST) */ - struct mcp_session mcp_session; - /* Owner */ - struct tbase_client *client; - /* Number of references kept to this object */ - struct kref kref; - /* The list entry to attach to session list of owner */ - struct list_head list; - /* Session WSMs lock */ - struct mutex wsms_lock; - /* List of WSMs for a session */ - struct list_head wsms; -}; - -struct tbase_session *session_create(struct tbase_client *client, bool is_gp, - struct mc_identity *identity); -int session_open(struct tbase_session *session, const struct tbase_object *obj, - const struct tbase_mmu *obj_mmu, uintptr_t tci, size_t len); -int session_close(struct tbase_session *session); -static inline void session_get(struct tbase_session *session) -{ - kref_get(&session->kref); -} - -int session_put(struct tbase_session *session); -int session_wsms_add(struct tbase_session *session, - struct mc_ioctl_buffer *bufs); -int session_wsms_remove(struct tbase_session *session, - const struct mc_ioctl_buffer *bufs); -int32_t session_exitcode(struct tbase_session *session); -int session_notify_swd(struct tbase_session *session); -int session_waitnotif(struct tbase_session *session, int32_t timeout); -int session_info(struct tbase_session *session, struct kasnprintf_buf *buf); - -#endif /* _SESSION_H_ */ diff --git a/drivers/gud/setupDrivers.sh b/drivers/gud/setupDrivers.sh deleted file mode 100644 index 994e83e8d9517..0000000000000 --- a/drivers/gud/setupDrivers.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -export COMP_PATH_ROOT=$(dirname $(readlink -f $BASH_SOURCE)) #set this to the absolute path of the folder containing this file - -# This part has to be set by the customer -# To be set, absolute path of kernel folder -export LINUX_PATH= -# To be set, absolute path! CROSS_COMPILE variable needed by kernel eg /home/user/arm-2009q3/bin/arm-none-linux-gnueabi- -export CROSS_COMPILE= -# To be set, build mode debug or release -export MODE=debug -# To be set, the absolute path to the Linux Android NDK -export NDK_PATH= - -# Global variables needed by build scripts -export COMP_PATH_Logwrapper=$COMP_PATH_ROOT/Logwrapper/Out -export COMP_PATH_MobiCore=$COMP_PATH_ROOT/MobiCore/Out -export COMP_PATH_MobiCoreDriverMod=$COMP_PATH_ROOT/mobicore_driver/Out -export COMP_PATH_MobiCoreDriverLib=$COMP_PATH_ROOT/daemon/Out -export COMP_PATH_AndroidNdkLinux=$NDK_PATH diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c index cb4bc0dadba55..a24ef10ae2ba4 100644 --- a/drivers/hid/hid-core.c +++ b/drivers/hid/hid-core.c @@ -1213,6 +1213,7 @@ static void hid_input_field(struct hid_device *hid, struct hid_field *field, /* Ignore report if ErrorRollOver */ if (!(field->flags & HID_MAIN_ITEM_VARIABLE) && value[n] >= min && value[n] <= max && + value[n] - min < field->maxusage && field->usage[value[n] - min].hid == HID_UP_KEYBOARD + 1) goto exit; } @@ -1225,11 +1226,13 @@ static void hid_input_field(struct hid_device *hid, struct hid_field *field, } if (field->value[n] >= min && field->value[n] <= max + && field->value[n] - min < field->maxusage && field->usage[field->value[n] - min].hid && search(value, field->value[n], count)) hid_process_event(hid, field, &field->usage[field->value[n] - min], 0, interrupt); if (value[n] >= min && value[n] <= max + && value[n] - min < field->maxusage && field->usage[value[n] - min].hid && search(field->value, value[n], count)) hid_process_event(hid, field, &field->usage[value[n] - min], 1, interrupt); @@ -1930,7 +1933,6 @@ static const struct hid_device_id hid_have_special_driver[] = { { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_NAVIGATION_CONTROLLER) }, { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS3_CONTROLLER) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) }, - { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_PS4_CONTROLLER) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGX_MOUSE) }, { HID_USB_DEVICE(USB_VENDOR_ID_SONY, USB_DEVICE_ID_SONY_VAIO_VGP_MOUSE) }, { HID_USB_DEVICE(USB_VENDOR_ID_STEELSERIES, USB_DEVICE_ID_STEELSERIES_SRWS1) }, diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c index 2f1ddca6f2e0a..602f16373179c 100644 --- a/drivers/hid/usbhid/hiddev.c +++ b/drivers/hid/usbhid/hiddev.c @@ -510,18 +510,19 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd, goto inval; field = report->field[uref->field_index]; + } - if (cmd == HIDIOCGCOLLECTIONINDEX) { - if (uref->usage_index >= field->maxusage) - goto inval; - } else if (uref->usage_index >= field->report_count) + if (cmd == HIDIOCGCOLLECTIONINDEX) { + if (uref->usage_index >= field->maxusage) goto inval; + } else if (uref->usage_index >= field->report_count) + goto inval; - else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && - (uref_multi->num_values > HID_MAX_MULTI_USAGES || - uref->usage_index + uref_multi->num_values > field->report_count)) - goto inval; - } + else if ((cmd == HIDIOCGUSAGES || cmd == HIDIOCSUSAGES) && + (uref_multi->num_values > HID_MAX_MULTI_USAGES || + uref->usage_index + uref_multi->num_values > + field->report_count)) + goto inval; switch (cmd) { case HIDIOCGUSAGE: diff --git a/drivers/hwmon/qpnp-adc-common.c b/drivers/hwmon/qpnp-adc-common.c index bacb9d857b9c4..5c3509311cdb7 100644 --- a/drivers/hwmon/qpnp-adc-common.c +++ b/drivers/hwmon/qpnp-adc-common.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -387,6 +388,118 @@ static const struct qpnp_vadc_map_pt adcmap_qrd_skut1_btm_threshold[] = { /* Voltage to temperature */ static const struct qpnp_vadc_map_pt adcmap_100k_104ef_104fb[] = { +#ifdef CONFIG_C3N_SMB358 + {1707, -30 }, + {1701, -29}, + {1694, -28}, + {1688, -27}, + {1681, -26}, + {1674, -25}, + {1666, -24}, + {1658, -23}, + {1650, -22}, + {1641, -21}, + {1632, -20}, + {1622, -19}, + {1612, -18}, + {1602, -17}, + {1591, -16}, + {1580, -15}, + {1569, -14}, + {1557, -13}, + {1544, -12}, + {1531, -11}, + {1518, -10}, + {1505, -9}, + {1491, -8}, + {1476, -7}, + {1461, -6}, + {1446, -5}, + {1431, -4}, + {1415, -3}, + {1399, -2}, + {1382, -1}, + {1365, 0}, + {1348, 1}, + {1330, 2 }, + {1313, 3 }, + {1295, 4 }, + {1277, 5 }, + {1258, 6 }, + {1240, 7 }, + {1221, 8 }, + {1202, 9 }, + {1183, 10}, + {1165, 11}, + {1146, 12}, + {1127, 13}, + {1108, 14}, + {1089, 15}, + {1070, 16}, + {1051, 17}, + {1032, 18}, + {1013, 19}, + {995, 20}, + {976, 21}, + {958, 22}, + {940, 23}, + {922, 24}, + {905, 25}, + {888, 26}, + {871, 27}, + {854, 28}, + {837, 29}, + {821, 30}, + {805, 31}, + {790, 32}, + {774, 33}, + {759, 34}, + {745, 35}, + {731, 36}, + {717, 37}, + {703, 38}, + {690, 39}, + {677, 40}, + {664, 41}, + {652, 42}, + {640, 43}, + {628, 44}, + {617, 45}, + {606, 46}, + {595, 47}, + {585, 48}, + {575, 49}, + {565, 50}, + {556, 51}, + {546, 52}, + {538, 53}, + {529, 54}, + {521, 55}, + {513, 56}, + {505, 57}, + {497, 58}, + {490, 59}, + {483, 60}, + {476, 61}, + {470, 62}, + {463, 63}, + {457, 64}, + {451, 65}, + {445, 66}, + {440, 67}, + {434, 68}, + {429, 69}, + {424, 70}, + {419, 71}, + {415, 72}, + {410, 73}, + {406, 74}, + {402, 75}, + {398, 76}, + {394, 77}, + {390, 78}, + {386, 79} +#else {1758, -40}, {1742, -35}, {1719, -30}, @@ -421,6 +534,7 @@ static const struct qpnp_vadc_map_pt adcmap_100k_104ef_104fb[] = { {59, 115}, {51, 120}, {44, 125} +#endif }; /* Voltage to temperature */ diff --git a/drivers/hwtracing/coresight/coresight-csr.c b/drivers/hwtracing/coresight/coresight-csr.c index dfb2922b6f330..3c18d686091a4 100644 --- a/drivers/hwtracing/coresight/coresight-csr.c +++ b/drivers/hwtracing/coresight/coresight-csr.c @@ -191,8 +191,6 @@ static int csr_probe(struct platform_device *pdev) drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; - /* Store the driver data pointer for use in exported functions */ - csrdrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); @@ -220,6 +218,8 @@ static int csr_probe(struct platform_device *pdev) if (IS_ERR(drvdata->csdev)) return PTR_ERR(drvdata->csdev); + /* Store the driver data pointer for use in exported functions */ + csrdrvdata = drvdata; dev_info(dev, "CSR initialized\n"); return 0; } diff --git a/drivers/hwtracing/coresight/coresight-stm.c b/drivers/hwtracing/coresight/coresight-stm.c index b911be00b338e..3093e15dc30dc 100644 --- a/drivers/hwtracing/coresight/coresight-stm.c +++ b/drivers/hwtracing/coresight/coresight-stm.c @@ -774,8 +774,6 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id) drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; - /* Store the driver data pointer for use in exported functions */ - stmdrvdata = drvdata; drvdata->dev = &adev->dev; dev_set_drvdata(dev, drvdata); @@ -851,6 +849,8 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id) if (boot_enable) coresight_enable(drvdata->csdev); + /* Store the driver data pointer for use in exported functions */ + stmdrvdata = drvdata; return 0; err: coresight_unregister(drvdata->csdev); diff --git a/drivers/hwtracing/coresight/coresight-tmc.c b/drivers/hwtracing/coresight/coresight-tmc.c index e1c1744e29176..a9a154c28302d 100644 --- a/drivers/hwtracing/coresight/coresight-tmc.c +++ b/drivers/hwtracing/coresight/coresight-tmc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012, 2016 The Linux Foundation. All rights reserved. +/* Copyright (c) 2012, 2016-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 @@ -744,6 +744,16 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) pm_runtime_get_sync(drvdata->dev); mutex_lock(&drvdata->mem_lock); + + spin_lock_irqsave(&drvdata->spinlock, flags); + if (drvdata->reading) { + spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->mem_lock); + pm_runtime_put(drvdata->dev); + return -EBUSY; + } + spin_unlock_irqrestore(&drvdata->spinlock, flags); + if (drvdata->config_type == TMC_CONFIG_TYPE_ETR && drvdata->out_mode == TMC_ETR_OUT_MODE_MEM) { /* @@ -778,17 +788,8 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) return ret; } } - mutex_unlock(&drvdata->mem_lock); spin_lock_irqsave(&drvdata->spinlock, flags); - if (drvdata->reading) { - spin_unlock_irqrestore(&drvdata->spinlock, flags); - if (drvdata->config_type == TMC_CONFIG_TYPE_ETR - && drvdata->out_mode == TMC_ETR_OUT_MODE_USB) - usb_qdss_close(drvdata->usbch); - pm_runtime_put(drvdata->dev); - return -EBUSY; - } if (drvdata->config_type == TMC_CONFIG_TYPE_ETB) { tmc_etb_enable_hw(drvdata); @@ -803,6 +804,7 @@ static int tmc_enable(struct tmc_drvdata *drvdata, enum tmc_mode mode) } drvdata->enable = true; spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->mem_lock); dev_info(drvdata->dev, "TMC enabled\n"); return 0; @@ -1046,6 +1048,7 @@ static int tmc_read_prepare(struct tmc_drvdata *drvdata) unsigned long flags; enum tmc_mode mode; + mutex_lock(&drvdata->mem_lock); spin_lock_irqsave(&drvdata->spinlock, flags); if (!drvdata->enable) goto out; @@ -1066,11 +1069,13 @@ static int tmc_read_prepare(struct tmc_drvdata *drvdata) out: drvdata->reading = true; spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->mem_lock); dev_info(drvdata->dev, "TMC read start\n"); return 0; err: spin_unlock_irqrestore(&drvdata->spinlock, flags); + mutex_unlock(&drvdata->mem_lock); return ret; } @@ -1245,7 +1250,11 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, { struct tmc_drvdata *drvdata = container_of(file->private_data, struct tmc_drvdata, miscdev); - char *bufp = drvdata->buf + *ppos; + char *bufp; + + mutex_lock(&drvdata->mem_lock); + + bufp = drvdata->buf + *ppos; if (*ppos + len > drvdata->size) len = drvdata->size - *ppos; @@ -1267,6 +1276,7 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, if (copy_to_user(data, bufp, len)) { dev_dbg(drvdata->dev, "%s: copy_to_user failed\n", __func__); + mutex_unlock(&drvdata->mem_lock); return -EFAULT; } @@ -1274,6 +1284,8 @@ static ssize_t tmc_read(struct file *file, char __user *data, size_t len, dev_dbg(drvdata->dev, "%s: %zu bytes copied, %d bytes left\n", __func__, len, (int)(drvdata->size - *ppos)); + + mutex_unlock(&drvdata->mem_lock); return len; } diff --git a/drivers/input/Makefile b/drivers/input/Makefile index ee4c06520bb43..650452afb9bc1 100644 --- a/drivers/input/Makefile +++ b/drivers/input/Makefile @@ -28,3 +28,4 @@ obj-$(CONFIG_INPUT_APMPOWER) += apm-power.o obj-$(CONFIG_INPUT_KEYRESET) += keyreset.o obj-$(CONFIG_INPUT_KEYCOMBO) += keycombo.o +obj-y += radio_freq_up.o diff --git a/drivers/input/misc/hbtp_input.c b/drivers/input/misc/hbtp_input.c index adca5e8bddde7..ee9ded91cded9 100644 --- a/drivers/input/misc/hbtp_input.c +++ b/drivers/input/misc/hbtp_input.c @@ -415,9 +415,13 @@ static int hbtp_input_create_input_dev(struct hbtp_input_absinfo *absinfo) input_mt_init_slots(input_dev, HBTP_MAX_FINGER, 0); for (i = 0; i <= ABS_MT_LAST - ABS_MT_FIRST; i++) { abs = absinfo + i; - if (abs->active) - input_set_abs_params(input_dev, abs->code, + if (abs->active) { + if (abs->code >= 0 && abs->code < ABS_CNT) + input_set_abs_params(input_dev, abs->code, abs->minimum, abs->maximum, 0, 0); + else + pr_err("%s: ABS code out of bound\n", __func__); + } } if (hbtp->override_disp_coords) { diff --git a/drivers/input/misc/keychord.c b/drivers/input/misc/keychord.c index a5ea27ad0e16c..f580edf1c87ce 100644 --- a/drivers/input/misc/keychord.c +++ b/drivers/input/misc/keychord.c @@ -300,8 +300,10 @@ static ssize_t keychord_write(struct file *file, const char __user *buffer, ret = input_register_handler(&kdev->input_handler); if (ret) { - kfree(keychords); + spin_lock_irqsave(&kdev->lock, flags); + kfree(kdev->keychords); kdev->keychords = 0; + spin_unlock_irqrestore(&kdev->lock, flags); return ret; } kdev->registered = 1; diff --git a/drivers/input/radio_freq_up.c b/drivers/input/radio_freq_up.c new file mode 100644 index 0000000000000..3720f66036276 --- /dev/null +++ b/drivers/input/radio_freq_up.c @@ -0,0 +1,292 @@ +/** + * Copyright (C) 2017.9.1 Wingtech + * Copyright (C) 2018 XiaoMi, Inc. + * + * Songmuchun Create + * + * 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. + */ +#define pr_fmt(fmt) "[radio_frequence]: " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* + * Debug messages level + */ +static int debug; +module_param(debug, int, 0644); + +/* debug code */ +#define radio_fre_dbg(msg...) do { \ + if (debug > 0) { \ + pr_info(msg); \ + } \ +} while (0) + +/** + * struct radio_freq_platform_data - The radio_freq_platform_data structure + * @irq: irq number(virtual). + * @type: type of the event (EV_KEY, EV_REL, etc...). + * @code: event code. + * @det_gpio: gpio number. + * @debounce_interval: how many msecs to debounce from device tree. + * @timer_debounce: software time debounce when gpiolib doesn't provide debounce. + * @work: delayed work. + * @det_gpio_flags: gpio flags from device tree. + * @input_dev: input device that is registered. + */ +struct radio_freq_platform_data { + int irq; + unsigned int type; + unsigned int code[2]; + int det_gpio; + int debounce_interval; + int timer_debounce; + struct delayed_work work; + enum of_gpio_flags det_gpio_flags; + struct input_dev *input_dev; +}; + +static void radio_freq__work_func(struct work_struct *work) +{ + struct radio_freq_platform_data *pdata = + container_of(work, struct radio_freq_platform_data, work.work); + int value; + unsigned int code; + + value = gpio_get_value(pdata->det_gpio); + radio_fre_dbg("gpio input value = %d\n", value); + + code = value ? pdata->code[0] : pdata->code[1]; + input_event(pdata->input_dev, pdata->type, code, 1); + input_sync(pdata->input_dev); + input_event(pdata->input_dev, pdata->type, code, 0); + input_sync(pdata->input_dev); +} + +static irqreturn_t radio_freq_interrupt(int irq, void *dev_id) +{ + struct radio_freq_platform_data *pdata = dev_id; + + radio_fre_dbg("irq enter\n"); + BUG_ON(irq != pdata->irq); + + mod_delayed_work(system_wq, + &pdata->work, + msecs_to_jiffies(pdata->timer_debounce)); + radio_fre_dbg("irq exit\n"); + + return IRQ_HANDLED; +} + +static int radio_freq_input_dev_init(struct device *dev) +{ + int i; + struct radio_freq_platform_data *pdata = dev_get_drvdata(dev); + struct input_dev *input_dev = pdata->input_dev; + + /* Init and register input device */ + input_dev->name = dev->driver->name; + input_dev->id.bustype = BUS_HOST; + input_dev->dev.parent = dev; + + input_set_drvdata(input_dev, pdata); + for (i = 0; i < sizeof(pdata->code) / sizeof(pdata->code[0]); i++) + input_set_capability(input_dev, pdata->type, pdata->code[i]); + + return input_register_device(input_dev); +} + +/** + * radio_freq_prase_dt - prase device tree. + * @dev: pointer to the device structure + * + * @return: 0 if success, otherwise negative number will be return. + */ +static int radio_freq_prase_dt(struct device *dev) +{ + struct device_node *dev_node = dev->of_node; + struct platform_device *pdev = to_platform_device(dev); + struct radio_freq_platform_data *pdata = dev_get_drvdata(dev); + + if (of_property_read_u32(dev_node, "debounce-interval", &pdata->debounce_interval)) + pdata->debounce_interval = 10; + + pdata->det_gpio = of_get_gpio_flags(dev_node, 0, &pdata->det_gpio_flags); + if (unlikely(!gpio_is_valid(pdata->det_gpio))) { + pr_err("failed to prase gpios property!\n"); + return -EPERM; + } + + if (of_property_read_u32_array(dev_node, "linux,code", pdata->code, + sizeof(pdata->code) / sizeof(pdata->code[0]))) { + pr_err("without keycode: 0x%x\n", pdata->det_gpio); + return -EPERM; + } + + if (of_property_read_u32(dev_node, "linux,input-type", &pdata->type)) + pdata->type = EV_KEY; + + pdata->irq = platform_get_irq(pdev, 0); + if (unlikely(pdata->irq < 0)) { + pr_err("failed to prase irq property!\n"); + return pdata->irq; + } + + return 0; +} + +static int radio_freq_suspend(struct device *dev) +{ + struct radio_freq_platform_data *pdata = dev_get_drvdata(dev); + + radio_fre_dbg("suspend\n"); + enable_irq_wake(pdata->irq); + + return 0; +} + +static int radio_freq_resume(struct device *dev) +{ + struct radio_freq_platform_data *pdata = dev_get_drvdata(dev); + + radio_fre_dbg("resume\n"); + disable_irq_wake(pdata->irq); + + return 0; +} + +/** + * radio_freq_quiesce - prase device tree. + * @data: pointer to the private data + * + * This function will cancel the delayed work which is registered.When the driver probe + * is failure or driver is removed, the driver model will invoke this function to free + * device resource. + */ +static void radio_freq_quiesce(void *data) +{ + struct radio_freq_platform_data *pdata = data; + + cancel_delayed_work(&pdata->work); +} + +static int radio_freq_probe(struct platform_device *pdev) +{ + int ret; + struct radio_freq_platform_data *pdata; + struct device *dev = &pdev->dev; + const char *devname = dev_name(dev); + + pr_info("radio frequence detection probe start\n"); + + if (likely(pdev->dev.of_node)) { + pdata = devm_kzalloc(dev, sizeof(*pdata), GFP_KERNEL); + if (!pdata) { + pr_err("failed to allocate memory!\n"); + return -ENOMEM; + } + platform_set_drvdata(pdev, pdata); + + ret = radio_freq_prase_dt(dev); + if (ret < 0) { + pr_err("failed to prase device tree!\n"); + return ret; + } + } else { + pr_err("device node is not exist!\n"); + return -EPERM; + } + + /** + * Allocate and register input device. + */ + pdata->input_dev = devm_input_allocate_device(dev); + if (!pdata->input_dev) { + pr_err("failed to allocate input device!\n"); + return -EPERM; + } + ret = radio_freq_input_dev_init(dev); + if (unlikely(ret)) { + pr_err("failed to register input device!\n"); + return ret; + } + + /** + * After prase dt, we can do some usingfull thing. + */ + ret = gpio_set_debounce(pdata->det_gpio, pdata->debounce_interval * 1000); + /* use timer if gpiolib doesn't provide debounce */ + if (ret < 0) + pdata->timer_debounce = pdata->debounce_interval; + + INIT_DELAYED_WORK(&pdata->work, radio_freq__work_func); + ret = devm_add_action(dev, radio_freq_quiesce, pdata); + if (unlikely(ret)) { + pr_err("failed to register quiesce action, error: %d\n", ret); + return ret; + } + + ret = devm_gpio_request_one(dev, pdata->det_gpio, + GPIOF_IN | GPIOF_EXPORT, "radio_frequence_det_gpio"); + if (unlikely(ret)) { + pr_err("failed to request gpio %d\n", pdata->det_gpio); + return ret; + } + + ret = devm_request_any_context_irq(dev, pdata->irq, radio_freq_interrupt, + irq_get_trigger_type(pdata->irq), + devname ?: dev->driver->name, pdata); + if (unlikely(ret)) { + pr_err("failed to request irq %d\n", pdata->irq); + return ret; + } + + device_init_wakeup(dev, true); + + pr_info("radio frequence detection probe end\n"); + + return 0; +} + +static int radio_freq_remove(struct platform_device *pdev) +{ + return 0; +} + +static const struct of_device_id radio_freq_of_match[] = { + {.compatible = "wingtech,radio_frequence_detection",}, + {/* sentinel */} +}; + +MODULE_DEVICE_TABLE(of, radio_freq_of_match); + +static SIMPLE_DEV_PM_OPS(radio_freq_pm_ops, radio_freq_suspend, radio_freq_resume); + +static struct platform_driver radio_freq_driver = { + .driver = { + .owner = THIS_MODULE, + .name = "radio_frequence", + .pm = &radio_freq_pm_ops, + .of_match_table = of_match_ptr(radio_freq_of_match), + }, + .probe = radio_freq_probe, + .remove = radio_freq_remove, +}; + +module_platform_driver(radio_freq_driver); + +MODULE_DESCRIPTION("radio frequence gpio check driver"); +MODULE_AUTHOR("Songmuchun "); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/FT5346/Kconfig b/drivers/input/touchscreen/FT5346/Kconfig new file mode 100644 index 0000000000000..9526203554275 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/Kconfig @@ -0,0 +1,5 @@ + +config TOUCHSCREEN_FT5346 + tristate "FOCALTECH FT5346 touchpanel driver" + depends on CONFIG_INPUT_TOUCHSCREEN + default n diff --git a/drivers/input/touchscreen/FT5346/Makefile b/drivers/input/touchscreen/FT5346/Makefile new file mode 100644 index 0000000000000..2bb007c0389ab --- /dev/null +++ b/drivers/input/touchscreen/FT5346/Makefile @@ -0,0 +1,3 @@ +#FT5336 touchpanel driver + +obj-y += ft5346.o focaltech_global/ focaltech_test/ diff --git a/drivers/input/touchscreen/FT5346/focaltech_global/Makefile b/drivers/input/touchscreen/FT5346/focaltech_global/Makefile new file mode 100644 index 0000000000000..fac3f7882f6ce --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_global/Makefile @@ -0,0 +1,6 @@ +#drivers/input/touchscreen/focaltech_touch +# +#Makefile for flash module +# + +obj-y += focaltech_ic_table.o diff --git a/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_global.h b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_global.h new file mode 100644 index 0000000000000..8508b406d9a54 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_global.h @@ -0,0 +1,19 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: Global.c +* +* Author: Software Development Team, AE +* +* Created: 2015-07-14 +* +* Abstract: global function for test +* +************************************************************************/ +#ifndef _FOCALTECH_GLOBAL_H +#define _FOCALTECH_GLOBAL_H + +#include "focaltech_ic_table.h" + +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.c b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.c new file mode 100644 index 0000000000000..3ebd10b198a6c --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.c @@ -0,0 +1,531 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2016, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/******************************************************************************* +* +* File Name: Focaltech_ic_table.c +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*******************************************************************************/ + +/******************************************************************************* +* 1.Included header files +*******************************************************************************/ + +#include +#include +#include "focaltech_ic_table.h" + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ +#define FOCALTECH_IC_TABLE_INFO "File Version of focaltech_ic_table.c: V1.0.0 2016-03-22" + +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ + +/******************************************************************************* +* Static variables +*******************************************************************************/ + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ + + +/******************************************************************************* +* functions body +*******************************************************************************/ + + + +unsigned int fts_ic_table_get_ic_code_from_ic_name(char *strIcName) +{ + + if (strncmp(strIcName, "FT5X36", 6) == 0) + return IC_FT5X36; + if (strncmp(strIcName, "FT5X36i", 7) == 0) + return IC_FT5X36i; + if (strncmp(strIcName, "FT3X16", 6) == 0) + return IC_FT3X16; + if (strncmp(strIcName, "FT3X26", 6) == 0) + return IC_FT3X26; + + if (strncmp(strIcName, "FT5X22", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46i", 7) == 0) + return IC_FT5X46i; + if (strncmp(strIcName, "FT5526", 6) == 0) + return IC_FT5526; + if (strncmp(strIcName, "FT3X17", 6) == 0) + return IC_FT3X17; + if (strncmp(strIcName, "FT5436", 6) == 0) + return IC_FT5436; + if (strncmp(strIcName, "FT3X27", 6) == 0) + return IC_FT3X27; + if (strncmp(strIcName, "FT5526i", 7) == 0) + return IC_FT5526I; + if (strncmp(strIcName, "FT5416", 6) == 0) + return IC_FT5416; + if (strncmp(strIcName, "FT5426", 6) == 0) + return IC_FT5426; + if (strncmp(strIcName, "FT5435", 6) == 0) + return IC_FT5435; + if (strncmp(strIcName, "FT7681", 6) == 0) + return IC_FT7681; + if (strncmp(strIcName, "FT7661", 6) == 0) + return IC_FT7661; + if (strncmp(strIcName, "FT7511", 6) == 0) + return IC_FT7511; + if (strncmp(strIcName, "FT7421", 6) == 0) + return IC_FT7421; + + + if (strncmp(strIcName, "FT6X06", 6) == 0) + return IC_FT6X06; + if (strncmp(strIcName, "FT3X06", 6) == 0) + return IC_FT3X06; + + if (strncmp(strIcName, "FT6X36", 6) == 0) + return IC_FT6X36; + if (strncmp(strIcName, "FT3X07", 6) == 0) + return IC_FT3X07; + if (strncmp(strIcName, "FT6416", 6) == 0) + return IC_FT6416; + if (strncmp(strIcName, "FT6336G/U", 9) == 0) + return IC_FT6426; + if (strncmp(strIcName, "FT6236U", 7) == 0) + return IC_FT6236U; + if (strncmp(strIcName, "FT6436U", 7) == 0) + return IC_FT6436U; + if (strncmp(strIcName, "FT3267", 6) == 0) + return IC_FT3267; + if (strncmp(strIcName, "FT3367", 6) == 0) + return IC_FT3367; + if (strncmp(strIcName, "FT7401", 6) == 0) + return IC_FT7401; + if (strncmp(strIcName, "FT3407U", 7) == 0) + return IC_FT3407U; + + + + if (strncmp(strIcName, "FT5X16", 6) == 0) + return IC_FT5X16; + if (strncmp(strIcName, "FT5X12", 6) == 0) + return IC_FT5X12; + + if (strncmp(strIcName, "FT5506", 6) == 0) + return IC_FT5506; + if (strncmp(strIcName, "FT5606", 6) == 0) + return IC_FT5606; + if (strncmp(strIcName, "FT5816", 6) == 0) + return IC_FT5816; + + if (strncmp(strIcName, "FT5822", 6) == 0) + return IC_FT5822; + if (strncmp(strIcName, "FT5626", 6) == 0) + return IC_FT5626; + if (strncmp(strIcName, "FT5726", 6) == 0) + return IC_FT5726; + if (strncmp(strIcName, "FT5826B", 7) == 0) + return IC_FT5826B; + if (strncmp(strIcName, "FT3617", 6) == 0) + return IC_FT3617; + if (strncmp(strIcName, "FT3717", 6) == 0) + return IC_FT3717; + if (strncmp(strIcName, "FT7811", 6) == 0) + return IC_FT7811; + if (strncmp(strIcName, "FT5826S", 7) == 0) + return IC_FT5826S; + + if (strncmp(strIcName, "FT5306", 6) == 0) + return IC_FT5306; + if (strncmp(strIcName, "FT5406", 6) == 0) + return IC_FT5406; + + if (strncmp(strIcName, "FT8606", 6) == 0) + return IC_FT8606; + if (strncmp(strIcName, "FT8716", 6) == 0) + return IC_FT8716; + + if (strncmp(strIcName, "FT3C47U", 7) == 0) + return IC_FT3C47U; + + if (strncmp(strIcName, "FT8607", 6) == 0) + return IC_FT8607; + if (strncmp(strIcName, "FT8707", 6) == 0) + return IC_FT8707; + + + if (strncmp(strIcName, "FT8736", 6) == 0) + return IC_FT8736; + + if (strncmp(strIcName, "FT3D47", 6) == 0) + return IC_FT3D47; + + if (strncmp(strIcName, "FTE716", 6) == 0) + return IC_FTE716; + + if (strncmp(strIcName, "FT5442", 6) == 0) + return IC_FT5442; + + if (strncmp(strIcName, "FT3428U", 7) == 0) + return IC_FT3428U; + + if (strncmp(strIcName, "FT8006", 6) == 0) + return IC_FT8006; + + if (strncmp(strIcName, "FTE736", 6) == 0) + return IC_FTE736; + + printk("%s. can NOT get ic code. ERROR !!! \n", __func__); + + return 0xff; +} + + +void fts_ic_table_get_ic_name_from_ic_code(unsigned int ucIcCode, char *strIcName) +{ + if (NULL == strIcName) + return; + + sprintf(strIcName, "%s", "NA");/*if can't find IC , set 'NA'*/ + + if (ucIcCode == IC_FT5X36) + sprintf(strIcName, "%s", "FT5X36"); + if (ucIcCode == IC_FT5X36i) + sprintf(strIcName, "%s", "FT5X36i"); + if (ucIcCode == IC_FT3X16) + sprintf(strIcName, "%s", "FT3X16"); + if (ucIcCode == IC_FT3X26) + sprintf(strIcName, "%s", "FT3X26"); + + + if (ucIcCode == IC_FT5X46) + sprintf(strIcName, "%s", "FT5X46"); + if (ucIcCode == IC_FT5X46i) + sprintf(strIcName, "%s", "FT5X46i"); + if (ucIcCode == IC_FT5526) + sprintf(strIcName, "%s", "FT5526"); + if (ucIcCode == IC_FT3X17) + sprintf(strIcName, "%s", "FT3X17"); + if (ucIcCode == IC_FT5436) + sprintf(strIcName, "%s", "FT5436"); + if (ucIcCode == IC_FT3X27) + sprintf(strIcName, "%s", "FT3X27"); + if (ucIcCode == IC_FT5526I) + sprintf(strIcName, "%s", "FT5526i"); + if (ucIcCode == IC_FT5416) + sprintf(strIcName, "%s", "FT5416"); + if (ucIcCode == IC_FT5426) + sprintf(strIcName, "%s", "FT5426"); + if (ucIcCode == IC_FT5435) + sprintf(strIcName, "%s", "FT5435"); + if (ucIcCode == IC_FT7681) + sprintf(strIcName, "%s", "FT7681"); + if (ucIcCode == IC_FT7661) + sprintf(strIcName, "%s", "FT7661"); + if (ucIcCode == IC_FT7511) + sprintf(strIcName, "%s", "FT7511"); + if (ucIcCode == IC_FT7421) + sprintf(strIcName, "%s", "FT7421"); + + if (ucIcCode == IC_FT6X06) + sprintf(strIcName, "%s", "FT6X06"); + if (ucIcCode == IC_FT3X06) + sprintf(strIcName, "%s", "FT3X06"); + + if (ucIcCode == IC_FT6X36) + sprintf(strIcName, "%s", "FT6X36"); + if (ucIcCode == IC_FT3X07) + sprintf(strIcName, "%s", "FT3X07"); + if (ucIcCode == IC_FT6416) + sprintf(strIcName, "%s", "FT6416"); + if (ucIcCode == IC_FT6426) + sprintf(strIcName, "%s", "FT6336G/U"); + if (ucIcCode == IC_FT6236U) + sprintf(strIcName, "%s", "FT6236U"); + if (ucIcCode == IC_FT6436U) + sprintf(strIcName, "%s", "FT6436U"); + if (ucIcCode == IC_FT3267) + sprintf(strIcName, "%s", "FT3267"); + if (ucIcCode == IC_FT3367) + sprintf(strIcName, "%s", "FT3367"); + if (ucIcCode == IC_FT7401) + sprintf(strIcName, "%s", "FT7401"); + if (ucIcCode == IC_FT3407U) + sprintf(strIcName, "%s", "FT3407U"); + + if (ucIcCode == IC_FT5X16) + sprintf(strIcName, "%s", "FT5X16"); + if (ucIcCode == IC_FT5X12) + sprintf(strIcName, "%s", "FT5X12"); + + if (ucIcCode == IC_FT5506) + sprintf(strIcName, "%s", "FT5506"); + if (ucIcCode == IC_FT5606) + sprintf(strIcName, "%s", "FT5606"); + if (ucIcCode == IC_FT5816) + sprintf(strIcName, "%s", "FT5816"); + + if (ucIcCode == IC_FT5822) + sprintf(strIcName, "%s", "FT5822"); + if (ucIcCode == IC_FT5626) + sprintf(strIcName, "%s", "FT5626"); + if (ucIcCode == IC_FT5726) + sprintf(strIcName, "%s", "FT5726"); + if (ucIcCode == IC_FT5826B) + sprintf(strIcName, "%s", "FT5826B"); + if (ucIcCode == IC_FT3617) + sprintf(strIcName, "%s", "FT3617"); + if (ucIcCode == IC_FT3717) + sprintf(strIcName, "%s", "FT3717"); + if (ucIcCode == IC_FT7811) + sprintf(strIcName, "%s", "FT7811"); + if (ucIcCode == IC_FT5826S) + sprintf(strIcName, "%s", "FT5826S"); + + if (ucIcCode == IC_FT5306) + sprintf(strIcName, "%s", "FT5306"); + if (ucIcCode == IC_FT5406) + sprintf(strIcName, "%s", "FT5406"); + + if (ucIcCode == IC_FT8606) + sprintf(strIcName, "%s", "FT8606"); + if (ucIcCode == IC_FT8716) + sprintf(strIcName, "%s", "FT8716"); + + if (ucIcCode == IC_FT3C47U) + sprintf(strIcName, "%s", "FT3C47U"); + + if (ucIcCode == IC_FT8607) + sprintf(strIcName, "%s", "FT8607"); + if (ucIcCode == IC_FT8707) + sprintf(strIcName, "%s", "FT8707"); + if (ucIcCode == IC_FT8736) + sprintf(strIcName, "%s", "FT8736"); + + if (ucIcCode == IC_FT3D47) + sprintf(strIcName, "%s", "FT3D47"); + + if (ucIcCode == IC_FTE716) + sprintf(strIcName, "%s", "FTE716"); + + if (ucIcCode == IC_FT5442) + sprintf(strIcName, "%s", "FT5442"); + + if (ucIcCode == IC_FT3428U) + sprintf(strIcName, "%s", "FT3428U"); + + if (ucIcCode == IC_FT8006) + sprintf(strIcName, "%s", "FT8006"); + + if (ucIcCode == IC_FTE736) + sprintf(strIcName, "%s", "FTE736"); + + return ; +} + + +unsigned int fts_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2) +{ + unsigned int ic_code = 0; + switch (chip_id) { + case 0x55: + ic_code = IC_FT5306; + break; + case 0x08: + ic_code = IC_FT5606; + break; + case 0x0a: + ic_code = IC_FT5X16; + break; + case 0x06: + ic_code = IC_FT6X06; + break; + case 0x36: + ic_code = IC_FT6X36; + break; + case 0x14: + ic_code = IC_FT5X36; + break; + case 0x13: + ic_code = IC_FT3X16; + break; + case 0x12: + ic_code = IC_FT5X36i; + break; + case 0x11: + ic_code = IC_FT5X36i; + break; + case 0x54: + ic_code = IC_FT5X46; + break; + case 0x58: + ic_code = IC_FT5822; + break; + + + case 0x86: + if (0x06 == chip_id2) + ic_code = IC_FT8606; + else if (0x07 == chip_id2) + ic_code = IC_FT8607; + break; + case 0x87: + if (0x07 == chip_id2) + ic_code = IC_FT8707; + else if (0x16 == chip_id2) + ic_code = IC_FT8716; + else if (0x36 == chip_id2) + ic_code = IC_FT8736; + break; + case 0xE7: + if (0x16 == chip_id2) + ic_code = IC_FTE716; + else if (0x36 == chip_id2) + ic_code = IC_FTE736; + break; + + default: + ic_code = 0; + break; + + } + return ic_code; +} + + +unsigned int fts_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2) +{ + unsigned char uc_chip_id = 0; + unsigned char uc_chip_id2 = 0; + switch (ic_code>>4) { + case (IC_FT5306>>4): + uc_chip_id = 0x55; + break; + case (IC_FT5606>>4): + uc_chip_id = 0x08; + break; + case (IC_FT5X16>>4): + uc_chip_id = 0x0a; + break; + case (IC_FT6X06>>4): + uc_chip_id = 0x06; + break; + case (IC_FT6X36>>4): + uc_chip_id = 0x36; + break; + case (IC_FT5X36>>4): + switch (ic_code) { + case (IC_FT5X36): + uc_chip_id = 0x14; + break; + case (IC_FT3X26): + uc_chip_id = 0x13; + break; + case (IC_FT3X16): + uc_chip_id = 0x12; + break; + case (IC_FT5X36i): + uc_chip_id = 0x11; + break; + } + break; + case (IC_FT5X46>>4): + uc_chip_id = 0x54; + break; + case (IC_FT5822>>4): + uc_chip_id = 0x58; + break; + + + case (IC_FT8606>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x06; + break; + case (IC_FT8607>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x07; + break; + case (IC_FT8707>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x07; + break; + case (IC_FT8716>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x16; + break; + case (IC_FT8736>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x36; + break; + case (IC_FTE716>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x16; + break; + case (IC_FTE736>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x36; + break; + + default: + uc_chip_id = 0; + break; + + } + + *chip_id = uc_chip_id; + *chip_id2 = uc_chip_id2; + + return 0; +} +int fts_ic_table_need_chip_id2(unsigned int chip_id) +{ + int b_need_id2 = -1; + switch (chip_id) { + case 0x86: + case 0x87: + case 0xE7: + b_need_id2 = 0; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + default: + b_need_id2 = -1; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + + } + return b_need_id2; +} diff --git a/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.h b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.h new file mode 100644 index 0000000000000..b4cd1fb1dafac --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_global/focaltech_ic_table.h @@ -0,0 +1,114 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2016, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +#ifndef __FOCALTECH_IC_TABLE_H__ +#define __FOCALTECH_IC_TABLE_H__ +/******************************************************************************* +* +* File Name: focaltech_ic_table.h +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*******************************************************************************/ + +/******************************************************************************* +* 1.Included header files +*******************************************************************************/ + +/*----------------------------------------------------------- +IC corresponding code, each of the IC code is 8 bit, high 4 bit on behalf of the same series, low 4 bit on behalf of the specific IC +-----------------------------------------------------------*/ +enum IC_Type { + IC_FT5X36 = 0x10, + IC_FT5X36i = 0x11, + IC_FT3X16 = 0x12, + IC_FT3X26 = 0x13, + + IC_FT5X46 = 0x21, + IC_FT5X46i = 0x22, + IC_FT5526 = 0x23, + IC_FT3X17 = 0x24, + IC_FT5436 = 0x25, + IC_FT3X27 = 0x26, + IC_FT5526I = 0x27, + IC_FT5416 = 0x28, + IC_FT5426 = 0x29, + IC_FT5435 = 0x2A, + IC_FT7681 = 0x2B, + IC_FT7661 = 0x2C, + IC_FT7511 = 0x2D, + IC_FT7421 = 0x2E, + IC_FT6X06 = 0x30, + IC_FT3X06 = 0x31, + IC_FT6X36 = 0x40, + IC_FT3X07 = 0x41, + IC_FT6416 = 0x42, + IC_FT6426 = 0x43, + IC_FT7401 = 0x44, + IC_FT3407U = 0x45, + IC_FT6236U = 0x46, + IC_FT6436U = 0x47, + IC_FT3267 = 0x48, + IC_FT3367 = 0x49, + IC_FT5X16 = 0x50, + IC_FT5X12 = 0x51, + IC_FT5506 = 0x60, + IC_FT5606 = 0x61, + IC_FT5816 = 0x62, + IC_FT5822 = 0x70, + IC_FT5626 = 0x71, + IC_FT5726 = 0x72, + IC_FT5826B = 0x73, + IC_FT3617 = 0x74, + IC_FT3717 = 0x75, + IC_FT7811 = 0x76, + IC_FT5826S = 0x77, + IC_FT5306 = 0x80, + IC_FT5406 = 0x81, + IC_FT8606 = 0x90, + IC_FT8716 = 0xA0, + IC_FT3C47U = 0xB0, + IC_FT8607 = 0xC0, + IC_FT8707 = 0xD0, + IC_FT8736 = 0xE0, + IC_FT3D47 = 0xF0, + IC_FTE716 = 0x100, + IC_FT5442 = 0x110, + IC_FT3428U = 0x120, + IC_FT8006 = 0x130, + IC_FTE736 = 0x140 +}; + + + +extern unsigned int fts_ic_table_get_ic_code_from_ic_name(char *strIcName); +extern void fts_ic_table_get_ic_name_from_ic_code(unsigned int ic_code, char *strIcName); + +extern unsigned int fts_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2); +extern unsigned int fts_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2); +extern int fts_ic_table_need_chip_id2(unsigned int chip_id); + +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/Makefile b/drivers/input/touchscreen/FT5346/focaltech_test/Makefile new file mode 100644 index 0000000000000..94567c601458c --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/Makefile @@ -0,0 +1,9 @@ +#drivers/input/touchscreen/mediatek/focaltech_ts/focaltech_test +# +#Makefile for test module +# + +obj-y += src/ supported_ic/ + + + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/focaltech_test_config.h b/drivers/input/touchscreen/FT5346/focaltech_test/focaltech_test_config.h new file mode 100644 index 0000000000000..28223ff5b611e --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/focaltech_test_config.h @@ -0,0 +1,35 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_config.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +***************************************************************ene*********/ +#ifndef _GLOBAL_H +#define _GLOBAL_H + + +/*----------------------------------------------------------- +IC Type Test +-----------------------------------------------------------*/ + +#define FT3C47_TEST 0 +#define FT5822_TEST 0 +#define FT5X46_TEST 1 +#define FT6X36_TEST 0 +#define FT8606_TEST 0 +#define FT8607_TEST 0 +#define FT8716_TEST 0 +#define FT8736_TEST 0 +#define FTE716_TEST 0 +#define FTE736_TEST 0 +#define FT8006_TEST 0 + + +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_detail_threshold.h b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_detail_threshold.h new file mode 100644 index 0000000000000..295a7d5101947 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_detail_threshold.h @@ -0,0 +1,142 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ + +#ifndef _DETAIL_THRESHOLD_H +#define _DETAIL_THRESHOLD_H + +#define TX_NUM_MAX 60 +#define RX_NUM_MAX 60 +#define NUM_MAX (TX_NUM_MAX)*(RX_NUM_MAX) +#define MAX_PATH 256 + +#define BUFFER_LENGTH 512 +#define MAX_TEST_ITEM 20 +#define MAX_GRAPH_ITEM 20 +#define MAX_CHANNEL_NUM 144 + +#define FORCETOUCH_ROW 1 + +struct stCfg_Incell_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + + int (*CBTest_Min)[RX_NUM_MAX]; + int (*CBTest_Max)[RX_NUM_MAX]; + + int (*CBUniformityTest_CHX_Linearity)[RX_NUM_MAX]; + int (*CBUniformityTest_CHY_Linearity)[RX_NUM_MAX]; + + int (*RawDataUniformityTest_CHX_Linearity)[RX_NUM_MAX]; + int (*RawDataUniformityTest_CHY_Linearity)[RX_NUM_MAX]; + int (*RawDataUniformityTest_CB_Data)[RX_NUM_MAX]; + +}; + +struct stCfg_MCap_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + unsigned char (*InvalidNode_SC)[RX_NUM_MAX]; + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + int (*RawDataTest_Low_Min)[RX_NUM_MAX]; + int (*RawDataTest_Low_Max)[RX_NUM_MAX]; + int (*RawDataTest_High_Min)[RX_NUM_MAX]; + int (*RawDataTest_High_Max)[RX_NUM_MAX]; + int (*RxLinearityTest_Max)[RX_NUM_MAX]; + int (*TxLinearityTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Min)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Max)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Min)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Max)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Min)[RX_NUM_MAX]; + int (*NoistTest_Coefficient)[RX_NUM_MAX]; + + int (*SITORawdata_RxLinearityTest_Base)[RX_NUM_MAX]; + int (*SITORawdata_TxLinearityTest_Base)[RX_NUM_MAX]; + + int ForceTouch_SCapRawDataTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; +}; + +struct stCfg_SCap_DetailThreshold { + int TempData[MAX_CHANNEL_NUM]; + int RawDataTest_Max[MAX_CHANNEL_NUM]; + int RawDataTest_Min[MAX_CHANNEL_NUM]; + int CiTest_Max[MAX_CHANNEL_NUM]; + int CiTest_Min[MAX_CHANNEL_NUM]; + int DeltaCiTest_Base[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase1[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase2[MAX_CHANNEL_NUM]; + int CiDeviationTest_Base[MAX_CHANNEL_NUM]; + + int NoiseTest_Max[MAX_CHANNEL_NUM]; + int DeltaCxTest_Sort[MAX_CHANNEL_NUM]; + int DeltaCxTest_Area[MAX_CHANNEL_NUM]; + + int CbTest_Max[MAX_CHANNEL_NUM]; + int CbTest_Min[MAX_CHANNEL_NUM]; + int DeltaCbTest_Base[MAX_CHANNEL_NUM]; + int DifferTest_Base[MAX_CHANNEL_NUM]; + int CBDeviationTest_Base[MAX_CHANNEL_NUM]; + int K1DifferTest_Base[MAX_CHANNEL_NUM]; +}; + +void OnInit_MCap_DetailThreshold(char *strIniFile); +void OnInit_SCap_DetailThreshold(char *strIniFile); +void OnInit_Incell_DetailThreshold(char *strIniFile); + +void set_max_channel_num(void); + +void OnInit_InvalidNode(char *strIniFile); +void OnInit_DThreshold_RawDataTest(char *strIniFile); +void OnInit_DThreshold_SCapRawDataTest(char *strIniFile); +void OnInit_DThreshold_SCapCbTest(char *strIniFile); + +void OnInit_DThreshold_SITORawdata_RxLinearityTest(char *strIniFile); +void OnInit_DThreshold_SITORawdata_TxLinearityTest(char *strIniFile); + +void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile); +void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile); + + +void OnInit_DThreshold_RxLinearityTest(char *strIniFile); +void OnInit_DThreshold_TxLinearityTest(char *strIniFile); + +void OnInit_DThreshold_PanelDifferTest(char *strIniFile); +void OnInit_DThreshold_NoiseTest(char *strIniFile); + +void OnInit_DThreshold_CBTest(char *strIniFile); +void OnInit_DThreshold_AllButtonCBTest(char *strIniFile); +void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile); +void OnInit_DThreshold_RawDataUniformityTest(char *strIniFile); + +void OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue); + +int malloc_struct_DetailThreshold(void); +void free_struct_DetailThreshold(void); +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_ini.h b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_ini.h new file mode 100644 index 0000000000000..7828c96507bea --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_ini.h @@ -0,0 +1,66 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#ifndef INI_H +#define INI_H + +#define MAX_KEY_NUM 300 +#define MAX_KEY_NAME_LEN 50 +#define MAX_KEY_VALUE_LEN 360 + +#define MAX_CFG_BUF 480 +#define SUCCESS 0 +/* return value */ +#define CFG_OK SUCCESS +#define CFG_SECTION_NOT_FOUND -1 +#define CFG_KEY_NOT_FOUND -2 +#define CFG_ERR -10 + +#define CFG_ERR_OPEN_FILE -10 +#define CFG_ERR_CREATE_FILE -11 +#define CFG_ERR_READ_FILE -12 +#define CFG_ERR_WRITE_FILE -13 +#define CFG_ERR_FILE_FORMAT -14 +#define CFG_ERR_TOO_MANY_KEY_NUM -15 +#define CFG_ERR_OUT_OF_LEN -16 + +#define CFG_ERR_EXCEED_BUF_SIZE -22 + +#define COPYF_OK SUCCESS +#define COPYF_ERR_OPEN_FILE -10 +#define COPYF_ERR_CREATE_FILE -11 +#define COPYF_ERR_READ_FILE -12 +#define COPYF_ERR_WRITE_FILE -13 + +typedef struct _ST_INI_FILE_DATA { + char pSectionName[MAX_KEY_NAME_LEN]; + char pKeyName[MAX_KEY_NAME_LEN]; + char pKeyValue[MAX_KEY_VALUE_LEN]; + int iSectionNameLen; + int iKeyNameLen; + int iKeyValueLen; +} ST_INI_FILE_DATA; + + + +int ini_get_key(char *filedata, char *section, char *key, char *value); + + +int fts_atoi(char *nptr); +char *ini_str_trim_r(char *buf); +char *ini_str_trim_l(char *buf); + +int init_key_data(void); +int ini_get_key_data(char *filedata); +int release_key_data(void); +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_main.h b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_main.h new file mode 100644 index 0000000000000..022f4a81a5cd7 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_main.h @@ -0,0 +1,239 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#ifndef _TEST_LIB_H +#define _TEST_LIB_H + +#include "focaltech_test_detail_threshold.h" +#include "../focaltech_test_config.h" + +#define boolean unsigned char +#define bool unsigned char +#define BYTE unsigned char +#define false 0 +#define true 1 +#define pre 1 + + +enum NodeType { + NODE_INVALID_TYPE = 0, + NODE_VALID_TYPE = 1, + NODE_KEY_TYPE = 2, + NODE_AST_TYPE = 3, +}; + + +typedef int (*FTS_I2C_READ_FUNCTION)(unsigned char *, int , unsigned char *, int); +typedef int (*FTS_I2C_WRITE_FUNCTION)(unsigned char *, int); + +extern FTS_I2C_READ_FUNCTION fts_i2c_read_test; +extern FTS_I2C_WRITE_FUNCTION fts_i2c_write_test; + +extern int init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read); +extern int init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write); + +int set_param_data(char *TestParamData); +boolean start_test_tp(void); +int get_test_data(char *pTestData); + +int focaltech_test_main_init(void); +int focaltech_test_main_exit(void); + +#define MIN_HOLE_LEVEL (-1) +#define MAX_HOLE_LEVEL 0x7F +/*----------------------------------------------------------- +Error Code for Comm +-----------------------------------------------------------*/ +#define ERROR_CODE_OK 0x00 +#define ERROR_CODE_CHECKSUM_ERROR 0x01 +#define ERROR_CODE_INVALID_COMMAND 0x02 +#define ERROR_CODE_INVALID_PARAM 0x03 +#define ERROR_CODE_IIC_WRITE_ERROR 0x04 +#define ERROR_CODE_IIC_READ_ERROR 0x05 +#define ERROR_CODE_WRITE_USB_ERROR 0x06 +#define ERROR_CODE_WAIT_RESPONSE_TIMEOUT 0x07 +#define ERROR_CODE_PACKET_RE_ERROR 0x08 +#define ERROR_CODE_NO_DEVICE 0x09 +#define ERROR_CODE_WAIT_WRITE_TIMEOUT 0x0a +#define ERROR_CODE_READ_USB_ERROR 0x0b +#define ERROR_CODE_COMM_ERROR 0x0c +#define ERROR_CODE_ALLOCATE_BUFFER_ERROR 0x0d +#define ERROR_CODE_DEVICE_OPENED 0x0e +#define ERROR_CODE_DEVICE_CLOSED 0x0f + +/*----------------------------------------------------------- +Test Status +-----------------------------------------------------------*/ +#define RESULT_NULL 0 +#define RESULT_PASS 1 +#define RESULT_NG 2 +#define RESULT_TESTING 3 +#define RESULT_TBD 4 +#define RESULT_REPLACE 5 +#define RESULT_CONNECTING 6 + +/*----------------------------------------------------------- + +read write max bytes per time +-----------------------------------------------------------*/ + +#define BYTES_PER_TIME 128 + +extern void fts_test_funcs(void); +struct StTestFuncs { + void (*OnInit_TestItem)(char *); + void (*OnInit_BasicThreshold)(char *) ; + void (*SetTestItem)(void) ; + boolean (*Start_Test)(void); + int (*Get_test_data)(char *); +}; +extern struct StTestFuncs g_stTestFuncs; + +struct structCompareChannel { + unsigned char bCh1; + unsigned char bCh2; + int fResistanceValue; + int iAdcValue; +}; + +struct StruScreenSeting { + int iSelectedIC; + int iTxNum; + int iRxNum; + int isNormalize; + int iUsedMaxTxNum; + int iUsedMaxRxNum; + + unsigned char iChannelsNum; + unsigned char iKeyNum; +}; +extern struct StruScreenSeting g_ScreenSetParam; +struct stTestItem { + unsigned char ItemType; + unsigned char TestNum; + unsigned char TestResult; + unsigned char ItemCode; +}; +extern struct stTestItem g_stTestItem[1][MAX_TEST_ITEM]; + +struct structSCapConfEx { + unsigned char ChannelXNum; + unsigned char ChannelYNum; + unsigned char KeyNum; + unsigned char KeyNumTotal; + bool bLeftKey1; + bool bLeftKey2; + bool bLeftKey3; + bool bRightKey1; + bool bRightKey2; + bool bRightKey3; +}; +extern struct structSCapConfEx g_stSCapConfEx; + +enum NORMALIZE_Type { + Overall_Normalize = 0, + Auto_Normalize = 1, +}; + +enum PROOF_TYPE { + Proof_Normal, + Proof_Level0, + Proof_NoWaterProof, +}; + +/*----------------------------------------------------------- +IC Capacitance Type 0:Self Capacitance, 1:Mutual Capacitance, 2:IDC +-----------------------------------------------------------*/ +enum enum_Report_Protocol_Type { + Self_Capacitance = 0, + Mutual_Capacitance = 1, + IDC_Capacitance = 2, +}; + +#if (FT6X36_TEST) +#define IC_Capacitance_Type 0 +#elif((FT3C47_TEST) || (FT5822_TEST) || (FT5X46_TEST)) +#define IC_Capacitance_Type 1 +#elif ((FT8606_TEST) || (FT8607_TEST) || (FT8716_TEST) || (FT8736_TEST) || (FTE716_TEST) || (FTE736_TEST) || (FT8006_TEST)) +#define IC_Capacitance_Type 2 +#endif + + +extern struct stCfg_MCap_DetailThreshold g_stCfg_MCap_DetailThreshold; +extern struct stCfg_SCap_DetailThreshold g_stCfg_SCap_DetailThreshold; +extern struct stCfg_Incell_DetailThreshold g_stCfg_Incell_DetailThreshold; + + +extern int g_TestItemNum;/*test item num*/ +extern char g_strIcName[20];/*IC Name*/ +extern char *g_pStoreAllData; + +int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile); +void focal_msleep(int ms); +void SysDelay(int ms); +int focal_abs(int value); +unsigned int SqrtNew(unsigned int n) ; + + +void OnInit_InterfaceCfg(char *strIniFile); + +int ReadReg(unsigned char RegAddr, unsigned char *RegData); +int WriteReg(unsigned char RegAddr, unsigned char RegData); +unsigned char Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead); + +unsigned char EnterWork(void); +unsigned char EnterFactory(void); + +void fts_SetTestItemCodeName(unsigned char ucitemcode); + +extern void *fts_malloc(size_t size); +extern void fts_free(void *p); + +extern int InitTest(void); +extern void FinishTest(void); +extern void InitStoreParamOfTestData(void); +extern void MergeAllTestData(void); +extern int AllocateMemory(void); +extern void FreeMemory(void); + +extern char *g_pTmpBuff; +extern char *g_pStoreMsgArea; +extern int g_lenStoreMsgArea; +extern char *g_pMsgAreaLine2; +extern int g_lenMsgAreaLine2; +extern char *g_pStoreDataArea; +extern int g_lenStoreDataArea; +extern unsigned char m_ucTestItemCode; +extern int m_iStartLine; +extern int m_iTestDataCount; + +extern char *TestResult ; +extern int TestResultLen; + +#define FOCAL_TEST_DEBUG_EN 0 +#if (FOCAL_TEST_DEBUG_EN) +#define FTS_TEST_DBG(fmt, args...) do {printk(KERN_ERR "[FTS] [TEST]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_FUNC_ENTER() printk(KERN_ERR "[FTS][TEST]%s: Enter(%d)\n", __func__, __LINE__) +#define FTS_TEST_FUNC_EXIT() printk(KERN_ERR "[FTS][TEST]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_TEST_DBG(fmt, args...) do {} while (0) +#define FTS_TEST_FUNC_ENTER() +#define FTS_TEST_FUNC_EXIT() +#endif + +#define FTS_TEST_INFO(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Info]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_ERROR(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Error]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) + + + +#endif diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_supported_ic.h b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_supported_ic.h new file mode 100644 index 0000000000000..8743d011f0c23 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/include/focaltech_test_supported_ic.h @@ -0,0 +1,1543 @@ +/************************************************************************ +* Copyright (C) 2012-2016, Focaltech Systems (R) All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ + +#include +#include + +#include "../focaltech_test_config.h" +#include "focaltech_test_main.h" + +#if (FT8716_TEST) + +struct stCfg_FT8716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool GPIO_TEST; + bool RESETDETECTION_TEST; + bool ERASE_TEST; + bool RAWDATA_UNIFORMITY_TEST; + bool VIRTUAL_DIFFER_TEST; + +}; +struct stCfg_FT8716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + bool bCBTest_VKey_DCheck_Check; + int CbTest_Min_DCheck_Vkey; + int CbTest_Max_DCheck_Vkey; + + bool bLcdBusyAdjust; + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + int LCDNoiseTest_SequenceFrame; + int LCDNoiseTest_MaxFrame; + + bool RawDataUniformityTest_Check_FIXCB; + bool RawDataUniformityTest_Check_CHX; + bool RawDataUniformityTest_Check_CHY; + int RawDataUniformityTest_CHX_Hole; + int RawDataUniformityTest_CHY_Hole; + +}; +enum enumTestItem_FT8716 { + Code_FT8716_ENTER_FACTORY_MODE, + Code_FT8716_DOWNLOAD, + Code_FT8716_UPGRADE, + Code_FT8716_FACTORY_ID_TEST, + Code_FT8716_PROJECT_CODE_TEST, + Code_FT8716_FW_VERSION_TEST, + Code_FT8716_IC_VERSION_TEST, + Code_FT8716_RAWDATA_TEST, + Code_FT8716_CHANNEL_NUM_TEST, + + Code_FT8716_INT_PIN_TEST, + Code_FT8716_RESET_PIN_TEST, + Code_FT8716_NOISE_TEST, + Code_FT8716_CB_TEST, + Code_FT8716_WRITE_CONFIG, + + Code_FT8716_SHORT_CIRCUIT_TEST, + Code_FT8716_OPEN_TEST, + Code_FT8716_CB_UNIFORMITY_TEST, + Code_FT8716_DIFFER_UNIFORMITY_TEST, + Code_FT8716_DIFFER2_UNIFORMITY_TEST, + Code_FT8716_LCD_NOISE_TEST, + Code_FT8716_GPIO_TEST, + Code_FT8716_IC_TYPE_TEST, + Code_FT8716_RESET_DETECT_TEST, + Code_FT8716_ERASE_SECTOR_TEST, + Code_FT8716_RAWDATA_UNIFORMITY_TEST, + Code_FT8716_VIRTUAL_DIFFER_TEST, +}; + + + +#elif (FT8607_TEST) + +struct stCfg_FT8607_TESTItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool OPEN_TEST; +}; + +struct stCfg_FT8607_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMax; + + int iLCDNoiseCoefficient; + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Open_Test_CBMin; +}; + + +enum enumTestItem_FT8607 { + Code_FT8607_ENTER_FACTORY_MODE, + Code_FT8607_DOWNLOAD, + Code_FT8607_UPGRADE, + Code_FT8607_FACTORY_ID_TEST, + Code_FT8607_PROJECT_CODE_TEST, + Code_FT8607_FW_VERSION_TEST, + Code_FT8607_IC_VERSION_TEST, + Code_FT8607_RAWDATA_TEST, + Code_FT8607_CHANNEL_NUM_TEST, + + Code_FT8607_INT_PIN_TEST, + Code_FT8607_RESET_PIN_TEST, + Code_FT8607_NOISE_TEST, + Code_FT8607_CB_TEST, + Code_FT8607_WRITE_CONFIG, + + Code_FT8607_SHORT_CIRCUIT_TEST, + Code_FT8607_LCD_NOISE_TEST, + + Code_FT8607_OSC60MHZ_TEST, + Code_FT8607_OSCTRM_TEST, + Code_FT8607_SNR_TEST, + Code_FT8607_DIFFER_TEST, + Code_FT8607_DIFFER_UNIFORMITY_TEST, + + Code_FT8607_LPWG_RAWDATA_TEST, + Code_FT8607_LPWG_CB_TEST, + Code_FT8607_LPWG_NOISE_TEST, + Code_FT8607_OPEN_TEST, +}; + +#elif (FT5X46_TEST) +/*----------------------------------------------- +FT5X46 and FT5X46 is the same series of chips +FT5422\FT5X46 is the chip code for internally develope +FT5X46 is the chip code for market +------------------------------------------------*/ +struct stCfg_FT5X46_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + bool PANEL_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + bool GPIO_TEST; + bool LCD_NOISE_TEST; +}; +struct stCfg_FT5X46_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + bool bNoiseTest_TPToolProcess; + + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int Lcd_Noise_MaxFrame; + int Lcd_Noise_Conficient; + int Lcd_Noise_Noise_Mode; + int Lcd_Noise_MaxNgPoint; + int Lcd_Noise_FrameNum; + + bool Lcd_Noise_NoiseThresholdMode; + int Lcd_Noise_NoiseCoefficient; + int Lcd_Noise_NoiseMax; + int Lcd_Noise_SetFrequency; +}; +enum enumTestItem_FT5X46 { + Code_FT5X46_ENTER_FACTORY_MODE, + Code_FT5X46_DOWNLOAD, + Code_FT5X46_UPGRADE, + Code_FT5X46_FACTORY_ID_TEST, + Code_FT5X46_PROJECT_CODE_TEST, + Code_FT5X46_FW_VERSION_TEST, + Code_FT5X46_IC_VERSION_TEST, + Code_FT5X46_RAWDATA_TEST, + Code_FT5X46_ADCDETECT_TEST, + Code_FT5X46_SCAP_CB_TEST, + Code_FT5X46_SCAP_RAWDATA_TEST, + Code_FT5X46_CHANNEL_NUM_TEST, + Code_FT5X46_INT_PIN_TEST, + Code_FT5X46_RESET_PIN_TEST, + Code_FT5X46_NOISE_TEST, + Code_FT5X46_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5X46_UNIFORMITY_TEST, + Code_FT5X46_CM_TEST, + Code_FT5X46_RAWDATA_MARGIN_TEST, + Code_FT5X46_WRITE_CONFIG, + Code_FT5X46_PANELDIFFER_TEST, + Code_FT5X46_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5X46_LCM_ID_TEST, + Code_FT5X46_JUDEG_NORMALIZE_TYPE, + Code_FT5X46_TE_TEST, + Code_FT5X46_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5X46_PATTERN_TEST, + Code_FT5X46_GPIO_TEST, + Code_FT5X46_LCD_NOISE_TEST, +}; + +#elif (FT6X36_TEST) + +struct stCfg_FT6X36_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool CHANNEL_SHORT_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool DELTA_CB_TEST; + bool CHANNELS_DEVIATION_TEST; + bool TWO_SIDES_DEVIATION_TEST; + bool FPC_SHORT_TEST; + bool FPC_OPEN_TEST; + bool SREF_OPEN_TEST; + bool TE_TEST; + bool CB_DEVIATION_TEST; + bool DIFFER_TEST; + bool WEAK_SHORT_TEST; + bool DIFFER_TEST2; + bool K1_DIFFER_TEST; +}; + +struct stCfg_FT6X36_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelNum; + BYTE ChannelNumTest_KeyNum; + int ChannelShortTest_K1; + int ChannelShortTest_K2; + int ChannelShortTest_CB; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int WeakShortThreshold; + int NoiseTest_Max; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int FPCShort_CB_Min; + int FPCShort_CB_Max; + int FPCShort_RawData_Min; + int FPCShort_RawData_Max; + int FPCOpen_CB_Min; + int FPCOpen_CB_Max; + int FPCOpen_RawData_Min; + int FPCOpen_RawData_Max; + int SREFOpen_Hole_Base1; + int SREFOpen_Hole_Base2; + int SREFOpen_Hole; + int CBDeviationTest_Hole; + int Differ_Ave_Hole; + int Differ_Max_Hole; + int CbTest_Min; + int CbTest_Max; + int DeltaCbTest_Base; + int DeltaCbTest_Differ_Max; + bool DeltaCbTest_Include_Key_Test; + int DeltaCbTest_Key_Differ_Max; + int DeltaCbTest_Deviation_S1; + int DeltaCbTest_Deviation_S2; + int DeltaCbTest_Deviation_S3; + int DeltaCbTest_Deviation_S4; + int DeltaCbTest_Deviation_S5; + int DeltaCbTest_Deviation_S6; + bool DeltaCbTest_Set_Critical; + int DeltaCbTest_Critical_S1; + int DeltaCbTest_Critical_S2; + int DeltaCbTest_Critical_S3; + int DeltaCbTest_Critical_S4; + int DeltaCbTest_Critical_S5; + int DeltaCbTest_Critical_S6; + + int ChannelsDeviationTest_Deviation_S1; + int ChannelsDeviationTest_Deviation_S2; + int ChannelsDeviationTest_Deviation_S3; + int ChannelsDeviationTest_Deviation_S4; + int ChannelsDeviationTest_Deviation_S5; + int ChannelsDeviationTest_Deviation_S6; + bool ChannelsDeviationTest_Set_Critical; + int ChannelsDeviationTest_Critical_S1; + int ChannelsDeviationTest_Critical_S2; + int ChannelsDeviationTest_Critical_S3; + int ChannelsDeviationTest_Critical_S4; + int ChannelsDeviationTest_Critical_S5; + int ChannelsDeviationTest_Critical_S6; + + int TwoSidesDeviationTest_Deviation_S1; + int TwoSidesDeviationTest_Deviation_S2; + int TwoSidesDeviationTest_Deviation_S3; + int TwoSidesDeviationTest_Deviation_S4; + int TwoSidesDeviationTest_Deviation_S5; + int TwoSidesDeviationTest_Deviation_S6; + bool TwoSidesDeviationTest_Set_Critical; + int TwoSidesDeviationTest_Critical_S1; + int TwoSidesDeviationTest_Critical_S2; + int TwoSidesDeviationTest_Critical_S3; + int TwoSidesDeviationTest_Critical_S4; + int TwoSidesDeviationTest_Critical_S5; + int TwoSidesDeviationTest_Critical_S6; + + int DifferTest2_Data_H_Min; + int DifferTest2_Data_H_Max; + int DifferTest2_Data_M_Min; + int DifferTest2_Data_M_Max; + int DifferTest2_Data_L_Min; + int DifferTest2_Data_L_Max; + bool bDifferTest2_Data_H; + bool bDifferTest2_Data_M; + bool bDifferTest2_Data_L; + int K1DifferTest_StartK1; + int K1DifferTest_EndK1; + int K1DifferTest_MinHold2; + int K1DifferTest_MaxHold2; + int K1DifferTest_MinHold4; + int K1DifferTest_MaxHold4; + int K1DifferTest_Deviation2; + int K1DifferTest_Deviation4; +}; + +enum enumTestItem_FT6X36 { + Code_FT6X36_ENTER_FACTORY_MODE, + Code_FT6X36_DOWNLOAD, + Code_FT6X36_UPGRADE, + Code_FT6X36_FACTORY_ID_TEST, + Code_FT6X36_PROJECT_CODE_TEST, + Code_FT6X36_FW_VERSION_TEST, + Code_FT6X36_IC_VERSION_TEST, + Code_FT6X36_RAWDATA_TEST, + Code_FT6X36_CHANNEL_NUM_TEST, + Code_FT6X36_CHANNEL_SHORT_TEST, + Code_FT6X36_INT_PIN_TEST, + Code_FT6X36_RESET_PIN_TEST, + Code_FT6X36_NOISE_TEST, + Code_FT6X36_CB_TEST, + Code_FT6X36_DELTA_CB_TEST, + Code_FT6X36_CHANNELS_DEVIATION_TEST, + Code_FT6X36_TWO_SIDES_DEVIATION_TEST, + Code_FT6X36_FPC_SHORT_TEST, + Code_FT6X36_FPC_OPEN_TEST, + Code_FT6X36_SREF_OPEN_TEST, + Code_FT6X36_TE_TEST, + Code_FT6X36_CB_DEVIATION_TEST, + Code_FT6X36_WRITE_CONFIG, + Code_FT6X36_DIFFER_TEST, + Code_FT6X36_WEAK_SHORT_TEST, + Code_FT6X36_DIFFER_TEST2, + Code_FT6X36_K1_DIFFER_TEST, +}; + +#elif (FT5822_TEST) + +struct stCfg_FT5822_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; +}; +struct stCfg_FT5822_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE NoiseTest_ShowTipAfter; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + bool bNoiseTest_FWMode; + int NoiseTest_SetFrequency; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int NoiseTest_Max_Value; + int WeakShortTest_CG; + int WeakShortTest_CC; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; +}; +enum enumTestItem_FT5822 { + Code_FT5822_ENTER_FACTORY_MODE, + Code_FT5822_DOWNLOAD, + Code_FT5822_UPGRADE, + Code_FT5822_FACTORY_ID_TEST, + Code_FT5822_PROJECT_CODE_TEST, + Code_FT5822_FW_VERSION_TEST, + Code_FT5822_IC_VERSION_TEST, + Code_FT5822_RAWDATA_TEST, + Code_FT5822_ADCDETECT_TEST, + Code_FT5822_SCAP_CB_TEST, + Code_FT5822_SCAP_RAWDATA_TEST, + Code_FT5822_CHANNEL_NUM_TEST, + Code_FT5822_INT_PIN_TEST, + Code_FT5822_RESET_PIN_TEST, + Code_FT5822_NOISE_TEST, + Code_FT5822_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5822_UNIFORMITY_TEST, + Code_FT5822_CM_TEST, + Code_FT5822_RAWDATA_MARGIN_TEST, + Code_FT5822_WRITE_CONFIG, + Code_FT5822_PANELDIFFER_TEST, + Code_FT5822_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5822_LCM_ID_TEST, + Code_FT5822_JUDEG_NORMALIZE_TYPE, + Code_FT5822_TE_TEST, + Code_FT5822_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5822_PATTERN_TEST, +}; + +#elif (FT8006_TEST) + +struct stCfg_FT8006_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_TEST; + +}; +struct stCfg_FT8006_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Differ2Test_Min; + int Differ2Test_Max; + +}; +enum enumTestItem_FT8006 { + Code_FT8006_ENTER_FACTORY_MODE, + Code_FT8006_DOWNLOAD, + Code_FT8006_UPGRADE, + Code_FT8006_FACTORY_ID_TEST, + Code_FT8006_PROJECT_CODE_TEST, + Code_FT8006_FW_VERSION_TEST, + Code_FT8006_IC_VERSION_TEST, + Code_FT8006_RAWDATA_TEST, + Code_FT8006_CHANNEL_NUM_TEST, + Code_FT8006_INT_PIN_TEST, + Code_FT8006_RESET_PIN_TEST, + Code_FT8006_NOISE_TEST, + Code_FT8006_CB_TEST, + Code_FT8006_WRITE_CONFIG, + Code_FT8006_SHORT_CIRCUIT_TEST, + Code_FT8006_LCD_NOISE_TEST, + + Code_FT8006_OSC60MHZ_TEST, + Code_FT8006_OSCTRM_TEST, + Code_FT8006_SNR_TEST, + Code_FT8006_DIFFER_TEST, + Code_FT8006_DIFFER_UNIFORMITY_TEST, + + Code_FT8006_LPWG_RAWDATA_TEST, + Code_FT8006_LPWG_CB_TEST, + Code_FT8006_LPWG_NOISE_TEST, + Code_FT8006_DIFFER2_TEST, +}; + +#elif (FT8736_TEST) + +struct stCfg_FT8736_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool CB_DECREASE_TEST; + bool VREF_DECREASE_TEST; +}; +struct stCfg_FT8736_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + + int CBDecrease_Step; + int CBDecrease_OrgMin; + int CBDecrease_OrgMax; + int CBDecrease_CalcMin; + int CBDecrease_CalcMax; + + int VRefDecrease_StepBegin; + int VRefDecrease_StepEnd; + int VRefDecrease_OrgMin; + int VRefDecrease_OrgMax; + int VRefDecrease_CalcMin; + int VRefDecrease_CalcMax; +}; + +enum enumTestItem_FT8736 { + Code_FT8736_ENTER_FACTORY_MODE, + Code_FT8736_DOWNLOAD, + Code_FT8736_UPGRADE, + Code_FT8736_FACTORY_ID_TEST, + Code_FT8736_PROJECT_CODE_TEST, + Code_FT8736_FW_VERSION_TEST, + Code_FT8736_IC_VERSION_TEST, + Code_FT8736_RAWDATA_TEST, + Code_FT8736_CHANNEL_NUM_TEST, + + Code_FT8736_INT_PIN_TEST, + Code_FT8736_RESET_PIN_TEST, + Code_FT8736_NOISE_TEST, + Code_FT8736_CB_TEST, + Code_FT8736_WRITE_CONFIG, + + Code_FT8736_SHORT_CIRCUIT_TEST, + Code_FT8736_OPEN_TEST, + Code_FT8736_CB_UNIFORMITY_TEST, + Code_FT8736_DIFFER_UNIFORMITY_TEST, + Code_FT8736_DIFFER2_UNIFORMITY_TEST, + Code_FT8736_LCD_NOISE_TEST, + Code_FT8736_CB_DECREASE_TEST, + Code_FT8736_VREF_DECREASE_TEST, + Code_FT8736_IC_TYPE_TEST, +}; + +#elif (FTE716_TEST) +struct stCfg_FTE716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool GPIO_TEST; +}; +struct stCfg_FTE716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + bool bOri_ProjectCode; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + BYTE LCDNoiseTest_NoiseMode; +}; + +enum enumTestItem_FTE716 { + Code_FTE716_ENTER_FACTORY_MODE, + Code_FTE716_DOWNLOAD, + Code_FTE716_UPGRADE, + Code_FTE716_FACTORY_ID_TEST, + Code_FTE716_PROJECT_CODE_TEST, + Code_FTE716_FW_VERSION_TEST, + Code_FTE716_IC_VERSION_TEST, + Code_FTE716_RAWDATA_TEST, + Code_FTE716_CHANNEL_NUM_TEST, + + Code_FTE716_INT_PIN_TEST, + Code_FTE716_RESET_PIN_TEST, + Code_FTE716_NOISE_TEST, + Code_FTE716_CB_TEST, + Code_FTE716_WRITE_CONFIG, + + Code_FTE716_SHORT_CIRCUIT_TEST, + Code_FTE716_OPEN_TEST, + Code_FTE716_CB_UNIFORMITY_TEST, + Code_FTE716_DIFFER_UNIFORMITY_TEST, + Code_FTE716_DIFFER2_UNIFORMITY_TEST, + Code_FTE716_LCD_NOISE_TEST, + Code_FTE716_GPIO_TEST, + Code_FTE716_IC_TYPE_TEST, +}; + +#elif (FTE736_TEST) + +struct stCfg_FTE736_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool CB_DECREASE_TEST; + bool VREF_DECREASE_TEST; +}; +struct stCfg_FTE736_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + + int CBDecrease_Step; + int CBDecrease_OrgMin; + int CBDecrease_OrgMax; + int CBDecrease_CalcMin; + int CBDecrease_CalcMax; + + int VRefDecrease_StepBegin; + int VRefDecrease_StepEnd; + int VRefDecrease_OrgMin; + int VRefDecrease_OrgMax; + int VRefDecrease_CalcMin; + int VRefDecrease_CalcMax; +}; + +enum enumTestItem_FTE736 { + Code_FTE736_ENTER_FACTORY_MODE, + Code_FTE736_DOWNLOAD, + Code_FTE736_UPGRADE, + Code_FTE736_FACTORY_ID_TEST, + Code_FTE736_PROJECT_CODE_TEST, + Code_FTE736_FW_VERSION_TEST, + Code_FTE736_IC_VERSION_TEST, + Code_FTE736_RAWDATA_TEST, + Code_FTE736_CHANNEL_NUM_TEST, + + Code_FTE736_INT_PIN_TEST, + Code_FTE736_RESET_PIN_TEST, + Code_FTE736_NOISE_TEST, + Code_FTE736_CB_TEST, + Code_FTE736_WRITE_CONFIG, + + Code_FTE736_SHORT_CIRCUIT_TEST, + Code_FTE736_OPEN_TEST, + Code_FTE736_CB_UNIFORMITY_TEST, + Code_FTE736_DIFFER_UNIFORMITY_TEST, + Code_FTE736_DIFFER2_UNIFORMITY_TEST, + Code_FTE736_LCD_NOISE_TEST, + Code_FTE736_CB_DECREASE_TEST, + Code_FTE736_VREF_DECREASE_TEST, + Code_FTE736_IC_TYPE_TEST, +}; + +#elif(FT8606_TEST) + +struct stCfg_FT8606_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool IVSN_TEST; +}; +struct stCfg_FT8606_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int CbTest_Min; + int CbTest_Max; + int ShortTest_Max; + int ShortTest_K2Value; + bool ShortTest_Tip; + bool IsDifferMode; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; +}; + + +enum enumTestItem_FT8606 { + Code_FT8606_ENTER_FACTORY_MODE, + Code_FT8606_DOWNLOAD, + Code_FT8606_UPGRADE, + Code_FT8606_FACTORY_ID_TEST, + Code_FT8606_PROJECT_CODE_TEST, + Code_FT8606_FW_VERSION_TEST, + Code_FT8606_IC_VERSION_TEST, + Code_FT8606_RAWDATA_TEST, + Code_FT8606_CHANNEL_NUM_TEST, + + Code_FT8606_INT_PIN_TEST, + Code_FT8606_RESET_PIN_TEST, + Code_FT8606_NOISE_TEST, + Code_FT8606_CB_TEST, + Code_FT8606_WRITE_CONFIG, + + Code_FT8606_SHORT_CIRCUIT_TEST, + Code_FT8606_LCD_NOISE_TEST, + Code_FT8606_OSC60MHZ_TEST, + Code_FT8606_OSCTRM_TEST, + Code_FT8606_IVSN_TEST, +}; + +#elif(FT3C47_TEST) + +struct stCfg_FT3C47_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + + bool FORCETOUCH_CHANNEL_NUM_TEST; + bool FORCETOUCH_RAWDATA_TEST; + bool FORCETOUCH_CB_TEST; + bool FORCETOUCH_WEAK_SHORT_CIRCUIT_TEST; + bool FORCETOUCH_FLATNESS_TEST; +}; + +struct stCfg_FT3C47_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int ForceTouch_ChannelNumTest_ChannelNum; + + int ForceTouch_SCapRawDataTest_OFF_Min; + int ForceTouch_SCapRawDataTest_OFF_Max; + int ForceTouch_SCapRawDataTest_ON_Min; + int ForceTouch_SCapRawDataTest_ON_Max; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_ON; + + int ForceTouch_SCapCbTest_OFF_Min; + int ForceTouch_SCapCbTest_OFF_Max; + int ForceTouch_SCapCbTest_ON_Min; + int ForceTouch_SCapCbTest_ON_Max; + BYTE ForceTouch_SCapCBTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapCBTest_SetWaterproof_ON; + + int ForceTouch_WeakShortTest_CG; + int ForceTouch_WeakShortTest_CC; + bool bForceTouch_WeakShortTest_CapShortTest; + + int ForceTouch_FlatnessTest_Differ_Threshold; + int ForceTouch_FlatnessTest_Differ_Coefficient; + bool ForceTouch_FlatnessTest_Differ_Threshold_Check; + bool ForceTouch_FlatnessTest_Differ_Coefficient_Check; + +}; +enum enumTestItem_FT3C47 { + Code_FT3C47_ENTER_FACTORY_MODE, + Code_FT3C47_DOWNLOAD, + Code_FT3C47_UPGRADE, + Code_FT3C47_FACTORY_ID_TEST, + Code_FT3C47_PROJECT_CODE_TEST, + Code_FT3C47_FW_VERSION_TEST, + Code_FT3C47_IC_VERSION_TEST, + Code_FT3C47_RAWDATA_TEST, + Code_FT3C47_ADCDETECT_TEST, + Code_FT3C47_SCAP_CB_TEST, + Code_FT3C47_SCAP_RAWDATA_TEST, + Code_FT3C47_CHANNEL_NUM_TEST, + Code_FT3C47_INT_PIN_TEST, + Code_FT3C47_RESET_PIN_TEST, + Code_FT3C47_NOISE_TEST, + Code_FT3C47_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_UNIFORMITY_TEST, + Code_FT3C47_CM_TEST, + Code_FT3C47_RAWDATA_MARGIN_TEST, + Code_FT3C47_WRITE_CONFIG, + Code_FT3C47_PANELDIFFER_TEST, + Code_FT3C47_PANELDIFFER_UNIFORMITY_TEST, + Code_FT3C47_LCM_ID_TEST, + Code_FT3C47_JUDEG_NORMALIZE_TYPE, + Code_FT3C47_TE_TEST, + Code_FT3C47_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT3C47_PATTERN_TEST, + + Code_FT3C47_GPIO_TEST, + Code_FT3C47_LCD_NOISE_TEST, + Code_FT3C47_FORCE_TOUCH_CHANNEL_NUM_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_RAWDATA_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_CB_TEST, + Code_FT3C47_FORCE_TOUCH_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_FORCE_TOUCH_FLATNESS_TEST, +}; + + +#endif + + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/Makefile b/drivers/input/touchscreen/FT5346/focaltech_test/src/Makefile new file mode 100644 index 0000000000000..f5d4ed7c1e77d --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/Makefile @@ -0,0 +1,12 @@ +#drivers/input/touchscreen/mediatek/focaltech_ts/focaltech_test/src +# +# Makefile for test module +# +# Linux driver folder + + +obj-y += focaltech_test.o +obj-y += focaltech_test_main.o +obj-y += focaltech_test_ini.o +obj-y += focaltech_test_global.o +obj-y += focaltech_test_detail_threshold.o diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test.c b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test.c new file mode 100644 index 0000000000000..c0b5cc1047f7c --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test.c @@ -0,0 +1,534 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2016, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/************************************************************************ +* +* File Name: focaltech_test.c +* +* Author: Software Department, FocalTech +* +* Created: 2016-08-01 +* +* Modify: +* +* Abstract: create char device and proc node for the comm between APK and TP +* +************************************************************************/ + +/******************************************************************************* +* Included header files +*******************************************************************************/ +#include +#include +#include +#include +#include + +#include +#include + +#include +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_test_ini.h" + + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ + +#define IC_TEST_VERSION "Test version: V1.0.0--2016-08-01, (sync version of FT_MultipleTest: V4.0.0.0 ------ 2016-07-18)" + +#define FTS_INI_FILE_PATH "/system/etc/" +#define FTS_CSV_FILE_PATH "/storage/" + +#define FTS_TEST_BUFFER_SIZE 80*1024 +#define FTS_TEST_PRINT_SIZE 128 +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ + + +/******************************************************************************* +* Static variables +*******************************************************************************/ + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ + + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ +static int fts_test_get_ini_size(char *config_name); +static int fts_test_read_ini_data(char *config_name, char *config_buf); +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen); +static int fts_test_get_testparam_from_ini(char *config_name); + +/******************************************************************************* +* functions body +*******************************************************************************/ +extern struct i2c_client *fts_i2c_client; +extern void disable_irq(unsigned int irq); +extern void enable_irq(unsigned int irq); + +static DEFINE_MUTEX(fts_mutex); +static int fts_test_i2c_read(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen) +{ + int ret = -1; + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = fts_i2c_client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = fts_i2c_client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(fts_i2c_client->adapter, msgs, 2); + if (ret < 0) + dev_err(&fts_i2c_client->dev, "%s: i2c read error.\n", __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = fts_i2c_client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(fts_i2c_client->adapter, msgs, 1); + if (ret < 0) + dev_err(&fts_i2c_client->dev, "%s:i2c read error.\n", __func__); + } + + return ret; + +} + +static int fts_test_i2c_write(unsigned char *writebuf, int writelen) +{ + int ret = -1; + + struct i2c_msg msgs[] = { + { + .addr = fts_i2c_client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + ret = i2c_transfer(fts_i2c_client->adapter, msgs, 1); + if (ret < 0) + dev_err(&fts_i2c_client->dev, "%s: i2c write error.\n", __func__); + + return ret; +} + + +static int fts_test_get_ini_size(char *config_name) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + filp_close(pfile, NULL); + + FTS_TEST_FUNC_ENTER(); + + return fsize; +} + + +static int fts_test_read_ini_data(char *config_name, char *config_buf) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + loff_t pos = 0; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, config_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen) +{ + struct file *pfile = NULL; + + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_CSV_FILE_PATH, file_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_CREAT|O_RDWR, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_write(pfile, data_buf, iLen, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_get_testparam_from_ini(char *config_name) +{ + char *pcfiledata = NULL; + int ret = 0; + int inisize = 0; + + FTS_TEST_FUNC_ENTER(); + + inisize = fts_test_get_ini_size(config_name); + FTS_TEST_DBG("ini_size = %d ", inisize); + if (inisize <= 0) { + FTS_TEST_ERROR("%s ERROR:Get firmware size failed", __func__); + return -EIO; + } + + pcfiledata = fts_malloc(inisize + 1); + if (NULL == pcfiledata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + + memset(pcfiledata, 0, inisize + 1); + + if (fts_test_read_ini_data(config_name, pcfiledata)) { + FTS_TEST_ERROR(" - ERROR: fts_test_read_ini_data failed"); + fts_free(pcfiledata); + pcfiledata = NULL; + + return -EIO; + } else { + FTS_TEST_DBG("fts_test_read_ini_data successful"); + } + + ret = set_param_data(pcfiledata); + + fts_free(pcfiledata); + pcfiledata = NULL; + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} + + + + +static int fts_test_entry(char *ini_file_name, char *bufdest, ssize_t *pinumread) +{ + /* place holder for future use */ + char cfgname[128]; + char *testdata = NULL; + char *printdata = NULL; + int iTestDataLen = 0; + int ret = 0; + int icycle = 0, i = 0; + int print_index = 0; + int test_result = -1; + + FTS_TEST_FUNC_ENTER(); + FTS_TEST_DBG("ini_file_name:%s.", ini_file_name); + /*Used to obtain the test data stored in the library, pay attention to the size of the distribution space.*/ + FTS_TEST_DBG("Allocate memory, size: %d", FTS_TEST_BUFFER_SIZE); + testdata = fts_malloc(FTS_TEST_BUFFER_SIZE); + if (NULL == testdata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + printdata = fts_malloc(FTS_TEST_PRINT_SIZE); + if (NULL == printdata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + /*Initialize the platform related I2C read and write functions*/ + + init_i2c_write_func(fts_test_i2c_write); + init_i2c_read_func(fts_test_i2c_read); + + /*Initialize pointer memory*/ + ret = focaltech_test_main_init(); + if (ret < 0) { + FTS_TEST_ERROR("focaltech_test_main_init() error."); + goto TEST_ERR; + } + + /*Read parse configuration file*/ + memset(cfgname, 0, sizeof(cfgname)); + sprintf(cfgname, "%s", ini_file_name); + FTS_TEST_DBG("ini_file_name = %s", cfgname); + + fts_test_funcs(); + + if (fts_test_get_testparam_from_ini(cfgname) < 0) { + FTS_TEST_ERROR("get testparam from ini failure"); + goto TEST_ERR; + } + + /*Start testing according to the test configuration*/ + if (true == start_test_tp()) { + + FTS_TEST_INFO("tp test pass"); + test_result = 0; + } + + else { + + FTS_TEST_INFO("tp test failure"); + test_result = -1; + } + + + /*Gets the number of tests in the test library and saves it*/ + iTestDataLen = get_test_data(testdata); + + + icycle = 0; + /*Print test data packets */ + FTS_TEST_DBG("print test data: \n"); + for (i = 0; i < iTestDataLen; i++) { + if (('\0' == testdata[i]) + || (icycle == FTS_TEST_PRINT_SIZE - 2) + || (i == iTestDataLen-1) + ) { + if (icycle == 0) { + print_index++; + } else { + memcpy(printdata, testdata + print_index, icycle); + printdata[FTS_TEST_PRINT_SIZE-1] = '\0'; + FTS_TEST_DBG("%s", printdata); + print_index += icycle; + icycle = 0; + } + } else { + icycle++; + } + } + FTS_TEST_DBG("\n"); + + + + fts_test_save_test_data("testdata.csv", testdata, iTestDataLen); + fts_test_save_test_data("testresult.txt", TestResult, TestResultLen); + + + /*Release memory */ + focaltech_test_main_exit(); + + + + if (NULL != testdata) + fts_free(testdata); + if (NULL != printdata) + fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return test_result; + +TEST_ERR: + if (NULL != testdata) + fts_free(testdata); + if (NULL != printdata) + fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return -EPERM; +} + +/************************************************************************ +* Name: fts_test_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_test_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return -EPERM; +} + +/************************************************************************ +* Name: fts_test_store +* Brief: upgrade from app.bin +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_test_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + char fwname[128] = {0}; + struct i2c_client *client = fts_i2c_client; + char *bufdest = NULL; + ssize_t pinumread = 0; + + FTS_TEST_FUNC_ENTER(); + + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + FTS_TEST_DBG("fwname:%s.", fwname); + mutex_lock(&fts_mutex); + + + disable_irq(client->irq); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(DISABLE); +#endif + + fts_test_entry("ft5346_ds.ini", bufdest, &pinumread); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(ENABLE); +#endif + + enable_irq(client->irq); + mutex_unlock(&fts_mutex); + + + FTS_TEST_FUNC_EXIT(); + + return count; +} +/* upgrade from app.bin +* example:echo "***.ini" > fts_test +*/ +static DEVICE_ATTR(fts_test, S_IRUGO|S_IWUSR, fts_test_show, fts_test_store); + +/* add your attr in here*/ +static struct attribute *fts_test_attributes[] = { + &dev_attr_fts_test.attr, + NULL +}; + +static struct attribute_group fts_test_attribute_group = { + .attrs = fts_test_attributes +}; + + +int fts_test_init(struct i2c_client *client) +{ + int err = 0; + + FTS_TEST_FUNC_ENTER(); + + FTS_TEST_INFO("[focal] %s ", IC_TEST_VERSION); + + + err = sysfs_create_group(&client->dev.kobj, &fts_test_attribute_group); + if (0 != err) { + FTS_TEST_ERROR("[focal] %s() - ERROR: sysfs_create_group() failed.", __func__); + sysfs_remove_group(&client->dev.kobj, &fts_test_attribute_group); + return -EIO; + } else { + FTS_TEST_DBG("[focal] %s() - sysfs_create_group() succeeded.", __func__); + } + + FTS_TEST_FUNC_EXIT(); + + return err; +} +int fts_test_exit(struct i2c_client *client) +{ + FTS_TEST_FUNC_ENTER(); + + sysfs_remove_group(&client->dev.kobj, &fts_test_attribute_group); + + FTS_TEST_FUNC_EXIT(); + + return 0; +} + +int fts_open_short_test(char *ini_file_name, char *bufdest, ssize_t *pinumread) +{ + return fts_test_entry(ini_file_name, bufdest, pinumread); +} + + + +EXPORT_SYMBOL(fts_open_short_test); + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_detail_threshold.c b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_detail_threshold.c new file mode 100644 index 0000000000000..2006819e915dc --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_detail_threshold.c @@ -0,0 +1,2144 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_main.h" +#include "../../focaltech_global/focaltech_ic_table.h" + + +struct stCfg_MCap_DetailThreshold g_stCfg_MCap_DetailThreshold; +struct stCfg_SCap_DetailThreshold g_stCfg_SCap_DetailThreshold; +struct stCfg_Incell_DetailThreshold g_stCfg_Incell_DetailThreshold; + +void set_max_channel_num(void) +{ + + FTS_TEST_FUNC_ENTER(); + switch (g_ScreenSetParam.iSelectedIC>>4) { + case IC_FT5822>>4: + case IC_FT8006>>4: + case IC_FTE716>>4: + g_ScreenSetParam.iUsedMaxTxNum = TX_NUM_MAX; + g_ScreenSetParam.iUsedMaxRxNum = RX_NUM_MAX; + break; + default: + g_ScreenSetParam.iUsedMaxTxNum = 30; + g_ScreenSetParam.iUsedMaxRxNum = 30; + break; + } + + FTS_TEST_DBG("MaxTxNum = %d, MaxRxNum = %d. ", g_ScreenSetParam.iUsedMaxTxNum, g_ScreenSetParam.iUsedMaxRxNum); + + FTS_TEST_FUNC_EXIT(); + +} + +int malloc_struct_DetailThreshold(void) +{ + FTS_TEST_FUNC_ENTER(); + + + g_stCfg_MCap_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_MCap_DetailThreshold.InvalidNode) + goto ERR; + + g_stCfg_MCap_DetailThreshold.InvalidNode_SC = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_MCap_DetailThreshold.InvalidNode_SC) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) + goto ERR; + + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) + goto ERR; + + + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) + goto ERR; + + + + g_stCfg_Incell_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_Incell_DetailThreshold.InvalidNode) { + FTS_TEST_DBG("InvalidNode. \n"); + goto ERR; + } + + + g_stCfg_Incell_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + FTS_TEST_DBG("RawDataTest_Min. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + FTS_TEST_DBG("RawDataTest_Max. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBTest_Min) { + FTS_TEST_DBG("CBTest_Min. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBTest_Max) { + FTS_TEST_DBG("CBTest_Max. \n"); + goto ERR; + } + + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHY_Linearity. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHX_Linearity. \n"); + goto ERR; + } + + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity) { + FTS_TEST_DBG("RawDataUniformityTest_CHX_Linearity. \n"); + goto ERR; + } + + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity) { + FTS_TEST_DBG("RawDataUniformityTest_CHY_Linearity. \n"); + goto ERR; + } + + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data) { + FTS_TEST_DBG("RawDataUniformityTest_CB_Data. \n"); + goto ERR; + } + + FTS_TEST_FUNC_EXIT(); + + return 0; + +ERR: + FTS_TEST_ERROR("fts_malloc memory failed in function."); + return -EPERM; +} + +void free_struct_DetailThreshold(void) +{ + if (NULL != g_stCfg_MCap_DetailThreshold.InvalidNode) { + fts_free(g_stCfg_MCap_DetailThreshold.InvalidNode); + g_stCfg_MCap_DetailThreshold.InvalidNode = NULL; + } + if (NULL != g_stCfg_MCap_DetailThreshold.InvalidNode_SC) { + fts_free(g_stCfg_MCap_DetailThreshold.InvalidNode_SC); + g_stCfg_MCap_DetailThreshold.InvalidNode_SC = NULL; + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base) { + fts_free(g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base) { + fts_free(g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) { + fts_free(g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient); + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = NULL; + } + + if (NULL != g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max); + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = NULL; + } + + if (NULL != g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min); + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.InvalidNode) { + fts_free(g_stCfg_Incell_DetailThreshold.InvalidNode); + g_stCfg_Incell_DetailThreshold.InvalidNode = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Min); + g_stCfg_Incell_DetailThreshold.RawDataTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBTest_Min) { + fts_free(g_stCfg_Incell_DetailThreshold.CBTest_Min); + g_stCfg_Incell_DetailThreshold.CBTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.CBTest_Max); + g_stCfg_Incell_DetailThreshold.CBTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity); + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity); + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity); + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity); + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data); + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data = NULL; + } + +} + +void OnInit_SCap_DetailThreshold(char *strIniFile) +{ + FTS_TEST_FUNC_ENTER(); + + OnGetTestItemParam("RawDataTest_Max", strIniFile, 12500); + memcpy(g_stCfg_SCap_DetailThreshold.RawDataTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("RawDataTest_Min", strIniFile, 16500); + memcpy(g_stCfg_SCap_DetailThreshold.RawDataTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiTest_Max", strIniFile, 5); + memcpy(g_stCfg_SCap_DetailThreshold.CiTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiTest_Min", strIniFile, 250); + memcpy(g_stCfg_SCap_DetailThreshold.CiTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_AnotherBase1", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase1, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_AnotherBase2", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase2, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("NoiseTest_Max", strIniFile, 20); + memcpy(g_stCfg_SCap_DetailThreshold.NoiseTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiDeviation_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CiDeviationTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCxTest_Sort", strIniFile, 1); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCxTest_Sort, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCxTest_Area", strIniFile, 1); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCxTest_Area, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + + OnGetTestItemParam("CbTest_Max", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CbTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("CbTest_Min", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CbTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("DeltaCbTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCbTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("DifferTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DifferTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("CBDeviation_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CBDeviationTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("K1DifferTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.K1DifferTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + FTS_TEST_FUNC_EXIT(); +} + +void OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue) +{ + + char strValue[800]; + char str_tmp[128]; + int iValue = 0; + int dividerPos = 0; + int index = 0; + int i = 0, j = 0, k = 0; + memset(g_stCfg_SCap_DetailThreshold.TempData, 0, sizeof(g_stCfg_SCap_DetailThreshold.TempData)); + sprintf(str_tmp, "%d", iDefautValue); + GetPrivateProfileString("Basic_Threshold", strItemName, str_tmp, strValue, strIniFile); + iValue = fts_atoi(strValue); + for (i = 0; i < MAX_CHANNEL_NUM; i++) { + g_stCfg_SCap_DetailThreshold.TempData[i] = iValue; + } + + dividerPos = GetPrivateProfileString("SpecialSet", strItemName, "", strValue, strIniFile); + if (dividerPos > 0) { + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_SCap_DetailThreshold.TempData[k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } +} + +void OnInit_MCap_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + set_max_channel_num(); + + OnInit_InvalidNode(strIniFile); + OnInit_DThreshold_RawDataTest(strIniFile); + OnInit_DThreshold_SCapRawDataTest(strIniFile); + OnInit_DThreshold_SCapCbTest(strIniFile); + + OnInit_DThreshold_ForceTouch_SCapRawDataTest(strIniFile); + OnInit_DThreshold_ForceTouch_SCapCbTest(strIniFile); + + OnInit_DThreshold_SITORawdata_TxLinearityTest(strIniFile); + OnInit_DThreshold_SITORawdata_RxLinearityTest(strIniFile); + + OnInit_DThreshold_RxLinearityTest(strIniFile); + OnInit_DThreshold_TxLinearityTest(strIniFile); + + OnInit_DThreshold_PanelDifferTest(strIniFile); + OnInit_DThreshold_NoiseTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} +void OnInit_InvalidNode(char *strIniFile) +{ + + char str[MAX_PATH] = {0}, strTemp[MAX_PATH] = {0}; + int i = 0, j = 0; + + + + FTS_TEST_FUNC_ENTER(); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + sprintf(strTemp, "InvalidNode[%d][%d]", (i+1), (j+1)); + + GetPrivateProfileString("INVALID_NODE", strTemp, "1", str, strIniFile); + if (fts_atoi(str) == 0) { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 0; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 0; + FTS_TEST_DBG("node (%d, %d) \n", (i+1), (j+1)); + + } else if (fts_atoi(str) == 2) { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 2; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 2; + } else { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 1; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 1; + } + + + + + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + sprintf(strTemp, "InvalidNodeS[%d][%d]", (i+1), (j+1)); + GetPrivateProfileString("INVALID_NODES", strTemp, "1", str, strIniFile); + if (fts_atoi(str) == 0) { + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 0; + } else if (fts_atoi(str) == 2) { + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 2; + } else + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 1; + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_RawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if ((g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8716 >> 4) || (g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8736 >> 4) || (g_ScreenSetParam.iSelectedIC >> 4 == IC_FTE716 >> 4)) { + return; + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "10000", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "7000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Max", "15000", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][j] = MaxValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Low_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Min", "3000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Low_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Max", "15000", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][j] = MaxValue; + } + } + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Min", "3000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_High_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_High_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_PanelDifferTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + int index = 0; + int k = 0, i = 0, j = 0; + char str_tmp[128]; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Max_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); + +} + + +void OnInit_DThreshold_NoiseTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_GloveMode", "0", str, strIniFile); + if (1 == fts_atoi(str)) + GetPrivateProfileString("Basic_Threshold", "GloveNoiseTest_Coefficient", "100", str, strIniFile); + else + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Max", "50", str, strIniFile); + + MaxValue = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "NoistTestCoefficient_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + + +} + + +void OnInit_DThreshold_RxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "RxLinearityTest_Max", "50", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Rx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_TxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "TxLinearityTest_Max", "50", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Tx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + FTS_TEST_FUNC_EXIT(); +} + + +void OnInit_DThreshold_SITORawdata_RxLinearityTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int i = 0, j = 0; + char str_tmp[128]; + int dividerPos = 0; + int index = 0; + int k = 0; + + if (IC_FT5X46>>4 != g_ScreenSetParam.iSelectedIC>>4 && IC_FT3C47U>>4 != g_ScreenSetParam.iSelectedIC>>4) { + return; + } + + + if (IC_FT5X46>>4 == g_ScreenSetParam.iSelectedIC>>4 || IC_FT3C47U>>4 == g_ScreenSetParam.iSelectedIC>>4) { + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Rx_Hole", "10", str, strIniFile); + MaxValue = 0/*atoi(str)*/; + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "SITORawdata_Rx_Linearity_Base_Rx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SITORawdata_RxLinearityTest_Base[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + +} + + + +void OnInit_DThreshold_SITORawdata_TxLinearityTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int i = 0, j = 0; + char str_tmp[128]; + int dividerPos = 0; + int index = 0; + int k = 0; + + if (IC_FT5X46>>4 != g_ScreenSetParam.iSelectedIC>>4 && IC_FT3C47U>>4 != g_ScreenSetParam.iSelectedIC>>4) { + return; + } + + + if (IC_FT5X46>>4 == g_ScreenSetParam.iSelectedIC>>4 || IC_FT3C47U>>4 == g_ScreenSetParam.iSelectedIC>>4) { + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Tx_Hole", "10", str, strIniFile); + MaxValue = 0/*atoi(str)*/; + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "SITORawdata_Rx_Linearity_Base_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SITORawdata_TxLinearityTest_Base[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + +} + + + +void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + FTS_TEST_DBG("%s\r", strTemp); + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_Incell_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + set_max_channel_num(); + + OnInit_InvalidNode(strIniFile); + + OnInit_DThreshold_RawDataTest(strIniFile); + OnInit_DThreshold_CBTest(strIniFile); + OnInit_DThreshold_AllButtonCBTest(strIniFile); + OnThreshold_VkAndVaRawDataSeparateTest(strIniFile); + + OnInit_DThreshold_RawDataUniformityTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_CBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + if (g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8606 >> 4) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, strIniFile); + MaxValue_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, strIniFile); + MinValue_Vkey = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + + + +void OnInit_DThreshold_AllButtonCBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if (g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8606 >> 4) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + + FTS_TEST_FUNC_ENTER(); + + if ((g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8716 >> 4) && (g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8736 >> 4) && (g_ScreenSetParam.iSelectedIC >> 4 != IC_FTE716 >> 4)) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "1100", str, strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max_VKey", "1100", str, strIniFile); + MaxValue_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min_VKey", "5000", str, strIniFile); + MinValue_Vkey = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_RawDataUniformityTest(char *strIniFile) +{ + + int iBasicCHX = 0, iBasicCHY = 0; + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + GetPrivateProfileString("Basic_Threshold", "RawDataUniformityTest_CHX_Hole", "15", str, strIniFile); + iBasicCHX = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity[i][j] = iBasicCHX; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawDataUniformityTest_CHX%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHX_Linearity[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataUniformityTest_CHY_Hole", "15", str, strIniFile); + iBasicCHY = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity[i][j] = iBasicCHY; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawDataUniformityTest_CHY%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CHY_Linearity[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data[i][j] = 20; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawDataUniformityTest_CB%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataUniformityTest_CB_Data[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } +} + + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_global.c b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_global.c new file mode 100644 index 0000000000000..97c92650f8c88 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_global.c @@ -0,0 +1,535 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_global.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_main.h" +#include "../../focaltech_global/focaltech_ic_table.h" + +#define DEVIDE_MODE_ADDR 0x00 + +/*buff length*/ +#define BUFF_LEN_STORE_MSG_AREA 1024*10 +#define BUFF_LEN_MSG_AREA_LINE2 1024*4 +#define BUFF_LEN_STORE_DATA_AREA 1024*80 +#define BUFF_LEN_TMP_BUFFER 1024*16 + + +char *g_pTmpBuff = NULL; +char *g_pStoreMsgArea = NULL; +int g_lenStoreMsgArea = 0; +char *g_pMsgAreaLine2 = NULL; +int g_lenMsgAreaLine2 = 0; +char *g_pStoreDataArea = NULL; +int g_lenStoreDataArea = 0; +unsigned char m_ucTestItemCode = 0; +int m_iStartLine = 0; +int m_iTestDataCount = 0; +char *TestResult = NULL; +int TestResultLen = 0; + +/*ÄÚ´æÉêÇ뷽ʽ*/ +#define FTS_MALLOC_TYPE 1 +enum enum_malloc_mode { + kmalloc_mode = 0, + vmalloc_mode = 1, +}; + +struct StruScreenSeting g_ScreenSetParam; +struct stTestItem g_stTestItem[1][MAX_TEST_ITEM]; +struct structSCapConfEx g_stSCapConfEx; + +int g_TestItemNum = 0; +char g_strIcName[20] = {0}; +char *g_pStoreAllData = NULL; + + +int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile) +{ + char value[512] = {0}; + int len = 0; + + if (NULL == returnValue) { + FTS_TEST_DBG("[FTS] returnValue==NULL in function %s.", __func__); + return 0; + } + + if (ini_get_key(IniFile, section, ItemName, value) < 0) { + if (NULL != defaultvalue) + memcpy(value, defaultvalue, strlen(defaultvalue)); + sprintf(returnValue, "%s", value); + return 0; + } else { + len = sprintf(returnValue, "%s", value); + } + + return len; +} + +void focal_msleep(int ms) +{ + msleep(ms); +} + +void SysDelay(int ms) +{ + msleep(ms); +} + +int focal_abs(int value) +{ + if (value < 0) + value = 0 - value; + + return value; +} + +/************************************************************************ +* Name: SqrtNew +* Brief: calculate sqrt of input. +* Input: unsigned int n +* Output: none +* Return: sqrt of n. +***********************************************************************/ +unsigned int SqrtNew(unsigned int n) +{ + unsigned int val = 0, last = 0; + unsigned char i = 0;; + + if (n < 6) { + if (n < 2) { + return n; + } + return n/2; + } + val = n; + i = 0; + while (val > 1) { + val >>= 1; + i++; + } + val <<= (i >> 1); + val = (val + val + val) >> 1; + do { + last = val; + val = ((val + n/val) >> 1); + } while (focal_abs(val-last) > pre); + return val; +} + +void *fts_malloc(size_t size) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kmalloc(size, GFP_ATOMIC); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vmalloc(size); + } else { + FTS_TEST_DBG("invalid malloc. \n"); + return NULL; + } + + return NULL; +} + +void fts_free(void *p) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kfree(p); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vfree(p); + } else { + FTS_TEST_DBG("invalid free. \n"); + return ; + } + + return ; +} + +void OnInit_InterfaceCfg(char *strIniFile) +{ + char str[128] = {0}; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Interface", "IC_Type", "FT5X36", str, strIniFile); + g_ScreenSetParam.iSelectedIC = fts_ic_table_get_ic_code_from_ic_name(str); + FTS_TEST_INFO(" IC code :0x%02x. ", g_ScreenSetParam.iSelectedIC); + + + GetPrivateProfileString("Interface", "Normalize_Type", 0, str, strIniFile); + g_ScreenSetParam.isNormalize = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); + +} +/************************************************************************ +* Name: ReadReg(Same function name as FT_MultipleTest) +* Brief: Read Register +* Input: RegAddr +* Output: RegData +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int ReadReg(unsigned char RegAddr, unsigned char *RegData) +{ + int iRet; + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + iRet = fts_i2c_read_test(&RegAddr, 1, RegData, 1); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} + +/************************************************************************ +* Name: WriteReg(Same function name as FT_MultipleTest) +* Brief: Write Register +* Input: RegAddr, RegData +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int WriteReg(unsigned char RegAddr, unsigned char RegData) +{ + int iRet; + unsigned char cmd[2] = {0}; + if (NULL == fts_i2c_write_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_write_test == NULL !!!", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + cmd[0] = RegAddr; + cmd[1] = RegData; + iRet = fts_i2c_write_test(cmd, 2); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: Comm_Base_IIC_IO(Same function name as FT_MultipleTest) +* Brief: Write/Read Data by IIC +* Input: pWriteBuffer, iBytesToWrite, iBytesToRead +* Output: pReadBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead) +{ + int iRet; + + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + if (iBytesToRead > 0) { + iRet = fts_i2c_read_test(pWriteBuffer, iBytesToWrite, pReadBuffer, iBytesToRead); + } else { + iRet = fts_i2c_write_test(pWriteBuffer, iBytesToWrite); + } + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: EnterWork(Same function name as FT_MultipleTest) +* Brief: Enter Work Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char EnterWork(void) +{ + unsigned char RunState = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = WriteReg(DEVIDE_MODE_ADDR, 0); + if (ReCode == ERROR_CODE_OK) { + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } else + FTS_TEST_ERROR("EnterWork read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("EnterWork write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("EnterWork read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} +/************************************************************************ +* Name: EnterFactory +* Brief: enter Fcatory Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0 is OK, else fail. +***********************************************************************/ +unsigned char EnterFactory(void) +{ + unsigned char RunState = 0; + int index = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = WriteReg(DEVIDE_MODE_ADDR, 0x40); + if (ReCode == ERROR_CODE_OK) { + for (index = 0; index < 20; ++index) { + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + break; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } + SysDelay(50); + } + if (ReCode != ERROR_CODE_OK) + FTS_TEST_ERROR("EnterFactory read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("EnterFactory write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("EnterFactory read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + return ReCode; +} + +/************************************************************************ +* Name: fts_SetTestItemCodeName +* Brief: set test item code and name +* Input: null +* Output: null +* Return: +**********************************************************************/ + +void fts_SetTestItemCodeName(unsigned char ucitemcode) +{ + g_stTestItem[0][g_TestItemNum].ItemCode = ucitemcode; + + g_stTestItem[0][g_TestItemNum].TestNum = g_TestItemNum; + g_stTestItem[0][g_TestItemNum].TestResult = RESULT_NULL; + g_TestItemNum++; +} + +/************************************************************************ +* Name: InitTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int InitTest(void) +{ + int ret = 0; + ret = AllocateMemory(); + if (ret < 0) + return -EPERM; + + InitStoreParamOfTestData(); + + g_stSCapConfEx.ChannelXNum = 0; + g_stSCapConfEx.ChannelYNum = 0; + g_stSCapConfEx.KeyNum = 0; + g_stSCapConfEx.KeyNumTotal = 6; + + return 0; + +} + +/************************************************************************ +* Name: FinishTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void FinishTest(void) +{ + MergeAllTestData(); + FreeMemory(); +} + + +/************************************************************************ +* Name: InitStoreParamOfTestData +* Brief: Init store param of test data +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void InitStoreParamOfTestData(void) +{ + g_lenStoreMsgArea = 0; + + g_lenStoreMsgArea += sprintf(g_pStoreMsgArea, "ECC, 85, 170, IC Name, %s, IC Code, %x\n", g_strIcName, g_ScreenSetParam.iSelectedIC); + + + + g_lenMsgAreaLine2 = 0; + + + + g_lenStoreDataArea = 0; + m_iStartLine = 11; + + m_iTestDataCount = 0; +} +/************************************************************************ +* Name: MergeAllTestData +* Brief: Merge All Data of test result +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void MergeAllTestData(void) +{ + int iLen = 0; + + + iLen = sprintf(g_pTmpBuff, "TestItem, %d, ", m_iTestDataCount); + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pTmpBuff, iLen); + g_lenStoreMsgArea += iLen; + + + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pMsgAreaLine2, g_lenMsgAreaLine2); + g_lenStoreMsgArea += g_lenMsgAreaLine2; + + + iLen = sprintf(g_pTmpBuff, "\n\n\n\n\n\n\n\n\n"); + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pTmpBuff, iLen); + g_lenStoreMsgArea += iLen; + + + memcpy(g_pStoreAllData, g_pStoreMsgArea, g_lenStoreMsgArea); + + + if (0 != g_lenStoreDataArea) { + memcpy(g_pStoreAllData+g_lenStoreMsgArea, g_pStoreDataArea, g_lenStoreDataArea); + } + + + + FTS_TEST_DBG("lenStoreMsgArea=%d, lenStoreDataArea = %d", g_lenStoreMsgArea, g_lenStoreDataArea); +} + + + +/************************************************************************ +* Name: AllocateMemory +* Brief: Allocate pointer Memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int AllocateMemory(void) +{ + + g_pStoreMsgArea = NULL; + if (NULL == g_pStoreMsgArea) + g_pStoreMsgArea = fts_malloc(BUFF_LEN_STORE_MSG_AREA); + if (NULL == g_pStoreMsgArea) + goto ERR; + + g_pMsgAreaLine2 = NULL; + if (NULL == g_pMsgAreaLine2) + g_pMsgAreaLine2 = fts_malloc(BUFF_LEN_MSG_AREA_LINE2); + if (NULL == g_pMsgAreaLine2) + goto ERR; + + g_pStoreDataArea = NULL; + if (NULL == g_pStoreDataArea) + g_pStoreDataArea = fts_malloc(BUFF_LEN_STORE_DATA_AREA); + if (NULL == g_pStoreDataArea) + goto ERR; + + g_pTmpBuff = NULL; + if (NULL == g_pTmpBuff) + g_pTmpBuff = fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == g_pTmpBuff) + goto ERR; + + TestResult = NULL; + if (NULL == TestResult) + TestResult = fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == TestResult) + goto ERR; + + return 0; + +ERR: + FTS_TEST_ERROR("fts_malloc memory failed in function."); + return -EPERM; + +} + +/************************************************************************ +* Name: FreeMemory +* Brief: Release pointer memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void FreeMemory(void) +{ + + if (NULL != g_pStoreMsgArea) + fts_free(g_pStoreMsgArea); + + if (NULL != g_pMsgAreaLine2) + fts_free(g_pMsgAreaLine2); + + if (NULL != g_pStoreDataArea) + fts_free(g_pStoreDataArea); + + if (NULL != g_pTmpBuff) + fts_free(g_pTmpBuff); + + +} + + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_ini.c b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_ini.c new file mode 100644 index 0000000000000..d5eba110d32d0 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_ini.c @@ -0,0 +1,432 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_main.h" + + +char CFG_SSL = '['; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char CFG_SSR = ']'; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char CFG_NIS = ':'; /* Separator between name and index */ +char CFG_NTS = '#'; /* annotator */ +char CFG_EQS = '='; /* The equal sign */ + + +ST_INI_FILE_DATA *g_st_ini_file_data = NULL; +int g_used_key_num = 0; + + +static int ini_file_get_line(char *filedata, char *buffer, int maxlen); +static long fts_atol(char *nptr); + + +/* Works only for digits and letters, but small and fast */ +#define TOLOWER(x) ((x) | 0x20) + +int fts_strncmp(const char *cs, const char *ct, size_t count) +{ + unsigned char c1 = 0, c2 = 0; + + while (count) { + c1 = TOLOWER(*cs++); + c2 = TOLOWER(*ct++); + if (c1 != c2) + return c1 < c2 ? -1 : 1; + if (!c1) + break; + count--; + } + return 0; +} + +/************************************************************* +Function: Get the value of key +Input: char * filedata; char * section; char * key +Output: char * value¡¡key +Return: 0 SUCCESS + -1 can not find section + -2 can not find key + -10 File open failed + -12 File read failed + -14 File format error + -22 Out of buffer size +Note: +*************************************************************/ +int ini_get_key(char *filedata, char *section, char *key, char *value) +{ + int i = 0; + int ret = -2; + for (i = 0; i < g_used_key_num; i++) { + if (fts_strncmp(section, g_st_ini_file_data[i].pSectionName, + g_st_ini_file_data[i].iSectionNameLen) != 0) + continue; + + if (strlen(key) == g_st_ini_file_data[i].iKeyNameLen) { + if (fts_strncmp(key, g_st_ini_file_data[i].pKeyName, g_st_ini_file_data[i].iKeyNameLen) == 0) + + { + memcpy(value, g_st_ini_file_data[i].pKeyValue, g_st_ini_file_data[i].iKeyValueLen); + ret = 0; + break; + } + } + } + + return ret; +} + +/************************************************************* +Function: Remove empty character on the right side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ini_str_trim_r(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + for (i = 0; i < len; i++) { + if (buf[i] != ' ') + break; + } + if (i < len) { + strncpy(tmp, (buf+i), (len-i)); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Remove empty character on the left side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ini_str_trim_l(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + + for (i = 0; i < len; i++) { + if (buf[len-i-1] != ' ') + break; + } + if (i < len) { + strncpy(tmp, buf, len-i); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Read a line from file +Input: FILE *fp; int maxlen-- Maximum length of buffer +Output: char *buffer -- A string +Return: >0 Actual read length + -1 End of file + -2 Error reading file +Note: +*************************************************************/ +static int ini_file_get_line(char *filedata, char *buffer, int maxlen) +{ + int i = 0; + int j = 0; + int iRetNum = -1; + char ch1 = '\0'; + + for (i = 0, j = 0; i < maxlen; j++) { + ch1 = filedata[j]; + iRetNum = j+1; + if (ch1 == '\n' || ch1 == '\r') { + ch1 = filedata[j+1]; + if (ch1 == '\n' || ch1 == '\r') { + iRetNum++; + } + + break; + } else if (ch1 == 0x00) { + iRetNum = -1; + break; + } else { + buffer[i++] = ch1; /* ignore carriage return */ + } + } + buffer[i] = '\0'; + + return iRetNum; +} + +int my_fts_atoi(const char *str) +{ + int result = 0; + int signal = 1; /* The default is positive number*/ + if ((*str >= '0' && *str <= '9') || *str == '-' || *str == '+') { + if (*str == '-' || *str == '+') { + if (*str == '-') + signal = -1; /*enter negative number*/ + str++; + } + } else + return 0; + /*start transform*/ + while (*str >= '0' && *str <= '9') + result = result*10 + (*str++ - '0'); + + return signal*result; +} + +int isspace(int x) +{ + if (x == ' ' || x == '\t' || x == '\n' || x == '\f' || x == '\b' || x == '\r') + return 1; + else + return 0; +} + +int isdigit(int x) +{ + if (x <= '9' && x >= '0') + return 1; + else + return 0; + +} + +static long fts_atol(char *nptr) +{ + int c; /* current char */ + long total; /* current total */ + int sign; /* if ''-'', then negative, otherwise positive */ + /* skip whitespace */ + while (isspace((int)(unsigned char)*nptr)) + ++nptr; + c = (int)(unsigned char)*nptr++; + sign = c; /* save sign indication */ + if (c == '-' || c == '+') + c = (int)(unsigned char)*nptr++; /* skip sign */ + total = 0; + while (isdigit(c)) { + total = 10 * total + (c - '0'); /* accumulate digit */ + c = (int)(unsigned char)*nptr++; /* get next char */ + } + if (sign == '-') + return -total; + else + return total; /* return result, negated if necessary */ +} + +int fts_atoi(char *nptr) +{ + return (int)fts_atol(nptr); +} + +int init_key_data(void) +{ + int i = 0; + + FTS_TEST_FUNC_ENTER(); + + g_used_key_num = 0; + + g_st_ini_file_data = NULL; + if (NULL == g_st_ini_file_data) + g_st_ini_file_data = fts_malloc(sizeof(ST_INI_FILE_DATA)*MAX_KEY_NUM); + if (NULL == g_st_ini_file_data) { + FTS_TEST_ERROR("fts_malloc failed in function."); + return -EPERM; + } + for (i = 0; i < MAX_KEY_NUM; i++) { + memset(g_st_ini_file_data[i].pSectionName, 0, MAX_KEY_NAME_LEN); + memset(g_st_ini_file_data[i].pKeyName, 0, MAX_KEY_NAME_LEN); + memset(g_st_ini_file_data[i].pKeyValue, 0, MAX_KEY_VALUE_LEN); + g_st_ini_file_data[i].iSectionNameLen = 0; + g_st_ini_file_data[i].iKeyNameLen = 0; + g_st_ini_file_data[i].iKeyValueLen = 0; + } + + FTS_TEST_FUNC_EXIT(); + return 1; +} + +int release_key_data(void) +{ + if (NULL != g_st_ini_file_data) + fts_free(g_st_ini_file_data); + + return 0; +} +int print_key_data(void) +{ + int i = 0; + + + + FTS_TEST_DBG("g_used_key_num = %d", g_used_key_num); + for (i = 0; i < MAX_KEY_NUM; i++) { + + FTS_TEST_DBG("pSectionName_%d:%s, pKeyName_%d:%s\n,pKeyValue_%d:%s", + i, g_st_ini_file_data[i].pSectionName, + i, g_st_ini_file_data[i].pKeyName, + i, g_st_ini_file_data[i].pKeyValue + ); + + } + + return 1; +} +/************************************************************* +Function: Read all the parameters and values to the structure. +Return: Returns the number of key. If you go wrong, return a negative number. + -10 File open failed + -12 File read failed + -14 File format error +Note: +*************************************************************/ +int ini_get_key_data(char *filedata) +{ + + char buf1[MAX_CFG_BUF + 1] = {0}; + int n = 0; + int ret = 0; + int dataoff = 0; + int iEqualSign = 0; + int i = 0; + char tmpSectionName[MAX_CFG_BUF + 1] = {0}; + + + + FTS_TEST_FUNC_ENTER(); + + ret = init_key_data();/*init*/ + if (ret < 0) { + return -EPERM; + } + + g_used_key_num = 0; + while (1) {/*find section */ + ret = CFG_ERR_READ_FILE; + n = ini_file_get_line(filedata+dataoff, buf1, MAX_CFG_BUF); + if (n < -1) + goto cfg_scts_end; + if (n < 0) + break;/* file end */ + if (n >= MAX_CFG_BUF) { + FTS_TEST_ERROR("Error Length:%d\n", n); + goto cfg_scts_end; + } + + dataoff += n; + + n = strlen(ini_str_trim_l(ini_str_trim_r(buf1))); + if (n == 0 || buf1[0] == CFG_NTS) + continue; /* A blank line or a comment line */ + ret = CFG_ERR_FILE_FORMAT; + + if (n > 2 && ((buf1[0] == CFG_SSL && buf1[n-1] != CFG_SSR))) { + FTS_TEST_ERROR("Bad Section:%s\n", buf1); + goto cfg_scts_end; + } + + + if (buf1[0] == CFG_SSL) { + g_st_ini_file_data[g_used_key_num].iSectionNameLen = n-2; + if (MAX_KEY_NAME_LEN < g_st_ini_file_data[g_used_key_num].iSectionNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + + buf1[n-1] = 0x00; + strcpy((char *)tmpSectionName, buf1+1); + + + continue; + } + + + strcpy(g_st_ini_file_data[g_used_key_num].pSectionName, tmpSectionName); + g_st_ini_file_data[g_used_key_num].iSectionNameLen = strlen(tmpSectionName); + + iEqualSign = 0; + for (i = 0; i < n; i++) { + if (buf1[i] == CFG_EQS) { + iEqualSign = i; + break; + } + } + if (0 == iEqualSign) + continue; + /* before equal sign is assigned to the key name*/ + g_st_ini_file_data[g_used_key_num].iKeyNameLen = iEqualSign; + if (MAX_KEY_NAME_LEN < g_st_ini_file_data[g_used_key_num].iKeyNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(g_st_ini_file_data[g_used_key_num].pKeyName, + buf1, g_st_ini_file_data[g_used_key_num].iKeyNameLen); + + /* After equal sign is assigned to the key value*/ + g_st_ini_file_data[g_used_key_num].iKeyValueLen = n-iEqualSign-1; + if (MAX_KEY_VALUE_LEN < g_st_ini_file_data[g_used_key_num].iKeyValueLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_VALUE_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(g_st_ini_file_data[g_used_key_num].pKeyValue, + buf1 + iEqualSign+1, g_st_ini_file_data[g_used_key_num].iKeyValueLen); + + + ret = g_used_key_num; + + g_used_key_num++; /*Parameter number accumulation*/ + if (MAX_KEY_NUM < g_used_key_num) { + ret = CFG_ERR_TOO_MANY_KEY_NUM; + FTS_TEST_ERROR("MAX_KEY_NUM: CFG_ERR_TOO_MANY_KEY_NUM\n"); + goto cfg_scts_end; + } + } + + + + FTS_TEST_FUNC_EXIT(); + + return 0; + +cfg_scts_end: + + FTS_TEST_FUNC_EXIT(); + return ret; +} + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_main.c b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_main.c new file mode 100644 index 0000000000000..4f5dd43dbe8b2 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/src/focaltech_test_main.c @@ -0,0 +1,253 @@ +/************************************************************************ +* Copyright (C) 2012-2016, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#include +#include +#include +#include + + + +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_ini.h" +#include "../../focaltech_global/focaltech_ic_table.h" + + +#define FTS_TEST_STORE_DATA_SIZE 80*1024 + +FTS_I2C_READ_FUNCTION fts_i2c_read_test; +FTS_I2C_WRITE_FUNCTION fts_i2c_write_test; + +char *g_testparamstring = NULL; + +struct StTestFuncs g_stTestFuncs; + + +int init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read) +{ + unsigned char value = 0; + unsigned char recode = 0; + + FTS_TEST_FUNC_ENTER(); + + fts_i2c_read_test = fpI2C_Read; + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL ", __func__); + } + + + recode = ReadReg(0xa6, &value); + if (recode != ERROR_CODE_OK) { + FTS_TEST_ERROR("[focal] ReadReg Error, code: %d ", recode); + } else { + FTS_TEST_DBG("[focal] ReadReg successed, Addr: 0xa6, value: 0x%02x ", value); + } + + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +int init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write) +{ + FTS_TEST_FUNC_ENTER(); + + fts_i2c_write_test = fpI2C_Write; + if (NULL == fts_i2c_write_test) { + FTS_TEST_ERROR("[focal] fts_i2c_read_test == NULL "); + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + + +/************************************************************************ +* Name: set_param_data +* Brief: load Config. Set IC series, init test items, init basic threshold, int detailThreshold, and set order of test items +* Input: TestParamData, from ini file. +* Output: none +* Return: 0. No sense, just according to the old format. +***********************************************************************/ +int set_param_data(char *TestParamData) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + + g_testparamstring = TestParamData; + + ret = ini_get_key_data(g_testparamstring); + if (ret < 0) { + FTS_TEST_ERROR("ini_get_key_data error."); + return ret; + } + + + + OnInit_InterfaceCfg(g_testparamstring); + + /*Get IC Name*/ + fts_ic_table_get_ic_name_from_ic_code(g_ScreenSetParam.iSelectedIC, g_strIcName); + + + + if (g_stTestFuncs.OnInit_TestItem) { + g_stTestFuncs.OnInit_TestItem(g_testparamstring); + + } + + if (g_stTestFuncs.OnInit_BasicThreshold) { + g_stTestFuncs.OnInit_BasicThreshold(g_testparamstring); + + + } + + if (IC_Capacitance_Type == Self_Capacitance) { + OnInit_SCap_DetailThreshold(g_testparamstring); + } else if (IC_Capacitance_Type == Mutual_Capacitance) { + OnInit_MCap_DetailThreshold(g_testparamstring); + } else if (IC_Capacitance_Type == IDC_Capacitance) { + OnInit_Incell_DetailThreshold(g_testparamstring); + } + + if (g_stTestFuncs.SetTestItem) { + g_stTestFuncs.SetTestItem(); + } + + FTS_TEST_FUNC_EXIT(); + + return 0; +} + +/************************************************************************ +* Name: start_test_tp +* Brief: Test entry. Select test items based on IC series +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ + +boolean start_test_tp(void) +{ + boolean bTestResult = false; + + FTS_TEST_FUNC_ENTER(); + + FTS_TEST_DBG("IC_%s Test", g_strIcName); + + if (g_stTestFuncs.Start_Test) { + + bTestResult = g_stTestFuncs.Start_Test(); + + } else { + FTS_TEST_DBG("[Focal]Start_Test func null!\n"); + bTestResult = false; + } + + EnterWork(); + + FTS_TEST_FUNC_EXIT(); + + return bTestResult; +} +/************************************************************************ +* Name: get_test_data +* Brief: Get test data based on IC series +* Input: none +* Output: pTestData, External application for memory, buff size >= 1024*8 +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int get_test_data(char *pTestData) +{ + int iLen = 0; + FTS_TEST_DBG("[focal] %s start ", __func__); + + + if (g_stTestFuncs.Get_test_data) { + + iLen = g_stTestFuncs.Get_test_data(pTestData); + + } else { + FTS_TEST_DBG("[Focal]Get_test_data func null!\n"); + } + + FTS_TEST_FUNC_EXIT(); + return iLen; +} + +int focaltech_test_main_init(void) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + + /*Allocate memory, storage test results*/ + g_pStoreAllData = NULL; + if (NULL == g_pStoreAllData) + g_pStoreAllData = fts_malloc(FTS_TEST_STORE_DATA_SIZE); + if (NULL == g_pStoreAllData) + return -EPERM; + + /* Allocate memory, assigned to detail threshold structure*/ + ret = malloc_struct_DetailThreshold(); + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} +/************************************************************************ +* Name: free_test_param_data +* Brief: release printer memory +* Input: none +* Output: none +* Return: none. +***********************************************************************/ +int focaltech_test_main_exit(void) +{ + + FTS_TEST_DBG("[focal] release memory -start."); + + TestResultLen = 0; + + /* Release memory test results */ + if (NULL != g_pStoreAllData) { + FTS_TEST_DBG("[FTS] release memory g_pStoreAllData."); + fts_free(g_pStoreAllData); + g_pStoreAllData = NULL; + } + + + if (NULL != TestResult) { + fts_free(TestResult); + TestResult = NULL; + } + + + /* Releasing the memory of the detailed threshold structure */ + FTS_TEST_DBG("[FTS] release memory free_struct_DetailThreshold."); + free_struct_DetailThreshold(); + + + /* release memory of key data for ini file */ + release_key_data(); + FTS_TEST_DBG("[focal] release memory -end."); + return 0; +} + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/Makefile b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/Makefile new file mode 100644 index 0000000000000..7db0f9243b1f2 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/Makefile @@ -0,0 +1,10 @@ +#drivers/input/touchscreen/mediatek/focaltech_ts/focaltech_test +# +# Makefile for test module +# +# Linux driver folder + + +obj-y += focaltech_test_config_ft5x46.o +obj-y += focaltech_test_ft5x46.o +obj-y += focaltech_test_supported_ic.o diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_config_ft5x46.c b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_config_ft5x46.c new file mode 100644 index 0000000000000..70aef9a55873d --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_config_ft5x46.c @@ -0,0 +1,524 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: Focaltech_test_config_ft5x46.c +* +* Author: Software Development Team, AE +* +* Created: 2015-07-14 +* +* Abstract: Set Config for FT5X46\FT5X46i\FT5526\FT3X17\FT5436\FT3X27\FT5526i\FT5416\FT5426\FT5435 +* +************************************************************************/ +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + + +#if (FT5X46_TEST) + + +struct stCfg_FT5X46_TestItem g_stCfg_FT5X46_TestItem; +struct stCfg_FT5X46_BasicThreshold g_stCfg_FT5X46_BasicThreshold; + +void OnInit_FT5X46_TestItem(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("TestItem", "FW_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.FW_VERSION_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "FACTORY_ID_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.FACTORY_ID_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "PROJECT_CODE_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.PROJECT_CODE_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "IC_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.IC_VERSION_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "LCM_ID_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.LCM_ID_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "RAWDATA_TEST", "1", str, strIniFile); + g_stCfg_FT5X46_TestItem.RAWDATA_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "ADC_DETECT_TEST", "1", str, strIniFile); + g_stCfg_FT5X46_TestItem.ADC_DETECT_TEST = fts_atoi(str); + + GetPrivateProfileString("TestItem", "SCAP_CB_TEST", "1", str, strIniFile); + g_stCfg_FT5X46_TestItem.SCAP_CB_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "SCAP_RAWDATA_TEST", "1", str, strIniFile); + g_stCfg_FT5X46_TestItem.SCAP_RAWDATA_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "CHANNEL_NUM_TEST", "1", str, strIniFile); + g_stCfg_FT5X46_TestItem.CHANNEL_NUM_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "INT_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.INT_PIN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "RESET_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.RESET_PIN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.NOISE_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "WEAK_SHORT_CIRCUIT_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.WEAK_SHORT_CIRCUIT_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "UNIFORMITY_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "CM_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.CM_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "RAWDATA_MARGIN_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.RAWDATA_MARGIN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "PANEL_DIFFER_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.PANEL_DIFFER_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "PANEL_DIFFER_UNIFORMITY_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.PANEL_DIFFER_UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "TE_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.TE_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "SITO_RAWDATA_UNIFORMITY_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.SITO_RAWDATA_UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "PATTERN_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.PATTERN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "LCD_NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT5X46_TestItem.LCD_NOISE_TEST = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); +} +void OnInit_FT5X46_BasicThreshold(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "FW_VER_VALUE", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.FW_VER_VALUE = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Factory_ID_Number", "255", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Factory_ID_Number = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Project_Code", " ", str, strIniFile); + + sprintf(g_stCfg_FT5X46_BasicThreshold.Project_Code, "%s", str); + + + GetPrivateProfileString("Basic_Threshold", "IC_Version", "3", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.IC_Version = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "LCM_ID", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.LCM_ID = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Min", "3000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_low_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Max", "15000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_Low_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Min", "3000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_high_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Max", "15000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_high_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_LowFreq", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_SetLowFreq = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_HighFreq", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawDataTest_SetHighFreq = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "Adc_Detect_Max", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.AdcDetect_Max = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Min", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_OFF_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Max", "240", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_OFF_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Min", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_ON_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Max", "240", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_ON_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ScapCBTest_SetWaterproof_OFF", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_SetWaterproof_OFF = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ScapCBTest_SetWaterproof_ON", "240", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_SetWaterproof_ON = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapCBTest_LetTx_Disable", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapCbTest_LetTx_Disable = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Min", "5000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_OFF_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Max", "8500", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_OFF_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Min", "5000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_ON_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Max", "8500", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_ON_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_SetWaterproof_OFF", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_SetWaterproof_OFF = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_SetWaterproof_ON", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_SetWaterproof_ON = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_LetTx_Disable", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_LetTx_Disable = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_Mapping", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bChannelTestMapping = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_NoMapping", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bChannelTestNoMapping = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_TxNum", "13", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.ChannelNumTest_TxNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_RxNum", "24", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.ChannelNumTest_RxNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_Tx_NP_Num", "13", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.ChannelNumTest_TxNpNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_Rx_NP_Num", "24", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.ChannelNumTest_RxNpNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ResetPinTest_RegAddr", "136", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.ResetPinTest_RegAddr = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "IntPinTest_RegAddr", "79", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.IntPinTest_RegAddr = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "IntPinTest_TestNum", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.IntPinTest_TestNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Max", "20", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_Max = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Frames", "32", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_Frames = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Time", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_Time = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_SampeMode", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_SampeMode = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_NoiseMode", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_NoiseMode = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_ShowTip", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_ShowTip = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_GloveMode", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bNoiseTest_GloveMode = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_RawdataMin", "5000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_RawdataMin = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "GloveNoiseTest_Coefficient", "100", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.GloveNoiseTest_Coefficient = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "Set_Frequency", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Set_Frequency = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseThreshold_Choose", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bNoiseThreshold_Choose = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Threshold", "50", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_Threshold = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_MinNGFrame", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.NoiseTest_MinNgFrame = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_TPToolProcess", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bNoiseTest_TPToolProcess = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "WeakShortTest_CG", "2000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CG = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "WeakShortTest_CC", "2000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CC = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "UniformityTest_Check_Tx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_CheckTx = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "UniformityTest_Check_Rx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_CheckRx = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "UniformityTest_Check_MinMax", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_CheckMinMax = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "UniformityTest_Tx_Hole", "20", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_Tx_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "UniformityTest_Rx_Hole", "20", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_Rx_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "UniformityTest_MinMax_Hole", "70", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Uniformity_MinMax_Hole = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CMTest_Check_Min", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.CMTest_CheckMin = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CMTest_Check_Max", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.CMTest_CheckMax = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CMTest_Min_Hole", "0.5", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.CMTest_MinHole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CMTest_Max_Hole", "5", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.CMTest_MaxHole = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawdataMarginTest_Min", "10", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawdataMarginTest_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawdataMarginTest_Max", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.RawdataMarginTest_Max = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Min", "150", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDifferTest_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Max", "1000", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDifferTest_Max = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_Check_Tx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_Check_Tx = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_Check_Rx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_Check_Rx = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_Check_MinMax", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_Check_MinMax = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_Tx_Hole", "20", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_Tx_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_Rx_Hole", "20", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_Rx_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PanelDiffer_UniformityTest_MinMax_Hole", "70", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.PanelDiffer_UniformityTest_MinMax_Hole = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Check_Tx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SITO_RawdtaUniformityTest_Check_Tx = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Check_Rx", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SITO_RawdtaUniformityTest_Check_Rx = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Tx_Hole", "10", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SITO_RawdtaUniformityTest_Tx_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SITO_RawdataUniformityTest_Rx_Hole", "10", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.SITO_RawdtaUniformityTest_Rx_Hole = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "PramTest_Check_00", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bPattern00 = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PramTest_Check_FF", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bPatternFF = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PramTest_Check_55", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bPattern55 = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PramTest_Check_AA", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bPatternAA = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "PramTest_Check_BIN", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.bPatternBin = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "WeakShortTest_CC_Rsen", "57", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CC_Rsen = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "WeakShortTest_CapShortTest", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CapShortTest = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_Max_Frame", "200", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_MaxFrame = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_Conficient", "100", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_Conficient = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_Mode", "1", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_Noise_Mode = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_MaxNgPoint", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_MaxNgPoint = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_FrameNum", "63", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_FrameNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_SetFrequency", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_SetFrequency = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_NoiseThresholdMode", "0", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_NoiseThresholdMode = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_NoiseCoefficient", "200", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_NoiseCoefficient = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Lcd_Noise_NoiseMax", "50", str, strIniFile); + g_stCfg_FT5X46_BasicThreshold.Lcd_Noise_NoiseMax = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); +} + +void SetTestItem_FT5X46(void) +{ + + g_TestItemNum = 0; + + FTS_TEST_FUNC_ENTER(); + + + if (g_stCfg_FT5X46_TestItem.RESET_PIN_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_RESET_PIN_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.FACTORY_ID_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_FACTORY_ID_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.PROJECT_CODE_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_PROJECT_CODE_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.FW_VERSION_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_FW_VERSION_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.LCM_ID_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_LCM_ID_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.IC_VERSION_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_IC_VERSION_TEST); + } + + + + fts_SetTestItemCodeName(Code_FT5X46_ENTER_FACTORY_MODE); + + + if (g_stCfg_FT5X46_TestItem.TE_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_TE_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.CHANNEL_NUM_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_CHANNEL_NUM_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.LCD_NOISE_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_LCD_NOISE_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.NOISE_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_NOISE_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.RAWDATA_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_RAWDATA_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.UNIFORMITY_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_UNIFORMITY_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.SITO_RAWDATA_UNIFORMITY_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_SITO_RAWDATA_UNIFORMITY_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.CM_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_CM_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.ADC_DETECT_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_ADCDETECT_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.SCAP_CB_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_SCAP_CB_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.SCAP_RAWDATA_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_SCAP_RAWDATA_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.RAWDATA_MARGIN_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_RAWDATA_MARGIN_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.WEAK_SHORT_CIRCUIT_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_WEAK_SHORT_CIRCUIT_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.PANEL_DIFFER_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_PANELDIFFER_TEST); + } + + if (g_stCfg_FT5X46_TestItem.PANEL_DIFFER_UNIFORMITY_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_PANELDIFFER_UNIFORMITY_TEST); + } + + + if (g_stCfg_FT5X46_TestItem.INT_PIN_TEST == 1) { + + fts_SetTestItemCodeName(Code_FT5X46_INT_PIN_TEST); + } + + FTS_TEST_FUNC_EXIT(); +} + +#endif + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_ft5x46.c b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_ft5x46.c new file mode 100644 index 0000000000000..fff3e01b95de8 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_ft5x46.c @@ -0,0 +1,2327 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: Focaltech_test_ft5x46.c +* +* Author: Software Development Team, AE +* +* Created: 2015-07-14 +* +* Abstract: test item for FT5X46\FT5X46i\FT5526\FT3X17\FT5436\FT3X27\FT5526i\FT5416\FT5426\FT5435 +* +************************************************************************/ + +/******************************************************************************* +* Included header files +*******************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" +#include "../../focaltech_global/focaltech_ic_table.h" + + +#if (FT5X46_TEST) + + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ + + + + +#define SPECIAL_TEST_FOR_MEIZU_EN 0 + + +#define DEVIDE_MODE_ADDR 0x00 +#define REG_LINE_NUM 0x01 +#define REG_TX_NUM 0x02 +#define REG_RX_NUM 0x03 +#define REG_PATTERN_5422 0x53 +#define REG_MAPPING_SWITCH 0x54 +#define REG_TX_NOMAPPING_NUM 0x55 +#define REG_RX_NOMAPPING_NUM 0x56 +#define REG_NORMALIZE_TYPE 0x16 +#define REG_ScCbBuf0 0x4E +#define REG_ScWorkMode 0x44 +#define REG_ScCbAddrR 0x45 +#define REG_RawBuf0 0x36 +#define REG_WATER_CHANNEL_SELECT 0x09 +#define REG_FW_PROCESS 0x1A +#define REG_NOISE_SAMPLE_FRAME 0X1C +#define REG_LCD_NOISE_CONFICIENT 0X0F +#define REG_LCD_NOISE_MAX_NG 0X10 +#define REG_LCD_NOISE_MODE 0X1B +#define REG_LCD_NOISE_FRAMEFAILED 0X11 +#define REG_RELEASECODEID_H 0xAE +#define REG_RELEASECODEID_L 0xAF +#define MAX_NOISE_FRAMES 200 + +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ +enum WaterproofType { + WT_NeedProofOnTest, + WT_NeedProofOffTest, + WT_NeedTxOnVal, + WT_NeedRxOnVal, + WT_NeedTxOffVal, + WT_NeedRxOffVal, +}; + +enum NOISE_TYPE { + NT_AvgData = 0, + NT_MaxData = 1, + NT_MaxDevication = 2, + NT_DifferData = 3, +}; + +/******************************************************************************* +* Static variables +*******************************************************************************/ + +static int m_RawData[TX_NUM_MAX][RX_NUM_MAX] = {{0} } ; +static int m_iTempRawData[TX_NUM_MAX * RX_NUM_MAX] = {0}; +static unsigned char m_ucTempData[TX_NUM_MAX * RX_NUM_MAX*2] = {0}; +static bool m_bV3TP; + + +static int m_DifferData[TX_NUM_MAX][RX_NUM_MAX] = {{0} } ; +static int m_absDifferData[TX_NUM_MAX][RX_NUM_MAX] = {{0} } ; + + + + + + + + + + + + + + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ +extern struct stCfg_FT5X46_BasicThreshold g_stCfg_FT5X46_BasicThreshold; + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ + +static int StartScan(void); +static unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer); +static unsigned char GetPanelRows(unsigned char *pPanelRows); +static unsigned char GetPanelCols(unsigned char *pPanelCols); +static unsigned char GetTxSC_CB(unsigned char index, unsigned char *pcbValue); +static unsigned char GetRawData(void); +static unsigned char GetChannelNum(void); +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount); +static void ShowRawData(void); +static boolean GetTestCondition(int iTestType, unsigned char ucChannelValue); +static unsigned char GetChannelNumNoMapping(void); +static unsigned char SwitchToNoMapping(void); +static unsigned char WeakShort_GetAdcData(int AllAdcDataLen, int *pRevBuffer); + + + + +boolean FT5X46_StartTest(void); +int FT5X46_get_test_data(char *pTestData); + + +unsigned char FT5X46_TestItem_EnterFactoryMode(void); +unsigned char FT5X46_TestItem_RawDataTest(bool *bTestResult); +unsigned char FT5X46_TestItem_SCapRawDataTest(bool *bTestResult); +unsigned char FT5X46_TestItem_SCapCbTest(bool *bTestResult); +unsigned char FT5X46_TestItem_PanelDifferTest(bool *bTestResult); +unsigned char FT5X46_TestItem_WeakShortTest(bool *bTestResult); + + + +/************************************************************************ +* Name: FT5X46_StartTest +* Brief: Test entry. Determine which test item to test +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ +boolean FT5X46_StartTest() +{ + bool bTestResult = true; + bool bTempResult = 1; + unsigned char ReCode = 0; + unsigned char ucDevice = 0; + int iItemCount = 0; + + FTS_TEST_FUNC_ENTER(); + + + if (InitTest() < 0) { + FTS_TEST_ERROR("[focal] Failed to init test."); + return false; + } + + + if (0 == g_TestItemNum) + bTestResult = false; + + + for (iItemCount = 0; iItemCount < g_TestItemNum; iItemCount++) { + m_ucTestItemCode = g_stTestItem[ucDevice][iItemCount].ItemCode; + + + if (Code_FT5X46_ENTER_FACTORY_MODE == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + + ReCode = FT5X46_TestItem_EnterFactoryMode(); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + break; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + + if (Code_FT5X46_RAWDATA_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + + ReCode = FT5X46_TestItem_RawDataTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + + if (Code_FT5X46_SCAP_CB_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT5X46_TestItem_SCapCbTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT5X46_SCAP_RAWDATA_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT5X46_TestItem_SCapRawDataTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT5X46_PANELDIFFER_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + + ReCode = FT5X46_TestItem_PanelDifferTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + + if (Code_FT5X46_WEAK_SHORT_CIRCUIT_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + + ReCode = FT5X46_TestItem_WeakShortTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + } + + + FinishTest(); + + g_TestItemNum = 0; + + return bTestResult; +} + +/************************************************************************ +* Name: FT5X46_get_test_data +* Brief: get data of test result +* Input: none +* Output: pTestData, the returned buff +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int FT5X46_get_test_data(char *pTestData) +{ + if (NULL == pTestData) { + FTS_TEST_ERROR(" pTestData == NULL "); + return -EPERM; + } + memcpy(pTestData, g_pStoreAllData, (g_lenStoreMsgArea+g_lenStoreDataArea)); + return (g_lenStoreMsgArea+g_lenStoreDataArea); +} + +/************************************************************************ +* Name: FT5X46_TestItem_EnterFactoryMode +* Brief: Check whether TP can enter Factory Mode, and do some thing +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT5X46_TestItem_EnterFactoryMode(void) +{ + unsigned char ReCode = ERROR_CODE_INVALID_PARAM; + int iRedo = 5; + int i ; + unsigned char chPattern = 0; + + FTS_TEST_FUNC_ENTER(); + + SysDelay(150); + for (i = 1; i <= iRedo; i++) { + ReCode = EnterFactory(); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Enter factory mode..."); + if (i < iRedo) { + SysDelay(50); + continue; + } + } else { + break; + } + + } + SysDelay(300); + + + if (ReCode != ERROR_CODE_OK) { + return ReCode; + } + + + ReCode = GetChannelNum(); + + + + + + ReCode = ReadReg(REG_PATTERN_5422, &chPattern); + if (chPattern == 1) { + m_bV3TP = true; + } else { + m_bV3TP = false; + } + + return ReCode; +} +/************************************************************************ +* Name: FT5X46_TestItem_RawDataTest +* Brief: TestItem: RawDataTest. Check if MCAP RawData is within the range. +* Input: none +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT5X46_TestItem_RawDataTest(bool *bTestResult) +{ + unsigned char ReCode = 0; + bool btmpresult = true; + int RawDataMin; + int RawDataMax; + unsigned char ucFre; + unsigned char strSwitch = 0; + unsigned char OriginValue = 0xff; + int index = 0; + int iRow, iCol; + int iValue = 0; + int nRawDataOK = 0; + + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Raw Data Test \n"); + ReCode = EnterFactory(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to Enter factory Mode. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + + if (m_bV3TP) { + ReCode = ReadReg(REG_MAPPING_SWITCH, &strSwitch); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + if (strSwitch != 0) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Write REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + ReCode = GetChannelNum(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n GetChannelNum error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + } + + + ReCode = ReadReg(REG_NORMALIZE_TYPE, &OriginValue); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_NORMALIZE_TYPE error. Error Code: %d", ReCode); + goto TEST_ERR; + } + ReCode = ReadReg(0x0A, &ucFre); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read frequency error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + if (g_ScreenSetParam.isNormalize == Auto_Normalize) { + if (OriginValue != 1) { + ReCode = WriteReg(REG_NORMALIZE_TYPE, 0x01); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n write REG_NORMALIZE_TYPE error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + + + FTS_TEST_DBG("\n=========Set Frequecy High\n"); + ReCode = WriteReg(0x0A, 0x81); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Set Frequecy High error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + FTS_TEST_DBG("\n=========FIR State: ON"); + ReCode = WriteReg(0xFB, 1); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n FIR State: ON error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + for (index = 0; index < 3; ++index) { + ReCode = GetRawData(); + } + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\nGet Rawdata failed, Error Code: 0x%x", ReCode); + goto TEST_ERR; + } + + ShowRawData(); + + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[iRow][iCol]; + RawDataMax = g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + + + Save_Test_Data(m_RawData, 0, g_ScreenSetParam.iTxNum, g_ScreenSetParam.iRxNum, 2); + } else { + if (OriginValue != 0) { + ReCode = WriteReg(REG_NORMALIZE_TYPE, 0x00); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n write REG_NORMALIZE_TYPE error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + + + if (g_stCfg_FT5X46_BasicThreshold.RawDataTest_SetLowFreq) { + FTS_TEST_DBG("\n=========Set Frequecy Low"); + ReCode = WriteReg(0x0A, 0x80); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n write frequency error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + + FTS_TEST_DBG("\n=========FIR State: OFF\n"); + ReCode = WriteReg(0xFB, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n FIR State: OFF error. Error Code: %d", ReCode); + goto TEST_ERR; + } + SysDelay(100); + + /* + for (index = 0; index < 3; ++index ) { + ReCode = GetRawData(); + } + */ + for (index = 0, nRawDataOK = 0; index < 10 && nRawDataOK < 3; ++index) { + ReCode = GetRawData(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Get Rawdata failed, index:%d. Error Code: 0x%x", index, ReCode); + } else + nRawDataOK++; + } + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Get Rawdata failed, Error Code: 0x%x", ReCode); + goto TEST_ERR; + } + ShowRawData(); + + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[iRow][iCol]; + RawDataMax = g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + + + Save_Test_Data(m_RawData, 0, g_ScreenSetParam.iTxNum, g_ScreenSetParam.iRxNum, 1); + } + + + + if (g_stCfg_FT5X46_BasicThreshold.RawDataTest_SetHighFreq) { + + FTS_TEST_DBG("\n=========Set Frequecy High"); + ReCode = WriteReg(0x0A, 0x81); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Set Frequecy High error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + + FTS_TEST_DBG("\n=========FIR State: OFF\n"); + ReCode = WriteReg(0xFB, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n FIR State: OFF error. Error Code: %d", ReCode); + goto TEST_ERR; + } + SysDelay(100); + + for (index = 0; index < 3; ++index) { + ReCode = GetRawData(); + } + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\nGet Rawdata failed, Error Code: 0x%x", ReCode); + if (ReCode != ERROR_CODE_OK) + goto TEST_ERR; + } + ShowRawData(); + + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[iRow][iCol]; + RawDataMax = g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + + + Save_Test_Data(m_RawData, 0, g_ScreenSetParam.iTxNum, g_ScreenSetParam.iRxNum, 2); + } + + } + + + + ReCode = WriteReg(REG_NORMALIZE_TYPE, OriginValue); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Write REG_NORMALIZE_TYPE error. Error Code: %d", ReCode); + goto TEST_ERR; + } + ReCode = WriteReg(0x0A, ucFre); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Write 0x0A error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + if (m_bV3TP) { + ReCode = WriteReg(REG_MAPPING_SWITCH, strSwitch); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Write REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + + TestResultLen += sprintf(TestResult+TestResultLen, " RawData Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//RawData Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//RawData Test is NG!"); + } + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO("\n\n//RawData Test is NG!"); + TestResultLen += sprintf(TestResult+TestResultLen, " RawData Test is NG. \n\n"); + return ReCode; + +} +/************************************************************************ +* Name: FT5X46_TestItem_SCapRawDataTest +* Brief: TestItem: SCapRawDataTest. Check if SCAP RawData is within the range. +* Input: none +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT5X46_TestItem_SCapRawDataTest(bool *bTestResult) +{ + int i = 0; + int RawDataMin = 0; + int RawDataMax = 0; + int Value = 0; + boolean bFlag = true; + unsigned char ReCode = 0; + boolean btmpresult = true; + int iMax = 0; + int iMin = 0; + int iAvg = 0; + int ByteNum = 0; + unsigned char wc_value = 0; + unsigned char ucValue = 0; + int iCount = 0; + + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Scap RawData Test \n"); + + + ReCode = EnterFactory(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to Enter factory Mode. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + ReCode = ReadReg(REG_WATER_CHANNEL_SELECT, &wc_value); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to read REG_WATER_CHANNEL_SELECT. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + ReCode = SwitchToNoMapping(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to SwitchToNoMapping. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + ReCode = StartScan(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to Scan SCap RawData! "); + goto TEST_ERR; + } + for (i = 0; i < 3; i++) { + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + + + ByteNum = (g_ScreenSetParam.iTxNum + g_ScreenSetParam.iRxNum)*2; + ReCode = ReadRawData(0, 0xAC, ByteNum, m_iTempRawData); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_DBG("Failed to ReadRawData water! "); + goto TEST_ERR; + } + + memcpy(m_RawData[0+g_ScreenSetParam.iTxNum], m_iTempRawData, sizeof(int)*g_ScreenSetParam.iRxNum); + memcpy(m_RawData[1+g_ScreenSetParam.iTxNum], m_iTempRawData + g_ScreenSetParam.iRxNum, sizeof(int)*g_ScreenSetParam.iTxNum); + + + ByteNum = (g_ScreenSetParam.iTxNum + g_ScreenSetParam.iRxNum)*2; + ReCode = ReadRawData(0, 0xAB, ByteNum, m_iTempRawData); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to ReadRawData no water! "); + goto TEST_ERR; + } + memcpy(m_RawData[2+g_ScreenSetParam.iTxNum], m_iTempRawData, sizeof(int)*g_ScreenSetParam.iRxNum); + memcpy(m_RawData[3+g_ScreenSetParam.iTxNum], m_iTempRawData + g_ScreenSetParam.iRxNum, sizeof(int)*g_ScreenSetParam.iTxNum); + } + + + + + + bFlag = GetTestCondition(WT_NeedProofOnTest, wc_value); + if (g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_SetWaterproof_ON && bFlag) { + iCount = 0; + RawDataMin = g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_ON_Min; + RawDataMax = g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_ON_Max; + iMax = -m_RawData[0+g_ScreenSetParam.iTxNum][0]; + iMin = 2 * m_RawData[0+g_ScreenSetParam.iTxNum][0]; + iAvg = 0; + Value = 0; + + + bFlag = GetTestCondition(WT_NeedRxOnVal, wc_value); + if (bFlag) + FTS_TEST_DBG("Judge Rx in Waterproof-ON:"); + for (i = 0; bFlag && i < g_ScreenSetParam.iRxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[0][i] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[0][i]; + RawDataMax = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[0][i]; + Value = m_RawData[0+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > RawDataMax || Value < RawDataMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, RawDataMin, RawDataMax); + } + iCount++; + } + + + bFlag = GetTestCondition(WT_NeedTxOnVal, wc_value); + if (bFlag) + FTS_TEST_DBG("Judge Tx in Waterproof-ON:"); + for (i = 0; bFlag && i < g_ScreenSetParam.iTxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[1][i] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[1][i]; + RawDataMax = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[1][i]; + Value = m_RawData[1+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > RawDataMax || Value < RawDataMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, RawDataMin, RawDataMax); + } + iCount++; + } + if (0 == iCount) { + iAvg = 0; + iMax = 0; + iMin = 0; + } else + iAvg = iAvg/iCount; + + FTS_TEST_DBG("SCap RawData in Waterproof-ON, Max : %d, Min: %d, Deviation: %d, Average: %d", iMax, iMin, iMax - iMin, iAvg); + + + Save_Test_Data(m_RawData, g_ScreenSetParam.iTxNum+0, 2, g_ScreenSetParam.iRxNum, 1); + } + + + bFlag = GetTestCondition(WT_NeedProofOffTest, wc_value); + if (g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_SetWaterproof_OFF && bFlag) { + iCount = 0; + RawDataMin = g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_OFF_Min; + RawDataMax = g_stCfg_FT5X46_BasicThreshold.SCapRawDataTest_OFF_Max; + iMax = -m_RawData[2+g_ScreenSetParam.iTxNum][0]; + iMin = 2 * m_RawData[2+g_ScreenSetParam.iTxNum][0]; + iAvg = 0; + Value = 0; + + bFlag = GetTestCondition(WT_NeedRxOffVal, wc_value); + if (bFlag) + FTS_TEST_DBG("Judge Rx in Waterproof-OFF:"); + for (i = 0; bFlag && i < g_ScreenSetParam.iRxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[0][i] == 0) + continue; + RawDataMin = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[0][i]; + RawDataMax = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[0][i]; + Value = m_RawData[2+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + + + + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > RawDataMax || Value < RawDataMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, RawDataMin, RawDataMax); + } + iCount++; + } + + bFlag = GetTestCondition(WT_NeedTxOffVal, wc_value); + if (bFlag) + FTS_TEST_DBG("Judge Tx in Waterproof-OFF:"); + for (i = 0; bFlag && i < g_ScreenSetParam.iTxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[1][i] == 0) + continue; + + Value = m_RawData[3+g_ScreenSetParam.iTxNum][i]; + RawDataMin = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[1][i]; + RawDataMax = g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[1][i]; + + iAvg += Value; + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > RawDataMax || Value < RawDataMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, RawDataMin, RawDataMax); + } + iCount++; + } + if (0 == iCount) { + iAvg = 0; + iMax = 0; + iMin = 0; + } else + iAvg = iAvg/iCount; + + FTS_TEST_DBG("SCap RawData in Waterproof-OFF, Max : %d, Min: %d, Deviation: %d, Average: %d", iMax, iMin, iMax - iMin, iAvg); + + + Save_Test_Data(m_RawData, g_ScreenSetParam.iTxNum+2, 2, g_ScreenSetParam.iRxNum, 2); + } + + if (m_bV3TP) { + ReCode = ReadReg(REG_MAPPING_SWITCH, &ucValue); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + if (0 != ucValue) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 0); + SysDelay(10); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to switch mapping type!\n "); + btmpresult = false; + } + } + + + ReCode = GetChannelNum(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n GetChannelNum error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + + TestResultLen += sprintf(TestResult+TestResultLen, " SCap RawData Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//SCap RawData Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//SCap RawData Test is NG!"); + } + return ReCode; + +TEST_ERR: + *bTestResult = false; + FTS_TEST_INFO("\n\n//SCap RawData Test is NG!"); + TestResultLen += sprintf(TestResult+TestResultLen, " SCap RawData Test is NG. \n\n"); + return ReCode; +} + +/************************************************************************ +* Name: FT5X46_TestItem_SCapCbTest +* Brief: TestItem: SCapCbTest. Check if SCAP Cb is within the range. +* Input: none +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT5X46_TestItem_SCapCbTest(bool *bTestResult) +{ + int i, /* j, iOutNum, */index, Value, CBMin, CBMax; + boolean bFlag = true; + unsigned char ReCode; + boolean btmpresult = true; + int iMax, iMin, iAvg; + unsigned char wc_value = 0; + unsigned char ucValue = 0; + int iCount = 0; + + + FTS_TEST_INFO("\n\n==============================Test Item: ----- Scap CB Test \n"); + + + ReCode = EnterFactory(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to Enter factory Mode. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + ReCode = ReadReg(REG_WATER_CHANNEL_SELECT, &wc_value); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_WATER_CHANNEL_SELECT error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + bFlag = SwitchToNoMapping(); + if (bFlag) { + FTS_TEST_ERROR("Failed to SwitchToNoMapping! ReCode = %d. ", ReCode); + goto TEST_ERR; + } + + + ReCode = StartScan(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to Scan SCap RawData!ReCode = %d. ", ReCode); + goto TEST_ERR; + } + + + for (i = 0; i < 3; i++) { + memset(m_RawData, 0, sizeof(m_RawData)); + memset(m_ucTempData, 0, sizeof(m_ucTempData)); + + + ReCode = WriteReg(REG_ScWorkMode, 1); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Get REG_ScWorkMode Failed!"); + goto TEST_ERR; + } + + ReCode = StartScan(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("StartScan Failed!"); + goto TEST_ERR; + } + + ReCode = WriteReg(REG_ScCbAddrR, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Write REG_ScCbAddrR Failed!"); + goto TEST_ERR; + } + + ReCode = GetTxSC_CB(g_ScreenSetParam.iTxNum + g_ScreenSetParam.iRxNum + 128, m_ucTempData); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("GetTxSC_CB Failed!"); + goto TEST_ERR; + } + + for (index = 0; index < g_ScreenSetParam.iRxNum; ++index) { + m_RawData[0 + g_ScreenSetParam.iTxNum][index] = m_ucTempData[index]; + } + for (index = 0; index < g_ScreenSetParam.iTxNum; ++index) { + m_RawData[1 + g_ScreenSetParam.iTxNum][index] = m_ucTempData[index + g_ScreenSetParam.iRxNum]; + } + + + ReCode = WriteReg(REG_ScWorkMode, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Get REG_ScWorkMode Failed!"); + goto TEST_ERR; + } + + ReCode = StartScan(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("StartScan Failed!"); + goto TEST_ERR; + } + + ReCode = WriteReg(REG_ScCbAddrR, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Write REG_ScCbAddrR Failed!"); + goto TEST_ERR; + } + + ReCode = GetTxSC_CB(g_ScreenSetParam.iTxNum + g_ScreenSetParam.iRxNum + 128, m_ucTempData); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("GetTxSC_CB Failed!"); + goto TEST_ERR; + } + for (index = 0; index < g_ScreenSetParam.iRxNum; ++index) { + m_RawData[2 + g_ScreenSetParam.iTxNum][index] = m_ucTempData[index]; + } + for (index = 0; index < g_ScreenSetParam.iTxNum; ++index) { + m_RawData[3 + g_ScreenSetParam.iTxNum][index] = m_ucTempData[index + g_ScreenSetParam.iRxNum]; + } + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to Get SCap CB!"); + } + } + + if (ReCode != ERROR_CODE_OK) + goto TEST_ERR; + + + + + bFlag = GetTestCondition(WT_NeedProofOnTest, wc_value); + if (g_stCfg_FT5X46_BasicThreshold.SCapCbTest_SetWaterproof_ON && bFlag) { + FTS_TEST_DBG("SCapCbTest in WaterProof On Mode: "); + + iMax = -m_RawData[0+g_ScreenSetParam.iTxNum][0]; + iMin = 2 * m_RawData[0+g_ScreenSetParam.iTxNum][0]; + iAvg = 0; + Value = 0; + iCount = 0; + + + bFlag = GetTestCondition(WT_NeedRxOnVal, wc_value); + if (bFlag) + FTS_TEST_DBG("SCap CB_Rx: "); + for (i = 0; bFlag && i < g_ScreenSetParam.iRxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[0][i] == 0) + continue; + CBMin = g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[0][i]; + CBMax = g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[0][i]; + Value = m_RawData[0+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > CBMax || Value < CBMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, CBMin, CBMax); + } + iCount++; + } + + + bFlag = GetTestCondition(WT_NeedTxOnVal, wc_value); + if (bFlag) + FTS_TEST_DBG("SCap CB_Tx: "); + for (i = 0; bFlag && i < g_ScreenSetParam.iTxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[1][i] == 0) + continue; + CBMin = g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[1][i]; + CBMax = g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[1][i]; + Value = m_RawData[1+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > CBMax || Value < CBMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, CBMin, CBMax); + } + iCount++; + } + + if (0 == iCount) { + iAvg = 0; + iMax = 0; + iMin = 0; + } else + iAvg = iAvg/iCount; + + FTS_TEST_DBG("SCap CB in Waterproof-ON, Max : %d, Min: %d, Deviation: %d, Average: %d", iMax, iMin, iMax - iMin, iAvg); + + + Save_Test_Data(m_RawData, g_ScreenSetParam.iTxNum+0, 2, g_ScreenSetParam.iRxNum, 1); + } + + bFlag = GetTestCondition(WT_NeedProofOffTest, wc_value); + if (g_stCfg_FT5X46_BasicThreshold.SCapCbTest_SetWaterproof_OFF && bFlag) { + FTS_TEST_DBG("SCapCbTest in WaterProof OFF Mode: "); + iMax = -m_RawData[2+g_ScreenSetParam.iTxNum][0]; + iMin = 2 * m_RawData[2+g_ScreenSetParam.iTxNum][0]; + iAvg = 0; + Value = 0; + iCount = 0; + + + bFlag = GetTestCondition(WT_NeedRxOffVal, wc_value); + if (bFlag) + FTS_TEST_DBG("SCap CB_Rx: "); + for (i = 0; bFlag && i < g_ScreenSetParam.iRxNum; i++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[0][i] == 0) + continue; + CBMin = g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[0][i]; + CBMax = g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[0][i]; + Value = m_RawData[2+g_ScreenSetParam.iTxNum][i]; + iAvg += Value; + + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > CBMax || Value < CBMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, CBMin, CBMax); + } + iCount++; + } + + + bFlag = GetTestCondition(WT_NeedTxOffVal, wc_value); + if (bFlag) + FTS_TEST_DBG("SCap CB_Tx: "); + for (i = 0; bFlag && i < g_ScreenSetParam.iTxNum; i++) { + + if (g_stCfg_MCap_DetailThreshold.InvalidNode_SC[1][i] == 0) + continue; + CBMin = g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[1][i]; + CBMax = g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[1][i]; + Value = m_RawData[3+g_ScreenSetParam.iTxNum][i]; + + iAvg += Value; + if (iMax < Value) + iMax = Value; + if (iMin > Value) + iMin = Value; + if (Value > CBMax || Value < CBMin) { + btmpresult = false; + FTS_TEST_ERROR("Failed. Num = %d, Value = %d, range = (%d, %d):", i+1, Value, CBMin, CBMax); + } + iCount++; + } + + if (0 == iCount) { + iAvg = 0; + iMax = 0; + iMin = 0; + } else + iAvg = iAvg/iCount; + + FTS_TEST_DBG("SCap CB in Waterproof-OFF, Max : %d, Min: %d, Deviation: %d, Average: %d", iMax, iMin, iMax - iMin, iAvg); + + + Save_Test_Data(m_RawData, g_ScreenSetParam.iTxNum+2, 2, g_ScreenSetParam.iRxNum, 2); + } + + if (m_bV3TP) { + ReCode = ReadReg(REG_MAPPING_SWITCH, &ucValue); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + if (0 != ucValue) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 0); + SysDelay(10); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_DBG("Failed to switch mapping type!\n "); + btmpresult = false; + } + } + + + ReCode = GetChannelNum(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n GetChannelNum error. Error Code: %d", ReCode); + goto TEST_ERR; + } + } + + TestResultLen += sprintf(TestResult+TestResultLen, " SCap CB Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//SCap CB Test Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//SCap CB Test Test is NG!"); + } + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO("\n\n//SCap CB Test Test is NG!"); + TestResultLen += sprintf(TestResult+TestResultLen, " SCap CB Test is NG. \n\n"); + return ReCode; +} + + +unsigned char FT5X46_TestItem_WeakShortTest(bool *bTestResult) +{ + + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + int i = 0; + bool btmpresult = true; + int iAllAdcDataNum = 63; + int iMaxTx = 35; + unsigned char iTxNum, iRxNum, iChannelNum; + int iClbData_Ground, iClbData_Mutual, iOffset, iRsen, iCCRsen; + unsigned char IcValue = 0; + unsigned char strSwitch = 1; + bool bCapShortTest = false; + + int *iAdcData = NULL; + + int fKcal = 0; + int *fMShortResistance = NULL, *fGShortResistance = NULL; + int iDoffset = 0, iDsen = 0, iDrefn = 0; + int iMin_CG = 0; + int iCount = 0; + int iMin_CC = 0; + int iDCal = 0; + int iMa = 0; + + + FTS_TEST_INFO("\n\n\n\n==============================Test Item: ----- Weak Short-Circuit Test \r\n\r\n"); + + ReCode = EnterWork(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR(" EnterWork failed.. Error Code: %d", ReCode); + btmpresult = false; + goto TEST_ERR; + } + SysDelay(200); + + + ReCode = ReadReg(0xB1, &IcValue); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read 0xB1 IcValue error. Error Code: %d\n", ReCode); + btmpresult = false; + goto TEST_ERR; + } else + FTS_TEST_DBG(" IcValue:0x%02x. \n", IcValue); + + iRsen = 57; + + iCCRsen = g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CC_Rsen; + bCapShortTest = g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CapShortTest; + FTS_TEST_DBG(" iCCRsen:%d. \n", iCCRsen); + FTS_TEST_DBG(" bCapShortTest:%d. \n", bCapShortTest); + + ReCode = EnterFactory(); + SysDelay(100); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_DBG(" EnterFactory failed.. Error Code: %d", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + + + + if (m_bV3TP) { + ReCode = ReadReg(REG_MAPPING_SWITCH, &strSwitch); + if (strSwitch != 1) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 1); + SysDelay(20); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\r\nFailed to restore mapping type!\r\n "); + btmpresult = false; + } + GetChannelNumNoMapping(); + + iTxNum = g_ScreenSetParam.iTxNum; + iRxNum = g_ScreenSetParam.iRxNum; + } + } else { + + + ReCode = ReadReg(0x02, &iTxNum); + ReCode = ReadReg(0x03, &iRxNum); + FTS_TEST_DBG("Newly acquired TxNum:%d, RxNum:%d", iTxNum, iRxNum); + } + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("ReCode error. Error Code: %d\n", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + iChannelNum = iTxNum + iRxNum; + iMaxTx = iTxNum; + iAllAdcDataNum = 1 + (1 + iTxNum + iRxNum)*2; + + for (i = 0; i < 5; i++) { + ReCode = StartScan(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("StartScan Failed!\n"); + + SysDelay(100); + } else { + FTS_TEST_DBG("StartScan OK!\n"); + break; + } + } + if (i >= 5) { + FTS_TEST_ERROR("StartScan Failed for several times.!\n"); + btmpresult = false; + goto TEST_ERR; + } + for (i = 0; i < 3; i++) { + GetRawData(); + } + + iAdcData = fts_malloc(iAllAdcDataNum*sizeof(int)); + memset(iAdcData, 0, iAllAdcDataNum); + + for (i = 0; i < 5; i++) { + memset(iAdcData, 0, iAllAdcDataNum); + + FTS_TEST_DBG("WeakShort_GetAdcData times: %d", i); + + ReCode = WeakShort_GetAdcData(iAllAdcDataNum*2, iAdcData); + SysDelay(50); + if (ReCode != ERROR_CODE_OK) { + continue; + } else { + if (0 == iAdcData[0] && 0 == iAdcData[1]) { + continue; + } + + else + break; + } + } + if (i >= 5) { + FTS_TEST_ERROR("WeakShort_GetAdcData or ADC data error. tried times: %d", i); + btmpresult = false; + goto TEST_ERR; + } + + + iOffset = iAdcData[0]; + iClbData_Ground = iAdcData[1]; + iClbData_Mutual = iAdcData[2 + iChannelNum]; + + +#if 0 + + + for (i = 0; i < iAllAdcDataNum/*iChannelNum*/; i++) { + if (i <= (iChannelNum + 1)) { + if (i == 0) + FTS_TEST_DBG("\n\n\nOffset %02d: %4d, \n", i, iAdcData[i]); + else if (i == 1) /*if(i <= iMaxTx)*/ + FTS_TEST_DBG("Ground %02d: %4d, \n", i, iAdcData[i]); + else if (i <= (iMaxTx + 1)) + FTS_TEST_DBG("Tx%02d: %4d, ", i-1, iAdcData[i]); + else if (i <= (iChannelNum + 1)) + FTS_TEST_DBG("Rx%02d: %4d, ", i - iMaxTx-1, iAdcData[i]); + + if (i % 10 == 0) + FTS_TEST_DBG("\n"); + + } else { + if (i == (iChannelNum + 2)) + FTS_TEST_DBG("\n\n\nMultual %02d: %4d, \n", i, iAdcData[i]); + else if (i <= (iMaxTx)+(iChannelNum + 2)) + FTS_TEST_DBG("Tx%02d: %4d, ", i - (iChannelNum + 2), iAdcData[i]); + else if (i < iAllAdcDataNum) + FTS_TEST_DBG("Rx%02d: %4d, ", i - iMaxTx - (iChannelNum + 2), iAdcData[i]); + + if (i % 10 == 0) + FTS_TEST_DBG("\n"); + + } + } + FTS_TEST_DBG("\r\n"); + +#endif + + + + fMShortResistance = fts_malloc(iChannelNum*sizeof(int)); + memset(fMShortResistance, 0, iChannelNum); + fGShortResistance = fts_malloc(iChannelNum*sizeof(int)); + memset(fGShortResistance, 0, iChannelNum); + + + iMin_CG = g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CG; + + iDoffset = iOffset - 1024; + iDrefn = iClbData_Ground; + + + FTS_TEST_DBG("Drefp: %5d \r\n", iDrefn); + + FTS_TEST_DBG("Doffset: %5d \r\n", iDoffset); + + FTS_TEST_DBG("Rshort(Ground): \n\n\n"); + + fKcal = 1; + FTS_TEST_DBG("Short Circuit (Channel and Ground):\r\n"); + + for (i = 0; i < iChannelNum; i++) { + iDsen = iAdcData[i+2]; + + FTS_TEST_DBG("%5d ", iDsen); + + if (i+1 == iMaxTx) { + + FTS_TEST_DBG("\n"); + } + + if ((2047+iDoffset) - iDsen <= 0) { + continue; + } + + if (i == iMaxTx) { + + FTS_TEST_DBG("\n"); + + } + + if (IcValue <= 0x05 || IcValue == 0xff) { + + fGShortResistance[i] = (iDsen - iDoffset + 410) * 25 * fKcal / (2047 + iDoffset - iDsen) - 3; + } else { + if (iDrefn - iDsen <= 0) { + fGShortResistance[i] = iMin_CG; + FTS_TEST_DBG("%02d ", fGShortResistance[i]); + + continue; + } + + fGShortResistance[i] = (((iDsen - iDoffset + 384) / (iDrefn - iDsen) * 57) - 1); + } + if (fGShortResistance[i] < 0) + fGShortResistance[i] = 0; + + FTS_TEST_DBG("%02d ", fGShortResistance[i]); + + if ((iMin_CG > fGShortResistance[i]) || (iDsen - iDoffset < 0)) { + iCount++; + if (i+1 <= iMaxTx) + FTS_TEST_DBG("Tx%02d: %02d (k¦¸), ", i+1, fGShortResistance[i]); + else + FTS_TEST_DBG("Rx%02d: %02d (k¦¸), ", i+1 - iMaxTx, fGShortResistance[i]); + if (iCount % 10 == 0) + FTS_TEST_DBG("\n"); + } + + } + FTS_TEST_DBG("\n"); + + + if (iCount > 0) { + + btmpresult = false; + } + + + iMin_CC = g_stCfg_FT5X46_BasicThreshold.WeakShortTest_CC; + + if ((IcValue == 0x06 || IcValue < 0xff) && iRsen != iCCRsen) { + iRsen = iCCRsen; + } + iDoffset = iOffset - 1024; + iDrefn = iClbData_Mutual; + fKcal = 1.0; + + FTS_TEST_DBG("\n\nShort Circuit (Channel and Channel):\n"); + iCount = 0; + + + FTS_TEST_DBG("Drefp: %5d \r\n", iDrefn); + FTS_TEST_DBG("Doffset: %5d \r\n", iDoffset); + FTS_TEST_DBG("Rshort(Channel):"); + iDCal = max(iDrefn, 116 + iDoffset); + + for (i = 0; i < iChannelNum; i++) { + iDsen = iAdcData[i+iChannelNum + 3]; + + FTS_TEST_DBG("%5d ", iDsen); + if (i+1 == iMaxTx) { + + FTS_TEST_DBG("\n"); + } + if (IcValue <= 0x05 || IcValue == 0xff) { + if (iDsen - iDrefn < 0) + continue; + } + + if (i == iMaxTx) { + + FTS_TEST_DBG("\n"); + } + + + if (IcValue <= 0x05 || IcValue == 0xff) { + iMa = iDsen - iDCal; + iMa = iMa ? iMa : 1; + fMShortResistance[i] = ((2047 + iDoffset - iDCal) * 24 / iMa - 27) * fKcal - 6; + } else { + if (iDrefn - iDsen <= 0) { + fMShortResistance[i] = iMin_CC; + FTS_TEST_DBG("%02d ", fMShortResistance[i]); + continue; + } + + fMShortResistance[i] = (iDsen - iDoffset - 123) * iRsen * fKcal / (iDrefn - iDsen /*temp*/) - 2; + } + + + FTS_TEST_DBG("%02d ", fMShortResistance[i]); + + if (fMShortResistance[i] < 0 && fMShortResistance[i] >= -240) + fMShortResistance[i] = 0; + else if (fMShortResistance[i] < -240) + continue; + + if (fMShortResistance[i] <= 0 || fMShortResistance[i] < iMin_CC) { + iCount++; + if (i+1 <= iMaxTx) + FTS_TEST_DBG("Tx%02d: %02d(k¦¸), ", i+1, fMShortResistance[i]); + else + FTS_TEST_DBG("Rx%02d: %02d(k¦¸), ", i+1 - iMaxTx, fMShortResistance[i]); + + if (iCount % 10 == 0) + FTS_TEST_DBG("\n"); + + } + + } + FTS_TEST_DBG("\n"); + + + if (iCount > 0 && !bCapShortTest) { + + btmpresult = false; + } + + + if (bCapShortTest && iCount) { + FTS_TEST_DBG(" bCapShortTest && iCount. need to add ......"); + } + + + if (m_bV3TP) { + ReCode = WriteReg(REG_MAPPING_SWITCH, strSwitch); + SysDelay(50); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to restore mapping type!\r\n "); + btmpresult = false; + } + ReCode = GetChannelNum(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n GetChannelNum error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + ReCode = GetRawData(); + } + +TEST_ERR: + + if (NULL != iAdcData) { + fts_free(iAdcData); + iAdcData = NULL; + } + + if (NULL != fMShortResistance) { + fts_free(fMShortResistance); + fMShortResistance = NULL; + } + + if (NULL != fGShortResistance) { + fts_free(fGShortResistance); + fGShortResistance = NULL; + } + + TestResultLen += sprintf(TestResult+TestResultLen, " Weak Short Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + if (btmpresult) { + FTS_TEST_INFO("\r\n\r\n//Weak Short Test is OK."); + *bTestResult = true; + } else { + FTS_TEST_INFO("\r\n\r\n//Weak Short Test is NG."); + *bTestResult = false; + } + + + return ReCode; +} + + +unsigned char FT5X46_TestItem_PanelDifferTest(bool *bTestResult) +{ + int index = 0; + int iRow = 0, iCol = 0; + int iValue = 0; + unsigned char ReCode = 0, strSwitch = -1; + bool btmpresult = true; + int iMax, iMin; + int maxValue = 0; + int minValue = 32767; + int AvgValue = 0; + int InvalidNum = 0; + int i = 0, j = 0; + + unsigned char OriginRawDataType = 0xff; + unsigned char OriginFrequecy = 0xff; + unsigned char OriginFirState = 0xff; + + + FTS_TEST_INFO("\r\n\r\n\r\n==============================Test Item: -------- Panel Differ Test \r\n\r\n"); + + ReCode = EnterFactory(); + SysDelay(20); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n\n// Failed to Enter factory Mode. Error Code: %d", ReCode); + goto TEST_ERR; + } + + + + if (m_bV3TP) { + ReCode = ReadReg(REG_MAPPING_SWITCH, &strSwitch); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Read REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + if (strSwitch != 0) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 0); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n Write REG_MAPPING_SWITCH error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + ReCode = GetChannelNum(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("\n GetChannelNum error. Error Code: %d", ReCode); + goto TEST_ERR; + } + + ReCode = GetRawData(); + } + } + + + FTS_TEST_DBG("\r\n=========Set Auto Equalization:\r\n"); + ReCode = ReadReg(REG_NORMALIZE_TYPE, &OriginRawDataType); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Read REG_NORMALIZE_TYPE error. Error Code: %d", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + if (OriginRawDataType != 0) { + ReCode = WriteReg(REG_NORMALIZE_TYPE, 0x00); + SysDelay(50); + if (ReCode != ERROR_CODE_OK) { + btmpresult = false; + FTS_TEST_ERROR("Write reg REG_NORMALIZE_TYPE Failed."); + goto TEST_ERR; + } + } + + + + FTS_TEST_DBG("=========Set Frequecy High"); + ReCode = ReadReg(0x0A, &OriginFrequecy); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Read reg 0x0A error. Error Code: %d", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + ReCode = WriteReg(0x0A, 0x81); + SysDelay(10); + if (ReCode != ERROR_CODE_OK) { + btmpresult = false; + FTS_TEST_ERROR("Write reg 0x0A Failed."); + goto TEST_ERR; + } + + FTS_TEST_DBG("=========FIR State: OFF"); + ReCode = ReadReg(0xFB, &OriginFirState); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Read reg 0xFB error. Error Code: %d", ReCode); + btmpresult = false; + goto TEST_ERR; + } + ReCode = WriteReg(0xFB, 0); + SysDelay(50); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Write reg 0xFB Failed."); + btmpresult = false; + goto TEST_ERR; + } + ReCode = GetRawData(); + + for (index = 0; index < 4; ++index) { + ReCode = GetRawData(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("GetRawData Failed."); + btmpresult = false; + goto TEST_ERR; + } + } + + + for (i = 0; i < g_ScreenSetParam.iTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iRxNum; j++) { + m_DifferData[i][j] = m_RawData[i][j]/10; + } + } + + + + +#if 1 + FTS_TEST_DBG("PannelDiffer :\n"); + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + FTS_TEST_DBG("\nRow%2d: ", iRow+1); + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + + + iValue = m_DifferData[iRow][iCol]; + FTS_TEST_DBG("%4d, ", iValue); + } + FTS_TEST_DBG("\n"); + } + FTS_TEST_DBG("\n"); +#endif + + + + + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + if (g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + + iValue = m_DifferData[iRow][iCol]; + iMin = g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[iRow][iCol]; + iMax = g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[iRow][iCol]; + + if (iValue < iMin || iValue > iMax) { + btmpresult = false; + FTS_TEST_ERROR("Out Of Range. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) \n", \ + iRow+1, iCol+1, iValue, iMin, iMax); + } + } + } + + + + + FTS_TEST_DBG("PannelDiffer ABS:\n"); + for (i = 0; i < g_ScreenSetParam.iTxNum; i++) { + + FTS_TEST_DBG("\n"); + for (j = 0; j < g_ScreenSetParam.iRxNum; j++) { + + FTS_TEST_DBG("%ld,", abs(m_DifferData[i][j])); + m_absDifferData[i][j] = abs(m_DifferData[i][j]); + + if (NODE_AST_TYPE == g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] || NODE_INVALID_TYPE == g_stCfg_MCap_DetailThreshold.InvalidNode[i][j]) { + InvalidNum++; + continue; + } + maxValue = max(maxValue, m_DifferData[i][j]); + minValue = min(minValue, m_DifferData[i][j]); + AvgValue += m_DifferData[i][j]; + } + } + FTS_TEST_DBG("\n"); + Save_Test_Data(m_absDifferData, 0, g_ScreenSetParam.iTxNum, g_ScreenSetParam.iRxNum, 1); + + + AvgValue = AvgValue/(g_ScreenSetParam.iTxNum*g_ScreenSetParam.iRxNum - InvalidNum); + FTS_TEST_DBG("PanelDiffer:Max: %d, Min: %d, Avg: %d ", maxValue, minValue, AvgValue); + + ReCode = WriteReg(REG_NORMALIZE_TYPE, OriginRawDataType); + ReCode = WriteReg(0x0A, OriginFrequecy); + ReCode = WriteReg(0xFB, OriginFirState); + + + if (m_bV3TP) { + ReCode = WriteReg(REG_MAPPING_SWITCH, strSwitch); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to restore mapping type!"); + btmpresult = false; + } + } + + TestResultLen += sprintf(TestResult+TestResultLen, " Panel Differ Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO(" //Panel Differ Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO(" //Panel Differ Test is NG!"); + } + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO(" //Panel Differ Test is NG!"); + TestResultLen += sprintf(TestResult+TestResultLen, " Panel Differ Test is NG. \n\n"); + return ReCode; +} + + + + +/************************************************************************ +* Name: GetPanelRows(Same function name as FT_MultipleTest) +* Brief: Get row of TP +* Input: none +* Output: pPanelRows +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetPanelRows(unsigned char *pPanelRows) +{ + return ReadReg(REG_TX_NUM, pPanelRows); +} + +/************************************************************************ +* Name: GetPanelCols(Same function name as FT_MultipleTest) +* Brief: get column of TP +* Input: none +* Output: pPanelCols +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetPanelCols(unsigned char *pPanelCols) +{ + return ReadReg(REG_RX_NUM, pPanelCols); +} +/************************************************************************ +* Name: StartScan(Same function name as FT_MultipleTest) +* Brief: Scan TP, do it before read Raw Data +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static int StartScan(void) +{ + unsigned char RegVal = 0; + unsigned char times = 0; + const unsigned char MaxTimes = 250; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RegVal); + FTS_TEST_ERROR("first read:RegVal = 0x%x\n", RegVal); + if (ReCode == ERROR_CODE_OK) { + RegVal |= 0x80; + ReCode = WriteReg(DEVIDE_MODE_ADDR, RegVal); + if (ReCode == ERROR_CODE_OK) { + while (times++ < MaxTimes) { + SysDelay(16); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RegVal); + FTS_TEST_ERROR("RegVal = 0x%x\n", RegVal); + if (ReCode == ERROR_CODE_OK) { + if ((RegVal>>7) == 0) + break; + } else { + FTS_TEST_ERROR("StartScan read DEVIDE_MODE_ADDR error."); + break; + } + } + if (times < MaxTimes) + ReCode = ERROR_CODE_OK; + else { + ReCode = ERROR_CODE_COMM_ERROR; + FTS_TEST_ERROR("times NOT < MaxTimes. error."); + } + } else + FTS_TEST_ERROR("StartScan write DEVIDE_MODE_ADDR error."); + } else + FTS_TEST_ERROR("StartScan read DEVIDE_MODE_ADDR error."); + return ReCode; + +} +/************************************************************************ +* Name: ReadRawData(Same function name as FT_MultipleTest) +* Brief: read Raw Data +* Input: Freq(No longer used, reserved), LineNum, ByteNum +* Output: pRevBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + unsigned char I2C_wBuffer[3]; + int i, iReadNum; + unsigned short BytesNumInTestMode1 = 0; + + + iReadNum = ByteNum/BYTES_PER_TIME; + + if (0 != (ByteNum%BYTES_PER_TIME)) + iReadNum++; + + if (ByteNum <= BYTES_PER_TIME) { + BytesNumInTestMode1 = ByteNum; + } else { + BytesNumInTestMode1 = BYTES_PER_TIME; + } + + ReCode = WriteReg(REG_LINE_NUM, LineNum); + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Failed to write REG_LINE_NUM! "); + goto READ_ERR; + } + + + I2C_wBuffer[0] = REG_RawBuf0; + if (ReCode == ERROR_CODE_OK) { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(I2C_wBuffer, 1, m_ucTempData, BytesNumInTestMode1); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("read rawdata Comm_Base_IIC_IO Failed!1 "); + goto READ_ERR; + } + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) + break; + + if (i == iReadNum-1) { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(NULL, 0, m_ucTempData+BYTES_PER_TIME*i, ByteNum-BYTES_PER_TIME*i); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("read rawdata Comm_Base_IIC_IO Failed!2 "); + goto READ_ERR; + } + } else { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(NULL, 0, m_ucTempData+BYTES_PER_TIME*i, BYTES_PER_TIME); + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("read rawdata Comm_Base_IIC_IO Failed!3 "); + goto READ_ERR; + } + } + + } + + if (ReCode == ERROR_CODE_OK) { + for (i = 0; i < (ByteNum>>1); i++) { + pRevBuffer[i] = (m_ucTempData[i<<1]<<8)+m_ucTempData[(i<<1)+1]; + + + + + } + } + +READ_ERR: + return ReCode; + +} +/************************************************************************ +* Name: GetTxSC_CB(Same function name as FT_MultipleTest) +* Brief: get CB of Tx SCap +* Input: index +* Output: pcbValue +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char GetTxSC_CB(unsigned char index, unsigned char *pcbValue) +{ + unsigned char ReCode = ERROR_CODE_OK; + unsigned char wBuffer[4]; + + if (index < 128) { + *pcbValue = 0; + WriteReg(REG_ScCbAddrR, index); + ReCode = ReadReg(REG_ScCbBuf0, pcbValue); + } else { + WriteReg(REG_ScCbAddrR, 0); + wBuffer[0] = REG_ScCbBuf0; + ReCode = Comm_Base_IIC_IO(wBuffer, 1, pcbValue, index-128); + + } + + return ReCode; +} + + + + +/************************************************************************ +* Name: Save_Test_Data +* Brief: Storage format of test data +* Input: int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount +* Output: none +* Return: none +***********************************************************************/ +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount) +{ + int iLen = 0; + int i = 0, j = 0; + + + iLen = sprintf(g_pTmpBuff, "NA, %d, %d, %d, %d, %d, ", \ + m_ucTestItemCode, Row, Col, m_iStartLine, ItemCount); + memcpy(g_pMsgAreaLine2+g_lenMsgAreaLine2, g_pTmpBuff, iLen); + g_lenMsgAreaLine2 += iLen; + + m_iStartLine += Row; + m_iTestDataCount++; + + + for (i = 0+iArrayIndex; (i < Row+iArrayIndex) && (i < TX_NUM_MAX); i++) { + for (j = 0; (j < Col) && (j < RX_NUM_MAX); j++) { + if (j == (Col - 1)) + iLen = sprintf(g_pTmpBuff, "%d, \n", iData[i][j]); + else + iLen = sprintf(g_pTmpBuff, "%d, ", iData[i][j]); + + memcpy(g_pStoreDataArea+g_lenStoreDataArea, g_pTmpBuff, iLen); + g_lenStoreDataArea += iLen; + } + } + +} + +/************************************************************************ +* Name: GetChannelNum +* Brief: Get Channel Num(Tx and Rx) +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetChannelNum(void) +{ + unsigned char ReCode; + unsigned char rBuffer[1]; + + + ReCode = GetPanelRows(rBuffer); + if (ReCode == ERROR_CODE_OK) { + g_ScreenSetParam.iTxNum = rBuffer[0]; + if (g_ScreenSetParam.iTxNum > g_ScreenSetParam.iUsedMaxTxNum) { + FTS_TEST_ERROR("Failed to get Tx number, Get num = %d, UsedMaxNum = %d", + g_ScreenSetParam.iTxNum, g_ScreenSetParam.iUsedMaxTxNum); + g_ScreenSetParam.iTxNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + } else { + FTS_TEST_ERROR("Failed to get Tx number"); + } + + + + ReCode = GetPanelCols(rBuffer); + if (ReCode == ERROR_CODE_OK) { + g_ScreenSetParam.iRxNum = rBuffer[0]; + if (g_ScreenSetParam.iRxNum > g_ScreenSetParam.iUsedMaxRxNum) { + FTS_TEST_ERROR("Failed to get Rx number, Get num = %d, UsedMaxNum = %d", + g_ScreenSetParam.iRxNum, g_ScreenSetParam.iUsedMaxRxNum); + g_ScreenSetParam.iRxNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + } else { + FTS_TEST_ERROR("Failed to get Rx number"); + } + + return ReCode; + +} +/************************************************************************ +* Name: GetRawData +* Brief: Get Raw Data of MCAP +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetRawData(void) +{ + unsigned char ReCode = ERROR_CODE_OK; + int iRow = 0; + int iCol = 0; + + + FTS_TEST_DBG("Start Scan ..."); + + ReCode = StartScan(); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Scan ..."); + return ReCode; + } + + FTS_TEST_DBG("Succee to Scan ..."); + + + memset(m_RawData, 0, sizeof(m_RawData)); + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + + ReCode = ReadRawData(1, 0xAA, (g_ScreenSetParam.iTxNum * g_ScreenSetParam.iRxNum)*2, m_iTempRawData); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to ReadRawData ..."); + return ReCode; + } + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + m_RawData[iRow][iCol] = m_iTempRawData[iRow*g_ScreenSetParam.iRxNum + iCol]; + } + } + return ReCode; +} +/************************************************************************ +* Name: ShowRawData +* Brief: Show RawData +* Input: none +* Output: none +* Return: none. +***********************************************************************/ +static void ShowRawData(void) +{ + int iRow, iCol; + + for (iRow = 0; iRow < g_ScreenSetParam.iTxNum; iRow++) { + FTS_TEST_DBG("Tx%2d: ", iRow+1); + for (iCol = 0; iCol < g_ScreenSetParam.iRxNum; iCol++) { + FTS_TEST_DBG("%5d ", m_RawData[iRow][iCol]); + } + FTS_TEST_DBG("\n "); + } +} + +/************************************************************************ +* Name: GetChannelNumNoMapping +* Brief: get Tx&Rx num from other Register +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetChannelNumNoMapping(void) +{ + unsigned char ReCode; + unsigned char rBuffer[1]; + + + FTS_TEST_DBG("Get Tx Num..."); + ReCode = ReadReg(REG_TX_NOMAPPING_NUM, rBuffer); + if (ReCode == ERROR_CODE_OK) { + g_ScreenSetParam.iTxNum = rBuffer[0]; + } else { + FTS_TEST_ERROR("Failed to get Tx number"); + } + + + FTS_TEST_DBG("Get Rx Num..."); + ReCode = ReadReg(REG_RX_NOMAPPING_NUM, rBuffer); + if (ReCode == ERROR_CODE_OK) { + g_ScreenSetParam.iRxNum = rBuffer[0]; + } else { + FTS_TEST_ERROR("Failed to get Rx number"); + } + + return ReCode; +} +/************************************************************************ +* Name: SwitchToNoMapping +* Brief: If it is V3 pattern, Get Tx/Rx Num again +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char SwitchToNoMapping(void) +{ + unsigned char chPattern = -1; + unsigned char ReCode = ERROR_CODE_OK; + unsigned char RegData = -1; + ReCode = ReadReg(REG_PATTERN_5422, &chPattern); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Switch To NoMapping Failed!"); + goto READ_ERR; + } + + if (1 == chPattern) { + RegData = -1; + ReCode = ReadReg(REG_MAPPING_SWITCH, &RegData); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("read REG_MAPPING_SWITCH Failed!"); + goto READ_ERR; + } + + if (1 != RegData) { + ReCode = WriteReg(REG_MAPPING_SWITCH, 1); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("write REG_MAPPING_SWITCH Failed!"); + goto READ_ERR; + } + focal_msleep(20); + ReCode = GetChannelNumNoMapping(); + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("GetChannelNumNoMapping Failed!"); + goto READ_ERR; + } + } + } + +READ_ERR: + return ReCode; +} +/************************************************************************ +* Name: GetTestCondition +* Brief: Check whether Rx or TX need to test, in Waterproof ON/OFF Mode. +* Input: none +* Output: none +* Return: true: need to test; false: Not tested. +***********************************************************************/ +static boolean GetTestCondition(int iTestType, unsigned char ucChannelValue) +{ + boolean bIsNeeded = false; + switch (iTestType) { + case WT_NeedProofOnTest: + bIsNeeded = !(ucChannelValue & 0x20); + break; + case WT_NeedProofOffTest: + bIsNeeded = !(ucChannelValue & 0x80); + break; + case WT_NeedTxOnVal: + bIsNeeded = !(ucChannelValue & 0x40) || !(ucChannelValue & 0x04); + break; + case WT_NeedRxOnVal: + bIsNeeded = !(ucChannelValue & 0x40) || (ucChannelValue & 0x04); + break; + case WT_NeedTxOffVal: + bIsNeeded = (0x00 == (ucChannelValue & 0x03)) || (0x02 == (ucChannelValue & 0x03)); + break; + case WT_NeedRxOffVal: + bIsNeeded = (0x01 == (ucChannelValue & 0x03)) || (0x02 == (ucChannelValue & 0x03)); + break; + default: + break; + } + return bIsNeeded; +} + + + +static unsigned char WeakShort_GetAdcData(int AllAdcDataLen, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + int iReadDataLen = AllAdcDataLen; + unsigned char *pDataSend = NULL; + + unsigned char Data = 0xff; + unsigned char tmp = 0xff; + int i = 0; + bool bAdcOK = false; + + FTS_TEST_FUNC_ENTER(); + + pDataSend = fts_malloc(iReadDataLen + 1); + if (pDataSend == NULL) + return ERROR_CODE_ALLOCATE_BUFFER_ERROR; + memset(pDataSend, 0, iReadDataLen + 1); + + ReCode = WriteReg(0x07, 0x01); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("WriteReg error. \n"); + return ReCode; + } + + SysDelay(100); + + for (i = 0; i < 100*5; i++) { + SysDelay(10); + ReCode = ReadReg(0x07, &Data); + FTS_TEST_ERROR("data = 0x%x\n", Data); + if (i == 30) { + ReadReg(0x02, &tmp); + FTS_TEST_ERROR("Reg 0x02 = 0x%x\n", tmp); + } + if (ReCode == ERROR_CODE_OK) { + if (Data == 0) { + bAdcOK = true; + break; + } + } + } + + if (!bAdcOK) { + FTS_TEST_ERROR("ADC data NOT ready. error.\n"); + ReCode = ERROR_CODE_COMM_ERROR; + goto EndGetAdc; + } + SysDelay(300); + pDataSend[0] = 0xF4; + + + ReCode = Comm_Base_IIC_IO(pDataSend, 1, pDataSend + 1, iReadDataLen); + if (ReCode == ERROR_CODE_OK) { + FTS_TEST_DBG("\n Adc Data:\n"); + for (i = 0; i < iReadDataLen/2; i++) { + pRevBuffer[i] = (pDataSend[1 + 2*i]<<8) + pDataSend[1 + 2*i + 1]; + FTS_TEST_DBG("%d, ", pRevBuffer[i]); + } + FTS_TEST_DBG("\n"); + } else { + FTS_TEST_ERROR("Comm_Base_IIC_IO error. error:%d. \n", ReCode); + } + +EndGetAdc: + if (pDataSend != NULL) { + fts_free(pDataSend); + pDataSend = NULL; + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} + + +#endif + diff --git a/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_supported_ic.c b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_supported_ic.c new file mode 100644 index 0000000000000..87bb43db60935 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/focaltech_test/supported_ic/focaltech_test_supported_ic.c @@ -0,0 +1,270 @@ +/************************************************************************ +* Copyright (C) 2012-2015, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.c +* +* Author: Software Development +* +* Created: 2016-08-01 +* +* Abstract: test item for FT8716 +* +************************************************************************/ + +/******************************************************************************* +* Included header files +*******************************************************************************/ + + +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + + + +#if (FT8607_TEST) +void OnInit_FT8607_TestItem(char *strIniFile); +void OnInit_FT8607_BasicThreshold(char *strIniFile); +void SetTestItem_FT8607(void); +boolean FT8607_StartTest(void); +int FT8607_get_test_data(char *pTestData); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8607_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8607_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8607; + g_stTestFuncs.Start_Test = FT8607_StartTest; + g_stTestFuncs.Get_test_data = FT8607_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FT8716_TEST) + +boolean FT8716_StartTest(void); +int FT8716_get_test_data(char *pTestData); + +void OnInit_FT8716_TestItem(char *strIniFile); +void OnInit_FT8716_BasicThreshold(char *strIniFile); +void SetTestItem_FT8716(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8716_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8716_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8716; + g_stTestFuncs.Start_Test = FT8716_StartTest; + g_stTestFuncs.Get_test_data = FT8716_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT5X46_TEST) + +boolean FT5X46_StartTest(void); +int FT5X46_get_test_data(char *pTestData); + +void OnInit_FT5X46_TestItem(char *strIniFile); +void OnInit_FT5X46_BasicThreshold(char *strIniFile); +void SetTestItem_FT5X46(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT5X46_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5X46_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT5X46; + g_stTestFuncs.Start_Test = FT5X46_StartTest; + g_stTestFuncs.Get_test_data = FT5X46_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT6X36_TEST) + +boolean FT6X36_StartTest(void); +int FT6X36_get_test_data(char *pTestData); + +void OnInit_FT6X36_TestItem(char *strIniFile); +void OnInit_FT6X36_BasicThreshold(char *strIniFile); +void SetTestItem_FT6X36(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT6X36_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT6X36_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT6X36; + g_stTestFuncs.Start_Test = FT6X36_StartTest; + g_stTestFuncs.Get_test_data = FT6X36_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT5822_TEST) + +boolean FT5822_StartTest(void); +int FT5822_get_test_data(char *pTestData); + +void OnInit_FT5822_TestItem(char *strIniFile); +void OnInit_FT5822_BasicThreshold(char *strIniFile); +void SetTestItem_FT5822(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT5822_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5822_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT5822; + g_stTestFuncs.Start_Test = FT5822_StartTest; + g_stTestFuncs.Get_test_data = FT5822_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT8006_TEST) + +boolean FT8006_StartTest(void); +int FT8006_get_test_data(char *pTestData); + +void OnInit_FT8006_TestItem(char *strIniFile); +void OnInit_FT8006_BasicThreshold(char *strIniFile); +void SetTestItem_FT8006(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8006_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8006_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8006; + g_stTestFuncs.Start_Test = FT8006_StartTest; + g_stTestFuncs.Get_test_data = FT8006_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FT8736_TEST) + +boolean FT8736_StartTest(void); +int FT8736_get_test_data(char *pTestData); + +void OnInit_FT8736_TestItem(char *strIniFile); +void OnInit_FT8736_BasicThreshold(char *strIniFile); +void SetTestItem_FT8736(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8736_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8736_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8736; + g_stTestFuncs.Start_Test = FT8736_StartTest; + g_stTestFuncs.Get_test_data = FT8736_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTE736_TEST) + +boolean FTE736_StartTest(void); +int FTE736_get_test_data(char *pTestData); + +void OnInit_FTE736_TestItem(char *strIniFile); +void OnInit_FTE736_BasicThreshold(char *strIniFile); +void SetTestItem_FTE736(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FTE736_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FTE736_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FTE736; + g_stTestFuncs.Start_Test = FTE736_StartTest; + g_stTestFuncs.Get_test_data = FTE736_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTE716_TEST) + +boolean FTE716_StartTest(void); +int FTE716_get_test_data(char *pTestData); + +void OnInit_FTE716_TestItem(char *strIniFile); +void OnInit_FTE716_BasicThreshold(char *strIniFile); +void SetTestItem_FTE716(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FTE716_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FTE716_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FTE716; + g_stTestFuncs.Start_Test = FTE716_StartTest; + g_stTestFuncs.Get_test_data = FTE716_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT8606_TEST) + +boolean FT8606_StartTest(void); +int FT8606_get_test_data(char *pTestData); + +void OnInit_FT8606_TestItem(char *strIniFile); +void OnInit_FT8606_BasicThreshold(char *strIniFile); +void SetTestItem_FT8606(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8606_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8606_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8606; + g_stTestFuncs.Start_Test = FT8606_StartTest; + g_stTestFuncs.Get_test_data = FT8606_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FT3C47_TEST) + +boolean FT3C47_StartTest(void); +int FT3C47_get_test_data(char *pTestData); + +void OnInit_FT3C47_TestItem(char *strIniFile); +void OnInit_FT3C47_BasicThreshold(char *strIniFile); +void SetTestItem_FT3C47(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT3C47_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT3C47_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT3C47; + g_stTestFuncs.Start_Test = FT3C47_StartTest; + g_stTestFuncs.Get_test_data = FT3C47_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#endif + + diff --git a/drivers/input/touchscreen/FT5346/ft5346.c b/drivers/input/touchscreen/FT5346/ft5346.c new file mode 100644 index 0000000000000..174a61760177f --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft5346.c @@ -0,0 +1,3296 @@ +/* + * + * FocalTech ft5x06 TouchScreen driver. + * + * Copyright (c) 2010 Focal tech Ltd. + * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if WT_ADD_CTP_INFO +#include +#endif + +#if WT_CTP_GESTURE_SUPPORT + +#define FTS_GESTRUE_POINTS 255 +#define FTS_GESTRUE_POINTS_HEADER 8 + +static void Ctp_Gesture_Fucntion_Proc_File(void); +static char gtp_gesture_value; +static char gtp_gesture_onoff = '0'; +unsigned short coordinate_x[150] = {0}; +unsigned short coordinate_y[150] = {0}; +#endif + +#if CTP_CHARGER_DETECT +#include +#endif + +#if defined(CONFIG_FB) +#include +#include + +#elif defined(CONFIG_HAS_EARLYSUSPEND) +#include +/* Early-suspend level */ +#define FT_SUSPEND_LEVEL 1 +#endif + + +#if WT_ADD_CTP_INFO +static u8 lockdown_info[FT_LOCKDOWN_SIZE]; + +static u8 nomal_boot; + +#endif +u8 tp_rgb_color; + +static u8 TP_Maker, LCD_Maker, Panel_Ink, Project_Id; +static char lcd_ic_name[10] = {0}; +extern char Lcm_name[HARDWARE_MAX_ITEM_LONGTH]; + +#define FT_MAX_SIZE 64 + +#define FT_DEBUG_DIR_NAME "ts_debug" + +#define TPD_MAX_POINTS_5 5 +#define TPD_MAX_POINTS_10 10 + +#define TPD_MAX_POINTS_2 2 +#define AUTO_CLB_NEED 1 +#define AUTO_CLB_NONEED 0 +struct Upgrade_Info fts_updateinfo_curr; +static struct Upgrade_Info fts_updateinfo[] = { + {0x55, "FT5x06", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x03, 1, 2000}, + {0x08, "FT5606", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x06, 100, 2000}, + {0x0a, "FT5x16", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x07, 1, 1500}, + {0x05, "FT6208", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 60, 30, 0x79, 0x05, 10, 2000}, + {0x06, "FT6x06", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 100, 30, 0x79, 0x08, 10, 2000}, + {0x36, "FT6x36", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 100, 30, 0x79, 0x18, 10, 2000}, + {0x55, "FT5x06i", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x03, 1, 2000}, + {0x14, "FT5336", TPD_MAX_POINTS_10, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x13, "FT3316", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x12, "FT5436i", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x11, "FT5336i", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x54, "FT5x46", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 2, 2, 0x54, 0x2c, 10, 1350}, +}; + +#define FT_STORE_TS_INFO(buf, id, name, max_tch, group_id, fw_vkey_support, \ + fw_name, fw_maj, fw_min, fw_sub_min) \ + snprintf(buf, FT_INFO_MAX_LEN, \ + "controller\t= focaltech\n" \ + "model\t\t= 0x%x\n" \ + "name\t\t= %s\n" \ + "max_touches\t= %d\n" \ + "drv_ver\t\t= 0x%x\n" \ + "group_id\t= 0x%x\n" \ + "fw_vkey_support\t= %s\n" \ + "fw_name\t\t= %s\n" \ + "fw_ver\t\t= %d.%d.%d\n", id, name, \ + max_tch, FT_DRIVER_VERSION, group_id, \ + fw_vkey_support, fw_name, fw_maj, fw_min, \ + fw_sub_min) + +#if CTP_PROC_INTERFACE +#define CTP_PARENT_PROC_NAME "touchscreen" +#define CTP_OPEN_PROC_NAME "ctp_openshort_test" +#define FTS_INI_FILE_NAME "ft5346_ds.ini" + +static DEFINE_MUTEX(fts_mutex); +struct i2c_client *fts_i2c_client = NULL; +EXPORT_SYMBOL(fts_i2c_client); +extern int fts_open_short_test(char *ini_file_name, char *bufdest, ssize_t *pinumread); + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); +static const struct file_operations ctp_open_procs_fops = { + .write = ctp_open_proc_write, + .read = ctp_open_proc_read, + .owner = THIS_MODULE, +}; +#endif + + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO +#define CTP_PARENT_PROC_NAME "touchscreen" +#define CTP_LOCKDOWN_INFOR_NAME "lockdown_info" + +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); +static const struct file_operations ctp_lockdown_procs_fops = { + .write = ctp_lockdown_proc_write, + .read = ctp_lockdown_proc_read, + .owner = THIS_MODULE, +}; +#endif + + +#if FTS_PROC_APK_DEBUG +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_RAWDATA 3 +#define PROC_AUTOCLB 4 + +#define PROC_NAME "ft5x0x-debug" +static unsigned char proc_operate_mode = PROC_RAWDATA; +static struct proc_dir_entry *ft5x0x_proc_entry; +#endif + +static u8 is_ic_update_crash; +static struct i2c_client *update_client; +static struct i2c_client *gesture_client; + +static struct proc_dir_entry *ctp_device_proc; + +#if CTP_CHARGER_DETECT +extern int power_supply_get_battery_charge_state(struct power_supply *psy); +static struct power_supply *batt_psy; +static u8 is_charger_plug; +static u8 pre_charger_status; + +#endif + +#if CTP_SYS_APK_UPDATE +static struct i2c_client *g_focalclient +#endif + +#if CTP_SYS_APK_UPDATE +static int focal_i2c_Read(unsigned char *writebuf, + int writelen, unsigned char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = g_focalclient->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = g_focalclient->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(g_focalclient->adapter, msgs, 2); + if (ret < 0) + dev_err(&g_focalclient->dev, "f%s: i2c read error.\n", + __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = g_focalclient->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(g_focalclient->adapter, msgs, 1); + if (ret < 0) + dev_err(&g_focalclient->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} +/*write data by i2c*/ +static int focal_i2c_Write(unsigned char *writebuf, int writelen) +{ + int ret; + + struct i2c_msg msg[] = { + { + .addr = g_focalclient->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(g_focalclient->adapter, msg, 1); + if (ret < 0) + dev_err(&g_focalclient->dev, "%s i2c write error.\n", __func__); + + return ret; +} +#endif + +static int ft5x06_i2c_read(struct i2c_client *client, char *writebuf, + int writelen, char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) + dev_err(&client->dev, "%s: i2c read error.\n", __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} + +static int ft5x06_i2c_write(struct i2c_client *client, char *writebuf, + int writelen) +{ + int ret; + + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s: i2c write error.\n", __func__); + + return ret; +} + +static int ft5x0x_write_reg(struct i2c_client *client, u8 addr, const u8 val) +{ + u8 buf[2] = {0}; + + buf[0] = addr; + buf[1] = val; + + return ft5x06_i2c_write(client, buf, sizeof(buf)); +} + +static int ft5x0x_read_reg(struct i2c_client *client, u8 addr, u8 *val) +{ + return ft5x06_i2c_read(client, &addr, 1, val, 1); +} + +static void ft5x06_update_fw_vendor_id(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + u8 reg_addr; + int err; + + reg_addr = FT_REG_FW_VENDOR_ID; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_vendor_id, 1); + if (err < 0) + dev_err(&client->dev, "fw vendor id read failed"); + + dev_err(&client->dev, "WT: fw vendor id = %d ", data->fw_vendor_id); +} + +static void ft5x06_update_fw_ver(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + u8 reg_addr; + int err; + + reg_addr = FT_REG_FW_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[0], 1); + if (err < 0) + dev_err(&client->dev, "fw major version read failed"); + + reg_addr = FT_REG_FW_MIN_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[1], 1); + if (err < 0) + dev_err(&client->dev, "fw minor version read failed"); + + reg_addr = FT_REG_FW_SUB_MIN_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[2], 1); + if (err < 0) + dev_err(&client->dev, "fw sub minor version read failed"); + + dev_info(&client->dev, "Firmware version = %d.%d.%d\n", + data->fw_ver[0], data->fw_ver[1], data->fw_ver[2]); +} + +#if WT_CTP_GESTURE_SUPPORT +static void check_gesture(int gesture_id, struct input_dev *ip_dev) +{ + + switch (gesture_id) { + case 0x24: + gtp_gesture_value = 'K'; + input_report_key(ip_dev, KEYCODE_WAKEUP, 1); + input_sync(ip_dev); + input_report_key(ip_dev, KEYCODE_WAKEUP, 0); + input_sync(ip_dev); + break; + default: + break; + } +} +static int fts_read_Gestruedata(struct input_dev *ip_dev) +{ + unsigned char buf[FTS_GESTRUE_POINTS * 3] = { 0 }; + int ret = -1; + int i = 0; + int gestrue_id = 0; + short pointnum = 0; + buf[0] = 0xd3; + + pointnum = 0; + ret = ft5x06_i2c_read(gesture_client, buf, 1, buf, FTS_GESTRUE_POINTS_HEADER); + if (ret < 0) { + CTP_ERROR("%s read touchdata failed.\n", __func__); + return ret; + } + CTP_ERROR("tpd %d read buf data.\n", buf[0]); + if (0x24 == buf[0]) { + gestrue_id = 0x24; + check_gesture(gestrue_id, ip_dev); + CTP_ERROR("tpd %d check_gesture gestrue_id.\n", gestrue_id); + return -EPERM; + } + + /* FW */ + + { + gestrue_id = buf[0]; + pointnum = (short)(buf[1]) & 0xff; + buf[0] = 0xd3; + + if ((pointnum * 4 + 8) < 255) { + ret = ft5x06_i2c_read(gesture_client, buf, 1, buf, (pointnum * 4 + 8)); + } else { + ret = ft5x06_i2c_read(gesture_client, buf, 1, buf, 255); + ret = ft5x06_i2c_read(gesture_client, buf, 0, buf+255, (pointnum * 4 + 8) - 255); + } + if (ret < 0) { + CTP_ERROR("%s read touchdata failed.\n", __func__); + return ret; + } + +printk("wdb: gestrue_id = %d \n", gestrue_id); + + + check_gesture(gestrue_id, ip_dev); + for (i = 0; i < pointnum; i++) { + coordinate_x[i] = (((s16) buf[0 + (4 * i)]) & 0x0F) << + 8 | (((s16) buf[1 + (4 * i)]) & 0xFF); + coordinate_y[i] = (((s16) buf[2 + (4 * i)]) & 0x0F) << + 8 | (((s16) buf[3 + (4 * i)]) & 0xFF); + } + return -EPERM; + } + + return -EPERM; +} +#endif + + +static irqreturn_t ft5x06_ts_interrupt(int irq, void *dev_id) +{ + struct ft5x06_ts_data *data = dev_id; + struct input_dev *ip_dev; + int rc, i, ret; + u32 id, x, y, status, num_touches; + u8 reg = 0x00, *buf, state; + bool update_input = false; + + if (!data) { + CTP_ERROR("%s: Invalid data\n", __func__); + return IRQ_HANDLED; + } + +#if CTP_CHARGER_DETECT + if (!batt_psy) { + + batt_psy = power_supply_get_by_name("usb"); + } else{ + + + + if (is_charger_plug != pre_charger_status) { + pre_charger_status = is_charger_plug; + ft5x0x_write_reg(update_client, 0x8B, is_charger_plug); + + } + } + +#endif + + ip_dev = data->input_dev; + buf = data->tch_data; + + rc = ft5x06_i2c_read(data->client, ®, 1, + buf, data->tch_data_len); + if (rc < 0) { + dev_err(&data->client->dev, "%s: read data fail\n", __func__); + return IRQ_HANDLED; + } + +#if WT_CTP_GESTURE_SUPPORT + if (gtp_gesture_onoff == '1') { + ret = ft5x0x_read_reg(gesture_client, 0xd0, &state); + CTP_DEBUG("in event gesture:%d\n", state); + if (ret < 0) { + CTP_ERROR("read value fail"); + } + if (state == 1) { + fts_read_Gestruedata(ip_dev); + return IRQ_HANDLED; + } + } +#endif + + for (i = 0; i < data->pdata->num_max_touches; i++) { + id = (buf[FT_TOUCH_ID_POS + FT_ONE_TCH_LEN * i]) >> 4; + if (id >= FT_MAX_ID) + break; + + update_input = true; + + x = (buf[FT_TOUCH_X_H_POS + FT_ONE_TCH_LEN * i] & 0x0F) << 8 | + (buf[FT_TOUCH_X_L_POS + FT_ONE_TCH_LEN * i]); + y = (buf[FT_TOUCH_Y_H_POS + FT_ONE_TCH_LEN * i] & 0x0F) << 8 | + (buf[FT_TOUCH_Y_L_POS + FT_ONE_TCH_LEN * i]); + + status = buf[FT_TOUCH_EVENT_POS + FT_ONE_TCH_LEN * i] >> 6; + + num_touches = buf[FT_TD_STATUS] & FT_STATUS_NUM_TP_MASK; + + /* invalid combination */ + if (!num_touches && !status && !id) + break; + + input_mt_slot(ip_dev, id); + if (status == FT_TOUCH_DOWN || status == FT_TOUCH_CONTACT) { + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 1); + input_report_abs(ip_dev, ABS_MT_POSITION_X, x); + input_report_abs(ip_dev, ABS_MT_POSITION_Y, y); + } else { + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 0); + } + } + + if (update_input) { + input_mt_report_pointer_emulation(ip_dev, false); + input_sync(ip_dev); + } + + if (num_touches == 0) { + for (i = 0; i < data->pdata->num_max_touches; i++) { + input_mt_slot(ip_dev, i); + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 0); + } + input_mt_report_pointer_emulation(ip_dev, false); + input_sync(ip_dev); + } + + return IRQ_HANDLED; +} + +static int ft5x06_power_on(struct ft5x06_ts_data *data, bool on) +{ + int rc; + + if (!on) + goto power_off; + + rc = regulator_enable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd enable failed rc=%d\n", rc); + return rc; + } + + rc = regulator_enable(data->vcc_i2c); + if (rc) { + dev_err(&data->client->dev, + "Regulator vcc_i2c enable failed rc=%d\n", rc); + regulator_disable(data->vdd); + } + + return rc; + +power_off: + rc = regulator_disable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd disable failed rc=%d\n", rc); + return rc; + } + + rc = regulator_disable(data->vcc_i2c); + if (rc) { + dev_err(&data->client->dev, + "Regulator vcc_i2c disable failed rc=%d\n", rc); + rc = regulator_enable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd enable failed rc=%d\n", rc); + } + } + + return rc; +} + +static int ft5x06_power_init(struct ft5x06_ts_data *data, bool on) +{ + int rc; + + if (!on) + goto pwr_deinit; + + data->vdd = regulator_get(&data->client->dev, "vdd"); + if (IS_ERR(data->vdd)) { + rc = PTR_ERR(data->vdd); + dev_err(&data->client->dev, + "Regulator get failed vdd rc=%d\n", rc); + return rc; + } + + if (regulator_count_voltages(data->vdd) > 0) { + rc = regulator_set_voltage(data->vdd, FT_VTG_MIN_UV, + FT_VTG_MAX_UV); + if (rc) { + dev_err(&data->client->dev, + "Regulator set_vtg failed vdd rc=%d\n", rc); + goto reg_vdd_put; + } + } + + data->vcc_i2c = regulator_get(&data->client->dev, "vcc_i2c"); + if (IS_ERR(data->vcc_i2c)) { + rc = PTR_ERR(data->vcc_i2c); + dev_err(&data->client->dev, + "Regulator get failed vcc_i2c rc=%d\n", rc); + goto reg_vdd_set_vtg; + } + + if (regulator_count_voltages(data->vcc_i2c) > 0) { + rc = regulator_set_voltage(data->vcc_i2c, FT_I2C_VTG_MIN_UV, + FT_I2C_VTG_MAX_UV); + if (rc) { + dev_err(&data->client->dev, + "Regulator set_vtg failed vcc_i2c rc=%d\n", rc); + goto reg_vcc_i2c_put; + } + } + + return 0; + +reg_vcc_i2c_put: + regulator_put(data->vcc_i2c); +reg_vdd_set_vtg: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FT_VTG_MAX_UV); +reg_vdd_put: + regulator_put(data->vdd); + return rc; + +pwr_deinit: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FT_VTG_MAX_UV); + + regulator_put(data->vdd); + + if (regulator_count_voltages(data->vcc_i2c) > 0) + regulator_set_voltage(data->vcc_i2c, 0, FT_I2C_VTG_MAX_UV); + + regulator_put(data->vcc_i2c); + return 0; +} + +static int ft5x06_ts_pinctrl_init(struct ft5x06_ts_data *ft5x06_data) +{ + int retval; + + /* Get pinctrl if target uses pinctrl */ + ft5x06_data->ts_pinctrl = devm_pinctrl_get(&(ft5x06_data->client->dev)); + if (IS_ERR_OR_NULL(ft5x06_data->ts_pinctrl)) { + dev_dbg(&ft5x06_data->client->dev, + "Target does not use pinctrl\n"); + retval = PTR_ERR(ft5x06_data->ts_pinctrl); + ft5x06_data->ts_pinctrl = NULL; + return retval; + } + + ft5x06_data->gpio_state_active + = pinctrl_lookup_state(ft5x06_data->ts_pinctrl, + "pmx_ts_active"); + if (IS_ERR_OR_NULL(ft5x06_data->gpio_state_active)) { + dev_dbg(&ft5x06_data->client->dev, + "Can not get ts default pinstate\n"); + retval = PTR_ERR(ft5x06_data->gpio_state_active); + ft5x06_data->ts_pinctrl = NULL; + return retval; + } + + ft5x06_data->gpio_state_suspend + = pinctrl_lookup_state(ft5x06_data->ts_pinctrl, + "pmx_ts_suspend"); + if (IS_ERR_OR_NULL(ft5x06_data->gpio_state_suspend)) { + dev_err(&ft5x06_data->client->dev, + "Can not get ts sleep pinstate\n"); + retval = PTR_ERR(ft5x06_data->gpio_state_suspend); + ft5x06_data->ts_pinctrl = NULL; + return retval; + } + return 0; +} + + +static void ft5x06_ts_pinctrl_free(struct ft5x06_ts_data *ft5x06_data) +{ + /* Put pinctrl if target uses pinctrl */ + if (!IS_ERR_OR_NULL(ft5x06_data->ts_pinctrl)) { + devm_pinctrl_put(ft5x06_data->ts_pinctrl); + ft5x06_data->ts_pinctrl = NULL; + } +} + +static int ft5x06_ts_pinctrl_select(struct ft5x06_ts_data *ft5x06_data, + bool on) +{ + struct pinctrl_state *pins_state; + int ret; + + pins_state = on ? ft5x06_data->gpio_state_active + : ft5x06_data->gpio_state_suspend; + if (!IS_ERR_OR_NULL(pins_state)) { + ret = pinctrl_select_state(ft5x06_data->ts_pinctrl, pins_state); + if (ret) { + dev_err(&ft5x06_data->client->dev, + "can not set %s pins\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + return ret; + } + } else { + dev_err(&ft5x06_data->client->dev, + "not a valid '%s' pinstate\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + } + + return 0; +} + + +#ifdef CONFIG_PM +static int ft5x06_ts_suspend(struct device *dev) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + char txbuf[2], i; + int err; + + if (data->loading_fw) { + dev_info(dev, "Firmware loading in process...\n"); + return 0; + } + + if (data->suspended) { + dev_info(dev, "Already in suspend state\n"); + return 0; + } + +#if WT_CTP_GESTURE_SUPPORT + if (gtp_gesture_onoff == '1') { + ft5x0x_write_reg(gesture_client, 0xd0, 0x01); + + { + ft5x0x_write_reg(gesture_client, 0xd1, 0xff); + ft5x0x_write_reg(gesture_client, 0xd2, 0xff); + ft5x0x_write_reg(gesture_client, 0xd5, 0xff); + ft5x0x_write_reg(gesture_client, 0xd6, 0xff); + ft5x0x_write_reg(gesture_client, 0xd7, 0xff); + ft5x0x_write_reg(gesture_client, 0xd8, 0xff); + } + enable_irq_wake(data->client->irq); + CTP_DEBUG("in suspend gesture\n"); + return 0; + } +#endif + + disable_irq(data->client->irq); + + /* release all touches */ + for (i = 0; i < data->pdata->num_max_touches; i++) { + input_mt_slot(data->input_dev, i); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, 0); + } + input_mt_report_pointer_emulation(data->input_dev, false); + input_sync(data->input_dev); + + if (gpio_is_valid(data->pdata->reset_gpio)) { + txbuf[0] = FT_REG_PMODE; + txbuf[1] = FT_PMODE_HIBERNATE; + err = ft5x06_i2c_write(data->client, txbuf, sizeof(txbuf)); + + msleep(data->pdata->hard_rst_dly); + } + + + if (data->pdata->power_on) { + err = data->pdata->power_on(false); + if (err) { + dev_err(dev, "power off failed"); + goto pwr_off_fail; + } + } else { + err = ft5x06_power_on(data, false); + if (err) { + dev_err(dev, "power off failed"); + goto pwr_off_fail; + } + } + + data->suspended = true; + + return 0; + + +pwr_off_fail: + if (gpio_is_valid(data->pdata->reset_gpio)) { + gpio_set_value_cansleep(data->pdata->reset_gpio, 0); + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + enable_irq(data->client->irq); + return err; + +} + +static int ft5x06_ts_resume(struct device *dev) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + int err; + if (!data->suspended) { + dev_dbg(dev, "Already in awake state\n"); + + } +#if WT_CTP_GESTURE_SUPPORT + printk("Resume Gesture TP.\n"); + if (gtp_gesture_onoff == '1') { + ft5x0x_write_reg(gesture_client, 0xD0, 0x00); + CTP_DEBUG("Resume Gesture TP Done.\n"); + } +#endif + + if (data->pdata->power_on) { + err = data->pdata->power_on(true); + if (err) { + dev_err(dev, "power on failed"); + return err; + } + } else { + err = ft5x06_power_on(data, true); + if (err) { + dev_err(dev, "power on failed"); + return err; + } + } + + if (gpio_is_valid(data->pdata->reset_gpio)) { + gpio_set_value_cansleep(data->pdata->reset_gpio, 0); + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + + msleep(data->pdata->soft_rst_dly); + + enable_irq(data->client->irq); + +#if CTP_CHARGER_DETECT + batt_psy = power_supply_get_by_name("usb"); + if (!batt_psy) + CTP_ERROR("tp resume battery supply not found\n"); + else{ + + + CTP_DEBUG("is_charger_plug %d, prev %d", is_charger_plug, pre_charger_status); + if (is_charger_plug) { + ft5x0x_write_reg(update_client, 0x8B, 1); + } else{ + ft5x0x_write_reg(update_client, 0x8B, 0); + } + } + pre_charger_status = is_charger_plug; +#endif + + + data->suspended = false; + + return 0; +} + +static const struct dev_pm_ops ft5x06_ts_pm_ops = { +#if (!defined(CONFIG_FB) && !defined(CONFIG_HAS_EARLYSUSPEND)) + .suspend = ft5x06_ts_suspend, + .resume = ft5x06_ts_resume, +#endif +}; + +#else +static int ft5x06_ts_suspend(struct device *dev) +{ + return 0; +} + +static int ft5x06_ts_resume(struct device *dev) +{ + return 0; +} + +#endif + +#if defined(CONFIG_FB) + +static void fb_notify_resume_work(struct work_struct *work) +{ + struct ft5x06_ts_data *ft5x06_data = + container_of(work, struct ft5x06_ts_data, fb_notify_work); + ft5x06_ts_resume(&ft5x06_data->client->dev); +} +static int fb_notifier_callback(struct notifier_block *self, + unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct ft5x06_ts_data *ft5x06_data = + container_of(self, struct ft5x06_ts_data, fb_notif); + + if (evdata && evdata->data && event == FB_EVENT_BLANK && + ft5x06_data && ft5x06_data->client) { + blank = evdata->data; + if (*blank == FB_BLANK_UNBLANK) + schedule_work(&ft5x06_data->fb_notify_work); + else if (*blank == FB_BLANK_POWERDOWN) { + flush_work(&ft5x06_data->fb_notify_work); + ft5x06_ts_suspend(&ft5x06_data->client->dev); + } + } + + return 0; +} +#elif defined(CONFIG_HAS_EARLYSUSPEND) +static void ft5x06_ts_early_suspend(struct early_suspend *handler) +{ + struct ft5x06_ts_data *data = container_of(handler, + struct ft5x06_ts_data, + early_suspend); + + ft5x06_ts_suspend(&data->client->dev); +} + +static void ft5x06_ts_late_resume(struct early_suspend *handler) +{ + struct ft5x06_ts_data *data = container_of(handler, + struct ft5x06_ts_data, + early_suspend); + + ft5x06_ts_resume(&data->client->dev); +} +#endif + + +int hid_to_i2c(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[5] = {0}; + int bRet = 0; +#ifdef HIDTOI2C_DISABLE + + return 2; + +#endif + auc_i2c_write_buf[0] = 0xeb; + auc_i2c_write_buf[1] = 0xaa; + auc_i2c_write_buf[2] = 0x09; + ft5x06_i2c_write(client, auc_i2c_write_buf, 3); + msleep(10); + auc_i2c_write_buf[0] = auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = 0; + ft5x06_i2c_read(client, auc_i2c_write_buf, 0, auc_i2c_write_buf, 3); + CTP_DEBUG("auc_i2c_write_buf[0]:%x, auc_i2c_write_buf[1]:%x, auc_i2c_write_buf[2]:%x\n", auc_i2c_write_buf[0], auc_i2c_write_buf[1], auc_i2c_write_buf[2]); + if (0xeb == auc_i2c_write_buf[0] && 0xaa == auc_i2c_write_buf[1] && 0x08 == auc_i2c_write_buf[2]) { + bRet = 1; + } else + bRet = 0; + return bRet; +} + +static int ft5x06_fw_upgrade_start(struct i2c_client *client, + const u8 *data, u32 data_len) { + struct ft5x06_ts_data *ts_data = i2c_get_clientdata(client); + struct fw_upgrade_info info = ts_data->pdata->info; + + u8 reg_addr; + u8 chip_id = 0x00; + u8 w_buf[FT_MAX_WR_BUF] = {0}, r_buf[FT_MAX_RD_BUF] = {0}; + u8 pkt_buf[FT_FW_PKT_LEN + FT_FW_PKT_META_LEN]; + int i, j, temp; + u32 pkt_num, pkt_len; + + + u8 fw_ecc; + int i_ret; + + + +#if 1 + reg_addr = FT_REG_ID; + temp = ft5x06_i2c_read(client, ®_addr, 1, &chip_id, 1); + CTP_DEBUG("Update:Read ic info:%x\n", chip_id); + if (temp < 0) { + dev_err(&client->dev, "version read failed"); + } + + if (is_ic_update_crash) { + chip_id = CTP_IC_TYPE_2; + } + + for (i = 0; i < sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info); i++) { + if (chip_id == fts_updateinfo[i].CHIP_ID) { + info.auto_cal = fts_updateinfo[i].AUTO_CLB; + info.delay_55 = fts_updateinfo[i].delay_55; + info.delay_aa = fts_updateinfo[i].delay_aa; + info.delay_erase_flash = fts_updateinfo[i].delay_earse_flash; + info.delay_readid = fts_updateinfo[i].delay_readid; + info.upgrade_id_1 = fts_updateinfo[i].upgrade_id_1; + info.upgrade_id_2 = fts_updateinfo[i].upgrade_id_2; + + break; + } + } + + ts_data->family_id = chip_id; + + if (i >= sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info)) { + info.auto_cal = fts_updateinfo[11].AUTO_CLB; + info.delay_55 = fts_updateinfo[11].delay_55; + info.delay_aa = fts_updateinfo[11].delay_aa; + info.delay_erase_flash = fts_updateinfo[11].delay_earse_flash; + info.delay_readid = fts_updateinfo[11].delay_readid; + info.upgrade_id_1 = fts_updateinfo[11].upgrade_id_1; + info.upgrade_id_2 = fts_updateinfo[11].upgrade_id_2; + } +#endif + + dev_err(&client->dev, "id1 = 0x%x id2 = 0x%x family_id=0x%x,data_len = %d\n", + info.upgrade_id_1, info.upgrade_id_2, ts_data->family_id, data_len); + /* determine firmware size */ + i_ret = hid_to_i2c(client); + + if (i_ret == 0) { + CTP_DEBUG("[FTS] hid change to i2c fail ! \n"); + } + + for (i = 0, j = 0; i < FT_UPGRADE_LOOP; i++) { + msleep(FT_EARSE_DLY_MS); + ft5x0x_write_reg(client, 0xfc, FT_UPGRADE_AA); + msleep(info.delay_aa); + + + ft5x0x_write_reg(client, 0xfc, FT_UPGRADE_55); + msleep(200); + i_ret = hid_to_i2c(client); + if (i_ret == 0) { + CTP_DEBUG("[FTS] hid change to i2c fail ! \n"); + + } + + msleep(10); + /* Enter upgrade mode */ + w_buf[0] = FT_UPGRADE_55; + ft5x06_i2c_write(client, &w_buf[0], 1); + usleep(FT_55_AA_DLY_NS); + w_buf[0] = FT_UPGRADE_AA; + ft5x06_i2c_write(client, &w_buf[0], 1); + if (i_ret < 0) { + CTP_DEBUG("[FTS] failed writing 0x55 and 0xaa ! \n"); + continue; + } + + + /* check READ_ID */ + msleep(info.delay_readid); + w_buf[0] = FT_READ_ID_REG; + w_buf[1] = 0x00; + w_buf[2] = 0x00; + w_buf[3] = 0x00; + + ft5x06_i2c_read(client, w_buf, 4, r_buf, 2); + + + CTP_DEBUG("r_buf[0] :%X,r_buf[1]: %X\n", r_buf[0], r_buf[1]); + if (r_buf[0] != info.upgrade_id_1 + || r_buf[1] != info.upgrade_id_2) { + dev_err(&client->dev, "Upgrade ID mismatch(%d), IC=0x%x 0x%x, info=0x%x 0x%x\n", + i, r_buf[0], r_buf[1], + info.upgrade_id_1, info.upgrade_id_2); + } else + break; + } + CTP_DEBUG("Begin to update \n\n"); + if (i >= FT_UPGRADE_LOOP) { + dev_err(&client->dev, "Abort upgrade\n"); + return -EIO; + } + + /* erase app and panel paramenter area */ + CTP_DEBUG("Step 4:erase app and panel paramenter area\n"); + w_buf[0] = FT_ERASE_APP_REG; + ft5x06_i2c_write(client, w_buf, 1); + msleep(1350); + + for (i = 0; i < 15; i++) { + w_buf[0] = 0x6a; + r_buf[0] = r_buf[1] = 0x00; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 2); + + if (0xF0 == r_buf[0] && 0xAA == r_buf[1]) { + break; + } + msleep(50); + + } + + w_buf[0] = 0xB0; + w_buf[1] = (u8) ((data_len >> 16) & 0xFF); + w_buf[2] = (u8) ((data_len >> 8) & 0xFF); + w_buf[3] = (u8) (data_len & 0xFF); + + ft5x06_i2c_write(client, w_buf, 4); + + /* program firmware */ + CTP_DEBUG("Step 5:program firmware\n"); + pkt_num = (data_len) / FT_FW_PKT_LEN; + pkt_buf[0] = FT_FW_START_REG; + pkt_buf[1] = 0x00; + fw_ecc = 0; + temp = 0; + + for (j = 0; j < pkt_num; j++) { + temp = j * FT_FW_PKT_LEN; + pkt_buf[2] = (u8) (temp >> 8); + pkt_buf[3] = (u8) temp; + pkt_len = FT_FW_PKT_LEN; + pkt_buf[4] = (u8) (pkt_len >> 8); + pkt_buf[5] = (u8) pkt_len; + + for (i = 0; i < FT_FW_PKT_LEN; i++) { + pkt_buf[6 + i] = data[j * FT_FW_PKT_LEN + i]; + fw_ecc ^= pkt_buf[6 + i]; + } + + ft5x06_i2c_write(client, pkt_buf, FT_FW_PKT_LEN + 6); + + for (i = 0; i < 30; i++) { + w_buf[0] = 0x6a; + r_buf[0] = r_buf[1] = 0x00; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 2); + + if ((j + 0x1000) == (((r_buf[0]) << 8) | r_buf[1])) { + break; + } + msleep(1); + } + } + + /* send remaining bytes */ + CTP_DEBUG("Step 6:send remaining bytes\n"); + if ((data_len) % FT_FW_PKT_LEN > 0) { + temp = pkt_num * FT_FW_PKT_LEN; + pkt_buf[2] = (u8) (temp >> 8); + pkt_buf[3] = (u8) temp; + temp = (data_len) % FT_FW_PKT_LEN; + pkt_buf[4] = (u8) (temp >> 8); + pkt_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + pkt_buf[6 + i] = data[pkt_num * FT_FW_PKT_LEN + i]; + fw_ecc ^= pkt_buf[6 + i]; + } + + ft5x06_i2c_write(client, pkt_buf, temp + 6); + + for (i = 0; i < 30; i++) { + w_buf[0] = 0x6a; + r_buf[0] = r_buf[1] = 0x00; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 2); + + if ((j + 0x1000) == (((r_buf[0]) << 8) | r_buf[1])) { + break; + } + msleep(1); + } + } + + msleep(50); + + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + CTP_DEBUG("Step 7: read out checksum\n"); + w_buf[0] = 0x64; + ft5x06_i2c_write(client, w_buf, 1); + msleep(300); + + temp = 0; + w_buf[0] = 0x65; + w_buf[1] = (u8)(temp >> 16); + w_buf[2] = (u8)(temp >> 8); + w_buf[3] = (u8)(temp); + temp = data_len; + w_buf[4] = (u8)(temp >> 8); + w_buf[5] = (u8)(temp); + i_ret = ft5x06_i2c_write(client, w_buf, 6); + msleep(data_len/256); + + for (i = 0; i < 100; i++) { + w_buf[0] = 0x6a; + r_buf[0] = r_buf[1] = 0x00; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 2); + + if (0xF0 == r_buf[0] && 0x55 == r_buf[1]) { + break; + } + msleep(1); + + } + w_buf[0] = 0x66; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 1); + if (r_buf[0] != fw_ecc) { + dev_err(&client->dev, "[FTS]--ecc error! FW=%02x bt_ecc=%02x\n", + r_buf[0], + fw_ecc); + + return -EIO; + } + + /* reset */ + CTP_DEBUG("Step 8: reset \n"); + w_buf[0] = FT_REG_RESET_FW; + ft5x06_i2c_write(client, w_buf, 1); + msleep(ts_data->pdata->soft_rst_dly); + + CTP_DEBUG("Firmware upgrade successful\n"); + + return 0; +} + +static void fts_get_upgrade_array(struct i2c_client *client) +{ + + u8 chip_id; + u32 i; + int ret = 0; + + ret = ft5x0x_read_reg(client, FT_REG_ID, &chip_id); + if (ret < 0) { + CTP_ERROR("[Focal][Touch] read value fail"); + } + + for (i = 0; i < sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info); i++) { + if (chip_id == fts_updateinfo[i].CHIP_ID) { + memcpy(&fts_updateinfo_curr, &fts_updateinfo[i], sizeof(struct Upgrade_Info)); + break; + } + } + + CTP_DEBUG("fts_updateinfo:%d\n", i); + if (i >= sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info)) { + memcpy(&fts_updateinfo_curr, &fts_updateinfo[11], sizeof(struct Upgrade_Info)); + } +} + +static void fts_ctpm_read_lockdown(struct i2c_client *client, struct ft5x06_ts_data *data) +{ + u8 buf[128]; + u8 w_buf[4], r_buf[2]; + u32 i = 0, j = 0; + u32 k = 0; + int i_ret; + struct ft5x06_ts_data *ts_data = i2c_get_clientdata(client); + + fts_get_upgrade_array(client); + CTP_DEBUG("id1 = 0x%x id2 = 0x%x\n", fts_updateinfo_curr.upgrade_id_1, fts_updateinfo_curr.upgrade_id_2); + i_ret = hid_to_i2c(client); + if (i_ret == 0) { + CTP_DEBUG("[FTS] hid change to i2c fail ! \n"); + } + + for (i = 0, j = 0; i < FT_UPGRADE_LOOP; i++) { + + + + CTP_DEBUG("[FTS]Step 1:Reset CTPM \n"); + ft5x0x_write_reg(client, 0xfc, 0xaa); + msleep(fts_updateinfo_curr.delay_aa); + ft5x0x_write_reg(client, 0xfc, 0x55); + msleep(100); + + i_ret = hid_to_i2c(client); + if (i_ret == 0) { + CTP_DEBUG("[FTS] hid change to i2c fail ! \n"); + } + msleep(2); + + /* Enter upgrade mode */ + CTP_DEBUG("[FTS]Step 2:Enter upgrade mode \n"); + w_buf[0] = FT_UPGRADE_55; + ft5x06_i2c_write(client, &w_buf[0], 1); + msleep(5); + w_buf[0] = FT_UPGRADE_AA; + ft5x06_i2c_write(client, &w_buf[0], 1); + + /* check READ_ID */ + msleep(fts_updateinfo_curr.delay_readid); + w_buf[0] = FT_READ_ID_REG; + w_buf[1] = 0x00; + w_buf[2] = 0x00; + w_buf[3] = 0x00; + ft5x06_i2c_read(client, w_buf, 4, r_buf, 2); + + CTP_DEBUG("r_buf[0] :%X,r_buf[1]: %X\n", r_buf[0], r_buf[1]); + if (r_buf[0] != fts_updateinfo_curr.upgrade_id_1 + || r_buf[1] != fts_updateinfo_curr.upgrade_id_2) { + dev_err(&client->dev, "Upgrade ID mismatch(%d), IC=0x%x 0x%x, info=0x%x 0x%x\n", + i, r_buf[0], r_buf[1], + fts_updateinfo_curr.upgrade_id_1, fts_updateinfo_curr.upgrade_id_2); + } else + break; + } + + /*--------- read current project setting ---------- */ + buf[0] = 0x03; + buf[1] = 0x00; + for (i = 0; i < FT_UPGRADE_LOOP; i++) { + buf[2] = 0xd7; + buf[3] = 0xa0; + + i_ret = ft5x06_i2c_write(client, buf, 4); + if (i_ret < 0) { + CTP_DEBUG("[FTS] Step 4: read lcm id from flash error when i2c write, i_ret = %d\n", i_ret); + continue; + } + + msleep(2); + + i_ret = ft5x06_i2c_read(client, buf, 0, data->lockdown_info, 8); + if (i_ret < 0) { + CTP_DEBUG("[FTS] Step 4: read lcm id from flash error when i2c write, i_ret = %d\n", i_ret); + continue; + } else { + CTP_DEBUG("[FTS] Step 4: read lcm id from flash success \n"); + break; + } + } + msleep(20); + + if (gpio_is_valid(ts_data->pdata->reset_gpio)) { + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); + msleep(ts_data->pdata->hard_rst_dly); + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 1); + } + msleep(80); + + for (k = 0 ; k < FT_LOCKDOWN_SIZE; k++) { + lockdown_info[k] = data->lockdown_info[k]; + } + + + tp_rgb_color = lockdown_info[2]; + TP_Maker = lockdown_info[0]; + LCD_Maker = lockdown_info[1]; + Panel_Ink = lockdown_info[2]; + Project_Id = lockdown_info[4]; + dev_info(&client->dev, "Lockdown info: %02X %02X %02X %02X %02X %02X %02X %02X", + lockdown_info[0], lockdown_info[1], + lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], + lockdown_info[6], lockdown_info[7]); + + dev_info(&client->dev, "WT: TP_Maker = 0x%x\n", TP_Maker); + dev_info(&client->dev, "WT: LCD_Maker = 0x%x\n", LCD_Maker); + dev_info(&client->dev, "WT: Panel_Ink = 0x%x\n", Panel_Ink); + dev_info(&client->dev, "WT: Project_Id = 0x%x\n", Project_Id); + +} + +#if TPD_AUTO_UPGRADE + +static unsigned char CTPM_FW1[] = { +#include "ft_app_ic_oufei_tianma.txt" +}; +static unsigned char CTPM_FW2[] = { +#include "ft_app_ic_ds_ebbg.txt" +}; +static unsigned char CTPM_FW3[] = { +#include "ft_app_ic_ds_ebbg_ili.txt" +}; +static unsigned char CTPM_FW4[] = { +#include "ft_app_ic_oufei_ebbg.txt" +}; + +static unsigned char CTPM_FW5[] = { +#include "ft_app_ic_oufei_ebbg_ili.txt" +}; +static unsigned char CTPM_FW6[] = { +#include "ft_app_ic_oufei_ebbg_nt.txt" +}; +static unsigned char CTPM_FW7[] = { +#include "ft_app_ic_lens_tianma.txt" +}; + +static int fts_ctpm_fw_upgrade_with_i_file(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + int flag_TPID = 0; + u8 *pbt_buf = 0x0; + int rc = 0, fw_len = 0; + u8 uc_host_fm_ver, uc_tp_fm_ver, vendor_id, ic_type; + u8 reg_addr; + + reg_addr = 0xA6; + ft5x06_i2c_read(client, ®_addr, 1, &uc_tp_fm_ver, 1); + reg_addr = 0xA8; + ft5x06_i2c_read(client, ®_addr, 1, &vendor_id, 1); + reg_addr = 0xA3; + ft5x06_i2c_read(client, ®_addr, 1, &ic_type, 1); + + CTP_INFO("Vendor ID:0x%02X, TP FW:0x%02X, IC TYPE:%d", vendor_id, uc_tp_fm_ver, ic_type); + if (vendor_id == 0xA8 || vendor_id == 0x00 || ic_type == 0xA3 || ic_type == 0x00) { + CTP_ERROR("vend_id read error,need project"); + + fts_ctpm_read_lockdown(client, data); + is_ic_update_crash = 1; + flag_TPID = 1; + } + + snprintf(lcd_ic_name, strchr(Lcm_name, '_')-Lcm_name + 1, Lcm_name); + + if (TP_Maker == TP_OUFEI && LCD_Maker == TP_TIANMA) { + pbt_buf = CTPM_FW1; + fw_len = sizeof(CTPM_FW1); + CTP_DEBUG("OUFEI+TIANMA"); + } else if (TP_Maker == TP_DS && LCD_Maker == TP_EBBG) { + + if (!strcmp(lcd_ic_name , "ili9881c")) { + pbt_buf = CTPM_FW3; + fw_len = sizeof(CTPM_FW3); + CTP_DEBUG("TP_DS+TP_EBBG+ili"); + } + + else { + pbt_buf = CTPM_FW2; + fw_len = sizeof(CTPM_FW2); + CTP_DEBUG("TP_DS+TP_EBBG"); + } + } else if (TP_Maker == TP_OUFEI && LCD_Maker == TP_EBBG && Project_Id == PROJECT_C3B) { + pbt_buf = CTPM_FW4; + fw_len = sizeof(CTPM_FW4); + CTP_DEBUG("TP_OUFEI+TP_EBBG"); + } else if (TP_Maker == TP_LENS && LCD_Maker == TP_TIANMA && Project_Id == PROJECT_C3B) { + pbt_buf = CTPM_FW7; + fw_len = sizeof(CTPM_FW7); + CTP_INFO("TP_LENS+TP_TIANMA ft_app_ic_lens_tianma.txt"); + } + + else if (TP_Maker == TP_OUFEI && LCD_Maker == TP_EBBG && Project_Id == PROJECT_C3N) { + if (!strcmp(lcd_ic_name , "ili9881c")) { + pbt_buf = CTPM_FW5; + fw_len = sizeof(CTPM_FW5); + CTP_DEBUG("TP_OUFEI+TP_EBBG_ili9881c"); + } else { + pbt_buf = CTPM_FW6; + fw_len = sizeof(CTPM_FW6); + CTP_DEBUG("TP_OUFEI+TP_EBBG_nt35521"); + } + } + + else { + CTP_ERROR("read vendor_id fail"); + return -EPERM; + } + + CTP_DEBUG("update firmware size:%d", fw_len); + if ((sizeof(CTPM_FW1) < 8) || (sizeof(CTPM_FW1) > FT_MAX_SIZE*1024) || (sizeof(CTPM_FW2) < 8) || (sizeof(CTPM_FW2) > FT_MAX_SIZE*1024)) { + CTP_ERROR("FW length error\n"); + return -EPERM; + } + + if ((pbt_buf[fw_len - 8] ^ pbt_buf[fw_len - 6]) == 0xFF + && (pbt_buf[fw_len - 7] ^ pbt_buf[fw_len - 5]) == 0xFF + && (pbt_buf[fw_len - 3] ^ pbt_buf[fw_len - 4]) == 0xFF) { + uc_host_fm_ver = pbt_buf[fw_len - 2]; + CTP_DEBUG("[FTS] uc_tp_fm_ver = %d.\n", uc_tp_fm_ver); + CTP_DEBUG("[FTS] uc_host_fm_ver = %d.\n", uc_host_fm_ver); + + if ((uc_tp_fm_ver < uc_host_fm_ver) || (is_ic_update_crash == 1)) { + rc = ft5x06_fw_upgrade_start(update_client, pbt_buf, fw_len); + if (rc != 0) { + CTP_DEBUG("[FTS] upgrade failed rc = %d.\n", rc); + } else { + CTP_DEBUG("[FTS] upgrade successfully.\n"); + } + } + } + + return rc; +} +#endif + +#if CTP_SYS_APK_UPDATE +static ssize_t ft5x06_fw_name_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u8 fw_version = 0x00; + + ft5x0x_read_reg(update_client, FT5x0x_REG_FW_VER, &fw_version); + + return sprintf(buf, "firmware version %02X\n", fw_version); +} + +static ssize_t ft5x06_fw_name_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + + if (size > FT_FW_NAME_MAX_LEN - 1) + return -EINVAL; + + strlcpy(data->fw_name, buf, size); + if (data->fw_name[size-1] == '\n') + data->fw_name[size-1] = 0; + + return size; +} + +static DEVICE_ATTR(fw_name, 0664, ft5x06_fw_name_show, ft5x06_fw_name_store); + +static int ft5x06_auto_cal(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + u8 temp = 0, i; + + /* set to factory mode */ + msleep(2 * data->pdata->soft_rst_dly); + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_FACTORYMODE_VALUE); + msleep(data->pdata->soft_rst_dly); + + /* start calibration */ + ft5x0x_write_reg(client, FT_DEV_MODE_REG_CAL, FT_CAL_START); + msleep(2 * data->pdata->soft_rst_dly); + for (i = 0; i < FT_CAL_RETRY; i++) { + ft5x0x_read_reg(client, FT_REG_CAL, &temp); + /*return to normal mode, calibration finish */ + if (((temp & FT_CAL_MASK) >> FT_4BIT_SHIFT) == FT_CAL_FIN) + break; + } + + /*calibration OK */ + msleep(2 * data->pdata->soft_rst_dly); + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_FACTORYMODE_VALUE); + msleep(data->pdata->soft_rst_dly); + + /* store calibration data */ + ft5x0x_write_reg(client, FT_DEV_MODE_REG_CAL, FT_CAL_STORE); + msleep(2 * data->pdata->soft_rst_dly); + + /* set to normal mode */ + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_WORKMODE_VALUE); + msleep(2 * data->pdata->soft_rst_dly); + + return 0; +} + + +static int ft5x06_fw_upgrade(struct device *dev, bool force) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + const struct firmware *fw = NULL; + int rc; + u8 fw_file_maj, fw_file_min, fw_file_sub_min, fw_file_vendor_id; + bool fw_upgrade = false; + + if (data->suspended) { + dev_err(dev, "Device is in suspend state: Exit FW upgrade\n"); + return -EBUSY; + } + + rc = request_firmware(&fw, data->fw_name, dev); + if (rc < 0) { + dev_err(dev, "Request firmware failed - %s (%d)\n", + data->fw_name, rc); + return rc; + } + + if (fw->size < FT_FW_MIN_SIZE || fw->size > FT_FW_MAX_SIZE) { + dev_err(dev, "Invalid firmware size (%zu)\n", fw->size); + rc = -EIO; + goto rel_fw; + } + + if (data->family_id == FT6X36_ID) { + fw_file_maj = FT_FW_FILE_MAJ_VER_FT6X36(fw); + fw_file_vendor_id = FT_FW_FILE_VENDOR_ID_FT6X36(fw); + } else { + fw_file_maj = FT_FW_FILE_MAJ_VER(fw); + fw_file_vendor_id = FT_FW_FILE_VENDOR_ID(fw); + } + fw_file_min = FT_FW_FILE_MIN_VER(fw); + fw_file_sub_min = FT_FW_FILE_SUB_MIN_VER(fw); + + dev_info(dev, "Current firmware: %d.%d.%d", data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); + dev_info(dev, "New firmware: %d.%d.%d", fw_file_maj, + fw_file_min, fw_file_sub_min); + + if (force) + fw_upgrade = true; + else if ((data->fw_ver[0] < fw_file_maj) && + data->fw_vendor_id == fw_file_vendor_id) + fw_upgrade = true; + + if (!fw_upgrade) { + dev_info(dev, "Exiting fw upgrade...\n"); + rc = -EFAULT; + goto rel_fw; + } + + /* start firmware upgrade */ + if (FT_FW_CHECK(fw, data)) { + rc = ft5x06_fw_upgrade_start(data->client, fw->data, fw->size); + if (rc < 0) + dev_err(dev, "update failed (%d). try later...\n", rc); + else if (data->pdata->info.auto_cal) + ft5x06_auto_cal(data->client); + } else { + dev_err(dev, "FW format error\n"); + rc = -EIO; + } + + ft5x06_update_fw_ver(data); + + FT_STORE_TS_INFO(data->ts_info, data->family_id, data->pdata->name, + data->pdata->num_max_touches, data->pdata->group_id, + data->pdata->fw_vkey_support ? "yes" : "no", + data->pdata->fw_name, data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); +rel_fw: + release_firmware(fw); + return rc; +} + + +static ssize_t ft5x06_update_fw_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + return snprintf(buf, 2, "%d\n", data->loading_fw); +} + +static ssize_t ft5x06_update_fw_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + unsigned long val; + int rc; + + if (size > 2) + return -EINVAL; + + rc = kstrtoul(buf, 10, &val); + if (rc != 0) + return rc; + + if (data->suspended) { + dev_info(dev, "In suspend state, try again later...\n"); + return size; + } + + mutex_lock(&data->input_dev->mutex); + if (!data->loading_fw && val) { + data->loading_fw = true; + ft5x06_fw_upgrade(dev, false); + data->loading_fw = false; + } + mutex_unlock(&data->input_dev->mutex); + + return size; +} + +static DEVICE_ATTR(update_fw, 0664, ft5x06_update_fw_show, + ft5x06_update_fw_store); + +static ssize_t ft5x06_force_update_fw_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + unsigned long val; + int rc; + + if (size > 2) + return -EINVAL; + + rc = kstrtoul(buf, 10, &val); + if (rc != 0) + return rc; + + mutex_lock(&data->input_dev->mutex); + if (!data->loading_fw && val) { + data->loading_fw = true; + ft5x06_fw_upgrade(dev, true); + data->loading_fw = false; + } + mutex_unlock(&data->input_dev->mutex); + + return size; +} + +static DEVICE_ATTR(force_update_fw, 0664, ft5x06_update_fw_show, + ft5x06_force_update_fw_store); + + +#define FT_DEBUG_DIR_NAME "ts_debug" + +static bool ft5x06_debug_addr_is_valid(int addr) +{ + if (addr < 0 || addr > 0xFF) { + pr_err("FT reg address is invalid: 0x%x\n", addr); + return false; + } + + return true; +} + +static int ft5x06_debug_data_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) + dev_info(&data->client->dev, + "Writing into FT registers not supported\n"); + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +static int ft5x06_debug_data_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + int rc; + u8 reg; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) { + rc = ft5x0x_read_reg(data->client, data->addr, ®); + if (rc < 0) + dev_err(&data->client->dev, + "FT read register 0x%x failed (%d)\n", + data->addr, rc); + else + *val = reg; + } + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_data_fops, ft5x06_debug_data_get, + ft5x06_debug_data_set, "0x%02llX\n"); + +static int ft5x06_debug_addr_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + if (ft5x06_debug_addr_is_valid(val)) { + mutex_lock(&data->input_dev->mutex); + data->addr = val; + mutex_unlock(&data->input_dev->mutex); + } + + return 0; +} + +static int ft5x06_debug_addr_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) + *val = data->addr; + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_addr_fops, ft5x06_debug_addr_get, + ft5x06_debug_addr_set, "0x%02llX\n"); + +static int ft5x06_debug_suspend_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (val) + ft5x06_ts_suspend(&data->client->dev); + else + ft5x06_ts_resume(&data->client->dev); + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +static int ft5x06_debug_suspend_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + *val = data->suspended; + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_suspend_fops, ft5x06_debug_suspend_get, + ft5x06_debug_suspend_set, "%lld\n"); + +static int ft5x06_debug_dump_info(struct seq_file *m, void *v) +{ + struct ft5x06_ts_data *data = m->private; + + seq_printf(m, "%s\n", data->ts_info); + + return 0; +} + +static int debugfs_dump_info_open(struct inode *inode, struct file *file) +{ + return single_open(file, ft5x06_debug_dump_info, inode->i_private); +} + +static const struct file_operations debug_dump_info_fops = { + .owner = THIS_MODULE, + .open = debugfs_dump_info_open, + .read = seq_read, + .release = single_release, +}; + +#endif + +static int ft5x0x_GetFirmwareSize(char *firmware_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[128]; + memset(filepath, 0, sizeof(filepath)); + + sprintf(filepath, "%s", firmware_name); + CTP_ERROR("filepath=%s\n", filepath); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + CTP_ERROR("error occured while opening file %s.\n", filepath); + return -EPERM; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +static int ft5x0x_ReadFirmware(char *firmware_name, unsigned char *firmware_buf) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s", firmware_name); + CTP_INFO("filepath=%s\n", filepath); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + CTP_ERROR("error occured while opening file %s.\n", filepath); + return -EPERM; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + + vfs_read(pfile, firmware_buf, fsize, &pos); + + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +static void delay_qt_ms(unsigned long w_ms) +{ + unsigned long i; + unsigned long j; + + for (i = 0; i < w_ms; i++) { + for (j = 0; j < 1000; j++) { + udelay(1); + } + } +} + +static int fts_ctpm_auto_clb(void) +{ + unsigned char uc_temp; + unsigned char i ; + + printk("[FTS] start auto CLB.\n"); + msleep(200); + ft5x0x_write_reg(update_client, 0, 0x40); + delay_qt_ms(100); + ft5x0x_write_reg(update_client, 2, 0x4); + delay_qt_ms(300); + for (i = 0; i < 100; i++) { + ft5x0x_read_reg(update_client, 0, &uc_temp); + if (((uc_temp&0x70)>>4) == 0x0) { + break; + } + delay_qt_ms(200); + printk("[FTS] waiting calibration %d\n", i); + } + + printk("[FTS] calibration OK.\n"); + + msleep(300); + ft5x0x_write_reg(update_client, 0, 0x40); + delay_qt_ms(100); + ft5x0x_write_reg(update_client, 2, 0x5); + delay_qt_ms(300); + ft5x0x_write_reg(update_client, 0, 0x0); + msleep(300); + printk("[FTS] store CLB result OK.\n"); + return 0; +} + + +static int fts_ctpm_fw_upgrade_with_app_file(char *firmware_name) +{ + unsigned char *pbt_buf = NULL; + int i_ret; + u8 fwver; + int fwsize = ft5x0x_GetFirmwareSize(firmware_name); + + CTP_DEBUG("enter fw_upgrade_with_app_file"); + if (fwsize <= 0) { + CTP_ERROR("%s ERROR:Get firmware size failed\n", __FUNCTION__); + return -EPERM; + } + + pbt_buf = (unsigned char *) kmalloc(fwsize+1, GFP_ATOMIC); + if (ft5x0x_ReadFirmware(firmware_name, pbt_buf)) { + CTP_ERROR("%s() - ERROR: request_firmware failed\n", __FUNCTION__); + kfree(pbt_buf); + return -EPERM; + } + + + + if ((pbt_buf[fwsize - 8] ^ pbt_buf[fwsize - 6]) != 0xFF + || (pbt_buf[fwsize - 7] ^ pbt_buf[fwsize - 5]) != 0xFF + || (pbt_buf[fwsize - 3] ^ pbt_buf[fwsize - 4]) != 0xFF) { + CTP_ERROR("the update file is not correct, please check\n"); + CTP_ERROR("checksum is %2x, %2x, %2x, %2x, %2x, %2x", pbt_buf[fwsize - 8], pbt_buf[fwsize - 6], pbt_buf[fwsize - 7], pbt_buf[fwsize - 5], pbt_buf[fwsize - 3], pbt_buf[fwsize - 4]); + return -EPERM; + } + /*call the upgrade function*/ + i_ret = ft5x06_fw_upgrade_start(update_client, pbt_buf, fwsize); + if (i_ret != 0) { + CTP_ERROR("%s() - ERROR:[FTS] upgrade failed i_ret = %d.\n", __FUNCTION__, i_ret); + + + } else { + CTP_INFO("[FTS] upgrade successfully.\n"); + if (ft5x0x_read_reg(update_client, FT5x0x_REG_FW_VER, &fwver) >= 0) + CTP_INFO("the new fw ver is 0x%02x\n", fwver); + + } + kfree(pbt_buf); + return i_ret; +} + +#if CTP_SYS_APK_UPDATE + +static ssize_t ft5x0x_fwupgradeapp_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} +#endif + +#if CTP_SYS_APK_UPDATE + +static ssize_t ft5x0x_fwupgradeapp_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + + + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + char fwname[128]; + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + + disable_irq(client->irq); + + fts_ctpm_fw_upgrade_with_app_file(fwname); + + enable_irq(client->irq); + + return count; +} + +#endif + +#if CTP_SYS_APK_UPDATE + +static DEVICE_ATTR(ftsfwupgradeapp, S_IRUGO|S_IWUSR, ft5x0x_fwupgradeapp_show, ft5x0x_fwupgradeapp_store); +#endif + + +#ifdef CONFIG_OF +static int ft5x06_get_dt_coords(struct device *dev, char *name, + struct ft5x06_ts_platform_data *pdata) +{ + u32 coords[FT_COORDS_ARR_SIZE]; + struct property *prop; + struct device_node *np = dev->of_node; + int coords_size, rc; + + prop = of_find_property(np, name, NULL); + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + coords_size = prop->length / sizeof(u32); + if (coords_size != FT_COORDS_ARR_SIZE) { + dev_err(dev, "invalid %s\n", name); + return -EINVAL; + } + + rc = of_property_read_u32_array(np, name, coords, coords_size); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read %s\n", name); + return rc; + } + + if (!strcmp(name, "ftech,panel-coords")) { + pdata->panel_minx = coords[0]; + pdata->panel_miny = coords[1]; + pdata->panel_maxx = coords[2]; + pdata->panel_maxy = coords[3]; + } else if (!strcmp(name, "ftech,display-coords")) { + pdata->x_min = coords[0]; + pdata->y_min = coords[1]; + pdata->x_max = coords[2]; + pdata->y_max = coords[3]; + } else { + dev_err(dev, "unsupported property %s\n", name); + return -EINVAL; + } + + return 0; +} + +static int ft5x06_parse_dt(struct device *dev, + struct ft5x06_ts_platform_data *pdata) +{ + int rc; + struct device_node *np = dev->of_node; + struct property *prop; + u32 temp_val, num_buttons; + u32 button_map[MAX_BUTTONS]; + + pdata->name = "ftech"; + rc = of_property_read_string(np, "ftech,name", &pdata->name); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read name\n"); + return rc; + } + + rc = ft5x06_get_dt_coords(dev, "ftech,panel-coords", pdata); + if (rc && (rc != -EINVAL)) + return rc; + + rc = ft5x06_get_dt_coords(dev, "ftech,display-coords", pdata); + if (rc) + return rc; + + pdata->i2c_pull_up = of_property_read_bool(np, + "ftech,i2c-pull-up"); + + pdata->no_force_update = of_property_read_bool(np, + "ftech,no-force-update"); + + /* reset, irq gpio info */ + pdata->reset_gpio = of_get_named_gpio_flags(np, "ftech,reset-gpio", + 0, &pdata->reset_gpio_flags); + if (pdata->reset_gpio < 0) + return pdata->reset_gpio; + + pdata->irq_gpio = of_get_named_gpio_flags(np, "ftech,irq-gpio", + 0, &pdata->irq_gpio_flags); + if (pdata->irq_gpio < 0) + return pdata->irq_gpio; + + pdata->fw_name = "ft_fw.bin"; + rc = of_property_read_string(np, "ftech,fw-name", &pdata->fw_name); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw name\n"); + return rc; + } + + rc = of_property_read_u32(np, "ftech,group-id", &temp_val); + if (!rc) + pdata->group_id = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,hard-reset-delay-ms", + &temp_val); + if (!rc) + pdata->hard_rst_dly = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,soft-reset-delay-ms", + &temp_val); + if (!rc) + pdata->soft_rst_dly = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,num-max-touches", &temp_val); + if (!rc) + pdata->num_max_touches = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,fw-delay-aa-ms", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay aa\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_aa = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-55-ms", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay 55\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_55 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-upgrade-id1", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw upgrade id1\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.upgrade_id_1 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-upgrade-id2", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw upgrade id2\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.upgrade_id_2 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-readid-ms", + &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay read id\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_readid = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-era-flsh-ms", + &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay erase flash\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_erase_flash = temp_val; + + pdata->info.auto_cal = of_property_read_bool(np, + "ftech,fw-auto-cal"); + + pdata->fw_vkey_support = of_property_read_bool(np, + "ftech,fw-vkey-support"); + + pdata->ignore_id_check = of_property_read_bool(np, + "ftech,ignore-id-check"); + + rc = of_property_read_u32(np, "ftech,family-id", &temp_val); + if (!rc) + pdata->family_id = temp_val; + else + return rc; + + prop = of_find_property(np, "ftech,button-map", NULL); + if (prop) { + num_buttons = prop->length / sizeof(temp_val); + if (num_buttons > MAX_BUTTONS) + return -EINVAL; + + rc = of_property_read_u32_array(np, + "ftech,button-map", button_map, + num_buttons); + if (rc) { + dev_err(dev, "Unable to read key codes\n"); + return rc; + } + } + + return 0; +} +#else +static int ft5x06_parse_dt(struct device *dev, + struct ft5x06_ts_platform_data *pdata) { + return -ENODEV; +} +#endif + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + + if (*ppos) { + CTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + return sprintf(ptr, "%02X%02X%02X%02X%02X%02X%02X%02X\n", + lockdown_info[0], lockdown_info[1], lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], lockdown_info[6], lockdown_info[7]); + +} + +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static void create_ctp_lockdown_proc(void) +{ + struct proc_dir_entry *ctp_lockdown_proc = NULL; + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + CTP_ERROR("ft5x06: create parent_proc fail\n"); + return; + } + } + ctp_lockdown_proc = proc_create(CTP_LOCKDOWN_INFOR_NAME, 0666, ctp_device_proc, &ctp_lockdown_procs_fops); + if (ctp_lockdown_proc == NULL) { + CTP_ERROR("ft5x06: create ctp_lockdown_proc fail\n"); + } +} + +#endif + +#if WT_ADD_CTP_INFO +static int hardwareinfo_set(struct ft5x06_ts_data *data, u8 value_name, u8 color) +{ + char firmware_ver[HARDWARE_MAX_ITEM_LONGTH]; + char vendor_for_id[HARDWARE_MAX_ITEM_LONGTH]; + char ic_name[HARDWARE_MAX_ITEM_LONGTH]; + char ic_color[HARDWARE_MAX_ITEM_LONGTH]; + int err; + u8 uc_tp_fm_ver, reg_addr; + + if (lockdown_info[0] == VENDOR_O_FILM) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "o-film"); + else if (lockdown_info[0] == TP_LENS) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "LENS"); + else if (lockdown_info[0] == VENDOR_DS) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "DS"); + else if (data->fw_vendor_id == VENDOR_O_FILM) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "o-film"); + else if (data->fw_vendor_id == VENDOR_Lens) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "LENS"); + else if (data->fw_vendor_id == VENDOR_DS) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "DS"); + else + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "Other vendor"); + + switch (value_name) { + case TP_IC_FT5X06: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5X06"); + break; + case TP_IC_FT5606: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5606"); + break; + case TP_IC_FT5X16: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5X16"); + break; + case TP_IC_FT6208: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6208"); + break; + case TP_IC_FT6X06: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6X06"); + break; + case TP_IC_FT6X36: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6X36"); + break; + case TP_IC_FT5336: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5336"); + break; + case TP_IC_FT3316: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT3316"); + break; + case TP_IC_FT5436i: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5436i"); + break; + case TP_IC_FT5336i: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5336i"); + break; + case TP_IC_FT5346: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5435"); + break; + default: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "Other IC"); + } + + + switch (color) { + case TP_White: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "White"); + break; + case TP_Black: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "Black"); + break; + case TP_Golden: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "Golden"); + break; + default: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "other Color"); + } + + if (nomal_boot) { + reg_addr = 0xA6; + ft5x06_i2c_read(data->client, ®_addr, 1, &uc_tp_fm_ver, 1); + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x, %s", vendor_for_id, ic_name, uc_tp_fm_ver, ic_color); + } else + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x, %s", vendor_for_id, ic_name, data->fw_ver[0], ic_color); + + err = hardwareinfo_set_prop(HARDWARE_TP, firmware_ver); + dev_err(&data->client->dev, "Set hardwareinfo is: %s\n", firmware_ver); + if (err < 0) + return -EPERM; + + return 0; +} +#endif + +#if CTP_PROC_INTERFACE +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + u8 result = 0; + int nret = -1; + char cfgname[128]; + struct i2c_client *client = fts_i2c_client; + ssize_t num_read_chars = 0; + + if (*ppos) { + CTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + mutex_lock(&fts_mutex); + disable_irq(client->irq); + + if (TP_Maker == TP_OUFEI && LCD_Maker == TP_EBBG && Project_Id == PROJECT_C3B) { + sprintf(cfgname, "%s", "ft5346_oufei_ebbg_c3b.ini"); + CTP_INFO("cfgname is: %s\n", cfgname); + } else if (TP_Maker == TP_LENS && LCD_Maker == TP_TIANMA && Project_Id == PROJECT_C3B) { + sprintf(cfgname, "%s", "ft5346_lens_tianma.ini"); + CTP_INFO("cfgname is: %s\n", cfgname); + } else if (TP_Maker == TP_DS && LCD_Maker == TP_EBBG && Project_Id == PROJECT_C3N) { + if (!strcmp(lcd_ic_name , "ili9881c")) { + sprintf(cfgname, "%s", "ft5346_ds_ebbg_nova.ini"); + CTP_INFO("cfgname is: %s\n", cfgname); + } else { + sprintf(cfgname, "%s", "ft5346_ds_ebbg_nova.ini"); + CTP_INFO("cfgname is: %s\n", cfgname); + } + } + + else if (TP_Maker == TP_OUFEI && LCD_Maker == TP_EBBG && Project_Id == PROJECT_C3N) { + sprintf(cfgname, "%s", "ft5346_oufei_ebbg.ini"); + CTP_INFO("cfgname is: %s\n", cfgname); + } else { + CTP_INFO("no ini match the project ctp,please check!"); + return count; + } + nret = fts_open_short_test(cfgname, NULL, &num_read_chars); + if (0 != nret) { + result = 0; + dev_err(&client->dev, "%s: fts open short test fail \n", __func__); + } else { + result = 1; + dev_err(&client->dev, "%s: fts open short test success \n", __func__); + } + + enable_irq(client->irq); + mutex_unlock(&fts_mutex); + + dev_err(&client->dev, "%s: End Open-Short Test \n", __func__); + return sprintf(ptr, "result=%d\n", result); +} + +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static void create_ctp_proc(void) +{ + + + + + + struct proc_dir_entry *ctp_open_proc = NULL; + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + CTP_ERROR("ft5x06: create parent_proc fail\n"); + return; + } + } + ctp_open_proc = proc_create(CTP_OPEN_PROC_NAME, 0777, ctp_device_proc, &ctp_open_procs_fops); + if (ctp_open_proc == NULL) { + CTP_ERROR("ft5x06: create open_proc fail\n"); + } +} +#endif + +#if FTS_PROC_APK_DEBUG +static int ft5x0x_i2c_Read(struct i2c_client *client, char *writebuf, + int writelen, char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) + dev_err(&client->dev, "f%s: i2c read error.\n", + __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} +/*write data by i2c*/ +static int ft5x0x_i2c_Write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret; + + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(client->adapter, msg, 1); + if (ret < 0) + dev_err(&client->dev, "%s i2c write error.\n", __func__); + + return ret; +} + +static ssize_t ft5x0x_debug_write(struct file *filp, const char __user *buff, size_t len, loff_t *ppos) +{ + struct i2c_client *client = update_client; + unsigned char writebuf[FTS_PACKET_LENGTH]; + int buflen = len; + int writelen = 0; + int ret = 0; + + if (*ppos) + return -EPERM; + + if (copy_from_user(&writebuf, buff, buflen)) { + dev_err(&client->dev, "%s:copy from user error\n", __func__); + return -EFAULT; + } + proc_operate_mode = writebuf[0]; + CTP_INFO("write mode %x", proc_operate_mode); + switch (proc_operate_mode) { + case PROC_UPGRADE: + { + char upgrade_file_path[128]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + + disable_irq(client->irq); + + ret = fts_ctpm_fw_upgrade_with_app_file(upgrade_file_path); + + enable_irq(client->irq); + if (ret < 0) { + dev_err(&client->dev, "%s:upgrade failed.\n", __func__); + return ret; + } + } + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = ft5x0x_i2c_Write(client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&client->dev, "%s:write iic error\n", __func__); + return ret; + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = ft5x0x_i2c_Write(client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&client->dev, "%s:write iic error\n", __func__); + return ret; + } + break; + case PROC_RAWDATA: + break; + case PROC_AUTOCLB: + fts_ctpm_auto_clb(); + break; + default: + break; + } + + *ppos += len; + return len; +} + +static unsigned char debug_read_buf[PAGE_SIZE]; + +/*interface of read proc*/ +static ssize_t ft5x0x_debug_read(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) +{ + struct i2c_client *client = update_client; + int ret = 0; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + + if (*ppos) + return -EPERM; + + switch (proc_operate_mode) { + case PROC_UPGRADE: + /*after calling ft5x0x_debug_write to upgrade*/ + regaddr = 0xA6; + ret = ft5x0x_read_reg(client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(debug_read_buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(debug_read_buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = ft5x0x_i2c_Read(client, NULL, 0, debug_read_buf, readlen); + if (ret < 0) { + dev_err(&client->dev, "%s:read iic error\n", __func__); + return ret; + } else + + num_read_chars = 1; + break; + case PROC_RAWDATA: + break; + default: + break; + } + + memcpy(user_buf, debug_read_buf, num_read_chars); + *ppos += num_read_chars; + return num_read_chars; +} + +static const struct file_operations ctp_apk_proc_fops = { + .write = ft5x0x_debug_write, + .read = ft5x0x_debug_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static int ft5x0x_create_apk_debug_channel(struct i2c_client *client) +{ + ft5x0x_proc_entry = proc_create(PROC_NAME, 0666, NULL, &ctp_apk_proc_fops); + if (NULL == ft5x0x_proc_entry) { + dev_err(&client->dev, "Couldn't create proc entry!\n"); + return -ENOMEM; + } + return 0; +} + +static void ft5x0x_release_apk_debug_channel(void) +{ + if (ft5x0x_proc_entry) + remove_proc_entry(PROC_NAME, NULL); +} + +#endif + +#if WT_CTP_GESTURE_SUPPORT +static ssize_t proc_gesture_data_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + int num = 0; + if (*ppos) + return 0; + printk("proc_gesture_data_read=%d\n", gtp_gesture_value); + num = sprintf(buffer, "%c\n", gtp_gesture_value); + *ppos += num; + return num; +} + + +static ssize_t proc_gesture_data_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_value); + return count; +} + +static ssize_t proc_gesture_onoff_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + + num = sprintf(page, "%c\n", gtp_gesture_onoff); + *ppos += num; + return num; + +} + +static ssize_t proc_gesture_onoff_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_onoff); + return count; +} + +static const struct file_operations gt_gesture_var_proc_fops = { + .write = proc_gesture_data_write, + .read = proc_gesture_data_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_gesture_onoff_proc_fops = { + .write = proc_gesture_onoff_write, + .read = proc_gesture_onoff_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +void Ctp_Gesture_Fucntion_Proc_File(void) +{ + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_gesture_type_proc = NULL; + struct proc_dir_entry *ctp_gesture_onoff_proc = NULL; + + ctp_device_proc = proc_mkdir("gesture", NULL); + + ctp_gesture_type_proc = proc_create("data", 0660, ctp_device_proc, >_gesture_var_proc_fops); + if (ctp_gesture_type_proc == NULL) { + CTP_DEBUG("ctp_gesture_var_proc create failed\n"); + } + + ctp_gesture_onoff_proc = proc_create("onoff", 0660, ctp_device_proc, >_gesture_onoff_proc_fops); + if (ctp_gesture_onoff_proc == NULL) { + CTP_DEBUG("ctp_gesture_onoff_proc create failed\n"); + } + +} + +#endif + +static int fts_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + char buffer[16]; + + if (type == EV_SYN && code == SYN_CONFIG) { + sprintf(buffer, "%d", value); + + CTP_INFO("FTS:Gesture on/off : %d", value); + if (value >= MXT_INPUT_EVENT_START && value <= MXT_INPUT_EVENT_END) { + if (value == MXT_INPUT_EVENT_WAKUP_MODE_ON) { + gtp_gesture_onoff = '1'; + } else if (value == MXT_INPUT_EVENT_WAKUP_MODE_OFF) { + gtp_gesture_onoff = '0'; + } else { + gtp_gesture_onoff = '0'; + CTP_ERROR("Failed Open/Close Gesture Function!\n"); + return -ENOMEM; + } + } + } + + return 0; +} + + +static int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, 10); + dev_err(&client->dev, "cmd_line =%s \n", cmd_line); + if (ret == 0) { + dev_err(&client->dev, "mode: ffbm\n"); + return 1;/* factory mode*/ + } else { + dev_err(&client->dev, "mode: no ffbm\n"); + return 2;/* no factory mode*/ + } + } + + nomal_boot = 1; + dev_err(&client->dev, "has no androidboot.mode \n"); + return 0; +} + +static int ft5x06_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct ft5x06_ts_platform_data *pdata; + struct ft5x06_ts_data *data; + struct input_dev *input_dev; + struct dentry *temp; + u8 reg_value; + u8 reg_addr; + int err; + int len; + u8 ic_name; +#if TPD_AUTO_UPGRADE + int ret_auto_upgrade = 0; + int i; +#endif + + temp = NULL; + update_client = client; + gesture_client = client; + + +#if CTP_PROC_INTERFACE + fts_i2c_client = client; +#endif + + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, + sizeof(struct ft5x06_ts_platform_data), GFP_KERNEL); + if (!pdata) { + dev_err(&client->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + err = ft5x06_parse_dt(&client->dev, pdata); + if (err) { + dev_err(&client->dev, "DT parsing failed\n"); + return err; + } + } else + pdata = client->dev.platform_data; + + if (!pdata) { + dev_err(&client->dev, "Invalid pdata\n"); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "I2C not supported\n"); + return -ENODEV; + } + + data = devm_kzalloc(&client->dev, + sizeof(struct ft5x06_ts_data), GFP_KERNEL); + if (!data) { + dev_err(&client->dev, "Not enough memory\n"); + return -ENOMEM; + } + + if (pdata->fw_name) { + len = strlen(pdata->fw_name); + if (len > FT_FW_NAME_MAX_LEN - 1) { + dev_err(&client->dev, "Invalid firmware name\n"); + return -EINVAL; + } + + strlcpy(data->fw_name, pdata->fw_name, len + 1); + } + + data->tch_data_len = FT_TCH_LEN(pdata->num_max_touches); + data->tch_data = devm_kzalloc(&client->dev, + data->tch_data_len, GFP_KERNEL); + if (!data) { + return -ENOMEM; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + return -ENOMEM; + } + + data->input_dev = input_dev; + data->client = client; + data->pdata = pdata; + + input_dev->name = "ft5346"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + input_dev->event = fts_input_event; + input_set_drvdata(input_dev, data); + i2c_set_clientdata(client, data); + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + +#if WT_CTP_GESTURE_SUPPORT + input_set_capability(input_dev, EV_KEY, KEY_POWER); + input_set_capability(input_dev, EV_KEY, KEYCODE_WAKEUP); + + __set_bit(KEYCODE_WAKEUP, input_dev->keybit); +#endif + + input_mt_init_slots(input_dev, pdata->num_max_touches, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, + pdata->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, + pdata->y_max, 0, 0); + + err = input_register_device(input_dev); + if (err) { + dev_err(&client->dev, "Input device registration failed\n"); + goto free_inputdev; + } + + if (pdata->power_init) { + err = pdata->power_init(true); + if (err) { + dev_err(&client->dev, "power init failed"); + goto unreg_inputdev; + } + } else { + err = ft5x06_power_init(data, true); + if (err) { + dev_err(&client->dev, "power init failed"); + goto unreg_inputdev; + } + } + + if (pdata->power_on) { + err = pdata->power_on(true); + if (err) { + dev_err(&client->dev, "power on failed"); + goto pwr_deinit; + } + } else { + err = ft5x06_power_on(data, true); + if (err) { + dev_err(&client->dev, "power on failed"); + goto pwr_deinit; + } + } + + err = ft5x06_ts_pinctrl_init(data); + if (!err && data->ts_pinctrl) { + err = ft5x06_ts_pinctrl_select(data, true); + if (err < 0) + goto pwr_off; + } + + if (gpio_is_valid(pdata->irq_gpio)) { + err = gpio_request(pdata->irq_gpio, "ft5x06_irq_gpio"); + if (err) { + dev_err(&client->dev, "irq gpio request failed"); + goto pwr_off; + } + err = gpio_direction_input(pdata->irq_gpio); + if (err) { + dev_err(&client->dev, + "set_direction for irq gpio failed\n"); + goto free_irq_gpio; + } + } + + if (gpio_is_valid(pdata->reset_gpio)) { + err = gpio_request(pdata->reset_gpio, "ft5x06_reset_gpio"); + if (err) { + goto free_irq_gpio; + } + + err = gpio_direction_output(pdata->reset_gpio, 0); + if (err) { + dev_err(&client->dev, + "set_direction for reset gpio failed\n"); + goto free_reset_gpio; + } + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + + /* make sure CTP already finish startup process */ + msleep(data->pdata->soft_rst_dly); + + /* check the controller id */ + reg_addr = FT_REG_ID; + err = ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) { + dev_err(&client->dev, "version read failed"); + goto free_reset_gpio; + } + ic_name = reg_value; + + dev_info(&client->dev, "Device ID = 0x%x\n", reg_value); + + if ((pdata->family_id != reg_value) && (!pdata->ignore_id_check)) { + dev_err(&client->dev, "%s:Unsupported controller\n", __func__); + goto free_reset_gpio; + } + + data->family_id = pdata->family_id; + + err = request_threaded_irq(client->irq, NULL, + ft5x06_ts_interrupt, + /*pdata->irq_gpio_flags |*/ IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + client->dev.driver->name, data); + if (err) { + dev_err(&client->dev, "request irq failed\n"); + goto free_reset_gpio; + } + + disable_irq(data->client->irq); + +#if CTP_SYS_APK_UPDATE + err = device_create_file(&client->dev, &dev_attr_fw_name); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_ftsfwupgradeapp); + if (err) { + dev_err(&client->dev, "upgradeapp sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_ftsmcaptest); + if (err) { + dev_err(&client->dev, "ftsmcaptest sys file creation failed\n"); + } + err = device_create_file(&client->dev, &dev_attr_update_fw); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_force_update_fw); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + data->dir = debugfs_create_dir(FT_DEBUG_DIR_NAME, NULL); + if (data->dir == NULL || IS_ERR(data->dir)) { + pr_err("debugfs_create_dir failed(%ld)\n", PTR_ERR(data->dir)); + err = PTR_ERR(data->dir); + } else { + temp = debugfs_create_file("addr", S_IRUSR | S_IWUSR, data->dir, data, + &debug_addr_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("data", S_IRUSR | S_IWUSR, data->dir, data, + &debug_data_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("suspend", S_IRUSR | S_IWUSR, data->dir, + data, &debug_suspend_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("dump_info", S_IRUSR | S_IWUSR, data->dir, + data, &debug_dump_info_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + } +#endif + + data->ts_info = devm_kzalloc(&client->dev, + FT_INFO_MAX_LEN, GFP_KERNEL); + if (!data->ts_info) { + dev_err(&client->dev, "Not enough memory\n"); + goto free_irq_gpio; + } + + /*get some register information */ + reg_addr = FT_REG_POINT_RATE; + ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + dev_err(&client->dev, "report rate read failed"); + + dev_info(&client->dev, "report rate = %dHz\n", reg_value * 10); + + reg_addr = FT_REG_THGROUP; + err = ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + dev_err(&client->dev, "threshold read failed"); + + dev_dbg(&client->dev, "touch threshold = %d\n", reg_value * 4); + + ft5x06_update_fw_ver(data); + ft5x06_update_fw_vendor_id(data); + + FT_STORE_TS_INFO(data->ts_info, data->family_id, data->pdata->name, + data->pdata->num_max_touches, data->pdata->group_id, + data->pdata->fw_vkey_support ? "yes" : "no", + data->pdata->fw_name, data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); + +#if WT_ADD_CTP_INFO + fts_ctpm_read_lockdown(client, data); +#endif + +#if defined(CONFIG_FB) + INIT_WORK(&data->fb_notify_work, fb_notify_resume_work); + data->fb_notif.notifier_call = fb_notifier_callback; + + err = fb_register_client(&data->fb_notif); + + if (err) + dev_err(&client->dev, "Unable to register fb_notifier: %d\n", + err); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + + FT_SUSPEND_LEVEL; + data->early_suspend.suspend = ft5x06_ts_early_suspend; + data->early_suspend.resume = ft5x06_ts_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO + create_ctp_lockdown_proc(); +#endif + + +#if CTP_PROC_INTERFACE + create_ctp_proc(); +#endif + +#if WT_CTP_GESTURE_SUPPORT + + Ctp_Gesture_Fucntion_Proc_File(); +#endif + +#if FTS_PROC_APK_DEBUG + ft5x0x_create_apk_debug_channel(update_client); +#endif + + +#if TPD_AUTO_UPGRADE + + err = get_boot_mode(client); + if (err == 0) { + dev_err(&client->dev, "upgrade\n"); + CTP_DEBUG("********************Enter CTP Auto Upgrade********************\n"); + msleep(50); + i = 0; + do { + ret_auto_upgrade = fts_ctpm_fw_upgrade_with_i_file(data); + i++; + if (ret_auto_upgrade < 0) { + CTP_DEBUG(" ctp upgrade fail err = %d \n", ret_auto_upgrade); + } + } while ((ret_auto_upgrade < 0) && (i < 3)); + } else { + dev_err(&client->dev, "no upgrade\n"); + CTP_DEBUG("not nomal_boot\n"); + } +#endif + +#if WT_ADD_CTP_INFO + err = hardwareinfo_set(data, ic_name, lockdown_info[2]); + if (err < 0) + dev_err(&client->dev, "hardwareinfo set failed"); +#endif + +#if CTP_CHARGER_DETECT + batt_psy = power_supply_get_by_name("usb"); + if (!batt_psy) + CTP_DEBUG("tp battery supply not found\n"); +#endif + + enable_irq(data->client->irq); + + return 0; + + +free_reset_gpio: + if (gpio_is_valid(pdata->reset_gpio)) + gpio_free(pdata->reset_gpio); + if (data->ts_pinctrl) { + err = ft5x06_ts_pinctrl_select(data, false); + if (err < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } +free_irq_gpio: + if (gpio_is_valid(pdata->irq_gpio)) + gpio_free(pdata->irq_gpio); + if (data->ts_pinctrl) { + err = ft5x06_ts_pinctrl_select(data, false); + if (err < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } + + +ft5x06_ts_pinctrl_free(data); + +pwr_off: +pwr_deinit: +unreg_inputdev: + input_unregister_device(input_dev); + input_dev = NULL; +free_inputdev: + input_free_device(input_dev); + return err; +} + +static int ft5x06_ts_remove(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + int retval; + +#if CTP_SYS_APK_UPDATE + device_remove_file(&client->dev, &dev_attr_fw_name); +#endif + +#if FTS_PROC_APK_DEBUG + ft5x0x_release_apk_debug_channel(); +#endif + + +#if defined(CONFIG_FB) + if (fb_unregister_client(&data->fb_notif)) + dev_err(&client->dev, "Error occurred while unregistering fb_notifier.\n"); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&data->early_suspend); +#endif + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + if (data->ts_pinctrl) { + retval = ft5x06_ts_pinctrl_select(data, false); + if (retval < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } + input_unregister_device(data->input_dev); + + return 0; +} + +void ft5x06_ts_shutdown(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + int retval; + + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) { + retval = gpio_direction_output(data->pdata->reset_gpio, 0); + if (retval) { + dev_err(&data->client->dev, + "set_direction for reset gpio failed\n"); + } + gpio_free(data->pdata->reset_gpio); + } + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + if (data->pdata->power_init) + data->pdata->power_init(false); + else + ft5x06_power_init(data, false); +} + + +static const struct i2c_device_id ft5x06_ts_id[] = { + {"ft5x06_720p", 0}, + {}, +}; + +MODULE_DEVICE_TABLE(i2c, ft5x06_ts_id); + +#ifdef CONFIG_OF +static struct of_device_id ft5x06_match_table[] = { + { .compatible = "focaltech,5336",}, + { }, +}; +#else +#define ft5x06_match_table NULL +#endif + +static struct i2c_driver ft5x06_ts_driver = { + .probe = ft5x06_ts_probe, + .remove = ft5x06_ts_remove, + .shutdown = ft5x06_ts_shutdown, + .driver = { + .name = "ft5x06_720p", + .owner = THIS_MODULE, + .of_match_table = ft5x06_match_table, +#ifdef CONFIG_PM + .pm = &ft5x06_ts_pm_ops, +#endif + }, + .id_table = ft5x06_ts_id, +}; + +static int __init ft5x06_ts_init(void) +{ + return i2c_add_driver(&ft5x06_ts_driver); +} +module_init(ft5x06_ts_init); + +static void __exit ft5x06_ts_exit(void) +{ + i2c_del_driver(&ft5x06_ts_driver); +} +module_exit(ft5x06_ts_exit); + +MODULE_DESCRIPTION("FocalTech ft5x06 TouchScreen driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg.txt new file mode 100644 index 0000000000000..420be95973f9d --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg.txt @@ -0,0 +1,3093 @@ +0x2, 0x1f,0xd2,0x2, 0xb5,0xb4,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x42,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x70,0x2d,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x7d,0x45,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x32,0x2, 0x7d,0xa4,0xe4,0x2, 0x29,0xfa,0x22,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xa2,0x13,0x22,0x32,0xff,0x2, 0x0, 0x69,0x2, 0x31, +0xb3,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x38,0xc8, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x38,0xd8,0x7e,0x73,0x38,0xd8,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x7f,0x5, 0x7e,0x1f,0x38,0xc8,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x38,0xc8,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x38,0xcc,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x38,0xd4,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x38,0xd2,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf7,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0xb7,0xc7,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d,0xe2,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xb2,0x61,0x3f,0x7e,0x34,0x1d,0x96,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xc6,0x61,0x3f,0x7e,0x34,0x1e,0xa, 0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d, +0xf1,0x61,0x3f,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x69,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x6a,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xc8,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x38,0xc8,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x20,0xde,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x38,0xc0,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf7,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x38,0xc0,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xb9,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x38,0xc8,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x39,0xd, 0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x86,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x39,0xd, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x39,0xd, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x39,0xd, 0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xf3,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xf3,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xc0,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x38,0xc8,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x38, +0xc8,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x38,0xc8,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x38,0xc8,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x38,0xc8,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x38, +0xc8,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x38,0xc8, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x38,0xc8,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x38,0xc8,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x38,0xc8,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xb9,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xb9,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xf3,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xf3,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x39, +0xd, 0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x38,0xc8, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x38,0xc8,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x39,0xd, 0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x39,0xd, 0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x39,0xd, 0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf7,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xf2,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf7,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf7,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x39, +0xd, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x39,0xd, 0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x39,0xd, 0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x58,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1e,0xeb,0x7d,0x1e,0x12,0x1f,0x5, 0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x38,0xc8,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf7,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xf2,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf7,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x7f,0x5, 0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x38,0xc0,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc8,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x38,0xd8,0x7e,0x1f,0x38,0xc0, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xf3,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x39,0xd, 0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x20,0x8f,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x20,0x90,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e, +0x1f,0x38,0xc0,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x38,0xc0,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x38,0xc8,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x6, 0xe, 0x15,0x1a,0x1f,0x26,0x2b,0x2d,0x2e,0x2f, +0x2c,0x2a,0x24,0x1f,0x1a,0x14,0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10,0x15,0x1c,0x22, +0x28,0x2d,0x34,0x39,0x3d,0x40,0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x11,0x16, +0x1c,0x23,0x2b,0x32,0x37,0x3c,0x40,0x45,0x4a,0x4d,0x4c,0x4b,0x4a,0x48,0x46,0x46, +0x45,0x45,0x44,0x44,0x43,0x44,0x45,0x78,0x65,0x55,0x2, 0xd, 0x14,0x1b,0x21,0x25, +0x2b,0x31,0x37,0x36,0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, +0x10,0x18,0x1e,0x23,0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40, +0x3f,0x3e,0x3d,0x3d,0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29, +0x27,0x1e,0x14,0x11,0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21, +0x2b,0x32,0x30,0x2a,0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, +0x10,0x19,0x23,0x2d,0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71, +0x50,0x55,0x28,0x12,0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39, +0x31,0x28,0x1e,0x15,0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32, +0x37,0x39,0x20,0x29,0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, +0x1, 0x0, 0x1, 0x5, 0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c, +0x34,0x31,0x26,0xcb,0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31, +0x2e,0x2d,0x35,0x3d,0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, +0x10,0x1b,0x24,0x2f,0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d, +0x28,0x31,0x34,0x2a,0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40, +0x47,0x47,0x44,0x3c,0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b, +0x22,0x2d,0x30,0x2e,0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, +0x0, 0x0, 0x3, 0xb, 0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26, +0x1b,0x14,0x1c,0x25,0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c, +0x25,0x30,0x38,0x40,0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c, +0x29,0x1e,0x14,0x13,0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39, +0x30,0x25,0x1b,0x10,0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a, +0x23,0x2f,0x33,0x29,0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, +0x2, 0x0, 0x1, 0x8, 0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e, +0x50,0x55,0x16,0x2b,0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36, +0x3b,0x3d,0x3b,0x37,0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33, +0x3d,0x3f,0x13,0x21,0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37, +0x2d,0x22,0x18,0xc, 0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38, +0x2e,0x2a,0x31,0x62,0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, +0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26, +0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b, +0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48, +0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x9, 0x17,0x1d,0x26,0x2e,0x37, +0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, +0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30,0x2f,0x2c,0x26,0x1e, +0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c,0x32,0x3a,0x41,0x48, +0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c,0x33,0x55,0x26,0x1c, +0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18,0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, +0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44,0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49, +0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f,0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54, +0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c, +0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22,0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c, +0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a,0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32, +0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, +0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22, +0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, 0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39, +0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68,0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70, +0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80,0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10, +0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, +0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39,0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24, +0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50,0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff, +0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a,0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, +0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22, +0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33,0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29, +0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d,0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26, +0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10,0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b, +0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19, +0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22,0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39, +0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34,0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, +0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18,0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37, +0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e, +0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21, +0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c, +0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, +0x0, 0x2, 0x5, 0x9, 0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f, +0x3d,0x38,0x30,0x27,0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36, +0x3f,0x49,0x53,0x5c,0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b, +0x15,0xb, 0x4, 0x0, 0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c, +0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, +0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, +0x8, 0xe, 0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58, +0x51,0x48,0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf, +0x30,0x55,0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28, +0x30,0x38,0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16, +0xf, 0xc, 0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, +0x3, 0xa, 0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a, +0x58,0x57,0xc6,0x55,0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38, +0x3c,0x3e,0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, +0xd, 0x17,0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57, +0x4f,0x47,0x40,0x38,0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, +0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f, +0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22, +0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25, +0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f, +0x3d,0x3a,0x36,0x2e,0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0x9, 0xe, 0x14,0x1c,0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a, +0x10,0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47, +0x4f,0x56,0x5a,0x5b,0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9, +0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e, +0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25, +0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25, +0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d, +0x3a,0x34,0x2d,0x27,0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, +0xa, 0xf, 0x15,0x1b,0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11, +0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36, +0x3c,0x42,0x47,0x48,0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29, +0x22,0x1b,0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c, +0x24,0x2a,0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, +0x4, 0x7, 0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b, +0x38,0x31,0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35, +0x3d,0x45,0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17, +0x11,0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6, +0x30,0x55,0xa, 0x5, 0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3c,0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, +0x1, 0x2, 0x35,0x46,0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37, +0x2e,0x25,0x1e,0x16,0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39, +0x41,0x45,0xf0,0xbc,0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28, +0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, +0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d, +0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19, +0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36, +0x2f,0x27,0x21,0x19,0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, +0x16,0x1f,0x26,0x2d,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d, +0x56,0x59,0x5a,0x58,0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, +0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38, +0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40, +0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3, +0x30,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, +0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f, +0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40, +0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32, +0x39,0x3e,0x7, 0x90,0x30,0x55,0x39,0x2b,0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, +0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b,0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f, +0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24, +0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b,0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65, +0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a,0x46,0x55,0x0, 0x1, 0x3, 0x5, 0x7, 0x8, +0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22,0x24,0x27,0x2a,0x2c, +0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, 0x14,0x1b,0x23,0x28, +0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53,0x4e,0x47,0x40,0x3b, +0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x1f,0x7, 0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x1f,0x7, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0x13,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x4c,0x0, 0xc2,0x14,0x75,0x4d,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x4e,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x21,0x10,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x36,0x72,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xd0,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33,0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0x9b,0x0, 0x0, 0x2, 0x37,0xed,0x0, 0x0, 0x0, 0x2, 0x37, +0xef,0x0, 0x0, 0x0, 0x1, 0x37,0xf1,0x0, 0x0, 0x1, 0x34,0x4f,0x0, 0x0, 0x1, 0x39, +0x11,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x2, 0x34,0x9f,0x0, 0x0, 0x0, 0x1, 0x34, +0xa1,0x0, 0x0, 0x1, 0x34,0xaf,0x0, 0x0, 0x1, 0x34,0xc4,0x0, 0x0, 0x1, 0x34,0xc5, +0x0, 0x0, 0x1, 0x35,0x3e,0x0, 0x0, 0x1, 0x35,0x3f,0x1, 0x0, 0x1, 0x35,0x40,0x0, +0x0, 0x3c,0x35,0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x36,0x61,0x0, 0x0, 0x1, 0x36,0x62,0x0, 0x0, 0x1, 0x36,0x63,0x0, 0x0, +0x1, 0x35,0xe2,0x1, 0x0, 0x2, 0x35,0xe5,0x0, 0x0, 0x0, 0x1, 0x2f,0xa9,0x0, 0x0, +0x1, 0x2f,0xaa,0x0, 0x0, 0x1, 0x2f,0xab,0x0, 0x0, 0x1, 0x2f,0xac,0x0, 0x0, 0x1, +0x36,0x66,0x1, 0x0, 0x1, 0x36,0xe0,0x0, 0x0, 0x1, 0x39,0x12,0x0, 0x0, 0x6, 0x38, +0xfb,0x3f,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x39,0x1, 0x24,0x0, 0x1, 0x39,0x8, +0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x1, 0x39,0xb, 0x0, +0x0, 0x1, 0x39,0xc, 0x0, 0x0, 0x1, 0x0, 0x4f,0x0, 0x0, 0x1, 0x3, 0xec,0x0, 0x0, +0x4, 0x37,0x40,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39,0x3, +0x0, 0x0, 0x2, 0x39,0x4, 0x0, 0x0, 0x0, 0x1, 0x39,0x6, 0x64,0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x39,0x13,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x2, 0x2b,0xb9,0x2b,0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, +0x0, 0x1, 0x38,0xdd,0x0, 0x0, 0x1, 0x38,0x3e,0xff,0x0, 0x1, 0x38,0x3f,0x0, 0x0, +0x1, 0x38,0x40,0x0, 0x0, 0x1, 0x38,0x41,0x40,0x0, 0x1, 0x38,0x42,0x40,0x0, 0x4, +0x38,0xf3,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf7,0x0, 0x0, 0x64,0x0, 0x0, 0x4, +0x38,0xc0,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x38,0xc4,0x0, 0x0, 0x68,0xc0,0x0, 0x4, +0x38,0xc8,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x38,0xd9,0x0, 0x0, 0x40,0x0, 0x0, 0x4, +0x39,0xd, 0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58, +0x0, 0xc, 0x0, 0xfa,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78, +0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, +0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, +0x0, 0x1e,0x12,0x3f,0x13,0x12,0x69,0x8e,0x12,0x23,0xb, 0x12,0x28,0x48,0x12,0x8d, +0xec,0x2, 0x23,0x4, 0x74,0x1, 0x7a,0xb3,0x36,0x6a,0x22,0x12,0x73,0x71,0x12,0x23, +0x40,0x2, 0x23,0x14,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x1d,0x7d,0x43,0x7e, +0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34, +0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22, +0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x23,0x1d,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, +0x7a,0x2, 0x23,0x1d,0x7e,0x34,0x60,0xa3,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x46, +0xa2,0x12,0x73,0x28,0x12,0x3f,0x13,0x12,0x69,0x87,0x12,0xc0,0x25,0x12,0x23,0xb, +0x12,0x28,0x48,0x12,0x68,0x23,0x12,0x8d,0xec,0x2, 0x23,0x4, 0x7e,0x34,0x61,0x4f, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x7a,0x37,0x28, +0x95,0x7e,0x34,0x61,0xba,0x12,0x23,0x9e,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8, +0x12,0x23,0x9e,0x7a,0x37,0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0x9e,0x7a,0x37, +0x28,0x9b,0x7e,0x34,0x61,0xbc,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61, +0xbe,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0x9e,0x12, +0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x20,0xde,0x12,0x25,0xc3,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0x9e, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0x9e,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x3c,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0xb7,0xc7,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x36, +0xe1,0x7e,0x34,0x61,0x51,0x12,0x23,0x9e,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x36,0xe2, +0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe3,0x7e,0x34, +0x61,0x57,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe4,0x7e,0x34,0x61,0x59, +0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe5,0x7e,0x34,0x61,0x5b,0x12,0x23, +0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe6,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x36,0xe7,0x12,0x20,0xb9,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x37,0x12,0xe5,0x28,0x7a,0xb3,0x37,0x1, 0x22,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a,0x4d,0x90,0x60, +0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0xc0, +0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93, +0x7a,0xb3,0x2a,0x59,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x62,0x12,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60, +0xa0,0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3, +0x16,0x92,0x22,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e, +0x12,0xc0,0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x37,0xa0,0xbe,0xf0,0x5, 0x78, +0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78, +0x13,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b,0xe4,0x7a,0xb3,0x2b,0x2, 0x12, +0x7a,0x2d,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x49,0xd, 0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x69,0xab,0x12,0xc1,0x1, +0x80,0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b, +0x12,0x2f,0xf4,0x50,0xfb,0x12,0x88,0x17,0x12,0x69,0x97,0x12,0x28,0x48,0x74,0x2, +0x7a,0xb3,0x37,0xa0,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3, +0xed,0x7a,0x37,0x3, 0xef,0x22,0x7e,0xb3,0x37,0x6, 0x14,0x68,0x60,0x14,0x78,0x2, +0xe1,0x10,0x14,0x68,0x73,0x24,0x3, 0x68,0x2, 0xe1,0x5, 0x12,0xc1,0x32,0x38,0x8, +0x30,0x10,0xf, 0x12,0xc1,0x2a,0x68,0xa, 0x12,0x63,0x2, 0xe4,0x7a,0xb3,0x38,0x85, +0x80,0x7e,0x7e,0xb3,0x36,0xe7,0x30,0xe0,0x77,0x7e,0x73,0x36,0xe8,0xa, 0x27,0x7e, +0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64, +0x12,0x23,0x9e,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x83,0x50,0x53,0x12,0x63,0x2, +0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x38,0x87,0x80,0x43,0x12,0xc1,0x32, +0x28,0x39,0xe4,0x7a,0xb3,0x37,0x6, 0x7e,0xb3,0x38,0x85,0xb4,0x1, 0x6, 0x74,0x1, +0x7a,0xb3,0x37,0x6, 0xd2,0x17,0x80,0x23,0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x45,0x73,0x12,0x23,0x54,0xe4,0x7a,0xb3,0x37,0x6, 0x7a,0xb3,0x39, +0x7, 0xd2,0x17,0x80,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x39,0x7, +0x12,0x90,0xd2,0x2, 0x27,0x16,0xca,0xd8,0xca,0x79,0x7e,0xb3,0x37,0x6, 0xb4,0x1, +0x2, 0x80,0x3, 0x2, 0x28,0x38,0x6c,0xdd,0x6c,0xff,0x12,0x91,0x11,0x7d,0xf3,0x12, +0x2f,0xf4,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x38,0x86,0x12,0x3d,0xac,0x12,0x13,0xc7, +0x12,0x0, 0x1e,0x74,0xa, 0x12,0x45,0x15,0x12,0xc0,0xe7,0x7e,0xe7,0x2b,0xd, 0x7a, +0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3,0x2a,0xfa,0x7e,0xe7,0x2b,0xd, +0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3,0x2a,0xfa,0x12,0x7b,0xd0,0x7c, +0x7b,0x74,0x6, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x1e,0xb9,0x7d,0x23,0x7d,0x3f, +0x12,0x25,0x3c,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12,0x4e,0xe0,0x12,0x26,0x57,0x7e, +0xb3,0x37,0x31,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, 0x74,0xa, 0x12,0x91,0x5d,0x12, +0x4f,0xaf,0x80,0xf, 0x80,0x7, 0x12,0x45,0xcf,0xe4,0x12,0x46,0x7, 0x20,0x93,0xf6, +0x12,0x45,0x9f,0x30,0x18,0xf7,0x30,0x17,0xf4,0xd2,0x4, 0x12,0x45,0x5a,0xe4,0x12, +0x13,0xde,0xb, 0xd0,0x12,0x4c,0x83,0x12,0x91,0x76,0x7e,0xa3,0x38,0x85,0x4c,0xaa, +0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x86,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x31, +0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x85,0x12,0x28,0x3d,0x78,0x18,0x7e,0xb3,0x38,0x85, +0x60,0x12,0xe4,0x7a,0xb3,0x38,0x85,0x7a,0xb3,0x2a,0x2, 0x7a,0xb3,0x2a,0x3, 0x7e, +0xf0,0x1, 0x80,0x1d,0x12,0x28,0x3d,0x68,0x10,0x7e,0xb3,0x38,0x85,0x70,0xa, 0x7e, +0xf0,0x1, 0xe4,0x7a,0xb3,0x37,0x6, 0x80,0x8, 0xbe,0xd0,0x32,0x50,0x3, 0x2, 0x27, +0x8c,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a,0x37,0x2b,0xd, 0x7a,0xe3,0x2a, +0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x48,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x38, +0xf2,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34, +0x39,0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34, +0x3a,0x22,0xca,0x3b,0x12,0x2f,0xf4,0x50,0xfb,0x7e,0xf3,0x2b,0xf, 0x7c,0xbf,0x12, +0xb3,0xfc,0x12,0xb4,0x13,0x7e,0xb3,0x2b,0x1f,0xf5,0x28,0x7e,0xb3,0x2b,0x20,0xf5, +0x29,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0xf, 0x12,0x8d,0x6c,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x28,0x48,0xc3,0x21,0x6c,0x12,0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x7, 0x12,0xac,0x20,0x7a,0x37,0x37,0xe3,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x69,0x8e,0x12,0xac,0xe, 0x7e,0xc3,0x3, 0xec,0x12,0x6e,0x31, +0xe4,0x12,0x13,0xde,0x12,0x28,0x48,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x2a,0x7e,0x18, +0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x7a,0xc8,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x2a, +0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x7a,0xc8,0x7e,0xd3,0x2b,0x1f,0x7e, +0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5,0x29,0x12,0x6e,0x8b,0x50,0x5, +0x7c,0xbc,0x12,0xb3,0x54,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d, +0x10,0x12,0x6a,0xd4,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3,0x2b,0x20,0x7c,0xbf,0x12,0x86, +0xf8,0x12,0xaa,0x18,0x7e,0xb3,0x39,0x7, 0x4, 0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39, +0x7, 0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x7, 0x7e,0xb3,0x16,0x90, +0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e, +0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, 0x37,0x2d,0x32,0x22,0x12,0x48, +0x7, 0x7e,0xb3,0x37,0x8, 0xb4,0x3, 0x6c,0x12,0xb6,0xe2,0x12,0x26,0x57,0x12,0x3f, +0xfb,0x7e,0xb3,0x37,0x9c,0x30,0xe7,0xe9,0x12,0x28,0x62,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18,0x12,0xab,0xdb,0x12,0x75,0xe9, +0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x88,0x5f,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x58,0x52,0x12,0x48,0x39,0x12,0x3a,0x9f,0x7e,0xb3,0x37,0x9c,0x54,0x7f,0x7a,0xb3, +0x37,0x9c,0x80,0x8d,0x12,0x2f,0xee,0x2, 0x0, 0x46,0x7a,0xb3,0x2b,0x2, 0x7a,0xb3, +0x2b,0x1e,0x22,0x12,0x52,0x6d,0x12,0x2b,0xfa,0x12,0x2b,0xfa,0x12,0x36,0xac,0x12, +0x9c,0xfd,0x12,0x9f,0xef,0x12,0x2b,0xfa,0x12,0x9b,0xe7,0x12,0x2b,0xfa,0x12,0xa0, +0xae,0x12,0x2b,0xfa,0x2, 0x2a,0x27,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c,0xdd, +0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x25,0x7e,0x8, 0x35,0xe9,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18,0x26, +0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0x41,0xfb, +0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9,0x9, +0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x36,0x74, +0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36, +0x26,0xa, 0x37,0x12,0x81,0xbf,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x25,0x12,0xa1,0x4b,0x2d,0x13,0xbd,0xc1,0x28, +0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68,0x39, +0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x2c,0x40, +0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34,0x74, +0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71,0x74, +0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe8,0xbc, +0x7e,0x28,0x2, 0x41,0x60,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x33,0x12,0x2f,0xe4,0xbe,0xb0,0xff,0x68, +0x2b,0x9, 0x73,0x1f,0x35,0x12,0x30,0x3, 0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54,0x0, +0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, 0x12, +0x2f,0xe4,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc,0xf9, +0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19,0x75, +0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19,0xa3, +0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe,0x38,0x8a,0x90, +0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e, +0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xfd,0x12,0x97,0x4, 0x7e,0x8, 0x36, +0x25,0x74,0xff,0x12,0x20,0xde,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b, +0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xf5, +0x7a,0xf3,0x35,0xe8,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb3,0x28, +0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee, +0x80,0x2e,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x25,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac, +0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa, +0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbf,0x12,0x2f,0xd0,0xb, 0xf0,0xb, 0xe0, +0x12,0x9c,0xf6,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c,0xba,0x7c,0x7d, +0x12,0x30,0x3, 0xb, 0x1a,0x30,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3, +0x2a,0x6f,0xf5,0x40,0x7e,0xb3,0x2a,0x70,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a, +0xb3,0x33,0xc2,0x7a,0xb3,0x33,0xc0,0x7a,0xb3,0x33,0xc1,0x7e,0x8, 0x1f,0x34,0x12, +0x2f,0xdd,0xe4,0x12,0x20,0xde,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x33,0xc3,0xe4, +0x12,0x20,0xde,0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa2,0x6c,0xcc,0xe1,0x91,0x12,0xc0, +0x8b,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, +0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34,0x7c, +0xbd,0x14,0xbc,0xbc,0x78,0x2, 0xe1,0x97,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x88, +0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, 0xb3, +0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x28,0xe5, +0x27,0xa, 0x2b,0xe5,0x25,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0, +0x4, 0x40,0x2, 0xe1,0x86,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x86,0x85,0x25, +0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb0,0x69,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x40,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83,0x80, +0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2b, +0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x40,0x2d,0x34, +0xbd,0x38,0x18,0x2, 0xe1,0x1d,0x75,0x30,0x1, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x1, +0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x4, +0x40,0x2, 0xe1,0x1d,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x1d,0x7c,0xbf,0x20, +0xe0,0x2, 0xe1,0x1d,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26,0xbe, +0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1, +0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25, +0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50, +0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29, +0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x5, +0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24,0xe5, +0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29, +0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x5, +0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24,0xe5, +0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85,0x2b, +0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x2c,0x40,0x7a,0x35,0x3e,0xe5,0x2a, +0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe,0xb1, +0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93,0x5, +0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0,0x5, +0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c,0x50, +0xad,0xe5,0x2c,0x12,0x2f,0xae,0xe5,0x2a,0x12,0x2f,0xa5,0xe5,0x2a,0x12,0x2f,0xae, +0xe5,0x2c,0x12,0x2f,0xa5,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20,0x5, +0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x42, +0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0xe5,0x42,0xa, 0x1b, +0x6d,0x0, 0x12,0x1e,0xeb,0x7f,0x21,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, +0x28,0x12,0x1e,0xfc,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23, +0x3e,0x24,0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe, +0xb0,0x0, 0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x33,0xbf,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f, +0x34,0xf5,0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x1f,0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0xc0,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x8e,0x7e,0x8, 0x1f,0x34,0x12,0xaf,0x94,0x7a,0xb3, +0x33,0xc2,0xda,0x3b,0x22,0x7e,0x71,0x2d,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7e,0x71, +0x2b,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7c,0x7b,0x12,0x77,0xf6,0x9, 0xa2,0x27,0x72, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x91,0x6d,0x5c,0xba,0x22, +0x7e,0x70,0x1, 0x2, 0x51,0x5f,0xa, 0x3b,0x9d,0x32,0x2, 0x21,0x0, 0x90,0x60,0x9a, +0x93,0xa, 0x3b,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x12,0x2f, +0xf4,0x50,0xfb,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x7c,0x5b,0x7e,0x43,0x28, +0x84,0xbe,0x40,0x1, 0x28,0x2, 0x21,0x14,0x7e,0xa3,0x2a,0x6e,0x7e,0x70,0x2, 0xac, +0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x30,0x3, +0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc,0x7c,0x9d,0x7e,0x83,0x2a, +0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc,0xa, 0xa8,0x1b,0xa5,0xa, +0x5f,0xbd,0x5a,0x58,0x2, 0x21,0x14,0xa, 0x59,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48, +0x4e,0x7c,0xb9,0x14,0x12,0x31,0x5a,0x50,0x46,0x7c,0xb9,0x14,0x12,0x31,0x17,0xb, +0x1a,0xe0,0x7d,0x3b,0x12,0x31,0x4c,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf, +0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12, +0x31,0x1e,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x31,0x20,0x1b,0x1a,0xa0,0xa, +0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9,0x4, 0x12,0x31,0x5a,0x50, +0x43,0x7c,0xb9,0x4, 0x12,0x31,0x17,0xb, 0x1a,0xe0,0x7d,0x3c,0x12,0x31,0x4c,0x8, +0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12, +0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x31,0x1e,0xb, 0x1a,0x50,0xbd,0x5a,0x8, +0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x31,0x27,0x7d,0xd3,0x7d,0x5d,0x3e,0x54, +0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43,0x2a,0x6e,0x90,0x60,0xab, +0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7c,0x75,0xac,0x74,0xa, +0x2a,0x2d,0x32,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40, +0x2d,0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xab,0x6c,0x77,0x80,0x12, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x51,0x4f,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22, +0xb, 0x70,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe5,0xc3,0x22,0x12,0x36,0x9c, +0x60,0x30,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1b,0x7c,0xb2,0x12, +0x31,0x27,0x7d,0x3, 0x12,0x36,0x94,0x49,0x55,0x38,0xe8,0x7d,0x40,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd4,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc0,0xde,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0x41,0xdd,0x6c,0xcc,0x41,0xcf,0x12,0xc0,0x8b,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xb, 0x7e,0xb3,0x36,0x71,0x70, +0x5, 0x12,0x32,0xe0,0x80,0x6, 0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x30, +0x19,0xd2,0x3, 0x12,0x32,0xe7,0x7e,0xb3,0x36,0xec,0xb4,0x1, 0x1b,0x7e,0xb3,0x2a, +0x3, 0xb4,0x1, 0x14,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xd, 0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x3, 0x12,0x32,0xe0,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x27,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, +0x2d,0x1b,0x24,0xe5,0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24, +0x0, 0x80,0x3c,0xe5,0x24,0xbc,0xbc,0x68,0x34,0x12,0x35,0xda,0x9, 0xa3,0x26,0xfa, +0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5,0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x2f,0xd6, +0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a,0xa, 0x2b,0xe5,0x28,0x12,0x2f,0xd6,0xbe, +0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12, +0x36,0xa4,0x38,0xbf,0xe5,0x27,0x7e,0x71,0x28,0x12,0xa0,0x94,0x50,0x8, 0x12,0x31, +0x7d,0x12,0x35,0xd3,0x80,0x8, 0x12,0x69,0x84,0x50,0x3, 0x12,0x32,0xe0,0xe5,0x25, +0x7e,0x71,0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x33,0x21,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x16,0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e, +0x34,0x27,0x78,0x6d,0x22,0x12,0x7f,0xc5,0x12,0x31,0x7d,0xb, 0xf0,0xb, 0xc0,0x7e, +0x73,0x28,0x84,0xbc,0x7c,0x28,0x2, 0x21,0xc9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22, +0x75,0x25,0x3, 0x75,0x26,0x3, 0x22,0x12,0x36,0x9c,0x60,0x34,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1f,0x7c,0xb2,0x12,0x31,0x27,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x36,0x94,0x59,0x35,0x38,0xe8,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72,0x38,0xd0, +0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x35, +0x80,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x35,0x80,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x30,0x3, 0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x90,0x50,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0xc7,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0xb1,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0xaf,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0xaf,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x40,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0xaf,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x35,0x65,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x35,0x65,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0xb8,0xa8,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x35,0x56,0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x35,0x56,0x9f,0x51,0x12,0x35,0x5d,0x9f,0x41,0x12,0x35,0x5d,0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0xeb,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xdf,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x35,0x71,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x35,0x71,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1e,0xeb,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x0, 0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x7, 0x2e,0x18,0x0, 0x20,0x22, +0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34, +0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39, +0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39, +0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d, +0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba, +0xda,0xf8,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x74,0xf5,0x27,0x12,0x0, 0x66,0x50,0x2, 0xc1, +0x6f,0x6d,0x33,0x9e,0x37,0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x70,0x7e, +0xb3,0x16,0x92,0x70,0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x60,0x7e,0x77,0x2a,0x51, +0x7e,0x67,0x2a,0x53,0x75,0x24,0x0, 0x80,0x4e,0xe5,0x24,0x12,0x2f,0xb7,0x60,0x45, +0x12,0x35,0xda,0x12,0x9d,0x80,0xf5,0x26,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90, +0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26,0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26, +0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0xd, 0xe5,0x25,0xa, 0x2b,0xe5, +0x27,0x12,0x9b,0x18,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x51,0x5f,0x12, +0x35,0xda,0x12,0x37,0x9f,0x5, 0x24,0x12,0x36,0xa4,0x38,0xad,0x12,0xa6,0x5, 0xda, +0x3b,0x22,0x12,0x46,0xa2,0x12,0x24,0x9a,0x12,0x73,0x28,0x12,0x22,0xf2,0x7e,0xb3, +0x37,0x8, 0x24,0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x58,0xf0,0x80,0xef,0x12, +0x29,0x7e,0x80,0xea,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x90,0x60, +0xa7,0xe4,0x93,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x12,0xa5,0xee,0x12, +0x9b,0x49,0x12,0x35,0xe2,0x12,0x9a,0x38,0x2, 0x36,0xbb,0xca,0x3b,0x12,0x2b,0xfa, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x9, 0xe4,0x7a,0xb3,0x35, +0xe4,0x7a,0xb3,0x35,0x69,0x7e,0xb3,0x35,0xe2,0x70,0x69,0x6c,0x99,0x80,0x5d,0x74, +0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x9a,0xed, +0x40,0x48,0x6c,0xee,0x80,0x3c,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x6a,0x9, 0xc5, +0x35,0x6b,0xa, 0x28,0xa, 0x3d,0x12,0x37,0x67,0x78,0x25,0xa, 0x2f,0xa, 0x3c,0x12, +0x37,0x67,0x78,0x1c,0x7c,0xb9,0x12,0x37,0x6f,0x7e,0x14,0x62,0x2b,0x12,0x87,0xee, +0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x51,0x5f,0x7c,0xb8,0x7c,0x7f,0x12,0x37,0xa7, +0xb, 0xe0,0x7e,0x73,0x35,0xe4,0xbc,0x7e,0x38,0xbc,0xb, 0x90,0x7e,0x73,0x28,0x84, +0xbc,0x79,0x38,0x9b,0x7e,0x73,0x35,0x69,0x7a,0x73,0x35,0xe4,0xa, 0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x35,0xa6,0x7e,0x8, 0x35,0x6a,0x12,0x20,0xb9,0x1b,0xfd,0xe4, +0x7a,0xb3,0x35,0xe2,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x0, 0x4d,0x33,0x22,0x7c, +0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x2, 0x2c, +0x40,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0x99,0x6c,0x7f,0x71,0x7c,0xbf,0x12, +0x37,0x6f,0x12,0xa4,0xcf,0x7f,0x17,0x12,0x1f,0x58,0x7c,0xb7,0xda,0xf8,0x22,0x9, +0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c,0x6b,0x7e,0xa3,0x35,0x69,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x62,0x35,0xa6,0x19,0x72,0x35,0xa7,0x7c,0xba,0x4, 0x7a,0xb3,0x35, +0x69,0x22,0xca,0xf8,0x6c,0xff,0x80,0x18,0x7c,0xbf,0x12,0x37,0x6f,0xbe,0x37,0x2a, +0x5c,0x58,0xb, 0x12,0x51,0x5b,0x7e,0x70,0x2, 0xac,0x7f,0x12,0x37,0x9f,0xb, 0xf0, +0x12,0x52,0x66,0x38,0xe3,0x12,0x2b,0xfa,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe, +0xa0,0x34,0x38,0x3, 0x2, 0x38,0xfd,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x10, +0x41,0x1c,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d, +0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x31,0xce,0x7e,0x39,0xb0,0xbe,0xa0,0x37, +0x68,0x2, 0x41,0x1c,0x75,0x1a,0x36,0x41,0x1c,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0, +0x39,0x78,0x1b,0x7e,0xf3,0x37,0xc0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc0,0xbe,0xa0, +0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x1c,0xbe,0xa0, +0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xc2,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc2,0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b, +0x44,0x41,0x1c,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x1c,0xbe,0xa0, +0x5e,0x78,0x26,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, +0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x1c,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0, +0x3d,0x78,0x1b,0x7e,0xf3,0x37,0xc4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc4,0xbe,0xa0, +0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x1c,0xbe,0xa0, +0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xc6,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc6,0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a, +0x9d,0x41,0x1c,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x37,0x9c,0x41,0x1c,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e, +0xf3,0x37,0xe1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xe1,0xbe,0xa0,0x4f,0x78,0x3, 0x75, +0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x31,0xcc,0x7e,0x39,0xb0,0x41,0x1c,0xbe,0xa0,0x51, +0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, +0xff,0x7e,0xb3,0x37,0xec,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a, +0xb3,0x37,0xec,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0x1c,0xbe, +0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xb5,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xb5,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x3a, +0x1f,0x41,0x1c,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0x91,0x41,0x1c,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e,0xbe,0xa0, +0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0xa, 0x9, 0xb3,0x31,0xd4,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1a,0xf4,0x80,0x5c, +0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5, +0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10, +0x3e,0x14,0x7e,0x1f,0x31,0xd0,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, +0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80, +0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c, +0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, +0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e, +0x3, 0x2a,0x6d,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x60,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, +0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, +0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x62,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca, +0xf8,0x80,0x38,0x7c,0xbf,0x12,0x3a,0x1f,0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70, +0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x12,0x3a,0xde,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x3a,0xde,0x7e,0x73,0x2a, +0x6e,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3, +0x2a,0x6d,0x74,0x2, 0xa4,0x22,0x12,0x3f,0xaa,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x37,0xdc,0x7e,0x8, 0x25,0xee,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x3f,0x49,0x80,0x12, +0xca,0x39,0x7e,0x18,0x37,0xdc,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x3f,0x67,0x2, 0x3b,0x15,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0xca,0xf8, +0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x7d,0xab,0xd2,0x6, 0xa1,0xa0,0xa5, +0xbe,0x1, 0x3d,0x7a,0x73,0x37,0x9d,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5,0xbf,0xae, +0x4, 0xd2,0x7, 0xa1,0xa0,0xa5,0xbf,0xaa,0x5, 0x12,0xc0,0xf8,0x80,0x1e,0xa5,0xbf, +0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xce,0x80,0x10,0xa5,0xbf,0xac,0x2, +0x80,0x2, 0xa1,0xa0,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xce,0x6d,0x33,0x81,0x1c, +0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x3d,0xa3,0xa5,0xbe,0x7, +0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xa0,0xa5,0xbe,0x8, 0x2, 0x80,0x2, 0xa1,0xa0, +0x12,0x7, 0xfb,0xa1,0xa0,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73,0x37,0xa6, +0xa1,0xa0,0xa5,0xbe,0xb, 0x8, 0x12,0x3d,0xa3,0x12,0x3f,0xc8,0xa1,0xa0,0xbe,0x60, +0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x38,0xbe,0x60,0x1e,0x40,0xd, 0xbe, +0x60,0x23,0x38,0x8, 0x12,0x3d,0xa5,0x43,0xc, 0x40,0xa1,0xa0,0xbe,0x60,0x15,0x40, +0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x3d,0xa5,0xd2,0x6, 0xa5,0xbe,0x15,0x2, 0x80, +0x2, 0xa1,0xa0,0x74,0x7, 0x7a,0xb3,0x37,0xa0,0xa1,0xa0,0xa5,0xbe,0x19,0x7, 0xe4, +0x7a,0xb3,0x37,0xb5,0xa1,0xa0,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c,0x38,0x2, +0xa1,0x38,0xa5,0xbe,0x2d,0x1b,0x12,0x3d,0xa5,0x20,0x7, 0x2, 0xa1,0xa0,0x7e,0x63, +0x37,0xc8,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35,0x8, 0xa1, +0xa0,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, 0xa1,0x38, +0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1,0x38,0x7e,0x70, +0x64,0xa1,0x38,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, 0x1, 0x7e, +0xf3,0x37,0xc1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc1,0xa, 0x2f,0x19,0x72,0x2b,0x21, +0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x38,0xa1,0xa0,0xbe,0x60,0x3a, +0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xc3,0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, 0x80,0x2, +0xa1,0xa0,0x75,0x1a,0x3a,0xa1,0xa0,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, 0x7a,0x73, +0x2b,0x12,0xa1,0xa0,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xec,0xa1,0xa0,0xbe,0x60, +0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc5,0x7c,0xbf, +0x4, 0x7a,0xb3,0x37,0xc5,0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d,0x2, 0x80, +0x2, 0xa1,0xa0,0x75,0x1a,0x3c,0xa1,0xa0,0xbe,0x60,0x3e,0x68,0x4, 0xa5,0xbe,0x3f, +0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc7,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc7,0xa, +0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x3e, +0xa1,0xa0,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x3d,0xa5,0x75, +0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x3d,0xa5,0x75,0xd, 0x2, 0x12,0x3a, +0xe6,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x3d,0xa5,0x12,0x3f,0x70,0x80,0x71,0xbe, +0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x3d,0xa5,0x80,0x63,0xbe,0x60,0x4e, +0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xe2,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xe2,0xa, 0x2f,0x2e,0x27,0x31,0xcc,0x7a,0x29,0x70,0xa5,0xbe,0x4f, +0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80,0x31,0xbe, +0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20,0x7c,0xb7, +0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, 0x7e,0x1f, +0x31,0xd0,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a,0x71,0xf, +0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0x9c,0x22,0x7a,0xb3,0x2b,0x0, +0x70,0x14,0x12,0x3f,0x67,0x12,0x3b,0x15,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4, +0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x3f,0x49,0x12,0x3b,0x15,0x12, +0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12,0x0, 0x1e, +0xe4,0x12,0x3d,0xac,0x12,0x3d,0xf3,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12,0x3d,0xac, +0x2, 0x3d,0xf3,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e,0x8, 0x1f, +0x44,0x12,0x3f,0xe9,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x20,0xde,0x7e, +0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x1f,0xda,0x7e, +0x34,0x0, 0xa, 0x12,0x20,0xde,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc,0x7a,0x1d, +0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, 0x2a,0xb9, +0x12,0xba,0x6c,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, 0x3a,0x2e, +0x34,0x20,0x73,0x12,0x91,0x6d,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12, +0x3f,0xb, 0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a, +0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9, +0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x3f,0xb, 0xa, 0x4a, +0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde, +0x38,0xd8,0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0, +0x12,0xb9,0x2, 0x80,0x3, 0x12,0x3f,0xd9,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f, +0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e, +0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34, +0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e, +0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x12,0xaf,0x1f,0x12,0x13,0xf5,0x12, +0xb9,0x8e,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x3f,0xcb,0x74,0x1, 0x12, +0x3d,0xac,0x12,0x3f,0xd2,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x3d,0xdb,0x7e, +0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25, +0xee,0x22,0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x3f,0x67,0x80,0x6, 0xb4,0x1, 0x6, +0x12,0x3f,0x49,0x12,0x3b,0x15,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22, +0x12,0x3f,0xaa,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x37,0xdc, +0x12,0x20,0xb9,0x1b,0xfd,0x12,0xc0,0xef,0x12,0x3f,0x49,0x80,0x1a,0xca,0x39,0x7e, +0x18,0x2b,0x70,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x37,0x2b,0x76, +0x7a,0x37,0x31,0xcc,0x12,0x3f,0x67,0x2, 0x3b,0x15,0x7e,0xb3,0x37,0xe0,0x7e,0x34, +0x0, 0x4, 0x22,0x7c,0x6b,0x12,0x3f,0xe1,0x78,0x5, 0x7c,0xb6,0x2, 0x7d,0xd6,0xb4, +0x4, 0x5, 0x7c,0xb6,0x2, 0x3b,0x1e,0x22,0xb2,0x82,0x22,0x7d,0x32,0x74,0xfa,0x2, +0x12,0xd0,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x20, +0xde,0x7e,0xb3,0x37,0x9c,0xc4,0x54,0x7, 0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, +0x20,0xde,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x30,0x6, 0x3b,0xc2,0x6, +0x12,0x25,0xe6,0x7e,0x73,0x37,0xa1,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x37,0xa2,0x7a, +0x73,0x2b,0x1d,0x7e,0x73,0x37,0xa2,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x37,0xa3,0x60, +0x18,0x7e,0x34,0x0, 0x2, 0x12,0x41,0x5d,0x7e,0x34,0x0, 0x1, 0x12,0x41,0x5d,0x6d, +0x33,0x12,0x41,0x5d,0xe4,0x7a,0xb3,0x37,0xa3,0x12,0x4f,0xfa,0x2, 0x40,0x3f,0xe5, +0xc, 0x70,0x2, 0x21,0x5c,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x72,0x92, +0x12,0x79,0x31,0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53, +0xc, 0xfd,0x12,0xba,0x23,0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b, +0x12,0x60,0x9, 0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65, +0x7e,0x73,0x2b,0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x4, +0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3, +0x45,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xce,0x7a,0x73,0x2b,0xf, 0x12,0x87,0x52,0x7a, +0xb3,0x0, 0x4f,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x4f,0x7a, +0x73,0x37,0xa6,0x12,0x6e,0x29,0x12,0xc0,0x42,0x7e,0x73,0x37,0xcf,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4, +0x12,0xa, 0x66,0x12,0x8d,0xec,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43, +0x37,0xd0,0x7e,0x50,0xa, 0xac,0x45,0x12,0x3f,0xcb,0xe5,0xc, 0x30,0xe6,0x4e,0x53, +0xc, 0xbf,0x7e,0x73,0x37,0xbc,0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37, +0xbc,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x43,0xeb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63, +0x37,0xbc,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12,0x47,0x81,0x7c,0x65,0x4c,0x76,0x74, +0xe, 0x12,0x43,0x5f,0x12,0x43,0xeb,0x12,0x43,0xf3,0x7e,0x73,0x37,0xbf,0x7a,0x73, +0x2b,0x14,0x7e,0x73,0x37,0xbe,0x7a,0x73,0x2b,0x1f,0x12,0xc1,0x1, 0xe5,0xc, 0x30, +0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xa6,0x2, 0x48,0x77,0x22,0xca,0xd8,0xca, +0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c, +0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x57, +0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x43,0xeb,0x7c,0x8b,0x74,0x7, 0x7e, +0x70,0xf, 0x12,0x43,0xf0,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, +0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, +0xc, 0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e, +0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x38,0xc4,0x12,0x43, +0x48,0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x38,0xc4,0x78,0x7, 0x12,0x43, +0x48,0x54,0xfb,0x80,0x5, 0x12,0x43,0x48,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x38, +0xc0,0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e, +0xa0,0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0x12,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff, +0xe, 0x12,0x43,0x53,0x54,0xe6,0x12,0x43,0x50,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12, +0x43,0x53,0x5e,0x54,0xfe,0xe6,0x12,0x43,0x50,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4, +0x0, 0x2, 0x78,0x2d,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e,0x54,0x0, 0xf, 0x1b, +0x1a,0x50,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34, +0x0, 0x2, 0x12,0x44,0x72,0x12,0x44,0x4b,0x12,0x44,0x28,0x7a,0x37,0x31,0xd4,0x61, +0x4, 0x6c,0xdd,0x41,0xfe,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40, +0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, +0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c, +0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e, +0x54,0x0, 0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4, +0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, +0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, +0x3b,0x12,0x44,0x72,0x12,0x44,0x4b,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x44,0x4b, +0x12,0x44,0x28,0x74,0x2, 0xac,0xbd,0x59,0x35,0x31,0xd6,0x80,0xf, 0x12,0x44,0x28, +0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x31,0xd6,0xb, 0xd0,0xbc,0xed, +0x28,0x2, 0x41,0x65,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x43,0xf0,0xa9,0xc0, +0xc4,0x7e,0x1f,0x38,0xc0,0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x38,0xc0,0x79,0xf1,0x0, +0x90,0x6d,0x33,0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0x8, 0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x10,0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22, +0x1b,0x1a,0x50,0x7e,0x1f,0x38,0xc0,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5, +0xfd,0x7a,0x71,0xfe,0x22,0xca,0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12, +0x43,0x5f,0x74,0xf, 0x12,0x43,0xeb,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe, +0x12,0x43,0x5f,0x74,0xc, 0x12,0x43,0xeb,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, +0x7e,0x70,0xf8,0x12,0x43,0x5f,0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, +0x38,0xb, 0x12,0x45,0x6, 0x7c,0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17, +0xe4,0x93,0xb4,0x1, 0xe, 0xbe,0xa0,0x7, 0x28,0x9, 0x12,0x45,0x6, 0xa, 0x77,0x2e, +0x74,0x0, 0x7, 0x74,0xe, 0x7c,0x7f,0x12,0x43,0x5f,0x74,0x7, 0x12,0x43,0xeb,0x7c, +0xfb,0x5e,0xf0,0xfb,0x90,0x60,0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c, +0xf7,0x74,0x7, 0x7c,0x7f,0x12,0x43,0xf0,0xda,0x79,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x12,0x43,0x5f,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24, +0x7e,0x24,0x0, 0x12,0x12,0xb7,0xc7,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74, +0x3, 0x7e,0x71,0x27,0x12,0x43,0x5f,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x43,0x5f,0x74, +0xc, 0x7e,0x71,0x30,0x12,0x43,0xf0,0x22,0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0xa, +0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e, +0xf, 0x38,0xc4,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0x12,0x5e, +0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34, +0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x45,0x15, +0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6, +0x22,0x12,0x47,0xf8,0xc2,0x3, 0x12,0xb6,0x57,0xc2,0x5, 0x12,0x45,0x51,0xc2,0x3, +0x12,0x47,0x21,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0xeb,0x7a,0x1b,0xb0,0x74,0xf, +0x6c,0x77,0x12,0x43,0x5f,0xe5,0xfc,0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x43,0xf3, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x2a,0x12,0x44,0x6e,0x12,0xb6, +0xf, 0x2, 0xb6,0xc4,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x1a,0x12,0x44,0x6e,0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0xc, 0x12,0x44,0x6e,0x2, 0xb6,0xbe,0x74, +0x1, 0x7a,0xb3,0x33,0xff,0x22,0xa, 0x3a,0x2e,0x34,0x0, 0x3, 0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0x5f,0x7a,0x61,0xfc,0x12,0x43,0xf3, +0x12,0x46,0x68,0xd2,0x3, 0x12,0x47,0x21,0x12,0x45,0x6b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x45,0x6b, +0x2, 0x13,0x96,0x12,0x47,0xf8,0xc2,0x5, 0x2, 0x45,0x51,0xd2,0x5, 0x12,0x45,0x51, +0x74,0x1, 0x22,0x12,0x45,0xcf,0x12,0x91,0x8, 0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0xc0,0xd5,0x12,0x44,0x91,0x74,0x1, 0x12,0x46,0x7, 0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x45,0x30,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x45,0x5a,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x45,0xcf,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x46, +0x7, 0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x45,0x5a,0x74, +0x81,0x7a,0xb3,0x39,0x2, 0x22,0x80,0x1d,0x12,0x45,0xcf,0x12,0x47,0xff,0x68,0x5, +0xc2,0x4, 0x12,0x45,0x5a,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x17, +0x15,0xe4,0x12,0x46,0x7, 0x20,0x93,0xe0,0x12,0x45,0xcf,0xa9,0xd1,0xcd,0xa9,0xc5, +0xea,0x74,0x2, 0x2, 0x46,0x7, 0x22,0x7c,0xab,0x7e,0xb3,0x39,0x2, 0xb4,0x81,0x38, +0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf, +0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, +0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87, +0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0x2, 0x22,0xd2,0x3, +0x80,0x12,0x30,0x3, 0xc, 0x12,0x47,0xff,0x68,0x7, 0xc2,0x3, 0xc2,0x4, 0x12,0x45, +0x5a,0x12,0x45,0xd6,0x30,0x17,0xeb,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb, +0xd2,0x3, 0x12,0xb6,0x57,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, +0xa9,0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74, +0x41,0x12,0x45,0x15,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda, +0xf8,0x22,0xe4,0x12,0x46,0xf0,0x12,0xb6,0x60,0x12,0x26,0x57,0x12,0xb6,0xdb,0x12, +0x43,0x65,0x12,0xb6,0x5, 0x12,0xb6,0x77,0x12,0x0, 0x4a,0x12,0xb6,0x83,0x12,0x7e, +0xa0,0x12,0xb6,0x93,0xd2,0xaf,0x12,0x47,0x8a,0x12,0xb8,0x1e,0x12,0x43,0xfa,0x12, +0x46,0x68,0x7e,0x8, 0x3, 0xf1,0x12,0xa9,0xa3,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34, +0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0xa9,0xd0, +0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x45,0x51,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75, +0xc2,0xc, 0xd2,0x3, 0x12,0x47,0x21,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1, +0x22,0xa2,0x3, 0xa9,0x97,0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x7e,0x34,0x36,0xe1, +0x30,0xd, 0x4b,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x4f, +0x9, 0x53,0x0, 0x3, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12, +0x47,0x7f,0x7a,0x27,0x2a,0x53,0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a, +0x27,0x2a,0x5a,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a, +0x5c,0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0x45,0xc, 0x7a,0x37,0x2a,0x62,0x22,0xa, +0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12, +0x43,0xeb,0x7c,0x7b,0x12,0x43,0xf3,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e, +0x24,0x0, 0xef,0x7e,0xf, 0x38,0xc0,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e, +0xf, 0x38,0xc0,0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x38,0xc0,0x79, +0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x38,0xc0,0x79, +0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8a,0x7e, +0x34,0x6a,0xd1,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e, +0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8e,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x12,0xc0,0xf8,0x12,0xc0,0xef,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x48,0x56,0x12,0x48,0x30,0x74,0x50,0x7a,0xb3,0x37,0xd0,0x7e,0x24, +0x3, 0x20,0x12,0x3f,0xcb,0xe4,0x12,0xc0,0x27,0x6d,0x33,0x7a,0x37,0x39,0x4, 0x22, +0x7e,0x73,0x2b,0x62,0x7a,0x73,0x37,0xcf,0x22,0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37, +0xca,0x7e,0x73,0x37,0xce,0xbe,0x73,0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12, +0x48,0x56,0x12,0x48,0x30,0x22,0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x7e,0x73, +0x2b,0x1f,0x7a,0x73,0x37,0xbe,0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x7e,0x73, +0x2b,0x14,0x7a,0x73,0x37,0xbf,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, +0x12,0x48,0xe8,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80, +0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x48,0xe8,0x40, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c, +0xdd,0x7c,0xbd,0x12,0x8d,0xb3,0x12,0x48,0x6e,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x37, +0xbe,0x12,0x49,0x4, 0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x12,0x48,0x30,0x7a, +0xd3,0x37,0xa6,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26, +0x33,0xbc,0xbe,0x22,0x30,0x3, 0x3, 0x12,0x48,0x6e,0xa2,0x4, 0x92,0x5, 0x12,0x49, +0xc3,0x2, 0x49,0x4, 0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x22,0x74,0x40,0x12, +0x6e,0x8b,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x48,0xf4,0x80,0x1c,0x74,0x1, 0x12, +0x49,0x47,0x7e,0x43,0x37,0xbb,0x7e,0x50,0x64,0xac,0x45,0x12,0x87,0xf8,0x7a,0xb3, +0x2b,0x1f,0x7e,0xf, 0x38,0xd9,0x12,0x4d,0x9b,0x12,0x49,0x4, 0x7e,0x73,0x2b,0x1f, +0x7a,0x73,0x37,0xbe,0x2, 0x48,0x6e,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14, +0x12,0xc0,0x42,0x7e,0xc0,0xa, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x1f,0x38,0xd9,0x12,0x90,0x58,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, +0x12,0x49,0xb7,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12, +0x49,0xb7,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x49,0xb7,0xb, +0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x38, +0xd9,0x12,0x8f,0xfb,0x7d,0x73,0x7e,0x1f,0x38,0xc8,0x69,0x31,0x0, 0x1a,0x7a,0x73, +0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, 0x1a,0xb, +0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x37,0xb1, +0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5,0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3, +0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a,0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35, +0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x31,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x4e,0x5f,0x6c,0xff,0x80,0x35,0x12,0x4c, +0x40,0x6c,0xee,0x80,0x19,0x7e,0x11,0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac, +0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x10,0x12,0x4c,0x47,0xe5,0x2e, +0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12,0x4c,0x56,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34, +0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xc5,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34, +0x10,0x0, 0x12,0x4c,0x7c,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x78,0x12,0x4c,0x40, +0x6c,0xee,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2a,0xbc,0xbe,0x38,0xe6,0xe5,0x2a, +0x12,0x4c,0x56,0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x60,0xe5,0x2a,0xbe,0xb1,0x2d, +0x50,0x35,0x12,0x4c,0x40,0x7e,0xe1,0x2a,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2d, +0xbc,0xbe,0x38,0xe6,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5,0x2d,0xa, 0x1b,0x6d,0x0, +0x9f,0x1, 0x12,0x4c,0x5a,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x3, 0x62,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x82,0xe5,0x2d,0xa, 0x1b,0x6d, +0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x1f,0x7, 0x6c,0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, 0x9d,0x15,0xad,0x12, +0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21, +0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xcc, +0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x7, 0x6c,0xff,0x80, +0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x60,0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10, +0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x60,0xe5,0x2a, +0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x62,0x2e,0x14,0x10, +0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x62,0xb, 0xf0,0xe5,0x2b,0xbc, +0xbf,0x38,0x9e,0x7e,0x73,0x37,0xb3,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14, +0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x5, 0x7d,0xe3,0x7a,0xe5,0x35, +0x7e,0x73,0x37,0xb4,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d, +0x1f,0x12,0x1f,0x5, 0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, 0xac,0xbf,0x49,0x45, +0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x34,0x0, 0x80,0x8, +0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xda, +0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x60,0xbe,0x45,0x35,0x28, +0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x60,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65, +0x3, 0x60,0x49,0x45,0x3, 0x62,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35, +0x3, 0x62,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x62,0xb, 0xf0,0xe5,0x2b, +0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x31,0x12,0x4d,0x9b,0xda,0x3b,0x22, +0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a, +0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f, +0x7, 0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x1f,0x5, 0x7e,0xa1,0x2c,0x74, +0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x4e,0x5f,0x7e,0x1f,0x38,0xf3, +0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x6, +0x7e,0x38,0x38,0x88,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x87,0x70,0xe, 0x7e,0xb3,0x38,0x85,0x70,0x8, +0x74,0x1, 0x7a,0xb3,0x38,0x87,0xa1,0x57,0x7e,0xb3,0x38,0x87,0x70,0x6, 0x74,0x1, +0x7a,0xb3,0x38,0x87,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0, +0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61, +0x59,0x12,0x23,0x9e,0x7a,0x35,0x2e,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0xa6,0x56, +0x75,0x2c,0x0, 0x80,0x16,0x12,0x4c,0x7c,0x12,0x4d,0x84,0xbe,0x35,0x2a,0x8, 0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x84,0x7a,0x35,0x2a,0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c, +0x38,0xe3,0x12,0x4d,0x93,0x40,0x25,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x1e,0x5, 0x1c, +0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c,0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20,0xb9,0x1b,0xfd,0x74,0x2, 0x12,0x0, +0x1e,0x12,0x4d,0x93,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x38,0xf2,0xe4,0x7a,0xb3,0x38, +0x87,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, 0x21,0x0, 0x7f,0x13,0x2d,0x35,0xb, +0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35,0x2a,0x22,0x12,0x4d,0xa5,0xb, 0x34, +0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x12,0xc1,0x3a,0x4c,0xaa, +0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c,0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4, +0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60, +0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e,0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, +0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc, +0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, +0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12,0x1f,0x7, 0x7f,0x1, 0xb, 0xc, 0x7e, +0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f,0x7, 0xbe,0x34,0x0, 0xfa,0x28,0x4, +0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, 0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d, +0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e,0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e, +0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27, +0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e, +0x34,0x0, 0x38,0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12, +0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, +0x12,0x4e,0x8d,0x80,0x2, 0xe4,0x22,0x12,0x4e,0x72,0x74,0x1, 0x22,0x12,0xc0,0x9f, +0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0x12,0x7f,0x6f,0x38,0x2, +0xe4,0x22,0x12,0x7f,0x67,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x4e, +0xb4,0x2, 0x4e,0x7d,0x7e,0xd7,0x2b,0xd, 0xbe,0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12, +0x7e,0xf8,0x12,0x4e,0xe0,0x7a,0xd7,0x2b,0xd, 0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e, +0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, 0x12,0x4f,0xaf,0x74,0x1, 0x22, +0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b,0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a, +0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x4e,0xe0,0x12,0xc0,0xe7,0x12,0x29,0x6f, +0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x20,0xde,0x7e,0xd0,0x7, 0x12,0x26,0x57,0x6c, +0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x12,0x4f,0xf0,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, +0x3c,0xbd,0x32,0x48,0xde,0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x7e,0xb3, +0x2a,0x73,0x7c,0x7e,0x12,0x7b,0x31,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49, +0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0x4f,0xf0,0x5c,0x7b,0x7a, +0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe, +0xd0,0x0, 0x58,0x88,0x12,0x7b,0x39,0x74,0x2, 0x12,0xc1,0xa, 0x12,0x50,0x51,0x74, +0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2a,0xfa,0x12,0x4e,0xe0,0xda,0x3b,0x22,0x74,0x2, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x12,0x50,0x51,0x74,0x2, 0x12,0x0, 0x1e,0x74, +0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x4f,0xc1,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, +0x94,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x2e,0x34,0x20,0x73,0x12, +0x91,0x6d,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x38,0xc0,0x2d, +0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x74,0xbc,0x6a,0x38,0xd6,0x22, +0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, +0x30,0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x4e,0xe0,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, +0xfd,0x7e,0xb3,0x37,0xe0,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc1,0xa, 0x12, +0x50,0xd4,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xe1,0x7e, +0xb3,0x37,0xe0,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x3f,0x67,0x80,0x7, 0xe4, +0x12,0x0, 0x1e,0x12,0x3f,0x49,0x12,0x3b,0x15,0x7e,0xb3,0x2a,0xfc,0x2, 0x50,0x51, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x3f,0xe9,0x7e,0xa3,0x2a,0x73, +0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x62,0x2a,0xdc,0xa, 0x26, +0x12,0x51,0x4b,0x93,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x50,0xca, +0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xde,0x6c,0xee,0x80,0x1a,0xa, 0x2e, +0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12, +0x50,0xca,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30, +0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba, +0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27,0x2a,0xfe,0x7e,0x29, +0xb0,0xa, 0x26,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xe9,0x7e, +0xa3,0x2a,0x73,0x7e,0x63,0x2a,0x74,0x6c,0xee,0x80,0x1f,0xa, 0x2e,0x9, 0x72,0x2a, +0xdc,0xbe,0x70,0x1c,0x50,0x12,0xa, 0x27,0x12,0x51,0x4b,0x93,0x7c,0x7b,0x7e,0xb3, +0x2a,0xfb,0xa, 0x27,0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xdd,0x6c,0xee, +0x80,0x17,0xa, 0x3e,0x9, 0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a, +0xfb,0xa, 0x27,0x19,0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e, +0x30,0xe, 0xac,0x3e,0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11, +0xf8,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0x73,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7a,0xb3,0x34,0xc4,0x7c,0xbf,0x6c,0x77,0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x51,0x4f,0x93,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff, +0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0xca, +0xf8,0x6c,0xaa,0x6d,0x33,0x7e,0x24,0x7f,0xff,0x7e,0xf0,0x1, 0x80,0x32,0xa, 0x1f, +0x7e,0xb3,0x2a,0x6e,0xa, 0xb, 0x2d,0x1, 0x3e,0x4, 0x49,0x10,0x4, 0xfc,0xbe,0x14, +0x3, 0xe8,0x8, 0x1a,0xb, 0xa0,0xbd,0x13,0x8, 0x4, 0x7d,0x31,0x80,0x10,0xbd,0x12, +0x58,0xc, 0x7d,0x21,0xbe,0x24,0x0, 0x0, 0x18,0x4, 0x7e,0x24,0x0, 0x1, 0xb, 0xf0, +0x7e,0xb3,0x2a,0x6f,0xa, 0xb, 0x1b,0x4, 0xa, 0x1f,0xbd,0x10,0x48,0xc0,0x7e,0xb3, +0x34,0xa1,0x7a,0xb3,0x36,0xf3,0x7a,0xa3,0x36,0xf7,0xe4,0x7a,0xb3,0x36,0xf5,0xbe, +0xa0,0xb, 0x78,0x18,0x9d,0x32,0xbe,0x34,0x5, 0xdc,0x58,0x10,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x1, 0x5e,0x58,0x6, 0x74,0x1, 0x7a,0xb3,0x34,0xa1,0x7e,0x73,0x34,0xa1, +0xbe,0x70,0x0, 0x28,0x3e,0x6c,0xff,0x80,0x35,0x7c,0xbf,0x12,0x97,0xfc,0x60,0x22, +0x74,0x22,0x7a,0xb3,0x36,0xf4,0x7e,0xb3,0x34,0xc4,0x4, 0x12,0x51,0x57,0x7e,0x73, +0x34,0xc4,0xbe,0x70,0x5, 0x40,0x15,0xe4,0x7a,0xb3,0x34,0xc4,0x7a,0xb3,0x34,0xa1, +0x80,0xa, 0xe4,0x12,0x51,0x57,0x74,0x33,0x7a,0xb3,0x36,0xf5,0xb, 0xf0,0x12,0x52, +0x66,0x38,0xc6,0xda,0xf8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xca,0xd8,0xca, +0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x3c,0xe4,0x7a,0xb3,0x1f,0x58,0xe5,0x1d, +0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60,0xc, 0x12,0x8c,0x87, +0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x10,0x6d,0x88,0x7a,0x87,0x37, +0xfd,0x61,0xa0,0x12,0x93,0x91,0x60,0x12,0x7e,0x34,0x62,0xe, 0x12,0x87,0xc4,0x7a, +0x87,0x37,0xf3,0x12,0x54,0x2b,0x7a,0x87,0x37,0xfd,0x7e,0x87,0x37,0xf3,0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x7b,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x52,0x7c,0xbd, +0x7c,0x7e,0x12,0x55,0xb9,0x7d,0x93,0x7e,0x87,0x37,0xfd,0xbd,0x89,0x50,0x4, 0x7a, +0x97,0x37,0xfd,0x7e,0x87,0x38,0x3c,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x3c,0xe5, +0x1d,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x37,0xff,0x12,0x54,0x4e,0x50,0x7, 0x12, +0x54,0x45,0xd2,0x3, 0x80,0x2f,0x7e,0x8, 0x37,0xff,0x7e,0x18,0x1f,0x52,0x12,0x57, +0x0, 0x50,0x22,0x80,0x10,0x12,0x54,0x2b,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f,0x52, +0x12,0x91,0x86,0x50,0x10,0x12,0x54,0x45,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52, +0x12,0x93,0x6b,0xd2,0x3, 0xb, 0xf0,0x12,0x52,0x66,0x38,0x80,0x30,0x3, 0x37,0x6c, +0xff,0x80,0x20,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x58,0x12,0x54, +0x4e,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x54, +0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdb,0x75,0x1d,0x0, 0x7e,0x34,0x62,0xe, 0x12, +0x23,0x9e,0x7a,0x37,0x37,0xf3,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, 0xac,0x67,0xb, +0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x37,0xff,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x37,0x37,0xf3,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93,0xa, 0x3b,0xbe, +0x37,0x37,0xfd,0x38,0x40,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37,0x38,0x3c,0x38, +0x34,0x90,0x60,0x51,0x12,0x54,0x33,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, +0x24,0x90,0x60,0x50,0x12,0x54,0x33,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, +0x14,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x54,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf4,0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0xa2,0x3, 0x92,0x10,0x12, +0x56,0xe9,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xb, 0x70,0x1b,0x7e, +0xb3,0x28,0xa8,0x70,0x15,0x12,0xc1,0x2a,0x68,0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0, +0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x51,0x5f,0x22,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0xd5,0x26,0xfa,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x7c,0xbd, +0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f, +0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0, +0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, +0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38, +0xc9,0xa2,0x4, 0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28,0x99, +0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73, +0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f, +0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, +0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x55,0xa6,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3, +0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e, +0xb3,0x26,0x83,0x70,0x40,0x12,0x8f,0xe3,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x55,0xa6,0x49,0x2, +0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49, +0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, +0xf0,0xbc,0x7f,0x38,0xc9,0x12,0xb1,0x8e,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28, +0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28, +0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x55,0xaf,0x49,0x25, +0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x0, 0xbe,0x37,0x28,0x9d,0x8, +0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdc,0x6c, +0xff,0x80,0x9, 0x12,0x55,0xaf,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf2,0xda,0x79,0xda,0xd8,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0x7c, +0xbf,0x12,0x37,0x6f,0x74,0x2, 0xac,0xbf,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f, +0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c,0xcc, +0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c, +0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14, +0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12, +0x20,0xde,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a, +0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1c,0x75,0x26,0x0, +0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56,0xd3,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf1,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xdf,0x7c,0xec, +0x80,0x23,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80,0xa, 0x12,0x91,0xd5, +0x70,0xd, 0x12,0x56,0xd3,0xb, 0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5, +0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd8,0x1a,0x3c,0xb, 0x34,0x7c,0xe7, +0x80,0x1c,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56, +0xd3,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf1,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73, +0x2a,0x6e,0xbc,0x7e,0x18,0xdc,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x21,0x75,0x26, +0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xa, 0x12,0x91,0xd5,0x70,0xd, 0x12,0x56,0xd3,0xb, +0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e, +0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd7,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, +0xda,0x3b,0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35,0x24,0x22,0x12,0x57, +0x32,0x12,0x51,0x9f,0x7a,0xb3,0x2a,0xc, 0x22,0x30,0x10,0x13,0x12,0xc1,0x1a,0x68, +0x6, 0x7e,0xb3,0x39,0xb, 0x60,0x8, 0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x37,0xfb,0x22, +0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f, +0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x54,0x52,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76, +0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9, +0xc3,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34,0xa2,0x6c,0x33,0x80,0x3d,0x7e, +0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc, +0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32, +0x12,0x35,0x67,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3, +0x34,0xa2,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf, +0x2, 0x57,0x83,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac, +0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c, +0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26, +0xfb,0xa, 0x28,0xa, 0x31,0x12,0x35,0x67,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x35, +0x67,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0, +0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3e,0xbe,0xb0,0x0, 0x28,0x12,0x14, +0x7a,0xb3,0x35,0x3e,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2a, +0x5a,0x7e,0xb3,0x36,0xec,0x70,0x58,0x7e,0xb3,0x39,0xb, 0x70,0x52,0x7e,0xb3,0x36, +0x71,0x70,0x4c,0x7e,0x37,0x37,0xfd,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28, +0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f, +0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3, +0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, +0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x35,0x3e,0xda, +0xf8,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e,0x7e,0xf3,0x2a,0x6d,0xac,0xf7, +0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x20,0xde,0x7e,0xb3,0x37,0xb7, +0xb4,0x1, 0x64,0x7e,0x73,0x37,0xb8,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c, +0x12,0x26,0x57,0x12,0x28,0x62,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49, +0x33,0xd, 0xc8,0x12,0x21,0x0, 0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14, +0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34, +0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xb8, +0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, +0xd, 0xc8,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0x4, 0xe4,0x2, 0x58,0xe8,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0x12,0x68,0x10,0x12,0x7d,0x94,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0x74,0x12,0xb6,0xe2, +0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x91,0x18,0x12,0x47,0x2c, +0x12,0x28,0x62,0x50,0xde,0x12,0xab,0xdb,0x12,0x75,0xe9,0x7e,0xb3,0x37,0x5, 0xb4, +0x1, 0x4, 0xe4,0x12,0x58,0xe8,0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x5e,0xaa,0x40, +0xc2,0x12,0x88,0x5f,0x12,0x5e,0xaa,0x40,0xba,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x0, 0x6e,0x12,0x5f,0x2f,0x12,0x5f,0x83,0x12,0x5b,0x94,0x12,0x96,0x24,0x12,0x5e, +0xc2,0x12,0x5f,0xcd,0x12,0xaa,0xe6,0x12,0x87,0x74,0x7e,0xb3,0x36,0xf1,0xbe,0xb0, +0x88,0x68,0x3, 0x12,0x59,0x77,0x12,0x67,0xfa,0x12,0x26,0x66,0x12,0x62,0xa5,0x80, +0x82,0x12,0x2f,0xee,0x2, 0x58,0xdc,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x12,0x35, +0xd3,0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, +0x7e,0xb3,0x2a,0x7, 0x70,0x8, 0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0x61,0x6b,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x28,0x80,0x4, 0x7e,0x68,0x32,0xea,0x7f,0x6, 0x12,0x7e,0xef, +0x7e,0x73,0x2a,0x4, 0x7a,0x6b,0x70,0x6c,0xdd,0x61,0x1c,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x5e,0x3d,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x61,0x1a,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x61,0x1a,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x9e,0xec,0x50,0x2, 0x61,0x1a,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3, +0x2a,0x9, 0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xd6,0x6d,0x22,0x74,0x1, 0x12,0x7f,0xd4,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xe0,0x6d,0x22,0x74,0x10,0x12,0x7f,0xd4,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xd6,0xf5,0x25,0x9, 0xb3,0x32,0xe0,0xf5,0x26,0xa, 0x3c,0x12,0x5e, +0x3d,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xd6,0x19,0xb3,0x32,0xe0,0x12, +0x35,0xd3,0x7e,0xb3,0x2a,0x64,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd, +0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac, +0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x2c,0x75,0x27, +0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x6a,0x54,0xf, +0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x66,0x49,0xa3,0x33,0x68,0x80,0xc, 0x5, 0x27, +0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, 0xff,0x5e,0xa4, +0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5, +0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0, +0xe5,0x28,0xa, 0x5b,0x12,0xb9,0x5c,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e, +0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13, +0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26, +0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x4d, +0xbc,0x7d,0x28,0x2, 0x21,0xbb,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x31, +0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38, +0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0xa, 0xb2,0xe, 0x12,0x7e,0x81,0x74,0x1, 0x12,0x58, +0xe8,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x5e,0x61,0xe4,0x7a,0xb3,0x2a, +0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, 0xe4,0x12,0x58,0xe8,0x12, +0x5f,0xc2,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x66,0x12,0x20,0xb9,0x1b, +0xfd,0x4c,0xff,0x78,0xc, 0x12,0x73,0xe5,0x7e,0x8, 0x33,0x66,0x74,0xff,0x12,0x20, +0xde,0xda,0x3b,0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70, +0xff,0x12,0x5e,0x8b,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f, +0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe2,0x7e,0x73,0x2a,0x2, +0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x2, 0xa1,0xab,0x6c,0xaa,0x80,0x10, +0x7e,0x44,0x7f,0xff,0x12,0x5e,0x95,0x79,0x40,0x0, 0x14,0x12,0x5e,0x45,0xb, 0xa0, +0x12,0x5e,0x25,0x38,0xeb,0xa1,0xab,0x7e,0xb3,0x34,0x4f,0x70,0x3d,0xbe,0x70,0x0, +0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12, +0x5e,0x95,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30, +0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0, +0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xce,0xa1,0xab,0x6c,0xaa,0x80,0x17,0x12,0x5e, +0x57,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe4,0x6c,0xaa,0x80,0x41,0x6c,0xff, +0x80,0x36,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe, +0x34,0x7f,0xff,0x68,0x21,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x18,0x12,0x5e, +0x35,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x5e,0x4e, +0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xc5,0xb, 0xa0,0x7e, +0xb3,0x34,0x4f,0xbc,0xba,0x38,0xb7,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x9, 0xb3,0x1f, +0x46,0xb4,0xff,0x1d,0x6c,0xff,0x80,0x14,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x9, 0x12,0x5e,0x4e,0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38, +0xe7,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xd3,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac, +0x7a,0x49,0x43,0x28,0xae,0x12,0x5e,0x35,0x59,0x42,0x15,0x76,0x49,0x33,0x28,0xb0, +0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xde,0x7e,0x34, +0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e,0x7e,0x73, +0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80, +0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0x12,0x5e,0x2d,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x5e,0x8b,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x5e,0x45,0xb, 0xa0,0x7e,0x63,0x2a,0x2, 0xbc,0x6a, +0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68, +0x13,0x12,0x5e,0x57,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c, +0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x7e,0xf3,0x2a,0x2, 0x7a, +0xf3,0x34,0x4f,0x6c,0xaa,0x80,0x66,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2b, +0x12,0x5e,0x9f,0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0xa, 0x3a,0x2d,0x3d, +0x7d,0x2c,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x2e, +0xa5,0xbb,0x0, 0x2a,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x23,0x12,0x5e,0x9f,0xbe,0xb0, +0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30, +0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0xa, 0x3a, +0x2d,0x3d,0x7d,0x2c,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0x12,0x5e,0x25, +0x38,0x95,0xda,0xf8,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0x90,0x60,0x99, +0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0xb0,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40,0x0, 0x28,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x22,0x6c,0xaa,0x80,0x20,0x74,0x3, 0x12,0xa9,0x99,0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0xa, 0x12,0x5e,0x57,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79, +0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x22,0x7e,0x50,0x9, 0xac,0x5a, +0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, +0x3a,0x2d,0x3d,0x7d,0x2c,0x29,0xb1,0x0, 0xa, 0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91, +0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x9b,0xdf,0x28,0x2, 0xd2,0x3, 0xa2, +0x3, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x3, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x5f,0xc2,0xca,0x59,0x7e,0x18,0x28, +0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xb9,0x1b,0xfd,0x90,0x61,0x35,0xe4,0x93,0xbe, +0xb0,0x0, 0x28,0x28,0x6c,0xff,0x80,0x1f,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae, +0x12,0x80,0x16,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12, +0x64,0xdb,0x12,0xab,0x9b,0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xdc,0xda,0xf8,0x22,0x2, +0x5f,0x32,0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe, +0x12,0x37,0x6f,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x23,0x7e,0xc4, +0x0, 0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0xb, +0xf0,0xb, 0xe0,0x12,0x9c,0xf6,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, +0xda,0x79,0x22,0x12,0x9d,0xda,0x2, 0x5f,0x89,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, +0x38,0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x35,0x40, +0x28,0x14,0x7e,0xb3,0x35,0x40,0x4, 0x7a,0xb3,0x35,0x40,0x7a,0xa3,0x2a,0x2, 0x80, +0x5, 0xe4,0x7a,0xb3,0x35,0x40,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a, +0xb, 0x22,0x90,0x60,0x99,0xe4,0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x12,0x68,0x38, +0x2, 0x5f,0xd3,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x34,0xa2,0x4c,0xaa,0x78, +0x3, 0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x34,0xad,0x7e, +0x73,0x34,0xae,0xbe,0x73,0x34,0xad,0x28,0x4, 0x7a,0x73,0x34,0xad,0x22,0xff,0xff, +0x70,0x8f,0x0, 0xff,0x53,0xac,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x45,0x37,0x32,0x1, 0xc3,0x1, 0x45,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x18,0xe7,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0x18,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, +0x2, 0x1, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x37,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x0, 0x4, 0x5a,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x65,0x40,0xd, 0x18,0x25,0x19,0x28,0x6, 0x80,0x19,0x28,0x6, +0x80,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x32,0x32,0x1, 0xec,0x2, 0x50,0x0, +0xe1,0x0, 0xe1,0x5, 0x0, 0x37,0x37,0x1, 0xba,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0x96,0x1, 0x18,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, 0x68,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15,0x0, 0x1, 0x54,0x1, 0x0, 0x18, +0x1, 0x53,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0x10,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x37,0x2, 0x5a,0x65,0x20,0x28,0x2, 0x2c,0x2e,0x20,0x3c, +0x2, 0x5b,0x66,0x20,0x46,0x2, 0x42,0x49,0x30,0x37,0x2, 0x5a,0x65,0x20,0x37,0x2, +0x5a,0x65,0x20,0x37,0x2, 0x5a,0x65,0x20,0x37,0x2, 0x5a,0x65,0x20,0x4, 0x5, 0x28, +0x29,0x2a,0x2b,0x2c,0x4, 0x0, 0xd2,0x2, 0x30,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x0, 0x78,0x0, 0x78,0x14,0x8, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, 0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x8, 0x37,0xf3,0x12,0x62,0xdf,0x7e,0x8, 0x37,0xfb, +0x12,0x62,0xdf,0x12,0x62,0xf4,0x12,0x62,0xfb,0x2, 0x62,0xbc,0x7e,0x37,0x37,0xf3, +0xbe,0x34,0x0, 0x0, 0x28,0x18,0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x50,0xf, 0x7e, +0xb3,0x37,0x31,0x70,0x9, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0x22,0xb, +0xa, 0x30,0xe5,0x4e,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33, +0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x2b,0xb7,0x2, 0x62,0xdf,0x7e,0x8, 0x38,0xe6,0x2, +0x62,0xdf,0x6d,0x33,0x7a,0x37,0x38,0x83,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e, +0xb3,0x2a,0x3, 0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28, +0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68, +0x17,0x7e,0x47,0x2b,0xb7,0x4d,0x44,0x78,0xf, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3, +0x38,0x85,0x7a,0xb3,0x37,0x6, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e, +0x37,0x2b,0xb7,0x7a,0x37,0x2f,0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37, +0x2b,0xb7,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37, +0x2f,0x98,0x7e,0x27,0x2f,0x9a,0x12,0x64,0x1a,0x81,0x13,0x80,0x0, 0x12,0xbd,0xdd, +0x81,0x13,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57, +0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xbd,0x78,0x12,0x64,0x16,0x74, +0x1, 0x7a,0xb3,0x2f,0x80,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88, +0x9e,0x27,0x2f,0x90,0x7e,0x14,0x62,0x8a,0x12,0x64,0xd3,0xbd,0x23,0x38,0x13,0x7e, +0x27,0x2f,0x96,0x9e,0x27,0x2f,0x8e,0x7e,0x14,0x62,0x8c,0x12,0x64,0xd3,0xbd,0x23, +0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a, +0xc7,0x2f,0x98,0x7a,0xd7,0x2f,0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d, +0x2d,0x7e,0x17,0x2b,0xbb,0x7e,0x7, 0x2b,0xbd,0x12,0x66,0xce,0xa, 0x2b,0x7e,0x73, +0x2f,0x7f,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0x64,0x16,0x7a,0xc7,0x2b,0xbb,0x7a, +0xd7,0x2b,0xbd,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24, +0x12,0x67,0xca,0x7d,0x31,0x12,0x85,0xfd,0x2, 0x64,0x2b,0x7e,0x3, 0x2f,0xa8,0xbe, +0x0, 0xf0,0x50,0x2, 0x81,0xc4,0x81,0xb9,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0, +0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34, +0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b, +0xc1,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0x66,0xce,0x7c,0x1b,0x7e,0x3, +0x2f,0x7f,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b, +0xbf,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x1f,0x8c,0x7e,0x34,0x1f,0x34,0x7e,0x30, +0x4, 0xac,0x39,0x2e,0x14,0x2b,0xbf,0x74,0x4, 0x12,0x1f,0x8c,0xb, 0x80,0x7e,0x3, +0x2f,0xa8,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8, +0x7e,0x3, 0x2f,0x7f,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec, +0x40,0x2, 0x81,0x38,0x22,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e, +0x14,0x61,0x49,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e, +0x14,0x61,0x43,0x12,0x83,0x62,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22, +0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83, +0x2a,0x70,0x12,0x87,0xd4,0xbe,0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d, +0x2e,0x7e,0x14,0x61,0x47,0x12,0x64,0xd3,0x12,0x66,0x10,0x90,0x61,0x45,0x12,0x66, +0x7, 0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0x12,0xc1,0x3a,0xbe,0xa0,0x0, 0x28, +0x32,0x7d,0x14,0x9e,0x14,0x0, 0x3f,0xbd,0x1e,0x38,0x13,0x12,0x66,0xb8,0x40,0xe, +0x12,0x64,0xc5,0x12,0x65,0xfa,0x48,0x32,0x7f,0x10,0x1b,0x1c,0x80,0x2c,0x12,0x66, +0xb8,0x50,0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x64,0xcb,0x12,0x66,0x10,0x7d, +0x1f,0x80,0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x66,0xb1,0xbd,0x5e,0x38,0x16,0x12,0x64, +0xc5,0x12,0x65,0xfa,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10, +0x6d,0x0, 0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x66,0xb1,0xbd,0x5e,0x28, +0x68,0x7d,0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d, +0x35,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d, +0x22,0x7e,0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1e,0xfc,0x12, +0x66,0x14,0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, +0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x66,0x7, +0x58,0x4, 0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76, +0x7c,0x65,0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x36,0x69,0x7a, +0x73,0x36,0xdf,0x7e,0x27,0x38,0xd6,0x7e,0x14,0x61,0xc8,0x12,0x64,0xd3,0x1e,0x34, +0xbd,0x32,0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x14,0x61,0xc8,0x12,0x64, +0xd3,0xbd,0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x36,0x67,0x12,0x67,0x62,0x7e,0x37,0x36, +0x6f,0xbd,0x32,0x50,0x4, 0x7a,0x27,0x36,0x6f,0x12,0xc1,0x12,0x38,0xa, 0x12,0x8f, +0xf3,0x38,0x5, 0x12,0x8f,0xeb,0x28,0x3d,0x12,0x67,0x69,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x36,0x67,0x4, 0x7a, +0xb3,0x36,0x67,0x7e,0x73,0x36,0x67,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3, +0x36,0x67,0x12,0xc0,0x95,0x7a,0xb3,0x36,0xdc,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x67, +0x7d,0x32,0x2, 0xad,0xac,0x2, 0x66,0xa8,0x12,0x67,0xc0,0xe4,0x7a,0xb3,0x36,0x75, +0x22,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4, +0x60,0xd1,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0xbd,0x1e,0x22,0x7d,0x51, +0x7d,0x12,0x9d,0x35,0x12,0x21,0x0, 0x7c,0xa7,0x12,0x67,0xeb,0x7c,0xb7,0xbc,0xba, +0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x67,0x15,0x50, +0x21,0x7e,0x54,0x62,0x5a,0x12,0x67,0x15,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x64, +0xd3,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x5e,0x12,0x64,0xd3,0xbd,0x32,0x28,0x2, +0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12, +0x66,0x1b,0x2, 0x67,0x25,0x7e,0xb3,0x36,0x69,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36, +0x71,0x7e,0xb3,0x36,0xdf,0x70,0x3, 0x12,0xaf,0x2f,0x7e,0xb3,0x36,0x71,0xb4,0x1, +0xc, 0x74,0x3, 0x12,0x67,0x59,0x12,0x23,0x9e,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x67, +0x59,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x34,0xae,0x7e,0x34,0x61, +0x5b,0x22,0x74,0x2, 0x7a,0xb3,0x36,0x69,0x22,0x7e,0xb3,0x36,0x75,0xb4,0x1, 0x3, +0x2, 0x67,0x62,0x7e,0xb3,0x36,0xdb,0x4, 0x7a,0xb3,0x36,0xdb,0x7e,0xb3,0x36,0x69, +0xb4,0x2, 0x18,0x7e,0xb3,0x36,0xda,0x4, 0x7a,0xb3,0x36,0xda,0xb4,0x1, 0x6, 0x74, +0x1, 0x7a,0xb3,0x36,0xdb,0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x73,0x36,0xda,0xbe, +0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x75,0x12,0x67,0x62,0x12,0xaf,0x2f, +0x12,0x67,0xc0,0x7e,0x73,0x36,0xdb,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x67,0xc0,0x22, +0xe4,0x7a,0xb3,0x36,0xdb,0x7a,0xb3,0x36,0xda,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0, +0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xbf,0x12,0x67,0xf2,0x59,0x25,0x2b, +0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a,0xb3,0x2f,0xa8,0x22,0x7d,0x31,0x9d,0x30,0x2, +0x21,0x0, 0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x73,0x28,0x93,0x7a,0x73, +0x28,0x94,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22, +0x12,0xc0,0x25,0x12,0x63,0x2, 0x7a,0x37,0x39,0x4, 0x12,0x69,0x87,0x12,0x28,0x48, +0x2, 0x68,0x23,0x12,0x69,0x84,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3, +0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca,0x79,0x7e,0x13,0x2a,0x2, 0x7e,0x78, +0x29,0xbc,0x12,0x69,0x84,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0x19, +0x7e,0xa0,0x5, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12, +0x68,0x23,0x21,0x6d,0xbc,0x20,0x50,0x3, 0x12,0x68,0x23,0x6c,0x0, 0x21,0x62,0x7e, +0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x21,0x60,0xa, +0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x21,0x43,0x12, +0x69,0x7a,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x21,0x0, 0x7d,0xd3,0x7e,0x70,0x4, +0xac,0x79,0x49,0x23,0x35,0x43,0x12,0x69,0x70,0x9d,0x32,0x12,0x21,0x0, 0x7d,0xc3, +0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x69, +0x7a,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x43,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28, +0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, 0x7a,0xb3,0x34,0x89, +0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3, +0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80,0x53,0x7e,0x50,0x9, +0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x35,0x41,0x49, +0x22,0x29,0xa, 0x59,0x27,0x35,0x43,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x34,0x88,0x80, +0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34, +0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, +0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x41,0x12,0x69,0x70,0x59,0x32,0x35,0x43, +0xb, 0x0, 0x90,0x60,0x99,0xe4,0x93,0xbc,0xb0,0x28,0x2, 0x1, 0x6f,0xda,0x79,0x22, +0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x41,0x22,0xa2,0x8, 0x22,0x7e,0x34,0xd, 0xac,0x12,0x26,0x5b,0x12,0x7a, +0x2d,0x12,0x69,0xab,0x2, 0x69,0x97,0x30,0xf, 0x10,0x12,0x6e,0x8f,0x50,0x3, 0x12, +0x6f,0x6e,0x12,0x6a,0x50,0x12,0x69,0xd1,0xc2,0xf, 0x22,0x7e,0xb3,0x2b,0x1e,0x70, +0x1f,0x12,0x26,0x57,0x12,0x2f,0xf4,0x50,0xfb,0x12,0x6a,0x50,0x12,0x88,0x17,0x20, +0xf, 0x3, 0x12,0x69,0xd1,0x74,0x2, 0x7a,0xb3,0x2b,0x1e,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12, +0x87,0x56,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0xc0,0xcc,0xf5,0x2a, +0x7e,0x73,0x2b,0xf, 0xbe,0x71,0x2a,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x91,0x67,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x44,0x6d,0x22,0x7a,0x1f,0x37,0x40,0x7c,0xbc,0x12,0x6c,0x20,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x62,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x6d,0x13,0xda,0x3b,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12, +0xc0,0x1b,0x7a,0x55,0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d, +0x7f,0x3, 0x7e,0x1d,0x2a,0x12,0x79,0x7a,0x12,0xc0,0x9f,0x12,0xc0,0x42,0x75,0x2e, +0x0, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0xc1,0x22,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6a,0xd4,0x12,0xb3,0x89,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x30,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12, +0x7b,0x20,0x7e,0x35,0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30, +0x38,0xdc,0x5, 0x2e,0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b, +0x1d,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x6d,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d, +0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x6e,0x8f,0x50,0x7c,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x6e,0x12,0x6b,0xff,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x8, 0x12,0x6d,0x34,0x38,0xea,0x6c,0xcc,0x80,0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a, +0x12,0x6b,0xff,0x75,0x3b,0x0, 0x80,0x27,0x7e,0xb3,0x37,0xb1,0xbe,0xb1,0x3b,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x60,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x62,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e, +0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34,0x10, +0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x50,0x12, +0x6c,0x8, 0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70, +0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a, +0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, +0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x7f,0x78,0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe, +0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x6b,0xf6,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d, +0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80, +0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x35,0x7a,0x37,0x25,0xba,0x7e,0x35, +0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12, +0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25, +0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac, +0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37, +0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22, +0xca,0x3b,0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b, +0xf, 0xf5,0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xb9, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x60,0x7e,0x8, 0x25,0x2a, +0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbc,0x12,0xb3,0x54,0x74,0x1, 0x7a,0xb3,0x2b,0x1d, +0x74,0x5, 0xac,0xbc,0x12,0xc0,0x39,0x74,0x5, 0xac,0xbc,0x12,0x6f,0xff,0x74,0x5, +0xac,0xbc,0x12,0xc0,0x30,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0xc2,0x3, 0x12,0xc0,0xcc,0x12,0x6d, +0x13,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, +0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x6a,0xd4,0x12, +0xc0,0x1b,0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xa8,0xef,0x12, +0xa9,0xc9,0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3, +0x2b,0x14,0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39, +0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, +0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd, +0xda,0x3b,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6e,0x29,0x30,0xc, 0xa, 0x12,0xaf,0x1d, +0x30,0x3, 0x4, 0xe4,0x12,0xa, 0x66,0x30,0x3, 0x9, 0x12,0xae,0xd2,0x12,0x8d,0xef, +0x2, 0x8c,0x90,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f, +0x50,0x7e,0x14,0x22,0xe2,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x7a,0x1d,0x2c,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f, +0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c,0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x34,0x6c, +0xcc,0x80,0x4f,0x12,0x6e,0x19,0x40,0x48,0x12,0x6e,0xf, 0x50,0x43,0x74,0x2, 0xac, +0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x0, 0x7d,0x3, 0x7d, +0x31,0x12,0x21,0x0, 0xbd,0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e, +0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d, +0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34, +0xb, 0xc0,0x12,0x6d,0x34,0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12, +0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, +0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12, +0x6e,0x19,0x40,0x8, 0x12,0x6e,0xf, 0x50,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x12,0x6d, +0x34,0x38,0xec,0xb, 0xd0,0xbe,0xd0,0x3, 0x50,0x2, 0xa1,0x68,0xda,0x3b,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xb9,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x12,0x6e,0xa0,0x7a,0x37,0x2b,0x1b, +0x22,0x7e,0xa3,0x0, 0x4f,0xbe,0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xec,0x68,0x42, +0x74,0x5, 0xa4,0x12,0xc0,0xc3,0x12,0x6e,0x83,0x12,0xc0,0x39,0x12,0x6e,0x83,0x12, +0xc0,0x30,0x12,0x6e,0x8f,0x50,0x9, 0x7e,0xb3,0x0, 0x4f,0x12,0xb3,0x54,0x80,0x6, +0x12,0x6e,0x83,0x12,0x6f,0xff,0x12,0x6e,0x29,0x12,0x6f,0xf8,0x7e,0x73,0x2b,0x14, +0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x4f,0x7a,0x73, +0x3, 0xec,0x22,0x7e,0xa3,0x0, 0x4f,0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x20,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xb2,0x70,0x2, 0xc3,0x22,0xd3,0x22, +0x7e,0x23,0x2b,0xf, 0x7e,0x33,0x37,0xcd,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x0, 0xac,0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, +0xa, 0x7e,0x63,0x2b,0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe, +0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61, +0x1b,0xe4,0x93,0x7c,0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73, +0x2b,0x10,0x80,0x9, 0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b, +0x10,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c, +0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x38,0xc0,0x69,0x51,0x0, +0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d, +0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, +0x1f,0x58,0x7e,0xb, 0x70,0x7a,0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b, +0x62,0x29,0x70,0x0, 0x1, 0x7a,0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b, +0x20,0x12,0x6e,0x29,0x12,0x6f,0xf8,0xd2,0x3, 0xc2,0x4, 0x2, 0x48,0xf4,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x4f,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6f,0xea,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0xc0,0x76,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0xc0, +0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6f,0xea,0xca,0x39,0x7e, +0x23,0x0, 0x4f,0x7e,0x30,0x38,0xac,0x23,0x12,0xc0,0x76,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x8c,0xac,0x23,0x12, +0xc0,0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6f,0x42,0x7e,0x34,0x0, 0x38,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x3, 0x8b,0x9, +0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0x7e,0x37,0x3, 0xed,0xb, 0x34,0x7a,0x37, +0x3, 0xed,0x7e,0x37,0x3, 0xef,0xbe,0x37,0x3, 0xed,0x28,0x3, 0x2, 0x70,0x23,0x22, +0x2, 0x70,0x8, 0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x70,0x20,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b, +0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e, +0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a,0xb3,0x2b,0x74,0x7a,0xb3,0x2b, +0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x25,0xee,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2, +0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93, +0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74,0xbc,0x7e,0x28, +0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3,0x2a,0x6e,0x7a, +0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3,0x2a,0x74,0x90, +0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9,0xe4,0x93,0xa, +0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a,0xa, 0x3e,0x9d, +0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a,0x78,0x90,0x60, +0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f,0xca,0x39, +0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12,0x20,0xb9,0x1b, +0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x2b,0x21,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x72,0x92,0x12,0x79,0x31,0x90,0x60, +0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76,0x12,0x70,0x59, +0x74,0x1, 0x12,0x3d,0xac,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x2, 0x12,0x73, +0xf1,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a,0xb3,0x2b,0x4, +0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0x9e,0x7a,0x37,0x2b, +0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x9, 0x7e, +0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a,0xb3,0x2b,0x62, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4,0x93,0x7a,0xb3, +0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x2b, +0xf, 0x12,0x6e,0x29,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61, +0x22,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12, +0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3, +0x2b,0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61, +0x20,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b, +0x14,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d, +0x7a,0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64, +0xe4,0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61, +0x7e,0x34,0x20,0x5b,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x12,0xc0,0xd5,0x12,0x72,0xf4,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x72,0xdb,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x72,0xdb,0xa, +0x1b,0x2e,0x14,0x2a,0x7c,0x12,0x72,0xe8,0xe5,0x25,0x12,0x72,0xdf,0xa, 0x1b,0x2e, +0x14,0x2b,0x23,0x12,0x72,0xe8,0xe5,0x24,0x2, 0x20,0xde,0x7e,0x34,0x0, 0x2, 0x12, +0x20,0xde,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, +0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a, +0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x73,0x20,0x38,0xef,0x12,0x73,0x20,0x68,0x7, +0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22, +0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x12,0x77,0xfd,0x12,0x70,0xa7,0x12,0x0, +0xa, 0x12,0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8, +0x7e,0x1f,0x6, 0xf4,0x12,0x79,0x9d,0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e, +0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12, +0x79,0x7a,0x12,0x79,0x2e,0x12,0x25,0x45,0x12,0x73,0xa7,0x12,0x73,0x7f,0x2, 0x73, +0x71,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x12, +0x73,0xe5,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, 0x28,0xae,0x74,0xff,0x12,0x20, +0xde,0x12,0x9f,0xe3,0x7e,0x8, 0x29,0xbc,0x12,0x5e,0x61,0x7e,0x8, 0x2a,0x2, 0x7e, +0x34,0x0, 0xb, 0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4, +0x12,0x20,0xde,0x90,0x60,0x9c,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74, +0xff,0x12,0x20,0xde,0x90,0x60,0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26, +0xb4,0x74,0xff,0x12,0x20,0xde,0x90,0x60,0x9a,0x12,0x73,0xe8,0x7e,0x8, 0x27,0x76, +0x74,0xff,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78, +0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc, +0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, +0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80, +0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73, +0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d, +0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a, +0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26, +0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x75,0xb2, +0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d, +0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53, +0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x75,0x9f,0xb, +0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80, +0x19,0x12,0x75,0xa8,0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58, +0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3, +0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x75,0x97,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12, +0x75,0xb2,0xb, 0x6a,0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d, +0x2d,0x7e,0x67,0x2a,0x51,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, +0x90,0x12,0x75,0x9f,0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, +0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x75,0xa8,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c, +0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12, +0x74,0x3c,0x38,0xab,0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, +0x12,0x75,0x97,0x2d,0x15,0x6c,0xaa,0x80,0xe, 0x12,0xa5,0xe4,0xb, 0x7a,0x90,0xbd, +0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xed,0x7a,0xb7,0x8, 0x4, +0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32, +0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e, +0x74,0x62,0x10,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d, +0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31, +0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0xa6, +0x56,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x75,0x97,0x7e,0xd, 0x24,0x2d,0x15,0x7f, +0x13,0x2d,0x35,0x12,0x6d,0x3b,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a, +0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x75,0xbc,0x7e,0x37,0x28, +0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x75, +0xbc,0x12,0x76,0x2b,0x12,0xa7,0x45,0x2, 0x76,0x1a,0xe4,0x7a,0xb3,0x3, 0xff,0x7e, +0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x3, 0xff,0x22,0xca,0x3b,0x7e,0xf3,0x2a, +0x6e,0x12,0xc0,0xde,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, +0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0xa7,0xcd,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda, +0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0xbb,0xb5,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, +0xf8,0x12,0x3f,0xf2,0x12,0x76,0x9a,0x12,0x74,0x43,0x7e,0xb3,0x16,0x90,0xb4,0x1, +0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26, +0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x20, +0xde,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26, +0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0xc0,0xb, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0xbf,0xe7, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x86,0x12,0xc0, +0x60,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x89,0x12,0xc0, +0x60,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3, +0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0xc0,0xb, 0x7e,0x50,0x1, 0x12,0x77,0x60,0x7a, +0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0xbf,0xe7,0x7e,0x50,0x1, 0x12,0x77,0x60, +0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22, +0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0, +0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4, +0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0, +0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, +0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c, +0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b, +0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f, +0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0xe4,0x7a,0xb3, +0x37,0x9c,0x7a,0xb3,0x37,0x9d,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0x9e,0x90,0x60, +0x51,0xe4,0x93,0x7a,0xb3,0x37,0x9f,0xe4,0x7a,0xb3,0x37,0xa0,0x90,0x60,0x99,0x93, +0x7a,0xb3,0x37,0xa1,0xe4,0x7a,0xb3,0x37,0xa2,0x7a,0xb3,0x37,0xa3,0x90,0x61,0xc4, +0x93,0x7a,0xb3,0x37,0xa5,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34, +0x7a,0x73,0x37,0xa9,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a, +0x73,0x37,0xaa,0x74,0x64,0x7a,0xb3,0x37,0xbb,0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3, +0x37,0xbc,0x90,0x61,0x17,0xe4,0x93,0x7a,0xb3,0x37,0xa8,0x90,0x61,0x19,0xe4,0x93, +0x7a,0xb3,0x37,0xbe,0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x37,0xbd,0x90,0x61,0x1d, +0xe4,0x93,0x7a,0xb3,0x37,0xbf,0x90,0x61,0x25,0xe4,0x93,0x7a,0xb3,0x37,0xba,0xe4, +0x7a,0xb3,0x37,0xb5,0x74,0xfa,0x7a,0xb3,0x37,0xb3,0x74,0x1e,0x7a,0xb3,0x37,0xb4, +0x74,0x1, 0x7a,0xb3,0x37,0xb2,0x74,0xd, 0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3, +0x37,0xb6,0xe4,0x7a,0xb3,0x37,0xb7,0x7a,0xb3,0x37,0xb8,0x7e,0x8, 0x37,0xc0,0x7e, +0x34,0x0, 0x2c,0x12,0x20,0xde,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0xa, 0x36,0x7a, +0x73,0x37,0xcb,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0x7a,0x73,0x37,0xcc,0x90,0x60, +0xd4,0x93,0x7a,0xb3,0x37,0xcd,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x37,0xce,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b, +0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xe9,0x74,0x1, 0x7a,0xb3,0x37,0xe0,0x7e,0x34,0x0, +0x28,0xca,0x39,0x7e,0x34,0x61,0xd5,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12, +0x20,0xb9,0x1b,0xfd,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0x2, 0x23, +0xa6,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x6d, +0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x20, +0xde,0x7f,0x6, 0x7d,0x3f,0x12,0x20,0xde,0x7a,0xb3,0x16,0x91,0x22,0x7f,0x70,0x7e, +0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c, +0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x20,0xde,0x7f,0x7, 0xa, +0x3a,0x2, 0x20,0xde,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15, +0x12,0x79,0x9d,0x12,0x3f,0xd2,0x7e,0xe0,0x1, 0x12,0x4f,0xaf,0x30,0x18,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x7b,0x29,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac, +0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15, +0x12,0x7b,0x20,0xb, 0xd0,0x7e,0x73,0x2a,0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, +0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c, +0xbf,0x2e,0x73,0x2a,0x73,0x12,0x7a,0x8e,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b, +0x2, 0x70,0x41,0x12,0x2f,0xf4,0x50,0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x7a,0x75, +0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x72,0x12,0x79,0xc4,0x74, +0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x7a,0x75,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f, +0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x79,0xc4,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4, +0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x3d,0xac,0x7c,0xba,0x12,0x13, +0xc7,0x74,0xa, 0x12,0x45,0x15,0x7c,0xb9,0x12,0x0, 0x1e,0x2, 0x4e,0xe7,0xca,0xd8, +0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0x7b,0xd0,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74, +0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11, +0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x1f,0x7, 0x1b,0x6a,0x30,0xb, 0xd0,0xbc, +0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3, +0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73,0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c, +0x7f,0x12,0x7a,0x8e,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12, +0x20,0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, 0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, +0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22, +0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, +0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x29,0x6f,0x7c,0xe7,0x80,0x5d,0x12,0x26,0x57, +0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x12,0x7b,0x29,0x6c,0xdd,0x80,0x3d, +0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, +0x1d,0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19, +0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x3f,0xb, 0xbe,0xb0, +0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x7b,0xb7, +0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa, +0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53,0x2a, +0x73,0xa, 0x25,0x2d,0x23,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22, +0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa, +0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38, +0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, +0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e, +0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x37,0xed,0x40,0x39,0x7e,0x37,0x37,0xed,0xb, 0x34,0x7a,0x37, +0x37,0xed,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x34,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x38,0xfb,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x70,0x5, 0x7e,0xb3,0x37,0x9c,0x22,0xbe,0xb0,0x3, 0x38,0x15, +0x75,0x1b,0x0, 0x30,0xe, 0x6, 0x7e,0x18,0x32,0xea,0x80,0x4, 0x7e,0x18,0x33,0x28, +0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e, +0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4, +0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xed,0x80,0x2, 0x15,0x1a,0x2, +0x7c,0x17,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x7d,0x61,0xbe,0xb0,0x80, +0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x61,0x22,0xb4,0xfc, +0x5, 0x7e,0xb3,0x37,0x8, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60, +0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x36,0x71,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22, +0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74,0xff,0x22,0x7c,0x7b,0x6c,0xaa,0x12, +0x3f,0xe1,0x78,0x9, 0x7c,0xb7,0x12,0x7c,0x64,0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, +0x7c,0xb7,0x12,0x37,0xeb,0x7c,0xab,0x7c,0xba,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5, +0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5, +0x1a,0x12,0x3f,0xb3,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12, +0x7c,0xfb,0xf5,0x91,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0, +0x82,0x12,0x7d,0x1a,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b, +0x32,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x37,0xf2,0x7e,0x73,0x37,0xf2,0xa, 0x27,0x2e, +0x24,0x0, 0x6, 0x12,0x51,0x4f,0x93,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x37,0xf2, +0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x37,0xf2,0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0x9b,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0x9b,0x7a, +0xa3,0x36,0xf2,0x22,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37,0x9c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, +0xe4,0x7a,0xb3,0x37,0x9c,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba, +0x12,0x7d,0xab,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3, +0x7c,0x7a,0x12,0x7e,0x45,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xdf,0x38, +0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x7e,0x21,0xa5,0xbb,0x8f,0x3, 0x75,0x19, +0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x44,0xc0,0x74,0x1, 0x7a,0xb3,0x33,0xff, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68,0x17,0x1b,0x61,0x68, +0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x36,0xe1,0xd2,0xd, 0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37, +0xef,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37, +0xef,0x15,0x1a,0x7e,0x27,0x37,0xef,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, +0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a,0xea, +0x22,0x7e,0xb3,0x37,0xf1,0x4, 0x7a,0xb3,0x37,0xf1,0xe5,0x19,0xb4,0x1, 0x8, 0xe4, +0x7a,0xb3,0x37,0xf1,0x75,0x19,0x0, 0x7e,0x73,0x37,0xf1,0x7a,0x73,0x36,0xf0,0x22, +0xe4,0x7a,0xb3,0x37,0x9c,0x7e,0x8, 0x32,0xea,0x12,0x7e,0xef,0x7e,0x8, 0x33,0x28, +0x7e,0x34,0x0, 0x3e,0x12,0x20,0xde,0x7e,0x18,0x32,0xea,0x7a,0x1d,0x14,0x12,0x7e, +0xd1,0x2, 0x7e,0xc4,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0x9c,0xf5,0x91, +0x22,0x2, 0x7e,0xd4,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e, +0x34,0x0, 0x3e,0x74,0xff,0x2, 0x20,0xde,0x7c,0xab,0x12,0x3f,0x52,0x7c,0xba,0x12, +0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x7f,0x67,0x49,0x35,0x34,0x3b,0x49,0x15, +0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40,0x15,0xbe, +0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12,0x7f,0x6f, +0x28,0xe, 0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, 0x80,0x2, +0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c, +0x7c,0xb9,0x12,0x31,0x27,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, +0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88,0x7f,0x10, +0x7f,0x4, 0x12,0x1e,0xeb,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x75, +0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b,0x2a,0x0, +0x1b,0x1a,0x10,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e, +0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12, +0x21,0x0, 0xe5,0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0, +0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e, +0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12,0x87,0xbc,0x90, +0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, +0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x87,0xd4,0xbe,0xc4, +0x0, 0x3f,0x38,0x1c,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61,0x3b,0x12,0x81, +0x2, 0x12,0x80,0xf1,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xee, +0x12,0x66,0xb1,0xbd,0x5c,0x38,0x21,0x7d,0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12, +0x81,0x2, 0x90,0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b, +0x7c,0x12,0x80,0xf9,0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b, +0x1b,0x54,0xbd,0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f, +0x80,0xa, 0x7d,0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x87,0xcc,0x7f, +0x17,0x12,0x1e,0xfc,0x7f,0x71,0x12,0x81,0x1c,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40, +0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d, +0x22,0x2f,0x71,0x12,0x80,0xf1,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, +0x90,0x61,0x3a,0xe4,0x93,0x12,0x80,0xf9,0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f, +0x22,0x90,0x61,0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d, +0x22,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d, +0x2e,0x7c,0x76,0x7c,0x65,0x7f,0x71,0x22,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65, +0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12, +0x9f,0x40,0x7d,0x3, 0x74,0x9, 0xac,0xbf,0x12,0x87,0xe5,0x49,0x35,0x28,0xae,0x12, +0x81,0xbf,0x12,0x81,0x18,0x7d,0x13,0x5e,0x30,0xfc,0x7e,0x70,0x9, 0xac,0x7f,0x49, +0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d, +0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34, +0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x12,0x81,0xb3,0x12,0x81, +0x18,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, +0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30, +0xda,0x79,0x22,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d, +0x32,0x12,0x21,0x0, 0x7d,0x13,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b,0x74, +0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3,0x49, +0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x81,0xbf,0x7d,0x3f,0x9d,0x35,0x12,0x21, +0x0, 0x9d,0x34,0x12,0x21,0x0, 0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0xf, 0x12,0x67,0xeb,0x7e,0x14,0x62,0x6a,0x12,0x87,0xee,0x50, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7, +0x2f,0x9e,0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7, +0x2f,0x9a,0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x81,0xc7, +0x70,0x2, 0x61,0x45,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70, +0x9, 0x7e,0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45, +0x7e,0x73,0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f, +0xa4,0x7e,0x17,0x2f,0xa6,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45,0x7e,0x34,0x62,0x72, +0x12,0x83,0x4a,0x28,0x4a,0x7e,0x34,0x62,0x70,0x12,0x83,0x54,0x50,0x41,0x7e,0xb3, +0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0x9e,0x12,0x83,0x5e,0x7d,0x8f, +0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0x87,0xc4,0x9d, +0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40,0x2, 0x61, +0x45,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7b,0x7e,0xf0,0x21,0x80,0x76,0x7e, +0x34,0x62,0x7a,0x12,0x83,0x54,0x28,0x6d,0x7e,0x34,0x62,0x78,0x12,0x83,0x4a,0x50, +0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62,0x7e,0x12,0x23,0x9e,0x12,0x83, +0x5e,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50,0x4a,0x7e,0x34,0x62,0x7c,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7,0x2f,0x82,0x28,0x37,0x7d,0xfb, +0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x26,0x12, +0x67,0xf2,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd,0x49,0x25,0x2b,0xab,0x49,0x5, +0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, 0x9d,0x32,0xbe,0x34,0x0, 0x10, +0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xf0,0xbd,0xfc,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xbd,0xfb,0x22,0x7e,0x14, +0x62,0x8e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22,0x12,0x86,0x69,0x7a,0x37,0x2f, +0x9c,0x12,0x85,0xf4,0x7a,0x37,0x2f,0x9e,0x12,0x82,0x16,0x60,0x1, 0x22,0x7e,0x73, +0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f,0x80,0x2, +0x83,0x92,0xca,0xf8,0x7e,0x45,0x24,0x7c,0xb9,0x7a,0xb3,0x38,0x3f,0x74,0xff,0x7a, +0xb3,0x38,0x3e,0x6d,0x55,0x80,0x19,0x7d,0xf5,0x3e,0xf4,0x12,0x86,0x74,0x7d,0xe5, +0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54, +0xbd,0x45,0x38,0xe3,0x7e,0x33,0x38,0x3f,0xbe,0x30,0x4, 0x38,0x2, 0x81,0x54,0x69, +0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e, +0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x40,0x7a,0xb3, +0x38,0x42,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f, +0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x38,0x42,0x7d,0xf, 0x2d,0xf, 0xbd, +0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x38,0x42,0xa, 0x37,0x6d,0x22,0x12, +0x1e,0xeb,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7a,0x73,0x38,0x42,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x84,0x73,0x12, +0xbf,0x3c,0x12,0x84,0x73,0x12,0x84,0x7c,0x12,0x84,0x73,0x12,0xa5,0x28,0x80,0xa, +0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x38,0x3e,0xe4,0x7a,0xb3,0x38,0x3f,0x7e, +0x73,0x39,0x1, 0xbe,0x73,0x38,0x3e,0x48,0x6, 0x7e,0xb3,0x38,0x40,0x80,0x1, 0xe4, +0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71, +0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a, +0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0xa1,0x9d,0x7e,0x90,0x2, 0xac,0x9a, +0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x26,0x7f,0x67,0x2d, +0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f, +0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a, +0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe, +0xf0,0x2, 0x58,0x2, 0xa1,0x9b,0xbe,0x60,0x0, 0x18,0x2, 0xa1,0x83,0xbe,0x70,0xec, +0x28,0x2, 0xa1,0xa7,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7, +0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x85,0xeb,0x19,0xba,0x22, +0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x85,0xeb,0x19,0xba,0x23,0xe4,0x9, 0xba, +0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7, +0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0x85, +0xeb,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12,0x85,0xe2,0x19,0xbd,0x22,0xf5,0xa, 0xd9, +0x12,0x85,0xe0,0x19,0xbd,0x23,0xe5,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe, +0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12, +0x85,0xe0,0x19,0xbd,0x22,0xf4,0xa, 0xc9,0xa, 0xd4,0x12,0x85,0xe0,0x19,0xbd,0x23, +0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f,0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, +0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23,0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x38, +0x3f,0xbc,0xba,0x28,0x2, 0x81,0x9b,0x7a,0x73,0x38,0x3f,0x7e,0xa0,0x1, 0x80,0x25, +0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d, +0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e, +0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x38,0x3f,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22, +0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c, +0xbd,0xa, 0xa7,0x22,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0x86,0x69,0x7a,0x37,0x2f,0xa0,0x12, +0x85,0xf4,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0x86,0x69,0x7a,0x37,0x2f, +0xa4,0x12,0x85,0xf4,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7c,0xab, +0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4,0x14, +0x78,0xfb,0x12,0x86,0x72,0x2d,0xfe,0x80,0xf, 0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x12,0x86,0x72,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a, +0xbd,0xf4,0x38,0xd0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61, +0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b, +0x7e,0x63,0x2a,0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10, +0x7d,0x21,0x12,0x87,0xdc,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34, +0x37,0x44,0x6d,0x22,0xe4,0x2, 0x86,0x7e,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b, +0x68,0x4f,0x12,0x87,0x56,0x7c,0x3b,0x7c,0xb2,0x12,0x87,0x56,0x7c,0xab,0xbe,0x30, +0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12, +0x91,0x67,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e, +0x34,0x16,0x93,0x6d,0x22,0x30,0x16,0x3, 0x2, 0x86,0xc7,0x7e,0xb3,0x2b,0x1d,0xb4, +0x1, 0xf, 0x12,0xc0,0x1b,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x86, +0x7e,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, +0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40, +0xe9,0x74,0xff,0x22,0x7e,0xb3,0x37,0x31,0x70,0x6, 0x12,0x87,0xad,0x2, 0x87,0xb6, +0x12,0x63,0x9, 0x12,0xbd,0x6d,0x50,0xa, 0x12,0x83,0x6a,0x7c,0x3b,0x12,0x87,0xad, +0x80,0x5, 0x12,0xbe,0x14,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xbc,0xf1, +0x60,0xa, 0x7a,0x33,0x37,0x34,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4,0x7a,0xb3, +0x2f,0x80,0x22,0x2, 0x81,0x23,0xe4,0x7a,0xb3,0x38,0xdd,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x3e,0x24,0x7e,0xf, +0x38,0xd9,0x2d,0x12,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x32,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74,0x6, +0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x5, 0x7d,0x53,0xbe,0x54,0x0, 0xff, +0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x12,0x6e,0x8f,0x50,0x3, 0xd2,0xf, 0x22,0xc2, +0xf, 0x22,0x12,0xac,0xe9,0x12,0x88,0x2b,0x2, 0x88,0x17,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x20,0xde,0x12,0xaa,0x61,0x12,0xaa,0x58,0xa9,0xd1,0xcb, +0x12,0xc1,0x22,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x12, +0x54,0x94,0x12,0x88,0xb9,0x12,0x8c,0xad,0x7e,0xb3,0x37,0x6, 0xb4,0x1, 0x1e,0x7e, +0x34,0x61,0xc0,0x12,0x87,0xcc,0x7e,0x24,0x0, 0x5, 0xad,0x12,0x7a,0x17,0x28,0xa1, +0x7e,0x14,0x61,0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39, +0x11,0x60,0x7, 0x14,0x7a,0xb3,0x39,0x11,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, +0x12,0x88,0x22,0x12,0x8c,0x90,0x12,0xb3,0xd3,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12, +0xbb,0x30,0x12,0xaa,0x6a,0x2, 0x8d,0x10,0x22,0x7e,0x90,0x1, 0x7e,0xb3,0x2f,0xa9, +0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xa9,0x7e,0x34,0x61,0xc0,0x12,0x23, +0x9e,0x12,0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x12,0x8c,0x87,0xb, 0x1a, +0xf0,0x7e,0x34,0x61,0x4f,0x12,0x87,0xbc,0xe4,0x7a,0xb3,0x28,0xac,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x7e,0x34,0xff,0xfa,0xad,0x3f,0x12,0x8f,0xdc,0x7d,0xc3,0xe, 0xc4, +0x7e,0xe7,0x7, 0xfe,0xbd,0xe3,0x58,0x15,0x7e,0xe7,0x7, 0xfc,0xbd,0xec,0x58,0xd, +0x12,0x8a,0x7c,0x8, 0x8, 0x12,0x8b,0xe, 0x60,0x3, 0x12,0x8a,0x95,0x12,0x8b,0xe, +0xa, 0xeb,0x4d,0xee,0x68,0x3b,0x6d,0xee,0x9d,0xef,0xbe,0xe7,0x7, 0xfe,0x18,0x6, +0xbe,0xe7,0x7, 0xfc,0x8, 0x2b,0x12,0x8a,0x7c,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12, +0x21,0x0, 0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x8a,0x74,0x28,0x14,0x7e,0x83,0x28, +0x85,0xbe,0x80,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xcf,0x58,0x3, 0x12,0x8a, +0x95,0x12,0xad,0x28,0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xc1,0x1a,0x68,0x6, +0x7e,0xb3,0x39,0xb, 0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x7d,0x12,0x8a,0x74, +0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0xad,0x66,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x12,0x8a,0xa6,0x7c,0x9b,0x80, +0x1a,0x7e,0xb3,0x26,0x84,0x70,0x14,0x7e,0xb3,0x26,0x85,0x70,0xe, 0x12,0x8a,0x74, +0x28,0x9, 0x7e,0x90,0x3, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0xc7,0x7, 0xfa,0xbe, +0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x8a,0x74,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7, +0x28,0x8e,0x58,0x8, 0x12,0x8a,0x87,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0x29,0x7e,0x14, +0x61,0xc0,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0x7e,0x14,0x61, +0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x12,0x0, 0x66,0x50,0xd, 0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x8f,0xe3,0x28,0x3, 0x12,0x8a,0x87,0x7e,0xc7,0x28,0x8a, +0xbd,0xcd,0x8, 0x19,0x12,0x9b,0xf, 0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28, +0x8e,0x58,0xa, 0x12,0x0, 0x66,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x8b,0x8e, +0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x2, 0x12,0xac,0x90,0x7e,0xb3,0x2f,0xaa,0xbe, +0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xaa,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8c,0x7f,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0x6d,0xee,0x9e,0xe7, +0x2a,0x5a,0xbe,0xe7,0x28,0x8e,0x22,0xe4,0x7a,0xb3,0x2f,0xaa,0x7a,0xb3,0x28,0xac, +0x74,0x2, 0x2, 0x29,0xfa,0x74,0x2, 0x7a,0xb3,0x2f,0xaa,0xe4,0x7a,0xb3,0x2f,0xa9, +0x12,0x8c,0x7f,0x2, 0x29,0xfa,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x8c,0x87, +0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x8b,0x6, +0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e, +0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x4, +0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11, +0x7e,0x34,0xff,0xfd,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0, +0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x1e,0xb9,0xbd,0x34,0x22,0x6c,0x66, +0x90,0x60,0xa7,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28, +0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14, +0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x9d,0x8b,0x50, +0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, +0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e, +0x73,0x2a,0x6d,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0xca,0x3b, +0x12,0xa6,0x4e,0x38,0x2, 0x81,0x55,0x7e,0xc3,0x2f,0xad,0x4c,0xcc,0x78,0x3d,0x7a, +0xb3,0x2f,0xad,0xe4,0x7a,0xb3,0x2f,0xaf,0x6c,0xaa,0x80,0x26,0x12,0x8c,0x60,0x7e, +0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a,0x49,0xd0,0x19, +0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8c,0x6a,0x59,0x34,0x0, 0x2, +0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c,0xfc,0x6c,0xaa, +0x80,0x35,0x12,0x8c,0x60,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, 0xb4,0x0, 0x8, +0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8c,0x6a,0x7d,0x23,0x49,0x34,0x0, 0x2, 0x9d, +0x32,0x12,0x21,0x0, 0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x4c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x2f,0xaf,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x8c, +0x60,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x4c,0x0, 0x12,0x8c,0x71,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x2f,0xaf,0x80,0x6, 0x12,0x8c,0x71,0x75,0x4c,0x0, 0xe5,0x4c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xb0,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x40,0xe4,0x7a,0xb3,0x2f,0xae,0x7a,0xb3,0x2f,0xad,0x7a,0xb3,0x2f,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22, +0x12,0x8c,0xcd,0x6d,0x33,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x5, 0x12,0x8d,0x5e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xf6,0xe4,0x7a,0xb3,0x36,0x72,0x22,0x12,0xb0,0xbe, +0x60,0x1a,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x7e,0x37,0x38, +0xd2,0x12,0x25,0x3c,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x23,0x12,0x8d,0x8, 0x28, +0x26,0xa, 0x4a,0x9, 0x64,0x36,0x76,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x42,0x38,0xcc,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x80,0xb, 0xa0,0x7e, +0xb3,0x36,0x73,0xbc,0xba,0x38,0xd5,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xae,0xc5,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x8d,0x5e,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x84, +0x49,0x12,0x36,0x80,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x84,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x36, +0x84,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x36,0x80,0x59,0x32,0x36,0x84,0x22,0x7e,0xb3,0x36,0x66, +0x60,0x6, 0x14,0x7a,0xb3,0x36,0x66,0x22,0x12,0x8c,0xcd,0x90,0x61,0xc5,0xe4,0x93, +0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x8d,0xef,0x7e,0xb3,0x36,0xec,0x70,0xe, 0x7e,0xb3, +0x39,0x12,0xb4,0x1, 0x7, 0xe4,0x12,0x8d,0xb3,0x12,0xc0,0x95,0x12,0x67,0x1f,0x12, +0x8e,0xa2,0x7e,0xa3,0x36,0xec,0x7a,0xa3,0x39,0x12,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x8d,0xb3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf,0x12,0xc0,0xc3,0x12,0xc0, +0x39,0x12,0x6f,0xff,0x12,0xc0,0x30,0x7a,0xf3,0x0, 0x4f,0x7c,0xbf,0x12,0xb3,0x54, +0x12,0x6e,0x29,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37,0x12,0xaf,0x4, 0x12,0x8d, +0xef,0x12,0x23,0x4, 0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8,0x22,0x12,0x8f,0xd2,0x7e, +0xb3,0x2b,0xf, 0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xc0,0x7e,0x73,0x37,0xcd,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36, +0x12,0x8f,0xca,0xbe,0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x36,0x72,0xa, 0x3e,0xad, +0x3b,0x7d,0xa3,0x2d,0xac,0x75,0x35,0x0, 0x7e,0xa3,0x36,0x72,0xbc,0xad,0x40,0x2, +0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e, +0x78,0xe, 0x7c,0xbd,0x14,0xbe,0xb3,0x36,0x72,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x72, +0x7e,0xc3,0x36,0x72,0x80,0x41,0x7e,0xb3,0x36,0x72,0x4, 0x7a,0xb3,0x36,0x72,0x7e, +0x90,0x5, 0xac,0x9c,0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb, +0x19,0xcd,0x36,0x76,0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, +0xf5,0x35,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0, +0xbe,0xf0,0x3, 0x50,0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x36,0x73,0xda, +0x3b,0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0x5a,0x7e,0xb3,0x36,0x6b, +0xb4,0x1, 0x8, 0x12,0x88,0x22,0xe4,0x7a,0xb3,0x36,0x6b,0x7e,0xb3,0x36,0x6a,0x60, +0x4, 0x74,0xff,0xe1,0xc5,0x7e,0xb3,0x36,0x69,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xb9, +0x12,0xc1,0x12,0x38,0xc, 0x12,0x8f,0xf3,0x38,0x7, 0x12,0x8f,0xeb,0x38,0x2, 0xe1, +0xb9,0x12,0x8f,0xca,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, +0x80,0x3, 0x7c,0xbd,0x14,0x12,0xae,0x34,0x7c,0xfb,0x7e,0xb3,0x36,0x68,0x4, 0x7a, +0xb3,0x36,0x68,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xae,0x34,0x7c,0xab,0xbe,0xa0, +0xff,0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x36, +0x7e,0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, +0x12,0xae,0xbb,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe, +0xf0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x68,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36, +0x75,0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x36,0x68,0x50,0x59, +0x74,0xc, 0xac,0xbf,0x49,0x25,0x36,0x7e,0x7e,0x14,0x61,0xcc,0x12,0x64,0xd3,0xbd, +0x23,0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0x9e,0xbe,0x37,0x36,0x64,0x40,0xd, +0x7e,0x34,0x61,0xd2,0x12,0x23,0x9e,0xbe,0x37,0x36,0x6f,0x50,0x23,0x74,0x5, 0xac, +0xbf,0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, +0x50,0x8, 0x12,0x87,0x52,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x6b, +0xe4,0x7a,0xb3,0x36,0x75,0x7a,0xb3,0x36,0x69,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a, +0xb3,0x36,0x68,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x90,0x61,0xc5,0xe4,0x93,0x7c, +0xdb,0x22,0x12,0xae,0xd2,0x74,0x1, 0x7a,0xb3,0x36,0x66,0x22,0x7e,0x24,0x0, 0x2, +0x2, 0x1e,0xb9,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26,0xf5,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf3,0x2a, +0x70,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3, +0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3, +0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x90, +0x50,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f, +0x36,0x6d,0x0, 0x12,0x1f,0x7, 0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x7, 0xda,0xf8,0x22, +0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8, +0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x6f, +0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x5c, +0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x60, +0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, +0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f, +0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x74,0xc8,0x7a,0xb3,0x39,0x6, 0xc2,0x17, +0x80,0xa, 0x12,0x45,0xd6,0x30,0x17,0x4, 0x75,0xe9,0xff,0x22,0x12,0x47,0xff,0x68, +0xf1,0x22,0x74,0x1, 0x12,0x90,0xf1,0x20,0x17,0x6, 0x12,0x46,0x4e,0x12,0x90,0xfa, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x90,0xb8,0x12,0x90,0xfa,0xe4,0x2, 0x90, +0xf1,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0x22,0xd2,0x4, 0x2, 0x45,0x5a,0xa, +0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x47,0xff,0x68,0xfb,0x20,0x93,0xfd, +0x22,0x7e,0x34,0x61,0x59,0x2, 0x23,0x9e,0x7e,0xb3,0x37,0x6, 0x70,0x2e,0x7e,0x73, +0x36,0xe9,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0x3, +0x7e,0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x91,0x6d,0x7c,0xab,0xe5,0x4e, +0xa, 0x3b,0x2e,0x37,0x38,0x83,0x7a,0x37,0x38,0x83,0x80,0xc, 0x7e,0xa3,0x36,0xea, +0xbe,0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x91,0x5d,0x75,0x4e,0x0, +0x7a,0xb3,0x39,0x6, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x20,0xf0,0x7a,0x71,0x82, +0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xb3,0x38,0x86,0x70,0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x38,0x86,0x22,0x7f,0x20,0xc2,0x4, 0x7e,0x2b,0x60,0x29,0x72,0x0, +0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21,0x0, 0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32, +0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x21,0x0, 0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d, +0x32,0x12,0x21,0x0, 0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60, +0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x37,0xf3,0x4d,0x33,0x68,0x2, +0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f,0x70,0x7c, +0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e, +0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12,0x87,0xbc,0x6c,0xff,0x12,0x2f,0xff,0x7f,0x51, +0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, 0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b, +0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e,0x14,0x62,0xa, 0x12,0x87,0xee,0x8, 0xc, 0x7e, +0x27,0x28,0x8a,0xbe,0x24,0x3, 0x20,0x8, 0x2, 0x61,0x2a,0xb, 0xa, 0xc0,0x1e,0xc4, +0xbd,0x3c,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x61,0x2a, +0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0, +0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca, +0x18,0x5, 0x4e,0xf0,0x1, 0x61,0x2a,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a, +0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa, +0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc, +0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90, +0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd, +0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b, +0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, +0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, +0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b, +0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0x40,0xbd,0x3d,0x22,0x7f,0x60,0x7e,0x6b,0xa0, +0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, +0x2d,0x15,0xb, 0x14,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0, +0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76,0x7d,0x13,0x1e, +0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e, +0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b, +0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xca,0x3b,0x6d,0x11,0x7e,0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c, +0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12,0x95,0x90,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x34,0xca,0x74,0x2, 0xa, 0x3f,0x19,0xb3,0x35,0x34,0xb, 0xf0,0x12,0x5e,0x2d, +0x38,0xe1,0x12,0x97,0xc0,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0xa1,0x69,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, +0x12,0x95,0xa1,0x38,0x2, 0xa1,0x67,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x4d,0x75,0x24,0x0, 0xa1,0x3f,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xca,0xbc,0xcd,0x68,0x2, 0xa1,0x3d,0x49,0x25,0x34,0xc8,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x0, 0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc6,0x74,0x9, 0xac,0xbf,0x12,0x96,0x1b,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x34,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x20,0xa, 0x1c,0x2e,0x14,0x35,0x34,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x67,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x69,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x1f,0x8c,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x97,0xae,0xac,0x3f,0x12,0x95,0x98,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x95,0x98,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x20,0x80,0x2a,0x5, 0x24,0x90, +0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0x81,0x49,0x80,0x1a,0x6d,0x11,0x74, +0x2, 0xac,0xbd,0x12,0x95,0x90,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1,0x34,0xca,0x74, +0x2, 0xa, 0x1d,0x19,0xb1,0x35,0x34,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x25,0xe4, +0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x5f,0xc6,0xca,0x59,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x34,0xc6,0x12,0x20,0xb9,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, 0xda,0x3b,0x22, +0x59,0x15,0x35,0x20,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x1f, +0x8c,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80, +0x63,0x6c,0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac, +0xbe,0x9, 0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x95,0xa1,0x38,0xe5, +0x12,0x95,0xa1,0x28,0x43,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x81,0xb3, +0x74,0x9, 0xac,0xbd,0x12,0x87,0xe5,0x12,0x96,0x1b,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8b,0x59,0x35,0x34,0xb0,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x87,0xb3,0xb, 0xe0,0xbc,0xfe,0x38,0x99,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x21,0x0, 0x7e,0xb3,0x37,0x31,0x70,0x3, 0x12,0x93,0xe3,0x2, 0x96,0x30, +0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x96, +0x7c,0x7c,0xbf,0x12,0x97,0x10,0x4c,0xee,0x78,0x14,0x12,0x5f,0xc2,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0x80,0xb, 0x7e,0xb3, +0x2a,0x9, 0x70,0x5, 0x7c,0xbf,0x12,0x95,0xa9,0x7c,0xbf,0x12,0x9f,0x90,0xbe,0xf0, +0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4, +0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, 0x2, 0x96,0xeb,0xa5,0xbe,0x0, 0x1d,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, +0xa0,0x12,0x5e,0x25,0x38,0xed,0x74,0x1, 0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x47,0x81,0x1b, +0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x47, +0x81,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0x12,0x97,0x4, 0x7e,0x8, +0x34,0xb0,0xe4,0x12,0x20,0xde,0x90,0x60,0x99,0x12,0x97,0x8, 0x7e,0x8, 0x34,0x8b, +0xe4,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60,0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x97,0xb6,0x7c,0x7d, +0x7c,0x6f,0x12,0x97,0xb6,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x97,0xae,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x1f,0x8c,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x2e,0x34, +0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x8, 0x1f,0x34,0x12,0x9e,0x37,0x7c,0x1b,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x34,0x9f,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x34,0x9f,0x1e,0x34,0x7a,0x37,0x34,0x9f,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9f,0x7e,0x37,0x34,0x9f,0x22,0xca,0xf8,0x7c,0xfb, +0x6d,0xdd,0x7c,0xbf,0x12,0x98,0xea,0x7d,0xe3,0x7c,0xbf,0x12,0x37,0x6f,0x7d,0xf3, +0x74,0x2, 0xac,0xbf,0x9, 0x95,0x26,0xfb,0x7c,0xbf,0x12,0x9a,0xed,0x40,0x2, 0x1, +0xd4,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0xbe,0xa0,0x0, 0x28,0x9, 0xa, 0x3a, +0x1b,0x34,0x12,0x98,0xd8,0x7d,0xd3,0x12,0x98,0xdf,0xbd,0xc3,0x58,0xb, 0xa, 0xca, +0xb, 0xc4,0x7d,0x3c,0x12,0x98,0xd8,0x2d,0xd3,0x12,0x9b,0xf, 0x7d,0xd3,0xbe,0xa0, +0x0, 0x28,0x56,0x12,0x98,0xdf,0xbd,0xc3,0x58,0x4f,0xbe,0x90,0x0, 0x28,0x4a,0xbe, +0x90,0x0, 0x28,0x45,0xbe,0xf4,0x0, 0xc8,0x8, 0x3f,0x7d,0x3d,0x3e,0x34,0x3e,0x34, +0xbd,0x3f,0x8, 0x35,0x7e,0x70,0x2, 0xac,0x79,0x49,0x33,0x4, 0xfc,0xbe,0x34,0x1, +0x2c,0x8, 0x26,0xa, 0x2a,0x7e,0xb3,0x2a,0x74,0x12,0x9b,0x18,0xbe,0x34,0x1, 0x90, +0x8, 0x17,0xbe,0xf4,0x1, 0x5e,0x58,0xd, 0x7e,0x34,0x0, 0x3, 0xad,0x3e,0xbd,0x3f, +0x8, 0x3, 0xe4,0x80,0x30,0x74,0x1, 0x80,0x2c,0x90,0x60,0xab,0xe4,0x93,0xbc,0xb9, +0x78,0x22,0x7c,0xba,0x7c,0x79,0x12,0x2c,0x40,0xbe,0x34,0x0, 0x96,0x8, 0x12,0x74, +0x2, 0xac,0xb9,0x49,0x35,0x4, 0xfc,0xbe,0x34,0x0, 0x32,0x8, 0x4, 0x74,0x1, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xb7,0x7c,0x79,0x2, 0x2c,0x40,0x7e, +0xb3,0x2a,0x6f,0xa, 0x3b,0x1b,0x34,0xa, 0xca,0x22,0xca,0x79,0x7c,0x8b,0x6c,0xaa, +0x9f,0x77,0x12,0x9a,0x2a,0x1a,0x79,0x1b,0x74,0x80,0x4c,0x1a,0x38,0x1b,0x34,0x7c, +0xe7,0x80,0x38,0xbc,0x9f,0x78,0x4, 0xbc,0x8e,0x68,0x2e,0xbe,0xf0,0x0, 0x48,0x29, +0x7e,0xb3,0x2a,0x6f,0xa, 0x2b,0x1a,0x3f,0xbd,0x32,0x58,0x1d,0xbe,0xe0,0x0, 0x48, +0x18,0x7e,0xb3,0x2a,0x70,0xa, 0x2b,0x1a,0x3e,0xbd,0x32,0x58,0xc, 0x7c,0xbf,0x7c, +0x7e,0x12,0x2c,0x40,0x12,0x99,0x65,0xb, 0xa0,0xb, 0xe0,0x1a,0x28,0xb, 0x24,0x1a, +0x3e,0xbd,0x32,0x8, 0xbe,0xb, 0xf0,0x1a,0x29,0xb, 0x24,0x1a,0x3f,0xbd,0x32,0x8, +0xaa,0x4c,0xaa,0x78,0x4, 0x6d,0x33,0x80,0x9, 0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12, +0x1f,0x58,0xda,0x79,0x22,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7, +0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f,0x34,0x7e,0xb3,0x2a,0x70,0x7a,0xb3, +0x1f,0x35,0x12,0x9a,0x2a,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x41,0x17,0x7a, +0xf1,0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d, +0x32,0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a, +0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d, +0x32,0x7c,0xb7,0xf5,0x2c,0x80,0x40,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58, +0x10,0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5, +0x2e,0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b, +0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12, +0x2c,0x40,0x12,0x99,0x65,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x2c,0x1a, +0x3b,0xbd,0x32,0x8, 0xb2,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd, +0x32,0x18,0x2, 0x21,0x8f,0x7f,0x17,0xda,0x79,0x22,0x7e,0x70,0x2, 0xac,0x78,0x9, +0x93,0x26,0xfa,0x9, 0x83,0x26,0xfb,0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x62,0x27, +0x12,0x9a,0xe5,0x12,0x9b,0x23,0x50,0x2, 0x41,0xe0,0x7e,0x34,0x62,0x2b,0x12,0x23, +0x9e,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, 0x41,0xe0,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x9a,0xe5,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x4, 0x4c,0x8, 0x6b,0x6c,0xdd,0x80,0x5f,0xc2,0x3, 0x7c,0xbd,0x12,0x37,0x6f, +0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x99,0x6c,0x7a,0x35,0x24,0x9e,0x35, +0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0xdc,0x7a,0x35, +0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, +0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x9a,0xed, +0x50,0x2, 0xc2,0x3, 0x30,0x3, 0xf, 0x7c,0xbd,0x6c,0x77,0x12,0x51,0x5f,0x7e,0x70, +0x2, 0xac,0x7d,0x12,0x37,0x9f,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x99, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x7c,0x4b,0x74, +0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc, +0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x2, 0x1e,0xb9,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33, +0x4, 0xfc,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x37,0x6f,0xbe,0x34, +0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0xe9, +0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0x3b,0x7e,0x77,0x2a,0x5c,0x12, +0x9d,0xa1,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x9b,0xd7,0x7e, +0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x35,0xe5,0xbd,0x36,0x48,0x7, 0x3e,0x34,0x3e, +0x34,0x12,0x9b,0xd7,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0x9b,0x23,0x50,0x6, 0x7e, +0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60,0xc, 0x7e, +0xb3,0x35,0xe3,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xe3, +0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x45,0xe, 0x7e,0x53,0x35,0xe3,0xbe,0x50,0x0, +0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, 0x7d,0xfe, +0x7a,0xf7,0x2a,0x5c,0x12,0x9b,0xdf,0x28,0x3, 0x12,0x37,0xc2,0x7a,0x67,0x35,0xe5, +0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xb9,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x79,0xc2,0x3, 0x7e,0xf0,0x3, 0x7e,0xe3, +0x2a,0x3, 0x12,0x9b,0xdf,0x28,0x72,0x7c,0xbf,0x12,0x2c,0x47,0x4c,0xee,0x68,0xe, +0x7e,0x63,0x33,0xc0,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x33,0xc1,0x70,0x4, 0xd2,0x3, +0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x4d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x3, +0x80,0x1e,0xd2,0x3, 0x12,0x9c,0xf6,0x78,0xa, 0xa5,0xbe,0x0, 0x6, 0x6c,0xff,0xc2, +0x3, 0x80,0xd, 0x9e,0x73,0x33,0xc0,0xbc,0x7e,0x78,0x5, 0x7e,0xf0,0x2, 0xc2,0x3, +0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x2c,0x47,0x7e,0xa3,0x33,0xc2,0x7a,0xa3,0x28,0x84, +0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x33,0xc3,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9, +0x1b,0xfd,0x12,0x9c,0x6f,0xf5,0x4d,0x80,0x3, 0x75,0x4d,0x64,0xda,0x79,0x22,0x7e, +0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80, +0x42,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x9c,0xee,0x9, 0xb3,0x26, +0xfa,0x12,0x2f,0xd6,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12, +0x9c,0xee,0x9, 0xb3,0x26,0xfb,0x12,0x2f,0xd6,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, +0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c, +0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28, +0x84,0xbc,0xb1,0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c, +0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0xca,0x79,0x6c, +0x88,0x80,0x72,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a, +0x71,0x24,0x7c,0xbf,0x12,0x9d,0x8b,0x50,0x5a,0x6c,0xee,0x80,0x51,0xbc,0xe8,0x68, +0x4b,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9d,0x80,0xf5,0x26,0x6c,0x99,0x90,0x60,0xaa, +0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, 0x2f, +0xe5,0x25,0xa, 0x3b,0x12,0x35,0x67,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, 0x78, +0x1b,0x7c,0xbe,0x12,0x37,0x6f,0x7d,0xf3,0x7c,0xb8,0x12,0x37,0x6f,0xbd,0x3f,0x8, +0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x51,0x5f,0xb, 0xe0,0x12,0x9c, +0xf6,0x38,0xaa,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0x86,0xda,0x79,0x22, +0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0x22,0x7c,0xab,0x90,0x60,0xab, +0xe4,0x93,0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x31,0x5a,0x50,0x2, 0xd3,0x22,0xc3, +0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84,0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12, +0x2f,0xb7,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb, +0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x40,0x7d,0xf3,0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, +0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x2, 0x70,0x2d, +0x7e,0x73,0x2a,0x3, 0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc5,0x70,0x18,0x12, +0x9e,0x17,0x7e,0x73,0x2a,0x3, 0x7a,0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, +0x7e,0xb3,0x34,0xc5,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc5,0x22,0xe4,0x7a,0xb3, +0x34,0xc5,0x7a,0xb3,0x2a,0x9, 0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x35, +0xe9,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73, +0x35,0xe8,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0xc1, +0xd2,0x7c,0x57,0xc1,0xca,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98, +0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff, +0x68,0x66,0x12,0x9e,0xe2,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e, +0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, +0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x9e,0xe2, +0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7, +0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0xc1,0x45, +0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6,0x28,0x2, 0xc1,0x41,0x7c,0xba,0xda, +0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0x7c,0xab,0x7e,0xb, +0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x34,0xa3,0xbe,0x73,0x34,0xad, +0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa3,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22, +0xbe,0x73,0x34,0xad,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74, +0xff,0x19,0xb4,0x34,0xa3,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x34,0xa3,0xbe,0xb0,0xff, +0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa3,0xd3,0x22,0xe4,0x19,0xb3,0x34,0xa3,0xc3,0x22, +0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34, +0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x5, 0xbe, +0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34, +0xb0,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x34,0x8b,0x80,0x4, 0x59,0x35,0x34,0x8b,0x59, +0xf5,0x34,0xb0,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x25,0x3c, +0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x25,0x3c, +0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28, +0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90, +0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0x12,0x5e,0x25, +0x38,0xb2,0x22,0x7e,0x8, 0x34,0xa2,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20,0xde,0x6c, +0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12,0x2f,0xb7,0x60,0xa, 0x12,0xa0,0x84,0x40, +0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5, +0x7c,0xb0,0x6c,0x77,0x12,0xa0,0x49,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70, +0x1, 0x12,0xa0,0x49,0xb4,0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x2f,0xb7, +0x60,0xc, 0x12,0xa0,0x84,0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x51,0x5f,0xb, 0x10, +0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3,0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e, +0xb3,0x36,0x61,0x7a,0xb3,0x36,0x62,0x7a,0xa3,0x36,0x61,0x7e,0xb3,0x36,0x62,0x60, +0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e,0xb3,0x36,0x63,0x60, +0x5, 0x14,0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x0, 0x28,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c, +0xa7,0x90,0x60,0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, +0x80,0x71,0xbe,0xb0,0x2, 0x38,0x66,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27, +0x7e,0x73,0x26,0xfa,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26, +0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x2, +0x80,0x4e,0x6c,0xff,0x80,0x30,0x7c,0xbf,0x12,0x37,0x81,0x1a,0x4b,0x7c,0xbf,0x12, +0x37,0x6f,0x7d,0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d, +0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, 0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75, +0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xcb,0x80,0x6, 0xe5,0x1e,0x24, +0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, +0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22,0x7e,0x39,0x70,0xa, 0x37,0x9d,0x32,0x2, +0x21,0x0, 0xca,0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6, +0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd, +0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f,0x46,0x75,0x2b,0x0, 0x61,0x43,0x12,0xa4, +0xde,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b, +0x2e,0x34,0x14,0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x22,0xff,0x12,0x20,0xb9,0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a,0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35, +0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff,0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a, +0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5,0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xa4, +0xe6,0x2e,0x35,0x36,0x12,0xa1,0x48,0x7d,0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58, +0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, 0x3b,0x7f,0x3, 0x12,0xa4,0xe6,0x2e,0x35, +0x38,0x12,0xa1,0x48,0x7d,0xc3,0x7e,0x35,0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32, +0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37,0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a, +0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c, +0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5,0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb, +0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0x61, +0x41,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60, +0x8, 0x2, 0x61,0x41,0x80,0x28,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, +0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x61,0x41,0xbe,0x34,0x0, 0x30,0x8, +0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x61,0x41,0x7e,0xa3, +0x38,0x41,0x74,0xc, 0xa4,0xbe,0x57,0x22,0xf9,0x58,0x2, 0x61,0x41,0x7e,0xa3,0x38, +0x42,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58,0x2, 0x61,0x41,0x7e,0x15,0x36,0x6d,0x0, +0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xa3,0x7e,0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d, +0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xa3,0x7e,0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73, +0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38,0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b, +0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4,0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10, +0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33,0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7c,0xb7,0xf5,0x2e,0xe5,0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37, +0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34,0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e, +0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22, +0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35,0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a, +0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a,0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22, +0xf6,0x5, 0x2b,0x12,0xa4,0xde,0x28,0x2, 0x21,0x7e,0x7e,0xa3,0x22,0xf7,0xbe,0xa1, +0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe,0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50, +0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, 0x34,0x7a,0x73,0x38,0x3e,0x7a,0xb3,0x38, +0x40,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x38,0x3e,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a, +0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43,0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14, +0x12,0xa4,0xd6,0x7a,0x55,0x4a,0xa, 0x5e,0x7f,0x16,0x12,0xa4,0xd6,0x7a,0x55,0x48, +0x7e,0x35,0x48,0x12,0xa4,0xcf,0x2f,0x50,0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a, +0x0, 0x2f,0x70,0x12,0xa4,0xcf,0x12,0xa4,0xc5,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d, +0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4a,0x12,0xa4,0xc5,0x7e,0x1d,0x40, +0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12, +0xa4,0xc5,0x7e,0x1d,0x44,0x2f,0x10,0x7a,0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c, +0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x1f,0x58,0x7f,0x51,0x7f,0x17,0x7f, +0x6, 0x12,0x1f,0x58,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12, +0x1e,0xfc,0x7e,0x87,0x23,0x43,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x3c,0x7e,0x1d,0x40,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x40,0x7e,0x1d,0x44,0x7d,0x19,0x12,0x1e,0xfc,0x7d,0x18, +0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x58,0x7a,0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1e, +0xeb,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12,0x1e,0xeb,0x7e,0x5d,0x3c, +0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1e,0xeb,0x7e,0x7d,0x40,0x9f,0x71,0xbe,0x58, +0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18, +0x7f,0x16,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x5, 0x12,0x1f,0x58,0x7f,0x6, 0x12,0x1e, +0xeb,0x7f,0x7, 0x12,0x1f,0x58,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44, +0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0x7f,0x1, 0x22,0x7d, +0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x39,0x1, 0xbe,0x71,0x2b,0x22,0x2d,0x13,0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79, +0x6c,0xaa,0x12,0xa5,0xe4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf, +0x38,0x43,0x7f,0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x38, +0x63,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda,0x7e,0x8, 0x38,0x43,0x7e,0x18,0x38,0x63, +0x74,0x20,0x12,0xa1,0x52,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73, +0x38,0x3f,0xbe,0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22, +0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0x33,0x38,0x3f,0xa, 0x13,0x6d,0x0, 0x12, +0x1f,0x7, 0x7c,0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64, +0xa, 0x3e,0x1b,0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xa5,0x92,0x7f,0x6, 0x7c, +0xbd,0x7c,0x7c,0x12,0xa5,0x92,0xb, 0xf0,0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x50,0xbc, +0x7f,0x5, 0x7f,0x16,0x12,0xa4,0xee,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x38,0x3e,0xda, +0x3b,0x22,0x7c,0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d, +0x2, 0xb, 0xa, 0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, +0x7c,0x21,0xa5,0xba,0x0, 0x14,0x1a,0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d, +0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, +0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35, +0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xe4,0x7a, +0xb3,0x35,0x69,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x5, 0xe4, +0x7a,0xb3,0x35,0xe4,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x4f,0x12,0xa6,0x4e,0x28, +0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0xdc,0xbe,0x37, +0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x3, 0x70,0x17,0x7e, +0xb3,0x37,0x8, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28, +0x5, 0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0xb3, +0x28,0x84,0xbe,0xb0,0x0, 0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x6e, +0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c, +0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x4a,0x12,0xa6,0xff,0x78, +0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x21, +0x0, 0x7d,0x13,0x7d,0x3e,0x12,0x21,0x0, 0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5, +0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33,0x9e,0x35,0x2e,0xbd,0x3e,0x8, +0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, +0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xae,0x7e,0x73, +0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80, +0xa, 0x12,0xa6,0xff,0x78,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc, +0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0xc1,0x71,0xda,0x3b,0x22,0xa, +0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22, +0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d, +0x0, 0x7f,0x14,0x12,0x1f,0x58,0x7d,0x73,0x12,0x21,0x0, 0x7d,0xe3,0x7d,0x3f,0x12, +0x21,0x0, 0xbd,0x3e,0x22,0x7e,0x63,0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c, +0xc2,0x12,0x6c,0x33,0x80,0x56,0x90,0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac, +0x93,0x90,0x60,0xab,0xe4,0x93,0xa, 0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4, +0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a, +0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x31,0x5a,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f, +0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, 0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, +0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75, +0xbc,0x73,0x38,0xa2,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x32,0xe7,0x22,0x90,0x60,0xa7, +0xe4,0x93,0x60,0x8, 0x30,0x12,0x5, 0x12,0x31,0x7d,0xc2,0x12,0x22,0xca,0xd8,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x22,0xe6,0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x1f,0xad,0x6d,0x11,0x7e,0x4, +0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0xa8,0xe1,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d, +0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, +0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x1, 0xd2,0xbe,0xd4,0x4, +0xb0,0x8, 0x2, 0xd2,0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd, +0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7, +0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x1, 0xd2,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, +0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0xa8,0xe1,0x1a,0x26,0x1a,0x24,0x2f, +0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0xa8,0xd7,0x9f,0x55,0x6c,0xee, +0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12, +0x21,0x0, 0x7d,0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, +0x1d,0x12,0xa8,0xd7,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, +0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea, +0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x58,0x7d,0x13, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x0, 0xca, +0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x80,0xc2,0x3, 0x6d,0x44,0x80,0x32, +0x12,0xa9,0x90,0x12,0xa8,0xe9,0xbd,0x3d,0x48,0x26,0x12,0xa9,0x90,0xb, 0x1a,0x30, +0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0xd2,0x3, 0x80,0x9, 0x12,0x21,0x0, 0xbd,0x3d,0x68, +0x2, 0xc2,0x3, 0x7d,0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa8,0xe9,0x7d,0xd3, +0xb, 0x44,0x7e,0xc5,0x35,0xbd,0xc4,0x38,0xc7,0x30,0x3, 0xc, 0x7e,0xf0,0x7f,0x80, +0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba,0x7d,0x3d,0x60,0x5, 0xe, 0x34, +0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f,0x10,0x2e,0x35,0x35,0x7a,0x1b, +0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30, +0x7f,0x60,0x2e,0xd5,0x35,0x7e,0x6b,0xb0,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0x7c, +0xb7,0x12,0xa9,0x9b,0xb, 0x44,0x7e,0x55,0x35,0xbd,0x54,0x38,0xd8,0xda,0xf8,0x22, +0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a, +0x1b,0xb0,0x22,0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5, +0x1, 0x6c,0xaa,0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0xa9,0x99,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xed,0xc2,0xc9,0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, +0x7e,0x73,0x2a,0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0xad,0x13, +0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x38,0xd9, +0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, +0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35,0x35,0x7e,0xf, 0x37, +0x40,0x7e,0x18,0x25,0xb6,0x2, 0xa8,0xef,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12, +0xaa,0x51,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37, +0x24,0xf6,0x12,0xaa,0x58,0x12,0xaa,0x61,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, +0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, +0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2, +0x22,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53, +0x2a,0x6d,0xac,0x54,0x7e,0x17,0x28,0xa1,0x12,0xaa,0x51,0x6d,0x0, 0x80,0x37,0x7d, +0x40,0x3e,0x44,0x7e,0x7f,0x38,0xd9,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10, +0x7d,0xf4,0x2e,0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14, +0x6d,0x55,0x9d,0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d, +0x51,0x1b,0x48,0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22,0x7c,0xab,0x7e,0x8, 0x29, +0xbc,0x12,0x5e,0x25,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0,0xb4, +0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31,0x7d, +0x20,0x39,0xb1,0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0x61,0x96,0x90,0x60, +0xa7,0xe4,0x93,0x70,0x2, 0x61,0x96,0x6c,0xff,0x61,0x8f,0x7e,0x70,0x9, 0xac,0x7f, +0x9, 0xe3,0x29,0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, +0x7d,0x3d,0x12,0xab,0xa4,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, +0x7d,0x34,0x1b,0x34,0x12,0xab,0x9b,0x7c,0xbe,0x12,0xaa,0xbb,0x80,0x3f,0x7e,0x70, +0x2, 0xac,0x7d,0x2e,0x34,0x60,0xc5,0x12,0x87,0xbc,0x74,0x9, 0xac,0xbf,0x59,0xd5, +0x29,0x8, 0x7e,0x34,0x60,0xcf,0x12,0x23,0x9e,0x12,0xab,0x9b,0x80,0x1f,0xbd,0xc4, +0x40,0x1b,0x7d,0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0xaa, +0xbb,0x7d,0xc4,0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12, +0x5e,0x2d,0x28,0x2, 0x61,0xb, 0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59, +0x35,0x29,0xa, 0x22,0x6c,0xaa,0x80,0x27,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e, +0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14, +0x60,0xb3,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0xb, 0xb, 0xa0,0x90, +0x60,0xa7,0xe4,0x93,0xbc,0xba,0x38,0xd0,0x7c,0xba,0x22,0x90,0x60,0xa7,0xe4,0x93, +0x60,0x2b,0x6c,0x33,0x80,0x1f,0x7c,0xb3,0x12,0x31,0x5a,0x40,0x16,0x7c,0xb3,0x12, +0x31,0x27,0x7d,0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x1b,0x1a,0x50,0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0xac, +0x20,0x7e,0x14,0x62,0x7, 0x12,0x87,0xee,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22, +0x6d,0x11,0xe4,0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x7f,0x38,0xf3,0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12, +0x21,0x0, 0xbd,0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xf3,0x2d, +0x13,0x69,0x20,0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x81,0xbf,0x7e,0x10,0x2, 0xac, +0x1a,0x7e,0x1f,0x38,0xf3,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78, +0x4, 0x7e,0x14,0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e, +0x14,0x7f,0xff,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22, +0x6c,0x66,0x7e,0x27,0x39,0x4, 0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e, +0xb3,0x28,0xac,0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xab,0xbc,0x76,0x50,0xf, 0xe4,0x7a, +0xb3,0x28,0xad,0x12,0x8a,0x87,0x7e,0xb3,0x2f,0xab,0x4, 0x80,0x4, 0xe4,0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xab,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xac, +0xbe,0xa0,0x5, 0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74, +0x5, 0x80,0x1, 0xe4,0x7a,0xb3,0x2f,0xac,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8, +0x30,0x1, 0xe, 0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, +0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d, +0x23,0xa, 0x3a,0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f, +0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac, +0x56,0x49,0x22,0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e, +0xb3,0x2a,0x6d,0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, +0x2, 0xc2,0x3, 0xa2,0x3, 0x22,0xc2,0x3, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1, +0x60,0x4, 0xd2,0x3, 0x80,0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57, +0x49,0x12,0x4, 0xfc,0x7e,0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d, +0x22,0x9d,0x20,0xbd,0x12,0x58,0x4, 0xd2,0x3, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e, +0x14,0x0, 0x3, 0xa, 0x27,0xbd,0x21,0x48,0xd2,0xa2,0x3, 0x22,0x7d,0x23,0x7e,0x14, +0x61,0xc8,0x12,0x64,0xd3,0x7e,0x14,0x0, 0x5, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50, +0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x8, 0x50,0x45,0x74,0x8, 0x80,0x3d,0x7d,0x13, +0x3e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x6, 0x50,0x30,0x74, +0x6, 0x80,0x28,0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e, +0x33,0x36,0xdc,0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, 0x80,0xf, 0xbd,0x32,0x50,0xf, +0x7e,0x73,0x36,0xdc,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xdc,0x7e, +0xb3,0x36,0xdc,0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a,0xb3,0x36,0xdc,0x74,0x1, 0x7a, +0xb3,0x16,0x92,0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3,0x36,0xdc,0x50,0x5, 0xe4,0x7a, +0xb3,0x16,0x91,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0xae, +0xad,0x68,0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0xae,0xc5,0x7d,0x23,0x7e,0x70,0xc, +0xac,0x72,0x59,0x23,0x36,0x82,0x49,0x3, 0x36,0x82,0x49,0x23,0x36,0x7e,0xbd,0x20, +0x50,0x4, 0x59,0x3, 0x36,0x7e,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22, +0x80,0x18,0x12,0xae,0xad,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7e, +0xbd,0x4, 0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37, +0x36,0x64,0xbe,0x37,0x36,0xdd,0x50,0x8, 0x7e,0x37,0x36,0xdd,0x7a,0x37,0x36,0x64, +0x12,0xae,0xbb,0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, +0xac,0x12,0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, 0x22,0x7e,0x70,0xc, 0xac,0x7a, +0x49,0x33,0x36,0x7e,0x22,0x49,0x23,0x36,0x84,0x49,0x33,0x36,0x80,0x9d,0x32,0x2, +0x21,0x0, 0x7e,0x8, 0x36,0x7a,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x20,0xde,0x6c,0xaa, +0x7e,0x44,0xff,0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7c,0x59,0x43,0x36, +0x84,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x68,0x7e,0x34,0x0, 0xd, +0xe4,0x2, 0x20,0xde,0x7e,0xa3,0x2b,0x62,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62, +0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4,0x2, 0xa, 0x66,0x22,0xc2,0xc, 0x7e, +0x8, 0x2a,0x6d,0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x6d,0x74,0x3, 0x2, 0x11,0x7a,0xe4, +0x7a,0xb3,0x36,0x67,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59, +0x43,0x36,0x7e,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xee,0xe4,0x7a,0xb3,0x36,0x68,0x6d, +0x33,0x7a,0x37,0x36,0x6f,0x7a,0x37,0x36,0x64,0x22,0x7e,0xb3,0x36,0x6a,0xb4,0x1, +0x27,0x7e,0xb3,0x36,0xe0,0x4, 0x7a,0xb3,0x36,0xe0,0x7e,0x73,0x36,0xe0,0xbe,0x70, +0x3, 0x40,0x15,0x12,0x8c,0x90,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x6, 0x40,0x9, 0xe4, +0x7a,0xb3,0x36,0xe0,0x7a,0xb3,0x36,0x6a,0x22,0x12,0x24,0x14,0xe4,0x7a,0xb3,0x3, +0xfe,0x2, 0x76,0x52,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88, +0x7e,0xf0,0x1, 0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f, +0x7f,0x7, 0x2d,0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc, +0x9f,0x38,0xe2,0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0, +0x1, 0x2, 0xb0,0x54,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, +0x80,0x36,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26, +0xfb,0xe5,0x44,0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16, +0x5, 0x45,0xa, 0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0xb0,0x62,0xbd,0x3d,0x8, +0x5, 0x12,0xb0,0x62,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe, +0xb0,0x0, 0x28,0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba, +0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x33,0xc3,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a, +0x19,0x72,0x33,0xc4,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x30,0x3, 0x1b,0x1a,0xd0, +0xb, 0xa0,0xb, 0xf0,0xbc,0x8f,0x40,0x3, 0x2, 0xaf,0xd4,0x7c,0xba,0xda,0x79,0xda, +0xd8,0x22,0x7c,0xbe,0x7c,0x7d,0x2, 0x2c,0x40,0x7c,0x9b,0x7f,0x71,0x7f,0x60,0x7e, +0x34,0x22,0xb8,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f,0x52,0x74,0x2a,0x12,0x1f,0xad, +0x7e,0x58,0x1f,0x52,0x7c,0xb9,0x7e,0x71,0x44,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x45, +0x7e,0x71,0x46,0x12,0x2c,0x40,0x2d,0x34,0xe, 0x34,0x7f,0x5, 0x7e,0x50,0x7, 0xb, +0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, 0x1b,0x6a,0x30,0x69,0x30,0x0, +0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe2,0x22,0x6d,0x33, +0x7d,0x23,0x7d,0x3, 0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x6e, +0xac,0xb3,0xa, 0x42,0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4, +0xb, 0x7a,0x40,0xbe,0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, +0x24,0xbe,0x44,0xff,0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, +0x34,0xb, 0x21,0x7e,0x93,0x2a,0x6e,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb3,0x38,0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e, +0x14,0x1e,0x14,0x12,0x25,0x3e,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a, +0xb3,0x39,0x8, 0x7e,0xb3,0x39,0x9, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39, +0x9, 0x80,0x3c,0xe4,0x7a,0xb3,0x39,0x9, 0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22, +0xbd,0x32,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x9, 0x7e,0xb3,0x39,0x8, 0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x8, 0x80,0x16,0xe4,0x7a,0xb3,0x39,0x8, 0x74,0x2, +0x80,0x9, 0xe4,0x7a,0xb3,0x39,0x8, 0x7a,0xb3,0x39,0x9, 0x7a,0xb3,0x39,0xa, 0x7e, +0xb3,0x39,0xa, 0x22,0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x39,0xb, 0x22,0xca,0xd8, +0xca,0x79,0xc2,0x3, 0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7,0x28,0x97, +0x7e,0x37,0x37,0xfb,0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff,0x7e,0xa3, +0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14,0x24,0xc2, +0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83,0x2a,0x6d, +0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99,0x80,0xf, +0x7c,0xb9,0x12,0x37,0x6f,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, 0x90,0x7e, +0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x61,0x4f,0x7e,0xa3, +0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3,0x26,0x83, +0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34,0x49,0x23, +0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, 0x6d,0x33, +0x9d,0x3e,0x12,0x8f,0xdc,0xbd,0x3, 0x8, 0x4, 0xd2,0x3, 0x80,0x6, 0xb, 0x90,0xbc, +0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe,0xe7,0x7, 0xf8,0x8, 0x2, 0xc2, +0x3, 0x30,0x3, 0x20,0x7e,0xb3,0x39,0xb, 0x4, 0x7a,0xb3,0x39,0xb, 0x7e,0x23,0x39, +0xb, 0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x39,0xb, 0x74,0x1, 0x7a,0xb3, +0x28,0xa8,0x80,0xf, 0x7e,0x23,0x39,0xb, 0xbe,0x20,0x0, 0x28,0x6, 0x1e,0x20,0x7a, +0x23,0x39,0xb, 0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28,0x69,0x7e, +0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68,0x59,0x7e, +0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, +0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x2c,0x3c,0xbe,0x34,0x0, 0x96,0x8, 0x5, +0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38,0xdb,0x6c, +0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3,0x27,0x37, +0x12,0x2c,0x3c,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90, +0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x17,0xa, 0xe9,0xa, 0x5f, +0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x39,0xc, 0x4, +0x7a,0xb3,0x39,0xc, 0x7e,0x73,0x39,0xc, 0xbe,0x70,0x5, 0x28,0x22,0x74,0x5, 0x7a, +0xb3,0x39,0xc, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x15,0x12,0xb1,0x84,0x80,0xf, +0x7e,0x73,0x39,0xc, 0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x39,0xc, 0xda, +0x79,0xda,0xd8,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34,0x0, 0x38,0xca,0x39,0xac,0x7f, +0x2e,0x34,0x0, 0x50,0x6d,0x22,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, 0x30,0x6d,0x22,0x7e,0x8, 0x3, +0x60,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0x3e, +0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x20,0xde,0x90,0x60,0x93,0x93,0xa, 0x3b,0x7e, +0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43,0x6c,0x77,0x80, +0x1d,0xa, 0x27,0x2d,0x24,0x12,0x87,0xdc,0xb, 0xa, 0x0, 0x7e,0x30,0x2, 0xac,0x37, +0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, 0x70,0xbc,0xa7, +0x38,0xdf,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x13,0xc6, +0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24,0x13,0x8e,0x9d,0x31,0x1b,0x28, +0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38,0xdc,0x22,0x7c,0xab,0x12,0xb4, +0xb, 0xd2,0x16,0x7c,0xba,0x12,0x86,0xf8,0xc2,0x16,0x22,0xa9,0xd1,0xcb,0x74,0x1, +0x2, 0x0, 0xe, 0x12,0xb4,0xb, 0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x6d,0x12,0xb4, +0x4c,0x12,0xb4,0x2f,0x7a,0x37,0x38,0xd6,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x6d, +0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb5,0x19,0x90,0x60, +0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb4,0x80,0x22,0x7a,0xb3,0x24,0xf2, +0x7e,0x53,0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa,0xe4,0x7a,0xb3,0x24, +0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24,0xf6,0x7e,0x34,0x0, +0x20,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x7a,0x37,0x24,0xfc,0x7e,0x8, 0x24,0xf2,0x22, +0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e,0xa, 0xd8,0x90,0x60,0x94,0xe4, +0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x18,0x7e,0x70,0x2, 0xac, +0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, 0x5a,0xc0,0x9d,0xc2,0x59,0xc3, +0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60,0x92,0xe4,0x93,0x7c,0x9b,0x6d, +0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92,0xe4,0x93,0xa, 0xcb,0x1b,0xc4, +0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x7d,0x23, +0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d,0x3e,0x34,0x2d,0x31,0x7d,0x20, +0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x0, 0x7d,0xa3,0xbd,0xfa,0x58,0x2, +0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8,0x2d,0xec,0x2d,0xdc,0xb, 0xf0, +0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca,0xf8,0x6d,0x44,0x7e,0xf3,0x2a, +0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3,0x2a,0x6d,0xa, 0xeb,0x2d,0xef, +0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x31, +0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda,0x2d,0xdf,0x3e,0xd4,0x7e,0x1f, +0x38,0xd9,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x50,0x2d,0xb2, +0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, 0xa0,0xbc,0xfa,0x38,0xd9,0x80, +0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x38,0xd9,0x2d,0x15,0x6c,0xaa,0x80,0x2c,0xa, +0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x38,0xd9,0x2d,0x3e,0xb, 0x1a,0xe0,0x7e,0x70, +0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0,0x7d,0x3e,0x9d,0x3d,0x12,0x21, +0x0, 0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, 0xa0,0xbc,0xfa,0x38,0xd0,0x7d, +0x34,0xda,0xf8,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9,0xc5,0xea, +0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x4e,0x7e,0x73,0x39,0x6, +0xbe,0x71,0x4e,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9,0x34,0xe5, +0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x33,0xe5, +0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5,0x3, 0xa9, +0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8,0x22,0x7e, +0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79,0x30, +0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79,0x30, +0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79,0x30, +0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd0,0xce,0xa2,0x3, 0xa9,0x95,0xc9,0x22, +0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0xa9,0xc2,0xeb,0xa9,0xd2, +0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9, +0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, 0x75,0x8b,0x0, 0xd2,0x8e, +0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7,0x0, 0x75,0xf8,0x0, 0xa9, +0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xc1, +0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7,0xc2,0xbe,0x22,0x75,0xe7, +0x6b,0x2, 0xb6,0xc4,0xe4,0x7e,0x34,0xd7,0xfc,0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0, +0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0x7e,0x37,0x39,0x4, 0xb, 0x34,0x7a,0x37,0x39,0x4, 0xbe,0x34,0xff,0x0, +0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37,0x39,0x4, 0x22,0x7c,0x6b,0x6c,0x77,0x6c, +0xaa,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x46,0x12,0xb7,0xb9,0x75,0xb5,0x5, 0xa9,0x36, +0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3, +0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5, +0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47, +0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0x22,0x74,0x6, +0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73,0x7d,0x52,0x7c,0xab,0x7e,0xb3, +0x39,0x13,0xb4,0xa5,0x3c,0x12,0xb7,0xb9,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0x12, +0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2, +0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0xb7,0x62,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x22, +0x74,0x2, 0x7d,0x3f,0x2, 0xb7,0x62,0x7d,0x42,0x7f,0x60,0x7d,0x3, 0x12,0xb8,0x38, +0x74,0x2, 0x12,0xb6,0xfb,0x7d,0xf3,0x4e,0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, 0x12, +0xb7,0xc0,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f,0x6, 0x12,0xb8,0x64,0x5e,0xf4, +0xff,0xfd,0x12,0xb7,0xc0,0x2, 0xb7,0xf8,0xa9,0xc5,0xca,0xe4,0x7a,0xb3,0x39,0x13, +0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12,0xb6,0xfb,0x4c,0xff,0x78,0x5, 0x5e,0x70, +0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0xb7,0x62,0xda,0xf8,0x22,0xd2,0xc8, +0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0xb8, +0x38,0xe4,0x12,0xb8,0x1, 0x2, 0xb7,0xf8,0xa9,0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1, +0xea,0x74,0xa5,0x7a,0xb3,0x39,0x13,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24,0xbd, +0x32,0x38,0xe9,0x22,0x12,0xb8,0x72,0x7e,0x35,0x36,0x12,0xb8,0x48,0xa9,0xd2,0xb4, +0xd3,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5,0xa, 0x44,0xf5,0x39,0x7f,0x21, +0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xb8,0x9d,0xe5,0x3a,0x12,0xb8,0x9d,0xe5, +0x39,0x12,0xb8,0x9d,0xe5,0x38,0x12,0xb8,0x9d,0xe4,0x2, 0xb8,0x9d,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c, +0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, +0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74, +0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x97,0xbe,0x90,0x1, +0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe, +0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18, +0xb2,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xb9,0x5c,0xb, 0x7a,0x20, +0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d, +0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25, +0x3c,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, +0xf9,0x2d,0xf1,0x7d,0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77, +0x14,0x78,0xfb,0x4d,0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xd9,0x7e,0x8, +0x1f,0x3c,0x12,0xba,0x1a,0xd2,0x3, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xb9,0x64, +0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32, +0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, +0x12,0xba,0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7, +0x38,0xee,0x12,0xba,0x7, 0xe4,0x12,0xba,0xf, 0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a, +0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xba,0x7, 0x74,0x1, 0x12,0xba,0xf, 0x74, +0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12, +0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x1c,0x74,0x3f, +0x2, 0x20,0xde,0x7e,0x8, 0x1f,0x34,0x12,0xba,0x1a,0x6c,0x77,0x80,0xe, 0x12,0xba, +0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x6e, +0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9, +0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x44,0xa, +0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57,0x7c,0xab, +0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46, +0x2e,0x44,0x20,0x73,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b,0xbe,0x60, +0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb, +0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b, +0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70, +0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbb,0x29,0x60,0x5, 0x3e, +0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16, +0x9e,0x60,0xe, 0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b, +0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72, +0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12,0x77,0xf6,0xb, 0x24,0xa, 0x33,0xbd,0x32, +0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28, +0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f, +0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d, +0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a, +0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a, +0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a, +0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3, +0xff,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, +0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85, +0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88, +0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53, +0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e, +0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91, +0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12,0x2f,0xd0,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xfb,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x37,0x32,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xbd,0x64, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x38,0xfc,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x37,0x33,0x80,0x1a,0x12,0xbd,0x64,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x38,0xfb,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x34,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f, +0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x80, +0x7e,0x34,0x0, 0x28,0xe4,0x12,0x20,0xde,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, 0xc0, +0x12,0x20,0xde,0x7a,0xb3,0x37,0x34,0x7e,0x34,0x62,0x8e,0x12,0x23,0x9e,0x7a,0x37, +0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a,0xe7, +0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a,0xf7, +0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a,0xf7, +0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe,0x7a, +0xb3,0x37,0x34,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x7e,0x37,0x38,0xe2,0x9e,0x37,0x38,0xde,0x12,0x21,0x0, 0xbd,0x31,0x38,0x12, +0x7e,0x37,0x38,0xe4,0x9e,0x37,0x38,0xe0,0x12,0x21,0x0, 0xbd,0x31,0x38,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd, +0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x38,0xdd,0x60,0x11,0x7e,0xc7, +0x38,0xe6,0x4d,0xcc,0x78,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x28,0x2, 0xe1,0x8, 0xbe, +0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xe1,0x8, 0x7e,0xe7,0x29,0x8, 0x7e, +0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x66,0xe6,0xbe,0xb0,0x1, 0x78,0x2, 0xe1, +0x8, 0x7e,0xa3,0x38,0xdd,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23, +0x14,0x78,0x2, 0xe1,0x5, 0xb, 0xb2,0x68,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x68,0x2, +0xe1,0x17,0x4c,0xee,0x68,0x2, 0xe1,0x17,0x74,0x1, 0x7a,0xb3,0x38,0xdd,0x12,0xbf, +0x2a,0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3, +0x38,0xdd,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xdd,0x7e,0x34, +0x62,0x68,0x80,0x48,0x12,0xbf,0x33,0x90,0x62,0x57,0x12,0xbf,0x1e,0x68,0x49,0x80, +0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xbf,0x33,0x7e,0x34,0x62, +0x60,0x12,0x23,0x9e,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d, +0xc3,0xbe,0xc7,0x38,0xe6,0x40,0x21,0x90,0x62,0x56,0x12,0xbf,0x1e,0x68,0x19,0x12, +0xbf,0x2a,0x74,0x3, 0x7a,0xb3,0x38,0xdd,0x7e,0x34,0x62,0x64,0x12,0x23,0x9e,0x7a, +0x37,0x38,0xe6,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xdd,0x6d,0x33,0x7a, +0x37,0x38,0xe6,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93, +0xa, 0x3b,0x12,0xbd,0xe9,0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x38,0xde,0x7a,0xf7, +0x38,0xe0,0x22,0x7a,0xe7,0x38,0xe2,0x7a,0xf7,0x38,0xe4,0x22,0xca,0xf8,0x7f,0x51, +0x7f,0x40,0x7e,0x37,0x2f,0x90,0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c, +0x7e,0x37,0x2f,0x9c,0x7a,0x35,0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff, +0x80,0x1e,0x7e,0x34,0x0, 0x26,0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0x8c,0x74, +0x2, 0xac,0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xbf,0x8b,0xb, 0xf0, +0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e, +0x35,0x2f,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e, +0x35,0x31,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, +0x6a,0x30,0x9e,0x35,0x33,0x6d,0x22,0x7e,0x33,0x38,0x41,0x12,0xbf,0xe0,0x7e,0x15, +0x2f,0x12,0x1f,0x5, 0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e, +0x33,0x38,0x42,0x12,0xbf,0xe0,0x7e,0x15,0x31,0x12,0x1f,0x5, 0x1b,0x7a,0x30,0x22, +0xa, 0x13,0x6d,0x0, 0x2, 0x1e,0xeb,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, +0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22, +0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x7e,0x34,0x60,0xa3,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e,0x37,0x2a,0x53,0x22,0x7e,0xa3,0x2a,0x6e,0x7e, +0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d,0x22, +0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b, +0x14,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e, +0x7b,0x60,0xbc,0x6b,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x2e,0x14,0x1, 0x30,0x6d, +0x0, 0x7e,0x18,0x3, 0x60,0x22,0x2e,0x14,0x0, 0x50,0x6d,0x0, 0x7e,0x18,0x34,0x0, +0x22,0x74,0x6, 0x12,0xb6,0xfb,0x7d,0x3, 0x6c,0x11,0x22,0x7e,0x70,0x2, 0xac,0x7c, +0x9, 0xb3,0x26,0xfa,0x22,0xe4,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36,0x71,0x22,0x74, +0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x61,0x57, +0x22,0x7a,0x37,0x28,0xa1,0x7e,0x34,0x61,0xc2,0x22,0x90,0x60,0xaa,0xe4,0x93,0xbe, +0xb0,0x1, 0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b,0xf, 0x22,0x74,0x5, 0xac,0xbc, +0x9, 0xb5,0x26,0x33,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22,0x7e,0xe3, +0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e, +0x37,0x25,0xf4,0x7a,0x37,0x31,0xcc,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x31,0xce, +0x22,0x7e,0x73,0x37,0xbd,0x7a,0x73,0x2b,0x20,0x22,0x12,0x0, 0x1e,0x7e,0xb3,0x2a, +0xfc,0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0, +0x1, 0x22,0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xb3,0x37,0x31,0xbe,0xb0, +0x1, 0x22,0x7e,0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7,0xe4,0x93,0x7c, +0xab,0x22,0xc1,0x42,0x3e,0xbd,0x40,0xbf,0x18,0x53, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg_ili.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg_ili.txt new file mode 100644 index 0000000000000..a95fee0f439bf --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_ds_ebbg_ili.txt @@ -0,0 +1,3093 @@ +0x2, 0x1f,0xd2,0x2, 0xb5,0xb4,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x42,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x70,0x2d,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x7d,0x45,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x32,0x2, 0x7d,0xa4,0xe4,0x2, 0x29,0xfa,0x22,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xa2,0x13,0x22,0x32,0xff,0x2, 0x0, 0x69,0x2, 0x31, +0xb3,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x38,0xc8, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x38,0xd8,0x7e,0x73,0x38,0xd8,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x7f,0x5, 0x7e,0x1f,0x38,0xc8,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x38,0xc8,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x38,0xcc,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x38,0xd4,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x38,0xd2,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf7,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0xb7,0xc7,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d,0xe2,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xb2,0x61,0x3f,0x7e,0x34,0x1d,0x96,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xc6,0x61,0x3f,0x7e,0x34,0x1e,0xa, 0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d, +0xf1,0x61,0x3f,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x69,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x6a,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xc8,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x38,0xc8,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x20,0xde,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x38,0xc0,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf7,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x38,0xc0,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xb9,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x38,0xc8,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x39,0xd, 0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x86,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x39,0xd, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x39,0xd, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x39,0xd, 0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xf3,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xf3,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xc0,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x38,0xc8,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x38, +0xc8,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x38,0xc8,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x38,0xc8,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x38,0xc8,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x38, +0xc8,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x38,0xc8, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x38,0xc8,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x38,0xc8,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x38,0xc8,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xb9,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xb9,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xf3,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xf3,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x39, +0xd, 0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x38,0xc8, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x38,0xc8,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x39,0xd, 0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x39,0xd, 0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x39,0xd, 0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf7,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xf2,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf7,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf7,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x39, +0xd, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x39,0xd, 0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x39,0xd, 0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x58,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1e,0xeb,0x7d,0x1e,0x12,0x1f,0x5, 0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x38,0xc8,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf7,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xf2,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf7,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x7f,0x5, 0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x38,0xc0,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc8,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x38,0xd8,0x7e,0x1f,0x38,0xc0, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xf3,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x39,0xd, 0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x20,0x8f,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x20,0x90,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e, +0x1f,0x38,0xc0,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x38,0xc0,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x38,0xc8,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x6, 0xe, 0x15,0x1a,0x1f,0x26,0x2b,0x2d,0x2e,0x2f, +0x2c,0x2a,0x24,0x1f,0x1a,0x14,0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10,0x15,0x1c,0x22, +0x28,0x2d,0x34,0x39,0x3d,0x40,0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x11,0x16, +0x1c,0x23,0x2b,0x32,0x37,0x3c,0x40,0x45,0x4a,0x4d,0x4c,0x4b,0x4a,0x48,0x46,0x46, +0x45,0x45,0x44,0x44,0x43,0x44,0x45,0x78,0x65,0x55,0x2, 0xd, 0x14,0x1b,0x21,0x25, +0x2b,0x31,0x37,0x36,0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, +0x10,0x18,0x1e,0x23,0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40, +0x3f,0x3e,0x3d,0x3d,0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29, +0x27,0x1e,0x14,0x11,0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21, +0x2b,0x32,0x30,0x2a,0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, +0x10,0x19,0x23,0x2d,0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71, +0x50,0x55,0x28,0x12,0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39, +0x31,0x28,0x1e,0x15,0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32, +0x37,0x39,0x20,0x29,0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, +0x1, 0x0, 0x1, 0x5, 0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c, +0x34,0x31,0x26,0xcb,0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31, +0x2e,0x2d,0x35,0x3d,0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, +0x10,0x1b,0x24,0x2f,0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d, +0x28,0x31,0x34,0x2a,0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40, +0x47,0x47,0x44,0x3c,0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b, +0x22,0x2d,0x30,0x2e,0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, +0x0, 0x0, 0x3, 0xb, 0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26, +0x1b,0x14,0x1c,0x25,0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c, +0x25,0x30,0x38,0x40,0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c, +0x29,0x1e,0x14,0x13,0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39, +0x30,0x25,0x1b,0x10,0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a, +0x23,0x2f,0x33,0x29,0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, +0x2, 0x0, 0x1, 0x8, 0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e, +0x50,0x55,0x16,0x2b,0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36, +0x3b,0x3d,0x3b,0x37,0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33, +0x3d,0x3f,0x13,0x21,0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37, +0x2d,0x22,0x18,0xc, 0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38, +0x2e,0x2a,0x31,0x62,0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, +0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26, +0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b, +0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48, +0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x9, 0x17,0x1d,0x26,0x2e,0x37, +0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, +0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30,0x2f,0x2c,0x26,0x1e, +0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c,0x32,0x3a,0x41,0x48, +0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c,0x33,0x55,0x26,0x1c, +0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18,0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, +0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44,0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49, +0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f,0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54, +0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c, +0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22,0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c, +0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a,0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32, +0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, +0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22, +0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, 0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39, +0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68,0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70, +0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80,0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10, +0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, +0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39,0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24, +0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50,0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff, +0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a,0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, +0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22, +0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33,0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29, +0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d,0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26, +0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10,0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b, +0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19, +0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22,0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39, +0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34,0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, +0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18,0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37, +0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e, +0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21, +0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c, +0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, +0x0, 0x2, 0x5, 0x9, 0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f, +0x3d,0x38,0x30,0x27,0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36, +0x3f,0x49,0x53,0x5c,0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b, +0x15,0xb, 0x4, 0x0, 0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c, +0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, +0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, +0x8, 0xe, 0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58, +0x51,0x48,0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf, +0x30,0x55,0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28, +0x30,0x38,0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16, +0xf, 0xc, 0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, +0x3, 0xa, 0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a, +0x58,0x57,0xc6,0x55,0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38, +0x3c,0x3e,0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, +0xd, 0x17,0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57, +0x4f,0x47,0x40,0x38,0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, +0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f, +0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22, +0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25, +0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f, +0x3d,0x3a,0x36,0x2e,0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0x9, 0xe, 0x14,0x1c,0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a, +0x10,0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47, +0x4f,0x56,0x5a,0x5b,0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9, +0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e, +0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25, +0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25, +0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d, +0x3a,0x34,0x2d,0x27,0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, +0xa, 0xf, 0x15,0x1b,0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11, +0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36, +0x3c,0x42,0x47,0x48,0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29, +0x22,0x1b,0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c, +0x24,0x2a,0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, +0x4, 0x7, 0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b, +0x38,0x31,0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35, +0x3d,0x45,0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17, +0x11,0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6, +0x30,0x55,0xa, 0x5, 0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3c,0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, +0x1, 0x2, 0x35,0x46,0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37, +0x2e,0x25,0x1e,0x16,0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39, +0x41,0x45,0xf0,0xbc,0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28, +0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, +0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d, +0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19, +0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36, +0x2f,0x27,0x21,0x19,0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, +0x16,0x1f,0x26,0x2d,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d, +0x56,0x59,0x5a,0x58,0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, +0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38, +0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40, +0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3, +0x30,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, +0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f, +0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40, +0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32, +0x39,0x3e,0x7, 0x90,0x30,0x55,0x39,0x2b,0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, +0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b,0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f, +0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24, +0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b,0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65, +0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a,0x46,0x55,0x0, 0x1, 0x3, 0x5, 0x7, 0x8, +0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22,0x24,0x27,0x2a,0x2c, +0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, 0x14,0x1b,0x23,0x28, +0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53,0x4e,0x47,0x40,0x3b, +0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x1f,0x7, 0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x1f,0x7, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0x13,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x4c,0x0, 0xc2,0x14,0x75,0x4d,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x4e,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x21,0x10,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x36,0x72,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xd0,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33,0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0x9b,0x0, 0x0, 0x2, 0x37,0xed,0x0, 0x0, 0x0, 0x2, 0x37, +0xef,0x0, 0x0, 0x0, 0x1, 0x37,0xf1,0x0, 0x0, 0x1, 0x34,0x4f,0x0, 0x0, 0x1, 0x39, +0x11,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x2, 0x34,0x9f,0x0, 0x0, 0x0, 0x1, 0x34, +0xa1,0x0, 0x0, 0x1, 0x34,0xaf,0x0, 0x0, 0x1, 0x34,0xc4,0x0, 0x0, 0x1, 0x34,0xc5, +0x0, 0x0, 0x1, 0x35,0x3e,0x0, 0x0, 0x1, 0x35,0x3f,0x1, 0x0, 0x1, 0x35,0x40,0x0, +0x0, 0x3c,0x35,0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x36,0x61,0x0, 0x0, 0x1, 0x36,0x62,0x0, 0x0, 0x1, 0x36,0x63,0x0, 0x0, +0x1, 0x35,0xe2,0x1, 0x0, 0x2, 0x35,0xe5,0x0, 0x0, 0x0, 0x1, 0x2f,0xa9,0x0, 0x0, +0x1, 0x2f,0xaa,0x0, 0x0, 0x1, 0x2f,0xab,0x0, 0x0, 0x1, 0x2f,0xac,0x0, 0x0, 0x1, +0x36,0x66,0x1, 0x0, 0x1, 0x36,0xe0,0x0, 0x0, 0x1, 0x39,0x12,0x0, 0x0, 0x6, 0x38, +0xfb,0x3f,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x39,0x1, 0x24,0x0, 0x1, 0x39,0x8, +0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x1, 0x39,0xb, 0x0, +0x0, 0x1, 0x39,0xc, 0x0, 0x0, 0x1, 0x0, 0x4f,0x0, 0x0, 0x1, 0x3, 0xec,0x0, 0x0, +0x4, 0x37,0x40,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39,0x3, +0x0, 0x0, 0x2, 0x39,0x4, 0x0, 0x0, 0x0, 0x1, 0x39,0x6, 0x64,0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x39,0x13,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x2, 0x2b,0xb9,0x2b,0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, +0x0, 0x1, 0x38,0xdd,0x0, 0x0, 0x1, 0x38,0x3e,0xff,0x0, 0x1, 0x38,0x3f,0x0, 0x0, +0x1, 0x38,0x40,0x0, 0x0, 0x1, 0x38,0x41,0x40,0x0, 0x1, 0x38,0x42,0x40,0x0, 0x4, +0x38,0xf3,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf7,0x0, 0x0, 0x64,0x0, 0x0, 0x4, +0x38,0xc0,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x38,0xc4,0x0, 0x0, 0x68,0xc0,0x0, 0x4, +0x38,0xc8,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x38,0xd9,0x0, 0x0, 0x40,0x0, 0x0, 0x4, +0x39,0xd, 0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58, +0x0, 0xc, 0x0, 0xfa,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78, +0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, +0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, +0x0, 0x1e,0x12,0x3f,0x13,0x12,0x69,0x8e,0x12,0x23,0xb, 0x12,0x28,0x48,0x12,0x8d, +0xec,0x2, 0x23,0x4, 0x74,0x1, 0x7a,0xb3,0x36,0x6a,0x22,0x12,0x73,0x71,0x12,0x23, +0x40,0x2, 0x23,0x14,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x1d,0x7d,0x43,0x7e, +0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34, +0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22, +0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x23,0x1d,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, +0x7a,0x2, 0x23,0x1d,0x7e,0x34,0x60,0xa3,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x46, +0xa2,0x12,0x73,0x28,0x12,0x3f,0x13,0x12,0x69,0x87,0x12,0xc0,0x25,0x12,0x23,0xb, +0x12,0x28,0x48,0x12,0x68,0x23,0x12,0x8d,0xec,0x2, 0x23,0x4, 0x7e,0x34,0x61,0x4f, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x7a,0x37,0x28, +0x95,0x7e,0x34,0x61,0xba,0x12,0x23,0x9e,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8, +0x12,0x23,0x9e,0x7a,0x37,0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0x9e,0x7a,0x37, +0x28,0x9b,0x7e,0x34,0x61,0xbc,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61, +0xbe,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0x9e,0x12, +0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x20,0xde,0x12,0x25,0xc3,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0x9e, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0x9e,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x3c,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0xb7,0xc7,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x36, +0xe1,0x7e,0x34,0x61,0x51,0x12,0x23,0x9e,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x36,0xe2, +0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe3,0x7e,0x34, +0x61,0x57,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe4,0x7e,0x34,0x61,0x59, +0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe5,0x7e,0x34,0x61,0x5b,0x12,0x23, +0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe6,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x36,0xe7,0x12,0x20,0xb9,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x37,0x12,0xe5,0x28,0x7a,0xb3,0x37,0x1, 0x22,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a,0x4d,0x90,0x60, +0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0xc0, +0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93, +0x7a,0xb3,0x2a,0x59,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x62,0x12,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60, +0xa0,0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3, +0x16,0x92,0x22,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e, +0x12,0xc0,0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x37,0xa0,0xbe,0xf0,0x5, 0x78, +0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78, +0x13,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b,0xe4,0x7a,0xb3,0x2b,0x2, 0x12, +0x7a,0x2d,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x49,0xd, 0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x69,0xab,0x12,0xc1,0x1, +0x80,0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b, +0x12,0x2f,0xf4,0x50,0xfb,0x12,0x88,0x17,0x12,0x69,0x97,0x12,0x28,0x48,0x74,0x2, +0x7a,0xb3,0x37,0xa0,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3, +0xed,0x7a,0x37,0x3, 0xef,0x22,0x7e,0xb3,0x37,0x6, 0x14,0x68,0x60,0x14,0x78,0x2, +0xe1,0x10,0x14,0x68,0x73,0x24,0x3, 0x68,0x2, 0xe1,0x5, 0x12,0xc1,0x32,0x38,0x8, +0x30,0x10,0xf, 0x12,0xc1,0x2a,0x68,0xa, 0x12,0x63,0x2, 0xe4,0x7a,0xb3,0x38,0x85, +0x80,0x7e,0x7e,0xb3,0x36,0xe7,0x30,0xe0,0x77,0x7e,0x73,0x36,0xe8,0xa, 0x27,0x7e, +0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64, +0x12,0x23,0x9e,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x83,0x50,0x53,0x12,0x63,0x2, +0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x38,0x87,0x80,0x43,0x12,0xc1,0x32, +0x28,0x39,0xe4,0x7a,0xb3,0x37,0x6, 0x7e,0xb3,0x38,0x85,0xb4,0x1, 0x6, 0x74,0x1, +0x7a,0xb3,0x37,0x6, 0xd2,0x17,0x80,0x23,0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x45,0x73,0x12,0x23,0x54,0xe4,0x7a,0xb3,0x37,0x6, 0x7a,0xb3,0x39, +0x7, 0xd2,0x17,0x80,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x39,0x7, +0x12,0x90,0xd2,0x2, 0x27,0x16,0xca,0xd8,0xca,0x79,0x7e,0xb3,0x37,0x6, 0xb4,0x1, +0x2, 0x80,0x3, 0x2, 0x28,0x38,0x6c,0xdd,0x6c,0xff,0x12,0x91,0x11,0x7d,0xf3,0x12, +0x2f,0xf4,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x38,0x86,0x12,0x3d,0xac,0x12,0x13,0xc7, +0x12,0x0, 0x1e,0x74,0xa, 0x12,0x45,0x15,0x12,0xc0,0xe7,0x7e,0xe7,0x2b,0xd, 0x7a, +0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3,0x2a,0xfa,0x7e,0xe7,0x2b,0xd, +0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3,0x2a,0xfa,0x12,0x7b,0xd0,0x7c, +0x7b,0x74,0x6, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x1e,0xb9,0x7d,0x23,0x7d,0x3f, +0x12,0x25,0x3c,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12,0x4e,0xe0,0x12,0x26,0x57,0x7e, +0xb3,0x37,0x31,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, 0x74,0xa, 0x12,0x91,0x5d,0x12, +0x4f,0xaf,0x80,0xf, 0x80,0x7, 0x12,0x45,0xcf,0xe4,0x12,0x46,0x7, 0x20,0x93,0xf6, +0x12,0x45,0x9f,0x30,0x18,0xf7,0x30,0x17,0xf4,0xd2,0x4, 0x12,0x45,0x5a,0xe4,0x12, +0x13,0xde,0xb, 0xd0,0x12,0x4c,0x83,0x12,0x91,0x76,0x7e,0xa3,0x38,0x85,0x4c,0xaa, +0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x86,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x31, +0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x85,0x12,0x28,0x3d,0x78,0x18,0x7e,0xb3,0x38,0x85, +0x60,0x12,0xe4,0x7a,0xb3,0x38,0x85,0x7a,0xb3,0x2a,0x2, 0x7a,0xb3,0x2a,0x3, 0x7e, +0xf0,0x1, 0x80,0x1d,0x12,0x28,0x3d,0x68,0x10,0x7e,0xb3,0x38,0x85,0x70,0xa, 0x7e, +0xf0,0x1, 0xe4,0x7a,0xb3,0x37,0x6, 0x80,0x8, 0xbe,0xd0,0x32,0x50,0x3, 0x2, 0x27, +0x8c,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a,0x37,0x2b,0xd, 0x7a,0xe3,0x2a, +0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x48,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x38, +0xf2,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34, +0x39,0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34, +0x3a,0x22,0xca,0x3b,0x12,0x2f,0xf4,0x50,0xfb,0x7e,0xf3,0x2b,0xf, 0x7c,0xbf,0x12, +0xb3,0xfc,0x12,0xb4,0x13,0x7e,0xb3,0x2b,0x1f,0xf5,0x28,0x7e,0xb3,0x2b,0x20,0xf5, +0x29,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0xf, 0x12,0x8d,0x6c,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x28,0x48,0xc3,0x21,0x6c,0x12,0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x7, 0x12,0xac,0x20,0x7a,0x37,0x37,0xe3,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x69,0x8e,0x12,0xac,0xe, 0x7e,0xc3,0x3, 0xec,0x12,0x6e,0x31, +0xe4,0x12,0x13,0xde,0x12,0x28,0x48,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x2a,0x7e,0x18, +0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x7a,0xc8,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x2a, +0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x7a,0xc8,0x7e,0xd3,0x2b,0x1f,0x7e, +0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5,0x29,0x12,0x6e,0x8b,0x50,0x5, +0x7c,0xbc,0x12,0xb3,0x54,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d, +0x10,0x12,0x6a,0xd4,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3,0x2b,0x20,0x7c,0xbf,0x12,0x86, +0xf8,0x12,0xaa,0x18,0x7e,0xb3,0x39,0x7, 0x4, 0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39, +0x7, 0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x7, 0x7e,0xb3,0x16,0x90, +0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e, +0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, 0x37,0x2d,0x32,0x22,0x12,0x48, +0x7, 0x7e,0xb3,0x37,0x8, 0xb4,0x3, 0x6c,0x12,0xb6,0xe2,0x12,0x26,0x57,0x12,0x3f, +0xfb,0x7e,0xb3,0x37,0x9c,0x30,0xe7,0xe9,0x12,0x28,0x62,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18,0x12,0xab,0xdb,0x12,0x75,0xe9, +0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x88,0x5f,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x58,0x52,0x12,0x48,0x39,0x12,0x3a,0x9f,0x7e,0xb3,0x37,0x9c,0x54,0x7f,0x7a,0xb3, +0x37,0x9c,0x80,0x8d,0x12,0x2f,0xee,0x2, 0x0, 0x46,0x7a,0xb3,0x2b,0x2, 0x7a,0xb3, +0x2b,0x1e,0x22,0x12,0x52,0x6d,0x12,0x2b,0xfa,0x12,0x2b,0xfa,0x12,0x36,0xac,0x12, +0x9c,0xfd,0x12,0x9f,0xef,0x12,0x2b,0xfa,0x12,0x9b,0xe7,0x12,0x2b,0xfa,0x12,0xa0, +0xae,0x12,0x2b,0xfa,0x2, 0x2a,0x27,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c,0xdd, +0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x25,0x7e,0x8, 0x35,0xe9,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18,0x26, +0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0x41,0xfb, +0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9,0x9, +0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x36,0x74, +0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36, +0x26,0xa, 0x37,0x12,0x81,0xbf,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x25,0x12,0xa1,0x4b,0x2d,0x13,0xbd,0xc1,0x28, +0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68,0x39, +0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x2c,0x40, +0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34,0x74, +0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71,0x74, +0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe8,0xbc, +0x7e,0x28,0x2, 0x41,0x60,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x33,0x12,0x2f,0xe4,0xbe,0xb0,0xff,0x68, +0x2b,0x9, 0x73,0x1f,0x35,0x12,0x30,0x3, 0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54,0x0, +0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, 0x12, +0x2f,0xe4,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc,0xf9, +0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19,0x75, +0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19,0xa3, +0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe,0x38,0x8a,0x90, +0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e, +0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xfd,0x12,0x97,0x4, 0x7e,0x8, 0x36, +0x25,0x74,0xff,0x12,0x20,0xde,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b, +0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xf5, +0x7a,0xf3,0x35,0xe8,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb3,0x28, +0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee, +0x80,0x2e,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x25,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac, +0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa, +0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbf,0x12,0x2f,0xd0,0xb, 0xf0,0xb, 0xe0, +0x12,0x9c,0xf6,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c,0xba,0x7c,0x7d, +0x12,0x30,0x3, 0xb, 0x1a,0x30,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3, +0x2a,0x6f,0xf5,0x40,0x7e,0xb3,0x2a,0x70,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a, +0xb3,0x33,0xc2,0x7a,0xb3,0x33,0xc0,0x7a,0xb3,0x33,0xc1,0x7e,0x8, 0x1f,0x34,0x12, +0x2f,0xdd,0xe4,0x12,0x20,0xde,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x33,0xc3,0xe4, +0x12,0x20,0xde,0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa2,0x6c,0xcc,0xe1,0x91,0x12,0xc0, +0x8b,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, +0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34,0x7c, +0xbd,0x14,0xbc,0xbc,0x78,0x2, 0xe1,0x97,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x88, +0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, 0xb3, +0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x28,0xe5, +0x27,0xa, 0x2b,0xe5,0x25,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0, +0x4, 0x40,0x2, 0xe1,0x86,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x86,0x85,0x25, +0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb0,0x69,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x40,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83,0x80, +0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2b, +0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x40,0x2d,0x34, +0xbd,0x38,0x18,0x2, 0xe1,0x1d,0x75,0x30,0x1, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x1, +0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x4, +0x40,0x2, 0xe1,0x1d,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x1d,0x7c,0xbf,0x20, +0xe0,0x2, 0xe1,0x1d,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26,0xbe, +0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1, +0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25, +0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50, +0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29, +0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x5, +0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24,0xe5, +0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29, +0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x5, +0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24,0xe5, +0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85,0x2b, +0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x2c,0x40,0x7a,0x35,0x3e,0xe5,0x2a, +0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe,0xb1, +0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93,0x5, +0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0,0x5, +0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c,0x50, +0xad,0xe5,0x2c,0x12,0x2f,0xae,0xe5,0x2a,0x12,0x2f,0xa5,0xe5,0x2a,0x12,0x2f,0xae, +0xe5,0x2c,0x12,0x2f,0xa5,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20,0x5, +0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x42, +0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0xe5,0x42,0xa, 0x1b, +0x6d,0x0, 0x12,0x1e,0xeb,0x7f,0x21,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, +0x28,0x12,0x1e,0xfc,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23, +0x3e,0x24,0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe, +0xb0,0x0, 0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x33,0xbf,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f, +0x34,0xf5,0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x1f,0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0xc0,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x8e,0x7e,0x8, 0x1f,0x34,0x12,0xaf,0x94,0x7a,0xb3, +0x33,0xc2,0xda,0x3b,0x22,0x7e,0x71,0x2d,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7e,0x71, +0x2b,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7c,0x7b,0x12,0x77,0xf6,0x9, 0xa2,0x27,0x72, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x91,0x6d,0x5c,0xba,0x22, +0x7e,0x70,0x1, 0x2, 0x51,0x5f,0xa, 0x3b,0x9d,0x32,0x2, 0x21,0x0, 0x90,0x60,0x9a, +0x93,0xa, 0x3b,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x12,0x2f, +0xf4,0x50,0xfb,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x7c,0x5b,0x7e,0x43,0x28, +0x84,0xbe,0x40,0x1, 0x28,0x2, 0x21,0x14,0x7e,0xa3,0x2a,0x6e,0x7e,0x70,0x2, 0xac, +0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x30,0x3, +0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc,0x7c,0x9d,0x7e,0x83,0x2a, +0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc,0xa, 0xa8,0x1b,0xa5,0xa, +0x5f,0xbd,0x5a,0x58,0x2, 0x21,0x14,0xa, 0x59,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48, +0x4e,0x7c,0xb9,0x14,0x12,0x31,0x5a,0x50,0x46,0x7c,0xb9,0x14,0x12,0x31,0x17,0xb, +0x1a,0xe0,0x7d,0x3b,0x12,0x31,0x4c,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf, +0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12, +0x31,0x1e,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x31,0x20,0x1b,0x1a,0xa0,0xa, +0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9,0x4, 0x12,0x31,0x5a,0x50, +0x43,0x7c,0xb9,0x4, 0x12,0x31,0x17,0xb, 0x1a,0xe0,0x7d,0x3c,0x12,0x31,0x4c,0x8, +0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12, +0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x31,0x1e,0xb, 0x1a,0x50,0xbd,0x5a,0x8, +0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x31,0x27,0x7d,0xd3,0x7d,0x5d,0x3e,0x54, +0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43,0x2a,0x6e,0x90,0x60,0xab, +0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7c,0x75,0xac,0x74,0xa, +0x2a,0x2d,0x32,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40, +0x2d,0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xab,0x6c,0x77,0x80,0x12, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x51,0x4f,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22, +0xb, 0x70,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe5,0xc3,0x22,0x12,0x36,0x9c, +0x60,0x30,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1b,0x7c,0xb2,0x12, +0x31,0x27,0x7d,0x3, 0x12,0x36,0x94,0x49,0x55,0x38,0xe8,0x7d,0x40,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd4,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc0,0xde,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0x41,0xdd,0x6c,0xcc,0x41,0xcf,0x12,0xc0,0x8b,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xb, 0x7e,0xb3,0x36,0x71,0x70, +0x5, 0x12,0x32,0xe0,0x80,0x6, 0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x30, +0x19,0xd2,0x3, 0x12,0x32,0xe7,0x7e,0xb3,0x36,0xec,0xb4,0x1, 0x1b,0x7e,0xb3,0x2a, +0x3, 0xb4,0x1, 0x14,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xd, 0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x3, 0x12,0x32,0xe0,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x27,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, +0x2d,0x1b,0x24,0xe5,0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24, +0x0, 0x80,0x3c,0xe5,0x24,0xbc,0xbc,0x68,0x34,0x12,0x35,0xda,0x9, 0xa3,0x26,0xfa, +0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5,0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x2f,0xd6, +0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a,0xa, 0x2b,0xe5,0x28,0x12,0x2f,0xd6,0xbe, +0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12, +0x36,0xa4,0x38,0xbf,0xe5,0x27,0x7e,0x71,0x28,0x12,0xa0,0x94,0x50,0x8, 0x12,0x31, +0x7d,0x12,0x35,0xd3,0x80,0x8, 0x12,0x69,0x84,0x50,0x3, 0x12,0x32,0xe0,0xe5,0x25, +0x7e,0x71,0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x33,0x21,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x16,0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e, +0x34,0x27,0x78,0x6d,0x22,0x12,0x7f,0xc5,0x12,0x31,0x7d,0xb, 0xf0,0xb, 0xc0,0x7e, +0x73,0x28,0x84,0xbc,0x7c,0x28,0x2, 0x21,0xc9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22, +0x75,0x25,0x3, 0x75,0x26,0x3, 0x22,0x12,0x36,0x9c,0x60,0x34,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1f,0x7c,0xb2,0x12,0x31,0x27,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x36,0x94,0x59,0x35,0x38,0xe8,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72,0x38,0xd0, +0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x35, +0x80,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x35,0x80,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x30,0x3, 0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x90,0x50,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0xc7,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0xb1,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0xaf,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0xaf,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x40,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0xaf,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x35,0x65,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x35,0x65,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0xb8,0xa8,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x35,0x56,0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x35,0x56,0x9f,0x51,0x12,0x35,0x5d,0x9f,0x41,0x12,0x35,0x5d,0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0xeb,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xdf,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x35,0x71,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x35,0x71,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1e,0xeb,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x0, 0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x7, 0x2e,0x18,0x0, 0x20,0x22, +0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34, +0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39, +0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39, +0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d, +0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba, +0xda,0xf8,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x74,0xf5,0x27,0x12,0x0, 0x66,0x50,0x2, 0xc1, +0x6f,0x6d,0x33,0x9e,0x37,0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x70,0x7e, +0xb3,0x16,0x92,0x70,0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x60,0x7e,0x77,0x2a,0x51, +0x7e,0x67,0x2a,0x53,0x75,0x24,0x0, 0x80,0x4e,0xe5,0x24,0x12,0x2f,0xb7,0x60,0x45, +0x12,0x35,0xda,0x12,0x9d,0x80,0xf5,0x26,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90, +0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26,0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26, +0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0xd, 0xe5,0x25,0xa, 0x2b,0xe5, +0x27,0x12,0x9b,0x18,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x51,0x5f,0x12, +0x35,0xda,0x12,0x37,0x9f,0x5, 0x24,0x12,0x36,0xa4,0x38,0xad,0x12,0xa6,0x5, 0xda, +0x3b,0x22,0x12,0x46,0xa2,0x12,0x24,0x9a,0x12,0x73,0x28,0x12,0x22,0xf2,0x7e,0xb3, +0x37,0x8, 0x24,0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x58,0xf0,0x80,0xef,0x12, +0x29,0x7e,0x80,0xea,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x90,0x60, +0xa7,0xe4,0x93,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x12,0xa5,0xee,0x12, +0x9b,0x49,0x12,0x35,0xe2,0x12,0x9a,0x38,0x2, 0x36,0xbb,0xca,0x3b,0x12,0x2b,0xfa, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x9, 0xe4,0x7a,0xb3,0x35, +0xe4,0x7a,0xb3,0x35,0x69,0x7e,0xb3,0x35,0xe2,0x70,0x69,0x6c,0x99,0x80,0x5d,0x74, +0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x9a,0xed, +0x40,0x48,0x6c,0xee,0x80,0x3c,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x6a,0x9, 0xc5, +0x35,0x6b,0xa, 0x28,0xa, 0x3d,0x12,0x37,0x67,0x78,0x25,0xa, 0x2f,0xa, 0x3c,0x12, +0x37,0x67,0x78,0x1c,0x7c,0xb9,0x12,0x37,0x6f,0x7e,0x14,0x62,0x2b,0x12,0x87,0xee, +0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x51,0x5f,0x7c,0xb8,0x7c,0x7f,0x12,0x37,0xa7, +0xb, 0xe0,0x7e,0x73,0x35,0xe4,0xbc,0x7e,0x38,0xbc,0xb, 0x90,0x7e,0x73,0x28,0x84, +0xbc,0x79,0x38,0x9b,0x7e,0x73,0x35,0x69,0x7a,0x73,0x35,0xe4,0xa, 0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x35,0xa6,0x7e,0x8, 0x35,0x6a,0x12,0x20,0xb9,0x1b,0xfd,0xe4, +0x7a,0xb3,0x35,0xe2,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x0, 0x4d,0x33,0x22,0x7c, +0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x2, 0x2c, +0x40,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0x99,0x6c,0x7f,0x71,0x7c,0xbf,0x12, +0x37,0x6f,0x12,0xa4,0xcf,0x7f,0x17,0x12,0x1f,0x58,0x7c,0xb7,0xda,0xf8,0x22,0x9, +0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c,0x6b,0x7e,0xa3,0x35,0x69,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x62,0x35,0xa6,0x19,0x72,0x35,0xa7,0x7c,0xba,0x4, 0x7a,0xb3,0x35, +0x69,0x22,0xca,0xf8,0x6c,0xff,0x80,0x18,0x7c,0xbf,0x12,0x37,0x6f,0xbe,0x37,0x2a, +0x5c,0x58,0xb, 0x12,0x51,0x5b,0x7e,0x70,0x2, 0xac,0x7f,0x12,0x37,0x9f,0xb, 0xf0, +0x12,0x52,0x66,0x38,0xe3,0x12,0x2b,0xfa,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe, +0xa0,0x34,0x38,0x3, 0x2, 0x38,0xfd,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x10, +0x41,0x1c,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d, +0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x31,0xce,0x7e,0x39,0xb0,0xbe,0xa0,0x37, +0x68,0x2, 0x41,0x1c,0x75,0x1a,0x36,0x41,0x1c,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0, +0x39,0x78,0x1b,0x7e,0xf3,0x37,0xc0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc0,0xbe,0xa0, +0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x1c,0xbe,0xa0, +0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xc2,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc2,0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b, +0x44,0x41,0x1c,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x1c,0xbe,0xa0, +0x5e,0x78,0x26,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, +0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x1c,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0, +0x3d,0x78,0x1b,0x7e,0xf3,0x37,0xc4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc4,0xbe,0xa0, +0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x1c,0xbe,0xa0, +0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xc6,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc6,0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a, +0x9d,0x41,0x1c,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x37,0x9c,0x41,0x1c,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e, +0xf3,0x37,0xe1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xe1,0xbe,0xa0,0x4f,0x78,0x3, 0x75, +0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x31,0xcc,0x7e,0x39,0xb0,0x41,0x1c,0xbe,0xa0,0x51, +0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, +0xff,0x7e,0xb3,0x37,0xec,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a, +0xb3,0x37,0xec,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0x1c,0xbe, +0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xb5,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xb5,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x3a, +0x1f,0x41,0x1c,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0x91,0x41,0x1c,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e,0xbe,0xa0, +0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0xa, 0x9, 0xb3,0x31,0xd4,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1a,0xf4,0x80,0x5c, +0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5, +0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10, +0x3e,0x14,0x7e,0x1f,0x31,0xd0,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, +0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80, +0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c, +0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, +0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e, +0x3, 0x2a,0x6d,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x60,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, +0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, +0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x62,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca, +0xf8,0x80,0x38,0x7c,0xbf,0x12,0x3a,0x1f,0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70, +0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x12,0x3a,0xde,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x3a,0xde,0x7e,0x73,0x2a, +0x6e,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3, +0x2a,0x6d,0x74,0x2, 0xa4,0x22,0x12,0x3f,0xaa,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x37,0xdc,0x7e,0x8, 0x25,0xee,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x3f,0x49,0x80,0x12, +0xca,0x39,0x7e,0x18,0x37,0xdc,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x3f,0x67,0x2, 0x3b,0x15,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0xca,0xf8, +0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x7d,0xab,0xd2,0x6, 0xa1,0xa0,0xa5, +0xbe,0x1, 0x3d,0x7a,0x73,0x37,0x9d,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5,0xbf,0xae, +0x4, 0xd2,0x7, 0xa1,0xa0,0xa5,0xbf,0xaa,0x5, 0x12,0xc0,0xf8,0x80,0x1e,0xa5,0xbf, +0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xce,0x80,0x10,0xa5,0xbf,0xac,0x2, +0x80,0x2, 0xa1,0xa0,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xce,0x6d,0x33,0x81,0x1c, +0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x3d,0xa3,0xa5,0xbe,0x7, +0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xa0,0xa5,0xbe,0x8, 0x2, 0x80,0x2, 0xa1,0xa0, +0x12,0x7, 0xfb,0xa1,0xa0,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73,0x37,0xa6, +0xa1,0xa0,0xa5,0xbe,0xb, 0x8, 0x12,0x3d,0xa3,0x12,0x3f,0xc8,0xa1,0xa0,0xbe,0x60, +0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x38,0xbe,0x60,0x1e,0x40,0xd, 0xbe, +0x60,0x23,0x38,0x8, 0x12,0x3d,0xa5,0x43,0xc, 0x40,0xa1,0xa0,0xbe,0x60,0x15,0x40, +0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x3d,0xa5,0xd2,0x6, 0xa5,0xbe,0x15,0x2, 0x80, +0x2, 0xa1,0xa0,0x74,0x7, 0x7a,0xb3,0x37,0xa0,0xa1,0xa0,0xa5,0xbe,0x19,0x7, 0xe4, +0x7a,0xb3,0x37,0xb5,0xa1,0xa0,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c,0x38,0x2, +0xa1,0x38,0xa5,0xbe,0x2d,0x1b,0x12,0x3d,0xa5,0x20,0x7, 0x2, 0xa1,0xa0,0x7e,0x63, +0x37,0xc8,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35,0x8, 0xa1, +0xa0,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, 0xa1,0x38, +0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1,0x38,0x7e,0x70, +0x64,0xa1,0x38,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, 0x1, 0x7e, +0xf3,0x37,0xc1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc1,0xa, 0x2f,0x19,0x72,0x2b,0x21, +0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x38,0xa1,0xa0,0xbe,0x60,0x3a, +0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xc3,0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, 0x80,0x2, +0xa1,0xa0,0x75,0x1a,0x3a,0xa1,0xa0,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, 0x7a,0x73, +0x2b,0x12,0xa1,0xa0,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xec,0xa1,0xa0,0xbe,0x60, +0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc5,0x7c,0xbf, +0x4, 0x7a,0xb3,0x37,0xc5,0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d,0x2, 0x80, +0x2, 0xa1,0xa0,0x75,0x1a,0x3c,0xa1,0xa0,0xbe,0x60,0x3e,0x68,0x4, 0xa5,0xbe,0x3f, +0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc7,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc7,0xa, +0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x3e, +0xa1,0xa0,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x3d,0xa5,0x75, +0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x3d,0xa5,0x75,0xd, 0x2, 0x12,0x3a, +0xe6,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x3d,0xa5,0x12,0x3f,0x70,0x80,0x71,0xbe, +0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x3d,0xa5,0x80,0x63,0xbe,0x60,0x4e, +0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xe2,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xe2,0xa, 0x2f,0x2e,0x27,0x31,0xcc,0x7a,0x29,0x70,0xa5,0xbe,0x4f, +0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80,0x31,0xbe, +0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20,0x7c,0xb7, +0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, 0x7e,0x1f, +0x31,0xd0,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a,0x71,0xf, +0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0x9c,0x22,0x7a,0xb3,0x2b,0x0, +0x70,0x14,0x12,0x3f,0x67,0x12,0x3b,0x15,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4, +0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x3f,0x49,0x12,0x3b,0x15,0x12, +0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12,0x0, 0x1e, +0xe4,0x12,0x3d,0xac,0x12,0x3d,0xf3,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12,0x3d,0xac, +0x2, 0x3d,0xf3,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e,0x8, 0x1f, +0x44,0x12,0x3f,0xe9,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x20,0xde,0x7e, +0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x1f,0xda,0x7e, +0x34,0x0, 0xa, 0x12,0x20,0xde,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc,0x7a,0x1d, +0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, 0x2a,0xb9, +0x12,0xba,0x6c,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, 0x3a,0x2e, +0x34,0x20,0x73,0x12,0x91,0x6d,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12, +0x3f,0xb, 0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a, +0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9, +0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x3f,0xb, 0xa, 0x4a, +0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde, +0x38,0xd8,0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0, +0x12,0xb9,0x2, 0x80,0x3, 0x12,0x3f,0xd9,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f, +0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e, +0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34, +0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e, +0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x12,0xaf,0x1f,0x12,0x13,0xf5,0x12, +0xb9,0x8e,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x3f,0xcb,0x74,0x1, 0x12, +0x3d,0xac,0x12,0x3f,0xd2,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x3d,0xdb,0x7e, +0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25, +0xee,0x22,0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x3f,0x67,0x80,0x6, 0xb4,0x1, 0x6, +0x12,0x3f,0x49,0x12,0x3b,0x15,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22, +0x12,0x3f,0xaa,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x37,0xdc, +0x12,0x20,0xb9,0x1b,0xfd,0x12,0xc0,0xef,0x12,0x3f,0x49,0x80,0x1a,0xca,0x39,0x7e, +0x18,0x2b,0x70,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x37,0x2b,0x76, +0x7a,0x37,0x31,0xcc,0x12,0x3f,0x67,0x2, 0x3b,0x15,0x7e,0xb3,0x37,0xe0,0x7e,0x34, +0x0, 0x4, 0x22,0x7c,0x6b,0x12,0x3f,0xe1,0x78,0x5, 0x7c,0xb6,0x2, 0x7d,0xd6,0xb4, +0x4, 0x5, 0x7c,0xb6,0x2, 0x3b,0x1e,0x22,0xb2,0x82,0x22,0x7d,0x32,0x74,0xfa,0x2, +0x12,0xd0,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x20, +0xde,0x7e,0xb3,0x37,0x9c,0xc4,0x54,0x7, 0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, +0x20,0xde,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x30,0x6, 0x3b,0xc2,0x6, +0x12,0x25,0xe6,0x7e,0x73,0x37,0xa1,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x37,0xa2,0x7a, +0x73,0x2b,0x1d,0x7e,0x73,0x37,0xa2,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x37,0xa3,0x60, +0x18,0x7e,0x34,0x0, 0x2, 0x12,0x41,0x5d,0x7e,0x34,0x0, 0x1, 0x12,0x41,0x5d,0x6d, +0x33,0x12,0x41,0x5d,0xe4,0x7a,0xb3,0x37,0xa3,0x12,0x4f,0xfa,0x2, 0x40,0x3f,0xe5, +0xc, 0x70,0x2, 0x21,0x5c,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x72,0x92, +0x12,0x79,0x31,0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53, +0xc, 0xfd,0x12,0xba,0x23,0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b, +0x12,0x60,0x9, 0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65, +0x7e,0x73,0x2b,0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x4, +0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3, +0x45,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xce,0x7a,0x73,0x2b,0xf, 0x12,0x87,0x52,0x7a, +0xb3,0x0, 0x4f,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x4f,0x7a, +0x73,0x37,0xa6,0x12,0x6e,0x29,0x12,0xc0,0x42,0x7e,0x73,0x37,0xcf,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4, +0x12,0xa, 0x66,0x12,0x8d,0xec,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43, +0x37,0xd0,0x7e,0x50,0xa, 0xac,0x45,0x12,0x3f,0xcb,0xe5,0xc, 0x30,0xe6,0x4e,0x53, +0xc, 0xbf,0x7e,0x73,0x37,0xbc,0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37, +0xbc,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x43,0xeb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63, +0x37,0xbc,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12,0x47,0x81,0x7c,0x65,0x4c,0x76,0x74, +0xe, 0x12,0x43,0x5f,0x12,0x43,0xeb,0x12,0x43,0xf3,0x7e,0x73,0x37,0xbf,0x7a,0x73, +0x2b,0x14,0x7e,0x73,0x37,0xbe,0x7a,0x73,0x2b,0x1f,0x12,0xc1,0x1, 0xe5,0xc, 0x30, +0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xa6,0x2, 0x48,0x77,0x22,0xca,0xd8,0xca, +0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c, +0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x57, +0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x43,0xeb,0x7c,0x8b,0x74,0x7, 0x7e, +0x70,0xf, 0x12,0x43,0xf0,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, +0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, +0xc, 0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e, +0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x38,0xc4,0x12,0x43, +0x48,0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x38,0xc4,0x78,0x7, 0x12,0x43, +0x48,0x54,0xfb,0x80,0x5, 0x12,0x43,0x48,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x38, +0xc0,0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e, +0xa0,0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0x12,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff, +0xe, 0x12,0x43,0x53,0x54,0xe6,0x12,0x43,0x50,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12, +0x43,0x53,0x5e,0x54,0xfe,0xe6,0x12,0x43,0x50,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4, +0x0, 0x2, 0x78,0x2d,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e,0x54,0x0, 0xf, 0x1b, +0x1a,0x50,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34, +0x0, 0x2, 0x12,0x44,0x72,0x12,0x44,0x4b,0x12,0x44,0x28,0x7a,0x37,0x31,0xd4,0x61, +0x4, 0x6c,0xdd,0x41,0xfe,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40, +0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, +0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c, +0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e, +0x54,0x0, 0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4, +0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, +0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, +0x3b,0x12,0x44,0x72,0x12,0x44,0x4b,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x44,0x4b, +0x12,0x44,0x28,0x74,0x2, 0xac,0xbd,0x59,0x35,0x31,0xd6,0x80,0xf, 0x12,0x44,0x28, +0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x31,0xd6,0xb, 0xd0,0xbc,0xed, +0x28,0x2, 0x41,0x65,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x43,0xf0,0xa9,0xc0, +0xc4,0x7e,0x1f,0x38,0xc0,0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x38,0xc0,0x79,0xf1,0x0, +0x90,0x6d,0x33,0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0x8, 0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x10,0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22, +0x1b,0x1a,0x50,0x7e,0x1f,0x38,0xc0,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5, +0xfd,0x7a,0x71,0xfe,0x22,0xca,0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12, +0x43,0x5f,0x74,0xf, 0x12,0x43,0xeb,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe, +0x12,0x43,0x5f,0x74,0xc, 0x12,0x43,0xeb,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, +0x7e,0x70,0xf8,0x12,0x43,0x5f,0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, +0x38,0xb, 0x12,0x45,0x6, 0x7c,0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17, +0xe4,0x93,0xb4,0x1, 0xe, 0xbe,0xa0,0x7, 0x28,0x9, 0x12,0x45,0x6, 0xa, 0x77,0x2e, +0x74,0x0, 0x7, 0x74,0xe, 0x7c,0x7f,0x12,0x43,0x5f,0x74,0x7, 0x12,0x43,0xeb,0x7c, +0xfb,0x5e,0xf0,0xfb,0x90,0x60,0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c, +0xf7,0x74,0x7, 0x7c,0x7f,0x12,0x43,0xf0,0xda,0x79,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x12,0x43,0x5f,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24, +0x7e,0x24,0x0, 0x12,0x12,0xb7,0xc7,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74, +0x3, 0x7e,0x71,0x27,0x12,0x43,0x5f,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x43,0x5f,0x74, +0xc, 0x7e,0x71,0x30,0x12,0x43,0xf0,0x22,0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0xa, +0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e, +0xf, 0x38,0xc4,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0x12,0x5e, +0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34, +0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x45,0x15, +0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6, +0x22,0x12,0x47,0xf8,0xc2,0x3, 0x12,0xb6,0x57,0xc2,0x5, 0x12,0x45,0x51,0xc2,0x3, +0x12,0x47,0x21,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0xeb,0x7a,0x1b,0xb0,0x74,0xf, +0x6c,0x77,0x12,0x43,0x5f,0xe5,0xfc,0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x43,0xf3, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x2a,0x12,0x44,0x6e,0x12,0xb6, +0xf, 0x2, 0xb6,0xc4,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x1a,0x12,0x44,0x6e,0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0xc, 0x12,0x44,0x6e,0x2, 0xb6,0xbe,0x74, +0x1, 0x7a,0xb3,0x33,0xff,0x22,0xa, 0x3a,0x2e,0x34,0x0, 0x3, 0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0x5f,0x7a,0x61,0xfc,0x12,0x43,0xf3, +0x12,0x46,0x68,0xd2,0x3, 0x12,0x47,0x21,0x12,0x45,0x6b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x45,0x6b, +0x2, 0x13,0x96,0x12,0x47,0xf8,0xc2,0x5, 0x2, 0x45,0x51,0xd2,0x5, 0x12,0x45,0x51, +0x74,0x1, 0x22,0x12,0x45,0xcf,0x12,0x91,0x8, 0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0xc0,0xd5,0x12,0x44,0x91,0x74,0x1, 0x12,0x46,0x7, 0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x45,0x30,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x45,0x5a,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x45,0xcf,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x46, +0x7, 0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x45,0x5a,0x74, +0x81,0x7a,0xb3,0x39,0x2, 0x22,0x80,0x1d,0x12,0x45,0xcf,0x12,0x47,0xff,0x68,0x5, +0xc2,0x4, 0x12,0x45,0x5a,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x17, +0x15,0xe4,0x12,0x46,0x7, 0x20,0x93,0xe0,0x12,0x45,0xcf,0xa9,0xd1,0xcd,0xa9,0xc5, +0xea,0x74,0x2, 0x2, 0x46,0x7, 0x22,0x7c,0xab,0x7e,0xb3,0x39,0x2, 0xb4,0x81,0x38, +0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf, +0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, +0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87, +0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0x2, 0x22,0xd2,0x3, +0x80,0x12,0x30,0x3, 0xc, 0x12,0x47,0xff,0x68,0x7, 0xc2,0x3, 0xc2,0x4, 0x12,0x45, +0x5a,0x12,0x45,0xd6,0x30,0x17,0xeb,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb, +0xd2,0x3, 0x12,0xb6,0x57,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, +0xa9,0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74, +0x41,0x12,0x45,0x15,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda, +0xf8,0x22,0xe4,0x12,0x46,0xf0,0x12,0xb6,0x60,0x12,0x26,0x57,0x12,0xb6,0xdb,0x12, +0x43,0x65,0x12,0xb6,0x5, 0x12,0xb6,0x77,0x12,0x0, 0x4a,0x12,0xb6,0x83,0x12,0x7e, +0xa0,0x12,0xb6,0x93,0xd2,0xaf,0x12,0x47,0x8a,0x12,0xb8,0x1e,0x12,0x43,0xfa,0x12, +0x46,0x68,0x7e,0x8, 0x3, 0xf1,0x12,0xa9,0xa3,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34, +0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0xa9,0xd0, +0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x45,0x51,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75, +0xc2,0xc, 0xd2,0x3, 0x12,0x47,0x21,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1, +0x22,0xa2,0x3, 0xa9,0x97,0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x7e,0x34,0x36,0xe1, +0x30,0xd, 0x4b,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x4f, +0x9, 0x53,0x0, 0x3, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12, +0x47,0x7f,0x7a,0x27,0x2a,0x53,0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a, +0x27,0x2a,0x5a,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a, +0x5c,0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0x45,0xc, 0x7a,0x37,0x2a,0x62,0x22,0xa, +0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12, +0x43,0xeb,0x7c,0x7b,0x12,0x43,0xf3,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e, +0x24,0x0, 0xef,0x7e,0xf, 0x38,0xc0,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e, +0xf, 0x38,0xc0,0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x38,0xc0,0x79, +0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x38,0xc0,0x79, +0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8a,0x7e, +0x34,0x6a,0xd1,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e, +0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8e,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x12,0xc0,0xf8,0x12,0xc0,0xef,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x48,0x56,0x12,0x48,0x30,0x74,0x50,0x7a,0xb3,0x37,0xd0,0x7e,0x24, +0x3, 0x20,0x12,0x3f,0xcb,0xe4,0x12,0xc0,0x27,0x6d,0x33,0x7a,0x37,0x39,0x4, 0x22, +0x7e,0x73,0x2b,0x62,0x7a,0x73,0x37,0xcf,0x22,0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37, +0xca,0x7e,0x73,0x37,0xce,0xbe,0x73,0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12, +0x48,0x56,0x12,0x48,0x30,0x22,0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x7e,0x73, +0x2b,0x1f,0x7a,0x73,0x37,0xbe,0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x7e,0x73, +0x2b,0x14,0x7a,0x73,0x37,0xbf,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, +0x12,0x48,0xe8,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80, +0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x48,0xe8,0x40, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c, +0xdd,0x7c,0xbd,0x12,0x8d,0xb3,0x12,0x48,0x6e,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x37, +0xbe,0x12,0x49,0x4, 0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x12,0x48,0x30,0x7a, +0xd3,0x37,0xa6,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26, +0x33,0xbc,0xbe,0x22,0x30,0x3, 0x3, 0x12,0x48,0x6e,0xa2,0x4, 0x92,0x5, 0x12,0x49, +0xc3,0x2, 0x49,0x4, 0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x22,0x74,0x40,0x12, +0x6e,0x8b,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x48,0xf4,0x80,0x1c,0x74,0x1, 0x12, +0x49,0x47,0x7e,0x43,0x37,0xbb,0x7e,0x50,0x64,0xac,0x45,0x12,0x87,0xf8,0x7a,0xb3, +0x2b,0x1f,0x7e,0xf, 0x38,0xd9,0x12,0x4d,0x9b,0x12,0x49,0x4, 0x7e,0x73,0x2b,0x1f, +0x7a,0x73,0x37,0xbe,0x2, 0x48,0x6e,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14, +0x12,0xc0,0x42,0x7e,0xc0,0xa, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x1f,0x38,0xd9,0x12,0x90,0x58,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, +0x12,0x49,0xb7,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12, +0x49,0xb7,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x49,0xb7,0xb, +0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x38, +0xd9,0x12,0x8f,0xfb,0x7d,0x73,0x7e,0x1f,0x38,0xc8,0x69,0x31,0x0, 0x1a,0x7a,0x73, +0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, 0x1a,0xb, +0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x37,0xb1, +0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5,0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3, +0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a,0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35, +0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x31,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x4e,0x5f,0x6c,0xff,0x80,0x35,0x12,0x4c, +0x40,0x6c,0xee,0x80,0x19,0x7e,0x11,0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac, +0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x10,0x12,0x4c,0x47,0xe5,0x2e, +0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12,0x4c,0x56,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34, +0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xc5,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34, +0x10,0x0, 0x12,0x4c,0x7c,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x78,0x12,0x4c,0x40, +0x6c,0xee,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2a,0xbc,0xbe,0x38,0xe6,0xe5,0x2a, +0x12,0x4c,0x56,0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x60,0xe5,0x2a,0xbe,0xb1,0x2d, +0x50,0x35,0x12,0x4c,0x40,0x7e,0xe1,0x2a,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2d, +0xbc,0xbe,0x38,0xe6,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5,0x2d,0xa, 0x1b,0x6d,0x0, +0x9f,0x1, 0x12,0x4c,0x5a,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x3, 0x62,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x82,0xe5,0x2d,0xa, 0x1b,0x6d, +0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x1f,0x7, 0x6c,0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, 0x9d,0x15,0xad,0x12, +0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21, +0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xcc, +0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x7, 0x6c,0xff,0x80, +0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x60,0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10, +0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x60,0xe5,0x2a, +0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x62,0x2e,0x14,0x10, +0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x62,0xb, 0xf0,0xe5,0x2b,0xbc, +0xbf,0x38,0x9e,0x7e,0x73,0x37,0xb3,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14, +0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x5, 0x7d,0xe3,0x7a,0xe5,0x35, +0x7e,0x73,0x37,0xb4,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d, +0x1f,0x12,0x1f,0x5, 0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, 0xac,0xbf,0x49,0x45, +0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x34,0x0, 0x80,0x8, +0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xda, +0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x60,0xbe,0x45,0x35,0x28, +0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x60,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65, +0x3, 0x60,0x49,0x45,0x3, 0x62,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35, +0x3, 0x62,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x62,0xb, 0xf0,0xe5,0x2b, +0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x31,0x12,0x4d,0x9b,0xda,0x3b,0x22, +0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a, +0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f, +0x7, 0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x1f,0x5, 0x7e,0xa1,0x2c,0x74, +0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x4e,0x5f,0x7e,0x1f,0x38,0xf3, +0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x6, +0x7e,0x38,0x38,0x88,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x87,0x70,0xe, 0x7e,0xb3,0x38,0x85,0x70,0x8, +0x74,0x1, 0x7a,0xb3,0x38,0x87,0xa1,0x57,0x7e,0xb3,0x38,0x87,0x70,0x6, 0x74,0x1, +0x7a,0xb3,0x38,0x87,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0, +0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61, +0x59,0x12,0x23,0x9e,0x7a,0x35,0x2e,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0xa6,0x56, +0x75,0x2c,0x0, 0x80,0x16,0x12,0x4c,0x7c,0x12,0x4d,0x84,0xbe,0x35,0x2a,0x8, 0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x84,0x7a,0x35,0x2a,0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c, +0x38,0xe3,0x12,0x4d,0x93,0x40,0x25,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x1e,0x5, 0x1c, +0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c,0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20,0xb9,0x1b,0xfd,0x74,0x2, 0x12,0x0, +0x1e,0x12,0x4d,0x93,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x38,0xf2,0xe4,0x7a,0xb3,0x38, +0x87,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, 0x21,0x0, 0x7f,0x13,0x2d,0x35,0xb, +0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35,0x2a,0x22,0x12,0x4d,0xa5,0xb, 0x34, +0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x12,0xc1,0x3a,0x4c,0xaa, +0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c,0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4, +0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60, +0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e,0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, +0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc, +0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, +0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12,0x1f,0x7, 0x7f,0x1, 0xb, 0xc, 0x7e, +0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f,0x7, 0xbe,0x34,0x0, 0xfa,0x28,0x4, +0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, 0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d, +0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e,0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e, +0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27, +0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e, +0x34,0x0, 0x38,0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12, +0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, +0x12,0x4e,0x8d,0x80,0x2, 0xe4,0x22,0x12,0x4e,0x72,0x74,0x1, 0x22,0x12,0xc0,0x9f, +0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0x12,0x7f,0x6f,0x38,0x2, +0xe4,0x22,0x12,0x7f,0x67,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x4e, +0xb4,0x2, 0x4e,0x7d,0x7e,0xd7,0x2b,0xd, 0xbe,0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12, +0x7e,0xf8,0x12,0x4e,0xe0,0x7a,0xd7,0x2b,0xd, 0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e, +0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, 0x12,0x4f,0xaf,0x74,0x1, 0x22, +0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b,0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a, +0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x4e,0xe0,0x12,0xc0,0xe7,0x12,0x29,0x6f, +0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x20,0xde,0x7e,0xd0,0x7, 0x12,0x26,0x57,0x6c, +0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x12,0x4f,0xf0,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, +0x3c,0xbd,0x32,0x48,0xde,0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x7e,0xb3, +0x2a,0x73,0x7c,0x7e,0x12,0x7b,0x31,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49, +0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0x4f,0xf0,0x5c,0x7b,0x7a, +0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe, +0xd0,0x0, 0x58,0x88,0x12,0x7b,0x39,0x74,0x2, 0x12,0xc1,0xa, 0x12,0x50,0x51,0x74, +0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2a,0xfa,0x12,0x4e,0xe0,0xda,0x3b,0x22,0x74,0x2, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x12,0x50,0x51,0x74,0x2, 0x12,0x0, 0x1e,0x74, +0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x4f,0xc1,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, +0x94,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x2e,0x34,0x20,0x73,0x12, +0x91,0x6d,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x38,0xc0,0x2d, +0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x74,0xbc,0x6a,0x38,0xd6,0x22, +0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, +0x30,0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x4e,0xe0,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, +0xfd,0x7e,0xb3,0x37,0xe0,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc1,0xa, 0x12, +0x50,0xd4,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xe1,0x7e, +0xb3,0x37,0xe0,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x3f,0x67,0x80,0x7, 0xe4, +0x12,0x0, 0x1e,0x12,0x3f,0x49,0x12,0x3b,0x15,0x7e,0xb3,0x2a,0xfc,0x2, 0x50,0x51, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x3f,0xe9,0x7e,0xa3,0x2a,0x73, +0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x62,0x2a,0xdc,0xa, 0x26, +0x12,0x51,0x4b,0x93,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x50,0xca, +0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xde,0x6c,0xee,0x80,0x1a,0xa, 0x2e, +0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12, +0x50,0xca,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30, +0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba, +0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27,0x2a,0xfe,0x7e,0x29, +0xb0,0xa, 0x26,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xe9,0x7e, +0xa3,0x2a,0x73,0x7e,0x63,0x2a,0x74,0x6c,0xee,0x80,0x1f,0xa, 0x2e,0x9, 0x72,0x2a, +0xdc,0xbe,0x70,0x1c,0x50,0x12,0xa, 0x27,0x12,0x51,0x4b,0x93,0x7c,0x7b,0x7e,0xb3, +0x2a,0xfb,0xa, 0x27,0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xdd,0x6c,0xee, +0x80,0x17,0xa, 0x3e,0x9, 0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a, +0xfb,0xa, 0x27,0x19,0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e, +0x30,0xe, 0xac,0x3e,0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11, +0xf8,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0x73,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7a,0xb3,0x34,0xc4,0x7c,0xbf,0x6c,0x77,0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x51,0x4f,0x93,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff, +0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0xca, +0xf8,0x6c,0xaa,0x6d,0x33,0x7e,0x24,0x7f,0xff,0x7e,0xf0,0x1, 0x80,0x32,0xa, 0x1f, +0x7e,0xb3,0x2a,0x6e,0xa, 0xb, 0x2d,0x1, 0x3e,0x4, 0x49,0x10,0x4, 0xfc,0xbe,0x14, +0x3, 0xe8,0x8, 0x1a,0xb, 0xa0,0xbd,0x13,0x8, 0x4, 0x7d,0x31,0x80,0x10,0xbd,0x12, +0x58,0xc, 0x7d,0x21,0xbe,0x24,0x0, 0x0, 0x18,0x4, 0x7e,0x24,0x0, 0x1, 0xb, 0xf0, +0x7e,0xb3,0x2a,0x6f,0xa, 0xb, 0x1b,0x4, 0xa, 0x1f,0xbd,0x10,0x48,0xc0,0x7e,0xb3, +0x34,0xa1,0x7a,0xb3,0x36,0xf3,0x7a,0xa3,0x36,0xf7,0xe4,0x7a,0xb3,0x36,0xf5,0xbe, +0xa0,0xb, 0x78,0x18,0x9d,0x32,0xbe,0x34,0x5, 0xdc,0x58,0x10,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x1, 0x5e,0x58,0x6, 0x74,0x1, 0x7a,0xb3,0x34,0xa1,0x7e,0x73,0x34,0xa1, +0xbe,0x70,0x0, 0x28,0x3e,0x6c,0xff,0x80,0x35,0x7c,0xbf,0x12,0x97,0xfc,0x60,0x22, +0x74,0x22,0x7a,0xb3,0x36,0xf4,0x7e,0xb3,0x34,0xc4,0x4, 0x12,0x51,0x57,0x7e,0x73, +0x34,0xc4,0xbe,0x70,0x5, 0x40,0x15,0xe4,0x7a,0xb3,0x34,0xc4,0x7a,0xb3,0x34,0xa1, +0x80,0xa, 0xe4,0x12,0x51,0x57,0x74,0x33,0x7a,0xb3,0x36,0xf5,0xb, 0xf0,0x12,0x52, +0x66,0x38,0xc6,0xda,0xf8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xca,0xd8,0xca, +0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x3c,0xe4,0x7a,0xb3,0x1f,0x58,0xe5,0x1d, +0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60,0xc, 0x12,0x8c,0x87, +0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x10,0x6d,0x88,0x7a,0x87,0x37, +0xfd,0x61,0xa0,0x12,0x93,0x91,0x60,0x12,0x7e,0x34,0x62,0xe, 0x12,0x87,0xc4,0x7a, +0x87,0x37,0xf3,0x12,0x54,0x2b,0x7a,0x87,0x37,0xfd,0x7e,0x87,0x37,0xf3,0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x7b,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x52,0x7c,0xbd, +0x7c,0x7e,0x12,0x55,0xb9,0x7d,0x93,0x7e,0x87,0x37,0xfd,0xbd,0x89,0x50,0x4, 0x7a, +0x97,0x37,0xfd,0x7e,0x87,0x38,0x3c,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x3c,0xe5, +0x1d,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x37,0xff,0x12,0x54,0x4e,0x50,0x7, 0x12, +0x54,0x45,0xd2,0x3, 0x80,0x2f,0x7e,0x8, 0x37,0xff,0x7e,0x18,0x1f,0x52,0x12,0x57, +0x0, 0x50,0x22,0x80,0x10,0x12,0x54,0x2b,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f,0x52, +0x12,0x91,0x86,0x50,0x10,0x12,0x54,0x45,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52, +0x12,0x93,0x6b,0xd2,0x3, 0xb, 0xf0,0x12,0x52,0x66,0x38,0x80,0x30,0x3, 0x37,0x6c, +0xff,0x80,0x20,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x58,0x12,0x54, +0x4e,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x54, +0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdb,0x75,0x1d,0x0, 0x7e,0x34,0x62,0xe, 0x12, +0x23,0x9e,0x7a,0x37,0x37,0xf3,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, 0xac,0x67,0xb, +0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x37,0xff,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x37,0x37,0xf3,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93,0xa, 0x3b,0xbe, +0x37,0x37,0xfd,0x38,0x40,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37,0x38,0x3c,0x38, +0x34,0x90,0x60,0x51,0x12,0x54,0x33,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, +0x24,0x90,0x60,0x50,0x12,0x54,0x33,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, +0x14,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x54,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf4,0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0xa2,0x3, 0x92,0x10,0x12, +0x56,0xe9,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xb, 0x70,0x1b,0x7e, +0xb3,0x28,0xa8,0x70,0x15,0x12,0xc1,0x2a,0x68,0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0, +0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x51,0x5f,0x22,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0xd5,0x26,0xfa,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x7c,0xbd, +0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f, +0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0, +0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, +0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38, +0xc9,0xa2,0x4, 0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28,0x99, +0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73, +0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f, +0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, +0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x55,0xa6,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3, +0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e, +0xb3,0x26,0x83,0x70,0x40,0x12,0x8f,0xe3,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x55,0xa6,0x49,0x2, +0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49, +0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, +0xf0,0xbc,0x7f,0x38,0xc9,0x12,0xb1,0x8e,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28, +0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28, +0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x55,0xaf,0x49,0x25, +0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x0, 0xbe,0x37,0x28,0x9d,0x8, +0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdc,0x6c, +0xff,0x80,0x9, 0x12,0x55,0xaf,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf2,0xda,0x79,0xda,0xd8,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0x7c, +0xbf,0x12,0x37,0x6f,0x74,0x2, 0xac,0xbf,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f, +0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c,0xcc, +0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c, +0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14, +0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12, +0x20,0xde,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a, +0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1c,0x75,0x26,0x0, +0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56,0xd3,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf1,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xdf,0x7c,0xec, +0x80,0x23,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80,0xa, 0x12,0x91,0xd5, +0x70,0xd, 0x12,0x56,0xd3,0xb, 0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5, +0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd8,0x1a,0x3c,0xb, 0x34,0x7c,0xe7, +0x80,0x1c,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56, +0xd3,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf1,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73, +0x2a,0x6e,0xbc,0x7e,0x18,0xdc,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x21,0x75,0x26, +0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xa, 0x12,0x91,0xd5,0x70,0xd, 0x12,0x56,0xd3,0xb, +0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e, +0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd7,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, +0xda,0x3b,0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35,0x24,0x22,0x12,0x57, +0x32,0x12,0x51,0x9f,0x7a,0xb3,0x2a,0xc, 0x22,0x30,0x10,0x13,0x12,0xc1,0x1a,0x68, +0x6, 0x7e,0xb3,0x39,0xb, 0x60,0x8, 0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x37,0xfb,0x22, +0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f, +0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x54,0x52,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76, +0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9, +0xc3,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34,0xa2,0x6c,0x33,0x80,0x3d,0x7e, +0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc, +0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32, +0x12,0x35,0x67,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3, +0x34,0xa2,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf, +0x2, 0x57,0x83,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac, +0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c, +0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26, +0xfb,0xa, 0x28,0xa, 0x31,0x12,0x35,0x67,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x35, +0x67,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0, +0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3e,0xbe,0xb0,0x0, 0x28,0x12,0x14, +0x7a,0xb3,0x35,0x3e,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2a, +0x5a,0x7e,0xb3,0x36,0xec,0x70,0x58,0x7e,0xb3,0x39,0xb, 0x70,0x52,0x7e,0xb3,0x36, +0x71,0x70,0x4c,0x7e,0x37,0x37,0xfd,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28, +0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f, +0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3, +0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, +0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x35,0x3e,0xda, +0xf8,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e,0x7e,0xf3,0x2a,0x6d,0xac,0xf7, +0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x20,0xde,0x7e,0xb3,0x37,0xb7, +0xb4,0x1, 0x64,0x7e,0x73,0x37,0xb8,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c, +0x12,0x26,0x57,0x12,0x28,0x62,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49, +0x33,0xd, 0xc8,0x12,0x21,0x0, 0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14, +0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34, +0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xb8, +0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, +0xd, 0xc8,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0x4, 0xe4,0x2, 0x58,0xe8,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0x12,0x68,0x10,0x12,0x7d,0x94,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0x74,0x12,0xb6,0xe2, +0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x91,0x18,0x12,0x47,0x2c, +0x12,0x28,0x62,0x50,0xde,0x12,0xab,0xdb,0x12,0x75,0xe9,0x7e,0xb3,0x37,0x5, 0xb4, +0x1, 0x4, 0xe4,0x12,0x58,0xe8,0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x5e,0xaa,0x40, +0xc2,0x12,0x88,0x5f,0x12,0x5e,0xaa,0x40,0xba,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x0, 0x6e,0x12,0x5f,0x2f,0x12,0x5f,0x83,0x12,0x5b,0x94,0x12,0x96,0x24,0x12,0x5e, +0xc2,0x12,0x5f,0xcd,0x12,0xaa,0xe6,0x12,0x87,0x74,0x7e,0xb3,0x36,0xf1,0xbe,0xb0, +0x88,0x68,0x3, 0x12,0x59,0x77,0x12,0x67,0xfa,0x12,0x26,0x66,0x12,0x62,0xa5,0x80, +0x82,0x12,0x2f,0xee,0x2, 0x58,0xdc,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x12,0x35, +0xd3,0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, +0x7e,0xb3,0x2a,0x7, 0x70,0x8, 0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0x61,0x6b,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x28,0x80,0x4, 0x7e,0x68,0x32,0xea,0x7f,0x6, 0x12,0x7e,0xef, +0x7e,0x73,0x2a,0x4, 0x7a,0x6b,0x70,0x6c,0xdd,0x61,0x1c,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x5e,0x3d,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x61,0x1a,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x61,0x1a,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x9e,0xec,0x50,0x2, 0x61,0x1a,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3, +0x2a,0x9, 0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xd6,0x6d,0x22,0x74,0x1, 0x12,0x7f,0xd4,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xe0,0x6d,0x22,0x74,0x10,0x12,0x7f,0xd4,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xd6,0xf5,0x25,0x9, 0xb3,0x32,0xe0,0xf5,0x26,0xa, 0x3c,0x12,0x5e, +0x3d,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xd6,0x19,0xb3,0x32,0xe0,0x12, +0x35,0xd3,0x7e,0xb3,0x2a,0x64,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd, +0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac, +0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x2c,0x75,0x27, +0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x6a,0x54,0xf, +0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x66,0x49,0xa3,0x33,0x68,0x80,0xc, 0x5, 0x27, +0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, 0xff,0x5e,0xa4, +0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5, +0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0, +0xe5,0x28,0xa, 0x5b,0x12,0xb9,0x5c,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e, +0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13, +0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26, +0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x4d, +0xbc,0x7d,0x28,0x2, 0x21,0xbb,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x31, +0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38, +0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0xa, 0xb2,0xe, 0x12,0x7e,0x81,0x74,0x1, 0x12,0x58, +0xe8,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x5e,0x61,0xe4,0x7a,0xb3,0x2a, +0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, 0xe4,0x12,0x58,0xe8,0x12, +0x5f,0xc2,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x66,0x12,0x20,0xb9,0x1b, +0xfd,0x4c,0xff,0x78,0xc, 0x12,0x73,0xe5,0x7e,0x8, 0x33,0x66,0x74,0xff,0x12,0x20, +0xde,0xda,0x3b,0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70, +0xff,0x12,0x5e,0x8b,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f, +0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe2,0x7e,0x73,0x2a,0x2, +0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x2, 0xa1,0xab,0x6c,0xaa,0x80,0x10, +0x7e,0x44,0x7f,0xff,0x12,0x5e,0x95,0x79,0x40,0x0, 0x14,0x12,0x5e,0x45,0xb, 0xa0, +0x12,0x5e,0x25,0x38,0xeb,0xa1,0xab,0x7e,0xb3,0x34,0x4f,0x70,0x3d,0xbe,0x70,0x0, +0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12, +0x5e,0x95,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30, +0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0, +0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xce,0xa1,0xab,0x6c,0xaa,0x80,0x17,0x12,0x5e, +0x57,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe4,0x6c,0xaa,0x80,0x41,0x6c,0xff, +0x80,0x36,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe, +0x34,0x7f,0xff,0x68,0x21,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x18,0x12,0x5e, +0x35,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x5e,0x4e, +0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xc5,0xb, 0xa0,0x7e, +0xb3,0x34,0x4f,0xbc,0xba,0x38,0xb7,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x9, 0xb3,0x1f, +0x46,0xb4,0xff,0x1d,0x6c,0xff,0x80,0x14,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x9, 0x12,0x5e,0x4e,0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38, +0xe7,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xd3,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac, +0x7a,0x49,0x43,0x28,0xae,0x12,0x5e,0x35,0x59,0x42,0x15,0x76,0x49,0x33,0x28,0xb0, +0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xde,0x7e,0x34, +0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e,0x7e,0x73, +0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80, +0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0x12,0x5e,0x2d,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x5e,0x8b,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x5e,0x45,0xb, 0xa0,0x7e,0x63,0x2a,0x2, 0xbc,0x6a, +0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68, +0x13,0x12,0x5e,0x57,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c, +0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x7e,0xf3,0x2a,0x2, 0x7a, +0xf3,0x34,0x4f,0x6c,0xaa,0x80,0x66,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2b, +0x12,0x5e,0x9f,0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0xa, 0x3a,0x2d,0x3d, +0x7d,0x2c,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x2e, +0xa5,0xbb,0x0, 0x2a,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x23,0x12,0x5e,0x9f,0xbe,0xb0, +0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30, +0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0xa, 0x3a, +0x2d,0x3d,0x7d,0x2c,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0x12,0x5e,0x25, +0x38,0x95,0xda,0xf8,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0x90,0x60,0x99, +0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0xb0,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40,0x0, 0x28,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x22,0x6c,0xaa,0x80,0x20,0x74,0x3, 0x12,0xa9,0x99,0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0xa, 0x12,0x5e,0x57,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79, +0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x22,0x7e,0x50,0x9, 0xac,0x5a, +0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, +0x3a,0x2d,0x3d,0x7d,0x2c,0x29,0xb1,0x0, 0xa, 0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91, +0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x9b,0xdf,0x28,0x2, 0xd2,0x3, 0xa2, +0x3, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x3, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x5f,0xc2,0xca,0x59,0x7e,0x18,0x28, +0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xb9,0x1b,0xfd,0x90,0x61,0x35,0xe4,0x93,0xbe, +0xb0,0x0, 0x28,0x28,0x6c,0xff,0x80,0x1f,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae, +0x12,0x80,0x16,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12, +0x64,0xdb,0x12,0xab,0x9b,0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xdc,0xda,0xf8,0x22,0x2, +0x5f,0x32,0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe, +0x12,0x37,0x6f,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x23,0x7e,0xc4, +0x0, 0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0xb, +0xf0,0xb, 0xe0,0x12,0x9c,0xf6,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, +0xda,0x79,0x22,0x12,0x9d,0xda,0x2, 0x5f,0x89,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, +0x38,0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x35,0x40, +0x28,0x14,0x7e,0xb3,0x35,0x40,0x4, 0x7a,0xb3,0x35,0x40,0x7a,0xa3,0x2a,0x2, 0x80, +0x5, 0xe4,0x7a,0xb3,0x35,0x40,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a, +0xb, 0x22,0x90,0x60,0x99,0xe4,0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x12,0x68,0x38, +0x2, 0x5f,0xd3,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x34,0xa2,0x4c,0xaa,0x78, +0x3, 0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x34,0xad,0x7e, +0x73,0x34,0xae,0xbe,0x73,0x34,0xad,0x28,0x4, 0x7a,0x73,0x34,0xad,0x22,0xff,0xff, +0x70,0x8f,0x0, 0xff,0x53,0xac,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x45,0x37,0x31,0x1, 0xc3,0x1, 0x45,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x19,0xe6,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0x18,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, +0x2, 0x1, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x37,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x0, 0x4, 0x5a,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x65,0x40,0xd, 0x18,0x25,0x19,0x2e,0x6, 0x80,0x19,0x2e,0x6, +0x80,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x33,0x33,0x1, 0x98,0x1, 0x98,0x0, +0xde,0x0, 0xe0,0x5, 0x0, 0x38,0x34,0x1, 0xa0,0x1, 0xa0,0x0, 0xde,0x0, 0xe2,0x0, +0xb4,0x0, 0xa0,0x0, 0x96,0x1, 0x18,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, 0x68,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15,0x0, 0x1, 0x54,0x1, 0x0, 0x19, +0x1, 0x53,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0x10,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x37,0x2, 0x5a,0x65,0x20,0x28,0x2, 0x2c,0x2e,0x20,0x3c, +0x2, 0x5b,0x66,0x20,0x46,0x2, 0x42,0x49,0x30,0x37,0x2, 0x5a,0x65,0x20,0x37,0x2, +0x5a,0x65,0x20,0x37,0x2, 0x5a,0x65,0x20,0x37,0x2, 0x5a,0x65,0x20,0x4, 0x5, 0x2e, +0x2f,0x30,0x31,0x32,0x4, 0x0, 0xd2,0x2, 0x30,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x0, 0x78,0x0, 0x78,0x14,0x8, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, 0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x8, 0x37,0xf3,0x12,0x62,0xdf,0x7e,0x8, 0x37,0xfb, +0x12,0x62,0xdf,0x12,0x62,0xf4,0x12,0x62,0xfb,0x2, 0x62,0xbc,0x7e,0x37,0x37,0xf3, +0xbe,0x34,0x0, 0x0, 0x28,0x18,0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x50,0xf, 0x7e, +0xb3,0x37,0x31,0x70,0x9, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0x22,0xb, +0xa, 0x30,0xe5,0x4e,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33, +0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x2b,0xb7,0x2, 0x62,0xdf,0x7e,0x8, 0x38,0xe6,0x2, +0x62,0xdf,0x6d,0x33,0x7a,0x37,0x38,0x83,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e, +0xb3,0x2a,0x3, 0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28, +0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68, +0x17,0x7e,0x47,0x2b,0xb7,0x4d,0x44,0x78,0xf, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3, +0x38,0x85,0x7a,0xb3,0x37,0x6, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e, +0x37,0x2b,0xb7,0x7a,0x37,0x2f,0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37, +0x2b,0xb7,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37, +0x2f,0x98,0x7e,0x27,0x2f,0x9a,0x12,0x64,0x1a,0x81,0x13,0x80,0x0, 0x12,0xbd,0xdd, +0x81,0x13,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57, +0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xbd,0x78,0x12,0x64,0x16,0x74, +0x1, 0x7a,0xb3,0x2f,0x80,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88, +0x9e,0x27,0x2f,0x90,0x7e,0x14,0x62,0x8a,0x12,0x64,0xd3,0xbd,0x23,0x38,0x13,0x7e, +0x27,0x2f,0x96,0x9e,0x27,0x2f,0x8e,0x7e,0x14,0x62,0x8c,0x12,0x64,0xd3,0xbd,0x23, +0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a, +0xc7,0x2f,0x98,0x7a,0xd7,0x2f,0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d, +0x2d,0x7e,0x17,0x2b,0xbb,0x7e,0x7, 0x2b,0xbd,0x12,0x66,0xce,0xa, 0x2b,0x7e,0x73, +0x2f,0x7f,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0x64,0x16,0x7a,0xc7,0x2b,0xbb,0x7a, +0xd7,0x2b,0xbd,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24, +0x12,0x67,0xca,0x7d,0x31,0x12,0x85,0xfd,0x2, 0x64,0x2b,0x7e,0x3, 0x2f,0xa8,0xbe, +0x0, 0xf0,0x50,0x2, 0x81,0xc4,0x81,0xb9,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0, +0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34, +0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b, +0xc1,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0x66,0xce,0x7c,0x1b,0x7e,0x3, +0x2f,0x7f,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b, +0xbf,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x1f,0x8c,0x7e,0x34,0x1f,0x34,0x7e,0x30, +0x4, 0xac,0x39,0x2e,0x14,0x2b,0xbf,0x74,0x4, 0x12,0x1f,0x8c,0xb, 0x80,0x7e,0x3, +0x2f,0xa8,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8, +0x7e,0x3, 0x2f,0x7f,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec, +0x40,0x2, 0x81,0x38,0x22,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e, +0x14,0x61,0x49,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e, +0x14,0x61,0x43,0x12,0x83,0x62,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22, +0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83, +0x2a,0x70,0x12,0x87,0xd4,0xbe,0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d, +0x2e,0x7e,0x14,0x61,0x47,0x12,0x64,0xd3,0x12,0x66,0x10,0x90,0x61,0x45,0x12,0x66, +0x7, 0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0x12,0xc1,0x3a,0xbe,0xa0,0x0, 0x28, +0x32,0x7d,0x14,0x9e,0x14,0x0, 0x3f,0xbd,0x1e,0x38,0x13,0x12,0x66,0xb8,0x40,0xe, +0x12,0x64,0xc5,0x12,0x65,0xfa,0x48,0x32,0x7f,0x10,0x1b,0x1c,0x80,0x2c,0x12,0x66, +0xb8,0x50,0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x64,0xcb,0x12,0x66,0x10,0x7d, +0x1f,0x80,0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x66,0xb1,0xbd,0x5e,0x38,0x16,0x12,0x64, +0xc5,0x12,0x65,0xfa,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10, +0x6d,0x0, 0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x66,0xb1,0xbd,0x5e,0x28, +0x68,0x7d,0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d, +0x35,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d, +0x22,0x7e,0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1e,0xfc,0x12, +0x66,0x14,0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, +0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x66,0x7, +0x58,0x4, 0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76, +0x7c,0x65,0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x36,0x69,0x7a, +0x73,0x36,0xdf,0x7e,0x27,0x38,0xd6,0x7e,0x14,0x61,0xc8,0x12,0x64,0xd3,0x1e,0x34, +0xbd,0x32,0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x14,0x61,0xc8,0x12,0x64, +0xd3,0xbd,0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x36,0x67,0x12,0x67,0x62,0x7e,0x37,0x36, +0x6f,0xbd,0x32,0x50,0x4, 0x7a,0x27,0x36,0x6f,0x12,0xc1,0x12,0x38,0xa, 0x12,0x8f, +0xf3,0x38,0x5, 0x12,0x8f,0xeb,0x28,0x3d,0x12,0x67,0x69,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x36,0x67,0x4, 0x7a, +0xb3,0x36,0x67,0x7e,0x73,0x36,0x67,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3, +0x36,0x67,0x12,0xc0,0x95,0x7a,0xb3,0x36,0xdc,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x67, +0x7d,0x32,0x2, 0xad,0xac,0x2, 0x66,0xa8,0x12,0x67,0xc0,0xe4,0x7a,0xb3,0x36,0x75, +0x22,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4, +0x60,0xd1,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0xbd,0x1e,0x22,0x7d,0x51, +0x7d,0x12,0x9d,0x35,0x12,0x21,0x0, 0x7c,0xa7,0x12,0x67,0xeb,0x7c,0xb7,0xbc,0xba, +0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x67,0x15,0x50, +0x21,0x7e,0x54,0x62,0x5a,0x12,0x67,0x15,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x64, +0xd3,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x5e,0x12,0x64,0xd3,0xbd,0x32,0x28,0x2, +0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12, +0x66,0x1b,0x2, 0x67,0x25,0x7e,0xb3,0x36,0x69,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36, +0x71,0x7e,0xb3,0x36,0xdf,0x70,0x3, 0x12,0xaf,0x2f,0x7e,0xb3,0x36,0x71,0xb4,0x1, +0xc, 0x74,0x3, 0x12,0x67,0x59,0x12,0x23,0x9e,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x67, +0x59,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x34,0xae,0x7e,0x34,0x61, +0x5b,0x22,0x74,0x2, 0x7a,0xb3,0x36,0x69,0x22,0x7e,0xb3,0x36,0x75,0xb4,0x1, 0x3, +0x2, 0x67,0x62,0x7e,0xb3,0x36,0xdb,0x4, 0x7a,0xb3,0x36,0xdb,0x7e,0xb3,0x36,0x69, +0xb4,0x2, 0x18,0x7e,0xb3,0x36,0xda,0x4, 0x7a,0xb3,0x36,0xda,0xb4,0x1, 0x6, 0x74, +0x1, 0x7a,0xb3,0x36,0xdb,0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x73,0x36,0xda,0xbe, +0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x75,0x12,0x67,0x62,0x12,0xaf,0x2f, +0x12,0x67,0xc0,0x7e,0x73,0x36,0xdb,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x67,0xc0,0x22, +0xe4,0x7a,0xb3,0x36,0xdb,0x7a,0xb3,0x36,0xda,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0, +0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xbf,0x12,0x67,0xf2,0x59,0x25,0x2b, +0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a,0xb3,0x2f,0xa8,0x22,0x7d,0x31,0x9d,0x30,0x2, +0x21,0x0, 0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x73,0x28,0x93,0x7a,0x73, +0x28,0x94,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22, +0x12,0xc0,0x25,0x12,0x63,0x2, 0x7a,0x37,0x39,0x4, 0x12,0x69,0x87,0x12,0x28,0x48, +0x2, 0x68,0x23,0x12,0x69,0x84,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3, +0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca,0x79,0x7e,0x13,0x2a,0x2, 0x7e,0x78, +0x29,0xbc,0x12,0x69,0x84,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0x19, +0x7e,0xa0,0x5, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12, +0x68,0x23,0x21,0x6d,0xbc,0x20,0x50,0x3, 0x12,0x68,0x23,0x6c,0x0, 0x21,0x62,0x7e, +0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x21,0x60,0xa, +0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x21,0x43,0x12, +0x69,0x7a,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x21,0x0, 0x7d,0xd3,0x7e,0x70,0x4, +0xac,0x79,0x49,0x23,0x35,0x43,0x12,0x69,0x70,0x9d,0x32,0x12,0x21,0x0, 0x7d,0xc3, +0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x69, +0x7a,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x43,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28, +0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, 0x7a,0xb3,0x34,0x89, +0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3, +0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80,0x53,0x7e,0x50,0x9, +0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x35,0x41,0x49, +0x22,0x29,0xa, 0x59,0x27,0x35,0x43,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x34,0x88,0x80, +0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34, +0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, +0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x41,0x12,0x69,0x70,0x59,0x32,0x35,0x43, +0xb, 0x0, 0x90,0x60,0x99,0xe4,0x93,0xbc,0xb0,0x28,0x2, 0x1, 0x6f,0xda,0x79,0x22, +0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x41,0x22,0xa2,0x8, 0x22,0x7e,0x34,0xd, 0xac,0x12,0x26,0x5b,0x12,0x7a, +0x2d,0x12,0x69,0xab,0x2, 0x69,0x97,0x30,0xf, 0x10,0x12,0x6e,0x8f,0x50,0x3, 0x12, +0x6f,0x6e,0x12,0x6a,0x50,0x12,0x69,0xd1,0xc2,0xf, 0x22,0x7e,0xb3,0x2b,0x1e,0x70, +0x1f,0x12,0x26,0x57,0x12,0x2f,0xf4,0x50,0xfb,0x12,0x6a,0x50,0x12,0x88,0x17,0x20, +0xf, 0x3, 0x12,0x69,0xd1,0x74,0x2, 0x7a,0xb3,0x2b,0x1e,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12, +0x87,0x56,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0xc0,0xcc,0xf5,0x2a, +0x7e,0x73,0x2b,0xf, 0xbe,0x71,0x2a,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x91,0x67,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x44,0x6d,0x22,0x7a,0x1f,0x37,0x40,0x7c,0xbc,0x12,0x6c,0x20,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x62,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x6d,0x13,0xda,0x3b,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12, +0xc0,0x1b,0x7a,0x55,0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d, +0x7f,0x3, 0x7e,0x1d,0x2a,0x12,0x79,0x7a,0x12,0xc0,0x9f,0x12,0xc0,0x42,0x75,0x2e, +0x0, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0xc1,0x22,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6a,0xd4,0x12,0xb3,0x89,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x30,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12, +0x7b,0x20,0x7e,0x35,0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30, +0x38,0xdc,0x5, 0x2e,0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b, +0x1d,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x6d,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d, +0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x6e,0x8f,0x50,0x7c,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x6e,0x12,0x6b,0xff,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x8, 0x12,0x6d,0x34,0x38,0xea,0x6c,0xcc,0x80,0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a, +0x12,0x6b,0xff,0x75,0x3b,0x0, 0x80,0x27,0x7e,0xb3,0x37,0xb1,0xbe,0xb1,0x3b,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x60,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x62,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e, +0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34,0x10, +0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x50,0x12, +0x6c,0x8, 0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70, +0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a, +0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, +0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x7f,0x78,0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe, +0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x6b,0xf6,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d, +0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80, +0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x35,0x7a,0x37,0x25,0xba,0x7e,0x35, +0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12, +0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25, +0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac, +0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37, +0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22, +0xca,0x3b,0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b, +0xf, 0xf5,0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xb9, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x60,0x7e,0x8, 0x25,0x2a, +0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbc,0x12,0xb3,0x54,0x74,0x1, 0x7a,0xb3,0x2b,0x1d, +0x74,0x5, 0xac,0xbc,0x12,0xc0,0x39,0x74,0x5, 0xac,0xbc,0x12,0x6f,0xff,0x74,0x5, +0xac,0xbc,0x12,0xc0,0x30,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0xc2,0x3, 0x12,0xc0,0xcc,0x12,0x6d, +0x13,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, +0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x6a,0xd4,0x12, +0xc0,0x1b,0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xa8,0xef,0x12, +0xa9,0xc9,0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3, +0x2b,0x14,0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39, +0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, +0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd, +0xda,0x3b,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6e,0x29,0x30,0xc, 0xa, 0x12,0xaf,0x1d, +0x30,0x3, 0x4, 0xe4,0x12,0xa, 0x66,0x30,0x3, 0x9, 0x12,0xae,0xd2,0x12,0x8d,0xef, +0x2, 0x8c,0x90,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f, +0x50,0x7e,0x14,0x22,0xe2,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x7a,0x1d,0x2c,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f, +0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c,0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x34,0x6c, +0xcc,0x80,0x4f,0x12,0x6e,0x19,0x40,0x48,0x12,0x6e,0xf, 0x50,0x43,0x74,0x2, 0xac, +0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x0, 0x7d,0x3, 0x7d, +0x31,0x12,0x21,0x0, 0xbd,0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e, +0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d, +0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34, +0xb, 0xc0,0x12,0x6d,0x34,0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12, +0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, +0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12, +0x6e,0x19,0x40,0x8, 0x12,0x6e,0xf, 0x50,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x12,0x6d, +0x34,0x38,0xec,0xb, 0xd0,0xbe,0xd0,0x3, 0x50,0x2, 0xa1,0x68,0xda,0x3b,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xb9,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x12,0x6e,0xa0,0x7a,0x37,0x2b,0x1b, +0x22,0x7e,0xa3,0x0, 0x4f,0xbe,0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xec,0x68,0x42, +0x74,0x5, 0xa4,0x12,0xc0,0xc3,0x12,0x6e,0x83,0x12,0xc0,0x39,0x12,0x6e,0x83,0x12, +0xc0,0x30,0x12,0x6e,0x8f,0x50,0x9, 0x7e,0xb3,0x0, 0x4f,0x12,0xb3,0x54,0x80,0x6, +0x12,0x6e,0x83,0x12,0x6f,0xff,0x12,0x6e,0x29,0x12,0x6f,0xf8,0x7e,0x73,0x2b,0x14, +0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x4f,0x7a,0x73, +0x3, 0xec,0x22,0x7e,0xa3,0x0, 0x4f,0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x20,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xb2,0x70,0x2, 0xc3,0x22,0xd3,0x22, +0x7e,0x23,0x2b,0xf, 0x7e,0x33,0x37,0xcd,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x0, 0xac,0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, +0xa, 0x7e,0x63,0x2b,0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe, +0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61, +0x1b,0xe4,0x93,0x7c,0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73, +0x2b,0x10,0x80,0x9, 0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b, +0x10,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c, +0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x38,0xc0,0x69,0x51,0x0, +0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d, +0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, +0x1f,0x58,0x7e,0xb, 0x70,0x7a,0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b, +0x62,0x29,0x70,0x0, 0x1, 0x7a,0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b, +0x20,0x12,0x6e,0x29,0x12,0x6f,0xf8,0xd2,0x3, 0xc2,0x4, 0x2, 0x48,0xf4,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x4f,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6f,0xea,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0xc0,0x76,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0xc0, +0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6f,0xea,0xca,0x39,0x7e, +0x23,0x0, 0x4f,0x7e,0x30,0x38,0xac,0x23,0x12,0xc0,0x76,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x8c,0xac,0x23,0x12, +0xc0,0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6f,0x42,0x7e,0x34,0x0, 0x38,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x3, 0x8b,0x9, +0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0x7e,0x37,0x3, 0xed,0xb, 0x34,0x7a,0x37, +0x3, 0xed,0x7e,0x37,0x3, 0xef,0xbe,0x37,0x3, 0xed,0x28,0x3, 0x2, 0x70,0x23,0x22, +0x2, 0x70,0x8, 0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x70,0x20,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b, +0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e, +0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a,0xb3,0x2b,0x74,0x7a,0xb3,0x2b, +0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x25,0xee,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2, +0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93, +0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74,0xbc,0x7e,0x28, +0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3,0x2a,0x6e,0x7a, +0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3,0x2a,0x74,0x90, +0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9,0xe4,0x93,0xa, +0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a,0xa, 0x3e,0x9d, +0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a,0x78,0x90,0x60, +0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f,0xca,0x39, +0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12,0x20,0xb9,0x1b, +0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x2b,0x21,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x72,0x92,0x12,0x79,0x31,0x90,0x60, +0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76,0x12,0x70,0x59, +0x74,0x1, 0x12,0x3d,0xac,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x2, 0x12,0x73, +0xf1,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a,0xb3,0x2b,0x4, +0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0x9e,0x7a,0x37,0x2b, +0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x9, 0x7e, +0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a,0xb3,0x2b,0x62, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4,0x93,0x7a,0xb3, +0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x2b, +0xf, 0x12,0x6e,0x29,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61, +0x22,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12, +0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3, +0x2b,0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61, +0x20,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b, +0x14,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d, +0x7a,0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64, +0xe4,0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61, +0x7e,0x34,0x20,0x5b,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x12,0xc0,0xd5,0x12,0x72,0xf4,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x72,0xdb,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x72,0xdb,0xa, +0x1b,0x2e,0x14,0x2a,0x7c,0x12,0x72,0xe8,0xe5,0x25,0x12,0x72,0xdf,0xa, 0x1b,0x2e, +0x14,0x2b,0x23,0x12,0x72,0xe8,0xe5,0x24,0x2, 0x20,0xde,0x7e,0x34,0x0, 0x2, 0x12, +0x20,0xde,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, +0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a, +0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x73,0x20,0x38,0xef,0x12,0x73,0x20,0x68,0x7, +0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22, +0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x12,0x77,0xfd,0x12,0x70,0xa7,0x12,0x0, +0xa, 0x12,0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8, +0x7e,0x1f,0x6, 0xf4,0x12,0x79,0x9d,0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e, +0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12, +0x79,0x7a,0x12,0x79,0x2e,0x12,0x25,0x45,0x12,0x73,0xa7,0x12,0x73,0x7f,0x2, 0x73, +0x71,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x12, +0x73,0xe5,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, 0x28,0xae,0x74,0xff,0x12,0x20, +0xde,0x12,0x9f,0xe3,0x7e,0x8, 0x29,0xbc,0x12,0x5e,0x61,0x7e,0x8, 0x2a,0x2, 0x7e, +0x34,0x0, 0xb, 0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4, +0x12,0x20,0xde,0x90,0x60,0x9c,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74, +0xff,0x12,0x20,0xde,0x90,0x60,0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26, +0xb4,0x74,0xff,0x12,0x20,0xde,0x90,0x60,0x9a,0x12,0x73,0xe8,0x7e,0x8, 0x27,0x76, +0x74,0xff,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78, +0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc, +0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, +0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80, +0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73, +0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d, +0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a, +0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26, +0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x75,0xb2, +0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d, +0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53, +0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x75,0x9f,0xb, +0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80, +0x19,0x12,0x75,0xa8,0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58, +0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3, +0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x75,0x97,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12, +0x75,0xb2,0xb, 0x6a,0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d, +0x2d,0x7e,0x67,0x2a,0x51,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, +0x90,0x12,0x75,0x9f,0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, +0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x75,0xa8,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c, +0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12, +0x74,0x3c,0x38,0xab,0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, +0x12,0x75,0x97,0x2d,0x15,0x6c,0xaa,0x80,0xe, 0x12,0xa5,0xe4,0xb, 0x7a,0x90,0xbd, +0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xed,0x7a,0xb7,0x8, 0x4, +0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32, +0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e, +0x74,0x62,0x10,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d, +0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31, +0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0xa6, +0x56,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x75,0x97,0x7e,0xd, 0x24,0x2d,0x15,0x7f, +0x13,0x2d,0x35,0x12,0x6d,0x3b,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a, +0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x75,0xbc,0x7e,0x37,0x28, +0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x75, +0xbc,0x12,0x76,0x2b,0x12,0xa7,0x45,0x2, 0x76,0x1a,0xe4,0x7a,0xb3,0x3, 0xff,0x7e, +0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x3, 0xff,0x22,0xca,0x3b,0x7e,0xf3,0x2a, +0x6e,0x12,0xc0,0xde,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, +0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0xa7,0xcd,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda, +0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0xbb,0xb5,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, +0xf8,0x12,0x3f,0xf2,0x12,0x76,0x9a,0x12,0x74,0x43,0x7e,0xb3,0x16,0x90,0xb4,0x1, +0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26, +0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x20, +0xde,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26, +0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0xc0,0xb, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0xbf,0xe7, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x86,0x12,0xc0, +0x60,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x89,0x12,0xc0, +0x60,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3, +0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0xc0,0xb, 0x7e,0x50,0x1, 0x12,0x77,0x60,0x7a, +0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0xbf,0xe7,0x7e,0x50,0x1, 0x12,0x77,0x60, +0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22, +0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0, +0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4, +0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0, +0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, +0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c, +0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b, +0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f, +0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0xe4,0x7a,0xb3, +0x37,0x9c,0x7a,0xb3,0x37,0x9d,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0x9e,0x90,0x60, +0x51,0xe4,0x93,0x7a,0xb3,0x37,0x9f,0xe4,0x7a,0xb3,0x37,0xa0,0x90,0x60,0x99,0x93, +0x7a,0xb3,0x37,0xa1,0xe4,0x7a,0xb3,0x37,0xa2,0x7a,0xb3,0x37,0xa3,0x90,0x61,0xc4, +0x93,0x7a,0xb3,0x37,0xa5,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34, +0x7a,0x73,0x37,0xa9,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a, +0x73,0x37,0xaa,0x74,0x64,0x7a,0xb3,0x37,0xbb,0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3, +0x37,0xbc,0x90,0x61,0x17,0xe4,0x93,0x7a,0xb3,0x37,0xa8,0x90,0x61,0x19,0xe4,0x93, +0x7a,0xb3,0x37,0xbe,0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x37,0xbd,0x90,0x61,0x1d, +0xe4,0x93,0x7a,0xb3,0x37,0xbf,0x90,0x61,0x25,0xe4,0x93,0x7a,0xb3,0x37,0xba,0xe4, +0x7a,0xb3,0x37,0xb5,0x74,0xfa,0x7a,0xb3,0x37,0xb3,0x74,0x1e,0x7a,0xb3,0x37,0xb4, +0x74,0x1, 0x7a,0xb3,0x37,0xb2,0x74,0xd, 0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3, +0x37,0xb6,0xe4,0x7a,0xb3,0x37,0xb7,0x7a,0xb3,0x37,0xb8,0x7e,0x8, 0x37,0xc0,0x7e, +0x34,0x0, 0x2c,0x12,0x20,0xde,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0xa, 0x36,0x7a, +0x73,0x37,0xcb,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0x7a,0x73,0x37,0xcc,0x90,0x60, +0xd4,0x93,0x7a,0xb3,0x37,0xcd,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x37,0xce,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b, +0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xe9,0x74,0x1, 0x7a,0xb3,0x37,0xe0,0x7e,0x34,0x0, +0x28,0xca,0x39,0x7e,0x34,0x61,0xd5,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12, +0x20,0xb9,0x1b,0xfd,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0x2, 0x23, +0xa6,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x6d, +0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x20, +0xde,0x7f,0x6, 0x7d,0x3f,0x12,0x20,0xde,0x7a,0xb3,0x16,0x91,0x22,0x7f,0x70,0x7e, +0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c, +0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x20,0xde,0x7f,0x7, 0xa, +0x3a,0x2, 0x20,0xde,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15, +0x12,0x79,0x9d,0x12,0x3f,0xd2,0x7e,0xe0,0x1, 0x12,0x4f,0xaf,0x30,0x18,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x7b,0x29,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac, +0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15, +0x12,0x7b,0x20,0xb, 0xd0,0x7e,0x73,0x2a,0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, +0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c, +0xbf,0x2e,0x73,0x2a,0x73,0x12,0x7a,0x8e,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b, +0x2, 0x70,0x41,0x12,0x2f,0xf4,0x50,0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x7a,0x75, +0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x72,0x12,0x79,0xc4,0x74, +0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x7a,0x75,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f, +0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x79,0xc4,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4, +0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x3d,0xac,0x7c,0xba,0x12,0x13, +0xc7,0x74,0xa, 0x12,0x45,0x15,0x7c,0xb9,0x12,0x0, 0x1e,0x2, 0x4e,0xe7,0xca,0xd8, +0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0x7b,0xd0,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74, +0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11, +0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x1f,0x7, 0x1b,0x6a,0x30,0xb, 0xd0,0xbc, +0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3, +0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73,0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c, +0x7f,0x12,0x7a,0x8e,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12, +0x20,0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, 0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, +0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22, +0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, +0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x29,0x6f,0x7c,0xe7,0x80,0x5d,0x12,0x26,0x57, +0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x12,0x7b,0x29,0x6c,0xdd,0x80,0x3d, +0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, +0x1d,0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19, +0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x3f,0xb, 0xbe,0xb0, +0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x7b,0xb7, +0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa, +0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53,0x2a, +0x73,0xa, 0x25,0x2d,0x23,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22, +0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa, +0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38, +0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, +0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e, +0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x37,0xed,0x40,0x39,0x7e,0x37,0x37,0xed,0xb, 0x34,0x7a,0x37, +0x37,0xed,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x34,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x38,0xfb,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x70,0x5, 0x7e,0xb3,0x37,0x9c,0x22,0xbe,0xb0,0x3, 0x38,0x15, +0x75,0x1b,0x0, 0x30,0xe, 0x6, 0x7e,0x18,0x32,0xea,0x80,0x4, 0x7e,0x18,0x33,0x28, +0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e, +0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4, +0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xed,0x80,0x2, 0x15,0x1a,0x2, +0x7c,0x17,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x7d,0x61,0xbe,0xb0,0x80, +0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x61,0x22,0xb4,0xfc, +0x5, 0x7e,0xb3,0x37,0x8, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60, +0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x36,0x71,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22, +0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74,0xff,0x22,0x7c,0x7b,0x6c,0xaa,0x12, +0x3f,0xe1,0x78,0x9, 0x7c,0xb7,0x12,0x7c,0x64,0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, +0x7c,0xb7,0x12,0x37,0xeb,0x7c,0xab,0x7c,0xba,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5, +0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5, +0x1a,0x12,0x3f,0xb3,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12, +0x7c,0xfb,0xf5,0x91,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0, +0x82,0x12,0x7d,0x1a,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b, +0x32,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x37,0xf2,0x7e,0x73,0x37,0xf2,0xa, 0x27,0x2e, +0x24,0x0, 0x6, 0x12,0x51,0x4f,0x93,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x37,0xf2, +0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x37,0xf2,0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0x9b,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0x9b,0x7a, +0xa3,0x36,0xf2,0x22,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37,0x9c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, +0xe4,0x7a,0xb3,0x37,0x9c,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba, +0x12,0x7d,0xab,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3, +0x7c,0x7a,0x12,0x7e,0x45,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xdf,0x38, +0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x7e,0x21,0xa5,0xbb,0x8f,0x3, 0x75,0x19, +0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x44,0xc0,0x74,0x1, 0x7a,0xb3,0x33,0xff, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68,0x17,0x1b,0x61,0x68, +0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x36,0xe1,0xd2,0xd, 0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37, +0xef,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37, +0xef,0x15,0x1a,0x7e,0x27,0x37,0xef,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, +0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a,0xea, +0x22,0x7e,0xb3,0x37,0xf1,0x4, 0x7a,0xb3,0x37,0xf1,0xe5,0x19,0xb4,0x1, 0x8, 0xe4, +0x7a,0xb3,0x37,0xf1,0x75,0x19,0x0, 0x7e,0x73,0x37,0xf1,0x7a,0x73,0x36,0xf0,0x22, +0xe4,0x7a,0xb3,0x37,0x9c,0x7e,0x8, 0x32,0xea,0x12,0x7e,0xef,0x7e,0x8, 0x33,0x28, +0x7e,0x34,0x0, 0x3e,0x12,0x20,0xde,0x7e,0x18,0x32,0xea,0x7a,0x1d,0x14,0x12,0x7e, +0xd1,0x2, 0x7e,0xc4,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0x9c,0xf5,0x91, +0x22,0x2, 0x7e,0xd4,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e, +0x34,0x0, 0x3e,0x74,0xff,0x2, 0x20,0xde,0x7c,0xab,0x12,0x3f,0x52,0x7c,0xba,0x12, +0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x7f,0x67,0x49,0x35,0x34,0x3b,0x49,0x15, +0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40,0x15,0xbe, +0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12,0x7f,0x6f, +0x28,0xe, 0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, 0x80,0x2, +0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c, +0x7c,0xb9,0x12,0x31,0x27,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, +0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88,0x7f,0x10, +0x7f,0x4, 0x12,0x1e,0xeb,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x75, +0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b,0x2a,0x0, +0x1b,0x1a,0x10,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e, +0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12, +0x21,0x0, 0xe5,0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0, +0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e, +0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12,0x87,0xbc,0x90, +0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, +0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x87,0xd4,0xbe,0xc4, +0x0, 0x3f,0x38,0x1c,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61,0x3b,0x12,0x81, +0x2, 0x12,0x80,0xf1,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xee, +0x12,0x66,0xb1,0xbd,0x5c,0x38,0x21,0x7d,0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12, +0x81,0x2, 0x90,0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b, +0x7c,0x12,0x80,0xf9,0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b, +0x1b,0x54,0xbd,0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f, +0x80,0xa, 0x7d,0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x87,0xcc,0x7f, +0x17,0x12,0x1e,0xfc,0x7f,0x71,0x12,0x81,0x1c,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40, +0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d, +0x22,0x2f,0x71,0x12,0x80,0xf1,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, +0x90,0x61,0x3a,0xe4,0x93,0x12,0x80,0xf9,0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f, +0x22,0x90,0x61,0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d, +0x22,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d, +0x2e,0x7c,0x76,0x7c,0x65,0x7f,0x71,0x22,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65, +0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12, +0x9f,0x40,0x7d,0x3, 0x74,0x9, 0xac,0xbf,0x12,0x87,0xe5,0x49,0x35,0x28,0xae,0x12, +0x81,0xbf,0x12,0x81,0x18,0x7d,0x13,0x5e,0x30,0xfc,0x7e,0x70,0x9, 0xac,0x7f,0x49, +0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d, +0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34, +0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x12,0x81,0xb3,0x12,0x81, +0x18,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, +0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30, +0xda,0x79,0x22,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d, +0x32,0x12,0x21,0x0, 0x7d,0x13,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b,0x74, +0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3,0x49, +0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x81,0xbf,0x7d,0x3f,0x9d,0x35,0x12,0x21, +0x0, 0x9d,0x34,0x12,0x21,0x0, 0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0xf, 0x12,0x67,0xeb,0x7e,0x14,0x62,0x6a,0x12,0x87,0xee,0x50, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7, +0x2f,0x9e,0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7, +0x2f,0x9a,0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x81,0xc7, +0x70,0x2, 0x61,0x45,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70, +0x9, 0x7e,0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45, +0x7e,0x73,0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f, +0xa4,0x7e,0x17,0x2f,0xa6,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45,0x7e,0x34,0x62,0x72, +0x12,0x83,0x4a,0x28,0x4a,0x7e,0x34,0x62,0x70,0x12,0x83,0x54,0x50,0x41,0x7e,0xb3, +0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0x9e,0x12,0x83,0x5e,0x7d,0x8f, +0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0x87,0xc4,0x9d, +0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40,0x2, 0x61, +0x45,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7b,0x7e,0xf0,0x21,0x80,0x76,0x7e, +0x34,0x62,0x7a,0x12,0x83,0x54,0x28,0x6d,0x7e,0x34,0x62,0x78,0x12,0x83,0x4a,0x50, +0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62,0x7e,0x12,0x23,0x9e,0x12,0x83, +0x5e,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50,0x4a,0x7e,0x34,0x62,0x7c,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7,0x2f,0x82,0x28,0x37,0x7d,0xfb, +0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x26,0x12, +0x67,0xf2,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd,0x49,0x25,0x2b,0xab,0x49,0x5, +0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, 0x9d,0x32,0xbe,0x34,0x0, 0x10, +0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xf0,0xbd,0xfc,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xbd,0xfb,0x22,0x7e,0x14, +0x62,0x8e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22,0x12,0x86,0x69,0x7a,0x37,0x2f, +0x9c,0x12,0x85,0xf4,0x7a,0x37,0x2f,0x9e,0x12,0x82,0x16,0x60,0x1, 0x22,0x7e,0x73, +0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f,0x80,0x2, +0x83,0x92,0xca,0xf8,0x7e,0x45,0x24,0x7c,0xb9,0x7a,0xb3,0x38,0x3f,0x74,0xff,0x7a, +0xb3,0x38,0x3e,0x6d,0x55,0x80,0x19,0x7d,0xf5,0x3e,0xf4,0x12,0x86,0x74,0x7d,0xe5, +0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54, +0xbd,0x45,0x38,0xe3,0x7e,0x33,0x38,0x3f,0xbe,0x30,0x4, 0x38,0x2, 0x81,0x54,0x69, +0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e, +0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x40,0x7a,0xb3, +0x38,0x42,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f, +0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x38,0x42,0x7d,0xf, 0x2d,0xf, 0xbd, +0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x38,0x42,0xa, 0x37,0x6d,0x22,0x12, +0x1e,0xeb,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7a,0x73,0x38,0x42,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x84,0x73,0x12, +0xbf,0x3c,0x12,0x84,0x73,0x12,0x84,0x7c,0x12,0x84,0x73,0x12,0xa5,0x28,0x80,0xa, +0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x38,0x3e,0xe4,0x7a,0xb3,0x38,0x3f,0x7e, +0x73,0x39,0x1, 0xbe,0x73,0x38,0x3e,0x48,0x6, 0x7e,0xb3,0x38,0x40,0x80,0x1, 0xe4, +0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71, +0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a, +0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0xa1,0x9d,0x7e,0x90,0x2, 0xac,0x9a, +0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x26,0x7f,0x67,0x2d, +0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f, +0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a, +0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe, +0xf0,0x2, 0x58,0x2, 0xa1,0x9b,0xbe,0x60,0x0, 0x18,0x2, 0xa1,0x83,0xbe,0x70,0xec, +0x28,0x2, 0xa1,0xa7,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7, +0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x85,0xeb,0x19,0xba,0x22, +0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x85,0xeb,0x19,0xba,0x23,0xe4,0x9, 0xba, +0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7, +0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0x85, +0xeb,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12,0x85,0xe2,0x19,0xbd,0x22,0xf5,0xa, 0xd9, +0x12,0x85,0xe0,0x19,0xbd,0x23,0xe5,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe, +0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12, +0x85,0xe0,0x19,0xbd,0x22,0xf4,0xa, 0xc9,0xa, 0xd4,0x12,0x85,0xe0,0x19,0xbd,0x23, +0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f,0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, +0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23,0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x38, +0x3f,0xbc,0xba,0x28,0x2, 0x81,0x9b,0x7a,0x73,0x38,0x3f,0x7e,0xa0,0x1, 0x80,0x25, +0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d, +0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e, +0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x38,0x3f,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22, +0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c, +0xbd,0xa, 0xa7,0x22,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0x86,0x69,0x7a,0x37,0x2f,0xa0,0x12, +0x85,0xf4,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0x86,0x69,0x7a,0x37,0x2f, +0xa4,0x12,0x85,0xf4,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7c,0xab, +0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4,0x14, +0x78,0xfb,0x12,0x86,0x72,0x2d,0xfe,0x80,0xf, 0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x12,0x86,0x72,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a, +0xbd,0xf4,0x38,0xd0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61, +0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b, +0x7e,0x63,0x2a,0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10, +0x7d,0x21,0x12,0x87,0xdc,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34, +0x37,0x44,0x6d,0x22,0xe4,0x2, 0x86,0x7e,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b, +0x68,0x4f,0x12,0x87,0x56,0x7c,0x3b,0x7c,0xb2,0x12,0x87,0x56,0x7c,0xab,0xbe,0x30, +0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12, +0x91,0x67,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e, +0x34,0x16,0x93,0x6d,0x22,0x30,0x16,0x3, 0x2, 0x86,0xc7,0x7e,0xb3,0x2b,0x1d,0xb4, +0x1, 0xf, 0x12,0xc0,0x1b,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x86, +0x7e,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, +0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40, +0xe9,0x74,0xff,0x22,0x7e,0xb3,0x37,0x31,0x70,0x6, 0x12,0x87,0xad,0x2, 0x87,0xb6, +0x12,0x63,0x9, 0x12,0xbd,0x6d,0x50,0xa, 0x12,0x83,0x6a,0x7c,0x3b,0x12,0x87,0xad, +0x80,0x5, 0x12,0xbe,0x14,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xbc,0xf1, +0x60,0xa, 0x7a,0x33,0x37,0x34,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4,0x7a,0xb3, +0x2f,0x80,0x22,0x2, 0x81,0x23,0xe4,0x7a,0xb3,0x38,0xdd,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x3e,0x24,0x7e,0xf, +0x38,0xd9,0x2d,0x12,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x32,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74,0x6, +0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x5, 0x7d,0x53,0xbe,0x54,0x0, 0xff, +0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x12,0x6e,0x8f,0x50,0x3, 0xd2,0xf, 0x22,0xc2, +0xf, 0x22,0x12,0xac,0xe9,0x12,0x88,0x2b,0x2, 0x88,0x17,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x20,0xde,0x12,0xaa,0x61,0x12,0xaa,0x58,0xa9,0xd1,0xcb, +0x12,0xc1,0x22,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x12, +0x54,0x94,0x12,0x88,0xb9,0x12,0x8c,0xad,0x7e,0xb3,0x37,0x6, 0xb4,0x1, 0x1e,0x7e, +0x34,0x61,0xc0,0x12,0x87,0xcc,0x7e,0x24,0x0, 0x5, 0xad,0x12,0x7a,0x17,0x28,0xa1, +0x7e,0x14,0x61,0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39, +0x11,0x60,0x7, 0x14,0x7a,0xb3,0x39,0x11,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, +0x12,0x88,0x22,0x12,0x8c,0x90,0x12,0xb3,0xd3,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12, +0xbb,0x30,0x12,0xaa,0x6a,0x2, 0x8d,0x10,0x22,0x7e,0x90,0x1, 0x7e,0xb3,0x2f,0xa9, +0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xa9,0x7e,0x34,0x61,0xc0,0x12,0x23, +0x9e,0x12,0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x12,0x8c,0x87,0xb, 0x1a, +0xf0,0x7e,0x34,0x61,0x4f,0x12,0x87,0xbc,0xe4,0x7a,0xb3,0x28,0xac,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x7e,0x34,0xff,0xfa,0xad,0x3f,0x12,0x8f,0xdc,0x7d,0xc3,0xe, 0xc4, +0x7e,0xe7,0x7, 0xfe,0xbd,0xe3,0x58,0x15,0x7e,0xe7,0x7, 0xfc,0xbd,0xec,0x58,0xd, +0x12,0x8a,0x7c,0x8, 0x8, 0x12,0x8b,0xe, 0x60,0x3, 0x12,0x8a,0x95,0x12,0x8b,0xe, +0xa, 0xeb,0x4d,0xee,0x68,0x3b,0x6d,0xee,0x9d,0xef,0xbe,0xe7,0x7, 0xfe,0x18,0x6, +0xbe,0xe7,0x7, 0xfc,0x8, 0x2b,0x12,0x8a,0x7c,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12, +0x21,0x0, 0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x8a,0x74,0x28,0x14,0x7e,0x83,0x28, +0x85,0xbe,0x80,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xcf,0x58,0x3, 0x12,0x8a, +0x95,0x12,0xad,0x28,0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xc1,0x1a,0x68,0x6, +0x7e,0xb3,0x39,0xb, 0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x7d,0x12,0x8a,0x74, +0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0xad,0x66,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x12,0x8a,0xa6,0x7c,0x9b,0x80, +0x1a,0x7e,0xb3,0x26,0x84,0x70,0x14,0x7e,0xb3,0x26,0x85,0x70,0xe, 0x12,0x8a,0x74, +0x28,0x9, 0x7e,0x90,0x3, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0xc7,0x7, 0xfa,0xbe, +0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x8a,0x74,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7, +0x28,0x8e,0x58,0x8, 0x12,0x8a,0x87,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0x29,0x7e,0x14, +0x61,0xc0,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0x7e,0x14,0x61, +0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x12,0x0, 0x66,0x50,0xd, 0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x8f,0xe3,0x28,0x3, 0x12,0x8a,0x87,0x7e,0xc7,0x28,0x8a, +0xbd,0xcd,0x8, 0x19,0x12,0x9b,0xf, 0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28, +0x8e,0x58,0xa, 0x12,0x0, 0x66,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x8b,0x8e, +0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x2, 0x12,0xac,0x90,0x7e,0xb3,0x2f,0xaa,0xbe, +0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xaa,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8c,0x7f,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0x6d,0xee,0x9e,0xe7, +0x2a,0x5a,0xbe,0xe7,0x28,0x8e,0x22,0xe4,0x7a,0xb3,0x2f,0xaa,0x7a,0xb3,0x28,0xac, +0x74,0x2, 0x2, 0x29,0xfa,0x74,0x2, 0x7a,0xb3,0x2f,0xaa,0xe4,0x7a,0xb3,0x2f,0xa9, +0x12,0x8c,0x7f,0x2, 0x29,0xfa,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x8c,0x87, +0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x8b,0x6, +0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e, +0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x4, +0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11, +0x7e,0x34,0xff,0xfd,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0, +0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x1e,0xb9,0xbd,0x34,0x22,0x6c,0x66, +0x90,0x60,0xa7,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28, +0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14, +0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x9d,0x8b,0x50, +0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, +0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e, +0x73,0x2a,0x6d,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0xca,0x3b, +0x12,0xa6,0x4e,0x38,0x2, 0x81,0x55,0x7e,0xc3,0x2f,0xad,0x4c,0xcc,0x78,0x3d,0x7a, +0xb3,0x2f,0xad,0xe4,0x7a,0xb3,0x2f,0xaf,0x6c,0xaa,0x80,0x26,0x12,0x8c,0x60,0x7e, +0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a,0x49,0xd0,0x19, +0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8c,0x6a,0x59,0x34,0x0, 0x2, +0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c,0xfc,0x6c,0xaa, +0x80,0x35,0x12,0x8c,0x60,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, 0xb4,0x0, 0x8, +0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8c,0x6a,0x7d,0x23,0x49,0x34,0x0, 0x2, 0x9d, +0x32,0x12,0x21,0x0, 0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x4c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x2f,0xaf,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x8c, +0x60,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x4c,0x0, 0x12,0x8c,0x71,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x2f,0xaf,0x80,0x6, 0x12,0x8c,0x71,0x75,0x4c,0x0, 0xe5,0x4c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xb0,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x40,0xe4,0x7a,0xb3,0x2f,0xae,0x7a,0xb3,0x2f,0xad,0x7a,0xb3,0x2f,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22, +0x12,0x8c,0xcd,0x6d,0x33,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x5, 0x12,0x8d,0x5e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xf6,0xe4,0x7a,0xb3,0x36,0x72,0x22,0x12,0xb0,0xbe, +0x60,0x1a,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x7e,0x37,0x38, +0xd2,0x12,0x25,0x3c,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x23,0x12,0x8d,0x8, 0x28, +0x26,0xa, 0x4a,0x9, 0x64,0x36,0x76,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x42,0x38,0xcc,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x80,0xb, 0xa0,0x7e, +0xb3,0x36,0x73,0xbc,0xba,0x38,0xd5,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xae,0xc5,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x8d,0x5e,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x84, +0x49,0x12,0x36,0x80,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x84,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x36, +0x84,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x36,0x80,0x59,0x32,0x36,0x84,0x22,0x7e,0xb3,0x36,0x66, +0x60,0x6, 0x14,0x7a,0xb3,0x36,0x66,0x22,0x12,0x8c,0xcd,0x90,0x61,0xc5,0xe4,0x93, +0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x8d,0xef,0x7e,0xb3,0x36,0xec,0x70,0xe, 0x7e,0xb3, +0x39,0x12,0xb4,0x1, 0x7, 0xe4,0x12,0x8d,0xb3,0x12,0xc0,0x95,0x12,0x67,0x1f,0x12, +0x8e,0xa2,0x7e,0xa3,0x36,0xec,0x7a,0xa3,0x39,0x12,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x8d,0xb3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf,0x12,0xc0,0xc3,0x12,0xc0, +0x39,0x12,0x6f,0xff,0x12,0xc0,0x30,0x7a,0xf3,0x0, 0x4f,0x7c,0xbf,0x12,0xb3,0x54, +0x12,0x6e,0x29,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37,0x12,0xaf,0x4, 0x12,0x8d, +0xef,0x12,0x23,0x4, 0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8,0x22,0x12,0x8f,0xd2,0x7e, +0xb3,0x2b,0xf, 0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xc0,0x7e,0x73,0x37,0xcd,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36, +0x12,0x8f,0xca,0xbe,0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x36,0x72,0xa, 0x3e,0xad, +0x3b,0x7d,0xa3,0x2d,0xac,0x75,0x35,0x0, 0x7e,0xa3,0x36,0x72,0xbc,0xad,0x40,0x2, +0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e, +0x78,0xe, 0x7c,0xbd,0x14,0xbe,0xb3,0x36,0x72,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x72, +0x7e,0xc3,0x36,0x72,0x80,0x41,0x7e,0xb3,0x36,0x72,0x4, 0x7a,0xb3,0x36,0x72,0x7e, +0x90,0x5, 0xac,0x9c,0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb, +0x19,0xcd,0x36,0x76,0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, +0xf5,0x35,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0, +0xbe,0xf0,0x3, 0x50,0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x36,0x73,0xda, +0x3b,0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0x5a,0x7e,0xb3,0x36,0x6b, +0xb4,0x1, 0x8, 0x12,0x88,0x22,0xe4,0x7a,0xb3,0x36,0x6b,0x7e,0xb3,0x36,0x6a,0x60, +0x4, 0x74,0xff,0xe1,0xc5,0x7e,0xb3,0x36,0x69,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xb9, +0x12,0xc1,0x12,0x38,0xc, 0x12,0x8f,0xf3,0x38,0x7, 0x12,0x8f,0xeb,0x38,0x2, 0xe1, +0xb9,0x12,0x8f,0xca,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, +0x80,0x3, 0x7c,0xbd,0x14,0x12,0xae,0x34,0x7c,0xfb,0x7e,0xb3,0x36,0x68,0x4, 0x7a, +0xb3,0x36,0x68,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xae,0x34,0x7c,0xab,0xbe,0xa0, +0xff,0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x36, +0x7e,0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, +0x12,0xae,0xbb,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe, +0xf0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x68,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36, +0x75,0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x36,0x68,0x50,0x59, +0x74,0xc, 0xac,0xbf,0x49,0x25,0x36,0x7e,0x7e,0x14,0x61,0xcc,0x12,0x64,0xd3,0xbd, +0x23,0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0x9e,0xbe,0x37,0x36,0x64,0x40,0xd, +0x7e,0x34,0x61,0xd2,0x12,0x23,0x9e,0xbe,0x37,0x36,0x6f,0x50,0x23,0x74,0x5, 0xac, +0xbf,0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, +0x50,0x8, 0x12,0x87,0x52,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x6b, +0xe4,0x7a,0xb3,0x36,0x75,0x7a,0xb3,0x36,0x69,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a, +0xb3,0x36,0x68,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x90,0x61,0xc5,0xe4,0x93,0x7c, +0xdb,0x22,0x12,0xae,0xd2,0x74,0x1, 0x7a,0xb3,0x36,0x66,0x22,0x7e,0x24,0x0, 0x2, +0x2, 0x1e,0xb9,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26,0xf5,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf3,0x2a, +0x70,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3, +0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3, +0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x90, +0x50,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f, +0x36,0x6d,0x0, 0x12,0x1f,0x7, 0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x7, 0xda,0xf8,0x22, +0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8, +0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x6f, +0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x5c, +0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x60, +0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, +0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f, +0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x74,0xc8,0x7a,0xb3,0x39,0x6, 0xc2,0x17, +0x80,0xa, 0x12,0x45,0xd6,0x30,0x17,0x4, 0x75,0xe9,0xff,0x22,0x12,0x47,0xff,0x68, +0xf1,0x22,0x74,0x1, 0x12,0x90,0xf1,0x20,0x17,0x6, 0x12,0x46,0x4e,0x12,0x90,0xfa, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x90,0xb8,0x12,0x90,0xfa,0xe4,0x2, 0x90, +0xf1,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0x22,0xd2,0x4, 0x2, 0x45,0x5a,0xa, +0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x47,0xff,0x68,0xfb,0x20,0x93,0xfd, +0x22,0x7e,0x34,0x61,0x59,0x2, 0x23,0x9e,0x7e,0xb3,0x37,0x6, 0x70,0x2e,0x7e,0x73, +0x36,0xe9,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0x3, +0x7e,0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x91,0x6d,0x7c,0xab,0xe5,0x4e, +0xa, 0x3b,0x2e,0x37,0x38,0x83,0x7a,0x37,0x38,0x83,0x80,0xc, 0x7e,0xa3,0x36,0xea, +0xbe,0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x91,0x5d,0x75,0x4e,0x0, +0x7a,0xb3,0x39,0x6, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x20,0xf0,0x7a,0x71,0x82, +0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xb3,0x38,0x86,0x70,0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x38,0x86,0x22,0x7f,0x20,0xc2,0x4, 0x7e,0x2b,0x60,0x29,0x72,0x0, +0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21,0x0, 0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32, +0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x21,0x0, 0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d, +0x32,0x12,0x21,0x0, 0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60, +0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x37,0xf3,0x4d,0x33,0x68,0x2, +0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f,0x70,0x7c, +0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e, +0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12,0x87,0xbc,0x6c,0xff,0x12,0x2f,0xff,0x7f,0x51, +0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, 0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b, +0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e,0x14,0x62,0xa, 0x12,0x87,0xee,0x8, 0xc, 0x7e, +0x27,0x28,0x8a,0xbe,0x24,0x3, 0x20,0x8, 0x2, 0x61,0x2a,0xb, 0xa, 0xc0,0x1e,0xc4, +0xbd,0x3c,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x61,0x2a, +0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0, +0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca, +0x18,0x5, 0x4e,0xf0,0x1, 0x61,0x2a,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a, +0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa, +0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc, +0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90, +0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd, +0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b, +0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, +0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, +0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b, +0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0x40,0xbd,0x3d,0x22,0x7f,0x60,0x7e,0x6b,0xa0, +0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, +0x2d,0x15,0xb, 0x14,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0, +0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76,0x7d,0x13,0x1e, +0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e, +0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b, +0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xca,0x3b,0x6d,0x11,0x7e,0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c, +0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12,0x95,0x90,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x34,0xca,0x74,0x2, 0xa, 0x3f,0x19,0xb3,0x35,0x34,0xb, 0xf0,0x12,0x5e,0x2d, +0x38,0xe1,0x12,0x97,0xc0,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0xa1,0x69,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, +0x12,0x95,0xa1,0x38,0x2, 0xa1,0x67,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x4d,0x75,0x24,0x0, 0xa1,0x3f,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xca,0xbc,0xcd,0x68,0x2, 0xa1,0x3d,0x49,0x25,0x34,0xc8,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x0, 0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc6,0x74,0x9, 0xac,0xbf,0x12,0x96,0x1b,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x34,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x20,0xa, 0x1c,0x2e,0x14,0x35,0x34,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x67,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x69,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x1f,0x8c,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x97,0xae,0xac,0x3f,0x12,0x95,0x98,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x95,0x98,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x20,0x80,0x2a,0x5, 0x24,0x90, +0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0x81,0x49,0x80,0x1a,0x6d,0x11,0x74, +0x2, 0xac,0xbd,0x12,0x95,0x90,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1,0x34,0xca,0x74, +0x2, 0xa, 0x1d,0x19,0xb1,0x35,0x34,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x25,0xe4, +0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x5f,0xc6,0xca,0x59,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x34,0xc6,0x12,0x20,0xb9,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, 0xda,0x3b,0x22, +0x59,0x15,0x35,0x20,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x1f, +0x8c,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80, +0x63,0x6c,0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac, +0xbe,0x9, 0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x95,0xa1,0x38,0xe5, +0x12,0x95,0xa1,0x28,0x43,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x81,0xb3, +0x74,0x9, 0xac,0xbd,0x12,0x87,0xe5,0x12,0x96,0x1b,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8b,0x59,0x35,0x34,0xb0,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x87,0xb3,0xb, 0xe0,0xbc,0xfe,0x38,0x99,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x21,0x0, 0x7e,0xb3,0x37,0x31,0x70,0x3, 0x12,0x93,0xe3,0x2, 0x96,0x30, +0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x96, +0x7c,0x7c,0xbf,0x12,0x97,0x10,0x4c,0xee,0x78,0x14,0x12,0x5f,0xc2,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0x80,0xb, 0x7e,0xb3, +0x2a,0x9, 0x70,0x5, 0x7c,0xbf,0x12,0x95,0xa9,0x7c,0xbf,0x12,0x9f,0x90,0xbe,0xf0, +0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4, +0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, 0x2, 0x96,0xeb,0xa5,0xbe,0x0, 0x1d,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, +0xa0,0x12,0x5e,0x25,0x38,0xed,0x74,0x1, 0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x47,0x81,0x1b, +0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x47, +0x81,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0x12,0x97,0x4, 0x7e,0x8, +0x34,0xb0,0xe4,0x12,0x20,0xde,0x90,0x60,0x99,0x12,0x97,0x8, 0x7e,0x8, 0x34,0x8b, +0xe4,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60,0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x97,0xb6,0x7c,0x7d, +0x7c,0x6f,0x12,0x97,0xb6,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x97,0xae,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x1f,0x8c,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x2e,0x34, +0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x8, 0x1f,0x34,0x12,0x9e,0x37,0x7c,0x1b,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x34,0x9f,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x34,0x9f,0x1e,0x34,0x7a,0x37,0x34,0x9f,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9f,0x7e,0x37,0x34,0x9f,0x22,0xca,0xf8,0x7c,0xfb, +0x6d,0xdd,0x7c,0xbf,0x12,0x98,0xea,0x7d,0xe3,0x7c,0xbf,0x12,0x37,0x6f,0x7d,0xf3, +0x74,0x2, 0xac,0xbf,0x9, 0x95,0x26,0xfb,0x7c,0xbf,0x12,0x9a,0xed,0x40,0x2, 0x1, +0xd4,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0xbe,0xa0,0x0, 0x28,0x9, 0xa, 0x3a, +0x1b,0x34,0x12,0x98,0xd8,0x7d,0xd3,0x12,0x98,0xdf,0xbd,0xc3,0x58,0xb, 0xa, 0xca, +0xb, 0xc4,0x7d,0x3c,0x12,0x98,0xd8,0x2d,0xd3,0x12,0x9b,0xf, 0x7d,0xd3,0xbe,0xa0, +0x0, 0x28,0x56,0x12,0x98,0xdf,0xbd,0xc3,0x58,0x4f,0xbe,0x90,0x0, 0x28,0x4a,0xbe, +0x90,0x0, 0x28,0x45,0xbe,0xf4,0x0, 0xc8,0x8, 0x3f,0x7d,0x3d,0x3e,0x34,0x3e,0x34, +0xbd,0x3f,0x8, 0x35,0x7e,0x70,0x2, 0xac,0x79,0x49,0x33,0x4, 0xfc,0xbe,0x34,0x1, +0x2c,0x8, 0x26,0xa, 0x2a,0x7e,0xb3,0x2a,0x74,0x12,0x9b,0x18,0xbe,0x34,0x1, 0x90, +0x8, 0x17,0xbe,0xf4,0x1, 0x5e,0x58,0xd, 0x7e,0x34,0x0, 0x3, 0xad,0x3e,0xbd,0x3f, +0x8, 0x3, 0xe4,0x80,0x30,0x74,0x1, 0x80,0x2c,0x90,0x60,0xab,0xe4,0x93,0xbc,0xb9, +0x78,0x22,0x7c,0xba,0x7c,0x79,0x12,0x2c,0x40,0xbe,0x34,0x0, 0x96,0x8, 0x12,0x74, +0x2, 0xac,0xb9,0x49,0x35,0x4, 0xfc,0xbe,0x34,0x0, 0x32,0x8, 0x4, 0x74,0x1, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xb7,0x7c,0x79,0x2, 0x2c,0x40,0x7e, +0xb3,0x2a,0x6f,0xa, 0x3b,0x1b,0x34,0xa, 0xca,0x22,0xca,0x79,0x7c,0x8b,0x6c,0xaa, +0x9f,0x77,0x12,0x9a,0x2a,0x1a,0x79,0x1b,0x74,0x80,0x4c,0x1a,0x38,0x1b,0x34,0x7c, +0xe7,0x80,0x38,0xbc,0x9f,0x78,0x4, 0xbc,0x8e,0x68,0x2e,0xbe,0xf0,0x0, 0x48,0x29, +0x7e,0xb3,0x2a,0x6f,0xa, 0x2b,0x1a,0x3f,0xbd,0x32,0x58,0x1d,0xbe,0xe0,0x0, 0x48, +0x18,0x7e,0xb3,0x2a,0x70,0xa, 0x2b,0x1a,0x3e,0xbd,0x32,0x58,0xc, 0x7c,0xbf,0x7c, +0x7e,0x12,0x2c,0x40,0x12,0x99,0x65,0xb, 0xa0,0xb, 0xe0,0x1a,0x28,0xb, 0x24,0x1a, +0x3e,0xbd,0x32,0x8, 0xbe,0xb, 0xf0,0x1a,0x29,0xb, 0x24,0x1a,0x3f,0xbd,0x32,0x8, +0xaa,0x4c,0xaa,0x78,0x4, 0x6d,0x33,0x80,0x9, 0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12, +0x1f,0x58,0xda,0x79,0x22,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7, +0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f,0x34,0x7e,0xb3,0x2a,0x70,0x7a,0xb3, +0x1f,0x35,0x12,0x9a,0x2a,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x41,0x17,0x7a, +0xf1,0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d, +0x32,0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a, +0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d, +0x32,0x7c,0xb7,0xf5,0x2c,0x80,0x40,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58, +0x10,0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5, +0x2e,0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b, +0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12, +0x2c,0x40,0x12,0x99,0x65,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x2c,0x1a, +0x3b,0xbd,0x32,0x8, 0xb2,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd, +0x32,0x18,0x2, 0x21,0x8f,0x7f,0x17,0xda,0x79,0x22,0x7e,0x70,0x2, 0xac,0x78,0x9, +0x93,0x26,0xfa,0x9, 0x83,0x26,0xfb,0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x62,0x27, +0x12,0x9a,0xe5,0x12,0x9b,0x23,0x50,0x2, 0x41,0xe0,0x7e,0x34,0x62,0x2b,0x12,0x23, +0x9e,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, 0x41,0xe0,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x9a,0xe5,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x4, 0x4c,0x8, 0x6b,0x6c,0xdd,0x80,0x5f,0xc2,0x3, 0x7c,0xbd,0x12,0x37,0x6f, +0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x99,0x6c,0x7a,0x35,0x24,0x9e,0x35, +0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0xdc,0x7a,0x35, +0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, +0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x9a,0xed, +0x50,0x2, 0xc2,0x3, 0x30,0x3, 0xf, 0x7c,0xbd,0x6c,0x77,0x12,0x51,0x5f,0x7e,0x70, +0x2, 0xac,0x7d,0x12,0x37,0x9f,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x99, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x7c,0x4b,0x74, +0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc, +0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x2, 0x1e,0xb9,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33, +0x4, 0xfc,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x37,0x6f,0xbe,0x34, +0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0xe9, +0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0x3b,0x7e,0x77,0x2a,0x5c,0x12, +0x9d,0xa1,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x9b,0xd7,0x7e, +0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x35,0xe5,0xbd,0x36,0x48,0x7, 0x3e,0x34,0x3e, +0x34,0x12,0x9b,0xd7,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0x9b,0x23,0x50,0x6, 0x7e, +0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60,0xc, 0x7e, +0xb3,0x35,0xe3,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xe3, +0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x45,0xe, 0x7e,0x53,0x35,0xe3,0xbe,0x50,0x0, +0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, 0x7d,0xfe, +0x7a,0xf7,0x2a,0x5c,0x12,0x9b,0xdf,0x28,0x3, 0x12,0x37,0xc2,0x7a,0x67,0x35,0xe5, +0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xb9,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x79,0xc2,0x3, 0x7e,0xf0,0x3, 0x7e,0xe3, +0x2a,0x3, 0x12,0x9b,0xdf,0x28,0x72,0x7c,0xbf,0x12,0x2c,0x47,0x4c,0xee,0x68,0xe, +0x7e,0x63,0x33,0xc0,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x33,0xc1,0x70,0x4, 0xd2,0x3, +0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x4d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x3, +0x80,0x1e,0xd2,0x3, 0x12,0x9c,0xf6,0x78,0xa, 0xa5,0xbe,0x0, 0x6, 0x6c,0xff,0xc2, +0x3, 0x80,0xd, 0x9e,0x73,0x33,0xc0,0xbc,0x7e,0x78,0x5, 0x7e,0xf0,0x2, 0xc2,0x3, +0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x2c,0x47,0x7e,0xa3,0x33,0xc2,0x7a,0xa3,0x28,0x84, +0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x33,0xc3,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9, +0x1b,0xfd,0x12,0x9c,0x6f,0xf5,0x4d,0x80,0x3, 0x75,0x4d,0x64,0xda,0x79,0x22,0x7e, +0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80, +0x42,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x9c,0xee,0x9, 0xb3,0x26, +0xfa,0x12,0x2f,0xd6,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12, +0x9c,0xee,0x9, 0xb3,0x26,0xfb,0x12,0x2f,0xd6,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, +0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c, +0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28, +0x84,0xbc,0xb1,0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c, +0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0xca,0x79,0x6c, +0x88,0x80,0x72,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a, +0x71,0x24,0x7c,0xbf,0x12,0x9d,0x8b,0x50,0x5a,0x6c,0xee,0x80,0x51,0xbc,0xe8,0x68, +0x4b,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9d,0x80,0xf5,0x26,0x6c,0x99,0x90,0x60,0xaa, +0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, 0x2f, +0xe5,0x25,0xa, 0x3b,0x12,0x35,0x67,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, 0x78, +0x1b,0x7c,0xbe,0x12,0x37,0x6f,0x7d,0xf3,0x7c,0xb8,0x12,0x37,0x6f,0xbd,0x3f,0x8, +0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x51,0x5f,0xb, 0xe0,0x12,0x9c, +0xf6,0x38,0xaa,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0x86,0xda,0x79,0x22, +0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0x22,0x7c,0xab,0x90,0x60,0xab, +0xe4,0x93,0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x31,0x5a,0x50,0x2, 0xd3,0x22,0xc3, +0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84,0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12, +0x2f,0xb7,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb, +0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x40,0x7d,0xf3,0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, +0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x2, 0x70,0x2d, +0x7e,0x73,0x2a,0x3, 0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc5,0x70,0x18,0x12, +0x9e,0x17,0x7e,0x73,0x2a,0x3, 0x7a,0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, +0x7e,0xb3,0x34,0xc5,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc5,0x22,0xe4,0x7a,0xb3, +0x34,0xc5,0x7a,0xb3,0x2a,0x9, 0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x35, +0xe9,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73, +0x35,0xe8,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0xc1, +0xd2,0x7c,0x57,0xc1,0xca,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98, +0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff, +0x68,0x66,0x12,0x9e,0xe2,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e, +0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, +0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x9e,0xe2, +0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7, +0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0xc1,0x45, +0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6,0x28,0x2, 0xc1,0x41,0x7c,0xba,0xda, +0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0x7c,0xab,0x7e,0xb, +0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x34,0xa3,0xbe,0x73,0x34,0xad, +0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa3,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22, +0xbe,0x73,0x34,0xad,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74, +0xff,0x19,0xb4,0x34,0xa3,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x34,0xa3,0xbe,0xb0,0xff, +0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa3,0xd3,0x22,0xe4,0x19,0xb3,0x34,0xa3,0xc3,0x22, +0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34, +0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x5, 0xbe, +0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34, +0xb0,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x34,0x8b,0x80,0x4, 0x59,0x35,0x34,0x8b,0x59, +0xf5,0x34,0xb0,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x25,0x3c, +0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x25,0x3c, +0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28, +0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90, +0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0x12,0x5e,0x25, +0x38,0xb2,0x22,0x7e,0x8, 0x34,0xa2,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20,0xde,0x6c, +0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12,0x2f,0xb7,0x60,0xa, 0x12,0xa0,0x84,0x40, +0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5, +0x7c,0xb0,0x6c,0x77,0x12,0xa0,0x49,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70, +0x1, 0x12,0xa0,0x49,0xb4,0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x2f,0xb7, +0x60,0xc, 0x12,0xa0,0x84,0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x51,0x5f,0xb, 0x10, +0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3,0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e, +0xb3,0x36,0x61,0x7a,0xb3,0x36,0x62,0x7a,0xa3,0x36,0x61,0x7e,0xb3,0x36,0x62,0x60, +0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e,0xb3,0x36,0x63,0x60, +0x5, 0x14,0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x0, 0x28,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c, +0xa7,0x90,0x60,0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, +0x80,0x71,0xbe,0xb0,0x2, 0x38,0x66,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27, +0x7e,0x73,0x26,0xfa,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26, +0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x2, +0x80,0x4e,0x6c,0xff,0x80,0x30,0x7c,0xbf,0x12,0x37,0x81,0x1a,0x4b,0x7c,0xbf,0x12, +0x37,0x6f,0x7d,0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d, +0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, 0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75, +0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xcb,0x80,0x6, 0xe5,0x1e,0x24, +0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, +0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22,0x7e,0x39,0x70,0xa, 0x37,0x9d,0x32,0x2, +0x21,0x0, 0xca,0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6, +0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd, +0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f,0x46,0x75,0x2b,0x0, 0x61,0x43,0x12,0xa4, +0xde,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b, +0x2e,0x34,0x14,0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x22,0xff,0x12,0x20,0xb9,0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a,0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35, +0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff,0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a, +0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5,0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xa4, +0xe6,0x2e,0x35,0x36,0x12,0xa1,0x48,0x7d,0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58, +0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, 0x3b,0x7f,0x3, 0x12,0xa4,0xe6,0x2e,0x35, +0x38,0x12,0xa1,0x48,0x7d,0xc3,0x7e,0x35,0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32, +0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37,0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a, +0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c, +0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5,0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb, +0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0x61, +0x41,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60, +0x8, 0x2, 0x61,0x41,0x80,0x28,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, +0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x61,0x41,0xbe,0x34,0x0, 0x30,0x8, +0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x61,0x41,0x7e,0xa3, +0x38,0x41,0x74,0xc, 0xa4,0xbe,0x57,0x22,0xf9,0x58,0x2, 0x61,0x41,0x7e,0xa3,0x38, +0x42,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58,0x2, 0x61,0x41,0x7e,0x15,0x36,0x6d,0x0, +0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xa3,0x7e,0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d, +0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xa3,0x7e,0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73, +0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38,0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b, +0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4,0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10, +0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33,0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7c,0xb7,0xf5,0x2e,0xe5,0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37, +0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34,0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e, +0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22, +0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35,0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a, +0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a,0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22, +0xf6,0x5, 0x2b,0x12,0xa4,0xde,0x28,0x2, 0x21,0x7e,0x7e,0xa3,0x22,0xf7,0xbe,0xa1, +0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe,0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50, +0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, 0x34,0x7a,0x73,0x38,0x3e,0x7a,0xb3,0x38, +0x40,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x38,0x3e,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a, +0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43,0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14, +0x12,0xa4,0xd6,0x7a,0x55,0x4a,0xa, 0x5e,0x7f,0x16,0x12,0xa4,0xd6,0x7a,0x55,0x48, +0x7e,0x35,0x48,0x12,0xa4,0xcf,0x2f,0x50,0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a, +0x0, 0x2f,0x70,0x12,0xa4,0xcf,0x12,0xa4,0xc5,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d, +0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4a,0x12,0xa4,0xc5,0x7e,0x1d,0x40, +0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12, +0xa4,0xc5,0x7e,0x1d,0x44,0x2f,0x10,0x7a,0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c, +0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x1f,0x58,0x7f,0x51,0x7f,0x17,0x7f, +0x6, 0x12,0x1f,0x58,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12, +0x1e,0xfc,0x7e,0x87,0x23,0x43,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x3c,0x7e,0x1d,0x40,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x40,0x7e,0x1d,0x44,0x7d,0x19,0x12,0x1e,0xfc,0x7d,0x18, +0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x58,0x7a,0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1e, +0xeb,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12,0x1e,0xeb,0x7e,0x5d,0x3c, +0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1e,0xeb,0x7e,0x7d,0x40,0x9f,0x71,0xbe,0x58, +0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18, +0x7f,0x16,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x5, 0x12,0x1f,0x58,0x7f,0x6, 0x12,0x1e, +0xeb,0x7f,0x7, 0x12,0x1f,0x58,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44, +0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0x7f,0x1, 0x22,0x7d, +0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x39,0x1, 0xbe,0x71,0x2b,0x22,0x2d,0x13,0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79, +0x6c,0xaa,0x12,0xa5,0xe4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf, +0x38,0x43,0x7f,0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x38, +0x63,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda,0x7e,0x8, 0x38,0x43,0x7e,0x18,0x38,0x63, +0x74,0x20,0x12,0xa1,0x52,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73, +0x38,0x3f,0xbe,0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22, +0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0x33,0x38,0x3f,0xa, 0x13,0x6d,0x0, 0x12, +0x1f,0x7, 0x7c,0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64, +0xa, 0x3e,0x1b,0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xa5,0x92,0x7f,0x6, 0x7c, +0xbd,0x7c,0x7c,0x12,0xa5,0x92,0xb, 0xf0,0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x50,0xbc, +0x7f,0x5, 0x7f,0x16,0x12,0xa4,0xee,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x38,0x3e,0xda, +0x3b,0x22,0x7c,0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d, +0x2, 0xb, 0xa, 0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, +0x7c,0x21,0xa5,0xba,0x0, 0x14,0x1a,0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d, +0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, +0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35, +0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xe4,0x7a, +0xb3,0x35,0x69,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x5, 0xe4, +0x7a,0xb3,0x35,0xe4,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x4f,0x12,0xa6,0x4e,0x28, +0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0xdc,0xbe,0x37, +0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x3, 0x70,0x17,0x7e, +0xb3,0x37,0x8, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28, +0x5, 0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0xb3, +0x28,0x84,0xbe,0xb0,0x0, 0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x6e, +0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c, +0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x4a,0x12,0xa6,0xff,0x78, +0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x21, +0x0, 0x7d,0x13,0x7d,0x3e,0x12,0x21,0x0, 0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5, +0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33,0x9e,0x35,0x2e,0xbd,0x3e,0x8, +0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, +0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xae,0x7e,0x73, +0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80, +0xa, 0x12,0xa6,0xff,0x78,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc, +0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0xc1,0x71,0xda,0x3b,0x22,0xa, +0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22, +0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d, +0x0, 0x7f,0x14,0x12,0x1f,0x58,0x7d,0x73,0x12,0x21,0x0, 0x7d,0xe3,0x7d,0x3f,0x12, +0x21,0x0, 0xbd,0x3e,0x22,0x7e,0x63,0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c, +0xc2,0x12,0x6c,0x33,0x80,0x56,0x90,0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac, +0x93,0x90,0x60,0xab,0xe4,0x93,0xa, 0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4, +0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a, +0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x31,0x5a,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f, +0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, 0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, +0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75, +0xbc,0x73,0x38,0xa2,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x32,0xe7,0x22,0x90,0x60,0xa7, +0xe4,0x93,0x60,0x8, 0x30,0x12,0x5, 0x12,0x31,0x7d,0xc2,0x12,0x22,0xca,0xd8,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x22,0xe6,0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x1f,0xad,0x6d,0x11,0x7e,0x4, +0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0xa8,0xe1,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d, +0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, +0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x1, 0xd2,0xbe,0xd4,0x4, +0xb0,0x8, 0x2, 0xd2,0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd, +0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7, +0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x1, 0xd2,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, +0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0xa8,0xe1,0x1a,0x26,0x1a,0x24,0x2f, +0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0xa8,0xd7,0x9f,0x55,0x6c,0xee, +0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12, +0x21,0x0, 0x7d,0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, +0x1d,0x12,0xa8,0xd7,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, +0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea, +0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x58,0x7d,0x13, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x0, 0xca, +0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x80,0xc2,0x3, 0x6d,0x44,0x80,0x32, +0x12,0xa9,0x90,0x12,0xa8,0xe9,0xbd,0x3d,0x48,0x26,0x12,0xa9,0x90,0xb, 0x1a,0x30, +0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0xd2,0x3, 0x80,0x9, 0x12,0x21,0x0, 0xbd,0x3d,0x68, +0x2, 0xc2,0x3, 0x7d,0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa8,0xe9,0x7d,0xd3, +0xb, 0x44,0x7e,0xc5,0x35,0xbd,0xc4,0x38,0xc7,0x30,0x3, 0xc, 0x7e,0xf0,0x7f,0x80, +0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba,0x7d,0x3d,0x60,0x5, 0xe, 0x34, +0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f,0x10,0x2e,0x35,0x35,0x7a,0x1b, +0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30, +0x7f,0x60,0x2e,0xd5,0x35,0x7e,0x6b,0xb0,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0x7c, +0xb7,0x12,0xa9,0x9b,0xb, 0x44,0x7e,0x55,0x35,0xbd,0x54,0x38,0xd8,0xda,0xf8,0x22, +0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a, +0x1b,0xb0,0x22,0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5, +0x1, 0x6c,0xaa,0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0xa9,0x99,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xed,0xc2,0xc9,0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, +0x7e,0x73,0x2a,0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0xad,0x13, +0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x38,0xd9, +0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, +0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35,0x35,0x7e,0xf, 0x37, +0x40,0x7e,0x18,0x25,0xb6,0x2, 0xa8,0xef,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12, +0xaa,0x51,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37, +0x24,0xf6,0x12,0xaa,0x58,0x12,0xaa,0x61,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, +0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, +0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2, +0x22,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53, +0x2a,0x6d,0xac,0x54,0x7e,0x17,0x28,0xa1,0x12,0xaa,0x51,0x6d,0x0, 0x80,0x37,0x7d, +0x40,0x3e,0x44,0x7e,0x7f,0x38,0xd9,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10, +0x7d,0xf4,0x2e,0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14, +0x6d,0x55,0x9d,0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d, +0x51,0x1b,0x48,0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22,0x7c,0xab,0x7e,0x8, 0x29, +0xbc,0x12,0x5e,0x25,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0,0xb4, +0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31,0x7d, +0x20,0x39,0xb1,0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0x61,0x96,0x90,0x60, +0xa7,0xe4,0x93,0x70,0x2, 0x61,0x96,0x6c,0xff,0x61,0x8f,0x7e,0x70,0x9, 0xac,0x7f, +0x9, 0xe3,0x29,0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, +0x7d,0x3d,0x12,0xab,0xa4,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, +0x7d,0x34,0x1b,0x34,0x12,0xab,0x9b,0x7c,0xbe,0x12,0xaa,0xbb,0x80,0x3f,0x7e,0x70, +0x2, 0xac,0x7d,0x2e,0x34,0x60,0xc5,0x12,0x87,0xbc,0x74,0x9, 0xac,0xbf,0x59,0xd5, +0x29,0x8, 0x7e,0x34,0x60,0xcf,0x12,0x23,0x9e,0x12,0xab,0x9b,0x80,0x1f,0xbd,0xc4, +0x40,0x1b,0x7d,0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0xaa, +0xbb,0x7d,0xc4,0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12, +0x5e,0x2d,0x28,0x2, 0x61,0xb, 0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59, +0x35,0x29,0xa, 0x22,0x6c,0xaa,0x80,0x27,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e, +0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14, +0x60,0xb3,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0xb, 0xb, 0xa0,0x90, +0x60,0xa7,0xe4,0x93,0xbc,0xba,0x38,0xd0,0x7c,0xba,0x22,0x90,0x60,0xa7,0xe4,0x93, +0x60,0x2b,0x6c,0x33,0x80,0x1f,0x7c,0xb3,0x12,0x31,0x5a,0x40,0x16,0x7c,0xb3,0x12, +0x31,0x27,0x7d,0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x1b,0x1a,0x50,0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0xac, +0x20,0x7e,0x14,0x62,0x7, 0x12,0x87,0xee,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22, +0x6d,0x11,0xe4,0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x7f,0x38,0xf3,0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12, +0x21,0x0, 0xbd,0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xf3,0x2d, +0x13,0x69,0x20,0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x81,0xbf,0x7e,0x10,0x2, 0xac, +0x1a,0x7e,0x1f,0x38,0xf3,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78, +0x4, 0x7e,0x14,0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e, +0x14,0x7f,0xff,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22, +0x6c,0x66,0x7e,0x27,0x39,0x4, 0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e, +0xb3,0x28,0xac,0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xab,0xbc,0x76,0x50,0xf, 0xe4,0x7a, +0xb3,0x28,0xad,0x12,0x8a,0x87,0x7e,0xb3,0x2f,0xab,0x4, 0x80,0x4, 0xe4,0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xab,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xac, +0xbe,0xa0,0x5, 0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74, +0x5, 0x80,0x1, 0xe4,0x7a,0xb3,0x2f,0xac,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8, +0x30,0x1, 0xe, 0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, +0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d, +0x23,0xa, 0x3a,0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f, +0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac, +0x56,0x49,0x22,0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e, +0xb3,0x2a,0x6d,0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, +0x2, 0xc2,0x3, 0xa2,0x3, 0x22,0xc2,0x3, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1, +0x60,0x4, 0xd2,0x3, 0x80,0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57, +0x49,0x12,0x4, 0xfc,0x7e,0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d, +0x22,0x9d,0x20,0xbd,0x12,0x58,0x4, 0xd2,0x3, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e, +0x14,0x0, 0x3, 0xa, 0x27,0xbd,0x21,0x48,0xd2,0xa2,0x3, 0x22,0x7d,0x23,0x7e,0x14, +0x61,0xc8,0x12,0x64,0xd3,0x7e,0x14,0x0, 0x5, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50, +0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x8, 0x50,0x45,0x74,0x8, 0x80,0x3d,0x7d,0x13, +0x3e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x6, 0x50,0x30,0x74, +0x6, 0x80,0x28,0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e, +0x33,0x36,0xdc,0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, 0x80,0xf, 0xbd,0x32,0x50,0xf, +0x7e,0x73,0x36,0xdc,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xdc,0x7e, +0xb3,0x36,0xdc,0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a,0xb3,0x36,0xdc,0x74,0x1, 0x7a, +0xb3,0x16,0x92,0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3,0x36,0xdc,0x50,0x5, 0xe4,0x7a, +0xb3,0x16,0x91,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0xae, +0xad,0x68,0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0xae,0xc5,0x7d,0x23,0x7e,0x70,0xc, +0xac,0x72,0x59,0x23,0x36,0x82,0x49,0x3, 0x36,0x82,0x49,0x23,0x36,0x7e,0xbd,0x20, +0x50,0x4, 0x59,0x3, 0x36,0x7e,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22, +0x80,0x18,0x12,0xae,0xad,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7e, +0xbd,0x4, 0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37, +0x36,0x64,0xbe,0x37,0x36,0xdd,0x50,0x8, 0x7e,0x37,0x36,0xdd,0x7a,0x37,0x36,0x64, +0x12,0xae,0xbb,0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, +0xac,0x12,0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, 0x22,0x7e,0x70,0xc, 0xac,0x7a, +0x49,0x33,0x36,0x7e,0x22,0x49,0x23,0x36,0x84,0x49,0x33,0x36,0x80,0x9d,0x32,0x2, +0x21,0x0, 0x7e,0x8, 0x36,0x7a,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x20,0xde,0x6c,0xaa, +0x7e,0x44,0xff,0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7c,0x59,0x43,0x36, +0x84,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x68,0x7e,0x34,0x0, 0xd, +0xe4,0x2, 0x20,0xde,0x7e,0xa3,0x2b,0x62,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62, +0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4,0x2, 0xa, 0x66,0x22,0xc2,0xc, 0x7e, +0x8, 0x2a,0x6d,0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x6d,0x74,0x3, 0x2, 0x11,0x7a,0xe4, +0x7a,0xb3,0x36,0x67,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59, +0x43,0x36,0x7e,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xee,0xe4,0x7a,0xb3,0x36,0x68,0x6d, +0x33,0x7a,0x37,0x36,0x6f,0x7a,0x37,0x36,0x64,0x22,0x7e,0xb3,0x36,0x6a,0xb4,0x1, +0x27,0x7e,0xb3,0x36,0xe0,0x4, 0x7a,0xb3,0x36,0xe0,0x7e,0x73,0x36,0xe0,0xbe,0x70, +0x3, 0x40,0x15,0x12,0x8c,0x90,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x6, 0x40,0x9, 0xe4, +0x7a,0xb3,0x36,0xe0,0x7a,0xb3,0x36,0x6a,0x22,0x12,0x24,0x14,0xe4,0x7a,0xb3,0x3, +0xfe,0x2, 0x76,0x52,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88, +0x7e,0xf0,0x1, 0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f, +0x7f,0x7, 0x2d,0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc, +0x9f,0x38,0xe2,0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0, +0x1, 0x2, 0xb0,0x54,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, +0x80,0x36,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26, +0xfb,0xe5,0x44,0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16, +0x5, 0x45,0xa, 0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0xb0,0x62,0xbd,0x3d,0x8, +0x5, 0x12,0xb0,0x62,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe, +0xb0,0x0, 0x28,0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba, +0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x33,0xc3,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a, +0x19,0x72,0x33,0xc4,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x30,0x3, 0x1b,0x1a,0xd0, +0xb, 0xa0,0xb, 0xf0,0xbc,0x8f,0x40,0x3, 0x2, 0xaf,0xd4,0x7c,0xba,0xda,0x79,0xda, +0xd8,0x22,0x7c,0xbe,0x7c,0x7d,0x2, 0x2c,0x40,0x7c,0x9b,0x7f,0x71,0x7f,0x60,0x7e, +0x34,0x22,0xb8,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f,0x52,0x74,0x2a,0x12,0x1f,0xad, +0x7e,0x58,0x1f,0x52,0x7c,0xb9,0x7e,0x71,0x44,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x45, +0x7e,0x71,0x46,0x12,0x2c,0x40,0x2d,0x34,0xe, 0x34,0x7f,0x5, 0x7e,0x50,0x7, 0xb, +0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, 0x1b,0x6a,0x30,0x69,0x30,0x0, +0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe2,0x22,0x6d,0x33, +0x7d,0x23,0x7d,0x3, 0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x6e, +0xac,0xb3,0xa, 0x42,0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4, +0xb, 0x7a,0x40,0xbe,0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, +0x24,0xbe,0x44,0xff,0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, +0x34,0xb, 0x21,0x7e,0x93,0x2a,0x6e,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb3,0x38,0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e, +0x14,0x1e,0x14,0x12,0x25,0x3e,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a, +0xb3,0x39,0x8, 0x7e,0xb3,0x39,0x9, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39, +0x9, 0x80,0x3c,0xe4,0x7a,0xb3,0x39,0x9, 0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22, +0xbd,0x32,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x9, 0x7e,0xb3,0x39,0x8, 0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x8, 0x80,0x16,0xe4,0x7a,0xb3,0x39,0x8, 0x74,0x2, +0x80,0x9, 0xe4,0x7a,0xb3,0x39,0x8, 0x7a,0xb3,0x39,0x9, 0x7a,0xb3,0x39,0xa, 0x7e, +0xb3,0x39,0xa, 0x22,0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x39,0xb, 0x22,0xca,0xd8, +0xca,0x79,0xc2,0x3, 0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7,0x28,0x97, +0x7e,0x37,0x37,0xfb,0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff,0x7e,0xa3, +0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14,0x24,0xc2, +0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83,0x2a,0x6d, +0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99,0x80,0xf, +0x7c,0xb9,0x12,0x37,0x6f,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, 0x90,0x7e, +0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x61,0x4f,0x7e,0xa3, +0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3,0x26,0x83, +0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34,0x49,0x23, +0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, 0x6d,0x33, +0x9d,0x3e,0x12,0x8f,0xdc,0xbd,0x3, 0x8, 0x4, 0xd2,0x3, 0x80,0x6, 0xb, 0x90,0xbc, +0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe,0xe7,0x7, 0xf8,0x8, 0x2, 0xc2, +0x3, 0x30,0x3, 0x20,0x7e,0xb3,0x39,0xb, 0x4, 0x7a,0xb3,0x39,0xb, 0x7e,0x23,0x39, +0xb, 0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x39,0xb, 0x74,0x1, 0x7a,0xb3, +0x28,0xa8,0x80,0xf, 0x7e,0x23,0x39,0xb, 0xbe,0x20,0x0, 0x28,0x6, 0x1e,0x20,0x7a, +0x23,0x39,0xb, 0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28,0x69,0x7e, +0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68,0x59,0x7e, +0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, +0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x2c,0x3c,0xbe,0x34,0x0, 0x96,0x8, 0x5, +0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38,0xdb,0x6c, +0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3,0x27,0x37, +0x12,0x2c,0x3c,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90, +0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x17,0xa, 0xe9,0xa, 0x5f, +0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x39,0xc, 0x4, +0x7a,0xb3,0x39,0xc, 0x7e,0x73,0x39,0xc, 0xbe,0x70,0x5, 0x28,0x22,0x74,0x5, 0x7a, +0xb3,0x39,0xc, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x15,0x12,0xb1,0x84,0x80,0xf, +0x7e,0x73,0x39,0xc, 0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x39,0xc, 0xda, +0x79,0xda,0xd8,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34,0x0, 0x38,0xca,0x39,0xac,0x7f, +0x2e,0x34,0x0, 0x50,0x6d,0x22,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, 0x30,0x6d,0x22,0x7e,0x8, 0x3, +0x60,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0x3e, +0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x20,0xde,0x90,0x60,0x93,0x93,0xa, 0x3b,0x7e, +0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43,0x6c,0x77,0x80, +0x1d,0xa, 0x27,0x2d,0x24,0x12,0x87,0xdc,0xb, 0xa, 0x0, 0x7e,0x30,0x2, 0xac,0x37, +0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, 0x70,0xbc,0xa7, +0x38,0xdf,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x13,0xc6, +0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24,0x13,0x8e,0x9d,0x31,0x1b,0x28, +0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38,0xdc,0x22,0x7c,0xab,0x12,0xb4, +0xb, 0xd2,0x16,0x7c,0xba,0x12,0x86,0xf8,0xc2,0x16,0x22,0xa9,0xd1,0xcb,0x74,0x1, +0x2, 0x0, 0xe, 0x12,0xb4,0xb, 0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x6d,0x12,0xb4, +0x4c,0x12,0xb4,0x2f,0x7a,0x37,0x38,0xd6,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x6d, +0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb5,0x19,0x90,0x60, +0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb4,0x80,0x22,0x7a,0xb3,0x24,0xf2, +0x7e,0x53,0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa,0xe4,0x7a,0xb3,0x24, +0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24,0xf6,0x7e,0x34,0x0, +0x20,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x7a,0x37,0x24,0xfc,0x7e,0x8, 0x24,0xf2,0x22, +0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e,0xa, 0xd8,0x90,0x60,0x94,0xe4, +0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x18,0x7e,0x70,0x2, 0xac, +0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, 0x5a,0xc0,0x9d,0xc2,0x59,0xc3, +0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60,0x92,0xe4,0x93,0x7c,0x9b,0x6d, +0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92,0xe4,0x93,0xa, 0xcb,0x1b,0xc4, +0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x7d,0x23, +0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d,0x3e,0x34,0x2d,0x31,0x7d,0x20, +0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x0, 0x7d,0xa3,0xbd,0xfa,0x58,0x2, +0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8,0x2d,0xec,0x2d,0xdc,0xb, 0xf0, +0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca,0xf8,0x6d,0x44,0x7e,0xf3,0x2a, +0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3,0x2a,0x6d,0xa, 0xeb,0x2d,0xef, +0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x31, +0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda,0x2d,0xdf,0x3e,0xd4,0x7e,0x1f, +0x38,0xd9,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x50,0x2d,0xb2, +0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, 0xa0,0xbc,0xfa,0x38,0xd9,0x80, +0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x38,0xd9,0x2d,0x15,0x6c,0xaa,0x80,0x2c,0xa, +0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x38,0xd9,0x2d,0x3e,0xb, 0x1a,0xe0,0x7e,0x70, +0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0,0x7d,0x3e,0x9d,0x3d,0x12,0x21, +0x0, 0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, 0xa0,0xbc,0xfa,0x38,0xd0,0x7d, +0x34,0xda,0xf8,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9,0xc5,0xea, +0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x4e,0x7e,0x73,0x39,0x6, +0xbe,0x71,0x4e,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9,0x34,0xe5, +0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x33,0xe5, +0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5,0x3, 0xa9, +0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8,0x22,0x7e, +0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79,0x30, +0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79,0x30, +0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79,0x30, +0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd0,0xce,0xa2,0x3, 0xa9,0x95,0xc9,0x22, +0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0xa9,0xc2,0xeb,0xa9,0xd2, +0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9, +0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, 0x75,0x8b,0x0, 0xd2,0x8e, +0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7,0x0, 0x75,0xf8,0x0, 0xa9, +0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xc1, +0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7,0xc2,0xbe,0x22,0x75,0xe7, +0x6b,0x2, 0xb6,0xc4,0xe4,0x7e,0x34,0xd7,0xfc,0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0, +0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0x7e,0x37,0x39,0x4, 0xb, 0x34,0x7a,0x37,0x39,0x4, 0xbe,0x34,0xff,0x0, +0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37,0x39,0x4, 0x22,0x7c,0x6b,0x6c,0x77,0x6c, +0xaa,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x46,0x12,0xb7,0xb9,0x75,0xb5,0x5, 0xa9,0x36, +0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3, +0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5, +0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47, +0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0x22,0x74,0x6, +0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73,0x7d,0x52,0x7c,0xab,0x7e,0xb3, +0x39,0x13,0xb4,0xa5,0x3c,0x12,0xb7,0xb9,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0x12, +0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2, +0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0xb7,0x62,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x22, +0x74,0x2, 0x7d,0x3f,0x2, 0xb7,0x62,0x7d,0x42,0x7f,0x60,0x7d,0x3, 0x12,0xb8,0x38, +0x74,0x2, 0x12,0xb6,0xfb,0x7d,0xf3,0x4e,0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, 0x12, +0xb7,0xc0,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f,0x6, 0x12,0xb8,0x64,0x5e,0xf4, +0xff,0xfd,0x12,0xb7,0xc0,0x2, 0xb7,0xf8,0xa9,0xc5,0xca,0xe4,0x7a,0xb3,0x39,0x13, +0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12,0xb6,0xfb,0x4c,0xff,0x78,0x5, 0x5e,0x70, +0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0xb7,0x62,0xda,0xf8,0x22,0xd2,0xc8, +0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0xb8, +0x38,0xe4,0x12,0xb8,0x1, 0x2, 0xb7,0xf8,0xa9,0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1, +0xea,0x74,0xa5,0x7a,0xb3,0x39,0x13,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24,0xbd, +0x32,0x38,0xe9,0x22,0x12,0xb8,0x72,0x7e,0x35,0x36,0x12,0xb8,0x48,0xa9,0xd2,0xb4, +0xd3,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5,0xa, 0x44,0xf5,0x39,0x7f,0x21, +0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xb8,0x9d,0xe5,0x3a,0x12,0xb8,0x9d,0xe5, +0x39,0x12,0xb8,0x9d,0xe5,0x38,0x12,0xb8,0x9d,0xe4,0x2, 0xb8,0x9d,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c, +0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, +0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74, +0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x97,0xbe,0x90,0x1, +0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe, +0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18, +0xb2,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xb9,0x5c,0xb, 0x7a,0x20, +0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d, +0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25, +0x3c,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, +0xf9,0x2d,0xf1,0x7d,0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77, +0x14,0x78,0xfb,0x4d,0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xd9,0x7e,0x8, +0x1f,0x3c,0x12,0xba,0x1a,0xd2,0x3, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xb9,0x64, +0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32, +0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, +0x12,0xba,0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7, +0x38,0xee,0x12,0xba,0x7, 0xe4,0x12,0xba,0xf, 0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a, +0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xba,0x7, 0x74,0x1, 0x12,0xba,0xf, 0x74, +0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12, +0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x1c,0x74,0x3f, +0x2, 0x20,0xde,0x7e,0x8, 0x1f,0x34,0x12,0xba,0x1a,0x6c,0x77,0x80,0xe, 0x12,0xba, +0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x6e, +0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9, +0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x44,0xa, +0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57,0x7c,0xab, +0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46, +0x2e,0x44,0x20,0x73,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b,0xbe,0x60, +0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb, +0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b, +0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70, +0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbb,0x29,0x60,0x5, 0x3e, +0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16, +0x9e,0x60,0xe, 0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b, +0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72, +0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12,0x77,0xf6,0xb, 0x24,0xa, 0x33,0xbd,0x32, +0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28, +0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f, +0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d, +0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a, +0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a, +0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a, +0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3, +0xff,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, +0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85, +0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88, +0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53, +0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e, +0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91, +0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12,0x2f,0xd0,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xfb,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x37,0x32,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xbd,0x64, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x38,0xfc,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x37,0x33,0x80,0x1a,0x12,0xbd,0x64,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x38,0xfb,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x34,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f, +0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x80, +0x7e,0x34,0x0, 0x28,0xe4,0x12,0x20,0xde,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, 0xc0, +0x12,0x20,0xde,0x7a,0xb3,0x37,0x34,0x7e,0x34,0x62,0x8e,0x12,0x23,0x9e,0x7a,0x37, +0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a,0xe7, +0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a,0xf7, +0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a,0xf7, +0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe,0x7a, +0xb3,0x37,0x34,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x7e,0x37,0x38,0xe2,0x9e,0x37,0x38,0xde,0x12,0x21,0x0, 0xbd,0x31,0x38,0x12, +0x7e,0x37,0x38,0xe4,0x9e,0x37,0x38,0xe0,0x12,0x21,0x0, 0xbd,0x31,0x38,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd, +0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x38,0xdd,0x60,0x11,0x7e,0xc7, +0x38,0xe6,0x4d,0xcc,0x78,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x28,0x2, 0xe1,0x8, 0xbe, +0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xe1,0x8, 0x7e,0xe7,0x29,0x8, 0x7e, +0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x66,0xe6,0xbe,0xb0,0x1, 0x78,0x2, 0xe1, +0x8, 0x7e,0xa3,0x38,0xdd,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23, +0x14,0x78,0x2, 0xe1,0x5, 0xb, 0xb2,0x68,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x68,0x2, +0xe1,0x17,0x4c,0xee,0x68,0x2, 0xe1,0x17,0x74,0x1, 0x7a,0xb3,0x38,0xdd,0x12,0xbf, +0x2a,0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3, +0x38,0xdd,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xdd,0x7e,0x34, +0x62,0x68,0x80,0x48,0x12,0xbf,0x33,0x90,0x62,0x57,0x12,0xbf,0x1e,0x68,0x49,0x80, +0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xbf,0x33,0x7e,0x34,0x62, +0x60,0x12,0x23,0x9e,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d, +0xc3,0xbe,0xc7,0x38,0xe6,0x40,0x21,0x90,0x62,0x56,0x12,0xbf,0x1e,0x68,0x19,0x12, +0xbf,0x2a,0x74,0x3, 0x7a,0xb3,0x38,0xdd,0x7e,0x34,0x62,0x64,0x12,0x23,0x9e,0x7a, +0x37,0x38,0xe6,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xdd,0x6d,0x33,0x7a, +0x37,0x38,0xe6,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93, +0xa, 0x3b,0x12,0xbd,0xe9,0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x38,0xde,0x7a,0xf7, +0x38,0xe0,0x22,0x7a,0xe7,0x38,0xe2,0x7a,0xf7,0x38,0xe4,0x22,0xca,0xf8,0x7f,0x51, +0x7f,0x40,0x7e,0x37,0x2f,0x90,0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c, +0x7e,0x37,0x2f,0x9c,0x7a,0x35,0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff, +0x80,0x1e,0x7e,0x34,0x0, 0x26,0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0x8c,0x74, +0x2, 0xac,0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xbf,0x8b,0xb, 0xf0, +0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e, +0x35,0x2f,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e, +0x35,0x31,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, +0x6a,0x30,0x9e,0x35,0x33,0x6d,0x22,0x7e,0x33,0x38,0x41,0x12,0xbf,0xe0,0x7e,0x15, +0x2f,0x12,0x1f,0x5, 0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e, +0x33,0x38,0x42,0x12,0xbf,0xe0,0x7e,0x15,0x31,0x12,0x1f,0x5, 0x1b,0x7a,0x30,0x22, +0xa, 0x13,0x6d,0x0, 0x2, 0x1e,0xeb,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, +0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22, +0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x7e,0x34,0x60,0xa3,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e,0x37,0x2a,0x53,0x22,0x7e,0xa3,0x2a,0x6e,0x7e, +0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d,0x22, +0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b, +0x14,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e, +0x7b,0x60,0xbc,0x6b,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x2e,0x14,0x1, 0x30,0x6d, +0x0, 0x7e,0x18,0x3, 0x60,0x22,0x2e,0x14,0x0, 0x50,0x6d,0x0, 0x7e,0x18,0x34,0x0, +0x22,0x74,0x6, 0x12,0xb6,0xfb,0x7d,0x3, 0x6c,0x11,0x22,0x7e,0x70,0x2, 0xac,0x7c, +0x9, 0xb3,0x26,0xfa,0x22,0xe4,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36,0x71,0x22,0x74, +0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x61,0x57, +0x22,0x7a,0x37,0x28,0xa1,0x7e,0x34,0x61,0xc2,0x22,0x90,0x60,0xaa,0xe4,0x93,0xbe, +0xb0,0x1, 0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b,0xf, 0x22,0x74,0x5, 0xac,0xbc, +0x9, 0xb5,0x26,0x33,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22,0x7e,0xe3, +0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e, +0x37,0x25,0xf4,0x7a,0x37,0x31,0xcc,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x31,0xce, +0x22,0x7e,0x73,0x37,0xbd,0x7a,0x73,0x2b,0x20,0x22,0x12,0x0, 0x1e,0x7e,0xb3,0x2a, +0xfc,0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0, +0x1, 0x22,0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xb3,0x37,0x31,0xbe,0xb0, +0x1, 0x22,0x7e,0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7,0xe4,0x93,0x7c, +0xab,0x22,0xc1,0x42,0x3e,0xbd,0x2d,0xd2,0x19,0x53, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_lens_tianma.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_lens_tianma.txt new file mode 100644 index 0000000000000..4e2af6643b38b --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_lens_tianma.txt @@ -0,0 +1,2713 @@ +0x2, 0x16,0x42,0x2, 0x9d,0xa4,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x49,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x49,0xeb,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x65,0x9a,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x22,0x2, 0x65,0xb6,0x2, 0x20,0x74,0x32,0x32,0x2, 0x0, 0x4a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0x2, 0x27,0x69,0xff,0xff,0x2, 0x0, 0x5a,0xb2,0x86, +0x22,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x33,0xe7, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x33,0xf7,0x7e,0x73,0x33,0xf7,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x66,0xc9,0x7e,0x1f,0x33,0xe7,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x33,0xe7,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x33,0xeb,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x33,0xf3,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x33,0xf1,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf3,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0x4b,0x63,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x14,0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x14, +0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x52,0x61,0x3f,0x7e,0x34,0x14,0x89,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x61,0x3f,0x7e,0x34,0x14,0x89,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x14,0x22,0x61,0x3f,0x7e,0x34,0x14,0x6, 0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x14,0x36,0x61,0x3f,0x7e,0x34,0x14,0x7a,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14, +0x61,0x61,0x3f,0x7e,0x34,0x14,0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x14,0xd9,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x14,0xda,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x34,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x34,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x33,0xe7,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x33,0xe7,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x33, +0xe7,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x33,0xe7,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x17,0x4e,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf3,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x33,0xdf,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf3,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x33,0xdf,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf3,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf3,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf3,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x33,0xe7,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x15,0x29,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x33,0xe7,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x15,0x29,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x15,0x29,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x33,0xe7,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x33,0xfc,0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x33,0xfc,0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x82,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x33,0xfc, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x33,0xfc, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x33,0xfc,0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xef,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xef,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xef,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xef,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x33,0xdf,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x33,0xdf,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x33,0xdf,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x33,0xdf,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x33,0xe7,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x33,0xe7,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x33, +0xe7,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x33,0xe7,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x33,0xe7,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x33,0xe7,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x33,0xe7,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x33,0xe7,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x33, +0xe7,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x33,0xe7, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x33,0xe7,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x33,0xe7,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x33,0xe7,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x33,0xe7,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x15,0x29,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x15,0x29,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xef,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xef,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xef,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x33,0xfc, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x33, +0xfc,0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x33,0xe7,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x33,0xe7,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x33,0xe7,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x33,0xe7, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x33,0xe7,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x33,0xe7,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x33,0xfc,0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x33,0xfc,0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x33,0xfc,0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf3,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xee,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x33,0xdf,0x1b,0x1a,0x10,0x7e,0xf, 0x33,0xdf,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf3,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf3,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x33,0xfc,0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x33,0xfc,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x33,0xfc,0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x33, +0xfc,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x33,0xfc,0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x33,0xfc,0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x15,0xc8,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x15,0x5b,0x7d,0x1e,0x12,0x15,0x75,0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x33,0xe7,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf3,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xee,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf3,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x66,0xc9,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x33,0xdf,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x33,0xdf,0x1b,0x1a,0x10,0x7e,0xf, 0x33,0xe7,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x33,0xf7,0x7e,0x1f,0x33,0xdf, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xef,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xef,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xef,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x33,0xe7,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x33,0xe7,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xef,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xef,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x33,0xfc,0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x16,0xff,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x17,0x0, 0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x33,0xdf,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x33,0xdf,0x1b,0x1a,0x10,0x7e, +0x1f,0x33,0xdf,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x33,0xe7,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf3,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x33,0xdf,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x33,0xdf,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x33, +0xe7,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x33,0xe7,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x33,0xe7,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x33,0xdf,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x33,0xe7,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x15,0x77,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x15,0x77,0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0xc, 0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x5e,0x0, 0xc2,0x14,0x75,0x5f,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x60,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x17,0x90,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x1f,0xfb,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0x32,0x1, 0x19,0x1, 0x0, 0x2, 0xf8,0x4, 0xe7,0x5, 0xce,0x6, 0xc2,0x7, 0xb5,0x8, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xef,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0xa9,0x0, 0x0, 0x2, 0x37,0xfb,0x0, 0x0, 0x0, 0x2, 0x37, +0xfd,0x0, 0x0, 0x0, 0x1, 0x37,0xff,0x0, 0x0, 0x1, 0x36,0xdd,0xff,0x0, 0x1, 0x34, +0x4f,0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x2, 0x34,0x9e,0x0, 0x0, 0x0, 0x1, 0x34, +0xc1,0x0, 0x0, 0x1, 0x35,0x3a,0x0, 0x0, 0x1, 0x35,0x3b,0x0, 0x0, 0x1, 0x35,0x3c, +0x0, 0x0, 0x3c,0x35,0xe5,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x36,0x5d,0x0, 0x0, 0x1, 0x36,0x5e,0x0, 0x0, 0x1, 0x36,0x5f,0x0, +0x0, 0x1, 0x35,0xde,0x1, 0x0, 0x2, 0x35,0xe1,0x0, 0x0, 0x0, 0x1, 0x2f,0xc8,0x0, +0x0, 0x1, 0x2f,0xc9,0x0, 0x0, 0x1, 0x2f,0xca,0x0, 0x0, 0x1, 0x2f,0xcb,0x0, 0x0, +0x1, 0x36,0x62,0x1, 0x0, 0x1, 0x36,0xdc,0x0, 0x0, 0x1, 0x39,0xb, 0x0, 0x0, 0x6, +0x38,0xf7,0x30,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x3, 0x0, 0x0, 0x1, 0x39, +0x4, 0x0, 0x0, 0x1, 0x39,0x5, 0x0, 0x0, 0x1, 0x39,0x6, 0x0, 0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x0, 0x61,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x4, 0x37,0x4e,0x0, +0x0, 0x0, 0x0, 0x0, 0x1, 0x38,0xfd,0x0, 0x0, 0x1, 0x38,0xfe,0x0, 0x0, 0x2, 0x38, +0xff,0x0, 0x0, 0x0, 0x1, 0x39,0x1, 0x64,0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39, +0xc, 0x0, 0x0, 0x1, 0x39,0x8, 0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x38,0xd9, +0x0, 0x0, 0x2, 0x2b,0xd8,0x2b,0xde,0x0, 0x1, 0x2f,0x9e,0x2, 0x0, 0x1, 0x2f,0xc7, +0x0, 0x0, 0x4, 0x38,0xef,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf3,0x0, 0x0, 0x64, +0x0, 0x0, 0x4, 0x33,0xdf,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x33,0xe3,0x0, 0x0, 0x68, +0xc0,0x0, 0x4, 0x33,0xe7,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x33,0xf8,0x0, 0x0, 0x40, +0x0, 0x0, 0x4, 0x33,0xfc,0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, +0xf4,0x2, 0x58,0x0, 0xc, 0x1, 0x5e,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, +0x5, 0x0, 0x78,0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, +0x3c,0x0, 0x2, 0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, +0x28,0x0, 0x0, 0x0, 0x1e,0x12,0x37,0x6e,0x12,0x19,0xc5,0x12,0x19,0x90,0x12,0x1a, +0x6a,0x2, 0x19,0x54,0x12,0x19,0x65,0x7e,0xb3,0x2b,0x2e,0x12,0x97,0xf7,0x74,0x1, +0x7a,0xb3,0x36,0x66,0x22,0x12,0x98,0x95,0x74,0x1, 0x7a,0xb3,0x36,0x62,0x22,0x12, +0x19,0xfc,0x12,0x4a,0x17,0x12,0x20,0x1d,0x12,0x37,0x6e,0x12,0x19,0xfc,0x12,0x19, +0xc5,0x12,0xa8,0xc5,0x12,0x19,0x90,0x12,0x1a,0x6a,0x12,0x1a,0x9a,0x2, 0x19,0x54, +0x12,0x20,0x66,0x12,0x19,0xe2,0x2, 0x19,0x99,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, +0x19,0xa2,0x7d,0x43,0x7e,0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, +0xac,0x7a,0x59,0x43,0x34,0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34, +0x38,0xc3,0x22,0xd3,0x22,0x12,0x63,0x86,0x12,0x5d,0xb3,0x2, 0x19,0xce,0x30,0xf, +0x10,0x12,0x5d,0xed,0x50,0x3, 0x12,0x4e,0x83,0x12,0x5a,0xf8,0x12,0x7c,0x51,0xc2, +0xf, 0x22,0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x19,0xa2,0x7e,0x34,0x0, 0x1, 0x7e, +0x24,0x7, 0x7a,0x2, 0x19,0xa2,0x74,0x1, 0x7a,0xb3,0x37,0xae,0x7e,0x34,0xd, 0xac, +0x6d,0x22,0x7a,0x27,0x38,0xc8,0x7a,0x37,0x38,0xca,0x22,0xca,0xf8,0x7e,0xf3,0x37, +0xae,0xbe,0xf0,0x5, 0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xae,0x12,0x0, 0x9, 0x80, +0x40,0xbe,0xf0,0x4, 0x78,0xd, 0x12,0x19,0xf6,0xe4,0x7a,0xb3,0x2b,0x21,0x12,0x63, +0x86,0x80,0x2e,0xbe,0xf0,0x6, 0x78,0x13,0x12,0x19,0xf6,0x12,0x41,0xb, 0xe4,0x7a, +0xb3,0x2b,0x3d,0x12,0x5d,0xb3,0x12,0xa9,0x52,0x80,0x16,0xbe,0xf0,0x7, 0x78,0x17, +0x12,0x19,0xf6,0x12,0x5f,0xe9,0x50,0xfb,0x12,0x5d,0xd9,0x12,0x19,0xce,0x12,0x1a, +0x6a,0x74,0x2, 0x7a,0xb3,0x37,0xae,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a, +0xb3,0x34,0x39,0x12,0x45,0x31,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a, +0xb3,0x34,0x3a,0x22,0x12,0xa8,0xc5,0x12,0xa9,0xb, 0x7a,0x37,0x38,0xff,0x12,0x19, +0xfc,0x12,0x19,0xc5,0x12,0x1a,0x6a,0x2, 0x1a,0x9a,0x12,0x8a,0x65,0x50,0x4, 0x74, +0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca, +0x3b,0x12,0x5f,0xe9,0x50,0xfb,0x7e,0xf3,0x2b,0x2e,0x7c,0xbf,0x12,0x7c,0xd0,0x12, +0x7f,0x4d,0x7e,0xb3,0x2b,0x3e,0xf5,0x28,0x7e,0xc3,0x2b,0x3f,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0xf, 0x12,0x4e,0x49,0x7e,0xb3,0x16,0x91,0x70,0x6, 0x12,0x1a,0x6a,0xc3, +0x61,0xab,0x12,0x1b,0xae,0x3e,0x34,0xca,0x39,0x7e,0x18,0x6, 0xfc,0x7e,0x8, 0x4, +0x7e,0x12,0x17,0x29,0x1b,0xfd,0x12,0x1b,0xae,0x3e,0x34,0xca,0x39,0x7e,0x18,0x7, +0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x17,0x29,0x1b,0xfd,0x7e,0xb3,0x37,0x5, 0xb4,0x3, +0x7, 0x12,0x92,0x7a,0x7a,0x37,0x37,0xf1,0x74,0x1, 0x7a,0xb3,0x16,0x90,0x12,0x19, +0xc5,0x12,0x92,0x6b,0x12,0x4d,0x5a,0xe4,0x12,0x13,0xde,0x12,0x1a,0x6a,0x7e,0x8, +0x4, 0x7e,0x7a,0xd, 0x29,0x7e,0x18,0x6, 0x76,0x7e,0xb3,0x2b,0x91,0x12,0x63,0xce, +0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x29,0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12, +0x63,0xce,0x7e,0xd3,0x2b,0x3e,0x7e,0xe3,0x2b,0x3f,0xe5,0x28,0x7a,0xb3,0x2b,0x3e, +0x7a,0xc3,0x2b,0x3f,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d,0x10, +0x12,0x5b,0x7c,0x7a,0xd3,0x2b,0x3e,0x7a,0xe3,0x2b,0x3f,0x7c,0xbf,0x12,0x7b,0xd5, +0x12,0x91,0x80,0x7e,0xb3,0x39,0x2, 0x4, 0x7a,0xb3,0x39,0x2, 0x7e,0x73,0x39,0x2, +0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x2, 0x7e,0xb3,0x16,0x90,0x60, +0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e,0x73, +0x2a,0x93,0xa, 0x27,0x7e,0x73,0x2a,0x92,0xa, 0x37,0x2d,0x32,0x22,0x12,0x40,0x7, +0x7e,0xb3,0x37,0x5, 0xb4,0x3, 0x6c,0x12,0x9f,0x30,0x12,0x1f,0xed,0x12,0x38,0xd, +0x7e,0xb3,0x37,0xaa,0x30,0xe7,0xe9,0x12,0x1a,0xaf,0x12,0x1b,0xae,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x17,0x29,0x1b,0xfd,0x12,0x1b, +0xae,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x17,0x29, +0x1b,0xfd,0x7e,0xb3,0x2b,0x3c,0xb4,0x1, 0x18,0x12,0x2e,0xde,0x12,0x54,0xb7,0x12, +0x57,0x4, 0x12,0x90,0x60,0x12,0x5e,0x84,0x12,0x87,0xc0,0x12,0x1c,0x44,0x12,0x48, +0xcf,0x12,0x40,0x40,0x12,0x9d,0x34,0x7e,0xb3,0x37,0xaa,0x54,0x7f,0x7a,0xb3,0x37, +0xaa,0x80,0x8d,0x12,0x5f,0xf4,0x2, 0x1c,0x39,0x7e,0xb3,0x37,0x4c,0x70,0x4, 0xe4, +0x12,0x76,0x96,0x22,0x12,0x73,0x21,0x12,0x1e,0x38,0x12,0x1e,0x38,0x12,0x8a,0x8b, +0x12,0x71,0x8b,0x12,0x2a,0x57,0x12,0x1e,0x38,0x12,0x24,0xbb,0x12,0x1e,0x38,0x12, +0x77,0x1a,0x12,0x1e,0x38,0x2, 0x1c,0x68,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c, +0xdd,0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x21,0x7e,0x8, 0x35,0xe5,0x12, +0x17,0x29,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18, +0x26,0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x17,0x29,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0xa1, +0x3c,0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9, +0x9, 0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x1f,0xd4,0x60,0x36, +0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75, +0x36,0x22,0x12,0x1f,0xf4,0x7d,0x13,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, +0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x21,0x12,0x1f,0xf4,0x2d,0x13,0xbd,0xc1, +0x28,0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68, +0x39,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x1e, +0x80,0xbe,0x37,0x2a,0x79,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34, +0x74,0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71, +0x74,0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe4, +0xbc,0x7e,0x28,0x2, 0x81,0xa1,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c, +0x99,0x80,0x3c,0x7c,0xb9,0x12,0x1f,0xd4,0x60,0x33,0x12,0xa9,0x23,0xbe,0xb0,0xff, +0x68,0x2b,0x9, 0x73,0x1f,0x35,0x12,0x2e,0xc8,0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54, +0x0, 0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, +0x12,0xa9,0x23,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc, +0xf9,0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19, +0x75,0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19, +0xa3,0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0xbe,0xe0,0xa, 0x40,0x8e,0x90,0x60,0x9a,0xe4, +0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e,0x8, 0x1f,0x34, +0x12,0x17,0x29,0x1b,0xfd,0x7c,0xfd,0x7e,0x8, 0x36,0x21,0x7e,0x34,0x0, 0x14,0x74, +0xff,0x12,0x17,0x4e,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e, +0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x17,0x29,0x1b,0xfd,0xa, 0x3f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x21,0x12,0x17,0x29,0x1b,0xfd,0x6c, +0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0x49,0xb, 0xe0,0xbc,0xfe,0x38,0xf5,0x7a,0xf3, +0x35,0xe4,0x7a,0xf3,0x28,0x84,0x7e,0x73,0x28,0x84,0xbe,0x70,0xa, 0x28,0x6, 0x74, +0xa, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x31, +0x7c,0xbe,0x12,0x1f,0xd4,0x60,0x28,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac,0x7e,0x2e, +0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa,0x6d,0x0, +0x12,0x17,0x29,0x1b,0xfd,0x7c,0xbf,0x7e,0x70,0x1, 0x12,0x2f,0x4c,0xb, 0xf0,0xb, +0xe0,0x12,0x77,0xc0,0x38,0xca,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7e,0x71,0x24, +0x12,0x2e,0xc8,0xb, 0x1a,0x30,0x22,0xca,0x3b,0x6d,0xee,0x7e,0xc3,0x2a,0x8d,0x7e, +0xd3,0x2a,0x8c,0x7e,0xb3,0x37,0x2e,0xb4,0x1, 0x3, 0xe4,0xe1,0xb8,0x7e,0xb3,0x28, +0x84,0x70,0x2, 0xe1,0x24,0x7e,0xb3,0x2a,0x21,0x60,0x2, 0x80,0x77,0x7e,0xa3,0x26, +0xfa,0x7e,0x73,0x26,0xfb,0x7a,0x71,0x24,0x6c,0xee,0x6d,0xff,0x6c,0xff,0xa, 0x47, +0x80,0x1c,0x12,0x1f,0xc8,0x8, 0x1d,0xb, 0xe0,0xbe,0xa0,0x0, 0x28,0x6, 0x7c,0xba, +0x14,0x12,0x1f,0xbe,0x12,0xa9,0x37,0x58,0x3, 0x12,0x1f,0xbb,0x1b,0x44,0xbe,0x44, +0x0, 0x0, 0x58,0xde,0xe5,0x24,0xa, 0x4b,0x80,0x1a,0x12,0x1f,0xc8,0x8, 0x21,0xb, +0xe0,0xbe,0xa0,0x0, 0x28,0x6, 0x7c,0xba,0x14,0x12,0x1f,0xbe,0x12,0xa9,0x37,0x58, +0x3, 0x12,0x1f,0xbb,0x7d,0x24,0xb, 0x24,0x7d,0x42,0xa, 0x3c,0xbd,0x23,0x48,0xda, +0xbe,0xe0,0x3, 0x50,0x2, 0x80,0xd, 0xa, 0x2f,0x7d,0x3f,0x12,0x15,0x29,0xbe,0x34, +0x0, 0x28,0x8, 0x7, 0xe4,0x7a,0xb3,0x35,0x3b,0xe1,0xb8,0x6d,0xdd,0xbe,0xa0,0x0, +0x28,0x8, 0x7c,0xba,0x14,0x12,0x1e,0x7d,0x2d,0xd3,0xa, 0x3d,0x1b,0x34,0xa, 0xca, +0xbd,0xc3,0x58,0xb, 0x7c,0xba,0x4, 0x7e,0x71,0x24,0x12,0x1e,0x80,0x2d,0xd3,0x7e, +0x70,0x8, 0x80,0x2a,0x7e,0x50,0x2, 0xac,0x57,0x7d,0xc2,0x2e,0xc4,0x17,0x60,0x7d, +0x1c,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0x1a,0xcb,0xbd,0xcd,0x8, 0xf, 0x7d, +0xc2,0x2e,0xc4,0x17,0x61,0x7d,0x2c,0x12,0x2f,0x8f,0x1a,0xcb,0x2d,0xec,0x7c,0x67, +0x1b,0x70,0xa5,0xbe,0x0, 0xce,0x7c,0xba,0x12,0x1e,0x7d,0x12,0x17,0x80,0xbe,0x34, +0xa, 0xf0,0x8, 0x4, 0x2e,0xe4,0x0, 0x28,0xbe,0xe4,0x0, 0xfa,0x28,0x4, 0x7e,0xe4, +0x0, 0xfa,0x7e,0xb3,0x35,0x3b,0xa, 0x3b,0xbd,0x3e,0x50,0x8, 0x7d,0x3e,0x7c,0xb7, +0x7a,0xb3,0x35,0x3b,0x7e,0xb3,0x35,0x3b,0xda,0x3b,0x22,0x7c,0xba,0x4, 0x7c,0x79, +0x12,0x1e,0x80,0x2d,0xf3,0xb, 0xf0,0x22,0x7c,0xba,0x7c,0x79,0x12,0x1e,0x80,0xbe, +0x34,0x0, 0x96,0x22,0x7c,0x7b,0x12,0x56,0xc9,0x9, 0xa2,0x27,0x72,0x7c,0xb7,0x54, +0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x7b,0xcc,0x5c,0xba,0x22,0x7e,0x34,0x3, +0xe8,0x2, 0x1a,0x0, 0xa, 0x37,0x9d,0x32,0x2, 0x17,0x80,0x12,0x4a,0x17,0x12,0x59, +0xe8,0x12,0x20,0x1d,0x12,0x19,0x45,0x7e,0xb3,0x37,0x5, 0x24,0xfd,0x68,0x9, 0xb, +0xb1,0x78,0xf4,0x12,0x25,0xf8,0x80,0xef,0x12,0x1b,0xbd,0x80,0xea,0x12,0x58,0xfa, +0x12,0x50,0x80,0x12,0x0, 0x42,0x12,0x57,0x8a,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, +0xf8,0x7e,0xf, 0x6, 0xf8,0x7e,0x1f,0x6, 0xf4,0x12,0x62,0xbc,0x7e,0x18,0x8, 0xa, +0x7a,0x1f,0x13,0x86,0x7e,0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a, +0x7e,0x1f,0x13,0x86,0x12,0x5a,0xd5,0x12,0x0, 0x46,0x12,0x25,0xb3,0x12,0x5a,0x54, +0x12,0x25,0x4b,0x2, 0x20,0x66,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a, +0xb3,0x34,0x3a,0x22,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x28,0x95,0x7e,0x34,0x2, 0x26, +0x7a,0x37,0x28,0x99,0x7e,0x34,0x0, 0x96,0x7a,0x37,0x28,0x97,0x7a,0x37,0x28,0x9b, +0x7e,0x34,0x0, 0x50,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x0, 0x27,0x7a,0x37,0x28,0x9f, +0x12,0xa8,0xb4,0x74,0x1, 0x7a,0xb3,0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x20, +0xbb,0x3e,0x34,0x7e,0x8, 0x25,0xf7,0xe4,0x2, 0x17,0x4e,0x90,0x60,0x9a,0x93,0xa, +0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3,0x2a,0x8e,0xf5,0x40,0x7e, +0xb3,0x2a,0x8f,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a,0xb3,0x38,0x4e,0x7a,0xb3, +0x38,0x4c,0x7a,0xb3,0x38,0x4d,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xbb,0xe4,0x12,0x17, +0x4e,0x12,0x20,0xbb,0x3e,0x34,0x7e,0x8, 0x38,0x4f,0xe4,0x12,0x17,0x4e,0xbe,0xd0, +0x2, 0x50,0x2, 0x81,0x20,0x6c,0xcc,0x81,0xf, 0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3, +0x26,0xfa,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c, +0x9, 0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34, +0x7c,0xbd,0x14,0xbc,0xbc,0x78,0x2, 0x81,0x15,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0x81, +0x6, 0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, +0xb3,0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x24,0x23,0x7c,0xb7,0xf5,0x28, +0xe5,0x27,0xa, 0x2b,0xe5,0x25,0x12,0x24,0x23,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe, +0xb0,0x5, 0x40,0x2, 0x81,0x4, 0xe5,0x29,0xbe,0xb0,0x5, 0x40,0x2, 0x81,0x4, 0x85, +0x25,0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33, +0xe5,0x24,0x12,0x99,0xc5,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e, +0x71,0x25,0x12,0x1e,0x80,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x1e,0x80, +0x7a,0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83, +0x80,0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38, +0x2b,0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e, +0x71,0x25,0x12,0x1e,0x80,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x1e,0x80,0x2d, +0x34,0xbd,0x38,0x18,0x2, 0x61,0x9b,0x75,0x30,0x1, 0x61,0x9b,0xe5,0x28,0xbe,0xb0, +0x1, 0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0x61,0x9b,0xe5,0x28,0xbe,0xb0, +0x5, 0x40,0x2, 0x61,0x9b,0xe5,0x29,0xbe,0xb0,0x5, 0x40,0x2, 0x61,0x9b,0x7c,0xbf, +0x20,0xe0,0x2, 0x61,0x9b,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26, +0xbe,0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe, +0xb1,0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1, +0x25,0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25, +0x50,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78, +0x29,0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2, +0x5, 0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24, +0xe5,0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78, +0x29,0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2, +0x5, 0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24, +0xe5,0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85, +0x2b,0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x1e,0x80,0x7a,0x35,0x3e,0xe5, +0x2a,0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe, +0xb1,0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93, +0x5, 0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0, +0x5, 0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c, +0x50,0xad,0xe5,0x2c,0x12,0x24,0x33,0xe5,0x2a,0x12,0x24,0x2a,0xe5,0x2a,0x12,0x24, +0x33,0xe5,0x2c,0x12,0x24,0x2a,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20, +0x5, 0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x42,0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a, +0x2, 0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x15,0x5b,0xe5,0x42,0xa, +0x1b,0x6d,0x0, 0x12,0x15,0x5b,0x7f,0x21,0x12,0x91,0x79,0x7e,0x14,0x0, 0x28,0x12, +0x15,0x6c,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23,0x3e,0x24, +0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe,0xb0,0x0, +0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x38,0x4b,0x7e,0x39,0xb0,0x4, 0x7a,0x39, +0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, 0x2c,0x9, +0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f,0x34,0xf5, +0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, 0x33,0x1f, +0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, 0xc, 0x9, +0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, 0x2f,0xbe, +0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x21,0x41,0xb, 0xc0,0xbc, +0xdc,0x28,0x2, 0x21,0x9, 0x7e,0x8, 0x1f,0x34,0x12,0x98,0xf2,0x7a,0xb3,0x38,0x4e, +0xda,0x3b,0x22,0xa, 0x3b,0x9d,0x32,0x2, 0x17,0x80,0x7e,0x71,0x2d,0x12,0x1e,0x80, +0x9d,0x93,0x22,0x7e,0x71,0x2b,0x12,0x1e,0x80,0x9d,0x93,0x22,0x7e,0x30,0x64,0x7e, +0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80,0x42,0x7e,0x70, +0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x25,0x43,0x9, 0xb3,0x26,0xfa,0x12,0x24, +0x23,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12,0x25,0x43,0x9, +0xb3,0x26,0xfb,0x12,0x24,0x23,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, 0xbc,0x39,0x28, +0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c,0x28,0xb, 0x0, +0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28,0x84,0xbc,0xb1, +0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c,0x22,0xbc,0x23, +0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xca,0x79,0xc2,0x3, 0x7e, +0xf0,0x3, 0x7e,0xe3,0x2a,0x21,0x12,0xa8,0xf8,0x28,0x72,0x7c,0xbf,0x12,0x20,0xc2, +0x4c,0xee,0x68,0xe, 0x7e,0x63,0x38,0x4c,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x38,0x4d, +0x70,0x4, 0xd2,0x3, 0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x5f,0xbe,0xb0,0x8, +0x28,0x4, 0xd2,0x3, 0x80,0x1e,0xd2,0x3, 0x12,0x77,0xc0,0x78,0xa, 0xa5,0xbe,0x0, +0x6, 0x6c,0xff,0xc2,0x3, 0x80,0xd, 0x9e,0x73,0x38,0x4c,0xbc,0x7e,0x78,0x5, 0x7e, +0xf0,0x2, 0xc2,0x3, 0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x20,0xc2,0x7e,0xa3,0x38,0x4e, +0x7a,0xa3,0x28,0x84,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x38,0x4f,0x7e,0x8, 0x26, +0xfa,0x12,0x17,0x29,0x1b,0xfd,0x12,0x24,0x3c,0xf5,0x5f,0x80,0x3, 0x75,0x5f,0x64, +0xda,0x79,0x22,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x8, 0x28,0xae,0x7e, +0x34,0x1, 0xe, 0x74,0xff,0x12,0x17,0x4e,0x12,0x8a,0x68,0x7e,0x8, 0x29,0xbc,0x12, +0x25,0x6e,0x7e,0x8, 0x2a,0x20,0x7e,0x34,0x0, 0xb, 0xe4,0x2, 0x17,0x4e,0x6c,0xaa, +0x74,0x3, 0x12,0x7f,0x86,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0xa, 0x12,0x25,0xa9, +0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79,0x41,0x0, 0x28,0xe4,0xa, +0x4a,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0x46,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, +0x50,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xc8,0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, +0xac,0x7a,0x22,0x74,0xa, 0x7a,0xb3,0x2a,0x6c,0x74,0x10,0x7a,0xb3,0x2a,0x6d,0x12, +0x57,0x79,0x7a,0x37,0x2a,0x74,0x74,0x1e,0x7a,0xb3,0x2a,0x78,0x12,0x57,0xa5,0x7e, +0x34,0x0, 0x96,0x7a,0x37,0x2a,0x7f,0xe4,0x7a,0xb3,0x2a,0x83,0x74,0x4, 0x7a,0xb3, +0x2a,0x84,0x7e,0x34,0x0, 0x64,0x7a,0x37,0x2a,0x85,0x7e,0x34,0xa, 0x0, 0x7a,0x37, +0x2a,0x81,0xe4,0x7a,0xb3,0x16,0x92,0x22,0x12,0x1a,0x84,0x12,0x65,0x8a,0x7e,0xb3, +0x37,0x5, 0xb4,0x1, 0x64,0x12,0x9f,0x30,0x12,0xa9,0x6c,0x12,0x7b,0x77,0x12,0x26, +0x9b,0x12,0x1a,0xaf,0x50,0xe5,0x12,0x2e,0xde,0x12,0x54,0xb7,0x7e,0xb3,0x37,0x2, +0xb4,0x1, 0x4, 0xe4,0x12,0x26,0x7b,0x12,0x57,0x4, 0x12,0x90,0x60,0x12,0x26,0x83, +0x40,0xc9,0x12,0x5e,0x84,0x12,0x26,0x83,0x40,0xc1,0x12,0x87,0xc0,0x12,0x1c,0x44, +0x12,0x0, 0x66,0x12,0x5f,0xfd,0x12,0x83,0xa7,0x12,0x6e,0x97,0x12,0x85,0xbc,0x12, +0x6a,0xa2,0x12,0x87,0xba,0x12,0x6d,0xde,0x12,0xa3,0x56,0x12,0x67,0xc3,0x12,0x49, +0xb0,0x12,0x7b,0x57,0x12,0x49,0x59,0x80,0x92,0x12,0x5f,0xf4,0x2, 0x26,0x6f,0x7e, +0xb3,0x37,0x2, 0xb4,0x1, 0x4, 0xe4,0x2, 0x26,0x7b,0x22,0x70,0x3, 0xd2,0x86,0x22, +0xc2,0x86,0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91,0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70, +0x7, 0x12,0xa8,0xf8,0x28,0x2, 0xd2,0x3, 0xa2,0x3, 0x22,0x7e,0x34,0x36,0xde,0x30, +0xd, 0x47,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x26,0xea,0x7a,0x27,0x2a,0x6e,0x9, +0x53,0x0, 0x3, 0x12,0x26,0xea,0x7a,0x27,0x2a,0x70,0x9, 0x53,0x0, 0x4, 0x12,0x26, +0xea,0x7a,0x27,0x2a,0x72,0x7e,0x39,0x50,0x12,0x26,0xf5,0x7a,0x27,0x2a,0x79,0x9, +0x53,0x0, 0x1, 0x12,0x26,0xf5,0x7a,0x27,0x2a,0x7b,0x9, 0x73,0x0, 0x5, 0xa, 0x37, +0x12,0xa9,0x1c,0x3e,0x34,0x7a,0x37,0x2a,0x81,0x22,0xa, 0x25,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x22,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x25,0xe4, +0x7a,0xb3,0x2a,0x27,0x7a,0xb3,0x2a,0x28,0x2, 0x8a,0x74,0xa5,0xbe,0x0, 0x1b,0x6c, +0xaa,0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, 0xa0,0xbe, +0xa0,0xa, 0x78,0xf0,0x74,0x1, 0x7a,0xb3,0x2a,0x24,0x6c,0xaa,0x80,0x26,0x7e,0x30, +0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x26,0xec,0x1b,0x18,0x20, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x26,0xec,0x1b, +0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0xca,0x3b,0x75,0x28,0x0, 0x7e,0xb3, +0x2a,0x8e,0xf5,0x2a,0x7e,0xb3,0x2a,0x8f,0xf5,0x2b,0x75,0x25,0x0, 0x7e,0xb3,0x16, +0x91,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x29,0xba,0x6c,0xdd,0x2, 0x29,0xa9,0x7e,0x70, +0x2, 0xac,0x7d,0x9, 0xb3,0x26,0xfa,0xf5,0x29,0x9, 0xc3,0x26,0xfb,0x75,0x26,0x2, +0x75,0x27,0x2, 0x7c,0xbd,0x12,0x2d,0x8d,0xd2,0x3, 0x12,0x2f,0xa, 0x7e,0xb3,0x36, +0xe9,0xb4,0x1, 0x1e,0x7e,0xb3,0x2a,0x21,0xb4,0x1, 0x17,0x7e,0xb3,0x28,0x84,0xb4, +0x1, 0x10,0x7e,0x37,0x28,0x86,0xbe,0x34,0x0, 0xa, 0x40,0x6, 0x75,0x26,0x3, 0x75, +0x27,0x3, 0xe5,0x29,0x60,0x5, 0x12,0xa8,0xeb,0x48,0x3, 0x75,0x26,0x1, 0x4c,0xcc, +0x68,0xc, 0xe5,0x2b,0xa, 0x2b,0x1b,0x24,0xa, 0x3c,0xbd,0x32,0x48,0x3, 0x75,0x27, +0x1, 0x75,0x25,0x0, 0x75,0x24,0x0, 0x80,0x55,0xe5,0x24,0xbc,0xbd,0x68,0x4d,0x12, +0x8c,0x91,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x2c,0x9, 0xb3,0x26,0xfb,0xf5,0x2d,0xa, +0x2a,0xe5,0x29,0x12,0x24,0x23,0xbe,0x34,0x0, 0x4, 0x18,0x30,0xe5,0x2d,0xa, 0x2b, +0xa, 0x3c,0x9d,0x32,0x12,0x17,0x80,0xbe,0x34,0x0, 0x4, 0x18,0x1f,0x12,0x29,0xbd, +0x40,0xa, 0xe5,0x2c,0x7e,0x71,0x2d,0x12,0x29,0xf6,0x50,0x5, 0x75,0x25,0x0, 0x80, +0x3, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x75,0x27,0x1, 0x80,0x7, 0x5, 0x24,0x12,0x8e, +0xc2,0x38,0xa6,0x12,0x29,0xbd,0x50,0xb, 0x12,0x2a,0x24,0x75,0x26,0x0, 0x75,0x27, +0x0, 0x80,0xb, 0x12,0x8a,0x65,0x50,0x6, 0x75,0x26,0x3, 0x75,0x27,0x3, 0xe5,0x25, +0x70,0x2, 0x21,0x62,0x6c,0xff,0x6c,0xee,0x12,0x29,0xd9,0x18,0x15,0xe5,0x2a,0xa, +0x5b,0xbd,0x35,0x48,0xd, 0x12,0x29,0xce,0x18,0x8, 0xe5,0x2b,0xa, 0x5b,0xbd,0x35, +0x58,0x3, 0x12,0x29,0xff,0xb, 0xe0,0xbe,0xe0,0x3, 0x78,0xdc,0xb, 0xf0,0xbe,0xf0, +0x3, 0x78,0xd3,0x7e,0xa1,0x2b,0x1b,0xa0,0xbc,0xac,0x68,0x6, 0x4c,0xcc,0x68,0x2, +0x21,0x62,0xe5,0x29,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x62,0x12,0xa8,0xeb,0x48,0x2, +0x21,0x62,0x7e,0x18,0x0, 0x64,0x7a,0x1d,0x41,0x4c,0xcc,0x78,0x5, 0x75,0x40,0x2, +0x80,0x7, 0xbc,0xac,0x78,0x3, 0x75,0x40,0x0, 0x6c,0xff,0x7e,0xa1,0x40,0x3e,0xa0, +0x7e,0x90,0x6, 0xac,0x9f,0x7c,0xb9,0x2c,0xba,0x24,0x2e,0x12,0x29,0xc4,0x7e,0x14, +0x0, 0x64,0x12,0x15,0x6c,0x7c,0xb9,0x24,0x30,0xa, 0x1b,0xb, 0x18,0x10,0x1a,0x2, +0x1a,0x0, 0x12,0x15,0xc8,0x7e,0xd, 0x41,0xbf,0x10,0x58,0x3, 0x7a,0x1d,0x41,0xb, +0xf0,0xbe,0xf0,0x3, 0x78,0xc5,0x7e,0x1d,0x41,0xbe,0x18,0x0, 0x0, 0x58,0x7, 0x7e, +0x18,0x0, 0x1, 0x7a,0x1d,0x41,0x6c,0xff,0x74,0x6, 0xac,0xbf,0x24,0x30,0x12,0x29, +0xc4,0x7e,0xd, 0x41,0x12,0x15,0x5b,0x7e,0x8, 0x0, 0x64,0x12,0x15,0xc8,0x7d,0x43, +0xe5,0x29,0xa, 0x3b,0x1b,0x34,0xa, 0x5f,0x2d,0x53,0xa, 0x2c,0x1b,0x24,0x7e,0xa1, +0x40,0xa, 0x3a,0x2d,0x32,0x12,0x2e,0xc8,0x1b,0x1a,0x40,0xb, 0xf0,0xbe,0xf0,0x3, +0x78,0xc6,0xe5,0x26,0x7e,0x71,0x27,0x7c,0x6d,0x7e,0x51,0x28,0x12,0x2a,0xec,0xe5, +0x25,0x60,0x2f,0x6c,0xff,0x6c,0xee,0x12,0x29,0xd9,0x18,0x15,0xe5,0x2a,0xa, 0x5b, +0xbd,0x35,0x48,0xd, 0x12,0x29,0xce,0x18,0x8, 0xe5,0x2b,0xa, 0x5b,0xbd,0x35,0x58, +0x3, 0x12,0x29,0xff,0xb, 0xe0,0xbe,0xe0,0x3, 0x78,0xdc,0xb, 0xf0,0xbe,0xf0,0x3, +0x78,0xd3,0x12,0x2a,0x24,0x5, 0x28,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x28, +0x3, 0x2, 0x27,0x8e,0xe5,0x28,0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xe5,0x29,0x7c, +0x7c,0x2, 0x29,0xf6,0xa, 0x3b,0xb, 0x38,0x30,0x1a,0x26,0x1a,0x24,0x22,0xa, 0x2e, +0xa, 0x3c,0x2d,0x32,0xbe,0x34,0x0, 0x1, 0x22,0xa, 0x3f,0xe5,0x29,0xa, 0x4b,0x2d, +0x34,0xbe,0x34,0x0, 0x1, 0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35, +0x26,0xfb,0x7c,0xb2,0x7c,0x73,0x7c,0xb7,0xb4,0x17,0x2, 0xd3,0x22,0xc3,0x22,0x1b, +0x44,0xa, 0x5f,0x2d,0x54,0xa, 0x2c,0x1b,0x24,0xa, 0x3e,0x2d,0x32,0x12,0x1e,0x80, +0x7d,0x23,0x7c,0x7e,0x3e,0x70,0x74,0x6, 0xac,0xbf,0x2c,0xb7,0x24,0x2e,0xa, 0x3b, +0x1b,0x38,0x20,0x22,0x6c,0x33,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x2e,0x9f,0x50, +0x1b,0x7c,0xb2,0x12,0x2d,0x82,0x7d,0x3, 0x12,0x2f,0x41,0x49,0x55,0x38,0xe4,0x7d, +0x40,0x3e,0x44,0x7e,0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73, +0x2a,0x94,0xbc,0x72,0x38,0xd4,0x22,0x6c,0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12, +0x1f,0xd4,0x60,0xa, 0x12,0x29,0xe6,0x40,0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10, +0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5,0x7c,0xb0,0x6c,0x77,0x12,0x2a,0xb1,0xbe, +0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70,0x1, 0x12,0x2a,0xb1,0xb4,0x1, 0x21,0x6c, +0x11,0x80,0x15,0x7c,0xb1,0x12,0x1f,0xd4,0x60,0xc, 0x12,0x29,0xe6,0x50,0x7, 0x7c, +0xb1,0x6c,0x77,0x12,0x2f,0x4c,0xb, 0x10,0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3, +0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e,0xb3,0x36,0x5d,0x7a,0xb3,0x36,0x5e,0x7a, +0xa3,0x36,0x5d,0x7e,0xb3,0x36,0x5e,0x60,0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28, +0x84,0x70,0xb, 0x7e,0xb3,0x36,0x5f,0x60,0x5, 0x14,0x7a,0xb3,0x36,0x5f,0x7e,0x73, +0x36,0x5f,0xbe,0x70,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0x3b,0x7c,0xc4, +0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x74,0x9, 0xac,0xb5,0x7d,0x95,0x2e,0x94,0x27,0x76, +0x6d,0x88,0x7e,0xe7,0x2a,0x85,0xe4,0x39,0xb4,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7f, +0x9, 0xb3,0x26,0xfa,0xf5,0x4e,0x9, 0xb3,0x26,0xfb,0xf5,0x4f,0x7e,0x73,0x2a,0x8d, +0x7c,0x6e,0x7e,0x8, 0x0, 0x52,0x12,0x2d,0x2f,0xf5,0x50,0xe5,0x4e,0x7e,0x73,0x2a, +0x8c,0x7c,0x6d,0x7e,0x8, 0x0, 0x51,0x12,0x2d,0x2f,0x7c,0xab,0xe5,0x51,0x7e,0x71, +0x52,0x12,0x2e,0xc8,0x7d,0xf3,0x7a,0xf5,0x5a,0x7e,0xf4,0x15,0x9e,0x7a,0xf5,0x5c, +0x85,0x51,0x54,0x85,0x52,0x55,0x7a,0xa1,0x56,0x85,0x50,0x57,0x7e,0xb3,0x2a,0x78, +0xf5,0x58,0x75,0x59,0x0, 0xbe,0xc0,0x1, 0x78,0x8, 0xe5,0x58,0x1e,0xb0,0x1e,0xb0, +0xf5,0x58,0x7e,0x8, 0x0, 0x54,0x12,0x78,0x71,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15, +0xa0,0x6d,0xaa,0x2f,0x51,0x7e,0x37,0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e, +0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d,0x45,0x7e,0x37,0x15,0xa6,0x6d,0x22,0x7d,0x3, +0x7e,0x37,0x15,0xa8,0x2f,0x10,0x7a,0x1d,0x49,0x7f,0x65,0xa, 0x3d,0xe5,0x4e,0xa, +0xfb,0x9d,0xf3,0x7d,0x3f,0x7c,0xc7,0x81,0x91,0xa, 0x4e,0xe5,0x4f,0xa, 0x5b,0x9d, +0x54,0xf5,0x4d,0x81,0x7b,0xbe,0xc0,0x0, 0x58,0x2, 0x81,0x79,0x7e,0x73,0x2a,0x8c, +0xbc,0x7c,0x18,0x2, 0x81,0x79,0xe5,0x4d,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0x79,0x7e, +0x73,0x2a,0x8d,0xbe,0x71,0x4d,0x18,0x2, 0x81,0x79,0x7c,0xbc,0x7e,0x71,0x4d,0x12, +0x1e,0x80,0x7e,0x53,0x2a,0x78,0xa, 0x25,0x7d,0xf3,0x9d,0xf2,0xbe,0xf4,0x0, 0x0, +0x8, 0x77,0xbd,0xef,0x18,0xd, 0x7f,0x14,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x4e,0xa, 0x2b,0x1a,0x3c,0x12,0x2d,0x16,0x18,0xd, 0xe5,0x4f, +0xa, 0x2b,0xe5,0x4d,0x1a,0x3b,0x12,0x2d,0x16,0x8, 0x4e,0x7c,0xbc,0x7e,0x71,0x4d, +0x7c,0x6f,0x12,0x9f,0x65,0xf5,0x53,0xb4,0x2, 0x6, 0x7d,0x3f,0xe, 0x34,0x9d,0xf3, +0xe5,0x53,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x53,0xb4,0x1, 0x2d,0x12,0x2d,0x7, 0x1a, +0x1c,0x12,0x2d,0xe, 0x7e,0x1d,0x45,0x9f,0x10,0x7a,0x1d,0x45,0x12,0x2d,0x7, 0xe5, +0x4d,0x1a,0x1b,0x12,0x2d,0xe, 0x7e,0x1d,0x49,0x9f,0x10,0x7a,0x1d,0x49,0x12,0x2d, +0x7, 0x9f,0x51,0x1a,0x26,0x1a,0x24,0x9f,0x61,0x5, 0x4d,0xa, 0x2e,0xe5,0x4f,0xa, +0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x4d,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xc5,0xb, +0xc0,0xa, 0x2d,0xe5,0x4e,0xa, 0x3b,0x2d,0x32,0x1a,0x37,0x1a,0xfc,0xbd,0xf3,0x18, +0x2, 0x61,0xb9,0xbe,0x58,0x0, 0x0, 0x78,0x2, 0xb, 0x5c,0xbe,0x68,0x0, 0x0, 0x78, +0x2, 0xb, 0x6c,0x7e,0x1d,0x45,0x7f,0x5, 0x12,0x2d,0x20,0x1b,0x4a,0x30,0x7e,0x1d, +0x49,0x7f,0x6, 0x12,0x2d,0x20,0x79,0x34,0x0, 0x2, 0x7e,0xb3,0x2a,0x84,0x60,0xd, +0x1e,0xd4,0x1e,0xc4,0x50,0x4, 0x4e,0xd4,0x80,0x0, 0x14,0x78,0xf3,0xbe,0x68,0x0, +0x7f,0x28,0x4, 0x7e,0x68,0x0, 0x7f,0x7d,0x3d,0x39,0x74,0x0, 0x5, 0x74,0x9, 0xac, +0xbf,0x9, 0x75,0x27,0x7c,0x39,0x74,0x0, 0x6, 0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, +0x39,0xb4,0x0, 0x6, 0xda,0x3b,0x22,0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x22,0x1a,0x2, +0x12,0x15,0x5b,0x7f,0x1, 0x22,0x9d,0x32,0x12,0x17,0x80,0xbe,0x34,0x0, 0x1, 0x22, +0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x15,0x77,0x2e,0x18,0x0, 0x20,0x22,0xca, +0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34,0x7c, +0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39,0xbd, +0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39,0xa, +0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d,0x53, +0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba,0xda, +0xf8,0x22,0x7e,0x73,0x2a,0x8d,0xac,0x7b,0x2e,0x34,0x0, 0x17,0x22,0xca,0x79,0x7c, +0x5b,0x7e,0x43,0x28,0x84,0xbe,0x40,0x1, 0x28,0x2, 0xc1,0x9c,0x7e,0xa3,0x2a,0x8d, +0x7e,0x70,0x2, 0xac,0x75,0x9, 0xf3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7c,0xbf,0x7c, +0x7e,0x12,0x2e,0xc8,0x7f,0x51,0x7c,0x1e,0x7c,0x3f,0x7e,0x3, 0x2a,0x8f,0x7e,0x23, +0x2a,0x8e,0xa, 0x3a,0x6d,0xdd,0x9d,0xd3,0xa, 0x9a,0xa, 0xc0,0x1b,0xc5,0xa, 0x51, +0xbd,0x5c,0x58,0x2, 0xc1,0x9c,0xa, 0x53,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48,0x55, +0x7c,0xb3,0x14,0x12,0x2e,0x9f,0x50,0x4d,0x7c,0xb3,0x14,0x12,0x2d,0x82,0x7d,0xe3, +0x7d,0x5e,0x12,0x2e,0xbb,0xb, 0x1a,0xf0,0x7d,0x5d,0x3e,0x54,0x7f,0x15,0x2d,0x35, +0xb, 0x1a,0x80,0xbe,0xf4,0x0, 0x0, 0x8, 0x11,0x9d,0x8f,0xbe,0x84,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x58,0x1b,0x1a,0x50,0x7c,0xb0,0x24,0xfe,0xbc,0xb1, +0x78,0x13,0x7d,0x4e,0x1b,0x44,0x7d,0x54,0x12,0x2e,0xbb,0xb, 0x1a,0x50,0xbd,0x58, +0x8, 0x3, 0x1b,0x1a,0x80,0xa, 0x83,0xb, 0x84,0xa, 0x52,0xbd,0x85,0x58,0x5d,0x7c, +0xb3,0x4, 0x12,0x2e,0x9f,0x50,0x55,0x7c,0xb3,0x4, 0x12,0x2d,0x82,0x7d,0xe3,0x7d, +0x1e,0x3e,0x14,0x7e,0x1f,0x13,0x8a,0x7f,0x61,0x2d,0xd1,0xb, 0x6a,0xf0,0x7d,0x19, +0x3e,0x14,0x7f,0x65,0x2d,0xd1,0xb, 0x6a,0x10,0xbe,0xf4,0x0, 0x0, 0x8, 0x11,0x9d, +0x1f,0xbe,0x14,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x51,0x1b,0x6a,0x50, +0x7c,0xb0,0x24,0xfe,0xbc,0xb1,0x78,0x14,0x7d,0x4e,0x1b,0x44,0x7d,0x4, 0x3e,0x4, +0x2d,0x30,0xb, 0x1a,0x0, 0xbd,0x1, 0x8, 0x3, 0x1b,0x1a,0x10,0xda,0x79,0x22,0x7c, +0xab,0x6c,0x77,0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x2f,0x8f,0xbc,0xba,0x78,0x2, +0xd3,0x22,0xb, 0x70,0xbe,0x70,0x3, 0x40,0xea,0xc3,0x22,0x3e,0x54,0x7e,0x1f,0x13, +0x8a,0x2d,0x35,0x22,0x7c,0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x8d,0xac,0x1b,0x3e,0x4, +0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0x6c,0x33, +0x80,0x1f,0x7c,0xb3,0x12,0x2e,0x9f,0x40,0x16,0x7c,0xb3,0x12,0x2d,0x82,0x7d,0x43, +0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x1b,0x1a,0x50,0xb, +0x30,0x7e,0x23,0x2a,0x94,0xbc,0x23,0x38,0xd9,0x22,0x6c,0x33,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x2e,0x9f,0x50,0x1f,0x7c,0xb2,0x12,0x2d,0x82,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x2f,0x41,0x59,0x35,0x38,0xe4,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x94,0xbc,0x72,0x38,0xd0, +0x22,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x7e,0x70,0x1, 0x7c,0x67,0x7c,0x7b, +0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e,0x24,0x0, 0x5e, +0x12,0x2f,0x8f,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e, +0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff,0xa, 0x2a,0x2e,0x24, +0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0x2e,0x24,0x16,0xe3,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34, +0xa0,0x6c,0x33,0x80,0x3d,0x7e,0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10, +0x1, 0x6c,0x0, 0x80,0x27,0xbc,0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93, +0x26,0xfb,0xa, 0x29,0xa, 0x32,0x12,0x2d,0x16,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, +0x40,0x8, 0x74,0x2, 0x7a,0xb3,0x34,0xa0,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5, +0xb, 0x30,0xbc,0xa3,0x38,0xbf,0x2, 0x2f,0xe9,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c, +0x22,0x80,0x45,0x74,0x2, 0xac,0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e, +0xa0,0x1, 0x6c,0x99,0x80,0x2c,0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, +0x83,0x26,0xfa,0x9, 0xf3,0x26,0xfb,0xa, 0x28,0xa, 0x31,0x12,0x2d,0x16,0x18,0xb, +0xa, 0x2f,0xa, 0x30,0x12,0x2d,0x16,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, +0xb, 0x90,0xbc,0x39,0x38,0xd0,0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3a, +0xbe,0xb0,0x0, 0x28,0x12,0x14,0x7a,0xb3,0x35,0x3a,0xbe,0xb0,0x14,0x28,0x8, 0x7e, +0x34,0x0, 0x8c,0x7a,0x37,0x2a,0x79,0x7e,0xb3,0x36,0xe9,0x70,0x58,0x7e,0xb3,0x39, +0x6, 0x70,0x52,0x7e,0xb3,0x36,0x6d,0x70,0x4c,0x7e,0x37,0x38,0xb, 0xbe,0x34,0x0, +0x14,0x50,0x42,0x7e,0x37,0x28,0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28, +0x84,0xbe,0xb0,0x3, 0x40,0x2f,0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe, +0xb0,0x3, 0x50,0x9, 0x7e,0xb3,0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26, +0xf6,0xbe,0xb0,0x8, 0x50,0x9, 0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74, +0x1e,0x7a,0xb3,0x35,0x3a,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe,0xa0,0x34,0x38, +0x2, 0x21,0xc9,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x2f,0x41,0xdf,0xbe,0xa0, +0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0x8, 0x2e,0x37,0x31,0xed,0x7e,0x39,0xb0,0xbe,0xa0,0x37,0x68,0x2, 0x41,0xdf, +0x75,0x1a,0x36,0x41,0xdf,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0,0x39,0x78,0x1b,0x7e, +0xf3,0x37,0xce,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xce,0xbe,0xa0,0x39,0x78,0x3, 0x75, +0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x40,0x41,0xdf,0xbe,0xa0,0x3a,0x68,0x5, 0xbe, +0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xd0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xd0,0xbe, +0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b,0x63,0x41,0xdf,0xbe, +0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x31,0x41,0xdf,0xbe,0xa0,0x5e,0x78,0x26,0x7e, +0xf, 0x33,0xdf,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e, +0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, 0x3, 0x7c,0xa7,0x4c, +0xba,0x44,0x80,0x41,0xdf,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0,0x3d,0x78,0x1b,0x7e, +0xf3,0x37,0xd2,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xd2,0xbe,0xa0,0x3d,0x78,0x3, 0x75, +0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x99,0x41,0xdf,0xbe,0xa0,0x3e,0x68,0x5, 0xbe, +0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xd4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xd4,0xbe, +0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a,0xbc,0x41,0xdf,0xbe, +0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, 0xb3,0x37,0xaa,0x41, +0xdf,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e,0xf3,0x37,0xef,0x7c, +0xbf,0x4, 0x7a,0xb3,0x37,0xef,0xbe,0xa0,0x4f,0x78,0x3, 0x75,0x1a,0x4e,0xa, 0x3f, +0x2e,0x37,0x31,0xeb,0x7e,0x39,0xb0,0x41,0xdf,0xbe,0xa0,0x51,0x68,0x5, 0xbe,0xa0, +0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, 0xff,0x7e,0xb3,0x37, +0xfa,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a,0xb3,0x37,0xfa,0xbe, +0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0xdf,0xbe,0xa0,0x5c,0x68,0x5, +0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc3, +0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x9c,0xb4,0x41,0xdf,0xbe, +0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, 0xb3,0x38,0x6c,0x80, +0x7e,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x75,0xbe,0xa0,0xf4,0x68,0x5, 0xbe, +0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a,0x25,0xa, 0x9, 0xb3, +0x31,0xf3,0xbe,0xa0,0xf5,0x78,0x58,0x75,0x1a,0xf4,0x80,0x53,0xbe,0xa0,0xf0,0x68, +0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5,0xe7,0x80,0x40,0xbe, +0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10,0x3e,0x14,0x7e,0x1f, +0x31,0xef,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, 0xa, 0x56,0x80,0x1f, +0x7d,0x53,0x80,0x1b,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80,0x12,0xbe,0xa0,0xf7, +0x78,0x4, 0x74,0x64,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda, +0xf8,0x22,0x7c,0x7b,0x6c,0xaa,0x12,0x35,0xcf,0x78,0x9, 0x7c,0xb7,0x12,0x64,0xc1, +0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, 0x7c,0xb7,0x12,0x30,0xb8,0x7c,0xab,0x7c,0xba, +0x22,0x30,0x90,0x19,0xc2,0x90,0xe5,0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5, +0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5,0x1a,0x12,0x33,0x2c,0x5, 0x1a,0x30,0x91,0xb, +0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12,0x32,0xe2,0xf5,0x91,0x22,0x7c,0x6b,0x12,0x35, +0xcf,0x78,0x5, 0x7c,0xb6,0x2, 0x65,0xe8,0xb4,0x4, 0x5, 0x7c,0xb6,0x2, 0x33,0x41, +0x22,0xca,0xf8,0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x65,0xbd,0xd2,0x6, +0xa1,0xc3,0xa5,0xbe,0x1, 0x3d,0x7a,0x73,0x37,0xab,0xa5,0xbf,0xad,0x2, 0x80,0x2f, +0xa5,0xbf,0xae,0x4, 0xd2,0x7, 0xa1,0xc3,0xa5,0xbf,0xaa,0x5, 0x12,0xa9,0x49,0x80, +0x1e,0xa5,0xbf,0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xed,0x80,0x10,0xa5, +0xbf,0xac,0x2, 0x80,0x2, 0xa1,0xc3,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xed,0x6d, +0x33,0x81,0x3f,0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x35,0xc6, +0xa5,0xbe,0x7, 0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xc3,0xa5,0xbe,0x8, 0x2, 0x80, +0x2, 0xa1,0xc3,0x12,0x0, 0x6e,0xa1,0xc3,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a, +0x73,0x37,0xb4,0xa1,0xc3,0xa5,0xbe,0xb, 0x8, 0x12,0x35,0xc6,0x12,0x7, 0xfb,0xa1, +0xc3,0xbe,0x60,0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x5b,0xbe,0x60,0x1e, +0x40,0xd, 0xbe,0x60,0x23,0x38,0x8, 0x12,0x35,0xc8,0x43,0xc, 0x40,0xa1,0xc3,0xbe, +0x60,0x15,0x40,0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x35,0xc8,0xd2,0x6, 0xa5,0xbe, +0x15,0x2, 0x80,0x2, 0xa1,0xc3,0x74,0x7, 0x7a,0xb3,0x37,0xae,0xa1,0xc3,0xa5,0xbe, +0x19,0x7, 0xe4,0x7a,0xb3,0x37,0xc3,0xa1,0xc3,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60, +0x2c,0x38,0x2, 0xa1,0x5b,0xa5,0xbe,0x2d,0x1b,0x12,0x35,0xc8,0x20,0x7, 0x2, 0xa1, +0xc3,0x7e,0x63,0x37,0xd6,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a, +0x35,0x8, 0xa1,0xc3,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, +0x8, 0xa1,0x5b,0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1, +0x5b,0x7e,0x70,0x64,0xa1,0x5b,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43, +0xc, 0x1, 0x7e,0xf3,0x37,0xcf,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xcf,0xa, 0x2f,0x19, +0x72,0x2b,0x40,0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xc3,0x75,0x1a,0x38,0xa1,0xc3, +0xbe,0x60,0x3a,0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xd1, +0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xd1,0xa, 0x2f,0x19,0x72,0x2b,0x63,0xa5,0xbe,0x3b, +0x2, 0x80,0x2, 0xa1,0xc3,0x75,0x1a,0x3a,0xa1,0xc3,0xa5,0xbe,0xfb,0x9, 0x43,0xc, +0x4, 0x7a,0x73,0x2b,0x31,0xa1,0xc3,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xfa,0xa1, +0xc3,0xbe,0x60,0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37, +0xd3,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xd3,0xa, 0x2f,0x19,0x72,0x2a,0x99,0xa5,0xbe, +0x3d,0x2, 0x80,0x2, 0xa1,0xc3,0x75,0x1a,0x3c,0xa1,0xc3,0xbe,0x60,0x3e,0x68,0x4, +0xa5,0xbe,0x3f,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xd5,0x7c,0xbf,0x4, 0x7a,0xb3, +0x37,0xd5,0xa, 0x2f,0x19,0x72,0x2a,0xbc,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xc3, +0x75,0x1a,0x3e,0xa1,0xc3,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12, +0x35,0xc8,0x75,0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x35,0xc8,0x75,0xd, +0x2, 0x12,0x35,0xd7,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x35,0xc8,0x12,0x37,0xd3, +0x80,0x71,0xbe,0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x35,0xc8,0x80,0x63, +0xbe,0x60,0x4e,0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xf0, +0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xf0,0xa, 0x2f,0x2e,0x27,0x31,0xeb,0x7a,0x29,0x70, +0xa5,0xbe,0x4f,0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, +0x80,0x31,0xbe,0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10, +0x20,0x7c,0xb7,0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e, +0x4, 0x7e,0x1f,0x31,0xef,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, +0x7a,0x71,0xf, 0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0xaa,0x22,0x7e, +0xb3,0x37,0xaa,0xc4,0x54,0x7, 0x22,0x12,0xa9,0x5b,0xb4,0x1, 0x14,0xca,0x39,0x7e, +0x18,0x37,0xea,0x7e,0x8, 0x25,0xee,0x12,0x17,0x29,0x1b,0xfd,0x12,0x37,0xac,0x80, +0x12,0xca,0x39,0x7e,0x18,0x37,0xea,0x7e,0x8, 0x2b,0x8f,0x12,0x17,0x29,0x1b,0xfd, +0x12,0x37,0xca,0x2, 0x36,0x6, 0x7a,0x1f,0x2b,0x1b,0x7a,0xf, 0x2b,0x17,0x22,0x7a, +0xb3,0x2b,0x1f,0x70,0x14,0x12,0x37,0xca,0x12,0x36,0x6, 0x7e,0x18,0x6, 0x76,0x7a, +0x1f,0x6, 0xf4,0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x37,0xac,0x12, +0x36,0x6, 0x12,0x57,0x8a,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, +0x12,0x0, 0x1e,0xe4,0x12,0x36,0xf, 0x12,0x36,0x56,0xe4,0x12,0x0, 0x1e,0x74,0x1, +0x12,0x36,0xf, 0x2, 0x36,0x56,0xca,0x3b,0x7e,0xd3,0x2a,0x92,0x7e,0xc3,0x2a,0x93, +0x7e,0x8, 0x1f,0x44,0x12,0x48,0xc6,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12, +0x17,0x4e,0x7e,0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x17,0x4e,0x7e,0x8, +0x1f,0xda,0x7e,0x34,0x0, 0xa, 0x12,0x17,0x4e,0x7e,0xf3,0x2b,0x1b,0x7e,0x18,0x2a, +0xfb,0x7a,0x1d,0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e, +0x8, 0x2a,0xd8,0x12,0x9f,0xe9,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xfb, +0xa, 0x3a,0x2e,0x34,0x16,0xe3,0x12,0x7b,0xcc,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13, +0xa, 0x3e,0x12,0x37,0xa4,0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2b,0x1a,0x19, +0xb4,0x1f,0x8a,0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, +0xa3,0x2a,0xd8,0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x37, +0xa4,0xa, 0x4a,0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2b,0x1a,0x19,0xb4,0x1f,0xa6,0xb, +0xe0,0xbc,0xde,0x38,0xd8,0x7e,0xb3,0x2b,0x1c,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e, +0x18,0x1f,0xd0,0x12,0x6a,0x48,0x80,0x3, 0x12,0xa1,0x3d,0x6c,0xee,0x7e,0x18,0x1f, +0xe4,0x7a,0x1f,0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f, +0x38,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, +0xac,0x7e,0x2e,0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac, +0x7e,0x2e,0x34,0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c, +0x7e,0x12,0x8, 0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x74,0x1, +0x7a,0xb3,0x37,0x5, 0x12,0x98,0xe2,0x12,0x13,0xf5,0x12,0xa0,0xb1,0xe4,0x12,0xa, +0x66,0x7e,0x24,0x3, 0xd4,0x12,0x40,0x30,0x74,0x1, 0x12,0x36,0xf, 0x12,0x64,0x26, +0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x36,0x3e,0x7e,0x34,0x0, 0x1, 0xe4,0x6c, +0x55,0x2, 0x13,0x1, 0x2e,0x37,0x2b,0x1d,0x7e,0x39,0xb0,0x22,0x7e,0x1f,0x25,0xf2, +0x7e,0xf, 0x25,0xee,0x22,0x7a,0xb3,0x2b,0x1f,0x70,0x5, 0x12,0x37,0xca,0x80,0x6, +0xb4,0x1, 0x6, 0x12,0x37,0xac,0x12,0x36,0x6, 0x22,0x7e,0x1f,0x2b,0x93,0x7e,0xf, +0x2b,0x8f,0x22,0x12,0xa9,0x5b,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e, +0x8, 0x37,0xea,0x12,0x17,0x29,0x1b,0xfd,0x12,0xa9,0x40,0x12,0x37,0xac,0x80,0x1a, +0xca,0x39,0x7e,0x18,0x2b,0x8f,0x7e,0x8, 0x37,0xea,0x12,0x17,0x29,0x1b,0xfd,0x7e, +0x37,0x2b,0x95,0x7a,0x37,0x31,0xeb,0x12,0x37,0xca,0x2, 0x36,0x6, 0x30,0x6, 0x3b, +0xc2,0x6, 0x12,0x1a,0xb, 0x7e,0x73,0x37,0xaf,0x7a,0x73,0x2a,0x6c,0x7e,0x73,0x37, +0xb0,0x7a,0x73,0x2b,0x3c,0x7e,0x73,0x37,0xb0,0x7a,0x73,0x2b,0x20,0x7e,0xb3,0x37, +0xb1,0x60,0x18,0x7e,0x34,0x0, 0x2, 0x12,0x39,0x74,0x7e,0x34,0x0, 0x1, 0x12,0x39, +0x74,0x6d,0x33,0x12,0x39,0x74,0xe4,0x7a,0xb3,0x37,0xb1,0x12,0x47,0xf9,0x2, 0x38, +0x51,0xe5,0xc, 0x70,0x2, 0x21,0x73,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12, +0x52,0x23,0x12,0x5a,0x8c,0x7e,0x8, 0x2a,0x8c,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1, +0x6, 0x53,0xc, 0xfd,0x12,0xa1,0x4e,0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e, +0xb3,0x2b,0x31,0x60,0x9, 0x7e,0x8, 0x2a,0x8c,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3, +0x2b,0x84,0x7e,0x73,0x2b,0x83,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x31,0x2e,0x70,0xff, +0x92,0x4, 0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x96,0x12,0xb, 0x1e,0xe5,0xc, +0x30,0xe3,0x4a,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xdc,0x7a,0x73,0x2b,0x2e,0x12,0x7c, +0x2f,0x7a,0xb3,0x0, 0x61,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, +0x61,0x7a,0x73,0x37,0xb4,0x12,0x4d,0xb8,0x12,0x47,0xd2,0x7e,0x73,0x37,0xdd,0xbe, +0x73,0x2b,0x81,0x68,0x6, 0x7a,0x73,0x2b,0x81,0xd2,0xc, 0x30,0xc, 0x9, 0xc2,0xc, +0x12,0x98,0xe2,0xe4,0x12,0xa, 0x66,0x12,0x19,0x65,0x12,0x97,0xf3,0xe5,0xc, 0x30, +0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43,0x37,0xde,0x7e,0x50,0xa, 0xac,0x45,0x12,0x40, +0x30,0xe5,0xc, 0x30,0xe6,0x4e,0x53,0xc, 0xbf,0x7e,0x73,0x37,0xca,0xbe,0x70,0x7, +0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37,0xca,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x3b,0xac, +0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63,0x37,0xca,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12, +0x26,0xec,0x7c,0x65,0x4c,0x76,0x74,0xe, 0x12,0x3b,0x5a,0x12,0x3b,0xac,0x12,0x3b, +0xa5,0x7e,0x73,0x37,0xcd,0x7a,0x73,0x2b,0x33,0x7e,0x73,0x37,0xcc,0x7a,0x73,0x2b, +0x3e,0x12,0xa9,0x52,0xe5,0xc, 0x30,0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xb4, +0x2, 0x40,0x7e,0x22,0xca,0xd8,0xca,0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c, +0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c,0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4, +0x7d,0x3c,0x7c,0xe7,0x12,0x1f,0xed,0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12, +0x3b,0xac,0x7c,0x8b,0x74,0x7, 0x7e,0x70,0xf, 0x12,0x3b,0xa2,0x7e,0x54,0x0, 0x78, +0x7e,0x1f,0x33,0xe3,0x79,0x51,0x0, 0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x33,0xe3, +0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, 0xc, 0x7e,0x1f,0x33,0xe3,0x79,0x51,0x0, 0x10, +0xbe,0xd4,0x0, 0x2, 0x78,0x7, 0x12,0x3b,0x3f,0x44,0x1, 0x80,0x1c,0x12,0x3b,0x3f, +0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x33,0xe3,0x78,0x7, 0x12,0x3b,0x43, +0x54,0xfb,0x80,0x5, 0x12,0x3b,0x43,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x33,0xdf, +0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e,0xa0, +0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0xf, 0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff,0xe, +0x12,0x3b,0x4e,0x54,0xe6,0x12,0x3b,0x4b,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12,0x3b, +0x4e,0x5e,0x54,0xfe,0xe6,0x12,0x3b,0x4b,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4,0x0, +0x2, 0x78,0x21,0x12,0x3b,0x3f,0x12,0x3c,0xbd,0x12,0x3b,0x3f,0x44,0x50,0x1b,0x1a, +0x50,0x7e,0x34,0x0, 0x2, 0x12,0x3c,0x29,0x12,0x3c,0x2, 0x12,0x3b,0xdf,0x7a,0x37, +0x31,0xf3,0x41,0xfb,0x6c,0xdd,0x41,0xf5,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b, +0xbc,0xfd,0x40,0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xd7,0xbe,0x90,0x23,0x40,0x3, 0x7e, +0x90,0x22,0xb, 0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xfa, +0xbe,0x90,0x1c,0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x12,0x3b,0x3f,0x12,0x3c, +0xbd,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x12,0x3b,0x3f,0x4d,0x5c, +0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, 0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34, +0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, 0x3b,0x12,0x3c,0x29,0x12,0x3c,0x2, 0xbe,0xd4, +0x0, 0x1, 0x78,0x10,0x12,0x3c,0x2, 0x12,0x3b,0xdf,0x74,0x2, 0xac,0xbd,0x59,0x35, +0x31,0xf5,0x80,0xf, 0x12,0x3b,0xdf,0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59, +0x32,0x31,0xf5,0xb, 0xd0,0xbc,0xed,0x28,0x2, 0x41,0x68,0xa9,0xd5,0xcb,0x74,0x7, +0x7c,0x78,0x12,0x3b,0xa2,0xa9,0xc0,0xc4,0x7e,0x1f,0x33,0xdf,0x79,0xe1,0x0, 0x84, +0x7e,0x1f,0x33,0xdf,0x79,0xf1,0x0, 0x90,0x6d,0x33,0x7e,0xf, 0x33,0xe3,0x79,0x30, +0x0, 0x6, 0x7e,0xf, 0x33,0xe3,0x79,0x30,0x0, 0x8, 0x7e,0xf, 0x33,0xe3,0x79,0x30, +0x0, 0x10,0x7e,0xf, 0x33,0xe3,0x79,0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x7e, +0x1f,0x33,0xe3,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22,0x1b,0x1a,0x50,0x7e,0x1f, +0x33,0xdf,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5,0xfd,0x7a,0x71,0xfe,0x22, +0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12,0x3b,0x5a,0x74,0xf, 0x12,0x3b,0xac, +0x7c,0x7b,0x74,0xf, 0x5e,0x70,0xfe,0x12,0x3b,0x5a,0x74,0xc, 0x12,0x3b,0xac,0x54, +0x7f,0x68,0x8, 0x74,0xc, 0x7e,0x70,0xf8,0x12,0x3b,0x5a,0x7e,0x70,0x72,0x74,0xe, +0x12,0x3b,0x5a,0x74,0x7, 0x12,0x3b,0xac,0x7c,0x7b,0x5e,0x70,0xfb,0x74,0x7, 0x2, +0x3b,0xa2,0x12,0x3b,0x5a,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0xf5,0xfd,0xe5,0xfe, +0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x12,0x12,0x4b,0x63,0xe5,0x34, +0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74,0x3, 0x7e,0x71,0x27,0x12,0x3b,0x5a,0x74,0xb, +0x7e,0x71,0x2f,0x12,0x3b,0x5a,0x74,0xc, 0x7e,0x71,0x30,0x12,0x3b,0xa2,0x22,0x7e, +0xf, 0x33,0xe3,0x69,0x30,0x0, 0xa, 0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d, +0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x33,0xe3,0x79,0x30,0x0, 0x4, 0x7e,0xf, +0x33,0xe3,0x69,0x30,0x0, 0x12,0x5e,0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, +0x79,0x30,0x0, 0x12,0x22,0x7e,0x34,0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, +0x80,0x5, 0x74,0xfa,0x12,0x3c,0xc5,0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d, +0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6,0x22,0x12,0x3f,0xe8,0xc2,0x3, 0x12,0x4f,0xe2, +0xc2,0x5, 0x12,0x3d,0x1, 0xc2,0x3, 0x12,0x3f,0xfc,0xa9,0xd5,0xcb,0x74,0xf, 0x12, +0x3b,0xac,0x7a,0x1b,0xb0,0x74,0xf, 0x6c,0x77,0x12,0x3b,0x5a,0xe5,0xfc,0x7a,0xb, +0xb0,0x43,0xfc,0x10,0x2, 0x3b,0xa5,0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24, +0xde,0x68,0x26,0x24,0xde,0x78,0x2f,0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x3, 0xff,0xb4, +0x5, 0x2a,0x12,0x3c,0x25,0x12,0x9d,0xff,0x2, 0x9f,0x19,0x7e,0xb3,0x3, 0xff,0xb4, +0x5, 0x1a,0x12,0x3c,0x25,0x75,0xe9,0xff,0x22,0x7e,0xb3,0x3, 0xff,0xb4,0x5, 0xc, +0x12,0x3c,0x25,0x2, 0x9f,0x13,0x74,0x1, 0x7a,0xb3,0x3, 0xff,0x22,0x5e,0x54,0x0, +0xf, 0x1b,0x1a,0x50,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x3b,0x5a,0x7a,0x61,0xfc,0x12,0x3b,0xa5, +0x12,0x4c,0xa6,0xd2,0x3, 0x12,0x3f,0xfc,0x12,0x3d,0x1b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x3d,0x1b, +0x2, 0x13,0x96,0x12,0x3f,0xe8,0xc2,0x5, 0x2, 0x3d,0x1, 0xd2,0x5, 0x12,0x3d,0x1, +0x74,0x1, 0x22,0x12,0x3e,0xb4,0x12,0x7b,0x45,0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0x57,0x93,0x12,0x3c,0x48,0x74,0x1, 0x12,0x3e,0xec,0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x3c,0xe0,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x3d,0xa, 0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x3e,0xb4,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x3e, +0xec,0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x3d,0xa, 0xca, +0x3b,0x7e,0xb3,0x37,0x3, 0xb4,0x1, 0x2, 0x80,0x2, 0xc1,0xb1,0x6c,0xcc,0x6c,0xdd, +0x7e,0xb3,0x37,0x2e,0xb4,0x1, 0x8, 0x7e,0xe0,0x10,0x7e,0xf0,0x32,0x80,0x6, 0x7e, +0xe0,0x6, 0x7e,0xf0,0x14,0x12,0x3f,0xf7,0x7d,0xf3,0x12,0x5f,0xe9,0x50,0xfb,0x74, +0x1, 0x7a,0xb3,0x38,0x8e,0x12,0x36,0xf, 0x12,0x13,0xc7,0x12,0x0, 0x1e,0x74,0xa, +0x12,0x3c,0xc5,0x12,0x47,0xe1,0x7e,0xe7,0x2b,0x2c,0x7a,0xe5,0x25,0x7e,0xb3,0x2b, +0x19,0xf5,0x24,0x74,0x4, 0x7a,0xb3,0x2b,0x19,0x7e,0xe7,0x2b,0x2c,0x5e,0xe4,0x0, +0x3f,0x7a,0xe7,0x2b,0x2c,0x7e,0xb3,0x2b,0x19,0x12,0x64,0x2d,0x7c,0x7b,0x74,0x6, +0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x15,0x29,0x7d,0x23,0x7d,0x3f,0x12,0x4f,0xeb, +0xad,0x32,0x7a,0x37,0x2b,0x26,0x12,0x45,0x76,0xc1,0x92,0x12,0x1f,0xed,0x30,0xd, +0x2, 0xc1,0x98,0x7c,0xbe,0x12,0x7b,0xbc,0x12,0x46,0xbd,0x80,0xf, 0x80,0x7, 0x12, +0x3e,0xb4,0xe4,0x12,0x3e,0xec,0x20,0x93,0xf6,0x12,0x3d,0x4f,0x30,0x18,0xf7,0x30, +0x17,0xf4,0xd2,0x4, 0x12,0x3d,0xa, 0xe4,0x12,0x13,0xde,0xb, 0xc0,0x12,0x78,0xd9, +0x12,0x7f,0xbb,0x7e,0xa3,0x38,0x8d,0x4c,0xaa,0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38, +0x8e,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x2e,0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x8d, +0x12,0xa9,0x0, 0x78,0x18,0x7e,0xb3,0x38,0x8d,0x60,0x12,0xe4,0x7a,0xb3,0x38,0x8d, +0x7a,0xb3,0x2a,0x20,0x7a,0xb3,0x2a,0x21,0x7e,0xd0,0x1, 0x80,0x1b,0x12,0xa9,0x0, +0x68,0x10,0x7e,0xb3,0x38,0x8d,0x70,0xa, 0x7e,0xd0,0x1, 0xe4,0x7a,0xb3,0x37,0x3, +0x80,0x6, 0xbc,0xfc,0x28,0x2, 0xc1,0xb, 0xe4,0x7a,0xb3,0x2b,0x23,0x7e,0x35,0x25, +0x7a,0x37,0x2b,0x2c,0xe5,0x24,0x7a,0xb3,0x2b,0x19,0x4c,0xdd,0x68,0x3, 0x12,0x1a, +0x6a,0xda,0x3b,0x22,0x74,0x81,0x7a,0xb3,0x38,0xfd,0x22,0x80,0x1d,0x12,0x3e,0xb4, +0x12,0x7b,0x3d,0x68,0x5, 0xc2,0x4, 0x12,0x3d,0xa, 0x7e,0xb3,0x34,0x3a,0xbe,0xb0, +0x2, 0x68,0x18,0x20,0x17,0x15,0xe4,0x12,0x3e,0xec,0x20,0x93,0xe0,0x12,0x3e,0xb4, +0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x74,0x2, 0x2, 0x3e,0xec,0x22,0x7c,0xab,0x7e,0xb3, +0x38,0xfd,0xb4,0x81,0x38,0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0, +0x1, 0x78,0xf, 0xc2,0xaf,0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf, +0x80,0x15,0xbe,0xa0,0x2, 0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9, +0xd7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3, +0x38,0xfd,0x22,0x7e,0xb3,0x37,0x3, 0x14,0x68,0x5a,0x14,0x78,0x2, 0xe1,0xd0,0x14, +0x68,0x6a,0x24,0x3, 0x68,0x2, 0xe1,0xc8,0x12,0x3f,0xef,0x38,0x8, 0x30,0x10,0xf, +0x12,0x77,0xf5,0x68,0xa, 0x12,0xa9,0xb, 0xe4,0x7a,0xb3,0x38,0x8d,0x80,0x71,0x7e, +0xb3,0x36,0xe4,0x30,0xe0,0x6a,0x7e,0x73,0x36,0xe5,0xa, 0x27,0x7e,0x34,0x4, 0x0, +0xad,0x32,0x7e,0xb3,0x37,0x2e,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x7b,0x12,0xa6,0x9c, +0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x8b,0x50,0x46,0x12,0x3f,0xd6,0xe4,0x7a,0xb3, +0x38,0x8f,0x80,0x3c,0x12,0x3f,0xef,0x28,0x32,0xe4,0x7a,0xb3,0x37,0x3, 0x7e,0xb3, +0x38,0x8d,0xb4,0x1, 0x3, 0x12,0x3f,0xdc,0xd2,0x17,0x80,0x1f,0x74,0xff,0x7a,0xb3, +0x36,0xdd,0x12,0xa9,0x6c,0x12,0x3d,0x23,0x12,0x19,0x6f,0xe4,0x7a,0xb3,0x37,0x3, +0x7a,0xb3,0x39,0x2, 0xd2,0x17,0x80,0x8, 0x12,0x3f,0xdc,0xe4,0x7a,0xb3,0x39,0x2, +0x12,0x7a,0xfb,0x2, 0x3d,0x7f,0x6d,0x33,0x7a,0x37,0x38,0x8b,0x74,0x1, 0x7a,0xb3, +0x37,0x3, 0x22,0xd2,0x4, 0x2, 0x3d,0xa, 0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0x73,0x2a,0x20,0xbe,0x70,0x0, 0x22,0x7e,0x34,0x0, 0x46,0x22,0xa2,0x3, 0xa9,0x97, +0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x12,0xa9,0x49,0x12,0xa9,0x40,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x40,0x5d,0x12,0x40,0x37,0x74,0x50,0x7a,0xb3,0x37,0xde,0x7e,0x24, +0x3, 0x20,0x12,0x40,0x30,0xe4,0x12,0xa8,0xc7,0x6d,0x33,0x7a,0x37,0x38,0xff,0x22, +0x7d,0x32,0x74,0xfa,0x2, 0x12,0xd0,0x7e,0x73,0x2b,0x81,0x7a,0x73,0x37,0xdd,0x22, +0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37,0xd8,0x7e,0x73,0x37,0xdc,0xbe,0x73,0x2b,0x2e, +0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12,0x40,0x5d,0x12,0x40,0x37,0x22,0x7e,0x73,0x2b, +0x2e,0x7a,0x73,0x37,0xdc,0x7e,0x73,0x2b,0x3e,0x7a,0x73,0x37,0xcc,0x7e,0x73,0x2b, +0x3f,0x7a,0x73,0x37,0xcb,0x7e,0x73,0x2b,0x33,0x7a,0x73,0x37,0xcd,0x22,0xca,0xd8, +0xca,0x79,0x7c,0xdb,0x7e,0xa0,0x4, 0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c, +0xff,0x80,0xb, 0x12,0x40,0xe6,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf, +0x38,0xf1,0x80,0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12, +0x40,0xe6,0x40,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad, +0x38,0x2, 0x6c,0xdd,0x7c,0xbd,0x12,0x4e,0xb, 0x12,0x40,0x75,0x12,0x44,0xf4,0x12, +0x41,0x2, 0x7e,0x73,0x2b,0x2e,0x7a,0x73,0x37,0xdc,0x12,0x40,0x37,0x7a,0xd3,0x37, +0xb4,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26,0x33,0xbc, +0xbe,0x22,0x30,0x3, 0x3, 0x12,0x40,0x75,0xa2,0x4, 0x92,0x5, 0x12,0x41,0xc0,0x2, +0x41,0x2, 0x7e,0x73,0x2b,0x3f,0x7a,0x73,0x37,0xcb,0x22,0x74,0x40,0x7a,0xb3,0x2b, +0x3f,0x12,0x5d,0xed,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x40,0xf2,0x80,0x1c,0x74, +0x1, 0x12,0x41,0x44,0x7e,0x43,0x37,0xc9,0x7e,0x50,0x64,0xac,0x45,0x12,0x77,0xfd, +0x7a,0xb3,0x2b,0x3e,0x7e,0xf, 0x33,0xf8,0x12,0x44,0x5d,0x12,0x41,0x2, 0x12,0x44, +0xf4,0x2, 0x40,0x75,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x33,0x12,0x47,0xd2, +0x7e,0xc0,0xa, 0x12,0x45,0x4, 0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x1f, +0x33,0xf8,0x12,0x78,0x79,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, 0x12,0x41,0xb4, +0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12,0x41,0xb4,0xb, +0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x41,0xb4,0xb, 0x34,0x1b,0xa, +0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x33,0xf8,0x12,0x78, +0x1c,0x7d,0x73,0x7e,0x1f,0x33,0xe7,0x69,0x31,0x0, 0x1a,0x7a,0x73,0x2b,0x33,0x7d, +0x37,0xda,0x3b,0x22,0x7e,0xf, 0x33,0xe7,0x2e,0x14,0x0, 0x1a,0xb, 0xa, 0x30,0x22, +0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x34,0x7e,0xb3,0x37,0xbf,0xf5,0x29,0x7e, +0xb3,0x2a,0x8c,0xf5,0x2a,0x7e,0xb3,0x2a,0x8d,0xf5,0x2b,0x7e,0xb3,0x2a,0x8f,0xf5, +0x2c,0x7e,0xb3,0x2a,0x8e,0xf5,0x2d,0x7e,0x34,0x2e,0xe0,0x7a,0x35,0x2e,0x7e,0x18, +0x40,0x0, 0x7a,0x1d,0x30,0x12,0x44,0xfd,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, +0x7e,0x8, 0x34,0x0, 0x12,0x47,0xd9,0x6c,0xff,0x80,0x34,0x9f,0x77,0x6c,0xee,0x80, +0x19,0x7e,0x11,0x2b,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x3f,0x2d,0x10,0x7e, +0x1d,0x30,0x2d,0x31,0xb, 0x1a,0x30,0x12,0x44,0x34,0xe5,0x2d,0xbc,0xbe,0x38,0xe1, +0xe5,0x2d,0x12,0x44,0x3b,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34,0x0, 0xb, 0xf0,0xe5, +0x2c,0xbc,0xbf,0x38,0xc6,0x7e,0x34,0x10,0x0, 0x7e,0xa1,0x2b,0x74,0x2, 0xa4,0x59, +0x35,0x33,0xfe,0x6c,0xff,0x80,0x72,0x9f,0x77,0x6c,0xee,0x80,0x12,0x12,0x44,0xcd, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x12,0x44,0x34,0xe5, +0x29,0xbc,0xbe,0x38,0xe8,0xe5,0x29,0x12,0x44,0x3b,0x74,0x4, 0xac,0xbf,0x59,0x35, +0x3, 0x72,0xe5,0x29,0xbe,0xb1,0x2c,0x50,0x32,0x9f,0x77,0x7e,0xe1,0x29,0x80,0x12, +0x12,0x44,0xcd,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x12, +0x44,0x34,0xe5,0x2c,0xbc,0xbe,0x38,0xe8,0xe5,0x29,0xa, 0x3b,0x6d,0x22,0xe5,0x2c, +0xa, 0x1b,0x6d,0x0, 0x9f,0x1, 0x12,0x44,0x3f,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74, +0x4, 0xac,0xbf,0x59,0x35,0x3, 0x74,0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0x88,0xe5, +0x2c,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x15,0x77,0x6c,0xff,0x80,0x2e, +0x74,0x2, 0xac,0xbf,0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, +0x9d,0x15,0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14, +0x78,0xf4,0x7d,0x21,0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2c, +0xbc,0xbf,0x38,0xcc,0xe5,0x2a,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x15, +0x77,0x6c,0xff,0x80,0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x72,0xa, 0x1f,0xad, +0x13,0x7e,0xf4,0x10,0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50, +0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25, +0x3, 0x72,0xe5,0x29,0xbe,0xb1,0x2c,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, +0x74,0x2e,0x14,0x10,0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x74,0xb, +0xf0,0xe5,0x2a,0xbc,0xbf,0x38,0x9e,0x7e,0x73,0x37,0xc1,0xa, 0x37,0x6d,0x22,0x74, +0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x15,0x75,0x7d, +0xe3,0x7a,0xe5,0x34,0x7e,0x73,0x37,0xc2,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11, +0x14,0x78,0xfb,0x7d,0x1f,0x12,0x15,0x75,0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, +0xac,0xbf,0x49,0x45,0x34,0x0, 0xbe,0x45,0x34,0x28,0x9, 0x7e,0x35,0x34,0x59,0x35, +0x34,0x0, 0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2c, +0xbc,0xbf,0x38,0xda,0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x72, +0xbe,0x45,0x34,0x28,0x9, 0x7e,0x35,0x34,0x59,0x35,0x3, 0x72,0x80,0x8, 0xbd,0x46, +0x50,0x4, 0x59,0x65,0x3, 0x72,0x49,0x45,0x3, 0x74,0xbe,0x45,0x34,0x28,0x9, 0x7e, +0x35,0x34,0x59,0x35,0x3, 0x74,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x74, +0xb, 0xf0,0xe5,0x2a,0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x30,0x12,0x44, +0x5d,0xda,0x3b,0x22,0x6d,0x22,0x2f,0x71,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7f, +0x17,0x12,0x15,0x77,0x7f,0x71,0x7e,0x25,0x2e,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d, +0x22,0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x15,0x75,0x12,0x44,0x67, +0xb, 0x34,0x7a,0x73,0x2b,0x3f,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x6c,0xaa,0xa, +0x4a,0x2e,0x44,0x60,0xac,0x12,0xa0,0xa8,0x7c,0x9b,0x7e,0xf3,0x2a,0x8d,0xac,0xf9, +0x7e,0xb3,0x2a,0x8f,0xa, 0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde, +0xb, 0x6a,0xd0,0x6d,0xcc,0x2f,0x6, 0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xd1,0xbe,0x8, +0x0, 0x0, 0x78,0x2, 0xb, 0xc, 0x7e,0x54,0x0, 0x3, 0x7f,0x10,0x7d,0x15,0x12,0x15, +0x75,0x7f,0x1, 0xb, 0xc, 0x7e,0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x15,0x77, +0xbe,0x34,0x0, 0xfa,0x28,0x4, 0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0x11,0x2b, +0xac,0x1f,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x30,0x2d,0x31, +0xb, 0x1a,0x20,0x7a,0x27,0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad, +0x23,0x74,0xc, 0x22,0x7e,0x73,0x2b,0x3e,0x7a,0x73,0x37,0xcc,0x22,0x7e,0x8, 0x2a, +0x8c,0x12,0xd, 0x72,0xe4,0x12,0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x2, 0x0, 0x4e,0xb4,0x3, 0x5, 0x12,0x45,0x23,0x80,0x2, 0xe4,0x22,0x12,0x45,0x8, +0x74,0x1, 0x22,0x12,0x5f,0xa0,0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x8c,0x2, 0xd, +0x72,0x12,0x67,0x2b,0x38,0x2, 0xe4,0x22,0x12,0x47,0xf1,0x49,0x55,0x34,0x3b,0xbe, +0xb0,0x2, 0x38,0x3, 0x2, 0x45,0x4a,0x2, 0x45,0x13,0x7e,0xd7,0x2b,0x2c,0xbe,0xb0, +0x1, 0x28,0x2, 0xe4,0x22,0x12,0x66,0xbc,0x12,0x45,0x76,0x7a,0xd7,0x2b,0x2c,0x7e, +0x73,0x2b,0x19,0xa, 0x37,0x3e,0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, +0x12,0x46,0xbd,0x74,0x1, 0x22,0x7e,0x8, 0x2a,0x8c,0x2, 0x5, 0xb4,0xca,0x3b,0x7e, +0xe3,0x2a,0x93,0x7e,0xf3,0x2b,0x19,0x74,0x1, 0x7a,0xb3,0x2b,0x19,0x12,0x45,0x76, +0x12,0x47,0xe1,0x12,0x1b,0xae,0x7e,0x17,0x2b,0x1d,0x6d,0x0, 0x12,0x17,0x4e,0x7e, +0xd0,0x7, 0x12,0x1f,0xed,0x6c,0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x67,0x12,0x47,0x95,0x4c,0x76,0x7a,0x29,0x70, +0xb, 0xc0,0x12,0x47,0x7c,0xa, 0x3c,0xbd,0x32,0x48,0xde,0x12,0x46,0xac,0x30,0x18, +0xfd,0x12,0x47,0x9f,0x7e,0xb3,0x2a,0x92,0x7c,0x7e,0x12,0x47,0xb1,0x6c,0xcc,0x80, +0x29,0x74,0x2, 0xac,0xbc,0x49,0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e, +0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff, +0x12,0x47,0x95,0x5c,0x7b,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x47,0x7c,0xa, 0x3c,0xbd, +0x32,0x48,0xce,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0x88,0x12,0x46,0xfe,0x74,0x2, 0x12, +0x47,0xe9,0x12,0x46,0x34,0x74,0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2b,0x19,0x12,0x45, +0x76,0xda,0x3b,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x48,0xc6,0x7e, +0xa3,0x2a,0x92,0x7e,0x73,0x2a,0x93,0x6c,0xee,0x80,0x1d,0xa, 0x2e,0x9, 0x62,0x2a, +0xfb,0xa, 0x26,0x12,0x2f,0x8b,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12, +0x47,0x8b,0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xdf,0x6c,0xee,0x80,0x1a, +0xa, 0x2e,0x9, 0x62,0x2a,0xd8,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d, +0x21,0x12,0x47,0x8b,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee, +0x7e,0x30,0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12, +0x11,0xba,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x74,0x2, 0x12,0x0, +0x1e,0x7e,0xb3,0x2b,0x1b,0x12,0x46,0x34,0x74,0x2, 0x12,0x0, 0x1e,0x74,0x5, 0x7e, +0x70,0x9b,0x12,0x13,0x2c,0x12,0x46,0xcf,0x7e,0xb3,0x2b,0x1b,0x2, 0xe, 0x94,0x6c, +0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xfb,0x2e,0x34,0x16,0xe3,0x12,0x7b,0xcc, +0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x33,0xdf,0x2d,0x12,0x79, +0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x93,0xbc,0x6a,0x38,0xd6,0x22,0xca,0xd8, +0xca,0x79,0x7e,0xf0,0xa, 0x74,0x1, 0x7a,0xb3,0x2b,0x19,0x12,0x1b,0xae,0x7c,0xe7, +0x80,0x5d,0x12,0x1f,0xed,0x12,0x46,0xac,0x30,0x18,0xfd,0x12,0x47,0x9f,0x12,0x47, +0xa9,0x6c,0xdd,0x80,0x3d,0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34, +0x14,0x78,0x50,0x14,0xa, 0x1d,0x2e,0x17,0x2b,0x1d,0x7e,0x19,0xb0,0xbe,0xb0,0x0, +0x28,0x1e,0x14,0x7a,0x19,0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d, +0x12,0x37,0xa4,0xbe,0xb0,0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0, +0xb, 0xd0,0x12,0x47,0x7c,0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c, +0xaf,0x1b,0xf0,0x4c,0xaa,0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x93, +0xa, 0x37,0x7e,0x53,0x2a,0x92,0xa, 0x25,0x2d,0x23,0x22,0x2e,0x27,0x2b,0x1d,0x7e, +0x29,0xb0,0xa, 0x26,0x22,0xa, 0x2c,0x2e,0x27,0x2b,0x1d,0x7e,0x29,0x70,0x22,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22,0x7e,0xb3,0x2a,0x92,0x7e,0x73,0x2a, +0x93,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0x7c,0x96,0x7c,0xa7,0x12,0x36,0xf, +0x7c,0xba,0x12,0x13,0xc7,0x74,0xa, 0x12,0x3c,0xc5,0x7c,0xb9,0x12,0x0, 0x1e,0x2, +0x45,0x7d,0x7e,0x8, 0x2a,0x8c,0x2, 0xd, 0x72,0x7e,0x34,0x0, 0x38,0xe4,0x2, 0x17, +0x4e,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x12,0x0, 0x1e,0x7e,0xb3,0x2b,0x1b, +0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, 0x30, +0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x45,0x76,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, 0xfd, +0x7e,0xb3,0x37,0xee,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0x47,0xe9,0x12,0x48, +0x50,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xef,0x7e,0xb3, +0x37,0xee,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x37,0xca,0x80,0x7, 0xe4,0x12, +0x0, 0x1e,0x12,0x37,0xac,0x12,0x36,0x6, 0x7e,0xb3,0x2b,0x1b,0x2, 0x46,0x34,0x22, +0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x48,0xc6,0x7e,0xa3,0x2a,0x92,0x7e, +0x63,0x2a,0x93,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x72,0x2a,0xfb,0xbe,0x70,0x1c, +0x50,0x11,0xa, 0x27,0x12,0x2f,0x8b,0x7c,0x7b,0x7e,0xb3,0x2b,0x1a,0xa, 0x27,0x19, +0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xde,0x6c,0xee,0x80,0x17,0xa, 0x3e,0x9, +0x73,0x2a,0xd8,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2b,0x1a,0xa, 0x27,0x19,0x62, +0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e,0x30,0xe, 0xac,0x3e,0x2e, +0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xf8,0xb, 0xe0,0xbe,0xe0, +0x5, 0x40,0xe7,0xda,0x79,0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, 0x17,0x4e,0xca, +0xd8,0xca,0x79,0x7e,0x73,0x2a,0x8d,0x7e,0xf3,0x2a,0x8c,0xac,0xf7,0x7d,0x37,0x3e, +0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x17,0x4e,0x7e,0xb3,0x37,0xc5,0xb4,0x1, 0x64, +0x7e,0x73,0x37,0xc6,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c,0x12,0x1f,0xed, +0x12,0x1a,0xaf,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49,0x33,0xd, 0xc8, +0x12,0x17,0x80,0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14,0x49,0x21,0x1f, +0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34,0xb, 0x34,0x7a, +0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xc6,0xbc,0x7d,0x38, +0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0xd, 0xc8,0x12, +0x17,0x29,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0x8, 0x38,0x1, 0x12,0x49,0x8d, +0x7e,0x8, 0x38,0x9, 0x12,0x49,0x8d,0x12,0x49,0xa9,0x12,0x49,0xa2,0x2, 0x49,0x70, +0x7e,0x37,0x38,0x1, 0xbe,0x34,0x0, 0x0, 0x28,0x12,0x7e,0x73,0x39,0x2, 0xbe,0x70, +0x5, 0x50,0x9, 0x7e,0xb3,0x37,0x2e,0x70,0x3, 0x12,0x3f,0xd6,0x22,0xb, 0xa, 0x30, +0xe5,0x60,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33,0x1b,0xa, +0x30,0x22,0x7e,0x8, 0x38,0xe2,0x2, 0x49,0x8d,0x7e,0x8, 0x2b,0xd6,0x2, 0x49,0x8d, +0x7e,0x73,0x28,0x93,0x7a,0x73,0x28,0x94,0x7e,0x73,0x2a,0x20,0x7a,0x73,0x2a,0x21, +0xe4,0x7a,0xb3,0x2a,0x24,0x22,0x7e,0x37,0x38,0xc8,0xb, 0x34,0x7a,0x37,0x38,0xc8, +0x7e,0x37,0x38,0xca,0xbe,0x37,0x38,0xc8,0x28,0x3, 0x2, 0x49,0xe1,0x22,0x2, 0x49, +0xc6,0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12, +0x49,0xde,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b, +0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xe4,0x12,0x4c,0x75,0x12,0x9e,0xb5,0x12,0x1f, +0xed,0x12,0x4f,0xdb,0x12,0x3b,0x60,0x12,0x9d,0xf5,0x12,0x9e,0xcc,0x12,0x0, 0xa, +0x12,0x9e,0xd8,0x12,0x4c,0x0, 0x12,0x9e,0xe8,0xd2,0xaf,0x12,0x9e,0x47,0x12,0x4a, +0x65,0x12,0x3b,0xb1,0x12,0x4c,0xa6,0x7e,0x8, 0x38,0xcc,0x12,0x4c,0x4f,0x90,0x60, +0x50,0xe4,0x93,0xca,0xb8,0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff, +0xda,0xb8,0x2, 0x12,0x34,0xd2,0xc8,0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9, +0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0x4b,0xf0,0xe4,0x12,0x4a,0x88,0x2, 0x4a,0x7f,0xa9, +0xc5,0xca,0xe4,0x7a,0xb3,0x39,0xc, 0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12,0x4b, +0x7, 0x4c,0xff,0x78,0x5, 0x5e,0x70,0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12, +0x4a,0xa9,0xda,0xf8,0x22,0x74,0x6, 0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c, +0x73,0x7d,0x52,0x7c,0xab,0x7e,0xb3,0x39,0xc, 0xb4,0xa5,0x3c,0x12,0x4b,0x9b,0x75, +0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0x12,0x4b,0x0, 0xa9,0x36,0xb3,0xfc,0x12,0x4b,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36, +0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0x4a,0xa9, +0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0x22,0x7c,0x6b,0x6c,0x77,0x6c,0xaa,0x7e,0xb3,0x39, +0xc, 0xb4,0xa5,0x46,0x12,0x4b,0x9b,0x75,0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0x12,0x4b, +0x0, 0xa9,0x36,0xb3,0xfc,0x12,0x4b,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a, +0x61,0xb5,0xa9,0x36,0xb3,0xfc,0x12,0x4b,0x0, 0xa9,0x36,0xb3,0xfc,0x12,0x4b,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, 0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c,0x55,0xa, 0x3a, +0x4d,0x32,0x22,0x7d,0x42,0x7f,0x60,0x7d,0x3, 0x12,0x4b,0xf0,0x74,0x2, 0x12,0x4b, +0x7, 0x7d,0xf3,0x4e,0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, 0x12,0x4b,0x94,0x7a,0x45, +0x36,0x7d,0x30,0x6d,0x22,0x7f,0x6, 0x12,0x4b,0xac,0x5e,0xf4,0xff,0xfd,0x12,0x4b, +0x94,0x2, 0x4a,0x7f,0x74,0x2, 0x7d,0x3f,0x2, 0x4a,0xa9,0xa9,0xc2,0xb4,0xa9,0xc6, +0xb3,0x22,0x74,0x6, 0x12,0x4b,0x7, 0x7d,0x3, 0x6c,0x11,0x22,0x12,0x4b,0xba,0x7e, +0x35,0x36,0x12,0x9f,0x49,0xa9,0xd2,0xb4,0xd3,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6, +0x7c,0xa5,0xa, 0x44,0xf5,0x39,0x7f,0x21,0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12, +0x4b,0xe5,0xe5,0x3a,0x12,0x4b,0xe5,0xe5,0x39,0x12,0x4b,0xe5,0xe5,0x38,0x12,0x4b, +0xe5,0xe4,0x2, 0x4b,0xe5,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22, +0xa9,0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1,0xea,0x74,0xa5,0x7a,0xb3,0x39,0xc, 0x22, +0xe4,0x7a,0xb3,0x37,0xaa,0x7e,0x8, 0x33,0x9, 0x12,0x4f,0xf4,0x7e,0x8, 0x33,0x47, +0x7e,0x34,0x0, 0x3e,0x12,0x17,0x4e,0x7e,0x18,0x33,0x9, 0x7a,0x1d,0x14,0x12,0x4c, +0x31,0x2, 0x4c,0x24,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0xaa,0xf5,0x91, +0x22,0x2, 0x4c,0x34,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0xd2, +0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5,0x1, 0x6c,0xaa,0xe5, +0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0x7f,0x86,0xb, 0xa0,0xbe,0xa0,0xd, +0x40,0xed,0xc2,0xc9,0x22,0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, +0x12,0x7b,0x4e,0xa9,0xd0,0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x3d,0x1, 0xa9,0xc2, +0xea,0x75,0xc1,0x6, 0x75,0xc2,0xc, 0xd2,0x3, 0x12,0x3f,0xfc,0xa9,0xc1,0xc4,0xa9, +0xd2,0xc4,0xa9,0xc2,0xe1,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb,0xd2,0x3, +0x12,0x4f,0xe2,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, 0xa9,0xd0, +0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74,0x41,0x12, +0x3c,0xc5,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda,0xf8,0x22, +0x7e,0x23,0x2b,0x2e,0x7e,0x33,0x37,0xdb,0xac,0x23,0x2e,0x14,0x1, 0xf4,0xbe,0x14, +0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, 0xa, 0x7e,0x63,0x2b,0x2f,0xbe,0x14,0xf, 0x3c, +0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe,0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x2, 0x74, +0x1, 0x7a,0xb3,0x2b,0x2f,0x7e,0x73,0x2b,0x2f,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e, +0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c,0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10, +0x7, 0x7e,0x1f,0x33,0xdf,0x69,0x51,0x0, 0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e, +0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e, +0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, 0x15,0xc8,0x7e,0xa3,0x0, 0x61,0xbe,0xa0, +0xff,0x68,0x48,0xbe,0xa3,0x3, 0xfe,0x68,0x42,0x74,0x5, 0xa4,0x12,0x4f,0x7b,0x12, +0x4d,0xac,0x12,0x4f,0x72,0x12,0x4d,0xac,0x12,0x4f,0x69,0x12,0x5d,0xed,0x50,0x9, +0x7e,0xb3,0x0, 0x61,0x12,0x4f,0xfd,0x80,0x6, 0x12,0x4d,0xac,0x12,0x4f,0x60,0x12, +0x4d,0xb8,0x12,0x4f,0x59,0x7e,0x73,0x2b,0x33,0xa, 0x37,0x7e,0xf, 0x33,0xe7,0x79, +0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x61,0x7a,0x73,0x3, 0xfe,0x22,0x7e,0xa3,0x0, 0x61, +0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x2e,0x12,0x4c,0xe0,0x7a,0x37,0x2b,0x3a,0x22, +0x12,0x4d,0xb4,0x30,0xc, 0xc, 0xc2,0xc, 0x12,0x98,0xe2,0x30,0x3, 0x4, 0xe4,0x12, +0xa, 0x66,0x30,0x3, 0x9, 0x12,0x98,0x95,0x12,0x97,0xf3,0x2, 0x4f,0x84,0x22,0x7e, +0xb, 0x70,0x7a,0x73,0x2b,0x2e,0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b,0x81,0x29,0x70, +0x0, 0x1, 0x7a,0x73,0x2b,0x33,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b,0x3f,0x12,0x4d, +0xb8,0x12,0x4f,0x59,0xd2,0x3, 0xc2,0x4, 0x2, 0x40,0xf2,0xca,0xf8,0x7c,0xfb,0x74, +0x5, 0xac,0xbf,0x12,0x4f,0x7b,0x12,0x4f,0x72,0x12,0x4f,0x60,0x12,0x4f,0x69,0x7a, +0xf3,0x0, 0x61,0x7c,0xbf,0x12,0x4f,0xfd,0x12,0x4d,0xb8,0x74,0x5, 0xac,0xbf,0x9, +0xb5,0x26,0x37,0x12,0x98,0xc7,0x12,0x19,0x57,0xe4,0x7a,0xb3,0x16,0x91,0x7a,0xb3, +0x36,0xd8,0x7a,0xb3,0x16,0x92,0xda,0xf8,0x22,0x7e,0xb3,0x36,0x62,0x60,0x6, 0x14, +0x7a,0xb3,0x36,0x62,0x22,0x12,0x4f,0x9f,0x7e,0xb3,0x36,0xe9,0x70,0xe, 0x7e,0xb3, +0x39,0xb, 0xb4,0x1, 0x7, 0xe4,0x12,0x4e,0xb, 0x12,0x97,0x13,0x12,0x4f,0x1d,0x12, +0x95,0x6e,0x7e,0xa3,0x36,0xe9,0x7a,0xa3,0x39,0xb, 0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x4e,0xb, 0x22,0xca,0xf8,0x6c,0xff,0x7e,0x73,0x0, 0x61,0xbc,0x7f,0x68,0x2a,0x7e, +0x30,0x5, 0xac,0x3f,0x12,0x4e,0xf9,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0x4f, +0x12,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac, +0x3f,0x12,0x4f,0x7, 0x12,0x17,0x29,0x1b,0xfd,0xb, 0xf0,0xbe,0xf0,0x4, 0x40,0xc7, +0x7e,0x23,0x0, 0x61,0x7e,0x30,0x5, 0xac,0x23,0x12,0x4e,0xf9,0xca,0x39,0x7e,0x23, +0x0, 0x61,0x7e,0x30,0x38,0xac,0x23,0x12,0x4f,0x12,0x12,0x17,0x29,0x1b,0xfd,0x7e, +0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x61,0x7e,0x30,0x8c,0xac,0x23,0x12,0x4f, +0x7, 0x12,0x17,0x29,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, 0x12, +0x4d,0xdf,0x7e,0x34,0x0, 0x38,0x22,0x2e,0x14,0x1, 0x42,0x6d,0x0, 0x7e,0x18,0x3, +0x72,0x22,0x2e,0x14,0x0, 0x62,0x6d,0x0, 0x7e,0x18,0x34,0x0, 0x22,0x12,0x94,0xdf, +0x2, 0x4f,0x23,0x7e,0xb3,0x36,0x65,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x6d,0x7e, +0xb3,0x36,0xdb,0x70,0x3, 0x12,0x97,0x2a,0x7e,0xb3,0x36,0x6d,0xb4,0x1, 0xc, 0x74, +0x3, 0x7a,0xb3,0x34,0xac,0x7e,0x34,0x14,0x0, 0x80,0x9, 0xe4,0x7a,0xb3,0x34,0xac, +0x7e,0x34,0xa, 0x0, 0x7a,0x37,0x2a,0x81,0x22,0x7e,0x8, 0x2a,0x8c,0x2, 0x3, 0x8b, +0x9, 0x75,0x26,0x35,0x7a,0x73,0x2b,0x3e,0x22,0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b, +0x3f,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b,0x33,0x22,0x9, 0x75,0x26,0x33,0x7a, +0x73,0x2b,0x2e,0x22,0x12,0x4f,0x9f,0x6d,0x33,0x7a,0x37,0x36,0xd9,0x6c,0xaa,0x12, +0xa8,0xd0,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xf6,0xe4,0x7a,0xb3,0x36,0x6e,0x22,0x7e, +0x37,0x33,0xf1,0x12,0x4f,0xeb,0x7a,0x37,0x36,0xd9,0x6c,0xaa,0x80,0x24,0xbe,0xa0, +0x4, 0x50,0x27,0xa, 0x3a,0x9, 0x63,0x36,0x72,0xbe,0x60,0x4, 0x50,0x12,0x7e,0x50, +0x2, 0xac,0x5a,0x49,0x42,0x33,0xeb,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x7c, +0xb, 0xa0,0x7e,0xb3,0x36,0x6f,0xbc,0xba,0x38,0xd4,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0xa9,0xd0,0xce,0xa2,0x3, 0xa9,0x95,0xc9,0x22,0x1e,0x34,0x1e,0x34,0x1e, +0x34,0x1e,0x34,0x22,0x7e,0x34,0x0, 0x3e,0x74,0xff,0x2, 0x17,0x4e,0xca,0xf8,0x7c, +0xfb,0x7e,0x34,0x0, 0x38,0xca,0x39,0xac,0x7f,0x2e,0x34,0x0, 0x62,0x6d,0x22,0x7e, +0x8, 0x34,0x0, 0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f, +0x2e,0x34,0x1, 0x42,0x6d,0x22,0x7e,0x8, 0x3, 0x72,0x12,0x17,0x29,0x1b,0xfd,0xda, +0xf8,0x22,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e,0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff, +0x7e,0x8, 0x2b,0x8f,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x2a,0x2d,0x7a,0x37,0x2b, +0x95,0xe4,0x7a,0xb3,0x2b,0x93,0x7a,0xb3,0x2b,0x94,0x7e,0x34,0x0, 0x4, 0xca,0x39, +0x12,0x57,0x9c,0x7e,0x8, 0x25,0xee,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x2b,0x97, +0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2,0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22, +0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93,0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93, +0x7c,0xeb,0x7e,0x73,0x2a,0x93,0xbc,0x7e,0x28,0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe, +0x7a,0xd3,0x2a,0x8c,0x7a,0xe3,0x2a,0x8d,0x7a,0xd3,0x2a,0x90,0x7a,0xe3,0x2a,0x91, +0x7a,0xd3,0x2a,0x92,0x7a,0xe3,0x2a,0x93,0x74,0x1, 0x7a,0xb3,0x2a,0x96,0x7a,0xd3, +0x2a,0x8e,0xa, 0x3e,0x1b,0x34,0x7a,0x73,0x2a,0x8f,0x90,0x60,0x91,0xe4,0x93,0x7a, +0xb3,0x2a,0x97,0x90,0x60,0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x98,0xa, 0x3d,0xca,0x39, +0x7e,0x34,0x60,0x52,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x99,0x12,0x17,0x29,0x1b, +0xfd,0xa, 0x3f,0xca,0x39,0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a, +0xbc,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x40,0x12,0x17,0x29,0x1b,0xfd,0x12,0x52,0x23, +0x12,0x5a,0x8c,0x7a,0xd3,0x2a,0x94,0x7a,0xe3,0x2a,0x95,0x12,0x50,0x32,0x74,0x1, +0x12,0x36,0xf, 0xe4,0x7a,0xb3,0x2b,0x20,0x7a,0xb3,0x2b,0x21,0x12,0x52,0xb9,0x7a, +0x37,0x2b,0x2c,0x74,0x3, 0x7a,0xb3,0x2b,0x22,0xe4,0x7a,0xb3,0x2b,0x23,0x74,0x2, +0x7a,0xb3,0x2b,0x24,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2b,0x26,0x74,0x4, 0x7a,0xb3, +0x2b,0x25,0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x28,0x7e,0x34,0x20,0x5f,0x7a,0x37, +0x2b,0x2a,0x74,0x20,0x7a,0xb3,0x2b,0x81,0x74,0x1, 0x7a,0xb3,0x2b,0x2f,0x74,0x20, +0x7a,0xb3,0x2b,0x30,0x74,0x4, 0x7a,0xb3,0x2b,0x32,0x74,0x38,0x12,0x4d,0xb4,0xe4, +0x7a,0xb3,0x2b,0x3c,0x7a,0xb3,0x2b,0x3d,0x7e,0x34,0x1, 0xf4,0x7a,0x37,0x2b,0x38, +0x74,0x1, 0x7a,0xb3,0x2b,0x31,0x74,0x60,0x7a,0xb3,0x2b,0x3f,0x74,0x66,0x7a,0xb3, +0x2b,0x3e,0x6d,0x33,0x7a,0x37,0x2b,0x34,0x7a,0x37,0x2b,0x36,0x74,0x2, 0x7a,0xb3, +0x2b,0x33,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x89,0x74,0x4, 0x7a,0xb3,0x2b,0x86, +0x7e,0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x87,0xe4,0x7a,0xb3,0x2b,0x85,0x7e,0x34,0x4, +0x6d,0x7a,0x37,0x2b,0x8b,0x74,0x1, 0x7a,0xb3,0x2b,0x82,0x74,0x5, 0x7a,0xb3,0x2b, +0x83,0xe4,0x7a,0xb3,0x2b,0x84,0x74,0x1, 0x7a,0xb3,0x2b,0x7f,0xe4,0x7a,0xb3,0x2b, +0x80,0x7e,0x34,0x16,0xcb,0x7a,0x37,0x2b,0x8d,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60, +0xfb,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x63,0x12,0x17,0x29,0x1b,0xfd,0xda,0x79, +0xda,0xd8,0x22,0x12,0x57,0x93,0x12,0x52,0x85,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2a,0x99,0x6d,0x0, 0x9, 0xb3,0x2a,0x98,0x12,0x52,0x6c,0xa, +0x3b,0x7d,0x13,0x2e,0x14,0x2b,0x40,0x6d,0x0, 0x9, 0xb3,0x2b,0x3f,0x12,0x52,0x6c, +0xa, 0x1b,0x2e,0x14,0x2a,0x9b,0x12,0x52,0x79,0xe5,0x25,0x12,0x52,0x70,0xa, 0x1b, +0x2e,0x14,0x2b,0x42,0x12,0x52,0x79,0xe5,0x24,0x2, 0x17,0x4e,0x7e,0x34,0x0, 0x2, +0x12,0x17,0x4e,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93, +0xa, 0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a, +0x99,0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x52,0xb1,0x38,0xef,0x12,0x52,0xb1,0x68, +0x7, 0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0, +0x22,0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, +0x2a,0x9, 0xb2,0x2a,0xfb,0x54,0x1, 0x78,0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70, +0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x93,0xbc,0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, +0x2a,0x9, 0xb2,0x2a,0xd8,0xbe,0xb0,0xd, 0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe, +0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80,0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x53, +0x4, 0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x92,0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f, +0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d,0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99, +0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a,0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, +0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26,0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26, +0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x54,0x80,0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d, +0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d,0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9, +0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x72,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7, +0x8, 0x2, 0x5, 0x24,0x12,0x54,0x6d,0xb, 0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3, +0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80,0x19,0x12,0x54,0x76,0xb, 0x3a,0xc0,0x6e, +0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58,0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3, +0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x93,0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe, +0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3,0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x54, +0x65,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12,0x54,0x80,0xb, 0x6a,0xd0,0xbd,0xd8,0x58, +0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d,0x2d,0x7e,0x67,0x2a,0x70,0x7e,0x74,0x0, +0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, 0x90,0x12,0x54,0x6d,0xb, 0x3a,0xc0,0xbd, +0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, 0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x54, +0x76,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c,0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8, +0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12,0x53,0x4, 0x38,0xab,0x7a,0x87,0x7, 0xfc, +0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, 0x12,0x54,0x65,0x2d,0x15,0x6c,0xaa,0x80, +0x14,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0xb, 0x7a,0x90,0xbd,0x9b,0x58, +0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x53,0x4, 0x38,0xe7,0x7a,0xb7,0x8, 0x4, 0xbd,0x8a, +0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32,0x7a,0x37, +0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x93,0x74,0x2, 0xa4,0x22,0x7e,0x74,0x62, +0x27,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d,0x6e,0x22, +0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31,0x7a,0xd, +0x24,0x7e,0x35,0x28,0x7a,0x35,0x2f,0x7e,0xd, 0x24,0x7f,0x13,0x12,0x79,0xff,0x7e, +0x35,0x28,0x7a,0x35,0x2a,0x12,0x54,0x65,0x7e,0xd, 0x24,0x2d,0x15,0x7f,0x13,0x2d, +0x35,0x12,0x5c,0xca,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x6e,0x1e,0x34,0x7a,0x35,0x28, +0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x54,0x8a,0x7e,0x37,0x28,0x99,0xe, +0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x54,0x8a,0x12, +0x54,0xf9,0x12,0x8f,0xfd,0x2, 0x54,0xe8,0xe4,0x7a,0xb3,0x39,0x9, 0x7e,0xb3,0x28, +0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x39,0x9, 0x22,0xca,0x3b,0x7e,0xf3,0x2a,0x8d,0x7e, +0xe3,0x2a,0x8e,0x7e,0xd3,0x2a,0x8f,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e, +0x34,0x7e,0xf, 0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0x90,0x69,0xb, 0xc0,0xbc,0xec, +0x38,0xe9,0xda,0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0x57,0xbe,0x7e,0xb3,0x16, +0x91,0xb4,0x1, 0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc, +0x7a,0x1f,0x6, 0xf8,0x12,0x57,0x8a,0x12,0x55,0x6d,0x12,0x53,0xb, 0x7e,0xb3,0x16, +0x90,0xb4,0x1, 0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85, +0x7a,0x73,0x26,0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26, +0x86,0x7e,0x34,0x0, 0x3, 0xe4,0x12,0x17,0x4e,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, +0x3, 0x12,0x17,0x4e,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85, +0x7a,0xb3,0x26,0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f, +0x12,0x56,0xdb,0x6c,0x55,0x12,0x56,0x33,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b, +0x12,0x56,0xeb,0x6c,0x55,0x12,0x56,0x33,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14, +0x12,0x56,0xbc,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x56,0xc5,0x2e,0x24,0x26, +0x86,0x12,0x56,0xd0,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14, +0x12,0x56,0xbc,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x56,0xc5,0x2e,0x24,0x26, +0x89,0x12,0x56,0xd0,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84, +0xa4,0x7a,0xb3,0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0x56,0xdb,0x7e,0x50,0x1, 0x12, +0x56,0x33,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0x56,0xeb,0x7e,0x50,0x1, +0x12,0x56,0x33,0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3, +0x26,0xf0,0x22,0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80, +0x70,0x7e,0xd0,0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68, +0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d, +0x44,0x69,0xf0,0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, +0x1b,0xb5,0xb, 0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6, +0x0, 0x2, 0x4c,0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff, +0xb, 0xf4,0xbd,0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d, +0xdb,0x7a,0x6b,0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, +0xf0,0xbc,0x4f,0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, +0x7e,0x24,0x0, 0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x8d,0x7e,0x37,0x2a,0x72,0x22,0x7a,0x1d,0x24,0x7e,0xa3, +0x2a,0x8d,0x74,0x2, 0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x8c,0x7e, +0x37,0x2a,0x70,0x22,0x12,0x57,0xf, 0xe4,0x7a,0xb3,0x39,0x8, 0x2, 0x55,0x25,0x12, +0x57,0x73,0x7e,0xb3,0x36,0x6d,0xb4,0x1, 0xc, 0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2a, +0x79,0x7a,0x37,0x2a,0x7b,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x1f,0x7e,0x34,0x1, 0x5e, +0x7a,0x37,0x2a,0x79,0x7e,0x34,0x1, 0x2c,0x7a,0x37,0x2a,0x7b,0x7e,0x34,0x1, 0x90, +0x7a,0x37,0x2a,0x6e,0x7e,0x34,0x1, 0x7c,0x12,0x57,0x81,0x7e,0xb3,0x2a,0x20,0x70, +0x21,0x7e,0x27,0x2a,0x79,0x7d,0x32,0x7e,0x14,0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12, +0x4f,0xeb,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e,0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37, +0x2a,0x79,0x22,0x12,0x57,0xa5,0x2, 0x57,0x79,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2a, +0x6e,0x7a,0x37,0x2a,0x70,0x7a,0x37,0x2a,0x72,0x22,0x7e,0x18,0x5, 0xf8,0x7a,0x1f, +0x6, 0xf4,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22,0x7e,0x34,0x61,0x29, +0x7e,0x24,0x0, 0xff,0x22,0x7e,0x34,0x0, 0xb4,0x7a,0x37,0x2a,0x79,0x7e,0x34,0x0, +0xa0,0x7a,0x37,0x2a,0x7b,0x7e,0x34,0xff,0x60,0x7a,0x37,0x2a,0x7d,0x22,0x6c,0x33, +0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72,0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93, +0x12,0x56,0xc9,0xb, 0x24,0xa, 0x33,0xbd,0x32,0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84, +0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28,0x86,0x7a,0x37,0x28,0x88,0x7a,0x37, +0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f,0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc, +0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d,0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a,0x8c,0x7a,0x73,0x1f,0x73,0x7e,0x73, +0x2a,0x8d,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a,0x7b,0x7a,0x37,0x1f,0x7c,0x7e,0x37, +0x2a,0x7d,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a,0x7f,0x7a,0x37,0x1f,0x80,0x90,0x60, +0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x39,0x9, 0x7a,0x73,0x1f,0x75,0x7e,0x8, +0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, 0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28, +0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85,0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28, +0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88,0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28, +0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53,0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28, +0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e,0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a, +0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91,0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12, +0x2f,0x49,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15,0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25, +0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, 0x30,0x7e,0x23,0x28,0x84,0xbc,0x23, +0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac,0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a, +0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36,0x7c,0x29,0x19,0x25,0x27,0x37,0xb, +0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd,0x22,0xe4,0x7a,0xb3,0x37,0xaa,0x7a, +0xb3,0x37,0xab,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0xac,0x90,0x60,0x51,0xe4,0x93, +0x7a,0xb3,0x37,0xad,0xe4,0x7a,0xb3,0x37,0xae,0x74,0xa, 0x7a,0xb3,0x37,0xaf,0xe4, +0x7a,0xb3,0x37,0xb0,0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3,0x37,0xb3,0x74,0x2d, +0x7a,0xb3,0x37,0xb7,0x74,0x46,0x7a,0xb3,0x37,0xb8,0x74,0x78,0x7a,0xb3,0x37,0xc9, +0x74,0x4, 0x7a,0xb3,0x37,0xca,0xe4,0x7a,0xb3,0x37,0xb6,0x74,0x66,0x7a,0xb3,0x37, +0xcc,0x74,0x60,0x7a,0xb3,0x37,0xcb,0x74,0x2, 0x7a,0xb3,0x37,0xcd,0x74,0x40,0x7a, +0xb3,0x37,0xc8,0xe4,0x7a,0xb3,0x37,0xc3,0x74,0xfa,0x7a,0xb3,0x37,0xc1,0x74,0x1e, +0x7a,0xb3,0x37,0xc2,0x74,0x1, 0x7a,0xb3,0x37,0xc0,0x74,0xc, 0x7a,0xb3,0x37,0xbf, +0x74,0x1, 0x7a,0xb3,0x37,0xc4,0xe4,0x7a,0xb3,0x37,0xc5,0x7a,0xb3,0x37,0xc6,0x7e, +0x8, 0x37,0xce,0x7e,0x34,0x0, 0x2c,0x12,0x17,0x4e,0x74,0x1, 0x7a,0xb3,0x37,0xd9, +0x74,0xf4,0x7a,0xb3,0x37,0xda,0x74,0x19,0x7a,0xb3,0x37,0xdb,0x74,0x38,0x7a,0xb3, +0x37,0xdc,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x57,0x9c,0x7e,0x8, 0x37,0xea,0x12, +0x17,0x29,0x1b,0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xf7,0x74,0x1, 0x7a,0xb3,0x37,0xee, +0x7e,0x34,0x0, 0x28,0xca,0x39,0x7e,0x34,0x61,0xec,0x7e,0x24,0x0, 0xff,0x7e,0x8, +0x26,0x33,0x12,0x17,0x29,0x1b,0xfd,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44,0x0, 0xff, +0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26,0x7a,0x15, +0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12,0x4b,0x63, +0x74,0x2d,0x7a,0xb3,0x36,0xde,0x74,0x28,0x7a,0xb3,0x36,0xdf,0x74,0x11,0x7a,0xb3, +0x36,0xe0,0x7a,0xb3,0x36,0xe1,0x7a,0xb3,0x36,0xe2,0x74,0xa0,0x7a,0xb3,0x36,0xe3, +0x7e,0x34,0x0, 0x6a,0xca,0x39,0x7e,0x34,0x61,0x65,0x7e,0x24,0x0, 0xff,0x7e,0x8, +0x36,0xe4,0x12,0x17,0x29,0x1b,0xfd,0xe5,0x25,0x7a,0xb3,0x37,0xf, 0xe5,0x28,0x7a, +0xb3,0x36,0xfe,0x22,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4,0x12,0x17,0x4e, +0x7e,0x8, 0x26,0x8c,0x7e,0x34,0x0, 0xc8,0x74,0xff,0x12,0x17,0x4e,0x7e,0x8, 0x26, +0xb4,0x7e,0x34,0x0, 0xc8,0x12,0x17,0x4e,0x90,0x60,0x9a,0xe4,0x93,0x7c,0x7b,0x74, +0x9, 0xac,0x7b,0x7e,0x8, 0x27,0x76,0x74,0xff,0x2, 0x17,0x4e,0xca,0xf8,0x7e,0x73, +0x2a,0x97,0xa, 0x47,0x7e,0x73,0x2a,0x90,0xa, 0x57,0x2d,0x54,0x7e,0xa3,0x2a,0x92, +0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x91,0x7e,0xa3,0x2a,0x93,0xbc,0xaf, +0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xd8,0x7e,0x18,0x2a,0x99,0x12, +0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xfb,0x7e,0x18,0x2a,0xbc,0x7c,0xbf,0x12, +0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x8c,0x7e,0xb3,0x2a,0x8d,0xa4, +0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x17,0x4e,0x7f,0x6, 0x7d,0x3f, +0x12,0x17,0x4e,0x7a,0xb3,0x16,0x91,0x22,0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, +0xca,0x3b,0x7a,0x1d,0x29,0x7f,0x30,0x12,0x5f,0xdf,0x7a,0x55,0x31,0x7e,0xb3,0x2b, +0x3c,0xf5,0x2e,0xe4,0x7a,0xb3,0x2b,0x3c,0x7f,0x3, 0x7e,0x1d,0x29,0x12,0x5a,0xd5, +0x12,0x5f,0xa0,0x12,0x47,0xd2,0x75,0x2d,0x0, 0x12,0x45,0x4, 0x30,0xb, 0xfd,0x74, +0x1, 0x12,0x5e,0x32,0x7e,0x14,0x40,0x0, 0x7d,0x21,0x7d,0x7, 0x12,0x5b,0x7c,0x12, +0x5e,0x3a,0x6d,0x33,0x80,0x19,0x7e,0x35,0x2f,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, +0xa, 0x20,0x7e,0xd, 0x29,0x2d,0x13,0x12,0x5f,0xd6,0x7e,0x35,0x2f,0xb, 0x34,0x7a, +0x35,0x2f,0x7e,0x35,0x31,0xbe,0x35,0x2f,0x38,0xdc,0x5, 0x2d,0xe5,0x2d,0xbe,0xb0, +0x1, 0x40,0xb6,0xe5,0x2e,0x7a,0xb3,0x2b,0x3c,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x8c, +0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x38,0x7d,0x71,0x7a,0x25,0x36,0x7a,0x35,0x34,0x12, +0x5d,0xed,0x50,0x77,0x6c,0xcc,0x80,0x11,0x7e,0x73,0x2a,0x8d,0x12,0x5c,0xa2,0x12, +0x5c,0x88,0x7e,0x34,0x34,0x0, 0x12,0x5c,0xab,0x12,0x5c,0xc3,0x38,0xea,0x6c,0xcc, +0x80,0x53,0x7e,0xa3,0x2a,0x8d,0x7c,0x7a,0x12,0x5c,0xa2,0x75,0x3a,0x0, 0x80,0x27, +0x7e,0xb3,0x37,0xbf,0xbe,0xb1,0x3a,0x7e,0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43, +0x3, 0x72,0x80,0x6, 0xac,0x7c,0x49,0x43,0x3, 0x74,0x7e,0x71,0x3a,0x74,0x2, 0xac, +0x7b,0x59,0x43,0x34,0x50,0x5, 0x3a,0x7e,0xb3,0x2a,0x8f,0xbe,0xb1,0x3a,0x38,0xd0, +0x7e,0x34,0x10,0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x5c,0x88,0x7e,0x34, +0x34,0x50,0x12,0x5c,0xab,0xbc,0xdc,0x38,0xa9,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e, +0x73,0x2a,0x8f,0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3, +0x25,0xb8,0x7a,0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73, +0x2b,0x3e,0xa, 0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x67,0x34,0x7e,0x35,0x38,0x7a, +0x37,0x25,0xbe,0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x5c,0x99,0x7a,0xd3,0x25,0xb6,0x7e, +0xb3,0x2b,0x3c,0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34, +0x0, 0x20,0x80,0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x34,0x7a,0x37,0x25, +0xba,0x7e,0x35,0x36,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, +0x25,0xb6,0x12,0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, +0x7a,0xb3,0x25,0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x8d,0x7a,0x73,0x25, +0xb7,0x22,0xac,0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d, +0x3f,0x7a,0x37,0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b, +0xb, 0xc0,0x22,0x7e,0x73,0x2a,0x8e,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50, +0x7e,0x14,0x19,0x35,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x7a, +0x1d,0x2c,0x7e,0x73,0x2a,0x8c,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, +0x12,0x17,0x29,0x1b,0xfd,0x6c,0xdd,0x12,0x5f,0x98,0x7a,0xb3,0x1f,0x34,0x6c,0xcc, +0x80,0x4a,0x12,0x5d,0xa3,0x40,0x43,0x12,0x5d,0x99,0x50,0x3e,0x12,0x5f,0xa9,0xb, +0x1a,0x10,0x7d,0x3f,0x12,0x17,0x80,0x7d,0x3, 0x7d,0x31,0x12,0x17,0x80,0xbd,0x30, +0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e,0x15,0x2a,0x80,0xb, 0x6d,0x0, +0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d,0x31,0x1a,0x26,0x1a,0x24,0x2f, +0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34,0xb, 0xc0,0x12,0x5c,0xc3,0x38, +0xb1,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12,0x7a,0xc9,0x8, 0x2, 0x7d,0x7f, +0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, 0x6d,0xee,0x9e,0xe5,0x2a,0xbd, +0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12,0x5d,0xa3,0x40,0x8, 0x12,0x5d, +0x99,0x50,0x3, 0x12,0x7a,0xb4,0xb, 0xc0,0x12,0x5c,0xc3,0x38,0xec,0xb, 0xd0,0xbe, +0xd0,0x3, 0x50,0x2, 0x81,0xf7,0xda,0x3b,0x22,0x7c,0x1d,0x2e,0x10,0x2d,0xa5,0xe7, +0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xd8,0x7c,0x1d,0x2e,0x10,0x2c,0xa5,0xe7, +0xbc,0xab,0x22,0x7e,0xb3,0x2b,0x3d,0x70,0x1f,0x12,0x1f,0xed,0x12,0x5f,0xe9,0x50, +0xfb,0x12,0x5a,0xf8,0x12,0x5d,0xd9,0x20,0xf, 0x3, 0x12,0x7c,0x51,0x74,0x2, 0x7a, +0xb3,0x2b,0x3d,0xe4,0x7a,0xb3,0x16,0x91,0x22,0x12,0x5d,0xed,0x50,0x3, 0xd2,0xf, +0x22,0xc2,0xf, 0x22,0x12,0x93,0xa6,0x12,0x5d,0xfe,0x2, 0x5d,0xd9,0x7e,0xb3,0x37, +0x5, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xc0,0x70,0x2, 0xc3,0x22,0xd3,0x22,0x7e,0x8, +0x24,0xf2,0x7e,0x34,0x0, 0xc, 0xe4,0x12,0x17,0x4e,0x12,0x5f,0xcd,0x12,0x5f,0xc4, +0xa9,0xd1,0xcb,0x12,0x5e,0x32,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x33,0xf8,0x7a,0x37, +0x24,0xf8,0x7e,0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0x5f,0xb2,0x2, +0xd, 0x7, 0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xa3,0x2a,0x8d,0xa, 0x3a, +0x3e,0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x17,0x4e,0x90,0x60,0x93,0x93,0xa, 0x3b, +0x7e,0xb3,0x2a,0x90,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43,0x6c,0x77, +0x80,0x1d,0xa, 0x27,0x2d,0x24,0x12,0x5f,0xbb,0xb, 0xa, 0x0, 0x7e,0x30,0x2, 0xac, +0x37,0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, 0x70,0xbc, +0xa7,0x38,0xdf,0x22,0x12,0x71,0xfe,0x12,0x74,0xae,0x12,0x5e,0xd0,0x7e,0xb3,0x37, +0x3, 0xb4,0x1, 0x10,0x7e,0x34,0x0, 0x5, 0x7a,0x37,0x28,0xa1,0x7e,0x34,0x0, 0xa, +0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39,0xa, 0x60,0x7, 0x14,0x7a,0xb3,0x39,0xa, 0x80, +0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, 0x12,0x5d,0xe4,0x12,0x4f,0x84,0x12,0x9d,0x7b, +0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12,0xa2,0xcb,0x12,0x5f,0x40,0x2, 0x5e,0xf4,0x22, +0x12,0x9a,0x1a,0x60,0x17,0x12,0x5e,0xed,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x22,0x6c,0xaa,0x7e,0x70,0xc, 0xac,0x7a,0x12,0x97,0x1d,0xbe,0x34, +0x3, 0xe8,0x8, 0x5, 0x12,0xa8,0xd0,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32, +0x36,0x80,0x49,0x12,0x36,0x7c,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x80, +0x7d,0x13,0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e, +0x24,0x36,0x80,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xb7,0x22, +0x7e,0x43,0x2a,0x8d,0x7e,0x53,0x2a,0x8c,0xac,0x54,0x7e,0x17,0x28,0xa1,0x12,0x5f, +0x91,0x6d,0x0, 0x80,0x37,0x7d,0x40,0x3e,0x44,0x7e,0x7f,0x33,0xf8,0x2d,0xf4,0xb, +0x7a,0x30,0xbd,0x13,0x58,0x10,0x7d,0xf4,0x2e,0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d, +0x51,0x1b,0xf8,0x50,0x80,0x14,0x6d,0x55,0x9d,0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44, +0x8, 0xa, 0xb, 0x48,0x50,0x2d,0x51,0x1b,0x48,0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5, +0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22, +0x74,0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d, +0x35,0x22,0x7a,0x37,0x24,0xfc,0x7e,0x8, 0x24,0xf2,0x22,0x3e,0x24,0x7e,0xf, 0x33, +0xf8,0x2d,0x12,0x22,0x7e,0x73,0x2a,0x8c,0x7a,0x73,0x24,0xf2,0x22,0x7e,0x73,0x2a, +0x8d,0x7a,0x73,0x24,0xf3,0x22,0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e, +0xa3,0x2a,0x8d,0x7e,0xb3,0x2a,0x8c,0xa4,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, +0xc3,0x22,0xd3,0x22,0x12,0x5f,0xe9,0x50,0xfb,0x22,0x2, 0x6b,0xe8,0x2, 0x71,0x2d, +0x70,0x8f,0x0, 0xff,0x6d,0x92,0x5a,0xa5,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x32,0x36,0x31,0x1, 0xc, 0x3b,0x32,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x4, 0xfb,0x43,0x33,0x42,0x5f,0x57,0x68,0x69,0x74,0x65,0x5f,0x4c,0x45,0x4e,0x53, +0xd, 0x18,0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, +0x1, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x38,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x4, 0x66,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x60,0x40,0xd, 0x18,0x25,0x18,0x10,0x6, 0x80,0x18,0x10,0x6, +0x78,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x34,0x32,0x1, 0xfb,0x2, 0x28,0x0, +0xdf,0x0, 0xe3,0x5, 0x0, 0x37,0x37,0x1, 0xb8,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0xa0,0x1, 0x18,0x0, 0x8c,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, +0x68,0x6, 0x10,0x14,0x32,0x1, 0xf, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x4, 0xf7,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15, +0x0, 0x3, 0x54,0x1, 0x0, 0x4, 0x1, 0x6d,0x1, 0x14,0x0, 0x5a,0x1, 0x1, 0x12,0x0, +0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27,0x0, 0x1, 0x0, 0x2, 0x1, 0x4, 0x1, 0x90,0x0, +0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96,0x1, 0x2c,0x1, 0x2c,0x4, 0x38,0x2, 0x66,0x60, +0x20,0x20,0x3, 0x5f,0x50,0x20,0x34,0x2, 0x62,0x5d,0x20,0x46,0x2, 0x4b,0x44,0x30, +0x38,0x2, 0x66,0x60,0x20,0x38,0x2, 0x66,0x60,0x20,0x38,0x2, 0x66,0x60,0x20,0x38, +0x2, 0x66,0x60,0x20,0x4, 0x5, 0x10,0x11,0x12,0x13,0x14,0x4, 0x0, 0xd2,0x2, 0x30, +0x32,0x0, 0xc8,0x1, 0x5e,0x0, 0x64,0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, +0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c,0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20, +0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, 0x4, 0x4, 0x6, 0x40,0x1, 0x18,0x1, 0x18,0x1, +0x90,0x1, 0x90,0x1, 0x90,0x1, 0x5e,0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, +0x64,0x0, 0x46,0x0, 0x78,0x0, 0x78,0x0, 0x64,0x1, 0x18,0x1, 0x18,0x14,0x8, 0x0, +0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0,0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, +0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80,0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, +0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8,0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, +0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88,0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, +0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, 0x6, 0x6, 0xc, 0x64,0xc8,0x7f,0x70,0x7e,0x33, +0x2a,0x93,0xa, 0x43,0x7e,0x33,0x2a,0x92,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c,0xab, +0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x17,0x4e,0x7f,0x7, 0xa, 0x3a, +0x2, 0x17,0x4e,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15,0x12, +0x62,0xbc,0x12,0x64,0x26,0x7e,0xe0,0x1, 0x12,0x46,0xbd,0x30,0x18,0xfd,0x74,0x2, +0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x47,0xa9,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac,0xbd, +0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15,0x12, +0x5f,0xd6,0xb, 0xd0,0x7e,0x73,0x2a,0x93,0xa, 0x7, 0x7e,0x63,0x2a,0x92,0xa, 0x16, +0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c,0xbf, +0x2e,0x73,0x2a,0x92,0x12,0x63,0x4c,0xda,0x79,0xda,0xd8,0x22,0xca,0xd8,0xca,0x79, +0x7c,0xf7,0x7f,0x70,0x12,0x64,0x2d,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74,0x2, 0xac, +0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11,0x14,0x78, +0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x15,0x77,0x1b,0x6a,0x30,0xb, 0xd0,0xbc,0xfd,0x38, +0xdc,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b,0x21,0x70,0x41,0x12,0x5f,0xe9,0x50, +0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x47,0xb9,0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, +0xf4,0x7e,0xb3,0x2b,0x91,0x12,0x62,0xe3,0x74,0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, +0x12,0x47,0xb9,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12, +0x62,0xe3,0x74,0x2, 0x7a,0xb3,0x2b,0x21,0xe4,0x7a,0xb3,0x16,0x90,0x22,0xca,0x79, +0x7f,0x51,0x7f,0x40,0x7e,0xa3,0x2a,0x93,0xa, 0x3a,0x7e,0xa3,0x2a,0x92,0xa, 0x7a, +0x2d,0x73,0x7e,0xd, 0x29,0x7c,0x7f,0x12,0x63,0x4c,0xa, 0x3f,0x3e,0x34,0xca,0x39, +0x7e,0x1d,0x29,0x7f,0x4, 0x12,0x17,0x29,0x1b,0xfd,0x7e,0xb3,0x2b,0x20,0xb4,0x1, +0x22,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, +0x20,0x7f,0x4, 0x2d,0x13,0xb, 0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc, +0xfa,0x38,0xe2,0xda,0x79,0x22,0x7e,0x8, 0x2a,0x8c,0x2, 0x0, 0x2e,0x7c,0x7b,0xa5, +0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe, +0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38,0x5, 0x7e,0xa0, +0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, +0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e,0x44,0x14,0x78, +0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xc7,0x7e,0x70,0x4, 0xac,0x7a,0xb, 0x34,0xbe, +0x37,0x37,0xfb,0x40,0x39,0x7e,0x37,0x37,0xfb,0xb, 0x34,0x7a,0x37,0x37,0xfb,0xbe, +0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x31,0x22,0xbe,0x34,0x0, 0x2, 0x78,0x3, +0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25,0x9, 0xb2,0x38, +0xf7,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xd8,0x7e,0x39,0xb0,0x22,0x74,0xff, +0x22,0x70,0x5, 0x7e,0xb3,0x37,0xaa,0x22,0xbe,0xb0,0x3, 0x38,0x15,0x75,0x1b,0x0, +0x30,0xe, 0x6, 0x7e,0x18,0x33,0x9, 0x80,0x4, 0x7e,0x18,0x33,0x47,0x7a,0x1d,0x14, +0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e,0x1d,0x14,0x2d, +0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4,0xd4,0x10,0xb4, +0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xfb,0x80,0x2, 0x15,0x1a,0x2, 0x64,0x74,0xbe, +0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x65,0x58,0xbe,0xb0,0x80,0x40,0xc, 0xbe, +0xb0,0xef,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x5e,0x22,0xb4,0xfc,0x5, 0x7e,0xb3, +0x37,0x5, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60,0x3, 0x4e,0xa0, +0x1, 0x7e,0xb3,0x36,0x6d,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22,0xb4,0xfe,0x5, +0x7e,0xb3,0x2b,0x2e,0x22,0x74,0xff,0x22,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x38,0x0, +0x7e,0x73,0x38,0x0, 0xa, 0x27,0x2e,0x24,0x0, 0x6, 0x12,0x2f,0x8f,0x7c,0xab,0x7c, +0xb7,0x4, 0x7a,0xb3,0x38,0x0, 0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x38,0x0, 0x6d,0x33, +0x7a,0x37,0x37,0xfd,0x75,0x1a,0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0xa9,0x7c,0xba, +0x4, 0x7a,0xb3,0x37,0xa9,0x7a,0xa3,0x36,0xef,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b, +0xca,0xb, 0xc0,0x83,0xc0,0x82,0x12,0x33,0x1, 0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda, +0x1b,0xda,0x2b,0xda,0x7b,0x32,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37, +0xaa,0xc4,0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, +0x60,0x3, 0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x5, 0x22,0x74,0x1, 0x7a,0xb3, +0x37,0x5, 0xe4,0x7a,0xb3,0x37,0xaa,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, +0x7c,0xba,0x12,0x65,0xbd,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, +0x7c,0xb3,0x7c,0x7a,0x12,0x66,0x61,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30, +0xef,0x38,0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x66,0x33,0xa5,0xbb,0x8f,0x3, +0x75,0x19,0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x3c,0x77,0x74,0x1, 0x7a,0xb3, +0x3, 0xff,0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x26,0x2e,0x60,0xfd,0x68,0x21,0x1b, +0x61,0x68,0x1d,0x1b,0x62,0x68,0x19,0x1b,0x61,0x68,0x15,0x1b,0x60,0x68,0x11,0x2e, +0x60,0xa, 0x78,0x4, 0x7a,0x73,0x36,0xdd,0xa, 0x2b,0x19,0x72,0x36,0xde,0xd2,0xd, +0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37,0xfd,0x4d,0x22,0x78, +0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37,0xfd,0x15,0x1a,0x7e, +0x27,0x37,0xfd,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, 0x6, 0x7e,0x34,0x0, +0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0x75,0x1a,0xea,0x22,0x7e,0xb3,0x37, +0xff,0x4, 0x7a,0xb3,0x37,0xff,0xe5,0x19,0xb4,0x1, 0x8, 0xe4,0x7a,0xb3,0x37,0xff, +0x75,0x19,0x0, 0x7e,0x73,0x37,0xff,0x7a,0x73,0x36,0xed,0x22,0x7c,0xab,0x12,0x37, +0xb5,0x7c,0xba,0x12,0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70, +0x99,0x12,0x13,0x2c,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x47,0xf1,0x49,0x35, +0x34,0x3b,0x49,0x15,0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70, +0x0, 0x40,0x15,0xbe,0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a, +0x92,0x7e,0x73,0x2a,0x93,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34, +0x39,0x12,0x67,0x2b,0x28,0xe, 0x12,0x45,0x31,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, +0x74,0x3, 0x80,0x2, 0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0x73,0x34,0x38,0xbe, +0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c,0x7c,0xb9,0x12,0x2d, +0x82,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, 0x5a,0x10,0x1a,0x2, +0x1a,0x0, 0x7e,0x83,0x2b,0x3f,0xa, 0x98,0x6d,0x88,0x7f,0x10,0x7f,0x4, 0x12,0x15, +0x5b,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x94,0xbc,0x89,0x38,0xbc, +0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e,0xb, 0x90,0x7a, +0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12,0x17,0x80,0xe5, +0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x7c, +0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e,0x7b,0x70,0x7a, +0xb, 0x70,0x22,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x75,0x25,0x0, 0x75,0x26,0x0, +0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0x29,0x70,0xf, 0x7e, +0xb3,0x2a,0x25,0x70,0x9, 0x7e,0xb3,0x2a,0x26,0x70,0x3, 0x2, 0x69,0xb9,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x47,0x80,0x4, 0x7e,0x68,0x33,0x9, 0x7f,0x6, 0x12,0x4f,0xf4, +0x7e,0x73,0x2a,0x22,0x7a,0x6b,0x70,0x6c,0xdd,0x21,0x6a,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x69,0xe4,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x21,0x68,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x21,0x68,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x69,0xf4,0x50,0x2, 0x21,0x68,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x6c,0xbc,0x7c,0x28,0x57,0x7e,0xb3, +0x2a,0x27,0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xf5,0x6d,0x22,0x74,0x1, 0x12,0x67,0x81,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xff,0x6d,0x22,0x74,0x10,0x12,0x67,0x81,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xf5,0xf5,0x25,0x9, 0xb3,0x32,0xff,0xf5,0x26,0xa, 0x3c,0x12,0x69, +0xe4,0xb4,0x1, 0x11,0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xf5,0x19,0xb3,0x32,0xff,0x75, +0x25,0x0, 0x75,0x26,0x0, 0x7e,0xb3,0x2a,0x83,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e, +0x90,0x9, 0xac,0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, +0x27,0x75,0x27,0x0, 0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x89,0x54, +0xf, 0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x85,0x49,0xa3,0x33,0x87,0x80,0x9, 0x5, +0x27,0xe5,0x27,0xbe,0xb0,0xa, 0x40,0xdc,0x5e,0xb4,0xf, 0xff,0x5e,0xa4,0xf, 0xff, +0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5,0xbe,0x70, +0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0,0xe5,0x28, +0xa, 0x5b,0x12,0x69,0xec,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e,0x70,0x6, +0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13,0x79,0xa0, +0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26,0x2d,0x3d, +0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x6c,0xbc,0x7d, +0x28,0x2, 0x1, 0xb, 0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x2e,0xb4,0x1, +0x9, 0x7e,0xb3,0x2a,0x26,0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38,0x6, 0x7e, +0xb3,0x2a,0x26,0x60,0xa, 0xb2,0xe, 0x12,0x66,0x9d,0x74,0x1, 0x12,0x26,0x7b,0x7e, +0xb3,0x2a,0x25,0x60,0x5, 0x7f,0x4, 0x12,0x25,0x6e,0xe4,0x7a,0xb3,0x2a,0x29,0x7a, +0xb3,0x2a,0x25,0x7a,0xb3,0x2a,0x26,0x80,0x4, 0xe4,0x12,0x26,0x7b,0x7e,0x34,0x0, +0x5a,0xca,0x39,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x85,0x12,0x17,0x29,0x1b,0xfd, +0x4c,0xff,0x78,0xd, 0x7e,0x8, 0x33,0x85,0x7e,0x34,0x0, 0x5a,0x74,0xff,0x12,0x17, +0x4e,0xda,0x3b,0x22,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x7e,0xb, 0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a, +0x9, 0x74,0x34,0xa1,0xbe,0x73,0x34,0xab,0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa1, +0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22,0xbe,0x73,0x34,0xab,0x40,0x9, 0xbe,0x70, +0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74,0xff,0x19,0xb4,0x34,0xa1,0x80,0x17,0xa, +0x3a,0x9, 0xb3,0x34,0xa1,0xbe,0xb0,0xff,0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa1,0xd3, +0x22,0xe4,0x19,0xb3,0x34,0xa1,0xc3,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53, +0x12,0x69,0xec,0xb, 0x7a,0x20,0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d, +0x52,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, +0x2, 0x69,0x37,0x0, 0x6, 0x7d,0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24, +0x1e,0x24,0x1e,0x24,0x1e,0x24,0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, +0x7c,0x45,0x6c,0x55,0x12,0x4f,0xeb,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, +0x6, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x20,0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x21, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x25,0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0x29,0x7e,0x34,0x0, 0x5a,0xca,0x39,0x7e,0x18, +0x28,0xae,0x7e,0x8, 0x29,0x8, 0x12,0x17,0x29,0x1b,0xfd,0x6c,0xff,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xae,0x12,0x6b,0x4, 0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, +0x49,0x35,0x28,0xb0,0x12,0x6c,0xe2,0x12,0x6d,0xd5,0xb, 0xf0,0xbe,0xf0,0xa, 0x40, +0xdc,0xda,0xf8,0x22,0x7d,0xd3,0x7e,0x44,0x2, 0xd0,0x7e,0xa3,0x2a,0x8e,0x74,0x40, +0xa4,0x7d,0xb5,0x1b,0xb4,0xbe,0xd4,0x0, 0x3f,0x38,0x29,0x7e,0xe4,0x0, 0x3f,0x9d, +0xed,0x7e,0xf4,0x1, 0xfb,0xad,0xef,0x7d,0x3f,0x7d,0x2e,0x12,0x6b,0xe1,0x7f,0x71, +0xbe,0x78,0x0, 0x34,0x40,0x4, 0x7e,0x78,0x0, 0x34,0x7e,0x18,0x0, 0x34,0x9f,0x17, +0x7f,0x71,0x61,0xd3,0x7d,0xcb,0x9e,0xc4,0x0, 0x3f,0xbd,0xcd,0x38,0x24,0x7d,0x5d, +0x9d,0x5c,0x7e,0xf4,0x2, 0x28,0xad,0xf5,0x7d,0x3f,0x7d,0x2e,0x12,0x6b,0xe1,0x7f, +0x71,0xbe,0x78,0x0, 0x32,0x40,0x4, 0x7e,0x78,0x0, 0x31,0x12,0x6c,0xd9,0x2f,0x71, +0x80,0x61,0x7d,0xcb,0xb, 0xc4,0x1e,0xc4,0x7d,0x5c,0x1b,0x54,0xbd,0x5d,0x40,0xc, +0x7d,0xf5,0x9d,0xfd,0x6d,0xee,0x7e,0x14,0x0, 0xdf,0x80,0xa, 0x7d,0xfd,0x9d,0xfc, +0x6d,0xee,0x7e,0x14,0x0, 0xe3,0x7f,0x17,0x12,0x15,0x6c,0x7f,0x71,0x12,0x6b,0xe1, +0x7f,0x71,0xbd,0x5d,0x7d,0x34,0x40,0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17, +0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d,0x22,0x2f,0x71,0xbe,0x78,0x0, 0x34,0x50,0x6, +0x7e,0x78,0x0, 0x34,0x80,0xd, 0x12,0x6c,0xd9,0x7d,0x13,0x6d,0x0, 0xbf,0x70,0x28, +0x2, 0x7f,0x71,0x7d,0x3f,0x22,0x9d,0x32,0x12,0x17,0x80,0x7d,0x13,0x7d,0x30,0xad, +0x31,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4, +0xff,0xfc,0x7c,0xb4,0x12,0x88,0x7d,0x7d,0x3, 0x7e,0x70,0x9, 0xac,0x7e,0x49,0x13, +0x28,0xb0,0xbe,0x14,0x2, 0x60,0x50,0x5, 0x12,0x6c,0xce,0x40,0xb, 0xbe,0x14,0x69, +0xb0,0x28,0x1f,0x12,0x6c,0xce,0x28,0x1a,0x3e,0x4, 0xbe,0x14,0x2, 0x30,0x50,0x5, +0x12,0x6c,0xce,0x40,0xb, 0xbe,0x14,0x69,0xe0,0x28,0x7, 0x12,0x6c,0xce,0x28,0x2, +0x3e,0x4, 0xbe,0x4, 0x1, 0x0, 0x28,0x4, 0x7e,0x4, 0x1, 0x0, 0x74,0x9, 0xac,0xbf, +0x49,0x25,0x29,0x62,0x49,0x33,0x28,0xae,0x12,0x6b,0xd6,0x7d,0x13,0x5d,0x1e,0x7e, +0x70,0x9, 0xac,0x7f,0x49,0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae, +0xbd,0x2f,0x28,0xf, 0x7d,0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58, +0x20,0x80,0xd, 0xbd,0xf1,0x40,0x9, 0x2e,0x34,0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0, +0x74,0x9, 0xac,0xbf,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0, +0x12,0x6b,0xd6,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64, +0x74,0x9, 0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, +0x29,0x64,0x2d,0x13,0x1b,0x8, 0x10,0x80,0x12,0xbd,0x31,0x40,0xe, 0x7e,0x50,0x9, +0xac,0x5f,0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30,0xda,0x79,0x22,0x74,0x9, +0xac,0xbf,0x49,0x25,0x29,0x64,0xbd,0x12,0x22,0x7d,0x34,0x6d,0x22,0x9e,0x18,0x0, +0x32,0x22,0x7d,0xf3,0x9f,0x11,0x7e,0x44,0x5, 0x0, 0x7e,0xa3,0x2a,0x8f,0x74,0x40, +0xa4,0x7d,0xd5,0x1b,0xd4,0xbe,0xf4,0x0, 0x3f,0x38,0x1f,0x7e,0x24,0x0, 0x3f,0x9d, +0x2f,0x7e,0x34,0x1, 0xb8,0x12,0x6d,0xba,0xbe,0x18,0x0, 0x37,0x40,0x4, 0x7e,0x18, +0x0, 0x37,0x7e,0x8, 0x0, 0x37,0x9f,0x1, 0x7f,0x10,0x7d,0x5d,0x9e,0x54,0x0, 0x3f, +0xbd,0x5f,0x38,0x1f,0x12,0x6d,0xcc,0x40,0x1a,0x7d,0x3d,0x9e,0x34,0x0, 0x40,0x12, +0x6d,0xb2,0xbe,0x18,0x0, 0x37,0x40,0x4, 0x7e,0x18,0x0, 0x36,0x12,0x6d,0xc3,0x2f, +0x10,0x80,0x14,0x12,0x6d,0xcc,0x50,0xf, 0x7d,0x3d,0x9e,0x34,0x0, 0x20,0x12,0x6d, +0xb2,0x7d,0x14,0x6d,0x0, 0x2f,0x10,0xbe,0xf4,0x0, 0x3f,0x28,0x54,0xbd,0x5f,0x28, +0x50,0x7d,0xed,0xb, 0xe4,0x1e,0xe4,0x7d,0x5e,0x1b,0x54,0xbd,0x5f,0x40,0x6, 0x7d, +0x35,0x9d,0x3f,0x80,0x4, 0x7d,0x3f,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x0, 0xe0,0x12, +0x15,0x6c,0x12,0x6d,0xbc,0xbd,0x5f,0x7d,0x14,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d, +0x0, 0x9f,0x1, 0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0xbe,0x18,0x0, +0x37,0x50,0x5, 0x7e,0x18,0x0, 0x37,0x22,0x12,0x6d,0xc3,0xbf,0x10,0x28,0x2, 0x7f, +0x10,0x22,0x7d,0x2f,0x9d,0x23,0x7e,0x34,0x1, 0xba,0xad,0x23,0x7c,0x76,0x7c,0x65, +0x1a,0x24,0x22,0x7d,0x14,0x6d,0x0, 0x9e,0x8, 0x0, 0x37,0x22,0x7d,0xed,0x9e,0xe4, +0x0, 0xb, 0xbd,0xef,0x22,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0xa, 0x22,0xca,0xd8, +0xca,0x79,0x7e,0x44,0x5, 0x0, 0x6c,0xff,0x7e,0x70,0x9, 0xac,0x7f,0x9, 0xe3,0x29, +0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7d,0x24,0x2e,0x24,0x0, 0x14,0xbd,0xc2, +0x40,0x3f,0x49,0xd3,0x29,0x8, 0x7d,0x3d,0x12,0x92,0x3a,0x7c,0xdb,0xbe,0xd0,0x3, +0x40,0xe, 0x7d,0x34,0x1b,0x34,0x12,0x6d,0xd5,0x7c,0xbe,0x12,0x6e,0x6c,0x80,0x40, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x34,0x60,0xc5,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xd0, +0x74,0x9, 0xac,0xbf,0x59,0xd5,0x29,0x8, 0x7e,0x34,0x7, 0xd0,0x12,0x6d,0xd5,0x80, +0x1f,0xbd,0xc4,0x40,0x1b,0x7d,0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c, +0xbe,0x12,0x6e,0x6c,0x7d,0xc4,0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, +0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0x81,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0x8, +0x29,0xbc,0xbe,0xa0,0xa, 0x50,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0, +0xb4,0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31, +0x7d,0x20,0x39,0xb1,0x0, 0xa, 0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x7e, +0x70,0xff,0x12,0x71,0x23,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4, +0x1f,0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xe2,0x7e,0x73,0x2a, +0x20,0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x3, 0x2, 0x70,0x99,0x6c,0xaa, +0x7e,0x44,0x7f,0xff,0x12,0xa9,0x2d,0x79,0x40,0x0, 0x14,0x12,0x71,0x1a,0xb, 0xa0, +0xbe,0xa0,0xa, 0x78,0xeb,0x2, 0x70,0x99,0x7e,0xb3,0x34,0x4f,0x70,0x3e,0xbe,0x70, +0x0, 0x28,0x39,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae, +0x12,0xa9,0x2d,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79, +0x30,0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, +0xa0,0x7e,0xb3,0x2a,0x20,0xbc,0xba,0x38,0xce,0x2, 0x70,0x99,0x6c,0xaa,0x12,0x25, +0xa9,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xe4,0x6c,0xaa,0x80,0x3b,0x6c,0xff, +0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe,0x34,0x7f, +0xff,0x68,0x1d,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x14,0x12,0xa9,0x73,0x59, +0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0xa8,0xde,0x80,0x7, +0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xc9,0xb, 0xa0,0x7e,0xb3,0x34,0x4f,0xbc,0xba,0x38, +0xbd,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x46,0xb4,0xff,0x17,0x6c,0xff,0xa, 0x4f, +0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x5, 0x12,0xa8,0xde,0x80,0x7, 0xb, 0xf0,0xbe,0xf0, +0xa, 0x40,0xeb,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xd9,0x6c,0xaa,0x80,0x1a,0x7e,0x70, +0x9, 0xac,0x7a,0x49,0x43,0x28,0xae,0x12,0xa9,0x73,0x59,0x42,0x15,0x76,0x49,0x33, +0x28,0xb0,0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x20,0xbc,0xba,0x38,0xde, +0x7e,0x34,0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42, +0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e, +0x7e,0x73,0x2a,0x20,0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c, +0xaa,0x80,0x57,0x7e,0x70,0xff,0x6c,0xff,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0xbe,0xf0,0xa, 0x40,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x71,0x23,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x71,0x1a,0xb, 0xa0,0x7e,0x63,0x2a,0x20,0xbc,0x6a, +0x38,0xa1,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68,0x13,0x12, +0x25,0xa9,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c,0x79,0x41, +0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xdb,0x7e,0xf3,0x2a,0x20,0x7a,0xf3,0x34, +0x4f,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2c,0x12,0x71,0x13,0x29, +0xb1,0x0, 0xa, 0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0x12,0x71,0x13,0x29, +0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x32,0xa5,0xbb,0x0, +0x2e,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x27,0x12,0x71,0x13,0x29,0xb1,0x0, 0xa, 0xbe, +0xb0,0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e, +0x30,0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0x12, +0x71,0x13,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0x93, +0xda,0xf8,0x22,0xa, 0x3a,0x2d,0x3d,0x7d,0x2c,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40, +0x0, 0x28,0x22,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x72,0x28,0xb2,0x22,0xca,0x79,0x6c, +0xff,0x7e,0xd7,0x2a,0x79,0x6c,0xee,0x80,0x35,0x7c,0xbe,0x12,0x71,0x7e,0xbd,0x3d, +0x48,0x2a,0x7c,0xbe,0x12,0x1f,0xd4,0x60,0x23,0x7e,0xc4,0x0, 0x9, 0xca,0xc9,0x7e, +0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e,0x30,0x9, 0xac,0x3f,0x2e, +0x14,0x28,0xae,0x6d,0x0, 0x12,0x17,0x29,0x1b,0xfd,0xb, 0xf0,0xb, 0xe0,0x12,0x77, +0xc0,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x20,0xda,0x79,0x22,0x7c,0xab, +0x7e,0x70,0x2, 0xac,0x7a,0x12,0x8c,0x99,0x2, 0x1e,0x80,0xca,0x79,0x6c,0x88,0x80, +0x65,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x12,0x77,0xed,0x7c,0xbf,0x12,0x91, +0xb9,0x50,0x51,0x6c,0xee,0x80,0x48,0xbc,0xe8,0x68,0x42,0x7e,0x70,0x2, 0xac,0x7e, +0x12,0x8e,0xca,0x6c,0x99,0x7e,0xb3,0x2a,0x8f,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, +0x2f,0xe5,0x25,0xa, 0x3b,0x12,0x2d,0x16,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, +0x78,0x1b,0x7c,0xbe,0x12,0x71,0x7e,0x7d,0xf3,0x7c,0xb8,0x12,0x71,0x7e,0xbd,0x3f, +0x8, 0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x2f,0x4c,0xb, 0xe0,0x12, +0x77,0xc0,0x38,0xb3,0xb, 0x80,0x12,0x77,0xe6,0x38,0x96,0xda,0x79,0x22,0xca,0xd8, +0xca,0x79,0x7e,0xa3,0x2a,0x8d,0x7e,0x47,0x28,0x99,0xe4,0x7a,0xb3,0x28,0xa6,0x7e, +0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73,0x28,0x85,0xbe,0x70,0x0, 0x28, +0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0x27,0x36,0x9, 0xe2, +0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a, +0x72,0xbd,0x12,0x58,0x19,0x12,0x76,0x55,0x49,0x12,0x4, 0xfc,0x6d,0x22,0x9e,0x27, +0x2a,0x70,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa6,0x80,0x6, 0xb, 0xf0, +0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e,0xb3,0x26,0x83,0x70,0x40,0x12, +0x74,0xa6,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0x26, +0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x76,0x55,0x49,0x2, 0x5, 0x7a,0x6d,0x11,0x9d,0x14, +0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49,0x20,0x5, 0x7a,0xbd,0x21,0x58, +0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc9,0x12, +0x9a,0xea,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28,0x88,0x2e,0x37,0x28,0x86,0xbe, +0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x74,0x1, 0x7a,0xb3,0x28, +0xaa,0x6c,0xff,0x80,0x1f,0x12,0x73,0x10,0x49,0x25,0x25,0xf7,0x7d,0x43,0x9d,0x42, +0x7d,0x34,0x12,0x17,0x80,0xbe,0x37,0x28,0x9d,0x8, 0x7, 0xe4,0x7a,0xb3,0x28,0xaa, +0x80,0x7, 0xb, 0xf0,0x12,0x73,0x1a,0x38,0xdc,0x6c,0xff,0x80,0x9, 0x12,0x73,0x10, +0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x73,0x1a,0x38,0xf2,0xda,0x79,0xda,0xd8,0x22, +0x7c,0xbf,0x12,0x71,0x7e,0x74,0x2, 0xac,0xbf,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f, +0x22,0xca,0xd8,0xca,0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x4a,0xe4,0x7a,0xb3, +0x1f,0x58,0xe5,0x1d,0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60, +0xa, 0x7e,0x87,0x7, 0xfa,0xbe,0x84,0x1, 0x18,0x58,0xa, 0xc2,0x10,0x6d,0x88,0x7a, +0x87,0x38,0xb, 0x81,0x44,0x12,0x82,0xea,0x60,0x10,0x7e,0x84,0x0, 0x64,0x7a,0x87, +0x38,0x1, 0x7e,0x84,0x0, 0x32,0x7a,0x87,0x38,0xb, 0x7e,0x87,0x38,0x1, 0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x76,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x76,0x7b,0x7e,0x8, 0x1f,0x52,0x7c,0xbd,0x7c,0x7e,0x12,0x81, +0xa5,0x7d,0x93,0x7e,0x87,0x38,0xb, 0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0xb, 0x7e, +0x87,0x38,0x4a,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x4a,0xe5,0x1d,0xbe,0xb0,0x5, +0x38,0x1f,0x7e,0x8, 0x38,0xd, 0x12,0x76,0xd4,0x50,0x7, 0x12,0x76,0x67,0xd2,0x3, +0x80,0x2e,0x7e,0x8, 0x38,0xd, 0x7e,0x18,0x1f,0x52,0x12,0x83,0x3c,0x50,0x21,0x80, +0xf, 0xbe,0x94,0x0, 0x32,0x40,0x19,0x7e,0x8, 0x1f,0x52,0x12,0x7f,0xcb,0x50,0x10, +0x12,0x76,0x67,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52,0x12,0x82,0xc4,0xd2,0x3, +0xb, 0xf0,0x12,0x73,0x1a,0x38,0x85,0x30,0x3, 0x30,0x6c,0xff,0x80,0x1c,0x12,0x76, +0x7b,0x7e,0x8, 0x1f,0x58,0x12,0x76,0xd4,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34, +0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x76,0xb0,0xb, 0xf0,0x12,0x73,0x1a,0x38,0xdf,0x75, +0x1d,0x0, 0x7e,0x34,0x0, 0x64,0x7a,0x37,0x38,0x1, 0x7e,0x63,0x1f,0x58,0x7e,0x70, +0x6, 0xac,0x67,0xb, 0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x38,0xd, 0x12, +0x17,0x29,0x1b,0xfd,0x7e,0x37,0x38,0x1, 0x4d,0x33,0x78,0x34,0x7e,0x37,0x38,0xb, +0xbe,0x34,0x0, 0x32,0x40,0x3e,0x7e,0x37,0x38,0x4a,0xbe,0x34,0x0, 0x19,0x40,0x34, +0x90,0x60,0x51,0x12,0x76,0x5e,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, 0x24, +0x90,0x60,0x50,0x12,0x76,0x5e,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, 0x14, +0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x76,0xb0,0xb, 0xf0,0x12,0x73,0x1a,0x38,0xf4, +0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x38,0xb, 0xa2,0x3, 0x92,0x10,0x12,0x77, +0xcf,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0xca,0xf8, +0x7e,0xf0,0x1, 0x7e,0xb3,0x2f,0xc8,0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f, +0xc8,0x12,0xa8,0xb4,0x7e,0x44,0x1, 0x18,0x7e,0xd4,0x0, 0xb4,0xe4,0x7a,0xb3,0x28, +0xac,0x12,0x5e,0xed,0x7e,0xc4,0xfe,0x5c,0x7e,0x57,0x7, 0xfe,0xbe,0x54,0xfc,0xb8, +0x58,0x15,0x7e,0x57,0x7, 0xfc,0xbd,0x5c,0x58,0xd, 0x12,0x76,0x70,0x8, 0x8, 0x12, +0x91,0xcb,0x60,0x3, 0x12,0x76,0x9f,0x12,0x91,0xcb,0xa, 0x5b,0x4d,0x55,0x68,0x3b, +0x6d,0x55,0x9d,0x54,0xbe,0x57,0x7, 0xfe,0x18,0x6, 0xbe,0x57,0x7, 0xfc,0x8, 0x2b, +0x12,0x76,0x70,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12,0x17,0x80,0xbe,0x37,0x28,0x8a, +0x8, 0x19,0x12,0x74,0xa6,0x28,0x14,0x7e,0x73,0x28,0x85,0xbe,0x70,0x1, 0x28,0xb, +0x7e,0xc7,0x7, 0xfa,0xbd,0xc4,0x58,0x3, 0x12,0x76,0x9f,0x12,0x93,0xe5,0x40,0x5, +0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x76,0x4d,0x68,0x6, 0x7e,0xb3,0x39,0x6, 0x60,0x7, +0xe4,0x7a,0xb3,0x28,0xad,0x80,0x71,0x12,0x74,0xa6,0x28,0x5, 0xe4,0x7a,0xb3,0x28, +0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x94,0x23,0x50,0xa, 0x12,0x5e, +0xed,0x12,0x92,0xea,0x7c,0xfb,0x80,0x21,0x7e,0xb3,0x26,0x84,0x70,0x1b,0x7e,0xb3, +0x26,0x85,0x70,0x15,0x12,0x74,0xa6,0x28,0x10,0x12,0x76,0x4d,0x68,0x5, 0x12,0x9a, +0x1a,0x60,0x6, 0x7e,0xf0,0x3, 0x12,0x5e,0xed,0x7e,0xc7,0x7, 0xfa,0xbe,0xc4,0x5, +0xdc,0x8, 0x17,0x12,0x74,0xa6,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7,0x28,0x8e, +0x58,0x8, 0x12,0x76,0x88,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0xcf,0x7a,0xc7,0x28,0xa1, +0x74,0x2, 0xac,0xbf,0x7a,0x57,0x28,0xa3,0x12,0x76,0x4a,0x50,0xd, 0xe4,0x7a,0xb3, +0x28,0xad,0x12,0x74,0xa6,0x28,0x3, 0x12,0x76,0x88,0x7e,0xc7,0x28,0x8a,0xbd,0xcd, +0x8, 0x1f,0x7e,0x24,0x0, 0x2, 0x7d,0x3d,0x12,0x15,0x29,0x6e,0x34,0xff,0xff,0xb, +0x34,0xbe,0x37,0x28,0x8e,0x58,0xa, 0x12,0x76,0x4a,0x50,0x5, 0xe4,0x7a,0xb3,0x28, +0xad,0x12,0x8d,0xd1,0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac, +0xb4,0x1, 0x9, 0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x20,0x12,0x93,0x4d,0x7e, +0xb3,0x2f,0xc9,0xbe,0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xc9,0x70,0x18,0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x77,0xc7,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a, +0xb3,0x28,0x84,0x7a,0xb3,0x26,0x83,0xda,0xf8,0x22,0xa2,0x13,0x22,0x7e,0xb3,0x28, +0xa8,0xbe,0xb0,0x1, 0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0xe4,0x93, +0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22, +0x6d,0x55,0x9e,0x57,0x2a,0x79,0xbe,0x57,0x28,0x8e,0x22,0x74,0x2, 0xac,0xbf,0x9, +0xd5,0x26,0xfa,0x9, 0xe5,0x26,0xfb,0x22,0xe4,0x7a,0xb3,0x2f,0xc9,0x7a,0xb3,0x28, +0xac,0x74,0x2, 0x2, 0x76,0x96,0x7a,0xb3,0x2b,0x21,0x7a,0xb3,0x2b,0x3d,0x22,0x74, +0x2, 0x7a,0xb3,0x2f,0xc9,0xe4,0x7a,0xb3,0x2f,0xc8,0x12,0x77,0xc7,0x2, 0x76,0x96, +0x7c,0xab,0x7e,0xb3,0x39,0x6, 0x70,0x1b,0x7e,0xb3,0x28,0xa8,0x70,0x15,0x12,0x77, +0xf5,0x68,0x10,0x7e,0xb3,0x2a,0x8a,0xbe,0xb0,0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77, +0x2, 0x2f,0x4c,0x22,0x7c,0xbd,0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30, +0x7e,0x50,0x6, 0xac,0x5a,0x7f,0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc, +0xb6,0x40,0x1b,0x7e,0x7b,0xb0,0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7, +0x40,0xc, 0x29,0xb7,0x0, 0x1, 0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0, +0x7e,0xb, 0xb0,0xbc,0xba,0x38,0xc9,0xa2,0x4, 0x22,0xca,0xf8,0x7e,0xd4,0x0, 0x9, +0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, 0x80,0x7d,0xbe,0xb0, +0x2, 0x38,0x72,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27,0x7e,0x73,0x26,0xfa, +0x12,0x1f,0xf4,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26,0xfd,0xa, 0x27,0x7e, +0x73,0x26,0xfb,0x12,0x1f,0xf4,0xbe,0x34,0x0, 0x5, 0x58,0x2, 0x80,0x5a,0x6c,0xff, +0x80,0x3c,0x7c,0xbf,0x12,0x8f,0xdc,0x1a,0x4b,0x7c,0xbf,0x12,0x71,0x7e,0x7d,0xc3, +0xbe,0xc4,0x3, 0xe8,0x58,0x4, 0x7e,0xd4,0x0, 0x8, 0x7d,0x5d,0x3e,0x54,0xbd,0x54, +0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d,0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, +0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75,0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x73, +0x1a,0x38,0xbf,0x80,0x6, 0xe5,0x1e,0x24,0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, +0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, 0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22, +0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0x74,0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x30, +0x10,0x13,0x12,0x76,0x4d,0x68,0x6, 0x7e,0xb3,0x39,0x6, 0x60,0x8, 0x7e,0x34,0xb, +0xb8,0x7a,0x37,0x38,0x9, 0x22,0x7e,0x73,0x28,0x84,0xbc,0x78,0x22,0x9, 0x75,0x26, +0xfb,0x7a,0x71,0x24,0x22,0x7e,0xb3,0x37,0x2e,0xbe,0xb0,0x1, 0x22,0x7d,0x13,0x7d, +0x32,0x6d,0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x15,0x75,0x7d, +0x53,0xbe,0x54,0x0, 0xff,0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0xca,0xf8,0x7e,0xf3, +0x2a,0x8f,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a, +0xb3,0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x8e,0x7a,0x73,0x1f,0x36,0x7a, +0xf3,0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12, +0x78,0x71,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33, +0x1f,0x36,0x6d,0x0, 0x12,0x15,0x77,0xa, 0x1f,0x6d,0x0, 0x12,0x15,0x77,0xda,0xf8, +0x22,0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15, +0xa8,0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a, +0x8e,0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x8f,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a, +0x7b,0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x7d,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a, +0x7f,0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e, +0x8, 0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27, +0x1f,0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12, +0x47,0xd9,0x7e,0x1f,0x38,0xef,0x7a,0x1d,0x27,0x7e,0xb3,0x2a,0x93,0xf5,0x2e,0x7e, +0xb3,0x38,0x8e,0xb4,0x1, 0x6, 0x7e,0x38,0x38,0x90,0x80,0x4, 0x7e,0x38,0x5, 0xf8, +0x6d,0x33,0x7a,0x35,0x2b,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x8f,0x70,0xe, +0x7e,0xb3,0x38,0x8d,0x70,0x8, 0x74,0x1, 0x7a,0xb3,0x38,0x8f,0x21,0x9e,0x7e,0xb3, +0x38,0x8f,0x70,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x8f,0x7e,0xb3,0x38,0x8e,0xb4,0x1, +0x14,0x75,0x2d,0x0, 0x80,0x6, 0x12,0x79,0xe0,0x12,0x79,0xee,0xe5,0x2e,0xbe,0xb1, +0x2d,0x38,0xf3,0x80,0x18,0x75,0x2d,0x0, 0x80,0xc, 0x12,0x79,0xe0,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x79,0xee,0xe5,0x2e,0xbe,0xb1,0x2d,0x38,0xed,0x7e,0x34,0x1, +0x18,0x7a,0x35,0x2f,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0x79,0xff,0x75,0x2d,0x0, +0x80,0x10,0x12,0x79,0xd3,0xbe,0x35,0x2b,0x8, 0x6, 0x12,0x79,0xd3,0x7a,0x35,0x2b, +0x5, 0x2d,0xe5,0x2e,0xbe,0xb1,0x2d,0x38,0xe9,0x12,0x79,0xcb,0x40,0x25,0x7e,0xb3, +0x38,0x8e,0xb4,0x1, 0x1e,0x5, 0x1c,0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c, +0x0, 0xe5,0x2e,0xa, 0x3b,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x27,0x7f,0x3, 0x12,0x17, +0x29,0x1b,0xfd,0x74,0x2, 0x12,0x0, 0x1e,0x12,0x79,0xcb,0x50,0xb, 0x74,0x2, 0x7a, +0xb3,0x38,0xee,0xe4,0x7a,0xb3,0x38,0x8f,0xda,0x3b,0x22,0x7e,0x37,0x2b,0x26,0xbe, +0x35,0x2b,0x22,0x7e,0xa1,0x2d,0x74,0x2, 0xa4,0x49,0x35,0x1f,0x34,0x2, 0x17,0x80, +0x7e,0xa1,0x2d,0x74,0x2, 0xa4,0x7f,0x13,0x2d,0x35,0xb, 0x1a,0x20,0x22,0x7e,0xd, +0x27,0x2d,0x15,0xb, 0xa, 0x30,0x9d,0x32,0x59,0x35,0x1f,0x34,0x5, 0x2d,0x22,0xca, +0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x8d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f, +0x16,0x7f,0x5, 0x12,0x17,0x29,0x1b,0xfd,0x6c,0xdd,0x12,0x5f,0x98,0x7a,0xb3,0x1f, +0x6c,0x6c,0xcc,0x80,0x45,0x12,0x7a,0xa3,0x78,0x3e,0x12,0x5f,0xa9,0xb, 0x1a,0xe0, +0x7d,0x3f,0x12,0x17,0x80,0x7d,0x13,0x7d,0x3e,0x12,0x17,0x80,0xbd,0x31,0x58,0x2, +0x7d,0xfe,0xbe,0xe5,0x2f,0x8, 0x5, 0x7e,0xe5,0x2f,0x80,0xb, 0x6d,0x33,0x9e,0x35, +0x2f,0xbd,0x3e,0x8, 0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e, +0xb3,0x1f,0x6c,0x4, 0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x8f,0xbc,0x7c, +0x38,0xb3,0x7e,0x73,0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0x7a,0xc9,0x8, 0x2, 0x7d, +0x7f,0x6c,0xcc,0x80,0xa, 0x12,0x7a,0xa3,0x78,0x3, 0x12,0x7a,0xb4,0xb, 0xc0,0x7e, +0x73,0x2a,0x8f,0xbc,0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0x41,0x1a, +0xda,0x3b,0x22,0xa, 0xec,0x9, 0x7e,0x2a,0xfb,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, +0xed,0xbd,0x3e,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x9d, +0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d,0x0, 0x7f,0x14,0x12, +0x15,0xc8,0x7d,0x73,0x12,0x17,0x80,0x7d,0xe3,0x7d,0x3f,0x12,0x17,0x80,0xbd,0x3e, +0x22,0x74,0xc8,0x7a,0xb3,0x39,0x1, 0xc2,0x17,0x80,0xa, 0x12,0x3e,0xbb,0x30,0x17, +0x4, 0x75,0xe9,0xff,0x22,0x12,0x7b,0x3d,0x68,0xf1,0x22,0x74,0x1, 0x12,0x7b,0x1a, +0x20,0x17,0x6, 0x12,0x7b,0x23,0x12,0x3f,0xe3,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, +0x12,0x7a,0xe1,0x12,0x3f,0xe3,0xe4,0x2, 0x7b,0x1a,0xbe,0xb0,0x8, 0x50,0x3, 0x12, +0x7b,0x4e,0x22,0xd2,0x3, 0x80,0x12,0x30,0x3, 0xc, 0x12,0x7b,0x3d,0x68,0x7, 0xc2, +0x3, 0xc2,0x4, 0x12,0x3d,0xa, 0x12,0x3e,0xbb,0x30,0x17,0xeb,0x22,0x7e,0xb3,0x34, +0x3a,0xbe,0xb0,0x1, 0x22,0x12,0x7b,0x3d,0x68,0xfb,0x20,0x93,0xfd,0x22,0xa, 0x5b, +0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x3f,0x33,0x7e,0x73,0x36,0xdd,0xbe,0x70, +0xff,0x68,0x13,0xbe,0x73,0x37,0x3, 0x68,0xd, 0x7a,0x73,0x37,0x3, 0x74,0xff,0x7a, +0xb3,0x36,0xdd,0x2, 0x3f,0x33,0x22,0x7e,0xb3,0x37,0x3, 0x70,0x2e,0x7e,0x73,0x36, +0xe6,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x2e,0xb4,0x1, 0x3, 0x7e, +0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x7b,0xcc,0x7c,0xab,0xe5,0x60,0xa, +0x3b,0x2e,0x37,0x38,0x8b,0x7a,0x37,0x38,0x8b,0x80,0xc, 0x7e,0xa3,0x36,0xe7,0xbe, +0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x7b,0xbc,0x75,0x60,0x0, 0x7a, +0xb3,0x39,0x1, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x17,0x70,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x22,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b,0x68,0x4f,0x12, +0x7c,0x33,0x7c,0x3b,0x7c,0xb2,0x12,0x7c,0x33,0x7c,0xab,0xbe,0x30,0xff,0x68,0x3e, +0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12,0x7b,0xc6,0xbe, +0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e,0x34,0x16,0x93, +0x6d,0x22,0x30,0x16,0x3, 0x2, 0x7c,0xdf,0x7e,0xb3,0x2b,0x3c,0xb4,0x1, 0xf, 0x12, +0x5f,0xdf,0x7a,0x55,0x29,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x7d,0x10,0x22,0x7e, +0xb3,0x2b,0x2e,0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, 0x62,0x26,0x33, +0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40,0xe9,0x74,0xff, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0x2e,0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x81,0x12, +0x7c,0x33,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0x7e,0x58,0xf5,0x29, +0x7e,0x73,0x2b,0x2e,0xbe,0x71,0x29,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x7b,0xc6,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2a,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x52,0x6d,0x22,0x7a,0x1f,0x37,0x4e,0x7c,0xbc,0x12,0x7d,0x65,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x81,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x81,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x4d,0xc0,0xda,0x3b,0x22, +0x7c,0xab,0x12,0x7f,0x45,0xd2,0x16,0x7c,0xba,0x12,0x7b,0xd5,0xc2,0x16,0x22,0x7c, +0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b,0x7e,0x63,0x2a,0x90,0xa, 0x6, 0x2d,0x1, +0x7e,0x63,0x2a,0x8d,0xa, 0x16,0xad,0x10,0x7d,0x21,0x12,0x5f,0xbb,0xa, 0x26,0x7a, +0x25,0x29,0x74,0x1d,0xac,0x7b,0x2e,0x34,0x37,0x52,0x6d,0x22,0xe4,0x2, 0x7d,0x10, +0x7c,0xab,0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x7d,0x53,0x60,0x5, 0x3e, +0xe4,0x14,0x78,0xfb,0x12,0x7d,0x47,0x2d,0xfe,0x80,0xf, 0x12,0x7d,0x53,0x60,0x5, +0x3e,0xe4,0x14,0x78,0xfb,0x12,0x7d,0x47,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e, +0xf5,0x29,0xbd,0xf4,0x38,0xd0,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, +0x6a,0xf0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61,0x2e,0xd5, +0x29,0x7e,0x6b,0xb0,0x22,0xca,0x3b,0x7a,0xd, 0x2e,0x7c,0xcb,0x7e,0xb3,0x2b,0x3c, +0xf5,0x32,0x7e,0xb3,0x2b,0x2e,0xf5,0x33,0x7e,0xd3,0x2b,0x33,0x7e,0xe3,0x2b,0x3e, +0x7e,0xf3,0x2b,0x3f,0x7e,0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, +0x24,0xf2,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, +0x72,0x7e,0x8, 0x25,0x2a,0x12,0x17,0x29,0x1b,0xfd,0x7c,0xbc,0x12,0x4f,0xfd,0x74, +0x1, 0x7a,0xb3,0x2b,0x3c,0x74,0x5, 0xac,0xbc,0x12,0x4f,0x72,0x74,0x5, 0xac,0xbc, +0x12,0x4f,0x60,0x74,0x5, 0xac,0xbc,0x12,0x4f,0x69,0x74,0x5, 0xac,0xbc,0x9, 0x75, +0x26,0x37,0xbe,0x73,0x2b,0x81,0x68,0x6, 0x7a,0x73,0x2b,0x81,0xd2,0xc, 0xc2,0x3, +0x12,0x7e,0x58,0x12,0x4d,0xc0,0x12,0x44,0xfd,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x14,0x40,0x0, 0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, +0xc8,0x12,0x5b,0x7c,0x12,0x5f,0xdf,0x7a,0x55,0x34,0x7e,0xd, 0x2e,0x7e,0x18,0xd, +0xc8,0x12,0x7e,0xb0,0x12,0x7e,0x61,0xe5,0x32,0x7a,0xb3,0x2b,0x3c,0xe5,0x33,0x7a, +0xb3,0x2b,0x2e,0x7a,0xd3,0x2b,0x33,0x7a,0xe3,0x2b,0x3e,0x7a,0xf3,0x2b,0x3f,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x17,0x29, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x72, +0x12,0x17,0x29,0x1b,0xfd,0xda,0x3b,0x22,0x74,0x5, 0xac,0xbc,0x9, 0xb5,0x26,0x33, +0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, 0x7e,0x73,0x2a,0x90,0xa, 0x17,0x2d,0x10, +0x7e,0xa3,0x2a,0x8d,0xa, 0x3a,0xad,0x13,0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, +0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x33,0xf8,0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, +0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, 0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3, +0x38,0xdc,0x7a,0x35,0x34,0x7e,0xf, 0x37,0x4e,0x7e,0x18,0x25,0xb6,0x2, 0x7e,0xb0, +0xca,0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x7f,0xc2,0x3, 0x6d,0x44,0x80, +0x1e,0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x12,0x7f,0x3f,0xbd,0x3d,0x48,0xd, +0x7d,0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0x7f,0x3f,0x7d,0xd3,0xb, 0x44,0x7e, +0xc5,0x34,0xbd,0xc4,0x38,0xdb,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c, +0xba,0x7d,0x3d,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8, +0x7f,0x10,0x2e,0x35,0x34,0x7a,0x1b,0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54, +0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x7f,0x60,0x2e,0xd5,0x34,0x7e,0x6b,0xb0,0x60, +0x5, 0xe, 0x34,0x14,0x78,0xfb,0x7c,0xb7,0x12,0x7f,0x88,0xb, 0x44,0x7e,0x55,0x34, +0xbd,0x54,0x38,0xd8,0xda,0xf8,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, +0x1a,0x30,0x2, 0x17,0x80,0xa9,0xd1,0xcb,0x74,0x1, 0x2, 0x0, 0xe, 0x12,0x7f,0x45, +0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x8c,0x12,0x7f,0x90,0x12,0x7f,0x69,0x7a,0x37, +0x33,0xf5,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x6d,0x33,0x90,0x60,0x91,0xe4,0x93, +0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xa2,0x30,0x90,0x60,0x92,0xe4,0x93,0xbe,0xb0,0x0, +0x28,0x3, 0x2, 0xa1,0x97,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xb0,0x22, +0x7a,0xb3,0x24,0xf2,0x7e,0x53,0x2a,0x8d,0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa, +0xe4,0x7a,0xb3,0x24,0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24, +0xf6,0x7e,0x34,0x0, 0x20,0x12,0x5f,0xb2,0x2, 0xd, 0x7, 0x7e,0xb3,0x38,0x8e,0x70, +0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x7a,0xb3,0x38,0x8e,0x22,0x7f,0x20,0xc2,0x4, 0x7e, +0x2b,0x60,0x29,0x72,0x0, 0x2, 0x9c,0x76,0x1a,0x37,0x12,0x17,0x80,0x7c,0x27,0x29, +0x72,0x0, 0x1, 0x29,0x32,0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x17,0x80,0x7c,0x37, +0x1a,0x23,0x1a,0x32,0x9d,0x32,0x12,0x17,0x80,0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58, +0x2, 0x7c,0x73,0xbe,0x60,0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x38, +0x1, 0x4d,0x33,0x68,0x2, 0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, +0xca,0x3b,0x7f,0x70,0x7c,0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x8c,0xf5, +0x26,0x7e,0xb3,0x2a,0x8d,0xf5,0x25,0x7e,0xd4,0x0, 0xc8,0x6c,0xff,0x12,0x2e,0xc4, +0xe5,0x26,0xa, 0x1b,0x1b,0x14,0xa, 0xcd,0xbd,0xc1,0x58,0x14,0xe5,0x25,0xa, 0x1b, +0x1b,0x14,0xa, 0xce,0xbd,0xc1,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x1a,0xc0,0xbe,0xc4,0x0, 0xc8,0x8, 0xc, 0x7e,0x17,0x28,0x8a, +0xbe,0x14,0x3, 0x20,0x8, 0x2, 0x21,0x64,0xbe,0xc4,0x0, 0x64,0x8, 0xc, 0x7e,0xc7, +0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x21,0x64,0x6c,0xaa,0x7c,0x8d,0x80,0x1c, +0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8c,0xbc,0xb8,0x8, 0x9, 0x12, +0x81,0x9b,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x80,0x1a,0x2c,0x1a,0x3d, +0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x1, 0x21, +0x64,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3, +0x2a,0x8c,0xbc,0xb8,0x8, 0x9, 0x12,0x81,0x9b,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, +0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a,0xc8,0xbd,0xc3,0x48,0xd8,0xbc, +0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d, +0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8d,0xbc,0xb9,0x8, 0x9, 0x12,0x81,0x9b, +0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90,0x1a,0x2c,0x1a,0x3e,0x9d,0x32, +0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x4, 0x80,0x35,0x6c, +0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8d, +0xbc,0xb9,0x8, 0x9, 0x12,0x81,0x9b,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, +0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18, +0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b,0xb0,0xbc,0xbd,0x40,0x3, 0x7a, +0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, 0x39,0xd7,0x0, 0x2, 0x29,0xb7, +0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, 0x29,0xb7,0x0, 0x3, 0xbc,0xbe, +0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b,0x22,0x7c,0xb8,0x7c,0x79,0x12, +0x1e,0x80,0xbd,0x3d,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f,0x40,0x6d,0xbb,0x7e, +0xa3,0x2a,0x8c,0x7e,0x73,0x2a,0x8d,0x4c,0xcc,0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, +0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c,0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78, +0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14,0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b, +0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12,0x17,0x4e,0x7e,0x73,0x2a,0x8c,0xa, +0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a,0x8d,0xa, 0x37,0x1b,0x34,0x39,0x74, +0x0, 0x1, 0x7c,0xec,0x80,0x1d,0x75,0x24,0x0, 0x7c,0xdf,0x80,0xb, 0x12,0x80,0x1a, +0x70,0xb, 0x5, 0x24,0xb, 0xb4,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf0,0xe5,0x24,0x60, +0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xde,0x7c,0xec,0x80,0x26,0x75,0x24,0x0, 0x1a, +0xaf,0xb, 0xa4,0x7d,0x3a,0x7c,0xd7,0x80,0xb, 0x12,0x80,0x1a,0x70,0xe, 0x5, 0x24, +0xb, 0xb4,0xb, 0xd0,0x7e,0x73,0x2a,0x8c,0xbc,0x7d,0x18,0xed,0xe5,0x24,0x60,0x7, +0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd5,0x12,0x82,0xbb,0x80,0x1d,0x75,0x24,0x0, 0x7c, +0xdf,0x80,0xb, 0x12,0x80,0x1a,0x70,0xb, 0x5, 0x24,0xb, 0xb4,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf0,0xe5,0x24,0x60,0xa, 0xb, 0xe0,0x7e,0x73,0x2a,0x8d,0xbc,0x7e,0x18, +0xdb,0x12,0x82,0xbb,0x80,0x22,0x75,0x24,0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xb, 0x12, +0x80,0x1a,0x70,0xe, 0x5, 0x24,0xb, 0xb4,0xb, 0xd0,0x7e,0x73,0x2a,0x8c,0xbc,0x7d, +0x18,0xed,0xe5,0x24,0x60,0xa, 0xb, 0xe0,0x7e,0x73,0x2a,0x8d,0xbc,0x7e,0x18,0xd6, +0x7d,0x3b,0x39,0x74,0x0, 0x5, 0x7d,0x3b,0xda,0x3b,0x22,0x1a,0xac,0xb, 0xa4,0x7d, +0x3a,0x7c,0xe7,0x22,0x7f,0x60,0x7e,0x6b,0xa0,0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14, +0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, 0x2d,0x15,0xb, 0x14,0x12,0x17,0x29, +0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0,0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x8d, +0x7e,0x73,0x2a,0x8c,0xac,0x76,0x7d,0x13,0x1e,0x14,0x7e,0x27,0x28,0x88,0x2e,0x27, +0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e,0x34,0xbe,0x37,0x28,0x86,0x50,0x29, +0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd, +0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e,0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6, +0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, 0x7c,0xba,0x22,0x7f,0x61,0x7f,0x50, +0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f,0x5, 0x7c,0xb9,0x7c, +0x78,0x12,0x76,0xd8,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76,0x0, 0x3, 0xbc,0x78, +0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9,0xc3,0x22,0x7e,0xa3, +0x2a,0x21,0xbe,0xa0,0x0, 0x38,0x2f,0xbe,0xa3,0x2a,0x20,0x50,0x19,0x7e,0xb3,0x2a, +0x2a,0xbe,0xb3,0x35,0x3c,0x28,0x14,0x7e,0xb3,0x35,0x3c,0x4, 0x7a,0xb3,0x35,0x3c, +0x7a,0xa3,0x2a,0x20,0x80,0x5, 0xe4,0x7a,0xb3,0x35,0x3c,0x7e,0xb3,0x2a,0x20,0x70, +0x5, 0xe4,0x7a,0xb3,0x2a,0x29,0x22,0x12,0x83,0xad,0x2, 0x83,0x6e,0x7e,0xb3,0x2a, +0x20,0x70,0x2d,0x7e,0x73,0x2a,0x21,0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc1, +0x70,0x18,0x12,0x83,0xea,0x7e,0x73,0x2a,0x21,0x7a,0x73,0x2a,0x20,0x74,0x1, 0x7a, +0xb3,0x2a,0x27,0x7e,0xb3,0x34,0xc1,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc1,0x22, +0xe4,0x7a,0xb3,0x34,0xc1,0x7a,0xb3,0x2a,0x27,0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39, +0x7e,0x18,0x35,0xe5,0x7e,0x8, 0x36,0x21,0x12,0x17,0x29,0x1b,0xfd,0x7e,0x73,0x28, +0x94,0x7a,0x73,0x35,0xe4,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7e,0xe3,0x2a,0x20, +0x4c,0xee,0x78,0x20,0x6c,0xff,0x6d,0x11,0x74,0x2, 0xac,0xbf,0x12,0x85,0xb1,0xac, +0x3f,0x19,0xa1,0x34,0xc6,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x35,0x30,0xb, 0xf0,0xbe, +0xf0,0xa, 0x78,0xe2,0x12,0x86,0x15,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e, +0x44,0x3, 0x20,0x6c,0xff,0xa1,0x83,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e, +0xd0,0xf, 0xbe,0xd0,0xa, 0x40,0x2, 0xa1,0x81,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe, +0xb0,0x1, 0x78,0x2, 0xa1,0x6a,0x75,0x24,0x0, 0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xc6,0xbc,0xcd,0x68,0x2, 0xa1,0x5d,0x49,0x25,0x34,0xc4,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x17,0x80,0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc2,0x74,0x9, 0xac,0xbf,0x12,0x86,0xcb,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x30,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x1c,0xa, 0x1c,0x2e,0x14,0x35,0x30,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x81,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x1c,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x63,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x15,0xfc,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x87,0x78,0xac,0x3f,0x12,0x85,0xa8,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x85,0xa8,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x1c,0x80,0x24,0x5, 0x24,0xe5, +0x24,0xbe,0xb0,0xa, 0x50,0x2, 0x81,0x69,0x80,0x17,0x6d,0x11,0x74,0x2, 0xac,0xbd, +0x12,0x85,0xb1,0xac,0x3d,0x19,0xa1,0x34,0xc6,0x74,0x2, 0xa, 0x1d,0x19,0xb1,0x35, +0x30,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x47,0xe4,0x7a,0xb3,0x16,0x92,0x7e,0x34, +0x0, 0x5a,0xca,0x39,0x7e,0x18,0x28,0xae,0x7e,0x8, 0x34,0xc2,0x12,0x17,0x29,0x1b, +0xfd,0x7a,0xe3,0x2a,0x20,0xda,0x3b,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x15, +0xfc,0x59,0x15,0x35,0x1c,0x7e,0xa0,0xff,0x7e,0x30,0x9, 0x22,0x7e,0xb3,0x37,0x2e, +0x70,0x3, 0x12,0x84,0xa, 0x2, 0x85,0xc8,0xca,0x79,0x7e,0xf3,0x2a,0x20,0x7e,0xe3, +0x2a,0x21,0x7c,0xbf,0x7c,0x7e,0x12,0x26,0xfc,0x7c,0xbf,0x12,0x86,0xd4,0x4c,0xee, +0x78,0x15,0x7e,0x34,0x0, 0x5a,0xca,0x39,0x7e,0x18,0x28,0xae,0x7e,0x8, 0x29,0x62, +0x12,0x17,0x29,0x1b,0xfd,0x80,0xb, 0x7e,0xb3,0x2a,0x27,0x70,0x5, 0x7c,0xbf,0x12, +0x86,0x4d,0x7c,0xbf,0x12,0x88,0xcd,0xbe,0xf0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3, +0x2a,0x29,0xda,0x79,0x22,0x7e,0x73,0x2a,0x21,0xbe,0x73,0x2a,0x20,0x78,0x13,0x12, +0x87,0x88,0x40,0xe, 0x7e,0x37,0x34,0x9e,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34, +0x80,0x6, 0x7e,0x37,0x34,0x9e,0x1e,0x34,0x7a,0x37,0x34,0x9e,0x7e,0xb3,0x2a,0x20, +0x70,0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9e,0x7e,0x37,0x34,0x9e,0x22,0xca,0x3b,0x7c, +0xfb,0x6c,0xee,0x80,0x6f,0x6c,0xdd,0x74,0x9, 0xac,0xbd,0x9, 0x45,0x29,0x66,0x7e, +0x70,0x9, 0xac,0x7e,0x9, 0x53,0x28,0xb2,0xbc,0x45,0x68,0x7, 0xb, 0xd0,0xbe,0xd0, +0xa, 0x40,0xe4,0xbe,0xd0,0xa, 0x50,0x50,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66, +0x49,0x25,0x29,0x64,0x49,0x33,0x28,0xb0,0x12,0x87,0x80,0x74,0x9, 0xac,0xbd,0x49, +0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x12,0x86,0xcb,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8a,0x59,0x35,0x34,0xad,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x5f,0xfa,0xb, 0xe0,0xbc,0xfe,0x38,0x8d,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x17,0x80,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x7e,0xf0,0xa, 0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x87,0x6e,0x7c,0x7d, +0x7c,0x6f,0x12,0x87,0x6e,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x87,0x78,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x15,0xfc,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x17,0x29,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0x8, +0x1f,0x34,0x12,0x87,0xcb,0x7c,0x1b,0x22,0x2e,0x34,0x28,0xae,0x7e,0x30,0x9, 0x22, +0x9d,0x32,0x12,0x17,0x80,0x7d,0x13,0x22,0x7e,0x73,0x2a,0x20,0xbe,0x70,0x1, 0x22, +0x7e,0xb3,0x2a,0x27,0x70,0x23,0x7e,0xb3,0x34,0xa0,0xb4,0x2, 0x9, 0x12,0x87,0x88, +0x28,0x4, 0x74,0x3, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xab,0x7e,0x73,0x34,0xac,0xbe, +0x73,0x34,0xab,0x28,0x4, 0x7a,0x73,0x34,0xab,0x22,0x12,0x89,0x1e,0x2, 0x87,0x90, +0x12,0x2f,0x98,0x12,0x1e,0x87,0x7a,0xb3,0x2a,0x2a,0x22,0xca,0x3b,0x7c,0x46,0x7c, +0xab,0x6c,0x66,0x7c,0x57,0x2, 0x88,0x5d,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29, +0x66,0x7c,0x98,0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b, +0xbe,0x90,0xff,0x68,0x66,0x12,0x88,0x73,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf, +0x29,0xbc,0x7e,0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d, +0x88,0x80,0xa, 0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0, +0x12,0x88,0x73,0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f, +0x60,0x2d,0xd7,0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3, +0x12,0x88,0x73,0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4, +0x12,0x88,0x73,0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x9, 0xb, 0x50,0xbc,0x45,0x28, +0x3, 0x2, 0x87,0xd8,0xb, 0x60,0xbe,0x60,0xa, 0x50,0x3, 0x2, 0x87,0xd3,0x7c,0xba, +0xda,0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0xca,0xf8,0x7c, +0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x81,0xbd,0x13,0x38,0x6, 0x7e,0x34,0x1, 0x0, 0x80, +0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x15,0x75,0xbe,0x34,0x0, 0x10, +0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34,0xad,0xbd,0x2f, +0x28,0x6, 0x49,0x35,0x34,0x8a,0x80,0x4, 0x59,0x35,0x34,0x8a,0x59,0xf5,0x34,0xad, +0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22,0x6c,0xaa,0x7e, +0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x4f,0xeb,0x59,0x32,0x28,0xae,0x7e, +0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x4f,0xeb,0x59,0x32,0x28,0xb0,0x7e, +0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28,0xb2,0x7e,0x90,0x9, 0xac, +0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4, +0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xb2,0x22,0xca,0x79, +0x7e,0x13,0x2a,0x20,0x7e,0x78,0x29,0xbc,0x12,0x8a,0x65,0xe4,0x33,0x7c,0xb, 0x4c, +0x0, 0x68,0x8, 0x7e,0x30,0xf, 0x7e,0xa0,0x2, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0, +0x1, 0xa5,0xb9,0x0, 0x5, 0x12,0x1a,0x9a,0x41,0x4e,0xbc,0x20,0x50,0x3, 0x12,0x1a, +0x9a,0x6c,0x0, 0x7e,0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78, +0x2, 0x41,0x44,0xa, 0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68, +0x2, 0x41,0x27,0x12,0x8a,0x5b,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x17,0x80,0x7d, +0xd3,0x7e,0x70,0x4, 0xac,0x79,0x49,0x23,0x35,0x3f,0x12,0x8a,0x51,0x9d,0x32,0x12, +0x17,0x80,0x7d,0xc3,0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c, +0x28,0x4f,0x12,0x8a,0x5b,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50, +0x4, 0xac,0x59,0x49,0x22,0x35,0x3f,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, +0xbe,0x10,0x0, 0x28,0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, +0x7a,0xb3,0x34,0x89,0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3, +0x34,0x89,0x7e,0xb3,0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80, +0x53,0x7e,0x50,0x9, 0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59, +0xb7,0x35,0x3d,0x49,0x22,0x29,0xa, 0x59,0x27,0x35,0x3f,0xbc,0x73,0x28,0x6, 0x7a, +0xa3,0x34,0x88,0x80,0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88, +0xe4,0x7a,0xb3,0x34,0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70, +0x49,0x33,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x3d,0x12,0x8a,0x51, +0x59,0x32,0x35,0x3f,0xb, 0x0, 0xa5,0xb8,0xa, 0x2, 0x80,0x2, 0x21,0x53,0xda,0x79, +0x22,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59, +0x49,0x22,0x35,0x3d,0x22,0xa2,0x8, 0x22,0x7e,0x8, 0x34,0xa0,0x7e,0x34,0x0, 0xd, +0xe4,0x2, 0x17,0x4e,0x7e,0x8, 0x34,0xad,0x7e,0x34,0x0, 0x14,0xe4,0x12,0x17,0x4e, +0x7e,0x8, 0x34,0x8a,0x7e,0x34,0x0, 0x14,0x2, 0x17,0x4e,0x12,0x8e,0xd7,0x12,0x8d, +0x14,0x12,0x8b,0xfe,0x12,0x8b,0x47,0x2, 0x8a,0x9a,0xca,0x3b,0x12,0x1e,0x38,0x7e, +0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xde,0x60,0x9, 0xe4,0x7a,0xb3,0x35,0xe0, +0x7a,0xb3,0x35,0x65,0x7e,0xb3,0x35,0xde,0x70,0x62,0x6c,0x99,0x80,0x56,0x74,0x2, +0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x8c,0xa2,0x40, +0x41,0x6c,0xee,0x80,0x35,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x66,0x9, 0xc5,0x35, +0x67,0xa, 0x28,0xa, 0x3d,0x12,0x8b,0x3f,0x78,0x1e,0xa, 0x2f,0xa, 0x3c,0x12,0x8b, +0x3f,0x78,0x15,0x7c,0xb9,0x12,0x71,0x7e,0xbe,0x34,0x3, 0x20,0x58,0xa, 0x12,0x8d, +0xc2,0x7c,0xb8,0x7c,0x7f,0x12,0x8b,0xe3,0xb, 0xe0,0x7e,0x73,0x35,0xe0,0xbc,0x7e, +0x38,0xc3,0xb, 0x90,0x7e,0x73,0x28,0x84,0xbc,0x79,0x38,0xa2,0x7e,0x73,0x35,0x65, +0x7a,0x73,0x35,0xe0,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x35,0xa2,0x7e,0x8, +0x35,0x66,0x12,0x17,0x29,0x1b,0xfd,0xe4,0x7a,0xb3,0x35,0xde,0xda,0x3b,0x22,0x9d, +0x32,0x12,0x17,0x80,0x4d,0x33,0x22,0xca,0xd8,0xca,0x79,0x7e,0xf4,0x3, 0x20,0x7d, +0x7f,0x12,0x8e,0xee,0x50,0x2, 0x61,0xde,0x7a,0xf5,0x2a,0x7e,0xb3,0x28,0xa8,0xb4, +0x1, 0x4, 0x7e,0x74,0x4, 0xb0,0x7e,0x37,0x28,0x8a,0xbe,0x34,0x4, 0x4c,0x8, 0x6e, +0x6c,0xdd,0x80,0x62,0xc2,0x3, 0x7c,0xbd,0x12,0x71,0x7e,0x7a,0x35,0x26,0x7c,0xbd, +0x7e,0x70,0x1, 0x12,0x8f,0x11,0x7a,0x35,0x24,0x9e,0x35,0x26,0x7a,0x35,0x24,0x7e, +0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8d,0xd, 0x7a,0x35,0x28,0xbe,0x75,0x28,0x58, +0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, 0xa, 0x7e,0x35,0x2a,0xbe, +0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x8c,0xa2,0x50,0x2, 0xc2,0x3, 0x30, +0x3, 0x12,0x7c,0xbd,0x6c,0x77,0x12,0x2f,0x4c,0x7e,0x70,0x2, 0xac,0x7d,0x12,0x8c, +0x99,0x12,0x8b,0xe3,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x96,0xda,0x79, +0xda,0xd8,0x22,0x7c,0x6b,0x7e,0xa3,0x35,0x65,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x62, +0x35,0xa2,0x19,0x72,0x35,0xa3,0x7c,0xba,0x4, 0x7a,0xb3,0x35,0x65,0x22,0xca,0x3b, +0x7e,0xb3,0x2a,0x93,0xf5,0x27,0x12,0x76,0x4a,0x50,0x2, 0x81,0x8e,0x6d,0x33,0x9e, +0x37,0x2a,0x6e,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x73,0x7e,0xb3,0x16,0x92,0x70, +0x6d,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x77,0x2a,0x70,0x7e,0x67,0x2a,0x72, +0x75,0x24,0x0, 0x80,0x51,0xe5,0x24,0x12,0x1f,0xd4,0x60,0x48,0x12,0x8c,0x91,0x12, +0x8e,0xca,0x7e,0xb3,0x2a,0x21,0xb4,0x1, 0x9, 0xe5,0x26,0xb4,0x17,0x4, 0xe, 0x64, +0xe, 0x74,0x7e,0xa1,0x26,0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0x14, +0xe5,0x25,0xa, 0x2b,0xe5,0x27,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33,0x4, 0xfc, +0xbd,0x37,0x58,0x10,0xe5,0x24,0x6c,0x77,0x12,0x2f,0x4c,0x12,0x8c,0x91,0x12,0x8c, +0x99,0x12,0x8b,0xe3,0x5, 0x24,0x12,0x8e,0xc2,0x38,0xaa,0x12,0x8c,0xc4,0xda,0x3b, +0x22,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x22,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26, +0xfb,0x22,0x7c,0x4b,0x74,0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb, +0x7e,0x73,0x28,0x8c,0xbc,0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, +0xd3,0x22,0xc3,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x6e,0x12,0x8d,0xc9,0x28,0x35, +0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8d,0xd, 0xbe,0x37,0x7, +0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x21,0x70,0x17,0x7e,0xb3, +0x37,0x5, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28,0x5, +0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0x24,0x0, +0x2, 0x2, 0x15,0x29,0xca,0x3b,0x7e,0x93,0x2a,0x93,0x7e,0x37,0x28,0x8a,0xbe,0x34, +0x2, 0xbc,0x58,0x2, 0xa1,0xb8,0x6c,0x88,0xa1,0xb1,0x6c,0xff,0x6c,0xee,0x74,0x2, +0xac,0xb8,0x9, 0xd5,0x26,0xfa,0x12,0x77,0xed,0x7c,0xbd,0x12,0x1e,0x80,0xbe,0x34, +0x0, 0xfa,0x18,0x6b,0x7e,0xa1,0x24,0x74,0x2, 0xa4,0x49,0x55,0x4, 0xfc,0xbe,0x54, +0x1, 0xc2,0x18,0x5b,0xbe,0xd0,0x3, 0x38,0x5f,0x6c,0xcc,0x80,0xd, 0x12,0x8d,0xbb, +0xbe,0x34,0x2, 0xbc,0x8, 0x2, 0xb, 0xf0,0xb, 0xc0,0xbc,0x9c,0x38,0xef,0x6c,0xcc, +0x80,0x24,0xbc,0x8c,0x68,0x1e,0x74,0x2, 0xac,0xbc,0x9, 0x75,0x26,0xfa,0xa, 0x37, +0x7d,0x13,0xb, 0x14,0xa, 0x2d,0xbd,0x12,0x48,0xa, 0xa, 0x5d,0xb, 0x54,0xbd,0x35, +0x18,0x2, 0xb, 0xe0,0xb, 0xc0,0x7e,0x73,0x28,0x84,0xbc,0x7c,0x38,0xd4,0xbe,0xf0, +0x5, 0x50,0x5, 0xbe,0xe0,0x2, 0x40,0x7, 0x7c,0xb8,0x6c,0x77,0x12,0x2f,0x4c,0xb, +0x80,0x12,0x77,0xe6,0x28,0x2, 0xa1,0x2a,0xda,0x3b,0x22,0x7c,0xbd,0x7c,0x7c,0x2, +0x1e,0x80,0x7c,0xb9,0x6c,0x77,0x2, 0x2f,0x4c,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x0, +0x22,0xca,0x3b,0x12,0x8d,0xc9,0x38,0x2, 0xc1,0x98,0x7e,0xc3,0x2f,0xcc,0x4c,0xcc, +0x78,0x3d,0x7a,0xb3,0x2f,0xcc,0xe4,0x7a,0xb3,0x2f,0xce,0x6c,0xaa,0x80,0x26,0x12, +0x8e,0xa3,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a, +0x49,0xd0,0x19,0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8e,0xad,0x59, +0x34,0x0, 0x2, 0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c, +0xfc,0x6c,0xaa,0x80,0x35,0x12,0x8e,0xa3,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, +0xb4,0x0, 0x8, 0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8e,0xad,0x7d,0x23,0x49,0x34, +0x0, 0x2, 0x9d,0x32,0x12,0x17,0x80,0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74, +0x5, 0x19,0xb4,0x0, 0x8, 0x75,0x5e,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff, +0x78,0x2, 0x80,0x26,0x7e,0x73,0x2f,0xce,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80, +0xe, 0x12,0x8e,0xa3,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc, +0xfa,0x38,0xee,0xbc,0xfa,0x78,0x3, 0x75,0x5e,0x0, 0x12,0x8e,0xb4,0x80,0xf, 0x7c, +0xb7,0x4, 0x7a,0xb3,0x2f,0xce,0x80,0x6, 0x12,0x8e,0xb4,0x75,0x5e,0x0, 0xe5,0x5e, +0xda,0x3b,0x22,0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xcf,0x22,0x7c,0xbd,0x7c, +0x7e,0x2, 0x1e,0x80,0xe4,0x7a,0xb3,0x2f,0xcd,0x7a,0xb3,0x2f,0xcc,0x7a,0xb3,0x2f, +0xce,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x9, 0xb3,0x26,0xfa,0xf5,0x25, +0x9, 0xb3,0x26,0xfb,0xf5,0x26,0x22,0xe4,0x7a,0xb3,0x35,0x65,0x7e,0xb3,0x28,0x84, +0x60,0x6, 0x7e,0xb3,0x35,0xde,0x60,0x5, 0xe4,0x7a,0xb3,0x35,0xe0,0x22,0x6c,0x99, +0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x71,0x7e,0xbe,0x34,0x1, 0xf4,0x8, 0x2, 0xb, +0x90,0xb, 0x80,0x12,0x77,0xe6,0x38,0xec,0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3, +0x22,0xca,0x79,0x7c,0xa7,0x7c,0x8b,0x7e,0xb3,0x2a,0x8e,0x7a,0xb3,0x1f,0x34,0x7e, +0xb3,0x2a,0x8f,0x7a,0xb3,0x1f,0x35,0x7e,0x70,0x2, 0xac,0x78,0x9, 0x93,0x26,0xfa, +0x9, 0x83,0x26,0xfb,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0xe1,0xc9,0x7a,0xf1, +0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d,0x32, +0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a,0x2f, +0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d,0x32, +0x7c,0xb7,0xf5,0x2c,0x80,0x43,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58,0x10, +0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5,0x2e, +0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b,0x9d, +0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12,0x1e, +0x80,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5, +0x2c,0x1a,0x3b,0xbd,0x32,0x8, 0xaf,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a, +0x3f,0xbd,0x32,0x18,0x2, 0xe1,0x3e,0x7f,0x17,0xda,0x79,0x22,0xca,0xf8,0x7c,0xfb, +0x7e,0x70,0x2, 0x12,0x8f,0x11,0x7f,0x71,0x7c,0xbf,0x12,0x71,0x7e,0x7d,0x13,0x1a, +0x2, 0x1a,0x0, 0x7f,0x17,0x12,0x15,0xc8,0x7c,0xb7,0xda,0xf8,0x22,0x7e,0x63,0x2a, +0x8d,0xc2,0x12,0x6c,0x33,0x80,0x48,0x7c,0x96,0xac,0x93,0x2e,0x44,0x0, 0x16,0x7d, +0x4, 0xb, 0x4, 0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50, +0xbe,0x57,0x2a,0x79,0x8, 0x27,0x7c,0xb3,0x12,0x2e,0x9f,0x50,0x20,0x7d,0x50,0x3e, +0x54,0x7e,0x7f,0x13,0x8a,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x20,0x7d,0x54,0x3e,0x54, +0x2d,0xf5,0xb, 0x7a,0x50,0xbd,0x52,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e, +0x73,0x2a,0x94,0xbc,0x73,0x38,0xb0,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x2f,0xa, 0x22, +0x30,0x12,0x5, 0x12,0x2a,0x24,0xc2,0x12,0x22,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f, +0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x19,0x39,0x7e,0x24,0x0, 0xff,0x7e, +0x14,0x1f,0x34,0x74,0xc, 0x12,0x16,0x1d,0x6d,0x11,0x7e,0x4, 0x7f,0xff,0x6c,0xee, +0x80,0x13,0x12,0x7f,0x37,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d,0xdc,0xbd,0xc, 0x28, +0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, 0x1e,0x58,0xa, 0x7e, +0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x21,0x61,0xbe,0xd4,0x4, 0xb0,0x8, 0x2, 0xd2, +0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd,0x4d,0x58,0x6, 0x49, +0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7,0xbe,0xe0,0x3, 0x78, +0x4, 0x6d,0x33,0x80,0x7c,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, 0x7d,0xd0,0x9f,0x55, +0x6c,0xee,0x80,0xb, 0x12,0x7f,0x37,0x1a,0x26,0x1a,0x24,0x2f,0x51,0xb, 0xe0,0xbc, +0xfe,0x38,0xf1,0xa, 0x1f,0x12,0x91,0x6f,0x9f,0x55,0x6c,0xee,0x80,0x1a,0x12,0x91, +0x66,0xb, 0x1a,0x90,0x7d,0x39,0x12,0x17,0x80,0x7d,0xc3,0xbd,0x1c,0x28,0x7, 0x12, +0x91,0x79,0x2f,0x51,0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xe2,0x6d,0x11,0xbe,0xd0, +0x0, 0x28,0x5, 0xa, 0x1d,0x12,0x91,0x6f,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, +0x6d,0x0, 0x9d,0xd, 0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0xd, 0x12,0x91, +0x66,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xef,0x7d, +0x31,0xda,0x79,0xda,0xd8,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0x22,0x6d, +0x0, 0x7f,0x15,0x12,0x15,0xc8,0x7d,0x13,0x22,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x22, +0x7e,0xb3,0x2b,0x3c,0xb4,0x1, 0x31,0x12,0x5f,0x91,0x7e,0x1f,0x33,0xf8,0x7a,0x37, +0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x24,0xf6,0x12,0x5f,0xc4,0x12,0x5f,0xcd, +0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, 0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24, +0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, 0x22,0x7c,0xab,0x7c,0xb7,0xb4,0x17,0x9, +0x7c,0xba,0x12,0x2e,0x9f,0x50,0x2, 0xd3,0x22,0xc3,0x22,0x6c,0x66,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28,0x5a,0x6c,0x33,0x80, +0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x8d,0x14,0xbc,0x7b,0x78,0x3d, +0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x91,0xb9,0x50,0x1c,0xa, 0x22,0x7e, +0x73,0x2a,0x8d,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, 0xfc,0x6d,0x0, 0x9e, +0x7, 0x2a,0x6e,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e,0x73,0x2a,0x8c,0xbc, +0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xb, 0x30,0x7e, +0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0x6c,0xaa,0x7e,0x30,0x4, 0xac, +0x3a,0x7d,0xf1,0x2e,0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23, +0x38,0xf, 0x2e,0x14,0x60,0xb3,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50, +0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xd4,0x7c,0xba,0x22,0x12,0x92,0x7a,0xbe,0x34, +0x2, 0x30,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22,0x6d,0x11,0xe4,0x12,0x0, 0x1e, +0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x7f,0x38,0xef,0x2d,0xf0,0x69, +0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12,0x17,0x80,0xbd,0x31,0x28,0x16, +0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xef,0x2d,0x13,0x69,0x20,0x1, 0x0, 0x69, +0x30,0x0, 0x80,0x12,0x87,0x80,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x1f,0x38,0xef,0x2d, +0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff,0x69, +0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff,0xb, 0xa0,0x7e, +0xb3,0x2a,0x93,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22,0x7e,0xa0,0x1, 0x7e,0x47,0x7, +0xf8,0x7e,0x4, 0x1, 0x18,0xbe,0x44,0xfc,0xb8,0x58,0x12,0x7e,0xb3,0x28,0xac,0x60, +0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x38,0x7e,0xa0,0x5, 0x80,0x33,0x7e,0x34,0xff, +0xfb,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x93,0x45,0x8, 0x5, 0x7e,0xa0,0x4, 0x80, +0x1f,0x7e,0x34,0xff,0xfc,0x12,0x93,0x43,0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11,0x7e, +0x34,0xff,0xfd,0x12,0x93,0x43,0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x15,0x29,0xbd,0x34,0x22,0x6c,0x66,0x7e, +0x27,0x38,0xff,0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e,0xb3,0x28,0xac, +0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xca,0xbc,0x76,0x50,0xf, 0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x76,0x88,0x7e,0xb3,0x2f,0xca,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3, +0x2f,0xca,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xcb,0xbe,0xa0,0x5, +0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74,0x5, 0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xcb,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, 0xac,0x5a,0x49, +0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8,0x30,0x1, 0xe, +0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x93,0xa, 0x3b,0x7e,0xb3,0x2a,0x92,0xa, 0x2b,0x2d,0x23,0xa, 0x3a, +0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f,0x7e,0x63,0x2a, +0x8d,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac,0x56,0x49,0x22, +0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e,0xb3,0x2a,0x8c, +0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, 0x2, 0xc2,0x3, +0xa2,0x3, 0x22,0x7e,0x63,0x2a,0x8e,0x7e,0xa3,0x2a,0x8f,0x7e,0x70,0x1, 0x80,0x15, +0xa, 0x17,0x7e,0xb3,0x2a,0x8d,0xa, 0x2b,0x2d,0x21,0x3e,0x24,0x12,0x94,0x6e,0x58, +0x2, 0xd3,0x22,0xb, 0x70,0xa, 0x16,0x1b,0x14,0xa, 0x27,0xbd,0x21,0x48,0xe1,0x7e, +0x70,0x2, 0x80,0xe, 0x7e,0x50,0x2, 0xac,0x57,0x12,0x94,0x6e,0x58,0x2, 0xd3,0x22, +0xb, 0x70,0xa, 0x1a,0x1b,0x15,0xa, 0x27,0xbd,0x21,0x48,0xe8,0xc3,0x22,0x49,0x22, +0x4, 0xfc,0xbe,0x24,0xfe,0xe8,0x22,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x3, 0x2, 0x94, +0xce,0x7e,0xb3,0x36,0xd7,0x4, 0x7a,0xb3,0x36,0xd7,0x7e,0xb3,0x36,0x65,0xb4,0x2, +0x18,0x7e,0xb3,0x36,0xd6,0x4, 0x7a,0xb3,0x36,0xd6,0xb4,0x1, 0x6, 0x74,0x1, 0x7a, +0xb3,0x36,0xd7,0x74,0x1, 0x7a,0xb3,0x36,0x65,0x7e,0x73,0x36,0xd6,0xbe,0x70,0x3, +0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x71,0x12,0x94,0xce,0x12,0x97,0x2a,0x12,0x94, +0xd5,0x7e,0x73,0x36,0xd7,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x94,0xd5,0x22,0x74,0x2, +0x7a,0xb3,0x36,0x65,0x22,0xe4,0x7a,0xb3,0x36,0xd7,0x7a,0xb3,0x36,0xd6,0x22,0x7e, +0x73,0x36,0x65,0x7a,0x73,0x36,0xdb,0x7e,0x47,0x33,0xf5,0xbe,0x44,0x0, 0x64,0x28, +0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x65,0xbe,0x44,0x0, 0xc8,0x28,0x8, 0xe4,0x7a,0xb3, +0x36,0x63,0x12,0x94,0xce,0x7e,0x57,0x36,0x6b,0xbd,0x54,0x50,0x4, 0x7a,0x47,0x36, +0x6b,0x12,0x97,0x1, 0x38,0x10,0x12,0x96,0xf9,0x38,0xb, 0x12,0x95,0x66,0x38,0x6, +0x7e,0xb3,0x16,0x91,0x70,0x34,0x12,0x94,0x77,0xbe,0x44,0x0, 0x32,0x50,0x21,0x7e, +0xb3,0x36,0x63,0x4, 0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x32,0x28, +0x14,0x74,0x32,0x7a,0xb3,0x36,0x63,0x12,0x97,0x13,0x7a,0xb3,0x36,0xd8,0x80,0x5, +0xe4,0x7a,0xb3,0x36,0x63,0x7d,0x34,0x2, 0x97,0x82,0x2, 0x95,0x5d,0x12,0x94,0xd5, +0xe4,0x7a,0xb3,0x36,0x71,0x22,0x7e,0x73,0x26,0xf5,0xbe,0x70,0x0, 0x22,0xca,0x79, +0x7e,0xf0,0xff,0x12,0x97,0x53,0x7e,0xb3,0x36,0x67,0xb4,0x1, 0x8, 0x12,0x5d,0xe4, +0xe4,0x7a,0xb3,0x36,0x67,0x7e,0xb3,0x36,0x66,0x60,0x4, 0x74,0xff,0xc1,0x6f,0x7e, +0xb3,0x36,0x65,0xb4,0x2, 0x2, 0x80,0x2, 0xc1,0x63,0x12,0x97,0x1, 0x38,0x12,0x12, +0x96,0xf9,0x38,0xd, 0x12,0x95,0x66,0x38,0x8, 0x7e,0xb3,0x16,0x91,0x60,0x2, 0xc1, +0x63,0x74,0x3, 0x12,0x96,0x72,0x7c,0xeb,0x7e,0xb3,0x36,0x64,0x4, 0x7a,0xb3,0x36, +0x64,0x74,0x3, 0x12,0x96,0x72,0x7c,0xab,0xbe,0xa0,0xff,0x68,0x23,0xbe,0xe0,0xff, +0x68,0x1c,0x7e,0x30,0xc, 0xac,0x3e,0x49,0x21,0x36,0x7a,0xbe,0x24,0x1, 0xf4,0x28, +0xf, 0x12,0x97,0x9, 0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xea,0x80,0x2, 0x7c,0xea, +0xbe,0xe0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x64,0x7a,0xb3,0x36,0x65,0x7a,0xb3, +0x36,0x71,0x74,0xff,0x80,0x69,0x7e,0x73,0x36,0x64,0xbe,0x70,0x4, 0x28,0x54,0x74, +0xc, 0xac,0xbe,0x49,0x35,0x36,0x7a,0xbe,0x34,0x1, 0xf4,0x40,0x6, 0x7e,0xb3,0x16, +0x91,0x70,0x37,0x7e,0x37,0x36,0x60,0xbe,0x34,0x1, 0x2c,0x38,0xa, 0x7e,0x37,0x36, +0x6b,0xbe,0x34,0x1, 0x2c,0x28,0x23,0x74,0x5, 0xac,0xbe,0x9, 0x75,0x26,0x33,0xbe, +0x73,0x2b,0x2e,0x68,0x15,0x7c,0xfe,0xbe,0xf0,0x4, 0x50,0x8, 0x12,0x7c,0x2f,0xbe, +0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x67,0xe4,0x7a,0xb3,0x36,0x71,0x7a, +0xb3,0x36,0x65,0xbe,0xf0,0xff,0x68,0x5, 0xe4,0x7a,0xb3,0x36,0x64,0x7c,0xbf,0xda, +0x79,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0x96,0xeb,0x68, +0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0x97,0x1d,0x7d,0x23,0x7e,0x70,0xc, 0xac,0x72, +0x59,0x23,0x36,0x7e,0x49,0x3, 0x36,0x7e,0x49,0x23,0x36,0x7a,0xbd,0x20,0x50,0x4, +0x59,0x3, 0x36,0x7a,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22,0x80,0x18, +0x12,0x96,0xeb,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7a,0xbd,0x4, +0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37,0x36,0x60, +0xbe,0x37,0x36,0xd9,0x50,0x8, 0x7e,0x37,0x36,0xd9,0x7a,0x37,0x36,0x60,0x12,0x97, +0x9, 0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, 0xac,0x12, +0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0x2e,0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, +0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0x70,0xc, 0xac,0x7a,0x49,0x33, +0x36,0x7a,0x22,0xe4,0x7a,0xb3,0x36,0x65,0x7a,0xb3,0x36,0x6d,0x22,0x49,0x23,0x36, +0x80,0x49,0x33,0x36,0x7c,0x9d,0x32,0x2, 0x17,0x80,0xe4,0x7a,0xb3,0x36,0x63,0x6d, +0x33,0x6c,0xaa,0x7e,0x50,0xc, 0xac,0x5a,0x59,0x32,0x36,0x7a,0xb, 0xa0,0xbe,0xa0, +0x4, 0x40,0xf0,0xe4,0x7a,0xb3,0x36,0x64,0x6d,0x33,0x7a,0x37,0x36,0x6b,0x7a,0x37, +0x36,0x60,0x22,0x7e,0xb3,0x36,0x66,0xb4,0x1, 0x27,0x7e,0xb3,0x36,0xdc,0x4, 0x7a, +0xb3,0x36,0xdc,0x7e,0x73,0x36,0xdc,0xbe,0x70,0x3, 0x40,0x15,0x12,0x4f,0x84,0x7e, +0x73,0x36,0xdc,0xbe,0x70,0x6, 0x40,0x9, 0xe4,0x7a,0xb3,0x36,0xdc,0x7a,0xb3,0x36, +0x66,0x22,0xbe,0x34,0x1, 0xf4,0x28,0xd, 0x7e,0x53,0x36,0xd8,0xbe,0x50,0x8, 0x50, +0x3f,0x74,0x8, 0x80,0x37,0xbe,0x34,0x1, 0x90,0x28,0xd, 0x7e,0x53,0x36,0xd8,0xbe, +0x50,0x6, 0x50,0x2c,0x74,0x6, 0x80,0x24,0xbe,0x34,0x1, 0x2c,0x28,0xd, 0x7e,0x53, +0x36,0xd8,0xbe,0x50,0x4, 0x50,0x19,0x74,0x4, 0x80,0x11,0xbe,0x34,0x0, 0xc8,0x28, +0xf, 0x7e,0x73,0x36,0xd8,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xd8, +0x7e,0xb3,0x36,0xd8,0xbe,0xb0,0x0, 0x28,0x19,0x14,0x7a,0xb3,0x36,0xd8,0x74,0x1, +0x7a,0xb3,0x16,0x92,0x7e,0x73,0x36,0xd8,0xbe,0x70,0x4, 0x28,0x5, 0xe4,0x7a,0xb3, +0x16,0x91,0x22,0x7e,0xb3,0x2b,0x2e,0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0xc4,0x1, +0xf4,0x7e,0x73,0x37,0xdb,0xa, 0xb7,0x7e,0xb3,0x2b,0x2f,0xf5,0x34,0x75,0x35,0x4, +0xe4,0x7a,0xb3,0x36,0x6e,0xa, 0x3e,0xad,0x3b,0x7d,0xa3,0x2d,0xac,0x6c,0xdd,0x7e, +0xa3,0x36,0x6e,0xbe,0xa1,0x35,0x40,0x2, 0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74, +0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e,0x78,0xe, 0xe5,0x35,0x14,0xbe,0xb3,0x36, +0x6e,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x6e,0x7e,0xc3,0x36,0x6e,0x80,0x3a,0x7e,0xb3, +0x36,0x6e,0x4, 0x7a,0xb3,0x36,0x6e,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x33,0xbc, +0x7e,0x68,0x23,0xa, 0xdd,0x19,0xcd,0x36,0x72,0xa, 0x97,0xad,0x9b,0x2d,0x9c,0x7c, +0xad,0xb, 0xd0,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x34,0x12,0x10,0x0, 0xb, +0xf0,0xbe,0xf0,0x3, 0x50,0x8, 0xb, 0xc0,0xe5,0x35,0xbc,0xbc,0x38,0xc0,0x7a,0xf3, +0x36,0x6f,0xda,0x3b,0x22,0x7e,0x8, 0x36,0x76,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x17, +0x4e,0x6c,0xaa,0x7e,0x44,0xff,0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x78, +0x59,0x43,0x36,0x80,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x64,0x7e, +0x34,0x0, 0xd, 0xe4,0x2, 0x17,0x4e,0x7e,0xa3,0x2b,0x81,0xbc,0xab,0x68,0x6, 0x7a, +0xb3,0x2b,0x81,0xd2,0xc, 0x30,0xc, 0x9, 0xc2,0xc, 0x12,0x98,0xe2,0xe4,0x2, 0xa, +0x66,0x22,0x7e,0x8, 0x2a,0x8c,0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x8c,0x74,0x3, 0x2, +0x11,0x7a,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88,0x7e,0xf0, +0x1, 0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f,0x7f,0x7, +0x2d,0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc,0x9f,0x38, +0xe2,0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0,0x1, 0x21, +0xb1,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, 0x80,0x36,0x7e, +0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0xe5,0x44, +0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16,0x5, 0x45,0xa, +0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0x99,0xbe,0xbd,0x3d,0x8, 0x5, 0x12,0x99, +0xbe,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe,0xb0,0x0, 0x28, +0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x72,0x38,0x4f,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x38, +0x50,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x2e,0xc8,0x1b,0x1a,0xd0,0xb, 0xa0,0xb, +0xf0,0xbc,0x8f,0x40,0x2, 0x21,0x31,0x7c,0xba,0xda,0x79,0xda,0xd8,0x22,0x7c,0xbe, +0x7c,0x7d,0x2, 0x1e,0x80,0x7c,0x9b,0x7f,0x71,0x7f,0x60,0x7e,0x34,0x19,0xb, 0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x52,0x74,0x2a,0x12,0x16,0x1d,0x7e,0x58,0x1f,0x52, +0x7c,0xb9,0x7e,0x71,0x44,0x12,0x1e,0x80,0x7d,0x43,0xe5,0x45,0x7e,0x71,0x46,0x12, +0x1e,0x80,0x2d,0x34,0xe, 0x34,0x7f,0x5, 0x7e,0x50,0x7, 0xb, 0xa, 0x50,0xbd,0x53, +0x58,0xf, 0x69,0x30,0x0, 0x2, 0x1b,0x6a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x7a,0x30, +0x22,0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe2,0x22,0x6d,0x33,0x7d,0x23,0x7d,0x3, +0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x8d,0xac,0xb3,0xa, 0x42, +0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4,0xb, 0x7a,0x40,0xbe, +0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, 0x24,0xbe,0x44,0xff, +0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, 0x34,0xb, 0x21,0x7e, +0x93,0x2a,0x8d,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a,0x8c,0xbc,0xb3,0x38, +0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x12, +0x4f,0xed,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x3, 0x7e, +0xb3,0x39,0x4, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x4, 0x80,0x3c,0xe4, +0x7a,0xb3,0x39,0x4, 0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22,0xbd,0x32,0x28,0x1e, +0xe4,0x7a,0xb3,0x39,0x4, 0x7e,0xb3,0x39,0x3, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a, +0xb3,0x39,0x3, 0x80,0x16,0xe4,0x7a,0xb3,0x39,0x3, 0x74,0x2, 0x80,0x9, 0xe4,0x7a, +0xb3,0x39,0x3, 0x7a,0xb3,0x39,0x4, 0x7a,0xb3,0x39,0x5, 0x7e,0xb3,0x39,0x5, 0x22, +0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x39,0x6, 0x22,0xca,0xd8,0xca,0x79,0xc2,0x3, +0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7,0x28,0x97,0x7e,0x37,0x38,0x9, +0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff,0x7e,0xa3,0x2a,0x8d,0x7c,0x8a, +0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14,0x24,0xc2,0x68,0x8, 0x24,0xfb, +0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83,0x2a,0x8c,0x80,0xa, 0x7e,0x73, +0x2a,0x8c,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99,0x80,0xf, 0x7c,0xb9,0x12,0x71, +0x7e,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, 0x90,0x7e,0x33,0x28,0x84,0xbc, +0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x81,0xaf,0x7e,0xa3,0x28,0x85,0xbe,0xa0, +0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3,0x26,0x83,0x70,0x31,0x6c,0x99, +0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34,0x49,0x23,0x5, 0x7a,0xbd,0x2f, +0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, 0x6d,0x33,0x9d,0x3e,0x12,0x8d, +0xd, 0xbd,0x3, 0x8, 0x4, 0xd2,0x3, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xd3,0x6d, +0xee,0x9e,0xe7,0x2a,0x6e,0xbe,0xe7,0x7, 0xf8,0x8, 0x2, 0xc2,0x3, 0x30,0x3, 0x20, +0x7e,0xb3,0x39,0x6, 0x4, 0x7a,0xb3,0x39,0x6, 0x7e,0x23,0x39,0x6, 0xbe,0x20,0xa, +0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x39,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa8,0x80,0xf, +0x7e,0x23,0x39,0x6, 0xbe,0x20,0x0, 0x28,0x6, 0x1e,0x20,0x7a,0x23,0x39,0x6, 0x6c, +0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28,0x6d,0x7e,0xb3,0x28,0xa7,0xb4, +0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68,0x5d,0x7e,0xb3,0x28,0xa8,0xb4, +0x1, 0x56,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x26,0xfa,0x9, +0xd3,0x26,0xfb,0x7c,0xba,0x7c,0x7d,0x12,0x1f,0xcc,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x21,0x7e, +0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3,0x27,0x37,0x7c,0xba,0x7c,0x7d, +0x12,0x1e,0x80,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90, +0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xd7,0x6c,0x99,0x80,0x17,0xa, 0xe9,0xa, 0x5f, +0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x39,0x7, 0x4, +0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x28,0x22,0x74,0x5, 0x7a, +0xb3,0x39,0x7, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x15,0x12,0x9a,0xe0,0x80,0xf, +0x7e,0x73,0x39,0x7, 0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x39,0x7, 0xda, +0x79,0xda,0xd8,0x22,0x7c,0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x8d,0xbc, +0xba,0x28,0x9, 0x74,0x2, 0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x8d, +0xbc,0x1a,0x38,0x1c,0x7e,0x3, 0x2a,0x8c,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a, +0xbd,0x31,0x58,0xc, 0x9d,0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x72,0x80,0x2d, +0x7e,0x3, 0x2a,0x8c,0xa, 0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34, +0x48,0x19,0x7e,0x10,0x2, 0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x74,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, +0x64,0xad,0x23,0x74,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7c,0xb7,0x22,0xca,0xf8,0x80,0x38,0x7c,0xbf,0x12,0x9c,0xb4,0xa, 0x1b,0x7e, +0x63,0x2a,0x8d,0x7e,0x70,0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e, +0x1f,0x13,0x8a,0x2d,0x30,0x12,0x9d,0x73,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12, +0x9d,0x73,0x7e,0x73,0x2a,0x8d,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8, +0xda,0xf8,0x22,0x7e,0xa3,0x2a,0x8c,0x74,0x2, 0xa4,0x22,0x6c,0xaa,0x80,0x1c,0x7e, +0x50,0x2, 0xac,0x5a,0x49,0x12,0x13,0xc6,0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, +0x2e,0x24,0x13,0x8e,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x8d,0xbc, +0xba,0x38,0xdc,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9,0xc5,0xea, +0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x60,0x7e,0x73,0x39,0x1, +0xbe,0x71,0x60,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9,0x34,0xe5, +0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x33,0xe5, +0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5,0x3, 0xa9, +0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8,0x22,0x7e, +0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79,0x30, +0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79,0x30, +0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79,0x30, +0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12,0x3b,0xac,0x7c, +0x7b,0x12,0x3b,0xa5,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e,0x24,0x0, 0xef, +0x7e,0xf, 0x33,0xdf,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e,0xf, 0x33,0xdf, +0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x33,0xdf,0x79,0x20,0x0, 0x90, +0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x33,0xdf,0x79,0x30,0x0, 0x86, +0x7e,0x34,0x29,0x90,0x7e,0xf, 0x33,0xdf,0x79,0x30,0x0, 0x8a,0x7e,0x34,0x6a,0xd1, +0x7e,0xf, 0x33,0xdf,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e,0xf, 0x33,0xdf, +0x79,0x30,0x0, 0x8e,0x22,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86, +0xa9,0xc2,0xeb,0xa9,0xd2,0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, +0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7, +0x0, 0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0, +0xf7,0xd2,0xf8,0xa9,0xc1,0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7, +0xc2,0xbe,0x22,0x75,0xe7,0x6b,0x2, 0x9f,0x19,0xe4,0x7e,0x34,0xd7,0xfc,0x7e,0x24, +0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff,0x22, +0x7e,0x37,0x38,0xff,0xb, 0x34,0x7a,0x37,0x38,0xff,0xbe,0x34,0xff,0x0, 0x40,0x8, +0x7e,0x34,0xff,0x0, 0x7a,0x37,0x38,0xff,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24, +0xbd,0x32,0x38,0xe9,0x22,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c,0x11,0x80,0x46, +0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, 0x20,0xa, 0x33, +0x9d,0x32,0x12,0x17,0x80,0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74,0x26,0xfa,0xa, +0x27,0xa, 0x32,0x9d,0x32,0x12,0x17,0x80,0x7c,0x97,0xbe,0x90,0x1, 0x18,0x8, 0xbe, +0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe,0x0, 0x2, 0x18, +0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18,0xb2,0x22,0x7c, +0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, 0xf9,0x2d,0xf1,0x7d,0xe0, +0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77,0x14,0x78,0xfb,0x4d,0x3f, +0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0x7c,0x57,0x7c,0xab,0x6c,0x77,0x80, +0x4b,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46,0x2e,0x44,0x16, +0xe3,0x12,0xa0,0xa8,0x7c,0x6b,0xbe,0x60,0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c, +0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, +0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xb1, +0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70,0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, +0x38,0x11,0x12,0xa0,0xa1,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, +0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16,0x9e,0x60,0xe, 0x12,0xa0,0xa1,0x60,0x5, +0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60, +0x1c,0x12,0xa0,0xa1,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4, +0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b,0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4, +0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93, +0x22,0xca,0xf8,0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0xa1, +0x3d,0x7e,0x8, 0x1f,0x3c,0x12,0xa1,0x45,0xd2,0x3, 0x7e,0x8, 0x2a,0xfb,0x7c,0xbf, +0x12,0x9f,0xbf,0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f, +0x5c,0x7d,0x32,0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c, +0x77,0x80,0xe, 0x12,0xa1,0x8d,0x50,0x7, 0x12,0xa1,0x84,0x19,0x51,0x1f,0x3c,0xb, +0x70,0xbc,0xf7,0x38,0xee,0x12,0xa1,0x2a,0xe4,0x12,0xa1,0x32,0xe4,0x12,0xc, 0x9b, +0x6d,0x33,0x7a,0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xa1,0x2a,0x74,0x1, 0x12, +0xa1,0x32,0x74,0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f, +0x58,0x22,0x12,0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, +0x8, 0xe4,0x2, 0x17,0x4e,0x7e,0x34,0x0, 0x1c,0x74,0x3f,0x2, 0x17,0x4e,0x7e,0x8, +0x1f,0x34,0x12,0xa1,0x45,0x6c,0x77,0x80,0xe, 0x12,0xa1,0x8d,0x50,0x7, 0x12,0xa1, +0x84,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x8d,0xbc,0x57,0x38,0xea,0xa9, +0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9,0xd6,0xea,0x7e,0x8, 0x1f, +0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x63,0xa, 0x16,0x22,0xa, 0x27,0x9, +0x62,0x2a,0xfb,0xbe,0x60,0x1c,0x22,0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a, +0x8d,0xa, 0xd8,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c, +0xaa,0x80,0x18,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3, +0xb, 0x5a,0xc0,0x9d,0xc2,0x59,0xc3,0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90, +0x60,0x92,0xe4,0x93,0x7c,0x9b,0x6d,0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60, +0x92,0xe4,0x93,0xa, 0xcb,0x1b,0xc4,0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c, +0xaa,0x80,0x28,0xa, 0x3a,0x7d,0x23,0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d, +0x3d,0x3e,0x34,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x17, +0x80,0x7d,0xa3,0xbd,0xfa,0x58,0x2, 0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, +0xc8,0x2d,0xec,0x2d,0xdc,0xb, 0xf0,0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22, +0xca,0xf8,0x6d,0x44,0x7e,0xf3,0x2a,0x8d,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e, +0xb3,0x2a,0x8c,0xa, 0xeb,0x2d,0xef,0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90, +0x60,0x94,0xe4,0x93,0xb4,0xff,0x31,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, +0xda,0x2d,0xdf,0x3e,0xd4,0x7e,0x1f,0x33,0xf8,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50, +0x2, 0xac,0x5a,0x7f,0x50,0x2d,0xb2,0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6, +0xb, 0xa0,0xbc,0xfa,0x38,0xd9,0x80,0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x33,0xf8, +0x2d,0x15,0x6c,0xaa,0x80,0x2c,0xa, 0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x33,0xf8, +0x2d,0x3e,0xb, 0x1a,0xe0,0x7e,0x70,0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a, +0xd0,0x7d,0x3e,0x9d,0x3d,0x12,0x17,0x80,0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c, +0xb, 0xa0,0xbc,0xfa,0x38,0xd0,0x7d,0x34,0xda,0xf8,0x22,0x7e,0x27,0x28,0xa3,0x6d, +0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e,0x90,0x2, 0xac,0x9a,0x49, +0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11,0x7e,0xb3,0x25,0xf6,0xb4, +0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80,0xc, 0xbd,0x1, 0x58,0x8, +0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e,0x7e,0x90,0x2, 0xac,0x9a, +0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, 0x11,0x7e,0xb3,0x25,0xf6, +0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76,0x80,0xc, 0xbd,0x1, 0x58, +0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x93,0xa, +0xb, 0x7e,0xb3,0x2a,0x92,0xa, 0x4b,0x2d,0x40,0xa, 0xa, 0xbd,0x4, 0x48,0x88,0x22, +0xe4,0x7a,0xb3,0x38,0xd9,0x22,0x7e,0xb3,0x37,0x2e,0x70,0x6, 0x12,0xa3,0x8f,0x2, +0xa3,0x50,0x12,0xa3,0x95,0x12,0xa8,0x78,0x50,0xa, 0x12,0xa6,0xed,0x7c,0x3b,0x12, +0xa3,0x8f,0x80,0x5, 0x12,0xa5,0x92,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12, +0xa7,0xfc,0x60,0xa, 0x7a,0x33,0x37,0x31,0x74,0x1, 0x7a,0xb3,0x2a,0x26,0x22,0xe4, +0x7a,0xb3,0x2f,0x9f,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x20,0x7e,0xb3,0x2a,0x21,0xbe, +0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28,0x86,0xbe,0x44,0x0, +0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x9f,0x4c,0xff,0x68,0x17,0x7e,0x47,0x2b, +0xd6,0x4d,0x44,0x78,0xf, 0x12,0xa9,0xb, 0x74,0x1, 0x7a,0xb3,0x38,0x8d,0x7a,0xb3, +0x37,0x3, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e,0x37,0x2b,0xd6,0x7a, +0x37,0x2f,0xa1,0x7e,0xb3,0x2f,0x9f,0xb4,0x3, 0x1f,0x7e,0x37,0x2b,0xd6,0xbe,0x34, +0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x9f,0x7e,0x37,0x2f,0xb7,0x7e,0x27, +0x2f,0xb9,0x12,0xa4,0xa6,0x81,0x9f,0x80,0x0, 0x12,0xa8,0xa8,0x81,0x9f,0x7e,0xc7, +0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57,0xbe,0xa0,0x1, 0x78, +0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xa7,0x97,0x12,0xa4,0xa2,0x74,0x1, 0x7a,0xb3,0x2f, +0x9f,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0xa7,0x9e,0x27,0x2f,0xaf, +0x7e,0x14,0x62,0xa1,0x12,0xa5,0x51,0xbd,0x23,0x38,0x13,0x7e,0x27,0x2f,0xb5,0x9e, +0x27,0x2f,0xad,0x7e,0x14,0x62,0xa3,0x12,0xa5,0x51,0xbd,0x23,0x28,0x15,0x74,0x3, +0x7a,0xb3,0x2f,0x9f,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a,0xc7,0x2f,0xb7,0x7a, +0xd7,0x2f,0xb9,0x7e,0xb3,0x2f,0x9f,0x60,0x26,0x7d,0x3c,0x7d,0x2d,0x7e,0x17,0x2b, +0xda,0x7e,0x7, 0x2b,0xdc,0x12,0xa7,0x7b,0xa, 0x2b,0x7e,0x73,0x2f,0x9e,0xa, 0x37, +0xbd,0x32,0x58,0xb, 0x12,0xa4,0xa2,0x7a,0xc7,0x2b,0xda,0x7a,0xd7,0x2b,0xdc,0xda, +0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24,0x12,0xa8,0x83,0x7d, +0x31,0x12,0xa7,0x6, 0x2, 0xa4,0xb7,0x7e,0x3, 0x2f,0xc7,0xbe,0x0, 0xf0,0x50,0x2, +0xa1,0x50,0xa1,0x45,0x6c,0x99,0x7e,0xb3,0x2f,0x9e,0xbe,0xb0,0x20,0x50,0x5, 0x4, +0x7a,0xb3,0x2f,0x9e,0x7e,0x1f,0x2b,0xde,0x7a,0x1f,0x1f,0x34,0x7e,0x80,0x1, 0x80, +0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xde,0x49,0x25,0x2b,0xe0,0x7e,0x17,0x1f, +0x34,0x7e,0x7, 0x1f,0x36,0x12,0xa7,0x7b,0x7c,0x1b,0x7e,0x3, 0x2f,0x9e,0xbc,0x1, +0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b,0xde,0x7e,0x14,0x1f, +0x34,0x74,0x4, 0x12,0x15,0xfc,0x7e,0x34,0x1f,0x34,0x7e,0x30,0x4, 0xac,0x39,0x2e, +0x14,0x2b,0xde,0x74,0x4, 0x12,0x15,0xfc,0xb, 0x80,0x7e,0x3, 0x2f,0xc7,0xbc,0x8, +0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xc7,0x7e,0x3, 0x2f,0x9e, +0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xc7,0xbe,0x0, 0xec,0x40,0x2, 0x81,0xc4, +0x22,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0x13,0x7e,0x54,0x62,0x6f,0x12, +0xa5,0x88,0x50,0x21,0x7e,0x54,0x62,0x71,0x12,0xa5,0x88,0x28,0x18,0x7e,0x14,0x62, +0x73,0x12,0xa5,0x51,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x75,0x12,0xa5,0x51,0xbd, +0x32,0x28,0x2, 0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd, +0x31,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd,0x7e,0xd3, +0x2a,0x20,0x7e,0xe3,0x2a,0x21,0x7e,0xb3,0x38,0xd9,0x60,0x11,0x7e,0xc7,0x38,0xe2, +0x4d,0xcc,0x78,0x2, 0xc1,0x86,0xbe,0xd0,0x1, 0x28,0x2, 0xc1,0x86,0xbe,0xd0,0x1, +0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xc1,0x86,0x7e,0xe7,0x29,0x8, 0x7e,0xf7,0x29, +0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0xa5,0x59,0xbe,0xb0,0x1, 0x78,0x2, 0xc1,0x86,0x7e, +0xa3,0x38,0xd9,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23,0x14,0x78, +0x2, 0xc1,0x83,0xb, 0xb2,0x68,0x2, 0xc1,0x86,0xbe,0xd0,0x1, 0x68,0x2, 0xc1,0x95, +0x4c,0xee,0x68,0x2, 0xc1,0x95,0x74,0x1, 0x7a,0xb3,0x38,0xd9,0x12,0xa6,0xa4,0x80, +0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3,0x38,0xd9, +0x7e,0x34,0x62,0x7b,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xd9,0x7e,0x34,0x62,0x7f, +0x80,0x48,0x12,0xa6,0xad,0x90,0x62,0x6e,0x12,0xa6,0xb6,0x68,0x49,0x80,0x56,0xbe, +0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xa6,0xad,0x7e,0x34,0x62,0x77,0x12, +0xa6,0x9c,0x7e,0x14,0x62,0x7b,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d,0xc3,0xbe, +0xc7,0x38,0xe2,0x40,0x21,0x90,0x62,0x6d,0x12,0xa6,0xb6,0x68,0x19,0x12,0xa6,0xa4, +0x74,0x3, 0x7a,0xb3,0x38,0xd9,0x7e,0x34,0x62,0x7b,0x12,0xa6,0x9c,0x7a,0x37,0x38, +0xe2,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xd9,0x6d,0x33,0x7a,0x37,0x38, +0xe2,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x30,0x22,0x7a,0xe7,0x38,0xda,0x7a,0xf7,0x38,0xdc,0x22,0x7a,0xe7,0x38, +0xde,0x7a,0xf7,0x38,0xe0,0x22,0xe4,0x93,0xa, 0x3b,0x12,0xa6,0xc2,0xa, 0xdb,0x4d, +0xdd,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x7e,0x37,0x38,0xde,0x9e,0x37, +0x38,0xda,0x12,0x17,0x80,0xbd,0x31,0x38,0x12,0x7e,0x37,0x38,0xe0,0x9e,0x37,0x38, +0xdc,0x12,0x17,0x80,0xbd,0x31,0x38,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x12,0xa7,0x72, +0x7a,0x37,0x2f,0xbb,0x12,0xa6,0xfd,0x7a,0x37,0x2f,0xbd,0xe4,0x22,0x7e,0x37,0x2f, +0xb5,0x9e,0x37,0x2f,0xad,0x22,0x7e,0x17,0x2f,0xaf,0xbd,0x13,0x28,0xa, 0x7a,0x37, +0x2f,0xaf,0x7a,0x27,0x2f,0xb1,0x80,0x10,0x7e,0x17,0x2f,0xa7,0xbd,0x13,0x50,0x8, +0x7a,0x37,0x2f,0xa7,0x7a,0x27,0x2f,0xa9,0x7e,0x17,0x2f,0xad,0xbd,0x12,0x28,0xa, +0x7a,0x27,0x2f,0xad,0x7a,0x37,0x2f,0xab,0x80,0x10,0x7e,0x17,0x2f,0xb5,0xbd,0x12, +0x50,0x8, 0x7a,0x27,0x2f,0xb5,0x7a,0x37,0x2f,0xb3,0x7e,0xb3,0x2f,0xc7,0xb4,0xa, +0xf, 0x12,0xa7,0x72,0x7a,0x37,0x2f,0xbf,0x12,0xa6,0xfd,0x7a,0x37,0x2f,0xc1,0x22, +0xb4,0x14,0xe, 0x12,0xa7,0x72,0x7a,0x37,0x2f,0xc3,0x12,0xa6,0xfd,0x7a,0x37,0x2f, +0xc5,0x22,0x7e,0x37,0x2f,0xa7,0x9e,0x37,0x2f,0xaf,0x22,0x7d,0x51,0x7d,0x12,0x9d, +0x35,0x12,0x17,0x80,0x7c,0xa7,0x7d,0x31,0x9d,0x30,0x12,0x17,0x80,0x7c,0xb7,0xbc, +0xba,0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x9f,0x7e, +0x34,0x0, 0x28,0xe4,0x12,0x17,0x4e,0x7e,0x8, 0x2b,0xde,0x7e,0x34,0x3, 0xc0,0x12, +0x17,0x4e,0x7a,0xb3,0x37,0x31,0x7e,0x34,0x62,0xa5,0x12,0xa6,0x9c,0x7a,0x37,0x2b, +0xd6,0x7a,0xe7,0x2f,0xa3,0x7a,0xf7,0x2f,0xa5,0x7a,0xe7,0x2f,0xa7,0x7a,0xe7,0x2f, +0xab,0x7a,0xe7,0x2f,0xaf,0x7a,0xe7,0x2f,0xb3,0x7a,0xf7,0x2f,0xa9,0x7a,0xf7,0x2f, +0xad,0x7a,0xf7,0x2f,0xb1,0x7a,0xf7,0x2f,0xb5,0x7a,0xe7,0x2b,0xda,0x7a,0xf7,0x2b, +0xdc,0x7a,0xb3,0x2f,0xc7,0x74,0x2, 0x7a,0xb3,0x2f,0x9e,0x22,0x7c,0x7b,0xa, 0x57, +0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7c,0x67, +0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xf7,0xa, 0x47,0x5d,0x42,0x7e,0x73, +0x37,0x2f,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xa8,0x6f,0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0x7e,0x53,0x38,0xf8,0xa, 0x45,0x5d,0x43,0x7e,0x73,0x37,0x30,0x80,0x1a, +0x12,0xa8,0x6f,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x2a,0x9, 0xb2,0x38,0xf7, +0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x31,0xa, 0x57,0x5d,0x54,0x22,0x7c, +0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f,0x9f,0xb4,0x4, 0x2, 0xd3, +0x22,0xc3,0x22,0x7e,0xa3,0x2f,0xc7,0xbe,0xa0,0xf0,0x50,0x1b,0x74,0x4, 0xa4,0x59, +0x35,0x2b,0xde,0x7e,0xa3,0x2f,0xc7,0x74,0x4, 0xa4,0x59,0x25,0x2b,0xe0,0x7e,0xb3, +0x2f,0xc7,0x4, 0x7a,0xb3,0x2f,0xc7,0x22,0x74,0xfe,0x7a,0xb3,0x37,0x31,0xe4,0x7a, +0xb3,0x2f,0x9f,0x22,0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x28,0xa1,0x7e,0x34,0x0, 0x2, +0x7a,0x37,0x28,0xa3,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x20,0x7a,0xb3,0x2b,0x3c,0x22, +0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x7c,0x59,0x32,0x36,0x80,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x19,0xb4,0x1f,0x50,0x22,0xe5,0x2a,0xa, 0x2b,0x1b, +0x24,0xe5,0x29,0xa, 0x3b,0xbd,0x32,0x22,0x7e,0x73,0x28,0x84,0xbe,0x70,0x1, 0x22, +0x7e,0x73,0x38,0xee,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0x6d,0x33,0x7a,0x37,0x38, +0x8b,0x22,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e,0x7b,0x60,0x22,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x7e,0x50,0x2, +0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, 0x2d,0x1b,0x24,0xa, 0x3a,0xbd,0x32,0x22, +0x7e,0x37,0x25,0xf4,0x7a,0x37,0x31,0xeb,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x31, +0xed,0x22,0x7e,0x73,0x37,0xcb,0x7a,0x73,0x2b,0x3f,0x22,0x7e,0xb3,0x37,0xee,0x7e, +0x34,0x0, 0x4, 0x22,0x7d,0x2e,0x12,0x15,0x29,0x7d,0xf3,0x22,0x7e,0x34,0x0, 0xc8, +0x2, 0x1a,0x0, 0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0xff,0xa9,0x7c,0x56,0x83, +0x32,0xcd,0x4, 0x6d, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg.txt new file mode 100644 index 0000000000000..95f25982efc49 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg.txt @@ -0,0 +1,2820 @@ +0x2, 0x16,0x42,0x2, 0xa3,0xd6,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x49,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x50,0x93,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x70,0x54,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x22,0x2, 0x70,0x70,0x2, 0x28,0x88,0x32,0x32,0x2, 0x0, 0x4a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xb2,0x86,0x22,0xff,0xff,0x2, 0x0, 0x5a,0xb2,0x82, +0x22,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xf, 0x7e,0xf, 0x39,0x9b, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x39,0xab,0x7e,0x73,0x39,0xab,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xe, 0x80,0x2, 0xc2,0xe, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x72,0x97,0x7e,0x1f,0x39,0x9b,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x39,0x9b,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x39,0x9f,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x39,0xa7,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x39,0xa5,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x39,0xca,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0x63,0x28,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x14,0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x14, +0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x52,0x61,0x3f,0x7e,0x34,0x14,0x89,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x61,0x3f,0x7e,0x34,0x14,0x89,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x14,0x22,0x61,0x3f,0x7e,0x34,0x14,0x6, 0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x14,0x36,0x61,0x3f,0x7e,0x34,0x14,0x7a,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14, +0x61,0x61,0x3f,0x7e,0x34,0x14,0xb5,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x14,0x99,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x14,0xd9,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x14,0xda,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x1, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x34,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x1, 0xe5,0x34,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x39,0x9b,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x39,0x9b,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x39, +0x9b,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x39,0x9b,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x17,0x53,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x33,0xfc,0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x39,0xca,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x39,0x93,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x39, +0xca,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x39,0x93,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x39,0xca,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x39,0xca,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x39,0xca,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x39,0x9b,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x15,0x29,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x39,0x9b,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x15,0x29,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x15,0x29,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x39,0x9b,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x33,0xfc,0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x33,0xfc,0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x33,0xfc,0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x33,0xfc, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x33,0xfc, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x33,0xfc,0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x39,0xc6,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x39, +0xc6,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x39,0xc6,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x39,0xc6,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x39,0x93,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x39,0x93,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x39,0x93,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x39,0x93,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x39,0x9b,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x39,0x9b,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x39, +0x9b,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x39,0x9b,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x39,0x9b,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x39,0x9b,0x69,0x40,0x0, 0x22,0x30,0x1, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x39,0x9b,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x39,0x9b,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x39, +0x9b,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x39,0x9b, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x39,0x9b,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x39,0x9b,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x39,0x9b,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x39,0x9b,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x15,0x29,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x15,0x29,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x39,0xc6,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x39,0xc6,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x39,0xc6,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x1d,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x33,0xfc, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x33,0xfc,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x33, +0xfc,0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x39,0x9b,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x39,0x9b,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x39,0x9b,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x39,0x9b, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x39,0x9b,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x39,0x9b,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x33,0xfc,0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x33,0xfc,0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x33,0xfc,0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x33,0xfc,0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x39,0xca,0x79,0x30, +0x0, 0xe, 0xc2,0x1c,0xe4,0x7a,0xb3,0x39,0xc5,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x39,0x93,0x1b,0x1a,0x10,0x7e,0xf, 0x39,0x93,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x39, +0xca,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x39, +0xca,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x33,0xfc,0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x33,0xfc,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x33,0xfc,0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x33, +0xfc,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x33,0xfc,0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x1d,0x7e,0xf, 0x33,0xfc,0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x33,0xfc,0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x15,0xc8,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x15,0x5b,0x7d,0x1e,0x12,0x15,0x75,0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x39,0x9b,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x1c,0x7e,0xf, 0x39,0xca,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x39,0xc5,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x39,0xca,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x72,0x97,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x39,0x93,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x39,0x93,0x1b,0x1a,0x10,0x7e,0xf, 0x39,0x9b,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xf, 0xe4,0x7a,0xb3,0x39,0xab,0x7e,0x1f,0x39,0x93, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x39,0xc6,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x39,0xc6,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x39,0xc6,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x39,0x9b,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x39,0x9b,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x39,0xc6,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x39,0xc6,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x33,0xfc,0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x33,0xfc,0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x17,0x4, 0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x17,0x5, 0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x39,0x93,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x39,0x93,0x1b,0x1a,0x10,0x7e, +0x1f,0x39,0x93,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x39,0x9b,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x39,0xca,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x39,0x93,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x39,0x93,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x39, +0x9b,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x39,0x9b,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x1, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x39,0x9b,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x39,0x93,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x39,0x9b,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x15,0x77,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x15,0x77,0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0xe4,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1d,0x0, 0xc2,0x10,0xc2,0x11,0xc2,0x13,0x75,0x1e, +0x0, 0x75,0x1f,0x0, 0xc2,0xa, 0xc2,0xb, 0x75,0x5e,0x0, 0xc2,0x15,0x75,0x5f,0x0, +0xc2,0x17,0x75,0x60,0x0, 0xc2,0x18,0xc2,0x19,0xc2,0xc, 0x75,0x1b,0x0, 0x75,0x1c, +0x64,0xc2,0x1a,0xc2,0x1b,0x75,0x61,0x0, 0xd2,0x5, 0xd2,0x6, 0xd2,0x7, 0xd2,0x1c, +0xc2,0xe, 0xd2,0xf, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x17,0x95,0xb, 0xa, 0x40,0x5d, +0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0, +0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x28,0xf, +0x0, 0x0, 0x0, 0x47,0x0, 0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb, +0x1, 0xbb,0xc, 0x9e,0x19,0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11, +0x4, 0x12,0x5, 0x13,0x6, 0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19, +0xc, 0x1a,0xd, 0x1b,0xdf,0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d, +0x62,0x1c,0x55,0x1b,0x4a,0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15, +0x21,0x14,0x1c,0x13,0x19,0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8, +0x7f,0x20,0x80,0xa, 0x7e,0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff, +0xff,0xfc,0x7d,0xef,0x1b,0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10, +0xda,0xf8,0x22,0x7d,0x43,0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14, +0x4d,0x44,0x78,0xf5,0x22,0x32,0x1, 0x19,0x1, 0x0, 0x2, 0xf8,0x4, 0xe7,0x5, 0xce, +0x6, 0xc2,0x7, 0xb5,0x8, 0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff, +0x2, 0x0, 0x1, 0x2, 0xff,0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22, +0x6d,0x33,0x9d,0x32,0x22,0x0, 0x4, 0x34,0x8c,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x34, +0x4f,0x1, 0x0, 0x1, 0x25,0xf6,0x1, 0x0, 0x1, 0x38,0xb3,0x0, 0x0, 0x2, 0x39,0x5, +0x0, 0x0, 0x0, 0x2, 0x39,0x7, 0x0, 0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x37, +0xe7,0xff,0x0, 0x1, 0x39,0xe1,0x0, 0x0, 0x1, 0x39,0xe2,0x0, 0x0, 0x2, 0x35,0xa8, +0x0, 0x0, 0x0, 0x1, 0x35,0xcb,0x0, 0x0, 0x1, 0x36,0x44,0x0, 0x0, 0x1, 0x36,0x45, +0x0, 0x0, 0x1, 0x36,0x46,0x0, 0x0, 0x3c,0x36,0xef,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x37,0x67,0x0, 0x0, 0x1, 0x37,0x68,0x0, +0x0, 0x1, 0x37,0x69,0x0, 0x0, 0x1, 0x36,0xe8,0x1, 0x0, 0x2, 0x36,0xeb,0x0, 0x0, +0x0, 0x1, 0x2f,0xc8,0x0, 0x0, 0x1, 0x2f,0xc9,0x0, 0x0, 0x1, 0x2f,0xca,0x0, 0x0, +0x1, 0x2f,0xcb,0x0, 0x0, 0x1, 0x37,0x6c,0x1, 0x0, 0x1, 0x37,0xe6,0x0, 0x0, 0x1, +0x39,0xe3,0x0, 0x0, 0x6, 0x39,0xce,0x30,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39, +0xda,0x0, 0x0, 0x1, 0x39,0xdb,0x0, 0x0, 0x1, 0x39,0xdc,0x0, 0x0, 0x1, 0x39,0xdd, +0x0, 0x0, 0x1, 0x39,0xde,0x0, 0x0, 0x1, 0x0, 0x62,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x1, 0x31,0xed,0x0, 0x0, 0x2, 0x32,0xe, 0x0, 0x0, 0x0, 0x1, 0x32,0x4c,0x0, +0x0, 0x4, 0x38,0x58,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0xd4,0x0, 0x0, 0x1, 0x39, +0xd5,0x0, 0x0, 0x2, 0x39,0xd6,0x0, 0x0, 0x0, 0x1, 0x39,0xd8,0x64,0x0, 0x1, 0x39, +0xd9,0x0, 0x0, 0x1, 0x39,0xe4,0x0, 0x0, 0x1, 0x39,0xdf,0x0, 0x0, 0x1, 0x39,0xe0, +0x0, 0x0, 0x1, 0x39,0xb0,0x0, 0x0, 0x2, 0x2b,0xd8,0x2b,0xde,0x0, 0x1, 0x2f,0x9e, +0x2, 0x0, 0x1, 0x2f,0xc7,0x0, 0x0, 0x4, 0x39,0xc6,0x0, 0x0, 0x50,0x0, 0x0, 0x4, +0x39,0xca,0x0, 0x0, 0x64,0x0, 0x0, 0x4, 0x39,0x93,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, +0x39,0x97,0x0, 0x0, 0x68,0xc0,0x0, 0x4, 0x39,0x9b,0x0, 0x0, 0x68,0x0, 0x0, 0x4, +0x39,0xac,0x0, 0x0, 0x40,0x0, 0x0, 0x4, 0x33,0xfc,0x0, 0x0, 0x60,0x0, 0x0, 0x0, +0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58,0x0, 0xc, 0x1, 0x5e,0x1, 0xc2,0x0, 0xa, +0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78,0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78, +0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc, +0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, 0x0, 0x1e,0x12,0x27,0x6, 0x12,0x19,0xda, +0x12,0x19,0xa5,0x12,0x1a,0x7f,0x2, 0x19,0x69,0x12,0x19,0x7a,0x7e,0xb3,0x2b,0x2e, +0x12,0x97,0x34,0x74,0x1, 0x7a,0xb3,0x37,0x70,0x22,0x12,0x98,0xad,0x74,0x1, 0x7a, +0xb3,0x37,0x6c,0x22,0x12,0x1a,0x11,0x12,0x3f,0x81,0x12,0x28,0x31,0x12,0x27,0x6, +0x12,0x1a,0x11,0x12,0x19,0xda,0x12,0x38,0x39,0x12,0x19,0xa5,0x12,0x1a,0x7f,0x12, +0x1a,0xaf,0x2, 0x19,0x69,0x12,0x28,0x7a,0x12,0x19,0xf7,0x2, 0x19,0xae,0x7e,0x34, +0x0, 0x3, 0x6d,0x22,0x2, 0x19,0xb7,0x7d,0x43,0x7e,0xa3,0x34,0x38,0xbe,0xa0,0x5, +0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34,0x3b,0x59,0x23,0x34,0x3d,0x7c, +0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22,0x12,0x68,0xb1,0x12,0x6c,0x4b, +0x2, 0x19,0xe3,0x30,0x13,0x10,0x12,0x27,0xfe,0x50,0x3, 0x12,0x23,0x59,0x12,0x6a, +0x80,0x12,0x6c,0xc6,0xc2,0x13,0x22,0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x19,0xb7, +0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, 0x7a,0x2, 0x19,0xb7,0x74,0x1, 0x7a,0xb3,0x38, +0xb8,0x7e,0x34,0xd, 0xac,0x6d,0x22,0x7a,0x27,0x33,0xeb,0x7a,0x37,0x33,0xed,0x22, +0xca,0xf8,0x7e,0xf3,0x38,0xb8,0xbe,0xf0,0x5, 0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x38, +0xb8,0x12,0x0, 0xa, 0x80,0x40,0xbe,0xf0,0x4, 0x78,0xd, 0x12,0x1a,0xb, 0xe4,0x7a, +0xb3,0x2b,0x21,0x12,0x68,0xb1,0x80,0x2e,0xbe,0xf0,0x6, 0x78,0x13,0x12,0x1a,0xb, +0x12,0x22,0x83,0xe4,0x7a,0xb3,0x2b,0x3d,0x12,0x6c,0x4b,0x12,0xb0,0xe, 0x80,0x16, +0xbe,0xf0,0x7, 0x78,0x17,0x12,0x1a,0xb, 0x12,0x6c,0x71,0x50,0xfb,0x12,0x6f,0xe3, +0x12,0x19,0xe3,0x12,0x1a,0x7f,0x74,0x2, 0x7a,0xb3,0x38,0xb8,0xda,0xf8,0x22,0xe4, +0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34,0x39,0x12,0x67,0x97,0xb4,0x1, 0x4, 0x74,0x1, +0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34,0x3a,0x22,0x12,0x38,0x39,0x12,0xaf,0x4d,0x7a, +0x37,0x39,0xd6,0x12,0x1a,0x11,0x12,0x19,0xda,0x12,0x1a,0x7f,0x2, 0x1a,0xaf,0x12, +0x8c,0x4c,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x35,0x92,0xe4,0x7a, +0xb3,0x35,0x93,0x22,0xca,0x3b,0x12,0x6c,0x71,0x50,0xfb,0x7e,0xf3,0x2b,0x2e,0x7c, +0xbf,0x12,0x6e,0xd6,0x12,0x90,0xc3,0x7e,0xb3,0x2b,0x3e,0xf5,0x28,0x7e,0xc3,0x2b, +0x3f,0x7e,0xb3,0x38,0xf, 0xb4,0x1, 0xf, 0x12,0x20,0xc9,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x1a,0x7f,0xc3,0x61,0xc0,0x12,0x1b,0xc3,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x17,0x2e,0x1b,0xfd,0x12,0x1b,0xc3,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x17,0x2e,0x1b,0xfd,0x7e, +0xb3,0x38,0xf, 0xb4,0x3, 0x7, 0x12,0x8f,0xeb,0x7a,0x37,0x38,0xfb,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x19,0xda,0x12,0x8f,0xdc,0x12,0x21,0x4b,0xe4,0x12,0x13,0xde, +0x12,0x1a,0x7f,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x29,0x7e,0x18,0x6, 0x76,0x7e,0xb3, +0x2b,0x91,0x12,0x69,0x7b,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x29,0x7e,0x18,0x5, 0xf8, +0x7e,0xb3,0x25,0xf0,0x12,0x69,0x7b,0x7e,0xd3,0x2b,0x3e,0x7e,0xe3,0x2b,0x3f,0xe5, +0x28,0x7a,0xb3,0x2b,0x3e,0x7a,0xc3,0x2b,0x3f,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, +0xc8,0x7d,0x20,0x7d,0x10,0x12,0x6b,0x4, 0x7a,0xd3,0x2b,0x3e,0x7a,0xe3,0x2b,0x3f, +0x7c,0xbf,0x12,0x6e,0x5a,0x12,0x8f,0x8a,0x7e,0xb3,0x39,0xd9,0x4, 0x7a,0xb3,0x39, +0xd9,0x7e,0x73,0x39,0xd9,0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0xd9, +0x7e,0xb3,0x16,0x90,0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3, +0xda,0x3b,0x22,0x7e,0x73,0x2a,0x93,0xa, 0x27,0x7e,0x73,0x2a,0x92,0xa, 0x37,0x2d, +0x32,0x22,0x12,0x37,0xfe,0x7e,0xb3,0x38,0xf, 0xb4,0x3, 0x6c,0x12,0xa5,0x9a,0x12, +0x3f,0xcf,0x12,0x1e,0xaf,0x7e,0xb3,0x38,0xb4,0x30,0xe7,0xe9,0x12,0x1a,0xc4,0x12, +0x1b,0xc3,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x17, +0x2e,0x1b,0xfd,0x12,0x1b,0xc3,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, +0x5, 0x7a,0x12,0x17,0x2e,0x1b,0xfd,0x7e,0xb3,0x2b,0x3c,0xb4,0x1, 0x18,0x12,0x5d, +0xa8,0x12,0x5b,0x2b,0x12,0x51,0x88,0x12,0x5f,0xb7,0x12,0x7b,0xd8,0x12,0x2f,0x9e, +0x12,0x1c,0x59,0x12,0x3f,0xfa,0x12,0x38,0x44,0x12,0x32,0x6e,0x7e,0xb3,0x38,0xb4, +0x54,0x7f,0x7a,0xb3,0x38,0xb4,0x80,0x8d,0x12,0x6f,0xc3,0x2, 0x1c,0x4e,0x7e,0xb3, +0x38,0x56,0x70,0x4, 0xe4,0x12,0x7b,0xbe,0x22,0x12,0x55,0x30,0x12,0x1e,0x4d,0x12, +0x1e,0x4d,0x12,0x7f,0xb2,0x12,0x78,0x5f,0x12,0x8d,0xa, 0x12,0x1e,0x4d,0x12,0x9c, +0x48,0x12,0x1e,0x4d,0x12,0x8d,0xbf,0x12,0x1e,0x4d,0x2, 0x1c,0x7d,0xca,0x3b,0x75, +0x24,0x0, 0x6c,0xcc,0x6c,0xdd,0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x37,0x2b, +0x7e,0x8, 0x36,0xef,0x12,0x17,0x2e,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e, +0xc4,0xca,0xc9,0x7e,0x18,0x26,0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x17,0x2e,0x1b,0xfd, +0x6c,0x88,0x6c,0xee,0xa1,0x51,0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80, +0x4c,0x74,0x2, 0xac,0xb9,0x9, 0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9, +0x12,0x1e,0x96,0x60,0x36,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74, +0x2, 0xac,0xbe,0x9, 0x75,0x37,0x2c,0x12,0x1e,0x8f,0x7d,0x13,0x74,0x2, 0xac,0xb9, +0x9, 0x75,0x1f,0x34,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x37,0x2b,0x12,0x1e, +0x8f,0x2d,0x13,0xbd,0xc1,0x28,0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38, +0xb0,0xbe,0xc0,0xff,0x68,0x39,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, +0x73,0x1f,0x35,0x12,0x2c,0xb9,0xbe,0x37,0x2a,0x79,0x48,0x23,0x7e,0x70,0x2, 0xac, +0x7c,0x9, 0x53,0x1f,0x34,0x74,0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f, +0x35,0x19,0x55,0x1f,0x71,0x74,0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, +0xe0,0x7e,0x73,0x36,0xee,0xbc,0x7e,0x28,0x2, 0x81,0xb6,0x7c,0xe8,0x80,0x6d,0x6d, +0xdd,0x7e,0x80,0xff,0x6c,0x99,0x80,0x3c,0x7c,0xb9,0x12,0x1e,0x96,0x60,0x33,0x12, +0xaf,0xd6,0xbe,0xb0,0xff,0x68,0x2b,0x9, 0x73,0x1f,0x35,0x12,0x4c,0x21,0x7f,0x71, +0xb, 0x7a,0x50,0xbe,0x54,0x0, 0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a, +0xc0,0xbd,0xcd,0x8, 0xd, 0x12,0xaf,0xd6,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc, +0x7c,0x89,0xb, 0x90,0xbc,0xf9,0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24, +0x74,0x2, 0xac,0xbd,0x19,0x75,0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e, +0x70,0x2, 0xac,0x78,0x19,0xa3,0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0xbe,0xe0,0xa, 0x40, +0x8e,0x90,0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f, +0x70,0x7e,0x8, 0x1f,0x34,0x12,0x17,0x2e,0x1b,0xfd,0x7c,0xfd,0x7e,0x8, 0x37,0x2b, +0x7e,0x34,0x0, 0x14,0x74,0xff,0x12,0x17,0x53,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x17,0x2e,0x1b, +0xfd,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x37,0x2b,0x12, +0x17,0x2e,0x1b,0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x54,0xca,0xb, 0xe0,0xbc, +0xfe,0x38,0xf5,0x7a,0xf3,0x36,0xee,0x7a,0xf3,0x28,0x84,0x7e,0x73,0x28,0x84,0xbe, +0x70,0xa, 0x28,0x6, 0x74,0xa, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c, +0xff,0x6c,0xee,0x80,0x2e,0x7c,0xbe,0x12,0x1e,0x96,0x60,0x25,0x7e,0x34,0x0, 0x2, +0xca,0x39,0xac,0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e, +0x14,0x26,0xfa,0x6d,0x0, 0x12,0x17,0x2e,0x1b,0xfd,0x7c,0xbf,0x12,0x54,0xca,0xb, +0xf0,0xb, 0xe0,0x12,0x7d,0xfd,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0xa, +0x37,0x9d,0x32,0x2, 0x17,0x85,0x7c,0x7b,0x12,0x53,0x37,0x9, 0xa2,0x27,0x72,0x7c, +0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x6e,0x51,0x5c,0xba,0x22,0x30, +0x8, 0x3b,0xc2,0x8, 0x12,0x1a,0x20,0x7e,0x73,0x38,0xb9,0x7a,0x73,0x2a,0x6c,0x7e, +0x73,0x38,0xba,0x7a,0x73,0x2b,0x3c,0x7e,0x73,0x38,0xba,0x7a,0x73,0x2b,0x20,0x7e, +0xb3,0x38,0xbb,0x60,0x18,0x7e,0x34,0x0, 0x2, 0x12,0x38,0x84,0x7e,0x34,0x0, 0x1, +0x12,0x38,0x84,0x6d,0x33,0x12,0x38,0x84,0xe4,0x7a,0xb3,0x38,0xbb,0x12,0x36,0x25, +0x2, 0x1e,0xf3,0xe5,0xc, 0x70,0x3, 0x2, 0x20,0x16,0xe5,0xc, 0x30,0xe0,0x10,0x53, +0xc, 0xfe,0x12,0x98,0xe, 0x12,0x64,0x10,0x7e,0x8, 0x2a,0x8c,0x12,0x9, 0xa1,0xe5, +0xc, 0x30,0xe1,0x6, 0x53,0xc, 0xfd,0x12,0xa9,0x6, 0xe5,0xc, 0x30,0xe2,0x32,0x53, +0xc, 0xfb,0x7e,0xb3,0x2b,0x31,0x60,0x9, 0x7e,0x8, 0x2a,0x8c,0x12,0x6, 0xba,0x80, +0xb, 0x7e,0xb3,0x2b,0x84,0x7e,0x73,0x2b,0x83,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x31, +0x2e,0x70,0xff,0x92,0x1, 0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x96,0x12,0xb, +0x1e,0xe5,0xc, 0x30,0xe3,0x4a,0x53,0xc, 0xf7,0x7e,0x73,0x38,0xe6,0x7a,0x73,0x2b, +0x2e,0x12,0x6e,0xb4,0x7a,0xb3,0x0, 0x62,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20, +0x7e,0x73,0x0, 0x62,0x7a,0x73,0x38,0xbe,0x12,0x21,0x43,0x12,0x27,0xf0,0x7e,0x73, +0x38,0xe7,0xbe,0x73,0x2b,0x81,0x68,0x6, 0x7a,0x73,0x2b,0x81,0xd2,0x10,0x30,0x10, +0x9, 0xc2,0x10,0x12,0x27,0xe0,0xe4,0x12,0xa, 0x66,0x12,0x19,0x7a,0x12,0x97,0x30, +0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43,0x38,0xe8,0x7e,0x50,0xa, 0xac, +0x45,0x12,0x27,0xf7,0xe5,0xc, 0x30,0xe6,0x4e,0x53,0xc, 0xbf,0x7e,0x73,0x38,0xd4, +0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x38,0xd4,0xa9,0xd5,0xcb,0x74,0xe, +0x12,0x7, 0xfb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63,0x38,0xd4,0xa, 0x26,0x2e,0x24, +0x0, 0x3, 0x12,0x43,0xe2,0x7c,0x65,0x4c,0x76,0x74,0xe, 0x12,0x3a,0x6a,0x12,0x7, +0xfb,0x12,0x3a,0xb5,0x7e,0x73,0x38,0xd7,0x7a,0x73,0x2b,0x33,0x7e,0x73,0x38,0xd6, +0x7a,0x73,0x2b,0x3e,0x12,0xb0,0xe, 0xe5,0xc, 0x30,0xe5,0xa, 0x53,0xc, 0xdf,0x7e, +0xb3,0x38,0xbe,0x2, 0x20,0x17,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x7e,0xa0,0x4, +0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, 0x12,0x20,0x7f,0x38, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80,0x1a,0xbe,0xd0,0x81, +0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x20,0x7f,0x40,0x4, 0x7c,0xeb,0x7c, +0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c,0xdd,0x7c,0xbd,0x12, +0x20,0x8b,0x12,0x22,0xd4,0x12,0x27,0x5e,0x12,0x22,0x7a,0x7e,0x73,0x2b,0x2e,0x7a, +0x73,0x38,0xe6,0x12,0x38,0x27,0x7a,0xd3,0x38,0xbe,0xda,0x79,0xda,0xd8,0x22,0x7e, +0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26,0x33,0xbc,0xbe,0x22,0xca,0xf8,0x7c,0xfb,0x74, +0x5, 0xac,0xbf,0x12,0x27,0x67,0x12,0x27,0x55,0x12,0x27,0x43,0x12,0x27,0x4c,0x7a, +0xf3,0x0, 0x62,0x7c,0xbf,0x12,0x9b,0x97,0x12,0x21,0x43,0x74,0x5, 0xac,0xbf,0x9, +0xb5,0x26,0x37,0x12,0x98,0xdf,0x12,0x19,0x6c,0xe4,0x7a,0xb3,0x16,0x91,0x7a,0xb3, +0x37,0xe2,0x7a,0xb3,0x16,0x92,0xda,0xf8,0x22,0x7e,0xb3,0x37,0x6c,0x60,0x6, 0x14, +0x7a,0xb3,0x37,0x6c,0x22,0x12,0x97,0xd2,0x7e,0xb3,0x37,0xf3,0x70,0xe, 0x7e,0xb3, +0x39,0xe3,0xb4,0x1, 0x7, 0xe4,0x12,0x20,0x8b,0x12,0x95,0xf6,0x12,0x21,0x3, 0x12, +0x94,0x51,0x7e,0xa3,0x37,0xf3,0x7a,0xa3,0x39,0xe3,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x20,0x8b,0x22,0x12,0x93,0xc2,0x2, 0x21,0x9, 0x7e,0xb3,0x37,0x6f,0x60,0xf, 0x74, +0x1, 0x7a,0xb3,0x37,0x77,0x7e,0xb3,0x37,0xe5,0x70,0x3, 0x12,0x96,0x67,0x7e,0xb3, +0x37,0x77,0xb4,0x1, 0xc, 0x74,0x3, 0x7a,0xb3,0x35,0xb6,0x7e,0x34,0x14,0x0, 0x80, +0x9, 0xe4,0x7a,0xb3,0x35,0xb6,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0x2a,0x81,0x22,0x7a, +0xb3,0x2b,0x2e,0x12,0x21,0xa5,0x7a,0x37,0x2b,0x3a,0x22,0x7e,0xa3,0x0, 0x62,0xbe, +0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xff,0x68,0x42,0x74,0x5, 0xa4,0x12,0x27,0x67, +0x12,0x21,0x9d,0x12,0x27,0x55,0x12,0x21,0x9d,0x12,0x27,0x4c,0x12,0x27,0xfe,0x50, +0x9, 0x7e,0xb3,0x0, 0x62,0x12,0x9b,0x97,0x80,0x6, 0x12,0x21,0x9d,0x12,0x27,0x43, +0x12,0x21,0x43,0x12,0x27,0x3c,0x7e,0x73,0x2b,0x33,0xa, 0x37,0x7e,0xf, 0x39,0x9b, +0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x62,0x7a,0x73,0x3, 0xff,0x22,0x7e,0xa3,0x0, +0x62,0x74,0x5, 0xa4,0x22,0x7e,0x23,0x2b,0x2e,0x7e,0x33,0x38,0xe5,0xac,0x23,0x2e, +0x14,0x1, 0xf4,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, 0xa, 0x7e,0x63,0x2b, +0x2f,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe,0x14,0x7, 0x8, 0x40, +0x3, 0xe4,0x80,0x2, 0x74,0x1, 0x7a,0xb3,0x2b,0x2f,0x7e,0x73,0x2b,0x2f,0xbc,0x76, +0x68,0x2, 0xd2,0x10,0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c,0x17,0xbe,0x10, +0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x39,0x93,0x69,0x51,0x0, 0x86,0x54,0x1f, +0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x5, 0x79,0x1, +0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, 0x15,0xc8,0x12, +0x21,0x3f,0x30,0x10,0xc, 0xc2,0x10,0x12,0x27,0xe0,0x30,0x0, 0x4, 0xe4,0x12,0xa, +0x66,0x30,0x0, 0x9, 0x12,0x98,0xad,0x12,0x97,0x30,0x2, 0x7e,0xc, 0x22,0x7e,0xb, +0x70,0x7a,0x73,0x2b,0x2e,0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b,0x81,0x29,0x70,0x0, +0x1, 0x7a,0x73,0x2b,0x33,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b,0x3f,0x12,0x21,0x43, +0x12,0x27,0x3c,0xd2,0x0, 0xc2,0x1, 0x2, 0x22,0x6a,0x30,0x0, 0x3, 0x12,0x22,0xd4, +0xa2,0x1, 0x92,0x2, 0x12,0x82,0x93,0x2, 0x22,0x7a,0x7e,0x73,0x2b,0x3f,0x7a,0x73, +0x38,0xd5,0x22,0x74,0x40,0x7a,0xb3,0x2b,0x3f,0x12,0x27,0xfe,0x50,0x9, 0xd2,0x0, +0xd2,0x1, 0x12,0x22,0x6a,0x80,0x1c,0x74,0x1, 0x12,0x22,0xdd,0x7e,0x43,0x38,0xd3, +0x7e,0x50,0x64,0xac,0x45,0x12,0x80,0x89,0x7a,0xb3,0x2b,0x3e,0x7e,0xf, 0x39,0xac, +0x12,0x27,0x70,0x12,0x22,0x7a,0x12,0x27,0x5e,0x2, 0x22,0xd4,0x7e,0x73,0x2b,0x2e, +0x7a,0x73,0x38,0xe6,0x7e,0x73,0x2b,0x3e,0x7a,0x73,0x38,0xd6,0x7e,0x73,0x2b,0x3f, +0x7a,0x73,0x38,0xd5,0x7e,0x73,0x2b,0x33,0x7a,0x73,0x38,0xd7,0x22,0xca,0x3b,0x7c, +0xdb,0xe4,0x7a,0xb3,0x2b,0x33,0x12,0x27,0xf0,0x7e,0xc0,0xa, 0x12,0x67,0xef,0x30, +0xf, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x1f,0x39,0xac,0x12,0x81,0x5, 0x7d,0x73, +0xbe,0x74,0xff,0xff,0x78,0x9, 0x12,0x23,0x4d,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe, +0x74,0x80,0x0, 0x28,0x7, 0x12,0x23,0x4d,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, +0x28,0xc, 0x12,0x23,0x4d,0xb, 0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0, +0x1, 0x78,0x9, 0x7e,0x1f,0x39,0xac,0x12,0x80,0xa8,0x7d,0x73,0x7e,0x1f,0x39,0x9b, +0x69,0x31,0x0, 0x1a,0x7a,0x73,0x2b,0x33,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x39, +0x9b,0x2e,0x14,0x0, 0x1a,0xb, 0xa, 0x30,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x73,0x0, +0x62,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac,0x3f,0x12,0x23,0xcf,0xca,0x39,0x7e, +0x30,0x38,0xac,0x3f,0x12,0x23,0xe8,0x12,0x17,0x2e,0x1b,0xfd,0x7e,0x34,0x0, 0x8c, +0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0x23,0xdd,0x12,0x17,0x2e,0x1b,0xfd,0xb, +0xf0,0xbe,0xf0,0x4, 0x40,0xc7,0x7e,0x23,0x0, 0x62,0x7e,0x30,0x5, 0xac,0x23,0x12, +0x23,0xcf,0xca,0x39,0x7e,0x23,0x0, 0x62,0x7e,0x30,0x38,0xac,0x23,0x12,0x23,0xe8, +0x12,0x17,0x2e,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x62,0x7e, +0x30,0x8c,0xac,0x23,0x12,0x23,0xdd,0x12,0x17,0x2e,0x1b,0xfd,0xda,0xf8,0x22,0x2e, +0x14,0x26,0x33,0x6d,0x0, 0x12,0x22,0x3e,0x7e,0x34,0x0, 0x38,0x22,0x2e,0x14,0x1, +0x43,0x6d,0x0, 0x7e,0x18,0x3, 0x73,0x22,0x2e,0x14,0x0, 0x63,0x6d,0x0, 0x7e,0x18, +0x34,0x0, 0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93,0x7c,0xdb,0x90,0x60, +0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x93,0xbc,0x7e,0x28,0x4, 0x7c,0xf7,0x80, +0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x8c,0x7a,0xe3,0x2a,0x8d,0x7a,0xd3,0x2a,0x90,0x7a, +0xe3,0x2a,0x91,0x7a,0xd3,0x2a,0x92,0x7a,0xe3,0x2a,0x93,0x74,0x1, 0x7a,0xb3,0x2a, +0x96,0x7a,0xd3,0x2a,0x8e,0xa, 0x3e,0x1b,0x34,0x7a,0x73,0x2a,0x8f,0x90,0x60,0x91, +0xe4,0x93,0x7a,0xb3,0x2a,0x97,0x90,0x60,0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x98,0xa, +0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x99,0x12, +0x17,0x2e,0x1b,0xfd,0xa, 0x3f,0xca,0x39,0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff, +0x7e,0x8, 0x2a,0xbc,0x12,0x17,0x2e,0x1b,0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e, +0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x40,0x12,0x17,0x2e,0x1b,0xfd, +0x12,0x98,0xe, 0x12,0x64,0x10,0x7a,0xd3,0x2a,0x94,0x7a,0xe3,0x2a,0x95,0x12,0x57, +0xe8,0x74,0x1, 0x12,0x25,0x96,0xe4,0x7a,0xb3,0x2b,0x20,0x7a,0xb3,0x2b,0x21,0x12, +0x59,0x2d,0x7a,0x37,0x2b,0x2c,0x74,0x3, 0x7a,0xb3,0x2b,0x22,0xe4,0x7a,0xb3,0x2b, +0x23,0x74,0x2, 0x7a,0xb3,0x2b,0x24,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2b,0x26,0x74, +0x4, 0x7a,0xb3,0x2b,0x25,0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x28,0x7e,0x34,0x20, +0x5f,0x7a,0x37,0x2b,0x2a,0x74,0x20,0x7a,0xb3,0x2b,0x81,0x74,0x1, 0x7a,0xb3,0x2b, +0x2f,0x74,0x20,0x7a,0xb3,0x2b,0x30,0x74,0x4, 0x7a,0xb3,0x2b,0x32,0x74,0x38,0x12, +0x21,0x3f,0xe4,0x7a,0xb3,0x2b,0x3c,0x7a,0xb3,0x2b,0x3d,0x7e,0x34,0x1, 0xf4,0x7a, +0x37,0x2b,0x38,0x74,0x1, 0x7a,0xb3,0x2b,0x31,0x74,0x7f,0x7a,0xb3,0x2b,0x3f,0x74, +0x64,0x7a,0xb3,0x2b,0x3e,0x6d,0x33,0x7a,0x37,0x2b,0x34,0x7a,0x37,0x2b,0x36,0x74, +0x2, 0x7a,0xb3,0x2b,0x33,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x89,0x74,0x4, 0x7a, +0xb3,0x2b,0x86,0x7e,0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x87,0xe4,0x7a,0xb3,0x2b,0x85, +0x7e,0x34,0x4, 0x6d,0x7a,0x37,0x2b,0x8b,0x74,0x1, 0x7a,0xb3,0x2b,0x82,0x74,0x5, +0x7a,0xb3,0x2b,0x83,0xe4,0x7a,0xb3,0x2b,0x84,0x74,0x1, 0x7a,0xb3,0x2b,0x7f,0xe4, +0x7a,0xb3,0x2b,0x80,0x7e,0x34,0x16,0xd0,0x7a,0x37,0x2b,0x8d,0xa, 0x3e,0xca,0x39, +0x7e,0x34,0x60,0xfb,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x63,0x12,0x17,0x2e,0x1b, +0xfd,0xda,0x79,0xda,0xd8,0x22,0x7a,0xb3,0x2b,0x1f,0x70,0x14,0x12,0x36,0x1c,0x12, +0x25,0xc5,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4,0x7e,0x18,0x4, 0x7e,0x80,0x10, +0xb4,0x1, 0x11,0x12,0x36,0x13,0x12,0x25,0xc5,0x12,0x57,0xd2,0x7e,0x18,0x4, 0x0, +0x7a,0x1f,0x6, 0xf8,0x22,0x7a,0x1f,0x2b,0x1b,0x7a,0xf, 0x2b,0x17,0x22,0x74,0x1, +0x12,0x0, 0x1e,0xe4,0x12,0x25,0x96,0x12,0x25,0xe6,0xe4,0x12,0x0, 0x1e,0x74,0x1, +0x12,0x25,0x96,0x2, 0x25,0xe6,0xca,0x3b,0x7e,0xd3,0x2a,0x92,0x7e,0xc3,0x2a,0x93, +0x7e,0x8, 0x1f,0x44,0x12,0xa7,0x27,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12, +0x17,0x53,0x7e,0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x17,0x53,0x7e,0x8, +0x1f,0xda,0x7e,0x34,0x0, 0xa, 0x12,0x17,0x53,0x7e,0xf3,0x2b,0x1b,0x7e,0x18,0x2a, +0xfb,0x7a,0x1d,0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e, +0x8, 0x2a,0xd8,0x12,0xa7,0xf7,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xfb, +0xa, 0x3a,0x2e,0x34,0x16,0xe8,0x12,0x6e,0x51,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13, +0xa, 0x3e,0x12,0x26,0xfe,0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2b,0x1a,0x19, +0xb4,0x1f,0x8a,0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, +0xa3,0x2a,0xd8,0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x26, +0xfe,0xa, 0x4a,0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2b,0x1a,0x19,0xb4,0x1f,0xa6,0xb, +0xe0,0xbc,0xde,0x38,0xd8,0x7e,0xb3,0x2b,0x1c,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e, +0x18,0x1f,0xd0,0x12,0xa6,0x4f,0x80,0x3, 0x12,0xa7,0xe6,0x6c,0xee,0x7e,0x18,0x1f, +0xe4,0x7a,0x1f,0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f, +0x38,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, +0xac,0x7e,0x2e,0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac, +0x7e,0x2e,0x34,0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c, +0x7e,0x12,0x8, 0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37, +0x2b,0x1d,0x7e,0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x38,0xf, 0x12,0x27,0xe0,0x12, +0x13,0xf5,0x12,0xa7,0x5a,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x27,0xf7, +0x74,0x1, 0x12,0x25,0x96,0x12,0x6a,0x70,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12, +0x25,0xce,0x7e,0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x8, 0x2a,0x8c, +0x2, 0x3, 0x8b,0x9, 0x75,0x26,0x35,0x7a,0x73,0x2b,0x3e,0x22,0x9, 0x75,0x26,0x36, +0x7a,0x73,0x2b,0x3f,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b,0x33,0x22,0x7e,0x73, +0x2b,0x3e,0x7a,0x73,0x38,0xd6,0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b,0x2e,0x22, +0x12,0x27,0x7a,0xb, 0x34,0x7a,0x73,0x2b,0x3f,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, +0x6c,0xaa,0xa, 0x4a,0x2e,0x44,0x60,0xac,0x12,0xa8,0xb6,0x7c,0x9b,0x7e,0xf3,0x2a, +0x8d,0xac,0xf9,0x7e,0xb3,0x2a,0x8f,0xa, 0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f, +0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc,0x2f,0x6, 0xb, 0xa0,0xbe,0xa0,0x3, 0x78, +0xd1,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, 0x7e,0x54,0x0, 0x3, 0x7f,0x10,0x7d, +0x15,0x12,0x15,0x75,0x7f,0x1, 0xb, 0xc, 0x7e,0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, +0x12,0x15,0x77,0xbe,0x34,0x0, 0xfa,0x28,0x4, 0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22, +0x7e,0x8, 0x2a,0x8c,0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x8c,0x74,0x3, 0x2, 0x11,0x7a, +0x7e,0x8, 0x2a,0x8c,0x2, 0xd, 0x72,0x7d,0x32,0x74,0xfa,0x2, 0x12,0xd0,0x7e,0xb3, +0x38,0xf, 0xb4,0x3, 0x8, 0x7e,0xb3,0x38,0xca,0x70,0x2, 0xc3,0x22,0xd3,0x22,0x12, +0x3f,0x81,0x12,0x62,0xbc,0x12,0x28,0x31,0x12,0x19,0x5a,0x7e,0xb3,0x38,0xf, 0x24, +0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x40,0x98,0x80,0xef,0x12,0x1b,0xd2,0x80, +0xea,0x12,0x58,0x3f,0x12,0x23,0xf3,0x12,0x0, 0x9, 0x12,0x57,0xd2,0x7e,0x18,0x4, +0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8,0x7e,0x1f,0x6, 0xf4,0x12,0x68,0x21, +0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e,0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a, +0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12,0x67,0xfe,0x12,0x0, 0x46,0x12,0x50, +0xbf,0x12,0x63,0x59,0x12,0x63,0xed,0x2, 0x28,0x7a,0xe4,0x7a,0xb3,0x34,0x38,0x7a, +0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x28,0x95, +0x7e,0x34,0x2, 0x26,0x7a,0x37,0x28,0x99,0x7e,0x34,0x0, 0x96,0x7a,0x37,0x28,0x97, +0x7a,0x37,0x28,0x9b,0x7e,0x34,0x0, 0x50,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x0, 0x27, +0x7a,0x37,0x28,0x9f,0x12,0xaf,0x90,0x74,0x1, 0x7a,0xb3,0x28,0xa5,0xe4,0x7a,0xb3, +0x28,0xa8,0x12,0x28,0xcf,0x3e,0x34,0x7e,0x8, 0x25,0xf7,0xe4,0x2, 0x17,0x53,0x90, +0x60,0x9a,0x93,0xa, 0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3d,0x0, 0x7e,0xb3,0x2a, +0x8e,0xf5,0x42,0x7e,0xb3,0x2a,0x8f,0xf5,0x43,0x75,0x44,0x28,0x7e,0xd3,0x28,0x84, +0xe4,0x7a,0xb3,0x31,0xef,0x7a,0xb3,0x31,0xeb,0x7a,0xb3,0x31,0xec,0x7e,0x8, 0x31, +0xf0,0x12,0x28,0xcf,0xe4,0x12,0x17,0x53,0x12,0x28,0xcf,0x3e,0x34,0x7e,0x8, 0x32, +0x10,0xe4,0x12,0x17,0x53,0xbe,0xd0,0x2, 0x50,0x2, 0x81,0xb2,0x6c,0xcc,0x81,0xac, +0x12,0xaf,0xc5,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, +0x3c,0x9, 0xb3,0x31,0xf0,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x31, +0xf0,0x7c,0xbd,0x14,0xbc,0xbc,0x78,0x2, 0x81,0xb2,0xa, 0x5c,0xb, 0x54,0xf5,0x2e, +0x81,0xa3,0x7e,0x71,0x2e,0x12,0x2f,0xac,0x7a,0xa1,0x26,0x9, 0xb3,0x26,0xfb,0xf5, +0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0x7f,0x7c,0xb7,0xf5,0x28,0xe5,0x27,0xa, 0x2b, +0xe5,0x25,0x12,0x2f,0x7f,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0,0x5, 0x40,0x2, +0x81,0xa1,0xe5,0x29,0xbe,0xb0,0x5, 0x40,0x2, 0x81,0xa1,0x12,0x2f,0xb5,0x12,0x9d, +0xbb,0x7a,0xb3,0x31,0xee,0x85,0x25,0x54,0x85,0x26,0x55,0x85,0x27,0x56,0x7e,0x8, +0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5,0x24,0x12,0xa0,0x9e,0x75,0x3d,0x0, 0x6c,0xee, +0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71,0x25,0x12,0x2c,0xb9,0x7a,0x35,0x35,0xe5,0x26, +0x7e,0x71,0x27,0x12,0x2c,0xb9,0x7a,0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, +0x5, 0x7e,0x35,0x37,0x80,0x3, 0x7e,0x35,0x35,0x7a,0x35,0x3b,0xe, 0x34,0x7a,0x35, +0x39,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2c,0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x25,0x7c, +0xbf,0x30,0xe1,0x20,0xe5,0x26,0x7e,0x71,0x25,0x12,0x2c,0xb9,0x7d,0x43,0xe5,0x24, +0x7e,0x71,0x27,0x12,0x2c,0xb9,0x2d,0x34,0xbe,0x35,0x39,0x18,0x2, 0x81,0x38,0x75, +0x30,0x1, 0x81,0x38,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, +0x38,0x2, 0x81,0x38,0xe5,0x28,0xbe,0xb0,0x5, 0x40,0x2, 0x81,0x38,0xe5,0x29,0xbe, +0xb0,0x5, 0x40,0x2, 0x81,0x38,0x7c,0xbf,0x20,0xe0,0x2, 0x81,0x38,0x6d,0x33,0x7a, +0x35,0x4d,0x75,0x4f,0x0, 0x7a,0x35,0x50,0x75,0x52,0x0, 0xc2,0x2, 0xc2,0x3, 0xe5, +0x26,0xbe,0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26, +0xbe,0xb1,0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe, +0xb1,0x25,0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1, +0x25,0x50,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a, +0x78,0x29,0xd2,0x2, 0xe5,0x2a,0x60,0x8, 0xe5,0x42,0x14,0xbe,0xb1,0x2a,0x78,0x2, +0xd2,0x3, 0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x42,0xa, 0x2b,0x1b, +0x24,0xe5,0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b, +0x78,0x29,0xd2,0x2, 0xe5,0x2b,0x60,0x8, 0xe5,0x43,0x14,0xbe,0xb1,0x2b,0x78,0x2, +0xd2,0x3, 0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x43,0xa, 0x2b,0x1b, +0x24,0xe5,0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3e,0x80,0x5b, +0x85,0x2b,0x3f,0x80,0x4d,0xe5,0x3e,0x7e,0x71,0x3f,0x12,0x2c,0xb9,0x7a,0x35,0x40, +0xe5,0x2a,0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x2b, +0xbe,0xb1,0x3f,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3f,0x78,0xd, 0x7e,0x35,0x40,0x2e, +0x35,0x4d,0x7a,0x35,0x4d,0x5, 0x4f,0x80,0x17,0x5, 0x52,0x7e,0x35,0x40,0x2e,0x35, +0x50,0x7a,0x35,0x50,0x7e,0x35,0x33,0xbe,0x35,0x40,0x58,0x2, 0x5, 0x3d,0xb, 0xe0, +0x5, 0x3f,0xe5,0x2d,0xbe,0xb1,0x3f,0x50,0xac,0x5, 0x3e,0xe5,0x2c,0xbe,0xb1,0x3e, +0x50,0x9e,0xe5,0x2c,0x7e,0x71,0x2b,0x12,0x2c,0xb9,0x7e,0x45,0x4d,0x9d,0x43,0xe5, +0x2a,0x7e,0x71,0x2d,0x12,0x2c,0xb9,0x9d,0x43,0xe5,0x2a,0x7e,0x71,0x2b,0x12,0x2c, +0xb9,0x9d,0x43,0xe5,0x2c,0x7e,0x71,0x2d,0x12,0x2c,0xb9,0x7d,0x23,0x7d,0x34,0x9d, +0x32,0x7a,0x35,0x4d,0x7e,0x35,0x37,0x2e,0x35,0x35,0x7a,0x35,0x39,0x30,0x2, 0x10, +0x20,0x3, 0xd, 0x7e,0x35,0x4d,0x9e,0x35,0x39,0x7a,0x35,0x4d,0x15,0x4f,0x15,0x4f, +0xe5,0x4f,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x4f,0x24,0xfc,0xf5,0x4f,0x7e,0x35,0x4d, +0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x7a,0x35,0x4d,0x75,0x44,0x22,0xe5,0x42, +0x14,0xbe,0xb1,0x24,0x68,0xd, 0xbe,0xb1,0x26,0x68,0x8, 0xe5,0x24,0x60,0x4, 0xe5, +0x26,0x70,0x8, 0x12,0xa1,0x2d,0x28,0x3, 0x75,0x44,0x2c,0x7e,0x15,0x50,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x4d,0x1a,0x26,0x1a,0x24,0x2f,0x10,0xe5,0x44,0xa, 0x1b,0x6d, +0x0, 0x12,0x15,0x5b,0x7f,0x71,0x7a,0x7d,0x45,0x7e,0x15,0x39,0x1a,0x2, 0x1a,0x0, +0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x15,0x5b,0xe5,0x52,0xa, 0xdb,0x6d,0xcc, +0xe5,0x4f,0xa, 0x1b,0x6d,0x0, 0x2f,0x6, 0x12,0x15,0x5b,0x7a,0x1d,0x49,0xbf,0x71, +0x8, 0x3, 0x75,0x30,0x2, 0xc2,0x1, 0x20,0xc, 0xe, 0x12,0x2f,0xb5,0x12,0xa2,0x39, +0x92,0x1, 0x20,0x1, 0x3, 0x75,0x30,0x0, 0xe5,0x30,0xbe,0xb0,0x0, 0x28,0x62,0xe5, +0x30,0xa, 0x3b,0x2e,0x34,0x31,0xea,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2e, +0xa, 0x3b,0x9, 0xa3,0x31,0xf0,0x4c,0xaa,0x78,0xc, 0xa, 0x2c,0x9, 0xb2,0x31,0xf0, +0x19,0xb3,0x31,0xf0,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x31,0xf0,0xf5,0x53,0xbc,0xba, +0x28,0x3, 0x7a,0xa1,0x53,0x75,0x2f,0x0, 0x80,0x22,0x9, 0x33,0x31,0xf0,0xe5,0x2f, +0xa, 0x2b,0x9, 0x22,0x31,0xf0,0xbc,0x23,0x68,0xa, 0xa, 0xc, 0x9, 0x30,0x31,0xf0, +0xbc,0x23,0x78,0x6, 0xe5,0x53,0x19,0xb2,0x31,0xf0,0x5, 0x2f,0xbe,0xd1,0x2f,0x38, +0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x21,0x52,0xb, 0xc0,0xbc,0xdc,0x28,0x2, +0x21,0x20,0xda,0x3b,0x22,0x7c,0xba,0x7c,0x79,0x12,0x4c,0x21,0xb, 0x1a,0x30,0x22, +0xca,0x3b,0x6d,0xee,0x7e,0xc3,0x2a,0x8d,0x7e,0xd3,0x2a,0x8c,0x7e,0xb3,0x38,0x38, +0xb4,0x1, 0x3, 0xe4,0xa1,0xf6,0x7e,0xb3,0x28,0x84,0x70,0x2, 0xa1,0x65,0x7e,0xb3, +0x2a,0x21,0x60,0x2, 0x80,0x7f,0x7e,0xa3,0x26,0xfa,0x7e,0x73,0x26,0xfb,0x7a,0x71, +0x24,0x6c,0xee,0x6d,0xff,0x6c,0xff,0xa, 0x47,0x80,0x20,0x12,0x2c,0xb5,0xbe,0x34, +0x0, 0x96,0x8, 0x1d,0xb, 0xe0,0xbe,0xa0,0x0, 0x28,0x6, 0x7c,0xba,0x14,0x12,0x2d, +0xfc,0x12,0x2f,0x95,0x58,0x3, 0x12,0x2d,0xf9,0x1b,0x44,0xbe,0x44,0x0, 0x0, 0x58, +0xda,0xe5,0x24,0xa, 0x4b,0x80,0x1e,0x12,0x2c,0xb5,0xbe,0x34,0x0, 0x96,0x8, 0x21, +0xb, 0xe0,0xbe,0xa0,0x0, 0x28,0x6, 0x7c,0xba,0x14,0x12,0x2d,0xfc,0x12,0x2f,0x95, +0x58,0x3, 0x12,0x2d,0xf9,0x7d,0x24,0xb, 0x24,0x7d,0x42,0xa, 0x3c,0xbd,0x23,0x48, +0xd6,0xbe,0xe0,0x3, 0x50,0x2, 0x80,0xd, 0xa, 0x2f,0x7d,0x3f,0x12,0x15,0x29,0xbe, +0x34,0x0, 0x28,0x8, 0x7, 0xe4,0x7a,0xb3,0x36,0x45,0xa1,0xf6,0x6d,0xdd,0xbe,0xa0, +0x0, 0x28,0x8, 0x7c,0xba,0x14,0x12,0x2e,0x6, 0x2d,0xd3,0xa, 0x3d,0x1b,0x34,0xa, +0xca,0xbd,0xc3,0x58,0x8, 0x7c,0xba,0x4, 0x12,0x2e,0x6, 0x2d,0xd3,0x7e,0x70,0x8, +0x80,0x2a,0x7e,0x50,0x2, 0xac,0x57,0x7d,0xc2,0x2e,0xc4,0x17,0x65,0x7d,0x1c,0x7a, +0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0x1a,0xcb,0xbd,0xcd,0x8, 0xf, 0x7d,0xc2,0x2e, +0xc4,0x17,0x66,0x7d,0x2c,0x12,0x57,0xdf,0x1a,0xcb,0x2d,0xec,0x7c,0x67,0x1b,0x70, +0xa5,0xbe,0x0, 0xce,0x7c,0xba,0x12,0x2e,0x6, 0x12,0x17,0x85,0xbe,0x34,0xa, 0xf0, +0x8, 0x4, 0x2e,0xe4,0x0, 0x28,0xbe,0xe4,0x0, 0xfa,0x28,0x4, 0x7e,0xe4,0x0, 0xfa, +0x7e,0xb3,0x36,0x45,0xa, 0x3b,0xbd,0x3e,0x50,0x8, 0x7d,0x3e,0x7c,0xb7,0x7a,0xb3, +0x36,0x45,0x7e,0xb3,0x36,0x45,0xda,0x3b,0x22,0x7c,0xba,0x4, 0x7c,0x79,0x12,0x2c, +0xb9,0x2d,0xf3,0xb, 0xf0,0x22,0x7e,0x71,0x24,0x2, 0x2c,0xb9,0xca,0x3b,0x7f,0x40, +0x7e,0xe3,0x28,0x84,0x6c,0xdd,0x7e,0xc0,0x1, 0x80,0x1a,0xa, 0x3d,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0x60,0xa, 0x2c,0x7f,0x4, 0x2d,0x12,0x7e,0xb, 0x70,0xbc,0x76,0x40, +0x2, 0x7c,0xdc,0xb, 0xc0,0xbc,0xec,0x38,0xe2,0xa, 0x3d,0x2d,0x39,0x7d,0x28,0x7e, +0x1b,0xd0,0x6c,0xff,0x7e,0xc0,0x1, 0xe1,0x71,0x75,0x2d,0x0, 0x6d,0x33,0x7a,0x35, +0x2e,0x7a,0x35,0x25,0x7a,0x35,0x27,0x7e,0x18,0x1f,0x70,0x7a,0x1d,0x29,0x74,0xff, +0x7e,0x34,0x1f,0x71,0x7e,0x24,0x0, 0x0, 0x7a,0x1b,0xb0,0x7e,0x1d,0x29,0x7a,0x1b, +0xb0,0xe4,0x7e,0x1d,0x29,0x39,0xb1,0x0, 0x3, 0x7e,0x1d,0x29,0x39,0xb1,0x0, 0x2, +0x7e,0x1d,0x29,0x12,0x9f,0xe1,0x44,0x1, 0x7a,0x1b,0xb0,0x75,0x24,0x0, 0x80,0x6c, +0x12,0x2f,0xa9,0x9, 0x93,0x26,0xfb,0xe5,0x24,0x12,0x43,0x2d,0xbc,0xbc,0x78,0x5a, +0x5, 0x2d,0xa, 0x3a,0x2e,0x35,0x25,0x7a,0x35,0x25,0xa, 0x39,0x2e,0x35,0x27,0x7a, +0x35,0x27,0x12,0x2c,0xb5,0xbe,0x35,0x2e,0x8, 0x6, 0x12,0x2c,0xb5,0x7a,0x35,0x2e, +0x7e,0x1d,0x29,0x7e,0x1b,0xb0,0xbc,0xba,0x28,0x3, 0x7a,0x1b,0xa0,0x7e,0x1d,0x29, +0x29,0xb1,0x0, 0x2, 0xbc,0xba,0x50,0x4, 0x39,0xa1,0x0, 0x2, 0x7e,0x1d,0x29,0x29, +0xb1,0x0, 0x1, 0xbc,0xb9,0x28,0x4, 0x39,0x91,0x0, 0x1, 0x7e,0x1d,0x29,0x29,0xb1, +0x0, 0x3, 0xbc,0xb9,0x50,0x4, 0x39,0x91,0x0, 0x3, 0x5, 0x24,0xbe,0xe1,0x24,0x38, +0x8f,0xe5,0x2d,0xbe,0xb0,0x0, 0x28,0x67,0x7e,0xd, 0x29,0x12,0x9e,0x15,0xe5,0x2d, +0xa, 0x2b,0x7e,0x15,0x25,0x8d,0x12,0x7a,0x15,0x25,0x7e,0x35,0x27,0x8d,0x32,0x7a, +0x35,0x27,0x7e,0x55,0x25,0x12,0x2f,0x8d,0x19,0xa3,0x32,0x10,0x7e,0x55,0x27,0x12, +0x2f,0x8d,0x19,0xa3,0x32,0x11,0x7e,0x37,0x28,0x8a,0xbe,0x35,0x2e,0x78,0xe, 0x7e, +0x35,0x25,0x7a,0x73,0x28,0x8c,0x7e,0x35,0x27,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x32, +0xe, 0x4d,0x33,0x68,0x18,0x7e,0x55,0x25,0x7e,0x35,0x27,0x12,0x2c,0xb9,0x7e,0x25, +0x2e,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x37,0x32,0xe, 0x1b,0x38,0x20,0xb, 0xf0,0xb, +0xc0,0xbc,0xdc,0x40,0x2, 0xc1,0x49,0x12,0x9b,0xcc,0x7c,0xbf,0xda,0x3b,0x22,0xa, +0x3b,0x9d,0x32,0x2, 0x17,0x85,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c,0xb9,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7f,0x22,0xa, 0x2d,0x1b,0x24,0xa, 0x3a,0xbd,0x32,0x22,0x12,0x4e, +0xe1,0x12,0x2c,0xc0,0x7a,0xb3,0x2a,0x2a,0x22,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b, +0x9, 0xa3,0x26,0xfa,0x22,0xe5,0x24,0x7e,0x71,0x25,0x7e,0x61,0x26,0x7e,0x51,0x27, +0x22,0xca,0xf8,0x7c,0xab,0xbe,0xa0,0x34,0x38,0x3, 0x2, 0x30,0xd5,0xbe,0xa0,0x35, +0x78,0x7, 0x7e,0xb3,0x2b,0x2f,0x2, 0x31,0xeb,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0, +0x37,0x78,0x1e,0x7e,0x35,0x8, 0x7d,0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x34, +0x8a,0x7e,0x39,0xb0,0xbe,0xa0,0x37,0x68,0x3, 0x2, 0x31,0xeb,0x75,0x1a,0x36,0x21, +0xeb,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0,0x39,0x78,0x1b,0x7e,0xf3,0x38,0xd8,0x7c, +0xbf,0x4, 0x7a,0xb3,0x38,0xd8,0xbe,0xa0,0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f, +0x9, 0xb3,0x2b,0x40,0x21,0xeb,0xbe,0xa0,0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b, +0x7e,0xf3,0x38,0xda,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xda,0xbe,0xa0,0x3b,0x78,0x3, +0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b,0x63,0x21,0xeb,0xbe,0xa0,0xfb,0x78,0x6, +0x7e,0xb3,0x2b,0x31,0x21,0xeb,0xbe,0xa0,0x5e,0x78,0x26,0x7e,0xf, 0x39,0x93,0x69, +0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, +0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, 0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x21, +0xeb,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0,0x3d,0x78,0x1b,0x7e,0xf3,0x38,0xdc,0x7c, +0xbf,0x4, 0x7a,0xb3,0x38,0xdc,0xbe,0xa0,0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f, +0x9, 0xb3,0x2a,0x99,0x21,0xeb,0xbe,0xa0,0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b, +0x7e,0xf3,0x38,0xde,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xde,0xbe,0xa0,0x3f,0x78,0x3, +0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a,0xbc,0x21,0xeb,0xbe,0xa0,0x40,0x40,0xd, +0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, 0xb3,0x38,0xb4,0x21,0xeb,0xbe,0xa0,0x4e, +0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e,0xf3,0x38,0xf9,0x7c,0xbf,0x4, 0x7a,0xb3, +0x38,0xf9,0xbe,0xa0,0x4f,0x78,0x3, 0x75,0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x34,0x88, +0x7e,0x39,0xb0,0x21,0xeb,0xbe,0xa0,0x51,0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e, +0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, 0xff,0x7e,0xb3,0x39,0x4, 0xa, 0x3b,0x6d, +0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a,0xb3,0x39,0x4, 0xbe,0xa0,0x52,0x78,0x3, +0x75,0x1a,0x51,0x7c,0xb7,0x21,0xeb,0xbe,0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78, +0x1a,0x7e,0xf3,0x38,0xcd,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xcd,0xbe,0xa0,0x5d,0x78, +0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x31,0xee,0x21,0xeb,0xbe,0xa0,0x60,0x40,0xd, +0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, 0xb3,0x33,0x8f,0x80,0x7e,0xbe,0xa0,0x6d, +0x78,0x4, 0xe5,0xe, 0x80,0x75,0xbe,0xa0,0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18, +0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a,0x25,0xa, 0x9, 0xb3,0x34,0x90,0xbe,0xa0, +0xf5,0x78,0x58,0x75,0x1a,0xf4,0x80,0x53,0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1, +0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5,0xe7,0x80,0x40,0xbe,0xa0,0xf2,0x68,0x5, +0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10,0x3e,0x14,0x7e,0x1f,0x34,0x8c,0x2d,0x31, +0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, 0xa, 0x56,0x80,0x1f,0x7d,0x53,0x80,0x1b, +0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80,0x12,0xbe,0xa0,0xf7,0x78,0x4, 0x74,0x64, +0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xab, +0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x8d,0xbc,0xba,0x28,0x9, 0x74,0x2, 0xa4, +0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x8d,0xbc,0x1a,0x38,0x1c,0x7e,0x3, +0x2a,0x8c,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d,0x32, +0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x73,0x80,0x2d,0x7e,0x3, 0x2a,0x8c,0xa, 0x20, +0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, 0xac, +0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34,0x49, +0x23,0x3, 0x75,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, 0x1e, +0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca,0xf8, +0x80,0x38,0x7c,0xbf,0x12,0x31,0xee,0xa, 0x1b,0x7e,0x63,0x2a,0x8d,0x7e,0x70,0x2, +0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x12, +0x32,0xad,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x32,0xad,0x7e,0x73,0x2a,0x8d, +0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3,0x2a, +0x8c,0x74,0x2, 0xa4,0x22,0x12,0x37,0xeb,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18,0x38, +0xf4,0x7e,0x8, 0x25,0xee,0x12,0x17,0x2e,0x1b,0xfd,0x12,0x36,0x13,0x80,0x12,0xca, +0x39,0x7e,0x18,0x38,0xf4,0x7e,0x8, 0x2b,0x8f,0x12,0x17,0x2e,0x1b,0xfd,0x12,0x36, +0x1c,0x2, 0x25,0xc5,0xca,0xf8,0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x70, +0x77,0xd2,0x8, 0xa1,0x66,0xa5,0xbe,0x1, 0x3d,0x7a,0x73,0x38,0xb5,0xa5,0xbf,0xad, +0x2, 0x80,0x2f,0xa5,0xbf,0xae,0x4, 0xd2,0x9, 0xa1,0x66,0xa5,0xbf,0xaa,0x5, 0x12, +0xb0,0x5, 0x80,0x1e,0xa5,0xbf,0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x34,0x8a, +0x80,0x10,0xa5,0xbf,0xac,0x2, 0x80,0x2, 0xa1,0x66,0x7e,0x34,0x4, 0xfc,0x7a,0x37, +0x34,0x8a,0x6d,0x33,0x61,0xe2,0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b, +0x12,0x35,0x69,0xa5,0xbe,0x7, 0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0x66,0xa5,0xbe, +0x8, 0x2, 0x80,0x2, 0xa1,0x66,0x12,0x0, 0x66,0xa1,0x66,0xa5,0xbe,0xa, 0x9, 0x43, +0xc, 0x20,0x7a,0x73,0x38,0xbe,0xa1,0x66,0xa5,0xbe,0xb, 0x8, 0x12,0x35,0x69,0x12, +0x0, 0x6e,0xa1,0x66,0xbe,0x60,0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0x81,0xfe, +0xbe,0x60,0x1e,0x40,0xd, 0xbe,0x60,0x23,0x38,0x8, 0x12,0x35,0x6b,0x43,0xc, 0x40, +0xa1,0x66,0xbe,0x60,0x15,0x40,0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x35,0x6b,0xd2, +0x8, 0xa5,0xbe,0x15,0x2, 0x80,0x2, 0xa1,0x66,0x74,0x7, 0x7a,0xb3,0x38,0xb8,0xa1, +0x66,0xa5,0xbe,0x19,0x7, 0xe4,0x7a,0xb3,0x38,0xcd,0xa1,0x66,0xbe,0x60,0x24,0x40, +0x7, 0xbe,0x60,0x2c,0x38,0x2, 0x81,0xfe,0xa5,0xbe,0x2d,0x1b,0x12,0x35,0x6b,0x20, +0x9, 0x2, 0xa1,0x66,0x7e,0x63,0x38,0xe0,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32, +0x3e,0x34,0x7a,0x35,0x8, 0xa1,0x66,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38, +0x5, 0x43,0xc, 0x8, 0x81,0xfe,0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64, +0x38,0x2, 0x81,0xfe,0x7e,0x70,0x64,0x81,0xfe,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe, +0x39,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x38,0xd9,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xd9, +0xa, 0x2f,0x19,0x72,0x2b,0x40,0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0x66,0x75,0x1a, +0x38,0xa1,0x66,0xbe,0x60,0x3a,0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e, +0xf3,0x38,0xdb,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xdb,0xa, 0x2f,0x19,0x72,0x2b,0x63, +0xa5,0xbe,0x3b,0x2, 0x80,0x2, 0xa1,0x66,0x75,0x1a,0x3a,0xa1,0x66,0xa5,0xbe,0xfb, +0x9, 0x43,0xc, 0x4, 0x7a,0x73,0x2b,0x31,0xa1,0x66,0xa5,0xbe,0x50,0x6, 0x7a,0x73, +0x39,0x4, 0xa1,0x66,0xbe,0x60,0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, +0x7e,0xf3,0x38,0xdd,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xdd,0xa, 0x2f,0x19,0x72,0x2a, +0x99,0xa5,0xbe,0x3d,0x2, 0x80,0x2, 0xa1,0x66,0x75,0x1a,0x3c,0xa1,0x66,0xbe,0x60, +0x3e,0x68,0x4, 0xa5,0xbe,0x3f,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x38,0xdf,0x7c,0xbf, +0x4, 0x7a,0xb3,0x38,0xdf,0xa, 0x2f,0x19,0x72,0x2a,0xbc,0xa5,0xbe,0x3f,0x2, 0x80, +0x2, 0xa1,0x66,0x75,0x1a,0x3e,0xa1,0x66,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42, +0x38,0x8, 0x12,0x35,0x6b,0x75,0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x35, +0x6b,0x75,0xd, 0x2, 0x12,0x32,0xb5,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x35,0x6b, +0x12,0x35,0xd9,0x80,0x71,0xbe,0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x35, +0x6b,0x80,0x63,0xbe,0x60,0x4e,0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e, +0xf3,0x38,0xfa,0x7c,0xbf,0x4, 0x7a,0xb3,0x38,0xfa,0xa, 0x2f,0x2e,0x27,0x34,0x88, +0x7a,0x29,0x70,0xa5,0xbe,0x4f,0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, +0x7a,0x71,0xe, 0x80,0x31,0xbe,0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c, +0x16,0x2e,0x10,0x20,0x7c,0xb7,0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e, +0x5, 0x10,0x3e,0x4, 0x7e,0x1f,0x34,0x8c,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5, +0xbe,0xf6,0x3, 0x7a,0x71,0xf, 0xda,0xf8,0x22,0xd2,0x8, 0xa, 0x26,0x19,0x72,0x38, +0xb4,0x22,0x7c,0x6b,0x12,0x35,0xd1,0x78,0x5, 0x7c,0xb6,0x2, 0x70,0xa2,0xb4,0x4, +0x5, 0x7c,0xb6,0x2, 0x32,0xe4,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5,0x18,0x70,0x9, +0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5,0x1a,0x12,0x35, +0x72,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12,0x35,0xb2,0xf5, +0x91,0x22,0x7c,0x7b,0x6c,0xaa,0x12,0x35,0xd1,0x78,0x9, 0x7c,0xb7,0x12,0x71,0x76, +0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, 0x7c,0xb7,0x12,0x2f,0xc1,0x7c,0xab,0x7c,0xba, +0x22,0x7e,0xb3,0x38,0xb4,0xc4,0x54,0x7, 0x22,0x12,0x37,0xeb,0xb4,0x1, 0x17,0xca, +0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x38,0xf4,0x12,0x17,0x2e,0x1b,0xfd,0x12,0x38, +0x30,0x12,0x36,0x13,0x80,0x1a,0xca,0x39,0x7e,0x18,0x2b,0x8f,0x7e,0x8, 0x38,0xf4, +0x12,0x17,0x2e,0x1b,0xfd,0x7e,0x37,0x2b,0x95,0x7a,0x37,0x34,0x88,0x12,0x36,0x1c, +0x2, 0x25,0xc5,0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25,0xee,0x22,0x7e,0x1f,0x2b,0x93, +0x7e,0xf, 0x2b,0x8f,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, 0x30,0xe0,0x6, 0x53,0xd, +0xfe,0x12,0x37,0xb9,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, 0xfd,0x7e,0xb3,0x38,0xf8, +0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0x37,0xe3,0x12,0xa6,0xb1,0xe5,0xd, 0x30, +0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x38,0xf9,0x7e,0xb3,0x38,0xf8,0x70,0xa, +0x74,0x1, 0x12,0x0, 0x1e,0x12,0x36,0x1c,0x80,0x7, 0xe4,0x12,0x0, 0x1e,0x12,0x36, +0x13,0x12,0x25,0xc5,0x7e,0xb3,0x2b,0x1b,0x2, 0x36,0x7c,0x22,0xca,0x79,0x7c,0xfb, +0x7e,0x8, 0x24,0xf2,0x12,0xa7,0x27,0x7e,0xa3,0x2a,0x92,0x7e,0x73,0x2a,0x93,0x6c, +0xee,0x80,0x1d,0xa, 0x2e,0x9, 0x62,0x2a,0xfb,0xa, 0x26,0x12,0x57,0xdb,0x7c,0x6b, +0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x36,0xf4,0x19,0xb2,0x24,0xf2,0xb, 0xe0, +0xbc,0x7e,0x38,0xdf,0x6c,0xee,0x80,0x1a,0xa, 0x2e,0x9, 0x62,0x2a,0xd8,0xbe,0x60, +0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12,0x36,0xf4,0x19,0xb2,0x25,0xe, +0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30,0xe, 0xac,0x3e,0x2e,0x14,0x24, +0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba,0xb, 0xe0,0xbe,0xe0,0x5, 0x40, +0xe7,0xda,0x79,0x22,0x2e,0x27,0x2b,0x1d,0x7e,0x29,0xb0,0xa, 0x26,0x22,0xca,0x3b, +0x7e,0xe3,0x2a,0x93,0x7e,0xf3,0x2b,0x19,0x74,0x1, 0x7a,0xb3,0x2b,0x19,0x12,0x37, +0xb9,0x12,0xaf,0xf4,0x12,0x1b,0xc3,0x7e,0x17,0x2b,0x1d,0x6d,0x0, 0x12,0x17,0x53, +0x7e,0xd0,0x7, 0x12,0x3f,0xcf,0x6c,0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x67,0x12,0x37,0xf4,0x4c,0x76,0x7a,0x29, +0x70,0xb, 0xc0,0x12,0x6a,0x53,0x2d,0x23,0xa, 0x3c,0xbd,0x32,0x48,0xdc,0x12,0x37, +0xc0,0x30,0x1c,0xfd,0x12,0x6f,0xd9,0x7e,0xb3,0x2a,0x92,0x7c,0x7e,0x12,0x6a,0x68, +0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49,0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40, +0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c, +0xb7,0x64,0xff,0x12,0x37,0xf4,0x5c,0x7b,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x6a,0x53, +0x2d,0x23,0xa, 0x3c,0xbd,0x32,0x48,0xcc,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0x84,0x12, +0x69,0xd3,0x74,0x2, 0x12,0x37,0xe3,0x12,0x36,0x7c,0x74,0x2, 0x12,0x0, 0x1e,0x7a, +0xf3,0x2b,0x19,0x12,0x37,0xb9,0xda,0x3b,0x22,0x7e,0x8, 0x2a,0x8c,0x2, 0x5, 0xb4, +0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2b,0x1b,0x12,0x36,0x7c,0x74,0x2, 0x12,0x0, +0x1e,0x74,0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x69,0x12,0x7e,0xb3,0x2b,0x1b, +0x2, 0xe, 0x94,0x12,0x0, 0x1e,0x7e,0xb3,0x2b,0x1b,0x22,0x7e,0xb3,0x38,0xf8,0x7e, +0x34,0x0, 0x4, 0x22,0xa, 0x2c,0x2e,0x27,0x2b,0x1d,0x7e,0x29,0x70,0x22,0x12,0xb0, +0x5, 0x12,0x38,0x30,0x6d,0x33,0x7a,0x35,0xa, 0x12,0x22,0xbc,0x12,0x38,0x27,0x74, +0x50,0x7a,0xb3,0x38,0xe8,0x7e,0x24,0x3, 0x20,0x12,0x27,0xf7,0xe4,0x12,0x38,0x3b, +0x6d,0x33,0x7a,0x37,0x39,0xd6,0x22,0x7e,0x73,0x2b,0x81,0x7a,0x73,0x38,0xe7,0x22, +0x7e,0x37,0x25,0xf4,0x7a,0x37,0x34,0x88,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x20,0x7a, +0xb3,0x2b,0x3c,0x22,0xa2,0xe, 0xe4,0x33,0x7a,0xb3,0x38,0xe2,0x7e,0x73,0x38,0xe6, +0xbe,0x73,0x2b,0x2e,0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12,0x22,0xbc,0x12,0x38,0x27, +0x22,0x7e,0xf, 0x39,0x97,0x69,0x30,0x0, 0xa, 0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, +0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x22,0xca,0xd8,0xca,0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c, +0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c,0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4, +0x7d,0x3c,0x7c,0xe7,0x12,0x3f,0xcf,0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12, +0x7, 0xfb,0x7c,0x8b,0x74,0x7, 0x7e,0x70,0xf, 0x12,0x3a,0xb2,0x7e,0x54,0x0, 0x78, +0x7e,0x1f,0x39,0x97,0x79,0x51,0x0, 0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x39,0x97, +0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, 0xc, 0x7e,0x1f,0x39,0x97,0x79,0x51,0x0, 0x10, +0xbe,0xd4,0x0, 0x2, 0x78,0x7, 0x12,0x3a,0x4f,0x44,0x1, 0x80,0x1c,0x12,0x3a,0x4f, +0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x39,0x97,0x78,0x7, 0x12,0x3a,0x53, +0x54,0xfb,0x80,0x5, 0x12,0x3a,0x53,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x39,0x93, +0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e,0xa0, +0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x38,0x19,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff,0xe, +0x12,0x3a,0x5e,0x54,0xe6,0x12,0x3a,0x5b,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12,0x3a, +0x5e,0x5e,0x54,0xfe,0xe6,0x12,0x3a,0x5b,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4,0x0, +0x2, 0x78,0x21,0x12,0x3a,0x4f,0x12,0x3b,0x76,0x12,0x3a,0x4f,0x44,0x50,0x1b,0x1a, +0x50,0x7e,0x34,0x0, 0x2, 0x12,0x3b,0x11,0x12,0x3a,0xbc,0x12,0x38,0x61,0x7a,0x37, +0x34,0x90,0x41,0xb, 0x6c,0xdd,0x41,0x5, 0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b, +0xbc,0xfd,0x40,0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xd7,0xbe,0x90,0x23,0x40,0x3, 0x7e, +0x90,0x22,0xb, 0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xfa, +0xbe,0x90,0x1c,0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x12,0x3a,0x4f,0x12,0x3b, +0x76,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x12,0x3a,0x4f,0x4d,0x5c, +0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, 0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34, +0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, 0x3b,0x12,0x3b,0x11,0x12,0x3a,0xbc,0xbe,0xd4, +0x0, 0x1, 0x78,0x10,0x12,0x3a,0xbc,0x12,0x38,0x61,0x74,0x2, 0xac,0xbd,0x59,0x35, +0x34,0x92,0x80,0xf, 0x12,0x38,0x61,0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59, +0x32,0x34,0x92,0xb, 0xd0,0xbc,0xed,0x28,0x2, 0x21,0x78,0xa9,0xd5,0xcb,0x74,0x7, +0x7c,0x78,0x12,0x3a,0xb2,0xa9,0xc0,0xc4,0x7e,0x1f,0x39,0x93,0x79,0xe1,0x0, 0x84, +0x7e,0x1f,0x39,0x93,0x79,0xf1,0x0, 0x90,0x6d,0x33,0x7e,0xf, 0x39,0x97,0x79,0x30, +0x0, 0x6, 0x7e,0xf, 0x39,0x97,0x79,0x30,0x0, 0x8, 0x7e,0xf, 0x39,0x97,0x79,0x30, +0x0, 0x10,0x7e,0xf, 0x39,0x97,0x79,0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x7e, +0x1f,0x39,0x97,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22,0x1b,0x1a,0x50,0x7e,0x1f, +0x39,0x93,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5,0xfd,0x7a,0x71,0xfe,0x22, +0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12,0x3a,0x6a,0x74,0xf, 0x12,0x7, 0xfb, +0x7c,0x7b,0x74,0xf, 0x5e,0x70,0xfe,0x12,0x3a,0x6a,0x74,0xc, 0x12,0x7, 0xfb,0x54, +0x7f,0x68,0x8, 0x74,0xc, 0x7e,0x70,0xf8,0x12,0x3a,0x6a,0x7e,0x70,0x72,0x74,0xe, +0x12,0x3a,0x6a,0x74,0x7, 0x12,0x7, 0xfb,0x7c,0x7b,0x5e,0x70,0xfb,0x74,0x7, 0x2, +0x3a,0xb2,0x12,0x3a,0x6a,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x7e,0x34,0x0, 0x1, +0x7e,0xf, 0x39,0x97,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x39,0x97,0x69,0x30,0x0, 0x12, +0x5e,0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x6d, +0x33,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x12,0x12,0x63,0x28,0xe5,0x34,0x20,0xe7, +0x1b,0xa9,0xd5,0xcb,0x74,0x3, 0x7e,0x71,0x27,0x12,0x3a,0x6a,0x74,0xb, 0x7e,0x71, +0x2f,0x12,0x3a,0x6a,0x74,0xc, 0x7e,0x71,0x30,0x12,0x3a,0xb2,0x22,0x7e,0x34,0x0, +0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x3b,0x7e,0x7c, +0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6,0x22, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x34,0x4f,0xb4,0x5, 0x2a,0x12,0x3b,0xd, 0x12,0xa4, +0x31,0x2, 0x3f,0xdc,0x7e,0xb3,0x34,0x4f,0xb4,0x5, 0x1a,0x12,0x3b,0xd, 0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x34,0x4f,0xb4,0x5, 0xc, 0x12,0x3b,0xd, 0x2, 0x3f,0xd6,0x74, +0x1, 0x7a,0xb3,0x34,0x4f,0x22,0x5e,0x54,0x0, 0xf, 0x1b,0x1a,0x50,0x22,0x7c,0xab, +0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c,0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7, +0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22,0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, +0x12,0x3a,0x6a,0x7a,0x61,0xfc,0x12,0x3a,0xb5,0x12,0x3f,0x47,0xd2,0x0, 0x12,0xa4, +0xb3,0x12,0x3c,0x3, 0x12,0x13,0xde,0x2, 0x13,0x96,0x12,0x3f,0xf3,0xc2,0x0, 0x12, +0xa4,0xbe,0xc2,0x2, 0x12,0x3b,0xe9,0xc2,0x0, 0x12,0xa4,0xb3,0xa9,0xd5,0xcb,0x74, +0xf, 0x12,0x7, 0xfb,0x7a,0x1b,0xb0,0x74,0xf, 0x6c,0x77,0x12,0x3a,0x6a,0xe5,0xfc, +0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x3a,0xb5,0xa9,0xd0,0xce,0xa2,0x2, 0xa9,0x91, +0xc9,0x22,0x30,0x1, 0x6, 0x12,0x3c,0x3, 0x2, 0x13,0x96,0x12,0x3f,0xf3,0xc2,0x2, +0x2, 0x3b,0xe9,0xd2,0x2, 0x12,0x3b,0xe9,0x74,0x1, 0x22,0x12,0x3d,0x9c,0x12,0x85, +0x77,0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9,0xd7,0xcd,0xc2,0xce,0x12,0x98,0xa4,0x12, +0x3b,0xba,0x74,0x1, 0x12,0x3d,0xd4,0xa9,0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5, +0x25,0x7e,0x71,0x24,0x2, 0x3b,0x99,0x30,0x1c,0x5, 0xc2,0x1, 0x12,0x3b,0xf2,0xa9, +0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x1b,0x3, 0x20,0x1c,0x14,0x12,0x3d,0x9c,0xa9,0xd0, +0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x3d,0xd4,0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9, +0xc1,0xcd,0xd2,0x1, 0x2, 0x3b,0xf2,0xca,0x3b,0x7e,0xb3,0x38,0xd, 0xb4,0x1, 0x2, +0x80,0x2, 0xa1,0x99,0x6c,0xcc,0x6c,0xdd,0x7e,0xb3,0x38,0x38,0xb4,0x1, 0x8, 0x7e, +0xe0,0x10,0x7e,0xf0,0x32,0x80,0x6, 0x7e,0xe0,0x6, 0x7e,0xf0,0x14,0x12,0x85,0x80, +0x7d,0xf3,0x12,0x6c,0x71,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x39,0x59,0x12,0x25,0x96, +0x12,0x13,0xc7,0x12,0x0, 0x1e,0x74,0xa, 0x12,0x3b,0x7e,0x12,0xaf,0xf4,0x7e,0xe7, +0x2b,0x2c,0x7a,0xe5,0x25,0x7e,0xb3,0x2b,0x19,0xf5,0x24,0x74,0x4, 0x7a,0xb3,0x2b, +0x19,0x7e,0xe7,0x2b,0x2c,0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0x2c,0x7e,0xb3,0x2b, +0x19,0x12,0xa8,0xbf,0x7c,0x7b,0x74,0x8, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x15, +0x29,0x7d,0x23,0x7d,0x3f,0x12,0x51,0x7f,0xad,0x32,0x7a,0x37,0x2b,0x26,0x12,0x37, +0xb9,0xa1,0x7a,0x12,0x3f,0xcf,0x30,0x11,0x2, 0xa1,0x80,0x7c,0xbe,0x12,0x6f,0xb9, +0x12,0x37,0xd1,0x80,0xf, 0x80,0x7, 0x12,0x3d,0x9c,0xe4,0x12,0x3d,0xd4,0x20,0x93, +0xf6,0x12,0x3c,0x37,0x30,0x1c,0xf7,0x30,0x1b,0xf4,0xd2,0x1, 0x12,0x3b,0xf2,0xe4, +0x12,0x13,0xde,0xb, 0xc0,0x12,0x81,0x65,0x12,0x85,0x85,0x7e,0xa3,0x39,0x58,0x4c, +0xaa,0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x39,0x59,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x38, +0x38,0x70,0x5, 0xe4,0x7a,0xb3,0x39,0x58,0x12,0x3e,0xd3,0x78,0x18,0x7e,0xb3,0x39, +0x58,0x60,0x12,0xe4,0x7a,0xb3,0x39,0x58,0x7a,0xb3,0x2a,0x20,0x7a,0xb3,0x2a,0x21, +0x7e,0xd0,0x1, 0x80,0x1b,0x12,0x3e,0xd3,0x68,0x10,0x7e,0xb3,0x39,0x58,0x70,0xa, +0x7e,0xd0,0x1, 0xe4,0x7a,0xb3,0x38,0xd, 0x80,0x6, 0xbc,0xfc,0x28,0x2, 0x81,0xf3, +0xe4,0x7a,0xb3,0x2b,0x23,0x7e,0x35,0x25,0x7a,0x37,0x2b,0x2c,0xe5,0x24,0x7a,0xb3, +0x2b,0x19,0x4c,0xdd,0x68,0x3, 0x12,0x1a,0x7f,0xda,0x3b,0x22,0x74,0x81,0x7a,0xb3, +0x39,0xd4,0x22,0x80,0x1d,0x12,0x3d,0x9c,0x12,0x3f,0x3f,0x68,0x5, 0xc2,0x1, 0x12, +0x3b,0xf2,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x1b,0x15,0xe4,0x12, +0x3d,0xd4,0x20,0x93,0xe0,0x12,0x3d,0x9c,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x74,0x2, +0x2, 0x3d,0xd4,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xd4,0xb4,0x81,0x38,0x4c,0xaa,0x78, +0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf,0xa9,0xd0,0xce, +0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, 0x78,0x16,0xc2, +0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0xd4,0x22,0x7e,0xb3,0x38,0xd, 0x14, +0x68,0x5a,0x14,0x78,0x2, 0xc1,0xb8,0x14,0x68,0x6a,0x24,0x3, 0x68,0x2, 0xc1,0xb0, +0x12,0x3e,0xcb,0x38,0x8, 0x30,0x14,0xf, 0x12,0x57,0xca,0x68,0xa, 0x12,0xaf,0x4d, +0xe4,0x7a,0xb3,0x39,0x58,0x80,0x71,0x7e,0xb3,0x37,0xee,0x30,0xe0,0x6a,0x7e,0x73, +0x37,0xef,0xa, 0x27,0x7e,0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x38,0x38,0xb4,0x1, +0xb, 0x7e,0x34,0x62,0x7b,0x12,0xad,0x71,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x39,0x56, +0x50,0x46,0x12,0x3e,0xbe,0xe4,0x7a,0xb3,0x39,0x5a,0x80,0x3c,0x12,0x3e,0xcb,0x28, +0x32,0xe4,0x7a,0xb3,0x38,0xd, 0x7e,0xb3,0x39,0x58,0xb4,0x1, 0x3, 0x12,0x3e,0xc4, +0xd2,0x1b,0x80,0x1f,0x74,0xff,0x7a,0xb3,0x37,0xe7,0x12,0xb0,0x27,0x12,0x3c,0xb, +0x12,0x19,0x84,0xe4,0x7a,0xb3,0x38,0xd, 0x7a,0xb3,0x39,0xd9,0xd2,0x1b,0x80,0x8, +0x12,0x3e,0xc4,0xe4,0x7a,0xb3,0x39,0xd9,0x12,0x3e,0xf8,0x2, 0x3c,0x67,0x6d,0x33, +0x7a,0x37,0x39,0x56,0x74,0x1, 0x7a,0xb3,0x38,0xd, 0x22,0x7e,0x73,0x2a,0x20,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x39,0xc5,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xd2,0x0, +0x80,0x12,0x30,0x0, 0xc, 0x12,0x3f,0x3f,0x68,0x7, 0xc2,0x0, 0xc2,0x1, 0x12,0x3b, +0xf2,0x12,0x3d,0xa3,0x30,0x1b,0xeb,0x22,0x74,0x1, 0x12,0x3f,0x17,0x20,0x1b,0x6, +0x12,0x3e,0xde,0x12,0x3f,0x20,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x3f,0x25, +0x12,0x3f,0x20,0xe4,0x2, 0x3f,0x17,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0xa4,0xaa,0x22, +0xd2,0x1, 0x2, 0x3b,0xf2,0x74,0xc8,0x7a,0xb3,0x39,0xd8,0xc2,0x1b,0x80,0xa, 0x12, +0x3d,0xa3,0x30,0x1b,0x4, 0x75,0xe9,0xff,0x22,0x12,0x3f,0x3f,0x68,0xf1,0x22,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb,0xd2, +0x0, 0x12,0xa4,0xbe,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, 0xa9, +0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74,0x41, +0x12,0x3b,0x7e,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda,0xf8, +0x22,0xe4,0x12,0xa4,0x79,0x12,0xa5,0x35,0x12,0x3f,0xcf,0x12,0xa5,0x93,0x12,0x3a, +0x70,0x12,0xa4,0x27,0x12,0xa5,0x4c,0x12,0x0, 0x42,0x12,0xa5,0x58,0x12,0x72,0x3f, +0x12,0xa5,0x68,0xd2,0xaf,0x12,0xa4,0xc7,0x12,0x65,0x31,0x12,0x3a,0xdf,0x12,0x3f, +0x47,0x7e,0x8, 0x33,0xef,0x12,0xa5,0xb3,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8,0x90, +0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34,0x7e, +0x34,0x3, 0xe8,0x2, 0x1a,0x15,0x75,0xe7,0x6b,0x2, 0x3f,0xdc,0xe4,0x7e,0x34,0xd7, +0xfc,0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75, +0xe9,0xff,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0xca,0xd8,0xca,0x79,0x7e,0x73, +0x2a,0x8d,0x7e,0xf3,0x2a,0x8c,0xac,0xf7,0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34, +0xe4,0x12,0x17,0x53,0x7e,0xb3,0x38,0xcf,0xb4,0x1, 0x64,0x7e,0x73,0x38,0xd0,0xbe, +0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c,0x12,0x3f,0xcf,0x12,0x1a,0xc4,0x6d,0x33, +0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49,0x33,0xd, 0xc8,0x12,0x17,0x85,0x7a,0x35, +0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14,0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58, +0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34,0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24, +0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x38,0xd0,0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0xd, 0xc8,0x12,0x17,0x2e,0x1b,0xfd,0xda, +0x79,0xda,0xd8,0x22,0x7e,0xb3,0x38,0xc, 0xb4,0x1, 0x4, 0xe4,0x2, 0x40,0x90,0x22, +0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0x12,0x1a,0x99,0x12,0x70,0x44,0x7e,0xb3, +0x38,0xf, 0xb4,0x1, 0x64,0x12,0xa5,0x9a,0x12,0xb0,0x27,0x12,0x6f,0x74,0x12,0x43, +0x91,0x12,0x1a,0xc4,0x50,0xe5,0x12,0x5d,0xa8,0x12,0x5b,0x2b,0x7e,0xb3,0x38,0xc, +0xb4,0x1, 0x4, 0xe4,0x12,0x40,0x90,0x12,0x51,0x88,0x12,0x5f,0xb7,0x12,0x43,0x37, +0x40,0xc9,0x12,0x7b,0xd8,0x12,0x43,0x37,0x40,0xc1,0x12,0x2f,0x9e,0x12,0x1c,0x59, +0x12,0x46,0xdf,0x12,0x77,0xfe,0x12,0x86,0x95,0x12,0x44,0x5f,0x12,0x8a,0x89,0x12, +0x73,0x46,0x12,0x8a,0xff,0x12,0x76,0x82,0x12,0xaa,0x2b,0x12,0x41,0xf, 0x12,0x50, +0x58,0x12,0x85,0x57,0x12,0x50,0x1, 0x80,0x92,0x12,0x6f,0xc3,0x2, 0x40,0x84,0xca, +0x3b,0x75,0x24,0x0, 0x6c,0xff,0x75,0x25,0x0, 0x75,0x26,0x0, 0x75,0x28,0x3, 0x6c, +0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0x29,0x70,0xe, 0x7e,0xb3,0x2a,0x25,0x70, +0x8, 0x7e,0xb3,0x2a,0x26,0x70,0x2, 0x61,0x2, 0x30,0x12,0x6, 0x7e,0x68,0x33,0x53, +0x80,0x4, 0x7e,0x68,0x33,0x15,0x7f,0x6, 0x12,0x72,0x8e,0x7e,0x73,0x2a,0x22,0x7a, +0x6b,0x70,0x6c,0xdd,0x41,0xb3,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0xc, 0x7c,0xbc, +0x54,0xf, 0x12,0x43,0x2d,0xf5,0x28,0x7c,0xbc,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, +0x41,0xb1,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, 0x41,0xb1,0x7e,0x8, 0x0, 0x28,0x7c, +0xbc,0x12,0x8c,0x4f,0x50,0x2, 0x41,0xb1,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, +0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e, +0x73,0x2a,0x6c,0xbc,0x7c,0x28,0x57,0x7e,0xb3,0x2a,0x27,0x70,0x2a,0x75,0x29,0xf, +0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x33,0x1, 0x6d,0x22,0x74,0x1, 0x12,0x43, +0x4f,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, 0x3c,0x2e,0x34,0x33,0xb, 0x6d,0x22, +0x74,0x10,0x12,0x43,0x4f,0x80,0xe, 0xa, 0x3c,0x9, 0xb3,0x33,0x1, 0xf5,0x25,0x9, +0xb3,0x33,0xb, 0xf5,0x26,0xa, 0x3c,0x12,0x43,0x2f,0xb4,0x1, 0x11,0xe4,0xa, 0x3c, +0x19,0xb3,0x33,0x1, 0x19,0xb3,0x33,0xb, 0x75,0x25,0x0, 0x75,0x26,0x0, 0x7e,0xb3, +0x2a,0x83,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xc, +0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac,0x9d,0x49,0xb4,0x29, +0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x27,0x75,0x27,0x0, 0x7e,0x71,0x27, +0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x95,0x54,0xf, 0xbc,0xbc,0x78,0xa, 0x49,0xb3, +0x33,0x91,0x49,0xa3,0x33,0x93,0x80,0x9, 0x5, 0x27,0xe5,0x27,0xbe,0xb0,0xa, 0x40, +0xdc,0x5e,0xb4,0xf, 0xff,0x5e,0xa4,0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4, +0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5,0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0, +0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0,0xe5,0x28,0xa, 0x5b,0x12,0xa6,0xa9,0x2d,0xb5, +0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e,0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79, +0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13,0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d, +0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26,0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, +0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x6c,0xbc,0x7d,0x28,0x2, 0x21,0x56,0xe5,0x24,0x39, +0xb6,0x0, 0x1, 0x7e,0xb3,0x38,0x38,0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x26,0xb4,0x1, +0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38,0x6, 0x7e,0xb3,0x2a,0x26,0x60,0xa, 0xb2,0x12, +0x12,0x71,0x57,0x74,0x1, 0x12,0x40,0x90,0x7e,0xb3,0x2a,0x25,0x60,0x5, 0x7f,0x4, +0x12,0x65,0x5b,0xe4,0x7a,0xb3,0x2a,0x29,0x7a,0xb3,0x2a,0x25,0x7a,0xb3,0x2a,0x26, +0x80,0x4, 0xe4,0x12,0x40,0x90,0x7e,0x34,0x0, 0x5a,0xca,0x39,0x7e,0x18,0x29,0x8, +0x7e,0x8, 0x33,0x91,0x12,0x17,0x2e,0x1b,0xfd,0x4c,0xff,0x78,0xd, 0x7e,0x8, 0x33, +0x91,0x7e,0x34,0x0, 0x5a,0x74,0xff,0x12,0x17,0x53,0xda,0x3b,0x22,0xa, 0x3b,0x2d, +0x39,0x7d,0x28,0x7e,0x1b,0xb0,0x22,0xc2,0x0, 0x7e,0xb3,0x16,0x91,0x60,0x6, 0x7e, +0xb3,0x16,0x90,0x70,0x7, 0x12,0x9f,0xf6,0x28,0x2, 0xd2,0x0, 0xa2,0x0, 0x22,0x7c, +0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e,0xb, 0x90,0x7a,0x7b,0x90, +0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12,0x17,0x85,0xe5,0x29,0xa, +0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x7c,0xba,0x28, +0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e,0x7b,0x70,0x7a,0xb, 0x70, +0x22,0x7e,0x34,0x37,0xe8,0x30,0x11,0x47,0xc2,0x11,0x9, 0x53,0x0, 0x2, 0x12,0x43, +0xe0,0x7a,0x27,0x2a,0x6e,0x9, 0x53,0x0, 0x3, 0x12,0x43,0xe0,0x7a,0x27,0x2a,0x70, +0x9, 0x53,0x0, 0x4, 0x12,0x43,0xe0,0x7a,0x27,0x2a,0x72,0x7e,0x39,0x50,0x12,0x43, +0xeb,0x7a,0x27,0x2a,0x79,0x9, 0x53,0x0, 0x1, 0x12,0x43,0xeb,0x7a,0x27,0x2a,0x7b, +0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0xaf,0xcf,0x3e,0x34,0x7a,0x37,0x2a,0x81,0x22, +0xa, 0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa, 0x25,0x3e,0x24,0x3e, +0x24,0x22,0x7c,0x67,0x7c,0x7b,0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74, +0x1, 0x7a,0xb3,0x2a,0x25,0xe4,0x7a,0xb3,0x2a,0x27,0x7a,0xb3,0x2a,0x28,0x2, 0x8c, +0xf3,0xa5,0xbe,0x0, 0x1b,0x6c,0xaa,0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19, +0x62,0x29,0x66,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xf0,0x74,0x1, 0x7a,0xb3,0x2a,0x24, +0x6c,0xaa,0x80,0x26,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20, +0x12,0x43,0xe2,0x1b,0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, +0x18,0x20,0x12,0x43,0xe2,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0xca, +0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x7e,0x70,0xff,0x12,0xaf,0xe0,0xe4,0xa, 0x4a, +0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f,0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0, +0xbe,0xa0,0xa, 0x78,0xe2,0x7e,0x73,0x2a,0x20,0xa5,0xbf,0x0, 0x21,0x7e,0xb3,0x39, +0xe1,0x70,0x2, 0xc1,0x5e,0x6c,0xaa,0x7e,0x44,0x7f,0xff,0x12,0xaf,0xea,0x79,0x40, +0x0, 0x14,0x12,0xaf,0xfc,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xeb,0xc1,0x5e,0x7e,0xb3, +0x39,0xe1,0x70,0x3d,0xbe,0x70,0x0, 0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, +0xac,0x9a,0x49,0x34,0x28,0xae,0x12,0xaf,0xea,0x79,0x30,0x0, 0x14,0x49,0x34,0x28, +0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30,0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f, +0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0,0x7e,0xb3,0x2a,0x20,0xbc,0xba,0x38,0xce,0xc1, +0x5e,0x6c,0xaa,0x12,0x65,0x96,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50, +0x59,0x43,0x15,0x76,0x59,0x43,0x15,0x78,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xe4,0x6c, +0xaa,0x80,0x3b,0x6c,0xff,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30, +0x0, 0x14,0xbe,0x34,0x7f,0xff,0x68,0x1d,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x14,0x12,0xb0,0x2e,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50, +0x12,0xaf,0xae,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xc9,0xb, 0xa0,0x7e,0xb3, +0x39,0xe1,0xbc,0xba,0x38,0xbd,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x46,0xb4,0xff, +0x17,0x6c,0xff,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x5, 0x12,0xaf,0xae,0x80, +0x7, 0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xeb,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xd9,0x6c, +0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x43,0x28,0xae,0x12,0xb0,0x2e,0x59, +0x42,0x15,0x76,0x49,0x33,0x28,0xb0,0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a, +0x20,0xbc,0xba,0x38,0xde,0x7e,0x34,0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15, +0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x39, +0xe1,0x7a,0x73,0x1f,0x3e,0x7e,0x73,0x2a,0x20,0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f, +0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80,0x57,0x7e,0x70,0xff,0x6c,0xff,0x7e,0x50,0x2, +0xac,0x5f,0x49,0x12,0x15,0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73, +0x1f,0x46,0x80,0x7, 0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xe2,0xbe,0x70,0xff,0x68,0x2d, +0x12,0xaf,0xe0,0x74,0x1, 0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a, +0x49,0x24,0x28,0xae,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, +0x14,0x49,0x44,0x28,0xb0,0x7e,0x50,0x2, 0xac,0x57,0x12,0xaf,0xfc,0xb, 0xa0,0x7e, +0x63,0x2a,0x20,0xbc,0x6a,0x38,0xa1,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe, +0xb0,0x1, 0x68,0x13,0x12,0x65,0x96,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d, +0x3d,0x7d,0x2c,0x79,0x41,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x78,0xdb,0x7e,0xf3, +0x2a,0x20,0x7a,0xf3,0x39,0xe1,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, +0x2c,0x12,0x46,0xd8,0x29,0xb1,0x0, 0xa, 0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, +0xa, 0x12,0x46,0xd8,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0, +0x80,0x32,0xa5,0xbb,0x0, 0x2e,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x27,0x12,0x46,0xd8, +0x29,0xb1,0x0, 0xa, 0xbe,0xb0,0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0, +0x7c,0x2f,0xb, 0xf0,0x7e,0x30,0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74, +0x3, 0x7a,0x1b,0xb0,0x12,0x46,0xd8,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0, +0xbe,0xa0,0xa, 0x40,0x93,0xda,0xf8,0x22,0xa, 0x3a,0x2d,0x3d,0x7d,0x2c,0x22,0x2, +0x46,0xe2,0xca,0x3b,0x75,0x28,0x0, 0x7e,0xb3,0x2a,0x8e,0xf5,0x2a,0x7e,0xb3,0x2a, +0x8f,0xf5,0x2b,0x75,0x25,0x0, 0x7e,0xb3,0x16,0x91,0xb4,0x1, 0x2, 0x80,0x3, 0x2, +0x49,0x30,0x6c,0xdd,0x2, 0x49,0x1f,0x7e,0x70,0x2, 0xac,0x7d,0x9, 0xb3,0x26,0xfa, +0xf5,0x29,0x9, 0xc3,0x26,0xfb,0x75,0x26,0x2, 0x75,0x27,0x2, 0x7c,0xbd,0x12,0x5c, +0x4f,0xd2,0x0, 0x12,0x5c,0x18,0x7e,0xb3,0x37,0xf3,0xb4,0x1, 0x1e,0x7e,0xb3,0x2a, +0x21,0xb4,0x1, 0x17,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0x10,0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x6, 0x75,0x26,0x3, 0x75,0x27,0x3, 0xe5,0x29,0x60,0x5, 0x12, +0x4c,0x10,0x48,0x3, 0x75,0x26,0x1, 0x4c,0xcc,0x68,0xc, 0xe5,0x2b,0xa, 0x2b,0x1b, +0x24,0xa, 0x3c,0xbd,0x32,0x48,0x3, 0x75,0x27,0x1, 0x75,0x25,0x0, 0x75,0x24,0x0, +0x80,0x51,0xe5,0x24,0xbc,0xbd,0x68,0x49,0x12,0x2f,0xa9,0x7a,0xa1,0x2c,0x9, 0xb3, +0x26,0xfb,0xf5,0x2d,0xa, 0x2a,0xe5,0x29,0x12,0x2f,0x7f,0xbe,0x34,0x0, 0x4, 0x18, +0x30,0xe5,0x2d,0xa, 0x2b,0xa, 0x3c,0x9d,0x32,0x12,0x17,0x85,0xbe,0x34,0x0, 0x4, +0x18,0x1f,0x12,0x8d,0xb8,0x40,0xa, 0xe5,0x2c,0x7e,0x71,0x2d,0x12,0x8d,0x74,0x50, +0x5, 0x75,0x25,0x0, 0x80,0x3, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x75,0x27,0x1, 0x80, +0x7, 0x5, 0x24,0x12,0xb0,0x1f,0x38,0xaa,0x12,0x8d,0xb8,0x50,0xb, 0x12,0x5d,0x75, +0x75,0x26,0x0, 0x75,0x27,0x0, 0x80,0xb, 0x12,0x8c,0x4c,0x50,0x6, 0x75,0x26,0x3, +0x75,0x27,0x3, 0xe5,0x25,0x70,0x3, 0x2, 0x48,0xd8,0x6c,0xff,0x6c,0xee,0x12,0x4c, +0x3, 0x18,0x15,0xe5,0x2a,0xa, 0x5b,0xbd,0x35,0x48,0xd, 0x12,0x4b,0xf8,0x18,0x8, +0xe5,0x2b,0xa, 0x5b,0xbd,0x35,0x58,0x3, 0x12,0x49,0x3d,0xb, 0xe0,0xbe,0xe0,0x3, +0x78,0xdc,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xd3,0x7e,0xa1,0x2b,0x1b,0xa0,0xbc,0xac, +0x68,0x6, 0x4c,0xcc,0x68,0x2, 0x1, 0xd8,0xe5,0x29,0xbe,0xb0,0x0, 0x38,0x2, 0x1, +0xd8,0x12,0x4c,0x10,0x48,0x2, 0x1, 0xd8,0x7e,0x18,0x0, 0x64,0x7a,0x1d,0x41,0x4c, +0xcc,0x78,0x5, 0x75,0x40,0x2, 0x80,0x7, 0xbc,0xac,0x78,0x3, 0x75,0x40,0x0, 0x6c, +0xff,0x7e,0xa1,0x40,0x3e,0xa0,0x7e,0x90,0x6, 0xac,0x9f,0x7c,0xb9,0x2c,0xba,0x24, +0x2e,0x12,0x49,0x33,0x7e,0x14,0x0, 0x64,0x12,0x15,0x6c,0x7c,0xb9,0x24,0x30,0xa, +0x1b,0xb, 0x18,0x10,0x1a,0x2, 0x1a,0x0, 0x12,0x15,0xc8,0x7e,0xd, 0x41,0xbf,0x10, +0x58,0x3, 0x7a,0x1d,0x41,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xc5,0x7e,0x1d,0x41,0xbe, +0x18,0x0, 0x0, 0x58,0x7, 0x7e,0x18,0x0, 0x1, 0x7a,0x1d,0x41,0x6c,0xff,0x74,0x6, +0xac,0xbf,0x24,0x30,0x12,0x49,0x33,0x7e,0xd, 0x41,0x12,0x15,0x5b,0x7e,0x8, 0x0, +0x64,0x12,0x15,0xc8,0x7d,0x43,0xe5,0x29,0xa, 0x3b,0x1b,0x34,0xa, 0x5f,0x2d,0x53, +0xa, 0x2c,0x1b,0x24,0x7e,0xa1,0x40,0xa, 0x3a,0x2d,0x32,0x12,0x4c,0x21,0x1b,0x1a, +0x40,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xc6,0xe5,0x26,0x7e,0x71,0x27,0x7c,0x6d,0x7e, +0x51,0x28,0x12,0x49,0x62,0xe5,0x25,0x60,0x2f,0x6c,0xff,0x6c,0xee,0x12,0x4c,0x3, +0x18,0x15,0xe5,0x2a,0xa, 0x5b,0xbd,0x35,0x48,0xd, 0x12,0x4b,0xf8,0x18,0x8, 0xe5, +0x2b,0xa, 0x5b,0xbd,0x35,0x58,0x3, 0x12,0x49,0x3d,0xb, 0xe0,0xbe,0xe0,0x3, 0x78, +0xdc,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xd3,0x12,0x5d,0x75,0x5, 0x28,0xb, 0xd0,0x7e, +0x73,0x28,0x84,0xbc,0x7d,0x28,0x3, 0x2, 0x47,0x7, 0xe5,0x28,0x7a,0xb3,0x28,0x84, +0xda,0x3b,0x22,0xa, 0x3b,0xb, 0x38,0x30,0x1a,0x26,0x1a,0x24,0x22,0x1b,0x44,0xa, +0x5f,0x2d,0x54,0xa, 0x2c,0x1b,0x24,0xa, 0x3e,0x2d,0x32,0x12,0x2c,0xb9,0x7d,0x23, +0x7c,0x7e,0x3e,0x70,0x74,0x6, 0xac,0xbf,0x2c,0xb7,0x24,0x2e,0xa, 0x3b,0x1b,0x38, +0x20,0x22,0xca,0x3b,0x7c,0xc4,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x74,0x9, 0xac,0xb5, +0x7d,0x95,0x2e,0x94,0x27,0x76,0x6d,0x88,0x7e,0xe7,0x2a,0x85,0xe4,0x39,0xb4,0x0, +0x6, 0x7e,0x70,0x2, 0xac,0x7f,0x9, 0xb3,0x26,0xfa,0xf5,0x4e,0x9, 0xb3,0x26,0xfb, +0xf5,0x4f,0x7e,0x73,0x2a,0x8d,0x7c,0x6e,0x7e,0x8, 0x0, 0x52,0x12,0x4b,0xa5,0xf5, +0x50,0xe5,0x4e,0x7e,0x73,0x2a,0x8c,0x7c,0x6d,0x7e,0x8, 0x0, 0x51,0x12,0x4b,0xa5, +0x7c,0xab,0xe5,0x51,0x7e,0x71,0x52,0x12,0x4c,0x21,0x7d,0xf3,0x7a,0xf5,0x5a,0x7e, +0xf4,0x15,0x9e,0x7a,0xf5,0x5c,0x85,0x51,0x54,0x85,0x52,0x55,0x7a,0xa1,0x56,0x85, +0x50,0x57,0x7e,0xb3,0x2a,0x78,0xf5,0x58,0x75,0x59,0x0, 0xbe,0xc0,0x1, 0x78,0x8, +0xe5,0x58,0x1e,0xb0,0x1e,0xb0,0xf5,0x58,0x7e,0x8, 0x0, 0x54,0x12,0x80,0xfd,0x7d, +0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa0,0x6d,0xaa,0x2f,0x51,0x7e,0x37,0x15,0xa2,0x6d, +0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d,0x45,0x7e,0x37, +0x15,0xa6,0x6d,0x22,0x7d,0x3, 0x7e,0x37,0x15,0xa8,0x2f,0x10,0x7a,0x1d,0x49,0x7f, +0x65,0xa, 0x3d,0xe5,0x4e,0xa, 0xfb,0x9d,0xf3,0x7d,0x3f,0x7c,0xc7,0x61,0x7, 0xa, +0x4e,0xe5,0x4f,0xa, 0x5b,0x9d,0x54,0xf5,0x4d,0x41,0xf1,0xbe,0xc0,0x0, 0x58,0x2, +0x41,0xef,0x7e,0x73,0x2a,0x8c,0xbc,0x7c,0x18,0x2, 0x41,0xef,0xe5,0x4d,0xbe,0xb0, +0x0, 0x58,0x2, 0x41,0xef,0x7e,0x73,0x2a,0x8d,0xbe,0x71,0x4d,0x18,0x2, 0x41,0xef, +0x7c,0xbc,0x7e,0x71,0x4d,0x12,0x2c,0xb9,0x7e,0x53,0x2a,0x78,0xa, 0x25,0x7d,0xf3, +0x9d,0xf2,0xbe,0xf4,0x0, 0x0, 0x8, 0x77,0xbd,0xef,0x18,0xd, 0x7f,0x14,0x2e,0x34, +0x0, 0x6, 0x7e,0x1b,0xb0,0x4, 0x7a,0x1b,0xb0,0xe5,0x4e,0xa, 0x2b,0x1a,0x3c,0x12, +0x4b,0x8c,0x18,0xd, 0xe5,0x4f,0xa, 0x2b,0xe5,0x4d,0x1a,0x3b,0x12,0x4b,0x8c,0x8, +0x4e,0x7c,0xbc,0x7e,0x71,0x4d,0x7c,0x6f,0x12,0xa5,0xf5,0xf5,0x53,0xb4,0x2, 0x6, +0x7d,0x3f,0xe, 0x34,0x9d,0xf3,0xe5,0x53,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x53,0xb4, +0x1, 0x2d,0x12,0x4b,0x7d,0x1a,0x1c,0x12,0x4b,0x84,0x7e,0x1d,0x45,0x9f,0x10,0x7a, +0x1d,0x45,0x12,0x4b,0x7d,0xe5,0x4d,0x1a,0x1b,0x12,0x4b,0x84,0x7e,0x1d,0x49,0x9f, +0x10,0x7a,0x1d,0x49,0x12,0x4b,0x7d,0x9f,0x51,0x1a,0x26,0x1a,0x24,0x9f,0x61,0x5, +0x4d,0xa, 0x2e,0xe5,0x4f,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x4d,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x41,0x3b,0xb, 0xc0,0xa, 0x2d,0xe5,0x4e,0xa, 0x3b,0x2d,0x32,0x1a, +0x37,0x1a,0xfc,0xbd,0xf3,0x18,0x2, 0x41,0x2f,0xbe,0x58,0x0, 0x0, 0x78,0x2, 0xb, +0x5c,0xbe,0x68,0x0, 0x0, 0x78,0x2, 0xb, 0x6c,0x7e,0x1d,0x45,0x7f,0x5, 0x12,0x4b, +0x96,0x1b,0x4a,0x30,0x7e,0x1d,0x49,0x7f,0x6, 0x12,0x4b,0x96,0x79,0x34,0x0, 0x2, +0x7e,0xb3,0x2a,0x84,0x60,0xd, 0x1e,0xd4,0x1e,0xc4,0x50,0x4, 0x4e,0xd4,0x80,0x0, +0x14,0x78,0xf3,0xbe,0x68,0x0, 0x7f,0x28,0x4, 0x7e,0x68,0x0, 0x7f,0x7d,0x3d,0x39, +0x74,0x0, 0x5, 0x74,0x9, 0xac,0xbf,0x9, 0x75,0x27,0x7c,0x39,0x74,0x0, 0x6, 0xbe, +0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb4,0x0, 0x6, 0xda,0x3b,0x22,0x7d,0x3f,0x1a, +0x26,0x1a,0x24,0x22,0x1a,0x2, 0x12,0x15,0x5b,0x7f,0x1, 0x22,0x9d,0x32,0x12,0x17, +0x85,0xbe,0x34,0x0, 0x1, 0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x15,0x77, +0x2e,0x18,0x0, 0x20,0x22,0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d, +0x32,0x3e,0x34,0xb, 0x34,0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, +0x3f,0x9d,0xf3,0xa, 0x39,0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc, +0xf9,0x28,0xd, 0xa, 0x39,0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10, +0xa, 0x3f,0xa, 0x58,0x2d,0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7, +0x7a,0xb, 0xb0,0x7c,0xba,0xda,0xf8,0x22,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0xbe,0x34, +0x0, 0x1, 0x22,0xa, 0x3f,0xe5,0x29,0xa, 0x4b,0x2d,0x34,0xbe,0x34,0x0, 0x1, 0x22, +0xe5,0x2a,0xa, 0x2b,0x1b,0x24,0xe5,0x29,0xa, 0x3b,0xbd,0x32,0x22,0x7c,0xbd,0x7c, +0x7e,0x7e,0x13,0x2a,0x8d,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10, +0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f, +0x70,0x7c,0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x8c,0xf5,0x26,0x7e,0xb3, +0x2a,0x8d,0xf5,0x25,0x7e,0xd4,0x0, 0xc8,0x6c,0xff,0x12,0x4c,0x1d,0xe5,0x26,0xa, +0x1b,0x1b,0x14,0xa, 0xcd,0xbd,0xc1,0x58,0x14,0xe5,0x25,0xa, 0x1b,0x1b,0x14,0xa, +0xce,0xbd,0xc1,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, 0x4e,0xf0,0x10, +0xb, 0x1a,0xc0,0xbe,0xc4,0x0, 0xc8,0x8, 0xc, 0x7e,0x17,0x28,0x8a,0xbe,0x14,0x3, +0x20,0x8, 0x2, 0xa1,0x81,0xbe,0xc4,0x0, 0x64,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe, +0xc4,0x3, 0x20,0x58,0x2, 0xa1,0x81,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8c,0xbc,0xb8,0x8, 0x9, 0x12,0x4d,0xb8,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a, +0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x1, 0xa1,0x81,0x6c,0xaa, +0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8c,0xbc, +0xb8,0x8, 0x9, 0x12,0x4d,0xb8,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80, +0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a,0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x8d,0xbc,0xb9,0x8, 0x9, 0x12,0x4d,0xb8,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90,0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd, +0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e, +0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x8d,0xbc,0xb9,0x8, +0x9, 0x12,0x4d,0xb8,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c, +0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0, +0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b,0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29, +0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, 0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc, +0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, 0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39, +0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b,0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0xb9,0xbd, +0x3d,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f,0x40,0x6d,0xbb,0x7e,0xa3,0x2a,0x8c, +0x7e,0x73,0x2a,0x8d,0x4c,0xcc,0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14, +0xbc,0xbc,0x78,0x6, 0xa, 0x6c,0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0, +0x1, 0x80,0xb, 0x7c,0xba,0x14,0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, +0x7e,0x34,0x0, 0x6, 0xe4,0x12,0x17,0x53,0x7e,0x73,0x2a,0x8c,0xa, 0x37,0x1b,0x34, +0x7a,0x4b,0x70,0x7e,0x73,0x2a,0x8d,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c, +0xec,0x80,0x1d,0x75,0x24,0x0, 0x7c,0xdf,0x80,0xb, 0x12,0x4c,0x37,0x70,0xb, 0x5, +0x24,0xb, 0xb4,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf0,0xe5,0x24,0x60,0x7, 0x1b,0xe0, +0xbe,0xe0,0x0, 0x58,0xde,0x7c,0xec,0x80,0x26,0x75,0x24,0x0, 0x1a,0xaf,0xb, 0xa4, +0x7d,0x3a,0x7c,0xd7,0x80,0xb, 0x12,0x4c,0x37,0x70,0xe, 0x5, 0x24,0xb, 0xb4,0xb, +0xd0,0x7e,0x73,0x2a,0x8c,0xbc,0x7d,0x18,0xed,0xe5,0x24,0x60,0x7, 0x1b,0xe0,0xbe, +0xe0,0x0, 0x58,0xd5,0x12,0x4e,0xd8,0x80,0x1d,0x75,0x24,0x0, 0x7c,0xdf,0x80,0xb, +0x12,0x4c,0x37,0x70,0xb, 0x5, 0x24,0xb, 0xb4,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf0, +0xe5,0x24,0x60,0xa, 0xb, 0xe0,0x7e,0x73,0x2a,0x8d,0xbc,0x7e,0x18,0xdb,0x12,0x4e, +0xd8,0x80,0x22,0x75,0x24,0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xb, 0x12,0x4c,0x37,0x70, +0xe, 0x5, 0x24,0xb, 0xb4,0xb, 0xd0,0x7e,0x73,0x2a,0x8c,0xbc,0x7d,0x18,0xed,0xe5, +0x24,0x60,0xa, 0xb, 0xe0,0x7e,0x73,0x2a,0x8d,0xbc,0x7e,0x18,0xd6,0x7d,0x3b,0x39, +0x74,0x0, 0x5, 0x7d,0x3b,0xda,0x3b,0x22,0x1a,0xac,0xb, 0xa4,0x7d,0x3a,0x7c,0xe7, +0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x35,0xaa,0x6c,0x33,0x80,0x3d,0x7e,0x70, +0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc,0x3, +0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32,0x12, +0x4b,0x8c,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3,0x35, +0xaa,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf,0x2, +0x4f,0x32,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac,0xb2, +0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c,0xbc, +0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26,0xfb, +0xa, 0x28,0xa, 0x31,0x12,0x4b,0x8c,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x4b,0x8c, +0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0,0xb, +0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x36,0x44,0xbe,0xb0,0x0, 0x28,0x12,0x14,0x7a, +0xb3,0x36,0x44,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x8c,0x7a,0x37,0x2a,0x79, +0x7e,0xb3,0x37,0xf3,0x70,0x58,0x7e,0xb3,0x39,0xdd,0x70,0x52,0x7e,0xb3,0x37,0x77, +0x70,0x4c,0x7e,0x37,0x39,0x15,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f,0xbe, +0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3,0x26, +0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, 0x7e, +0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x36,0x44,0xda,0xf8, +0x22,0x7e,0x8, 0x39,0xb, 0x12,0x50,0x35,0x7e,0x8, 0x39,0x13,0x12,0x50,0x35,0x12, +0x50,0x51,0x12,0x50,0x4a,0x2, 0x50,0x18,0x7e,0x37,0x39,0xb, 0xbe,0x34,0x0, 0x0, +0x28,0x12,0x7e,0x73,0x39,0xd9,0xbe,0x70,0x5, 0x50,0x9, 0x7e,0xb3,0x38,0x38,0x70, +0x3, 0x12,0x3e,0xbe,0x22,0xb, 0xa, 0x30,0xe5,0x61,0xa, 0x2b,0xbd,0x32,0x28,0x4, +0x9d,0x32,0x80,0x2, 0x6d,0x33,0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x39,0xb9,0x2, 0x50, +0x35,0x7e,0x8, 0x2b,0xd6,0x2, 0x50,0x35,0x7e,0x73,0x28,0x93,0x7a,0x73,0x28,0x94, +0x7e,0x73,0x2a,0x20,0x7a,0x73,0x2a,0x21,0xe4,0x7a,0xb3,0x2a,0x24,0x22,0x7e,0x37, +0x33,0xeb,0xb, 0x34,0x7a,0x37,0x33,0xeb,0x7e,0x37,0x33,0xed,0xbe,0x37,0x33,0xeb, +0x28,0x3, 0x2, 0x50,0x89,0x22,0x2, 0x50,0x6e,0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9, +0xd6,0xdf,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x50,0x86,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x74, +0xa, 0x7a,0xb3,0x2a,0x6c,0x74,0x10,0x7a,0xb3,0x2a,0x6d,0x12,0x51,0x4, 0x7a,0x37, +0x2a,0x74,0x74,0x1e,0x7a,0xb3,0x2a,0x78,0x12,0x54,0xb1,0x7e,0x34,0x0, 0x96,0x7a, +0x37,0x2a,0x7f,0xe4,0x7a,0xb3,0x2a,0x83,0x74,0x4, 0x7a,0xb3,0x2a,0x84,0x7e,0x34, +0x0, 0x64,0x7a,0x37,0x2a,0x85,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0x2a,0x81,0xe4,0x7a, +0xb3,0x16,0x92,0x22,0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2a,0x6e,0x7a,0x37,0x2a,0x70, +0x7a,0x37,0x2a,0x72,0x22,0x12,0x54,0xb1,0x2, 0x51,0x4, 0x12,0x51,0x15,0x7e,0xb3, +0x37,0x77,0xb4,0x1, 0xc, 0x7e,0x34,0x1, 0x18,0x7a,0x37,0x2a,0x79,0x7a,0x37,0x2a, +0x7b,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x1f,0x7e,0x34,0x1, 0x5e,0x7a,0x37,0x2a,0x79, +0x7e,0x34,0x1, 0x2c,0x7a,0x37,0x2a,0x7b,0x7e,0x34,0x1, 0x90,0x7a,0x37,0x2a,0x6e, +0x7e,0x34,0x1, 0x7c,0x12,0x51,0xc, 0x7e,0xb3,0x2a,0x20,0x70,0x21,0x7e,0x27,0x2a, +0x79,0x7d,0x32,0x7e,0x14,0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x51,0x7f,0xbe,0x34, +0x0, 0x50,0x28,0x4, 0x7e,0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x79,0x22,0x1e, +0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x22,0x12,0x51,0x1b,0xe4,0x7a,0xb3,0x39,0xdf, +0x2, 0x51,0x93,0xe4,0x7a,0xb3,0x28,0x93,0x12,0x53,0x72,0x7e,0xb3,0x16,0x91,0xb4, +0x1, 0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f, +0x6, 0xf8,0x12,0x57,0xd2,0x12,0x51,0xdb,0x12,0x59,0x7f,0x7e,0xb3,0x16,0x90,0xb4, +0x1, 0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73, +0x26,0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e, +0x34,0x0, 0x3, 0xe4,0x12,0x17,0x53,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12, +0x17,0x53,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3, +0x26,0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0x53, +0x49,0x6c,0x55,0x12,0x52,0xa1,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0x53, +0x59,0x6c,0x55,0x12,0x52,0xa1,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x53, +0x2a,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x53,0x33,0x2e,0x24,0x26,0x86,0x12, +0x53,0x3e,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x53, +0x2a,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x53,0x33,0x2e,0x24,0x26,0x89,0x12, +0x53,0x3e,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a, +0xb3,0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0x53,0x49,0x7e,0x50,0x1, 0x12,0x52,0xa1, +0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0x53,0x59,0x7e,0x50,0x1, 0x12,0x52, +0xa1,0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0, +0x22,0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e, +0xd0,0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e, +0xe4,0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69, +0xf0,0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5, +0xb, 0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, +0x4c,0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4, +0xbd,0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a, +0x6b,0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc, +0x4f,0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24, +0x0, 0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0x7e,0x29, +0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x7a,0x1d,0x24,0x7e,0xf, 0x6, 0xf8, +0x7e,0xb3,0x2a,0x8d,0x7e,0x37,0x2a,0x72,0x22,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x8d, +0x74,0x2, 0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x8c,0x7e,0x37,0x2a, +0x70,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72,0xb, 0x30,0x90, +0x60,0x9a,0xe4,0x93,0x12,0x53,0x37,0xb, 0x24,0xa, 0x33,0xbd,0x32,0x48,0xe7,0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28,0x86,0x7a,0x37, +0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f,0x36,0x5e,0xd4, +0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d,0x3d,0x7a,0x37, +0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a,0x8c,0x7a,0x73, +0x1f,0x73,0x7e,0x73,0x2a,0x8d,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a,0x7b,0x7a,0x37, +0x1f,0x7c,0x7e,0x37,0x2a,0x7d,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a,0x7f,0x7a,0x37, +0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x39,0xe0,0x7a,0x73, +0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, 0x7e,0x73,0x1f, +0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85,0x7e,0x37,0x1f, +0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88,0x7e,0x37,0x1f, +0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53,0x28,0x8c,0xa, +0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e,0x7e,0x37,0x1f, +0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91,0x6c,0x33,0x80, +0x20,0x7c,0xb3,0x7e,0x70,0x1, 0x12,0x54,0xcd,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xd8,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7e,0x34,0x0, 0xb4,0x7a,0x37,0x2a,0x79,0x7e,0x34,0x0, 0xa0,0x7a,0x37,0x2a, +0x7b,0x7e,0x34,0xff,0x60,0x7a,0x37,0x2a,0x7d,0x22,0x7e,0x70,0x1, 0x7c,0x67,0x7c, +0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e,0x24,0x0, +0x5e,0x12,0x57,0xdf,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e,0x24,0x27,0x72, +0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff,0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0x7c,0xab,0x7e,0xb3, +0x39,0xdd,0x70,0x1b,0x7e,0xb3,0x28,0xa8,0x70,0x15,0x12,0x57,0xca,0x68,0x10,0x7e, +0xb3,0x2a,0x8a,0xbe,0xb0,0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x54,0xcd,0x22, +0xca,0xd8,0xca,0x79,0xc2,0x0, 0x6d,0x88,0x7a,0x87,0x39,0x54,0xe4,0x7a,0xb3,0x1f, +0x58,0xe5,0x1f,0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1f,0x7e,0xb3,0x28,0x84,0x60,0xa, +0x7e,0x87,0x7, 0xfa,0xbe,0x84,0x1, 0x18,0x58,0xa, 0xc2,0x14,0x6d,0x88,0x7a,0x87, +0x39,0x15,0xc1,0x53,0x12,0x86,0xa, 0x60,0x10,0x7e,0x84,0x0, 0x64,0x7a,0x87,0x39, +0xb, 0x7e,0x84,0x0, 0x32,0x7a,0x87,0x39,0x15,0x7e,0x87,0x39,0xb, 0x4d,0x88,0x68, +0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x76,0xe4,0xa, 0x3f,0x19,0xb3, +0x1f,0x34,0x12,0x56,0xce,0x7e,0x8, 0x1f,0x52,0x7c,0xbd,0x7c,0x7e,0x12,0x4d,0xc2, +0x7d,0x93,0x7e,0x87,0x39,0x15,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x39,0x15,0x7e,0x87, +0x39,0x54,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x39,0x54,0xe5,0x1f,0xbe,0xb0,0x5, 0x38, +0x1f,0x7e,0x8, 0x39,0x17,0x12,0x56,0xdb,0x50,0x7, 0x12,0x56,0xc5,0xd2,0x0, 0x80, +0x2e,0x7e,0x8, 0x39,0x17,0x7e,0x18,0x1f,0x52,0x12,0x57,0x38,0x50,0x21,0x80,0xf, +0xbe,0x94,0x0, 0x32,0x40,0x19,0x7e,0x8, 0x1f,0x52,0x12,0x85,0x95,0x50,0x10,0x12, +0x56,0xc5,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52,0x12,0x85,0xe4,0xd2,0x0, 0xb, +0xf0,0x12,0x56,0xb5,0x38,0x85,0x30,0x0, 0x30,0x6c,0xff,0x80,0x1c,0x12,0x56,0xce, +0x7e,0x8, 0x1f,0x58,0x12,0x56,0xdb,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4, +0x1, 0x5, 0x7c,0xbf,0x12,0x55,0xc, 0xb, 0xf0,0x12,0x56,0xb5,0x38,0xdf,0x75,0x1f, +0x0, 0x7e,0x34,0x0, 0x64,0x7a,0x37,0x39,0xb, 0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, +0xac,0x67,0xb, 0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x39,0x17,0x12,0x17, +0x2e,0x1b,0xfd,0x7e,0x37,0x39,0xb, 0x4d,0x33,0x78,0x34,0x7e,0x37,0x39,0x15,0xbe, +0x34,0x0, 0x32,0x40,0x3e,0x7e,0x37,0x39,0x54,0xbe,0x34,0x0, 0x19,0x40,0x34,0x90, +0x60,0x51,0x12,0x56,0xbc,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, 0x24,0x90, +0x60,0x50,0x12,0x56,0xbc,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, 0x14,0x6c, +0xff,0x80,0x7, 0x7c,0xbf,0x12,0x55,0xc, 0xb, 0xf0,0x12,0x56,0xb5,0x38,0xf4,0xd2, +0x0, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x39,0x15,0xa2,0x0, 0x92,0x14,0x12,0x57,0x21, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xe4,0x93,0x7c,0x7b, +0x1e,0x70,0xa, 0x27,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x74,0x2, +0xac,0xbf,0x9, 0xd5,0x26,0xfa,0x9, 0xe5,0x26,0xfb,0x22,0x7c,0xbd,0x7c,0x7e,0x7c, +0x6b,0xc2,0x1, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f,0x70,0x2d,0xf2, +0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0,0xbc,0xb6,0x38, +0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, 0xbc,0xb7,0x38, +0x4, 0xd2,0x1, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38,0xc9,0xa2,0x1, +0x22,0x30,0x14,0x13,0x12,0x57,0xc2,0x68,0x6, 0x7e,0xb3,0x39,0xdd,0x60,0x8, 0x7e, +0x34,0xb, 0xb8,0x7a,0x37,0x39,0x13,0x22,0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80, +0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f,0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x56,0xdf, +0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76,0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90, +0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9,0xc3,0x22,0x6c,0xaa,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x29,0x62,0x12,0x51,0x7f,0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x29,0x64,0x12,0x51,0x7f,0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac, +0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28,0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4, +0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19, +0xb4,0x28,0xb4,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xb2,0x22,0x7c,0xb9,0x6c,0x77,0x2, +0x54,0xcd,0x7e,0xb3,0x28,0xa8,0xbe,0xb0,0x1, 0x22,0x7e,0xb3,0x38,0x38,0xbe,0xb0, +0x1, 0x22,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x2e,0x24,0x16,0xe8,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e,0x34, +0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x8f,0x12,0x17,0x2e,0x1b,0xfd,0x7e, +0x34,0x2a,0x2d,0x7a,0x37,0x2b,0x95,0xe4,0x7a,0xb3,0x2b,0x93,0x7a,0xb3,0x2b,0x94, +0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x58,0x36,0x7e,0x8, 0x25,0xee,0x12,0x17,0x2e, +0x1b,0xfd,0x7e,0x34,0x2b,0x97,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2,0x74, +0x1, 0x7a,0xb3,0x25,0xf3,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0xe4, +0x7a,0xb3,0x38,0xb4,0x7a,0xb3,0x38,0xb5,0x90,0x60,0x50,0x93,0x7a,0xb3,0x38,0xb6, +0x90,0x60,0x51,0xe4,0x93,0x7a,0xb3,0x38,0xb7,0xe4,0x7a,0xb3,0x38,0xb8,0x74,0xa, +0x7a,0xb3,0x38,0xb9,0xe4,0x7a,0xb3,0x38,0xba,0x7a,0xb3,0x38,0xbb,0x74,0x1, 0x7a, +0xb3,0x38,0xbd,0x74,0x2d,0x7a,0xb3,0x38,0xc1,0x74,0x46,0x7a,0xb3,0x38,0xc2,0x74, +0x6e,0x7a,0xb3,0x38,0xd3,0x74,0x4, 0x7a,0xb3,0x38,0xd4,0xe4,0x7a,0xb3,0x38,0xc0, +0x74,0x64,0x7a,0xb3,0x38,0xd6,0x74,0x7f,0x7a,0xb3,0x38,0xd5,0x74,0x2, 0x7a,0xb3, +0x38,0xd7,0x74,0x40,0x7a,0xb3,0x38,0xd2,0xe4,0x7a,0xb3,0x38,0xcd,0x74,0xfa,0x7a, +0xb3,0x38,0xcb,0x74,0x1e,0x7a,0xb3,0x38,0xcc,0x74,0x1, 0x7a,0xb3,0x38,0xca,0x74, +0xc, 0x7a,0xb3,0x38,0xc9,0x74,0x1, 0x7a,0xb3,0x38,0xce,0xe4,0x7a,0xb3,0x38,0xcf, +0x7a,0xb3,0x38,0xd0,0x7e,0x8, 0x38,0xd8,0x7e,0x34,0x0, 0x2c,0x12,0x17,0x53,0x74, +0x1, 0x7a,0xb3,0x38,0xe3,0x74,0xf4,0x7a,0xb3,0x38,0xe4,0x74,0x19,0x7a,0xb3,0x38, +0xe5,0x74,0x38,0x7a,0xb3,0x38,0xe6,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x58,0x36, +0x7e,0x8, 0x38,0xf4,0x12,0x17,0x2e,0x1b,0xfd,0x74,0x5, 0x7a,0xb3,0x39,0x1, 0x74, +0x1, 0x7a,0xb3,0x38,0xf8,0x7e,0x34,0x0, 0x28,0xca,0x39,0x7e,0x34,0x61,0xec,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12,0x17,0x2e,0x1b,0xfd,0x22,0x6d,0x33,0x6c, +0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xfb,0x54,0x1, 0x78,0x5, 0x4e,0x70,0x1, +0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x93,0xbc,0x5a,0x38,0xe4,0x6c, +0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xd8,0xbe,0xb0,0xd, 0x38,0x5, 0x4e,0x70, +0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80,0x3, 0x4e,0x60,0x50, +0xb, 0xa0,0x12,0x59,0x78,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x92,0xbc,0xba,0x22,0xca, +0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d,0x32,0x7d,0x9b,0x75, +0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a,0xe4,0x7a,0xb3,0x8, +0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26,0xf8,0x7a,0xb3,0x26, +0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x5a,0xf4,0xb, 0x6a,0xc0,0xbd, +0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d,0x71,0x7d,0x60,0xb, +0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x72,0x7e,0x74,0x0, 0x3, +0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x5a,0xe1,0xb, 0x3a,0xd0,0xbd,0xcd, +0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80,0x19,0x12,0x5a,0xea, +0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58,0x9, 0x7e,0xb3,0x26, +0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x93,0xbc,0xba,0x38,0x99, +0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3,0x8, 0x9, 0x7a,0x97, +0x8, 0x6, 0x12,0x5a,0xd9,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12,0x5a,0xf4,0xb, 0x6a, +0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d,0x2d,0x7e,0x67,0x2a, +0x70,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, 0x90,0x12,0x5a,0xe1, +0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, 0x7a,0xb3,0x26,0xf6, +0x80,0x17,0x12,0x5a,0xea,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c,0xbd,0xd9,0x58,0x9, +0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12,0x59,0x78,0x38,0xab, +0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, 0x12,0x5a,0xd9,0x2d, +0x15,0x6c,0xaa,0x80,0x14,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0xb, 0x7a, +0x90,0xbd,0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x59,0x78,0x38,0xe7,0x7a,0xb7, +0x8, 0x4, 0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, +0x7d,0x32,0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x93,0x74,0x2, 0xa4, +0x22,0x7e,0x74,0x62,0x27,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d, +0x7f,0x7d,0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b, +0x7f,0x31,0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2f,0x7e,0xd, 0x24,0x7f,0x13, +0x12,0x5d,0xd4,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x5a,0xd9,0x7e,0xd, 0x24,0x2d, +0x15,0x7f,0x13,0x2d,0x35,0x12,0x5e,0x89,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x6e,0x1e, +0x34,0x7a,0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x5a,0xfe,0x7e, +0x37,0x28,0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e, +0x12,0x5a,0xfe,0x12,0x5b,0x6d,0x12,0x5b,0x99,0x2, 0x5b,0x5c,0xe4,0x7a,0xb3,0x39, +0xe0,0x7e,0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x39,0xe0,0x22,0xca,0x3b,0x7e, +0xf3,0x2a,0x8d,0x7e,0xe3,0x2a,0x8e,0x7e,0xd3,0x2a,0x8f,0x6c,0xcc,0x80,0x13,0x7c, +0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, 0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0x66,0x3f, +0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda,0x3b,0x22,0x7e,0x63,0x2a,0x8d,0xc2,0x16,0x6c, +0x33,0x80,0x48,0x7c,0x96,0xac,0x93,0x2e,0x44,0x0, 0x16,0x7d,0x4, 0xb, 0x4, 0x7d, +0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a,0x79, +0x8, 0x27,0x7c,0xb3,0x12,0x5b,0xfc,0x50,0x20,0x7d,0x50,0x3e,0x54,0x7e,0x7f,0x13, +0x8a,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x20,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, 0x7a, +0x50,0xbd,0x52,0x8, 0x4, 0xd2,0x16,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x94,0xbc, +0x73,0x38,0xb0,0x30,0x16,0x5, 0xd2,0x0, 0x2, 0x5c,0x18,0x22,0x7c,0xab,0x6c,0x77, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x57,0xdf,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xb, +0x70,0xbe,0x70,0x3, 0x40,0xea,0xc3,0x22,0x6c,0x33,0x6c,0x22,0x80,0x28,0x7c,0xb2, +0x12,0x5b,0xfc,0x50,0x1f,0x7c,0xb2,0x12,0x5d,0x61,0x3e,0x34,0x7e,0x7f,0x13,0x8a, +0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x5d,0xa0,0x59,0x35,0x39,0xbb,0x30,0x0, 0x5, 0x6d, +0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x94,0xbc,0x72,0x38,0xd0,0x22,0xca, +0x79,0x7c,0x5b,0x7e,0x43,0x28,0x84,0xbe,0x40,0x1, 0x28,0x2, 0xa1,0x5e,0x7e,0xa3, +0x2a,0x8d,0x7e,0x70,0x2, 0xac,0x75,0x9, 0xf3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7c, +0xbf,0x7c,0x7e,0x12,0x4c,0x21,0x7f,0x51,0x7c,0x1e,0x7c,0x3f,0x7e,0x3, 0x2a,0x8f, +0x7e,0x23,0x2a,0x8e,0xa, 0x3a,0x6d,0xdd,0x9d,0xd3,0xa, 0x9a,0xa, 0xc0,0x1b,0xc5, +0xa, 0x51,0xbd,0x5c,0x58,0x2, 0xa1,0x5e,0xa, 0x53,0x1b,0x54,0xbe,0x54,0x0, 0x0, +0x48,0x55,0x7c,0xb3,0x14,0x12,0x5b,0xfc,0x50,0x4d,0x7c,0xb3,0x14,0x12,0x5d,0x61, +0x7d,0xe3,0x7d,0x5e,0x12,0x5d,0x6c,0xb, 0x1a,0xf0,0x7d,0x5d,0x3e,0x54,0x7f,0x15, +0x2d,0x35,0xb, 0x1a,0x80,0xbe,0xf4,0x0, 0x0, 0x8, 0x11,0x9d,0x8f,0xbe,0x84,0x0, +0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x58,0x1b,0x1a,0x50,0x7c,0xb0,0x24,0xfe, +0xbc,0xb1,0x78,0x13,0x7d,0x4e,0x1b,0x44,0x7d,0x54,0x12,0x5d,0x6c,0xb, 0x1a,0x50, +0xbd,0x58,0x8, 0x3, 0x1b,0x1a,0x80,0xa, 0x83,0xb, 0x84,0xa, 0x52,0xbd,0x85,0x58, +0x5d,0x7c,0xb3,0x4, 0x12,0x5b,0xfc,0x50,0x55,0x7c,0xb3,0x4, 0x12,0x5d,0x61,0x7d, +0xe3,0x7d,0x1e,0x3e,0x14,0x7e,0x1f,0x13,0x8a,0x7f,0x61,0x2d,0xd1,0xb, 0x6a,0xf0, +0x7d,0x19,0x3e,0x14,0x7f,0x65,0x2d,0xd1,0xb, 0x6a,0x10,0xbe,0xf4,0x0, 0x0, 0x8, +0x11,0x9d,0x1f,0xbe,0x14,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x51,0x1b, +0x6a,0x50,0x7c,0xb0,0x24,0xfe,0xbc,0xb1,0x78,0x14,0x7d,0x4e,0x1b,0x44,0x7d,0x4, +0x3e,0x4, 0x2d,0x30,0xb, 0x1a,0x0, 0xbd,0x1, 0x8, 0x3, 0x1b,0x1a,0x10,0xda,0x79, +0x22,0x7e,0x73,0x2a,0x8d,0xac,0x7b,0x2e,0x34,0x0, 0x17,0x22,0x3e,0x54,0x7e,0x1f, +0x13,0x8a,0x2d,0x35,0x22,0x6c,0x33,0x6c,0x22,0x80,0x1c,0x7c,0xb2,0x12,0x5b,0xfc, +0x50,0x13,0x7c,0xb2,0x12,0x5d,0x61,0x7d,0x3, 0x12,0x5d,0xa0,0x49,0x55,0x39,0xbb, +0x7d,0x40,0x12,0x5f,0xc0,0xb, 0x20,0x7e,0x73,0x2a,0x94,0xbc,0x72,0x38,0xdc,0x22, +0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x80,0x1f,0x7c,0xb3,0x12,0x5b, +0xfc,0x40,0x16,0x7c,0xb3,0x12,0x5d,0x61,0x7d,0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, +0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x1b,0x1a,0x50,0xb, 0x30,0x7e,0x23,0x2a,0x94,0xbc, +0x23,0x38,0xd9,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x8d,0xa, 0x37, +0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x17,0x2e,0x1b,0xfd,0x6c,0xdd,0x12, +0x5f,0x79,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x45,0x12,0x5e,0x78,0x78,0x3e,0x12, +0x5f,0x81,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x17,0x85,0x7d,0x13,0x7d,0x3e,0x12,0x17, +0x85,0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5,0x2f,0x8, 0x5, 0x7e,0xe5,0x2f,0x80, +0xb, 0x6d,0x33,0x9e,0x35,0x2f,0xbd,0x3e,0x8, 0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26, +0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, 0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e, +0x73,0x2a,0x8f,0xbc,0x7c,0x38,0xb3,0x7e,0x73,0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12, +0x5f,0x9f,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80,0xa, 0x12,0x5e,0x78,0x78,0x3, 0x12, +0x5f,0x8a,0xb, 0xc0,0x7e,0x73,0x2a,0x8f,0xbc,0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0, +0x2, 0x50,0x2, 0xa1,0xef,0xda,0x3b,0x22,0xa, 0xec,0x9, 0x7e,0x2a,0xfb,0xa, 0x37, +0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e, +0x14,0x19,0x4a,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x7a,0x1d, +0x2c,0x7e,0x73,0x2a,0x8c,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12, +0x17,0x2e,0x1b,0xfd,0x6c,0xdd,0x12,0x5f,0x79,0x7a,0xb3,0x1f,0x34,0x6c,0xcc,0x80, +0x4a,0x12,0x5f,0x69,0x40,0x43,0x12,0x5f,0x5f,0x50,0x3e,0x12,0x5f,0x81,0xb, 0x1a, +0x10,0x7d,0x3f,0x12,0x17,0x85,0x7d,0x3, 0x7d,0x31,0x12,0x17,0x85,0xbd,0x30,0x58, +0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e,0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e, +0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d,0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41, +0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34,0xb, 0xc0,0x12,0x5f,0x58,0x38,0xb1, +0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12,0x5f,0x9f,0x8, 0x2, 0x7d,0x7f,0xbe, +0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, 0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7, +0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12,0x5f,0x69,0x40,0x8, 0x12,0x5f,0x5f, +0x50,0x3, 0x12,0x5f,0x8a,0xb, 0xc0,0x12,0x5f,0x58,0x38,0xec,0xb, 0xd0,0xbe,0xd0, +0x3, 0x50,0x2, 0xc1,0xb6,0xda,0x3b,0x22,0x7e,0x73,0x2a,0x8e,0xbc,0x7c,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xd8,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4, +0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16, +0x2d,0x35,0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, +0x17,0x6d,0x0, 0x7f,0x14,0x12,0x15,0xc8,0x7d,0x73,0x12,0x17,0x85,0x7d,0xe3,0x7d, +0x3f,0x12,0x17,0x85,0xbd,0x3e,0x22,0x30,0x16,0x5, 0x12,0x5d,0x75,0xc2,0x16,0x22, +0x3e,0x44,0x7e,0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0x22,0x7c,0xab,0x7c,0xb7, +0xb4,0x17,0x9, 0x7c,0xba,0x12,0x5b,0xfc,0x50,0x2, 0xd3,0x22,0xc3,0x22,0xa9,0xc5, +0xca,0xe4,0x7a,0xb3,0x39,0xe4,0x22,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0x22,0x74,0x2, +0x7d,0x3f,0x2, 0x64,0xd3,0x74,0x6, 0x12,0x63,0x91,0x7d,0x3, 0x6c,0x11,0x22,0xff, +0x70,0x8f,0x0, 0xff,0x51,0xae,0x5a,0xa5,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x37,0x31,0x1, 0xc, 0x3b,0x34,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xb, 0xf4,0x43,0x33,0x42,0x5f,0x57,0x68,0x69,0x74,0x65,0x5f,0x45,0x42,0x42,0x47, +0xd, 0x18,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0xf, 0xe, 0xd, 0xc, 0xb, 0xa, 0x9, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x14,0x13,0x12,0x11,0x10,0xf, 0x9, 0xa, 0xb, 0xc, 0xd, +0xe, 0x15,0x16,0x17,0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x38,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x4, 0x64,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x7f,0x40,0xd, 0x18,0x25,0x18,0x10,0x6, 0x80,0x18,0x10,0x6, +0x78,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x34,0x32,0x1, 0xfb,0x2, 0x28,0x0, +0xdf,0x0, 0xe3,0x5, 0x0, 0x37,0x37,0x1, 0xb8,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0xa0,0x1, 0x18,0x0, 0x8c,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, +0x68,0x6, 0x10,0x14,0x32,0x1, 0xf, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0xb, 0xf7,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15, +0x0, 0x3, 0x54,0x1, 0x0, 0xb, 0x1, 0x51,0x1, 0x14,0x0, 0x5a,0x1, 0x1, 0x12,0x0, +0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27,0x0, 0x1, 0x0, 0x2, 0x1, 0x4, 0x1, 0x90,0x0, +0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96,0x1, 0x2c,0x1, 0x2c,0x4, 0x38,0x2, 0x64,0x7f, +0x20,0x26,0x2, 0x31,0x47,0x20,0x34,0x2, 0x61,0x97,0x20,0x46,0x2, 0x49,0x70,0x30, +0x38,0x2, 0x64,0x7f,0x20,0x38,0x2, 0x64,0x7f,0x20,0x38,0x2, 0x64,0x7f,0x20,0x38, +0x2, 0x64,0x7f,0x20,0x4, 0x5, 0x10,0x11,0x12,0x13,0x14,0x4, 0x0, 0xd2,0x2, 0x30, +0x32,0x0, 0xc8,0x1, 0x5e,0x0, 0x64,0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, +0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c,0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20, +0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, 0x4, 0x4, 0x6, 0x40,0x1, 0x18,0x1, 0x18,0x1, +0x90,0x1, 0x90,0x1, 0x90,0x1, 0x5e,0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, +0x64,0x0, 0x46,0x0, 0x78,0x0, 0x78,0x0, 0x64,0x1, 0x18,0x1, 0x18,0x14,0x8, 0x0, +0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0,0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, +0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80,0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, +0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8,0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, +0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88,0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, +0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, 0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x54,0x0, 0x54, +0x7e,0x44,0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a, +0x1d,0x26,0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, +0x6, 0x12,0x63,0x28,0x74,0x2d,0x7a,0xb3,0x37,0xe8,0x74,0x28,0x7a,0xb3,0x37,0xe9, +0x74,0x11,0x7a,0xb3,0x37,0xea,0x7a,0xb3,0x37,0xeb,0x7a,0xb3,0x37,0xec,0x74,0xa0, +0x7a,0xb3,0x37,0xed,0x7e,0x34,0x0, 0x6a,0xca,0x39,0x7e,0x34,0x61,0x65,0x7e,0x24, +0x0, 0xff,0x7e,0x8, 0x37,0xee,0x12,0x17,0x2e,0x1b,0xfd,0xe5,0x25,0x7a,0xb3,0x38, +0x19,0xe5,0x28,0x7a,0xb3,0x38,0x8, 0x22,0x7d,0x42,0x7f,0x60,0x7d,0x3, 0x12,0x65, +0x4b,0x74,0x2, 0x12,0x63,0x91,0x7d,0xf3,0x4e,0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, +0x12,0x5f,0xee,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f,0x6, 0x12,0x64,0x6e,0x5e, +0xf4,0xff,0xfd,0x12,0x5f,0xee,0x2, 0x5f,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, +0x3a,0xe4,0x12,0x17,0x53,0x7e,0x8, 0x26,0x8c,0x7e,0x34,0x0, 0xc8,0x74,0xff,0x12, +0x17,0x53,0x7e,0x8, 0x26,0xb4,0x7e,0x34,0x0, 0xc8,0x12,0x17,0x53,0x90,0x60,0x9a, +0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x27,0x76,0x74,0xff,0x2, 0x17, +0x53,0x7c,0x6b,0x6c,0x77,0x6c,0xaa,0x7e,0xb3,0x39,0xe4,0xb4,0xa5,0x46,0x12,0x65, +0x2a,0x75,0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0x12,0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0x12, +0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc, +0x12,0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0x12,0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1, +0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0x7e,0x8, 0x28, +0xae,0x7e,0x34,0x1, 0xe, 0x74,0xff,0x12,0x17,0x53,0x12,0x67,0x52,0x7e,0x8, 0x29, +0xbc,0x12,0x65,0x5b,0x7e,0x8, 0x2a,0x20,0x7e,0x34,0x0, 0xb, 0xe4,0x2, 0x17,0x53, +0xca,0xf8,0x7e,0x73,0x2a,0x97,0xa, 0x47,0x7e,0x73,0x2a,0x90,0xa, 0x57,0x2d,0x54, +0x7e,0xa3,0x2a,0x92,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x91,0x7e,0xa3, +0x2a,0x93,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xd8,0x7e, +0x18,0x2a,0x99,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xfb,0x7e,0x18,0x2a, +0xbc,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7a,0xb3,0x2b,0x1f,0x70,0x5, 0x12, +0x36,0x1c,0x80,0x6, 0xb4,0x1, 0x6, 0x12,0x36,0x13,0x12,0x25,0xc5,0x22,0x12,0x64, +0x7c,0x7e,0x35,0x36,0x12,0xa5,0xd9,0xa9,0xd2,0xb4,0xd3,0x22,0x7d,0x52,0xf5,0x3a, +0x7c,0xb6,0x7c,0xa5,0xa, 0x44,0xf5,0x39,0x7f,0x21,0xf5,0x38,0xa9,0xc2,0xb4,0x74, +0xb, 0x12,0x64,0xa7,0xe5,0x3a,0x12,0x64,0xa7,0xe5,0x39,0x12,0x64,0xa7,0xe5,0x38, +0x12,0x64,0xa7,0xe4,0x2, 0x64,0xa7,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xd3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12,0x63,0x91,0x4c,0xff,0x78,0x5, 0x5e, +0x70,0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0x64,0xd3,0xda,0xf8,0x22,0x74, +0x6, 0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73,0x7d,0x52,0x7c,0xab,0x7e, +0xb3,0x39,0xe4,0xb4,0xa5,0x3c,0x12,0x65,0x2a,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc, +0x12,0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0x12,0x5f,0xe7,0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36, +0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9, +0xd2,0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0x64,0xd3,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3, +0x22,0xd2,0xc8,0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0, +0xb4,0x12,0x65,0x4b,0xe4,0x12,0x64,0xb2,0x2, 0x5f,0xde,0xa9,0xd5,0xca,0xa9,0xd1, +0xea,0xa9,0xc1,0xea,0x74,0xa5,0x7a,0xb3,0x39,0xe4,0x22,0x6c,0xaa,0x74,0x3, 0x12, +0x65,0xa0,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0xa, 0x12,0x65,0x96,0x7f,0x70,0x2d, +0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79,0x41,0x0, 0x28,0xe4,0xa, 0x4a,0x7f,0x10, +0x2d,0x34,0x39,0xb1,0x0, 0x46,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0x50,0xb, 0xa0, +0xbe,0xa0,0xa, 0x40,0xc8,0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a,0x22, +0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xb0,0x22,0xca,0xf8,0x7f,0x71,0x6d,0xdd, +0x6c,0xaa,0x7e,0xf0,0x7f,0xc2,0x0, 0x6d,0x44,0x80,0x1e,0x7d,0xc4,0x3e,0xc4,0x7f, +0x17,0x2d,0x3c,0x12,0x66,0x39,0xbd,0x3d,0x48,0xd, 0x7d,0x34,0x3e,0x34,0x2d,0x3f, +0x7d,0x2e,0x12,0x66,0x39,0x7d,0xd3,0xb, 0x44,0x7e,0xc5,0x34,0xbd,0xc4,0x38,0xdb, +0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba,0x7d,0x3d,0x60,0x5, 0xe, +0x34,0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f,0x10,0x2e,0x35,0x34,0x7a, +0x1b,0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f,0x17,0x2d,0x35,0xb, 0x1a, +0x30,0x7f,0x60,0x2e,0xd5,0x34,0x7e,0x6b,0xb0,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb, +0x7c,0xb7,0x12,0x65,0xa2,0xb, 0x44,0x7e,0x55,0x34,0xbd,0x54,0x38,0xd8,0xda,0xf8, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x17,0x85,0xca, +0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x0, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x19, +0x4e,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x16,0x1d,0x6d,0x11, +0x7e,0x4, 0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0x66,0x31,0x7d,0xc3,0xbd,0xdc,0x50, +0x2, 0x7d,0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe, +0xd4,0x0, 0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0xe1,0x3a,0xbe, +0xd4,0x4, 0xb0,0x8, 0x2, 0xd2,0x0, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f, +0x34,0xbd,0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, +0x40,0xe7,0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x80,0x7f,0xbd,0xd, 0x8, 0x5, 0x30, +0x0, 0x2, 0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0x66,0x31,0x1a,0x26,0x1a, +0x24,0x2f,0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0x67,0x48,0x9f,0x55, +0x6c,0xee,0x80,0x1d,0x12,0x67,0x3f,0xb, 0x1a,0x90,0x7d,0x39,0x12,0x17,0x85,0x7d, +0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51,0xb, 0xd0,0xb, +0xe0,0xbc,0xfe,0x38,0xdf,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, 0x1d,0x12,0x67, +0x48,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, 0xbd,0x1, 0x8, +0x2, 0x7d,0x10,0x6c,0xee,0x80,0xd, 0x12,0x67,0x3f,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b, +0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xef,0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x74, +0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x15,0xc8,0x7d, +0x13,0x22,0x7e,0x8, 0x35,0xaa,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x17,0x53,0x7c,0xab, +0x12,0x64,0x59,0x7c,0xba,0x12,0x13,0xc7,0x2, 0x0, 0x1e,0x7e,0xd7,0x2b,0x2c,0xbe, +0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12,0x67,0x5e,0x12,0x37,0xb9,0x7a,0xd7,0x2b,0x2c, +0x7e,0x73,0x2b,0x19,0xa, 0x37,0x3e,0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13, +0x1, 0x12,0x37,0xd1,0x74,0x1, 0x22,0x12,0x67,0xdf,0x38,0x2, 0xe4,0x22,0x12,0x67, +0xce,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x67,0x6b,0x2, 0x67,0xb0, +0xb4,0x3, 0x5, 0x12,0x67,0xc0,0x80,0x2, 0xe4,0x22,0x12,0x67,0xf3,0x74,0x1, 0x22, +0x12,0x67,0xd6,0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x8c,0x2, 0xd, 0x72,0x7e,0xa3, +0x34,0x39,0x74,0x4, 0xa4,0x22,0x74,0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7e,0x8, 0x2a,0x8c,0x12,0xd, 0x72,0xe4, +0x12,0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0x7f,0x60, +0x7e,0xa3,0x2a,0x8c,0x7e,0xb3,0x2a,0x8d,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d, +0x3f,0xe4,0x12,0x17,0x53,0x7f,0x6, 0x7d,0x3f,0x12,0x17,0x53,0x7a,0xb3,0x16,0x91, +0x22,0x7f,0x70,0x7e,0x33,0x2a,0x93,0xa, 0x43,0x7e,0x33,0x2a,0x92,0xa, 0x53,0x2d, +0x54,0x3e,0x54,0x7c,0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x17, +0x53,0x7f,0x7, 0xa, 0x3a,0x2, 0x17,0x53,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51, +0x7f,0x40,0x7f,0x15,0x12,0x68,0x21,0x12,0x6a,0x70,0x7e,0xe0,0x1, 0x12,0x37,0xd1, +0x30,0x1c,0xfd,0x74,0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x6a,0x60,0x6c,0xdd,0x80, +0x18,0x74,0x2, 0xac,0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd, +0x7f,0x5, 0x2d,0x15,0x12,0x6a,0x77,0xb, 0xd0,0x7e,0x73,0x2a,0x93,0xa, 0x7, 0x7e, +0x63,0x2a,0x92,0xa, 0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78, +0xbc,0x7f,0x5, 0x7c,0xbf,0x2e,0x73,0x2a,0x92,0x12,0x69,0x41,0xda,0x79,0xda,0xd8, +0x22,0x7e,0xb3,0x2b,0x21,0x70,0x41,0x12,0x6c,0x71,0x50,0xfb,0xe4,0x6c,0x77,0x6c, +0x66,0x12,0x68,0xf9,0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x91, +0x12,0x68,0x48,0x74,0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x68,0xf9,0x7e,0x8, +0x7, 0x7a,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x68,0x48,0x74,0x2, 0x7a, +0xb3,0x2b,0x21,0xe4,0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x25,0x96, +0x7c,0xba,0x12,0x13,0xc7,0x74,0xa, 0x12,0x3b,0x7e,0x7c,0xb9,0x12,0x0, 0x1e,0x2, +0x36,0xfe,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xfb,0x2e,0x34,0x16,0xe8, +0x12,0x6e,0x51,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x39,0x93, +0x2d,0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x93,0xbc,0x6a,0x38,0xd6, +0x22,0xca,0xd8,0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0xa8,0xbf,0x7c,0xeb,0x6c,0xdd, +0x80,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74, +0x4, 0x2f,0x11,0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x15,0x77,0x1b,0x6a,0x30, +0xb, 0xd0,0xbc,0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f, +0x40,0x7e,0xa3,0x2a,0x93,0xa, 0x3a,0x7e,0xa3,0x2a,0x92,0xa, 0x7a,0x2d,0x73,0x7e, +0xd, 0x29,0x7c,0x7f,0x12,0x69,0x41,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x29, +0x7f,0x4, 0x12,0x17,0x2e,0x1b,0xfd,0x7e,0xb3,0x2b,0x20,0xb4,0x1, 0x22,0x6c,0xaa, +0x80,0x1a,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, +0x2d,0x13,0xb, 0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2, +0xda,0x79,0x22,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, 0x74,0x1, 0x7a,0xb3,0x2b,0x19, +0x12,0x1b,0xc3,0x7c,0xe7,0x80,0x5f,0x12,0x3f,0xcf,0x12,0x37,0xc0,0x30,0x1c,0xfd, +0x12,0x6f,0xd9,0x12,0x6a,0x60,0x6c,0xdd,0x80,0x3d,0x7e,0x50,0x2, 0xac,0x5d,0x49, +0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, 0x1d,0x2e,0x17,0x2b,0x1d,0x7e, +0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19,0xb0,0x80,0x18,0xbe,0x34,0x19, +0x28,0x28,0x10,0xa, 0x3d,0x12,0x26,0xfe,0xbe,0xb0,0xff,0x68,0x8, 0x4, 0x7a,0x39, +0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x6a,0x53,0x2d,0x23,0xa, 0x3d,0xbd,0x32, +0x48,0xb8,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa,0x78,0x99,0xda,0x79, +0xda,0xd8,0x22,0x7e,0x73,0x2a,0x93,0xa, 0x37,0x7e,0x53,0x2a,0x92,0xa, 0x25,0x22, +0x7e,0xb3,0x2a,0x92,0x7e,0x73,0x2a,0x93,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e, +0x7e,0x8, 0x2a,0x8c,0x2, 0x0, 0x2e,0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x29,0x7f,0x30,0x12, +0x6e,0x41,0x7a,0x55,0x31,0x7e,0xb3,0x2b,0x3c,0xf5,0x2e,0xe4,0x7a,0xb3,0x2b,0x3c, +0x7f,0x3, 0x7e,0x1d,0x29,0x12,0x67,0xfe,0x12,0x67,0xd6,0x12,0x27,0xf0,0x75,0x2d, +0x0, 0x12,0x67,0xef,0x30,0xf, 0xfd,0x74,0x1, 0x12,0x6f,0xd1,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6b,0x4, 0x12,0x6c,0x7c,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x2f,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x29,0x2d,0x13,0x12, +0x6a,0x77,0x7e,0x35,0x2f,0xb, 0x34,0x7a,0x35,0x2f,0x7e,0x35,0x31,0xbe,0x35,0x2f, +0x38,0xdc,0x5, 0x2d,0xe5,0x2d,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2e,0x7a,0xb3,0x2b, +0x3c,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x8c,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x38,0x7d, +0x71,0x7a,0x25,0x36,0x7a,0x35,0x34,0x12,0x27,0xfe,0x50,0x77,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x8d,0x12,0x6c,0x2a,0x12,0x6c,0x10,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x33,0x12,0x5f,0x58,0x38,0xea,0x6c,0xcc,0x80,0x53,0x7e,0xa3,0x2a,0x8d,0x7c,0x7a, +0x12,0x6c,0x2a,0x75,0x3a,0x0, 0x80,0x27,0x7e,0xb3,0x38,0xc9,0xbe,0xb1,0x3a,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x73,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x75,0x7e,0x71,0x3a,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3a,0x7e, +0xb3,0x2a,0x8f,0xbe,0xb1,0x3a,0x38,0xd0,0x7e,0x34,0x10,0x0, 0x74,0x2, 0xa4,0x59, +0x35,0x34,0x4e,0x12,0x6c,0x10,0x7e,0x34,0x34,0x50,0x12,0x6c,0x33,0xbc,0xdc,0x38, +0xa9,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x8f,0x7a,0x73,0x25,0xb7,0xe4, +0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a,0x77,0x25,0xba,0x7a,0x77, +0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x3e,0xa, 0x37,0x12,0xe, 0x37,0x7d, +0x37,0x12,0x72,0xf9,0x7e,0x35,0x38,0x7a,0x37,0x25,0xbe,0xe4,0x7a,0xb3,0x25,0xb8, +0x12,0x6c,0x21,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x3c,0x70,0xf, 0xe4,0x7a,0xb3, +0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80,0x16,0x74,0x1, 0x7a,0xb3, +0x25,0xb9,0x7e,0x35,0x34,0x7a,0x37,0x25,0xba,0x7e,0x35,0x36,0x7a,0x37,0x25,0xbc, +0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12,0xd, 0x7, 0xda,0x3b,0x22, +0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25,0xb6,0xe4,0x7a,0xb3,0x25, +0xb9,0x7e,0x73,0x2a,0x8d,0x7a,0x73,0x25,0xb7,0x22,0xac,0x7c,0x3e,0x34,0x7d,0xf7, +0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37,0x25,0xbc,0x7a,0x37,0x25, +0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22,0x7e,0xb3,0x2b,0x3d,0x70, +0x1f,0x12,0x3f,0xcf,0x12,0x6c,0x71,0x50,0xfb,0x12,0x6a,0x80,0x12,0x6f,0xe3,0x20, +0x13,0x3, 0x12,0x6c,0xc6,0x74,0x2, 0x7a,0xb3,0x2b,0x3d,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7e,0xa3,0x2a,0x8d, +0xa, 0x3a,0x3e,0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x17,0x53,0x90,0x60,0x93,0x93, +0xa, 0x3b,0x7e,0xb3,0x2a,0x90,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43, +0x6c,0x77,0x80,0x1d,0xa, 0x27,0x2d,0x24,0x12,0x6f,0x6b,0xb, 0xa, 0x0, 0x7e,0x30, +0x2, 0xac,0x37,0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, +0x70,0xbc,0xa7,0x38,0xdf,0x22,0xca,0x3b,0x7e,0xb3,0x2b,0x2e,0x7a,0xb3,0x1f,0x33, +0x7e,0xf3,0x2b,0x81,0x12,0x6e,0xb8,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc, +0x12,0x6e,0x38,0xf5,0x29,0x7e,0x73,0x2b,0x2e,0xbe,0x71,0x29,0x68,0x36,0x7e,0x70, +0x4, 0xac,0x7d,0xa, 0x2c,0x12,0x6e,0x4b,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, +0xe, 0x7e,0x14,0x2, 0xe0,0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2a, +0x7e,0x70,0x1d,0xac,0x7e,0x2e,0x34,0x38,0x5c,0x6d,0x22,0x7a,0x1f,0x38,0x58,0x7c, +0xbc,0x12,0x6d,0x45,0xb, 0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x81,0xbc, +0x7f,0x68,0x6, 0x7a,0xf3,0x2b,0x81,0xd2,0x10,0xd2,0x0, 0x7e,0xb3,0x1f,0x33,0x12, +0x22,0x1f,0xda,0x3b,0x22,0xca,0x3b,0x7a,0xd, 0x2e,0x7c,0xcb,0x7e,0xb3,0x2b,0x3c, +0xf5,0x32,0x7e,0xb3,0x2b,0x2e,0xf5,0x33,0x7e,0xd3,0x2b,0x33,0x7e,0xe3,0x2b,0x3e, +0x7e,0xf3,0x2b,0x3f,0x7e,0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, +0x24,0xf2,0x12,0x17,0x2e,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, +0x73,0x7e,0x8, 0x25,0x2a,0x12,0x17,0x2e,0x1b,0xfd,0x7c,0xbc,0x12,0x9b,0x97,0x74, +0x1, 0x7a,0xb3,0x2b,0x3c,0x74,0x5, 0xac,0xbc,0x12,0x27,0x55,0x74,0x5, 0xac,0xbc, +0x12,0x27,0x43,0x74,0x5, 0xac,0xbc,0x12,0x27,0x4c,0x74,0x5, 0xac,0xbc,0x9, 0x75, +0x26,0x37,0xbe,0x73,0x2b,0x81,0x68,0x6, 0x7a,0x73,0x2b,0x81,0xd2,0x10,0xc2,0x0, +0x12,0x6e,0x38,0x12,0x22,0x1f,0x12,0x67,0xe8,0x30,0xf, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x14,0x40,0x0, 0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, +0xc8,0x12,0x6b,0x4, 0x12,0x6e,0x41,0x7a,0x55,0x34,0x7e,0xd, 0x2e,0x7e,0x18,0xd, +0xc8,0x12,0x65,0xaa,0x12,0xa3,0x5e,0xe5,0x32,0x7a,0xb3,0x2b,0x3c,0xe5,0x33,0x7a, +0xb3,0x2b,0x2e,0x7a,0xd3,0x2b,0x33,0x7a,0xe3,0x2b,0x3e,0x7a,0xf3,0x2b,0x3f,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x17,0x2e, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x73, +0x12,0x17,0x2e,0x1b,0xfd,0xda,0x3b,0x22,0x74,0x5, 0xac,0xbc,0x9, 0xb5,0x26,0x33, +0x22,0x7e,0xa3,0x2a,0x8d,0x7e,0xb3,0x2a,0x8c,0xa4,0x22,0x2d,0x32,0x2e,0x34,0x17, +0x75,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7c,0x2b,0x7e,0xb3,0x1f,0x33, +0xbc,0x2b,0x68,0x4f,0x12,0x6e,0xb8,0x7c,0x3b,0x7c,0xb2,0x12,0x6e,0xb8,0x7c,0xab, +0xbe,0x30,0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, +0x2a,0x12,0x6e,0x4b,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad, +0x32,0x2e,0x34,0x16,0x93,0x6d,0x22,0x30,0x1a,0x3, 0x2, 0x6e,0xe5,0x7e,0xb3,0x2b, +0x3c,0xb4,0x1, 0xf, 0x12,0x6e,0x41,0x7a,0x55,0x29,0x7e,0x8, 0xd, 0xc8,0x74,0x1, +0x2, 0x6f,0x16,0x22,0x7e,0xb3,0x2b,0x2e,0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac, +0x57,0x9, 0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70, +0x4, 0x40,0xe9,0x74,0xff,0x22,0x7c,0xab,0x12,0x6f,0xc9,0xd2,0x1a,0x7c,0xba,0x12, +0x6e,0x5a,0xc2,0x1a,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b,0x7e,0x63, +0x2a,0x90,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x8d,0xa, 0x16,0xad,0x10,0x7d,0x21, +0x12,0x6f,0x6b,0xa, 0x26,0x7a,0x25,0x29,0x74,0x1d,0xac,0x7b,0x2e,0x34,0x38,0x5c, +0x6d,0x22,0xe4,0x2, 0x6f,0x16,0x7c,0xab,0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11, +0x12,0x6f,0x59,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb,0x12,0x6f,0x4d,0x2d,0xfe,0x80, +0xf, 0x12,0x6f,0x59,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb,0x12,0x6f,0x4d,0x9d,0xfe, +0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x29,0xbd,0xf4,0x38,0xd0,0x22,0x7d,0xf4,0x3e, +0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0, +0x1a,0xeb,0x7f,0x61,0x2e,0xd5,0x29,0x7e,0x6b,0xb0,0x22,0x3e,0x24,0x7e,0xf, 0x39, +0xac,0x2d,0x12,0x22,0x7e,0xb3,0x38,0xd, 0x70,0x2e,0x7e,0x73,0x37,0xf0,0xbe,0x70, +0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x38,0x38,0xb4,0x1, 0x3, 0x7e,0x70,0x6, 0xa, +0x37,0x2e,0x34,0xf, 0xf0,0x12,0x6e,0x51,0x7c,0xab,0xe5,0x61,0xa, 0x3b,0x2e,0x37, +0x39,0x56,0x7a,0x37,0x39,0x56,0x80,0xc, 0x7e,0xa3,0x37,0xf1,0xbe,0xa0,0x7f,0x28, +0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x6f,0xb9,0x75,0x61,0x0, 0x7a,0xb3,0x39,0xd8, +0xc2,0x1b,0x22,0x12,0x6c,0x71,0x50,0xfb,0x22,0xa9,0xd1,0xcb,0x74,0x1, 0x2, 0x0, +0xe, 0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, +0x6, 0xfc,0x22,0x12,0x27,0xfe,0x50,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22,0x12,0x92, +0x89,0x12,0x90,0x5b,0x2, 0x6f,0xe3,0x7e,0xa3,0x2f,0xc7,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x39,0x5, 0x40,0x39,0x7e,0x37,0x39,0x5, 0xb, 0x34,0x7a,0x37, +0x39,0x5, 0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x38,0x3b,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x39,0xce,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xd8,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x7e,0xa3,0x38,0xb3,0x7c,0xba,0x4, 0x7a,0xb3,0x38,0xb3,0x7a, +0xa3,0x37,0xf9,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0,0x82, +0x12,0x35,0x87,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b,0x32, +0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x38,0xb4,0xc4,0x54,0x7, 0xbe,0xb0, +0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, 0xb4,0x1, 0x7, 0x74, +0x1, 0x7a,0xb3,0x38,0xf, 0x22,0x74,0x1, 0x7a,0xb3,0x38,0xf, 0xe4,0x7a,0xb3,0x38, +0xb4,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba,0x12,0x70,0x77,0x80, +0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3,0x7c,0x7a,0x12,0x71, +0x1b,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xef,0x38,0x10,0x7c,0xb3,0x24, +0x80,0x7c,0x7a,0x12,0x70,0xed,0xa5,0xbb,0x8f,0x3, 0x75,0x19,0x1, 0xa5,0xbb,0xfc, +0x5, 0x7c,0xba,0x2, 0x3b,0x30,0x74,0x1, 0x7a,0xb3,0x34,0x4f,0x22,0x7c,0x6b,0x2e, +0x60,0xdd,0x68,0x26,0x2e,0x60,0xfd,0x68,0x21,0x1b,0x61,0x68,0x1d,0x1b,0x62,0x68, +0x19,0x1b,0x61,0x68,0x15,0x1b,0x60,0x68,0x11,0x2e,0x60,0xa, 0x78,0x4, 0x7a,0x73, +0x37,0xe7,0xa, 0x2b,0x19,0x72,0x37,0xe8,0xd2,0x11,0x22,0xbe,0xb0,0xeb,0x68,0x3, +0xb4,0xec,0x33,0x7e,0x27,0x39,0x7, 0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e, +0x24,0x0, 0x1, 0x7a,0x27,0x39,0x7, 0x15,0x1a,0x7e,0x27,0x39,0x7, 0xbe,0x24,0x0, +0x1, 0x78,0x10,0xa5,0xbf,0x9, 0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a, +0x37,0x39,0x7, 0x75,0x1a,0xea,0x22,0x7e,0xb3,0x39,0x9, 0x4, 0x7a,0xb3,0x39,0x9, +0xe5,0x19,0xb4,0x1, 0x8, 0xe4,0x7a,0xb3,0x39,0x9, 0x75,0x19,0x0, 0x7e,0x73,0x39, +0x9, 0x7a,0x73,0x37,0xf7,0x22,0x70,0x5, 0x7e,0xb3,0x38,0xb4,0x22,0xbe,0xb0,0x3, +0x38,0x15,0x75,0x1d,0x0, 0x30,0x12,0x6, 0x7e,0x18,0x33,0x15,0x80,0x4, 0x7e,0x18, +0x33,0x53,0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1d,0x0, 0xa, +0x1b,0x7e,0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68, +0x3, 0xb4,0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x39,0x5, 0x80,0x2, 0x15, +0x1a,0x2, 0x6f,0xf7,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x72,0xd, 0xbe, +0xb0,0x80,0x40,0xc, 0xbe,0xb0,0xef,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x37,0x68,0x22, +0xb4,0xfc,0x5, 0x7e,0xb3,0x38,0xf, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28, +0xa8,0x60,0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x37,0x77,0x60,0x3, 0x4e,0xa0,0x2, 0x7c, +0xba,0x22,0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0x2e,0x22,0x74,0xff,0x22,0xb4,0xeb,0x5, +0xe4,0x7a,0xb3,0x39,0xa, 0x7e,0x73,0x39,0xa, 0xa, 0x27,0x2e,0x24,0x0, 0x6, 0x12, +0x57,0xdf,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x39,0xa, 0xb4,0x3, 0xb, 0xe4,0x7a, +0xb3,0x39,0xa, 0x6d,0x33,0x7a,0x37,0x39,0x7, 0x75,0x1a,0xeb,0x7c,0xba,0x22,0xe4, +0x7a,0xb3,0x38,0xb4,0x7e,0x8, 0x33,0x15,0x12,0x72,0x8e,0x7e,0x8, 0x33,0x53,0x7e, +0x34,0x0, 0x3e,0x12,0x17,0x53,0x7e,0x18,0x33,0x15,0x7a,0x1d,0x14,0x12,0x72,0x70, +0x2, 0x72,0x63,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x38,0xb4,0xf5,0x91,0x22, +0x2, 0x72,0x73,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90,0xc2, +0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e,0x34, +0x0, 0x3e,0x74,0xff,0x2, 0x17,0x53,0x30,0x1c,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12, +0x13,0x2c,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x67,0xce,0x49,0x35,0x34,0x3b, +0x49,0x15,0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40, +0x15,0xbe,0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x92,0x7e, +0x73,0x2a,0x93,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12, +0x67,0xdf,0x28,0xe, 0x12,0x67,0x97,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, +0x80,0x2, 0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80, +0x3c,0x7c,0xb9,0x12,0x5d,0x61,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc, +0xb, 0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x3f,0xa, 0x98,0x6d,0x88,0x7f, +0x10,0x7f,0x4, 0x12,0x15,0x5b,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, +0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a, +0x94,0xbc,0x89,0x38,0xbc,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x20,0x4c,0xaa,0x78,0x11, +0x7e,0xb3,0x2a,0x21,0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x25,0x80, +0xb, 0xbe,0xa0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0x29,0x7e,0x34,0x0, 0x5a, +0xca,0x39,0x7e,0x18,0x28,0xae,0x7e,0x8, 0x29,0x8, 0x12,0x17,0x2e,0x1b,0xfd,0x6c, +0xff,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae,0x12,0x73,0xa8,0x74,0x9, 0xac,0xbf, +0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12,0x75,0x86,0x12,0x76,0x79,0xb, 0xf0, +0xbe,0xf0,0xa, 0x40,0xdc,0xda,0xf8,0x22,0x7d,0xd3,0x7e,0x44,0x2, 0xd0,0x7e,0xa3, +0x2a,0x8e,0x74,0x40,0xa4,0x7d,0xb5,0x1b,0xb4,0xbe,0xd4,0x0, 0x3f,0x38,0x29,0x7e, +0xe4,0x0, 0x3f,0x9d,0xed,0x7e,0xf4,0x1, 0xfb,0xad,0xef,0x7d,0x3f,0x7d,0x2e,0x12, +0x74,0x85,0x7f,0x71,0xbe,0x78,0x0, 0x34,0x40,0x4, 0x7e,0x78,0x0, 0x34,0x7e,0x18, +0x0, 0x34,0x9f,0x17,0x7f,0x71,0x81,0x77,0x7d,0xcb,0x9e,0xc4,0x0, 0x3f,0xbd,0xcd, +0x38,0x24,0x7d,0x5d,0x9d,0x5c,0x7e,0xf4,0x2, 0x28,0xad,0xf5,0x7d,0x3f,0x7d,0x2e, +0x12,0x74,0x85,0x7f,0x71,0xbe,0x78,0x0, 0x32,0x40,0x4, 0x7e,0x78,0x0, 0x31,0x12, +0x75,0x7d,0x2f,0x71,0x80,0x61,0x7d,0xcb,0xb, 0xc4,0x1e,0xc4,0x7d,0x5c,0x1b,0x54, +0xbd,0x5d,0x40,0xc, 0x7d,0xf5,0x9d,0xfd,0x6d,0xee,0x7e,0x14,0x0, 0xdf,0x80,0xa, +0x7d,0xfd,0x9d,0xfc,0x6d,0xee,0x7e,0x14,0x0, 0xe3,0x7f,0x17,0x12,0x15,0x6c,0x7f, +0x71,0x12,0x74,0x85,0x7f,0x71,0xbd,0x5d,0x7d,0x34,0x40,0xc, 0x1e,0x34,0x1b,0x34, +0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d,0x22,0x2f,0x71,0xbe,0x78, +0x0, 0x34,0x50,0x6, 0x7e,0x78,0x0, 0x34,0x80,0xd, 0x12,0x75,0x7d,0x7d,0x13,0x6d, +0x0, 0xbf,0x70,0x28,0x2, 0x7f,0x71,0x7d,0x3f,0x22,0x9d,0x32,0x12,0x17,0x85,0x7d, +0x13,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5, +0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12,0x8c,0xa3,0x7d,0x3, 0x7e,0x70,0x9, +0xac,0x7e,0x49,0x13,0x28,0xb0,0xbe,0x14,0x2, 0x60,0x50,0x5, 0x12,0x75,0x72,0x40, +0xb, 0xbe,0x14,0x69,0xb0,0x28,0x1f,0x12,0x75,0x72,0x28,0x1a,0x3e,0x4, 0xbe,0x14, +0x2, 0x30,0x50,0x5, 0x12,0x75,0x72,0x40,0xb, 0xbe,0x14,0x69,0xe0,0x28,0x7, 0x12, +0x75,0x72,0x28,0x2, 0x3e,0x4, 0xbe,0x4, 0x1, 0x0, 0x28,0x4, 0x7e,0x4, 0x1, 0x0, +0x74,0x9, 0xac,0xbf,0x49,0x25,0x29,0x62,0x49,0x33,0x28,0xae,0x12,0x74,0x7a,0x7d, +0x13,0x5d,0x1e,0x7e,0x70,0x9, 0xac,0x7f,0x49,0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe, +0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d,0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f, +0x2d,0x21,0x1b,0x58,0x20,0x80,0xd, 0xbd,0xf1,0x40,0x9, 0x2e,0x34,0x29,0x62,0x9d, +0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe, +0x49,0x35,0x28,0xb0,0x12,0x74,0x7a,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f, +0x49,0x32,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, +0x7d,0x2, 0x2e,0x4, 0x29,0x64,0x2d,0x13,0x1b,0x8, 0x10,0x80,0x12,0xbd,0x31,0x40, +0xe, 0x7e,0x50,0x9, 0xac,0x5f,0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30,0xda, +0x79,0x22,0x74,0x9, 0xac,0xbf,0x49,0x25,0x29,0x64,0xbd,0x12,0x22,0x7d,0x34,0x6d, +0x22,0x9e,0x18,0x0, 0x32,0x22,0x7d,0xf3,0x9f,0x11,0x7e,0x44,0x5, 0x0, 0x7e,0xa3, +0x2a,0x8f,0x74,0x40,0xa4,0x7d,0xd5,0x1b,0xd4,0xbe,0xf4,0x0, 0x3f,0x38,0x1f,0x7e, +0x24,0x0, 0x3f,0x9d,0x2f,0x7e,0x34,0x1, 0xb8,0x12,0x76,0x5e,0xbe,0x18,0x0, 0x37, +0x40,0x4, 0x7e,0x18,0x0, 0x37,0x7e,0x8, 0x0, 0x37,0x9f,0x1, 0x7f,0x10,0x7d,0x5d, +0x9e,0x54,0x0, 0x3f,0xbd,0x5f,0x38,0x1f,0x12,0x76,0x70,0x40,0x1a,0x7d,0x3d,0x9e, +0x34,0x0, 0x40,0x12,0x76,0x56,0xbe,0x18,0x0, 0x37,0x40,0x4, 0x7e,0x18,0x0, 0x36, +0x12,0x76,0x67,0x2f,0x10,0x80,0x14,0x12,0x76,0x70,0x50,0xf, 0x7d,0x3d,0x9e,0x34, +0x0, 0x20,0x12,0x76,0x56,0x7d,0x14,0x6d,0x0, 0x2f,0x10,0xbe,0xf4,0x0, 0x3f,0x28, +0x54,0xbd,0x5f,0x28,0x50,0x7d,0xed,0xb, 0xe4,0x1e,0xe4,0x7d,0x5e,0x1b,0x54,0xbd, +0x5f,0x40,0x6, 0x7d,0x35,0x9d,0x3f,0x80,0x4, 0x7d,0x3f,0x9d,0x3e,0x6d,0x22,0x7e, +0x14,0x0, 0xe0,0x12,0x15,0x6c,0x12,0x76,0x60,0xbd,0x5f,0x7d,0x14,0x40,0xc, 0x1e, +0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, 0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f, +0x10,0xbe,0x18,0x0, 0x37,0x50,0x5, 0x7e,0x18,0x0, 0x37,0x22,0x12,0x76,0x67,0xbf, +0x10,0x28,0x2, 0x7f,0x10,0x22,0x7d,0x2f,0x9d,0x23,0x7e,0x34,0x1, 0xba,0xad,0x23, +0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7d,0x14,0x6d,0x0, 0x9e,0x8, 0x0, 0x37,0x22, +0x7d,0xed,0x9e,0xe4,0x0, 0xb, 0xbd,0xef,0x22,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29, +0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x44,0x5, 0x0, 0x6c,0xff,0x7e,0x70,0x9, 0xac, +0x7f,0x9, 0xe3,0x29,0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7d,0x24,0x2e,0x24, +0x0, 0x14,0xbd,0xc2,0x40,0x3f,0x49,0xd3,0x29,0x8, 0x7d,0x3d,0x12,0x77,0xcd,0x7c, +0xdb,0xbe,0xd0,0x3, 0x40,0xe, 0x7d,0x34,0x1b,0x34,0x12,0x76,0x79,0x7c,0xbe,0x12, +0x77,0x10,0x80,0x40,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x34,0x60,0xc5,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xd0,0x74,0x9, 0xac,0xbf,0x59,0xd5,0x29,0x8, 0x7e,0x34,0x7, 0xd0, +0x12,0x76,0x79,0x80,0x1f,0xbd,0xc4,0x40,0x1b,0x7d,0x54,0x2e,0x54,0x0, 0xa, 0xbd, +0xc5,0x40,0x5, 0x7c,0xbe,0x12,0x77,0x10,0x7d,0xc4,0x1b,0xc4,0x74,0x9, 0xac,0xbf, +0x59,0xc5,0x29,0xa, 0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0x81,0xda,0x79,0xda,0xd8,0x22, +0x7c,0xab,0x7e,0x8, 0x29,0xbc,0xbe,0xa0,0xa, 0x50,0x1f,0xa, 0x3a,0x7f,0x70,0x2d, +0xf3,0x7e,0x7b,0xb0,0xb4,0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0, +0x74,0x3, 0x2d,0x31,0x7d,0x20,0x39,0xb1,0x0, 0xa, 0x22,0x2, 0x74,0x8c,0xca,0x3b, +0x7c,0xfb,0x6c,0xee,0x80,0x6f,0x6c,0xdd,0x74,0x9, 0xac,0xbd,0x9, 0x45,0x29,0x66, +0x7e,0x70,0x9, 0xac,0x7e,0x9, 0x53,0x28,0xb2,0xbc,0x45,0x68,0x7, 0xb, 0xd0,0xbe, +0xd0,0xa, 0x40,0xe4,0xbe,0xd0,0xa, 0x50,0x50,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29, +0x66,0x49,0x25,0x29,0x64,0x49,0x33,0x28,0xb0,0x12,0x77,0xbc,0x74,0x9, 0xac,0xbd, +0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x12,0x77,0xc4,0x2d,0x31,0x7a,0x35,0x24, +0xa, 0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59, +0x35,0x35,0x94,0x59,0x35,0x35,0xb7,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c, +0x12,0x77,0x3b,0xb, 0xe0,0xbc,0xfe,0x38,0x8d,0xda,0x3b,0x22,0x9d,0x32,0x12,0x17, +0x85,0x7d,0x13,0x22,0x49,0x35,0x28,0xae,0x9d,0x32,0x2, 0x17,0x85,0x6c,0xaa,0x7e, +0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a, +0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14,0x60,0xb3,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xd4,0x7c,0xba,0x22,0x2, 0x78, +0x1, 0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x79,0x6c,0xee,0x80,0x35,0x7c,0xbe,0x12, +0x78,0x52,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x1e,0x96,0x60,0x23,0x7e,0xc4,0x0, +0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e,0x30, +0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x17,0x2e,0x1b,0xfd,0xb, 0xf0, +0xb, 0xe0,0x12,0x7d,0xfd,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x20,0xda, +0x79,0x22,0x7c,0xab,0x7e,0x70,0x2, 0xac,0x7a,0x12,0x7f,0xe, 0x2, 0x2c,0xb9,0xca, +0x79,0x6c,0x88,0x80,0x65,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x12,0x8f,0x13, +0x7c,0xbf,0x12,0x5f,0xcc,0x50,0x51,0x6c,0xee,0x80,0x48,0xbc,0xe8,0x68,0x42,0x7e, +0x70,0x2, 0xac,0x7e,0x12,0xaf,0xa1,0x6c,0x99,0x7e,0xb3,0x2a,0x8f,0x14,0xbe,0xb1, +0x26,0x78,0xe, 0xa, 0x2f,0xe5,0x25,0xa, 0x3b,0x12,0x4b,0x8c,0x18,0x3, 0x7e,0x90, +0x1, 0xbe,0x90,0x1, 0x78,0x1b,0x7c,0xbe,0x12,0x78,0x52,0x7d,0xf3,0x7c,0xb8,0x12, +0x78,0x52,0xbd,0x3f,0x8, 0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x54, +0xcd,0xb, 0xe0,0x12,0x7d,0xfd,0x38,0xb3,0xb, 0x80,0x12,0x7f,0x7, 0x38,0x96,0xda, +0x79,0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x8d,0x7e,0x47,0x28,0x99,0xe4,0x7a, +0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73,0x28,0x85, +0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2, +0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, 0xfc,0x6d, +0x22,0x9e,0x27,0x2a,0x72,0xbd,0x12,0x58,0x19,0x12,0x7b,0x9c,0x49,0x12,0x4, 0xfc, +0x6d,0x22,0x9e,0x27,0x2a,0x70,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa6, +0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e,0xb3,0x26, +0x83,0x70,0x40,0x12,0x79,0xee,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50,0x2, 0xac, +0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x7b,0x9c,0x49,0x2, 0x5, 0x7a, +0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49,0x20,0x5, +0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, 0xf0,0xbc, +0x7f,0x38,0xc9,0x12,0x99,0xca,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28,0x88,0x2e, +0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x74, +0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x79,0xe4,0x49,0x25,0x25,0xf7, +0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x17,0x85,0xbe,0x37,0x28,0x9d,0x8, 0x7, 0xe4, +0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x56,0xb5,0x38,0xdc,0x6c,0xff,0x80, +0x9, 0x12,0x79,0xe4,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x56,0xb5,0x38,0xf2,0xda, +0x79,0xda,0xd8,0x22,0x7c,0xbf,0x12,0x78,0x52,0x74,0x2, 0xac,0xbf,0x22,0x7e,0x73, +0x28,0x84,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x7e,0xb3,0x2f,0xc8,0xbe, +0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xc8,0x12,0xaf,0x90,0x7e,0x44,0x1, 0x18, +0x7e,0xd4,0x0, 0xb4,0xe4,0x7a,0xb3,0x28,0xac,0x12,0x7b,0x92,0x7e,0xc4,0xfe,0x5c, +0x7e,0x57,0x7, 0xfe,0xbe,0x54,0xfc,0xb8,0x58,0x15,0x7e,0x57,0x7, 0xfc,0xbd,0x5c, +0x58,0xd, 0x12,0x7b,0xa5,0x8, 0x8, 0x12,0x7c,0xa4,0x60,0x3, 0x12,0x7b,0xc7,0x12, +0x7c,0xa4,0xa, 0x5b,0x4d,0x55,0x68,0x3b,0x6d,0x55,0x9d,0x54,0xbe,0x57,0x7, 0xfe, +0x18,0x6, 0xbe,0x57,0x7, 0xfc,0x8, 0x2b,0x12,0x7b,0xa5,0x8, 0x26,0x7e,0x37,0x28, +0x8e,0x12,0x17,0x85,0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x79,0xee,0x28,0x14,0x7e, +0x73,0x28,0x85,0xbe,0x70,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xc4,0x58,0x3, +0x12,0x7b,0xc7,0x12,0x92,0xc8,0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x57,0xc2, +0x68,0x6, 0x7e,0xb3,0x39,0xdd,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x71,0x12, +0x79,0xee,0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x14,0x5, 0xe4,0x7a,0xb3,0x28, +0xad,0x12,0x93,0x6, 0x50,0xa, 0x12,0x7b,0x92,0x12,0x7c,0x41,0x7c,0xfb,0x80,0x21, +0x7e,0xb3,0x26,0x84,0x70,0x1b,0x7e,0xb3,0x26,0x85,0x70,0x15,0x12,0x79,0xee,0x28, +0x10,0x12,0x57,0xc2,0x68,0x5, 0x12,0x98,0xfa,0x60,0x6, 0x7e,0xf0,0x3, 0x12,0x7b, +0x92,0x7e,0xc7,0x7, 0xfa,0xbe,0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x79,0xee,0x28,0x12, +0x6d,0xcc,0x9d,0xcd,0xbe,0xc7,0x28,0x8e,0x58,0x8, 0x12,0x7b,0xb0,0xe4,0x7a,0xb3, +0x28,0xad,0xa, 0xcf,0x7a,0xc7,0x28,0xa1,0x74,0x2, 0xac,0xbf,0x7a,0x57,0x28,0xa3, +0x12,0x7b,0x99,0x50,0xd, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x79,0xee,0x28,0x3, 0x12, +0x7b,0xb0,0x7e,0xc7,0x28,0x8a,0xbd,0xcd,0x8, 0x1f,0x7e,0x24,0x0, 0x2, 0x7d,0x3d, +0x12,0x15,0x29,0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28,0x8e,0x58,0xa, 0x12, +0x7b,0x99,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x7d,0x13,0xb4,0x1, 0x5, 0xe4, +0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4,0x7a,0xb3,0x28,0x84, +0x7a,0xb3,0x2a,0x20,0x12,0x92,0x30,0x7e,0xb3,0x2f,0xc9,0xbe,0xb0,0x0, 0x28,0x1f, +0x14,0x7a,0xb3,0x2f,0xc9,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad,0x12,0x7e,0x4, 0x7a, +0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x26,0x83,0xda, +0xf8,0x22,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x22,0xa2,0x17,0x22,0xa, 0x1d,0xa, 0x2a, +0x2d,0x21,0x3e,0x24,0x22,0x6d,0x55,0x9e,0x57,0x2a,0x79,0xbe,0x57,0x28,0x8e,0x22, +0xe4,0x7a,0xb3,0x2f,0xc9,0x7a,0xb3,0x28,0xac,0x74,0x2, 0x2, 0x7b,0xbe,0x7a,0xb3, +0x2b,0x21,0x7a,0xb3,0x2b,0x3d,0x22,0x74,0x2, 0x7a,0xb3,0x2f,0xc9,0xe4,0x7a,0xb3, +0x2f,0xc8,0x12,0x7e,0x4, 0x2, 0x7b,0xbe,0x12,0x78,0xd2,0x12,0x79,0xf6,0x12,0x7c, +0x24,0x7e,0xb3,0x38,0xd, 0xb4,0x1, 0x10,0x7e,0x34,0x0, 0x5, 0x7a,0x37,0x28,0xa1, +0x7e,0x34,0x0, 0xa, 0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39,0xe2,0x60,0x7, 0x14,0x7a, +0xb3,0x39,0xe2,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, 0x12,0x6f,0xee,0x12,0x7e, +0xc, 0x12,0xa3,0xad,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12,0xa9,0xa0,0x12,0xa9,0x4f, +0x2, 0x96,0xd, 0x22,0x12,0x98,0xfa,0x60,0x17,0x12,0x7b,0x92,0x7e,0x37,0x28,0xa1, +0x3e,0x34,0x7a,0x37,0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3, +0x22,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x7e,0x4, 0x1, 0x18,0xbe,0x44,0xfc,0xb8, +0x58,0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x38,0x7e, +0xa0,0x5, 0x80,0x33,0x7e,0x34,0xff,0xfb,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x7c, +0x9c,0x8, 0x5, 0x7e,0xa0,0x4, 0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x7c,0x9a,0x8, +0x5, 0x7e,0xa0,0x3, 0x80,0x11,0x7e,0x34,0xff,0xfd,0x12,0x7c,0x9a,0x8, 0x5, 0x7e, +0xa0,0x2, 0x80,0x3, 0x7e,0xa0,0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x15, +0x29,0xbd,0x34,0x22,0x6c,0x66,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26, +0xf2,0xbe,0x70,0x0, 0x28,0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6, +0x7e,0xb3,0x2a,0x8d,0x14,0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c, +0x73,0x12,0x5f,0xcc,0x50,0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x8d,0xa, 0x7, 0x2d,0x2, +0x3e,0x4, 0x49,0x20,0x4, 0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x6e,0xbd,0x20,0x58,0x2, +0xb, 0x60,0xb, 0x20,0x7e,0x73,0x2a,0x8c,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa, +0x74,0x1, 0x22,0xca,0x3b,0x12,0x8f,0x82,0x38,0x2, 0xa1,0xda,0x7e,0xc3,0x2f,0xcc, +0x4c,0xcc,0x78,0x3d,0x7a,0xb3,0x2f,0xcc,0xe4,0x7a,0xb3,0x2f,0xce,0x6c,0xaa,0x80, +0x26,0x12,0x7d,0xe5,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26, +0xfb,0x7a,0x49,0xd0,0x19,0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x2f, +0x86,0x59,0x34,0x0, 0x2, 0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80, +0x7f,0x7c,0xfc,0x6c,0xaa,0x80,0x35,0x12,0x7d,0xe5,0x7e,0x49,0xd0,0x9, 0xe4,0x0, +0x1, 0x9, 0xb4,0x0, 0x8, 0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x2f,0x86,0x7d,0x23, +0x49,0x34,0x0, 0x2, 0x9d,0x32,0x12,0x17,0x85,0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, +0x9, 0x74,0x5, 0x19,0xb4,0x0, 0x8, 0x75,0x60,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7, +0x4c,0xff,0x78,0x2, 0x80,0x26,0x7e,0x73,0x2f,0xce,0xbe,0x70,0x4, 0x40,0x22,0x6c, +0xaa,0x80,0xe, 0x12,0x7d,0xe5,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, +0xa0,0xbc,0xfa,0x38,0xee,0xbc,0xfa,0x78,0x3, 0x75,0x60,0x0, 0x12,0x7d,0xef,0x80, +0xf, 0x7c,0xb7,0x4, 0x7a,0xb3,0x2f,0xce,0x80,0x6, 0x12,0x7d,0xef,0x75,0x60,0x0, +0xe5,0x60,0xda,0x3b,0x22,0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xcf,0x22,0xe4, +0x7a,0xb3,0x2f,0xcd,0x7a,0xb3,0x2f,0xcc,0x7a,0xb3,0x2f,0xce,0x22,0x7e,0x73,0x28, +0x84,0xbc,0x7e,0x22,0x74,0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x12,0x97,0xd2,0x6d, +0x33,0x7a,0x37,0x37,0xe3,0x6c,0xaa,0x12,0x96,0x59,0xb, 0xa0,0xbe,0xa0,0x4, 0x40, +0xf6,0xe4,0x7a,0xb3,0x37,0x78,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0xa2, +0x71,0x7f,0x71,0x7c,0xbf,0x12,0x78,0x52,0x7d,0x13,0x1a,0x2, 0x1a,0x0, 0x7f,0x17, +0x12,0x15,0xc8,0x7c,0xb7,0xda,0xf8,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8, +0x12,0x78,0x52,0xbe,0x34,0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x12,0x7f,0x7, +0x38,0xec,0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0xd8,0xca,0x79,0x7e, +0xf4,0x3, 0x20,0x7d,0x7f,0x12,0x7e,0x48,0x50,0x2, 0xe1,0x2, 0x7a,0xf5,0x2a,0x7e, +0xb3,0x28,0xa8,0xb4,0x1, 0x4, 0x7e,0x74,0x4, 0xb0,0x7e,0x37,0x28,0x8a,0xbe,0x34, +0x4, 0x4c,0x8, 0x6e,0x6c,0xdd,0x80,0x62,0xc2,0x0, 0x7c,0xbd,0x12,0x78,0x52,0x7a, +0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0xa2,0x71,0x7a,0x35,0x24,0x9e,0x35,0x26, +0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0x7b,0x7a,0x35,0x28, +0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, 0xa, +0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x0, 0x7c,0xbd,0x12,0xa3,0x3c,0x50, +0x2, 0xc2,0x0, 0x30,0x0, 0x12,0x7c,0xbd,0x6c,0x77,0x12,0x54,0xcd,0x7e,0x70,0x2, +0xac,0x7d,0x12,0x7f,0xe, 0x12,0x80,0x6e,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d, +0x38,0x96,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x78,0x22,0x9, 0xb3, +0x26,0xfa,0x9, 0x73,0x26,0xfb,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x93,0xf5,0x27,0x12, +0x7b,0x99,0x50,0x2, 0xe1,0xa7,0x6d,0x33,0x9e,0x37,0x2a,0x6e,0x3e,0x34,0xbe,0x37, +0x7, 0xf8,0x18,0x73,0x7e,0xb3,0x16,0x92,0x70,0x6d,0x7e,0xb3,0x28,0xa8,0xb4,0x1, +0x63,0x7e,0x77,0x2a,0x70,0x7e,0x67,0x2a,0x72,0x75,0x24,0x0, 0x80,0x51,0xe5,0x24, +0x12,0x1e,0x96,0x60,0x48,0x12,0x7f,0xaa,0x12,0xaf,0xa1,0x7e,0xb3,0x2a,0x21,0xb4, +0x1, 0x9, 0xe5,0x26,0xb4,0x17,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26,0x74,0x2, +0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0x14,0xe5,0x25,0xa, 0x2b,0xe5,0x27,0xa, +0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33,0x4, 0xfc,0xbd,0x37,0x58,0x10,0xe5,0x24,0x6c, +0x77,0x12,0x54,0xcd,0x12,0x7f,0xaa,0x12,0x7f,0xe, 0x12,0x80,0x6e,0x5, 0x24,0x12, +0xb0,0x1f,0x38,0xaa,0x12,0x8f,0x32,0xda,0x3b,0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0x12,0x8f,0x1b,0x12,0x8e,0x65,0x12,0x7f,0x17,0x12,0x7e,0x6b,0x2, 0x7f, +0xc1,0xca,0x3b,0x12,0x1e,0x4d,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x36,0xe8, +0x60,0x9, 0xe4,0x7a,0xb3,0x36,0xea,0x7a,0xb3,0x36,0x6f,0x7e,0xb3,0x36,0xe8,0x70, +0x62,0x6c,0x99,0x80,0x56,0x74,0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26, +0xfb,0x7c,0xb9,0x12,0xa3,0x3c,0x40,0x41,0x6c,0xee,0x80,0x35,0x74,0x2, 0xac,0xbe, +0x9, 0xd5,0x36,0x70,0x9, 0xc5,0x36,0x71,0xa, 0x28,0xa, 0x3d,0x12,0x80,0x66,0x78, +0x1e,0xa, 0x2f,0xa, 0x3c,0x12,0x80,0x66,0x78,0x15,0x7c,0xb9,0x12,0x78,0x52,0xbe, +0x34,0x3, 0x20,0x58,0xa, 0x12,0x57,0xbb,0x7c,0xb8,0x7c,0x7f,0x12,0x80,0x6e,0xb, +0xe0,0x7e,0x73,0x36,0xea,0xbc,0x7e,0x38,0xc3,0xb, 0x90,0x7e,0x73,0x28,0x84,0xbc, +0x79,0x38,0xa2,0x7e,0x73,0x36,0x6f,0x7a,0x73,0x36,0xea,0xa, 0x37,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x36,0xac,0x7e,0x8, 0x36,0x70,0x12,0x17,0x2e,0x1b,0xfd,0xe4,0x7a, +0xb3,0x36,0xe8,0xda,0x3b,0x22,0x9d,0x32,0x12,0x17,0x85,0x4d,0x33,0x22,0x7c,0x6b, +0x7e,0xa3,0x36,0x6f,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x62,0x36,0xac,0x19,0x72,0x36, +0xad,0x7c,0xba,0x4, 0x7a,0xb3,0x36,0x6f,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74, +0x6, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x15,0x75,0x7d,0x53,0xbe,0x54,0x0, +0xff,0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0xca,0xf8,0x7e,0xf3,0x2a,0x8f,0x7a,0x37, +0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3,0x1f,0x34,0x7a, +0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x8e,0x7a,0x73,0x1f,0x36,0x7a,0xf3,0x1f,0x37,0x7a, +0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x80,0xfd,0x6d,0x22, +0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f,0x36,0x6d,0x0, +0x12,0x15,0x77,0xa, 0x1f,0x6d,0x0, 0x12,0x15,0x77,0xda,0xf8,0x22,0x12,0xc, 0x29, +0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8,0x7a,0x37,0x1f, +0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x8e,0x7a,0x73,0x1f, +0x35,0x7e,0x73,0x2a,0x8f,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x7b,0x7a,0x37,0x1f, +0x3e,0x7e,0x37,0x2a,0x7d,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x7f,0x7a,0x37,0x1f, +0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, 0x1f,0x34,0x7e, +0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f,0x4a,0xbd,0x23, +0x28,0x2, 0x7d,0x32,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x82,0x8b,0x7e,0x1f, +0x39,0xc6,0x7a,0x1d,0x27,0x7e,0xb3,0x2a,0x93,0xf5,0x2e,0x7e,0xb3,0x39,0x59,0xb4, +0x1, 0x6, 0x7e,0x38,0x39,0x5b,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35, +0x2b,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x39,0x5a,0x70,0xe, 0x7e,0xb3,0x39,0x58, +0x70,0x8, 0x74,0x1, 0x7a,0xb3,0x39,0x5a,0x41,0x2a,0x7e,0xb3,0x39,0x5a,0x70,0x6, +0x74,0x1, 0x7a,0xb3,0x39,0x5a,0x7e,0xb3,0x39,0x59,0xb4,0x1, 0x14,0x75,0x2d,0x0, +0x80,0x6, 0x12,0x82,0x6c,0x12,0x82,0x7a,0xe5,0x2e,0xbe,0xb1,0x2d,0x38,0xf3,0x80, +0x18,0x75,0x2d,0x0, 0x80,0xc, 0x12,0x82,0x6c,0x3e,0x24,0x3e,0x24,0x1e,0x24,0x12, +0x82,0x7a,0xe5,0x2e,0xbe,0xb1,0x2d,0x38,0xed,0x7e,0x34,0x1, 0x18,0x7a,0x35,0x2f, +0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0x5d,0xd4,0x75,0x2d,0x0, 0x80,0x10,0x12,0x82, +0x5f,0xbe,0x35,0x2b,0x8, 0x6, 0x12,0x82,0x5f,0x7a,0x35,0x2b,0x5, 0x2d,0xe5,0x2e, +0xbe,0xb1,0x2d,0x38,0xe9,0x12,0x82,0x57,0x40,0x25,0x7e,0xb3,0x39,0x59,0xb4,0x1, +0x1e,0x5, 0x1e,0xe5,0x1e,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1e,0x0, 0xe5,0x2e,0xa, +0x3b,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x27,0x7f,0x3, 0x12,0x17,0x2e,0x1b,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x12,0x82,0x57,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x39,0xc5,0xe4, +0x7a,0xb3,0x39,0x5a,0xda,0x3b,0x22,0x7e,0x37,0x2b,0x26,0xbe,0x35,0x2b,0x22,0x7e, +0xa1,0x2d,0x74,0x2, 0xa4,0x49,0x35,0x1f,0x34,0x2, 0x17,0x85,0x7e,0xa1,0x2d,0x74, +0x2, 0xa4,0x7f,0x13,0x2d,0x35,0xb, 0x1a,0x20,0x22,0x7e,0xd, 0x27,0x2d,0x15,0xb, +0xa, 0x30,0x9d,0x32,0x59,0x35,0x1f,0x34,0x5, 0x2d,0x22,0x7e,0x34,0x0, 0x38,0xe4, +0x2, 0x17,0x53,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x34,0x7e,0xb3,0x38,0xc9, +0xf5,0x29,0x7e,0xb3,0x2a,0x8c,0xf5,0x2a,0x7e,0xb3,0x2a,0x8d,0xf5,0x2b,0x7e,0xb3, +0x2a,0x8f,0xf5,0x2c,0x7e,0xb3,0x2a,0x8e,0xf5,0x2d,0x7e,0x34,0x2a,0xf8,0x7a,0x35, +0x2e,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x30,0x12,0x67,0xe8,0x30,0xf, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x82,0x8b,0x6c,0xff,0x80,0x34,0x9f,0x77, +0x6c,0xee,0x80,0x19,0x7e,0x11,0x2b,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x3f, +0x2d,0x10,0x7e,0x1d,0x30,0x2d,0x31,0xb, 0x1a,0x30,0x12,0x85,0x7, 0xe5,0x2d,0xbc, +0xbe,0x38,0xe1,0xe5,0x2d,0x12,0x85,0xe, 0x74,0x2, 0xac,0xbf,0x59,0x35,0x34,0x0, +0xb, 0xf0,0xe5,0x2c,0xbc,0xbf,0x38,0xc6,0x7e,0x34,0x10,0x0, 0x7e,0xa1,0x2b,0x74, +0x2, 0xa4,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x72,0x9f,0x77,0x6c,0xee,0x80,0x12, +0x12,0x85,0x30,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x12, +0x85,0x7, 0xe5,0x29,0xbc,0xbe,0x38,0xe8,0xe5,0x29,0x12,0x85,0xe, 0x74,0x4, 0xac, +0xbf,0x59,0x35,0x3, 0x73,0xe5,0x29,0xbe,0xb1,0x2c,0x50,0x32,0x9f,0x77,0x7e,0xe1, +0x29,0x80,0x12,0x12,0x85,0x30,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14, +0x78,0xf4,0x12,0x85,0x7, 0xe5,0x2c,0xbc,0xbe,0x38,0xe8,0xe5,0x29,0xa, 0x3b,0x6d, +0x22,0xe5,0x2c,0xa, 0x1b,0x6d,0x0, 0x9f,0x1, 0x12,0x85,0x12,0x80,0x4, 0x7e,0x34, +0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x75,0xb, 0xf0,0xe5,0x2d,0xbc,0xbf, +0x38,0x88,0xe5,0x2c,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x15,0x77,0x6c, +0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e, +0x14,0x10,0x0, 0x9d,0x15,0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0x21,0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, +0xf0,0xe5,0x2c,0xbc,0xbf,0x38,0xcc,0xe5,0x2a,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, +0x28,0x12,0x15,0x77,0x6c,0xff,0x80,0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x73, +0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10,0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4, +0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac, +0xbf,0x59,0x25,0x3, 0x73,0xe5,0x29,0xbe,0xb1,0x2c,0x50,0x26,0x74,0x4, 0xac,0xbf, +0x49,0x25,0x3, 0x75,0x2e,0x14,0x10,0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, +0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25, +0x3, 0x75,0xb, 0xf0,0xe5,0x2a,0xbc,0xbf,0x38,0x9e,0x7e,0x73,0x38,0xcb,0xa, 0x37, +0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12, +0x15,0x75,0x7d,0xe3,0x7a,0xe5,0x34,0x7e,0x73,0x38,0xcc,0xa, 0x37,0x6d,0x22,0x74, +0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d,0x1f,0x12,0x15,0x75,0x7d,0x63,0x6c,0xff,0x80, +0x20,0x74,0x2, 0xac,0xbf,0x49,0x45,0x34,0x0, 0xbe,0x45,0x34,0x28,0x9, 0x7e,0x35, +0x34,0x59,0x35,0x34,0x0, 0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, +0xf0,0xe5,0x2c,0xbc,0xbf,0x38,0xda,0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49, +0x45,0x3, 0x73,0xbe,0x45,0x34,0x28,0x9, 0x7e,0x35,0x34,0x59,0x35,0x3, 0x73,0x80, +0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x73,0x49,0x45,0x3, 0x75,0xbe,0x45,0x34, +0x28,0x9, 0x7e,0x35,0x34,0x59,0x35,0x3, 0x75,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59, +0x65,0x3, 0x75,0xb, 0xf0,0xe5,0x2a,0xbc,0xbf,0x38,0xc0,0x30,0x2, 0x6, 0x7e,0xd, +0x30,0x12,0x27,0x70,0xda,0x3b,0x22,0x6d,0x22,0x2f,0x71,0xb, 0xe0,0x22,0xa, 0x1b, +0x6d,0x0, 0x7f,0x17,0x12,0x15,0x77,0x7f,0x71,0x7e,0x25,0x2e,0x74,0xc, 0x7d,0x13, +0x7d,0x32,0x6d,0x22,0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x15,0x75, +0x7e,0x11,0x2b,0xac,0x1f,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d, +0x30,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27,0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35, +0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x12,0x3e,0x1b,0x7e,0x73,0x37,0xe7,0xbe,0x70, +0xff,0x68,0x13,0xbe,0x73,0x38,0xd, 0x68,0xd, 0x7a,0x73,0x38,0xd, 0x74,0xff,0x7a, +0xb3,0x37,0xe7,0x2, 0x3e,0x1b,0x22,0x12,0x3f,0x3f,0x68,0xfb,0x20,0x93,0xfd,0x22, +0x7e,0x34,0x0, 0x46,0x22,0x7e,0xb3,0x39,0x59,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4, +0x7a,0xb3,0x39,0x59,0x22,0x7f,0x20,0xc2,0x1, 0x7e,0x2b,0x60,0x29,0x72,0x0, 0x2, +0x9c,0x76,0x1a,0x37,0x12,0x17,0x85,0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32,0x0, +0x3, 0x9c,0x37,0x1a,0x33,0x12,0x17,0x85,0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d,0x32, +0x12,0x17,0x85,0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60,0x5, +0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x39,0xb, 0x4d,0x33,0x68,0x2, 0xd2, +0x1, 0xa2,0x1, 0x22,0x7f,0x60,0x7e,0x6b,0xa0,0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14, +0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, 0x2d,0x15,0xb, 0x14,0x12,0x17,0x2e, +0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0,0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x8d, +0x7e,0x73,0x2a,0x8c,0xac,0x76,0x7d,0x13,0x1e,0x14,0x7e,0x27,0x28,0x88,0x2e,0x27, +0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e,0x34,0xbe,0x37,0x28,0x86,0x50,0x29, +0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd, +0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e,0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6, +0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, 0x7c,0xba,0x22,0x7e,0xa3,0x2a,0x21, +0xbe,0xa0,0x0, 0x38,0x2f,0xbe,0xa3,0x2a,0x20,0x50,0x19,0x7e,0xb3,0x2a,0x2a,0xbe, +0xb3,0x36,0x46,0x28,0x14,0x7e,0xb3,0x36,0x46,0x4, 0x7a,0xb3,0x36,0x46,0x7a,0xa3, +0x2a,0x20,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x46,0x7e,0xb3,0x2a,0x20,0x70,0x5, 0xe4, +0x7a,0xb3,0x2a,0x29,0x22,0x12,0x86,0x9b,0x2, 0x86,0x5c,0x7e,0xb3,0x2a,0x20,0x70, +0x29,0x12,0x86,0xd4,0x28,0x24,0x7e,0xb3,0x35,0xcb,0x70,0x18,0x12,0x86,0xdc,0x7e, +0x73,0x2a,0x21,0x7a,0x73,0x2a,0x20,0x74,0x1, 0x7a,0xb3,0x2a,0x27,0x7e,0xb3,0x35, +0xcb,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xcb,0x22,0xe4,0x7a,0xb3,0x35,0xcb,0x7a, +0xb3,0x2a,0x27,0x22,0x7e,0x73,0x2a,0x21,0xbe,0x70,0x0, 0x22,0x7e,0x34,0x0, 0x3c, +0xca,0x39,0x7e,0x18,0x36,0xef,0x7e,0x8, 0x37,0x2b,0x12,0x17,0x2e,0x1b,0xfd,0x7e, +0x73,0x28,0x94,0x7a,0x73,0x36,0xee,0x7a,0x73,0x28,0x93,0x22,0x12,0x86,0xd4,0x28, +0x8, 0x7e,0xb3,0x28,0x84,0x70,0x2, 0xf5,0x1b,0x7e,0xb3,0x28,0x84,0x70,0x18,0xe5, +0x1b,0xbe,0xb0,0xfa,0x50,0x2, 0x5, 0x1b,0xe5,0x1b,0xbe,0xb0,0x5, 0x40,0x8, 0xe4, +0x7a,0xb3,0x32,0x4c,0x75,0x1b,0xfa,0x22,0xca,0x3b,0x7e,0xe3,0x2a,0x20,0x4c,0xee, +0x78,0x20,0x6c,0xff,0x6d,0x11,0x74,0x2, 0xac,0xbf,0x12,0x88,0xd6,0xac,0x3f,0x19, +0xa1,0x35,0xd0,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x36,0x3a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xe2,0x12,0x8a,0x95,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0x2, 0x88,0xa7,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0, +0xf, 0xbe,0xd0,0xa, 0x40,0x3, 0x2, 0x88,0xa5,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe, +0xb0,0x1, 0x78,0x3, 0x2, 0x88,0x8e,0x75,0x24,0x0, 0x7e,0xa1,0x24,0x74,0x9, 0xa4, +0x9, 0xc5,0x35,0xd0,0xbc,0xcd,0x68,0x3, 0x2, 0x88,0x80,0x49,0x25,0x35,0xce,0x74, +0x9, 0xac,0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x17,0x85,0x7d,0x3, 0x7e,0xa1, +0x24,0x74,0x9, 0xa4,0x49,0x25,0x35,0xcc,0x74,0x9, 0xac,0xbf,0x12,0x77,0xc4,0x2d, +0x3, 0xa, 0x1c,0x9, 0xa1,0x36,0x3a,0xbe,0xa0,0x0, 0x28,0x18,0x7e,0x30,0x2, 0xac, +0x3c,0x59,0x1, 0x36,0x26,0xa, 0x1c,0x2e,0x14,0x36,0x3a,0x7c,0xba,0x14,0x7a,0x19, +0xb0,0x2, 0x88,0xa5,0x74,0x2, 0xac,0xbc,0x49,0x15,0x36,0x26,0xbe,0x14,0x0, 0x32, +0x28,0x8, 0x7d,0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, +0xbe,0x4, 0x0, 0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30, +0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56, +0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d, +0x19,0xb1,0x29,0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28, +0x64,0x1b,0xe0,0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34, +0x74,0x9, 0x12,0x15,0xfc,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x88,0xe1,0xac,0x3f,0x12, +0x88,0xcd,0x7e,0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x88,0xcd,0x1b,0xf0, +0x74,0x2, 0xac,0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x36,0x26,0x80,0x25, +0x5, 0x24,0xe5,0x24,0xbe,0xb0,0xa, 0x50,0x3, 0x2, 0x87,0x8a,0x80,0x17,0x6d,0x11, +0x74,0x2, 0xac,0xbd,0x12,0x88,0xd6,0xac,0x3d,0x19,0xa1,0x35,0xd0,0x74,0x2, 0xa, +0x1d,0x19,0xb1,0x36,0x3a,0xb, 0xf0,0xbc,0xef,0x28,0x3, 0x2, 0x87,0x66,0xe4,0x7a, +0xb3,0x16,0x92,0x7e,0x34,0x0, 0x5a,0xca,0x39,0x7e,0x18,0x28,0xae,0x7e,0x8, 0x35, +0xcc,0x12,0x17,0x2e,0x1b,0xfd,0x7a,0xe3,0x2a,0x20,0xda,0x3b,0x22,0x2e,0x14,0x28, +0xae,0x74,0x9, 0x2, 0x15,0xfc,0x59,0x15,0x36,0x26,0x7e,0xa0,0xff,0x7e,0x30,0x9, +0x22,0x2e,0x34,0x28,0xae,0x7e,0x30,0x9, 0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x7e, +0xf0,0xa, 0x6c,0x11,0x80,0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f, +0x38,0x7e,0x34,0x7f,0xff,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac, +0xb1,0x59,0x35,0x1f,0x36,0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d, +0x12,0x8a,0x32,0x7c,0x7d,0x7c,0x6f,0x12,0x8a,0x32,0x6c,0x0, 0x80,0x39,0x6c,0xee, +0x80,0x16,0x74,0x9, 0xac,0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75, +0x28,0xb2,0xbc,0x76,0x68,0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15, +0x7e,0x70,0x9, 0xac,0x70,0x12,0x88,0xe1,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, +0x12,0x15,0xfc,0xb, 0x10,0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca, +0x59,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x29,0x62,0x12,0x17,0x2e,0x1b,0xfd,0xda,0x79, +0xda,0xd8,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0x7c,0x57,0x41,0x14,0x7e, +0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98,0x7e,0xd0,0x9, 0xac,0xd5,0x9, +0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff,0x68,0x66,0x12,0x8a,0x28,0x39, +0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e,0xf0,0x9, 0x70,0xc, 0xac,0xf5, +0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, 0xac,0xf6,0x7d,0x97,0x2e,0x94, +0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x8a,0x28,0x1b,0x7a,0xd0,0x69,0xf4,0x0, +0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7,0x79,0xf6,0x0, 0x2, 0x7e,0xf0, +0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x8a,0x28,0x39,0x87,0x0, 0x5, 0x7e,0xf0, +0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x8a,0x28,0x39,0x87,0x0, 0x6, 0xb, 0xa0, +0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0x21,0x8f,0xb, 0x60,0xbe,0x60,0xa, 0x50, +0x2, 0x21,0x8b,0x7c,0xba,0xda,0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d, +0xf7,0x22,0x7e,0x8, 0x1f,0x34,0x12,0x89,0x83,0x7c,0x1b,0x22,0xca,0x79,0x7e,0xf3, +0x2a,0x20,0x7e,0xe3,0x2a,0x21,0x7c,0xbf,0x7c,0x7e,0x12,0x43,0xf2,0x7c,0xbf,0x12, +0x88,0xe9,0x4c,0xee,0x78,0x15,0x7e,0x34,0x0, 0x5a,0xca,0x39,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x29,0x62,0x12,0x17,0x2e,0x1b,0xfd,0x80,0xb, 0x7e,0xb3,0x2a,0x27,0x70, +0x5, 0x7c,0xbf,0x12,0x77,0x3e,0x7c,0xbf,0x12,0x57,0x6a,0xbe,0xf0,0x0, 0x28,0x6, +0x74,0x1, 0x7a,0xb3,0x2a,0x29,0xda,0x79,0x22,0x7e,0xb3,0x38,0x38,0x70,0x3, 0x12, +0x87,0x28,0x2, 0x8a,0x3c,0x7e,0x73,0x2a,0x21,0xbe,0x73,0x2a,0x20,0x78,0x13,0x12, +0x8a,0xcd,0x40,0xe, 0x7e,0x37,0x35,0xa8,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34, +0x80,0x6, 0x7e,0x37,0x35,0xa8,0x1e,0x34,0x7a,0x37,0x35,0xa8,0x7e,0xb3,0x2a,0x20, +0x70,0x6, 0x6d,0x33,0x7a,0x37,0x35,0xa8,0x7e,0x37,0x35,0xa8,0x22,0x7e,0x73,0x2a, +0x20,0xbe,0x70,0x1, 0x22,0x7e,0xb3,0x2a,0x27,0x70,0x23,0x7e,0xb3,0x35,0xaa,0xb4, +0x2, 0x9, 0x12,0x8a,0xcd,0x28,0x4, 0x74,0x3, 0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xb5, +0x7e,0x73,0x35,0xb6,0xbe,0x73,0x35,0xb5,0x28,0x4, 0x7a,0x73,0x35,0xb5,0x22,0x12, +0x8b,0x5, 0x2, 0x8a,0xd5,0xca,0x79,0x7e,0x13,0x2a,0x20,0x7e,0x78,0x29,0xbc,0x12, +0x8c,0x4c,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0xf, 0x7e,0xa0,0x2, +0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12,0x1a,0xaf,0x81, +0x35,0xbc,0x20,0x50,0x3, 0x12,0x1a,0xaf,0x6c,0x0, 0x7e,0x70,0x9, 0xac,0x70,0x9, +0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x81,0x2b,0xa, 0x29,0x7f,0x67,0x2d,0xd2, +0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x81,0xe, 0x12,0x8c,0x42,0x49,0x33,0x29, +0x8, 0x9d,0x32,0x12,0x17,0x85,0x7d,0xd3,0x7e,0x70,0x4, 0xac,0x79,0x49,0x23,0x36, +0x49,0x12,0x8c,0x38,0x9d,0x32,0x12,0x17,0x85,0x7d,0xc3,0x7e,0x73,0x35,0x92,0xa, +0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x8c,0x42,0x7e,0xf0,0x9, 0xac, +0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49,0x22,0x36,0x49,0x7e,0xf0, +0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28,0x2, 0x1b,0x10,0xa5,0xb9, +0x0, 0x79,0x7e,0xb3,0x35,0x93,0x4, 0x7a,0xb3,0x35,0x93,0x7e,0x63,0x35,0x93,0xbe, +0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x35,0x93,0x7e,0xb3,0x35,0x92,0xbc,0xb3,0x50, +0x5a,0x4, 0x7a,0xb3,0x35,0x92,0x80,0x53,0x7e,0x50,0x9, 0xac,0x50,0x49,0xb2,0x29, +0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x36,0x47,0x49,0x22,0x29,0xa, 0x59,0x27, +0x36,0x49,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x35,0x92,0x80,0xb, 0xbc,0x7a,0x28,0x7, +0x7c,0xb7,0x14,0x7a,0xb3,0x35,0x92,0xe4,0x7a,0xb3,0x35,0x93,0x80,0x1d,0x4c,0x88, +0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59, +0x59,0x32,0x36,0x47,0x12,0x8c,0x38,0x59,0x32,0x36,0x49,0xb, 0x0, 0xa5,0xb8,0xa, +0x2, 0x80,0x2, 0x61,0x3a,0xda,0x79,0x22,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29, +0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49,0x22,0x36,0x47,0x22,0xa2,0xa, 0x22,0x7c, +0xab,0x7e,0xb, 0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x35,0xab,0xbe, +0x73,0x35,0xb5,0x50,0xe, 0x7d,0x24,0x2e,0x24,0x35,0xab,0x7c,0xb7,0x4, 0x7a,0x29, +0xb0,0xd3,0x22,0xbe,0x73,0x35,0xb5,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a, +0xb, 0xb0,0x74,0xff,0x19,0xb4,0x35,0xab,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x35,0xab, +0xbe,0xb0,0xff,0x68,0x7, 0xe4,0x19,0xb3,0x35,0xab,0xd3,0x22,0xe4,0x19,0xb3,0x35, +0xab,0xc3,0x22,0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x81,0xbd,0x13,0x38, +0x6, 0x7e,0x34,0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12, +0x15,0x75,0xbe,0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x35,0xb7,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x35,0x94,0x80,0x4, 0x59,0x35, +0x35,0x94,0x59,0xf5,0x35,0xb7,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, +0xda,0xf8,0x22,0x7e,0x8, 0x35,0xb7,0x7e,0x34,0x0, 0x14,0xe4,0x12,0x17,0x53,0x7e, +0x8, 0x35,0x94,0x7e,0x34,0x0, 0x14,0x2, 0x17,0x53,0x6c,0x0, 0x6c,0x11,0x80,0x13, +0x7c,0xb1,0x12,0x1e,0x96,0x60,0xa, 0x12,0x8d,0x64,0x40,0x5, 0x7e,0x0, 0x1, 0x80, +0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5,0x7c,0xb0,0x6c,0x77,0x12, +0x8d,0x7d,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70,0x1, 0x12,0x8d,0x7d,0xb4, +0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x1e,0x96,0x60,0xc, 0x12,0x8d,0x64, +0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x54,0xcd,0xb, 0x10,0x7e,0x3, 0x28,0x84,0xbc, +0x1, 0x38,0xe3,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xb7,0xb4,0x17,0x2, 0xd3,0x22,0xc3,0x22,0x7c,0xab,0xa5, +0xbf,0x0, 0xc, 0x7e,0xb3,0x37,0x67,0x7a,0xb3,0x37,0x68,0x7a,0xa3,0x37,0x67,0x7e, +0xb3,0x37,0x68,0x60,0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e, +0xb3,0x37,0x69,0x60,0x5, 0x14,0x7a,0xb3,0x37,0x69,0x7e,0x73,0x37,0x69,0xbe,0x70, +0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xe5,0x29,0x7c,0x7c,0x2, 0x8d,0x74,0xca, +0xf8,0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x5e,0xc2,0xa, 0xc2, +0xb, 0x80,0x7d,0xbe,0xb0,0x2, 0x38,0x72,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, +0x27,0x7e,0x73,0x26,0xfa,0x12,0x1e,0x8f,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73, +0x26,0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0x1e,0x8f,0xbe,0x34,0x0, 0x5, 0x58, +0x2, 0x80,0x5a,0x6c,0xff,0x80,0x3c,0x7c,0xbf,0x12,0x7e,0x27,0x1a,0x4b,0x7c,0xbf, +0x12,0x78,0x52,0x7d,0xc3,0xbe,0xc4,0x3, 0xe8,0x58,0x4, 0x7e,0xd4,0x0, 0x8, 0x7d, +0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0xb, 0x80,0xa, 0x7d,0x5d,0xe, 0x54,0xbd, +0x54,0x48,0x2, 0xc2,0xb, 0x20,0xb, 0x4, 0xbd,0xd4,0x58,0x5, 0x75,0x5e,0x28,0x80, +0xf, 0xb, 0xf0,0x12,0x56,0xb5,0x38,0xbf,0x80,0x6, 0xe5,0x5e,0x24,0xfb,0xf5,0x5e, +0xe5,0x5e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0xa, 0x15,0x5e,0x80,0x5, 0x75,0x5e,0x0, +0xc2,0xa, 0xda,0xf8,0x22,0xca,0x3b,0x7e,0x93,0x2a,0x93,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x2, 0xbc,0x58,0x2, 0xe1,0x9, 0x6c,0x88,0xe1,0x2, 0x6c,0xff,0x6c,0xee,0x74, +0x2, 0xac,0xb8,0x9, 0xd5,0x26,0xfa,0x12,0x8f,0x13,0x7c,0xbd,0x12,0x2c,0xb9,0xbe, +0x34,0x0, 0xfa,0x18,0x6b,0x7e,0xa1,0x24,0x74,0x2, 0xa4,0x49,0x55,0x4, 0xfc,0xbe, +0x54,0x1, 0xc2,0x18,0x5b,0xbe,0xd0,0x3, 0x38,0x5f,0x6c,0xcc,0x80,0xd, 0x12,0x8f, +0xc, 0xbe,0x34,0x2, 0xbc,0x8, 0x2, 0xb, 0xf0,0xb, 0xc0,0xbc,0x9c,0x38,0xef,0x6c, +0xcc,0x80,0x24,0xbc,0x8c,0x68,0x1e,0x74,0x2, 0xac,0xbc,0x9, 0x75,0x26,0xfa,0xa, +0x37,0x7d,0x13,0xb, 0x14,0xa, 0x2d,0xbd,0x12,0x48,0xa, 0xa, 0x5d,0xb, 0x54,0xbd, +0x35,0x18,0x2, 0xb, 0xe0,0xb, 0xc0,0x7e,0x73,0x28,0x84,0xbc,0x7c,0x38,0xd4,0xbe, +0xf0,0x5, 0x50,0x5, 0xbe,0xe0,0x2, 0x40,0x7, 0x7c,0xb8,0x6c,0x77,0x12,0x54,0xcd, +0xb, 0x80,0x12,0x7f,0x7, 0x28,0x2, 0xc1,0x7b,0xda,0x3b,0x22,0x7c,0xbd,0x7c,0x7c, +0x2, 0x2c,0xb9,0x9, 0x75,0x26,0xfb,0x7a,0x71,0x24,0x22,0xe4,0x7a,0xb3,0x36,0x6f, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x36,0xe8,0x60,0x5, 0xe4,0x7a,0xb3,0x36, +0xea,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x6e,0x12,0x8f,0x82,0x28,0x35,0x6d,0x22, +0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0x7b,0xbe,0x37,0x7, 0xfa,0x8, +0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x21,0x70,0x17,0x7e,0xb3,0x38,0xf, +0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x5f,0xe5,0x5f,0xbe,0xb0,0x10,0x28,0x5, 0xd2,0x15, +0x75,0x5f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x5f,0x0, 0x22,0x7e,0x24,0x0, 0x2, 0x2, +0x15,0x29,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x0, 0x22,0x7e,0xb3,0x2b,0x3c,0xb4,0x1, +0x31,0x12,0x8f,0xc3,0x7e,0x1f,0x39,0xac,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8, +0x7a,0x37,0x24,0xf6,0x12,0x8f,0xca,0x12,0x8f,0xd3,0xe4,0x7a,0xb3,0x24,0xf5,0x7e, +0x34,0x0, 0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, +0xd, 0x7, 0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x8c,0x7a,0x73, +0x24,0xf2,0x22,0x7e,0x73,0x2a,0x8d,0x7a,0x73,0x24,0xf3,0x22,0x12,0x8f,0xeb,0xbe, +0x34,0x2, 0x30,0x28,0x3, 0xd2,0x17,0x22,0xc2,0x17,0x22,0x6d,0x11,0xe4,0x12,0x0, +0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x7f,0x39,0xc6,0x2d,0xf0, +0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12,0x17,0x85,0xbd,0x31,0x28, +0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x39,0xc6,0x2d,0x13,0x69,0x20,0x1, 0x0, +0x69,0x30,0x0, 0x80,0x12,0x77,0xbc,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x1f,0x39,0xc6, +0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff, +0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff,0xb, 0xa0, +0x7e,0xb3,0x2a,0x93,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x17,0x53,0x12,0x8f,0xd3,0x12,0x8f,0xca,0xa9,0xd1,0xcb, +0x12,0x6f,0xd1,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x39,0xac,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0x90,0x8f,0x2, 0xd, 0x7, 0x7a, +0x37,0x24,0xfc,0x7e,0x8, 0x24,0xf2,0x22,0x7a,0xb3,0x24,0xf2,0x7e,0x53,0x2a,0x8d, +0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa,0xe4,0x7a,0xb3,0x24,0xf4,0x7a,0xb3,0x24, +0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24,0xf6,0x7e,0x34,0x0, 0x20,0x12,0x90,0x8f, +0x2, 0xd, 0x7, 0x12,0x6f,0xc9,0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x8c,0x12,0x90, +0x98,0x12,0x90,0xdf,0x7a,0x37,0x39,0xa9,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x6d, +0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0x91,0x95,0x90,0x60, +0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0x90,0xfc,0x22,0xca,0xf8,0x6d,0xee, +0x7d,0xfe,0x7e,0x83,0x2a,0x8d,0xa, 0xd8,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x2f, +0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x18,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x13, +0xfe,0x7f,0x50,0x2d,0xb3,0xb, 0x5a,0xc0,0x9d,0xc2,0x59,0xc3,0x13,0xc6,0xb, 0xa0, +0xbc,0x8a,0x38,0xe4,0x90,0x60,0x92,0xe4,0x93,0x7c,0x9b,0x6d,0xdd,0x80,0x11,0x7e, +0x8, 0x13,0xfe,0x90,0x60,0x92,0xe4,0x93,0xa, 0xcb,0x1b,0xc4,0x7d,0x3c,0x7c,0x97, +0x6c,0xff,0x80,0x38,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x7d,0x23,0x2d,0x2e,0x3e,0x24, +0x49,0xc2,0x13,0xfe,0x2d,0x3d,0x3e,0x34,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xb0,0x7d, +0x3c,0x9d,0x3b,0x12,0x17,0x85,0x7d,0xa3,0xbd,0xfa,0x58,0x2, 0x7d,0xfa,0xb, 0xa0, +0xbc,0x8a,0x38,0xd4,0xa, 0xc8,0x2d,0xec,0x2d,0xdc,0xb, 0xf0,0xbc,0x9f,0x38,0xc4, +0x7d,0x3f,0xda,0xf8,0x22,0xca,0xf8,0x6d,0x44,0x7e,0xf3,0x2a,0x8d,0x90,0x60,0x93, +0xe4,0x93,0xa, 0xfb,0x7e,0xb3,0x2a,0x8c,0xa, 0xeb,0x2d,0xef,0xa, 0xff,0xad,0xfe, +0xa, 0xef,0x2d,0xef,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x31,0x7e,0x8, 0x13,0x8e, +0x6c,0xaa,0x80,0x23,0xa, 0xda,0x2d,0xdf,0x3e,0xd4,0x7e,0x1f,0x39,0xac,0x2d,0x3d, +0xb, 0x1a,0xd0,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x50,0x2d,0xb2,0xb, 0x5a,0x30,0x9d, +0x3d,0x59,0x32,0x13,0xc6,0xb, 0xa0,0xbc,0xfa,0x38,0xd9,0x80,0xa, 0x7d,0x5e,0x3e, +0x54,0x7e,0xf, 0x39,0xac,0x2d,0x15,0x6c,0xaa,0x80,0x2c,0xa, 0xea,0x2d,0xef,0x3e, +0xe4,0x7e,0x1f,0x39,0xac,0x2d,0x3e,0xb, 0x1a,0xe0,0x7e,0x70,0x2, 0xac,0x7a,0x2d, +0x31,0x7d,0x20,0xb, 0x1a,0xd0,0x7d,0x3e,0x9d,0x3d,0x12,0x17,0x85,0x7d,0xc3,0xbd, +0x4c,0x58,0x2, 0x7d,0x4c,0xb, 0xa0,0xbc,0xfa,0x38,0xd0,0x7d,0x34,0xda,0xf8,0x22, +0x6c,0x66,0x7e,0x27,0x39,0xd6,0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e, +0xb3,0x28,0xac,0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xca,0xbc,0x76,0x50,0xf, 0xe4,0x7a, +0xb3,0x28,0xad,0x12,0x7b,0xb0,0x7e,0xb3,0x2f,0xca,0x4, 0x80,0x4, 0xe4,0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xca,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xcb, +0xbe,0xa0,0x5, 0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74, +0x5, 0x80,0x1, 0xe4,0x7a,0xb3,0x2f,0xcb,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8, +0x30,0x6, 0xe, 0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, +0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x93,0xa, 0x3b,0x7e,0xb3,0x2a,0x92,0xa, 0x2b,0x2d, +0x23,0xa, 0x3a,0xbd,0x32,0x48,0xc6,0x22,0xd2,0x0, 0x6c,0xaa,0x6c,0x77,0x80,0x1f, +0x7e,0x63,0x2a,0x8d,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac, +0x56,0x49,0x22,0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e, +0xb3,0x2a,0x8c,0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, +0x2, 0xc2,0x0, 0xa2,0x0, 0x22,0x7e,0x63,0x2a,0x8e,0x7e,0xa3,0x2a,0x8f,0x7e,0x70, +0x1, 0x80,0x15,0xa, 0x17,0x7e,0xb3,0x2a,0x8d,0xa, 0x2b,0x2d,0x21,0x3e,0x24,0x12, +0x93,0x51,0x58,0x2, 0xd3,0x22,0xb, 0x70,0xa, 0x16,0x1b,0x14,0xa, 0x27,0xbd,0x21, +0x48,0xe1,0x7e,0x70,0x2, 0x80,0xe, 0x7e,0x50,0x2, 0xac,0x57,0x12,0x93,0x51,0x58, +0x2, 0xd3,0x22,0xb, 0x70,0xa, 0x1a,0x1b,0x15,0xa, 0x27,0xbd,0x21,0x48,0xe8,0xc3, +0x22,0x49,0x22,0x4, 0xfc,0xbe,0x24,0xfe,0xe8,0x22,0x7e,0xb3,0x37,0x7b,0xb4,0x1, +0x3, 0x2, 0x93,0xb1,0x7e,0xb3,0x37,0xe1,0x4, 0x7a,0xb3,0x37,0xe1,0x7e,0xb3,0x37, +0x6f,0xb4,0x2, 0x18,0x7e,0xb3,0x37,0xe0,0x4, 0x7a,0xb3,0x37,0xe0,0xb4,0x1, 0x6, +0x74,0x1, 0x7a,0xb3,0x37,0xe1,0x74,0x1, 0x7a,0xb3,0x37,0x6f,0x7e,0x73,0x37,0xe0, +0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x37,0x7b,0x12,0x93,0xb1,0x12,0x96, +0x67,0x12,0x93,0xb8,0x7e,0x73,0x37,0xe1,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x93,0xb8, +0x22,0x74,0x2, 0x7a,0xb3,0x37,0x6f,0x22,0xe4,0x7a,0xb3,0x37,0xe1,0x7a,0xb3,0x37, +0xe0,0x22,0x7e,0x73,0x37,0x6f,0x7a,0x73,0x37,0xe5,0x7e,0x47,0x39,0xa9,0xbe,0x44, +0x0, 0x64,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x37,0x6f,0xbe,0x44,0x0, 0xc8,0x28,0x8, +0xe4,0x7a,0xb3,0x37,0x6d,0x12,0x93,0xb1,0x7e,0x57,0x37,0x75,0xbd,0x54,0x50,0x4, +0x7a,0x47,0x37,0x75,0x12,0x95,0xe4,0x38,0x10,0x12,0x95,0xdc,0x38,0xb, 0x12,0x94, +0x49,0x38,0x6, 0x7e,0xb3,0x16,0x91,0x70,0x34,0x12,0x93,0x5a,0xbe,0x44,0x0, 0x32, +0x50,0x21,0x7e,0xb3,0x37,0x6d,0x4, 0x7a,0xb3,0x37,0x6d,0x7e,0x73,0x37,0x6d,0xbe, +0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3,0x37,0x6d,0x12,0x95,0xf6,0x7a,0xb3,0x37, +0xe2,0x80,0x5, 0xe4,0x7a,0xb3,0x37,0x6d,0x7d,0x34,0x2, 0x96,0xbf,0x2, 0x94,0x40, +0x12,0x93,0xb8,0xe4,0x7a,0xb3,0x37,0x7b,0x22,0x7e,0x73,0x26,0xf5,0xbe,0x70,0x0, +0x22,0xca,0x79,0x7e,0xf0,0xff,0x12,0x96,0x90,0x7e,0xb3,0x37,0x71,0xb4,0x1, 0x8, +0x12,0x6f,0xee,0xe4,0x7a,0xb3,0x37,0x71,0x7e,0xb3,0x37,0x70,0x60,0x4, 0x74,0xff, +0xa1,0x52,0x7e,0xb3,0x37,0x6f,0xb4,0x2, 0x2, 0x80,0x2, 0xa1,0x46,0x12,0x95,0xe4, +0x38,0x12,0x12,0x95,0xdc,0x38,0xd, 0x12,0x94,0x49,0x38,0x8, 0x7e,0xb3,0x16,0x91, +0x60,0x2, 0xa1,0x46,0x74,0x3, 0x12,0x95,0x55,0x7c,0xeb,0x7e,0xb3,0x37,0x6e,0x4, +0x7a,0xb3,0x37,0x6e,0x74,0x3, 0x12,0x95,0x55,0x7c,0xab,0xbe,0xa0,0xff,0x68,0x23, +0xbe,0xe0,0xff,0x68,0x1c,0x7e,0x30,0xc, 0xac,0x3e,0x49,0x21,0x37,0x84,0xbe,0x24, +0x1, 0xf4,0x28,0xf, 0x12,0x95,0xec,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xea,0x80, +0x2, 0x7c,0xea,0xbe,0xe0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x37,0x6e,0x7a,0xb3,0x37, +0x6f,0x7a,0xb3,0x37,0x7b,0x74,0xff,0x80,0x69,0x7e,0x73,0x37,0x6e,0xbe,0x70,0x4, +0x28,0x54,0x74,0xc, 0xac,0xbe,0x49,0x35,0x37,0x84,0xbe,0x34,0x1, 0xf4,0x40,0x6, +0x7e,0xb3,0x16,0x91,0x70,0x37,0x7e,0x37,0x37,0x6a,0xbe,0x34,0x1, 0x2c,0x38,0xa, +0x7e,0x37,0x37,0x75,0xbe,0x34,0x1, 0x2c,0x28,0x23,0x74,0x5, 0xac,0xbe,0x9, 0x75, +0x26,0x33,0xbe,0x73,0x2b,0x2e,0x68,0x15,0x7c,0xfe,0xbe,0xf0,0x4, 0x50,0x8, 0x12, +0x6e,0xb4,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x37,0x71,0xe4,0x7a,0xb3, +0x37,0x7b,0x7a,0xb3,0x37,0x6f,0xbe,0xf0,0xff,0x68,0x5, 0xe4,0x7a,0xb3,0x37,0x6e, +0x7c,0xbf,0xda,0x79,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12, +0x95,0xce,0x68,0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0x96,0x0, 0x7d,0x23,0x7e,0x70, +0xc, 0xac,0x72,0x59,0x23,0x37,0x88,0x49,0x3, 0x37,0x88,0x49,0x23,0x37,0x84,0xbd, +0x20,0x50,0x4, 0x59,0x3, 0x37,0x84,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c, +0x22,0x80,0x18,0x12,0x95,0xce,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x37, +0x84,0xbd,0x4, 0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e, +0x37,0x37,0x6a,0xbe,0x37,0x37,0xe3,0x50,0x8, 0x7e,0x37,0x37,0xe3,0x7a,0x37,0x37, +0x6a,0x12,0x95,0xec,0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10, +0x5, 0xac,0x12,0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0x2e,0x22,0x7e,0x73,0x26,0xf4, +0xbe,0x70,0x0, 0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0x70,0xc, 0xac, +0x7a,0x49,0x33,0x37,0x84,0x22,0xe4,0x7a,0xb3,0x37,0x6f,0x7a,0xb3,0x37,0x77,0x22, +0x49,0x23,0x37,0x8a,0x49,0x33,0x37,0x86,0x9d,0x32,0x2, 0x17,0x85,0x6c,0xaa,0x7e, +0x70,0xc, 0xac,0x7a,0x12,0x96,0x0, 0xbe,0x34,0x3, 0xe8,0x8, 0x5, 0x12,0x96,0x59, +0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x37,0x8a,0x49,0x12,0x37,0x86,0xbd, +0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x37,0x8a,0x7d,0x13,0xb, 0x15,0x1b,0x8, 0x10, +0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x37,0x8a,0x1b,0x35,0x1b,0x28, +0x30,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xb7,0x22,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32, +0x37,0x86,0x59,0x32,0x37,0x8a,0x22,0xe4,0x7a,0xb3,0x37,0x6d,0x6d,0x33,0x6c,0xaa, +0x7e,0x50,0xc, 0xac,0x5a,0x59,0x32,0x37,0x84,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xf0, +0xe4,0x7a,0xb3,0x37,0x6e,0x6d,0x33,0x7a,0x37,0x37,0x75,0x7a,0x37,0x37,0x6a,0x22, +0x7e,0xb3,0x37,0x70,0xb4,0x1, 0x27,0x7e,0xb3,0x37,0xe6,0x4, 0x7a,0xb3,0x37,0xe6, +0x7e,0x73,0x37,0xe6,0xbe,0x70,0x3, 0x40,0x15,0x12,0x7e,0xc, 0x7e,0x73,0x37,0xe6, +0xbe,0x70,0x6, 0x40,0x9, 0xe4,0x7a,0xb3,0x37,0xe6,0x7a,0xb3,0x37,0x70,0x22,0xbe, +0x34,0x1, 0xf4,0x28,0xd, 0x7e,0x53,0x37,0xe2,0xbe,0x50,0x8, 0x50,0x3f,0x74,0x8, +0x80,0x37,0xbe,0x34,0x1, 0x90,0x28,0xd, 0x7e,0x53,0x37,0xe2,0xbe,0x50,0x6, 0x50, +0x2c,0x74,0x6, 0x80,0x24,0xbe,0x34,0x1, 0x2c,0x28,0xd, 0x7e,0x53,0x37,0xe2,0xbe, +0x50,0x4, 0x50,0x19,0x74,0x4, 0x80,0x11,0xbe,0x34,0x0, 0xc8,0x28,0xf, 0x7e,0x73, +0x37,0xe2,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x37,0xe2,0x7e,0xb3,0x37, +0xe2,0xbe,0xb0,0x0, 0x28,0x19,0x14,0x7a,0xb3,0x37,0xe2,0x74,0x1, 0x7a,0xb3,0x16, +0x92,0x7e,0x73,0x37,0xe2,0xbe,0x70,0x4, 0x28,0x5, 0xe4,0x7a,0xb3,0x16,0x91,0x22, +0x7e,0xb3,0x2b,0x2e,0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0xc4,0x1, 0xf4,0x7e,0x73, +0x38,0xe5,0xa, 0xb7,0x7e,0xb3,0x2b,0x2f,0xf5,0x34,0x75,0x35,0x4, 0xe4,0x7a,0xb3, +0x37,0x78,0xa, 0x3e,0xad,0x3b,0x7d,0xa3,0x2d,0xac,0x6c,0xdd,0x7e,0xa3,0x37,0x78, +0xbe,0xa1,0x35,0x40,0x2, 0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, +0x75,0x26,0x33,0xbc,0x7e,0x78,0xe, 0xe5,0x35,0x14,0xbe,0xb3,0x37,0x78,0x78,0x5, +0xe4,0x7a,0xb3,0x37,0x78,0x7e,0xc3,0x37,0x78,0x80,0x3a,0x7e,0xb3,0x37,0x78,0x4, +0x7a,0xb3,0x37,0x78,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x33,0xbc,0x7e,0x68,0x23, +0xa, 0xdd,0x19,0xcd,0x37,0x7c,0xa, 0x97,0xad,0x9b,0x2d,0x9c,0x7c,0xad,0xb, 0xd0, +0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x34,0x12,0x10,0x0, 0xb, 0xf0,0xbe,0xf0, +0x3, 0x50,0x8, 0xb, 0xc0,0xe5,0x35,0xbc,0xbc,0x38,0xc0,0x7a,0xf3,0x37,0x79,0xda, +0x3b,0x22,0x7e,0x37,0x39,0xa5,0x12,0x51,0x7f,0x7a,0x37,0x37,0xe3,0x6c,0xaa,0x80, +0x24,0xbe,0xa0,0x4, 0x50,0x27,0xa, 0x3a,0x9, 0x63,0x37,0x7c,0xbe,0x60,0x4, 0x50, +0x12,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x42,0x39,0x9f,0x7e,0x70,0xc, 0xac,0x67,0x59, +0x43,0x37,0x86,0xb, 0xa0,0x7e,0xb3,0x37,0x79,0xbc,0xba,0x38,0xd4,0x22,0x12,0x98, +0xa4,0x12,0x98,0x70,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d,0x13,0x2e,0x14,0x2a, +0x99,0x6d,0x0, 0x9, 0xb3,0x2a,0x98,0x12,0x98,0x57,0xa, 0x3b,0x7d,0x13,0x2e,0x14, +0x2b,0x40,0x6d,0x0, 0x9, 0xb3,0x2b,0x3f,0x12,0x98,0x57,0xa, 0x1b,0x2e,0x14,0x2a, +0x9b,0x12,0x98,0x64,0xe5,0x25,0x12,0x98,0x5b,0xa, 0x1b,0x2e,0x14,0x2b,0x42,0x12, +0x98,0x64,0xe5,0x24,0x2, 0x17,0x53,0x7e,0x34,0x0, 0x2, 0x12,0x17,0x53,0x90,0x60, +0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, 0x3b,0x1b,0x35,0x22, +0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x99,0xbc,0xba,0x68,0x7, +0xb, 0x90,0x12,0x98,0x9c,0x38,0xef,0x12,0x98,0x9c,0x68,0x7, 0xb, 0xa0,0xbe,0xa0, +0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22,0x90,0x60,0x50,0xe4, +0x93,0xbc,0xb9,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22,0x7e,0x8, 0x37, +0x80,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x17,0x53,0x6c,0xaa,0x7e,0x44,0xff,0xff,0x7e, +0x70,0xc, 0xac,0x7a,0x59,0x43,0x37,0x82,0x59,0x43,0x37,0x8a,0xb, 0xa0,0xbe,0xa0, +0x8, 0x40,0xe8,0x7e,0x8, 0x37,0x6e,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x17,0x53,0x7e, +0xa3,0x2b,0x81,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x81,0xd2,0x10,0x30,0x10,0x9, +0xc2,0x10,0x12,0x27,0xe0,0xe4,0x2, 0xa, 0x66,0x22,0x6d,0x33,0x7d,0x23,0x7d,0x3, +0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x8d,0xac,0xb3,0xa, 0x42, +0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4,0xb, 0x7a,0x40,0xbe, +0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, 0x24,0xbe,0x44,0xff, +0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, 0x34,0xb, 0x21,0x7e, +0x93,0x2a,0x8d,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a,0x8c,0xbc,0xb3,0x38, +0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x12, +0x51,0x81,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0xda,0x7e, +0xb3,0x39,0xdb,0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39,0xdb,0x80,0x3c,0xe4, +0x7a,0xb3,0x39,0xdb,0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22,0xbd,0x32,0x28,0x1e, +0xe4,0x7a,0xb3,0x39,0xdb,0x7e,0xb3,0x39,0xda,0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a, +0xb3,0x39,0xda,0x80,0x16,0xe4,0x7a,0xb3,0x39,0xda,0x74,0x2, 0x80,0x9, 0xe4,0x7a, +0xb3,0x39,0xda,0x7a,0xb3,0x39,0xdb,0x7a,0xb3,0x39,0xdc,0x7e,0xb3,0x39,0xdc,0x22, +0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x39,0xdd,0x22,0xca,0xd8,0xca,0x79,0xc2,0x0, +0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7,0x28,0x97,0x7e,0x37,0x39,0x13, +0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff,0x7e,0xa3,0x2a,0x8d,0x7c,0x8a, +0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14,0x24,0xc2,0x68,0x8, 0x24,0xfb, +0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83,0x2a,0x8c,0x80,0xa, 0x7e,0x73, +0x2a,0x8c,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99,0x80,0xf, 0x7c,0xb9,0x12,0x78, +0x52,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, 0x90,0x7e,0x33,0x28,0x84,0xbc, +0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x61,0x8b,0x7e,0xa3,0x28,0x85,0xbe,0xa0, +0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3,0x26,0x83,0x70,0x31,0x6c,0x99, +0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34,0x49,0x23,0x5, 0x7a,0xbd,0x2f, +0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, 0x6d,0x33,0x9d,0x3e,0x12,0x8f, +0x7b,0xbd,0x3, 0x8, 0x4, 0xd2,0x0, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xd3,0x6d, +0xee,0x9e,0xe7,0x2a,0x6e,0xbe,0xe7,0x7, 0xf8,0x8, 0x2, 0xc2,0x0, 0x30,0x0, 0x20, +0x7e,0xb3,0x39,0xdd,0x4, 0x7a,0xb3,0x39,0xdd,0x7e,0x23,0x39,0xdd,0xbe,0x20,0xa, +0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x39,0xdd,0x74,0x1, 0x7a,0xb3,0x28,0xa8,0x80,0xf, +0x7e,0x23,0x39,0xdd,0xbe,0x20,0x0, 0x28,0x6, 0x1e,0x20,0x7a,0x23,0x39,0xdd,0x6c, +0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28,0x69,0x7e,0xb3,0x28,0xa7,0xb4, +0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68,0x59,0x7e,0xb3,0x28,0xa8,0xb4, +0x1, 0x52,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x26,0xfa,0x9, +0xd3,0x26,0xfb,0x12,0x9b,0x90,0xbe,0x34,0x0, 0x96,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x1d,0x7e, +0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3,0x27,0x37,0x12,0x9b,0x90,0xbe, +0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x85, +0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x17,0xa, 0xe9,0xa, 0x5f,0x2d,0x5e,0x3e,0x54, +0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0x6, 0xb, 0x90,0xbc, +0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x39,0xde,0x4, 0x7a,0xb3,0x39,0xde, +0x7e,0x73,0x39,0xde,0xbe,0x70,0x5, 0x28,0x22,0x74,0x5, 0x7a,0xb3,0x39,0xde,0x7e, +0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x19,0x12,0x99,0xc0,0x80,0xf, 0x7e,0x73,0x39,0xde, +0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x39,0xde,0xda,0x79,0xda,0xd8,0x22, +0x7c,0xba,0x7c,0x7d,0x2, 0x2c,0xb9,0xca,0xf8,0x7c,0xfb,0x7e,0x34,0x0, 0x38,0xca, +0x39,0xac,0x7f,0x2e,0x34,0x0, 0x63,0x6d,0x22,0x7e,0x8, 0x34,0x0, 0x12,0x17,0x2e, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, 0x43,0x6d,0x22, +0x7e,0x8, 0x3, 0x73,0x12,0x17,0x2e,0x1b,0xfd,0xda,0xf8,0x22,0x6c,0xaa,0x12,0x9c, +0x10,0x29,0x81,0x0, 0x5, 0x7c,0x98,0x5e,0x90,0x1, 0x3e,0x90,0x7f,0x1, 0x2e,0x14, +0x0, 0x5, 0x7c,0xb8,0x54,0xfd,0x4c,0xb9,0x7a,0xb, 0xb0,0x29,0xb1,0x0, 0x5, 0x30, +0xe0,0x16,0x30,0xe2,0x13,0xc4,0x23,0x54,0x1f,0xb4,0x1, 0xc, 0x7f,0x1, 0xb, 0x16, +0x7e,0xb, 0xb0,0x1e,0xb0,0x7a,0xb, 0xb0,0xb, 0xa0,0xbe,0xa0,0x1e,0x40,0xbf,0x22, +0x7e,0x70,0x6, 0xac,0x7a,0x2e,0x34,0x32,0x4d,0x6d,0x22,0x22,0x6c,0xaa,0x12,0x9c, +0x10,0x12,0x9c,0x3e,0x54,0xfe,0x12,0x9c,0x3b,0x54,0x7, 0x12,0x9c,0x3b,0x54,0xfb, +0x7a,0xb, 0xb0,0xb, 0xa0,0xbe,0xa0,0x1e,0x40,0xe4,0x22,0x7a,0xb, 0xb0,0x7f,0x1, +0x2e,0x14,0x0, 0x5, 0x7e,0xb, 0xb0,0x22,0xca,0x79,0xc2,0x0, 0x7e,0xf0,0x3, 0x12, +0x86,0xfc,0x7e,0xe3,0x2a,0x21,0x7e,0x34,0x1f,0x34,0x7a,0x37,0x32,0xe, 0x12,0x9f, +0xf6,0x38,0x2, 0xa1,0x24,0x12,0x9d,0x2d,0x92,0xd, 0x12,0x9c,0x1c,0x7c,0xbf,0x12, +0x28,0xd6,0x4c,0xee,0x68,0xe, 0x7e,0xa3,0x31,0xeb,0x4c,0xaa,0x78,0xa, 0x7e,0xb3, +0x31,0xec,0x70,0x4, 0xd2,0x0, 0x80,0x25,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x1c,0xbe, +0xb0,0x8, 0x28,0x4, 0xd2,0x0, 0x80,0x15,0xd2,0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xbe, +0x78,0xb, 0x20,0xd, 0x8, 0x4c,0xaa,0x78,0x4, 0x6c,0xff,0xc2,0x0, 0x20,0x0, 0x5, +0x7c,0xbf,0x12,0x28,0xd6,0x7e,0x8, 0x31,0xf0,0x12,0x2e,0xc, 0x7a,0xb3,0x31,0xef, +0xbe,0xb3,0x28,0x84,0x50,0x3d,0x7e,0x33,0x31,0xef,0x80,0x29,0x7e,0x70,0x2, 0xac, +0x73,0x9, 0x23,0x32,0x10,0x9, 0x13,0x32,0x11,0x2e,0x37,0x32,0xe, 0xb, 0x38,0x50, +0x7e,0x93,0x2a,0x8d,0xac,0x92,0xa, 0x31,0x2d,0x43,0x12,0x5f,0xc0,0x7c,0xb3,0x7e, +0x70,0x1, 0x12,0x54,0xcd,0x7c,0x3, 0x1b,0x30,0xa5,0xb8,0x0, 0xcf,0x74,0x1, 0x7a, +0xb3,0x31,0xed,0x7e,0xa3,0x31,0xef,0x7a,0xa3,0x28,0x84,0x74,0x2, 0xa4,0xca,0x59, +0x7e,0x18,0x32,0x10,0x7e,0x8, 0x26,0xfa,0x12,0x17,0x2e,0x1b,0xfd,0x12,0xa0,0xb, +0xf5,0x1c,0x80,0x6, 0x75,0x1c,0x64,0x12,0xa2,0x65,0xda,0x79,0x22,0xca,0x3b,0x7e, +0xe3,0x28,0x84,0x6c,0xdd,0x6c,0xff,0x74,0x6, 0xac,0xbd,0x12,0x9f,0xfe,0x30,0xe0, +0x37,0x6c,0xcc,0x80,0x27,0x12,0xaf,0xc5,0x7a,0xb3,0x1f,0x70,0x9, 0xa3,0x26,0xfb, +0x7a,0xa3,0x1f,0x71,0x7f,0x7, 0x12,0x9d,0x83,0x50,0xf, 0x7f,0x7, 0x7e,0xb3,0x1f, +0x71,0x6c,0x77,0x12,0x9d,0x86,0x50,0x2, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xd5, +0xbe,0xf0,0x2, 0x40,0x3, 0xd3,0x80,0x8, 0xb, 0xd0,0xbe,0xd0,0x1e,0x40,0xb6,0xc3, +0xda,0x3b,0x22,0x7e,0x70,0x1, 0x7c,0x87,0x7c,0x9b,0x29,0xa0,0x0, 0x3, 0x29,0x60, +0x0, 0x1, 0x7e,0x70,0x1, 0xbe,0x80,0x1, 0x78,0x7, 0x29,0xa0,0x0, 0x2, 0x7e,0xb, +0x60,0xa, 0x7, 0xa, 0x29,0x2d,0x2, 0xa, 0x16,0xbd,0x1, 0x48,0xc, 0xa, 0x17,0xa, +0x3a,0x2d,0x31,0xbd,0x23,0x18,0x2, 0xd3,0x22,0xc3,0x22,0xca,0x3b,0x7c,0xf5,0x7c, +0xe6,0x7c,0xd7,0x7c,0xcb,0x75,0x54,0x0, 0x7e,0xa1,0x54,0x74,0x6, 0xa4,0x12,0x9f, +0xfe,0x30,0xe1,0x2e,0x7f,0x7, 0x7c,0xbc,0x12,0x9e,0xf, 0x50,0x25,0x7f,0x7, 0x7c, +0xbe,0x12,0x9d,0x83,0x50,0x1c,0x7f,0x7, 0x7c,0xbd,0x6c,0x77,0x12,0x9d,0x86,0x50, +0x11,0x7f,0x7, 0x7c,0xbf,0x6c,0x77,0x12,0x9d,0x86,0x50,0x6, 0x29,0xb7,0x0, 0x4, +0x80,0xa, 0x5, 0x54,0xe5,0x54,0xbe,0xb0,0x1e,0x40,0xbd,0xe4,0xda,0x3b,0x22,0x7e, +0x70,0x1, 0x2, 0x9d,0x86,0xca,0x79,0x7f,0x70,0x7e,0xb4,0xff,0xff,0x6c,0xee,0xc2, +0x1, 0xc2,0x2, 0x29,0x67,0x0, 0x2, 0x7e,0x7b,0x70,0xbc,0x76,0x78,0xe, 0x29,0x67, +0x0, 0x3, 0x29,0x77,0x0, 0x1, 0xbc,0x76,0x78,0x2, 0xd2,0x2, 0x6c,0xff,0x12,0x9f, +0xe9,0x6d,0xaa,0x29,0xb6,0x0, 0x5, 0x20,0xe1,0x2, 0xc1,0xcf,0x7f,0x6, 0x7e,0x7b, +0xb0,0x12,0x9e,0xf, 0x50,0x2d,0x7f,0x6, 0x29,0xb7,0x0, 0x2, 0x12,0x9e,0xf, 0x50, +0x22,0x7f,0x6, 0x29,0xb7,0x0, 0x1, 0x6c,0x77,0x12,0x9d,0x86,0x50,0x15,0x7f,0x6, +0x29,0xb7,0x0, 0x3, 0x6c,0x77,0x12,0x9d,0x86,0x50,0x8, 0x7c,0xef,0xd2,0x1, 0x6d, +0xbb,0x80,0x55,0x7e,0x6b,0x70,0xa, 0x27,0x7e,0x7b,0x70,0x12,0x1e,0x8f,0x2d,0xa3, +0x29,0x76,0x0, 0x2, 0xa, 0x27,0x29,0x77,0x0, 0x2, 0x12,0x1e,0x8f,0x2d,0xa3,0x29, +0x76,0x0, 0x1, 0xa, 0x27,0x29,0x77,0x0, 0x1, 0x12,0x1e,0x8f,0x2d,0xa3,0x29,0x76, +0x0, 0x3, 0xa, 0x27,0x29,0x77,0x0, 0x3, 0x12,0x1e,0x8f,0x2d,0xa3,0xbd,0xab,0x50, +0x4, 0x7d,0xba,0x7c,0xef,0xbe,0xa4,0x0, 0x4, 0x38,0x4, 0xd2,0x1, 0x80,0x9, 0xb, +0xf0,0xbe,0xf0,0x1e,0x50,0x2, 0xc1,0x3e,0x20,0x1, 0xb, 0x20,0x2, 0x8, 0xbe,0xb4, +0x0, 0x8, 0x50,0x2, 0xd2,0x1, 0x20,0x1, 0x2, 0xe1,0x90,0x74,0x6, 0xac,0xbe,0x12, +0x9f,0xed,0x29,0x76,0x0, 0x5, 0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xbe,0xb0,0x1f,0x50, +0x16,0x7f,0x6, 0x2e,0x14,0x0, 0x5, 0x7c,0x67,0x2e,0x60,0x8, 0x5e,0x60,0xf8,0x5e, +0x70,0x7, 0x4c,0x76,0x7a,0xb, 0x70,0x20,0x2, 0x11,0x29,0xb6,0x0, 0x4, 0xbe,0xb0, +0xfa,0x50,0x8, 0x7f,0x16,0xb, 0x36,0x4, 0x7a,0x1b,0xb0,0x29,0x67,0x0, 0x3, 0x29, +0x76,0x0, 0x3, 0xbc,0x76,0x28,0x6, 0x29,0x76,0x0, 0x3, 0x80,0x4, 0x29,0x77,0x0, +0x3, 0x39,0x76,0x0, 0x3, 0x29,0x67,0x0, 0x2, 0x29,0x76,0x0, 0x2, 0xbc,0x76,0x28, +0x6, 0x29,0x76,0x0, 0x2, 0x80,0x4, 0x29,0x77,0x0, 0x2, 0x39,0x76,0x0, 0x2, 0x29, +0x67,0x0, 0x1, 0x29,0x76,0x0, 0x1, 0xbc,0x76,0x50,0x6, 0x29,0x76,0x0, 0x1, 0x80, +0x4, 0x29,0x77,0x0, 0x1, 0x39,0x76,0x0, 0x1, 0x7e,0x7b,0x60,0x7e,0x6b,0x70,0xbc, +0x76,0x50,0x5, 0x7e,0x6b,0x70,0x80,0x3, 0x7e,0x7b,0x70,0x7a,0x6b,0x70,0x80,0x31, +0x6c,0xff,0x74,0x6, 0xac,0xbf,0x9, 0xb5,0x32,0x52,0x30,0xe1,0x7, 0xb, 0xf0,0xbe, +0xf0,0x1e,0x40,0xee,0xbe,0xf0,0x1e,0x50,0x33,0x74,0x1, 0x39,0xb7,0x0, 0x4, 0x12, +0x9f,0xe9,0x7e,0x34,0x0, 0x6, 0xca,0x39,0x7f,0x17,0x7f,0x6, 0x12,0x17,0x2e,0x1b, +0xfd,0x12,0x9f,0xdf,0x44,0x1, 0x7a,0x1b,0xb0,0x12,0x9f,0xdf,0x44,0x2, 0x7a,0x1b, +0xb0,0x30,0x2, 0x8, 0x12,0x9f,0xdf,0x44,0x4, 0x7a,0x1b,0xb0,0xda,0x79,0x22,0x7f, +0x16,0x2e,0x34,0x0, 0x5, 0x7e,0x1b,0xb0,0x22,0x74,0x6, 0xac,0xbf,0x7d,0xd5,0x2e, +0xd4,0x32,0x4d,0x6d,0xcc,0x22,0x7e,0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0x7d,0xf5, +0x2e,0xf4,0x32,0x4d,0x6d,0xee,0x29,0xb7,0x0, 0x5, 0x22,0x7e,0x30,0x64,0x7e,0x20, +0x64,0x6c,0x11,0x80,0x4a,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80,0x38,0x7e,0x70,0x2, +0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0xa0,0x80,0x9, 0xb3,0x26,0xfa,0x12,0x2f,0x7f, +0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12,0xa0,0x80,0x9, 0xb3, +0x26,0xfb,0x12,0x2f,0x7f,0x7c,0x87,0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbc,0x28,0x28, +0x2, 0x7c,0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xc0,0xb, 0x10,0x7e, +0xb3,0x28,0x84,0xbc,0xb1,0x38,0xae,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64, +0x2, 0x6c,0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22, +0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x37,0x28,0x8a,0xbe,0x34,0x3, 0xe8, +0x8, 0xa, 0x12,0xa1,0x35,0xbe,0xb0,0x8, 0x48,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7c,0xfb,0x7f,0x61,0x7f,0x50,0x7e,0x34,0x19,0x20,0x7e,0x24,0x0, 0xff,0x7e,0x14, +0x1f,0x70,0x74,0x2a,0x12,0x16,0x1d,0x7e,0x48,0x1f,0x70,0x12,0xa0,0x88,0x92,0xc, +0x7c,0xbf,0x7e,0x71,0x54,0x12,0x2c,0xb9,0x7d,0x43,0xe5,0x55,0x7e,0x71,0x56,0x12, +0x2c,0xb9,0x2d,0x34,0xe, 0x34,0x7f,0x4, 0x7e,0x50,0x7, 0xb, 0xa, 0x50,0xbd,0x53, +0x58,0x10,0x69,0x30,0x0, 0x2, 0x1b,0x5a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x6a,0x30, +0x80,0x8, 0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe1,0x12,0xa1,0x2d,0x28,0x2b,0xb, +0x5a,0x20,0x7e,0x34,0x0, 0xd, 0xad,0x32,0x7e,0x24,0x0, 0x10,0x12,0x15,0x29,0x1b, +0x5a,0x30,0xb, 0x6a,0x30,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0xd, 0x12,0x15,0x6c, +0x7e,0x8, 0x0, 0x10,0x12,0x15,0xc8,0x1b,0x6a,0x30,0xda,0xf8,0x22,0x7e,0x73,0x31, +0xee,0xbe,0x70,0x5, 0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0xf, 0x7c, +0xbe,0x12,0x7e,0x27,0x7c,0xdb,0xbc,0xfd,0x58,0x2, 0x7c,0xfd,0xb, 0xe0,0x12,0x7d, +0xfd,0x38,0xec,0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xca,0x3b,0x7c,0x45,0x7c,0x6, +0x7c,0x57,0x7c,0x1b,0x7e,0x34,0x4, 0xfc,0x7e,0xb3,0x26,0x83,0x7e,0xf3,0x2a,0x8d, +0x7c,0x31,0x7c,0xe0,0x7c,0x25,0x7c,0xa4,0xbc,0x1, 0x50,0x4, 0x7c,0x30,0x7c,0xe1, +0xbc,0x45,0x50,0x4, 0x7c,0x24,0x7c,0xa5,0xbe,0xb0,0x1, 0x50,0x2, 0x41,0x1f,0x7e, +0x90,0x2, 0xac,0x9f,0x7e,0x50,0x2, 0xac,0x53,0x2d,0x24,0x2d,0x23,0xb, 0x28,0x20, +0x7e,0x10,0x2, 0xac,0x1e,0x2d,0x4, 0x2d,0x3, 0xb, 0x8, 0x40,0xa, 0x3, 0xb, 0x4, +0x7c,0x31,0x80,0x28,0x7e,0xd0,0x2, 0xac,0xdf,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x6, +0x12,0xa2,0x23,0x58,0x15,0xad,0xf4,0xbd,0xdf,0x58,0xf, 0xbe,0x24,0x0, 0x0, 0x8, +0x9, 0xbe,0x44,0x0, 0x0, 0x8, 0x3, 0xc3,0x80,0x46,0xb, 0x30,0xbc,0xe3,0x38,0xd4, +0x7e,0x50,0x2, 0xac,0x52,0x2d,0x23,0xb, 0x28,0x20,0x7e,0x90,0x2, 0xac,0x9a,0x2d, +0x43,0xb, 0x48,0x40,0xa, 0x12,0xb, 0x14,0x80,0x21,0x7e,0x10,0x2, 0xac,0x13,0x12, +0xa2,0x23,0x58,0x15,0xad,0xf4,0xbd,0xdf,0x58,0xf, 0xbe,0x24,0x0, 0x0, 0x8, 0x9, +0xbe,0x44,0x0, 0x0, 0x8, 0x3, 0xc3,0x80,0x7, 0xb, 0x30,0xbc,0xa3,0x38,0xdb,0xd3, +0xda,0x3b,0x22,0x2d,0x3, 0xb, 0x8, 0x0, 0x7e,0xf4,0x0, 0x9, 0x7d,0xb2,0xad,0xbf, +0x7e,0xd4,0x0, 0xa, 0xad,0xd0,0xbd,0xdb,0x22,0x12,0xa1,0x5a,0x92,0x4, 0x30,0x4, +0xc, 0x7e,0xb3,0x32,0x4c,0xbe,0xb0,0xfa,0x50,0x11,0x4, 0x80,0xa, 0x7e,0xb3,0x32, +0x4c,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a,0xb3,0x32,0x4c,0x7e,0xb3,0x32,0x4c,0x70, +0x2, 0xc3,0x22,0xd3,0x22,0x7e,0x8, 0x32,0x4d,0x7e,0x34,0x0, 0xb4,0xe4,0x2, 0x17, +0x53,0xca,0x79,0x7c,0xa7,0x7c,0x8b,0x7e,0xb3,0x2a,0x8e,0x7a,0xb3,0x1f,0x9a,0x7e, +0xb3,0x2a,0x8f,0x7a,0xb3,0x1f,0x9b,0x7e,0x70,0x2, 0xac,0x78,0x9, 0x93,0x26,0xfa, +0x9, 0x83,0x26,0xfb,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x61,0x29,0x7a,0xf1, +0x58,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d,0x32, +0x7c,0xb7,0xf5,0x58,0x7e,0xb3,0x1f,0x9a,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a,0x2f, +0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x58,0x1a,0x2a,0x1a,0x38,0x9d,0x32, +0x7c,0xb7,0xf5,0x57,0x80,0x43,0x85,0x57,0x59,0xe5,0x57,0xbe,0xb0,0x0, 0x58,0x10, +0xe5,0x57,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5,0x59, +0x7e,0xb3,0x1f,0x9b,0xbe,0xb1,0x57,0x18,0x10,0x1a,0x38,0xe5,0x57,0x1a,0x2b,0x9d, +0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x59,0xe5,0x58,0x7e,0x71,0x59,0x12,0x2c, +0xb9,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x5, 0x57,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5, +0x57,0x1a,0x3b,0xbd,0x32,0x8, 0xaf,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a, +0x3f,0xbd,0x32,0x18,0x2, 0x41,0x9e,0x7f,0x17,0xda,0x79,0x22,0x7c,0x4b,0x74,0x2, +0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc,0x75, +0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x90,0x60, +0x93,0xe4,0x93,0xa, 0xb, 0x7e,0x73,0x2a,0x90,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a, +0x8d,0xa, 0x3a,0xad,0x13,0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e, +0x4, 0x7e,0x7f,0x39,0xac,0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49, +0xf4,0x13,0x8e,0x9d,0xf, 0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a, +0x35,0x34,0x7e,0xf, 0x38,0x58,0x7e,0x18,0x25,0xb6,0x2, 0x65,0xaa,0x6c,0xaa,0x80, +0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x13,0xc6,0x49,0x32,0x13,0x8e,0xbd,0x31, +0x28,0x9, 0x2e,0x24,0x13,0x8e,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x2a, +0x8d,0xbc,0xba,0x38,0xdc,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9, +0xc5,0xea,0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x61,0x7e,0x73, +0x39,0xd8,0xbe,0x71,0x61,0x38,0x2, 0xd2,0x1b,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9, +0x34,0xe5,0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9, +0x33,0xe5,0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5, +0x3, 0xa9,0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8, +0x22,0x7e,0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55, +0x50,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44, +0x79,0x30,0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc, +0x79,0x30,0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c, +0x79,0x30,0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe, +0xb0,0x8, 0x50,0x3, 0x12,0xa4,0xaa,0xa9,0xd0,0xce,0xa9,0xc0,0xc9,0xd2,0x2, 0x12, +0x3b,0xe9,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75,0xc2,0xc, 0xd2,0x0, 0x12,0xa4,0xb3, +0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1,0x22,0xa, 0x5b,0x2e,0x54,0x0, 0x8, +0xf5,0xcc,0x22,0xa2,0x0, 0xa9,0x97,0xc1,0xa2,0x0, 0xa9,0x97,0xc2,0x22,0xa9,0xd0, +0xce,0xa2,0x0, 0xa9,0x95,0xc9,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12,0x7, 0xfb,0x7c, +0x7b,0x12,0x3a,0xb5,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e,0x24,0x0, 0xef, +0x7e,0xf, 0x39,0x93,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e,0xf, 0x39,0x93, +0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x39,0x93,0x79,0x20,0x0, 0x90, +0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x39,0x93,0x79,0x30,0x0, 0x86, +0x7e,0x34,0x29,0x90,0x7e,0xf, 0x39,0x93,0x79,0x30,0x0, 0x8a,0x7e,0x34,0x6a,0xd1, +0x7e,0xf, 0x39,0x93,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e,0xf, 0x39,0x93, +0x79,0x30,0x0, 0x8e,0x22,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86, +0xa9,0xc2,0xeb,0xa9,0xd2,0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, +0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7, +0x0, 0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0, +0xf7,0xd2,0xf8,0xa9,0xc1,0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7, +0xc2,0xbe,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e,0x37,0x39,0xd6,0xb, 0x34, +0x7a,0x37,0x39,0xd6,0xbe,0x34,0xff,0x0, 0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37, +0x39,0xd6,0x22,0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5, +0x1, 0x6c,0xaa,0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0x65,0xa0,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xed,0xc2,0xc9,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24, +0xbd,0x32,0x38,0xe9,0x22,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c,0x11,0x80,0x46, +0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, 0x20,0xa, 0x33, +0x9d,0x32,0x12,0x17,0x85,0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74,0x26,0xfa,0xa, +0x27,0xa, 0x32,0x9d,0x32,0x12,0x17,0x85,0x7c,0x97,0xbe,0x90,0x1, 0x18,0x8, 0xbe, +0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe,0x0, 0x2, 0x18, +0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18,0xb2,0x22,0x7f, +0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xa6,0xa9,0xb, 0x7a,0x20,0x2d,0x25,0x1b, +0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x1e,0x34, +0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d,0x53,0x7c,0xab, +0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x2d,0x25,0x79, +0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x51,0x7f,0x1e,0x34, +0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0xa7,0x27,0x7e,0xa3,0x2a,0x92, +0x7e,0x63,0x2a,0x93,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x72,0x2a,0xfb,0xbe,0x70, +0x1c,0x50,0x11,0xa, 0x27,0x12,0x57,0xdb,0x7c,0x7b,0x7e,0xb3,0x2b,0x1a,0xa, 0x27, +0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xde,0x6c,0xee,0x80,0x17,0xa, 0x3e, +0x9, 0x73,0x2a,0xd8,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2b,0x1a,0xa, 0x27,0x19, +0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e,0x30,0xe, 0xac,0x3e, +0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xf8,0xb, 0xe0,0xbe, +0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, 0x17,0x53, +0x7c,0xab,0x9f,0x11,0x30,0x0, 0x22,0x6c,0x99,0x80,0x1a,0xa, 0xf9,0x2d,0xf1,0x7d, +0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77,0x14,0x78,0xfb,0x4d, +0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8,0x90,0x60,0x51,0xe4, +0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0xa7,0xe6,0x7e,0x8, 0x1f,0x3c,0x12,0xa7, +0xee,0xd2,0x0, 0x7e,0x8, 0x2a,0xfb,0x7c,0xbf,0x12,0xa7,0x30,0x7e,0x8, 0x1f,0x34, +0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32,0x7a,0x37,0x1f,0x5e, +0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, 0x12,0xa9,0x45,0x50, +0x7, 0x12,0xa9,0x3c,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7,0x38,0xee,0x12,0xa7, +0xd3,0xe4,0x12,0xa7,0xdb,0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a,0x37,0x1f,0x5c,0x7a, +0x37,0x1f,0x5e,0x12,0xa7,0xd3,0x74,0x1, 0x12,0xa7,0xdb,0x74,0x1, 0x12,0xc, 0x9b, +0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12,0xc, 0x9b,0xa9,0xd6, +0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x17,0x53,0x7e,0x34, +0x0, 0x1c,0x74,0x3f,0x2, 0x17,0x53,0x7c,0x57,0x7c,0xab,0x6c,0x77,0x80,0x4b,0xa, +0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46,0x2e,0x44,0x16,0xe8,0x12, +0xa8,0xb6,0x7c,0x6b,0xbe,0x60,0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60, +0x5, 0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4, +0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5, +0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xb1,0x6c,0x77, +0x80,0x58,0xa, 0x27,0x7f,0x70,0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11, +0x12,0xa8,0xaf,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80, +0x2f,0xbe,0x60,0x1b,0x38,0x16,0x9e,0x60,0xe, 0x12,0xa8,0xaf,0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12, +0xa8,0xaf,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, +0xb, 0x7a,0x20,0x4d,0x24,0x1b,0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e, +0x44,0x0, 0x1, 0x7c,0xb6,0x22,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x22,0x7c, +0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa,0x80, +0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38,0x5, +0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e, +0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0x8, 0x1f,0x34,0x12,0xa7,0xee,0x6c,0x77,0x80, +0xe, 0x12,0xa9,0x45,0x50,0x7, 0x12,0xa9,0x3c,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e, +0x53,0x2a,0x8d,0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12, +0x11,0x38,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52, +0x2b,0x63,0xa, 0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xfb,0xbe,0x60,0x1c,0x22,0x7e, +0x43,0x2a,0x8d,0x7e,0x53,0x2a,0x8c,0xac,0x54,0x7e,0x17,0x28,0xa1,0x12,0x8f,0xc3, +0x6d,0x0, 0x80,0x37,0x7d,0x40,0x3e,0x44,0x7e,0x7f,0x39,0xac,0x2d,0xf4,0xb, 0x7a, +0x30,0xbd,0x13,0x58,0x10,0x7d,0xf4,0x2e,0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51, +0x1b,0xf8,0x50,0x80,0x14,0x6d,0x55,0x9d,0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, +0xa, 0xb, 0x48,0x50,0x2d,0x51,0x1b,0x48,0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x5, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x7, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x93,0xa, 0xb, 0x7e,0xb3,0x2a,0x92,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0xe4,0x7a,0xb3,0x39,0xb0,0x22,0x7e,0xb3,0x38,0x38,0x70, +0x6, 0x12,0xaa,0x64,0x2, 0xaa,0x25,0x12,0xaa,0x6a,0x12,0xaf,0x54,0x50,0xa, 0x12, +0xad,0xc2,0x7c,0x3b,0x12,0xaa,0x64,0x80,0x5, 0x12,0xac,0x67,0x7c,0x3b,0x4c,0x33, +0x68,0x11,0x7c,0xb3,0x12,0xae,0xd1,0x60,0xa, 0x7a,0x33,0x38,0x3b,0x74,0x1, 0x7a, +0xb3,0x2a,0x26,0x22,0xe4,0x7a,0xb3,0x2f,0x9f,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x20, +0x7e,0xb3,0x2a,0x21,0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47, +0x28,0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x9f,0x4c,0xff, +0x68,0x17,0x7e,0x47,0x2b,0xd6,0x4d,0x44,0x78,0xf, 0x12,0xaf,0x4d,0x74,0x1, 0x7a, +0xb3,0x39,0x58,0x7a,0xb3,0x38,0xd, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33, +0x7e,0x37,0x2b,0xd6,0x7a,0x37,0x2f,0xa1,0x7e,0xb3,0x2f,0x9f,0xb4,0x3, 0x1f,0x7e, +0x37,0x2b,0xd6,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x9f,0x7e, +0x37,0x2f,0xb7,0x7e,0x27,0x2f,0xb9,0x12,0xab,0x7b,0x61,0x74,0x80,0x0, 0x12,0xaf, +0x5f,0x61,0x74,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70, +0x57,0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xae,0x6c,0x12,0xab,0x77, +0x74,0x1, 0x7a,0xb3,0x2f,0x9f,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f, +0xa7,0x9e,0x27,0x2f,0xaf,0x7e,0x14,0x62,0xa1,0x12,0xac,0x26,0xbd,0x23,0x38,0x13, +0x7e,0x27,0x2f,0xb5,0x9e,0x27,0x2f,0xad,0x7e,0x14,0x62,0xa3,0x12,0xac,0x26,0xbd, +0x23,0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x9f,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, +0x7a,0xc7,0x2f,0xb7,0x7a,0xd7,0x2f,0xb9,0x7e,0xb3,0x2f,0x9f,0x60,0x26,0x7d,0x3c, +0x7d,0x2d,0x7e,0x17,0x2b,0xda,0x7e,0x7, 0x2b,0xdc,0x12,0xae,0x50,0xa, 0x2b,0x7e, +0x73,0x2f,0x9e,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0xab,0x77,0x7a,0xc7,0x2b,0xda, +0x7a,0xd7,0x2b,0xdc,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d, +0x24,0x12,0xaf,0x6b,0x7d,0x31,0x12,0xad,0xdb,0x2, 0xab,0x8c,0x7e,0x3, 0x2f,0xc7, +0xbe,0x0, 0xf0,0x50,0x2, 0x81,0x25,0x81,0x1a,0x6c,0x99,0x7e,0xb3,0x2f,0x9e,0xbe, +0xb0,0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x9e,0x7e,0x1f,0x2b,0xde,0x7a,0x1f,0x1f, +0x34,0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xde,0x49,0x25, +0x2b,0xe0,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0xae,0x50,0x7c,0x1b,0x7e, +0x3, 0x2f,0x9e,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34, +0x2b,0xde,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x15,0xfc,0x7e,0x34,0x1f,0x34,0x7e, +0x30,0x4, 0xac,0x39,0x2e,0x14,0x2b,0xde,0x74,0x4, 0x12,0x15,0xfc,0xb, 0x80,0x7e, +0x3, 0x2f,0xc7,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f, +0xc7,0x7e,0x3, 0x2f,0x9e,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xc7,0xbe,0x0, +0xec,0x40,0x2, 0x61,0x99,0x22,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0x13, +0x7e,0x54,0x62,0x6f,0x12,0xac,0x5d,0x50,0x21,0x7e,0x54,0x62,0x71,0x12,0xac,0x5d, +0x28,0x18,0x7e,0x14,0x62,0x73,0x12,0xac,0x26,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62, +0x75,0x12,0xac,0x26,0xbd,0x32,0x28,0x2, 0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, +0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d, +0xed,0x7d,0xfd,0x7e,0xd3,0x2a,0x20,0x7e,0xe3,0x2a,0x21,0x7e,0xb3,0x39,0xb0,0x60, +0x11,0x7e,0xc7,0x39,0xb9,0x4d,0xcc,0x78,0x2, 0xa1,0x5b,0xbe,0xd0,0x1, 0x28,0x2, +0xa1,0x5b,0xbe,0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xa1,0x5b,0x7e,0xe7, +0x29,0x8, 0x7e,0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0xac,0x2e,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x5b,0x7e,0xa3,0x39,0xb0,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54, +0x14,0x68,0x23,0x14,0x78,0x2, 0xa1,0x58,0xb, 0xb2,0x68,0x2, 0xa1,0x5b,0xbe,0xd0, +0x1, 0x68,0x2, 0xa1,0x6a,0x4c,0xee,0x68,0x2, 0xa1,0x6a,0x74,0x1, 0x7a,0xb3,0x39, +0xb0,0x12,0xad,0x79,0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74, +0x2, 0x7a,0xb3,0x39,0xb0,0x7e,0x34,0x62,0x7b,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x39, +0xb0,0x7e,0x34,0x62,0x7f,0x80,0x48,0x12,0xad,0x82,0x90,0x62,0x6e,0x12,0xad,0x8b, +0x68,0x49,0x80,0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xad,0x82, +0x7e,0x34,0x62,0x77,0x12,0xad,0x71,0x7e,0x14,0x62,0x7b,0x7e,0x4, 0x0, 0xff,0xb, +0xa, 0xc0,0x9d,0xc3,0xbe,0xc7,0x39,0xb9,0x40,0x21,0x90,0x62,0x6d,0x12,0xad,0x8b, +0x68,0x19,0x12,0xad,0x79,0x74,0x3, 0x7a,0xb3,0x39,0xb0,0x7e,0x34,0x62,0x7b,0x12, +0xad,0x71,0x7a,0x37,0x39,0xb9,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x39,0xb0, +0x6d,0x33,0x7a,0x37,0x39,0xb9,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8, +0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7a,0xe7,0x39,0xb1,0x7a,0xf7,0x39, +0xb3,0x22,0x7a,0xe7,0x39,0xb5,0x7a,0xf7,0x39,0xb7,0x22,0xe4,0x93,0xa, 0x3b,0x12, +0xad,0x97,0xa, 0xdb,0x4d,0xdd,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x7e, +0x37,0x39,0xb5,0x9e,0x37,0x39,0xb1,0x12,0x17,0x85,0xbd,0x31,0x38,0x12,0x7e,0x37, +0x39,0xb7,0x9e,0x37,0x39,0xb3,0x12,0x17,0x85,0xbd,0x31,0x38,0x3, 0x74,0x1, 0x22, +0xe4,0x22,0x12,0xae,0x47,0x7a,0x37,0x2f,0xbb,0x12,0xad,0xd2,0x7a,0x37,0x2f,0xbd, +0xe4,0x22,0x7e,0x37,0x2f,0xb5,0x9e,0x37,0x2f,0xad,0x22,0x7e,0x17,0x2f,0xaf,0xbd, +0x13,0x28,0xa, 0x7a,0x37,0x2f,0xaf,0x7a,0x27,0x2f,0xb1,0x80,0x10,0x7e,0x17,0x2f, +0xa7,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0xa7,0x7a,0x27,0x2f,0xa9,0x7e,0x17,0x2f, +0xad,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0xad,0x7a,0x37,0x2f,0xab,0x80,0x10,0x7e, +0x17,0x2f,0xb5,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0xb5,0x7a,0x37,0x2f,0xb3,0x7e, +0xb3,0x2f,0xc7,0xb4,0xa, 0xf, 0x12,0xae,0x47,0x7a,0x37,0x2f,0xbf,0x12,0xad,0xd2, +0x7a,0x37,0x2f,0xc1,0x22,0xb4,0x14,0xe, 0x12,0xae,0x47,0x7a,0x37,0x2f,0xc3,0x12, +0xad,0xd2,0x7a,0x37,0x2f,0xc5,0x22,0x7e,0x37,0x2f,0xa7,0x9e,0x37,0x2f,0xaf,0x22, +0x7d,0x51,0x7d,0x12,0x9d,0x35,0x12,0x17,0x85,0x7c,0xa7,0x7d,0x31,0x9d,0x30,0x12, +0x17,0x85,0x7c,0xb7,0xbc,0xba,0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0xf2,0x7d,0xe3, +0x7e,0x8, 0x2f,0x9f,0x7e,0x34,0x0, 0x28,0xe4,0x12,0x17,0x53,0x7e,0x8, 0x2b,0xde, +0x7e,0x34,0x3, 0xc0,0x12,0x17,0x53,0x7a,0xb3,0x38,0x3b,0x7e,0x34,0x62,0xa5,0x12, +0xad,0x71,0x7a,0x37,0x2b,0xd6,0x7a,0xe7,0x2f,0xa3,0x7a,0xf7,0x2f,0xa5,0x7a,0xe7, +0x2f,0xa7,0x7a,0xe7,0x2f,0xab,0x7a,0xe7,0x2f,0xaf,0x7a,0xe7,0x2f,0xb3,0x7a,0xf7, +0x2f,0xa9,0x7a,0xf7,0x2f,0xad,0x7a,0xf7,0x2f,0xb1,0x7a,0xf7,0x2f,0xb5,0x7a,0xe7, +0x2b,0xda,0x7a,0xf7,0x2b,0xdc,0x7a,0xb3,0x2f,0xc7,0x74,0x2, 0x7a,0xb3,0x2f,0x9e, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x39,0xce,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x38,0x39,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xaf,0x44, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x39,0xcf,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x38,0x3a,0x80,0x1a,0x12,0xaf,0x44,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x39,0xce,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x38,0x3b,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x6d,0x33,0x7a, +0x37,0x39,0x56,0x22,0x7e,0xb3,0x2f,0x9f,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x74, +0xfe,0x7a,0xb3,0x38,0x3b,0xe4,0x7a,0xb3,0x2f,0x9f,0x22,0x7e,0xa3,0x2f,0xc7,0xbe, +0xa0,0xf0,0x50,0x1b,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xde,0x7e,0xa3,0x2f,0xc7,0x74, +0x4, 0xa4,0x59,0x25,0x2b,0xe0,0x7e,0xb3,0x2f,0xc7,0x4, 0x7a,0xb3,0x2f,0xc7,0x22, +0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x28,0xa1,0x7e,0x34,0x0, 0x2, 0x7a,0x37,0x28,0xa3, +0x22,0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0xf5,0x26,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x19,0xb4,0x1f,0x50,0x22,0xa, 0x47,0x7f,0x70,0x2d, +0xf4,0x7e,0x7b,0x60,0x22,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x26,0xfa,0x22,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22, +0x7e,0x50,0x9, 0xac,0x5a,0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f, +0x6, 0x2d,0x12,0x22,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7f,0x6, 0x2d,0x12, +0x79,0x40,0x0, 0x28,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x34,0x8a,0x22,0x7e,0x73, +0x38,0xd5,0x7a,0x73,0x2b,0x3f,0x22,0x7d,0x2e,0x12,0x15,0x29,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x7e,0x34,0x0, 0xc8,0x2, 0x1a,0x15,0x7e,0x50, +0x2, 0xac,0x5a,0x3e,0x24,0x22,0xb0,0x36,0x4f,0xc9,0xa0,0x5f,0xb, 0x51, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_ili.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_ili.txt new file mode 100644 index 0000000000000..e9262ef468551 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_ili.txt @@ -0,0 +1,3091 @@ +0x2, 0x1f,0xd2,0x2, 0xb5,0x8a,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x42,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x70,0x2d,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x7d,0x45,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x32,0x2, 0x7d,0xa4,0xe4,0x2, 0x29,0xfa,0x22,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xa2,0x13,0x22,0x32,0xff,0x2, 0x0, 0x69,0x2, 0x31, +0xb3,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x38,0xc8, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x38,0xd8,0x7e,0x73,0x38,0xd8,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x7f,0x5, 0x7e,0x1f,0x38,0xc8,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x38,0xc8,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x38,0xcc,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x38,0xd4,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x38,0xd2,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf7,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0xb7,0x9d,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d,0xe2,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xb2,0x61,0x3f,0x7e,0x34,0x1d,0x96,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xc6,0x61,0x3f,0x7e,0x34,0x1e,0xa, 0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d, +0xf1,0x61,0x3f,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x69,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x6a,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xc8,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x38,0xc8,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x20,0xde,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x38,0xc0,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf7,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x38,0xc0,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xb9,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x38,0xc8,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x39,0xd, 0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x86,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x39,0xd, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x39,0xd, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x39,0xd, 0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xf3,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xf3,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xc0,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x38,0xc8,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x38, +0xc8,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x38,0xc8,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x38,0xc8,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x38,0xc8,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x38, +0xc8,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x38,0xc8, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x38,0xc8,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x38,0xc8,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x38,0xc8,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xb9,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xb9,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xf3,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xf3,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x39, +0xd, 0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x38,0xc8, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x38,0xc8,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x39,0xd, 0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x39,0xd, 0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x39,0xd, 0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf7,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xf2,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf7,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf7,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x39, +0xd, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x39,0xd, 0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x39,0xd, 0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x58,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1e,0xeb,0x7d,0x1e,0x12,0x1f,0x5, 0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x38,0xc8,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf7,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xf2,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf7,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x7f,0x5, 0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x38,0xc0,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc8,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x38,0xd8,0x7e,0x1f,0x38,0xc0, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xf3,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x39,0xd, 0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x20,0x8f,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x20,0x90,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e, +0x1f,0x38,0xc0,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x38,0xc0,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x38,0xc8,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x6, 0xe, 0x15,0x1a,0x1f,0x26,0x2b,0x2d,0x2e,0x2f, +0x2c,0x2a,0x24,0x1f,0x1a,0x14,0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10,0x15,0x1c,0x22, +0x28,0x2d,0x34,0x39,0x3d,0x40,0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x11,0x16, +0x1c,0x23,0x2b,0x32,0x37,0x3c,0x40,0x45,0x4a,0x4d,0x4c,0x4b,0x4a,0x48,0x46,0x46, +0x45,0x45,0x44,0x44,0x43,0x44,0x45,0x78,0x65,0x55,0x2, 0xd, 0x14,0x1b,0x21,0x25, +0x2b,0x31,0x37,0x36,0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, +0x10,0x18,0x1e,0x23,0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40, +0x3f,0x3e,0x3d,0x3d,0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29, +0x27,0x1e,0x14,0x11,0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21, +0x2b,0x32,0x30,0x2a,0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, +0x10,0x19,0x23,0x2d,0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71, +0x50,0x55,0x28,0x12,0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39, +0x31,0x28,0x1e,0x15,0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32, +0x37,0x39,0x20,0x29,0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, +0x1, 0x0, 0x1, 0x5, 0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c, +0x34,0x31,0x26,0xcb,0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31, +0x2e,0x2d,0x35,0x3d,0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, +0x10,0x1b,0x24,0x2f,0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d, +0x28,0x31,0x34,0x2a,0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40, +0x47,0x47,0x44,0x3c,0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b, +0x22,0x2d,0x30,0x2e,0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, +0x0, 0x0, 0x3, 0xb, 0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26, +0x1b,0x14,0x1c,0x25,0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c, +0x25,0x30,0x38,0x40,0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c, +0x29,0x1e,0x14,0x13,0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39, +0x30,0x25,0x1b,0x10,0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a, +0x23,0x2f,0x33,0x29,0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, +0x2, 0x0, 0x1, 0x8, 0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e, +0x50,0x55,0x16,0x2b,0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36, +0x3b,0x3d,0x3b,0x37,0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33, +0x3d,0x3f,0x13,0x21,0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37, +0x2d,0x22,0x18,0xc, 0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38, +0x2e,0x2a,0x31,0x62,0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, +0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26, +0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b, +0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48, +0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x9, 0x17,0x1d,0x26,0x2e,0x37, +0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, +0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30,0x2f,0x2c,0x26,0x1e, +0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c,0x32,0x3a,0x41,0x48, +0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c,0x33,0x55,0x26,0x1c, +0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18,0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, +0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44,0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49, +0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f,0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54, +0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c, +0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22,0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c, +0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a,0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32, +0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, +0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22, +0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, 0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39, +0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68,0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70, +0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80,0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10, +0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, +0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39,0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24, +0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50,0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff, +0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a,0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, +0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22, +0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33,0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29, +0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d,0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26, +0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10,0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b, +0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19, +0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22,0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39, +0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34,0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, +0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18,0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37, +0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e, +0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21, +0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c, +0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, +0x0, 0x2, 0x5, 0x9, 0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f, +0x3d,0x38,0x30,0x27,0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36, +0x3f,0x49,0x53,0x5c,0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b, +0x15,0xb, 0x4, 0x0, 0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c, +0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, +0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, +0x8, 0xe, 0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58, +0x51,0x48,0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf, +0x30,0x55,0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28, +0x30,0x38,0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16, +0xf, 0xc, 0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, +0x3, 0xa, 0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a, +0x58,0x57,0xc6,0x55,0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38, +0x3c,0x3e,0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, +0xd, 0x17,0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57, +0x4f,0x47,0x40,0x38,0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, +0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f, +0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22, +0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25, +0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f, +0x3d,0x3a,0x36,0x2e,0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0x9, 0xe, 0x14,0x1c,0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a, +0x10,0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47, +0x4f,0x56,0x5a,0x5b,0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9, +0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e, +0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25, +0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25, +0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d, +0x3a,0x34,0x2d,0x27,0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, +0xa, 0xf, 0x15,0x1b,0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11, +0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36, +0x3c,0x42,0x47,0x48,0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29, +0x22,0x1b,0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c, +0x24,0x2a,0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, +0x4, 0x7, 0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b, +0x38,0x31,0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35, +0x3d,0x45,0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17, +0x11,0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6, +0x30,0x55,0xa, 0x5, 0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3c,0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, +0x1, 0x2, 0x35,0x46,0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37, +0x2e,0x25,0x1e,0x16,0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39, +0x41,0x45,0xf0,0xbc,0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28, +0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, +0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d, +0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19, +0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36, +0x2f,0x27,0x21,0x19,0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, +0x16,0x1f,0x26,0x2d,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d, +0x56,0x59,0x5a,0x58,0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, +0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38, +0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40, +0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3, +0x30,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, +0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f, +0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40, +0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32, +0x39,0x3e,0x7, 0x90,0x30,0x55,0x39,0x2b,0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, +0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b,0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f, +0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24, +0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b,0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65, +0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a,0x46,0x55,0x0, 0x1, 0x3, 0x5, 0x7, 0x8, +0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22,0x24,0x27,0x2a,0x2c, +0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, 0x14,0x1b,0x23,0x28, +0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53,0x4e,0x47,0x40,0x3b, +0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x1f,0x7, 0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x1f,0x7, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0x13,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x4c,0x0, 0xc2,0x14,0x75,0x4d,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x4e,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x21,0x10,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x36,0x72,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xd0,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33,0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0x9b,0x0, 0x0, 0x2, 0x37,0xed,0x0, 0x0, 0x0, 0x2, 0x37, +0xef,0x0, 0x0, 0x0, 0x1, 0x37,0xf1,0x0, 0x0, 0x1, 0x34,0x4f,0x0, 0x0, 0x1, 0x39, +0x11,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x2, 0x34,0x9f,0x0, 0x0, 0x0, 0x1, 0x34, +0xa1,0x0, 0x0, 0x1, 0x34,0xaf,0x0, 0x0, 0x1, 0x34,0xc4,0x0, 0x0, 0x1, 0x34,0xc5, +0x0, 0x0, 0x1, 0x35,0x3e,0x0, 0x0, 0x1, 0x35,0x3f,0x1, 0x0, 0x1, 0x35,0x40,0x0, +0x0, 0x3c,0x35,0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x36,0x61,0x0, 0x0, 0x1, 0x36,0x62,0x0, 0x0, 0x1, 0x36,0x63,0x0, 0x0, +0x1, 0x35,0xe2,0x1, 0x0, 0x2, 0x35,0xe5,0x0, 0x0, 0x0, 0x1, 0x2f,0xa9,0x0, 0x0, +0x1, 0x2f,0xaa,0x0, 0x0, 0x1, 0x2f,0xab,0x0, 0x0, 0x1, 0x2f,0xac,0x0, 0x0, 0x1, +0x36,0x66,0x1, 0x0, 0x1, 0x36,0xe0,0x0, 0x0, 0x1, 0x39,0x12,0x0, 0x0, 0x6, 0x38, +0xfb,0x3f,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x39,0x1, 0x24,0x0, 0x1, 0x39,0x8, +0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x1, 0x39,0xb, 0x0, +0x0, 0x1, 0x39,0xc, 0x0, 0x0, 0x1, 0x0, 0x4f,0x0, 0x0, 0x1, 0x3, 0xec,0x0, 0x0, +0x4, 0x37,0x40,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39,0x3, +0x0, 0x0, 0x2, 0x39,0x4, 0x0, 0x0, 0x0, 0x1, 0x39,0x6, 0x64,0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x39,0x13,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x2, 0x2b,0xb9,0x2b,0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, +0x0, 0x1, 0x38,0xdd,0x0, 0x0, 0x1, 0x38,0x3e,0xff,0x0, 0x1, 0x38,0x3f,0x0, 0x0, +0x1, 0x38,0x40,0x0, 0x0, 0x1, 0x38,0x41,0x40,0x0, 0x1, 0x38,0x42,0x40,0x0, 0x4, +0x38,0xf3,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf7,0x0, 0x0, 0x64,0x0, 0x0, 0x4, +0x38,0xc0,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x38,0xc4,0x0, 0x0, 0x68,0xc0,0x0, 0x4, +0x38,0xc8,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x38,0xd9,0x0, 0x0, 0x40,0x0, 0x0, 0x4, +0x39,0xd, 0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58, +0x0, 0xc, 0x1, 0x5e,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78, +0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, +0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, +0x0, 0x1e,0x12,0x3f,0x13,0x12,0x69,0x8e,0x12,0x23,0xb, 0x12,0x28,0x48,0x12,0x8d, +0xec,0x2, 0x23,0x4, 0x74,0x1, 0x7a,0xb3,0x36,0x6a,0x22,0x12,0x73,0x71,0x12,0x23, +0x40,0x2, 0x23,0x14,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x1d,0x7d,0x43,0x7e, +0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34, +0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22, +0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x23,0x1d,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, +0x7a,0x2, 0x23,0x1d,0x7e,0x34,0x60,0xa3,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x46, +0xa2,0x12,0x73,0x28,0x12,0x3f,0x13,0x12,0x69,0x87,0x12,0xc0,0x5, 0x12,0x23,0xb, +0x12,0x28,0x48,0x12,0x68,0x23,0x12,0x8d,0xec,0x2, 0x23,0x4, 0x7e,0x34,0x61,0x4f, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x7a,0x37,0x28, +0x95,0x7e,0x34,0x61,0xba,0x12,0x23,0x9e,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8, +0x12,0x23,0x9e,0x7a,0x37,0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0x9e,0x7a,0x37, +0x28,0x9b,0x7e,0x34,0x61,0xbc,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61, +0xbe,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0x9e,0x12, +0xc0,0x87,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x20,0xde,0x12,0x25,0xc3,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0x9e, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0x9e,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x3c,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0xb7,0x9d,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x36, +0xe1,0x7e,0x34,0x61,0x51,0x12,0x23,0x9e,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x36,0xe2, +0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe3,0x7e,0x34, +0x61,0x57,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe4,0x7e,0x34,0x61,0x59, +0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe5,0x7e,0x34,0x61,0x5b,0x12,0x23, +0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe6,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x36,0xe7,0x12,0x20,0xb9,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x37,0x12,0xe5,0x28,0x7a,0xb3,0x37,0x1, 0x22,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a,0x4d,0x90,0x60, +0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0xc0, +0x7e,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93, +0x7a,0xb3,0x2a,0x59,0x12,0x23,0x7c,0x12,0xc0,0x35,0x7e,0x34,0x62,0x12,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60, +0xa0,0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3, +0x16,0x92,0x22,0x12,0x23,0x7c,0x12,0xc0,0x35,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e, +0x12,0xc0,0x7e,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x37,0xa0,0xbe,0xf0,0x5, 0x78, +0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78, +0x13,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12,0x26,0x5b,0xe4,0x7a,0xb3,0x2b,0x2, 0x12, +0x7a,0x2d,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x49,0xd, 0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x69,0xab,0x12,0xc0,0xd7, +0x80,0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12,0x26,0x5b, +0x12,0x2f,0xf4,0x50,0xfb,0x12,0x88,0x17,0x12,0x69,0x97,0x12,0x28,0x48,0x74,0x2, +0x7a,0xb3,0x37,0xa0,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3, +0xed,0x7a,0x37,0x3, 0xef,0x22,0x7e,0xb3,0x37,0x6, 0x14,0x68,0x60,0x14,0x78,0x2, +0xe1,0x10,0x14,0x68,0x73,0x24,0x3, 0x68,0x2, 0xe1,0x5, 0x12,0xc1,0xf, 0x38,0x8, +0x30,0x10,0xf, 0x12,0xc1,0x7, 0x68,0xa, 0x12,0x63,0x2, 0xe4,0x7a,0xb3,0x38,0x85, +0x80,0x7e,0x7e,0xb3,0x36,0xe7,0x30,0xe0,0x77,0x7e,0x73,0x36,0xe8,0xa, 0x27,0x7e, +0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64, +0x12,0x23,0x9e,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x83,0x50,0x53,0x12,0x63,0x2, +0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x38,0x87,0x80,0x43,0x12,0xc1,0xf, +0x28,0x39,0xe4,0x7a,0xb3,0x37,0x6, 0x7e,0xb3,0x38,0x85,0xb4,0x1, 0x6, 0x74,0x1, +0x7a,0xb3,0x37,0x6, 0xd2,0x17,0x80,0x23,0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x45,0x73,0x12,0x23,0x54,0xe4,0x7a,0xb3,0x37,0x6, 0x7a,0xb3,0x39, +0x7, 0xd2,0x17,0x80,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x39,0x7, +0x12,0x90,0xd2,0x2, 0x27,0x16,0xca,0xd8,0xca,0x79,0x7e,0xb3,0x37,0x6, 0xb4,0x1, +0x2, 0x80,0x3, 0x2, 0x28,0x38,0x6c,0xdd,0x6c,0xff,0x12,0x91,0x11,0x7d,0xf3,0x12, +0x2f,0xf4,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x38,0x86,0x12,0x3d,0xac,0x12,0x13,0xc7, +0x12,0x0, 0x1e,0x74,0xa, 0x12,0x45,0x15,0x12,0xc0,0xbd,0x7e,0xe7,0x2b,0xd, 0x7a, +0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3,0x2a,0xfa,0x7e,0xe7,0x2b,0xd, +0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3,0x2a,0xfa,0x12,0x7b,0xd0,0x7c, +0x7b,0x74,0x6, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x1e,0xb9,0x7d,0x23,0x7d,0x3f, +0x12,0x25,0x3c,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12,0x4e,0xe0,0x12,0x26,0x57,0x7e, +0xb3,0x37,0x31,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, 0x74,0xa, 0x12,0x91,0x5d,0x12, +0x4f,0xaf,0x80,0xf, 0x80,0x7, 0x12,0x45,0xcf,0xe4,0x12,0x46,0x7, 0x20,0x93,0xf6, +0x12,0x45,0x9f,0x30,0x18,0xf7,0x30,0x17,0xf4,0xd2,0x4, 0x12,0x45,0x5a,0xe4,0x12, +0x13,0xde,0xb, 0xd0,0x12,0x4c,0x83,0x12,0x91,0x76,0x7e,0xa3,0x38,0x85,0x4c,0xaa, +0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x86,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x31, +0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x85,0x12,0x28,0x3d,0x78,0x18,0x7e,0xb3,0x38,0x85, +0x60,0x12,0xe4,0x7a,0xb3,0x38,0x85,0x7a,0xb3,0x2a,0x2, 0x7a,0xb3,0x2a,0x3, 0x7e, +0xf0,0x1, 0x80,0x1d,0x12,0x28,0x3d,0x68,0x10,0x7e,0xb3,0x38,0x85,0x70,0xa, 0x7e, +0xf0,0x1, 0xe4,0x7a,0xb3,0x37,0x6, 0x80,0x8, 0xbe,0xd0,0x32,0x50,0x3, 0x2, 0x27, +0x8c,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a,0x37,0x2b,0xd, 0x7a,0xe3,0x2a, +0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x48,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x38, +0xf2,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34, +0x39,0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34, +0x3a,0x22,0xca,0x3b,0x12,0x2f,0xf4,0x50,0xfb,0x7e,0xf3,0x2b,0xf, 0x7c,0xbf,0x12, +0xb3,0xd2,0x12,0xb3,0xe9,0x7e,0xb3,0x2b,0x1f,0xf5,0x28,0x7e,0xb3,0x2b,0x20,0xf5, +0x29,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0xf, 0x12,0x8d,0x6c,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x28,0x48,0xc3,0x21,0x6c,0x12,0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x7, 0x12,0xab,0xfd,0x7a,0x37,0x37,0xe3,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x69,0x8e,0x12,0xab,0xeb,0x7e,0xc3,0x3, 0xec,0x12,0x6e,0x31, +0xe4,0x12,0x13,0xde,0x12,0x28,0x48,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x2a,0x7e,0x18, +0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x7a,0xc8,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x2a, +0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x7a,0xc8,0x7e,0xd3,0x2b,0x1f,0x7e, +0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5,0x29,0x12,0x6e,0x8b,0x50,0x5, +0x7c,0xbc,0x12,0xb3,0x2a,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d, +0x10,0x12,0x6a,0xd4,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3,0x2b,0x20,0x7c,0xbf,0x12,0x86, +0xf8,0x12,0xa9,0xf5,0x7e,0xb3,0x39,0x7, 0x4, 0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39, +0x7, 0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x7, 0x7e,0xb3,0x16,0x90, +0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e, +0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, 0x37,0x2d,0x32,0x22,0x12,0x48, +0x7, 0x7e,0xb3,0x37,0x8, 0xb4,0x3, 0x6c,0x12,0xb6,0xb8,0x12,0x26,0x57,0x12,0x3f, +0xfb,0x7e,0xb3,0x37,0x9c,0x30,0xe7,0xe9,0x12,0x28,0x62,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18,0x12,0xab,0xb8,0x12,0x75,0xe9, +0x12,0xaf,0x66,0x12,0xa7,0xbd,0x12,0x88,0x5f,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x58,0x52,0x12,0x48,0x39,0x12,0x3a,0x9f,0x7e,0xb3,0x37,0x9c,0x54,0x7f,0x7a,0xb3, +0x37,0x9c,0x80,0x8d,0x12,0x2f,0xee,0x2, 0x0, 0x46,0x7a,0xb3,0x2b,0x2, 0x7a,0xb3, +0x2b,0x1e,0x22,0x12,0x52,0x6d,0x12,0x2b,0xfa,0x12,0x2b,0xfa,0x12,0x36,0xac,0x12, +0x9c,0xfd,0x12,0x9f,0xef,0x12,0x2b,0xfa,0x12,0x9b,0xe7,0x12,0x2b,0xfa,0x12,0xa0, +0xae,0x12,0x2b,0xfa,0x2, 0x2a,0x27,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c,0xdd, +0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x25,0x7e,0x8, 0x35,0xe9,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18,0x26, +0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0x41,0xfb, +0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9,0x9, +0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x36,0x74, +0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36, +0x26,0xa, 0x37,0x12,0x81,0xbf,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x25,0x12,0xa1,0x4b,0x2d,0x13,0xbd,0xc1,0x28, +0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68,0x39, +0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x2c,0x40, +0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34,0x74, +0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71,0x74, +0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe8,0xbc, +0x7e,0x28,0x2, 0x41,0x60,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x33,0x12,0x2f,0xe4,0xbe,0xb0,0xff,0x68, +0x2b,0x9, 0x73,0x1f,0x35,0x12,0x30,0x3, 0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54,0x0, +0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, 0x12, +0x2f,0xe4,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc,0xf9, +0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19,0x75, +0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19,0xa3, +0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe,0x38,0x8a,0x90, +0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e, +0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xfd,0x12,0x97,0x4, 0x7e,0x8, 0x36, +0x25,0x74,0xff,0x12,0x20,0xde,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b, +0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xf5, +0x7a,0xf3,0x35,0xe8,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb3,0x28, +0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee, +0x80,0x2e,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x25,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac, +0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa, +0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbf,0x12,0x2f,0xd0,0xb, 0xf0,0xb, 0xe0, +0x12,0x9c,0xf6,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c,0xba,0x7c,0x7d, +0x12,0x30,0x3, 0xb, 0x1a,0x30,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3, +0x2a,0x6f,0xf5,0x40,0x7e,0xb3,0x2a,0x70,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a, +0xb3,0x33,0xc2,0x7a,0xb3,0x33,0xc0,0x7a,0xb3,0x33,0xc1,0x7e,0x8, 0x1f,0x34,0x12, +0x2f,0xdd,0xe4,0x12,0x20,0xde,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x33,0xc3,0xe4, +0x12,0x20,0xde,0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa2,0x6c,0xcc,0xe1,0x91,0x12,0xc0, +0x61,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, +0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34,0x7c, +0xbd,0x14,0xbc,0xbc,0x78,0x2, 0xe1,0x97,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x88, +0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, 0xb3, +0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x28,0xe5, +0x27,0xa, 0x2b,0xe5,0x25,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0, +0x4, 0x40,0x2, 0xe1,0x86,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x86,0x85,0x25, +0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb0,0x3f,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x40,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83,0x80, +0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2b, +0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x40,0x2d,0x34, +0xbd,0x38,0x18,0x2, 0xe1,0x1d,0x75,0x30,0x1, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x1, +0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x4, +0x40,0x2, 0xe1,0x1d,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x1d,0x7c,0xbf,0x20, +0xe0,0x2, 0xe1,0x1d,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26,0xbe, +0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1, +0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25, +0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50, +0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29, +0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x5, +0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24,0xe5, +0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29, +0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x5, +0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24,0xe5, +0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85,0x2b, +0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x2c,0x40,0x7a,0x35,0x3e,0xe5,0x2a, +0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe,0xb1, +0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93,0x5, +0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0,0x5, +0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c,0x50, +0xad,0xe5,0x2c,0x12,0x2f,0xae,0xe5,0x2a,0x12,0x2f,0xa5,0xe5,0x2a,0x12,0x2f,0xae, +0xe5,0x2c,0x12,0x2f,0xa5,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20,0x5, +0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x42, +0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0xe5,0x42,0xa, 0x1b, +0x6d,0x0, 0x12,0x1e,0xeb,0x7f,0x21,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, +0x28,0x12,0x1e,0xfc,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23, +0x3e,0x24,0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe, +0xb0,0x0, 0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x33,0xbf,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f, +0x34,0xf5,0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x1f,0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0xc0,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x8e,0x7e,0x8, 0x1f,0x34,0x12,0xaf,0x71,0x7a,0xb3, +0x33,0xc2,0xda,0x3b,0x22,0x7e,0x71,0x2d,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7e,0x71, +0x2b,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7c,0x7b,0x12,0x77,0xf6,0x9, 0xa2,0x27,0x72, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x91,0x6d,0x5c,0xba,0x22, +0x7e,0x70,0x1, 0x2, 0x51,0x5f,0xa, 0x3b,0x9d,0x32,0x2, 0x21,0x0, 0x90,0x60,0x9a, +0x93,0xa, 0x3b,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x12,0x2f, +0xf4,0x50,0xfb,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x7c,0x5b,0x7e,0x43,0x28, +0x84,0xbe,0x40,0x1, 0x28,0x2, 0x21,0x14,0x7e,0xa3,0x2a,0x6e,0x7e,0x70,0x2, 0xac, +0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x30,0x3, +0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc,0x7c,0x9d,0x7e,0x83,0x2a, +0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc,0xa, 0xa8,0x1b,0xa5,0xa, +0x5f,0xbd,0x5a,0x58,0x2, 0x21,0x14,0xa, 0x59,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48, +0x4e,0x7c,0xb9,0x14,0x12,0x31,0x5a,0x50,0x46,0x7c,0xb9,0x14,0x12,0x31,0x17,0xb, +0x1a,0xe0,0x7d,0x3b,0x12,0x31,0x4c,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf, +0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12, +0x31,0x1e,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x31,0x20,0x1b,0x1a,0xa0,0xa, +0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9,0x4, 0x12,0x31,0x5a,0x50, +0x43,0x7c,0xb9,0x4, 0x12,0x31,0x17,0xb, 0x1a,0xe0,0x7d,0x3c,0x12,0x31,0x4c,0x8, +0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12, +0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x31,0x1e,0xb, 0x1a,0x50,0xbd,0x5a,0x8, +0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x31,0x27,0x7d,0xd3,0x7d,0x5d,0x3e,0x54, +0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43,0x2a,0x6e,0x90,0x60,0xab, +0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7c,0x75,0xac,0x74,0xa, +0x2a,0x2d,0x32,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40, +0x2d,0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xab,0x6c,0x77,0x80,0x12, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x51,0x4f,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22, +0xb, 0x70,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe5,0xc3,0x22,0x12,0x36,0x9c, +0x60,0x30,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1b,0x7c,0xb2,0x12, +0x31,0x27,0x7d,0x3, 0x12,0x36,0x94,0x49,0x55,0x38,0xe8,0x7d,0x40,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd4,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc0,0xb4,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0x41,0xdd,0x6c,0xcc,0x41,0xcf,0x12,0xc0,0x61,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xb, 0x7e,0xb3,0x36,0x71,0x70, +0x5, 0x12,0x32,0xe0,0x80,0x6, 0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x30, +0x19,0xd2,0x3, 0x12,0x32,0xe7,0x7e,0xb3,0x36,0xec,0xb4,0x1, 0x1b,0x7e,0xb3,0x2a, +0x3, 0xb4,0x1, 0x14,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xd, 0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x3, 0x12,0x32,0xe0,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x27,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, +0x2d,0x1b,0x24,0xe5,0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24, +0x0, 0x80,0x3c,0xe5,0x24,0xbc,0xbc,0x68,0x34,0x12,0x35,0xda,0x9, 0xa3,0x26,0xfa, +0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5,0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x2f,0xd6, +0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a,0xa, 0x2b,0xe5,0x28,0x12,0x2f,0xd6,0xbe, +0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12, +0x36,0xa4,0x38,0xbf,0xe5,0x27,0x7e,0x71,0x28,0x12,0xa0,0x94,0x50,0x8, 0x12,0x31, +0x7d,0x12,0x35,0xd3,0x80,0x8, 0x12,0x69,0x84,0x50,0x3, 0x12,0x32,0xe0,0xe5,0x25, +0x7e,0x71,0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x33,0x21,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x16,0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e, +0x34,0x27,0x78,0x6d,0x22,0x12,0x7f,0xc5,0x12,0x31,0x7d,0xb, 0xf0,0xb, 0xc0,0x7e, +0x73,0x28,0x84,0xbc,0x7c,0x28,0x2, 0x21,0xc9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22, +0x75,0x25,0x3, 0x75,0x26,0x3, 0x22,0x12,0x36,0x9c,0x60,0x34,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1f,0x7c,0xb2,0x12,0x31,0x27,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x36,0x94,0x59,0x35,0x38,0xe8,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72,0x38,0xd0, +0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x35, +0x80,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x35,0x80,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x30,0x3, 0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x90,0x50,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0xc7,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0xb1,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0xaf,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0xaf,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x40,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0xaf,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x35,0x65,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x35,0x65,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0xb8,0x88,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x35,0x56,0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x35,0x56,0x9f,0x51,0x12,0x35,0x5d,0x9f,0x41,0x12,0x35,0x5d,0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0xeb,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xdf,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x35,0x71,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x35,0x71,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1e,0xeb,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x0, 0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x7, 0x2e,0x18,0x0, 0x20,0x22, +0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34, +0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39, +0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39, +0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d, +0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba, +0xda,0xf8,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x74,0xf5,0x27,0x12,0x0, 0x66,0x50,0x2, 0xc1, +0x6f,0x6d,0x33,0x9e,0x37,0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x70,0x7e, +0xb3,0x16,0x92,0x70,0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x60,0x7e,0x77,0x2a,0x51, +0x7e,0x67,0x2a,0x53,0x75,0x24,0x0, 0x80,0x4e,0xe5,0x24,0x12,0x2f,0xb7,0x60,0x45, +0x12,0x35,0xda,0x12,0x9d,0x80,0xf5,0x26,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90, +0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26,0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26, +0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0xd, 0xe5,0x25,0xa, 0x2b,0xe5, +0x27,0x12,0x9b,0x18,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x51,0x5f,0x12, +0x35,0xda,0x12,0x37,0x9f,0x5, 0x24,0x12,0x36,0xa4,0x38,0xad,0x12,0xa6,0x5, 0xda, +0x3b,0x22,0x12,0x46,0xa2,0x12,0x24,0x9a,0x12,0x73,0x28,0x12,0x22,0xf2,0x7e,0xb3, +0x37,0x8, 0x24,0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x58,0xf0,0x80,0xef,0x12, +0x29,0x7e,0x80,0xea,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x90,0x60, +0xa7,0xe4,0x93,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x12,0xa5,0xee,0x12, +0x9b,0x49,0x12,0x35,0xe2,0x12,0x9a,0x38,0x2, 0x36,0xbb,0xca,0x3b,0x12,0x2b,0xfa, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x9, 0xe4,0x7a,0xb3,0x35, +0xe4,0x7a,0xb3,0x35,0x69,0x7e,0xb3,0x35,0xe2,0x70,0x69,0x6c,0x99,0x80,0x5d,0x74, +0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x9a,0xed, +0x40,0x48,0x6c,0xee,0x80,0x3c,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x6a,0x9, 0xc5, +0x35,0x6b,0xa, 0x28,0xa, 0x3d,0x12,0x37,0x67,0x78,0x25,0xa, 0x2f,0xa, 0x3c,0x12, +0x37,0x67,0x78,0x1c,0x7c,0xb9,0x12,0x37,0x6f,0x7e,0x14,0x62,0x2b,0x12,0x87,0xee, +0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x51,0x5f,0x7c,0xb8,0x7c,0x7f,0x12,0x37,0xa7, +0xb, 0xe0,0x7e,0x73,0x35,0xe4,0xbc,0x7e,0x38,0xbc,0xb, 0x90,0x7e,0x73,0x28,0x84, +0xbc,0x79,0x38,0x9b,0x7e,0x73,0x35,0x69,0x7a,0x73,0x35,0xe4,0xa, 0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x35,0xa6,0x7e,0x8, 0x35,0x6a,0x12,0x20,0xb9,0x1b,0xfd,0xe4, +0x7a,0xb3,0x35,0xe2,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x0, 0x4d,0x33,0x22,0x7c, +0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x2, 0x2c, +0x40,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0x99,0x6c,0x7f,0x71,0x7c,0xbf,0x12, +0x37,0x6f,0x12,0xa4,0xcf,0x7f,0x17,0x12,0x1f,0x58,0x7c,0xb7,0xda,0xf8,0x22,0x9, +0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c,0x6b,0x7e,0xa3,0x35,0x69,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x62,0x35,0xa6,0x19,0x72,0x35,0xa7,0x7c,0xba,0x4, 0x7a,0xb3,0x35, +0x69,0x22,0xca,0xf8,0x6c,0xff,0x80,0x18,0x7c,0xbf,0x12,0x37,0x6f,0xbe,0x37,0x2a, +0x5c,0x58,0xb, 0x12,0x51,0x5b,0x7e,0x70,0x2, 0xac,0x7f,0x12,0x37,0x9f,0xb, 0xf0, +0x12,0x52,0x66,0x38,0xe3,0x12,0x2b,0xfa,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe, +0xa0,0x34,0x38,0x3, 0x2, 0x38,0xfd,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x10, +0x41,0x1c,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d, +0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x31,0xce,0x7e,0x39,0xb0,0xbe,0xa0,0x37, +0x68,0x2, 0x41,0x1c,0x75,0x1a,0x36,0x41,0x1c,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0, +0x39,0x78,0x1b,0x7e,0xf3,0x37,0xc0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc0,0xbe,0xa0, +0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x1c,0xbe,0xa0, +0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xc2,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc2,0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b, +0x44,0x41,0x1c,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x1c,0xbe,0xa0, +0x5e,0x78,0x26,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, +0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x1c,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0, +0x3d,0x78,0x1b,0x7e,0xf3,0x37,0xc4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc4,0xbe,0xa0, +0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x1c,0xbe,0xa0, +0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xc6,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc6,0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a, +0x9d,0x41,0x1c,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x37,0x9c,0x41,0x1c,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e, +0xf3,0x37,0xe1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xe1,0xbe,0xa0,0x4f,0x78,0x3, 0x75, +0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x31,0xcc,0x7e,0x39,0xb0,0x41,0x1c,0xbe,0xa0,0x51, +0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, +0xff,0x7e,0xb3,0x37,0xec,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a, +0xb3,0x37,0xec,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0x1c,0xbe, +0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xb5,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xb5,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x3a, +0x1f,0x41,0x1c,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0x91,0x41,0x1c,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e,0xbe,0xa0, +0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0xa, 0x9, 0xb3,0x31,0xd4,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1a,0xf4,0x80,0x5c, +0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5, +0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10, +0x3e,0x14,0x7e,0x1f,0x31,0xd0,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, +0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80, +0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c, +0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, +0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e, +0x3, 0x2a,0x6d,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x60,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, +0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, +0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x62,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca, +0xf8,0x80,0x38,0x7c,0xbf,0x12,0x3a,0x1f,0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70, +0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x12,0x3a,0xde,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x3a,0xde,0x7e,0x73,0x2a, +0x6e,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3, +0x2a,0x6d,0x74,0x2, 0xa4,0x22,0x12,0x3f,0xaa,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x37,0xdc,0x7e,0x8, 0x25,0xee,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x3f,0x49,0x80,0x12, +0xca,0x39,0x7e,0x18,0x37,0xdc,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x3f,0x67,0x2, 0x3b,0x15,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0xca,0xf8, +0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x7d,0xab,0xd2,0x6, 0xa1,0xa0,0xa5, +0xbe,0x1, 0x3d,0x7a,0x73,0x37,0x9d,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5,0xbf,0xae, +0x4, 0xd2,0x7, 0xa1,0xa0,0xa5,0xbf,0xaa,0x5, 0x12,0xc0,0xce,0x80,0x1e,0xa5,0xbf, +0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xce,0x80,0x10,0xa5,0xbf,0xac,0x2, +0x80,0x2, 0xa1,0xa0,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xce,0x6d,0x33,0x81,0x1c, +0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x3d,0xa3,0xa5,0xbe,0x7, +0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xa0,0xa5,0xbe,0x8, 0x2, 0x80,0x2, 0xa1,0xa0, +0x12,0x7, 0xfb,0xa1,0xa0,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73,0x37,0xa6, +0xa1,0xa0,0xa5,0xbe,0xb, 0x8, 0x12,0x3d,0xa3,0x12,0x3f,0xc8,0xa1,0xa0,0xbe,0x60, +0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x38,0xbe,0x60,0x1e,0x40,0xd, 0xbe, +0x60,0x23,0x38,0x8, 0x12,0x3d,0xa5,0x43,0xc, 0x40,0xa1,0xa0,0xbe,0x60,0x15,0x40, +0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x3d,0xa5,0xd2,0x6, 0xa5,0xbe,0x15,0x2, 0x80, +0x2, 0xa1,0xa0,0x74,0x7, 0x7a,0xb3,0x37,0xa0,0xa1,0xa0,0xa5,0xbe,0x19,0x7, 0xe4, +0x7a,0xb3,0x37,0xb5,0xa1,0xa0,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c,0x38,0x2, +0xa1,0x38,0xa5,0xbe,0x2d,0x1b,0x12,0x3d,0xa5,0x20,0x7, 0x2, 0xa1,0xa0,0x7e,0x63, +0x37,0xc8,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35,0x8, 0xa1, +0xa0,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, 0xa1,0x38, +0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1,0x38,0x7e,0x70, +0x64,0xa1,0x38,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, 0x1, 0x7e, +0xf3,0x37,0xc1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc1,0xa, 0x2f,0x19,0x72,0x2b,0x21, +0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x38,0xa1,0xa0,0xbe,0x60,0x3a, +0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xc3,0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, 0x80,0x2, +0xa1,0xa0,0x75,0x1a,0x3a,0xa1,0xa0,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, 0x7a,0x73, +0x2b,0x12,0xa1,0xa0,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xec,0xa1,0xa0,0xbe,0x60, +0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc5,0x7c,0xbf, +0x4, 0x7a,0xb3,0x37,0xc5,0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d,0x2, 0x80, +0x2, 0xa1,0xa0,0x75,0x1a,0x3c,0xa1,0xa0,0xbe,0x60,0x3e,0x68,0x4, 0xa5,0xbe,0x3f, +0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc7,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc7,0xa, +0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x3e, +0xa1,0xa0,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x3d,0xa5,0x75, +0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x3d,0xa5,0x75,0xd, 0x2, 0x12,0x3a, +0xe6,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x3d,0xa5,0x12,0x3f,0x70,0x80,0x71,0xbe, +0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x3d,0xa5,0x80,0x63,0xbe,0x60,0x4e, +0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xe2,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xe2,0xa, 0x2f,0x2e,0x27,0x31,0xcc,0x7a,0x29,0x70,0xa5,0xbe,0x4f, +0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80,0x31,0xbe, +0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20,0x7c,0xb7, +0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, 0x7e,0x1f, +0x31,0xd0,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a,0x71,0xf, +0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0x9c,0x22,0x7a,0xb3,0x2b,0x0, +0x70,0x14,0x12,0x3f,0x67,0x12,0x3b,0x15,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4, +0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x3f,0x49,0x12,0x3b,0x15,0x12, +0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12,0x0, 0x1e, +0xe4,0x12,0x3d,0xac,0x12,0x3d,0xf3,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12,0x3d,0xac, +0x2, 0x3d,0xf3,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e,0x8, 0x1f, +0x44,0x12,0x3f,0xe9,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x20,0xde,0x7e, +0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x1f,0xda,0x7e, +0x34,0x0, 0xa, 0x12,0x20,0xde,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc,0x7a,0x1d, +0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, 0x2a,0xb9, +0x12,0xba,0x4c,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, 0x3a,0x2e, +0x34,0x20,0x73,0x12,0x91,0x6d,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12, +0x3f,0xb, 0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a, +0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9, +0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x3f,0xb, 0xa, 0x4a, +0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde, +0x38,0xd8,0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0, +0x12,0xb8,0xe2,0x80,0x3, 0x12,0x3f,0xd9,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f, +0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e, +0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34, +0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e, +0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x12,0xae,0xfc,0x12,0x13,0xf5,0x12, +0xb9,0x6e,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x3f,0xcb,0x74,0x1, 0x12, +0x3d,0xac,0x12,0x3f,0xd2,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x3d,0xdb,0x7e, +0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25, +0xee,0x22,0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x3f,0x67,0x80,0x6, 0xb4,0x1, 0x6, +0x12,0x3f,0x49,0x12,0x3b,0x15,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22, +0x12,0x3f,0xaa,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x37,0xdc, +0x12,0x20,0xb9,0x1b,0xfd,0x12,0xc0,0xc5,0x12,0x3f,0x49,0x80,0x1a,0xca,0x39,0x7e, +0x18,0x2b,0x70,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x37,0x2b,0x76, +0x7a,0x37,0x31,0xcc,0x12,0x3f,0x67,0x2, 0x3b,0x15,0x7e,0xb3,0x37,0xe0,0x7e,0x34, +0x0, 0x4, 0x22,0x7c,0x6b,0x12,0x3f,0xe1,0x78,0x5, 0x7c,0xb6,0x2, 0x7d,0xd6,0xb4, +0x4, 0x5, 0x7c,0xb6,0x2, 0x3b,0x1e,0x22,0xb2,0x82,0x22,0x7d,0x32,0x74,0xfa,0x2, +0x12,0xd0,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x20, +0xde,0x7e,0xb3,0x37,0x9c,0xc4,0x54,0x7, 0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, +0x20,0xde,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x30,0x6, 0x3b,0xc2,0x6, +0x12,0x25,0xe6,0x7e,0x73,0x37,0xa1,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x37,0xa2,0x7a, +0x73,0x2b,0x1d,0x7e,0x73,0x37,0xa2,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x37,0xa3,0x60, +0x18,0x7e,0x34,0x0, 0x2, 0x12,0x41,0x5d,0x7e,0x34,0x0, 0x1, 0x12,0x41,0x5d,0x6d, +0x33,0x12,0x41,0x5d,0xe4,0x7a,0xb3,0x37,0xa3,0x12,0x4f,0xfa,0x2, 0x40,0x3f,0xe5, +0xc, 0x70,0x2, 0x21,0x5c,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x72,0x92, +0x12,0x79,0x31,0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53, +0xc, 0xfd,0x12,0xba,0x3, 0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b, +0x12,0x60,0x9, 0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65, +0x7e,0x73,0x2b,0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x4, +0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3, +0x45,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xce,0x7a,0x73,0x2b,0xf, 0x12,0x87,0x52,0x7a, +0xb3,0x0, 0x4f,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x4f,0x7a, +0x73,0x37,0xa6,0x12,0x6e,0x29,0x12,0xc0,0x22,0x7e,0x73,0x37,0xcf,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xae,0xfa,0xe4, +0x12,0xa, 0x66,0x12,0x8d,0xec,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43, +0x37,0xd0,0x7e,0x50,0xa, 0xac,0x45,0x12,0x3f,0xcb,0xe5,0xc, 0x30,0xe6,0x4e,0x53, +0xc, 0xbf,0x7e,0x73,0x37,0xbc,0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37, +0xbc,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x43,0xeb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63, +0x37,0xbc,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12,0x47,0x81,0x7c,0x65,0x4c,0x76,0x74, +0xe, 0x12,0x43,0x5f,0x12,0x43,0xeb,0x12,0x43,0xf3,0x7e,0x73,0x37,0xbf,0x7a,0x73, +0x2b,0x14,0x7e,0x73,0x37,0xbe,0x7a,0x73,0x2b,0x1f,0x12,0xc0,0xd7,0xe5,0xc, 0x30, +0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xa6,0x2, 0x48,0x77,0x22,0xca,0xd8,0xca, +0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c, +0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x57, +0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x43,0xeb,0x7c,0x8b,0x74,0x7, 0x7e, +0x70,0xf, 0x12,0x43,0xf0,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, +0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, +0xc, 0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e, +0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x38,0xc4,0x12,0x43, +0x48,0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x38,0xc4,0x78,0x7, 0x12,0x43, +0x48,0x54,0xfb,0x80,0x5, 0x12,0x43,0x48,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x38, +0xc0,0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e, +0xa0,0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0x12,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff, +0xe, 0x12,0x43,0x53,0x54,0xe6,0x12,0x43,0x50,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12, +0x43,0x53,0x5e,0x54,0xfe,0xe6,0x12,0x43,0x50,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4, +0x0, 0x2, 0x78,0x2d,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e,0x54,0x0, 0xf, 0x1b, +0x1a,0x50,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34, +0x0, 0x2, 0x12,0x44,0x72,0x12,0x44,0x4b,0x12,0x44,0x28,0x7a,0x37,0x31,0xd4,0x61, +0x4, 0x6c,0xdd,0x41,0xfe,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40, +0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, +0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c, +0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e, +0x54,0x0, 0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4, +0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, +0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, +0x3b,0x12,0x44,0x72,0x12,0x44,0x4b,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x44,0x4b, +0x12,0x44,0x28,0x74,0x2, 0xac,0xbd,0x59,0x35,0x31,0xd6,0x80,0xf, 0x12,0x44,0x28, +0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x31,0xd6,0xb, 0xd0,0xbc,0xed, +0x28,0x2, 0x41,0x65,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x43,0xf0,0xa9,0xc0, +0xc4,0x7e,0x1f,0x38,0xc0,0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x38,0xc0,0x79,0xf1,0x0, +0x90,0x6d,0x33,0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0x8, 0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x10,0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22, +0x1b,0x1a,0x50,0x7e,0x1f,0x38,0xc0,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5, +0xfd,0x7a,0x71,0xfe,0x22,0xca,0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12, +0x43,0x5f,0x74,0xf, 0x12,0x43,0xeb,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe, +0x12,0x43,0x5f,0x74,0xc, 0x12,0x43,0xeb,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, +0x7e,0x70,0xf8,0x12,0x43,0x5f,0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, +0x38,0xb, 0x12,0x45,0x6, 0x7c,0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17, +0xe4,0x93,0xb4,0x1, 0xe, 0xbe,0xa0,0x7, 0x28,0x9, 0x12,0x45,0x6, 0xa, 0x77,0x2e, +0x74,0x0, 0x7, 0x74,0xe, 0x7c,0x7f,0x12,0x43,0x5f,0x74,0x7, 0x12,0x43,0xeb,0x7c, +0xfb,0x5e,0xf0,0xfb,0x90,0x60,0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c, +0xf7,0x74,0x7, 0x7c,0x7f,0x12,0x43,0xf0,0xda,0x79,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x12,0x43,0x5f,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24, +0x7e,0x24,0x0, 0x12,0x12,0xb7,0x9d,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74, +0x3, 0x7e,0x71,0x27,0x12,0x43,0x5f,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x43,0x5f,0x74, +0xc, 0x7e,0x71,0x30,0x12,0x43,0xf0,0x22,0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0xa, +0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e, +0xf, 0x38,0xc4,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0x12,0x5e, +0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34, +0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x45,0x15, +0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6, +0x22,0x12,0x47,0xf8,0xc2,0x3, 0x12,0xb6,0x2d,0xc2,0x5, 0x12,0x45,0x51,0xc2,0x3, +0x12,0x47,0x21,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0xeb,0x7a,0x1b,0xb0,0x74,0xf, +0x6c,0x77,0x12,0x43,0x5f,0xe5,0xfc,0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x43,0xf3, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x2a,0x12,0x44,0x6e,0x12,0xb5, +0xe5,0x2, 0xb6,0x9a,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x1a,0x12,0x44,0x6e,0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0xc, 0x12,0x44,0x6e,0x2, 0xb6,0x94,0x74, +0x1, 0x7a,0xb3,0x33,0xff,0x22,0xa, 0x3a,0x2e,0x34,0x0, 0x3, 0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0x5f,0x7a,0x61,0xfc,0x12,0x43,0xf3, +0x12,0x46,0x68,0xd2,0x3, 0x12,0x47,0x21,0x12,0x45,0x6b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x45,0x6b, +0x2, 0x13,0x96,0x12,0x47,0xf8,0xc2,0x5, 0x2, 0x45,0x51,0xd2,0x5, 0x12,0x45,0x51, +0x74,0x1, 0x22,0x12,0x45,0xcf,0x12,0x91,0x8, 0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0xc0,0xab,0x12,0x44,0x91,0x74,0x1, 0x12,0x46,0x7, 0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x45,0x30,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x45,0x5a,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x45,0xcf,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x46, +0x7, 0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x45,0x5a,0x74, +0x81,0x7a,0xb3,0x39,0x2, 0x22,0x80,0x1d,0x12,0x45,0xcf,0x12,0x47,0xff,0x68,0x5, +0xc2,0x4, 0x12,0x45,0x5a,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x17, +0x15,0xe4,0x12,0x46,0x7, 0x20,0x93,0xe0,0x12,0x45,0xcf,0xa9,0xd1,0xcd,0xa9,0xc5, +0xea,0x74,0x2, 0x2, 0x46,0x7, 0x22,0x7c,0xab,0x7e,0xb3,0x39,0x2, 0xb4,0x81,0x38, +0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf, +0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, +0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87, +0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0x2, 0x22,0xd2,0x3, +0x80,0x12,0x30,0x3, 0xc, 0x12,0x47,0xff,0x68,0x7, 0xc2,0x3, 0xc2,0x4, 0x12,0x45, +0x5a,0x12,0x45,0xd6,0x30,0x17,0xeb,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb, +0xd2,0x3, 0x12,0xb6,0x2d,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, +0xa9,0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74, +0x41,0x12,0x45,0x15,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda, +0xf8,0x22,0xe4,0x12,0x46,0xf0,0x12,0xb6,0x36,0x12,0x26,0x57,0x12,0xb6,0xb1,0x12, +0x43,0x65,0x12,0xb5,0xdb,0x12,0xb6,0x4d,0x12,0x0, 0x4a,0x12,0xb6,0x59,0x12,0x7e, +0xa0,0x12,0xb6,0x69,0xd2,0xaf,0x12,0x47,0x8a,0x12,0xb8,0x6e,0x12,0x43,0xfa,0x12, +0x46,0x68,0x7e,0x8, 0x3, 0xf1,0x12,0xa9,0x80,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34, +0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0xa9,0xd0, +0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x45,0x51,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75, +0xc2,0xc, 0xd2,0x3, 0x12,0x47,0x21,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1, +0x22,0xa2,0x3, 0xa9,0x97,0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x7e,0x34,0x36,0xe1, +0x30,0xd, 0x4b,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x4f, +0x9, 0x53,0x0, 0x3, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12, +0x47,0x7f,0x7a,0x27,0x2a,0x53,0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a, +0x27,0x2a,0x5a,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a, +0x5c,0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0x45,0xc, 0x7a,0x37,0x2a,0x62,0x22,0xa, +0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12, +0x43,0xeb,0x7c,0x7b,0x12,0x43,0xf3,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e, +0x24,0x0, 0xef,0x7e,0xf, 0x38,0xc0,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e, +0xf, 0x38,0xc0,0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x38,0xc0,0x79, +0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x38,0xc0,0x79, +0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8a,0x7e, +0x34,0x6a,0xd1,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e, +0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8e,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x12,0xc0,0xce,0x12,0xc0,0xc5,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x48,0x56,0x12,0x48,0x30,0x74,0x50,0x7a,0xb3,0x37,0xd0,0x7e,0x24, +0x3, 0x20,0x12,0x3f,0xcb,0xe4,0x12,0xc0,0x7, 0x6d,0x33,0x7a,0x37,0x39,0x4, 0x22, +0x7e,0x73,0x2b,0x62,0x7a,0x73,0x37,0xcf,0x22,0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37, +0xca,0x7e,0x73,0x37,0xce,0xbe,0x73,0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12, +0x48,0x56,0x12,0x48,0x30,0x22,0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x7e,0x73, +0x2b,0x1f,0x7a,0x73,0x37,0xbe,0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x7e,0x73, +0x2b,0x14,0x7a,0x73,0x37,0xbf,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, +0x12,0x48,0xe8,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80, +0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x48,0xe8,0x40, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c, +0xdd,0x7c,0xbd,0x12,0x8d,0xb3,0x12,0x48,0x6e,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x37, +0xbe,0x12,0x49,0x4, 0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x12,0x48,0x30,0x7a, +0xd3,0x37,0xa6,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26, +0x33,0xbc,0xbe,0x22,0x30,0x3, 0x3, 0x12,0x48,0x6e,0xa2,0x4, 0x92,0x5, 0x12,0x49, +0xc3,0x2, 0x49,0x4, 0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x22,0x74,0x40,0x12, +0x6e,0x8b,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x48,0xf4,0x80,0x1c,0x74,0x1, 0x12, +0x49,0x47,0x7e,0x43,0x37,0xbb,0x7e,0x50,0x64,0xac,0x45,0x12,0x87,0xf8,0x7a,0xb3, +0x2b,0x1f,0x7e,0xf, 0x38,0xd9,0x12,0x4d,0x9b,0x12,0x49,0x4, 0x7e,0x73,0x2b,0x1f, +0x7a,0x73,0x37,0xbe,0x2, 0x48,0x6e,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14, +0x12,0xc0,0x22,0x7e,0xc0,0xa, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x1f,0x38,0xd9,0x12,0x90,0x58,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, +0x12,0x49,0xb7,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12, +0x49,0xb7,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x49,0xb7,0xb, +0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x38, +0xd9,0x12,0x8f,0xfb,0x7d,0x73,0x7e,0x1f,0x38,0xc8,0x69,0x31,0x0, 0x1a,0x7a,0x73, +0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, 0x1a,0xb, +0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x37,0xb1, +0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5,0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3, +0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a,0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35, +0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x31,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x4e,0x5f,0x6c,0xff,0x80,0x35,0x12,0x4c, +0x40,0x6c,0xee,0x80,0x19,0x7e,0x11,0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac, +0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x10,0x12,0x4c,0x47,0xe5,0x2e, +0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12,0x4c,0x56,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34, +0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xc5,0x12,0xc0,0x90,0x68,0xb, 0x7e,0x34, +0x10,0x0, 0x12,0x4c,0x7c,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x78,0x12,0x4c,0x40, +0x6c,0xee,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2a,0xbc,0xbe,0x38,0xe6,0xe5,0x2a, +0x12,0x4c,0x56,0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x60,0xe5,0x2a,0xbe,0xb1,0x2d, +0x50,0x35,0x12,0x4c,0x40,0x7e,0xe1,0x2a,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2d, +0xbc,0xbe,0x38,0xe6,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5,0x2d,0xa, 0x1b,0x6d,0x0, +0x9f,0x1, 0x12,0x4c,0x5a,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x3, 0x62,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x82,0xe5,0x2d,0xa, 0x1b,0x6d, +0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x1f,0x7, 0x6c,0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, 0x9d,0x15,0xad,0x12, +0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21, +0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xcc, +0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x7, 0x6c,0xff,0x80, +0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x60,0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10, +0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x60,0xe5,0x2a, +0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x62,0x2e,0x14,0x10, +0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x62,0xb, 0xf0,0xe5,0x2b,0xbc, +0xbf,0x38,0x9e,0x7e,0x73,0x37,0xb3,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14, +0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x5, 0x7d,0xe3,0x7a,0xe5,0x35, +0x7e,0x73,0x37,0xb4,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d, +0x1f,0x12,0x1f,0x5, 0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, 0xac,0xbf,0x49,0x45, +0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x34,0x0, 0x80,0x8, +0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xda, +0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x60,0xbe,0x45,0x35,0x28, +0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x60,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65, +0x3, 0x60,0x49,0x45,0x3, 0x62,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35, +0x3, 0x62,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x62,0xb, 0xf0,0xe5,0x2b, +0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x31,0x12,0x4d,0x9b,0xda,0x3b,0x22, +0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a, +0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f, +0x7, 0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x1f,0x5, 0x7e,0xa1,0x2c,0x74, +0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x4e,0x5f,0x7e,0x1f,0x38,0xf3, +0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x6, +0x7e,0x38,0x38,0x88,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x87,0x70,0xe, 0x7e,0xb3,0x38,0x85,0x70,0x8, +0x74,0x1, 0x7a,0xb3,0x38,0x87,0xa1,0x57,0x7e,0xb3,0x38,0x87,0x70,0x6, 0x74,0x1, +0x7a,0xb3,0x38,0x87,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0, +0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61, +0x59,0x12,0x23,0x9e,0x7a,0x35,0x2e,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0xa6,0x56, +0x75,0x2c,0x0, 0x80,0x16,0x12,0x4c,0x7c,0x12,0x4d,0x84,0xbe,0x35,0x2a,0x8, 0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x84,0x7a,0x35,0x2a,0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c, +0x38,0xe3,0x12,0x4d,0x93,0x40,0x25,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x1e,0x5, 0x1c, +0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c,0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20,0xb9,0x1b,0xfd,0x74,0x2, 0x12,0x0, +0x1e,0x12,0x4d,0x93,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x38,0xf2,0xe4,0x7a,0xb3,0x38, +0x87,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, 0x21,0x0, 0x7f,0x13,0x2d,0x35,0xb, +0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35,0x2a,0x22,0x12,0x4d,0xa5,0xb, 0x34, +0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x12,0xc1,0x17,0x4c,0xaa, +0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c,0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4, +0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60, +0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e,0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, +0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc, +0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, +0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12,0x1f,0x7, 0x7f,0x1, 0xb, 0xc, 0x7e, +0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f,0x7, 0xbe,0x34,0x0, 0xfa,0x28,0x4, +0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, 0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d, +0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e,0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e, +0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27, +0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e, +0x34,0x0, 0x38,0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12, +0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, +0x12,0x4e,0x8d,0x80,0x2, 0xe4,0x22,0x12,0x4e,0x72,0x74,0x1, 0x22,0x12,0xc0,0x75, +0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0x12,0x7f,0x6f,0x38,0x2, +0xe4,0x22,0x12,0x7f,0x67,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x4e, +0xb4,0x2, 0x4e,0x7d,0x7e,0xd7,0x2b,0xd, 0xbe,0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12, +0x7e,0xf8,0x12,0x4e,0xe0,0x7a,0xd7,0x2b,0xd, 0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e, +0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, 0x12,0x4f,0xaf,0x74,0x1, 0x22, +0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b,0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a, +0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x4e,0xe0,0x12,0xc0,0xbd,0x12,0x29,0x6f, +0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x20,0xde,0x7e,0xd0,0x7, 0x12,0x26,0x57,0x6c, +0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x12,0x4f,0xf0,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, +0x3c,0xbd,0x32,0x48,0xde,0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x7e,0xb3, +0x2a,0x73,0x7c,0x7e,0x12,0x7b,0x31,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49, +0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0x4f,0xf0,0x5c,0x7b,0x7a, +0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe, +0xd0,0x0, 0x58,0x88,0x12,0x7b,0x39,0x74,0x2, 0x12,0xc0,0xe0,0x12,0x50,0x51,0x74, +0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2a,0xfa,0x12,0x4e,0xe0,0xda,0x3b,0x22,0x74,0x2, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x12,0x50,0x51,0x74,0x2, 0x12,0x0, 0x1e,0x74, +0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x4f,0xc1,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, +0x94,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x2e,0x34,0x20,0x73,0x12, +0x91,0x6d,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x38,0xc0,0x2d, +0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x74,0xbc,0x6a,0x38,0xd6,0x22, +0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, +0x30,0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x4e,0xe0,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, +0xfd,0x7e,0xb3,0x37,0xe0,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc0,0xe0,0x12, +0x50,0xd4,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xe1,0x7e, +0xb3,0x37,0xe0,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x3f,0x67,0x80,0x7, 0xe4, +0x12,0x0, 0x1e,0x12,0x3f,0x49,0x12,0x3b,0x15,0x7e,0xb3,0x2a,0xfc,0x2, 0x50,0x51, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x3f,0xe9,0x7e,0xa3,0x2a,0x73, +0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x62,0x2a,0xdc,0xa, 0x26, +0x12,0x51,0x4b,0x93,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x50,0xca, +0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xde,0x6c,0xee,0x80,0x1a,0xa, 0x2e, +0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12, +0x50,0xca,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30, +0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba, +0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27,0x2a,0xfe,0x7e,0x29, +0xb0,0xa, 0x26,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xe9,0x7e, +0xa3,0x2a,0x73,0x7e,0x63,0x2a,0x74,0x6c,0xee,0x80,0x1f,0xa, 0x2e,0x9, 0x72,0x2a, +0xdc,0xbe,0x70,0x1c,0x50,0x12,0xa, 0x27,0x12,0x51,0x4b,0x93,0x7c,0x7b,0x7e,0xb3, +0x2a,0xfb,0xa, 0x27,0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xdd,0x6c,0xee, +0x80,0x17,0xa, 0x3e,0x9, 0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a, +0xfb,0xa, 0x27,0x19,0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e, +0x30,0xe, 0xac,0x3e,0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11, +0xf8,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0x73,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7a,0xb3,0x34,0xc4,0x7c,0xbf,0x6c,0x77,0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x51,0x4f,0x93,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff, +0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0xca, +0xf8,0x6c,0xaa,0x6d,0x33,0x7e,0x24,0x7f,0xff,0x7e,0xf0,0x1, 0x80,0x32,0xa, 0x1f, +0x7e,0xb3,0x2a,0x6e,0xa, 0xb, 0x2d,0x1, 0x3e,0x4, 0x49,0x10,0x4, 0xfc,0xbe,0x14, +0x3, 0xe8,0x8, 0x1a,0xb, 0xa0,0xbd,0x13,0x8, 0x4, 0x7d,0x31,0x80,0x10,0xbd,0x12, +0x58,0xc, 0x7d,0x21,0xbe,0x24,0x0, 0x0, 0x18,0x4, 0x7e,0x24,0x0, 0x1, 0xb, 0xf0, +0x7e,0xb3,0x2a,0x6f,0xa, 0xb, 0x1b,0x4, 0xa, 0x1f,0xbd,0x10,0x48,0xc0,0x7e,0xb3, +0x34,0xa1,0x7a,0xb3,0x36,0xf3,0x7a,0xa3,0x36,0xf7,0xe4,0x7a,0xb3,0x36,0xf5,0xbe, +0xa0,0xb, 0x78,0x18,0x9d,0x32,0xbe,0x34,0x4, 0xb0,0x58,0x10,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x1, 0x5e,0x58,0x6, 0x74,0x1, 0x7a,0xb3,0x34,0xa1,0x7e,0x73,0x34,0xa1, +0xbe,0x70,0x0, 0x28,0x3e,0x6c,0xff,0x80,0x35,0x7c,0xbf,0x12,0x97,0xfc,0x60,0x22, +0x74,0x22,0x7a,0xb3,0x36,0xf4,0x7e,0xb3,0x34,0xc4,0x4, 0x12,0x51,0x57,0x7e,0x73, +0x34,0xc4,0xbe,0x70,0x5, 0x40,0x15,0xe4,0x7a,0xb3,0x34,0xc4,0x7a,0xb3,0x34,0xa1, +0x80,0xa, 0xe4,0x12,0x51,0x57,0x74,0x33,0x7a,0xb3,0x36,0xf5,0xb, 0xf0,0x12,0x52, +0x66,0x38,0xc6,0xda,0xf8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xca,0xd8,0xca, +0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x3c,0xe4,0x7a,0xb3,0x1f,0x58,0xe5,0x1d, +0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60,0xc, 0x12,0x8c,0x87, +0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x10,0x6d,0x88,0x7a,0x87,0x37, +0xfd,0x61,0xa0,0x12,0x93,0x91,0x60,0x12,0x7e,0x34,0x62,0xe, 0x12,0x87,0xc4,0x7a, +0x87,0x37,0xf3,0x12,0x54,0x2b,0x7a,0x87,0x37,0xfd,0x7e,0x87,0x37,0xf3,0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x7b,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x52,0x7c,0xbd, +0x7c,0x7e,0x12,0x55,0xb9,0x7d,0x93,0x7e,0x87,0x37,0xfd,0xbd,0x89,0x50,0x4, 0x7a, +0x97,0x37,0xfd,0x7e,0x87,0x38,0x3c,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x3c,0xe5, +0x1d,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x37,0xff,0x12,0x54,0x4e,0x50,0x7, 0x12, +0x54,0x45,0xd2,0x3, 0x80,0x2f,0x7e,0x8, 0x37,0xff,0x7e,0x18,0x1f,0x52,0x12,0x57, +0x0, 0x50,0x22,0x80,0x10,0x12,0x54,0x2b,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f,0x52, +0x12,0x91,0x86,0x50,0x10,0x12,0x54,0x45,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52, +0x12,0x93,0x6b,0xd2,0x3, 0xb, 0xf0,0x12,0x52,0x66,0x38,0x80,0x30,0x3, 0x37,0x6c, +0xff,0x80,0x20,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x58,0x12,0x54, +0x4e,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x54, +0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdb,0x75,0x1d,0x0, 0x7e,0x34,0x62,0xe, 0x12, +0x23,0x9e,0x7a,0x37,0x37,0xf3,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, 0xac,0x67,0xb, +0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x37,0xff,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x37,0x37,0xf3,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93,0xa, 0x3b,0xbe, +0x37,0x37,0xfd,0x38,0x40,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37,0x38,0x3c,0x38, +0x34,0x90,0x60,0x51,0x12,0x54,0x33,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, +0x24,0x90,0x60,0x50,0x12,0x54,0x33,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, +0x14,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x54,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf4,0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0xa2,0x3, 0x92,0x10,0x12, +0x56,0xe9,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xb, 0x70,0x1b,0x7e, +0xb3,0x28,0xa8,0x70,0x15,0x12,0xc1,0x7, 0x68,0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0, +0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x51,0x5f,0x22,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0xd5,0x26,0xfa,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x7c,0xbd, +0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f, +0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0, +0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, +0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38, +0xc9,0xa2,0x4, 0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28,0x99, +0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73, +0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f, +0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, +0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x55,0xa6,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3, +0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e, +0xb3,0x26,0x83,0x70,0x40,0x12,0x8f,0xe3,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x55,0xa6,0x49,0x2, +0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49, +0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, +0xf0,0xbc,0x7f,0x38,0xc9,0x12,0xb1,0x64,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28, +0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28, +0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x55,0xaf,0x49,0x25, +0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x0, 0xbe,0x37,0x28,0x9d,0x8, +0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdc,0x6c, +0xff,0x80,0x9, 0x12,0x55,0xaf,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf2,0xda,0x79,0xda,0xd8,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0x7c, +0xbf,0x12,0x37,0x6f,0x74,0x2, 0xac,0xbf,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f, +0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c,0xcc, +0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c, +0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14, +0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12, +0x20,0xde,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a, +0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1c,0x75,0x26,0x0, +0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56,0xd3,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf1,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xdf,0x7c,0xec, +0x80,0x23,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80,0xa, 0x12,0x91,0xd5, +0x70,0xd, 0x12,0x56,0xd3,0xb, 0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5, +0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd8,0x1a,0x3c,0xb, 0x34,0x7c,0xe7, +0x80,0x1c,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56, +0xd3,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf1,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73, +0x2a,0x6e,0xbc,0x7e,0x18,0xdc,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x21,0x75,0x26, +0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xa, 0x12,0x91,0xd5,0x70,0xd, 0x12,0x56,0xd3,0xb, +0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e, +0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd7,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, +0xda,0x3b,0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35,0x24,0x22,0x12,0x57, +0x32,0x12,0x51,0x9f,0x7a,0xb3,0x2a,0xc, 0x22,0x30,0x10,0x13,0x12,0xc0,0xf7,0x68, +0x6, 0x7e,0xb3,0x39,0xb, 0x60,0x8, 0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x37,0xfb,0x22, +0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f, +0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x54,0x52,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76, +0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9, +0xc3,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34,0xa2,0x6c,0x33,0x80,0x3d,0x7e, +0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc, +0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32, +0x12,0x35,0x67,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3, +0x34,0xa2,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf, +0x2, 0x57,0x83,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac, +0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c, +0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26, +0xfb,0xa, 0x28,0xa, 0x31,0x12,0x35,0x67,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x35, +0x67,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0, +0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3e,0xbe,0xb0,0x0, 0x28,0x12,0x14, +0x7a,0xb3,0x35,0x3e,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2a, +0x5a,0x7e,0xb3,0x36,0xec,0x70,0x58,0x7e,0xb3,0x39,0xb, 0x70,0x52,0x7e,0xb3,0x36, +0x71,0x70,0x4c,0x7e,0x37,0x37,0xfd,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28, +0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f, +0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3, +0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, +0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x35,0x3e,0xda, +0xf8,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e,0x7e,0xf3,0x2a,0x6d,0xac,0xf7, +0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x20,0xde,0x7e,0xb3,0x37,0xb7, +0xb4,0x1, 0x64,0x7e,0x73,0x37,0xb8,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c, +0x12,0x26,0x57,0x12,0x28,0x62,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49, +0x33,0xd, 0xc8,0x12,0x21,0x0, 0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14, +0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34, +0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xb8, +0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, +0xd, 0xc8,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0x4, 0xe4,0x2, 0x58,0xe8,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0x12,0x68,0x10,0x12,0x7d,0x94,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0x74,0x12,0xb6,0xb8, +0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x91,0x18,0x12,0x47,0x2c, +0x12,0x28,0x62,0x50,0xde,0x12,0xab,0xb8,0x12,0x75,0xe9,0x7e,0xb3,0x37,0x5, 0xb4, +0x1, 0x4, 0xe4,0x12,0x58,0xe8,0x12,0xaf,0x66,0x12,0xa7,0xbd,0x12,0x5e,0xaa,0x40, +0xc2,0x12,0x88,0x5f,0x12,0x5e,0xaa,0x40,0xba,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x0, 0x6e,0x12,0x5f,0x2f,0x12,0x5f,0x83,0x12,0x5b,0x94,0x12,0x96,0x24,0x12,0x5e, +0xc2,0x12,0x5f,0xcd,0x12,0xaa,0xc3,0x12,0x87,0x74,0x7e,0xb3,0x36,0xf1,0xbe,0xb0, +0x88,0x68,0x3, 0x12,0x59,0x77,0x12,0x67,0xfa,0x12,0x26,0x66,0x12,0x62,0xa5,0x80, +0x82,0x12,0x2f,0xee,0x2, 0x58,0xdc,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x12,0x35, +0xd3,0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, +0x7e,0xb3,0x2a,0x7, 0x70,0x8, 0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0x61,0x6b,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x28,0x80,0x4, 0x7e,0x68,0x32,0xea,0x7f,0x6, 0x12,0x7e,0xef, +0x7e,0x73,0x2a,0x4, 0x7a,0x6b,0x70,0x6c,0xdd,0x61,0x1c,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x5e,0x3d,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x61,0x1a,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x61,0x1a,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x9e,0xec,0x50,0x2, 0x61,0x1a,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3, +0x2a,0x9, 0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xd6,0x6d,0x22,0x74,0x1, 0x12,0x7f,0xd4,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xe0,0x6d,0x22,0x74,0x10,0x12,0x7f,0xd4,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xd6,0xf5,0x25,0x9, 0xb3,0x32,0xe0,0xf5,0x26,0xa, 0x3c,0x12,0x5e, +0x3d,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xd6,0x19,0xb3,0x32,0xe0,0x12, +0x35,0xd3,0x7e,0xb3,0x2a,0x64,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd, +0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac, +0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x2c,0x75,0x27, +0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x6a,0x54,0xf, +0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x66,0x49,0xa3,0x33,0x68,0x80,0xc, 0x5, 0x27, +0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, 0xff,0x5e,0xa4, +0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5, +0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0, +0xe5,0x28,0xa, 0x5b,0x12,0xb9,0x3c,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e, +0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13, +0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26, +0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x4d, +0xbc,0x7d,0x28,0x2, 0x21,0xbb,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x31, +0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38, +0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0xa, 0xb2,0xe, 0x12,0x7e,0x81,0x74,0x1, 0x12,0x58, +0xe8,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x5e,0x61,0xe4,0x7a,0xb3,0x2a, +0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, 0xe4,0x12,0x58,0xe8,0x12, +0x5f,0xc2,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x66,0x12,0x20,0xb9,0x1b, +0xfd,0x4c,0xff,0x78,0xc, 0x12,0x73,0xe5,0x7e,0x8, 0x33,0x66,0x74,0xff,0x12,0x20, +0xde,0xda,0x3b,0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70, +0xff,0x12,0x5e,0x8b,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f, +0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe2,0x7e,0x73,0x2a,0x2, +0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x2, 0xa1,0xab,0x6c,0xaa,0x80,0x10, +0x7e,0x44,0x7f,0xff,0x12,0x5e,0x95,0x79,0x40,0x0, 0x14,0x12,0x5e,0x45,0xb, 0xa0, +0x12,0x5e,0x25,0x38,0xeb,0xa1,0xab,0x7e,0xb3,0x34,0x4f,0x70,0x3d,0xbe,0x70,0x0, +0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12, +0x5e,0x95,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30, +0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0, +0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xce,0xa1,0xab,0x6c,0xaa,0x80,0x17,0x12,0x5e, +0x57,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe4,0x6c,0xaa,0x80,0x41,0x6c,0xff, +0x80,0x36,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe, +0x34,0x7f,0xff,0x68,0x21,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x18,0x12,0x5e, +0x35,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x5e,0x4e, +0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xc5,0xb, 0xa0,0x7e, +0xb3,0x34,0x4f,0xbc,0xba,0x38,0xb7,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x9, 0xb3,0x1f, +0x46,0xb4,0xff,0x1d,0x6c,0xff,0x80,0x14,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x9, 0x12,0x5e,0x4e,0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38, +0xe7,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xd3,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac, +0x7a,0x49,0x43,0x28,0xae,0x12,0x5e,0x35,0x59,0x42,0x15,0x76,0x49,0x33,0x28,0xb0, +0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xde,0x7e,0x34, +0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e,0x7e,0x73, +0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80, +0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0x12,0x5e,0x2d,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x5e,0x8b,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x5e,0x45,0xb, 0xa0,0x7e,0x63,0x2a,0x2, 0xbc,0x6a, +0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68, +0x13,0x12,0x5e,0x57,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c, +0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x7e,0xf3,0x2a,0x2, 0x7a, +0xf3,0x34,0x4f,0x6c,0xaa,0x80,0x66,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2b, +0x12,0x5e,0x9f,0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0xa, 0x3a,0x2d,0x3d, +0x7d,0x2c,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x2e, +0xa5,0xbb,0x0, 0x2a,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x23,0x12,0x5e,0x9f,0xbe,0xb0, +0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30, +0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0xa, 0x3a, +0x2d,0x3d,0x7d,0x2c,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0x12,0x5e,0x25, +0x38,0x95,0xda,0xf8,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0x90,0x60,0x99, +0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0xb0,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40,0x0, 0x28,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x22,0x6c,0xaa,0x80,0x20,0x74,0x3, 0x12,0xa9,0x76,0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0xa, 0x12,0x5e,0x57,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79, +0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x22,0x7e,0x50,0x9, 0xac,0x5a, +0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, +0x3a,0x2d,0x3d,0x7d,0x2c,0x29,0xb1,0x0, 0xa, 0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91, +0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x9b,0xdf,0x28,0x2, 0xd2,0x3, 0xa2, +0x3, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x3, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x5f,0xc2,0xca,0x59,0x7e,0x18,0x28, +0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xb9,0x1b,0xfd,0x90,0x61,0x35,0xe4,0x93,0xbe, +0xb0,0x0, 0x28,0x28,0x6c,0xff,0x80,0x1f,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae, +0x12,0x80,0x16,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12, +0x64,0xdb,0x12,0xab,0x78,0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xdc,0xda,0xf8,0x22,0x2, +0x5f,0x32,0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe, +0x12,0x37,0x6f,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x23,0x7e,0xc4, +0x0, 0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0xb, +0xf0,0xb, 0xe0,0x12,0x9c,0xf6,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, +0xda,0x79,0x22,0x12,0x9d,0xda,0x2, 0x5f,0x89,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, +0x38,0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x35,0x40, +0x28,0x14,0x7e,0xb3,0x35,0x40,0x4, 0x7a,0xb3,0x35,0x40,0x7a,0xa3,0x2a,0x2, 0x80, +0x5, 0xe4,0x7a,0xb3,0x35,0x40,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a, +0xb, 0x22,0x90,0x60,0x99,0xe4,0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x12,0x68,0x38, +0x2, 0x5f,0xd3,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x34,0xa2,0x4c,0xaa,0x78, +0x3, 0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x34,0xad,0x7e, +0x73,0x34,0xae,0xbe,0x73,0x34,0xad,0x28,0x4, 0x7a,0x73,0x34,0xad,0x22,0xff,0xff, +0x70,0x8f,0x0, 0xff,0x51,0xae,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x37,0x31,0x1, 0xc3,0x1, 0x34,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x10,0xef,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0x18,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xd, 0xc, 0xb, 0xa, 0x9, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x11,0x12,0x13,0x14,0x18,0x17,0xc, 0xd, 0xe, 0xf, 0x15, +0x16,0x10,0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x3d,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x4, 0x5d,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x69,0x40,0xd, 0x18,0x25,0x17,0x25,0x6, 0x80,0x17,0x25,0x6, +0x80,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x32,0x32,0x1, 0xd8,0x1, 0xec,0x0, +0xe1,0x0, 0xe1,0x5, 0x0, 0x37,0x37,0x1, 0xae,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0x96,0x1, 0x18,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, 0x68,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15,0x0, 0x1, 0x54,0x1, 0x0, 0x10, +0x1, 0x51,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0x10,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x3d,0x2, 0x5d,0x69,0x20,0x26,0x3, 0x52,0x59,0x20,0x34, +0x2, 0x5a,0x64,0x20,0x46,0x2, 0x47,0x49,0x30,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, +0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x4, 0x5, 0x25, +0x26,0x27,0x28,0x29,0x4, 0x0, 0xd2,0x2, 0x30,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x0, 0x78,0x0, 0x78,0x14,0x8, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, 0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x8, 0x37,0xf3,0x12,0x62,0xdf,0x7e,0x8, 0x37,0xfb, +0x12,0x62,0xdf,0x12,0x62,0xf4,0x12,0x62,0xfb,0x2, 0x62,0xbc,0x7e,0x37,0x37,0xf3, +0xbe,0x34,0x0, 0x0, 0x28,0x18,0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x50,0xf, 0x7e, +0xb3,0x37,0x31,0x70,0x9, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0x22,0xb, +0xa, 0x30,0xe5,0x4e,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33, +0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x2b,0xb7,0x2, 0x62,0xdf,0x7e,0x8, 0x38,0xe6,0x2, +0x62,0xdf,0x6d,0x33,0x7a,0x37,0x38,0x83,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e, +0xb3,0x2a,0x3, 0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28, +0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68, +0x17,0x7e,0x47,0x2b,0xb7,0x4d,0x44,0x78,0xf, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3, +0x38,0x85,0x7a,0xb3,0x37,0x6, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e, +0x37,0x2b,0xb7,0x7a,0x37,0x2f,0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37, +0x2b,0xb7,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37, +0x2f,0x98,0x7e,0x27,0x2f,0x9a,0x12,0x64,0x1a,0x81,0x13,0x80,0x0, 0x12,0xbd,0xbd, +0x81,0x13,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57, +0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xbd,0x58,0x12,0x64,0x16,0x74, +0x1, 0x7a,0xb3,0x2f,0x80,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88, +0x9e,0x27,0x2f,0x90,0x7e,0x14,0x62,0x8a,0x12,0x64,0xd3,0xbd,0x23,0x38,0x13,0x7e, +0x27,0x2f,0x96,0x9e,0x27,0x2f,0x8e,0x7e,0x14,0x62,0x8c,0x12,0x64,0xd3,0xbd,0x23, +0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a, +0xc7,0x2f,0x98,0x7a,0xd7,0x2f,0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d, +0x2d,0x7e,0x17,0x2b,0xbb,0x7e,0x7, 0x2b,0xbd,0x12,0x66,0xce,0xa, 0x2b,0x7e,0x73, +0x2f,0x7f,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0x64,0x16,0x7a,0xc7,0x2b,0xbb,0x7a, +0xd7,0x2b,0xbd,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24, +0x12,0x67,0xca,0x7d,0x31,0x12,0x85,0xfd,0x2, 0x64,0x2b,0x7e,0x3, 0x2f,0xa8,0xbe, +0x0, 0xf0,0x50,0x2, 0x81,0xc4,0x81,0xb9,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0, +0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34, +0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b, +0xc1,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0x66,0xce,0x7c,0x1b,0x7e,0x3, +0x2f,0x7f,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b, +0xbf,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x1f,0x8c,0x7e,0x34,0x1f,0x34,0x7e,0x30, +0x4, 0xac,0x39,0x2e,0x14,0x2b,0xbf,0x74,0x4, 0x12,0x1f,0x8c,0xb, 0x80,0x7e,0x3, +0x2f,0xa8,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8, +0x7e,0x3, 0x2f,0x7f,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec, +0x40,0x2, 0x81,0x38,0x22,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e, +0x14,0x61,0x49,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e, +0x14,0x61,0x43,0x12,0x83,0x62,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22, +0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83, +0x2a,0x70,0x12,0x87,0xd4,0xbe,0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d, +0x2e,0x7e,0x14,0x61,0x47,0x12,0x64,0xd3,0x12,0x66,0x10,0x90,0x61,0x45,0x12,0x66, +0x7, 0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0x12,0xc1,0x17,0xbe,0xa0,0x0, 0x28, +0x32,0x7d,0x14,0x9e,0x14,0x0, 0x3f,0xbd,0x1e,0x38,0x13,0x12,0x66,0xb8,0x40,0xe, +0x12,0x64,0xc5,0x12,0x65,0xfa,0x48,0x32,0x7f,0x10,0x1b,0x1c,0x80,0x2c,0x12,0x66, +0xb8,0x50,0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x64,0xcb,0x12,0x66,0x10,0x7d, +0x1f,0x80,0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x66,0xb1,0xbd,0x5e,0x38,0x16,0x12,0x64, +0xc5,0x12,0x65,0xfa,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10, +0x6d,0x0, 0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x66,0xb1,0xbd,0x5e,0x28, +0x68,0x7d,0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d, +0x35,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d, +0x22,0x7e,0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1e,0xfc,0x12, +0x66,0x14,0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, +0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x66,0x7, +0x58,0x4, 0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76, +0x7c,0x65,0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x36,0x69,0x7a, +0x73,0x36,0xdf,0x7e,0x27,0x38,0xd6,0x7e,0x14,0x61,0xc8,0x12,0x64,0xd3,0x1e,0x34, +0xbd,0x32,0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x14,0x61,0xc8,0x12,0x64, +0xd3,0xbd,0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x36,0x67,0x12,0x67,0x62,0x7e,0x37,0x36, +0x6f,0xbd,0x32,0x50,0x4, 0x7a,0x27,0x36,0x6f,0x12,0xc0,0xef,0x38,0xa, 0x12,0x8f, +0xf3,0x38,0x5, 0x12,0x8f,0xeb,0x28,0x3d,0x12,0x67,0x69,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x36,0x67,0x4, 0x7a, +0xb3,0x36,0x67,0x7e,0x73,0x36,0x67,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3, +0x36,0x67,0x12,0xc0,0x6b,0x7a,0xb3,0x36,0xdc,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x67, +0x7d,0x32,0x2, 0xad,0x89,0x2, 0x66,0xa8,0x12,0x67,0xc0,0xe4,0x7a,0xb3,0x36,0x75, +0x22,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4, +0x60,0xd1,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0xbd,0x1e,0x22,0x7d,0x51, +0x7d,0x12,0x9d,0x35,0x12,0x21,0x0, 0x7c,0xa7,0x12,0x67,0xeb,0x7c,0xb7,0xbc,0xba, +0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x67,0x15,0x50, +0x21,0x7e,0x54,0x62,0x5a,0x12,0x67,0x15,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x64, +0xd3,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x5e,0x12,0x64,0xd3,0xbd,0x32,0x28,0x2, +0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12, +0x66,0x1b,0x2, 0x67,0x25,0x7e,0xb3,0x36,0x69,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36, +0x71,0x7e,0xb3,0x36,0xdf,0x70,0x3, 0x12,0xaf,0xc, 0x7e,0xb3,0x36,0x71,0xb4,0x1, +0xc, 0x74,0x3, 0x12,0x67,0x59,0x12,0x23,0x9e,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x67, +0x59,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x34,0xae,0x7e,0x34,0x61, +0x5b,0x22,0x74,0x2, 0x7a,0xb3,0x36,0x69,0x22,0x7e,0xb3,0x36,0x75,0xb4,0x1, 0x3, +0x2, 0x67,0x62,0x7e,0xb3,0x36,0xdb,0x4, 0x7a,0xb3,0x36,0xdb,0x7e,0xb3,0x36,0x69, +0xb4,0x2, 0x18,0x7e,0xb3,0x36,0xda,0x4, 0x7a,0xb3,0x36,0xda,0xb4,0x1, 0x6, 0x74, +0x1, 0x7a,0xb3,0x36,0xdb,0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x73,0x36,0xda,0xbe, +0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x75,0x12,0x67,0x62,0x12,0xaf,0xc, +0x12,0x67,0xc0,0x7e,0x73,0x36,0xdb,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x67,0xc0,0x22, +0xe4,0x7a,0xb3,0x36,0xdb,0x7a,0xb3,0x36,0xda,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0, +0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xbf,0x12,0x67,0xf2,0x59,0x25,0x2b, +0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a,0xb3,0x2f,0xa8,0x22,0x7d,0x31,0x9d,0x30,0x2, +0x21,0x0, 0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x73,0x28,0x93,0x7a,0x73, +0x28,0x94,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22, +0x12,0xc0,0x5, 0x12,0x63,0x2, 0x7a,0x37,0x39,0x4, 0x12,0x69,0x87,0x12,0x28,0x48, +0x2, 0x68,0x23,0x12,0x69,0x84,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3, +0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca,0x79,0x7e,0x13,0x2a,0x2, 0x7e,0x78, +0x29,0xbc,0x12,0x69,0x84,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0x19, +0x7e,0xa0,0x5, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12, +0x68,0x23,0x21,0x6d,0xbc,0x20,0x50,0x3, 0x12,0x68,0x23,0x6c,0x0, 0x21,0x62,0x7e, +0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x21,0x60,0xa, +0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x21,0x43,0x12, +0x69,0x7a,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x21,0x0, 0x7d,0xd3,0x7e,0x70,0x4, +0xac,0x79,0x49,0x23,0x35,0x43,0x12,0x69,0x70,0x9d,0x32,0x12,0x21,0x0, 0x7d,0xc3, +0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x69, +0x7a,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x43,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28, +0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, 0x7a,0xb3,0x34,0x89, +0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3, +0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80,0x53,0x7e,0x50,0x9, +0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x35,0x41,0x49, +0x22,0x29,0xa, 0x59,0x27,0x35,0x43,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x34,0x88,0x80, +0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34, +0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, +0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x41,0x12,0x69,0x70,0x59,0x32,0x35,0x43, +0xb, 0x0, 0x90,0x60,0x99,0xe4,0x93,0xbc,0xb0,0x28,0x2, 0x1, 0x6f,0xda,0x79,0x22, +0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x41,0x22,0xa2,0x8, 0x22,0x7e,0x34,0xd, 0xac,0x12,0x26,0x5b,0x12,0x7a, +0x2d,0x12,0x69,0xab,0x2, 0x69,0x97,0x30,0xf, 0x10,0x12,0x6e,0x8f,0x50,0x3, 0x12, +0x6f,0x6e,0x12,0x6a,0x50,0x12,0x69,0xd1,0xc2,0xf, 0x22,0x7e,0xb3,0x2b,0x1e,0x70, +0x1f,0x12,0x26,0x57,0x12,0x2f,0xf4,0x50,0xfb,0x12,0x6a,0x50,0x12,0x88,0x17,0x20, +0xf, 0x3, 0x12,0x69,0xd1,0x74,0x2, 0x7a,0xb3,0x2b,0x1e,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12, +0x87,0x56,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0xc0,0xa2,0xf5,0x2a, +0x7e,0x73,0x2b,0xf, 0xbe,0x71,0x2a,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x91,0x67,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x44,0x6d,0x22,0x7a,0x1f,0x37,0x40,0x7c,0xbc,0x12,0x6c,0x20,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x62,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x6d,0x13,0xda,0x3b,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12, +0xbf,0xfb,0x7a,0x55,0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d, +0x7f,0x3, 0x7e,0x1d,0x2a,0x12,0x79,0x7a,0x12,0xc0,0x75,0x12,0xc0,0x22,0x75,0x2e, +0x0, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0xc0,0xff,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6a,0xd4,0x12,0xb3,0x5f,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x30,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12, +0x7b,0x20,0x7e,0x35,0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30, +0x38,0xdc,0x5, 0x2e,0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b, +0x1d,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x6d,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d, +0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x6e,0x8f,0x50,0x7c,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x6e,0x12,0x6b,0xff,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x8, 0x12,0x6d,0x34,0x38,0xea,0x6c,0xcc,0x80,0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a, +0x12,0x6b,0xff,0x75,0x3b,0x0, 0x80,0x27,0x7e,0xb3,0x37,0xb1,0xbe,0xb1,0x3b,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x60,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x62,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e, +0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12,0xc0,0x90,0x68,0xb, 0x7e,0x34,0x10, +0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x50,0x12, +0x6c,0x8, 0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70, +0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a, +0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, +0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x7f,0x78,0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe, +0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x6b,0xf6,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d, +0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80, +0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x35,0x7a,0x37,0x25,0xba,0x7e,0x35, +0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12, +0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25, +0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac, +0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37, +0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22, +0xca,0x3b,0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b, +0xf, 0xf5,0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xb9, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x60,0x7e,0x8, 0x25,0x2a, +0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbc,0x12,0xb3,0x2a,0x74,0x1, 0x7a,0xb3,0x2b,0x1d, +0x74,0x5, 0xac,0xbc,0x12,0xc0,0x19,0x74,0x5, 0xac,0xbc,0x12,0x6f,0xff,0x74,0x5, +0xac,0xbc,0x12,0xc0,0x10,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0xc2,0x3, 0x12,0xc0,0xa2,0x12,0x6d, +0x13,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, +0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x6a,0xd4,0x12, +0xbf,0xfb,0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xa8,0xef,0x12, +0xa9,0xa6,0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3, +0x2b,0x14,0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39, +0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, +0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd, +0xda,0x3b,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6e,0x29,0x30,0xc, 0xa, 0x12,0xae,0xfa, +0x30,0x3, 0x4, 0xe4,0x12,0xa, 0x66,0x30,0x3, 0x9, 0x12,0xae,0xaf,0x12,0x8d,0xef, +0x2, 0x8c,0x90,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f, +0x50,0x7e,0x14,0x22,0xe2,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x7a,0x1d,0x2c,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f, +0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c,0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x34,0x6c, +0xcc,0x80,0x4f,0x12,0x6e,0x19,0x40,0x48,0x12,0x6e,0xf, 0x50,0x43,0x74,0x2, 0xac, +0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x0, 0x7d,0x3, 0x7d, +0x31,0x12,0x21,0x0, 0xbd,0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e, +0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d, +0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34, +0xb, 0xc0,0x12,0x6d,0x34,0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12, +0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, +0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12, +0x6e,0x19,0x40,0x8, 0x12,0x6e,0xf, 0x50,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x12,0x6d, +0x34,0x38,0xec,0xb, 0xd0,0xbe,0xd0,0x3, 0x50,0x2, 0xa1,0x68,0xda,0x3b,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xb9,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x12,0x6e,0xa0,0x7a,0x37,0x2b,0x1b, +0x22,0x7e,0xa3,0x0, 0x4f,0xbe,0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xec,0x68,0x42, +0x74,0x5, 0xa4,0x12,0xc0,0x99,0x12,0x6e,0x83,0x12,0xc0,0x19,0x12,0x6e,0x83,0x12, +0xc0,0x10,0x12,0x6e,0x8f,0x50,0x9, 0x7e,0xb3,0x0, 0x4f,0x12,0xb3,0x2a,0x80,0x6, +0x12,0x6e,0x83,0x12,0x6f,0xff,0x12,0x6e,0x29,0x12,0x6f,0xf8,0x7e,0x73,0x2b,0x14, +0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x4f,0x7a,0x73, +0x3, 0xec,0x22,0x7e,0xa3,0x0, 0x4f,0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x20,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xb2,0x70,0x2, 0xc3,0x22,0xd3,0x22, +0x7e,0x23,0x2b,0xf, 0x7e,0x33,0x37,0xcd,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x0, 0xac,0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, +0xa, 0x7e,0x63,0x2b,0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe, +0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61, +0x1b,0xe4,0x93,0x7c,0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73, +0x2b,0x10,0x80,0x9, 0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b, +0x10,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c, +0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x38,0xc0,0x69,0x51,0x0, +0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d, +0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, +0x1f,0x58,0x7e,0xb, 0x70,0x7a,0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b, +0x62,0x29,0x70,0x0, 0x1, 0x7a,0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b, +0x20,0x12,0x6e,0x29,0x12,0x6f,0xf8,0xd2,0x3, 0xc2,0x4, 0x2, 0x48,0xf4,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x4f,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6f,0xea,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0xc0,0x56,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0xc0, +0x4b,0x12,0x20,0xb9,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6f,0xea,0xca,0x39,0x7e, +0x23,0x0, 0x4f,0x7e,0x30,0x38,0xac,0x23,0x12,0xc0,0x56,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x8c,0xac,0x23,0x12, +0xc0,0x4b,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6f,0x42,0x7e,0x34,0x0, 0x38,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x3, 0x8b,0x9, +0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0x7e,0x37,0x3, 0xed,0xb, 0x34,0x7a,0x37, +0x3, 0xed,0x7e,0x37,0x3, 0xef,0xbe,0x37,0x3, 0xed,0x28,0x3, 0x2, 0x70,0x23,0x22, +0x2, 0x70,0x8, 0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x70,0x20,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b, +0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e, +0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a,0xb3,0x2b,0x74,0x7a,0xb3,0x2b, +0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x25,0xee,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2, +0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93, +0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74,0xbc,0x7e,0x28, +0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3,0x2a,0x6e,0x7a, +0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3,0x2a,0x74,0x90, +0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9,0xe4,0x93,0xa, +0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a,0xa, 0x3e,0x9d, +0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a,0x78,0x90,0x60, +0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f,0xca,0x39, +0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12,0x20,0xb9,0x1b, +0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x2b,0x21,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x72,0x92,0x12,0x79,0x31,0x90,0x60, +0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76,0x12,0x70,0x59, +0x74,0x1, 0x12,0x3d,0xac,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x2, 0x12,0x73, +0xf1,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a,0xb3,0x2b,0x4, +0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0x9e,0x7a,0x37,0x2b, +0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x9, 0x7e, +0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a,0xb3,0x2b,0x62, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4,0x93,0x7a,0xb3, +0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x2b, +0xf, 0x12,0x6e,0x29,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61, +0x22,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12, +0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3, +0x2b,0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61, +0x20,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b, +0x14,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d, +0x7a,0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64, +0xe4,0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61, +0x7e,0x34,0x20,0x5b,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x12,0xc0,0xab,0x12,0x72,0xf4,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x72,0xdb,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x72,0xdb,0xa, +0x1b,0x2e,0x14,0x2a,0x7c,0x12,0x72,0xe8,0xe5,0x25,0x12,0x72,0xdf,0xa, 0x1b,0x2e, +0x14,0x2b,0x23,0x12,0x72,0xe8,0xe5,0x24,0x2, 0x20,0xde,0x7e,0x34,0x0, 0x2, 0x12, +0x20,0xde,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, +0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a, +0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x73,0x20,0x38,0xef,0x12,0x73,0x20,0x68,0x7, +0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22, +0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x12,0x77,0xfd,0x12,0x70,0xa7,0x12,0x0, +0xa, 0x12,0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8, +0x7e,0x1f,0x6, 0xf4,0x12,0x79,0x9d,0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e, +0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12, +0x79,0x7a,0x12,0x79,0x2e,0x12,0x25,0x45,0x12,0x73,0xa7,0x12,0x73,0x7f,0x2, 0x73, +0x71,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x12, +0x73,0xe5,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, 0x28,0xae,0x74,0xff,0x12,0x20, +0xde,0x12,0x9f,0xe3,0x7e,0x8, 0x29,0xbc,0x12,0x5e,0x61,0x7e,0x8, 0x2a,0x2, 0x7e, +0x34,0x0, 0xb, 0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4, +0x12,0x20,0xde,0x90,0x60,0x9c,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74, +0xff,0x12,0x20,0xde,0x90,0x60,0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26, +0xb4,0x74,0xff,0x12,0x20,0xde,0x90,0x60,0x9a,0x12,0x73,0xe8,0x7e,0x8, 0x27,0x76, +0x74,0xff,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78, +0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc, +0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, +0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80, +0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73, +0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d, +0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a, +0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26, +0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x75,0xb2, +0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d, +0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53, +0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x75,0x9f,0xb, +0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80, +0x19,0x12,0x75,0xa8,0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58, +0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3, +0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x75,0x97,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12, +0x75,0xb2,0xb, 0x6a,0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d, +0x2d,0x7e,0x67,0x2a,0x51,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, +0x90,0x12,0x75,0x9f,0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, +0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x75,0xa8,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c, +0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12, +0x74,0x3c,0x38,0xab,0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, +0x12,0x75,0x97,0x2d,0x15,0x6c,0xaa,0x80,0xe, 0x12,0xa5,0xe4,0xb, 0x7a,0x90,0xbd, +0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xed,0x7a,0xb7,0x8, 0x4, +0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32, +0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e, +0x74,0x62,0x10,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d, +0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31, +0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0xa6, +0x56,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x75,0x97,0x7e,0xd, 0x24,0x2d,0x15,0x7f, +0x13,0x2d,0x35,0x12,0x6d,0x3b,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a, +0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x75,0xbc,0x7e,0x37,0x28, +0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x75, +0xbc,0x12,0x76,0x2b,0x12,0xa7,0x45,0x2, 0x76,0x1a,0xe4,0x7a,0xb3,0x3, 0xff,0x7e, +0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x3, 0xff,0x22,0xca,0x3b,0x7e,0xf3,0x2a, +0x6e,0x12,0xc0,0xb4,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, +0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0xa7,0xcd,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda, +0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0xbb,0x95,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, +0xf8,0x12,0x3f,0xf2,0x12,0x76,0x9a,0x12,0x74,0x43,0x7e,0xb3,0x16,0x90,0xb4,0x1, +0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26, +0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x20, +0xde,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26, +0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0xbf,0xeb, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0xbf,0xc7, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x86,0x12,0xc0, +0x40,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x89,0x12,0xc0, +0x40,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3, +0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0xbf,0xeb,0x7e,0x50,0x1, 0x12,0x77,0x60,0x7a, +0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0xbf,0xc7,0x7e,0x50,0x1, 0x12,0x77,0x60, +0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22, +0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0, +0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4, +0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0, +0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, +0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c, +0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b, +0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f, +0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0xe4,0x7a,0xb3, +0x37,0x9c,0x7a,0xb3,0x37,0x9d,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0x9e,0x90,0x60, +0x51,0xe4,0x93,0x7a,0xb3,0x37,0x9f,0xe4,0x7a,0xb3,0x37,0xa0,0x90,0x60,0x99,0x93, +0x7a,0xb3,0x37,0xa1,0xe4,0x7a,0xb3,0x37,0xa2,0x7a,0xb3,0x37,0xa3,0x90,0x61,0xc4, +0x93,0x7a,0xb3,0x37,0xa5,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34, +0x7a,0x73,0x37,0xa9,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a, +0x73,0x37,0xaa,0x74,0x64,0x7a,0xb3,0x37,0xbb,0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3, +0x37,0xbc,0x90,0x61,0x17,0xe4,0x93,0x7a,0xb3,0x37,0xa8,0x90,0x61,0x19,0xe4,0x93, +0x7a,0xb3,0x37,0xbe,0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x37,0xbd,0x90,0x61,0x1d, +0xe4,0x93,0x7a,0xb3,0x37,0xbf,0x90,0x61,0x25,0xe4,0x93,0x7a,0xb3,0x37,0xba,0xe4, +0x7a,0xb3,0x37,0xb5,0x74,0xfa,0x7a,0xb3,0x37,0xb3,0x74,0x1e,0x7a,0xb3,0x37,0xb4, +0x74,0x1, 0x7a,0xb3,0x37,0xb2,0x74,0xc, 0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3, +0x37,0xb6,0xe4,0x7a,0xb3,0x37,0xb7,0x7a,0xb3,0x37,0xb8,0x7e,0x8, 0x37,0xc0,0x7e, +0x34,0x0, 0x2c,0x12,0x20,0xde,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0xa, 0x36,0x7a, +0x73,0x37,0xcb,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0x7a,0x73,0x37,0xcc,0x90,0x60, +0xd4,0x93,0x7a,0xb3,0x37,0xcd,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x37,0xce,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b, +0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xe9,0x74,0x1, 0x7a,0xb3,0x37,0xe0,0x7e,0x34,0x0, +0x28,0xca,0x39,0x7e,0x34,0x61,0xd5,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12, +0x20,0xb9,0x1b,0xfd,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0x2, 0x23, +0xa6,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x6d, +0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x20, +0xde,0x7f,0x6, 0x7d,0x3f,0x12,0x20,0xde,0x7a,0xb3,0x16,0x91,0x22,0x7f,0x70,0x7e, +0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c, +0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x20,0xde,0x7f,0x7, 0xa, +0x3a,0x2, 0x20,0xde,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15, +0x12,0x79,0x9d,0x12,0x3f,0xd2,0x7e,0xe0,0x1, 0x12,0x4f,0xaf,0x30,0x18,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x7b,0x29,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac, +0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15, +0x12,0x7b,0x20,0xb, 0xd0,0x7e,0x73,0x2a,0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, +0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c, +0xbf,0x2e,0x73,0x2a,0x73,0x12,0x7a,0x8e,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b, +0x2, 0x70,0x41,0x12,0x2f,0xf4,0x50,0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x7a,0x75, +0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x72,0x12,0x79,0xc4,0x74, +0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x7a,0x75,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f, +0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x79,0xc4,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4, +0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x3d,0xac,0x7c,0xba,0x12,0x13, +0xc7,0x74,0xa, 0x12,0x45,0x15,0x7c,0xb9,0x12,0x0, 0x1e,0x2, 0x4e,0xe7,0xca,0xd8, +0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0x7b,0xd0,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74, +0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11, +0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x1f,0x7, 0x1b,0x6a,0x30,0xb, 0xd0,0xbc, +0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3, +0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73,0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c, +0x7f,0x12,0x7a,0x8e,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12, +0x20,0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, 0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, +0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22, +0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, +0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x29,0x6f,0x7c,0xe7,0x80,0x5d,0x12,0x26,0x57, +0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x12,0x7b,0x29,0x6c,0xdd,0x80,0x3d, +0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, +0x1d,0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19, +0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x3f,0xb, 0xbe,0xb0, +0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x7b,0xb7, +0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa, +0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53,0x2a, +0x73,0xa, 0x25,0x2d,0x23,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22, +0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa, +0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38, +0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, +0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e, +0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x37,0xed,0x40,0x39,0x7e,0x37,0x37,0xed,0xb, 0x34,0x7a,0x37, +0x37,0xed,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x34,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x38,0xfb,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x70,0x5, 0x7e,0xb3,0x37,0x9c,0x22,0xbe,0xb0,0x3, 0x38,0x15, +0x75,0x1b,0x0, 0x30,0xe, 0x6, 0x7e,0x18,0x32,0xea,0x80,0x4, 0x7e,0x18,0x33,0x28, +0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e, +0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4, +0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xed,0x80,0x2, 0x15,0x1a,0x2, +0x7c,0x17,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x7d,0x61,0xbe,0xb0,0x80, +0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x61,0x22,0xb4,0xfc, +0x5, 0x7e,0xb3,0x37,0x8, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60, +0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x36,0x71,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22, +0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74,0xff,0x22,0x7c,0x7b,0x6c,0xaa,0x12, +0x3f,0xe1,0x78,0x9, 0x7c,0xb7,0x12,0x7c,0x64,0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, +0x7c,0xb7,0x12,0x37,0xeb,0x7c,0xab,0x7c,0xba,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5, +0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5, +0x1a,0x12,0x3f,0xb3,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12, +0x7c,0xfb,0xf5,0x91,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0, +0x82,0x12,0x7d,0x1a,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b, +0x32,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x37,0xf2,0x7e,0x73,0x37,0xf2,0xa, 0x27,0x2e, +0x24,0x0, 0x6, 0x12,0x51,0x4f,0x93,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x37,0xf2, +0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x37,0xf2,0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0x9b,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0x9b,0x7a, +0xa3,0x36,0xf2,0x22,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37,0x9c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, +0xe4,0x7a,0xb3,0x37,0x9c,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba, +0x12,0x7d,0xab,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3, +0x7c,0x7a,0x12,0x7e,0x45,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xdf,0x38, +0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x7e,0x21,0xa5,0xbb,0x8f,0x3, 0x75,0x19, +0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x44,0xc0,0x74,0x1, 0x7a,0xb3,0x33,0xff, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68,0x17,0x1b,0x61,0x68, +0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x36,0xe1,0xd2,0xd, 0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37, +0xef,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37, +0xef,0x15,0x1a,0x7e,0x27,0x37,0xef,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, +0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a,0xea, +0x22,0x7e,0xb3,0x37,0xf1,0x4, 0x7a,0xb3,0x37,0xf1,0xe5,0x19,0xb4,0x1, 0x8, 0xe4, +0x7a,0xb3,0x37,0xf1,0x75,0x19,0x0, 0x7e,0x73,0x37,0xf1,0x7a,0x73,0x36,0xf0,0x22, +0xe4,0x7a,0xb3,0x37,0x9c,0x7e,0x8, 0x32,0xea,0x12,0x7e,0xef,0x7e,0x8, 0x33,0x28, +0x7e,0x34,0x0, 0x3e,0x12,0x20,0xde,0x7e,0x18,0x32,0xea,0x7a,0x1d,0x14,0x12,0x7e, +0xd1,0x2, 0x7e,0xc4,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0x9c,0xf5,0x91, +0x22,0x2, 0x7e,0xd4,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e, +0x34,0x0, 0x3e,0x74,0xff,0x2, 0x20,0xde,0x7c,0xab,0x12,0x3f,0x52,0x7c,0xba,0x12, +0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x7f,0x67,0x49,0x35,0x34,0x3b,0x49,0x15, +0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40,0x15,0xbe, +0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12,0x7f,0x6f, +0x28,0xe, 0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, 0x80,0x2, +0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c, +0x7c,0xb9,0x12,0x31,0x27,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, +0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88,0x7f,0x10, +0x7f,0x4, 0x12,0x1e,0xeb,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x75, +0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b,0x2a,0x0, +0x1b,0x1a,0x10,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e, +0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12, +0x21,0x0, 0xe5,0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0, +0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e, +0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12,0x87,0xbc,0x90, +0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, +0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x87,0xd4,0xbe,0xc4, +0x0, 0x3f,0x38,0x1c,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61,0x3b,0x12,0x81, +0x2, 0x12,0x80,0xf1,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xee, +0x12,0x66,0xb1,0xbd,0x5c,0x38,0x21,0x7d,0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12, +0x81,0x2, 0x90,0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b, +0x7c,0x12,0x80,0xf9,0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b, +0x1b,0x54,0xbd,0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f, +0x80,0xa, 0x7d,0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x87,0xcc,0x7f, +0x17,0x12,0x1e,0xfc,0x7f,0x71,0x12,0x81,0x1c,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40, +0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d, +0x22,0x2f,0x71,0x12,0x80,0xf1,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, +0x90,0x61,0x3a,0xe4,0x93,0x12,0x80,0xf9,0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f, +0x22,0x90,0x61,0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d, +0x22,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d, +0x2e,0x7c,0x76,0x7c,0x65,0x7f,0x71,0x22,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65, +0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12, +0x9f,0x40,0x7d,0x3, 0x74,0x9, 0xac,0xbf,0x12,0x87,0xe5,0x49,0x35,0x28,0xae,0x12, +0x81,0xbf,0x12,0x81,0x18,0x7d,0x13,0x5e,0x30,0xfc,0x7e,0x70,0x9, 0xac,0x7f,0x49, +0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d, +0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34, +0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x12,0x81,0xb3,0x12,0x81, +0x18,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, +0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30, +0xda,0x79,0x22,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d, +0x32,0x12,0x21,0x0, 0x7d,0x13,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b,0x74, +0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3,0x49, +0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x81,0xbf,0x7d,0x3f,0x9d,0x35,0x12,0x21, +0x0, 0x9d,0x34,0x12,0x21,0x0, 0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0xf, 0x12,0x67,0xeb,0x7e,0x14,0x62,0x6a,0x12,0x87,0xee,0x50, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7, +0x2f,0x9e,0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7, +0x2f,0x9a,0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x81,0xc7, +0x70,0x2, 0x61,0x45,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70, +0x9, 0x7e,0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45, +0x7e,0x73,0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f, +0xa4,0x7e,0x17,0x2f,0xa6,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45,0x7e,0x34,0x62,0x72, +0x12,0x83,0x4a,0x28,0x4a,0x7e,0x34,0x62,0x70,0x12,0x83,0x54,0x50,0x41,0x7e,0xb3, +0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0x9e,0x12,0x83,0x5e,0x7d,0x8f, +0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0x87,0xc4,0x9d, +0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40,0x2, 0x61, +0x45,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7b,0x7e,0xf0,0x21,0x80,0x76,0x7e, +0x34,0x62,0x7a,0x12,0x83,0x54,0x28,0x6d,0x7e,0x34,0x62,0x78,0x12,0x83,0x4a,0x50, +0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62,0x7e,0x12,0x23,0x9e,0x12,0x83, +0x5e,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50,0x4a,0x7e,0x34,0x62,0x7c,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7,0x2f,0x82,0x28,0x37,0x7d,0xfb, +0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x26,0x12, +0x67,0xf2,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd,0x49,0x25,0x2b,0xab,0x49,0x5, +0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, 0x9d,0x32,0xbe,0x34,0x0, 0x10, +0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xf0,0xbd,0xfc,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xbd,0xfb,0x22,0x7e,0x14, +0x62,0x8e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22,0x12,0x86,0x69,0x7a,0x37,0x2f, +0x9c,0x12,0x85,0xf4,0x7a,0x37,0x2f,0x9e,0x12,0x82,0x16,0x60,0x1, 0x22,0x7e,0x73, +0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f,0x80,0x2, +0x83,0x92,0xca,0xf8,0x7e,0x45,0x24,0x7c,0xb9,0x7a,0xb3,0x38,0x3f,0x74,0xff,0x7a, +0xb3,0x38,0x3e,0x6d,0x55,0x80,0x19,0x7d,0xf5,0x3e,0xf4,0x12,0x86,0x74,0x7d,0xe5, +0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54, +0xbd,0x45,0x38,0xe3,0x7e,0x33,0x38,0x3f,0xbe,0x30,0x4, 0x38,0x2, 0x81,0x54,0x69, +0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e, +0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x40,0x7a,0xb3, +0x38,0x42,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f, +0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x38,0x42,0x7d,0xf, 0x2d,0xf, 0xbd, +0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x38,0x42,0xa, 0x37,0x6d,0x22,0x12, +0x1e,0xeb,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7a,0x73,0x38,0x42,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x84,0x73,0x12, +0xbf,0x1c,0x12,0x84,0x73,0x12,0x84,0x7c,0x12,0x84,0x73,0x12,0xa5,0x28,0x80,0xa, +0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x38,0x3e,0xe4,0x7a,0xb3,0x38,0x3f,0x7e, +0x73,0x39,0x1, 0xbe,0x73,0x38,0x3e,0x48,0x6, 0x7e,0xb3,0x38,0x40,0x80,0x1, 0xe4, +0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71, +0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a, +0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0xa1,0x9d,0x7e,0x90,0x2, 0xac,0x9a, +0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x26,0x7f,0x67,0x2d, +0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f, +0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a, +0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe, +0xf0,0x2, 0x58,0x2, 0xa1,0x9b,0xbe,0x60,0x0, 0x18,0x2, 0xa1,0x83,0xbe,0x70,0xec, +0x28,0x2, 0xa1,0xa7,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7, +0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x85,0xeb,0x19,0xba,0x22, +0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x85,0xeb,0x19,0xba,0x23,0xe4,0x9, 0xba, +0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7, +0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0x85, +0xeb,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12,0x85,0xe2,0x19,0xbd,0x22,0xf5,0xa, 0xd9, +0x12,0x85,0xe0,0x19,0xbd,0x23,0xe5,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe, +0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12, +0x85,0xe0,0x19,0xbd,0x22,0xf4,0xa, 0xc9,0xa, 0xd4,0x12,0x85,0xe0,0x19,0xbd,0x23, +0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f,0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, +0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23,0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x38, +0x3f,0xbc,0xba,0x28,0x2, 0x81,0x9b,0x7a,0x73,0x38,0x3f,0x7e,0xa0,0x1, 0x80,0x25, +0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d, +0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e, +0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x38,0x3f,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22, +0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c, +0xbd,0xa, 0xa7,0x22,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0x86,0x69,0x7a,0x37,0x2f,0xa0,0x12, +0x85,0xf4,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0x86,0x69,0x7a,0x37,0x2f, +0xa4,0x12,0x85,0xf4,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7c,0xab, +0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4,0x14, +0x78,0xfb,0x12,0x86,0x72,0x2d,0xfe,0x80,0xf, 0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x12,0x86,0x72,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a, +0xbd,0xf4,0x38,0xd0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61, +0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b, +0x7e,0x63,0x2a,0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10, +0x7d,0x21,0x12,0x87,0xdc,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34, +0x37,0x44,0x6d,0x22,0xe4,0x2, 0x86,0x7e,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b, +0x68,0x4f,0x12,0x87,0x56,0x7c,0x3b,0x7c,0xb2,0x12,0x87,0x56,0x7c,0xab,0xbe,0x30, +0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12, +0x91,0x67,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e, +0x34,0x16,0x93,0x6d,0x22,0x30,0x16,0x3, 0x2, 0x86,0xc7,0x7e,0xb3,0x2b,0x1d,0xb4, +0x1, 0xf, 0x12,0xbf,0xfb,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x86, +0x7e,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, +0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40, +0xe9,0x74,0xff,0x22,0x7e,0xb3,0x37,0x31,0x70,0x6, 0x12,0x87,0xad,0x2, 0x87,0xb6, +0x12,0x63,0x9, 0x12,0xbd,0x4d,0x50,0xa, 0x12,0x83,0x6a,0x7c,0x3b,0x12,0x87,0xad, +0x80,0x5, 0x12,0xbd,0xf4,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xbc,0xd1, +0x60,0xa, 0x7a,0x33,0x37,0x34,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4,0x7a,0xb3, +0x2f,0x80,0x22,0x2, 0x81,0x23,0xe4,0x7a,0xb3,0x38,0xdd,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x3e,0x24,0x7e,0xf, +0x38,0xd9,0x2d,0x12,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x32,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74,0x6, +0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x5, 0x7d,0x53,0xbe,0x54,0x0, 0xff, +0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x12,0x6e,0x8f,0x50,0x3, 0xd2,0xf, 0x22,0xc2, +0xf, 0x22,0x12,0xac,0xc6,0x12,0x88,0x2b,0x2, 0x88,0x17,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x20,0xde,0x12,0xaa,0x3e,0x12,0xaa,0x35,0xa9,0xd1,0xcb, +0x12,0xc0,0xff,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0xb4,0x4d,0x2, 0xd, 0x7, 0x12, +0x54,0x94,0x12,0x88,0xb9,0x12,0x8c,0xad,0x7e,0xb3,0x37,0x6, 0xb4,0x1, 0x1e,0x7e, +0x34,0x61,0xc0,0x12,0x87,0xcc,0x7e,0x24,0x0, 0x5, 0xad,0x12,0x7a,0x17,0x28,0xa1, +0x7e,0x14,0x61,0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39, +0x11,0x60,0x7, 0x14,0x7a,0xb3,0x39,0x11,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, +0x12,0x88,0x22,0x12,0x8c,0x90,0x12,0xb3,0xa9,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12, +0xbb,0x10,0x12,0xaa,0x47,0x2, 0x8d,0x10,0x22,0x7e,0x90,0x1, 0x7e,0xb3,0x2f,0xa9, +0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xa9,0x7e,0x34,0x61,0xc0,0x12,0x23, +0x9e,0x12,0xc0,0x87,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x12,0x8c,0x87,0xb, 0x1a, +0xf0,0x7e,0x34,0x61,0x4f,0x12,0x87,0xbc,0xe4,0x7a,0xb3,0x28,0xac,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x7e,0x34,0xff,0xfa,0xad,0x3f,0x12,0x8f,0xdc,0x7d,0xc3,0xe, 0xc4, +0x7e,0xe7,0x7, 0xfe,0xbd,0xe3,0x58,0x15,0x7e,0xe7,0x7, 0xfc,0xbd,0xec,0x58,0xd, +0x12,0x8a,0x7c,0x8, 0x8, 0x12,0x8b,0xe, 0x60,0x3, 0x12,0x8a,0x95,0x12,0x8b,0xe, +0xa, 0xeb,0x4d,0xee,0x68,0x3b,0x6d,0xee,0x9d,0xef,0xbe,0xe7,0x7, 0xfe,0x18,0x6, +0xbe,0xe7,0x7, 0xfc,0x8, 0x2b,0x12,0x8a,0x7c,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12, +0x21,0x0, 0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x8a,0x74,0x28,0x14,0x7e,0x83,0x28, +0x85,0xbe,0x80,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xcf,0x58,0x3, 0x12,0x8a, +0x95,0x12,0xad,0x5, 0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xc0,0xf7,0x68,0x6, +0x7e,0xb3,0x39,0xb, 0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x7d,0x12,0x8a,0x74, +0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0xad,0x43,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x12,0x8a,0xa6,0x7c,0x9b,0x80, +0x1a,0x7e,0xb3,0x26,0x84,0x70,0x14,0x7e,0xb3,0x26,0x85,0x70,0xe, 0x12,0x8a,0x74, +0x28,0x9, 0x7e,0x90,0x3, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0xc7,0x7, 0xfa,0xbe, +0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x8a,0x74,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7, +0x28,0x8e,0x58,0x8, 0x12,0x8a,0x87,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0x29,0x7e,0x14, +0x61,0xc0,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0x7e,0x14,0x61, +0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x12,0x0, 0x66,0x50,0xd, 0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x8f,0xe3,0x28,0x3, 0x12,0x8a,0x87,0x7e,0xc7,0x28,0x8a, +0xbd,0xcd,0x8, 0x19,0x12,0x9b,0xf, 0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28, +0x8e,0x58,0xa, 0x12,0x0, 0x66,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x8b,0x8e, +0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x2, 0x12,0xac,0x6d,0x7e,0xb3,0x2f,0xaa,0xbe, +0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xaa,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8c,0x7f,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0x6d,0xee,0x9e,0xe7, +0x2a,0x5a,0xbe,0xe7,0x28,0x8e,0x22,0xe4,0x7a,0xb3,0x2f,0xaa,0x7a,0xb3,0x28,0xac, +0x74,0x2, 0x2, 0x29,0xfa,0x74,0x2, 0x7a,0xb3,0x2f,0xaa,0xe4,0x7a,0xb3,0x2f,0xa9, +0x12,0x8c,0x7f,0x2, 0x29,0xfa,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x8c,0x87, +0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x8b,0x6, +0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e, +0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x4, +0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11, +0x7e,0x34,0xff,0xfd,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0, +0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x1e,0xb9,0xbd,0x34,0x22,0x6c,0x66, +0x90,0x60,0xa7,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28, +0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14, +0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x9d,0x8b,0x50, +0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, +0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e, +0x73,0x2a,0x6d,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0xca,0x3b, +0x12,0xa6,0x4e,0x38,0x2, 0x81,0x55,0x7e,0xc3,0x2f,0xad,0x4c,0xcc,0x78,0x3d,0x7a, +0xb3,0x2f,0xad,0xe4,0x7a,0xb3,0x2f,0xaf,0x6c,0xaa,0x80,0x26,0x12,0x8c,0x60,0x7e, +0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a,0x49,0xd0,0x19, +0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8c,0x6a,0x59,0x34,0x0, 0x2, +0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c,0xfc,0x6c,0xaa, +0x80,0x35,0x12,0x8c,0x60,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, 0xb4,0x0, 0x8, +0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8c,0x6a,0x7d,0x23,0x49,0x34,0x0, 0x2, 0x9d, +0x32,0x12,0x21,0x0, 0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x4c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x2f,0xaf,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x8c, +0x60,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x4c,0x0, 0x12,0x8c,0x71,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x2f,0xaf,0x80,0x6, 0x12,0x8c,0x71,0x75,0x4c,0x0, 0xe5,0x4c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xb0,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x40,0xe4,0x7a,0xb3,0x2f,0xae,0x7a,0xb3,0x2f,0xad,0x7a,0xb3,0x2f,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22, +0x12,0x8c,0xcd,0x6d,0x33,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x5, 0x12,0x8d,0x5e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xf6,0xe4,0x7a,0xb3,0x36,0x72,0x22,0x12,0xb0,0x94, +0x60,0x1a,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x7e,0x37,0x38, +0xd2,0x12,0x25,0x3c,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x23,0x12,0x8d,0x8, 0x28, +0x26,0xa, 0x4a,0x9, 0x64,0x36,0x76,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x42,0x38,0xcc,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x80,0xb, 0xa0,0x7e, +0xb3,0x36,0x73,0xbc,0xba,0x38,0xd5,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xae,0xa2,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x8d,0x5e,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x84, +0x49,0x12,0x36,0x80,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x84,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x36, +0x84,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x36,0x80,0x59,0x32,0x36,0x84,0x22,0x7e,0xb3,0x36,0x66, +0x60,0x6, 0x14,0x7a,0xb3,0x36,0x66,0x22,0x12,0x8c,0xcd,0x90,0x61,0xc5,0xe4,0x93, +0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x8d,0xef,0x7e,0xb3,0x36,0xec,0x70,0xe, 0x7e,0xb3, +0x39,0x12,0xb4,0x1, 0x7, 0xe4,0x12,0x8d,0xb3,0x12,0xc0,0x6b,0x12,0x67,0x1f,0x12, +0x8e,0xa2,0x7e,0xa3,0x36,0xec,0x7a,0xa3,0x39,0x12,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x8d,0xb3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf,0x12,0xc0,0x99,0x12,0xc0, +0x19,0x12,0x6f,0xff,0x12,0xc0,0x10,0x7a,0xf3,0x0, 0x4f,0x7c,0xbf,0x12,0xb3,0x2a, +0x12,0x6e,0x29,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37,0x12,0xae,0xe1,0x12,0x8d, +0xef,0x12,0x23,0x4, 0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8,0x22,0x12,0x8f,0xd2,0x7e, +0xb3,0x2b,0xf, 0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xc0,0x7e,0x73,0x37,0xcd,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36, +0x12,0x8f,0xca,0xbe,0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x36,0x72,0xa, 0x3e,0xad, +0x3b,0x7d,0xa3,0x2d,0xac,0x75,0x35,0x0, 0x7e,0xa3,0x36,0x72,0xbc,0xad,0x40,0x2, +0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e, +0x78,0xe, 0x7c,0xbd,0x14,0xbe,0xb3,0x36,0x72,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x72, +0x7e,0xc3,0x36,0x72,0x80,0x41,0x7e,0xb3,0x36,0x72,0x4, 0x7a,0xb3,0x36,0x72,0x7e, +0x90,0x5, 0xac,0x9c,0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb, +0x19,0xcd,0x36,0x76,0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, +0xf5,0x35,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0, +0xbe,0xf0,0x3, 0x50,0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x36,0x73,0xda, +0x3b,0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0x37,0x7e,0xb3,0x36,0x6b, +0xb4,0x1, 0x8, 0x12,0x88,0x22,0xe4,0x7a,0xb3,0x36,0x6b,0x7e,0xb3,0x36,0x6a,0x60, +0x4, 0x74,0xff,0xe1,0xc5,0x7e,0xb3,0x36,0x69,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xb9, +0x12,0xc0,0xef,0x38,0xc, 0x12,0x8f,0xf3,0x38,0x7, 0x12,0x8f,0xeb,0x38,0x2, 0xe1, +0xb9,0x12,0x8f,0xca,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, +0x80,0x3, 0x7c,0xbd,0x14,0x12,0xae,0x11,0x7c,0xfb,0x7e,0xb3,0x36,0x68,0x4, 0x7a, +0xb3,0x36,0x68,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xae,0x11,0x7c,0xab,0xbe,0xa0, +0xff,0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x36, +0x7e,0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, +0x12,0xae,0x98,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe, +0xf0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x68,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36, +0x75,0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x36,0x68,0x50,0x59, +0x74,0xc, 0xac,0xbf,0x49,0x25,0x36,0x7e,0x7e,0x14,0x61,0xcc,0x12,0x64,0xd3,0xbd, +0x23,0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0x9e,0xbe,0x37,0x36,0x64,0x40,0xd, +0x7e,0x34,0x61,0xd2,0x12,0x23,0x9e,0xbe,0x37,0x36,0x6f,0x50,0x23,0x74,0x5, 0xac, +0xbf,0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, +0x50,0x8, 0x12,0x87,0x52,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x6b, +0xe4,0x7a,0xb3,0x36,0x75,0x7a,0xb3,0x36,0x69,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a, +0xb3,0x36,0x68,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x90,0x61,0xc5,0xe4,0x93,0x7c, +0xdb,0x22,0x12,0xae,0xaf,0x74,0x1, 0x7a,0xb3,0x36,0x66,0x22,0x7e,0x24,0x0, 0x2, +0x2, 0x1e,0xb9,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26,0xf5,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf3,0x2a, +0x70,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3, +0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3, +0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x90, +0x50,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f, +0x36,0x6d,0x0, 0x12,0x1f,0x7, 0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x7, 0xda,0xf8,0x22, +0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8, +0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x6f, +0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x5c, +0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x60, +0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, +0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f, +0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x74,0xc8,0x7a,0xb3,0x39,0x6, 0xc2,0x17, +0x80,0xa, 0x12,0x45,0xd6,0x30,0x17,0x4, 0x75,0xe9,0xff,0x22,0x12,0x47,0xff,0x68, +0xf1,0x22,0x74,0x1, 0x12,0x90,0xf1,0x20,0x17,0x6, 0x12,0x46,0x4e,0x12,0x90,0xfa, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x90,0xb8,0x12,0x90,0xfa,0xe4,0x2, 0x90, +0xf1,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0x22,0xd2,0x4, 0x2, 0x45,0x5a,0xa, +0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x47,0xff,0x68,0xfb,0x20,0x93,0xfd, +0x22,0x7e,0x34,0x61,0x59,0x2, 0x23,0x9e,0x7e,0xb3,0x37,0x6, 0x70,0x2e,0x7e,0x73, +0x36,0xe9,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0x3, +0x7e,0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x91,0x6d,0x7c,0xab,0xe5,0x4e, +0xa, 0x3b,0x2e,0x37,0x38,0x83,0x7a,0x37,0x38,0x83,0x80,0xc, 0x7e,0xa3,0x36,0xea, +0xbe,0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x91,0x5d,0x75,0x4e,0x0, +0x7a,0xb3,0x39,0x6, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x20,0xf0,0x7a,0x71,0x82, +0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xb3,0x38,0x86,0x70,0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x38,0x86,0x22,0x7f,0x20,0xc2,0x4, 0x7e,0x2b,0x60,0x29,0x72,0x0, +0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21,0x0, 0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32, +0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x21,0x0, 0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d, +0x32,0x12,0x21,0x0, 0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60, +0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x37,0xf3,0x4d,0x33,0x68,0x2, +0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f,0x70,0x7c, +0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e, +0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12,0x87,0xbc,0x6c,0xff,0x12,0x2f,0xff,0x7f,0x51, +0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, 0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b, +0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e,0x14,0x62,0xa, 0x12,0x87,0xee,0x8, 0xc, 0x7e, +0x27,0x28,0x8a,0xbe,0x24,0x3, 0x20,0x8, 0x2, 0x61,0x2a,0xb, 0xa, 0xc0,0x1e,0xc4, +0xbd,0x3c,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x61,0x2a, +0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0, +0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca, +0x18,0x5, 0x4e,0xf0,0x1, 0x61,0x2a,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a, +0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa, +0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc, +0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90, +0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd, +0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b, +0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, +0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, +0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b, +0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0x40,0xbd,0x3d,0x22,0x7f,0x60,0x7e,0x6b,0xa0, +0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, +0x2d,0x15,0xb, 0x14,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0, +0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76,0x7d,0x13,0x1e, +0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e, +0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b, +0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xca,0x3b,0x6d,0x11,0x7e,0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c, +0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12,0x95,0x90,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x34,0xca,0x74,0x2, 0xa, 0x3f,0x19,0xb3,0x35,0x34,0xb, 0xf0,0x12,0x5e,0x2d, +0x38,0xe1,0x12,0x97,0xc0,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0xa1,0x69,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, +0x12,0x95,0xa1,0x38,0x2, 0xa1,0x67,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x4d,0x75,0x24,0x0, 0xa1,0x3f,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xca,0xbc,0xcd,0x68,0x2, 0xa1,0x3d,0x49,0x25,0x34,0xc8,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x0, 0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc6,0x74,0x9, 0xac,0xbf,0x12,0x96,0x1b,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x34,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x20,0xa, 0x1c,0x2e,0x14,0x35,0x34,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x67,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x69,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x1f,0x8c,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x97,0xae,0xac,0x3f,0x12,0x95,0x98,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x95,0x98,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x20,0x80,0x2a,0x5, 0x24,0x90, +0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0x81,0x49,0x80,0x1a,0x6d,0x11,0x74, +0x2, 0xac,0xbd,0x12,0x95,0x90,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1,0x34,0xca,0x74, +0x2, 0xa, 0x1d,0x19,0xb1,0x35,0x34,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x25,0xe4, +0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x5f,0xc6,0xca,0x59,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x34,0xc6,0x12,0x20,0xb9,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, 0xda,0x3b,0x22, +0x59,0x15,0x35,0x20,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x1f, +0x8c,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80, +0x63,0x6c,0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac, +0xbe,0x9, 0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x95,0xa1,0x38,0xe5, +0x12,0x95,0xa1,0x28,0x43,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x81,0xb3, +0x74,0x9, 0xac,0xbd,0x12,0x87,0xe5,0x12,0x96,0x1b,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8b,0x59,0x35,0x34,0xb0,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x87,0xb3,0xb, 0xe0,0xbc,0xfe,0x38,0x99,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x21,0x0, 0x7e,0xb3,0x37,0x31,0x70,0x3, 0x12,0x93,0xe3,0x2, 0x96,0x30, +0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x96, +0x7c,0x7c,0xbf,0x12,0x97,0x10,0x4c,0xee,0x78,0x14,0x12,0x5f,0xc2,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0x80,0xb, 0x7e,0xb3, +0x2a,0x9, 0x70,0x5, 0x7c,0xbf,0x12,0x95,0xa9,0x7c,0xbf,0x12,0x9f,0x90,0xbe,0xf0, +0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4, +0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, 0x2, 0x96,0xeb,0xa5,0xbe,0x0, 0x1d,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, +0xa0,0x12,0x5e,0x25,0x38,0xed,0x74,0x1, 0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x47,0x81,0x1b, +0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x47, +0x81,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0x12,0x97,0x4, 0x7e,0x8, +0x34,0xb0,0xe4,0x12,0x20,0xde,0x90,0x60,0x99,0x12,0x97,0x8, 0x7e,0x8, 0x34,0x8b, +0xe4,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60,0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x97,0xb6,0x7c,0x7d, +0x7c,0x6f,0x12,0x97,0xb6,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x97,0xae,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x1f,0x8c,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x2e,0x34, +0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x8, 0x1f,0x34,0x12,0x9e,0x37,0x7c,0x1b,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x34,0x9f,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x34,0x9f,0x1e,0x34,0x7a,0x37,0x34,0x9f,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9f,0x7e,0x37,0x34,0x9f,0x22,0xca,0xf8,0x7c,0xfb, +0x6d,0xdd,0x7c,0xbf,0x12,0x98,0xea,0x7d,0xe3,0x7c,0xbf,0x12,0x37,0x6f,0x7d,0xf3, +0x74,0x2, 0xac,0xbf,0x9, 0x95,0x26,0xfb,0x7c,0xbf,0x12,0x9a,0xed,0x40,0x2, 0x1, +0xd4,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0xbe,0xa0,0x0, 0x28,0x9, 0xa, 0x3a, +0x1b,0x34,0x12,0x98,0xd8,0x7d,0xd3,0x12,0x98,0xdf,0xbd,0xc3,0x58,0xb, 0xa, 0xca, +0xb, 0xc4,0x7d,0x3c,0x12,0x98,0xd8,0x2d,0xd3,0x12,0x9b,0xf, 0x7d,0xd3,0xbe,0xa0, +0x0, 0x28,0x56,0x12,0x98,0xdf,0xbd,0xc3,0x58,0x4f,0xbe,0x90,0x0, 0x28,0x4a,0xbe, +0x90,0x0, 0x28,0x45,0xbe,0xf4,0x0, 0xc8,0x8, 0x3f,0x7d,0x3d,0x3e,0x34,0x3e,0x34, +0xbd,0x3f,0x8, 0x35,0x7e,0x70,0x2, 0xac,0x79,0x49,0x33,0x4, 0xfc,0xbe,0x34,0x1, +0x2c,0x8, 0x26,0xa, 0x2a,0x7e,0xb3,0x2a,0x74,0x12,0x9b,0x18,0xbe,0x34,0x1, 0x90, +0x8, 0x17,0xbe,0xf4,0x1, 0x5e,0x58,0xd, 0x7e,0x34,0x0, 0x3, 0xad,0x3e,0xbd,0x3f, +0x8, 0x3, 0xe4,0x80,0x30,0x74,0x1, 0x80,0x2c,0x90,0x60,0xab,0xe4,0x93,0xbc,0xb9, +0x78,0x22,0x7c,0xba,0x7c,0x79,0x12,0x2c,0x40,0xbe,0x34,0x0, 0x96,0x8, 0x12,0x74, +0x2, 0xac,0xb9,0x49,0x35,0x4, 0xfc,0xbe,0x34,0x0, 0x32,0x8, 0x4, 0x74,0x1, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xb7,0x7c,0x79,0x2, 0x2c,0x40,0x7e, +0xb3,0x2a,0x6f,0xa, 0x3b,0x1b,0x34,0xa, 0xca,0x22,0xca,0x79,0x7c,0x8b,0x6c,0xaa, +0x9f,0x77,0x12,0x9a,0x2a,0x1a,0x79,0x1b,0x74,0x80,0x4c,0x1a,0x38,0x1b,0x34,0x7c, +0xe7,0x80,0x38,0xbc,0x9f,0x78,0x4, 0xbc,0x8e,0x68,0x2e,0xbe,0xf0,0x0, 0x48,0x29, +0x7e,0xb3,0x2a,0x6f,0xa, 0x2b,0x1a,0x3f,0xbd,0x32,0x58,0x1d,0xbe,0xe0,0x0, 0x48, +0x18,0x7e,0xb3,0x2a,0x70,0xa, 0x2b,0x1a,0x3e,0xbd,0x32,0x58,0xc, 0x7c,0xbf,0x7c, +0x7e,0x12,0x2c,0x40,0x12,0x99,0x65,0xb, 0xa0,0xb, 0xe0,0x1a,0x28,0xb, 0x24,0x1a, +0x3e,0xbd,0x32,0x8, 0xbe,0xb, 0xf0,0x1a,0x29,0xb, 0x24,0x1a,0x3f,0xbd,0x32,0x8, +0xaa,0x4c,0xaa,0x78,0x4, 0x6d,0x33,0x80,0x9, 0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12, +0x1f,0x58,0xda,0x79,0x22,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7, +0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f,0x34,0x7e,0xb3,0x2a,0x70,0x7a,0xb3, +0x1f,0x35,0x12,0x9a,0x2a,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x41,0x17,0x7a, +0xf1,0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d, +0x32,0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a, +0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d, +0x32,0x7c,0xb7,0xf5,0x2c,0x80,0x40,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58, +0x10,0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5, +0x2e,0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b, +0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12, +0x2c,0x40,0x12,0x99,0x65,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x2c,0x1a, +0x3b,0xbd,0x32,0x8, 0xb2,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd, +0x32,0x18,0x2, 0x21,0x8f,0x7f,0x17,0xda,0x79,0x22,0x7e,0x70,0x2, 0xac,0x78,0x9, +0x93,0x26,0xfa,0x9, 0x83,0x26,0xfb,0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x62,0x27, +0x12,0x9a,0xe5,0x12,0x9b,0x23,0x50,0x2, 0x41,0xe0,0x7e,0x34,0x62,0x2b,0x12,0x23, +0x9e,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, 0x41,0xe0,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x9a,0xe5,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x4, 0x4c,0x8, 0x6b,0x6c,0xdd,0x80,0x5f,0xc2,0x3, 0x7c,0xbd,0x12,0x37,0x6f, +0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x99,0x6c,0x7a,0x35,0x24,0x9e,0x35, +0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0xdc,0x7a,0x35, +0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, +0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x9a,0xed, +0x50,0x2, 0xc2,0x3, 0x30,0x3, 0xf, 0x7c,0xbd,0x6c,0x77,0x12,0x51,0x5f,0x7e,0x70, +0x2, 0xac,0x7d,0x12,0x37,0x9f,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x99, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x7c,0x4b,0x74, +0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc, +0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x2, 0x1e,0xb9,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33, +0x4, 0xfc,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x37,0x6f,0xbe,0x34, +0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0xe9, +0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0x3b,0x7e,0x77,0x2a,0x5c,0x12, +0x9d,0xa1,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x9b,0xd7,0x7e, +0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x35,0xe5,0xbd,0x36,0x48,0x7, 0x3e,0x34,0x3e, +0x34,0x12,0x9b,0xd7,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0x9b,0x23,0x50,0x6, 0x7e, +0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60,0xc, 0x7e, +0xb3,0x35,0xe3,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xe3, +0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x45,0xe, 0x7e,0x53,0x35,0xe3,0xbe,0x50,0x0, +0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, 0x7d,0xfe, +0x7a,0xf7,0x2a,0x5c,0x12,0x9b,0xdf,0x28,0x3, 0x12,0x37,0xc2,0x7a,0x67,0x35,0xe5, +0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xb9,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x79,0xc2,0x3, 0x7e,0xf0,0x3, 0x7e,0xe3, +0x2a,0x3, 0x12,0x9b,0xdf,0x28,0x72,0x7c,0xbf,0x12,0x2c,0x47,0x4c,0xee,0x68,0xe, +0x7e,0x63,0x33,0xc0,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x33,0xc1,0x70,0x4, 0xd2,0x3, +0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x4d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x3, +0x80,0x1e,0xd2,0x3, 0x12,0x9c,0xf6,0x78,0xa, 0xa5,0xbe,0x0, 0x6, 0x6c,0xff,0xc2, +0x3, 0x80,0xd, 0x9e,0x73,0x33,0xc0,0xbc,0x7e,0x78,0x5, 0x7e,0xf0,0x2, 0xc2,0x3, +0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x2c,0x47,0x7e,0xa3,0x33,0xc2,0x7a,0xa3,0x28,0x84, +0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x33,0xc3,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9, +0x1b,0xfd,0x12,0x9c,0x6f,0xf5,0x4d,0x80,0x3, 0x75,0x4d,0x64,0xda,0x79,0x22,0x7e, +0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80, +0x42,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x9c,0xee,0x9, 0xb3,0x26, +0xfa,0x12,0x2f,0xd6,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12, +0x9c,0xee,0x9, 0xb3,0x26,0xfb,0x12,0x2f,0xd6,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, +0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c, +0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28, +0x84,0xbc,0xb1,0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c, +0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0xca,0x79,0x6c, +0x88,0x80,0x72,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a, +0x71,0x24,0x7c,0xbf,0x12,0x9d,0x8b,0x50,0x5a,0x6c,0xee,0x80,0x51,0xbc,0xe8,0x68, +0x4b,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9d,0x80,0xf5,0x26,0x6c,0x99,0x90,0x60,0xaa, +0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, 0x2f, +0xe5,0x25,0xa, 0x3b,0x12,0x35,0x67,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, 0x78, +0x1b,0x7c,0xbe,0x12,0x37,0x6f,0x7d,0xf3,0x7c,0xb8,0x12,0x37,0x6f,0xbd,0x3f,0x8, +0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x51,0x5f,0xb, 0xe0,0x12,0x9c, +0xf6,0x38,0xaa,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0x86,0xda,0x79,0x22, +0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0x22,0x7c,0xab,0x90,0x60,0xab, +0xe4,0x93,0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x31,0x5a,0x50,0x2, 0xd3,0x22,0xc3, +0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84,0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12, +0x2f,0xb7,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb, +0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x40,0x7d,0xf3,0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, +0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x2, 0x70,0x2d, +0x7e,0x73,0x2a,0x3, 0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc5,0x70,0x18,0x12, +0x9e,0x17,0x7e,0x73,0x2a,0x3, 0x7a,0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, +0x7e,0xb3,0x34,0xc5,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc5,0x22,0xe4,0x7a,0xb3, +0x34,0xc5,0x7a,0xb3,0x2a,0x9, 0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x35, +0xe9,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73, +0x35,0xe8,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0xc1, +0xd2,0x7c,0x57,0xc1,0xca,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98, +0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff, +0x68,0x66,0x12,0x9e,0xe2,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e, +0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, +0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x9e,0xe2, +0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7, +0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0xc1,0x45, +0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6,0x28,0x2, 0xc1,0x41,0x7c,0xba,0xda, +0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0x7c,0xab,0x7e,0xb, +0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x34,0xa3,0xbe,0x73,0x34,0xad, +0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa3,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22, +0xbe,0x73,0x34,0xad,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74, +0xff,0x19,0xb4,0x34,0xa3,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x34,0xa3,0xbe,0xb0,0xff, +0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa3,0xd3,0x22,0xe4,0x19,0xb3,0x34,0xa3,0xc3,0x22, +0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34, +0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x5, 0xbe, +0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34, +0xb0,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x34,0x8b,0x80,0x4, 0x59,0x35,0x34,0x8b,0x59, +0xf5,0x34,0xb0,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x25,0x3c, +0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x25,0x3c, +0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28, +0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90, +0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0x12,0x5e,0x25, +0x38,0xb2,0x22,0x7e,0x8, 0x34,0xa2,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20,0xde,0x6c, +0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12,0x2f,0xb7,0x60,0xa, 0x12,0xa0,0x84,0x40, +0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5, +0x7c,0xb0,0x6c,0x77,0x12,0xa0,0x49,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70, +0x1, 0x12,0xa0,0x49,0xb4,0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x2f,0xb7, +0x60,0xc, 0x12,0xa0,0x84,0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x51,0x5f,0xb, 0x10, +0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3,0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e, +0xb3,0x36,0x61,0x7a,0xb3,0x36,0x62,0x7a,0xa3,0x36,0x61,0x7e,0xb3,0x36,0x62,0x60, +0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e,0xb3,0x36,0x63,0x60, +0x5, 0x14,0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x0, 0x28,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c, +0xa7,0x90,0x60,0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, +0x80,0x71,0xbe,0xb0,0x2, 0x38,0x66,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27, +0x7e,0x73,0x26,0xfa,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26, +0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x2, +0x80,0x4e,0x6c,0xff,0x80,0x30,0x7c,0xbf,0x12,0x37,0x81,0x1a,0x4b,0x7c,0xbf,0x12, +0x37,0x6f,0x7d,0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d, +0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, 0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75, +0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xcb,0x80,0x6, 0xe5,0x1e,0x24, +0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, +0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22,0x7e,0x39,0x70,0xa, 0x37,0x9d,0x32,0x2, +0x21,0x0, 0xca,0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6, +0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd, +0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f,0x46,0x75,0x2b,0x0, 0x61,0x43,0x12,0xa4, +0xde,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b, +0x2e,0x34,0x14,0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x22,0xff,0x12,0x20,0xb9,0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a,0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35, +0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff,0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a, +0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5,0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xa4, +0xe6,0x2e,0x35,0x36,0x12,0xa1,0x48,0x7d,0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58, +0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, 0x3b,0x7f,0x3, 0x12,0xa4,0xe6,0x2e,0x35, +0x38,0x12,0xa1,0x48,0x7d,0xc3,0x7e,0x35,0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32, +0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37,0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a, +0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c, +0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5,0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb, +0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0x61, +0x41,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60, +0x8, 0x2, 0x61,0x41,0x80,0x28,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, +0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x61,0x41,0xbe,0x34,0x0, 0x30,0x8, +0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x61,0x41,0x7e,0xa3, +0x38,0x41,0x74,0xc, 0xa4,0xbe,0x57,0x22,0xf9,0x58,0x2, 0x61,0x41,0x7e,0xa3,0x38, +0x42,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58,0x2, 0x61,0x41,0x7e,0x15,0x36,0x6d,0x0, +0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xa3,0x7e,0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d, +0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xa3,0x7e,0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73, +0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38,0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b, +0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4,0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10, +0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33,0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7c,0xb7,0xf5,0x2e,0xe5,0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37, +0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34,0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e, +0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22, +0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35,0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a, +0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a,0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22, +0xf6,0x5, 0x2b,0x12,0xa4,0xde,0x28,0x2, 0x21,0x7e,0x7e,0xa3,0x22,0xf7,0xbe,0xa1, +0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe,0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50, +0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, 0x34,0x7a,0x73,0x38,0x3e,0x7a,0xb3,0x38, +0x40,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x38,0x3e,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a, +0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43,0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14, +0x12,0xa4,0xd6,0x7a,0x55,0x4a,0xa, 0x5e,0x7f,0x16,0x12,0xa4,0xd6,0x7a,0x55,0x48, +0x7e,0x35,0x48,0x12,0xa4,0xcf,0x2f,0x50,0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a, +0x0, 0x2f,0x70,0x12,0xa4,0xcf,0x12,0xa4,0xc5,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d, +0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4a,0x12,0xa4,0xc5,0x7e,0x1d,0x40, +0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12, +0xa4,0xc5,0x7e,0x1d,0x44,0x2f,0x10,0x7a,0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c, +0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x1f,0x58,0x7f,0x51,0x7f,0x17,0x7f, +0x6, 0x12,0x1f,0x58,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12, +0x1e,0xfc,0x7e,0x87,0x23,0x43,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x3c,0x7e,0x1d,0x40,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x40,0x7e,0x1d,0x44,0x7d,0x19,0x12,0x1e,0xfc,0x7d,0x18, +0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x58,0x7a,0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1e, +0xeb,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12,0x1e,0xeb,0x7e,0x5d,0x3c, +0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1e,0xeb,0x7e,0x7d,0x40,0x9f,0x71,0xbe,0x58, +0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18, +0x7f,0x16,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x5, 0x12,0x1f,0x58,0x7f,0x6, 0x12,0x1e, +0xeb,0x7f,0x7, 0x12,0x1f,0x58,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44, +0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0x7f,0x1, 0x22,0x7d, +0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x39,0x1, 0xbe,0x71,0x2b,0x22,0x2d,0x13,0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79, +0x6c,0xaa,0x12,0xa5,0xe4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf, +0x38,0x43,0x7f,0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x38, +0x63,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda,0x7e,0x8, 0x38,0x43,0x7e,0x18,0x38,0x63, +0x74,0x20,0x12,0xa1,0x52,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73, +0x38,0x3f,0xbe,0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22, +0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0x33,0x38,0x3f,0xa, 0x13,0x6d,0x0, 0x12, +0x1f,0x7, 0x7c,0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64, +0xa, 0x3e,0x1b,0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xa5,0x92,0x7f,0x6, 0x7c, +0xbd,0x7c,0x7c,0x12,0xa5,0x92,0xb, 0xf0,0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x50,0xbc, +0x7f,0x5, 0x7f,0x16,0x12,0xa4,0xee,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x38,0x3e,0xda, +0x3b,0x22,0x7c,0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d, +0x2, 0xb, 0xa, 0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, +0x7c,0x21,0xa5,0xba,0x0, 0x14,0x1a,0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d, +0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, +0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35, +0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xe4,0x7a, +0xb3,0x35,0x69,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x5, 0xe4, +0x7a,0xb3,0x35,0xe4,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x4f,0x12,0xa6,0x4e,0x28, +0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0xdc,0xbe,0x37, +0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x3, 0x70,0x17,0x7e, +0xb3,0x37,0x8, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28, +0x5, 0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0xb3, +0x28,0x84,0xbe,0xb0,0x0, 0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x6e, +0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c, +0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x4a,0x12,0xa6,0xff,0x78, +0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x21, +0x0, 0x7d,0x13,0x7d,0x3e,0x12,0x21,0x0, 0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5, +0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33,0x9e,0x35,0x2e,0xbd,0x3e,0x8, +0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, +0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xae,0x7e,0x73, +0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80, +0xa, 0x12,0xa6,0xff,0x78,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc, +0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0xc1,0x71,0xda,0x3b,0x22,0xa, +0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22, +0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d, +0x0, 0x7f,0x14,0x12,0x1f,0x58,0x7d,0x73,0x12,0x21,0x0, 0x7d,0xe3,0x7d,0x3f,0x12, +0x21,0x0, 0xbd,0x3e,0x22,0x7e,0x63,0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c, +0xc2,0x12,0x6c,0x33,0x80,0x56,0x90,0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac, +0x93,0x90,0x60,0xab,0xe4,0x93,0xa, 0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4, +0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a, +0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x31,0x5a,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f, +0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, 0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, +0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75, +0xbc,0x73,0x38,0xa2,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x32,0xe7,0x22,0x90,0x60,0xa7, +0xe4,0x93,0x60,0x8, 0x30,0x12,0x5, 0x12,0x31,0x7d,0xc2,0x12,0x22,0xca,0xd8,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x22,0xe6,0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x1f,0xad,0x6d,0x11,0x7e,0x4, +0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0xa8,0xe1,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d, +0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, +0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x1, 0xd2,0xbe,0xd4,0x4, +0xb0,0x8, 0x2, 0xd2,0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd, +0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7, +0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x1, 0xd2,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, +0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0xa8,0xe1,0x1a,0x26,0x1a,0x24,0x2f, +0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0xa8,0xd7,0x9f,0x55,0x6c,0xee, +0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12, +0x21,0x0, 0x7d,0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, +0x1d,0x12,0xa8,0xd7,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, +0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea, +0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x58,0x7d,0x13, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x0, 0xca, +0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x7f,0xc2,0x3, 0x6d,0x44,0x80,0x1e, +0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x12,0xa8,0xe9,0xbd,0x3d,0x48,0xd, 0x7d, +0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa8,0xe9,0x7d,0xd3,0xb, 0x44,0x7e,0xc5, +0x35,0xbd,0xc4,0x38,0xdb,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba, +0x7d,0x3d,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f, +0x10,0x2e,0x35,0x35,0x7a,0x1b,0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f, +0x17,0x2d,0x35,0xb, 0x1a,0x30,0x7f,0x60,0x2e,0xd5,0x35,0x7e,0x6b,0xb0,0x60,0x5, +0xe, 0x34,0x14,0x78,0xfb,0x7c,0xb7,0x12,0xa9,0x78,0xb, 0x44,0x7e,0x55,0x35,0xbd, +0x54,0x38,0xd8,0xda,0xf8,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xb0,0x22, +0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5,0x1, 0x6c,0xaa, +0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0xa9,0x76,0xb, 0xa0,0xbe,0xa0, +0xd, 0x40,0xed,0xc2,0xc9,0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, 0x7e,0x73,0x2a, +0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0xad,0x13,0x7d,0x21,0x6c, +0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x38,0xd9,0x2d,0xf0,0xb, +0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, 0x59,0x4, 0x25, +0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35,0x35,0x7e,0xf, 0x37,0x40,0x7e,0x18, +0x25,0xb6,0x2, 0xa8,0xef,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12,0xaa,0x2e,0x7e, +0x1f,0x38,0xd9,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x24,0xf6,0x12, +0xaa,0x35,0x12,0xaa,0x3e,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, 0x20,0x7a,0x37, +0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, 0x22,0xa9,0xd1, +0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2,0x22,0x7e,0x73, +0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53,0x2a,0x6d,0xac, +0x54,0x7e,0x17,0x28,0xa1,0x12,0xaa,0x2e,0x6d,0x0, 0x80,0x37,0x7d,0x40,0x3e,0x44, +0x7e,0x7f,0x38,0xd9,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10,0x7d,0xf4,0x2e, +0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14,0x6d,0x55,0x9d, +0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d,0x51,0x1b,0x48, +0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22,0x7c,0xab,0x7e,0x8, 0x29,0xbc,0x12,0x5e, +0x25,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0,0xb4,0x2, 0x4, 0x74, +0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31,0x7d,0x20,0x39,0xb1, +0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e,0x24,0x0, 0xff,0xb, +0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0x61,0x73,0x90,0x60,0xa7,0xe4,0x93, +0x70,0x2, 0x61,0x73,0x6c,0xff,0x61,0x6c,0x7e,0x70,0x9, 0xac,0x7f,0x9, 0xe3,0x29, +0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, 0x7d,0x3d,0x12, +0xab,0x81,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, 0x7d,0x34,0x1b, +0x34,0x12,0xab,0x78,0x7c,0xbe,0x12,0xaa,0x98,0x80,0x3f,0x7e,0x70,0x2, 0xac,0x7d, +0x2e,0x34,0x60,0xc5,0x12,0x87,0xbc,0x74,0x9, 0xac,0xbf,0x59,0xd5,0x29,0x8, 0x7e, +0x34,0x60,0xcf,0x12,0x23,0x9e,0x12,0xab,0x78,0x80,0x1f,0xbd,0xc4,0x40,0x1b,0x7d, +0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0xaa,0x98,0x7d,0xc4, +0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12,0x5e,0x2d,0x28, +0x2, 0x41,0xe8,0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0xa, +0x22,0x6c,0xaa,0x80,0x27,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x60,0xb1, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14,0x60,0xb3,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0xb, 0xb, 0xa0,0x90,0x60,0xa7,0xe4, +0x93,0xbc,0xba,0x38,0xd0,0x7c,0xba,0x22,0x90,0x60,0xa7,0xe4,0x93,0x60,0x2b,0x6c, +0x33,0x80,0x1f,0x7c,0xb3,0x12,0x31,0x5a,0x40,0x16,0x7c,0xb3,0x12,0x31,0x27,0x7d, +0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x1b,0x1a,0x50, +0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0xab,0xfd,0x7e,0x14, +0x62,0x7, 0x12,0x87,0xee,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22,0x6d,0x11,0xe4, +0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x7f,0x38,0xf3, +0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12,0x21,0x0, 0xbd, +0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xf3,0x2d,0x13,0x69,0x20, +0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x81,0xbf,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x1f, +0x38,0xf3,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14, +0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff, +0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22,0x6c,0x66,0x7e, +0x27,0x39,0x4, 0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e,0xb3,0x28,0xac, +0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xab,0xbc,0x76,0x50,0xf, 0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8a,0x87,0x7e,0xb3,0x2f,0xab,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3, +0x2f,0xab,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xac,0xbe,0xa0,0x5, +0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74,0x5, 0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xac,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, 0xac,0x5a,0x49, +0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8,0x30,0x1, 0xe, +0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d,0x23,0xa, 0x3a, +0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f,0x7e,0x63,0x2a, +0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac,0x56,0x49,0x22, +0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e,0xb3,0x2a,0x6d, +0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, 0x2, 0xc2,0x3, +0xa2,0x3, 0x22,0xc2,0x3, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1,0x60,0x4, 0xd2, +0x3, 0x80,0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57,0x49,0x12,0x4, +0xfc,0x7e,0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d,0x22,0x9d,0x20, +0xbd,0x12,0x58,0x4, 0xd2,0x3, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e,0x14,0x0, 0x3, +0xa, 0x27,0xbd,0x21,0x48,0xd2,0xa2,0x3, 0x22,0x7d,0x23,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x7e,0x14,0x0, 0x5, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33, +0x36,0xdc,0xbe,0x30,0x8, 0x50,0x45,0x74,0x8, 0x80,0x3d,0x7d,0x13,0x3e,0x14,0xbd, +0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x6, 0x50,0x30,0x74,0x6, 0x80,0x28, +0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc, +0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, 0x80,0xf, 0xbd,0x32,0x50,0xf, 0x7e,0x73,0x36, +0xdc,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xdc,0x7e,0xb3,0x36,0xdc, +0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a,0xb3,0x36,0xdc,0x74,0x1, 0x7a,0xb3,0x16,0x92, +0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3,0x36,0xdc,0x50,0x5, 0xe4,0x7a,0xb3,0x16,0x91, +0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0xae,0x8a,0x68,0x23, +0x7e,0x70,0xc, 0xac,0x72,0x12,0xae,0xa2,0x7d,0x23,0x7e,0x70,0xc, 0xac,0x72,0x59, +0x23,0x36,0x82,0x49,0x3, 0x36,0x82,0x49,0x23,0x36,0x7e,0xbd,0x20,0x50,0x4, 0x59, +0x3, 0x36,0x7e,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22,0x80,0x18,0x12, +0xae,0x8a,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7e,0xbd,0x4, 0x50, +0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37,0x36,0x64,0xbe, +0x37,0x36,0xdd,0x50,0x8, 0x7e,0x37,0x36,0xdd,0x7a,0x37,0x36,0x64,0x12,0xae,0x98, +0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, 0xac,0x12,0x9, +0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, 0x22,0x7e,0x70,0xc, 0xac,0x7a,0x49,0x33,0x36, +0x7e,0x22,0x49,0x23,0x36,0x84,0x49,0x33,0x36,0x80,0x9d,0x32,0x2, 0x21,0x0, 0x7e, +0x8, 0x36,0x7a,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x20,0xde,0x6c,0xaa,0x7e,0x44,0xff, +0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7c,0x59,0x43,0x36,0x84,0xb, 0xa0, +0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x68,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20, +0xde,0x7e,0xa3,0x2b,0x62,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62,0xd2,0xc, 0x30, +0xc, 0x7, 0x12,0xae,0xfa,0xe4,0x2, 0xa, 0x66,0x22,0xc2,0xc, 0x7e,0x8, 0x2a,0x6d, +0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x6d,0x74,0x3, 0x2, 0x11,0x7a,0xe4,0x7a,0xb3,0x36, +0x67,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xee,0xe4,0x7a,0xb3,0x36,0x68,0x6d,0x33,0x7a,0x37, +0x36,0x6f,0x7a,0x37,0x36,0x64,0x22,0x7e,0xb3,0x36,0x6a,0xb4,0x1, 0x27,0x7e,0xb3, +0x36,0xe0,0x4, 0x7a,0xb3,0x36,0xe0,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x3, 0x40,0x15, +0x12,0x8c,0x90,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x6, 0x40,0x9, 0xe4,0x7a,0xb3,0x36, +0xe0,0x7a,0xb3,0x36,0x6a,0x22,0x12,0x24,0x14,0xe4,0x7a,0xb3,0x3, 0xfe,0x2, 0x76, +0x52,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88,0x7e,0xf0,0x1, +0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f,0x7f,0x7, 0x2d, +0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc,0x9f,0x38,0xe2, +0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0,0x1, 0x2, 0xb0, +0x31,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, 0x80,0x36,0x7e, +0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0xe5,0x44, +0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16,0x5, 0x45,0xa, +0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0xc0,0xe8,0xbd,0x3d,0x8, 0x5, 0x12,0xc0, +0xe8,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe,0xb0,0x0, 0x28, +0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x72,0x33,0xc3,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x33, +0xc4,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x30,0x3, 0x1b,0x1a,0xd0,0xb, 0xa0,0xb, +0xf0,0xbc,0x8f,0x40,0x3, 0x2, 0xaf,0xb1,0x7c,0xba,0xda,0x79,0xda,0xd8,0x22,0x7c, +0x9b,0x7f,0x71,0x7f,0x60,0x7e,0x34,0x22,0xb8,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f, +0x52,0x74,0x2a,0x12,0x1f,0xad,0x7e,0x58,0x1f,0x52,0x7c,0xb9,0x7e,0x71,0x44,0x12, +0x2c,0x40,0x7d,0x43,0xe5,0x45,0x7e,0x71,0x46,0x12,0x2c,0x40,0x2d,0x34,0xe, 0x34, +0x7f,0x5, 0x7e,0x50,0x7, 0xb, 0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, +0x1b,0x6a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b, +0x50,0x78,0xe2,0x22,0x6d,0x33,0x7d,0x23,0x7d,0x3, 0x6c,0x33,0x80,0x45,0x6c,0x22, +0x80,0x37,0x7e,0xb3,0x2a,0x6e,0xac,0xb3,0xa, 0x42,0x2d,0x54,0x7d,0x45,0x3e,0x44, +0x7e,0x7f,0x13,0x8a,0x2d,0xf4,0xb, 0x7a,0x40,0xbe,0x44,0x0, 0x32,0x8, 0x8, 0xbe, +0x44,0x2, 0x58,0x58,0x2, 0xb, 0x24,0xbe,0x44,0xff,0xce,0x58,0x8, 0xbe,0x44,0xfd, +0xa8,0x8, 0x2, 0xb, 0x4, 0xb, 0x34,0xb, 0x21,0x7e,0x93,0x2a,0x6e,0xbc,0x92,0x38, +0xc1,0xb, 0x31,0x7e,0xb3,0x2a,0x6d,0xbc,0xb3,0x38,0xb3,0x7e,0x54,0x0, 0x6, 0xad, +0x53,0x7d,0x15,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x12,0x25,0x3e,0xbd,0x12,0x50,0x22, +0xbd,0x30,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x8, 0x7e,0xb3,0x39,0x9, 0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x9, 0x80,0x3c,0xe4,0x7a,0xb3,0x39,0x9, 0x74,0x1, +0x80,0x2f,0xbd,0x10,0x50,0x22,0xbd,0x32,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x9, 0x7e, +0xb3,0x39,0x8, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x8, 0x80,0x16,0xe4, +0x7a,0xb3,0x39,0x8, 0x74,0x2, 0x80,0x9, 0xe4,0x7a,0xb3,0x39,0x8, 0x7a,0xb3,0x39, +0x9, 0x7a,0xb3,0x39,0xa, 0x7e,0xb3,0x39,0xa, 0x22,0xe4,0x7a,0xb3,0x28,0xa8,0x7a, +0xb3,0x39,0xb, 0x22,0xca,0xd8,0xca,0x79,0xc2,0x3, 0x6c,0xdd,0x7e,0x57,0x28,0x99, +0x7d,0xf5,0x7e,0xe7,0x28,0x97,0x7e,0x37,0x37,0xfb,0x4d,0x33,0x68,0x4, 0x7d,0xf5, +0xe, 0xf4,0x6c,0xff,0x7e,0xa3,0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68, +0x21,0x14,0x68,0x14,0x24,0xc2,0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10, +0x7c,0xfa,0x7e,0x83,0x2a,0x6d,0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, +0x6c,0x88,0x6c,0x99,0x80,0xf, 0x7c,0xb9,0x12,0x37,0x6f,0xbe,0x34,0x2, 0x58,0x8, +0x2, 0xb, 0xd0,0xb, 0x90,0x7e,0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, +0x40,0x2, 0x61,0x25,0x7e,0xa3,0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, +0x28,0x37,0x7e,0xb3,0x26,0x83,0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f, +0x2d,0x32,0x3e,0x34,0x49,0x23,0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc, +0xbd,0xe, 0x58,0xf, 0x6d,0x33,0x9d,0x3e,0x12,0x8f,0xdc,0xbd,0x3, 0x8, 0x4, 0xd2, +0x3, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe, +0xe7,0x7, 0xf8,0x8, 0x2, 0xc2,0x3, 0x30,0x3, 0x20,0x7e,0xb3,0x39,0xb, 0x4, 0x7a, +0xb3,0x39,0xb, 0x7e,0x23,0x39,0xb, 0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3, +0x39,0xb, 0x74,0x1, 0x7a,0xb3,0x28,0xa8,0x80,0xf, 0x7e,0x23,0x39,0xb, 0xbe,0x20, +0x0, 0x28,0x6, 0x1e,0x20,0x7a,0x23,0x39,0xb, 0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, +0xbe,0xa0,0x0, 0x28,0x69,0x7e,0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa, +0xbe,0xb0,0x1, 0x68,0x59,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d, +0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x2c,0x3c, +0xbe,0x34,0x0, 0x96,0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28, +0x84,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3, +0x27,0x36,0x9, 0xd3,0x27,0x37,0x12,0x2c,0x3c,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e, +0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99, +0x80,0x17,0xa, 0xe9,0xa, 0x5f,0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f, +0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78, +0x25,0x7e,0xb3,0x39,0xc, 0x4, 0x7a,0xb3,0x39,0xc, 0x7e,0x73,0x39,0xc, 0xbe,0x70, +0x5, 0x28,0x22,0x74,0x5, 0x7a,0xb3,0x39,0xc, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2, +0x15,0x12,0xb1,0x5a,0x80,0xf, 0x7e,0x73,0x39,0xc, 0xbe,0x70,0x0, 0x28,0x6, 0x1e, +0x70,0x7a,0x73,0x39,0xc, 0xda,0x79,0xda,0xd8,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34, +0x0, 0x38,0xca,0x39,0xac,0x7f,0x2e,0x34,0x0, 0x50,0x6d,0x22,0x7e,0x8, 0x34,0x0, +0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, +0x30,0x6d,0x22,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x7e, +0xa3,0x2a,0x6e,0xa, 0x3a,0x3e,0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x20,0xde,0x90, +0x60,0x93,0x93,0xa, 0x3b,0x7e,0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad, +0x32,0x7d,0x43,0x6c,0x77,0x80,0x1d,0xa, 0x27,0x2d,0x24,0x12,0x87,0xdc,0xb, 0xa, +0x0, 0x7e,0x30,0x2, 0xac,0x37,0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b, +0x18,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xdf,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x13,0xc6,0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24, +0x13,0x8e,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38, +0xdc,0x22,0x7c,0xab,0x12,0xb3,0xe1,0xd2,0x16,0x7c,0xba,0x12,0x86,0xf8,0xc2,0x16, +0x22,0xa9,0xd1,0xcb,0x74,0x1, 0x2, 0x0, 0xe, 0x12,0xb3,0xe1,0x7e,0x34,0xd, 0xc8, +0x7e,0xb3,0x2a,0x6d,0x12,0xb4,0x22,0x12,0xb4,0x5, 0x7a,0x37,0x38,0xd6,0x74,0x1, +0x7a,0xb3,0x16,0x91,0x22,0x6d,0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28, +0x3, 0x2, 0xb4,0xef,0x90,0x60,0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb4, +0x56,0x22,0x7a,0xb3,0x24,0xf2,0x7e,0x53,0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37, +0x24,0xfa,0xe4,0x7a,0xb3,0x24,0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a, +0x37,0x24,0xf6,0x7e,0x34,0x0, 0x20,0x12,0xb4,0x4d,0x2, 0xd, 0x7, 0x7a,0x37,0x24, +0xfc,0x7e,0x8, 0x24,0xf2,0x22,0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e, +0xa, 0xd8,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa, +0x80,0x18,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, +0x5a,0xc0,0x9d,0xc2,0x59,0xc3,0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60, +0x92,0xe4,0x93,0x7c,0x9b,0x6d,0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92, +0xe4,0x93,0xa, 0xcb,0x1b,0xc4,0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa, +0x80,0x28,0xa, 0x3a,0x7d,0x23,0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d, +0x3e,0x34,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x0, +0x7d,0xa3,0xbd,0xfa,0x58,0x2, 0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8, +0x2d,0xec,0x2d,0xdc,0xb, 0xf0,0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca, +0xf8,0x6d,0x44,0x7e,0xf3,0x2a,0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3, +0x2a,0x6d,0xa, 0xeb,0x2d,0xef,0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60, +0x94,0xe4,0x93,0xb4,0xff,0x31,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda, +0x2d,0xdf,0x3e,0xd4,0x7e,0x1f,0x38,0xd9,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, +0xac,0x5a,0x7f,0x50,0x2d,0xb2,0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, +0xa0,0xbc,0xfa,0x38,0xd9,0x80,0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x38,0xd9,0x2d, +0x15,0x6c,0xaa,0x80,0x2c,0xa, 0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x38,0xd9,0x2d, +0x3e,0xb, 0x1a,0xe0,0x7e,0x70,0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0, +0x7d,0x3e,0x9d,0x3d,0x12,0x21,0x0, 0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, +0xa0,0xbc,0xfa,0x38,0xd0,0x7d,0x34,0xda,0xf8,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, +0xa9,0xd5,0xea,0xa9,0xc5,0xea,0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e, +0x5, 0x4e,0x7e,0x73,0x39,0x6, 0xbe,0x71,0x4e,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e, +0xa9,0xd7,0x9e,0xa9,0x34,0xe5,0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, +0xa9,0xc2,0xcd,0xa9,0x33,0xe5,0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7, +0xcd,0xa9,0x36,0xe5,0x3, 0xa9,0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6, +0xc2,0x88,0xd2,0xa8,0x22,0x7e,0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47, +0x52,0x7e,0x24,0x55,0x50,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20, +0x7e,0x24,0x41,0x44,0x79,0x30,0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33, +0x7e,0x24,0x66,0xcc,0x79,0x30,0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47, +0x7e,0x24,0x46,0x4c,0x79,0x30,0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd0,0xce, +0xa2,0x3, 0xa9,0x95,0xc9,0x22,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2, +0x86,0xa9,0xc2,0xeb,0xa9,0xd2,0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f, +0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d, +0x1, 0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75, +0xf7,0x0, 0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9, +0xd0,0xf7,0xd2,0xf8,0xa9,0xc1,0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6, +0xb7,0xc2,0xbe,0x22,0x75,0xe7,0x6b,0x2, 0xb6,0x9a,0xe4,0x7e,0x34,0xd7,0xfc,0x7e, +0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff, +0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e,0x37,0x39,0x4, 0xb, 0x34,0x7a,0x37, +0x39,0x4, 0xbe,0x34,0xff,0x0, 0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37,0x39,0x4, +0x22,0x7c,0x6b,0x6c,0x77,0x6c,0xaa,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x46,0x12,0xb7, +0x8f,0x75,0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12, +0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc, +0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1, +0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0xa9,0xc6,0xb3, +0x75,0xb5,0x0, 0x22,0x74,0x6, 0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73, +0x7d,0x52,0x7c,0xab,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x3c,0x12,0xb7,0x8f,0x75,0xb5, +0x1, 0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0xb7,0x38,0xa9, +0xc2,0xb4,0xa9,0xc6,0xb3,0x22,0x74,0x2, 0x7d,0x3f,0x2, 0xb7,0x38,0x7d,0x42,0x7f, +0x60,0x7d,0x3, 0x12,0xb7,0xef,0x74,0x2, 0x12,0xb6,0xd1,0x7d,0xf3,0x4e,0xf4,0x0, +0x1, 0x4e,0xf4,0x0, 0xa, 0x12,0xb7,0x96,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f, +0x6, 0x12,0xb7,0xd7,0x5e,0xf4,0xff,0xfd,0x12,0xb7,0x96,0x2, 0xb7,0xce,0xa9,0xc5, +0xca,0xe4,0x7a,0xb3,0x39,0x13,0x22,0x12,0xb8,0x38,0x7e,0x35,0x36,0x12,0xb8,0x1c, +0xa9,0xd2,0xb4,0xd3,0x22,0x74,0x6, 0x12,0xb6,0xd1,0x7d,0x3, 0x6c,0x11,0x22,0xa9, +0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1,0xea,0x74,0xa5,0x7a,0xb3,0x39,0x13,0x22,0xca, +0xf8,0x7c,0xfb,0x74,0x2, 0x12,0xb6,0xd1,0x4c,0xff,0x78,0x5, 0x5e,0x70,0xdf,0x80, +0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0xb7,0x38,0xda,0xf8,0x22,0x6d,0x22,0x80,0x13, +0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, +0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5, +0xa, 0x44,0xf5,0x39,0x7f,0x21,0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xb8,0x63, +0xe5,0x3a,0x12,0xb8,0x63,0xe5,0x39,0x12,0xb8,0x63,0xe5,0x38,0x12,0xb8,0x63,0xe4, +0x2, 0xb8,0x63,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0xd2,0xc8, +0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0xb7, +0xef,0xe4,0x12,0xb7,0xff,0x2, 0xb7,0xce,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c, +0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, +0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74, +0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x97,0xbe,0x90,0x1, +0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe, +0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18, +0xb2,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xb9,0x3c,0xb, 0x7a,0x20, +0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d, +0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25, +0x3c,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, +0xf9,0x2d,0xf1,0x7d,0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77, +0x14,0x78,0xfb,0x4d,0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xd9,0x7e,0x8, +0x1f,0x3c,0x12,0xb9,0xfa,0xd2,0x3, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xb9,0x44, +0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32, +0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, +0x12,0xba,0x42,0x50,0x7, 0x12,0xba,0x39,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7, +0x38,0xee,0x12,0xb9,0xe7,0xe4,0x12,0xb9,0xef,0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a, +0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xb9,0xe7,0x74,0x1, 0x12,0xb9,0xef,0x74, +0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12, +0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x1c,0x74,0x3f, +0x2, 0x20,0xde,0x7e,0x8, 0x1f,0x34,0x12,0xb9,0xfa,0x6c,0x77,0x80,0xe, 0x12,0xba, +0x42,0x50,0x7, 0x12,0xba,0x39,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x6e, +0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9, +0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x44,0xa, +0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57,0x7c,0xab, +0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46, +0x2e,0x44,0x20,0x73,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b,0xbe,0x60, +0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb, +0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b, +0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70, +0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbb,0x9, 0x60,0x5, 0x3e, +0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16, +0x9e,0x60,0xe, 0x12,0xbb,0x9, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbb,0x9, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b, +0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72, +0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12,0x77,0xf6,0xb, 0x24,0xa, 0x33,0xbd,0x32, +0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28, +0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f, +0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d, +0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a, +0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a, +0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a, +0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3, +0xff,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, +0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85, +0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88, +0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53, +0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e, +0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91, +0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12,0x2f,0xd0,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xfb,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x37,0x32,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xbd,0x44, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x38,0xfc,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x37,0x33,0x80,0x1a,0x12,0xbd,0x44,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x38,0xfb,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x34,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f, +0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x80, +0x7e,0x34,0x0, 0x28,0xe4,0x12,0x20,0xde,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, 0xc0, +0x12,0x20,0xde,0x7a,0xb3,0x37,0x34,0x7e,0x34,0x62,0x8e,0x12,0x23,0x9e,0x7a,0x37, +0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a,0xe7, +0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a,0xf7, +0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a,0xf7, +0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe,0x7a, +0xb3,0x37,0x34,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x7e,0x37,0x38,0xe2,0x9e,0x37,0x38,0xde,0x12,0x21,0x0, 0xbd,0x31,0x38,0x12, +0x7e,0x37,0x38,0xe4,0x9e,0x37,0x38,0xe0,0x12,0x21,0x0, 0xbd,0x31,0x38,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd, +0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x38,0xdd,0x60,0x11,0x7e,0xc7, +0x38,0xe6,0x4d,0xcc,0x78,0x2, 0xc1,0xe8,0xbe,0xd0,0x1, 0x28,0x2, 0xc1,0xe8,0xbe, +0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xc1,0xe8,0x7e,0xe7,0x29,0x8, 0x7e, +0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x66,0xe6,0xbe,0xb0,0x1, 0x78,0x2, 0xc1, +0xe8,0x7e,0xa3,0x38,0xdd,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23, +0x14,0x78,0x2, 0xc1,0xe5,0xb, 0xb2,0x68,0x2, 0xc1,0xe8,0xbe,0xd0,0x1, 0x68,0x2, +0xc1,0xf7,0x4c,0xee,0x68,0x2, 0xc1,0xf7,0x74,0x1, 0x7a,0xb3,0x38,0xdd,0x12,0xbf, +0xa, 0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3, +0x38,0xdd,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xdd,0x7e,0x34, +0x62,0x68,0x80,0x48,0x12,0xbf,0x13,0x90,0x62,0x57,0x12,0xbe,0xfe,0x68,0x49,0x80, +0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xbf,0x13,0x7e,0x34,0x62, +0x60,0x12,0x23,0x9e,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d, +0xc3,0xbe,0xc7,0x38,0xe6,0x40,0x21,0x90,0x62,0x56,0x12,0xbe,0xfe,0x68,0x19,0x12, +0xbf,0xa, 0x74,0x3, 0x7a,0xb3,0x38,0xdd,0x7e,0x34,0x62,0x64,0x12,0x23,0x9e,0x7a, +0x37,0x38,0xe6,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xdd,0x6d,0x33,0x7a, +0x37,0x38,0xe6,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93, +0xa, 0x3b,0x12,0xbd,0xc9,0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x38,0xde,0x7a,0xf7, +0x38,0xe0,0x22,0x7a,0xe7,0x38,0xe2,0x7a,0xf7,0x38,0xe4,0x22,0xca,0xf8,0x7f,0x51, +0x7f,0x40,0x7e,0x37,0x2f,0x90,0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c, +0x7e,0x37,0x2f,0x9c,0x7a,0x35,0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff, +0x80,0x1e,0x7e,0x34,0x0, 0x26,0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0x8c,0x74, +0x2, 0xac,0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xbf,0x6b,0xb, 0xf0, +0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e, +0x35,0x2f,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e, +0x35,0x31,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, +0x6a,0x30,0x9e,0x35,0x33,0x6d,0x22,0x7e,0x33,0x38,0x41,0x12,0xbf,0xc0,0x7e,0x15, +0x2f,0x12,0x1f,0x5, 0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e, +0x33,0x38,0x42,0x12,0xbf,0xc0,0x7e,0x15,0x31,0x12,0x1f,0x5, 0x1b,0x7a,0x30,0x22, +0xa, 0x13,0x6d,0x0, 0x2, 0x1e,0xeb,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, +0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22, +0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x7e,0x34,0x60,0xa3,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e,0x37,0x2a,0x53,0x22,0x7e,0xa3,0x2a,0x6e,0x7e, +0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d,0x22, +0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b, +0x14,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e, +0x7b,0x60,0xbc,0x6b,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x2e,0x14,0x1, 0x30,0x6d, +0x0, 0x7e,0x18,0x3, 0x60,0x22,0x2e,0x14,0x0, 0x50,0x6d,0x0, 0x7e,0x18,0x34,0x0, +0x22,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x26,0xfa,0x22,0xe4,0x7a,0xb3,0x36,0x69, +0x7a,0xb3,0x36,0x71,0x22,0x74,0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7a,0x37, +0x2a,0x4f,0x7e,0x34,0x61,0x57,0x22,0x7a,0x37,0x28,0xa1,0x7e,0x34,0x61,0xc2,0x22, +0x90,0x60,0xaa,0xe4,0x93,0xbe,0xb0,0x1, 0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b, +0xf, 0x22,0x74,0x5, 0xac,0xbc,0x9, 0xb5,0x26,0x33,0x22,0x7e,0x8, 0x0, 0x25,0x7e, +0x18,0x0, 0x24,0x22,0x7e,0xe3,0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x6d,0x33,0xe4, +0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x37,0x25,0xf4,0x7a,0x37,0x31,0xcc,0x22,0x7e,0x34, +0xd, 0xc8,0x7a,0x37,0x31,0xce,0x22,0x7e,0x73,0x37,0xbd,0x7a,0x73,0x2b,0x20,0x22, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x22,0x7c,0xbe,0x7c,0x7d,0x2, 0x2c,0x40,0x7e, +0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0,0x1, 0x22,0x12, +0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xb3,0x37,0x31,0xbe,0xb0,0x1, 0x22,0x7e, +0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7,0xe4,0x93,0x7c,0xab,0x22,0xff, +0xc1,0x20,0x3e,0xdf,0x94,0x6b,0x10,0x51, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_nt.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_nt.txt new file mode 100644 index 0000000000000..e9262ef468551 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_ebbg_nt.txt @@ -0,0 +1,3091 @@ +0x2, 0x1f,0xd2,0x2, 0xb5,0x8a,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x42,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x70,0x2d,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x7d,0x45,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x32,0x2, 0x7d,0xa4,0xe4,0x2, 0x29,0xfa,0x22,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xa2,0x13,0x22,0x32,0xff,0x2, 0x0, 0x69,0x2, 0x31, +0xb3,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x38,0xc8, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x38,0xd8,0x7e,0x73,0x38,0xd8,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x7f,0x5, 0x7e,0x1f,0x38,0xc8,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x38,0xc8,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x38,0xcc,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x38,0xd4,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x38,0xd2,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf7,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0xb7,0x9d,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d,0xe2,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xb2,0x61,0x3f,0x7e,0x34,0x1d,0x96,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xc6,0x61,0x3f,0x7e,0x34,0x1e,0xa, 0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d, +0xf1,0x61,0x3f,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x69,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x6a,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xc8,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x38,0xc8,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x20,0xde,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x38,0xc0,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf7,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x38,0xc0,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xb9,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x38,0xc8,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x39,0xd, 0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x86,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x39,0xd, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x39,0xd, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x39,0xd, 0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xf3,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xf3,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xc0,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x38,0xc8,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x38, +0xc8,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x38,0xc8,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x38,0xc8,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x38,0xc8,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x38, +0xc8,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x38,0xc8, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x38,0xc8,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x38,0xc8,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x38,0xc8,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xb9,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xb9,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xf3,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xf3,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x39, +0xd, 0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x38,0xc8, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x38,0xc8,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x39,0xd, 0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x39,0xd, 0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x39,0xd, 0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf7,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xf2,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf7,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf7,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x39, +0xd, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x39,0xd, 0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x39,0xd, 0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x58,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1e,0xeb,0x7d,0x1e,0x12,0x1f,0x5, 0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x38,0xc8,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf7,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xf2,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf7,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x7f,0x5, 0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x38,0xc0,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc8,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x38,0xd8,0x7e,0x1f,0x38,0xc0, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xf3,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x39,0xd, 0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x20,0x8f,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x20,0x90,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e, +0x1f,0x38,0xc0,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x38,0xc0,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x38,0xc8,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x6, 0xe, 0x15,0x1a,0x1f,0x26,0x2b,0x2d,0x2e,0x2f, +0x2c,0x2a,0x24,0x1f,0x1a,0x14,0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10,0x15,0x1c,0x22, +0x28,0x2d,0x34,0x39,0x3d,0x40,0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x11,0x16, +0x1c,0x23,0x2b,0x32,0x37,0x3c,0x40,0x45,0x4a,0x4d,0x4c,0x4b,0x4a,0x48,0x46,0x46, +0x45,0x45,0x44,0x44,0x43,0x44,0x45,0x78,0x65,0x55,0x2, 0xd, 0x14,0x1b,0x21,0x25, +0x2b,0x31,0x37,0x36,0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, +0x10,0x18,0x1e,0x23,0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40, +0x3f,0x3e,0x3d,0x3d,0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29, +0x27,0x1e,0x14,0x11,0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21, +0x2b,0x32,0x30,0x2a,0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, +0x10,0x19,0x23,0x2d,0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71, +0x50,0x55,0x28,0x12,0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39, +0x31,0x28,0x1e,0x15,0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32, +0x37,0x39,0x20,0x29,0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, +0x1, 0x0, 0x1, 0x5, 0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c, +0x34,0x31,0x26,0xcb,0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31, +0x2e,0x2d,0x35,0x3d,0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, +0x10,0x1b,0x24,0x2f,0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d, +0x28,0x31,0x34,0x2a,0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40, +0x47,0x47,0x44,0x3c,0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b, +0x22,0x2d,0x30,0x2e,0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, +0x0, 0x0, 0x3, 0xb, 0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26, +0x1b,0x14,0x1c,0x25,0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c, +0x25,0x30,0x38,0x40,0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c, +0x29,0x1e,0x14,0x13,0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39, +0x30,0x25,0x1b,0x10,0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a, +0x23,0x2f,0x33,0x29,0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, +0x2, 0x0, 0x1, 0x8, 0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e, +0x50,0x55,0x16,0x2b,0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36, +0x3b,0x3d,0x3b,0x37,0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33, +0x3d,0x3f,0x13,0x21,0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37, +0x2d,0x22,0x18,0xc, 0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38, +0x2e,0x2a,0x31,0x62,0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, +0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26, +0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b, +0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48, +0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x9, 0x17,0x1d,0x26,0x2e,0x37, +0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, +0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30,0x2f,0x2c,0x26,0x1e, +0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c,0x32,0x3a,0x41,0x48, +0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c,0x33,0x55,0x26,0x1c, +0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18,0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, +0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44,0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49, +0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f,0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54, +0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c, +0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22,0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c, +0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a,0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32, +0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, +0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22, +0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, 0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39, +0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68,0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70, +0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80,0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10, +0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, +0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39,0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24, +0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50,0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff, +0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a,0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, +0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22, +0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33,0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29, +0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d,0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26, +0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10,0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b, +0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19, +0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22,0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39, +0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34,0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, +0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18,0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37, +0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e, +0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21, +0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c, +0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, +0x0, 0x2, 0x5, 0x9, 0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f, +0x3d,0x38,0x30,0x27,0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36, +0x3f,0x49,0x53,0x5c,0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b, +0x15,0xb, 0x4, 0x0, 0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c, +0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, +0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, +0x8, 0xe, 0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58, +0x51,0x48,0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf, +0x30,0x55,0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28, +0x30,0x38,0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16, +0xf, 0xc, 0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, +0x3, 0xa, 0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a, +0x58,0x57,0xc6,0x55,0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38, +0x3c,0x3e,0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, +0xd, 0x17,0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57, +0x4f,0x47,0x40,0x38,0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, +0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f, +0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22, +0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25, +0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f, +0x3d,0x3a,0x36,0x2e,0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0x9, 0xe, 0x14,0x1c,0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a, +0x10,0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47, +0x4f,0x56,0x5a,0x5b,0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9, +0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e, +0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25, +0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25, +0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d, +0x3a,0x34,0x2d,0x27,0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, +0xa, 0xf, 0x15,0x1b,0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11, +0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36, +0x3c,0x42,0x47,0x48,0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29, +0x22,0x1b,0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c, +0x24,0x2a,0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, +0x4, 0x7, 0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b, +0x38,0x31,0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35, +0x3d,0x45,0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17, +0x11,0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6, +0x30,0x55,0xa, 0x5, 0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3c,0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, +0x1, 0x2, 0x35,0x46,0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37, +0x2e,0x25,0x1e,0x16,0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39, +0x41,0x45,0xf0,0xbc,0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28, +0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, +0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d, +0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19, +0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36, +0x2f,0x27,0x21,0x19,0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, +0x16,0x1f,0x26,0x2d,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d, +0x56,0x59,0x5a,0x58,0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, +0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38, +0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40, +0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3, +0x30,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, +0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f, +0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40, +0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32, +0x39,0x3e,0x7, 0x90,0x30,0x55,0x39,0x2b,0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, +0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b,0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f, +0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24, +0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b,0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65, +0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a,0x46,0x55,0x0, 0x1, 0x3, 0x5, 0x7, 0x8, +0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22,0x24,0x27,0x2a,0x2c, +0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, 0x14,0x1b,0x23,0x28, +0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53,0x4e,0x47,0x40,0x3b, +0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x1f,0x7, 0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x1f,0x7, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0x13,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x4c,0x0, 0xc2,0x14,0x75,0x4d,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x4e,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x21,0x10,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x36,0x72,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xd0,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33,0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0x9b,0x0, 0x0, 0x2, 0x37,0xed,0x0, 0x0, 0x0, 0x2, 0x37, +0xef,0x0, 0x0, 0x0, 0x1, 0x37,0xf1,0x0, 0x0, 0x1, 0x34,0x4f,0x0, 0x0, 0x1, 0x39, +0x11,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x2, 0x34,0x9f,0x0, 0x0, 0x0, 0x1, 0x34, +0xa1,0x0, 0x0, 0x1, 0x34,0xaf,0x0, 0x0, 0x1, 0x34,0xc4,0x0, 0x0, 0x1, 0x34,0xc5, +0x0, 0x0, 0x1, 0x35,0x3e,0x0, 0x0, 0x1, 0x35,0x3f,0x1, 0x0, 0x1, 0x35,0x40,0x0, +0x0, 0x3c,0x35,0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x36,0x61,0x0, 0x0, 0x1, 0x36,0x62,0x0, 0x0, 0x1, 0x36,0x63,0x0, 0x0, +0x1, 0x35,0xe2,0x1, 0x0, 0x2, 0x35,0xe5,0x0, 0x0, 0x0, 0x1, 0x2f,0xa9,0x0, 0x0, +0x1, 0x2f,0xaa,0x0, 0x0, 0x1, 0x2f,0xab,0x0, 0x0, 0x1, 0x2f,0xac,0x0, 0x0, 0x1, +0x36,0x66,0x1, 0x0, 0x1, 0x36,0xe0,0x0, 0x0, 0x1, 0x39,0x12,0x0, 0x0, 0x6, 0x38, +0xfb,0x3f,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x39,0x1, 0x24,0x0, 0x1, 0x39,0x8, +0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x1, 0x39,0xb, 0x0, +0x0, 0x1, 0x39,0xc, 0x0, 0x0, 0x1, 0x0, 0x4f,0x0, 0x0, 0x1, 0x3, 0xec,0x0, 0x0, +0x4, 0x37,0x40,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39,0x3, +0x0, 0x0, 0x2, 0x39,0x4, 0x0, 0x0, 0x0, 0x1, 0x39,0x6, 0x64,0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x39,0x13,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x2, 0x2b,0xb9,0x2b,0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, +0x0, 0x1, 0x38,0xdd,0x0, 0x0, 0x1, 0x38,0x3e,0xff,0x0, 0x1, 0x38,0x3f,0x0, 0x0, +0x1, 0x38,0x40,0x0, 0x0, 0x1, 0x38,0x41,0x40,0x0, 0x1, 0x38,0x42,0x40,0x0, 0x4, +0x38,0xf3,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf7,0x0, 0x0, 0x64,0x0, 0x0, 0x4, +0x38,0xc0,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x38,0xc4,0x0, 0x0, 0x68,0xc0,0x0, 0x4, +0x38,0xc8,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x38,0xd9,0x0, 0x0, 0x40,0x0, 0x0, 0x4, +0x39,0xd, 0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58, +0x0, 0xc, 0x1, 0x5e,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78, +0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, +0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, +0x0, 0x1e,0x12,0x3f,0x13,0x12,0x69,0x8e,0x12,0x23,0xb, 0x12,0x28,0x48,0x12,0x8d, +0xec,0x2, 0x23,0x4, 0x74,0x1, 0x7a,0xb3,0x36,0x6a,0x22,0x12,0x73,0x71,0x12,0x23, +0x40,0x2, 0x23,0x14,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x1d,0x7d,0x43,0x7e, +0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34, +0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22, +0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x23,0x1d,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, +0x7a,0x2, 0x23,0x1d,0x7e,0x34,0x60,0xa3,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x46, +0xa2,0x12,0x73,0x28,0x12,0x3f,0x13,0x12,0x69,0x87,0x12,0xc0,0x5, 0x12,0x23,0xb, +0x12,0x28,0x48,0x12,0x68,0x23,0x12,0x8d,0xec,0x2, 0x23,0x4, 0x7e,0x34,0x61,0x4f, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x7a,0x37,0x28, +0x95,0x7e,0x34,0x61,0xba,0x12,0x23,0x9e,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8, +0x12,0x23,0x9e,0x7a,0x37,0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0x9e,0x7a,0x37, +0x28,0x9b,0x7e,0x34,0x61,0xbc,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61, +0xbe,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0x9e,0x12, +0xc0,0x87,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x20,0xde,0x12,0x25,0xc3,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0x9e, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0x9e,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x3c,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0xb7,0x9d,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x36, +0xe1,0x7e,0x34,0x61,0x51,0x12,0x23,0x9e,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x36,0xe2, +0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe3,0x7e,0x34, +0x61,0x57,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe4,0x7e,0x34,0x61,0x59, +0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe5,0x7e,0x34,0x61,0x5b,0x12,0x23, +0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe6,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x36,0xe7,0x12,0x20,0xb9,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x37,0x12,0xe5,0x28,0x7a,0xb3,0x37,0x1, 0x22,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a,0x4d,0x90,0x60, +0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0xc0, +0x7e,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93, +0x7a,0xb3,0x2a,0x59,0x12,0x23,0x7c,0x12,0xc0,0x35,0x7e,0x34,0x62,0x12,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60, +0xa0,0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3, +0x16,0x92,0x22,0x12,0x23,0x7c,0x12,0xc0,0x35,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e, +0x12,0xc0,0x7e,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x37,0xa0,0xbe,0xf0,0x5, 0x78, +0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78, +0x13,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12,0x26,0x5b,0xe4,0x7a,0xb3,0x2b,0x2, 0x12, +0x7a,0x2d,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x49,0xd, 0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x69,0xab,0x12,0xc0,0xd7, +0x80,0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xbf,0xe0,0x12,0x23,0x9e,0x12,0x26,0x5b, +0x12,0x2f,0xf4,0x50,0xfb,0x12,0x88,0x17,0x12,0x69,0x97,0x12,0x28,0x48,0x74,0x2, +0x7a,0xb3,0x37,0xa0,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3, +0xed,0x7a,0x37,0x3, 0xef,0x22,0x7e,0xb3,0x37,0x6, 0x14,0x68,0x60,0x14,0x78,0x2, +0xe1,0x10,0x14,0x68,0x73,0x24,0x3, 0x68,0x2, 0xe1,0x5, 0x12,0xc1,0xf, 0x38,0x8, +0x30,0x10,0xf, 0x12,0xc1,0x7, 0x68,0xa, 0x12,0x63,0x2, 0xe4,0x7a,0xb3,0x38,0x85, +0x80,0x7e,0x7e,0xb3,0x36,0xe7,0x30,0xe0,0x77,0x7e,0x73,0x36,0xe8,0xa, 0x27,0x7e, +0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64, +0x12,0x23,0x9e,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x83,0x50,0x53,0x12,0x63,0x2, +0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x38,0x87,0x80,0x43,0x12,0xc1,0xf, +0x28,0x39,0xe4,0x7a,0xb3,0x37,0x6, 0x7e,0xb3,0x38,0x85,0xb4,0x1, 0x6, 0x74,0x1, +0x7a,0xb3,0x37,0x6, 0xd2,0x17,0x80,0x23,0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x45,0x73,0x12,0x23,0x54,0xe4,0x7a,0xb3,0x37,0x6, 0x7a,0xb3,0x39, +0x7, 0xd2,0x17,0x80,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x39,0x7, +0x12,0x90,0xd2,0x2, 0x27,0x16,0xca,0xd8,0xca,0x79,0x7e,0xb3,0x37,0x6, 0xb4,0x1, +0x2, 0x80,0x3, 0x2, 0x28,0x38,0x6c,0xdd,0x6c,0xff,0x12,0x91,0x11,0x7d,0xf3,0x12, +0x2f,0xf4,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x38,0x86,0x12,0x3d,0xac,0x12,0x13,0xc7, +0x12,0x0, 0x1e,0x74,0xa, 0x12,0x45,0x15,0x12,0xc0,0xbd,0x7e,0xe7,0x2b,0xd, 0x7a, +0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3,0x2a,0xfa,0x7e,0xe7,0x2b,0xd, +0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3,0x2a,0xfa,0x12,0x7b,0xd0,0x7c, +0x7b,0x74,0x6, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x1e,0xb9,0x7d,0x23,0x7d,0x3f, +0x12,0x25,0x3c,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12,0x4e,0xe0,0x12,0x26,0x57,0x7e, +0xb3,0x37,0x31,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, 0x74,0xa, 0x12,0x91,0x5d,0x12, +0x4f,0xaf,0x80,0xf, 0x80,0x7, 0x12,0x45,0xcf,0xe4,0x12,0x46,0x7, 0x20,0x93,0xf6, +0x12,0x45,0x9f,0x30,0x18,0xf7,0x30,0x17,0xf4,0xd2,0x4, 0x12,0x45,0x5a,0xe4,0x12, +0x13,0xde,0xb, 0xd0,0x12,0x4c,0x83,0x12,0x91,0x76,0x7e,0xa3,0x38,0x85,0x4c,0xaa, +0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x86,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x31, +0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x85,0x12,0x28,0x3d,0x78,0x18,0x7e,0xb3,0x38,0x85, +0x60,0x12,0xe4,0x7a,0xb3,0x38,0x85,0x7a,0xb3,0x2a,0x2, 0x7a,0xb3,0x2a,0x3, 0x7e, +0xf0,0x1, 0x80,0x1d,0x12,0x28,0x3d,0x68,0x10,0x7e,0xb3,0x38,0x85,0x70,0xa, 0x7e, +0xf0,0x1, 0xe4,0x7a,0xb3,0x37,0x6, 0x80,0x8, 0xbe,0xd0,0x32,0x50,0x3, 0x2, 0x27, +0x8c,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a,0x37,0x2b,0xd, 0x7a,0xe3,0x2a, +0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x48,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x38, +0xf2,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34, +0x39,0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34, +0x3a,0x22,0xca,0x3b,0x12,0x2f,0xf4,0x50,0xfb,0x7e,0xf3,0x2b,0xf, 0x7c,0xbf,0x12, +0xb3,0xd2,0x12,0xb3,0xe9,0x7e,0xb3,0x2b,0x1f,0xf5,0x28,0x7e,0xb3,0x2b,0x20,0xf5, +0x29,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0xf, 0x12,0x8d,0x6c,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x28,0x48,0xc3,0x21,0x6c,0x12,0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x7, 0x12,0xab,0xfd,0x7a,0x37,0x37,0xe3,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x69,0x8e,0x12,0xab,0xeb,0x7e,0xc3,0x3, 0xec,0x12,0x6e,0x31, +0xe4,0x12,0x13,0xde,0x12,0x28,0x48,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x2a,0x7e,0x18, +0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x7a,0xc8,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x2a, +0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x7a,0xc8,0x7e,0xd3,0x2b,0x1f,0x7e, +0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5,0x29,0x12,0x6e,0x8b,0x50,0x5, +0x7c,0xbc,0x12,0xb3,0x2a,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d, +0x10,0x12,0x6a,0xd4,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3,0x2b,0x20,0x7c,0xbf,0x12,0x86, +0xf8,0x12,0xa9,0xf5,0x7e,0xb3,0x39,0x7, 0x4, 0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39, +0x7, 0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x7, 0x7e,0xb3,0x16,0x90, +0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e, +0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, 0x37,0x2d,0x32,0x22,0x12,0x48, +0x7, 0x7e,0xb3,0x37,0x8, 0xb4,0x3, 0x6c,0x12,0xb6,0xb8,0x12,0x26,0x57,0x12,0x3f, +0xfb,0x7e,0xb3,0x37,0x9c,0x30,0xe7,0xe9,0x12,0x28,0x62,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18,0x12,0xab,0xb8,0x12,0x75,0xe9, +0x12,0xaf,0x66,0x12,0xa7,0xbd,0x12,0x88,0x5f,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x58,0x52,0x12,0x48,0x39,0x12,0x3a,0x9f,0x7e,0xb3,0x37,0x9c,0x54,0x7f,0x7a,0xb3, +0x37,0x9c,0x80,0x8d,0x12,0x2f,0xee,0x2, 0x0, 0x46,0x7a,0xb3,0x2b,0x2, 0x7a,0xb3, +0x2b,0x1e,0x22,0x12,0x52,0x6d,0x12,0x2b,0xfa,0x12,0x2b,0xfa,0x12,0x36,0xac,0x12, +0x9c,0xfd,0x12,0x9f,0xef,0x12,0x2b,0xfa,0x12,0x9b,0xe7,0x12,0x2b,0xfa,0x12,0xa0, +0xae,0x12,0x2b,0xfa,0x2, 0x2a,0x27,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c,0xdd, +0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x25,0x7e,0x8, 0x35,0xe9,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18,0x26, +0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0x41,0xfb, +0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9,0x9, +0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x36,0x74, +0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36, +0x26,0xa, 0x37,0x12,0x81,0xbf,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x25,0x12,0xa1,0x4b,0x2d,0x13,0xbd,0xc1,0x28, +0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68,0x39, +0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x2c,0x40, +0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34,0x74, +0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71,0x74, +0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe8,0xbc, +0x7e,0x28,0x2, 0x41,0x60,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x33,0x12,0x2f,0xe4,0xbe,0xb0,0xff,0x68, +0x2b,0x9, 0x73,0x1f,0x35,0x12,0x30,0x3, 0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54,0x0, +0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, 0x12, +0x2f,0xe4,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc,0xf9, +0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19,0x75, +0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19,0xa3, +0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe,0x38,0x8a,0x90, +0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e, +0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xfd,0x12,0x97,0x4, 0x7e,0x8, 0x36, +0x25,0x74,0xff,0x12,0x20,0xde,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b, +0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xf5, +0x7a,0xf3,0x35,0xe8,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb3,0x28, +0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee, +0x80,0x2e,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x25,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac, +0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa, +0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbf,0x12,0x2f,0xd0,0xb, 0xf0,0xb, 0xe0, +0x12,0x9c,0xf6,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c,0xba,0x7c,0x7d, +0x12,0x30,0x3, 0xb, 0x1a,0x30,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3, +0x2a,0x6f,0xf5,0x40,0x7e,0xb3,0x2a,0x70,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a, +0xb3,0x33,0xc2,0x7a,0xb3,0x33,0xc0,0x7a,0xb3,0x33,0xc1,0x7e,0x8, 0x1f,0x34,0x12, +0x2f,0xdd,0xe4,0x12,0x20,0xde,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x33,0xc3,0xe4, +0x12,0x20,0xde,0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa2,0x6c,0xcc,0xe1,0x91,0x12,0xc0, +0x61,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, +0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34,0x7c, +0xbd,0x14,0xbc,0xbc,0x78,0x2, 0xe1,0x97,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x88, +0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, 0xb3, +0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x28,0xe5, +0x27,0xa, 0x2b,0xe5,0x25,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0, +0x4, 0x40,0x2, 0xe1,0x86,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x86,0x85,0x25, +0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb0,0x3f,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x40,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83,0x80, +0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2b, +0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x40,0x2d,0x34, +0xbd,0x38,0x18,0x2, 0xe1,0x1d,0x75,0x30,0x1, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x1, +0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x4, +0x40,0x2, 0xe1,0x1d,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x1d,0x7c,0xbf,0x20, +0xe0,0x2, 0xe1,0x1d,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26,0xbe, +0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1, +0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25, +0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50, +0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29, +0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x5, +0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24,0xe5, +0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29, +0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x5, +0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24,0xe5, +0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85,0x2b, +0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x2c,0x40,0x7a,0x35,0x3e,0xe5,0x2a, +0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe,0xb1, +0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93,0x5, +0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0,0x5, +0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c,0x50, +0xad,0xe5,0x2c,0x12,0x2f,0xae,0xe5,0x2a,0x12,0x2f,0xa5,0xe5,0x2a,0x12,0x2f,0xae, +0xe5,0x2c,0x12,0x2f,0xa5,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20,0x5, +0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x42, +0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0xe5,0x42,0xa, 0x1b, +0x6d,0x0, 0x12,0x1e,0xeb,0x7f,0x21,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, +0x28,0x12,0x1e,0xfc,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23, +0x3e,0x24,0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe, +0xb0,0x0, 0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x33,0xbf,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f, +0x34,0xf5,0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x1f,0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0xc0,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x8e,0x7e,0x8, 0x1f,0x34,0x12,0xaf,0x71,0x7a,0xb3, +0x33,0xc2,0xda,0x3b,0x22,0x7e,0x71,0x2d,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7e,0x71, +0x2b,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7c,0x7b,0x12,0x77,0xf6,0x9, 0xa2,0x27,0x72, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x91,0x6d,0x5c,0xba,0x22, +0x7e,0x70,0x1, 0x2, 0x51,0x5f,0xa, 0x3b,0x9d,0x32,0x2, 0x21,0x0, 0x90,0x60,0x9a, +0x93,0xa, 0x3b,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x12,0x2f, +0xf4,0x50,0xfb,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x7c,0x5b,0x7e,0x43,0x28, +0x84,0xbe,0x40,0x1, 0x28,0x2, 0x21,0x14,0x7e,0xa3,0x2a,0x6e,0x7e,0x70,0x2, 0xac, +0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x30,0x3, +0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc,0x7c,0x9d,0x7e,0x83,0x2a, +0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc,0xa, 0xa8,0x1b,0xa5,0xa, +0x5f,0xbd,0x5a,0x58,0x2, 0x21,0x14,0xa, 0x59,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48, +0x4e,0x7c,0xb9,0x14,0x12,0x31,0x5a,0x50,0x46,0x7c,0xb9,0x14,0x12,0x31,0x17,0xb, +0x1a,0xe0,0x7d,0x3b,0x12,0x31,0x4c,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf, +0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12, +0x31,0x1e,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x31,0x20,0x1b,0x1a,0xa0,0xa, +0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9,0x4, 0x12,0x31,0x5a,0x50, +0x43,0x7c,0xb9,0x4, 0x12,0x31,0x17,0xb, 0x1a,0xe0,0x7d,0x3c,0x12,0x31,0x4c,0x8, +0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12, +0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x31,0x1e,0xb, 0x1a,0x50,0xbd,0x5a,0x8, +0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x31,0x27,0x7d,0xd3,0x7d,0x5d,0x3e,0x54, +0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43,0x2a,0x6e,0x90,0x60,0xab, +0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7c,0x75,0xac,0x74,0xa, +0x2a,0x2d,0x32,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40, +0x2d,0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xab,0x6c,0x77,0x80,0x12, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x51,0x4f,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22, +0xb, 0x70,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe5,0xc3,0x22,0x12,0x36,0x9c, +0x60,0x30,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1b,0x7c,0xb2,0x12, +0x31,0x27,0x7d,0x3, 0x12,0x36,0x94,0x49,0x55,0x38,0xe8,0x7d,0x40,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd4,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc0,0xb4,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0x41,0xdd,0x6c,0xcc,0x41,0xcf,0x12,0xc0,0x61,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xb, 0x7e,0xb3,0x36,0x71,0x70, +0x5, 0x12,0x32,0xe0,0x80,0x6, 0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x30, +0x19,0xd2,0x3, 0x12,0x32,0xe7,0x7e,0xb3,0x36,0xec,0xb4,0x1, 0x1b,0x7e,0xb3,0x2a, +0x3, 0xb4,0x1, 0x14,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xd, 0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x3, 0x12,0x32,0xe0,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x27,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, +0x2d,0x1b,0x24,0xe5,0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24, +0x0, 0x80,0x3c,0xe5,0x24,0xbc,0xbc,0x68,0x34,0x12,0x35,0xda,0x9, 0xa3,0x26,0xfa, +0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5,0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x2f,0xd6, +0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a,0xa, 0x2b,0xe5,0x28,0x12,0x2f,0xd6,0xbe, +0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12, +0x36,0xa4,0x38,0xbf,0xe5,0x27,0x7e,0x71,0x28,0x12,0xa0,0x94,0x50,0x8, 0x12,0x31, +0x7d,0x12,0x35,0xd3,0x80,0x8, 0x12,0x69,0x84,0x50,0x3, 0x12,0x32,0xe0,0xe5,0x25, +0x7e,0x71,0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x33,0x21,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x16,0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e, +0x34,0x27,0x78,0x6d,0x22,0x12,0x7f,0xc5,0x12,0x31,0x7d,0xb, 0xf0,0xb, 0xc0,0x7e, +0x73,0x28,0x84,0xbc,0x7c,0x28,0x2, 0x21,0xc9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22, +0x75,0x25,0x3, 0x75,0x26,0x3, 0x22,0x12,0x36,0x9c,0x60,0x34,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1f,0x7c,0xb2,0x12,0x31,0x27,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x36,0x94,0x59,0x35,0x38,0xe8,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72,0x38,0xd0, +0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x35, +0x80,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x35,0x80,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x30,0x3, 0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x90,0x50,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0xc7,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0xb1,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0xaf,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0xaf,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x40,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0xaf,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x35,0x65,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x35,0x65,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0xb8,0x88,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x35,0x56,0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x35,0x56,0x9f,0x51,0x12,0x35,0x5d,0x9f,0x41,0x12,0x35,0x5d,0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0xeb,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xdf,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x35,0x71,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x35,0x71,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1e,0xeb,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x0, 0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x7, 0x2e,0x18,0x0, 0x20,0x22, +0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34, +0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39, +0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39, +0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d, +0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba, +0xda,0xf8,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x74,0xf5,0x27,0x12,0x0, 0x66,0x50,0x2, 0xc1, +0x6f,0x6d,0x33,0x9e,0x37,0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x70,0x7e, +0xb3,0x16,0x92,0x70,0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x60,0x7e,0x77,0x2a,0x51, +0x7e,0x67,0x2a,0x53,0x75,0x24,0x0, 0x80,0x4e,0xe5,0x24,0x12,0x2f,0xb7,0x60,0x45, +0x12,0x35,0xda,0x12,0x9d,0x80,0xf5,0x26,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90, +0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26,0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26, +0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0xd, 0xe5,0x25,0xa, 0x2b,0xe5, +0x27,0x12,0x9b,0x18,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x51,0x5f,0x12, +0x35,0xda,0x12,0x37,0x9f,0x5, 0x24,0x12,0x36,0xa4,0x38,0xad,0x12,0xa6,0x5, 0xda, +0x3b,0x22,0x12,0x46,0xa2,0x12,0x24,0x9a,0x12,0x73,0x28,0x12,0x22,0xf2,0x7e,0xb3, +0x37,0x8, 0x24,0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x58,0xf0,0x80,0xef,0x12, +0x29,0x7e,0x80,0xea,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x90,0x60, +0xa7,0xe4,0x93,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x12,0xa5,0xee,0x12, +0x9b,0x49,0x12,0x35,0xe2,0x12,0x9a,0x38,0x2, 0x36,0xbb,0xca,0x3b,0x12,0x2b,0xfa, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x9, 0xe4,0x7a,0xb3,0x35, +0xe4,0x7a,0xb3,0x35,0x69,0x7e,0xb3,0x35,0xe2,0x70,0x69,0x6c,0x99,0x80,0x5d,0x74, +0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x9a,0xed, +0x40,0x48,0x6c,0xee,0x80,0x3c,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x6a,0x9, 0xc5, +0x35,0x6b,0xa, 0x28,0xa, 0x3d,0x12,0x37,0x67,0x78,0x25,0xa, 0x2f,0xa, 0x3c,0x12, +0x37,0x67,0x78,0x1c,0x7c,0xb9,0x12,0x37,0x6f,0x7e,0x14,0x62,0x2b,0x12,0x87,0xee, +0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x51,0x5f,0x7c,0xb8,0x7c,0x7f,0x12,0x37,0xa7, +0xb, 0xe0,0x7e,0x73,0x35,0xe4,0xbc,0x7e,0x38,0xbc,0xb, 0x90,0x7e,0x73,0x28,0x84, +0xbc,0x79,0x38,0x9b,0x7e,0x73,0x35,0x69,0x7a,0x73,0x35,0xe4,0xa, 0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x35,0xa6,0x7e,0x8, 0x35,0x6a,0x12,0x20,0xb9,0x1b,0xfd,0xe4, +0x7a,0xb3,0x35,0xe2,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x0, 0x4d,0x33,0x22,0x7c, +0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x2, 0x2c, +0x40,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0x99,0x6c,0x7f,0x71,0x7c,0xbf,0x12, +0x37,0x6f,0x12,0xa4,0xcf,0x7f,0x17,0x12,0x1f,0x58,0x7c,0xb7,0xda,0xf8,0x22,0x9, +0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c,0x6b,0x7e,0xa3,0x35,0x69,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x62,0x35,0xa6,0x19,0x72,0x35,0xa7,0x7c,0xba,0x4, 0x7a,0xb3,0x35, +0x69,0x22,0xca,0xf8,0x6c,0xff,0x80,0x18,0x7c,0xbf,0x12,0x37,0x6f,0xbe,0x37,0x2a, +0x5c,0x58,0xb, 0x12,0x51,0x5b,0x7e,0x70,0x2, 0xac,0x7f,0x12,0x37,0x9f,0xb, 0xf0, +0x12,0x52,0x66,0x38,0xe3,0x12,0x2b,0xfa,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe, +0xa0,0x34,0x38,0x3, 0x2, 0x38,0xfd,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x10, +0x41,0x1c,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d, +0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x31,0xce,0x7e,0x39,0xb0,0xbe,0xa0,0x37, +0x68,0x2, 0x41,0x1c,0x75,0x1a,0x36,0x41,0x1c,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0, +0x39,0x78,0x1b,0x7e,0xf3,0x37,0xc0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc0,0xbe,0xa0, +0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x1c,0xbe,0xa0, +0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xc2,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc2,0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b, +0x44,0x41,0x1c,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x1c,0xbe,0xa0, +0x5e,0x78,0x26,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, +0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x1c,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0, +0x3d,0x78,0x1b,0x7e,0xf3,0x37,0xc4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc4,0xbe,0xa0, +0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x1c,0xbe,0xa0, +0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xc6,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc6,0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a, +0x9d,0x41,0x1c,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x37,0x9c,0x41,0x1c,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e, +0xf3,0x37,0xe1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xe1,0xbe,0xa0,0x4f,0x78,0x3, 0x75, +0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x31,0xcc,0x7e,0x39,0xb0,0x41,0x1c,0xbe,0xa0,0x51, +0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, +0xff,0x7e,0xb3,0x37,0xec,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a, +0xb3,0x37,0xec,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0x1c,0xbe, +0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xb5,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xb5,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x3a, +0x1f,0x41,0x1c,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0x91,0x41,0x1c,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e,0xbe,0xa0, +0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0xa, 0x9, 0xb3,0x31,0xd4,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1a,0xf4,0x80,0x5c, +0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5, +0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10, +0x3e,0x14,0x7e,0x1f,0x31,0xd0,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, +0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80, +0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c, +0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, +0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e, +0x3, 0x2a,0x6d,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x60,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, +0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, +0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x62,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca, +0xf8,0x80,0x38,0x7c,0xbf,0x12,0x3a,0x1f,0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70, +0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x12,0x3a,0xde,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x3a,0xde,0x7e,0x73,0x2a, +0x6e,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3, +0x2a,0x6d,0x74,0x2, 0xa4,0x22,0x12,0x3f,0xaa,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x37,0xdc,0x7e,0x8, 0x25,0xee,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x3f,0x49,0x80,0x12, +0xca,0x39,0x7e,0x18,0x37,0xdc,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x3f,0x67,0x2, 0x3b,0x15,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0xca,0xf8, +0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x7d,0xab,0xd2,0x6, 0xa1,0xa0,0xa5, +0xbe,0x1, 0x3d,0x7a,0x73,0x37,0x9d,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5,0xbf,0xae, +0x4, 0xd2,0x7, 0xa1,0xa0,0xa5,0xbf,0xaa,0x5, 0x12,0xc0,0xce,0x80,0x1e,0xa5,0xbf, +0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xce,0x80,0x10,0xa5,0xbf,0xac,0x2, +0x80,0x2, 0xa1,0xa0,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xce,0x6d,0x33,0x81,0x1c, +0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x3d,0xa3,0xa5,0xbe,0x7, +0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xa0,0xa5,0xbe,0x8, 0x2, 0x80,0x2, 0xa1,0xa0, +0x12,0x7, 0xfb,0xa1,0xa0,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73,0x37,0xa6, +0xa1,0xa0,0xa5,0xbe,0xb, 0x8, 0x12,0x3d,0xa3,0x12,0x3f,0xc8,0xa1,0xa0,0xbe,0x60, +0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x38,0xbe,0x60,0x1e,0x40,0xd, 0xbe, +0x60,0x23,0x38,0x8, 0x12,0x3d,0xa5,0x43,0xc, 0x40,0xa1,0xa0,0xbe,0x60,0x15,0x40, +0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x3d,0xa5,0xd2,0x6, 0xa5,0xbe,0x15,0x2, 0x80, +0x2, 0xa1,0xa0,0x74,0x7, 0x7a,0xb3,0x37,0xa0,0xa1,0xa0,0xa5,0xbe,0x19,0x7, 0xe4, +0x7a,0xb3,0x37,0xb5,0xa1,0xa0,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c,0x38,0x2, +0xa1,0x38,0xa5,0xbe,0x2d,0x1b,0x12,0x3d,0xa5,0x20,0x7, 0x2, 0xa1,0xa0,0x7e,0x63, +0x37,0xc8,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35,0x8, 0xa1, +0xa0,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, 0xa1,0x38, +0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1,0x38,0x7e,0x70, +0x64,0xa1,0x38,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, 0x1, 0x7e, +0xf3,0x37,0xc1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc1,0xa, 0x2f,0x19,0x72,0x2b,0x21, +0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x38,0xa1,0xa0,0xbe,0x60,0x3a, +0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xc3,0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, 0x80,0x2, +0xa1,0xa0,0x75,0x1a,0x3a,0xa1,0xa0,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, 0x7a,0x73, +0x2b,0x12,0xa1,0xa0,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xec,0xa1,0xa0,0xbe,0x60, +0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc5,0x7c,0xbf, +0x4, 0x7a,0xb3,0x37,0xc5,0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d,0x2, 0x80, +0x2, 0xa1,0xa0,0x75,0x1a,0x3c,0xa1,0xa0,0xbe,0x60,0x3e,0x68,0x4, 0xa5,0xbe,0x3f, +0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc7,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc7,0xa, +0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x3e, +0xa1,0xa0,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x3d,0xa5,0x75, +0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x3d,0xa5,0x75,0xd, 0x2, 0x12,0x3a, +0xe6,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x3d,0xa5,0x12,0x3f,0x70,0x80,0x71,0xbe, +0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x3d,0xa5,0x80,0x63,0xbe,0x60,0x4e, +0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xe2,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xe2,0xa, 0x2f,0x2e,0x27,0x31,0xcc,0x7a,0x29,0x70,0xa5,0xbe,0x4f, +0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80,0x31,0xbe, +0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20,0x7c,0xb7, +0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, 0x7e,0x1f, +0x31,0xd0,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a,0x71,0xf, +0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0x9c,0x22,0x7a,0xb3,0x2b,0x0, +0x70,0x14,0x12,0x3f,0x67,0x12,0x3b,0x15,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4, +0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x3f,0x49,0x12,0x3b,0x15,0x12, +0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12,0x0, 0x1e, +0xe4,0x12,0x3d,0xac,0x12,0x3d,0xf3,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12,0x3d,0xac, +0x2, 0x3d,0xf3,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e,0x8, 0x1f, +0x44,0x12,0x3f,0xe9,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x20,0xde,0x7e, +0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x1f,0xda,0x7e, +0x34,0x0, 0xa, 0x12,0x20,0xde,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc,0x7a,0x1d, +0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, 0x2a,0xb9, +0x12,0xba,0x4c,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, 0x3a,0x2e, +0x34,0x20,0x73,0x12,0x91,0x6d,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12, +0x3f,0xb, 0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a, +0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9, +0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x3f,0xb, 0xa, 0x4a, +0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde, +0x38,0xd8,0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0, +0x12,0xb8,0xe2,0x80,0x3, 0x12,0x3f,0xd9,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f, +0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e, +0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34, +0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e, +0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x12,0xae,0xfc,0x12,0x13,0xf5,0x12, +0xb9,0x6e,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x3f,0xcb,0x74,0x1, 0x12, +0x3d,0xac,0x12,0x3f,0xd2,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x3d,0xdb,0x7e, +0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25, +0xee,0x22,0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x3f,0x67,0x80,0x6, 0xb4,0x1, 0x6, +0x12,0x3f,0x49,0x12,0x3b,0x15,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22, +0x12,0x3f,0xaa,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x37,0xdc, +0x12,0x20,0xb9,0x1b,0xfd,0x12,0xc0,0xc5,0x12,0x3f,0x49,0x80,0x1a,0xca,0x39,0x7e, +0x18,0x2b,0x70,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x37,0x2b,0x76, +0x7a,0x37,0x31,0xcc,0x12,0x3f,0x67,0x2, 0x3b,0x15,0x7e,0xb3,0x37,0xe0,0x7e,0x34, +0x0, 0x4, 0x22,0x7c,0x6b,0x12,0x3f,0xe1,0x78,0x5, 0x7c,0xb6,0x2, 0x7d,0xd6,0xb4, +0x4, 0x5, 0x7c,0xb6,0x2, 0x3b,0x1e,0x22,0xb2,0x82,0x22,0x7d,0x32,0x74,0xfa,0x2, +0x12,0xd0,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x20, +0xde,0x7e,0xb3,0x37,0x9c,0xc4,0x54,0x7, 0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, +0x20,0xde,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x30,0x6, 0x3b,0xc2,0x6, +0x12,0x25,0xe6,0x7e,0x73,0x37,0xa1,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x37,0xa2,0x7a, +0x73,0x2b,0x1d,0x7e,0x73,0x37,0xa2,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x37,0xa3,0x60, +0x18,0x7e,0x34,0x0, 0x2, 0x12,0x41,0x5d,0x7e,0x34,0x0, 0x1, 0x12,0x41,0x5d,0x6d, +0x33,0x12,0x41,0x5d,0xe4,0x7a,0xb3,0x37,0xa3,0x12,0x4f,0xfa,0x2, 0x40,0x3f,0xe5, +0xc, 0x70,0x2, 0x21,0x5c,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x72,0x92, +0x12,0x79,0x31,0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53, +0xc, 0xfd,0x12,0xba,0x3, 0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b, +0x12,0x60,0x9, 0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65, +0x7e,0x73,0x2b,0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x4, +0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3, +0x45,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xce,0x7a,0x73,0x2b,0xf, 0x12,0x87,0x52,0x7a, +0xb3,0x0, 0x4f,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x4f,0x7a, +0x73,0x37,0xa6,0x12,0x6e,0x29,0x12,0xc0,0x22,0x7e,0x73,0x37,0xcf,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xae,0xfa,0xe4, +0x12,0xa, 0x66,0x12,0x8d,0xec,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43, +0x37,0xd0,0x7e,0x50,0xa, 0xac,0x45,0x12,0x3f,0xcb,0xe5,0xc, 0x30,0xe6,0x4e,0x53, +0xc, 0xbf,0x7e,0x73,0x37,0xbc,0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37, +0xbc,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x43,0xeb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63, +0x37,0xbc,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12,0x47,0x81,0x7c,0x65,0x4c,0x76,0x74, +0xe, 0x12,0x43,0x5f,0x12,0x43,0xeb,0x12,0x43,0xf3,0x7e,0x73,0x37,0xbf,0x7a,0x73, +0x2b,0x14,0x7e,0x73,0x37,0xbe,0x7a,0x73,0x2b,0x1f,0x12,0xc0,0xd7,0xe5,0xc, 0x30, +0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xa6,0x2, 0x48,0x77,0x22,0xca,0xd8,0xca, +0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c, +0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x57, +0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x43,0xeb,0x7c,0x8b,0x74,0x7, 0x7e, +0x70,0xf, 0x12,0x43,0xf0,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, +0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, +0xc, 0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e, +0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x38,0xc4,0x12,0x43, +0x48,0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x38,0xc4,0x78,0x7, 0x12,0x43, +0x48,0x54,0xfb,0x80,0x5, 0x12,0x43,0x48,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x38, +0xc0,0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e, +0xa0,0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0x12,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff, +0xe, 0x12,0x43,0x53,0x54,0xe6,0x12,0x43,0x50,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12, +0x43,0x53,0x5e,0x54,0xfe,0xe6,0x12,0x43,0x50,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4, +0x0, 0x2, 0x78,0x2d,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e,0x54,0x0, 0xf, 0x1b, +0x1a,0x50,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34, +0x0, 0x2, 0x12,0x44,0x72,0x12,0x44,0x4b,0x12,0x44,0x28,0x7a,0x37,0x31,0xd4,0x61, +0x4, 0x6c,0xdd,0x41,0xfe,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40, +0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, +0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c, +0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e, +0x54,0x0, 0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4, +0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, +0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, +0x3b,0x12,0x44,0x72,0x12,0x44,0x4b,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x44,0x4b, +0x12,0x44,0x28,0x74,0x2, 0xac,0xbd,0x59,0x35,0x31,0xd6,0x80,0xf, 0x12,0x44,0x28, +0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x31,0xd6,0xb, 0xd0,0xbc,0xed, +0x28,0x2, 0x41,0x65,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x43,0xf0,0xa9,0xc0, +0xc4,0x7e,0x1f,0x38,0xc0,0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x38,0xc0,0x79,0xf1,0x0, +0x90,0x6d,0x33,0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0x8, 0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x10,0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22, +0x1b,0x1a,0x50,0x7e,0x1f,0x38,0xc0,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5, +0xfd,0x7a,0x71,0xfe,0x22,0xca,0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12, +0x43,0x5f,0x74,0xf, 0x12,0x43,0xeb,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe, +0x12,0x43,0x5f,0x74,0xc, 0x12,0x43,0xeb,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, +0x7e,0x70,0xf8,0x12,0x43,0x5f,0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, +0x38,0xb, 0x12,0x45,0x6, 0x7c,0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17, +0xe4,0x93,0xb4,0x1, 0xe, 0xbe,0xa0,0x7, 0x28,0x9, 0x12,0x45,0x6, 0xa, 0x77,0x2e, +0x74,0x0, 0x7, 0x74,0xe, 0x7c,0x7f,0x12,0x43,0x5f,0x74,0x7, 0x12,0x43,0xeb,0x7c, +0xfb,0x5e,0xf0,0xfb,0x90,0x60,0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c, +0xf7,0x74,0x7, 0x7c,0x7f,0x12,0x43,0xf0,0xda,0x79,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x12,0x43,0x5f,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24, +0x7e,0x24,0x0, 0x12,0x12,0xb7,0x9d,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74, +0x3, 0x7e,0x71,0x27,0x12,0x43,0x5f,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x43,0x5f,0x74, +0xc, 0x7e,0x71,0x30,0x12,0x43,0xf0,0x22,0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0xa, +0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e, +0xf, 0x38,0xc4,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0x12,0x5e, +0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34, +0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x45,0x15, +0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6, +0x22,0x12,0x47,0xf8,0xc2,0x3, 0x12,0xb6,0x2d,0xc2,0x5, 0x12,0x45,0x51,0xc2,0x3, +0x12,0x47,0x21,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0xeb,0x7a,0x1b,0xb0,0x74,0xf, +0x6c,0x77,0x12,0x43,0x5f,0xe5,0xfc,0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x43,0xf3, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x2a,0x12,0x44,0x6e,0x12,0xb5, +0xe5,0x2, 0xb6,0x9a,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x1a,0x12,0x44,0x6e,0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0xc, 0x12,0x44,0x6e,0x2, 0xb6,0x94,0x74, +0x1, 0x7a,0xb3,0x33,0xff,0x22,0xa, 0x3a,0x2e,0x34,0x0, 0x3, 0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0x5f,0x7a,0x61,0xfc,0x12,0x43,0xf3, +0x12,0x46,0x68,0xd2,0x3, 0x12,0x47,0x21,0x12,0x45,0x6b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x45,0x6b, +0x2, 0x13,0x96,0x12,0x47,0xf8,0xc2,0x5, 0x2, 0x45,0x51,0xd2,0x5, 0x12,0x45,0x51, +0x74,0x1, 0x22,0x12,0x45,0xcf,0x12,0x91,0x8, 0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0xc0,0xab,0x12,0x44,0x91,0x74,0x1, 0x12,0x46,0x7, 0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x45,0x30,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x45,0x5a,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x45,0xcf,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x46, +0x7, 0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x45,0x5a,0x74, +0x81,0x7a,0xb3,0x39,0x2, 0x22,0x80,0x1d,0x12,0x45,0xcf,0x12,0x47,0xff,0x68,0x5, +0xc2,0x4, 0x12,0x45,0x5a,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x17, +0x15,0xe4,0x12,0x46,0x7, 0x20,0x93,0xe0,0x12,0x45,0xcf,0xa9,0xd1,0xcd,0xa9,0xc5, +0xea,0x74,0x2, 0x2, 0x46,0x7, 0x22,0x7c,0xab,0x7e,0xb3,0x39,0x2, 0xb4,0x81,0x38, +0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf, +0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, +0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87, +0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0x2, 0x22,0xd2,0x3, +0x80,0x12,0x30,0x3, 0xc, 0x12,0x47,0xff,0x68,0x7, 0xc2,0x3, 0xc2,0x4, 0x12,0x45, +0x5a,0x12,0x45,0xd6,0x30,0x17,0xeb,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb, +0xd2,0x3, 0x12,0xb6,0x2d,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, +0xa9,0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74, +0x41,0x12,0x45,0x15,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda, +0xf8,0x22,0xe4,0x12,0x46,0xf0,0x12,0xb6,0x36,0x12,0x26,0x57,0x12,0xb6,0xb1,0x12, +0x43,0x65,0x12,0xb5,0xdb,0x12,0xb6,0x4d,0x12,0x0, 0x4a,0x12,0xb6,0x59,0x12,0x7e, +0xa0,0x12,0xb6,0x69,0xd2,0xaf,0x12,0x47,0x8a,0x12,0xb8,0x6e,0x12,0x43,0xfa,0x12, +0x46,0x68,0x7e,0x8, 0x3, 0xf1,0x12,0xa9,0x80,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34, +0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0xa9,0xd0, +0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x45,0x51,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75, +0xc2,0xc, 0xd2,0x3, 0x12,0x47,0x21,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1, +0x22,0xa2,0x3, 0xa9,0x97,0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x7e,0x34,0x36,0xe1, +0x30,0xd, 0x4b,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x4f, +0x9, 0x53,0x0, 0x3, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12, +0x47,0x7f,0x7a,0x27,0x2a,0x53,0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a, +0x27,0x2a,0x5a,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a, +0x5c,0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0x45,0xc, 0x7a,0x37,0x2a,0x62,0x22,0xa, +0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12, +0x43,0xeb,0x7c,0x7b,0x12,0x43,0xf3,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e, +0x24,0x0, 0xef,0x7e,0xf, 0x38,0xc0,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e, +0xf, 0x38,0xc0,0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x38,0xc0,0x79, +0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x38,0xc0,0x79, +0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8a,0x7e, +0x34,0x6a,0xd1,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e, +0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8e,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x12,0xc0,0xce,0x12,0xc0,0xc5,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x48,0x56,0x12,0x48,0x30,0x74,0x50,0x7a,0xb3,0x37,0xd0,0x7e,0x24, +0x3, 0x20,0x12,0x3f,0xcb,0xe4,0x12,0xc0,0x7, 0x6d,0x33,0x7a,0x37,0x39,0x4, 0x22, +0x7e,0x73,0x2b,0x62,0x7a,0x73,0x37,0xcf,0x22,0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37, +0xca,0x7e,0x73,0x37,0xce,0xbe,0x73,0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12, +0x48,0x56,0x12,0x48,0x30,0x22,0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x7e,0x73, +0x2b,0x1f,0x7a,0x73,0x37,0xbe,0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x7e,0x73, +0x2b,0x14,0x7a,0x73,0x37,0xbf,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, +0x12,0x48,0xe8,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80, +0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x48,0xe8,0x40, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c, +0xdd,0x7c,0xbd,0x12,0x8d,0xb3,0x12,0x48,0x6e,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x37, +0xbe,0x12,0x49,0x4, 0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x12,0x48,0x30,0x7a, +0xd3,0x37,0xa6,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26, +0x33,0xbc,0xbe,0x22,0x30,0x3, 0x3, 0x12,0x48,0x6e,0xa2,0x4, 0x92,0x5, 0x12,0x49, +0xc3,0x2, 0x49,0x4, 0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x22,0x74,0x40,0x12, +0x6e,0x8b,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x48,0xf4,0x80,0x1c,0x74,0x1, 0x12, +0x49,0x47,0x7e,0x43,0x37,0xbb,0x7e,0x50,0x64,0xac,0x45,0x12,0x87,0xf8,0x7a,0xb3, +0x2b,0x1f,0x7e,0xf, 0x38,0xd9,0x12,0x4d,0x9b,0x12,0x49,0x4, 0x7e,0x73,0x2b,0x1f, +0x7a,0x73,0x37,0xbe,0x2, 0x48,0x6e,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14, +0x12,0xc0,0x22,0x7e,0xc0,0xa, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x1f,0x38,0xd9,0x12,0x90,0x58,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, +0x12,0x49,0xb7,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12, +0x49,0xb7,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x49,0xb7,0xb, +0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x38, +0xd9,0x12,0x8f,0xfb,0x7d,0x73,0x7e,0x1f,0x38,0xc8,0x69,0x31,0x0, 0x1a,0x7a,0x73, +0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, 0x1a,0xb, +0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x37,0xb1, +0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5,0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3, +0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a,0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35, +0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x31,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x4e,0x5f,0x6c,0xff,0x80,0x35,0x12,0x4c, +0x40,0x6c,0xee,0x80,0x19,0x7e,0x11,0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac, +0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x10,0x12,0x4c,0x47,0xe5,0x2e, +0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12,0x4c,0x56,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34, +0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xc5,0x12,0xc0,0x90,0x68,0xb, 0x7e,0x34, +0x10,0x0, 0x12,0x4c,0x7c,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x78,0x12,0x4c,0x40, +0x6c,0xee,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2a,0xbc,0xbe,0x38,0xe6,0xe5,0x2a, +0x12,0x4c,0x56,0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x60,0xe5,0x2a,0xbe,0xb1,0x2d, +0x50,0x35,0x12,0x4c,0x40,0x7e,0xe1,0x2a,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2d, +0xbc,0xbe,0x38,0xe6,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5,0x2d,0xa, 0x1b,0x6d,0x0, +0x9f,0x1, 0x12,0x4c,0x5a,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x3, 0x62,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x82,0xe5,0x2d,0xa, 0x1b,0x6d, +0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x1f,0x7, 0x6c,0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, 0x9d,0x15,0xad,0x12, +0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21, +0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xcc, +0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x7, 0x6c,0xff,0x80, +0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x60,0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10, +0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x60,0xe5,0x2a, +0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x62,0x2e,0x14,0x10, +0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x62,0xb, 0xf0,0xe5,0x2b,0xbc, +0xbf,0x38,0x9e,0x7e,0x73,0x37,0xb3,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14, +0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x5, 0x7d,0xe3,0x7a,0xe5,0x35, +0x7e,0x73,0x37,0xb4,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d, +0x1f,0x12,0x1f,0x5, 0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, 0xac,0xbf,0x49,0x45, +0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x34,0x0, 0x80,0x8, +0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xda, +0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x60,0xbe,0x45,0x35,0x28, +0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x60,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65, +0x3, 0x60,0x49,0x45,0x3, 0x62,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35, +0x3, 0x62,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x62,0xb, 0xf0,0xe5,0x2b, +0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x31,0x12,0x4d,0x9b,0xda,0x3b,0x22, +0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a, +0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f, +0x7, 0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x1f,0x5, 0x7e,0xa1,0x2c,0x74, +0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x4e,0x5f,0x7e,0x1f,0x38,0xf3, +0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x6, +0x7e,0x38,0x38,0x88,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x87,0x70,0xe, 0x7e,0xb3,0x38,0x85,0x70,0x8, +0x74,0x1, 0x7a,0xb3,0x38,0x87,0xa1,0x57,0x7e,0xb3,0x38,0x87,0x70,0x6, 0x74,0x1, +0x7a,0xb3,0x38,0x87,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0, +0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61, +0x59,0x12,0x23,0x9e,0x7a,0x35,0x2e,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0xa6,0x56, +0x75,0x2c,0x0, 0x80,0x16,0x12,0x4c,0x7c,0x12,0x4d,0x84,0xbe,0x35,0x2a,0x8, 0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x84,0x7a,0x35,0x2a,0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c, +0x38,0xe3,0x12,0x4d,0x93,0x40,0x25,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x1e,0x5, 0x1c, +0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c,0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20,0xb9,0x1b,0xfd,0x74,0x2, 0x12,0x0, +0x1e,0x12,0x4d,0x93,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x38,0xf2,0xe4,0x7a,0xb3,0x38, +0x87,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, 0x21,0x0, 0x7f,0x13,0x2d,0x35,0xb, +0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35,0x2a,0x22,0x12,0x4d,0xa5,0xb, 0x34, +0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x12,0xc1,0x17,0x4c,0xaa, +0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c,0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4, +0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60, +0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e,0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, +0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc, +0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, +0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12,0x1f,0x7, 0x7f,0x1, 0xb, 0xc, 0x7e, +0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f,0x7, 0xbe,0x34,0x0, 0xfa,0x28,0x4, +0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, 0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d, +0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e,0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e, +0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27, +0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e, +0x34,0x0, 0x38,0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12, +0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, +0x12,0x4e,0x8d,0x80,0x2, 0xe4,0x22,0x12,0x4e,0x72,0x74,0x1, 0x22,0x12,0xc0,0x75, +0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0x12,0x7f,0x6f,0x38,0x2, +0xe4,0x22,0x12,0x7f,0x67,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x4e, +0xb4,0x2, 0x4e,0x7d,0x7e,0xd7,0x2b,0xd, 0xbe,0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12, +0x7e,0xf8,0x12,0x4e,0xe0,0x7a,0xd7,0x2b,0xd, 0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e, +0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, 0x12,0x4f,0xaf,0x74,0x1, 0x22, +0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b,0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a, +0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x4e,0xe0,0x12,0xc0,0xbd,0x12,0x29,0x6f, +0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x20,0xde,0x7e,0xd0,0x7, 0x12,0x26,0x57,0x6c, +0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x12,0x4f,0xf0,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, +0x3c,0xbd,0x32,0x48,0xde,0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x7e,0xb3, +0x2a,0x73,0x7c,0x7e,0x12,0x7b,0x31,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49, +0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0x4f,0xf0,0x5c,0x7b,0x7a, +0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe, +0xd0,0x0, 0x58,0x88,0x12,0x7b,0x39,0x74,0x2, 0x12,0xc0,0xe0,0x12,0x50,0x51,0x74, +0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2a,0xfa,0x12,0x4e,0xe0,0xda,0x3b,0x22,0x74,0x2, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x12,0x50,0x51,0x74,0x2, 0x12,0x0, 0x1e,0x74, +0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x4f,0xc1,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, +0x94,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x2e,0x34,0x20,0x73,0x12, +0x91,0x6d,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x38,0xc0,0x2d, +0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x74,0xbc,0x6a,0x38,0xd6,0x22, +0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, +0x30,0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x4e,0xe0,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, +0xfd,0x7e,0xb3,0x37,0xe0,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc0,0xe0,0x12, +0x50,0xd4,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xe1,0x7e, +0xb3,0x37,0xe0,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x3f,0x67,0x80,0x7, 0xe4, +0x12,0x0, 0x1e,0x12,0x3f,0x49,0x12,0x3b,0x15,0x7e,0xb3,0x2a,0xfc,0x2, 0x50,0x51, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x3f,0xe9,0x7e,0xa3,0x2a,0x73, +0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x62,0x2a,0xdc,0xa, 0x26, +0x12,0x51,0x4b,0x93,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x50,0xca, +0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xde,0x6c,0xee,0x80,0x1a,0xa, 0x2e, +0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12, +0x50,0xca,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30, +0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba, +0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27,0x2a,0xfe,0x7e,0x29, +0xb0,0xa, 0x26,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xe9,0x7e, +0xa3,0x2a,0x73,0x7e,0x63,0x2a,0x74,0x6c,0xee,0x80,0x1f,0xa, 0x2e,0x9, 0x72,0x2a, +0xdc,0xbe,0x70,0x1c,0x50,0x12,0xa, 0x27,0x12,0x51,0x4b,0x93,0x7c,0x7b,0x7e,0xb3, +0x2a,0xfb,0xa, 0x27,0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xdd,0x6c,0xee, +0x80,0x17,0xa, 0x3e,0x9, 0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a, +0xfb,0xa, 0x27,0x19,0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e, +0x30,0xe, 0xac,0x3e,0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11, +0xf8,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0x73,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7a,0xb3,0x34,0xc4,0x7c,0xbf,0x6c,0x77,0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x51,0x4f,0x93,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff, +0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0xca, +0xf8,0x6c,0xaa,0x6d,0x33,0x7e,0x24,0x7f,0xff,0x7e,0xf0,0x1, 0x80,0x32,0xa, 0x1f, +0x7e,0xb3,0x2a,0x6e,0xa, 0xb, 0x2d,0x1, 0x3e,0x4, 0x49,0x10,0x4, 0xfc,0xbe,0x14, +0x3, 0xe8,0x8, 0x1a,0xb, 0xa0,0xbd,0x13,0x8, 0x4, 0x7d,0x31,0x80,0x10,0xbd,0x12, +0x58,0xc, 0x7d,0x21,0xbe,0x24,0x0, 0x0, 0x18,0x4, 0x7e,0x24,0x0, 0x1, 0xb, 0xf0, +0x7e,0xb3,0x2a,0x6f,0xa, 0xb, 0x1b,0x4, 0xa, 0x1f,0xbd,0x10,0x48,0xc0,0x7e,0xb3, +0x34,0xa1,0x7a,0xb3,0x36,0xf3,0x7a,0xa3,0x36,0xf7,0xe4,0x7a,0xb3,0x36,0xf5,0xbe, +0xa0,0xb, 0x78,0x18,0x9d,0x32,0xbe,0x34,0x4, 0xb0,0x58,0x10,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x1, 0x5e,0x58,0x6, 0x74,0x1, 0x7a,0xb3,0x34,0xa1,0x7e,0x73,0x34,0xa1, +0xbe,0x70,0x0, 0x28,0x3e,0x6c,0xff,0x80,0x35,0x7c,0xbf,0x12,0x97,0xfc,0x60,0x22, +0x74,0x22,0x7a,0xb3,0x36,0xf4,0x7e,0xb3,0x34,0xc4,0x4, 0x12,0x51,0x57,0x7e,0x73, +0x34,0xc4,0xbe,0x70,0x5, 0x40,0x15,0xe4,0x7a,0xb3,0x34,0xc4,0x7a,0xb3,0x34,0xa1, +0x80,0xa, 0xe4,0x12,0x51,0x57,0x74,0x33,0x7a,0xb3,0x36,0xf5,0xb, 0xf0,0x12,0x52, +0x66,0x38,0xc6,0xda,0xf8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xca,0xd8,0xca, +0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x3c,0xe4,0x7a,0xb3,0x1f,0x58,0xe5,0x1d, +0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60,0xc, 0x12,0x8c,0x87, +0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x10,0x6d,0x88,0x7a,0x87,0x37, +0xfd,0x61,0xa0,0x12,0x93,0x91,0x60,0x12,0x7e,0x34,0x62,0xe, 0x12,0x87,0xc4,0x7a, +0x87,0x37,0xf3,0x12,0x54,0x2b,0x7a,0x87,0x37,0xfd,0x7e,0x87,0x37,0xf3,0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x7b,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x52,0x7c,0xbd, +0x7c,0x7e,0x12,0x55,0xb9,0x7d,0x93,0x7e,0x87,0x37,0xfd,0xbd,0x89,0x50,0x4, 0x7a, +0x97,0x37,0xfd,0x7e,0x87,0x38,0x3c,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x3c,0xe5, +0x1d,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x37,0xff,0x12,0x54,0x4e,0x50,0x7, 0x12, +0x54,0x45,0xd2,0x3, 0x80,0x2f,0x7e,0x8, 0x37,0xff,0x7e,0x18,0x1f,0x52,0x12,0x57, +0x0, 0x50,0x22,0x80,0x10,0x12,0x54,0x2b,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f,0x52, +0x12,0x91,0x86,0x50,0x10,0x12,0x54,0x45,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52, +0x12,0x93,0x6b,0xd2,0x3, 0xb, 0xf0,0x12,0x52,0x66,0x38,0x80,0x30,0x3, 0x37,0x6c, +0xff,0x80,0x20,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x58,0x12,0x54, +0x4e,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x54, +0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdb,0x75,0x1d,0x0, 0x7e,0x34,0x62,0xe, 0x12, +0x23,0x9e,0x7a,0x37,0x37,0xf3,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, 0xac,0x67,0xb, +0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x37,0xff,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x37,0x37,0xf3,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93,0xa, 0x3b,0xbe, +0x37,0x37,0xfd,0x38,0x40,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37,0x38,0x3c,0x38, +0x34,0x90,0x60,0x51,0x12,0x54,0x33,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, +0x24,0x90,0x60,0x50,0x12,0x54,0x33,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, +0x14,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x54,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf4,0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0xa2,0x3, 0x92,0x10,0x12, +0x56,0xe9,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xb, 0x70,0x1b,0x7e, +0xb3,0x28,0xa8,0x70,0x15,0x12,0xc1,0x7, 0x68,0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0, +0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x51,0x5f,0x22,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0xd5,0x26,0xfa,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x7c,0xbd, +0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f, +0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0, +0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, +0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38, +0xc9,0xa2,0x4, 0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28,0x99, +0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73, +0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f, +0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, +0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x55,0xa6,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3, +0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e, +0xb3,0x26,0x83,0x70,0x40,0x12,0x8f,0xe3,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x55,0xa6,0x49,0x2, +0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49, +0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, +0xf0,0xbc,0x7f,0x38,0xc9,0x12,0xb1,0x64,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28, +0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28, +0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x55,0xaf,0x49,0x25, +0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x0, 0xbe,0x37,0x28,0x9d,0x8, +0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdc,0x6c, +0xff,0x80,0x9, 0x12,0x55,0xaf,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf2,0xda,0x79,0xda,0xd8,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0x7c, +0xbf,0x12,0x37,0x6f,0x74,0x2, 0xac,0xbf,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f, +0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c,0xcc, +0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c, +0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14, +0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12, +0x20,0xde,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a, +0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1c,0x75,0x26,0x0, +0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56,0xd3,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf1,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xdf,0x7c,0xec, +0x80,0x23,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80,0xa, 0x12,0x91,0xd5, +0x70,0xd, 0x12,0x56,0xd3,0xb, 0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5, +0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd8,0x1a,0x3c,0xb, 0x34,0x7c,0xe7, +0x80,0x1c,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56, +0xd3,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf1,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73, +0x2a,0x6e,0xbc,0x7e,0x18,0xdc,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x21,0x75,0x26, +0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xa, 0x12,0x91,0xd5,0x70,0xd, 0x12,0x56,0xd3,0xb, +0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e, +0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd7,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, +0xda,0x3b,0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35,0x24,0x22,0x12,0x57, +0x32,0x12,0x51,0x9f,0x7a,0xb3,0x2a,0xc, 0x22,0x30,0x10,0x13,0x12,0xc0,0xf7,0x68, +0x6, 0x7e,0xb3,0x39,0xb, 0x60,0x8, 0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x37,0xfb,0x22, +0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f, +0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x54,0x52,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76, +0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9, +0xc3,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34,0xa2,0x6c,0x33,0x80,0x3d,0x7e, +0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc, +0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32, +0x12,0x35,0x67,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3, +0x34,0xa2,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf, +0x2, 0x57,0x83,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac, +0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c, +0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26, +0xfb,0xa, 0x28,0xa, 0x31,0x12,0x35,0x67,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x35, +0x67,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0, +0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3e,0xbe,0xb0,0x0, 0x28,0x12,0x14, +0x7a,0xb3,0x35,0x3e,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2a, +0x5a,0x7e,0xb3,0x36,0xec,0x70,0x58,0x7e,0xb3,0x39,0xb, 0x70,0x52,0x7e,0xb3,0x36, +0x71,0x70,0x4c,0x7e,0x37,0x37,0xfd,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28, +0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f, +0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3, +0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, +0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x35,0x3e,0xda, +0xf8,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e,0x7e,0xf3,0x2a,0x6d,0xac,0xf7, +0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x20,0xde,0x7e,0xb3,0x37,0xb7, +0xb4,0x1, 0x64,0x7e,0x73,0x37,0xb8,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c, +0x12,0x26,0x57,0x12,0x28,0x62,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49, +0x33,0xd, 0xc8,0x12,0x21,0x0, 0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14, +0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34, +0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xb8, +0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, +0xd, 0xc8,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0x4, 0xe4,0x2, 0x58,0xe8,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0x12,0x68,0x10,0x12,0x7d,0x94,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0x74,0x12,0xb6,0xb8, +0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x91,0x18,0x12,0x47,0x2c, +0x12,0x28,0x62,0x50,0xde,0x12,0xab,0xb8,0x12,0x75,0xe9,0x7e,0xb3,0x37,0x5, 0xb4, +0x1, 0x4, 0xe4,0x12,0x58,0xe8,0x12,0xaf,0x66,0x12,0xa7,0xbd,0x12,0x5e,0xaa,0x40, +0xc2,0x12,0x88,0x5f,0x12,0x5e,0xaa,0x40,0xba,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x0, 0x6e,0x12,0x5f,0x2f,0x12,0x5f,0x83,0x12,0x5b,0x94,0x12,0x96,0x24,0x12,0x5e, +0xc2,0x12,0x5f,0xcd,0x12,0xaa,0xc3,0x12,0x87,0x74,0x7e,0xb3,0x36,0xf1,0xbe,0xb0, +0x88,0x68,0x3, 0x12,0x59,0x77,0x12,0x67,0xfa,0x12,0x26,0x66,0x12,0x62,0xa5,0x80, +0x82,0x12,0x2f,0xee,0x2, 0x58,0xdc,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x12,0x35, +0xd3,0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, +0x7e,0xb3,0x2a,0x7, 0x70,0x8, 0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0x61,0x6b,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x28,0x80,0x4, 0x7e,0x68,0x32,0xea,0x7f,0x6, 0x12,0x7e,0xef, +0x7e,0x73,0x2a,0x4, 0x7a,0x6b,0x70,0x6c,0xdd,0x61,0x1c,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x5e,0x3d,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x61,0x1a,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x61,0x1a,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x9e,0xec,0x50,0x2, 0x61,0x1a,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3, +0x2a,0x9, 0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xd6,0x6d,0x22,0x74,0x1, 0x12,0x7f,0xd4,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xe0,0x6d,0x22,0x74,0x10,0x12,0x7f,0xd4,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xd6,0xf5,0x25,0x9, 0xb3,0x32,0xe0,0xf5,0x26,0xa, 0x3c,0x12,0x5e, +0x3d,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xd6,0x19,0xb3,0x32,0xe0,0x12, +0x35,0xd3,0x7e,0xb3,0x2a,0x64,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd, +0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac, +0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x2c,0x75,0x27, +0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x6a,0x54,0xf, +0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x66,0x49,0xa3,0x33,0x68,0x80,0xc, 0x5, 0x27, +0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, 0xff,0x5e,0xa4, +0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5, +0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0, +0xe5,0x28,0xa, 0x5b,0x12,0xb9,0x3c,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e, +0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13, +0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26, +0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x4d, +0xbc,0x7d,0x28,0x2, 0x21,0xbb,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x31, +0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38, +0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0xa, 0xb2,0xe, 0x12,0x7e,0x81,0x74,0x1, 0x12,0x58, +0xe8,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x5e,0x61,0xe4,0x7a,0xb3,0x2a, +0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, 0xe4,0x12,0x58,0xe8,0x12, +0x5f,0xc2,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x66,0x12,0x20,0xb9,0x1b, +0xfd,0x4c,0xff,0x78,0xc, 0x12,0x73,0xe5,0x7e,0x8, 0x33,0x66,0x74,0xff,0x12,0x20, +0xde,0xda,0x3b,0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70, +0xff,0x12,0x5e,0x8b,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f, +0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe2,0x7e,0x73,0x2a,0x2, +0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x2, 0xa1,0xab,0x6c,0xaa,0x80,0x10, +0x7e,0x44,0x7f,0xff,0x12,0x5e,0x95,0x79,0x40,0x0, 0x14,0x12,0x5e,0x45,0xb, 0xa0, +0x12,0x5e,0x25,0x38,0xeb,0xa1,0xab,0x7e,0xb3,0x34,0x4f,0x70,0x3d,0xbe,0x70,0x0, +0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12, +0x5e,0x95,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30, +0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0, +0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xce,0xa1,0xab,0x6c,0xaa,0x80,0x17,0x12,0x5e, +0x57,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe4,0x6c,0xaa,0x80,0x41,0x6c,0xff, +0x80,0x36,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe, +0x34,0x7f,0xff,0x68,0x21,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x18,0x12,0x5e, +0x35,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x5e,0x4e, +0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xc5,0xb, 0xa0,0x7e, +0xb3,0x34,0x4f,0xbc,0xba,0x38,0xb7,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x9, 0xb3,0x1f, +0x46,0xb4,0xff,0x1d,0x6c,0xff,0x80,0x14,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x9, 0x12,0x5e,0x4e,0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38, +0xe7,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xd3,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac, +0x7a,0x49,0x43,0x28,0xae,0x12,0x5e,0x35,0x59,0x42,0x15,0x76,0x49,0x33,0x28,0xb0, +0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xde,0x7e,0x34, +0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e,0x7e,0x73, +0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80, +0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0x12,0x5e,0x2d,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x5e,0x8b,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x5e,0x45,0xb, 0xa0,0x7e,0x63,0x2a,0x2, 0xbc,0x6a, +0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68, +0x13,0x12,0x5e,0x57,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c, +0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x7e,0xf3,0x2a,0x2, 0x7a, +0xf3,0x34,0x4f,0x6c,0xaa,0x80,0x66,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2b, +0x12,0x5e,0x9f,0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0xa, 0x3a,0x2d,0x3d, +0x7d,0x2c,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x2e, +0xa5,0xbb,0x0, 0x2a,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x23,0x12,0x5e,0x9f,0xbe,0xb0, +0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30, +0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0xa, 0x3a, +0x2d,0x3d,0x7d,0x2c,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0x12,0x5e,0x25, +0x38,0x95,0xda,0xf8,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0x90,0x60,0x99, +0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0xb0,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40,0x0, 0x28,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x22,0x6c,0xaa,0x80,0x20,0x74,0x3, 0x12,0xa9,0x76,0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0xa, 0x12,0x5e,0x57,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79, +0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x22,0x7e,0x50,0x9, 0xac,0x5a, +0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, +0x3a,0x2d,0x3d,0x7d,0x2c,0x29,0xb1,0x0, 0xa, 0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91, +0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x9b,0xdf,0x28,0x2, 0xd2,0x3, 0xa2, +0x3, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x3, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x5f,0xc2,0xca,0x59,0x7e,0x18,0x28, +0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xb9,0x1b,0xfd,0x90,0x61,0x35,0xe4,0x93,0xbe, +0xb0,0x0, 0x28,0x28,0x6c,0xff,0x80,0x1f,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae, +0x12,0x80,0x16,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12, +0x64,0xdb,0x12,0xab,0x78,0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xdc,0xda,0xf8,0x22,0x2, +0x5f,0x32,0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe, +0x12,0x37,0x6f,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x23,0x7e,0xc4, +0x0, 0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0xb, +0xf0,0xb, 0xe0,0x12,0x9c,0xf6,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, +0xda,0x79,0x22,0x12,0x9d,0xda,0x2, 0x5f,0x89,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, +0x38,0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x35,0x40, +0x28,0x14,0x7e,0xb3,0x35,0x40,0x4, 0x7a,0xb3,0x35,0x40,0x7a,0xa3,0x2a,0x2, 0x80, +0x5, 0xe4,0x7a,0xb3,0x35,0x40,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a, +0xb, 0x22,0x90,0x60,0x99,0xe4,0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x12,0x68,0x38, +0x2, 0x5f,0xd3,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x34,0xa2,0x4c,0xaa,0x78, +0x3, 0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x34,0xad,0x7e, +0x73,0x34,0xae,0xbe,0x73,0x34,0xad,0x28,0x4, 0x7a,0x73,0x34,0xad,0x22,0xff,0xff, +0x70,0x8f,0x0, 0xff,0x51,0xae,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x37,0x31,0x1, 0xc3,0x1, 0x34,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x10,0xef,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0x18,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xd, 0xc, 0xb, 0xa, 0x9, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x11,0x12,0x13,0x14,0x18,0x17,0xc, 0xd, 0xe, 0xf, 0x15, +0x16,0x10,0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x3d,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x4, 0x5d,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x69,0x40,0xd, 0x18,0x25,0x17,0x25,0x6, 0x80,0x17,0x25,0x6, +0x80,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x32,0x32,0x1, 0xd8,0x1, 0xec,0x0, +0xe1,0x0, 0xe1,0x5, 0x0, 0x37,0x37,0x1, 0xae,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0x96,0x1, 0x18,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, 0x68,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15,0x0, 0x1, 0x54,0x1, 0x0, 0x10, +0x1, 0x51,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0x10,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x3d,0x2, 0x5d,0x69,0x20,0x26,0x3, 0x52,0x59,0x20,0x34, +0x2, 0x5a,0x64,0x20,0x46,0x2, 0x47,0x49,0x30,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, +0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x4, 0x5, 0x25, +0x26,0x27,0x28,0x29,0x4, 0x0, 0xd2,0x2, 0x30,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x0, 0x78,0x0, 0x78,0x14,0x8, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, 0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x8, 0x37,0xf3,0x12,0x62,0xdf,0x7e,0x8, 0x37,0xfb, +0x12,0x62,0xdf,0x12,0x62,0xf4,0x12,0x62,0xfb,0x2, 0x62,0xbc,0x7e,0x37,0x37,0xf3, +0xbe,0x34,0x0, 0x0, 0x28,0x18,0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x50,0xf, 0x7e, +0xb3,0x37,0x31,0x70,0x9, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0x22,0xb, +0xa, 0x30,0xe5,0x4e,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33, +0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x2b,0xb7,0x2, 0x62,0xdf,0x7e,0x8, 0x38,0xe6,0x2, +0x62,0xdf,0x6d,0x33,0x7a,0x37,0x38,0x83,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e, +0xb3,0x2a,0x3, 0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28, +0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68, +0x17,0x7e,0x47,0x2b,0xb7,0x4d,0x44,0x78,0xf, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3, +0x38,0x85,0x7a,0xb3,0x37,0x6, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e, +0x37,0x2b,0xb7,0x7a,0x37,0x2f,0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37, +0x2b,0xb7,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37, +0x2f,0x98,0x7e,0x27,0x2f,0x9a,0x12,0x64,0x1a,0x81,0x13,0x80,0x0, 0x12,0xbd,0xbd, +0x81,0x13,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57, +0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xbd,0x58,0x12,0x64,0x16,0x74, +0x1, 0x7a,0xb3,0x2f,0x80,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88, +0x9e,0x27,0x2f,0x90,0x7e,0x14,0x62,0x8a,0x12,0x64,0xd3,0xbd,0x23,0x38,0x13,0x7e, +0x27,0x2f,0x96,0x9e,0x27,0x2f,0x8e,0x7e,0x14,0x62,0x8c,0x12,0x64,0xd3,0xbd,0x23, +0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a, +0xc7,0x2f,0x98,0x7a,0xd7,0x2f,0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d, +0x2d,0x7e,0x17,0x2b,0xbb,0x7e,0x7, 0x2b,0xbd,0x12,0x66,0xce,0xa, 0x2b,0x7e,0x73, +0x2f,0x7f,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0x64,0x16,0x7a,0xc7,0x2b,0xbb,0x7a, +0xd7,0x2b,0xbd,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24, +0x12,0x67,0xca,0x7d,0x31,0x12,0x85,0xfd,0x2, 0x64,0x2b,0x7e,0x3, 0x2f,0xa8,0xbe, +0x0, 0xf0,0x50,0x2, 0x81,0xc4,0x81,0xb9,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0, +0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34, +0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b, +0xc1,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0x66,0xce,0x7c,0x1b,0x7e,0x3, +0x2f,0x7f,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b, +0xbf,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x1f,0x8c,0x7e,0x34,0x1f,0x34,0x7e,0x30, +0x4, 0xac,0x39,0x2e,0x14,0x2b,0xbf,0x74,0x4, 0x12,0x1f,0x8c,0xb, 0x80,0x7e,0x3, +0x2f,0xa8,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8, +0x7e,0x3, 0x2f,0x7f,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec, +0x40,0x2, 0x81,0x38,0x22,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e, +0x14,0x61,0x49,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e, +0x14,0x61,0x43,0x12,0x83,0x62,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22, +0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83, +0x2a,0x70,0x12,0x87,0xd4,0xbe,0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d, +0x2e,0x7e,0x14,0x61,0x47,0x12,0x64,0xd3,0x12,0x66,0x10,0x90,0x61,0x45,0x12,0x66, +0x7, 0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0x12,0xc1,0x17,0xbe,0xa0,0x0, 0x28, +0x32,0x7d,0x14,0x9e,0x14,0x0, 0x3f,0xbd,0x1e,0x38,0x13,0x12,0x66,0xb8,0x40,0xe, +0x12,0x64,0xc5,0x12,0x65,0xfa,0x48,0x32,0x7f,0x10,0x1b,0x1c,0x80,0x2c,0x12,0x66, +0xb8,0x50,0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x64,0xcb,0x12,0x66,0x10,0x7d, +0x1f,0x80,0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x66,0xb1,0xbd,0x5e,0x38,0x16,0x12,0x64, +0xc5,0x12,0x65,0xfa,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10, +0x6d,0x0, 0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x66,0xb1,0xbd,0x5e,0x28, +0x68,0x7d,0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d, +0x35,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d, +0x22,0x7e,0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1e,0xfc,0x12, +0x66,0x14,0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, +0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x66,0x7, +0x58,0x4, 0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76, +0x7c,0x65,0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x36,0x69,0x7a, +0x73,0x36,0xdf,0x7e,0x27,0x38,0xd6,0x7e,0x14,0x61,0xc8,0x12,0x64,0xd3,0x1e,0x34, +0xbd,0x32,0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x14,0x61,0xc8,0x12,0x64, +0xd3,0xbd,0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x36,0x67,0x12,0x67,0x62,0x7e,0x37,0x36, +0x6f,0xbd,0x32,0x50,0x4, 0x7a,0x27,0x36,0x6f,0x12,0xc0,0xef,0x38,0xa, 0x12,0x8f, +0xf3,0x38,0x5, 0x12,0x8f,0xeb,0x28,0x3d,0x12,0x67,0x69,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x36,0x67,0x4, 0x7a, +0xb3,0x36,0x67,0x7e,0x73,0x36,0x67,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3, +0x36,0x67,0x12,0xc0,0x6b,0x7a,0xb3,0x36,0xdc,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x67, +0x7d,0x32,0x2, 0xad,0x89,0x2, 0x66,0xa8,0x12,0x67,0xc0,0xe4,0x7a,0xb3,0x36,0x75, +0x22,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4, +0x60,0xd1,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0xbd,0x1e,0x22,0x7d,0x51, +0x7d,0x12,0x9d,0x35,0x12,0x21,0x0, 0x7c,0xa7,0x12,0x67,0xeb,0x7c,0xb7,0xbc,0xba, +0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x67,0x15,0x50, +0x21,0x7e,0x54,0x62,0x5a,0x12,0x67,0x15,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x64, +0xd3,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x5e,0x12,0x64,0xd3,0xbd,0x32,0x28,0x2, +0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12, +0x66,0x1b,0x2, 0x67,0x25,0x7e,0xb3,0x36,0x69,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36, +0x71,0x7e,0xb3,0x36,0xdf,0x70,0x3, 0x12,0xaf,0xc, 0x7e,0xb3,0x36,0x71,0xb4,0x1, +0xc, 0x74,0x3, 0x12,0x67,0x59,0x12,0x23,0x9e,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x67, +0x59,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x34,0xae,0x7e,0x34,0x61, +0x5b,0x22,0x74,0x2, 0x7a,0xb3,0x36,0x69,0x22,0x7e,0xb3,0x36,0x75,0xb4,0x1, 0x3, +0x2, 0x67,0x62,0x7e,0xb3,0x36,0xdb,0x4, 0x7a,0xb3,0x36,0xdb,0x7e,0xb3,0x36,0x69, +0xb4,0x2, 0x18,0x7e,0xb3,0x36,0xda,0x4, 0x7a,0xb3,0x36,0xda,0xb4,0x1, 0x6, 0x74, +0x1, 0x7a,0xb3,0x36,0xdb,0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x73,0x36,0xda,0xbe, +0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x75,0x12,0x67,0x62,0x12,0xaf,0xc, +0x12,0x67,0xc0,0x7e,0x73,0x36,0xdb,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x67,0xc0,0x22, +0xe4,0x7a,0xb3,0x36,0xdb,0x7a,0xb3,0x36,0xda,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0, +0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xbf,0x12,0x67,0xf2,0x59,0x25,0x2b, +0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a,0xb3,0x2f,0xa8,0x22,0x7d,0x31,0x9d,0x30,0x2, +0x21,0x0, 0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x73,0x28,0x93,0x7a,0x73, +0x28,0x94,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22, +0x12,0xc0,0x5, 0x12,0x63,0x2, 0x7a,0x37,0x39,0x4, 0x12,0x69,0x87,0x12,0x28,0x48, +0x2, 0x68,0x23,0x12,0x69,0x84,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3, +0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca,0x79,0x7e,0x13,0x2a,0x2, 0x7e,0x78, +0x29,0xbc,0x12,0x69,0x84,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0x19, +0x7e,0xa0,0x5, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12, +0x68,0x23,0x21,0x6d,0xbc,0x20,0x50,0x3, 0x12,0x68,0x23,0x6c,0x0, 0x21,0x62,0x7e, +0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x21,0x60,0xa, +0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x21,0x43,0x12, +0x69,0x7a,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x21,0x0, 0x7d,0xd3,0x7e,0x70,0x4, +0xac,0x79,0x49,0x23,0x35,0x43,0x12,0x69,0x70,0x9d,0x32,0x12,0x21,0x0, 0x7d,0xc3, +0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x69, +0x7a,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x43,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28, +0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, 0x7a,0xb3,0x34,0x89, +0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3, +0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80,0x53,0x7e,0x50,0x9, +0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x35,0x41,0x49, +0x22,0x29,0xa, 0x59,0x27,0x35,0x43,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x34,0x88,0x80, +0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34, +0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, +0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x41,0x12,0x69,0x70,0x59,0x32,0x35,0x43, +0xb, 0x0, 0x90,0x60,0x99,0xe4,0x93,0xbc,0xb0,0x28,0x2, 0x1, 0x6f,0xda,0x79,0x22, +0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x41,0x22,0xa2,0x8, 0x22,0x7e,0x34,0xd, 0xac,0x12,0x26,0x5b,0x12,0x7a, +0x2d,0x12,0x69,0xab,0x2, 0x69,0x97,0x30,0xf, 0x10,0x12,0x6e,0x8f,0x50,0x3, 0x12, +0x6f,0x6e,0x12,0x6a,0x50,0x12,0x69,0xd1,0xc2,0xf, 0x22,0x7e,0xb3,0x2b,0x1e,0x70, +0x1f,0x12,0x26,0x57,0x12,0x2f,0xf4,0x50,0xfb,0x12,0x6a,0x50,0x12,0x88,0x17,0x20, +0xf, 0x3, 0x12,0x69,0xd1,0x74,0x2, 0x7a,0xb3,0x2b,0x1e,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12, +0x87,0x56,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0xc0,0xa2,0xf5,0x2a, +0x7e,0x73,0x2b,0xf, 0xbe,0x71,0x2a,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x91,0x67,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x44,0x6d,0x22,0x7a,0x1f,0x37,0x40,0x7c,0xbc,0x12,0x6c,0x20,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x62,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x6d,0x13,0xda,0x3b,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12, +0xbf,0xfb,0x7a,0x55,0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d, +0x7f,0x3, 0x7e,0x1d,0x2a,0x12,0x79,0x7a,0x12,0xc0,0x75,0x12,0xc0,0x22,0x75,0x2e, +0x0, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0xc0,0xff,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6a,0xd4,0x12,0xb3,0x5f,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x30,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12, +0x7b,0x20,0x7e,0x35,0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30, +0x38,0xdc,0x5, 0x2e,0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b, +0x1d,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x6d,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d, +0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x6e,0x8f,0x50,0x7c,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x6e,0x12,0x6b,0xff,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x8, 0x12,0x6d,0x34,0x38,0xea,0x6c,0xcc,0x80,0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a, +0x12,0x6b,0xff,0x75,0x3b,0x0, 0x80,0x27,0x7e,0xb3,0x37,0xb1,0xbe,0xb1,0x3b,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x60,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x62,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e, +0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12,0xc0,0x90,0x68,0xb, 0x7e,0x34,0x10, +0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x50,0x12, +0x6c,0x8, 0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70, +0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a, +0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, +0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x7f,0x78,0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe, +0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x6b,0xf6,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d, +0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80, +0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x35,0x7a,0x37,0x25,0xba,0x7e,0x35, +0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12, +0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25, +0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac, +0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37, +0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22, +0xca,0x3b,0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b, +0xf, 0xf5,0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xb9, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x60,0x7e,0x8, 0x25,0x2a, +0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbc,0x12,0xb3,0x2a,0x74,0x1, 0x7a,0xb3,0x2b,0x1d, +0x74,0x5, 0xac,0xbc,0x12,0xc0,0x19,0x74,0x5, 0xac,0xbc,0x12,0x6f,0xff,0x74,0x5, +0xac,0xbc,0x12,0xc0,0x10,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0xc2,0x3, 0x12,0xc0,0xa2,0x12,0x6d, +0x13,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, +0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x6a,0xd4,0x12, +0xbf,0xfb,0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xa8,0xef,0x12, +0xa9,0xa6,0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3, +0x2b,0x14,0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39, +0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, +0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd, +0xda,0x3b,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6e,0x29,0x30,0xc, 0xa, 0x12,0xae,0xfa, +0x30,0x3, 0x4, 0xe4,0x12,0xa, 0x66,0x30,0x3, 0x9, 0x12,0xae,0xaf,0x12,0x8d,0xef, +0x2, 0x8c,0x90,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f, +0x50,0x7e,0x14,0x22,0xe2,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x7a,0x1d,0x2c,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f, +0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c,0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x34,0x6c, +0xcc,0x80,0x4f,0x12,0x6e,0x19,0x40,0x48,0x12,0x6e,0xf, 0x50,0x43,0x74,0x2, 0xac, +0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x0, 0x7d,0x3, 0x7d, +0x31,0x12,0x21,0x0, 0xbd,0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e, +0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d, +0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34, +0xb, 0xc0,0x12,0x6d,0x34,0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12, +0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, +0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12, +0x6e,0x19,0x40,0x8, 0x12,0x6e,0xf, 0x50,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x12,0x6d, +0x34,0x38,0xec,0xb, 0xd0,0xbe,0xd0,0x3, 0x50,0x2, 0xa1,0x68,0xda,0x3b,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xb9,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x12,0x6e,0xa0,0x7a,0x37,0x2b,0x1b, +0x22,0x7e,0xa3,0x0, 0x4f,0xbe,0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xec,0x68,0x42, +0x74,0x5, 0xa4,0x12,0xc0,0x99,0x12,0x6e,0x83,0x12,0xc0,0x19,0x12,0x6e,0x83,0x12, +0xc0,0x10,0x12,0x6e,0x8f,0x50,0x9, 0x7e,0xb3,0x0, 0x4f,0x12,0xb3,0x2a,0x80,0x6, +0x12,0x6e,0x83,0x12,0x6f,0xff,0x12,0x6e,0x29,0x12,0x6f,0xf8,0x7e,0x73,0x2b,0x14, +0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x4f,0x7a,0x73, +0x3, 0xec,0x22,0x7e,0xa3,0x0, 0x4f,0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x20,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xb2,0x70,0x2, 0xc3,0x22,0xd3,0x22, +0x7e,0x23,0x2b,0xf, 0x7e,0x33,0x37,0xcd,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x0, 0xac,0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, +0xa, 0x7e,0x63,0x2b,0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe, +0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61, +0x1b,0xe4,0x93,0x7c,0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73, +0x2b,0x10,0x80,0x9, 0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b, +0x10,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c, +0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x38,0xc0,0x69,0x51,0x0, +0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d, +0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, +0x1f,0x58,0x7e,0xb, 0x70,0x7a,0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b, +0x62,0x29,0x70,0x0, 0x1, 0x7a,0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b, +0x20,0x12,0x6e,0x29,0x12,0x6f,0xf8,0xd2,0x3, 0xc2,0x4, 0x2, 0x48,0xf4,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x4f,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6f,0xea,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0xc0,0x56,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0xc0, +0x4b,0x12,0x20,0xb9,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6f,0xea,0xca,0x39,0x7e, +0x23,0x0, 0x4f,0x7e,0x30,0x38,0xac,0x23,0x12,0xc0,0x56,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x8c,0xac,0x23,0x12, +0xc0,0x4b,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6f,0x42,0x7e,0x34,0x0, 0x38,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x3, 0x8b,0x9, +0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0x7e,0x37,0x3, 0xed,0xb, 0x34,0x7a,0x37, +0x3, 0xed,0x7e,0x37,0x3, 0xef,0xbe,0x37,0x3, 0xed,0x28,0x3, 0x2, 0x70,0x23,0x22, +0x2, 0x70,0x8, 0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x70,0x20,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b, +0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e, +0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a,0xb3,0x2b,0x74,0x7a,0xb3,0x2b, +0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x25,0xee,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2, +0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93, +0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74,0xbc,0x7e,0x28, +0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3,0x2a,0x6e,0x7a, +0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3,0x2a,0x74,0x90, +0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9,0xe4,0x93,0xa, +0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a,0xa, 0x3e,0x9d, +0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a,0x78,0x90,0x60, +0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f,0xca,0x39, +0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12,0x20,0xb9,0x1b, +0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x2b,0x21,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x72,0x92,0x12,0x79,0x31,0x90,0x60, +0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76,0x12,0x70,0x59, +0x74,0x1, 0x12,0x3d,0xac,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x2, 0x12,0x73, +0xf1,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a,0xb3,0x2b,0x4, +0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0x9e,0x7a,0x37,0x2b, +0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x9, 0x7e, +0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a,0xb3,0x2b,0x62, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4,0x93,0x7a,0xb3, +0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x2b, +0xf, 0x12,0x6e,0x29,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61, +0x22,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12, +0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3, +0x2b,0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61, +0x20,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b, +0x14,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d, +0x7a,0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64, +0xe4,0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61, +0x7e,0x34,0x20,0x5b,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x12,0xc0,0xab,0x12,0x72,0xf4,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x72,0xdb,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x72,0xdb,0xa, +0x1b,0x2e,0x14,0x2a,0x7c,0x12,0x72,0xe8,0xe5,0x25,0x12,0x72,0xdf,0xa, 0x1b,0x2e, +0x14,0x2b,0x23,0x12,0x72,0xe8,0xe5,0x24,0x2, 0x20,0xde,0x7e,0x34,0x0, 0x2, 0x12, +0x20,0xde,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, +0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a, +0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x73,0x20,0x38,0xef,0x12,0x73,0x20,0x68,0x7, +0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22, +0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x12,0x77,0xfd,0x12,0x70,0xa7,0x12,0x0, +0xa, 0x12,0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8, +0x7e,0x1f,0x6, 0xf4,0x12,0x79,0x9d,0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e, +0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12, +0x79,0x7a,0x12,0x79,0x2e,0x12,0x25,0x45,0x12,0x73,0xa7,0x12,0x73,0x7f,0x2, 0x73, +0x71,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x12, +0x73,0xe5,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, 0x28,0xae,0x74,0xff,0x12,0x20, +0xde,0x12,0x9f,0xe3,0x7e,0x8, 0x29,0xbc,0x12,0x5e,0x61,0x7e,0x8, 0x2a,0x2, 0x7e, +0x34,0x0, 0xb, 0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4, +0x12,0x20,0xde,0x90,0x60,0x9c,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74, +0xff,0x12,0x20,0xde,0x90,0x60,0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26, +0xb4,0x74,0xff,0x12,0x20,0xde,0x90,0x60,0x9a,0x12,0x73,0xe8,0x7e,0x8, 0x27,0x76, +0x74,0xff,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78, +0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc, +0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, +0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80, +0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73, +0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d, +0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a, +0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26, +0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x75,0xb2, +0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d, +0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53, +0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x75,0x9f,0xb, +0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80, +0x19,0x12,0x75,0xa8,0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58, +0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3, +0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x75,0x97,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12, +0x75,0xb2,0xb, 0x6a,0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d, +0x2d,0x7e,0x67,0x2a,0x51,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, +0x90,0x12,0x75,0x9f,0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, +0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x75,0xa8,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c, +0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12, +0x74,0x3c,0x38,0xab,0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, +0x12,0x75,0x97,0x2d,0x15,0x6c,0xaa,0x80,0xe, 0x12,0xa5,0xe4,0xb, 0x7a,0x90,0xbd, +0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xed,0x7a,0xb7,0x8, 0x4, +0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32, +0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e, +0x74,0x62,0x10,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d, +0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31, +0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0xa6, +0x56,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x75,0x97,0x7e,0xd, 0x24,0x2d,0x15,0x7f, +0x13,0x2d,0x35,0x12,0x6d,0x3b,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a, +0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x75,0xbc,0x7e,0x37,0x28, +0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x75, +0xbc,0x12,0x76,0x2b,0x12,0xa7,0x45,0x2, 0x76,0x1a,0xe4,0x7a,0xb3,0x3, 0xff,0x7e, +0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x3, 0xff,0x22,0xca,0x3b,0x7e,0xf3,0x2a, +0x6e,0x12,0xc0,0xb4,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, +0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0xa7,0xcd,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda, +0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0xbb,0x95,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, +0xf8,0x12,0x3f,0xf2,0x12,0x76,0x9a,0x12,0x74,0x43,0x7e,0xb3,0x16,0x90,0xb4,0x1, +0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26, +0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x20, +0xde,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26, +0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0xbf,0xeb, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0xbf,0xc7, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x86,0x12,0xc0, +0x40,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x89,0x12,0xc0, +0x40,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3, +0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0xbf,0xeb,0x7e,0x50,0x1, 0x12,0x77,0x60,0x7a, +0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0xbf,0xc7,0x7e,0x50,0x1, 0x12,0x77,0x60, +0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22, +0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0, +0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4, +0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0, +0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, +0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c, +0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b, +0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f, +0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0xe4,0x7a,0xb3, +0x37,0x9c,0x7a,0xb3,0x37,0x9d,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0x9e,0x90,0x60, +0x51,0xe4,0x93,0x7a,0xb3,0x37,0x9f,0xe4,0x7a,0xb3,0x37,0xa0,0x90,0x60,0x99,0x93, +0x7a,0xb3,0x37,0xa1,0xe4,0x7a,0xb3,0x37,0xa2,0x7a,0xb3,0x37,0xa3,0x90,0x61,0xc4, +0x93,0x7a,0xb3,0x37,0xa5,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34, +0x7a,0x73,0x37,0xa9,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a, +0x73,0x37,0xaa,0x74,0x64,0x7a,0xb3,0x37,0xbb,0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3, +0x37,0xbc,0x90,0x61,0x17,0xe4,0x93,0x7a,0xb3,0x37,0xa8,0x90,0x61,0x19,0xe4,0x93, +0x7a,0xb3,0x37,0xbe,0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x37,0xbd,0x90,0x61,0x1d, +0xe4,0x93,0x7a,0xb3,0x37,0xbf,0x90,0x61,0x25,0xe4,0x93,0x7a,0xb3,0x37,0xba,0xe4, +0x7a,0xb3,0x37,0xb5,0x74,0xfa,0x7a,0xb3,0x37,0xb3,0x74,0x1e,0x7a,0xb3,0x37,0xb4, +0x74,0x1, 0x7a,0xb3,0x37,0xb2,0x74,0xc, 0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3, +0x37,0xb6,0xe4,0x7a,0xb3,0x37,0xb7,0x7a,0xb3,0x37,0xb8,0x7e,0x8, 0x37,0xc0,0x7e, +0x34,0x0, 0x2c,0x12,0x20,0xde,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0xa, 0x36,0x7a, +0x73,0x37,0xcb,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0x7a,0x73,0x37,0xcc,0x90,0x60, +0xd4,0x93,0x7a,0xb3,0x37,0xcd,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x37,0xce,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b, +0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xe9,0x74,0x1, 0x7a,0xb3,0x37,0xe0,0x7e,0x34,0x0, +0x28,0xca,0x39,0x7e,0x34,0x61,0xd5,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12, +0x20,0xb9,0x1b,0xfd,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0x2, 0x23, +0xa6,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x6d, +0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x20, +0xde,0x7f,0x6, 0x7d,0x3f,0x12,0x20,0xde,0x7a,0xb3,0x16,0x91,0x22,0x7f,0x70,0x7e, +0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c, +0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x20,0xde,0x7f,0x7, 0xa, +0x3a,0x2, 0x20,0xde,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15, +0x12,0x79,0x9d,0x12,0x3f,0xd2,0x7e,0xe0,0x1, 0x12,0x4f,0xaf,0x30,0x18,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x7b,0x29,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac, +0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15, +0x12,0x7b,0x20,0xb, 0xd0,0x7e,0x73,0x2a,0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, +0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c, +0xbf,0x2e,0x73,0x2a,0x73,0x12,0x7a,0x8e,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b, +0x2, 0x70,0x41,0x12,0x2f,0xf4,0x50,0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x7a,0x75, +0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x72,0x12,0x79,0xc4,0x74, +0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x7a,0x75,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f, +0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x79,0xc4,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4, +0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x3d,0xac,0x7c,0xba,0x12,0x13, +0xc7,0x74,0xa, 0x12,0x45,0x15,0x7c,0xb9,0x12,0x0, 0x1e,0x2, 0x4e,0xe7,0xca,0xd8, +0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0x7b,0xd0,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74, +0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11, +0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x1f,0x7, 0x1b,0x6a,0x30,0xb, 0xd0,0xbc, +0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3, +0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73,0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c, +0x7f,0x12,0x7a,0x8e,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12, +0x20,0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, 0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, +0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22, +0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, +0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x29,0x6f,0x7c,0xe7,0x80,0x5d,0x12,0x26,0x57, +0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x12,0x7b,0x29,0x6c,0xdd,0x80,0x3d, +0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, +0x1d,0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19, +0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x3f,0xb, 0xbe,0xb0, +0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x7b,0xb7, +0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa, +0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53,0x2a, +0x73,0xa, 0x25,0x2d,0x23,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22, +0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa, +0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38, +0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, +0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e, +0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x37,0xed,0x40,0x39,0x7e,0x37,0x37,0xed,0xb, 0x34,0x7a,0x37, +0x37,0xed,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x34,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x38,0xfb,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x70,0x5, 0x7e,0xb3,0x37,0x9c,0x22,0xbe,0xb0,0x3, 0x38,0x15, +0x75,0x1b,0x0, 0x30,0xe, 0x6, 0x7e,0x18,0x32,0xea,0x80,0x4, 0x7e,0x18,0x33,0x28, +0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e, +0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4, +0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xed,0x80,0x2, 0x15,0x1a,0x2, +0x7c,0x17,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x7d,0x61,0xbe,0xb0,0x80, +0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x61,0x22,0xb4,0xfc, +0x5, 0x7e,0xb3,0x37,0x8, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60, +0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x36,0x71,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22, +0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74,0xff,0x22,0x7c,0x7b,0x6c,0xaa,0x12, +0x3f,0xe1,0x78,0x9, 0x7c,0xb7,0x12,0x7c,0x64,0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, +0x7c,0xb7,0x12,0x37,0xeb,0x7c,0xab,0x7c,0xba,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5, +0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5, +0x1a,0x12,0x3f,0xb3,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12, +0x7c,0xfb,0xf5,0x91,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0, +0x82,0x12,0x7d,0x1a,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b, +0x32,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x37,0xf2,0x7e,0x73,0x37,0xf2,0xa, 0x27,0x2e, +0x24,0x0, 0x6, 0x12,0x51,0x4f,0x93,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x37,0xf2, +0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x37,0xf2,0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0x9b,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0x9b,0x7a, +0xa3,0x36,0xf2,0x22,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37,0x9c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, +0xe4,0x7a,0xb3,0x37,0x9c,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba, +0x12,0x7d,0xab,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3, +0x7c,0x7a,0x12,0x7e,0x45,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xdf,0x38, +0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x7e,0x21,0xa5,0xbb,0x8f,0x3, 0x75,0x19, +0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x44,0xc0,0x74,0x1, 0x7a,0xb3,0x33,0xff, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68,0x17,0x1b,0x61,0x68, +0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x36,0xe1,0xd2,0xd, 0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37, +0xef,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37, +0xef,0x15,0x1a,0x7e,0x27,0x37,0xef,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, +0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a,0xea, +0x22,0x7e,0xb3,0x37,0xf1,0x4, 0x7a,0xb3,0x37,0xf1,0xe5,0x19,0xb4,0x1, 0x8, 0xe4, +0x7a,0xb3,0x37,0xf1,0x75,0x19,0x0, 0x7e,0x73,0x37,0xf1,0x7a,0x73,0x36,0xf0,0x22, +0xe4,0x7a,0xb3,0x37,0x9c,0x7e,0x8, 0x32,0xea,0x12,0x7e,0xef,0x7e,0x8, 0x33,0x28, +0x7e,0x34,0x0, 0x3e,0x12,0x20,0xde,0x7e,0x18,0x32,0xea,0x7a,0x1d,0x14,0x12,0x7e, +0xd1,0x2, 0x7e,0xc4,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0x9c,0xf5,0x91, +0x22,0x2, 0x7e,0xd4,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e, +0x34,0x0, 0x3e,0x74,0xff,0x2, 0x20,0xde,0x7c,0xab,0x12,0x3f,0x52,0x7c,0xba,0x12, +0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x7f,0x67,0x49,0x35,0x34,0x3b,0x49,0x15, +0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40,0x15,0xbe, +0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12,0x7f,0x6f, +0x28,0xe, 0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, 0x80,0x2, +0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c, +0x7c,0xb9,0x12,0x31,0x27,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, +0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88,0x7f,0x10, +0x7f,0x4, 0x12,0x1e,0xeb,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x75, +0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b,0x2a,0x0, +0x1b,0x1a,0x10,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e, +0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12, +0x21,0x0, 0xe5,0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0, +0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e, +0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12,0x87,0xbc,0x90, +0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, +0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x87,0xd4,0xbe,0xc4, +0x0, 0x3f,0x38,0x1c,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61,0x3b,0x12,0x81, +0x2, 0x12,0x80,0xf1,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xee, +0x12,0x66,0xb1,0xbd,0x5c,0x38,0x21,0x7d,0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12, +0x81,0x2, 0x90,0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b, +0x7c,0x12,0x80,0xf9,0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b, +0x1b,0x54,0xbd,0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f, +0x80,0xa, 0x7d,0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x87,0xcc,0x7f, +0x17,0x12,0x1e,0xfc,0x7f,0x71,0x12,0x81,0x1c,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40, +0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d, +0x22,0x2f,0x71,0x12,0x80,0xf1,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, +0x90,0x61,0x3a,0xe4,0x93,0x12,0x80,0xf9,0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f, +0x22,0x90,0x61,0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d, +0x22,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d, +0x2e,0x7c,0x76,0x7c,0x65,0x7f,0x71,0x22,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65, +0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12, +0x9f,0x40,0x7d,0x3, 0x74,0x9, 0xac,0xbf,0x12,0x87,0xe5,0x49,0x35,0x28,0xae,0x12, +0x81,0xbf,0x12,0x81,0x18,0x7d,0x13,0x5e,0x30,0xfc,0x7e,0x70,0x9, 0xac,0x7f,0x49, +0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d, +0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34, +0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x12,0x81,0xb3,0x12,0x81, +0x18,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, +0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30, +0xda,0x79,0x22,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d, +0x32,0x12,0x21,0x0, 0x7d,0x13,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b,0x74, +0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3,0x49, +0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x81,0xbf,0x7d,0x3f,0x9d,0x35,0x12,0x21, +0x0, 0x9d,0x34,0x12,0x21,0x0, 0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0xf, 0x12,0x67,0xeb,0x7e,0x14,0x62,0x6a,0x12,0x87,0xee,0x50, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7, +0x2f,0x9e,0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7, +0x2f,0x9a,0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x81,0xc7, +0x70,0x2, 0x61,0x45,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70, +0x9, 0x7e,0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45, +0x7e,0x73,0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f, +0xa4,0x7e,0x17,0x2f,0xa6,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45,0x7e,0x34,0x62,0x72, +0x12,0x83,0x4a,0x28,0x4a,0x7e,0x34,0x62,0x70,0x12,0x83,0x54,0x50,0x41,0x7e,0xb3, +0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0x9e,0x12,0x83,0x5e,0x7d,0x8f, +0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0x87,0xc4,0x9d, +0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40,0x2, 0x61, +0x45,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7b,0x7e,0xf0,0x21,0x80,0x76,0x7e, +0x34,0x62,0x7a,0x12,0x83,0x54,0x28,0x6d,0x7e,0x34,0x62,0x78,0x12,0x83,0x4a,0x50, +0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62,0x7e,0x12,0x23,0x9e,0x12,0x83, +0x5e,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50,0x4a,0x7e,0x34,0x62,0x7c,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7,0x2f,0x82,0x28,0x37,0x7d,0xfb, +0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x26,0x12, +0x67,0xf2,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd,0x49,0x25,0x2b,0xab,0x49,0x5, +0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, 0x9d,0x32,0xbe,0x34,0x0, 0x10, +0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xf0,0xbd,0xfc,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xbd,0xfb,0x22,0x7e,0x14, +0x62,0x8e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22,0x12,0x86,0x69,0x7a,0x37,0x2f, +0x9c,0x12,0x85,0xf4,0x7a,0x37,0x2f,0x9e,0x12,0x82,0x16,0x60,0x1, 0x22,0x7e,0x73, +0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f,0x80,0x2, +0x83,0x92,0xca,0xf8,0x7e,0x45,0x24,0x7c,0xb9,0x7a,0xb3,0x38,0x3f,0x74,0xff,0x7a, +0xb3,0x38,0x3e,0x6d,0x55,0x80,0x19,0x7d,0xf5,0x3e,0xf4,0x12,0x86,0x74,0x7d,0xe5, +0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54, +0xbd,0x45,0x38,0xe3,0x7e,0x33,0x38,0x3f,0xbe,0x30,0x4, 0x38,0x2, 0x81,0x54,0x69, +0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e, +0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x40,0x7a,0xb3, +0x38,0x42,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f, +0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x38,0x42,0x7d,0xf, 0x2d,0xf, 0xbd, +0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x38,0x42,0xa, 0x37,0x6d,0x22,0x12, +0x1e,0xeb,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7a,0x73,0x38,0x42,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x84,0x73,0x12, +0xbf,0x1c,0x12,0x84,0x73,0x12,0x84,0x7c,0x12,0x84,0x73,0x12,0xa5,0x28,0x80,0xa, +0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x38,0x3e,0xe4,0x7a,0xb3,0x38,0x3f,0x7e, +0x73,0x39,0x1, 0xbe,0x73,0x38,0x3e,0x48,0x6, 0x7e,0xb3,0x38,0x40,0x80,0x1, 0xe4, +0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71, +0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a, +0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0xa1,0x9d,0x7e,0x90,0x2, 0xac,0x9a, +0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x26,0x7f,0x67,0x2d, +0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f, +0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a, +0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe, +0xf0,0x2, 0x58,0x2, 0xa1,0x9b,0xbe,0x60,0x0, 0x18,0x2, 0xa1,0x83,0xbe,0x70,0xec, +0x28,0x2, 0xa1,0xa7,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7, +0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x85,0xeb,0x19,0xba,0x22, +0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x85,0xeb,0x19,0xba,0x23,0xe4,0x9, 0xba, +0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7, +0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0x85, +0xeb,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12,0x85,0xe2,0x19,0xbd,0x22,0xf5,0xa, 0xd9, +0x12,0x85,0xe0,0x19,0xbd,0x23,0xe5,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe, +0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12, +0x85,0xe0,0x19,0xbd,0x22,0xf4,0xa, 0xc9,0xa, 0xd4,0x12,0x85,0xe0,0x19,0xbd,0x23, +0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f,0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, +0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23,0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x38, +0x3f,0xbc,0xba,0x28,0x2, 0x81,0x9b,0x7a,0x73,0x38,0x3f,0x7e,0xa0,0x1, 0x80,0x25, +0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d, +0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e, +0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x38,0x3f,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22, +0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c, +0xbd,0xa, 0xa7,0x22,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0x86,0x69,0x7a,0x37,0x2f,0xa0,0x12, +0x85,0xf4,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0x86,0x69,0x7a,0x37,0x2f, +0xa4,0x12,0x85,0xf4,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7c,0xab, +0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4,0x14, +0x78,0xfb,0x12,0x86,0x72,0x2d,0xfe,0x80,0xf, 0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x12,0x86,0x72,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a, +0xbd,0xf4,0x38,0xd0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61, +0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b, +0x7e,0x63,0x2a,0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10, +0x7d,0x21,0x12,0x87,0xdc,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34, +0x37,0x44,0x6d,0x22,0xe4,0x2, 0x86,0x7e,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b, +0x68,0x4f,0x12,0x87,0x56,0x7c,0x3b,0x7c,0xb2,0x12,0x87,0x56,0x7c,0xab,0xbe,0x30, +0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12, +0x91,0x67,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e, +0x34,0x16,0x93,0x6d,0x22,0x30,0x16,0x3, 0x2, 0x86,0xc7,0x7e,0xb3,0x2b,0x1d,0xb4, +0x1, 0xf, 0x12,0xbf,0xfb,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x86, +0x7e,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, +0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40, +0xe9,0x74,0xff,0x22,0x7e,0xb3,0x37,0x31,0x70,0x6, 0x12,0x87,0xad,0x2, 0x87,0xb6, +0x12,0x63,0x9, 0x12,0xbd,0x4d,0x50,0xa, 0x12,0x83,0x6a,0x7c,0x3b,0x12,0x87,0xad, +0x80,0x5, 0x12,0xbd,0xf4,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xbc,0xd1, +0x60,0xa, 0x7a,0x33,0x37,0x34,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4,0x7a,0xb3, +0x2f,0x80,0x22,0x2, 0x81,0x23,0xe4,0x7a,0xb3,0x38,0xdd,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x3e,0x24,0x7e,0xf, +0x38,0xd9,0x2d,0x12,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x32,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74,0x6, +0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x5, 0x7d,0x53,0xbe,0x54,0x0, 0xff, +0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x12,0x6e,0x8f,0x50,0x3, 0xd2,0xf, 0x22,0xc2, +0xf, 0x22,0x12,0xac,0xc6,0x12,0x88,0x2b,0x2, 0x88,0x17,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x20,0xde,0x12,0xaa,0x3e,0x12,0xaa,0x35,0xa9,0xd1,0xcb, +0x12,0xc0,0xff,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0xb4,0x4d,0x2, 0xd, 0x7, 0x12, +0x54,0x94,0x12,0x88,0xb9,0x12,0x8c,0xad,0x7e,0xb3,0x37,0x6, 0xb4,0x1, 0x1e,0x7e, +0x34,0x61,0xc0,0x12,0x87,0xcc,0x7e,0x24,0x0, 0x5, 0xad,0x12,0x7a,0x17,0x28,0xa1, +0x7e,0x14,0x61,0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39, +0x11,0x60,0x7, 0x14,0x7a,0xb3,0x39,0x11,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, +0x12,0x88,0x22,0x12,0x8c,0x90,0x12,0xb3,0xa9,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12, +0xbb,0x10,0x12,0xaa,0x47,0x2, 0x8d,0x10,0x22,0x7e,0x90,0x1, 0x7e,0xb3,0x2f,0xa9, +0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xa9,0x7e,0x34,0x61,0xc0,0x12,0x23, +0x9e,0x12,0xc0,0x87,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x12,0x8c,0x87,0xb, 0x1a, +0xf0,0x7e,0x34,0x61,0x4f,0x12,0x87,0xbc,0xe4,0x7a,0xb3,0x28,0xac,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x7e,0x34,0xff,0xfa,0xad,0x3f,0x12,0x8f,0xdc,0x7d,0xc3,0xe, 0xc4, +0x7e,0xe7,0x7, 0xfe,0xbd,0xe3,0x58,0x15,0x7e,0xe7,0x7, 0xfc,0xbd,0xec,0x58,0xd, +0x12,0x8a,0x7c,0x8, 0x8, 0x12,0x8b,0xe, 0x60,0x3, 0x12,0x8a,0x95,0x12,0x8b,0xe, +0xa, 0xeb,0x4d,0xee,0x68,0x3b,0x6d,0xee,0x9d,0xef,0xbe,0xe7,0x7, 0xfe,0x18,0x6, +0xbe,0xe7,0x7, 0xfc,0x8, 0x2b,0x12,0x8a,0x7c,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12, +0x21,0x0, 0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x8a,0x74,0x28,0x14,0x7e,0x83,0x28, +0x85,0xbe,0x80,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xcf,0x58,0x3, 0x12,0x8a, +0x95,0x12,0xad,0x5, 0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xc0,0xf7,0x68,0x6, +0x7e,0xb3,0x39,0xb, 0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x7d,0x12,0x8a,0x74, +0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0xad,0x43,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x12,0x8a,0xa6,0x7c,0x9b,0x80, +0x1a,0x7e,0xb3,0x26,0x84,0x70,0x14,0x7e,0xb3,0x26,0x85,0x70,0xe, 0x12,0x8a,0x74, +0x28,0x9, 0x7e,0x90,0x3, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0xc7,0x7, 0xfa,0xbe, +0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x8a,0x74,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7, +0x28,0x8e,0x58,0x8, 0x12,0x8a,0x87,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0x29,0x7e,0x14, +0x61,0xc0,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0x7e,0x14,0x61, +0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x12,0x0, 0x66,0x50,0xd, 0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x8f,0xe3,0x28,0x3, 0x12,0x8a,0x87,0x7e,0xc7,0x28,0x8a, +0xbd,0xcd,0x8, 0x19,0x12,0x9b,0xf, 0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28, +0x8e,0x58,0xa, 0x12,0x0, 0x66,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x8b,0x8e, +0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x2, 0x12,0xac,0x6d,0x7e,0xb3,0x2f,0xaa,0xbe, +0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xaa,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8c,0x7f,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0x6d,0xee,0x9e,0xe7, +0x2a,0x5a,0xbe,0xe7,0x28,0x8e,0x22,0xe4,0x7a,0xb3,0x2f,0xaa,0x7a,0xb3,0x28,0xac, +0x74,0x2, 0x2, 0x29,0xfa,0x74,0x2, 0x7a,0xb3,0x2f,0xaa,0xe4,0x7a,0xb3,0x2f,0xa9, +0x12,0x8c,0x7f,0x2, 0x29,0xfa,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x8c,0x87, +0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x8b,0x6, +0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e, +0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x4, +0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11, +0x7e,0x34,0xff,0xfd,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0, +0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x1e,0xb9,0xbd,0x34,0x22,0x6c,0x66, +0x90,0x60,0xa7,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28, +0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14, +0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x9d,0x8b,0x50, +0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, +0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e, +0x73,0x2a,0x6d,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0xca,0x3b, +0x12,0xa6,0x4e,0x38,0x2, 0x81,0x55,0x7e,0xc3,0x2f,0xad,0x4c,0xcc,0x78,0x3d,0x7a, +0xb3,0x2f,0xad,0xe4,0x7a,0xb3,0x2f,0xaf,0x6c,0xaa,0x80,0x26,0x12,0x8c,0x60,0x7e, +0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a,0x49,0xd0,0x19, +0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8c,0x6a,0x59,0x34,0x0, 0x2, +0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c,0xfc,0x6c,0xaa, +0x80,0x35,0x12,0x8c,0x60,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, 0xb4,0x0, 0x8, +0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8c,0x6a,0x7d,0x23,0x49,0x34,0x0, 0x2, 0x9d, +0x32,0x12,0x21,0x0, 0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x4c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x2f,0xaf,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x8c, +0x60,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x4c,0x0, 0x12,0x8c,0x71,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x2f,0xaf,0x80,0x6, 0x12,0x8c,0x71,0x75,0x4c,0x0, 0xe5,0x4c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xb0,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x40,0xe4,0x7a,0xb3,0x2f,0xae,0x7a,0xb3,0x2f,0xad,0x7a,0xb3,0x2f,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22, +0x12,0x8c,0xcd,0x6d,0x33,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x5, 0x12,0x8d,0x5e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xf6,0xe4,0x7a,0xb3,0x36,0x72,0x22,0x12,0xb0,0x94, +0x60,0x1a,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x7e,0x37,0x38, +0xd2,0x12,0x25,0x3c,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x23,0x12,0x8d,0x8, 0x28, +0x26,0xa, 0x4a,0x9, 0x64,0x36,0x76,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x42,0x38,0xcc,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x80,0xb, 0xa0,0x7e, +0xb3,0x36,0x73,0xbc,0xba,0x38,0xd5,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xae,0xa2,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x8d,0x5e,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x84, +0x49,0x12,0x36,0x80,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x84,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x36, +0x84,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x36,0x80,0x59,0x32,0x36,0x84,0x22,0x7e,0xb3,0x36,0x66, +0x60,0x6, 0x14,0x7a,0xb3,0x36,0x66,0x22,0x12,0x8c,0xcd,0x90,0x61,0xc5,0xe4,0x93, +0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x8d,0xef,0x7e,0xb3,0x36,0xec,0x70,0xe, 0x7e,0xb3, +0x39,0x12,0xb4,0x1, 0x7, 0xe4,0x12,0x8d,0xb3,0x12,0xc0,0x6b,0x12,0x67,0x1f,0x12, +0x8e,0xa2,0x7e,0xa3,0x36,0xec,0x7a,0xa3,0x39,0x12,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x8d,0xb3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf,0x12,0xc0,0x99,0x12,0xc0, +0x19,0x12,0x6f,0xff,0x12,0xc0,0x10,0x7a,0xf3,0x0, 0x4f,0x7c,0xbf,0x12,0xb3,0x2a, +0x12,0x6e,0x29,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37,0x12,0xae,0xe1,0x12,0x8d, +0xef,0x12,0x23,0x4, 0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8,0x22,0x12,0x8f,0xd2,0x7e, +0xb3,0x2b,0xf, 0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xc0,0x7e,0x73,0x37,0xcd,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36, +0x12,0x8f,0xca,0xbe,0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x36,0x72,0xa, 0x3e,0xad, +0x3b,0x7d,0xa3,0x2d,0xac,0x75,0x35,0x0, 0x7e,0xa3,0x36,0x72,0xbc,0xad,0x40,0x2, +0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e, +0x78,0xe, 0x7c,0xbd,0x14,0xbe,0xb3,0x36,0x72,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x72, +0x7e,0xc3,0x36,0x72,0x80,0x41,0x7e,0xb3,0x36,0x72,0x4, 0x7a,0xb3,0x36,0x72,0x7e, +0x90,0x5, 0xac,0x9c,0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb, +0x19,0xcd,0x36,0x76,0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, +0xf5,0x35,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0, +0xbe,0xf0,0x3, 0x50,0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x36,0x73,0xda, +0x3b,0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0x37,0x7e,0xb3,0x36,0x6b, +0xb4,0x1, 0x8, 0x12,0x88,0x22,0xe4,0x7a,0xb3,0x36,0x6b,0x7e,0xb3,0x36,0x6a,0x60, +0x4, 0x74,0xff,0xe1,0xc5,0x7e,0xb3,0x36,0x69,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xb9, +0x12,0xc0,0xef,0x38,0xc, 0x12,0x8f,0xf3,0x38,0x7, 0x12,0x8f,0xeb,0x38,0x2, 0xe1, +0xb9,0x12,0x8f,0xca,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, +0x80,0x3, 0x7c,0xbd,0x14,0x12,0xae,0x11,0x7c,0xfb,0x7e,0xb3,0x36,0x68,0x4, 0x7a, +0xb3,0x36,0x68,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xae,0x11,0x7c,0xab,0xbe,0xa0, +0xff,0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x36, +0x7e,0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, +0x12,0xae,0x98,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe, +0xf0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x68,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36, +0x75,0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x36,0x68,0x50,0x59, +0x74,0xc, 0xac,0xbf,0x49,0x25,0x36,0x7e,0x7e,0x14,0x61,0xcc,0x12,0x64,0xd3,0xbd, +0x23,0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0x9e,0xbe,0x37,0x36,0x64,0x40,0xd, +0x7e,0x34,0x61,0xd2,0x12,0x23,0x9e,0xbe,0x37,0x36,0x6f,0x50,0x23,0x74,0x5, 0xac, +0xbf,0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, +0x50,0x8, 0x12,0x87,0x52,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x6b, +0xe4,0x7a,0xb3,0x36,0x75,0x7a,0xb3,0x36,0x69,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a, +0xb3,0x36,0x68,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x90,0x61,0xc5,0xe4,0x93,0x7c, +0xdb,0x22,0x12,0xae,0xaf,0x74,0x1, 0x7a,0xb3,0x36,0x66,0x22,0x7e,0x24,0x0, 0x2, +0x2, 0x1e,0xb9,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26,0xf5,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf3,0x2a, +0x70,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3, +0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3, +0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x90, +0x50,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f, +0x36,0x6d,0x0, 0x12,0x1f,0x7, 0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x7, 0xda,0xf8,0x22, +0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8, +0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x6f, +0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x5c, +0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x60, +0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, +0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f, +0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x74,0xc8,0x7a,0xb3,0x39,0x6, 0xc2,0x17, +0x80,0xa, 0x12,0x45,0xd6,0x30,0x17,0x4, 0x75,0xe9,0xff,0x22,0x12,0x47,0xff,0x68, +0xf1,0x22,0x74,0x1, 0x12,0x90,0xf1,0x20,0x17,0x6, 0x12,0x46,0x4e,0x12,0x90,0xfa, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x90,0xb8,0x12,0x90,0xfa,0xe4,0x2, 0x90, +0xf1,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0x22,0xd2,0x4, 0x2, 0x45,0x5a,0xa, +0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x47,0xff,0x68,0xfb,0x20,0x93,0xfd, +0x22,0x7e,0x34,0x61,0x59,0x2, 0x23,0x9e,0x7e,0xb3,0x37,0x6, 0x70,0x2e,0x7e,0x73, +0x36,0xe9,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0x3, +0x7e,0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x91,0x6d,0x7c,0xab,0xe5,0x4e, +0xa, 0x3b,0x2e,0x37,0x38,0x83,0x7a,0x37,0x38,0x83,0x80,0xc, 0x7e,0xa3,0x36,0xea, +0xbe,0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x91,0x5d,0x75,0x4e,0x0, +0x7a,0xb3,0x39,0x6, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x20,0xf0,0x7a,0x71,0x82, +0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xb3,0x38,0x86,0x70,0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x38,0x86,0x22,0x7f,0x20,0xc2,0x4, 0x7e,0x2b,0x60,0x29,0x72,0x0, +0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21,0x0, 0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32, +0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x21,0x0, 0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d, +0x32,0x12,0x21,0x0, 0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60, +0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x37,0xf3,0x4d,0x33,0x68,0x2, +0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f,0x70,0x7c, +0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e, +0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12,0x87,0xbc,0x6c,0xff,0x12,0x2f,0xff,0x7f,0x51, +0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, 0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b, +0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e,0x14,0x62,0xa, 0x12,0x87,0xee,0x8, 0xc, 0x7e, +0x27,0x28,0x8a,0xbe,0x24,0x3, 0x20,0x8, 0x2, 0x61,0x2a,0xb, 0xa, 0xc0,0x1e,0xc4, +0xbd,0x3c,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x61,0x2a, +0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0, +0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca, +0x18,0x5, 0x4e,0xf0,0x1, 0x61,0x2a,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a, +0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa, +0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc, +0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90, +0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd, +0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b, +0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, +0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, +0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b, +0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0x40,0xbd,0x3d,0x22,0x7f,0x60,0x7e,0x6b,0xa0, +0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, +0x2d,0x15,0xb, 0x14,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0, +0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76,0x7d,0x13,0x1e, +0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e, +0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b, +0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xca,0x3b,0x6d,0x11,0x7e,0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c, +0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12,0x95,0x90,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x34,0xca,0x74,0x2, 0xa, 0x3f,0x19,0xb3,0x35,0x34,0xb, 0xf0,0x12,0x5e,0x2d, +0x38,0xe1,0x12,0x97,0xc0,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0xa1,0x69,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, +0x12,0x95,0xa1,0x38,0x2, 0xa1,0x67,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x4d,0x75,0x24,0x0, 0xa1,0x3f,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xca,0xbc,0xcd,0x68,0x2, 0xa1,0x3d,0x49,0x25,0x34,0xc8,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x0, 0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc6,0x74,0x9, 0xac,0xbf,0x12,0x96,0x1b,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x34,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x20,0xa, 0x1c,0x2e,0x14,0x35,0x34,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x67,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x69,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x1f,0x8c,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x97,0xae,0xac,0x3f,0x12,0x95,0x98,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x95,0x98,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x20,0x80,0x2a,0x5, 0x24,0x90, +0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0x81,0x49,0x80,0x1a,0x6d,0x11,0x74, +0x2, 0xac,0xbd,0x12,0x95,0x90,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1,0x34,0xca,0x74, +0x2, 0xa, 0x1d,0x19,0xb1,0x35,0x34,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x25,0xe4, +0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x5f,0xc6,0xca,0x59,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x34,0xc6,0x12,0x20,0xb9,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, 0xda,0x3b,0x22, +0x59,0x15,0x35,0x20,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x1f, +0x8c,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80, +0x63,0x6c,0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac, +0xbe,0x9, 0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x95,0xa1,0x38,0xe5, +0x12,0x95,0xa1,0x28,0x43,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x81,0xb3, +0x74,0x9, 0xac,0xbd,0x12,0x87,0xe5,0x12,0x96,0x1b,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8b,0x59,0x35,0x34,0xb0,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x87,0xb3,0xb, 0xe0,0xbc,0xfe,0x38,0x99,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x21,0x0, 0x7e,0xb3,0x37,0x31,0x70,0x3, 0x12,0x93,0xe3,0x2, 0x96,0x30, +0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x96, +0x7c,0x7c,0xbf,0x12,0x97,0x10,0x4c,0xee,0x78,0x14,0x12,0x5f,0xc2,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0x80,0xb, 0x7e,0xb3, +0x2a,0x9, 0x70,0x5, 0x7c,0xbf,0x12,0x95,0xa9,0x7c,0xbf,0x12,0x9f,0x90,0xbe,0xf0, +0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4, +0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, 0x2, 0x96,0xeb,0xa5,0xbe,0x0, 0x1d,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, +0xa0,0x12,0x5e,0x25,0x38,0xed,0x74,0x1, 0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x47,0x81,0x1b, +0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x47, +0x81,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0x12,0x97,0x4, 0x7e,0x8, +0x34,0xb0,0xe4,0x12,0x20,0xde,0x90,0x60,0x99,0x12,0x97,0x8, 0x7e,0x8, 0x34,0x8b, +0xe4,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60,0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x97,0xb6,0x7c,0x7d, +0x7c,0x6f,0x12,0x97,0xb6,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x97,0xae,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x1f,0x8c,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x2e,0x34, +0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x8, 0x1f,0x34,0x12,0x9e,0x37,0x7c,0x1b,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x34,0x9f,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x34,0x9f,0x1e,0x34,0x7a,0x37,0x34,0x9f,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9f,0x7e,0x37,0x34,0x9f,0x22,0xca,0xf8,0x7c,0xfb, +0x6d,0xdd,0x7c,0xbf,0x12,0x98,0xea,0x7d,0xe3,0x7c,0xbf,0x12,0x37,0x6f,0x7d,0xf3, +0x74,0x2, 0xac,0xbf,0x9, 0x95,0x26,0xfb,0x7c,0xbf,0x12,0x9a,0xed,0x40,0x2, 0x1, +0xd4,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0xbe,0xa0,0x0, 0x28,0x9, 0xa, 0x3a, +0x1b,0x34,0x12,0x98,0xd8,0x7d,0xd3,0x12,0x98,0xdf,0xbd,0xc3,0x58,0xb, 0xa, 0xca, +0xb, 0xc4,0x7d,0x3c,0x12,0x98,0xd8,0x2d,0xd3,0x12,0x9b,0xf, 0x7d,0xd3,0xbe,0xa0, +0x0, 0x28,0x56,0x12,0x98,0xdf,0xbd,0xc3,0x58,0x4f,0xbe,0x90,0x0, 0x28,0x4a,0xbe, +0x90,0x0, 0x28,0x45,0xbe,0xf4,0x0, 0xc8,0x8, 0x3f,0x7d,0x3d,0x3e,0x34,0x3e,0x34, +0xbd,0x3f,0x8, 0x35,0x7e,0x70,0x2, 0xac,0x79,0x49,0x33,0x4, 0xfc,0xbe,0x34,0x1, +0x2c,0x8, 0x26,0xa, 0x2a,0x7e,0xb3,0x2a,0x74,0x12,0x9b,0x18,0xbe,0x34,0x1, 0x90, +0x8, 0x17,0xbe,0xf4,0x1, 0x5e,0x58,0xd, 0x7e,0x34,0x0, 0x3, 0xad,0x3e,0xbd,0x3f, +0x8, 0x3, 0xe4,0x80,0x30,0x74,0x1, 0x80,0x2c,0x90,0x60,0xab,0xe4,0x93,0xbc,0xb9, +0x78,0x22,0x7c,0xba,0x7c,0x79,0x12,0x2c,0x40,0xbe,0x34,0x0, 0x96,0x8, 0x12,0x74, +0x2, 0xac,0xb9,0x49,0x35,0x4, 0xfc,0xbe,0x34,0x0, 0x32,0x8, 0x4, 0x74,0x1, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xb7,0x7c,0x79,0x2, 0x2c,0x40,0x7e, +0xb3,0x2a,0x6f,0xa, 0x3b,0x1b,0x34,0xa, 0xca,0x22,0xca,0x79,0x7c,0x8b,0x6c,0xaa, +0x9f,0x77,0x12,0x9a,0x2a,0x1a,0x79,0x1b,0x74,0x80,0x4c,0x1a,0x38,0x1b,0x34,0x7c, +0xe7,0x80,0x38,0xbc,0x9f,0x78,0x4, 0xbc,0x8e,0x68,0x2e,0xbe,0xf0,0x0, 0x48,0x29, +0x7e,0xb3,0x2a,0x6f,0xa, 0x2b,0x1a,0x3f,0xbd,0x32,0x58,0x1d,0xbe,0xe0,0x0, 0x48, +0x18,0x7e,0xb3,0x2a,0x70,0xa, 0x2b,0x1a,0x3e,0xbd,0x32,0x58,0xc, 0x7c,0xbf,0x7c, +0x7e,0x12,0x2c,0x40,0x12,0x99,0x65,0xb, 0xa0,0xb, 0xe0,0x1a,0x28,0xb, 0x24,0x1a, +0x3e,0xbd,0x32,0x8, 0xbe,0xb, 0xf0,0x1a,0x29,0xb, 0x24,0x1a,0x3f,0xbd,0x32,0x8, +0xaa,0x4c,0xaa,0x78,0x4, 0x6d,0x33,0x80,0x9, 0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12, +0x1f,0x58,0xda,0x79,0x22,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7, +0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f,0x34,0x7e,0xb3,0x2a,0x70,0x7a,0xb3, +0x1f,0x35,0x12,0x9a,0x2a,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x41,0x17,0x7a, +0xf1,0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d, +0x32,0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a, +0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d, +0x32,0x7c,0xb7,0xf5,0x2c,0x80,0x40,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58, +0x10,0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5, +0x2e,0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b, +0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12, +0x2c,0x40,0x12,0x99,0x65,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x2c,0x1a, +0x3b,0xbd,0x32,0x8, 0xb2,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd, +0x32,0x18,0x2, 0x21,0x8f,0x7f,0x17,0xda,0x79,0x22,0x7e,0x70,0x2, 0xac,0x78,0x9, +0x93,0x26,0xfa,0x9, 0x83,0x26,0xfb,0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x62,0x27, +0x12,0x9a,0xe5,0x12,0x9b,0x23,0x50,0x2, 0x41,0xe0,0x7e,0x34,0x62,0x2b,0x12,0x23, +0x9e,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, 0x41,0xe0,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x9a,0xe5,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x4, 0x4c,0x8, 0x6b,0x6c,0xdd,0x80,0x5f,0xc2,0x3, 0x7c,0xbd,0x12,0x37,0x6f, +0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x99,0x6c,0x7a,0x35,0x24,0x9e,0x35, +0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0xdc,0x7a,0x35, +0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, +0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x9a,0xed, +0x50,0x2, 0xc2,0x3, 0x30,0x3, 0xf, 0x7c,0xbd,0x6c,0x77,0x12,0x51,0x5f,0x7e,0x70, +0x2, 0xac,0x7d,0x12,0x37,0x9f,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x99, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x7c,0x4b,0x74, +0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc, +0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x2, 0x1e,0xb9,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33, +0x4, 0xfc,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x37,0x6f,0xbe,0x34, +0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0xe9, +0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0x3b,0x7e,0x77,0x2a,0x5c,0x12, +0x9d,0xa1,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x9b,0xd7,0x7e, +0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x35,0xe5,0xbd,0x36,0x48,0x7, 0x3e,0x34,0x3e, +0x34,0x12,0x9b,0xd7,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0x9b,0x23,0x50,0x6, 0x7e, +0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60,0xc, 0x7e, +0xb3,0x35,0xe3,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xe3, +0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x45,0xe, 0x7e,0x53,0x35,0xe3,0xbe,0x50,0x0, +0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, 0x7d,0xfe, +0x7a,0xf7,0x2a,0x5c,0x12,0x9b,0xdf,0x28,0x3, 0x12,0x37,0xc2,0x7a,0x67,0x35,0xe5, +0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xb9,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x79,0xc2,0x3, 0x7e,0xf0,0x3, 0x7e,0xe3, +0x2a,0x3, 0x12,0x9b,0xdf,0x28,0x72,0x7c,0xbf,0x12,0x2c,0x47,0x4c,0xee,0x68,0xe, +0x7e,0x63,0x33,0xc0,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x33,0xc1,0x70,0x4, 0xd2,0x3, +0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x4d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x3, +0x80,0x1e,0xd2,0x3, 0x12,0x9c,0xf6,0x78,0xa, 0xa5,0xbe,0x0, 0x6, 0x6c,0xff,0xc2, +0x3, 0x80,0xd, 0x9e,0x73,0x33,0xc0,0xbc,0x7e,0x78,0x5, 0x7e,0xf0,0x2, 0xc2,0x3, +0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x2c,0x47,0x7e,0xa3,0x33,0xc2,0x7a,0xa3,0x28,0x84, +0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x33,0xc3,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9, +0x1b,0xfd,0x12,0x9c,0x6f,0xf5,0x4d,0x80,0x3, 0x75,0x4d,0x64,0xda,0x79,0x22,0x7e, +0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80, +0x42,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x9c,0xee,0x9, 0xb3,0x26, +0xfa,0x12,0x2f,0xd6,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12, +0x9c,0xee,0x9, 0xb3,0x26,0xfb,0x12,0x2f,0xd6,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, +0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c, +0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28, +0x84,0xbc,0xb1,0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c, +0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0xca,0x79,0x6c, +0x88,0x80,0x72,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a, +0x71,0x24,0x7c,0xbf,0x12,0x9d,0x8b,0x50,0x5a,0x6c,0xee,0x80,0x51,0xbc,0xe8,0x68, +0x4b,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9d,0x80,0xf5,0x26,0x6c,0x99,0x90,0x60,0xaa, +0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, 0x2f, +0xe5,0x25,0xa, 0x3b,0x12,0x35,0x67,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, 0x78, +0x1b,0x7c,0xbe,0x12,0x37,0x6f,0x7d,0xf3,0x7c,0xb8,0x12,0x37,0x6f,0xbd,0x3f,0x8, +0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x51,0x5f,0xb, 0xe0,0x12,0x9c, +0xf6,0x38,0xaa,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0x86,0xda,0x79,0x22, +0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0x22,0x7c,0xab,0x90,0x60,0xab, +0xe4,0x93,0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x31,0x5a,0x50,0x2, 0xd3,0x22,0xc3, +0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84,0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12, +0x2f,0xb7,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb, +0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x40,0x7d,0xf3,0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, +0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x2, 0x70,0x2d, +0x7e,0x73,0x2a,0x3, 0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc5,0x70,0x18,0x12, +0x9e,0x17,0x7e,0x73,0x2a,0x3, 0x7a,0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, +0x7e,0xb3,0x34,0xc5,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc5,0x22,0xe4,0x7a,0xb3, +0x34,0xc5,0x7a,0xb3,0x2a,0x9, 0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x35, +0xe9,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73, +0x35,0xe8,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0xc1, +0xd2,0x7c,0x57,0xc1,0xca,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98, +0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff, +0x68,0x66,0x12,0x9e,0xe2,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e, +0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, +0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x9e,0xe2, +0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7, +0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0xc1,0x45, +0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6,0x28,0x2, 0xc1,0x41,0x7c,0xba,0xda, +0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0x7c,0xab,0x7e,0xb, +0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x34,0xa3,0xbe,0x73,0x34,0xad, +0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa3,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22, +0xbe,0x73,0x34,0xad,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74, +0xff,0x19,0xb4,0x34,0xa3,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x34,0xa3,0xbe,0xb0,0xff, +0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa3,0xd3,0x22,0xe4,0x19,0xb3,0x34,0xa3,0xc3,0x22, +0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34, +0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x5, 0xbe, +0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34, +0xb0,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x34,0x8b,0x80,0x4, 0x59,0x35,0x34,0x8b,0x59, +0xf5,0x34,0xb0,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x25,0x3c, +0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x25,0x3c, +0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28, +0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90, +0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0x12,0x5e,0x25, +0x38,0xb2,0x22,0x7e,0x8, 0x34,0xa2,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20,0xde,0x6c, +0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12,0x2f,0xb7,0x60,0xa, 0x12,0xa0,0x84,0x40, +0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5, +0x7c,0xb0,0x6c,0x77,0x12,0xa0,0x49,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70, +0x1, 0x12,0xa0,0x49,0xb4,0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x2f,0xb7, +0x60,0xc, 0x12,0xa0,0x84,0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x51,0x5f,0xb, 0x10, +0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3,0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e, +0xb3,0x36,0x61,0x7a,0xb3,0x36,0x62,0x7a,0xa3,0x36,0x61,0x7e,0xb3,0x36,0x62,0x60, +0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e,0xb3,0x36,0x63,0x60, +0x5, 0x14,0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x0, 0x28,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c, +0xa7,0x90,0x60,0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, +0x80,0x71,0xbe,0xb0,0x2, 0x38,0x66,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27, +0x7e,0x73,0x26,0xfa,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26, +0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x2, +0x80,0x4e,0x6c,0xff,0x80,0x30,0x7c,0xbf,0x12,0x37,0x81,0x1a,0x4b,0x7c,0xbf,0x12, +0x37,0x6f,0x7d,0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d, +0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, 0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75, +0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xcb,0x80,0x6, 0xe5,0x1e,0x24, +0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, +0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22,0x7e,0x39,0x70,0xa, 0x37,0x9d,0x32,0x2, +0x21,0x0, 0xca,0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6, +0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd, +0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f,0x46,0x75,0x2b,0x0, 0x61,0x43,0x12,0xa4, +0xde,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b, +0x2e,0x34,0x14,0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x22,0xff,0x12,0x20,0xb9,0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a,0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35, +0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff,0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a, +0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5,0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xa4, +0xe6,0x2e,0x35,0x36,0x12,0xa1,0x48,0x7d,0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58, +0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, 0x3b,0x7f,0x3, 0x12,0xa4,0xe6,0x2e,0x35, +0x38,0x12,0xa1,0x48,0x7d,0xc3,0x7e,0x35,0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32, +0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37,0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a, +0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c, +0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5,0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb, +0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0x61, +0x41,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60, +0x8, 0x2, 0x61,0x41,0x80,0x28,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, +0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x61,0x41,0xbe,0x34,0x0, 0x30,0x8, +0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x61,0x41,0x7e,0xa3, +0x38,0x41,0x74,0xc, 0xa4,0xbe,0x57,0x22,0xf9,0x58,0x2, 0x61,0x41,0x7e,0xa3,0x38, +0x42,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58,0x2, 0x61,0x41,0x7e,0x15,0x36,0x6d,0x0, +0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xa3,0x7e,0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d, +0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xa3,0x7e,0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73, +0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38,0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b, +0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4,0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10, +0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33,0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7c,0xb7,0xf5,0x2e,0xe5,0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37, +0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34,0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e, +0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22, +0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35,0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a, +0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a,0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22, +0xf6,0x5, 0x2b,0x12,0xa4,0xde,0x28,0x2, 0x21,0x7e,0x7e,0xa3,0x22,0xf7,0xbe,0xa1, +0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe,0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50, +0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, 0x34,0x7a,0x73,0x38,0x3e,0x7a,0xb3,0x38, +0x40,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x38,0x3e,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a, +0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43,0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14, +0x12,0xa4,0xd6,0x7a,0x55,0x4a,0xa, 0x5e,0x7f,0x16,0x12,0xa4,0xd6,0x7a,0x55,0x48, +0x7e,0x35,0x48,0x12,0xa4,0xcf,0x2f,0x50,0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a, +0x0, 0x2f,0x70,0x12,0xa4,0xcf,0x12,0xa4,0xc5,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d, +0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4a,0x12,0xa4,0xc5,0x7e,0x1d,0x40, +0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12, +0xa4,0xc5,0x7e,0x1d,0x44,0x2f,0x10,0x7a,0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c, +0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x1f,0x58,0x7f,0x51,0x7f,0x17,0x7f, +0x6, 0x12,0x1f,0x58,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12, +0x1e,0xfc,0x7e,0x87,0x23,0x43,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x3c,0x7e,0x1d,0x40,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x40,0x7e,0x1d,0x44,0x7d,0x19,0x12,0x1e,0xfc,0x7d,0x18, +0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x58,0x7a,0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1e, +0xeb,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12,0x1e,0xeb,0x7e,0x5d,0x3c, +0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1e,0xeb,0x7e,0x7d,0x40,0x9f,0x71,0xbe,0x58, +0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18, +0x7f,0x16,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x5, 0x12,0x1f,0x58,0x7f,0x6, 0x12,0x1e, +0xeb,0x7f,0x7, 0x12,0x1f,0x58,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44, +0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0x7f,0x1, 0x22,0x7d, +0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x39,0x1, 0xbe,0x71,0x2b,0x22,0x2d,0x13,0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79, +0x6c,0xaa,0x12,0xa5,0xe4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf, +0x38,0x43,0x7f,0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x38, +0x63,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda,0x7e,0x8, 0x38,0x43,0x7e,0x18,0x38,0x63, +0x74,0x20,0x12,0xa1,0x52,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73, +0x38,0x3f,0xbe,0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22, +0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0x33,0x38,0x3f,0xa, 0x13,0x6d,0x0, 0x12, +0x1f,0x7, 0x7c,0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64, +0xa, 0x3e,0x1b,0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xa5,0x92,0x7f,0x6, 0x7c, +0xbd,0x7c,0x7c,0x12,0xa5,0x92,0xb, 0xf0,0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x50,0xbc, +0x7f,0x5, 0x7f,0x16,0x12,0xa4,0xee,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x38,0x3e,0xda, +0x3b,0x22,0x7c,0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d, +0x2, 0xb, 0xa, 0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, +0x7c,0x21,0xa5,0xba,0x0, 0x14,0x1a,0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d, +0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, +0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35, +0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xe4,0x7a, +0xb3,0x35,0x69,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x5, 0xe4, +0x7a,0xb3,0x35,0xe4,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x4f,0x12,0xa6,0x4e,0x28, +0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0xdc,0xbe,0x37, +0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x3, 0x70,0x17,0x7e, +0xb3,0x37,0x8, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28, +0x5, 0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0xb3, +0x28,0x84,0xbe,0xb0,0x0, 0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x6e, +0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c, +0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x4a,0x12,0xa6,0xff,0x78, +0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x21, +0x0, 0x7d,0x13,0x7d,0x3e,0x12,0x21,0x0, 0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5, +0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33,0x9e,0x35,0x2e,0xbd,0x3e,0x8, +0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, +0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xae,0x7e,0x73, +0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80, +0xa, 0x12,0xa6,0xff,0x78,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc, +0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0xc1,0x71,0xda,0x3b,0x22,0xa, +0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22, +0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d, +0x0, 0x7f,0x14,0x12,0x1f,0x58,0x7d,0x73,0x12,0x21,0x0, 0x7d,0xe3,0x7d,0x3f,0x12, +0x21,0x0, 0xbd,0x3e,0x22,0x7e,0x63,0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c, +0xc2,0x12,0x6c,0x33,0x80,0x56,0x90,0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac, +0x93,0x90,0x60,0xab,0xe4,0x93,0xa, 0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4, +0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a, +0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x31,0x5a,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f, +0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, 0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, +0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75, +0xbc,0x73,0x38,0xa2,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x32,0xe7,0x22,0x90,0x60,0xa7, +0xe4,0x93,0x60,0x8, 0x30,0x12,0x5, 0x12,0x31,0x7d,0xc2,0x12,0x22,0xca,0xd8,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x22,0xe6,0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x1f,0xad,0x6d,0x11,0x7e,0x4, +0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0xa8,0xe1,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d, +0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, +0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x1, 0xd2,0xbe,0xd4,0x4, +0xb0,0x8, 0x2, 0xd2,0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd, +0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7, +0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x1, 0xd2,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, +0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0xa8,0xe1,0x1a,0x26,0x1a,0x24,0x2f, +0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0xa8,0xd7,0x9f,0x55,0x6c,0xee, +0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12, +0x21,0x0, 0x7d,0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, +0x1d,0x12,0xa8,0xd7,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, +0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea, +0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x58,0x7d,0x13, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x0, 0xca, +0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x7f,0xc2,0x3, 0x6d,0x44,0x80,0x1e, +0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x12,0xa8,0xe9,0xbd,0x3d,0x48,0xd, 0x7d, +0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa8,0xe9,0x7d,0xd3,0xb, 0x44,0x7e,0xc5, +0x35,0xbd,0xc4,0x38,0xdb,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba, +0x7d,0x3d,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f, +0x10,0x2e,0x35,0x35,0x7a,0x1b,0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f, +0x17,0x2d,0x35,0xb, 0x1a,0x30,0x7f,0x60,0x2e,0xd5,0x35,0x7e,0x6b,0xb0,0x60,0x5, +0xe, 0x34,0x14,0x78,0xfb,0x7c,0xb7,0x12,0xa9,0x78,0xb, 0x44,0x7e,0x55,0x35,0xbd, +0x54,0x38,0xd8,0xda,0xf8,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xb0,0x22, +0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5,0x1, 0x6c,0xaa, +0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0xa9,0x76,0xb, 0xa0,0xbe,0xa0, +0xd, 0x40,0xed,0xc2,0xc9,0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, 0x7e,0x73,0x2a, +0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0xad,0x13,0x7d,0x21,0x6c, +0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x38,0xd9,0x2d,0xf0,0xb, +0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, 0x59,0x4, 0x25, +0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35,0x35,0x7e,0xf, 0x37,0x40,0x7e,0x18, +0x25,0xb6,0x2, 0xa8,0xef,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12,0xaa,0x2e,0x7e, +0x1f,0x38,0xd9,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x24,0xf6,0x12, +0xaa,0x35,0x12,0xaa,0x3e,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, 0x20,0x7a,0x37, +0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, 0x22,0xa9,0xd1, +0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2,0x22,0x7e,0x73, +0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53,0x2a,0x6d,0xac, +0x54,0x7e,0x17,0x28,0xa1,0x12,0xaa,0x2e,0x6d,0x0, 0x80,0x37,0x7d,0x40,0x3e,0x44, +0x7e,0x7f,0x38,0xd9,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10,0x7d,0xf4,0x2e, +0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14,0x6d,0x55,0x9d, +0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d,0x51,0x1b,0x48, +0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22,0x7c,0xab,0x7e,0x8, 0x29,0xbc,0x12,0x5e, +0x25,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0,0xb4,0x2, 0x4, 0x74, +0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31,0x7d,0x20,0x39,0xb1, +0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e,0x24,0x0, 0xff,0xb, +0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0x61,0x73,0x90,0x60,0xa7,0xe4,0x93, +0x70,0x2, 0x61,0x73,0x6c,0xff,0x61,0x6c,0x7e,0x70,0x9, 0xac,0x7f,0x9, 0xe3,0x29, +0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, 0x7d,0x3d,0x12, +0xab,0x81,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, 0x7d,0x34,0x1b, +0x34,0x12,0xab,0x78,0x7c,0xbe,0x12,0xaa,0x98,0x80,0x3f,0x7e,0x70,0x2, 0xac,0x7d, +0x2e,0x34,0x60,0xc5,0x12,0x87,0xbc,0x74,0x9, 0xac,0xbf,0x59,0xd5,0x29,0x8, 0x7e, +0x34,0x60,0xcf,0x12,0x23,0x9e,0x12,0xab,0x78,0x80,0x1f,0xbd,0xc4,0x40,0x1b,0x7d, +0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0xaa,0x98,0x7d,0xc4, +0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12,0x5e,0x2d,0x28, +0x2, 0x41,0xe8,0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0xa, +0x22,0x6c,0xaa,0x80,0x27,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x60,0xb1, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14,0x60,0xb3,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0xb, 0xb, 0xa0,0x90,0x60,0xa7,0xe4, +0x93,0xbc,0xba,0x38,0xd0,0x7c,0xba,0x22,0x90,0x60,0xa7,0xe4,0x93,0x60,0x2b,0x6c, +0x33,0x80,0x1f,0x7c,0xb3,0x12,0x31,0x5a,0x40,0x16,0x7c,0xb3,0x12,0x31,0x27,0x7d, +0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30,0x1b,0x1a,0x50, +0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0xab,0xfd,0x7e,0x14, +0x62,0x7, 0x12,0x87,0xee,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22,0x6d,0x11,0xe4, +0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x7f,0x38,0xf3, +0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12,0x21,0x0, 0xbd, +0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xf3,0x2d,0x13,0x69,0x20, +0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x81,0xbf,0x7e,0x10,0x2, 0xac,0x1a,0x7e,0x1f, +0x38,0xf3,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14, +0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e,0x14,0x7f,0xff, +0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22,0x6c,0x66,0x7e, +0x27,0x39,0x4, 0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e,0xb3,0x28,0xac, +0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xab,0xbc,0x76,0x50,0xf, 0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8a,0x87,0x7e,0xb3,0x2f,0xab,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3, +0x2f,0xab,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xac,0xbe,0xa0,0x5, +0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74,0x5, 0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xac,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, 0xac,0x5a,0x49, +0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8,0x30,0x1, 0xe, +0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d,0x23,0xa, 0x3a, +0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f,0x7e,0x63,0x2a, +0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac,0x56,0x49,0x22, +0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e,0xb3,0x2a,0x6d, +0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, 0x2, 0xc2,0x3, +0xa2,0x3, 0x22,0xc2,0x3, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1,0x60,0x4, 0xd2, +0x3, 0x80,0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57,0x49,0x12,0x4, +0xfc,0x7e,0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d,0x22,0x9d,0x20, +0xbd,0x12,0x58,0x4, 0xd2,0x3, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e,0x14,0x0, 0x3, +0xa, 0x27,0xbd,0x21,0x48,0xd2,0xa2,0x3, 0x22,0x7d,0x23,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x7e,0x14,0x0, 0x5, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33, +0x36,0xdc,0xbe,0x30,0x8, 0x50,0x45,0x74,0x8, 0x80,0x3d,0x7d,0x13,0x3e,0x14,0xbd, +0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x6, 0x50,0x30,0x74,0x6, 0x80,0x28, +0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc, +0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, 0x80,0xf, 0xbd,0x32,0x50,0xf, 0x7e,0x73,0x36, +0xdc,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xdc,0x7e,0xb3,0x36,0xdc, +0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a,0xb3,0x36,0xdc,0x74,0x1, 0x7a,0xb3,0x16,0x92, +0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3,0x36,0xdc,0x50,0x5, 0xe4,0x7a,0xb3,0x16,0x91, +0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0xae,0x8a,0x68,0x23, +0x7e,0x70,0xc, 0xac,0x72,0x12,0xae,0xa2,0x7d,0x23,0x7e,0x70,0xc, 0xac,0x72,0x59, +0x23,0x36,0x82,0x49,0x3, 0x36,0x82,0x49,0x23,0x36,0x7e,0xbd,0x20,0x50,0x4, 0x59, +0x3, 0x36,0x7e,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22,0x80,0x18,0x12, +0xae,0x8a,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7e,0xbd,0x4, 0x50, +0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37,0x36,0x64,0xbe, +0x37,0x36,0xdd,0x50,0x8, 0x7e,0x37,0x36,0xdd,0x7a,0x37,0x36,0x64,0x12,0xae,0x98, +0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, 0xac,0x12,0x9, +0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, 0x22,0x7e,0x70,0xc, 0xac,0x7a,0x49,0x33,0x36, +0x7e,0x22,0x49,0x23,0x36,0x84,0x49,0x33,0x36,0x80,0x9d,0x32,0x2, 0x21,0x0, 0x7e, +0x8, 0x36,0x7a,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x20,0xde,0x6c,0xaa,0x7e,0x44,0xff, +0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7c,0x59,0x43,0x36,0x84,0xb, 0xa0, +0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x68,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20, +0xde,0x7e,0xa3,0x2b,0x62,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62,0xd2,0xc, 0x30, +0xc, 0x7, 0x12,0xae,0xfa,0xe4,0x2, 0xa, 0x66,0x22,0xc2,0xc, 0x7e,0x8, 0x2a,0x6d, +0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x6d,0x74,0x3, 0x2, 0x11,0x7a,0xe4,0x7a,0xb3,0x36, +0x67,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xee,0xe4,0x7a,0xb3,0x36,0x68,0x6d,0x33,0x7a,0x37, +0x36,0x6f,0x7a,0x37,0x36,0x64,0x22,0x7e,0xb3,0x36,0x6a,0xb4,0x1, 0x27,0x7e,0xb3, +0x36,0xe0,0x4, 0x7a,0xb3,0x36,0xe0,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x3, 0x40,0x15, +0x12,0x8c,0x90,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x6, 0x40,0x9, 0xe4,0x7a,0xb3,0x36, +0xe0,0x7a,0xb3,0x36,0x6a,0x22,0x12,0x24,0x14,0xe4,0x7a,0xb3,0x3, 0xfe,0x2, 0x76, +0x52,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88,0x7e,0xf0,0x1, +0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f,0x7f,0x7, 0x2d, +0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc,0x9f,0x38,0xe2, +0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0,0x1, 0x2, 0xb0, +0x31,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, 0x80,0x36,0x7e, +0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0xe5,0x44, +0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16,0x5, 0x45,0xa, +0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0xc0,0xe8,0xbd,0x3d,0x8, 0x5, 0x12,0xc0, +0xe8,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe,0xb0,0x0, 0x28, +0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x72,0x33,0xc3,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x33, +0xc4,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x30,0x3, 0x1b,0x1a,0xd0,0xb, 0xa0,0xb, +0xf0,0xbc,0x8f,0x40,0x3, 0x2, 0xaf,0xb1,0x7c,0xba,0xda,0x79,0xda,0xd8,0x22,0x7c, +0x9b,0x7f,0x71,0x7f,0x60,0x7e,0x34,0x22,0xb8,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f, +0x52,0x74,0x2a,0x12,0x1f,0xad,0x7e,0x58,0x1f,0x52,0x7c,0xb9,0x7e,0x71,0x44,0x12, +0x2c,0x40,0x7d,0x43,0xe5,0x45,0x7e,0x71,0x46,0x12,0x2c,0x40,0x2d,0x34,0xe, 0x34, +0x7f,0x5, 0x7e,0x50,0x7, 0xb, 0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, +0x1b,0x6a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b, +0x50,0x78,0xe2,0x22,0x6d,0x33,0x7d,0x23,0x7d,0x3, 0x6c,0x33,0x80,0x45,0x6c,0x22, +0x80,0x37,0x7e,0xb3,0x2a,0x6e,0xac,0xb3,0xa, 0x42,0x2d,0x54,0x7d,0x45,0x3e,0x44, +0x7e,0x7f,0x13,0x8a,0x2d,0xf4,0xb, 0x7a,0x40,0xbe,0x44,0x0, 0x32,0x8, 0x8, 0xbe, +0x44,0x2, 0x58,0x58,0x2, 0xb, 0x24,0xbe,0x44,0xff,0xce,0x58,0x8, 0xbe,0x44,0xfd, +0xa8,0x8, 0x2, 0xb, 0x4, 0xb, 0x34,0xb, 0x21,0x7e,0x93,0x2a,0x6e,0xbc,0x92,0x38, +0xc1,0xb, 0x31,0x7e,0xb3,0x2a,0x6d,0xbc,0xb3,0x38,0xb3,0x7e,0x54,0x0, 0x6, 0xad, +0x53,0x7d,0x15,0x1e,0x14,0x1e,0x14,0x1e,0x14,0x12,0x25,0x3e,0xbd,0x12,0x50,0x22, +0xbd,0x30,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x8, 0x7e,0xb3,0x39,0x9, 0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x9, 0x80,0x3c,0xe4,0x7a,0xb3,0x39,0x9, 0x74,0x1, +0x80,0x2f,0xbd,0x10,0x50,0x22,0xbd,0x32,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x9, 0x7e, +0xb3,0x39,0x8, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x8, 0x80,0x16,0xe4, +0x7a,0xb3,0x39,0x8, 0x74,0x2, 0x80,0x9, 0xe4,0x7a,0xb3,0x39,0x8, 0x7a,0xb3,0x39, +0x9, 0x7a,0xb3,0x39,0xa, 0x7e,0xb3,0x39,0xa, 0x22,0xe4,0x7a,0xb3,0x28,0xa8,0x7a, +0xb3,0x39,0xb, 0x22,0xca,0xd8,0xca,0x79,0xc2,0x3, 0x6c,0xdd,0x7e,0x57,0x28,0x99, +0x7d,0xf5,0x7e,0xe7,0x28,0x97,0x7e,0x37,0x37,0xfb,0x4d,0x33,0x68,0x4, 0x7d,0xf5, +0xe, 0xf4,0x6c,0xff,0x7e,0xa3,0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68, +0x21,0x14,0x68,0x14,0x24,0xc2,0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10, +0x7c,0xfa,0x7e,0x83,0x2a,0x6d,0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, +0x6c,0x88,0x6c,0x99,0x80,0xf, 0x7c,0xb9,0x12,0x37,0x6f,0xbe,0x34,0x2, 0x58,0x8, +0x2, 0xb, 0xd0,0xb, 0x90,0x7e,0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, +0x40,0x2, 0x61,0x25,0x7e,0xa3,0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, +0x28,0x37,0x7e,0xb3,0x26,0x83,0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f, +0x2d,0x32,0x3e,0x34,0x49,0x23,0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc, +0xbd,0xe, 0x58,0xf, 0x6d,0x33,0x9d,0x3e,0x12,0x8f,0xdc,0xbd,0x3, 0x8, 0x4, 0xd2, +0x3, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe, +0xe7,0x7, 0xf8,0x8, 0x2, 0xc2,0x3, 0x30,0x3, 0x20,0x7e,0xb3,0x39,0xb, 0x4, 0x7a, +0xb3,0x39,0xb, 0x7e,0x23,0x39,0xb, 0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3, +0x39,0xb, 0x74,0x1, 0x7a,0xb3,0x28,0xa8,0x80,0xf, 0x7e,0x23,0x39,0xb, 0xbe,0x20, +0x0, 0x28,0x6, 0x1e,0x20,0x7a,0x23,0x39,0xb, 0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, +0xbe,0xa0,0x0, 0x28,0x69,0x7e,0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa, +0xbe,0xb0,0x1, 0x68,0x59,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d, +0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x2c,0x3c, +0xbe,0x34,0x0, 0x96,0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28, +0x84,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3, +0x27,0x36,0x9, 0xd3,0x27,0x37,0x12,0x2c,0x3c,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e, +0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99, +0x80,0x17,0xa, 0xe9,0xa, 0x5f,0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f, +0x8, 0x5, 0x7e,0xe0,0x1, 0x80,0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78, +0x25,0x7e,0xb3,0x39,0xc, 0x4, 0x7a,0xb3,0x39,0xc, 0x7e,0x73,0x39,0xc, 0xbe,0x70, +0x5, 0x28,0x22,0x74,0x5, 0x7a,0xb3,0x39,0xc, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2, +0x15,0x12,0xb1,0x5a,0x80,0xf, 0x7e,0x73,0x39,0xc, 0xbe,0x70,0x0, 0x28,0x6, 0x1e, +0x70,0x7a,0x73,0x39,0xc, 0xda,0x79,0xda,0xd8,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34, +0x0, 0x38,0xca,0x39,0xac,0x7f,0x2e,0x34,0x0, 0x50,0x6d,0x22,0x7e,0x8, 0x34,0x0, +0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, +0x30,0x6d,0x22,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x7e, +0xa3,0x2a,0x6e,0xa, 0x3a,0x3e,0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x20,0xde,0x90, +0x60,0x93,0x93,0xa, 0x3b,0x7e,0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad, +0x32,0x7d,0x43,0x6c,0x77,0x80,0x1d,0xa, 0x27,0x2d,0x24,0x12,0x87,0xdc,0xb, 0xa, +0x0, 0x7e,0x30,0x2, 0xac,0x37,0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b, +0x18,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xdf,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x13,0xc6,0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24, +0x13,0x8e,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38, +0xdc,0x22,0x7c,0xab,0x12,0xb3,0xe1,0xd2,0x16,0x7c,0xba,0x12,0x86,0xf8,0xc2,0x16, +0x22,0xa9,0xd1,0xcb,0x74,0x1, 0x2, 0x0, 0xe, 0x12,0xb3,0xe1,0x7e,0x34,0xd, 0xc8, +0x7e,0xb3,0x2a,0x6d,0x12,0xb4,0x22,0x12,0xb4,0x5, 0x7a,0x37,0x38,0xd6,0x74,0x1, +0x7a,0xb3,0x16,0x91,0x22,0x6d,0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28, +0x3, 0x2, 0xb4,0xef,0x90,0x60,0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb4, +0x56,0x22,0x7a,0xb3,0x24,0xf2,0x7e,0x53,0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37, +0x24,0xfa,0xe4,0x7a,0xb3,0x24,0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a, +0x37,0x24,0xf6,0x7e,0x34,0x0, 0x20,0x12,0xb4,0x4d,0x2, 0xd, 0x7, 0x7a,0x37,0x24, +0xfc,0x7e,0x8, 0x24,0xf2,0x22,0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e, +0xa, 0xd8,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa, +0x80,0x18,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, +0x5a,0xc0,0x9d,0xc2,0x59,0xc3,0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60, +0x92,0xe4,0x93,0x7c,0x9b,0x6d,0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92, +0xe4,0x93,0xa, 0xcb,0x1b,0xc4,0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa, +0x80,0x28,0xa, 0x3a,0x7d,0x23,0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d, +0x3e,0x34,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x0, +0x7d,0xa3,0xbd,0xfa,0x58,0x2, 0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8, +0x2d,0xec,0x2d,0xdc,0xb, 0xf0,0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca, +0xf8,0x6d,0x44,0x7e,0xf3,0x2a,0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3, +0x2a,0x6d,0xa, 0xeb,0x2d,0xef,0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60, +0x94,0xe4,0x93,0xb4,0xff,0x31,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda, +0x2d,0xdf,0x3e,0xd4,0x7e,0x1f,0x38,0xd9,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, +0xac,0x5a,0x7f,0x50,0x2d,0xb2,0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, +0xa0,0xbc,0xfa,0x38,0xd9,0x80,0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x38,0xd9,0x2d, +0x15,0x6c,0xaa,0x80,0x2c,0xa, 0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x38,0xd9,0x2d, +0x3e,0xb, 0x1a,0xe0,0x7e,0x70,0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0, +0x7d,0x3e,0x9d,0x3d,0x12,0x21,0x0, 0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, +0xa0,0xbc,0xfa,0x38,0xd0,0x7d,0x34,0xda,0xf8,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, +0xa9,0xd5,0xea,0xa9,0xc5,0xea,0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e, +0x5, 0x4e,0x7e,0x73,0x39,0x6, 0xbe,0x71,0x4e,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e, +0xa9,0xd7,0x9e,0xa9,0x34,0xe5,0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, +0xa9,0xc2,0xcd,0xa9,0x33,0xe5,0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7, +0xcd,0xa9,0x36,0xe5,0x3, 0xa9,0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6, +0xc2,0x88,0xd2,0xa8,0x22,0x7e,0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47, +0x52,0x7e,0x24,0x55,0x50,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20, +0x7e,0x24,0x41,0x44,0x79,0x30,0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33, +0x7e,0x24,0x66,0xcc,0x79,0x30,0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47, +0x7e,0x24,0x46,0x4c,0x79,0x30,0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd0,0xce, +0xa2,0x3, 0xa9,0x95,0xc9,0x22,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2, +0x86,0xa9,0xc2,0xeb,0xa9,0xd2,0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f, +0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d, +0x1, 0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75, +0xf7,0x0, 0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9, +0xd0,0xf7,0xd2,0xf8,0xa9,0xc1,0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6, +0xb7,0xc2,0xbe,0x22,0x75,0xe7,0x6b,0x2, 0xb6,0x9a,0xe4,0x7e,0x34,0xd7,0xfc,0x7e, +0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff, +0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e,0x37,0x39,0x4, 0xb, 0x34,0x7a,0x37, +0x39,0x4, 0xbe,0x34,0xff,0x0, 0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37,0x39,0x4, +0x22,0x7c,0x6b,0x6c,0x77,0x6c,0xaa,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x46,0x12,0xb7, +0x8f,0x75,0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12, +0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc, +0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0xa9,0xc6, +0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1, +0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0xa9,0xc6,0xb3, +0x75,0xb5,0x0, 0x22,0x74,0x6, 0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73, +0x7d,0x52,0x7c,0xab,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x3c,0x12,0xb7,0x8f,0x75,0xb5, +0x1, 0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x2d,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0xb7,0x38,0xa9, +0xc2,0xb4,0xa9,0xc6,0xb3,0x22,0x74,0x2, 0x7d,0x3f,0x2, 0xb7,0x38,0x7d,0x42,0x7f, +0x60,0x7d,0x3, 0x12,0xb7,0xef,0x74,0x2, 0x12,0xb6,0xd1,0x7d,0xf3,0x4e,0xf4,0x0, +0x1, 0x4e,0xf4,0x0, 0xa, 0x12,0xb7,0x96,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f, +0x6, 0x12,0xb7,0xd7,0x5e,0xf4,0xff,0xfd,0x12,0xb7,0x96,0x2, 0xb7,0xce,0xa9,0xc5, +0xca,0xe4,0x7a,0xb3,0x39,0x13,0x22,0x12,0xb8,0x38,0x7e,0x35,0x36,0x12,0xb8,0x1c, +0xa9,0xd2,0xb4,0xd3,0x22,0x74,0x6, 0x12,0xb6,0xd1,0x7d,0x3, 0x6c,0x11,0x22,0xa9, +0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1,0xea,0x74,0xa5,0x7a,0xb3,0x39,0x13,0x22,0xca, +0xf8,0x7c,0xfb,0x74,0x2, 0x12,0xb6,0xd1,0x4c,0xff,0x78,0x5, 0x5e,0x70,0xdf,0x80, +0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0xb7,0x38,0xda,0xf8,0x22,0x6d,0x22,0x80,0x13, +0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, +0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5, +0xa, 0x44,0xf5,0x39,0x7f,0x21,0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xb8,0x63, +0xe5,0x3a,0x12,0xb8,0x63,0xe5,0x39,0x12,0xb8,0x63,0xe5,0x38,0x12,0xb8,0x63,0xe4, +0x2, 0xb8,0x63,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0xd2,0xc8, +0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0xb7, +0xef,0xe4,0x12,0xb7,0xff,0x2, 0xb7,0xce,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c, +0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, +0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74, +0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x97,0xbe,0x90,0x1, +0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe, +0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18, +0xb2,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xb9,0x3c,0xb, 0x7a,0x20, +0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d, +0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25, +0x3c,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, +0xf9,0x2d,0xf1,0x7d,0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77, +0x14,0x78,0xfb,0x4d,0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xd9,0x7e,0x8, +0x1f,0x3c,0x12,0xb9,0xfa,0xd2,0x3, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xb9,0x44, +0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32, +0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, +0x12,0xba,0x42,0x50,0x7, 0x12,0xba,0x39,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7, +0x38,0xee,0x12,0xb9,0xe7,0xe4,0x12,0xb9,0xef,0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a, +0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xb9,0xe7,0x74,0x1, 0x12,0xb9,0xef,0x74, +0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12, +0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x1c,0x74,0x3f, +0x2, 0x20,0xde,0x7e,0x8, 0x1f,0x34,0x12,0xb9,0xfa,0x6c,0x77,0x80,0xe, 0x12,0xba, +0x42,0x50,0x7, 0x12,0xba,0x39,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x6e, +0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9, +0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x44,0xa, +0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57,0x7c,0xab, +0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46, +0x2e,0x44,0x20,0x73,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b,0xbe,0x60, +0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb, +0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b, +0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70, +0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbb,0x9, 0x60,0x5, 0x3e, +0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16, +0x9e,0x60,0xe, 0x12,0xbb,0x9, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbb,0x9, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b, +0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72, +0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12,0x77,0xf6,0xb, 0x24,0xa, 0x33,0xbd,0x32, +0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28, +0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f, +0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d, +0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a, +0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a, +0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a, +0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3, +0xff,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, +0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85, +0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88, +0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53, +0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e, +0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91, +0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12,0x2f,0xd0,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xfb,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x37,0x32,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xbd,0x44, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x38,0xfc,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x37,0x33,0x80,0x1a,0x12,0xbd,0x44,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x38,0xfb,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x34,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f, +0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x80, +0x7e,0x34,0x0, 0x28,0xe4,0x12,0x20,0xde,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, 0xc0, +0x12,0x20,0xde,0x7a,0xb3,0x37,0x34,0x7e,0x34,0x62,0x8e,0x12,0x23,0x9e,0x7a,0x37, +0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a,0xe7, +0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a,0xf7, +0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a,0xf7, +0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe,0x7a, +0xb3,0x37,0x34,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x7e,0x37,0x38,0xe2,0x9e,0x37,0x38,0xde,0x12,0x21,0x0, 0xbd,0x31,0x38,0x12, +0x7e,0x37,0x38,0xe4,0x9e,0x37,0x38,0xe0,0x12,0x21,0x0, 0xbd,0x31,0x38,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd, +0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x38,0xdd,0x60,0x11,0x7e,0xc7, +0x38,0xe6,0x4d,0xcc,0x78,0x2, 0xc1,0xe8,0xbe,0xd0,0x1, 0x28,0x2, 0xc1,0xe8,0xbe, +0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xc1,0xe8,0x7e,0xe7,0x29,0x8, 0x7e, +0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x66,0xe6,0xbe,0xb0,0x1, 0x78,0x2, 0xc1, +0xe8,0x7e,0xa3,0x38,0xdd,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23, +0x14,0x78,0x2, 0xc1,0xe5,0xb, 0xb2,0x68,0x2, 0xc1,0xe8,0xbe,0xd0,0x1, 0x68,0x2, +0xc1,0xf7,0x4c,0xee,0x68,0x2, 0xc1,0xf7,0x74,0x1, 0x7a,0xb3,0x38,0xdd,0x12,0xbf, +0xa, 0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3, +0x38,0xdd,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xdd,0x7e,0x34, +0x62,0x68,0x80,0x48,0x12,0xbf,0x13,0x90,0x62,0x57,0x12,0xbe,0xfe,0x68,0x49,0x80, +0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xbf,0x13,0x7e,0x34,0x62, +0x60,0x12,0x23,0x9e,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d, +0xc3,0xbe,0xc7,0x38,0xe6,0x40,0x21,0x90,0x62,0x56,0x12,0xbe,0xfe,0x68,0x19,0x12, +0xbf,0xa, 0x74,0x3, 0x7a,0xb3,0x38,0xdd,0x7e,0x34,0x62,0x64,0x12,0x23,0x9e,0x7a, +0x37,0x38,0xe6,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xdd,0x6d,0x33,0x7a, +0x37,0x38,0xe6,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93, +0xa, 0x3b,0x12,0xbd,0xc9,0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x38,0xde,0x7a,0xf7, +0x38,0xe0,0x22,0x7a,0xe7,0x38,0xe2,0x7a,0xf7,0x38,0xe4,0x22,0xca,0xf8,0x7f,0x51, +0x7f,0x40,0x7e,0x37,0x2f,0x90,0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c, +0x7e,0x37,0x2f,0x9c,0x7a,0x35,0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff, +0x80,0x1e,0x7e,0x34,0x0, 0x26,0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0x8c,0x74, +0x2, 0xac,0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xbf,0x6b,0xb, 0xf0, +0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e, +0x35,0x2f,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e, +0x35,0x31,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, +0x6a,0x30,0x9e,0x35,0x33,0x6d,0x22,0x7e,0x33,0x38,0x41,0x12,0xbf,0xc0,0x7e,0x15, +0x2f,0x12,0x1f,0x5, 0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e, +0x33,0x38,0x42,0x12,0xbf,0xc0,0x7e,0x15,0x31,0x12,0x1f,0x5, 0x1b,0x7a,0x30,0x22, +0xa, 0x13,0x6d,0x0, 0x2, 0x1e,0xeb,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, +0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22, +0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x7e,0x34,0x60,0xa3,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e,0x37,0x2a,0x53,0x22,0x7e,0xa3,0x2a,0x6e,0x7e, +0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d,0x22, +0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b, +0x14,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e, +0x7b,0x60,0xbc,0x6b,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x2e,0x14,0x1, 0x30,0x6d, +0x0, 0x7e,0x18,0x3, 0x60,0x22,0x2e,0x14,0x0, 0x50,0x6d,0x0, 0x7e,0x18,0x34,0x0, +0x22,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x26,0xfa,0x22,0xe4,0x7a,0xb3,0x36,0x69, +0x7a,0xb3,0x36,0x71,0x22,0x74,0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7a,0x37, +0x2a,0x4f,0x7e,0x34,0x61,0x57,0x22,0x7a,0x37,0x28,0xa1,0x7e,0x34,0x61,0xc2,0x22, +0x90,0x60,0xaa,0xe4,0x93,0xbe,0xb0,0x1, 0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b, +0xf, 0x22,0x74,0x5, 0xac,0xbc,0x9, 0xb5,0x26,0x33,0x22,0x7e,0x8, 0x0, 0x25,0x7e, +0x18,0x0, 0x24,0x22,0x7e,0xe3,0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x6d,0x33,0xe4, +0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x37,0x25,0xf4,0x7a,0x37,0x31,0xcc,0x22,0x7e,0x34, +0xd, 0xc8,0x7a,0x37,0x31,0xce,0x22,0x7e,0x73,0x37,0xbd,0x7a,0x73,0x2b,0x20,0x22, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x22,0x7c,0xbe,0x7c,0x7d,0x2, 0x2c,0x40,0x7e, +0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0,0x1, 0x22,0x12, +0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xb3,0x37,0x31,0xbe,0xb0,0x1, 0x22,0x7e, +0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7,0xe4,0x93,0x7c,0xab,0x22,0xff, +0xc1,0x20,0x3e,0xdf,0x94,0x6b,0x10,0x51, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_tianma.txt b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_tianma.txt new file mode 100644 index 0000000000000..f65bdd64e5341 --- /dev/null +++ b/drivers/input/touchscreen/FT5346/ft_app_ic_oufei_tianma.txt @@ -0,0 +1,3093 @@ +0x2, 0x1f,0xd2,0x2, 0xb5,0xb4,0xeb,0xaa,0x8, 0x22,0x22,0x2, 0x0, 0x42,0xb4,0x2, +0x4, 0xa9,0xb7,0xea,0x22,0x24,0xff,0xa9,0x97,0xea,0x22,0x2, 0x70,0x2d,0xb4,0x2, +0x4, 0xa9,0xb6,0xea,0x22,0x24,0xff,0xa9,0x96,0xea,0x22,0x2, 0x7d,0x45,0x7f,0x60, +0xa9,0xc2,0xea,0x74,0x1, 0x12,0x13,0x96,0x7f,0x6, 0x12,0x5, 0xb4,0x7f,0x6, 0x2, +0x9, 0xa1,0x32,0x2, 0x7d,0xa4,0xe4,0x2, 0x29,0xfa,0x22,0x2, 0x0, 0x5a,0x12,0x10, +0xa2,0x2, 0x13,0x79,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x2, 0x0, 0x76,0x1, 0x2, +0x4, 0x8, 0x10,0x20,0x40,0x80,0xa2,0x13,0x22,0x32,0xff,0x2, 0x0, 0x69,0x2, 0x31, +0xb3,0xff,0xff,0x2, 0x10,0x52,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b, +0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0xb, 0x7e,0xf, 0x38,0xc8, +0x69,0x30,0x0, 0x4, 0x7a,0x73,0x38,0xd8,0x7e,0x73,0x38,0xd8,0xa, 0x37,0x5e,0x34, +0x0, 0x4, 0x68,0x4, 0xd2,0xa, 0x80,0x2, 0xc2,0xa, 0x7e,0x34,0x0, 0x1f,0x79,0x30, +0x0, 0x4, 0xc2,0xc3,0x12,0x12,0x9e,0x12,0x7f,0x5, 0x7e,0x1f,0x38,0xc8,0x69,0x31, +0x0, 0x2, 0x5e,0x34,0x0, 0x40,0x68,0x2e,0x6c,0xaa,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x1f,0x38,0xc8,0x7f,0x71,0x2d,0xf0,0x69,0x17,0x0, 0x9c,0x59,0x10,0x38,0xcc,0xb, +0xa0,0xbe,0xa0,0x3, 0x78,0xe4,0x69,0x11,0x0, 0xa4,0x7a,0x17,0x38,0xd4,0x69,0x31, +0x0, 0xa2,0x7a,0x37,0x38,0xd2,0xa9,0xc1,0xc4,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda, +0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7d,0x13, +0x7e,0x1f,0x38,0xf7,0x1b,0x1a,0x10,0xc2,0xc6,0xd2,0xee,0x22,0xff,0xff,0x54,0x2c, +0xca,0x79,0x7f,0x50,0x7c,0xeb,0x7e,0x34,0x0, 0x24,0x7e,0x8, 0x0, 0x2c,0x7e,0x24, +0x0, 0x2, 0x12,0xb7,0xc7,0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x2, 0x21,0x4a,0xe5,0x2c, +0xbe,0xb0,0x76,0x28,0x2, 0x21,0x4a,0x7e,0xe1,0x2c,0xbe,0xe0,0x76,0x38,0x2, 0x21, +0x78,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79,0x35,0x0, +0x4, 0xbe,0xe0,0x81,0x68,0x2, 0x21,0x71,0x74,0x23,0x7a,0x5b,0xb0,0x74,0x1c,0x61, +0x84,0x74,0x1, 0x7a,0x5b,0xb0,0x61,0x84,0x7c,0xbe,0x14,0xbe,0xb0,0x75,0x40,0x2, +0x61,0x33,0x7e,0xa0,0x3, 0xa4,0x2e,0x54,0x1, 0x8c,0x89,0x54,0x2, 0x2, 0xfb,0x2, +0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xed,0x2, 0x2, +0xfb,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x2, 0xfb, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x25,0x2, 0x3, 0x33,0x2, 0x3, 0x9, 0x2, +0x2, 0xfb,0x2, 0x3, 0x17,0x2, 0x3, 0x17,0x2, 0x2, 0xfb,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, +0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33, +0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, +0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x3, 0x33,0x2, 0x2, 0xfb,0x41,0xfb,0x7e,0x34,0x1e, +0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d,0xe2,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79, +0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x61,0x3f,0x7e,0x34,0x1e,0x19,0x79,0x35,0x0, +0x2, 0x7e,0x34,0x1d,0xb2,0x61,0x3f,0x7e,0x34,0x1d,0x96,0x79,0x35,0x0, 0x2, 0x7e, +0x34,0x1d,0xc6,0x61,0x3f,0x7e,0x34,0x1e,0xa, 0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1d, +0xf1,0x61,0x3f,0x7e,0x34,0x1e,0x45,0x79,0x35,0x0, 0x2, 0x7e,0x34,0x1e,0x29,0x79, +0x35,0x0, 0x4, 0xbe,0xe0,0x16,0x28,0x2, 0x61,0x4e,0x7c,0xfe,0x61,0x62,0x7e,0xf0, +0x16,0xbe,0xe0,0x72,0x50,0x2, 0x61,0x62,0xa, 0x3e,0x9e,0x34,0x0, 0x72,0xb, 0x34, +0x2c,0xf7,0x7e,0x70,0x3, 0xac,0x7f,0x7d,0x23,0x2e,0x24,0x1e,0x69,0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x7a,0x5b,0xb0,0x2e,0x34,0x1e,0x6a,0x7a,0x71,0x82,0x7a, +0x61,0x83,0xe4,0x93,0x39,0xb5,0x0, 0x1, 0xda,0x79,0x22,0xca,0x3b,0x7f,0x30,0x74, +0x1, 0x12,0x13,0xde,0x29,0x73,0x0, 0xf3,0x2e,0x70,0xff,0x92,0x4, 0x29,0xb3,0x0, +0xf4,0x12,0x13,0xaf,0x7f,0x3, 0x12,0xd, 0x72,0x7f,0x3, 0x12,0x6, 0xba,0x29,0x73, +0x0, 0xa, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x24,0x29,0x73,0x0, 0xa3, +0xa, 0x27,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x69,0x33,0x0, 0xff,0x4d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2, 0x29,0x73, +0x0, 0xa, 0xa, 0x47,0x29,0x73,0x0, 0x5, 0xa, 0x57,0x9d,0x54,0xf5,0x35,0x29,0xb3, +0x0, 0xa5,0x70,0xb, 0x29,0xb3,0x0, 0xf8,0x29,0x73,0x0, 0xf7,0x12,0xb, 0xad,0x29, +0x73,0x0, 0xa5,0x2e,0x70,0xff,0x92,0x4, 0xe5,0x35,0x12,0xb, 0x1e,0x69,0x33,0x0, +0xfd,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x28,0x69,0x23,0x0, 0xfb,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x29,0x73,0x0, 0xfa,0xa, 0x37,0x2d, +0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2a,0x29,0x73,0x0, 0xf9,0xa, 0x37,0x7e, +0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2c,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xc8,0x79, +0x30,0x0, 0x34,0x7e,0x34,0x1, 0xb, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x2e,0x29, +0x73,0x0, 0x5, 0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x10,0x69,0x33,0x0, +0xa8,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1c,0x69,0x33,0x0, 0xaa,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x1e,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x69,0x13,0x1, 0x1, +0x2d,0x12,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x7e,0xf, 0x38,0xc8,0x2d,0x12,0x79, +0x30,0x0, 0x44,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0xda,0x3b,0x22,0xca,0xf8,0x7f, +0x70,0x7e,0x7b,0xf0,0x29,0x77,0x0, 0x1, 0xbc,0x7f,0x28,0x2, 0x7c,0xf7,0x69,0x17, +0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff,0x12,0x20,0xde,0x7f,0x7, 0x12, +0xe, 0xed,0xa9,0xd6,0xcb,0x6c,0xaa,0x80,0x2d,0x6c,0x77,0x80,0x1f,0x7e,0x10,0xb, +0xac,0x1a,0xa, 0x17,0x2d,0x1, 0x3e,0x4, 0x69,0x17,0x0, 0x6, 0x2d,0x10,0x6d,0x0, +0xb, 0xa, 0x20,0x6e,0x24,0xff,0xff,0x1b,0xa, 0x20,0xb, 0x70,0x29,0x67,0x0, 0x1, +0xbc,0x67,0x38,0xd9,0xb, 0xa0,0x7e,0x7b,0x60,0xbc,0x6a,0x38,0xcc,0x69,0x37,0x0, +0x6, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x4, 0x7c,0x4f,0x6c,0x55,0xa, 0x3f,0x2d, +0x32,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xf, 0x45,0x6c,0xaa,0xbe,0xa0,0x4, 0x50,0x18, +0x7e,0x70,0x4, 0xac,0x7a,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x26,0x60, +0x42,0x1e,0x44,0x14,0x78,0xfb,0x80,0x3b,0xbe,0xa0,0x8, 0x50,0x1b,0xa, 0x3a,0x1b, +0x36,0x3e,0x34,0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x28,0x60, +0x22,0x1e,0x44,0x14,0x78,0xfb,0x80,0x1b,0xa, 0x3a,0x9e,0x34,0x0, 0x8, 0x3e,0x34, +0x3e,0x34,0x7c,0xb7,0x7e,0x1f,0x39,0xd, 0x69,0x41,0x0, 0x2a,0x60,0x5, 0x1e,0x44, +0x14,0x78,0xfb,0x5e,0x44,0x0, 0xf, 0x7e,0x50,0x2, 0xac,0x5a,0x69,0x37,0x0, 0x6, +0x2d,0x32,0x6d,0x22,0x1b,0x1a,0x40,0xb, 0xa0,0xbe,0xa0,0xb, 0x40,0x8d,0xa9,0xc6, +0xcb,0xda,0xf8,0x22,0x29,0x70,0x0, 0x96,0x29,0x90,0x0, 0x98,0x29,0x60,0x0, 0x97, +0x29,0x80,0x0, 0x8d,0xbe,0x80,0x4, 0x38,0x4, 0x6c,0xaa,0x80,0x21,0xbe,0x80,0x8, +0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x80,0x10,0x38,0x5, 0x7e,0xa0,0x2, 0x80, +0xd, 0xbe,0x80,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, 0x7e,0xa0,0x4, 0xbe,0x90, +0x3, 0x28,0x3, 0x7e,0x90,0x3, 0xbe,0x80,0x3f,0x28,0x3, 0x7e,0x80,0x3f,0xbe,0x60, +0x1, 0x28,0x3, 0x7e,0x60,0x1, 0xbe,0x70,0x2, 0x28,0x2, 0x6c,0x77,0xa, 0x28,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7c,0x89,0x6c,0x99,0x3e,0x44,0x3e, +0x44,0x3e,0x44,0x2d,0x42,0xa, 0x26,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d, +0x24,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x2, 0x29,0xb0,0x0, 0x8c,0x7c,0x4b,0x6c,0x55,0x29,0xb0,0x0, 0x8b,0xa, 0x3b,0x2d, +0x32,0x7e,0x7f,0x38,0xc0,0x79,0x37,0x0, 0x80,0x69,0x30,0x0, 0xa0,0x7e,0x7f,0x38, +0xf7,0x79,0x37,0x0, 0xc, 0x69,0x30,0x0, 0x9e,0x5e,0x34,0xe0,0xf, 0x29,0xb0,0x0, +0x8c,0xa, 0x2b,0x1b,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x32,0x7e, +0x7f,0x38,0xc0,0x79,0x37,0x0, 0x82,0xa, 0x2a,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x29,0xb0,0x0, 0x99,0xa, 0x3b,0x2d,0x32,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, +0x6, 0x69,0x30,0x0, 0x9c,0x7e,0x7f,0x38,0xf7,0x79,0x37,0x0, 0x8, 0x69,0x30,0x0, +0x9a,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0xa, 0x22,0x7f,0x60,0x74,0x1, 0x12,0x13, +0xde,0x29,0x36,0x0, 0xf5,0x29,0x26,0x0, 0xa3,0x29,0x16,0x0, 0xa4,0xbe,0x20,0x2, +0x28,0x3, 0x7e,0x20,0x2, 0xbe,0x10,0x40,0x28,0x3, 0x7e,0x10,0x40,0x7e,0x34,0x0, +0x4, 0x7c,0xb2,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0x7, 0xa, 0x31,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x12,0x7c,0x73,0xac,0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c, +0x27,0xa, 0x32,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x14,0x7c,0x73,0xac,0x70,0x29, +0x26,0x0, 0xf6,0xa, 0x22,0xad,0x32,0xa, 0x21,0x8d,0x32,0x7d,0x43,0x7c,0x73,0xac, +0x70,0xa, 0x21,0x12,0x1e,0xb9,0x7c,0xa7,0x7c,0x2a,0x7c,0xb9,0x2c,0xab,0xbe,0xa0, +0xc, 0x50,0x3, 0x7e,0xa0,0xc, 0xbe,0x20,0xc, 0x50,0x3, 0x7e,0x20,0xc, 0xa, 0x20, +0xa, 0x31,0x12,0x1e,0xb9,0x7d,0xe3,0xa, 0x3a,0xb, 0x34,0xad,0x3e,0xb, 0x34,0xbe, +0x34,0x2, 0x0, 0x40,0x4, 0x7e,0x34,0x1, 0xff,0x29,0x46,0x0, 0xf7,0x7e,0x50,0x2, +0xac,0x45,0xa, 0xf2,0xad,0xfe,0x2d,0x2f,0xb, 0x24,0xbe,0x24,0x2, 0x0, 0x40,0x4, +0x7e,0x24,0x1, 0xff,0xa, 0x13,0x7e,0x7f,0x38,0xc8,0x79,0x17,0x0, 0xa, 0x1e,0x24, +0x7c,0x45,0x6c,0x55,0x1e,0x34,0x2d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0xc, +0xa, 0x3a,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32, +0x0, 0x8, 0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d, +0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e, +0xf, 0x39,0xd, 0x79,0x30,0x0, 0xe, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xe0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xb2,0x86,0x22,0xff,0xff, +0x7f,0x21,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, +0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, +0x6, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c, +0x55,0x7e,0xb, 0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xc, +0x29,0x70,0x0, 0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xa, +0x69,0x30,0x0, 0xa, 0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, +0x7e,0x7f,0x39,0xd, 0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x39,0xd, +0x79,0x37,0x0, 0x12,0x29,0x70,0x0, 0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x39,0xd, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0,0x12,0xf, 0x45,0x7e,0x1f,0x39,0xd, 0x69,0x11, +0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11,0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, +0x16,0x79,0x12,0x0, 0x2, 0x69,0x11,0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, +0x22,0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, +0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31,0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb, +0x22,0xca,0x3b,0x7c,0x57,0x7c,0x4b,0x5e,0x40,0x3, 0x69,0x30,0x0, 0x4, 0x5e,0x60, +0x3f,0x6c,0xaa,0xa, 0x4a,0x69,0xf0,0x0, 0xa, 0x69,0xe0,0x0, 0x8, 0x2d,0xf4,0x7e, +0x7b,0xb0,0xa, 0xfb,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0xa, 0xea,0x69,0xd0, +0x0, 0xe, 0x69,0xc0,0x0, 0xc, 0x2d,0xde,0x7e,0x6b,0xb0,0xa, 0x4b,0x2d,0x4f,0x7e, +0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, 0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0, +0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38,0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x8c,0xb, 0xa0, +0xbe,0xa0,0xe, 0x78,0xae,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x69,0xf0,0x0, 0x2, +0xb, 0xa, 0xe0,0x2d,0xf4,0xb, 0x7a,0x40,0x7e,0xd0,0x28,0xac,0xd5,0x7e,0xf0,0x2, +0xac,0xfa,0x7d,0xd7,0x2d,0xd6,0x7e,0xf0,0xf0,0xac,0xf4,0x2d,0xd7,0x7e,0x7f,0x38, +0xf3,0x2d,0xfd,0x79,0x47,0x1, 0x80,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xc9,0x7e,0x90, +0xf0,0xac,0x94,0x74,0x28,0xac,0xb5,0x7d,0xf5,0x2d,0xf4,0x7e,0x2f,0x38,0xf3,0x2d, +0x5f,0x79,0x32,0x1, 0x88,0x69,0x30,0x0, 0x6, 0x7e,0x30,0xf0,0xac,0x34,0x74,0x28, +0xac,0x5b,0x2d,0x21,0x7e,0xf, 0x38,0xf3,0x2d,0x12,0x79,0x30,0x1, 0x8a,0xda,0x3b, +0x22,0x29,0x60,0x0, 0xb, 0xa, 0x46,0x29,0x60,0x0, 0x4, 0xa, 0x26,0x2d,0x24,0x7c, +0x65,0x29,0xb0,0x0, 0x6, 0xbc,0xb6,0x28,0x2, 0x7c,0x6b,0x29,0x70,0x0, 0x5, 0x29, +0xb0,0x0, 0x7, 0xbc,0xb7,0x28,0x2, 0x7c,0x7b,0x6c,0xaa,0x6d,0x22,0x7e,0x90,0x2, +0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0x79,0x27,0x0, 0x2, 0xb, 0xa0,0xbe,0xa0, +0x23,0x78,0xea,0x6c,0xaa,0x80,0x55,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x57,0x0, +0x4c,0xbe,0x50,0x23,0x50,0x23,0x29,0x47,0x0, 0xb4,0xa, 0xd4,0x7d,0x4d,0x7c,0x89, +0x6c,0x99,0x7d,0xd4,0x7e,0x90,0x2, 0xac,0x95,0x7e,0x7f,0x38,0xc0,0x2d,0xf4,0xb, +0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xa, 0x4a,0x7f,0x70,0x2d,0xf4,0x29, +0x47,0x0, 0x4c,0xa, 0xd4,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xc0,0x2d,0xf4, +0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b,0x7a,0x40,0xb, 0xa0,0xbc,0x6a,0x38,0xa7, +0x6c,0xaa,0x80,0x1d,0xa, 0x2a,0x7f,0x70,0x2d,0xf2,0x29,0x67,0x0, 0x6f,0xa, 0x46, +0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xc0,0x2d,0xf2,0x79,0x47,0x0, 0x48,0xb, +0xa0,0xbc,0x7a,0x38,0xdf,0x22,0x7c,0x7b,0x7e,0x7f,0x38,0xc8,0x69,0x47,0x0, 0xc, +0x6c,0x88,0x3e,0x44,0x69,0x7, 0x0, 0xa, 0x69,0x57,0x0, 0x2, 0x1e,0x54,0x1e,0x54, +0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x3, 0x7e,0x14, +0x0, 0x4, 0x70,0x2, 0x41,0x9b,0x3e,0x14,0x14,0x78,0xfb,0x7c,0xa3,0xa, 0xda,0xad, +0xd0,0x7d,0xcd,0x6d,0x11,0x79,0x17,0x0, 0x8c,0x7c,0xb7,0x70,0x2, 0x41,0xb4,0x1e, +0xd4,0x14,0x78,0xfb,0xbe,0xd4,0x1, 0x0, 0x38,0x2, 0x41,0xc2,0x7e,0xd4,0x1, 0x0, +0x41,0xce,0xbe,0xd4,0x0, 0x10,0x40,0x2, 0x41,0xce,0x7e,0xd4,0x0, 0x10,0x7d,0x3d, +0x12,0x12,0x6a,0xa, 0x1b,0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, 0x90,0x7e,0x1f,0x38, +0xc8,0x79,0xd1,0x0, 0x8e,0x7e,0x7f,0x38,0xc8,0x69,0x37,0x0, 0x8, 0xad,0x3c,0x8d, +0x3d,0x79,0x37,0x0, 0x92,0x7e,0x14,0x0, 0x6, 0x7e,0x1f,0x38,0xc8,0x79,0x11,0x0, +0x94,0x7d,0x24,0x9d,0x20,0xa, 0x3a,0xad,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x96,0x7e,0x34,0x0, 0x10,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x98,0x22,0x7c,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x40,0x0, 0x22,0x30,0x4, 0x6b,0x6d,0xff,0x7d,0x3f,0xbe, +0x50,0x10,0x28,0x2e,0x7e,0x54,0xff,0xff,0x79,0x50,0x0, 0x42,0x9e,0x50,0x10,0x6c, +0xaa,0x80,0x11,0x7e,0xe4,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0xe4,0x14,0x78,0xfb, +0x2d,0x3e,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e,0x6f,0x38,0xc8,0x79,0x36,0x0, 0x40, +0x80,0x25,0x79,0xf0,0x0, 0x40,0x6c,0xaa,0x80,0x11,0x7e,0xf4,0x0, 0x1, 0x7c,0xba, +0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x2d,0x3f,0xb, 0xa0,0xbc,0x5a,0x38,0xeb,0x7e, +0x7f,0x38,0xc8,0x79,0x37,0x0, 0x42,0x7d,0x34,0x2e,0x34,0x0, 0xc, 0x7e,0x7f,0x38, +0xc8,0x79,0x37,0x0, 0x16,0x22,0x6d,0x33,0x79,0x30,0x0, 0x40,0x7e,0xf, 0x38,0xc8, +0x79,0x30,0x0, 0x42,0x7e,0x1f,0x38,0xc8,0x79,0x41,0x0, 0x16,0x22,0x7c,0x17,0x7c, +0x3b,0x6d,0x33,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x40,0x7e,0x2f,0x38,0xc8,0x79, +0x32,0x0, 0x42,0x7e,0x7f,0x38,0xc8,0x69,0x57,0x0, 0x12,0x7c,0xab,0x69,0x37,0x0, +0x2, 0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x5e, +0x34,0x0, 0x3, 0x7c,0xb7,0x7e,0x44,0x0, 0x4, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb, +0x7c,0x29,0xa, 0x22,0xa, 0x3a,0x12,0x1e,0xb9,0xa, 0x23,0x2d,0x32,0x7c,0xb7,0x7c, +0x61,0x6c,0x77,0xa, 0xb, 0x1e,0x4, 0x2d,0x3, 0x79,0x7, 0x0, 0xc, 0x7c,0x73,0xac, +0x72,0xa, 0x2a,0x12,0x1e,0xb9,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x16,0x6d,0x33, +0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x22,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x8, 0x29,0x70,0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, +0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, +0xa, 0x29,0x70,0x0, 0x4, 0xa, 0x37,0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0xe, 0x29, +0xb0,0x0, 0x5, 0x54,0x1, 0x7c,0x2b,0x6c,0x33,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10, +0x7e,0x34,0x0, 0xc0,0x12,0xf, 0x45,0xa9,0xc6,0xcb,0x22,0xca,0x79,0x7c,0xab,0x5e, +0xa0,0x3, 0x6c,0x77,0x7e,0x50,0x2, 0xac,0x57,0x69,0xd0,0x0, 0xe, 0x69,0xc0,0x0, +0xc, 0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6,0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d, +0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e,0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54,0xb, 0x70,0xbe,0x70,0xe, 0x40,0xc4, +0x69,0x40,0x0, 0x4, 0x7e,0xf0,0xf0,0xac,0xfa,0x7e,0x1f,0x38,0xf3,0x2d,0x37,0x79, +0x41,0x2, 0x50,0x69,0x30,0x0, 0x6, 0x74,0xf0,0xa4,0x7e,0xf, 0x38,0xf3,0x2d,0x15, +0x79,0x30,0x2, 0x52,0xda,0x79,0x22,0xa9,0xd6,0xcb,0xc2,0x19,0x69,0x30,0x0, 0x4, +0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x39,0xd, +0x79,0x32,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x32,0x0, 0x8, +0x7e,0xb, 0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e, +0x2f,0x39,0xd, 0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x39, +0xd, 0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4, +0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xf, 0x45,0xa9,0xc6, +0xcb,0x22,0x69,0x30,0x0, 0xae,0x7e,0x2f,0x38,0xc8,0x79,0x32,0x0, 0x6, 0x29,0x50, +0x0, 0xa6,0xa, 0x55,0x7d,0x23,0x1e,0x24,0x9d,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22, +0x0, 0x18,0x7d,0x23,0x1e,0x24,0x1b,0x25,0x7e,0x2f,0x38,0xc8,0x79,0x22,0x0, 0x38, +0x69,0x20,0x0, 0xfd,0x1e,0x34,0x9d,0x32,0x9e,0x34,0x0, 0xa, 0x7e,0x2f,0x38,0xc8, +0x79,0x32,0x0, 0x26,0x29,0x70,0x0, 0xa7,0xa, 0x37,0x7e,0x2f,0x38,0xc8,0x79,0x32, +0x0, 0x1a,0x29,0x70,0x0, 0xb, 0xa, 0x27,0x29,0x70,0x0, 0x4, 0x2d,0x32,0x7e,0x2f, +0x38,0xc8,0x79,0x32,0x0, 0x8, 0x2, 0x9, 0xa1,0xca,0x3b,0xf5,0x24,0x7f,0x41,0x7f, +0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0xe5,0x24,0xbe,0xb0,0x23,0x28, +0x3, 0x75,0x24,0x23,0x6c,0xaa,0x80,0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b, +0xb0,0xbe,0xb1,0x26,0x40,0xd, 0x74,0x23,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, +0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, 0x3b,0x2e,0x35,0x28,0x7a,0x71,0x82,0x7a,0x61, +0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13,0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24, +0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f, +0x39,0xd, 0x79,0x22,0x0, 0x4, 0x69,0x20,0x0, 0x8, 0x7e,0x2f,0x39,0xd, 0x79,0x22, +0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55,0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25, +0x2d,0x25,0x7e,0x2f,0x39,0xd, 0x79,0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25, +0x7e,0xf, 0x39,0xd, 0x79,0x20,0x0, 0xe, 0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0xa, +0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xf, 0x45, +0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x38,0xf7,0x79,0x30, +0x0, 0xe, 0xc2,0x18,0xe4,0x7a,0xb3,0x38,0xf2,0x5e,0xa0,0x3, 0xa, 0x1a,0x3e,0x14, +0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, +0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x74,0x1, 0x12,0x13,0x56,0x7e,0xf, 0x38, +0xf7,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xa9,0xd3,0xcd,0x7e,0xf, 0x38, +0xf7,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x22,0x7f,0x10,0xa9, +0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x4, 0x69,0x11, +0x0, 0x4, 0x7e,0x2f,0x39,0xd, 0x79,0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f, +0x39,0xd, 0x79,0x12,0x0, 0x8, 0x7e,0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad, +0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xf, +0x45,0xa9,0xc6,0xcb,0x22,0xa9,0xd7,0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x39, +0xd, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x39,0xd, 0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, 0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7, +0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0xd2,0x19,0x7e,0xf, 0x39,0xd, 0xb, 0xa, 0x30, +0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe,0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x39,0xd, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0xf5,0x24, +0x7f,0x41,0x7f,0x30,0xe5,0x25,0x7e,0x8, 0x0, 0x26,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x36,0xa, 0x3a,0x2d,0x39,0x7d,0x28,0x7e,0x1b,0xb0,0xbe,0xb1,0x27,0x40,0xd, 0x74, +0x1c,0xa, 0x4a,0x7f,0x3, 0x2d,0x14,0x7a,0xb, 0xb0,0x80,0x19,0x7e,0x1b,0xb0,0xa, +0x3b,0x2e,0x35,0x2a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0xa, 0x4a,0x7f,0x13, +0x2d,0x34,0x7a,0x1b,0xb0,0xb, 0xa0,0xe5,0x24,0xbc,0xba,0x38,0xc4,0xda,0x3b,0x22, +0x5, 0x63,0x31,0x20,0x18,0x13,0xf, 0xd, 0xc, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, +0xca,0xf8,0x7d,0xe2,0x7d,0xd3,0x7c,0xfb,0xbe,0x30,0x1, 0x28,0x6, 0x7e,0xf4,0x0, +0x10,0x80,0xf, 0xbe,0x30,0x0, 0x28,0x6, 0x7e,0xf4,0x0, 0x8, 0x80,0x4, 0x7e,0xf4, +0x0, 0x4, 0x7d,0x1f,0x6d,0x0, 0x6d,0x33,0x7e,0x24,0x0, 0x10,0x12,0x1f,0x58,0x7f, +0x1, 0x7d,0x3d,0x6d,0x22,0x12,0x1e,0xeb,0x7d,0x1e,0x12,0x1f,0x5, 0x74,0x4, 0xac, +0xbf,0x7e,0xf, 0x38,0xc8,0x2d,0x15,0x79,0x30,0x0, 0x82,0x79,0x20,0x0, 0x80,0xda, +0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, +0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xd2,0x18,0x7e,0xf, 0x38,0xf7,0xb, 0xa, 0x30,0x7c, +0x57,0x7a,0x53,0x38,0xf2,0x4e,0x70,0xc, 0x1b,0xa, 0x30,0xc2,0xc6,0x6d,0x33,0x7e, +0xf, 0x38,0xf7,0x79,0x30,0x0, 0xe, 0x12,0x12,0x9e,0x12,0x7f,0x5, 0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x74,0x3, 0x12,0x13,0x56,0xa9,0xd1,0xc4,0x7e,0xf, 0x38,0xc0,0x2e,0x14, +0x0, 0x84,0xb, 0xa, 0x30,0x4e,0x70,0x20,0x1b,0xa, 0x30,0x7e,0x14,0x0, 0x1, 0x7e, +0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e,0xf, 0x38,0xc8,0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0xc2,0xb, 0xe4,0x7a,0xb3,0x38,0xd8,0x7e,0x1f,0x38,0xc0, +0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0x74,0x2, 0x2, 0x13,0x56,0x7c,0x6b, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x7e,0x7f,0x38,0xf3,0x2d,0xf4,0xb, +0x7a,0x20,0x7f,0x70,0x2d,0xf4,0x1b,0x7a,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xe5,0x6c, +0xaa,0x80,0x20,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27, +0x0, 0x38,0xa, 0xf7,0xa, 0x4a,0x2d,0x4f,0x3e,0x44,0x7f,0x70,0x2d,0xf4,0x1b,0x7a, +0x20,0xb, 0xa0,0xbc,0x6a,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x5e,0xa0,0x3, 0x6c, +0x77,0x7e,0x50,0x2, 0xac,0x57,0x7f,0x60,0x2d,0xd2,0x29,0x66,0x0, 0x1, 0xa, 0xf6, +0x7d,0x4f,0x7c,0x89,0x6c,0x99,0x7d,0xf4,0x7e,0x6b,0x60,0xa, 0x46,0x2d,0x4f,0x7e, +0xf0,0xf0,0xac,0xfa,0x2d,0x27,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x79,0x47,0x2, 0x54, +0xb, 0x70,0xbe,0x70,0xe, 0x40,0xca,0xda,0x79,0x22,0x29,0x50,0x0, 0xf5,0xac,0x5b, +0x7e,0xf, 0x38,0xc8,0x69,0x30,0x0, 0xc, 0xa, 0x56,0x3e,0x54,0xbe,0x24,0x2, 0x0, +0x40,0x4, 0x7e,0x24,0x1, 0xff,0xbd,0x25,0x28,0x1f,0x2e,0x14,0x0, 0xc, 0x6c,0x66, +0x1b,0xa, 0x30,0x1e,0x24,0x7c,0x45,0x6c,0x55,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, +0xc, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50, +0x28,0xac,0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d, +0x24,0x7e,0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x44,0xa, 0x4a,0x7f, +0x60,0x2d,0xd4,0x7e,0x6b,0xb0,0x7c,0x8b,0x6c,0x99,0x4d,0x24,0x79,0x27,0x1, 0x8c, +0xb, 0xa0,0xbe,0xa0,0xe, 0x40,0xc7,0x22,0x7c,0x6b,0x6c,0xaa,0x7e,0x50,0x28,0xac, +0x57,0x7e,0x90,0x2, 0xac,0x9a,0x2d,0x42,0x7e,0x50,0xf0,0xac,0x56,0x2d,0x24,0x7e, +0x7f,0x38,0xf3,0x2d,0xf2,0x69,0x27,0x1, 0x8c,0x6c,0x55,0xa, 0x4a,0x7f,0x60,0x2d, +0xd4,0x7e,0x6b,0xb0,0xa, 0x4b,0x4d,0x24,0x79,0x27,0x1, 0x8c,0xb, 0xa0,0xbe,0xa0, +0xe, 0x40,0xc9,0x22,0xa9,0xd6,0xcb,0x54,0x3f,0x5e,0x70,0x1f,0x7c,0x2b,0x6c,0x33, +0x3e,0x14,0x3e,0x14,0x2e,0x14,0x0, 0x5, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x2d,0x31,0x7e,0xf, 0x39,0xd, 0x79,0x30,0x0, 0x2, 0x7e,0xf, +0x39,0xd, 0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x22,0x7d,0x23,0x6c,0x66,0x7e,0x30, +0x2, 0xac,0x36,0x2e,0x14,0x20,0x8f,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xa, +0x1b,0xbd,0x12,0x28,0x7, 0xb, 0x60,0xbe,0x60,0x14,0x40,0xe2,0x7e,0x70,0x2, 0xac, +0x67,0x2e,0x34,0x20,0x90,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xf, +0x38,0xc0,0x2e,0x14,0x0, 0x84,0xb, 0xa, 0x30,0x5e,0x70,0xdf,0x1b,0xa, 0x30,0x74, +0x3, 0x12,0x13,0x56,0x7e,0x14,0x0, 0x3, 0x7e,0x1f,0x38,0xc0,0x1b,0x1a,0x10,0x7e, +0x1f,0x38,0xc0,0xb, 0x1a,0x30,0x5e,0x34,0x0, 0x1, 0x78,0xf3,0xe4,0x2, 0x13,0x56, +0x2e,0x34,0x4, 0x0, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x60,0x7e,0x34,0x4, 0x0, +0x9d,0x32,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x62,0x7e,0x34,0x0, 0x1, 0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x64,0xa, 0x3b,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x66, +0x22,0x7c,0xa5,0xbe,0x34,0x0, 0x0, 0x28,0x10,0xa, 0x1b,0x3e,0x14,0x7d,0x23,0x7c, +0x45,0x6c,0x55,0x2d,0x21,0xa, 0x3a,0x80,0x8, 0xa, 0x2b,0x3e,0x24,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x38,0xf7,0x79,0x30,0x0, 0x4, 0x22,0x7c,0xa7,0x7e,0x1f, +0x38,0xc0,0x69,0x41,0x0, 0x8a,0x5e,0x44,0x10,0xf, 0xa, 0x1a,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x3e,0x14,0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x2d,0x51,0x4d, +0x45,0x79,0x41,0x0, 0x8a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x84,0x5e,0x70, +0xe7,0x1b,0xb1,0x68,0xc, 0x14,0x68,0xc, 0xb, 0xb1,0x78,0x5, 0x4e,0x70,0x10,0x80, +0x3, 0x4e,0x70,0x8, 0x79,0x30,0x0, 0x84,0x22,0x7e,0x34,0x0, 0x1f,0x7e,0xf, 0x38, +0xc8,0x79,0x30,0x0, 0x4, 0xa9,0xd2,0xcd,0x7e,0xf, 0x38,0xc8,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x22,0xbe,0xb0,0x0, 0x28,0xa, 0xa9,0xd7,0xca,0xa9,0xd3, +0xcb,0xa9,0xd2,0xcb,0x22,0xa9,0xc7,0xca,0xa9,0xc3,0xcb,0xa9,0xc2,0xcb,0x22,0x30, +0x4, 0xa, 0x54,0x3, 0xa, 0x3b,0x2e,0x34,0x2, 0x0, 0x80,0x2, 0x6d,0x33,0x7e,0xf, +0x38,0xc8,0x79,0x30,0x0, 0x3a,0x22,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8a,0x60, +0x5, 0x4e,0x60,0x10,0x80,0x3, 0x5e,0x60,0xef,0x79,0x30,0x0, 0x8a,0x22,0xbe,0xb0, +0x0, 0x28,0x9, 0xa9,0xd6,0xca,0xd2,0xcd,0xa9,0xd1,0xcb,0x22,0xa9,0xc6,0xca,0xc2, +0xcd,0xa9,0xc1,0xcb,0x22,0x7e,0x34,0x0, 0xf, 0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, +0x4, 0xc2,0xc3,0xd2,0xeb,0x22,0x6, 0xe, 0x15,0x1a,0x1f,0x26,0x2b,0x2d,0x2e,0x2f, +0x2c,0x2a,0x24,0x1f,0x1a,0x14,0xf, 0x8, 0x3, 0x3, 0x6, 0xb, 0x10,0x15,0x1c,0x22, +0x28,0x2d,0x34,0x39,0x3d,0x40,0xe, 0x3, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x11,0x16, +0x1c,0x23,0x2b,0x32,0x37,0x3c,0x40,0x45,0x4a,0x4d,0x4c,0x4b,0x4a,0x48,0x46,0x46, +0x45,0x45,0x44,0x44,0x43,0x44,0x45,0x78,0x65,0x55,0x2, 0xd, 0x14,0x1b,0x21,0x25, +0x2b,0x31,0x37,0x36,0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, +0x10,0x18,0x1e,0x23,0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1, 0x4, 0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40, +0x3f,0x3e,0x3d,0x3d,0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29, +0x27,0x1e,0x14,0x11,0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21, +0x2b,0x32,0x30,0x2a,0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, +0x10,0x19,0x23,0x2d,0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71, +0x50,0x55,0x28,0x12,0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39, +0x31,0x28,0x1e,0x15,0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32, +0x37,0x39,0x20,0x29,0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, +0x1, 0x0, 0x1, 0x5, 0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c, +0x34,0x31,0x26,0xcb,0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31, +0x2e,0x2d,0x35,0x3d,0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, +0x10,0x1b,0x24,0x2f,0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d, +0x28,0x31,0x34,0x2a,0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40, +0x47,0x47,0x44,0x3c,0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b, +0x22,0x2d,0x30,0x2e,0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, +0x0, 0x0, 0x3, 0xb, 0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26, +0x1b,0x14,0x1c,0x25,0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c, +0x25,0x30,0x38,0x40,0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c, +0x29,0x1e,0x14,0x13,0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39, +0x30,0x25,0x1b,0x10,0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a, +0x23,0x2f,0x33,0x29,0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, +0x2, 0x0, 0x1, 0x8, 0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e, +0x50,0x55,0x16,0x2b,0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36, +0x3b,0x3d,0x3b,0x37,0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33, +0x3d,0x3f,0x13,0x21,0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37, +0x2d,0x22,0x18,0xc, 0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38, +0x2e,0x2a,0x31,0x62,0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, +0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26, +0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b, +0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48, +0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x9, 0x17,0x1d,0x26,0x2e,0x37, +0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, +0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30,0x2f,0x2c,0x26,0x1e, +0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c,0x32,0x3a,0x41,0x48, +0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c,0x33,0x55,0x26,0x1c, +0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18,0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, +0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44,0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49, +0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f,0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54, +0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, 0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c, +0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22,0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c, +0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a,0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32, +0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, 0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, +0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22, +0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, 0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39, +0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68,0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70, +0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80,0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10, +0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, +0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39,0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24, +0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50,0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff, +0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a,0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, +0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18,0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22, +0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33,0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29, +0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d,0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26, +0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10,0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b, +0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, 0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19, +0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22,0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39, +0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34,0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, +0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18,0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37, +0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e, +0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21, +0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c, +0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, +0x0, 0x2, 0x5, 0x9, 0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f, +0x3d,0x38,0x30,0x27,0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36, +0x3f,0x49,0x53,0x5c,0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b, +0x15,0xb, 0x4, 0x0, 0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c, +0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, +0x6, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, +0x8, 0xe, 0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58, +0x51,0x48,0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf, +0x30,0x55,0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28, +0x30,0x38,0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16, +0xf, 0xc, 0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, +0x3, 0xa, 0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a, +0x58,0x57,0xc6,0x55,0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38, +0x3c,0x3e,0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, +0xd, 0x17,0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57, +0x4f,0x47,0x40,0x38,0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, +0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f, +0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22, +0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25, +0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f, +0x3d,0x3a,0x36,0x2e,0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0x9, 0xe, 0x14,0x1c,0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a, +0x10,0x9, 0x4, 0x0, 0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47, +0x4f,0x56,0x5a,0x5b,0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9, +0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e, +0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25, +0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25, +0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d, +0x3a,0x34,0x2d,0x27,0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, +0xa, 0xf, 0x15,0x1b,0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11, +0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36, +0x3c,0x42,0x47,0x48,0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, +0x0, 0x1, 0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29, +0x22,0x1b,0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c, +0x24,0x2a,0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, +0x4, 0x7, 0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b, +0x38,0x31,0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35, +0x3d,0x45,0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17, +0x11,0x9, 0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6, +0x30,0x55,0xa, 0x5, 0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3c,0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, +0x1, 0x2, 0x35,0x46,0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37, +0x2e,0x25,0x1e,0x16,0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39, +0x41,0x45,0xf0,0xbc,0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28, +0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, +0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d, +0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19, +0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36, +0x2f,0x27,0x21,0x19,0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10, +0x16,0x1f,0x26,0x2d,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d, +0x56,0x59,0x5a,0x58,0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, +0x0, 0x0, 0x1, 0x3, 0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38, +0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, +0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40, +0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3, +0x30,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, +0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f, +0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40, +0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32, +0x39,0x3e,0x7, 0x90,0x30,0x55,0x39,0x2b,0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, +0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b,0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f, +0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, 0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24, +0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b,0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65, +0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a,0x46,0x55,0x0, 0x1, 0x3, 0x5, 0x7, 0x8, +0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22,0x24,0x27,0x2a,0x2c, +0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, 0x14,0x1b,0x23,0x28, +0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53,0x4e,0x47,0x40,0x3b, +0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, +0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x1c,0x1d,0x1e,0x1f,0x20, +0x21,0x22,0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xe, +0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x0, 0x1, 0x2, 0x3, 0x4, 0x1c,0x1d,0x1e, +0x1f,0x20,0x0, 0x1, 0x2, 0x3, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, +0x18,0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11, +0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x6, 0x5, 0x4, 0x3, 0x2, 0x1, +0x0, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x9, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16, +0x17,0x18,0x19,0x1a,0x1b,0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xa, +0xb, 0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a, +0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x0, 0x1, 0x1, 0x1, 0x10,0x1c,0x2, 0x10, +0x1c,0x0, 0x1, 0x1, 0x4, 0xf, 0x1c,0x0, 0x1, 0x1, 0x6, 0x1b,0xf, 0x7, 0xe, 0x1c, +0x8, 0x23,0x15,0x0, 0x1, 0x1, 0xa, 0x10,0x19,0xb, 0x14,0x1c,0xc, 0xf, 0x18,0x0, +0x1, 0x1, 0xe, 0x23,0x15,0xf, 0xd, 0x19,0x0, 0x1, 0x1, 0x11,0xd, 0x14,0x12,0x10, +0x19,0x13,0x1c,0x10,0x14,0x1a,0x10,0x15,0x10,0x19,0x16,0x23,0x1c,0x72,0x23,0x15, +0x73,0x23,0x1c,0x74,0x23,0x1c,0x75,0xe, 0x1c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, +0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e, +0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d, +0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d, +0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31, +0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78, +0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11, +0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78, +0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, +0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d, +0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2, +0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x12,0x1f,0x7, 0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12, +0x1f,0x7, 0x30,0xd5,0x6, 0x9f,0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11, +0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15, +0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d, +0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e,0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, +0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18,0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78, +0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x3f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x39,0x13,0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x2, 0x75,0xf, +0x0, 0xc2,0x6, 0xc2,0x7, 0x75,0x1b,0x0, 0xc2,0xc, 0xc2,0xd, 0xc2,0xf, 0x75,0x1c, +0x0, 0x75,0x1d,0x0, 0xc2,0x8, 0xc2,0x9, 0x75,0x1e,0x0, 0xc2,0x11,0x75,0x1f,0x0, +0xc2,0x13,0x75,0x4c,0x0, 0xc2,0x14,0x75,0x4d,0x64,0xc2,0x15,0xc2,0x16,0xc2,0x17, +0x75,0x4e,0x0, 0xd2,0x0, 0xd2,0x1, 0xd2,0x2, 0xd2,0x18,0xc2,0xa, 0xd2,0xb, 0x7e, +0x4, 0x0, 0xff,0x7e,0x14,0x21,0x10,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20, +0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24, +0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x36,0x72,0x0, 0x0, 0x0, 0x47,0x0, +0xcb,0x1, 0x0, 0x0, 0x10,0xfd,0xc7,0xfb,0x7e,0xfb,0xfb,0x1, 0xbb,0xc, 0x9e,0x19, +0x0, 0x21,0x45,0x0, 0xe, 0x1, 0xf, 0x2, 0x10,0x3, 0x11,0x4, 0x12,0x5, 0x13,0x6, +0x14,0x7, 0x15,0x8, 0x16,0x9, 0x17,0xa, 0x18,0xb, 0x19,0xc, 0x1a,0xd, 0x1b,0xdf, +0x22,0xc3,0x21,0xa9,0x20,0x94,0x1f,0x81,0x1e,0x70,0x1d,0x62,0x1c,0x55,0x1b,0x4a, +0x1a,0x41,0x19,0x38,0x18,0x31,0x17,0x2b,0x16,0x25,0x15,0x21,0x14,0x1c,0x13,0x19, +0x12,0x16,0x11,0x13,0x10,0x11,0xf, 0x10,0xe, 0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e, +0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b, +0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43, +0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x0, 0x4, 0x31,0xd0,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x33,0xff,0x1, 0x0, 0x1, 0x25, +0xf6,0x1, 0x0, 0x1, 0x37,0x9b,0x0, 0x0, 0x2, 0x37,0xed,0x0, 0x0, 0x0, 0x2, 0x37, +0xef,0x0, 0x0, 0x0, 0x1, 0x37,0xf1,0x0, 0x0, 0x1, 0x34,0x4f,0x0, 0x0, 0x1, 0x39, +0x11,0x0, 0x0, 0x1, 0x34,0x8a,0x0, 0x0, 0x2, 0x34,0x9f,0x0, 0x0, 0x0, 0x1, 0x34, +0xa1,0x0, 0x0, 0x1, 0x34,0xaf,0x0, 0x0, 0x1, 0x34,0xc4,0x0, 0x0, 0x1, 0x34,0xc5, +0x0, 0x0, 0x1, 0x35,0x3e,0x0, 0x0, 0x1, 0x35,0x3f,0x1, 0x0, 0x1, 0x35,0x40,0x0, +0x0, 0x3c,0x35,0xe9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x36,0x61,0x0, 0x0, 0x1, 0x36,0x62,0x0, 0x0, 0x1, 0x36,0x63,0x0, 0x0, +0x1, 0x35,0xe2,0x1, 0x0, 0x2, 0x35,0xe5,0x0, 0x0, 0x0, 0x1, 0x2f,0xa9,0x0, 0x0, +0x1, 0x2f,0xaa,0x0, 0x0, 0x1, 0x2f,0xab,0x0, 0x0, 0x1, 0x2f,0xac,0x0, 0x0, 0x1, +0x36,0x66,0x1, 0x0, 0x1, 0x36,0xe0,0x0, 0x0, 0x1, 0x39,0x12,0x0, 0x0, 0x6, 0x38, +0xfb,0x3f,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x39,0x1, 0x24,0x0, 0x1, 0x39,0x8, +0x0, 0x0, 0x1, 0x39,0x9, 0x0, 0x0, 0x1, 0x39,0xa, 0x0, 0x0, 0x1, 0x39,0xb, 0x0, +0x0, 0x1, 0x39,0xc, 0x0, 0x0, 0x1, 0x0, 0x4f,0x0, 0x0, 0x1, 0x3, 0xec,0x0, 0x0, +0x4, 0x37,0x40,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x39,0x2, 0x0, 0x0, 0x1, 0x39,0x3, +0x0, 0x0, 0x2, 0x39,0x4, 0x0, 0x0, 0x0, 0x1, 0x39,0x6, 0x64,0x0, 0x1, 0x39,0x7, +0x0, 0x0, 0x1, 0x39,0x13,0x0, 0x0, 0x1, 0x3, 0xfe,0x0, 0x0, 0x1, 0x3, 0xff,0x0, +0x0, 0x2, 0x2b,0xb9,0x2b,0xbf,0x0, 0x1, 0x2f,0x7f,0x2, 0x0, 0x1, 0x2f,0xa8,0x0, +0x0, 0x1, 0x38,0xdd,0x0, 0x0, 0x1, 0x38,0x3e,0xff,0x0, 0x1, 0x38,0x3f,0x0, 0x0, +0x1, 0x38,0x40,0x0, 0x0, 0x1, 0x38,0x41,0x40,0x0, 0x1, 0x38,0x42,0x40,0x0, 0x4, +0x38,0xf3,0x0, 0x0, 0x50,0x0, 0x0, 0x4, 0x38,0xf7,0x0, 0x0, 0x64,0x0, 0x0, 0x4, +0x38,0xc0,0x0, 0x0, 0x6c,0x0, 0x0, 0x4, 0x38,0xc4,0x0, 0x0, 0x68,0xc0,0x0, 0x4, +0x38,0xc8,0x0, 0x0, 0x68,0x0, 0x0, 0x4, 0x38,0xd9,0x0, 0x0, 0x40,0x0, 0x0, 0x4, +0x39,0xd, 0x0, 0x0, 0x60,0x0, 0x0, 0x0, 0x3, 0x20,0x0, 0xc, 0x1, 0xf4,0x2, 0x58, +0x0, 0xc, 0x1, 0x5e,0x1, 0xc2,0x0, 0xa, 0x0, 0xc8,0x1, 0x40,0x0, 0x5, 0x0, 0x78, +0x0, 0xc8,0x0, 0x4, 0x0, 0x3c,0x0, 0x78,0x0, 0x3, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, +0x0, 0x0, 0x0, 0xe, 0x1c,0x23,0x5, 0xdc,0x0, 0x32,0x3, 0xe8,0x0, 0x28,0x0, 0x0, +0x0, 0x1e,0x12,0x3f,0x13,0x12,0x69,0x8e,0x12,0x23,0xb, 0x12,0x28,0x48,0x12,0x8d, +0xec,0x2, 0x23,0x4, 0x74,0x1, 0x7a,0xb3,0x36,0x6a,0x22,0x12,0x73,0x71,0x12,0x23, +0x40,0x2, 0x23,0x14,0x7e,0x34,0x0, 0x3, 0x6d,0x22,0x2, 0x23,0x1d,0x7d,0x43,0x7e, +0xa3,0x34,0x38,0xbe,0xa0,0x5, 0x50,0x16,0x7e,0x70,0x4, 0xac,0x7a,0x59,0x43,0x34, +0x3b,0x59,0x23,0x34,0x3d,0x7c,0xba,0x4, 0x7a,0xb3,0x34,0x38,0xc3,0x22,0xd3,0x22, +0x6d,0x33,0x7e,0x24,0x6, 0xfc,0x12,0x23,0x1d,0x7e,0x34,0x0, 0x1, 0x7e,0x24,0x7, +0x7a,0x2, 0x23,0x1d,0x7e,0x34,0x60,0xa3,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x46, +0xa2,0x12,0x73,0x28,0x12,0x3f,0x13,0x12,0x69,0x87,0x12,0xc0,0x25,0x12,0x23,0xb, +0x12,0x28,0x48,0x12,0x68,0x23,0x12,0x8d,0xec,0x2, 0x23,0x4, 0x7e,0x34,0x61,0x4f, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x61,0x51,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7a,0x37,0x2a,0x5c,0x7e,0x34,0x61,0x53,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x30,0x22,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x7a,0x37,0x28, +0x95,0x7e,0x34,0x61,0xba,0x12,0x23,0x9e,0x7a,0x37,0x28,0x99,0x7e,0x34,0x61,0xb8, +0x12,0x23,0x9e,0x7a,0x37,0x28,0x97,0x7e,0x34,0x62,0x12,0x12,0x23,0x9e,0x7a,0x37, +0x28,0x9b,0x7e,0x34,0x61,0xbc,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9d,0x7e,0x34,0x61, +0xbe,0x12,0x23,0x9e,0x7a,0x37,0x28,0x9f,0x7e,0x34,0x61,0xc0,0x12,0x23,0x9e,0x12, +0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x90,0x61,0xc4,0xe4,0x93,0x7a,0xb3, +0x28,0xa5,0xe4,0x7a,0xb3,0x28,0xa8,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x25,0xf7, +0xe4,0x2, 0x20,0xde,0x12,0x25,0xc3,0x7e,0xb3,0x36,0x71,0xb4,0x1, 0x16,0x7e,0x34, +0x62,0x34,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x36,0x12,0x23,0x9e, +0x7a,0x37,0x2a,0x5c,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x37,0x7e,0x34,0x62,0x3e,0x12, +0x23,0x9e,0x7a,0x37,0x2a,0x5a,0x7e,0x34,0x62,0x40,0x12,0x23,0x9e,0x7a,0x37,0x2a, +0x5c,0x7e,0x34,0x62,0x42,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x62,0x44, +0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x62,0x46,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x53,0x7e,0xb3,0x2a,0x2, 0x70,0x21,0x7e,0x27,0x2a,0x5a,0x7d,0x32,0x7e,0x14, +0x0, 0x4, 0xad,0x13,0x7d,0x31,0x12,0x25,0x3c,0xbe,0x34,0x0, 0x50,0x28,0x4, 0x7e, +0x34,0x0, 0x50,0x2d,0x32,0x7a,0x37,0x2a,0x5a,0x22,0x7e,0x54,0x0, 0x54,0x7e,0x44, +0x0, 0xff,0x69,0x32,0x0, 0x4, 0x69,0x22,0x0, 0x2, 0xb, 0x2a,0x10,0x7a,0x1d,0x26, +0x7a,0x15,0x24,0x7e,0x34,0x0, 0x20,0x7e,0x8, 0x0, 0x24,0x7e,0x24,0x0, 0x6, 0x12, +0xb7,0xc7,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a,0x73,0x36, +0xe1,0x7e,0x34,0x61,0x51,0x12,0x23,0x9e,0xe, 0x34,0xe, 0x34,0x7a,0x73,0x36,0xe2, +0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe3,0x7e,0x34, +0x61,0x57,0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe4,0x7e,0x34,0x61,0x59, +0x12,0x23,0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe5,0x7e,0x34,0x61,0x5b,0x12,0x23, +0x9e,0x12,0x25,0x3c,0x7a,0x73,0x36,0xe6,0x7e,0x34,0x0, 0x59,0xca,0x39,0x7e,0x34, +0x61,0x5f,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x36,0xe7,0x12,0x20,0xb9,0x1b,0xfd,0xe5, +0x25,0x7a,0xb3,0x37,0x12,0xe5,0x28,0x7a,0xb3,0x37,0x1, 0x22,0x1e,0x34,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x22,0x90,0x60,0x99,0xe4,0x93,0x7a,0xb3,0x2a,0x4d,0x90,0x60, +0x9e,0xe4,0x93,0x7a,0xb3,0x2a,0x4e,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x12,0xc0, +0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x14,0x61,0x59,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0x7a,0x27,0x2a,0x53,0x7a,0x37,0x2a,0x55,0x90,0x60,0x9d,0xe4,0x93, +0x7a,0xb3,0x2a,0x59,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x62,0x12,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x60,0x90,0x60,0x9f,0xe4,0x93,0x7a,0xb3,0x2a,0x64,0x90,0x60, +0xa0,0xe4,0x93,0x7a,0xb3,0x2a,0x65,0x7e,0x34,0x60,0xa1,0x12,0x23,0x9e,0x7a,0x37, +0x2a,0x66,0x7e,0x34,0x61,0x5b,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0xe4,0x7a,0xb3, +0x16,0x92,0x22,0x12,0x23,0x7c,0x12,0xc0,0x55,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e, +0x12,0xc0,0xa8,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x51,0x7e,0x34,0x61,0x59,0x12,0x23, +0x9e,0x7a,0x37,0x2a,0x53,0x22,0xca,0xf8,0x7e,0xf3,0x37,0xa0,0xbe,0xf0,0x5, 0x78, +0xb, 0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x12,0x0, 0x9, 0x80,0x52,0xbe,0xf0,0x4, 0x78, +0x13,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b,0xe4,0x7a,0xb3,0x2b,0x2, 0x12, +0x7a,0x2d,0x80,0x3a,0xbe,0xf0,0x6, 0x78,0x19,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x49,0xd, 0xe4,0x7a,0xb3,0x2b,0x1e,0x12,0x69,0xab,0x12,0xc1,0x1, +0x80,0x1c,0xbe,0xf0,0x7, 0x78,0x1d,0x12,0xc0,0x0, 0x12,0x23,0x9e,0x12,0x26,0x5b, +0x12,0x2f,0xf4,0x50,0xfb,0x12,0x88,0x17,0x12,0x69,0x97,0x12,0x28,0x48,0x74,0x2, +0x7a,0xb3,0x37,0xa0,0xda,0xf8,0x22,0x7e,0x34,0x3, 0xe8,0x6d,0x22,0x7a,0x27,0x3, +0xed,0x7a,0x37,0x3, 0xef,0x22,0x7e,0xb3,0x37,0x6, 0x14,0x68,0x60,0x14,0x78,0x2, +0xe1,0x10,0x14,0x68,0x73,0x24,0x3, 0x68,0x2, 0xe1,0x5, 0x12,0xc1,0x32,0x38,0x8, +0x30,0x10,0xf, 0x12,0xc1,0x2a,0x68,0xa, 0x12,0x63,0x2, 0xe4,0x7a,0xb3,0x38,0x85, +0x80,0x7e,0x7e,0xb3,0x36,0xe7,0x30,0xe0,0x77,0x7e,0x73,0x36,0xe8,0xa, 0x27,0x7e, +0x34,0x4, 0x0, 0xad,0x32,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0xb, 0x7e,0x34,0x62,0x64, +0x12,0x23,0x9e,0x2e,0x34,0x4, 0x0, 0xbe,0x37,0x38,0x83,0x50,0x53,0x12,0x63,0x2, +0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x38,0x87,0x80,0x43,0x12,0xc1,0x32, +0x28,0x39,0xe4,0x7a,0xb3,0x37,0x6, 0x7e,0xb3,0x38,0x85,0xb4,0x1, 0x6, 0x74,0x1, +0x7a,0xb3,0x37,0x6, 0xd2,0x17,0x80,0x23,0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12, +0x26,0x5b,0x12,0x45,0x73,0x12,0x23,0x54,0xe4,0x7a,0xb3,0x37,0x6, 0x7a,0xb3,0x39, +0x7, 0xd2,0x17,0x80,0xb, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0xe4,0x7a,0xb3,0x39,0x7, +0x12,0x90,0xd2,0x2, 0x27,0x16,0xca,0xd8,0xca,0x79,0x7e,0xb3,0x37,0x6, 0xb4,0x1, +0x2, 0x80,0x3, 0x2, 0x28,0x38,0x6c,0xdd,0x6c,0xff,0x12,0x91,0x11,0x7d,0xf3,0x12, +0x2f,0xf4,0x50,0xfb,0x74,0x1, 0x7a,0xb3,0x38,0x86,0x12,0x3d,0xac,0x12,0x13,0xc7, +0x12,0x0, 0x1e,0x74,0xa, 0x12,0x45,0x15,0x12,0xc0,0xe7,0x7e,0xe7,0x2b,0xd, 0x7a, +0xe5,0x24,0x7e,0xe3,0x2a,0xfa,0x74,0x4, 0x7a,0xb3,0x2a,0xfa,0x7e,0xe7,0x2b,0xd, +0x5e,0xe4,0x0, 0x3f,0x7a,0xe7,0x2b,0xd, 0x7e,0xb3,0x2a,0xfa,0x12,0x7b,0xd0,0x7c, +0x7b,0x74,0x6, 0xac,0x7b,0x7e,0x24,0x0, 0x4, 0x12,0x1e,0xb9,0x7d,0x23,0x7d,0x3f, +0x12,0x25,0x3c,0xad,0x32,0x7a,0x37,0x2b,0x7, 0x12,0x4e,0xe0,0x12,0x26,0x57,0x7e, +0xb3,0x37,0x31,0xb4,0x1, 0x4, 0x74,0x10,0x80,0x2, 0x74,0xa, 0x12,0x91,0x5d,0x12, +0x4f,0xaf,0x80,0xf, 0x80,0x7, 0x12,0x45,0xcf,0xe4,0x12,0x46,0x7, 0x20,0x93,0xf6, +0x12,0x45,0x9f,0x30,0x18,0xf7,0x30,0x17,0xf4,0xd2,0x4, 0x12,0x45,0x5a,0xe4,0x12, +0x13,0xde,0xb, 0xd0,0x12,0x4c,0x83,0x12,0x91,0x76,0x7e,0xa3,0x38,0x85,0x4c,0xaa, +0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x38,0x86,0x4c,0xaa,0x68,0xb, 0x7e,0xb3,0x37,0x31, +0x70,0x5, 0xe4,0x7a,0xb3,0x38,0x85,0x12,0x28,0x3d,0x78,0x18,0x7e,0xb3,0x38,0x85, +0x60,0x12,0xe4,0x7a,0xb3,0x38,0x85,0x7a,0xb3,0x2a,0x2, 0x7a,0xb3,0x2a,0x3, 0x7e, +0xf0,0x1, 0x80,0x1d,0x12,0x28,0x3d,0x68,0x10,0x7e,0xb3,0x38,0x85,0x70,0xa, 0x7e, +0xf0,0x1, 0xe4,0x7a,0xb3,0x37,0x6, 0x80,0x8, 0xbe,0xd0,0x32,0x50,0x3, 0x2, 0x27, +0x8c,0xe4,0x7a,0xb3,0x2b,0x4, 0x7e,0x35,0x24,0x7a,0x37,0x2b,0xd, 0x7a,0xe3,0x2a, +0xfa,0x4c,0xff,0x68,0x3, 0x12,0x28,0x48,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x38, +0xf2,0xa, 0x37,0x5e,0x34,0x0, 0x2, 0x22,0xe4,0x7a,0xb3,0x34,0x3a,0x7a,0xb3,0x34, +0x39,0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0xb3,0x34, +0x3a,0x22,0xca,0x3b,0x12,0x2f,0xf4,0x50,0xfb,0x7e,0xf3,0x2b,0xf, 0x7c,0xbf,0x12, +0xb3,0xfc,0x12,0xb4,0x13,0x7e,0xb3,0x2b,0x1f,0xf5,0x28,0x7e,0xb3,0x2b,0x20,0xf5, +0x29,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0xf, 0x12,0x8d,0x6c,0x7e,0xb3,0x16,0x91,0x70, +0x6, 0x12,0x28,0x48,0xc3,0x21,0x6c,0x12,0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6, 0xfc,0x7e,0x8, 0x4, 0x7e,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x7, 0x7a,0x7e,0x8, 0x4, 0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x7, 0x12,0xac,0x20,0x7a,0x37,0x37,0xe3,0x74,0x1, 0x7a, +0xb3,0x16,0x90,0x12,0x69,0x8e,0x12,0xac,0xe, 0x7e,0xc3,0x3, 0xec,0x12,0x6e,0x31, +0xe4,0x12,0x13,0xde,0x12,0x28,0x48,0x7e,0x8, 0x4, 0x7e,0x7a,0xd, 0x2a,0x7e,0x18, +0x6, 0x76,0x7e,0xb3,0x2b,0x72,0x12,0x7a,0xc8,0x7e,0x8, 0x4, 0x0, 0x7a,0xd, 0x2a, +0x7e,0x18,0x5, 0xf8,0x7e,0xb3,0x25,0xf0,0x12,0x7a,0xc8,0x7e,0xd3,0x2b,0x1f,0x7e, +0xe3,0x2b,0x20,0xe5,0x28,0x7a,0xb3,0x2b,0x1f,0xe5,0x29,0x12,0x6e,0x8b,0x50,0x5, +0x7c,0xbc,0x12,0xb3,0x54,0x7e,0x34,0x8, 0xa, 0x7e,0x4, 0xd, 0xc8,0x7d,0x20,0x7d, +0x10,0x12,0x6a,0xd4,0x7a,0xd3,0x2b,0x1f,0x7a,0xe3,0x2b,0x20,0x7c,0xbf,0x12,0x86, +0xf8,0x12,0xaa,0x18,0x7e,0xb3,0x39,0x7, 0x4, 0x7a,0xb3,0x39,0x7, 0x7e,0x73,0x39, +0x7, 0xbe,0x70,0xfa,0x28,0x6, 0x74,0x64,0x7a,0xb3,0x39,0x7, 0x7e,0xb3,0x16,0x90, +0x60,0x9, 0x7e,0xb3,0x16,0x91,0x60,0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x3b,0x22,0x7e, +0x73,0x2a,0x74,0xa, 0x27,0x7e,0x73,0x2a,0x73,0xa, 0x37,0x2d,0x32,0x22,0x12,0x48, +0x7, 0x7e,0xb3,0x37,0x8, 0xb4,0x3, 0x6c,0x12,0xb6,0xe2,0x12,0x26,0x57,0x12,0x3f, +0xfb,0x7e,0xb3,0x37,0x9c,0x30,0xe7,0xe9,0x12,0x28,0x62,0x12,0x29,0x6f,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x4, 0x0, 0x7e,0x8, 0x4, 0xfc,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x29,0x6f,0x3e,0x34,0xca,0x39,0x7e,0x18,0x4, 0x7e,0x7e,0x8, 0x5, 0x7a,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x18,0x12,0xab,0xdb,0x12,0x75,0xe9, +0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x88,0x5f,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x58,0x52,0x12,0x48,0x39,0x12,0x3a,0x9f,0x7e,0xb3,0x37,0x9c,0x54,0x7f,0x7a,0xb3, +0x37,0x9c,0x80,0x8d,0x12,0x2f,0xee,0x2, 0x0, 0x46,0x7a,0xb3,0x2b,0x2, 0x7a,0xb3, +0x2b,0x1e,0x22,0x12,0x52,0x6d,0x12,0x2b,0xfa,0x12,0x2b,0xfa,0x12,0x36,0xac,0x12, +0x9c,0xfd,0x12,0x9f,0xef,0x12,0x2b,0xfa,0x12,0x9b,0xe7,0x12,0x2b,0xfa,0x12,0xa0, +0xae,0x12,0x2b,0xfa,0x2, 0x2a,0x27,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xcc,0x6c,0xdd, +0x7e,0xc4,0x0, 0x3c,0xca,0xc9,0x7e,0x18,0x36,0x25,0x7e,0x8, 0x35,0xe9,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0xf3,0x28,0x84,0xa, 0xcf,0x3e,0xc4,0xca,0xc9,0x7e,0x18,0x26, +0xfa,0x7e,0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x6c,0x88,0x6c,0xee,0x41,0xfb, +0x7e,0xc4,0x3, 0xff,0x7e,0xc0,0xff,0x6c,0x99,0x80,0x4c,0x74,0x2, 0xac,0xb9,0x9, +0xb5,0x1f,0x34,0xbe,0xb0,0xff,0x68,0x3d,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x36,0x74, +0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x35,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36, +0x26,0xa, 0x37,0x12,0x81,0xbf,0x74,0x2, 0xac,0xb9,0x9, 0x75,0x1f,0x34,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0x36,0x25,0x12,0xa1,0x4b,0x2d,0x13,0xbd,0xc1,0x28, +0x4, 0x7d,0xc1,0x7c,0xc9,0xb, 0x90,0xbc,0xf9,0x38,0xb0,0xbe,0xc0,0xff,0x68,0x39, +0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0x1f,0x34,0x9, 0x73,0x1f,0x35,0x12,0x2c,0x40, +0xbe,0x37,0x2a,0x5a,0x48,0x23,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x53,0x1f,0x34,0x74, +0x2, 0xac,0xbd,0x19,0x55,0x1f,0x70,0x9, 0x53,0x1f,0x35,0x19,0x55,0x1f,0x71,0x74, +0xff,0x19,0xb3,0x1f,0x34,0xb, 0x80,0xb, 0xd0,0xb, 0xe0,0x7e,0x73,0x35,0xe8,0xbc, +0x7e,0x28,0x2, 0x41,0x60,0x7c,0xe8,0x80,0x6d,0x6d,0xdd,0x7e,0x80,0xff,0x6c,0x99, +0x80,0x3c,0x7c,0xb9,0x12,0x2f,0xb7,0x60,0x33,0x12,0x2f,0xe4,0xbe,0xb0,0xff,0x68, +0x2b,0x9, 0x73,0x1f,0x35,0x12,0x30,0x3, 0x7f,0x71,0xb, 0x7a,0x50,0xbe,0x54,0x0, +0x0, 0x58,0x5, 0x6d,0x55,0x1b,0x7a,0x50,0xb, 0x7a,0xc0,0xbd,0xcd,0x8, 0xd, 0x12, +0x2f,0xe4,0xf5,0x24,0x9, 0xc3,0x1f,0x35,0x7d,0xdc,0x7c,0x89,0xb, 0x90,0xbc,0xf9, +0x38,0xc0,0xbe,0x80,0xff,0x68,0x1d,0x7e,0x71,0x24,0x74,0x2, 0xac,0xbd,0x19,0x75, +0x1f,0x70,0x19,0xc5,0x1f,0x71,0x7e,0xa0,0xff,0x7e,0x70,0x2, 0xac,0x78,0x19,0xa3, +0x1f,0x34,0xb, 0xd0,0xb, 0xe0,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbe,0x38,0x8a,0x90, +0x60,0x9a,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x1f,0x70,0x7e, +0x8, 0x1f,0x34,0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xfd,0x12,0x97,0x4, 0x7e,0x8, 0x36, +0x25,0x74,0xff,0x12,0x20,0xde,0xbe,0xf0,0x0, 0x28,0x35,0xa, 0x3f,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f, +0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b, +0xfd,0x6c,0xee,0x80,0x7, 0x7c,0xbe,0x12,0x2f,0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xf5, +0x7a,0xf3,0x35,0xe8,0x7a,0xf3,0x28,0x84,0x90,0x60,0x99,0xe4,0x93,0xbe,0xb3,0x28, +0x84,0x50,0x4, 0x7a,0xb3,0x28,0x84,0xda,0x3b,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee, +0x80,0x2e,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x25,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac, +0x7e,0x2e,0x34,0x26,0xfa,0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x26,0xfa, +0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbf,0x12,0x2f,0xd0,0xb, 0xf0,0xb, 0xe0, +0x12,0x9c,0xf6,0x38,0xcd,0x7a,0xf3,0x28,0x84,0xda,0x79,0x22,0x7c,0xba,0x7c,0x7d, +0x12,0x30,0x3, 0xb, 0x1a,0x30,0x22,0xca,0x3b,0x7c,0xfb,0x75,0x3b,0x0, 0x7e,0xb3, +0x2a,0x6f,0xf5,0x40,0x7e,0xb3,0x2a,0x70,0xf5,0x41,0x7e,0xd3,0x28,0x84,0xe4,0x7a, +0xb3,0x33,0xc2,0x7a,0xb3,0x33,0xc0,0x7a,0xb3,0x33,0xc1,0x7e,0x8, 0x1f,0x34,0x12, +0x2f,0xdd,0xe4,0x12,0x20,0xde,0x12,0x2f,0xdd,0x3e,0x34,0x7e,0x8, 0x33,0xc3,0xe4, +0x12,0x20,0xde,0xbe,0xd0,0x2, 0x50,0x2, 0xe1,0xa2,0x6c,0xcc,0xe1,0x91,0x12,0xc0, +0x8b,0xf5,0x24,0x9, 0xb3,0x26,0xfb,0xf5,0x25,0x4c,0xcc,0x68,0x8, 0xa, 0x3c,0x9, +0xb3,0x1f,0x34,0x70,0xa, 0xa, 0x3c,0xb, 0x34,0xa, 0x2c,0x19,0x72,0x1f,0x34,0x7c, +0xbd,0x14,0xbc,0xbc,0x78,0x2, 0xe1,0x97,0xa, 0x5c,0xb, 0x54,0xf5,0x2e,0xe1,0x88, +0x7e,0x71,0x2e,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0x26,0xfa,0x7a,0xa1,0x26,0x9, 0xb3, +0x26,0xfb,0xf5,0x27,0xa, 0x2a,0xe5,0x24,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x28,0xe5, +0x27,0xa, 0x2b,0xe5,0x25,0x12,0x2f,0xd6,0x7c,0xb7,0xf5,0x29,0xe5,0x28,0xbe,0xb0, +0x4, 0x40,0x2, 0xe1,0x86,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x86,0x85,0x25, +0x44,0x85,0x26,0x45,0x85,0x27,0x46,0x7e,0x8, 0x0, 0x31,0x7e,0x18,0x0, 0x33,0xe5, +0x24,0x12,0xb0,0x69,0x75,0x3b,0x0, 0x6c,0xee,0x75,0x30,0x0, 0xe5,0x24,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7a,0x35,0x35,0xe5,0x26,0x7e,0x71,0x27,0x12,0x2c,0x40,0x7a, +0x35,0x37,0x7e,0x35,0x35,0xbe,0x35,0x37,0x8, 0x7, 0x7e,0x35,0x37,0x7d,0x83,0x80, +0x3, 0x7e,0x85,0x35,0x7a,0x85,0x39,0xe, 0x84,0xe5,0x28,0xbe,0xb0,0x1, 0x38,0x2b, +0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x24,0x7c,0xbf,0x30,0xe1,0x1f,0xe5,0x26,0x7e,0x71, +0x25,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x24,0x7e,0x71,0x27,0x12,0x2c,0x40,0x2d,0x34, +0xbd,0x38,0x18,0x2, 0xe1,0x1d,0x75,0x30,0x1, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x1, +0x38,0x9, 0xe5,0x29,0xbe,0xb0,0x1, 0x38,0x2, 0xe1,0x1d,0xe5,0x28,0xbe,0xb0,0x4, +0x40,0x2, 0xe1,0x1d,0xe5,0x29,0xbe,0xb0,0x4, 0x40,0x2, 0xe1,0x1d,0x7c,0xbf,0x20, +0xe0,0x2, 0xe1,0x1d,0x6d,0x99,0x75,0x42,0x0, 0xc2,0x4, 0xc2,0x5, 0xe5,0x26,0xbe, +0xb1,0x24,0x28,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2a,0xe5,0x26,0xbe,0xb1, +0x24,0x50,0x4, 0xe5,0x24,0x80,0x2, 0xe5,0x26,0xf5,0x2c,0xe5,0x27,0xbe,0xb1,0x25, +0x28,0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2b,0xe5,0x27,0xbe,0xb1,0x25,0x50, +0x4, 0xe5,0x25,0x80,0x2, 0xe5,0x27,0xf5,0x2d,0xe5,0x2c,0xbe,0xb1,0x2a,0x78,0x29, +0xd2,0x4, 0xe5,0x2a,0x60,0x8, 0xe5,0x40,0x14,0xbe,0xb1,0x2a,0x78,0x2, 0xd2,0x5, +0xe5,0x2a,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2a,0xe5,0x40,0xa, 0x2b,0x1b,0x24,0xe5, +0x2c,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2b,0x78,0x29, +0xd2,0x4, 0xe5,0x2b,0x60,0x8, 0xe5,0x41,0x14,0xbe,0xb1,0x2b,0x78,0x2, 0xd2,0x5, +0xe5,0x2b,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x2b,0xe5,0x41,0xa, 0x2b,0x1b,0x24,0xe5, +0x2d,0xa, 0x3b,0xbd,0x32,0x58,0x2, 0x5, 0x2d,0x85,0x2a,0x3c,0x80,0x4c,0x85,0x2b, +0x3d,0x80,0x3e,0xe5,0x3c,0x7e,0x71,0x3d,0x12,0x2c,0x40,0x7a,0x35,0x3e,0xe5,0x2a, +0xbe,0xb1,0x3c,0x68,0x15,0xe5,0x2c,0xbe,0xb1,0x3c,0x68,0xe, 0xe5,0x2b,0xbe,0xb1, +0x3d,0x68,0x7, 0xe5,0x2d,0xbe,0xb1,0x3d,0x78,0x9, 0x7e,0x35,0x3e,0x2d,0x93,0x5, +0x42,0x80,0xc, 0x7e,0x35,0x33,0xbe,0x35,0x3e,0x58,0x2, 0x5, 0x3b,0xb, 0xe0,0x5, +0x3d,0xe5,0x2d,0xbe,0xb1,0x3d,0x50,0xbb,0x5, 0x3c,0xe5,0x2c,0xbe,0xb1,0x3c,0x50, +0xad,0xe5,0x2c,0x12,0x2f,0xae,0xe5,0x2a,0x12,0x2f,0xa5,0xe5,0x2a,0x12,0x2f,0xae, +0xe5,0x2c,0x12,0x2f,0xa5,0x7e,0x85,0x37,0x2e,0x85,0x35,0x30,0x4, 0x9, 0x20,0x5, +0x6, 0x9d,0x98,0x15,0x42,0x15,0x42,0xe5,0x42,0xbe,0xb0,0x4, 0x28,0x6, 0xe5,0x42, +0x24,0xfc,0xf5,0x42,0xbe,0x94,0x0, 0x0, 0x58,0x2, 0x6d,0x99,0x7d,0x18,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0xe5,0x42,0xa, 0x1b, +0x6d,0x0, 0x12,0x1e,0xeb,0x7f,0x21,0x7d,0x39,0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, +0x28,0x12,0x1e,0xfc,0xbf,0x12,0x8, 0x15,0xe5,0x3b,0xa, 0x3b,0xa, 0x2e,0x9d,0x23, +0x3e,0x24,0x3e,0x24,0xa, 0x3e,0xbd,0x23,0x18,0x3, 0x75,0x30,0x2, 0xe5,0x30,0xbe, +0xb0,0x0, 0x28,0x62,0xe5,0x30,0xa, 0x3b,0x2e,0x34,0x33,0xbf,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0xe5,0x2e,0xa, 0x3b,0x9, 0xa3,0x1f,0x34,0x4c,0xaa,0x78,0xc, 0xa, +0x2c,0x9, 0xb2,0x1f,0x34,0x19,0xb3,0x1f,0x34,0x80,0x3b,0xa, 0x2c,0x9, 0xb2,0x1f, +0x34,0xf5,0x43,0xbc,0xba,0x28,0x3, 0x7a,0xa1,0x43,0x75,0x2f,0x0, 0x80,0x22,0x9, +0x33,0x1f,0x34,0xe5,0x2f,0xa, 0x2b,0x9, 0x22,0x1f,0x34,0xbc,0x23,0x68,0xa, 0xa, +0xc, 0x9, 0x30,0x1f,0x34,0xbc,0x23,0x78,0x6, 0xe5,0x43,0x19,0xb2,0x1f,0x34,0x5, +0x2f,0xbe,0xd1,0x2f,0x38,0xd9,0x5, 0x2e,0xbe,0xd1,0x2e,0x28,0x2, 0x81,0xc0,0xb, +0xc0,0xbc,0xdc,0x28,0x2, 0x81,0x8e,0x7e,0x8, 0x1f,0x34,0x12,0xaf,0x94,0x7a,0xb3, +0x33,0xc2,0xda,0x3b,0x22,0x7e,0x71,0x2d,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7e,0x71, +0x2b,0x12,0x2c,0x40,0x9d,0x93,0x22,0x7c,0x7b,0x12,0x77,0xf6,0x9, 0xa2,0x27,0x72, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0x5e,0x12,0x91,0x6d,0x5c,0xba,0x22, +0x7e,0x70,0x1, 0x2, 0x51,0x5f,0xa, 0x3b,0x9d,0x32,0x2, 0x21,0x0, 0x90,0x60,0x9a, +0x93,0xa, 0x3b,0x22,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xb3,0x1f,0x34,0x22,0x12,0x2f, +0xf4,0x50,0xfb,0x22,0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0xbd,0x7c,0x7e,0x7e,0x13,0x2a,0x6e,0xac,0x1b,0x3e,0x4, 0x7e,0x30,0x2, 0xac,0x37, +0x2d,0x10,0x7e,0x1f,0x13,0x8a,0x2d,0x31,0x22,0xca,0x3b,0x7c,0x5b,0x7e,0x43,0x28, +0x84,0xbe,0x40,0x1, 0x28,0x2, 0x21,0x14,0x7e,0xa3,0x2a,0x6e,0x7e,0x70,0x2, 0xac, +0x75,0x9, 0xd3,0x26,0xfa,0x9, 0xc3,0x26,0xfb,0x7c,0xbd,0x7c,0x7c,0x12,0x30,0x3, +0x7f,0x1, 0x90,0x60,0xaa,0xe4,0x93,0x70,0x12,0x7c,0xfc,0x7c,0x9d,0x7e,0x83,0x2a, +0x70,0x7e,0xe3,0x2a,0x6f,0xa, 0xca,0x6d,0xbb,0x9d,0xbc,0xa, 0xa8,0x1b,0xa5,0xa, +0x5f,0xbd,0x5a,0x58,0x2, 0x21,0x14,0xa, 0x59,0x1b,0x54,0xbe,0x54,0x0, 0x0, 0x48, +0x4e,0x7c,0xb9,0x14,0x12,0x31,0x5a,0x50,0x46,0x7c,0xb9,0x14,0x12,0x31,0x17,0xb, +0x1a,0xe0,0x7d,0x3b,0x12,0x31,0x4c,0x8, 0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58, +0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12,0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf, +0x78,0x1d,0x90,0x60,0xaa,0xe4,0x93,0x70,0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12, +0x31,0x1e,0xb, 0x1a,0x30,0xbd,0x3a,0x8, 0x6, 0x12,0x31,0x20,0x1b,0x1a,0xa0,0xa, +0xa9,0xb, 0xa4,0xa, 0x5e,0xbd,0xa5,0x58,0x4b,0x7c,0xb9,0x4, 0x12,0x31,0x5a,0x50, +0x43,0x7c,0xb9,0x4, 0x12,0x31,0x17,0xb, 0x1a,0xe0,0x7d,0x3c,0x12,0x31,0x4c,0x8, +0x11,0x9d,0xae,0xbe,0xa4,0x0, 0x0, 0x58,0x4, 0x6d,0x55,0x80,0x2, 0x7d,0x5a,0x12, +0x31,0x44,0x7c,0xb8,0x24,0xfe,0xbc,0xbf,0x78,0x1a,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x4, 0x7d,0xfd,0x1b,0xf4,0x7d,0x5f,0x12,0x31,0x1e,0xb, 0x1a,0x50,0xbd,0x5a,0x8, +0x3, 0x1b,0x1a,0xa0,0xda,0x3b,0x22,0x12,0x31,0x27,0x7d,0xd3,0x7d,0x5d,0x3e,0x54, +0x7e,0x1f,0x13,0x8a,0x2d,0x35,0x22,0x7c,0x5b,0x7e,0x43,0x2a,0x6e,0x90,0x60,0xab, +0xe4,0x93,0x7c,0xab,0x90,0x60,0xaa,0xe4,0x93,0x70,0x8, 0x7c,0x75,0xac,0x74,0xa, +0x2a,0x2d,0x32,0x22,0x2d,0x31,0x7d,0x20,0x1b,0x1a,0x50,0x22,0x3e,0x34,0x7f,0x40, +0x2d,0x93,0xb, 0x4a,0xa0,0xbe,0xe4,0x0, 0x0, 0x22,0x7c,0xab,0x6c,0x77,0x80,0x12, +0xa, 0x27,0x2e,0x24,0x60,0xac,0x12,0x51,0x4f,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22, +0xb, 0x70,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xb7,0x38,0xe5,0xc3,0x22,0x12,0x36,0x9c, +0x60,0x30,0x6c,0x22,0x80,0x24,0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1b,0x7c,0xb2,0x12, +0x31,0x27,0x7d,0x3, 0x12,0x36,0x94,0x49,0x55,0x38,0xe8,0x7d,0x40,0x3e,0x44,0x7e, +0x1f,0x13,0x8a,0x2d,0x34,0x1b,0x1a,0x50,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72, +0x38,0xd4,0x22,0xca,0x3b,0x6c,0xff,0x12,0xc0,0xde,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x2, 0x80,0x2, 0x41,0xdd,0x6c,0xcc,0x41,0xcf,0x12,0xc0,0x8b,0xf5,0x27,0x9, 0xb3, +0x26,0xfb,0xf5,0x28,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xb, 0x7e,0xb3,0x36,0x71,0x70, +0x5, 0x12,0x32,0xe0,0x80,0x6, 0x75,0x25,0x2, 0x75,0x26,0x2, 0x7c,0xbc,0x12,0x30, +0x19,0xd2,0x3, 0x12,0x32,0xe7,0x7e,0xb3,0x36,0xec,0xb4,0x1, 0x1b,0x7e,0xb3,0x2a, +0x3, 0xb4,0x1, 0x14,0x7e,0xb3,0x28,0x84,0xb4,0x1, 0xd, 0x7e,0x37,0x28,0x86,0xbe, +0x34,0x0, 0xa, 0x40,0x3, 0x12,0x32,0xe0,0xe5,0x27,0x60,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x27,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x25,0x1, 0xe5,0x28,0x60,0xc, 0xa, +0x2d,0x1b,0x24,0xe5,0x28,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x26,0x1, 0x75,0x24, +0x0, 0x80,0x3c,0xe5,0x24,0xbc,0xbc,0x68,0x34,0x12,0x35,0xda,0x9, 0xa3,0x26,0xfa, +0x7a,0xa1,0x29,0x9, 0xb3,0x26,0xfb,0xf5,0x2a,0xa, 0x2a,0xe5,0x27,0x12,0x2f,0xd6, +0xbe,0x34,0x0, 0x3, 0x18,0x17,0xe5,0x2a,0xa, 0x2b,0xe5,0x28,0x12,0x2f,0xd6,0xbe, +0x34,0x0, 0x3, 0x18,0x8, 0x75,0x25,0x1, 0x75,0x26,0x1, 0x80,0x7, 0x5, 0x24,0x12, +0x36,0xa4,0x38,0xbf,0xe5,0x27,0x7e,0x71,0x28,0x12,0xa0,0x94,0x50,0x8, 0x12,0x31, +0x7d,0x12,0x35,0xd3,0x80,0x8, 0x12,0x69,0x84,0x50,0x3, 0x12,0x32,0xe0,0xe5,0x25, +0x7e,0x71,0x26,0x7c,0x6c,0x7c,0x5f,0x12,0x33,0x21,0x90,0x61,0x36,0xe4,0x93,0xb4, +0x1, 0x16,0x7e,0x70,0x9, 0xac,0x7c,0x7d,0x13,0x2e,0x14,0x27,0x76,0x6d,0x0, 0x2e, +0x34,0x27,0x78,0x6d,0x22,0x12,0x7f,0xc5,0x12,0x31,0x7d,0xb, 0xf0,0xb, 0xc0,0x7e, +0x73,0x28,0x84,0xbc,0x7c,0x28,0x2, 0x21,0xc9,0x7a,0xf3,0x28,0x84,0xda,0x3b,0x22, +0x75,0x25,0x3, 0x75,0x26,0x3, 0x22,0x12,0x36,0x9c,0x60,0x34,0x6c,0x22,0x80,0x28, +0x7c,0xb2,0x12,0x31,0x5a,0x50,0x1f,0x7c,0xb2,0x12,0x31,0x27,0x3e,0x34,0x7e,0x7f, +0x13,0x8a,0x2d,0xf3,0xb, 0x7a,0x30,0x12,0x36,0x94,0x59,0x35,0x38,0xe8,0x30,0x3, +0x5, 0x6d,0x33,0x1b,0x7a,0x30,0xb, 0x20,0x7e,0x73,0x2a,0x75,0xbc,0x72,0x38,0xd0, +0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb,0x74,0x9, 0xac,0xbf,0x7d, +0xd5,0x2e,0xd4,0x27,0x76,0x6d,0xcc,0x7e,0x37,0x2a,0x66,0x7a,0x35,0x43,0xe4,0x39, +0xb6,0x0, 0x6, 0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x26,0xfa,0xf5,0x31,0x9, 0xb3, +0x26,0xfb,0xf5,0x32,0x7e,0x73,0x2a,0x6e,0x7c,0x6d,0x7e,0x8, 0x0, 0x35,0x12,0x35, +0x80,0xf5,0x33,0xe5,0x31,0x7e,0x73,0x2a,0x6d,0x7c,0x6c,0x7e,0x8, 0x0, 0x34,0x12, +0x35,0x80,0x7c,0xab,0xe5,0x34,0x7e,0x71,0x35,0x12,0x30,0x3, 0x7a,0x35,0x3f,0x7e, +0x34,0x15,0x9e,0x7a,0x35,0x41,0x85,0x34,0x39,0x85,0x35,0x3a,0x7a,0xa1,0x3b,0x85, +0x33,0x3c,0x7e,0xb3,0x2a,0x59,0xf5,0x3d,0x75,0x3e,0x0, 0x7e,0x8, 0x0, 0x39,0x12, +0x90,0x50,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x15,0xa0,0x6d,0x88,0x2f,0x41,0x7e,0x37, +0x15,0xa2,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa4,0x2f,0x10,0x7a,0x1d, +0x2b,0x7e,0x37,0x15,0xa6,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x15,0xa8,0x6d,0xaa,0x2f, +0x51,0x7f,0x74,0xa, 0x4c,0xe5,0x31,0xa, 0x5b,0x9d,0x54,0xf5,0x2f,0x81,0xc7,0xa, +0x4d,0xe5,0x32,0xa, 0x5b,0x9d,0x54,0xf5,0x30,0x81,0xb1,0xe5,0x2f,0xbe,0xb0,0x0, +0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6d,0xbe,0x71,0x2f,0x18,0x2, 0x81,0xaf,0xe5, +0x30,0xbe,0xb0,0x0, 0x58,0x2, 0x81,0xaf,0x7e,0x73,0x2a,0x6e,0xbe,0x71,0x30,0x18, +0x2, 0x81,0xaf,0xe5,0x2f,0x7e,0x71,0x30,0x12,0x2c,0x40,0x7e,0x53,0x2a,0x59,0xa, +0x25,0x9d,0x32,0x7a,0x35,0x37,0xbe,0x34,0x0, 0x0, 0x18,0x2, 0x81,0xaf,0x7e,0x35, +0x43,0xbe,0x35,0x37,0x18,0xd, 0x7f,0x16,0x2e,0x34,0x0, 0x6, 0x7e,0x1b,0xb0,0x4, +0x7a,0x1b,0xb0,0xe5,0x31,0xa, 0x2b,0xe5,0x2f,0x12,0x35,0x65,0x18,0xb, 0xe5,0x32, +0xa, 0x2b,0xe5,0x30,0x12,0x35,0x65,0x8, 0x56,0xe5,0x2f,0x7e,0x71,0x30,0x7c,0x6e, +0x12,0xb8,0xa8,0xf5,0x36,0xb4,0x2, 0xc, 0x7e,0x35,0x37,0x7d,0x23,0xe, 0x24,0x9d, +0x32,0x7a,0x35,0x37,0xe5,0x36,0xbe,0xb0,0x2, 0x68,0x5, 0xe5,0x36,0xb4,0x1, 0x2f, +0x7e,0x45,0x37,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x2f,0x12,0x35,0x56,0x7f,0x1, +0x7e,0x1d,0x2b,0x9f,0x10,0x7a,0x1d,0x2b,0x7d,0x34,0x1a,0x26,0x1a,0x24,0xe5,0x30, +0x12,0x35,0x56,0x9f,0x51,0x12,0x35,0x5d,0x9f,0x41,0x12,0x35,0x5d,0x9f,0x71,0x5, +0x30,0xa, 0x2d,0xe5,0x32,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x30,0x1a,0x3b,0xbd, +0x32,0x18,0x2, 0x61,0xeb,0x5, 0x2f,0xa, 0x2c,0xe5,0x31,0xa, 0x3b,0x2d,0x32,0x1a, +0x27,0xe5,0x2f,0x1a,0x3b,0xbd,0x32,0x18,0x2, 0x61,0xdf,0xbe,0x48,0x0, 0x0, 0x78, +0x2, 0xb, 0x4c,0xbe,0x78,0x0, 0x0, 0x78,0x2, 0xb, 0x7c,0x7e,0x1d,0x2b,0x7f,0x4, +0x12,0x35,0x71,0x1b,0x6a,0x30,0x7f,0x15,0x7f,0x7, 0x12,0x35,0x71,0x79,0x36,0x0, +0x2, 0x7e,0xb3,0x2a,0x65,0x60,0xd, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x78,0x0, 0x7f,0x28,0x4, 0x7e,0x78,0x0, 0x7f,0x7d,0x3f, +0x39,0x76,0x0, 0x5, 0x74,0x9, 0xac,0xbe,0x9, 0x75,0x27,0x7c,0x39,0x76,0x0, 0x6, +0xbe,0x70,0xf, 0x28,0x6, 0x74,0xf, 0x39,0xb6,0x0, 0x6, 0x7e,0xa1,0x31,0x7e,0x70, +0x9, 0xac,0x7f,0x19,0xa3,0x27,0x7d,0x7e,0xa1,0x32,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x27,0x7e,0xda,0x3b,0x22,0x1a,0x1b,0x1a,0x2, 0x2, 0x1e,0xeb,0x7e,0x35,0x37, +0x1a,0x26,0x1a,0x24,0x22,0x1a,0x3b,0x9d,0x32,0x12,0x21,0x0, 0xbe,0x34,0x0, 0x1, +0x22,0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x1f,0x7, 0x2e,0x18,0x0, 0x20,0x22, +0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34, +0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39, +0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39, +0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d, +0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba, +0xda,0xf8,0x22,0x75,0x25,0x0, 0x75,0x26,0x0, 0x22,0x7e,0x71,0x24,0x74,0x2, 0xac, +0x7b,0x22,0xca,0x3b,0x7e,0xb3,0x2a,0x74,0xf5,0x27,0x12,0x0, 0x66,0x50,0x2, 0xc1, +0x6f,0x6d,0x33,0x9e,0x37,0x2a,0x4f,0x3e,0x34,0xbe,0x37,0x7, 0xf8,0x18,0x70,0x7e, +0xb3,0x16,0x92,0x70,0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x60,0x7e,0x77,0x2a,0x51, +0x7e,0x67,0x2a,0x53,0x75,0x24,0x0, 0x80,0x4e,0xe5,0x24,0x12,0x2f,0xb7,0x60,0x45, +0x12,0x35,0xda,0x12,0x9d,0x80,0xf5,0x26,0x7e,0xb3,0x2a,0x3, 0xb4,0x1, 0xe, 0x90, +0x60,0xab,0xe4,0x93,0xbe,0xb1,0x26,0x78,0x4, 0xe, 0x64,0xe, 0x74,0x7e,0xa1,0x26, +0x74,0x2, 0xa4,0x49,0x35,0x4, 0xfc,0xbd,0x36,0x48,0xd, 0xe5,0x25,0xa, 0x2b,0xe5, +0x27,0x12,0x9b,0x18,0xbd,0x37,0x58,0xd, 0xe5,0x24,0x6c,0x77,0x12,0x51,0x5f,0x12, +0x35,0xda,0x12,0x37,0x9f,0x5, 0x24,0x12,0x36,0xa4,0x38,0xad,0x12,0xa6,0x5, 0xda, +0x3b,0x22,0x12,0x46,0xa2,0x12,0x24,0x9a,0x12,0x73,0x28,0x12,0x22,0xf2,0x7e,0xb3, +0x37,0x8, 0x24,0xfd,0x68,0x9, 0xb, 0xb1,0x78,0xf4,0x12,0x58,0xf0,0x80,0xef,0x12, +0x29,0x7e,0x80,0xea,0x7c,0xa3,0xb, 0x30,0x74,0x2, 0xa4,0x22,0x6c,0x33,0x90,0x60, +0xa7,0xe4,0x93,0x22,0x7e,0x73,0x28,0x84,0xbe,0x71,0x24,0x22,0x12,0xa5,0xee,0x12, +0x9b,0x49,0x12,0x35,0xe2,0x12,0x9a,0x38,0x2, 0x36,0xbb,0xca,0x3b,0x12,0x2b,0xfa, +0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x9, 0xe4,0x7a,0xb3,0x35, +0xe4,0x7a,0xb3,0x35,0x69,0x7e,0xb3,0x35,0xe2,0x70,0x69,0x6c,0x99,0x80,0x5d,0x74, +0x2, 0xac,0xb9,0x9, 0x85,0x26,0xfa,0x9, 0xf5,0x26,0xfb,0x7c,0xb9,0x12,0x9a,0xed, +0x40,0x48,0x6c,0xee,0x80,0x3c,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x35,0x6a,0x9, 0xc5, +0x35,0x6b,0xa, 0x28,0xa, 0x3d,0x12,0x37,0x67,0x78,0x25,0xa, 0x2f,0xa, 0x3c,0x12, +0x37,0x67,0x78,0x1c,0x7c,0xb9,0x12,0x37,0x6f,0x7e,0x14,0x62,0x2b,0x12,0x87,0xee, +0x58,0xe, 0x7c,0xb9,0x6c,0x77,0x12,0x51,0x5f,0x7c,0xb8,0x7c,0x7f,0x12,0x37,0xa7, +0xb, 0xe0,0x7e,0x73,0x35,0xe4,0xbc,0x7e,0x38,0xbc,0xb, 0x90,0x7e,0x73,0x28,0x84, +0xbc,0x79,0x38,0x9b,0x7e,0x73,0x35,0x69,0x7a,0x73,0x35,0xe4,0xa, 0x37,0x3e,0x34, +0xca,0x39,0x7e,0x18,0x35,0xa6,0x7e,0x8, 0x35,0x6a,0x12,0x20,0xb9,0x1b,0xfd,0xe4, +0x7a,0xb3,0x35,0xe2,0xda,0x3b,0x22,0x9d,0x32,0x12,0x21,0x0, 0x4d,0x33,0x22,0x7c, +0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x2, 0x2c, +0x40,0xca,0xf8,0x7c,0xfb,0x7e,0x70,0x2, 0x12,0x99,0x6c,0x7f,0x71,0x7c,0xbf,0x12, +0x37,0x6f,0x12,0xa4,0xcf,0x7f,0x17,0x12,0x1f,0x58,0x7c,0xb7,0xda,0xf8,0x22,0x9, +0xb3,0x26,0xfa,0x9, 0x73,0x26,0xfb,0x7c,0x6b,0x7e,0xa3,0x35,0x69,0x7e,0x50,0x2, +0xac,0x5a,0x19,0x62,0x35,0xa6,0x19,0x72,0x35,0xa7,0x7c,0xba,0x4, 0x7a,0xb3,0x35, +0x69,0x22,0xca,0xf8,0x6c,0xff,0x80,0x18,0x7c,0xbf,0x12,0x37,0x6f,0xbe,0x37,0x2a, +0x5c,0x58,0xb, 0x12,0x51,0x5b,0x7e,0x70,0x2, 0xac,0x7f,0x12,0x37,0x9f,0xb, 0xf0, +0x12,0x52,0x66,0x38,0xe3,0x12,0x2b,0xfa,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xab,0xbe, +0xa0,0x34,0x38,0x3, 0x2, 0x38,0xfd,0xbe,0xa0,0x35,0x78,0x6, 0x7e,0xb3,0x2b,0x10, +0x41,0x1c,0xbe,0xa0,0x36,0x68,0x5, 0xbe,0xa0,0x37,0x78,0x1d,0x7e,0x35,0x8, 0x7d, +0x23,0xb, 0x24,0x7a,0x25,0x8, 0x2e,0x37,0x31,0xce,0x7e,0x39,0xb0,0xbe,0xa0,0x37, +0x68,0x2, 0x41,0x1c,0x75,0x1a,0x36,0x41,0x1c,0xbe,0xa0,0x38,0x68,0x5, 0xbe,0xa0, +0x39,0x78,0x1b,0x7e,0xf3,0x37,0xc0,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc0,0xbe,0xa0, +0x39,0x78,0x3, 0x75,0x1a,0x38,0xa, 0x3f,0x9, 0xb3,0x2b,0x21,0x41,0x1c,0xbe,0xa0, +0x3a,0x68,0x5, 0xbe,0xa0,0x3b,0x78,0x1b,0x7e,0xf3,0x37,0xc2,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc2,0xbe,0xa0,0x3b,0x78,0x3, 0x75,0x1a,0x3a,0xa, 0x3f,0x9, 0xb3,0x2b, +0x44,0x41,0x1c,0xbe,0xa0,0xfb,0x78,0x6, 0x7e,0xb3,0x2b,0x12,0x41,0x1c,0xbe,0xa0, +0x5e,0x78,0x26,0x7e,0xf, 0x38,0xc0,0x69,0x30,0x0, 0x8e,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x1e,0x54,0x5e,0x54,0x0, 0x1, 0x3, 0x3, 0x54,0xc0,0xa, 0x36,0x5e,0x34,0x0, +0x3, 0x7c,0xa7,0x4c,0xba,0x44,0x80,0x41,0x1c,0xbe,0xa0,0x3c,0x68,0x5, 0xbe,0xa0, +0x3d,0x78,0x1b,0x7e,0xf3,0x37,0xc4,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc4,0xbe,0xa0, +0x3d,0x78,0x3, 0x75,0x1a,0x3c,0xa, 0x3f,0x9, 0xb3,0x2a,0x7a,0x41,0x1c,0xbe,0xa0, +0x3e,0x68,0x5, 0xbe,0xa0,0x3f,0x78,0x1b,0x7e,0xf3,0x37,0xc6,0x7c,0xbf,0x4, 0x7a, +0xb3,0x37,0xc6,0xbe,0xa0,0x3f,0x78,0x3, 0x75,0x1a,0x3e,0xa, 0x3f,0x9, 0xb3,0x2a, +0x9d,0x41,0x1c,0xbe,0xa0,0x40,0x40,0xd, 0xbe,0xa0,0x4d,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x37,0x9c,0x41,0x1c,0xbe,0xa0,0x4e,0x68,0x5, 0xbe,0xa0,0x4f,0x78,0x1e,0x7e, +0xf3,0x37,0xe1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xe1,0xbe,0xa0,0x4f,0x78,0x3, 0x75, +0x1a,0x4e,0xa, 0x3f,0x2e,0x37,0x31,0xcc,0x7e,0x39,0xb0,0x41,0x1c,0xbe,0xa0,0x51, +0x68,0x5, 0xbe,0xa0,0x52,0x78,0x28,0x7e,0x14,0x60,0x0, 0x6d,0x0, 0x2e,0x4, 0x0, +0xff,0x7e,0xb3,0x37,0xec,0xa, 0x3b,0x6d,0x22,0x2f,0x10,0x7e,0x1b,0x70,0x4, 0x7a, +0xb3,0x37,0xec,0xbe,0xa0,0x52,0x78,0x3, 0x75,0x1a,0x51,0x7c,0xb7,0x41,0x1c,0xbe, +0xa0,0x5c,0x68,0x5, 0xbe,0xa0,0x5d,0x78,0x1a,0x7e,0xf3,0x37,0xb5,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xb5,0xbe,0xa0,0x5d,0x78,0x3, 0x75,0x1a,0x5c,0x7c,0xbf,0x12,0x3a, +0x1f,0x41,0x1c,0xbe,0xa0,0x60,0x40,0xd, 0xbe,0xa0,0x6c,0x38,0x8, 0xa, 0x3a,0x9, +0xb3,0x3, 0x91,0x41,0x1c,0xbe,0xa0,0x6d,0x78,0x4, 0xe5,0xe, 0x80,0x7e,0xbe,0xa0, +0xf4,0x68,0x5, 0xbe,0xa0,0xf5,0x78,0x18,0x7e,0x35,0xa, 0x7d,0x23,0xb, 0x24,0x7a, +0x25,0xa, 0x9, 0xb3,0x31,0xd4,0xbe,0xa0,0xf5,0x78,0x61,0x75,0x1a,0xf4,0x80,0x5c, +0xbe,0xa0,0xf0,0x68,0x5, 0xbe,0xa0,0xf1,0x78,0x9, 0x7c,0x1a,0x2e,0x10,0x20,0xa5, +0xe7,0x80,0x49,0xbe,0xa0,0xf2,0x68,0x5, 0xbe,0xa0,0xf3,0x78,0x1b,0x7e,0x15,0x10, +0x3e,0x14,0x7e,0x1f,0x31,0xd0,0x2d,0x31,0xb, 0x1a,0x30,0xbe,0xa0,0xf2,0x78,0x4, +0xa, 0x56,0x80,0x28,0x7d,0x53,0x80,0x24,0xbe,0xa0,0xf6,0x78,0x4, 0xe5,0xf, 0x80, +0x1b,0xbe,0xa0,0xf7,0x78,0xd, 0x7e,0x34,0x62,0x48,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x50,0x80,0x9, 0xbe,0xa0,0xfd,0x78,0x3, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c, +0xab,0xbe,0xa0,0x0, 0x40,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x28,0x9, 0x74,0x2, +0xa4,0x49,0x25,0x34,0x0, 0x80,0x51,0x7e,0x13,0x2a,0x6e,0xbc,0x1a,0x38,0x1c,0x7e, +0x3, 0x2a,0x6d,0xa, 0x10,0xa, 0x21,0x2d,0x12,0xa, 0x3a,0xbd,0x31,0x58,0xc, 0x9d, +0x32,0x3e,0x34,0x3e,0x34,0x49,0x23,0x3, 0x60,0x80,0x2d,0x7e,0x3, 0x2a,0x6d,0xa, +0x20,0xa, 0x11,0x7d,0x41,0x2d,0x42,0xa, 0x3a,0xbd,0x34,0x48,0x19,0x7e,0x10,0x2, +0xac,0x1, 0x2d,0x1, 0xbd,0x30,0x58,0xe, 0x9d,0x31,0x9d,0x32,0x3e,0x34,0x3e,0x34, +0x49,0x23,0x3, 0x62,0x80,0x2, 0xe4,0x22,0x7e,0x34,0x0, 0x64,0xad,0x23,0x74,0xc, +0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7c,0xb7,0x22,0xca, +0xf8,0x80,0x38,0x7c,0xbf,0x12,0x3a,0x1f,0xa, 0x1b,0x7e,0x63,0x2a,0x6e,0x7e,0x70, +0x2, 0xac,0x67,0x7e,0x10,0x2, 0xac,0x1f,0x2d,0x3, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x12,0x3a,0xde,0x9d,0x35,0x1b,0x1a,0x10,0xb, 0xf0,0x12,0x3a,0xde,0x7e,0x73,0x2a, +0x6e,0xa, 0x27,0x2d,0x25,0xa, 0x3f,0xbd,0x32,0x48,0xc8,0xda,0xf8,0x22,0x7e,0xa3, +0x2a,0x6d,0x74,0x2, 0xa4,0x22,0x12,0x3f,0xaa,0xb4,0x1, 0x14,0xca,0x39,0x7e,0x18, +0x37,0xdc,0x7e,0x8, 0x25,0xee,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x3f,0x49,0x80,0x12, +0xca,0x39,0x7e,0x18,0x37,0xdc,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd,0x12, +0x3f,0x67,0x2, 0x3b,0x15,0x7a,0x1f,0x2a,0xfc,0x7a,0xf, 0x2a,0xf8,0x22,0xca,0xf8, +0x7c,0x6b,0xa5,0xbe,0x0, 0x9, 0x7c,0xb7,0x12,0x7d,0xab,0xd2,0x6, 0xa1,0xa0,0xa5, +0xbe,0x1, 0x3d,0x7a,0x73,0x37,0x9d,0xa5,0xbf,0xad,0x2, 0x80,0x2f,0xa5,0xbf,0xae, +0x4, 0xd2,0x7, 0xa1,0xa0,0xa5,0xbf,0xaa,0x5, 0x12,0xc0,0xf8,0x80,0x1e,0xa5,0xbf, +0xab,0xa, 0x7e,0x34,0x5, 0x7a,0x7a,0x37,0x31,0xce,0x80,0x10,0xa5,0xbf,0xac,0x2, +0x80,0x2, 0xa1,0xa0,0x7e,0x34,0x4, 0xfc,0x7a,0x37,0x31,0xce,0x6d,0x33,0x81,0x1c, +0xbe,0x60,0x4, 0x40,0x20,0xbe,0x60,0x8, 0x38,0x1b,0x12,0x3d,0xa3,0xa5,0xbe,0x7, +0x7, 0x6d,0x33,0x7a,0x35,0xa, 0xa1,0xa0,0xa5,0xbe,0x8, 0x2, 0x80,0x2, 0xa1,0xa0, +0x12,0x7, 0xfb,0xa1,0xa0,0xa5,0xbe,0xa, 0x9, 0x43,0xc, 0x20,0x7a,0x73,0x37,0xa6, +0xa1,0xa0,0xa5,0xbe,0xb, 0x8, 0x12,0x3d,0xa3,0x12,0x3f,0xc8,0xa1,0xa0,0xbe,0x60, +0x1b,0x40,0x7, 0xbe,0x60,0x1c,0x38,0x2, 0xa1,0x38,0xbe,0x60,0x1e,0x40,0xd, 0xbe, +0x60,0x23,0x38,0x8, 0x12,0x3d,0xa5,0x43,0xc, 0x40,0xa1,0xa0,0xbe,0x60,0x15,0x40, +0x1a,0xbe,0x60,0x18,0x38,0x15,0x12,0x3d,0xa5,0xd2,0x6, 0xa5,0xbe,0x15,0x2, 0x80, +0x2, 0xa1,0xa0,0x74,0x7, 0x7a,0xb3,0x37,0xa0,0xa1,0xa0,0xa5,0xbe,0x19,0x7, 0xe4, +0x7a,0xb3,0x37,0xb5,0xa1,0xa0,0xbe,0x60,0x24,0x40,0x7, 0xbe,0x60,0x2c,0x38,0x2, +0xa1,0x38,0xa5,0xbe,0x2d,0x1b,0x12,0x3d,0xa5,0x20,0x7, 0x2, 0xa1,0xa0,0x7e,0x63, +0x37,0xc8,0x7c,0x46,0x6c,0x55,0xa, 0x37,0x2d,0x32,0x3e,0x34,0x7a,0x35,0x8, 0xa1, +0xa0,0xbe,0x60,0x2f,0x40,0xa, 0xbe,0x60,0x33,0x38,0x5, 0x43,0xc, 0x8, 0xa1,0x38, +0xa5,0xbe,0x34,0xf, 0x43,0xc, 0x10,0xbe,0x70,0x64,0x38,0x2, 0xa1,0x38,0x7e,0x70, +0x64,0xa1,0x38,0xbe,0x60,0x38,0x68,0x4, 0xa5,0xbe,0x39,0x21,0x43,0xc, 0x1, 0x7e, +0xf3,0x37,0xc1,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc1,0xa, 0x2f,0x19,0x72,0x2b,0x21, +0xa5,0xbe,0x39,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x38,0xa1,0xa0,0xbe,0x60,0x3a, +0x68,0x4, 0xa5,0xbe,0x3b,0x21,0x43,0xc, 0x2, 0x7e,0xf3,0x37,0xc3,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xc3,0xa, 0x2f,0x19,0x72,0x2b,0x44,0xa5,0xbe,0x3b,0x2, 0x80,0x2, +0xa1,0xa0,0x75,0x1a,0x3a,0xa1,0xa0,0xa5,0xbe,0xfb,0x9, 0x43,0xc, 0x4, 0x7a,0x73, +0x2b,0x12,0xa1,0xa0,0xa5,0xbe,0x50,0x6, 0x7a,0x73,0x37,0xec,0xa1,0xa0,0xbe,0x60, +0x3c,0x68,0x4, 0xa5,0xbe,0x3d,0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc5,0x7c,0xbf, +0x4, 0x7a,0xb3,0x37,0xc5,0xa, 0x2f,0x19,0x72,0x2a,0x7a,0xa5,0xbe,0x3d,0x2, 0x80, +0x2, 0xa1,0xa0,0x75,0x1a,0x3c,0xa1,0xa0,0xbe,0x60,0x3e,0x68,0x4, 0xa5,0xbe,0x3f, +0x21,0x43,0xc, 0x1, 0x7e,0xf3,0x37,0xc7,0x7c,0xbf,0x4, 0x7a,0xb3,0x37,0xc7,0xa, +0x2f,0x19,0x72,0x2a,0x9d,0xa5,0xbe,0x3f,0x2, 0x80,0x2, 0xa1,0xa0,0x75,0x1a,0x3e, +0xa1,0xa0,0xbe,0x60,0x40,0x40,0xd, 0xbe,0x60,0x42,0x38,0x8, 0x12,0x3d,0xa5,0x75, +0xd, 0x1, 0x80,0xa, 0xa5,0xbe,0x43,0xb, 0x12,0x3d,0xa5,0x75,0xd, 0x2, 0x12,0x3a, +0xe6,0x80,0x7d,0xa5,0xbe,0x44,0x8, 0x12,0x3d,0xa5,0x12,0x3f,0x70,0x80,0x71,0xbe, +0x60,0x45,0x68,0x4, 0xa5,0xbe,0x46,0x5, 0x12,0x3d,0xa5,0x80,0x63,0xbe,0x60,0x4e, +0x68,0x4, 0xa5,0xbe,0x4f,0x20,0x43,0xd, 0x4, 0x7e,0xf3,0x37,0xe2,0x7c,0xbf,0x4, +0x7a,0xb3,0x37,0xe2,0xa, 0x2f,0x2e,0x27,0x31,0xcc,0x7a,0x29,0x70,0xa5,0xbe,0x4f, +0x3f,0x75,0x1a,0x4e,0x80,0x3a,0xa5,0xbe,0x6d,0x5, 0x7a,0x71,0xe, 0x80,0x31,0xbe, +0x60,0xf0,0x40,0x25,0xbe,0x60,0xf3,0x38,0x20,0x7c,0x16,0x2e,0x10,0x20,0x7c,0xb7, +0xa5,0xf7,0xa5,0xbe,0xf3,0x1a,0x7e,0x15,0x12,0x7e,0x5, 0x10,0x3e,0x4, 0x7e,0x1f, +0x31,0xd0,0x2d,0x30,0x1b,0x1a,0x10,0x80,0x7, 0xa5,0xbe,0xf6,0x3, 0x7a,0x71,0xf, +0xda,0xf8,0x22,0xd2,0x6, 0xa, 0x26,0x19,0x72,0x37,0x9c,0x22,0x7a,0xb3,0x2b,0x0, +0x70,0x14,0x12,0x3f,0x67,0x12,0x3b,0x15,0x7e,0x18,0x6, 0x76,0x7a,0x1f,0x6, 0xf4, +0x7e,0x18,0x4, 0x7e,0x80,0x10,0xb4,0x1, 0x11,0x12,0x3f,0x49,0x12,0x3b,0x15,0x12, +0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x22,0x74,0x1, 0x12,0x0, 0x1e, +0xe4,0x12,0x3d,0xac,0x12,0x3d,0xf3,0xe4,0x12,0x0, 0x1e,0x74,0x1, 0x12,0x3d,0xac, +0x2, 0x3d,0xf3,0xca,0x3b,0x7e,0xd3,0x2a,0x73,0x7e,0xc3,0x2a,0x74,0x7e,0x8, 0x1f, +0x44,0x12,0x3f,0xe9,0x7e,0x8, 0x1f,0x8a,0x7e,0x34,0x0, 0x46,0x12,0x20,0xde,0x7e, +0x8, 0x1f,0xd0,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x1f,0xda,0x7e, +0x34,0x0, 0xa, 0x12,0x20,0xde,0x7e,0xf3,0x2a,0xfc,0x7e,0x18,0x2a,0xdc,0x7a,0x1d, +0x24,0x7e,0x18,0x1f,0xd0,0x7a,0x1d,0x28,0x7c,0xbd,0x7c,0x7c,0x7e,0x8, 0x2a,0xb9, +0x12,0xba,0x6c,0x6c,0xee,0x80,0x2b,0xa, 0x3e,0x9, 0xa3,0x2a,0xdc,0xa, 0x3a,0x2e, +0x34,0x20,0x73,0x12,0x91,0x6d,0x7c,0xab,0xbe,0xa0,0x1c,0x50,0x13,0xa, 0x3e,0x12, +0x3f,0xb, 0xa, 0x4a,0x19,0xb4,0x1f,0x44,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0x8a, +0xb, 0xe0,0xbc,0xce,0x38,0xd1,0x6c,0xee,0x80,0x24,0xa, 0x3e,0x9, 0xa3,0x2a,0xb9, +0xbe,0xa0,0x23,0x50,0x17,0xa, 0x2e,0xa, 0x3c,0x2d,0x32,0x12,0x3f,0xb, 0xa, 0x4a, +0x19,0xb4,0x1f,0x60,0x7e,0xb3,0x2a,0xfb,0x19,0xb4,0x1f,0xa6,0xb, 0xe0,0xbc,0xde, +0x38,0xd8,0x7e,0xb3,0x2a,0xfd,0x7e,0x8, 0x1f,0xe4,0x60,0x9, 0x7e,0x18,0x1f,0xd0, +0x12,0xb9,0x2, 0x80,0x3, 0x12,0x3f,0xd9,0x6c,0xee,0x7e,0x18,0x1f,0xe4,0x7a,0x1f, +0x1f,0x34,0x74,0x2, 0xac,0xbe,0x49,0x35,0x1f,0xd0,0x7a,0x37,0x1f,0x38,0x74,0x2, +0xac,0xbe,0x49,0x35,0x1f,0xda,0x7a,0x37,0x1f,0x3a,0x7e,0x70,0xe, 0xac,0x7e,0x2e, +0x34,0x1f,0x44,0x6d,0x22,0x7a,0x1f,0x1f,0x3c,0x7e,0x70,0xe, 0xac,0x7e,0x2e,0x34, +0x1f,0x8a,0x7a,0x1f,0x1f,0x40,0x7e,0x8, 0x1f,0x34,0x7c,0xbf,0x7c,0x7e,0x12,0x8, +0xd1,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xb2,0xda,0x3b,0x22,0x2e,0x37,0x2a,0xfe,0x7e, +0x39,0xb0,0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x12,0xaf,0x1f,0x12,0x13,0xf5,0x12, +0xb9,0x8e,0xe4,0x12,0xa, 0x66,0x7e,0x24,0x3, 0xd4,0x12,0x3f,0xcb,0x74,0x1, 0x12, +0x3d,0xac,0x12,0x3f,0xd2,0x7e,0x34,0xd0,0xc, 0x12,0x1, 0xe, 0x12,0x3d,0xdb,0x7e, +0x34,0x0, 0x1, 0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e,0x1f,0x25,0xf2,0x7e,0xf, 0x25, +0xee,0x22,0x7a,0xb3,0x2b,0x0, 0x70,0x5, 0x12,0x3f,0x67,0x80,0x6, 0xb4,0x1, 0x6, +0x12,0x3f,0x49,0x12,0x3b,0x15,0x22,0x7e,0x1f,0x2b,0x74,0x7e,0xf, 0x2b,0x70,0x22, +0x12,0x3f,0xaa,0xb4,0x1, 0x17,0xca,0x39,0x7e,0x18,0x25,0xee,0x7e,0x8, 0x37,0xdc, +0x12,0x20,0xb9,0x1b,0xfd,0x12,0xc0,0xef,0x12,0x3f,0x49,0x80,0x1a,0xca,0x39,0x7e, +0x18,0x2b,0x70,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x37,0x2b,0x76, +0x7a,0x37,0x31,0xcc,0x12,0x3f,0x67,0x2, 0x3b,0x15,0x7e,0xb3,0x37,0xe0,0x7e,0x34, +0x0, 0x4, 0x22,0x7c,0x6b,0x12,0x3f,0xe1,0x78,0x5, 0x7c,0xb6,0x2, 0x7d,0xd6,0xb4, +0x4, 0x5, 0x7c,0xb6,0x2, 0x3b,0x1e,0x22,0xb2,0x82,0x22,0x7d,0x32,0x74,0xfa,0x2, +0x12,0xd0,0x7e,0x8, 0x2a,0x6d,0x2, 0x0, 0x2e,0x7e,0x34,0x0, 0x8, 0xe4,0x2, 0x20, +0xde,0x7e,0xb3,0x37,0x9c,0xc4,0x54,0x7, 0x22,0x7e,0x34,0x0, 0x46,0x74,0x3f,0x2, +0x20,0xde,0x7e,0x18,0x5, 0xf8,0x7a,0x1f,0x6, 0xf4,0x22,0x30,0x6, 0x3b,0xc2,0x6, +0x12,0x25,0xe6,0x7e,0x73,0x37,0xa1,0x7a,0x73,0x2a,0x4d,0x7e,0x73,0x37,0xa2,0x7a, +0x73,0x2b,0x1d,0x7e,0x73,0x37,0xa2,0x7a,0x73,0x2b,0x1, 0x7e,0xb3,0x37,0xa3,0x60, +0x18,0x7e,0x34,0x0, 0x2, 0x12,0x41,0x5d,0x7e,0x34,0x0, 0x1, 0x12,0x41,0x5d,0x6d, +0x33,0x12,0x41,0x5d,0xe4,0x7a,0xb3,0x37,0xa3,0x12,0x4f,0xfa,0x2, 0x40,0x3f,0xe5, +0xc, 0x70,0x2, 0x21,0x5c,0xe5,0xc, 0x30,0xe0,0x10,0x53,0xc, 0xfe,0x12,0x72,0x92, +0x12,0x79,0x31,0x7e,0x8, 0x2a,0x6d,0x12,0x9, 0xa1,0xe5,0xc, 0x30,0xe1,0x6, 0x53, +0xc, 0xfd,0x12,0xba,0x23,0xe5,0xc, 0x30,0xe2,0x32,0x53,0xc, 0xfb,0x7e,0xb3,0x2b, +0x12,0x60,0x9, 0x7e,0x8, 0x2a,0x6d,0x12,0x6, 0xba,0x80,0xb, 0x7e,0xb3,0x2b,0x65, +0x7e,0x73,0x2b,0x64,0x12,0xb, 0xad,0x7e,0x73,0x2b,0x12,0x2e,0x70,0xff,0x92,0x4, +0x90,0x60,0x51,0xe4,0x93,0x9e,0xb3,0x2a,0x77,0x12,0xb, 0x1e,0xe5,0xc, 0x30,0xe3, +0x45,0x53,0xc, 0xf7,0x7e,0x73,0x37,0xce,0x7a,0x73,0x2b,0xf, 0x12,0x87,0x52,0x7a, +0xb3,0x0, 0x4f,0xbe,0xb0,0xff,0x68,0xb, 0x43,0xc, 0x20,0x7e,0x73,0x0, 0x4f,0x7a, +0x73,0x37,0xa6,0x12,0x6e,0x29,0x12,0xc0,0x42,0x7e,0x73,0x37,0xcf,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4, +0x12,0xa, 0x66,0x12,0x8d,0xec,0xe5,0xc, 0x30,0xe4,0xf, 0x53,0xc, 0xef,0x7e,0x43, +0x37,0xd0,0x7e,0x50,0xa, 0xac,0x45,0x12,0x3f,0xcb,0xe5,0xc, 0x30,0xe6,0x4e,0x53, +0xc, 0xbf,0x7e,0x73,0x37,0xbc,0xbe,0x70,0x7, 0x28,0x6, 0x74,0x7, 0x7a,0xb3,0x37, +0xbc,0xa9,0xd5,0xcb,0x74,0xe, 0x12,0x43,0xeb,0x7c,0x7b,0x5e,0x70,0xf, 0x7e,0x63, +0x37,0xbc,0xa, 0x26,0x2e,0x24,0x0, 0x3, 0x12,0x47,0x81,0x7c,0x65,0x4c,0x76,0x74, +0xe, 0x12,0x43,0x5f,0x12,0x43,0xeb,0x12,0x43,0xf3,0x7e,0x73,0x37,0xbf,0x7a,0x73, +0x2b,0x14,0x7e,0x73,0x37,0xbe,0x7a,0x73,0x2b,0x1f,0x12,0xc1,0x1, 0xe5,0xc, 0x30, +0xe5,0xa, 0x53,0xc, 0xdf,0x7e,0xb3,0x37,0xa6,0x2, 0x48,0x77,0x22,0xca,0xd8,0xca, +0x79,0x7d,0xd3,0x90,0x60,0x50,0xe4,0x93,0x7c,0xfb,0x90,0x60,0x51,0xe4,0x93,0x7c, +0x8b,0xa, 0x38,0xa, 0xcf,0x2d,0xc3,0xb, 0xc4,0x7d,0x3c,0x7c,0xe7,0x12,0x26,0x57, +0xa9,0xd0,0xc4,0xa9,0xd5,0xcb,0x74,0x7, 0x12,0x43,0xeb,0x7c,0x8b,0x74,0x7, 0x7e, +0x70,0xf, 0x12,0x43,0xf0,0x7e,0x54,0x0, 0x78,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, +0x6, 0x7e,0x54,0x0, 0x80,0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x8, 0x7e,0x54,0x0, +0xc, 0x7e,0x1f,0x38,0xc4,0x79,0x51,0x0, 0x10,0xbe,0xd4,0x0, 0x2, 0x78,0xb, 0x7e, +0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x1, 0x80,0x20,0x7e,0x1f,0x38,0xc4,0x12,0x43, +0x48,0x44,0x8, 0x1b,0x1a,0x50,0x4d,0xdd,0x7e,0x1f,0x38,0xc4,0x78,0x7, 0x12,0x43, +0x48,0x54,0xfb,0x80,0x5, 0x12,0x43,0x48,0x44,0x4, 0x1b,0x1a,0x50,0x7e,0x1f,0x38, +0xc0,0x69,0xe1,0x0, 0x84,0x69,0x51,0x0, 0x90,0x7d,0xf5,0x2e,0x34,0x0, 0x90,0x5e, +0xa0,0xf6,0x1b,0x1a,0x50,0x7e,0xb3,0x37,0x12,0xbe,0xb0,0x6, 0x40,0x3, 0xb4,0xff, +0xe, 0x12,0x43,0x53,0x54,0xe6,0x12,0x43,0x50,0x4e,0x54,0x1, 0xa4,0x80,0xc, 0x12, +0x43,0x53,0x5e,0x54,0xfe,0xe6,0x12,0x43,0x50,0x44,0xa4,0x1b,0x1a,0x50,0xbe,0xd4, +0x0, 0x2, 0x78,0x2d,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e,0x54,0x0, 0xf, 0x1b, +0x1a,0x50,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x44,0x50,0x1b,0x1a,0x50,0x7e,0x34, +0x0, 0x2, 0x12,0x44,0x72,0x12,0x44,0x4b,0x12,0x44,0x28,0x7a,0x37,0x31,0xd4,0x61, +0x4, 0x6c,0xdd,0x41,0xfe,0x4c,0xdd,0x78,0x4, 0x6c,0x99,0x80,0x2b,0xbc,0xfd,0x40, +0x12,0xa, 0xcd,0x9, 0x9c,0x2a,0xb8,0xbe,0x90,0x23,0x40,0x3, 0x7e,0x90,0x22,0xb, +0x90,0x80,0x15,0xa, 0x3f,0xa, 0xcd,0x9d,0xc3,0x9, 0x9c,0x2a,0xdb,0xbe,0x90,0x1c, +0x40,0x3, 0x7e,0x90,0x1b,0x2e,0x90,0x24,0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x5e, +0x54,0x0, 0xf, 0x1b,0x1a,0x50,0xa, 0xc9,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4,0x3e,0xc4, +0x7e,0x1f,0x38,0xc4,0x12,0x43,0x48,0x4d,0x5c,0x1b,0x1a,0x50,0xe5,0xe, 0x60,0x7, +0xe5,0xe, 0xbe,0xb0,0x64,0x28,0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x4, 0xe5,0xe, 0xa, +0x3b,0x12,0x44,0x72,0x12,0x44,0x4b,0xbe,0xd4,0x0, 0x1, 0x78,0x10,0x12,0x44,0x4b, +0x12,0x44,0x28,0x74,0x2, 0xac,0xbd,0x59,0x35,0x31,0xd6,0x80,0xf, 0x12,0x44,0x28, +0xa, 0x5e,0xa, 0x2d,0x2d,0x25,0x3e,0x24,0x59,0x32,0x31,0xd6,0xb, 0xd0,0xbc,0xed, +0x28,0x2, 0x41,0x65,0xa9,0xd5,0xcb,0x74,0x7, 0x7c,0x78,0x12,0x43,0xf0,0xa9,0xc0, +0xc4,0x7e,0x1f,0x38,0xc0,0x79,0xe1,0x0, 0x84,0x7e,0x1f,0x38,0xc0,0x79,0xf1,0x0, +0x90,0x6d,0x33,0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0x8, 0x7e,0xf, 0x38,0xc4,0x79,0x30,0x0, 0x10,0x7e,0xf, 0x38,0xc4,0x79, +0x30,0x0, 0xe, 0xda,0x79,0xda,0xd8,0x22,0x2e,0x34,0x0, 0xe, 0xb, 0x1a,0x50,0x22, +0x1b,0x1a,0x50,0x7e,0x1f,0x38,0xc0,0x2e,0x34,0x0, 0x84,0xb, 0x1a,0x50,0x22,0xf5, +0xfd,0x7a,0x71,0xfe,0x22,0xca,0x79,0xa9,0xd5,0xcb,0x74,0x2, 0x7e,0x70,0x3f,0x12, +0x43,0x5f,0x74,0xf, 0x12,0x43,0xeb,0x7c,0xfb,0x74,0xf, 0x7c,0x7f,0x5e,0x70,0xfe, +0x12,0x43,0x5f,0x74,0xc, 0x12,0x43,0xeb,0x7c,0xfb,0x54,0x7f,0x68,0x8, 0x74,0xc, +0x7e,0x70,0xf8,0x12,0x43,0x5f,0x90,0x61,0x18,0xe4,0x93,0x7c,0xab,0xbe,0xa0,0x7, +0x38,0xb, 0x12,0x45,0x6, 0x7c,0xb7,0xa, 0x7b,0xb, 0x75,0x80,0x16,0x90,0x61,0x17, +0xe4,0x93,0xb4,0x1, 0xe, 0xbe,0xa0,0x7, 0x28,0x9, 0x12,0x45,0x6, 0xa, 0x77,0x2e, +0x74,0x0, 0x7, 0x74,0xe, 0x7c,0x7f,0x12,0x43,0x5f,0x74,0x7, 0x12,0x43,0xeb,0x7c, +0xfb,0x5e,0xf0,0xfb,0x90,0x60,0x2, 0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x3e,0x34,0x4c, +0xf7,0x74,0x7, 0x7c,0x7f,0x12,0x43,0xf0,0xda,0x79,0x22,0xf5,0xfd,0xe5,0xfe,0x22, +0x12,0x43,0x5f,0x75,0xfd,0xff,0xa9,0xc5,0xcb,0x22,0x6d,0x33,0x7e,0x8, 0x0, 0x24, +0x7e,0x24,0x0, 0x12,0x12,0xb7,0xc7,0xe5,0x34,0x20,0xe7,0x1b,0xa9,0xd5,0xcb,0x74, +0x3, 0x7e,0x71,0x27,0x12,0x43,0x5f,0x74,0xb, 0x7e,0x71,0x2f,0x12,0x43,0x5f,0x74, +0xc, 0x7e,0x71,0x30,0x12,0x43,0xf0,0x22,0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0xa, +0x7d,0x23,0x6d,0x33,0x69,0x10,0x0, 0xc, 0x6d,0x0, 0x2f,0x10,0x74,0x7, 0x1e,0x34, +0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x22,0x7e,0x34,0x0, 0x1, 0x7e, +0xf, 0x38,0xc4,0x79,0x30,0x0, 0x4, 0x7e,0xf, 0x38,0xc4,0x69,0x30,0x0, 0x12,0x5e, +0x34,0x0, 0x1, 0x68,0xf2,0x7e,0x34,0x0, 0x1, 0x79,0x30,0x0, 0x12,0x22,0x7e,0x34, +0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa,0x12,0x45,0x15, +0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d,0x33,0x78,0xe6, +0x22,0x12,0x47,0xf8,0xc2,0x3, 0x12,0xb6,0x57,0xc2,0x5, 0x12,0x45,0x51,0xc2,0x3, +0x12,0x47,0x21,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0xeb,0x7a,0x1b,0xb0,0x74,0xf, +0x6c,0x77,0x12,0x43,0x5f,0xe5,0xfc,0x7a,0xb, 0xb0,0x43,0xfc,0x10,0x2, 0x43,0xf3, +0x24,0xab,0x68,0x10,0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f, +0x74,0x5, 0x80,0x2d,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x2a,0x12,0x44,0x6e,0x12,0xb6, +0xf, 0x2, 0xb6,0xc4,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0x1a,0x12,0x44,0x6e,0x75,0xe9, +0xff,0x22,0x7e,0xb3,0x33,0xff,0xb4,0x5, 0xc, 0x12,0x44,0x6e,0x2, 0xb6,0xbe,0x74, +0x1, 0x7a,0xb3,0x33,0xff,0x22,0xa, 0x3a,0x2e,0x34,0x0, 0x3, 0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x22,0x7c,0xab,0x80,0xe, 0x7e,0x70,0x3, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xea,0x22, +0x7c,0x6b,0xa9,0xd5,0xcb,0x74,0xf, 0x12,0x43,0x5f,0x7a,0x61,0xfc,0x12,0x43,0xf3, +0x12,0x46,0x68,0xd2,0x3, 0x12,0x47,0x21,0x12,0x45,0x6b,0x12,0x13,0xde,0x2, 0x13, +0x96,0xa9,0xd0,0xce,0xa2,0x5, 0xa9,0x91,0xc9,0x22,0x30,0x4, 0x6, 0x12,0x45,0x6b, +0x2, 0x13,0x96,0x12,0x47,0xf8,0xc2,0x5, 0x2, 0x45,0x51,0xd2,0x5, 0x12,0x45,0x51, +0x74,0x1, 0x22,0x12,0x45,0xcf,0x12,0x91,0x8, 0x75,0xcd,0x0, 0xa9,0xd6,0xeb,0xa9, +0xd7,0xcd,0xc2,0xce,0x12,0xc0,0xd5,0x12,0x44,0x91,0x74,0x1, 0x12,0x46,0x7, 0xa9, +0xc6,0xeb,0xa9,0xc7,0xcd,0xd2,0xce,0xe5,0x25,0x7e,0x71,0x24,0x2, 0x45,0x30,0x30, +0x18,0x5, 0xc2,0x4, 0x12,0x45,0x5a,0xa9,0xd1,0xcd,0xa9,0xc5,0xea,0x30,0x17,0x3, +0x20,0x18,0x14,0x12,0x45,0xcf,0xa9,0xd0,0xce,0xa9,0xc4,0xc9,0x74,0x2, 0x12,0x46, +0x7, 0xa9,0xd0,0xce,0xa9,0xd4,0xc9,0xa9,0xc1,0xcd,0xd2,0x4, 0x2, 0x45,0x5a,0x74, +0x81,0x7a,0xb3,0x39,0x2, 0x22,0x80,0x1d,0x12,0x45,0xcf,0x12,0x47,0xff,0x68,0x5, +0xc2,0x4, 0x12,0x45,0x5a,0x7e,0xb3,0x34,0x3a,0xbe,0xb0,0x2, 0x68,0x18,0x20,0x17, +0x15,0xe4,0x12,0x46,0x7, 0x20,0x93,0xe0,0x12,0x45,0xcf,0xa9,0xd1,0xcd,0xa9,0xc5, +0xea,0x74,0x2, 0x2, 0x46,0x7, 0x22,0x7c,0xab,0x7e,0xb3,0x39,0x2, 0xb4,0x81,0x38, +0x4c,0xaa,0x78,0x5, 0xa9,0xd0,0x87,0x80,0x29,0xbe,0xa0,0x1, 0x78,0xf, 0xc2,0xaf, +0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x15,0xbe,0xa0,0x2, +0x78,0x16,0xc2,0xaf,0x20,0x93,0x9, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd1,0x87, +0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x39,0x2, 0x22,0xd2,0x3, +0x80,0x12,0x30,0x3, 0xc, 0x12,0x47,0xff,0x68,0x7, 0xc2,0x3, 0xc2,0x4, 0x12,0x45, +0x5a,0x12,0x45,0xd6,0x30,0x17,0xeb,0x22,0xca,0xf8,0xa2,0xaf,0xe4,0x33,0x7c,0xfb, +0xd2,0x3, 0x12,0xb6,0x57,0xa9,0xd0,0xcb,0xc2,0xaf,0xa9,0xd0,0x9e,0x75,0x9d,0x0, +0xa9,0xd0,0x9e,0x75,0x9c,0x20,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0xa9,0xd0,0xcd,0x74, +0x41,0x12,0x45,0x15,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x2e,0xf0,0xff,0x92,0xaf,0xda, +0xf8,0x22,0xe4,0x12,0x46,0xf0,0x12,0xb6,0x60,0x12,0x26,0x57,0x12,0xb6,0xdb,0x12, +0x43,0x65,0x12,0xb6,0x5, 0x12,0xb6,0x77,0x12,0x0, 0x4a,0x12,0xb6,0x83,0x12,0x7e, +0xa0,0x12,0xb6,0x93,0xd2,0xaf,0x12,0x47,0x8a,0x12,0xb8,0x1e,0x12,0x43,0xfa,0x12, +0x46,0x68,0x7e,0x8, 0x3, 0xf1,0x12,0xa9,0xa3,0x90,0x60,0x50,0xe4,0x93,0xca,0xb8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0xff,0xff,0xda,0xb8,0x2, 0x12,0x34, +0xa9,0xc4,0xca,0xa9,0xc5,0xca,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0xa9,0xd0, +0xce,0xa9,0xc0,0xc9,0xd2,0x5, 0x12,0x45,0x51,0xa9,0xc2,0xea,0x75,0xc1,0x6, 0x75, +0xc2,0xc, 0xd2,0x3, 0x12,0x47,0x21,0xa9,0xc1,0xc4,0xa9,0xd2,0xc4,0xa9,0xc2,0xe1, +0x22,0xa2,0x3, 0xa9,0x97,0xc1,0xa2,0x3, 0xa9,0x97,0xc2,0x22,0x7e,0x34,0x36,0xe1, +0x30,0xd, 0x4b,0xc2,0xd, 0x9, 0x53,0x0, 0x2, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x4f, +0x9, 0x53,0x0, 0x3, 0x12,0x47,0x7f,0x7a,0x27,0x2a,0x51,0x9, 0x53,0x0, 0x4, 0x12, +0x47,0x7f,0x7a,0x27,0x2a,0x53,0x7e,0x39,0x50,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a, +0x27,0x2a,0x5a,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x3e,0x24,0x3e,0x24,0x7a,0x27,0x2a, +0x5c,0x9, 0x73,0x0, 0x5, 0xa, 0x37,0x12,0x45,0xc, 0x7a,0x37,0x2a,0x62,0x22,0xa, +0x25,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0xa9,0xd5,0xcb,0x74,0x10,0x12, +0x43,0xeb,0x7c,0x7b,0x12,0x43,0xf3,0x30,0xe7,0x3, 0x7e,0x70,0x2, 0xd2,0xcd,0x7e, +0x24,0x0, 0xef,0x7e,0xf, 0x38,0xc0,0x79,0x20,0x0, 0x84,0x7e,0x24,0x20,0x5f,0x7e, +0xf, 0x38,0xc0,0x79,0x20,0x0, 0x82,0x7e,0x24,0x41,0x0, 0x7e,0xf, 0x38,0xc0,0x79, +0x20,0x0, 0x90,0x7c,0x67,0x6c,0x77,0x2e,0x34,0x0, 0xc1,0x7e,0xf, 0x38,0xc0,0x79, +0x30,0x0, 0x86,0x7e,0x34,0x29,0x90,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8a,0x7e, +0x34,0x6a,0xd1,0x7e,0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8c,0x7e,0x34,0x3, 0x61,0x7e, +0xf, 0x38,0xc0,0x79,0x30,0x0, 0x8e,0x22,0xe4,0x12,0x13,0xde,0x2, 0x13,0x96,0x7e, +0xb3,0x34,0x3a,0xbe,0xb0,0x1, 0x22,0x12,0xc0,0xf8,0x12,0xc0,0xef,0x6d,0x33,0x7a, +0x35,0xa, 0x12,0x48,0x56,0x12,0x48,0x30,0x74,0x50,0x7a,0xb3,0x37,0xd0,0x7e,0x24, +0x3, 0x20,0x12,0x3f,0xcb,0xe4,0x12,0xc0,0x27,0x6d,0x33,0x7a,0x37,0x39,0x4, 0x22, +0x7e,0x73,0x2b,0x62,0x7a,0x73,0x37,0xcf,0x22,0xa2,0xa, 0xe4,0x33,0x7a,0xb3,0x37, +0xca,0x7e,0x73,0x37,0xce,0xbe,0x73,0x2b,0xf, 0x68,0xa, 0xe5,0xc, 0x70,0x6, 0x12, +0x48,0x56,0x12,0x48,0x30,0x22,0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x7e,0x73, +0x2b,0x1f,0x7a,0x73,0x37,0xbe,0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x7e,0x73, +0x2b,0x14,0x7a,0x73,0x37,0xbf,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x61,0xc5, +0xe4,0x93,0x7c,0xab,0xbe,0xd0,0x80,0x78,0x18,0x7e,0xe0,0xff,0x6c,0xff,0x80,0xb, +0x12,0x48,0xe8,0x38,0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0x80, +0x1a,0xbe,0xd0,0x81,0x78,0x15,0x6c,0xee,0x6c,0xff,0x80,0xb, 0x12,0x48,0xe8,0x40, +0x4, 0x7c,0xeb,0x7c,0xdf,0xb, 0xf0,0xbc,0xaf,0x38,0xf1,0xbc,0xad,0x38,0x2, 0x6c, +0xdd,0x7c,0xbd,0x12,0x8d,0xb3,0x12,0x48,0x6e,0x7e,0x73,0x2b,0x1f,0x7a,0x73,0x37, +0xbe,0x12,0x49,0x4, 0x7e,0x73,0x2b,0xf, 0x7a,0x73,0x37,0xce,0x12,0x48,0x30,0x7a, +0xd3,0x37,0xa6,0xda,0x79,0xda,0xd8,0x22,0x7e,0x90,0x5, 0xac,0x9f,0x9, 0xb4,0x26, +0x33,0xbc,0xbe,0x22,0x30,0x3, 0x3, 0x12,0x48,0x6e,0xa2,0x4, 0x92,0x5, 0x12,0x49, +0xc3,0x2, 0x49,0x4, 0x7e,0x73,0x2b,0x20,0x7a,0x73,0x37,0xbd,0x22,0x74,0x40,0x12, +0x6e,0x8b,0x50,0x9, 0xd2,0x3, 0xd2,0x4, 0x12,0x48,0xf4,0x80,0x1c,0x74,0x1, 0x12, +0x49,0x47,0x7e,0x43,0x37,0xbb,0x7e,0x50,0x64,0xac,0x45,0x12,0x87,0xf8,0x7a,0xb3, +0x2b,0x1f,0x7e,0xf, 0x38,0xd9,0x12,0x4d,0x9b,0x12,0x49,0x4, 0x7e,0x73,0x2b,0x1f, +0x7a,0x73,0x37,0xbe,0x2, 0x48,0x6e,0xca,0x3b,0x7c,0xdb,0xe4,0x7a,0xb3,0x2b,0x14, +0x12,0xc0,0x42,0x7e,0xc0,0xa, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, +0xe, 0x7e,0x1f,0x38,0xd9,0x12,0x90,0x58,0x7d,0x73,0xbe,0x74,0xff,0xff,0x78,0x9, +0x12,0x49,0xb7,0x2e,0x34,0x0, 0x3, 0x80,0x18,0xbe,0x74,0x80,0x0, 0x28,0x7, 0x12, +0x49,0xb7,0xb, 0x35,0x80,0xb, 0xbe,0x74,0x40,0x0, 0x28,0xc, 0x12,0x49,0xb7,0xb, +0x34,0x1b,0xa, 0x30,0x1b,0xc0,0x78,0xbe,0xbe,0xd0,0x1, 0x78,0x9, 0x7e,0x1f,0x38, +0xd9,0x12,0x8f,0xfb,0x7d,0x73,0x7e,0x1f,0x38,0xc8,0x69,0x31,0x0, 0x1a,0x7a,0x73, +0x2b,0x14,0x7d,0x37,0xda,0x3b,0x22,0x7e,0xf, 0x38,0xc8,0x2e,0x14,0x0, 0x1a,0xb, +0xa, 0x30,0x22,0xca,0x3b,0x7e,0x34,0xff,0xff,0x7a,0x35,0x35,0x7e,0xb3,0x37,0xb1, +0xf5,0x2a,0x7e,0xb3,0x2a,0x6d,0xf5,0x2b,0x7e,0xb3,0x2a,0x6e,0xf5,0x2c,0x7e,0xb3, +0x2a,0x70,0xf5,0x2d,0x7e,0xb3,0x2a,0x6f,0xf5,0x2e,0x7e,0x34,0x27,0x10,0x7a,0x35, +0x2f,0x7e,0x18,0x40,0x0, 0x7a,0x1d,0x31,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, +0x12,0x0, 0xe, 0x7e,0x8, 0x34,0x0, 0x12,0x4e,0x5f,0x6c,0xff,0x80,0x35,0x12,0x4c, +0x40,0x6c,0xee,0x80,0x19,0x7e,0x11,0x2c,0xac,0x1e,0x3e,0x4, 0x7e,0x30,0x2, 0xac, +0x3f,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x10,0x12,0x4c,0x47,0xe5,0x2e, +0xbc,0xbe,0x38,0xe1,0xe5,0x2e,0x12,0x4c,0x56,0x74,0x2, 0xac,0xbf,0x59,0x35,0x34, +0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xc5,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34, +0x10,0x0, 0x12,0x4c,0x7c,0x59,0x35,0x33,0xfe,0x6c,0xff,0x80,0x78,0x12,0x4c,0x40, +0x6c,0xee,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2a,0xbc,0xbe,0x38,0xe6,0xe5,0x2a, +0x12,0x4c,0x56,0x74,0x4, 0xac,0xbf,0x59,0x35,0x3, 0x60,0xe5,0x2a,0xbe,0xb1,0x2d, +0x50,0x35,0x12,0x4c,0x40,0x7e,0xe1,0x2a,0x80,0x14,0x12,0x4e,0x38,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x13,0x12,0x4c,0x47,0xe5,0x2d, +0xbc,0xbe,0x38,0xe6,0xe5,0x2a,0xa, 0x3b,0x6d,0x22,0xe5,0x2d,0xa, 0x1b,0x6d,0x0, +0x9f,0x1, 0x12,0x4c,0x5a,0x80,0x4, 0x7e,0x34,0x10,0x0, 0x74,0x4, 0xac,0xbf,0x59, +0x35,0x3, 0x62,0xb, 0xf0,0xe5,0x2e,0xbc,0xbf,0x38,0x82,0xe5,0x2d,0xa, 0x1b,0x6d, +0x0, 0x7e,0x18,0x0, 0x7a,0x12,0x1f,0x7, 0x6c,0xff,0x80,0x2e,0x74,0x2, 0xac,0xbf, +0x49,0x25,0x34,0x0, 0xa, 0x5f,0xad,0x53,0x7e,0x14,0x10,0x0, 0x9d,0x15,0xad,0x12, +0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78,0xf4,0x7d,0x21, +0x74,0x2, 0xac,0xbf,0x59,0x25,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xcc, +0xe5,0x2b,0xa, 0x1b,0x6d,0x0, 0x7e,0x18,0x0, 0x28,0x12,0x1f,0x7, 0x6c,0xff,0x80, +0x5c,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x60,0xa, 0x1f,0xad,0x13,0x7e,0xf4,0x10, +0x0, 0x9d,0xf1,0xad,0xf2,0x74,0xc, 0x1e,0xf4,0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80, +0x0, 0x14,0x78,0xf3,0x7d,0x2f,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x60,0xe5,0x2a, +0xbe,0xb1,0x2d,0x50,0x26,0x74,0x4, 0xac,0xbf,0x49,0x25,0x3, 0x62,0x2e,0x14,0x10, +0x0, 0xad,0x12,0x74,0xc, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e,0x20,0x80,0x14,0x78, +0xf4,0x7d,0x21,0x74,0x4, 0xac,0xbf,0x59,0x25,0x3, 0x62,0xb, 0xf0,0xe5,0x2b,0xbc, +0xbf,0x38,0x9e,0x7e,0x73,0x37,0xb3,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14, +0x78,0xfb,0x7e,0xf4,0x0, 0x64,0x7d,0x1f,0x12,0x1f,0x5, 0x7d,0xe3,0x7a,0xe5,0x35, +0x7e,0x73,0x37,0xb4,0xa, 0x37,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7d, +0x1f,0x12,0x1f,0x5, 0x7d,0x63,0x6c,0xff,0x80,0x20,0x74,0x2, 0xac,0xbf,0x49,0x45, +0x34,0x0, 0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35,0x34,0x0, 0x80,0x8, +0xbd,0x46,0x50,0x4, 0x59,0x65,0x34,0x0, 0xb, 0xf0,0xe5,0x2d,0xbc,0xbf,0x38,0xda, +0x6c,0xff,0x80,0x3a,0x74,0x4, 0xac,0xbf,0x49,0x45,0x3, 0x60,0xbe,0x45,0x35,0x28, +0x9, 0x7e,0x35,0x35,0x59,0x35,0x3, 0x60,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65, +0x3, 0x60,0x49,0x45,0x3, 0x62,0xbe,0x45,0x35,0x28,0x9, 0x7e,0x35,0x35,0x59,0x35, +0x3, 0x62,0x80,0x8, 0xbd,0x46,0x50,0x4, 0x59,0x65,0x3, 0x62,0xb, 0xf0,0xe5,0x2b, +0xbc,0xbf,0x38,0xc0,0x30,0x5, 0x6, 0x7e,0xd, 0x31,0x12,0x4d,0x9b,0xda,0x3b,0x22, +0x9f,0x11,0x7a,0x1f,0x24,0xf4,0x22,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x2f,0x10,0x7a, +0x1f,0x24,0xf4,0xb, 0xe0,0x22,0xa, 0x1b,0x6d,0x0, 0x7e,0x1f,0x24,0xf4,0x12,0x1f, +0x7, 0x7a,0x1f,0x24,0xf4,0x7e,0x25,0x2f,0x74,0xc, 0x7d,0x13,0x7d,0x32,0x6d,0x22, +0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x2, 0x1f,0x5, 0x7e,0xa1,0x2c,0x74, +0x2, 0xa4,0x22,0xca,0x3b,0x7e,0x8, 0x1f,0x34,0x12,0x4e,0x5f,0x7e,0x1f,0x38,0xf3, +0x7a,0x1d,0x26,0x7e,0xb3,0x2a,0x74,0xf5,0x2d,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x6, +0x7e,0x38,0x38,0x88,0x80,0x4, 0x7e,0x38,0x5, 0xf8,0x6d,0x33,0x7a,0x35,0x2a,0x74, +0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x38,0x87,0x70,0xe, 0x7e,0xb3,0x38,0x85,0x70,0x8, +0x74,0x1, 0x7a,0xb3,0x38,0x87,0xa1,0x57,0x7e,0xb3,0x38,0x87,0x70,0x6, 0x74,0x1, +0x7a,0xb3,0x38,0x87,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x17,0x75,0x2c,0x0, 0x80,0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xf0, +0x80,0x1b,0x75,0x2c,0x0, 0x80,0xf, 0x12,0x4c,0x7c,0x12,0x4d,0x8b,0x3e,0x24,0x3e, +0x24,0x1e,0x24,0x12,0x4e,0x27,0xe5,0x2d,0xbe,0xb1,0x2c,0x38,0xea,0x7e,0x34,0x61, +0x59,0x12,0x23,0x9e,0x7a,0x35,0x2e,0x7e,0x18,0x1f,0x34,0x7f,0x1, 0x12,0xa6,0x56, +0x75,0x2c,0x0, 0x80,0x16,0x12,0x4c,0x7c,0x12,0x4d,0x84,0xbe,0x35,0x2a,0x8, 0x9, +0x12,0x4c,0x7c,0x12,0x4d,0x84,0x7a,0x35,0x2a,0x5, 0x2c,0xe5,0x2d,0xbe,0xb1,0x2c, +0x38,0xe3,0x12,0x4d,0x93,0x40,0x25,0x7e,0xb3,0x38,0x86,0xb4,0x1, 0x1e,0x5, 0x1c, +0xe5,0x1c,0xbe,0xb0,0xa, 0x40,0x15,0x75,0x1c,0x0, 0xe5,0x2d,0xa, 0x3b,0x3e,0x34, +0xca,0x39,0x7e,0x1d,0x26,0x7f,0x3, 0x12,0x20,0xb9,0x1b,0xfd,0x74,0x2, 0x12,0x0, +0x1e,0x12,0x4d,0x93,0x50,0xb, 0x74,0x2, 0x7a,0xb3,0x38,0xf2,0xe4,0x7a,0xb3,0x38, +0x87,0xda,0x3b,0x22,0x49,0x35,0x1f,0x34,0x2, 0x21,0x0, 0x7f,0x13,0x2d,0x35,0xb, +0x1a,0x20,0x22,0x7e,0x37,0x2b,0x7, 0xbe,0x35,0x2a,0x22,0x12,0x4d,0xa5,0xb, 0x34, +0x7a,0x73,0x2b,0x20,0x22,0xca,0x79,0x7f,0x10,0x9f,0x0, 0x12,0xc1,0x3a,0x4c,0xaa, +0x78,0x6, 0x7e,0x34,0x0, 0x40,0x80,0x6c,0x6c,0x99,0x80,0x38,0xa, 0xe9,0x2e,0xe4, +0x60,0xac,0x7d,0x7e,0x7a,0xf1,0x82,0x7a,0xe1,0x83,0xe4,0x93,0x7c,0x8b,0x90,0x60, +0xaa,0xe4,0x93,0x70,0xe, 0x7e,0xf3,0x2a,0x6e,0xac,0xf8,0x7e,0xb3,0x2a,0x70,0xa, +0xfb,0x2d,0xf7,0x7d,0xef,0x3e,0xe4,0x7f,0x61,0x2d,0xde,0xb, 0x6a,0xd0,0x6d,0xcc, +0x2f,0x6, 0xb, 0x90,0xbc,0xa9,0x38,0xc4,0xbe,0x8, 0x0, 0x0, 0x78,0x2, 0xb, 0xc, +0xa, 0x5a,0x6d,0x44,0x7f,0x10,0x7f,0x2, 0x12,0x1f,0x7, 0x7f,0x1, 0xb, 0xc, 0x7e, +0x34,0xc4,0x0, 0x7e,0x24,0x0, 0x9, 0x12,0x1f,0x7, 0xbe,0x34,0x0, 0xfa,0x28,0x4, +0x7e,0x34,0x0, 0xfa,0xda,0x79,0x22,0x7e,0xd, 0x26,0x2d,0x15,0xb, 0xa, 0x30,0x9d, +0x32,0x59,0x35,0x1f,0x34,0x5, 0x2c,0x22,0x7e,0x11,0x2c,0xac,0x1f,0x3e,0x4, 0x7e, +0x30,0x2, 0xac,0x3e,0x2d,0x10,0x7e,0x1d,0x31,0x2d,0x31,0xb, 0x1a,0x20,0x7a,0x27, +0x24,0xf2,0x74,0x2, 0xac,0xbe,0x49,0x35,0x34,0x0, 0xad,0x23,0x74,0xc, 0x22,0x7e, +0x34,0x0, 0x38,0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x2a,0x6d,0x12,0xd, 0x72,0xe4,0x12, +0x0, 0xe, 0x74,0x1, 0x7e,0x70,0x99,0x12,0x13,0x2c,0x2, 0x0, 0x4e,0xb4,0x3, 0x5, +0x12,0x4e,0x8d,0x80,0x2, 0xe4,0x22,0x12,0x4e,0x72,0x74,0x1, 0x22,0x12,0xc0,0x9f, +0xe4,0x12,0x0, 0xe, 0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0x12,0x7f,0x6f,0x38,0x2, +0xe4,0x22,0x12,0x7f,0x67,0x49,0x55,0x34,0x3b,0xbe,0xb0,0x2, 0x38,0x3, 0x2, 0x4e, +0xb4,0x2, 0x4e,0x7d,0x7e,0xd7,0x2b,0xd, 0xbe,0xb0,0x1, 0x28,0x2, 0xe4,0x22,0x12, +0x7e,0xf8,0x12,0x4e,0xe0,0x7a,0xd7,0x2b,0xd, 0x7e,0x73,0x2a,0xfa,0xa, 0x37,0x3e, +0x34,0x3e,0x34,0xe4,0x7e,0x50,0x1, 0x12,0x13,0x1, 0x12,0x4f,0xaf,0x74,0x1, 0x22, +0x7e,0x8, 0x2a,0x6d,0x2, 0x5, 0xb4,0xca,0x3b,0x7e,0xe3,0x2a,0x74,0x7e,0xf3,0x2a, +0xfa,0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x4e,0xe0,0x12,0xc0,0xe7,0x12,0x29,0x6f, +0x7e,0x17,0x2a,0xfe,0x6d,0x0, 0x12,0x20,0xde,0x7e,0xd0,0x7, 0x12,0x26,0x57,0x6c, +0xcc,0x80,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x12,0x4f,0xf0,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, +0x3c,0xbd,0x32,0x48,0xde,0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x7e,0xb3, +0x2a,0x73,0x7c,0x7e,0x12,0x7b,0x31,0x6c,0xcc,0x80,0x29,0x74,0x2, 0xac,0xbc,0x49, +0x35,0x6, 0xfc,0xbe,0x34,0x15,0x40,0x50,0x19,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7c,0xb7,0x64,0xff,0x12,0x4f,0xf0,0x5c,0x7b,0x7a, +0x29,0x70,0xb, 0xc0,0x12,0x7b,0xb7,0xa, 0x3c,0xbd,0x32,0x48,0xce,0x1b,0xd0,0xbe, +0xd0,0x0, 0x58,0x88,0x12,0x7b,0x39,0x74,0x2, 0x12,0xc1,0xa, 0x12,0x50,0x51,0x74, +0x2, 0x12,0x0, 0x1e,0x7a,0xf3,0x2a,0xfa,0x12,0x4e,0xe0,0xda,0x3b,0x22,0x74,0x2, +0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0xfc,0x12,0x50,0x51,0x74,0x2, 0x12,0x0, 0x1e,0x74, +0x5, 0x7e,0x70,0x9b,0x12,0x13,0x2c,0x12,0x4f,0xc1,0x7e,0xb3,0x2a,0xfc,0x2, 0xe, +0x94,0x6c,0xaa,0x80,0x22,0xa, 0x3a,0x9, 0x73,0x2a,0xdc,0x2e,0x34,0x20,0x73,0x12, +0x91,0x6d,0x7c,0x7b,0xa, 0x47,0x7e,0x50,0x2, 0xac,0x5a,0x7e,0xf, 0x38,0xc0,0x2d, +0x12,0x79,0x40,0x0, 0x48,0xb, 0xa0,0x7e,0x63,0x2a,0x74,0xbc,0x6a,0x38,0xd6,0x22, +0xa, 0x2c,0x2e,0x27,0x2a,0xfe,0x7e,0x29,0x70,0x22,0xe5,0xd, 0x60,0x52,0xe5,0xd, +0x30,0xe0,0x6, 0x53,0xd, 0xfe,0x12,0x4e,0xe0,0xe5,0xd, 0x30,0xe1,0x14,0x53,0xd, +0xfd,0x7e,0xb3,0x37,0xe0,0x70,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x12,0xc1,0xa, 0x12, +0x50,0xd4,0xe5,0xd, 0x30,0xe2,0x29,0x53,0xd, 0xfb,0xe4,0x7a,0xb3,0x37,0xe1,0x7e, +0xb3,0x37,0xe0,0x70,0xa, 0x74,0x1, 0x12,0x0, 0x1e,0x12,0x3f,0x67,0x80,0x7, 0xe4, +0x12,0x0, 0x1e,0x12,0x3f,0x49,0x12,0x3b,0x15,0x7e,0xb3,0x2a,0xfc,0x2, 0x50,0x51, +0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x24,0xf2,0x12,0x3f,0xe9,0x7e,0xa3,0x2a,0x73, +0x7e,0x73,0x2a,0x74,0x6c,0xee,0x80,0x1e,0xa, 0x2e,0x9, 0x62,0x2a,0xdc,0xa, 0x26, +0x12,0x51,0x4b,0x93,0x7c,0x6b,0xbe,0x60,0x1c,0x50,0x9, 0xa, 0x2e,0x12,0x50,0xca, +0x19,0xb2,0x24,0xf2,0xb, 0xe0,0xbc,0x7e,0x38,0xde,0x6c,0xee,0x80,0x1a,0xa, 0x2e, +0x9, 0x62,0x2a,0xb9,0xbe,0x60,0x23,0x50,0xd, 0xa, 0x1e,0xa, 0x27,0x2d,0x21,0x12, +0x50,0xca,0x19,0xb2,0x25,0xe, 0xb, 0xe0,0xbc,0xae,0x38,0xe2,0x6c,0xee,0x7e,0x30, +0xe, 0xac,0x3e,0x2e,0x14,0x24,0xf2,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11,0xba, +0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x27,0x2a,0xfe,0x7e,0x29, +0xb0,0xa, 0x26,0x22,0xca,0x79,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xe9,0x7e, +0xa3,0x2a,0x73,0x7e,0x63,0x2a,0x74,0x6c,0xee,0x80,0x1f,0xa, 0x2e,0x9, 0x72,0x2a, +0xdc,0xbe,0x70,0x1c,0x50,0x12,0xa, 0x27,0x12,0x51,0x4b,0x93,0x7c,0x7b,0x7e,0xb3, +0x2a,0xfb,0xa, 0x27,0x19,0xb2,0x1f,0x34,0xb, 0xe0,0xbc,0x6e,0x38,0xdd,0x6c,0xee, +0x80,0x17,0xa, 0x3e,0x9, 0x73,0x2a,0xb9,0xbe,0x70,0x23,0x50,0xa, 0x7e,0x63,0x2a, +0xfb,0xa, 0x27,0x19,0x62,0x1f,0x50,0xb, 0xe0,0xbc,0xae,0x38,0xe5,0x6c,0xee,0x7e, +0x30,0xe, 0xac,0x3e,0x2e,0x14,0x1f,0x34,0x6d,0x0, 0x7c,0xbf,0x7c,0x7e,0x12,0x11, +0xf8,0xb, 0xe0,0xbe,0xe0,0x5, 0x40,0xe7,0xda,0x79,0x22,0x2e,0x24,0x20,0x73,0x7a, +0x51,0x82,0x7a,0x41,0x83,0xe4,0x22,0x7a,0xb3,0x34,0xc4,0x7c,0xbf,0x6c,0x77,0x7c, +0x67,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xb7,0x54,0x7, 0xa, 0x2b,0x2e, +0x24,0x0, 0x5e,0x12,0x51,0x4f,0x93,0x7c,0x7b,0x4c,0x66,0x68,0xf, 0xa, 0x2a,0x2e, +0x24,0x27,0x72,0x7e,0x29,0xb0,0x4c,0xb7,0x7a,0x29,0xb0,0x22,0x7c,0xb7,0x64,0xff, +0xa, 0x2a,0x2e,0x24,0x27,0x72,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0xca, +0xf8,0x6c,0xaa,0x6d,0x33,0x7e,0x24,0x7f,0xff,0x7e,0xf0,0x1, 0x80,0x32,0xa, 0x1f, +0x7e,0xb3,0x2a,0x6e,0xa, 0xb, 0x2d,0x1, 0x3e,0x4, 0x49,0x10,0x4, 0xfc,0xbe,0x14, +0x3, 0xe8,0x8, 0x1a,0xb, 0xa0,0xbd,0x13,0x8, 0x4, 0x7d,0x31,0x80,0x10,0xbd,0x12, +0x58,0xc, 0x7d,0x21,0xbe,0x24,0x0, 0x0, 0x18,0x4, 0x7e,0x24,0x0, 0x1, 0xb, 0xf0, +0x7e,0xb3,0x2a,0x6f,0xa, 0xb, 0x1b,0x4, 0xa, 0x1f,0xbd,0x10,0x48,0xc0,0x7e,0xb3, +0x34,0xa1,0x7a,0xb3,0x36,0xf3,0x7a,0xa3,0x36,0xf7,0xe4,0x7a,0xb3,0x36,0xf5,0xbe, +0xa0,0xb, 0x78,0x18,0x9d,0x32,0xbe,0x34,0x4, 0xb0,0x58,0x10,0x7e,0x37,0x28,0x8a, +0xbe,0x34,0x1, 0x5e,0x58,0x6, 0x74,0x1, 0x7a,0xb3,0x34,0xa1,0x7e,0x73,0x34,0xa1, +0xbe,0x70,0x0, 0x28,0x3e,0x6c,0xff,0x80,0x35,0x7c,0xbf,0x12,0x97,0xfc,0x60,0x22, +0x74,0x22,0x7a,0xb3,0x36,0xf4,0x7e,0xb3,0x34,0xc4,0x4, 0x12,0x51,0x57,0x7e,0x73, +0x34,0xc4,0xbe,0x70,0x5, 0x40,0x15,0xe4,0x7a,0xb3,0x34,0xc4,0x7a,0xb3,0x34,0xa1, +0x80,0xa, 0xe4,0x12,0x51,0x57,0x74,0x33,0x7a,0xb3,0x36,0xf5,0xb, 0xf0,0x12,0x52, +0x66,0x38,0xc6,0xda,0xf8,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7f,0x22,0xca,0xd8,0xca, +0x79,0xc2,0x3, 0x6d,0x88,0x7a,0x87,0x38,0x3c,0xe4,0x7a,0xb3,0x1f,0x58,0xe5,0x1d, +0xbe,0xb0,0xff,0x50,0x2, 0x5, 0x1d,0x7e,0xb3,0x28,0x84,0x60,0xc, 0x12,0x8c,0x87, +0xb, 0x1a,0x80,0xbe,0x87,0x7, 0xfa,0x28,0xa, 0xc2,0x10,0x6d,0x88,0x7a,0x87,0x37, +0xfd,0x61,0xa0,0x12,0x93,0x91,0x60,0x12,0x7e,0x34,0x62,0xe, 0x12,0x87,0xc4,0x7a, +0x87,0x37,0xf3,0x12,0x54,0x2b,0x7a,0x87,0x37,0xfd,0x7e,0x87,0x37,0xf3,0x4d,0x88, +0x68,0x6, 0x74,0x1, 0x7a,0xb3,0x28,0xa9,0x6c,0xff,0x80,0x7b,0xe4,0xa, 0x3f,0x19, +0xb3,0x1f,0x34,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x52,0x7c,0xbd, +0x7c,0x7e,0x12,0x55,0xb9,0x7d,0x93,0x7e,0x87,0x37,0xfd,0xbd,0x89,0x50,0x4, 0x7a, +0x97,0x37,0xfd,0x7e,0x87,0x38,0x3c,0xbd,0x89,0x50,0x4, 0x7a,0x97,0x38,0x3c,0xe5, +0x1d,0xbe,0xb0,0x5, 0x38,0x1f,0x7e,0x8, 0x37,0xff,0x12,0x54,0x4e,0x50,0x7, 0x12, +0x54,0x45,0xd2,0x3, 0x80,0x2f,0x7e,0x8, 0x37,0xff,0x7e,0x18,0x1f,0x52,0x12,0x57, +0x0, 0x50,0x22,0x80,0x10,0x12,0x54,0x2b,0xbd,0x89,0x38,0x19,0x7e,0x8, 0x1f,0x52, +0x12,0x91,0x86,0x50,0x10,0x12,0x54,0x45,0x7e,0x8, 0x1f,0x58,0x7e,0x18,0x1f,0x52, +0x12,0x93,0x6b,0xd2,0x3, 0xb, 0xf0,0x12,0x52,0x66,0x38,0x80,0x30,0x3, 0x37,0x6c, +0xff,0x80,0x20,0x12,0x54,0x3c,0x9, 0xe5,0x26,0xfb,0x7e,0x8, 0x1f,0x58,0x12,0x54, +0x4e,0x40,0x9, 0xa, 0x3f,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x5, 0x7c,0xbf,0x12,0x54, +0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdb,0x75,0x1d,0x0, 0x7e,0x34,0x62,0xe, 0x12, +0x23,0x9e,0x7a,0x37,0x37,0xf3,0x7e,0x63,0x1f,0x58,0x7e,0x70,0x6, 0xac,0x67,0xb, +0x34,0xca,0x39,0x7e,0x18,0x1f,0x58,0x7e,0x8, 0x37,0xff,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x37,0x37,0xf3,0x4d,0x33,0x78,0x39,0x90,0x62,0x9, 0xe4,0x93,0xa, 0x3b,0xbe, +0x37,0x37,0xfd,0x38,0x40,0x7c,0x7b,0x1e,0x70,0xa, 0x37,0xbe,0x37,0x38,0x3c,0x38, +0x34,0x90,0x60,0x51,0x12,0x54,0x33,0x7e,0x73,0x26,0xf7,0xa, 0x37,0xbd,0x32,0x8, +0x24,0x90,0x60,0x50,0x12,0x54,0x33,0x7e,0x73,0x26,0xf6,0xa, 0x37,0xbd,0x32,0x8, +0x14,0x6c,0xff,0x80,0x7, 0x7c,0xbf,0x12,0x54,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf4,0xd2,0x3, 0x80,0x6, 0x6d,0x33,0x7a,0x37,0x37,0xfd,0xa2,0x3, 0x92,0x10,0x12, +0x56,0xe9,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab,0x7e,0xb3,0x39,0xb, 0x70,0x1b,0x7e, +0xb3,0x28,0xa8,0x70,0x15,0x12,0xc1,0x2a,0x68,0x10,0x7e,0xb3,0x2a,0x6b,0xbe,0xb0, +0x1, 0x68,0x7, 0x7c,0xba,0x6c,0x77,0x2, 0x51,0x5f,0x22,0x90,0x62,0x9, 0xe4,0x93, +0xa, 0x8b,0x22,0xe4,0x93,0x7c,0x7b,0x1e,0x70,0xa, 0x27,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0xd5,0x26,0xfa,0x22,0x74,0x1, 0xa, 0x8f,0x19,0xb8,0x1f,0x34,0x22,0x7c,0xbd, +0x7c,0x7e,0x7c,0x6b,0xc2,0x4, 0x6c,0xaa,0x80,0x30,0x7e,0x50,0x6, 0xac,0x5a,0x7f, +0x70,0x2d,0xf2,0xb, 0xf4,0x29,0xb7,0x0, 0x2, 0xbc,0xb6,0x40,0x1b,0x7e,0x7b,0xb0, +0xbc,0xb6,0x38,0x14,0x29,0xb7,0x0, 0x3, 0xbc,0xb7,0x40,0xc, 0x29,0xb7,0x0, 0x1, +0xbc,0xb7,0x38,0x4, 0xd2,0x4, 0x80,0x9, 0xb, 0xa0,0x7e,0xb, 0xb0,0xbc,0xba,0x38, +0xc9,0xa2,0x4, 0x22,0xca,0xd8,0xca,0x79,0x7e,0xa3,0x2a,0x6e,0x7e,0x47,0x28,0x99, +0xe4,0x7a,0xb3,0x28,0xa6,0x7e,0xb3,0x26,0xf0,0xbe,0xb0,0x0, 0x28,0x4c,0x7e,0x73, +0x28,0x85,0xbe,0x70,0x0, 0x28,0x43,0x6c,0xff,0x80,0x3b,0x7e,0x50,0x2, 0xac,0x5f, +0x9, 0xd2,0x27,0x36,0x9, 0xe2,0x27,0x37,0x7e,0x50,0x2, 0xac,0x5e,0x49,0x12,0x4, +0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x53,0xbd,0x12,0x58,0x19,0x12,0x55,0xa6,0x49,0x12, +0x4, 0xfc,0x6d,0x22,0x9e,0x27,0x2a,0x51,0xbd,0x12,0x58,0x8, 0x74,0x1, 0x7a,0xb3, +0x28,0xa6,0x80,0x6, 0xb, 0xf0,0xbc,0x7f,0x38,0xc1,0xe4,0x7a,0xb3,0x28,0xa7,0x7e, +0xb3,0x26,0x83,0x70,0x40,0x12,0x8f,0xe3,0x28,0x3b,0x6c,0xff,0x80,0x33,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0x26,0xfa,0x9, 0xe2,0x26,0xfb,0x12,0x55,0xa6,0x49,0x2, +0x5, 0x7a,0x6d,0x11,0x9d,0x14,0xbd,0x1, 0x48,0xd, 0x7e,0x10,0x2, 0xac,0x1e,0x49, +0x20,0x5, 0x7a,0xbd,0x21,0x58,0x8, 0x74,0x1, 0x7a,0xb3,0x28,0xa7,0x80,0x6, 0xb, +0xf0,0xbc,0x7f,0x38,0xc9,0x12,0xb1,0x8e,0xe4,0x7a,0xb3,0x28,0xa9,0x7e,0x37,0x28, +0x88,0x2e,0x37,0x28,0x86,0xbe,0x37,0x28,0x9f,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x28, +0xa9,0x74,0x1, 0x7a,0xb3,0x28,0xaa,0x6c,0xff,0x80,0x1f,0x12,0x55,0xaf,0x49,0x25, +0x25,0xf7,0x7d,0x43,0x9d,0x42,0x7d,0x34,0x12,0x21,0x0, 0xbe,0x37,0x28,0x9d,0x8, +0x7, 0xe4,0x7a,0xb3,0x28,0xaa,0x80,0x7, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xdc,0x6c, +0xff,0x80,0x9, 0x12,0x55,0xaf,0x59,0x35,0x25,0xf7,0xb, 0xf0,0x12,0x52,0x66,0x38, +0xf2,0xda,0x79,0xda,0xd8,0x22,0xa, 0x1d,0xa, 0x2a,0x2d,0x21,0x3e,0x24,0x22,0x7c, +0xbf,0x12,0x37,0x6f,0x74,0x2, 0xac,0xbf,0x22,0xca,0x3b,0x7c,0xc7,0x7c,0xfb,0x7f, +0x40,0x6d,0x33,0x7a,0x35,0x24,0x7e,0xa3,0x2a,0x6d,0x7e,0x73,0x2a,0x6e,0x4c,0xcc, +0x78,0x5, 0x7e,0xc0,0x1, 0x80,0xd, 0x7c,0xb7,0x14,0xbc,0xbc,0x78,0x6, 0xa, 0x6c, +0x1b,0x65,0x7c,0xcd,0x4c,0xff,0x78,0x5, 0x7e,0xf0,0x1, 0x80,0xb, 0x7c,0xba,0x14, +0xbc,0xbf,0x78,0x4, 0xa, 0x7f,0x1b,0x75,0x7f,0x4, 0x7e,0x34,0x0, 0x6, 0xe4,0x12, +0x20,0xde,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x1b,0x34,0x7a,0x4b,0x70,0x7e,0x73,0x2a, +0x6e,0xa, 0x37,0x1b,0x34,0x39,0x74,0x0, 0x1, 0x7c,0xec,0x80,0x1c,0x75,0x26,0x0, +0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56,0xd3,0x1b,0xd0,0xbe,0xd0, +0x0, 0x58,0xf1,0xe5,0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xdf,0x7c,0xec, +0x80,0x23,0x75,0x26,0x0, 0x1a,0x3f,0xb, 0x34,0x7c,0xd7,0x80,0xa, 0x12,0x91,0xd5, +0x70,0xd, 0x12,0x56,0xd3,0xb, 0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5, +0x26,0x60,0x7, 0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xd8,0x1a,0x3c,0xb, 0x34,0x7c,0xe7, +0x80,0x1c,0x75,0x26,0x0, 0x7c,0xdf,0x80,0xa, 0x12,0x91,0xd5,0x70,0xa, 0x12,0x56, +0xd3,0x1b,0xd0,0xbe,0xd0,0x0, 0x58,0xf1,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e,0x73, +0x2a,0x6e,0xbc,0x7e,0x18,0xdc,0x1a,0x3c,0xb, 0x34,0x7c,0xe7,0x80,0x21,0x75,0x26, +0x0, 0x1a,0x6f,0xb, 0x64,0x80,0xa, 0x12,0x91,0xd5,0x70,0xd, 0x12,0x56,0xd3,0xb, +0xd0,0x7e,0x73,0x2a,0x6d,0xbc,0x7d,0x18,0xee,0xe5,0x26,0x60,0xa, 0xb, 0xe0,0x7e, +0x73,0x2a,0x6e,0xbc,0x7e,0x18,0xd7,0x7e,0x35,0x24,0x7d,0x23,0x39,0x54,0x0, 0x5, +0xda,0x3b,0x22,0x5, 0x26,0x7e,0x35,0x24,0xb, 0x34,0x7a,0x35,0x24,0x22,0x12,0x57, +0x32,0x12,0x51,0x9f,0x7a,0xb3,0x2a,0xc, 0x22,0x30,0x10,0x13,0x12,0xc1,0x1a,0x68, +0x6, 0x7e,0xb3,0x39,0xb, 0x60,0x8, 0x7e,0x34,0xb, 0xb8,0x7a,0x37,0x37,0xfb,0x22, +0x7f,0x61,0x7f,0x50,0x7e,0x6b,0x90,0x80,0x1f,0x29,0x86,0x0, 0x1, 0x80,0xf, 0x7f, +0x5, 0x7c,0xb9,0x7c,0x78,0x12,0x54,0x52,0x50,0x2, 0xd3,0x22,0xb, 0x80,0x29,0x76, +0x0, 0x3, 0xbc,0x78,0x50,0xe9,0xb, 0x90,0x29,0x76,0x0, 0x2, 0xbc,0x79,0x50,0xd9, +0xc3,0x22,0x7e,0xa3,0x28,0x84,0xe4,0x7a,0xb3,0x34,0xa2,0x6c,0x33,0x80,0x3d,0x7e, +0x70,0x2, 0xac,0x73,0x9, 0x23,0x26,0xfb,0x7e,0x10,0x1, 0x6c,0x0, 0x80,0x27,0xbc, +0x3, 0x68,0x21,0x7e,0x70,0x2, 0xac,0x70,0x9, 0x93,0x26,0xfb,0xa, 0x29,0xa, 0x32, +0x12,0x35,0x67,0x18,0x2, 0xb, 0x10,0xbe,0x10,0x2, 0x40,0x8, 0x74,0x2, 0x7a,0xb3, +0x34,0xa2,0x80,0x6, 0xb, 0x0, 0xbc,0xa0,0x38,0xd5,0xb, 0x30,0xbc,0xa3,0x38,0xbf, +0x2, 0x57,0x83,0xca,0xf8,0x7e,0x33,0x28,0x84,0x6c,0x22,0x80,0x45,0x74,0x2, 0xac, +0xb2,0x9, 0x15,0x26,0xfa,0x9, 0x5, 0x26,0xfb,0x7e,0xa0,0x1, 0x6c,0x99,0x80,0x2c, +0xbc,0x92,0x68,0x26,0x7e,0x70,0x2, 0xac,0x79,0x9, 0x83,0x26,0xfa,0x9, 0xf3,0x26, +0xfb,0xa, 0x28,0xa, 0x31,0x12,0x35,0x67,0x18,0xb, 0xa, 0x2f,0xa, 0x30,0x12,0x35, +0x67,0x8, 0x2, 0xb, 0xa0,0xbe,0xa0,0x3, 0x50,0x6, 0xb, 0x90,0xbc,0x39,0x38,0xd0, +0xb, 0x20,0xbc,0x32,0x38,0xb7,0x7e,0xb3,0x35,0x3e,0xbe,0xb0,0x0, 0x28,0x12,0x14, +0x7a,0xb3,0x35,0x3e,0xbe,0xb0,0x14,0x28,0x8, 0x7e,0x34,0x0, 0x78,0x7a,0x37,0x2a, +0x5a,0x7e,0xb3,0x36,0xec,0x70,0x58,0x7e,0xb3,0x39,0xb, 0x70,0x52,0x7e,0xb3,0x36, +0x71,0x70,0x4c,0x7e,0x37,0x37,0xfd,0xbe,0x34,0x0, 0x14,0x50,0x42,0x7e,0x37,0x28, +0x8a,0xbe,0x34,0x3, 0x20,0x58,0x38,0x7e,0xb3,0x28,0x84,0xbe,0xb0,0x3, 0x40,0x2f, +0xbe,0xa0,0x3, 0x40,0x2a,0x7e,0xb3,0x26,0x85,0xbe,0xb0,0x3, 0x50,0x9, 0x7e,0xb3, +0x26,0x84,0xbe,0xb0,0x3, 0x40,0x18,0x7e,0xb3,0x26,0xf6,0xbe,0xb0,0x8, 0x50,0x9, +0x7e,0xb3,0x26,0xf7,0xbe,0xb0,0x8, 0x40,0x6, 0x74,0x1e,0x7a,0xb3,0x35,0x3e,0xda, +0xf8,0x22,0xca,0xd8,0xca,0x79,0x7e,0x73,0x2a,0x6e,0x7e,0xf3,0x2a,0x6d,0xac,0xf7, +0x7d,0x37,0x3e,0x34,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x20,0xde,0x7e,0xb3,0x37,0xb7, +0xb4,0x1, 0x64,0x7e,0x73,0x37,0xb8,0xbe,0x70,0x0, 0x28,0x5b,0x6c,0xdd,0x80,0x3c, +0x12,0x26,0x57,0x12,0x28,0x62,0x6d,0x33,0x80,0x28,0x7e,0x35,0x24,0x3e,0x34,0x49, +0x33,0xd, 0xc8,0x12,0x21,0x0, 0x7a,0x35,0x26,0x7e,0x35,0x24,0x7d,0x13,0x3e,0x14, +0x49,0x21,0x1f,0x34,0xbe,0x25,0x26,0x58,0x7, 0x7e,0x25,0x26,0x59,0x21,0x1f,0x34, +0xb, 0x34,0x7a,0x35,0x24,0xbe,0x75,0x24,0x38,0xd0,0xb, 0xd0,0x7e,0x73,0x37,0xb8, +0xbc,0x7d,0x38,0xbc,0x7d,0x37,0x3e,0x34,0xca,0x39,0x7e,0x18,0x1f,0x34,0x7e,0x8, +0xd, 0xc8,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x37,0x5, +0xb4,0x1, 0x4, 0xe4,0x2, 0x58,0xe8,0x22,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22, +0x12,0x68,0x10,0x12,0x7d,0x94,0x7e,0xb3,0x37,0x8, 0xb4,0x1, 0x74,0x12,0xb6,0xe2, +0x7e,0x34,0x60,0xa5,0x12,0x23,0x9e,0x12,0x26,0x5b,0x12,0x91,0x18,0x12,0x47,0x2c, +0x12,0x28,0x62,0x50,0xde,0x12,0xab,0xdb,0x12,0x75,0xe9,0x7e,0xb3,0x37,0x5, 0xb4, +0x1, 0x4, 0xe4,0x12,0x58,0xe8,0x12,0xaf,0x89,0x12,0xa7,0xbd,0x12,0x5e,0xaa,0x40, +0xc2,0x12,0x88,0x5f,0x12,0x5e,0xaa,0x40,0xba,0x12,0x56,0xde,0x12,0x2a,0x3, 0x12, +0x0, 0x6e,0x12,0x5f,0x2f,0x12,0x5f,0x83,0x12,0x5b,0x94,0x12,0x96,0x24,0x12,0x5e, +0xc2,0x12,0x5f,0xcd,0x12,0xaa,0xe6,0x12,0x87,0x74,0x7e,0xb3,0x36,0xf1,0xbe,0xb0, +0x88,0x68,0x3, 0x12,0x59,0x77,0x12,0x67,0xfa,0x12,0x26,0x66,0x12,0x62,0xa5,0x80, +0x82,0x12,0x2f,0xee,0x2, 0x58,0xdc,0xca,0x3b,0x75,0x24,0x0, 0x6c,0xff,0x12,0x35, +0xd3,0x75,0x28,0x3, 0x6c,0xee,0x7e,0x48,0x29,0xbc,0x7e,0xb3,0x2a,0xb, 0x70,0xe, +0x7e,0xb3,0x2a,0x7, 0x70,0x8, 0x7e,0xb3,0x2a,0x8, 0x70,0x2, 0x61,0x6b,0x30,0xe, +0x6, 0x7e,0x68,0x33,0x28,0x80,0x4, 0x7e,0x68,0x32,0xea,0x7f,0x6, 0x12,0x7e,0xef, +0x7e,0x73,0x2a,0x4, 0x7a,0x6b,0x70,0x6c,0xdd,0x61,0x1c,0x74,0x9, 0xac,0xbd,0x9, +0xc5,0x29,0xc, 0x7c,0xbc,0x54,0xf, 0xa, 0x3b,0x12,0x5e,0x3d,0xf5,0x28,0x7c,0xbc, +0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x2, 0x61,0x1a,0xe5,0x28,0xbe,0xb0,0x3, 0x78,0x2, +0x61,0x1a,0x7e,0x8, 0x0, 0x28,0x7c,0xbc,0x12,0x9e,0xec,0x50,0x2, 0x61,0x1a,0x74, +0x9, 0xac,0xbd,0x9, 0xb5,0x29,0xd, 0xf5,0x25,0x74,0x9, 0xac,0xbd,0x9, 0xb5,0x29, +0xe, 0xc4,0x54,0xf0,0xf5,0x26,0x7e,0x73,0x2a,0x4d,0xbc,0x7c,0x28,0x54,0x7e,0xb3, +0x2a,0x9, 0x70,0x2a,0x75,0x29,0xf, 0x7e,0x8, 0x0, 0x25,0xa, 0x3c,0x2e,0x34,0x32, +0xd6,0x6d,0x22,0x74,0x1, 0x12,0x7f,0xd4,0x75,0x29,0x20,0x7e,0x8, 0x0, 0x26,0xa, +0x3c,0x2e,0x34,0x32,0xe0,0x6d,0x22,0x74,0x10,0x12,0x7f,0xd4,0x80,0xe, 0xa, 0x3c, +0x9, 0xb3,0x32,0xd6,0xf5,0x25,0x9, 0xb3,0x32,0xe0,0xf5,0x26,0xa, 0x3c,0x12,0x5e, +0x3d,0xb4,0x1, 0xe, 0xe4,0xa, 0x3c,0x19,0xb3,0x32,0xd6,0x19,0xb3,0x32,0xe0,0x12, +0x35,0xd3,0x7e,0xb3,0x2a,0x64,0xb4,0xff,0x13,0x75,0x25,0x0, 0x74,0x9, 0xac,0xbd, +0x9, 0xb5,0x29,0xc, 0xbe,0xb0,0xff,0x68,0x3, 0x75,0x25,0x1, 0x7e,0x90,0x9, 0xac, +0x9d,0x49,0xb4,0x29,0x8, 0x49,0xa4,0x29,0xa, 0xe5,0x28,0xb4,0x1, 0x2c,0x75,0x27, +0x0, 0x80,0x1d,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x9, 0xb3,0x33,0x6a,0x54,0xf, +0xbc,0xbc,0x78,0xa, 0x49,0xb3,0x33,0x66,0x49,0xa3,0x33,0x68,0x80,0xc, 0x5, 0x27, +0x90,0x60,0x99,0xe4,0x93,0xbe,0xb1,0x27,0x38,0xd9,0x5e,0xb4,0xf, 0xff,0x5e,0xa4, +0xf, 0xff,0x9, 0x74,0x29,0xc, 0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x2d,0xa5, +0xbe,0x70,0xff,0x68,0x16,0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x2, 0x5, 0x24,0xb, 0xf0, +0xe5,0x28,0xa, 0x5b,0x12,0xb9,0x5c,0x2d,0xb5,0x80,0x4, 0x2e,0xb4,0xc0,0x0, 0x7e, +0x70,0x6, 0xac,0x7e,0x7f,0x6, 0x2d,0x13,0x79,0xb0,0x0, 0x2, 0x7f,0x6, 0x2d,0x13, +0x79,0xa0,0x0, 0x4, 0xe5,0x25,0x7f,0x6, 0x2d,0x13,0x39,0xb0,0x0, 0x6, 0xe5,0x26, +0x2d,0x3d,0x7d,0x2c,0x39,0xb1,0x0, 0x7, 0xb, 0xe0,0xb, 0xd0,0x7e,0x73,0x2a,0x4d, +0xbc,0x7d,0x28,0x2, 0x21,0xbb,0xe5,0x24,0x39,0xb6,0x0, 0x1, 0x7e,0xb3,0x37,0x31, +0xb4,0x1, 0x9, 0x7e,0xb3,0x2a,0x8, 0xb4,0x1, 0x17,0x80,0xd, 0xbe,0xf0,0x0, 0x38, +0x6, 0x7e,0xb3,0x2a,0x8, 0x60,0xa, 0xb2,0xe, 0x12,0x7e,0x81,0x74,0x1, 0x12,0x58, +0xe8,0x7e,0xb3,0x2a,0x7, 0x60,0x5, 0x7f,0x4, 0x12,0x5e,0x61,0xe4,0x7a,0xb3,0x2a, +0xb, 0x7a,0xb3,0x2a,0x7, 0x7a,0xb3,0x2a,0x8, 0x80,0x4, 0xe4,0x12,0x58,0xe8,0x12, +0x5f,0xc2,0xca,0x59,0x7e,0x18,0x29,0x8, 0x7e,0x8, 0x33,0x66,0x12,0x20,0xb9,0x1b, +0xfd,0x4c,0xff,0x78,0xc, 0x12,0x73,0xe5,0x7e,0x8, 0x33,0x66,0x74,0xff,0x12,0x20, +0xde,0xda,0x3b,0x22,0xca,0xf8,0x7e,0x68,0x29,0xbc,0x6c,0xaa,0x80,0x19,0x7e,0x70, +0xff,0x12,0x5e,0x8b,0xe4,0xa, 0x4a,0x19,0xb4,0x1f,0x34,0x74,0xff,0x19,0xb4,0x1f, +0x46,0x19,0xb4,0x1f,0x50,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe2,0x7e,0x73,0x2a,0x2, +0xa5,0xbf,0x0, 0x23,0x7e,0xb3,0x34,0x4f,0x70,0x2, 0xa1,0xab,0x6c,0xaa,0x80,0x10, +0x7e,0x44,0x7f,0xff,0x12,0x5e,0x95,0x79,0x40,0x0, 0x14,0x12,0x5e,0x45,0xb, 0xa0, +0x12,0x5e,0x25,0x38,0xeb,0xa1,0xab,0x7e,0xb3,0x34,0x4f,0x70,0x3d,0xbe,0x70,0x0, +0x28,0x38,0x6c,0xaa,0x80,0x2a,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x28,0xae,0x12, +0x5e,0x95,0x79,0x30,0x0, 0x14,0x49,0x34,0x28,0xb0,0x7f,0x6, 0x2d,0x12,0x79,0x30, +0x0, 0x28,0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x1f,0x34,0x19,0xa4,0x28,0xb2,0xb, 0xa0, +0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xce,0xa1,0xab,0x6c,0xaa,0x80,0x17,0x12,0x5e, +0x57,0x3e,0x34,0x59,0x43,0x15,0x4e,0x59,0x43,0x15,0x50,0x59,0x43,0x15,0x76,0x59, +0x43,0x15,0x78,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xe4,0x6c,0xaa,0x80,0x41,0x6c,0xff, +0x80,0x36,0x7e,0x70,0x2, 0xac,0x7f,0x7f,0x6, 0x2d,0x13,0x69,0x30,0x0, 0x14,0xbe, +0x34,0x7f,0xff,0x68,0x21,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff,0x18,0x12,0x5e, +0x35,0x59,0x32,0x15,0x4e,0x69,0x30,0x0, 0x28,0x59,0x32,0x15,0x50,0x12,0x5e,0x4e, +0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xc5,0xb, 0xa0,0x7e, +0xb3,0x34,0x4f,0xbc,0xba,0x38,0xb7,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x9, 0xb3,0x1f, +0x46,0xb4,0xff,0x1d,0x6c,0xff,0x80,0x14,0xa, 0x4f,0x9, 0xb4,0x1f,0x50,0xb4,0xff, +0x9, 0x12,0x5e,0x4e,0x19,0xb4,0x1f,0x50,0x80,0x7, 0xb, 0xf0,0x12,0x5e,0x2d,0x38, +0xe7,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xd3,0x6c,0xaa,0x80,0x1a,0x7e,0x70,0x9, 0xac, +0x7a,0x49,0x43,0x28,0xae,0x12,0x5e,0x35,0x59,0x42,0x15,0x76,0x49,0x33,0x28,0xb0, +0x59,0x32,0x15,0x78,0xb, 0xa0,0x7e,0xb3,0x2a,0x2, 0xbc,0xba,0x38,0xde,0x7e,0x34, +0x15,0x4e,0x7a,0x37,0x1f,0x40,0x7e,0x34,0x15,0x76,0x7a,0x37,0x1f,0x42,0x7e,0x34, +0x15,0x9e,0x7a,0x37,0x1f,0x44,0x7e,0x73,0x34,0x4f,0x7a,0x73,0x1f,0x3e,0x7e,0x73, +0x2a,0x2, 0x7a,0x73,0x1f,0x3f,0x7e,0x8, 0x1f,0x3e,0x12,0x4, 0xad,0x6c,0xaa,0x80, +0x59,0x7e,0x70,0xff,0x6c,0xff,0x80,0x19,0x7e,0x50,0x2, 0xac,0x5f,0x49,0x12,0x15, +0x9e,0xa, 0x2a,0xbd,0x21,0x78,0x8, 0xa, 0x3f,0x9, 0x73,0x1f,0x46,0x80,0x7, 0xb, +0xf0,0x12,0x5e,0x2d,0x38,0xe2,0xbe,0x70,0xff,0x68,0x2d,0x12,0x5e,0x8b,0x74,0x1, +0xa, 0x47,0x19,0xb4,0x1f,0x34,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x24,0x28,0xae,0x7e, +0x30,0x2, 0xac,0x37,0x2d,0x1d,0x7d,0xc, 0x79,0x20,0x0, 0x14,0x49,0x44,0x28,0xb0, +0x7e,0x50,0x2, 0xac,0x57,0x12,0x5e,0x45,0xb, 0xa0,0x7e,0x63,0x2a,0x2, 0xbc,0x6a, +0x38,0x9f,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xbe,0xb0,0x1, 0x68, +0x13,0x12,0x5e,0x57,0x7f,0x6, 0x2d,0x13,0x79,0x40,0x0, 0x14,0x2d,0x3d,0x7d,0x2c, +0x79,0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x7e,0xf3,0x2a,0x2, 0x7a, +0xf3,0x34,0x4f,0x6c,0xaa,0x80,0x66,0xa, 0x3a,0x9, 0xb3,0x1f,0x34,0xb4,0x1, 0x2b, +0x12,0x5e,0x9f,0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb1,0x0, 0xa, 0xa, 0x3a,0x2d,0x3d, +0x7d,0x2c,0x29,0x31,0x0, 0xa, 0xa5,0xbb,0x3, 0x6, 0xe4,0x7a,0x1b,0xb0,0x80,0x2e, +0xa5,0xbb,0x0, 0x2a,0x74,0x2, 0x7a,0x1b,0xb0,0x80,0x23,0x12,0x5e,0x9f,0xbe,0xb0, +0x2, 0x68,0x2, 0x70,0x14,0x74,0x1, 0x7a,0x1b,0xb0,0x7c,0x2f,0xb, 0xf0,0x7e,0x30, +0x9, 0xac,0x23,0x19,0xa1,0x28,0xb2,0x80,0x5, 0x74,0x3, 0x7a,0x1b,0xb0,0xa, 0x3a, +0x2d,0x3d,0x7d,0x2c,0x7e,0x1b,0xb0,0x39,0xb1,0x0, 0xa, 0xb, 0xa0,0x12,0x5e,0x25, +0x38,0x95,0xda,0xf8,0x22,0x90,0x60,0x99,0xe4,0x93,0xbc,0xba,0x22,0x90,0x60,0x99, +0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x22,0x2d,0x39,0x7d, +0x28,0x7e,0x1b,0xb0,0x22,0x7f,0x6, 0x2d,0x12,0x79,0x40,0x0, 0x28,0x22,0xa, 0x3a, +0x19,0xf3,0x1f,0x46,0x74,0x1, 0x22,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x22,0x6c,0xaa,0x80,0x20,0x74,0x3, 0x12,0xa9,0x99,0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0xa, 0x12,0x5e,0x57,0x7f,0x70,0x2d,0xf3,0x79,0x47,0x0, 0x14,0x2d,0x31,0x79, +0x41,0x0, 0x28,0xb, 0xa0,0x12,0x5e,0x25,0x38,0xdb,0x22,0x7e,0x50,0x9, 0xac,0x5a, +0x19,0x72,0x28,0xb2,0x22,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x6, 0x2d,0x12,0x22,0xa, +0x3a,0x2d,0x3d,0x7d,0x2c,0x29,0xb1,0x0, 0xa, 0x22,0xc2,0x3, 0x7e,0xb3,0x16,0x91, +0x60,0x6, 0x7e,0xb3,0x16,0x90,0x70,0x7, 0x12,0x9b,0xdf,0x28,0x2, 0xd2,0x3, 0xa2, +0x3, 0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x4c,0xaa,0x78,0x11,0x7e,0xb3,0x2a,0x3, +0xbe,0xb0,0x0, 0x28,0x13,0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0x80,0xb, 0xbe,0xa0,0x0, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0x12,0x5f,0xc2,0xca,0x59,0x7e,0x18,0x28, +0xae,0x7e,0x8, 0x29,0x8, 0x12,0x20,0xb9,0x1b,0xfd,0x90,0x61,0x35,0xe4,0x93,0xbe, +0xb0,0x0, 0x28,0x28,0x6c,0xff,0x80,0x1f,0x74,0x9, 0xac,0xbf,0x49,0x35,0x28,0xae, +0x12,0x80,0x16,0x74,0x9, 0xac,0xbf,0x59,0x35,0x29,0x8, 0x49,0x35,0x28,0xb0,0x12, +0x64,0xdb,0x12,0xab,0x9b,0xb, 0xf0,0x12,0x5e,0x2d,0x38,0xdc,0xda,0xf8,0x22,0x2, +0x5f,0x32,0xca,0x79,0x6c,0xff,0x7e,0xd7,0x2a,0x5a,0x6c,0xee,0x80,0x35,0x7c,0xbe, +0x12,0x37,0x6f,0xbd,0x3d,0x48,0x2a,0x7c,0xbe,0x12,0x2f,0xb7,0x60,0x23,0x7e,0xc4, +0x0, 0x9, 0xca,0xc9,0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x27,0x76,0x6d,0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x28,0xae,0x6d,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0xb, +0xf0,0xb, 0xe0,0x12,0x9c,0xf6,0x38,0xc6,0x7a,0x73,0x28,0x93,0x7a,0xf3,0x2a,0x2, +0xda,0x79,0x22,0x12,0x9d,0xda,0x2, 0x5f,0x89,0x7e,0xa3,0x2a,0x3, 0xbe,0xa0,0x0, +0x38,0x2f,0xbe,0xa3,0x2a,0x2, 0x50,0x19,0x7e,0xb3,0x2a,0xc, 0xbe,0xb3,0x35,0x40, +0x28,0x14,0x7e,0xb3,0x35,0x40,0x4, 0x7a,0xb3,0x35,0x40,0x7a,0xa3,0x2a,0x2, 0x80, +0x5, 0xe4,0x7a,0xb3,0x35,0x40,0x7e,0xb3,0x2a,0x2, 0x70,0x5, 0xe4,0x7a,0xb3,0x2a, +0xb, 0x22,0x90,0x60,0x99,0xe4,0x93,0x7c,0xab,0x74,0x9, 0xa4,0x22,0x12,0x68,0x38, +0x2, 0x5f,0xd3,0x7e,0xb3,0x2a,0x9, 0x70,0x24,0x7e,0xa3,0x34,0xa2,0x4c,0xaa,0x78, +0x3, 0xe4,0x80,0x7, 0xbe,0xa0,0x2, 0x78,0x6, 0x74,0x3, 0x7a,0xb3,0x34,0xad,0x7e, +0x73,0x34,0xae,0xbe,0x73,0x34,0xad,0x28,0x4, 0x7a,0x73,0x34,0xad,0x22,0xff,0xff, +0x70,0x8f,0x0, 0xff,0x51,0xae,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x36,0x31,0x1, 0xc3,0x1, 0x34,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x7, 0xf8,0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xd, 0x18,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0xd, 0xc, 0xb, 0xa, 0x9, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x11,0x12,0x13,0x14,0x18,0x17,0xc, 0xd, 0xe, 0xf, 0x15, +0x16,0x10,0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x3, 0x2, 0x1, 0x0, 0x0, 0x0, +0x0, 0x5, 0x0, 0x4, 0xff,0x23,0x1c,0x2, 0xdf,0xa, 0x1e,0xa, 0x64,0x1e,0x10,0x0, +0x4, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x3, 0x1, 0x0, 0x0, 0x17,0x2, 0x6, 0xa, 0x0, +0x0, 0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x0, 0x0, 0x0, 0x7, +0xd0,0x0, 0x14,0x1, 0x19,0x3d,0x1, 0xf4,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x6e,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64, +0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x0, 0x4, 0x5d,0x20,0x1, 0x20,0x2, 0x0, 0x0, +0x0, 0x0, 0x1, 0xf4,0x69,0x40,0xd, 0x18,0x25,0x17,0x25,0x6, 0x80,0x17,0x25,0x6, +0x80,0x8, 0x10,0x4, 0x20,0x1, 0x0, 0x2, 0xd0,0x32,0x32,0x1, 0xd8,0x1, 0xec,0x0, +0xe1,0x0, 0xe1,0x5, 0x0, 0x37,0x37,0x1, 0xae,0x1, 0xba,0x0, 0xe0,0x0, 0xe0,0x0, +0xb4,0x0, 0xa0,0x0, 0x96,0x1, 0x18,0x1, 0x18,0x1, 0x18,0xa, 0x0, 0x1, 0x68,0x1, +0x5, 0xb, 0x1e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x22,0x15,0x0, 0x1, 0x54,0x1, 0x0, 0x7, +0x1, 0x51,0x1, 0x14,0x0, 0x0, 0x1, 0x1, 0x10,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x96,0x2, 0x26,0x0, 0x50,0x0, 0x27, +0x0, 0x4, 0x0, 0x4, 0x1, 0x4, 0x1, 0x90,0x0, 0xc8,0x0, 0x50,0x1, 0xf4,0x0, 0x96, +0x1, 0x2c,0x1, 0x2c,0x4, 0x3d,0x2, 0x5d,0x69,0x20,0x26,0x3, 0x52,0x59,0x20,0x34, +0x2, 0x5a,0x64,0x20,0x46,0x2, 0x47,0x49,0x30,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, +0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x3d,0x2, 0x5d,0x69,0x20,0x4, 0x5, 0x25, +0x26,0x27,0x28,0x29,0x4, 0x0, 0xd2,0x2, 0x30,0x64,0x0, 0xc8,0x1, 0x5e,0x0, 0x64, +0x0, 0x64,0x0, 0x96,0x0, 0x64,0xb, 0xb8,0x8, 0x5, 0x6, 0x80,0x1, 0x90,0x1, 0x2c, +0x1, 0xc2,0x3, 0x20,0xf, 0xa0,0x1, 0x3, 0x20,0x4, 0xb0,0x3, 0x20,0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x40,0x1, 0x2c,0x1, 0x18,0x1, 0x90,0x1, 0x90,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x90,0x1, 0x7c,0x1, 0x7c,0x0, 0x50,0x0, 0x46,0x0, 0x78,0x0, 0x78, +0x0, 0x78,0x0, 0x78,0x0, 0x78,0x14,0x8, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x4, 0xb0, +0x0, 0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0x14,0x0, 0x37,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x0, 0xa0,0x0, 0x3c,0x3, 0xe8,0x1, 0x40,0x0, 0x5a,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0x0, 0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0xa0,0x0, 0xa0,0x10,0x0, 0xc, 0x0, 0xa, 0xb, 0x5, 0x5, 0x7, 0x8, +0x6, 0x6, 0xc, 0x64,0xc8,0x7e,0x8, 0x37,0xf3,0x12,0x62,0xdf,0x7e,0x8, 0x37,0xfb, +0x12,0x62,0xdf,0x12,0x62,0xf4,0x12,0x62,0xfb,0x2, 0x62,0xbc,0x7e,0x37,0x37,0xf3, +0xbe,0x34,0x0, 0x0, 0x28,0x18,0x7e,0x73,0x39,0x7, 0xbe,0x70,0x5, 0x50,0xf, 0x7e, +0xb3,0x37,0x31,0x70,0x9, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3,0x37,0x6, 0x22,0xb, +0xa, 0x30,0xe5,0x4e,0xa, 0x2b,0xbd,0x32,0x28,0x4, 0x9d,0x32,0x80,0x2, 0x6d,0x33, +0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x2b,0xb7,0x2, 0x62,0xdf,0x7e,0x8, 0x38,0xe6,0x2, +0x62,0xdf,0x6d,0x33,0x7a,0x37,0x38,0x83,0x22,0xca,0xf8,0x7e,0xa3,0x2a,0x2, 0x7e, +0xb3,0x2a,0x3, 0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x28, +0x86,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x2f,0x80,0x4c,0xff,0x68, +0x17,0x7e,0x47,0x2b,0xb7,0x4d,0x44,0x78,0xf, 0x12,0x63,0x2, 0x74,0x1, 0x7a,0xb3, +0x38,0x85,0x7a,0xb3,0x37,0x6, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e, +0x37,0x2b,0xb7,0x7a,0x37,0x2f,0x82,0x7e,0xb3,0x2f,0x80,0xb4,0x3, 0x1f,0x7e,0x37, +0x2b,0xb7,0xbe,0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x2f,0x80,0x7e,0x37, +0x2f,0x98,0x7e,0x27,0x2f,0x9a,0x12,0x64,0x1a,0x81,0x13,0x80,0x0, 0x12,0xbd,0xdd, +0x81,0x13,0x7e,0xc7,0x29,0x8, 0x7e,0xd7,0x29,0xa, 0x4c,0xff,0x78,0x19,0x70,0x57, +0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xbd,0x78,0x12,0x64,0x16,0x74, +0x1, 0x7a,0xb3,0x2f,0x80,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x2f,0x88, +0x9e,0x27,0x2f,0x90,0x7e,0x14,0x62,0x8a,0x12,0x64,0xd3,0xbd,0x23,0x38,0x13,0x7e, +0x27,0x2f,0x96,0x9e,0x27,0x2f,0x8e,0x7e,0x14,0x62,0x8c,0x12,0x64,0xd3,0xbd,0x23, +0x28,0x15,0x74,0x3, 0x7a,0xb3,0x2f,0x80,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a, +0xc7,0x2f,0x98,0x7a,0xd7,0x2f,0x9a,0x7e,0xb3,0x2f,0x80,0x60,0x26,0x7d,0x3c,0x7d, +0x2d,0x7e,0x17,0x2b,0xbb,0x7e,0x7, 0x2b,0xbd,0x12,0x66,0xce,0xa, 0x2b,0x7e,0x73, +0x2f,0x7f,0xa, 0x37,0xbd,0x32,0x58,0xb, 0x12,0x64,0x16,0x7a,0xc7,0x2b,0xbb,0x7a, +0xd7,0x2b,0xbd,0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24, +0x12,0x67,0xca,0x7d,0x31,0x12,0x85,0xfd,0x2, 0x64,0x2b,0x7e,0x3, 0x2f,0xa8,0xbe, +0x0, 0xf0,0x50,0x2, 0x81,0xc4,0x81,0xb9,0x6c,0x99,0x7e,0xb3,0x2f,0x7f,0xbe,0xb0, +0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0x7f,0x7e,0x1f,0x2b,0xbf,0x7a,0x1f,0x1f,0x34, +0x7e,0x80,0x1, 0x80,0x49,0x74,0x4, 0xac,0xb8,0x49,0x35,0x2b,0xbf,0x49,0x25,0x2b, +0xc1,0x7e,0x17,0x1f,0x34,0x7e,0x7, 0x1f,0x36,0x12,0x66,0xce,0x7c,0x1b,0x7e,0x3, +0x2f,0x7f,0xbc,0x1, 0x38,0x26,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x2b, +0xbf,0x7e,0x14,0x1f,0x34,0x74,0x4, 0x12,0x1f,0x8c,0x7e,0x34,0x1f,0x34,0x7e,0x30, +0x4, 0xac,0x39,0x2e,0x14,0x2b,0xbf,0x74,0x4, 0x12,0x1f,0x8c,0xb, 0x80,0x7e,0x3, +0x2f,0xa8,0xbc,0x8, 0x38,0xaf,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x2f,0xa8, +0x7e,0x3, 0x2f,0x7f,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x2f,0xa8,0xbe,0x0, 0xec, +0x40,0x2, 0x81,0x38,0x22,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x2e,0x9d,0x23,0x7e, +0x14,0x61,0x49,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0xe3,0x9f,0x11,0x7e, +0x14,0x61,0x43,0x12,0x83,0x62,0x90,0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3e,0x22, +0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x2a,0x6f,0x80,0x4, 0x7e,0x83, +0x2a,0x70,0x12,0x87,0xd4,0xbe,0xe4,0x0, 0x3f,0x38,0x1e,0x7e,0x24,0x0, 0x3f,0x9d, +0x2e,0x7e,0x14,0x61,0x47,0x12,0x64,0xd3,0x12,0x66,0x10,0x90,0x61,0x45,0x12,0x66, +0x7, 0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0x12,0xc1,0x3a,0xbe,0xa0,0x0, 0x28, +0x32,0x7d,0x14,0x9e,0x14,0x0, 0x3f,0xbd,0x1e,0x38,0x13,0x12,0x66,0xb8,0x40,0xe, +0x12,0x64,0xc5,0x12,0x65,0xfa,0x48,0x32,0x7f,0x10,0x1b,0x1c,0x80,0x2c,0x12,0x66, +0xb8,0x50,0x31,0x7d,0x34,0x9e,0x34,0x0, 0x20,0x12,0x64,0xcb,0x12,0x66,0x10,0x7d, +0x1f,0x80,0x1d,0x4c,0xaa,0x78,0x1d,0x12,0x66,0xb1,0xbd,0x5e,0x38,0x16,0x12,0x64, +0xc5,0x12,0x65,0xfa,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0xa, 0xb, 0x7d,0x1f,0x9d,0x10, +0x6d,0x0, 0x2f,0x10,0xbe,0xe4,0x0, 0x3f,0x28,0x6f,0x12,0x66,0xb1,0xbd,0x5e,0x28, +0x68,0x7d,0xd4,0xb, 0xd4,0x1e,0xd4,0x7d,0x5d,0x1b,0x54,0xbd,0x5e,0x40,0xc, 0x7d, +0x35,0x9d,0x3e,0x6d,0x22,0x7e,0x14,0x61,0x4b,0x80,0xa, 0x7d,0x3e,0x9d,0x3d,0x6d, +0x22,0x7e,0x14,0x61,0x4d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x12,0x1e,0xfc,0x12, +0x66,0x14,0xbd,0x5e,0x7d,0x1f,0x40,0xc, 0x1e,0x14,0x1b,0x14,0x6d,0x0, 0x9f,0x1, +0x7f,0x10,0x80,0x6, 0x1e,0x14,0x6d,0x0, 0x2f,0x10,0x90,0x61,0x45,0x12,0x66,0x7, +0x58,0x4, 0x7f,0x10,0x80,0x13,0x90,0x61,0x46,0xe4,0x93,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0xad,0x32,0x6d,0x22,0x7c,0x76, +0x7c,0x65,0x1a,0x24,0x90,0x61,0x46,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x7e,0x73,0x36,0x69,0x7a, +0x73,0x36,0xdf,0x7e,0x27,0x38,0xd6,0x7e,0x14,0x61,0xc8,0x12,0x64,0xd3,0x1e,0x34, +0xbd,0x32,0x50,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x14,0x61,0xc8,0x12,0x64, +0xd3,0xbd,0x32,0x50,0x8, 0xe4,0x7a,0xb3,0x36,0x67,0x12,0x67,0x62,0x7e,0x37,0x36, +0x6f,0xbd,0x32,0x50,0x4, 0x7a,0x27,0x36,0x6f,0x12,0xc1,0x12,0x38,0xa, 0x12,0x8f, +0xf3,0x38,0x5, 0x12,0x8f,0xeb,0x28,0x3d,0x12,0x67,0x69,0x7e,0x14,0x61,0xc8,0x12, +0x64,0xd3,0x1e,0x34,0x1e,0x34,0xbd,0x32,0x28,0x21,0x7e,0xb3,0x36,0x67,0x4, 0x7a, +0xb3,0x36,0x67,0x7e,0x73,0x36,0x67,0xbe,0x70,0x32,0x28,0x14,0x74,0x32,0x7a,0xb3, +0x36,0x67,0x12,0xc0,0x95,0x7a,0xb3,0x36,0xdc,0x80,0x5, 0xe4,0x7a,0xb3,0x36,0x67, +0x7d,0x32,0x2, 0xad,0xac,0x2, 0x66,0xa8,0x12,0x67,0xc0,0xe4,0x7a,0xb3,0x36,0x75, +0x22,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0x22,0x7d,0x4, 0x9e,0x4, 0x0, 0x1f,0x7e,0xd4, +0x60,0xd1,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x10,0x2d,0x10,0xbd,0x1e,0x22,0x7d,0x51, +0x7d,0x12,0x9d,0x35,0x12,0x21,0x0, 0x7c,0xa7,0x12,0x67,0xeb,0x7c,0xb7,0xbc,0xba, +0x50,0x3, 0x7c,0xba,0x22,0x22,0x7d,0x13,0x7e,0x54,0x62,0x58,0x12,0x67,0x15,0x50, +0x21,0x7e,0x54,0x62,0x5a,0x12,0x67,0x15,0x28,0x18,0x7e,0x14,0x62,0x5c,0x12,0x64, +0xd3,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x62,0x5e,0x12,0x64,0xd3,0xbd,0x32,0x28,0x2, +0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x12, +0x66,0x1b,0x2, 0x67,0x25,0x7e,0xb3,0x36,0x69,0x60,0xf, 0x74,0x1, 0x7a,0xb3,0x36, +0x71,0x7e,0xb3,0x36,0xdf,0x70,0x3, 0x12,0xaf,0x2f,0x7e,0xb3,0x36,0x71,0xb4,0x1, +0xc, 0x74,0x3, 0x12,0x67,0x59,0x12,0x23,0x9e,0x3e,0x34,0x80,0x7, 0xe4,0x12,0x67, +0x59,0x12,0x23,0x9e,0x7a,0x37,0x2a,0x62,0x22,0x7a,0xb3,0x34,0xae,0x7e,0x34,0x61, +0x5b,0x22,0x74,0x2, 0x7a,0xb3,0x36,0x69,0x22,0x7e,0xb3,0x36,0x75,0xb4,0x1, 0x3, +0x2, 0x67,0x62,0x7e,0xb3,0x36,0xdb,0x4, 0x7a,0xb3,0x36,0xdb,0x7e,0xb3,0x36,0x69, +0xb4,0x2, 0x18,0x7e,0xb3,0x36,0xda,0x4, 0x7a,0xb3,0x36,0xda,0xb4,0x1, 0x6, 0x74, +0x1, 0x7a,0xb3,0x36,0xdb,0x74,0x1, 0x7a,0xb3,0x36,0x69,0x7e,0x73,0x36,0xda,0xbe, +0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x36,0x75,0x12,0x67,0x62,0x12,0xaf,0x2f, +0x12,0x67,0xc0,0x7e,0x73,0x36,0xdb,0xbe,0x70,0xa, 0x28,0x3, 0x2, 0x67,0xc0,0x22, +0xe4,0x7a,0xb3,0x36,0xdb,0x7a,0xb3,0x36,0xda,0x22,0x7e,0xa3,0x2f,0xa8,0xbe,0xa0, +0xf0,0x50,0x17,0x74,0x4, 0xa4,0x59,0x35,0x2b,0xbf,0x12,0x67,0xf2,0x59,0x25,0x2b, +0xc1,0x7e,0xb3,0x2f,0xa8,0x4, 0x7a,0xb3,0x2f,0xa8,0x22,0x7d,0x31,0x9d,0x30,0x2, +0x21,0x0, 0x7e,0xa3,0x2f,0xa8,0x74,0x4, 0xa4,0x22,0x7e,0x73,0x28,0x93,0x7a,0x73, +0x28,0x94,0x7e,0x73,0x2a,0x2, 0x7a,0x73,0x2a,0x3, 0xe4,0x7a,0xb3,0x2a,0x6, 0x22, +0x12,0xc0,0x25,0x12,0x63,0x2, 0x7a,0x37,0x39,0x4, 0x12,0x69,0x87,0x12,0x28,0x48, +0x2, 0x68,0x23,0x12,0x69,0x84,0x50,0x4, 0x74,0x19,0x80,0x2, 0x74,0x3, 0x7a,0xb3, +0x34,0x88,0xe4,0x7a,0xb3,0x34,0x89,0x22,0xca,0x79,0x7e,0x13,0x2a,0x2, 0x7e,0x78, +0x29,0xbc,0x12,0x69,0x84,0xe4,0x33,0x7c,0xb, 0x4c,0x0, 0x68,0x8, 0x7e,0x30,0x19, +0x7e,0xa0,0x5, 0x80,0x6, 0x7e,0x30,0x3, 0x7e,0xa0,0x1, 0xa5,0xb9,0x0, 0x5, 0x12, +0x68,0x23,0x21,0x6d,0xbc,0x20,0x50,0x3, 0x12,0x68,0x23,0x6c,0x0, 0x21,0x62,0x7e, +0x70,0x9, 0xac,0x70,0x9, 0x93,0x29,0xc, 0xbe,0x90,0xff,0x78,0x2, 0x21,0x60,0xa, +0x29,0x7f,0x67,0x2d,0xd2,0x7e,0x6b,0x80,0xbe,0x80,0x2, 0x68,0x2, 0x21,0x43,0x12, +0x69,0x7a,0x49,0x33,0x29,0x8, 0x9d,0x32,0x12,0x21,0x0, 0x7d,0xd3,0x7e,0x70,0x4, +0xac,0x79,0x49,0x23,0x35,0x43,0x12,0x69,0x70,0x9d,0x32,0x12,0x21,0x0, 0x7d,0xc3, +0x7e,0x73,0x34,0x88,0xa, 0x27,0xbd,0x2d,0x28,0x53,0xbd,0x2c,0x28,0x4f,0x12,0x69, +0x7a,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0x8, 0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x43,0x7e,0xf0,0x9, 0xac,0xf0,0x59,0x27,0x29,0xa, 0xbe,0x10,0x0, 0x28, +0x2, 0x1b,0x10,0xa5,0xb9,0x0, 0x79,0x7e,0xb3,0x34,0x89,0x4, 0x7a,0xb3,0x34,0x89, +0x7e,0x63,0x34,0x89,0xbe,0x60,0x32,0x40,0x67,0xe4,0x7a,0xb3,0x34,0x89,0x7e,0xb3, +0x34,0x88,0xbc,0xb3,0x50,0x5a,0x4, 0x7a,0xb3,0x34,0x88,0x80,0x53,0x7e,0x50,0x9, +0xac,0x50,0x49,0xb2,0x29,0x8, 0x7e,0xf0,0x4, 0xac,0xf9,0x59,0xb7,0x35,0x41,0x49, +0x22,0x29,0xa, 0x59,0x27,0x35,0x43,0xbc,0x73,0x28,0x6, 0x7a,0xa3,0x34,0x88,0x80, +0xb, 0xbc,0x7a,0x28,0x7, 0x7c,0xb7,0x14,0x7a,0xb3,0x34,0x88,0xe4,0x7a,0xb3,0x34, +0x89,0x80,0x1d,0x4c,0x88,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0x8, +0x7e,0x50,0x4, 0xac,0x59,0x59,0x32,0x35,0x41,0x12,0x69,0x70,0x59,0x32,0x35,0x43, +0xb, 0x0, 0x90,0x60,0x99,0xe4,0x93,0xbc,0xb0,0x28,0x2, 0x1, 0x6f,0xda,0x79,0x22, +0x7e,0x70,0x9, 0xac,0x70,0x49,0x33,0x29,0xa, 0x22,0x7e,0x50,0x4, 0xac,0x59,0x49, +0x22,0x35,0x41,0x22,0xa2,0x8, 0x22,0x7e,0x34,0xd, 0xac,0x12,0x26,0x5b,0x12,0x7a, +0x2d,0x12,0x69,0xab,0x2, 0x69,0x97,0x30,0xf, 0x10,0x12,0x6e,0x8f,0x50,0x3, 0x12, +0x6f,0x6e,0x12,0x6a,0x50,0x12,0x69,0xd1,0xc2,0xf, 0x22,0x7e,0xb3,0x2b,0x1e,0x70, +0x1f,0x12,0x26,0x57,0x12,0x2f,0xf4,0x50,0xfb,0x12,0x6a,0x50,0x12,0x88,0x17,0x20, +0xf, 0x3, 0x12,0x69,0xd1,0x74,0x2, 0x7a,0xb3,0x2b,0x1e,0xe4,0x7a,0xb3,0x16,0x91, +0x22,0xca,0x3b,0x7e,0xb3,0x2b,0xf, 0x7a,0xb3,0x1f,0x33,0x7e,0xf3,0x2b,0x62,0x12, +0x87,0x56,0x7c,0xdb,0xbe,0xd0,0xff,0x68,0x64,0x6c,0xcc,0x12,0xc0,0xcc,0xf5,0x2a, +0x7e,0x73,0x2b,0xf, 0xbe,0x71,0x2a,0x68,0x36,0x7e,0x70,0x4, 0xac,0x7d,0xa, 0x2c, +0x12,0x91,0x67,0x7c,0xeb,0xbe,0xe0,0x2, 0x38,0x43,0xa, 0xe, 0x7e,0x14,0x2, 0xe0, +0xad,0x10,0x2e,0x14,0x16,0x93,0x6d,0x0, 0x7a,0xd, 0x2b,0x7e,0x70,0x1d,0xac,0x7e, +0x2e,0x34,0x37,0x44,0x6d,0x22,0x7a,0x1f,0x37,0x40,0x7c,0xbc,0x12,0x6c,0x20,0xb, +0xc0,0xbe,0xc0,0x4, 0x40,0xb5,0x7e,0x73,0x2b,0x62,0xbc,0x7f,0x68,0x6, 0x7a,0xf3, +0x2b,0x62,0xd2,0xc, 0xd2,0x3, 0x7e,0xb3,0x1f,0x33,0x12,0x6d,0x13,0xda,0x3b,0x22, +0x7e,0xf, 0x13,0x8a,0x7e,0x18,0x8, 0xa, 0xca,0x3b,0x7a,0x1d,0x2a,0x7f,0x30,0x12, +0xc0,0x1b,0x7a,0x55,0x32,0x7e,0xb3,0x2b,0x1d,0xf5,0x2f,0xe4,0x7a,0xb3,0x2b,0x1d, +0x7f,0x3, 0x7e,0x1d,0x2a,0x12,0x79,0x7a,0x12,0xc0,0x9f,0x12,0xc0,0x42,0x75,0x2e, +0x0, 0x12,0x4e,0x6e,0x30,0xb, 0xfd,0x74,0x1, 0x12,0xc1,0x22,0x7e,0x14,0x40,0x0, +0x7d,0x21,0x7d,0x7, 0x12,0x6a,0xd4,0x12,0xb3,0x89,0x6d,0x33,0x80,0x19,0x7e,0x35, +0x30,0x3e,0x34,0x7f,0x3, 0x2d,0x13,0xb, 0xa, 0x20,0x7e,0xd, 0x2a,0x2d,0x13,0x12, +0x7b,0x20,0x7e,0x35,0x30,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35,0x32,0xbe,0x35,0x30, +0x38,0xdc,0x5, 0x2e,0xe5,0x2e,0xbe,0xb0,0x1, 0x40,0xb6,0xe5,0x2f,0x7a,0xb3,0x2b, +0x1d,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x6d,0xca,0x3b,0x7c,0xdb,0x7a,0x5, 0x39,0x7d, +0x71,0x7a,0x25,0x37,0x7a,0x35,0x35,0x12,0x6e,0x8f,0x50,0x7c,0x6c,0xcc,0x80,0x11, +0x7e,0x73,0x2a,0x6e,0x12,0x6b,0xff,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x0, 0x12,0x6c, +0x8, 0x12,0x6d,0x34,0x38,0xea,0x6c,0xcc,0x80,0x58,0x7e,0xa3,0x2a,0x6e,0x7c,0x7a, +0x12,0x6b,0xff,0x75,0x3b,0x0, 0x80,0x27,0x7e,0xb3,0x37,0xb1,0xbe,0xb1,0x3b,0x7e, +0x70,0x4, 0x28,0x8, 0xac,0x7c,0x49,0x43,0x3, 0x60,0x80,0x6, 0xac,0x7c,0x49,0x43, +0x3, 0x62,0x7e,0x71,0x3b,0x74,0x2, 0xac,0x7b,0x59,0x43,0x34,0x50,0x5, 0x3b,0x7e, +0xb3,0x2a,0x70,0xbe,0xb1,0x3b,0x38,0xd0,0x12,0xc0,0xba,0x68,0xb, 0x7e,0x34,0x10, +0x0, 0x74,0x2, 0xa4,0x59,0x35,0x34,0x4e,0x12,0x6b,0xe5,0x7e,0x34,0x34,0x50,0x12, +0x6c,0x8, 0xbc,0xdc,0x38,0xa4,0x80,0x2c,0x7a,0xd3,0x25,0xb6,0x7e,0x73,0x2a,0x70, +0x7a,0x73,0x25,0xb7,0xe4,0x7a,0xb3,0x25,0xb9,0x74,0x6, 0x7a,0xb3,0x25,0xb8,0x7a, +0x77,0x25,0xba,0x7a,0x77,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x7e,0x73,0x2b,0x1f,0xa, +0x37,0x12,0xe, 0x37,0x7d,0x37,0x12,0x7f,0x78,0x7e,0x35,0x39,0x7a,0x37,0x25,0xbe, +0xe4,0x7a,0xb3,0x25,0xb8,0x12,0x6b,0xf6,0x7a,0xd3,0x25,0xb6,0x7e,0xb3,0x2b,0x1d, +0x70,0xf, 0xe4,0x7a,0xb3,0x25,0xb9,0x7a,0x77,0x25,0xba,0x7e,0x34,0x0, 0x20,0x80, +0x16,0x74,0x1, 0x7a,0xb3,0x25,0xb9,0x7e,0x35,0x35,0x7a,0x37,0x25,0xba,0x7e,0x35, +0x37,0x7a,0x37,0x25,0xbc,0x6d,0x33,0x7a,0x37,0x25,0xc0,0x7e,0x8, 0x25,0xb6,0x12, +0xd, 0x7, 0xda,0x3b,0x22,0x74,0xc, 0x7a,0xb3,0x25,0xb8,0x74,0x1, 0x7a,0xb3,0x25, +0xb6,0xe4,0x7a,0xb3,0x25,0xb9,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x25,0xb7,0x22,0xac, +0x7c,0x3e,0x34,0x7d,0xf7,0x2d,0xf3,0x22,0x7a,0x37,0x25,0xba,0x7d,0x3f,0x7a,0x37, +0x25,0xbc,0x7a,0x37,0x25,0xbe,0x7e,0x8, 0x25,0xb6,0x12,0x7, 0x9b,0xb, 0xc0,0x22, +0xca,0x3b,0x7a,0xd, 0x2f,0x7c,0xcb,0x7e,0xb3,0x2b,0x1d,0xf5,0x33,0x7e,0xb3,0x2b, +0xf, 0xf5,0x34,0x7e,0xd3,0x2b,0x14,0x7e,0xe3,0x2b,0x1f,0x7e,0xf3,0x2b,0x20,0x7e, +0x34,0x0, 0x38,0xca,0x39,0x7e,0x18,0x34,0x0, 0x7e,0x8, 0x24,0xf2,0x12,0x20,0xb9, +0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x18,0x3, 0x60,0x7e,0x8, 0x25,0x2a, +0x12,0x20,0xb9,0x1b,0xfd,0x7c,0xbc,0x12,0xb3,0x54,0x74,0x1, 0x7a,0xb3,0x2b,0x1d, +0x74,0x5, 0xac,0xbc,0x12,0xc0,0x39,0x74,0x5, 0xac,0xbc,0x12,0x6f,0xff,0x74,0x5, +0xac,0xbc,0x12,0xc0,0x30,0x74,0x5, 0xac,0xbc,0x9, 0x75,0x26,0x37,0xbe,0x73,0x2b, +0x62,0x68,0x6, 0x7a,0x73,0x2b,0x62,0xd2,0xc, 0xc2,0x3, 0x12,0xc0,0xcc,0x12,0x6d, +0x13,0x12,0x4e,0x67,0x30,0xb, 0xfd,0x74,0x1, 0x12,0x0, 0xe, 0x7e,0x14,0x40,0x0, +0x7d,0x31,0x7e,0x2f,0x13,0x86,0x7d,0x25,0x7e,0x4, 0xd, 0xc8,0x12,0x6a,0xd4,0x12, +0xc0,0x1b,0x7a,0x55,0x35,0x7e,0xd, 0x2f,0x7e,0x18,0xd, 0xc8,0x12,0xa8,0xef,0x12, +0xa9,0xc9,0xe5,0x33,0x7a,0xb3,0x2b,0x1d,0xe5,0x34,0x7a,0xb3,0x2b,0xf, 0x7a,0xd3, +0x2b,0x14,0x7a,0xe3,0x2b,0x1f,0x7a,0xf3,0x2b,0x20,0x7e,0x34,0x0, 0x38,0xca,0x39, +0x7e,0x18,0x24,0xf2,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x34,0x0, +0x8c,0xca,0x39,0x7e,0x18,0x25,0x2a,0x7e,0x8, 0x3, 0x60,0x12,0x20,0xb9,0x1b,0xfd, +0xda,0x3b,0x22,0x7a,0xb3,0x2b,0xf, 0x12,0x6e,0x29,0x30,0xc, 0xa, 0x12,0xaf,0x1d, +0x30,0x3, 0x4, 0xe4,0x12,0xa, 0x66,0x30,0x3, 0x9, 0x12,0xae,0xd2,0x12,0x8d,0xef, +0x2, 0x8c,0x90,0x22,0x7e,0x73,0x2a,0x6f,0xbc,0x7c,0x22,0xca,0x3b,0x7f,0x61,0x7f, +0x50,0x7e,0x14,0x22,0xe2,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x7a,0x1d,0x2c,0x7e,0x73,0x2a,0x6d,0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f, +0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c,0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x34,0x6c, +0xcc,0x80,0x4f,0x12,0x6e,0x19,0x40,0x48,0x12,0x6e,0xf, 0x50,0x43,0x74,0x2, 0xac, +0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x10,0x7d,0x3f,0x12,0x21,0x0, 0x7d,0x3, 0x7d, +0x31,0x12,0x21,0x0, 0xbd,0x30,0x58,0x2, 0x7d,0xf1,0xbe,0x15,0x2a,0x8, 0x5, 0x7e, +0x15,0x2a,0x80,0xb, 0x6d,0x0, 0x9e,0x5, 0x2a,0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x7d, +0x31,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x34,0x4, 0x7a,0xb3,0x1f,0x34, +0xb, 0xc0,0x12,0x6d,0x34,0x38,0xac,0x7e,0x73,0x1f,0x34,0x4c,0x77,0x68,0x34,0x12, +0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0xbe,0x75,0x2a,0x8, 0x5, 0x7e,0x75,0x2a,0x80,0xb, +0x6d,0xee,0x9e,0xe5,0x2a,0xbd,0xe7,0x8, 0x2, 0x7d,0x7e,0x6c,0xcc,0x80,0xf, 0x12, +0x6e,0x19,0x40,0x8, 0x12,0x6e,0xf, 0x50,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x12,0x6d, +0x34,0x38,0xec,0xb, 0xd0,0xbe,0xd0,0x3, 0x50,0x2, 0xa1,0x68,0xda,0x3b,0x22,0x7c, +0x1d,0x2e,0x10,0x2d,0xa5,0xe7,0xbc,0xab,0x22,0xa, 0xec,0x9, 0xae,0x2a,0xb9,0x7c, +0x1d,0x2e,0x10,0x2c,0xa5,0xe7,0xbc,0xab,0x22,0x12,0x6e,0xa0,0x7a,0x37,0x2b,0x1b, +0x22,0x7e,0xa3,0x0, 0x4f,0xbe,0xa0,0xff,0x68,0x48,0xbe,0xa3,0x3, 0xec,0x68,0x42, +0x74,0x5, 0xa4,0x12,0xc0,0xc3,0x12,0x6e,0x83,0x12,0xc0,0x39,0x12,0x6e,0x83,0x12, +0xc0,0x30,0x12,0x6e,0x8f,0x50,0x9, 0x7e,0xb3,0x0, 0x4f,0x12,0xb3,0x54,0x80,0x6, +0x12,0x6e,0x83,0x12,0x6f,0xff,0x12,0x6e,0x29,0x12,0x6f,0xf8,0x7e,0x73,0x2b,0x14, +0xa, 0x37,0x7e,0xf, 0x38,0xc8,0x79,0x30,0x0, 0x1a,0x7e,0x73,0x0, 0x4f,0x7a,0x73, +0x3, 0xec,0x22,0x7e,0xa3,0x0, 0x4f,0x74,0x5, 0xa4,0x22,0x7a,0xb3,0x2b,0x20,0x7e, +0xb3,0x37,0x8, 0xb4,0x3, 0x8, 0x7e,0xb3,0x37,0xb2,0x70,0x2, 0xc3,0x22,0xd3,0x22, +0x7e,0x23,0x2b,0xf, 0x7e,0x33,0x37,0xcd,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x0, 0xac,0x23,0x2d,0x10,0xbe,0x14,0x0, 0xa, 0x50,0x4, 0x7e,0x14,0x0, +0xa, 0x7e,0x63,0x2b,0x10,0xbe,0x14,0xf, 0x3c,0x40,0x4, 0x7e,0x14,0xf, 0x3c,0xbe, +0x14,0x7, 0x8, 0x40,0x3, 0xe4,0x80,0x21,0xbe,0x14,0x3, 0x84,0x40,0x16,0x90,0x61, +0x1b,0xe4,0x93,0x7c,0x7b,0xbe,0x70,0x1, 0x28,0x4, 0x74,0x1, 0x80,0xb, 0x7a,0x73, +0x2b,0x10,0x80,0x9, 0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x7e,0x73,0x2b, +0x10,0xbc,0x76,0x68,0x2, 0xd2,0xc, 0x7e,0x24,0x1, 0xf4,0x7d,0x31,0x8d,0x32,0x7c, +0x17,0xbe,0x10,0x7, 0x28,0x3, 0x7e,0x10,0x7, 0x7e,0x1f,0x38,0xc0,0x69,0x51,0x0, +0x86,0x54,0x1f,0xa, 0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d, +0x5, 0x79,0x1, 0x0, 0x86,0x6d,0x0, 0x7e,0x34,0xb8,0x0, 0x7e,0x24,0x0, 0xb, 0x2, +0x1f,0x58,0x7e,0xb, 0x70,0x7a,0x73,0x2b,0xf, 0x29,0x70,0x0, 0x4, 0x7a,0x73,0x2b, +0x62,0x29,0x70,0x0, 0x1, 0x7a,0x73,0x2b,0x14,0x29,0x70,0x0, 0x3, 0x7a,0x73,0x2b, +0x20,0x12,0x6e,0x29,0x12,0x6f,0xf8,0xd2,0x3, 0xc2,0x4, 0x2, 0x48,0xf4,0xca,0xf8, +0x6c,0xff,0x80,0x34,0x7e,0x73,0x0, 0x4f,0xbc,0x7f,0x68,0x2a,0x7e,0x30,0x5, 0xac, +0x3f,0x12,0x6f,0xea,0xca,0x39,0x7e,0x30,0x38,0xac,0x3f,0x12,0xc0,0x76,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x30,0x8c,0xac,0x3f,0x12,0xc0, +0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xb, 0xf0,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xbf,0x38, +0xc3,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x5, 0xac,0x23,0x12,0x6f,0xea,0xca,0x39,0x7e, +0x23,0x0, 0x4f,0x7e,0x30,0x38,0xac,0x23,0x12,0xc0,0x76,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x0, 0x8c,0xca,0x39,0x7e,0x23,0x0, 0x4f,0x7e,0x30,0x8c,0xac,0x23,0x12, +0xc0,0x6b,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x2e,0x14,0x26,0x33,0x6d,0x0, +0x12,0x6f,0x42,0x7e,0x34,0x0, 0x38,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0x3, 0x8b,0x9, +0x75,0x26,0x35,0x7a,0x73,0x2b,0x1f,0x22,0x7e,0x37,0x3, 0xed,0xb, 0x34,0x7a,0x37, +0x3, 0xed,0x7e,0x37,0x3, 0xef,0xbe,0x37,0x3, 0xed,0x28,0x3, 0x2, 0x70,0x23,0x22, +0x2, 0x70,0x8, 0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x12,0x70,0x20,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b, +0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x7e, +0x34,0x61,0x2d,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x70,0x12,0x20,0xb9,0x1b,0xfd, +0x7e,0x34,0x2a,0xe, 0x7a,0x37,0x2b,0x76,0xe4,0x7a,0xb3,0x2b,0x74,0x7a,0xb3,0x2b, +0x75,0x7e,0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x25,0xee,0x12,0x20, +0xb9,0x1b,0xfd,0x7e,0x34,0x2b,0x78,0x7a,0x37,0x25,0xf4,0xe4,0x7a,0xb3,0x25,0xf2, +0x74,0x1, 0x7a,0xb3,0x25,0xf3,0x22,0xca,0xd8,0xca,0x79,0x90,0x60,0x50,0xe4,0x93, +0x7c,0xdb,0x90,0x60,0x51,0xe4,0x93,0x7c,0xeb,0x7e,0x73,0x2a,0x74,0xbc,0x7e,0x28, +0x4, 0x7c,0xf7,0x80,0x2, 0x7c,0xfe,0x7a,0xd3,0x2a,0x6d,0x7a,0xe3,0x2a,0x6e,0x7a, +0xd3,0x2a,0x71,0x7a,0xe3,0x2a,0x72,0x7a,0xd3,0x2a,0x73,0x7a,0xe3,0x2a,0x74,0x90, +0x60,0xa8,0xe4,0x93,0x7c,0xab,0x7a,0xa3,0x2a,0x77,0x90,0x60,0xa9,0xe4,0x93,0xa, +0x2b,0xa, 0x3d,0x9d,0x32,0x7c,0xb7,0x7a,0xb3,0x2a,0x6f,0xa, 0x2a,0xa, 0x3e,0x9d, +0x32,0x7a,0x73,0x2a,0x70,0x90,0x60,0x91,0xe4,0x93,0x7a,0xb3,0x2a,0x78,0x90,0x60, +0x94,0xe4,0x93,0x7a,0xb3,0x2a,0x79,0xa, 0x3d,0xca,0x39,0x7e,0x34,0x60,0x52,0x7e, +0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x7a,0x12,0x20,0xb9,0x1b,0xfd,0xa, 0x3f,0xca,0x39, +0x7e,0x34,0x60,0x75,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2a,0x9d,0x12,0x20,0xb9,0x1b, +0xfd,0x7e,0x34,0x0, 0x23,0xca,0x39,0x7e,0x34,0x60,0xd8,0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x2b,0x21,0x12,0x20,0xb9,0x1b,0xfd,0x12,0x72,0x92,0x12,0x79,0x31,0x90,0x60, +0xaa,0xe4,0x93,0x70,0x8, 0x7a,0xd3,0x2a,0x75,0x7a,0xe3,0x2a,0x76,0x12,0x70,0x59, +0x74,0x1, 0x12,0x3d,0xac,0xe4,0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x2, 0x12,0x73, +0xf1,0x7a,0x37,0x2b,0xd, 0x74,0x3, 0x7a,0xb3,0x2b,0x3, 0xe4,0x7a,0xb3,0x2b,0x4, +0x74,0x2, 0x7a,0xb3,0x2b,0x5, 0x7e,0x34,0x61,0x59,0x12,0x23,0x9e,0x7a,0x37,0x2b, +0x7, 0x74,0x4, 0x7a,0xb3,0x2b,0x6, 0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x2b,0x9, 0x7e, +0x34,0x20,0x5f,0x7a,0x37,0x2b,0xb, 0x90,0x61,0x1a,0xe4,0x93,0x7a,0xb3,0x2b,0x62, +0x90,0x61,0x1b,0xe4,0x93,0x7a,0xb3,0x2b,0x10,0x90,0x61,0x1c,0xe4,0x93,0x7a,0xb3, +0x2b,0x11,0x74,0x4, 0x7a,0xb3,0x2b,0x13,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x2b, +0xf, 0x12,0x6e,0x29,0xe4,0x7a,0xb3,0x2b,0x1d,0x7a,0xb3,0x2b,0x1e,0x7e,0x34,0x61, +0x22,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x19,0x90,0x60,0xd3,0x93,0x7a,0xb3,0x2b,0x12, +0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x2b,0x20,0x90,0x61,0x19,0xe4,0x93,0x7a,0xb3, +0x2b,0x1f,0x7e,0x34,0x61,0x1e,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x15,0x7e,0x34,0x61, +0x20,0x12,0x23,0x9e,0x7a,0x37,0x2b,0x17,0x90,0x61,0x1d,0xe4,0x93,0x7a,0xb3,0x2b, +0x14,0x7e,0x34,0x0, 0x30,0x7a,0x37,0x2b,0x6a,0x74,0x5, 0x7a,0xb3,0x2b,0x67,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x2b,0x68,0xe4,0x7a,0xb3,0x2b,0x66,0x7e,0x34,0x4, 0x6d, +0x7a,0x37,0x2b,0x6c,0x74,0x1, 0x7a,0xb3,0x2b,0x63,0x74,0x6, 0x7a,0xb3,0x2b,0x64, +0xe4,0x7a,0xb3,0x2b,0x65,0x74,0x1, 0x7a,0xb3,0x2b,0x60,0xe4,0x7a,0xb3,0x2b,0x61, +0x7e,0x34,0x20,0x5b,0x7a,0x37,0x2b,0x6e,0xa, 0x3e,0xca,0x39,0x7e,0x34,0x60,0xfb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x2b,0x44,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda, +0xd8,0x22,0x12,0xc0,0xd5,0x12,0x72,0xf4,0x90,0x60,0x50,0xe4,0x93,0xa, 0x3b,0x7d, +0x13,0x2e,0x14,0x2a,0x7a,0x6d,0x0, 0x9, 0xb3,0x2a,0x79,0x12,0x72,0xdb,0xa, 0x3b, +0x7d,0x13,0x2e,0x14,0x2b,0x21,0x6d,0x0, 0x9, 0xb3,0x2b,0x20,0x12,0x72,0xdb,0xa, +0x1b,0x2e,0x14,0x2a,0x7c,0x12,0x72,0xe8,0xe5,0x25,0x12,0x72,0xdf,0xa, 0x1b,0x2e, +0x14,0x2b,0x23,0x12,0x72,0xe8,0xe5,0x24,0x2, 0x20,0xde,0x7e,0x34,0x0, 0x2, 0x12, +0x20,0xde,0x90,0x60,0x50,0xe4,0x93,0x22,0x6d,0x0, 0x90,0x60,0x91,0xe4,0x93,0xa, +0x3b,0x1b,0x35,0x22,0x6c,0xaa,0x6c,0x99,0x80,0xc, 0xa, 0xf9,0x9, 0xbf,0x2a,0x7a, +0xbc,0xba,0x68,0x7, 0xb, 0x90,0x12,0x73,0x20,0x38,0xef,0x12,0x73,0x20,0x68,0x7, +0xb, 0xa0,0xbe,0xa0,0x23,0x40,0xdf,0x7a,0xb, 0xa0,0x74,0x6e,0x7a,0x1b,0xb0,0x22, +0x90,0x60,0x50,0xe4,0x93,0xbc,0xb9,0x22,0x12,0x77,0xfd,0x12,0x70,0xa7,0x12,0x0, +0xa, 0x12,0x3f,0xf2,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x6, 0xf8,0x7e,0xf, 0x6, 0xf8, +0x7e,0x1f,0x6, 0xf4,0x12,0x79,0x9d,0x7e,0x18,0x8, 0xa, 0x7a,0x1f,0x13,0x86,0x7e, +0x18,0xd, 0xc8,0x7a,0x1f,0x13,0x8a,0x7e,0xf, 0x13,0x8a,0x7e,0x1f,0x13,0x86,0x12, +0x79,0x7a,0x12,0x79,0x2e,0x12,0x25,0x45,0x12,0x73,0xa7,0x12,0x73,0x7f,0x2, 0x73, +0x71,0xe4,0x7a,0xb3,0x34,0x38,0x7a,0xb3,0x34,0x39,0x7a,0xb3,0x34,0x3a,0x22,0x12, +0x73,0xe5,0x7e,0x24,0x0, 0x3, 0xad,0x32,0x7e,0x8, 0x28,0xae,0x74,0xff,0x12,0x20, +0xde,0x12,0x9f,0xe3,0x7e,0x8, 0x29,0xbc,0x12,0x5e,0x61,0x7e,0x8, 0x2a,0x2, 0x7e, +0x34,0x0, 0xb, 0xe4,0x2, 0x20,0xde,0x7e,0x8, 0x26,0x5b,0x7e,0x34,0x2, 0x3a,0xe4, +0x12,0x20,0xde,0x90,0x60,0x9c,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26,0x8c,0x74, +0xff,0x12,0x20,0xde,0x90,0x60,0x9c,0xe4,0x93,0xa, 0x3b,0x3e,0x34,0x7e,0x8, 0x26, +0xb4,0x74,0xff,0x12,0x20,0xde,0x90,0x60,0x9a,0x12,0x73,0xe8,0x7e,0x8, 0x27,0x76, +0x74,0xff,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x22,0x6d,0x33,0x6c,0xaa,0x80,0x14,0xa, 0x2a,0x9, 0xb2,0x2a,0xdc,0x54,0x1, 0x78, +0x5, 0x4e,0x70,0x1, 0x80,0x3, 0x4e,0x70,0x10,0xb, 0xa0,0x7e,0x53,0x2a,0x74,0xbc, +0x5a,0x38,0xe4,0x6c,0xaa,0x80,0x1f,0xa, 0x2a,0x9, 0xb2,0x2a,0xb9,0xbe,0xb0,0xd, +0x38,0x5, 0x4e,0x70,0xc0,0x80,0xd, 0xbe,0xb0,0x1b,0x38,0x5, 0x4e,0x60,0x8, 0x80, +0x3, 0x4e,0x60,0x50,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xdc,0x22,0x7e,0xb3,0x2a,0x73, +0xbc,0xba,0x22,0xca,0x3b,0x7e,0xb4,0x7f,0xff,0x7d,0xab,0x7d,0x8b,0x6d,0x22,0x7d, +0x32,0x7d,0x9b,0x75,0x24,0x0, 0x6c,0x99,0x7e,0x78,0x4, 0xfc,0x7e,0x8, 0x5, 0x7a, +0xe4,0x7a,0xb3,0x8, 0x8, 0x7a,0xb3,0x8, 0x9, 0x7a,0xb3,0x26,0xf6,0x7a,0xb3,0x26, +0xf8,0x7a,0xb3,0x26,0xf7,0x7a,0xb3,0x26,0xf9,0x6c,0xaa,0x80,0x5f,0x12,0x75,0xb2, +0xb, 0x6a,0xc0,0xbd,0xca,0x58,0x2, 0x7d,0xac,0xbd,0xc3,0x8, 0x2, 0x7d,0x3c,0x2d, +0x71,0x7d,0x60,0xb, 0x3a,0xd0,0xbd,0xd9,0x58,0x2, 0x7d,0x9d,0x7e,0x67,0x2a,0x53, +0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xc7,0x8, 0x2, 0x5, 0x24,0x12,0x75,0x9f,0xb, +0x3a,0xd0,0xbd,0xcd,0x8, 0xb, 0x7e,0xb3,0x26,0xf7,0x4, 0x7a,0xb3,0x26,0xf7,0x80, +0x19,0x12,0x75,0xa8,0xb, 0x3a,0xc0,0x6e,0xd4,0xff,0xff,0xb, 0xd4,0xbd,0xcd,0x58, +0x9, 0x7e,0xb3,0x26,0xf9,0x4, 0x7a,0xb3,0x26,0xf9,0xb, 0xa0,0x7e,0xb3,0x2a,0x74, +0xbc,0xba,0x38,0x99,0x7a,0xa7,0x7, 0xfe,0x7a,0x37,0x8, 0x2, 0xe5,0x24,0x7a,0xb3, +0x8, 0x9, 0x7a,0x97,0x8, 0x6, 0x12,0x75,0x97,0x2d,0xf5,0x6c,0xaa,0x80,0x50,0x12, +0x75,0xb2,0xb, 0x6a,0xd0,0xbd,0xd8,0x58,0x2, 0x7d,0x8d,0xbd,0xd2,0x8, 0x2, 0x7d, +0x2d,0x7e,0x67,0x2a,0x51,0x7e,0x74,0x0, 0x3, 0xad,0x76,0xbd,0xd7,0x8, 0x2, 0xb, +0x90,0x12,0x75,0x9f,0xb, 0x3a,0xc0,0xbd,0xdc,0x8, 0xb, 0x7e,0xb3,0x26,0xf6,0x4, +0x7a,0xb3,0x26,0xf6,0x80,0x17,0x12,0x75,0xa8,0xb, 0x3a,0xd0,0x6d,0x99,0x9d,0x9c, +0xbd,0xd9,0x58,0x9, 0x7e,0xb3,0x26,0xf8,0x4, 0x7a,0xb3,0x26,0xf8,0xb, 0xa0,0x12, +0x74,0x3c,0x38,0xab,0x7a,0x87,0x7, 0xfc,0x7a,0x27,0x8, 0x0, 0x7a,0x93,0x8, 0x8, +0x12,0x75,0x97,0x2d,0x15,0x6c,0xaa,0x80,0xe, 0x12,0xa5,0xe4,0xb, 0x7a,0x90,0xbd, +0x9b,0x58,0x2, 0x7d,0xb9,0xb, 0xa0,0x12,0x74,0x3c,0x38,0xed,0x7a,0xb7,0x8, 0x4, +0xbd,0x8a,0x58,0x2, 0x7d,0xa8,0x7a,0xa7,0x7, 0xf8,0xbd,0x32,0x58,0x2, 0x7d,0x32, +0x7a,0x37,0x7, 0xfa,0xda,0x3b,0x22,0x7e,0xa3,0x2a,0x74,0x74,0x2, 0xa4,0x22,0x7e, +0x74,0x62,0x10,0x7e,0x64,0x0, 0xff,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x2d,0x7f,0x7d, +0x6e,0x22,0x7e,0xf0,0x2, 0xac,0xfa,0x7f,0x67,0x2d,0xd7,0x22,0xca,0x3b,0x7f,0x31, +0x7a,0xd, 0x24,0x7e,0x35,0x28,0x7a,0x35,0x2e,0x7e,0xd, 0x24,0x7f,0x13,0x12,0xa6, +0x56,0x7e,0x35,0x28,0x7a,0x35,0x2a,0x12,0x75,0x97,0x7e,0xd, 0x24,0x2d,0x15,0x7f, +0x13,0x2d,0x35,0x12,0x6d,0x3b,0xda,0x3b,0x22,0x7e,0x37,0x2a,0x4f,0x1e,0x34,0x7a, +0x35,0x28,0x7e,0x8, 0x4, 0xfc,0x7e,0x18,0x4, 0x0, 0x12,0x75,0xbc,0x7e,0x37,0x28, +0x99,0xe, 0x34,0x7a,0x35,0x28,0x7e,0x8, 0x5, 0x7a,0x7e,0x18,0x4, 0x7e,0x12,0x75, +0xbc,0x12,0x76,0x2b,0x12,0xa7,0x45,0x2, 0x76,0x1a,0xe4,0x7a,0xb3,0x3, 0xff,0x7e, +0xb3,0x28,0xa8,0x60,0x5, 0xe4,0x7a,0xb3,0x3, 0xff,0x22,0xca,0x3b,0x7e,0xf3,0x2a, +0x6e,0x12,0xc0,0xde,0x6c,0xcc,0x80,0x13,0x7c,0x7c,0xac,0x7f,0x3e,0x34,0x7e,0xf, +0x13,0x8a,0x2d,0x13,0x7c,0xbd,0x12,0xa7,0xcd,0xb, 0xc0,0xbc,0xec,0x38,0xe9,0xda, +0x3b,0x22,0xe4,0x7a,0xb3,0x28,0x93,0x12,0xbb,0xb5,0x7e,0xb3,0x16,0x91,0xb4,0x1, +0x8, 0x7e,0x73,0x28,0x84,0x7a,0x73,0x28,0x92,0x7e,0x18,0x4, 0xfc,0x7a,0x1f,0x6, +0xf8,0x12,0x3f,0xf2,0x12,0x76,0x9a,0x12,0x74,0x43,0x7e,0xb3,0x16,0x90,0xb4,0x1, +0x18,0x7e,0x73,0x26,0x83,0x7a,0x73,0x26,0xf3,0x7e,0x73,0x26,0x85,0x7a,0x73,0x26, +0xf5,0x7e,0x73,0x26,0x84,0x7a,0x73,0x26,0xf4,0x22,0x7e,0x8, 0x26,0x86,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x20,0xde,0x7e,0x8, 0x26,0x89,0x7e,0x34,0x0, 0x3, 0x12,0x20, +0xde,0x7a,0xb3,0x26,0x83,0x7a,0xb3,0x26,0x84,0x7a,0xb3,0x26,0x85,0x7a,0xb3,0x26, +0xf0,0x7a,0xb3,0x26,0xf1,0x7a,0xb3,0x26,0xf2,0x7e,0x18,0x26,0x6f,0x12,0xc0,0xb, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x85,0x7e,0x18,0x26,0x5b,0x12,0xbf,0xe7, +0x6c,0x55,0x12,0x77,0x60,0x7a,0xb3,0x26,0x84,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x86,0x12,0xc0, +0x60,0x7e,0x63,0x26,0x84,0xbc,0x67,0x38,0xe4,0x6c,0x77,0x80,0x14,0x12,0x77,0xe9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x77,0xf2,0x2e,0x24,0x26,0x89,0x12,0xc0, +0x60,0x7e,0xa3,0x26,0x85,0xbc,0xa7,0x38,0xe4,0x7e,0xb3,0x26,0x84,0xa4,0x7a,0xb3, +0x26,0x83,0x7e,0x18,0x26,0xe6,0x12,0xc0,0xb, 0x7e,0x50,0x1, 0x12,0x77,0x60,0x7a, +0xb3,0x26,0xf2,0x7e,0x18,0x26,0xdc,0x12,0xbf,0xe7,0x7e,0x50,0x1, 0x12,0x77,0x60, +0x7c,0xab,0x7a,0xa3,0x26,0xf1,0x7e,0xb3,0x26,0xf2,0xa4,0x7a,0xb3,0x26,0xf0,0x22, +0xca,0x69,0xca,0xf8,0x7c,0x4b,0x6c,0xaa,0x6d,0xff,0x6c,0xff,0x80,0x70,0x7e,0xd0, +0x2, 0xac,0xdf,0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xe0,0x4c,0x55,0x68,0x6, 0x6e,0xe4, +0xff,0xff,0xb, 0xe4,0xbd,0x3e,0x58,0x54,0x4c,0xff,0x78,0x8, 0x6d,0x44,0x69,0xf0, +0x0, 0x2, 0x80,0x1b,0x7c,0xb4,0x14,0xbc,0xbf,0x7f,0x56,0x78,0x9, 0x1b,0xb5,0xb, +0x5a,0x40,0x6d,0xff,0x80,0x9, 0x1b,0xb5,0xb, 0x5a,0x40,0x69,0xf6,0x0, 0x2, 0x4c, +0x55,0x68,0xc, 0x6e,0x44,0xff,0xff,0xb, 0x44,0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0x4e,0x58,0x19,0xbd,0xfe,0x18,0x15,0xa, 0xba,0x7e,0x6d,0x24,0x2d,0xdb,0x7a,0x6b, +0xf0,0xb, 0xa0,0x90,0x60,0x9b,0xe4,0x93,0xbc,0xba,0x28,0x6, 0xb, 0xf0,0xbc,0x4f, +0x38,0x8c,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7c,0xb7,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xa5,0x7c,0xb7,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x22,0xe4,0x7a,0xb3, +0x37,0x9c,0x7a,0xb3,0x37,0x9d,0x90,0x60,0x50,0x93,0x7a,0xb3,0x37,0x9e,0x90,0x60, +0x51,0xe4,0x93,0x7a,0xb3,0x37,0x9f,0xe4,0x7a,0xb3,0x37,0xa0,0x90,0x60,0x99,0x93, +0x7a,0xb3,0x37,0xa1,0xe4,0x7a,0xb3,0x37,0xa2,0x7a,0xb3,0x37,0xa3,0x90,0x61,0xc4, +0x93,0x7a,0xb3,0x37,0xa5,0x7e,0x34,0x61,0x4f,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34, +0x7a,0x73,0x37,0xa9,0x7e,0x34,0x61,0x55,0x12,0x23,0x9e,0x1e,0x34,0x1e,0x34,0x7a, +0x73,0x37,0xaa,0x74,0x64,0x7a,0xb3,0x37,0xbb,0x90,0x61,0x18,0xe4,0x93,0x7a,0xb3, +0x37,0xbc,0x90,0x61,0x17,0xe4,0x93,0x7a,0xb3,0x37,0xa8,0x90,0x61,0x19,0xe4,0x93, +0x7a,0xb3,0x37,0xbe,0x90,0x61,0x24,0xe4,0x93,0x7a,0xb3,0x37,0xbd,0x90,0x61,0x1d, +0xe4,0x93,0x7a,0xb3,0x37,0xbf,0x90,0x61,0x25,0xe4,0x93,0x7a,0xb3,0x37,0xba,0xe4, +0x7a,0xb3,0x37,0xb5,0x74,0xfa,0x7a,0xb3,0x37,0xb3,0x74,0x1e,0x7a,0xb3,0x37,0xb4, +0x74,0x1, 0x7a,0xb3,0x37,0xb2,0x74,0xc, 0x7a,0xb3,0x37,0xb1,0x74,0x1, 0x7a,0xb3, +0x37,0xb6,0xe4,0x7a,0xb3,0x37,0xb7,0x7a,0xb3,0x37,0xb8,0x7e,0x8, 0x37,0xc0,0x7e, +0x34,0x0, 0x2c,0x12,0x20,0xde,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0xa, 0x36,0x7a, +0x73,0x37,0xcb,0x7e,0x34,0x60,0xd6,0x12,0x23,0x9e,0x7a,0x73,0x37,0xcc,0x90,0x60, +0xd4,0x93,0x7a,0xb3,0x37,0xcd,0x90,0x60,0xd5,0xe4,0x93,0x7a,0xb3,0x37,0xce,0x7e, +0x34,0x0, 0x4, 0xca,0x39,0x12,0x79,0x25,0x7e,0x8, 0x37,0xdc,0x12,0x20,0xb9,0x1b, +0xfd,0x74,0x5, 0x7a,0xb3,0x37,0xe9,0x74,0x1, 0x7a,0xb3,0x37,0xe0,0x7e,0x34,0x0, +0x28,0xca,0x39,0x7e,0x34,0x61,0xd5,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x26,0x33,0x12, +0x20,0xb9,0x1b,0xfd,0x22,0x7e,0x34,0x61,0x29,0x7e,0x24,0x0, 0xff,0x22,0x2, 0x23, +0xa6,0xca,0xf8,0x7e,0x73,0x2a,0x78,0xa, 0x47,0x7e,0x73,0x2a,0x71,0xa, 0x57,0x2d, +0x54,0x7e,0xa3,0x2a,0x73,0xbc,0xab,0x28,0x2, 0x7c,0xba,0x7e,0xf3,0x2a,0x72,0x7e, +0xa3,0x2a,0x74,0xbc,0xaf,0x28,0x2, 0x7c,0xfa,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xb9, +0x7e,0x18,0x2a,0x7a,0x12,0xd, 0xd9,0x75,0x25,0x15,0x7e,0x8, 0x2a,0xdc,0x7e,0x18, +0x2a,0x9d,0x7c,0xbf,0x12,0xf, 0x9c,0xda,0xf8,0x22,0x7f,0x60,0x7e,0xa3,0x2a,0x6d, +0x7e,0xb3,0x2a,0x6e,0xa4,0x7d,0xf5,0x3e,0xf4,0x7f,0x1, 0x7d,0x3f,0xe4,0x12,0x20, +0xde,0x7f,0x6, 0x7d,0x3f,0x12,0x20,0xde,0x7a,0xb3,0x16,0x91,0x22,0x7f,0x70,0x7e, +0x33,0x2a,0x74,0xa, 0x43,0x7e,0x33,0x2a,0x73,0xa, 0x53,0x2d,0x54,0x3e,0x54,0x7c, +0xab,0xe4,0x7a,0xb3,0x16,0x90,0x7f,0x1, 0xa, 0x3a,0x12,0x20,0xde,0x7f,0x7, 0xa, +0x3a,0x2, 0x20,0xde,0xca,0xd8,0xca,0x79,0x7c,0xfb,0x7f,0x51,0x7f,0x40,0x7f,0x15, +0x12,0x79,0x9d,0x12,0x3f,0xd2,0x7e,0xe0,0x1, 0x12,0x4f,0xaf,0x30,0x18,0xfd,0x74, +0x2, 0x12,0x0, 0x1e,0x7f,0x4, 0x12,0x7b,0x29,0x6c,0xdd,0x80,0x18,0x74,0x2, 0xac, +0xbd,0x7f,0x14,0x2d,0x35,0xb, 0x1a,0x20,0x74,0x2, 0xac,0xbd,0x7f,0x5, 0x2d,0x15, +0x12,0x7b,0x20,0xb, 0xd0,0x7e,0x73,0x2a,0x74,0xa, 0x7, 0x7e,0x63,0x2a,0x73,0xa, +0x16,0x2d,0x10,0xa, 0x2d,0xbd,0x21,0x48,0xd4,0x1b,0xe0,0x78,0xbc,0x7f,0x5, 0x7c, +0xbf,0x2e,0x73,0x2a,0x73,0x12,0x7a,0x8e,0xda,0x79,0xda,0xd8,0x22,0x7e,0xb3,0x2b, +0x2, 0x70,0x41,0x12,0x2f,0xf4,0x50,0xfb,0xe4,0x6c,0x77,0x6c,0x66,0x12,0x7a,0x75, +0x7e,0x8, 0x6, 0xfc,0x7e,0x1f,0x6, 0xf4,0x7e,0xb3,0x2b,0x72,0x12,0x79,0xc4,0x74, +0x1, 0x7e,0x70,0x1, 0x7e,0x60,0x1, 0x12,0x7a,0x75,0x7e,0x8, 0x7, 0x7a,0x7e,0x1f, +0x6, 0xf4,0x7e,0xb3,0x25,0xf0,0x12,0x79,0xc4,0x74,0x2, 0x7a,0xb3,0x2b,0x2, 0xe4, +0x7a,0xb3,0x16,0x90,0x22,0x7c,0x96,0x7c,0xa7,0x12,0x3d,0xac,0x7c,0xba,0x12,0x13, +0xc7,0x74,0xa, 0x12,0x45,0x15,0x7c,0xb9,0x12,0x0, 0x1e,0x2, 0x4e,0xe7,0xca,0xd8, +0xca,0x79,0x7c,0xf7,0x7f,0x70,0x12,0x7b,0xd0,0x7c,0xeb,0x6c,0xdd,0x80,0x20,0x74, +0x2, 0xac,0xbd,0x7f,0x67,0x2d,0xd5,0xb, 0x6a,0x30,0x6d,0x22,0x74,0x4, 0x2f,0x11, +0x14,0x78,0xfb,0xa, 0x1e,0x6d,0x0, 0x12,0x1f,0x7, 0x1b,0x6a,0x30,0xb, 0xd0,0xbc, +0xfd,0x38,0xdc,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x51,0x7f,0x40,0x7e,0xa3, +0x2a,0x74,0xa, 0x3a,0x7e,0xa3,0x2a,0x73,0xa, 0x7a,0x2d,0x73,0x7e,0xd, 0x2a,0x7c, +0x7f,0x12,0x7a,0x8e,0xa, 0x3f,0x3e,0x34,0xca,0x39,0x7e,0x1d,0x2a,0x7f,0x4, 0x12, +0x20,0xb9,0x1b,0xfd,0x7e,0xb3,0x2b,0x1, 0xb4,0x1, 0x22,0x6c,0xaa,0x80,0x1a,0x7e, +0x70,0x2, 0xac,0x7a,0x7f,0x5, 0x2d,0x13,0xb, 0xa, 0x20,0x7f,0x4, 0x2d,0x13,0xb, +0xa, 0x30,0x9d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbc,0xfa,0x38,0xe2,0xda,0x79,0x22, +0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x74,0x2, 0x2, 0x0, 0x1e,0xca,0xd8,0xca,0x79,0x7e,0xf0,0xa, +0x74,0x1, 0x7a,0xb3,0x2a,0xfa,0x12,0x29,0x6f,0x7c,0xe7,0x80,0x5d,0x12,0x26,0x57, +0x12,0x4f,0x9e,0x30,0x18,0xfd,0x12,0x7b,0xc6,0x12,0x7b,0x29,0x6c,0xdd,0x80,0x3d, +0x7e,0x50,0x2, 0xac,0x5d,0x49,0x32,0x6, 0xfc,0xbe,0x34,0x14,0x78,0x50,0x14,0xa, +0x1d,0x2e,0x17,0x2a,0xfe,0x7e,0x19,0xb0,0xbe,0xb0,0x0, 0x28,0x1e,0x14,0x7a,0x19, +0xb0,0x80,0x18,0xbe,0x34,0x19,0x28,0x28,0x10,0xa, 0x3d,0x12,0x3f,0xb, 0xbe,0xb0, +0xff,0x68,0x8, 0x4, 0x7a,0x39,0xb0,0x80,0x2, 0x1b,0xe0,0xb, 0xd0,0x12,0x7b,0xb7, +0xa, 0x3d,0xbd,0x32,0x48,0xba,0x4c,0xee,0x68,0x8, 0x7c,0xaf,0x1b,0xf0,0x4c,0xaa, +0x78,0x9b,0xda,0x79,0xda,0xd8,0x22,0x7e,0x73,0x2a,0x74,0xa, 0x37,0x7e,0x53,0x2a, +0x73,0xa, 0x25,0x2d,0x23,0x22,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0x8, 0x6, 0xfc,0x22, +0x7c,0x7b,0xa5,0xbf,0x0, 0x3, 0x74,0x10,0x22,0xbe,0x70,0x4, 0x38,0x4, 0x6c,0xaa, +0x80,0x21,0xbe,0x70,0x8, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x17,0xbe,0x70,0x10,0x38, +0x5, 0x7e,0xa0,0x2, 0x80,0xd, 0xbe,0x70,0x20,0x38,0x5, 0x7e,0xa0,0x3, 0x80,0x3, +0x7e,0xa0,0x4, 0xa, 0x47,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x7c,0xba,0x60,0x5, 0x1e, +0x44,0x14,0x78,0xfb,0x7c,0xb9,0x22,0x7e,0xa3,0x2f,0xa8,0x7e,0x70,0x4, 0xac,0x7a, +0xb, 0x34,0xbe,0x37,0x37,0xed,0x40,0x39,0x7e,0x37,0x37,0xed,0xb, 0x34,0x7a,0x37, +0x37,0xed,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e,0xb3,0x37,0x34,0x22,0xbe,0x34,0x0, +0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25, +0x9, 0xb2,0x38,0xfb,0x22,0x9e,0x34,0x0, 0x3, 0x2e,0x37,0x2b,0xb9,0x7e,0x39,0xb0, +0x22,0x74,0xff,0x22,0x70,0x5, 0x7e,0xb3,0x37,0x9c,0x22,0xbe,0xb0,0x3, 0x38,0x15, +0x75,0x1b,0x0, 0x30,0xe, 0x6, 0x7e,0x18,0x32,0xea,0x80,0x4, 0x7e,0x18,0x33,0x28, +0x7a,0x1d,0x14,0x80,0x8, 0xbe,0xb0,0x5e,0x38,0x10,0x75,0x1b,0x0, 0xa, 0x1b,0x7e, +0x1d,0x14,0x2d,0x31,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0xb0,0xd3,0x68,0x3, 0xb4, +0xd4,0x10,0xb4,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x37,0xed,0x80,0x2, 0x15,0x1a,0x2, +0x7c,0x17,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x3, 0x2, 0x7d,0x61,0xbe,0xb0,0x80, +0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0xa, 0x3b,0x9, 0xb3,0x36,0x61,0x22,0xb4,0xfc, +0x5, 0x7e,0xb3,0x37,0x8, 0x22,0xb4,0xfd,0x17,0x6c,0xaa,0x7e,0xb3,0x28,0xa8,0x60, +0x3, 0x4e,0xa0,0x1, 0x7e,0xb3,0x36,0x71,0x60,0x3, 0x4e,0xa0,0x2, 0x7c,0xba,0x22, +0xb4,0xfe,0x5, 0x7e,0xb3,0x2b,0xf, 0x22,0x74,0xff,0x22,0x7c,0x7b,0x6c,0xaa,0x12, +0x3f,0xe1,0x78,0x9, 0x7c,0xb7,0x12,0x7c,0x64,0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, +0x7c,0xb7,0x12,0x37,0xeb,0x7c,0xab,0x7c,0xba,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5, +0x18,0x70,0x9, 0x75,0x18,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5, +0x1a,0x12,0x3f,0xb3,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12, +0x7c,0xfb,0xf5,0x91,0x22,0xca,0x7b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83,0xc0, +0x82,0x12,0x7d,0x1a,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x7b, +0x32,0xb4,0xeb,0x5, 0xe4,0x7a,0xb3,0x37,0xf2,0x7e,0x73,0x37,0xf2,0xa, 0x27,0x2e, +0x24,0x0, 0x6, 0x12,0x51,0x4f,0x93,0x7c,0xab,0x7c,0xb7,0x4, 0x7a,0xb3,0x37,0xf2, +0xb4,0x3, 0xb, 0xe4,0x7a,0xb3,0x37,0xf2,0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0xa3,0x37,0x9b,0x7c,0xba,0x4, 0x7a,0xb3,0x37,0x9b,0x7a, +0xa3,0x36,0xf2,0x22,0xa9,0xc0,0x93,0x75,0x18,0x0, 0x32,0x7a,0xb3,0x37,0x9c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x37,0x8, 0x22,0x74,0x1, 0x7a,0xb3,0x37,0x8, +0xe4,0x7a,0xb3,0x37,0x9c,0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba, +0x12,0x7d,0xab,0x80,0x2c,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3, +0x7c,0x7a,0x12,0x7e,0x45,0x80,0x1a,0xbe,0x30,0x80,0x40,0x15,0xbe,0x30,0xdf,0x38, +0x10,0x7c,0xb3,0x24,0x80,0x7c,0x7a,0x12,0x7e,0x21,0xa5,0xbb,0x8f,0x3, 0x75,0x19, +0x1, 0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x44,0xc0,0x74,0x1, 0x7a,0xb3,0x33,0xff, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x1c,0x2e,0x60,0xfd,0x68,0x17,0x1b,0x61,0x68, +0x13,0x2e,0x60,0xfa,0x68,0xe, 0x1b,0x60,0x68,0xa, 0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x36,0xe1,0xd2,0xd, 0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x37, +0xef,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x37, +0xef,0x15,0x1a,0x7e,0x27,0x37,0xef,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, +0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x37,0xef,0x75,0x1a,0xea, +0x22,0x7e,0xb3,0x37,0xf1,0x4, 0x7a,0xb3,0x37,0xf1,0xe5,0x19,0xb4,0x1, 0x8, 0xe4, +0x7a,0xb3,0x37,0xf1,0x75,0x19,0x0, 0x7e,0x73,0x37,0xf1,0x7a,0x73,0x36,0xf0,0x22, +0xe4,0x7a,0xb3,0x37,0x9c,0x7e,0x8, 0x32,0xea,0x12,0x7e,0xef,0x7e,0x8, 0x33,0x28, +0x7e,0x34,0x0, 0x3e,0x12,0x20,0xde,0x7e,0x18,0x32,0xea,0x7a,0x1d,0x14,0x12,0x7e, +0xd1,0x2, 0x7e,0xc4,0x75,0x18,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x37,0x9c,0xf5,0x91, +0x22,0x2, 0x7e,0xd4,0x90,0x60,0x0, 0xe4,0x93,0x54,0xfe,0x75,0x91,0x0, 0xc2,0x90, +0xc2,0x91,0xc2,0xc9,0x54,0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xd2,0xad,0x22,0x7e, +0x34,0x0, 0x3e,0x74,0xff,0x2, 0x20,0xde,0x7c,0xab,0x12,0x3f,0x52,0x7c,0xba,0x12, +0x13,0xc7,0x2, 0x0, 0x1e,0x30,0x18,0x8, 0x74,0x5, 0x7e,0x70,0x99,0x12,0x13,0x2c, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x4f,0x12,0x7f,0x67,0x49,0x35,0x34,0x3b,0x49,0x15, +0x34,0x3d,0x6d,0x0, 0xbe,0x8, 0x0, 0x0, 0x68,0x1a,0xbe,0x70,0x0, 0x40,0x15,0xbe, +0x70,0x2, 0x38,0x10,0x74,0x2, 0x12,0x0, 0x1e,0x7e,0xb3,0x2a,0x73,0x7e,0x73,0x2a, +0x74,0x12,0x10,0xee,0x7e,0xb3,0x34,0x39,0x4, 0x7a,0xb3,0x34,0x39,0x12,0x7f,0x6f, +0x28,0xe, 0x12,0x4e,0x9b,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x6, 0x74,0x3, 0x80,0x2, +0x74,0x2, 0x7a,0xb3,0x34,0x3a,0x22,0x7e,0xa3,0x34,0x39,0x74,0x4, 0xa4,0x22,0x7e, +0x73,0x34,0x38,0xbe,0x73,0x34,0x39,0x22,0x7d,0xf3,0x6d,0xee,0x6c,0x99,0x80,0x3c, +0x7c,0xb9,0x12,0x31,0x27,0x7d,0xd3,0x7d,0xcd,0x3e,0xc4,0x7f,0x57,0x2d,0xbc,0xb, +0x5a,0x10,0x1a,0x2, 0x1a,0x0, 0x7e,0x83,0x2b,0x20,0xa, 0x98,0x6d,0x88,0x7f,0x10, +0x7f,0x4, 0x12,0x1e,0xeb,0x74,0x6, 0x7f,0x1, 0x1e,0x14,0x1e,0x4, 0x50,0x3, 0x4e, +0x20,0x80,0x14,0x78,0xf4,0x7d,0xc1,0x1b,0x5a,0xc0,0xb, 0x90,0x7e,0x83,0x2a,0x75, +0xbc,0x89,0x38,0xbc,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a,0x0, 0x1b,0x2a,0x0, +0x1b,0x1a,0x10,0x22,0x7c,0x9b,0x7f,0x71,0x7e,0x7b,0x80,0x4c,0x88,0x78,0x7, 0x7e, +0xb, 0x90,0x7a,0x7b,0x90,0x22,0xa, 0x28,0x7e,0xb, 0x80,0xa, 0x38,0x9d,0x32,0x12, +0x21,0x0, 0xe5,0x29,0xa, 0x2b,0xbd,0x32,0x8, 0x15,0x7e,0x7b,0xa0,0x7e,0xb, 0xb0, +0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x7b,0xb0,0x7e, +0x7b,0x70,0x7a,0xb, 0x70,0x22,0x7d,0xc3,0x7e,0x34,0x61,0x37,0x12,0x87,0xbc,0x90, +0x61,0x35,0xe4,0x93,0x70,0x3, 0x7d,0x3c,0x22,0x90,0x61,0x36,0xe4,0x93,0xb4,0x1, +0x6, 0x7e,0x83,0x2a,0x70,0x80,0x4, 0x7e,0x83,0x2a,0x6f,0x12,0x87,0xd4,0xbe,0xc4, +0x0, 0x3f,0x38,0x1c,0x7e,0xe4,0x0, 0x3f,0x9d,0xec,0x7e,0x34,0x61,0x3b,0x12,0x81, +0x2, 0x12,0x80,0xf1,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x1, 0xee, +0x12,0x66,0xb1,0xbd,0x5c,0x38,0x21,0x7d,0xec,0x9d,0xe5,0x7e,0x34,0x61,0x3d,0x12, +0x81,0x2, 0x90,0x61,0x3a,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b, +0x7c,0x12,0x80,0xf9,0x2f,0x71,0x80,0x66,0x7d,0xb4,0xb, 0xb4,0x1e,0xb4,0x7d,0x5b, +0x1b,0x54,0xbd,0x5c,0x40,0xc, 0x7d,0xf5,0x9d,0xfc,0x6d,0xee,0x7e,0x34,0x61,0x3f, +0x80,0xa, 0x7d,0xfc,0x9d,0xfb,0x6d,0xee,0x7e,0x34,0x61,0x41,0x12,0x87,0xcc,0x7f, +0x17,0x12,0x1e,0xfc,0x7f,0x71,0x12,0x81,0x1c,0x7f,0x71,0xbd,0x5c,0x7d,0x3d,0x40, +0xc, 0x1e,0x34,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x6, 0x1e,0x34,0x6d, +0x22,0x2f,0x71,0x12,0x80,0xf1,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, +0x90,0x61,0x3a,0xe4,0x93,0x12,0x80,0xf9,0xbf,0x71,0x28,0x2, 0x7f,0x71,0x7d,0x3f, +0x22,0x90,0x61,0x39,0xe4,0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d, +0x22,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d, +0x2e,0x7c,0x76,0x7c,0x65,0x7f,0x71,0x22,0x7d,0x30,0xad,0x31,0x7c,0x76,0x7c,0x65, +0xa, 0x24,0x22,0xca,0x79,0x7c,0xe5,0x7c,0xfb,0x7e,0xe4,0xff,0xfc,0x7c,0xb4,0x12, +0x9f,0x40,0x7d,0x3, 0x74,0x9, 0xac,0xbf,0x12,0x87,0xe5,0x49,0x35,0x28,0xae,0x12, +0x81,0xbf,0x12,0x81,0x18,0x7d,0x13,0x5e,0x30,0xfc,0x7e,0x70,0x9, 0xac,0x7f,0x49, +0xf3,0x29,0x62,0x74,0x9, 0xac,0xbe,0x49,0x25,0x28,0xae,0xbd,0x2f,0x28,0xf, 0x7d, +0x53,0x2e,0x54,0x29,0x62,0x7d,0x2f,0x2d,0x21,0x1b,0x58,0x20,0x80,0x9, 0x2e,0x34, +0x29,0x62,0x9d,0xf1,0x1b,0x38,0xf0,0x74,0x9, 0xac,0xbf,0x12,0x81,0xb3,0x12,0x81, +0x18,0x7d,0x13,0x5d,0x1e,0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x29,0x64,0x74,0x9, +0xac,0xbe,0x49,0x5, 0x28,0xb0,0xbd,0x3, 0x28,0xd, 0x7d,0x2, 0x2e,0x4, 0x29,0x64, +0x2d,0x13,0x1b,0x8, 0x10,0x80,0x9, 0x2e,0x24,0x29,0x64,0x9d,0x31,0x1b,0x28,0x30, +0xda,0x79,0x22,0x49,0x25,0x29,0x64,0x74,0x9, 0xac,0xbe,0x49,0x35,0x28,0xb0,0x9d, +0x32,0x12,0x21,0x0, 0x7d,0x13,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x37,0x7c,0x2b,0x74, +0x4, 0xac,0xb2,0x49,0x35,0x2b,0xbf,0x49,0xf5,0x2b,0xc1,0x74,0x4, 0xac,0xb3,0x49, +0x25,0x2b,0xbf,0x49,0x55,0x2b,0xc1,0x12,0x81,0xbf,0x7d,0x3f,0x9d,0x35,0x12,0x21, +0x0, 0x9d,0x34,0x12,0x21,0x0, 0x7e,0x54,0x62,0x6a,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0xf, 0x12,0x67,0xeb,0x7e,0x14,0x62,0x6a,0x12,0x87,0xee,0x50, +0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb7,0x2f,0x9c,0x7e,0xc7, +0x2f,0x9e,0x7e,0x97,0x2f,0x84,0x7e,0xd7,0x2f,0x86,0x7e,0xa7,0x2f,0x98,0x7e,0xe7, +0x2f,0x9a,0xe4,0x7e,0x73,0x2f,0xa8,0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0x81,0xc7, +0x70,0x2, 0x61,0x45,0x7e,0x73,0x2f,0xa8,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70, +0x9, 0x7e,0x27,0x2f,0xa0,0x7e,0x17,0x2f,0xa2,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45, +0x7e,0x73,0x2f,0xa8,0xbe,0x70,0x14,0x28,0x13,0xe4,0x7e,0x70,0x13,0x7e,0x27,0x2f, +0xa4,0x7e,0x17,0x2f,0xa6,0x12,0x81,0xc7,0x70,0x2, 0x61,0x45,0x7e,0x34,0x62,0x72, +0x12,0x83,0x4a,0x28,0x4a,0x7e,0x34,0x62,0x70,0x12,0x83,0x54,0x50,0x41,0x7e,0xb3, +0x2f,0x81,0x70,0x3b,0x7e,0x34,0x62,0x76,0x12,0x23,0x9e,0x12,0x83,0x5e,0x7d,0x8f, +0x9d,0x83,0xbe,0x87,0x2f,0x82,0x50,0x27,0x7e,0x34,0x62,0x74,0x12,0x87,0xc4,0x9d, +0xf8,0xbe,0xf7,0x2f,0x82,0x28,0x18,0x7d,0xfc,0x3e,0xf4,0xbd,0xfb,0x40,0x2, 0x61, +0x45,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x80,0x7b,0x7e,0xf0,0x21,0x80,0x76,0x7e, +0x34,0x62,0x7a,0x12,0x83,0x54,0x28,0x6d,0x7e,0x34,0x62,0x78,0x12,0x83,0x4a,0x50, +0x64,0x7e,0xb3,0x2f,0x81,0x70,0x5e,0x7e,0x34,0x62,0x7e,0x12,0x23,0x9e,0x12,0x83, +0x5e,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x2f,0x82,0x50,0x4a,0x7e,0x34,0x62,0x7c,0x7e, +0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe,0xf7,0x2f,0x82,0x28,0x37,0x7d,0xfb, +0x3e,0xf4,0xbd,0xfc,0x50,0x2f,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x26,0x12, +0x67,0xf2,0x49,0x35,0x2b,0xbb,0x49,0x15,0x2b,0xbd,0x49,0x25,0x2b,0xab,0x49,0x5, +0x2b,0xad,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0x8, 0x9d,0x32,0xbe,0x34,0x0, 0x10, +0x58,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0xf0,0xbd,0xfc,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0xbd,0xfb,0x22,0x7e,0x14, +0x62,0x8e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22,0x12,0x86,0x69,0x7a,0x37,0x2f, +0x9c,0x12,0x85,0xf4,0x7a,0x37,0x2f,0x9e,0x12,0x82,0x16,0x60,0x1, 0x22,0x7e,0x73, +0x2f,0xa8,0xa, 0x37,0x7a,0x35,0x24,0x7e,0x8, 0x2b,0xbf,0x7e,0x18,0x2f,0x80,0x2, +0x83,0x92,0xca,0xf8,0x7e,0x45,0x24,0x7c,0xb9,0x7a,0xb3,0x38,0x3f,0x74,0xff,0x7a, +0xb3,0x38,0x3e,0x6d,0x55,0x80,0x19,0x7d,0xf5,0x3e,0xf4,0x12,0x86,0x74,0x7d,0xe5, +0x3e,0xe4,0x59,0xfe,0x1f,0x34,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x21,0x14,0xb, 0x54, +0xbd,0x45,0x38,0xe3,0x7e,0x33,0x38,0x3f,0xbe,0x30,0x4, 0x38,0x2, 0x81,0x54,0x69, +0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e, +0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x40,0x7a,0xb3, +0x38,0x42,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f, +0x12,0x1e,0xb9,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x38,0x42,0x7d,0xf, 0x2d,0xf, 0xbd, +0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x38,0x42,0xa, 0x37,0x6d,0x22,0x12, +0x1e,0xeb,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7a,0x73,0x38,0x42,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x84,0x73,0x12, +0xbf,0x3c,0x12,0x84,0x73,0x12,0x84,0x7c,0x12,0x84,0x73,0x12,0xa5,0x28,0x80,0xa, +0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x38,0x3e,0xe4,0x7a,0xb3,0x38,0x3f,0x7e, +0x73,0x39,0x1, 0xbe,0x73,0x38,0x3e,0x48,0x6, 0x7e,0xb3,0x38,0x40,0x80,0x1, 0xe4, +0xda,0xf8,0x22,0x7e,0x8, 0x1f,0x34,0x7e,0x18,0x21,0x14,0x22,0xca,0x3b,0x7f,0x71, +0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x22,0xf4,0x7a, +0x43,0x23,0xe4,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0xa1,0x9d,0x7e,0x90,0x2, 0xac,0x9a, +0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x26,0x7f,0x67,0x2d, +0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f, +0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a, +0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe, +0xf0,0x2, 0x58,0x2, 0xa1,0x9b,0xbe,0x60,0x0, 0x18,0x2, 0xa1,0x83,0xbe,0x70,0xec, +0x28,0x2, 0xa1,0xa7,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7, +0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x85,0xeb,0x19,0xba,0x22, +0xf4,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x85,0xeb,0x19,0xba,0x23,0xe4,0x9, 0xba, +0x22,0xf4,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7, +0x19,0xbc,0x22,0xf3,0x9, 0xbc,0x23,0xe4,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0x85, +0xeb,0x19,0xba,0x23,0xe3,0x2d,0xdb,0x12,0x85,0xe2,0x19,0xbd,0x22,0xf5,0xa, 0xd9, +0x12,0x85,0xe0,0x19,0xbd,0x23,0xe5,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe, +0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x26,0xa, 0xcb,0xa, 0xd5,0x12, +0x85,0xe0,0x19,0xbd,0x22,0xf4,0xa, 0xc9,0xa, 0xd4,0x12,0x85,0xe0,0x19,0xbd,0x23, +0xe4,0xb, 0x70,0xbe,0x70,0xf0,0x50,0x1f,0x7e,0x51,0x26,0x7c,0x49,0xe5,0x26,0xa, +0xd7,0x19,0xbd,0x22,0xf4,0x19,0x9d,0x23,0xe4,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x38, +0x3f,0xbc,0xba,0x28,0x2, 0x81,0x9b,0x7a,0x73,0x38,0x3f,0x7e,0xa0,0x1, 0x80,0x25, +0xa, 0x3a,0x9, 0xb3,0x22,0xf4,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d, +0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x23,0xe4,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e, +0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x38,0x3f,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22, +0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c, +0xbd,0xa, 0xa7,0x22,0x7e,0x37,0x2f,0x96,0x9e,0x37,0x2f,0x8e,0x22,0x7e,0x17,0x2f, +0x90,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x2f,0x90,0x7a,0x27,0x2f,0x92,0x80,0x10,0x7e, +0x17,0x2f,0x88,0xbd,0x13,0x50,0x8, 0x7a,0x37,0x2f,0x88,0x7a,0x27,0x2f,0x8a,0x7e, +0x17,0x2f,0x8e,0xbd,0x12,0x28,0xa, 0x7a,0x27,0x2f,0x8e,0x7a,0x37,0x2f,0x8c,0x80, +0x10,0x7e,0x17,0x2f,0x96,0xbd,0x12,0x50,0x8, 0x7a,0x27,0x2f,0x96,0x7a,0x37,0x2f, +0x94,0x7e,0xb3,0x2f,0xa8,0xb4,0xa, 0xf, 0x12,0x86,0x69,0x7a,0x37,0x2f,0xa0,0x12, +0x85,0xf4,0x7a,0x37,0x2f,0xa2,0x22,0xb4,0x14,0xe, 0x12,0x86,0x69,0x7a,0x37,0x2f, +0xa4,0x12,0x85,0xf4,0x7a,0x37,0x2f,0xa6,0x22,0x7e,0x37,0x2f,0x88,0x9e,0x37,0x2f, +0x90,0x22,0x7d,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x22,0x7c,0xab, +0x6d,0x44,0x80,0x29,0x4c,0xaa,0x68,0x11,0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4,0x14, +0x78,0xfb,0x12,0x86,0x72,0x2d,0xfe,0x80,0xf, 0x12,0x86,0xb5,0x60,0x5, 0x3e,0xe4, +0x14,0x78,0xfb,0x12,0x86,0x72,0x9d,0xfe,0x1b,0x6a,0xf0,0xb, 0x44,0x7e,0xf5,0x2a, +0xbd,0xf4,0x38,0xd0,0x22,0x7f,0x71,0x2d,0xf4,0x7e,0x7b,0xb0,0x1a,0xeb,0x7f,0x61, +0x2e,0xd5,0x2a,0x7e,0x6b,0xb0,0x22,0x7c,0x7b,0x90,0x60,0x93,0xe4,0x93,0xa, 0x1b, +0x7e,0x63,0x2a,0x71,0xa, 0x6, 0x2d,0x1, 0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xad,0x10, +0x7d,0x21,0x12,0x87,0xdc,0xa, 0x26,0x7a,0x25,0x2a,0x74,0x1d,0xac,0x7b,0x2e,0x34, +0x37,0x44,0x6d,0x22,0xe4,0x2, 0x86,0x7e,0x7c,0x2b,0x7e,0xb3,0x1f,0x33,0xbc,0x2b, +0x68,0x4f,0x12,0x87,0x56,0x7c,0x3b,0x7c,0xb2,0x12,0x87,0x56,0x7c,0xab,0xbe,0x30, +0xff,0x68,0x3e,0xbe,0xa0,0xff,0x68,0x39,0x7e,0x70,0x4, 0xac,0x73,0xa, 0x2a,0x12, +0x91,0x67,0xbe,0xb0,0x2, 0x38,0x2a,0xa, 0x2b,0x7e,0x34,0x2, 0xe0,0xad,0x32,0x2e, +0x34,0x16,0x93,0x6d,0x22,0x30,0x16,0x3, 0x2, 0x86,0xc7,0x7e,0xb3,0x2b,0x1d,0xb4, +0x1, 0xf, 0x12,0xc0,0x1b,0x7a,0x55,0x2a,0x7e,0x8, 0xd, 0xc8,0x74,0x1, 0x2, 0x86, +0x7e,0x22,0x7e,0xb3,0x2b,0xf, 0x7c,0xab,0x6c,0x77,0x7e,0x50,0x5, 0xac,0x57,0x9, +0x62,0x26,0x33,0xbc,0x6a,0x78,0x3, 0x7c,0xb7,0x22,0xb, 0x70,0xbe,0x70,0x4, 0x40, +0xe9,0x74,0xff,0x22,0x7e,0xb3,0x37,0x31,0x70,0x6, 0x12,0x87,0xad,0x2, 0x87,0xb6, +0x12,0x63,0x9, 0x12,0xbd,0x6d,0x50,0xa, 0x12,0x83,0x6a,0x7c,0x3b,0x12,0x87,0xad, +0x80,0x5, 0x12,0xbe,0x14,0x7c,0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xbc,0xf1, +0x60,0xa, 0x7a,0x33,0x37,0x34,0x74,0x1, 0x7a,0xb3,0x2a,0x8, 0x22,0xe4,0x7a,0xb3, +0x2f,0x80,0x22,0x2, 0x81,0x23,0xe4,0x7a,0xb3,0x38,0xdd,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x22,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x10,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44,0x22,0x3e,0x24,0x7e,0xf, +0x38,0xd9,0x2d,0x12,0x22,0x49,0x25,0x29,0x62,0x74,0x9, 0xac,0xbe,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x32,0x22,0x7d,0x13,0x7d,0x32,0x6d,0x22,0x74,0x6, +0x2f,0x11,0x14,0x78,0xfb,0xb, 0x14,0x12,0x1f,0x5, 0x7d,0x53,0xbe,0x54,0x0, 0xff, +0x28,0x4, 0x7e,0x54,0x0, 0x40,0x22,0x12,0x6e,0x8f,0x50,0x3, 0xd2,0xf, 0x22,0xc2, +0xf, 0x22,0x12,0xac,0xe9,0x12,0x88,0x2b,0x2, 0x88,0x17,0x7e,0x8, 0x24,0xf2,0x7e, +0x34,0x0, 0xc, 0xe4,0x12,0x20,0xde,0x12,0xaa,0x61,0x12,0xaa,0x58,0xa9,0xd1,0xcb, +0x12,0xc1,0x22,0x7a,0x37,0x24,0xf6,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xf8,0x7e, +0x1f,0x13,0x86,0x7a,0x37,0x24,0xfa,0x6d,0x33,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x12, +0x54,0x94,0x12,0x88,0xb9,0x12,0x8c,0xad,0x7e,0xb3,0x37,0x6, 0xb4,0x1, 0x1e,0x7e, +0x34,0x61,0xc0,0x12,0x87,0xcc,0x7e,0x24,0x0, 0x5, 0xad,0x12,0x7a,0x17,0x28,0xa1, +0x7e,0x14,0x61,0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x7e,0xb3,0x39, +0x11,0x60,0x7, 0x14,0x7a,0xb3,0x39,0x11,0x80,0x6, 0x7e,0xb3,0x28,0xac,0x60,0x9, +0x12,0x88,0x22,0x12,0x8c,0x90,0x12,0xb3,0xd3,0x7e,0xb3,0x28,0xad,0x60,0x9, 0x12, +0xbb,0x30,0x12,0xaa,0x6a,0x2, 0x8d,0x10,0x22,0x7e,0x90,0x1, 0x7e,0xb3,0x2f,0xa9, +0xbe,0xb0,0xff,0x50,0x5, 0x4, 0x7a,0xb3,0x2f,0xa9,0x7e,0x34,0x61,0xc0,0x12,0x23, +0x9e,0x12,0xc0,0xb1,0x12,0x23,0x9e,0x7a,0x37,0x28,0xa3,0x12,0x8c,0x87,0xb, 0x1a, +0xf0,0x7e,0x34,0x61,0x4f,0x12,0x87,0xbc,0xe4,0x7a,0xb3,0x28,0xac,0x74,0x1, 0x7a, +0xb3,0x28,0xad,0x7e,0x34,0xff,0xfa,0xad,0x3f,0x12,0x8f,0xdc,0x7d,0xc3,0xe, 0xc4, +0x7e,0xe7,0x7, 0xfe,0xbd,0xe3,0x58,0x15,0x7e,0xe7,0x7, 0xfc,0xbd,0xec,0x58,0xd, +0x12,0x8a,0x7c,0x8, 0x8, 0x12,0x8b,0xe, 0x60,0x3, 0x12,0x8a,0x95,0x12,0x8b,0xe, +0xa, 0xeb,0x4d,0xee,0x68,0x3b,0x6d,0xee,0x9d,0xef,0xbe,0xe7,0x7, 0xfe,0x18,0x6, +0xbe,0xe7,0x7, 0xfc,0x8, 0x2b,0x12,0x8a,0x7c,0x8, 0x26,0x7e,0x37,0x28,0x8e,0x12, +0x21,0x0, 0xbe,0x37,0x28,0x8a,0x8, 0x19,0x12,0x8a,0x74,0x28,0x14,0x7e,0x83,0x28, +0x85,0xbe,0x80,0x1, 0x28,0xb, 0x7e,0xc7,0x7, 0xfa,0xbd,0xcf,0x58,0x3, 0x12,0x8a, +0x95,0x12,0xad,0x28,0x40,0x5, 0xe4,0x7a,0xb3,0x28,0xa8,0x12,0xc1,0x1a,0x68,0x6, +0x7e,0xb3,0x39,0xb, 0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x7d,0x12,0x8a,0x74, +0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x30,0x10,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12, +0xad,0x66,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x12,0x8a,0xa6,0x7c,0x9b,0x80, +0x1a,0x7e,0xb3,0x26,0x84,0x70,0x14,0x7e,0xb3,0x26,0x85,0x70,0xe, 0x12,0x8a,0x74, +0x28,0x9, 0x7e,0x90,0x3, 0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0xc7,0x7, 0xfa,0xbe, +0xc4,0x5, 0xdc,0x8, 0x17,0x12,0x8a,0x74,0x28,0x12,0x6d,0xcc,0x9d,0xcd,0xbe,0xc7, +0x28,0x8e,0x58,0x8, 0x12,0x8a,0x87,0xe4,0x7a,0xb3,0x28,0xad,0xa, 0x29,0x7e,0x14, +0x61,0xc0,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa1,0xa, 0x29,0x7e,0x14,0x61, +0xc2,0x12,0x64,0xd3,0xad,0x32,0x7a,0x37,0x28,0xa3,0x12,0x0, 0x66,0x50,0xd, 0xe4, +0x7a,0xb3,0x28,0xad,0x12,0x8f,0xe3,0x28,0x3, 0x12,0x8a,0x87,0x7e,0xc7,0x28,0x8a, +0xbd,0xcd,0x8, 0x19,0x12,0x9b,0xf, 0x6e,0x34,0xff,0xff,0xb, 0x34,0xbe,0x37,0x28, +0x8e,0x58,0xa, 0x12,0x0, 0x66,0x50,0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x12,0x8b,0x8e, +0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x28,0xad,0x7e,0xb3,0x28,0xac,0xb4,0x1, 0x9, 0xe4, +0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x2a,0x2, 0x12,0xac,0x90,0x7e,0xb3,0x2f,0xaa,0xbe, +0xb0,0x0, 0x28,0x1f,0x14,0x7a,0xb3,0x2f,0xaa,0x70,0x18,0xe4,0x7a,0xb3,0x28,0xad, +0x12,0x8c,0x7f,0x7a,0xb3,0x16,0x91,0x7a,0xb3,0x16,0x90,0x7a,0xb3,0x28,0x84,0x7a, +0xb3,0x26,0x83,0x22,0x7e,0x83,0x28,0x84,0xbe,0x80,0x0, 0x22,0x6d,0xee,0x9e,0xe7, +0x2a,0x5a,0xbe,0xe7,0x28,0x8e,0x22,0xe4,0x7a,0xb3,0x2f,0xaa,0x7a,0xb3,0x28,0xac, +0x74,0x2, 0x2, 0x29,0xfa,0x74,0x2, 0x7a,0xb3,0x2f,0xaa,0xe4,0x7a,0xb3,0x2f,0xa9, +0x12,0x8c,0x7f,0x2, 0x29,0xfa,0x7e,0xa0,0x1, 0x7e,0x47,0x7, 0xf8,0x12,0x8c,0x87, +0xb, 0x1a,0x0, 0x7e,0x34,0xff,0xfa,0xad,0x30,0x7e,0x14,0x0, 0x2, 0x12,0x8b,0x6, +0x8, 0x12,0x7e,0xb3,0x28,0xac,0x60,0x7, 0xe4,0x7a,0xb3,0x28,0xad,0x80,0x32,0x7e, +0xa0,0x5, 0x80,0x2d,0x7e,0x34,0xff,0xfb,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x4, +0x80,0x1f,0x7e,0x34,0xff,0xfc,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0x11, +0x7e,0x34,0xff,0xfd,0x12,0x8b,0x4, 0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0, +0x1, 0x7c,0xba,0x22,0xad,0x30,0x7d,0x21,0x12,0x1e,0xb9,0xbd,0x34,0x22,0x6c,0x66, +0x90,0x60,0xa7,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x71,0x90,0x60,0xaa,0xe4,0x93,0x70, +0x6a,0x7e,0xb3,0x28,0xa8,0xb4,0x1, 0x63,0x7e,0x73,0x26,0xf2,0xbe,0x70,0x0, 0x28, +0x5a,0x6c,0x33,0x80,0x4e,0xa, 0x23,0x9, 0x72,0x26,0xe6,0x7e,0xb3,0x2a,0x6e,0x14, +0xbc,0x7b,0x78,0x3d,0x6c,0x22,0x80,0x27,0x7c,0xb2,0x7c,0x73,0x12,0x9d,0x8b,0x50, +0x1c,0xa, 0x22,0x7e,0x73,0x2a,0x6e,0xa, 0x7, 0x2d,0x2, 0x3e,0x4, 0x49,0x20,0x4, +0xfc,0x6d,0x0, 0x9e,0x7, 0x2a,0x4f,0xbd,0x20,0x58,0x2, 0xb, 0x60,0xb, 0x20,0x7e, +0x73,0x2a,0x6d,0xbc,0x72,0x38,0xd1,0xbe,0x60,0x0, 0x28,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xb, 0x30,0x7e,0x73,0x26,0xf2,0xbc,0x73,0x38,0xaa,0x74,0x1, 0x22,0xca,0x3b, +0x12,0xa6,0x4e,0x38,0x2, 0x81,0x55,0x7e,0xc3,0x2f,0xad,0x4c,0xcc,0x78,0x3d,0x7a, +0xb3,0x2f,0xad,0xe4,0x7a,0xb3,0x2f,0xaf,0x6c,0xaa,0x80,0x26,0x12,0x8c,0x60,0x7e, +0x70,0x2, 0xac,0x7a,0x9, 0xd3,0x26,0xfa,0x9, 0xe3,0x26,0xfb,0x7a,0x49,0xd0,0x19, +0xe4,0x0, 0x1, 0x74,0x1, 0x19,0xb4,0x0, 0x8, 0x12,0x8c,0x6a,0x59,0x34,0x0, 0x2, +0xb, 0xa0,0x7e,0xb3,0x28,0x84,0xbc,0xba,0x38,0xd2,0x80,0x7f,0x7c,0xfc,0x6c,0xaa, +0x80,0x35,0x12,0x8c,0x60,0x7e,0x49,0xd0,0x9, 0xe4,0x0, 0x1, 0x9, 0xb4,0x0, 0x8, +0x70,0x4, 0x1b,0xf0,0x80,0x1f,0x12,0x8c,0x6a,0x7d,0x23,0x49,0x34,0x0, 0x2, 0x9d, +0x32,0x12,0x21,0x0, 0x7d,0xf3,0xbe,0xf4,0x0, 0x23,0x8, 0x9, 0x74,0x5, 0x19,0xb4, +0x0, 0x8, 0x75,0x4c,0x1, 0xb, 0xa0,0xbc,0xfa,0x38,0xc7,0x4c,0xff,0x78,0x2, 0x80, +0x26,0x7e,0x73,0x2f,0xaf,0xbe,0x70,0x4, 0x40,0x22,0x6c,0xaa,0x80,0xe, 0x12,0x8c, +0x60,0x9, 0xb4,0x0, 0x8, 0xbe,0xb0,0x5, 0x68,0x6, 0xb, 0xa0,0xbc,0xfa,0x38,0xee, +0xbc,0xfa,0x78,0x3, 0x75,0x4c,0x0, 0x12,0x8c,0x71,0x80,0xf, 0x7c,0xb7,0x4, 0x7a, +0xb3,0x2f,0xaf,0x80,0x6, 0x12,0x8c,0x71,0x75,0x4c,0x0, 0xe5,0x4c,0xda,0x3b,0x22, +0x7e,0x90,0x9, 0xac,0x9a,0x2e,0x44,0x2f,0xb0,0x22,0x7c,0xbd,0x7c,0x7e,0x2, 0x2c, +0x40,0xe4,0x7a,0xb3,0x2f,0xae,0x7a,0xb3,0x2f,0xad,0x7a,0xb3,0x2f,0xaf,0x22,0x74, +0x1, 0x7a,0xb3,0x28,0xac,0xe4,0x22,0x7e,0x34,0x61,0x55,0x7e,0x24,0x0, 0xff,0x22, +0x12,0x8c,0xcd,0x6d,0x33,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x5, 0x12,0x8d,0x5e, +0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xf6,0xe4,0x7a,0xb3,0x36,0x72,0x22,0x12,0xb0,0xbe, +0x60,0x1a,0x74,0x1, 0x7a,0xb3,0x28,0xad,0x7e,0x37,0x28,0xa1,0x3e,0x34,0x7a,0x37, +0x28,0xa1,0x7e,0x37,0x28,0xa3,0x3e,0x34,0x7a,0x37,0x28,0xa3,0x22,0x7e,0x37,0x38, +0xd2,0x12,0x25,0x3c,0x7a,0x37,0x36,0xdd,0x6c,0xaa,0x80,0x23,0x12,0x8d,0x8, 0x28, +0x26,0xa, 0x4a,0x9, 0x64,0x36,0x76,0xbc,0x6b,0x50,0x12,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x42,0x38,0xcc,0x7e,0x70,0xc, 0xac,0x67,0x59,0x43,0x36,0x80,0xb, 0xa0,0x7e, +0xb3,0x36,0x73,0xbc,0xba,0x38,0xd5,0x22,0x90,0x61,0xc5,0xe4,0x93,0xbc,0xba,0x22, +0x6c,0xaa,0x80,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x12,0xae,0xc5,0xbe,0x34,0x3, 0xe8, +0x8, 0x5, 0x12,0x8d,0x5e,0x80,0x2f,0x7e,0x50,0xc, 0xac,0x5a,0x49,0x32,0x36,0x84, +0x49,0x12,0x36,0x80,0xbd,0x13,0x28,0xf, 0x7d,0x2, 0x2e,0x4, 0x36,0x84,0x7d,0x13, +0xb, 0x15,0x1b,0x8, 0x10,0x80,0xf, 0xbe,0x34,0x0, 0x2, 0x28,0x9, 0x2e,0x24,0x36, +0x84,0x1b,0x35,0x1b,0x28,0x30,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xb7,0x22,0x7e,0x50, +0xc, 0xac,0x5a,0x49,0x32,0x36,0x80,0x59,0x32,0x36,0x84,0x22,0x7e,0xb3,0x36,0x66, +0x60,0x6, 0x14,0x7a,0xb3,0x36,0x66,0x22,0x12,0x8c,0xcd,0x90,0x61,0xc5,0xe4,0x93, +0xbe,0xb0,0x4, 0x28,0x3, 0x12,0x8d,0xef,0x7e,0xb3,0x36,0xec,0x70,0xe, 0x7e,0xb3, +0x39,0x12,0xb4,0x1, 0x7, 0xe4,0x12,0x8d,0xb3,0x12,0xc0,0x95,0x12,0x67,0x1f,0x12, +0x8e,0xa2,0x7e,0xa3,0x36,0xec,0x7a,0xa3,0x39,0x12,0xbe,0xb0,0xff,0x68,0x3, 0x2, +0x8d,0xb3,0x22,0xca,0xf8,0x7c,0xfb,0x74,0x5, 0xac,0xbf,0x12,0xc0,0xc3,0x12,0xc0, +0x39,0x12,0x6f,0xff,0x12,0xc0,0x30,0x7a,0xf3,0x0, 0x4f,0x7c,0xbf,0x12,0xb3,0x54, +0x12,0x6e,0x29,0x74,0x5, 0xac,0xbf,0x9, 0xb5,0x26,0x37,0x12,0xaf,0x4, 0x12,0x8d, +0xef,0x12,0x23,0x4, 0xe4,0x7a,0xb3,0x16,0x91,0xda,0xf8,0x22,0x12,0x8f,0xd2,0x7e, +0xb3,0x2b,0xf, 0xca,0x3b,0x7c,0xeb,0x6c,0xff,0x7e,0x34,0x60,0xd6,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xc0,0x7e,0x73,0x37,0xcd,0xa, 0xb7,0x7e,0xb3,0x2b,0x10,0xf5,0x36, +0x12,0x8f,0xca,0xbe,0xd0,0x4, 0x38,0x5, 0xe4,0x7a,0xb3,0x36,0x72,0xa, 0x3e,0xad, +0x3b,0x7d,0xa3,0x2d,0xac,0x75,0x35,0x0, 0x7e,0xa3,0x36,0x72,0xbc,0xad,0x40,0x2, +0x80,0x19,0xbe,0xa0,0x0, 0x28,0x19,0x74,0x5, 0xa4,0x9, 0x75,0x26,0x33,0xbc,0x7e, +0x78,0xe, 0x7c,0xbd,0x14,0xbe,0xb3,0x36,0x72,0x78,0x5, 0xe4,0x7a,0xb3,0x36,0x72, +0x7e,0xc3,0x36,0x72,0x80,0x41,0x7e,0xb3,0x36,0x72,0x4, 0x7a,0xb3,0x36,0x72,0x7e, +0x90,0x5, 0xac,0x9c,0x9, 0xa4,0x26,0x33,0xbc,0xae,0x68,0x29,0xe5,0x35,0xa, 0xdb, +0x19,0xcd,0x36,0x76,0xa, 0x9a,0xad,0x9b,0x2d,0x9c,0x7e,0xa1,0x35,0x7c,0xba,0x4, +0xf5,0x35,0x7c,0xba,0x7d,0x39,0x7d,0x2a,0x7e,0x31,0x36,0x12,0x10,0x0, 0xb, 0xf0, +0xbe,0xf0,0x3, 0x50,0x6, 0xb, 0xc0,0xbc,0xdc,0x38,0xbb,0x7a,0xf3,0x36,0x73,0xda, +0x3b,0x22,0xca,0xd8,0xca,0x79,0x7e,0xe0,0xff,0x12,0xaf,0x5a,0x7e,0xb3,0x36,0x6b, +0xb4,0x1, 0x8, 0x12,0x88,0x22,0xe4,0x7a,0xb3,0x36,0x6b,0x7e,0xb3,0x36,0x6a,0x60, +0x4, 0x74,0xff,0xe1,0xc5,0x7e,0xb3,0x36,0x69,0xb4,0x2, 0x2, 0x80,0x2, 0xe1,0xb9, +0x12,0xc1,0x12,0x38,0xc, 0x12,0x8f,0xf3,0x38,0x7, 0x12,0x8f,0xeb,0x38,0x2, 0xe1, +0xb9,0x12,0x8f,0xca,0xa, 0x3d,0x1b,0x34,0xbe,0x34,0x0, 0x3, 0x48,0x4, 0x74,0x3, +0x80,0x3, 0x7c,0xbd,0x14,0x12,0xae,0x34,0x7c,0xfb,0x7e,0xb3,0x36,0x68,0x4, 0x7a, +0xb3,0x36,0x68,0x90,0x61,0xc5,0xe4,0x93,0x14,0x12,0xae,0x34,0x7c,0xab,0xbe,0xa0, +0xff,0x68,0x2c,0xbe,0xf0,0xff,0x68,0x25,0x7e,0x30,0xc, 0xac,0x3f,0x49,0x21,0x36, +0x7e,0x7e,0xf4,0x61,0xcc,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x30,0xbd,0x23,0x28,0xf, +0x12,0xae,0xbb,0x3e,0x34,0xbd,0x23,0x28,0x6, 0x7c,0xfa,0x80,0x2, 0x7c,0xfa,0xbe, +0xf0,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x36,0x68,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36, +0x75,0x74,0xff,0x80,0x70,0x90,0x61,0xd4,0xe4,0x93,0xbe,0xb3,0x36,0x68,0x50,0x59, +0x74,0xc, 0xac,0xbf,0x49,0x25,0x36,0x7e,0x7e,0x14,0x61,0xcc,0x12,0x64,0xd3,0xbd, +0x23,0x50,0x3d,0x7e,0x34,0x61,0xd0,0x12,0x23,0x9e,0xbe,0x37,0x36,0x64,0x40,0xd, +0x7e,0x34,0x61,0xd2,0x12,0x23,0x9e,0xbe,0x37,0x36,0x6f,0x50,0x23,0x74,0x5, 0xac, +0xbf,0x9, 0x75,0x26,0x33,0xbe,0x73,0x2b,0xf, 0x68,0x15,0x7c,0xef,0xbe,0xe0,0x4, +0x50,0x8, 0x12,0x87,0x52,0xbe,0xb0,0x4, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x36,0x6b, +0xe4,0x7a,0xb3,0x36,0x75,0x7a,0xb3,0x36,0x69,0xbe,0xe0,0xff,0x68,0x5, 0xe4,0x7a, +0xb3,0x36,0x68,0x7c,0xbe,0xda,0x79,0xda,0xd8,0x22,0x90,0x61,0xc5,0xe4,0x93,0x7c, +0xdb,0x22,0x12,0xae,0xd2,0x74,0x1, 0x7a,0xb3,0x36,0x66,0x22,0x7e,0x24,0x0, 0x2, +0x2, 0x1e,0xb9,0x7e,0x73,0x28,0x84,0xbe,0x70,0x0, 0x22,0x7e,0x73,0x26,0xf5,0xbe, +0x70,0x0, 0x22,0x7e,0x73,0x26,0xf4,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xf3,0x2a, +0x70,0x7a,0x37,0x1f,0x3a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3c,0xe4,0x7a,0xb3, +0x1f,0x34,0x7a,0xb3,0x1f,0x35,0x7e,0x73,0x2a,0x6f,0x7a,0x73,0x1f,0x36,0x7a,0xf3, +0x1f,0x37,0x7a,0xb3,0x1f,0x38,0x7a,0xb3,0x1f,0x39,0x7e,0x8, 0x1f,0x34,0x12,0x90, +0x50,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x15,0xa0,0x2f,0x10,0x7e,0x33,0x1f, +0x36,0x6d,0x0, 0x12,0x1f,0x7, 0xa, 0x1f,0x6d,0x0, 0x12,0x1f,0x7, 0xda,0xf8,0x22, +0x12,0xc, 0x29,0x7e,0x37,0x15,0x9e,0x22,0x7a,0x37,0x1f,0x38,0x7e,0x34,0x15,0xa8, +0x7a,0x37,0x1f,0x3c,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x3a,0x7e,0x73,0x2a,0x6f, +0x7a,0x73,0x1f,0x35,0x7e,0x73,0x2a,0x70,0x7a,0x73,0x1f,0x34,0x7e,0x37,0x2a,0x5c, +0x7a,0x37,0x1f,0x3e,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x40,0x7e,0x37,0x2a,0x60, +0x7a,0x37,0x1f,0x42,0x74,0x1, 0x7a,0xb3,0x1f,0x36,0x7a,0xb3,0x1f,0x37,0x7e,0x8, +0x1f,0x34,0x7e,0x18,0x1f,0x44,0x12,0x8, 0x0, 0x7e,0x37,0x1f,0x4e,0x7e,0x27,0x1f, +0x4a,0xbd,0x23,0x28,0x2, 0x7d,0x32,0x22,0x74,0xc8,0x7a,0xb3,0x39,0x6, 0xc2,0x17, +0x80,0xa, 0x12,0x45,0xd6,0x30,0x17,0x4, 0x75,0xe9,0xff,0x22,0x12,0x47,0xff,0x68, +0xf1,0x22,0x74,0x1, 0x12,0x90,0xf1,0x20,0x17,0x6, 0x12,0x46,0x4e,0x12,0x90,0xfa, +0x7e,0xb3,0x34,0x3a,0xb4,0x1, 0x6, 0x12,0x90,0xb8,0x12,0x90,0xfa,0xe4,0x2, 0x90, +0xf1,0xbe,0xb0,0x8, 0x50,0x3, 0x12,0x90,0xff,0x22,0xd2,0x4, 0x2, 0x45,0x5a,0xa, +0x5b,0x2e,0x54,0x0, 0x8, 0xf5,0xcc,0x22,0x12,0x47,0xff,0x68,0xfb,0x20,0x93,0xfd, +0x22,0x7e,0x34,0x61,0x59,0x2, 0x23,0x9e,0x7e,0xb3,0x37,0x6, 0x70,0x2e,0x7e,0x73, +0x36,0xe9,0xbe,0x70,0x10,0x40,0x2, 0x6c,0x77,0x7e,0xb3,0x37,0x31,0xb4,0x1, 0x3, +0x7e,0x70,0x6, 0xa, 0x37,0x2e,0x34,0xf, 0xf0,0x12,0x91,0x6d,0x7c,0xab,0xe5,0x4e, +0xa, 0x3b,0x2e,0x37,0x38,0x83,0x7a,0x37,0x38,0x83,0x80,0xc, 0x7e,0xa3,0x36,0xea, +0xbe,0xa0,0x7f,0x28,0x3, 0x7e,0xa0,0x7f,0x7c,0xba,0x2, 0x91,0x5d,0x75,0x4e,0x0, +0x7a,0xb3,0x39,0x6, 0xc2,0x17,0x22,0x2d,0x32,0x2e,0x34,0x20,0xf0,0x7a,0x71,0x82, +0x7a,0x61,0x83,0xe4,0x93,0x22,0x7e,0xb3,0x38,0x86,0x70,0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x38,0x86,0x22,0x7f,0x20,0xc2,0x4, 0x7e,0x2b,0x60,0x29,0x72,0x0, +0x2, 0x9c,0x76,0x1a,0x37,0x12,0x21,0x0, 0x7c,0x27,0x29,0x72,0x0, 0x1, 0x29,0x32, +0x0, 0x3, 0x9c,0x37,0x1a,0x33,0x12,0x21,0x0, 0x7c,0x37,0x1a,0x23,0x1a,0x32,0x9d, +0x32,0x12,0x21,0x0, 0x7c,0x67,0x7c,0x72,0xbc,0x32,0x58,0x2, 0x7c,0x73,0xbe,0x60, +0x5, 0x18,0x5, 0xbe,0x70,0x6, 0x58,0x8, 0x7e,0x37,0x37,0xf3,0x4d,0x33,0x68,0x2, +0xd2,0x4, 0xa2,0x4, 0x22,0x7c,0xbd,0x7c,0x7e,0x7f,0x4, 0xca,0x3b,0x7f,0x70,0x7c, +0xe7,0x7c,0xdb,0x7e,0xc0,0x4, 0x7e,0xb3,0x2a,0x6d,0xf5,0x28,0x7e,0xb3,0x2a,0x6e, +0xf5,0x27,0x7e,0x34,0x62,0xa, 0x12,0x87,0xbc,0x6c,0xff,0x12,0x2f,0xff,0x7f,0x51, +0xe5,0x28,0xa, 0x3b,0x1b,0x34,0xa, 0xcd,0xbd,0xc3,0x58,0x14,0xe5,0x27,0xa, 0x3b, +0x1b,0x34,0xa, 0xce,0xbd,0xc3,0x58,0x8, 0x4c,0xee,0x68,0x4, 0x4c,0xdd,0x78,0x3, +0x4e,0xf0,0x10,0xb, 0x5a,0x30,0x7e,0x14,0x62,0xa, 0x12,0x87,0xee,0x8, 0xc, 0x7e, +0x27,0x28,0x8a,0xbe,0x24,0x3, 0x20,0x8, 0x2, 0x61,0x2a,0xb, 0xa, 0xc0,0x1e,0xc4, +0xbd,0x3c,0x8, 0xc, 0x7e,0xc7,0x28,0x8a,0xbe,0xc4,0x3, 0x20,0x58,0x2, 0x61,0x2a, +0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe,0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0, +0x1b,0x80,0x1a,0x2c,0x1a,0x3d,0x9d,0x32,0x1a,0xc8,0xbd,0xc3,0x18,0xd8,0xbc,0xca, +0x18,0x5, 0x4e,0xf0,0x1, 0x61,0x2a,0x6c,0xaa,0x7c,0x8d,0x80,0x1c,0x7c,0x9e,0xbe, +0x80,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6d,0xbc,0xb8,0x8, 0x9, 0x12,0x93,0x61,0x58, +0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x80,0x1a,0x2c,0x1a,0x3d,0x2d,0x32,0x1a, +0xc8,0xbd,0xc3,0x48,0xd8,0xbc,0xca,0x18,0x5, 0x4e,0xf0,0x2, 0x80,0x6c,0x6c,0xaa, +0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, 0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc, +0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, 0xa0,0x80,0x2, 0xb, 0xa0,0x1b,0x90, +0x1a,0x2c,0x1a,0x3e,0x9d,0x32,0x1a,0xc9,0xbd,0xc3,0x18,0xd8,0xbc,0xca,0x18,0x5, +0x4e,0xf0,0x4, 0x80,0x35,0x6c,0xaa,0x7c,0x9e,0x80,0x1c,0x7c,0x8d,0xbe,0x90,0x0, +0x48,0x11,0x7e,0xb3,0x2a,0x6e,0xbc,0xb9,0x8, 0x9, 0x12,0x93,0x61,0x58,0x14,0xb, +0xa0,0x80,0x2, 0xb, 0xa0,0xb, 0x90,0x1a,0x2c,0x1a,0x3e,0x2d,0x32,0x1a,0xc9,0xbd, +0xc3,0x48,0xd8,0xbc,0xca,0x18,0x3, 0x4e,0xf0,0x8, 0x4c,0xff,0x68,0x2e,0x7e,0x7b, +0xb0,0xbc,0xbd,0x40,0x3, 0x7a,0x7b,0xd0,0x29,0xb7,0x0, 0x2, 0xbc,0xbd,0x38,0x4, +0x39,0xd7,0x0, 0x2, 0x29,0xb7,0x0, 0x1, 0xbc,0xbe,0x40,0x4, 0x39,0xe7,0x0, 0x1, +0x29,0xb7,0x0, 0x3, 0xbc,0xbe,0x38,0x4, 0x39,0xe7,0x0, 0x3, 0x7c,0xbf,0xda,0x3b, +0x22,0x7c,0xb8,0x7c,0x79,0x12,0x2c,0x40,0xbd,0x3d,0x22,0x7f,0x60,0x7e,0x6b,0xa0, +0xbe,0xa0,0xa, 0x50,0x1b,0x7e,0x14,0x0, 0x6, 0xca,0x19,0x74,0x6, 0xa4,0x7f,0x6, +0x2d,0x15,0xb, 0x14,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x6b,0xb0,0x4, 0x7a,0x6b,0xb0, +0x22,0x6c,0xaa,0x7e,0x63,0x2a,0x6e,0x7e,0x73,0x2a,0x6d,0xac,0x76,0x7d,0x13,0x1e, +0x14,0x7e,0x27,0x28,0x88,0x2e,0x27,0x28,0x86,0xbd,0x21,0x38,0xa, 0x1e,0x34,0x1e, +0x34,0xbe,0x37,0x28,0x86,0x50,0x29,0x90,0x60,0x51,0xe4,0x93,0x1e,0xb0,0xa, 0x2b, +0x7e,0xb3,0x26,0xf7,0xa, 0x3b,0xbd,0x32,0x8, 0x16,0x90,0x60,0x50,0xe4,0x93,0x1e, +0xb0,0xa, 0x2b,0x7e,0xb3,0x26,0xf6,0xa, 0x3b,0xbd,0x32,0x8, 0x3, 0x7e,0xa0,0x1, +0x7c,0xba,0x22,0xca,0x3b,0x6d,0x11,0x7e,0xe3,0x2a,0x2, 0x4c,0xee,0x78,0x23,0x6c, +0xff,0x80,0x1a,0x74,0x2, 0xac,0xbf,0x12,0x95,0x90,0x7e,0x70,0x9, 0xac,0x7f,0x19, +0xa3,0x34,0xca,0x74,0x2, 0xa, 0x3f,0x19,0xb3,0x35,0x34,0xb, 0xf0,0x12,0x5e,0x2d, +0x38,0xe1,0x12,0x97,0xc0,0x7e,0x24,0x0, 0x14,0xad,0x32,0x7d,0x43,0x2e,0x44,0x3, +0x20,0x6c,0xff,0xa1,0x69,0x74,0x9, 0xac,0xbf,0x9, 0xd5,0x28,0xb2,0x5e,0xd0,0xf, +0x12,0x95,0xa1,0x38,0x2, 0xa1,0x67,0xa, 0x1d,0x9, 0xb1,0x29,0xbc,0xbe,0xb0,0x1, +0x78,0x2, 0xa1,0x4d,0x75,0x24,0x0, 0xa1,0x3f,0x7e,0xa1,0x24,0x74,0x9, 0xa4,0x9, +0xc5,0x34,0xca,0xbc,0xcd,0x68,0x2, 0xa1,0x3d,0x49,0x25,0x34,0xc8,0x74,0x9, 0xac, +0xbf,0x49,0x35,0x28,0xb0,0x9d,0x32,0x12,0x21,0x0, 0x7d,0x3, 0x7e,0xa1,0x24,0x74, +0x9, 0xa4,0x49,0x25,0x34,0xc6,0x74,0x9, 0xac,0xbf,0x12,0x96,0x1b,0x2d,0x3, 0xa, +0x1c,0x9, 0xa1,0x35,0x34,0xbe,0xa0,0x0, 0x28,0x17,0x7e,0x30,0x2, 0xac,0x3c,0x59, +0x1, 0x35,0x20,0xa, 0x1c,0x2e,0x14,0x35,0x34,0x7c,0xba,0x14,0x7a,0x19,0xb0,0xa1, +0x67,0x74,0x2, 0xac,0xbc,0x49,0x15,0x35,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0x7d, +0x31,0x2d,0x34,0xbd,0x30,0x40,0x20,0xbe,0x14,0x0, 0x32,0x28,0x8, 0xbe,0x4, 0x0, +0x32,0x28,0x2, 0x80,0x72,0x7d,0x31,0x2e,0x34,0x0, 0x32,0xbd,0x30,0x50,0x8, 0xbe, +0x14,0x0, 0x32,0x28,0x2, 0x80,0x60,0xbe,0x4, 0x0, 0xa0,0x28,0x56,0xa, 0x1d,0x9, +0xb1,0x29,0xbc,0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0xa, 0x1d,0x19,0xb1,0x29, +0xbc,0x74,0x3, 0xa, 0x1c,0x19,0xb1,0x29,0xc6,0xbe,0xe0,0x0, 0x28,0x69,0x1b,0xe0, +0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x28,0xae,0x7e,0x14,0x1f,0x34,0x74,0x9, 0x12, +0x1f,0x8c,0x7e,0x70,0x9, 0xac,0x7e,0x12,0x97,0xae,0xac,0x3f,0x12,0x95,0x98,0x7e, +0x34,0x1f,0x34,0x7e,0x30,0x9, 0xac,0x3e,0x12,0x95,0x98,0x1b,0xf0,0x74,0x2, 0xac, +0xbc,0x80,0x4, 0x74,0x2, 0xac,0xbc,0x59,0x5, 0x35,0x20,0x80,0x2a,0x5, 0x24,0x90, +0x60,0x99,0xe4,0x93,0xbe,0xb1,0x24,0x28,0x2, 0x81,0x49,0x80,0x1a,0x6d,0x11,0x74, +0x2, 0xac,0xbd,0x12,0x95,0x90,0x7e,0x30,0x9, 0xac,0x3d,0x19,0xa1,0x34,0xca,0x74, +0x2, 0xa, 0x1d,0x19,0xb1,0x35,0x34,0xb, 0xf0,0xbc,0xef,0x28,0x2, 0x81,0x25,0xe4, +0x7a,0xb3,0x16,0x92,0x90,0x60,0x99,0x12,0x5f,0xc6,0xca,0x59,0x7e,0x18,0x28,0xae, +0x7e,0x8, 0x34,0xc6,0x12,0x20,0xb9,0x1b,0xfd,0x7a,0xe3,0x2a,0x2, 0xda,0x3b,0x22, +0x59,0x15,0x35,0x20,0x7e,0xa0,0xff,0x22,0x2e,0x14,0x28,0xae,0x74,0x9, 0x2, 0x1f, +0x8c,0x90,0x60,0x99,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x80, +0x63,0x6c,0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x29,0x66,0x74,0x9, 0xac, +0xbe,0x9, 0x75,0x28,0xb2,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x95,0xa1,0x38,0xe5, +0x12,0x95,0xa1,0x28,0x43,0x74,0x9, 0xac,0xbd,0x9, 0xc5,0x29,0x66,0x12,0x81,0xb3, +0x74,0x9, 0xac,0xbd,0x12,0x87,0xe5,0x12,0x96,0x1b,0x2d,0x31,0x7a,0x35,0x24,0xa, +0x3c,0x9, 0xb3,0x29,0xbc,0xb4,0x1, 0xe, 0x6d,0x33,0x74,0x2, 0xac,0xbc,0x59,0x35, +0x34,0x8b,0x59,0x35,0x34,0xb0,0x7e,0x35,0x24,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12, +0x87,0xb3,0xb, 0xe0,0xbc,0xfe,0x38,0x99,0xda,0x3b,0x22,0x49,0x35,0x28,0xae,0x9d, +0x32,0x2, 0x21,0x0, 0x7e,0xb3,0x37,0x31,0x70,0x3, 0x12,0x93,0xe3,0x2, 0x96,0x30, +0xca,0x79,0x7e,0xf3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7c,0xbf,0x7c,0x7e,0x12,0x96, +0x7c,0x7c,0xbf,0x12,0x97,0x10,0x4c,0xee,0x78,0x14,0x12,0x5f,0xc2,0xca,0x59,0x7e, +0x18,0x28,0xae,0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0x80,0xb, 0x7e,0xb3, +0x2a,0x9, 0x70,0x5, 0x7c,0xbf,0x12,0x95,0xa9,0x7c,0xbf,0x12,0x9f,0x90,0xbe,0xf0, +0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x2a,0xb, 0xda,0x79,0x22,0x7c,0x67,0x7c,0x7b, +0xa5,0xbf,0x0, 0x17,0xbe,0x60,0x0, 0x28,0xf, 0x74,0x1, 0x7a,0xb3,0x2a,0x7, 0xe4, +0x7a,0xb3,0x2a,0x9, 0x7a,0xb3,0x2a,0xa, 0x2, 0x96,0xeb,0xa5,0xbe,0x0, 0x1d,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x29,0x66,0xb, +0xa0,0x12,0x5e,0x25,0x38,0xed,0x74,0x1, 0x7a,0xb3,0x2a,0x6, 0x6c,0xaa,0x80,0x26, +0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xae,0xb, 0x18,0x20,0x12,0x47,0x81,0x1b, +0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x28,0xb0,0xb, 0x18,0x20,0x12,0x47, +0x81,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xd6,0x22,0x12,0x97,0x4, 0x7e,0x8, +0x34,0xb0,0xe4,0x12,0x20,0xde,0x90,0x60,0x99,0x12,0x97,0x8, 0x7e,0x8, 0x34,0x8b, +0xe4,0x2, 0x20,0xde,0x90,0x60,0x99,0xe4,0x93,0x7c,0x7b,0x74,0x2, 0xac,0x7b,0x22, +0xca,0xd8,0xca,0x79,0x7c,0xdb,0x90,0x60,0x99,0xe4,0x93,0x7c,0xfb,0x6c,0x11,0x80, +0x21,0x7e,0x0, 0xff,0x74,0x9, 0xac,0xb1,0x19,0x5, 0x1f,0x38,0x7e,0x34,0x7f,0xff, +0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x34,0x74,0x9, 0xac,0xb1,0x59,0x35,0x1f,0x36, +0xb, 0x10,0xbc,0xf1,0x38,0xdb,0xe4,0x6c,0x77,0x7c,0x6d,0x12,0x97,0xb6,0x7c,0x7d, +0x7c,0x6f,0x12,0x97,0xb6,0x6c,0x0, 0x80,0x39,0x6c,0xee,0x80,0x16,0x74,0x9, 0xac, +0xbe,0x9, 0x65,0x1f,0x38,0x74,0x9, 0xac,0xb0,0x9, 0x75,0x28,0xb2,0xbc,0x76,0x68, +0x6, 0xb, 0xe0,0xbc,0x1e,0x38,0xe6,0xbc,0x1e,0x78,0x15,0x7e,0x70,0x9, 0xac,0x70, +0x12,0x97,0xae,0xac,0x31,0x2e,0x14,0x1f,0x34,0x74,0x9, 0x12,0x1f,0x8c,0xb, 0x10, +0xb, 0x0, 0xbc,0xf0,0x38,0xc3,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x1f,0x34, +0x7e,0x8, 0x29,0x62,0x12,0x20,0xb9,0x1b,0xfd,0xda,0x79,0xda,0xd8,0x22,0x2e,0x34, +0x28,0xae,0x7e,0x30,0x9, 0x22,0x7e,0x8, 0x1f,0x34,0x12,0x9e,0x37,0x7c,0x1b,0x22, +0x7e,0x73,0x2a,0x3, 0xbe,0x73,0x2a,0x2, 0x78,0x17,0x7e,0x73,0x2a,0x2, 0xbe,0x70, +0x1, 0x40,0xe, 0x7e,0x37,0x34,0x9f,0xbe,0x34,0x0, 0x14,0x38,0xe, 0xb, 0x34,0x80, +0x6, 0x7e,0x37,0x34,0x9f,0x1e,0x34,0x7a,0x37,0x34,0x9f,0x7e,0xb3,0x2a,0x2, 0x70, +0x6, 0x6d,0x33,0x7a,0x37,0x34,0x9f,0x7e,0x37,0x34,0x9f,0x22,0xca,0xf8,0x7c,0xfb, +0x6d,0xdd,0x7c,0xbf,0x12,0x98,0xea,0x7d,0xe3,0x7c,0xbf,0x12,0x37,0x6f,0x7d,0xf3, +0x74,0x2, 0xac,0xbf,0x9, 0x95,0x26,0xfb,0x7c,0xbf,0x12,0x9a,0xed,0x40,0x2, 0x1, +0xd4,0x74,0x2, 0xac,0xbf,0x9, 0xa5,0x26,0xfa,0xbe,0xa0,0x0, 0x28,0x9, 0xa, 0x3a, +0x1b,0x34,0x12,0x98,0xd8,0x7d,0xd3,0x12,0x98,0xdf,0xbd,0xc3,0x58,0xb, 0xa, 0xca, +0xb, 0xc4,0x7d,0x3c,0x12,0x98,0xd8,0x2d,0xd3,0x12,0x9b,0xf, 0x7d,0xd3,0xbe,0xa0, +0x0, 0x28,0x56,0x12,0x98,0xdf,0xbd,0xc3,0x58,0x4f,0xbe,0x90,0x0, 0x28,0x4a,0xbe, +0x90,0x0, 0x28,0x45,0xbe,0xf4,0x0, 0xc8,0x8, 0x3f,0x7d,0x3d,0x3e,0x34,0x3e,0x34, +0xbd,0x3f,0x8, 0x35,0x7e,0x70,0x2, 0xac,0x79,0x49,0x33,0x4, 0xfc,0xbe,0x34,0x1, +0x2c,0x8, 0x26,0xa, 0x2a,0x7e,0xb3,0x2a,0x74,0x12,0x9b,0x18,0xbe,0x34,0x1, 0x90, +0x8, 0x17,0xbe,0xf4,0x1, 0x5e,0x58,0xd, 0x7e,0x34,0x0, 0x3, 0xad,0x3e,0xbd,0x3f, +0x8, 0x3, 0xe4,0x80,0x30,0x74,0x1, 0x80,0x2c,0x90,0x60,0xab,0xe4,0x93,0xbc,0xb9, +0x78,0x22,0x7c,0xba,0x7c,0x79,0x12,0x2c,0x40,0xbe,0x34,0x0, 0x96,0x8, 0x12,0x74, +0x2, 0xac,0xb9,0x49,0x35,0x4, 0xfc,0xbe,0x34,0x0, 0x32,0x8, 0x4, 0x74,0x1, 0x80, +0x4, 0xe4,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7c,0xb7,0x7c,0x79,0x2, 0x2c,0x40,0x7e, +0xb3,0x2a,0x6f,0xa, 0x3b,0x1b,0x34,0xa, 0xca,0x22,0xca,0x79,0x7c,0x8b,0x6c,0xaa, +0x9f,0x77,0x12,0x9a,0x2a,0x1a,0x79,0x1b,0x74,0x80,0x4c,0x1a,0x38,0x1b,0x34,0x7c, +0xe7,0x80,0x38,0xbc,0x9f,0x78,0x4, 0xbc,0x8e,0x68,0x2e,0xbe,0xf0,0x0, 0x48,0x29, +0x7e,0xb3,0x2a,0x6f,0xa, 0x2b,0x1a,0x3f,0xbd,0x32,0x58,0x1d,0xbe,0xe0,0x0, 0x48, +0x18,0x7e,0xb3,0x2a,0x70,0xa, 0x2b,0x1a,0x3e,0xbd,0x32,0x58,0xc, 0x7c,0xbf,0x7c, +0x7e,0x12,0x2c,0x40,0x12,0x99,0x65,0xb, 0xa0,0xb, 0xe0,0x1a,0x28,0xb, 0x24,0x1a, +0x3e,0xbd,0x32,0x8, 0xbe,0xb, 0xf0,0x1a,0x29,0xb, 0x24,0x1a,0x3f,0xbd,0x32,0x8, +0xaa,0x4c,0xaa,0x78,0x4, 0x6d,0x33,0x80,0x9, 0xa, 0x1a,0x6d,0x0, 0x7f,0x17,0x12, +0x1f,0x58,0xda,0x79,0x22,0x1a,0x26,0x1a,0x24,0x2f,0x71,0x22,0xca,0x79,0x7c,0xa7, +0x7c,0x8b,0x7e,0xb3,0x2a,0x6f,0x7a,0xb3,0x1f,0x34,0x7e,0xb3,0x2a,0x70,0x7a,0xb3, +0x1f,0x35,0x12,0x9a,0x2a,0x9f,0x77,0x1a,0x3a,0x1a,0x79,0x9d,0x73,0x41,0x17,0x7a, +0xf1,0x2d,0xbe,0xf0,0x0, 0x58,0xe, 0x1a,0x3f,0x1a,0x29,0x9d,0x23,0x1a,0x39,0x2d, +0x32,0x7c,0xb7,0xf5,0x2d,0x7e,0xb3,0x1f,0x34,0xbc,0xbf,0x18,0xe, 0x1a,0x39,0x1a, +0x2f,0x9d,0x23,0x1a,0x39,0x9d,0x32,0x7c,0xb7,0xf5,0x2d,0x1a,0x2a,0x1a,0x38,0x9d, +0x32,0x7c,0xb7,0xf5,0x2c,0x80,0x40,0x85,0x2c,0x2e,0xe5,0x2c,0xbe,0xb0,0x0, 0x58, +0x10,0xe5,0x2c,0x1a,0x3b,0x1a,0x28,0x9d,0x23,0x1a,0x38,0x2d,0x32,0x7c,0xb7,0xf5, +0x2e,0x7e,0xb3,0x1f,0x35,0xbe,0xb1,0x2c,0x18,0x10,0x1a,0x38,0xe5,0x2c,0x1a,0x2b, +0x9d,0x23,0x1a,0x38,0x9d,0x32,0x7c,0xb7,0xf5,0x2e,0xe5,0x2d,0x7e,0x71,0x2e,0x12, +0x2c,0x40,0x12,0x99,0x65,0x5, 0x2c,0x1a,0x3a,0x1a,0x28,0x2d,0x23,0xe5,0x2c,0x1a, +0x3b,0xbd,0x32,0x8, 0xb2,0xb, 0xf0,0x1a,0x3a,0x1a,0x29,0x2d,0x23,0x1a,0x3f,0xbd, +0x32,0x18,0x2, 0x21,0x8f,0x7f,0x17,0xda,0x79,0x22,0x7e,0x70,0x2, 0xac,0x78,0x9, +0x93,0x26,0xfa,0x9, 0x83,0x26,0xfb,0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x62,0x27, +0x12,0x9a,0xe5,0x12,0x9b,0x23,0x50,0x2, 0x41,0xe0,0x7e,0x34,0x62,0x2b,0x12,0x23, +0x9e,0x7a,0x35,0x2a,0x90,0x62,0x26,0xe4,0x93,0x70,0x2, 0x41,0xe0,0x7e,0xb3,0x28, +0xa8,0xb4,0x1, 0x7, 0x7e,0x34,0x62,0x29,0x12,0x9a,0xe5,0x7e,0x37,0x28,0x8a,0xbe, +0x34,0x4, 0x4c,0x8, 0x6b,0x6c,0xdd,0x80,0x5f,0xc2,0x3, 0x7c,0xbd,0x12,0x37,0x6f, +0x7a,0x35,0x26,0x7c,0xbd,0x7e,0x70,0x1, 0x12,0x99,0x6c,0x7a,0x35,0x24,0x9e,0x35, +0x26,0x7a,0x35,0x24,0x7e,0x35,0x26,0x3e,0x34,0x3e,0x34,0x12,0x8f,0xdc,0x7a,0x35, +0x28,0xbe,0x75,0x28,0x58,0x3, 0x7a,0x75,0x28,0x7e,0x35,0x28,0xbe,0x35,0x24,0x8, +0xa, 0x7e,0x35,0x2a,0xbe,0x35,0x26,0x8, 0x2, 0xd2,0x3, 0x7c,0xbd,0x12,0x9a,0xed, +0x50,0x2, 0xc2,0x3, 0x30,0x3, 0xf, 0x7c,0xbd,0x6c,0x77,0x12,0x51,0x5f,0x7e,0x70, +0x2, 0xac,0x7d,0x12,0x37,0x9f,0xb, 0xd0,0x7e,0x73,0x28,0x84,0xbc,0x7d,0x38,0x99, +0xda,0x79,0xda,0xd8,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x70,0x22,0x7c,0x4b,0x74, +0x2, 0xac,0xb4,0x9, 0x55,0x26,0xfa,0x9, 0x65,0x26,0xfb,0x7e,0x73,0x28,0x8c,0xbc, +0x75,0x78,0xa, 0x7e,0x73,0x28,0x8d,0xbc,0x76,0x78,0x2, 0xd3,0x22,0xc3,0x22,0x7e, +0x24,0x0, 0x2, 0x7d,0x3d,0x2, 0x1e,0xb9,0xa, 0x3b,0x2d,0x32,0x3e,0x34,0x49,0x33, +0x4, 0xfc,0x22,0x6c,0x99,0x6c,0x88,0x80,0xf, 0x7c,0xb8,0x12,0x37,0x6f,0xbe,0x34, +0x1, 0xf4,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0xe9, +0xbe,0x90,0x1, 0x38,0x2, 0xc3,0x22,0xd3,0x22,0xca,0x3b,0x7e,0x77,0x2a,0x5c,0x12, +0x9d,0xa1,0x7d,0x63,0x3e,0x34,0x3e,0x34,0x7e,0xe4,0x0, 0xa, 0x12,0x9b,0xd7,0x7e, +0xb3,0x28,0xa8,0x60,0xf, 0x7e,0x37,0x35,0xe5,0xbd,0x36,0x48,0x7, 0x3e,0x34,0x3e, +0x34,0x12,0x9b,0xd7,0xbe,0x64,0x4, 0x4c,0x8, 0xf, 0x12,0x9b,0x23,0x50,0x6, 0x7e, +0xb3,0x28,0xa8,0x60,0x4, 0x74,0xa, 0x80,0x13,0x7e,0xb3,0x28,0xa8,0x60,0xc, 0x7e, +0xb3,0x35,0xe3,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x80,0x1, 0xe4,0x7a,0xb3,0x35,0xe3, +0x7e,0xe7,0x2a,0x5c,0x7d,0x3e,0x12,0x45,0xe, 0x7e,0x53,0x35,0xe3,0xbe,0x50,0x0, +0x28,0x12,0xbd,0x3f,0x58,0x4, 0x7d,0xf3,0x80,0x6, 0xbd,0xef,0x8, 0x2, 0x7d,0xfe, +0x7a,0xf7,0x2a,0x5c,0x12,0x9b,0xdf,0x28,0x3, 0x12,0x37,0xc2,0x7a,0x67,0x35,0xe5, +0x7a,0x77,0x2a,0x5c,0xda,0x3b,0x22,0x7d,0x2e,0x12,0x1e,0xb9,0x7d,0xf3,0x22,0x7e, +0x73,0x28,0x84,0xbe,0x70,0x1, 0x22,0xca,0x79,0xc2,0x3, 0x7e,0xf0,0x3, 0x7e,0xe3, +0x2a,0x3, 0x12,0x9b,0xdf,0x28,0x72,0x7c,0xbf,0x12,0x2c,0x47,0x4c,0xee,0x68,0xe, +0x7e,0x63,0x33,0xc0,0xa5,0xbe,0x0, 0xa, 0x7e,0xb3,0x33,0xc1,0x70,0x4, 0xd2,0x3, +0x80,0x2e,0xbe,0xe0,0x1, 0x28,0xb, 0xe5,0x4d,0xbe,0xb0,0x8, 0x28,0x4, 0xd2,0x3, +0x80,0x1e,0xd2,0x3, 0x12,0x9c,0xf6,0x78,0xa, 0xa5,0xbe,0x0, 0x6, 0x6c,0xff,0xc2, +0x3, 0x80,0xd, 0x9e,0x73,0x33,0xc0,0xbc,0x7e,0x78,0x5, 0x7e,0xf0,0x2, 0xc2,0x3, +0x20,0x3, 0x5, 0x7c,0xbf,0x12,0x2c,0x47,0x7e,0xa3,0x33,0xc2,0x7a,0xa3,0x28,0x84, +0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x33,0xc3,0x7e,0x8, 0x26,0xfa,0x12,0x20,0xb9, +0x1b,0xfd,0x12,0x9c,0x6f,0xf5,0x4d,0x80,0x3, 0x75,0x4d,0x64,0xda,0x79,0x22,0x7e, +0x30,0x64,0x7e,0x20,0x64,0x6c,0x11,0x80,0x54,0xa, 0x31,0xb, 0x34,0x7c,0x7, 0x80, +0x42,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfa,0x12,0x9c,0xee,0x9, 0xb3,0x26, +0xfa,0x12,0x2f,0xd6,0x7c,0x97,0x7e,0x70,0x2, 0xac,0x70,0x9, 0xb3,0x26,0xfb,0x12, +0x9c,0xee,0x9, 0xb3,0x26,0xfb,0x12,0x2f,0xd6,0x7c,0x87,0xbe,0x90,0x0, 0x28,0x6, +0xbc,0x39,0x28,0x2, 0x7c,0x39,0xbe,0x80,0x0, 0x28,0x6, 0xbc,0x28,0x28,0x2, 0x7c, +0x28,0xb, 0x0, 0x7e,0xb3,0x28,0x84,0xbc,0xb0,0x38,0xb6,0xb, 0x10,0x7e,0xb3,0x28, +0x84,0xbc,0xb1,0x38,0xa4,0xa5,0xbb,0x64,0x2, 0x6c,0x33,0xa5,0xba,0x64,0x2, 0x6c, +0x22,0xbc,0x23,0x28,0x4, 0x7c,0xa2,0x80,0x2, 0x7c,0xa3,0x7c,0xba,0x22,0xa, 0x2b, +0x7e,0x70,0x2, 0xac,0x71,0x22,0x7e,0x73,0x28,0x84,0xbc,0x7e,0x22,0xca,0x79,0x6c, +0x88,0x80,0x72,0x74,0x2, 0xac,0xb8,0x9, 0xf5,0x26,0xfa,0x9, 0x75,0x26,0xfb,0x7a, +0x71,0x24,0x7c,0xbf,0x12,0x9d,0x8b,0x50,0x5a,0x6c,0xee,0x80,0x51,0xbc,0xe8,0x68, +0x4b,0x7e,0x70,0x2, 0xac,0x7e,0x12,0x9d,0x80,0xf5,0x26,0x6c,0x99,0x90,0x60,0xaa, +0xe4,0x93,0x70,0x18,0x7e,0xb3,0x2a,0x70,0x14,0xbe,0xb1,0x26,0x78,0xe, 0xa, 0x2f, +0xe5,0x25,0xa, 0x3b,0x12,0x35,0x67,0x18,0x3, 0x7e,0x90,0x1, 0xbe,0x90,0x1, 0x78, +0x1b,0x7c,0xbe,0x12,0x37,0x6f,0x7d,0xf3,0x7c,0xb8,0x12,0x37,0x6f,0xbd,0x3f,0x8, +0x4, 0x7c,0xbe,0x80,0x2, 0x7c,0xb8,0x6c,0x77,0x12,0x51,0x5f,0xb, 0xe0,0x12,0x9c, +0xf6,0x38,0xaa,0xb, 0x80,0x7e,0x73,0x28,0x84,0xbc,0x78,0x38,0x86,0xda,0x79,0x22, +0x9, 0xb3,0x26,0xfa,0xf5,0x25,0x9, 0xb3,0x26,0xfb,0x22,0x7c,0xab,0x90,0x60,0xab, +0xe4,0x93,0xbc,0xb7,0x78,0x9, 0x7c,0xba,0x12,0x31,0x5a,0x50,0x2, 0xd3,0x22,0xc3, +0x22,0xca,0x3b,0x6d,0x44,0x7e,0xf3,0x28,0x84,0x6c,0xee,0x80,0x24,0x7c,0xbe,0x12, +0x2f,0xb7,0x60,0x1b,0x74,0x2, 0xac,0xbe,0x9, 0xd5,0x26,0xfa,0x9, 0xc5,0x26,0xfb, +0x7c,0xbd,0x7c,0x7c,0x12,0x2c,0x40,0x7d,0xf3,0xbd,0x4f,0x58,0x2, 0x7d,0x4f,0xb, +0xe0,0xbc,0xfe,0x38,0xd8,0x7d,0x34,0xda,0x3b,0x22,0x7e,0xb3,0x2a,0x2, 0x70,0x2d, +0x7e,0x73,0x2a,0x3, 0xbe,0x70,0x0, 0x28,0x24,0x7e,0xb3,0x34,0xc5,0x70,0x18,0x12, +0x9e,0x17,0x7e,0x73,0x2a,0x3, 0x7a,0x73,0x2a,0x2, 0x74,0x1, 0x7a,0xb3,0x2a,0x9, +0x7e,0xb3,0x34,0xc5,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x34,0xc5,0x22,0xe4,0x7a,0xb3, +0x34,0xc5,0x7a,0xb3,0x2a,0x9, 0x22,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x35, +0xe9,0x7e,0x8, 0x36,0x25,0x12,0x20,0xb9,0x1b,0xfd,0x7e,0x73,0x28,0x94,0x7a,0x73, +0x35,0xe8,0x7a,0x73,0x28,0x93,0x22,0xca,0x3b,0x7c,0x46,0x7c,0xab,0x6c,0x66,0xc1, +0xd2,0x7c,0x57,0xc1,0xca,0x7e,0xf0,0x9, 0xac,0xf6,0x9, 0x87,0x29,0x66,0x7c,0x98, +0x7e,0xd0,0x9, 0xac,0xd5,0x9, 0xb6,0x28,0xb2,0xbc,0xb9,0x78,0x6b,0xbe,0x90,0xff, +0x68,0x66,0x12,0x9e,0xe2,0x39,0x87,0x0, 0x4, 0xa, 0xf9,0x9, 0xbf,0x29,0xbc,0x7e, +0xf0,0x9, 0x70,0xc, 0xac,0xf5,0x7d,0x97,0x2e,0x94,0x28,0xae,0x6d,0x88,0x80,0xa, +0xac,0xf6,0x7d,0x97,0x2e,0x94,0x29,0x62,0x6d,0x88,0xb, 0x4a,0xd0,0x12,0x9e,0xe2, +0x1b,0x7a,0xd0,0x69,0xf4,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x60,0x2d,0xd7, +0x79,0xf6,0x0, 0x2, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb3,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x5, 0x7e,0xf0,0x9, 0xac,0xf5,0x9, 0x87,0x28,0xb4,0x12,0x9e,0xe2, +0x39,0x87,0x0, 0x6, 0xb, 0xa0,0x80,0x8, 0xb, 0x50,0xbc,0x45,0x28,0x2, 0xc1,0x45, +0xb, 0x60,0x90,0x60,0x99,0xe4,0x93,0xbc,0xb6,0x28,0x2, 0xc1,0x41,0x7c,0xba,0xda, +0x3b,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x7f,0x70,0x2d,0xf7,0x22,0x7c,0xab,0x7e,0xb, +0xb0,0x60,0x3, 0xb4,0x2, 0x31,0xa, 0x4a,0x9, 0x74,0x34,0xa3,0xbe,0x73,0x34,0xad, +0x50,0xe, 0x7d,0x24,0x2e,0x24,0x34,0xa3,0x7c,0xb7,0x4, 0x7a,0x29,0xb0,0xd3,0x22, +0xbe,0x73,0x34,0xad,0x40,0x9, 0xbe,0x70,0xff,0x68,0x4, 0xe4,0x7a,0xb, 0xb0,0x74, +0xff,0x19,0xb4,0x34,0xa3,0x80,0x17,0xa, 0x3a,0x9, 0xb3,0x34,0xa3,0xbe,0xb0,0xff, +0x68,0x7, 0xe4,0x19,0xb3,0x34,0xa3,0xd3,0x22,0xe4,0x19,0xb3,0x34,0xa3,0xc3,0x22, +0xca,0xf8,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x2a,0x62,0xbd,0x13,0x38,0x6, 0x7e,0x34, +0x1, 0x0, 0x80,0x15,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x1f,0x5, 0xbe, +0x34,0x0, 0x10,0x50,0x4, 0x7e,0x34,0x0, 0x10,0x74,0x2, 0xac,0xbf,0x49,0x25,0x34, +0xb0,0xbd,0x2f,0x28,0x6, 0x49,0x35,0x34,0x8b,0x80,0x4, 0x59,0x35,0x34,0x8b,0x59, +0xf5,0x34,0xb0,0xbe,0x34,0x1, 0x0, 0x28,0x4, 0x7e,0x34,0x1, 0x0, 0xda,0xf8,0x22, +0x6c,0xaa,0x80,0x49,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x62,0x12,0x25,0x3c, +0x59,0x32,0x28,0xae,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x32,0x29,0x64,0x12,0x25,0x3c, +0x59,0x32,0x28,0xb0,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x66,0x19,0xb4,0x28, +0xb2,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x67,0x19,0xb4,0x28,0xb3,0x7e,0x90, +0x9, 0xac,0x9a,0x9, 0xb4,0x29,0x68,0x19,0xb4,0x28,0xb4,0xb, 0xa0,0x12,0x5e,0x25, +0x38,0xb2,0x22,0x7e,0x8, 0x34,0xa2,0x7e,0x34,0x0, 0xd, 0xe4,0x2, 0x20,0xde,0x6c, +0x0, 0x6c,0x11,0x80,0x13,0x7c,0xb1,0x12,0x2f,0xb7,0x60,0xa, 0x12,0xa0,0x84,0x40, +0x5, 0x7e,0x0, 0x1, 0x80,0xa, 0xb, 0x10,0x7e,0x73,0x28,0x84,0xbc,0x71,0x38,0xe5, +0x7c,0xb0,0x6c,0x77,0x12,0xa0,0x49,0xbe,0x0, 0x1, 0x68,0xb, 0x7c,0xb0,0x7e,0x70, +0x1, 0x12,0xa0,0x49,0xb4,0x1, 0x21,0x6c,0x11,0x80,0x15,0x7c,0xb1,0x12,0x2f,0xb7, +0x60,0xc, 0x12,0xa0,0x84,0x50,0x7, 0x7c,0xb1,0x6c,0x77,0x12,0x51,0x5f,0xb, 0x10, +0x7e,0x3, 0x28,0x84,0xbc,0x1, 0x38,0xe3,0x22,0x7c,0xab,0xa5,0xbf,0x0, 0xc, 0x7e, +0xb3,0x36,0x61,0x7a,0xb3,0x36,0x62,0x7a,0xa3,0x36,0x61,0x7e,0xb3,0x36,0x62,0x60, +0x4, 0x74,0x8, 0x80,0xd, 0x7e,0xb3,0x28,0x84,0x70,0xb, 0x7e,0xb3,0x36,0x63,0x60, +0x5, 0x14,0x7a,0xb3,0x36,0x63,0x7e,0x73,0x36,0x63,0xbe,0x70,0x0, 0x28,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x25,0x26,0xfa,0x9, 0x35,0x26,0xfb, +0x7c,0xb2,0x7c,0x73,0x7c,0xa7,0x7c,0x7b,0x90,0x60,0xaa,0xe4,0x93,0x60,0x2, 0x7c, +0xa7,0x90,0x60,0xab,0xe4,0x93,0xbc,0xba,0x78,0x2, 0xd3,0x22,0xc3,0x22,0xca,0xf8, +0x7e,0xd4,0x0, 0x9, 0x7e,0xb3,0x28,0x84,0x70,0x8, 0xf5,0x1e,0xc2,0x8, 0xc2,0x9, +0x80,0x71,0xbe,0xb0,0x2, 0x38,0x66,0xb4,0x2, 0x28,0x7e,0x73,0x26,0xfc,0xa, 0x27, +0x7e,0x73,0x26,0xfa,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x15,0x7e,0x73,0x26, +0xfd,0xa, 0x27,0x7e,0x73,0x26,0xfb,0x12,0xa1,0x4b,0xbe,0x34,0x0, 0x5, 0x58,0x2, +0x80,0x4e,0x6c,0xff,0x80,0x30,0x7c,0xbf,0x12,0x37,0x81,0x1a,0x4b,0x7c,0xbf,0x12, +0x37,0x6f,0x7d,0x5d,0x3e,0x54,0xbd,0x54,0x58,0x4, 0xd2,0x9, 0x80,0xa, 0x7d,0x5d, +0xe, 0x54,0xbd,0x54,0x48,0x2, 0xc2,0x9, 0x20,0x9, 0x4, 0xbd,0xd4,0x58,0x5, 0x75, +0x1e,0x28,0x80,0xf, 0xb, 0xf0,0x12,0x52,0x66,0x38,0xcb,0x80,0x6, 0xe5,0x1e,0x24, +0xfb,0xf5,0x1e,0xe5,0x1e,0xbe,0xb0,0x0, 0x8, 0x6, 0xd2,0x8, 0x15,0x1e,0x80,0x5, +0x75,0x1e,0x0, 0xc2,0x8, 0xda,0xf8,0x22,0x7e,0x39,0x70,0xa, 0x37,0x9d,0x32,0x2, +0x21,0x0, 0xca,0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0xe4,0x7a,0xb3,0x22,0xf6, +0x7a,0xb3,0x22,0xf7,0x7a,0xb3,0x22,0xf8,0x7e,0x34,0x3, 0xe8,0x7a,0x37,0x22,0xfd, +0x74,0x3c,0x7a,0xb3,0x22,0xf5,0x75,0x2f,0x46,0x75,0x2b,0x0, 0x61,0x43,0x12,0xa4, +0xde,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2b,0x74,0x44,0xac,0x7b, +0x2e,0x34,0x14,0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x22,0xff,0x12,0x20,0xb9,0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x22,0xf9,0x7a,0x35,0x30,0x7a,0x37,0x22,0xfb,0x7a,0x35, +0x32,0x7a,0x35,0x34,0x7e,0x34,0x22,0xff,0x7a,0x35,0x36,0x7e,0x34,0x23,0x1f,0x7a, +0x35,0x38,0x75,0x2c,0x0, 0x80,0x59,0xe5,0x2c,0xa, 0x3b,0x7e,0xd, 0x26,0x12,0xa4, +0xe6,0x2e,0x35,0x36,0x12,0xa1,0x48,0x7d,0xd3,0x7e,0xc7,0x22,0xfb,0xbd,0xcd,0x58, +0x4, 0x7a,0xd7,0x22,0xfb,0xe5,0x2c,0xa, 0x3b,0x7f,0x3, 0x12,0xa4,0xe6,0x2e,0x35, +0x38,0x12,0xa1,0x48,0x7d,0xc3,0x7e,0x35,0x32,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x32, +0x7e,0x37,0x22,0xf9,0x2d,0x3d,0x7a,0x37,0x22,0xf9,0x7d,0x3c,0x2e,0x35,0x30,0x7a, +0x35,0x30,0x2d,0xcd,0x7e,0x35,0x34,0xbd,0x3c,0x58,0x3, 0x7a,0xc5,0x34,0x5, 0x2c, +0xe5,0x2a,0xbe,0xb1,0x2c,0x38,0xa0,0xe5,0x2a,0xb4,0xa, 0x2a,0x7e,0x37,0x22,0xfb, +0xbe,0x34,0x0, 0x40,0x48,0xb, 0x7e,0x25,0x32,0xbe,0x24,0x0, 0x40,0x48,0x2, 0x61, +0x41,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x60, +0x8, 0x2, 0x61,0x41,0x80,0x28,0x7e,0x37,0x22,0xfb,0xbe,0x34,0x0, 0x20,0x8, 0xb, +0x7e,0x25,0x32,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x61,0x41,0xbe,0x34,0x0, 0x30,0x8, +0x2, 0x61,0x41,0x7e,0x35,0x32,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x61,0x41,0x7e,0xa3, +0x38,0x41,0x74,0xc, 0xa4,0xbe,0x57,0x22,0xf9,0x58,0x2, 0x61,0x41,0x7e,0xa3,0x38, +0x42,0x74,0xc, 0xa4,0xbe,0x55,0x30,0x58,0x2, 0x61,0x41,0x7e,0x15,0x36,0x6d,0x0, +0x7e,0x1d,0x26,0xe5,0x2a,0x12,0xa3,0x7e,0x7a,0xb3,0x22,0xf4,0x7e,0x15,0x38,0x6d, +0x0, 0x7f,0x13,0xe5,0x2a,0x12,0xa3,0x7e,0xf5,0x2d,0x7e,0x73,0x22,0xf5,0xbe,0x73, +0x22,0xf4,0x38,0x7d,0xbe,0x71,0x2d,0x38,0x78,0xe5,0x2d,0x7e,0x31,0x2d,0xac,0x3b, +0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x22,0xf4,0xac,0x77,0x1a,0x26,0x1a,0x24,0x2f,0x10, +0xe5,0x2d,0xa, 0x5b,0x6d,0x44,0x7e,0x33,0x22,0xf4,0xa, 0x13,0x6d,0x0, 0x2f,0x2, +0x12,0x1f,0x7, 0x7c,0xb7,0xf5,0x2e,0xe5,0x2f,0xbe,0xb1,0x2e,0x38,0x43,0x7e,0x37, +0x22,0xfb,0x2e,0x35,0x32,0x2e,0x35,0x34,0x7a,0x35,0x3a,0xe5,0x2e,0xa, 0x2b,0x7e, +0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x3a,0x7a,0x35,0x3a,0x7e,0x37,0x22, +0xfd,0xbe,0x35,0x3a,0x8, 0x1b,0x7e,0x35,0x3a,0x7a,0x37,0x22,0xfd,0xe5,0x2e,0x7a, +0xb3,0x22,0xf7,0x7e,0x73,0x23,0x41,0x7a,0x73,0x22,0xf8,0xe5,0x2b,0x7a,0xb3,0x22, +0xf6,0x5, 0x2b,0x12,0xa4,0xde,0x28,0x2, 0x21,0x7e,0x7e,0xa3,0x22,0xf7,0xbe,0xa1, +0x2f,0x40,0x20,0x7e,0xb3,0x22,0xf8,0xbe,0xb0,0x0, 0x28,0x17,0xbe,0xb0,0xff,0x50, +0x12,0x7e,0x73,0x22,0xf6,0xa, 0x37,0xb, 0x34,0x7a,0x73,0x38,0x3e,0x7a,0xb3,0x38, +0x40,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x38,0x3e,0x7c,0xba,0xda,0x3b,0x22,0xca,0x3b, +0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1d,0x3c,0x7a, +0x1d,0x40,0x7a,0x1d,0x44,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x57,0x23,0x43,0x6c,0xee,0x80,0x60,0xa, 0x5e,0x7f,0x14, +0x12,0xa4,0xd6,0x7a,0x55,0x4a,0xa, 0x5e,0x7f,0x16,0x12,0xa4,0xd6,0x7a,0x55,0x48, +0x7e,0x35,0x48,0x12,0xa4,0xcf,0x2f,0x50,0x7e,0x65,0x4a,0x7d,0x16,0x1a,0x2, 0x1a, +0x0, 0x2f,0x70,0x12,0xa4,0xcf,0x12,0xa4,0xc5,0x7e,0x1d,0x3c,0x2f,0x10,0x7a,0x1d, +0x3c,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x4a,0x12,0xa4,0xc5,0x7e,0x1d,0x40, +0x2f,0x10,0x7a,0x1d,0x40,0x7e,0x15,0x4a,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x48,0x12, +0xa4,0xc5,0x7e,0x1d,0x44,0x2f,0x10,0x7a,0x1d,0x44,0xb, 0xe0,0xbc,0xfe,0x38,0x9c, +0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x1f,0x58,0x7f,0x51,0x7f,0x17,0x7f, +0x6, 0x12,0x1f,0x58,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1d,0x3c,0x7d,0x19,0x12, +0x1e,0xfc,0x7e,0x87,0x23,0x43,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x3c,0x7e,0x1d,0x40,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x6, +0x12,0x1f,0x58,0x7a,0x1d,0x40,0x7e,0x1d,0x44,0x7d,0x19,0x12,0x1e,0xfc,0x7d,0x18, +0x1a,0x2, 0x1a,0x0, 0x12,0x1f,0x58,0x7a,0x1d,0x44,0x7f,0x15,0x7f,0x7, 0x12,0x1e, +0xeb,0x7e,0x6d,0x44,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12,0x1e,0xeb,0x7e,0x5d,0x3c, +0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x1e,0xeb,0x7e,0x7d,0x40,0x9f,0x71,0xbe,0x58, +0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18, +0x7f,0x16,0x7d,0x19,0x12,0x1e,0xfc,0x7f,0x5, 0x12,0x1f,0x58,0x7f,0x6, 0x12,0x1e, +0xeb,0x7f,0x7, 0x12,0x1f,0x58,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44, +0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x1e,0xeb,0x7f,0x1, 0x22,0x7d, +0x13,0x1a,0x2, 0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x39,0x1, 0xbe,0x71,0x2b,0x22,0x2d,0x13,0x7e,0xb, 0x50,0xa, 0x25,0x22,0xca,0x79, +0x6c,0xaa,0x12,0xa5,0xe4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf, +0x38,0x43,0x7f,0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x38, +0x63,0xb, 0xa0,0xbe,0xa0,0x20,0x40,0xda,0x7e,0x8, 0x38,0x43,0x7e,0x18,0x38,0x63, +0x74,0x20,0x12,0xa1,0x52,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73, +0x38,0x3f,0xbe,0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22, +0x74,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x7e,0x33,0x38,0x3f,0xa, 0x13,0x6d,0x0, 0x12, +0x1f,0x7, 0x7c,0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64, +0xa, 0x3e,0x1b,0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xa5,0x92,0x7f,0x6, 0x7c, +0xbd,0x7c,0x7c,0x12,0xa5,0x92,0xb, 0xf0,0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x50,0xbc, +0x7f,0x5, 0x7f,0x16,0x12,0xa4,0xee,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x38,0x3e,0xda, +0x3b,0x22,0x7c,0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d, +0x2, 0xb, 0xa, 0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, +0x7c,0x21,0xa5,0xba,0x0, 0x14,0x1a,0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d, +0x44,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0x1a,0x2, +0x1a,0x13,0x2d,0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35, +0x1b,0x1a,0x10,0x22,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0x22,0xe4,0x7a, +0xb3,0x35,0x69,0x7e,0xb3,0x28,0x84,0x60,0x6, 0x7e,0xb3,0x35,0xe2,0x60,0x5, 0xe4, +0x7a,0xb3,0x35,0xe4,0x22,0x7e,0xa0,0x1, 0x7e,0x37,0x2a,0x4f,0x12,0xa6,0x4e,0x28, +0x35,0x6d,0x22,0x9d,0x23,0xbe,0x27,0x7, 0xf8,0x58,0x2b,0x12,0x8f,0xdc,0xbe,0x37, +0x7, 0xfa,0x8, 0x22,0xe4,0x7a,0xb3,0x28,0x84,0x7e,0xb3,0x2a,0x3, 0x70,0x17,0x7e, +0xb3,0x37,0x8, 0xb4,0x1, 0x10,0x6c,0xaa,0x5, 0x1f,0xe5,0x1f,0xbe,0xb0,0x10,0x28, +0x5, 0xd2,0x11,0x75,0x1f,0x0, 0x4c,0xaa,0x68,0x3, 0x75,0x1f,0x0, 0x22,0x7e,0xb3, +0x28,0x84,0xbe,0xb0,0x0, 0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x2a,0x6e, +0xa, 0x37,0x3e,0x34,0xca,0x39,0x7f,0x16,0x7f,0x5, 0x12,0x20,0xb9,0x1b,0xfd,0x6c, +0xdd,0x12,0xa7,0x10,0x7a,0xb3,0x1f,0x6c,0x6c,0xcc,0x80,0x4a,0x12,0xa6,0xff,0x78, +0x43,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0xe0,0x7d,0x3f,0x12,0x21, +0x0, 0x7d,0x13,0x7d,0x3e,0x12,0x21,0x0, 0xbd,0x31,0x58,0x2, 0x7d,0xfe,0xbe,0xe5, +0x2e,0x8, 0x5, 0x7e,0xe5,0x2e,0x80,0xb, 0x6d,0x33,0x9e,0x35,0x2e,0xbd,0x3e,0x8, +0x2, 0x7d,0xe3,0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x2f,0x41,0x7e,0xb3,0x1f,0x6c,0x4, +0x7a,0xb3,0x1f,0x6c,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc,0x7c,0x38,0xae,0x7e,0x73, +0x1f,0x6c,0x4c,0x77,0x68,0x1d,0x12,0xa7,0x2d,0x8, 0x2, 0x7d,0x7f,0x6c,0xcc,0x80, +0xa, 0x12,0xa6,0xff,0x78,0x3, 0x12,0xa7,0x18,0xb, 0xc0,0x7e,0x73,0x2a,0x70,0xbc, +0x7c,0x38,0xee,0xb, 0xd0,0xbe,0xd0,0x2, 0x50,0x2, 0xc1,0x71,0xda,0x3b,0x22,0xa, +0xec,0x9, 0x7e,0x2a,0xdc,0xa, 0x37,0x5e,0x34,0x0, 0x1, 0xa, 0xed,0xbd,0x3e,0x22, +0x7e,0xf4,0x7f,0xff,0x9f,0x44,0xe4,0x22,0x74,0x2, 0xac,0xbc,0x7f,0x16,0x2d,0x35, +0xb, 0x1a,0xe0,0x9d,0xe7,0x7f,0x15,0x2d,0x35,0x1b,0x1a,0xe0,0x22,0xa, 0x17,0x6d, +0x0, 0x7f,0x14,0x12,0x1f,0x58,0x7d,0x73,0x12,0x21,0x0, 0x7d,0xe3,0x7d,0x3f,0x12, +0x21,0x0, 0xbd,0x3e,0x22,0x7e,0x63,0x2a,0x6e,0x90,0x60,0xa7,0xe4,0x93,0x60,0x6c, +0xc2,0x12,0x6c,0x33,0x80,0x56,0x90,0x60,0xaa,0xe4,0x93,0x70,0x13,0x7c,0x96,0xac, +0x93,0x90,0x60,0xab,0xe4,0x93,0xa, 0x5b,0x1b,0x54,0x2d,0x45,0x7d,0xd4,0xb, 0xd4, +0x7d,0x54,0x3e,0x54,0x7e,0x7f,0x13,0x8a,0x2d,0xf5,0xb, 0x7a,0x50,0xbe,0x57,0x2a, +0x5a,0x8, 0x27,0x7c,0xb3,0x12,0x31,0x5a,0x50,0x20,0x7d,0x5d,0x3e,0x54,0x7e,0x7f, +0x13,0x8a,0x7f,0x57,0x2d,0xb5,0xb, 0x5a,0xc0,0x7d,0x54,0x3e,0x54,0x2d,0xf5,0xb, +0x7a,0x50,0xbd,0x5c,0x8, 0x4, 0xd2,0x12,0x80,0xa, 0xb, 0x30,0x7e,0x73,0x2a,0x75, +0xbc,0x73,0x38,0xa2,0x30,0x12,0x5, 0xd2,0x3, 0x2, 0x32,0xe7,0x22,0x90,0x60,0xa7, +0xe4,0x93,0x60,0x8, 0x30,0x12,0x5, 0x12,0x31,0x7d,0xc2,0x12,0x22,0xca,0xd8,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x3, 0x6c,0xdd,0x6d,0xdd,0x7e,0x34,0x22,0xe6,0x7e, +0x24,0x0, 0xff,0x7e,0x14,0x1f,0x34,0x74,0xc, 0x12,0x1f,0xad,0x6d,0x11,0x7e,0x4, +0x7f,0xff,0x6c,0xee,0x80,0x13,0x12,0xa8,0xe1,0x7d,0xc3,0xbd,0xdc,0x50,0x2, 0x7d, +0xdc,0xbd,0xc, 0x28,0x2, 0x7d,0xc, 0xb, 0xe0,0xbc,0xfe,0x38,0xe9,0xbe,0xd4,0x0, +0x1e,0x58,0xa, 0x7e,0xb3,0x28,0x94,0x70,0x4, 0x6d,0x33,0x1, 0xd2,0xbe,0xd4,0x4, +0xb0,0x8, 0x2, 0xd2,0x3, 0x6c,0xee,0x74,0x4, 0xac,0xbe,0x49,0x45,0x1f,0x34,0xbd, +0x4d,0x58,0x6, 0x49,0xd5,0x1f,0x36,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xe7, +0xbe,0xe0,0x3, 0x78,0x4, 0x6d,0x33,0x1, 0xd2,0xbd,0xd, 0x8, 0x5, 0x30,0x3, 0x2, +0x7d,0xd0,0x9f,0x55,0x6c,0xee,0x80,0xb, 0x12,0xa8,0xe1,0x1a,0x26,0x1a,0x24,0x2f, +0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xf1,0xa, 0x1f,0x12,0xa8,0xd7,0x9f,0x55,0x6c,0xee, +0x80,0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x90,0x7d,0x39,0x12, +0x21,0x0, 0x7d,0xc3,0xbd,0x1c,0x28,0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xd0,0xb, 0xe0,0xbc,0xfe,0x38,0xda,0x6d,0x11,0xbe,0xd0,0x0, 0x28,0x5, 0xa, +0x1d,0x12,0xa8,0xd7,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, +0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0x12,0x74,0x2, 0xac,0xbe,0x7f,0x17, +0x2d,0x35,0xb, 0x1a,0x0, 0x9d,0x1, 0x1b,0x1a,0x0, 0xb, 0xe0,0xbc,0xfe,0x38,0xea, +0x7d,0x31,0xda,0x79,0xda,0xd8,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x1f,0x58,0x7d,0x13, +0x22,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x2, 0x21,0x0, 0xca, +0xf8,0x7f,0x71,0x6d,0xdd,0x6c,0xaa,0x7e,0xf0,0x80,0xc2,0x3, 0x6d,0x44,0x80,0x32, +0x12,0xa9,0x90,0x12,0xa8,0xe9,0xbd,0x3d,0x48,0x26,0x12,0xa9,0x90,0xb, 0x1a,0x30, +0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0xd2,0x3, 0x80,0x9, 0x12,0x21,0x0, 0xbd,0x3d,0x68, +0x2, 0xc2,0x3, 0x7d,0x34,0x3e,0x34,0x2d,0x3f,0x7d,0x2e,0x12,0xa8,0xe9,0x7d,0xd3, +0xb, 0x44,0x7e,0xc5,0x35,0xbd,0xc4,0x38,0xc7,0x30,0x3, 0xc, 0x7e,0xf0,0x7f,0x80, +0x7, 0xb, 0xa0,0xbe,0xa0,0x8, 0x50,0x11,0x7c,0xba,0x7d,0x3d,0x60,0x5, 0xe, 0x34, +0x14,0x78,0xfb,0xa, 0xcf,0xbd,0x3c,0x18,0xe8,0x7f,0x10,0x2e,0x35,0x35,0x7a,0x1b, +0xa0,0x6d,0x44,0x80,0x21,0x7d,0x54,0x3e,0x54,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30, +0x7f,0x60,0x2e,0xd5,0x35,0x7e,0x6b,0xb0,0x60,0x5, 0xe, 0x34,0x14,0x78,0xfb,0x7c, +0xb7,0x12,0xa9,0x9b,0xb, 0x44,0x7e,0x55,0x35,0xbd,0x54,0x38,0xd8,0xda,0xf8,0x22, +0x7d,0xc4,0x3e,0xc4,0x7f,0x17,0x2d,0x3c,0x22,0xa, 0x4a,0x7f,0x10,0x2d,0x34,0x7a, +0x1b,0xb0,0x22,0xd2,0xc9,0x75,0xf2,0x30,0x75,0xf3,0x80,0x75,0xf4,0xc, 0x75,0xf5, +0x1, 0x6c,0xaa,0xe5,0xf5,0x54,0x80,0xb4,0x80,0xf9,0xe5,0xf6,0x12,0xa9,0x99,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xed,0xc2,0xc9,0x22,0x90,0x60,0x93,0xe4,0x93,0xa, 0xb, +0x7e,0x73,0x2a,0x71,0xa, 0x17,0x2d,0x10,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0xad,0x13, +0x7d,0x21,0x6c,0x33,0x80,0x20,0xa, 0x3, 0x2d,0x2, 0x3e,0x4, 0x7e,0x7f,0x38,0xd9, +0x2d,0xf0,0xb, 0x7a,0x0, 0x7e,0x90,0x2, 0xac,0x93,0x49,0xf4,0x13,0x8e,0x9d,0xf, +0x59,0x4, 0x25,0xb6,0xb, 0x30,0xbc,0xa3,0x38,0xdc,0x7a,0x35,0x35,0x7e,0xf, 0x37, +0x40,0x7e,0x18,0x25,0xb6,0x2, 0xa8,0xef,0x7e,0xb3,0x2b,0x1d,0xb4,0x1, 0x31,0x12, +0xaa,0x51,0x7e,0x1f,0x38,0xd9,0x7a,0x37,0x24,0xfa,0x7e,0x34,0xd, 0xc8,0x7a,0x37, +0x24,0xf6,0x12,0xaa,0x58,0x12,0xaa,0x61,0xe4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x0, +0x20,0x7a,0x37,0x24,0xfc,0x7a,0xb3,0x24,0xf4,0x7e,0x8, 0x24,0xf2,0x2, 0xd, 0x7, +0x22,0xa9,0xd1,0xcb,0xe4,0x2, 0x0, 0xe, 0x7e,0x73,0x2a,0x6d,0x7a,0x73,0x24,0xf2, +0x22,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x24,0xf3,0x22,0x7e,0x43,0x2a,0x6e,0x7e,0x53, +0x2a,0x6d,0xac,0x54,0x7e,0x17,0x28,0xa1,0x12,0xaa,0x51,0x6d,0x0, 0x80,0x37,0x7d, +0x40,0x3e,0x44,0x7e,0x7f,0x38,0xd9,0x2d,0xf4,0xb, 0x7a,0x30,0xbd,0x13,0x58,0x10, +0x7d,0xf4,0x2e,0xf4,0x8, 0xa, 0xb, 0xf8,0x50,0x9d,0x51,0x1b,0xf8,0x50,0x80,0x14, +0x6d,0x55,0x9d,0x51,0xbd,0x53,0x8, 0xc, 0x2e,0x44,0x8, 0xa, 0xb, 0x48,0x50,0x2d, +0x51,0x1b,0x48,0x50,0xb, 0x4, 0xbd,0x20,0x38,0xc5,0x22,0x7c,0xab,0x7e,0x8, 0x29, +0xbc,0x12,0x5e,0x25,0x28,0x1f,0xa, 0x3a,0x7f,0x70,0x2d,0xf3,0x7e,0x7b,0xb0,0xb4, +0x2, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x3, 0x7a,0x7b,0xb0,0x74,0x3, 0x2d,0x31,0x7d, +0x20,0x39,0xb1,0x0, 0xa, 0x22,0xca,0xd8,0xca,0x79,0x7e,0x34,0x61,0x43,0x7e,0x24, +0x0, 0xff,0xb, 0x1a,0x40,0x90,0x61,0x35,0xe4,0x93,0x70,0x2, 0x61,0x96,0x90,0x60, +0xa7,0xe4,0x93,0x70,0x2, 0x61,0x96,0x6c,0xff,0x61,0x8f,0x7e,0x70,0x9, 0xac,0x7f, +0x9, 0xe3,0x29,0xc, 0x5e,0xe0,0xf, 0x49,0xc3,0x29,0xa, 0x7e,0x14,0x60,0xd1,0x7e, +0x4, 0x0, 0xff,0xb, 0xa, 0x20,0x2d,0x24,0xbd,0xc2,0x40,0x42,0x49,0xd3,0x29,0x8, +0x7d,0x3d,0x12,0xab,0xa4,0x7c,0xdb,0x90,0x60,0xa7,0xe4,0x93,0xbc,0xbd,0x38,0xe, +0x7d,0x34,0x1b,0x34,0x12,0xab,0x9b,0x7c,0xbe,0x12,0xaa,0xbb,0x80,0x3f,0x7e,0x70, +0x2, 0xac,0x7d,0x2e,0x34,0x60,0xc5,0x12,0x87,0xbc,0x74,0x9, 0xac,0xbf,0x59,0xd5, +0x29,0x8, 0x7e,0x34,0x60,0xcf,0x12,0x23,0x9e,0x12,0xab,0x9b,0x80,0x1f,0xbd,0xc4, +0x40,0x1b,0x7d,0x54,0x2e,0x54,0x0, 0xa, 0xbd,0xc5,0x40,0x5, 0x7c,0xbe,0x12,0xaa, +0xbb,0x7d,0xc4,0x1b,0xc4,0x74,0x9, 0xac,0xbf,0x59,0xc5,0x29,0xa, 0xb, 0xf0,0x12, +0x5e,0x2d,0x28,0x2, 0x61,0xb, 0xda,0x79,0xda,0xd8,0x22,0x74,0x9, 0xac,0xbf,0x59, +0x35,0x29,0xa, 0x22,0x6c,0xaa,0x80,0x27,0x7e,0x30,0x4, 0xac,0x3a,0x7d,0xf1,0x2e, +0xf4,0x60,0xb1,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x23,0x38,0xf, 0x2e,0x14, +0x60,0xb3,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0xbd,0x23,0x50,0xb, 0xb, 0xa0,0x90, +0x60,0xa7,0xe4,0x93,0xbc,0xba,0x38,0xd0,0x7c,0xba,0x22,0x90,0x60,0xa7,0xe4,0x93, +0x60,0x2b,0x6c,0x33,0x80,0x1f,0x7c,0xb3,0x12,0x31,0x5a,0x40,0x16,0x7c,0xb3,0x12, +0x31,0x27,0x7d,0x43,0x6d,0x55,0x7d,0x4, 0x3e,0x4, 0x7e,0x1f,0x13,0x8a,0x2d,0x30, +0x1b,0x1a,0x50,0xb, 0x30,0x7e,0x23,0x2a,0x75,0xbc,0x23,0x38,0xd9,0x22,0x12,0xac, +0x20,0x7e,0x14,0x62,0x7, 0x12,0x87,0xee,0x28,0x3, 0xd2,0x13,0x22,0xc2,0x13,0x22, +0x6d,0x11,0xe4,0x12,0x0, 0x1e,0x6c,0xaa,0x80,0x5b,0x7e,0x10,0x2, 0xac,0x1a,0x7e, +0x7f,0x38,0xf3,0x2d,0xf0,0x69,0x27,0x1, 0x0, 0x69,0x37,0x0, 0x80,0x9d,0x32,0x12, +0x21,0x0, 0xbd,0x31,0x28,0x16,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0xf, 0x38,0xf3,0x2d, +0x13,0x69,0x20,0x1, 0x0, 0x69,0x30,0x0, 0x80,0x12,0x81,0xbf,0x7e,0x10,0x2, 0xac, +0x1a,0x7e,0x1f,0x38,0xf3,0x2d,0x30,0x69,0x1, 0x0, 0x80,0xbe,0x4, 0x7f,0xff,0x78, +0x4, 0x7e,0x14,0x7f,0xff,0x69,0x1, 0x1, 0x0, 0xbe,0x4, 0x7f,0xff,0x78,0x4, 0x7e, +0x14,0x7f,0xff,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xbc,0xba,0x38,0x9d,0x7d,0x31,0x22, +0x6c,0x66,0x7e,0x27,0x39,0x4, 0xbe,0x24,0x3, 0xe8,0x28,0x3, 0x7e,0x60,0x8, 0x7e, +0xb3,0x28,0xac,0xb4,0x1, 0x1a,0x7e,0x73,0x2f,0xab,0xbc,0x76,0x50,0xf, 0xe4,0x7a, +0xb3,0x28,0xad,0x12,0x8a,0x87,0x7e,0xb3,0x2f,0xab,0x4, 0x80,0x4, 0xe4,0x80,0x1, +0xe4,0x7a,0xb3,0x2f,0xab,0x7e,0xb3,0x28,0xad,0xb4,0x1, 0x17,0x7e,0xa3,0x2f,0xac, +0xbe,0xa0,0x5, 0x50,0xa, 0xe4,0x7a,0xb3,0x28,0xad,0x7c,0xba,0x4, 0x80,0x5, 0x74, +0x5, 0x80,0x1, 0xe4,0x7a,0xb3,0x2f,0xac,0x22,0x6c,0xaa,0x80,0x26,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x5, 0xf8,0x49,0x32,0x4, 0x0, 0x2d,0x31,0x59,0x32,0x5, 0xf8, +0x30,0x1, 0xe, 0x49,0x12,0x4, 0x7e,0x49,0x32,0x6, 0x76,0x2d,0x31,0x59,0x32,0x6, +0x76,0xb, 0xa0,0x7e,0xb3,0x2a,0x74,0xa, 0x3b,0x7e,0xb3,0x2a,0x73,0xa, 0x2b,0x2d, +0x23,0xa, 0x3a,0xbd,0x32,0x48,0xc6,0x22,0xd2,0x3, 0x6c,0xaa,0x6c,0x77,0x80,0x1f, +0x7e,0x63,0x2a,0x6e,0xa, 0x16,0xa, 0x27,0x2d,0x21,0x7c,0x65,0x7e,0x50,0x2, 0xac, +0x56,0x49,0x22,0x5, 0x7a,0xbe,0x24,0xfe,0xc, 0x58,0x2, 0xb, 0xa0,0xb, 0x70,0x7e, +0xb3,0x2a,0x6d,0xbc,0xb7,0x38,0xd9,0xa, 0x2b,0x1e,0x24,0xa, 0x3a,0xbd,0x32,0x8, +0x2, 0xc2,0x3, 0xa2,0x3, 0x22,0xc2,0x3, 0x7e,0xa3,0x2a,0x70,0x7e,0xb3,0x26,0xf1, +0x60,0x4, 0xd2,0x3, 0x80,0x33,0x7e,0x70,0x2, 0x80,0x22,0x7e,0x50,0x2, 0xac,0x57, +0x49,0x12,0x4, 0xfc,0x7e,0xf4,0x61,0x59,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x6d, +0x22,0x9d,0x20,0xbd,0x12,0x58,0x4, 0xd2,0x3, 0x80,0xe, 0xb, 0x70,0xa, 0x1a,0x9e, +0x14,0x0, 0x3, 0xa, 0x27,0xbd,0x21,0x48,0xd2,0xa2,0x3, 0x22,0x7d,0x23,0x7e,0x14, +0x61,0xc8,0x12,0x64,0xd3,0x7e,0x14,0x0, 0x5, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50, +0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x8, 0x50,0x45,0x74,0x8, 0x80,0x3d,0x7d,0x13, +0x3e,0x14,0xbd,0x12,0x50,0xd, 0x7e,0x33,0x36,0xdc,0xbe,0x30,0x6, 0x50,0x30,0x74, +0x6, 0x80,0x28,0x7e,0x14,0x0, 0x3, 0xad,0x13,0x1e,0x14,0xbd,0x12,0x50,0xd, 0x7e, +0x33,0x36,0xdc,0xbe,0x30,0x4, 0x50,0x17,0x74,0x4, 0x80,0xf, 0xbd,0x32,0x50,0xf, +0x7e,0x73,0x36,0xdc,0xbe,0x70,0x2, 0x50,0x6, 0x74,0x2, 0x7a,0xb3,0x36,0xdc,0x7e, +0xb3,0x36,0xdc,0xbe,0xb0,0x0, 0x28,0x1b,0x14,0x7a,0xb3,0x36,0xdc,0x74,0x1, 0x7a, +0xb3,0x16,0x92,0x90,0x61,0xfd,0xe4,0x93,0xbe,0xb3,0x36,0xdc,0x50,0x5, 0xe4,0x7a, +0xb3,0x16,0x91,0x22,0x7c,0x3b,0x7e,0x44,0xff,0xff,0x6c,0x22,0x80,0x2a,0x12,0xae, +0xad,0x68,0x23,0x7e,0x70,0xc, 0xac,0x72,0x12,0xae,0xc5,0x7d,0x23,0x7e,0x70,0xc, +0xac,0x72,0x59,0x23,0x36,0x82,0x49,0x3, 0x36,0x82,0x49,0x23,0x36,0x7e,0xbd,0x20, +0x50,0x4, 0x59,0x3, 0x36,0x7e,0xb, 0x20,0xbc,0x32,0x50,0xd2,0x6c,0xaa,0x6c,0x22, +0x80,0x18,0x12,0xae,0xad,0x68,0x11,0x7e,0x70,0xc, 0xac,0x72,0x49,0x3, 0x36,0x7e, +0xbd,0x4, 0x50,0x4, 0x7d,0x40,0x7c,0xa2,0xb, 0x20,0xbc,0x32,0x50,0xe4,0x7e,0x37, +0x36,0x64,0xbe,0x37,0x36,0xdd,0x50,0x8, 0x7e,0x37,0x36,0xdd,0x7a,0x37,0x36,0x64, +0x12,0xae,0xbb,0x4d,0x33,0x78,0x3, 0x7e,0xa0,0xff,0x7c,0xba,0x22,0x7e,0x10,0x5, +0xac,0x12,0x9, 0xb0,0x26,0x33,0xbe,0xb3,0x2b,0xf, 0x22,0x7e,0x70,0xc, 0xac,0x7a, +0x49,0x33,0x36,0x7e,0x22,0x49,0x23,0x36,0x84,0x49,0x33,0x36,0x80,0x9d,0x32,0x2, +0x21,0x0, 0x7e,0x8, 0x36,0x7a,0x7e,0x34,0x0, 0x60,0xe4,0x12,0x20,0xde,0x6c,0xaa, +0x7e,0x44,0xff,0xff,0x7e,0x70,0xc, 0xac,0x7a,0x59,0x43,0x36,0x7c,0x59,0x43,0x36, +0x84,0xb, 0xa0,0xbe,0xa0,0x8, 0x40,0xe8,0x7e,0x8, 0x36,0x68,0x7e,0x34,0x0, 0xd, +0xe4,0x2, 0x20,0xde,0x7e,0xa3,0x2b,0x62,0xbc,0xab,0x68,0x6, 0x7a,0xb3,0x2b,0x62, +0xd2,0xc, 0x30,0xc, 0x7, 0x12,0xaf,0x1d,0xe4,0x2, 0xa, 0x66,0x22,0xc2,0xc, 0x7e, +0x8, 0x2a,0x6d,0x12,0x3, 0x8b,0x7e,0x8, 0x2a,0x6d,0x74,0x3, 0x2, 0x11,0x7a,0xe4, +0x7a,0xb3,0x36,0x67,0x6c,0xaa,0x80,0xd, 0x6d,0x44,0x7e,0x70,0xc, 0xac,0x7a,0x59, +0x43,0x36,0x7e,0xb, 0xa0,0x12,0x8d,0x8, 0x38,0xee,0xe4,0x7a,0xb3,0x36,0x68,0x6d, +0x33,0x7a,0x37,0x36,0x6f,0x7a,0x37,0x36,0x64,0x22,0x7e,0xb3,0x36,0x6a,0xb4,0x1, +0x27,0x7e,0xb3,0x36,0xe0,0x4, 0x7a,0xb3,0x36,0xe0,0x7e,0x73,0x36,0xe0,0xbe,0x70, +0x3, 0x40,0x15,0x12,0x8c,0x90,0x7e,0x73,0x36,0xe0,0xbe,0x70,0x6, 0x40,0x9, 0xe4, +0x7a,0xb3,0x36,0xe0,0x7a,0xb3,0x36,0x6a,0x22,0x12,0x24,0x14,0xe4,0x7a,0xb3,0x3, +0xfe,0x2, 0x76,0x52,0xca,0xd8,0xca,0x79,0x7f,0x70,0x7e,0x93,0x28,0x84,0x6c,0x88, +0x7e,0xf0,0x1, 0x80,0x1a,0xa, 0x58,0x7f,0x17,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x5f, +0x7f,0x7, 0x2d,0x15,0x7e,0xb, 0x70,0xbc,0x76,0x40,0x2, 0x7c,0x8f,0xb, 0xf0,0xbc, +0x9f,0x38,0xe2,0xa, 0x38,0x2d,0x3f,0x7d,0x2e,0x7e,0x1b,0x80,0x6c,0xaa,0x7e,0xf0, +0x1, 0x2, 0xb0,0x54,0x75,0x45,0x0, 0x6d,0xdd,0x6d,0xbb,0x7d,0xcb,0x75,0x44,0x0, +0x80,0x36,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x9, 0xe3,0x26,0xfa,0x9, 0xd3,0x26, +0xfb,0xe5,0x44,0xa, 0xab,0x7f,0x17,0x2d,0x3a,0x7e,0x1b,0xb0,0xbc,0xbf,0x78,0x16, +0x5, 0x45,0xa, 0xae,0x2d,0xca,0xa, 0xad,0x2d,0xba,0x12,0xb0,0x62,0xbd,0x3d,0x8, +0x5, 0x12,0xb0,0x62,0x7d,0xd3,0x5, 0x44,0xbe,0x91,0x44,0x38,0xc5,0xe5,0x45,0xbe, +0xb0,0x0, 0x28,0x2e,0xe5,0x45,0xa, 0xab,0x7d,0x3c,0x8d,0x3a,0x7d,0xc3,0x8d,0xba, +0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x33,0xc3,0x7d,0x3b,0x7e,0x50,0x2, 0xac,0x5a, +0x19,0x72,0x33,0xc4,0x7d,0x3c,0x7c,0xb7,0x7d,0x3b,0x12,0x30,0x3, 0x1b,0x1a,0xd0, +0xb, 0xa0,0xb, 0xf0,0xbc,0x8f,0x40,0x3, 0x2, 0xaf,0xd4,0x7c,0xba,0xda,0x79,0xda, +0xd8,0x22,0x7c,0xbe,0x7c,0x7d,0x2, 0x2c,0x40,0x7c,0x9b,0x7f,0x71,0x7f,0x60,0x7e, +0x34,0x22,0xb8,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x1f,0x52,0x74,0x2a,0x12,0x1f,0xad, +0x7e,0x58,0x1f,0x52,0x7c,0xb9,0x7e,0x71,0x44,0x12,0x2c,0x40,0x7d,0x43,0xe5,0x45, +0x7e,0x71,0x46,0x12,0x2c,0x40,0x2d,0x34,0xe, 0x34,0x7f,0x5, 0x7e,0x50,0x7, 0xb, +0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, 0x1b,0x6a,0x30,0x69,0x30,0x0, +0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe2,0x22,0x6d,0x33, +0x7d,0x23,0x7d,0x3, 0x6c,0x33,0x80,0x45,0x6c,0x22,0x80,0x37,0x7e,0xb3,0x2a,0x6e, +0xac,0xb3,0xa, 0x42,0x2d,0x54,0x7d,0x45,0x3e,0x44,0x7e,0x7f,0x13,0x8a,0x2d,0xf4, +0xb, 0x7a,0x40,0xbe,0x44,0x0, 0x32,0x8, 0x8, 0xbe,0x44,0x2, 0x58,0x58,0x2, 0xb, +0x24,0xbe,0x44,0xff,0xce,0x58,0x8, 0xbe,0x44,0xfd,0xa8,0x8, 0x2, 0xb, 0x4, 0xb, +0x34,0xb, 0x21,0x7e,0x93,0x2a,0x6e,0xbc,0x92,0x38,0xc1,0xb, 0x31,0x7e,0xb3,0x2a, +0x6d,0xbc,0xb3,0x38,0xb3,0x7e,0x54,0x0, 0x6, 0xad,0x53,0x7d,0x15,0x1e,0x14,0x1e, +0x14,0x1e,0x14,0x12,0x25,0x3e,0xbd,0x12,0x50,0x22,0xbd,0x30,0x28,0x1e,0xe4,0x7a, +0xb3,0x39,0x8, 0x7e,0xb3,0x39,0x9, 0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x39, +0x9, 0x80,0x3c,0xe4,0x7a,0xb3,0x39,0x9, 0x74,0x1, 0x80,0x2f,0xbd,0x10,0x50,0x22, +0xbd,0x32,0x28,0x1e,0xe4,0x7a,0xb3,0x39,0x9, 0x7e,0xb3,0x39,0x8, 0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x39,0x8, 0x80,0x16,0xe4,0x7a,0xb3,0x39,0x8, 0x74,0x2, +0x80,0x9, 0xe4,0x7a,0xb3,0x39,0x8, 0x7a,0xb3,0x39,0x9, 0x7a,0xb3,0x39,0xa, 0x7e, +0xb3,0x39,0xa, 0x22,0xe4,0x7a,0xb3,0x28,0xa8,0x7a,0xb3,0x39,0xb, 0x22,0xca,0xd8, +0xca,0x79,0xc2,0x3, 0x6c,0xdd,0x7e,0x57,0x28,0x99,0x7d,0xf5,0x7e,0xe7,0x28,0x97, +0x7e,0x37,0x37,0xfb,0x4d,0x33,0x68,0x4, 0x7d,0xf5,0xe, 0xf4,0x6c,0xff,0x7e,0xa3, +0x2a,0x6e,0x7c,0x8a,0x7e,0xb3,0x28,0xa5,0x14,0x68,0x21,0x14,0x68,0x14,0x24,0xc2, +0x68,0x8, 0x24,0xfb,0x68,0x16,0x24,0x45,0x78,0x10,0x7c,0xfa,0x7e,0x83,0x2a,0x6d, +0x80,0xa, 0x7e,0x73,0x2a,0x6d,0x2c,0x87,0x80,0x2, 0x6c,0x88,0x6c,0x99,0x80,0xf, +0x7c,0xb9,0x12,0x37,0x6f,0xbe,0x34,0x2, 0x58,0x8, 0x2, 0xb, 0xd0,0xb, 0x90,0x7e, +0x33,0x28,0x84,0xbc,0x39,0x38,0xe9,0xbe,0xd0,0x3, 0x40,0x2, 0x61,0x4f,0x7e,0xa3, +0x28,0x85,0xbe,0xa0,0x0, 0x38,0xb, 0xbe,0x30,0x0, 0x28,0x37,0x7e,0xb3,0x26,0x83, +0x70,0x31,0x6c,0x99,0x80,0x29,0xa, 0x29,0xa, 0x3f,0x2d,0x32,0x3e,0x34,0x49,0x23, +0x5, 0x7a,0xbd,0x2f,0x8, 0x17,0x49,0x3, 0x4, 0xfc,0xbd,0xe, 0x58,0xf, 0x6d,0x33, +0x9d,0x3e,0x12,0x8f,0xdc,0xbd,0x3, 0x8, 0x4, 0xd2,0x3, 0x80,0x6, 0xb, 0x90,0xbc, +0x89,0x38,0xd3,0x6d,0xee,0x9e,0xe7,0x2a,0x4f,0xbe,0xe7,0x7, 0xf8,0x8, 0x2, 0xc2, +0x3, 0x30,0x3, 0x20,0x7e,0xb3,0x39,0xb, 0x4, 0x7a,0xb3,0x39,0xb, 0x7e,0x23,0x39, +0xb, 0xbe,0x20,0xa, 0x28,0x1d,0x74,0xa, 0x7a,0xb3,0x39,0xb, 0x74,0x1, 0x7a,0xb3, +0x28,0xa8,0x80,0xf, 0x7e,0x23,0x39,0xb, 0xbe,0x20,0x0, 0x28,0x6, 0x1e,0x20,0x7a, +0x23,0x39,0xb, 0x6c,0xee,0xbe,0x30,0x0, 0x38,0x5, 0xbe,0xa0,0x0, 0x28,0x69,0x7e, +0xb3,0x28,0xa7,0xb4,0x1, 0x9, 0x7e,0xb3,0x28,0xaa,0xbe,0xb0,0x1, 0x68,0x59,0x7e, +0xb3,0x28,0xa8,0xb4,0x1, 0x52,0x6c,0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, +0xa3,0x26,0xfa,0x9, 0xd3,0x26,0xfb,0x12,0x2c,0x3c,0xbe,0x34,0x0, 0x96,0x8, 0x5, +0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90,0x7e,0xb3,0x28,0x84,0xbc,0xb9,0x38,0xdb,0x6c, +0x99,0x80,0x1d,0x7e,0x70,0x2, 0xac,0x79,0x9, 0xa3,0x27,0x36,0x9, 0xd3,0x27,0x37, +0x12,0x2c,0x3c,0xbe,0x34,0xff,0x6a,0x58,0x5, 0x7e,0xe0,0x1, 0x80,0xa, 0xb, 0x90, +0x7e,0xb3,0x28,0x85,0xbc,0xb9,0x38,0xdb,0x6c,0x99,0x80,0x17,0xa, 0xe9,0xa, 0x5f, +0x2d,0x5e,0x3e,0x54,0x49,0x55,0x5, 0x7a,0xbd,0x5f,0x8, 0x5, 0x7e,0xe0,0x1, 0x80, +0x6, 0xb, 0x90,0xbc,0x89,0x38,0xe5,0x4c,0xee,0x78,0x25,0x7e,0xb3,0x39,0xc, 0x4, +0x7a,0xb3,0x39,0xc, 0x7e,0x73,0x39,0xc, 0xbe,0x70,0x5, 0x28,0x22,0x74,0x5, 0x7a, +0xb3,0x39,0xc, 0x7e,0xb3,0x28,0xa8,0x60,0x2, 0xd2,0x15,0x12,0xb1,0x84,0x80,0xf, +0x7e,0x73,0x39,0xc, 0xbe,0x70,0x0, 0x28,0x6, 0x1e,0x70,0x7a,0x73,0x39,0xc, 0xda, +0x79,0xda,0xd8,0x22,0xca,0xf8,0x7c,0xfb,0x7e,0x34,0x0, 0x38,0xca,0x39,0xac,0x7f, +0x2e,0x34,0x0, 0x50,0x6d,0x22,0x7e,0x8, 0x34,0x0, 0x12,0x20,0xb9,0x1b,0xfd,0x7e, +0x34,0x0, 0x8c,0xca,0x39,0xac,0x7f,0x2e,0x34,0x1, 0x30,0x6d,0x22,0x7e,0x8, 0x3, +0x60,0x12,0x20,0xb9,0x1b,0xfd,0xda,0xf8,0x22,0x7e,0xa3,0x2a,0x6e,0xa, 0x3a,0x3e, +0x34,0x7e,0x8, 0x13,0x8e,0xe4,0x12,0x20,0xde,0x90,0x60,0x93,0x93,0xa, 0x3b,0x7e, +0xb3,0x2a,0x71,0xa, 0x2b,0x2d,0x23,0xa, 0x3a,0xad,0x32,0x7d,0x43,0x6c,0x77,0x80, +0x1d,0xa, 0x27,0x2d,0x24,0x12,0x87,0xdc,0xb, 0xa, 0x0, 0x7e,0x30,0x2, 0xac,0x37, +0x2e,0x14,0x13,0x8e,0xb, 0x18,0x20,0x2d,0x20,0x1b,0x18,0x20,0xb, 0x70,0xbc,0xa7, +0x38,0xdf,0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x13,0xc6, +0x49,0x32,0x13,0x8e,0xbd,0x31,0x28,0x9, 0x2e,0x24,0x13,0x8e,0x9d,0x31,0x1b,0x28, +0x30,0xb, 0xa0,0x7e,0xb3,0x2a,0x6e,0xbc,0xba,0x38,0xdc,0x22,0x7c,0xab,0x12,0xb4, +0xb, 0xd2,0x16,0x7c,0xba,0x12,0x86,0xf8,0xc2,0x16,0x22,0xa9,0xd1,0xcb,0x74,0x1, +0x2, 0x0, 0xe, 0x12,0xb4,0xb, 0x7e,0x34,0xd, 0xc8,0x7e,0xb3,0x2a,0x6d,0x12,0xb4, +0x4c,0x12,0xb4,0x2f,0x7a,0x37,0x38,0xd6,0x74,0x1, 0x7a,0xb3,0x16,0x91,0x22,0x6d, +0x33,0x90,0x60,0x91,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb5,0x19,0x90,0x60, +0x92,0xe4,0x93,0xbe,0xb0,0x0, 0x28,0x3, 0x2, 0xb4,0x80,0x22,0x7a,0xb3,0x24,0xf2, +0x7e,0x53,0x2a,0x6e,0x7a,0x53,0x24,0xf3,0x7a,0x37,0x24,0xfa,0xe4,0x7a,0xb3,0x24, +0xf4,0x7a,0xb3,0x24,0xf5,0x7e,0x34,0x40,0x0, 0x7a,0x37,0x24,0xf6,0x7e,0x34,0x0, +0x20,0x12,0xb4,0x77,0x2, 0xd, 0x7, 0x7a,0x37,0x24,0xfc,0x7e,0x8, 0x24,0xf2,0x22, +0xca,0xf8,0x6d,0xee,0x7d,0xfe,0x7e,0x83,0x2a,0x6e,0xa, 0xd8,0x90,0x60,0x94,0xe4, +0x93,0xb4,0xff,0x2f,0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x18,0x7e,0x70,0x2, 0xac, +0x7a,0x49,0x23,0x13,0xfe,0x7f,0x50,0x2d,0xb3,0xb, 0x5a,0xc0,0x9d,0xc2,0x59,0xc3, +0x13,0xc6,0xb, 0xa0,0xbc,0x8a,0x38,0xe4,0x90,0x60,0x92,0xe4,0x93,0x7c,0x9b,0x6d, +0xdd,0x80,0x11,0x7e,0x8, 0x13,0xfe,0x90,0x60,0x92,0xe4,0x93,0xa, 0xcb,0x1b,0xc4, +0x7d,0x3c,0x7c,0x97,0x6c,0xff,0x80,0x38,0x6c,0xaa,0x80,0x28,0xa, 0x3a,0x7d,0x23, +0x2d,0x2e,0x3e,0x24,0x49,0xc2,0x13,0xfe,0x2d,0x3d,0x3e,0x34,0x2d,0x31,0x7d,0x20, +0xb, 0x1a,0xb0,0x7d,0x3c,0x9d,0x3b,0x12,0x21,0x0, 0x7d,0xa3,0xbd,0xfa,0x58,0x2, +0x7d,0xfa,0xb, 0xa0,0xbc,0x8a,0x38,0xd4,0xa, 0xc8,0x2d,0xec,0x2d,0xdc,0xb, 0xf0, +0xbc,0x9f,0x38,0xc4,0x7d,0x3f,0xda,0xf8,0x22,0xca,0xf8,0x6d,0x44,0x7e,0xf3,0x2a, +0x6e,0x90,0x60,0x93,0xe4,0x93,0xa, 0xfb,0x7e,0xb3,0x2a,0x6d,0xa, 0xeb,0x2d,0xef, +0xa, 0xff,0xad,0xfe,0xa, 0xef,0x2d,0xef,0x90,0x60,0x94,0xe4,0x93,0xb4,0xff,0x31, +0x7e,0x8, 0x13,0x8e,0x6c,0xaa,0x80,0x23,0xa, 0xda,0x2d,0xdf,0x3e,0xd4,0x7e,0x1f, +0x38,0xd9,0x2d,0x3d,0xb, 0x1a,0xd0,0x7e,0x50,0x2, 0xac,0x5a,0x7f,0x50,0x2d,0xb2, +0xb, 0x5a,0x30,0x9d,0x3d,0x59,0x32,0x13,0xc6,0xb, 0xa0,0xbc,0xfa,0x38,0xd9,0x80, +0xa, 0x7d,0x5e,0x3e,0x54,0x7e,0xf, 0x38,0xd9,0x2d,0x15,0x6c,0xaa,0x80,0x2c,0xa, +0xea,0x2d,0xef,0x3e,0xe4,0x7e,0x1f,0x38,0xd9,0x2d,0x3e,0xb, 0x1a,0xe0,0x7e,0x70, +0x2, 0xac,0x7a,0x2d,0x31,0x7d,0x20,0xb, 0x1a,0xd0,0x7d,0x3e,0x9d,0x3d,0x12,0x21, +0x0, 0x7d,0xc3,0xbd,0x4c,0x58,0x2, 0x7d,0x4c,0xb, 0xa0,0xbc,0xfa,0x38,0xd0,0x7d, +0x34,0xda,0xf8,0x22,0xca,0x78,0xa9,0x31,0xe5,0x6, 0xa9,0xd5,0xea,0xa9,0xc5,0xea, +0xa9,0x30,0xe5,0x19,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x5, 0x4e,0x7e,0x73,0x39,0x6, +0xbe,0x71,0x4e,0x38,0x2, 0xd2,0x17,0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0xa9,0x34,0xe5, +0x5, 0xa9,0xc4,0xcd,0xc2,0x95,0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x33,0xe5, +0x3, 0xa9,0xc3,0xcd,0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0xa9,0x36,0xe5,0x3, 0xa9, +0xc6,0xcd,0xda,0x78,0x32,0xc2,0x9a,0xa9,0xd4,0xa6,0xc2,0x88,0xd2,0xa8,0x22,0x7e, +0x14,0xd7,0xe8,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79,0x30, +0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79,0x30, +0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79,0x30, +0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0xa9,0xd0,0xce,0xa2,0x3, 0xa9,0x95,0xc9,0x22, +0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0xa9,0xc2,0xeb,0xa9,0xd2, +0xac,0xa9,0xd2,0xec,0xd2,0x82,0x22,0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9, +0xd6,0xdf,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, 0x75,0x8b,0x0, 0xd2,0x8e, +0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7,0x0, 0x75,0xf8,0x0, 0xa9, +0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xc1, +0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0xa9,0xc6,0xb7,0xc2,0xbe,0x22,0x75,0xe7, +0x6b,0x2, 0xb6,0xc4,0xe4,0x7e,0x34,0xd7,0xfc,0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0, +0x7e,0x34,0xd7,0xfd,0x7a,0x1b,0xb0,0x75,0xe9,0xff,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0x7e,0x37,0x39,0x4, 0xb, 0x34,0x7a,0x37,0x39,0x4, 0xbe,0x34,0xff,0x0, +0x40,0x8, 0x7e,0x34,0xff,0x0, 0x7a,0x37,0x39,0x4, 0x22,0x7c,0x6b,0x6c,0x77,0x6c, +0xaa,0x7e,0xb3,0x39,0x13,0xb4,0xa5,0x46,0x12,0xb7,0xb9,0x75,0xb5,0x5, 0xa9,0x36, +0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3, +0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5, +0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47, +0x6c,0x55,0xa, 0x3a,0x4d,0x32,0x22,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0x22,0x74,0x6, +0x7d,0x30,0x7d,0x23,0x7c,0x6b,0xa, 0x14,0x7c,0x73,0x7d,0x52,0x7c,0xab,0x7e,0xb3, +0x39,0x13,0xb4,0xa5,0x3c,0x12,0xb7,0xb9,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0x12, +0xb7,0x57,0xa9,0x36,0xb3,0xfc,0x12,0xb7,0x57,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x7a,0x61,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3, +0xfc,0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2, +0xb4,0x22,0x74,0x4, 0x7d,0x30,0x2, 0xb7,0x62,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x22, +0x74,0x2, 0x7d,0x3f,0x2, 0xb7,0x62,0x7d,0x42,0x7f,0x60,0x7d,0x3, 0x12,0xb8,0x38, +0x74,0x2, 0x12,0xb6,0xfb,0x7d,0xf3,0x4e,0xf4,0x0, 0x1, 0x4e,0xf4,0x0, 0xa, 0x12, +0xb7,0xc0,0x7a,0x45,0x36,0x7d,0x30,0x6d,0x22,0x7f,0x6, 0x12,0xb8,0x64,0x5e,0xf4, +0xff,0xfd,0x12,0xb7,0xc0,0x2, 0xb7,0xf8,0xa9,0xc5,0xca,0xe4,0x7a,0xb3,0x39,0x13, +0x22,0xca,0xf8,0x7c,0xfb,0x74,0x2, 0x12,0xb6,0xfb,0x4c,0xff,0x78,0x5, 0x5e,0x70, +0xdf,0x80,0x3, 0x4e,0x70,0x20,0x74,0x2, 0x12,0xb7,0x62,0xda,0xf8,0x22,0xd2,0xc8, +0x43,0xed,0xf, 0xc2,0xea,0x75,0xb3,0x13,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0xb8, +0x38,0xe4,0x12,0xb8,0x1, 0x2, 0xb7,0xf8,0xa9,0xd5,0xca,0xa9,0xd1,0xea,0xa9,0xc1, +0xea,0x74,0xa5,0x7a,0xb3,0x39,0x13,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24,0xbd, +0x32,0x38,0xe9,0x22,0x12,0xb8,0x72,0x7e,0x35,0x36,0x12,0xb8,0x48,0xa9,0xd2,0xb4, +0xd3,0x22,0x7d,0x52,0xf5,0x3a,0x7c,0xb6,0x7c,0xa5,0xa, 0x44,0xf5,0x39,0x7f,0x21, +0xf5,0x38,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xb8,0x9d,0xe5,0x3a,0x12,0xb8,0x9d,0xe5, +0x39,0x12,0xb8,0x9d,0xe5,0x38,0x12,0xb8,0x9d,0xe4,0x2, 0xb8,0x9d,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0x7c,0xa6,0x7c,0x37,0x7c,0x2b,0xe4,0x6c, +0x11,0x80,0x46,0xbc,0xa1,0x68,0x40,0x1a,0x41,0x3e,0x44,0x9, 0x4, 0x26,0xfb,0xa, +0x20,0xa, 0x33,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x7, 0x1a,0x41,0x3e,0x44,0x9, 0x74, +0x26,0xfa,0xa, 0x27,0xa, 0x32,0x9d,0x32,0x12,0x21,0x0, 0x7c,0x97,0xbe,0x90,0x1, +0x18,0x8, 0xbe,0x0, 0x1, 0x18,0x3, 0x74,0x1, 0x22,0xbe,0x90,0x2, 0x18,0x8, 0xbe, +0x0, 0x2, 0x18,0x3, 0x74,0x2, 0x22,0xb, 0x10,0x7e,0x83,0x28,0x84,0xbc,0x81,0x18, +0xb2,0x22,0x7f,0x71,0x69,0x37,0x0, 0x2, 0x7d,0x53,0x12,0xb9,0x5c,0xb, 0x7a,0x20, +0x2d,0x25,0x1b,0xa, 0x20,0x69,0x27,0x0, 0x4, 0x7d,0x52,0xc4,0x54,0xf0,0x7c,0xab, +0xe4,0x1e,0x34,0x1e,0x34,0x2d,0x35,0x79,0x30,0x0, 0x2, 0x69,0x37,0x0, 0x6, 0x7d, +0x53,0x7c,0xab,0xe4,0x3e,0x54,0x3e,0x54,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x2d,0x25,0x79,0x20,0x0, 0x4, 0x69,0x27,0x0, 0x8, 0x7c,0x45,0x6c,0x55,0x12,0x25, +0x3c,0x1e,0x34,0x1e,0x34,0x2d,0x32,0x79,0x30,0x0, 0x6, 0x22,0x3, 0x3, 0x54,0xc0, +0x7c,0xab,0xe4,0x22,0x7c,0xab,0x9f,0x11,0x30,0x3, 0x22,0x6c,0x99,0x80,0x1a,0xa, +0xf9,0x2d,0xf1,0x7d,0xe0,0x7e,0x7b,0xb0,0x7e,0x78,0x0, 0x1, 0x60,0x5, 0x2f,0x77, +0x14,0x78,0xfb,0x4d,0x3f,0x4d,0x2e,0xb, 0x90,0xbc,0xa9,0x38,0xe2,0x22,0xca,0xf8, +0x90,0x60,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x8, 0x1f,0x34,0x12,0x3f,0xd9,0x7e,0x8, +0x1f,0x3c,0x12,0xba,0x1a,0xd2,0x3, 0x7e,0x8, 0x2a,0xdc,0x7c,0xbf,0x12,0xb9,0x64, +0x7e,0x8, 0x1f,0x34,0x7a,0xf, 0x1f,0x58,0x7f,0x1, 0x7a,0x17,0x1f,0x5c,0x7d,0x32, +0x7a,0x37,0x1f,0x5e,0x7e,0x18,0x1f,0x3c,0x7a,0x1f,0x1f,0x64,0x6c,0x77,0x80,0xe, +0x12,0xba,0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x3c,0xb, 0x70,0xbc,0xf7, +0x38,0xee,0x12,0xba,0x7, 0xe4,0x12,0xba,0xf, 0xe4,0x12,0xc, 0x9b,0x6d,0x33,0x7a, +0x37,0x1f,0x5c,0x7a,0x37,0x1f,0x5e,0x12,0xba,0x7, 0x74,0x1, 0x12,0xba,0xf, 0x74, +0x1, 0x12,0xc, 0x9b,0xda,0xf8,0x22,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x12, +0xc, 0x9b,0xa9,0xd6,0xea,0x7e,0x8, 0x1f,0x58,0x22,0x7e,0x34,0x0, 0x1c,0x74,0x3f, +0x2, 0x20,0xde,0x7e,0x8, 0x1f,0x34,0x12,0xba,0x1a,0x6c,0x77,0x80,0xe, 0x12,0xba, +0x62,0x50,0x7, 0x12,0xba,0x59,0x19,0x51,0x1f,0x34,0xb, 0x70,0x7e,0x53,0x2a,0x6e, +0xbc,0x57,0x38,0xea,0xa9,0xc6,0xea,0x7e,0x8, 0x1f,0x34,0xe4,0x12,0x11,0x38,0xa9, +0xd6,0xea,0x7e,0x8, 0x1f,0x34,0x2, 0x11,0x38,0xa, 0x27,0x9, 0x52,0x2b,0x44,0xa, +0x16,0x22,0xa, 0x27,0x9, 0x62,0x2a,0xdc,0xbe,0x60,0x1c,0x22,0x7c,0x57,0x7c,0xab, +0x6c,0x77,0x80,0x50,0xa, 0x47,0x7e,0x7d,0x24,0x2d,0xf4,0x7e,0x7b,0x60,0xa, 0x46, +0x2e,0x44,0x20,0x73,0x7a,0x91,0x82,0x7a,0x81,0x83,0xe4,0x93,0x7c,0x6b,0xbe,0x60, +0xd, 0x38,0x12,0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, 0x3e,0xd4,0x14,0x78,0xfb, +0x7e,0x7d,0x28,0x80,0x15,0x9e,0x60,0xe, 0x7e,0xd4,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0xd4,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf5,0xb, 0x7a,0x40,0x4d,0x4d,0x1b, +0x7a,0x40,0xb, 0x70,0xbc,0x57,0x38,0xac,0x6c,0x77,0x80,0x58,0xa, 0x27,0x7f,0x70, +0x2d,0xf2,0x7e,0x7b,0x60,0xbe,0x60,0xd, 0x38,0x11,0x12,0xbb,0x29,0x60,0x5, 0x3e, +0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28,0xb, 0xf6,0x80,0x2f,0xbe,0x60,0x1b,0x38,0x16, +0x9e,0x60,0xe, 0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x7d,0x28, +0x2e,0xf4,0x0, 0x6, 0x80,0x14,0x9e,0x60,0x1c,0x12,0xbb,0x29,0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7e,0x7d,0x28,0x2e,0xf4,0x0, 0x8, 0xb, 0x7a,0x20,0x4d,0x24,0x1b, +0x7a,0x20,0xb, 0x70,0xbc,0xa7,0x38,0xa4,0x22,0x7e,0x44,0x0, 0x1, 0x7c,0xb6,0x22, +0x7e,0x27,0x28,0xa3,0x6d,0x11,0x9d,0x12,0x6c,0xaa,0x80,0x64,0x30,0x0, 0x2e,0x7e, +0x90,0x2, 0xac,0x9a,0x49,0x34,0x5, 0xf8,0x49,0x4, 0x4, 0x0, 0xbd,0x2, 0x8, 0x11, +0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x5, 0xf8,0x80, +0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x5, 0xf8,0x30,0x2, 0x2e, +0x7e,0x90,0x2, 0xac,0x9a,0x49,0x34,0x6, 0x76,0x49,0x4, 0x4, 0x7e,0xbd,0x2, 0x8, +0x11,0x7e,0xb3,0x25,0xf6,0xb4,0x1, 0x16,0x7d,0xf2,0x2d,0xf3,0x59,0xf4,0x6, 0x76, +0x80,0xc, 0xbd,0x1, 0x58,0x8, 0x7d,0x3, 0x9d,0x2, 0x59,0x4, 0x6, 0x76,0xb, 0xa0, +0x7e,0xb3,0x2a,0x74,0xa, 0xb, 0x7e,0xb3,0x2a,0x73,0xa, 0x4b,0x2d,0x40,0xa, 0xa, +0xbd,0x4, 0x48,0x88,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x27,0x72, +0xb, 0x30,0x90,0x60,0x9a,0xe4,0x93,0x12,0x77,0xf6,0xb, 0x24,0xa, 0x33,0xbd,0x32, +0x48,0xe7,0xe4,0x7a,0xb3,0x28,0x84,0x7a,0xb3,0x28,0x85,0x6d,0x33,0x7a,0x37,0x28, +0x86,0x7a,0x37,0x28,0x88,0x7a,0x37,0x28,0x8a,0x7a,0x37,0x28,0x8e,0x7e,0xd4,0x1f, +0x36,0x5e,0xd4,0xff,0xfe,0x6d,0xcc,0x7e,0x1f,0x13,0x8a,0x7a,0x37,0x1f,0x76,0x7d, +0x3d,0x7a,0x37,0x1f,0x7a,0x7e,0x34,0x15,0x9e,0x7a,0x37,0x1f,0x78,0x7e,0x73,0x2a, +0x6d,0x7a,0x73,0x1f,0x73,0x7e,0x73,0x2a,0x6e,0x7a,0x73,0x1f,0x72,0x7e,0x37,0x2a, +0x5c,0x7a,0x37,0x1f,0x7c,0x7e,0x37,0x2a,0x5e,0x7a,0x37,0x1f,0x7e,0x7e,0x37,0x2a, +0x60,0x7a,0x37,0x1f,0x80,0x90,0x60,0x9a,0x93,0x7a,0xb3,0x1f,0x74,0x7e,0x73,0x3, +0xff,0x7a,0x73,0x1f,0x75,0x7e,0x8, 0x1f,0x72,0x7e,0x18,0x1f,0x82,0x12,0x8, 0x0, +0x7e,0x73,0x1f,0x82,0x7a,0x73,0x28,0x84,0x7e,0x73,0x1f,0x83,0x7a,0x73,0x28,0x85, +0x7e,0x37,0x1f,0x84,0x7a,0x37,0x28,0x86,0x7e,0x37,0x1f,0x86,0x7a,0x37,0x28,0x88, +0x7e,0x37,0x1f,0x8c,0x7a,0x37,0x28,0x8a,0x7e,0x37,0x1f,0x8e,0x7d,0x23,0x7a,0x53, +0x28,0x8c,0xa, 0x36,0x7a,0x73,0x28,0x8d,0x7e,0x37,0x1f,0x88,0x7a,0x37,0x28,0x8e, +0x7e,0x37,0x1f,0x8a,0x7d,0x23,0x7a,0x53,0x28,0x90,0xa, 0x36,0x7a,0x73,0x28,0x91, +0x6c,0x33,0x80,0x1d,0x7c,0xb3,0x12,0x2f,0xd0,0x74,0x2, 0xac,0xb3,0x49,0x45,0x15, +0x9e,0xa, 0x38,0x7c,0x27,0x19,0x25,0x26,0xfa,0x7c,0x29,0x19,0x25,0x26,0xfb,0xb, +0x30,0x7e,0x23,0x28,0x84,0xbc,0x23,0x38,0xdb,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac, +0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25,0x27,0x36, +0x7c,0x29,0x19,0x25,0x27,0x37,0xb, 0x30,0x7e,0x23,0x28,0x85,0xbc,0x23,0x38,0xdd, +0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, +0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x38,0xfb,0xa, +0x47,0x5d,0x42,0x7e,0x73,0x37,0x32,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12,0xbd,0x64, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x38,0xfc,0xa, 0x45,0x5d,0x43,0x7e, +0x73,0x37,0x33,0x80,0x1a,0x12,0xbd,0x64,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, +0x2a,0x9, 0xb2,0x38,0xfb,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x37,0x34,0xa, +0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e,0xb3,0x2f, +0x80,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x2f,0x80, +0x7e,0x34,0x0, 0x28,0xe4,0x12,0x20,0xde,0x7e,0x8, 0x2b,0xbf,0x7e,0x34,0x3, 0xc0, +0x12,0x20,0xde,0x7a,0xb3,0x37,0x34,0x7e,0x34,0x62,0x8e,0x12,0x23,0x9e,0x7a,0x37, +0x2b,0xb7,0x7a,0xe7,0x2f,0x84,0x7a,0xf7,0x2f,0x86,0x7a,0xe7,0x2f,0x88,0x7a,0xe7, +0x2f,0x8c,0x7a,0xe7,0x2f,0x90,0x7a,0xe7,0x2f,0x94,0x7a,0xf7,0x2f,0x8a,0x7a,0xf7, +0x2f,0x8e,0x7a,0xf7,0x2f,0x92,0x7a,0xf7,0x2f,0x96,0x7a,0xe7,0x2b,0xbb,0x7a,0xf7, +0x2b,0xbd,0x7a,0xb3,0x2f,0xa8,0x74,0x2, 0x7a,0xb3,0x2f,0x7f,0x22,0x74,0xfe,0x7a, +0xb3,0x37,0x34,0xe4,0x7a,0xb3,0x2f,0x80,0x22,0x7d,0x13,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x7e,0x37,0x38,0xe2,0x9e,0x37,0x38,0xde,0x12,0x21,0x0, 0xbd,0x31,0x38,0x12, +0x7e,0x37,0x38,0xe4,0x9e,0x37,0x38,0xe0,0x12,0x21,0x0, 0xbd,0x31,0x38,0x3, 0x74, +0x1, 0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd, +0x7e,0xd3,0x2a,0x2, 0x7e,0xe3,0x2a,0x3, 0x7e,0xb3,0x38,0xdd,0x60,0x11,0x7e,0xc7, +0x38,0xe6,0x4d,0xcc,0x78,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x28,0x2, 0xe1,0x8, 0xbe, +0xd0,0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xe1,0x8, 0x7e,0xe7,0x29,0x8, 0x7e, +0xf7,0x29,0xa, 0x7d,0x3e,0x7d,0x2f,0x12,0x66,0xe6,0xbe,0xb0,0x1, 0x78,0x2, 0xe1, +0x8, 0x7e,0xa3,0x38,0xdd,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23, +0x14,0x78,0x2, 0xe1,0x5, 0xb, 0xb2,0x68,0x2, 0xe1,0x8, 0xbe,0xd0,0x1, 0x68,0x2, +0xe1,0x17,0x4c,0xee,0x68,0x2, 0xe1,0x17,0x74,0x1, 0x7a,0xb3,0x38,0xdd,0x12,0xbf, +0x2a,0x80,0x65,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3, +0x38,0xdd,0x7e,0x34,0x62,0x64,0x80,0x54,0x74,0x4, 0x7a,0xb3,0x38,0xdd,0x7e,0x34, +0x62,0x68,0x80,0x48,0x12,0xbf,0x33,0x90,0x62,0x57,0x12,0xbf,0x1e,0x68,0x49,0x80, +0x56,0xbe,0xd0,0x1, 0x78,0x51,0x4c,0xee,0x78,0x4d,0x12,0xbf,0x33,0x7e,0x34,0x62, +0x60,0x12,0x23,0x9e,0x7e,0x14,0x62,0x64,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x9d, +0xc3,0xbe,0xc7,0x38,0xe6,0x40,0x21,0x90,0x62,0x56,0x12,0xbf,0x1e,0x68,0x19,0x12, +0xbf,0x2a,0x74,0x3, 0x7a,0xb3,0x38,0xdd,0x7e,0x34,0x62,0x64,0x12,0x23,0x9e,0x7a, +0x37,0x38,0xe6,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x38,0xdd,0x6d,0x33,0x7a, +0x37,0x38,0xe6,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93, +0xa, 0x3b,0x12,0xbd,0xe9,0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x38,0xde,0x7a,0xf7, +0x38,0xe0,0x22,0x7a,0xe7,0x38,0xe2,0x7a,0xf7,0x38,0xe4,0x22,0xca,0xf8,0x7f,0x51, +0x7f,0x40,0x7e,0x37,0x2f,0x90,0x7a,0x35,0x2a,0x7e,0x37,0x2f,0x8e,0x7a,0x35,0x2c, +0x7e,0x37,0x2f,0x9c,0x7a,0x35,0x26,0x7e,0x37,0x2f,0x9e,0x7a,0x35,0x28,0x6c,0xff, +0x80,0x1e,0x7e,0x34,0x0, 0x26,0x7e,0x14,0x0, 0x2f,0x74,0x9, 0x12,0x1f,0x8c,0x74, +0x2, 0xac,0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xbf,0x8b,0xb, 0xf0, +0x7e,0x73,0x38,0x3f,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e, +0x35,0x2f,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2f,0x7e, +0x35,0x31,0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x31,0xb, +0x6a,0x30,0x9e,0x35,0x33,0x6d,0x22,0x7e,0x33,0x38,0x41,0x12,0xbf,0xe0,0x7e,0x15, +0x2f,0x12,0x1f,0x5, 0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x35,0x6d,0x22,0x7e, +0x33,0x38,0x42,0x12,0xbf,0xe0,0x7e,0x15,0x31,0x12,0x1f,0x5, 0x1b,0x7a,0x30,0x22, +0xa, 0x13,0x6d,0x0, 0x2, 0x1e,0xeb,0x7a,0x1d,0x24,0x7e,0xa3,0x2a,0x6e,0x74,0x2, +0xa4,0x7e,0xf, 0x6, 0xf8,0x2d,0x15,0x7e,0xb3,0x2a,0x6d,0x7e,0x37,0x2a,0x51,0x22, +0x74,0x1, 0x7a,0xb3,0x37,0xa0,0x7e,0x34,0x60,0xa3,0x22,0x7a,0x1d,0x24,0x7e,0xf, +0x6, 0xf8,0x7e,0xb3,0x2a,0x6e,0x7e,0x37,0x2a,0x53,0x22,0x7e,0xa3,0x2a,0x6e,0x7e, +0xb3,0x2a,0x6d,0xa4,0x22,0x74,0x1, 0x7a,0xb3,0x2b,0x1, 0x7a,0xb3,0x2b,0x1d,0x22, +0x9, 0x75,0x26,0x36,0x7a,0x73,0x2b,0x20,0x22,0x9, 0x75,0x26,0x34,0x7a,0x73,0x2b, +0x14,0x22,0x7e,0x8, 0x2a,0x6d,0x2, 0xd, 0x72,0xa, 0x47,0x7f,0x70,0x2d,0xf4,0x7e, +0x7b,0x60,0xbc,0x6b,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x2a,0x5e,0x22, +0x7e,0x29,0x60,0x4c,0x6a,0x7a,0x29,0x60,0xb, 0x70,0x22,0x2e,0x14,0x1, 0x30,0x6d, +0x0, 0x7e,0x18,0x3, 0x60,0x22,0x2e,0x14,0x0, 0x50,0x6d,0x0, 0x7e,0x18,0x34,0x0, +0x22,0x74,0x6, 0x12,0xb6,0xfb,0x7d,0x3, 0x6c,0x11,0x22,0x7e,0x70,0x2, 0xac,0x7c, +0x9, 0xb3,0x26,0xfa,0x22,0xe4,0x7a,0xb3,0x36,0x69,0x7a,0xb3,0x36,0x71,0x22,0x74, +0x1, 0x12,0x13,0xde,0xe4,0x2, 0x0, 0x1e,0x7a,0x37,0x2a,0x4f,0x7e,0x34,0x61,0x57, +0x22,0x7a,0x37,0x28,0xa1,0x7e,0x34,0x61,0xc2,0x22,0x90,0x60,0xaa,0xe4,0x93,0xbe, +0xb0,0x1, 0x22,0x9, 0x75,0x26,0x33,0x7a,0x73,0x2b,0xf, 0x22,0x74,0x5, 0xac,0xbc, +0x9, 0xb5,0x26,0x33,0x22,0x7e,0x8, 0x0, 0x25,0x7e,0x18,0x0, 0x24,0x22,0x7e,0xe3, +0x2a,0x6f,0x7e,0xd3,0x2a,0x70,0x22,0x6d,0x33,0xe4,0x6c,0x55,0x2, 0x13,0x1, 0x7e, +0x37,0x25,0xf4,0x7a,0x37,0x31,0xcc,0x22,0x7e,0x34,0xd, 0xc8,0x7a,0x37,0x31,0xce, +0x22,0x7e,0x73,0x37,0xbd,0x7a,0x73,0x2b,0x20,0x22,0x12,0x0, 0x1e,0x7e,0xb3,0x2a, +0xfc,0x22,0x7e,0x73,0x28,0x92,0xbe,0x70,0x0, 0x22,0x7e,0xb3,0x28,0xa8,0xbe,0xb0, +0x1, 0x22,0x12,0x0, 0xe, 0x7e,0x1f,0x13,0x86,0x22,0x7e,0xb3,0x37,0x31,0xbe,0xb0, +0x1, 0x22,0x7e,0x73,0x2a,0x2, 0xbe,0x70,0x0, 0x22,0x90,0x60,0xa7,0xe4,0x93,0x7c, +0xab,0x22,0xc1,0x42,0x3e,0xbd,0x6, 0xf9,0x7, 0x51, diff --git a/drivers/input/touchscreen/FT8006m/Kconfig b/drivers/input/touchscreen/FT8006m/Kconfig new file mode 100755 index 0000000000000..b9155aa01ebb7 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/Kconfig @@ -0,0 +1,17 @@ +# +# Focaltech Touchscreen driver configuration +# + +config TOUCHSCREEN_FT8006M + bool "Focaltech Touchscreen" + depends on I2C + default n + help + Say Y here if you have Focaltech touch panel. + If unsure, say N. + +config TOUCHSCREEN_FTS_DIRECTORY + string "Focaltech ts directory name" + default "focaltech_touch" + depends on TOUCHSCREEN_FT8006M + diff --git a/drivers/input/touchscreen/FT8006m/Makefile b/drivers/input/touchscreen/FT8006m/Makefile new file mode 100755 index 0000000000000..7f41c31569a5c --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/Makefile @@ -0,0 +1,18 @@ +# +# Makefile for the focaltech touchscreen drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_core.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_ex_fun.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_ex_mode.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_flash.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_gesture.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_esdcheck.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_i2c.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_sensor.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_point_report_check.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_flash/ +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test/ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_common.h b/drivers/input/touchscreen/FT8006m/focaltech_common.h new file mode 100755 index 0000000000000..b1398d20fca43 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_common.h @@ -0,0 +1,222 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ +/***************************************************************************** +* +* File Name: focaltech_common.h +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-16 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +#ifndef __LINUX_FOCALTECH_COMMON_H__ +#define __LINUX_FOCALTECH_COMMON_H__ + +#include "focaltech_config.h" + +/***************************************************************************** +* Macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_VERSION "Focaltech V1.3 20170306" + +#define FLAGBIT(x) (0x00000001 << (x)) +#define FLAGBITS(x, y) ((0xFFFFFFFF >> (32 - (y) - 1)) << (x)) + +#define FLAG_ICSERIALS_LEN 5 +#define FLAG_IDC_BIT 11 + +#define IC_SERIALS (FTS_CHIP_TYPE & FLAGBITS(0, FLAG_ICSERIALS_LEN-1)) +#define FTS_CHIP_IDC ((FTS_CHIP_TYPE & FLAGBIT(FLAG_IDC_BIT)) == FLAGBIT(FLAG_IDC_BIT)) + +#define FTS_CHIP_TYPE_MAPPING {{0x07, 0x80, 0x06, 0x80, 0x06, 0x80, 0xC6, 0x80, 0xB6} } + +#define I2C_BUFFER_LENGTH_MAXINUM 256 +#define FILE_NAME_LENGTH 128 +#define ENABLE 1 +#define DISABLE 0 +/*register address*/ +#define FTS_REG_INT_CNT 0x8F +#define FTS_REG_FLOW_WORK_CNT 0x91 +#define FTS_REG_WORKMODE 0x00 +#define FTS_REG_WORKMODE_FACTORY_VALUE 0x40 +#define FTS_REG_WORKMODE_WORK_VALUE 0x00 +#define FTS_REG_CHIP_ID 0xA3 +#define FTS_REG_CHIP_ID2 0x9F +#define FTS_REG_POWER_MODE 0xA5 +#define FTS_REG_POWER_MODE_SLEEP_VALUE 0x03 +#define FTS_REG_FW_VER 0xA6 +#define FTS_REG_VENDOR_ID 0xA8 +#define FTS_REG_LCD_BUSY_NUM 0xAB +#define FTS_REG_FACE_DEC_MODE_EN 0xB0 +#define FTS_REG_GLOVE_MODE_EN 0xC0 +#define FTS_REG_COVER_MODE_EN 0xC1 +#define FTS_REG_CHARGER_MODE_EN 0x8B +#define FTS_REG_GESTURE_EN 0xD0 +#define FTS_REG_GESTURE_OUTPUT_ADDRESS 0xD3 +#define FTS_REG_ESD_SATURATE 0xED + + + +/***************************************************************************** +* Alternative mode (When something goes wrong, the modules may be able to solve the problem.) +*****************************************************************************/ +/* + * point report check + * default: disable + */ +#define FTS_POINT_REPORT_CHECK_EN 0 + + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct ft_chip_t { + unsigned long type; + unsigned char chip_idh; + unsigned char chip_idl; + unsigned char rom_idh; + unsigned char rom_idl; + unsigned char pramboot_idh; + unsigned char pramboot_idl; + unsigned char bootloader_idh; + unsigned char bootloader_idl; +}; + +/* i2c communication*/ +int ft8006m_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue); +int ft8006m_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue); +int ft8006m_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen); +int ft8006m_i2c_write(struct i2c_client *client, char *writebuf, int writelen); +int ft8006m_i2c_init(void); +int ft8006m_i2c_exit(void); + +/* Gesture functions */ +#if FTS_GESTURE_EN +int ft8006m_gesture_init(struct input_dev *input_dev, struct i2c_client *client); +int ft8006m_gesture_exit(struct i2c_client *client); +void ft8006m_gesture_recovery(struct i2c_client *client); +int ft8006m_gesture_readdata(struct i2c_client *client); +int ft8006m_gesture_suspend(struct i2c_client *i2c_client); +int ft8006m_gesture_resume(struct i2c_client *client); +#endif + +/* Apk and functions */ +#if FTS_APK_NODE_EN +int ft8006m_create_apk_debug_channel(struct i2c_client *client); +void ft8006m_release_apk_debug_channel(void); +#endif + +/* ADB functions */ +#if FTS_SYSFS_NODE_EN +int ft8006m_create_sysfs(struct i2c_client *client); +int ft8006m_remove_sysfs(struct i2c_client *client); +#endif + +/* ESD */ +#if FTS_ESDCHECK_EN +int ft8006m_esdcheck_init(void); +int ft8006m_esdcheck_exit(void); +int ft8006m_esdcheck_switch(bool enable); +int ft8006m_esdcheck_proc_busy(bool proc_debug); +int ft8006m_esdcheck_set_intr(bool intr); +int ft8006m_esdcheck_suspend(void); +int ft8006m_esdcheck_resume(void); +int ft8006m_esdcheck_get_status(void); +#endif + +/* Production test */ +#if FTS_TEST_EN +int ft8006m_test_init(struct i2c_client *client); +int ft8006m_test_exit(struct i2c_client *client); +#endif + +#if FTS_LOCK_DOWN_INFO +int ft8006m_lockdown_init(struct i2c_client *client); +#endif + +#if FTS_CAT_RAWDATA +int ft8006m_rawdata_init(struct i2c_client *client); +#endif + +/* Point Report Check*/ +#if FTS_POINT_REPORT_CHECK_EN +int ft8006m_point_report_check_init(void); +int ft8006m_point_report_check_exit(void); +void ft8006m_point_report_check_queue_work(void); +#endif + +/* Other */ +extern int ft8006m_g_show_log; +int ft8006m_reset_proc(int hdelayms); +int ft8006m_wait_tp_to_valid(struct i2c_client *client); +void ft8006m_tp_state_recovery(struct i2c_client *client); +int ft8006m_ex_mode_init(struct i2c_client *client); +int ft8006m_ex_mode_exit(struct i2c_client *client); +int ft8006m_ex_mode_recovery(struct i2c_client *client); + +void ft8006m_irq_disable(void); +void ft8006m_irq_enable(void); + +/***************************************************************************** +* DEBUG function define here +*****************************************************************************/ +#if FTS_DEBUG_EN +#define FTS_DEBUG_LEVEL 1 + +#if (FTS_DEBUG_LEVEL == 2) +#define FTS_DEBUG(fmt, args...) printk(KERN_ERR "[FTS8006m][%s]"fmt"\n", __func__, ##args) +#define FTS_FUNC_ENTER() printk(KERN_ERR "[FTS8006m]%s: Enter\n", __func__) +#define FTS_FUNC_EXIT() printk(KERN_ERR "[FTS8006m]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_DEBUG(fmt, args...) printk(KERN_ERR "[FTS8006m]"fmt"\n", ##args) +#define FTS_FUNC_ENTER() +#define FTS_FUNC_EXIT() +#endif + +#else +#define FTS_DEBUG(fmt, args...) +#define FTS_FUNC_ENTER() +#define FTS_FUNC_EXIT() +#endif + +#define FTS_INFO(fmt, args...) do { \ + if (ft8006m_g_show_log) {printk(KERN_ERR "[FTS8006m][Info]"fmt"\n", ##args); } \ + } while (0) + +#define FTS_ERROR(fmt, args...) do { \ + if (ft8006m_g_show_log) {printk(KERN_ERR "[FTS8006m][Error]"fmt"\n", ##args); } \ + } while (0) + + +#if FTS_GESTURE_EN +#define GESTURE_NODE "onoff" +#define GESTURE_DATA "data" +#define DOUBLE_CLICK 143 +struct gesture_struct { + int gesture_all_switch; + unsigned long gesture_mask; +}; +#endif + +#endif /* __LINUX_FOCALTECH_COMMON_H__ */ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_config.h b/drivers/input/touchscreen/FT8006m/focaltech_config.h new file mode 100644 index 0000000000000..c8b2eb0b35a68 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_config.h @@ -0,0 +1,268 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ +/************************************************************************ +* +* File Name: focaltech_config.h +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: global configurations +* +* Version: v1.0 +* +************************************************************************/ +#ifndef _LINUX_FOCLATECH_CONFIG_H_ +#define _LINUX_FOCLATECH_CONFIG_H_ + +/**************************************************/ +/****** G: A, I: B, S: C, U: D ******************/ +/****** chip type defines, do not modify *********/ +#define _FT8716 0x87160805 +#define _FT8736 0x87360806 +#define _FT8006 0x80060807 +#define _FT8606 0x86060808 +#define _FT8607 0x86070809 +#define _FTE716 0xE716080a + +#define _FT5416 0x54160002 +#define _FT5426 0x54260002 +#define _FT5435 0x54350002 +#define _FT5436 0x54360002 +#define _FT5526 0x55260002 +#define _FT5526I 0x5526B002 +#define _FT5446 0x54460002 +#define _FT5346 0x53460002 +#define _FT5446I 0x5446B002 +#define _FT5346I 0x5346B002 +#define _FT7661 0x76610002 +#define _FT7511 0x75110002 +#define _FT7421 0x74210002 +#define _FT7681 0x76810002 +#define _FT3C47U 0x3C47D002 +#define _FT3417 0x34170002 +#define _FT3517 0x35170002 +#define _FT3327 0x33270002 +#define _FT3427 0x34270002 + +#define _FT5626 0x56260001 +#define _FT5726 0x57260001 +#define _FT5826B 0x5826B001 +#define _FT5826S 0x5826C001 +#define _FT7811 0x78110001 +#define _FT3D47 0x3D470001 +#define _FT3617 0x36170001 +#define _FT3717 0x37170001 +#define _FT3817B 0x3817B001 + +#define _FT6236U 0x6236D003 +#define _FT6336G 0x6336A003 +#define _FT6336U 0x6336D003 +#define _FT6436U 0x6436D003 + +#define _FT3267 0x32670004 +#define _FT3367 0x33670004 + + + +/*************************************************/ + +/* + * choose your ic chip type of focaltech + */ +#define FTS_CHIP_TYPE _FT8006 + +/******************* Enables *********************/ +/*********** 1 to enable, 0 to disable ***********/ + +/* + * show debug log info + * enable it for debug, disable it for release + */ +#define FTS_DEBUG_EN 1 + +#define FTS_LOCK_DOWN_INFO 1 + +#define FTS_CAT_RAWDATA 1 + +/* + * Linux MultiTouch Protocol + * 1: Protocol B(default), 0: Protocol A + */ + +#define FTS_MT_PROTOCOL_B_EN 0 + + +/* + * Report Pressure in multitouch + * 1:enable(default),0:disable +*/ +#define FTS_REPORT_PRESSURE_EN 1 + +/* + * Force touch support + * different pressure for multitouch + * 1: true pressure for force touch + * 0: constant pressure(default) + */ +#define FTS_FORCE_TOUCH_EN 0 + +/* + * Gesture function enable + * default: disable + */ +#define FTS_GESTURE_EN 1 + +/* + * ESD check & protection + * default: disable + */ +#define FTS_ESDCHECK_EN 1 + +/* + * Production test enable + * 1: enable, 0:disable(default) + */ +#define FTS_TEST_EN 1 + +/* + * Glove mode enable + * 1: enable, 0:disable(default) + */ +#define FTS_GLOVE_EN 0 +/* + * cover enable + * 1: enable, 0:disable(default) + */ +#define FTS_COVER_EN 0 +/* + * Charger enable + * 1: enable, 0:disable(default) + */ +#define FTS_CHARGER_EN 0 + +/* + * Proximity sensor + * default: disable + */ +#define FTS_PSENSOR_EN 0 + +/* + * Nodes for tools, please keep enable + */ +#define FTS_SYSFS_NODE_EN 1 +#define FTS_APK_NODE_EN 1 + +/* + * Customer power enable + * enable it when customer need control TP power + * default: disable + */ +#define FTS_POWER_SOURCE_CUST_EN 1 + +/****************************************************/ + +/********************** Upgrade ****************************/ +/* + * auto upgrade, please keep enable + */ +#ifdef WT_COMPILE_FACTORY_VERSION + #define FTS_AUTO_UPGRADE_EN 0 +#else +#define FTS_AUTO_UPGRADE_EN 1 +#endif + +/* + * auto upgrade for lcd cfg + * default: 0 + */ +#ifdef WT_COMPILE_FACTORY_VERSION + #define FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN 0 +#else +#define FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN 1 +#endif + +/* auto cb check + * default: disable + */ +#define FTS_AUTO_CLB_EN 0 + +/* + * Check vendor_id number + * 0:No check vendor_id (default) + * 1/2/3: Check vendor_id for vendor compatibility + */ +#define FTS_GET_VENDOR_ID_NUM 0 + +/* + * vendor_id(s) for vendor(s) to be compatible with. + * a confirmation of vendor_id(s) is recommended. + * FTS_GET_VENDOR_ID_NUM == 0, no check vendor id, you may ignore them + * FTS_GET_VENDOR_ID_NUM >= 1, compatible with FTS_VENDOR_1_ID + * FTS_GET_VENDOR_ID_NUM >= 2, compatible with FTS_VENDOR_2_ID + * FTS_GET_VENDOR_ID_NUM == 3, compatible with FTS_VENDOR_3_ID + */ +#define FTS_VENDOR_1_ID 0x00 +#define FTS_VENDOR_2_ID 0x00 +#define FTS_VENDOR_3_ID 0x00 + +/* + * FW_APP.i file for auto upgrade, you must replace it with your own + * define your own fw_app, the sample one to be replaced is invalid + * NOTE: if FTS_GET_VENDOR_ID_NUM >= 1, it's the fw corresponding with FTS_VENDOR_1_ID + */ +#define FTS_UPGRADE_FW_APP "include/firmware/FT8006m_app_sample.i" + +#define FTS_UPGRADE_FW_ALL_WHITE "include/firmware/white_all.i" + +#define FTS_UPGRADE_FW_ALL_BLACK "include/firmware/black_all.i" + + +/* + * if FTS_GET_VENDOR_ID_NUM >= 2, fw corrsponding with FTS_VENDOR_2_ID + * define your own fw_app, the sample one is invalid + */ +#define FTS_UPGRADE_FW2_APP "include/firmware/FT8006m_app_sample.i" + +/* + * if FTS_GET_VENDOR_ID_NUM == 3, fw corrsponding with FTS_VENDOR_3_ID + * define your own fw_app, the sample one is invalid + */ +#define FTS_UPGRADE_FW3_APP "include/firmware/FT8006m_app_sample.i" + +/* + * lcd_cfg.i file for lcd cfg upgrade + * define your own lcd_cfg.i, the sample one is invalid + */ + + + +/* + * upgrade stress test for debug + * enable it for upgrade debug if needed + * default: disable + */ +#define FTS_UPGRADE_STRESS_TEST 0 +/* stress test times, default: 1000 */ +#define FTS_UPGRADE_TEST_NUMBER 1000 + +/*********************************************************/ + +#endif /* _LINUX_FOCLATECH_CONFIG_H_ */ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_core.c b/drivers/input/touchscreen/FT8006m/focaltech_core.c new file mode 100755 index 0000000000000..aeb660b0b9a16 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_core.c @@ -0,0 +1,1715 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ +/***************************************************************************** +* +* File Name: focaltech_core.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#if FTS_GESTURE_EN +extern struct gesture_struct ft8006m_gesture_data; +#define MXT_INPUT_EVENT_START 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define MXT_INPUT_EVENT_STYLUS_MODE_OFF 2 +#define MXT_INPUT_EVENT_STYLUS_MODE_ON 3 +#define MXT_INPUT_EVENT_WAKUP_MODE_OFF 4 +#define MXT_INPUT_EVENT_WAKUP_MODE_ON 5 +#define MXT_INPUT_EVENT_EDGE_DISABLE 6 +#define MXT_INPUT_EVENT_EDGE_FINGER 7 +#define MXT_INPUT_EVENT_EDGE_HANDGRIP 8 +#define MXT_INPUT_EVENT_EDGE_FINGER_HANDGRIP 9 +#define MXT_INPUT_EVENT_END 9 +#endif +#if defined(CONFIG_FB) +#include +#include +#elif defined(CONFIG_HAS_EARLYSUSPEND) +#include +#define FTS_SUSPEND_LEVEL 1 /* Early-suspend level */ +#endif +#include +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_NAME "ft8006m_ts" +#define INTERVAL_READ_REG 20 +#define TIMEOUT_READ_REG 300 +#if FTS_POWER_SOURCE_CUST_EN +#define FTS_VTG_MIN_UV 1600000 +#define FTS_VTG_MAX_UV 2000000 +#define FTS_I2C_VTG_MIN_UV 1800000 +#define FTS_I2C_VTG_MAX_UV 1800000 +#endif +#define FTS_READ_TOUCH_BUFFER_DIVIDED 0 +/***************************************************************************** +* Global variable or extern global variabls/functions +******************************************************************************/ +struct i2c_client *ft8006m_i2c_client; +struct fts_ts_data *ft8006m_wq_data; +struct input_dev *ft8006m_input_dev; +extern char Lcm_name[HARDWARE_MAX_ITEM_LONGTH]; + +#if FTS_DEBUG_EN +int ft8006m_g_show_log = 1; +#else +int ft8006m_g_show_log = 0; +#endif + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) +char g_sz_debug[1024] = {0}; +#endif + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static void fts_release_all_finger(void); +int ft8006m_ts_suspend(struct device *dev); +static int ft8006m_ts_resume(struct device *dev); + +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" + + +extern int panel_dead2tp; + + +/***************************************************************************** +* Name: ft8006m_wait_tp_to_valid +* Brief: Read chip id until TP FW become valid, need call when reset/power on/resume... +* 1. Read Chip ID per INTERVAL_READ_REG(20ms) +* 2. Timeout: TIMEOUT_READ_REG(300ms) +* Input: +* Output: +* Return: 0 - Get correct Device ID +*****************************************************************************/ +int ft8006m_wait_tp_to_valid(struct i2c_client *client) +{ + int ret = 0; + int cnt = 0; + u8 reg_value = 0; + + do { + ret = ft8006m_i2c_read_reg(client, FTS_REG_CHIP_ID, ®_value); + if ((ret < 0) || (reg_value != ft8006m_chip_types.chip_idh)) { + FTS_INFO("TP Not Ready, ReadData = 0x%x", reg_value); + } else if (reg_value == ft8006m_chip_types.chip_idh) { + FTS_INFO("TP Ready, Device ID = 0x%x", reg_value); + return 0; + } + cnt++; + msleep(INTERVAL_READ_REG); + } while ((cnt * INTERVAL_READ_REG) < TIMEOUT_READ_REG); + + /* error: not get correct reg data */ + return -EPERM; +} + +/***************************************************************************** +* Name: fts_recover_state +* Brief: Need execute this function when reset +* Input: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_tp_state_recovery(struct i2c_client *client) +{ + /* wait tp stable */ + ft8006m_wait_tp_to_valid(client); + /* recover TP charger state 0x8B */ + /* recover TP glove state 0xC0 */ + /* recover TP cover state 0xC1 */ + ft8006m_ex_mode_recovery(client); + /* recover TP gesture state 0xD0 */ +#if FTS_GESTURE_EN + if (ft8006m_gesture_data.gesture_all_switch) + ft8006m_gesture_recovery(client); +#endif +} + + +/***************************************************************************** +* Name: ft8006m_reset_proc +* Brief: Execute reset operation +* Input: hdelayms - delay time unit:ms +* Output: +* Return: +*****************************************************************************/ +int ft8006m_reset_proc(int hdelayms) +{ + gpio_direction_output(ft8006m_wq_data->pdata->reset_gpio, 0); + msleep(20); + gpio_direction_output(ft8006m_wq_data->pdata->reset_gpio, 1); + msleep(hdelayms); + + return 0; +} + +/***************************************************************************** +* Name: ft8006m_irq_disable +* Brief: disable irq +* Input: +* sync: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_irq_disable(void) +{ + unsigned long irqflags; + spin_lock_irqsave(&ft8006m_wq_data->irq_lock, irqflags); + + if (!ft8006m_wq_data->irq_disable) { + disable_irq_nosync(ft8006m_wq_data->client->irq); + ft8006m_wq_data->irq_disable = 1; + } + + spin_unlock_irqrestore(&ft8006m_wq_data->irq_lock, irqflags); +} + +/***************************************************************************** +* Name: ft8006m_irq_enable +* Brief: enable irq +* Input: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_irq_enable(void) +{ + unsigned long irqflags = 0; + spin_lock_irqsave(&ft8006m_wq_data->irq_lock, irqflags); + + if (ft8006m_wq_data->irq_disable) { + enable_irq(ft8006m_wq_data->client->irq); + ft8006m_wq_data->irq_disable = 0; + } + + spin_unlock_irqrestore(&ft8006m_wq_data->irq_lock, irqflags); +} +#if FTS_GESTURE_EN +static int fts_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + char buffer[16]; + + if (type == EV_SYN && code == SYN_CONFIG) { + sprintf(buffer, "%d", value); + + FTS_INFO("FTS:Gesture on/off : %d", value); + if (value >= MXT_INPUT_EVENT_START && value <= MXT_INPUT_EVENT_END) { + if (value == MXT_INPUT_EVENT_WAKUP_MODE_ON) { + ft8006m_gesture_data.gesture_all_switch = 1; + } else if (value == MXT_INPUT_EVENT_WAKUP_MODE_OFF) { + ft8006m_gesture_data.gesture_all_switch = 0; + } else { + ft8006m_gesture_data.gesture_all_switch = 0; + FTS_ERROR("Failed Open/Close Gesture Function!\n"); + return -ENOMEM; + } + } + } + + return 0; +} +#endif + +/***************************************************************************** +* Name: ft8006m_input_dev_init +* Brief: input dev init +* Input: +* Output: +* Return: +*****************************************************************************/ +static int ft8006m_input_dev_init(struct i2c_client *client, struct fts_ts_data *data, struct input_dev *input_dev, struct fts_ts_platform_data *pdata) +{ + int err, len; + + FTS_FUNC_ENTER(); + + /* Init and register Input device */ + input_dev->name = FTS_DRIVER_NAME; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; +#if FTS_GESTURE_EN + input_dev->event = fts_input_event; +#endif + + input_set_drvdata(input_dev, data); + i2c_set_clientdata(client, data); + + __set_bit(EV_KEY, input_dev->evbit); + if (data->pdata->have_key) { + FTS_DEBUG("set key capabilities"); + for (len = 0; len < data->pdata->key_number; len++) { + input_set_capability(input_dev, EV_KEY, data->pdata->keys[len]); + } + } + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + +#if FTS_MT_PROTOCOL_B_EN + input_mt_init_slots(input_dev, pdata->max_touch_number, INPUT_MT_DIRECT); +#else + input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 0x0f, 0, 0); +#endif + input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, pdata->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, pdata->y_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 0xFF, 0, 0); +#if FTS_REPORT_PRESSURE_EN + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 0xFF, 0, 0); +#endif + + err = input_register_device(input_dev); + if (err) { + FTS_ERROR("Input device registration failed"); + goto free_inputdev; + } + + FTS_FUNC_EXIT(); + + return 0; + +free_inputdev: + input_free_device(input_dev); + FTS_FUNC_EXIT(); + return err; + +} + +/***************************************************************************** +* Power Control +*****************************************************************************/ +#if FTS_POWER_SOURCE_CUST_EN +static int fts_power_source_init(struct fts_ts_data *data) +{ + int rc; + + FTS_FUNC_ENTER(); + + data->vcc_i2c = regulator_get(&data->client->dev, "vcc_i2c"); + if (IS_ERR(data->vcc_i2c)) { + rc = PTR_ERR(data->vcc_i2c); + FTS_ERROR("Regulator get failed vcc_i2c rc=%d", rc); + goto reg_vdd_set_vtg; + } + + data->lab = regulator_get(&data->client->dev, "lab"); + if (IS_ERR(data->lab)) { + rc = PTR_ERR(data->lab); + FTS_ERROR("Regulator get failed lab rc=%d", rc); + } + + data->ibb = regulator_get(&data->client->dev, "ibb"); + if (IS_ERR(data->ibb)) { + rc = PTR_ERR(data->ibb); + FTS_ERROR("Regulator get failed ibb rc=%d", rc); + } + + data->panel_iovdd = regulator_get(&data->client->dev, "panel_iovdd"); + if (IS_ERR(data->panel_iovdd)) { + + FTS_ERROR("!!! panel_iovdd not present !!!"); + } + + FTS_FUNC_EXIT(); + return 0; + + + +reg_vdd_set_vtg: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FTS_VTG_MAX_UV); + + + FTS_FUNC_EXIT(); + return rc; +} + +static int fts_power_source_ctrl(struct fts_ts_data *data, int enable) +{ + int rc; + + FTS_FUNC_ENTER(); + if (enable) { + rc = regulator_enable(data->vcc_i2c); + if (rc) { + FTS_ERROR("Regulator vcc_i2c enable failed rc=%d", rc); + } + } else { + rc = regulator_disable(data->vcc_i2c); + if (rc) { + FTS_ERROR("Regulator vcc_i2c disable failed rc=%d", rc); + } + } + FTS_FUNC_EXIT(); + return 0; +} + +static int lcd_power_ctrl(struct fts_ts_data *data, int enable) +{ + int rc; + + FTS_FUNC_ENTER(); + if (enable) { + rc = regulator_enable(data->panel_iovdd); + if (rc) { + FTS_ERROR("Regulator panel_iovdd enable failed rc=%d\n", rc); + } + + rc = regulator_enable(data->lab); + if (rc) { + FTS_ERROR("Regulator labenable failed rc=%d\n", rc); + } + + rc = regulator_enable(data->ibb); + if (rc) { + FTS_ERROR("Regulator ibb enable failed rc=%d\n", rc); + } + } else { + rc = regulator_disable(data->lab); + if (rc) { + FTS_ERROR("Regulator lab disable failed rc=%d\n", rc); + } + + rc = regulator_disable(data->ibb); + if (rc) { + FTS_ERROR("Regulator ibb disable failed rc=%d\n", rc); + } + + mdelay(10); + rc = regulator_disable(data->panel_iovdd); + if (rc) { + FTS_ERROR("Regulator panel_iovdd disable failed rc=%d\n", rc); + } + + } + FTS_FUNC_EXIT(); + return 0; +} + + +#endif + + +/***************************************************************************** +* Reprot related +*****************************************************************************/ +/***************************************************************************** +* Name: fts_release_all_finger +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_release_all_finger(void) +{ +#if FTS_MT_PROTOCOL_B_EN + unsigned int finger_count = 0; +#endif + + mutex_lock(&ft8006m_wq_data->report_mutex); +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < ft8006m_wq_data->pdata->max_touch_number; finger_count++) { + input_mt_slot(ft8006m_input_dev, finger_count); + input_mt_report_slot_state(ft8006m_input_dev, MT_TOOL_FINGER, false); + } +#else + input_mt_sync(ft8006m_input_dev); +#endif + input_report_key(ft8006m_input_dev, BTN_TOUCH, 0); + input_sync(ft8006m_input_dev); + mutex_unlock(&ft8006m_wq_data->report_mutex); +} + + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) +static void fts_show_touch_buffer(u8 *buf, int point_num) +{ + int len = point_num * FTS_ONE_TCH_LEN; + int count = 0; + int i; + + memset(g_sz_debug, 0, 1024); + if (len > (POINT_READ_BUF-3)) { + len = POINT_READ_BUF-3; + } else if (len == 0) { + len += FTS_ONE_TCH_LEN; + } + count += sprintf(g_sz_debug, "%02X,%02X,%02X", buf[0], buf[1], buf[2]); + for (i = 0; i < len; i++) { + count += sprintf(g_sz_debug+count, ",%02X", buf[i+3]); + } + +} +#endif + +static int ft8006m_input_dev_report_key_event(struct ts_event *event, struct fts_ts_data *data) +{ + int i; + + if (data->pdata->have_key) { + if ((1 == event->touch_point || 1 == event->point_num) && + (event->au16_y[0] == data->pdata->key_y_coord)) { + + if (event->point_num == 0) { + FTS_DEBUG("Keys All Up!"); + for (i = 0; i < data->pdata->key_number; i++) { + input_report_key(data->input_dev, data->pdata->keys[i], 0); + } + } else { + for (i = 0; i < data->pdata->key_number; i++) { + if (event->au16_x[0] > (data->pdata->key_x_coords[i] - FTS_KEY_WIDTH) && + event->au16_x[0] < (data->pdata->key_x_coords[i] + FTS_KEY_WIDTH)) { + + if (event->au8_touch_event[i] == 0 || + event->au8_touch_event[i] == 2) { + input_report_key(data->input_dev, data->pdata->keys[i], 1); + FTS_DEBUG("Key%d(%d, %d) DOWN!", i, event->au16_x[0], event->au16_y[0]); + } else { + input_report_key(data->input_dev, data->pdata->keys[i], 0); + FTS_DEBUG("Key%d(%d, %d) Up!", i, event->au16_x[0], event->au16_y[0]); + } + break; + } + } + } + input_sync(data->input_dev); + return 0; + } + } + + return -EPERM; +} + +#if FTS_MT_PROTOCOL_B_EN +static int ft8006m_input_dev_report_b(struct ts_event *event, struct fts_ts_data *data) +{ + int i = 0; + int uppoint = 0; + int touchs = 0; + for (i = 0; i < event->touch_point; i++) { + if (event->au8_finger_id[i] >= data->pdata->max_touch_number) { + break; + } + input_mt_slot(data->input_dev, event->au8_finger_id[i]); + + if (event->au8_touch_event[i] == FTS_TOUCH_DOWN || event->au8_touch_event[i] == FTS_TOUCH_CONTACT) { + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, true); + +#if FTS_REPORT_PRESSURE_EN +#if FTS_FORCE_TOUCH_EN + if (event->pressure[i] <= 0) { + FTS_ERROR("[B]Illegal pressure: %d", event->pressure[i]); + event->pressure[i] = 1; + } +#else + event->pressure[i] = 0x3f; +#endif + input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]); +#endif + + if (event->area[i] <= 0) { + FTS_ERROR("[B]Illegal touch-major: %d", event->area[i]); + event->area[i] = 1; + } + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]); + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]); + touchs |= BIT(event->au8_finger_id[i]); + data->touchs |= BIT(event->au8_finger_id[i]); + +#if FTS_REPORT_PRESSURE_EN + + +#else + +#endif + } else { + uppoint++; + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); +#if FTS_REPORT_PRESSURE_EN + input_report_abs(data->input_dev, ABS_MT_PRESSURE, 0); +#endif + data->touchs &= ~BIT(event->au8_finger_id[i]); + + } + } + + if (unlikely(data->touchs ^ touchs)) { + for (i = 0; i < data->pdata->max_touch_number; i++) { + if (BIT(i) & (data->touchs ^ touchs)) { + + input_mt_slot(data->input_dev, i); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); +#if FTS_REPORT_PRESSURE_EN + input_report_abs(data->input_dev, ABS_MT_PRESSURE, 0); +#endif + } + } + } + + data->touchs = touchs; + if (event->touch_point == uppoint) { + + input_report_key(data->input_dev, BTN_TOUCH, 0); + } else { + input_report_key(data->input_dev, BTN_TOUCH, event->touch_point > 0); + } + + input_sync(data->input_dev); + + return 0; + +} + +#else +static int ft8006m_input_dev_report_a(struct ts_event *event, struct fts_ts_data *data) +{ + int i = 0; + int uppoint = 0; + int touchs = 0; + for (i = 0; i < event->touch_point; i++) { + + if (event->au8_touch_event[i] == FTS_TOUCH_DOWN || event->au8_touch_event[i] == FTS_TOUCH_CONTACT) { + input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, event->au8_finger_id[i]); +#if FTS_REPORT_PRESSURE_EN +#if FTS_FORCE_TOUCH_EN + if (event->pressure[i] <= 0) { + FTS_ERROR("[B]Illegal pressure: %d", event->pressure[i]); + event->pressure[i] = 1; + } +#else + event->pressure[i] = 0x3f; +#endif + input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]); +#endif + + if (event->area[i] <= 0) { + FTS_ERROR("[B]Illegal touch-major: %d", event->area[i]); + event->area[i] = 1; + } + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]); + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]); + + input_mt_sync(data->input_dev); + +#if FTS_REPORT_PRESSURE_EN + + +#else + FTS_DEBUG("[B]P%d(%d, %d)[tm:%d] DOWN!", event->au8_finger_id[i], event->au16_x[i], event->au16_y[i], event->area[i]); +#endif + } else { + uppoint++; + } + } + + data->touchs = touchs; + if (event->touch_point == uppoint) { + + input_report_key(data->input_dev, BTN_TOUCH, 0); + input_mt_sync(data->input_dev); + } else { + input_report_key(data->input_dev, BTN_TOUCH, event->touch_point > 0); + } + + input_sync(data->input_dev); + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_read_touchdata +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_read_touchdata(struct fts_ts_data *data) +{ + u8 buf[POINT_READ_BUF] = { 0 }; + u8 pointid = FTS_MAX_ID; + int ret = -1; + int i; + struct ts_event *event = &(data->event); + +#if FTS_GESTURE_EN + if (ft8006m_gesture_data.gesture_all_switch) { + u8 state; + if (data->suspended) { + ft8006m_i2c_read_reg(data->client, FTS_REG_GESTURE_EN, &state); + if (state == 1) { + ft8006m_gesture_readdata(data->client); + return 1; + } + } + } +#endif + +#if FTS_PSENSOR_EN + if ((fts_sensor_read_data(data) != 0) && (data->suspended == 1)) { + return 1; + } +#endif + + +#if FTS_READ_TOUCH_BUFFER_DIVIDED + memset(buf, 0xFF, POINT_READ_BUF); + memset(event, 0, sizeof(struct ts_event)); + + buf[0] = 0x00; + ret = ft8006m_i2c_read(data->client, buf, 1, buf, (3 + FTS_ONE_TCH_LEN)); + if (ret < 0) { + FTS_ERROR("%s read touchdata failed.", __func__); + return ret; + } + event->touch_point = 0; + event->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F; + if (event->point_num > data->pdata->max_touch_number) + event->point_num = data->pdata->max_touch_number; + + if (event->point_num > 1) { + buf[9] = 0x09; + ft8006m_i2c_read(data->client, buf+9, 1, buf+9, (event->point_num - 1) * FTS_ONE_TCH_LEN); + } +#else + ret = ft8006m_i2c_read(data->client, buf, 1, buf, POINT_READ_BUF); + if (ret < 0) { + FTS_ERROR("[B]Read touchdata failed, ret: %d", ret); + return ret; + } + +#if FTS_POINT_REPORT_CHECK_EN + ft8006m_point_report_check_queue_work(); +#endif + + memset(event, 0, sizeof(struct ts_event)); + event->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F; + if (event->point_num > data->pdata->max_touch_number) + event->point_num = data->pdata->max_touch_number; + event->touch_point = 0; +#endif + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) + fts_show_touch_buffer(buf, event->point_num); +#endif + + for (i = 0; i < data->pdata->max_touch_number; i++) { + pointid = (buf[FTS_TOUCH_ID_POS + FTS_ONE_TCH_LEN * i]) >> 4; + if (pointid >= FTS_MAX_ID) + break; + else + event->touch_point++; + + event->au16_x[i] = + (s16) (buf[FTS_TOUCH_X_H_POS + FTS_ONE_TCH_LEN * i] & 0x0F) << + 8 | (s16) buf[FTS_TOUCH_X_L_POS + FTS_ONE_TCH_LEN * i]; + event->au16_y[i] = + (s16) (buf[FTS_TOUCH_Y_H_POS + FTS_ONE_TCH_LEN * i] & 0x0F) << + 8 | (s16) buf[FTS_TOUCH_Y_L_POS + FTS_ONE_TCH_LEN * i]; + event->au8_touch_event[i] = + buf[FTS_TOUCH_EVENT_POS + FTS_ONE_TCH_LEN * i] >> 6; + event->au8_finger_id[i] = + (buf[FTS_TOUCH_ID_POS + FTS_ONE_TCH_LEN * i]) >> 4; + event->area[i] = + (buf[FTS_TOUCH_AREA_POS + FTS_ONE_TCH_LEN * i]) >> 4; + event->pressure[i] = + (s16) buf[FTS_TOUCH_PRE_POS + FTS_ONE_TCH_LEN * i]; + + if (0 == event->area[i]) + event->area[i] = 0x09; + + if (0 == event->pressure[i]) + event->pressure[i] = 0x3f; + + if ((event->au8_touch_event[i] == 0 || event->au8_touch_event[i] == 2) && (event->point_num == 0)) { + FTS_DEBUG("abnormal touch data from fw"); + return -EPERM; + } + } + if (event->touch_point == 0) { + return -EPERM; + } + return 0; +} + +/***************************************************************************** +* Name: fts_report_value +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_report_value(struct fts_ts_data *data) +{ + struct ts_event *event = &data->event; + + + + + + if (0 == ft8006m_input_dev_report_key_event(event, data)) { + return; + } + +#if FTS_MT_PROTOCOL_B_EN + ft8006m_input_dev_report_b(event, data); +#else + ft8006m_input_dev_report_a(event, data); +#endif + + + return; + +} + +/***************************************************************************** +* Name: fts_ts_interrupt +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static irqreturn_t fts_ts_interrupt(int irq, void *dev_id) +{ + struct fts_ts_data *fts_ts = dev_id; + int ret = -1; + + if (!fts_ts) { + FTS_ERROR("[INTR]: Invalid fts_ts"); + return IRQ_HANDLED; + } + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_set_intr(1); +#endif + + ret = fts_read_touchdata(ft8006m_wq_data); + + if (ret == 0) { + mutex_lock(&ft8006m_wq_data->report_mutex); + fts_report_value(ft8006m_wq_data); + mutex_unlock(&ft8006m_wq_data->report_mutex); + } + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_set_intr(0); +#endif + + return IRQ_HANDLED; +} + +/***************************************************************************** +* Name: fts_gpio_configure +* Brief: Configure IRQ&RESET GPIO +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_gpio_configure(struct fts_ts_data *data) +{ + int err = 0; + + FTS_FUNC_ENTER(); + /* request irq gpio */ + if (gpio_is_valid(data->pdata->irq_gpio)) { + err = gpio_request(data->pdata->irq_gpio, "fts_irq_gpio"); + if (err) { + FTS_ERROR("[GPIO]irq gpio request failed"); + goto err_irq_gpio_req; + } + + err = gpio_direction_input(data->pdata->irq_gpio); + if (err) { + FTS_ERROR("[GPIO]set_direction for irq gpio failed"); + goto err_irq_gpio_dir; + } + } + /* request reset gpio */ + if (gpio_is_valid(data->pdata->reset_gpio)) { + err = gpio_request(data->pdata->reset_gpio, "fts_reset_gpio"); + if (err) { + FTS_ERROR("[GPIO]reset gpio request failed"); + goto err_irq_gpio_dir; + } + + err = gpio_direction_output(data->pdata->reset_gpio, 1); + if (err) { + FTS_ERROR("[GPIO]set_direction for reset gpio failed"); + goto err_reset_gpio_dir; + } + } + + FTS_FUNC_EXIT(); + return 0; + +err_reset_gpio_dir: + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); +err_irq_gpio_dir: + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); +err_irq_gpio_req: + FTS_FUNC_EXIT(); + return err; +} + + +/***************************************************************************** +* Name: fts_get_dt_coords +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_get_dt_coords(struct device *dev, char *name, + struct fts_ts_platform_data *pdata) { + u32 coords[FTS_COORDS_ARR_SIZE]; + struct property *prop; + struct device_node *np = dev->of_node; + int coords_size, rc; + + prop = of_find_property(np, name, NULL); + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + + coords_size = prop->length / sizeof(u32); + if (coords_size != FTS_COORDS_ARR_SIZE) { + FTS_ERROR("invalid %s", name); + return -EINVAL; + } + + rc = of_property_read_u32_array(np, name, coords, coords_size); + if (rc && (rc != -EINVAL)) { + FTS_ERROR("Unable to read %s", name); + return rc; + } + + if (!strcmp(name, "focaltech,display-coords")) { + if (!strcmp(Lcm_name, "ft8613_ebbg_5p5_1080p_video")) { + pdata->x_min = 0; + pdata->y_min = 0; + pdata->x_max = 1080; + pdata->y_max = 1920; + } else { + pdata->x_min = coords[0]; + pdata->y_min = coords[1]; + pdata->x_max = coords[2]; + pdata->y_max = coords[3]; + } + FTS_INFO("Lcdname:%s \n", Lcm_name); + FTS_INFO("x_min:%d y_min:%d x_max:%d y_max:%d", pdata->x_min, pdata->y_min, pdata->x_max, pdata->y_max); + + } else { + FTS_ERROR("unsupported property %s", name); + return -EINVAL; + } + + return 0; +} + +/***************************************************************************** +* Name: fts_parse_dt +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_parse_dt(struct device *dev, struct fts_ts_platform_data *pdata) +{ + int rc; + struct device_node *np = dev->of_node; + u32 temp_val; + + FTS_FUNC_ENTER(); + + rc = fts_get_dt_coords(dev, "focaltech,display-coords", pdata); + if (rc) + FTS_ERROR("Unable to get display-coords"); + + /* key */ + pdata->have_key = of_property_read_bool(np, "focaltech,have-key"); + if (pdata->have_key) { + rc = of_property_read_u32(np, "focaltech,key-number", &pdata->key_number); + if (rc) { + FTS_ERROR("Key number undefined!"); + } + rc = of_property_read_u32_array(np, "focaltech,keys", + pdata->keys, pdata->key_number); + if (rc) { + FTS_ERROR("Keys undefined!"); + } + rc = of_property_read_u32(np, "focaltech,key-y-coord", &pdata->key_y_coord); + if (rc) { + FTS_ERROR("Key Y Coord undefined!"); + } + rc = of_property_read_u32_array(np, "focaltech,key-x-coords", + pdata->key_x_coords, pdata->key_number); + if (rc) { + FTS_ERROR("Key X Coords undefined!"); + } + FTS_DEBUG("%d: (%d, %d, %d), [%d, %d, %d][%d]", + pdata->key_number, pdata->keys[0], pdata->keys[1], pdata->keys[2], + pdata->key_x_coords[0], pdata->key_x_coords[1], pdata->key_x_coords[2], + pdata->key_y_coord); + } + + /* reset, irq gpio info */ + pdata->reset_gpio = of_get_named_gpio_flags(np, "focaltech,reset-gpio", 0, &pdata->reset_gpio_flags); + if (pdata->reset_gpio < 0) { + FTS_ERROR("Unable to get reset_gpio"); + } + + pdata->irq_gpio = of_get_named_gpio_flags(np, "focaltech,irq-gpio", 0, &pdata->irq_gpio_flags); + if (pdata->irq_gpio < 0) { + FTS_ERROR("Unable to get irq_gpio"); + } + + rc = of_property_read_u32(np, "focaltech,max-touch-number", &temp_val); + if (!rc) { + pdata->max_touch_number = temp_val; + FTS_DEBUG("max_touch_number=%d", pdata->max_touch_number); + } else { + FTS_ERROR("Unable to get max-touch-number"); + pdata->max_touch_number = FTS_MAX_POINTS; + } + + + + FTS_FUNC_EXIT(); + return 0; +} + +#if defined(CONFIG_FB) +/***************************************************************************** +* Name: fb_notifier_callback +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fb_notifier_callback(struct notifier_block *self, + unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct fts_ts_data *fts_data = + container_of(self, struct fts_ts_data, fb_notif); + + if (evdata && evdata->data && event == FB_EVENT_BLANK && + fts_data && fts_data->client) { + blank = evdata->data; + if (*blank == FB_BLANK_UNBLANK) + ft8006m_ts_resume(&fts_data->client->dev); + else if (*blank == FB_BLANK_POWERDOWN) + ft8006m_ts_suspend(&fts_data->client->dev); + } + + return 0; +} +#elif defined(CONFIG_HAS_EARLYSUSPEND) +/***************************************************************************** +* Name: fts_ts_early_suspend +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_early_suspend(struct early_suspend *handler) +{ + struct fts_ts_data *data = container_of(handler, + struct fts_ts_data, + early_suspend); + + ft8006m_ts_suspend(&data->client->dev); +} + +/***************************************************************************** +* Name: fts_ts_late_resume +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_late_resume(struct early_suspend *handler) +{ + struct fts_ts_data *data = container_of(handler, + struct fts_ts_data, + early_suspend); + + ft8006m_ts_resume(&data->client->dev); +} +#endif +#if 1 +static int fts_ts_pinctrl_init(struct fts_ts_data *data) +{ + int retval; + + /* Get pinctrl if target uses pinctrl */ + data->ts_pinctrl = devm_pinctrl_get(&(data->client->dev)); + if (IS_ERR_OR_NULL(data->ts_pinctrl)) { + retval = PTR_ERR(data->ts_pinctrl); + dev_dbg(&data->client->dev, + "Target does not use pinctrl %d\n", retval); + goto err_pinctrl_get; + } + + data->pinctrl_state_active + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_ACTIVE); + if (IS_ERR_OR_NULL(data->pinctrl_state_active)) { + retval = PTR_ERR(data->pinctrl_state_active); + dev_err(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_lookup; + } + + data->pinctrl_state_suspend + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_SUSPEND); + if (IS_ERR_OR_NULL(data->pinctrl_state_suspend)) { + retval = PTR_ERR(data->pinctrl_state_suspend); + dev_err(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_SUSPEND, retval); + goto err_pinctrl_lookup; + } + + data->pinctrl_state_release + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_RELEASE); + if (IS_ERR_OR_NULL(data->pinctrl_state_release)) { + retval = PTR_ERR(data->pinctrl_state_release); + dev_dbg(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_RELEASE, retval); + } + + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(data->ts_pinctrl); +err_pinctrl_get: + data->ts_pinctrl = NULL; + return retval; +} +#endif + +void hardwareinfo_set(void *drv_data) +{ + char firmware_ver[HARDWARE_MAX_ITEM_LONGTH]; + char vendor_for_id[HARDWARE_MAX_ITEM_LONGTH]; + char ic_name[HARDWARE_MAX_ITEM_LONGTH]; + int err; + u8 vendor_id; + u8 ic_type; + u8 fw_ver; + + ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_VENDOR_ID, &vendor_id); + ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_FW_VER, &fw_ver); + ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_CHIP_ID, &ic_type); + + if (vendor_id == BOE_VENDOR) { + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "BOE"); + } else{ + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "Other vendor"); + } + + if (ic_type == TP_IC_FT8006M) { + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT8006M"); + } else{ + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "Other IC"); + } + + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x", vendor_for_id, ic_name, fw_ver); + FTS_INFO("firmware_ver=%s\n", firmware_ver); + + err = hardwareinfo_set_prop(HARDWARE_TP, firmware_ver); + if (err < 0) + return ; + + return ; + +} + + +#ifndef WT_COMPILE_FACTORY_VERSION +static int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, strlen("ffbm")); + FTS_INFO("cmd_line =%s \n", cmd_line); + if (ret == 0) { + FTS_INFO("mode: ffbm\n"); + return 1;/* factory mode*/ + } else { + FTS_INFO("mode: no ffbm\n"); + return 2;/* not factory mode*/ + } + } + FTS_INFO("Normal mode \n"); + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_ts_probe +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_shutdown(struct i2c_client *client) +{ + lcd_power_ctrl(ft8006m_wq_data, 0); +} + +static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct fts_ts_platform_data *pdata; + struct fts_ts_data *data; + struct input_dev *input_dev; + int err; + int i; + u8 reg_addr, reg_value; + + FTS_FUNC_ENTER(); + /* 1. Get Platform data */ + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, + sizeof(struct fts_ts_platform_data), + GFP_KERNEL); + if (!pdata) { + FTS_ERROR("[MEMORY]Failed to allocate memory"); + FTS_FUNC_EXIT(); + return -ENOMEM; + } + err = fts_parse_dt(&client->dev, pdata); + if (err) { + FTS_ERROR("[DTS]DT parsing failed"); + } + } else { + pdata = client->dev.platform_data; + } + + if (!pdata) { + FTS_ERROR("Invalid pdata"); + FTS_FUNC_EXIT(); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + FTS_ERROR("I2C not supported"); + FTS_FUNC_EXIT(); + goto free_platform_data; + } + + data = devm_kzalloc(&client->dev, sizeof(struct fts_ts_data), GFP_KERNEL); + if (!data) { + FTS_ERROR("[MEMORY]Failed to allocate memory"); + FTS_FUNC_EXIT(); + return -ENOMEM; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + FTS_ERROR("[INPUT]Failed to allocate input device"); + FTS_FUNC_EXIT(); + goto free_ts_data; + } + + + + data->input_dev = input_dev; + data->client = client; + data->pdata = pdata; + + ft8006m_wq_data = data; + ft8006m_i2c_client = client; + ft8006m_input_dev = input_dev; + + spin_lock_init(&ft8006m_wq_data->irq_lock); + mutex_init(&ft8006m_wq_data->report_mutex); + + ft8006m_input_dev_init(client, data, input_dev, pdata); + + ft8006m_ctpm_get_upgrade_array(); + + err = fts_gpio_configure(data); + if (err < 0) { + FTS_ERROR("[GPIO]Failed to configure the gpios"); + goto input_destroy; + } + + +#if 1 + err = fts_ts_pinctrl_init(data); + if (!err && data->ts_pinctrl) { + /* + * Pinctrl handle is optional. If pinctrl handle is found + * let pins to be configured in active state. If not + * found continue further without error. + */ + err = pinctrl_select_state(data->ts_pinctrl, + data->pinctrl_state_active); + if (err < 0) { + dev_err(&client->dev, + "failed to select pin to active state"); + } + } +#endif + + +#if FTS_POWER_SOURCE_CUST_EN + fts_power_source_init(data); + fts_power_source_ctrl(data, 1); + lcd_power_ctrl(data, 1); +#endif +ft8006m_reset_proc(200); + + /* check the controller id */ + reg_addr = 0xA3; + for (i = 0; i < 5; i++) { + err = ft8006m_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + msleep(5); + else + break; + + } + if (i >= 5) { + dev_err(&client->dev, "version read failed"); + goto free_gpio; + } + + ft8006m_wait_tp_to_valid(client); + + ft8006m_i2c_read_reg(client, FTS_REG_CHIP_ID, ®_value); + + err = request_threaded_irq(client->irq, NULL, fts_ts_interrupt, + /*pdata->irq_gpio_flags | */IRQF_ONESHOT | IRQF_TRIGGER_FALLING, + client->dev.driver->name, data); + if (err) { + FTS_ERROR("Request irq failed!"); + goto free_gpio; + } + + ft8006m_irq_disable(); + +#if FTS_PSENSOR_EN + if (fts_sensor_init(data) != 0) { + FTS_ERROR("fts_sensor_init failed!"); + FTS_FUNC_EXIT(); + goto irq_free; + } +#endif + +#if FTS_APK_NODE_EN + ft8006m_create_apk_debug_channel(client); +#endif + +#if FTS_SYSFS_NODE_EN + ft8006m_create_sysfs(client); +#endif + +#if FTS_POINT_REPORT_CHECK_EN + ft8006m_point_report_check_init(); +#endif + + ft8006m_ex_mode_init(client); + +#if FTS_GESTURE_EN + ft8006m_gesture_init(input_dev, client); +#endif + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_init(); +#endif + + ft8006m_irq_enable(); + ft8006m_i2c_read_reg(client, FTS_REG_VENDOR_ID, &data->fw_vendor_id); + ft8006m_i2c_read_reg(client, FTS_REG_FW_VER, data->fw_ver); + FTS_INFO("vendor_id=0x%x\n", data->fw_vendor_id); + FTS_INFO("tp_fw=0x%x\n", data->fw_ver[0]); +#if FTS_TEST_EN + ft8006m_test_init(client); +#endif +#if FTS_LOCK_DOWN_INFO + ft8006m_lockdown_init(client); +#endif + +#if FTS_CAT_RAWDATA + ft8006m_rawdata_init(client); +#endif + +#if FTS_AUTO_UPGRADE_EN + err = get_boot_mode(client); + if (err == 0) { + ft8006m_ctpm_upgrade_init(); + } else { + FTS_INFO("Not in normal mode!\n"); + } + +#endif + + +#if defined(CONFIG_FB) + data->fb_notif.notifier_call = fb_notifier_callback; + err = fb_register_client(&data->fb_notif); + if (err) + FTS_ERROR("[FB]Unable to register fb_notifier: %d", err); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + FTS_SUSPEND_LEVEL; + data->early_suspend.suspend = fts_ts_early_suspend; + data->early_suspend.resume = fts_ts_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + hardwareinfo_tp_register(hardwareinfo_set, data); + + FTS_FUNC_EXIT(); + return 0; + +#if FTS_PSENSOR_EN +irq_free: + free_irq(client->irq, data); +#endif +free_gpio: + if (gpio_is_valid(pdata->reset_gpio)) + gpio_free(pdata->reset_gpio); + if (gpio_is_valid(pdata->irq_gpio)) + gpio_free(pdata->irq_gpio); +input_destroy: + input_unregister_device(input_dev); + input_dev = NULL; + input_free_device(input_dev); +free_ts_data: + devm_kfree(&client->dev, data); +free_platform_data: + devm_kfree(&client->dev, pdata); + + return err; + +} + +/***************************************************************************** +* Name: fts_ts_remove +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_ts_remove(struct i2c_client *client) +{ + struct fts_ts_data *data = i2c_get_clientdata(client); + + FTS_FUNC_ENTER(); + cancel_work_sync(&data->touch_event_work); + +#if FTS_PSENSOR_EN + fts_sensor_remove(data); +#endif + +#if FTS_POINT_REPORT_CHECK_EN + ft8006m_point_report_check_exit(); +#endif + +#if FTS_APK_NODE_EN + ft8006m_release_apk_debug_channel(); +#endif + +#if FTS_SYSFS_NODE_EN + ft8006m_remove_sysfs(client); +#endif + + ft8006m_ex_mode_exit(client); + +#if FTS_AUTO_UPGRADE_EN + cancel_work_sync(&ft8006m_fw_update_work); +#endif + +#if defined(CONFIG_FB) + if (fb_unregister_client(&data->fb_notif)) + FTS_ERROR("Error occurred while unregistering fb_notifier."); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&data->early_suspend); +#endif + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + input_unregister_device(data->input_dev); + +#if FTS_TEST_EN + ft8006m_test_exit(client); +#endif + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_exit(); +#endif + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: ft8006m_ts_suspend +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_ts_suspend(struct device *dev) +{ + struct fts_ts_data *data = ft8006m_wq_data; + int retval = 0, i = 0; + + FTS_FUNC_ENTER(); + if (data->suspended) { + FTS_INFO("Already in suspend state"); + FTS_FUNC_EXIT(); + return -EPERM; + } +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_suspend(); +#endif + +#if FTS_GESTURE_EN + if (ft8006m_gesture_data.gesture_all_switch) { + + if (panel_dead2tp) { + FTS_ERROR("%s:panel_dead2tp=%d", __func__, panel_dead2tp); + lcd_power_ctrl(data, 0); + data->suspended = true; + return 0; + } + + retval = ft8006m_gesture_suspend(data->client); + if (retval == 0) { + /* Enter into gesture mode(suspend) */ + retval = enable_irq_wake(ft8006m_wq_data->client->irq); + if (retval) + FTS_ERROR("%s: set_irq_wake failed", __func__); + data->suspended = true; + FTS_FUNC_EXIT(); + return 0; + } + } + +#endif + +#if FTS_PSENSOR_EN + if (fts_sensor_suspend(data) != 0) { + enable_irq_wake(data->client->irq); + data->suspended = true; + return 0; + } +#endif + + ft8006m_irq_disable(); + + for (; i < 5; i++) { + /* TP enter sleep mode */ + retval = ft8006m_i2c_write_reg(data->client, FTS_REG_POWER_MODE, FTS_REG_POWER_MODE_SLEEP_VALUE); + if (retval < 0) { + FTS_ERROR("Set TP to sleep mode fail, ret=%d!", retval); + } else { + FTS_INFO("go into sleep mode successfully\n"); + break; + } + msleep(20); + } + + +if (!(ft8006m_gesture_data.gesture_all_switch)) { + lcd_power_ctrl(data, 0); +} + + data->suspended = true; + + FTS_FUNC_EXIT(); + + return 0; +} +EXPORT_SYMBOL(ft8006m_ts_suspend); +/***************************************************************************** +* Name: fts_ts_resume +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int ft8006m_ts_resume(struct device *dev) +{ + struct fts_ts_data *data = dev_get_drvdata(dev); + + FTS_FUNC_ENTER(); + if (!data->suspended) { + FTS_DEBUG("Already in awake state"); + FTS_FUNC_EXIT(); + return -EPERM; + } + fts_release_all_finger(); + + + + if ((!(ft8006m_gesture_data.gesture_all_switch)) || panel_dead2tp) { + FTS_ERROR("%s:panel_dead2tp=%d", __func__, panel_dead2tp); + panel_dead2tp = 0; + lcd_power_ctrl(data, 1); + } + +#if (!FTS_CHIP_IDC) + ft8006m_reset_proc(200); +#endif + + ft8006m_tp_state_recovery(data->client); + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_resume(); +#endif + +#if FTS_GESTURE_EN + if (ft8006m_gesture_data.gesture_all_switch) { + if (ft8006m_gesture_resume(data->client) == 0) { + int err; + err = disable_irq_wake(data->client->irq); + if (err) + FTS_ERROR("%s: disable_irq_wake failed", __func__); + data->suspended = false; + FTS_FUNC_EXIT(); + return 0; + } + } + +#endif + +#if FTS_PSENSOR_EN + if (fts_sensor_resume(data) != 0) { + disable_irq_wake(data->client->irq); + data->suspended = false; + FTS_FUNC_EXIT(); + return 0; + } +#endif + + data->suspended = false; + + ft8006m_irq_enable(); + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* I2C Driver +*****************************************************************************/ +static const struct i2c_device_id fts_ts_id[] = { + {FTS_DRIVER_NAME, 0}, + {}, +}; +MODULE_DEVICE_TABLE(i2c, fts_ts_id); + +static struct of_device_id fts_match_table[] = { + { .compatible = "focaltech,ft8006m", }, + { }, +}; + +static struct i2c_driver fts_ts_driver = { + .probe = fts_ts_probe, + .remove = fts_ts_remove, + .shutdown = fts_ts_shutdown, + .driver = { + .name = FTS_DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = fts_match_table, + }, + .id_table = fts_ts_id, +}; + +/***************************************************************************** +* Name: fts_ts_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int __init fts_ts_init(void) +{ + int ret = 0; + FTS_FUNC_ENTER(); + ret = i2c_add_driver(&fts_ts_driver); + if (ret != 0) { + FTS_ERROR("Focaltech touch screen driver init failed!"); + } + FTS_FUNC_EXIT(); + return ret; +} + +/***************************************************************************** +* Name: fts_ts_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void __exit fts_ts_exit(void) +{ + i2c_del_driver(&fts_ts_driver); +} + +module_init(fts_ts_init); +module_exit(fts_ts_exit); + +MODULE_AUTHOR("FocalTech Driver Team"); +MODULE_DESCRIPTION("FocalTech Touchscreen Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/FT8006m/focaltech_core.h b/drivers/input/touchscreen/FT8006m/focaltech_core.h new file mode 100755 index 0000000000000..66339c1949316 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_core.h @@ -0,0 +1,212 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ +/***************************************************************************** +* +* File Name: focaltech_core.h + +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +#ifndef __LINUX_FOCALTECH_CORE_H__ +#define __LINUX_FOCALTECH_CORE_H__ +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "focaltech_common.h" +#include "focaltech_flash.h" +#if FTS_PSENSOR_EN +#include +#endif +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define LEN_FLASH_ECC_MAX 0xFFFE + +#define FTS_WORKQUEUE_NAME "fts_wq" + +#define FTS_MAX_POINTS 10 +#define FTS_KEY_WIDTH 50 +#define FTS_ONE_TCH_LEN 6 +#define POINT_READ_BUF (3 + FTS_ONE_TCH_LEN * FTS_MAX_POINTS) + +#define FTS_MAX_ID 0x0F +#define FTS_TOUCH_X_H_POS 3 +#define FTS_TOUCH_X_L_POS 4 +#define FTS_TOUCH_Y_H_POS 5 +#define FTS_TOUCH_Y_L_POS 6 +#define FTS_TOUCH_PRE_POS 7 +#define FTS_TOUCH_AREA_POS 8 +#define FTS_TOUCH_POINT_NUM 2 +#define FTS_TOUCH_EVENT_POS 3 +#define FTS_TOUCH_ID_POS 5 +#define FTS_COORDS_ARR_SIZE 4 + +#define FTS_TOUCH_DOWN 0 +#define FTS_TOUCH_UP 1 +#define FTS_TOUCH_CONTACT 2 + +#define FTS_SYSFS_ECHO_ON(buf) ((strnicmp(buf, "1", 1) == 0) || \ + (strnicmp(buf, "on", 2) == 0)) +#define FTS_SYSFS_ECHO_OFF(buf) ((strnicmp(buf, "0", 1) == 0) || \ + (strnicmp(buf, "off", 3) == 0)) + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + + +struct fts_ts_platform_data { + u32 irq_gpio; + u32 irq_gpio_flags; + u32 reset_gpio; + u32 reset_gpio_flags; + bool have_key; + u32 key_number; + u32 keys[4]; + u32 key_y_coord; + u32 key_x_coords[4]; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; + u32 max_touch_number; +}; + +struct ts_event { + u16 au16_x[FTS_MAX_POINTS]; /*x coordinate */ + u16 au16_y[FTS_MAX_POINTS]; /*y coordinate */ + u16 pressure[FTS_MAX_POINTS]; + u8 au8_touch_event[FTS_MAX_POINTS]; /* touch event: 0 -- down; 1-- up; 2 -- contact */ + u8 au8_finger_id[FTS_MAX_POINTS]; /*touch ID */ + u8 area[FTS_MAX_POINTS]; + u8 touch_point; + u8 point_num; +}; + +struct fts_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct ts_event event; + const struct fts_ts_platform_data *pdata; +#if FTS_PSENSOR_EN + struct fts_psensor_platform_data *psensor_pdata; +#endif + struct work_struct touch_event_work; + struct workqueue_struct *ts_workqueue; + struct regulator *vdd; + struct regulator *vcc_i2c; + struct regulator *lab; + struct regulator *ibb; + struct regulator *panel_iovdd; + spinlock_t irq_lock; + struct mutex report_mutex; + u16 addr; + bool suspended; + u8 fw_ver[3]; + u8 fw_vendor_id; + int touchs; + int irq_disable; + char lockdown_info[128]; + +#if defined(CONFIG_FB) + struct notifier_block fb_notif; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + struct pinctrl_state *pinctrl_state_release; +}; + + +#if FTS_PSENSOR_EN +struct fts_psensor_platform_data { + struct input_dev *input_psensor_dev; + struct sensors_classdev ps_cdev; + int tp_psensor_opened; + char tp_psensor_data; /* 0 near, 1 far */ + struct fts_ts_data *data; +}; + +int fts_sensor_init(struct fts_ts_data *data); +int fts_sensor_read_data(struct fts_ts_data *data); +int fts_sensor_suspend(struct fts_ts_data *data); +int fts_sensor_resume(struct fts_ts_data *data); +int fts_sensor_remove(struct fts_ts_data *data); +#endif + +/***************************************************************************** +* Static variables +*****************************************************************************/ +extern struct i2c_client *ft8006m_i2c_client; +extern struct fts_ts_data *ft8006m_wq_data; +extern struct input_dev *ft8006m_input_dev; + + +#define EACHOPTO_VENDOR 0x80 +#define OFILM_VENDOR 0x51 +#define JUNDA_VENDOR 0x85 +#define HOLITECH_VENDOR 0x82 +#define TXD_VENDOR 0xe9 +#define BOE_VENDOR 0Xda +#define FW_NO_UPGRADE 0 +#define FW_UPGRADING 1 +#define FW_UPGRADED 2 +#define TP_IC_FT8716 0x87 +#define TP_IC_FT8006M 0x80 +extern u8 ft8006m_fw_upgrade_status; +#endif /* __LINUX_FOCALTECH_CORE_H__ */ diff --git a/drivers/input/touchscreen/FT8006m/focaltech_esdcheck.c b/drivers/input/touchscreen/FT8006m/focaltech_esdcheck.c new file mode 100755 index 0000000000000..665ab7fb23f43 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_esdcheck.c @@ -0,0 +1,458 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_esdcheck.c +* +* Author: luoguojin +* +* Created: 2016-08-03 +* +* Abstract: ESD check function +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By luougojin 2016-08-03 +* v1.1: By luougojin 2017-02-15 +* 1. Add LCD_ESD_PATCH to control idc_esdcheck_lcderror +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_ESDCHECK_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define ESDCHECK_WAIT_TIME 4000 +#define LCD_ESD_PATCH 0 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_esdcheck_st { + u8 active:1; /* 1- esd check active, need check esd 0- no esd check */ + u8 suspend:1; + u8 proc_debug:1; /* apk or adb is accessing I2C */ + u8 intr:1; /* 1- Interrupt trigger */ + u8 unused:4; + u8 flow_work_hold_cnt; /* Flow Work Cnt(reg0x91) keep a same value for x times. >=5 times is ESD, need reset */ + u8 flow_work_cnt_last; /* Save Flow Work Cnt(reg0x91) value */ + u32 hardware_reset_cnt; + u32 i2c_nack_cnt; + u32 i2c_dataerror_cnt; +}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct delayed_work fts_esdcheck_work; +static struct workqueue_struct *fts_esdcheck_workqueue; +static struct fts_esdcheck_st fts_esdcheck_data; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ +#if LCD_ESD_PATCH +/***************************************************************************** +* Name: lcd_esdcheck +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int lcd_need_reset; +static int tp_need_recovery; /* LCD reset cause Tp reset */ +int idc_esdcheck_lcderror(void) +{ + u8 val; + int ret; + + FTS_DEBUG("[ESD]Check LCD ESD"); + if ((tp_need_recovery == 1) && (lcd_need_reset == 0)) { + tp_need_recovery = 0; + /* LCD reset, need recover TP state */ + ft8006m_tp_state_recovery(ft8006m_i2c_client); + } + + ret = ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_ESD_SATURATE, &val); + if (ret < 0) { + FTS_ERROR("[ESD]: Read ESD_SATURATE(0xED) failed ret=%d!", ret); + return -EIO; + } + + if (val == 0xAA) { + /* + * 1. Set flag lcd_need_reset = 1; + * 2. LCD driver need reset(recovery) LCD and set lcd_need_reset to 0 + * 3. recover TP state + */ + FTS_INFO("LCD ESD, Execute LCD reset!"); + lcd_need_reset = 1; + tp_need_recovery = 1; + } + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_esdcheck_tp_reset +* Brief: esd check algorithm +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_esdcheck_tp_reset(void) +{ + FTS_FUNC_ENTER(); + + fts_esdcheck_data.flow_work_hold_cnt = 0; + fts_esdcheck_data.hardware_reset_cnt++; + + ft8006m_reset_proc(200); + ft8006m_tp_state_recovery(ft8006m_i2c_client); + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: get_chip_id +* Brief: Read Chip Id 3 times +* Input: +* Output: +* Return: 1 - Read Chip Id 3 times failed +* 0 - Read Chip Id pass +*****************************************************************************/ +static bool get_chip_id(void) +{ + int err = 0; + int i = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + + for (i = 0; i < 3; i++) { + reg_addr = FTS_REG_CHIP_ID; + err = ft8006m_i2c_read(ft8006m_i2c_client, ®_addr, 1, ®_value, 1); + + if (err < 0) { + FTS_ERROR("[ESD]: Read Reg 0xA3 failed ret = %d!!", err); + fts_esdcheck_data.i2c_nack_cnt++; + } else { + if ((reg_value == ft8006m_chip_types.chip_idh) || (reg_value == 0xEF)) /* Upgrade sometimes can't detect */ + break; + else + fts_esdcheck_data.i2c_dataerror_cnt++; + } + } + + /* if can't get correct data in 3 times, then need hardware reset */ + if (i >= 3) { + FTS_ERROR("[ESD]: Read Chip id 3 times failed, need execute TP reset!!"); + return 1; + } + + return 0; +} + +/***************************************************************************** +* Name: get_flow_cnt +* Brief: Read flow cnt(0x91) +* Input: +* Output: +* Return: 1 - Reg 0x91(flow cnt) abnormal: hold a value for 5 times +* 0 - Reg 0x91(flow cnt) normal +*****************************************************************************/ +static bool get_flow_cnt(void) +{ + int err = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + + reg_addr = FTS_REG_FLOW_WORK_CNT; + err = ft8006m_i2c_read(ft8006m_i2c_client, ®_addr, 1, ®_value, 1); + if (err < 0) { + FTS_ERROR("[ESD]: Read Reg 0x91 failed ret = %d!!", err); + fts_esdcheck_data.i2c_nack_cnt++; + } else { + if (reg_value == fts_esdcheck_data.flow_work_cnt_last) { + fts_esdcheck_data.flow_work_hold_cnt++; + } else { + fts_esdcheck_data.flow_work_hold_cnt = 0; + } + + fts_esdcheck_data.flow_work_cnt_last = reg_value; + } + + /* if read flow work cnt 5 times and the value are all the same, then need hardware_reset */ + if (fts_esdcheck_data.flow_work_hold_cnt >= 5) { + FTS_DEBUG("[ESD]: Flow Work Cnt(reg0x91) keep a value for 5 times, need execute TP reset!!"); + return 1; + } + + return 0; +} + +/***************************************************************************** +* Name: esdcheck_algorithm +* Brief: esd check algorithm +* Input: +* Output: +* Return: +*****************************************************************************/ +static int esdcheck_algorithm(void) +{ + int err = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + bool hardware_reset = 0; + + /* 1. esdcheck is interrupt, then return */ + if (fts_esdcheck_data.intr == 1) { + FTS_INFO("[ESD]: In interrupt state, not check esd, return immediately!!"); + return 0; + } + + /* 2. check power state, if suspend, no need check esd */ + if (fts_esdcheck_data.suspend == 1) { + FTS_INFO("[ESD]: In suspend, not check esd, return immediately!!"); + /* because in suspend state, adb can be used, when upgrade FW, will active ESD check(active = 1) + * But in suspend, then will don't queue_delayed_work, when resume, don't check ESD again + */ + fts_esdcheck_data.active = 0; + return 0; + } + + /* 3. check fts_esdcheck_data.proc_debug state, if 1-proc busy, no need check esd*/ + if (fts_esdcheck_data.proc_debug == 1) { + FTS_INFO("[ESD]: In apk or adb command mode, not check esd, return immediately!!"); + return 0; + } + + /* 4. In factory mode, can't check esd */ + reg_addr = FTS_REG_WORKMODE; + err = ft8006m_i2c_read(ft8006m_i2c_client, ®_addr, 1, ®_value, 1); + if (err < 0) { + fts_esdcheck_data.i2c_nack_cnt++; + } else if ((reg_value & 0x70) == FTS_REG_WORKMODE_FACTORY_VALUE) { + FTS_INFO("[ESD]: In factory mode, not check esd, return immediately!!"); + return 0; + } + + /* 5. IDC esd check lcd default:close */ +#if LCD_ESD_PATCH + idc_esdcheck_lcderror(); +#endif + + /* 6. Get Chip ID */ + hardware_reset = get_chip_id(); + + /* 7. get Flow work cnt: 0x91 If no change for 5 times, then ESD and reset */ + if (!hardware_reset) { + + hardware_reset = get_flow_cnt(); + } + + /* 8. If need hardware reset, then handle it here */ + if (hardware_reset == 1) { + fts_esdcheck_tp_reset(); + } + + + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_func +* Brief: fts_esdcheck_func +* Input: +* Output: +* Return: +*****************************************************************************/ +static void esdcheck_func(struct work_struct *work) +{ + FTS_FUNC_ENTER(); + + esdcheck_algorithm(); + + if (fts_esdcheck_data.suspend == 0) { + queue_delayed_work(fts_esdcheck_workqueue, &fts_esdcheck_work, msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } + + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_set_intr +* Brief: interrupt flag (main used in interrupt tp report) +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_set_intr(bool intr) +{ + /* interrupt don't add debug message */ + fts_esdcheck_data.intr = intr; + return 0; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_get_status(void) +* Brief: get current status +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_get_status(void) +{ + /* interrupt don't add debug message */ + return fts_esdcheck_data.active; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_proc_busy +* Brief: When APK or ADB command access TP via driver, then need set proc_debug, +* then will not check ESD. +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_proc_busy(bool proc_debug) +{ + fts_esdcheck_data.proc_debug = proc_debug; + return 0; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_switch +* Brief: FTS esd check function switch. +* Input: enable: 1 - Enable esd check +* 0 - Disable esd check +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_switch(bool enable) +{ + FTS_FUNC_ENTER(); + if (enable == 1) { + if (fts_esdcheck_data.active == 0) { + FTS_INFO("[ESD]: ESD check start!!"); + fts_esdcheck_data.active = 1; + queue_delayed_work(fts_esdcheck_workqueue, &fts_esdcheck_work, msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } + } else { + if (fts_esdcheck_data.active == 1) { + FTS_INFO("[ESD]: ESD check stop!!"); + fts_esdcheck_data.active = 0; + cancel_delayed_work_sync(&fts_esdcheck_work); + } + } + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_suspend +* Brief: Run when tp enter into suspend +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_suspend(void) +{ + FTS_FUNC_ENTER(); + ft8006m_esdcheck_switch(DISABLE); + fts_esdcheck_data.suspend = 1; + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_resume +* Brief: Run when tp resume +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_resume(void) +{ + FTS_FUNC_ENTER(); + ft8006m_esdcheck_switch(ENABLE); + fts_esdcheck_data.suspend = 0; + FTS_FUNC_EXIT(); + return 0; +} + + +/***************************************************************************** +* Name: ft8006m_esdcheck_init +* Brief: Init and create a queue work to check esd +* Input: +* Output: +* Return: < 0: Fail to create esd check queue +*****************************************************************************/ +int ft8006m_esdcheck_init(void) +{ + FTS_FUNC_ENTER(); + + INIT_DELAYED_WORK(&fts_esdcheck_work, esdcheck_func); + fts_esdcheck_workqueue = create_workqueue("fts_esdcheck_wq"); + if (fts_esdcheck_workqueue == NULL) { + FTS_INFO("[ESD]: Failed to create esd work queue!!"); + } + + memset((u8 *)&fts_esdcheck_data, 0, sizeof(struct fts_esdcheck_st)); + + ft8006m_esdcheck_switch(ENABLE); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: ft8006m_esdcheck_exit +* Brief: When FTS TP driver is removed, then call this function to destory work queue +* Input: +* Output: +* Return: +*****************************************************************************/ +int ft8006m_esdcheck_exit(void) +{ + FTS_FUNC_ENTER(); + + destroy_workqueue(fts_esdcheck_workqueue); + + FTS_FUNC_EXIT(); + return 0; +} +#endif /* FTS_ESDCHECK_EN */ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_ex_fun.c b/drivers/input/touchscreen/FT8006m/focaltech_ex_fun.c new file mode 100644 index 0000000000000..b5525f28a1ecd --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_ex_fun.c @@ -0,0 +1,1236 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: Focaltech_ex_fun.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +/*create apk debug channel*/ +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_AUTOCLB 4 +#define PROC_UPGRADE_INFO 5 +#define PROC_WRITE_DATA 6 +#define PROC_READ_DATA 7 +#define PROC_SET_TEST_FLAG 8 +#define PROC_SET_SLAVE_ADDR 10 +#define PROC_HW_RESET 11 +#define PROC_NAME "ftxxxx-debug" +#define WRITE_BUF_SIZE 512 +#define READ_BUF_SIZE 512 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static unsigned char proc_operate_mode = PROC_UPGRADE; +static struct proc_dir_entry *fts_proc_entry; +static struct +{ + int op; + int reg; + int value; + int result; +} g_rwreg_result; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if FTS_ESDCHECK_EN +static void esd_process(u8 *writebuf, int buflen, bool flag) +{ + if (flag) { + if ((writebuf[1] == 0xFC) && (writebuf[2] == 0x55) && (buflen == 0x03)) { + /* Upgrade command */ + FTS_DEBUG("[ESD]: Upgrade command(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + ft8006m_esdcheck_switch(DISABLE); + } else if ((writebuf[1] == 0x00) && (writebuf[2] == 0x40) && (buflen == 0x03)) { + /* factory mode bit 4 5 6 */ + FTS_DEBUG("[ESD]: Entry factory mode(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + ft8006m_esdcheck_switch(DISABLE); + } else if ((writebuf[1] == 0x00) && (writebuf[2] == 0x00) && (buflen == 0x03)) { + /* normal mode bit 4 5 6 */ + FTS_DEBUG("[ESD]: Exit factory mode(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + ft8006m_esdcheck_switch(ENABLE); + } else { + ft8006m_esdcheck_proc_busy(1); + } + } else { + if ((writebuf[1] == 0x07) && (buflen == 0x02)) { + FTS_DEBUG("[ESD]: Upgrade finish-trigger reset(07)(%x %x)!!", writebuf[0], writebuf[1]); + ft8006m_esdcheck_switch(ENABLE); + } else { + ft8006m_esdcheck_proc_busy(0); + } + } +} +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) +/*interface of write proc*/ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static ssize_t fts_debug_write(struct file *filp, const char __user *buff, size_t count, loff_t *ppos) +{ + unsigned char writebuf[WRITE_BUF_SIZE]; + int buflen = count; + int writelen = 0; + int ret = 0; + char tmp[25]; + + if (copy_from_user(&writebuf, buff, buflen)) { + FTS_DEBUG("[APK]: copy from user error!!"); + return -EFAULT; + } +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 1); +#endif + proc_operate_mode = writebuf[0]; + switch (proc_operate_mode) { + case PROC_UPGRADE: + { + char upgrade_file_path[FILE_NAME_LENGTH]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + FTS_DEBUG("%s\n", upgrade_file_path); + ft8006m_irq_disable(); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(DISABLE); +#endif + if (ft8006m_updatefun_curr.upgrade_with_app_bin_file) + ret = ft8006m_updatefun_curr.upgrade_with_app_bin_file(ft8006m_i2c_client, upgrade_file_path); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(ENABLE); +#endif + ft8006m_irq_enable(); + if (ret < 0) { + FTS_ERROR("[APK]: upgrade failed!!"); + } + } + break; + + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]); +#if FTS_ESDCHECK_EN + if (writebuf[1] == 0) { + ft8006m_esdcheck_switch(DISABLE); + } else { + ft8006m_esdcheck_switch(ENABLE); + } +#endif + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_SET_SLAVE_ADDR: + + ret = ft8006m_i2c_client->addr; + FTS_DEBUG("Original i2c addr 0x%x ", ret<<1); + if (writebuf[1] != ft8006m_i2c_client->addr) { + ft8006m_i2c_client->addr = writebuf[1]; + FTS_DEBUG("Change i2c addr 0x%x to 0x%x", ret<<1, writebuf[1]<<1); + + } + break; + + case PROC_HW_RESET: + + sprintf(tmp, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_DEBUG("Begin HW Reset"); + ft8006m_reset_proc(1); + } + + break; + + case PROC_AUTOCLB: + FTS_DEBUG("[APK]: autoclb!!"); + ft8006m_ctpm_auto_clb(ft8006m_i2c_client); + break; + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = count - 1; + if (writelen > 0) { + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + } + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 0); +#endif + + if (ret < 0) { + return ret; + } else { + return count; + } +} + +/* interface of read proc */ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static ssize_t fts_debug_read(struct file *filp, char __user *buff, size_t count, loff_t *ppos) +{ + int ret = 0; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + unsigned char buf[READ_BUF_SIZE]; + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(1); +#endif + switch (proc_operate_mode) { + case PROC_UPGRADE: + + regaddr = FTS_REG_FW_VER; + ret = ft8006m_i2c_read_reg(ft8006m_i2c_client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = ft8006m_i2c_read(ft8006m_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = ft8006m_i2c_read(ft8006m_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + + if (copy_to_user(buff, buf, num_read_chars)) { + FTS_ERROR("[APK]: copy to user error!!"); + return -EFAULT; + } + + return num_read_chars; +} +static const struct file_operations fts_proc_fops = { + .owner = THIS_MODULE, + .read = fts_debug_read, + .write = fts_debug_write, +}; +#else +/* interface of write proc */ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static int fts_debug_write(struct file *filp, + const char __user *buff, unsigned long len, void *data) +{ + unsigned char writebuf[WRITE_BUF_SIZE]; + int buflen = len; + int writelen = 0; + int ret = 0; + char tmp[25]; + + if (copy_from_user(&writebuf, buff, buflen)) { + FTS_ERROR("[APK]: copy from user error!!"); + return -EFAULT; + } +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 1); +#endif + proc_operate_mode = writebuf[0]; + switch (proc_operate_mode) { + + case PROC_UPGRADE: + { + char upgrade_file_path[FILE_NAME_LENGTH]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + FTS_DEBUG("%s\n", upgrade_file_path); + ft8006m_irq_disable(); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(DISABLE); +#endif + if (ft8006m_updatefun_curr.upgrade_with_app_bin_file) + ret = ft8006m_updatefun_curr.upgrade_with_app_bin_file(ft8006m_i2c_client, upgrade_file_path); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(ENABLE); +#endif + ft8006m_irq_enable(); + if (ret < 0) { + FTS_ERROR("[APK]: upgrade failed!!"); + } + } + break; + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]); +#if FTS_ESDCHECK_EN + if (writebuf[1] == 0) { + ft8006m_esdcheck_switch(DISABLE); + } else { + ft8006m_esdcheck_switch(ENABLE); + } +#endif + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!n"); + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_SET_SLAVE_ADDR: + + ret = ft8006m_i2c_client->addr; + FTS_DEBUG("Original i2c addr 0x%x ", ret<<1); + if (writebuf[1] != ft8006m_i2c_client->addr) { + ft8006m_i2c_client->addr = writebuf[1]; + FTS_DEBUG("Change i2c addr 0x%x to 0x%x", ret<<1, writebuf[1]<<1); + + } + break; + + case PROC_HW_RESET: + + sprintf(tmp, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_DEBUG("Begin HW Reset"); + ft8006m_reset_proc(1); + } + + break; + + case PROC_AUTOCLB: + FTS_DEBUG("[APK]: autoclb!!"); + ft8006m_ctpm_auto_clb(ft8006m_i2c_client); + break; + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = len - 1; + if (writelen > 0) { + ret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + } + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 0); +#endif + + if (ret < 0) { + return ret; + } else { + return len; + } +} + +/* interface of read proc */ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static int fts_debug_read(char *page, char **start, + off_t off, int count, int *eof, void *data) +{ + int ret = 0; + unsigned char buf[READ_BUF_SIZE]; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(1); +#endif + switch (proc_operate_mode) { + case PROC_UPGRADE: + + regaddr = FTS_REG_FW_VER; + ret = ft8006m_i2c_read_reg(ft8006m_i2c_client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = ft8006m_i2c_read(ft8006m_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = ft8006m_i2c_read(ft8006m_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + + memcpy(page, buf, num_read_chars); + return num_read_chars; +} +#endif +/************************************************************************ +* Name: ft8006m_create_apk_debug_channel +* Brief: create apk debug channel +* Input: i2c info +* Output: no +* Return: success =0 +***********************************************************************/ +int ft8006m_create_apk_debug_channel(struct i2c_client *client) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + fts_proc_entry = proc_create(PROC_NAME, 0777, NULL, &fts_proc_fops); +#else + fts_proc_entry = create_proc_entry(PROC_NAME, 0777, NULL); +#endif + if (NULL == fts_proc_entry) { + FTS_ERROR("Couldn't create proc entry!"); + return -ENOMEM; + } else { + FTS_INFO("Create proc entry success!"); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)) + fts_proc_entry->write_proc = fts_debug_write; + fts_proc_entry->read_proc = fts_debug_read; +#endif + } + return 0; +} +/************************************************************************ +* Name: ft8006m_release_apk_debug_channel +* Brief: release apk debug channel +* Input: no +* Output: no +* Return: no +***********************************************************************/ +void ft8006m_release_apk_debug_channel(void) +{ + + if (fts_proc_entry) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + proc_remove(fts_proc_entry); +#else + remove_proc_entry(PROC_NAME, NULL); +#endif +} + +/* + * fts_hw_reset interface + */ +static ssize_t fts_hw_reset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} +static ssize_t fts_hw_reset_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t count = 0; + + ft8006m_reset_proc(200); + + count = snprintf(buf, PAGE_SIZE, "hw reset executed\n"); + + return count; +} + +/* + * fts_irq interface + */ +static ssize_t fts_irq_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[EX-FUN]enable irq"); + ft8006m_irq_enable(); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[EX-FUN]disable irq"); + ft8006m_irq_disable(); + } + return count; +} + +static ssize_t fts_irq_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return -EPERM; +} + +/************************************************************************ +* Name: fts_tpfwver_show +* Brief: show tp fw vwersion +* Input: device, device attribute, char buf +* Output: no +* Return: char number +***********************************************************************/ +static ssize_t fts_tpfwver_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t num_read_chars = 0; + u8 fwver = 0; + + mutex_lock(&ft8006m_input_dev->mutex); + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(1); +#endif + if (ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_FW_VER, &fwver) < 0) { + num_read_chars = snprintf(buf, PAGE_SIZE, "I2c transfer error!\n"); + } +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + if (fwver == 255) + num_read_chars = snprintf(buf, PAGE_SIZE, "get tp fw version fail!\n"); + else { + num_read_chars = snprintf(buf, PAGE_SIZE, "%02X\n", fwver); + } + + mutex_unlock(&ft8006m_input_dev->mutex); + + return num_read_chars; +} +/************************************************************************ +* Name: fts_tpfwver_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tpfwver_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +static int fts_is_hex_char(const char ch) +{ + int result = 0; + if (ch >= '0' && ch <= '9') { + result = 1; + } else if (ch >= 'a' && ch <= 'f') { + result = 1; + } else if (ch >= 'A' && ch <= 'F') { + result = 1; + } else { + result = 0; + } + + return result; +} + +static int fts_hex_char_to_int(const char ch) +{ + int result = 0; + if (ch >= '0' && ch <= '9') { + result = (int)(ch - '0'); + } else if (ch >= 'a' && ch <= 'f') { + result = (int)(ch - 'a') + 10; + } else if (ch >= 'A' && ch <= 'F') { + result = (int)(ch - 'A') + 10; + } else { + result = -1; + } + + return result; +} + +static int fts_hex_to_str(char *hex, int iHexLen, char *ch, int *iChLen) +{ + int high = 0; + int low = 0; + int tmp = 0; + int i = 0; + int iCharLen = 0; + if (hex == NULL || ch == NULL) { + return -EPERM; + } + + FTS_DEBUG("iHexLen: %d in function:%s!!\n\n", iHexLen, __func__); + + if (iHexLen % 2 == 1) { + return -ENOENT; + } + + for (i = 0; i < iHexLen; i += 2) { + high = fts_hex_char_to_int(hex[i]); + if (high < 0) { + ch[iCharLen] = '\0'; + return -ESRCH; + } + + low = fts_hex_char_to_int(hex[i+1]); + if (low < 0) { + ch[iCharLen] = '\0'; + return -ESRCH; + } + tmp = (high << 4) + low; + ch[iCharLen++] = (char)tmp; + } + ch[iCharLen] = '\0'; + *iChLen = iCharLen; + FTS_DEBUG("iCharLen: %d, iChLen: %d in function:%s!!\n\n", iCharLen, *iChLen, __func__); + return 0; +} + +static void fts_str_to_bytes(char *bufStr, int iLen, char *uBytes, int *iBytesLen) +{ + int i = 0; + int iNumChLen = 0; + + *iBytesLen = 0; + + for (i = 0; i < iLen; i++) { + if (fts_is_hex_char(bufStr[i])) { + bufStr[iNumChLen++] = bufStr[i]; + } + } + + bufStr[iNumChLen] = '\0'; + + fts_hex_to_str(bufStr, iNumChLen, uBytes, iBytesLen); +} +/************************************************************************ +* Name: fts_tprwreg_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tprwreg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&ft8006m_input_dev->mutex); + + if (!g_rwreg_result.op) { + if (g_rwreg_result.result == 0) { + count = sprintf(buf, "Read %02X: %02X\n", g_rwreg_result.reg, g_rwreg_result.value); + } else { + count = sprintf(buf, "Read %02X failed, ret: %d\n", g_rwreg_result.reg, g_rwreg_result.result); + } + } else { + if (g_rwreg_result.result == 0) { + count = sprintf(buf, "Write %02X, %02X success\n", g_rwreg_result.reg, g_rwreg_result.value); + } else { + count = sprintf(buf, "Write %02X failed, ret: %d\n", g_rwreg_result.reg, g_rwreg_result.result); + } + } + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_tprwreg_store +* Brief: read/write register +* Input: device, device attribute, char buf, char count +* Output: print register value +* Return: char count +***********************************************************************/ +static ssize_t fts_tprwreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + ssize_t num_read_chars = 0; + int retval; + long unsigned int wmreg = 0; + u8 regaddr = 0xff, regvalue = 0xff; + u8 valbuf[5] = {0}; + + memset(valbuf, 0, sizeof(valbuf)); + mutex_lock(&ft8006m_input_dev->mutex); + num_read_chars = count - 1; + if (num_read_chars != 2) { + if (num_read_chars != 4) { + FTS_ERROR("please input 2 or 4 character"); + goto error_return; + } + } + memcpy(valbuf, buf, num_read_chars); + retval = kstrtoul(valbuf, 16, &wmreg); + fts_str_to_bytes((char *)buf, num_read_chars, valbuf, &retval); + + if (1 == retval) { + regaddr = valbuf[0]; + retval = 0; + } else if (2 == retval) { + regaddr = valbuf[0]; + regvalue = valbuf[1]; + retval = 0; + } else + retval = -1; + + if (0 != retval) { + FTS_ERROR("%s() - ERROR: Could not convert the given input to a number. The given input was: \"%s\"", __FUNCTION__, buf); + goto error_return; + } +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(1); +#endif + if (2 == num_read_chars) { + g_rwreg_result.op = 0; + g_rwreg_result.reg = regaddr; + /*read register*/ + regaddr = wmreg; + g_rwreg_result.result = ft8006m_i2c_read_reg(client, regaddr, ®value); + if (g_rwreg_result.result < 0) { + FTS_ERROR("Could not read the register(0x%02x)", regaddr); + } else { + FTS_INFO("the register(0x%02x) is 0x%02x", regaddr, regvalue); + g_rwreg_result.value = regvalue; + g_rwreg_result.result = 0; + } + } else { + regaddr = wmreg>>8; + regvalue = wmreg; + + g_rwreg_result.op = 1; + g_rwreg_result.reg = regaddr; + g_rwreg_result.value = regvalue; + g_rwreg_result.result = ft8006m_i2c_write_reg(client, regaddr, regvalue); + if (g_rwreg_result.result < 0) { + FTS_ERROR("Could not write the register(0x%02x)", regaddr); + + } else { + FTS_INFO("Write 0x%02x into register(0x%02x) successful", regvalue, regaddr); + g_rwreg_result.result = 0; + } + } +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif +error_return: + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_fwupdate_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_fwupdate_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_fwupdate_store +* Brief: upgrade from *.i +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_fwupdate_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&ft8006m_input_dev->mutex); + ft8006m_irq_disable(); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(DISABLE); +#endif + if (ft8006m_updatefun_curr.upgrade_with_app_i_file) + ft8006m_updatefun_curr.upgrade_with_app_i_file(client); +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN + if (ft8006m_updatefun_curr.upgrade_with_lcd_cfg_i_file) + ft8006m_updatefun_curr.upgrade_with_lcd_cfg_i_file(client); +#endif +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(ENABLE); +#endif + ft8006m_irq_enable(); + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_fwupgradeapp_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_fwupgradeapp_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_fwupgradeapp_store +* Brief: upgrade from app.bin +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_fwupgradeapp_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + char fwname[FILE_NAME_LENGTH]; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + + mutex_lock(&ft8006m_input_dev->mutex); + ft8006m_irq_disable(); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(DISABLE); +#endif + if (ft8006m_updatefun_curr.upgrade_with_app_bin_file) + ft8006m_updatefun_curr.upgrade_with_app_bin_file(client, fwname); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(ENABLE); +#endif + ft8006m_irq_enable(); + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_driverversion_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_driverversion_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&ft8006m_input_dev->mutex); + + count = sprintf(buf, FTS_DRIVER_VERSION "\n"); + + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_driverversion_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_driverversion_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +#if FTS_ESDCHECK_EN +/************************************************************************ +* Name: fts_esdcheck_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_esdcheck_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + mutex_lock(&ft8006m_input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_DEBUG("enable esdcheck"); + ft8006m_esdcheck_switch(ENABLE); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_DEBUG("disable esdcheck"); + ft8006m_esdcheck_switch(DISABLE); + } + mutex_unlock(&ft8006m_input_dev->mutex); + + return -EPERM; +} + +/************************************************************************ +* Name: fts_esdcheck_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_esdcheck_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&ft8006m_input_dev->mutex); + + count = sprintf(buf, "Esd check: %s\n", ft8006m_esdcheck_get_status() ? "On" : "Off"); + + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +#endif +/************************************************************************ +* Name: fts_module_config_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_module_config_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + + mutex_lock(&ft8006m_input_dev->mutex); + + count += sprintf(buf, "FTS_CHIP_TYPE: \t\t\t%04X\n", FTS_CHIP_TYPE); + count += sprintf(buf+count, "FTS_DEBUG_EN: \t\t\t%s\n", FTS_DEBUG_EN ? "ON" : "OFF"); +#if defined(FTS_MT_PROTOCOL_B_EN) + count += sprintf(buf+count, "TS_MT_PROTOCOL_B_EN: \t\t%s\n", FTS_MT_PROTOCOL_B_EN ? "ON" : "OFF"); +#endif + count += sprintf(buf+count, "FTS_GESTURE_EN: \t\t%s\n", FTS_GESTURE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_ESDCHECK_EN: \t\t%s\n", FTS_ESDCHECK_EN ? "ON" : "OFF"); +#if defined(FTS_PSENSOR_EN) + count += sprintf(buf+count, "FTS_PSENSOR_EN: \t\t%s\n", FTS_PSENSOR_EN ? "ON" : "OFF"); +#endif + count += sprintf(buf+count, "FTS_GLOVE_EN: \t\t\t%s\n", FTS_GLOVE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_COVER_EN: \t\t%s\n", FTS_COVER_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_CHARGER_EN: \t\t\t%s\n", FTS_CHARGER_EN ? "ON" : "OFF"); + + count += sprintf(buf+count, "FTS_REPORT_PRESSURE_EN: \t\t%s\n", FTS_REPORT_PRESSURE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_FORCE_TOUCH_EN: \t\t%s\n", FTS_FORCE_TOUCH_EN ? "ON" : "OFF"); + + count += sprintf(buf+count, "FTS_TEST_EN: \t\t\t%s\n", FTS_TEST_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_APK_NODE_EN: \t\t%s\n", FTS_APK_NODE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_POWER_SOURCE_CUST_EN: \t%s\n", FTS_POWER_SOURCE_CUST_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_AUTO_UPGRADE_EN: \t\t%s\n", FTS_AUTO_UPGRADE_EN ? "ON" : "OFF"); + + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_module_config_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_module_config_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_show_log_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_show_log_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&ft8006m_input_dev->mutex); + + count = sprintf(buf, "Log: %s\n", ft8006m_g_show_log ? "On" : "Off"); + + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_show_log_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_show_log_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + + mutex_lock(&ft8006m_input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_DEBUG("enable show log info/error"); + ft8006m_g_show_log = 1; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_DEBUG("disable show log info/error"); + ft8006m_g_show_log = 0; + } + mutex_unlock(&ft8006m_input_dev->mutex); + return count; +} +/************************************************************************ +* Name: fts_dumpreg_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_dumpreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_dumpreg_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_dumpreg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + char tmp[256]; + int count = 0; + u8 regvalue = 0; + struct i2c_client *client; + + mutex_lock(&ft8006m_input_dev->mutex); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(1); +#endif + client = container_of(dev, struct i2c_client, dev); + ft8006m_i2c_read_reg(client, FTS_REG_POWER_MODE, ®value); + count += sprintf(tmp + count, "Power Mode:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_FW_VER, ®value); + count += sprintf(tmp + count, "FW Ver:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_VENDOR_ID, ®value); + count += sprintf(tmp + count, "Vendor ID:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_LCD_BUSY_NUM, ®value); + count += sprintf(tmp + count, "LCD Busy Number:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_GESTURE_EN, ®value); + count += sprintf(tmp + count, "Gesture Mode:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_CHARGER_MODE_EN, ®value); + count += sprintf(tmp + count, "charge stat:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_INT_CNT, ®value); + count += sprintf(tmp + count, "INT count:0x%02x\n", regvalue); + + ft8006m_i2c_read_reg(client, FTS_REG_FLOW_WORK_CNT, ®value); + count += sprintf(tmp + count, "ESD count:0x%02x\n", regvalue); +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_proc_busy(0); +#endif + memcpy(buf, tmp, count); + mutex_unlock(&ft8006m_input_dev->mutex); + return count; +} + +/****************************************/ +/* sysfs */ +/* get the fw version +* example:cat fw_version +*/ +static DEVICE_ATTR(fts_fw_version, S_IRUGO|S_IWUSR, fts_tpfwver_show, fts_tpfwver_store); + +/* upgrade from *.i +* example: echo 1 > fw_update +*/ +static DEVICE_ATTR(fts_fw_update, S_IRUGO|S_IWUSR, fts_fwupdate_show, fts_fwupdate_store); +/* read and write register +* read example: echo 88 > rw_reg ---read register 0x88 +* write example:echo 8807 > rw_reg ---write 0x07 into register 0x88 +* +* note:the number of input must be 2 or 4.if it not enough,please fill in the 0. +*/ +static DEVICE_ATTR(fts_rw_reg, S_IRUGO|S_IWUSR, fts_tprwreg_show, fts_tprwreg_store); +/* upgrade from app.bin +* example:echo "*_app.bin" > upgrade_app +*/ +static DEVICE_ATTR(fts_upgrade_app, S_IRUGO|S_IWUSR, fts_fwupgradeapp_show, fts_fwupgradeapp_store); +static DEVICE_ATTR(fts_driver_version, S_IRUGO|S_IWUSR, fts_driverversion_show, fts_driverversion_store); +static DEVICE_ATTR(fts_dump_reg, S_IRUGO|S_IWUSR, fts_dumpreg_show, fts_dumpreg_store); +static DEVICE_ATTR(fts_show_log, S_IRUGO|S_IWUSR, fts_show_log_show, fts_show_log_store); +static DEVICE_ATTR(fts_module_config, S_IRUGO|S_IWUSR, fts_module_config_show, fts_module_config_store); +static DEVICE_ATTR(fts_hw_reset, S_IRUGO|S_IWUSR, fts_hw_reset_show, fts_hw_reset_store); +static DEVICE_ATTR(fts_irq, S_IRUGO|S_IWUSR, fts_irq_show, fts_irq_store); + +#if FTS_ESDCHECK_EN +static DEVICE_ATTR(fts_esd_check, S_IRUGO|S_IWUSR, fts_esdcheck_show, fts_esdcheck_store); +#endif + +/* add your attr in here*/ +static struct attribute *fts_attributes[] = { + &dev_attr_fts_fw_version.attr, + &dev_attr_fts_fw_update.attr, + &dev_attr_fts_rw_reg.attr, + &dev_attr_fts_dump_reg.attr, + &dev_attr_fts_upgrade_app.attr, + &dev_attr_fts_driver_version.attr, + &dev_attr_fts_show_log.attr, + &dev_attr_fts_module_config.attr, + &dev_attr_fts_hw_reset.attr, + &dev_attr_fts_irq.attr, +#if FTS_ESDCHECK_EN + &dev_attr_fts_esd_check.attr, +#endif + NULL +}; + +static struct attribute_group fts_attribute_group = { + .attrs = fts_attributes +}; + +/************************************************************************ +* Name: ft8006m_create_sysfs +* Brief: create sysfs for debug +* Input: i2c info +* Output: no +* Return: success =0 +***********************************************************************/ +int ft8006m_create_sysfs(struct i2c_client *client) +{ + int err; + err = sysfs_create_group(&client->dev.kobj, &fts_attribute_group); + if (0 != err) { + FTS_ERROR("[EX]: sysfs_create_group() failed!!"); + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return -EIO; + } else { + FTS_INFO("[EX]: sysfs_create_group() succeeded!!"); + } + return err; +} +/************************************************************************ +* Name: ft8006m_remove_sysfs +* Brief: remove sys +* Input: i2c info +* Output: no +* Return: no +***********************************************************************/ +int ft8006m_remove_sysfs(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return 0; +} diff --git a/drivers/input/touchscreen/FT8006m/focaltech_ex_mode.c b/drivers/input/touchscreen/FT8006m/focaltech_ex_mode.c new file mode 100755 index 0000000000000..43327f7fd371d --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_ex_mode.c @@ -0,0 +1,347 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_ex_mode.c +* +* Author: Liu WeiGuang +* +* Created: 2016-08-31 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* 2.Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* 3.Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_mode_flag { + int fts_glove_mode_flag; + int fts_cover_mode_flag; + int fts_charger_mode_flag; +}; + +struct fts_mode_flag g_ft8006m_mode_flag; + +/***************************************************************************** +* 4.Static variables +*****************************************************************************/ + +/***************************************************************************** +* 5.Global variable or extern global variabls/functions +*****************************************************************************/ +int ft8006m_enter_glove_mode(struct i2c_client *client, int mode); +int ft8006m_glove_init(struct i2c_client *client); +int ft8006m_glove_exit(struct i2c_client *client); + +int ft8006m_enter_cover_mode(struct i2c_client *client, int mode); +int ft8006m_cover_init(struct i2c_client *client); +int ft8006m_cover_exit(struct i2c_client *client); + +int ft8006m_enter_charger_mode(struct i2c_client *client, int mode); +int ft8006m_charger_init(struct i2c_client *client); +int ft8006m_charger_exit(struct i2c_client *client); + +/***************************************************************************** +* 6.Static function prototypes +*******************************************************************************/ + +#if FTS_GLOVE_EN +static ssize_t fts_touch_glove_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Glove: %s\n", g_ft8006m_mode_flag.fts_glove_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_glove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_ft8006m_mode_flag.fts_glove_mode_flag) { + FTS_INFO("[Mode]enter glove mode"); + ret = ft8006m_enter_glove_mode(ft8006m_i2c_client, true); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_glove_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_ft8006m_mode_flag.fts_glove_mode_flag) { + FTS_INFO("[Mode]exit glove mode"); + ret = ft8006m_enter_glove_mode(ft8006m_i2c_client, false); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_glove_mode_flag = false; + } + } + } + FTS_INFO("[Mode]glove mode status: %d", g_ft8006m_mode_flag.fts_glove_mode_flag); + return count; +} + +/************************************************************************ +* Name: ft8006m_enter_glove_mode +* Brief: change glove mode +* Input: glove mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int ft8006m_enter_glove_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_GLOVE_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = ft8006m_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_ERROR("[Mode]ft8006m_enter_glove_mode write value fail"); + } + + return ret ; + +} + +/* read and write glove mode +* read example: cat fts_touch_glove_mode---read glove mode +* write example:echo 01 > fts_touch_glove_mode ---write glove mode to 01 +* +*/ +static DEVICE_ATTR (fts_glove_mode, S_IRUGO|S_IWUSR, fts_touch_glove_show, fts_touch_glove_store); + +#endif + +#if FTS_COVER_EN +static ssize_t fts_touch_cover_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Cover: %s\n", g_ft8006m_mode_flag.fts_cover_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_cover_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_ft8006m_mode_flag.fts_cover_mode_flag) { + FTS_INFO("[Mode]enter cover mode"); + ret = ft8006m_enter_cover_mode(ft8006m_i2c_client, true); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_cover_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_ft8006m_mode_flag.fts_cover_mode_flag) { + FTS_INFO("[Mode]exit cover mode"); + ret = ft8006m_enter_cover_mode(ft8006m_i2c_client, false); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_cover_mode_flag = false; + } + } + } + FTS_INFO("[Mode]cover mode status: %d", g_ft8006m_mode_flag.fts_cover_mode_flag); + return count; +} + +/************************************************************************ +* Name: ft8006m_enter_cover_mode +* Brief: change cover mode +* Input: cover mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int ft8006m_enter_cover_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_COVER_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = ft8006m_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_ERROR("[Mode] ft8006m_enter_cover_mode write value fail \n"); + } + + return ret ; + +} + +/* read and write cover mode +* read example: cat fts_touch_cover_mode---read cover mode +* write example:echo 01 > fts_touch_cover_mode ---write cover mode to 01 +* +*/ +static DEVICE_ATTR (fts_cover_mode, S_IRUGO|S_IWUSR, fts_touch_cover_show, fts_touch_cover_store); + +#endif + +#if FTS_CHARGER_EN +static ssize_t fts_touch_charger_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Charger: %s\n", g_ft8006m_mode_flag.fts_charger_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_charger_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_ft8006m_mode_flag.fts_charger_mode_flag) { + FTS_INFO("[Mode]enter charger mode"); + ret = ft8006m_enter_charger_mode(ft8006m_i2c_client, true); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_charger_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_ft8006m_mode_flag.fts_charger_mode_flag) { + FTS_INFO("[Mode]exit charger mode"); + ret = ft8006m_enter_charger_mode(ft8006m_i2c_client, false); + if (ret >= 0) { + g_ft8006m_mode_flag.fts_charger_mode_flag = false; + } + } + } + FTS_INFO("[Mode]charger mode status: %d", g_ft8006m_mode_flag.fts_charger_mode_flag); + return count; +} + +/************************************************************************ +* Name: ft8006m_enter_charger_mode +* Brief: change charger mode +* Input: charger mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int ft8006m_enter_charger_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_CHARGER_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = ft8006m_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_DEBUG("[Mode]ft8006m_enter_charger_mode write value fail"); + } + + return ret ; + +} + +/* read and write charger mode +* read example: cat fts_touch_charger_mode---read charger mode +* write example:echo 01 > fts_touch_charger_mode ---write charger mode to 01 +* +*/ +static DEVICE_ATTR (fts_charger_mode, S_IRUGO|S_IWUSR, fts_touch_charger_show, fts_touch_charger_store); + +#endif + +static struct attribute *fts_touch_mode_attrs[] = { +#if FTS_GLOVE_EN + &dev_attr_fts_glove_mode.attr, +#endif + +#if FTS_COVER_EN + &dev_attr_fts_cover_mode.attr, +#endif + +#if FTS_CHARGER_EN + &dev_attr_fts_charger_mode.attr, +#endif + + NULL, +}; + +static struct attribute_group fts_touch_mode_group = { + .attrs = fts_touch_mode_attrs, +}; + +int ft8006m_ex_mode_init(struct i2c_client *client) +{ + int err = 0; + + g_ft8006m_mode_flag.fts_glove_mode_flag = false; + g_ft8006m_mode_flag.fts_cover_mode_flag = false; + g_ft8006m_mode_flag.fts_charger_mode_flag = false; + + err = sysfs_create_group(&client->dev.kobj, &fts_touch_mode_group); + if (0 != err) { + FTS_ERROR("[Mode]create sysfs failed."); + sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group); + return -EIO; + } else { + FTS_DEBUG("[Mode]create sysfs succeeded"); + } + + return err; + +} + +int ft8006m_ex_mode_exit(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group); + return 0; +} + +int ft8006m_ex_mode_recovery(struct i2c_client *client) +{ + int ret = 0; +#if FTS_GLOVE_EN + if (g_ft8006m_mode_flag.fts_glove_mode_flag) + ret = ft8006m_enter_glove_mode(client, true); +#endif + +#if FTS_COVER_EN + if (g_ft8006m_mode_flag.fts_cover_mode_flag) + ret = ft8006m_enter_cover_mode(client, true); +#endif + +#if FTS_CHARGER_EN + if (g_ft8006m_mode_flag.fts_charger_mode_flag) + ret = ft8006m_enter_charger_mode(client, true); +#endif + + return ret; +} + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash.c b/drivers/input/touchscreen/FT8006m/focaltech_flash.c new file mode 100644 index 0000000000000..b1f697ef44730 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash.c @@ -0,0 +1,808 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_flash.c +* +* Author: fupeipei +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#include "focaltech_flash.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ +struct ft_chip_t ft8006m_chip_types; +u8 ft8006m_fw_upgrade_status = FW_NO_UPGRADE; +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +/* Upgrade FW/PRAMBOOT/LCD CFG */ +u8 FT8006M_CTPM_FW[] = { +#include FTS_UPGRADE_FW_APP +}; + +u8 FT8006M_CTPM_FW_WHITE[] = { +#include FTS_UPGRADE_FW_ALL_WHITE +}; + +u8 FT8006M_CTPM_FW_BLACK[] = { +#include FTS_UPGRADE_FW_ALL_BLACK +}; +#if (FTS_GET_VENDOR_ID_NUM >= 2) +u8 FT8006M_FT8006M_CTPM_FW2[] = { +#include FTS_UPGRADE_FW2_APP +}; +#endif + +#if (FTS_GET_VENDOR_ID_NUM >= 3) +u8 FT8006M_FT8006M_CTPM_FW3[] = { +#include FTS_UPGRADE_FW3_APP +}; +#endif + +u8 ft8006m_aucFW_PRAM_BOOT[] = { +#ifdef FTS_UPGRADE_PRAMBOOT +#include FTS_UPGRADE_PRAMBOOT +#endif +}; + +struct fts_upgrade_fun ft8006m_updatefun_curr; +struct workqueue_struct *ft8006m_touch_wq; +struct work_struct ft8006m_fw_update_work; +u8 *ft8006m_g_fw_file; +int ft8006m_g_fw_len; +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/************************************************************************ +* Name: ft8006m_ctpm_upgrade_delay +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +void ft8006m_ctpm_upgrade_delay(u32 i) +{ + do { + i--; + } while (i > 0); +} + +/************************************************************************ +* Name: ft8006m_ctpm_i2c_hid2std +* Brief: HID to I2C +* Input: i2c info +* Output: no +* Return: fail =0 +***********************************************************************/ +int ft8006m_ctpm_i2c_hid2std(struct i2c_client *client) +{ +#if (FTS_CHIP_IDC) + return 0; +#else + u8 buf[5] = {0}; + int bRet = 0; + + buf[0] = 0xeb; + buf[1] = 0xaa; + buf[2] = 0x09; + bRet = ft8006m_i2c_write(client, buf, 3); + msleep(10); + buf[0] = buf[1] = buf[2] = 0; + ft8006m_i2c_read(client, buf, 0, buf, 3); + + if ((0xeb == buf[0]) && (0xaa == buf[1]) && (0x08 == buf[2])) { + FTS_DEBUG("hidi2c change to stdi2c successful!!"); + bRet = 1; + } else { + FTS_ERROR("hidi2c change to stdi2c error!!"); + bRet = 0; + } + + return bRet; +#endif +} + +/************************************************************************ +* Name: fts_get_ft8006m_chip_types +* Brief: get correct chip information +* Input: +* Output: +* Return: +***********************************************************************/ +void fts_get_ft8006m_chip_types(void) +{ + struct ft_chip_t ctype[] = FTS_CHIP_TYPE_MAPPING; + int ic_type = 0; + + if (sizeof(ctype) != sizeof(struct ft_chip_t)) /* only one array */ + ic_type = IC_SERIALS - 1; + + ft8006m_chip_types = ctype[ic_type]; + + FTS_INFO("CHIP TYPE ID = 0x%02x%02x", ft8006m_chip_types.chip_idh, ft8006m_chip_types.chip_idl); +} + +/************************************************************************ +* Name: ft8006m_ctpm_get_upgrade_array +* Brief: decide which ic +* Input: no +* Output: get ic info in fts_updateinfo_curr +* Return: no +***********************************************************************/ +void ft8006m_ctpm_get_upgrade_array(void) +{ + + FTS_FUNC_ENTER(); + + fts_get_ft8006m_chip_types(); + + ft8006m_ctpm_i2c_hid2std(ft8006m_i2c_client); + + /* Get functin pointer */ + memcpy(&ft8006m_updatefun_curr, &ft8006m_updatefun, sizeof(struct fts_upgrade_fun)); + + FTS_FUNC_EXIT(); +} + +/************************************************************************ +* Name: ft8006m_ctpm_rom_or_pram_reset +* Brief: RST CMD(07), reset to romboot(maybe->bootloader) +* Input: +* Output: +* Return: +***********************************************************************/ +void ft8006m_ctpm_rom_or_pram_reset(struct i2c_client *client) +{ + u8 rst_cmd = FTS_REG_RESET_FW; + + FTS_INFO("[UPGRADE]******Reset to romboot/bootloader******"); + ft8006m_i2c_write(client, &rst_cmd, 1); + /* The delay can't be changed */ + msleep(300); +} + +/************************************************************************ +* Name: ft8006m_ctpm_auto_clb +* Brief: auto calibration +* Input: i2c info +* Output: no +* Return: 0 +***********************************************************************/ +int ft8006m_ctpm_auto_clb(struct i2c_client *client) +{ +#if FTS_AUTO_CLB_EN + u8 uc_temp = 0x00; + u8 i = 0; + + /*start auto CLB */ + msleep(200); + + ft8006m_i2c_write_reg(client, 0, FTS_REG_WORKMODE_FACTORY_VALUE); + /*make sure already enter factory mode */ + msleep(100); + /*write command to start calibration */ + ft8006m_i2c_write_reg(client, 2, 0x4); + msleep(300); + if ((ft8006m_chip_types.chip_idh == 0x11) || (ft8006m_chip_types.chip_idh == 0x12) || (ft8006m_chip_types.chip_idh == 0x13) || (ft8006m_chip_types.chip_idh == 0x14)) { + for (i = 0; i < 100; i++) { + ft8006m_i2c_read_reg(client, 0x02, &uc_temp); + if (0x02 == uc_temp || + 0xFF == uc_temp) { + break; + } + msleep(20); + } + } else { + for (i = 0; i < 100; i++) { + ft8006m_i2c_read_reg(client, 0, &uc_temp); + if (0x0 == ((uc_temp&0x70)>>4)) { + break; + } + msleep(20); + } + } + ft8006m_i2c_write_reg(client, 0, 0x40); + msleep(200); + ft8006m_i2c_write_reg(client, 2, 0x5); + msleep(300); + ft8006m_i2c_write_reg(client, 0, FTS_REG_WORKMODE_WORK_VALUE); + msleep(300); +#endif + + return 0; +} + +/************************************************************************ +* Name: ft8006m_GetFirmwareSize +* Brief: get file size +* Input: file name +* Output: no +* Return: file size +***********************************************************************/ +int ft8006m_GetFirmwareSize(char *firmware_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[FILE_NAME_LENGTH]; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTXXXX_INI_FILEPATH_CONFIG, firmware_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_ERROR("error occured while opening file %s", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +/************************************************************************ +* Name: ft8006m_ReadFirmware +* Brief: read firmware buf for .bin file. +* Input: file name, data buf +* Output: data buf +* Return: 0 +***********************************************************************/ +int ft8006m_ReadFirmware(char *firmware_name, u8 *firmware_buf) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[FILE_NAME_LENGTH]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTXXXX_INI_FILEPATH_CONFIG, firmware_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_ERROR("[UPGRADE] Error occured while opening file %s.\n", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, firmware_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +/************************************************************************ +* Name: ft8006m_getsize +* Brief: Get different file's size +* Input: +* Output: +* Return: file's size +***********************************************************************/ +u32 ft8006m_getsize(u8 fw_type) +{ + int fw_len = 0; + + if (fw_type == FW_SIZE) + fw_len = sizeof(FT8006M_CTPM_FW_WHITE); +#if (FTS_GET_VENDOR_ID_NUM >= 2) + else if (fw_type == FW2_SIZE) + fw_len = sizeof(FT8006M_FT8006M_CTPM_FW2); +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 3) + else if (fw_type == FW3_SIZE) + fw_len = sizeof(FT8006M_FT8006M_CTPM_FW3); +#endif +#if FTS_CHIP_IDC + else if (fw_type == PRAMBOOT_SIZE) + fw_len = sizeof(ft8006m_aucFW_PRAM_BOOT); +#endif + + return fw_len; +} + +/************************************************************************ +* Name: ft8006m_ctpm_get_pram_or_rom_id +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +enum FW_STATUS ft8006m_ctpm_get_pram_or_rom_id(struct i2c_client *client) +{ + u8 buf[4]; + u8 reg_val[2] = {0}; + enum FW_STATUS inRomBoot = FTS_RUN_IN_ERROR; + + ft8006m_ctpm_i2c_hid2std(client); + + /*Enter upgrade mode*/ + /*send 0x55 in time windows*/ + buf[0] = FTS_UPGRADE_55; + buf[1] = FTS_UPGRADE_AA; + ft8006m_i2c_write(client, buf, 2); + + msleep(20); + + buf[0] = 0x90; + buf[1] = buf[2] = buf[3] = 0x00; + ft8006m_i2c_read(client, buf, 4, reg_val, 2); + + FTS_DEBUG("[UPGRADE] Read ROM/PRAM/Bootloader id:0x%02x%02x", reg_val[0], reg_val[1]); + if ((reg_val[0] == 0x00) || (reg_val[0] == 0xFF)) { + inRomBoot = FTS_RUN_IN_ERROR; + } else if (reg_val[0] == ft8006m_chip_types.pramboot_idh && reg_val[1] == ft8006m_chip_types.pramboot_idl) { + inRomBoot = FTS_RUN_IN_PRAM; + } else if (reg_val[0] == ft8006m_chip_types.rom_idh && reg_val[1] == ft8006m_chip_types.rom_idl) { + inRomBoot = FTS_RUN_IN_ROM; + } else if (reg_val[0] == ft8006m_chip_types.bootloader_idh && reg_val[1] == ft8006m_chip_types.bootloader_idl) { + inRomBoot = FTS_RUN_IN_BOOTLOADER; + } + + return inRomBoot; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_file +* Brief: get app file by Vendor ID +* Input: +* Output: +* Return: <0: vendor id not correct,not upgrade +***********************************************************************/ +int ft8006m_ctpm_get_i_file(struct i2c_client *client, int fw_valid) +{ + int ret; + + if (ft8006m_updatefun_curr.get_i_file) + ret = ft8006m_updatefun_curr.get_i_file(client, fw_valid); + else + ret = -EIO; + + return ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_get_app_ver +* Brief: get app file version +* Input: +* Output: +* Return: fw version +***********************************************************************/ +int ft8006m_ctpm_get_app_ver(void) +{ + int i_ret = 0; + + if (ft8006m_updatefun_curr.get_app_i_file_ver) + i_ret = ft8006m_updatefun_curr.get_app_i_file_ver(); + + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_fw_upgrade +* Brief: fw upgrade entry funciotn +* Input: +* Output: +* Return: 0 - upgrade successfully +* <0 - upgrade failed +***********************************************************************/ +int ft8006m_ctpm_fw_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + if (ft8006m_updatefun_curr.upgrade_with_app_i_file) + i_ret = ft8006m_updatefun_curr.upgrade_with_app_i_file(client); + + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_fw_upgrade +* Brief: fw upgrade entry funciotn +* Input: +* Output: +* Return: 0 - upgrade successfully +* <0 - upgrade failed +***********************************************************************/ +int ft8006m_ctpm_lcd_cfg_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + if (ft8006m_updatefun_curr.upgrade_with_lcd_cfg_i_file) + i_ret = ft8006m_updatefun_curr.upgrade_with_lcd_cfg_i_file(client); + + return i_ret; +} + +bool fts_check_fw_valid(struct i2c_client *client) +{ + int i = 0; + u8 chip_id = 0; + + for (i = 0; i < 3; i++) { + ft8006m_i2c_read_reg(client, FTS_REG_CHIP_ID, &chip_id); + if (chip_id == ft8006m_chip_types.chip_idh) + return true; + } + + return false; +} + +#if (!(FTS_UPGRADE_STRESS_TEST)) +/************************************************************************ +* Name: fts_ctpm_check_fw_status +* Brief: Check App is valid or not +* Input: +* Output: +* Return: -EIO - I2C communication error +* FTS_RUN_IN_APP - APP valid +* 0 - APP invalid +***********************************************************************/ +static int fts_ctpm_check_fw_status(struct i2c_client *client) +{ + u8 chip_id1 = 0; + u8 chip_id2 = 0; + int fw_status = FTS_RUN_IN_ERROR; + int i = 0; + int ret = 0; + int i2c_noack_retry = 0; + + for (i = 0; i < 5; i++) { + ret = ft8006m_i2c_read_reg(client, FTS_REG_CHIP_ID, &chip_id1); + if (ret < 0) { + i2c_noack_retry++; + continue; + } + ret = ft8006m_i2c_read_reg(client, FTS_REG_CHIP_ID2, &chip_id2); + if (ret < 0) { + i2c_noack_retry++; + continue; + } + + if ((chip_id1 == ft8006m_chip_types.chip_idh) +#if FTS_CHIP_IDC + && (chip_id2 == ft8006m_chip_types.chip_idl) +#endif + ) { + fw_status = FTS_RUN_IN_APP; + break; + } + } + + FTS_DEBUG("[UPGRADE]: chip_id = %02x%02x, ft8006m_chip_types.chip_idh = %02x%02x", + chip_id1, chip_id2, ft8006m_chip_types.chip_idh, ft8006m_chip_types.chip_idl); + + /* I2C No ACK 5 times, then return -EIO */ + if (i2c_noack_retry >= 5) + return -EIO; + + /* I2C communication ok, but not get correct ID, need check pram/rom/bootloader */ + if (i >= 5) { + fw_status = ft8006m_ctpm_get_pram_or_rom_id(client); + } + + return fw_status; +} + +/************************************************************************ +* Name: fts_ctpm_check_fw_ver +* Brief: Check vendor id is valid or not +* Input: +* Output: +* Return: 1 - vendor id valid +* 0 - vendor id invalid +***********************************************************************/ +static int fts_ctpm_check_fw_ver(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + u8 uc_host_fm_ver = 0; + + ft8006m_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + uc_host_fm_ver = ft8006m_ctpm_get_app_ver(); + + FTS_DEBUG("[UPGRADE]: uc_tp_fm_ver = 0x%x, uc_host_fm_ver = 0x%x!!", uc_tp_fm_ver, uc_host_fm_ver); + if (uc_tp_fm_ver < uc_host_fm_ver) { + return 1; + } else { + return 0; + } +} + +/************************************************************************ +* Name: fts_ctpm_check_need_upgrade +* Brief: +* Input: +* Output: +* Return: 1 - Need upgrade +* 0 - No upgrade +***********************************************************************/ +static int fts_ctpm_check_need_upgrade(struct i2c_client *client) +{ + int fw_status = 0; + int bUpgradeFlag = false; + + FTS_FUNC_ENTER(); + + /* 1. veriry FW APP is valid or not */ + fw_status = fts_ctpm_check_fw_status(client); + FTS_DEBUG("[UPGRADE]: fw_status = %d!!", fw_status); + if (fw_status < 0) { + /* I2C no ACK, return immediately */ + FTS_ERROR("[UPGRADE]******I2C NO ACK,exit upgrade******"); + return -EIO; + } else if (fw_status == FTS_RUN_IN_ERROR) { + FTS_ERROR("[UPGRADE]******IC Type Fail******"); + } else if (fw_status == FTS_RUN_IN_APP) { + FTS_INFO("[UPGRADE]**********FW APP valid**********"); + + if (ft8006m_ctpm_get_i_file(client, 1) != 0) { + FTS_DEBUG("[UPGRADE]******Get upgrade file(fw) fail******"); + return -EIO; + } + + if (fts_ctpm_check_fw_ver(client) == 1) { + FTS_DEBUG("[UPGRADE]**********need upgrade fw**********"); + bUpgradeFlag = true; + } else { + FTS_DEBUG("[UPGRADE]**********Don't need upgrade fw**********"); + bUpgradeFlag = false; + } + } else { + /* if app is invalid, reset to run ROM */ + FTS_INFO("[UPGRADE]**********FW APP invalid**********"); + ft8006m_ctpm_rom_or_pram_reset(client); + if (ft8006m_ctpm_get_i_file(client, 0) != 0) { + FTS_DEBUG("[UPGRADE]******Get upgrade file(flash) fail******"); + ft8006m_ctpm_rom_or_pram_reset(client); + return -EIO; + } + ft8006m_ctpm_rom_or_pram_reset(client); + bUpgradeFlag = true; + } + + FTS_FUNC_EXIT(); + + return bUpgradeFlag; +} + +/************************************************************************ +* Name: ft8006m_ctpm_auto_upgrade +* Brief: auto upgrade +* Input: +* Output: +* Return: 0 - no upgrade +***********************************************************************/ +int ft8006m_ctpm_auto_upgrade(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + int i_ret = 0; + int bUpgradeFlag = false; + u8 uc_upgrade_times = 0; + + FTS_DEBUG("[UPGRADE]********************check upgrade need or not********************"); + bUpgradeFlag = fts_ctpm_check_need_upgrade(client); + FTS_DEBUG("[UPGRADE]**********bUpgradeFlag = 0x%x**********", bUpgradeFlag); + if (bUpgradeFlag <= 0) { + FTS_DEBUG("[UPGRADE]**********No Upgrade, exit**********"); + + return bUpgradeFlag; + } else { + /* FW Upgrade */ + ft8006m_fw_upgrade_status = FW_UPGRADING; + do { + uc_upgrade_times++; + FTS_DEBUG("[UPGRADE]********************star upgrade(%d)********************", uc_upgrade_times); + + i_ret = ft8006m_ctpm_fw_upgrade(client); + if (i_ret == 0) { + /* upgrade success */ + ft8006m_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + FTS_DEBUG("[UPGRADE]********************Success upgrade to new fw version 0x%x********************", uc_tp_fm_ver); + + ft8006m_ctpm_auto_clb(client); + break; + } else { + /* upgrade fail, reset to run ROM BOOT.. + * if app in flash is ok, TP will work success + */ + FTS_ERROR("[UPGRADE]********************upgrade fail, reset now********************"); + ft8006m_ctpm_rom_or_pram_reset(client); + } + } while (uc_upgrade_times < 2); /* if upgrade fail, upgrade again. then return */ + ft8006m_fw_upgrade_status = FW_UPGRADED; + } + + return i_ret; +} +#endif + +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN +int fts_get_host_lic_ver(u8 *ver) +{ + int i_ret = 0; + + if (ft8006m_updatefun_curr.get_hlic_ver) + i_ret = ft8006m_updatefun_curr.get_hlic_ver(); + + if (i_ret > 0) + *ver = i_ret; + return i_ret; +} + +/* check if lcd init code need upgrade +* true-need false-no need +*/ +static bool fts_lic_need_upgrade(struct i2c_client *client) +{ + int ret = 0; + u8 initcode_ver_in_tp = 0; + u8 initcode_ver_in_host = 0; + bool fwvalid = false; + + fwvalid = fts_check_fw_valid(client); + if (!fwvalid) { + FTS_INFO("fw is invalid, no upgrade lcd init code"); + return false; + } + + ret = fts_get_host_lic_ver(&initcode_ver_in_host); + if (ret < 0) { + FTS_ERROR("init code in host invalid"); + return false; + } + + ret = ft8006m_i2c_read_reg(client, 0xE4, &initcode_ver_in_tp); + if (ret < 0) { + FTS_ERROR("read reg0xE4 fail"); + return false; + } + + FTS_DEBUG("tp init ver:%x, fw init ver:%x", initcode_ver_in_tp, initcode_ver_in_host); + if (0xA5 == initcode_ver_in_tp) { + FTS_INFO("lcd init code ver is 0xA5, don't upgade init code"); + return false; + } else if (0xFF == initcode_ver_in_tp) { + FTS_DEBUG("lcd init code in tp is invalid, need upgrade init code"); + return true; + } else if (initcode_ver_in_tp < initcode_ver_in_host) + return true; + else + return false; +} + +int fts_lic_upgrade(struct i2c_client *client) +{ + int ret = 0; + bool hlic_upgrade = false; + int upgrade_count = 0; + + hlic_upgrade = fts_lic_need_upgrade(client); + FTS_INFO("lcd init code upgrade flag:%d", hlic_upgrade); + if (hlic_upgrade) { + FTS_INFO("lcd init code upgrade..."); + do { + upgrade_count++; + ret = ft8006m_ctpm_lcd_cfg_upgrade(client); + if (0 == ret) { + FTS_INFO("lcd init code upgrade succussfully"); + break; + } else { + ft8006m_ctpm_rom_or_pram_reset(client); + } + } while (upgrade_count < 2); + } + + return ret; +} +#endif /* FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN */ + +#if FTS_AUTO_UPGRADE_EN +static void fts_ctpm_update_work_func(struct work_struct *work) +{ + int i_ret = 0; + + FTS_DEBUG("[UPGRADE]******************************FTS enter upgrade******************************"); + ft8006m_irq_disable(); + + /* esd check */ +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(DISABLE); +#endif + + i_ret = ft8006m_ctpm_auto_upgrade(ft8006m_i2c_client); + if (i_ret < 0) + FTS_ERROR("[UPGRADE]**********TP FW upgrade failed**********"); + +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN + + if (i_ret >= 0) { + i_ret = fts_lic_upgrade(ft8006m_i2c_client); + if (i_ret < 0) + FTS_ERROR("**********lcd init code upgrade failed**********"); + } +#endif + +#if FTS_ESDCHECK_EN + ft8006m_esdcheck_switch(ENABLE); +#endif + ft8006m_irq_enable(); + + FTS_DEBUG("[UPGRADE]******************************FTS exit upgrade******************************"); +} + +/***************************************************************************** +* Name: ft8006m_ctpm_upgrade_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_ctpm_upgrade_init(void) +{ + FTS_FUNC_ENTER(); + + ft8006m_touch_wq = create_singlethread_workqueue("ft8006m_touch_wq"); + if (ft8006m_touch_wq) { + INIT_WORK(&ft8006m_fw_update_work, fts_ctpm_update_work_func); + queue_work(ft8006m_touch_wq, &ft8006m_fw_update_work); + } else { + FTS_ERROR("[UPGRADE]create_singlethread_workqueue failed\n"); + } + + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: ft8006m_ctpm_upgrade_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_ctpm_upgrade_exit(void) +{ + FTS_FUNC_ENTER(); + destroy_workqueue(ft8006m_touch_wq); + FTS_FUNC_EXIT(); +} + +#endif /* #if FTS_AUTO_UPGRADE_EN */ diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash.h b/drivers/input/touchscreen/FT8006m/focaltech_flash.h new file mode 100644 index 0000000000000..93e7c95700882 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash.h @@ -0,0 +1,131 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_flash.h +* +* Author: fupeipei +* +* Created: 2016-08-07 +* +* Abstract: +* +************************************************************************/ +#ifndef __LINUX_FOCALTECH_FLASH_H__ +#define __LINUX_FOCALTECH_FLASH_H__ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_flash/focaltech_upgrade_common.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_REG_ECC 0xCC +#define FTS_RST_CMD_REG2 0xBC +#define FTS_READ_ID_REG 0x90 +#define FTS_ERASE_APP_REG 0x61 +#define FTS_ERASE_PARAMS_CMD 0x63 +#define FTS_FW_WRITE_CMD 0xBF +#define FTS_REG_RESET_FW 0x07 +#define FTS_RST_CMD_REG1 0xFC +#define LEN_FLASH_ECC_MAX 0xFFFE + +#define FTS_PACKET_LENGTH 128 +#define FTS_SETTING_BUF_LEN 128 + +#define FTS_UPGRADE_LOOP 30 +#define AUTO_CLB_NEED 1 +#define AUTO_CLB_NONEED 0 +#define FTS_UPGRADE_AA 0xAA +#define FTS_UPGRADE_55 0x55 +#define FTXXXX_INI_FILEPATH_CONFIG "/sdcard/" + +enum FW_STATUS { + FTS_RUN_IN_ERROR, + FTS_RUN_IN_APP, + FTS_RUN_IN_ROM, + FTS_RUN_IN_PRAM, + FTS_RUN_IN_BOOTLOADER +}; + +enum FILE_SIZE_TYPE { + FW_SIZE, + FW2_SIZE, + FW3_SIZE, + PRAMBOOT_SIZE, +}; + +/* pramboot for 8716 */ +#define FTS_PRAMBOOT_8716 "include/pramboot/FT8716_Pramboot_V0.5_20160723.i" +#define FTS_UPGRADE_PRAMBOOT FTS_PRAMBOOT_8716 + + +#define FTS_PRAMBOOT_E716 "include/pramboot/FT8716_Pramboot_V0.5_20160723.i" +#define FTS_UPGRADE_PRAMBOOT FTS_PRAMBOOT_8716 + + + + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* IC info */ + +struct fts_upgrade_fun { + int (*get_i_file)(struct i2c_client *, int); + int (*get_app_bin_file_ver)(char *); + int (*get_app_i_file_ver)(void); + int (*upgrade_with_app_i_file)(struct i2c_client *); + int (*upgrade_with_app_bin_file)(struct i2c_client *, char *); + int (*get_hlic_ver)(void); + int (*upgrade_with_lcd_cfg_i_file)(struct i2c_client *); + int (*upgrade_with_lcd_cfg_bin_file)(struct i2c_client *, char *); +}; +extern struct fts_upgrade_fun ft8006m_updatefun; + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern u8 FT8006M_CTPM_FW[]; +extern u8 FT8006M_CTPM_FW_WHITE[]; +extern u8 FT8006M_CTPM_FW_BLACK[]; +extern u8 FT8006M_FT8006M_CTPM_FW2[]; +extern u8 FT8006M_FT8006M_CTPM_FW3[]; +extern u8 ft8006m_aucFW_PRAM_BOOT[]; +extern u8 FT8006M_CTPM_LCD_CFG[]; +extern u8 *ft8006m_g_fw_file; +extern int ft8006m_g_fw_len; +extern struct fts_upgrade_fun ft8006m_updatefun_curr; +extern struct ft_chip_t ft8006m_chip_types; + +#if FTS_AUTO_UPGRADE_EN +extern struct workqueue_struct *ft8006m_touch_wq; +extern struct work_struct ft8006m_fw_update_work; +#endif + +void ft8006m_ctpm_upgrade_init(void); +void ft8006m_ctpm_upgrade_exit(void); +void ft8006m_ctpm_upgrade_delay(u32 i); +void ft8006m_ctpm_get_upgrade_array(void); +int ft8006m_ctpm_auto_upgrade(struct i2c_client *client); +int ft8006m_fw_upgrade(struct device *dev, bool force); +int ft8006m_ctpm_auto_clb(struct i2c_client *client); + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +u32 ft8006m_getsize(u8 fw_type); +int ft8006m_GetFirmwareSize(char *firmware_name); +int ft8006m_ctpm_i2c_hid2std(struct i2c_client *client); +int ft8006m_ReadFirmware(char *firmware_name, u8 *firmware_buf); +void ft8006m_ctpm_rom_or_pram_reset(struct i2c_client *client); +enum FW_STATUS ft8006m_ctpm_get_pram_or_rom_id(struct i2c_client *client); +#endif + + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash/Makefile b/drivers/input/touchscreen/FT8006m/focaltech_flash/Makefile new file mode 100755 index 0000000000000..4c1c999d1932a --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for the focaltech touchscreen drivers. +# + +# Each configuration option enables a list of files. + + +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_upgrade_idc.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_upgrade_ft8006.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_upgrade_test.o diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_common.h b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_common.h new file mode 100755 index 0000000000000..f09d1cf50cfe9 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_common.h @@ -0,0 +1,57 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_upgrade_common.h +* +* Author: fupeipei +* +* Created: 2016-08-16 +* +* Abstract: +* +************************************************************************/ +#ifndef __LINUX_FOCALTECH_UPGRADE_COMMON_H__ +#define __LINUX_FOCALTECH_UPGRADE_COMMON_H__ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_flash.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +int ft8006m_ctpm_erase_flash(struct i2c_client *client); +int ft8006m_ctpm_pramboot_ecc(struct i2c_client *client); +bool ft8006m_ctpm_check_run_state(struct i2c_client *client, int state); +void ft8006m_ctpm_start_pramboot(struct i2c_client *client); +int ft8006m_ctpm_start_fw_upgrade(struct i2c_client *client); +bool ft8006m_ctpm_check_in_pramboot(struct i2c_client *client); +int ft8006m_ctpm_upgrade_idc_init(struct i2c_client *client); +int ft8006m_ctpm_write_app_for_idc(struct i2c_client *client, u32 length, u8 *readbuf); +int ft8006m_ctpm_upgrade_ecc(struct i2c_client *client, u32 startaddr, u32 length); +int ft8006m_ctpm_write_pramboot_for_idc(struct i2c_client *client, u32 length, u8 *readbuf); +int ft8006m_writeflash(struct i2c_client *client, u32 writeaddr, u32 length, u8 *readbuf, u32 cnt); +bool ft8006m_check_app_bin_valid_idc(u8 *pbt_buf); + +int ft8006m_ctpm_get_app_ver(void); +int ft8006m_ctpm_fw_upgrade(struct i2c_client *client); +int ft8006m_ctpm_lcd_cfg_upgrade(struct i2c_client *client); + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_ft8006.c b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_ft8006.c new file mode 100644 index 0000000000000..c26159b09d091 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_ft8006.c @@ -0,0 +1,1348 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_ft8006.c +* +* Author: fupeipei +* +* Created: 2016-08-15 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" + +#if (FTS_CHIP_TYPE == _FT8006) +#include "../focaltech_flash.h" +#include "focaltech_upgrade_common.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN +#define APP_OFFSET 0x5000 +#define APP_FILE_MAX_SIZE (116 * 1024) +#else +#define APP_OFFSET 0x0 +#define APP_FILE_MAX_SIZE (96 * 1024) +#endif + +#define APP_FILE_MIN_SIZE (8) +#define APP_FILE_VER_MAPPING (0x10E + APP_OFFSET) +#define APP_FILE_VENDORID_MAPPING (0x10C + APP_OFFSET) +#define APP_FILE_CHIPID_MAPPING (0x11E + APP_OFFSET) +#define CONFIG_START_ADDR (0xF80) +#define CONFIG_START_ADDR_LEN (0x80) +#define CONFIG_VENDOR_ID_OFFSET (0x04) +#define CONFIG_PROJECT_ID_OFFSET (0x20) +#define CONFIG_VENDOR_ID_ADDR (CONFIG_START_ADDR+CONFIG_VENDOR_ID_OFFSET) +#define CONFIG_PROJECT_ID_ADDR (CONFIG_START_ADDR+CONFIG_PROJECT_ID_OFFSET) +#define LCD_CFG_MAX_SIZE (4 * 1024) +#define LCD_CFG_MIN_SIZE (8) + +#define TP_WHITE_LOCKDOWN "44353102D1003100" +#define TP_BLACK_LOCKDOWN "44353202D1003100" + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +static int ft8006m_ctpm_get_i_file(struct i2c_client *client, int fw_valid); +static int fts_ctpm_get_app_i_file_ver(void); +static int fts_ctpm_get_app_bin_file_ver(char *firmware_name); +static int ft8006m_ctpm_fw_upgrade_with_app_i_file(struct i2c_client *client); +static int ft8006m_ctpm_fw_upgrade_with_app_bin_file(struct i2c_client *client, char *firmware_name); +static int ft8006m_ctpm_fw_upgrade_with_lcd_cfg_i_file(struct i2c_client *client); +static int fts_get_host_lic_ver(void); +static int Ft8006m_Read_Lockdown_From_Boot(struct i2c_client *client); + + +struct fts_upgrade_fun ft8006m_updatefun = { + .get_i_file = ft8006m_ctpm_get_i_file, + .get_app_bin_file_ver = fts_ctpm_get_app_bin_file_ver, + .get_app_i_file_ver = fts_ctpm_get_app_i_file_ver, + .upgrade_with_app_i_file = ft8006m_ctpm_fw_upgrade_with_app_i_file, + .upgrade_with_app_bin_file = ft8006m_ctpm_fw_upgrade_with_app_bin_file, + .get_hlic_ver = fts_get_host_lic_ver, + .upgrade_with_lcd_cfg_i_file = ft8006m_ctpm_fw_upgrade_with_lcd_cfg_i_file, + + .upgrade_with_lcd_cfg_bin_file = NULL, +}; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if (FTS_GET_VENDOR_ID_NUM != 0) +/************************************************************************ +* Name: fts_ctpm_get_vendor_id_flash +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +static int fts_ctpm_get_vendor_id_flash(struct i2c_client *client, u8 *vendor_id) +{ + bool inbootloader = false; + u8 rw_buf[10]; + int i_ret; + + ft8006m_ctpm_i2c_hid2std(client); + + i_ret = fts_ctpm_start_fw_upgrade(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: send upgrade cmd to FW error!!"); + return i_ret; + } + + /*Enter upgrade mode*/ + ft8006m_ctpm_i2c_hid2std(client); + msleep(10); + + inbootloader = ft8006m_ctpm_check_run_state(client, FTS_RUN_IN_BOOTLOADER); + if (!inbootloader) { + FTS_ERROR("[UPGRADE]: not run in bootloader, upgrade fail!!"); + return -EIO; + } + + /*read vendor id*/ + rw_buf[0] = 0x03; + rw_buf[1] = 0x00; + rw_buf[2] = (u8)(CONFIG_VENDOR_ID_ADDR >> 8); + rw_buf[3] = (u8)(CONFIG_VENDOR_ID_ADDR); + i_ret = ft8006m_i2c_write(client, rw_buf, 4); + msleep(10); /* must wait, otherwise read vendor id wrong */ + i_ret = ft8006m_i2c_read(client, NULL, 0, vendor_id, 1); + if (i_ret < 0) { + return -EIO; + } + FTS_DEBUG("Vendor ID from Flash:%x", *vendor_id); + return 0; +} +#endif + +/************************************************************************ +* Name: fts_ft5x46_get_i_file +* Brief: get .i file +* Input: +* Output: +* Return: 0 - ok +* <0 - fail +***********************************************************************/ +static int ft8006m_ctpm_get_i_file(struct i2c_client *client, int fw_valid) +{ + int ret = 0; + struct fts_ts_data *data; + data = i2c_get_clientdata(client); + +#if (FTS_GET_VENDOR_ID_NUM != 0) + u8 vendor_id = 0; + + if (fw_valid) { + ret = ft8006m_i2c_read_reg(client, FTS_REG_VENDOR_ID, &vendor_id); + } else + ret = fts_ctpm_get_vendor_id_flash(client, &vendor_id); + if (ret < 0) { + FTS_ERROR("Get upgrade file fail because of Vendor ID wrong"); + return ret; + } + FTS_INFO("[UPGRADE] vendor id in tp=%x", vendor_id); + FTS_INFO("[UPGRADE] vendor id in driver:%x, FTS_VENDOR_ID:%02x %02x %02x", + vendor_id, FTS_VENDOR_1_ID, FTS_VENDOR_2_ID, FTS_VENDOR_3_ID); + + ret = 0; + switch (vendor_id) { +#if (FTS_GET_VENDOR_ID_NUM >= 1) + case FTS_VENDOR_1_ID: + ft8006m_g_fw_file = FT8006M_CTPM_FW; + ft8006m_g_fw_len = ft8006m_getsize(FW_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:FT8006M_CTPM_FW, SIZE:%x", ft8006m_g_fw_len); + break; +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 2) + case FTS_VENDOR_2_ID: + ft8006m_g_fw_file = FT8006M_FT8006M_CTPM_FW2; + ft8006m_g_fw_len = ft8006m_getsize(FW2_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:FT8006M_FT8006M_CTPM_FW2, SIZE:%x", ft8006m_g_fw_len); + break; +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 3) + case FTS_VENDOR_3_ID: + ft8006m_g_fw_file = FT8006M_FT8006M_CTPM_FW3; + ft8006m_g_fw_len = ft8006m_getsize(FW3_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:FT8006M_FT8006M_CTPM_FW3, SIZE:%x", ft8006m_g_fw_len); + break; +#endif + default: + FTS_ERROR("[UPGRADE]Vendor ID check fail, get fw file fail"); + ret = -EIO; + break; + } +#else + /* (FTS_GET_VENDOR_ID_NUM == 0) */ + if (!strncmp(data->lockdown_info, TP_WHITE_LOCKDOWN, 16)) { + FTS_DEBUG(" TP color is WHITE\n"); + ret = 1; + } else if (!strncmp(data->lockdown_info, TP_BLACK_LOCKDOWN, 16)) { + FTS_DEBUG("TP color is BLACK\n"); + ret = 2; + } else{ + ret = Ft8006m_Read_Lockdown_From_Boot(client); + } + FTS_DEBUG("ret = %d\n", ret); + + if (ret == 1) { + ft8006m_g_fw_file = FT8006M_CTPM_FW_WHITE; + } else if (ret == 2) { + ft8006m_g_fw_file = FT8006M_CTPM_FW_BLACK; + } else{ + ft8006m_g_fw_file = NULL; + FTS_DEBUG("[UPGRADE] request tp FW fail!!!\n"); + } + ft8006m_g_fw_len = ft8006m_getsize(FW_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:FT8006M_CTPM_FW, SIZE:%x", ft8006m_g_fw_len); +#endif + + return ret?0:1; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_bin_file_ver +* Brief: get .i file version +* Input: no +* Output: no +* Return: fw version +***********************************************************************/ +static int fts_ctpm_get_app_bin_file_ver(char *firmware_name) +{ + u8 *pbt_buf = NULL; + int fwsize = 0; + int fw_ver = 0; + + FTS_FUNC_ENTER(); + + fwsize = ft8006m_GetFirmwareSize(firmware_name); + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fwsize); + return -EIO; + } + + pbt_buf = (unsigned char *)kmalloc(fwsize + 1, GFP_KERNEL); + if (ft8006m_ReadFirmware(firmware_name, pbt_buf)) { + FTS_ERROR("[UPGRADE]: request_firmware failed!!"); + kfree(pbt_buf); + return -EIO; + } + + fw_ver = pbt_buf[APP_FILE_VER_MAPPING]; + + kfree(pbt_buf); + FTS_FUNC_EXIT(); + + return fw_ver; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_i_file_ver +* Brief: get .i file version +* Input: no +* Output: no +* Return: fw version +***********************************************************************/ +static int fts_ctpm_get_app_i_file_ver(void) +{ + int fwsize = ft8006m_g_fw_len; + + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fwsize); + return 0; + } + + return ft8006m_g_fw_file[APP_FILE_VER_MAPPING]; +} + +/* read host lcd init code ver +* return 0 if host lcd init code is valid, otherwise return error code +*/ +static int fts_get_host_lic_ver(void) +{ + u8 *hlic_buf = ft8006m_g_fw_file; + u32 hlic_len = 0; + u8 hlic_ver[2] = { 0 }; + u32 upgfile_len = ft8006m_g_fw_len; + + if (upgfile_len < 4096) { + FTS_ERROR("upgrade file len fail"); + return -EINVAL; + } + hlic_len = (u32)(((u32)hlic_buf[2]) << 8) + hlic_buf[3]; + FTS_DEBUG("host lcd init code len:%x", hlic_len); + if (hlic_len >= upgfile_len) { + FTS_ERROR("host lcd init code len is too large"); + return -EINVAL; + } + + hlic_ver[0] = hlic_buf[hlic_len]; + hlic_ver[1] = hlic_buf[hlic_len + 1]; + + FTS_DEBUG("host lcd init code ver:%x %x", hlic_ver[0], hlic_ver[1]); + if (0xFF != (hlic_ver[0] + hlic_ver[1])) { + FTS_ERROR("host lcd init code version check fail"); + return -EINVAL; + } + + return hlic_ver[0]; +} + + +#define MAX_BANK_DATA 0x80 +#define MAX_GAMMA_LEN 0x180 +int gamma_analog[] = { 0x003A, 0x85, 0x00, 0x00, 0x2C, 0x2B }; +int gamma_digital1[] = { 0x0355, 0x8D, 0x00, 0x00, 0x80, 0x80 }; +int gamma_digital2[] = { 0x03d9, 0x8D, 0x80, 0x00, 0x14, 0x13 }; +int gamma_enable[] = { 0x040d, 0x91, 0x80, 0x00, 0x19, 0x01 }; +union short_bits{ + u16 dshort; + struct bits{ + u16 bit0:1; + u16 bit1:1; + u16 bit2:1; + u16 bit3:1; + u16 bit4:1; + u16 bit5:1; + u16 bit6:1; + u16 bit7:1; + u16 bit8:1; + u16 bit9:1; + u16 bit10:1; + u16 bit11:1; + u16 bit12:1; + u16 bit13:1; + u16 bit14:1; + u16 bit15:1; + } bits; +}; + +/* calculate lcd init code ecc */ +static int cal_lcdinitcode_ecc(u8 *buf, u16 *ecc_val) +{ + u32 bank_crc_en = 0; + u8 bank_data[MAX_BANK_DATA] = { 0 }; + u16 bank_len = 0; + u16 bank_addr = 0; + u32 bank_num = 0; + u16 file_len = 0; + u16 pos = 0; + int i = 0; + union short_bits ecc; + union short_bits ecc_last; + union short_bits temp_byte; + u8 bank_mapping[] = { 0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, + 0xA, 0xB, 0xC, 0xD, 0xE, 0xF, 0x10, 0x11, 0x12, 0x13, 0x14, 0x18, + 0x19, 0x1A, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x22, 0x23, 0x24}; + u8 banknum_8006 = 0; + + ecc.dshort = 0; + ecc_last.dshort = 0; + temp_byte.dshort = 0; + + file_len = (u16)(((u16)buf[2] << 8) + buf[3]); + bank_crc_en = (u32)(((u32)buf[9] << 24) + ((u32)buf[8] << 16) +\ + ((u32)buf[7] << 8) + (u32)buf[6]); + FTS_INFO("lcd init code len=%x bank en=%x", file_len, bank_crc_en); + + pos = 0x0A; + while (pos < file_len) { + bank_addr = (u16)(((u16)buf[pos + 0] << 8) + buf[pos + 1]); + bank_len = (u16)(((u16)buf[pos + 2] << 8) + buf[pos + 3]); + FTS_INFO("bank pos=%x bank_addr=%x bank_len=%x", pos, bank_addr, bank_len); + if (bank_len > MAX_BANK_DATA) + return -EINVAL; + memset(bank_data, 0, MAX_BANK_DATA); + memcpy(bank_data, buf + pos + 4, bank_len); + + bank_num = (bank_addr - 0x8000)/MAX_BANK_DATA; + FTS_INFO("actual mipi bank number = %x", bank_num); + for (i = 0; i < sizeof(bank_mapping)/sizeof(u8); i++) { + if (bank_num == bank_mapping[i]) { + banknum_8006 = i; + break; + } + } + if (i >= sizeof(bank_mapping)/sizeof(u8)) { + FTS_INFO("actual mipi bank(%d) not find in bank mapping, need jump", bank_num); + } else{ + FTS_INFO("8006 bank number = %d", banknum_8006); + if ((bank_crc_en >> banknum_8006) & 0x01) { + for (i = 0; i < MAX_BANK_DATA; i++) { + temp_byte.dshort = (u16)bank_data[i]; + if (i == 0) + FTS_INFO("data0=%x, %d %d %d %d %d %d %d %d", temp_byte.dshort, temp_byte.bits.bit0, + temp_byte.bits.bit1, temp_byte.bits.bit2, temp_byte.bits.bit3, temp_byte.bits.bit4, + temp_byte.bits.bit5, temp_byte.bits.bit6, temp_byte.bits.bit7); + + ecc.bits.bit0 = ecc_last.bits.bit8 ^ ecc_last.bits.bit9 ^ ecc_last.bits.bit10 ^ ecc_last.bits.bit11 + ^ ecc_last.bits.bit12 ^ ecc_last.bits.bit13 ^ ecc_last.bits.bit14 ^ ecc_last.bits.bit15 + ^ temp_byte.bits.bit0 ^ temp_byte.bits.bit1 ^ temp_byte.bits.bit2 ^ temp_byte.bits.bit3 + ^ temp_byte.bits.bit4 ^ temp_byte.bits.bit5 ^ temp_byte.bits.bit6 ^ temp_byte.bits.bit7; + + ecc.bits.bit1 = ecc_last.bits.bit9 ^ ecc_last.bits.bit10 ^ ecc_last.bits.bit11 ^ ecc_last.bits.bit12 + ^ ecc_last.bits.bit13 ^ ecc_last.bits.bit14 ^ ecc_last.bits.bit15 + ^ temp_byte.bits.bit1 ^ temp_byte.bits.bit2 ^ temp_byte.bits.bit3 ^ temp_byte.bits.bit4 + ^ temp_byte.bits.bit5 ^ temp_byte.bits.bit6 ^ temp_byte.bits.bit7; + + ecc.bits.bit2 = ecc_last.bits.bit8 ^ ecc_last.bits.bit9 ^ temp_byte.bits.bit0 ^ temp_byte.bits.bit1; + + ecc.bits.bit3 = ecc_last.bits.bit9 ^ ecc_last.bits.bit10 ^ temp_byte.bits.bit1 ^ temp_byte.bits.bit2; + + ecc.bits.bit4 = ecc_last.bits.bit10 ^ ecc_last.bits.bit11 ^ temp_byte.bits.bit2 ^ temp_byte.bits.bit3; + + ecc.bits.bit5 = ecc_last.bits.bit11 ^ ecc_last.bits.bit12 ^ temp_byte.bits.bit3 ^ temp_byte.bits.bit4; + + ecc.bits.bit6 = ecc_last.bits.bit12 ^ ecc_last.bits.bit13 ^ temp_byte.bits.bit4 ^ temp_byte.bits.bit5; + + ecc.bits.bit7 = ecc_last.bits.bit13 ^ ecc_last.bits.bit14 ^ temp_byte.bits.bit5 ^ temp_byte.bits.bit6; + + ecc.bits.bit8 = ecc_last.bits.bit0 ^ ecc_last.bits.bit14 ^ ecc_last.bits.bit15 ^ temp_byte.bits.bit6 ^ temp_byte.bits.bit7; + + ecc.bits.bit9 = ecc_last.bits.bit1 ^ ecc_last.bits.bit15 ^ temp_byte.bits.bit7; + + ecc.bits.bit10 = ecc_last.bits.bit2; + + ecc.bits.bit11 = ecc_last.bits.bit3; + + ecc.bits.bit12 = ecc_last.bits.bit4; + + ecc.bits.bit13 = ecc_last.bits.bit5; + + ecc.bits.bit14 = ecc_last.bits.bit6; + + ecc.bits.bit15 = ecc_last.bits.bit7 ^ ecc_last.bits.bit8 ^ ecc_last.bits.bit9 ^ ecc_last.bits.bit10 + ^ ecc_last.bits.bit11 ^ ecc_last.bits.bit12 ^ ecc_last.bits.bit13 ^ ecc_last.bits.bit14 ^ ecc_last.bits.bit15 + ^ temp_byte.bits.bit0 ^ temp_byte.bits.bit1 ^ temp_byte.bits.bit2 ^ temp_byte.bits.bit3 + ^ temp_byte.bits.bit4 ^ temp_byte.bits.bit5 ^ temp_byte.bits.bit6 ^ temp_byte.bits.bit7; + + ecc_last.dshort = ecc.dshort; + } + } + } + pos += bank_len + 4; + } + + *ecc_val = ecc.dshort; + FTS_INFO(""); + return 0; +} + +/* calculate lcd init code checksum */ +static unsigned short cal_lcdinitcode_checksum(u8 *ptr , int length) +{ + + u16 cFcs = 0; + int i, j; + + if (length%2) { + return 0xFFFF; + } + + for (i = 0; i < length; i += 2) { + cFcs ^= ((ptr[i] << 8) + ptr[i+1]); + for (j = 0; j < 16; j++) { + if (cFcs & 1) { + cFcs = (unsigned short)((cFcs >> 1) ^ ((1 << 15) + (1 << 10) + (1 << 3))); + } else { + cFcs >>= 1; + } + } + } + return cFcs; +} + +static int print_data(u8 *buf, u32 len) +{ + int i = 0; + int n = 0; + u8 *p = NULL; + + p = kmalloc(len*4, GFP_KERNEL); + memset(p, 0, len*4); + + for (i = 0; i < len; i++) { + n += sprintf(p + n, "%02x ", buf[i]); + } + + FTS_DEBUG("%s", p); + + kfree(p); + return 0; +} + +static int read_3gamma(struct i2c_client *client, u8 **gamma, u16 *len) +{ + int ret = 0; + int i = 0; + int packet_num = 0; + int packet_len = 0; + int remainder = 0; + u8 cmd[4] = { 0 }; + u32 addr = 0x01D000; + u8 gamma_header[0x20] = { 0 }; + u16 gamma_len = 0; + u16 gamma_len_n = 0; + u16 pos = 0; + bool gamma_has_enable = false; + u8 *pgamma = NULL; + int j = 0; + u8 gamma_ecc = 0; + + cmd[0] = 0x03; + cmd[1] = (u8)(addr >> 16); + cmd[2] = (u8)(addr >> 8); + cmd[3] = (u8)addr; + ret = ft8006m_i2c_write(client, cmd, 4); + msleep(10); + ret = ft8006m_i2c_read(client, NULL, 0, gamma_header, 0x20); + if (ret < 0) { + FTS_ERROR("read 3-gamma header fail"); + return ret; + } + + gamma_len = (u16)((u16)gamma_header[0] << 8) + gamma_header[1]; + gamma_len_n = (u16)((u16)gamma_header[2] << 8) + gamma_header[3]; + + if ((gamma_len + gamma_len_n) != 0xFFFF) { + FTS_INFO("gamma length check fail:%x %x", gamma_len, gamma_len); + return -EIO; + } + + if ((gamma_header[4] + gamma_header[5]) != 0xFF) { + FTS_INFO("gamma ecc check fail:%x %x", gamma_header[4], gamma_header[5]); + return -EIO; + } + + if (gamma_len > MAX_GAMMA_LEN) { + FTS_ERROR("gamma data len(%d) is too long", gamma_len); + return -EINVAL; + } + + *gamma = kmalloc(MAX_GAMMA_LEN, GFP_KERNEL); + if (NULL == *gamma) { + FTS_ERROR("malloc gamma memory fail"); + return -ENOMEM; + } + pgamma = *gamma; + + packet_num = gamma_len/256; + packet_len = 256; + remainder = gamma_len%256; + if (remainder) + packet_num++; + FTS_INFO("3-gamma len:%d", gamma_len); + cmd[0] = 0x03; + addr += 0x20; + for (i = 0; i < packet_num; i++) { + addr += i * 256; + cmd[1] = (u8)(addr >> 16); + cmd[2] = (u8)(addr >> 8); + cmd[3] = (u8)addr; + if ((i == packet_num - 1) && remainder) + packet_len = remainder; + ret = ft8006m_i2c_write(client, cmd, 4); + msleep(10); + ret = ft8006m_i2c_read(client, NULL, 0, pgamma + i*256, packet_len); + if (ret < 0) { + FTS_ERROR("read 3-gamma data fail"); + return ret; + } + } + + + + for (j = 0; j < gamma_len; j++) { + gamma_ecc ^= pgamma[j]; + } + FTS_INFO("back_3gamma_ecc: 0x%x, 0x%x", gamma_ecc, gamma_header[0x04]); + if (gamma_ecc != gamma_header[0x04]) { + FTS_ERROR("back gamma ecc check fail:%x %x", gamma_ecc, gamma_header[0x04]); + return -EIO; + } + + + /* check last byte is 91 80 00 19 01 */ + pos = gamma_len - 5; + if ((gamma_enable[1] == pgamma[pos]) && (gamma_enable[2] == pgamma[pos+1]) + && (gamma_enable[3] == pgamma[pos+2]) && (gamma_enable[4] == pgamma[pos+3])) { + gamma_has_enable = true; + } + + if (false == gamma_has_enable) { + FTS_INFO("3-gamma has no gamma enable info"); + pgamma[gamma_len++] = gamma_enable[1]; + pgamma[gamma_len++] = gamma_enable[2]; + pgamma[gamma_len++] = gamma_enable[3]; + pgamma[gamma_len++] = gamma_enable[4]; + pgamma[gamma_len++] = gamma_enable[5]; + } + + *len = gamma_len; + + FTS_DEBUG("read 3-gamma data:"); + print_data(*gamma, gamma_len); + + return 0; +} + +static int replace_3gamma(u8 *initcode, u8 *gamma, u16 gamma_len) +{ + u16 gamma_pos = 0; + + /* Analog Gamma */ + if ((initcode[gamma_analog[0]] == gamma[gamma_pos]) + && (initcode[gamma_analog[0] + 1] == gamma[gamma_pos + 1])) { + memcpy(initcode + gamma_analog[0] + 4 , gamma + gamma_pos + 4, gamma_analog[5]); + gamma_pos += gamma_analog[5] + 4; + } else + goto find_gamma_bank_err; + + /* Digital1 Gamma */ + if ((initcode[gamma_digital1[0]] == gamma[gamma_pos]) + && (initcode[gamma_digital1[0] + 1] == gamma[gamma_pos + 1])) { + memcpy(initcode + gamma_digital1[0] + 4 , gamma + gamma_pos + 4, gamma_digital1[5]); + gamma_pos += gamma_digital1[5] + 4; + } else + goto find_gamma_bank_err; + + /* Digital2 Gamma */ + if ((initcode[gamma_digital2[0]] == gamma[gamma_pos]) + && (initcode[gamma_digital2[0] + 1] == gamma[gamma_pos + 1])) { + memcpy(initcode + gamma_digital2[0] + 4 , gamma + gamma_pos + 4, gamma_digital2[5]); + gamma_pos += gamma_digital2[5] + 4; + } else + goto find_gamma_bank_err; + + /* enable Gamma */ + if ((initcode[gamma_enable[0]] == gamma[gamma_pos]) + && (initcode[gamma_enable[0] + 1] == gamma[gamma_pos + 1])) { + if (gamma[gamma_pos + 4]) + initcode[gamma_enable[0] + 4 + 15] |= 0x01; + else + initcode[gamma_enable[0] + 4 + 15] &= 0xFE; + gamma_pos += 1 + 4; + } else + goto find_gamma_bank_err; + + FTS_DEBUG("replace 3-gamma data:"); + print_data(initcode, 1100); + + return 0; + +find_gamma_bank_err: + FTS_INFO("3-gamma bank(%02x %02x) not find", + gamma[gamma_pos], gamma[gamma_pos+1]); + return -ENODATA; +} + +static int read_replace_3gamma(struct i2c_client *client, u8 *buf) +{ + int ret = 0; + u16 initcode_ecc = 0; + u16 initcode_checksum = 0; + u8 *gamma = NULL; + u16 gamma_len = 0; + + FTS_FUNC_ENTER(); + + ret = read_3gamma(client, &gamma, &gamma_len); + if (ret < 0) { + FTS_INFO("no vaid 3-gamma data, not replace"); + return 0; + } + + ret = replace_3gamma(buf, gamma, gamma_len); + if (ret < 0) { + FTS_ERROR("replace 3-gamma fail"); + kfree(gamma); + return ret; + } + + ret = cal_lcdinitcode_ecc(buf, &initcode_ecc); + if (ret < 0) { + FTS_ERROR("lcd init code ecc calculate fail"); + kfree(gamma); + return ret; + } + FTS_INFO("lcd init code cal ecc:%04x", initcode_ecc); + buf[4] = (u8)(initcode_ecc >> 8); + buf[5] = (u8)(initcode_ecc); + buf[0x43d] = (u8)(initcode_ecc >> 8); + buf[0x43c] = (u8)(initcode_ecc); + + initcode_checksum = cal_lcdinitcode_checksum(buf + 2, 0x43e - 2); + FTS_INFO("lcd init code calc checksum:%04x", initcode_checksum); + buf[0] = (u8)(initcode_checksum >> 8); + buf[1] = (u8)(initcode_checksum); + + FTS_FUNC_EXIT(); + + kfree(gamma); + return 0; +} + + +int check_initial_code_valid(struct i2c_client *client, u8 *buf) +{ + int ret = 0; + u16 initcode_ecc = 0; + u16 initcode_checksum = 0; + + initcode_checksum = cal_lcdinitcode_checksum(buf + 2, 0x43e - 2); + FTS_INFO("lcd init code calc checksum:%04x", initcode_checksum); + if (initcode_checksum != ((u16)((u16)buf[0] << 8) + buf[1])) { + FTS_ERROR("Initial Code checksum fail"); + return -EINVAL; + } + + ret = cal_lcdinitcode_ecc(buf, &initcode_ecc); + if (ret < 0) { + FTS_ERROR("lcd init code ecc calculate fail"); + return ret; + } + FTS_INFO("lcd init code cal ecc:%04x", initcode_ecc); + if (initcode_ecc != ((u16)((u16)buf[4] << 8) + buf[5])) { + FTS_ERROR("Initial Code ecc check fail"); + return -EINVAL; + } + + return 0; +} + +static int Ft8006m_Read_Lockdown_From_Boot(struct i2c_client *client) +{ + u8 buf[16] = {0}; + u8 rbuf[4] = {0}; + u32 i = 0; + u8 auc_i2c_write_buf[10]; + int i_ret = 0; + int ret = 0; + bool inbootloader = false; + + ft8006m_ctpm_i2c_hid2std(client); + + i_ret = ft8006m_ctpm_start_fw_upgrade(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: send upgrade cmd to FW error!!"); + return i_ret; + } + + /*Enter upgrade mode*/ + ft8006m_ctpm_i2c_hid2std(client); + msleep(10); + + inbootloader = ft8006m_ctpm_check_run_state(client, FTS_RUN_IN_BOOTLOADER); + if (!inbootloader) { + FTS_ERROR("[UPGRADE]: not run in bootloader, upgrade fail!!"); + return -EIO; + } + + rbuf[0] = 0x03; + rbuf[1] = 0x00; + for (i = 0; i < 30; i++) { + rbuf[2] = 0x0f; + rbuf[3] = 0xa0; + + i_ret = ft8006m_i2c_write(client, rbuf, 4); + if (i_ret < 0) { + FTS_ERROR("[FTS] Step 4: read lcm id from flash error when i2c write, i_ret = %d\n", i_ret); + continue; + } + + msleep(10); + + i_ret = ft8006m_i2c_read(client, rbuf, 0, buf, 16); + if (i_ret < 0) { + FTS_ERROR("[FTS] Step 4: read lcm id from flash error when i2c write, i_ret = %d\n", i_ret); + continue; + } + } + + FTS_DEBUG("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", \ + buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], + buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]); + FTS_DEBUG("[UPGRADE]: reset the new FW!!"); + auc_i2c_write_buf[0] = FTS_REG_RESET_FW; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1000); + + ft8006m_ctpm_i2c_hid2std(client); +if (!strncmp(buf, TP_WHITE_LOCKDOWN, 16)) { + FTS_DEBUG(" BOOT status:TP color is WHITE\n"); + ret = 1; +} else if (!strncmp(buf, TP_BLACK_LOCKDOWN, 16)) { + FTS_DEBUG("BOOT status:TP color is BLACK\n"); + ret = 2; +} + + return ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_use_buf +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +static int ft8006m_ctpm_fw_upgrade_use_buf(struct i2c_client *client, u8 *pbt_buf, u32 dw_lenth) +{ + u8 reg_val[4] = {0}; + u32 i = 0; + u32 packet_number; + u32 j = 0; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 upgrade_ecc; + int i_ret = 0; + bool inbootloader = false; + + ft8006m_ctpm_i2c_hid2std(client); + + i_ret = ft8006m_ctpm_start_fw_upgrade(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: send upgrade cmd to FW error!!"); + return i_ret; + } + + /*Enter upgrade mode*/ + ft8006m_ctpm_i2c_hid2std(client); + msleep(10); + + inbootloader = ft8006m_ctpm_check_run_state(client, FTS_RUN_IN_BOOTLOADER); + if (!inbootloader) { + FTS_ERROR("[UPGRADE]: not run in bootloader, upgrade fail!!"); + return -EIO; + } + + /*send upgrade type to reg 0x09: 0x0B: upgrade; 0x0A: download*/ + auc_i2c_write_buf[0] = 0x09; + auc_i2c_write_buf[1] = 0x0B; + ft8006m_i2c_write(client, auc_i2c_write_buf, 2); + + /* + * All.bin <= 128K + * APP.bin <= 94K + * LCD_CFG <= 4K + */ + auc_i2c_write_buf[0] = 0xB0; + auc_i2c_write_buf[1] = (u8) ((dw_lenth >> 16) & 0xFF); + auc_i2c_write_buf[2] = (u8) ((dw_lenth >> 8) & 0xFF); + auc_i2c_write_buf[3] = (u8) (dw_lenth & 0xFF); + ft8006m_i2c_write(client, auc_i2c_write_buf, 4); + + + /*erase the app erea in flash*/ + i_ret = ft8006m_ctpm_erase_flash(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: erase flash error!!"); + return i_ret; + } + + /*write FW to ctpm flash*/ + upgrade_ecc = 0; + FTS_DEBUG("[UPGRADE]: write FW to ctpm flash!!"); + temp = 0; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = FTS_FW_WRITE_CMD; + + for (j = 0; j < packet_number; j++) { + temp = 0x5000 + j * FTS_PACKET_LENGTH; + packet_buf[1] = (u8) (temp >> 16); + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + upgrade_ecc ^= packet_buf[6 + i]; + } + ft8006m_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + + + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((j + 0x1000 + (0x5000/FTS_PACKET_LENGTH)) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + if (i > 15) { + msleep(1); + FTS_DEBUG("[UPGRADE]: write flash: host : %x status : %x!!", (j + 0x1000 + (0x5000/FTS_PACKET_LENGTH)), (((reg_val[0]) << 8) | reg_val[1])); + } + + ft8006m_ctpm_upgrade_delay(10000); + } + } + + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = 0x5000 + packet_number * FTS_PACKET_LENGTH; + packet_buf[1] = (u8) (temp >> 16); + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + upgrade_ecc ^= packet_buf[6 + i]; + } + ft8006m_i2c_write(client, packet_buf, temp + 6); + + + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((0x1000 + ((0x5000 + packet_number * FTS_PACKET_LENGTH)/((dw_lenth) % FTS_PACKET_LENGTH))) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + if (i > 15) { + msleep(1); + FTS_DEBUG("[UPGRADE]: write flash: host : %x status : %x!!", (j + 0x1000 + (0x5000/FTS_PACKET_LENGTH)), (((reg_val[0]) << 8) | reg_val[1])); + } + + ft8006m_ctpm_upgrade_delay(10000); + } + } + + msleep(50); + + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + FTS_DEBUG("[UPGRADE]: read out checksum!!"); + auc_i2c_write_buf[0] = 0x64; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); + + temp = 0x5000; + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(temp >> 16); + auc_i2c_write_buf[2] = (u8)(temp >> 8); + auc_i2c_write_buf[3] = (u8)(temp); + temp = (64*1024-1); + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 6); + msleep(dw_lenth/256); + + temp = (0x5000+(64*1024-1)); + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(temp >> 16); + auc_i2c_write_buf[2] = (u8)(temp >> 8); + auc_i2c_write_buf[3] = (u8)(temp); + temp = (dw_lenth-(64*1024-1)); + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 6); + msleep(dw_lenth/256); + + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + FTS_DEBUG("[UPGRADE]: reg_val[0]=%02x reg_val[0]=%02x!!", reg_val[0], reg_val[1]); + break; + } + msleep(1); + + } + auc_i2c_write_buf[0] = 0x66; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != upgrade_ecc) { + FTS_ERROR("[UPGRADE]: ecc error! FW=%02x upgrade_ecc=%02x!!", reg_val[0], upgrade_ecc); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: checksum %x %x!!", reg_val[0], upgrade_ecc); + + FTS_DEBUG("[UPGRADE]: reset the new FW!!"); + auc_i2c_write_buf[0] = FTS_REG_RESET_FW; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1000); + + ft8006m_ctpm_i2c_hid2std(client); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_use_buf +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +static int ft8006m_ctpm_lcd_cfg_upgrade_use_buf(struct i2c_client *client, u8 *pbt_buf, u32 dw_lenth) +{ + u8 reg_val[4] = {0}; + u32 i = 0; + u32 packet_number; + u32 j = 0; + u32 temp; + u32 lenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 upgrade_ecc; + int i_ret; + + ft8006m_ctpm_i2c_hid2std(client); + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + /*write 0xaa to register FTS_RST_CMD_REG1 */ + ft8006m_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_AA); + msleep(10); + + /*write 0x55 to register FTS_RST_CMD_REG1*/ + ft8006m_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_55); + msleep(200); + + /*Enter upgrade mode*/ + ft8006m_ctpm_i2c_hid2std(client); + + msleep(10); + auc_i2c_write_buf[0] = FTS_UPGRADE_55; + auc_i2c_write_buf[1] = FTS_UPGRADE_AA; + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 2); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: failed writing 0x55 and 0xaa!!"); + continue; + } + + /*check run in bootloader or not*/ + msleep(1); + auc_i2c_write_buf[0] = FTS_READ_ID_REG; + auc_i2c_write_buf[1] = auc_i2c_write_buf[2] = auc_i2c_write_buf[3] = 0x00; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 4, reg_val, 2); + + if (reg_val[0] == ft8006m_chip_types.bootloader_idh + && reg_val[1] == ft8006m_chip_types.bootloader_idl) { + FTS_DEBUG("[UPGRADE]: read bootload id ok!! ID1 = 0x%x, ID2 = 0x%x!!", reg_val[0], reg_val[1]); + break; + } else { + FTS_ERROR("[UPGRADE]: read bootload id fail!! ID1 = 0x%x, ID2 = 0x%x!!", reg_val[0], reg_val[1]); + continue; + } + } + + if (i >= FTS_UPGRADE_LOOP) + return -EIO; + + + i_ret = read_replace_3gamma(client, pbt_buf); + if (i_ret < 0) { + FTS_ERROR("replace 3-gamma fail, not upgrade lcd init code"); + return i_ret; + } + + i_ret = check_initial_code_valid(client, pbt_buf); + if (i_ret < 0) { + FTS_ERROR("initial code invalid, not upgrade lcd init code"); + return i_ret; + } + + /*send upgrade type to reg 0x09: 0x0B: upgrade; 0x0A: download*/ + auc_i2c_write_buf[0] = 0x09; + auc_i2c_write_buf[1] = 0x0C; + ft8006m_i2c_write(client, auc_i2c_write_buf, 2); + + /*Step 4:erase app and panel paramenter area*/ + FTS_DEBUG("[UPGRADE]: erase app and panel paramenter area!!"); + auc_i2c_write_buf[0] = FTS_ERASE_APP_REG; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1000); + + for (i = 0; i < 15; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + if (0xF0 == reg_val[0] && 0xAA == reg_val[1]) { + break; + } + msleep(50); + } + FTS_DEBUG("[UPGRADE]: erase app area reg_val[0] = %x reg_val[1] = %x!!", reg_val[0], reg_val[1]); + + auc_i2c_write_buf[0] = 0xB0; + auc_i2c_write_buf[1] = 0; + auc_i2c_write_buf[2] = (u8) ((dw_lenth >> 8) & 0xFF); + auc_i2c_write_buf[3] = (u8) (dw_lenth & 0xFF); + ft8006m_i2c_write(client, auc_i2c_write_buf, 4); + + /*write FW to ctpm flash*/ + upgrade_ecc = 0; + FTS_DEBUG("[UPGRADE]: write FW to ctpm flash!!"); + temp = 0; + packet_number = (dw_lenth) / FTS_PACKET_LENGTH; + packet_buf[0] = FTS_FW_WRITE_CMD; + packet_buf[1] = 0; + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + lenght = FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (lenght >> 8); + packet_buf[5] = (u8) lenght; + for (i = 0; i < FTS_PACKET_LENGTH; i++) { + packet_buf[6 + i] = pbt_buf[j * FTS_PACKET_LENGTH + i]; + upgrade_ecc ^= packet_buf[6 + i]; + } + ft8006m_i2c_write(client, packet_buf, FTS_PACKET_LENGTH + 6); + + + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((j + 0x1000) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + if (i > 15) { + msleep(1); + FTS_DEBUG("[UPGRADE]: write flash: host : %x status : %x!!", (j + 0x1000 + (0x5000/FTS_PACKET_LENGTH)), (((reg_val[0]) << 8) | reg_val[1])); + } + + ft8006m_ctpm_upgrade_delay(10000); + } + } + + if ((dw_lenth) % FTS_PACKET_LENGTH > 0) { + temp = packet_number * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + temp = (dw_lenth) % FTS_PACKET_LENGTH; + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = pbt_buf[packet_number * FTS_PACKET_LENGTH + i]; + upgrade_ecc ^= packet_buf[6 + i]; + } + ft8006m_i2c_write(client, packet_buf, temp + 6); + + + for (i = 0; i < 30; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((0x1000 + ((packet_number * FTS_PACKET_LENGTH)/((dw_lenth) % FTS_PACKET_LENGTH))) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + if (i > 15) { + msleep(1); + FTS_DEBUG("[UPGRADE]: write flash: host : %x status : %x!!", (j + 0x1000 + (0x5000/FTS_PACKET_LENGTH)), (((reg_val[0]) << 8) | reg_val[1])); + } + + ft8006m_ctpm_upgrade_delay(10000); + } + } + + msleep(50); + + /*********Step 6: read out checksum***********************/ + /*send the opration head */ + FTS_DEBUG("[UPGRADE]: read out checksum!!"); + auc_i2c_write_buf[0] = 0x64; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); + + temp = 0x00; + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = 0; + auc_i2c_write_buf[2] = (u8)(temp >> 8); + auc_i2c_write_buf[3] = (u8)(temp); + temp = dw_lenth; + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 6); + msleep(dw_lenth/256); + + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + FTS_DEBUG("[UPGRADE]: reg_val[0]=%02x reg_val[0]=%02x!!", reg_val[0], reg_val[1]); + break; + } + msleep(1); + + } + auc_i2c_write_buf[0] = 0x66; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != upgrade_ecc) { + FTS_ERROR("[UPGRADE]: ecc error! FW=%02x upgrade_ecc=%02x!!", reg_val[0], upgrade_ecc); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: checksum %x %x!!", reg_val[0], upgrade_ecc); + + FTS_DEBUG("[UPGRADE]: reset the new FW!!"); + auc_i2c_write_buf[0] = FTS_REG_RESET_FW; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1000); + + ft8006m_ctpm_i2c_hid2std(client); + + return 0; +} +#endif +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_with_app_i_file +* Brief: upgrade with *.i file +* Input: i2c info +* Output: +* Return: fail < 0 +***********************************************************************/ +static int ft8006m_ctpm_fw_upgrade_with_app_i_file(struct i2c_client *client) +{ + int i_ret = 0; + u32 fw_len; + u8 *fw_buf; + + FTS_INFO("[UPGRADE]**********start upgrade with app.i**********"); + + fw_len = ft8006m_g_fw_len - APP_OFFSET; + fw_buf = ft8006m_g_fw_file + APP_OFFSET; + if (fw_len < APP_FILE_MIN_SIZE || fw_len > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fw_len); + return -EIO; + } + + i_ret = ft8006m_ctpm_fw_upgrade_use_buf(client, fw_buf, fw_len); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE] upgrade app.i failed"); + } else { + FTS_INFO("[UPGRADE]: upgrade app.i succeed"); + } + + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_fw_upgrade_with_lcd_cfg_i_file +* Brief: upgrade with *.i file +* Input: i2c info +* Output: no +* Return: fail <0 +***********************************************************************/ +static int ft8006m_ctpm_fw_upgrade_with_lcd_cfg_i_file(struct i2c_client *client) +{ + int i_ret = 0; + u32 fw_len; + u8 *fw_buf; + + FTS_INFO("[UPGRADE]**********start upgrade with lcd init code**********"); + + fw_len = ft8006m_g_fw_len; + fw_buf = ft8006m_g_fw_file; + if (fw_len < APP_FILE_MIN_SIZE || fw_len > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fw_len); + return -EIO; + } + + /*FW upgrade*/ + i_ret = ft8006m_ctpm_lcd_cfg_upgrade_use_buf(client, fw_buf, 4096); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE] init code upgrade fail, ret=%d", i_ret); + } else { + FTS_INFO("[UPGRADE] init code upgrade succeed"); + } + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_with_app_bin_file +* Brief: upgrade with *.bin file +* Input: i2c info, file name +* Output: no +* Return: success =0 +***********************************************************************/ +static int ft8006m_ctpm_fw_upgrade_with_app_bin_file(struct i2c_client *client, char *firmware_name) +{ + u8 *pbt_buf = NULL; + int i_ret = 0; + int fwsize = 0; + + FTS_INFO("[UPGRADE]**********start upgrade with app.bin**********"); + + fwsize = ft8006m_GetFirmwareSize(firmware_name); + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: app.bin length(%x) error, upgrade fail", fwsize); + return -EIO; + } + + pbt_buf = (unsigned char *)kmalloc(fwsize + 1, GFP_KERNEL); + if (NULL == pbt_buf) { + FTS_ERROR(" malloc pbt_buf failed "); + goto ERROR_BIN; + } + + if (ft8006m_ReadFirmware(firmware_name, pbt_buf)) { + FTS_ERROR("[UPGRADE]: request_firmware failed!!"); + goto ERROR_BIN; + } +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN + i_ret = ft8006m_ctpm_lcd_cfg_upgrade_use_buf(client, pbt_buf, 4096); + i_ret = ft8006m_ctpm_fw_upgrade_use_buf(client, pbt_buf + APP_OFFSET, fwsize - APP_OFFSET); +#else + i_ret = ft8006m_ctpm_fw_upgrade_use_buf(client, pbt_buf, fwsize); +#endif + if (i_ret != 0) { + FTS_ERROR("[UPGRADE]: upgrade app.bin failed"); + goto ERROR_BIN; + } else { + FTS_INFO("[UPGRADE]: upgrade app.bin succeed"); + } + + + kfree(pbt_buf); + return i_ret; +ERROR_BIN: + kfree(pbt_buf); + return -EIO; +} + + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_idc.c b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_idc.c new file mode 100755 index 0000000000000..e81b27ada8239 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_idc.c @@ -0,0 +1,575 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_idc.c +* +* Author: fupeipei +* +* Created: 2016-08-22 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" + +#if (FTS_CHIP_IDC == 1) +#include "../focaltech_flash.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +u8 ft8006m_upgrade_ecc; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/************************************************************************ +* Name: ft8006m_ctpm_upgrade_idc_init +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_upgrade_idc_init(struct i2c_client *client) +{ + int i_ret = 0; + u8 reg_val_id[4] = {0}; + u8 auc_i2c_write_buf[10]; + + FTS_INFO("[UPGRADE]**********Upgrade setting Init**********"); + + /*read flash ID*/ + auc_i2c_write_buf[0] = 0x05; + reg_val_id[0] = 0x00; + i_ret = ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val_id, 1); + if (i_ret < 0) { + return -EIO; + } + + /*set flash clk*/ + auc_i2c_write_buf[0] = 0x05; + auc_i2c_write_buf[1] = reg_val_id[0]; + auc_i2c_write_buf[2] = 0x00; + ft8006m_i2c_write(client, auc_i2c_write_buf, 3); + + /*send upgrade type to reg 0x09: 0x0B: upgrade; 0x0A: download*/ + auc_i2c_write_buf[0] = 0x09; + auc_i2c_write_buf[1] = 0x0B; + ft8006m_i2c_write(client, auc_i2c_write_buf, 2); + + return 0; +} + +/************************************************************************ +* Name: ft8006m_ctpm_start_pramboot +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +void ft8006m_ctpm_start_pramboot(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[10]; + + FTS_INFO("[UPGRADE]**********start pramboot**********"); + auc_i2c_write_buf[0] = 0x08; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(20); +} + +/************************************************************************ +* Name: ft8006m_ctpm_start_fw_upgrade +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_start_fw_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + /*send the soft upgrade commond to FW, and start upgrade*/ + FTS_INFO("[UPGRADE]**********send 0xAA and 0x55 to FW, start upgrade**********"); + + i_ret = ft8006m_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_AA); + msleep(10); + i_ret = ft8006m_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_55); + msleep(200); + + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_check_run_state +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +bool ft8006m_ctpm_check_run_state(struct i2c_client *client, int rstate) +{ + int i = 0; + enum FW_STATUS cstate = FTS_RUN_IN_ERROR; + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + cstate = ft8006m_ctpm_get_pram_or_rom_id(client); + FTS_DEBUG("[UPGRADE]: run state = %d", cstate); + + if (cstate == rstate) + return true; + msleep(20); + } + + return false; +} + +/************************************************************************ +* Name: ft8006m_ctpm_pramboot_ecc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_pramboot_ecc(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_FUNC_ENTER(); + + /*read out checksum, if pramboot checksum != host checksum, upgrade fail*/ + FTS_INFO("[UPGRADE]******read out pramboot checksum******"); + auc_i2c_write_buf[0] = 0xcc; + msleep(2); + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != ft8006m_upgrade_ecc) { /*pramboot checksum != host checksum, upgrade fail*/ + FTS_ERROR("[UPGRADE]: checksum fail : pramboot_ecc = %X, host_ecc = %X!!", reg_val[0], ft8006m_upgrade_ecc); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: checksum success : pramboot_ecc = %X, host_ecc = %X!!", reg_val[0], ft8006m_upgrade_ecc); + msleep(100); + + FTS_FUNC_EXIT(); + + return 0; +} + +/************************************************************************ +* Name: ft8006m_ctpm_upgrade_ecc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_upgrade_ecc(struct i2c_client *client, u32 startaddr, u32 length) +{ + u32 i = 0; + u8 auc_i2c_write_buf[10]; + u32 temp; + u8 reg_val[4] = {0}; + int i_ret = 0; + + FTS_INFO("[UPGRADE]**********read out checksum**********"); + + /*check sum init*/ + auc_i2c_write_buf[0] = 0x64; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); + + /*send commond to pramboot to start checksum*/ + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(startaddr >> 16); + auc_i2c_write_buf[2] = (u8)(startaddr >> 8); + auc_i2c_write_buf[3] = (u8)(startaddr); + + if (length > LEN_FLASH_ECC_MAX) { + temp = LEN_FLASH_ECC_MAX; + } else { + temp = length; + } + + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 6); + msleep(length/256); + + /*read status : if check sum is finished?*/ + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + break; + } + msleep(1); + + } + + if (length > LEN_FLASH_ECC_MAX) { + temp = LEN_FLASH_ECC_MAX; + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(temp >> 16); + auc_i2c_write_buf[2] = (u8)(temp >> 8); + auc_i2c_write_buf[3] = (u8)(temp); + temp = length-LEN_FLASH_ECC_MAX; + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = ft8006m_i2c_write(client, auc_i2c_write_buf, 6); + + msleep(length/256); + + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + break; + } + msleep(1); + } + } + + /*read out check sum*/ + auc_i2c_write_buf[0] = 0x66; + i_ret = ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != ft8006m_upgrade_ecc) /*if check sum fail, upgrade fail*/ { + FTS_ERROR("[UPGRADE]: ecc error! FW=%02x ft8006m_upgrade_ecc=%02x!!", reg_val[0], ft8006m_upgrade_ecc); + return -EIO; + } + + FTS_DEBUG("[UPGRADE]: ecc success : FW=%02x ft8006m_upgrade_ecc=%02x!!", reg_val[0], ft8006m_upgrade_ecc); + + ft8006m_upgrade_ecc = 0; + + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_erase_flash +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_erase_flash(struct i2c_client *client) +{ + u32 i = 0; + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_INFO("[UPGRADE]**********erase app now**********"); + + /*send to erase flash*/ + auc_i2c_write_buf[0] = 0x61; + ft8006m_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1350); + + for (i = 0; i < 15; i++) { + /*get the erase app status, if get 0xF0AA£¬erase flash success*/ + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0xAA == reg_val[1]) /*erase flash success*/ { + break; + } + msleep(50); + } + + if ((0xF0 != reg_val[0] || 0xAA != reg_val[1]) && (i >= 15)) /*erase flash fail*/ { + FTS_ERROR("[UPGRADE]: erase app error.reset tp and reload FW!!"); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: erase app ok!!"); + + return 0; +} + +/************************************************************************ +* Name: ft8006m_ctpm_write_pramboot_for_idc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_write_pramboot_for_idc(struct i2c_client *client, u32 length, u8 *readbuf) +{ + u32 i = 0; + u32 j; + u32 temp; + u32 packet_number; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + + ft8006m_upgrade_ecc = 0; + FTS_INFO("[UPGRADE]**********write pramboot to pram**********"); + + temp = 0; + packet_number = (length) / FTS_PACKET_LENGTH; + if ((length) % FTS_PACKET_LENGTH > 0) { + packet_number++; + } + packet_buf[0] = 0xae; + packet_buf[1] = 0x00; + + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + if (j < (packet_number-1)) { + temp = FTS_PACKET_LENGTH; + } else { + temp = (length) % FTS_PACKET_LENGTH; + } + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = readbuf[j * FTS_PACKET_LENGTH + i]; + ft8006m_upgrade_ecc ^= packet_buf[6 + i]; + } + ft8006m_i2c_write(client, packet_buf, temp + 6); + } + + return 0; +} + +/************************************************************************ +* Name: ft8006m_ctpm_write_app_for_idc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_ctpm_write_app_for_idc(struct i2c_client *client, u32 length, u8 *readbuf) +{ + u32 j; + u32 i = 0; + u32 packet_number; + u32 temp; + u32 writelenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_INFO("[UPGRADE]**********write app to flash**********"); + + ft8006m_upgrade_ecc = 0; + + packet_number = (length) / FTS_PACKET_LENGTH; + if (((length) % FTS_PACKET_LENGTH) > 0) { + packet_number++; + } + + packet_buf[0] = 0xbf; + + for (j = 0; j < packet_number; j++) { + temp = 0x1000+j * FTS_PACKET_LENGTH; + + if (j < (packet_number-1)) { + writelenght = FTS_PACKET_LENGTH; + } else { + writelenght = ((length) % FTS_PACKET_LENGTH); + } + packet_buf[1] = (u8) (temp >> 16); + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + packet_buf[4] = (u8) (writelenght >> 8); + packet_buf[5] = (u8) writelenght; + + for (i = 0; i < writelenght; i++) { + packet_buf[6 + i] = readbuf[(temp - 0x1000+i)]; + ft8006m_upgrade_ecc ^= packet_buf[6 + i]; + } + + ft8006m_i2c_write(client, packet_buf, (writelenght + 6)); + + for (i = 0; i < 30; i++) { + /*read status and check if the app writting is finished*/ + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + ft8006m_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((j + 0x20+0x1000) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + ft8006m_ctpm_upgrade_delay(1000); + } + } + msleep(50); + + return 0; +} + + +typedef enum { + APP_LEN = 0x00, + APP_LEN_NE = 0x02, + APP_P1_ECC = 0x04, + APP_P1_ECC_NE = 0x06, + APP_P2_ECC = 0x08, + APP_P2_ECC_NE = 0x0A, + APP_LEN_H = 0x12, + APP_LEN_H_NE = 0x14, + APP_BLR_ID = 0x1C, + APP_BLR_ID_NE = 0x1D, + PBOOT_ID_H = 0x1E, + PBOOT_ID_L = 0x1F +} ENUM_APP_INFO; + +#define AL2_FCS_COEF ((1 << 15) + (1 << 10) + (1 << 3)) + +#if ((FTS_CHIP_TYPE == _FT8006) || (FTS_CHIP_TYPE == _FT8736)) +#define FW_CFG_TOTAL_SIZE 0x80 +#else +#define FW_CFG_TOTAL_SIZE 0x00 +#endif +#define APP1_START 0x00 +#define APP1_LEN 0x100 +#define APP_VERIF_ADDR (APP1_START + APP1_LEN) +#define APP_VERIF_LEN 0x20 +#define APP1_ECC_ADDR (APP_VERIF_ADDR + APP_P1_ECC) +#define APP2_START (APP_VERIF_ADDR + APP_VERIF_LEN + FW_CFG_TOTAL_SIZE) +#define APP2_ECC_ADDR (APP_VERIF_ADDR + APP_P2_ECC) +/***************************************************************************** +* Name: DrvReadPram16 +* Brief: Get Word +* Input: +* Output: +* Return: +*****************************************************************************/ +static u16 data_word(u8 *pbt_buf, u32 addr) +{ + return (((u16)pbt_buf[addr]<<8) + pbt_buf[addr+1]); +} + +/****************************************************************************** +* Name: GetCrc16 +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +u16 ft8006m_crc_calc(u8 *pbt_buf, u32 addr, u16 length) +{ + u16 cFcs = 0; + u16 i, j; + + FTS_DEBUG("[UPGRADE][ECC] : %04x data:%04x, len:%04x!!", (addr), data_word(pbt_buf, (addr)), length); + for (i = 0; i < length; i++) { + cFcs ^= data_word(pbt_buf, (addr+i*2)); + for (j = 0; j < 16; j++) { + if (cFcs & 1) { + cFcs = (u16)((cFcs >> 1) ^ AL2_FCS_COEF); + } else { + cFcs >>= 1; + } + } + } + return cFcs; +} + +/***************************************************************************** +* Name: task_check_mem +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +bool ft8006m_ecc_check(u8 *pbt_buf, u32 star_addr, u32 len, u16 ecc_addr) +{ + u16 ecc1; + u16 ecc2; + u16 cal_ecc; + + ecc1 = data_word(pbt_buf, ecc_addr); + ecc2 = data_word(pbt_buf, ecc_addr+2); + + if ((ecc1 + ecc2) != 0xFFFF) { + return false; + } + + cal_ecc = ft8006m_crc_calc(pbt_buf, star_addr, (len/2)); + + FTS_DEBUG("[UPGRADE][ECC] : ecc1 = %x, cal_ecc = %x", ecc1, cal_ecc); + if (ecc1 != cal_ecc) { + FTS_DEBUG("[UPGRADE][ECC] : ecc error!!"); + return false; + } + return true; +} + +/***************************************************************************** +* Name: ft8006m_check_app_bin_valid_idc +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +bool ft8006m_check_app_bin_valid_idc(u8 *pbt_buf) +{ + u32 len; +#if (FTS_CHIP_TYPE != _FT8006) + /* 1. First Byte */ + if (pbt_buf[0] != 0x02) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- the first byte(%x) error", pbt_buf[0]); + return false; + } +#endif + /* 2 PART1 ECC */ + if (!ft8006m_ecc_check(pbt_buf, APP1_START, APP1_LEN, APP1_ECC_ADDR)) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- ecc1 error"); + return false; + } + + /* 3. PART2 ECC */ + if ((data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN) + data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_NE)) != 0xFFFF) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- Length XOR error"); + return false; + } + len = data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN); +#if (FTS_CHIP_TYPE == _FT8006) + if ((data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) + data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H_NE)) != 0xFFFF) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- Length2 XOR error"); + return false; + } + len += ((u32)data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) << 16); +#endif + FTS_DEBUG("%x %x %x %x", APP2_START, len, ((u32)data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) << 16), data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN)); + len -= APP2_START; + + return ft8006m_ecc_check(pbt_buf, APP2_START, len, APP2_ECC_ADDR); +} + + +#endif /* IDC */ diff --git a/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_test.c b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_test.c new file mode 100755 index 0000000000000..ffd34fc52bf66 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_flash/focaltech_upgrade_test.c @@ -0,0 +1,167 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_test.c +* +* Author: fupeipei +* +* Created: 2016-08-22 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" +#include "../focaltech_flash.h" +#include +#include + +/***************************************************************************** +* Static variables +*****************************************************************************/ +#define FTS_GET_UPGRADE_TIME 0 + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct wake_lock ft8006m_ps_lock; + +#define FTS_DEBUG_UPGRADE(fmt, args...) do {\ + printk(KERN_ERR "[FTS][UPGRADE]:##############################################################################\n");\ + printk(KERN_ERR "[FTS][UPGRADE]: "fmt"\n", ##args);\ + printk(KERN_ERR "[FTS][UPGRADE]:##############################################################################\n");\ + } while (0)\ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if (FTS_UPGRADE_STRESS_TEST) +/************************************************************************ +* Name: ft8006m_ctpm_auto_upgrade_pingpong +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +static int ft8006m_ctpm_auto_upgrade_pingpong(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + int i_ret = 0; + u8 uc_upgrade_times = 0; + + FTS_FUNC_ENTER(); + + /* pingpong test mode, need upgrade */ + FTS_INFO("[UPGRADE]: pingpong test mode, need upgrade!!"); + do { + uc_upgrade_times++; + + /* fw upgrade */ + i_ret = ft8006m_ctpm_fw_upgrade(client); + + if (i_ret == 0) {/* upgrade success */ + ft8006m_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + FTS_DEBUG("[UPGRADE]: upgrade to new version 0x%x", uc_tp_fm_ver); + } else /* upgrade fail */ { + /* if upgrade fail, reset to run ROM. if app in flash is ok. TP will work success */ + FTS_INFO("[UPGRADE]: upgrade fail, reset now!!"); + ft8006m_ctpm_rom_or_pram_reset(client); + } + } while ((i_ret != 0) && (uc_upgrade_times < 2)); /* if upgrade fail, upgrade again. then return */ + + FTS_FUNC_EXIT(); + return i_ret; +} + +/************************************************************************ +* Name: ft8006m_ctpm_auto_upgrade +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +void fts_ctpm_display_upgrade_time(bool start_time) +{ +#if FTS_GET_UPGRADE_TIME + static struct timeval tpend; + static struct timeval tpstart; + static int timeuse; + + if (start_time) { + do_gettimeofday(&tpstart); + } else { + do_gettimeofday(&tpend); + timeuse = 1000000 * (tpend.tv_sec-tpstart.tv_sec) + tpend.tv_usec-tpstart.tv_usec; + timeuse /= 1000000; + FTS_DEBUG("[UPGRADE]: upgrade success : Use time: %d Seconds!!", timeuse); + } +#endif +} + +/************************************************************************ +* Name: ft8006m_ctpm_auto_upgrade +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +int ft8006m_ctpm_auto_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + static int uc_ErrorTimes + static int uc_UpgradeTimes + + wake_lock_init(&ft8006m_ps_lock, WAKE_LOCK_SUSPEND, "tp_wakelock"); + + wake_lock(&ft8006m_ps_lock); + + /* (FTS_GET_VENDOR_ID_NUM == 0) */ + ft8006m_g_fw_file = FT8006M_CTPM_FW; + ft8006m_g_fw_len = ft8006m_getsize(FW_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:FT8006M_CTPM_FW, SIZE:%x", ft8006m_g_fw_len); + + do { + uc_UpgradeTimes++; + + FTS_DEBUG_UPGRADE("start to upgrade %d times !!", uc_UpgradeTimes); + + fts_ctpm_display_upgrade_time(true); + + i_ret = ft8006m_ctpm_auto_upgrade_pingpong(client); + if (i_ret == 0) { + fts_ctpm_display_upgrade_time(false); + } else { + uc_ErrorTimes++; + } + + FTS_DEBUG_UPGRADE("upgrade %d times, error %d times!!", uc_UpgradeTimes, uc_ErrorTimes); + } while (uc_UpgradeTimes < (FTS_UPGRADE_TEST_NUMBER)); + + wake_unlock(&ft8006m_ps_lock); + + return 0; +} +#endif + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_gesture.c b/drivers/input/touchscreen/FT8006m/focaltech_gesture.c new file mode 100755 index 0000000000000..f6d1f307d5a58 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_gesture.c @@ -0,0 +1,683 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_gestrue.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#if FTS_GESTURE_EN +/****************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define KEY_GESTURE_U KEY_U +#define KEY_GESTURE_UP KEY_UP +#define KEY_GESTURE_DOWN KEY_DOWN +#define KEY_GESTURE_LEFT KEY_LEFT +#define KEY_GESTURE_RIGHT KEY_RIGHT +#define KEY_GESTURE_O KEY_O +#define KEY_GESTURE_E KEY_E +#define KEY_GESTURE_M KEY_M +#define KEY_GESTURE_L KEY_L +#define KEY_GESTURE_W KEY_W +#define KEY_GESTURE_S KEY_S +#define KEY_GESTURE_V KEY_V +#define KEY_GESTURE_C KEY_C +#define KEY_GESTURE_Z KEY_Z + +#define GESTURE_LEFT 0x20 +#define GESTURE_RIGHT 0x21 +#define GESTURE_UP 0x22 +#define GESTURE_DOWN 0x23 +#define GESTURE_DOUBLECLICK 0x24 +#define GESTURE_O 0x30 +#define GESTURE_W 0x31 +#define GESTURE_M 0x32 +#define GESTURE_E 0x33 +#define GESTURE_L 0x44 +#define GESTURE_S 0x46 +#define GESTURE_V 0x54 +#define GESTURE_Z 0x41 +#define GESTURE_C 0x34 +#define FTS_GESTRUE_POINTS 255 +#define FTS_GESTRUE_POINTS_HEADER 8 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* +* header - byte0:gesture id +* byte1:pointnum +* byte2~7:reserved +* coordinate_x - All gesture point x coordinate +* coordinate_y - All gesture point y coordinate +* mode - 1:enable gesture function(default) +* - 0:disable +* active - 1:enter into gesture(suspend) +* 0:gesture disable or resume +*/ +struct fts_gesture_st { + u8 header[FTS_GESTRUE_POINTS_HEADER]; + u16 coordinate_x[FTS_GESTRUE_POINTS]; + u16 coordinate_y[FTS_GESTRUE_POINTS]; + u8 mode; + u8 active; +}; + + + +struct gesture_struct ft8006m_gesture_data = {0, 0}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct fts_gesture_st fts_ft8006m_gesture_data; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); + +/* sysfs gesture node + * read example: cat fts_gesture_mode ---read gesture mode + * write example:echo 01 > fts_gesture_mode ---write gesture mode to 01 + * + */ +static DEVICE_ATTR (fts_gesture_mode, S_IRUGO|S_IWUSR, fts_gesture_show, fts_gesture_store); +/* + * read example: cat fts_gesture_buf ---read gesture buf + */ +static DEVICE_ATTR (fts_gesture_buf, S_IRUGO|S_IWUSR, fts_gesture_buf_show, fts_gesture_buf_store); +static struct attribute *fts_gesture_mode_attrs[] = { + + &dev_attr_fts_gesture_mode.attr, + &dev_attr_fts_gesture_buf.attr, + NULL, +}; + +static struct attribute_group fts_gesture_group = { + .attrs = fts_gesture_mode_attrs, +}; + +/************************************************************************ +* Name: fts_gesture_show +* Brief: +* Input: device, device attribute, char buf +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + u8 val; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&ft8006m_input_dev->mutex); + ft8006m_i2c_read_reg(client, FTS_REG_GESTURE_EN, &val); + count = sprintf(buf, "Gesture Mode: %s\n", fts_ft8006m_gesture_data.mode ? "On" : "Off"); + count += sprintf(buf + count, "Reg(0xD0) = %d\n", val); + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_store +* Brief: +* Input: device, device attribute, char buf, char count +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + mutex_lock(&ft8006m_input_dev->mutex); + + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[GESTURE]enable gesture"); + fts_ft8006m_gesture_data.mode = ENABLE; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[GESTURE]disable gesture"); + fts_ft8006m_gesture_data.mode = DISABLE; + } + + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_buf_show +* Brief: +* Input: device, device attribute, char buf +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + int i = 0; + + mutex_lock(&ft8006m_input_dev->mutex); + count = snprintf(buf, PAGE_SIZE, "Gesture ID: 0x%x\n", fts_ft8006m_gesture_data.header[0]); + count += snprintf(buf + count, PAGE_SIZE, "Gesture PointNum: %d\n", fts_ft8006m_gesture_data.header[1]); + count += snprintf(buf + count, PAGE_SIZE, "Gesture Point Buf:\n"); + for (i = 0; i < fts_ft8006m_gesture_data.header[1]; i++) { + count += snprintf(buf + count, PAGE_SIZE, "%3d(%4d,%4d) ", i, fts_ft8006m_gesture_data.coordinate_x[i], fts_ft8006m_gesture_data.coordinate_y[i]); + if ((i + 1)%4 == 0) + count += snprintf(buf + count, PAGE_SIZE, "\n"); + } + count += snprintf(buf + count, PAGE_SIZE, "\n"); + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_buf_store +* Brief: +* Input: device, device attribute, char buf, char count +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/***************************************************************************** +* Name: ft8006m_create_gesture_sysfs +* Brief: +* Input: +* Output: +* Return: 0-success or others-error +*****************************************************************************/ +int ft8006m_create_gesture_sysfs(struct i2c_client *client) +{ + int ret = 0; + + ret = sysfs_create_group(&client->dev.kobj, &fts_gesture_group); + if (ret != 0) { + FTS_ERROR("[GESTURE]fts_gesture_mode_group(sysfs) create failed!"); + sysfs_remove_group(&client->dev.kobj, &fts_gesture_group); + return ret; + } + return 0; +} + +/***************************************************************************** +* Name: fts_gesture_report +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_gesture_report(struct input_dev *input_dev, int gesture_id) +{ + int gesture; + + FTS_FUNC_ENTER(); + FTS_DEBUG("fts gesture_id==0x%x ", gesture_id); + switch (gesture_id) { + case GESTURE_LEFT: + gesture = KEY_GESTURE_LEFT; + break; + case GESTURE_RIGHT: + gesture = KEY_GESTURE_RIGHT; + break; + case GESTURE_UP: + gesture = KEY_GESTURE_UP; + break; + case GESTURE_DOWN: + gesture = KEY_GESTURE_DOWN; + break; + case GESTURE_DOUBLECLICK: + gesture = KEY_GESTURE_U; + break; + case GESTURE_O: + gesture = KEY_GESTURE_O; + break; + case GESTURE_W: + gesture = KEY_GESTURE_W; + break; + case GESTURE_M: + gesture = KEY_GESTURE_M; + break; + case GESTURE_E: + gesture = KEY_GESTURE_E; + break; + case GESTURE_L: + gesture = KEY_GESTURE_L; + break; + case GESTURE_S: + gesture = KEY_GESTURE_S; + break; + case GESTURE_V: + gesture = KEY_GESTURE_V; + break; + case GESTURE_Z: + gesture = KEY_GESTURE_Z; + break; + case GESTURE_C: + gesture = KEY_GESTURE_C; + break; + default: + gesture = -1; + break; + } + /* report event key */ + if (gesture != -1) { + if (gesture_id == GESTURE_DOUBLECLICK) { + FTS_DEBUG("Gesture Code=%d", gesture); + input_report_key(input_dev, DOUBLE_CLICK, 1); + input_sync(input_dev); + input_report_key(input_dev, DOUBLE_CLICK, 0); + input_sync(input_dev); + } + } + + FTS_FUNC_EXIT(); +} + +/************************************************************************ +* Name: ft8006m_gesture_readdata +* Brief: read data from TP register +* Input: +* Output: +* Return: fail <0 +***********************************************************************/ +static int fts_gesture_read_buffer(struct i2c_client *client, u8 *buf, int read_bytes) +{ + int remain_bytes; + int ret; + int i; + if (read_bytes <= I2C_BUFFER_LENGTH_MAXINUM) { + ret = ft8006m_i2c_read(client, buf, 1, buf, read_bytes); + } else { + ret = ft8006m_i2c_read(client, buf, 1, buf, I2C_BUFFER_LENGTH_MAXINUM); + remain_bytes = read_bytes - I2C_BUFFER_LENGTH_MAXINUM; + for (i = 1; remain_bytes > 0; i++) { + if (remain_bytes <= I2C_BUFFER_LENGTH_MAXINUM) + ret = ft8006m_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, remain_bytes); + else + ret = ft8006m_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, I2C_BUFFER_LENGTH_MAXINUM); + remain_bytes -= I2C_BUFFER_LENGTH_MAXINUM; + } + } + + return ret; +} + +/************************************************************************ +* Name: fts_gesture_fw +* Brief: Check IC's gesture recognise by FW or not +* Input: +* Output: +* Return: 1- FW 0- Driver +***********************************************************************/ +static int fts_gesture_fw(void) +{ + int ret = 0; + + switch (ft8006m_chip_types.chip_idh) { + case 0x54: + case 0x58: + case 0x64: + case 0x87: + case 0x86: + case 0x80: + case 0xE7: + ret = 1; + break; + default: + ret = 0; + break; + } + return ret; +} + +/************************************************************************ +* Name: ft8006m_gesture_readdata +* Brief: read data from TP register +* Input: +* Output: +* Return: fail <0 +***********************************************************************/ +int ft8006m_gesture_readdata(struct i2c_client *client) +{ + u8 buf[FTS_GESTRUE_POINTS * 4] = { 0 }; + int ret = -1; + int i = 0; + int gestrue_id = 0; + int read_bytes = 0; + u8 pointnum; + + FTS_FUNC_ENTER(); + /* init variable before read gesture point */ + memset(fts_ft8006m_gesture_data.header, 0, FTS_GESTRUE_POINTS_HEADER); + memset(fts_ft8006m_gesture_data.coordinate_x, 0, FTS_GESTRUE_POINTS * sizeof(u16)); + memset(fts_ft8006m_gesture_data.coordinate_y, 0, FTS_GESTRUE_POINTS * sizeof(u16)); + + buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + ret = ft8006m_i2c_read(client, buf, 1, buf, FTS_GESTRUE_POINTS_HEADER); + if (ret < 0) { + FTS_ERROR("[GESTURE]Read gesture header data failed!!"); + FTS_FUNC_EXIT(); + return ret; + } + + /* FW recognize gesture */ + if (fts_gesture_fw()) { + memcpy(fts_ft8006m_gesture_data.header, buf, FTS_GESTRUE_POINTS_HEADER); + gestrue_id = buf[0]; + pointnum = buf[1]; + read_bytes = ((int)pointnum) * 4 + 2; + buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + FTS_DEBUG("[GESTURE]PointNum=%d", pointnum); + ret = fts_gesture_read_buffer(client, buf, read_bytes); + if (ret < 0) { + FTS_ERROR("[GESTURE]Read gesture touch data failed!!"); + FTS_FUNC_EXIT(); + return ret; + } + + fts_gesture_report(ft8006m_input_dev, gestrue_id); + for (i = 0; i < pointnum; i++) { + fts_ft8006m_gesture_data.coordinate_x[i] = (((s16) buf[0 + (4 * i + 2)]) & 0x0F) << 8 + | (((s16) buf[1 + (4 * i + 2)]) & 0xFF); + fts_ft8006m_gesture_data.coordinate_y[i] = (((s16) buf[2 + (4 * i + 2)]) & 0x0F) << 8 + | (((s16) buf[3 + (4 * i + 2)]) & 0xFF); + } + FTS_FUNC_EXIT(); + return 0; + } else { + FTS_ERROR("[GESTURE]IC 0x%x need gesture lib to support gestures.", ft8006m_chip_types.chip_idh); + return 0; + } +} + +/***************************************************************************** +* Name: ft8006m_gesture_recovery +* Brief: recovery gesture state when reset or power on +* Input: +* Output: +* Return: +*****************************************************************************/ +void ft8006m_gesture_recovery(struct i2c_client *client) +{ + if (fts_ft8006m_gesture_data.mode && fts_ft8006m_gesture_data.active) { + ft8006m_i2c_write_reg(client, 0xD1, 0xff); + ft8006m_i2c_write_reg(client, 0xD2, 0xff); + ft8006m_i2c_write_reg(client, 0xD5, 0xff); + ft8006m_i2c_write_reg(client, 0xD6, 0xff); + ft8006m_i2c_write_reg(client, 0xD7, 0xff); + ft8006m_i2c_write_reg(client, 0xD8, 0xff); + ft8006m_i2c_write_reg(client, FTS_REG_GESTURE_EN, ENABLE); + } +} + +/***************************************************************************** +* Name: ft8006m_gesture_suspend +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int ft8006m_gesture_suspend(struct i2c_client *i2c_client) +{ + int i; + u8 state; + + FTS_FUNC_ENTER(); + + /* gesture not enable, return immediately */ + if (fts_ft8006m_gesture_data.mode == 0) { + FTS_DEBUG("gesture is disabled"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + for (i = 0; i < 5; i++) { + ft8006m_i2c_write_reg(i2c_client, 0xd1, 0xff); + ft8006m_i2c_write_reg(i2c_client, 0xd2, 0xff); + ft8006m_i2c_write_reg(i2c_client, 0xd5, 0xff); + ft8006m_i2c_write_reg(i2c_client, 0xd6, 0xff); + ft8006m_i2c_write_reg(i2c_client, 0xd7, 0xff); + ft8006m_i2c_write_reg(i2c_client, 0xd8, 0xff); + ft8006m_i2c_write_reg(i2c_client, FTS_REG_GESTURE_EN, 0x01); + msleep(1); + ft8006m_i2c_read_reg(i2c_client, FTS_REG_GESTURE_EN, &state); + if (state == 1) + break; + } + + if (i >= 5) { + FTS_ERROR("[GESTURE]Enter into gesture(suspend) failed!\n"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + fts_ft8006m_gesture_data.active = 1; + FTS_DEBUG("[GESTURE]Enter into gesture(suspend) successfully!"); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: ft8006m_gesture_resume +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int ft8006m_gesture_resume(struct i2c_client *client) +{ + int i; + u8 state; + FTS_FUNC_ENTER(); + + /* gesture not enable, return immediately */ + if (fts_ft8006m_gesture_data.mode == 0) { + FTS_DEBUG("gesture is disabled"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + if (fts_ft8006m_gesture_data.active == 0) { + FTS_DEBUG("gesture is unactive"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + fts_ft8006m_gesture_data.active = 0; + for (i = 0; i < 5; i++) { + ft8006m_i2c_write_reg(client, FTS_REG_GESTURE_EN, 0x00); + msleep(1); + ft8006m_i2c_read_reg(client, FTS_REG_GESTURE_EN, &state); + if (state == 0) + break; + } + + if (i >= 5) { + FTS_ERROR("[GESTURE]Clear gesture(resume) failed!\n"); + } + + FTS_FUNC_EXIT(); + return 0; +} +extern int tp_gesture_onoff; + + +static ssize_t gesture_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + int num; + + if (*ppos) + return 0; + + num = sprintf(page, "%d\n", ft8006m_gesture_data.gesture_all_switch); + *ppos += num; + + return num; +} + +static ssize_t gesture_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + int ret; + char temp[20] = ""; + + ret = copy_from_user(temp, buff, len); + if (ret) { + FTS_ERROR("<%s> copy_from_user failed.\n", __func__); + return -EPERM; + } + + FTS_DEBUG("%s copy_from_user :%s\n", __func__, temp); +#if 0 + if (strnstr(temp, "on", strlen(temp))) + ft8006m_gesture_data.gesture_all_switch = 1; + else + ft8006m_gesture_data.gesture_all_switch = 0; +#else + ret = kstrtouint(temp, 0, &ft8006m_gesture_data.gesture_all_switch); + if (ret) { + FTS_ERROR("kstrtouint failed.\n"); + return -EFAULT; + } +#endif + + FTS_DEBUG("%s ft8006m_gesture_data.gesture_all_switch :%d\n", __func__, ft8006m_gesture_data.gesture_all_switch); + tp_gesture_onoff = ft8006m_gesture_data.gesture_all_switch; + + return len; +} +static const struct file_operations gesture_fops = { + .owner = THIS_MODULE, + .read = gesture_read, + .write = gesture_write, +}; + +static ssize_t gesture_data_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + int num; + + if (*ppos) + return 0; + + num = sprintf(page, "K\n"); + *ppos += num; + + return num; +} + +static ssize_t gesture_data_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + return len; +} + +static const struct file_operations gesture_data_fops = { + .owner = THIS_MODULE, + .read = gesture_data_read, + .write = gesture_data_write, +}; + +int D1_gesture_init(struct input_dev *input_dev) +{ + struct proc_dir_entry *proc_entry = NULL; + struct proc_dir_entry *proc_data = NULL; + struct proc_dir_entry *parent; + + parent = proc_mkdir("gesture", NULL); + if (!parent) { + pr_err("%s: failed to create proc entry\n", __func__); + return -ENOMEM; + } + + proc_entry = proc_create(GESTURE_NODE, 0666, parent, &gesture_fops); + if (proc_entry == NULL) { + FTS_ERROR("CAN't create proc entry /proc/%s !", GESTURE_NODE); + return -EPERM; + } else { + FTS_DEBUG("Created proc entry /proc/%s !", GESTURE_NODE); + } + + proc_data = proc_create(GESTURE_DATA, 0666, parent, &gesture_data_fops); + if (proc_data == NULL) { + FTS_ERROR("CAN't create proc entry /proc/%s !", GESTURE_DATA); + return -EPERM; + } else { + FTS_DEBUG("Created proc entry /proc/%s !", GESTURE_DATA); + } + input_set_capability(input_dev, EV_KEY, DOUBLE_CLICK); + __set_bit(DOUBLE_CLICK, input_dev->keybit); + + return 0; +} +/***************************************************************************** +* Name: ft8006m_gesture_init +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int ft8006m_gesture_init(struct input_dev *input_dev, struct i2c_client *client) +{ + FTS_FUNC_ENTER(); + D1_gesture_init(input_dev); + fts_ft8006m_gesture_data.mode = 1; + fts_ft8006m_gesture_data.active = 0; + FTS_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: ft8006m_gesture_exit +* Brief: call when driver removed +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_gesture_exit(struct i2c_client *client) +{ + FTS_FUNC_ENTER(); + sysfs_remove_group(&client->dev.kobj, &fts_gesture_group); + FTS_FUNC_EXIT(); + return 0; +} + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_i2c.c b/drivers/input/touchscreen/FT8006m/focaltech_i2c.c new file mode 100644 index 0000000000000..d4bef1090d1e6 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_i2c.c @@ -0,0 +1,217 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/************************************************************************ +* +* File Name: focaltech_i2c.c +* +* Author: fupeipei +* +* Created: 2016-08-04 +* +* Abstract: i2c communication with TP +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By fupeipei 2016-08-04 +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static DEFINE_MUTEX(i2c_rw_access); + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ + +/************************************************************************ +* Name: ft8006m_i2c_read +* Brief: i2c read +* Input: i2c info, write buf, write len, read buf, read len +* Output: get data in the 3rd buf +* Return: fail <0 +***********************************************************************/ +int ft8006m_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen) +{ + int ret = 0; + int i = 0; + + mutex_lock(&i2c_rw_access); + + if (readlen > 0) { + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + for (i = 0; i < 3; i++) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) { + FTS_ERROR("[IIC]: i2c_transfer(write) error, ret=%d!!", ret); + } else + break; + } + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + for (i = 0; i < 3; i++) { + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + FTS_ERROR("[IIC]: i2c_transfer(read) error, ret=%d!!", ret); + } else + break; + } + } + } + + mutex_unlock(&i2c_rw_access); + return ret; +} + +/************************************************************************ +* Name: ft8006m_i2c_write +* Brief: i2c write +* Input: i2c info, write buf, write len +* Output: no +* Return: fail <0 +***********************************************************************/ +int ft8006m_i2c_write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret = 0; + int i = 0; + + mutex_lock(&i2c_rw_access); + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + for (i = 0; i < 3; i++) { + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + FTS_ERROR("%s: i2c_transfer(write) error, ret=%d", __func__, ret); + } else + break; + } + } + mutex_unlock(&i2c_rw_access); + + return ret; +} + +/************************************************************************ +* Name: ft8006m_i2c_write_reg +* Brief: write register +* Input: i2c info, reg address, reg value +* Output: no +* Return: fail <0 +***********************************************************************/ +int ft8006m_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue) +{ + u8 buf[2] = {0}; + + buf[0] = regaddr; + buf[1] = regvalue; + return ft8006m_i2c_write(client, buf, sizeof(buf)); +} + +/************************************************************************ +* Name: ft8006m_i2c_read_reg +* Brief: read register +* Input: i2c info, reg address, reg value +* Output: get reg value +* Return: fail <0 +***********************************************************************/ +int ft8006m_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue) +{ + return ft8006m_i2c_read(client, ®addr, 1, regvalue, 1); +} + +/************************************************************************ +* Name: ft8006m_i2c_init +* Brief: fts i2c init +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_i2c_init(void) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} +/************************************************************************ +* Name: ft8006m_i2c_exit +* Brief: fts i2c exit +* Input: +* Output: +* Return: +***********************************************************************/ +int ft8006m_i2c_exit(void) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_point_report_check.c b/drivers/input/touchscreen/FT8006m/focaltech_point_report_check.c new file mode 100755 index 0000000000000..0671a7882f95d --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_point_report_check.c @@ -0,0 +1,150 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_point_report_check.c +* +* Author: WangTao +* +* Created: 2016-11-16 +* +* Abstract: point report check function +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By WangTao 2016-11-16 +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_POINT_REPORT_CHECK_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define POINT_REPORT_CHECK_WAIT_TIME 200 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct delayed_work fts_point_report_check_work; +static struct workqueue_struct *fts_point_report_check_workqueue + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ + + +/***************************************************************************** +* Name: fts_point_report_check_func +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_point_report_check_func(struct work_struct *work) +{ + +#if FTS_MT_PROTOCOL_B_EN + unsigned int finger_count = 0; +#endif + + FTS_FUNC_ENTER(); + mutex_lock(&ft8006m_wq_data->report_mutex); + +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < ft8006m_wq_data->pdata->max_touch_number; finger_count++) { + input_mt_slot(ft8006m_input_dev, finger_count); + input_mt_report_slot_state(ft8006m_input_dev, MT_TOOL_FINGER, false); + } +#else + input_mt_sync(ft8006m_input_dev); +#endif + input_report_key(ft8006m_input_dev, BTN_TOUCH, 0); + input_sync(ft8006m_input_dev); + + mutex_unlock(&ft8006m_wq_data->report_mutex); + + FTS_FUNC_EXIT(); +} + +void fts_point_report_check_queue_work(void) +{ + cancel_delayed_work(&fts_point_report_check_work); + queue_delayed_work(fts_point_report_check_workqueue, &fts_point_report_check_work, msecs_to_jiffies(POINT_REPORT_CHECK_WAIT_TIME)); +} + +/***************************************************************************** +* Name: fts_point_report_check_init +* Brief: +* Input: +* Output: +* Return: < 0: Fail to create esd check queue +*****************************************************************************/ +int fts_point_report_check_init(void) +{ + FTS_FUNC_ENTER(); + + INIT_DELAYED_WORK(&fts_point_report_check_work, fts_point_report_check_func); + fts_point_report_check_workqueue = create_workqueue("fts_point_report_check_func_wq"); + if (fts_point_report_check_workqueue == NULL) { + FTS_ERROR("[POINT_REPORT]: Failed to create fts_point_report_check_workqueue!!"); + } else { + FTS_DEBUG("[POINT_REPORT]: Success to create fts_point_report_check_workqueue!!"); + } + + FTS_FUNC_EXIT(); + + return 0; +} + +/***************************************************************************** +* Name: fts_point_report_check_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_point_report_check_exit(void) +{ + FTS_FUNC_ENTER(); + + destroy_workqueue(fts_point_report_check_workqueue); + + FTS_FUNC_EXIT(); + return 0; +} +#endif /* FTS_POINT_REPORT_CHECK_EN */ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_sensor.c b/drivers/input/touchscreen/FT8006m/focaltech_sensor.c new file mode 100755 index 0000000000000..088a9a73f1f6b --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_sensor.c @@ -0,0 +1,314 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_esdcheck.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-03 +* +* Abstract: Sensor +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By luougojin 2016-08-03 +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_PSENSOR_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +/* psensor register address*/ +#define FTS_REG_PSENSOR_ENABLE 0xB0 +#define FTS_REG_PSENSOR_STATUS 0x01 + +/* psensor register bits*/ +#define FTS_PSENSOR_ENABLE_MASK 0x01 +#define FTS_PSENSOR_STATUS_NEAR 0xC0 +#define FTS_PSENSOR_STATUS_FAR 0xE0 +#define FTS_PSENSOR_FAR_TO_NEAR 0 +#define FTS_PSENSOR_NEAR_TO_FAR 1 +#define FTS_PSENSOR_ORIGINAL_STATE_FAR 1 +#define FTS_PSENSOR_WAKEUP_TIMEOUT 500 + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct sensors_classdev __maybe_unused sensors_proximity_cdev = { + .name = "fts-proximity", + .vendor = "FocalTech", + .version = 1, + .handle = SENSORS_PROXIMITY_HANDLE, + .type = SENSOR_TYPE_PROXIMITY, + .max_range = "5.0", + .resolution = "5.0", + .sensor_power = "0.1", + .min_delay = 0, + .fifo_reserved_event_count = 0, + .fifo_max_event_count = 0, + .enabled = 0, + .delay_msec = 200, + .sensors_enable = NULL, + .sensors_poll_delay = NULL, +}; + +/***************************************************************************** +* functions body +*****************************************************************************/ +/***************************************************************************** +* Name: fts_psensor_support_enabled +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static inline bool fts_psensor_support_enabled(void) +{ + /*return config_enabled(CONFIG_TOUCHSCREEN_FTS_PSENSOR);*/ + return FTS_PSENSOR_EN; +} + +/***************************************************************************** +* Name: fts_psensor_enable +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_psensor_enable(struct fts_ts_data *data, int enable) +{ + u8 state; + int ret = -1; + + if (data->client == NULL) + return; + + ft8006m_i2c_read_reg(data->client, FTS_REG_PSENSOR_ENABLE, &state); + if (enable) + state |= FTS_PSENSOR_ENABLE_MASK; + else + state &= ~FTS_PSENSOR_ENABLE_MASK; + + ret = ft8006m_i2c_write_reg(data->client, FTS_REG_PSENSOR_ENABLE, state); + if (ret < 0) + FTS_ERROR("write psensor switch command failed"); + return; +} + +/***************************************************************************** +* Name: fts_psensor_enable_set +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_psensor_enable_set(struct sensors_classdev *sensors_cdev, + unsigned int enable) +{ + struct fts_psensor_platform_data *psensor_pdata = + container_of(sensors_cdev, + struct fts_psensor_platform_data, ps_cdev); + struct fts_ts_data *data = psensor_pdata->data; + struct input_dev *input_dev = data->psensor_pdata->input_psensor_dev; + + mutex_lock(&input_dev->mutex); + fts_psensor_enable(data, enable); + psensor_pdata->tp_psensor_data = FTS_PSENSOR_ORIGINAL_STATE_FAR; + if (enable) + psensor_pdata->tp_psensor_opened = 1; + else + psensor_pdata->tp_psensor_opened = 0; + mutex_unlock(&input_dev->mutex); + return enable; +} + +/***************************************************************************** +* Name: fts_read_tp_psensor_data +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_read_tp_psensor_data(struct fts_ts_data *data) +{ + u8 psensor_status; + char tmp; + int ret = 1; + + ft8006m_i2c_read_reg(data->client, + FTS_REG_PSENSOR_STATUS, &psensor_status); + + tmp = data->psensor_pdata->tp_psensor_data; + if (psensor_status == FTS_PSENSOR_STATUS_NEAR) + data->psensor_pdata->tp_psensor_data = + FTS_PSENSOR_FAR_TO_NEAR; + else if (psensor_status == FTS_PSENSOR_STATUS_FAR) + data->psensor_pdata->tp_psensor_data = + FTS_PSENSOR_NEAR_TO_FAR; + + if (tmp != data->psensor_pdata->tp_psensor_data) { + FTS_ERROR("%s sensor data changed", __func__); + ret = 0; + } + return ret; +} + + +int fts_sensor_read_data(struct fts_ts_data *data) +{ + int ret = 0; + if (fts_psensor_support_enabled() && data->psensor_pdata->tp_psensor_opened) { + ret = fts_read_tp_psensor_data(data); + if (!ret) { + if (data->suspended) { + pm_wakeup_event(&data->client->dev, FTS_PSENSOR_WAKEUP_TIMEOUT); + } + input_report_abs(data->psensor_pdata->input_psensor_dev, + ABS_DISTANCE, + data->psensor_pdata->tp_psensor_data); + input_sync(data->psensor_pdata->input_psensor_dev); + } + return 1; + } + return 0; +} + +int fts_sensor_suspend(struct fts_ts_data *data) +{ + int ret = 0; + + if (fts_psensor_support_enabled() && + device_may_wakeup(&data->client->dev) && + data->psensor_pdata->tp_psensor_opened) { + ret = enable_irq_wake(data->client->irq); + if (ret != 0) { + FTS_ERROR("%s: set_irq_wake failed", __func__); + } + data->suspended = true; + return 1; + } + + return 0; +} + + +int fts_sensor_resume(struct fts_ts_data *data) +{ + int ret = 0; + + if (fts_psensor_support_enabled() && + device_may_wakeup(&data->client->dev) && data->psensor_pdata->tp_psensor_opened) { + ret = disable_irq_wake(data->client->irq); + if (ret) { + FTS_ERROR("%s: disable_irq_wake failed", __func__); + } + data->suspended = false; + return 1; + } + + return 0; +} + + +int fts_sensor_init(struct fts_ts_data *data) +{ + struct fts_psensor_platform_data *psensor_pdata; + struct input_dev *psensor_input_dev; + int err; + + if (fts_psensor_support_enabled()) { + device_init_wakeup(&data->client->dev, 1); + psensor_pdata = devm_kzalloc(&data->client->dev, + sizeof(struct fts_psensor_platform_data), + GFP_KERNEL); + if (!psensor_pdata) { + FTS_ERROR("Failed to allocate memory"); + goto irq_free; + } + data->psensor_pdata = psensor_pdata; + + psensor_input_dev = input_allocate_device(); + if (!psensor_input_dev) { + FTS_ERROR("Failed to allocate device"); + goto free_psensor_pdata; + } + + __set_bit(EV_ABS, psensor_input_dev->evbit); + input_set_abs_params(psensor_input_dev, ABS_DISTANCE, 0, 1, 0, 0); + psensor_input_dev->name = "proximity"; + psensor_input_dev->id.bustype = BUS_I2C; + psensor_input_dev->dev.parent = &data->client->dev; + data->psensor_pdata->input_psensor_dev = psensor_input_dev; + + err = input_register_device(psensor_input_dev); + if (err) { + FTS_ERROR("Unable to register device, err=%d", err); + goto free_psensor_input_dev; + } + + psensor_pdata->ps_cdev = sensors_proximity_cdev; + psensor_pdata->ps_cdev.sensors_enable = fts_psensor_enable_set; + psensor_pdata->data = data; + + err = sensors_classdev_register(&data->client->dev, &psensor_pdata->ps_cdev); + if (err) { + goto unregister_psensor_input_device; + } + } + + return 0; +unregister_psensor_input_device: + if (fts_psensor_support_enabled()) + input_unregister_device(data->psensor_pdata->input_psensor_dev); +free_psensor_input_dev: + if (fts_psensor_support_enabled()) + input_free_device(data->psensor_pdata->input_psensor_dev); +free_psensor_pdata: + if (fts_psensor_support_enabled()) { + devm_kfree(&data->client->dev, psensor_pdata); + data->psensor_pdata = NULL; + } +irq_free: + if (fts_psensor_support_enabled()) + device_init_wakeup(&data->client->dev, 0); + free_irq(data->client->irq, data); + + return 1; +} + +int fts_sensor_remove(struct fts_ts_data *data) +{ + if (fts_psensor_support_enabled()) { + device_init_wakeup(&data->client->dev, 0); + sensors_classdev_unregister(&data->psensor_pdata->ps_cdev); + input_unregister_device(data->psensor_pdata->input_psensor_dev); + devm_kfree(&data->client->dev, data->psensor_pdata); + data->psensor_pdata = NULL; + } + return 0; +} +#endif /* FTS_PSENSOR_EN */ diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/Makefile b/drivers/input/touchscreen/FT8006m/focaltech_test/Makefile new file mode 100755 index 0000000000000..df3a77207ed96 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/Makefile @@ -0,0 +1,10 @@ +#drivers/input/touchscreen/focaltech_touch/focaltech_test +# +#Makefile for test module +# + + + +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += src/ +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += supported_ic/ + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/focaltech_test_config.h b/drivers/input/touchscreen/FT8006m/focaltech_test/focaltech_test_config.h new file mode 100755 index 0000000000000..1b368c60720ff --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/focaltech_test_config.h @@ -0,0 +1,63 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_config.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +************************************************************************/ +#include "../focaltech_core.h" + + +/*----------------------------------------------------------- +IC Type Test +-----------------------------------------------------------*/ +#define FT5X46_TEST 0x20 +#define FT6X36_TEST 0x40 +#define FT5822_TEST 0x70 +#define FT8606_TEST 0x90 +#define FT8716_TEST 0xA0 +#define FT3C47_TEST 0xB0 +#define FT8607_TEST 0xC0 +#define FT8736_TEST 0xE0 +#define FT3D47_TEST 0xF0 +#define FTE716_TEST 0x100 +#define FTE736_TEST 0x140 +#define FT8006_TEST 0x130 + + +#ifdef FTS_CHIP_TYPE + +#if (FTS_CHIP_TYPE == _FT8716) +#define FTS_CHIP_TEST_TYPE FT8716_TEST +#elif(FTS_CHIP_TYPE == _FT8736) +#define FTS_CHIP_TEST_TYPE FT8736_TEST +#elif(FTS_CHIP_TYPE == _FT8006) +#define FTS_CHIP_TEST_TYPE FT8006_TEST +#elif(FTS_CHIP_TYPE == _FT8606) +#define FTS_CHIP_TEST_TYPE FT8606_TEST +#elif(FTS_CHIP_TYPE == _FT8607) +#define FTS_CHIP_TEST_TYPE FT8607_TEST +#elif(FTS_CHIP_TYPE == _FTE716) +#define FTS_CHIP_TEST_TYPE FTE716_TEST +#elif(FTS_CHIP_TYPE == _FT3D47) +#define FTS_CHIP_TEST_TYPE FT3D47_TEST +#elif(IC_SERIALS == 0x01) +#define FTS_CHIP_TEST_TYPE FT5822_TEST +#elif(FTS_CHIP_TYPE == _FT3C47U) +#define FTS_CHIP_TEST_TYPE FT3C47_TEST +#elif(IC_SERIALS == 0x02) +#define FTS_CHIP_TEST_TYPE FT5X46_TEST +#elif((IC_SERIALS == 0x03) || (IC_SERIALS == 0x04)) +#define FTS_CHIP_TEST_TYPE FT6X36_TEST +#endif + +#else +#define FTS_CHIP_TEST_TYPE FT8716_TEST + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_ic_table.h b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_ic_table.h new file mode 100755 index 0000000000000..9d7452ac5705d --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_ic_table.h @@ -0,0 +1,115 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +#ifndef __FOCALTECH_IC_TABLE_H__ +#define __FOCALTECH_IC_TABLE_H__ +/***************************************************************************** +* +* File Name: focaltech_ic_table.h +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ + +/*----------------------------------------------------------- +IC corresponding code, each of the IC code is 8 bit, high 4 bit on behalf of the same series, low 4 bit on behalf of the specific IC +-----------------------------------------------------------*/ +enum IC_Type { + IC_FT5X36 = 0x10, + IC_FT5X36i = 0x11, + IC_FT3X16 = 0x12, + IC_FT3X26 = 0x13, + + IC_FT5X46 = 0x21, + IC_FT5X46i = 0x22, + IC_FT5526 = 0x23, + IC_FT3X17 = 0x24, + IC_FT5436 = 0x25, + IC_FT3X27 = 0x26, + IC_FT5526I = 0x27, + IC_FT5416 = 0x28, + IC_FT5426 = 0x29, + IC_FT5435 = 0x2A, + IC_FT7681 = 0x2B, + IC_FT7661 = 0x2C, + IC_FT7511 = 0x2D, + IC_FT7421 = 0x2E, + IC_FT6X06 = 0x30, + IC_FT3X06 = 0x31, + IC_FT6X36 = 0x40, + IC_FT3X07 = 0x41, + IC_FT6416 = 0x42, + IC_FT6426 = 0x43, + IC_FT7401 = 0x44, + IC_FT3407U = 0x45, + IC_FT6236U = 0x46, + IC_FT6436U = 0x47, + IC_FT3267 = 0x48, + IC_FT3367 = 0x49, + IC_FT5X16 = 0x50, + IC_FT5X12 = 0x51, + IC_FT5506 = 0x60, + IC_FT5606 = 0x61, + IC_FT5816 = 0x62, + IC_FT5822 = 0x70, + IC_FT5626 = 0x71, + IC_FT5726 = 0x72, + IC_FT5826B = 0x73, + IC_FT3617 = 0x74, + IC_FT3717 = 0x75, + IC_FT7811 = 0x76, + IC_FT5826S = 0x77, + IC_FT5306 = 0x80, + IC_FT5406 = 0x81, + IC_FT8606 = 0x90, + IC_FT8716 = 0xA0, + IC_FT3C47U = 0xB0, + IC_FT8607 = 0xC0, + IC_FT8707 = 0xD0, + IC_FT8736 = 0xE0, + IC_FT3D47 = 0xF0, + IC_FTE716 = 0x100, + IC_FT5442 = 0x110, + IC_FT3428U = 0x120, + IC_FT8201 = 0x130, + IC_FT8006M = 0x131, + IC_FTE736 = 0x140 +}; + + + +extern unsigned int ft8006m_ic_table_get_ic_code_from_ic_name(char *strIcName); +extern void ft8006m_ic_table_get_ic_name_from_ic_code(unsigned int ic_code, char *strIcName); + +extern unsigned int ft8006m_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2); +extern unsigned int ft8006m_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2); +extern int ft8006m_ic_table_need_chip_id2(unsigned int chip_id); + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_detail_threshold.h b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_detail_threshold.h new file mode 100755 index 0000000000000..9518f6900da0a --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_detail_threshold.h @@ -0,0 +1,131 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ + +#ifndef _DETAIL_THRESHOLD_H +#define _DETAIL_THRESHOLD_H + +#define TX_NUM_MAX 60 +#define RX_NUM_MAX 60 +#define NUM_MAX (TX_NUM_MAX)*(RX_NUM_MAX) +#define MAX_PATH 256 + +#define BUFFER_LENGTH 512 +#define MAX_TEST_ITEM 20 +#define MAX_GRAPH_ITEM 20 +#define MAX_CHANNEL_NUM 144 + +#define FORCETOUCH_ROW 1 + +struct stCfg_Incell_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + + int (*CBTest_Min)[RX_NUM_MAX]; + int (*CBTest_Max)[RX_NUM_MAX]; + + int (*CBUniformityTest_CHX_Linearity)[RX_NUM_MAX]; + int (*CBUniformityTest_CHY_Linearity)[RX_NUM_MAX]; + +}; + +struct stCfg_MCap_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + unsigned char (*InvalidNode_SC)[RX_NUM_MAX]; + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + int (*RawDataTest_Low_Min)[RX_NUM_MAX]; + int (*RawDataTest_Low_Max)[RX_NUM_MAX]; + int (*RawDataTest_High_Min)[RX_NUM_MAX]; + int (*RawDataTest_High_Max)[RX_NUM_MAX]; + int (*RxLinearityTest_Max)[RX_NUM_MAX]; + int (*TxLinearityTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Min)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Max)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Min)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Max)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Min)[RX_NUM_MAX]; + int (*NoistTest_Coefficient)[RX_NUM_MAX]; + int (*LCDNoistTest_Coefficient)[RX_NUM_MAX]; + + int ForceTouch_SCapRawDataTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; +}; + +struct stCfg_SCap_DetailThreshold { + int TempData[MAX_CHANNEL_NUM]; + int RawDataTest_Max[MAX_CHANNEL_NUM]; + int RawDataTest_Min[MAX_CHANNEL_NUM]; + int CiTest_Max[MAX_CHANNEL_NUM]; + int CiTest_Min[MAX_CHANNEL_NUM]; + int DeltaCiTest_Base[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase1[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase2[MAX_CHANNEL_NUM]; + int CiDeviationTest_Base[MAX_CHANNEL_NUM]; + + int NoiseTest_Max[MAX_CHANNEL_NUM]; + int DeltaCxTest_Sort[MAX_CHANNEL_NUM]; + int DeltaCxTest_Area[MAX_CHANNEL_NUM]; + + int CbTest_Max[MAX_CHANNEL_NUM]; + int CbTest_Min[MAX_CHANNEL_NUM]; + int DeltaCbTest_Base[MAX_CHANNEL_NUM]; + int DifferTest_Base[MAX_CHANNEL_NUM]; + int CBDeviationTest_Base[MAX_CHANNEL_NUM]; + int K1DifferTest_Base[MAX_CHANNEL_NUM]; +}; + +void Ft8006m_OnInit_MCap_DetailThreshold(char *strIniFile); +void Ft8006m_OnInit_SCap_DetailThreshold(char *strIniFile); +void Ft8006m_OnInit_Incell_DetailThreshold(char *strIniFile); + +void ft8006m_set_max_channel_num(void); + +void Ft8006m_OnInit_InvalidNode(char *strIniFile); +void Ft8006m_OnInit_DThreshold_RawDataTest(char *strIniFile); +void Ft8006m_OnInit_DThreshold_SCapRawDataTest(char *strIniFile); +void Ft8006m_OnInit_DThreshold_SCapCbTest(char *strIniFile); + +void Ft8006m_OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile); +void Ft8006m_OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile); + + +void Ft8006m_OnInit_DThreshold_RxLinearityTest(char *strIniFile); +void Ft8006m_OnInit_DThreshold_TxLinearityTest(char *strIniFile); + +void Ft8006m_OnInit_DThreshold_PanelDifferTest(char *strIniFile); + +void Ft8006m_OnInit_DThreshold_CBTest(char *strIniFile); +void Ft8006m_OnInit_DThreshold_AllButtonCBTest(char *strIniFile); +void Ft8006m_OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile); + +void Ft8006m_OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue); + +int ft8006m_malloc_struct_DetailThreshold(void); +void ft8006m_free_struct_DetailThreshold(void); +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_ini.h b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_ini.h new file mode 100755 index 0000000000000..8342218bae1ea --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_ini.h @@ -0,0 +1,66 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#ifndef INI_H +#define INI_H + +#define MAX_KEY_NUM 300 +#define MAX_KEY_NAME_LEN 50 +#define MAX_KEY_VALUE_LEN 360 + +#define MAX_CFG_BUF 480 +#define SUCCESS 0 +/* return value */ +#define CFG_OK SUCCESS +#define CFG_SECTION_NOT_FOUND -1 +#define CFG_KEY_NOT_FOUND -2 +#define CFG_ERR -10 + +#define CFG_ERR_OPEN_FILE -10 +#define CFG_ERR_CREATE_FILE -11 +#define CFG_ERR_READ_FILE -12 +#define CFG_ERR_WRITE_FILE -13 +#define CFG_ERR_FILE_FORMAT -14 +#define CFG_ERR_TOO_MANY_KEY_NUM -15 +#define CFG_ERR_OUT_OF_LEN -16 + +#define CFG_ERR_EXCEED_BUF_SIZE -22 + +#define COPYF_OK SUCCESS +#define COPYF_ERR_OPEN_FILE -10 +#define COPYF_ERR_CREATE_FILE -11 +#define COPYF_ERR_READ_FILE -12 +#define COPYF_ERR_WRITE_FILE -13 + +typedef struct _ST_INI_FILE_DATA { + char pSectionName[MAX_KEY_NAME_LEN]; + char pKeyName[MAX_KEY_NAME_LEN]; + char pKeyValue[MAX_KEY_VALUE_LEN]; + int iSectionNameLen; + int iKeyNameLen; + int iKeyValueLen; +} ST_INI_FILE_DATA; + + + +int ft8006m_ini_get_key(char *filedata, char *section, char *key, char *value); + + +int ft8006m_atoi(char *nptr); +char *ft8006m_ini_str_trim_r(char *buf); +char *ft8006m_ini_str_trim_l(char *buf); + +int ft8006m_init_key_data(void); +int ft8006m_ini_get_key_data(char *filedata); +int ft8006m_release_key_data(void); +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_main.h b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_main.h new file mode 100755 index 0000000000000..ec53aafc7e770 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_main.h @@ -0,0 +1,240 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#ifndef _TEST_LIB_H +#define _TEST_LIB_H + +#include "focaltech_test_detail_threshold.h" +#include "../focaltech_test_config.h" + +#define boolean unsigned char +#define bool unsigned char +#define BYTE unsigned char +#define false 0 +#define true 1 + +enum NodeType { + NODE_INVALID_TYPE = 0, + NODE_VALID_TYPE = 1, + NODE_KEY_TYPE = 2, + NODE_AST_TYPE = 3, +}; + + +typedef int (*FTS_I2C_READ_FUNCTION)(unsigned char *, int , unsigned char *, int); +typedef int (*FTS_I2C_WRITE_FUNCTION)(unsigned char *, int); + +extern FTS_I2C_READ_FUNCTION ft8006m_i2c_read_test; +extern FTS_I2C_WRITE_FUNCTION ft8006m_i2c_write_test; + +extern int ft8006m_init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read); +extern int ft8006m_init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write); + + + + + + +int ft8006m_set_param_data(char *TestParamData); +boolean ft8006m_start_test_tp(void); +int m_get_test_data(char *pTestData); + + +int ft8006m_focaltech_test_main_init(void); +int ft8006m_focaltech_test_main_exit(void); + + +#define MIN_HOLE_LEVEL (-1) +#define MAX_HOLE_LEVEL 0x7F +/*----------------------------------------------------------- +Error Code for Comm +-----------------------------------------------------------*/ +#define ERROR_CODE_OK 0x00 +#define ERROR_CODE_CHECKSUM_ERROR 0x01 +#define ERROR_CODE_INVALID_COMMAND 0x02 +#define ERROR_CODE_INVALID_PARAM 0x03 +#define ERROR_CODE_IIC_WRITE_ERROR 0x04 +#define ERROR_CODE_IIC_READ_ERROR 0x05 +#define ERROR_CODE_WRITE_USB_ERROR 0x06 +#define ERROR_CODE_WAIT_RESPONSE_TIMEOUT 0x07 +#define ERROR_CODE_PACKET_RE_ERROR 0x08 +#define ERROR_CODE_NO_DEVICE 0x09 +#define ERROR_CODE_WAIT_WRITE_TIMEOUT 0x0a +#define ERROR_CODE_READ_USB_ERROR 0x0b +#define ERROR_CODE_COMM_ERROR 0x0c +#define ERROR_CODE_ALLOCATE_BUFFER_ERROR 0x0d +#define ERROR_CODE_DEVICE_OPENED 0x0e +#define ERROR_CODE_DEVICE_CLOSED 0x0f + +/*----------------------------------------------------------- +Test Status +-----------------------------------------------------------*/ +#define RESULT_NULL 0 +#define RESULT_PASS 1 +#define RESULT_NG 2 +#define RESULT_TESTING 3 +#define RESULT_TBD 4 +#define RESULT_REPLACE 5 +#define RESULT_CONNECTING 6 + +/*----------------------------------------------------------- + +read write max bytes per time +-----------------------------------------------------------*/ + +#define BYTES_PER_TIME 128 + +extern void ft8006m_test_funcs(void); +struct StTestFuncs { + void (*OnInit_TestItem)(char *); + void (*OnInit_BasicThreshold)(char *) ; + void (*SetTestItem)(void) ; + boolean (*Start_Test)(void); + int (*Get_test_data)(char *); +}; +extern struct StTestFuncs ft8006m_g_stTestFuncs; + +struct StruScreenSeting { + int iSelectedIC; + int iTxNum; + int iRxNum; + int isNormalize; + int iUsedMaxTxNum; + int iUsedMaxRxNum; + + unsigned char iChannelsNum; + unsigned char iKeyNum; +}; +extern struct StruScreenSeting ft8006m_g_ScreenSetParam; +struct stTestItem { + unsigned char ItemType; + unsigned char TestNum; + unsigned char TestResult; + unsigned char ItemCode; + + +}; +extern struct stTestItem ft8006m_g_stTestItem[1][MAX_TEST_ITEM]; + +struct structSCapConfEx { + unsigned char ChannelXNum; + unsigned char ChannelYNum; + unsigned char KeyNum; + unsigned char KeyNumTotal; + bool bLeftKey1; + bool bLeftKey2; + bool bLeftKey3; + bool bRightKey1; + bool bRightKey2; + bool bRightKey3; +}; +extern struct structSCapConfEx ft8006m_g_stSCapConfEx; + +enum NORMALIZE_Type { + Overall_Normalize = 0, + Auto_Normalize = 1, +}; + +enum PROOF_TYPE { + Proof_Normal, + Proof_Level0, + Proof_NoWaterProof, +}; + +/*----------------------------------------------------------- +IC Capacitance Type 0:Self Capacitance, 1:Mutual Capacitance, 2:IDC +-----------------------------------------------------------*/ +enum enum_Report_Protocol_Type { + Self_Capacitance = 0, + Mutual_Capacitance = 1, + IDC_Capacitance = 2, +}; + +#if (FTS_CHIP_TEST_TYPE == FT6X36_TEST) +#define IC_Capacitance_Type 0 +#elif ((FTS_CHIP_TEST_TYPE == FT3C47_TEST) || (FTS_CHIP_TEST_TYPE == FT5822_TEST) || (FTS_CHIP_TEST_TYPE == FT5X46_TEST) || (FTS_CHIP_TEST_TYPE == FT3D47_TEST)) +#define IC_Capacitance_Type 1 +#elif ((FTS_CHIP_TEST_TYPE == FT8606_TEST) || (FTS_CHIP_TEST_TYPE == FT8607_TEST) || (FTS_CHIP_TEST_TYPE == FT8716_TEST) || (FTS_CHIP_TEST_TYPE == FT8736_TEST) || (FTS_CHIP_TEST_TYPE == FTE716_TEST) || (FTS_CHIP_TEST_TYPE == FTE736_TEST) || (FTS_CHIP_TEST_TYPE == FT8006_TEST)) +#define IC_Capacitance_Type 2 +#endif + + + + +extern struct stCfg_MCap_DetailThreshold ft8006m_g_stCfg_MCap_DetailThreshold; +extern struct stCfg_SCap_DetailThreshold ft8006m_g_stCfg_SCap_DetailThreshold; +extern struct stCfg_Incell_DetailThreshold ft8006m_g_stCfg_Incell_DetailThreshold; + + +extern int ft8006m_g_TestItemNum;/*test item num*/ +extern char ft8006m_g_strIcName[20];/*IC Name*/ +extern char *ft8006m_g_pStoreAllData; + +int Ft8006m_GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile); +void ft8006m_focal_msleep(int ms); +void Ft8006m_SysDelay(int ms); +int ft8006m_focal_abs(int value); + + +void Ft8006m_OnInit_InterfaceCfg(char *strIniFile); + +int Ft8006m_ReadReg(unsigned char RegAddr, unsigned char *RegData); +int Ft8006m_WriteReg(unsigned char RegAddr, unsigned char RegData); +unsigned char Ft8006m_Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead); + +unsigned char Ft8006m_EnterWork(void); +unsigned char Ft8006m_EnterFactory(void); + +void ft8006m_SetTestItemCodeName(unsigned char ucitemcode); + +extern void *Ft8006m_fts_malloc(size_t size); +extern void Ft8006m_fts_free(void *p); + +extern int Ft8006m_InitTest(void); +extern void Ft8006m_FinishTest(void); +extern void Ft8006m_InitStoreParamOfTestData(void); +extern void Ft8006m_MergeAllTestData(void); +extern int Ft8006m_AllocateMemory(void); +extern void Ft8006m_FreeMemory(void); + +extern char *ft8006m_g_pTmpBuff; +extern char *ft8006m_g_pStoreMsgArea; +extern int ft8006m_g_lenStoreMsgArea; +extern char *ft8006m_g_pMsgAreaLine2; +extern int ft8006m_g_lenMsgAreaLine2; +extern char *ft8006m_g_pStoreDataArea; +extern int ft8006m_g_lenStoreDataArea; +extern unsigned char ft8006m_m_ucTestItemCode; +extern int ft8006m_m_iStartLine; +extern int ft8006m_m_iTestDataCount; + +extern char *Ft8006m_TestResult ; +extern int Ft8006m_TestResultLen; + +#define FOCAL_TEST_DEBUG_EN 0 +#if (FOCAL_TEST_DEBUG_EN) +#define FTS_TEST_DBG(fmt, args...) do {printk(KERN_ERR "[FTS] [TEST]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_FUNC_ENTER() printk(KERN_ERR "[FTS][TEST]%s: Enter(%d)\n", __func__, __LINE__) +#define FTS_TEST_FUNC_EXIT() printk(KERN_ERR "[FTS][TEST]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_TEST_DBG(fmt, args...) do {} while (0) +#define FTS_TEST_FUNC_ENTER() +#define FTS_TEST_FUNC_EXIT() +#endif + +#define FTS_TEST_INFO(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Info]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_ERROR(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Error]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) + + + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_supported_ic.h b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_supported_ic.h new file mode 100755 index 0000000000000..206aefb1650ff --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/include/focaltech_test_supported_ic.h @@ -0,0 +1,1576 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R) All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ + +#include +#include + +#include "../focaltech_test_config.h" +#include "focaltech_test_main.h" + +#if (FTS_CHIP_TEST_TYPE == FT8716_TEST) + +struct stCfg_FT8716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + +}; +struct ft8006m_stCfg_FT8716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + bool bCBTest_VKey_DCheck_Check; + int CbTest_Min_DCheck_Vkey; + int CbTest_Max_DCheck_Vkey; + + bool bLcdBusyAdjust; + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + int LCDNoiseTest_SequenceFrame; + int LCDNoiseTest_MaxFrame; + +}; +enum enumTestItem_FT8716 { + Code_FT8716_ENTER_FACTORY_MODE, + Code_FT8716_DOWNLOAD, + Code_FT8716_UPGRADE, + Code_FT8716_FACTORY_ID_TEST, + Code_FT8716_PROJECT_CODE_TEST, + Code_FT8716_FW_VERSION_TEST, + Code_FT8716_IC_VERSION_TEST, + Code_FT8716_RAWDATA_TEST, + Code_FT8716_CHANNEL_NUM_TEST, + + Code_FT8716_INT_PIN_TEST, + Code_FT8716_RESET_PIN_TEST, + Code_FT8716_NOISE_TEST, + Code_FT8716_CB_TEST, + Code_FT8716_WRITE_CONFIG, + + Code_FT8716_SHORT_CIRCUIT_TEST, + Code_FT8716_OPEN_TEST, + Code_FT8716_CB_UNIFORMITY_TEST, + Code_FT8716_DIFFER_UNIFORMITY_TEST, + Code_FT8716_DIFFER2_UNIFORMITY_TEST, + Code_FT8716_LCD_NOISE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT3D47_TEST) + +struct stCfg_FT3D47_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + + bool FORCETOUCH_CHANNEL_NUM_TEST; + bool FORCETOUCH_RAWDATA_TEST; + bool FORCETOUCH_CB_TEST; + bool FORCETOUCH_WEAK_SHORT_CIRCUIT_TEST; + bool FORCETOUCH_FLATNESS_TEST; +}; + +struct stCfg_FT3D47_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int ForceTouch_ChannelNumTest_ChannelNum; + + int ForceTouch_SCapRawDataTest_OFF_Min; + int ForceTouch_SCapRawDataTest_OFF_Max; + int ForceTouch_SCapRawDataTest_ON_Min; + int ForceTouch_SCapRawDataTest_ON_Max; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_ON; + + int ForceTouch_SCapCbTest_OFF_Min; + int ForceTouch_SCapCbTest_OFF_Max; + int ForceTouch_SCapCbTest_ON_Min; + int ForceTouch_SCapCbTest_ON_Max; + BYTE ForceTouch_SCapCBTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapCBTest_SetWaterproof_ON; + + int ForceTouch_WeakShortTest_CG; + int ForceTouch_WeakShortTest_CC; + bool bForceTouch_WeakShortTest_CapShortTest; + + int ForceTouch_FlatnessTest_Differ_Threshold; + int ForceTouch_FlatnessTest_Differ_Coefficient; + bool ForceTouch_FlatnessTest_Differ_Threshold_Check; + bool ForceTouch_FlatnessTest_Differ_Coefficient_Check; + +}; +enum enumTestItem_FT3D47 { + Code_FT3D47_ENTER_FACTORY_MODE, + Code_FT3D47_DOWNLOAD, + Code_FT3D47_UPGRADE, + Code_FT3D47_FACTORY_ID_TEST, + Code_FT3D47_PROJECT_CODE_TEST, + Code_FT3D47_FW_VERSION_TEST, + Code_FT3D47_IC_VERSION_TEST, + Code_FT3D47_RAWDATA_TEST, + Code_FT3D47_ADCDETECT_TEST, + Code_FT3D47_SCAP_CB_TEST, + Code_FT3D47_SCAP_RAWDATA_TEST, + Code_FT3D47_CHANNEL_NUM_TEST, + Code_FT3D47_INT_PIN_TEST, + Code_FT3D47_RESET_PIN_TEST, + Code_FT3D47_NOISE_TEST, + Code_FT3D47_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3D47_UNIFORMITY_TEST, + Code_FT3D47_CM_TEST, + Code_FT3D47_RAWDATA_MARGIN_TEST, + Code_FT3D47_WRITE_CONFIG, + Code_FT3D47_PANELDIFFER_TEST, + Code_FT3D47_PANELDIFFER_UNIFORMITY_TEST, + Code_FT3D47_LCM_ID_TEST, + Code_FT3D47_JUDEG_NORMALIZE_TYPE, + Code_FT3D47_TE_TEST, + Code_FT3D47_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT3D47_PATTERN_TEST, + + Code_FT3D47_GPIO_TEST, + Code_FT3D47_LCD_NOISE_TEST, + Code_FT3D47_FORCE_TOUCH_CHANNEL_NUM_TEST, + Code_FT3D47_FORCE_TOUCH_SCAP_RAWDATA_TEST, + Code_FT3D47_FORCE_TOUCH_SCAP_CB_TEST, + Code_FT3D47_FORCE_TOUCH_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3D47_FORCE_TOUCH_FLATNESS_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT8607_TEST) + +struct stCfg_FT8607_TESTItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool OPEN_TEST; +}; + +struct stCfg_FT8607_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMax; + + int iLCDNoiseCoefficient; + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Open_Test_CBMin; +}; + + +enum enumTestItem_FT8607 { + Code_FT8607_ENTER_FACTORY_MODE, + Code_FT8607_DOWNLOAD, + Code_FT8607_UPGRADE, + Code_FT8607_FACTORY_ID_TEST, + Code_FT8607_PROJECT_CODE_TEST, + Code_FT8607_FW_VERSION_TEST, + Code_FT8607_IC_VERSION_TEST, + Code_FT8607_RAWDATA_TEST, + Code_FT8607_CHANNEL_NUM_TEST, + + Code_FT8607_INT_PIN_TEST, + Code_FT8607_RESET_PIN_TEST, + Code_FT8607_NOISE_TEST, + Code_FT8607_CB_TEST, + Code_FT8607_WRITE_CONFIG, + + Code_FT8607_SHORT_CIRCUIT_TEST, + Code_FT8607_LCD_NOISE_TEST, + + Code_FT8607_OSC60MHZ_TEST, + Code_FT8607_OSCTRM_TEST, + Code_FT8607_SNR_TEST, + Code_FT8607_DIFFER_TEST, + Code_FT8607_DIFFER_UNIFORMITY_TEST, + + Code_FT8607_LPWG_RAWDATA_TEST, + Code_FT8607_LPWG_CB_TEST, + Code_FT8607_LPWG_NOISE_TEST, + + Code_FT8607_OPEN_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT5X46_TEST) +/*----------------------------------------------- +FT5X46 and FT5X22 is the same series of chips +FT5422\FT5X22 is the chip code for internally develope +FT5X46 is the chip code for market +------------------------------------------------*/ +struct stCfg_FT5X46_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + bool PANEL_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + bool GPIO_TEST; + bool LCD_NOISE_TEST; +}; +struct stCfg_FT5X46_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int Lcd_Noise_MaxFrame; + int Lcd_Noise_Conficient; + int Lcd_Noise_Noise_Mode; + int Lcd_Noise_MaxNgPoint; + int Lcd_Noise_FrameNum; + + bool Lcd_Noise_NoiseThresholdMode; + int Lcd_Noise_NoiseCoefficient; + int Lcd_Noise_NoiseMax; + int Lcd_Noise_SetFrequency; +}; +enum enumTestItem_FT5X46 { + Code_FT5X46_ENTER_FACTORY_MODE, + Code_FT5X46_DOWNLOAD, + Code_FT5X46_UPGRADE, + Code_FT5X46_FACTORY_ID_TEST, + Code_FT5X46_PROJECT_CODE_TEST, + Code_FT5X46_FW_VERSION_TEST, + Code_FT5X46_IC_VERSION_TEST, + Code_FT5X46_RAWDATA_TEST, + Code_FT5X46_ADCDETECT_TEST, + Code_FT5X46_SCAP_CB_TEST, + Code_FT5X46_SCAP_RAWDATA_TEST, + Code_FT5X46_CHANNEL_NUM_TEST, + Code_FT5X46_INT_PIN_TEST, + Code_FT5X46_RESET_PIN_TEST, + Code_FT5X46_NOISE_TEST, + Code_FT5X46_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5X46_UNIFORMITY_TEST, + Code_FT5X46_CM_TEST, + Code_FT5X46_RAWDATA_MARGIN_TEST, + Code_FT5X46_WRITE_CONFIG, + Code_FT5X46_PANELDIFFER_TEST, + Code_FT5X46_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5X46_LCM_ID_TEST, + Code_FT5X46_JUDEG_NORMALIZE_TYPE, + Code_FT5X46_TE_TEST, + Code_FT5X46_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5X46_PATTERN_TEST, + Code_FT5X46_GPIO_TEST, + Code_FT5X46_LCD_NOISE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT6X36_TEST) + +struct stCfg_FT6X36_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool CHANNEL_SHORT_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool DELTA_CB_TEST; + bool CHANNELS_DEVIATION_TEST; + bool TWO_SIDES_DEVIATION_TEST; + bool FPC_SHORT_TEST; + bool FPC_OPEN_TEST; + bool SREF_OPEN_TEST; + bool TE_TEST; + bool CB_DEVIATION_TEST; + bool DIFFER_TEST; + bool WEAK_SHORT_TEST; + bool DIFFER_TEST2; + bool K1_DIFFER_TEST; +}; + +struct stCfg_FT6X36_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelNum; + BYTE ChannelNumTest_KeyNum; + int ChannelShortTest_K1; + int ChannelShortTest_K2; + int ChannelShortTest_CB; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int WeakShortThreshold; + int NoiseTest_Max; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int FPCShort_CB_Min; + int FPCShort_CB_Max; + int FPCShort_RawData_Min; + int FPCShort_RawData_Max; + int FPCOpen_CB_Min; + int FPCOpen_CB_Max; + int FPCOpen_RawData_Min; + int FPCOpen_RawData_Max; + int SREFOpen_Hole_Base1; + int SREFOpen_Hole_Base2; + int SREFOpen_Hole; + int CBDeviationTest_Hole; + int Differ_Ave_Hole; + int Differ_Max_Hole; + int CbTest_Min; + int CbTest_Max; + int DeltaCbTest_Base; + int DeltaCbTest_Differ_Max; + bool DeltaCbTest_Include_Key_Test; + int DeltaCbTest_Key_Differ_Max; + int DeltaCbTest_Deviation_S1; + int DeltaCbTest_Deviation_S2; + int DeltaCbTest_Deviation_S3; + int DeltaCbTest_Deviation_S4; + int DeltaCbTest_Deviation_S5; + int DeltaCbTest_Deviation_S6; + bool DeltaCbTest_Set_Critical; + int DeltaCbTest_Critical_S1; + int DeltaCbTest_Critical_S2; + int DeltaCbTest_Critical_S3; + int DeltaCbTest_Critical_S4; + int DeltaCbTest_Critical_S5; + int DeltaCbTest_Critical_S6; + + int ChannelsDeviationTest_Deviation_S1; + int ChannelsDeviationTest_Deviation_S2; + int ChannelsDeviationTest_Deviation_S3; + int ChannelsDeviationTest_Deviation_S4; + int ChannelsDeviationTest_Deviation_S5; + int ChannelsDeviationTest_Deviation_S6; + bool ChannelsDeviationTest_Set_Critical; + int ChannelsDeviationTest_Critical_S1; + int ChannelsDeviationTest_Critical_S2; + int ChannelsDeviationTest_Critical_S3; + int ChannelsDeviationTest_Critical_S4; + int ChannelsDeviationTest_Critical_S5; + int ChannelsDeviationTest_Critical_S6; + + int TwoSidesDeviationTest_Deviation_S1; + int TwoSidesDeviationTest_Deviation_S2; + int TwoSidesDeviationTest_Deviation_S3; + int TwoSidesDeviationTest_Deviation_S4; + int TwoSidesDeviationTest_Deviation_S5; + int TwoSidesDeviationTest_Deviation_S6; + bool TwoSidesDeviationTest_Set_Critical; + int TwoSidesDeviationTest_Critical_S1; + int TwoSidesDeviationTest_Critical_S2; + int TwoSidesDeviationTest_Critical_S3; + int TwoSidesDeviationTest_Critical_S4; + int TwoSidesDeviationTest_Critical_S5; + int TwoSidesDeviationTest_Critical_S6; + + int DifferTest2_Data_H_Min; + int DifferTest2_Data_H_Max; + int DifferTest2_Data_M_Min; + int DifferTest2_Data_M_Max; + int DifferTest2_Data_L_Min; + int DifferTest2_Data_L_Max; + bool bDifferTest2_Data_H; + bool bDifferTest2_Data_M; + bool bDifferTest2_Data_L; + int K1DifferTest_StartK1; + int K1DifferTest_EndK1; + int K1DifferTest_MinHold2; + int K1DifferTest_MaxHold2; + int K1DifferTest_MinHold4; + int K1DifferTest_MaxHold4; + int K1DifferTest_Deviation2; + int K1DifferTest_Deviation4; +}; + +enum enumTestItem_FT6X36 { + Code_FT6X36_ENTER_FACTORY_MODE, + Code_FT6X36_DOWNLOAD, + Code_FT6X36_UPGRADE, + Code_FT6X36_FACTORY_ID_TEST, + Code_FT6X36_PROJECT_CODE_TEST, + Code_FT6X36_FW_VERSION_TEST, + Code_FT6X36_IC_VERSION_TEST, + Code_FT6X36_RAWDATA_TEST, + Code_FT6X36_CHANNEL_NUM_TEST, + Code_FT6X36_CHANNEL_SHORT_TEST, + Code_FT6X36_INT_PIN_TEST, + Code_FT6X36_RESET_PIN_TEST, + Code_FT6X36_NOISE_TEST, + Code_FT6X36_CB_TEST, + Code_FT6X36_DELTA_CB_TEST, + Code_FT6X36_CHANNELS_DEVIATION_TEST, + Code_FT6X36_TWO_SIDES_DEVIATION_TEST, + Code_FT6X36_FPC_SHORT_TEST, + Code_FT6X36_FPC_OPEN_TEST, + Code_FT6X36_SREF_OPEN_TEST, + Code_FT6X36_TE_TEST, + Code_FT6X36_CB_DEVIATION_TEST, + Code_FT6X36_WRITE_CONFIG, + Code_FT6X36_DIFFER_TEST, + Code_FT6X36_WEAK_SHORT_TEST, + Code_FT6X36_DIFFER_TEST2, + Code_FT6X36_K1_DIFFER_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT5822_TEST) + +struct stCfg_FT5822_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; +}; +struct stCfg_FT5822_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + + int WeakShortTest_CG; + int WeakShortTest_CC; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; +}; +enum enumTestItem_FT5822 { + Code_FT5822_ENTER_FACTORY_MODE, + Code_FT5822_DOWNLOAD, + Code_FT5822_UPGRADE, + Code_FT5822_FACTORY_ID_TEST, + Code_FT5822_PROJECT_CODE_TEST, + Code_FT5822_FW_VERSION_TEST, + Code_FT5822_IC_VERSION_TEST, + Code_FT5822_RAWDATA_TEST, + Code_FT5822_ADCDETECT_TEST, + Code_FT5822_SCAP_CB_TEST, + Code_FT5822_SCAP_RAWDATA_TEST, + Code_FT5822_CHANNEL_NUM_TEST, + Code_FT5822_INT_PIN_TEST, + Code_FT5822_RESET_PIN_TEST, + Code_FT5822_NOISE_TEST, + Code_FT5822_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5822_UNIFORMITY_TEST, + Code_FT5822_CM_TEST, + Code_FT5822_RAWDATA_MARGIN_TEST, + Code_FT5822_WRITE_CONFIG, + Code_FT5822_PANELDIFFER_TEST, + Code_FT5822_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5822_LCM_ID_TEST, + Code_FT5822_JUDEG_NORMALIZE_TYPE, + Code_FT5822_TE_TEST, + Code_FT5822_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5822_PATTERN_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT8006_TEST) + +struct stCfg_FT8006_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_TEST; + +}; +struct stCfg_FT8006_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Differ2Test_Min; + int Differ2Test_Max; + +}; +enum enumTestItem_FT8006 { + Code_FT8006_ENTER_FACTORY_MODE, + Code_FT8006_DOWNLOAD, + Code_FT8006_UPGRADE, + Code_FT8006_FACTORY_ID_TEST, + Code_FT8006_PROJECT_CODE_TEST, + Code_FT8006_FW_VERSION_TEST, + Code_FT8006_IC_VERSION_TEST, + Code_FT8006_RAWDATA_TEST, + Code_FT8006_CHANNEL_NUM_TEST, + Code_FT8006_INT_PIN_TEST, + Code_FT8006_RESET_PIN_TEST, + Code_FT8006_NOISE_TEST, + Code_FT8006_CB_TEST, + Code_FT8006_WRITE_CONFIG, + Code_FT8006_SHORT_CIRCUIT_TEST, + Code_FT8006_LCD_NOISE_TEST, + + Code_FT8006_OSC60MHZ_TEST, + Code_FT8006_OSCTRM_TEST, + Code_FT8006_SNR_TEST, + Code_FT8006_DIFFER_TEST, + Code_FT8006_DIFFER_UNIFORMITY_TEST, + + Code_FT8006_LPWG_RAWDATA_TEST, + Code_FT8006_LPWG_CB_TEST, + Code_FT8006_LPWG_NOISE_TEST, + Code_FT8006_DIFFER2_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT8736_TEST) + +struct stCfg_FT8736_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool CB_DECREASE_TEST; + bool VREF_DECREASE_TEST; +}; +struct stCfg_FT8736_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + + int CBDecrease_Step; + int CBDecrease_OrgMin; + int CBDecrease_OrgMax; + int CBDecrease_CalcMin; + int CBDecrease_CalcMax; + + int VRefDecrease_StepBegin; + int VRefDecrease_StepEnd; + int VRefDecrease_OrgMin; + int VRefDecrease_OrgMax; + int VRefDecrease_CalcMin; + int VRefDecrease_CalcMax; +}; + +enum enumTestItem_FT8736 { + Code_FT8736_ENTER_FACTORY_MODE, + Code_FT8736_DOWNLOAD, + Code_FT8736_UPGRADE, + Code_FT8736_FACTORY_ID_TEST, + Code_FT8736_PROJECT_CODE_TEST, + Code_FT8736_FW_VERSION_TEST, + Code_FT8736_IC_VERSION_TEST, + Code_FT8736_RAWDATA_TEST, + Code_FT8736_CHANNEL_NUM_TEST, + + Code_FT8736_INT_PIN_TEST, + Code_FT8736_RESET_PIN_TEST, + Code_FT8736_NOISE_TEST, + Code_FT8736_CB_TEST, + Code_FT8736_WRITE_CONFIG, + + Code_FT8736_SHORT_CIRCUIT_TEST, + Code_FT8736_OPEN_TEST, + Code_FT8736_CB_UNIFORMITY_TEST, + Code_FT8736_DIFFER_UNIFORMITY_TEST, + Code_FT8736_DIFFER2_UNIFORMITY_TEST, + Code_FT8736_LCD_NOISE_TEST, + Code_FT8736_CB_DECREASE_TEST, + Code_FT8736_VREF_DECREASE_TEST, + Code_FT8736_IC_TYPE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FTE716_TEST) +struct stCfg_FTE716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool GPIO_TEST; +}; +struct stCfg_FTE716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + bool bOri_ProjectCode; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + BYTE LCDNoiseTest_NoiseMode; +}; + +enum enumTestItem_FTE716 { + Code_FTE716_ENTER_FACTORY_MODE, + Code_FTE716_DOWNLOAD, + Code_FTE716_UPGRADE, + Code_FTE716_FACTORY_ID_TEST, + Code_FTE716_PROJECT_CODE_TEST, + Code_FTE716_FW_VERSION_TEST, + Code_FTE716_IC_VERSION_TEST, + Code_FTE716_RAWDATA_TEST, + Code_FTE716_CHANNEL_NUM_TEST, + + Code_FTE716_INT_PIN_TEST, + Code_FTE716_RESET_PIN_TEST, + Code_FTE716_NOISE_TEST, + Code_FTE716_CB_TEST, + Code_FTE716_WRITE_CONFIG, + + Code_FTE716_SHORT_CIRCUIT_TEST, + Code_FTE716_OPEN_TEST, + Code_FTE716_CB_UNIFORMITY_TEST, + Code_FTE716_DIFFER_UNIFORMITY_TEST, + Code_FTE716_DIFFER2_UNIFORMITY_TEST, + Code_FTE716_LCD_NOISE_TEST, + Code_FTE716_GPIO_TEST, + Code_FTE716_IC_TYPE_TEST, +}; +#elif(FTS_CHIP_TEST_TYPE == FT8606_TEST) + +struct stCfg_FT8606_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool IVSN_TEST; +}; +struct stCfg_FT8606_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int CbTest_Min; + int CbTest_Max; + int ShortTest_Max; + int ShortTest_K2Value; + bool ShortTest_Tip; + bool IsDifferMode; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; +}; + + +enum enumTestItem_FT8606 { + Code_FT8606_ENTER_FACTORY_MODE, + Code_FT8606_DOWNLOAD, + Code_FT8606_UPGRADE, + Code_FT8606_FACTORY_ID_TEST, + Code_FT8606_PROJECT_CODE_TEST, + Code_FT8606_FW_VERSION_TEST, + Code_FT8606_IC_VERSION_TEST, + Code_FT8606_RAWDATA_TEST, + Code_FT8606_CHANNEL_NUM_TEST, + + Code_FT8606_INT_PIN_TEST, + Code_FT8606_RESET_PIN_TEST, + Code_FT8606_NOISE_TEST, + Code_FT8606_CB_TEST, + Code_FT8606_WRITE_CONFIG, + + Code_FT8606_SHORT_CIRCUIT_TEST, + Code_FT8606_LCD_NOISE_TEST, + Code_FT8606_OSC60MHZ_TEST, + Code_FT8606_OSCTRM_TEST, + Code_FT8606_IVSN_TEST, +}; +#elif(FTS_CHIP_TEST_TYPE == FT3C47_TEST) + +struct stCfg_FT3C47_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + + bool FORCETOUCH_CHANNEL_NUM_TEST; + bool FORCETOUCH_RAWDATA_TEST; + bool FORCETOUCH_CB_TEST; + bool FORCETOUCH_WEAK_SHORT_CIRCUIT_TEST; + bool FORCETOUCH_FLATNESS_TEST; +}; + +struct stCfg_FT3C47_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int ForceTouch_ChannelNumTest_ChannelNum; + + int ForceTouch_SCapRawDataTest_OFF_Min; + int ForceTouch_SCapRawDataTest_OFF_Max; + int ForceTouch_SCapRawDataTest_ON_Min; + int ForceTouch_SCapRawDataTest_ON_Max; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_ON; + + int ForceTouch_SCapCbTest_OFF_Min; + int ForceTouch_SCapCbTest_OFF_Max; + int ForceTouch_SCapCbTest_ON_Min; + int ForceTouch_SCapCbTest_ON_Max; + BYTE ForceTouch_SCapCBTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapCBTest_SetWaterproof_ON; + + int ForceTouch_WeakShortTest_CG; + int ForceTouch_WeakShortTest_CC; + bool bForceTouch_WeakShortTest_CapShortTest; + + int ForceTouch_FlatnessTest_Differ_Threshold; + int ForceTouch_FlatnessTest_Differ_Coefficient; + bool ForceTouch_FlatnessTest_Differ_Threshold_Check; + bool ForceTouch_FlatnessTest_Differ_Coefficient_Check; + +}; +enum enumTestItem_FT3C47 { + Code_FT3C47_ENTER_FACTORY_MODE, + Code_FT3C47_DOWNLOAD, + Code_FT3C47_UPGRADE, + Code_FT3C47_FACTORY_ID_TEST, + Code_FT3C47_PROJECT_CODE_TEST, + Code_FT3C47_FW_VERSION_TEST, + Code_FT3C47_IC_VERSION_TEST, + Code_FT3C47_RAWDATA_TEST, + Code_FT3C47_ADCDETECT_TEST, + Code_FT3C47_SCAP_CB_TEST, + Code_FT3C47_SCAP_RAWDATA_TEST, + Code_FT3C47_CHANNEL_NUM_TEST, + Code_FT3C47_INT_PIN_TEST, + Code_FT3C47_RESET_PIN_TEST, + Code_FT3C47_NOISE_TEST, + Code_FT3C47_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_UNIFORMITY_TEST, + Code_FT3C47_CM_TEST, + Code_FT3C47_RAWDATA_MARGIN_TEST, + Code_FT3C47_WRITE_CONFIG, + Code_FT3C47_PANELDIFFER_TEST, + Code_FT3C47_PANELDIFFER_UNIFORMITY_TEST, + Code_FT3C47_LCM_ID_TEST, + Code_FT3C47_JUDEG_NORMALIZE_TYPE, + Code_FT3C47_TE_TEST, + Code_FT3C47_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT3C47_PATTERN_TEST, + + Code_FT3C47_GPIO_TEST, + Code_FT3C47_LCD_NOISE_TEST, + Code_FT3C47_FORCE_TOUCH_CHANNEL_NUM_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_RAWDATA_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_CB_TEST, + Code_FT3C47_FORCE_TOUCH_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_FORCE_TOUCH_FLATNESS_TEST, +}; +#endif + + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/Makefile b/drivers/input/touchscreen/FT8006m/focaltech_test/src/Makefile new file mode 100755 index 0000000000000..fd1ac825e691e --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/Makefile @@ -0,0 +1,12 @@ +#drivers/input/touchscreen/focaltech_touch/focaltech_test/src +# +# Makefile for test module +# +# Linux driver folder + +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_main.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_ini.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_global.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_detail_threshold.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_ic_table.o diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_ic_table.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_ic_table.c new file mode 100755 index 0000000000000..a3ba92ca67cee --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_ic_table.c @@ -0,0 +1,532 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: Focaltech_ic_table.c +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ + +#include +#include +#include "../include/focaltech_ic_table.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FOCALTECH_IC_TABLE_INFO "File Version of focaltech_ic_table.c: V1.0.0 2016-03-22" + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + + +/***************************************************************************** +* functions body +*****************************************************************************/ + + +unsigned int ft8006m_ic_table_get_ic_code_from_ic_name(char *strIcName) +{ + + if (strncmp(strIcName, "FT5X36", 6) == 0) + return IC_FT5X36; + if (strncmp(strIcName, "FT5X36i", 7) == 0) + return IC_FT5X36i; + if (strncmp(strIcName, "FT3X16", 6) == 0) + return IC_FT3X16; + if (strncmp(strIcName, "FT3X26", 6) == 0) + return IC_FT3X26; + + if (strncmp(strIcName, "FT5X22", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46i", 7) == 0) + return IC_FT5X46i; + if (strncmp(strIcName, "FT5526", 6) == 0) + return IC_FT5526; + if (strncmp(strIcName, "FT3X17", 6) == 0) + return IC_FT3X17; + if (strncmp(strIcName, "FT5436", 6) == 0) + return IC_FT5436; + if (strncmp(strIcName, "FT3X27", 6) == 0) + return IC_FT3X27; + if (strncmp(strIcName, "FT5526i", 7) == 0) + return IC_FT5526I; + if (strncmp(strIcName, "FT5416", 6) == 0) + return IC_FT5416; + if (strncmp(strIcName, "FT5426", 6) == 0) + return IC_FT5426; + if (strncmp(strIcName, "FT5435", 6) == 0) + return IC_FT5435; + if (strncmp(strIcName, "FT7681", 6) == 0) + return IC_FT7681; + if (strncmp(strIcName, "FT7661", 6) == 0) + return IC_FT7661; + if (strncmp(strIcName, "FT7511", 6) == 0) + return IC_FT7511; + if (strncmp(strIcName, "FT7421", 6) == 0) + return IC_FT7421; + + if (strncmp(strIcName, "FT6X06", 6) == 0) + return IC_FT6X06; + if (strncmp(strIcName, "FT3X06", 6) == 0) + return IC_FT3X06; + + if (strncmp(strIcName, "FT6X36", 6) == 0) + return IC_FT6X36; + if (strncmp(strIcName, "FT3X07", 6) == 0) + return IC_FT3X07; + if (strncmp(strIcName, "FT6416", 6) == 0) + return IC_FT6416; + if (strncmp(strIcName, "FT6336G/U", 9) == 0) + return IC_FT6426; + if (strncmp(strIcName, "FT6236U", 7) == 0) + return IC_FT6236U; + if (strncmp(strIcName, "FT6436U", 7) == 0) + return IC_FT6436U; + if (strncmp(strIcName, "FT3267", 6) == 0) + return IC_FT3267; + if (strncmp(strIcName, "FT3367", 6) == 0) + return IC_FT3367; + if (strncmp(strIcName, "FT7401", 6) == 0) + return IC_FT7401; + if (strncmp(strIcName, "FT3407U", 7) == 0) + return IC_FT3407U; + + + if (strncmp(strIcName, "FT5X16", 6) == 0) + return IC_FT5X16; + if (strncmp(strIcName, "FT5X12", 6) == 0) + return IC_FT5X12; + + if (strncmp(strIcName, "FT5506", 6) == 0) + return IC_FT5506; + if (strncmp(strIcName, "FT5606", 6) == 0) + return IC_FT5606; + if (strncmp(strIcName, "FT5816", 6) == 0) + return IC_FT5816; + + if (strncmp(strIcName, "FT5822", 6) == 0) + return IC_FT5822; + if (strncmp(strIcName, "FT5626", 6) == 0) + return IC_FT5626; + if (strncmp(strIcName, "FT5726", 6) == 0) + return IC_FT5726; + if (strncmp(strIcName, "FT5826B", 7) == 0) + return IC_FT5826B; + if (strncmp(strIcName, "FT3617", 6) == 0) + return IC_FT3617; + if (strncmp(strIcName, "FT3717", 6) == 0) + return IC_FT3717; + if (strncmp(strIcName, "FT7811", 6) == 0) + return IC_FT7811; + if (strncmp(strIcName, "FT5826S", 7) == 0) + return IC_FT5826S; + + if (strncmp(strIcName, "FT5306", 6) == 0) + return IC_FT5306; + if (strncmp(strIcName, "FT5406", 6) == 0) + return IC_FT5406; + + if (strncmp(strIcName, "FT8606", 6) == 0) + return IC_FT8606; + if (strncmp(strIcName, "FT8716", 6) == 0) + return IC_FT8716; + + if (strncmp(strIcName, "FT3C47U", 7) == 0) + return IC_FT3C47U; + + if (strncmp(strIcName, "FT8607", 6) == 0) + return IC_FT8607; + if (strncmp(strIcName, "FT8707", 6) == 0) + return IC_FT8707; + + + if (strncmp(strIcName, "FT8736", 6) == 0) + return IC_FT8736; + + if (strncmp(strIcName, "FT3D47", 6) == 0) + return IC_FT3D47; + + if (strncmp(strIcName, "FTE716", 6) == 0) + return IC_FTE716; + + if (strncmp(strIcName, "FT5442", 6) == 0) + return IC_FT5442; + + if (strncmp(strIcName, "FT3428U", 7) == 0) + return IC_FT3428U; + + if (strncmp(strIcName, "FT8006M", 7) == 0) + return IC_FT8006M; + + if (strncmp(strIcName, "FT8201", 6) == 0) + return IC_FT8201; + + if (strncmp(strIcName, "FTE736", 6) == 0) + return IC_FTE736; + + printk("%s. can NOT get ic code. ERROR !!! \n", __func__); + + return 0xff; +} + + +void ft8006m_ic_table_get_ic_name_from_ic_code(unsigned int ucIcCode, char *strIcName) +{ + if (NULL == strIcName) + return; + + sprintf(strIcName, "%s", "NA");/*if can't find IC , set 'NA'*/ + + if (ucIcCode == IC_FT5X36) + sprintf(strIcName, "%s", "FT5X36"); + if (ucIcCode == IC_FT5X36i) + sprintf(strIcName, "%s", "FT5X36i"); + if (ucIcCode == IC_FT3X16) + sprintf(strIcName, "%s", "FT3X16"); + if (ucIcCode == IC_FT3X26) + sprintf(strIcName, "%s", "FT3X26"); + + + if (ucIcCode == IC_FT5X46) + sprintf(strIcName, "%s", "FT5X46"); + if (ucIcCode == IC_FT5X46i) + sprintf(strIcName, "%s", "FT5X46i"); + if (ucIcCode == IC_FT5526) + sprintf(strIcName, "%s", "FT5526"); + if (ucIcCode == IC_FT3X17) + sprintf(strIcName, "%s", "FT3X17"); + if (ucIcCode == IC_FT5436) + sprintf(strIcName, "%s", "FT5436"); + if (ucIcCode == IC_FT3X27) + sprintf(strIcName, "%s", "FT3X27"); + if (ucIcCode == IC_FT5526I) + sprintf(strIcName, "%s", "FT5526i"); + if (ucIcCode == IC_FT5416) + sprintf(strIcName, "%s", "FT5416"); + if (ucIcCode == IC_FT5426) + sprintf(strIcName, "%s", "FT5426"); + if (ucIcCode == IC_FT5435) + sprintf(strIcName, "%s", "FT5435"); + if (ucIcCode == IC_FT7681) + sprintf(strIcName, "%s", "FT7681"); + if (ucIcCode == IC_FT7661) + sprintf(strIcName, "%s", "FT7661"); + if (ucIcCode == IC_FT7511) + sprintf(strIcName, "%s", "FT7511"); + if (ucIcCode == IC_FT7421) + sprintf(strIcName, "%s", "FT7421"); + + if (ucIcCode == IC_FT6X06) + sprintf(strIcName, "%s", "FT6X06"); + if (ucIcCode == IC_FT3X06) + sprintf(strIcName, "%s", "FT3X06"); + + if (ucIcCode == IC_FT6X36) + sprintf(strIcName, "%s", "FT6X36"); + if (ucIcCode == IC_FT3X07) + sprintf(strIcName, "%s", "FT3X07"); + if (ucIcCode == IC_FT6416) + sprintf(strIcName, "%s", "FT6416"); + if (ucIcCode == IC_FT6426) + sprintf(strIcName, "%s", "FT6336G/U"); + if (ucIcCode == IC_FT6236U) + sprintf(strIcName, "%s", "FT6236U"); + if (ucIcCode == IC_FT6436U) + sprintf(strIcName, "%s", "FT6436U"); + if (ucIcCode == IC_FT3267) + sprintf(strIcName, "%s", "FT3267"); + if (ucIcCode == IC_FT3367) + sprintf(strIcName, "%s", "FT3367"); + if (ucIcCode == IC_FT7401) + sprintf(strIcName, "%s", "FT7401"); + if (ucIcCode == IC_FT3407U) + sprintf(strIcName, "%s", "FT3407U"); + + if (ucIcCode == IC_FT5X16) + sprintf(strIcName, "%s", "FT5X16"); + if (ucIcCode == IC_FT5X12) + sprintf(strIcName, "%s", "FT5X12"); + + if (ucIcCode == IC_FT5506) + sprintf(strIcName, "%s", "FT5506"); + if (ucIcCode == IC_FT5606) + sprintf(strIcName, "%s", "FT5606"); + if (ucIcCode == IC_FT5816) + sprintf(strIcName, "%s", "FT5816"); + + if (ucIcCode == IC_FT5822) + sprintf(strIcName, "%s", "FT5822"); + if (ucIcCode == IC_FT5626) + sprintf(strIcName, "%s", "FT5626"); + if (ucIcCode == IC_FT5726) + sprintf(strIcName, "%s", "FT5726"); + if (ucIcCode == IC_FT5826B) + sprintf(strIcName, "%s", "FT5826B"); + if (ucIcCode == IC_FT3617) + sprintf(strIcName, "%s", "FT3617"); + if (ucIcCode == IC_FT3717) + sprintf(strIcName, "%s", "FT3717"); + if (ucIcCode == IC_FT7811) + sprintf(strIcName, "%s", "FT7811"); + if (ucIcCode == IC_FT5826S) + sprintf(strIcName, "%s", "FT5826S"); + + if (ucIcCode == IC_FT5306) + sprintf(strIcName, "%s", "FT5306"); + if (ucIcCode == IC_FT5406) + sprintf(strIcName, "%s", "FT5406"); + + if (ucIcCode == IC_FT8606) + sprintf(strIcName, "%s", "FT8606"); + if (ucIcCode == IC_FT8716) + sprintf(strIcName, "%s", "FT8716"); + + if (ucIcCode == IC_FT3C47U) + sprintf(strIcName, "%s", "FT3C47U"); + + if (ucIcCode == IC_FT8607) + sprintf(strIcName, "%s", "FT8607"); + if (ucIcCode == IC_FT8707) + sprintf(strIcName, "%s", "FT8707"); + if (ucIcCode == IC_FT8736) + sprintf(strIcName, "%s", "FT8736"); + + if (ucIcCode == IC_FT3D47) + sprintf(strIcName, "%s", "FT3D47"); + + if (ucIcCode == IC_FTE716) + sprintf(strIcName, "%s", "FTE716"); + + if (ucIcCode == IC_FT5442) + sprintf(strIcName, "%s", "FT5442"); + + if (ucIcCode == IC_FT3428U) + sprintf(strIcName, "%s", "FT3428U"); + + if (ucIcCode == IC_FT8006M) + sprintf(strIcName, "%s", "FT8006M"); + + if (ucIcCode == IC_FT8201) + sprintf(strIcName, "%s", "FT8201"); + + if (ucIcCode == IC_FTE736) + sprintf(strIcName, "%s", "FTE736"); + + + + return ; +} + + +unsigned int ft8006m_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2) +{ + unsigned int ic_code = 0; + switch (chip_id) { + case 0x55: + ic_code = IC_FT5306; + break; + case 0x08: + ic_code = IC_FT5606; + break; + case 0x0a: + ic_code = IC_FT5X16; + break; + case 0x06: + ic_code = IC_FT6X06; + break; + case 0x36: + ic_code = IC_FT6X36; + break; + case 0x14: + ic_code = IC_FT5X36; + break; + case 0x13: + ic_code = IC_FT3X16; + break; + case 0x12: + ic_code = IC_FT5X36i; + break; + case 0x11: + ic_code = IC_FT5X36i; + break; + case 0x54: + ic_code = IC_FT5X46; + break; + case 0x58: + ic_code = IC_FT5822; + break; + + + case 0x86: + if (0x06 == chip_id2) + ic_code = IC_FT8606; + else if (0x07 == chip_id2) + ic_code = IC_FT8607; + break; + case 0x87: + if (0x07 == chip_id2) + ic_code = IC_FT8707; + else if (0x16 == chip_id2) + ic_code = IC_FT8716; + else if (0x36 == chip_id2) + ic_code = IC_FT8736; + break; + case 0xE7: + if (0x16 == chip_id2) + ic_code = IC_FTE716; + else if (0x36 == chip_id2) + ic_code = IC_FTE736; + break; + default: + ic_code = 0; + break; + } + return ic_code; +} + +unsigned int ft8006m_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2) +{ + unsigned char uc_chip_id = 0; + unsigned char uc_chip_id2 = 0; + switch (ic_code>>4) { + case (IC_FT5306>>4): + uc_chip_id = 0x55; + break; + case (IC_FT5606>>4): + uc_chip_id = 0x08; + break; + case (IC_FT5X16>>4): + uc_chip_id = 0x0a; + break; + case (IC_FT6X06>>4): + uc_chip_id = 0x06; + break; + case (IC_FT6X36>>4): + uc_chip_id = 0x36; + break; + case (IC_FT5X36>>4): + switch (ic_code) { + case (IC_FT5X36): + uc_chip_id = 0x14; + break; + case (IC_FT3X26): + uc_chip_id = 0x13; + break; + case (IC_FT3X16): + uc_chip_id = 0x12; + break; + case (IC_FT5X36i): + uc_chip_id = 0x11; + break; + } + break; + case (IC_FT5X46>>4): + uc_chip_id = 0x54; + break; + case (IC_FT5822>>4): + uc_chip_id = 0x58; + break; + + + case (IC_FT8606>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x06; + break; + case (IC_FT8607>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x07; + break; + case (IC_FT8707>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x07; + break; + case (IC_FT8716>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x16; + break; + case (IC_FT8736>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x36; + break; + case (IC_FTE716>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x16; + break; + case (IC_FTE736>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x36; + break; + + default: + uc_chip_id = 0; + break; + + } + + *chip_id = uc_chip_id; + *chip_id2 = uc_chip_id2; + + return 0; +} +int ft8006m_ic_table_need_chip_id2(unsigned int chip_id) +{ + int b_need_id2 = -1; + switch (chip_id) { + case 0x86: + case 0x87: + case 0xE7: + b_need_id2 = 0; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + default: + b_need_id2 = -1; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + } + return b_need_id2; +} diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test.c new file mode 100755 index 0000000000000..36624ade2a094 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test.c @@ -0,0 +1,812 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/************************************************************************ +* +* File Name: focaltech_test.c +* +* Author: Software Department, FocalTech +* +* Created: 2016-08-01 +* +* Modify: +* +* Abstract: create char device and proc node for the comm between APK and TP +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include +#include +#include +#include +#include + +#include +#include + +#include "../../focaltech_core.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_test_ini.h" + +#include +#include +#define CTP_PARENT_PROC_NAME "touchscreen" +#define CTP_OPEN_PROC_NAME "ctp_openshort_test" + +#if FTS_LOCK_DOWN_INFO +static char tp_lockdown_info[128]; +#define FTS_PROC_LOCKDOWN_FILE "lockdown_info" +static int fts_lockdown_proc_show(struct seq_file *file, void *data) +{ + char temp[40] = {0}; + + sprintf(temp, "%s\n", tp_lockdown_info); + seq_printf(file, "%s\n", temp); + + return 0; +} + +static int fts_lockdown_proc_open (struct inode *inode, struct file *file) +{ + return single_open(file, fts_lockdown_proc_show, inode->i_private); +} + +static const struct file_operations fts_lockdown_proc_fops = { + .open = fts_lockdown_proc_open, + .read = seq_read, +}; + +#endif + +#if FTS_CAT_RAWDATA +#define FTS_PROC_RAWDATA "rawdata" +static u8 g_isdiff = 1; +/************************************************************************ +* Name: StartScan(Same function name as FT_MultipleTest) +* Brief: Scan TP, do it before read Raw Data +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static int StartScan(struct i2c_client *client) +{ + u8 RegVal = 0x00; + u8 times = 0; + const u8 MaxTimes = 20; + u8 ReCode = -1; + + ReCode = ft8006m_i2c_write_reg(client, 0x00, 0xC0); + if (ReCode >= 0) { + while (times++ < MaxTimes) { + msleep(8); + ReCode = ft8006m_i2c_read_reg(client, 0x00, &RegVal); + if (RegVal == 0x40) + break; + } + + if (times > MaxTimes) + return -EPERM; + } + return ReCode; +} + +int ft8006m_read_rawdata(struct i2c_client *client, int is_diff, s16 *data, int len) +{ + u8 reg = 0x6A; + u8 regdata[1280] = { 0 }; + int remain_bytes; + int pos = 0; + int i = 0; + + FTS_DEBUG("len=%d, is_diff=%d", len, is_diff); + ft8006m_i2c_write_reg(client, 0x06, is_diff); + + if (StartScan(client) < 0) + return -EPERM; + + ft8006m_i2c_write_reg(client, 0x01, 0xAD); + + if (len <= 256) + ft8006m_i2c_read(client, ®, 1, regdata, len); + else { + ft8006m_i2c_read(client, ®, 1, regdata, 256); + remain_bytes = len - 256; + for (i = 1; remain_bytes > 0; i++) { + if (remain_bytes > 256) + ft8006m_i2c_read(client, ®, 0, regdata + i * 256, 256); + else + ft8006m_i2c_read(client, ®, 0, regdata + i * 256, remain_bytes); + remain_bytes -= 256; + } + } + + for (i = 0; i < len;) { + data[pos++] = ((s16)(regdata[i]) << 8) + regdata[i+1]; + i += 2; + } + return 0; +} + +int ft8006m_get_rawdata(struct i2c_client *client, s16 *data, u8 *txlen, u8 *rxlen) +{ + u8 val; + int i; + + /* 0xEE = 1, not clb */ + ft8006m_i2c_write_reg(client, 0xEE, 1); + + /* Enter Factory Mode */ + ft8006m_i2c_write_reg(client, 0x00, 0x40); + do { + ft8006m_i2c_read_reg(client, 0x00, &val); + if (val == 0x40) + break; + msleep(1); + } while (i < 10); + + /* Get Tx/Rx Num */ + ft8006m_i2c_read_reg(client, 0x02, txlen); + ft8006m_i2c_read_reg(client, 0x03, rxlen); + + /* read_rawdata */ + ft8006m_read_rawdata(client, g_isdiff, data, (*txlen) * (*rxlen) * 2); + + /* Enter in work mode */ + ft8006m_i2c_write_reg(client, 0x00, 0x00); + do { + ft8006m_i2c_read_reg(client, 0x00, &val); + if (val == 0x00) + break; + msleep(1); + } while (i < 10); + + return 0; +} + +static char temp_8006m[PAGE_SIZE] = {0}; + +static int fts_rawdata_proc_show(struct seq_file *file, void *buf) +{ + int count; + int i = 0, j = 0; + u8 val; + s16 data[600] = { 0 }; + u8 txlen = 0; + u8 rxlen = 0; + struct i2c_client *client = ft8006m_i2c_client; + + if (ft8006m_wq_data->suspended) { + FTS_INFO("Already in suspend state"); + return -EPERM; + } + mutex_lock(&ft8006m_input_dev->mutex); + + ft8006m_get_rawdata(client, data, &txlen, &rxlen); + + ft8006m_i2c_read_reg(client, 0xEE, &val); + count = snprintf(temp_8006m, PAGE_SIZE, "0xEE = %d\n", val); + count += snprintf(temp_8006m + count, PAGE_SIZE-count, "%s :\n", g_isdiff ? "DIFF DATA" : "RAWDATA"); + for (i = 0; i < txlen; i++) { + for (j = 0; j < rxlen; j++) { + count += snprintf(temp_8006m + count, PAGE_SIZE-count, "%5d ", data[i*rxlen + j]); + } + count += snprintf(temp_8006m + count, PAGE_SIZE-count, "\n"); + } + count += snprintf(temp_8006m + count, PAGE_SIZE-count, "\n\n"); + seq_printf(file, "%s\n", temp_8006m); + memset(temp_8006m, 0, PAGE_SIZE); + mutex_unlock(&ft8006m_input_dev->mutex); + + return 0; +} + +static int fts_rawdata_proc_open (struct inode *inode, struct file *file) +{ + return single_open(file, fts_rawdata_proc_show, inode->i_private); +} + +static ssize_t fts_rawdata_proc_store(struct file *file, const char __user *buf, size_t count, loff_t *len) +{ + unsigned long val; + int ret; + char *buff[5] = {0}; + if (ft8006m_wq_data->suspended) { + FTS_INFO("Already in suspend state"); + return -EPERM; + } + ret = copy_from_user(buff, buf, 5); + mutex_lock(&ft8006m_input_dev->mutex); + val = simple_strtoul((char *)buff, NULL, 10); + if (val) + g_isdiff = 1; + else + g_isdiff = 0; + mutex_unlock(&ft8006m_input_dev->mutex); + + return count; +} +static const struct file_operations fts_rawdata_proc_fops = { + .open = fts_rawdata_proc_open, + .read = seq_read, + .write = fts_rawdata_proc_store, +}; +#endif +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); +static const struct file_operations ctp_open_procs_fops = { + .write = ctp_open_proc_write, + .read = ctp_open_proc_read, + .owner = THIS_MODULE, +}; +static struct proc_dir_entry *ctp_device_proc; +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define IC_TEST_VERSION "Test version: V1.0.0--2016-12-28, (sync version of FT_MultipleTest: V4.0.0.0 ------ 2016-07-18)" + + +#define FTS_INI_FILE_PATH "/etc/" + +#define FTS_SAVE_DATA_FILE_PATH "/mnt/sdcard/" + + +#define FTS_TEST_BUFFER_SIZE 80*1024 +#define FTS_TEST_PRINT_SIZE 128 +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static int fts_test_get_ini_size(char *config_name); +static int fts_test_read_ini_data(char *config_name, char *config_buf); +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen); +static int fts_test_get_testparam_from_ini(char *config_name); +static int fts_test_entry(char *ini_file_name); + +static int fts_test_i2c_read(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen); +static int fts_test_i2c_write(unsigned char *writebuf, int writelen); + + +/***************************************************************************** +* functions body +*****************************************************************************/ +static int fts_test_i2c_read(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen) +{ + int iret = -1; +#if 1 + iret = ft8006m_i2c_read(ft8006m_i2c_client, writebuf, writelen, readbuf, readlen); +#else + iret = ft8006m_i2c_read(writebuf, writelen, readbuf, readlen); +#endif + + return iret; + +} + +static int fts_test_i2c_write(unsigned char *writebuf, int writelen) +{ + int iret = -1; +#if 1 + iret = ft8006m_i2c_write(ft8006m_i2c_client, writebuf, writelen); +#else + iret = ft8006m_i2c_write(writebuf, writelen); +#endif + + return iret; +} + + +static int fts_test_get_ini_size(char *config_name) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + filp_close(pfile, NULL); + + FTS_TEST_FUNC_ENTER(); + + return fsize; +} + + +static int fts_test_read_ini_data(char *config_name, char *config_buf) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + loff_t pos = 0; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, config_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen) +{ + struct file *pfile = NULL; + + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_SAVE_DATA_FILE_PATH, file_name); + if (NULL == pfile) { + + pfile = filp_open(filepath, O_TRUNC|O_CREAT|O_RDWR, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_write(pfile, data_buf, iLen, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_get_testparam_from_ini(char *config_name) +{ + char *pcfiledata = NULL; + int ret = 0; + int inisize = 0; + + FTS_TEST_FUNC_ENTER(); + + inisize = fts_test_get_ini_size(config_name); + FTS_TEST_DBG("ini_size = %d ", inisize); + if (inisize <= 0) { + FTS_TEST_ERROR("%s ERROR:Get firmware size failed", __func__); + return -EIO; + } + + pcfiledata = Ft8006m_fts_malloc(inisize + 1); + if (NULL == pcfiledata) { + FTS_TEST_ERROR("Ft8006m_fts_malloc failed in function:%s", __func__); + return -EPERM; + } + + memset(pcfiledata, 0, inisize + 1); + + if (fts_test_read_ini_data(config_name, pcfiledata)) { + FTS_TEST_ERROR(" - ERROR: fts_test_read_ini_data failed"); + Ft8006m_fts_free(pcfiledata); + pcfiledata = NULL; + + return -EIO; + } else { + FTS_TEST_DBG("fts_test_read_ini_data successful"); + } + + ret = ft8006m_set_param_data(pcfiledata); + + Ft8006m_fts_free(pcfiledata); + pcfiledata = NULL; + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} + +static int fts_test_entry(char *ini_file_name) +{ + /* place holder for future use */ + char cfgname[128]; + char *testdata = NULL; + char *printdata = NULL; + int iTestDataLen = 0; + int ret = 0; + int icycle = 0, i = 0; + int print_index = 0; + + + FTS_TEST_FUNC_ENTER(); + FTS_TEST_DBG("ini_file_name:%s.", ini_file_name); + /*Used to obtain the test data stored in the library, pay attention to the size of the distribution space.*/ + FTS_TEST_DBG("Allocate memory, size: %d", FTS_TEST_BUFFER_SIZE); + testdata = Ft8006m_fts_malloc(FTS_TEST_BUFFER_SIZE); + if (NULL == testdata) { + FTS_TEST_ERROR("Ft8006m_fts_malloc failed in function:%s", __func__); + return -EPERM; + } + printdata = Ft8006m_fts_malloc(FTS_TEST_PRINT_SIZE); + if (NULL == printdata) { + FTS_TEST_ERROR("Ft8006m_fts_malloc failed in function:%s", __func__); + return -EPERM; + } + /*Initialize the platform related I2C read and write functions*/ + +#if 0 + ft8006m_init_i2c_write_func(ft8006m_i2c_write); + ft8006m_init_i2c_read_func(ft8006m_i2c_read); +#else + ft8006m_init_i2c_write_func(fts_test_i2c_write); + ft8006m_init_i2c_read_func(fts_test_i2c_read); +#endif + + /*Initialize pointer memory*/ + ret = ft8006m_focaltech_test_main_init(); + if (ret < 0) { + FTS_TEST_ERROR("ft8006m_focaltech_test_main_init() error."); + goto TEST_ERR; + } + + /*Read parse configuration file*/ + memset(cfgname, 0, sizeof(cfgname)); + sprintf(cfgname, "%s", ini_file_name); + FTS_TEST_DBG("ini_file_name = %s", cfgname); + + ft8006m_test_funcs(); + + if (fts_test_get_testparam_from_ini(cfgname) < 0) { + FTS_TEST_ERROR("get testparam from ini failure"); + goto TEST_ERR; + } + + + if ((ft8006m_g_ScreenSetParam.iSelectedIC >> 4 != FTS_CHIP_TEST_TYPE >> 4)) { + FTS_TEST_ERROR("Select IC and Read IC from INI does not match "); + + } + + + /*Start testing according to the test configuration*/ + if (true == ft8006m_start_test_tp()) { + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "Tp test pass. \n\n"); + FTS_TEST_INFO("tp test pass"); + ret = 0; + } else { + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "Tp test failure. \n\n"); + FTS_TEST_INFO("tp test failure"); + ret = 1; + } + + + /*Gets the number of tests in the test library and saves it*/ + iTestDataLen = m_get_test_data(testdata); + + + icycle = 0; + /*Print test data packets */ + FTS_TEST_DBG("print test data: \n"); + for (i = 0; i < iTestDataLen; i++) { + if (('\0' == testdata[i]) + || (icycle == FTS_TEST_PRINT_SIZE - 2) + || (i == iTestDataLen-1) + ) { + if (icycle == 0) { + print_index++; + } else { + memcpy(printdata, testdata + print_index, icycle); + printdata[FTS_TEST_PRINT_SIZE-1] = '\0'; + FTS_TEST_DBG("%s", printdata); + print_index += icycle; + icycle = 0; + } + } else { + icycle++; + } + } + FTS_TEST_DBG("\n"); + + + + fts_test_save_test_data("testdata.csv", testdata, iTestDataLen); + fts_test_save_test_data("testresult.txt", Ft8006m_TestResult, Ft8006m_TestResultLen); + + + /*Release memory */ + ft8006m_focaltech_test_main_exit(); + + + + if (NULL != testdata) + Ft8006m_fts_free(testdata); + if (NULL != printdata) + Ft8006m_fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return ret; + +TEST_ERR: + if (NULL != testdata) + Ft8006m_fts_free(testdata); + if (NULL != printdata) + Ft8006m_fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return -EPERM; +} + +static int fts_set_ini_name(char *cfgname) +{ + int ret; + u8 vid; + + ret = ft8006m_i2c_read_reg(ft8006m_i2c_client, FTS_REG_VENDOR_ID, &vid); + FTS_TEST_DBG("vendor id:0x%x\n", vid); + if (vid == OFILM_VENDOR) { + sprintf(cfgname, "%s", "fts_ofilm.ini"); + } else if (vid == EACHOPTO_VENDOR) { + sprintf(cfgname, "%s", "fts_eachopto.ini"); + } else if (vid == TXD_VENDOR) { + + sprintf(cfgname, "%s", "fts_holitech.ini"); + } else if (vid == BOE_VENDOR) { + sprintf(cfgname, "%s", "fts_boe.ini"); + } else { + pr_err("ctp test not found test config \n"); + } + + return ret; +} + +#if FTS_AUTO_UPGRADE_EN +void ft8006m_waite_for_fw_upgrading(void) +{ + int vid = 0; + if (ft8006m_fw_upgrade_status == FW_UPGRADING) { + for (; ft8006m_fw_upgrade_status == FW_UPGRADING; ) { + if ((vid%4) == 0) + FTS_TEST_DBG("tp firmware upgrading status:%d\n", ft8006m_fw_upgrade_status); + msleep(200); + vid++; + if (vid > 30) { + FTS_TEST_DBG("takes 6s tp still upgrading status:%d\n", ft8006m_fw_upgrade_status); + break; + } + } + } + return; +} +#endif + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + char fwname[128] = {0}; + int ret; + u8 result = 0; + struct i2c_client *client = ft8006m_i2c_client; + + FTS_TEST_FUNC_ENTER(); +#if FTS_AUTO_UPGRADE_EN + ft8006m_waite_for_fw_upgrading(); +#endif + + if (*ppos) { + FTS_TEST_ERROR("tp test again return\n"); + return 0; + } + *ppos += count; + + memset(fwname, 0, sizeof(fwname)); + fts_set_ini_name(fwname); + fwname[strlen(fwname)] = '\0'; + FTS_TEST_DBG("fwname:%s.", fwname); + + mutex_lock(&ft8006m_input_dev->mutex); + + disable_irq(client->irq); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + ft8006m_esdcheck_switch(DISABLE); +#endif + ret = fts_test_entry(fwname); + if (0 != ret) { + result = 0; + FTS_TEST_ERROR("fts open short test fail \n"); + } else { + result = 1; + FTS_TEST_ERROR("fts open short test success \n"); + } +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + ft8006m_esdcheck_switch(ENABLE); +#endif + enable_irq(client->irq); + + mutex_unlock(&ft8006m_input_dev->mutex); + + FTS_TEST_FUNC_EXIT(); + + return sprintf(ptr, "result=%d\n", result); +} + + +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + void ft8006m_create_ctp_proc(void) +{ + + struct proc_dir_entry *ctp_open_proc = NULL; + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return; + } + } + ctp_open_proc = proc_create(CTP_OPEN_PROC_NAME, 0777, ctp_device_proc, &ctp_open_procs_fops); + if (ctp_open_proc == NULL) { + FTS_TEST_ERROR("create open_proc fail\n"); + } +} + +int ft8006m_test_init(struct i2c_client *client) +{ + int err = 0; + + FTS_TEST_FUNC_ENTER(); + + FTS_TEST_INFO("%s\n", IC_TEST_VERSION); + + ft8006m_create_ctp_proc(); + + FTS_TEST_FUNC_EXIT(); + + return err; +} +int ft8006m_test_exit(struct i2c_client *client) +{ + FTS_TEST_FUNC_ENTER(); + + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +#if FTS_LOCK_DOWN_INFO +int ft8006m_lockdown_init(struct i2c_client *client) +{ + int err = 0; + unsigned char auc_i2c_write_buf[10]; + u8 buf[18] = {0}; + struct proc_dir_entry *fts_lockdown_status_proc = NULL; + struct fts_ts_data *data; + data = i2c_get_clientdata(client); + err = ft8006m_i2c_write_reg(client, 0x90, 0x20); + if (err < 0) + FTS_ERROR("[FTS] i2c write 0x90 err\n"); + + msleep(5); + auc_i2c_write_buf[0] = 0x99; + err = ft8006m_i2c_read(client, auc_i2c_write_buf, 1, buf, 16); + if (err < 0) + FTS_ERROR("[FTS] i2c read 0x99 err\n"); + + sprintf(tp_lockdown_info, "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", \ + buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7], buf[8], + buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]); + FTS_INFO("tpd_probe, ft8006m_ctpm_LockDownInfo_get_from_boot, tp_lockdown_info=%s\n", tp_lockdown_info); + memset(data->lockdown_info, 0, 128); + strncpy(data->lockdown_info, tp_lockdown_info, 16); + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return 1; + } + } + fts_lockdown_status_proc = proc_create(FTS_PROC_LOCKDOWN_FILE, 0644, ctp_device_proc, &fts_lockdown_proc_fops); + if (fts_lockdown_status_proc == NULL) { + FTS_ERROR("fts, create_proc_entry ctp_lockdown_status_proc failed\n"); + return 1; + } + return 0 ; +} +#endif + +#if FTS_CAT_RAWDATA +int ft8006m_rawdata_init(struct i2c_client *client) +{ + + struct proc_dir_entry *fts_rawdata_status_proc = NULL; + + + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return 1; + } + } + fts_rawdata_status_proc = proc_create(FTS_PROC_RAWDATA, 0777, ctp_device_proc, &fts_rawdata_proc_fops); + if (fts_rawdata_status_proc == NULL) { + FTS_ERROR("fts, create_proc_entry ctp_lockdown_status_proc failed\n"); + return 1; + } + return 0 ; +} +#endif + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_detail_threshold.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_detail_threshold.c new file mode 100755 index 0000000000000..aa39ff78c1244 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_detail_threshold.c @@ -0,0 +1,1812 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_ic_table.h" + + +struct stCfg_MCap_DetailThreshold ft8006m_g_stCfg_MCap_DetailThreshold; +struct stCfg_SCap_DetailThreshold ft8006m_g_stCfg_SCap_DetailThreshold; +struct stCfg_Incell_DetailThreshold ft8006m_g_stCfg_Incell_DetailThreshold; + +void ft8006m_set_max_channel_num(void) +{ + + FTS_TEST_FUNC_ENTER(); + switch (ft8006m_g_ScreenSetParam.iSelectedIC>>4) { + case IC_FT5822>>4: + case IC_FT8006M>>4: + case IC_FTE716>>4: + case IC_FT3D47>>4: + ft8006m_g_ScreenSetParam.iUsedMaxTxNum = TX_NUM_MAX; + ft8006m_g_ScreenSetParam.iUsedMaxRxNum = RX_NUM_MAX; + break; + default: + ft8006m_g_ScreenSetParam.iUsedMaxTxNum = 30; + ft8006m_g_ScreenSetParam.iUsedMaxRxNum = 30; + break; + } + + FTS_TEST_DBG("MaxTxNum = %d, MaxRxNum = %d. ", ft8006m_g_ScreenSetParam.iUsedMaxTxNum, ft8006m_g_ScreenSetParam.iUsedMaxRxNum); + + FTS_TEST_FUNC_EXIT(); + +} + +int ft8006m_malloc_struct_DetailThreshold(void) +{ + FTS_TEST_FUNC_ENTER(); + + + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC = (unsigned char (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max = (short (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min = (short (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max = (short (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min = (short (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) + goto ERR; + + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) + goto ERR; + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) + goto ERR; + + + + ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode) { + FTS_TEST_DBG("InvalidNode. \n"); + goto ERR; + } + + + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + FTS_TEST_DBG("RawDataTest_Min. \n"); + goto ERR; + } + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + FTS_TEST_DBG("RawDataTest_Max. \n"); + goto ERR; + } + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min) { + FTS_TEST_DBG("CBTest_Min. \n"); + goto ERR; + } + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max) { + FTS_TEST_DBG("CBTest_Max. \n"); + goto ERR; + } + + ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHY_Linearity. \n"); + goto ERR; + } + ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = (int (*)[RX_NUM_MAX])Ft8006m_fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHX_Linearity. \n"); + goto ERR; + } + + FTS_TEST_FUNC_EXIT(); + + return 0; + +ERR: + FTS_TEST_ERROR("Ft8006m_fts_malloc memory failed in function."); + return -EPERM; +} + +void ft8006m_free_struct_DetailThreshold(void) +{ + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode); + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode = NULL; + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC); + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC = NULL; + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min); + } + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient); + ft8006m_g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = NULL; + } + + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max); + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = NULL; + } + + if (NULL != ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min); + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode); + ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min); + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min); + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max); + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity); + ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = NULL; + } + + if (NULL != ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + Ft8006m_fts_free(ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity); + ft8006m_g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = NULL; + } + + + +} + +void Ft8006m_OnInit_SCap_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + Ft8006m_OnGetTestItemParam("RawDataTest_Max", strIniFile, 12500); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.RawDataTest_Max, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("RawDataTest_Min", strIniFile, 16500); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.RawDataTest_Min, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("CiTest_Max", strIniFile, 5); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CiTest_Max, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("CiTest_Min", strIniFile, 250); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CiTest_Min, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("DeltaCiTest_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCiTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("DeltaCiTest_AnotherBase1", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase1, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("DeltaCiTest_AnotherBase2", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase2, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("NoiseTest_Max", strIniFile, 20); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.NoiseTest_Max, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("CiDeviation_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CiDeviationTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("DeltaCxTest_Sort", strIniFile, 1); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCxTest_Sort, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + Ft8006m_OnGetTestItemParam("DeltaCxTest_Area", strIniFile, 1); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCxTest_Area, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + + Ft8006m_OnGetTestItemParam("CbTest_Max", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CbTest_Max, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + Ft8006m_OnGetTestItemParam("CbTest_Min", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CbTest_Min, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + Ft8006m_OnGetTestItemParam("DeltaCbTest_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DeltaCbTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + Ft8006m_OnGetTestItemParam("DifferTest_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.DifferTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + Ft8006m_OnGetTestItemParam("CBDeviation_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.CBDeviationTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + Ft8006m_OnGetTestItemParam("K1DifferTest_Base", strIniFile, 0); + memcpy(ft8006m_g_stCfg_SCap_DetailThreshold.K1DifferTest_Base, ft8006m_g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue) +{ + + char strValue[800]; + char str_tmp[128]; + int iValue = 0; + int dividerPos = 0; + int index = 0; + int i = 0, j = 0, k = 0; + memset(ft8006m_g_stCfg_SCap_DetailThreshold.TempData, 0, sizeof(ft8006m_g_stCfg_SCap_DetailThreshold.TempData)); + sprintf(str_tmp, "%d", iDefautValue); + Ft8006m_GetPrivateProfileString("Basic_Threshold", strItemName, str_tmp, strValue, strIniFile); + iValue = ft8006m_atoi(strValue); + for (i = 0; i < MAX_CHANNEL_NUM; i++) { + ft8006m_g_stCfg_SCap_DetailThreshold.TempData[i] = iValue; + } + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", strItemName, "", strValue, strIniFile); + if (dividerPos > 0) { + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_SCap_DetailThreshold.TempData[k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } +} + +void Ft8006m_OnInit_MCap_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + ft8006m_set_max_channel_num(); + + Ft8006m_OnInit_InvalidNode(strIniFile); + Ft8006m_OnInit_DThreshold_RawDataTest(strIniFile); + Ft8006m_OnInit_DThreshold_SCapRawDataTest(strIniFile); + Ft8006m_OnInit_DThreshold_SCapCbTest(strIniFile); + + Ft8006m_OnInit_DThreshold_ForceTouch_SCapRawDataTest(strIniFile); + Ft8006m_OnInit_DThreshold_ForceTouch_SCapCbTest(strIniFile); + + Ft8006m_OnInit_DThreshold_RxLinearityTest(strIniFile); + Ft8006m_OnInit_DThreshold_TxLinearityTest(strIniFile); + + Ft8006m_OnInit_DThreshold_PanelDifferTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} +void Ft8006m_OnInit_InvalidNode(char *strIniFile) +{ + + char str[MAX_PATH] = {0}, strTemp[MAX_PATH] = {0}; + int i = 0, j = 0; + + + + FTS_TEST_FUNC_ENTER(); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + sprintf(strTemp, "InvalidNode[%d][%d]", (i+1), (j+1)); + + Ft8006m_GetPrivateProfileString("INVALID_NODE", strTemp, "1", str, strIniFile); + if (ft8006m_atoi(str) == 0) { + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 0; + ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 0; + FTS_TEST_DBG("node (%d, %d) \n", (i+1), (j+1)); + + } else if (ft8006m_atoi(str) == 2) { + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 2; + ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 2; + } else { + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 1; + ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 1; + } + + + + + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + sprintf(strTemp, "InvalidNodeS[%d][%d]", (i+1), (j+1)); + Ft8006m_GetPrivateProfileString("INVALID_NODES", strTemp, "1", str, strIniFile); + if (ft8006m_atoi(str) == 0) { + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 0; + } else if (ft8006m_atoi(str) == 2) { + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 2; + } else + ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 1; + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_RawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if ((ft8006m_g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8716 >> 4) || (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8736 >> 4) || (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 == IC_FTE716 >> 4)) { + return; + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "10000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + + } + } + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "7000", str, strIniFile); + MinValue = ft8006m_atoi(str); + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + } + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Max", "15000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][j] = MaxValue; + } + } + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Low_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Min", "3000", str, strIniFile); + MinValue = ft8006m_atoi(str); + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][j] = MinValue; + } + } + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Low_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Max", "15000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][j] = MaxValue; + } + } + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Min", "3000", str, strIniFile); + MinValue = ft8006m_atoi(str); + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][j] = MinValue; + } + } + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_High_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_High_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_PanelDifferTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + int index = 0; + int k = 0, i = 0, j = 0; + char str_tmp[128]; + + FTS_TEST_FUNC_ENTER(); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Max", "1000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Max_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Min", "150", str, strIniFile); + MinValue = ft8006m_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Min_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); + +} + + + +void Ft8006m_OnInit_DThreshold_RxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RxLinearityTest_Max", "50", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Rx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_TxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "TxLinearityTest_Max", "50", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < ft8006m_g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Tx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + FTS_TEST_DBG("%s\r", strTemp); + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < ft8006m_g_ScreenSetParam.iUsedMaxRxNum; j++) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_Incell_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + ft8006m_set_max_channel_num(); + + Ft8006m_OnInit_InvalidNode(strIniFile); + + Ft8006m_OnInit_DThreshold_RawDataTest(strIniFile); + Ft8006m_OnInit_DThreshold_CBTest(strIniFile); + Ft8006m_OnInit_DThreshold_AllButtonCBTest(strIniFile); + Ft8006m_OnThreshold_VkAndVaRawDataSeparateTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} + +void Ft8006m_OnInit_DThreshold_CBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + if (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8606 >> 4) { + return; + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, strIniFile); + MaxValue_Vkey = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = ft8006m_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, strIniFile); + MinValue_Vkey = ft8006m_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + + +void Ft8006m_OnInit_DThreshold_AllButtonCBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8606 >> 4) { + return; + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = ft8006m_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + + +void Ft8006m_OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + + FTS_TEST_FUNC_ENTER(); + + if ((ft8006m_g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8716 >> 4) && (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8736 >> 4) && (ft8006m_g_ScreenSetParam.iSelectedIC >> 4 != IC_FTE716 >> 4)) { + return; + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", str, strIniFile); + MaxValue = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max_VKey", "11000", str, strIniFile); + MaxValue_Vkey = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = ft8006m_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, strIniFile); + MinValue = ft8006m_atoi(str); + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min_VKey", "5000", str, strIniFile); + MinValue_Vkey = ft8006m_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = Ft8006m_GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(ft8006m_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + FTS_TEST_FUNC_EXIT(); +} + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_global.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_global.c new file mode 100755 index 0000000000000..3cf03de031621 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_global.c @@ -0,0 +1,498 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_global.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_ic_table.h" + +#define DEVIDE_MODE_ADDR 0x00 + +/*buff length*/ +#define BUFF_LEN_STORE_MSG_AREA 1024*10 +#define BUFF_LEN_MSG_AREA_LINE2 1024*4 +#define BUFF_LEN_STORE_DATA_AREA 1024*80 +#define BUFF_LEN_TMP_BUFFER 1024*16 + + +char *ft8006m_g_pTmpBuff = NULL; +char *ft8006m_g_pStoreMsgArea = NULL; +int ft8006m_g_lenStoreMsgArea = 0; +char *ft8006m_g_pMsgAreaLine2 = NULL; +int ft8006m_g_lenMsgAreaLine2 = 0; +char *ft8006m_g_pStoreDataArea = NULL; +int ft8006m_g_lenStoreDataArea = 0; +unsigned char ft8006m_m_ucTestItemCode = 0; +int ft8006m_m_iStartLine = 0; +int ft8006m_m_iTestDataCount = 0; + +char *Ft8006m_TestResult = NULL; +int Ft8006m_TestResultLen = 0; + +#define FTS_MALLOC_TYPE 1 +enum enum_malloc_mode { + kmalloc_mode = 0, + vmalloc_mode = 1, +}; + +struct StruScreenSeting ft8006m_g_ScreenSetParam; +struct stTestItem ft8006m_g_stTestItem[1][MAX_TEST_ITEM]; +struct structSCapConfEx ft8006m_g_stSCapConfEx; + +int ft8006m_g_TestItemNum = 0; +char ft8006m_g_strIcName[20] = {0}; +char *ft8006m_g_pStoreAllData = NULL; + +int Ft8006m_GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile) +{ + char value[512] = {0}; + int len = 0; + + if (NULL == returnValue) { + FTS_TEST_DBG("[FTS] returnValue==NULL in function %s.", __func__); + return 0; + } + + if (ft8006m_ini_get_key(IniFile, section, ItemName, value) < 0) { + if (NULL != defaultvalue) + memcpy(value, defaultvalue, strlen(defaultvalue)); + sprintf(returnValue, "%s", value); + return 0; + } else { + len = sprintf(returnValue, "%s", value); + } + + return len; +} + +void ft8006m_focal_msleep(int ms) +{ + msleep(ms); +} + +void Ft8006m_SysDelay(int ms) +{ + msleep(ms); +} + +int ft8006m_focal_abs(int value) +{ + if (value < 0) + value = 0 - value; + + return value; +} + +void *Ft8006m_fts_malloc(size_t size) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kmalloc(size, GFP_ATOMIC); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vmalloc(size); + } else { + FTS_TEST_DBG("invalid malloc. \n"); + return NULL; + } + + return NULL; +} + +void Ft8006m_fts_free(void *p) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kfree(p); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vfree(p); + } else { + FTS_TEST_DBG("invalid free. \n"); + return ; + } + + return ; +} + +void Ft8006m_OnInit_InterfaceCfg(char *strIniFile) +{ + char str[128] = {0}; + + FTS_TEST_FUNC_ENTER(); + + Ft8006m_GetPrivateProfileString("Interface", "IC_Type", "FT5X36", str, strIniFile); + ft8006m_g_ScreenSetParam.iSelectedIC = ft8006m_ic_table_get_ic_code_from_ic_name(str); + FTS_TEST_INFO(" IC code :0x%02x. ", ft8006m_g_ScreenSetParam.iSelectedIC); + + + Ft8006m_GetPrivateProfileString("Interface", "Normalize_Type", 0, str, strIniFile); + ft8006m_g_ScreenSetParam.isNormalize = ft8006m_atoi(str); + + FTS_TEST_FUNC_EXIT(); + +} +/************************************************************************ +* Name: Ft8006m_ReadReg(Same function name as FT_MultipleTest) +* Brief: Read Register +* Input: RegAddr +* Output: RegData +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int Ft8006m_ReadReg(unsigned char RegAddr, unsigned char *RegData) +{ + int iRet; + + if (NULL == ft8006m_i2c_read_test) { + FTS_TEST_DBG("[focal] %s ft8006m_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + iRet = ft8006m_i2c_read_test(&RegAddr, 1, RegData, 1); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} + +/************************************************************************ +* Name: Ft8006m_WriteReg(Same function name as FT_MultipleTest) +* Brief: Write Register +* Input: RegAddr, RegData +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int Ft8006m_WriteReg(unsigned char RegAddr, unsigned char RegData) +{ + int iRet; + unsigned char cmd[2] = {0}; + + if (NULL == ft8006m_i2c_write_test) { + FTS_TEST_DBG("[focal] %s ft8006m_i2c_write_test == NULL !!!", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + cmd[0] = RegAddr; + cmd[1] = RegData; + iRet = ft8006m_i2c_write_test(cmd, 2); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: Ft8006m_Comm_Base_IIC_IO(Same function name as FT_MultipleTest) +* Brief: Write/Read Data by IIC +* Input: pWriteBuffer, iBytesToWrite, iBytesToRead +* Output: pReadBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char Ft8006m_Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead) +{ + int iRet; + + if (NULL == ft8006m_i2c_read_test) { + FTS_TEST_DBG("[focal] %s ft8006m_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + if (iBytesToRead > 0) { + iRet = ft8006m_i2c_read_test(pWriteBuffer, iBytesToWrite, pReadBuffer, iBytesToRead); + } else { + iRet = ft8006m_i2c_write_test(pWriteBuffer, iBytesToWrite); + } + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: Ft8006m_EnterWork(Same function name as FT_MultipleTest) +* Brief: Enter Work Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char Ft8006m_EnterWork(void) +{ + unsigned char RunState = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = Ft8006m_WriteReg(DEVIDE_MODE_ADDR, 0); + if (ReCode == ERROR_CODE_OK) { + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } else + FTS_TEST_ERROR("Ft8006m_EnterWork read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("Ft8006m_EnterWork write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("Ft8006m_EnterWork read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} +/************************************************************************ +* Name: Ft8006m_EnterFactory +* Brief: enter Fcatory Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0 is OK, else fail. +***********************************************************************/ +unsigned char Ft8006m_EnterFactory(void) +{ + unsigned char RunState = 0; + int index = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = Ft8006m_WriteReg(DEVIDE_MODE_ADDR, 0x40); + if (ReCode == ERROR_CODE_OK) { + for (index = 0; index < 20; ++index) { + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + break; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } + Ft8006m_SysDelay(50); + } + if (ReCode != ERROR_CODE_OK) + FTS_TEST_ERROR("Ft8006m_EnterFactory read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("Ft8006m_EnterFactory write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("Ft8006m_EnterFactory read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + return ReCode; +} + +/************************************************************************ +* Name: ft8006m_SetTestItemCodeName +* Brief: set test item code and name +* Input: null +* Output: null +* Return: +**********************************************************************/ + +void ft8006m_SetTestItemCodeName(unsigned char ucitemcode) +{ + ft8006m_g_stTestItem[0][ft8006m_g_TestItemNum].ItemCode = ucitemcode; + + ft8006m_g_stTestItem[0][ft8006m_g_TestItemNum].TestNum = ft8006m_g_TestItemNum; + ft8006m_g_stTestItem[0][ft8006m_g_TestItemNum].TestResult = RESULT_NULL; + ft8006m_g_TestItemNum++; +} + +/************************************************************************ +* Name: Ft8006m_InitTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int Ft8006m_InitTest(void) +{ + int ret = 0; + ret = Ft8006m_AllocateMemory(); + if (ret < 0) + return -EPERM; + + Ft8006m_InitStoreParamOfTestData(); + + ft8006m_g_stSCapConfEx.ChannelXNum = 0; + ft8006m_g_stSCapConfEx.ChannelYNum = 0; + ft8006m_g_stSCapConfEx.KeyNum = 0; + ft8006m_g_stSCapConfEx.KeyNumTotal = 6; + + return 0; + +} + +/************************************************************************ +* Name: Ft8006m_FinishTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void Ft8006m_FinishTest(void) +{ + Ft8006m_MergeAllTestData(); + Ft8006m_FreeMemory(); +} + + +/************************************************************************ +* Name: Ft8006m_InitStoreParamOfTestData +* Brief: Init store param of test data +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void Ft8006m_InitStoreParamOfTestData(void) +{ + ft8006m_g_lenStoreMsgArea = 0; + + ft8006m_g_lenStoreMsgArea += sprintf(ft8006m_g_pStoreMsgArea, "ECC, 85, 170, IC Name, %s, IC Code, %x\n", ft8006m_g_strIcName, ft8006m_g_ScreenSetParam.iSelectedIC); + + + + ft8006m_g_lenMsgAreaLine2 = 0; + + + + ft8006m_g_lenStoreDataArea = 0; + ft8006m_m_iStartLine = 11; + + ft8006m_m_iTestDataCount = 0; +} +/************************************************************************ +* Name: Ft8006m_MergeAllTestData +* Brief: Merge All Data of test result +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void Ft8006m_MergeAllTestData(void) +{ + int iLen = 0; + + + iLen = sprintf(ft8006m_g_pTmpBuff, "TestItem, %d, ", ft8006m_m_iTestDataCount); + memcpy(ft8006m_g_pStoreMsgArea+ft8006m_g_lenStoreMsgArea, ft8006m_g_pTmpBuff, iLen); + ft8006m_g_lenStoreMsgArea += iLen; + + + memcpy(ft8006m_g_pStoreMsgArea+ft8006m_g_lenStoreMsgArea, ft8006m_g_pMsgAreaLine2, ft8006m_g_lenMsgAreaLine2); + ft8006m_g_lenStoreMsgArea += ft8006m_g_lenMsgAreaLine2; + + + iLen = sprintf(ft8006m_g_pTmpBuff, "\n\n\n\n\n\n\n\n\n"); + memcpy(ft8006m_g_pStoreMsgArea+ft8006m_g_lenStoreMsgArea, ft8006m_g_pTmpBuff, iLen); + ft8006m_g_lenStoreMsgArea += iLen; + + + memcpy(ft8006m_g_pStoreAllData, ft8006m_g_pStoreMsgArea, ft8006m_g_lenStoreMsgArea); + + + if (0 != ft8006m_g_lenStoreDataArea) { + memcpy(ft8006m_g_pStoreAllData+ft8006m_g_lenStoreMsgArea, ft8006m_g_pStoreDataArea, ft8006m_g_lenStoreDataArea); + } + + FTS_TEST_DBG("lenStoreMsgArea=%d, lenStoreDataArea = %d", ft8006m_g_lenStoreMsgArea, ft8006m_g_lenStoreDataArea); +} + + + +/************************************************************************ +* Name: Ft8006m_AllocateMemory +* Brief: Allocate pointer Memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int Ft8006m_AllocateMemory(void) +{ + + ft8006m_g_pStoreMsgArea = NULL; + if (NULL == ft8006m_g_pStoreMsgArea) + ft8006m_g_pStoreMsgArea = Ft8006m_fts_malloc(BUFF_LEN_STORE_MSG_AREA); + if (NULL == ft8006m_g_pStoreMsgArea) + goto ERR; + + ft8006m_g_pMsgAreaLine2 = NULL; + if (NULL == ft8006m_g_pMsgAreaLine2) + ft8006m_g_pMsgAreaLine2 = Ft8006m_fts_malloc(BUFF_LEN_MSG_AREA_LINE2); + if (NULL == ft8006m_g_pMsgAreaLine2) + goto ERR; + + ft8006m_g_pStoreDataArea = NULL; + if (NULL == ft8006m_g_pStoreDataArea) + ft8006m_g_pStoreDataArea = Ft8006m_fts_malloc(BUFF_LEN_STORE_DATA_AREA); + if (NULL == ft8006m_g_pStoreDataArea) + goto ERR; + + ft8006m_g_pTmpBuff = NULL; + if (NULL == ft8006m_g_pTmpBuff) + ft8006m_g_pTmpBuff = Ft8006m_fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == ft8006m_g_pTmpBuff) + goto ERR; + + Ft8006m_TestResult = NULL; + if (NULL == Ft8006m_TestResult) + Ft8006m_TestResult = Ft8006m_fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == Ft8006m_TestResult) + goto ERR; + + return 0; + +ERR: + FTS_TEST_ERROR("Ft8006m_fts_malloc memory failed in function."); + return -EPERM; + +} + +/************************************************************************ +* Name: Ft8006m_FreeMemory +* Brief: Release pointer memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void Ft8006m_FreeMemory(void) +{ + + if (NULL != ft8006m_g_pStoreMsgArea) + Ft8006m_fts_free(ft8006m_g_pStoreMsgArea); + + if (NULL != ft8006m_g_pMsgAreaLine2) + Ft8006m_fts_free(ft8006m_g_pMsgAreaLine2); + + if (NULL != ft8006m_g_pStoreDataArea) + Ft8006m_fts_free(ft8006m_g_pStoreDataArea); + + if (NULL != ft8006m_g_pTmpBuff) + Ft8006m_fts_free(ft8006m_g_pTmpBuff); +} diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_ini.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_ini.c new file mode 100755 index 0000000000000..5e60498f6b3c8 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_ini.c @@ -0,0 +1,433 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_main.h" + + +char FT8006M_CFG_SSL = '['; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char FT8006M_CFG_SSR = ']'; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char FT8006M_CFG_NIS = ':'; /* Separator between name and index */ +char FT8006M_CFG_NTS = '#'; /* annotator */ +char FT8006M_CFG_EQS = '='; /* The equal sign */ + + +ST_INI_FILE_DATA *ft8006m_g_st_ini_file_data = NULL; +int ft8006m_g_used_key_num = 0; + + +static int ini_file_get_line(char *filedata, char *buffer, int maxlen); +static long fts_atol(char *nptr); + + +/* Works only for digits and letters, but small and fast */ +#define TOLOWER(x) ((x) | 0x20) + +int ft8006m_strncmp(const char *cs, const char *ct, size_t count) +{ + unsigned char c1 = 0, c2 = 0; + + while (count) { + c1 = TOLOWER(*cs++); + c2 = TOLOWER(*ct++); + if (c1 != c2) + return c1 < c2 ? -1 : 1; + if (!c1) + break; + count--; + } + return 0; +} + +/************************************************************* +Function: Get the value of key +Input: char * filedata; char * section; char * key +Output: char * value¡¡key +Return: 0 SUCCESS + -1 can not find section + -2 can not find key + -10 File open failed + -12 File read failed + -14 File format error + -22 Out of buffer size +Note: +*************************************************************/ +int ft8006m_ini_get_key(char *filedata, char *section, char *key, char *value) +{ + int i = 0; + int ret = -2; + for (i = 0; i < ft8006m_g_used_key_num; i++) { + if (ft8006m_strncmp(section, ft8006m_g_st_ini_file_data[i].pSectionName, + ft8006m_g_st_ini_file_data[i].iSectionNameLen) != 0) + continue; + + if (strlen(key) == ft8006m_g_st_ini_file_data[i].iKeyNameLen) { + if (ft8006m_strncmp(key, ft8006m_g_st_ini_file_data[i].pKeyName, ft8006m_g_st_ini_file_data[i].iKeyNameLen) == 0) + + { + memcpy(value, ft8006m_g_st_ini_file_data[i].pKeyValue, ft8006m_g_st_ini_file_data[i].iKeyValueLen); + ret = 0; + break; + } + } + } + + return ret; +} + +/************************************************************* +Function: Remove empty character on the right side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ft8006m_ini_str_trim_r(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + for (i = 0; i < len; i++) { + if (buf[i] != ' ') + break; + } + if (i < len) { + strncpy(tmp, (buf+i), (len-i)); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Remove empty character on the left side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ft8006m_ini_str_trim_l(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + + for (i = 0; i < len; i++) { + if (buf[len-i-1] != ' ') + break; + } + if (i < len) { + strncpy(tmp, buf, len-i); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Read a line from file +Input: FILE *fp; int maxlen-- Maximum length of buffer +Output: char *buffer -- A string +Return: >0 Actual read length + -1 End of file + -2 Error reading file +Note: +*************************************************************/ +static int ini_file_get_line(char *filedata, char *buffer, int maxlen) +{ + int i = 0; + int j = 0; + int iRetNum = -1; + char ch1 = '\0'; + + for (i = 0, j = 0; i < maxlen; j++) { + ch1 = filedata[j]; + iRetNum = j+1; + if (ch1 == '\n' || ch1 == '\r') { + ch1 = filedata[j+1]; + if (ch1 == '\n' || ch1 == '\r') { + iRetNum++; + } + + break; + } else if (ch1 == 0x00) { + iRetNum = -1; + break; + } else { + buffer[i++] = ch1; /* ignore carriage return */ + } + } + buffer[i] = '\0'; + + return iRetNum; +} + +int my_ft8006m_atoi(const char *str) +{ + int result = 0; + int signal = 1; /* The default is positive number*/ + if ((*str >= '0' && *str <= '9') || *str == '-' || *str == '+') { + if (*str == '-' || *str == '+') { + if (*str == '-') + signal = -1; /*enter negative number*/ + str++; + } + } else + return 0; + /*start transform*/ + while (*str >= '0' && *str <= '9') + result = result*10 + (*str++ - '0'); + + return signal*result; +} + +int ft8006m_isspace(int x) +{ + if (x == ' ' || x == '\t' || x == '\n' || x == '\f' || x == '\b' || x == '\r') + return 1; + else + return 0; +} + +int ft8006m_isdigit(int x) +{ + if (x <= '9' && x >= '0') + return 1; + else + return 0; + +} + +static long fts_atol(char *nptr) +{ + int c; /* current char */ + long total; /* current total */ + int sign; /* if ''-'', then negative, otherwise positive */ + /* skip whitespace */ + while (ft8006m_isspace((int)(unsigned char)*nptr)) + ++nptr; + c = (int)(unsigned char)*nptr++; + sign = c; /* save sign indication */ + if (c == '-' || c == '+') + c = (int)(unsigned char)*nptr++; /* skip sign */ + total = 0; + while (ft8006m_isdigit(c)) { + total = 10 * total + (c - '0'); /* accumulate digit */ + c = (int)(unsigned char)*nptr++; /* get next char */ + } + if (sign == '-') + return -total; + else + return total; /* return result, negated if necessary */ +} + +int ft8006m_atoi(char *nptr) +{ + return (int)fts_atol(nptr); +} + +int ft8006m_init_key_data(void) +{ + int i = 0; + + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_used_key_num = 0; + + ft8006m_g_st_ini_file_data = NULL; + if (NULL == ft8006m_g_st_ini_file_data) + ft8006m_g_st_ini_file_data = Ft8006m_fts_malloc(sizeof(ST_INI_FILE_DATA)*MAX_KEY_NUM); + if (NULL == ft8006m_g_st_ini_file_data) { + FTS_TEST_ERROR("Ft8006m_fts_malloc failed in function."); + return -EPERM; + } + for (i = 0; i < MAX_KEY_NUM; i++) { + memset(ft8006m_g_st_ini_file_data[i].pSectionName, 0, MAX_KEY_NAME_LEN); + memset(ft8006m_g_st_ini_file_data[i].pKeyName, 0, MAX_KEY_NAME_LEN); + memset(ft8006m_g_st_ini_file_data[i].pKeyValue, 0, MAX_KEY_VALUE_LEN); + ft8006m_g_st_ini_file_data[i].iSectionNameLen = 0; + ft8006m_g_st_ini_file_data[i].iKeyNameLen = 0; + ft8006m_g_st_ini_file_data[i].iKeyValueLen = 0; + } + + FTS_TEST_FUNC_EXIT(); + return 1; +} + +int ft8006m_release_key_data(void) +{ + if (NULL != ft8006m_g_st_ini_file_data) + Ft8006m_fts_free(ft8006m_g_st_ini_file_data); + + return 0; +} +int ft8006m_print_key_data(void) +{ + int i = 0; + + + + FTS_TEST_DBG("ft8006m_g_used_key_num = %d", ft8006m_g_used_key_num); + for (i = 0; i < MAX_KEY_NUM; i++) { + + FTS_TEST_DBG("pSectionName_%d:%s, pKeyName_%d:%s\n,pKeyValue_%d:%s", + i, ft8006m_g_st_ini_file_data[i].pSectionName, + i, ft8006m_g_st_ini_file_data[i].pKeyName, + i, ft8006m_g_st_ini_file_data[i].pKeyValue + ); + + } + + return 1; +} +/************************************************************* +Function: Read all the parameters and values to the structure. +Return: Returns the number of key. If you go wrong, return a negative number. + -10 File open failed + -12 File read failed + -14 File format error +Note: +*************************************************************/ +int ft8006m_ini_get_key_data(char *filedata) +{ + + char buf1[MAX_CFG_BUF + 1] = {0}; + int n = 0; + int ret = 0; + int dataoff = 0; + int iEqualSign = 0; + int i = 0; + char tmpSectionName[MAX_CFG_BUF + 1] = {0}; + + + + FTS_TEST_FUNC_ENTER(); + + ret = ft8006m_init_key_data();/*init*/ + if (ret < 0) { + return -EPERM; + } + + ft8006m_g_used_key_num = 0; + while (1) { /*find section */ + ret = CFG_ERR_READ_FILE; + n = ini_file_get_line(filedata+dataoff, buf1, MAX_CFG_BUF); + + if (n < -1) + goto cfg_scts_end; + if (n < 0) + break;/* file end */ + if (n >= MAX_CFG_BUF) { + FTS_TEST_ERROR("Error Length:%d\n", n); + goto cfg_scts_end; + } + + dataoff += n; + + n = strlen(ft8006m_ini_str_trim_l(ft8006m_ini_str_trim_r(buf1))); + if (n == 0 || buf1[0] == FT8006M_CFG_NTS) + continue; /* A blank line or a comment line */ + ret = CFG_ERR_FILE_FORMAT; + + if (n > 2 && ((buf1[0] == FT8006M_CFG_SSL && buf1[n-1] != FT8006M_CFG_SSR))) { + FTS_TEST_ERROR("Bad Section:%s\n", buf1); + goto cfg_scts_end; + } + + + if (buf1[0] == FT8006M_CFG_SSL) { + ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iSectionNameLen = n-2; + if (MAX_KEY_NAME_LEN < ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iSectionNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + + buf1[n-1] = 0x00; + strcpy((char *)tmpSectionName, buf1+1); + + + continue; + } + + + strcpy(ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].pSectionName, tmpSectionName); + ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iSectionNameLen = strlen(tmpSectionName); + + iEqualSign = 0; + for (i = 0; i < n; i++) { + if (buf1[i] == FT8006M_CFG_EQS) { + iEqualSign = i; + break; + } + } + if (0 == iEqualSign) + continue; + /* before equal sign is assigned to the key name*/ + ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyNameLen = iEqualSign; + if (MAX_KEY_NAME_LEN < ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].pKeyName, + buf1, ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyNameLen); + + /* After equal sign is assigned to the key value*/ + ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyValueLen = n-iEqualSign-1; + if (MAX_KEY_VALUE_LEN < ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyValueLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_VALUE_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].pKeyValue, + buf1 + iEqualSign+1, ft8006m_g_st_ini_file_data[ft8006m_g_used_key_num].iKeyValueLen); + + + ret = ft8006m_g_used_key_num; + + ft8006m_g_used_key_num++; /*Parameter number accumulation*/ + if (MAX_KEY_NUM < ft8006m_g_used_key_num) { + ret = CFG_ERR_TOO_MANY_KEY_NUM; + FTS_TEST_ERROR("MAX_KEY_NUM: CFG_ERR_TOO_MANY_KEY_NUM\n"); + goto cfg_scts_end; + } + } + + + + FTS_TEST_FUNC_EXIT(); + + return 0; + +cfg_scts_end: + + FTS_TEST_FUNC_EXIT(); + return ret; +} + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_main.c b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_main.c new file mode 100755 index 0000000000000..33c95453123ed --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/src/focaltech_test_main.c @@ -0,0 +1,253 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#include +#include +#include +#include + +#include "../../focaltech_core.h" +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_ic_table.h" + + +#define FTS_TEST_STORE_DATA_SIZE 80*1024 + + + +FTS_I2C_READ_FUNCTION ft8006m_i2c_read_test; +FTS_I2C_WRITE_FUNCTION ft8006m_i2c_write_test; + +char *ft8006m_g_testparamstring = NULL; + +struct StTestFuncs ft8006m_g_stTestFuncs; + + +int ft8006m_init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read) +{ + unsigned char value = 0; + unsigned char recode = 0; + + FTS_TEST_FUNC_ENTER(); + + ft8006m_i2c_read_test = fpI2C_Read; + if (NULL == ft8006m_i2c_read_test) { + FTS_TEST_DBG("[focal] %s ft8006m_i2c_read_test == NULL ", __func__); + } + + + recode = Ft8006m_ReadReg(0xa6, &value); + if (recode != ERROR_CODE_OK) { + FTS_TEST_ERROR("[focal] Ft8006m_ReadReg Error, code: %d ", recode); + } else { + FTS_TEST_DBG("[focal] Ft8006m_ReadReg successed, Addr: 0xa6, value: 0x%02x ", value); + } + + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +int ft8006m_init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_i2c_write_test = fpI2C_Write; + if (NULL == ft8006m_i2c_write_test) { + FTS_TEST_ERROR("[focal] ft8006m_i2c_read_test == NULL "); + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + + +/************************************************************************ +* Name: ft8006m_set_param_data +* Brief: load Config. Set IC series, init test items, init basic threshold, int detailThreshold, and set order of test items +* Input: TestParamData, from ini file. +* Output: none +* Return: 0. No sense, just according to the old format. +***********************************************************************/ +int ft8006m_set_param_data(char *TestParamData) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + ft8006m_g_testparamstring = TestParamData; + ret = ft8006m_ini_get_key_data(ft8006m_g_testparamstring); + if (ret < 0) { + FTS_TEST_ERROR("ft8006m_ini_get_key_data error."); + return ret; + } + + + + Ft8006m_OnInit_InterfaceCfg(ft8006m_g_testparamstring); + + /*Get IC Name*/ + ft8006m_ic_table_get_ic_name_from_ic_code(ft8006m_g_ScreenSetParam.iSelectedIC, ft8006m_g_strIcName); + + + + if (ft8006m_g_stTestFuncs.OnInit_TestItem) { + ft8006m_g_stTestFuncs.OnInit_TestItem(ft8006m_g_testparamstring); + + } + + if (ft8006m_g_stTestFuncs.OnInit_BasicThreshold) { + ft8006m_g_stTestFuncs.OnInit_BasicThreshold(ft8006m_g_testparamstring); + + + } + + if (IC_Capacitance_Type == Self_Capacitance) { + Ft8006m_OnInit_SCap_DetailThreshold(ft8006m_g_testparamstring); + } else if (IC_Capacitance_Type == Mutual_Capacitance) { + Ft8006m_OnInit_MCap_DetailThreshold(ft8006m_g_testparamstring); + } else if (IC_Capacitance_Type == IDC_Capacitance) { + Ft8006m_OnInit_Incell_DetailThreshold(ft8006m_g_testparamstring); + } + + if (ft8006m_g_stTestFuncs.SetTestItem) { + + ft8006m_g_stTestFuncs.SetTestItem(); + + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: ft8006m_start_test_tp +* Brief: Test entry. Select test items based on IC series +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ + +boolean ft8006m_start_test_tp(void) +{ + boolean bFt8006m_TestResult = false; + + FTS_TEST_FUNC_ENTER(); + FTS_TEST_DBG("IC_%s Test", ft8006m_g_strIcName); + + if (ft8006m_g_stTestFuncs.Start_Test) { + + bFt8006m_TestResult = ft8006m_g_stTestFuncs.Start_Test(); + + } else { + FTS_TEST_DBG("[Focal]Start_Test func null!\n"); + bFt8006m_TestResult = false; + } + + Ft8006m_EnterWork(); + + FTS_TEST_FUNC_EXIT(); + + return bFt8006m_TestResult; +} +/************************************************************************ +* Name: m_get_test_data +* Brief: Get test data based on IC series +* Input: none +* Output: pTestData, External application for memory, buff size >= 1024*8 +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int m_get_test_data(char *pTestData) +{ + int iLen = 0; + FTS_TEST_DBG("[focal] %s start ", __func__); + + + if (ft8006m_g_stTestFuncs.Get_test_data) { + + iLen = ft8006m_g_stTestFuncs.Get_test_data(pTestData); + + } else { + FTS_TEST_DBG("[Focal]Get_test_data func null!\n"); + } + + FTS_TEST_FUNC_EXIT(); + return iLen; +} + +int ft8006m_focaltech_test_main_init(void) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + + /*Allocate memory, storage test results*/ + ft8006m_g_pStoreAllData = NULL; + if (NULL == ft8006m_g_pStoreAllData) + ft8006m_g_pStoreAllData = Ft8006m_fts_malloc(FTS_TEST_STORE_DATA_SIZE); + if (NULL == ft8006m_g_pStoreAllData) + return -EPERM; + + /* Allocate memory, assigned to detail threshold structure*/ + ret = ft8006m_malloc_struct_DetailThreshold(); + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} +/************************************************************************ +* Name: free_test_param_data +* Brief: release printer memory +* Input: none +* Output: none +* Return: none. +***********************************************************************/ +int ft8006m_focaltech_test_main_exit(void) +{ + + FTS_TEST_DBG("[focal] release memory -start."); + + Ft8006m_TestResultLen = 0; + + + /* Release memory test results */ + if (NULL != ft8006m_g_pStoreAllData) { + FTS_TEST_DBG("[FTS] release memory ft8006m_g_pStoreAllData."); + Ft8006m_fts_free(ft8006m_g_pStoreAllData); + ft8006m_g_pStoreAllData = NULL; + } + + + if (NULL != Ft8006m_TestResult) { + FTS_TEST_DBG(" release memory Ft8006m_TestResult."); + Ft8006m_fts_free(Ft8006m_TestResult); + Ft8006m_TestResult = NULL; + } + + + /* Releasing the memory of the detailed threshold structure */ + FTS_TEST_DBG("[FTS] release memory ft8006m_free_struct_DetailThreshold."); + ft8006m_free_struct_DetailThreshold(); + + /* release memory of key data for ini file */ + ft8006m_release_key_data(); + FTS_TEST_DBG("[focal] release memory -end."); + return 0; +} + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/Makefile b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/Makefile new file mode 100755 index 0000000000000..b35796681d5f1 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/Makefile @@ -0,0 +1,9 @@ +#drivers/input/touchscreen/focaltech_ts/focaltech_test +# +# Makefile for test module +# +# Linux driver folder +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_ft8006.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_config_ft8006.o +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += focaltech_test_supported_ic.o + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_config_ft8006.c b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_config_ft8006.c new file mode 100644 index 0000000000000..6459af8f99d24 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_config_ft8006.c @@ -0,0 +1,430 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: Focaltech_test_config_ft8006.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Config for FT8006 +* +************************************************************************/ +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + +#if (FTS_CHIP_TEST_TYPE == FT8006_TEST) + + +struct stCfg_FT8006_TestItem g_stCfg_FT8006_TestItem; +struct stCfg_FT8006_BasicThreshold g_stCfg_FT8006_BasicThreshold; + +void OnInit_FT8006_TestItem(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + + Ft8006m_GetPrivateProfileString("TestItem", "FW_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.FW_VERSION_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "FACTORY_ID_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.FACTORY_ID_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "PROJECT_CODE_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.PROJECT_CODE_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "IC_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.IC_VERSION_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "RAWDATA_TEST", "1", str, strIniFile); + g_stCfg_FT8006_TestItem.RAWDATA_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "CHANNEL_NUM_TEST", "1", str, strIniFile); + g_stCfg_FT8006_TestItem.CHANNEL_NUM_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "INT_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.INT_PIN_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "RESET_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.RESET_PIN_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.NOISE_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "CB_TEST", "1", str, strIniFile); + g_stCfg_FT8006_TestItem.CB_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "SHORT_CIRCUIT_TEST", "1", str, strIniFile); + g_stCfg_FT8006_TestItem.SHORT_CIRCUIT_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "LCD_NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.LCD_NOISE_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "OSC60MHZ_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.OSC60MHZ_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "OSCTRM_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.OSCTRM_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "SNR_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.SNR_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "DIFFER_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.DIFFER_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "DIFFER_UNIFORMITY_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.DIFFER_UNIFORMITY_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "LPWG_RAWDATA_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.LPWG_RAWDATA_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "LPWG_CB_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.LPWG_CB_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "LPWG_NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.LPWG_NOISE_TEST = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("TestItem", "DIFFER2_TEST", "0", str, strIniFile); + g_stCfg_FT8006_TestItem.DIFFER2_TEST = ft8006m_atoi(str); + + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_FT8006_BasicThreshold(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "FW_VER_VALUE", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.FW_VER_VALUE = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "Factory_ID_Number", "255", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.Factory_ID_Number = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "Project_Code", " ", str, strIniFile); + sprintf(g_stCfg_FT8006_BasicThreshold.Project_Code, "%s", str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "IC_Version", "3", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.IC_Version = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.RawDataTest_Min = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.RawDataTest_Max = ft8006m_atoi(str); + + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelXNum = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelYNum = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_KeyNum", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.ChannelNumTest_KeyNum = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ResetPinTest_RegAddr", "136", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.ResetPinTest_RegAddr = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "IntPinTest_RegAddr", "175", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.IntPinTest_RegAddr = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_Coefficient", "50", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_Coefficient = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_Frames", "32", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_Frames = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_Time", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_Time = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_SampeMode", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_SampeMode = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_NoiseMode", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_NoiseMode = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_ShowTip", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.NoiseTest_ShowTip = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "NoiseTest_IsDiffer", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.IsDifferMode = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_VA_Check", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.bCBTest_VA_Check = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.CbTest_Min = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.CbTest_Max = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_VKey_Check", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.bCBTest_VKey_Check = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.CbTest_Min_Vkey = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.CbTest_Max_Vkey = ft8006m_atoi(str); + + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "ShortCircuit_ResMin", "200", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.ShortCircuit_ResMin = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Frame", "50", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.iLCDNoiseTestFrame = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Max_Screen", "32", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.iLCDNoiseTestMaxScreen = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Max_Frame", "32", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.iLCDNoiseTestMaxFrame = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LCD_NoiseTest_Coefficient", "50", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.iLCDNoiseCoefficient = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSC60MHZTest_OSCMin", "12", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSC60MHZTest_OSCMin = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSC60MHZTest_OSCMax", "17", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSC60MHZTest_OSCMax = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSCTRMTest_OSCMin", "15", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSCTRMTest_OSCMin = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSCTRMTest_OSCMax", "17", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSCTRMTest_OSCMax = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSCTRMTest_OSCDetMin", "15", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSCTRMTest_OSCDetMin = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "OSCTRMTest_OSCDetMax", "17", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.OSCTRMTest_OSCDetMax = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SNRTest_FrameNum", "32", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.SNRTest_FrameNum = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "SNRTest_Min", "10", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.SNRTest_Min = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DIFFERTest_Frame_Num", "32", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DIFFERTest_FrameNum = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DIFFERTest_Differ_Max", "100", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DIFFERTest_DifferMax = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DIFFERTest_Differ_Min", "10", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DIFFERTest_DifferMin = ft8006m_atoi(str); + + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_CHX", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_Check_CHX = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_CHY", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_Check_CHY = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_MinMax", "0", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_Check_MinMax = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_CHX_Hole", "20", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_CHX_Hole = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_CHY_Hole", "20", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_CHY_Hole = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_MinMax_Hole", "70", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.DifferUniformityTest_MinMax_Hole = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_RawDataTest_Min", "5000", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_RawDataTest_Min = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_RawDataTest_Max", "11000", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_RawDataTest_Max = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_VA_Check", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.bLPWG_CBTest_VA_Check = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_Min", "3", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_CbTest_Min = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_Max", "60", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_CbTest_Max = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_VKey_Check", "1", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.bLPWG_CBTest_VKey_Check = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_Min_Vkey", "3", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_CbTest_Min_Vkey = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_CBTest_Max_Vkey", "100", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_CbTest_Max_Vkey = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_NoiseTest_Coefficient", "50", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_NoiseTest_Coefficient = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "LPWG_NoiseTest_Frames", "50", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.LPWG_NoiseTest_Frames = ft8006m_atoi(str); + + + Ft8006m_GetPrivateProfileString("Basic_Threshold", "Differ2Test_Min", "1500", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.Differ2Test_Min = ft8006m_atoi(str); + Ft8006m_GetPrivateProfileString("Basic_Threshold", "Differ2Test_Max", "2000", str, strIniFile); + g_stCfg_FT8006_BasicThreshold.Differ2Test_Max = ft8006m_atoi(str); + + + + + FTS_TEST_FUNC_EXIT(); + +} +void SetTestItem_FT8006(void) +{ + ft8006m_g_TestItemNum = 0; + + FTS_TEST_FUNC_ENTER(); + + + if (g_stCfg_FT8006_TestItem.FACTORY_ID_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_FACTORY_ID_TEST); + } + + + if (g_stCfg_FT8006_TestItem.PROJECT_CODE_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_PROJECT_CODE_TEST); + } + + + if (g_stCfg_FT8006_TestItem.FW_VERSION_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_FW_VERSION_TEST); + } + + + if (g_stCfg_FT8006_TestItem.IC_VERSION_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_IC_VERSION_TEST); + } + + + ft8006m_SetTestItemCodeName(Code_FT8006_ENTER_FACTORY_MODE); + + + if (g_stCfg_FT8006_TestItem.CHANNEL_NUM_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_CHANNEL_NUM_TEST); + } + + + if (g_stCfg_FT8006_TestItem.SHORT_CIRCUIT_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_SHORT_CIRCUIT_TEST) ; + } + + + if (g_stCfg_FT8006_TestItem.OSC60MHZ_TEST == 1) { + + ft8006m_SetTestItemCodeName(Code_FT8006_OSC60MHZ_TEST); + } + + + if (g_stCfg_FT8006_TestItem.OSCTRM_TEST == 1) { + + ft8006m_SetTestItemCodeName(Code_FT8006_OSCTRM_TEST); + } + + + if (g_stCfg_FT8006_TestItem.DIFFER2_TEST == 1) { + + ft8006m_SetTestItemCodeName(Code_FT8006_DIFFER2_TEST); + } + + + if (g_stCfg_FT8006_TestItem.CB_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_CB_TEST); + } + + + if (g_stCfg_FT8006_TestItem.NOISE_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_NOISE_TEST); + } + + + if (g_stCfg_FT8006_TestItem.LCD_NOISE_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_LCD_NOISE_TEST); + } + + + if (g_stCfg_FT8006_TestItem.RAWDATA_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_RAWDATA_TEST); + } + + + if (g_stCfg_FT8006_TestItem.SNR_TEST == 1) { + + ft8006m_SetTestItemCodeName(Code_FT8006_SNR_TEST); + } + + + + if (g_stCfg_FT8006_TestItem.DIFFER_TEST == 1) { + + ft8006m_SetTestItemCodeName(Code_FT8006_DIFFER_TEST); + } + + + + if (g_stCfg_FT8006_TestItem.DIFFER_UNIFORMITY_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_DIFFER_UNIFORMITY_TEST); + } + + + if (g_stCfg_FT8006_TestItem.RESET_PIN_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_RESET_PIN_TEST); + } + + + if (g_stCfg_FT8006_TestItem.INT_PIN_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_RESET_PIN_TEST); + } + + + if (g_stCfg_FT8006_TestItem.RESET_PIN_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_INT_PIN_TEST); + } + + + if (g_stCfg_FT8006_TestItem.LPWG_CB_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_LPWG_CB_TEST); + } + + + if (g_stCfg_FT8006_TestItem.LPWG_NOISE_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_LPWG_NOISE_TEST); + } + + + if (g_stCfg_FT8006_TestItem.LPWG_RAWDATA_TEST == 1) { + ft8006m_SetTestItemCodeName(Code_FT8006_LPWG_RAWDATA_TEST); + } + + + + FTS_TEST_FUNC_EXIT(); + +} + +#endif + diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_ft8006.c b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_ft8006.c new file mode 100644 index 0000000000000..f3ae146f96247 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_ft8006.c @@ -0,0 +1,2101 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R),All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ft8006.c +* +* Author: Software Development +* +* Created: 2016-08-01 +* +* Abstract: test item for FT8006 +* +************************************************************************/ + +/******************************************************************************* +* Included header files +*******************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" +#include "../../focaltech_core.h" + +/******************************************************************************* +* Private constant and macro definitions using #define +*******************************************************************************/ +#if (FTS_CHIP_TEST_TYPE == FT8006_TEST) + + +#define DEVIDE_MODE_ADDR 0x00 +#define REG_LINE_NUM 0x01 +#define REG_TX_NUM 0x02 +#define REG_RX_NUM 0x03 +#define FT8006_LEFT_KEY_REG 0X1E +#define FT8006_RIGHT_KEY_REG 0X1F + +#define REG_CbAddrH 0x18 +#define REG_CbAddrL 0x19 +#define REG_OrderAddrH 0x1A +#define REG_OrderAddrL 0x1B + +#define REG_RawBuf0 0x6A +#define REG_RawBuf1 0x6B +#define REG_OrderBuf0 0x6C +#define REG_CbBuf0 0x6E + +#define REG_K1Delay 0x31 +#define REG_K2Delay 0x32 +#define REG_SCChannelCf 0x34 + +#define REG_FACTORYID 0xA8 + +#define pre 1 +#define REG_CLB 0x04 + +#define DOUBLE_TX_NUM_MAX 160 +#define DOUBLE_RX_NUM_MAX 160 + +#define REG_8006_LCD_NOISE_FRAME 0X12 +#define REG_8006_LCD_NOISE_START 0X11 +#define REG_8006_LCD_NOISE_NUMBER 0X13 + + + +/******************************************************************************* +* Private enumerations, structures and unions using typedef +*******************************************************************************/ + +enum NOISE_TYPE { + NT_AvgData = 0, + NT_MaxData = 1, + NT_MaxDevication = 2, + NT_DifferData = 3, +}; + +enum CS_TYPE { + CS_TWO_SINGLE_MASTER = 1, + CS_TWO_SINGLE_SLAVE = 0, + CS_SINGLE_CHIP = 3, +}; +enum CS_DIRECTION { + CS_LEFT_RIGHT = 0x00, + CS_UP_DOWN = 0x40, +}; +enum CD_S0_ROLE { + CS_S0_AS_MASTER = 0x00, + CS_S0_AS_SLAVE = 0x80, +}; + +struct CSInfoPacket { + enum CS_TYPE csType; + enum CS_DIRECTION csDirection; + enum CD_S0_ROLE csS0Role; + BYTE csMasterAddr; + BYTE csSalveAddr; + BYTE csMarterTx; + BYTE csMasterRx; + BYTE csSlaveTx; + BYTE csSlaveRx; +}; + +struct FT8006 { + struct CSInfoPacket *m_csInfo; + unsigned char m_currentSlaveAddr; + +}; + +struct CSChipAddrMgr { + struct FT8006 *m_parent; + BYTE m_slaveAddr; +}; + + + +/******************************************************************************* +* Static variables +*******************************************************************************/ + +static int m_RawData[TX_NUM_MAX][RX_NUM_MAX] = {{0, 0} } ; +static int m_CBData[TX_NUM_MAX][RX_NUM_MAX] = {{0, 0} } ; +static BYTE m_ucTempData[TX_NUM_MAX * RX_NUM_MAX*2] = {0}; +static int m_iTempRawData[TX_NUM_MAX * RX_NUM_MAX] = {0}; + +static int bufferMaster[TX_NUM_MAX * RX_NUM_MAX] = {0}; +static int bufferSlave[TX_NUM_MAX * RX_NUM_MAX] = {0}; +static int bufferCated[DOUBLE_TX_NUM_MAX * DOUBLE_RX_NUM_MAX] = {0}; +static int iAdcData[TX_NUM_MAX * RX_NUM_MAX] = {0}; +static unsigned char pReadBuffer[80 * 80 * 2] = {0}; +static int shortRes[TX_NUM_MAX][RX_NUM_MAX] = { {0} }; +static unsigned char ScreenNoiseData[TX_NUM_MAX*RX_NUM_MAX*2] = {0}; +static int LCD_Noise[TX_NUM_MAX][RX_NUM_MAX] = {{0, 0} } ; + + + +/******************************************************************************* +* Global variable or extern global variabls/functions +*******************************************************************************/ +extern struct stCfg_FT8006_BasicThreshold g_stCfg_FT8006_BasicThreshold; + + +/******************************************************************************* +* Static function prototypes +*******************************************************************************/ + + +static int StartScan(void); +static unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer); +static unsigned char GetPanelRows(unsigned char *pPanelRows); +static unsigned char GetPanelCols(unsigned char *pPanelCols); +static unsigned char GetTxRxCB(unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer); +static unsigned char GetRawData(struct FT8006 *g_FT8006); +static unsigned char GetChannelNum(void); +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount); +static unsigned char ChipClb(unsigned char *pClbResult); +void CatSingleToOneScreen(struct FT8006 *g_FT8006); +void ReleaseCSInfo(struct FT8006 *g_FT8006); +unsigned char FT8006_EnterFactory(struct FT8006 *g_FT8006); +unsigned char FT8006_ChipClb(struct FT8006 *g_FT8006, unsigned char *pClbResult); +static unsigned char FT8006_GetTxRxCB(struct FT8006 *g_FT8006, unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer); +unsigned char FT8006_WeakShort_GetAdcData(struct FT8006 *g_FT8006, int AllAdcDataLen, int *pRevBuffer); +unsigned char ReadBytesByKey(BYTE key, int ByteNum, unsigned char *byteData); +unsigned char FT8006_EnterWork(struct FT8006 *g_FT8006); +int HY_SetSlaveAddr(struct FT8006 *g_FT8006, BYTE SlaveAddr); +unsigned char FT8006_WriteReg(struct FT8006 *g_FT8006, unsigned char RegAddr, unsigned char RegData); +bool ChipHasTwoHeart(struct FT8006 *g_FT8006); +unsigned char FT8006_StartScan(struct FT8006 *g_FT8006); +unsigned char FT8006_ReadRawData(struct FT8006 *g_FT8006, unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer); +unsigned char WeakShort_StartAdcScan(void); +unsigned char WeakShort_GetScanResult(void); +unsigned char WeakShort_GetAdcResult(int AllAdcDataLen, int *pRevBuffer); +static unsigned char WeakShort_GetAdcData(int AllAdcDataLen, int *pRevBuffer); +void InitCurrentAddress(struct FT8006 *g_FT8006); +void CSInfoPacket(struct CSInfoPacket *cspt); + + + + +boolean FT8006_StartTest(void); +int FT8006M_get_test_data(char *pTestData); + +unsigned char FT8006_TestItem_EnterFactoryMode(struct FT8006 *g_FT8006); +unsigned char FT8006_TestItem_RawDataTest(struct FT8006 *g_FT8006, bool *bTestResult); +unsigned char FT8006_TestItem_CbTest(struct FT8006 *g_FT8006, bool *bTestResult); +unsigned char FT8006_TestItem_ShortCircuitTest(struct FT8006 *g_FT8006, bool *bTestResult); +unsigned char FT8006_TestItem_LCDNoiseTest(struct FT8006 *g_FT8006, bool *bTestResult); +unsigned char FT8006_TestItem_ChannelsTest(struct FT8006 *g_FT8006, bool *bTestResult); +unsigned char FT8006_CheckItem_FactoryIdTest(struct FT8006 *g_FT8006, bool *bTestResult); +/************************************************************************ +* Name: FT8006_StartTest +* Brief: Test entry. Determine which test item to test +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ + +boolean FT8006_StartTest() +{ + bool bTestResult = true, bTempResult = 1; + unsigned char ReCode; + unsigned char ucDevice = 0; + int iItemCount = 0; + + struct FT8006 g_FT8006; + struct CSInfoPacket cspt; + + + + CSInfoPacket(&cspt); + InitCurrentAddress(&g_FT8006); + g_FT8006.m_csInfo = &cspt; + + + + if (Ft8006m_InitTest() < 0) { + FTS_TEST_ERROR("[focal] Failed to init test."); + return false; + } + + + if (0 == ft8006m_g_TestItemNum) + bTestResult = false; + + + for (iItemCount = 0; iItemCount < ft8006m_g_TestItemNum; iItemCount++) { + ft8006m_m_ucTestItemCode = ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode; + + + if (Code_FT8006_ENTER_FACTORY_MODE == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8006_TestItem_EnterFactoryMode(&g_FT8006); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + break; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8006_RAWDATA_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8006_TestItem_RawDataTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8006_CB_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8006_TestItem_CbTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8006_CHANNEL_NUM_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode) { + ReCode = FT8006_TestItem_ChannelsTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + break; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + + } + + + if (Code_FT8006_SHORT_CIRCUIT_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8006_TestItem_ShortCircuitTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8006_LCD_NOISE_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8006_TestItem_LCDNoiseTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8006_FACTORY_ID_TEST == ft8006m_g_stTestItem[ucDevice][iItemCount].ItemCode) { + ReCode = FT8006_CheckItem_FactoryIdTest(&g_FT8006, &bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + ft8006m_g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + } + + + Ft8006m_FinishTest(); + + + return bTestResult; + +} + + +/************************************************************************ +* Name: +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +void InitCurrentAddress(struct FT8006 *g_FT8006) +{ + g_FT8006->m_currentSlaveAddr = 0x70; +} +struct CSInfoPacket *GetCSInfo(struct FT8006 *g_FT8006) +{ + return g_FT8006->m_csInfo; +} +unsigned char GetCurrentAddr(struct FT8006 *g_FT8006) +{ + return g_FT8006->m_currentSlaveAddr; +} +int GetCSType(struct CSInfoPacket *cspt) +{ + return cspt->csType; +} +int GetCSDirection(struct CSInfoPacket *cspt) +{ + return cspt->csDirection; +} +int GetS0Role(struct CSInfoPacket *cspt) +{ + return cspt->csS0Role; +} +void SetMasterAddr(struct CSInfoPacket *cspt, BYTE master) +{ + cspt->csMasterAddr = master; +} +BYTE GetMasterAddr(struct CSInfoPacket *cspt) +{ + return cspt->csMasterAddr; +} +void SetSlaveAddr(struct CSInfoPacket *cspt, BYTE slave) +{ + cspt->csSalveAddr = slave; +} +BYTE GetSlaveAddr(struct CSInfoPacket *cspt) +{ + return cspt->csSalveAddr; +} +void SetMasterTx(struct CSInfoPacket *cspt, BYTE tx) +{ + cspt->csMarterTx = tx; +} +BYTE GetMasterTx(struct CSInfoPacket *cspt) +{ + return cspt->csMarterTx; +} +void SetMasterRx(struct CSInfoPacket *cspt, BYTE rx) +{ + cspt->csMasterRx = rx; +} +BYTE GetMasterRx(struct CSInfoPacket *cspt) +{ + return cspt->csMasterRx; +} +void SetSlaveTx(struct CSInfoPacket *cspt, BYTE tx) +{ + cspt->csSlaveTx = tx; +} +BYTE GetSlaveTx(struct CSInfoPacket *cspt) +{ + return cspt->csSlaveTx; +} +void SetSlaveRx(struct CSInfoPacket *cspt, BYTE rx) +{ + cspt->csSlaveRx = rx; +} +BYTE GetSlaveRx(struct CSInfoPacket *cspt) +{ + return cspt->csSlaveRx; +} +void Initialize(struct CSInfoPacket *cspt, BYTE bRegCfg) +{ + cspt->csType = (enum CS_TYPE)(bRegCfg & 0x3F); + cspt->csDirection = (enum CS_DIRECTION)(bRegCfg & 0x40); + cspt->csS0Role = (enum CD_S0_ROLE)(bRegCfg & 0x80); + cspt->csMasterAddr = 0x70; + cspt->csSalveAddr = 0x72; + cspt->csMarterTx = 0; + cspt->csMasterRx = 0; + cspt->csSlaveTx = 0; + cspt->csSlaveRx = 0; +} +void CSInfoPacket(struct CSInfoPacket *cspt) +{ + cspt->csType = CS_SINGLE_CHIP; + cspt->csDirection = CS_UP_DOWN; + cspt->csS0Role = CS_S0_AS_MASTER; + cspt->csMasterAddr = 0x72; + cspt->csSalveAddr = 0x70; + cspt->csMarterTx = 0; + cspt->csMasterRx = 0; + cspt->csSlaveTx = 0; + cspt->csSlaveRx = 0; +} + + +void ReleaseCSInfo(struct FT8006 *g_FT8006) +{ + + memset(g_FT8006->m_csInfo, 0, sizeof(struct CSInfoPacket)); + +} + +void UpDateCSInfo(struct FT8006 *g_FT8006) +{ + unsigned char ReCode = ERROR_CODE_OK, RegValue = 0; + + ReCode = Ft8006m_ReadReg(0x26, &RegValue); + Initialize(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_ReadReg(0x50, &RegValue); + SetMasterTx(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_ReadReg(0x51, &RegValue); + SetMasterRx(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_ReadReg(0x52, &RegValue); + SetSlaveTx(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_ReadReg(0x53, &RegValue); + SetSlaveRx(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_WriteReg(0x17, 0); + ReCode = Ft8006m_ReadReg(0x81, &RegValue); + SetMasterAddr(g_FT8006->m_csInfo, RegValue); + + ReCode = Ft8006m_WriteReg(0x17, 12); + ReCode = Ft8006m_ReadReg(0x81, &RegValue); + SetSlaveAddr(g_FT8006->m_csInfo, RegValue); + + FTS_TEST_DBG("csType = %d, csDirection = %d, csS0Role = %d, csMasterAddr = 0x%x, csSalveAddr = 0x%x,\ + csMarterTx = %d, csMasterRx = %d, csSlaveTx = %d, csSlaveRx = %d.", + g_FT8006->m_csInfo->csType, + g_FT8006->m_csInfo->csDirection, + g_FT8006->m_csInfo->csS0Role, + g_FT8006->m_csInfo->csMasterAddr, + g_FT8006->m_csInfo->csSalveAddr, + g_FT8006->m_csInfo->csMarterTx, + g_FT8006->m_csInfo->csMasterRx, + g_FT8006->m_csInfo->csSlaveTx, + g_FT8006->m_csInfo->csSlaveRx + ); + +} + +bool ChipHasTwoHeart(struct FT8006 *g_FT8006) +{ + if (GetCSType(g_FT8006->m_csInfo) == CS_SINGLE_CHIP) + return false; + + return true; +} +void CSChipAddrMgr_Init(struct CSChipAddrMgr *pMgr, struct FT8006 *parent) +{ + + pMgr->m_parent = parent; + pMgr->m_slaveAddr = GetCurrentAddr(parent); + +} + +void CSChipAddrMgr_Exit(struct CSChipAddrMgr *pMgr) +{ + + if (pMgr->m_slaveAddr != GetCurrentAddr(pMgr->m_parent)) { + + HY_SetSlaveAddr(pMgr->m_parent, pMgr->m_slaveAddr); + } + + +} + +int HY_SetSlaveAddr(struct FT8006 *g_FT8006, BYTE SlaveAddr) +{ + unsigned char value = 0; + unsigned char ReCode = ERROR_CODE_OK; + int tmp = 0; + + g_FT8006->m_currentSlaveAddr = SlaveAddr; + tmp = ft8006m_i2c_client->addr; + + FTS_TEST_DBG("Original i2c addr 0x%x ", ft8006m_i2c_client->addr); + FTS_TEST_DBG("CurrentAddr 0x%x ", (SlaveAddr>>1)); + + if (ft8006m_i2c_client->addr != (SlaveAddr>>1)) { + ft8006m_i2c_client->addr = (SlaveAddr>>1); + FTS_TEST_DBG("Change i2c addr 0x%x to 0x%x", tmp, ft8006m_i2c_client->addr); + } + + + ReCode = Ft8006m_ReadReg(0x20, &value); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("[focal] Ft8006m_ReadReg Error, code: %d ", ReCode); + } else { + FTS_TEST_DBG("[focal] Ft8006m_ReadReg successed, Addr: 0x20, value: 0x%02x ", value); + } + + + return 0; +} + +void WorkAsMaster(struct CSChipAddrMgr *pMgr) +{ + struct CSInfoPacket *pcs = GetCSInfo(pMgr->m_parent); + + if (GetMasterAddr(pcs) != GetCurrentAddr(pMgr->m_parent)) { + HY_SetSlaveAddr(pMgr->m_parent, GetMasterAddr(pcs)); + } + +} + +void WorkAsSlave(struct CSChipAddrMgr *pMgr) +{ + struct CSInfoPacket *pcs = GetCSInfo(pMgr->m_parent); + + if (GetSlaveAddr(pcs) != GetCurrentAddr(pMgr->m_parent)) { + HY_SetSlaveAddr(pMgr->m_parent, GetSlaveAddr(pcs)); + } +} + +void CatSingleToOneScreen(struct FT8006 *g_FT8006) +{ + int leftChannelNum = 0, rightChannelNum = 0; + int upChannelNum = 0, downChannelNum = 0; + unsigned char splitRx = 0; + unsigned char splitTx = 0; + int iRow = 0, iCol = 0; + int iRelativeRx = 0; + int iRelativeTx = 0; + int iTotalRx = 0; + int iTotalTx = 0; + int *bufferLeft = NULL; + int *bufferRight = NULL; + int *bufferUp = NULL; + int *bufferDown = NULL; + + FTS_TEST_FUNC_ENTER(); + + + if (CS_SINGLE_CHIP == GetCSType(g_FT8006->m_csInfo)) + return; + + + if (CS_LEFT_RIGHT == GetCSDirection(g_FT8006->m_csInfo)) { + bufferLeft = Ft8006m_fts_malloc(TX_NUM_MAX * RX_NUM_MAX*sizeof(int)); + bufferRight = Ft8006m_fts_malloc(TX_NUM_MAX * RX_NUM_MAX*sizeof(int)); + + if (CS_S0_AS_MASTER == GetS0Role(g_FT8006->m_csInfo)) { + splitRx = GetMasterRx(g_FT8006->m_csInfo); + bufferLeft = bufferMaster; + bufferRight = bufferSlave; + leftChannelNum = GetMasterTx(g_FT8006->m_csInfo) * GetMasterRx(g_FT8006->m_csInfo); + rightChannelNum = GetSlaveTx(g_FT8006->m_csInfo) * GetSlaveRx(g_FT8006->m_csInfo); + } else { + splitRx = GetSlaveRx(g_FT8006->m_csInfo); + bufferLeft = bufferSlave; + bufferRight = bufferMaster; + leftChannelNum = GetSlaveTx(g_FT8006->m_csInfo) * GetSlaveRx(g_FT8006->m_csInfo); + rightChannelNum = GetMasterTx(g_FT8006->m_csInfo) * GetMasterRx(g_FT8006->m_csInfo); + } + + for (iRow = 0; iRow < GetMasterTx(g_FT8006->m_csInfo); ++iRow) { + for (iCol = 0; iCol < GetMasterRx(g_FT8006->m_csInfo) + GetSlaveRx(g_FT8006->m_csInfo); ++iCol) { + iRelativeRx = iCol - splitRx; + iTotalRx = GetMasterRx(g_FT8006->m_csInfo) + GetSlaveRx(g_FT8006->m_csInfo); + if (iCol >= splitRx) { + + bufferCated[iRow * iTotalRx + iCol] = bufferRight[iRow * (iTotalRx - splitRx) + iRelativeRx]; + } else { + + bufferCated[iRow * iTotalRx + iCol] = bufferLeft[iRow * splitRx + iCol]; + } + } + } + + memcpy(bufferCated + GetMasterTx(g_FT8006->m_csInfo) * (GetMasterRx(g_FT8006->m_csInfo) + GetSlaveRx(g_FT8006->m_csInfo)), bufferLeft + leftChannelNum, 6); + memcpy(bufferCated + GetMasterTx(g_FT8006->m_csInfo) * (GetMasterRx(g_FT8006->m_csInfo) + GetSlaveRx(g_FT8006->m_csInfo)) + 6, bufferRight + rightChannelNum, 6); + } + + else if (CS_UP_DOWN == GetCSDirection(g_FT8006->m_csInfo)) { + bufferUp = Ft8006m_fts_malloc(TX_NUM_MAX * RX_NUM_MAX*sizeof(int)); + bufferDown = Ft8006m_fts_malloc(TX_NUM_MAX * RX_NUM_MAX*sizeof(int)); + + if (CS_S0_AS_MASTER == GetS0Role(g_FT8006->m_csInfo)) { + splitTx = GetMasterTx(g_FT8006->m_csInfo); + bufferUp = bufferMaster; + bufferDown = bufferSlave; + upChannelNum = GetMasterTx(g_FT8006->m_csInfo) * GetMasterRx(g_FT8006->m_csInfo); + downChannelNum = GetSlaveTx(g_FT8006->m_csInfo) * GetSlaveRx(g_FT8006->m_csInfo); + } else { + splitTx = GetSlaveTx(g_FT8006->m_csInfo); + bufferUp = bufferSlave; + bufferDown = bufferMaster; + upChannelNum = GetSlaveTx(g_FT8006->m_csInfo) * GetSlaveRx(g_FT8006->m_csInfo); + downChannelNum = GetMasterTx(g_FT8006->m_csInfo) * GetMasterRx(g_FT8006->m_csInfo); + } + for (iRow = 0; iRow < GetMasterTx(g_FT8006->m_csInfo) + GetSlaveTx(g_FT8006->m_csInfo); ++iRow) { + for (iCol = 0; iCol < GetMasterRx(g_FT8006->m_csInfo); ++iCol) { + iRelativeTx = iRow - splitTx; + iTotalTx = GetMasterTx(g_FT8006->m_csInfo) + GetSlaveTx(g_FT8006->m_csInfo); + if (iRow >= splitTx) { + + bufferCated[iRow * GetMasterRx(g_FT8006->m_csInfo) + iCol] = bufferDown[iRelativeTx * GetMasterRx(g_FT8006->m_csInfo) + iCol]; + } else { + + bufferCated[iRow * GetMasterRx(g_FT8006->m_csInfo) + iCol] = bufferUp[iRow * GetMasterRx(g_FT8006->m_csInfo) + iCol]; + } + } + } + + memcpy(bufferCated + (GetMasterTx(g_FT8006->m_csInfo) + GetSlaveTx(g_FT8006->m_csInfo)) * GetMasterRx(g_FT8006->m_csInfo), bufferUp + upChannelNum, 6); + memcpy(bufferCated + (GetMasterTx(g_FT8006->m_csInfo) + GetSlaveTx(g_FT8006->m_csInfo)) * GetMasterRx(g_FT8006->m_csInfo) + 6, bufferDown + downChannelNum, 6); + } + + + if (bufferLeft != NULL) { + Ft8006m_fts_free(bufferLeft); + } + if (bufferRight != NULL) { + Ft8006m_fts_free(bufferRight); + } + if (bufferUp != NULL) { + Ft8006m_fts_free(bufferUp); + } + if (bufferDown != NULL) { + Ft8006m_fts_free(bufferDown); + } + + FTS_TEST_FUNC_EXIT(); + +} + +/************************************************************************ +* Name: FT8006_TestItem_EnterFactoryMode +* Brief: Check whether TP can enter Factory Mode, and do some thing +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8006_TestItem_EnterFactoryMode(struct FT8006 *g_FT8006) +{ + + unsigned char ReCode = ERROR_CODE_INVALID_PARAM; + int iRedo = 5; + int i ; + Ft8006m_SysDelay(150); + FTS_TEST_DBG("Enter factory mode..."); + for (i = 1; i <= iRedo; i++) { + ReCode = FT8006_EnterFactory(g_FT8006); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Enter factory mode..."); + if (i < iRedo) { + Ft8006m_SysDelay(50); + continue; + } + } else { + FTS_TEST_DBG(" success to Enter factory mode..."); + break; + } + + } + Ft8006m_SysDelay(300); + + if (ReCode == ERROR_CODE_OK) { + ReCode = GetChannelNum(); + + } + return ReCode; +} + +/************************************************************************ +* Name: FT8006_TestItem_RawDataTest +* Brief: TestItem: RawDataTest. Check if MCAP RawData is within the range. +* Input: bTestResult +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8006_TestItem_RawDataTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + unsigned char ReCode; + bool btmpresult = true; + int RawDataMin; + int RawDataMax; + int iValue = 0; + int i = 0; + int iRow, iCol; + + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Raw Data Test\n"); + + + + for (i = 0 ; i < 3; i++) { + ReCode = GetRawData(g_FT8006); + } + + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to get Raw Data!! Error Code: %d", ReCode); + return ReCode; + } + + + + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; iRow++) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + FTS_TEST_DBG("%5d, ", m_RawData[iRow][iCol]); + } + } + + FTS_TEST_DBG("\nKeys: "); + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; iCol++) + FTS_TEST_DBG("%5d, ", m_RawData[ft8006m_g_stSCapConfEx.ChannelXNum][iCol]); + + + + + + + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; iRow++) { + + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + if (ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[iRow][iCol]; + RawDataMax = ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + + + + iRow = ft8006m_g_stSCapConfEx.ChannelXNum; + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; iCol++) { + if (ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Min[iRow][iCol]; + RawDataMax = ft8006m_g_stCfg_Incell_DetailThreshold.RawDataTest_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + + + + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "RawData Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + Save_Test_Data(m_RawData, 0, ft8006m_g_stSCapConfEx.ChannelXNum+1, ft8006m_g_stSCapConfEx.ChannelYNum, 1); + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//RawData Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//RawData Test is NG!"); + } + return ReCode; +} + + +/************************************************************************ +* Name: FT8006_TestItem_CbTest +* Brief: TestItem: Cb Test. Check if Cb is within the range. +* Input: none +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8006_TestItem_CbTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + bool btmpresult = true; + unsigned char ReCode = ERROR_CODE_OK; + int iRow = 0; + int iCol = 0; + int i = 0; + int iMaxValue = 0; + int iMinValue = 0; + int iValue = 0; + bool bIncludeKey = false; + unsigned char bClbResult = 0; + + + bIncludeKey = g_stCfg_FT8006_BasicThreshold.bCBTest_VKey_Check; + + FTS_TEST_INFO("\n\n==============================Test Item: -------- CB Test\n"); + + for (i = 0; i < 10; i++) { + ReCode = FT8006_ChipClb(g_FT8006, &bClbResult); + Ft8006m_SysDelay(50); + if (0 != bClbResult) { + break; + } + } + if (false == bClbResult) { + FTS_TEST_ERROR("\r\nReCalib Failed\r\n"); + btmpresult = false; + } + + ReCode = FT8006_GetTxRxCB(g_FT8006, 0, (short)(ft8006m_g_stSCapConfEx.ChannelXNum * ft8006m_g_stSCapConfEx.ChannelYNum + ft8006m_g_stSCapConfEx.KeyNumTotal), m_ucTempData); + if (ERROR_CODE_OK != ReCode) { + btmpresult = false; + FTS_TEST_ERROR("\nFailed to get CB value...\n"); + goto TEST_ERR; + } + + memset(m_CBData, 0, sizeof(m_CBData)); + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + m_CBData[iRow][iCol] = m_ucTempData[iRow * ft8006m_g_stSCapConfEx.ChannelYNum + iCol]; + } + } + + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; ++iCol) { + m_CBData[ft8006m_g_stSCapConfEx.ChannelXNum][iCol] = m_ucTempData[ft8006m_g_stSCapConfEx.ChannelXNum*ft8006m_g_stSCapConfEx.ChannelYNum + iCol]; + + } + + + + + + + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; iRow++) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + FTS_TEST_DBG("%3d, ", m_CBData[iRow][iCol]); + } + } + + FTS_TEST_DBG("\nKeys: "); + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; iCol++) + FTS_TEST_DBG("%3d, ", m_CBData[ft8006m_g_stSCapConfEx.ChannelXNum][iCol]); + + + + + + + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; iRow++) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + if ((0 == ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol])) { + continue; + } + iMinValue = ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[iRow][iCol]; + iMaxValue = ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[iRow][iCol]; + iValue = ft8006m_focal_abs(m_CBData[iRow][iCol]); + + if (iValue < iMinValue || iValue > iMaxValue) { + btmpresult = false; + FTS_TEST_ERROR("CB test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, iMinValue, iMaxValue); + } + } + } + + + if (bIncludeKey) { + + iRow = ft8006m_g_stSCapConfEx.ChannelXNum; + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; iCol++) { + if (ft8006m_g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) { + continue; + } + iMinValue = ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Min[iRow][iCol]; + iMaxValue = ft8006m_g_stCfg_Incell_DetailThreshold.CBTest_Max[iRow][iCol]; + iValue = ft8006m_focal_abs(m_CBData[iRow][iCol]); + if (iValue < iMinValue || iValue > iMaxValue) { + btmpresult = false; + FTS_TEST_ERROR("CB test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, iMinValue, iMaxValue); + } + } + + + } + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "CB Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + Save_Test_Data(m_CBData, 0, ft8006m_g_stSCapConfEx.ChannelXNum+1, ft8006m_g_stSCapConfEx.ChannelYNum, 1); + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//CB Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//CB Test is NG!"); + } + + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO("\n\n//CB Test is NG!"); + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "CB Test is NG. \n\n"); + return ReCode; +} + + +/************************************************************************ +* Name: FT8006_TestItem_ChannelsTest +* Brief: Check whether TP can enter Factory Mode, and do some thing +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8006_TestItem_ChannelsTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + unsigned char ReCode; + + FTS_TEST_DBG("\n\n==============================Test Item: -------- Channel Test "); + + ReCode = GetChannelNum(); + if (ReCode == ERROR_CODE_OK) { + if ((g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelXNum == ft8006m_g_stSCapConfEx.ChannelXNum) + && (g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelYNum == ft8006m_g_stSCapConfEx.ChannelYNum) + && (g_stCfg_FT8006_BasicThreshold.ChannelNumTest_KeyNum == ft8006m_g_stSCapConfEx.KeyNum)) { + *bTestResult = true; + FTS_TEST_DBG("\n\nGet channels: (CHx: %d, CHy: %d, Key: %d), Set channels: (CHx: %d, CHy: %d, Key: %d)", + ft8006m_g_stSCapConfEx.ChannelXNum, ft8006m_g_stSCapConfEx.ChannelYNum, ft8006m_g_stSCapConfEx.KeyNum, + g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelXNum, g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelYNum, g_stCfg_FT8006_BasicThreshold.ChannelNumTest_KeyNum); + + FTS_TEST_INFO("\n//Channel Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_ERROR("\n\nGet channels: (CHx: %d, CHy: %d, Key: %d), Set channels: (CHx: %d, CHy: %d, Key: %d)", + ft8006m_g_stSCapConfEx.ChannelXNum, ft8006m_g_stSCapConfEx.ChannelYNum, ft8006m_g_stSCapConfEx.KeyNum, + g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelXNum, g_stCfg_FT8006_BasicThreshold.ChannelNumTest_ChannelYNum, g_stCfg_FT8006_BasicThreshold.ChannelNumTest_KeyNum); + + FTS_TEST_INFO("\n//Channel Test is NG!"); + } + } + + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "Channel Test is %s. \n\n", (*bTestResult ? "OK" : "NG")); + + return ReCode; +} + +/************************************************************************ +* Name: FT8006_CheckItem_FactoryIdTest +* Brief: Factory Id Testt. +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8006_CheckItem_FactoryIdTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + unsigned char ReCode = ERROR_CODE_OK; + bool btmpresult = true; + unsigned char regData = 0; + unsigned char FactoryId = 0; + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Factory Id Test\n"); + + ReCode = Ft8006m_EnterWork(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR(" EnterWork failed.. Error Code: %d \n", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + + Ft8006m_SysDelay(60); + ReCode = Ft8006m_ReadReg(REG_FACTORYID, ®Data); + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR(" Failed to Read Register: %x. Error Code: %d \n", REG_FACTORYID, ReCode); + goto TEST_ERR; + } + + FactoryId = g_stCfg_FT8006_BasicThreshold.Factory_ID_Number; + + FTS_TEST_DBG("\r\nGet FactoryId:0x%02x, Set FactoryId: 0x%02x \n", regData, FactoryId); + + if (FactoryId == regData) { + btmpresult = true; + + } else { + btmpresult = false; + } + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, " FactoryId Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//FactoryId Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//FactoryId Test is NG!"); + } + return ReCode; + +TEST_ERR: + *bTestResult = false; + FTS_TEST_INFO("\n\n//FactoryId Test is NG!"); + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, " FactoryId Test is NG. \n\n"); + + return ReCode; +} + + +unsigned char FT8006_TestItem_ShortCircuitTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + unsigned char ReCode = ERROR_CODE_OK; + bool bTempResult = true; + int ResMin = 0; + int iAllAdcDataNum = 0; + unsigned char iTxNum = 0, iRxNum = 0, iChannelNum = 0; + int iRow = 0, iCol = 0; + int tmpAdc = 0; + int iValueMin = 0; + int iValueMax = 0; + int iValue = 0; + int i = 0; + + FTS_TEST_INFO("\r\n\r\n==============================Test Item: -------- Short Circuit Test \r\n"); + + ReCode = FT8006_EnterFactory(g_FT8006); + if (ERROR_CODE_OK != ReCode) { + bTempResult = false; + FTS_TEST_ERROR("\r\n\r\n// Failed to Enter factory mode. Error Code: %d", ReCode); + goto TEST_END; + } + + ResMin = g_stCfg_FT8006_BasicThreshold.ShortCircuit_ResMin; + ReCode = Ft8006m_ReadReg(0x02, &iTxNum); + ReCode = Ft8006m_ReadReg(0x03, &iRxNum); + if (ERROR_CODE_OK != ReCode) { + bTempResult = false; + FTS_TEST_ERROR("\r\n\r\n// Failed to read reg. Error Code: %d", ReCode); + goto TEST_END; + } + + iChannelNum = iTxNum + iRxNum; + iAllAdcDataNum = iTxNum * iRxNum + ft8006m_g_stSCapConfEx.KeyNumTotal; + memset(iAdcData, 0, sizeof(iAdcData)); + + for (i = 0; i < 1; i++) { + ReCode = FT8006_WeakShort_GetAdcData(g_FT8006, iAllAdcDataNum*2, iAdcData); + Ft8006m_SysDelay(50); + if (ERROR_CODE_OK != ReCode) { + bTempResult = false; + FTS_TEST_ERROR("\r\n\r\n// Failed to get AdcData. Error Code: %d", ReCode); + goto TEST_END; + } + } + + + FTS_TEST_DBG("shortRes data:\n"); + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum + 1; ++iRow) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + tmpAdc = iAdcData[iRow * iRxNum + iCol]; + if (tmpAdc > 4050) + tmpAdc = 4050; + shortRes[iRow][iCol] = (tmpAdc * 100) / (4095 - tmpAdc); + + FTS_TEST_DBG("%-4d ", shortRes[iRow][iCol]); + } + FTS_TEST_DBG(" \n"); + } + FTS_TEST_DBG(" \n"); + + + + + iValueMin = ResMin; + iValueMax = 100000000; + FTS_TEST_DBG(" Short Circuit test , Set_Range=(%d, %d). \n", \ + iValueMin, iValueMax); + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; iRow++) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + if (ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + + iValue = shortRes[iRow][iCol]; + if (iValue < iValueMin || iValue > iValueMax) { + bTempResult = false; + FTS_TEST_ERROR(" Short Circuit test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d). \n", \ + iRow+1, iCol+1, iValue, iValueMin, iValueMax); + } + } + } + +TEST_END: + + if (bTempResult) { + FTS_TEST_INFO("\r\n\r\n//Short Circuit Test is OK!"); + *bTestResult = true; + } else { + FTS_TEST_INFO("\r\n\r\n//Short Circuit Test is NG!"); + *bTestResult = false; + } + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "Short Circuit Test is %s. \n\n", (bTempResult ? "OK" : "NG")); + + return ReCode; +} +unsigned char FT8006_TestItem_LCDNoiseTest(struct FT8006 *g_FT8006, bool *bTestResult) +{ + unsigned char ReCode = ERROR_CODE_OK; + bool bResultFlag = true; + unsigned char oldMode = 0; + int iRetry = 0; + unsigned char status = 0xff; + int iRow = 0, iCol = 0; + int index = 0; + unsigned char chNoiseValue = 0xff; + int iValueMin = 0; + int iValueMax = 0; + int iValue = 0; + + FTS_TEST_INFO("\r\n\r\n==============================Test Item: -------- LCD Noise Test \r\n"); + + + Ft8006m_ReadReg(0x06, &oldMode); + FT8006_WriteReg(g_FT8006, 0x06, 1); + + + ReCode = FT8006_WriteReg(g_FT8006, REG_8006_LCD_NOISE_FRAME, g_stCfg_FT8006_BasicThreshold.iLCDNoiseTestFrame & 0xff); + ReCode = FT8006_WriteReg(g_FT8006, REG_8006_LCD_NOISE_FRAME+1, (g_stCfg_FT8006_BasicThreshold.iLCDNoiseTestFrame >> 8) & 0xff); + + + ReCode = FT8006_WriteReg(g_FT8006, 0x01, 0xAD); + + + ReCode = FT8006_WriteReg(g_FT8006, REG_8006_LCD_NOISE_START, 0x01); + + + for (iRetry = 0; iRetry < 50; ++iRetry) { + + ReCode = Ft8006m_ReadReg(REG_8006_LCD_NOISE_START, &status); + if (status == 0x00) + break; + Ft8006m_SysDelay(500); + } + + if (iRetry == 50) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nScan Noise Time Out!"); + goto TEST_END; + } + + + memset(m_RawData, 0, sizeof(m_RawData)); + memset(ScreenNoiseData, 0, sizeof(ScreenNoiseData)); + + ReadBytesByKey(0x6A, ft8006m_g_stSCapConfEx.ChannelXNum * ft8006m_g_stSCapConfEx.ChannelYNum * 2 + ft8006m_g_stSCapConfEx.KeyNumTotal * 2, ScreenNoiseData); + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + index = iRow * ft8006m_g_stSCapConfEx.ChannelYNum + iCol; + m_RawData[iRow][iCol] = (int)(short)((ScreenNoiseData[index * 2] << 8) + ScreenNoiseData[index * 2 + 1]); + } + } + + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; ++iCol) { + index = ft8006m_g_stSCapConfEx.ChannelXNum * ft8006m_g_stSCapConfEx.ChannelYNum + iCol; + m_RawData[ft8006m_g_stSCapConfEx.ChannelXNum][iCol] = (int)(short)((ScreenNoiseData[index * 2] << 8) + ScreenNoiseData[index * 2 + 1]); + } + + ReCode = FT8006_EnterWork(g_FT8006); + Ft8006m_SysDelay(100); + ReCode = Ft8006m_ReadReg(0x80, &chNoiseValue); + ReCode = FT8006_EnterFactory(g_FT8006); + Ft8006m_SysDelay(100); + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum + 1; ++iRow) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + LCD_Noise[iRow][iCol] = ft8006m_focal_abs(m_RawData[iRow][iCol]); + } + } + + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum+1; ++iRow) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + + FTS_TEST_DBG("%4d, ", LCD_Noise[iRow][iCol]); + } + } + FTS_TEST_DBG("\n"); + + iValueMin = 0; + iValueMax = g_stCfg_FT8006_BasicThreshold.iLCDNoiseCoefficient * chNoiseValue * 32 / 100; + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum+1; iRow++) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; iCol++) { + if (ft8006m_g_stCfg_MCap_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + + iValue = LCD_Noise[iRow][iCol]; + if (iValue < iValueMin || iValue > iValueMax) { + bResultFlag = false; + FTS_TEST_ERROR(" LCD Noise test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d). \n", + iRow+1, iCol+1, iValue, iValueMin, iValueMax); + } + } + } + + Save_Test_Data(LCD_Noise, 0, ft8006m_g_stSCapConfEx.ChannelXNum, ft8006m_g_stSCapConfEx.ChannelYNum, 1); + + +TEST_END: + + FT8006_WriteReg(g_FT8006, 0x06, oldMode); + Ft8006m_SysDelay(20); + + if (bResultFlag) { + FTS_TEST_INFO("\r\n\r\n//LCD Noise Test is OK!"); + *bTestResult = true; + } else { + FTS_TEST_INFO("\r\n\r\n//LCD Noise Test is NG!"); + *bTestResult = false; + } + + Ft8006m_TestResultLen += sprintf(Ft8006m_TestResult+Ft8006m_TestResultLen, "LCD Noise Test is %s. \n\n", (bResultFlag ? "OK" : "NG")); + + return ReCode; +} + + +static unsigned char ChipClb(unsigned char *pClbResult) +{ + unsigned char RegData = 0; + unsigned char TimeOutTimes = 50; + unsigned char ReCode = ERROR_CODE_OK; + + ReCode = Ft8006m_WriteReg(REG_CLB, 4); + + if (ReCode == ERROR_CODE_OK) { + while (TimeOutTimes--) { + Ft8006m_SysDelay(100); + ReCode = Ft8006m_WriteReg(DEVIDE_MODE_ADDR, 0x04<<4); + ReCode = Ft8006m_ReadReg(0x04, &RegData); + if (ReCode == ERROR_CODE_OK) { + if (RegData == 0x02) { + *pClbResult = 1; + break; + } + } else { + break; + } + } + + if (TimeOutTimes == 0) { + *pClbResult = 0; + } + } + return ReCode; +} +/************************************************************************ +* Name: FT8006M_get_test_data +* Brief: get data of test result +* Input: none +* Output: pTestData, the returned buff +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int FT8006M_get_test_data(char *pTestData) +{ + if (NULL == pTestData) { + FTS_TEST_DBG(" pTestData == NULL "); + return -EPERM; + } + memcpy(pTestData, ft8006m_g_pStoreAllData, (ft8006m_g_lenStoreMsgArea+ft8006m_g_lenStoreDataArea)); + return (ft8006m_g_lenStoreMsgArea+ft8006m_g_lenStoreDataArea); +} + + +/************************************************************************ +* Name: Save_Test_Data +* Brief: Storage format of test data +* Input: int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount +* Output: none +* Return: none +***********************************************************************/ +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount) +{ + int iLen = 0; + int i = 0, j = 0; + + + iLen = sprintf(ft8006m_g_pTmpBuff, "NA, %d, %d, %d, %d, %d, ", \ + ft8006m_m_ucTestItemCode, Row, Col, ft8006m_m_iStartLine, ItemCount); + memcpy(ft8006m_g_pMsgAreaLine2+ft8006m_g_lenMsgAreaLine2, ft8006m_g_pTmpBuff, iLen); + ft8006m_g_lenMsgAreaLine2 += iLen; + + ft8006m_m_iStartLine += Row; + ft8006m_m_iTestDataCount++; + + + for (i = 0+iArrayIndex; (i < Row+iArrayIndex) && (i < TX_NUM_MAX); i++) { + for (j = 0; (j < Col) && (j < RX_NUM_MAX); j++) { + if (j == (Col - 1)) + iLen = sprintf(ft8006m_g_pTmpBuff, "%d, \n", iData[i][j]); + else + iLen = sprintf(ft8006m_g_pTmpBuff, "%d, ", iData[i][j]); + + memcpy(ft8006m_g_pStoreDataArea+ft8006m_g_lenStoreDataArea, ft8006m_g_pTmpBuff, iLen); + ft8006m_g_lenStoreDataArea += iLen; + } + } + +} + + +/************************************************************************ +* Name: StartScan(Same function name as FT_MultipleTest) +* Brief: Scan TP, do it before read Raw Data +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static int StartScan() +{ + unsigned char RegVal = 0x00; + unsigned char times = 0; + const unsigned char MaxTimes = 250; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + + + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RegVal); + printk("hb1 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + if (ReCode == ERROR_CODE_OK) { + RegVal |= 0x80; + ReCode = Ft8006m_WriteReg(DEVIDE_MODE_ADDR, RegVal); + printk("hb2 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + if (ReCode == ERROR_CODE_OK) { + while (times++ < MaxTimes) { + Ft8006m_SysDelay(16); + ReCode = Ft8006m_ReadReg(DEVIDE_MODE_ADDR, &RegVal); + printk("hb3 :RegVal:0x%x, ReCode:0x%x, times:0x%x\n", RegVal, ReCode, times); + if (ReCode == ERROR_CODE_OK) { + if ((RegVal>>7) == 0) { + printk("hb4 :RegVal>>7:0x%x, ReCode:0x%x\n", RegVal>>7, ReCode); + break; + } + } else { + printk("hb5 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + break; + } + } + if (times < MaxTimes) { + printk("hb6 :times:0x%x, MaxTimes:0x%x ------OK\n", times, MaxTimes); + ReCode = ERROR_CODE_OK; + } else { + printk("hb6 :times:0x%x, MaxTimes:0x%x ------FAIL\n", times, MaxTimes); + ReCode = ERROR_CODE_COMM_ERROR; + } + } + } + return ReCode; + +} +/************************************************************************ +* Name: ReadRawData(Same function name as FT_MultipleTest) +* Brief: read Raw Data +* Input: Freq(No longer used, reserved), LineNum, ByteNum +* Output: pRevBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + unsigned char I2C_wBuffer[3] = {0}; + unsigned char pReadData[ByteNum]; + + int i, iReadNum; + unsigned short BytesNumInTestMode1 = 0; + + iReadNum = ByteNum/BYTES_PER_TIME; + + if (0 != (ByteNum%BYTES_PER_TIME)) + iReadNum++; + + if (ByteNum <= BYTES_PER_TIME) { + BytesNumInTestMode1 = ByteNum; + } else { + BytesNumInTestMode1 = BYTES_PER_TIME; + } + + ReCode = Ft8006m_WriteReg(REG_LINE_NUM, LineNum); + + + + I2C_wBuffer[0] = REG_RawBuf0; + if (ReCode == ERROR_CODE_OK) { + ft8006m_focal_msleep(10); + ReCode = Ft8006m_Comm_Base_IIC_IO(I2C_wBuffer, 1, pReadData, BytesNumInTestMode1); + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) + break; + + if (i == iReadNum-1) { + ft8006m_focal_msleep(10); + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadData+BYTES_PER_TIME*i, ByteNum-BYTES_PER_TIME*i); + } else { + ft8006m_focal_msleep(10); + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadData+BYTES_PER_TIME*i, BYTES_PER_TIME); + } + + } + + if (ReCode == ERROR_CODE_OK) { + for (i = 0; i < (ByteNum>>1); i++) { + pRevBuffer[i] = (pReadData[i<<1]<<8)+pReadData[(i<<1)+1]; + } + } + + + return ReCode; + +} +static unsigned char FT8006_GetTxRxCB(struct FT8006 *g_FT8006, unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + struct CSChipAddrMgr mgr; + + FTS_TEST_FUNC_ENTER(); + + if (ChipHasTwoHeart(g_FT8006)) { + memset(bufferMaster, 0, sizeof(bufferMaster)); + memset(bufferSlave, 0, sizeof(bufferSlave)); + memset(bufferCated, 0, sizeof(bufferCated)); + + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = GetTxRxCB(0, GetMasterTx(g_FT8006->m_csInfo) * GetMasterRx(g_FT8006->m_csInfo) + 6, (unsigned char *)bufferMaster); + + + WorkAsSlave(&mgr); + ReCode = GetTxRxCB(0, GetSlaveTx(g_FT8006->m_csInfo) * GetSlaveRx(g_FT8006->m_csInfo) + 6, (unsigned char *)bufferSlave); + + CatSingleToOneScreen(g_FT8006); + + memcpy(pReadBuffer, (unsigned char *)bufferCated + StartNodeNo, ReadNum); + + CSChipAddrMgr_Exit(&mgr); + } else { + ReCode = GetTxRxCB(StartNodeNo, ReadNum, pReadBuffer); + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} +/************************************************************************ +* Name: GetTxRxCB(Same function name as FT_MultipleTest) +* Brief: get CB of Tx/Rx +* Input: StartNodeNo, ReadNum +* Output: pReadBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetTxRxCB(unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + unsigned short usReturnNum = 0; + unsigned short usTotalReturnNum = 0; + unsigned char wBuffer[4] = {0}; + int i, iReadNum; + + iReadNum = ReadNum/BYTES_PER_TIME; + + if (0 != (ReadNum%BYTES_PER_TIME)) + iReadNum++; + + wBuffer[0] = REG_CbBuf0; + + usTotalReturnNum = 0; + + for (i = 1; i <= iReadNum; i++) { + if (i*BYTES_PER_TIME > ReadNum) + usReturnNum = ReadNum - (i-1)*BYTES_PER_TIME; + else + usReturnNum = BYTES_PER_TIME; + + wBuffer[1] = (StartNodeNo+usTotalReturnNum) >> 8; + wBuffer[2] = (StartNodeNo+usTotalReturnNum)&0xff; + + ReCode = Ft8006m_WriteReg(REG_CbAddrH, wBuffer[1]); + ReCode = Ft8006m_WriteReg(REG_CbAddrL, wBuffer[2]); + + ReCode = Ft8006m_Comm_Base_IIC_IO(wBuffer, 1, pReadBuffer+usTotalReturnNum, usReturnNum); + + usTotalReturnNum += usReturnNum; + + if (ReCode != ERROR_CODE_OK) + return ReCode; + + + } + + return ReCode; +} + + + + +static unsigned char GetPanelRows(unsigned char *pPanelRows) +{ + return Ft8006m_ReadReg(REG_TX_NUM, pPanelRows); +} + + + + +static unsigned char GetPanelCols(unsigned char *pPanelCols) +{ + return Ft8006m_ReadReg(REG_RX_NUM, pPanelCols); +} + + +/************************************************************************ +* Name: GetChannelNum +* Brief: Get Num of Ch_X, Ch_Y and key +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetChannelNum(void) +{ + unsigned char ReCode; + + int i ; + unsigned char rBuffer[1]; + + + + for (i = 0; i < 3; i++) { + ReCode = GetPanelRows(rBuffer); + if (ReCode == ERROR_CODE_OK) { + if (0 < rBuffer[0] && rBuffer[0] < 80) { + ft8006m_g_stSCapConfEx.ChannelXNum = rBuffer[0]; + if (ft8006m_g_stSCapConfEx.ChannelXNum > ft8006m_g_ScreenSetParam.iUsedMaxTxNum) { + FTS_TEST_ERROR("Failed to get Channel X number, Get num = %d, UsedMaxNum = %d", + ft8006m_g_stSCapConfEx.ChannelXNum, ft8006m_g_ScreenSetParam.iUsedMaxTxNum); + ft8006m_g_stSCapConfEx.ChannelXNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + + break; + } else { + Ft8006m_SysDelay(150); + continue; + } + } else { + FTS_TEST_ERROR("Failed to get Channel X number"); + Ft8006m_SysDelay(150); + } + } + + + for (i = 0; i < 3; i++) { + ReCode = GetPanelCols(rBuffer); + if (ReCode == ERROR_CODE_OK) { + if (0 < rBuffer[0] && rBuffer[0] < 80) { + ft8006m_g_stSCapConfEx.ChannelYNum = rBuffer[0]; + if (ft8006m_g_stSCapConfEx.ChannelYNum > ft8006m_g_ScreenSetParam.iUsedMaxRxNum) { + + FTS_TEST_ERROR("Failed to get Channel Y number, Get num = %d, UsedMaxNum = %d", + ft8006m_g_stSCapConfEx.ChannelYNum, ft8006m_g_ScreenSetParam.iUsedMaxRxNum); + ft8006m_g_stSCapConfEx.ChannelYNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + break; + } else { + Ft8006m_SysDelay(150); + continue; + } + } else { + FTS_TEST_ERROR("Failed to get Channel Y number"); + Ft8006m_SysDelay(150); + } + } + + + for (i = 0; i < 3; i++) { + unsigned char regData = 0; + ft8006m_g_stSCapConfEx.KeyNum = 0; + ReCode = Ft8006m_ReadReg(FT8006_LEFT_KEY_REG, ®Data); + if (ReCode == ERROR_CODE_OK) { + if (((regData >> 0) & 0x01)) { + ft8006m_g_stSCapConfEx.bLeftKey1 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + if (((regData >> 1) & 0x01)) { + ft8006m_g_stSCapConfEx.bLeftKey2 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + if (((regData >> 2) & 0x01)) { + ft8006m_g_stSCapConfEx.bLeftKey3 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + + } else { + FTS_TEST_ERROR("Failed to get Key number"); + Ft8006m_SysDelay(150); + continue; + } + ReCode = Ft8006m_ReadReg(FT8006_RIGHT_KEY_REG, ®Data); + if (ReCode == ERROR_CODE_OK) { + if (((regData >> 0) & 0x01)) { + ft8006m_g_stSCapConfEx.bRightKey1 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + if (((regData >> 1) & 0x01)) { + ft8006m_g_stSCapConfEx.bRightKey2 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + if (((regData >> 2) & 0x01)) { + ft8006m_g_stSCapConfEx.bRightKey3 = true; + ++ft8006m_g_stSCapConfEx.KeyNum; + } + + + break; + } else { + FTS_TEST_ERROR("Failed to get Key number"); + Ft8006m_SysDelay(150); + continue; + } + } + + + + FTS_TEST_INFO("CH_X = %d, CH_Y = %d, Key = %d", ft8006m_g_stSCapConfEx.ChannelXNum , ft8006m_g_stSCapConfEx.ChannelYNum, ft8006m_g_stSCapConfEx.KeyNum); + return ReCode; +} + +/************************************************************************ +* Name: GetRawData +* Brief: Get Raw Data of VA area and Key area +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetRawData(struct FT8006 *g_FT8006) +{ + int ReCode = ERROR_CODE_OK; + int iRow, iCol; + + FTS_TEST_FUNC_ENTER(); + + + + ReCode = FT8006_StartScan(g_FT8006); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Scan ..."); + return ReCode; + } + + + + + memset(m_RawData, 0, sizeof(m_RawData)); + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + ReCode = FT8006_ReadRawData(g_FT8006, 0, 0xAD, ft8006m_g_stSCapConfEx.ChannelXNum * ft8006m_g_stSCapConfEx.ChannelYNum * 2, m_iTempRawData); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Get RawData"); + return ReCode; + } + + for (iRow = 0; iRow < ft8006m_g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.ChannelYNum; ++iCol) { + m_RawData[iRow][iCol] = m_iTempRawData[iRow * ft8006m_g_stSCapConfEx.ChannelYNum + iCol]; + } + } + + + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + ReCode = FT8006_ReadRawData(g_FT8006, 0, 0xAE, ft8006m_g_stSCapConfEx.KeyNumTotal * 2, m_iTempRawData); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Get RawData"); + return ReCode; + } + + for (iCol = 0; iCol < ft8006m_g_stSCapConfEx.KeyNumTotal; ++iCol) { + + m_RawData[ft8006m_g_stSCapConfEx.ChannelXNum][iCol] = m_iTempRawData[iCol]; + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} +unsigned char FT8006_ReadRawData(struct FT8006 *g_FT8006, unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + + FTS_TEST_FUNC_ENTER(); + + if (ChipHasTwoHeart(g_FT8006)) { + + struct CSChipAddrMgr mgr; + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = ReadRawData(Freq, LineNum, ByteNum, pRevBuffer); + + CSChipAddrMgr_Exit(&mgr); + } else { + + ReCode = ReadRawData(Freq, LineNum, ByteNum, pRevBuffer); + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} + +unsigned char FT8006_EnterFactory(struct FT8006 *g_FT8006) +{ + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + + ReleaseCSInfo(g_FT8006); + + ReCode = Ft8006m_EnterFactory(); + + + UpDateCSInfo(g_FT8006); + + + return ReCode; +} +unsigned char FT8006_EnterWork(struct FT8006 *g_FT8006) +{ + unsigned char ReCode = ERROR_CODE_OK; + if (ChipHasTwoHeart(g_FT8006)) { + + struct CSChipAddrMgr mgr; + + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = Ft8006m_EnterWork(); + CSChipAddrMgr_Exit(&mgr); + + } else { + + ReCode = Ft8006m_EnterWork(); + } + + return ReCode; +} + +unsigned char FT8006_ChipClb(struct FT8006 *g_FT8006, unsigned char *pClbResult) +{ + unsigned char ReCode = ERROR_CODE_OK; + + FTS_TEST_FUNC_ENTER(); + + if (ChipHasTwoHeart(g_FT8006)) { + + struct CSChipAddrMgr mgr; + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? ChipClb(pClbResult) : ReCode; + + WorkAsSlave(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? ChipClb(pClbResult) : ReCode; + + CSChipAddrMgr_Exit(&mgr); + } else { + + ReCode = ChipClb(pClbResult); + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} +unsigned char FT8006_WeakShort_GetAdcData(struct FT8006 *g_FT8006, int AllAdcDataLen, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + struct CSChipAddrMgr mgr; + + FTS_TEST_FUNC_ENTER(); + + if (ChipHasTwoHeart(g_FT8006)) { + memset(bufferMaster, 0, sizeof(bufferMaster)); + memset(bufferSlave, 0, sizeof(bufferSlave)); + memset(bufferCated, 0, sizeof(bufferCated)); + + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = WeakShort_StartAdcScan(); + + WorkAsMaster(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? WeakShort_GetScanResult() : ReCode; + ReCode = (ReCode == ERROR_CODE_OK) ? WeakShort_GetAdcResult(AllAdcDataLen, bufferMaster) : ReCode; + + WorkAsSlave(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? WeakShort_GetScanResult() : ReCode; + ReCode = (ReCode == ERROR_CODE_OK) ? WeakShort_GetAdcResult(AllAdcDataLen, bufferSlave) : ReCode; + + + CatSingleToOneScreen(g_FT8006); + + memcpy(pRevBuffer, bufferCated, AllAdcDataLen * sizeof(unsigned int)); + + CSChipAddrMgr_Exit(&mgr); + + } else { + ReCode = WeakShort_GetAdcData(AllAdcDataLen, pRevBuffer); + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} +unsigned char WeakShort_StartAdcScan() +{ + return Ft8006m_WriteReg(0x0F, 1); +} + +unsigned char FT8006_WriteReg(struct FT8006 *g_FT8006, unsigned char RegAddr, unsigned char RegData) +{ + unsigned char ReCode = ERROR_CODE_OK; + if (ChipHasTwoHeart(g_FT8006)) { + + struct CSChipAddrMgr mgr; + + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? Ft8006m_WriteReg(RegAddr, RegData) : ReCode; + + WorkAsSlave(&mgr); + ReCode = (ReCode == ERROR_CODE_OK) ? Ft8006m_WriteReg(RegAddr, RegData) : ReCode; + + CSChipAddrMgr_Exit(&mgr); + } else { + + ReCode = Ft8006m_WriteReg(RegAddr, RegData); + } + + return ReCode; +} + +unsigned char WeakShort_GetScanResult() +{ + unsigned char RegMark = 0; + unsigned char ReCode = ERROR_CODE_OK; + int index = 0; + + for (index = 0; index < 50; ++index) { + Ft8006m_SysDelay(50); + ReCode = Ft8006m_ReadReg(0x10, &RegMark); + if (ERROR_CODE_OK == ReCode && 0 == RegMark) + break; + } + + return ReCode; +} + +unsigned char WeakShort_GetAdcResult(int AllAdcDataLen, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + int index = 0; + int i = 0; + int usReturnNum = 0; + unsigned char wBuffer[2] = {0}; + int iReadNum = 0; + + FTS_TEST_FUNC_ENTER(); + + iReadNum = AllAdcDataLen / BYTES_PER_TIME; + if ((AllAdcDataLen % BYTES_PER_TIME) > 0) + ++iReadNum; + + memset(wBuffer, 0, sizeof(wBuffer)); + wBuffer[0] = 0x89; + memset(pReadBuffer, 0, sizeof(pReadBuffer)); + + usReturnNum = BYTES_PER_TIME; + if (ReCode == ERROR_CODE_OK) { + ReCode = Ft8006m_Comm_Base_IIC_IO(wBuffer, 1, pReadBuffer, usReturnNum); + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Comm_Base_IIC_IO error. !!!"); + break; + } + + if (i == iReadNum-1) { + usReturnNum = AllAdcDataLen-BYTES_PER_TIME*i; + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadBuffer+BYTES_PER_TIME*i, usReturnNum); + } else { + usReturnNum = BYTES_PER_TIME; + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadBuffer+BYTES_PER_TIME*i, usReturnNum); + } + } + + for (index = 0; index < AllAdcDataLen/2; ++index) { + pRevBuffer[index] = (pReadBuffer[index * 2] << 8) + pReadBuffer[index * 2 + 1]; + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} +/************************************************************************ +* Name: WeakShort_GetAdcData +* Brief: Get Adc Data +* Input: AllAdcDataLen +* Output: pRevBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char WeakShort_GetAdcData(int AllAdcDataLen, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + unsigned char RegMark = 0; + int index = 0; + int i = 0; + int usReturnNum = 0; + unsigned char wBuffer[2] = {0}; + + int iReadNum = 0; + + FTS_TEST_FUNC_ENTER(); + + memset(wBuffer, 0, sizeof(wBuffer)); + wBuffer[0] = 0x89; + + iReadNum = AllAdcDataLen / BYTES_PER_TIME; + if ((AllAdcDataLen % BYTES_PER_TIME) > 0) + ++iReadNum; + + ReCode = Ft8006m_WriteReg(0x0F, 1); + + for (index = 0; index < 50; ++index) { + Ft8006m_SysDelay(50); + ReCode = Ft8006m_ReadReg(0x10, &RegMark); + if (ERROR_CODE_OK == ReCode && 0 == RegMark) + break; + } + if (index >= 50) { + FTS_TEST_ERROR("Ft8006m_ReadReg failed, ADC data not OK."); + return 6; + } + + { + usReturnNum = BYTES_PER_TIME; + if (ReCode == ERROR_CODE_OK) { + ReCode = Ft8006m_Comm_Base_IIC_IO(wBuffer, 1, pReadBuffer, usReturnNum); + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR("Comm_Base_IIC_IO error. !!!"); + break; + } + + if (i == iReadNum-1) { + usReturnNum = AllAdcDataLen-BYTES_PER_TIME*i; + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadBuffer+BYTES_PER_TIME*i, usReturnNum); + } else { + usReturnNum = BYTES_PER_TIME; + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, pReadBuffer+BYTES_PER_TIME*i, usReturnNum); + } + } + } + + for (index = 0; index < AllAdcDataLen/2; ++index) { + pRevBuffer[index] = (pReadBuffer[index * 2] << 8) + pReadBuffer[index * 2 + 1]; + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} + +unsigned char ReadBytesByKey(BYTE key, int ByteNum, unsigned char *byteData) +{ + + unsigned char ReCode = ERROR_CODE_OK; + unsigned char I2C_wBuffer[3] = {0}; + unsigned short BytesNumInTestMode1 = 0; + int i = 0; + int iReadNum = 0; + + FTS_TEST_FUNC_ENTER(); + + iReadNum = ByteNum/BYTES_PER_TIME; + + if (0 != (ByteNum%BYTES_PER_TIME)) + iReadNum++; + + if (ByteNum <= BYTES_PER_TIME) { + BytesNumInTestMode1 = ByteNum; + } else { + BytesNumInTestMode1 = BYTES_PER_TIME; + } + + + I2C_wBuffer[0] = key; + if (ReCode == ERROR_CODE_OK) { + ReCode = Ft8006m_Comm_Base_IIC_IO(I2C_wBuffer, 1, byteData, BytesNumInTestMode1); + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) + break; + + if (i == iReadNum-1) { + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, byteData + BYTES_PER_TIME*i, ByteNum-BYTES_PER_TIME*i); + } else + ReCode = Ft8006m_Comm_Base_IIC_IO(NULL, 0, byteData + BYTES_PER_TIME*i, BYTES_PER_TIME); + + } + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} + +unsigned char FT8006_StartScan(struct FT8006 *g_FT8006) +{ + unsigned char ReCode = ERROR_CODE_OK; + + FTS_TEST_FUNC_ENTER(); + + if (ChipHasTwoHeart(g_FT8006)) { + + struct CSChipAddrMgr mgr; + + CSChipAddrMgr_Init(&mgr, g_FT8006); + + WorkAsMaster(&mgr); + ReCode = StartScan(); + CSChipAddrMgr_Exit(&mgr); + } else { + + ReCode = StartScan(); + } + + + FTS_TEST_FUNC_EXIT(); + + return ReCode; +} + + + +#endif diff --git a/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_supported_ic.c b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_supported_ic.c new file mode 100755 index 0000000000000..a723150a6b9f4 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/focaltech_test/supported_ic/focaltech_test_supported_ic.c @@ -0,0 +1,268 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.c +* +* Author: Software Development +* +* Created: 2016-08-01 +* +* Abstract: test item for FT8716 +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ + + +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + + + +#if (FTS_CHIP_TEST_TYPE == FT8607_TEST) +void OnInit_FT8607_TestItem(char *strIniFile); +void OnInit_FT8607_BasicThreshold(char *strIniFile); +void SetTestItem_FT8607(void); +boolean FT8607_StartTest(void); +int FT8607_ft8006m_get_test_data(char *pTestData); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT8607_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8607_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT8607; + ft8006m_g_stTestFuncs.Start_Test = FT8607_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT8607_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FTS_CHIP_TEST_TYPE == FT8716_TEST) + +boolean FT8006m_StartTest(void); +int FT8006M_get_test_data(char *pTestData); + +void OnInit_FT8006m_TestItem(char *strIniFile); +void OnInit_FT8006M_BasicThreshold(char *strIniFile); +void SetTestItem_FT8006m(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT8006m_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8006M_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT8006m; + ft8006m_g_stTestFuncs.Start_Test = FT8006m_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT8006M_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT3D47_TEST) +boolean FT3D47_StartTest(void); + +int FT3D47_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT3D47_TestItem(char *strIniFile); +void OnInit_FT3D47_BasicThreshold(char *strIniFile); +void SetTestItem_FT3D47(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT3D47_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT3D47_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT3D47; + ft8006m_g_stTestFuncs.Start_Test = FT3D47_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT3D47_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT5X46_TEST) + +boolean FT5X46_StartTest(void); +int FT5X46_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT5X46_TestItem(char *strIniFile); +void OnInit_FT5X46_BasicThreshold(char *strIniFile); +void SetTestItem_FT5X46(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT5X46_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5X46_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT5X46; + ft8006m_g_stTestFuncs.Start_Test = FT5X46_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT5X46_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT6X36_TEST) + +boolean FT6X36_StartTest(void); +int FT6X36_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT6X36_TestItem(char *strIniFile); +void OnInit_FT6X36_BasicThreshold(char *strIniFile); +void SetTestItem_FT6X36(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT6X36_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT6X36_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT6X36; + ft8006m_g_stTestFuncs.Start_Test = FT6X36_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT6X36_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT5822_TEST) + +boolean FT5822_StartTest(void); +int FT5822_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT5822_TestItem(char *strIniFile); +void OnInit_FT5822_BasicThreshold(char *strIniFile); +void SetTestItem_FT5822(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT5822_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5822_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT5822; + ft8006m_g_stTestFuncs.Start_Test = FT5822_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT5822_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT8006_TEST) + +boolean FT8006_StartTest(void); +int FT8006M_get_test_data(char *pTestData); + +void OnInit_FT8006_TestItem(char *strIniFile); +void OnInit_FT8006_BasicThreshold(char *strIniFile); +void SetTestItem_FT8006(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT8006_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8006_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT8006; + ft8006m_g_stTestFuncs.Start_Test = FT8006_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT8006M_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FTS_CHIP_TEST_TYPE == FT8736_TEST) + +boolean FT8736_StartTest(void); +int FT8736_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT8736_TestItem(char *strIniFile); +void OnInit_FT8736_BasicThreshold(char *strIniFile); +void SetTestItem_FT8736(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT8736_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8736_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT8736; + ft8006m_g_stTestFuncs.Start_Test = FT8736_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT8736_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FTE716_TEST) + +boolean FTE716_StartTest(void); +int FTE716_ft8006m_get_test_data(char *pTestData); + +void OnInit_FTE716_TestItem(char *strIniFile); +void OnInit_FTE716_BasicThreshold(char *strIniFile); +void SetTestItem_FTE716(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FTE716_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FTE716_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FTE716; + ft8006m_g_stTestFuncs.Start_Test = FTE716_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FTE716_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT8606_TEST) + +boolean FT8606_StartTest(void); +int FT8606_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT8606_TestItem(char *strIniFile); +void OnInit_FT8606_BasicThreshold(char *strIniFile); +void SetTestItem_FT8606(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT8606_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8606_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT8606; + ft8006m_g_stTestFuncs.Start_Test = FT8606_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT8606_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT3C47_TEST) + +boolean FT3C47_StartTest(void); +int FT3C47_ft8006m_get_test_data(char *pTestData); + +void OnInit_FT3C47_TestItem(char *strIniFile); +void OnInit_FT3C47_BasicThreshold(char *strIniFile); +void SetTestItem_FT3C47(void); + +void ft8006m_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + ft8006m_g_stTestFuncs.OnInit_TestItem = OnInit_FT3C47_TestItem; + ft8006m_g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT3C47_BasicThreshold; + ft8006m_g_stTestFuncs.SetTestItem = SetTestItem_FT3C47; + ft8006m_g_stTestFuncs.Start_Test = FT3C47_StartTest; + ft8006m_g_stTestFuncs.Get_test_data = FT3C47_ft8006m_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} +#endif + + diff --git a/drivers/input/touchscreen/FT8006m/include/firmware/FT8006m_app_sample.i b/drivers/input/touchscreen/FT8006m/include/firmware/FT8006m_app_sample.i new file mode 100644 index 0000000000000..e0c4cd30147b6 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/include/firmware/FT8006m_app_sample.i @@ -0,0 +1,5329 @@ +0x0, 0x0, 0x0, 0x60,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4,0x0, 0x0, 0x57,0xf4, +0xe0,0x60,0x3c,0x0, 0xcc,0x2, 0xe0,0x60,0x3c,0x10,0xea,0x0, 0xc8,0x3, 0xe0,0xff, +0xc8,0x7c,0xfa,0x0, 0xcf,0x82,0xf0,0x36,0xcf,0xd8,0xea,0x0, 0xcc,0x0, 0xe0,0x0, +0xcc,0x0, 0xe0,0x60,0x3c,0x17,0xea,0x0, 0xcc,0x2, 0xe0,0x0, 0xcc,0x0, 0xea,0x0, +0xcc,0x81,0xe0,0x55,0xcc,0xf8,0x3c,0x79,0x1, 0x8, 0xea,0x0, 0xcd,0x2, 0xe0,0x44, +0xcd,0x10,0x3d,0x28,0xe0,0x9, 0xd2,0x8, 0xea,0x0, 0xcc,0x0, 0xe0,0xaf,0xcc,0x44, +0x3c,0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x4d,0x8, 0xb2,0xf7,0xe, 0x87,0xf1,0x78,0x3, 0x12,0xfc,0xed,0xda,0x25,0x6, 0xf9, +0x0, 0x0, 0x0, 0x1, 0xff,0xfe,0x0, 0x0, 0x0, 0x0, 0xc8,0x37,0x0, 0x0, 0x80,0xa6, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x31,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xe0,0x1, 0x1f,0xde,0xe6,0x1, 0x16,0xff,0xa7,0x8f,0x34,0x28,0xa7,0x5f,0x3f,0x5d, +0xbf,0x5f,0xa7,0x5f,0x3c,0x4e,0xbc,0x5f,0x38,0x82,0xe0,0x2, 0x1e,0xbf,0xe0,0x2, +0x1f,0x51,0x8f,0xdd,0x8e,0x4d,0xe0,0x1, 0x1e,0xe0,0x3f,0xbc,0x37,0xa1,0xb7,0x8e, +0x9f,0x8e,0x37,0xc9,0xe0,0x3, 0xaf,0xcd,0x9f,0x8e,0x37,0xc1,0xe0,0x3, 0xaf,0xdd, +0x38,0x82,0x8, 0xb2,0xe0,0x1, 0x19,0x60,0xe0,0x6, 0x8c,0x12,0xe0,0x6, 0x8c,0xa2, +0xe0,0x2, 0xda,0xe0,0xe4,0x8, 0x34,0x21,0xe0,0x3, 0x9f,0xc2,0xe4,0x8, 0x34,0x40, +0x3c,0x7f,0x3, 0x88,0xe0,0x1, 0x1f,0x28,0xe0,0x3, 0xb4,0x42,0x9f,0x8e,0xcf,0xa0, +0xb7,0x8e,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xa3,0xe0,0x1a,0x17,0x20,0x3f,0x1f, +0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0xe0,0x1, 0x19,0x60,0x37,0x28,0x3c,0x4e, +0x17,0x81,0xaf,0xc2,0xe0,0x6, 0xda,0xf7,0xe0,0x2, 0x1f,0xbf,0xe0,0x19,0x16,0x9d, +0x17,0x7, 0x3e,0x9f,0xaf,0xd, 0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0xe0,0x1, 0xd9,0xa5, +0x17,0x82,0xaf,0xc2,0x9, 0x61,0xe0,0x1, 0x1f,0xb1,0x16,0x7b,0xa6,0x8f,0xa7,0xcd, +0xa7,0x4d,0x37,0xc2,0xe2,0x0, 0xc7,0x81,0xe4,0x0, 0xcf,0x81,0x37,0xa2,0x3f,0x5c, +0x3f,0xce,0xbf,0xcd,0x38,0x82,0xe0,0x0, 0xc4,0x70,0xe2,0x1, 0xc4,0x7f,0xe2,0x0, +0xcc,0x4, 0x2, 0xa2,0xea,0x15,0x7f,0x84,0xe9,0xff,0xc7,0xff,0x34,0x22,0x3c,0x1f, +0xa7,0x88,0x3f,0x82,0xe0,0x1, 0x1f,0xac,0xe0,0x2, 0x8c,0x6f,0x38,0x82,0xe0,0x1, +0x1f,0xac,0xe0,0x2, 0x8c,0x7f,0x38,0x82,0xe0,0x1, 0x1f,0xac,0xe0,0x2, 0x8c,0x3f, +0x38,0x82,0xe0,0x1, 0x1f,0xac,0xe0,0x2, 0x8c,0x4f,0x38,0x82,0xe0,0x1, 0x1f,0xac, +0xe0,0x2, 0x8c,0x5f,0x38,0x82,0xe0,0x1, 0x14,0x7e,0x38,0x82,0xe0,0x2, 0x1f,0x73, +0xe0,0x2, 0x1f,0xda,0xa6,0xe, 0x15,0xfe,0xa6,0xcc,0x97,0xf, 0xe2,0x0, 0xc6,0x81, +0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0xfd,0xa6,0xcc,0x97,0xf, 0x36,0xc9,0xe2,0x0, +0xc6,0x82,0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0x77,0x97,0xf, 0x3d,0xe8,0xe3,0xff, +0xc7,0x7b,0xb7,0xf, 0xe7,0xff,0x17,0x10,0xa6,0x4c,0x96,0x8f,0x3f,0x18,0x36,0x4c, +0xe2,0x0, 0xc6,0x8, 0x3e,0xda,0xe2,0x1, 0xc7,0x7f,0x3e,0xcc,0xe2,0x0, 0xcf,0xd, +0xb6,0x8f,0x9e,0x8f,0x2, 0x89,0xea,0x15,0x7f,0x98,0xe9,0xff,0xc7,0xff,0x37,0x22, +0x3f,0x1f,0xa7,0x8e,0x3f,0x82,0xe0,0x1, 0x14,0x7f,0x38,0x82,0x3c,0x6d,0xe2,0x1, +0xc4,0x7f,0x38,0x82,0xe0,0x8, 0x36,0xc8,0x38,0x82,0xe0,0x1, 0x1f,0xb1,0xa7,0x8f, +0xe0,0x1, 0xa4,0x7f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x1, 0x1f,0xde,0xa7,0x8f, +0xa4,0x5f,0x34,0x48,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x1, 0x1e,0xe6,0x16,0x1, +0x8f,0xd, 0xe0,0x1, 0x1f,0xe0,0x3e,0x1e,0xae,0xd, 0xe0,0x1, 0x1e,0xac,0x3e,0x9e, +0xe0,0x4, 0x8f,0x4f,0x8c,0xd, 0xc7,0x1, 0xe0,0x4, 0xaf,0x4f,0xe0,0x4, 0x8f,0x4f, +0x2f,0x6, 0xe0,0x4, 0x8f,0x3f,0xc7,0x1, 0xe0,0x4, 0xaf,0x3f,0xe2,0x0, 0xcd,0xfd, +0x1, 0xcd,0xe0,0x1, 0x1f,0xae,0xe0,0x0, 0x17,0x7c,0xaf,0xf, 0x38,0x82,0xe2,0x0, +0xcc,0x7b,0x1, 0x84,0x3c,0x69,0xe7,0xfd,0x0, 0xf5,0x38,0x82,0xe2,0x1, 0xcc,0x2d, +0x1, 0x7, 0xe2,0x1, 0xcc,0x2e,0x1, 0x83,0xe7,0xfd,0x0, 0xf9,0x38,0x82,0xe0,0x2, +0x1f,0xd1,0x17,0x0, 0xb7,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xd3,0xe1,0xff,0x17,0x7e, +0xa7,0x8f,0x3f,0x58,0x3f,0x9e,0x97,0x8f,0xe2,0x0, 0xc4,0x1, 0xc7,0x81,0xe3,0xff, +0xc7,0xff,0xe2,0x0, 0xcc,0x0, 0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0x37,0xc8,0xe0,0x68, +0x39,0x2f,0x38,0x82,0x8, 0xb1,0x2c,0x17,0xe0,0x0, 0x1f,0xa3,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0xe0,0x0, 0x1, 0x48,0x3c,0x69,0xe0,0x4, 0xd6,0xa3,0xe0,0x1, 0x1f,0xa8, +0x9f,0x8f,0x27,0x88,0xe0,0x1, 0x1f,0x60,0xe0,0x1, 0x8f,0xee,0xcf,0x82,0xe0,0x1, +0xaf,0xee,0x8, 0xe1,0xe2,0x0, 0xcc,0xf, 0x1, 0x3b,0xe2,0x0, 0xcc,0x12,0xe0,0x0, +0x1, 0x52,0xe2,0x0, 0xcc,0x13,0xe0,0x0, 0x1, 0x53,0xe2,0x0, 0xcc,0x11,0x1, 0x3e, +0xe2,0x0, 0xcc,0x1, 0xe0,0x2, 0x1, 0x1b,0xe2,0x0, 0xcc,0x9, 0xe0,0x2, 0x1, 0x35, +0xe2,0x0, 0xcc,0x5b,0xe0,0x0, 0x5, 0xce,0xe7,0xff,0x17,0x94,0x3f,0x98,0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x5, 0xdb,0xe7,0xff,0x17,0x92,0x3f,0x98,0xe2,0x0, 0xcf,0x81, +0xe0,0x3, 0x5, 0xb9,0xe7,0xff,0x17,0x90,0xe0,0xf, 0x3f,0x98,0xe2,0x0, 0xcf,0x8f, +0xe0,0x2, 0x2, 0xe8,0xe2,0x0, 0xcc,0x7b,0xe0,0x3, 0x1, 0x5e,0xe0,0x1, 0x1f,0xa8, +0x0, 0xc0,0xe0,0x2, 0x1f,0xa8,0x8f,0x8f,0xe7,0xff,0x2f,0xb7,0x8, 0xe1,0xe0,0x0, +0x1f,0xa3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x1f,0xe0,0x1, 0x1f,0xe0,0x17,0x1, +0xe0,0x1, 0xaf,0x7f,0xe0,0x2, 0xaf,0xf, 0x8, 0xe1,0xe2,0x0, 0xcc,0x81,0x1, 0x29, +0xe7,0xff,0x2c,0xb1,0xe0,0x1, 0x1f,0xd1,0xa7,0xf, 0xe0,0x2, 0x1f,0xa5,0xbf,0xf, +0x8, 0xe1,0xe0,0x1, 0x1f,0xe0,0xe0,0x2, 0xac,0xaf,0x8, 0xe1,0xe0,0x1, 0x1f,0xe0, +0xe0,0x2, 0xac,0xbf,0x8, 0xe1,0xe0,0x2, 0x1f,0xa8,0x8f,0x8f,0x2f,0xdf,0x8, 0xe1, +0xe2,0x0, 0xcc,0x30,0xe0,0x1, 0x1, 0x6f,0xe2,0x0, 0xcc,0x53,0x2, 0x98,0xea,0x15, +0x7f,0xd0,0xe9,0xff,0xc7,0xff,0xe0,0xe, 0x34,0x22,0x3f,0x9e,0xa7,0x8f,0x3f,0x82, +0xe0,0x1, 0x1f,0xe0,0xe0,0x2, 0x8f,0x1f,0xe7,0xff,0x2f,0x5, 0xe0,0x2, 0xac,0x9f, +0xe7,0xff,0x16,0x80,0x87,0xf, 0x3f,0x4d,0xaf,0xf, 0x8, 0xe1,0xe0,0x0, 0x1f,0xa3, +0x3e,0xe8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x62,0x17,0xf8,0xe0,0x1, +0x1f,0x60,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0x3e,0x9e,0xe2,0x0, 0xcf,0xaf,0xac,0x8d, +0x2, 0x89,0xea,0x18,0x7e,0xa0,0xe9,0xff,0xc6,0xff,0x37,0xa2,0x3f,0x9d,0xa7,0x8f, +0x3f,0x82,0xe0,0x1, 0x1f,0xa8,0x17,0x48,0x3f,0x18,0xe2,0x0, 0xcf,0x1e,0xe0,0x2, +0x5, 0x99,0xe2,0x0, 0xcc,0x57,0xe0,0x2, 0x5, 0x99,0x9f,0xf, 0xe0,0x4, 0xcf,0x0, +0xb7,0xf, 0xe7,0xfe,0x0, 0xc7,0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xcf,0x8, 0xb7,0xf, +0xe7,0xfe,0x0, 0xc0,0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xcf,0x4, 0xb7,0xf, 0xe7,0xfe, +0x0, 0xb9,0xe0,0x4, 0x87,0xbe,0xe0,0x1, 0x1f,0x66,0xe0,0x1, 0x1f,0xa8,0xac,0x8e, +0xe7,0xfe,0x0, 0xb0,0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xe0,0x40,0xcf,0x0, 0xb7,0xf, +0x0, 0xd3,0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xe0,0x80,0xcf,0x0, 0xb7,0xf, 0x0, 0xcc, +0xe0,0x3, 0x8f,0xce,0xe0,0x2, 0x1f,0x51,0x37,0xa8,0x3f,0x99,0x37,0xa1,0xb7,0x8e, +0xe0,0x1, 0x1f,0xa8,0xe7,0xfe,0x0, 0x96,0xe0,0x3, 0x8f,0xae,0xe0,0x2, 0x1f,0x34, +0x37,0xa8,0x3f,0x99,0x37,0xa1,0xb7,0x8e,0x97,0xe, 0xe0,0x0, 0x1f,0xb3,0xb7,0xf, +0xe7,0xfe,0x0, 0xc6,0xe0,0x3, 0x8f,0x8e,0x37,0xa8,0x3c,0x9f,0xe0,0x2, 0x1f,0xc8, +0xb4,0x8f,0xe0,0x1, 0x1f,0xa8,0xe7,0xfd,0x0, 0xfd,0xe0,0x1, 0x1f,0xb1,0x15,0xfb, +0xa6,0xf, 0xe0,0x1, 0x1f,0xa8,0xa7,0x4c,0xa6,0xcc,0x37,0x42,0xe2,0x0, 0xc7,0x1, +0xe4,0x0, 0xcf,0x1, 0x37,0x22,0x3e,0xdb,0x3f,0x4d,0xbf,0x4c,0xe7,0xfd,0x0, 0xea, +0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xcf,0x2, 0xb7,0xf, 0xe7,0xfd,0x0, 0xe3,0xe0,0x1, +0x1f,0xa8,0x9f,0xf, 0xcf,0x1, 0xb7,0xf, 0xe7,0xfd,0x0, 0xdc,0xe0,0x1, 0x1f,0xa8, +0x9f,0xf, 0xe0,0x2, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfe,0x0, 0xff,0xe0,0x1, 0x1f,0xa8, +0x9f,0xf, 0xcf,0x10,0xb7,0xf, 0xe7,0xfd,0x0, 0xcd,0xe0,0x1, 0x1f,0xda,0x8f,0x8f, +0x2f,0x87,0xe0,0x1, 0x1f,0xd1,0xa7,0xf, 0xe0,0x2, 0x1f,0xa5,0xbf,0xf, 0x17,0x0, +0xe0,0x2, 0x1f,0xd1,0xe0,0x1, 0x1e,0xe0,0xb7,0xf, 0xe2,0x1, 0xcc,0xad,0xac,0x9d, +0xe7,0xff,0x1, 0x2f,0xe2,0x1, 0xcc,0xae,0xe7,0xfd,0x1, 0xf2,0xdd,0x7f,0xe0,0x1, +0x1f,0xa8,0xe7,0xfd,0x0, 0xaf,0xe2,0x0, 0xcc,0x85,0xe7,0xfd,0x2, 0xb4,0xe0,0x1, +0x1f,0x60,0xe0,0x1, 0xac,0x9e,0xe0,0x0, 0x2c,0xfb,0xe0,0x2, 0xac,0xde,0xe7,0xfd, +0x0, 0xdf,0xe0,0x1, 0x1f,0x60,0xe0,0x6, 0x8f,0x8e,0xe0,0x2f,0x3c,0x8f,0xe7,0xfd, +0x2f,0xa2,0x17,0x82,0xe1,0x2f,0x3c,0x9f,0xe7,0xfd,0x2f,0x9d,0xe0,0x0, 0x1f,0xa3, +0x16,0xb0,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0xd3,0xe0,0x2, 0x1f,0xa8, +0x8f,0x8f,0xe7,0xfe,0x2f,0x9d,0xe2,0x0, 0xcc,0x4, 0xe7,0xfd,0x1, 0xc, 0xe2,0x0, +0xcc,0x30,0xe7,0xfe,0x1, 0x95,0x8, 0xe1,0xe0,0x1, 0x1f,0xa8,0xe0,0x0, 0x1e,0x33, +0x9f,0xf, 0x15,0x81,0xe0,0x1, 0xcf,0x0, 0xb7,0xf, 0xe2,0x0, 0xcc,0x6d,0xe0,0x2, +0x1f,0x53,0x9e,0x8c,0xa7,0xe, 0x3d,0x9d,0xb5,0x8c,0x3f,0x1d,0xac,0x8e,0xe7,0xfc, +0x1, 0xe9,0xe0,0x1, 0x1f,0x2e,0xe0,0x0, 0x16,0xec,0xae,0x8e,0xe7,0xfc,0x0, 0xe2, +0xe2,0x1, 0xcc,0x6, 0xe0,0x0, 0x1, 0x7e,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x11, +0xe2,0x1, 0xcc,0x8, 0xe7,0xfd,0x1, 0x14,0xe2,0x1, 0xcc,0xb, 0xe0,0x1, 0x1, 0x23, +0xe2,0x1, 0xcc,0xc, 0xe0,0x1, 0x1, 0x33,0xe2,0x1, 0xcc,0xd, 0xe0,0x1, 0x1f,0xa8, +0xe7,0xfc,0x1, 0xc8,0xe0,0x2, 0x1f,0x73,0x16,0x60,0xa6,0x8e,0xe2,0x0, 0xc4,0x9f, +0xe0,0x1, 0xa7,0x5d,0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x5d,0xe7,0xfc,0x0, 0xba, +0x17,0x1, 0x3f,0x58,0xe0,0x0, 0x2f,0x4b,0xe2,0x0, 0xcc,0xa, 0xe7,0xfc,0x1, 0xb2, +0x9f,0xf, 0xe0,0x8, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfc,0x0, 0xac,0xe2,0x0, 0xcc,0x82, +0xe0,0x0, 0x1, 0x58,0xe0,0x1, 0x17,0xfd,0x3f,0xd9,0xe2,0x0, 0xcf,0x81,0x1, 0x6, +0xe2,0x0, 0xcc,0x84,0xe7,0xfc,0x1, 0xdc,0x17,0x82,0xe0,0x2, 0xaf,0xde,0xe7,0xfc, +0x0, 0xd7,0xe0,0x1, 0x1f,0xa8,0xe0,0x1, 0x1e,0xe0,0x9f,0xf, 0xcf,0x40,0xb7,0xf, +0xe0,0x3, 0x8f,0xd, 0xe0,0x3, 0x8d,0x9d,0xe0,0x3, 0x8e,0x1d,0x37,0x28,0xc6,0x1, +0xe0,0x3, 0xae,0x1d,0x3f,0x1b,0xe0,0x3, 0x8e,0x1d,0xe3,0xff,0xc7,0x7f,0x2e,0x6, +0xe0,0x3, 0x8e,0xd, 0xc6,0x1, 0xe0,0x3, 0xae,0xd, 0xe2,0x0, 0xcc,0x6f,0xe0,0x2, +0x1e,0xd9,0xa6,0x8d,0x3f,0x1d,0xac,0x8e,0xe7,0xfb,0x1, 0xf4,0xe0,0x1, 0x1f,0x2e, +0xe0,0x0, 0x16,0xee,0xae,0x8e,0xe7,0xfb,0x0, 0xed,0x9f,0xf, 0xcf,0x20,0xb7,0xf, +0xe7,0xfb,0x0, 0xe8,0x3c,0x69,0xdc,0xa5,0xe0,0x1, 0x1f,0xa8,0xe7,0xfb,0x0, 0xe2, +0xe0,0x1, 0x1f,0xb1,0x16,0x78,0xa6,0x8f,0xe2,0x0, 0xc4,0x87,0xe0,0x1, 0xa7,0x2d, +0xe0,0x1, 0x1f,0xa8,0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x2d,0xe7,0xfb,0x0, 0xd2, +0x16,0x83,0xe0,0x2, 0xae,0xde,0xe0,0x1, 0x1f,0xa8,0xe7,0xfb,0x0, 0xcb,0xe0,0x1, +0x1f,0xb1,0x17,0x3, 0xa6,0x8f,0x3f,0x59,0xe0,0x1, 0xa7,0xad,0xe7,0x9f,0x16,0x7f, +0x37,0x2c,0x3f,0xdc,0x3f,0xce,0xe0,0x1, 0xbf,0xad,0xe7,0xfb,0x0, 0xf9,0xe0,0x6, +0xac,0x8e,0xe0,0x1, 0x1f,0xa8,0x9f,0xf, 0xe1,0x0, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfb, +0x0, 0xb1,0xe0,0x1, 0x1f,0xb1,0x15,0xe0,0xa7,0xf, 0x16,0x9f,0xe0,0x1, 0xa6,0x3e, +0x3e,0xd9,0x3e,0x5b,0xe0,0x1, 0xbe,0x3e,0xe0,0x1, 0xa6,0x3e,0xe0,0x1, 0x1f,0xa8, +0x3e,0xcc,0xe0,0x1, 0xbe,0xbe,0xe7,0xfb,0x0, 0x9d,0xe0,0x2, 0x1f,0xcc,0x3c,0x69, +0xac,0x8f,0xe0,0x2, 0xd4,0x93,0xe7,0xfb,0x0, 0xd3,0xe2,0x0, 0xcc,0x5b,0x3f,0xe8, +0xe0,0x0, 0x5, 0xf4,0xe7,0xff,0x17,0x16,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, +0x5, 0xf2,0xe0,0x0, 0x17,0x64,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, +0xe0,0x1, 0x5, 0x8c,0xe7,0xff,0x17,0x12,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, +0x5, 0x99,0xe7,0xff,0x17,0x14,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xea, +0xe7,0xff,0x17,0x18,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xc3,0xe0,0x0, +0x17,0x77,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xe0, +0xe7,0xff,0x17,0x10,0x3f,0x18,0xe2,0x0, 0xcf,0xf, 0xe0,0x1, 0x5, 0xee,0xe0,0x0, +0x17,0x7f,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x8c, +0xe2,0x1, 0xcc,0x6, 0xe0,0x1, 0x1, 0x63,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x6f, +0xe2,0x1, 0xcc,0x8, 0xe0,0x2, 0x1, 0x3, 0xe2,0x1, 0xcc,0xb, 0xe0,0x2, 0x1, 0x1, +0xe2,0x1, 0xcc,0xc, 0xe0,0x2, 0x1, 0x5, 0xe2,0x1, 0xcc,0xd, 0xe0,0x2, 0x1, 0x5, +0xe0,0x0, 0x17,0x70,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x4, 0xe0,0x1, +0x2, 0xdf,0xe2,0x1, 0xcc,0x12,0xe0,0x2, 0x1, 0x12,0xe0,0x1, 0x5, 0xfe,0xe2,0x1, +0xcc,0x13,0xe0,0x2, 0x1, 0x2, 0xe2,0x1, 0xcc,0x14,0xe0,0x2, 0x1, 0x83,0xe0,0x1, +0x1f,0xac,0xe0,0x2, 0x8c,0x7f,0x38,0x82,0xe0,0x1, 0x1f,0x60,0x3f,0x9e,0x8c,0xf, +0x38,0x82,0xe0,0x2, 0x1e,0x51,0xe0,0x2, 0x1f,0x25,0x9e,0x8c,0xa7,0xe, 0x15,0x81, +0x3d,0x9d,0xe2,0x0, 0xcf,0xeb,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0x3e,0x38,0x82, +0xe0,0x2, 0x1e,0x34,0xe0,0x2, 0x1f,0x53,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d, +0xe2,0x0, 0xcf,0xed,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xf2,0xe0,0x1, 0x1f,0xae, +0xe0,0x0, 0x17,0x6c,0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1e,0x63,0xe0,0x0, 0x1f,0x35, +0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x9d,0xb5,0x8c,0x3f,0x1d, +0x8c,0xe, 0x1, 0xde,0xe0,0x1, 0x1f,0xae,0xe7,0xff,0x17,0x1c,0xaf,0xf, 0x38,0x82, +0xe0,0x2, 0x1e,0x48,0xe0,0x2, 0x1f,0x59,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d, +0xe2,0x0, 0xcf,0xef,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xca,0xe0,0x1, 0x1f,0xae, +0xe0,0x0, 0x17,0x6e,0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xae,0xe0,0x0, 0x17,0x6a, +0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x60,0x16,0x60,0xe0,0x2, 0x8e,0xfe,0x3e,0x1d, +0xe2,0x0, 0xce,0x1f,0xe0,0x0, 0x2, 0xdb,0xe0,0x1, 0x1e,0x2a,0x3e,0x9c,0xe0,0x44, +0x8c,0xd, 0xe0,0x2, 0x8e,0xfe,0xe2,0x1, 0xcf,0x82,0xc6,0x81,0xe0,0x2, 0xae,0xfe, +0xe7,0xff,0x1, 0xa7,0xe0,0x1, 0x1f,0xae,0xe7,0xff,0x17,0x1, 0xaf,0xf, 0x38,0x82, +0xe0,0x2, 0x1e,0x34,0xe0,0x2, 0x1f,0x53,0x9e,0x8c,0xa7,0xe, 0xe1,0xff,0x15,0xfe, +0x3d,0xdd,0x3f,0x1b,0x97,0xe, 0xe2,0x0, 0xc6,0x81,0xc7,0x1, 0xe3,0xff,0xc7,0x7f, +0xe2,0x0, 0xce,0x80,0x9d,0x8c,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0x37,0x48,0x16,0x81, +0x3e,0x9b,0xe0,0x68,0x39,0x2e,0xe2,0x0, 0xcf,0xe9,0xb6,0x8c,0xe7,0xff,0x1, 0x81, +0xe0,0x1, 0x1f,0xae,0xe0,0x0, 0x17,0x68,0xaf,0xf, 0x38,0x82,0xe0,0x0, 0x1e,0x30, +0xe0,0x1, 0x1f,0x6e,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x8a, +0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0xe7,0xfe,0x1, 0xec,0xe0,0x1, 0x1f,0xae,0xe7,0xff, +0x17,0x9, 0xaf,0xf, 0x38,0x82,0xe7,0xf7,0x0, 0xc3,0xe0,0x1, 0x1f,0xb1,0xa7,0x8f, +0xe0,0x1, 0xa4,0x2f,0xe2,0x0, 0xc4,0x7, 0x38,0x82,0xe0,0x2, 0x8e,0x7e,0xe0,0x1, +0x1e,0xa3,0x3e,0x9c,0x8c,0xd, 0xe7,0xff,0x0, 0xa6,0xe0,0x1, 0x1f,0xb1,0xa7,0x8f, +0xe0,0x1, 0xa4,0x2f,0x34,0x4c,0xe2,0x0, 0xc4,0x3, 0x38,0x82,0xe2,0x1, 0xcf,0xfe, +0x14,0x0, 0xe7,0xfe,0x1, 0xc6,0xe0,0x2, 0x1f,0x8d,0x17,0x5, 0x8f,0x8f,0x3f,0x3f, +0xe0,0x2, 0x1f,0xed,0x3f,0x9e,0x8c,0xf, 0x38,0x82,0x14,0x0, 0x38,0x82,0xe0,0x1, +0x1f,0xb1,0xa7,0x8f,0xe0,0x1, 0xa4,0x3f,0xe2,0x0, 0xc4,0x1f,0x38,0x82,0xe0,0x2, +0x1f,0xcc,0x8c,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xe0,0x1, 0xa4,0x5f, +0xe2,0x0, 0xc4,0x1f,0x38,0x82,0xe2,0x1, 0xcc,0x11,0x1, 0x8b,0xe0,0x1, 0x1f,0xac, +0xe0,0x2, 0x8c,0x4f,0x38,0x82,0xe0,0x1, 0x1f,0xac,0xe0,0x2, 0x8c,0x6f,0x38,0x82, +0xe0,0x1, 0x1f,0xac,0xe0,0x2, 0x8c,0x3f,0x38,0x82,0xe0,0x1, 0x1f,0xac,0xe0,0x2, +0x8c,0x5f,0x38,0x82,0x8, 0xb3,0xe0,0x1, 0x19,0x60,0xe0,0x2, 0x19,0xbf,0xe0,0x3, +0x8f,0xe2,0xe0,0x1, 0x8f,0x3, 0x3f,0x7f,0x1, 0x16,0xe0,0x3, 0x8f,0xe2,0xe0,0x1, +0x8c,0x93,0xe2,0x0, 0xc7,0xbf,0xe0,0x3, 0xaf,0xe2,0xe0,0x3, 0x8f,0xe2,0x3c,0x6f, +0xe0,0x1, 0xaf,0x83,0xe0,0x2, 0xdd,0xaa,0xe0,0x2, 0x1f,0xa8,0x87,0x8f,0xe2,0x0, +0xc7,0x81,0x2f,0xa2,0xe0,0x3, 0x8f,0xf2,0xe0,0x1, 0x8f,0x13,0x3f,0x7f,0x1, 0x16, +0xe0,0x3, 0x8f,0xf2,0xe0,0x1, 0x8c,0x3, 0xe2,0x0, 0xc7,0xbf,0xe0,0x3, 0xaf,0xf2, +0xe0,0x3, 0x8f,0xf2,0x3c,0xef,0xe0,0x1, 0xaf,0x93,0xe0,0x2, 0xdd,0x8f,0xe0,0x2, +0x1f,0xa8,0x87,0x8f,0xe2,0x0, 0xc7,0x81,0x27,0x82,0x9, 0xe1,0xe0,0x1, 0x8c,0x13, +0x9, 0xa1,0xe0,0xd, 0x0, 0x99,0xe0,0x1, 0x8c,0x3, 0xd6,0x95,0x0, 0xdc,0x8, 0xb2, +0xe0,0x1, 0x1f,0xe0,0x16,0x85,0xe0,0x5, 0x8f,0x1f,0x3e,0xb8,0xe0,0x2, 0x1f,0xed, +0x39,0x68,0x3f,0x9d,0x8c,0x3f,0xe0,0x2, 0x1f,0xcd,0x3c,0xee,0x3f,0x92,0xaf,0xf, +0xe0,0x6, 0xdb,0xd7,0xe2,0x0, 0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0x14,0x80,0x14,0x3, +0xe0,0x6, 0xdb,0xcf,0x14,0x80,0x14,0x4, 0xe0,0x6, 0xdb,0xcb,0x14,0x80,0x14,0x0, +0xe0,0x6, 0xdb,0xc7,0x9, 0x61,0xe0,0x0, 0x1f,0xb7,0x8f,0x8f,0x2f,0x82,0x38,0x82, +0xe7,0xf5,0x0, 0x89,0x17,0x86,0x34,0x23,0xe0,0x28,0x3c,0x1f,0x38,0x82,0x17,0x8b, +0x34,0x23,0xe0,0x28,0x3c,0x1f,0x38,0x82,0x8, 0xb5,0xe0,0x2, 0x19,0x6d,0xe0,0x2, +0x1a,0xec,0x3a,0x68,0xe0,0x3, 0x34,0x23,0x8c,0x32,0xaa,0x2, 0x3c,0xe3,0xe0,0x6, +0xdc,0x22,0xc1,0x5, 0x39,0x75,0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x6, 0xdc,0x1b, +0x3c,0xe3,0x14,0x4, 0xa, 0xa1,0xe0,0xd8,0x0, 0x96,0x8, 0xb5,0xe0,0x2, 0x19,0x6d, +0xe0,0x2, 0x1a,0xec,0x3a,0x68,0xe0,0x3, 0x34,0x23,0x8c,0x32,0xaa,0x12,0x3c,0xe3, +0xe0,0x6, 0xdc,0x2c,0xc1,0x5, 0x39,0x75,0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x6, +0xdc,0x25,0x3c,0xe3,0x14,0x4, 0xa, 0xa1,0xe0,0xd8,0x0, 0xa0,0x8, 0xb4,0xe0,0x2, +0x19,0x6d,0xe0,0x2, 0x1a,0x6c,0x39,0xe8,0x8c,0x32,0xa9,0xa2,0x3d,0x63,0x3c,0xe3, +0xe0,0x6, 0xdc,0x39,0xc1,0x5, 0x39,0x74,0x1, 0xf8,0x3d,0x63,0x3c,0xe3,0x14,0x3, +0xe0,0x6, 0xdc,0x31,0x3d,0x63,0x3c,0xe3,0x14,0x4, 0xa, 0x21,0xe0,0xd8,0x0, 0xab, +0x8, 0xb2,0xe0,0x0, 0x1f,0xb7,0x39,0x68,0x8f,0x8f,0x2f,0xa2,0xe0,0x1, 0x1f,0xe0, +0x16,0x85,0xe0,0x3, 0x9f,0x4f,0x3e,0xb2,0xe0,0x2, 0x1f,0xed,0xe2,0x1, 0xc7,0x7f, +0x3f,0x9d,0x8c,0x3f,0x3c,0xee,0xaf,0x4f,0xe0,0x6, 0xdb,0x28,0xe2,0x0, 0xc9,0x1, +0x1, 0x2, 0x9, 0x61,0x14,0x8a,0x14,0x3, 0xe0,0x6, 0xdb,0x20,0x14,0x8a,0x14,0x4, +0xe0,0x6, 0xdb,0x1c,0x14,0x85,0x14,0x0, 0x9, 0x21,0xe0,0xd6,0x0, 0x97,0xda,0xa, +0x0, 0xde,0x16,0x83,0xe0,0x2, 0x1f,0x89,0x3e,0xb8,0xe0,0x1, 0x1f,0x60,0xe0,0xc, +0x3f,0x9d,0xe0,0x4, 0x8d,0x8e,0x8d,0xc, 0x3d,0x7b,0x1, 0x4, 0xe0,0x4, 0x8d,0x8e, +0xad,0x8c,0xe0,0xc, 0x3f,0x9d,0xe0,0x4, 0x8d,0x9e,0x8d,0x1c,0x3d,0x7b,0x1, 0x4, +0xe0,0x4, 0x8d,0x9e,0xad,0x9c,0x3f,0x9d,0x8e,0x2f,0xe0,0x4, 0x8e,0xae,0x3e,0x7d, +0x1, 0x4, 0xe0,0x4, 0x8f,0x2e,0xaf,0x2f,0xe0,0xf, 0x0, 0xc9,0x8, 0xb3,0xe0,0x2, +0x1f,0x73,0xe0,0x2, 0x19,0xd, 0xa7,0x8e,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x86, +0x8f,0x82,0xe2,0x0, 0xcf,0x82,0x1, 0x2, 0x17,0x81,0xe0,0x0, 0x19,0xb7,0xaf,0x82, +0xaf,0x83,0x8c,0x82,0x24,0x94,0xe2,0x0, 0xcc,0x82,0x1, 0x89,0xa7,0x8e,0xa7,0xcf, +0xe2,0x0, 0xc7,0x81,0x27,0x83,0xac,0x82,0xac,0x83,0x9, 0xe1,0x14,0x81,0x14,0x0, +0xe0,0x0, 0xd7,0xda,0x17,0x81,0xaf,0x82,0xaf,0x83,0x9, 0xe1,0x3c,0x69,0x9, 0xa1, +0xe0,0xf, 0x0, 0xd2,0x8, 0xb3,0xe0,0x1, 0x1f,0xd1,0xe0,0x1, 0x19,0x60,0xa6,0x8f, +0xe0,0x2, 0x1f,0x25,0xe0,0x2, 0x8f,0xd2,0xbe,0x8e,0xe0,0x0, 0x27,0xfd,0xe0,0x2, +0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x77,0xe0,0x2, 0x8f,0xd2,0xe0,0x2, +0x19,0x8d,0xe2,0x0, 0xcf,0x83,0x1, 0x86,0xe0,0x2, 0x1f,0x70,0xe0,0x2, 0x1f,0xd9, +0xbf,0xf, 0x16,0x0, 0xe0,0x2, 0x1f,0xa8,0xe0,0x2, 0x1f,0x3f,0x87,0x8f,0xe0,0x3, +0x8f,0x2e,0xe2,0x0, 0xc7,0x81,0xe0,0x2, 0x1e,0xc8,0x3f,0x7f,0xb6,0xd, 0xe0,0x0, +0x1, 0x69,0xe0,0x2, 0x1f,0x3e,0xe0,0x2, 0x1f,0xd3,0xbf,0xf, 0x16,0x0, 0x8f,0x3, +0xe0,0x2, 0x1f,0xed,0xe4,0x0, 0xc7,0x5, 0x3f,0x1f,0x87,0xe, 0xe0,0x6, 0xaf,0x12, +0x8f,0x3, 0xe4,0x0, 0xc7,0x5, 0x3f,0x1f,0x87,0x1e,0xe0,0x6, 0xaf,0x22,0x8f,0x3, +0xe4,0x0, 0xc7,0x5, 0x3f,0x1f,0x87,0x2e,0xe0,0x6, 0xaf,0x42,0x8f,0x3, 0xe4,0x0, +0xc7,0x5, 0x3f,0x1f,0x87,0x3e,0xe0,0x6, 0xaf,0x52,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, +0x3f,0x9e,0x8f,0xcf,0xe0,0x3, 0xb7,0xc2,0x17,0x80,0xe0,0x6, 0xaf,0xb2,0xe0,0x3, +0xb6,0x32,0x8f,0x3, 0xe0,0x2, 0x1f,0xcd,0x8c,0x3, 0x3f,0x9e,0x87,0x8f,0xe0,0x5, +0xaf,0x92,0xd7,0x34,0x8f,0x3, 0xe0,0x2, 0x1f,0x89,0xe4,0x0, 0xc7,0x3, 0x3f,0x1f, +0x87,0xe, 0xe0,0x4, 0xaf,0x2, 0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x1f,0x87,0x1e, +0xe0,0x4, 0xaf,0x12,0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x9e,0x87,0xaf,0xe0,0x4, +0xaf,0xa2,0x81,0x83,0xe0,0x0, 0x1f,0xb7,0xe0,0x6, 0xa9,0x82,0x87,0x8f,0xe0,0x1, +0xaf,0xc2,0x9, 0xe1,0xe0,0x2, 0x19,0x8d,0x8f,0x83,0xe2,0x0, 0xcf,0x82,0xe7,0xff, +0x1, 0x8d,0xe0,0x2, 0x1f,0x6f,0xe0,0x2, 0x1f,0xd9,0xbf,0xf, 0xe7,0xff,0x0, 0x8b, +0xe0,0x2, 0x1f,0x3d,0xe0,0x2, 0x1f,0xd3,0xbf,0xf, 0xe7,0xff,0x0, 0x99,0x8, 0xb1, +0xe0,0x2, 0x1f,0xd1,0x17,0x0, 0x14,0x1, 0xb7,0xf, 0xe0,0x1, 0xd0,0x32,0xdf,0x2f, +0xe0,0x0, 0x1f,0xb7,0x8c,0xf, 0xe0,0x0, 0xde,0x62,0x8, 0xa1,0xe7,0xfe,0x0, 0xd4, +0x8, 0xb7,0xf8,0x0, 0xc, 0x38,0xe0,0x2, 0x1f,0x8d,0xe0,0x1, 0x19,0xe0,0x8a,0xf, +0xe0,0x1, 0x19,0x28,0x13,0x5, 0xe0,0x2, 0x1a,0xed,0x3b,0x34,0xe0,0x6, 0x8d,0x13, +0xe0,0x6, 0x8d,0xa3,0xe0,0x6, 0x8e,0x43,0xe0,0x3, 0x9e,0xc3,0x9f,0x2, 0xe0,0xf, +0x3a,0x96,0xf0,0x0, 0x8c,0xf, 0x8b,0x9f,0xad,0xf, 0xe2,0x2, 0xc7,0x0, 0xad,0x9f, +0xae,0x2f,0xae,0xcf,0xe0,0x1, 0x2f,0x3f,0x9f,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x92, +0x9f,0x82,0xe3,0xff,0xc7,0xfe,0xb7,0x82,0xe0,0x6, 0x8f,0x93,0x37,0xa3,0xe2,0x0, +0xcf,0x86,0xe0,0x0, 0x2, 0x78,0xe0,0xf, 0x3a,0x96,0xf0,0x0, 0xac,0xf, 0xf0,0x6, +0xac,0x13,0x9f,0x82,0xe2,0x0, 0xc7,0x82,0x27,0x90,0x9f,0x82,0xe3,0xff,0xc7,0xfd, +0xb7,0x82,0xe0,0x6, 0x8f,0xa3,0x37,0xa3,0xe2,0x0, 0xcf,0x8b,0xe0,0x0, 0x2, 0x6e, +0x3a,0x96,0xab,0x95,0xe0,0x6, 0xab,0xa3,0x9f,0x82,0xe2,0x0, 0xc7,0x84,0xe0,0x1, +0x2f,0x9a,0x9f,0x82,0xe2,0x0, 0xc7,0x88,0xe0,0x1, 0x2f,0xa4,0x9f,0x82,0xe2,0x0, +0xc7,0xa0,0xe0,0x1, 0x2f,0xab,0x9f,0x82,0xe2,0x0, 0xc7,0xc0,0xe0,0x0, 0x2f,0xf9, +0x9f,0x82,0xe2,0x1, 0xc7,0x80,0xe0,0x0, 0x2f,0xed,0x9f,0x82,0xe2,0x4, 0xc7,0x80, +0x27,0xa6,0x9f,0x82,0xe0,0x2, 0x1f,0x73,0xe3,0xfb,0xc7,0xff,0xa6,0x8e,0xb7,0x82, +0xe7,0xbf,0x17,0x7f,0xe0,0x1, 0xa7,0xed,0xe7,0xc0,0x15,0x80,0x3f,0xde,0xe0,0x1, +0xbf,0xed,0xe0,0x0, 0x1f,0xb1,0xe0,0xb, 0x8f,0x23,0xa6,0xf, 0xe4,0x0, 0xc7,0x32, +0xe0,0x1d,0xc6,0x40,0xa7,0xfc,0xe2,0x3f,0xc7,0x7e,0x3f,0xdb,0x3f,0xce,0xbf,0xfc, +0xe0,0x1, 0xa7,0xed,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x9f,0x82,0xe2,0x8, +0xc7,0x80,0x27,0x85,0x9f,0x82,0xe3,0xf7,0xc7,0xff,0xb7,0x82,0x9f,0x82,0xe2,0x20, +0xc7,0x80,0x27,0x85,0x9f,0x82,0xe3,0xdf,0xc7,0xff,0xb7,0x82,0x9f,0x82,0xe2,0x40, +0xc7,0x80,0x2f,0xa8,0x9f,0x82,0xe2,0x80,0xc7,0x80,0x2f,0x9a,0xf8,0x0, 0xc, 0x28, +0xb, 0xe1,0xe0,0x6, 0x8c,0x13,0xdd,0xe1,0xe0,0x0, 0x1f,0xb7,0x8f,0x8f,0xe7,0xff, +0x27,0x8a,0xd8,0x58,0xe7,0xff,0x0, 0x87,0xe0,0x6, 0x8c,0x23,0xdd,0xef,0xe0,0x0, +0x1f,0xb7,0x8f,0x8f,0xe7,0xff,0x27,0x92,0xd8,0x4d,0xe7,0xff,0x0, 0x8f,0x9f,0x82, +0x3c,0x64,0xe3,0x7f,0xc7,0xff,0xb7,0x82,0xf8,0x0, 0xc, 0x28,0xb, 0xa1,0xe7,0xfa, +0x0, 0xcb,0x9f,0x82,0x3c,0x64,0xe3,0xbf,0xc7,0xff,0xb7,0x82,0xde,0x33,0x0, 0xd3, +0x9f,0x82,0xe3,0xfe,0xc7,0xff,0xb7,0x82,0xd5,0x6b,0xe7,0xff,0x0, 0x90,0x9f,0x82, +0xe0,0x2, 0x1c,0x70,0xe3,0xff,0xc7,0xbf,0x3c,0xe4,0xb7,0x82,0xd4,0x5a,0xe7,0xff, +0x0, 0x81,0x9f,0x82,0x3c,0x64,0xe3,0xfd,0xc7,0xff,0xb7,0x82,0xdd,0x71,0xe7,0xfe, +0x0, 0xbd,0x9f,0x82,0x3c,0x64,0xe3,0xff,0xc7,0xfb,0xb7,0x82,0x9f,0x82,0xe0,0x20, +0xcf,0x80,0xb7,0x82,0xdd,0xe6,0x9f,0x82,0xe2,0x0, 0xc7,0x88,0xe7,0xfe,0x27,0xe0, +0x9f,0x82,0xe3,0xff,0xc7,0xf7,0xb7,0x82,0xe0,0x6, 0x8c,0x43,0xdd,0xc0,0x9f,0x82, +0xe2,0x0, 0xc7,0xa0,0xe7,0xfe,0x27,0xd9,0x9f,0x82,0x3c,0x64,0xe3,0xff,0xc7,0xdf, +0xb7,0x82,0x9f,0x82,0xe0,0x4, 0xcf,0x80,0xb7,0x82,0x9f,0x82,0xe0,0x20,0xcf,0x80, +0xb7,0x82,0xdd,0xc7,0xe7,0xfe,0x0, 0xc9,0xe0,0x1, 0x1f,0x60,0x8f,0xce,0xe2,0x0, +0xcf,0x85,0x1, 0x5, 0xe2,0x0, 0xcf,0x84,0x1, 0x7, 0x38,0x82,0x17,0x81,0xaf,0xce, +0x17,0x82,0xaf,0xce,0x38,0x82,0xe7,0xef,0x0, 0xff,0xe0,0x1, 0x1f,0x60,0xe0,0x2, +0x1f,0x8d,0xe0,0x6, 0x8e,0xe, 0x8e,0x8f,0x3e,0x7d,0x1, 0x6, 0xe0,0x6, 0x87,0xe, +0xaf,0xf, 0xe7,0xfd,0x0, 0xbe,0x38,0x82,0xe0,0x1, 0x1f,0xe0,0xe0,0x1, 0x8f,0xff, +0x2f,0x82,0x38,0x82,0xe0,0xcc,0x0, 0x89,0x8, 0xb4,0xe0,0x1, 0x19,0x60,0x8f,0xc2, +0xe2,0x0, 0xcf,0x85,0x1, 0x21,0xe2,0x0, 0xcf,0x84,0x1, 0x33,0xe0,0x1, 0x8f,0xf2, +0x2f,0x98,0xe0,0x1, 0x1a,0x28,0x99,0x84,0x29,0x82,0xa, 0x61,0x14,0x1, 0xe0,0x0, +0xde,0xd8,0xe0,0x43,0x39,0x93,0xe2,0x0, 0xc9,0x80,0x4, 0x13,0xde,0xaa,0xe0,0x1, +0x8f,0xe2,0xe2,0x1, 0xc7,0xfd,0xe0,0x1, 0xaf,0xe2,0xa, 0x21,0xe0,0x1c,0x0, 0xf8, +0xe0,0x6, 0xd5,0xe3,0x0, 0xe7,0x17,0x81,0xaf,0xc2,0x17,0x82,0xaf,0xc2,0x0, 0xdf, +0x9f,0x84,0xe0,0x2, 0x1f,0xd, 0xe2,0xff,0xc7,0xff,0xb7,0x84,0xe0,0x6, 0x8e,0x82, +0x8f,0x8e,0x3e,0xff,0x1, 0x64,0xe0,0x6, 0x87,0x82,0xaf,0x8e,0xde,0x79,0x0, 0xdf, +0xef,0xff,0xd7,0xaa,0x0, 0xcc,0xe0,0x1, 0x1f,0xe0,0xe0,0x2, 0x8f,0x5f,0x27,0xc, +0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0x7, 0xe0,0x2, 0x8f,0xdf,0xe2,0x0, +0xcf,0x83,0x1, 0x12,0x38,0x82,0xe0,0x2, 0x1f,0xd, 0x8f,0xe, 0xe2,0x0, 0xcf,0x2, +0x1, 0x11,0xe0,0x2, 0x8f,0xdf,0xe0,0x2, 0x1e,0xf0,0xe0,0x2, 0x1f,0x59,0xe2,0x0, +0xcf,0x83,0xbe,0x8e,0x1, 0xf0,0xe0,0x2, 0x1f,0x70,0xe0,0x2, 0x1f,0xd9,0xbf,0xf, +0x38,0x82,0xe0,0x2, 0x8f,0xdf,0xe0,0x2, 0x1e,0xef,0xe0,0x2, 0x1f,0x59,0xe2,0x0, +0xcf,0x83,0xbe,0x8e,0x1, 0xe0,0x0, 0xf0,0x8, 0xb1,0xe0,0x2, 0x1e,0x85,0xe0,0x1, +0x1e,0x5f,0x17,0x80,0xe0,0x4, 0xaf,0xdd,0x17,0x80,0x97,0xc, 0xe3,0xfe,0xc7,0x7f, +0xb7,0xc, 0xe0,0x2, 0x1f,0x51,0xe0,0x4, 0x8e,0xdd,0xb7,0x8e,0xe0,0x2, 0x1f,0x34, +0xb7,0x8e,0xe0,0x0, 0x1f,0x33,0xb7,0x8e,0xe0,0x1, 0x1f,0xe0,0x8f,0x6f,0xe0,0x0, +0x1f,0xa1,0xae,0x8f,0xe0,0x2, 0x1f,0xbc,0xaf,0xf, 0xe0,0x2, 0xd2,0x7f,0xdd,0x83, +0xe0,0x1, 0x1f,0xd1,0xe0,0xc, 0x15,0x52,0xa4,0xf, 0xe0,0x1, 0x1f,0xd0,0xa4,0x8f, +0xe0,0x8, 0xd8,0x9a,0xe0,0x2, 0x1f,0xbb,0xe0,0x2, 0x1f,0xd, 0x8f,0x8f,0x8f,0xe, +0x37,0xde,0xe2,0x0, 0xc7,0x81,0x27,0x82,0x8, 0xe1,0x8, 0xa1,0xe0,0x1b,0x0, 0xf0, +0x38,0x82,0xe0,0x0, 0x1f,0xb7,0xe0,0x1, 0x1f,0x60,0x87,0x8f,0xe0,0x1, 0x1e,0xa6, +0xe0,0x1, 0xaf,0xce,0x14,0x3, 0x86,0x8d,0xe0,0x2, 0x1f,0xa1,0xae,0xfe,0xe0,0x2, +0x16,0xfd,0x8d,0xee,0xe0,0x2, 0x1e,0x3c,0x17,0x0, 0x3e,0x9f,0xe0,0x2, 0xc7,0xfc, +0xad,0x8c,0xaf,0xd, 0xaf,0xf, 0xe0,0x3, 0x0, 0x9f,0x8, 0xb1,0xe0,0x1, 0x1f,0xd1, +0xe0,0x0, 0x1c,0x19,0xa4,0x8f,0xe0,0xc, 0x15,0x52,0xe0,0x8, 0xd8,0x65,0xe0,0x0, +0x1e,0x18,0xe0,0x0, 0x1f,0x17,0xe0,0x0, 0x1d,0x16,0x9f,0x9e,0xe0,0x43,0x3d,0x9f, +0xe2,0x0, 0xcd,0x80,0xe0,0x41,0x3e,0xcf,0xe3,0xff,0xc6,0xff,0xe0,0x6f,0x3d,0x2d, +0xe0,0x80,0xb7,0x9e,0x9e,0x8c,0x3e,0xff,0x3, 0x82,0xb7,0x8c,0x3f,0x7a,0xc6,0x2, +0x1, 0xed,0x8, 0xe1,0x8, 0xb6,0xea,0xf, 0x7b,0x28,0xe0,0x1, 0x1a,0x60,0x99,0x6, +0xe0,0x2, 0xa9,0x44,0xe0,0x2, 0x8f,0x94,0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0x21,0x8, +0xe0,0x1, 0x1f,0x5f,0x16,0x80,0x97,0x8e,0xb6,0x86,0xcf,0x84,0xb7,0x8e,0xb, 0x61, +0x87,0x84,0xe7,0xff,0x17,0x0, 0x3f,0xce,0xe2,0x0, 0xc9,0x5, 0xaf,0x84,0x2, 0x9d, +0xe0,0x0, 0x1c,0x18,0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd8,0x5f,0xe0,0x1, +0x1c,0x58,0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd8,0x58,0xe0,0x0, 0x1c,0x19, +0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd8,0x51,0xe0,0x1, 0x1c,0x57,0xe0,0xc, +0x15,0x52,0x14,0x80,0xe0,0x8, 0xd8,0x4a,0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x0, +0xc9,0x5, 0xb1,0x6, 0x2, 0xb8,0xe0,0x2, 0x8f,0xb4,0xe0,0x2, 0x8f,0x24,0x37,0xa8, +0x3f,0x9e,0xc7,0x85,0x39,0x7f,0x1, 0xcc,0xe0,0x2, 0x1f,0x51,0x17,0x80,0xe0,0x1, +0x1e,0xe3,0xb7,0x8e,0x11,0x0, 0xb7,0x8d,0x12,0x8a,0xe0,0x0, 0x1f,0x18,0xe0,0x2, +0xaf,0x94,0x39,0xee,0xe0,0x2, 0x1f,0xa5,0xbf,0xf, 0x9a,0x3, 0xe2,0x0, 0xca,0x46, +0x5, 0x8c,0x21,0x1b,0xe0,0x40,0x9f,0x93,0x9c,0x13,0x3c,0xe5,0x3c,0x1f,0xe0,0x8, +0xd5,0xdb,0xe0,0x8, 0x3a,0x28,0xb4,0x3, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x6, +0xc9,0x29,0xc1,0x82,0x1, 0xeb,0x17,0x80,0xb7,0x86,0x17,0x1, 0xe0,0x1, 0x1f,0xda, +0xaf,0xf, 0xb, 0x61,0xdf,0x63,0x0, 0xc8,0x3f,0xe2,0x0, 0xe7,0x8, 0xb7,0xf8,0x0, +0xc, 0x3c,0xe0,0x2, 0x19,0xff,0xdf,0x1, 0x8f,0x83,0xe2,0x0, 0xcf,0x83,0xe0,0x0, +0x1, 0xe5,0xe0,0x1, 0x19,0x60,0xf0,0x2, 0x1c,0xd, 0xe0,0x2, 0x1b,0x59,0xe0,0x2, +0x1a,0xf0,0xe0,0x2, 0x1b,0xef,0xf0,0x2, 0x1d,0x3c,0xf0,0x2, 0x1c,0xa8,0xf0,0x1, +0x1e,0x51,0xf0,0x1, 0x1d,0xd7,0xe0,0x13,0x12,0x44,0x0, 0x96,0xe0,0x2, 0x8f,0xd2, +0xe2,0x0, 0xcf,0x81,0x1, 0x17,0xe0,0x2, 0x8f,0xd2,0xe2,0x0, 0xcf,0x83,0x1, 0x1f, +0x3c,0x64,0xe0,0x6, 0xd1,0x58,0x8f,0x82,0x37,0xc7,0x2f,0xa0,0xdf,0x13,0x8f,0x83, +0xe2,0x0, 0xcf,0x83,0x1, 0xba,0xde,0x61,0xe0,0x1, 0xd0,0x7, 0xe0,0x2, 0x8f,0xd2, +0x2f,0xe6,0xe8,0x0, 0x8f,0x88,0xe2,0x0, 0xcf,0x82,0x3f,0xe7,0xe0,0x6f,0x39,0xa5, +0xbf,0x86,0xe0,0x2, 0x8f,0xd2,0xe2,0x0, 0xcf,0x83,0x1, 0xe3,0x3c,0x64,0xba,0x86, +0xe0,0x6, 0xd1,0x39,0x8f,0x82,0x37,0xc7,0x27,0xe2,0x14,0x1, 0xe0,0x0, 0xdd,0x31, +0xe0,0x2, 0xd1,0x98,0xe0,0x2, 0xd8,0x4, 0xe8,0x0, 0x8f,0x8a,0xe2,0x0, 0xcf,0x81, +0x1, 0x1a,0xe0,0x2, 0x8f,0x92,0x2f,0x97,0xe8,0x0, 0x8f,0x89,0x27,0x82,0xdf,0x23, +0xe0,0x2, 0x8f,0x92,0x2f,0xcc,0x87,0x82,0xe2,0x0, 0xc7,0xff,0xaf,0x82,0xde,0xda, +0x8f,0x83,0xe2,0x0, 0xcf,0x83,0x1, 0x48,0x14,0x1, 0xf8,0x0, 0xe, 0x28,0xb, 0xa1, +0xe0,0x1a,0x0, 0x8f,0xe8,0x0, 0x8f,0x89,0x27,0xec,0xe0,0x3, 0xdd,0x16,0xe0,0x2, +0x8f,0x92,0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0xe0,0x3, 0xdb,0x64,0xe0,0x7, 0xd6,0xc8, +0xe0,0x2, 0xd2,0xb8,0xe0,0x4, 0xd8,0xf5,0x0, 0xd8,0xe8,0x0, 0xa4,0x8c,0xe0,0xc, +0x15,0x52,0xe8,0x40,0x3c,0x6b,0xe0,0x8, 0xd7,0x3f,0x0, 0xef,0x8, 0xb1,0xe2,0x0, +0xcc,0x66,0x1, 0x2f,0x5, 0x98,0xe2,0x1, 0xcc,0x8, 0x1, 0x9, 0xe2,0x1, 0xcc,0x2a, +0x1, 0xa3,0xe0,0x2, 0x1f,0xd8,0x17,0x5, 0xaf,0xf, 0x8, 0xe1,0xe0,0x2, 0x1f,0xd8, +0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xfa,0x14,0x1, 0xe0,0x1, 0xdc,0xa0,0x8, 0xa1, +0xe0,0x38,0x0, 0xf8,0xe2,0x0, 0xcc,0x55,0x1, 0x8f,0xe0,0x2, 0x1f,0xd8,0x8f,0x8f, +0xe2,0x0, 0xcf,0x85,0x1, 0xeb,0x14,0x1, 0xe0,0x1, 0xdc,0x91,0xe0,0x1, 0xdc,0x44, +0x8, 0xa1,0xe0,0x38,0x0, 0xd6,0xe0,0x2, 0x1f,0xd8,0x17,0x1, 0xaf,0xf, 0x8, 0xe1, +0xe0,0x2, 0x1f,0xd8,0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xd8,0x14,0x1, 0xe0,0x1, +0xdc,0x7e,0xe0,0x1, 0x1f,0xb1,0x17,0x7f,0xa7,0x8f,0xe0,0x7, 0xaf,0x3f,0x8, 0xe1, +0xe0,0x0, 0x1f,0xe, 0xe0,0x2, 0x1f,0xa1,0xe0,0x3, 0x16,0x3d,0x3e,0x1e,0xe0,0x0, +0x1d,0xaa,0xe0,0x2, 0x16,0xfc,0x3e,0x9f,0x85,0xc, 0x84,0x8b,0xe0,0x3, 0xc7,0x3e, +0x86,0x8d,0xe0,0x1, 0x1e,0x2d,0xe0,0x2, 0x15,0xfd,0xe0,0x1, 0x1c,0x26,0x3d,0x9f, +0xad,0xe, 0xe0,0x3, 0xc7,0x80,0x17,0x0, 0x3e,0x99,0xaf,0xf, 0xe0,0x3, 0x86,0x1c, +0xe0,0x2, 0x1c,0x85,0x84,0x8, 0xe0,0x1, 0x1f,0xf1,0xe0,0x5, 0xac,0x39,0xae,0x8b, +0xae,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x5, 0xe0,0x2, 0x1f,0xff,0xe0,0x4, 0x87,0x7e, +0xaf,0xf, 0x38,0x82,0x8, 0xb1,0xe0,0x7, 0xd8,0x86,0x8, 0xa1,0xe0,0xed,0x0, 0xa0, +0x8, 0xb1,0xe0,0x5, 0xd0,0xf2,0xe0,0x2, 0x1f,0x5, 0xe0,0x2, 0x1f,0xff,0xe0,0x4, +0x87,0x7e,0xaf,0xf, 0x8, 0xe1,0x8, 0xb2,0xe0,0x2, 0x1f,0x85,0x17,0x0, 0xe0,0x4, +0xaf,0x5f,0x17,0x0, 0xe0,0x4, 0x8e,0x5f,0xe0,0x0, 0x1e,0xa1,0xe0,0x2, 0x1f,0xac, +0xe0,0x2, 0x19,0x3f,0xae,0xd, 0xb7,0xf, 0xe0,0x19,0x17,0x1c,0xe0,0x2, 0x1e,0x8d, +0x3f,0x12,0x17,0x81,0xaf,0x8d,0xaf,0x8e,0xe0,0x2, 0xd0,0x78,0xdb,0x7c,0xe0,0x1b, +0x14,0x2c,0xe0,0x6, 0xd0,0x50,0xe0,0x5, 0xda,0xe5,0xe0,0x5, 0xd0,0xcf,0xe0,0x19, +0x17,0x1d,0x17,0x87,0x3f,0x12,0xaf,0x8e,0xe0,0x19,0xc1,0x1e,0xaf,0x82,0x9, 0x61, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xe0,0x2, 0x19,0x7f,0xe0,0x2, 0x1b,0x85,0xe0,0x1, +0x1b,0x22,0xe0,0x1, 0x1a,0xa1,0xe0,0x2, 0x1a,0x28,0xe0,0x1, 0x19,0xcf,0xf0,0x1, +0x1c,0x2d,0xf0,0x2, 0x1d,0xd, 0xf0,0x1, 0x1c,0xce,0xf0,0x0, 0x1e,0xd, 0xf0,0x0, +0x1d,0x8c,0xdf,0xba,0x8f,0x82,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0xf1,0xe0,0x1, +0xd6,0x89,0xe0,0x4, 0xd2,0x88,0xe0,0x0, 0xde,0xd8,0x8f,0x86,0x8c,0x5, 0x37,0xa8, +0x3c,0x4f,0xe0,0x6, 0xd0,0x18,0xe0,0x2, 0xd6,0x6f,0x8f,0x84,0xe0,0x0, 0x27,0xf1, +0x8f,0x83,0xe0,0x0, 0x27,0xf4,0xe0,0x3, 0xdc,0x18,0xe8,0x3, 0x8f,0x98,0xe0,0x0, +0x27,0xf6,0xe0,0x2, 0xd1,0xbf,0xe8,0x0, 0x8c,0x8a,0xe8,0x0, 0x8c,0x9, 0xe0,0x2, +0xd6,0x3e,0x8f,0x83,0xe0,0x0, 0x27,0xe3,0x14,0x1, 0xe0,0x5, 0xdc,0xed,0xe0,0x4, +0xd7,0xf0,0xe0,0x4, 0x8f,0xc7,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x66,0xe0,0x2, +0xd2,0x88,0xe0,0x2, 0xdb,0x7, 0x14,0x2, 0xe0,0x5, 0xdc,0xde,0xe0,0x5, 0xdd,0x87, +0x14,0x3, 0xe0,0x5, 0xdc,0xd9,0xe0,0x4, 0xd2,0x4, 0x14,0x4, 0xe0,0x5, 0xdc,0xd4, +0xe0,0x7, 0xd9,0xa0,0xe0,0x6, 0xd2,0xad,0xe0,0x0, 0x1f,0x2a,0xe0,0x2, 0x1f,0xa0, +0x86,0x8e,0x87,0x8f,0xe8,0x3, 0x87,0x18,0x3f,0x9d,0xe8,0x0, 0x86,0x8b,0xe8,0x0, +0xae,0x8c,0xe0,0x2, 0x1e,0x9f,0xaf,0x8d,0x16,0x80,0xe0,0x2, 0x1f,0x9e,0xae,0x8f, +0xe0,0x1, 0x1f,0xa6,0x87,0x8f,0xe0,0x5, 0xaf,0xb7,0xe0,0x1, 0x1f,0xf1,0xaf,0xf, +0xe0,0x1, 0xd9,0xa2,0xe0,0x7, 0xd7,0xc7,0xe0,0x7, 0xd5,0xe2,0xe0,0x4, 0x87,0xf7, +0xaf,0x82,0x8f,0x82,0xe2,0x0, 0xcf,0x81,0xe7,0xff,0x1, 0x13,0x14,0x1, 0xe0,0x0, +0xdb,0xb0,0xe0,0x4, 0x8f,0xc7,0xe2,0x0, 0xcf,0x81,0x1, 0x87,0xe0,0x1, 0x1f,0xb1, +0xa7,0xf, 0xa7,0xce,0xcf,0x84,0xbf,0xce,0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0x8f,0x83, +0xe7,0xfe,0x27,0xfa,0xe0,0x1, 0xd9,0x80,0x0, 0xe2,0x87,0x82,0xe0,0x5, 0xd0,0x15, +0xe0,0x4, 0x87,0xf7,0xaf,0x82,0xe7,0xfe,0x0, 0xef,0xe0,0x3, 0xd6,0x55,0xe0,0x7, +0xd5,0x57,0xe7,0xff,0x0, 0x88,0xe0,0x1, 0x1f,0xb1,0xa7,0xf, 0xa7,0xce,0xcf,0x84, +0xbf,0xce,0xe7,0xff,0x0, 0x96,0x8, 0xb2,0xe0,0x2, 0x1f,0x5, 0x16,0x81,0xe0,0x4, +0xae,0xfe,0x14,0x2, 0xe0,0x4, 0x87,0x7e,0xe0,0x2, 0x1e,0xff,0xe0,0x2, 0x1f,0xbf, +0xaf,0xd, 0x16,0x80,0xe0,0x1, 0x1f,0x60,0xe0,0x1, 0x1e,0x31,0xae,0x8e,0xe0,0x19, +0x16,0x9d,0x3e,0x9f,0x17,0x7, 0xa1,0xc, 0xaf,0xd, 0xe0,0x19,0xc7,0x9e,0xaf,0xf, +0x17,0x7b,0xa7,0xc2,0x3f,0xde,0xbf,0xc2,0xe0,0x1, 0xdb,0x29,0xa7,0xc2,0xcf,0x84, +0xbf,0xc2,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x19,0x5, 0xe0,0x5, 0xdf,0x2, 0xe0,0x2, +0xd7,0xa9,0xe0,0x2, 0xd9,0x83,0xe0,0x1, 0xdf,0x73,0xe0,0x3, 0xde,0x19,0xe0,0x3, +0xde,0xa5,0xdf,0xca,0xe0,0x4, 0x8f,0xf2,0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0xe2,0x0, +0xcf,0x83,0x1, 0xf9,0xdd,0xc4,0xe0,0x4, 0x8f,0xf2,0xe2,0x0, 0xcf,0x81,0x1, 0xf8, +0xdf,0x0, 0x0, 0xf1,0xe0,0xe, 0x34,0x22,0xe0,0xf, 0x34,0x42,0xe0,0x43,0x3f,0xe, +0xe0,0x2, 0x1d,0xf3,0x16,0x4, 0x16,0x81,0x3e,0xdf,0x3e,0x5e,0xf0,0x0, 0xa3,0x8b, +0x3e,0x4d,0xe2,0x0, 0xc4,0x12,0x16,0x88,0xe2,0x0, 0xc7,0x20,0x3e,0xdf,0x3e,0x48, +0xe0,0x0, 0x1f,0xb1,0xe8,0x1, 0xa5,0xe7,0x3e,0x4e,0x3e,0xcc,0xa7,0x8f,0xe7,0xbf, +0x17,0x7f,0x3f,0x5b,0xe4,0xd, 0x36,0xa5,0xe0,0x24,0x15,0xf0,0xe0,0x3, 0x1c,0x80, +0xe0,0x3, 0x1d,0x1, 0xe8,0x1, 0xbf,0x67,0xe4,0xc, 0x36,0x2c,0xea,0xe, 0xc6,0x80, +0x3d,0x9f,0xe0,0x1a,0xa7,0x2f,0xe0,0x7, 0xc7,0xb0,0x3f,0x59,0xe0,0x43,0xbf,0x2f, +0x3f,0xfb,0xe0,0x43,0xa7,0x2f,0x3f,0x4c,0xe0,0x43,0xbf,0x2f,0xe0,0x40,0xa7,0x1f, +0x3f,0x5a,0xe0,0x40,0xbf,0x1f,0xe0,0x40,0xa7,0x1f,0x3f,0x4d,0xe0,0x40,0xbf,0x1f, +0x1, 0xe9,0xe8,0x1, 0xa7,0xe7,0xe0,0x40,0xcf,0x80,0xe8,0x1, 0xbf,0xe7,0x38,0x82, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3b,0xe0,0x2, 0x1f,0x28,0xe0,0x2, 0x1f,0xbf,0x87,0xe, +0x15,0x85,0xe0,0x3, 0x8e,0x2f,0x3d,0xb9,0xe0,0x2, 0x1e,0xed,0xe2,0x0, 0xc7,0x1, +0x3e,0x7e,0x3e,0x9b,0xf0,0x40,0x3d,0x69,0xf0,0x40,0x3c,0xe8,0x8a,0xbd,0xe0,0x1, +0x1, 0x69,0x9b,0x5f,0xe0,0x1, 0x8a,0xf, 0xf0,0x2, 0x1d,0xbe,0xe0,0x2, 0x1f,0xf3, +0xe4,0x7, 0xc2,0xb0,0xa1,0x8f,0xe0,0x0, 0x1f,0xb1,0xe7,0xbf,0x17,0x7f,0xa1,0xf, +0xe0,0x1, 0xa7,0xe3,0x3a,0x92,0x13,0xa0,0x3f,0xde,0xf2,0x0, 0xcd,0x2, 0x3b,0x95, +0xe0,0x6, 0x17,0x26,0xe8,0xe, 0x3f,0x19,0xe0,0x6, 0x15,0x28,0x14,0x80,0xe0,0x1, +0xbf,0xe3,0x3c,0x67,0xf0,0x6, 0x14,0x48,0xe0,0x79,0x39,0x2e,0xf0,0x18,0x3c,0x15, +0xe0,0x8, 0xd5,0x34,0xe0,0x0, 0x15,0x68,0x14,0x80,0xe8,0x40,0x3c,0x68,0xe0,0x8, +0xd5,0x2d,0x23,0x2e,0x14,0x7f,0x3c,0x16,0xe3,0xff,0xc4,0x7f,0x14,0xfe,0x15,0x7f, +0xe8,0x9, 0x3c,0x9b,0xe8,0xa, 0x3d,0x19,0xe8,0x8, 0x3c,0x19,0xf0,0x0, 0x13,0x81, +0xe0,0x80,0x9f,0x19,0x17,0x84,0x3f,0x9e,0xe0,0xd, 0x37,0x82,0x36,0xa2,0xe0,0x80, +0x8d,0x9a,0x3e,0x97,0xe0,0x41,0x3f,0xe, 0xa6,0xd, 0x37,0x23,0x35,0xbe,0xe0,0xe, +0x37,0x85,0x3e,0x4b,0x37,0x22,0xbe,0xd, 0xe8,0xe, 0x3f,0x18,0xa6,0x8e,0xe0,0x41, +0x3f,0x8f,0xf0,0xf, 0x33,0xbf,0x3f,0xcd,0x3c,0x7a,0xbf,0x8e,0x1, 0xe2,0xe0,0x1, +0xa6,0x5, 0xe0,0x1a,0xa6,0x95,0xe8,0x6, 0x3b,0x19,0x17,0x90,0xe1,0x80,0x8f,0x16, +0x37,0x3f,0x3e,0x4e,0xe0,0x1, 0xbe,0x5, 0x8f,0x26,0x37,0x3f,0xc7,0xf8,0x3e,0xce, +0xe3,0xff,0xcf,0xf8,0xe0,0x1a,0xbe,0x95,0x1, 0xf2,0xf2,0x0, 0xcd,0x1, 0x1, 0xe, +0xe0,0x1, 0xa7,0xe3,0x3c,0x64,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xe3,0xf8,0x0, +0xd, 0xa8,0xb, 0xa1,0xe7,0xfe,0x0, 0x98,0x3d,0x2, 0x16,0x9c,0x3e,0x95,0xe0,0x16, +0x15,0x90,0x3e,0x6d,0x17,0x0, 0x3d,0x92,0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, +0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x1, 0xcf,0x4a,0xbd,0xf, 0x1, 0xf6,0xe0,0x6, +0xc2,0xc4,0xe0,0x16,0x15,0x90,0x3e,0x65,0x17,0x0, 0x3d,0x92,0xe0,0x1, 0x17,0xd2, +0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x0, 0xcf,0x1a, +0xbd,0xf, 0x1, 0xf5,0xe0,0x1d,0x15,0xc0,0x3e,0x6d,0x17,0x0, 0x3d,0x92,0x17,0x88, +0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x1, 0xcf,0x4a, +0xbd,0xf, 0x1, 0xf6,0xe0,0x1d,0x15,0xc0,0x3e,0x65,0x17,0x0, 0xe0,0xb, 0x3d,0x92, +0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b, +0xe2,0x0, 0xcf,0x1a,0xbd,0xf, 0x1, 0xf5,0x17,0x0, 0x17,0x88,0x3f,0x9e,0x37,0xa2, +0xc7,0x1, 0xe0,0x80,0xa6,0x1d,0x3f,0x92,0xe2,0x1, 0xcf,0x4a,0xbe,0xf, 0x1, 0xf6, +0xe0,0x0, 0x17,0x0, 0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80, +0xa6,0x95,0x3f,0x92,0xe2,0x0, 0xcf,0x1a,0xbe,0x8f,0x1, 0xf5,0xe7,0xff,0x0, 0x92, +0x9b,0x6f,0xe0,0x1, 0x8a,0x1f,0xf0,0x2, 0x1d,0xbd,0xe7,0xfe,0x0, 0x99,0x8, 0xb5, +0xe0,0x2, 0x1f,0xa8,0xe0,0x2, 0x1f,0x3f,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0xe0,0x0, 0x1, 0x49,0x9a,0x5e,0xe0,0x2, 0x19,0x3e,0xe0,0x2, +0x1f,0xf3,0xe7,0xbf,0x17,0x7f,0xa2,0x8f,0xe0,0xc, 0x15,0x40,0xe0,0x1, 0xa7,0xe5, +0x14,0x80,0x3f,0xde,0xe0,0x2, 0x1f,0x79,0xe0,0x1, 0xbf,0xe5,0xa1,0x8e,0xe0,0xc, +0xc1,0xd0,0x3c,0x63,0xe0,0x8, 0xd4,0x4a,0x3e,0x62,0x16,0x80,0x2a,0xe, 0x0, 0xa5, +0x9d,0x8c,0xa7,0xf, 0xc6,0x81,0xe4,0xb, 0x35,0xa0,0xe3,0xff,0xc6,0xff,0x3f,0x4b, +0x3a,0x7d,0xbf,0xf, 0xc6,0x2, 0x1, 0x19,0xe0,0xf, 0x36,0xc1,0x3f,0x6f,0x15,0x81, +0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc7,0x7f,0x37,0xa2,0x3d,0xdd,0x37,0x22,0x3f,0x93, +0x25,0xe8,0x3f,0x13,0x9d,0x8c,0xa7,0x8e,0xc6,0x81,0xe3,0xff,0xc6,0xff,0x3f,0xcb, +0x3a,0x7d,0xbf,0x8e,0xc6,0x2, 0x1, 0xe9,0xe0,0x1, 0xa7,0xe5,0xe0,0x40,0xcf,0x80, +0xe0,0x1, 0xbf,0xe5,0xa, 0xe1,0x9a,0x6e,0xe0,0x2, 0x19,0x3d,0xe7,0xff,0x0, 0xb9, +0xe0,0x2, 0x1f,0x81,0x8f,0x8f,0x27,0x88,0xe2,0x0, 0xcf,0x81,0x1, 0x3f,0xe2,0x0, +0xcf,0x82,0x1, 0x1e,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe7,0xe0,0x16,0xff,0xa7,0x8f, +0xe0,0x1, 0xa7,0x5f,0x3f,0x5d,0xe0,0x2, 0xcf,0x0, 0xe0,0x1, 0xbf,0x5f,0x16,0xe0, +0xe0,0x4, 0xa7,0x2f,0x3f,0x5d,0xcf,0x1, 0xe0,0x4, 0xbf,0x2f,0xe7,0xf8,0x16,0x9f, +0xe0,0x4, 0xa7,0x2f,0x3f,0x5d,0xcf,0x20,0xe0,0x4, 0xbf,0x2f,0x38,0x82,0xe0,0x2, +0x1f,0xf3,0xe2,0x0, 0xcc,0x82,0xa7,0x8f,0xe7,0xe0,0x16,0xff,0xe0,0x1, 0xa7,0x5f, +0x3f,0x5d,0x1, 0x62,0xe0,0x1, 0xbf,0x5f,0x16,0xe0,0xe0,0x4, 0xa7,0x2f,0x3f,0x5d, +0xcf,0x2, 0xe0,0x4, 0xbf,0x2f,0xe7,0xf8,0x16,0x9f,0xe0,0x4, 0xa7,0x2f,0x3f,0x5d, +0xe0,0x7, 0xcf,0x40,0xe0,0x4, 0xbf,0x2f,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe7,0xe0, +0x16,0xff,0xa7,0x8f,0xe0,0x1, 0xa7,0x5f,0x3f,0x5d,0xe0,0x1, 0xbf,0x5f,0x16,0xe0, +0xe0,0x4, 0xa7,0x2f,0x3f,0x5d,0xcf,0x1, 0x0, 0xe5,0x8, 0xb5,0x11,0x3, 0x39,0x38, +0xe0,0x2, 0x1a,0x9, 0x17,0x5, 0x3f,0x38,0x39,0x14,0xe0,0x2, 0x1f,0xed,0x39,0xe8, +0x8c,0x2, 0x3f,0x9e,0x8a,0xbf,0xe0,0x6, 0xd4,0xbf,0x8c,0x92,0x3c,0x65,0xe0,0x6, +0xd4,0xf1,0x8c,0xa2,0x3c,0x65,0xe0,0x6, 0xd5,0x2a,0xe2,0x0, 0xc9,0x81,0x1, 0x2, +0xa, 0xe1,0x8c,0xc4,0x14,0x3, 0xe0,0x6, 0xd4,0xe5,0x8c,0xd4,0x14,0x3, 0xe0,0x6, +0xd5,0x1e,0x8c,0xc4,0x14,0x4, 0xe0,0x6, 0xd4,0xdd,0x8c,0xd4,0x14,0x4, 0xe0,0x6, +0xd5,0x16,0x8c,0xc4,0x14,0x0, 0xe0,0x6, 0xd4,0xd5,0x8c,0xd4,0x14,0x0, 0xa, 0xa1, +0xe0,0xca,0x0, 0x8d,0xe2,0x0, 0xcc,0x82,0xe0,0x0, 0x2, 0xe1,0x8, 0xb5,0x17,0xfd, +0x3f,0x98,0xe2,0x0, 0xcf,0x81,0x39,0x68,0x3a,0x69,0xe0,0x1, 0x5, 0x88,0xe0,0x0, +0x2c,0x57,0xe0,0x2, 0x1f,0xf3,0xe7,0xbf,0x16,0x7f,0xa6,0x8f,0xe0,0x0, 0x1f,0xb1, +0xe0,0x1, 0xa7,0x6d,0xa7,0x8f,0x3f,0x5c,0xe0,0x1, 0xbf,0x6d,0xe2,0x0, 0xcc,0x81, +0xa7,0x4f,0xe6,0x7, 0x16,0x7f,0x3f,0x5c,0xe0,0x0, 0x1, 0x4a,0xe0,0x28,0xcf,0x0, +0xbf,0x4f,0x16,0x40,0xa7,0x4f,0xe7,0xf8,0x15,0x80,0x3f,0x5c,0xcf,0x5, 0xbf,0x4f, +0x12,0x85,0xa7,0x5f,0xe0,0x3, 0x1e,0x2, 0x3a,0xb9,0x3f,0x5c,0xe8,0x0, 0xcf,0x5, +0xbf,0x5f,0xa7,0x5f,0xe0,0x2, 0x19,0xed,0x3f,0x5b,0xcf,0x5, 0xbf,0x5f,0xe0,0xc, +0x39,0x95,0xe0,0x1, 0xa7,0xed,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x8c,0xcc, +0xe0,0x6, 0xd2,0xac,0xe0,0x2, 0x1f,0xcd,0x3c,0x62,0x3f,0x94,0x84,0x8f,0xe0,0x6, +0xd2,0xd0,0x39,0x95,0x8d,0x23,0x3c,0x62,0x3c,0xea,0xe0,0x6, 0xd3,0x8c,0x8c,0x83, +0x3c,0x62,0x34,0xa3,0xe0,0x6, 0xd3,0x3f,0x8c,0x93,0x3c,0x62,0x34,0xa3,0xe0,0x6, +0xd3,0x5d,0x3c,0x64,0xa, 0xa1,0xe7,0xfe,0x0, 0xea,0x38,0x82,0x12,0x85,0x3a,0xb9, +0xe0,0x2, 0x19,0xed,0xe0,0xf, 0x39,0x95,0x8c,0xcf,0x0, 0xdb,0xe0,0x50,0xcf,0x0, +0xbf,0x4f,0x16,0x40,0xa7,0x4f,0x14,0x85,0x3f,0x5c,0xcf,0xa, 0xbf,0x4f,0x3a,0xe9, +0xa7,0x5f,0xe0,0x3, 0x1e,0x2, 0xe0,0x2, 0x19,0xed,0x3f,0x5c,0xe8,0x0, 0xcf,0xa, +0xbf,0x5f,0xe7,0xf8,0x16,0x0, 0xa7,0x5f,0x3f,0x5c,0xcf,0xa, 0xbf,0x5f,0xe0,0x1, +0xa7,0xed,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0xe0,0x6, 0xd2,0x67,0x3c,0xe2, +0x3c,0x62,0xe0,0x6, 0xd2,0x8e,0xe7,0xff,0x0, 0xbe,0x14,0x8a,0xe0,0x6, 0xd2,0x5e, +0x14,0x80,0x3c,0x62,0x12,0x85,0xe0,0x6, 0xd2,0x84,0xe0,0x2, 0x19,0xed,0x3a,0xb4, +0xe7,0xff,0x0, 0xb1,0xe0,0x2, 0x1f,0x28,0xe0,0x0, 0x1d,0x2b,0xe0,0x2, 0x1f,0xbf, +0x87,0xe, 0xf0,0x1, 0x8b,0xfa,0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, 0xe8,0xc, +0x3d,0x17,0x3e,0xfe,0xf0,0x6, 0x89,0xc, 0xe0,0x1, 0x1, 0x35,0xf0,0x0, 0x9a,0x5f, +0xf0,0x1, 0x89,0x8f,0xe0,0x1, 0x24,0x25,0xe0,0x0, 0x1f,0xa9,0xf0,0x2, 0x1b,0x7b, +0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe0,0x1, 0x27,0xa5,0x8, 0xb2,0xe0,0x1, 0x1f,0xb1, +0xe7,0x7f,0x16,0xff,0xa4,0xf, 0xa7,0x88,0xa7,0x8, 0x37,0xce,0xe2,0x0, 0xc7,0x81, +0xe4,0x0, 0xcf,0x81,0x3f,0x5d,0x37,0xae,0x3f,0xce,0xbf,0x88,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe0,0x1, 0x1f,0xa7,0xf0,0xe, 0x33,0xa2,0x96,0xfb,0x3f,0x9e,0xb6,0x8f, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0,0x1, 0x97,0xb, 0xf0,0x0, 0x12,0x82,0xb7,0x1f, +0xf0,0x15,0x3a,0x9b,0xf0,0x2, 0x18,0x8d,0xf0,0x1, 0x18,0x4d,0xe8,0x40,0x3f,0x64, +0x16,0x0, 0x0, 0x96,0xe8,0x0, 0x8e,0x81,0xe0,0xf, 0x37,0x21,0xe2,0x0, 0xce,0x81, +0x3f,0x99,0xe0,0x0, 0x1, 0x49,0xe8,0x0, 0x96,0x85,0xb6,0x8f,0xc6,0x1, 0xe2,0x0, +0xce,0x6, 0xc7,0x1, 0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82,0x1, 0x13,0xf0,0xf, +0x31,0xdc,0xe0,0xd, 0x37,0x21,0xe2,0x0, 0xc7,0x81,0x3e,0x99,0x2f,0xe4,0xc6,0x1, +0xe2,0x0, 0xce,0x6, 0xc7,0x1, 0xb7,0x8d,0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82, +0x1, 0xef,0xe8,0x0, 0x8f,0x81,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x52,0xf0,0x0, +0x22,0x14,0x16,0x89,0xe8,0xd, 0x3e,0x94,0xe3,0xff,0xc6,0xff,0xe0,0x0, 0x17,0x89, +0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff,0x97,0xe, 0x3f,0xfd, +0xe1,0x80,0xb7,0x19,0x1, 0xf6,0xe0,0x6, 0x8f,0xda,0xc7,0xff,0xf0,0x40,0x3b,0xff, +0x4, 0x6, 0xa7,0x88,0xe7,0x7f,0x17,0x7f,0x3f,0xde,0xbf,0x88,0x17,0x80,0xe8,0x0, +0xaf,0x86,0x9, 0x61,0xf2,0x0, 0xc9,0x4, 0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe7,0xff, +0x1, 0xb4,0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe0,0x3f,0x16,0x9a,0xe8,0x0, 0x98,0x85, +0x3e,0x9e,0x99,0xf, 0x36,0xa1,0x38,0xa2,0xe8,0xd, 0x3e,0x90,0xb0,0x8d,0x9e,0x8f, +0xe8,0x0, 0x98,0x85,0x3e,0x91,0x36,0xc1,0xb6,0x8f,0xe7,0xff,0x0, 0xa1,0xe0,0x2, +0x1f,0xc9,0xf0,0x2, 0x1b,0x7b,0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe7,0xfe,0x2f,0xdf, +0x38,0x82,0xf0,0x0, 0x9a,0x6f,0xf0,0x1, 0x89,0x9f,0xe7,0xfe,0x0, 0xcd,0xf2,0x0, +0xc9,0x4, 0x1, 0x17,0xf7,0xff,0x22,0x41,0xf0,0x0, 0xc2,0x9, 0xf3,0xff,0xc2,0x7f, +0xe0,0x0, 0x17,0x89,0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x97,0xe, 0xe8,0x40,0x3f,0xf4,0xe1,0x80,0xb7,0x19,0x1, 0xf5,0xe7,0xff,0x0, 0xad, +0xf0,0x0, 0x22,0x27,0xf7,0xff,0x11,0xff,0xf8,0x13,0x39,0x94,0xf3,0xff,0xc1,0xff, +0xf0,0x1, 0x19,0x4d,0xc5,0x92,0x3e,0xe9,0xf0,0x0, 0xc1,0x81,0xe0,0x0, 0x17,0x0, +0xe0,0x3f,0x17,0x9a,0x9e,0xb, 0x3f,0x9e,0xf0,0x0, 0x9a,0x8d,0x37,0xa1,0xe8,0xc, +0x3e,0x25,0xe8,0xf, 0x3f,0x92,0xb6,0xf, 0xc7,0x1, 0x9f,0x8d,0xe1,0x80,0x9e,0x1b, +0xf0,0x40,0x39,0xfe,0x3f,0x9c,0x37,0xc1,0xe1,0x80,0xb7,0x9d,0x1, 0xea,0x17,0x86, +0xe8,0xf, 0x3f,0x94,0x37,0xa1,0x3c,0x9f,0x17,0x0, 0xb7,0x9, 0xe7,0xfe,0x0, 0xfd, +0xe0,0x2, 0x1f,0x81,0x86,0xc8,0x8f,0x8f,0x87,0x68,0xe2,0x0, 0xcf,0x82,0xe0,0x1, +0x1f,0xa6,0x8f,0x8f,0x1, 0x22,0x37,0xc1,0x16,0x60,0xc7,0x81,0x3e,0xdc,0xe2,0x0, +0xc7,0x9f,0x3f,0x5c,0xce,0x81,0x3f,0xce,0xae,0xc8,0xaf,0xe8,0x15,0x80,0x87,0x48, +0x87,0xe8,0x86,0x58,0x86,0xf8,0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xc7,0x9f,0xcf,0x20, +0xce,0x40,0xcf,0xa0,0xce,0xc0,0x15,0x1, 0xad,0x8, 0xad,0x98,0xad,0xb8,0xaf,0x48, +0xae,0x58,0xaf,0xe8,0xae,0xf8,0x38,0x82,0xc7,0x81,0x37,0x81,0x16,0x60,0xc7,0x81, +0x3e,0xdc,0xe2,0x0, 0xc7,0x9f,0x3f,0x5c,0xce,0x82,0x3f,0xce,0xae,0xc8,0xaf,0xe8, +0x0, 0xde,0xe0,0x2, 0x1f,0x81,0xf0,0x0, 0x11,0x81,0x8d,0x8f,0xe2,0x0, 0xcd,0x82, +0x1, 0x4, 0xf0,0x0, 0x11,0x80,0x15,0x81,0xc4,0x82,0xe2,0x1, 0xc4,0xff,0x17,0x81, +0xf0,0x1, 0x1a,0x26,0xac,0x88,0x17,0x0, 0xaf,0xb8,0x15,0x47,0xf7,0xff,0x13,0xe0, +0xf7,0xff,0x12,0x80,0xf7,0xff,0x13,0x3f,0x0, 0x92,0x87,0xc8,0x86,0xd8,0xe2,0x0, +0xc7,0x9f,0xcf,0xe0,0xe8,0xf, 0x3f,0xd7,0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xd8, +0xaf,0xc8,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0x4, 0xac,0x17,0x82,0x3f,0x9e, +0x37,0xa1,0x3f,0x98,0x86,0x9f,0x3e,0xda,0xae,0x9f,0x27,0x68,0xe2,0x0, 0xcf,0x1, +0xf0,0x0, 0x11,0x1f,0xf0,0x0, 0x10,0x81,0xf0,0x12,0x39,0x5b,0xce,0xc0,0xf0,0x11, +0x38,0x9b,0x1, 0x19,0x86,0xf, 0xe2,0x0, 0xcf,0x2, 0xe8,0xc, 0x3e,0x57,0xe8,0xc, +0x3e,0x42,0xe8,0x40,0x3d,0xe1,0xae,0xf, 0xe2,0x0, 0xc6,0x1f,0xe2,0x1, 0xc5,0xff, +0xce,0x20,0x1, 0x17,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0xae,0xf, 0xae,0x9f, +0x3, 0xd6,0x38,0x82,0x87,0xe8,0x86,0xf8,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0xc5, +0xe8,0xf, 0x3f,0xd7,0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xf8,0xaf,0xe8,0x0, 0xc2, +0xe0,0x1, 0x86,0x98,0xe0,0x1, 0x87,0x88,0xce,0xc0,0xe0,0x1, 0xae,0x98,0xe2,0x0, +0xc7,0x9f,0xe8,0x0, 0x8d,0x84,0xcf,0xa0,0xe8,0xb, 0x3d,0x93,0x35,0x81,0xc5,0x81, +0xe0,0x1, 0xaf,0x88,0xe2,0x1, 0xc5,0xff,0xe7,0xff,0x0, 0xad,0xe0,0x2, 0x1f,0x81, +0xf0,0x0, 0x12,0x81,0x8d,0xf, 0xe2,0x0, 0xcd,0x2, 0x1, 0x4, 0xf0,0x0, 0x12,0x80, +0x15,0x1, 0x17,0x80,0xf0,0x1, 0x1b,0x26,0xac,0x88,0x17,0x0, 0xaf,0x98,0xf7,0xff, +0x13,0xe0,0x17,0x82,0x3f,0x9e,0x37,0xa1,0x3f,0x98,0x86,0x8f,0x86,0x1f,0x15,0x9f, +0xe8,0xd, 0x3e,0xd7,0x3d,0xda,0xce,0x40,0x3e,0xcb,0xae,0x1f,0x16,0x3, 0xae,0x8f, +0x3e,0x1a,0x27,0x13,0x3d,0x6c,0xe2,0x1, 0xc5,0x7f,0x17,0x82,0x3f,0x9e,0x37,0xa1, +0x3f,0x98,0x86,0x8f,0xc7,0x1, 0xe2,0x0, 0xc6,0x9f,0xe2,0x1, 0xc7,0x7f,0xce,0xa0, +0x3c,0xfe,0xae,0x8f,0x3, 0xdf,0x38,0x82,0xe8,0x0, 0x8f,0x86,0xe8,0xf, 0x3f,0x95, +0x37,0x81,0xc7,0x81,0x3d,0x7f,0x2, 0x6a,0xe8,0x0, 0x8d,0x6, 0xe8,0xa, 0x3d,0x15, +0x35,0x1, 0xc5,0x1, 0xe2,0x1, 0xc5,0x7f,0x0, 0xe1,0x17,0x0, 0x3f,0xe8,0xe1,0x80, +0xaf,0x1f,0xc7,0x81,0xaf,0x18,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xaf,0xf, 0xe7,0xfe,0x0, 0x9f,0xe0,0x2, 0x1f,0x81,0x16,0x82,0x8f,0x8f, +0x87,0x58,0xe0,0x2f,0x3f,0x8d,0xc7,0x81,0x16,0x80,0xcf,0x40,0xcf,0xa0,0xae,0x88, +0xae,0x98,0xae,0xb8,0xaf,0x58,0xaf,0xc8,0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x19,0x69, +0x15,0x2a,0x14,0x80,0x3c,0x62,0xe0,0x8, 0xd0,0xa1,0xe0,0x2, 0x1f,0x81,0x17,0x1, +0xaf,0x42,0xe0,0x0, 0x17,0x41,0x8f,0x8f,0xe0,0x4, 0xaf,0x2, 0x2f,0x8c,0xe0,0x2, +0x87,0xa2,0x17,0x60,0xe2,0x0, 0xc7,0x9f,0xcf,0xa0,0x3f,0xde,0xcf,0x81,0xe0,0x2, +0xaf,0xa2,0x9, 0x61,0xe0,0x2, 0x1e,0xe8,0x17,0x0, 0xe0,0x2, 0x1f,0xe7,0xaf,0xd, +0x3c,0x6d,0xaf,0x1d,0xaf,0xf, 0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1e,0xfd,0xaf,0xf, +0xe0,0x2, 0x1f,0xe5,0x8c,0x8d,0xaf,0xf, 0xe0,0x2, 0x1f,0xe4,0xaf,0xf, 0xe0,0x2, +0x1f,0xe3,0xaf,0xf, 0xe0,0x2, 0x1f,0xe2,0xaf,0xf, 0xe0,0x2, 0x1f,0xe1,0xaf,0xf, +0xe0,0x2, 0x1f,0xe0,0xaf,0xf, 0xe0,0x2, 0x1f,0xdf,0xaf,0xf, 0xe0,0x2, 0x1f,0xde, +0xaf,0xf, 0xe0,0x2, 0x1f,0xdd,0xaf,0xf, 0xe0,0x2, 0x1f,0xdc,0xaf,0xf, 0x9, 0x21, +0xe7,0xfd,0x0, 0xc1,0xe0,0x0, 0x1f,0xab,0x17,0x0, 0xaf,0xf, 0x16,0xff,0xaf,0x1f, +0xae,0xaf,0xaf,0x3f,0xaf,0x4f,0xaf,0x5f,0xaf,0x6f,0xaf,0x7f,0xe0,0x1, 0xaf,0xf, +0xe0,0x1, 0xaf,0x6f,0xe0,0x1, 0xae,0xff,0xe0,0x2, 0xaf,0xf, 0xe0,0x2, 0xaf,0x1f, +0x38,0x82,0xe0,0x0, 0x1f,0x2b,0x8e,0x8e,0xe0,0x0, 0x2e,0xdc,0x8f,0x8e,0x85,0x89, +0x37,0xa5,0x3f,0x9e,0xbc,0x6f,0xc5,0x81,0x8f,0x8e,0xe2,0x1, 0xc5,0xff,0x37,0xa5, +0x3f,0x9e,0x8c,0x39,0xe0,0x6, 0xad,0xdf,0x15,0x7f,0x3e,0x6d,0x8f,0x8e,0x37,0xa5, +0x3f,0x9e,0x3f,0x9d,0xe0,0x6, 0xad,0xf, 0x8f,0x8e,0x37,0xa3,0x3f,0x9d,0xc7,0x87, +0x37,0xa2,0xc6,0x81,0x3f,0x9e,0xe2,0x0, 0xce,0x85,0xbe,0xf, 0x1, 0xf0,0xe0,0x2, +0xae,0x2e,0xe0,0x2, 0xae,0x3e,0xe0,0x2, 0xae,0x4e,0xe0,0x2, 0xae,0x5e,0xe0,0x2, +0xae,0x6e,0xe0,0x2, 0x1f,0x8d,0xe0,0x2, 0xae,0x7e,0x8d,0xf, 0xe2,0x0, 0xcd,0x1, +0x1, 0x2a,0x8f,0x8e,0x8e,0x99,0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0xf, 0x3d,0xad, +0xe0,0x2, 0xae,0x2e,0xe2,0x0, 0xcd,0x81,0x8f,0x8e,0xe0,0x1, 0x1e,0xcc,0x37,0xa5, +0x3f,0x9e,0xbe,0xff,0x5, 0x11,0x8f,0x8e,0x16,0x82,0x37,0xa5,0x3f,0x9e,0xe0,0x6, +0xae,0x9f,0x17,0x81,0xe0,0x2, 0xaf,0xce,0x8f,0x8e,0xe0,0x1, 0x1e,0xcb,0xc7,0x81, +0x37,0xa5,0x3f,0x9e,0xbe,0x8f,0x14,0x0, 0x8f,0x8e,0xc7,0x81,0xaf,0x8e,0x38,0x82, +0x14,0x1, 0x38,0x82,0xe0,0x0, 0x24,0x50,0x8f,0x8e,0xf0,0x1, 0x1b,0x4a,0x37,0xa5, +0x3f,0x9e,0xe0,0x6, 0xae,0x8f,0x16,0x84,0xe0,0x2, 0xae,0x7e,0x14,0x82,0x8f,0x8e, +0x16,0x3, 0x37,0xa5,0x3f,0x9e,0xf0,0x0, 0xbb,0x7f,0xf0,0x40,0x3b,0xe9,0x8f,0x8e, +0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0x9f,0xe0,0x2, 0xad,0x6e,0x8e,0x8e,0xc6,0x81, +0x36,0xa5,0x3e,0x9e,0xf0,0x0, 0xbb,0xd, 0x17,0x80,0x8e,0x8e,0x34,0x21,0x36,0xa5, +0x3e,0x9e,0x3e,0x99,0xe0,0x6, 0xaf,0x8d,0x3d,0xa8,0xf0,0x2, 0xab,0xae,0xe2,0x0, +0xcd,0x81,0x8f,0x8e,0xe0,0x1, 0x1e,0xcc,0x37,0xa3,0x3f,0x99,0xc7,0x87,0x37,0xa2, +0x3f,0x9e,0xbe,0x8f,0x5, 0x41,0x8e,0x8e,0x17,0x82,0x36,0xa5,0x3e,0x9e,0x3e,0x9c, +0xe0,0x6, 0xaf,0x8d,0x14,0x0, 0xe0,0x2, 0xae,0x4e,0x8f,0x8e,0xe0,0x1, 0x1e,0xcb, +0x37,0xa3,0x3f,0x9c,0xc7,0x87,0x37,0xa2,0x3f,0x9e,0xbe,0x8f,0x8f,0x8e,0xc7,0x81, +0xaf,0x8e,0x38,0x82,0xf0,0x40,0x3b,0xe8,0x3e,0x6a,0x3c,0xe8,0x0, 0xce,0xe2,0x0, +0xcc,0x4, 0x1, 0x20,0x5, 0x92,0xe2,0x0, 0xcc,0x6, 0x2, 0x9f,0x17,0x80,0x8f,0x39, +0xaf,0x89,0xaf,0x99,0x27,0x7, 0x87,0xd9,0xe2,0x1, 0xc7,0xbf,0xaf,0xd9,0x17,0xa1, +0xaf,0xc9,0x17,0x80,0xaf,0xb9,0x38,0x82,0xe2,0x0, 0xcc,0x3, 0x1, 0x8f,0x87,0xd9, +0x17,0x47,0x3f,0xde,0xcf,0x90,0x17,0x0, 0xaf,0x9, 0xaf,0x19,0xaf,0x39,0xaf,0xd9, +0x38,0x82,0x3c,0x69,0xe7,0xfb,0x0, 0x96,0x38,0x82,0x38,0x82,0xe0,0x0, 0x1f,0x2b, +0x16,0x80,0xe0,0x2, 0xae,0x9e,0x17,0x80,0x8e,0x8e,0x26,0x91,0xe0,0xd, 0x37,0xa5, +0x3e,0x9e,0xe0,0x6, 0x8e,0xdd,0xe0,0x2, 0x8e,0x1e,0xc7,0x81,0x3e,0x9c,0xe0,0x2, +0xae,0x9e,0xe2,0x1, 0xc7,0xff,0x8e,0x8e,0x3e,0xff,0x2, 0xf1,0x38,0x82,0x8, 0xb4, +0xc0,0x60,0xe0,0x0, 0x19,0x2b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0x11,0x94, +0xaf,0x22,0x39,0x90,0xaf,0xb2,0x3c,0x63,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2, +0xe0,0x1, 0xaf,0x82,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0x17,0xe, 0xe0,0x2, +0xaf,0x82,0xe0,0x2, 0x1a,0xd, 0xe0,0x2, 0xaf,0x92,0x8f,0x84,0x3f,0x3f,0xe0,0x2, +0x1f,0xe9,0x3f,0x9e,0xf0,0x0, 0x80,0x8f,0xf0,0x0, 0x81,0x1f,0xf0,0x0, 0x81,0xaf, +0xf0,0x0, 0x82,0x3f,0xf0,0x0, 0x68,0x94,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f, +0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x84,0x8f,0xe0,0x1, 0x85,0x1f,0xe0,0x1, 0x85,0xaf, +0xe0,0x1, 0x86,0x3f,0xe0,0x1, 0x86,0xcf,0xe0,0x1, 0x87,0x5f,0x87,0xcf,0xf0,0x0, +0xa9,0x13,0xf0,0x0, 0xa9,0xa3,0xf0,0x0, 0xaa,0x33,0xaf,0xc3,0xf0,0x0, 0xaa,0xd3, +0xf0,0x0, 0xab,0x63,0xf0,0x0, 0xab,0xf3,0xe0,0x1, 0xac,0x83,0xe0,0x1, 0xad,0x13, +0xe0,0x1, 0xad,0xa3,0xe0,0x1, 0xae,0x33,0xe0,0x1, 0xae,0xc3,0xe0,0x1, 0xaf,0x53, +0xdd,0x20,0xf8,0x3, 0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef, +0x57,0x90,0x14,0x4, 0x77,0x88,0xde,0xa6,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x84, +0xc7,0x81,0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, +0xaf,0x92,0x17,0x80,0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0xa, 0x61,0x8, 0xb3,0xc0,0x60, +0xe0,0x0, 0x19,0x2b,0x17,0x0, 0xaf,0x2, 0x17,0xff,0xaf,0x12,0x16,0x8e,0xaf,0xa2, +0xaf,0x32,0xaf,0x42,0xaf,0x52,0xaf,0x62,0xaf,0x72,0xe0,0x1, 0xaf,0x2, 0xe0,0x1, +0xaf,0x62,0xe0,0x1, 0xaf,0xf2,0xe0,0x2, 0xaf,0x2, 0xe0,0x2, 0x19,0x8d,0xe0,0x2, +0xaf,0x12,0x8f,0x83,0x3e,0xbf,0xe0,0x2, 0x1f,0xe9,0x3f,0x9d,0xf0,0x0, 0x81,0x2f, +0xf0,0x0, 0x81,0xcf,0xf0,0x0, 0x82,0x5f,0xf0,0x0, 0x82,0xef,0xf0,0x0, 0x83,0x7f, +0xf0,0x1, 0x83,0x8f,0x86,0xbf,0xe0,0x1, 0x84,0xaf,0xe0,0x1, 0x85,0x3f,0xe0,0x1, +0x85,0xcf,0xe0,0x1, 0x86,0x5f,0xe0,0x1, 0x84,0x1f,0xf0,0x0, 0x69,0x16,0x3f,0xed, +0xf0,0x0, 0x69,0x98,0xe2,0x1, 0xc7,0xff,0xf0,0x0, 0x6a,0x19,0xf0,0x0, 0x6a,0x9a, +0xf0,0x0, 0x6b,0x1b,0xf0,0x0, 0x6b,0x9c,0x6c,0x1d,0x6c,0x9e,0x6d,0x1f,0x6d,0xa0, +0x6e,0x21,0x6f,0x14,0x6f,0x15,0x27,0x87,0x57,0x8c,0xe2,0x1, 0xc7,0xbf,0xe0,0x42, +0xcf,0x80,0x77,0x8c,0x17,0x80,0xf0,0x0, 0x11,0x14,0x6f,0x97,0xf0,0x12,0x39,0x10, +0xf8,0x12,0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x5, 0x77,0x88,0xde,0x1f,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x83,0xc7,0x81, +0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, 0xaf,0x92, +0x17,0x80,0xe0,0x0, 0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0x9, 0xe1,0x8, 0xb3,0xc0,0x60, +0xe0,0x0, 0x19,0x2b,0x17,0x0, 0xaf,0x2, 0x17,0xff,0xaf,0x12,0x16,0x8e,0xaf,0xa2, +0xaf,0x32,0xaf,0x42,0xaf,0x52,0xaf,0x62,0xaf,0x72,0xe0,0x1, 0xaf,0x2, 0xe0,0x1, +0xaf,0x62,0xe0,0x1, 0xaf,0xf2,0xe0,0x2, 0xaf,0x2, 0xe0,0x2, 0x19,0x8d,0xe0,0x2, +0xaf,0x12,0x8f,0x83,0x3e,0xbf,0xe0,0x2, 0x1f,0xe9,0x3f,0x9d,0xf0,0x0, 0x81,0x2f, +0xf0,0x0, 0x81,0xcf,0xf0,0x0, 0x82,0x5f,0xf0,0x0, 0x82,0xef,0xf0,0x0, 0x83,0x7f, +0xf0,0x1, 0x83,0x8f,0x86,0xbf,0xe0,0x1, 0x84,0xaf,0xe0,0x1, 0x85,0x3f,0xe0,0x1, +0x85,0xcf,0xe0,0x1, 0x86,0x5f,0xe0,0x1, 0x84,0x1f,0xf0,0x0, 0x69,0x16,0x3f,0xed, +0xf0,0x0, 0x69,0x98,0xe2,0x1, 0xc7,0xff,0xf0,0x0, 0x6a,0x19,0xf0,0x0, 0x6a,0x9a, +0xf0,0x0, 0x6b,0x1b,0xf0,0x0, 0x6b,0x9c,0x6c,0x1d,0x6c,0x9e,0x6d,0x1f,0x6d,0xa0, +0x6e,0x21,0x6f,0x14,0x6f,0x15,0x27,0x87,0x57,0x8c,0xe2,0x1, 0xc7,0xbf,0xe0,0x42, +0xcf,0x80,0x77,0x8c,0x17,0x80,0xf0,0x0, 0x11,0x14,0x6f,0x97,0xf0,0x12,0x39,0x10, +0xf8,0x12,0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x6, 0x77,0x88,0xdd,0x97,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x83,0xc7,0x81, +0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, 0xaf,0x92, +0x17,0x80,0xe0,0x0, 0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0x9, 0xe1,0x8, 0xb3,0xc0,0x60, +0xe0,0x0, 0x19,0x2b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0x16,0xe, 0xaf,0x22, +0xf0,0x0, 0x11,0x14,0xaf,0xb2,0xf0,0x12,0x39,0x10,0xaf,0xc2,0x16,0x84,0xaf,0xd2, +0x3e,0x90,0xaf,0xe2,0x3c,0xed,0xaf,0xf2,0x14,0x3, 0xe0,0x1, 0xaf,0x82,0xe0,0x1, +0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82,0xe0,0x2, 0x19,0x8d,0xe0,0x2, +0xaf,0x92,0x8f,0x3, 0x3e,0x3e,0xe0,0x2, 0x1f,0x69,0x3f,0x1c,0xf0,0x0, 0x81,0xae, +0xf0,0x0, 0x82,0x4e,0xf0,0x0, 0x82,0xde,0xf0,0x0, 0x83,0x6e,0x85,0x7e,0xe0,0x1, +0x85,0x8e,0xe0,0x1, 0x86,0x1e,0xf0,0x1, 0x83,0xae,0xf8,0x0, 0xa9,0xa2,0xf8,0x0, +0xaa,0x42,0xf8,0x0, 0xaa,0xd2,0xf8,0x0, 0xab,0x62,0xe8,0x0, 0xad,0x72,0xe8,0x1, +0xad,0x82,0xe0,0x1, 0x85,0x3e,0xe8,0x1, 0xae,0x12,0xe0,0x1, 0x85,0xce,0xe0,0x1, +0x86,0x5e,0xf8,0x1, 0xab,0xa2,0xe8,0x0, 0x97,0x22,0xe8,0x1, 0xad,0x32,0x15,0x47, +0x3f,0x5a,0x6f,0x94,0xcf,0x10,0xe8,0x0, 0xaf,0x92,0xe8,0x0, 0xaf,0xb2,0xe8,0x0, +0xb7,0x22,0xe8,0x1, 0xad,0xc2,0xe8,0x1, 0xae,0x52,0xf8,0x12,0x8, 0x2, 0xf8,0xd, +0x8, 0x12,0x57,0x90,0x77,0x88,0xdd,0xe, 0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x83, +0xc7,0x81,0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, +0xaf,0x92,0x17,0x80,0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0x9, 0xe1,0x8, 0xb1,0xc0,0x70, +0xe0,0x2, 0x1f,0xe9,0xe2,0x0, 0x7c,0x84,0xf0,0x0, 0x80,0xf, 0xf0,0x0, 0x80,0x9f, +0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf, +0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f, +0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf, +0x14,0x0, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, +0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, +0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdc,0xb2, +0xe0,0x0, 0x1f,0xab,0x17,0x0, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, +0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x8, 0xb1, +0xc0,0x70,0xe0,0x2, 0x1f,0x69,0x17,0x8e,0x3f,0x9e,0xf0,0x1, 0x80,0x6e,0xf0,0x0, +0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, +0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, +0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, +0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x1, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, +0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, +0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d, +0x6e,0xe, 0x6e,0x8f,0xdc,0x67,0xe0,0x0, 0x1f,0xab,0x17,0x1, 0xe0,0x1, 0xaf,0x1f, +0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f, +0xc0,0x10,0x8, 0xe1,0x8, 0xb1,0xc0,0x70,0xe0,0x2, 0x1f,0x69,0x17,0x9c,0x3f,0x9e, +0xf0,0x3, 0x80,0x4e,0xf0,0x0, 0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf, +0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff, +0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf, +0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x2, 0x6f,0x10, +0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, +0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, +0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdc,0x1c,0xe0,0x0, 0x1f,0xab, +0x17,0x2, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, +0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x8, 0xb2,0xe0,0x0, 0x19,0x2b, +0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0xe2,0x0, 0xcc,0x1, 0xaf,0x22,0xaf,0xb2, +0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, 0xaf,0x82,0xe0,0x1, 0xaf,0xe2, +0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82,0xe0,0x2, 0xaf,0x92,0x1, 0x21,0x4, 0x9e, +0xe2,0x0, 0xcc,0x2, 0x1, 0x19,0x17,0x80,0xe0,0x2, 0xaf,0x92,0x17,0x80,0xe0,0x0, +0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, 0x8f,0x5e,0xe0,0x2, +0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, 0xc7,0xff,0x8f,0x2, +0x3f,0xfe,0x4, 0xf1,0x9, 0x61,0xdf,0x7f,0x0, 0xe7,0xde,0xe9,0x0, 0xe5,0xdf,0x30, +0x0, 0xe3,0xe0,0x0, 0x1f,0xab,0xe0,0x2, 0x8f,0xcf,0x27,0x96,0xe0,0x2, 0x1f,0x1, +0x8f,0xe, 0xe2,0x0, 0xcf,0x2, 0x1, 0x11,0xe0,0x1, 0x1f,0x26,0xc7,0x82,0x8e,0x8e, +0x37,0xa1,0x3f,0x98,0x87,0xf, 0x36,0xc1,0xc6,0x81,0x16,0x60,0xe2,0x0, 0xc6,0x9f, +0x3f,0x5c,0x3e,0xce,0xae,0x8f,0x38,0x82,0x3f,0x1f,0xe0,0x1, 0x1f,0xa6,0x37,0x21, +0x8f,0x8f,0x3c,0x1e,0xc7,0x81,0x87,0x8, 0x37,0x81,0xc7,0x81,0x16,0xe0,0xe2,0x0, +0xc7,0x9f,0x3f,0x5d,0x3f,0xce,0xaf,0x88,0x38,0x82,0x8, 0xb1,0xe0,0x0, 0x1f,0xb7, +0x8f,0x8f,0x27,0x99,0xe0,0x2, 0x1f,0x81,0x8f,0x8f,0x27,0xaf,0xe0,0x2, 0x1f,0xd, +0x16,0x82,0x8f,0x8e,0xe0,0x2f,0x3f,0x8d,0x2f,0xa8,0x17,0x83,0xe0,0x2f,0x3c,0xf, +0x2f,0xa4,0x8f,0x8e,0x17,0x1, 0xe0,0x2f,0x3f,0x8e,0x2f,0x9f,0x17,0x86,0xe0,0x28, +0x3c,0xf, 0x2c,0x1b,0xe0,0x6, 0xd5,0x8a,0xe0,0x0, 0xdf,0x49,0xe0,0x2, 0x1f,0xf3, +0xe0,0x1, 0x1e,0xdf,0xa7,0x8f,0xe7,0xfb,0x16,0x7f,0xa7,0x4f,0x97,0x8d,0xe2,0x0, +0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0x17,0x1, 0xe0,0x0, 0x1f,0xab, +0xaf,0x3f,0x8, 0xa1,0xe0,0xbd,0x0, 0x88,0xe0,0x6, 0xd5,0x70,0xe0,0x0, 0xdf,0x2f, +0xe0,0x2, 0x1f,0xf3,0xe0,0x1, 0x1e,0xdf,0xa7,0x8f,0xe7,0xfb,0x16,0x7f,0xa7,0x4f, +0x97,0x8d,0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0x17,0x1, +0xe0,0x0, 0x1f,0xab,0xaf,0x3f,0x8, 0xa1,0xe0,0xbd,0x0, 0x80,0x8, 0xb2,0xc0,0x70, +0xe2,0x0, 0xcc,0x2, 0x39,0x68,0xe0,0x0, 0x5, 0xed,0xe2,0x0, 0xc9,0x6, 0x14,0x0, +0x5, 0x83,0xc0,0x10,0x9, 0x61,0xe0,0x2, 0x1f,0x8d,0x17,0xe, 0x8f,0x8f,0x3f,0x3f, +0xe0,0x2, 0x1f,0xe9,0x3f,0x9e,0xf0,0x0, 0x80,0x8f,0xf0,0x0, 0x81,0x1f,0xf0,0x0, +0x81,0xaf,0xf0,0x0, 0x82,0x3f,0xf0,0x0, 0x82,0xcf,0xf0,0x0, 0x83,0x5f,0xf0,0x0, +0x83,0xef,0x84,0x7f,0xe0,0x1, 0x84,0x8f,0xe0,0x1, 0x85,0x1f,0xe0,0x1, 0x85,0xaf, +0xe0,0x1, 0x86,0x3f,0xe0,0x1, 0x86,0xcf,0xe0,0x1, 0x87,0x5f,0xe0,0x0, 0x1f,0xab, +0xf0,0x0, 0x68,0x84,0xe0,0x2, 0x8f,0xcf,0xf0,0x0, 0x69,0x5, 0xf0,0x0, 0x69,0x86, +0xf0,0x0, 0x6a,0x7, 0xf0,0x0, 0x6a,0x88,0xf0,0x0, 0x6b,0x9, 0xf0,0x0, 0x6b,0x8a, +0x6c,0xb, 0x6c,0x8c,0x6d,0xd, 0x6d,0x8e,0x6e,0xf, 0x6e,0x90,0x6f,0x11,0x27,0x9c, +0xe0,0x2, 0x1f,0x1, 0xc7,0x82,0x8f,0xe, 0x37,0xa1,0xe2,0x0, 0xcf,0x2, 0xe0,0x1, +0x1f,0x26,0x8f,0xe, 0xe0,0x0, 0x1, 0x4b,0xe2,0x0, 0x7e,0x84,0x3f,0x9d,0x37,0x41, +0x96,0x8f,0x37,0x28,0xe0,0x2, 0xc7,0x0, 0xe7,0xc1,0x16,0x7f,0xe2,0x3e,0xc7,0x0, +0x3e,0xdc,0x3f,0x4d,0xb7,0xf, 0x3c,0x62,0xe2,0x0, 0x7c,0x84,0xdb,0xa1,0xe2,0x0, +0x7c,0x4, 0xe0,0x5, 0xdd,0x7a,0x3c,0x62,0xdf,0x41,0x14,0x1, 0xc0,0x10,0x9, 0x61, +0xe0,0x0, 0x1f,0x2b,0x14,0xe, 0x3c,0x32,0xe0,0x2, 0x1f,0xe9,0xe0,0x2, 0x8f,0x4e, +0x3c,0x1f,0x27,0x70,0xe0,0x2, 0x1e,0x81,0x8e,0x8d,0xe2,0x0, 0xce,0x82,0x16,0x87, +0x3e,0xb2,0x3e,0x9e,0x1, 0x11,0xc6,0x82,0xe0,0x1, 0x1f,0x26,0x36,0xa1,0x8f,0xe, +0x3f,0x9d,0x86,0x8f,0x37,0x41,0xc7,0x1, 0x16,0x60,0xe2,0x0, 0xc7,0x1f,0x3e,0xdc, +0x3f,0x4d,0xaf,0xf, 0x0, 0xd7,0xe0,0x1, 0x1f,0x26,0xc6,0x82,0x8f,0xe, 0x36,0xa1, +0x3f,0x9d,0xc7,0x1, 0x86,0x8f,0x37,0x1, 0x0, 0xef,0xe2,0x0, 0x7e,0x84,0xc7,0x1, +0x3f,0x9d,0x37,0x1, 0x96,0x8f,0xc7,0x1, 0xe2,0x0, 0xc7,0x1f,0xe7,0xc1,0x16,0x7f, +0x37,0x28,0x3e,0xdc,0x3f,0x4d,0xb7,0xf, 0xe7,0xff,0x0, 0xb7,0xe0,0x0, 0x1f,0xab, +0x8e,0x9f,0x8f,0xf, 0x3e,0xfe,0x4, 0x83,0x14,0x0, 0x38,0x82,0x8f,0x1f,0x37,0x25, +0x3f,0x9e,0xa4,0x6f,0xe2,0x1, 0xc4,0x7f,0xe7,0xfe,0x0, 0xc2,0x8, 0xb2,0xe0,0x2, +0x1f,0x7f,0xe0,0x1, 0x1f,0xe1,0x8e,0x8e,0x87,0x6f,0xe2,0x0, 0xc6,0x87,0x36,0xa5, +0xe2,0x0, 0xc7,0x1f,0x3f,0x4d,0xaf,0x6f,0x16,0x60,0x9f,0x3f,0x86,0xef,0x37,0x48, +0xc7,0x1, 0xe2,0x0, 0xc7,0x1f,0x3e,0xdc,0x3f,0x4d,0xaf,0x6f,0x9f,0x3f,0x37,0x48, +0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xcf,0x1f,0x1, 0x85,0x87,0x6f,0x3f,0x5c,0xcf,0x4, +0xaf,0x6f,0x17,0x80,0xe0,0x0, 0x19,0x2b,0x17,0x7f,0xaf,0xb2,0x14,0x0, 0xaf,0x92, +0xaf,0x22,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, 0xaf,0x82,0xe0,0x1, +0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82,0xe0,0x1, 0xd2,0x6e,0x8f,0x12, +0x8f,0x82,0x3f,0x7f,0x4, 0x87,0x17,0x83,0x14,0x1, 0xaf,0xb2,0x9, 0x21,0xe0,0x24, +0x0, 0xe4,0x8f,0x92,0x37,0xa5,0x3f,0x92,0xa4,0x6f,0xe2,0x1, 0xc4,0x7f,0xde,0xf7, +0xe2,0x0, 0xcc,0x1, 0x1, 0xf1,0x14,0x1, 0x9, 0x21,0xe0,0x24,0x0, 0xd6,0x8, 0xb5, +0xe0,0x0, 0x19,0x2b,0x3a,0xe8,0x8f,0xb2,0xe2,0x0, 0xcf,0x81,0x1, 0x97,0xe0,0x1, +0x19,0xdf,0xe0,0x2, 0x1a,0x73,0x97,0x83,0xe2,0x0, 0xc7,0x81,0x2f,0x87,0xa7,0x84, +0xe0,0x4, 0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x27,0x83,0xe0,0x1, 0xd2,0x4, 0xe0,0x3, +0xd4,0xac,0x8f,0xb2,0xe2,0x0, 0xcf,0x81,0x1, 0x6f,0x2a,0x82,0xa, 0xe1,0xa, 0xa1, +0xe0,0xb8,0x0, 0xf2,0x8, 0xb1,0xe0,0x1, 0x1f,0xdf,0x97,0x8f,0xe2,0x0, 0xc7,0x81, +0x2f,0xa0,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xe0,0x4, 0xa7,0xff,0xe2,0x0, 0xc7,0x81, +0x2f,0x98,0xe0,0x3, 0xd4,0x92,0xe0,0x0, 0x1f,0x2b,0xe0,0x2, 0x8c,0x1e,0x24,0x10, +0x8f,0xce,0x27,0x84,0x0, 0x91,0x8e,0xcc,0x2e,0x8f,0xe0,0x2, 0x8e,0x9e,0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe0,0xc, 0x3f,0x1f,0x2, 0xf6,0x14,0x0, 0x8, 0xe1, +0xe0,0x1, 0xd1,0xd1,0x0, 0xe7,0x14,0x1, 0x8, 0xe1,0xe2,0x0, 0xcc,0x5, 0x2, 0x87, +0xe0,0x0, 0x1f,0xab,0x3c,0x1f,0xe0,0x2, 0x8c,0x28,0x38,0x82,0x14,0x0, 0x38,0x82, +0x8, 0xb2,0xe0,0x1, 0x1f,0xdf,0x39,0x68,0x97,0x8f,0xe2,0x0, 0xc7,0x81,0x2f,0x9f, +0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xe0,0x4, 0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x2f,0x97, +0xe0,0x3, 0xd4,0x5b,0xe2,0x0, 0xc9,0x5, 0xe0,0x0, 0x1f,0xab,0x17,0x0, 0x2, 0x84, +0x39,0x1f,0xe0,0x2, 0x8f,0x22,0xe0,0x2, 0x8e,0x9f,0x14,0x1, 0x3e,0xfe,0x5, 0x86, +0x3f,0x9e,0x8c,0x4f,0x17,0x80,0xe1,0x28,0x3c,0xf, 0x9, 0x61,0xe0,0x1, 0xd1,0x9b, +0x0, 0xe8,0x8, 0xb1,0xe0,0x5, 0xdc,0x10,0xe0,0x0, 0x1f,0xab,0x16,0x83,0xae,0xbf, +0x17,0x2, 0xaf,0x4f,0x16,0x80,0xaf,0x5f,0xaf,0x6f,0xaf,0x7f,0xe0,0x1, 0x1e,0x5f, +0xe0,0x1, 0xaf,0xf, 0x97,0x8c,0xe0,0x2, 0x1f,0x5a,0xe3,0xff,0xc7,0xef,0xb7,0x8c, +0x97,0x8e,0xe3,0xff,0xc7,0xdf,0xb7,0x8e,0xe0,0x1, 0x1f,0xfa,0xae,0x8f,0xe0,0x1, +0x1f,0xb1,0xa7,0xf, 0xe0,0x0, 0x1f,0x90,0xae,0x8f,0xe7,0x7f,0x16,0xff,0xa7,0x8e, +0x3f,0xdd,0xbf,0x8e,0x8, 0xe1,0xe0,0x0, 0x1f,0xab,0x8f,0x3f,0xe2,0x0, 0xcf,0x1, +0x1, 0x2, 0x38,0x82,0x87,0x1f,0xaf,0x2f,0xe0,0x1, 0x8f,0x7f,0xc7,0x1, 0xe0,0x1, +0xaf,0x7f,0xe0,0x1, 0x8f,0x6f,0xc7,0x1, 0xe0,0x1, 0xaf,0x6f,0xe0,0x1, 0x8e,0xef, +0x8f,0x1f,0x37,0x25,0x3f,0x1f,0xe0,0x6, 0x8f,0x5e,0x3e,0xfe,0x4, 0xeb,0x17,0x0, +0xe0,0x1, 0xaf,0x6f,0x8f,0x1f,0xc7,0x1, 0xaf,0x1f,0x8e,0x9f,0x8f,0xf, 0x3e,0xfe, +0x3, 0xe1,0x17,0x3, 0xaf,0x3f,0x38,0x82,0x8, 0xb4,0xe0,0x0, 0x19,0x2b,0xe0,0x1, +0x8f,0x72,0x8f,0xa2,0x89,0xb2,0xe2,0x0, 0xc9,0x81,0x1, 0x2, 0xa, 0x61,0x8e,0x22, +0x8e,0x82,0x3e,0x7d,0x3, 0xa8,0x37,0xa3,0x8e,0xa2,0x3f,0x9e,0xc7,0x87,0x36,0xa5, +0x37,0xa2,0x3f,0x92,0xe0,0x4, 0x39,0x1e,0x3e,0x92,0xa6,0xed,0xa4,0x8f,0xe0,0x1, +0x8f,0x94,0xe4,0x0, 0xc7,0x87,0x3f,0x9e,0xc7,0x82,0xe0,0x2, 0x1f,0x69,0x37,0xa1, +0x3f,0x9e,0x8c,0x1f,0x34,0x47,0x24,0x8f,0xe0,0x1, 0x17,0xff,0x3f,0xdd,0xe0,0x2, +0x1f,0x7b,0xe2,0x0, 0xcf,0x86,0xa9,0x8e,0x2, 0x86,0xe0,0xf, 0x31,0xbf,0xe2,0x0, +0xc7,0xd7,0x2f,0x8c,0x8f,0x12,0x8f,0x82,0x3f,0x7f,0x4, 0xd1,0x17,0x82,0xaf,0xb2, +0x17,0x0, 0xe0,0x0, 0x1f,0x94,0xaf,0xf, 0xa, 0x61,0xef,0xff,0xd6,0x85,0xe0,0x1, +0x1f,0xdf,0x9f,0x8f,0x37,0xc4,0xe2,0x0, 0xc7,0x81,0x27,0x86,0x17,0x2, 0xaf,0x44, +0xe0,0x5, 0xdb,0x72,0x0, 0xe8,0xa9,0xc4,0x0, 0xfc,0x0, 0x0, 0x8, 0xb1,0xc0,0x68, +0xe0,0x2, 0x1f,0xbf,0xe9,0xff,0xc4,0x7e,0x87,0x5f,0x86,0xcf,0xe0,0xf, 0x34,0x41, +0x6f,0x5, 0x14,0x85,0x17,0x0, 0x7f,0x83,0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0x80, +0x6e,0x84,0x6f,0x6, 0x77,0x84,0xe0,0x5, 0xdd,0xd9,0xc0,0x18,0x8, 0xe1,0xe0,0x2, +0x1f,0xa8,0xe0,0x2, 0x1f,0x3f,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, 0xc7,0x81, +0x3e,0xff,0x1, 0x2e,0x9f,0xde,0xe0,0x2, 0x1e,0xf0,0xe2,0x0, 0xcc,0x2, 0xe0,0x2, +0x1f,0x6f,0x3d,0xed,0xe0,0x6b,0x39,0x2e,0xe2,0x0, 0xcc,0x85,0x16,0x1, 0x36,0x39, +0x2, 0x12,0x27,0x91,0x15,0x7f,0x3d,0x1f,0xe3,0xff,0xc5,0x7f,0x17,0x7f,0xe2,0x1, +0xc6,0x7f,0x3f,0x1b,0x3d,0x1b,0x86,0x9e,0x3e,0xcc,0xe0,0x80,0xae,0x9e,0x3f,0x7a, +0x1, 0xfb,0x0, 0x83,0xe2,0x1, 0xc6,0x7f,0x16,0x86,0x3e,0x9f,0x3e,0x9b,0x3f,0x9b, +0x87,0xf, 0x3f,0x4c,0xe1,0x80,0xaf,0x1f,0x3e,0xff,0x1, 0xfb,0x38,0x82,0x9f,0xee, +0x0, 0xd3,0xe0,0x2, 0x1f,0xa8,0xe0,0x2, 0x1f,0x3f,0x87,0x8f,0xe0,0x3, 0x8e,0xae, +0xe2,0x0, 0xc7,0x81,0x3e,0xff,0x1, 0x3c,0x9f,0xde,0xe0,0x2, 0x1f,0x70,0xe2,0x0, +0xcc,0x2, 0xe0,0x2, 0x1e,0xef,0x3e,0x6e,0xe0,0x6c,0x39,0x2d,0xe2,0x0, 0xcc,0x85, +0x14,0x1, 0x34,0x39,0x2, 0x18,0x27,0x97,0x14,0xff,0x3c,0x9f,0xe3,0xff,0xc4,0xff, +0xc4,0x81,0x3e,0xea,0x3f,0x6c,0x3c,0x9c,0xf0,0x41,0x3b,0x88,0x9d,0x8d,0xc6,0x82, +0xe2,0x9, 0xcd,0xaf,0x2, 0x85,0x85,0x8e,0xe8,0xb, 0x3d,0xd7,0xad,0x8e,0xc7,0x1, +0x3f,0x79,0x1, 0xf5,0x17,0x6, 0xe0,0xd, 0x37,0xa1,0x3f,0x1f,0x3f,0x1c,0x3f,0x9c, +0x3d,0x1d,0xe0,0x41,0x3e,0x8, 0x9e,0x8a,0xc5,0x2, 0xe2,0x9, 0xce,0xaf,0x2, 0x84, +0x86,0x8f,0x3e,0xdc,0xae,0x8f,0xc7,0x81,0x3f,0x7f,0x1, 0xf6,0x38,0x82,0x9f,0xee, +0x0, 0xc5,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0x39,0x68,0xe0,0x1, 0xd2,0x26,0xe0,0x2, +0x1f,0xa8,0xe0,0x2, 0x1f,0x3f,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, 0xc7,0x81, +0x3e,0xff,0x3b,0x68,0xe0,0x0, 0x1, 0x77,0x95,0x5e,0xc5,0x6, 0xe3,0xff,0xc5,0x7f, +0xe2,0x0, 0xc9,0x2, 0xe0,0x2, 0x1c,0x6f,0xe0,0x2, 0x1f,0xf0,0x14,0x80,0xe0,0x68, +0x39,0xaf,0xe0,0x7, 0xd8,0xa3,0xe0,0x0, 0x2b,0x62,0xe0,0x2, 0x1f,0xf3,0xe0,0x1, +0x1e,0xdf,0xa7,0x8f,0x16,0x5f,0xa7,0x4f,0x97,0x8d,0x37,0x45,0xe2,0x0, 0xc7,0x20, +0x3f,0xdc,0x3f,0xce,0xe0,0x2, 0x1a,0xf0,0xf0,0x1, 0x1c,0x4c,0xf0,0x1, 0x1c,0xcb, +0xb7,0x8d,0x11,0x85,0xe0,0x13,0x13,0xc4,0x12,0x1, 0x3c,0x67,0xe0,0x5, 0xd2,0x3, +0x3c,0xe3,0x3c,0x62,0xdf,0x3d,0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd3,0xb, 0xdd,0xa7, +0x23,0x2d,0x3c,0xe2,0x3c,0x64,0xde,0x4d,0x24,0x7d,0xe8,0x40,0x3d,0x68,0x3c,0xe3, +0x3c,0x62,0xc1,0xff,0xdf,0x67,0xe0,0x43,0x39,0x83,0x3c,0xe3,0x3c,0x62,0xdf,0x28, +0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd2,0xf6,0x3c,0x64,0xdd,0xe2,0xe8,0x40,0x3d,0x69, +0x3c,0xe3,0x3c,0x62,0xdf,0x57,0xe0,0x1, 0xd2,0x36,0x2c,0xd, 0xc1,0xff,0xe0,0x43, +0x39,0x83,0xe2,0x0, 0xc9,0x80,0x3, 0x52,0xe0,0x2, 0x1c,0x70,0x3c,0xe2,0xef,0xff, +0xd2,0xe1,0x2b,0xc, 0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x3c,0x64,0xdd,0xc9,0xe8,0x40, +0x3d,0x68,0x3c,0xe3,0x3c,0x62,0xdf,0x3e,0x0, 0xe7,0xe0,0x0, 0x1f,0xb7,0x8c,0xf, +0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xf7,0x0, 0xf2,0xd8,0xf2,0x13,0x1, 0xe7,0xff, +0x0, 0x9e,0x95,0x6e,0xc5,0x6, 0xe3,0xff,0xc5,0x7f,0xe7,0xff,0x0, 0x8b,0x8, 0xb1, +0xe0,0x2, 0x1f,0x87,0x17,0x0, 0xb7,0xf, 0xdf,0x6d,0x14,0x1, 0x8, 0xe1,0x8, 0xb6, +0xe0,0x2, 0x1f,0x8d,0x8a,0xf, 0xe0,0x1, 0xd1,0xfe,0x2c,0x1e,0xe0,0x2, 0x1a,0xba, +0x11,0x1, 0x8f,0x85,0x37,0xd4,0x3f,0xd2,0x2f,0x83,0x3c,0x62,0xb, 0x61,0xe0,0x2, +0x1f,0x3b,0xe0,0x6, 0x31,0x34,0x8f,0x8e,0xe2,0x1, 0xc3,0x7f,0x3f,0xc6,0x39,0xe8, +0x3c,0x62,0xaf,0x8e,0xdd,0x8d,0xe0,0x2, 0x1f,0x87,0x3c,0x64,0xb1,0x8f,0xdf,0x4a, +0xe0,0x1, 0xd1,0xe1,0x24,0x4, 0x11,0x0, 0x3c,0x62,0xb, 0x61,0x8f,0x85,0xe3,0x6, +0x3f,0xd6,0xab,0x5, 0xd7,0xe6,0xe0,0x1, 0xd1,0x23,0x0, 0xe0,0x8, 0xb5,0xe0,0x2, +0x1f,0x8d,0x3a,0xe8,0x89,0x8f,0xe0,0x1, 0xd1,0xce,0x2c,0x1a,0xe0,0x2, 0x1a,0x3b, +0x39,0x68,0x8f,0x84,0x14,0x1, 0x37,0xd3,0x3f,0xd8,0x2f,0x82,0xa, 0xe1,0xdd,0x68, +0x3c,0xe3,0x3c,0x62,0xe0,0x6, 0xd5,0xec,0xe0,0x1, 0x1f,0xd0,0xe0,0x1, 0x1d,0x49, +0xe0,0x1, 0x1c,0xc8,0xa4,0xf, 0x3d,0xe3,0xe0,0x6, 0xd2,0x42,0x2c,0x3, 0x14,0x0, +0xa, 0xe1,0xe0,0x1, 0xd1,0xb0,0x2c,0x7c,0x2a,0x8d,0x8f,0x84,0x11,0x1, 0xe0,0x3, +0x31,0x33,0xe3,0x3, 0x3f,0xd3,0xa9,0x84,0xe0,0x1, 0xd0,0xf2,0xd7,0xb2,0x3c,0x62, +0xa, 0xe1,0xdc,0xf5,0x0, 0xf3,0x8, 0xb3,0xe0,0x3, 0xd0,0x98,0xe0,0x1, 0xd1,0xaa, +0xe0,0x2, 0x1f,0xba,0x8f,0x8f,0x27,0x8b,0xe0,0x13,0x11,0x44,0x0, 0x86,0x3c,0x62, +0xe0,0x5, 0xd1,0x39,0xe0,0x1, 0xd1,0x9e,0xdf,0x8b,0x24,0x7a,0xe0,0x2, 0x1f,0xbb, +0x11,0x1, 0x8f,0x8f,0xe0,0x13,0x11,0xc4,0x2f,0x87,0x0, 0x89,0x3c,0x63,0xe0,0x5, +0xd1,0x2a,0xe0,0x1, 0xd1,0x8f,0x3c,0x62,0xdf,0xaa,0x24,0x79,0x9, 0xe1,0xe0,0x1, +0x1f,0xde,0x16,0x7e,0xa6,0x8f,0xe0,0x0, 0x1f,0xac,0xa7,0x1d,0xa7,0x8f,0xcf,0x40, +0xbf,0x1d,0x17,0x0, 0xaf,0x7f,0x15,0xfd,0xa7,0xf, 0xe0,0x1, 0x1e,0xb1,0x3f,0x5c, +0xbf,0xf, 0xa7,0xf, 0xa6,0x8d,0x3f,0x5b,0xbf,0xf, 0xe0,0x1, 0xa7,0xd, 0x37,0x48, +0xe2,0x0, 0xc7,0x1, 0x2f,0x1c,0xe0,0x1, 0x1f,0x23,0x87,0xe, 0xe2,0x1, 0xc7,0x7e, +0xe0,0x1, 0xaf,0x3f,0x17,0x8, 0xe0,0x61,0x3f,0x11,0x17,0x10,0xe0,0x61,0x3f,0x11, +0xa7,0x4f,0xcf,0x10,0xbf,0x4f,0xe0,0x61,0x3f,0x82,0xcf,0x88,0xe0,0x61,0x3f,0x92, +0xe0,0x61,0x3f,0x82,0xcf,0x90,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x1, 0xa7,0xd, +0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x2f,0x60,0xe0,0x1, 0x1f,0x23,0xe0,0x1, 0x87,0x4e, +0x3e,0x5e,0xe0,0x1, 0xae,0x3f,0x0, 0xdf,0xd, 0xbf,0xe0,0x1, 0x1f,0xde,0xa7,0x8f, +0xa7,0x6f,0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa6,0x8e, +0xe0,0x2, 0xa7,0xd, 0x37,0x49,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x57,0xa7,0x6f, +0x37,0x41,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, +0xa7,0xe, 0x37,0x41,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x32,0xa7,0x6f,0x37,0x4a, +0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x16,0xa7,0x6f,0xe2,0x0, 0xc7,0x1, +0x27,0xa, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0xe2,0x0, 0xc7,0x1, +0xe0,0x2, 0x2f,0x7e,0xa7,0x6f,0x37,0x48,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x48,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, +0x2f,0x62,0xa7,0x6f,0x37,0x43,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x48, +0xa7,0x6f,0x37,0x42,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x42,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x25,0xa7,0x6f, +0x37,0x47,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, +0xa7,0xe, 0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x9, 0xa7,0x6f,0x37,0x4b, +0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0x37,0x4b,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x60,0xa7,0x6f,0x37,0x4c,0xe2,0x0, +0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4d, +0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x44,0xa7,0x6f,0x37,0x4d,0xe2,0x0, 0xc7,0x1, +0x27,0xb, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4c,0xe2,0x0, +0xc7,0x1, 0xe0,0x1, 0x2f,0x28,0xa7,0x6f,0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0xb, +0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, +0xe0,0x1, 0x2f,0xc, 0xa7,0x6f,0x37,0x4f,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4f,0xe2,0x0, 0xc7,0x1, 0xe0,0x0, +0x2f,0x69,0xa7,0x6f,0x37,0x44,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x31, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x44,0xe2,0x0, 0xc7,0x1, 0xe0,0x0, 0x2f,0x4f, +0xa7,0x6f,0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x27,0xa, 0xe0,0x1, 0x1f,0x31,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x2f,0x29,0xa7,0x6f,0x37,0x46, +0xe2,0x0, 0xc7,0x1, 0x27,0x1f,0xe0,0x1, 0x1f,0x31,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0x37,0x46,0xe2,0x0, 0xc7,0x1, 0x27,0x16,0xa7,0x5f,0xa6,0xdf,0x37,0x46,0xe2,0x0, +0xc7,0x1, 0xe7,0xff,0x16,0x3f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc,0x37,0x26,0x3f,0x4d, +0xbf,0x5f,0xa7,0x6f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0x8d,0xcf,0xc0, +0xb7,0x8d,0x17,0x81,0xe0,0x61,0x3f,0x91,0xf, 0xab,0x38,0x0, 0xa7,0x5f,0xa6,0xdf, +0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe7,0xfe,0x16,0x7f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc, +0x37,0x27,0x3f,0x4d,0xbf,0x5f,0x16,0x5f,0xa7,0x6f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c, +0xbf,0x6f,0x9f,0xd, 0xcf,0x20,0xb7,0xd, 0x0, 0xc2,0xa7,0x6f,0x16,0x6f,0xe0,0x2, +0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x10,0xb7,0xd, 0xe7,0xff,0x0, 0xaa, +0xa7,0x6f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xe0,0x2, 0x1e,0x83,0xbf,0x6f,0x17,0x1, +0xe0,0x0, 0x1e,0x1a,0xaf,0xd, 0xe0,0x2, 0x1e,0xaa,0xaf,0xc, 0x9f,0xd, 0xe1,0x0, +0xcf,0x0, 0xb7,0xd, 0xe7,0xff,0x0, 0x87,0xa7,0x6f,0xe7,0x7f,0x16,0x7f,0xe0,0x2, +0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x80,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe, +0x0, 0xeb,0xa7,0x6f,0xe7,0xbf,0x16,0x7f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f, +0x9f,0xd, 0xe0,0x40,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0xcf,0xa7,0x6f,0xe7,0xdf, +0x16,0x7f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x20,0xcf,0x0, +0xb7,0xd, 0xe7,0xfe,0x0, 0xb3,0xa7,0x5f,0xa6,0xdf,0x37,0x4f,0xe2,0x0, 0xc7,0x1, +0xe6,0xff,0x16,0x7f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc,0x37,0x2f,0x3f,0x4d,0xbf,0x5f, +0xe7,0xef,0x16,0x7f,0xa7,0x6f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, +0xe0,0x10,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0x8a,0xa7,0x6f,0xe7,0xfe,0x16,0x7f, +0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x1, 0xcf,0x0, 0xb7,0xd, +0xe7,0xfd,0x0, 0xee,0xa6,0xef,0xe0,0x0, 0x1f,0x22,0x16,0x7b,0xa7,0xe, 0x3e,0xdc, +0xbe,0xef,0xa6,0x9e,0xe0,0x2, 0x1e,0x2a,0xce,0x81,0xbe,0x9e,0xa6,0x9e,0xce,0x90, +0xbe,0x9e,0x9f,0xc, 0xcf,0x4, 0xb7,0xc, 0xe7,0xfd,0x0, 0xcb,0xa7,0x6f,0x16,0x77, +0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x8, 0xb7,0xd, 0xe7,0xfd, +0x0, 0xb1,0xa7,0x6f,0xe7,0xfd,0x16,0x7f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f, +0x9f,0xd, 0xe0,0x2, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfd,0x0, 0x95,0xa7,0x6f,0x16,0x7e, +0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x1, 0xb7,0xd, 0xe7,0xfc, +0x0, 0xfb,0xa7,0x6f,0xe7,0xf7,0x16,0x7f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f, +0x9f,0xd, 0xe0,0x8, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfc,0x0, 0xe1,0xe0,0x1, 0x1f,0x59, +0x16,0x81,0xae,0x8e,0x16,0x5f,0xe0,0x0, 0x1f,0x2c,0xa6,0x8e,0xa7,0xd, 0x3f,0x5c, +0xbf,0xd, 0x16,0x7d,0xa7,0x6f,0xe0,0x2, 0x1e,0xaa,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, +0xcf,0x2, 0xb7,0xd, 0xe7,0xfc,0x0, 0xbc,0xe0,0x1, 0xa7,0x6d,0xe7,0xef,0x15,0xff, +0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6d,0xe0,0x1, 0xa7,0x6d,0xe0,0x2, 0x1e,0x2a, +0x3f,0x5b,0xe0,0x1, 0xbf,0x6d,0xe7,0xfb,0x16,0xff,0xa7,0x6f,0x3f,0x5d,0xbf,0x6f, +0x9f,0xc, 0xe0,0x4, 0xcf,0x0, 0xb7,0xc, 0xe7,0xfc,0x0, 0x93,0xf, 0x3f,0xe0,0x1, +0x1f,0x61,0x97,0xde,0xe0,0x40,0xcf,0x80,0xb7,0xde,0x17,0x82,0xe0,0x61,0x3f,0x91, +0xf, 0xae,0x38,0x0, 0xf, 0xbf,0x17,0x84,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0xf, 0xbf,0x17,0xa0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x0, +0x17,0xc0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xe, 0x3f,0xe0,0x2, 0x1f,0x7, +0xe0,0x0, 0x1e,0x9e,0x9f,0x8e,0xe0,0x2, 0x1e,0xc, 0xc7,0x81,0xb7,0x8e,0x9f,0x8d, +0x9f,0xc, 0xc7,0x81,0xb7,0x8d,0x27,0x3, 0xc7,0x7f,0xb7,0xc, 0xe0,0x2, 0x1f,0xd4, +0x8f,0xf, 0x27,0x4, 0x8f,0xf, 0xc7,0x7f,0xaf,0xf, 0x8f,0x8f,0x2f,0x86,0xe0,0x1, +0x1f,0x5f,0x97,0x8e,0xcf,0x88,0xb7,0x8e,0xe0,0x2, 0x1e,0xac,0xe0,0x2, 0x1f,0x0, +0x9f,0x8d,0xc7,0x81,0xb7,0x8d,0x9f,0x8e,0x27,0x84,0x9f,0x8e,0xc7,0xff,0xb7,0x8e, +0xe0,0x2, 0x1f,0xea,0x9f,0xf, 0x27,0x4, 0x9f,0xf, 0xc7,0x7f,0xb7,0xf, 0xe0,0x2, +0x1f,0xc0,0xe0,0x0, 0x1f,0x2e,0xa7,0x8f,0x97,0xe, 0xb7,0x3f,0xa7,0xf, 0xcf,0x1, +0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe0,0x2, 0x17,0x80,0xe0,0x61, +0x3f,0x91,0xf, 0xac,0x38,0x0, 0xf, 0xbf,0xe0,0x4, 0x17,0x80,0xe0,0x61,0x3f,0x91, +0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x8, 0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf, +0x38,0x0, 0xf, 0xbf,0xe0,0x10,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0xf, 0xbf,0xe0,0x80,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf, +0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0x8, 0xb1,0xe8,0x0, +0xc, 0x37,0xe0,0x2, 0xdc,0x56,0x17,0x88,0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8, +0x8, 0xa1,0x38,0x0, 0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x2, 0xdc,0x85,0x17,0x90, +0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x8, 0xb1,0xe8,0x0, +0xc, 0x37,0xe0,0x2, 0x1f,0xa6,0xe7,0xfe,0x16,0xff,0xa7,0xf, 0xa7,0xbe,0x3f,0xdd, +0xbf,0xbe,0xe0,0x4, 0xde,0x38,0xe0,0x40,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf0,0x0, +0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x3f,0x83,0xe0,0x1, 0x1f,0xab,0xe0,0x6, 0x8f,0xf, +0xc7,0x7f,0xe0,0x6, 0xaf,0xf, 0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f,0xa7,0xe, +0xe0,0x60,0x3f,0x19,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f,0xa7,0x1e,0xe0,0x60, +0x3f,0x1a,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f,0xa7,0x2e,0xe0,0x60,0x3f,0x18, +0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x9e,0xa7,0xbf,0xe0,0x61,0x3f,0x92,0x3b,0x0, +0x38,0x82,0xe0,0x1, 0x1d,0x54,0x16,0x84,0xae,0x8a,0x17,0x81,0xaf,0x9a,0x17,0x2, +0xaf,0xaa,0xf0,0x0, 0x13,0x80,0xae,0xba,0xf8,0x40,0x3a,0xe7,0xae,0xca,0x14,0x1, +0xaf,0x5a,0xaf,0x6a,0xaf,0x7a,0xe0,0x1, 0xaf,0xa, 0x17,0x3, 0xe0,0x1, 0xaf,0x9a, +0xe0,0x1, 0xaf,0xaa,0xe0,0x1, 0xaf,0xba,0xe0,0x1, 0xaf,0xca,0xe0,0x1, 0xaf,0xda, +0xe0,0x0, 0x17,0x80,0xe0,0x1, 0xaf,0x6a,0xf0,0x2, 0x1b,0x33,0xe0,0x1, 0xaf,0xfa, +0xf0,0xb, 0x33,0xa2,0xe8,0xb, 0x3d,0x96,0xf0,0x0, 0xba,0x8b,0xe0,0x0, 0x17,0x80, +0xe8,0x9, 0x3d,0x17,0xe0,0xe, 0x3d,0x1f,0x8e,0xe, 0x8e,0x89,0xe0,0xe, 0x34,0x3f, +0x3e,0x7d,0xc7,0x81,0x5, 0x84,0xa6,0x8b,0x3f,0x4d,0xbf,0xb, 0xe2,0x0, 0xcf,0x90, +0x1, 0xf2,0xf0,0x0, 0xc3,0x81,0xf2,0x0, 0xcb,0x90,0x1, 0xe3,0xe0,0x1, 0x1f,0xab, +0x17,0x0, 0xe0,0x6, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x33,0xe0,0xf, 0x34,0x22, +0x3f,0x1f,0xa7,0x8e,0x27,0xb3,0x3f,0x83,0xe0,0x1, 0x1f,0xab,0xe0,0x6, 0x8e,0x8f, +0xe0,0x60,0x3e,0x9, 0x36,0xa4,0x3e,0x9f,0xbe,0xd, 0xe0,0x6, 0x8e,0x8f,0xe0,0x60, +0x3e,0xa, 0x36,0xa4,0x3e,0x9f,0xbe,0x1d,0xe0,0x6, 0x8e,0x8f,0xe0,0x60,0x3e,0x8, +0x36,0xa4,0x3e,0x9f,0xbe,0x2d,0xe0,0x6, 0x8e,0x8f,0xe0,0x61,0x3e,0x2, 0x36,0xa4, +0x3e,0x9f,0xbe,0x3d,0xe0,0x6, 0x8e,0x8f,0xc6,0x81,0xe0,0x6, 0xae,0x8f,0xa7,0x8e, +0xe0,0x61,0x3f,0x92,0x17,0x81,0xe0,0x8, 0x37,0xb8,0xe0,0x61,0x3c,0x11,0xe0,0x60, +0x3f,0x80,0xcf,0x82,0xe0,0x60,0x3f,0x90,0x3b,0x0, 0x38,0x82,0x8, 0xb4,0xe8,0x0, +0xc, 0x37,0xe0,0x2, 0x1f,0xf3,0xa1,0xf, 0xa7,0xb2,0x37,0xcf,0xe2,0x0, 0xc7,0x81, +0x27,0x87,0xa7,0x82,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xf2,0xa7,0xb2, +0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xf1, +0xa7,0xb2,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xc1,0xe2,0x0, +0xc7,0x81,0xe0,0x0, 0x2f,0xed,0xa7,0xb2,0x37,0xca,0xe2,0x0, 0xc7,0x81,0x27,0x87, +0xa7,0x82,0x37,0xca,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xe9,0xa7,0xb2,0x37,0xcb, +0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0x37,0xcb,0xe2,0x0, 0xc7,0x81,0x2f,0xbd, +0xa7,0xb2,0x37,0xcc,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xcc,0xe2,0x0, +0xc7,0x81,0xe0,0x0, 0x2f,0xe6,0xa7,0xb2,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0xa5, +0xa7,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0xa0,0xa7,0x92,0xe0,0x0, 0x1a,0x10, +0xe0,0x1, 0xcf,0x80,0xbf,0x92,0x8f,0x84,0xe0,0x1, 0x19,0xdf,0x27,0x89,0x99,0x3, +0x31,0x4c,0xe2,0x0, 0xc1,0x1, 0x29,0x4, 0xe0,0x5, 0xd6,0x76,0xa9,0x4, 0x97,0x83, +0xe0,0x2, 0x1f,0x72,0xe3,0xdf,0xc7,0xff,0xb7,0x83,0x97,0x83,0xe3,0xbf,0xc7,0xff, +0xb7,0x83,0x9f,0x8e,0xc7,0x81,0xb7,0x8e,0xe0,0x1, 0x17,0x80,0xe0,0x61,0x3f,0x91, +0xf0,0x0, 0xb, 0xa8,0xa, 0x21,0x38,0x0, 0xa7,0x92,0xe0,0x2, 0x1f,0x5a,0xe0,0x10, +0xcf,0x80,0xbf,0x92,0x97,0x8e,0xcf,0xa0,0xb7,0x8e,0xe7,0xff,0x0, 0xbb,0xa7,0x92, +0xe1,0x0, 0xcf,0x80,0xbf,0x92,0xe0,0x0, 0xdb,0x32,0xe7,0xff,0x0, 0x8a,0xa7,0x92, +0xcf,0x81,0xbf,0x92,0xe0,0x0, 0xdb,0x18,0xe7,0xff,0x0, 0x8c,0xa7,0x92,0xcf,0x82, +0xbf,0x92,0xe0,0x0, 0xdb,0x24,0xe7,0xff,0x0, 0x90,0xa7,0x92,0xe0,0x1, 0x19,0xdf, +0xe0,0x8, 0xcf,0x80,0xbf,0x92,0x97,0x83,0xe0,0x1, 0x1f,0x61,0xcf,0x82,0xb7,0x83, +0x97,0xce,0xcf,0x88,0xb7,0xce,0xe0,0x0, 0xda,0xee,0xe7,0xff,0x0, 0x89,0xa7,0x92, +0x14,0x7, 0xe0,0x20,0xcf,0x80,0xbf,0x92,0xdf,0x18,0xe0,0x2, 0x1e,0xda,0xe0,0x1, +0x19,0xdf,0x9f,0xd, 0x97,0x83,0x16,0x6f,0x37,0x41,0xe2,0x0, 0xc7,0x10,0x3f,0xdc, +0x3f,0xce,0xb7,0x83,0x97,0x8d,0xe3,0xff,0xc7,0xdf,0xb7,0x8d,0xd9,0x65,0xd9,0x8d, +0xa7,0x92,0xe0,0x1, 0x1f,0x61,0xe0,0x20,0xcf,0x80,0xbf,0x92,0xe7,0x0, 0x16,0x80, +0x97,0xde,0x3f,0xcd,0xb7,0xde,0xe0,0x2, 0x1f,0xb3,0xa7,0xff,0x2f,0x87,0xe0,0x1, +0x17,0x80,0xe0,0x61,0x3f,0x91,0xe7,0xfe,0x0, 0xf0,0xde,0x7e,0xe7,0xfe,0x0, 0xed, +0xe0,0x2, 0x1f,0xb3,0xe0,0xe, 0x34,0x22,0x3f,0x9e,0xa7,0x8f,0x2f,0x87,0x17,0x81, +0xe0,0x8, 0x37,0xb8,0xe0,0x61,0x3c,0x11,0x38,0x82,0xe7,0xfc,0x0, 0xee,0x8, 0xb1, +0xe0,0x7, 0xd3,0x61,0xe0,0x60,0x3f,0x87,0xe0,0x1, 0x1f,0x29,0xe0,0x1, 0xbf,0xf, +0xe0,0x2, 0x1f,0x27,0xe0,0x1, 0xbf,0x1f,0xe0,0x2, 0x1f,0x4f,0xe0,0x1, 0xbf,0x2f, +0xe0,0x1, 0x1f,0x25,0xe0,0x1, 0xbf,0x3f,0xe0,0x2, 0x1f,0x52,0xe0,0x1, 0xbf,0x4f, +0xe0,0x0, 0x1f,0x34,0xe0,0x1, 0xbf,0x5f,0xe0,0x0, 0x1f,0x11,0xe0,0x1, 0xbf,0x6f, +0xe0,0x1, 0x1f,0x73,0xe0,0x1, 0xbf,0x7f,0xe0,0x1, 0x1f,0x67,0xe0,0x2, 0xbf,0xf, +0xe0,0x2, 0x1f,0x23,0xe0,0x2, 0xbf,0x1f,0xe0,0x1, 0x1f,0x52,0xe0,0x2, 0xbf,0x2f, +0xe0,0x2, 0x1f,0x7c,0xe0,0x2, 0xbf,0x3f,0xe0,0x0, 0x1f,0x26,0xe0,0x2, 0xbf,0x4f, +0xe0,0x2, 0x1f,0x2e,0xe0,0x2, 0xbf,0x5f,0xe0,0x0, 0x1f,0x27,0xe0,0x2, 0xbf,0x6f, +0x8, 0xe1,0x0, 0x0, 0xe0,0x1, 0x1f,0xed,0x16,0xfb,0xa7,0xf, 0xa7,0x8e,0x3f,0xdd, +0xbf,0x8e,0x24,0x11,0x17,0x86,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e,0xa7,0x8e,0xcf,0x84, +0xbf,0x8e,0x38,0x82,0x17,0x84,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0x0, 0xf0,0xe0,0x1, 0x1f,0xde,0xe7,0x7f,0x16,0x7f,0xa7,0xf, 0xe0,0x1, +0x1f,0xb1,0xa6,0xae,0xa7,0x8f,0x3e,0xdc,0xbe,0xae,0xe0,0xa0,0x17,0x0, 0x9e,0xbf, +0xe0,0x1e,0xce,0x80,0xb6,0xbf,0xb7,0x7f,0xa7,0x4f,0x3f,0x5c,0xbf,0x4f,0xa7,0x4f, +0xe0,0x20,0xcf,0x0, 0xbf,0x4f,0x38,0x82,0xe0,0x1, 0x1f,0xde,0xe7,0x7f,0x16,0x7f, +0xa6,0x8f,0xe0,0x1, 0x1f,0xed,0xa7,0x1d,0xa7,0x8f,0xcf,0x1, 0xbf,0x1d,0xe6,0xff, +0x16,0xff,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0xa6,0x8f,0xe0,0x1, 0x1f,0x31,0x3e,0xdc, +0xa7,0xe, 0xbe,0x8f,0x9e,0xbe,0xe0,0x1e,0xce,0x80,0xb6,0xbe,0xe0,0x61,0x3e,0x82, +0xe7,0xef,0x15,0xff,0x3e,0xdb,0xe0,0x61,0x3e,0x92,0xe0,0x46,0x16,0x80,0xbe,0x8f, +0x15,0xfe,0xa6,0x8f,0xce,0x84,0xbe,0x8f,0xa6,0x8f,0xce,0x82,0xbe,0x8f,0xa6,0x8f, +0x3e,0xdb,0xbe,0x8f,0xa7,0xce,0x3f,0xdc,0xbf,0xce,0x17,0x0, 0xe0,0x0, 0x1f,0x9f, +0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xed,0xa7,0xf, 0xac,0x7e,0xa7,0x8e,0x37,0xce, +0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e, +0x14,0x1, 0x38,0x82,0x24,0x9b,0xe0,0x1, 0x1f,0xed,0xc4,0xff,0xe3,0xff,0xc4,0xff, +0x16,0xff,0xa7,0xf, 0xe0,0xd, 0x3e,0x98,0xe0,0xc, 0x3c,0x19,0xe7,0x7f,0x15,0xff, +0xe0,0x80,0x87,0x9d,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa7,0x8e,0x3e,0xfc,0x3f,0xdb,0xbf,0x8e,0x1, 0xf4,0x14,0x1, 0x38,0x82,0xe0,0x1, +0x1f,0xed,0xa7,0xf, 0x17,0x80,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e,0x8c,0x7e,0x38,0x82, +0x24,0x9c,0xe0,0x1, 0x1f,0xed,0xc4,0xff,0xe3,0xff,0xc4,0xff,0x16,0xff,0xa7,0xf, +0x3e,0x98,0xe0,0xc, 0x3c,0x19,0x15,0x0, 0xe7,0x7f,0x15,0xff,0xad,0x7e,0xa7,0x8e, +0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0x3f,0xdb,0xbf,0x8e,0x8f,0xfe, +0xe0,0x80,0xaf,0x9d,0x3e,0xfc,0x1, 0xf3,0x38,0x82,0xe0,0x1, 0x1f,0xed,0x16,0xfb, +0xa7,0x8f,0xe4,0xc, 0x34,0x40,0xa7,0xf, 0xe2,0x1, 0xc6,0x7f,0x3f,0x5d,0xbf,0xf, +0xe0,0xd, 0x34,0x48,0x17,0xb, 0xaf,0x7f,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc4,0x7f, +0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x15,0xff, +0x3f,0x5b,0xbf,0xf, 0xae,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c, +0xa7,0xf, 0xe7,0x7f,0x16,0x7f,0x3f,0x5c,0xbf,0xf, 0xae,0xff,0xa7,0xf, 0x37,0x4e, +0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, +0xac,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f, +0x16,0xff,0x3f,0x5d,0xbf,0xf, 0x17,0x0, 0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, 0x38,0x82, +0x8, 0xb3,0x39,0xea,0x39,0x69,0xdf,0xb2,0x21,0xa1,0xe0,0x1, 0x1f,0xed,0xc1,0xff, +0xe3,0xff,0xc1,0xff,0x16,0xff,0xa7,0xf, 0x3e,0x92,0xe0,0xc, 0x39,0x13,0x15,0x0, +0xe7,0x7f,0x15,0xff,0xad,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa7,0x8e,0x3f,0xdb,0xbf,0x8e,0x8f,0xfe,0xe0,0x80,0xaf,0x9d,0x3e,0xfc,0x1, 0xf3, +0xa7,0x8e,0x14,0x1, 0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0xe0,0x1, 0x1f,0xed,0x14,0x1, +0xa7,0xf, 0xa7,0x8e,0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0xe0,0x0, 0x1f,0x9f,0x8f,0x8f, +0xe2,0x1, 0xcf,0xa5,0x1, 0x2, 0x38,0x82,0xe7,0xfd,0x0, 0xb6,0x3f,0x82,0xe0,0x0, +0x1f,0x9f,0x14,0x0, 0x8f,0x8f,0xe2,0x1, 0xcf,0xa5,0x1, 0x2, 0x38,0x82,0xe0,0x1, +0x1f,0xed,0x16,0xfb,0xa7,0xf, 0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0x17,0x85,0xaf,0xfe, +0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff, +0x3f,0xdd,0xbf,0x8e,0x17,0x80,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e,0x8c,0x7e,0xa7,0x8e, +0xe2,0x0, 0xc4,0x1, 0xcf,0x84,0xbf,0x8e,0x38,0x82,0xe0,0x0, 0x1f,0x9f,0x8f,0x8f, +0xe2,0x1, 0xcf,0xa5,0x1, 0x2, 0x38,0x82,0xe0,0x1, 0x1f,0xed,0x16,0xfb,0xa7,0xf, +0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0xac,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e,0xe4,0xf, 0x34,0xc0, +0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0xe7,0x7f, +0x16,0xff,0x3f,0xdd,0xbf,0x8e,0xe0,0xf, 0x34,0xc8,0xaf,0xfe,0xa7,0x8e,0x37,0xce, +0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0xe7,0x7f,0x16,0xff,0x3f,0xdd,0xbf,0x8e, +0xac,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x8e,0xe7,0x7f, +0x16,0xff,0x3f,0xdd,0xbf,0x8e,0x38,0x82,0x8, 0xb4,0x3a,0x68,0x14,0x1, 0x39,0xea, +0x39,0x69,0xde,0x41,0x3c,0xe4,0x14,0x2, 0xdf,0xb9,0x21,0xa0,0xe0,0x1, 0x1f,0xed, +0xc1,0xff,0xe3,0xff,0xc1,0xff,0x16,0xff,0xa7,0xf, 0x3e,0x92,0xe0,0xc, 0x39,0x13, +0xe7,0x7f,0x15,0xff,0xe0,0x80,0x87,0x9d,0xaf,0xfe,0xa7,0x8e,0x37,0xce,0xe2,0x0, +0xc7,0x81,0x27,0xfc,0xa7,0x8e,0x3e,0xfc,0x3f,0xdb,0xbf,0x8e,0x1, 0xf4,0xa7,0x8e, +0xcf,0x84,0xbf,0x8e,0xdf,0x6d,0x2c,0x7f,0xa, 0x61,0xe0,0x1, 0x1f,0xed,0xa7,0xf, +0x0, 0xf7,0xe0,0x0, 0x1f,0x9f,0x8f,0x8f,0xe2,0x1, 0xcf,0xa5,0x1, 0x2, 0x38,0x82, +0xe7,0xff,0x0, 0xcc,0x3f,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x0, 0x17,0xff, +0x3f,0xd8,0xe0,0x1, 0x11,0x0, 0x39,0x2f,0xe3,0xff,0xc1,0x7f,0x39,0x7a,0x4, 0x8c, +0xe0,0x0, 0x1f,0x9f,0x8f,0x8f,0xe2,0x1, 0xcf,0xa5,0xe0,0x0, 0x1, 0x5f,0x14,0x1, +0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x0, 0x1b,0x1f,0x3b,0xe8,0x8f,0x86,0x3a,0xea, +0xe2,0x1, 0xcf,0xa5,0xf0,0x40,0x3c,0x69,0xe0,0x0, 0x1, 0x55,0x3a,0xa2,0xe3,0xff, +0xc2,0xff,0xe2,0x0, 0xca,0xff,0x3b,0x92,0xf0,0x18,0x3c,0x12,0xe0,0x0, 0x5, 0xcf, +0x39,0x65,0xe8,0x40,0x3a,0x68,0x39,0xe7,0xf0,0x1, 0x14,0x80,0x0, 0x8c,0xe1,0xff, +0xc1,0x0, 0xe3,0xff,0xc1,0x7f,0xe2,0x0, 0xc9,0x7f,0xe0,0x1, 0xc2,0x0, 0xe0,0x1, +0xc1,0x80,0x5, 0x95,0x8f,0x86,0xe2,0x1, 0xcf,0xa5,0x1, 0xf2,0x3c,0xe4,0x3c,0x63, +0xe8,0x40,0x3d,0x69,0xe1,0xff,0xc1,0x0, 0xdf,0x80,0xe3,0xff,0xc1,0x7f,0xe2,0x0, +0xc9,0x7f,0xe0,0x1, 0xc2,0x0, 0xe0,0x1, 0xc1,0x80,0x2, 0xed,0xe7,0xff,0x17,0x80, +0x3f,0x95,0xe3,0xff,0xc7,0xff,0x37,0xc7,0x17,0x1, 0x3f,0x1f,0xe0,0x1, 0x12,0x0, +0xe0,0x0, 0x15,0x7f,0x3a,0x17,0x37,0x27,0xe0,0x7, 0x37,0xa7,0x3d,0x55,0xf0,0x18, +0x3c,0x1e,0x3b,0x94,0xe7,0xff,0x25,0x2d,0x8f,0x86,0xe2,0x1, 0xcf,0xa5,0xe7,0xff, +0x1, 0xa8,0xe8,0x40,0x3c,0xe8,0x3c,0x67,0xdf,0x58,0x14,0x1, 0xf8,0x0, 0xc, 0xa8, +0xb, 0xe1,0x3d,0x62,0xdf,0x52,0xe7,0xff,0x0, 0xab,0x3d,0x65,0x0, 0xee,0xe0,0x0, +0x1f,0x9f,0x8f,0x8f,0xe2,0x1, 0xcf,0xa5,0x1, 0x3, 0x14,0x1, 0x38,0x82,0x8, 0xb2, +0x39,0x68,0x14,0x1, 0xdd,0x88,0xe0,0x9, 0x31,0x2c,0x14,0x20,0xde,0xff,0xe0,0x1, +0x1f,0xed,0xa7,0xf, 0xa7,0x8e,0xcf,0x84,0xe0,0x0, 0xbf,0x8e,0xde,0xc9,0x2c,0x7f, +0x14,0x1, 0x9, 0x61,0x8, 0xb2,0x14,0x1, 0xef,0xff,0xd5,0xc3,0xe0,0x1, 0x14,0xc8, +0x14,0x0, 0xe0,0x5, 0xd3,0x4e,0x24,0x14,0xe0,0x2, 0x1f,0xd, 0x17,0x82,0xe0,0x0, +0x19,0x37,0xaf,0x8e,0xe0,0x1, 0x1f,0x5f,0xaf,0x82,0x97,0x8e,0xe0,0x20,0xcf,0x80, +0xb7,0x8e,0x8c,0x2, 0xef,0xff,0xd3,0xe3,0x9, 0x21,0xe7,0xea,0x0, 0xd9,0xe0,0x2, +0x1f,0x8d,0x17,0x1, 0xe0,0x0, 0x19,0x37,0xaf,0xf, 0x3c,0xe8,0xaf,0x2, 0x8f,0x8f, +0xe0,0x2, 0x1c,0x69,0xe4,0x0, 0xc7,0x8e,0x3c,0x1f,0xef,0xfe,0xdf,0x67,0x0, 0xea, +0x8, 0xb2,0xe0,0x2, 0x19,0x5, 0xe0,0x1, 0x8c,0xa2,0xe0,0x4, 0x8f,0xd2,0x2f,0x95, +0xe0,0x0, 0x1f,0xb7,0x8f,0x8f,0xe0,0x0, 0x2f,0xcb,0xe0,0x1, 0x8c,0x82,0x14,0x5, +0xe2,0x0, 0xcc,0x94,0x2, 0x98,0xe0,0x0, 0x14,0x64,0x24,0x95,0xe0,0x0, 0x14,0x63, +0x3c,0x19,0xe0,0x6, 0xdd,0x91,0x0, 0x8f,0xe0,0x0, 0x1f,0xb7,0x8f,0x8f,0x2f,0xa3, +0xe0,0x1, 0x8f,0x92,0xe0,0x0, 0x14,0x7f,0xe0,0x43,0x3f,0xf, 0xe2,0x0, 0xcf,0x0, +0xe0,0x68,0x3b,0x2f,0xe0,0x5, 0x8f,0xc2,0x14,0x98,0x3c,0x3f,0xe0,0x6, 0xdd,0x7c, +0xe0,0x0, 0x1f,0xa5,0xe0,0x2, 0x1f,0x54,0xac,0xf, 0x87,0x8f,0xaf,0x8e,0xe0,0x1, +0x1f,0x5f,0x97,0x8e,0xe3,0xff,0xc7,0xf7,0xb7,0x8e,0x17,0x0, 0xe0,0x2, 0x1f,0x87, +0xb7,0xf, 0x9, 0x61,0xe0,0x2, 0x1f,0xfe,0x8f,0x8f,0xe2,0x0, 0xcf,0xba,0x5, 0x87, +0xe0,0x2, 0x1f,0xfd,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x17,0xe0,0x7, 0x14,0x68, +0xe0,0x6, 0xdd,0x5a,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0x0, 0xd5,0xe0,0x2, 0x1f,0xfd, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xf3,0xe0,0x3, 0x14,0x74,0xe0,0x6, 0xdd,0x4c, +0xc4,0x7e,0xe2,0x1, 0xc4,0x7f,0x0, 0xc7,0xe0,0x3, 0x14,0x74,0xe0,0x6, 0xdd,0x44, +0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0xe7,0xff,0x0, 0xbf,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f, +0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x2, 0x1f,0xfd,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0x2, 0x38,0x82,0xe7,0xfe,0x0, 0xd7,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f, +0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x1, 0x1f,0x5f,0x97,0x8e,0xe0,0x1, +0xcf,0x80,0xb7,0x8e,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, +0xc7,0x81,0x27,0x95,0xe0,0x1, 0x1f,0x5f,0x9f,0x8e,0x37,0xc7,0xe2,0x0, 0xc7,0x81, +0x27,0x8e,0x8, 0xb3,0xe0,0x2, 0x1e,0xfd,0x97,0x8e,0x89,0xd, 0xe3,0xfe,0xc7,0xff, +0xe2,0x0, 0xc9,0x1, 0xb7,0x8e,0x1, 0x5, 0x14,0x1, 0x9, 0xe1,0x14,0x1, 0x38,0x82, +0x3c,0x62,0xef,0xff,0xd4,0xee,0xe0,0x1, 0x14,0xc8,0x3c,0x62,0xe0,0x5, 0xd2,0x79, +0xe0,0x0, 0x19,0xb7,0x2c,0x5, 0x8c,0x3, 0xef,0xff,0xd3,0x19,0x0, 0xee,0xe0,0x2, +0x1f,0x8d,0xe0,0x2, 0x1c,0x69,0xa9,0xf, 0x3c,0xe2,0xa9,0x3, 0x8f,0x8f,0xe4,0x0, +0xc7,0x8e,0x3c,0x1f,0xef,0xfe,0xde,0x83,0x0, 0xef,0x38,0x82,0x8, 0xb6,0xe0,0x0, +0x1f,0xac,0xe0,0x2, 0x19,0x71,0xa1,0x8f,0xa7,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81, +0x27,0x99,0xe0,0x1, 0x1b,0x5f,0xe7,0xff,0x12,0x81,0xe0,0x1, 0x12,0x7f,0x0, 0x8c, +0x9f,0x86,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xd4,0xed,0xa7,0x83,0x37,0xc3, +0xe2,0x0, 0xc7,0x81,0x27,0x87,0xaa,0x82,0xef,0xff,0xd4,0xd6,0x3c,0xe4,0x24,0x71, +0xb, 0x61,0xe0,0x1, 0x1f,0xb1,0xe7,0xef,0x16,0xff,0xa7,0x8f,0xe0,0x4, 0x14,0x89, +0xe0,0x1, 0xa7,0x6f,0x14,0x2, 0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6f,0xe0,0x1, +0xa7,0x6f,0x3f,0x5d,0xe0,0x1, 0xbf,0x6f,0xe7,0xff,0x17,0x81,0xaf,0x82,0xb, 0x21, +0xe0,0x9, 0x0, 0xca,0x8, 0xb2,0xe0,0x1, 0x19,0x5f,0x9f,0x82,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x2f,0x87,0xdf,0xbc,0x9f,0x82,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0xfb, +0x9, 0x61,0x8, 0xb1,0x0, 0x82,0xdf,0xb3,0xef,0xff,0xd4,0xa6,0x24,0x7d,0x8, 0xe1, +0x8, 0xb1,0x14,0x1, 0xef,0xff,0xd4,0x7d,0xe0,0x0, 0x1f,0xac,0xa7,0xf, 0xa7,0x8e, +0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0xfc,0x8, 0xe1,0xe0,0x1, 0x1f,0xde,0xe2,0x0, +0xc4,0x1, 0xa7,0x8f,0xe7,0xdf,0x16,0x7f,0xa7,0x1f,0xe0,0xd, 0x34,0x2c,0x3f,0x5c, +0x3f,0x4d,0xbf,0x1f,0xe7,0xfb,0x16,0x7f,0xa7,0x1f,0xe0,0xd, 0x34,0x29,0x3f,0x5c, +0x3f,0x4d,0xbf,0x1f,0xe7,0xfd,0x16,0x7f,0xa7,0x1f,0xe0,0xd, 0x34,0x28,0x3f,0x5c, +0x3f,0x4d,0xbf,0x1f,0xe7,0xfe,0x16,0xff,0xa7,0x2f,0x34,0x27,0x3f,0x5d,0x3c,0x4e, +0xbc,0x2f,0x38,0x82,0x8, 0xb2,0xe0,0x1, 0x19,0x5f,0x9f,0x82,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x2f,0x8d,0x9f,0x82,0xe0,0xf, 0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x87, +0xdf,0x6e,0x9f,0x82,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0xfb,0xef,0xff,0xd4,0x5c, +0x24,0x3, 0x0, 0x85,0xdf,0x64,0xef,0xff,0xd4,0x57,0x24,0x7d,0x9, 0x61,0xe0,0x0, +0x1f,0xac,0xa7,0x8f,0xa7,0x8f,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x94,0xe0,0x2, +0x1e,0xf1,0xe0,0x1, 0x1f,0x59,0xe7,0xff,0x16,0x1, 0xae,0xd, 0x8e,0x8e,0xe2,0x0, +0xce,0x81,0x1, 0xa, 0xe0,0x2, 0x1f,0x8c,0x9f,0x8f,0x2f,0x8c,0x14,0x83,0x14,0x1, +0xe0,0x8, 0x0, 0xca,0x38,0x82,0xe0,0x2, 0x1e,0x8c,0xe0,0x1f,0x16,0x20,0xb6,0xd, +0xaf,0x8e,0xe0,0x4, 0x14,0x81,0x14,0x2, 0xe0,0x8, 0x0, 0xbe,0x8, 0xb5,0xef,0xff, +0xd4,0x2b,0xe0,0x0, 0x24,0x4b,0x14,0x0, 0xd5,0xf1,0xe0,0x1, 0x1f,0xde,0xe7,0xdf, +0x17,0x7f,0xa1,0xf, 0xe0,0x1, 0x1a,0xe2,0xa7,0x92,0xe0,0x1, 0x19,0xdf,0x3f,0xde, +0xbf,0x92,0xe7,0xfb,0x17,0x7f,0xa7,0x92,0xe0,0x2, 0x1a,0x5, 0x3f,0xde,0xbf,0x92, +0xe7,0xfd,0x17,0x7f,0xa7,0x92,0x3f,0xde,0xbf,0x92,0xe7,0xfe,0x17,0x7f,0xa7,0xa2, +0x3f,0xde,0xbf,0xa2,0x9f,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xe0,0xa, +0x8f,0x84,0x27,0xa8,0x8f,0x85,0x2f,0xa6,0xdf,0xab,0x9f,0x83,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x27,0xf6,0x8f,0x85,0x27,0x84,0x8f,0x85,0xc7,0xff,0xaf,0x85,0x14,0x1, +0xa7,0x92,0xe0,0x20,0xcf,0x80,0xbf,0x92,0xa7,0x92,0xe0,0x4, 0xcf,0x80,0xbf,0x92, +0xa7,0x92,0xe0,0x2, 0xcf,0x80,0xbf,0x92,0xa7,0xa2,0xe0,0x1, 0xcf,0x80,0xbf,0xa2, +0xa, 0xa1,0xe0,0xb, 0x0, 0xac,0xde,0xeb,0xef,0xff,0xd3,0xde,0x24,0x7d,0xe7,0xff, +0x0, 0xb4,0xde,0xe5,0x0, 0xd0,0x8, 0xb3,0x14,0x1, 0xef,0xff,0xd3,0xb2,0xe0,0x0, +0x1f,0xac,0xa7,0x8f,0xa1,0xf, 0x31,0x43,0xe2,0x0, 0xc1,0x1, 0x29,0x7c,0x3c,0x62, +0xd5,0x95,0xe0,0x1, 0x1f,0xde,0xe7,0xdf,0x17,0x7f,0xa1,0x8f,0x14,0x1, 0xa7,0x93, +0x3c,0xe2,0x3f,0xde,0xbf,0x93,0xe7,0xfb,0x17,0x7f,0xa7,0x93,0x3f,0xde,0xbf,0x93, +0xe7,0xfd,0x17,0x7f,0xa7,0x93,0x3f,0xde,0xbf,0x93,0xe7,0xfe,0x17,0x7f,0xa7,0xa3, +0x3f,0xde,0xbf,0xa3,0xe7,0xff,0x17,0x1, 0xe0,0x2, 0x1f,0xf1,0xaf,0xf, 0xd3,0xbb, +0xa7,0x93,0x14,0x1, 0xe0,0x20,0xcf,0x80,0xbf,0x93,0xa7,0x93,0xe0,0x4, 0xcf,0x80, +0xbf,0x93,0xa7,0x93,0xe0,0x2, 0xcf,0x80,0xbf,0x93,0xa7,0xa3,0xe0,0x1, 0xcf,0x80, +0xbf,0xa3,0x9, 0xa1,0xe0,0xa, 0x0, 0xe3,0x8, 0xb1,0xe0,0x1, 0x1f,0xa3,0xe0,0x1a, +0x17,0x20,0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0x37,0x28,0x3c,0x4e, +0xe0,0x4, 0xd7,0x69,0xe0,0x4, 0xd7,0xd, 0xe0,0x1, 0xd1,0x90,0xe0,0x2, 0x1f,0x5, +0x17,0x81,0xe0,0x4, 0xaf,0xfe,0xe0,0x1b,0x14,0x2c,0xe0,0x2, 0x1f,0x7f,0xaf,0x8e, +0xe0,0x4, 0xd7,0x59,0xe0,0x2, 0x1f,0xbf,0xe0,0x19,0x16,0x9d,0x17,0x7, 0x3e,0x9f, +0xaf,0xd, 0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0x8, 0xe1,0xe0,0x2, 0x1f,0x85,0x17,0x1, +0xe0,0x4, 0xaf,0x5f,0x17,0x0, 0xe0,0x2, 0x1e,0xd4,0xe0,0x0, 0x1f,0xa5,0x8f,0x8f, +0x8e,0xd, 0x3f,0x9c,0xaf,0x8d,0x17,0x80,0xe0,0x2, 0x1e,0xac,0xe0,0x1, 0x1e,0x56, +0xb7,0xd, 0xe0,0x2, 0x1e,0x8d,0xaf,0x8c,0xe0,0x2, 0x1e,0x41,0x8e,0x8d,0xaf,0xc, +0xe2,0x0, 0xce,0x82,0xe0,0x2, 0x1f,0x7e,0xaf,0x8e,0x1, 0x2, 0x38,0x82,0xe0,0x2, +0x1f,0x3b,0x8f,0x8e,0xcf,0x84,0xaf,0x8e,0x38,0x82,0xe0,0x2, 0x1f,0x85,0x17,0x0, +0xe0,0x0, 0x1e,0xa5,0xe0,0x4, 0xaf,0x5f,0xe0,0x2, 0x1f,0x54,0x8f,0x8d,0x8e,0xe, +0x37,0xc1,0x3f,0xfc,0x3, 0x98,0x8e,0x8d,0x8f,0x8e,0x36,0xc1,0x3f,0xad,0xaf,0x8e, +0x17,0x0, 0xe0,0x2, 0x1f,0xac,0xb7,0xf, 0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf, +0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x1, 0x1f,0x5f,0x97,0x8e,0xe0,0x1, 0xcf,0x80, +0xb7,0x8e,0x38,0x82,0xe0,0x1, 0x1f,0x5f,0x97,0x8e,0xcf,0x88,0xb7,0x8e,0x0, 0xe9, +0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0x8f,0x8f,0x27,0x86,0xe0,0x1, 0x1f,0xd6,0x8f,0x8f, +0x27,0x89,0x38,0x82,0x8, 0xb1,0xdf,0xca,0xe0,0x2, 0x1f,0xab,0x17,0x1, 0xaf,0xf, +0x8, 0xe1,0x0, 0xc4,0x8, 0xb1,0xe0,0x1, 0x1f,0xa3,0xe0,0x1a,0x17,0x22,0x3f,0x1f, +0x8f,0xe, 0xe0,0x1a,0xc7,0xa3,0x8c,0xf, 0x37,0x28,0x3c,0x4e,0xe0,0x4, 0xd6,0xdb, +0xdf,0x23,0xdf,0x63,0xdf,0xb3,0xdd,0xc8,0x8, 0xa1,0xe7,0xe5,0x0, 0x81,0x8, 0xb4, +0xe0,0x2, 0x1f,0x81,0x11,0x3c,0x8f,0x8f,0x27,0x88,0xe0,0x2, 0x1f,0xfd,0x89,0xf, +0x17,0x80,0xe0,0x22,0x39,0xf, 0xc1,0x3b,0xe0,0x2, 0x19,0x85,0xe0,0x2, 0x1a,0x41, +0xe0,0x4, 0x8f,0xd3,0xe2,0x0, 0xcf,0x81,0x1, 0x1b,0x8f,0x4, 0xe0,0x4, 0x8f,0xd3, +0xe2,0x0, 0xcf,0x81,0x1, 0x2, 0xa, 0x61,0xe0,0x0, 0x1f,0xb7,0x8f,0x8f,0x27,0xfc, +0x39,0x7e,0x1, 0x23,0x17,0x81,0x3f,0x9e,0xe2,0x1, 0xc7,0xff,0xe0,0x2, 0x1e,0xfe, +0xe2,0x0, 0xcf,0xbc,0xaf,0xd, 0x5, 0x82,0x17,0x80,0xaf,0x84,0xa, 0x61,0xe0,0x0, +0x1f,0xb7,0x8f,0x8f,0x27,0xe3,0x8f,0x4, 0x2f,0x62,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f, +0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0xdb,0xe0,0x2, 0x1f,0xfd,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0xd5,0xdc,0xc8,0x0, 0xd2,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf, +0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x1, 0x1f,0x5f,0x97,0x8e,0xe0,0x1, 0xcf,0x80, +0xb7,0x8e,0xdd,0x72,0xef,0xff,0xd2,0x2c,0x8f,0x4, 0x0, 0xcd,0x8, 0xb2,0xe0,0x2, +0x1f,0xa2,0xe0,0x2, 0x19,0x5, 0x8f,0xf, 0x27,0xc, 0x16,0x80,0xe0,0x4, 0x8f,0x52, +0xae,0x8f,0x27,0x36,0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x49, +0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0x1, 0x24,0x4, 0x8b,0xe2,0x0, 0xcf,0x83, +0x1, 0x84,0x9, 0x21,0xe7,0xfe,0x0, 0xf8,0x17,0x1, 0xe0,0x4, 0xaf,0x52,0x9, 0x61, +0xe0,0x2, 0x1f,0xa0,0x8f,0x8f,0x2f,0x9e,0x8f,0xe2,0xe2,0x0, 0xc7,0x81,0x27,0xf8, +0xe0,0x2, 0x1f,0xac,0x9f,0xf, 0xe2,0x6, 0xcf,0x33,0x2, 0xa7,0xe0,0xa, 0x8f,0x2, +0xe2,0x0, 0xcf,0x1, 0x1, 0xed,0x9f,0x8f,0xe2,0x7, 0xcf,0xe7,0x2, 0x9e,0x0, 0xe8, +0xe0,0x2, 0x1f,0xa0,0x8f,0x8f,0x27,0xe4,0x9, 0x21,0xe7,0xfe,0x0, 0xc3,0xdf,0x16, +0x0, 0xd0,0xe0,0x2, 0x1f,0xac,0x17,0x0, 0xb7,0xf, 0x8f,0xe2,0xe2,0x0, 0xc7,0x81, +0x27,0xd7,0xe0,0xa, 0x8f,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0xd2,0xe0,0x1, 0x1f,0xd6, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xcc,0x9, 0x21,0xe7,0xfd,0x0, 0xd8,0xde,0xd6, +0xe7,0xff,0x0, 0xb8,0x8, 0xb1,0xe0,0x2, 0x1f,0xa8,0x8f,0x8f,0x2f,0x8d,0xe0,0x0, +0x1f,0xb7,0x8f,0x8f,0x27,0x85,0xdd,0xc7,0x8, 0xa1,0xe7,0xfe,0x0, 0xc2,0xde,0x7, +0x8, 0xa1,0xe7,0xfe,0x0, 0xbe,0xdf,0x93,0x0, 0xf3,0x0, 0x0, 0xe0,0x2, 0x1f,0x6a, +0xe0,0x1, 0x1e,0xdf,0x0, 0x86,0x9f,0x8d,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x83, +0x9f,0x8e,0x2f,0xfa,0x17,0x87,0xb7,0x8e,0x38,0x82,0xe0,0x0, 0x1f,0xb7,0x8f,0x8f, +0x2f,0x9f,0x8, 0xb2,0xe0,0x2, 0x19,0x0, 0x9f,0x82,0x2f,0xff,0xdc,0x5a,0xe0,0x2, +0x1f,0x85,0xe0,0x4, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0x13,0xe0,0x1, 0x8c,0x8f, +0xe0,0x0, 0x14,0x64,0xe0,0x6, 0xd9,0xf8,0xc4,0x7f,0xb4,0x2, 0xe0,0x1, 0x1f,0xf9, +0x9e,0x82,0x9f,0xf, 0x3e,0xfe,0x5, 0x83,0x97,0x8f,0xb7,0x82,0x9, 0x61,0x38,0x82, +0xe0,0x1, 0x8f,0x9f,0xc7,0xff,0xb7,0x82,0x0, 0xf2,0xe0,0x1, 0x1f,0xde,0xe7,0x7f, +0x16,0xff,0xa7,0x8f,0xe2,0x0, 0xcc,0x7, 0xa7,0x1f,0xe1,0x0, 0xcf,0x0, 0xbf,0x1f, +0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0xe7,0xdf,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0xe7,0xbf,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x2, 0x88,0xa7,0x2f,0x16,0xf8, +0xe2,0x0, 0xc4,0x7, 0x3f,0x5d,0x3c,0x4e,0xbc,0x2f,0x38,0x82,0xe0,0x2, 0x1f,0xa6, +0x16,0xdf,0xa7,0xf, 0x15,0xfe,0xa7,0xbe,0x3f,0xdd,0xbf,0xbe,0xe7,0xfe,0x16,0xff, +0xa6,0x3e,0xe0,0x0, 0x1f,0xac,0x3e,0x5d,0xa7,0x8f,0xbe,0x3e,0x17,0x0, 0xaf,0x7f, +0x16,0xfd,0xa6,0xf, 0xe0,0x1, 0x1f,0x31,0x3e,0x5b,0xbe,0xf, 0xa6,0xf, 0xa7,0xe, +0x3e,0x5d,0xbe,0xf, 0xa6,0xbf,0x3e,0xdb,0xbe,0xbf,0x16,0xfc,0xa7,0x8e,0x3f,0xdd, +0xbf,0x8e,0x17,0x80,0xe0,0x3, 0xb7,0x9e,0x17,0x80,0xe0,0x61,0x3f,0x92,0xe1,0xff, +0x17,0xff,0xe0,0x61,0x3f,0x91,0x38,0x82,0xe0,0x2, 0x1f,0xa6,0xe0,0x0, 0x1f,0x2c, +0xa6,0x8f,0x16,0x7e,0xa7,0xbd,0xa7,0xe, 0x3f,0xdc,0xbf,0xbd,0xe7,0xff,0x16,0xbf, +0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0xe0,0x61,0x3f,0x82,0xcf,0x81,0xe0,0x61,0x3f,0x92, +0x38,0x82,0xe0,0x1, 0x1f,0xde,0xe0,0x1, 0x1f,0x31,0xa6,0x8f,0x16,0x6f,0xa7,0x9d, +0xa7,0xe, 0x3f,0xdc,0xbf,0x9d,0xe0,0x1, 0xa7,0xee,0xe0,0x20,0xcf,0x80,0xe0,0x1, +0xbf,0xee,0x38,0x82,0xe0,0x1, 0x1f,0xde,0xa7,0x8f,0xa7,0x3f,0xcf,0x1, 0xbf,0x3f, +0xa7,0xf, 0x2c,0x5, 0x16,0xfd,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xcf,0x2, 0xbf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0xde,0xa6,0x8f,0xe0,0x2, 0x1f,0xa6,0xa7,0x1d,0xa7,0x8f, +0xcf,0x8, 0xbf,0x1d,0xe7,0xff,0x16,0xbf,0xa7,0x3f,0x3f,0x5d,0xbf,0x3f,0xa7,0x2f, +0xe2,0x1, 0xc7,0x4f,0xcf,0x20,0xbf,0x2f,0xe0,0x2, 0x17,0x0, 0xb7,0x3f,0xa7,0x3f, +0xcf,0x40,0xbf,0x3f,0xe0,0x61,0x3f,0x82,0xe0,0x40,0xcf,0x80,0xe0,0x61,0x3f,0x92, +0x38,0x82,0x8, 0xb2,0xe0,0x1, 0x1f,0x31,0x17,0xff,0xa1,0xe, 0xb7,0xd2,0xe0,0x1, +0xb7,0xd2,0xe0,0x5, 0xd4,0x71,0xe0,0x2, 0x1f,0xa8,0xe0,0x41,0x3f,0x8, 0xac,0xf, +0xe7,0xfb,0x16,0xff,0xa7,0x82,0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdd,0x3f,0xce, +0xbf,0x82,0xe0,0x1, 0x17,0xc3,0xb7,0xb2,0xd8,0xe6,0xa7,0xb2,0x16,0xef,0xcf,0x84, +0xbf,0xb2,0x17,0xfb,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0x17,0xf7,0xa7,0x32,0xcf,0x8, +0xbf,0x32,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0xa7,0x32,0xcf,0x10,0xbf,0x32,0xa7,0x12, +0x3f,0x5d,0xbf,0x12,0xa7,0xc2,0x3f,0xdd,0xbf,0xc2,0x9, 0x61,0xe0,0x1, 0x1f,0xdd, +0xe7,0xff,0x16,0xbf,0xa7,0x8f,0xa7,0x1f,0xcf,0x1, 0xbf,0x1f,0xa7,0xf, 0x3f,0x5d, +0xbf,0xf, 0xe7,0xfe,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x17,0x2f,0xbf,0x2f, +0xa7,0x1f,0xcf,0x2, 0xbf,0x1f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0xa7,0xf, 0xcf,0x40, +0xbf,0xf, 0xe0,0x61,0x3f,0x82,0xe7,0xf7,0x17,0x7f,0x3f,0xde,0xe0,0x61,0x3f,0x92, +0x38,0x82,0xe0,0x1, 0x1f,0xdd,0xa7,0x8f,0xa7,0x2f,0x27,0x7, 0xa7,0x3f,0xcf,0x10, +0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xdd,0xe7,0xff, +0x16,0xbf,0xa7,0x8f,0xa7,0x1f,0xcf,0x1, 0xbf,0x1f,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0xde,0xe0,0x0, 0x1e,0x2e,0xa7,0xf, 0xe7,0xfe,0x15,0x7f, +0xa7,0xbe,0xe0,0x0, 0x1d,0xaf,0xcf,0x81,0xbf,0xbe,0xa6,0x8e,0xe0,0x2, 0x1f,0xc0, +0xce,0x82,0xbe,0x8e,0x16,0xa0,0xb6,0x8c,0xa6,0x9e,0xa7,0x8f,0x3e,0xda,0xbe,0x9e, +0xa6,0x9e,0xa5,0x8b,0xe0,0x8, 0xce,0x80,0xbe,0x9e,0x16,0xf7,0xa7,0xf, 0xcf,0x1, +0xbf,0xf, 0xa7,0xf, 0xcf,0x8, 0xbf,0xf, 0xa7,0xb, 0x3f,0x5d,0xbf,0xb, 0x17,0x0, +0xe0,0x1, 0xaf,0x3f,0x96,0xc, 0xb6,0x3f,0xe0,0x61,0x3f,0x2, 0xe0,0x2, 0xcf,0x0, +0xe0,0x61,0x3f,0x12,0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, +0xbf,0xf, 0x38,0x82,0xe0,0x3, 0x1f,0x3, 0xe2,0xff,0x17,0xf0,0xbf,0xf, 0xe2,0xff, +0x17,0xf4,0xe0,0x3, 0x1f,0x4, 0xbf,0xf, 0xe2,0xff,0x17,0xf8,0xe0,0x3, 0x1f,0x5, +0xbf,0xf, 0xe2,0xff,0x17,0xfc,0xe0,0x3, 0x1f,0x6, 0xbf,0xf, 0x38,0x82,0xe0,0x1, +0x1f,0xb1,0x16,0x80,0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf,0xe0,0x2, 0x16,0x84, +0xbf,0xd, 0xe0,0x2, 0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x38,0x82, +0xe0,0x1, 0x1f,0xb1,0xe0,0x0, 0x16,0xeb,0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf, +0xe0,0x2, 0x16,0x84,0xbf,0xd, 0xe0,0x2, 0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, +0xaf,0x3f,0x38,0x82,0xc4,0x7f,0xe1,0xff,0x17,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7e, +0x1, 0xc, 0x17,0x88,0x0, 0x0, 0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc4,0x7f, +0xe3,0xff,0xc4,0x7f,0x3c,0x7e,0x1, 0xf6,0x38,0x82,0xc4,0x7f,0xe1,0xff,0x16,0x7f, +0xe3,0xff,0xc4,0x7f,0x3c,0x7c,0x1, 0x17,0x16,0x84,0xe0,0x1, 0x17,0x7a,0x17,0x88, +0x0, 0x0, 0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc7,0x7f,0xe3,0xff,0xc7,0x7f, +0x2f,0x77,0xc6,0xff,0xe2,0x1, 0xc6,0xff,0x2e,0xf1,0xc4,0x7f,0xe3,0xff,0xc4,0x7f, +0x3c,0x7c,0x1, 0xeb,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0xf, 0xa7,0xce,0xe2,0x0, +0xc7,0x81,0x27,0x98,0xe0,0x1, 0x1f,0xde,0xe7,0xff,0x16,0x3f,0xa7,0x8f,0xa6,0xdf, +0xe0,0x1, 0xce,0x80,0xbe,0xdf,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a, +0xe2,0x0, 0xc7,0x1, 0x2f,0x1e,0xa7,0x5f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xbf,0x5f, +0x38,0x82,0xa7,0xce,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0x98,0xe0,0x1, 0x1f,0xde, +0xe7,0xff,0x16,0x3f,0xa7,0x8f,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xe7,0xfe,0x16,0x7f, +0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0x27,0x64, +0xa7,0x5f,0xe1,0x0, 0xcf,0x0, 0xbf,0x5f,0x38,0x82,0xe0,0x1, 0x1f,0xde,0xa7,0x8f, +0xa6,0xdf,0xce,0xc0,0x0, 0xeb,0x8, 0xb2,0x39,0x68,0xdf,0xbe,0xe0,0x1, 0x1f,0xde, +0xe0,0x2, 0x1f,0x56,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0x21,0x4, 0xa4,0x6f,0x39,0x48, +0xb9,0x6f,0x9, 0x61,0x8, 0xb4,0xe0,0x2, 0x19,0x71,0x8f,0x82,0xe2,0x1, 0xcf,0x81, +0x1, 0x4, 0x17,0x80,0xaf,0x82,0xa, 0x61,0x24,0x2b,0xe2,0x0, 0xcc,0x1, 0x39,0xe9, +0x1, 0x30,0xe2,0x0, 0xcc,0x2, 0x1, 0xf6,0x3f,0x83,0xdf,0x9e,0xe0,0x1, 0x1f,0xde, +0xe0,0x2, 0x1f,0x56,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0x21,0x84,0xa4,0xef,0x3c,0xc3, +0xbc,0xef,0xe0,0x0, 0x1f,0x2c,0xa7,0xe, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, +0x2f,0xe, 0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,0x80,0xaf,0x82,0xa, 0x61, +0x3f,0x83,0x17,0x82,0x3f,0xd9,0x2f,0xae,0xdf,0x6f,0xe0,0x1, 0x1f,0xde,0xe0,0x2, +0x1f,0x56,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xe0,0x0, 0x1f,0x2c,0xa2,0xe, 0x29,0xb0, +0xa7,0x3f,0xe7,0xfe,0x16,0xff,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7,0x84,0x37,0xc5,0xe2,0x0, +0xc7,0x81,0xe7,0xff,0x27,0xa0,0xa7,0x84,0x17,0x5f,0x3f,0xde,0xbf,0x84,0xe7,0xff, +0x0, 0x9a,0xe0,0x0, 0x1f,0xac,0xa2,0xf, 0xa7,0x84,0xcf,0xa0,0xbf,0x84,0xdf,0x3c, +0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1f,0x56,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xa4,0xef, +0x3c,0xc3,0xbc,0xef,0x0, 0xce,0x8, 0xb1,0xe0,0x1, 0x1f,0xb1,0x17,0x0, 0xa6,0x8f, +0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0xbf,0xd, 0x16,0x6f,0xa7,0x8f,0xbf,0x6f,0xa6,0xdf, +0xe0,0x80,0xce,0x80,0xbe,0xdf,0xa6,0xdf,0xe0,0x40,0xce,0x80,0xbe,0xdf,0xa6,0xdf, +0xe0,0x20,0xce,0x80,0xbe,0xdf,0xa6,0xef,0xce,0xc0,0xbe,0xef,0xa6,0xef,0xce,0xa0, +0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0x7f,0x16,0x7f,0xa6,0xef,0xe1,0x0, +0xce,0x80,0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0xbf,0x16,0x7f,0xa6,0xef, +0x3e,0xdc,0xbe,0xef,0xe7,0xdf,0x16,0x7f,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xa6,0xef, +0xe0,0x10,0xce,0x80,0xbe,0xef,0xe0,0x2, 0x1f,0xd6,0xb7,0xf, 0xde,0xf5,0xe0,0x61, +0x3f,0x82,0x17,0x7d,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82,0x17,0x7b, +0x3f,0xde,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0xe0,0x1, 0x1f,0xb1,0xe2,0x0, 0xcc,0x2, +0xa7,0x8f,0xe0,0x0, 0x1, 0x57,0xe2,0x0, 0xcc,0x3, 0x1, 0x36,0xe2,0x0, 0xcc,0x1, +0x1, 0x19,0xa6,0x8f,0xe0,0x1, 0x1f,0x5e,0x16,0x7b,0xa7,0xe, 0x3e,0xdc,0xbe,0x8f, +0xe6,0xff,0x16,0x7f,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0x16,0x78,0xa6,0xce,0x3e,0xdc, +0xbe,0xce,0x16,0xf7,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0x16,0x80,0xe0,0x1, 0xbe,0xbf, +0x38,0x82,0xa7,0xf, 0x16,0x77,0x3f,0x5c,0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f, +0x16,0x78,0xa7,0xf, 0xe0,0x1, 0x1e,0xde,0xcf,0x4, 0xa6,0x8d,0xbf,0xf, 0xa7,0x4d, +0xe1,0x0, 0xcf,0x0, 0xbf,0x4d,0xa7,0x4d,0x3f,0x5c,0xcf,0x1, 0xbf,0x4d,0xa7,0x1f, +0xcf,0x8, 0xbf,0x1f,0x38,0x82,0xa7,0xf, 0xe0,0x1, 0x1e,0xde,0x16,0x7b,0x3f,0x5c, +0xa6,0x8d,0xbf,0xf, 0xe6,0xff,0x16,0x7f,0xa7,0x4d,0x3f,0x5c,0xbf,0x4d,0xa7,0xf, +0xcf,0x8, 0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, +0xbf,0x1f,0xa7,0x1f,0xcf,0x10,0xbf,0x1f,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f,0x38,0x82, +0xa6,0x8f,0x16,0x77,0x3e,0xdc,0xbe,0x8f,0x16,0x80,0xe0,0x1, 0xbe,0xbf,0x16,0x78, +0xa6,0x8f,0xe0,0x1, 0x1f,0x5e,0xce,0x84,0xa7,0xe, 0xbe,0x8f,0xa6,0xce,0xe1,0x0, +0xce,0x80,0xbe,0xce,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f, +0x38,0x82,0x8, 0xb3,0xe0,0x1, 0x1f,0xde,0xa1,0x8f,0xe0,0x1, 0x1f,0xb1,0xa1,0xf, +0xa7,0xb3,0xcf,0x81,0xbf,0xb3,0xa7,0x83,0xcf,0x88,0xbf,0x83,0xe0,0x1, 0xa7,0x92, +0xcf,0x82,0xe0,0x1, 0xbf,0x92,0xe0,0x1, 0xa7,0x92,0xcf,0x81,0xe0,0x1, 0xbf,0x92, +0xe0,0x2, 0x1f,0xcc,0x8c,0xf, 0xdf,0x71,0xa7,0xd3,0x17,0x7d,0xcf,0x81,0xbf,0xd3, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x7b,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x77, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x6f,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x78, +0xa7,0xd3,0xcf,0xa0,0xbf,0xd3,0xe0,0x1, 0xa7,0xa2,0xe1,0x0, 0xcf,0x80,0xe0,0x1, +0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x60,0xcf,0x80,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, +0xa7,0xa2,0xcf,0x88,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0x3f,0xde,0xcf,0x85, +0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x2, 0xcf,0x80,0xe0,0x1, 0xbf,0xa2, +0xe0,0x1, 0xa7,0xa2,0xe0,0x4, 0xcf,0x80,0xe0,0x1, 0xbf,0xa2,0x9, 0xe1,0xe0,0x1, +0x1f,0xde,0xe7,0xfd,0x16,0xff,0xa7,0x8f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, 0xbf,0x1f, +0xa7,0x1f,0xe0,0x2, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0xe7,0xff, +0x16,0xbf,0xa7,0x1f,0xe0,0x4, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0xe0,0x1, 0xcf,0x0, +0xbf,0x2f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x16,0xef,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0x16,0xf7,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x38,0x82,0xe0,0x1, 0x1f,0xb1,0xe2,0x0, +0xc4,0x1, 0xa7,0x8f,0x16,0x77,0xe0,0x1, 0xa7,0x2f,0xe0,0xd, 0x34,0x23,0x3f,0x5c, +0x3f,0x4d,0xe0,0x1, 0xbf,0x2f,0xe6,0xff,0x16,0x7f,0xe0,0x1, 0xa7,0x2f,0xe0,0xd, +0x34,0x2f,0x3f,0x5c,0x3f,0x4d,0xe0,0x1, 0xbf,0x2f,0xe7,0xfd,0x16,0x7f,0xe0,0x1, +0xa7,0x2f,0xe0,0xd, 0x34,0x28,0x3f,0x5c,0x3f,0x4d,0xe0,0x1, 0xbf,0x2f,0xe7,0xfb, +0x16,0xff,0xe0,0x1, 0xa7,0x2f,0x34,0x29,0x3f,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x2f, +0x38,0x82,0x8, 0xb1,0xe0,0x4, 0xdb,0xae,0x24,0x6, 0xe0,0x1, 0x1f,0x61,0x97,0xce, +0xcf,0x82,0xb7,0xce,0xe0,0x1, 0x1f,0xfa,0x8f,0x8f,0x27,0x82,0x8, 0xe1,0x8, 0xa1, +0xe7,0xdc,0x0, 0xd9,0xe0,0x1, 0x1e,0xdf,0xe0,0x1, 0x1f,0x61,0x97,0x8d,0xcf,0x81, +0xb7,0x8d,0x97,0xce,0xcf,0x84,0xb7,0xce,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf, +0xe2,0x0, 0xc7,0x81,0x2f,0x82,0x38,0x82,0x0, 0xdd,0xe0,0x1, 0x1f,0x5f,0xe0,0x1, +0x1e,0xe1,0x97,0x8e,0xcf,0x81,0xb7,0x8e,0x97,0x4d,0xe0,0x2, 0x1f,0xf3,0xcf,0x4, +0xa7,0x8f,0xb7,0x4d,0xa7,0x5f,0xcf,0x8, 0xbf,0x5f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81, +0x27,0x82,0x38,0x82,0x0, 0xc7,0xe0,0x61,0x3f,0x82,0xe0,0x61,0x3f,0x2, 0xe7,0xfe, +0x16,0xff,0x3f,0x5d,0xe0,0x61,0x3f,0x12,0xe0,0x2, 0x1f,0x73,0x16,0x7e,0xa7,0xe, +0xe2,0x0, 0xc4,0x1, 0xa6,0xbe,0x15,0xfd,0x3e,0xdc,0x3e,0xc8,0xbe,0xbe,0xe0,0xc, +0x34,0x21,0xa6,0xbe,0x34,0x2a,0x3e,0xdb,0x3e,0xcc,0xbe,0xbe,0xe7,0xf7,0x16,0x7f, +0xa6,0xbe,0x37,0xc7,0x3e,0xdc,0x3c,0x4d,0xbc,0x3e,0xe2,0x0, 0xc7,0x81,0x27,0x87, +0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0x8, 0xb1, +0xe0,0x1, 0x1f,0xb1,0xe7,0x7f,0x16,0xff,0xa7,0xf, 0xe7,0xfb,0x16,0x7f,0xa7,0x8e, +0xe7,0xe0,0x14,0x80,0x3f,0xdd,0xbf,0x8e,0xf0,0x1a,0x13,0x98,0xe0,0x1, 0xa6,0xee, +0xe0,0x2, 0x1f,0xf3,0xe0,0x4, 0xce,0x80,0xe0,0x1, 0xbe,0xee,0xe0,0x1a,0x15,0x19, +0xe0,0x1, 0xa6,0xee,0xa7,0x8f,0x3e,0xdc,0xe0,0x1, 0xbe,0xee,0x16,0x81,0xbe,0xdf, +0xe7,0xf8,0x16,0x0, 0xa6,0xef,0x17,0x0, 0xe3,0xfe,0xc6,0x9f,0xbe,0xef,0xe7,0x80, +0x14,0x0, 0xa6,0xef,0xe0,0x1, 0x1d,0xa3,0xbe,0xef,0xf0,0x17,0x3b,0x9b,0xe0,0x1, +0xa6,0xdf,0x3d,0x1b,0xe3,0xff,0xc6,0x80,0xe0,0x1, 0xbe,0xdf,0xe0,0x1, 0xa6,0xdf, +0xe0,0x1, 0xbe,0xdf,0xe0,0x3, 0x16,0xe0,0xe0,0x1, 0xbe,0xef,0xe0,0x1, 0xa6,0xff, +0x3e,0xdc,0xe0,0x1, 0xbe,0xff,0xe7,0xf0,0x16,0x0, 0xe0,0x2, 0xa6,0x8f,0x3e,0xd9, +0xe0,0x2, 0xbe,0x8f,0xe0,0x2, 0xa6,0x9f,0x3e,0xd9,0xe0,0x2, 0xbe,0x9f,0xe0,0x17, +0x16,0xb8,0xe0,0x4, 0xb6,0xdf,0xe0,0x2, 0xa6,0xcf,0x3e,0xdc,0xe0,0x2, 0xbe,0xcf, +0xe0,0x9, 0x16,0x88,0xe0,0x2, 0xbe,0xbf,0xe0,0x12,0x16,0xd8,0xe0,0x2, 0xbe,0xdf, +0xe1,0x20,0x16,0x80,0xe0,0x2, 0xbf,0x6f,0xe0,0x2, 0xbe,0xff,0xe0,0x3, 0xa5,0xef, +0x3d,0xd8,0xcd,0xe4,0xe0,0x3, 0xbd,0xef,0xe0,0x3, 0xa6,0x7f,0x3e,0x58,0xce,0x64, +0xe0,0x3, 0xbe,0x7f,0xe0,0x4, 0xa6,0x8f,0x3e,0xd9,0xe0,0x7, 0xce,0xe8,0xe0,0x4, +0xbe,0x8f,0xe1,0xff,0x16,0xff,0xe0,0x4, 0xbf,0x1f,0xbe,0x9f,0xe1,0x39,0x16,0x83, +0xbf,0x3f,0xbe,0xbf,0xe0,0x1, 0x1e,0xdf,0xb7,0xd, 0xa6,0xbf,0xbe,0xaf,0xe0,0x2, +0x1f,0xda,0xe8,0x0, 0x86,0x87,0xb7,0xf, 0xe0,0x2, 0x1f,0x81,0x87,0xa, 0xae,0x8f, +0xe0,0x2, 0x1f,0xfd,0xaf,0xf, 0xef,0xfe,0xd7,0x17,0xe0,0x4, 0xd9,0x7d,0xe0,0x61, +0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0x8, 0xb3,0xf0,0x2, +0x18,0xf3,0xe7,0xbf,0x16,0x7f,0xe8,0x0, 0xa7,0x1, 0xe0,0x2, 0x1e,0xbf,0xe0,0x1, +0xa7,0xee,0xf0,0x3, 0x19,0x87,0x3f,0xdc,0xe0,0x1, 0xbf,0xee,0xfa,0xd7,0xcb,0xa8, +0xe0,0x2, 0x1f,0xa8,0xe0,0x1, 0x9d,0x2d,0x85,0x8f,0xe0,0x1, 0x1f,0xa3,0xe0,0x1, +0x9e,0x1d,0xf0,0x10,0x89,0x7f,0xe0,0x0, 0x1f,0xb1,0xe0,0x3, 0x1e,0x88,0xe4,0xa, +0x35,0x20,0xe4,0xc, 0x36,0x20,0xa7,0x8f,0xe0,0x3, 0x1c,0x89,0xf0,0x3, 0x1a,0xa, +0xf0,0x3, 0x1a,0x8b,0xe0,0x3, 0x19,0x8c,0xe0,0x3, 0x19,0xd, 0xe0,0x3, 0x18,0x8e, +0xf0,0x3, 0x18,0xf, 0xf0,0x3, 0x1b,0x10,0x17,0x0, 0xe2,0x0, 0xc5,0x81,0x3d,0x4d, +0x3e,0x4d,0xe0,0xa9,0x14,0x15,0xe8,0x40,0x3d,0xf2,0xf0,0x0, 0xb9,0x8f,0x1, 0x25, +0xbe,0x1f,0x16,0xfd,0x3e,0x9e,0xe2,0x1, 0xc6,0xff,0xf0,0x0, 0xbb,0xaf,0xe2,0x0, +0xce,0x81,0xbc,0x3f,0x5, 0x9f,0x27,0x1b,0xf0,0x0, 0xba,0x4f,0xf0,0x0, 0xba,0xdf, +0xbc,0xef,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x5, 0xf0,0x0, 0xbb,0x7f, +0xe0,0x7, 0xc7,0xb0,0x1, 0xe1,0xe8,0x0, 0xa7,0x1, 0xe0,0x1, 0xa7,0xee,0xe0,0x40, +0xcf,0x80,0xe0,0x1, 0xbf,0xee,0x9, 0xe1,0xbd,0x1f,0x0, 0xdc,0xb9,0xcf,0xb9,0x5f, +0x0, 0xe8,0xb8,0xcf,0xe2,0x0, 0xcf,0x4, 0xf0,0x0, 0xb8,0x5f,0xbc,0xef,0x1, 0xe2, +0xe0,0x3, 0x1f,0x11,0xbf,0x7f,0x0, 0xe8,0x8, 0xb2,0xe0,0x2, 0x19,0x3, 0x8f,0x82, +0x27,0x8d,0xe0,0x0, 0x14,0xda,0x14,0x11,0xe0,0x4, 0xda,0x6e,0xe0,0x0, 0x14,0xda, +0x14,0x29,0xe0,0x4, 0xda,0x69,0x17,0x80,0xaf,0x82,0x9, 0x61,0xe0,0x2, 0x1f,0xac, +0x17,0x0, 0xb7,0xf, 0xe0,0x1, 0x1f,0xe5,0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x65, +0x87,0x8e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xcf,0xc8,0x5, 0x82,0x17,0xc8, +0xaf,0x8e,0x38,0x82,0xe0,0x0, 0x1f,0xb7,0x14,0x1, 0x8f,0x8f,0x2f,0x89,0xe0,0x1, +0x1f,0xe5,0x8c,0xf, 0xe0,0x2, 0x1f,0xd0,0x8f,0x8f,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0x8, 0xb1,0x3c,0x98,0x34,0xa4,0xe1,0x77,0x14,0x0, 0xe0,0x6, 0xd4,0x45,0xe3,0xff, +0xc4,0x7f,0x8, 0xe1,0xea,0x0, 0xcc,0x2, 0xe0,0x46,0xcc,0x0, 0x14,0x80,0xea,0x0, +0xcd,0x2, 0xe1,0x8d,0xcd,0x70,0x3d,0x28,0xe0,0x6, 0xd6,0xa8,0xea,0x0, 0xcc,0x0, +0xe0,0x0, 0xcc,0x0, 0x24,0x2, 0x3c,0x1, 0x14,0x0, 0x14,0x80,0xef,0xfe,0xd0,0xbc, +0x3a,0x80,0x0, 0x0, 0x3a,0x80,0xe0,0x2, 0x1f,0xfd,0xe0,0x1, 0x17,0x7d,0x8f,0x8f, +0x3f,0x58,0xe2,0x0, 0xcf,0x80,0x3c,0x6f,0x17,0x80,0xe1,0x2f,0x3f,0xf, 0xe0,0x68, +0x39,0xaf,0x38,0x82,0xe7,0xfe,0x0, 0xa4,0xe7,0xc4,0x0, 0x9b,0x8, 0xb3,0xe0,0x2, +0x19,0xed,0x11,0x0, 0x8c,0x33,0x3c,0xe2,0xc1,0x1, 0xef,0xfe,0xd2,0xf5,0xe2,0x1, +0xc1,0x7f,0xe2,0x0, 0xc9,0x3, 0xc1,0x85,0x1, 0xf6,0x14,0x81,0x3c,0x62,0xef,0xfe, +0xd2,0xeb,0x14,0x81,0x14,0x4, 0xef,0xfe,0xd2,0xe7,0xe0,0x2, 0x1f,0x8d,0x8c,0x8f, +0x24,0x82,0x14,0x81,0x14,0x0, 0x9, 0xa1,0xe7,0xc5,0x0, 0xde,0x8, 0xb1,0xde,0xff, +0xef,0xfe,0xd1,0xf7,0x8, 0xa1,0x0, 0xdb,0x8, 0xb2,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, +0x19,0x37,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0x95,0xe0,0x2, 0x1f,0xd, +0xaf,0x82,0x3c,0xef,0xaf,0x8e,0x3c,0x6f,0xe0,0x1, 0x1f,0x26,0xaf,0x8e,0xe0,0x2, +0x1f,0x41,0xaf,0x8e,0xef,0xfe,0xd2,0xc0,0xef,0xfe,0xd5,0xa1,0x8c,0x2, 0x9, 0x21, +0xe7,0xd3,0x0, 0xf5,0x17,0x81,0xe0,0x2, 0x1f,0xd, 0xe0,0x2, 0x1c,0x29,0xaf,0x82, +0xaf,0x8e,0xe0,0x2, 0xd0,0x33,0xe0,0x1, 0x1f,0xa6,0xe0,0x2, 0x1f,0x5b,0xac,0xf, +0x87,0x8f,0xaf,0x8e,0xe0,0x1, 0xde,0xde,0x14,0x81,0x14,0x0, 0xef,0xfe,0xd2,0xa4, +0x0, 0xe4,0x8, 0xb3,0x14,0x0, 0xdd,0xf8,0xe0,0x1, 0x1f,0xdf,0x14,0x1, 0x91,0x8f, +0x99,0xf, 0x39,0xd8,0x31,0x58,0x39,0x58,0xdd,0xef,0xe0,0x8, 0x39,0xc2,0x9, 0xe1, +0x8, 0xb2,0xe0,0x2, 0xd0,0x5a,0xdf,0x29,0x14,0x0, 0xdd,0xe6,0xe0,0x1, 0x1f,0x5f, +0x9f,0x8e,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x8b,0x97,0x8e,0xe0,0x1, 0x1e,0xe1, +0xe3,0xff,0xc7,0xfd,0xb7,0x8e,0x97,0xcd,0xe3,0xff,0xc7,0xf7,0xb7,0xcd,0x97,0x8e, +0xe0,0x2, 0x19,0x3b,0xe2,0x0, 0xc7,0x81,0x2f,0x97,0x14,0x1, 0xdd,0xcd,0xe0,0x2, +0x1f,0xd, 0x8f,0x82,0x8e,0x8e,0x37,0xdd,0xe2,0x0, 0xc7,0x81,0x2f,0x89,0xe0,0x2, +0x1f,0xba,0x8f,0x8f,0x8f,0xe, 0x37,0xde,0xe2,0x0, 0xc7,0x81,0x27,0x84,0x9, 0x21, +0xe7,0xec,0x0, 0xdb,0x9, 0x61,0x97,0x8e,0xe0,0x1, 0x1e,0xe1,0xe3,0xff,0xc7,0xfe, +0xb7,0x8e,0x97,0xcd,0xe3,0xff,0xc7,0xfb,0xb7,0xcd,0xdf,0x7f,0xef,0xfd,0xda,0x84, +0xe0,0x2, 0x1f,0x3a,0x17,0x87,0xaf,0x8e,0xaf,0x82,0x0, 0xd8,0xe0,0x1, 0x1f,0xce, +0xe0,0x2, 0x1f,0x43,0x8f,0x8f,0xe0,0x1, 0x8e,0xce,0xe2,0x0, 0xcf,0x85,0x2, 0x8c, +0x26,0x9c,0xe0,0x1, 0x1e,0x6a,0xe0,0x1, 0x8d,0x9e,0x3f,0x9c,0x8e,0xf, 0x3d,0xfc, +0x5, 0xb6,0xc6,0x1, 0xae,0xf, 0xe2,0x0, 0xce,0x81,0x1, 0x1f,0xe0,0x1, 0x1f,0xfb, +0x16,0x80,0xae,0x8f,0xe0,0x1, 0x8f,0xee,0xe2,0x0, 0xcf,0x81,0xeb,0xe6,0x7f,0x93, +0x1, 0x9, 0x17,0x1, 0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1e,0x6a,0x3f,0x9c,0xae,0x8f, +0x0, 0xee,0x8e,0x8f,0xe0,0x1, 0x8e,0xe, 0x3e,0x7d,0x5, 0xf4,0xc6,0x81,0x16,0x0, +0xe0,0x1, 0xae,0x6e,0xae,0x8f,0x38,0x82,0xe0,0x1, 0x1e,0x7b,0xe0,0x1, 0x8e,0x9e, +0x8f,0x8c,0x15,0x80,0x3e,0xff,0xe0,0x1, 0xad,0xee,0x5, 0x8c,0x16,0x81,0x3e,0x9f, +0xeb,0xe6,0x7f,0x93,0xe0,0x1, 0xad,0xce,0xae,0x8c,0x0, 0xdc,0x16,0x80,0xae,0x8f, +0x0, 0xd2,0xeb,0xe6,0x7f,0x93,0xad,0x8c,0x0, 0xd5,0x8, 0xb3,0xe0,0x2, 0x19,0x43, +0x17,0x1, 0x9f,0xd2,0xe0,0x1, 0xaf,0x62,0xe0,0x43,0x3f,0x1f,0xe2,0x0, 0xcf,0x0, +0xe0,0x1, 0x4, 0x17,0xe0,0x2, 0x1f,0x1f,0x8f,0xe, 0x27,0x4, 0x17,0x0, 0xe0,0x1, +0xaf,0x62,0xe2,0x0, 0xc7,0xa0,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, +0x19,0xcf,0x8f,0x83,0x2f,0x83,0xe0,0x1, 0xaf,0xe2,0xe0,0x2, 0x1f,0x8d,0x8c,0xf, +0xde,0xcb,0xe0,0x2, 0x1d,0x5, 0x24,0x7, 0xe0,0x4, 0x8f,0xda,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x1, 0x6b,0x9e,0xd2,0x17,0x80,0xe0,0x80,0x17,0x0, 0xe0,0x1, 0xaf,0xc2, +0x3f,0x5d,0xe0,0x1, 0xaf,0xd2,0x27,0x4, 0x17,0x81,0xe0,0x1, 0xaf,0xc2,0xe0,0x4, +0x17,0x80,0x3f,0xdd,0x2f,0x83,0xe0,0x1, 0xaf,0xc2,0x8f,0x83,0x2f,0x83,0xe0,0x1, +0xaf,0xc2,0xe0,0x1, 0x17,0x80,0x3f,0xdd,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xc2, +0x17,0x4, 0xe0,0x1, 0x1f,0xad,0x96,0x3f,0xe0,0x0, 0x1f,0x8e,0xe0,0x1b,0x95,0x9f, +0xe0,0xf, 0x36,0x21,0x3d,0xff,0x4, 0x4, 0x3d,0xfc,0x17,0x3, 0x3, 0x34,0xe0,0x1, +0x1f,0xa0,0x15,0x84,0x8e,0xf, 0xe0,0x2, 0x17,0x80,0x3f,0xdd,0xe2,0x0, 0xcf,0x80, +0xe0,0x1, 0x1f,0x9f,0x36,0x28,0x8f,0x8f,0xe0,0x6b,0x39,0x2e,0x3f,0xcc,0xe0,0x1, +0x1f,0x1e,0x3f,0xbb,0xe0,0x0, 0x1e,0xb, 0x8f,0xe, 0xe0,0x43,0x3f,0x9f,0x8e,0xc, +0xb7,0xb2,0xe0,0x1, 0xaf,0x2, 0x26,0xb, 0xe0,0x43,0x3e,0x9d,0xe2,0x0, 0xce,0x80, +0x4, 0x6, 0xe2,0x0, 0xcf,0x81,0x5, 0x29,0x37,0x81,0xb7,0xb2,0xe0,0x4, 0x8f,0xda, +0xe2,0x0, 0xcf,0x81,0x1, 0x85,0x97,0xb2,0xe4,0x0, 0xc7,0x85,0xb7,0xb2,0x9, 0xa1, +0xe7,0xfe,0x0, 0xa6,0xe4,0xf, 0x36,0x4f,0x3f,0x9c,0x37,0x81,0xe0,0x2f,0x3f,0x9b, +0x17,0x1, 0x3f,0x1f,0x0, 0xc5,0xe0,0x2, 0x1f,0xfe,0x8f,0x8f,0xe2,0x0, 0xcf,0xba, +0xe7,0xff,0x2, 0x92,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe7,0xff,0x0, 0x8d,0x17,0x0, +0xe0,0x1, 0xaf,0x62,0xe7,0xfe,0x0, 0xe8,0x37,0x21,0xe0,0x1, 0xaf,0x2, 0x0, 0xd7, +0xe0,0x1, 0x1e,0xea,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xaf,0x1f,0xc7,0x81,0xaf,0x1d, +0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xaf,0xf, 0x38,0x82, +0x8, 0xb2,0xc0,0x7c,0xe0,0x1, 0xd1,0xee,0xdf,0x41,0xdd,0xfd,0xe0,0x1, 0x1f,0xdc, +0x2c,0x10,0x8f,0xf, 0xe0,0x2, 0x19,0x43,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0xac,0x42, +0x1, 0x25,0xdd,0xf1,0x24,0x11,0xe0,0x1, 0x8f,0xe2,0x2f,0x9b,0xc0,0x4, 0x9, 0x61, +0x8f,0xf, 0xe0,0x2, 0x19,0x43,0xe2,0x0, 0xcf,0x1, 0x1, 0x18,0xe0,0x1, 0x8f,0xc2, +0x2f,0x9a,0xdd,0xe1,0x2c,0x71,0x7c,0x1, 0xe0,0x4, 0xdf,0xe1,0xe0,0x0, 0x1f,0x8b, +0x64,0x1, 0xac,0xf, 0xe0,0x0, 0x1f,0x8a,0xac,0xf, 0xe0,0x1, 0x8f,0xe2,0x27,0xe7, +0x14,0x0, 0xc0,0x4, 0x9, 0x21,0xe0,0x9c,0x0, 0xe1,0x17,0x1, 0x16,0x0, 0xe0,0x1, +0xaf,0x42,0xae,0xf, 0x17,0x80,0xe0,0x1, 0x1e,0xea,0xe0,0x1, 0x1f,0x69,0xaf,0x8d, +0x16,0x7, 0xaf,0x9d,0xe0,0x2, 0x1e,0xbb,0xaf,0x8e,0xae,0xd, 0xe0,0x1, 0x1f,0x68, +0xe0,0x1, 0x1e,0xfb,0xaf,0x8e,0xaf,0x8d,0x0, 0xc5,0x0, 0x0, 0xe0,0x0, 0x1f,0x8d, +0x8f,0xf, 0xe0,0x0, 0x1f,0x8e,0xe0,0x0, 0x27,0x60,0xe0,0x0, 0x1f,0xb, 0x8e,0xe, +0xe2,0x0, 0xce,0x2, 0x1, 0x8, 0x17,0xa, 0x3f,0x38,0x3f,0x9e,0xf0,0x10,0x8b,0xaf, +0x5, 0xb4,0x38,0x82,0x8e,0xbf,0xf0,0x0, 0x8b,0x9f,0xf0,0x0, 0x8b,0xf, 0xf0,0xe, +0x3b,0xad,0x8d,0xaf,0xe2,0x0, 0xcf,0x0, 0xe8,0x17,0x3e,0xa7,0xf2,0x1, 0xc3,0xff, +0xf0,0xd, 0x3b,0x2b,0xe2,0x1, 0xc7,0x7f,0xe8,0x6e,0x3d,0x27,0xe8,0xb, 0x3d,0xa6, +0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc5,0xff,0xe2,0x1, 0xc6,0xff,0xe0,0x6d,0x3d,0x2b, +0xf0,0x40,0x3b,0xee,0x3d,0xed,0xf2,0x1, 0xc3,0xff,0xe2,0x1, 0xc5,0xff,0xf0,0x40, +0x3b,0xfb,0x3, 0x82,0x3f,0x6d,0x15,0x8a,0x3d,0xb8,0x3e,0xee,0xe0,0xf, 0x3f,0x9b, +0xf0,0x10,0x8b,0xaf,0xe2,0x1, 0xc6,0xff,0xf2,0x0, 0xcb,0x94,0x2, 0x99,0xf2,0x0, +0xcb,0x8a,0x2, 0xad,0xea,0xf, 0x7f,0x58,0xe0,0xf, 0x3f,0x18,0x8d,0x89,0xf0,0x0, +0x8b,0xf, 0xe8,0x40,0x3d,0xf6,0x3, 0x86,0xf0,0x0, 0xab,0x9, 0x8f,0x8f,0xaf,0x8a, +0x8d,0x89,0xe2,0x0, 0xce,0x2, 0x1, 0x1f,0x3f,0x18,0xad,0x8e,0x38,0x82,0x17,0x85, +0xaf,0x89,0xaf,0x8a,0x0, 0xe8,0xea,0xf, 0x7e,0xd8,0x3f,0xed,0xe1,0x80,0xbf,0x1f, +0xc7,0x84,0xbf,0x1d,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f, +0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xb7,0xf, 0x38,0x82,0x17,0x84,0xaf,0x89, +0xaf,0x8a,0x0, 0xd1,0xe0,0xf, 0x36,0xc1,0xe2,0x1, 0xc7,0xff,0x3f,0xfb,0x3, 0x8d, +0xf2,0x0, 0xcb,0x95,0x16,0x83,0xe0,0x6d,0x3c,0xac,0x3e,0xff,0xe0,0x6f,0x3b,0xad, +0x3d,0xef,0xe2,0x1, 0xc5,0xff,0xad,0x89,0xad,0x8a,0x8d,0x89,0x0, 0xce,0xe0,0x1, +0x1f,0xcf,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x2, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x78,0xe0,0x0, 0x19,0xb, 0xf0,0x0, 0x8e,0x2, 0xf0,0x1, 0x26,0x1c, +0xf0,0x0, 0x16,0x0, 0xe0,0x0, 0x1a,0xe, 0xe0,0x2, 0x19,0xbf,0xf0,0x1, 0x1c,0xd1, +0xe0,0x1, 0x1b,0x2d,0xf0,0x1, 0x1c,0x1d,0xf8,0x40,0x3d,0xec,0x12,0x83,0x13,0x84, +0x0, 0x9e,0x14,0x84,0x3c,0x69,0xe8,0x40,0x3d,0xec,0xe8,0x40,0x3d,0x6b,0x6b,0x8a, +0x6b,0x8b,0xe0,0x4, 0xdf,0xc1,0xe8,0x0, 0x8f,0x88,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x1, 0x6d,0xf0,0x0, 0xc6,0x1, 0xf2,0x1, 0xc6,0x7f,0xf0,0x0, 0xc5,0x81,0x8f,0x82, +0xf2,0x1, 0xc5,0xff,0xe8,0x40,0x3f,0xfb,0xe0,0x0, 0x5, 0xee,0xf0,0xe, 0x35,0xa1, +0x3f,0x14,0xf0,0x0, 0x8e,0x8e,0x8f,0xd3,0xf0,0x0, 0x8d,0x1e,0xe8,0xf, 0x3f,0xbd, +0xe8,0x0, 0xa7,0x9, 0xe8,0xf, 0x3f,0x9a,0x37,0xa1,0x3f,0x9e,0x97,0xf, 0x97,0xa6, +0x3f,0x7f,0x4, 0x64,0xe0,0x3, 0x8f,0x96,0x6a,0x8a,0x6a,0x8b,0x2f,0xcb,0x8f,0xf3, +0x15,0x80,0xe8,0x40,0x3d,0x6b,0xe8,0x40,0x3c,0xea,0xe8,0x40,0x3c,0x6d,0x7f,0x81, +0xf0,0x0, 0x8f,0x63,0xe0,0x4, 0xde,0xf8,0x8f,0x82,0xe2,0x0, 0xcf,0x83,0x5, 0x84, +0x17,0x82,0x6f,0x8a,0x6f,0x8b,0xe2,0x1, 0xcc,0x7f,0x1, 0x4, 0x17,0x82,0x6f,0x8a, +0x6f,0x8b,0xf2,0x0, 0xce,0x81,0x5, 0x86,0xf1,0xff,0xc7,0x7e,0xf8,0x40,0x3e,0xfe, +0x4, 0x3, 0x17,0x81,0x6f,0x8a,0xf2,0x0, 0xcd,0x1, 0x5, 0x88,0xf0,0x0, 0x66,0x81, +0xf1,0xff,0xc6,0xfe,0xf8,0x40,0x3d,0x7d,0x4, 0x3, 0x17,0x81,0x6f,0x8b,0xe2,0x0, +0x7d,0xb, 0xe2,0x0, 0x7c,0x8a,0xe8,0x40,0x3c,0x6b,0xde,0xe1,0x4c,0xa, 0x4c,0x8b, +0xe8,0x40,0x3d,0xec,0xe8,0x40,0x3d,0x6b,0xe0,0x4, 0xdf,0x56,0xe8,0x0, 0x8f,0x88, +0xe2,0x0, 0xcf,0x81,0xe7,0xff,0x1, 0x97,0x17,0x8a,0xe8,0xf, 0x3f,0xbc,0x3f,0x94, +0xe0,0x7, 0x9e,0xef,0xe0,0x7, 0x97,0x7f,0xe0,0x7, 0xb6,0xff,0xe0,0x7, 0xb7,0x6f, +0xe7,0xff,0x0, 0x89,0xf0,0x0, 0xae,0x2, 0xc0,0x8, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0x8f,0x8, 0x3f,0xe8,0x3f,0x79,0x2, 0x8c,0x8f,0x28,0x14,0x0, 0x3f,0x79,0x5, 0x89, +0x8f,0x1f,0x3f,0x7a,0x2, 0x86,0x8c,0x3f,0xe1,0x28,0x3c,0x1a,0x38,0x82,0x14,0x0, +0x38,0x82,0xe0,0x2, 0x1f,0xbf,0x8f,0xdf,0x3c,0x3f,0x3c,0x19,0xe3,0xff,0xc4,0x7f, +0x38,0x82,0x24,0x9b,0xc4,0xff,0xe2,0x1, 0xc4,0xff,0x17,0x7f,0xe0,0xe, 0x3f,0x18, +0xe0,0xb, 0x3c,0x19,0xe0,0x1, 0x14,0x7f,0xe0,0x80,0x87,0x9e,0xe4,0xd, 0x34,0x28, +0xe4,0xf, 0x37,0xa8,0xe4,0xc, 0x37,0xc8,0x3e,0x78,0xe0,0x6f,0x3a,0xad,0x3f,0x7b, +0xe4,0x8, 0x37,0xc8,0x1, 0xf2,0x38,0x82,0xe0,0x1, 0x14,0x7f,0x38,0x82,0x24,0x99, +0xc4,0xff,0xe2,0x1, 0xc4,0xff,0x17,0x7f,0x3f,0x18,0x3c,0x98,0xe0,0x0, 0x14,0x0, +0xe0,0x80,0x87,0x9e,0xe4,0xd, 0x34,0x28,0xe4,0xf, 0x37,0xa8,0xe4,0xc, 0x37,0xc8, +0x3e,0x78,0xe0,0x6f,0x3c,0xad,0x3f,0x79,0xe4,0x8, 0x37,0xc8,0x1, 0xf2,0x38,0x82, +0x3c,0x69,0x38,0x82,0x24,0xb2,0xc4,0xff,0xe3,0xff,0xc4,0xff,0x16,0x7f,0x3e,0x18, +0xe0,0xb, 0x3c,0x19,0xe1,0xff,0x14,0x7f,0xe0,0x80,0x8f,0x9c,0x17,0x8, 0x37,0xbe, +0x0, 0x8d,0xc7,0x7f,0xe4,0x8, 0x34,0x21,0xe4,0xf, 0x37,0xa1,0xe3,0xff,0xc7,0x7f, +0xe4,0x8, 0x34,0x40,0xe4,0xf, 0x37,0xc0,0x27,0x15,0xe2,0xd, 0x3c,0x4f,0xe0,0x43, +0x3e,0x9d,0xe2,0x0, 0xce,0x80,0x3, 0x6e,0x34,0x21,0xc7,0x7f,0xe4,0x20,0xcc,0x21, +0xe4,0xf, 0x37,0xa1,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc4,0x7f,0xe4,0xf, 0x37,0xc0, +0x2f,0x6d,0x3d,0xfc,0x1, 0xda,0x38,0x82,0xe1,0xff,0x14,0x7f,0x38,0x82,0xe0,0x2, +0x1f,0x7, 0x9f,0x88,0x9e,0x8e,0x3f,0xfd,0x2, 0x84,0x17,0x80,0xb7,0x88,0x38,0x82, +0x9f,0xe, 0x3f,0xae,0xb7,0x88,0x38,0x82,0xe0,0xf, 0x3c,0x2a,0x3e,0xef,0xe2,0x1, +0xc6,0xff,0xf0,0x43,0x3a,0x8d,0xe0,0x13,0x3c,0x1a,0xe0,0x2, 0x1e,0x3f,0xf8,0x40, +0x3a,0xf3,0xf0,0x0, 0x80,0xec,0xf0,0x0, 0x83,0x7c,0xe0,0x0, 0x2, 0x59,0xe0,0xf, +0x34,0x21,0xe0,0x12,0x3c,0xaa,0x3f,0xad,0xe0,0x1, 0x1e,0xd1,0xe8,0x40,0x3f,0x62, +0xe2,0x1, 0xc7,0x7f,0xe0,0x12,0x34,0xa1,0x3d,0x19,0xf0,0x0, 0xa3,0x8d,0x3c,0xef, +0xf0,0x0, 0x88,0x5c,0xf0,0x43,0x3a,0xe, 0xe2,0x1, 0xc4,0xff,0xe0,0x0, 0x14,0x0, +0xf0,0x12,0x39,0x2e,0xf2,0x0, 0xca,0x80,0xe0,0x43,0x3f,0x89,0xe8,0x40,0x3d,0xe5, +0xe0,0x6b,0x3c,0x2f,0xf8,0x40,0x38,0xf5,0xe0,0x6b,0x3d,0x2f,0xf0,0x40,0x3a,0x7a, +0x2, 0x23,0xe8,0x40,0x3e,0xe2,0xe8,0xb, 0x3d,0xb0,0xe2,0x1, 0xc6,0xff,0xe8,0x40, +0x3f,0x64,0x0, 0x0, 0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0xd, 0x3f,0xee,0xe0,0x6f, +0x3c,0x2c,0xf0,0x40,0x3b,0x7e,0xc7,0x1, 0xe0,0x6f,0x3d,0x2c,0x3f,0x9b,0x37,0xa1, +0xe8,0xf, 0x3f,0x97,0xe0,0x43,0x3f,0xe, 0x97,0x8f,0x3f,0x7a,0xc6,0xff,0x3c,0x1f, +0xe2,0x1, 0xc6,0xff,0x5, 0x68,0xf0,0x0, 0xc2,0x81,0xf8,0x43,0x3a,0x85,0xf8,0x40, +0x3a,0xf3,0xc4,0xff,0xe2,0x1, 0xc4,0xff,0x5, 0x46,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe0,0x0, 0x1f,0x8e,0x34,0x21,0x3f,0x98,0x3d,0x69,0x8c,0xf, 0x8c,0x9f,0xe2,0x1, +0xc5,0x7f,0xe7,0xff,0x0, 0x8b,0x8, 0xb1,0xc0,0x68,0xe4,0x0, 0x17,0x80,0xe0,0x2, +0x1e,0xbf,0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd,0x3d,0x1f,0xe0,0xf, +0x34,0x41,0x7f,0x1, 0x34,0xc1,0x7f,0x6, 0x35,0x41,0x7f,0x85,0xe2,0x0, 0x7c,0x4, +0x17,0x90,0x7f,0x2, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, 0x77,0x8c,0xe0,0x4, +0xd6,0x70,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, 0x1e,0xbf,0xe4,0x0, +0x17,0x80,0x17,0x0, 0x86,0x5d,0x3c,0x1f,0x86,0xcd,0x3c,0x9f,0x3d,0x1f,0x7f,0x1, +0xe0,0xf, 0x34,0x41,0x34,0xc1,0x35,0x41,0xe2,0x0, 0x7c,0x4, 0x7f,0x2, 0x7f,0x6, +0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, 0x7f,0x85,0x6d,0x87,0xe0,0x4, 0xd6,0x51, +0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe4,0x0, 0x17,0x80,0xe0,0x2, 0x1e,0xbf, +0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd,0xe0,0xf, 0x34,0x41,0x7f,0x1, +0x34,0xc1,0x7f,0x6, 0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0xa0,0x7f,0x2, 0x7f,0x4, +0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x77,0x8c,0xe0,0x4, 0xd6,0x33,0xc0,0x18,0x8, 0xe1, +0x8, 0xb1,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0x2d,0xe0,0x2, 0x1e,0xbf,0xe4,0x0, +0x17,0x80,0xe2,0x0, 0x7d,0xae,0x3c,0x1f,0xf0,0x0, 0x93,0x2e,0xf0,0x0, 0x93,0xbe, +0x95,0x7e,0x3f,0x9b,0xe0,0x1, 0x95,0x8e,0xe0,0x1, 0x1f,0x47,0xf0,0x0, 0x82,0x4d, +0xf0,0x0, 0x82,0xdd,0x16,0x1, 0xe0,0xd, 0x34,0x41,0x37,0xc1,0x37,0x41,0xe2,0x0, +0x7c,0x14,0xe2,0x0, 0x7c,0x84,0x7e,0x86,0x7f,0x88,0x7f,0x7, 0x75,0x95,0x6e,0x16, +0x6e,0x17,0xf0,0x0, 0x6a,0x15,0xf0,0x0, 0x6a,0x94,0xf0,0x0, 0x73,0x12,0xf0,0x0, +0x73,0x93,0x75,0x14,0xe0,0x4, 0xd6,0x5d,0x5c,0x7, 0x5f,0x5, 0xe0,0x43,0x3f,0x98, +0xe2,0x0, 0xcf,0x80,0xe0,0x41,0x3e,0x4f,0xe0,0x43,0x3e,0x9e,0x3d,0xe8,0xe0,0x6b, +0x3d,0x2c,0xe2,0x0, 0xce,0x80,0x5, 0x13,0x3d,0xfe,0x5, 0xd, 0xe0,0x41,0x3f,0x48, +0xe2,0x0, 0xcf,0x80,0x3f,0xee,0xe3,0xff,0xc7,0xff,0xe0,0x68,0x3d,0x2f,0xe0,0x0, +0xc0,0x68,0x8, 0xe1,0x3c,0x6e,0xe0,0x0, 0xc0,0x68,0x8, 0xe1,0xe0,0x41,0x3e,0xcd, +0x3d,0xfd,0x2, 0x6d,0xe0,0x41,0x3c,0x4e,0xe3,0xff,0xc4,0x7f,0xe0,0x0, 0xc0,0x68, +0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, 0x1f,0x3f,0xe4,0x0, 0x17,0x80,0x16,0x80, +0x3c,0x9f,0xf0,0x0, 0x81,0xde,0xf0,0x0, 0x82,0x4e,0x3f,0x98,0xe0,0x16,0x35,0x41, +0xe0,0x17,0x35,0x42,0x17,0x1, 0x7e,0x81,0xe0,0x15,0x34,0xc1,0x7e,0x86,0x3f,0x5a, +0x37,0xc1,0xf2,0x0, 0xc3,0x1, 0xf2,0x0, 0xc3,0x81,0x3d,0x6c,0x3c,0xeb,0xe2,0x0, +0x7c,0x4, 0x7e,0x82,0x7e,0x84,0xf0,0x0, 0x69,0x85,0xf0,0x0, 0x6a,0x4, 0xf0,0x0, +0x7a,0x83,0x7f,0x85,0x6f,0x7, 0xf0,0x0, 0x6b,0x1a,0xf0,0x0, 0x6b,0x9b,0xe0,0x4, +0xd8,0x4e,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe4,0x0, 0x17,0x80,0xe0,0x2, +0x1f,0x3f,0x3c,0x1f,0xf0,0x0, 0x13,0x80,0x3c,0x9f,0xf0,0x0, 0x82,0xde,0xf0,0x0, +0x83,0x4e,0x3d,0x1f,0xe0,0xe, 0x34,0x41,0xe0,0xf, 0x36,0x41,0x36,0x42,0xf0,0x0, +0x7b,0x81,0xe0,0xd, 0x34,0xc1,0xf0,0x0, 0x7b,0x86,0x35,0x41,0xe2,0x0, 0xc7,0x81, +0xe2,0x0, 0xc6,0x1, 0x7f,0x5, 0x3c,0xeb,0x17,0x1, 0xe2,0x0, 0x7c,0x4, 0xf0,0x0, +0x7b,0x82,0xf0,0x0, 0x6a,0x85,0xf0,0x0, 0x6b,0x4, 0x7e,0x83,0x7d,0x4, 0x6f,0x7, +0x6f,0x9a,0x6e,0x1b,0xe0,0x4, 0xd7,0xd6,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68, +0xe0,0x2, 0x1f,0x3f,0xe4,0x0, 0x17,0x80,0x16,0x0, 0x3c,0x1f,0xf0,0x0, 0x83,0x5e, +0xf0,0x0, 0x83,0xce,0x3c,0x9f,0x3d,0x1f,0xe0,0xe, 0x35,0xc1,0xe0,0xf, 0x35,0xc2, +0x7e,0x1, 0xe0,0xd, 0x34,0x41,0x7e,0x6, 0x34,0xc1,0x35,0x41,0xe2,0x0, 0xc5,0x81, +0xe2,0x0, 0xc7,0x1, 0xe2,0x0, 0xc7,0x81,0xe2,0x0, 0x7c,0x4, 0x7e,0x2, 0xf0,0x0, +0x6b,0x5, 0xf0,0x0, 0x6b,0x84,0x7c,0x83,0x7d,0x4, 0x7e,0x85,0x6d,0x87,0x6f,0x1a, +0x6f,0x9b,0xe0,0x4, 0xd8,0x55,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, +0x1f,0x3f,0xe4,0x0, 0x17,0x80,0x16,0x80,0xf0,0x0, 0x83,0xde,0x85,0xce,0x3c,0x9f, +0x3c,0x1f,0xe0,0xe, 0x35,0x41,0xe0,0xf, 0x35,0x42,0x16,0x1, 0x7e,0x81,0x3e,0x5a, +0x34,0xc1,0x34,0x41,0xe2,0x0, 0xc7,0x1, 0xe2,0x0, 0xc7,0x81,0x7e,0x82,0x35,0x43, +0x7e,0x84,0xf0,0x0, 0x6b,0x85,0x6d,0x84,0x7c,0x83,0x7c,0x5, 0x6e,0x7, 0x6f,0x1a, +0x6f,0x9b,0x2d,0x9, 0x14,0x4, 0x17,0xa0,0x3c,0x10,0x77,0x8c,0xe0,0x4, 0xd7,0xf5, +0xc0,0x18,0x8, 0xe1,0x14,0x4, 0x17,0x90,0x3c,0x10,0x77,0x8c,0xe0,0x4, 0xd7,0xed, +0xc0,0x18,0x8, 0xe1,0x8, 0xb2,0xc0,0x70,0xf0,0x1, 0x1b,0xc6,0xf0,0x1, 0x1a,0xc5, +0xe0,0x1, 0x19,0x44,0xe4,0x0, 0x17,0x80,0xe0,0x1, 0x1f,0x4d,0xf0,0xc, 0x3a,0x9f, +0xf0,0xd, 0x3b,0x9f,0xe8,0x0, 0xb4,0x5, 0x3f,0x92,0xf0,0x8d,0x12,0x86,0xf0,0x0, +0x13,0x1, 0xf0,0x15,0x3a,0x9e,0x36,0x41,0x36,0xc1,0x37,0xc1,0xe0,0x8d,0xc7,0x2e, +0xe2,0x0, 0x7c,0x4, 0x7e,0x2, 0x7e,0x83,0x7f,0x84,0xf0,0x0, 0x6b,0x4, 0xf0,0x0, +0x6b,0x5, 0xe8,0x0, 0xb4,0x85,0xe8,0x0, 0xb5,0x7, 0xb5,0x8e,0xe0,0x4, 0xd5,0xc2, +0x9c,0x2, 0xc0,0x10,0x9, 0x61,0x0, 0x0, 0xe0,0x2, 0x1f,0xff,0x8f,0x8f,0xe2,0x0, +0xcf,0x83,0x1, 0x3, 0x14,0x1, 0x38,0x82,0x8, 0xb2,0x39,0x68,0x3c,0x69,0xd9,0xd4, +0xe0,0x1, 0x1f,0xe0,0xe0,0x1, 0x8f,0x1f,0xe2,0x0, 0xcf,0x5, 0x24,0x7, 0x1, 0x8, +0xe0,0x1, 0x8c,0x1f,0xe0,0x28,0x39,0x8, 0x9, 0x61,0x1, 0xfb,0x0, 0xfc,0xe2,0x1, +0xc1,0x7d,0x14,0x0, 0x29,0x7a,0xea,0xf, 0x7f,0xf6,0x8e,0xf, 0x17,0x1, 0x3f,0x1c, +0xe0,0x1, 0x1e,0xa4,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x3, 0x3e,0x9c,0x8c,0xd, +0x2, 0x83,0xaf,0xf, 0x9, 0x61,0xa9,0xf, 0x9, 0x61,0xe0,0x2, 0x1f,0xe9,0xe4,0x0, +0xc4,0x8e,0xe0,0xe, 0x3f,0x99,0x8f,0x1e,0x27,0x5, 0x17,0x1, 0xe0,0x2e,0x3c,0xe, +0x2f,0xd, 0x3f,0x99,0x8f,0xbf,0x27,0x89,0x17,0x84,0xe0,0x28,0x3c,0xf, 0x24,0x5, +0xe0,0x1, 0x1f,0xcf,0x17,0x0, 0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x4f,0x16,0x80, +0xae,0x8e,0x0, 0xf0,0x8, 0xb5,0xe0,0x2, 0x1f,0x8d,0x8a,0xf, 0xef,0xfe,0xd5,0xc4, +0x24,0x7e,0xe0,0x0, 0x19,0x2b,0xe0,0x2, 0x8f,0x82,0xe0,0xe, 0x39,0x1f,0xe0,0x6, +0x8a,0x8e,0x8e,0xce,0x2e,0xa3,0xe0,0x1, 0x19,0xcf,0x8f,0x83,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x1, 0x3d,0xe0,0x2, 0x1f,0xff,0x8f,0x8f,0xe2,0x0, 0xcf,0x83,0x1, 0x36, +0xe0,0x2, 0x8f,0x2, 0xe0,0x2, 0x8f,0x92,0x3f,0x7f,0x4, 0x8b,0xef,0xff,0xd0,0x75, +0xac,0x3, 0xe0,0x1, 0xd8,0xd3,0xe0,0x1, 0xd8,0x56,0xd9,0xe3,0xef,0xfe,0xd5,0x28, +0xd9,0x26,0xa, 0xa1,0xe7,0xf2,0x0, 0xb0,0x3f,0x2, 0x8e,0xce,0xe0,0x1, 0x1e,0x60, +0xc6,0xff,0xe0,0x5, 0xae,0xbc,0x8f,0x4e,0xe0,0x1, 0x19,0xcf,0xe2,0x0, 0xcf,0x1, +0x1, 0x2, 0x17,0x0, 0xaf,0x3, 0x3f,0x92,0x17,0x0, 0xaf,0x4f,0x3c,0x65,0xe0,0x1, +0x8a,0x1f,0x3c,0xe4,0xe0,0x4, 0xdd,0xe4,0xe0,0x2, 0x8f,0x82,0xc7,0x81,0xe0,0x2, +0xaf,0x82,0x8f,0x83,0xe2,0x0, 0xcf,0x81,0x1, 0xc6,0xe0,0x2, 0x1f,0xa8,0x8f,0x8f, +0x27,0xc8,0xe2,0x0, 0xca,0x85,0x1, 0x1f,0x17,0x5, 0x3f,0x34,0xe0,0x2, 0x1f,0xed, +0x3f,0x9e,0x8c,0xcf,0xe0,0x1, 0x1f,0xc3,0xa4,0xf, 0xef,0xfe,0xd6,0x69,0x3c,0xe4, +0x3c,0x65,0xdf,0x4b,0xe7,0xff,0x24,0x36,0xe0,0x4, 0xdd,0xf4,0xe0,0x1, 0x1f,0xce, +0xaa,0x8f,0xe0,0x1, 0x1f,0xe0,0xe0,0x5, 0xaa,0xcf,0xe0,0x2, 0x1f,0xce,0xaa,0xf, +0xe7,0xff,0x0, 0xa8,0x17,0x80,0xaf,0x83,0xe7,0xff,0x0, 0xa4,0x8, 0xb3,0xe0,0x0, +0x19,0xab,0x11,0x0, 0xdf,0x80,0xc1,0x1, 0xe0,0x2, 0x8f,0x93,0xe2,0x1, 0xc1,0x7f, +0x39,0x7f,0x4, 0xf9,0xe0,0x1, 0x1f,0xe0,0xe0,0x5, 0x8c,0x4f,0xe0,0x2, 0x1f,0xce, +0x8c,0x8f,0x9, 0xa1,0xe0,0x9b,0x0, 0x9c,0xe0,0x1, 0x1c,0xaa,0x15,0x20,0xe0,0x22, +0x14,0x40,0xe7,0xdb,0x0, 0xd7,0xe0,0x1, 0x1f,0x23,0xe0,0x1, 0x1f,0xe0,0xe0,0xe, +0x85,0x9e,0x16,0x0, 0xae,0xf, 0x15,0x2, 0xad,0xaf,0xe0,0x2, 0x1e,0xa8,0xe0,0xe, +0x85,0xae,0x8e,0x8d,0xad,0xbf,0x3d,0x5d,0xe0,0xe, 0x85,0xde,0xe0,0x3, 0xad,0xef, +0x2d,0x2d,0xe0,0x10,0x86,0x5e,0xe0,0x10,0x85,0xee,0x3e,0x1b,0xe0,0x2, 0xae,0x6f, +0xe0,0xe, 0x86,0x6e,0xe0,0x3, 0xae,0x7f,0x16,0x3f,0x3e,0x5d,0xe0,0x11,0x8e,0x8e, +0xe0,0x10,0x8d,0xfe,0x36,0xa6,0x3e,0xcc,0xe0,0xc, 0x35,0xa7,0x3e,0xcc,0xe0,0x4, +0xae,0xef,0x2d,0x9b,0xe0,0xd, 0x86,0x5e,0xe0,0xd, 0x86,0xfe,0xe0,0xa, 0xae,0xf, +0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x2d,0x72,0xe0,0xd, 0x85,0xee,0xe0,0xe, 0x87,0xe, +0xe0,0xa, 0xad,0xaf,0xe0,0xa, 0xaf,0x3f,0x0, 0x97,0xe0,0x10,0x85,0xde,0xe0,0x2, +0xad,0xef,0xe0,0x3, 0xae,0x7f,0x0, 0xd9,0xe0,0xd, 0x86,0x6e,0xe0,0xe, 0x86,0x8e, +0xe0,0xa, 0xae,0xf, 0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x25,0x4e,0x17,0x0, 0xe0,0xa, +0xaf,0x2f,0xe0,0xa, 0xaf,0x3f,0x17,0x0, 0xe0,0x1, 0x1e,0x9c,0xe0,0x2, 0x1e,0x9, +0x86,0x8d,0x15,0x81,0xae,0xdf,0xaf,0x6f,0xe0,0x1, 0xaf,0x3f,0xe0,0x2, 0xaf,0xf, +0xe0,0x0, 0x1e,0xb7,0xe0,0x1, 0xaf,0x7f,0x86,0x8d,0xe0,0x1, 0xae,0xcf,0xe0,0x1, +0xaf,0x5f,0x86,0xbc,0xe0,0x1, 0xaf,0x6f,0x87,0x4c,0xe0,0x4, 0xae,0x8f,0xe0,0x4, +0xaf,0x1f,0xe0,0x1, 0x1f,0x1b,0x86,0x5c,0x8e,0x8e,0xe0,0x1, 0x1f,0x1a,0xe0,0x4, +0xae,0x2f,0x36,0xa8,0xe0,0x2, 0x1e,0x4d,0x8f,0xe, 0x86,0x1c,0x3f,0x4d,0xe0,0x2, +0x1e,0xfd,0xe0,0x5, 0xae,0x1f,0xe0,0x6, 0xad,0x8f,0x8e,0x8d,0xe0,0x5, 0xb7,0x5f, +0x26,0xa2,0xe0,0x2, 0x1f,0x73,0xa7,0xe, 0xa7,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x1b, +0x16,0x85,0xe0,0x1, 0xae,0x9f,0x17,0x0, 0xe0,0x2, 0xaf,0x5f,0xe0,0x2, 0xaf,0x1f, +0xaf,0x4f,0x38,0x82,0xe0,0xd, 0x85,0xde,0xe0,0xd, 0x87,0x7e,0xe0,0xa, 0xad,0xaf, +0xe0,0xa, 0xaf,0x3f,0xe7,0xff,0x0, 0xb1,0xe0,0xa, 0xad,0xaf,0xe0,0xa, 0xad,0xbf, +0xe7,0xff,0x0, 0xab,0x16,0x0, 0xe0,0x1, 0xae,0x1f,0x17,0x0, 0xe0,0x2, 0xaf,0x5f, +0xe0,0x2, 0xaf,0x1f,0xaf,0x4f,0x38,0x82,0xe0,0x2, 0x1f,0x39,0x34,0xa6,0xf0,0x2, +0x1b,0xb8,0x3c,0x19,0x17,0x80,0xb4,0xe, 0x17,0x0, 0x3d,0xef,0xe8,0x0, 0xaf,0x7, +0x3e,0xef,0x15,0x1, 0xe0,0xe, 0x34,0x1f,0x16,0x1, 0xe2,0x0, 0xc7,0x1, 0xc7,0x81, +0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0xea,0xe2,0x0, 0xcf,0x8c, +0x1, 0xf2,0x2d,0x82,0x38,0x82,0xe8,0x0, 0xae,0x87,0x38,0x82,0x8, 0xb1,0xf0,0x2, +0x1b,0xbf,0xe0,0x1, 0x1c,0x99,0xe8,0x40,0x3c,0x67,0xe0,0x19,0x15,0x1c,0xe0,0x5, +0xde,0x73,0xe0,0x2, 0x1f,0xa8,0xf0,0x40,0x3b,0xe8,0x87,0x8f,0xe2,0x0, 0xc7,0x82, +0x2f,0xbe,0xe0,0x3, 0x8e,0x98,0xe0,0x3, 0x8f,0x88,0x97,0x58,0x96,0x68,0x3f,0x9d, +0xe0,0x2, 0x1e,0xb7,0x3f,0x1c,0xb7,0xd, 0xe0,0x2, 0x1f,0x36,0xb7,0x8e,0x17,0x80, +0xe0,0x1, 0x1e,0xa3,0xe0,0x2, 0x1c,0x38,0xe0,0xe, 0x8f,0x6d,0xe0,0xe, 0x8d,0xdd, +0x37,0x26,0x3d,0x9e,0xe0,0x2, 0x1f,0x39,0x3d,0x6f,0xb5,0x8e,0x17,0x0, 0xaf,0x8, +0x3e,0xef,0x14,0x81,0xe0,0xe, 0x35,0x9f,0x16,0x1, 0xe2,0x0, 0xc7,0x1, 0xc7,0x81, +0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0x69,0xe2,0x0, 0xcf,0x8c, +0x1, 0xf2,0x2d,0x1f,0xe0,0x1, 0x1f,0x9d,0x8f,0x8f,0x27,0x93,0xe8,0x0, 0x8f,0xc7, +0xe0,0x2, 0x1f,0x35,0x37,0xa6,0xc7,0xff,0xb7,0x8e,0x8, 0xe1,0xe0,0x2, 0x1f,0xb7, +0x96,0xd8,0xe0,0x3, 0x8f,0x8, 0xb6,0x8f,0xe0,0x2, 0x1f,0xb6,0xb7,0xf, 0x0, 0xc8, +0xe8,0x0, 0x8f,0xd7,0xe0,0x2, 0x1f,0x35,0x37,0xa6,0xc7,0xff,0xb7,0x8e,0x8, 0xe1, +0xae,0x88,0x0, 0xe1,0x8, 0xb3,0xe0,0x1, 0x19,0x4d,0xe0,0x1, 0x1f,0xc2,0xe0,0xc, +0x11,0xd2,0xe0,0x8c,0x16,0xfc,0xe0,0x8d,0x17,0x0, 0x3e,0x92,0x3f,0x12,0x3d,0x63, +0x3c,0x6f,0x14,0x80,0xbf,0x8d,0xb9,0xe, 0xe0,0x5, 0xde,0x40,0x3d,0x63,0x14,0x80, +0x3c,0x62,0xe0,0x5, 0xde,0x3b,0xe0,0x8f,0xc1,0x46,0x17,0x80,0xaf,0x82,0x9, 0xe1, +0x8, 0xb2,0xe0,0x1, 0x1f,0xa3,0xe0,0x1a,0x17,0x24,0x3f,0x1f,0xe0,0x1a,0x16,0x25, +0xe0,0x1a,0x15,0x2a,0x8e,0x8e,0x3e,0x1f,0x3d,0x1f,0xe0,0x1a,0x17,0x26,0x8d,0x8c, +0x8c,0xa, 0x3f,0x1f,0xe0,0x1a,0x16,0x27,0xe0,0x1a,0x14,0xab,0xe0,0x1a,0x15,0x2c, +0x8f,0xe, 0x3c,0x9f,0x3d,0x1f,0x3e,0x1f,0x36,0xa8,0xe0,0x2, 0x19,0x5, 0x8e,0xc, +0x3d,0xcd,0xf0,0x1a,0x13,0xad,0x8e,0x89,0x8c,0x8a,0xe0,0x1a,0x15,0x34,0xf0,0x17, +0x3b,0x9f,0x3d,0x1f,0x37,0x28,0x35,0xc5,0x8d,0xa, 0x3e,0x4e,0x34,0x28,0xe8,0x0, +0x8f,0x7, 0xe0,0x1a,0xc7,0xb5,0xad,0x82,0x36,0x45,0x8f,0x8f,0xe0,0xb, 0x34,0xa8, +0x3e,0xc8,0xae,0x12,0x36,0xc5,0xe0,0xc, 0x35,0x28,0x3f,0x4b,0xae,0xa2,0x37,0x45, +0x3f,0xcc,0xe0,0x1, 0x1c,0x98,0xe0,0x2, 0x1c,0x4, 0xaf,0x32,0x37,0xc5,0xe0,0x0, +0x15,0x69,0xaf,0xd2,0xe0,0x5, 0xdd,0xb0,0xe0,0x4, 0x8f,0xe2,0xe0,0x1, 0x1c,0xaa, +0xe0,0x41,0x3f,0x8f,0x15,0x20,0xe0,0x22,0x14,0x40,0xe0,0x6, 0xaf,0xc2,0xef,0xfe, +0xdc,0x21,0x9, 0x21,0xe0,0x2f,0x0, 0xed,0x8, 0xb6,0xe0,0x1, 0x1f,0xa3,0xe0,0x1a, +0x15,0xa8,0xe0,0x1a,0x16,0x2e,0xe0,0x1a,0x16,0xb2,0x3d,0x9f,0x3e,0x1f,0x3e,0x9f, +0xe0,0x1a,0x14,0x2a,0xe0,0x1a,0x14,0xac,0xe0,0x1a,0x15,0x30,0x8a,0x8b,0x8a,0xc, +0x89,0x8d,0x3c,0x1f,0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x11,0x24,0xe0,0x1a,0x10,0xa6, +0xe0,0x1a,0x15,0xa9,0xe0,0x1a,0x16,0x2f,0xe0,0x1a,0x16,0xb3,0xf0,0x1a,0x13,0xa5, +0xe0,0x1a,0x13,0x27,0xf0,0x0, 0x89,0x88,0xf0,0x0, 0x8a,0x9, 0xf0,0x0, 0x8a,0x8a, +0xf0,0x17,0x3b,0x9f,0x3b,0x1f,0x39,0x1f,0x38,0x9f,0x3d,0x9f,0x3e,0x1f,0x3e,0x9f, +0xe0,0x1a,0x14,0x2b,0xe0,0x1a,0x14,0xad,0xe0,0x1a,0x15,0x31,0xf8,0x0, 0x8b,0x7, +0x89,0x2, 0xf0,0x0, 0x8b,0x86,0x88,0x81,0x8d,0x8b,0x8e,0xc, 0x8e,0x8d,0x3c,0x1f, +0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x13,0x1a,0xf0,0x1a,0x10,0x1c,0xf0,0x1a,0x10,0xe4, +0xf0,0x1a,0x11,0x1d,0x8c,0x8, 0x8c,0x89,0x8d,0xa, 0x3b,0x1f,0xf0,0x10,0x38,0x1f, +0xf0,0x11,0x38,0x9f,0xf0,0x12,0x39,0x1f,0x32,0xa8,0x32,0x28,0x31,0xa8,0xe0,0x1, +0x1f,0x2d,0x83,0x6, 0xf8,0x0, 0x80,0x0, 0xf8,0x0, 0x88,0x81,0xf8,0x0, 0x81,0x2, +0x31,0x28,0x30,0xa8,0x3d,0xc5,0xf0,0x13,0x31,0xa8,0xf0,0x14,0x32,0x28,0x3e,0x44, +0xf0,0x15,0x32,0xa8,0x3e,0xc3,0xf0,0x16,0x3b,0x42,0xf0,0x17,0x3b,0xc1,0xe0,0x41, +0x3d,0xcb,0xe0,0x41,0x3e,0x4c,0xe0,0x41,0x3e,0xcd,0xe8,0x8, 0x3c,0x43,0xe8,0x9, +0x3c,0xc4,0xe8,0xa, 0x3d,0x45,0xe0,0x1a,0x12,0x1e,0xe0,0x1a,0x11,0xb4,0x3a,0x1f, +0x39,0x9f,0xb6,0x6e,0xe0,0x1a,0x11,0x1f,0xe0,0x1, 0xb6,0x8e,0x39,0x1f,0xab,0xe, +0xe0,0x1a,0xc7,0xb5,0xf0,0x0, 0xa8,0x1e,0x10,0x80,0xf0,0x0, 0xb3,0x1e,0xf0,0x0, +0xb3,0xae,0xb5,0xbe,0xb4,0x4e,0xb4,0xde,0xb5,0x7e,0xf0,0x2, 0xa8,0xce,0xf0,0x2, +0xa9,0x5e,0x8d,0x84,0x8e,0x3, 0x8e,0x82,0x8f,0x8f,0x35,0xa8,0x36,0x28,0x3e,0xcb, +0x3f,0xcc,0xe0,0x1, 0xb6,0xbe,0xe0,0x1, 0xb7,0x9e,0xe0,0x3, 0xa8,0x8e,0xe0,0x3, +0xa8,0x9e,0xb, 0x61,0x8, 0xb1,0xe0,0x0, 0x1c,0xe, 0xe0,0x3, 0x15,0x40,0x14,0x80, +0xe0,0x5, 0xdd,0x24,0xe0,0x1, 0x1f,0x97,0xe0,0x0, 0x1c,0x9, 0x8d,0xf, 0xe0,0x1, +0x14,0xff,0xe4,0x0, 0xc5,0xa, 0x8, 0xa1,0xe0,0xba,0x0, 0x98,0x8, 0xb2,0xe0,0x1, +0x1f,0x9c,0xe0,0x2, 0x1c,0x21,0x89,0xf, 0xe0,0x1, 0x14,0xff,0xe4,0x0, 0xc1,0xa, +0x3d,0x62,0xe0,0x5, 0xdd,0xb, 0xe0,0x2, 0x1c,0x1d,0x3d,0x62,0xe0,0x1, 0x14,0xff, +0xe0,0x5, 0xdd,0x4, 0xe0,0x2, 0x1c,0x1c,0x3d,0x62,0xe0,0x1, 0x14,0xff,0xe0,0x5, +0xdc,0xfd,0xe0,0x2, 0x1c,0x1b,0xe0,0x3, 0xd3,0xa3,0xe0,0x2, 0x1e,0xa0,0x17,0x0, +0x3f,0xed,0xe1,0x80,0xb7,0x1f,0xc7,0x82,0xb7,0x1d,0xe1,0x80,0xb7,0x1f,0xe1,0x80, +0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80, +0xb7,0x1f,0xb7,0xf, 0x9, 0x61,0xe0,0x1, 0x1f,0xa3,0xe0,0x2, 0x1e,0xc3,0xe0,0x1b, +0x16,0x61,0x3e,0x1f,0x97,0x5d,0xe0,0x1b,0x15,0x5d,0xe0,0x1b,0x15,0xdf,0x8c,0x8c, +0x3d,0x1f,0x3d,0x9f,0xf7,0xef,0x13,0x7f,0xe0,0x1b,0x16,0x62,0xf0,0x0, 0x8b,0x8a, +0x8c,0xb, 0x3e,0x1f,0xe8,0xe, 0x3f,0x56,0xe0,0x1b,0x15,0x5e,0xe0,0x1b,0x15,0xe0, +0xf0,0x1b,0x13,0x63,0x8e,0xc, 0xf0,0x16,0x3b,0x1f,0x3d,0x1f,0x3d,0x9f,0xf7,0xf7, +0x12,0xff,0xe0,0x1b,0xc7,0xe4,0x8d,0xa, 0x8d,0x8b,0xe8,0xe, 0x3f,0x55,0x34,0xa8, +0xf8,0x0, 0x82,0x86,0xf0,0x0, 0x83,0xf, 0xe7,0xfe,0x17,0xff,0x3f,0xde,0xf0,0x17, +0x33,0xa8,0xe0,0xe, 0x3e,0x49,0x34,0x28,0xe7,0xff,0x16,0x3f,0xe8,0xa, 0x3d,0x47, +0x3d,0xc8,0x3f,0xdc,0xb5,0x1d,0xb5,0xad,0xb7,0x3d,0xf0,0x1, 0xaa,0x8d,0xf0,0x1, +0xab,0x1d,0xb7,0xdd,0x38,0x82,0x8, 0xb1,0xe0,0x1, 0x1f,0x23,0xe0,0x1a,0x16,0x9, +0xe0,0x1a,0x16,0x8e,0x3e,0x1e,0x3e,0x9e,0xe0,0x2, 0x1f,0xed,0xf0,0x0, 0x80,0x2c, +0xf0,0x0, 0x80,0xbc,0xf0,0x0, 0x81,0x4c,0xf0,0x0, 0x81,0x8d,0xe0,0x1a,0xc7,0x13, +0x85,0x9c,0xf0,0x0, 0x82,0x1d,0xf0,0x0, 0x82,0xad,0xf0,0x0, 0x83,0x3d,0xf0,0x0, +0x83,0xcd,0x16,0x85,0x3e,0x9f,0xf0,0x0, 0xa9,0xdf,0xf0,0x0, 0xa9,0x4f,0x84,0xe, +0xf0,0x0, 0xa8,0xbf,0xf0,0x0, 0xa8,0x2f,0xf0,0x0, 0xab,0xcd,0xf0,0x0, 0xab,0x3d, +0x80,0x8c,0x84,0x9e,0x85,0x2e,0x86,0x4e,0xf0,0x0, 0xaa,0xad,0xad,0x9f,0xf0,0x0, +0xaa,0x1d,0x85,0xbe,0x17,0xa, 0x3f,0x1f,0xe0,0x1, 0xac,0x2f,0xa8,0x8f,0xac,0x9e, +0xad,0x2e,0xad,0xbe,0xae,0x4e,0x8, 0xe1,0x8, 0xb4,0xdc,0xc6,0xdd,0xa0,0xde,0x3, +0xe0,0x1, 0x1f,0xa3,0xe0,0x1a,0x15,0x89,0x3d,0x9f,0xe0,0x2, 0x1f,0x6d,0x82,0xb, +0xe0,0x1b,0x15,0x5d,0x3d,0x1f,0xe0,0x1a,0x16,0xe, 0x8c,0x8a,0x3e,0x1f,0x84,0x1b, +0xaa,0xe, 0xe0,0x1a,0x16,0x93,0x82,0x3b,0xf0,0x0, 0x82,0xab,0xf0,0x0, 0x83,0x4b, +0xf0,0x0, 0x83,0x8c,0xe0,0x1b,0x15,0x5e,0x80,0xcc,0x3e,0x9f,0xaa,0x3e,0x3d,0x1f, +0x81,0x9c,0x81,0x3c,0xac,0x1e,0x15,0x85,0x84,0x2c,0x8d,0xa, 0xf0,0x0, 0x80,0xd, +0x3d,0x9e,0xf0,0x0, 0xab,0xde,0x16,0xa, 0xf0,0x0, 0xab,0x4e,0x3e,0x1e,0xf0,0x0, +0xaa,0xae,0x34,0xa8,0xa8,0xcb,0x3d,0x49,0xf0,0x0, 0x80,0x9d,0xf0,0x0, 0x81,0x2d, +0xf0,0x0, 0x81,0xbd,0xf0,0x0, 0x82,0x4d,0xa9,0x3b,0xf0,0x1b,0x12,0xe1,0xac,0x2b, +0xf0,0x15,0x3a,0x9f,0xa9,0x9b,0xf0,0x1b,0x13,0xe2,0xe0,0x2, 0x1e,0xc3,0xf0,0x1, +0xa8,0x2e,0xf0,0x17,0x3b,0x9f,0xf0,0x0, 0xa8,0x9c,0xe0,0x1b,0x14,0xdf,0xf0,0x0, +0xa9,0x2c,0xf0,0x1b,0x13,0x60,0xf0,0x0, 0xa9,0xbc,0xe0,0x1b,0x14,0x63,0xf0,0x0, +0xaa,0x4c,0xe7,0xef,0x16,0x7f,0xb5,0x1d,0xf0,0x16,0x3b,0x1f,0x97,0x5d,0xe8,0x0, +0x8d,0x5, 0x3c,0x1f,0x3c,0x9f,0x3f,0x5c,0xe0,0x1b,0xc7,0xe4,0xe8,0x0, 0x8e,0x7, +0xf7,0xf7,0x13,0xff,0x8c,0x89,0x35,0x28,0xe8,0xe, 0x3f,0x57,0xf0,0x0, 0x83,0x88, +0x84,0xf, 0xe7,0xfe,0x17,0xff,0xe8,0x0, 0x8d,0x86,0x3f,0xde,0xe0,0xe, 0x3e,0x4a, +0xe7,0xff,0x16,0x3f,0x34,0xa8,0x3f,0xdc,0x3d,0xc9,0xb7,0xdd,0xb5,0xad,0xb7,0x3d, +0xf0,0x1, 0xab,0x8d,0xe0,0x1, 0xac,0x1d,0xef,0xff,0xd6,0xf4,0xdd,0xf6,0xde,0xa3, +0xde,0xb6,0xa, 0x21,0xe7,0xea,0x0, 0xea,0xe0,0x1, 0x1f,0x96,0x8f,0xf, 0xe0,0x1, +0x1f,0x95,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xe2,0x1, 0xcf,0xdf,0x3c,0x6f,0x2, 0x83, +0xe0,0x1, 0x14,0x60,0x34,0x45,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x8, 0xb7,0xe0,0x0, +0x1a,0xb, 0x8b,0x4, 0xe0,0x0, 0x23,0x44,0x13,0x0, 0xe0,0x0, 0x1a,0x8e,0xe0,0x2, +0x1b,0xa1,0x39,0x66,0x0, 0x87,0xc1,0x1, 0x8f,0x84,0xe2,0x1, 0xc1,0x7f,0x3f,0xf2, +0x5, 0xaf,0x3c,0x62,0xe0,0x1, 0xd8,0xab,0xe0,0xf, 0x31,0x21,0x3f,0x95,0x39,0xe8, +0x8c,0xf, 0xe0,0x1, 0xd8,0xb6,0xe0,0x43,0x3c,0x18,0x39,0xf8,0x4, 0x6d,0x3c,0x62, +0xe0,0x1, 0xd8,0x76,0x24,0x69,0x17,0x8a,0x3f,0xb2,0x17,0xa, 0xe0,0x0, 0xc7,0xfc, +0x3f,0x95,0x3f,0x36,0x94,0x8f,0x95,0x1f,0x95,0xaf,0x96,0x3f,0x96,0xcf,0xe0,0xf, +0x3f,0x17,0xb4,0x8f,0xc1,0x1, 0xb5,0x1f,0xe2,0x1, 0xc1,0x7f,0xb5,0xaf,0xc3,0x1, +0xb6,0x3f,0xe2,0x1, 0xc3,0x7f,0xb6,0xcf,0x8f,0x84,0x3f,0xf2,0x2, 0xd3,0xe0,0x0, +0x1f,0xc, 0xaf,0x8e,0xe0,0x2, 0x1f,0xa0,0xab,0xf, 0xb, 0xe1,0x3f,0xe6,0x0, 0xf8, +0xe7,0xff,0x0, 0xb6,0x8, 0xb4,0xe0,0x1, 0x1e,0xa3,0xe0,0x1, 0x1e,0x51,0xf0,0xe, +0x8b,0xad,0xa6,0xc, 0xe8,0xe, 0x3d,0x37,0xf0,0xf, 0x3b,0xb8,0x3f,0x1b,0x3f,0x99, +0x37,0x21,0x37,0xa1,0x3f,0x1c,0x3f,0x9c,0x97,0xe, 0x97,0x8f,0xe0,0x1, 0x37,0x1, +0x3f,0x7f,0x37,0x81,0xe0,0x6f,0x3d,0x21,0xe2,0x3, 0xcf,0xf4,0xf0,0x3, 0x13,0x74, +0x2, 0x3, 0xf0,0x40,0x3b,0x6f,0xe0,0x11,0x3d,0xa9,0xf8,0x43,0x38,0x91,0xf2,0x0, +0xc8,0x80,0xf0,0x0, 0x10,0x4, 0x10,0xfc,0xe1,0x32,0x3d,0xa9,0xe1,0x33,0x3d,0x28, +0xe0,0xf, 0x3d,0xa9,0xe0,0xe, 0x89,0x1d,0xf8,0x41,0x39,0x42,0xf8,0x41,0x39,0xc3, +0xe8,0x2f,0x3f,0x90,0xe8,0x31,0x38,0x91,0xf0,0x40,0x3a,0x69,0xf8,0x43,0x3b,0x16, +0xf0,0x0, 0xc9,0x1, 0xf0,0x0, 0xc9,0x81,0xf0,0x40,0x3a,0xe8,0xe0,0x71,0x3a,0x2f, +0xc1,0x7f,0x11,0x80,0x0, 0x90,0xe8,0xa, 0x3d,0x13,0xe2,0x1, 0xc5,0x7f,0xe8,0xe, +0x3d,0x37,0x3f,0xeb,0x3f,0x1b,0x37,0x21,0x3f,0x1c,0x96,0x8e,0xe8,0x40,0x3e,0xf6, +0x4, 0x2a,0x3d,0xef,0xe8,0xe, 0x3d,0x25,0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x0, +0xe8,0xf, 0x3d,0xa4,0xe0,0x43,0x3f,0x9f,0xe0,0x41,0x3f,0x4e,0xe0,0xd, 0x3d,0x28, +0xe0,0x6d,0x3d,0x2e,0xe2,0x0, 0xcf,0x80,0xe0,0xe, 0x3d,0xa9,0xe0,0x41,0x3f,0xcf, +0xe0,0x6e,0x3d,0x2f,0x3e,0xfe,0x1, 0x39,0x2, 0x57,0xe8,0xf, 0x3d,0x92,0xe8,0xe, +0x3d,0x37,0xe2,0x1, 0xc7,0xff,0x3f,0x1f,0x37,0x21,0x3f,0x1c,0x96,0x8e,0xe8,0x40, +0x3e,0xf6,0x3, 0x58,0xf0,0x0, 0x20,0xe5,0xe8,0xe, 0x3d,0x25,0xe0,0x43,0x3f,0x1e, +0xe2,0x0, 0xcf,0x0, 0xe0,0xd, 0x3d,0x28,0xf0,0x2d,0x38,0x2d,0xe0,0x2e,0x3f,0x21, +0xe1,0x2f,0x3d,0x8f,0xe0,0x6d,0x3d,0x2e,0xe0,0x0, 0x27,0xd3,0xe0,0x0, 0x26,0xd1, +0xe0,0x0, 0x2d,0x51,0xe2,0x0, 0xc9,0x0, 0x3f,0x63,0x5, 0x30,0x17,0x81,0x3f,0x9a, +0xe8,0xf, 0x3f,0xb7,0x3f,0x9b,0x37,0xa1,0x3f,0x9c,0x96,0x8f,0x3f,0x7d,0x5, 0x25, +0xc5,0x7f,0xe2,0x1, 0xc5,0x7f,0x0, 0xa5,0x3d,0x78,0xe0,0x0, 0x1, 0x4a,0xf0,0x4, +0x39,0x9a,0xe8,0xd, 0x3a,0x37,0xf0,0xe, 0x3b,0xba,0xf0,0xf, 0x39,0x1b,0x3e,0x9b, +0x3f,0x1f,0x36,0xa1,0x37,0x21,0x3e,0x9c,0x3f,0x1c,0x96,0x8d,0x97,0xe, 0x3e,0xfe, +0x3, 0x6, 0xe2,0x1, 0xc7,0xff,0x3e,0xee,0xe7,0xff,0x0, 0x92,0x3d,0x64,0xe2,0x1, +0xc5,0x7f,0x3f,0xeb,0xe7,0xff,0x0, 0x8c,0x3f,0x6d,0xc5,0x1, 0xe2,0x1, 0xc5,0x7f, +0xe1,0x33,0x3d,0x28,0xe8,0x40,0x3f,0x76,0xf8,0x41,0x39,0xc3,0xf0,0x0, 0xc9,0x81, +0x4, 0xf, 0xe8,0xb, 0x3d,0x92,0xe8,0xf, 0x3d,0x37,0xe2,0x1, 0xc5,0xff,0x3f,0x9b, +0x37,0xa1,0x3f,0x9c,0x97,0x8f,0xe8,0x40,0x3f,0xf6,0xe7,0xfe,0x3, 0x75,0x14,0x0, +0xa, 0x61,0x17,0xff,0x3f,0x9a,0xe8,0xf, 0x3f,0xb7,0x3d,0x72,0x3f,0x9b,0x37,0xa1, +0x3f,0x9c,0x3e,0xe3,0x97,0xf, 0xe7,0xff,0x3, 0x33,0xe7,0xff,0x0, 0xa9,0x14,0x1, +0xa, 0x61,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x2, 0x1f,0xa1,0xe4,0x0, +0xc4,0xa, 0x11,0x7c,0xe0,0xe, 0x3f,0x98,0xe0,0x1, 0x8e,0xe, 0x3b,0xe9,0x39,0x1c, +0xe0,0x43,0x39,0x2, 0xe2,0x0, 0xc9,0x0, 0x3b,0x6a,0x8a,0xfe,0xe0,0x3, 0x4, 0x67, +0x12,0x4, 0x3a,0x1c,0xe0,0x43,0x3a,0x4, 0x3e,0xe4,0xe0,0x1, 0x1f,0x23,0xf0,0xe, +0x8c,0xce,0xf0,0x40,0x3c,0xfd,0xe0,0x2, 0x2, 0x7a,0xe0,0x2, 0x1e,0x85,0x12,0x7f, +0x11,0x77,0xe0,0x1, 0x8e,0xcd,0xe8,0x4, 0x3a,0x19,0xe8,0x2, 0x39,0x19,0xe0,0x43, +0x3a,0x4, 0xe0,0x43,0x39,0x2, 0xe0,0x2, 0x26,0xc9,0xf0,0xe, 0x8e,0x1e,0x11,0x81, +0xe2,0x0, 0xca,0x82,0xe0,0x3, 0x5, 0xac,0x17,0xfd,0xe8,0xf, 0x3f,0x9c,0x3a,0xff, +0xf0,0x0, 0x14,0x1, 0xe0,0x3, 0x4, 0x4f,0xe8,0x40,0x3f,0xe8,0xf0,0x0, 0x10,0x0, +0xe4,0x0, 0xcf,0x81,0xe9,0x30,0x3b,0x0, 0xf0,0x1d,0x38,0x5f,0xf0,0x2, 0x2e,0xe1, +0xe2,0x0, 0xca,0x83,0xe0,0x3, 0x5, 0x9a,0x17,0xfc,0xe8,0xf, 0x3f,0x9c,0x3a,0xff, +0x3d,0x65,0xe0,0x2, 0x3, 0x79,0xe8,0x40,0x3e,0x79,0xe0,0x79,0x3d,0xac,0xe8,0x40, +0x3c,0x69,0xe2,0x1, 0xc4,0x7f,0xf1,0xff,0xc6,0x7f,0x17,0xff,0x3f,0x95,0xe8,0x40, +0x3a,0xfc,0xe2,0x1, 0xc7,0xff,0xf0,0x0, 0x13,0x80,0xe0,0x77,0x39,0x2f,0xe0,0x2, +0x1f,0xbf,0x3a,0x72,0xf0,0x0, 0x8a,0x5f,0xe0,0x3, 0x4, 0x3e,0xf0,0x0, 0x13,0x0, +0xe0,0x1, 0x1f,0xd1,0xe8,0x40,0x3c,0xe6,0xa5,0x8f,0xe8,0xa, 0x3d,0x34,0xf8,0x17, +0x3b,0xb4,0xf0,0x2, 0x19,0x5, 0xe8,0x36,0x3b,0x6, 0x3e,0x69,0x3f,0xe9,0x38,0xe9, +0xf0,0x2, 0x12,0xac,0xf0,0x0, 0x11,0xe4,0xf0,0x0, 0x10,0x93,0x0, 0x98,0xf0,0x0, +0x23,0x36,0xe8,0x1, 0x8f,0x42,0x27,0xb, 0xe0,0xe, 0x37,0xa1,0x38,0xfe,0x2, 0x7, +0xe8,0x2d,0x3e,0x93,0x26,0xb1,0xf0,0x2e,0x38,0xaf,0x27,0x2e,0xc1,0x1, 0xe0,0x43, +0x39,0x2, 0x3a,0x72,0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0x4, 0x35,0xe0,0xd, 0x39,0x1a, +0x36,0xa1,0x3e,0x9b,0xf0,0x0, 0x9c,0x8d,0xe8,0xd, 0x39,0x17,0x36,0xa1,0x17,0x44, +0x3e,0x9b,0xe8,0xe, 0x3f,0x19,0xf0,0x0, 0x95,0xd, 0xe3,0xff,0xc7,0x7f,0xe0,0x43, +0x3e,0x9e,0xc7,0xc4,0xe8,0xf, 0x3f,0x9a,0x3f,0x11,0xe8,0x3a,0x3e,0x95,0xe0,0x43, +0x38,0x9e,0xe0,0x43,0x3f,0x9f,0xf7,0xff,0x2d,0x4c,0xe2,0x1, 0xce,0x8c,0x2, 0x4d, +0xe8,0x2d,0x3e,0x93,0x2e,0xd1,0xf1,0xff,0xc4,0x87,0x17,0x1, 0x3f,0x19,0xf2,0x0, +0xcc,0xce,0xc1,0x1, 0xe2,0x1, 0xc7,0x7f,0xe0,0x43,0x39,0x2, 0xe0,0x69,0x3d,0xae, +0x3a,0x72,0x3, 0x4d,0xe2,0x0, 0xcf,0x80,0xe0,0x4, 0x30,0x81,0x39,0x6c,0x3f,0x6f, +0xe0,0x2, 0x4, 0x4f,0xe0,0x43,0x3f,0x1e,0xe0,0xf, 0x30,0x82,0xe0,0x2f,0x3f,0x9e, +0xf0,0x16,0x3b,0x5f,0xea,0x11,0x7f,0xec,0x3d,0x18,0x35,0x21,0x3f,0x97,0x3d,0x1b, +0x8e,0x8f,0x95,0xa, 0x36,0xa2,0x3e,0xfa,0x3, 0xc, 0xe2,0x7, 0xcd,0x7f,0xe0,0x2, +0x5, 0x27,0x16,0xff,0xae,0x8f,0xea,0x11,0x7f,0xf8,0x3f,0x97,0x3c,0x9c,0xac,0x8f, +0xe2,0x0, 0xce,0x5, 0x5, 0x8c,0xe2,0x0, 0xce,0x6, 0xe0,0x2, 0x1, 0x41,0xe2,0x0, +0xce,0x7, 0xe0,0x2, 0x1, 0x38,0xc1,0x83,0xe2,0x1, 0xc1,0xff,0xf0,0x0, 0x23,0xc, +0xe0,0xd, 0x38,0x9e,0x17,0x81,0x3f,0x93,0xe2,0x12,0xce,0xe1,0xe2,0x1, 0xc7,0xff, +0xe0,0x63,0x3b,0x2f,0x3a,0x7e,0x5, 0xa, 0x3f,0x11,0x17,0x81,0x3f,0x93,0xe2,0x2e, +0xcf,0x71,0xe2,0x1, 0xc7,0xff,0xe0,0x63,0x3b,0x2f,0xc3,0x3, 0x17,0x81,0x3f,0x93, +0x3b,0x72,0xe2,0x1, 0xc7,0xff,0xe0,0x63,0x3c,0x2f,0xe2,0x0, 0xce,0x0, 0x17,0x80, +0xe0,0x6f,0x39,0xa3,0x39,0xef,0xf0,0x0, 0x24,0x2f,0xe0,0x1, 0x22,0xe6,0x17,0xfb, +0x3f,0x95,0xe0,0x43,0x3d,0x5, 0xe0,0x43,0x3a,0x8f,0x3d,0x75,0x5, 0x24,0x17,0x0, +0xe8,0xf, 0x3a,0xb4,0x16,0x81,0x3f,0x98,0x37,0xa1,0x3f,0x9b,0x97,0x8f,0x3e,0x9e, +0xe2,0x4, 0xcf,0xd9,0xc2,0x81,0x3f,0xed,0xe2,0x1, 0xc7,0xff,0xe0,0x43,0x3a,0x85, +0xe0,0x6e,0x3b,0x2f,0x3d,0x75,0x2, 0x6d,0x17,0x82,0xe1,0x2e,0x3f,0x1f,0x27,0xb, +0xe1,0x2c,0x3e,0x1f,0x17,0x81,0x3f,0x93,0xe2,0x0, 0xce,0x0, 0xe2,0x1, 0xc7,0xff, +0xe0,0x63,0x39,0xaf,0xea,0x12,0x7f,0x84,0xe0,0xe, 0x3f,0x97,0xf0,0x0, 0x28,0x2f, +0x8e,0x8e,0x3e,0xf3,0x4, 0xab,0x29,0xac,0x3b,0x9f,0x8f,0x87,0x11,0x83,0xe1,0x23, +0x3f,0x93,0xe2,0x0, 0xcf,0x85,0x17,0x82,0xe0,0x6f,0x3c,0xa3,0x39,0xef,0x3c,0x63, +0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x3f,0x98,0x9d,0x9f,0xf0,0xd, 0x34,0xa6, +0xe1,0xff,0xc6,0xb1,0x3e,0xfb,0x9f,0x8f,0xf0,0xe, 0x8e,0x1e,0xe0,0x1, 0x2, 0x1c, +0xe2,0x0, 0xcf,0xaf,0x5, 0x88,0xf0,0xe, 0x36,0x26,0xc7,0x51,0x3f,0x7f,0x11,0x81, +0xe7,0xfd,0x2, 0x28,0x11,0x83,0xe7,0xfd,0x0, 0xa5,0xa9,0x8e,0x21,0xd6,0xe2,0x0, +0xc9,0x81,0x1, 0xde,0x3f,0x97,0x8f,0x8f,0x0, 0xd5,0xe2,0x0, 0xca,0x82,0xe0,0x0, +0x2, 0xe7,0xf0,0x0, 0x10,0x0, 0x17,0x81,0xe9,0x30,0x3b,0x0, 0xf0,0x1d,0x38,0x5f, +0xf0,0xe, 0x8e,0x1e,0xf0,0x0, 0x14,0x0, 0x39,0xef,0xf7,0xfd,0x26,0xa3,0xfa,0x11, +0x7d,0x60,0xfa,0x10,0x7d,0x98,0xf0,0x0, 0x17,0xa, 0xf8,0x1e,0x3f,0x1a,0x0, 0x87, +0xf8,0x40,0x3f,0x7a,0xf0,0x0, 0xc5,0x8a,0xe0,0x0, 0x1, 0x5b,0xe9,0x80,0x8f,0x9a, +0xe2,0x0, 0xcf,0x82,0x1, 0xf6,0xe8,0x1, 0x8d,0x8b,0xe8,0x0, 0x8d,0x7b,0x3c,0xec, +0x3c,0x65,0x7e,0x1, 0xdd,0x40,0x66,0x1, 0x24,0x6c,0xf8,0x40,0x38,0x6d,0x11,0x83, +0xe7,0xfd,0x0, 0x80,0xe8,0x40,0x3e,0x79,0x12,0xff,0xe8,0x5, 0x3a,0x9c,0xe0,0x79, +0x3d,0xac,0xe2,0x1, 0xc2,0xff,0xe8,0x40,0x3c,0x69,0x3d,0x65,0xe2,0x1, 0xc4,0x7f, +0xf0,0x0, 0x13,0x81,0xe7,0xfd,0x22,0x8d,0xe7,0xfc,0x0, 0xff,0xf0,0x0, 0x10,0x0, +0xe9,0x30,0x3b,0x0, 0xf0,0x0, 0x14,0x1, 0xf2,0x0, 0xce,0x4, 0x5, 0x64,0xe8,0x40, +0x3e,0x79,0x15,0x0, 0xe0,0x79,0x3d,0xac,0xe8,0x40,0x3c,0x69,0xe2,0x1, 0xc4,0x7f, +0x3a,0xea,0xf0,0x0, 0x13,0x81,0xe7,0xfc,0x0, 0xf4,0xe0,0x2, 0x1f,0x5, 0x16,0x88, +0xe0,0x1, 0x87,0x4e,0x3a,0x6d,0x11,0x0, 0xe7,0xfc,0x0, 0x99,0xf0,0xe, 0x8e,0x1e, +0x17,0xfd,0xe8,0xf, 0x3f,0x9c,0x3a,0xff,0xf0,0x0, 0x14,0x0, 0x11,0x81,0xe7,0xfc, +0x3, 0x35,0x11,0x80,0x3c,0x63,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf8,0x40, +0x38,0x6d,0xe7,0xfc,0x0, 0xb7,0x15,0x5, 0xe7,0xfe,0x0, 0xa3,0x35,0x2, 0xad,0xf, +0xe7,0xfd,0x0, 0xdb,0xe2,0x0, 0xcf,0xb6,0x5, 0x88,0xf0,0xe, 0x36,0x26,0xc7,0x51, +0x3f,0x7f,0x11,0x81,0xe7,0xfc,0x2, 0xe, 0x11,0x82,0xe7,0xfc,0x0, 0x8b,0x17,0x0, +0xe7,0xfd,0x0, 0xb2,0xe0,0x1, 0x1f,0xd1,0x17,0x0, 0xa5,0x8f,0xe8,0xa, 0x3d,0x34, +0xf0,0x40,0x3b,0x6e,0x39,0x6e,0x3a,0x6e,0x3c,0xee,0x3e,0x6e,0x38,0xee,0xe7,0xfd, +0x0, 0xab,0xc1,0x82,0xe2,0x1, 0xc1,0xff,0xe7,0xfd,0x0, 0xca,0xc1,0x81,0xe2,0x1, +0xc1,0xff,0xe7,0xfd,0x0, 0xc5,0xe7,0xf9,0x0, 0xbf,0x15,0x1, 0xe7,0xfb,0x0, 0xb3, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x48,0xe0,0x2, 0x1e,0xa0,0xe0,0x0, 0x1b,0x2a, +0x17,0x0, 0x8f,0x8d,0xaf,0x6, 0x2f,0x98,0xea,0xf, 0x7f,0xfa,0x8f,0xf, 0xe0,0x6, +0x2f,0x44,0xfa,0x10,0x7c,0xfc,0xe0,0x2, 0x1a,0x21,0xfa,0x10,0x7d,0x18,0xfa,0x11, +0x7e,0xf8,0xfa,0x11,0x7e,0x6c,0xea,0x11,0x7b,0xe0,0xfa,0x10,0x7c,0xc, 0xfa,0x12, +0x7d,0x84,0xe0,0x1, 0x0, 0xda,0xe0,0x2, 0x1a,0x21,0xfa,0x11,0x7e,0x6c,0xea,0x11, +0x7b,0xe0,0xea,0x10,0x7f,0x80,0x11,0x80,0xea,0xf, 0x7f,0x78,0xfa,0x10,0x7c,0xfc, +0xfa,0x10,0x7d,0x18,0xfa,0x11,0x7e,0xf8,0xfa,0x10,0x7c,0xc, 0xfa,0x12,0x7d,0x84, +0xf0,0x40,0x3f,0x67,0x12,0x8c,0x3b,0xe4,0x7f,0x8d,0x3a,0x63,0xf0,0x0, 0x7e,0xe, +0x0, 0x91,0xe2,0x0, 0xc9,0x82,0xe0,0x3, 0x1, 0x6f,0xc2,0x1, 0xe2,0x1, 0xc2,0x7f, +0xc2,0xff,0xe2,0x1, 0xc2,0xff,0xe0,0x1, 0x22,0xab,0x8f,0x8d,0x3f,0xf4,0xe0,0x1, +0x5, 0xa7,0xf0,0x0, 0x16,0xa, 0xf0,0x1c,0x3e,0x34,0x8e,0xe, 0xe8,0xf, 0x3b,0x9c, +0x81,0x4f,0xe2,0x0, 0xc1,0xf, 0xe0,0x6, 0x31,0x23,0xe0,0xf, 0x3b,0x96,0xe0,0x2, +0xc7,0xac,0x89,0x8f,0x26,0x3, 0xc6,0x7f,0xae,0xe, 0xe2,0x0, 0xc9,0x9, 0x2, 0xde, +0x29,0xd9,0xe8,0xf, 0x3b,0x9c,0xf0,0x0, 0x91,0x8f,0xf0,0x0, 0x92,0x1f,0xf0,0x0, +0x92,0xaf,0x90,0xbf,0x95,0xcf,0x17,0x8a,0x3f,0xb2,0xf0,0x0, 0x60,0xd, 0xf0,0x0, +0x61,0xe, 0xf0,0xc, 0x3c,0x9f,0xf0,0x10,0x38,0x12,0xe8,0xf, 0x3f,0x9a,0xf0,0x11, +0x3e,0x92,0xf0,0x12,0x39,0x12,0xf0,0x0, 0xb1,0x8f,0x15,0x1, 0xf0,0x0, 0xb2,0x1f, +0x3c,0xe2,0xf0,0x0, 0xb2,0xaf,0x3c,0x64,0xb0,0xbf,0xb5,0xcf,0xf0,0x0, 0xb1,0x8c, +0xf0,0x0, 0xb2,0x1c,0xf0,0x0, 0xb2,0xac,0xb0,0xbc,0xb5,0xcc,0xe8,0x0, 0xa9,0x80, +0xe8,0x0, 0xa9,0x81,0xe8,0x0, 0xa9,0x82,0x7e,0x81,0x7f,0x2, 0x7f,0x83,0xdd,0x12, +0x66,0x81,0x67,0x2, 0x67,0x83,0x2c,0x11,0x9f,0x8f,0xf0,0xc, 0x3f,0x12,0xe2,0x0, +0xcf,0xa5,0xa9,0x8c,0x5, 0x8a,0xe0,0x1, 0x1c,0xa3,0xe0,0xe, 0x8e,0x19,0x36,0x26, +0xc6,0x5b,0x3e,0x7f,0xe0,0x5, 0x2, 0x53,0x85,0x8d,0xf0,0xf, 0x3f,0x12,0x16,0x2, +0xc5,0xff,0xae,0xf, 0xe2,0x1, 0xc5,0xff,0x16,0xa, 0x3e,0x3b,0xe0,0x0, 0x1c,0xaa, +0x3e,0x17,0xf0,0x0, 0x92,0x2c,0xf0,0x0, 0x91,0xc, 0xf0,0x0, 0x91,0x9c,0xf0,0x0, +0x92,0xbc,0x91,0xcc,0xe8,0x16,0x3b,0x9c,0x85,0x9, 0xf0,0x0, 0x63,0x8d,0x14,0x80, +0xe0,0xf, 0x3b,0x96,0xf0,0x1, 0x3c,0x12,0xf0,0x8, 0x3d,0x92,0xf8,0x0, 0xb1,0x6, +0xe8,0x2, 0x39,0x17,0xf8,0x0, 0xb1,0x96,0xe0,0x2, 0xc7,0xac,0xf8,0x0, 0xb2,0x26, +0xc5,0x1, 0xf8,0x0, 0xb2,0xb6,0xc2,0xff,0xe8,0x0, 0xb1,0xc6,0xe2,0x1, 0xc2,0xff, +0xad,0x8d,0x15,0xff,0xe0,0x0, 0x1b,0x2a,0xac,0x81,0xac,0x88,0x14,0x8f,0xad,0xcc, +0x16,0x3, 0xac,0x82,0xae,0xf, 0xad,0x6, 0xe7,0xfe,0x2a,0xd9,0xf0,0x0, 0x66,0xe, +0x3a,0x67,0xe8,0x40,0x3b,0xee,0x12,0x80,0xea,0xf, 0x7f,0x7b,0xf0,0x2, 0x1f,0x1b, +0xf0,0x2, 0x1b,0x1a,0xf0,0x2, 0x19,0x3f,0xf0,0x1, 0x19,0xd1,0xf0,0x1, 0x18,0x2d, +0xf0,0x1, 0x1a,0xa3,0x11,0x9, 0x3e,0x65,0xf0,0x0, 0x12,0x64,0xe0,0x40,0x3f,0xe5, +0xf0,0x0, 0x13,0x87,0xf0,0x0, 0x10,0xd0,0xe0,0xb, 0x31,0x23,0x3d,0x94,0xe0,0x2, +0xc5,0xac,0x8d,0x8b,0x39,0xe2,0xe2,0x0, 0xcd,0x83,0x1, 0x19,0x21,0x3f,0x14,0x7f, +0x3c,0x12,0xe2,0x1, 0xc4,0x7f,0xe0,0xb, 0x34,0x23,0xe0,0x2, 0xc5,0xac,0x3d,0x94, +0x15,0x0, 0x0, 0x83,0xc5,0xf8,0x21,0x32,0x8c,0x8b,0xc1,0x7f,0xe2,0x0, 0xcc,0x83, +0xe0,0x3, 0x3c,0x2a,0xe2,0x1, 0xc1,0x7f,0xc5,0x1, 0x1, 0xf5,0xe8,0x0, 0x8b,0xe, +0xe2,0x0, 0xcb,0x1, 0x1, 0x29,0xc2,0x81,0xe2,0x1, 0xc2,0xff,0xe2,0x0, 0xca,0x8a, +0xf0,0x0, 0xc5,0x81,0xf0,0x0, 0xc4,0x8a,0xf0,0x0, 0xc4,0x1, 0xf0,0x0, 0xc5,0xa, +0xc3,0x81,0xf0,0x0, 0xc7,0x8, 0xf0,0x0, 0xc6,0x81,0xf0,0x0, 0xc6,0x1, 0x1, 0xc5, +0xe0,0x0, 0x1e,0x2a,0x8f,0x8c,0xe0,0x4, 0x27,0x94,0x8e,0x8e,0x3e,0xff,0x3, 0x82, +0xaf,0x8e,0xc0,0x38,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe8,0x0, 0x8b,0xe, 0x39,0xec, +0xe2,0x0, 0xcb,0x1, 0x1, 0xd9,0x8d,0x87,0xe2,0x0, 0xcd,0x82,0x1, 0xd5,0xe8,0x0, +0x8d,0x86,0xab,0x7, 0x2d,0xd1,0x8d,0x8e,0xe2,0x0, 0xcd,0x81,0xe0,0x0, 0x5, 0xc4, +0xe8,0x0, 0x9c,0x19,0x7e,0x81,0x7f,0x2, 0x7f,0x83,0xf0,0x0, 0x78,0x8, 0xf0,0x0, +0x78,0x86,0xf0,0x0, 0x79,0xb, 0xf0,0x0, 0x79,0x8a,0xf0,0x0, 0x7a,0x9, 0xf0,0x0, +0x7a,0x84,0xf0,0x0, 0x7b,0xc, 0xf0,0x0, 0x7b,0x87,0x7e,0x5, 0xe0,0x5, 0xd3,0xda, +0x66,0x5, 0xe0,0x3, 0x1d,0x12,0x3d,0xec,0xe0,0x5, 0xd3,0x92,0xe2,0x0, 0xcc,0x0, +0x66,0x5, 0x66,0x81,0x67,0x2, 0x67,0x83,0xf0,0x0, 0x60,0x8, 0xf0,0x0, 0x60,0x86, +0xf0,0x0, 0x61,0xb, 0xf0,0x0, 0x61,0x8a,0xf0,0x0, 0x62,0x9, 0xf0,0x0, 0x62,0x84, +0xf0,0x0, 0x63,0xc, 0xf0,0x0, 0x63,0x87,0x5, 0xe, 0xe8,0x0, 0x9d,0x9, 0xe2,0x0, +0xcd,0x25,0xe7,0xff,0x5, 0x92,0xe8,0xe, 0x8d,0x95,0x35,0xa6,0xc5,0xda,0x3d,0x7b, +0xe7,0xff,0x2, 0xb, 0xe8,0x0, 0x8d,0x52,0xe8,0x0, 0x8d,0xfa,0xe8,0x1, 0x8c,0x8a, +0x3d,0xba,0xe8,0x0, 0xa5,0x3, 0x3d,0x99,0x35,0xa1,0x3d,0x1b,0xea,0xf, 0x7d,0xfa, +0x94,0x8a,0x8d,0xb, 0xe8,0x2b,0x3c,0x94,0xe1,0x2a,0x3d,0xc, 0x25,0x83,0xe7,0xfe, +0x2d,0x74,0xe8,0x0, 0x8d,0x8c,0xe2,0x1, 0xcd,0x9f,0xe0,0x3, 0x5, 0xa5,0xe8,0x0, +0x8d,0x88,0xc5,0xff,0xe2,0x1, 0xc5,0xff,0xe2,0x0, 0xcd,0x97,0xe7,0xfe,0x2, 0xe5, +0xe8,0x0, 0x95,0x90,0x3d,0xf9,0xe7,0xfe,0x5, 0x60,0x8d,0xd, 0xe0,0x5, 0x25,0x2f, +0xe0,0x2, 0x1b,0x5, 0xe0,0x1, 0x8d,0xc6,0x2d,0x95,0xe8,0x0, 0x9c,0x89,0xe2,0x0, +0xcc,0xbf,0x5, 0x87,0xe8,0xe, 0x8d,0x95,0xc5,0xff,0x35,0xa6,0x3c,0xfb,0x5, 0xa, +0xe8,0xe, 0x8d,0xc5,0xe8,0x0, 0x9c,0x99,0xc5,0xff,0x35,0xa6,0x3c,0xfb,0xe7,0xfe, +0x2, 0x44,0xe8,0x0, 0x8d,0x8b,0xe2,0x0, 0xcd,0x83,0xe7,0xfe,0x2, 0xbe,0xe2,0x0, +0xcd,0x9, 0xe7,0xfe,0x2, 0xba,0x15,0x8a,0x3d,0xba,0x13,0x1, 0x3b,0x1a,0xe8,0x0, +0x95,0x29,0x3d,0x94,0xe0,0x9, 0x31,0xa3,0x3c,0x94,0xb5,0x2b,0xe0,0x2, 0x15,0x2c, +0x3d,0x19,0xe0,0x2, 0xc4,0xad,0xe2,0x1, 0xc3,0x7f,0xe8,0x0, 0x90,0x89,0xe8,0x0, +0x94,0x19,0xe8,0x0, 0x91,0xb9,0xaf,0x89,0xe2,0x0, 0xcb,0xa, 0xe8,0x0, 0x94,0xc9, +0xaf,0x8a,0xb0,0x8b,0xb4,0x1b,0xb1,0xbb,0xb4,0xcb,0xa9,0x4b,0xab,0xd, 0xe0,0x5, +0x1, 0x8e,0xe8,0x0, 0xaf,0x88,0xe7,0xfe,0x21,0x25,0xc1,0x7f,0xe2,0x1, 0xc1,0x7f, +0xe7,0xfe,0x0, 0x8b,0xf0,0xf, 0x3f,0x12,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x1, 0x2e, +0x11,0x8a,0x39,0xb2,0xe8,0xf, 0x3b,0x9c,0xf0,0xc, 0x3d,0x13,0x9c,0x9f,0x9c,0xf, +0x9d,0x9c,0x9d,0xc, 0x7e,0x81,0x7f,0x2, 0xef,0xff,0xd5,0x36,0xe2,0x0, 0xcc,0x3c, +0xea,0xf, 0x7f,0xfa,0x66,0x81,0x67,0x2, 0xe0,0x3, 0x5, 0x9b,0x16,0xf, 0xae,0xf, +0xe8,0x16,0x3b,0x9c,0xe8,0x0, 0x94,0x86,0xe8,0x0, 0x95,0x16,0xe8,0x0, 0x95,0xa6, +0xe8,0x0, 0x96,0x36,0xe8,0x0, 0x97,0xc6,0xe8,0x3, 0x39,0x9a,0xb4,0x83,0xb5,0x13, +0xb5,0xa3,0xb6,0x33,0xb7,0xc3,0xe7,0xfb,0x0, 0xe2,0x11,0x8a,0xf0,0xb, 0x3c,0x12, +0xe8,0xf, 0x3b,0x9c,0x39,0xb2,0x8e,0xb, 0xf0,0x0, 0x92,0x8f,0x90,0x9f,0x94,0x2f, +0x94,0xbf,0x95,0x4f,0xe2,0x1, 0xce,0x7f,0xf0,0xf, 0x3d,0x13,0xf0,0x0, 0xb2,0x8f, +0xb0,0x9f,0xb4,0x2f,0xb4,0xbf,0xb5,0x4f,0x1, 0x3, 0xc6,0x1, 0xae,0xb, 0x15,0x0, +0x3c,0xe2,0x3c,0x64,0x7e,0x81,0x7f,0x2, 0xdb,0x2d,0xe0,0x1, 0x1d,0x23,0xf0,0xc, +0x3c,0x93,0xe0,0xe, 0x8f,0xca,0x96,0x1c,0x37,0xa6,0x3f,0xac,0xe0,0x43,0x3f,0x9f, +0xe2,0x1, 0xcf,0x94,0x16,0x30,0x66,0x81,0x67,0x2, 0x2, 0xe, 0xe0,0x2, 0x1e,0x5, +0xe0,0x1, 0x8d,0xcc,0x16,0x30,0x25,0x88,0xe0,0x1, 0x16,0x14,0x3e,0x2f,0xe4,0x0, +0xc6,0xf, 0x36,0x6, 0xc6,0x30,0xf0,0x2, 0x1b,0xbf,0xf0,0xa, 0x3c,0x93,0xe8,0x0, +0x8c,0xd7,0x8f,0xfa,0xe0,0x1, 0x8d,0x8a,0x3f,0xb9,0xe0,0x1, 0x1c,0xd1,0x3f,0x9b, +0xa5,0x89,0x37,0xa1,0x3f,0x9b,0x97,0x8f,0xe2,0x0, 0xcf,0xbb,0xe0,0x1, 0x5, 0x39, +0x17,0xff,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xe0,0x3, 0x2, 0xc2, +0x9d,0x8a,0x3f,0xec,0xe2,0x1, 0xc7,0xff,0x3d,0xff,0xe0,0x3, 0x4, 0xc5,0xe0,0x1, +0x1d,0x23,0xe2,0x1, 0xc6,0x7f,0xe0,0xe, 0x8f,0x9a,0x37,0xa6,0xe0,0xc, 0x3f,0xac, +0x3d,0xfc,0x17,0x81,0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0xea,0xf, 0x7f,0xfa,0x8f,0x8f, +0xf0,0xc, 0x3d,0x13,0x9e,0xc, 0xe0,0x3, 0x27,0xab,0x17,0xae,0x3d,0xef,0x3e,0x7f, +0xe0,0x2, 0x4, 0x8e,0xf0,0x1, 0x1b,0xa3,0xe8,0xe, 0x8f,0x97,0x37,0xa6,0x3f,0xab, +0x3e,0x7f,0xe0,0x2, 0x2, 0x5, 0xe0,0x2, 0x2c,0x4, 0x67,0x8d,0x3f,0x92,0x8f,0x8f, +0xe2,0x0, 0xcf,0x8f,0xe0,0x1, 0x2, 0xc7,0x14,0x0, 0xe0,0x2, 0x1c,0x85,0xe0,0x1, +0x8f,0xc9,0xe0,0x1, 0x27,0x9d,0xf0,0xf, 0x3d,0x13,0x9e,0xf, 0xe2,0x0, 0xce,0x2f, +0xe0,0x1, 0x2, 0x8d,0x17,0x80,0xe0,0x1, 0x24,0x36,0x66,0xd, 0x3e,0x12,0x8e,0xc, +0xe0,0x1, 0x26,0x35,0xf0,0xb, 0x3d,0x13,0xf0,0x0, 0x9a,0x9b,0xf0,0xb, 0x3d,0x92, +0x8d,0x8b,0xe2,0x0, 0xcd,0x82,0xe0,0x2, 0x5, 0xc0,0xe0,0x1, 0x1d,0x23,0xf0,0x0, +0x63,0x8d,0xe0,0xe, 0x8d,0xaa,0xe0,0xf, 0x3e,0x2f,0xe0,0xc, 0x35,0xa5,0xe8,0x2, +0x39,0x17,0xe8,0x40,0x3e,0x75,0xaf,0x82,0x3, 0x5, 0xea,0xf, 0x7f,0xf9,0x16,0x1, +0xae,0xf, 0x17,0x8a,0x86,0xd, 0xe0,0x0, 0x1c,0xaa,0xc6,0x7f,0xe2,0x1, 0xc6,0x7f, +0x3f,0xbc,0x85,0x89,0x3f,0x97,0x90,0xaf,0x91,0x8f,0x91,0x1f,0x94,0x3f,0x94,0xcf, +0xe8,0x16,0x3b,0x9c,0xe0,0xa, 0x3b,0x96,0xe8,0x0, 0xb1,0x86,0xe0,0x2, 0xc5,0x2c, +0xe8,0x0, 0xb1,0x16,0xc5,0x81,0xe8,0x0, 0xb0,0xa6,0xe8,0x0, 0xb4,0x36,0xe8,0x0, +0xb4,0xc6,0xae,0xd, 0x16,0x7f,0xae,0x4f,0x17,0x83,0xaf,0x8a,0xe0,0x0, 0x1d,0x2a, +0xad,0x8a,0xe7,0xf9,0x0, 0xf7,0xc7,0x7f,0xfa,0x10,0x7c,0xfc,0xfa,0x10,0x7d,0x18, +0xfa,0x11,0x7e,0xf8,0xfa,0x11,0x7e,0x6c,0xea,0x11,0x7b,0xe0,0xfa,0x10,0x7c,0xc, +0xfa,0x12,0x7d,0x84,0xaf,0xf, 0xe0,0x2, 0x1a,0x21,0xe7,0xf9,0x0, 0xbc,0xea,0xf, +0x7e,0xf9,0xaf,0x8d,0xaf,0x8e,0xc0,0x38,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x14,0x0, +0xe7,0xfe,0x0, 0xe5,0xe8,0x0, 0x8d,0x8d,0xe2,0x0, 0xcd,0x85,0xe8,0x0, 0x8d,0x88, +0xe7,0xfc,0x5, 0xd9,0xe9,0x28,0x3d,0x97,0x3d,0x48,0xe7,0xfb,0x2d,0x3e,0xe8,0x2a, +0x3c,0x91,0xe7,0xfc,0x25,0x50,0xe7,0xfb,0x0, 0xb8,0xf0,0xf, 0x3c,0x12,0xe8,0x2, +0x39,0x1b,0xa9,0x8f,0xa9,0x82,0xe7,0xf9,0x0, 0xba,0xe0,0x1, 0x1d,0x23,0xe0,0xe, +0x8f,0x9a,0x37,0xa6,0xc7,0xd0,0x3e,0x7f,0xe7,0xfe,0x2, 0x6e,0xf0,0xf, 0x3d,0x92, +0x8e,0xf, 0xe2,0x0, 0xce,0x4, 0xe7,0xfe,0x2, 0xe7,0xf0,0xf, 0x3c,0x12,0x8f,0x8f, +0xe2,0x0, 0xcf,0x8e,0xe0,0x2, 0x2, 0xa4,0xf0,0xf, 0x3d,0x13,0x9d,0x8f,0xe2,0x0, +0xcd,0xbf,0xe0,0x2, 0x5, 0x9d,0xf0,0x1, 0x1b,0xa3,0xe8,0xe, 0x8f,0x97,0x37,0xa6, +0xc7,0xc0,0x3d,0xff,0xe0,0x2, 0x2, 0x14,0x67,0x8d,0x16,0x0, 0x3f,0x92,0xae,0xf, +0x2c,0x5, 0x67,0x8d,0x16,0x0, 0x3f,0x92,0xae,0xf, 0xe8,0x3, 0x39,0x99,0x3b,0x17, +0xe0,0x2, 0x16,0x2c,0xf0,0x2, 0x1b,0xd7,0x90,0x83,0x17,0x80,0x94,0x13,0x94,0xa3, +0x95,0x33,0x95,0xc3,0x3e,0x16,0xe0,0x2, 0xc3,0x2d,0xe8,0x16,0x3b,0x9c,0xf0,0x3, +0x3f,0x12,0xf0,0x0, 0x12,0x83,0xe8,0x2, 0x39,0x17,0xaf,0x8c,0xaf,0x86,0x17,0x88, +0xf0,0x0, 0xaa,0x83,0xe8,0x0, 0xb0,0x86,0xe8,0x0, 0xb4,0x16,0xe8,0x0, 0xb4,0xa6, +0xe8,0x0, 0xb5,0x36,0xe8,0x0, 0xb5,0xc6,0xaf,0x82,0xe7,0xf8,0x0, 0xe0,0x8e,0xf, +0xe7,0xfc,0x26,0x68,0xc6,0x7f,0xae,0xf, 0xe7,0xfc,0x0, 0xe4,0x14,0x3, 0xf0,0xf, +0x3c,0x93,0x9e,0xf, 0xe2,0x0, 0xce,0x7f,0x2, 0x8c,0xe8,0xf, 0x3b,0x9c,0xf0,0xb, +0x3d,0x13,0x97,0x8f,0x95,0x8b,0x3f,0xab,0xe2,0x0, 0xcf,0xc0,0xe7,0xfd,0x2, 0x6f, +0xf0,0x1, 0x1b,0xa3,0xe8,0xe, 0x8f,0x97,0xc7,0xfe,0x37,0xa6,0x3e,0x7f,0x5, 0xc, +0xf0,0xf, 0x3d,0x13,0xe8,0xc, 0x3b,0x9c,0x97,0x8f,0x96,0xc, 0x3f,0xac,0xe2,0x0, +0xcf,0xc0,0xe7,0xfd,0x2, 0x5c,0x67,0x8d,0x3f,0x92,0x8e,0xf, 0x17,0x8f,0xe1,0x2f, +0x3f,0xac,0x27,0x86,0x17,0x82,0xe1,0x2f,0x3f,0xa8,0xe7,0xfd,0x2f,0xd8,0xe0,0x2, +0x1c,0x85,0xe0,0x1, 0x8d,0xc9,0xe0,0x0, 0x2d,0xd1,0xea,0xf, 0x7f,0xf9,0x8f,0x8f, +0xe1,0x2f,0x3f,0x8b,0xe0,0x0, 0x27,0xca,0x17,0x84,0xe1,0x28,0x3f,0xa8,0xe0,0x0, +0x24,0x45,0xf0,0xf, 0x3d,0x13,0xf0,0x0, 0x9a,0x9f,0x7e,0x5, 0xe8,0x40,0x3c,0x65, +0x7e,0x81,0x7f,0x2, 0xf0,0x0, 0x7a,0x84,0x7d,0x8c,0xe0,0x5, 0xd1,0x23,0xe0,0x3, +0x1d,0x12,0x65,0x8c,0xe0,0x5, 0xd0,0xfd,0xe2,0x0, 0xcc,0x0, 0x66,0x5, 0x66,0x81, +0x67,0x2, 0xf0,0x0, 0x62,0x84,0x3, 0x2d,0xf0,0xf, 0x3d,0x92,0x15,0x82,0xad,0x8f, +0x17,0x81,0xe7,0xfe,0x26,0x6c,0xe0,0x0, 0x1d,0xb, 0x8d,0x8a,0xe2,0x0, 0xcd,0x81, +0xe7,0xfd,0x2, 0xbd,0xf0,0x2, 0x1b,0x85,0xe8,0x1, 0x8d,0xc7,0xe0,0x0, 0x25,0xef, +0xe8,0x3, 0x39,0x9a,0x9d,0x3, 0xe2,0x0, 0xcd,0x2f,0xe7,0xfd,0x5, 0xb0,0xe0,0x1, +0x1c,0xa3,0xe0,0xe, 0x8d,0x99,0x35,0xa6,0xc5,0xd0,0x3d,0x7b,0x15,0x81,0xe0,0x6b, +0x3a,0x2f,0x3f,0xeb,0xe7,0xfd,0x0, 0xa3,0xf0,0xf, 0x3d,0x13,0xf0,0x0, 0x9a,0x9f, +0x67,0x8d,0x16,0xf, 0x3f,0x92,0xae,0xf, 0x17,0x80,0x16,0xf, 0xe7,0xfd,0x0, 0x90, +0xe2,0x0, 0xcc,0x2, 0xe7,0xfe,0x2, 0xed,0xe7,0xfc,0x0, 0xd1,0x17,0xa6,0x3d,0xef, +0xe7,0xfc,0x0, 0xd7,0x14,0x1, 0xe7,0xfc,0x0, 0xca,0xe8,0x0, 0x8d,0x8b,0xe2,0x0, +0xcd,0x83,0xe7,0xf9,0x2, 0xaa,0xe0,0xb, 0x31,0xa3,0x3d,0x94,0xe0,0x2, 0x10,0xac, +0x38,0x9b,0xe8,0x0, 0x94,0xa9,0xe0,0x2, 0xc5,0xad,0xad,0xb, 0xe8,0x0, 0x94,0x9, +0xe8,0x0, 0x91,0xb9,0xad,0x1, 0xe8,0x0, 0x95,0xc9,0xe8,0x0, 0x95,0x19,0xb4,0xa4, +0x14,0x81,0xb4,0x4, 0xb5,0x14,0xb1,0xb4,0xb5,0xc4,0xa9,0x44,0xac,0x8d,0x0, 0x86, +0x2d,0x92,0xe2,0x0, 0xcb,0xa, 0xe7,0xfa,0x1, 0x76,0x15,0xa, 0x3d,0x36,0xc3,0x1, +0xe0,0xb, 0x3a,0x1a,0x8d,0xcb,0xe2,0x1, 0xc3,0x7f,0xe0,0x29,0x39,0xb, 0xe0,0x2b, +0x3d,0x85,0x24,0xef,0x3d,0x14,0x15,0xff,0xad,0xca,0x0, 0xec,0x17,0x83,0xe1,0x2f, +0x3f,0xac,0xe7,0xfc,0x2c,0x3c,0xe7,0xfd,0x0, 0xee,0x17,0x81,0xe7,0xfc,0x0, 0xc7, +0xe0,0x0, 0x1f,0x8b,0x14,0x0, 0xf0,0x0, 0x8b,0x8f,0xf2,0x0, 0xcb,0x84,0xe0,0x0, +0x2, 0xee,0xe0,0x1, 0x1f,0x96,0xe0,0x0, 0x1f,0xe, 0x8e,0x8f,0xe0,0x1, 0x1f,0x95, +0x36,0xa8,0x8f,0x8f,0xe0,0x1a,0x96,0x7e,0x3f,0xcd,0x3e,0x7f,0xe0,0x0, 0x5, 0x5f, +0xf0,0x0, 0x23,0xde,0x8, 0xb1,0xf0,0x0, 0x13,0x7f,0x3d,0x68,0x3c,0xe8,0xf8,0x40, +0x3a,0xe6,0x8f,0x8e,0xe8,0x40,0x3e,0x65,0x8e,0x9e,0xe2,0x1, 0xc6,0x7f,0x3f,0xfc, +0xc4,0x1, 0x38,0xe9,0xf8,0x40,0x38,0x66,0xf0,0x40,0x38,0xea,0xe4,0xb, 0x37,0xa8, +0xe4,0xc, 0x36,0xa8,0xe2,0x1, 0xc0,0xff,0xf2,0x1, 0xc0,0x7f,0xf2,0x1, 0xc0,0xff, +0xe2,0x1, 0xc4,0x7f,0xf0,0x40,0x39,0x6f,0xe4,0xb, 0x35,0xc8,0xf0,0x40,0x39,0xed, +0xf0,0x40,0x3a,0x6d,0xe4,0xc, 0x36,0x48,0xc7,0x2, 0x5, 0x83,0xf8,0x40,0x39,0x65, +0x3d,0xf1,0xf8,0x40,0x3a,0xe2,0xf2,0x1, 0xc2,0xff,0x3, 0x82,0x3f,0xe9,0xe8,0x40, +0x3e,0xf0,0x3c,0xef,0xe2,0x1, 0xc4,0xff,0x5, 0x83,0xf8,0x40,0x39,0xe6,0xe8,0x40, +0x3e,0x71,0xf8,0x40,0x3b,0x63,0xf2,0x1, 0xc3,0x7f,0x3, 0x83,0xf0,0x40,0x3a,0x6a, +0xf0,0x40,0x3b,0xf8,0xe8,0x40,0x3d,0x64,0xe2,0x1, 0xc5,0x7f,0xe7,0xff,0x1, 0xbb, +0xe8,0x9, 0x3c,0xa5,0xe8,0xa, 0x3d,0x26,0xe2,0x0, 0xcc,0x84,0x17,0x84,0xe0,0x2a, +0x3f,0xaa,0x14,0x0, 0xe0,0x68,0x3d,0x2a,0x8, 0xe1,0x38,0x82,0x14,0x1, 0x38,0x82, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3a,0xc0,0x7c,0xe0,0x2, 0x19,0xc3,0xe0,0x2, 0x1a,0xbf, +0x97,0xd3,0xe0,0x0, 0x1b,0xb, 0x86,0x45,0x8e,0xd5,0x17,0x0, 0xe2,0xff,0xc7,0xff, +0x8d,0x86,0x6f,0x4, 0xb7,0xd3,0x6f,0x5, 0x6e,0x6, 0x6e,0x87,0xe0,0x1, 0x25,0xfb, +0xe0,0x1, 0x1f,0xad,0xe0,0x0, 0x19,0xe, 0xf0,0x0, 0x94,0x2f,0x93,0xdf,0xf0,0x1, +0x1d,0x51,0x12,0x0, 0x0, 0x89,0xf8,0x40,0x3c,0x79,0x4, 0x1e,0x8d,0x86,0x8e,0xd5, +0x3a,0x7b,0xe0,0x1, 0x3, 0xed,0xe0,0xf, 0x32,0x21,0x3f,0x92,0x8c,0x8f,0x8d,0x1f, +0x3e,0xb9,0xe8,0x0, 0xa7,0x8a,0x3e,0x9a,0x36,0xa1,0x3e,0x9f,0xe2,0x0, 0x7c,0x4, +0xf0,0x0, 0x94,0x8d,0xc2,0x1, 0xef,0xfe,0xdf,0x65,0xe2,0x1, 0xc2,0x7f,0x2c,0x64, +0xe8,0x40,0x3b,0xf9,0x3, 0x64,0x8d,0x86,0x8e,0xd5,0x16,0x1, 0xe0,0x1a,0x9a,0x52, +0xe0,0x1a,0x9f,0xe2,0x97,0x53,0x9d,0x23,0x3f,0x94,0x36,0x2f,0xe2,0xf7,0xc7,0x7f, +0xe0,0x2f,0x3f,0x9a,0x37,0xaa,0x3f,0x4c,0xe0,0x2, 0x1a,0xcb,0x3f,0x4f,0xe0,0x4, +0xcf,0x0, 0x8f,0x85,0xb7,0x53,0x27,0xbb,0xe0,0x1, 0x1e,0x70,0xe0,0x1, 0x1c,0xd1, +0x8f,0xc, 0x8d,0x1c,0x3f,0x3d,0xa4,0x9, 0x3f,0x1a,0x37,0x21,0xe0,0x1, 0x1d,0x77, +0x3f,0x18,0x94,0x8a,0x97,0xe, 0x9b,0x93,0x3f,0x29,0xe0,0x43,0x3f,0x1e,0xe4,0x9, +0x37,0xf, 0xe2,0xe, 0x3c,0xce,0x3f,0x29,0x3f,0x77,0xe0,0x0, 0x2, 0x78,0x13,0x7f, +0x3b,0x1f,0xe2,0x1, 0xc3,0x7f,0x33,0x21,0x3b,0x1c,0x0, 0x95,0x8f,0x2f,0x8f,0xbf, +0x3f,0x3d,0xe0,0x80,0x94,0x9a,0x3f,0x1f,0x37,0x21,0x3f,0x18,0x97,0x8e,0x3f,0xa9, +0xe0,0x43,0x3f,0x9f,0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x3f,0xae,0x3f,0xf7, +0xe0,0x0, 0x2, 0x5d,0x3b,0x7c,0x3f,0xec,0xc6,0x2, 0x1, 0xe9,0x17,0x81,0x2d,0x82, +0xad,0x85,0xe7,0xfb,0x17,0x7f,0x92,0xd3,0x37,0xa9,0x3a,0xde,0x3a,0xcf,0xe7,0x7f, +0x17,0xff,0x3a,0xdf,0xe0,0x0, 0x1f,0x8a,0x8f,0x8f,0xb2,0xd3,0x27,0xa9,0xe0,0x1b, +0x97,0x92,0xe0,0x17,0xc7,0xb7,0xe3,0xff,0xc7,0xff,0xe2,0x14,0xcf,0xd8,0x2, 0x8c, +0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0x8f,0x8f,0xe0,0x0, 0x2f,0xe5,0xde,0xd2,0x2c,0x4, +0xe0,0x80,0xca,0x80,0xb2,0xd3,0x16,0x83,0xe0,0x1, 0x1f,0xad,0xe0,0x1b,0x97,0x42, +0x97,0xef,0xe4,0x0, 0xc7,0x8a,0xe2,0x0, 0xcf,0x80,0x3e,0x9f,0xe0,0x6f,0x3c,0x2d, +0x37,0x82,0x3f,0x7f,0x3, 0x5, 0x97,0xd3,0xe0,0x40,0xcf,0x80,0xb7,0xd3,0x97,0xd3, +0xe3,0xdf,0xc7,0xff,0xb7,0xd3,0xe7,0xef,0x16,0xff,0xe0,0x2, 0x1f,0x37,0x97,0xd3, +0x9f,0xe, 0x3f,0xdd,0x37,0x42,0xe7,0xfd,0x16,0xff,0x3f,0xdd,0x3f,0x74,0xb7,0xd3, +0x4, 0x85,0xe0,0x1a,0x9f,0xe2,0x3f,0xfe,0x5, 0x85,0x97,0xd3,0xe0,0x2, 0xcf,0x80, +0xb7,0xd3,0xc0,0x4, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0x25,0xa0,0x13,0xff,0x3b,0x9b, +0xe2,0x1, 0xc3,0xff,0xc3,0x81,0x33,0xa1,0xe0,0x0, 0x1f,0xe, 0xe0,0x1, 0x1b,0x76, +0xe0,0x1, 0x1e,0x70,0x3b,0x92,0x8c,0x8e,0x8d,0x1e,0xe0,0xf, 0x3c,0xbd,0xc7,0x2, +0x3f,0x9a,0x37,0xa1,0x3f,0x98,0x97,0x8f,0xc6,0x2, 0x3f,0x77,0xe0,0x40,0xac,0xac, +0xe0,0x40,0xad,0x1c,0xe0,0x80,0xb7,0x96,0x1, 0xef,0xad,0x85,0x17,0x80,0xe7,0xff, +0x0, 0x88,0xe0,0x0, 0x19,0xe, 0x3e,0x6b,0xe7,0xfe,0x0, 0xb2,0x16,0x0, 0xe7,0xfe, +0x0, 0xaf,0xe0,0x2, 0x1f,0xbb,0x17,0x7, 0xaf,0xf, 0x17,0x0, 0xe0,0x1, 0x1f,0xcf, +0xaf,0xf, 0xe7,0xff,0x0, 0xb2,0x0, 0x0, 0x8, 0xb7,0xc0,0x70,0xea,0x1a,0x7f,0xac, +0xe9,0xff,0xc7,0xff,0xf0,0x0, 0x83,0xf, 0xf0,0x0, 0x83,0x9f,0x83,0xaf,0x83,0x3f, +0x82,0xcf,0x82,0x5f,0x81,0xef,0x81,0x7f,0xe0,0x1, 0x84,0xf, 0xe0,0x1, 0x84,0x9f, +0xe0,0x1, 0x85,0x2f,0xe0,0x1, 0x85,0xbf,0xe0,0x1, 0x86,0x4f,0xe0,0x1, 0x86,0xdf, +0xe0,0x1, 0x87,0x6f,0xe0,0x1, 0x87,0xff,0xf0,0x0, 0x6b,0x4, 0x6f,0x93,0xe0,0x0, +0x1f,0x8b,0xf0,0x0, 0x6b,0x85,0x6b,0x86,0x6b,0x7, 0x6a,0x88,0x6a,0x9, 0x69,0x8a, +0x69,0xb, 0x6c,0xc, 0x6c,0x8d,0x6d,0xe, 0x6d,0x8f,0x6e,0x10,0x6e,0x91,0x6f,0x12, +0x8f,0x8f,0xe0,0x1, 0x27,0x9c,0xe0,0x2, 0x1f,0x9f,0x89,0x8f,0xe0,0x1, 0x29,0x97, +0xe0,0x0, 0x1b,0xe, 0xf0,0x2, 0x1a,0xbf,0xe0,0x1, 0x1f,0xd1,0x89,0x16,0x8b,0x86, +0xe8,0x0, 0x8a,0xd5,0xf7,0xff,0x13,0xff,0xf7,0xff,0x13,0x7f,0x14,0x81,0xa2,0xf, +0xe0,0x43,0x3e,0x97,0x3d,0x63,0xf0,0x17,0x3b,0x92,0xf0,0x16,0x3b,0x15,0x3c,0x92, +0xe0,0xb, 0x3e,0xb5,0xe8,0x40,0x3f,0x67,0xe0,0xc, 0x3d,0x92,0x36,0x21,0x3e,0x14, +0x96,0xc, 0x3f,0xe9,0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0x3f,0x1b,0x3f,0x9b, +0xe2,0x1, 0xce,0x20,0x37,0x21,0x37,0xa1,0xc6,0xff,0x16,0x1, 0x3f,0x14,0x3f,0x94, +0xe0,0x43,0x3e,0x9d,0x3e,0x13,0x5, 0x18,0x21,0x8, 0x94,0xe, 0x39,0xec,0x3d,0x18, +0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0xe8,0x40,0x39,0x76,0x17,0x1, 0x3f,0x13, +0x3, 0x8, 0x94,0xf, 0x39,0xee,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a, +0xe3,0xff,0xce,0xff,0x1, 0xce,0xf8,0x0, 0x8b,0x45,0x16,0x1, 0xf7,0xff,0x13,0xff, +0xf7,0xff,0x12,0xff,0x14,0x81,0x3e,0x17,0xf0,0x17,0x3b,0x92,0xf0,0x15,0x3a,0x95, +0x3c,0x92,0x3f,0xec,0xe2,0x1, 0xc7,0xff,0xe0,0xd, 0x3f,0xb5,0xe8,0x40,0x3f,0x67, +0x3f,0xe9,0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0xe0,0xb, 0x3e,0x92,0x3f,0x1d, +0x3f,0x9d,0xe0,0x43,0x3e,0x9c,0xe8,0x40,0x3e,0xf6,0x35,0xa1,0x37,0x21,0x37,0xa1, +0xf0,0x0, 0x12,0x1, 0x3d,0x94,0x3f,0x14,0x3f,0x94,0xc6,0x1, 0xf0,0x14,0x3a,0x13, +0x3, 0x24,0x96,0x8b,0xe3,0xff,0xc6,0x7f,0xe2,0x1, 0xce,0xa0,0x5, 0x1e,0x21,0x9, +0x94,0xe, 0xe8,0x40,0x39,0xe4,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a, +0xe8,0x40,0x39,0x75,0x17,0x1, 0x3f,0x13,0x3, 0x4d,0x94,0xf, 0x39,0xee,0x3d,0x18, +0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0x0, 0xc5,0xea,0x12,0x7f,0x91,0x17,0x0, +0xaf,0xf, 0x14,0x0, 0xc0,0x10,0xb, 0xe1,0xe4,0x8, 0x35,0xf, 0xe2,0xa, 0x3c,0x4a, +0x3c,0xe3,0xe0,0x8, 0x3d,0x28,0xe0,0x4, 0xde,0x67,0xe2,0x0, 0xcc,0x64,0x2, 0x6e, +0x29,0xe, 0xe0,0x0, 0x1f,0xa, 0xea,0x12,0x7f,0x91,0x16,0x81,0x8f,0xe, 0xae,0x8f, +0x14,0x1, 0x27,0x69,0x17,0x3, 0xaf,0xf, 0x14,0x3, 0x0, 0xe5,0x16,0xff,0x3e,0x95, +0x39,0x7d,0x1, 0x70,0x17,0xff,0x3a,0xb7,0x3f,0x92,0xe2,0x0, 0xc9,0x8f,0xe2,0x1, +0xc7,0xff,0x16,0x3, 0x3f,0x95,0x17,0x0, 0xe0,0x6e,0x3a,0xac,0x37,0xa1,0x39,0x7d, +0x3f,0x94,0x96,0xf, 0xe0,0x0, 0x4, 0x4d,0x17,0x84,0x15,0xf4,0x36,0x1, 0x3f,0x90, +0xe0,0xb, 0x3d,0x90,0xe0,0x1, 0x86,0xef,0x3e,0xfc,0x5, 0x6, 0xe0,0x1, 0x86,0xff, +0x3f,0x1d,0xe3,0xff,0xc7,0x7f,0xc7,0xfe,0x3d,0xff,0x1, 0xf5,0x39,0x15,0x31,0x21, +0x3a,0x12,0x97,0x84,0x16,0xa8,0xe4,0xc, 0x37,0x8f,0xe2,0xf, 0x3e,0x4f,0x3e,0x9e, +0x3f,0xac,0xe2,0xb, 0xcf,0xdd,0x3f,0xed,0xe3,0xff,0xc7,0xff,0xe0,0x1a,0x96,0x76, +0xe0,0x0, 0x1e,0x9a,0xe0,0x6e,0x3b,0x2f,0x17,0xa8,0xe2,0xb, 0xce,0x5d,0x3f,0x9e, +0x8e,0xd, 0xe3,0xff,0xc7,0xff,0xe0,0x6e,0x3b,0x2f,0xe2,0x0, 0xce,0x1, 0x1, 0x25, +0x3f,0xee,0xe3,0xff,0xc7,0xff,0xe2,0x1, 0xcf,0xfa,0x2, 0x8f,0xea,0x12,0x7f,0x91, +0x8c,0xf, 0xe3,0xff,0xc7,0x7f,0x3f,0x78,0xe7,0xff,0x5, 0x8e,0x3c,0x6e,0xe2,0x1, +0xc4,0x7f,0xac,0xf, 0xe7,0xff,0x0, 0x88,0xe0,0x1, 0x17,0x7a,0x0, 0xf0,0x17,0x81, +0x3f,0x92,0xe2,0x1, 0xc7,0xff,0x3f,0x95,0x37,0xa1,0x3f,0x94,0x97,0x8f,0x3e,0x1f, +0xe0,0x43,0x3e,0x1c,0xe7,0xff,0x0, 0xaa,0xc7,0x28,0x17,0x80,0xaf,0x8d,0xe3,0xff, +0xc7,0x7f,0x0, 0xd7,0x8, 0xb7,0xe0,0x2, 0x19,0x85,0xe0,0x2, 0x1a,0x6b,0xe0,0xa, +0x8f,0x83,0x17,0x1, 0xe2,0x0, 0xcf,0x81,0xaf,0x4, 0xe0,0x0, 0x1, 0x63,0xe0,0x1, +0x1a,0x94,0xe0,0x1, 0x19,0x2d,0x8f,0x85,0xe0,0x1, 0x13,0xa0,0x37,0xc1,0xe0,0x1, +0x13,0x16,0xaf,0x92,0xb3,0x92,0xb3,0x22,0xe0,0x3, 0xde,0xb4,0xe0,0x0, 0x1f,0x8b, +0xe0,0x0, 0x1f,0xe, 0x8f,0x8f,0x2f,0xaf,0x17,0x80,0xaf,0x84,0xe0,0x1, 0x1f,0x96, +0x8d,0xf, 0xe0,0x1, 0x1f,0x93,0x35,0x28,0x8d,0x8f,0xe0,0x1, 0x1f,0x92,0x35,0xa8, +0x8e,0xf, 0xe0,0x1, 0x1f,0x95,0x36,0x28,0x8e,0x8f,0xe0,0x1, 0x1f,0x91,0x3e,0xca, +0x8f,0xf, 0xe0,0x1, 0x1f,0x90,0x3f,0x4b,0x8f,0x8f,0xe0,0x43,0x3f,0x1e,0x3f,0xcc, +0xe0,0x43,0x3f,0x9f,0xe0,0xc, 0x36,0xc5,0x85,0x5, 0xae,0x3, 0xe0,0x41,0x3d,0xcf, +0xe0,0xc, 0x37,0x5, 0xad,0x12,0xb6,0x92,0xb7,0x22,0xb7,0xf2,0xe0,0x1, 0xb5,0x82, +0xae,0x13,0xb, 0xe1,0xe2,0x0, 0xcf,0x83,0x5, 0x9f,0xe0,0x1a,0x97,0xfe,0xe2,0x2, +0xcf,0xab,0x2, 0x1e,0x8f,0x85,0x17,0x5, 0x37,0xc1,0xaf,0x92,0xe7,0xfe,0x17,0xea, +0xe0,0x1, 0xb7,0x82,0x17,0x84,0xaf,0x3, 0xb3,0x92,0xb3,0x22,0xb3,0x72,0xaf,0x93, +0x8f,0x84,0xe7,0xff,0x27,0xbd,0xe0,0x0, 0x1f,0xb8,0x17,0x1, 0xaf,0xf, 0xb, 0xe1, +0x17,0x80,0xaf,0x84,0xb, 0xe1,0xe7,0xff,0x1, 0xb1,0xe0,0x1a,0x97,0xfe,0xe2,0x3, +0xcf,0x8f,0xe7,0xff,0x2, 0x2b,0x86,0x85,0xe0,0x1, 0x17,0x20,0x17,0x85,0xae,0x92, +0xe0,0x1, 0x16,0xaa,0xb7,0x22,0xb7,0x72,0xe7,0xfe,0x17,0x60,0xaf,0x83,0xb6,0x92, +0xe0,0x1, 0xb7,0x2, 0xaf,0x93,0x0, 0xdd,0xe0,0x2, 0x1f,0xeb,0x17,0x7f,0xaf,0xf, +0xe7,0xfe,0x0, 0xf2,0x8, 0xb4,0xe0,0x2, 0x19,0x85,0xe0,0xa, 0x8f,0x83,0xe2,0x0, +0xcf,0x81,0xe0,0x1, 0x1, 0x0, 0xe0,0x1, 0x19,0x2d,0xe0,0x3, 0x8f,0xc2,0xe2,0x0, +0xcf,0x81,0xe0,0x0, 0x1, 0x4f,0xe0,0x2, 0x1a,0x6b,0x17,0xff,0xaf,0x84,0xdf,0x5b, +0x8f,0x84,0xe0,0x1, 0x27,0x99,0xe0,0x1, 0x8f,0xb3,0x27,0xa1,0x9f,0x12,0x97,0xa2, +0x96,0xf2,0xe4,0x0, 0xc7,0xa, 0xe4,0x0, 0xc7,0x8a,0x37,0x3, 0xe4,0x0, 0xc6,0x8a, +0xe3,0xff,0xc7,0x7f,0x37,0x83,0xe0,0x43,0x3e,0x1f,0x36,0x83,0xe0,0xb, 0x37,0x45, +0xad,0x83,0xe0,0x41,0x3f,0xcf,0xe0,0x41,0x3d,0x4d,0xe0,0xb, 0x36,0x5, 0xb7,0x12, +0xb6,0x22,0xb7,0xb2,0xb6,0xf2,0xe0,0x1, 0xb5,0x2, 0xad,0x93,0x8f,0xc3,0xe2,0x1, +0xcf,0xaa,0x1, 0x13,0xe0,0x1, 0x1f,0x8f,0x8e,0xf, 0xe0,0x1, 0x1f,0x8e,0x36,0x28, +0x8e,0x8f,0xe0,0x1, 0x1f,0x8d,0x36,0xa8,0x8f,0xf, 0xe0,0x1, 0x1f,0x8c,0x3f,0x4c, +0x8f,0x8f,0xb7,0x42,0x3f,0xcd,0xb7,0xd2,0xe0,0x1, 0x1f,0x8b,0x8f,0xf, 0xe0,0x1, +0x1f,0x8a,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xe0,0x41,0x3f,0xcf,0xb7,0xb2,0xa, 0x61, +0xe0,0x1, 0x1f,0x89,0xe0,0x1, 0x1f,0x10,0x8e,0xf, 0xe0,0x1, 0x1f,0x92,0x8f,0xe, +0x8e,0x8f,0xe0,0x1, 0x1f,0x88,0x36,0xa8,0x8f,0x8f,0x3f,0x4d,0x16,0x84,0x36,0x28, +0xae,0x83,0xe0,0x1, 0x16,0x96,0xe0,0x1, 0x1d,0x94,0x3f,0xcc,0xb6,0x92,0xe0,0x0, +0x16,0xf8,0xe0,0x41,0x3f,0xcf,0x85,0x8b,0xb6,0xa2,0x16,0x0, 0xe0,0x2, 0x1e,0xeb, +0xe0,0x1, 0xb7,0x82,0x17,0x83,0xad,0x92,0xae,0xd, 0xb7,0x72,0xaf,0x93,0xe7,0xff, +0x0, 0x94,0xe0,0x1, 0x1f,0x89,0xe0,0x1, 0x1f,0x10,0x8e,0xf, 0xe0,0x1, 0x1f,0x92, +0x8f,0xe, 0x8e,0x8f,0xe0,0x1, 0x1f,0x88,0x36,0xa8,0x8f,0x8f,0xe0,0x1, 0x19,0x2d, +0x3f,0x4d,0x16,0x89,0x36,0x28,0xae,0x83,0xe0,0x2, 0x16,0xac,0xe0,0x1, 0x1d,0x94, +0x3f,0xcc,0xb6,0x92,0xe0,0x2, 0x16,0x8e,0xe0,0x41,0x3f,0xcf,0x85,0x8b,0xb6,0xa2, +0x16,0x0, 0xe0,0x2, 0x1e,0xeb,0xe0,0x1, 0xb7,0x82,0x17,0x88,0xad,0x92,0xae,0xd, +0xb7,0x72,0xaf,0x93,0xe0,0x2, 0x1f,0xa0,0x8f,0x8f,0xe7,0xfe,0x2f,0xe6,0xe0,0x3, +0x8f,0xc2,0xe7,0xfe,0x2f,0xe2,0xe0,0x1, 0x1f,0x87,0x8f,0xf, 0xe0,0x1, 0x1f,0x86, +0x37,0x28,0x8f,0x8f,0x3f,0xce,0xb7,0x92,0xe7,0xfe,0x0, 0xd7,0x3c,0xe8,0xe0,0x1, +0x1c,0x41,0xe7,0x0, 0x16,0x0, 0xe0,0xff,0x15,0xff,0x15,0x0, 0xe7,0xdb,0x0, 0x83, +0x8, 0xb7,0xf8,0x0, 0xc, 0x38,0xe0,0x2, 0x1f,0x3f,0x8f,0xfe,0x8a,0x6e,0x89,0xde, +0xe0,0x0, 0x27,0xc1,0x11,0x7f,0x39,0x1f,0xe2,0x1, 0xc1,0x7f,0xe0,0x2, 0x1f,0xb0, +0x31,0x21,0xe0,0x2, 0x1b,0x2f,0xf0,0x1, 0x1c,0x40,0x3a,0xe8,0x39,0x1f,0x13,0x80, +0x22,0x34,0x14,0x0, 0x3f,0x67,0xf0,0x40,0x3b,0x63,0xe3,0xff,0xc7,0x7f,0xe0,0xff, +0x16,0x7f,0x3f,0xe8,0xe0,0xd, 0x37,0x21,0x3e,0x95,0x96,0x8d,0xe4,0x17,0x36,0xf, +0xe4,0x9, 0x36,0x8f,0xf2,0xa, 0x3b,0xcc,0xe2,0xb, 0x3c,0xcd,0xe8,0xa, 0x3d,0x27, +0x3d,0xa9,0x3d,0x7b,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3c,0x1d,0xe0,0x6d,0x3d,0x2c, +0x3a,0x7f,0xe8,0xe, 0x3f,0x16,0x3e,0x6d,0xe3,0xff,0xc7,0x7f,0x1, 0xe4,0xe0,0x80, +0xb6,0x16,0x3c,0xe4,0xe0,0x4, 0xdc,0x40,0x3b,0x72,0xe8,0x80,0xb4,0x18,0xc3,0x81, +0x1, 0xd0,0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe0,0xff,0x16,0x7f,0x3c,0x64,0x0, 0xf0, +0x24,0xbd,0x8, 0xb3,0x16,0x7f,0x3e,0x19,0xe2,0x1, 0xc6,0x7f,0x11,0x7e,0x39,0x18, +0x36,0x21,0x3e,0x18,0x39,0xe2,0x14,0x0, 0xe0,0x43,0x3d,0x9a,0xe0,0x80,0x97,0x13, +0xe4,0xd, 0x37,0xf, 0xe2,0xf, 0x3e,0xce,0x3f,0xad,0xe0,0x43,0x3f,0x9f,0x3f,0xfa, +0xe0,0x6f,0x3a,0x2b,0x39,0xfc,0x3c,0x1f,0x1, 0xf2,0xe0,0x4, 0xdc,0x15,0xe2,0x0, +0xcc,0x8, 0x16,0x88,0xe0,0x6d,0x3b,0x28,0x0, 0x88,0x3f,0xad,0xe0,0x43,0x3f,0x9f, +0xe0,0x80,0xb7,0x92,0x39,0xf2,0x1, 0x11,0x97,0x92,0xe2,0x0, 0xcf,0x87,0xe0,0xe, +0x3e,0x9f,0xe0,0x43,0x3f,0x1e,0x2, 0x72,0xe3,0xff,0xcf,0xf8,0xe0,0x6f,0x3d,0x2e, +0xe0,0x80,0xb7,0x92,0x39,0xf2,0x1, 0xf1,0x9, 0xe1,0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x39,0xe0,0x2, 0x1f,0xbf,0xe0,0x1, 0x1b,0x51,0x8a,0x6f,0xa4,0x86,0xe0,0x1, +0x1c,0x41,0xe7,0x0, 0x16,0x0, 0xe0,0xff,0x15,0xff,0x15,0x0, 0x8a,0xff,0xef,0xfe, +0xdc,0xe2,0x22,0x2f,0xc2,0x7f,0xe2,0x1, 0xc2,0x7f,0xe0,0x45,0xc2,0x43,0xe0,0x1, +0x1f,0xcd,0x32,0x21,0xe0,0x1, 0x19,0xbf,0xe0,0x19,0x32,0xa1,0x3a,0x1f,0x11,0x0, +0xf0,0x0, 0x14,0x3, 0xe0,0x0, 0x13,0xda,0xe0,0x80,0x97,0x93,0xe8,0x40,0x3c,0xe8, +0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f,0xe0,0x8, 0x3f,0xa8,0xe0,0x4, 0xdb,0xc4, +0xe2,0x0, 0xcc,0x5a,0xa7,0x86,0x3d,0x67,0xe0,0x6a,0x3b,0x28,0xe3,0xff,0xc5,0x7f, +0xe0,0x8, 0x3f,0x92,0x3c,0xe5,0xdf,0x85,0x3a,0x73,0xe8,0x2, 0x39,0x19,0x1, 0xe5, +0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x8, 0xb3,0xe0,0x2, 0x1f,0xbf,0xe0,0x1, 0x1c,0x4d, +0x89,0xff,0x89,0x6f,0xdf,0x26,0x21,0xa5,0x14,0x7f,0x3c,0x13,0xe2,0x1, 0xc4,0x7f, +0xe0,0x2, 0x1d,0xb0,0xc4,0x1, 0x34,0x21,0xe0,0x1, 0x1c,0xcd,0x3c,0x1b,0xe0,0xa, +0x31,0xa1,0x3e,0xe9,0x17,0x80,0x21,0x11,0x97,0xd, 0x96,0xb, 0xe2,0x0, 0xcf,0x0, +0x4, 0x4, 0xe2,0x0, 0xce,0x0, 0x5, 0x3, 0x3f,0x2c,0xb7,0xd, 0xc7,0x81,0xe2,0x1, +0xc7,0xff,0x39,0x7f,0x3e,0x9a,0x1, 0xf1,0xc5,0x82,0x3d,0xf8,0xc4,0x82,0x1, 0xea, +0x9, 0xe1,0xe2,0x0, 0xcc,0x80,0x4, 0x5, 0x3c,0x5a,0xe4,0x8, 0x34,0x4f,0x38,0x82, +0xe0,0x41,0x3d,0xa, 0xe3,0x8, 0x3d,0x58,0xe4,0x8, 0x34,0x4f,0x38,0x82,0x8, 0xb3, +0xe4,0xe, 0x34,0x8f,0xe2,0xf, 0x3f,0x49,0x3f,0xae,0xe4,0x0, 0xc7,0x8a,0x39,0x68, +0xe1,0xff,0x14,0x7e,0x14,0x94,0x3c,0x5f,0x39,0xea,0xe0,0x4, 0xdb,0xa9,0xe4,0xf, +0x31,0xf, 0xe4,0xa, 0x31,0x8f,0xe2,0x2, 0x3f,0xc2,0xe2,0x3, 0x3d,0x43,0x39,0x2f, +0x39,0xaa,0xe3,0xff,0xc4,0x7f,0xe3,0xff,0xc1,0xff,0xe3,0xff,0xc1,0x7f,0xe1,0x22, +0x3c,0x12,0xe1,0x28,0x3c,0x13,0x3c,0x52,0x9, 0xe1,0xe3,0xff,0xc4,0x7f,0x24,0x94, +0x16,0xff,0x3e,0x99,0xe2,0x1, 0xc6,0xff,0xe0,0x1, 0x1f,0x4d,0xe0,0xf, 0x34,0x21, +0x3e,0x98,0xc7,0xfe,0x36,0xa1,0x3f,0x9e,0x3e,0x9e,0x97,0x1f,0x37,0x2, 0xe0,0x80, +0xb7,0x1f,0x3f,0xfd,0x1, 0xfb,0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x6c, +0xe0,0x2, 0x1f,0xff,0xf0,0x2, 0x1e,0xbf,0x8f,0xf, 0xe8,0x0, 0x8e,0x4d,0xe8,0x0, +0x8e,0xdd,0xe2,0x0, 0xcf,0x1, 0x7e,0x4, 0x3b,0xe8,0x7e,0x83,0x3b,0x69,0x1, 0x6, +0x8f,0x8f,0xe2,0x0, 0xcf,0x83,0xe0,0x2, 0x1, 0x4a,0xe0,0x1, 0x1f,0x96,0xe0,0x1, +0x1f,0x15,0x8f,0x8f,0xf0,0x0, 0x8c,0x8e,0x37,0xa8,0xf0,0x19,0x3c,0xcf,0xf0,0x0, +0x7c,0x81,0xe0,0x1, 0x23,0xf7,0x67,0x84,0x11,0x80,0x3f,0x6f,0xc7,0x7f,0x7f,0x5, +0xf0,0x40,0x3f,0x63,0xf0,0x0, 0x1e,0xe, 0xe0,0x1, 0x1a,0x4d,0xe0,0x0, 0x12,0x83, +0xe0,0x1, 0x2b,0x19,0xe8,0x0, 0x8f,0xc, 0xf8,0x0, 0x8d,0x1c,0x3f,0x7f,0xe0,0x1, +0x1, 0x1, 0xe8,0x0, 0x89,0x5d,0x66,0x1, 0x39,0x3e,0xe8,0x2, 0x39,0x1a,0xf0,0x40, +0x3d,0x62,0xf3,0xff,0xc5,0x7f,0xf0,0xf, 0x35,0x21,0x3f,0x94,0x96,0x8f,0xe4,0x9, +0x36,0x8f,0xe2,0xf, 0x3c,0xcd,0x3f,0xa9,0x3f,0xfc,0xe0,0x0, 0x2, 0x6b,0xe0,0x1, +0x27,0x0, 0x66,0x3, 0xf0,0x9, 0x3d,0x2c,0x66,0x5, 0x34,0xa1,0x3e,0x7e,0x3c,0x94, +0x91,0x9, 0x5, 0x7, 0x64,0x83,0xe8,0x9, 0x3c,0x9a,0x34,0xa1,0x3c,0x94,0x91,0x89, +0x66,0x5, 0x3e,0x7e,0x3f,0x62,0xe0,0x6e,0x39,0xa3,0x39,0xee,0xe2,0x0, 0xce,0x80, +0xe0,0x0, 0x4, 0x76,0x3f,0x63,0xe3,0xff,0xc7,0x7f,0x37,0x4f,0xe0,0x0, 0x27,0x7d, +0x3f,0x62,0xe3,0xff,0xc7,0x7f,0x37,0x4f,0xe0,0x0, 0x27,0x77,0x17,0x8e,0xe8,0xf, +0x3f,0x9a,0x37,0xa1,0xe8,0xf, 0x3f,0x9d,0x9c,0xf, 0x3c,0xe5,0xe0,0x4, 0xda,0xf8, +0x11,0x7c,0xe8,0x2, 0x39,0x1a,0xf0,0x40,0x3c,0x68,0xf3,0xff,0xc4,0x7f,0xe3,0xff, +0xc1,0x7f,0x17,0x7f,0xe8,0xe, 0x3f,0x1a,0xf0,0x40,0x3c,0xee,0xf3,0xff,0xc4,0xff, +0x17,0x8e,0xe8,0xf, 0x3f,0x99,0x37,0xa1,0x3c,0xe5,0xe8,0xf, 0x3f,0x9d,0xf0,0x1, +0x25,0x63,0xf0,0x40,0x3c,0xf2,0xe0,0x1, 0x1, 0x1, 0x9c,0xf, 0xe0,0x4, 0xda,0xd8, +0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0x78,0xe0,0x1, 0x1, 0xd0,0xf8,0x40,0x3d,0x69, +0x0, 0xe1,0x17,0xff,0xe8,0xf, 0x3f,0x9b,0xf0,0x40,0x3d,0xef,0xf2,0x1, 0xc5,0xff, +0xf0,0x1, 0x2d,0x96,0x2b,0x6, 0x14,0x80,0xe8,0x40,0x3c,0x6e,0xe0,0x0, 0xd9,0xe1, +0x15,0x81,0xe8,0xb, 0x3d,0x9e,0xf0,0x40,0x3f,0x6b,0xf2,0x1, 0xc7,0x7f,0xe8,0x40, +0x3b,0xfe,0xf0,0x0, 0xc6,0x2, 0xe0,0x0, 0x1, 0x55,0xe8,0x0, 0x8f,0xcd,0xe7,0xfe, +0x23,0x6b,0xe8,0x7, 0x8f,0x4c,0xf8,0x7, 0x8d,0x5c,0xe7,0xfe,0x0, 0xe9,0x67,0x4, +0x39,0x63,0xe2,0x0, 0xcf,0x1, 0xe7,0xff,0x5, 0x13,0x67,0x3, 0xe8,0xe, 0x3f,0x1a, +0x37,0x21,0x3f,0x14,0x91,0x8e,0x39,0x63,0xe7,0xff,0x0, 0x8a,0xe0,0x41,0x3f,0x2, +0xe3,0xff,0xc7,0x7f,0x37,0x4f,0x27,0x8, 0xe0,0x41,0x3f,0x3, 0xe3,0xff,0xc7,0x7f, +0x37,0x4f,0xe7,0xff,0x2f,0xd, 0xe4,0x0, 0xc7,0x8a,0xe1,0xff,0x14,0x7e,0x3c,0x5f, +0x14,0x94,0xe0,0x4, 0xda,0x85,0xe4,0xe, 0x31,0xf, 0xe2,0xf, 0x3f,0x42,0x3f,0xae, +0xe3,0xff,0xc4,0x7f,0xe3,0xff,0xc7,0xff,0xe1,0x2f,0x3c,0x1f,0xe7,0xff,0x27,0xba, +0xe4,0xe, 0x31,0x8f,0xe2,0xf, 0x3f,0x43,0x3f,0xae,0xe3,0xff,0xc7,0xff,0xe1,0x2f, +0x3c,0x1f,0xe7,0xfe,0x2f,0xed,0x15,0x81,0xe8,0xb, 0x3d,0x9e,0xf0,0x40,0x3f,0x6b, +0xf2,0x1, 0xc7,0x7f,0xe8,0x40,0x3b,0xfe,0xf0,0x0, 0xc6,0x2, 0xe7,0xff,0x1, 0xaf, +0xc0,0x14,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x79,0x2, 0xf0,0xd, 0x34,0xa1,0xc6,0x9a, +0xf8,0x0, 0x9d,0x5d,0xf0,0x2, 0x3e,0x9d,0xf0,0x0, 0x15,0x81,0xe0,0x80,0x9c,0x12, +0x3c,0xe5,0xe0,0x4, 0xda,0x4d,0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0x78,0xf0,0x0, +0x13,0x81,0x14,0x81,0xf8,0x17,0x3b,0x9b,0xe8,0x9, 0x3c,0x99,0xe7,0xfe,0x1, 0xf3, +0xf8,0x40,0x3d,0x79,0xf0,0x40,0x3c,0xe9,0xf3,0xff,0xc4,0xff,0x5, 0x88,0xf8,0x40, +0x3d,0xe7,0xf2,0x1, 0xc5,0xff,0xf2,0x0, 0xcd,0x85,0x1, 0xe1,0x16,0xff,0xe8,0xd, +0x3e,0x9b,0x67,0x82,0x66,0x2, 0xe2,0x1, 0xc6,0xff,0x37,0xa1,0x3e,0x9c,0xc7,0xfe, +0x36,0xa1,0x3f,0x94,0x3e,0x94,0x97,0x1f,0x37,0x2, 0xe0,0x80,0xb7,0x1f,0x3f,0xfd, +0x1, 0xfb,0xe7,0xfe,0x2b,0x5f,0xe7,0xfe,0x0, 0xd8,0xe0,0x1, 0x1f,0x96,0xe0,0x1, +0x1f,0x15,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x3c,0x4f,0xe0,0x4, 0xd9,0x7b,0xe0,0x3, +0x1d,0x13,0xe0,0x3, 0x1d,0x94,0xe0,0x4, 0xd8,0x1c,0xe0,0x4, 0xd9,0xa1,0xe3,0xff, +0xc4,0x7f,0x7c,0x1, 0xe7,0xfd,0x0, 0xaf,0xf0,0x0, 0x7d,0x2, 0xf8,0x40,0x3c,0xea, +0xe7,0xff,0x0, 0xa5,0xf8,0x40,0x3c,0xea,0xf0,0x0, 0x7d,0x2, 0xe7,0xff,0x0, 0x9f, +0xe0,0x2, 0x1f,0xff,0x8f,0x8f,0xe2,0x0, 0xcf,0x83,0x1, 0x2, 0x38,0x82,0x8, 0xb1, +0xe0,0x1, 0x1f,0x14,0xe0,0x1, 0x1f,0xad,0x86,0x8e,0xe0,0x0, 0x17,0x5a,0xb7,0x1f, +0xb7,0x2f,0xe7,0xff,0x17,0x26,0xae,0x9f,0xb7,0x3f,0xe0,0x3, 0xda,0x8b,0xe0,0x0, +0x1f,0x8b,0x8c,0xf, 0x2c,0xa, 0xe0,0x0, 0x1f,0x8a,0x8c,0xf, 0x2c,0x2, 0x8, 0xe1, +0x14,0x81,0x8, 0xa1,0xe7,0xfc,0x0, 0xda,0x14,0x80,0xde,0x57,0x0, 0xf5,0xe0,0x2, +0x1f,0xff,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x2, 0x38,0x82,0xe0,0x0, 0x1f,0x8b, +0x8c,0xf, 0x24,0x7c,0x14,0x80,0xe7,0xfc,0x0, 0xc9,0x8, 0xb7,0xe1,0xff,0xc0,0x30, +0x14,0xc, 0xe0,0x0, 0x15,0x48,0x14,0x80,0x3c,0x10,0xe0,0x4, 0xdb,0xe7,0xe0,0x3, +0xda,0x61,0xe0,0x2, 0x1f,0xa8,0xe0,0x2, 0x1a,0x3f,0x87,0x8f,0xe0,0x3, 0x8f,0x24, +0xe2,0x0, 0xc7,0x81,0x3f,0x7f,0xe0,0x2, 0x1, 0x44,0x89,0x4, 0x8f,0xa4,0x3f,0x6f, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x20,0x3c,0xef,0x5, 0x82,0x14,0xa0,0xe2,0x1, +0xc4,0xff,0x39,0xe9,0xe0,0x2, 0x24,0xb9,0x12,0xff,0xe0,0x1, 0x1f,0xd1,0xfa,0x1a, +0x7b,0xbc,0x3a,0x99,0x8d,0x54,0xf9,0xff,0xc3,0xff,0xe3,0xff,0xc2,0xff,0x3d,0xe2, +0xf0,0x0, 0xa3,0xf, 0xe2,0x1, 0xc5,0xff,0xe8,0x5, 0x3a,0x97,0x35,0x21,0x17,0x80, +0x25,0x9c,0x14,0x98,0x3c,0xbf,0xe2,0x0, 0x7f,0x8c,0x3f,0x99,0xe0,0x1, 0x9c,0x1f, +0xa6,0x8f,0xe8,0x40,0x3f,0x66,0x17,0x80,0xc7,0x81,0xe3,0xff,0xc7,0xff,0x96,0xe, +0x3f,0xfb,0x3e,0x9c,0x3f,0x1a,0x1, 0xf9,0xe2,0x0, 0x7f,0x8c,0x3f,0x99,0xe0,0xe, +0x3d,0x98,0xbe,0x8f,0xe0,0x1, 0xb7,0x1f,0xe8,0x40,0x3a,0xf7,0xf0,0x0, 0xc3,0x2, +0x1, 0x4, 0xe8,0x80,0x8f,0x97,0x0, 0xdd,0x64,0x3, 0x5c,0x8f,0x12,0x8c,0x3a,0x90, +0xe0,0x4, 0xd9,0x1a,0xb4,0x65,0xe0,0x2, 0x9c,0xd5,0xa4,0x65,0xe0,0x4, 0xd9,0x14, +0xe0,0x2, 0xb4,0x25,0xe0,0x4, 0x9c,0x95,0xe0,0x1, 0xa4,0x45,0xe0,0x4, 0xd9,0xc, +0xe0,0x3, 0xb4,0x65,0xe0,0x0, 0x21,0xdc,0xf7,0xff,0x10,0x7f,0xe0,0x1, 0x1f,0xd1, +0xfa,0x1a,0x79,0xbc,0xf0,0x10,0x38,0x13,0xf0,0x0, 0x8a,0x54,0xf9,0xff,0xc1,0xff, +0xf3,0xff,0xc0,0x7f,0x3c,0xe2,0xf0,0x0, 0xa1,0xf, 0xe2,0x1, 0xc4,0xff,0xf8,0x10, +0x38,0x13,0xf0,0x14,0x32,0x21,0x15,0x0, 0xf0,0x40,0x38,0xe5,0x24,0xb8,0xe4,0x0, +0xc5,0x18,0xf0,0x0, 0x13,0x8, 0xe8,0xa, 0x3d,0x11,0xf0,0x0, 0x13,0x96,0x14,0x4, +0xf0,0x0, 0x92,0xea,0xf0,0x16,0x3b,0x1a,0xf0,0x17,0x3b,0x9a,0x3c,0x1a,0xe8,0x40, +0x3f,0x62,0x17,0x80,0xc5,0x14,0x0, 0x8e,0xa5,0x88,0x96,0xa, 0xc7,0x81,0xe3,0xff, +0xc7,0xff,0x3e,0x9b,0xc6,0x1, 0x3f,0xf9,0xbe,0x88,0xe8,0xe, 0x3f,0x14,0xb6,0xa, +0x1, 0x16,0x96,0x8e,0xe8,0x40,0x3e,0xf5,0x5, 0x70,0xe8,0x0, 0xa5,0x86,0xe8,0x0, +0x96,0x7, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3e,0x9b,0xc6,0x1, 0x3f,0xf9,0xe8,0x0, +0xbe,0x86,0xe8,0xe, 0x3f,0x14,0xe8,0x0, 0xb6,0x7, 0x1, 0xec,0xf8,0x40,0x39,0xf0, +0xf0,0x0, 0xc1,0x2, 0x1, 0x4, 0xe8,0x80,0x8d,0x13,0x0, 0xc1,0x13,0xc, 0x3b,0x10, +0xe0,0x0, 0x13,0xd4,0x3b,0x90,0x3a,0xe6,0xe0,0x1, 0x9f,0xa5,0x3c,0xef,0xe0,0x0, +0x27,0xfa,0xa4,0x15,0xe0,0x4, 0xd8,0xa0,0xb4,0x75,0xe0,0x1, 0x9f,0xb5,0x3c,0xef, +0xe0,0x0, 0x27,0xed,0xa4,0x25,0xe0,0x4, 0xd8,0x97,0xe0,0x1, 0xb4,0x5, 0xc2,0x98, +0x3b,0xf5,0x1, 0xeb,0xe0,0x0, 0x1f,0x8e,0x17,0x4, 0x3f,0x10,0xe0,0x1b,0x95,0x1f, +0x3d,0xee,0x17,0x80,0xe0,0x1, 0x14,0x16,0xe7,0xfe,0x14,0xea,0xe3,0xfe,0xcd,0x38, +0xe0,0x0, 0x3, 0x44,0xe0,0x1, 0x9e,0xb6,0xe2,0x0, 0xce,0xe3,0x5, 0xbe,0xe0,0x1, +0x96,0x86,0xe0,0xc, 0x37,0xa1,0xe3,0xfe,0xce,0xea,0xb6,0x8e,0x3e,0x1b,0x3, 0x3d, +0xb4,0x8c,0xc7,0x81,0xe2,0x0, 0xcf,0x83,0xc3,0x18,0xc7,0x2, 0x1, 0xe8,0xe0,0x0, +0x21,0xc5,0xe0,0x1, 0x1f,0xd1,0xea,0x1a,0x7a,0xbc,0xc1,0xff,0xe9,0xff,0xc2,0xff, +0xe3,0xff,0xc1,0xff,0xa4,0x8f,0xe2,0x1, 0xc1,0x7f,0x39,0x95,0x3c,0x65,0x17,0x80, +0xe0,0xb, 0x3c,0x25,0x21,0x15,0xe2,0x0, 0x7f,0x4, 0x37,0xa1,0x3f,0x9e,0x9d,0xf, +0x17,0x0, 0x8f,0xd4,0x3f,0xbe,0xc7,0x1, 0x3f,0x9b,0x37,0xa1,0x3f,0x99,0x96,0x8f, +0x3e,0x6e,0xe3,0xff,0xc6,0x7f,0x3e,0xaa,0x3e,0x72,0xb6,0x8f,0x4, 0xf3,0x3c,0x73, +0x1, 0x1c,0xe0,0x80,0x8f,0x98,0x0, 0xe5,0x96,0xf6,0xe0,0xc, 0x37,0xa1,0xe3,0xfe, +0xce,0xea,0xb6,0x8e,0x3e,0x1b,0x4, 0x45,0xe2,0x1, 0xce,0x96,0xe0,0xd, 0x37,0xa1, +0x3e,0x9b,0x5, 0x40,0xb4,0xd, 0xe7,0xff,0x0, 0xbe,0xe0,0x1, 0xb7,0x85,0xe7,0xff, +0x0, 0x98,0xb7,0xf5,0xe7,0xff,0x0, 0x8b,0xe0,0x0, 0xc0,0x50,0xb, 0xe1,0x89,0x14, +0x8f,0xb4,0xe7,0xfd,0x0, 0xbe,0x3c,0x69,0x39,0xe9,0xe7,0xfe,0x0, 0x81,0xe0,0x1, +0x1f,0xd1,0xe0,0x1, 0x1c,0x3e,0xa4,0x8f,0xe7,0xd1,0x0, 0x96,0x8, 0xb1,0xe0,0x1, +0xd1,0xaa,0x2c,0x5, 0xe0,0x2, 0x1f,0xfa,0xac,0xf, 0x8, 0xe1,0xe0,0x2, 0x1f,0xfa, +0x17,0x1, 0xaf,0xf, 0x8, 0xe1,0x8, 0xb1,0xe0,0x1, 0x1f,0xd1,0xe0,0x1, 0x1c,0x3e, +0xa4,0x8f,0xef,0xfe,0xd8,0x81,0xde,0x82,0xdc,0xa, 0xdc,0x4e,0xe0,0x1, 0xd1,0x93, +0x2c,0x5, 0xe0,0x2, 0x1f,0xfa,0xac,0xf, 0x8, 0xe1,0xe0,0x2, 0x1f,0xfa,0x17,0x1, +0xaf,0xf, 0x8, 0xe1,0xea,0x12,0x7f,0x98,0xe0,0x1, 0x17,0x2a,0xe0,0x2e,0x3c,0xe, +0xa6,0x8f,0x27,0x2, 0x26,0x89,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1f,0x2e,0x1, 0xe, +0x17,0xea,0xaf,0x8e,0x38,0x82,0xe0,0x1, 0x1f,0x2e,0x8e,0x8e,0xc6,0xff,0xae,0x8e, +0x16,0x80,0xbe,0x8f,0x17,0xea,0xaf,0x8e,0x38,0x82,0xe2,0x0, 0xcc,0x9, 0x1, 0xf9, +0x16,0x82,0xbe,0x8f,0x0, 0xee,0xe2,0x1, 0xcc,0x6b,0x1, 0x22,0xea,0x12,0x7f,0x14, +0x8e,0xe, 0x16,0x81,0x3e,0x9c,0xea,0x1a,0x7f,0xdc,0xe2,0x1, 0xc6,0xff,0xe9,0xff, +0xc7,0xff,0xe2,0x0, 0xce,0x83,0x3f,0x9c,0x8c,0xf, 0x1, 0x8c,0x16,0x80,0xea,0x12, +0x7f,0x98,0xae,0x8e,0x17,0x0, 0xbf,0xf, 0x17,0x6b,0xe0,0x1, 0x1f,0xae,0xaf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0xae,0xae,0x8e,0x17,0x6b,0xaf,0xf, 0x38,0x82,0xea,0x12, +0x7f,0x94,0x17,0x1, 0xaf,0xf, 0x17,0x6b,0xe0,0x1, 0x1f,0xae,0xaf,0xf, 0x38,0x82, +0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0x5, 0x82,0x38,0x82, +0x3c,0x69,0xe7,0xff,0x0, 0xa9,0xe0,0x1, 0x1f,0xfd,0xea,0x12,0x7f,0x16,0x8c,0xf, +0xe0,0xd, 0x34,0x22,0x9f,0x8e,0xc6,0x81,0x3f,0xfd,0x5, 0x4, 0xe0,0x1, 0x14,0x7f, +0x38,0x82,0xc7,0x81,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xb7,0x8e,0x1, 0xb, +0xe2,0x0, 0xcf,0x82,0x1, 0x76,0xe0,0x2, 0x1f,0x74,0xa7,0xe, 0x3f,0x9e,0xe0,0x40, +0x8c,0x3f,0x38,0x82,0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0x8c,0x3f,0x38,0x82,0xe0,0x1, +0x1e,0xe0,0x17,0x6, 0xac,0xd, 0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f, +0xe2,0x0, 0xc7,0x5, 0x27,0xc, 0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0x85,0x17,0x1, +0xe0,0x4, 0xaf,0x7f,0x5, 0x8a,0x17,0x80,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1f,0x85, +0x17,0x3, 0xe0,0x4, 0xaf,0x7f,0x38,0x82,0x38,0x82,0x8, 0xb3,0x39,0xe9,0x2c,0x1d, +0xe0,0x0, 0x1f,0x23,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0x3a,0xe0,0x1, 0x1e,0xe0, +0x17,0x6, 0xa9,0x8d,0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f,0xe2,0x0, +0xc7,0x5, 0x2f,0x23,0xe0,0x2, 0x1f,0x85,0x17,0x3, 0xe0,0x4, 0xaf,0x7f,0x17,0x1, +0xe0,0x2, 0x1f,0xd8,0xaf,0xf, 0x9, 0xe1,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x81,0x39,0x68,0x5, 0xa1,0xe4,0x1, 0xcc,0x0, 0xe2,0x0, 0xcc,0x6f, +0x5, 0xa3,0xe2,0x1, 0xc9,0x7c,0x1, 0x22,0xe2,0x1, 0xc9,0x7d,0x1, 0x19,0xe0,0x2, +0x1f,0xd8,0x17,0x1, 0xaf,0xf, 0x9, 0xe1,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0x85, +0x17,0x1, 0xe0,0x4, 0xaf,0x7f,0x5, 0xf4,0x17,0x80,0xaf,0x8d,0x0, 0xf1,0xe0,0x2, +0x1f,0x28,0x8f,0xe, 0x2f,0x44,0x9, 0xe1,0x3c,0x69,0xdf,0x1d,0x0, 0xe6,0xe0,0x0, +0x1f,0xa0,0xa9,0x8f,0x9, 0xe1,0xd5,0x9e,0x0, 0xdd,0x3c,0x63,0x9, 0xa1,0xe7,0x83, +0x0, 0xff,0xe0,0x0, 0x24,0x52,0xe2,0x0, 0xcc,0x3, 0x2, 0x91,0xe0,0x0, 0x1f,0x95, +0x8f,0x8f,0xe0,0x0, 0x2f,0xcf,0xe0,0x0, 0x1f,0x13,0xe0,0x1, 0x1e,0xf8,0x3f,0xee, +0xbf,0xd, 0x3c,0x1f,0xe0,0x40,0x8f,0x98,0x3c,0x6f,0x38,0x82,0xe2,0x0, 0xcc,0x5f, +0xe0,0x0, 0x5, 0xc8,0x17,0xad,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x5, 0xc5,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x5, 0xd5,0xe0,0x0, 0x17,0xe7,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x81,0xe0,0x0, 0x5, 0xe6,0xe7,0xff,0x17,0x80,0x3f,0x98,0x3f,0x6f,0xe2,0x1, +0xc7,0x7f,0xe2,0x0, 0xcf,0x6f,0x5, 0xb4,0xe2,0x1, 0xcc,0x7c,0xe0,0x1, 0x1, 0xd, +0xe2,0x1, 0xcc,0x7d,0xe0,0x1, 0x1, 0xf, 0xe2,0x1, 0xcc,0x7e,0xe0,0x1, 0x17,0xff, +0x1, 0x8e,0xe0,0x2, 0x1f,0x8d,0x17,0x5, 0x8f,0x8f,0x3f,0x3f,0xe0,0x2, 0x1f,0xed, +0x3f,0x9e,0x8f,0x8f,0x0, 0x84,0xe0,0x1, 0x1f,0xe0,0x8f,0x8f,0x3c,0x6f,0x38,0x82, +0xe0,0x1, 0x1f,0x2f,0xe0,0x1, 0x1e,0xf8,0x3f,0xee,0xbf,0xd, 0xe7,0xff,0x0, 0xb3, +0xe0,0x1, 0x1f,0xf8,0xa7,0x8f,0xe7,0xff,0x0, 0xae,0xe2,0x1, 0xcc,0x53,0x1, 0x11, +0xe0,0x1, 0x1f,0x2e,0x8f,0x8e,0xc7,0xff,0xaf,0x8e,0xe7,0xfd,0x0, 0xfe,0xe2,0x1, +0xcc,0x0, 0xe0,0x0, 0x1, 0x65,0xe0,0x2, 0x1f,0x5, 0x3f,0x9e,0x8f,0x8f,0x0, 0xdf, +0xea,0x12,0x7f,0x96,0x17,0x0, 0xb7,0xf, 0x0, 0xf1,0xe2,0x1, 0xcc,0x6b,0xe0,0x0, +0x1, 0x46,0xea,0x12,0x7f,0x14,0x8e,0xe, 0x16,0x81,0x3e,0x9c,0xea,0x1a,0x7f,0xdc, +0xe2,0x1, 0xc6,0xff,0xe9,0xff,0xc7,0xff,0xe2,0x0, 0xce,0x83,0x3f,0x9c,0x8f,0x8f, +0x1, 0x25,0xae,0x8e,0x16,0xeb,0xe0,0x1, 0x1f,0x2e,0xae,0x8e,0x0, 0xc0,0xe0,0x2, +0x1f,0x5, 0x16,0xe0,0xe0,0x2, 0x8f,0x8e,0x3e,0x9f,0xe2,0x0, 0xce,0x9f,0x2, 0x9d, +0xe0,0x1, 0x1e,0xaa,0x3f,0x9d,0xe0,0x44,0x8f,0x8f,0xe0,0x2, 0x8e,0x8e,0xe2,0x1, +0xcc,0x1a,0xc6,0x81,0xe0,0x2, 0xae,0x8e,0xe7,0xff,0x1, 0xaa,0xe0,0x1, 0x1f,0x2e, +0xe7,0xff,0x16,0x99,0xae,0x8e,0xe7,0xff,0x0, 0xa3,0xea,0x12,0x7e,0x98,0x16,0x0, +0xae,0xe, 0x17,0x0, 0xbf,0xd, 0x0, 0xd7,0xe0,0x1, 0x1f,0xa3,0xe0,0x2, 0x8e,0x8e, +0xe3,0xff,0xc7,0xff,0x3f,0x9d,0x8f,0x8f,0x0, 0xe1,0xea,0x12,0x7f,0x94,0x17,0x1, +0xaf,0xf, 0x3f,0xe8,0x0, 0xc8,0xe0,0x2, 0x1f,0x85,0xe0,0x4, 0x8f,0xff,0xe7,0xff, +0x0, 0x87,0xe0,0x0, 0x1f,0xa0,0x8f,0x8f,0xe7,0xff,0x0, 0x82,0xe7,0xd9,0x0, 0xd6, +0xe0,0x1, 0x1f,0xe0,0x9f,0x8f,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x86,0xe2,0x0, +0xcf,0x84,0x1, 0x5, 0x14,0x0, 0x38,0x82,0xe7,0xfe,0x0, 0x9d,0xe7,0x74,0x0, 0xf7, +0xe0,0x1, 0x1f,0xe0,0x9f,0x8f,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x85,0xe2,0x0, +0xcf,0x84,0x1, 0x4, 0x38,0x82,0xe7,0xfd,0x0, 0xba,0xe7,0x6f,0x0, 0xed,0x8, 0xb4, +0xe0,0x0, 0x1f,0xac,0xa1,0xf, 0xa7,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x97,0xa7,0x2, +0x17,0xfe,0x3f,0x5f,0xea,0x12,0x7f,0x9e,0xbf,0x2, 0x8f,0xf, 0x27,0x22,0xe0,0x0, +0x1a,0x23,0xe0,0x1, 0x19,0xae,0x17,0x81,0x8c,0xf2,0xaf,0x84,0x8c,0x3, 0xdf,0xd9, +0x17,0x0, 0xaf,0x4, 0x8f,0x83,0xc7,0x81,0xaf,0x83,0xa7,0x82,0x37,0xc1,0xe2,0x0, +0xc7,0x81,0x2f,0x82,0xa, 0x61,0xa7,0x2, 0x16,0xfd,0xe0,0x1, 0x1f,0xae,0x3f,0x5d, +0xbf,0x2, 0x8f,0xf, 0xc7,0x1, 0xaf,0xf, 0x8c,0xf, 0xdf,0xb3,0xac,0x72,0xa, 0x61, +0x17,0x1, 0xaf,0xf, 0x87,0x72,0xe0,0x1, 0x1f,0xae,0xaf,0xf, 0x8c,0xf, 0xdf,0xa9, +0xac,0x72,0xa, 0x61,0xe0,0x0, 0x1f,0xac,0x16,0x7e,0xa6,0x8f,0xea,0x12,0x7f,0x9e, +0xa7,0x3d,0x3f,0x5c,0xbf,0x3d,0x17,0x0, 0xaf,0xf, 0x38,0x82,0x8, 0xb4,0xe0,0x1, +0x1a,0x2f,0xe0,0x1, 0x19,0xe0,0x11,0x0, 0x15,0x3e,0xe0,0x1, 0x14,0xff,0x3c,0x64, +0xa9,0x3, 0xe0,0x4, 0xd8,0x2b,0xe0,0x0, 0x1c,0x13,0x15,0x3e,0xe0,0x1, 0x14,0xff, +0xe0,0x4, 0xd8,0x24,0xe0,0x1, 0x1f,0xf8,0xba,0xf, 0xef,0xfd,0xd0,0x7a,0xea,0x12, +0x7f,0x9e,0xe0,0x1, 0x1f,0x2e,0xa9,0xf, 0xe0,0x0, 0x1f,0xac,0xa9,0xe, 0xa7,0x8f, +0x81,0x83,0xa9,0xff,0xa, 0x61,0x0, 0x0, 0x8, 0xb2,0xe0,0x0, 0x14,0x50,0xe0,0x2, +0xdb,0x75,0xe0,0x0, 0x14,0xda,0x39,0x68,0xe0,0x0, 0x14,0x50,0xe0,0x2, 0xdb,0x8c, +0xe1,0xd, 0x14,0x6, 0xe0,0x2, 0xdb,0x6a,0xe0,0x0, 0x14,0xff,0x3c,0xd8,0xe0,0x1, +0xcc,0x80,0xe1,0xd, 0x14,0x6, 0xe0,0x2, 0xdb,0x7f,0xe2,0x0, 0xc9,0x5a,0x1, 0x6, +0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x2, 0xdb,0x77,0xe0,0x0, 0x14,0xda,0x14,0x4, +0xe0,0x2, 0xdb,0x72,0xe0,0x0, 0x14,0xda,0x14,0x5, 0x9, 0x21,0xe0,0x56,0x0, 0xec, +0x8, 0xb4,0xe0,0x1, 0x19,0xff,0x15,0x4, 0x3c,0xe3,0x14,0x0, 0xef,0xfd,0xd6,0x22, +0x9d,0x13,0x17,0xf8,0x3f,0x9a,0xe2,0x1e,0xcf,0xf7,0x12,0x0, 0x2, 0x96,0x11,0x7e, +0x39,0x1a,0xe3,0xff,0xc1,0x7f,0x3c,0xe3,0x3d,0x62,0x14,0x2, 0x99,0x83,0xef,0xfd, +0xd6,0x11,0xe0,0x1, 0x1c,0x7e,0x3d,0xe4,0x3d,0x64,0xe0,0x9, 0x31,0x41,0x34,0x41, +0xe0,0x2, 0xdf,0xcc,0xe0,0x24,0x39,0x88,0x3c,0x64,0xa, 0x61,0xe0,0x2, 0x1f,0xa8, +0x8f,0x8f,0x27,0x8f,0x8, 0xb2,0xe0,0x0, 0x19,0x28,0xdf,0xd3,0xac,0x2, 0x8f,0x82, +0x2f,0x87,0xdf,0xcf,0xac,0x2, 0x8f,0x82,0x2f,0x83,0xdf,0xcb,0xac,0x2, 0x9, 0x61, +0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8a, +0xe0,0x2, 0x1f,0x81,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0x5, 0x82,0x38,0x82,0xe0,0x2, 0x1f,0x8d,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xfa, +0x8, 0xb4,0xe0,0x2, 0x19,0x72,0x9f,0x82,0xe2,0x0, 0xcf,0x82,0x2, 0x82,0xa, 0x61, +0xe0,0x0, 0x1f,0x9e,0xeb,0xe6,0x79,0x98,0x9c,0xf, 0xe0,0x4, 0xd7,0xc2,0xe0,0x4, +0xd7,0xc4,0xe0,0x0, 0x14,0xff,0xe0,0x4, 0xd5,0x3f,0xe0,0x1, 0x17,0x8b,0x3f,0x98, +0xe0,0x0, 0x14,0x50,0xb7,0x83,0xe0,0x2, 0xda,0xe1,0x3a,0x68,0xe0,0x0, 0x14,0xda, +0xe0,0x0, 0x14,0x50,0xe0,0x2, 0xda,0xf8,0x8c,0x93,0xe1,0x20,0x14,0x0, 0xe0,0x2, +0xda,0xf3,0x8c,0x83,0xe1,0x20,0x14,0x1, 0xe2,0x0, 0xc4,0x83,0xe0,0x2, 0xda,0xec, +0x14,0x8a,0xe1,0x23,0x14,0x4, 0xe0,0x2, 0xda,0xe7,0xe2,0x0, 0xca,0x5a,0x1, 0x6, +0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x2, 0xda,0xdf,0x17,0x80,0xb7,0x82,0xa, 0x61, +0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8b,0xe0,0x2, +0x1f,0x81,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x1, 0x6, 0x27,0x8c,0xe2,0x0, 0xcf,0x81, +0x1, 0xe, 0x38,0x82,0xe0,0x2, 0x1f,0xfd,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x7, +0x2f,0xf9,0xe0,0x1, 0x14,0xc8,0x14,0x0, 0xe0,0x54,0x0, 0xc3,0xe0,0x1, 0x14,0xc8, +0x14,0x1, 0xe0,0x54,0x0, 0xbe,0x3f,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe0,0x1, +0x1f,0xb1,0xe0,0x1, 0x1f,0x6c,0x16,0x0, 0xa7,0x8f,0xae,0xe, 0xe0,0x1, 0xa7,0xff, +0x37,0xc2,0xe2,0x0, 0xc7,0x81,0x27,0x95,0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1e,0xee, +0xa7,0x8f,0xa6,0xd, 0xa6,0x9f,0xce,0x90,0xbe,0x9f,0xe0,0x0, 0x16,0xd4,0xb6,0xdc, +0x8e,0xfc,0x16,0x6f,0xe2,0x0, 0xc6,0x83,0xae,0x8e,0xa6,0x9f,0x3e,0xdc,0xbe,0x9f, +0xe0,0x2, 0x1b,0xa8,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x5d,0x8f,0xe, +0xe0,0x1, 0x27,0x1b,0xe0,0x0, 0x1f,0x28,0x8a,0xe, 0xe0,0x0, 0x22,0x72,0xe0,0x1, +0x1f,0xde,0x12,0x3, 0xa2,0x8f,0xe0,0x2, 0x1f,0xee,0xe0,0x1, 0x19,0xff,0xa1,0xf, +0xf0,0x0, 0x17,0x54,0xf0,0x40,0x3e,0xe4,0xf0,0x0, 0x14,0x50,0xf0,0x0, 0x16,0x5a, +0x13,0x5, 0xf7,0x24,0x15,0x82,0xf7,0x24,0x15,0x3, 0xf7,0x24,0x14,0x84,0xa7,0x95, +0xcf,0x90,0xbf,0x95,0x17,0xf8,0x9c,0x3, 0x3f,0x98,0xe2,0x1e,0xcf,0xf8,0xe0,0x1, +0x2, 0x96,0xf0,0x0, 0xb7,0x52,0xc4,0x7e,0xf0,0x0, 0xae,0xb2,0xe3,0xff,0xc4,0x7f, +0xf0,0x0, 0xb4,0x52,0xe2,0x0, 0xcc,0x8, 0xf0,0x0, 0xae,0x32,0xe0,0x0, 0x5, 0xeb, +0x16,0x80,0xf7,0xff,0x13,0xfd,0x3f,0x6d,0x17,0x88,0x3e,0x6d,0xf0,0x17,0x3b,0x98, +0x26,0x21,0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0xf0,0x40,0x3b,0x6c,0xe0,0xb, 0x39,0x9f, +0x8c,0x8b,0x15,0x83,0x15,0x1, 0x3d,0x9d,0xb7,0x52,0x3d,0x1e,0xe8,0x40,0x3d,0xf6, +0xc7,0x81,0x3f,0x6a,0xac,0xb2,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc7,0xff,0xe0,0x0, +0x3, 0x47,0xf0,0x2e,0x3b,0x9f,0xe0,0x0, 0x27,0x46,0xe1,0x2e,0x3c,0x1f,0xe0,0x0, +0x27,0x42,0xe0,0xc, 0x39,0x9f,0x8d,0xc, 0x8d,0xac,0x8f,0x1c,0x8e,0xbc,0x35,0x28, +0xe0,0xc, 0x35,0xa8,0x3e,0x9c,0x3f,0x1a,0xc7,0x84,0xe3,0xff,0xc7,0x7f,0xe3,0xff, +0xc6,0xff,0xe3,0xff,0xc7,0xff,0xf0,0x40,0x3b,0x66,0x16,0x5, 0x0, 0xd0,0xe0,0x1, +0x1f,0x5e,0xa2,0x8e,0xe0,0x2, 0x1f,0x6e,0xa1,0xe, 0xe0,0x0, 0x2f,0xcc,0xa7,0x15, +0xe0,0x0, 0x16,0xd0,0xcf,0x10,0xbf,0x15,0xe0,0x0, 0x16,0x5a,0xb6,0xd2,0xe7,0x24, +0x17,0x10,0xae,0x32,0xb7,0x52,0xaf,0xb2,0xb6,0xd2,0x17,0x6f,0xaf,0xb2,0xa7,0x95, +0x3f,0xde,0xbf,0x95,0x22,0x9, 0xdf,0x1d,0xe0,0x2, 0x1f,0x3a,0x17,0x87,0xaf,0x8e, +0xe0,0x2, 0x1f,0x3b,0xaf,0x8e,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x3c,0x7f,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0xb5,0xd2,0xe7,0x24,0x16,0x5, 0x8f,0xf2,0xf0,0x0, 0xb5,0x52, +0xe4,0xd, 0x37,0xa8,0x8f,0xf2,0xf0,0x0, 0xb4,0xd2,0xe4,0xf, 0x37,0xa0,0x8f,0x72, +0xb6,0x52,0x3f,0x9d,0x8e,0xf2,0x37,0x28,0x3f,0x9d,0xa6,0x93,0x3f,0x9e,0xf0,0x0, +0xb4,0x52,0x17,0x0, 0x3f,0xfd,0xaf,0x32,0x1, 0x22,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xc2,0x7f,0xbf,0x95,0xe2,0x1, 0xc2,0x7f,0xe7,0xfe,0x2a,0x5b,0x8f,0x87,0xe7,0xff, +0x27,0xb8,0xa7,0x95,0xe0,0x0, 0x17,0x50,0xcf,0x90,0xbf,0x95,0xe0,0x0, 0x16,0x5a, +0xb7,0x52,0xe7,0x24,0x16,0x90,0xae,0x32,0x17,0x80,0xb6,0xd2,0xaf,0xb2,0xb7,0x52, +0xe7,0xff,0x0, 0xb5,0x86,0xe, 0xae,0xe, 0xe7,0xfe,0x0, 0xa3,0xe0,0x0, 0x17,0xf0, +0xb7,0xd2,0x16,0x2a,0xae,0x32,0x3c,0x66,0xef,0xfd,0xdb,0x61,0xe0,0x0, 0x16,0xf6, +0xb6,0xd2,0xe0,0x0, 0x17,0x75,0x8f,0xf2,0xb7,0x52,0x37,0xa8,0x8e,0xf2,0x9f,0x13, +0x3f,0x9d,0xe3,0xff,0xc7,0xff,0x3f,0x7f,0x1, 0xc9,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xbf,0x95,0x12,0x1, 0x8f,0x87,0x0, 0xcc,0x8, 0xb3,0x39,0x68,0xe0,0x0, 0x14,0x50, +0xe0,0x2, 0xd9,0x6c,0x39,0xe8,0xe0,0x0, 0x14,0xda,0xe0,0x0, 0x14,0x50,0xe0,0x2, +0xd9,0x83,0x3c,0x62,0xe0,0x2, 0xd8,0xed,0xe2,0x0, 0xc9,0xda,0x39,0x68,0x1, 0x6, +0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x2, 0xd9,0x77,0x3c,0x62,0x9, 0xe1,0x8, 0xb1, +0xc0,0x7c,0x15,0x2, 0x14,0x86,0x3c,0x90,0x3c,0x6a,0xef,0xfd,0xd4,0x2b,0x5c,0x3, +0x15,0x2, 0xe2,0x0, 0x7c,0x84,0xef,0xfd,0xd4,0x25,0x4f,0x4, 0x4f,0x85,0x3f,0x9e, +0xe2,0x1, 0xcf,0xff,0xe0,0x2, 0x1f,0x85,0x1, 0x2, 0x17,0x7f,0xe0,0xc, 0xaf,0x4f, +0xc0,0x4, 0x8, 0xe1,0xe0,0x0, 0x1f,0xa0,0x8f,0x8f,0xe2,0x0, 0xcf,0xda,0x1, 0x2, +0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf,0x37,0xcf,0xe2,0x0, 0xc7,0x81, +0x2f,0xf8,0xe7,0xfb,0x0, 0xb3,0xe0,0x0, 0x1f,0xa0,0x8f,0x8f,0xe2,0x0, 0xcf,0xda, +0x1, 0x2, 0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa7,0x8f,0xa7,0xcf,0x37,0xcf,0xe2,0x0, +0xc7,0x81,0x2f,0xf8,0xe7,0xfb,0x0, 0xa2,0xe0,0x1, 0x1f,0xa3,0xe0,0xa, 0x8f,0xdf, +0x27,0xab,0xe0,0x1, 0x1f,0x9d,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xbf, +0xe0,0x0, 0x1, 0x65,0x8f,0x6f,0x37,0x26,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe2,0x0, +0xcc,0x3f,0x2, 0x9b,0xe0,0x1, 0x1f,0x85,0xe0,0x1, 0x1f,0x4, 0x8f,0x8f,0x8f,0xe, +0xe0,0xd, 0x37,0xa8,0x17,0xbf,0xe0,0x8, 0x3f,0xa8,0xe0,0xf, 0x3f,0x4d,0xe0,0x1, +0x1f,0x3, 0x3f,0xb8,0x8c,0xe, 0x37,0xc8,0x3f,0xf8,0x3f,0x68,0xe0,0x6e,0x3d,0xaf, +0x3c,0x2e,0xe3,0xff,0xc4,0x7f,0x38,0x82,0xe0,0x1, 0x1f,0x82,0xe0,0x1, 0x1e,0x81, +0x8f,0x8f,0xc7,0x41,0x8e,0x8d,0x3c,0x7e,0x37,0xa8,0xe0,0xc, 0x3e,0xcf,0x3, 0x3d, +0xe0,0x1, 0x1f,0x80,0xe0,0x0, 0x1f,0x7f,0x8d,0x8f,0x8e,0x8e,0xe0,0x0, 0x1f,0xfe, +0xe0,0x0, 0x1f,0x7d,0x35,0xa8,0x8f,0x8f,0x3e,0xcb,0x8f,0xe, 0x3c,0x7d,0x37,0xa8, +0x3f,0x4f,0xe0,0x0, 0x3, 0x46,0xe0,0x0, 0x1f,0xfc,0xc6,0xff,0x8d,0x8f,0xe0,0x0, +0x1f,0xfb,0x35,0xa8,0x8f,0x8f,0x3e,0xa8,0xe0,0x8, 0x3f,0xcb,0x3e,0xb8,0xc7,0x7f, +0x36,0xc8,0x3f,0x2d,0xe0,0x1, 0x1f,0x83,0x8c,0xf, 0x3f,0x78,0x4, 0xcb,0xe0,0x0, +0x1f,0xfa,0x3c,0x6e,0x8f,0x8f,0xe0,0xf, 0x3e,0x2f,0x3e,0xef,0xe3,0xff,0xc6,0xff, +0x3f,0x7d,0xe0,0x68,0x3a,0xaf,0xe7,0xff,0x0, 0xbe,0x8f,0x7f,0x37,0x26,0xc7,0x7f, +0xe3,0xff,0xc7,0x7f,0xe7,0xff,0x0, 0x9d,0xe0,0x0, 0x1f,0xf9,0xe0,0xe, 0x3c,0x2e, +0x8e,0x8f,0xe0,0x0, 0x1f,0xf8,0x36,0xa8,0x8f,0x8f,0xe0,0x8, 0x3f,0xcd,0xe0,0x0, +0x1f,0xfa,0x3c,0x3e,0x8f,0x8f,0xe0,0xe, 0x34,0x48,0x3f,0x7f,0x16,0xff,0x3e,0x9f, +0xe0,0x6e,0x3b,0xad,0xe0,0x8, 0x3e,0x2f,0x3c,0x1e,0xe7,0xff,0x0, 0x9c,0xe0,0x0, +0x1f,0xf7,0xe0,0xd, 0x3c,0x2d,0x8d,0x8f,0xe0,0x0, 0x1f,0xf6,0x35,0xa8,0x8f,0x8f, +0xe0,0x8, 0x3f,0xcb,0x3e,0xb8,0x36,0xc8,0x3f,0x1d,0xe7,0xff,0x0, 0xbd,0xe0,0x1, +0x1f,0xa3,0x3e,0xe8,0xe0,0xa, 0x8f,0xdf,0x27,0xaa,0xe0,0x1, 0x1f,0x9d,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xbf,0xe0,0x0, 0x1, 0x58,0x8f,0x7f,0x37,0x26, +0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe2,0x0, 0xce,0xbf,0x2, 0x9a,0xe0,0x0, 0x1f,0xf5, +0xe0,0x0, 0x1f,0x74,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x17,0x3f,0x3f,0x2d,0xe0,0xd, +0x3c,0x4f,0xe0,0x0, 0x1f,0xf3,0x3f,0x3d,0x8c,0xf, 0x37,0x8, 0x3f,0x78,0x3f,0xe8, +0xe0,0x6f,0x3d,0x2e,0x3c,0x2f,0xe3,0xff,0xc4,0x7f,0x38,0x82,0x38,0x82,0xe0,0x0, +0x1e,0x72,0xe0,0x0, 0x1f,0xf1,0x8c,0xc, 0x16,0x41,0x8f,0x8f,0x3e,0x1e,0x3e,0xfc, +0x37,0xa8,0xe0,0xb, 0x3c,0x4f,0x3, 0x30,0xe0,0x0, 0x1f,0xf0,0x8e,0xf, 0xe0,0x0, +0x1f,0xef,0x36,0x28,0x8c,0xf, 0xe0,0x0, 0x1f,0xee,0x34,0x28,0x8f,0xf, 0xe0,0x0, +0x1f,0xed,0x3f,0x4c,0x8f,0x8f,0x3e,0xfe,0x3f,0xc8,0xe0,0x0, 0x3, 0x4a,0xe0,0x0, +0x1e,0x6c,0xe0,0x0, 0x1d,0x6b,0x8e,0xc, 0x8c,0xa, 0x36,0x28,0x3c,0x4c,0x3f,0x2d, +0x3f,0x38,0x14,0x7f,0x3c,0x1f,0x37,0x8, 0x3c,0x2e,0xe0,0x0, 0x1f,0xf3,0x8f,0x8f, +0x3c,0x7f,0x3, 0x2b,0x3c,0x6f,0x38,0x82,0x8f,0x6f,0x37,0x26,0xc7,0x7f,0xe3,0xff, +0xc7,0x7f,0xe7,0xff,0x0, 0xaa,0x17,0xe2,0x3f,0x9e,0x3e,0xff,0x14,0x0, 0xe7,0xff, +0x3, 0x3f,0xe0,0x0, 0x1f,0xea,0xe0,0x0, 0x1e,0x69,0x8f,0x8f,0x8c,0xc, 0xc7,0x40, +0x37,0xa8,0xe0,0xe, 0x3e,0xae,0x3c,0x4f,0xe0,0x0, 0x1f,0xe8,0x3f,0x38,0x8f,0x8f, +0x37,0x8, 0x3f,0x7f,0x16,0xff,0x3e,0x9f,0xe0,0x6e,0x3b,0x2d,0xe0,0x8, 0x3d,0xaf, +0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x38,0x82,0xe0,0x0, 0x1f,0xe8,0x8f,0x8f,0xe0,0xf, +0x3d,0xaf,0x3f,0xf8,0xe0,0x68,0x3d,0x2f,0xe3,0xff,0xc4,0x7f,0x38,0x82,0xe0,0x0, +0x1e,0x67,0xe0,0x0, 0x1d,0x66,0x8e,0xc, 0x8c,0xa, 0x36,0x28,0x3c,0x4c,0xe0,0xe, +0x3e,0xae,0x3f,0x38,0xe0,0x8, 0x37,0x8, 0x3c,0x1f,0xe7,0xff,0x0, 0xb8,0x8, 0xb3, +0xe0,0x2, 0x1f,0xa0,0x8f,0x8f,0x2f,0xb2,0xe0,0x2, 0x1f,0x1f,0xe0,0x2, 0x1e,0x99, +0x8f,0xe, 0xaf,0x8d,0x2f,0x37,0xe0,0x1, 0x1f,0x9c,0x15,0xa, 0x89,0x8f,0xe0,0x2, +0x1c,0xa1,0x3d,0x33,0xe0,0x2, 0x1c,0x1c,0xe0,0x4, 0xd4,0x16,0xe0,0x1, 0x1f,0xa3, +0xe0,0xa, 0x8f,0xdf,0x27,0x9a,0x21,0x99,0xc1,0xff,0x39,0x63,0xe2,0x1, 0xc1,0x7f, +0x11,0x81,0x39,0x92,0x17,0x8a,0xe0,0x2, 0x19,0x21,0x3f,0xb3,0x39,0xe2,0x39,0x9f, +0x9c,0x2, 0xc1,0xa, 0xde,0x8a,0xe0,0x5, 0xb4,0x52,0xe0,0x40,0x9c,0x42,0xdf,0x28, +0x39,0x73,0xe0,0x5, 0xb4,0x62,0x1, 0xf5,0x9, 0xe1,0xe0,0x2, 0x1f,0x1f,0xe0,0x2, +0x1e,0x99,0x17,0x81,0x8f,0xe, 0xaf,0x8d,0x2f,0x4f,0xe0,0x2, 0x1f,0x1e,0xaf,0x8e, +0x0, 0xcb,0xe0,0x2, 0x1f,0x18,0x16,0x81,0xae,0x8e,0xe0,0x2, 0x1f,0x17,0xaf,0x8e, +0x0, 0xc3,0xe0,0x0, 0x1e,0x38,0x8f,0x8c,0x2f,0x97,0xea,0x12,0x7f,0xac,0x9e,0x8f, +0xe0,0x1, 0x1f,0x2d,0x2e,0x8a,0xe0,0x1, 0x1e,0x96,0x8e,0xd, 0xe0,0x1, 0x1e,0x95, +0x36,0x28,0x8e,0x8d,0x3e,0xcc,0xb6,0x8f,0xe0,0x2, 0x1e,0xa0,0x8e,0x8d,0x26,0xa0, +0x97,0x8f,0xb7,0x9e,0x38,0x82,0xe0,0x2, 0x1f,0x85,0xe0,0x1, 0x1f,0x2d,0x8e,0x8f, +0x8c,0x1f,0x8c,0xaf,0x8d,0x3f,0x8d,0xdf,0xea,0x12,0x7f,0xac,0x36,0xa5,0x34,0x25, +0x34,0xa5,0x35,0x25,0x35,0xa5,0xf0,0x0, 0x13,0x80,0xf0,0x0, 0xab,0x8c,0xb6,0x9e, +0xb4,0x2e,0xb4,0xce,0xb5,0x5e,0xe0,0x1, 0xb5,0x9e,0xb6,0x8f,0x0, 0xd4,0xe0,0x1, +0x1f,0x87,0x8e,0x8f,0xe0,0x1, 0x1f,0x86,0x36,0xa8,0x8f,0x8f,0x3f,0xcd,0xb7,0x9e, +0x38,0x82,0x17,0xdd,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8c,0x2, 0x9b, +0x17,0x1, 0xe0,0xf, 0x37,0x3f,0xe2,0x30,0xc7,0xa9,0x2f,0x9d,0xe2,0x0, 0xcc,0x25, +0x1, 0x92,0xe0,0x0, 0x1f,0xa3,0x8f,0x8f,0x3f,0xfe,0x1, 0x16,0xe0,0x2, 0x1f,0x5, +0x17,0x81,0xe0,0x4, 0xac,0xde,0xe0,0x0, 0x1f,0x38,0xaf,0x8e,0xe0,0x2, 0x1f,0x22, +0xaf,0x8e,0x38,0x82,0xe0,0x2, 0x1f,0x85,0x17,0x1, 0x3c,0x1f,0xe0,0x0, 0x1f,0xb8, +0xac,0x88,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xa8,0x8f,0x8f,0x2f,0xe8,0x0, 0xfb, +0xe0,0x43,0x3f,0x9, 0x3f,0x7a,0x2, 0x23,0xe0,0x2, 0x1f,0xbf,0xf0,0x0, 0x8b,0x5f, +0xe0,0x1, 0x1f,0xd1,0xf0,0x0, 0xa3,0x8f,0xe8,0xf, 0x3f,0x36,0x3f,0x98,0x37,0xa1, +0xe8,0xf, 0x3f,0x97,0x97,0x8f,0x3f,0xfb,0x4, 0x7, 0xe0,0x0, 0x0, 0xf4,0x97,0x8f, +0x3f,0xfb,0xe0,0x0, 0x3, 0x70,0xc7,0x1, 0xe0,0x43,0x3f,0xe, 0xe8,0xf, 0x3f,0x36, +0x3f,0x7a,0x3f,0x98,0x37,0xa1,0xe8,0xf, 0x3f,0x97,0x5, 0x72,0x17,0x7f,0x3f,0x19, +0xe2,0x1, 0xc7,0x7f,0xe0,0x43,0x3d,0xe, 0xe2,0x0, 0xcd,0x0, 0x4, 0x25,0xe0,0x2, +0x1f,0xbf,0xf0,0x0, 0x8b,0x5f,0xe0,0x1, 0x1f,0xd1,0xf0,0x0, 0xa3,0x8f,0xe8,0xf, +0x3d,0x36,0x3f,0x98,0x37,0xa1,0xe8,0xf, 0x3f,0x97,0x97,0x8f,0x3f,0xfb,0x3, 0x5, +0x0, 0x94,0x97,0x8f,0x3d,0xff,0x2, 0x11,0x17,0x7f,0x3f,0x1a,0xe2,0x1, 0xc7,0x7f, +0xe0,0x43,0x3d,0xe, 0xe8,0xf, 0x3d,0x36,0xe3,0xff,0xcd,0x7f,0x3f,0x98,0x37,0xa1, +0xe8,0xf, 0x3f,0x97,0x1, 0xef,0x17,0x0, 0xe0,0x1, 0x1f,0xa3,0xaf,0xc, 0xc4,0x81, +0xe0,0xe, 0x8f,0x1f,0xe0,0x43,0x3c,0x89,0x3f,0x79,0x5, 0x1e,0xe0,0x2, 0x1f,0xbf, +0xf0,0x0, 0x8b,0xdf,0xe0,0x1, 0x1f,0xd1,0xa5,0xf, 0xe8,0xf, 0x3c,0xb7,0x3f,0x98, +0x37,0xa1,0x3f,0x9a,0x97,0x8f,0x3f,0xfb,0x3, 0x5, 0x0, 0x92,0x97,0x8f,0x3f,0xfb, +0x4, 0xf, 0xc4,0x81,0xe0,0x43,0x3c,0x89,0xe8,0xf, 0x3c,0xb7,0x3c,0xfe,0x3f,0x98, +0x37,0xa1,0x3f,0x9a,0x4, 0x74,0x14,0xff,0x3c,0x9e,0xe0,0x43,0x3c,0x89,0xe2,0x1, +0xc4,0xff,0xac,0x8d,0x84,0xc, 0x3c,0xa8,0x14,0x1, 0x3c,0x19,0xe2,0x1, 0xc4,0x7f, +0x38,0x82,0x3c,0xee,0xe2,0x1, 0xc4,0xff,0xe7,0xff,0x0, 0x9a,0xe0,0x0, 0x1f,0xe, +0xe0,0xf, 0x34,0x43,0x3f,0x1f,0xe0,0x0, 0x1f,0xb2,0xe2,0x0, 0xc4,0x7, 0x3f,0x98, +0x87,0x8f,0xe0,0xf, 0x84,0xe, 0x3c,0x5f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x17,0x7, +0xe0,0x0, 0x1f,0xb2,0x3f,0x58,0x3f,0x9e,0xe0,0x0, 0x1f,0xe, 0x34,0x43,0x3c,0x1e, +0x8f,0x8f,0xe0,0xf, 0x87,0x8, 0x2c,0x86,0xe3,0xf, 0x3f,0x5f,0xe0,0xf, 0xaf,0x88, +0x38,0x82,0x3f,0xce,0xe0,0xf, 0xaf,0x88,0x38,0x82,0xe0,0x0, 0x1f,0x8e,0xe0,0x2, +0x1f,0x3f,0x34,0x21,0x3c,0x1f,0x8f,0x88,0x8e,0xde,0x8f,0x18,0x3f,0xbd,0x3f,0x9e, +0xe0,0x1, 0x1f,0x51,0x37,0xa1,0xa7,0xe, 0x3f,0x9e,0x94,0xf, 0x38,0x82,0xe0,0x2, +0x1f,0xbf,0xe0,0x1, 0x1f,0x2d,0x8e,0xef,0x9f,0x9e,0x3e,0xf8,0x2, 0x82,0x9f,0xce, +0x3c,0x6f,0x38,0x82,0xf0,0x0, 0x1a,0x8b,0xe8,0x0, 0x8e,0x5, 0x26,0x3d,0x16,0x0, +0xe0,0x0, 0x1d,0x8e,0xf0,0x0, 0x1b,0x32,0xe0,0x40,0x3f,0xec,0xe0,0xd, 0x37,0xc3, +0x15,0x7, 0x3d,0x5f,0xe2,0x0, 0xc6,0x9f,0x3e,0x9b,0xe8,0xa, 0x3d,0x16,0x85,0xa, +0xe0,0xf, 0x86,0x8d,0xe0,0xe, 0x37,0xa1,0x3e,0xda,0xe0,0x17,0x3d,0x9e,0x14,0x7, +0xe0,0xe, 0x36,0x43,0xe0,0x9, 0x36,0x21,0x3c,0x5c,0xe2,0x0, 0xc7,0x1f,0xc7,0x81, +0x15,0x1, 0xe2,0x1, 0xc6,0xff,0x3c,0x9b,0x3f,0x1b,0xe8,0x8, 0x3c,0x16,0xe2,0x1, +0xc7,0xff,0x3d,0x1c,0x26,0x8d,0xe8,0x0, 0x9e,0x7, 0x86,0x88,0xb6,0x9, 0x3e,0x6a, +0xe0,0xf, 0x85,0xe, 0xe2,0x1, 0xc6,0x7f,0x3e,0xca,0xe0,0xf, 0xae,0x8e,0xe8,0x0, +0x8f,0x5, 0x3f,0x7f,0x2, 0xcc,0xe8,0x0, 0xae,0x5, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x78,0xf0,0x0, 0x1c,0xb, 0xe8,0x0, 0x8f,0x88,0x27,0xa0,0xe0,0x0, +0x1a,0x8e,0xe0,0x0, 0x1b,0xb2,0xe0,0x1, 0x1b,0x23,0xf0,0x1, 0x1e,0xd1,0x11,0x80, +0xe0,0xf, 0x31,0xc3,0x17,0x7, 0xe2,0x0, 0xc7,0x9f,0x3f,0x53,0x3f,0x95,0x3f,0x17, +0xe0,0xf, 0x87,0x8f,0x87,0xe, 0x3f,0xde,0xe2,0x1, 0xc7,0xff,0x2f,0xa4,0xe8,0x0, +0x8f,0x88,0xc1,0x81,0xe2,0x1, 0xc1,0xff,0x39,0xff,0x4, 0xeb,0xdf,0x94,0xea,0x12, +0x7f,0xf1,0x8f,0xf, 0xe0,0x2, 0x27,0x69,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x1, 0x74, +0xe2,0x0, 0xcf,0x2, 0xe0,0x3, 0x1, 0x18,0xe0,0x2, 0x1f,0x9f,0x8f,0xf, 0x2f,0x7, +0xe8,0x0, 0x8f,0x88,0xe0,0x0, 0x1a,0x8e,0xe0,0x2, 0x2f,0xf3,0xc0,0x8, 0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe0,0x1a,0x92,0x75,0xe0,0x19,0x31,0xa1,0xe8,0xf, 0x3a,0x99, +0xe4,0x0, 0xc2,0x5, 0x89,0x1f,0x8d,0xf, 0x32,0x3, 0xe2,0x0, 0x7e,0x8a,0xe2,0x0, +0x7e,0xb, 0x3d,0xe4,0x3c,0xea,0x3c,0x62,0xde,0x94,0x17,0x7f,0x3f,0x12,0xf0,0x40, +0x3e,0x6e,0xf0,0x0, 0x45,0x8b,0xf0,0x0, 0x45,0xa, 0xf2,0x1, 0xc6,0x7f,0xf0,0x0, +0x17,0x0, 0x0, 0x94,0x4d,0xa, 0x4c,0x8b,0xde,0x84,0x17,0x7f,0xe8,0xf, 0x3c,0x1e, +0xe8,0xe, 0x3f,0x1c,0xe2,0x0, 0xcc,0x3, 0xf0,0x40,0x3f,0x6f,0xf0,0x40,0x3e,0x6e, +0xf2,0x1, 0xc7,0x7f,0xf2,0x1, 0xc6,0x7f,0x5, 0x8d,0xe8,0x43,0x3d,0xc, 0xe2,0x0, +0xcd,0x0, 0xe8,0x40,0x3c,0x6c,0xe2,0x0, 0x7e,0x8a,0xe2,0x0, 0x7e,0xb, 0x3d,0xe4, +0x3, 0x62,0xc1,0x1, 0xf0,0x0, 0x6d,0x8b,0xe2,0x1, 0xc1,0x7f,0xf0,0x0, 0x6d,0xa, +0x0, 0x90,0x4d,0xa, 0x4c,0x8b,0xc1,0x1, 0xde,0x5c,0xe8,0xf, 0x3c,0x1e,0xe2,0x0, +0xcc,0x3, 0xf0,0x40,0x3f,0x6f,0xf2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc1,0x7f,0x5, 0x8d, +0xe0,0xe, 0x8f,0x26,0xe0,0x43,0x3d,0x2, 0x3d,0x7e,0x3c,0x62,0xe2,0x0, 0x7e,0x8a, +0xe2,0x0, 0x7e,0xb, 0x3d,0xe4,0x4, 0x66,0xf2,0x0, 0xcf,0x15,0xe7,0xfe,0x5, 0xf9, +0xe8,0x0, 0x8d,0x8, 0xe7,0xfe,0x25,0x7c,0x17,0xeb,0xe8,0xf, 0x3f,0x9e,0xe4,0x0, +0xc7,0x85,0x37,0x84,0xc7,0x83,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x86,0x3c,0xef, +0x5, 0x82,0x14,0x86,0xe0,0x2, 0x1f,0x3f,0xf0,0x19,0x3c,0x95,0x12,0x1, 0xe8,0x0, +0xa1,0xd, 0x8c,0x5e,0xe0,0x0, 0x1e,0xe, 0xe2,0x1, 0xc4,0xff,0xe0,0x0, 0x17,0x80, +0xe8,0x4, 0x3a,0x19,0xe0,0xe, 0x37,0xc3,0x16,0x87,0x3f,0xf3,0x3e,0xdf,0xe2,0x0, +0xc7,0x1f,0x3f,0x15,0x3e,0x97,0xe0,0x0, 0x1, 0x46,0xf0,0xf, 0x8b,0xe, 0xf0,0x0, +0x8a,0x8d,0xf8,0xd, 0x3b,0x55,0x26,0xbe,0x8d,0x8c,0xf8,0x0, 0x8b,0x89,0xe0,0x43, +0x3e,0x8b,0xf8,0x43,0x3a,0x7, 0xe8,0xd, 0x3e,0xa4,0xe4,0x14,0x36,0x8f,0xf2,0xd, +0x3a,0x4d,0xe8,0xd, 0x3e,0xa4,0x3e,0xf9,0x2, 0x2d,0xf0,0x17,0x3b,0xb8,0xf0,0x0, +0x89,0x9c,0xf0,0x0, 0x8a,0x4, 0xe0,0xd, 0x3d,0xb8,0xf8,0xb, 0x3b,0x94,0xf8,0x43, +0x3a,0x4, 0xf8,0x43,0x3b,0x83,0xf8,0x17,0x3b,0xa4,0xf4,0x14,0x33,0x8f,0xfa,0x17, +0x3a,0x47,0xf8,0x17,0x3b,0xa4,0xe8,0xd, 0x3e,0x93,0xe8,0x40,0x3c,0xf7,0x35,0xa1, +0x36,0xa1,0x3d,0x92,0x3e,0x92,0x4, 0xe, 0x95,0x8b,0xf0,0x0, 0x93,0x8d,0x16,0x8b, +0x3e,0xbb,0xfb,0x16,0x3b,0x55,0x36,0x84,0xe8,0x40,0x3e,0xf7,0x5, 0x3, 0xf0,0xf, +0xab,0xe, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0xfa,0xc6,0x2, 0xe7,0xff,0x1, 0xac, +0xe7,0xfe,0x0, 0x81,0xf0,0x2, 0x1d,0x1f,0xe8,0x0, 0x8f,0xa, 0xe0,0x1, 0x27,0x16, +0xe8,0x0, 0x8f,0x8, 0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x9a,0x11,0x80,0xea,0x12, +0x7b,0x70,0xe0,0x0, 0x1a,0x8e,0xf0,0x1, 0x1d,0xd1,0xf0,0x2, 0x1c,0xbf,0xe0,0x0, +0x1a,0x8, 0xf0,0x0, 0x1e,0x7, 0xf0,0x40,0x3e,0xe3,0x13,0x83,0xf0,0x1e,0x36,0xa1, +0xe8,0xf, 0x3a,0x9e,0x8d,0xf, 0xe0,0x1a,0x94,0x75,0x3c,0xe7,0x89,0x1f,0x7d,0x1, +0xe0,0x3, 0xde,0xda,0xe8,0x0, 0x8f,0xd9,0x65,0x1, 0xe8,0x0, 0xa6,0x8b,0x3f,0xba, +0xe0,0x43,0x3c,0x18,0x3f,0x92,0x37,0xa1,0x3f,0x9d,0x97,0x8f,0x3d,0xe2,0x3f,0xf8, +0x3, 0x3, 0x8f,0x86,0x2f,0x8b,0x8c,0x84,0xe8,0x0, 0x8c,0xc, 0xf0,0x1e,0x3f,0x15, +0xef,0xfe,0xd9,0xb, 0x24,0x1a,0xe8,0x0, 0x89,0x1e,0x8f,0x84,0xeb,0xe6,0x7e,0x9c, +0xe0,0x2, 0x3f,0xa2,0xe4,0xc, 0x31,0xf, 0xe2,0x2, 0x3e,0x42,0x39,0x2c,0xe2,0x0, +0xc9,0xa, 0xc1,0x81,0xc7,0x8a,0xe2,0x1, 0xc1,0xff,0x5, 0x7, 0x8e,0x8d,0x17,0x48, +0x3f,0xfd,0xaf,0x6, 0xe0,0x2, 0x4, 0xa, 0x17,0x1, 0xe8,0xe, 0x3f,0x1d,0xe8,0x0, +0x8f,0x88,0xf0,0x40,0x3e,0xee,0xf2,0x1, 0xc6,0xff,0xe8,0x40,0x3f,0xfd,0xe7,0xff, +0x2, 0xb7,0x39,0xff,0x1, 0x16,0x8f,0x86,0x27,0xba,0xc7,0xff,0xaf,0x86,0xe8,0x0, +0x8f,0xa, 0xe7,0xfd,0x0, 0xa6,0xf0,0x2, 0x1d,0x1f,0xe8,0x0, 0x8f,0xa, 0xe2,0x0, +0xcf,0x1, 0xe7,0xfd,0x1, 0x9e,0xaf,0xf, 0xe8,0x0, 0x8f,0x8, 0xe7,0xff,0x0, 0x8c, +0xe0,0x0, 0x1f,0x87,0x16,0x48,0x87,0xf, 0x86,0x84,0xae,0x6, 0x16,0x1, 0xe8,0x0, +0x8f,0x8a,0xe8,0x0, 0xae,0x8, 0xae,0x95,0xaf,0x5, 0xe7,0xfd,0x2f,0x91,0xde,0xb, +0xe8,0x0, 0x8f,0x88,0xe2,0x0, 0xcf,0x81,0xe7,0xfd,0x1, 0x8a,0xeb,0xe6,0x7f,0x9c, +0x87,0x15,0xaf,0xf, 0xe7,0xfd,0x0, 0x84,0xe8,0x0, 0x8f,0x8, 0xe7,0xfe,0x2f,0x6c, +0xea,0x12,0x7f,0x70,0x8f,0xe, 0x2f,0x3, 0x17,0x2, 0xaf,0xf, 0xe8,0x0, 0x8f,0xa, +0xe7,0xfc,0x0, 0xef,0xe8,0x0, 0x8f,0x88,0xf0,0x2, 0x1d,0x1f,0xe2,0x0, 0xcf,0x81, +0x5, 0xf6,0xe0,0x0, 0x1a,0x8e,0xf0,0x2, 0x1d,0x1f,0xe0,0x1, 0x1b,0xd1,0xe0,0x2, +0x1b,0x3f,0xf0,0x0, 0x1c,0xb2,0x11,0x81,0xe0,0x4, 0x31,0xc3,0xe2,0x0, 0xc2,0x1f, +0xe0,0x1d,0x31,0xa1,0xf0,0x1d,0x3e,0x95,0x3a,0x15,0xf0,0x0, 0x17,0x1, 0xf0,0x0, +0x15,0x87,0xf0,0x0, 0x1e,0xe, 0x11,0x0, 0xf8,0x1e,0x3f,0x1d,0xe0,0x0, 0xc2,0x78, +0xf0,0x1b,0x3d,0xd3,0x0, 0xb4,0xe8,0x0, 0x8f,0x8a,0xe2,0x0, 0xcf,0x82,0xe0,0x0, +0x2, 0xd8,0x8f,0xd6,0xa7,0x7, 0x3d,0x3f,0x3c,0x3f,0x3d,0x9a,0x35,0xa1,0x3c,0x98, +0x3d,0x9e,0x34,0xa1,0x3c,0x9e,0x96,0x8b,0x97,0x89,0xe0,0xe, 0x36,0xa1,0x3f,0x7f, +0xe0,0x0, 0x4, 0x61,0x37,0xa1,0xe0,0x40,0x3e,0xff,0x5, 0x11,0xe0,0xf, 0x31,0x43, +0x16,0x87,0xe2,0x0, 0xc7,0x9f,0x3e,0xd2,0x3f,0x95,0xe8,0xd, 0x3e,0x99,0xe0,0xf, +0x86,0xf, 0x87,0xd, 0xe3,0xe, 0x3e,0x5e,0xe0,0xf, 0xaf,0xf, 0xc1,0x1, 0xe2,0x1, +0xc1,0x7f,0x39,0xf2,0xf0,0x0, 0xc6,0x2, 0xe0,0x0, 0x1, 0x54,0xe8,0x0, 0x8c,0xc, +0xe8,0x0, 0x8d,0xd, 0xe0,0x43,0x3f,0x88,0xe0,0x43,0x3f,0xa, 0x3f,0xae,0x17,0x2, +0x3f,0x1f,0xe2,0x0, 0xcf,0x4, 0xe8,0x0, 0x8c,0x9c,0xe8,0x0, 0x8d,0x8e,0x2, 0x8a, +0xe0,0x43,0x3f,0x9, 0xe0,0x43,0x3e,0x8b,0x3f,0x2d,0xc7,0x2, 0xe2,0x0, 0xcf,0x4, +0x5, 0xde,0xc7,0x84,0xe2,0x0, 0xcf,0x88,0x2, 0x8b,0xe0,0x43,0x3f,0x89,0xe0,0x43, +0x3f,0xb, 0x3f,0xae,0xc7,0x84,0xe2,0x0, 0xcf,0x88,0xe7,0xff,0x5, 0xa6,0xef,0xfe, +0xd8,0x1c,0x24,0x4d,0x8e,0xd6,0xe8,0x0, 0x8f,0x8c,0xe8,0x0, 0x8f,0xd, 0x3f,0xbd, +0x3f,0x3d,0xe8,0x0, 0x8d,0x9c,0xe8,0x0, 0x8e,0xe, 0xa6,0x87,0x3f,0x9b,0x3f,0x1c, +0x37,0xa1,0x37,0x21,0x3f,0x9d,0x3f,0x1d,0x96,0x8f,0x97,0x8e,0x3e,0xff,0xe7,0xff, +0x5, 0x27,0xf8,0xf, 0x3c,0x9b,0x87,0x4, 0x87,0x8f,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f, +0xe3,0xf, 0x3f,0x5f,0x39,0xf2,0xaf,0x84,0xf0,0x0, 0xc6,0x2, 0xe7,0xff,0x1, 0xb0, +0xc1,0x81,0xe8,0x0, 0x8f,0x88,0xe2,0x1, 0xc1,0xff,0x3f,0xf3,0xe7,0xfe,0x2, 0xde, +0xe8,0x0, 0x8f,0xa, 0xe7,0xfb,0x0, 0xb5,0x17,0x80,0xe8,0x0, 0xaf,0x88,0xe7,0xfb, +0x0, 0xb7,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0x8, 0xe0,0x0, 0x1f,0xb, +0x13,0x84,0x89,0xe, 0x3b,0x90,0xe0,0x0, 0x1c,0x8e,0xe0,0xa, 0x31,0x21,0x3c,0x67, +0xe0,0x3, 0xdf,0xc2,0xea,0x12,0x7f,0xb0,0x88,0x8f,0xe0,0x2, 0x20,0xe5,0xe0,0x2, +0x1f,0x3f,0xe0,0x1, 0x1f,0xad,0xe0,0x1, 0x1e,0xd1,0xea,0x12,0x79,0xb4,0x12,0x0, +0xf0,0x0, 0xa7,0xd, 0xf0,0x0, 0x8e,0xde,0xf0,0x0, 0x9e,0x1f,0xf0,0x0, 0x8d,0xee, +0xf0,0x0, 0x9d,0x4f,0xf0,0x0, 0x19,0xe, 0xf0,0x0, 0x19,0xb2,0xf0,0x40,0x38,0xe3, +0xe0,0x40,0x3c,0x64,0xf0,0x7, 0x14,0xff,0xf0,0x1, 0x14,0x7f,0xe0,0x0, 0x21,0x7b, +0x16,0x4, 0x3e,0x10,0xe8,0x40,0x3d,0xe9,0xe8,0x40,0x3d,0x68,0xe0,0x0, 0x16,0x80, +0xe0,0xf, 0x36,0xc3,0x17,0x7, 0x3f,0x5d,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0x92, +0xe8,0xe, 0x3f,0x13,0xe0,0xf, 0x87,0x8f,0x87,0xe, 0x14,0x81,0x3f,0xde,0xe2,0x1, +0xc7,0xff,0x3c,0x9d,0x27,0xb4,0x8f,0x8c,0xe2,0x1, 0xcf,0xff,0xf0,0x40,0x3b,0xef, +0x1, 0x2e,0xf8,0x0, 0x8a,0x1, 0xf0,0x0, 0x8b,0x1c,0xf8,0x0, 0x8a,0x91,0xf0,0xf, +0x3a,0x2f,0xe3,0xff,0xc7,0xff,0xf0,0x43,0x38,0x1f,0xf8,0xe, 0x3a,0xa6,0xe3,0xff, +0xc7,0x7f,0xf2,0x0, 0xc8,0x0, 0xf8,0x17,0x3b,0xa4,0xf3,0xff,0xc3,0xff,0xf0,0x43, +0x3a,0x1e,0xe8,0x6f,0x3d,0x27,0xf8,0x16,0x3b,0x25,0xf2,0x0, 0xca,0x0, 0xf3,0xff, +0xc3,0x7f,0xe8,0x6e,0x3d,0x26,0x3f,0x9e,0xe3,0xff,0xc7,0xff,0x3f,0xfb,0x3f,0x6b, +0xe0,0x6e,0x3c,0xaf,0x3f,0xfb,0x3d,0xee,0xe0,0x6a,0x3c,0xad,0x3e,0xe9,0xe2,0x1, +0xc6,0xff,0x39,0x7d,0xc6,0x2, 0xe7,0xff,0x1, 0xb5,0xe2,0x1, 0xcd,0x7f,0x1, 0x22, +0x35,0x21,0x3d,0x17,0x8e,0x8a,0x8e,0x1a,0xe8,0xf, 0x3e,0xbd,0xe8,0x40,0x3e,0xfb, +0x3f,0x9c,0x37,0xa1,0xe8,0xf, 0x3f,0x9e,0xe8,0x40,0x3f,0x6c,0xe8,0x6e,0x3b,0xaa, +0x95,0x8f,0xe0,0x43,0x3f,0x9e,0x3d,0xff,0x4, 0xd, 0xe0,0xf, 0x32,0x21,0xe2,0x0, +0x7f,0x40,0x3f,0x9e,0xc2,0x1, 0xae,0x8f,0xe2,0x1, 0xc2,0x7f,0xae,0x1f,0x17,0xff, +0xaf,0x8a,0xc4,0x1, 0xe2,0x1, 0xc4,0x7f,0x3c,0x71,0xf0,0x0, 0xc0,0x82,0xe7,0xfe, +0x1, 0xff,0xe0,0x1, 0x1f,0x9c,0xf0,0x0, 0x8c,0xf, 0xf0,0x40,0x3c,0x74,0xe0,0x0, +0x5, 0xe6,0xe0,0x1, 0x1f,0xd1,0xe0,0x0, 0x1c,0x8e,0xf0,0x0, 0xa3,0xf, 0xe0,0x2, +0x1f,0xbf,0xe0,0x0, 0x1d,0x32,0x8b,0xdf,0xf0,0x40,0x3b,0xe4,0xf0,0x1, 0x12,0x7f, +0xf0,0x0, 0x12,0x80,0xf7,0xff,0x11,0xff,0xe0,0x0, 0x21,0x49,0x16,0x4, 0x3e,0x10, +0xe8,0x40,0x3d,0xe4,0xe8,0x40,0x3c,0x65,0xe0,0x0, 0x17,0x0, 0xe0,0xf, 0x37,0x43, +0x16,0x87,0x3e,0xde,0xe2,0x0, 0xc7,0x9f,0x3e,0x9a,0x3f,0x99,0x80,0x8d,0xe0,0xf, +0x87,0x8f,0x16,0x81,0x3f,0xd1,0xe2,0x1, 0xc7,0xff,0x3e,0x9e,0x27,0x96,0x88,0x8c, +0xe2,0x1, 0xc8,0xff,0xe0,0xf, 0x38,0xb7,0x1, 0x10,0xf0,0x0, 0x89,0x1c,0xe8,0xf, +0x3f,0x92,0x37,0xa1,0xe8,0xf, 0x3f,0x96,0x97,0x8f,0x3f,0xf8,0x5, 0x6, 0x3d,0xee, +0xe8,0x40,0x3b,0x62,0x3a,0xe1,0x3c,0x6f,0x3f,0x6d,0xe2,0x1, 0xc7,0x7f,0x39,0x7e, +0xc6,0x2, 0x1, 0xd5,0xe2,0x1, 0xcd,0xff,0x1, 0x11,0xe0,0xf, 0x32,0x21,0xe2,0x0, +0x7f,0x40,0x3f,0x9e,0x35,0xa1,0xe2,0x0, 0x7f,0x4, 0x3d,0x9e,0xc2,0x1, 0xaa,0x8f, +0xe2,0x1, 0xc2,0x7f,0xab,0x1f,0xf0,0x0, 0xa9,0x8b,0xf0,0x0, 0xc3,0x81,0xf2,0x1, +0xc3,0xff,0xf8,0x40,0x3c,0x77,0xe7,0xff,0x1, 0xb1,0xe0,0x1, 0x1f,0x97,0xe0,0x0, +0x14,0xc0,0x8d,0xf, 0x3c,0x90,0x35,0x21,0xe2,0x0, 0x7c,0x4, 0xe0,0x3, 0xde,0xa4, +0xf0,0xa, 0x34,0x21,0xe0,0x1, 0x14,0xff,0x3c,0x63,0xe0,0x3, 0xde,0xd7,0x2a,0xc, +0xe0,0x0, 0x1f,0xb, 0xea,0x12,0x7f,0xb0,0xaa,0xf, 0xaa,0xe, 0xe0,0x0, 0xc0,0x78, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x32,0x21,0xe0,0x0, 0x1c,0xe, 0x3d,0x62, +0xe2,0x0, 0x7c,0x84,0xe0,0x3, 0xde,0x88,0x3d,0x62,0xe2,0x0, 0x7c,0x84,0x3c,0x63, +0xe0,0x3, 0xde,0x82,0xe0,0x0, 0x1d,0xe, 0xe0,0x0, 0x1d,0xb2,0xe0,0x0, 0x17,0x80, +0xe0,0xe, 0x37,0xc3,0x16,0x7, 0x3e,0x5f,0xe2,0x0, 0xc7,0x1f,0x3f,0x1a,0x3e,0x1b, +0xe0,0xf, 0x84,0x8e,0x86,0x8c,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3e,0xc9,0x3f,0xf4, +0xe0,0xf, 0xae,0x8e,0x1, 0xee,0xea,0x12,0x7f,0x30,0xf0,0x40,0x3c,0x7f,0xaf,0x8e, +0xe8,0x6f,0x3c,0xa8,0xe0,0x0, 0x1f,0xb, 0xaf,0x8e,0xe0,0x0, 0xc0,0x78,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xea,0x12,0x79,0xb4,0x3a,0x61,0xe7,0xfe,0x0, 0xbc,0x8, 0xb1, +0xe0,0x1, 0x1f,0xad,0xe0,0x3, 0x8f,0x8f,0x2f,0x84,0xef,0xff,0xd2,0x8a,0xdb,0xab, +0xdb,0xaa,0xdb,0xa9,0xd5,0xb5,0xdb,0xa7,0xdb,0xea,0xdb,0xa5,0x8, 0xa1,0xe7,0xfc, +0x0, 0xf2,0x0, 0x0, 0x8, 0xb6,0xc0,0x74,0x3c,0x7a,0xe4,0xf, 0x35,0x28,0xe4,0xe, +0x34,0x28,0x39,0x68,0x4, 0x82,0x39,0x6a,0x3f,0x7f,0x3f,0xe8,0xe0,0x6f,0x3d,0xaa, +0x3c,0xfb,0x38,0xef,0xe2,0x1, 0xc1,0x7f,0xe2,0x1, 0xc0,0xff,0x39,0xeb,0xe4,0xf, +0x35,0xa8,0xe4,0xe, 0x34,0xa8,0x3, 0x82,0x39,0xe9,0x3f,0x7f,0xe2,0x1, 0xc1,0xff, +0x3f,0xe9,0xe0,0x6f,0x3d,0xab,0x3c,0xf3,0xf0,0x40,0x3b,0x6f,0xf2,0x1, 0xc3,0x7f, +0xe0,0x1, 0x1, 0x1e,0x3d,0x72,0xe0,0x1, 0x2, 0x9e,0xf0,0x40,0x3a,0xe2,0xf0,0x0, +0x11,0x81,0xe0,0x1, 0x1f,0xd1,0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0xa2,0xf, 0xe0,0x2, +0x1f,0xbf,0xe0,0x0, 0x1a,0x1d,0xf0,0x0, 0x8b,0xdf,0xf8,0x12,0x39,0x16,0x3c,0xe3, +0x15,0x0, 0xf0,0x1, 0x10,0x7f,0xf7,0x0, 0x10,0x81,0x14,0x7f,0xf0,0x40,0x39,0x79, +0xe0,0x0, 0x1, 0x62,0xe8,0x40,0x3c,0xf6,0xf0,0x1, 0x21,0x83,0xe0,0x1, 0x3, 0x65, +0x17,0x1, 0x3f,0x19,0xf0,0x40,0x3a,0xf1,0xf0,0x0, 0x6a,0x84,0x6f,0x5, 0xe0,0x1, +0x3, 0x61,0x17,0x81,0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88,0x6c,0x89, +0x6f,0x8c,0x6f,0xd, 0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0x60,0xe8,0x40,0x3b,0x61, +0x16,0x80,0x8d,0x8e,0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d,0xe8,0xf, 0x3d,0xb7, +0x1, 0x10,0x8d,0x9e,0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1,0xe8,0xf, 0x3f,0x94, +0x1, 0x8, 0x97,0x8f,0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6,0xe0,0x66,0x3a,0x2f, +0x3e,0xe5,0xe2,0x1, 0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, 0x1, 0xe3,0xe0,0xf, +0x36,0x22,0xe2,0x0, 0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40,0x3b,0x7d,0xe0,0x1, +0x1, 0x34,0xe8,0x40,0x39,0xf6,0xe0,0x1, 0x1, 0x30,0xe2,0x1, 0xce,0x7f,0xe7,0xff, +0x1, 0x2f,0xe0,0xe, 0x35,0x21,0x3c,0xed,0x3f,0x14,0xe2,0x0, 0x7e,0x4, 0xf0,0x40, +0x39,0x79,0x3f,0x9c,0xc5,0x1, 0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0xf0,0x0, 0x8a,0x8f, +0xe7,0xff,0x1, 0xa2,0xe0,0xff,0x14,0x7f,0x25,0x18,0x17,0xff,0x3f,0x9a,0x3d,0x6f, +0xe2,0x1, 0xc5,0x7f,0xe0,0x0, 0x1e,0x9d,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1f,0x1c, +0xe0,0xf, 0x3f,0x9d,0xe0,0xff,0x14,0x7f,0xe0,0x80,0x96,0x9e,0x3e,0xf8,0xe0,0x6d, +0x3a,0x28,0x3f,0x7f,0x3c,0x6d,0x1, 0xf9,0xc0,0xc, 0xb, 0x61,0x3c,0x72,0xe7,0xfe, +0x5, 0xe6,0xf0,0x40,0x3a,0xe1,0xf0,0x0, 0x11,0x80,0xe7,0xfe,0x0, 0xe4,0xe0,0x0, +0x3, 0x59,0x17,0x1, 0x3f,0x19,0xe8,0x40,0x39,0x75,0xf0,0x0, 0x6a,0x84,0x6f,0x5, +0xe0,0x0, 0x3, 0x55,0x17,0xff,0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88, +0x6c,0x89,0x6f,0x8c,0x6f,0xd, 0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0xe3,0xe8,0x40, +0x3e,0x60,0xe8,0x40,0x3b,0x61,0x8d,0x8e,0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d, +0xe8,0xf, 0x3d,0xb7,0x1, 0x10,0x8d,0x9e,0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1, +0xe8,0xf, 0x3f,0x94,0x1, 0x8, 0x97,0x8f,0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6, +0xe0,0x66,0x3a,0x2f,0x3e,0xe5,0xe2,0x1, 0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, +0x1, 0xe3,0xe0,0xf, 0x36,0x22,0xe2,0x0, 0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40, +0x3b,0x7d,0x1, 0x2d,0xe8,0x40,0x39,0xf6,0x1, 0x2a,0xe2,0x1, 0xce,0x7f,0xe7,0xfe, +0x1, 0x2f,0xe0,0xe, 0x35,0x21,0xe2,0x0, 0x7e,0x4, 0x3f,0x9c,0x3f,0x14,0xc5,0x1, +0xf0,0x0, 0x8a,0x8f,0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0x3c,0xed,0xe7,0xfe,0x0, 0xa0, +0xf0,0x40,0x3a,0xf2,0x6c,0x4, 0x6c,0x5, 0x2, 0x23,0x6c,0x8, 0x6c,0x9, 0x6c,0xc, +0x6c,0xd, 0xe7,0xff,0x0, 0xb2,0xe8,0x40,0x38,0xf5,0x6c,0x4, 0x6c,0x5, 0x2, 0x12, +0x6c,0x8, 0x6c,0x9, 0x6c,0xc, 0x6c,0xd, 0xe7,0xfe,0x0, 0xa6,0x8f,0xe, 0x3f,0x72, +0x1, 0xd5,0xe7,0xfe,0x0, 0xe9,0x8f,0xe, 0x3f,0x71,0xe7,0xfe,0x1, 0xd0,0xe7,0xfe, +0x0, 0xe3,0x17,0x81,0xe8,0xf, 0x3f,0x95,0x6f,0x88,0x6c,0x89,0x0, 0xec,0x17,0xff, +0xe8,0xf, 0x3f,0x95,0x6f,0x88,0x6c,0x89,0x0, 0xdb,0x8, 0xb3,0xf7,0xff,0x12,0x7f, +0xf0,0x43,0x38,0x8, 0xf0,0x14,0x3a,0x18,0xf0,0x0, 0x10,0x81,0xf8,0x43,0x3a,0x4, +0xf8,0x11,0x38,0x90,0xe0,0x2, 0x1f,0xbf,0xf8,0x40,0x3a,0x71,0x80,0xef,0xf0,0x0, +0x82,0xff,0xe0,0x0, 0x2, 0x66,0xe0,0x1, 0x1f,0x51,0xf7,0xff,0x11,0x7f,0xf0,0x0, +0x11,0x81,0xf0,0x13,0x39,0x98,0xf0,0x43,0x3b,0x89,0xf0,0x12,0x39,0x19,0x15,0x1, +0x11,0x81,0xf0,0x0, 0xa3,0xe, 0x89,0x5f,0xf8,0x43,0x39,0x2, 0xe8,0xa, 0x3d,0x17, +0xf2,0x1, 0xc1,0xff,0xe7,0x0, 0x14,0x1, 0xe0,0x3, 0x39,0x99,0xf2,0x0, 0xca,0x0, +0xe8,0x43,0x3f,0x83,0xe8,0x40,0x3d,0xe4,0xe0,0x6b,0x3c,0x2f,0xe8,0x40,0x38,0xf4, +0xe0,0x6b,0x3d,0x2f,0xe8,0x40,0x3d,0x72,0x4, 0x2e,0x3e,0x63,0xe0,0x9, 0x39,0x3b, +0xe2,0x1, 0xc6,0x7f,0xe8,0x2b,0x3d,0x80,0xe8,0x40,0x3f,0xe2,0x0, 0x84,0x25,0x9c, +0x3f,0xfa,0x2, 0x21,0xe2,0x0, 0xcf,0x80,0xe0,0x43,0x3e,0x8c,0x3f,0x6f,0xe0,0x6e, +0x3c,0x2d,0xf0,0x40,0x3a,0xff,0xc6,0x7f,0xe0,0x6e,0x3d,0x2d,0xe0,0xd, 0x3f,0x19, +0xc7,0x81,0x36,0xa1,0xe8,0x2e,0x3f,0x7, 0xe0,0x43,0x3f,0x8f,0xe8,0xd, 0x3e,0x96, +0xe2,0x1, 0xc6,0x7f,0x2f,0x65,0x97,0xd, 0x3f,0x78,0xe0,0x6e,0x3c,0x28,0x3f,0xfa, +0x3c,0x6e,0x5, 0x61,0xf0,0x0, 0xc2,0x1, 0xf8,0x43,0x3a,0x4, 0xf8,0x40,0x3a,0x71, +0xf1,0xff,0xc1,0xff,0xf2,0x1, 0xc1,0xff,0xe7,0xff,0x5, 0x3a,0x9, 0xe1,0xe7,0x0, +0x14,0x1, 0x9, 0xe1,0x8, 0xb4,0xc0,0x78,0x39,0xea,0x3a,0x6b,0x7e,0x2, 0x7e,0x81, +0xdf,0x7d,0x39,0x68,0x3c,0xe4,0x3c,0x63,0xdf,0x79,0x39,0x18,0xe4,0x8, 0x31,0x4f, +0x3c,0x12,0x34,0x1, 0x66,0x81,0x3f,0xe8,0xe3,0xff,0xc6,0xff,0xe3,0xff,0xc7,0xff, +0xe0,0xe, 0x3e,0xaf,0xe0,0x43,0x3f,0x1e,0x66,0x2, 0xe2,0x0, 0xcf,0x0, 0xe0,0x8, +0x3e,0xa8,0xe0,0xe, 0x3f,0xad,0xe3,0xff,0xc6,0x7f,0xe0,0x43,0x3f,0x1e,0xe0,0x43, +0x3c,0x18,0xe0,0xf, 0x3e,0xac,0xe0,0x68,0x3d,0x2e,0xe0,0x2, 0x1f,0x6, 0xe0,0x43, +0x3f,0x9f,0x3e,0x2d,0xe2,0x0, 0xcf,0x80,0x9f,0xe, 0xe0,0x43,0x3e,0x1c,0xe0,0x6f, +0x3d,0x2c,0xe2,0x0, 0xcf,0xb, 0x16,0x86,0x17,0x3, 0xe0,0x6e,0x3c,0xad,0x3f,0x38, +0x3f,0xfe,0x5, 0xa, 0xe0,0x0, 0x17,0x64,0xe0,0x2f,0x3f,0x9e,0xe0,0x28,0x3c,0x1e, +0x3c,0x5f,0xc0,0x8, 0xa, 0x61,0x14,0x0, 0xc0,0x8, 0xa, 0x61,0x8, 0xb1,0xc0,0x44, +0x15,0x3c,0x14,0x80,0xe2,0x0, 0x7c,0x4, 0xe0,0x3, 0xdc,0x58,0xe0,0x0, 0x1f,0x8b, +0x14,0x0, 0x8d,0x8f,0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5, 0xc8,0x15,0x7f,0x3d,0x1b, +0xe2,0x1, 0xc5,0x7f,0xc5,0x1, 0xe0,0x0, 0x1f,0x8e,0xf2,0x0, 0x7b,0x4, 0x35,0x21, +0x3d,0x1f,0xe8,0x40,0x3f,0x66,0x86,0xf, 0x86,0x9f,0xc7,0x82,0xae,0xe, 0x3f,0xfa, +0xc7,0x2, 0xe0,0x40,0xae,0x9e,0x1, 0xf8,0xf0,0x0, 0x13,0x80,0xe8,0x40,0x3e,0xe7, +0xf0,0x0, 0xc3,0x81,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3d,0xf7,0x14,0x1, 0x1, 0x25, +0xe8,0x0, 0x8c,0x86,0xe8,0x0, 0x8d,0x16,0xe8,0x40,0x3f,0xe7,0xe0,0xe, 0x37,0xa1, +0xe2,0x0, 0x7e,0x4, 0x3f,0x1c,0x8e,0xe, 0x8f,0x1e,0x3e,0x79,0x3e,0x6d,0xe0,0x6c, +0x39,0xa8,0xc7,0x81,0x3f,0x7a,0xe2,0x1, 0xc7,0xff,0x3f,0x6d,0xe0,0x6e,0x39,0xac, +0x3d,0xff,0x3c,0x6e,0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf2,0x1, 0xc3,0xff,0xe8,0x40, +0x3d,0xf7,0xf0,0x0, 0xc3,0x2, 0x1, 0xdd,0xc0,0x3c,0x8, 0xe1,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x40,0xe0,0x0, 0x1f,0xb, 0xe0,0x1, 0x1f,0x97,0x8f,0xe, 0x89,0xf, +0x7f,0xb, 0x17,0x80,0xe0,0x2, 0x1f,0x2, 0xea,0x1a,0x7e,0xe0,0xaf,0x8e,0xe9,0xff, +0xc6,0xff,0xf0,0x2, 0x1b,0x8, 0xe0,0x1, 0x1f,0x6b,0xf0,0x40,0x38,0xe8,0xa4,0xd, +0xe8,0x7, 0xaf,0xd6,0x3d,0x62,0xe8,0x7, 0xaf,0xe6,0x14,0x80,0xaf,0x8e,0xf0,0x0, +0x78,0x85,0xf0,0x0, 0x7b,0x1, 0xe0,0x3, 0xdb,0xe1,0xf0,0x0, 0x63,0x1, 0xe0,0xa, +0x31,0x21,0xe8,0x40,0x3c,0x66,0x14,0x80,0xe0,0x3, 0xdb,0xd8,0x67,0x8b,0xf0,0x0, +0x60,0x85,0xe2,0x0, 0xcf,0x81,0xf0,0x0, 0x63,0x1, 0xe0,0x3, 0x5, 0x88,0xea,0x1a, +0x7e,0xe0,0xe9,0xff,0xc6,0xff,0xf0,0x0, 0xa4,0xd, 0xf0,0x0, 0x16,0x1, 0xf8,0xe, +0x3e,0x28,0xf0,0x0, 0x1f,0x6, 0xf8,0x40,0x3e,0xec,0x7f,0x10,0xf8,0x40,0x3a,0xec, +0xf8,0x40,0x3a,0x61,0xf2,0x0, 0xca,0x81,0xf8,0x40,0x8d,0x3e,0xf8,0x40,0x8c,0xae, +0xe0,0x2, 0x1, 0x66,0xe8,0x0, 0x8f,0x88,0xe0,0x2, 0x27,0xe2,0x67,0x8b,0xe8,0x40, +0x3f,0xf5,0xe0,0x2, 0x5, 0xe4,0x3b,0x6f,0xc3,0x7f,0xe2,0x1, 0xc3,0x7f,0x67,0x10, +0xe8,0xf, 0x3b,0x25,0xe8,0xe, 0x3f,0x18,0xe2,0x1, 0xc7,0xff,0x3f,0x9e,0xe0,0x0, +0x1e,0x8e,0x37,0xa1,0xc7,0x83,0x3f,0x9d,0xf0,0x0, 0x10,0x81,0xe0,0x2, 0x1e,0xc5, +0xf8,0x11,0x38,0x98,0xc3,0x1, 0xe8,0x40,0x3a,0xee,0xf0,0x0, 0x7a,0x8d,0xf8,0x40, +0x3b,0xea,0xf0,0x0, 0x7f,0xe, 0xe8,0x40,0x3a,0x61,0xf0,0x0, 0x15,0x85,0x3b,0x1d, +0xf0,0x0, 0x78,0x8c,0xf0,0x40,0x3a,0xef,0xf8,0x40,0x3f,0x69,0x0, 0x9e,0xf0,0x0, +0x21,0xc9,0x16,0x81,0xe8,0xd, 0x3e,0xd4,0xe0,0x0, 0x26,0xc4,0xe0,0x2, 0x1f,0x2, +0xe8,0x7, 0x86,0xd6,0x86,0xe, 0xc6,0x81,0xc6,0x1, 0xae,0xe, 0xe8,0x7, 0xae,0xd6, +0x8d,0x84,0xe0,0x2, 0x2d,0xa9,0xe8,0x0, 0x8e,0x88,0xae,0x84,0xc2,0x82,0xf0,0x40, +0x3a,0xf5,0xc2,0x1, 0xe0,0x2, 0x1, 0x4, 0xe0,0x40,0x8b,0x95,0xf0,0x0, 0x8e,0x5, +0xf0,0xd, 0x3b,0xa7,0xe2,0x0, 0xce,0x80,0xf0,0x2, 0x3d,0x27,0xe8,0xd, 0x3b,0xaa, +0xe2,0x1, 0xc6,0xff,0xf8,0xc, 0x3f,0x2c,0xe2,0x1, 0xc1,0x7f,0xe0,0x62,0x3d,0x2d, +0xf8,0x3, 0x3c,0xac,0xe2,0x0, 0xce,0x0, 0xf8,0xd, 0x3e,0x29,0xe2,0x1, 0xc1,0xff, +0xe2,0x1, 0xc6,0xff,0xe9,0x2c,0x39,0x1b,0xe0,0x63,0x3d,0x2d,0x2e,0x58,0xe9,0x2d, +0x39,0x9b,0x2e,0xd5,0xf1,0x2d,0x3e,0xa3,0xf1,0x33,0x3e,0xa2,0xe7,0xff,0x2e,0xb9, +0xe9,0x2d,0x39,0x1d,0x2e,0x84,0xe9,0x2d,0x39,0x9d,0x26,0xc9,0x16,0x82,0xe8,0xd, +0x3e,0xd4,0x26,0xc5,0xe0,0x2, 0x1f,0xbf,0xe0,0x1, 0x1f,0x51,0x8e,0xdf,0xa5,0x8e, +0xf0,0xc, 0x3d,0x3d,0x3e,0xb7,0xe8,0xc, 0x3e,0x19,0xe8,0xd, 0x3e,0x9c,0x36,0x21, +0x36,0xa1,0x3e,0x1b,0x3e,0x9b,0xf0,0x0, 0x90,0xc, 0xf0,0x0, 0x91,0xd, 0x16,0x82, +0xe1,0x2f,0x3e,0xa2,0xe8,0x40,0x3d,0xec,0x3d,0x67,0xe1,0x2d,0x3e,0xa3,0xe8,0x40, +0x3c,0xe9,0xe8,0x40,0x3c,0x6a,0xf0,0x0, 0x79,0x86,0xf0,0x0, 0x7a,0x2, 0xf0,0x0, +0x7a,0x84,0xf0,0x0, 0x7b,0x1, 0xf0,0x0, 0x7b,0x83,0x7f,0x8f,0x7e,0x8a,0xf0,0x0, +0x78,0x8, 0xf0,0x0, 0x79,0x7, 0xdc,0x7f,0xf0,0x0, 0x60,0x8, 0xf0,0x0, 0x61,0x7, +0xe2,0xff,0xcc,0x7f,0xf8,0xc, 0x38,0x12,0xe4,0xd, 0x36,0x4f,0x3e,0x9c,0x16,0x0, +0xe0,0x6c,0x39,0xa8,0xf8,0x40,0x38,0x72,0xe8,0x40,0x3f,0xe2,0x36,0x81,0xe8,0x6f, +0x3b,0x20,0xe8,0x40,0x3d,0xec,0x3d,0x67,0xe0,0x43,0x3e,0x9d,0xe8,0x40,0x3c,0xe9, +0xe8,0x40,0x3c,0x6a,0x7f,0x89,0x7e,0x5, 0xde,0x2e,0x67,0xa, 0xf0,0x0, 0x66,0xf, +0x3b,0xe8,0xf0,0x1c,0x3e,0x5e,0xde,0x73,0x67,0x89,0xf0,0x0, 0x60,0x8, 0xf0,0x0, +0x60,0x85,0xf0,0x0, 0x61,0x7, 0xf0,0x0, 0x61,0x86,0xf0,0x0, 0x62,0x2, 0xf0,0x0, +0x62,0x84,0xf0,0x0, 0x63,0x1, 0xf0,0x0, 0x63,0x83,0xe0,0x1, 0x24,0x45,0xf0,0x40, +0x39,0x6f,0xe0,0x2, 0x1e,0x86,0xe0,0x0, 0x1f,0x24,0x9d,0xd, 0xe0,0x0, 0x15,0xd1, +0xe2,0x0, 0xcd,0xa, 0xe0,0x0, 0x16,0xc7,0xe0,0x6d,0x3a,0xab,0x9d,0x8e,0xe0,0x72, +0x3a,0xaf,0xe2,0x0, 0xcd,0x8b,0x15,0x3c,0x15,0x80,0xe0,0x6a,0x3c,0xad,0xe0,0x6b, +0x3c,0xa7,0x3e,0xea,0x3b,0xeb,0xf0,0x0, 0x2e,0x7e,0x15,0x83,0xe1,0x2b,0x3d,0xa3, +0xe0,0x1, 0x25,0xa8,0x67,0x8f,0xe0,0x1, 0x27,0xa5,0x16,0xb4,0xf0,0x0, 0x21,0xf6, +0x67,0x8a,0xe0,0x0, 0x27,0xf3,0xe0,0x2, 0x1f,0x16,0x14,0x1e,0x8e,0x8e,0xe0,0x0, +0x2e,0xf3,0x16,0x9e,0xf0,0x8, 0x39,0x3d,0xe0,0x0, 0x14,0xe4,0xf0,0x0, 0x78,0x85, +0xf0,0x0, 0x7a,0x2, 0xf0,0x0, 0x7a,0x84,0xf0,0x0, 0x7b,0x1, 0xf0,0x0, 0x7b,0x83, +0xe0,0x3, 0xd8,0xa, 0xf0,0x0, 0x60,0x85,0xf0,0x0, 0x62,0x2, 0xf0,0x40,0x38,0xf8, +0xf0,0x0, 0x62,0x84,0xf0,0x0, 0x63,0x1, 0xf0,0x0, 0x63,0x83,0xe7,0xfe,0x5, 0x8, +0x16,0x80,0xe1,0x2c,0x3b,0x8d,0xe8,0x40,0x3e,0x7c,0xe7,0xfd,0x5, 0xfb,0xc2,0x82, +0xf0,0x40,0x3a,0xf5,0xe0,0x0, 0xc2,0x1, 0xe7,0xfe,0x1, 0x80,0xf0,0x0, 0x62,0x8d, +0xf0,0x0, 0x60,0x8c,0xf0,0x0, 0x67,0xe, 0xf0,0x0, 0xc2,0x81,0xf0,0x0, 0xc7,0x2, +0xf2,0x1, 0xc2,0xff,0xf8,0x40,0x3c,0x61,0xe7,0xfd,0x0, 0x96,0x67,0x8b,0xf8,0x0, +0xaa,0x88,0xe8,0x40,0x3f,0xf5,0xe7,0xfd,0x2, 0xa0,0xe0,0x0, 0xc0,0x40,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe8,0x0, 0x8e,0x8, 0x3e,0xeb,0xe2,0x1, 0xc6,0xff,0x3e,0xfc, +0x3d,0x6b,0x5, 0x82,0x3d,0x6c,0xea,0x1a,0x7f,0x60,0xe9,0xff,0xc7,0x7f,0xe2,0x1, +0xc5,0x7f,0xa6,0x8e,0x0, 0x8a,0xe8,0x0, 0x8f,0x8, 0x3f,0x7f,0x1, 0x9, 0xc6,0x81, +0x3e,0xf6,0xe7,0xfd,0x1, 0x45,0x8d,0x84,0x8f,0x8d,0x3f,0xfb,0x1, 0xf5,0xad,0xd, +0x0, 0xf7,0x16,0xb2,0xf7,0xff,0x29,0x8e,0xe0,0x2, 0x1f,0x96,0x8d,0x8f,0xe7,0xff, +0x25,0x93,0x14,0x2d,0xe8,0x8, 0x3c,0x32,0xe0,0x0, 0x14,0xe4,0xf0,0x0, 0x78,0x85, +0xf0,0x0, 0x7a,0x2, 0xf0,0x0, 0x7a,0x84,0xf0,0x0, 0x7b,0x1, 0xf0,0x0, 0x7b,0x83, +0xe0,0x3, 0xd7,0x9a,0xf0,0x0, 0x60,0x85,0xf0,0x0, 0x62,0x2, 0xf0,0x40,0x38,0xf8, +0xf0,0x0, 0x62,0x84,0xf0,0x0, 0x63,0x1, 0xf0,0x0, 0x63,0x83,0xe7,0xfd,0x5, 0x18, +0xe7,0xfd,0x0, 0x90,0xf8,0x40,0x38,0x72,0xe8,0x72,0x3d,0x20,0xe7,0xfe,0x0, 0xbb, +0x15,0x84,0xe1,0x23,0x3d,0xa3,0x21,0x86,0x67,0xf, 0x27,0x4, 0x16,0xba,0xe7,0xfe, +0x0, 0xd7,0xe2,0x0, 0xc9,0x2, 0xe7,0xfe,0x2, 0xd3,0x16,0xbc,0x0, 0xc6,0xe0,0x0, +0x1f,0xd, 0xe0,0x0, 0x1f,0x8e,0x8c,0xe, 0x24,0x1a,0xe0,0x10,0x8f,0x2f,0xe2,0x0, +0xcf,0x10,0x2, 0x94,0x17,0x7f,0x3f,0x18,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0x17,0xa, +0x3f,0x38,0x3f,0x1f,0x0, 0x86,0xe0,0x10,0x8e,0xaf,0xe2,0x0, 0xce,0x90,0x2, 0x86, +0x3f,0xfe,0xc7,0x8a,0x1, 0xf9,0x14,0x0, 0x38,0x82,0x14,0x1, 0x38,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x38,0xe0,0x0, 0x1f,0x8b,0xf0,0x0, 0x8c,0xf, 0xf0,0x1, 0x24,0x5d, +0xe0,0x0, 0x1e,0xe, 0xe0,0x2, 0x1f,0xbf,0x8b,0xc, 0x8a,0xdf,0x89,0x1c,0xe0,0xf, +0x3b,0x35,0xe0,0x1, 0x1f,0x51,0x14,0xff,0xa2,0xe, 0x3f,0x92,0xe8,0x9, 0x3c,0x98, +0x37,0xa1,0xe2,0x1, 0xc4,0xff,0x3f,0x94,0x34,0xa1,0x94,0xf, 0x39,0xe6,0x3b,0xe2, +0x3c,0x9c,0xe0,0x0, 0x0, 0xc5,0x3e,0x79,0xe0,0x0, 0x1, 0x50,0x8f,0x2c,0x8f,0xbc, +0xe0,0xd, 0x3f,0x35,0x3d,0x6e,0x3e,0x9f,0x36,0xa1,0x3e,0x94,0x96,0x8d,0xe4,0xb, +0x37,0x28,0x3e,0xf8,0xe0,0x6d,0x3a,0x28,0x3c,0x6d,0x3e,0xe6,0xe2,0x1, 0xc6,0xff, +0x3f,0x7d,0x5, 0x82,0x3d,0x66,0x3e,0xe3,0xe4,0xb, 0x35,0xc8,0xe2,0x1, 0xc6,0xff, +0x3d,0xfd,0x3b,0x6a,0xe2,0x1, 0xc3,0x7f,0x3, 0x82,0x3f,0x63,0x39,0xee,0x3f,0x62, +0xe2,0x1, 0xc7,0x7f,0x3f,0xfe,0xe2,0x1, 0xc1,0xff,0x3d,0xef,0xe4,0xd, 0x37,0xa8, +0x5, 0x82,0x3d,0xe2,0x3f,0x67,0xe4,0xd, 0x36,0xc8,0xe2,0x1, 0xc7,0x7f,0x3e,0xfe, +0x39,0x6b,0xe2,0x1, 0xc1,0x7f,0x3, 0x82,0x3f,0xe7,0xe0,0xe, 0x39,0xa6,0xe2,0x0, +0xcf,0x7, 0x3b,0xef,0xe2,0x1, 0xc3,0xff,0xc6,0x2, 0x2, 0x7, 0xe0,0xf, 0x3b,0xa2, +0xe2,0x0, 0xcf,0x87,0xe7,0xff,0x5, 0x39,0xe0,0x2, 0x1f,0x86,0xe0,0x3, 0x17,0x74, +0xb7,0xf, 0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0x14,0x83,0x34,0x21,0xe0,0x3, 0xd6,0xdc, +0x3b,0xf2,0x15,0x80,0xe0,0x43,0x3c,0x18,0x3e,0xeb,0x4, 0xa2,0x39,0xf6,0x4, 0x9b, +0xe0,0x40,0x3f,0x66,0xe0,0xf, 0x3f,0x35,0x16,0x1, 0x3f,0x92,0x37,0xa1,0x3f,0x94, +0x97,0x8f,0x3e,0x1d,0x3f,0xf8,0xc7,0x1, 0x3f,0xec,0xe2,0x1, 0xc7,0xff,0x16,0x1, +0xe2,0x1, 0xc7,0x7f,0x3e,0x1b,0xe0,0x6d,0x3a,0x2f,0x3f,0x73,0x3d,0xec,0xe2,0x1, +0xc5,0xff,0x5, 0xe9,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x39,0x77,0x5, 0xe0,0xe0,0x2, +0x1f,0x9f,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x5, 0xa0,0xe0,0x2, 0x1f,0x6, 0x9f,0x8e, +0xe2,0x7, 0xcf,0xe7,0x2, 0x83,0xc7,0x81,0xb7,0x8e,0xf7,0xff,0x24,0x44,0xe4,0x0, +0xc6,0x83,0xe0,0xf, 0x35,0xa1,0x3e,0xff,0x5, 0x20,0xe0,0x0, 0x1f,0x24,0xe0,0x2, +0x1e,0x86,0x9f,0x8e,0x16,0x0, 0xe2,0x3, 0xcf,0xf3,0xb6,0xd, 0xe7,0xff,0x2, 0xb3, +0xc7,0x81,0xb7,0x8e,0xe7,0xff,0x0, 0xaf,0x1, 0x69,0xe0,0x2, 0x1f,0x6, 0x9f,0x8e, +0xe2,0x0, 0xcf,0x82,0x5, 0x83,0xc7,0xfe,0xb7,0x8e,0xe0,0x0, 0x1f,0x24,0x9f,0x8e, +0xe2,0x3, 0xcf,0xf3,0x2, 0xdb,0x0, 0xd8,0xe0,0x2, 0x1f,0x6, 0x9f,0x8e,0xe2,0x7, +0xcf,0xe7,0x2, 0x83,0xc7,0x82,0xb7,0x8e,0x17,0x0, 0xe0,0x0, 0x1f,0xa4,0xb7,0xf, +0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe8,0x40,0x3d,0xe8,0xe8,0x40,0x3e,0xe8,0xe7,0xff, +0x0, 0xb8,0xe0,0x2, 0x1f,0x86,0x9c,0xf, 0x17,0x8a,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0xe0,0x0, 0x1f,0xa4,0x9c,0xf, 0x17,0x8a,0xe1,0x28,0x3c,0x1f,0x38,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x2, 0x1b,0x88,0x17,0x80,0xe0,0x7, 0xaf,0xc7, +0xe0,0x2, 0x1f,0x9f,0xe0,0x0, 0x1a,0xb, 0x8b,0xf, 0xde,0xfa,0x8f,0x84,0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x5, 0xf3,0x14,0x3, 0xdc,0xb2,0xeb,0xe6,0x7f,0xa8,0x7f,0x81, +0xe0,0x2, 0x23,0x2a,0xe2,0x0, 0xcb,0x1, 0x5, 0x86,0x8f,0x8f,0xe2,0x0, 0xcf,0x86, +0xe0,0x2, 0x2, 0xa2,0xf0,0x0, 0x88,0x84,0xe0,0x0, 0x1a,0x8e,0xe8,0x40,0x3b,0x71, +0xe0,0x2, 0x1, 0x6f,0xe0,0x7, 0x8f,0xd7,0xfa,0x12,0x7c,0x74,0xf0,0xf, 0x38,0xaf, +0xc7,0x81,0x3b,0x7f,0xe0,0x3, 0x1, 0x19,0xe0,0x2, 0x1f,0x82,0x8f,0x8f,0xe8,0x0, +0x8f,0x8, 0xf0,0xf, 0x38,0xaf,0xc7,0x81,0x3f,0x7f,0x14,0x3, 0xe0,0x2, 0x1, 0x75, +0xf0,0x3, 0x20,0x83,0x16,0x7f,0xe8,0xc, 0x3e,0x11,0xf0,0x2, 0x1c,0xc5,0xe2,0x1, +0xc6,0x7f,0xc6,0x1, 0xe8,0xc, 0x3e,0x19,0xf8,0x40,0x3b,0xe9,0xf0,0x0, 0x13,0x0, +0xe9,0x80,0x8f,0x17,0xe8,0x40,0x3f,0xe6,0xe2,0x1, 0xc7,0xff,0x3f,0x7f,0x3e,0xee, +0x3, 0x83,0xe8,0x40,0x3e,0xe6,0xe8,0x40,0x3e,0x77,0xf0,0x40,0x3b,0x6d,0xf2,0x1, +0xc3,0x7f,0x1, 0xef,0xf8,0x40,0x38,0xe6,0xf0,0x2, 0x23,0x5f,0xe0,0x1, 0x1f,0xd1, +0xfb,0xe6,0x7e,0x2a,0xfb,0xe6,0x7d,0xa9,0xf0,0x0, 0xa2,0xf, 0xe0,0x2, 0x1f,0xbf, +0xf8,0x0, 0x89,0xc, 0xf8,0x0, 0x88,0xb, 0xf0,0x0, 0x10,0x80,0xf0,0x0, 0x8a,0xdf, +0xe8,0x40,0x3b,0x62,0xe8,0x40,0x38,0xe0,0x16,0x1, 0xf0,0x1, 0x11,0xff,0xf8,0x40, +0x3d,0x61,0x3d,0x62,0xe0,0x0, 0x1f,0xe, 0xe8,0x40,0x3f,0xe9,0xf8,0x40,0x3e,0xea, +0x15,0x80,0x0, 0x85,0xf0,0x40,0x3b,0xff,0xc7,0x2, 0x1, 0x2b,0xe1,0x80,0x8e,0x9f, +0x3e,0xfc,0x1, 0xf9,0x8c,0x8e,0xc5,0x81,0xe2,0x1, 0xc5,0xff,0xe2,0x0, 0xcd,0x81, +0x8c,0x1e,0xe8,0xd, 0x3c,0xb5,0xe0,0x6a,0x39,0x28,0x3e,0x98,0xe0,0x63,0x39,0x29, +0xf2,0x0, 0xcb,0x1, 0x36,0xa1,0xe8,0xd, 0x3e,0x94,0xe0,0x1, 0x1, 0x25,0x96,0x8d, +0xc7,0x2, 0xe8,0x40,0x3e,0xfd,0xe0,0x6a,0x3a,0x28,0xe8,0x40,0x3e,0xfd,0xe0,0x63, +0x3a,0x29,0xe8,0x40,0x3e,0xfd,0xe0,0x7d,0x3a,0x2d,0xf0,0x40,0x3b,0xff,0x1, 0xd7, +0x25,0x8a,0xf0,0xf, 0x30,0xa1,0x3f,0x97,0xf0,0x0, 0xc0,0x81,0xa9,0x8f,0xf2,0x1, +0xc0,0xff,0xad,0x1f,0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0xe8,0x40,0x3e,0x76,0xe7,0xff, +0x5, 0xbb,0xf2,0x0, 0xc8,0x81,0xf0,0xa, 0x30,0xa1,0xe0,0x1, 0x1, 0x6b,0x17,0xff, +0xe8,0x0, 0xaf,0x8c,0xe8,0x0, 0xaf,0x8b,0xe0,0x2, 0x1c,0x88,0xe0,0x0, 0x1c,0xe, +0xf0,0x7, 0xa8,0xc7,0xf0,0x0, 0xa8,0x84,0xe0,0x3, 0xd7,0xb6,0x88,0x84,0xe8,0x0, +0xa8,0x88,0xe0,0x1, 0x20,0xdf,0x12,0x0, 0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0x38,0xf4, +0xe0,0x0, 0x1b,0xe, 0xe0,0x0, 0x15,0xe4,0xe0,0x0, 0x1, 0x4a,0x8c,0x86,0x8d,0x16, +0x3b,0xe9,0x39,0xea,0xe0,0x40,0x3e,0x64,0xe0,0xf, 0x36,0x21,0xe0,0xe, 0x3a,0x9f, +0x8e,0x8e,0x8f,0x1e,0xe0,0x8, 0x3b,0xad,0xe2,0x0, 0xcc,0x0, 0xe0,0xf, 0x3c,0xad, +0x3e,0xa9,0xe0,0x8, 0x39,0xae,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0xe0,0x6f, +0x3d,0x2d,0xe2,0x0, 0xcc,0x0, 0xe0,0xd, 0x3d,0x2e,0x3f,0x2a,0xe2,0x1, 0xc7,0x7f, +0xe2,0x1, 0xc6,0xff,0xe0,0x6d,0x3d,0x2e,0x3c,0x6d,0x39,0x6f,0xe2,0x1, 0xc1,0x7f, +0xe2,0x1, 0xc4,0x7f,0x39,0x78,0x3f,0x6d,0xc6,0x1, 0x3e,0xeb,0xe2,0x1, 0xc6,0xff, +0xe2,0x1, 0xc6,0x7f,0x3, 0x82,0x3f,0xee,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3f,0x7d, +0x5, 0x82,0x3f,0xeb,0x38,0xfc,0x3d,0xef,0xe2,0x1, 0xc5,0xff,0x1, 0xc6,0xc2,0x1, +0xe2,0x1, 0xc2,0x7f,0x38,0xf4,0xc3,0x2, 0xe7,0xff,0x1, 0xba,0xe2,0x0, 0xcd,0xe4, +0x17,0x80,0xe0,0x6f,0x39,0xab,0x3d,0xef,0x67,0x1, 0xad,0x8e,0xc0,0x4, 0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xfa,0x12,0x7c,0x74,0xf0,0x0, 0x88,0x84,0xe0,0x0, 0x1a,0x8e, +0xe7,0xfd,0x0, 0xf8,0xf2,0x1, 0xc9,0x7f,0xe7,0xfe,0x1, 0x5b,0xe0,0xd, 0x3c,0xa6, +0xe0,0x43,0x3e,0x9d,0xe2,0x0, 0xce,0x80,0xf0,0x2, 0x39,0x29,0xe8,0xd, 0x3c,0xa2, +0xe2,0x1, 0xc1,0x7f,0xe0,0x1e,0x3c,0x21,0xe2,0x1, 0xc6,0xff,0xe0,0x6d,0x3d,0x22, +0xf8,0x43,0x3f,0x1e,0x39,0x6d,0xf2,0x0, 0xcf,0x0, 0xe8,0xd, 0x3c,0x20,0xf0,0x1e, +0x38,0x28,0xe2,0x1, 0xc6,0xff,0xf2,0x1, 0xc7,0x7f,0xe8,0x6d,0x3d,0x2e,0x3e,0x92, +0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf3,0xe8,0x40,0x39,0x63,0xe0,0x62,0x3c,0xad, +0xe8,0x40,0x3e,0xf3,0xe0,0x6a,0x3c,0xa8,0xe8,0x40,0x3e,0xf3,0xf0,0x40,0x39,0xe2, +0xe0,0x63,0x3c,0xa9,0xe7,0xfe,0x0, 0x88,0xeb,0xe6,0x7d,0xa8,0xea,0x12,0x7e,0x74, +0xeb,0xe6,0x7e,0xaa,0xeb,0xe6,0x7f,0x29,0x15,0x7f,0xe0,0x0, 0x14,0xe4,0xac,0x8b, +0xaf,0x8c,0xad,0xd, 0xad,0xe, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x0, +0x1f,0x8d,0x8f,0x8f,0x27,0x96,0xe0,0x10,0x8f,0x25,0xe2,0x0, 0xcf,0x10,0x2, 0xae, +0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe4,0x0, 0xc7,0x8a,0x3f,0x65,0x3f,0x95,0x0, 0x86, +0xe0,0x10,0x8e,0xae,0xe2,0x0, 0xce,0x90,0x2, 0xa1,0x3f,0x7f,0xc7,0xa, 0x1, 0xf9, +0xfa,0x12,0x7c,0x74,0x14,0x1, 0xdb,0x13,0xf0,0x0, 0x88,0x84,0xe7,0xfd,0x0, 0x8a, +0x87,0x7, 0x87,0x97,0xe8,0x0, 0xaf,0xc, 0xe8,0x0, 0xaf,0x8b,0xe7,0xfe,0x0, 0x96, +0x3d,0xe1,0xe7,0xfe,0x0, 0xfb,0xfb,0xe6,0x7e,0x2a,0xfb,0xe6,0x7d,0xa9,0xe8,0x40, +0x3d,0x61,0xe7,0xfe,0x0, 0x86,0x14,0x1, 0x0, 0xe7,0xfa,0x12,0x7c,0x74,0x14,0x3, +0x0, 0xe3,0x0, 0x0, 0xe0,0x1, 0x1f,0x9c,0x8f,0x8f,0xe0,0x1, 0x27,0x82,0x8, 0xb4, +0xf7,0xff,0x11,0x7f,0xf0,0x12,0x39,0x1f,0xf0,0x0, 0x12,0x1, 0xf2,0x1, 0xc1,0x7f, +0xf0,0x14,0x3a,0x19,0xf0,0x0, 0x10,0xa, 0xe0,0x2, 0x1a,0x21,0xf4,0x0, 0xc1,0xa, +0xf2,0x1, 0xc2,0x7f,0x11,0xa, 0xf0,0x10,0x38,0x39,0xe8,0x2, 0x39,0x34,0x10,0xff, +0xf0,0x1, 0xc1,0x52,0xf0,0x10,0x38,0x14,0x38,0x9a,0xf0,0x2, 0x19,0x9d,0xf0,0x12, +0x39,0x14,0x39,0x14,0xe0,0x1, 0x11,0xff,0xf0,0x0, 0xc0,0x4, 0x38,0xa9,0x3c,0xfa, +0x3, 0xa4,0xe8,0x0, 0x8e,0x43,0xe8,0x0, 0x8f,0x80,0xf8,0x40,0x38,0xe3,0xe0,0x2f, +0x3f,0x8c,0xf0,0x40,0x3b,0xe9,0xe1,0x35,0x3e,0x3, 0x27,0x83,0xf0,0x0, 0x2a,0x9c, +0xf0,0x40,0x3b,0x61,0xf2,0x1, 0xc3,0x7f,0x3e,0xe2,0x17,0x0, 0x0, 0x89,0x8f,0xcd, +0xc7,0x1, 0xe0,0x2f,0x3f,0x8c,0xe8,0xf, 0x3f,0xd5,0xc6,0x8a,0x2f,0x8c,0xe8,0x40, +0x3f,0x76,0xe8,0x17,0x3f,0x14,0x1, 0xf4,0xf0,0x0, 0xc1,0x8a,0xf8,0x40,0x39,0xf2, +0x1, 0xd7,0xa, 0x61,0xe0,0xf, 0x36,0x23,0x3f,0x94,0xe0,0x2, 0xc7,0xac,0x8f,0x8f, +0xf4,0x0, 0xc3,0x8a,0x2f,0x83,0xe8,0x11,0x3a,0x17,0x17,0xa, 0x3f,0x38,0xe8,0x0, +0x8f,0xc1,0x3f,0x1b,0xaf,0xce,0xe8,0xf, 0x3a,0x17,0xe8,0x0, 0x9e,0x91,0xe8,0x0, +0x9e,0x1, 0xb6,0x9e,0xf0,0x0, 0xc1,0x8a,0xb6,0xe, 0xf8,0x40,0x39,0xf2,0x8e,0xdf, +0xc4,0x1, 0xae,0xde,0xe2,0x1, 0xc4,0x7f,0x8e,0xef,0xae,0xee,0x8e,0xff,0xae,0xfe, +0xe0,0x1, 0x8f,0x8f,0xe0,0x1, 0xaf,0x8e,0xe7,0xff,0x1, 0xab,0x0, 0xd3,0x38,0x82, +0xe0,0x2, 0x1f,0x9f,0xe0,0x2, 0x1f,0x15,0x8f,0x8f,0x8f,0xe, 0x2f,0x82,0x27,0x20, +0xe0,0x2, 0x1e,0x94,0xe0,0x2, 0x1e,0x1a,0x8e,0x8d,0x3e,0xfe,0x4, 0x9a,0xae,0x8c, +0xe0,0x2, 0x1f,0x20,0x8e,0x8e,0x3e,0xff,0x5, 0x8f,0xea,0x22,0x7e,0xc6,0x8d,0x8d, +0x8e,0xc, 0x3e,0x7b,0x5, 0x8d,0xaf,0x8e,0xc5,0x81,0xe0,0x0, 0x1f,0xad,0xad,0x8d, +0x17,0x1, 0xaf,0xf, 0x38,0x82,0xea,0x22,0x7f,0xc6,0x17,0x0, 0xaf,0xf, 0x38,0x82, +0xaf,0xc, 0x0, 0xe7,0xe0,0x2, 0x1f,0x20,0xe0,0x0, 0x1f,0xad,0x16,0x0, 0x8e,0x8e, +0xae,0xf, 0x2e,0x9f,0xe0,0x2, 0x1e,0x9f,0x8e,0xd, 0x26,0x1b,0xe0,0x2, 0x1e,0x95, +0x8d,0x8d,0xe0,0x2, 0x1e,0x94,0x8e,0x8d,0x3d,0xfd,0x2, 0x9b,0xe0,0x2, 0x1d,0x1a, +0x3d,0xed,0xae,0x8a,0xea,0x22,0x7e,0xc7,0x8d,0xd, 0x3d,0x7b,0x3, 0x9a,0xae,0xe, +0x15,0x81,0xe0,0x2, 0x1f,0x13,0xc5,0x1, 0xad,0x8e,0xad,0xd, 0xad,0x8f,0x38,0x82, +0xea,0x22,0x7f,0xc7,0x17,0x0, 0xaf,0xf, 0xe0,0x2, 0x1f,0x93,0xaf,0xf, 0x38,0x82, +0xe0,0x2, 0x1e,0x9a,0xad,0x8d,0xea,0x22,0x7e,0xc7,0x8d,0xd, 0x3d,0x7b,0x4, 0xe8, +0x17,0x80,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0x8f,0x8f,0x2f,0x83, +0xe7,0xff,0x0, 0x98,0x38,0x82,0xe0,0x2, 0x1f,0x55,0x8f,0x8e,0xe2,0x1, 0xcf,0xf9, +0x2, 0x83,0xc7,0x81,0xaf,0x8e,0x38,0x82,0xe0,0x2, 0x1c,0x78,0xe0,0x4, 0x15,0x6a, +0x14,0x80,0xe0,0x6b,0x0, 0xfb,0xe0,0x2, 0x1c,0xf8,0xe0,0x2, 0x1f,0x20,0x8d,0x9, +0x8c,0xe, 0xe0,0xf, 0x3c,0x9a,0x17,0x0, 0xaf,0x2f,0x24,0x1b,0x15,0xff,0x3d,0x98, +0xe2,0x1, 0xc5,0xff,0xc5,0x81,0x17,0x28,0x3f,0x3a,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, +0x1f,0xa1,0x3f,0x19,0x3d,0x9f,0x96,0xf, 0x96,0x9f,0xc7,0x8a,0xe0,0x1, 0xb6,0x1e, +0x3f,0xfb,0xc7,0x4, 0xe0,0x1, 0xb6,0x8e,0x1, 0xf7,0xe0,0xf, 0x3c,0x9a,0xac,0x2f, +0xc5,0x1, 0xe2,0x1, 0xc5,0x7f,0xe2,0x0, 0xcd,0xf, 0x1, 0x17,0xad,0x9, 0x16,0x0, +0xe0,0x2, 0x1f,0x77,0xe0,0x2, 0x1d,0x76,0xe1,0x80,0x8e,0x9e,0x3f,0xec,0xe2,0x1, +0xc7,0xff,0x3e,0xff,0x3d,0xed,0x3, 0x82,0x3d,0xec,0x3f,0x7a,0x3e,0x6b,0xe2,0x1, +0xc6,0x7f,0x1, 0xf3,0xae,0x19,0x38,0x82,0x17,0x80,0xaf,0x89,0x0, 0xe9,0xf0,0x2, +0x1b,0x77,0xf0,0x2, 0x1a,0x75,0xf0,0x2, 0x19,0x76,0xf0,0x2, 0x19,0xf8,0xf0,0x0, +0x12,0x80,0xf0,0x0, 0x13,0xcf,0xe9,0x80,0x8f,0x96,0x27,0xb5,0x15,0x7f,0x3d,0x1f, +0xe2,0x1, 0xc5,0x7f,0xe8,0xa, 0x3d,0x15,0x35,0x22,0xc5,0x16,0xe8,0xa, 0x3d,0x13, +0xe8,0x40,0x3d,0xe4,0x0, 0x83,0x3d,0x7b,0x1, 0x26,0x9e,0xb, 0x9e,0x9b,0xe0,0xf, +0x3c,0x2c,0xe3,0xff,0xc7,0xff,0xf0,0x43,0x38,0x9f,0xe0,0xe, 0x3c,0xad,0xf2,0x0, +0xc8,0x80,0xe3,0xff,0xc7,0x7f,0x3e,0x28,0xf0,0x43,0x38,0x9e,0xe3,0xff,0xc6,0x7f, +0xe0,0x6f,0x3d,0x2c,0x3e,0xa9,0xf2,0x0, 0xc8,0x80,0xe3,0xff,0xc6,0xff,0xe0,0x6e, +0x3d,0x2d,0xf1,0x2f,0x3b,0xaf,0xc5,0x84,0xf1,0x2e,0x3b,0xae,0x27,0xdd,0x27,0x5c, +0x14,0x1, 0x38,0x82,0xf8,0x40,0x3b,0x72,0xf0,0x0, 0xc2,0x28,0xf0,0x0, 0xc2,0x8a, +0x1, 0xc3,0x14,0x0, 0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfe,0xc0,0xc, +0xe0,0x2, 0x1f,0x20,0xea,0x22,0x7f,0xc4,0xf0,0x0, 0x8d,0x8e,0x7f,0x8a,0xf0,0x2, +0x25,0xff,0x97,0x8f,0xc7,0x81,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0xe4,0xe0,0x3, +0x2, 0x80,0x67,0xa, 0xb7,0x8e,0xe0,0x2, 0x1f,0x85,0xe0,0x4, 0x8f,0xdf,0xe2,0x0, +0xcf,0x81,0xea,0x22,0x7f,0xc2,0x7f,0x89,0xe0,0x7, 0x1, 0x15,0x8f,0x8f,0xe0,0x2, +0x2f,0xeb,0xe0,0x2, 0x1f,0x93,0xf0,0x0, 0x8c,0x8f,0xf0,0x2, 0x2c,0xdc,0xe0,0x0, +0x1f,0x9e,0xe0,0x2, 0x1f,0x24,0x9e,0xf, 0x9e,0xf, 0x9e,0x8e,0x9d,0x8f,0xe0,0xd, +0x3e,0x2d,0xe2,0x1, 0xc6,0xff,0xe0,0x1, 0x1f,0xce,0x7e,0x83,0x8e,0x8f,0x67,0x83, +0xe2,0x0, 0xce,0x82,0x66,0x3, 0xc7,0x82,0xe2,0x1, 0xc7,0xff,0xe0,0x6c,0x39,0x2f, +0xe0,0x2, 0x1f,0x8e,0x16,0x80,0xb5,0x8e,0x7e,0x3, 0xae,0x8f,0xf0,0x2, 0x2d,0xcd, +0xe0,0x1, 0x1f,0x9c,0x89,0xf, 0x7f,0x8f,0xe0,0xa, 0x21,0x58,0x11,0xff,0x39,0x92, +0xfa,0x21,0x7b,0x20,0xea,0x22,0x7f,0x38,0xe2,0x1, 0xc1,0xff,0xe8,0x40,0x3b,0x66, +0xea,0x22,0x7f,0xac,0xea,0x22,0x7d,0x18,0xea,0x22,0x7d,0x84,0xea,0x21,0x7e,0x14, +0xc1,0x81,0x3e,0xe6,0x39,0x9e,0x14,0x80,0x14,0x0, 0x12,0xff,0xe0,0x0, 0x12,0x1, +0xe1,0x80,0xac,0x9e,0xc6,0x8a,0x3f,0x73,0xe0,0x40,0xaa,0xed,0xe1,0x80,0xac,0x9f, +0xe1,0x80,0xb4,0x1a,0xe1,0x80,0xb4,0x1b,0xe1,0x80,0xaa,0x1c,0x1, 0xf2,0xe0,0x0, +0x1f,0x3b,0x7f,0x16,0xac,0x8e,0xf0,0xa, 0x25,0xaf,0x67,0x83,0x67,0x3, 0x37,0xa3, +0xc7,0x94,0x7f,0x97,0xea,0x22,0x7f,0xac,0x7f,0x87,0xea,0x22,0x7f,0x98,0x7f,0x86, +0xea,0x22,0x7f,0xb8,0xe4,0x0, 0xc7,0x1e,0x7f,0x8b,0xea,0x21,0x7f,0x94,0xf0,0x2, +0x1c,0x21,0xf8,0x40,0x3f,0x6b,0x7f,0x18,0xe8,0x40,0x3a,0x69,0xe0,0x0, 0x7f,0x91, +0xf0,0x40,0x3d,0xe6,0xf0,0x0, 0x7c,0x95,0xf0,0x0, 0x16,0xa, 0xf0,0x1c,0x3e,0x34, +0xf8,0xe, 0x3c,0x1c,0x81,0xce,0xe2,0x0, 0xc1,0x8f,0x39,0xf2,0x3, 0xb9,0xe0,0x1a, +0x31,0xa3,0xf8,0xb, 0x3c,0x1a,0xe0,0x2, 0xc5,0xac,0x8c,0xb, 0xe2,0x0, 0xcc,0x1, +0xe0,0x3, 0x1, 0x44,0x64,0x86,0xe0,0x5, 0x31,0xa1,0x3c,0x95,0x95,0x89,0xc5,0x81, +0xb5,0x89,0x2c,0xe, 0xea,0x20,0x7d,0xec,0xea,0x22,0x7d,0x4, 0xe0,0x9, 0x31,0xa2, +0x93,0x8e,0x93,0x1e,0x3d,0x99,0x3d,0x15,0xb3,0x8b,0xb3,0x1b,0xb4,0xa, 0x21,0x18, +0xe8,0x0, 0x8a,0xcb,0xe8,0x40,0x3d,0xeb,0x39,0xf5,0x17,0x1, 0x1, 0x89,0xe0,0x9, +0x0, 0x94,0xe0,0x1, 0x8f,0xeb,0xc5,0x8a,0x39,0xff,0xe0,0x1, 0x1, 0x60,0x3f,0xee, +0xe2,0x1, 0xc7,0xff,0x39,0x7f,0x3d,0x6e,0x17,0x1, 0x3f,0x1a,0x2, 0xf3,0xc2,0x1, +0xe2,0x1, 0xc2,0x7f,0xf0,0x40,0x3f,0x74,0xe7,0xff,0x2, 0xb8,0x12,0x8a,0x3a,0xb2, +0xe0,0x1, 0x14,0x14,0xe0,0x2, 0x1c,0xa1,0x3d,0x65,0x3c,0x10,0xe8,0x40,0x3b,0x6b, +0xf8,0x40,0x3d,0xee,0xe0,0x3, 0xd4,0x38,0xf0,0xa, 0x27,0x3e,0x11,0xff,0xe8,0x3, +0x39,0x9e,0xe2,0x1, 0xc1,0xff,0xc1,0x81,0xe4,0x0, 0xc1,0x8a,0xea,0x22,0x7f,0xac, +0x3a,0x6f,0xea,0x16,0x7c,0x58,0xe0,0x2, 0x1c,0xa1,0xe8,0x3, 0x39,0x98,0x8d,0x49, +0xe0,0xf, 0x3a,0x1a,0x8d,0x8f,0x25,0x9f,0x21,0x1e,0x3f,0x66,0x3e,0xe8,0x17,0x80, +0x0, 0x8d,0xe2,0x0, 0xcd,0x82,0xe0,0x1, 0x1, 0x15,0xc7,0x81,0x3e,0x6f,0xe2,0x1, +0xc6,0x7f,0x3e,0x72,0xc7,0xa, 0xc6,0x8a,0x3, 0x8e,0xe2,0x0, 0xcd,0x81,0x1, 0xf2, +0x8e,0x4e,0x3e,0x7a,0x1, 0xf3,0xe4,0x0, 0xc7,0x8a,0x3f,0x96,0x97,0xf, 0x97,0x9f, +0xb7,0x9, 0xb7,0x99,0xc4,0x8a,0x39,0xf9,0x1, 0xdb,0x3c,0xe6,0x3d,0x65,0xe0,0x3, +0xd3,0xfb,0xe0,0x1, 0x14,0x94,0x3d,0x65,0x3c,0x90,0x3c,0x66,0xe0,0x3, 0xd3,0xf4, +0xe0,0x0, 0x21,0x41,0x11,0xff,0x39,0x92,0xe2,0x1, 0xc1,0xff,0xc1,0x81,0xe4,0x0, +0xc1,0x8a,0xe0,0x2, 0x1a,0x21,0xf0,0x40,0x3b,0x66,0x39,0x96,0x13,0xfd,0x13,0x0, +0xe0,0x0, 0x12,0x80,0xf7,0xff,0x13,0xff,0xe8,0x0, 0x8f,0x46,0xe0,0xf, 0x37,0x23, +0x3f,0x72,0x3f,0x94,0xe0,0x2, 0xc7,0xac,0x3, 0xa0,0x87,0x8f,0xea,0x22,0x7c,0xb8, +0x3f,0xd7,0xe2,0x1, 0xc7,0xfd,0xea,0x22,0x7d,0x2c,0xea,0x22,0x7d,0x98,0xea,0x22, +0x7e,0x4, 0xea,0x21,0x7e,0x94,0xe2,0x0, 0xcf,0x81,0xe0,0x8, 0x37,0x21,0x3c,0x9e, +0x3d,0x1e,0x3d,0x98,0x3e,0x18,0x3f,0x1d,0x1, 0x88,0xf8,0x0, 0xab,0xc6,0xab,0x9, +0xab,0xa, 0xb2,0x8b,0xb2,0x8c,0xaf,0x8e,0xf0,0x0, 0xc3,0xa, 0xe8,0x40,0x39,0xf6, +0x1, 0xd4,0xe0,0x2, 0x1f,0xa0,0x17,0x0, 0xf0,0x0, 0xad,0x8f,0xe0,0x2, 0x1f,0xd5, +0xaf,0xf, 0xe0,0x1, 0xc0,0x74,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x0, 0xb5,0x8f, +0xe7,0xfd,0x0, 0x8b,0x67,0x9, 0xc7,0xff,0xaf,0x8e,0xe7,0xfd,0x0, 0x94,0xe0,0x0, +0x17,0xe4,0xe7,0xfd,0x0, 0x80,0xe0,0x2, 0x1f,0x9f,0x8f,0x8f,0xe0,0x5, 0x2f,0xe8, +0xe0,0x1, 0x1f,0x9c,0x89,0xf, 0x7f,0x8f,0xe7,0xfd,0x29,0x32,0xe0,0x0, 0x1f,0x3b, +0xfa,0x21,0x7b,0x20,0xe8,0x40,0x3b,0x66,0x7f,0x16,0xa9,0xe, 0xe7,0xfd,0x0, 0xd7, +0x8e,0x4d,0x3e,0x7a,0xe7,0xfe,0x1, 0xeb,0xe4,0x0, 0xc7,0x8a,0x3f,0x98,0x97,0xf, +0x97,0x9f,0xb7,0x9, 0xb7,0x99,0xe7,0xfe,0x0, 0xf7,0x3a,0xe3,0xf0,0x0, 0x14,0x8a, +0xf0,0x19,0x3c,0xba,0xf8,0x1d,0x3e,0x18,0xf8,0xe, 0x3d,0x99,0xe0,0x0, 0x11,0x78, +0x9d,0x9e,0x9d,0xe, 0xe8,0x0, 0x9c,0x9d,0x39,0x35,0xea,0x17,0x7f,0x3c,0xe8,0x0, +0x9c,0xd, 0xe0,0x6, 0x39,0x1e,0xef,0xfd,0xd2,0xef,0xea,0x20,0x7d,0xec,0xe0,0xa, +0x32,0xa2,0x3d,0x1b,0x9d,0x9a,0x3b,0xe8,0x9d,0xa, 0xe8,0x0, 0x9c,0x9d,0xe8,0x0, +0x9c,0xd, 0xef,0xfd,0xd2,0xe1,0xea,0x22,0x7d,0x84,0xe0,0x16,0x32,0xa1,0xe8,0xb, +0x3d,0x96,0x91,0xb, 0x7c,0x12,0x39,0x17,0xe3,0xff,0xc1,0x7f,0xe2,0x1f,0xc9,0x20, +0xe0,0x3, 0x2, 0xc2,0xb1,0xb, 0xf8,0xa, 0x3d,0x99,0x65,0x8b,0xe8,0x0, 0x9f,0x8d, +0xe8,0x0, 0x9f,0x1d,0x94,0xa, 0x95,0x1a,0x3d,0x95,0xf8,0x0, 0x8e,0xed,0x8c,0x8b, +0xe0,0x8, 0x3f,0xa8,0x65,0x86,0xe0,0xa, 0x3f,0x2a,0xe0,0x43,0x3c,0x18,0xe0,0x43, +0x3d,0x1a,0xe8,0xb, 0x3d,0x96,0xf0,0x0, 0x7e,0x8c,0x7f,0x84,0x7f,0x8, 0x7c,0x13, +0x7d,0x14,0xf0,0x0, 0x9e,0x8b,0xe0,0x1, 0x24,0x92,0x15,0x98,0x3d,0xb9,0xf7,0xff, +0x12,0xe8,0x3d,0x96,0xf0,0x15,0x3a,0x9b,0xe0,0x0, 0x15,0x64,0xf8,0x15,0x8, 0x5, +0x3d,0x10,0xe2,0x0, 0xcc,0x81,0xf8,0xa, 0x8, 0x15,0xf0,0x0, 0x9c,0xda,0xe0,0x8, +0x5, 0x97,0xf7,0xff,0x12,0xd0,0xf0,0x15,0x3a,0x9b,0xf8,0x15,0x8, 0x5, 0xe0,0x0, +0x15,0xfc,0x3d,0x90,0xf8,0xb, 0x8, 0x15,0xf0,0x40,0x3a,0xe6,0x65,0x15,0x14,0x0, +0xc5,0x1, 0xe8,0x0, 0x97,0xd5,0xe2,0x1, 0xc5,0x7f,0x3c,0xfa,0x3c,0x1f,0xe3,0xff, +0xc4,0x7f,0xf0,0x0, 0xc2,0x98,0x2, 0xf5,0xe0,0x3, 0xd0,0xb6,0x65,0x91,0xe3,0xff, +0xc4,0x7f,0x3d,0x95,0x8d,0x8b,0x7c,0xd, 0xe0,0x0, 0x2d,0xed,0x67,0x97,0xe8,0x40, +0x3d,0x69,0xf0,0x40,0x3c,0xff,0x5, 0x5, 0x67,0x17,0x3f,0x77,0xe0,0x4, 0x4, 0x4b, +0xe0,0x0, 0x4d,0xe4,0x5c,0xb7,0xe4,0x0, 0xc5,0x85,0x17,0x0, 0x3c,0xfb,0x7f,0x10, +0x5, 0xa, 0xe0,0x0, 0x4d,0xfc,0xe0,0x0, 0x5c,0xc3,0xe4,0x0, 0xc5,0x85,0x3c,0xfb, +0xe0,0x4, 0x2, 0x32,0x65,0x98,0x3d,0x9a,0x3d,0xf7,0xe0,0x3, 0x4, 0x15,0xe0,0x0, +0xc5,0x40,0x3d,0x77,0xe0,0x4, 0x3, 0x22,0x67,0x10,0xe0,0x5, 0x2f,0x79,0xe0,0x1, +0x17,0xc8,0x7f,0x8e,0xe0,0x3, 0x0, 0x8b,0xea,0x22,0x7f,0x4, 0x14,0x8a,0xe0,0x7, +0x31,0xa1,0xea,0x22,0x7d,0x38,0xea,0x22,0x7d,0x98,0x3c,0xb3,0xea,0x21,0x7f,0x94, +0xf0,0x0, 0x63,0x87,0xc2,0x1, 0x12,0x80,0x3f,0x17,0xe2,0x1, 0xc2,0x7f,0x13,0x0, +0x3d,0x13,0xf0,0x17,0x3b,0x93,0x3d,0x97,0xe8,0x9, 0x3c,0x9b,0x3f,0x93,0xb2,0x8e, +0xf0,0x40,0x3f,0x74,0x17,0x7f,0xab,0xa, 0xe8,0x0, 0xab,0x7, 0xb2,0x8b,0xaf,0x49, +0xac,0xf, 0xe7,0xfc,0x2, 0x83,0xe7,0xfc,0x0, 0xcb,0x65,0x91,0x7c,0x99,0x3d,0x95, +0x8d,0x8b,0x7c,0x9a,0x7c,0x9b,0x7c,0x9c,0x7c,0x9d,0x7c,0x9e,0x7c,0x9f,0x7c,0xa0, +0x7c,0xa1,0x7c,0xa2,0x7c,0xa3,0x7c,0xa4,0xe0,0x3, 0x25,0xcc,0xf0,0x40,0x3c,0xe9, +0x7c,0x8d,0xc5,0xff,0x65,0x7, 0x67,0x95,0x64,0x91,0x3d,0x15,0x3c,0x95,0x7f,0x90, +0xe0,0x0, 0x17,0x78,0x17,0x81,0x8d,0xa, 0xad,0x89,0x7f,0xe, 0x7f,0x85,0xe0,0x1, +0x2d,0x48,0xe0,0x0, 0x15,0xe4,0xe1,0x2b,0x3b,0x9b,0xe0,0x1, 0x25,0xba,0x67,0x5, +0xe0,0x1, 0x27,0x37,0x65,0x87,0xf0,0x0, 0x62,0x83,0x3d,0x95,0x14,0x81,0xac,0x8b, +0xf2,0x1, 0xc2,0xff,0xf0,0x40,0x3c,0xea,0xe0,0x0, 0x15,0xe4,0xe8,0xb, 0x3d,0xb5, +0xe3,0xff,0xc5,0xfc,0xe2,0x5, 0xcd,0x80,0x5, 0x8a,0x67,0x9, 0x8d,0xe, 0xe2,0x0, +0xcd,0x0, 0xe0,0x5, 0x15,0x0, 0xe0,0x6a,0x39,0xab,0x3d,0xea,0x3d,0xf7,0xe0,0x1, +0x3, 0x8d,0xf2,0x0, 0xce,0x82,0xe0,0x1, 0x5, 0x89,0xf8,0xb, 0x3c,0x1a,0x64,0x87, +0xe0,0x2, 0xc5,0xac,0x3c,0x95,0x14,0x0, 0x8d,0xb, 0xac,0x9, 0xe0,0x2, 0x2d,0x18, +0x15,0x3, 0xad,0xb, 0xe0,0xb, 0x32,0xa3,0xe8,0xb, 0x3d,0x98,0xe0,0x2, 0xc5,0xad, +0x15,0x3, 0xad,0xb, 0xf0,0x0, 0x27,0x3d,0x16,0xff,0xe8,0xd, 0x3e,0x9e,0xf0,0x40, +0x3f,0x6d,0xf2,0x1, 0xc7,0x7f,0x15,0x8a,0xe8,0xb, 0x3d,0xbe,0xf8,0xf, 0x3e,0x18, +0xe8,0xb, 0x3d,0x98,0xf0,0x0, 0x91,0xab,0xf0,0x0, 0x92,0x3b,0xf0,0x0, 0x90,0xb, +0xf0,0x0, 0x91,0x1b,0xf0,0x0, 0x90,0xcb,0xf0,0x0, 0x9a,0x8f,0xf0,0x0, 0x9b,0x1f, +0xf0,0x0, 0x8b,0xcf,0x89,0xdf,0x8c,0x6f,0x8c,0xff,0xe0,0x1, 0x8d,0xf, 0xf0,0x0, +0xb0,0xf, 0xc2,0x7f,0xf0,0x0, 0xb1,0x1f,0xe2,0x1, 0xc2,0x7f,0xf0,0x0, 0xb1,0xaf, +0xf0,0x0, 0xb2,0x3f,0xf0,0x0, 0xb0,0xcf,0xf0,0x0, 0xb2,0x8b,0xf0,0x0, 0xb3,0x1b, +0xf0,0x0, 0xab,0xcb,0xa9,0xdb,0xac,0x6b,0xac,0xfb,0xe0,0x1, 0xad,0xb, 0x67,0xb, +0x3a,0x9e,0x8d,0x85,0xe2,0x0, 0xcd,0x85,0xe0,0x0, 0x1, 0x72,0x17,0x98,0x3f,0xbb, +0xc2,0x1, 0xe0,0xe, 0x3b,0x1f,0x67,0x83,0xe2,0x1, 0xc2,0x7f,0xaf,0x8e,0xc5,0x81, +0x67,0x8e,0xe0,0x1, 0xb1,0x3e,0xf0,0x40,0x3f,0x74,0xaf,0x9e,0x67,0x8c,0xb3,0xde, +0xaf,0xae,0x67,0x90,0xf0,0x1, 0xb6,0x9e,0xaf,0xbe,0x67,0x85,0xad,0x85,0xaf,0xce, +0x67,0x93,0xb7,0xbe,0x67,0x94,0xb7,0xce,0x67,0x92,0xb7,0xee,0x67,0x84,0xb7,0xfe, +0x67,0x88,0xe0,0x1, 0xb7,0x8e,0x67,0x8d,0xe0,0x1, 0xb7,0xae,0x67,0xf, 0x89,0xe, +0xe7,0xfa,0x2, 0xac,0xe7,0xfa,0x0, 0xf4,0xf7,0xff,0x24,0xcb,0xe7,0xfe,0x0, 0xf7, +0x15,0x0, 0xe0,0x0, 0x17,0xee,0x17,0x0, 0xad,0xb, 0x7f,0x8e,0x7f,0x5, 0xf0,0x0, +0x14,0x80,0xf0,0x0, 0x62,0x83,0xf2,0x1, 0xc2,0xff,0xe7,0xfe,0x0, 0xcf,0xe2,0x0, +0xcd,0x1, 0xe0,0x2, 0x1, 0x16,0xe2,0x0, 0xcd,0x2, 0x1, 0xf2,0xf0,0x0, 0x62,0x83, +0xe0,0x0, 0x4c,0xfc,0xe0,0x0, 0x5c,0x43,0xf2,0x1, 0xc2,0xff,0xf0,0x0, 0x7a,0x81, +0xe0,0x2, 0xdf,0x5a,0xf0,0x0, 0x62,0x81,0xe0,0xa, 0x34,0x1, 0xe8,0xa, 0x3d,0x35, +0x65,0x87,0xe3,0xff,0xc5,0x7f,0x3d,0x95,0xe1,0x39,0x3d,0x17,0x15,0x0, 0xad,0xb, +0xe7,0xfe,0x0, 0xac,0xe0,0x1f,0x15,0x20,0xb5,0xb, 0xe0,0x1f,0x11,0x20,0xe7,0xfc, +0x0, 0xbc,0x67,0x9, 0x17,0x83,0xaf,0x8e,0xe7,0xf8,0x0, 0xed,0xe0,0x0, 0x12,0xe0, +0xf0,0x40,0x3c,0xe6,0x3a,0x96,0x11,0x98,0xe8,0x40,0x3c,0x69,0xf0,0x0, 0xc4,0x98, +0x3d,0x63,0xe8,0x40,0x3c,0xe9,0xe0,0x3, 0xd1,0x67,0xe8,0x40,0x3a,0xf9,0x1, 0xf5, +0x67,0x83,0x67,0xe, 0xe0,0xc, 0xaf,0x86,0xc2,0x1, 0x67,0x8c,0xe0,0xc, 0xaf,0x16, +0xe2,0x1, 0xc2,0x7f,0x67,0x10,0xe0,0xc, 0xaf,0xa6,0xf0,0x40,0x3f,0x74,0x67,0x85, +0xe0,0xc, 0xaf,0x36,0x67,0x13,0xe0,0xc, 0xaf,0xc6,0x67,0x94,0xe0,0x6, 0xb7,0x36, +0x67,0x12,0xe0,0x6, 0xb7,0xc6,0x67,0x84,0xe0,0x6, 0xb7,0x66,0x67,0x8, 0xe0,0x6, +0xb7,0xf6,0x67,0x8d,0xe0,0x7, 0xb7,0x6, 0x67,0xf, 0xe0,0x7, 0xb1,0x36,0xe0,0x6, +0xb3,0xd6,0xf0,0x7, 0xb6,0x96,0xe0,0x7, 0xb7,0xa6,0x89,0xe, 0xe7,0xf9,0x2, 0xa6, +0xe7,0xf9,0x0, 0xee,0xe0,0x0, 0x17,0x64,0x7f,0xe, 0x67,0x8d,0xe2,0x0, 0xcf,0x8a, +0x2, 0xb4,0x17,0x1, 0x7f,0x5, 0x67,0x16,0x8d,0x8e,0xe2,0x0, 0xcd,0x81,0x65,0x87, +0x3d,0x95,0xe7,0xfe,0x1, 0x6f,0x8d,0xb, 0xe7,0xfd,0x0, 0xb3,0x67,0x8f,0x15,0x1, +0x8c,0xf, 0xad,0xb, 0xe7,0xfd,0x24,0x68,0xe8,0x19,0x8d,0xc8,0x3d,0xf3,0xe0,0x3, +0x1, 0x7f,0xe0,0x2, 0x1d,0x21,0x15,0x81,0x3f,0xeb,0xe2,0x1, 0xc7,0xff,0x3c,0x7f, +0xf0,0x40,0x3b,0xeb,0xc5,0x81,0xe7,0xfd,0x5, 0xd7,0xe0,0x1a,0x8f,0xea,0xc5,0xa, +0x39,0xff,0x1, 0xf3,0x15,0x8a,0xe8,0xb, 0x3d,0xb7,0x15,0x7f,0xe8,0xb, 0x3d,0x98, +0xe0,0x19,0xad,0x4b,0xe7,0xfd,0x0, 0xc8,0xf0,0x0, 0x5a,0xbc,0x17,0x81,0xf2,0x0, +0xca,0x8a,0x7f,0x85,0x5, 0xc9,0xe0,0x0, 0x5d,0xc8,0xe2,0x0, 0xcd,0x8a,0x5, 0xc4, +0x55,0xba,0x54,0x36,0x55,0x35,0x3d,0x98,0xe0,0x43,0x3d,0x9b,0x54,0xb9,0xe2,0x0, +0xcd,0x80,0x3c,0x9a,0xe0,0x43,0x3c,0x99,0x3d,0x6b,0xe0,0x3, 0x4, 0x62,0xe2,0x0, +0xcc,0x80,0x3d,0xea,0xe3,0xff,0xc5,0xff,0x3d,0x69,0xe0,0x3, 0x4, 0x57,0x64,0x88, +0x64,0x4, 0xe3,0xff,0xc5,0x7f,0xf0,0x0, 0x7a,0x81,0xef,0xfd,0xd0,0x5d,0x5d,0xbd, +0xe0,0x43,0x3c,0x18,0xe2,0x1f,0xcd,0x9f,0xf0,0x0, 0x62,0x81,0xe0,0x3, 0x5, 0xb4, +0x15,0x8f,0xe8,0xb, 0x3d,0xb5,0xe3,0xff,0xc5,0xff,0x3c,0x7b,0x67,0x8e,0xe0,0x28, +0x3c,0x2b,0x15,0xa8,0xe0,0x6b,0x3b,0x2f,0x7c,0x5, 0x7d,0x8e,0xe7,0xff,0x0, 0x8d, +0xf0,0x40,0x3c,0xeb,0x3d,0x6b,0x7d,0x8d,0xe7,0xfb,0x0, 0xd4,0xe0,0x0, 0x1f,0xbb, +0xe0,0x1, 0x1f,0x1c,0xfa,0x21,0x7b,0x20,0xe8,0x40,0x3b,0x66,0x7f,0x96,0x7f,0xf, +0xae,0x8f,0x89,0xe, 0xe7,0xf7,0x0, 0xf3,0x17,0x94,0x17,0x0, 0x7f,0x8e,0x7f,0x5, +0xe7,0xfe,0x0, 0xf3,0x5c,0xbc,0x15,0x94,0xe1,0x2b,0x3c,0x9b,0x7d,0x90,0xe7,0xfb, +0x0, 0xcb,0xe0,0x2, 0x1f,0x8e,0x15,0x81,0xad,0x8f,0xe7,0xfb,0x0, 0xb3,0xe0,0x0, +0x5d,0xc8,0xe2,0x0, 0xcd,0x82,0x2, 0x98,0x5d,0x37,0xe2,0x0, 0xcd,0x4f,0x2, 0x94, +0xf2,0x0, 0xce,0x93,0xe0,0x0, 0x2, 0xc7,0xe0,0x0, 0x5d,0x44,0xe2,0x0, 0xcd,0x1d, +0x2, 0x8b,0x5d,0x38,0xe2,0x0, 0xcd,0x4f,0x2, 0x87,0xf0,0x0, 0x62,0x83,0xf2,0x1, +0xc2,0xff,0xe0,0x1, 0x0, 0x87,0xf2,0x0, 0xce,0x89,0x2, 0xb4,0xf0,0x0, 0x5a,0x3c, +0xf2,0x0, 0xca,0x8, 0x5, 0xbc,0x67,0x8c,0xe2,0x0, 0xcf,0x8e,0x2, 0xad,0xe0,0x0, +0x4d,0xe4,0xe8,0x40,0x3c,0x69,0x3c,0xeb,0x7d,0x82,0xe0,0x2, 0xde,0x25,0xf0,0x0, +0x62,0x83,0xe0,0x16,0x34,0x2, 0xf2,0x1, 0xc2,0xff,0xf8,0x16,0x3b,0x35,0x65,0x82, +0xf8,0x40,0x3c,0xe6,0xf3,0xff,0xc4,0xff,0xf2,0x0, 0xcc,0xf8,0xe0,0x2, 0x2, 0xb0, +0xe2,0x0, 0xcd,0x8a,0xe0,0x0, 0x5, 0xde,0xf2,0x0, 0xcc,0xcf,0xe8,0x40,0x3d,0xe9, +0x2, 0x83,0xe0,0x0, 0x15,0xd0,0xf0,0x40,0x3c,0xeb,0xf3,0xff,0xc4,0xff,0xe0,0x0, +0x0, 0xd1,0xf0,0x0, 0x5a,0x3c,0x15,0xf, 0xf1,0x29,0x3a,0x1a,0x24,0x88,0xe1,0x2b, +0x3d,0x9a,0x25,0x85,0x67,0xc, 0xe2,0x0, 0xcf,0x9, 0x5, 0xca,0xe0,0x0, 0x4d,0xff, +0xe0,0x0, 0x2d,0xec,0xf0,0x0, 0x62,0x83,0xe0,0x0, 0x4c,0xe4,0x5c,0x37,0xf2,0x1, +0xc2,0xff,0xf0,0x0, 0x7a,0x2, 0xf0,0x0, 0x7a,0x81,0xe0,0x2, 0xdd,0xe5,0xe0,0x0, +0x4d,0x66,0xf0,0x0, 0x62,0x81,0xe0,0xb, 0x34,0x1, 0x67,0x8c,0xe8,0xb, 0x3d,0xb5, +0x35,0x21,0xe0,0x2a,0x3f,0x9a,0xe3,0xff,0xc5,0xff,0xf0,0x0, 0x62,0x2, 0x25,0x37, +0x15,0x1d,0xe9,0x34,0x3d,0x24,0xf0,0x0, 0x22,0x33,0xe0,0x2, 0x1d,0x12,0x8d,0xa, +0x2d,0x2e,0xe0,0x0, 0x4d,0x7e,0xe0,0xa, 0x3f,0xaa,0xe0,0x43,0x3c,0x9a,0xe2,0x0, +0xcc,0x80,0x5, 0x22,0xe2,0x0, 0xcd,0x5, 0x5, 0x22,0xe2,0x1, 0xcd,0xc7,0xf0,0x40, +0x3b,0x6b,0x2, 0x83,0xf0,0x1, 0x13,0x48,0xf8,0x40,0x3c,0xe6,0xf3,0xff,0xc4,0xff, +0xf0,0x40,0x3c,0xf7,0x5, 0xae,0xf2,0x0, 0xce,0x87,0xe0,0x1, 0x2, 0x9c,0xe2,0x0, +0xcb,0x94,0xe0,0x1, 0x5, 0xaa,0x65,0x87,0x15,0x2, 0x3d,0x95,0xad,0xb, 0xf0,0x0, +0x14,0x80,0xe7,0xfb,0x0, 0x83,0xe3,0xff,0xcc,0xfb,0x4, 0x60,0x67,0xc, 0xf0,0x40, +0x3b,0x6b,0xe2,0x0, 0xcf,0xf, 0xe0,0x0, 0x2, 0xdf,0xe2,0x0, 0xcd,0xf8,0x5, 0xdd, +0xf0,0x0, 0x13,0x78,0x0, 0xda,0x15,0x0, 0xe7,0xf8,0x0, 0xd2,0x17,0xa, 0x17,0x80, +0x7f,0xe, 0x7f,0x85,0xe7,0xfd,0x0, 0x99,0xf0,0x0, 0x62,0x83,0xf2,0x1, 0xc2,0xff, +0xe0,0x0, 0x15,0xe4,0xe1,0x2b,0x3b,0x9b,0xe0,0x0, 0x25,0xcc,0x67,0x5, 0xe0,0x0, +0x27,0x49,0x65,0x87,0x15,0x3, 0x3d,0x95,0xf2,0x0, 0xce,0x9d,0xad,0xb, 0xe0,0x1, +0x2, 0x93,0xe0,0x2, 0x1f,0xf8,0x8d,0x9f,0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5d,0xc4, +0xe0,0x0, 0x5, 0xee,0xe0,0x0, 0x4d,0x67,0xe0,0x0, 0x2d,0x6a,0xe2,0x0, 0xcd,0x9d, +0xf0,0x40,0x3c,0xea,0xe0,0x1, 0x5, 0xad,0x65,0x87,0x3d,0x95,0x8d,0x8b,0xe2,0x0, +0xcd,0x81,0x1, 0x2d,0xe2,0x0, 0xcd,0x83,0xe7,0xfa,0x1, 0xb8,0x65,0x87,0x15,0x1, +0x3d,0x95,0xad,0xb, 0xe7,0xfa,0x0, 0xb2,0xe0,0x0, 0x1f,0xbb,0xea,0x21,0x7b,0x20, +0xf0,0x0, 0xad,0x8f,0x12,0x8a,0x3a,0xb2,0xe0,0x2, 0x1c,0xa1,0xe0,0x1, 0x14,0x14, +0x3d,0x65,0x3c,0x10,0xe0,0x2, 0xdf,0x78,0xea,0x16,0x7c,0x58,0xf8,0x40,0x3d,0xe9, +0xe7,0xf6,0x0, 0xf5,0xe2,0x1, 0xcd,0xc8,0xe7,0xff,0x5, 0x80,0xe7,0xfe,0x0, 0xfc, +0xf2,0x0, 0xce,0x9d,0xf0,0x0, 0x14,0x80,0xe7,0xff,0x5, 0xbd,0xe0,0x0, 0x5d,0xc6, +0xe0,0x0, 0x5d,0x45,0x64,0x88,0x64,0x4, 0xf0,0x0, 0x7a,0x81,0xef,0xfc,0xde,0xec, +0xe2,0x0, 0xcc,0x3b,0xf0,0x0, 0x62,0x81,0x2, 0x87,0x65,0x8b,0x15,0x0, 0x3d,0x95, +0xad,0xb, 0xf0,0x0, 0x14,0x80,0x65,0x87,0x15,0x0, 0x3d,0x95,0xad,0xb, 0xe7,0xf9, +0x0, 0xf5,0xe0,0x0, 0x5d,0xc4,0xe2,0x0, 0xcd,0xe4,0x5, 0x8e,0x15,0x93,0xe9,0x2b, +0x3d,0xad,0x25,0x8a,0x15,0x94,0xe1,0x2b,0x3b,0x9b,0x25,0x86,0x67,0x8c,0xe2,0x0, +0xcf,0x93,0xe7,0xfe,0x5, 0xda,0xf0,0x0, 0x14,0x81,0x0, 0xd1,0xe2,0x0, 0xcd,0x9d, +0xf0,0x0, 0x14,0x80,0xe7,0xff,0x2, 0x9a,0x67,0x12,0xe2,0x0, 0xcf,0x1d,0xe7,0xff, +0x2, 0x95,0x67,0x8a,0x9d,0x8f,0xe2,0x0, 0xcd,0xf7,0xe7,0xff,0x2, 0x8f,0xe0,0x2, +0x1d,0x92,0x8d,0x8b,0xe8,0x39,0x3d,0x89,0xe7,0xff,0x0, 0x88,0xf0,0x0, 0x14,0xf8, +0xe7,0xfe,0x0, 0xb0,0xf0,0x0, 0x14,0x80,0xe7,0xff,0x0, 0x8a,0xf0,0x0, 0x13,0x80, +0xe7,0xfc,0x0, 0x92,0x15,0x9, 0x15,0x86,0x67,0xc, 0xe8,0xa, 0x3d,0x35,0xe8,0xb, +0x3d,0xb5,0xe2,0x0, 0xcf,0xb, 0xe3,0xff,0xc5,0xfe,0xe3,0xff,0xc5,0x7f,0xe0,0x6a, +0x3c,0xab,0x3d,0xea,0xe7,0xfc,0x0, 0xc3,0x15,0x0, 0xe7,0xfc,0x0, 0xaa,0x15,0x0, +0xe7,0xfc,0x0, 0x9f,0xea,0x16,0x7c,0x58,0xe7,0xf5,0x0, 0xf9,0x15,0x80,0x7d,0x9f, +0x7d,0xa0,0x7d,0xa1,0x7d,0xa2,0x7d,0xa3,0x7d,0xa4,0xe7,0xf7,0x0, 0xef,0x64,0x88, +0x64,0x4, 0xf0,0x0, 0x7a,0x81,0xd9,0x6c,0xf0,0x40,0x3c,0xe8,0xf0,0x0, 0x62,0x81, +0xe7,0xfe,0x24,0x4c,0xe7,0xfe,0x0, 0x81,0x8, 0xb2,0xe0,0x1, 0x1f,0x9c,0xea,0x22, +0x7c,0x4c,0x89,0xf, 0x14,0x80,0x31,0x21,0x3d,0x62,0xe0,0x2, 0xdf,0xf, 0xea,0x22, +0x7c,0x60,0x3d,0x62,0x14,0x80,0x9, 0x21,0xe0,0x5e,0x0, 0x88,0x3f,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3e,0xe1,0xfe,0xc0,0x5c,0xe0,0x2, 0x19,0x20,0xea,0x16,0x78,0xd6, +0xf0,0x0, 0x8f,0x2, 0xf0,0x2, 0x1c,0xa1,0x89,0x81,0xf0,0x0, 0x2f,0x6e,0x21,0x85, +0xe0,0x2, 0x1f,0x93,0xf0,0x0, 0xaf,0xf, 0xdf,0xd8,0xe0,0x1, 0x1e,0x9c,0x8a,0x8d, +0x13,0xa, 0x3b,0x35,0xe0,0x1, 0x14,0xff,0x3d,0x66,0xe2,0x0, 0x7c,0x44,0x7e,0x81, +0xe0,0x2, 0xde,0xe4,0x14,0x80,0xe2,0x0, 0x7d,0xc4,0xe8,0x40,0x3d,0x6e,0x3c,0x69, +0xef,0xff,0xd7,0xe2,0x3d,0x65,0xe8,0x40,0x3c,0xee,0xe2,0x0, 0x7d,0xc4,0xef,0xff, +0xd7,0xdb,0xe0,0x2, 0x1c,0xa1,0x15,0x0, 0xe2,0x0, 0x7a,0x44,0x66,0x81,0x22,0xad, +0x24,0x11,0x8d,0xc9,0x8f,0xc4,0x3f,0xfb,0x1, 0x21,0x3f,0x64,0x17,0x80,0x0, 0x84, +0x8e,0x4e,0x3e,0x7b,0x1, 0x1b,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0xf8,0xc7,0xa, +0x1, 0xf8,0x17,0xa, 0x3f,0x3a,0x17,0x8a,0xe8,0xe, 0x3f,0x19,0x3f,0xb8,0x93,0x8e, +0x90,0x9e,0x95,0xae,0x96,0x3e,0x97,0x4e,0x3f,0x94,0xc4,0x1, 0xb3,0x8f,0xe2,0x1, +0xc4,0x7f,0xb0,0x9f,0xb5,0xaf,0xb6,0x3f,0xb7,0x4f,0xc5,0x1, 0x3f,0xea,0xe2,0x1, +0xc7,0xff,0x3a,0xff,0xc4,0x8a,0x2, 0xd5,0xe0,0x2, 0x1c,0x1d,0xe0,0x0, 0x14,0xc4, +0x3d,0x66,0x3c,0x90,0x7e,0x81,0xe0,0x2, 0xde,0x5f,0x66,0x81,0xe0,0x5, 0x21,0x9b, +0xe0,0x2, 0x1f,0x93,0xf0,0x2, 0x19,0x21,0x8f,0x8f,0x27,0xb4,0x8b,0x8d,0xf0,0x1, +0x27,0x2, 0xe0,0x0, 0x0, 0xfc,0xe0,0x1, 0x1e,0x9c,0x8a,0x8d,0x29,0x93,0x22,0x92, +0x17,0x7f,0x3f,0x15,0xe2,0x1, 0xc7,0x7f,0xc7,0x1, 0xe4,0x0, 0xc7,0xa, 0xe8,0x40, +0x3f,0xe9,0xe8,0xe, 0x3f,0x19,0x16,0x7f,0xe0,0x19,0xae,0x4f,0xc7,0x8a,0x3f,0xfe, +0x1, 0xfc,0x15,0xff,0xe8,0xb, 0x3d,0x9e,0xe2,0x1, 0xc5,0xff,0xc5,0x81,0xe4,0x0, +0xc5,0x8a,0xe0,0x2, 0x1f,0xa1,0xe8,0xb, 0x3d,0x99,0x96,0xf, 0x97,0x1f,0x36,0x24, +0xb6,0xf, 0xc7,0x8a,0x37,0x24,0x3f,0xfb,0xe0,0x40,0xb7,0x4f,0x1, 0xf7,0xe7,0xfe, +0x0, 0xf1,0xf0,0x4, 0x27,0x6c,0xe0,0x1, 0x1f,0xad,0xf7,0xff,0x12,0xff,0xf8,0x15, +0x3a,0x9e,0xf0,0x1, 0x9a,0x1f,0xf2,0x1, 0xc2,0xff,0xe0,0x2, 0x1f,0x96,0xf0,0x0, +0xc2,0x81,0xf4,0x0, 0xc2,0x8a,0xf0,0x0, 0x88,0x8f,0x89,0x2, 0xea,0x22,0x7d,0x4c, +0xea,0x22,0x7d,0xe0,0xf8,0x19,0x88,0x49,0xf0,0x2, 0x19,0xd7,0x8b,0x8d,0xf0,0x0, +0x7f,0xd, 0xf8,0x15,0x3a,0x99,0x7e,0x8e,0xf8,0x40,0x3e,0x62,0x79,0xf, 0x7d,0x90, +0xf7,0xff,0x13,0xfc,0xf8,0x40,0x3f,0x61,0xe8,0x40,0x3e,0xe4,0xe8,0x40,0x3f,0x62, +0x23,0x98,0xe8,0x0, 0x8c,0xcc,0xe8,0x40,0x3c,0xf0,0xe0,0x1, 0x1, 0x52,0xe8,0x40, +0x3e,0x62,0x17,0x81,0x0, 0x87,0xe0,0x1a,0x89,0x6c,0xc6,0xa, 0x39,0x79,0xe0,0x1, +0x1, 0x4b,0x3d,0xef,0xe2,0x1, 0xc5,0xff,0x3b,0xfb,0x3a,0x6f,0xc7,0x81,0x2, 0xf4, +0xf0,0x0, 0x67,0xd, 0x66,0x8e,0xf0,0x40,0x3c,0xee,0xe0,0x2, 0x1f,0x9f,0x8f,0x8f, +0x2f,0x8a,0xea,0x16,0x7c,0x4c,0x3d,0x67,0xe0,0x1, 0x14,0xff,0x7e,0x81,0xe0,0x2, +0xde,0x5, 0x66,0x81,0xf0,0x0, 0x15,0x0, 0xe0,0x1, 0x23,0xa2,0xfa,0x16,0x7d,0xcc, +0xf0,0x2, 0x1e,0x13,0x11,0x83,0xe8,0x40,0x3a,0xea,0x3a,0x6d,0xe0,0x0, 0x0, 0xd4, +0xf0,0xd, 0x3d,0x92,0x8f,0xd, 0x34,0x44,0xe2,0x1, 0xcf,0x7f,0x34,0xc4,0xe0,0x3, +0x1, 0x4e,0xe2,0x0, 0xcf,0x2, 0xe0,0x3, 0x2, 0xc4,0x13,0x81,0x3b,0x9e,0xe2,0x1, +0xc3,0xff,0x13,0x1e,0xe4,0x0, 0xc7,0xa, 0x3b,0x32,0xea,0x14,0x7e,0xa0,0xe0,0xf, +0x3f,0x16,0x3f,0x9d,0xe8,0x0, 0x8f,0xc, 0xb4,0xf, 0xb4,0x9f,0xe0,0x3, 0x2f,0x2b, +0x3b,0x1d,0x97,0x56,0x94,0x6, 0xe0,0x1, 0x97,0xa6,0x3c,0x1e,0x3c,0x1f,0x17,0xa, +0x3f,0x16,0x3c,0xe3,0xe3,0xff,0xc4,0x7f,0xf0,0x18,0x3c,0x9c,0x7f,0x2, 0xe0,0x2, +0xdb,0x97,0x67,0x2, 0xf0,0x0, 0x16,0x94,0x96,0x9e,0xf0,0x1d,0x3e,0x96,0x97,0x96, +0xe8,0x0, 0x97,0x1d,0x3f,0x9d,0x3f,0x9e,0xe8,0x0, 0xb4,0x8, 0x3c,0x6f,0x3c,0xe3, +0xe3,0xff,0xc4,0x7f,0xe0,0x2, 0xdb,0x84,0xe8,0x0, 0xb4,0x18,0xe8,0x2, 0x39,0x1b, +0xab,0x82,0xf0,0x0, 0xc5,0x1, 0x8b,0x84,0xf2,0x1, 0xc5,0x7f,0xe8,0x40,0x3b,0xfa, +0xe0,0x0, 0x5, 0xc6,0x16,0xa, 0xe8,0xc, 0x3e,0x3a,0xf8,0x40,0x3f,0x7a,0xf0,0xf, +0x3c,0x9c,0xe0,0x19,0x89,0x4f,0xe0,0xc, 0x9c,0x4f,0xa9,0x4f,0xe0,0xc, 0x9c,0xdf, +0x5, 0x87,0x9e,0x8f,0x9f,0x1f,0x36,0xc4,0x37,0x44,0xb6,0x8f,0xb7,0x1f,0xf0,0xf, +0x3c,0x9c,0xe0,0x19,0x85,0x5f,0xe0,0x19,0x85,0xef,0xe0,0x19,0x86,0xff,0xe0,0x1a, +0x87,0xf, 0xe2,0x0, 0xc1,0xf, 0x39,0x77,0xad,0x5f,0xad,0xef,0xae,0xff,0xe0,0x1, +0xaf,0xf, 0x3, 0x50,0xe0,0xe, 0x31,0x23,0xe8,0xe, 0x3f,0x19,0xe0,0x2, 0xc7,0x2c, +0x8f,0xe, 0xe2,0x0, 0xcf,0x3, 0x1, 0x46,0xe2,0x0, 0xcf,0x1, 0xe7,0xfe,0x1, 0xfa, +0xea,0x16,0x7f,0xcc,0xf0,0x0, 0xc5,0x1, 0x8b,0x84,0xf2,0x1, 0xc5,0x7f,0x3f,0x92, +0x10,0xff,0xe8,0x40,0x3b,0xfa,0xa8,0x8f,0xe7,0xff,0x2, 0xbe,0xea,0x16,0x7f,0x56, +0xf0,0x0, 0xaf,0xe, 0xe0,0x1, 0xc0,0x24,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe8,0x40, +0x39,0x60,0x12,0x0, 0xe4,0x0, 0xc2,0xa, 0xf8,0x0, 0x9c,0x8c,0xe0,0xf, 0x3f,0x14, +0xf0,0xc, 0x9d,0xcf,0x3e,0x6f,0xf0,0xc, 0x9d,0x5c,0xe8,0x0, 0x9f,0x9c,0xf8,0x3, +0x3c,0xab,0xe3,0xff,0xc1,0xff,0xe0,0x43,0x3e,0x13,0xe8,0x6, 0x3f,0xaa,0xe0,0x9, +0x31,0x23,0xe2,0x0, 0xce,0x0, 0xe3,0xff,0xc3,0x7f,0xf8,0x1, 0x3d,0xa9,0x3c,0x9e, +0xe3,0xff,0xc0,0xff,0xe0,0x43,0x3d,0x96,0x3c,0x63,0xe0,0x2, 0xc4,0xac,0xe0,0x68, +0x3d,0x21,0x8c,0x89,0xe2,0x0, 0xcd,0x80,0xf0,0x1, 0x3d,0x2f,0x3a,0xe6,0xe3,0xff, +0xc0,0xff,0xe0,0x65,0x3d,0x21,0xe2,0x0, 0xcc,0x81,0x3a,0x98,0xe3,0xff,0xc2,0xff, +0xe0,0x18,0x31,0x21,0xe0,0x1, 0x1, 0x20,0x3a,0xfd,0xe8,0x9, 0x3d,0x18,0xfa,0x22, +0x7e,0xe0,0xf0,0x0, 0x9b,0x9, 0xe0,0x1, 0x4, 0xb2,0xe0,0x2, 0x14,0x0, 0xe8,0x40, +0x3a,0xf6,0xe0,0x1, 0x3, 0xa0,0xf8,0x1d,0x3e,0x98,0xe8,0x0, 0x9c,0xd, 0xf0,0x1, +0x39,0x92,0xf0,0x18,0x3c,0x1a,0x8c,0x81,0xe8,0x0, 0xb2,0x88,0xe0,0x0, 0x24,0xec, +0xe2,0x1, 0xcc,0xff,0xe0,0x1, 0x1, 0x7b,0xe2,0x0, 0xcc,0x82,0xe0,0x1, 0x10,0xc0, +0xe0,0x1, 0x12,0x80,0xe0,0x65,0x39,0xa1,0x10,0xff,0x38,0x99,0xe8,0x2, 0x39,0x13, +0xe0,0x0, 0x14,0xc1,0xe0,0x69,0x3d,0xa5,0xa8,0x82,0x3c,0x79,0xe0,0x0, 0x5, 0xd4, +0xf0,0x0, 0x27,0x13,0x61,0xf, 0x3c,0x69,0xe2,0x0, 0xc9,0x1, 0xe0,0x0, 0x1, 0x53, +0x38,0xe8,0xe3,0xff,0xc0,0xff,0xe2,0x2, 0xc8,0x80,0x3c,0xe8,0x5, 0x83,0xe0,0x2, +0x14,0x80,0xe3,0xff,0xc4,0xff,0xf8,0x8, 0x3d,0xa9,0xe2,0x0, 0xce,0x0, 0x3e,0x68, +0xe3,0xff,0xc6,0x7f,0xe0,0x63,0x3d,0x2c,0xe0,0xc, 0x39,0xb9,0xf8,0x40,0x3c,0xfb, +0x36,0x48,0xe8,0xc, 0x3e,0x57,0xe3,0xff,0xc6,0x7c,0xe0,0x8, 0x3f,0x14,0x5, 0xbe, +0xe8,0xc, 0x3e,0x1b,0xe0,0xc, 0xb6,0x48,0xe2,0x0, 0xcd,0x80,0xf0,0xc, 0x3d,0x2f, +0xe3,0xff,0xc6,0x7f,0xe0,0x66,0x3d,0x2c,0xe0,0xc, 0x3b,0x39,0xe8,0x40,0x3f,0xfa, +0x36,0x48,0xe8,0xc, 0x3e,0x57,0xe3,0xff,0xc6,0x7c,0x3a,0x1e,0xe0,0x0, 0x2, 0xc1, +0xf0,0x1a,0x3d,0x2c,0xf0,0xc, 0xb5,0x54,0xf0,0x0, 0xc6,0xa, 0xf8,0x40,0x3a,0xfc, +0xe7,0xfc,0x1, 0xf0,0x66,0x8e,0xf0,0x0, 0x67,0xd, 0xf0,0x40,0x3c,0xee,0x8b,0x8d, +0xe7,0xfd,0x0, 0x85,0xf7,0xff,0x27,0x36,0x61,0xf, 0xe2,0x0, 0xc9,0x1, 0xe7,0xff, +0x1, 0xb1,0xe8,0x0, 0x8c,0xec,0xe0,0x1, 0x34,0x41,0xe2,0x0, 0xcc,0x8f,0xe3,0xff, +0xc0,0xff,0xe0,0x68,0x3b,0xa1,0xe7,0xff,0x0, 0xa5,0xf0,0xc, 0x3d,0xac,0xe0,0xc, +0xb6,0x48,0x0, 0xc3,0xf0,0x0, 0x66,0x90,0x10,0x80,0xf8,0x8, 0x3e,0x98,0xe8,0x9, +0x3d,0x18,0x3a,0xfd,0xb0,0x88,0xf0,0x0, 0x13,0x0, 0xb0,0x89,0xe0,0x2, 0x14,0x0, +0x4, 0x8d,0xf8,0x1d,0x3e,0x98,0xe8,0x0, 0xb4,0xd, 0xe7,0xfe,0x0, 0xe2,0xe8,0xc, +0x3e,0x1a,0xe0,0xc, 0xb6,0x54,0xe7,0xff,0x0, 0xc1,0x3c,0xed,0xe0,0x8, 0x32,0xa8, +0x7d,0x3, 0x7d,0x8a,0x7e,0xc, 0x7e,0x81,0x7f,0x2, 0x7f,0x8b,0xf0,0x0, 0x78,0x5, +0xf0,0x0, 0x79,0x8, 0xf0,0x0, 0x79,0x87,0xf0,0x0, 0x7a,0x84,0xf0,0x0, 0x7b,0x9, +0xf0,0x0, 0x7b,0x86,0xe0,0x2, 0xda,0x1c,0x3c,0xe8,0xe3,0xff,0xc4,0xff,0xe2,0x0, +0xcc,0x90,0x65,0x3, 0x65,0x8a,0x66,0xc, 0x66,0x81,0x67,0x2, 0x67,0x8b,0xf0,0x0, +0x60,0x5, 0xf0,0x0, 0x61,0x8, 0xf0,0x0, 0x61,0x87,0xf0,0x0, 0x62,0x84,0xf0,0x0, +0x63,0x9, 0xf0,0x0, 0x63,0x86,0x3, 0x82,0x14,0x10,0xe3,0xff,0xc4,0x7f,0xe7,0xfe, +0x0, 0xa0,0xf0,0xf, 0x3c,0x9c,0xb4,0xf, 0xb4,0x9f,0xe7,0xfc,0x0, 0xf9,0x15,0x80, +0xad,0x8d,0x13,0x81,0x3f,0x65,0xe7,0xfc,0x0, 0xbe,0x17,0x1e,0x3f,0x32,0xea,0x14, +0x7e,0x20,0x11,0x1, 0xa9,0xd, 0x3f,0x1c,0xb4,0xf, 0x16,0x83,0xb4,0x9f,0xc7,0xa, +0x94,0xf, 0x94,0x9f,0x95,0x2f,0x95,0xbf,0x96,0x4f,0xe0,0x40,0xb4,0x5e,0xc6,0xff, +0xe0,0x40,0xb4,0xce,0xe2,0x1, 0xc6,0xff,0xe0,0x40,0xb5,0x3e,0xe0,0x40,0xb5,0xae, +0xe0,0x40,0xb6,0x1e,0x2e,0xed,0xe7,0xfc,0x0, 0xd6,0x11,0x0, 0xa9,0x1, 0xe7,0xfe, +0x0, 0x96,0x8b,0x8d,0x15,0xa, 0xe0,0x2, 0x1c,0xa1,0x3d,0x37,0xe0,0x2, 0x1c,0x1d, +0xe0,0x2, 0xdb,0xba,0x66,0x81,0xe7,0xfa,0x0, 0xe4,0x8b,0x8d,0xe7,0xfb,0x0, 0xe3, +0x8, 0xb1,0xe0,0x2, 0x1c,0x2d,0x15,0xa, 0x14,0x88,0xe0,0x2, 0xdb,0xe7,0xe0,0x1, +0x1e,0xdb,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xaf,0x1f,0xc7,0x81,0xaf,0x1d,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xaf,0xf, 0x8, 0xe1,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3e,0xe0,0x2, 0x1f,0xa0,0x8b,0xf, 0xe0,0x3, 0x23,0xa, 0xe0,0x2, +0x1f,0x9f,0x8f,0x8f,0x3f,0xf6,0x5, 0x85,0xea,0x14,0x7f,0x91,0x17,0x3, 0xaf,0xf, +0xea,0x14,0x7f,0x10,0x87,0x8e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8a, +0xe0,0x2, 0x2, 0xc0,0xaf,0x8e,0xe0,0x1, 0x1f,0x9c,0x8f,0x8f,0xe0,0x1, 0x27,0x80, +0xf7,0xff,0x11,0xff,0xf0,0x13,0x39,0x9f,0xe0,0x1, 0x1f,0x82,0xe0,0x1, 0x1e,0x1, +0x8e,0x8f,0xe0,0x0, 0x1f,0xf1,0xf0,0x0, 0x88,0xc, 0xe0,0x0, 0x1e,0x72,0x8f,0x8f, +0xf2,0x1, 0xc1,0xff,0xf0,0x0, 0x88,0x8c,0xf0,0x0, 0xc1,0x81,0x36,0xa8,0x37,0xa8, +0xf4,0x0, 0xc1,0x8a,0xea,0x14,0x7d,0x91,0xf0,0x0, 0x8e,0x8e,0xe0,0x2, 0x1f,0x21, +0xf0,0x10,0x38,0x4d,0xf0,0x11,0x38,0xcf,0xea,0x14,0x7d,0x14,0xea,0x13,0x79,0x68, +0xea,0x13,0x78,0xc0,0xfa,0x13,0x7d,0xb4,0xf0,0x0, 0x16,0x0, 0x8b,0x8b,0xe0,0x1, +0x1c,0x5b,0xe0,0x2, 0x1c,0xad,0xe0,0x2, 0x19,0x9b,0xf1,0xff,0xc0,0x7f,0xf1,0xff, +0xc0,0xff,0xf0,0x13,0x39,0x9e,0x0, 0x93,0xea,0x13,0x7a,0xe8,0xea,0x13,0x7a,0x40, +0x37,0xa2,0x3a,0x9f,0x3f,0x94,0xb6,0x5, 0xb6,0x95,0xb5,0x8f,0xb5,0x9f,0xc7,0xa, +0xe8,0x40,0x3f,0x73,0xc4,0x1, 0xc4,0x81,0xc5,0x1, 0x1, 0x2f,0xe0,0xd, 0x8f,0x8e, +0xe2,0x1, 0xcf,0xff,0x1, 0x75,0xe0,0x6, 0x9e,0x2e,0xe0,0x6, 0x9e,0xbe,0xe2,0x0, +0xce,0x0, 0x12,0x1, 0xe0,0xb, 0x37,0xa3,0xe8,0x25,0x3e,0x0, 0x3d,0x93,0xf0,0x40, +0x3b,0x64,0xe0,0x76,0x39,0xa5,0x8d,0x8b,0xe2,0x0, 0xce,0x80,0xe8,0x25,0x3e,0x81, +0xf0,0x40,0x3b,0xe4,0xe0,0x77,0x39,0xa5,0xe2,0x0, 0xcd,0x82,0x1, 0x13,0x25,0xcd, +0xe2,0x0, 0xcd,0x81,0x1, 0xd5,0xc7,0xa, 0x16,0x80,0xe8,0x40,0x3f,0x73,0xae,0x8a, +0xc4,0x1, 0xc4,0x81,0xc5,0x1, 0x1, 0xd3,0xf0,0x1, 0x2e,0x7e,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe0,0x5, 0x37,0xa2,0xe0,0xb, 0x39,0x15,0xf0,0x0, 0x9c,0x8b,0xf0,0x0, +0x9c,0x1b,0xe8,0x4, 0x3e,0x29,0xe3,0xff,0xc2,0x7f,0xf0,0x43,0x3d,0x14,0xe8,0xb, +0x3e,0xa8,0xe3,0xff,0xc5,0xff,0xf2,0x0, 0xcd,0x0, 0xf0,0x15,0x3c,0xac,0xf0,0x43, +0x3a,0x1b,0xf3,0xff,0xc2,0xff,0xe8,0x64,0x3d,0x25,0xf2,0x0, 0xca,0x0, 0xf0,0x15, +0x3c,0x2d,0xf3,0xff,0xc2,0xff,0xe8,0x6b,0x3d,0x25,0xe2,0x0, 0xcb,0x7, 0xe0,0x0, +0x5, 0xff,0xf0,0x0, 0x11,0xa, 0xf0,0x0, 0xa9,0x9, 0x23,0x8a,0xc3,0xff,0xf0,0x0, +0x11,0x9, 0xf0,0x0, 0xa9,0x9, 0xe2,0x1, 0xc3,0xff,0xf0,0x0, 0x16,0x1, 0xe0,0x15, +0x38,0x95,0xf8,0x0, 0x92,0x85,0xf8,0x15,0x3a,0xba,0xf2,0x0, 0xca,0x80,0xf0,0x15, +0x3d,0x9f,0xe0,0x1, 0x4, 0x24,0xf8,0x0, 0x89,0x5, 0xe0,0x15,0x38,0x95,0xf8,0x0, +0x92,0x95,0xf8,0x15,0x3a,0xb4,0xf2,0x0, 0xca,0x80,0xe0,0x1, 0x4, 0xc, 0xf2,0x0, +0xc9,0x1, 0xe0,0x0, 0x5, 0xf8,0xf0,0x0, 0x11,0xa, 0xf0,0x0, 0x12,0x8a,0xf0,0x0, +0xa9,0x9, 0xf8,0x40,0x39,0x65,0xe0,0x1e,0x38,0x95,0xf2,0x0, 0xce,0x8a,0xf8,0x0, +0xb5,0xe, 0xf8,0x0, 0xb2,0x1e,0xe0,0x0, 0x1, 0x58,0x8f,0x8a,0x2f,0x89,0xe0,0x14, +0x3a,0x1b,0xf2,0x0, 0xca,0x4, 0xe0,0x6b,0x3c,0x2f,0xe0,0x64,0x3c,0x2b,0xf1,0x2b, +0x3a,0x9b,0x25,0xa2,0xf1,0x24,0x3a,0x94,0x22,0x1f,0xf0,0x0, 0x2b,0x4, 0xf0,0x6, +0xb4,0xae,0xf0,0x0, 0x2b,0x84,0xf0,0x6, 0xb4,0x3e,0xf0,0x0, 0x12,0x89,0x87,0x88, +0xf9,0x2d,0x3a,0xa2,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xaf,0x88,0xe7,0xfe,0x26,0xc1, +0x15,0xb1,0xe1,0x2f,0x3f,0x9b,0xe7,0xfe,0x27,0xbc,0xf0,0x0, 0xc1,0x1, 0xf0,0x0, +0xa9,0x9, 0xe7,0xfe,0x0, 0xb6,0xe0,0xf, 0x39,0x15,0xf0,0x0, 0x12,0x1, 0xf2,0x0, +0xc9,0x9, 0xf0,0x0, 0xaa,0xa, 0xb6,0xf, 0xb6,0x9f,0x5, 0x93,0xf0,0x0, 0x12,0x85, +0xf0,0x0, 0xaa,0x89,0x15,0x80,0xad,0x88,0xe7,0xfe,0x0, 0xa3,0xe2,0x0, 0xcb,0x2, +0xe7,0xff,0x5, 0x85,0xf0,0x0, 0x12,0x89,0xf0,0x0, 0xaa,0x89,0xe7,0xfe,0x0, 0xff, +0xf2,0x0, 0xc9,0x1, 0x5, 0xf0,0xf1,0xff,0xc1,0x7f,0xf0,0x0, 0xa9,0x9, 0x0, 0xeb, +0x17,0x80,0xe7,0xfd,0x0, 0xc1,0xfa,0x13,0x7a,0x28,0xf0,0x1a,0x3d,0x9f,0xe8,0xf, +0x3f,0x94,0xf0,0x0, 0x12,0x0, 0xf8,0x0, 0xaa,0xa, 0xf0,0x0, 0xaa,0xf, 0xe7,0xff, +0x0, 0x9e,0xfa,0x13,0x7a,0xa8,0xf0,0x15,0x3a,0x9f,0xf8,0x0, 0x8a,0x85,0xf2,0x0, +0xca,0x81,0xe7,0xff,0x2, 0x82,0xf0,0x0, 0x89,0x9, 0xf8,0x40,0x3a,0xe2,0xe7,0xff, +0x0, 0x84,0xfa,0x13,0x7a,0xa8,0xf0,0x15,0x3a,0x9f,0xf8,0x0, 0x87,0x5, 0xf0,0x0, +0xc7,0x1, 0xf8,0x0, 0xaf,0x5, 0xe7,0xfe,0x0, 0xec,0xf8,0x0, 0x81,0x5, 0xf0,0x0, +0xc1,0x1, 0xf2,0x1, 0xc1,0x7f,0xf8,0x0, 0xa9,0x5, 0xe7,0xfe,0x0, 0xd8,0xde,0x51, +0xea,0x14,0x7f,0x94,0x3f,0x6f,0xe1,0x80,0xbb,0x1e,0xbb,0x1f,0xb3,0x2e,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xea,0x14,0x7f,0x91,0xab,0x8f,0xe7,0xfe,0x0, 0x81,0xe0,0x2, +0x1f,0xa1,0xe0,0x3, 0x15,0x88,0xe0,0x3, 0x16,0x9, 0xe0,0x3, 0x16,0x8a,0x17,0x0, +0x3d,0x9f,0x3e,0x1f,0x3e,0x9f,0xe0,0x3, 0xc7,0x8b,0xaf,0xb, 0xaf,0xc, 0xaf,0xd, +0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xa0,0xe0,0x2, 0x1f,0x21,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0xea,0x13,0x7f,0xa4,0x1, 0x6, 0xe0,0x0, 0x5, 0xcc,0x17,0x1, 0xaf,0xf, +0x38,0x82,0x8f,0x8f,0xe0,0x0, 0x2f,0xc8,0xe0,0x2, 0x1e,0x9f,0x8e,0x8d,0xe0,0x0, +0x26,0xc4,0xe0,0x0, 0x1e,0xad,0x8e,0x8d,0xe0,0x0, 0x26,0xd9,0xea,0x13,0x7e,0x1e, +0xea,0x13,0x7d,0x22,0x96,0x8a,0x96,0xc, 0x3e,0x9c,0xe0,0x43,0x3e,0x9d,0xe2,0x0, +0xce,0x80,0x3c,0xed,0xe0,0x0, 0x4, 0x48,0xea,0x13,0x7e,0x9c,0xea,0x13,0x7d,0xa0, +0x97,0x8b,0x96,0x8d,0xe0,0x43,0x3c,0x99,0x3f,0x9d,0xe0,0x43,0x3f,0x9f,0xe2,0x0, +0xcf,0x80,0xf0,0x40,0x3b,0xef,0x4, 0x34,0xe0,0x2, 0x1c,0x3f,0xe8,0x43,0x3e,0x17, +0x8e,0xd8,0x36,0xa6,0xc6,0xdf,0x3e,0xfc,0x3f,0xed,0x2, 0x27,0x8e,0xc8,0xe0,0x43, +0x3f,0x9f,0x36,0xa6,0xc6,0xdf,0x3e,0xf9,0x3e,0x6d,0x2, 0x1d,0x3e,0xec,0xe3,0xff, +0xc6,0xff,0xe3,0xff,0xc7,0xff,0xb6,0x8e,0xb7,0x9e,0xb6,0x8a,0xb7,0x8b,0x38,0x82, +0x17,0x0, 0xaf,0xf, 0x38,0x82,0x94,0x8e,0x95,0x1e,0xea,0x13,0x7d,0xa2,0xea,0x13, +0x7e,0x20,0xea,0x13,0x7f,0x1e,0xea,0x13,0x7f,0x9c,0xb4,0x8b,0xb5,0xc, 0xb6,0x8e, +0xb6,0x8f,0x38,0x82,0x3e,0x69,0x0, 0xe3,0xe8,0x40,0x3f,0xe7,0x0, 0xd8,0xf0,0x0, +0x13,0x80,0x0, 0xcb,0x3c,0xef,0xe7,0xff,0x0, 0xb9,0xea,0x13,0x7e,0xa2,0xea,0x13, +0x7f,0xa0,0x9c,0xe, 0x9c,0x9e,0x95,0xd, 0x96,0xf, 0xea,0x13,0x7d,0x9e,0xea,0x13, +0x7f,0x1c,0xe0,0xa, 0x3c,0x2a,0xe0,0xc, 0x3c,0xac,0xb5,0xb, 0xb6,0xe, 0xb4,0xd, +0xb4,0x8f,0x38,0x82,0x8, 0xb1,0xe2,0x0, 0xcc,0x2, 0x1, 0x2a,0x5, 0x93,0xe2,0x0, +0xcc,0x3, 0x1, 0x7, 0xe2,0x0, 0xcc,0x4, 0x1, 0xa2,0x8, 0xa1,0xe7,0xfb,0x0, 0xb9, +0xef,0xff,0xd4,0x1b,0xef,0xff,0xd3,0x89,0xef,0xfd,0xd1,0x5c,0x8, 0xa1,0xe7,0xf4, +0x0, 0xf8,0xe2,0x0, 0xcc,0x1, 0x1, 0x93,0xef,0xfd,0xd7,0xc0,0xe0,0x2, 0x1f,0x15, +0x17,0x80,0xac,0xe, 0xe0,0x2, 0x1f,0x14,0xaf,0x8e,0xe0,0x2, 0x1f,0x16,0xaf,0x8e, +0xe0,0x2, 0x1f,0x12,0xaf,0x8e,0xe0,0x2, 0x1f,0x11,0xaf,0x8e,0x8, 0xe1,0xe0,0x2, +0x1f,0x9a,0x17,0x0, 0xaf,0xf, 0xef,0xff,0xd3,0x17,0xe0,0x2, 0x1f,0x85,0xe0,0xa, +0x8f,0x8f,0x2f,0xf5,0x8, 0xa1,0xe7,0xe5,0x0, 0xe5,0x0, 0x0, 0xe0,0x1, 0x1f,0x9c, +0x8f,0x8f,0x27,0x98,0x16,0xff,0x3e,0x9f,0xe2,0x1, 0xc6,0xff,0xc6,0x81,0x36,0xa3, +0x3e,0x98,0x17,0x3, 0xe0,0xff,0x17,0xff,0x16,0x0, 0xaf,0x8, 0xc4,0x8, 0x3c,0x7d, +0xe0,0x40,0xaf,0x78,0xe0,0x40,0xb7,0xb8,0xe0,0x40,0xb7,0xa8,0xe0,0x40,0xae,0x28, +0x1, 0xf5,0x38,0x82,0xe0,0x1, 0x1f,0x9c,0x8d,0x8f,0xe0,0x2, 0x1f,0xa0,0x8e,0xf, +0xe0,0x0, 0x25,0xc6,0x17,0x80,0x16,0x81,0xf0,0x2, 0x1a,0xa1,0xc4,0xff,0x3e,0x98, +0x15,0x7d,0xf0,0x0, 0x13,0x83,0xf0,0x0, 0x13,0x1, 0xf0,0x40,0x39,0xef,0xf0,0x0, +0x12,0x2, 0x0, 0x95,0x17,0xa, 0x3f,0x3c,0xf0,0x40,0xab,0x1d,0xe8,0xe, 0x3f,0x15, +0xc6,0x1, 0xaf,0xce,0xe2,0x1, 0xc6,0x7f,0xe0,0x40,0x8f,0x1d,0xc7,0x81,0xe2,0x1, +0xc7,0xff,0x3f,0xfb,0xaf,0x18,0xc6,0x88,0xc4,0x8, 0x1, 0x21,0xe0,0x80,0x8f,0x19, +0xe2,0x0, 0xcf,0x1, 0x1, 0xa, 0x87,0x18,0x3f,0x5a,0xe2,0x1, 0xc7,0x7d,0x27,0x63, +0xf0,0x40,0xab,0x9d,0x17,0x3, 0x0, 0xeb,0x8f,0x18,0xe2,0x0, 0xcf,0x1, 0x1, 0x10, +0xe2,0x0, 0xcf,0x3, 0x1, 0xf, 0x2f,0x5, 0xf0,0x40,0xaa,0x1d,0x17,0x2, 0x0, 0xdf, +0xe2,0x0, 0xcf,0x2, 0x1, 0xda,0xe0,0x40,0xaf,0x1d,0x0, 0xd9,0x38,0x82,0xf0,0x0, +0xab,0x98,0x17,0x0, 0xf0,0x40,0xa9,0x9d,0x0, 0xd2,0x8, 0xb6,0xc0,0x4c,0xe0,0x1, +0x1a,0x9c,0xe0,0x2, 0x1f,0xbf,0x8d,0x5, 0xf0,0x0, 0x8a,0x6f,0xf0,0x0, 0x89,0x7f, +0xe0,0x3, 0x25,0x6a,0x14,0x7f,0x3c,0x1a,0xe2,0x1, 0xc4,0x7f,0xc4,0x1, 0xe0,0x2, +0x19,0x21,0xe4,0x0, 0xc4,0xa, 0x14,0x9c,0x15,0x84,0x16,0x10,0x3f,0xe2,0x3c,0x90, +0x3d,0x90,0x3e,0x10,0x3c,0x12,0x16,0xff,0x17,0x0, 0xae,0xcf,0xc7,0x8a,0x3f,0xf8, +0xe1,0x80,0xae,0x99,0xe1,0x80,0xaf,0x1b,0xe1,0x80,0xaf,0x1c,0x1, 0xf7,0xe0,0x2, +0x1a,0x20,0xea,0x23,0x79,0xa0,0xf0,0x0, 0x8b,0x4, 0xf0,0x0, 0x2b,0x21,0x8f,0x3, +0x27,0x16,0xe0,0x3, 0x25,0x4f,0x17,0x7f,0x3f,0x1a,0xe2,0x1, 0xc7,0x7f,0xc7,0x1, +0x37,0x23,0xe0,0x2, 0x1f,0xa1,0x39,0x1e,0xe0,0xff,0x17,0x7f,0xe0,0x12,0xb7,0x7f, +0xc7,0x88,0x39,0x7f,0xe0,0x12,0xb7,0x4f,0x1, 0xfa,0x8f,0x4, 0xe0,0x2, 0x1c,0x1b, +0x14,0x84,0x3c,0x90,0xaf,0x3, 0xdf,0x5f,0xc0,0x34,0xb, 0x61,0xf0,0x0, 0x8b,0x83, +0xf0,0x2, 0x23,0x8f,0xe0,0x3, 0x25,0x31,0x16,0xff,0x3e,0x9a,0xe2,0x1, 0xc6,0xff, +0xe0,0x1, 0x1f,0x4d,0xf0,0x1, 0x1a,0xc5,0xe0,0x23,0xc6,0xa2,0x36,0xa2,0x3e,0x9e, +0xe8,0x40,0x3f,0xe5,0xe0,0xff,0x17,0x7f,0xb7,0xf, 0xc7,0x84,0x3f,0xfd,0xe0,0x40, +0xb7,0x1f,0xe0,0x2, 0xb7,0x2f,0xe0,0x2, 0xb7,0x3f,0x1, 0xf7,0x17,0x81,0xf0,0x13, +0x32,0x26,0xf0,0x14,0x31,0x26,0xf9,0x31,0x3b,0x96,0xf1,0x2e,0x3b,0x9f,0xf1,0xff, +0xc1,0xdf,0xf1,0xff,0xc2,0x5f,0x14,0x0, 0xf0,0x11,0x38,0xde,0xf8,0x43,0x39,0x93, +0xf8,0x43,0x3a,0x14,0xf0,0x40,0x39,0x6f,0xf0,0x40,0x38,0x68,0x25,0x19,0x17,0x80, +0x16,0x10,0xe0,0x2, 0x1f,0x1b,0x3e,0x10,0x3e,0xef,0x9d,0x9e,0xe4,0xd, 0x36,0xc8, +0xe2,0xff,0xcd,0xff,0x1, 0x4, 0x8c,0x8c,0xe0,0x1, 0x24,0xed,0xc7,0x81,0xe4,0xd, +0x37,0xa8,0xe4,0xb, 0x36,0xc8,0x3d,0x7b,0xc7,0x8, 0xc6,0x1, 0x2, 0xef,0xc4,0x1, +0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40,0x3b,0xff,0xf0,0x0, 0xc2,0x84,0x2, 0xdf, +0xe0,0x0, 0x25,0x40,0x14,0x7f,0x3c,0x1a,0xe2,0x1, 0xc4,0x7f,0xc4,0x1, 0xea,0x23, +0x7e,0x8c,0xea,0x22,0x7f,0x78,0xe0,0x9, 0x34,0x23,0xe0,0x2, 0x1f,0xa1,0x3c,0x92, +0xe0,0x12,0x95,0xff,0xe0,0x13,0x96,0xf, 0xc7,0x88,0x3f,0xf9,0xe1,0x80,0xb5,0x9d, +0xe1,0x80,0xb6,0x1e,0x1, 0xf6,0x15,0x9c,0x3d,0x90,0x3c,0x1b,0x10,0x81,0x13,0x0, +0x0, 0x84,0xc5,0x81,0x3d,0xf8,0x1, 0x1d,0x8f,0x8b,0xe2,0x1, 0xcf,0xff,0x1, 0xfa, +0x4f,0x10,0x16,0x91,0x3e,0x90,0x17,0x81,0xe0,0x2, 0x27,0x29,0x3f,0x6f,0xe2,0x1, +0xc7,0x7f,0x3f,0x7a,0x3c,0xef,0x3, 0xee,0xe1,0x80,0x8e,0x1d,0xc7,0x81,0x2e,0x77, +0xaf,0xb, 0xe2,0x0, 0x7e,0x90,0xc5,0x81,0x3c,0x9d,0x3d,0xf8,0xa8,0x89,0x1, 0xe5, +0x15,0xff,0xe8,0xb, 0x3d,0x96,0xe2,0x1, 0xc5,0xff,0xc5,0x81,0xe4,0x0, 0xc5,0x8a, +0xe0,0x2, 0x1f,0xa1,0xe0,0x1, 0x1f,0x46,0x3d,0x92,0x96,0xf, 0x96,0x9f,0xc7,0x8a, +0xb6,0xe, 0x3f,0xfb,0xc7,0x4, 0xe0,0x40,0xb6,0x9e,0x1, 0xf8,0xe0,0x1, 0x1e,0xbd, +0xe0,0x1, 0x1f,0x3c,0xe0,0x1, 0x1f,0xc7,0x36,0xc1,0x37,0xc1,0x37,0x41,0xe2,0x0, +0x7c,0x28,0x7f,0x8d,0x7e,0x8b,0x7f,0xc, 0xf0,0x0, 0x6b,0xa8,0xf0,0x0, 0x6b,0x29, +0xe0,0x0, 0xdd,0x3e,0x8f,0x84,0x8c,0x5, 0x27,0xae,0x15,0x7f,0xe0,0x1, 0x1f,0xc4, +0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0x46,0xc5,0x6a,0x9a,0x8f,0xe0,0x1, 0x1f,0xcd, +0x35,0x21,0x14,0x80,0xf0,0x2, 0x1b,0x9b,0x3d,0x1f,0xf0,0x0, 0x13,0x1, 0x38,0xe9, +0x24,0x14,0x3d,0xe9,0xe2,0x1, 0xc5,0xff,0x3a,0xfb,0xe0,0x1, 0x1f,0x44,0x17,0x81, +0x1, 0x88,0xe0,0x1, 0x0, 0x9e,0xe0,0x80,0x9e,0x9e,0x3e,0xfb,0xe0,0x1, 0x1, 0x1a, +0x3d,0x7e,0x3e,0x6f,0xc7,0x81,0x1, 0xf8,0xc4,0x81,0x8f,0x84,0xe2,0x1, 0xc4,0xff, +0x3f,0xf9,0x2, 0xe7,0xe7,0xfe,0x24,0x3, 0x16,0xff,0x3e,0x98,0xe2,0x1, 0xc6,0xff, +0x17,0x4, 0x3f,0x10,0xc6,0x81,0xe0,0x2, 0x1f,0xa1,0x3e,0x9e,0xe0,0xff,0x15,0xff, +0xe1,0x80,0x8e,0x1e,0xe2,0x0, 0xce,0x1, 0x1, 0x5, 0xe0,0x12,0xb5,0xff,0xe0,0x13, +0xb5,0x8f,0x3e,0xfe,0xc7,0x88,0x1, 0xf5,0x8f,0x4, 0xe7,0xfd,0x0, 0xe9,0xe0,0x2, +0x1d,0x1b,0x15,0x81,0x17,0x8a,0xe8,0xf, 0x3f,0xb7,0xf0,0xe, 0x33,0xa3,0x3f,0x92, +0x96,0xf, 0x96,0x9f,0x3f,0x1a,0xb6,0x1e,0x16,0x1, 0xb6,0xae,0xe8,0xc, 0x3e,0x17, +0xe2,0x0, 0x7e,0x84,0xe8,0xd, 0x3e,0x97,0x8f,0x4, 0xf0,0x0, 0xab,0xcf,0xf0,0x40, +0x3b,0xec,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3f,0x77,0xad,0x8d,0x2, 0xe4,0xe7,0xfd, +0x0, 0xc7,0xf0,0x0, 0x28,0x9c,0x97,0x2e,0xe8,0x0, 0xb5,0x85,0xe8,0x0, 0xb7,0x15, +0xe2,0x0, 0x7f,0x1c,0xe2,0x0, 0x7e,0x10,0x3f,0x18,0x3f,0x9c,0xc4,0x1, 0xf0,0x0, +0xa9,0xf, 0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40,0x3b,0xff,0xae,0x8e,0xf0,0x0, +0xc2,0x84,0xe7,0xfd,0x2, 0xed,0xe7,0xfe,0x0, 0x8d,0xea,0x23,0x7e,0xc, 0xe0,0x6, +0x37,0xa1,0x3e,0x16,0x98,0x8c,0xe2,0xff,0xc8,0xff,0x1, 0x5e,0xea,0x22,0x7c,0xf8, +0x9e,0x2e,0xe0,0xe, 0x35,0xa1,0x3c,0x96,0x3f,0x21,0x95,0x89,0xe0,0x43,0x3f,0x1e, +0x36,0x21,0xe2,0x0, 0xcf,0x0, 0x3e,0x2b,0xe0,0x43,0x3e,0x1c,0x3d,0xee,0xe0,0x0, +0x4, 0x42,0xe2,0x0, 0xce,0x0, 0xe0,0x43,0x3d,0x9b,0x3f,0x6c,0x4, 0x38,0xf0,0x40, +0x39,0xfb,0xe0,0x43,0x3f,0x1e,0xe8,0x6b,0x3d,0x23,0xf0,0x40,0x3a,0x7e,0xe8,0x0, +0xb5,0x85,0xe8,0x6e,0x3d,0x24,0xe8,0x0, 0xb7,0x15,0xe7,0xff,0x0, 0xbb,0x3e,0x61, +0xe2,0x0, 0x7f,0x9c,0x3e,0x1f,0x8f,0x8c,0xe2,0x1, 0xcf,0xff,0xe7,0xfe,0x1, 0x66, +0x17,0xa, 0x3f,0x39,0xe0,0xd, 0x37,0xa3,0x3f,0x12,0x96,0x1e,0x95,0x8e,0xaf,0xce, +0xe8,0xe, 0x3e,0x97,0xe2,0x0, 0x7e,0x84,0x3f,0x9d,0xb5,0x9e,0xc4,0x81,0xb6,0x2e, +0xe2,0x1, 0xc4,0xff,0xf0,0x0, 0xab,0xf, 0x8f,0x84,0x3f,0xf9,0xe7,0xfe,0x2, 0xba, +0xe7,0xfe,0x0, 0xd2,0xe0,0x2, 0x19,0x21,0xe7,0xfc,0x0, 0xb3,0xe8,0x40,0x3f,0x60, +0x0, 0xc7,0xe8,0x40,0x3d,0xe0,0xe7,0xff,0x0, 0xbe,0x3c,0xe6,0xe7,0xfd,0x0, 0xe2, +0x3f,0x6a,0xe7,0xfc,0x0, 0xc5,0xf0,0x1, 0x1a,0xc5,0xe7,0xfc,0x0, 0xe9,0x8, 0xb3, +0x3f,0x83,0xef,0xfb,0xda,0xa5,0x14,0x0, 0xef,0xfb,0xda,0x81,0xef,0xfb,0xde,0x19, +0xef,0xfb,0xda,0xe1,0xef,0xfb,0xd2,0x4f,0xef,0xfb,0xd3,0xbb,0xef,0xfb,0xdb,0x1b, +0xea,0x23,0x7f,0x24,0x16,0x80,0xea,0x23,0x7f,0xa2,0xb6,0x8e,0xe0,0x13,0x17,0x44, +0xb7,0xf, 0xef,0xfb,0xda,0xbb,0xe0,0x2, 0x19,0xa8,0xef,0xfb,0xdc,0xee,0xef,0xfb, +0xda,0xea,0xef,0xfb,0xdb,0x3d,0x17,0x83,0xaf,0x83,0xef,0xfd,0xde,0x81,0xef,0xfb, +0xdb,0x72,0xef,0xfb,0xde,0xae,0xef,0xfb,0xdd,0x9e,0x3b,0x0, 0xe0,0x1, 0x19,0x23, +0xef,0xfb,0xd4,0x14,0xe0,0xe, 0x8c,0xa2,0xe0,0xe, 0x8c,0x12,0xe0,0x1, 0x15,0x78, +0xe0,0x0, 0xda,0xa8,0x87,0x83,0xe0,0x10,0x8f,0x72,0xe2,0x0, 0xc7,0x81,0x3f,0x7f, +0x1, 0xd, 0xe0,0xe, 0x8d,0x82,0xe0,0xd, 0x8d,0x62,0xe0,0xd, 0x8c,0xf2,0xe0,0xd, +0x8c,0x52,0x16,0x18,0x9, 0xa1,0xe0,0x15,0x0, 0xad,0xe0,0xd, 0x8d,0xf2,0xe0,0xd, +0x8d,0x52,0xe0,0xe, 0x8c,0x82,0xe0,0xd, 0x8c,0x62,0x16,0x18,0x9, 0xa1,0xe0,0x15, +0x0, 0xa1,0xea,0x23,0x7f,0x24,0xea,0x23,0x7f,0xa2,0x16,0x80,0xb6,0x8e,0xb4,0xf, +0x38,0x82,0xea,0x23,0x7f,0x24,0x97,0x8e,0xea,0x23,0x7e,0xa2,0xc7,0x81,0x9e,0x8d, +0xe3,0xff,0xc7,0xff,0x3e,0xff,0xb7,0x8e,0x2, 0x82,0x38,0x82,0xe7,0x76,0x0, 0x93, +0x8f,0x89,0x27,0x96,0x8e,0x8, 0xe0,0xe, 0x3e,0x2f,0xe0,0x43,0x3e,0x9e,0xe2,0x0, +0xce,0x80,0xe0,0x41,0x3e,0xcd,0xe0,0x6e,0x3d,0x2d,0x3f,0x7b,0x5, 0x7, 0x3f,0xfc, +0x3, 0x8a,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xaf,0x89,0xaf,0x88,0x38,0x82,0x8f,0x88, +0xaf,0x89,0x38,0x82,0x3f,0xaa,0xe2,0x1, 0xc7,0xff,0xaf,0x89,0xaf,0x88,0x38,0x82, +0xf0,0x2, 0x1b,0x21,0xe4,0x0, 0xc5,0xa, 0xf0,0x1, 0x1a,0xad,0xf0,0xe, 0x3b,0x1a, +0xf0,0xd, 0x8b,0x8e,0xe8,0x0, 0x8e,0x85,0xe0,0xd, 0x87,0xae,0xe8,0x40,0x3e,0xf7, +0xe4,0xf, 0x37,0xac,0xe0,0xd, 0x8f,0x1e,0xe4,0xf, 0x37,0xc8,0x5, 0x99,0xe0,0x2, +0x1e,0x93,0xe0,0x1, 0x1d,0xef,0x8e,0x8d,0x26,0xa1,0xe0,0x0, 0x1e,0x39,0xe8,0xe, +0x3d,0x97,0xe8,0xf, 0x3e,0x17,0x8f,0xe, 0x8f,0x8f,0xf0,0xd, 0x33,0xa3,0xe8,0xd, +0x3e,0x96,0xe0,0x2, 0xc6,0xac,0x8e,0x8d,0xe2,0x0, 0xce,0x81,0x1, 0x31,0xe8,0x2, +0x8e,0xc5,0xe2,0x1, 0xce,0xff,0x1, 0x87,0xe8,0xa, 0x3d,0x16,0xe0,0xd, 0x8f,0xa, +0xe1,0x2e,0x3f,0xd, 0xaf,0x8, 0xaf,0x89,0x38,0x82,0xe8,0xc, 0x3d,0x97,0x8e,0x8c, +0x2e,0xa9,0xaf,0xc, 0xe0,0x0, 0x1e,0x39,0xe8,0x14,0x3e,0x17,0xe8,0x0, 0x8e,0x84, +0x26,0xb9,0xe0,0x13,0x3f,0xad,0xf8,0x43,0x39,0x13,0xf2,0x0, 0xc9,0x0, 0xf8,0x41, +0x39,0x42,0xe8,0x73,0x3d,0x22,0xf2,0x0, 0xc9,0xa0,0x5, 0x30,0x3f,0xfd,0x5, 0xa6, +0x17,0x90,0x3f,0x9d,0xe2,0x1, 0xc7,0xff,0xe8,0x0, 0xaf,0x84,0x0, 0xc7,0x16,0x80, +0xe8,0xb, 0x3d,0x97,0xe8,0xc, 0x3e,0x17,0x17,0x80,0xae,0x8b,0x3f,0x6f,0xae,0x8c, +0x0, 0xc7,0xe0,0x14,0x3f,0x2d,0xf8,0x43,0x39,0x94,0xf2,0x0, 0xc9,0x80,0xf8,0x41, +0x39,0xc3,0xe8,0x74,0x3d,0x23,0xf2,0x0, 0xca,0xf, 0x5, 0x13,0x3f,0x7d,0x5, 0x94, +0x17,0x1, 0x3f,0x1d,0xe2,0x1, 0xc7,0x7f,0x0, 0xc5,0x17,0xf0,0x3f,0x9d,0xe2,0x1, +0xc7,0xff,0xe8,0x0, 0xaf,0x84,0xe7,0xff,0x0, 0xa2,0x3f,0xed,0xe7,0xff,0x0, 0x9f, +0x3f,0x6d,0xe7,0xff,0x0, 0xb9,0x17,0x7f,0x3f,0x1d,0xe2,0x1, 0xc7,0x7f,0xaf,0xc, +0xe7,0xff,0x0, 0xb2,0xe0,0x0, 0x1f,0x95,0xe0,0x1, 0x1c,0x2f,0x8f,0x8f,0xe2,0x0, +0xcf,0x80,0xe0,0x0, 0x1f,0x93,0xe0,0x68,0x39,0xaf,0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x6c,0xe0,0x2, 0x1e,0x85,0x17,0x80,0xe0,0xa, 0x8f,0xd, 0xe0,0x1, +0x1e,0xaf,0x6f,0x96,0x7c,0x4, 0x6f,0x97,0xaf,0x9d,0xe0,0x2, 0x27,0x3e,0xe0,0x2, +0x1f,0x10,0xf0,0x2, 0x1c,0xa1,0x7f,0x3, 0xe0,0x2, 0x1f,0x19,0x8f,0x8e,0xe0,0x2, +0x27,0x8a,0xe0,0x2, 0x1f,0x98,0x7f,0x82,0x15,0x3e,0xe0,0x0, 0x1e,0x95,0xe0,0x1, +0x19,0xaf,0x8f,0x8d,0xe0,0x1, 0x1b,0xad,0xe2,0x0, 0xcf,0x80,0xe0,0x0, 0x1f,0x93, +0xe0,0x1, 0x14,0xff,0xe0,0x63,0x39,0xaf,0x3c,0x63,0xe0,0x2, 0xd5,0x7f,0xf0,0x0, +0x8d,0x87,0xf0,0x2, 0x25,0xad,0xf0,0x0, 0x15,0x80,0xf0,0x1, 0x1e,0x1c,0xe0,0x2, +0x1a,0x1b,0xf8,0x40,0x3f,0x6b,0xf8,0x40,0x3d,0x6b,0xe8,0x40,0x39,0x6b,0xe0,0x0, +0x0, 0xcc,0xe8,0x40,0x3d,0xea,0x3d,0x62,0xe2,0x0, 0x7c,0x97,0xe2,0x0, 0x7c,0x16, +0xdf,0x18,0xe0,0xd, 0x8f,0x85,0xe0,0x1f,0x17,0x7f,0xe8,0xe, 0x3f,0x58,0xe0,0x12, +0x37,0xac,0xe2,0x1, 0xcf,0xff,0xe8,0xe, 0x3f,0x12,0xf2,0x1f,0xc6,0xff,0xe3,0xff, +0xc7,0x7f,0xe0,0x1, 0x1, 0xa, 0xf0,0x0, 0x13,0x81,0xf8,0x17,0x3b,0x9a,0xf8,0x40, +0x3d,0x67,0xf2,0x1, 0xc5,0x7f,0x16,0x1, 0xe0,0xf, 0x33,0x2e,0xe8,0xc, 0x3e,0x1b, +0xe8,0xf, 0x3f,0x9d,0xf0,0x40,0x3d,0xec,0xf2,0x1, 0xc5,0xff,0xe3,0xff,0xc7,0xff, +0x16,0x86,0xe8,0xd, 0x3e,0xbe,0xe0,0xa, 0x37,0xc8,0x3e,0x93,0xaf,0xbd,0xe0,0xb, +0x37,0x48,0x47,0x96,0xf0,0x0, 0xc7,0x1, 0xaf,0xed,0xf2,0x1, 0xc7,0x7f,0x47,0x97, +0xad,0x2d,0xad,0xcd,0xaf,0x5d,0xaf,0xfd,0xc1,0x1, 0x8f,0x87,0xe2,0x1, 0xc1,0x7f, +0x3f,0xf2,0xe0,0x0, 0x5, 0xe2,0xf0,0x0, 0x10,0x8a,0xf0,0x11,0x38,0xb2,0xe8,0x0, +0x8d,0x8c,0xf8,0x5, 0x3c,0x91,0xe0,0xd, 0x8e,0x85,0x3e,0xfb,0x3, 0xee,0x17,0x8f, +0x3f,0xdd,0x37,0xa3,0x3f,0x94,0x8b,0xf, 0xe2,0x0, 0xcb,0x3, 0x1, 0x66,0xe2,0x0, +0xcb,0x1, 0xf0,0x6, 0x9e,0xa5,0xf0,0x6, 0x9c,0x35,0xe7,0xff,0x1, 0x9c,0x25,0x9c, +0xe0,0x1, 0x1f,0x64,0x87,0xce,0xe2,0x0, 0xc7,0x8f,0x3e,0xff,0xe0,0x1, 0x1, 0x66, +0xe0,0x1, 0x1d,0x64,0x3f,0xe6,0x0, 0x89,0xe0,0x1, 0x87,0x6a,0xc5,0xa, 0xe2,0x0, +0xc7,0xf, 0x3f,0x7d,0xe0,0x1, 0x1, 0x5c,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3f,0x7b, +0x3c,0xef,0xc7,0x81,0x4, 0xf2,0xe8,0x40,0x3d,0xea,0x3d,0x62,0xe2,0x0, 0x7c,0x97, +0xe2,0x0, 0x7c,0x16,0xf0,0x0, 0x78,0x81,0xde,0x94,0xf0,0x0, 0x60,0x81,0xe0,0x1f, +0x17,0x7f,0xf8,0x11,0x38,0x99,0xe8,0xd, 0x8f,0x81,0xe8,0xe, 0x3f,0x58,0xe0,0x12, +0x37,0xac,0xe2,0x1, 0xcf,0xff,0xe8,0xe, 0x3f,0x12,0xf2,0x1f,0xc6,0xff,0xe3,0xff, +0xc7,0x7f,0xe7,0xff,0x1, 0x82,0xe7,0x80,0x17,0x80,0xe8,0xf, 0x3f,0x9d,0xe3,0xff, +0xc7,0xff,0xe7,0xff,0x0, 0x87,0xe0,0x2, 0x1e,0x85,0xe0,0x2, 0x1f,0xf, 0xe0,0xa, +0x8f,0x8d,0x87,0xe, 0xe2,0x0, 0xcf,0x81,0xf0,0x0, 0xad,0x13,0xaf,0x3, 0xe0,0x1, +0x1, 0x2a,0xf0,0x0, 0x25,0xf4,0x67,0x84,0x11,0x81,0xe0,0x1, 0x2f,0xb2,0x67,0x2, +0x8f,0x8e,0x27,0x86,0xe0,0x0, 0x1f,0xaa,0x8f,0x8f,0xe0,0x1, 0x27,0xd9,0xe8,0x0, +0x89,0xc, 0xe0,0x2, 0x1e,0x99,0x17,0x80,0xe4,0x0, 0xc1,0xa, 0xaf,0x8d,0x3d,0x62, +0x67,0x2, 0x66,0x83,0xe0,0x2, 0x1c,0x9c,0xe0,0x1, 0x1c,0x64,0xaf,0x8e,0xaf,0x8d, +0xe0,0x2, 0xd4,0x5a,0xf0,0x0, 0x25,0xa5,0x3c,0x63,0xc0,0x14,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe0,0x2, 0x1e,0x98,0x8f,0x8d,0x7e,0x82,0xe7,0xfd,0x2f,0xf7,0x67,0x3, +0x89,0x8e,0xe7,0xfd,0x29,0xf3,0x67,0x4, 0x27,0x7, 0xe0,0x1, 0x1f,0xb1,0xa7,0xf, +0xa7,0xce,0xcf,0x84,0xbf,0xce,0xe0,0x1, 0x1f,0x9c,0xe0,0x2, 0x1c,0x9c,0x89,0xf, +0xe0,0x1, 0x1c,0x64,0xe4,0x0, 0xc1,0xa, 0x3d,0x62,0xe0,0x2, 0xd4,0x35,0xe0,0x1, +0x1c,0x64,0x3d,0x62,0xe0,0x1, 0x14,0xff,0xe0,0x2, 0xd4,0x68,0x3c,0x63,0xc0,0x14, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1f,0xf, 0xf0,0x2, 0x1c,0xa1,0x8f,0x8e, +0x2f,0xbe,0xe0,0x2, 0x1f,0x90,0x7f,0x83,0x16,0xb7,0xe0,0x0, 0x1f,0x8e,0xe0,0x1a, +0x9f,0xdf,0xe1,0x2f,0x3f,0x9d,0xaf,0x8e,0xe7,0xfd,0x0, 0xb8,0xe0,0x2, 0x1e,0x85, +0xe0,0x2, 0x1f,0xf, 0xe0,0xa, 0x8f,0x8d,0x87,0xe, 0xe2,0x0, 0xcf,0x81,0xf0,0x0, +0xad,0x93,0xaf,0x3, 0xf0,0x1, 0x1e,0x1c,0x1, 0x35,0x67,0x3, 0x8f,0x8e,0x2f,0xba, +0x67,0x2, 0x89,0x8e,0xe0,0x0, 0x21,0xf1,0xe0,0x0, 0x1f,0x2a,0x89,0x8e,0xe0,0x0, +0x21,0xe5,0xe8,0x0, 0x89,0xc, 0xe0,0x2, 0x1e,0x99,0xe4,0x0, 0xc1,0xa, 0xaf,0x8d, +0x3d,0x62,0x67,0x2, 0x66,0x83,0xe0,0x2, 0x1c,0x9c,0xe0,0x1, 0x1c,0x64,0x39,0xef, +0xaf,0x8e,0xaf,0x8d,0xe0,0x2, 0xd3,0xe8,0xe7,0xff,0x0, 0xb3,0xe0,0x2, 0x1e,0x90, +0x17,0x81,0x7e,0x83,0xaf,0x8d,0x0, 0xc1,0xe0,0x0, 0x14,0x80,0xe4,0x0, 0xc4,0x8a, +0xe0,0x1, 0x1f,0xe4,0x3c,0x9f,0xf0,0x0, 0x9e,0x89,0xf0,0x0, 0x9c,0x19,0xe7,0xfe, +0x0, 0xa4,0x67,0x3, 0x89,0x8e,0xe2,0x0, 0xc9,0x81,0x1, 0x1c,0x11,0x80,0xe7,0xfe, +0x0, 0xd8,0x67,0x84,0xf0,0x0, 0x15,0x80,0x11,0x81,0xe7,0xfe,0x27,0xd2,0xe0,0x0, +0x1e,0x95,0x17,0x0, 0x8f,0x8d,0xe0,0x2f,0x3f,0x8e,0xaf,0x8d,0xef,0xfb,0xd7,0x68, +0xe0,0x1, 0x1f,0xb1,0x16,0xfb,0xa7,0xf, 0xa7,0xce,0x3f,0xdd,0xbf,0xce,0xe7,0xfe, +0x0, 0xc0,0xe0,0x1, 0x1f,0xe2,0x16,0x85,0x67,0x4, 0xae,0x8f,0xe7,0xfe,0x27,0x39, +0xef,0xfb,0xd7,0x56,0xe0,0x0, 0x1e,0x95,0xe0,0x1, 0x1f,0x31,0x8f,0x8d,0x16,0x80, +0xe0,0x2f,0x3f,0x8d,0xe0,0x0, 0x1e,0x95,0xa7,0xe, 0xaf,0x8d,0x16,0xfb,0xa7,0xce, +0x3f,0xdd,0xbf,0xce,0xe7,0xfe,0x0, 0xa5,0xf0,0x40,0x3d,0xe3,0xe0,0x2, 0x1c,0x1b, +0xda,0x76,0xe7,0xfe,0x0, 0xa6,0xe8,0x0, 0x89,0xc, 0xe0,0x2, 0x1f,0x19,0xe4,0x0, +0xc1,0xa, 0x67,0x82,0x66,0x83,0xe0,0x2, 0x1c,0x9c,0xe0,0x1, 0x1c,0x64,0x3d,0x62, +0xa9,0x8e,0xa9,0x8f,0xa9,0x8d,0xe0,0x2, 0xd3,0x7f,0xe7,0xfe,0x0, 0xca,0x14,0x1, +0xe7,0xfc,0x0, 0x86,0x8, 0xb3,0xe0,0x2, 0x1f,0xf3,0x17,0x1, 0xa1,0xf, 0x16,0xfe, +0xe0,0x1, 0xa7,0xe2,0x3f,0x58,0x3f,0xdd,0x3f,0xce,0xe0,0x1, 0xbf,0xe2,0x2c,0x21, +0xe0,0x2, 0x19,0x8d,0x17,0x3, 0x8f,0x83,0x3f,0x3f,0xe0,0x2, 0x1f,0x89,0x3f,0x9e, +0x8c,0xf, 0xd4,0xa9,0xe0,0x2, 0xa7,0xd2,0x17,0x43,0x3f,0xde,0xcf,0x98,0xe0,0x2, +0xbf,0xd2,0x8e,0x83,0x8f,0x83,0xe0,0x2, 0x1f,0x6d,0xe4,0x0, 0xc6,0x85,0xe4,0x0, +0xc7,0x85,0x3f,0x9e,0x3f,0x1d,0x8c,0xcf,0x8c,0x3e,0x9, 0xa1,0xe0,0x5, 0x0, 0xee, +0x14,0x28,0xd4,0x91,0xe0,0x2, 0xa7,0xd2,0xe0,0x2, 0x1f,0xd, 0xcf,0xbc,0xe0,0x2, +0xbf,0xd2,0x8e,0x8e,0x8f,0x8e,0xe0,0x2, 0x1f,0x6d,0xe4,0x0, 0xc7,0x85,0xe4,0x0, +0xc6,0x85,0x3f,0x9e,0x84,0xcf,0x3f,0x1d,0xc4,0xfc,0x8c,0x3e,0xe2,0x1, 0xc4,0xff, +0x9, 0xa1,0xe0,0x5, 0x0, 0xd3,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x64,0xe0,0x2, +0x1f,0x28,0xe0,0x2, 0x1f,0xbf,0x87,0xe, 0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, +0x3e,0xfe,0xe0,0x5, 0x1, 0x0, 0x8d,0x8f,0x89,0xaf,0x7d,0x85,0x3e,0x6b,0xe0,0x2, +0x1d,0xbe,0x99,0x5f,0x8f,0x1f,0x8f,0xbf,0x3e,0xe3,0x7d,0x83,0x3d,0x6e,0x3d,0xec, +0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc5,0xff,0x3d,0x7b,0x3, 0x82,0x3f,0x6c,0xf0,0x40, +0x3d,0xee,0x3e,0x6f,0x3f,0x6d,0xe2,0x1, 0xc6,0x7f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e, +0xf2,0x1, 0xc5,0xff,0x3, 0x82,0x3f,0xed,0xe0,0x0, 0x1f,0x30,0x15,0x80,0xf0,0x1, +0x1f,0x3b,0xb5,0x8e,0xe2,0x1, 0xc7,0xff,0xe0,0x2, 0x1f,0xb, 0xe0,0x1, 0x1d,0xba, +0xe0,0x0, 0x7f,0x82,0xf8,0x40,0x3e,0x6e,0xe0,0x1f,0x17,0xff,0xe8,0x80,0xb7,0x9c, +0xf0,0x40,0x3e,0x7b,0xe0,0x80,0xb7,0x9e,0x1, 0xfa,0x14,0x1, 0xef,0xfa,0xd8,0x99, +0xef,0xfb,0xdd,0x0, 0xef,0xfa,0xd4,0xdc,0xe0,0x2, 0x1e,0x8d,0x17,0x5, 0x8f,0x8d, +0xf8,0x40,0x3c,0xeb,0x3f,0x3f,0xe0,0x2, 0x1f,0xed,0x3f,0x9e,0x8f,0xbf,0xe0,0x0, +0x1f,0x31,0xe4,0x7, 0xc7,0xb0,0xf0,0x0, 0xa4,0xe, 0xf0,0x18,0x3c,0x1f,0xe8,0x40, +0x3f,0x68,0xe0,0x6, 0xc7,0x48,0xf0,0x0, 0x7c,0x1, 0x7f,0x4, 0xf0,0x1, 0x25,0xe0, +0xf0,0x40,0x3d,0xe3,0x62,0x5, 0xf2,0x1, 0xc5,0xff,0xf0,0x0, 0x7f,0x6, 0x13,0x81, +0xe2,0x1, 0xc2,0x7f,0xe8,0x40,0x3b,0x6b,0x12,0x80,0xf0,0x1, 0x1e,0xcd,0xf8,0x40, +0x3f,0x6b,0xf0,0x0, 0x7e,0x7, 0x0, 0x96,0x14,0x1, 0xdf,0x35,0xef,0xfa,0xd8,0x10, +0x14,0x1, 0xef,0xfa,0xd8,0x5e,0x17,0x81,0xe8,0x40,0x3b,0xf9,0x3f,0x97,0xe8,0x6, +0x3b,0x1e,0xc2,0x81,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc3,0x7f,0xe0,0x1, 0x3, 0xb4, +0x3b,0xef,0xf0,0x40,0x3d,0xe5,0xf3,0xff,0xc5,0xff,0xf0,0x40,0x3d,0xf4,0x3, 0xe5, +0xe0,0x2, 0x1d,0xf3,0xe7,0xbf,0x16,0xff,0xf0,0x0, 0xa4,0xb, 0xe0,0x0, 0x15,0x68, +0xe8,0x1, 0xa7,0xe8,0xe0,0x1, 0x14,0xff,0x3f,0xdd,0xe8,0x1, 0xbf,0xe8,0xf0,0x0, +0x16,0x0, 0x64,0x4, 0xe0,0x2, 0xd2,0xba,0xf0,0x0, 0x65,0x3, 0x29,0x6, 0x0, 0xa9, +0x39,0x7d,0xf0,0x0, 0xc5,0x2, 0x5, 0xa5,0xe8,0x40,0x3c,0x6c,0x3c,0xe3,0xe0,0x2, +0xd0,0x3b,0xf0,0x0, 0xc6,0x1, 0x3c,0x75,0xe8,0x40,0x3e,0xec,0xe3,0xff,0xc6,0xff, +0x1, 0xf0,0xe8,0x0, 0x9f,0x8a,0x67,0x1, 0xc7,0x84,0xe0,0xc, 0x37,0x85,0x36,0x22, +0x3e,0x1e,0xe0,0x1a,0xa5,0xac,0xe0,0x41,0x3f,0x8f,0x17,0x1, 0xe0,0xf, 0x37,0x3f, +0xe3,0xf, 0x3d,0xdf,0x39,0x7d,0xe0,0x1a,0xbf,0xac,0xf0,0x0, 0xc5,0x2, 0x2, 0xdd, +0xe8,0x1, 0xa7,0xe8,0x14,0x1, 0xe0,0x40,0xcf,0x80,0xe8,0x1, 0xbf,0xe8,0xde,0xd3, +0xef,0xfa,0xd7,0xae,0x14,0x1, 0xef,0xfa,0xd7,0xfc,0x14,0x0, 0xf0,0x40,0x3b,0x68, +0xf0,0x0, 0x25,0xaa,0xf0,0xa, 0x3f,0x18,0xe3,0xff,0xc5,0x7f,0xe0,0x40,0x3f,0xe8, +0xf0,0x0, 0x27,0x17,0xe0,0xc, 0x17,0x52,0x3f,0x1f,0xe0,0xd, 0x37,0xa1,0x37,0x21, +0xe8,0xe, 0x3f,0x1d,0xe8,0xd, 0x3e,0x9d,0x9d,0x8e,0x96,0xd, 0xc7,0x81,0x3d,0xfc, +0xe3,0xff,0xc7,0xff,0x3, 0x3, 0x9f,0xe, 0xb7,0xd, 0x3f,0xfa,0x1, 0xec,0xf0,0x0, +0xc3,0x1, 0xf3,0xff,0xc3,0x7f,0xf8,0x40,0x3b,0x7b,0xe8,0x8, 0x3c,0x1e,0xe3,0xff, +0xc4,0x7f,0x1, 0xd9,0x3b,0xf4,0x3c,0x66,0xf0,0x40,0x3b,0xe7,0xe7,0xfe,0x3, 0xed, +0xf0,0xa, 0x3f,0x18,0xe3,0xff,0xc5,0x7f,0xe0,0x40,0x3f,0xe8,0xf0,0x0, 0x27,0x17, +0xe0,0xc, 0x17,0x52,0x3f,0x1f,0xe0,0xd, 0x37,0xa1,0x37,0x21,0xe8,0xe, 0x3f,0x1d, +0xe8,0xd, 0x3e,0x9d,0x9d,0x8e,0x96,0xd, 0xc7,0x81,0x3d,0xfc,0xe3,0xff,0xc7,0xff, +0x3, 0x3, 0x9f,0xe, 0xb7,0xd, 0x3f,0xfa,0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf3,0xff, +0xc3,0xff,0xf0,0x40,0x3b,0xf4,0xe8,0x8, 0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x1, 0xd9, +0xe7,0xfe,0x0, 0xc3,0xf0,0x0, 0x67,0x6, 0xf0,0x0, 0x66,0x7, 0x67,0x82,0xf0,0x2, +0x1e,0x8a,0xe0,0x2, 0x27,0x95,0xf0,0x0, 0x65,0x5, 0xf0,0x40,0x3c,0xe3,0xf2,0x1, +0xc4,0xff,0xf2,0x1, 0xc5,0x7f,0xf8,0x7, 0x3c,0xba,0xf0,0x2, 0x1e,0x8a,0x3f,0xe7, +0xe3,0xff,0xc7,0xff,0xf0,0x0, 0x7f,0x6, 0x12,0x81,0xf0,0x0, 0x7e,0x7, 0x3b,0x6f, +0xf8,0x40,0x3e,0x69,0x7f,0x85,0x12,0x0, 0xf0,0x1, 0x1d,0xcd,0xf8,0x40,0x3f,0x6a, +0xf8,0x40,0x3c,0xed,0x0, 0x92,0x14,0x1, 0xde,0x46,0xef,0xfa,0xd7,0x21,0x14,0x1, +0xef,0xfa,0xd7,0x6f,0x66,0x82,0x17,0x81,0x3e,0xf5,0x3f,0x95,0xc2,0x1, 0xe3,0xff, +0xc7,0xff,0xe0,0x1, 0x5, 0xdf,0x3a,0xef,0xf0,0x40,0x3d,0x64,0xf3,0xff,0xc5,0x7f, +0xf8,0x40,0x3d,0x7c,0x3, 0xe9,0xe0,0x2, 0x1d,0xf3,0xe7,0xbf,0x16,0xff,0xf0,0x0, +0xa6,0x8b,0xe0,0x0, 0x15,0x68,0xe8,0x1, 0xa7,0xed,0xe0,0x1, 0x14,0xff,0x3f,0xdd, +0xe8,0x1, 0xbf,0xed,0xf0,0x0, 0x14,0x0, 0x64,0x4, 0xe0,0x2, 0xd1,0xcf,0x63,0x83, +0x29,0x5, 0x0, 0xa6,0x39,0x79,0xc3,0x82,0x5, 0xa3,0xe8,0x40,0x3c,0x68,0x3c,0xe3, +0xe0,0x1, 0xdf,0x82,0xf0,0x0, 0xc4,0x1, 0x3c,0x74,0xe8,0x40,0x3c,0xe8,0xe3,0xff, +0xc4,0xff,0x1, 0xf1,0x9f,0x7, 0x67,0x81,0xc7,0x4, 0xe0,0x8, 0x37,0x5, 0x34,0x22, +0x3c,0x1f,0xf0,0x1a,0xa3,0x28,0xe0,0x41,0x3f,0xe, 0x15,0x81,0xe0,0xe, 0x35,0xbe, +0xf3,0xe, 0x3b,0x5e,0x39,0x79,0xe0,0x1a,0xbf,0x28,0xc3,0x82,0x2, 0xdf,0x17,0x80, +0x3f,0x6f,0xe3,0xff,0xc7,0x7f,0xe8,0x40,0x3f,0x7a,0xe0,0x1, 0x1, 0x68,0xc7,0x81, +0xe2,0x0, 0xcf,0x86,0x1, 0xf6,0xe8,0x1, 0xa7,0xed,0x14,0x1, 0xe0,0x40,0xcf,0x80, +0xe8,0x1, 0xbf,0xed,0xdd,0xe0,0xef,0xfa,0xd6,0xbb,0x14,0x1, 0xef,0xfa,0xd7,0x9, +0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x25,0x30,0xe8,0x40,0x3f,0x65,0xe0,0x0, 0x15,0x0, +0xf0,0x0, 0x27,0x1f,0xe0,0xc, 0x17,0xd2,0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1, +0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99,0x9c,0xf, 0xf0,0x0, 0x9b,0x9, 0xc5,0x1, +0xf0,0x40,0x3b,0x78,0xe8,0xe, 0x3f,0x1c,0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f, +0x5, 0x84,0x9f,0x8f,0xe0,0x0, 0xb7,0x89,0xe8,0x40,0x3d,0x7e,0x1, 0xe4,0xf2,0x0, +0xca,0x85,0xe0,0x1, 0x5, 0x95,0xf0,0x0, 0xc2,0x81,0xf3,0xff,0xc2,0xff,0xf8,0x40, +0x3a,0xfa,0x1, 0xd3,0xf0,0x40,0x3e,0x75,0xf0,0x40,0x3b,0x65,0xe7,0xfe,0x5, 0xe4, +0xe8,0x40,0x3f,0x66,0xe0,0x0, 0x15,0x0, 0xf0,0x0, 0x27,0x1e,0xe0,0xc, 0x17,0xd2, +0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1,0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99, +0x9c,0xf, 0xf0,0x0, 0x9b,0x89,0xc5,0x1, 0xf0,0x40,0x3b,0xf8,0xe8,0xe, 0x3f,0x1c, +0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f,0x5, 0x83,0x9f,0x8f,0xb7,0x89,0xe8,0x40, +0x3d,0x7e,0x1, 0xe5,0xf2,0x0, 0xcb,0x5, 0x2, 0x94,0xe8,0xf, 0x3b,0x16,0xe3,0xff, +0xc7,0xff,0xe0,0xc, 0x17,0x52,0x3f,0x1f,0x37,0x21,0x37,0xa1,0xe8,0xe, 0x3f,0x1b, +0xe8,0xf, 0x3f,0x99,0x9d,0xe, 0x9c,0x8f,0x3c,0xfa,0x5, 0x83,0x9f,0xe, 0xb7,0xf, +0xf0,0x0, 0xc3,0x1, 0xf3,0xff,0xc3,0x7f,0xf8,0x40,0x3b,0x7c,0x1, 0xc2,0x66,0x82, +0x17,0x81,0x3e,0xf5,0x3f,0x95,0xc2,0x1, 0xe3,0xff,0xc7,0xff,0xe7,0xfe,0x2, 0xa5, +0xf0,0x0, 0x67,0x6, 0xf0,0x0, 0x66,0x7, 0xf8,0x40,0x3e,0xe9,0xe0,0x2, 0x1f,0x8a, +0xe8,0x80,0x97,0x1e,0x9e,0x8f,0x3f,0x7d,0x3, 0x2, 0xb7,0xf, 0xf8,0x40,0x3f,0x7c, +0xc7,0x82,0x1, 0xf7,0xe0,0x1, 0x1f,0xe0,0x17,0x0, 0xe0,0x1, 0x1e,0xee,0xe0,0x2, +0xaf,0xf, 0x14,0x0, 0xe0,0x1, 0xaf,0x7f,0xf0,0x0, 0xbe,0x8d,0xdd,0x3c,0xe0,0x2, +0x1f,0xd, 0x8c,0xe, 0xef,0xfa,0xd4,0x9b,0xe0,0x2, 0x1f,0x3a,0x17,0x87,0xaf,0x8e, +0xe0,0x2, 0x1f,0x3b,0xaf,0x8e,0xc0,0x1c,0xf8,0x0, 0xf, 0x28,0xb, 0xa1,0xe7,0x52, +0x0, 0x94,0x8e,0x9f,0xe0,0x2, 0x1f,0x3d,0x89,0xbf,0x7e,0x85,0x99,0x6f,0x8e,0xf, +0x8e,0xaf,0x7f,0x3, 0x3f,0xe3,0x67,0x5, 0xe7,0xfb,0x0, 0x82,0x67,0x85,0xe0,0xc, +0x17,0x52,0xe8,0xf, 0x3f,0x95,0xe3,0xff,0xc7,0xff,0x3f,0x1f,0x37,0x21,0x37,0xa1, +0xe8,0xe, 0x3f,0x1b,0xe8,0xf, 0x3f,0x99,0x9d,0xe, 0x9c,0x8f,0x3c,0xfa,0xe7,0xfe, +0x5, 0xdc,0x9f,0xe, 0xb7,0xf, 0xe7,0xfe,0x0, 0xd8,0x17,0x1e,0xf2,0x0, 0xcd,0x2, +0x3f,0x2f,0x16,0x81,0xe0,0xe, 0x36,0xbe,0x2, 0x8a,0x65,0x81,0xe0,0x1a,0xa5,0x2b, +0xe3,0xe, 0x3d,0x5e,0xe0,0x1a,0xbf,0x2b,0xe7,0xfe,0x0, 0x8b,0x66,0x81,0x17,0x1d, +0xe0,0x1d,0xa5,0x3d,0x3f,0x2f,0x15,0x81,0xe0,0xe, 0x35,0xbe,0xe3,0xe, 0x3d,0x5e, +0xe0,0x1d,0xbf,0x3d,0xe7,0xfd,0x0, 0xfd,0xe0,0x2, 0x1f,0xf3,0x16,0x80,0xa6,0xf, +0xe0,0x1, 0xa7,0x6c,0x37,0x4d,0xe2,0x0, 0xc7,0x1, 0x24,0x85,0xc4,0xff,0xe0,0x7, +0x16,0xff,0x3e,0xd9,0xe0,0x1, 0xa5,0xec,0xe7,0xbf,0x17,0xff,0x3d,0xdf,0xe0,0x1, +0xbd,0xec,0xe4,0x7, 0xc4,0x30,0xe0,0x0, 0x1d,0xb1,0xe4,0xd, 0x36,0xa0,0xa5,0x8b, +0x37,0x2d,0x3c,0x1b,0xa5,0x8, 0xe0,0x3, 0x1d,0x95,0x3d,0xda,0x3e,0xcb,0xbe,0x88, +0xe0,0x1, 0xa6,0xec,0x3f,0xdd,0x3f,0xce,0xe0,0x1, 0xbf,0xec,0x38,0x82,0xe0,0x2, +0x1f,0xf3,0xe0,0x0, 0x1d,0xb1,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f, +0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef, +0x3c,0x1b,0xa5,0x88,0xe2,0x0, 0xc4,0x8f,0xe0,0xd, 0x34,0xab,0xe7,0xf, 0x14,0xff, +0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d, +0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1d,0xb1, +0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b, +0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0x88,0xe2,0x0, +0xc4,0x81,0xe0,0xd, 0x34,0xaa,0xe7,0xf7,0x14,0xff,0x3c,0xdb,0x3c,0xcd,0xbc,0x88, +0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f, +0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1d,0xb1,0xa7,0x8f,0xe7,0xbf,0x16,0x7f, +0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc, +0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xe2,0x0, 0xc4,0x81,0xa5,0x88,0xe4,0xd, 0x34,0xac, +0xe0,0x3, 0x1c,0x96,0xe2,0x0, 0xc5,0x3, 0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe4,0xd, +0x35,0x2a,0xa4,0x88,0xe0,0x3, 0x1d,0x97,0xe2,0x40,0xc7,0x0, 0xe0,0xa, 0x3c,0xdb, +0x3d,0x4d,0xbd,0x8, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f, +0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1d,0xb1,0xa7,0x8f,0xe7,0xbf,0x16,0xff, +0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0x6f,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0x5d, +0xe0,0x1, 0xbe,0x6f,0x3c,0x1b,0xa5,0xa8,0xe7,0xf0,0x16,0x0, 0x3e,0x5b,0xe2,0xf, +0xc4,0xff,0x3c,0xcc,0xbc,0xa8,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0x6f,0x3e,0xdc, +0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1d,0xb1, +0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b, +0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xe2,0xf, 0xc4,0xff, +0xa5,0xb8,0xe4,0xd, 0x34,0xa0,0xe0,0x3, 0x1c,0x98,0xe2,0x40,0xc7,0x0, 0x3c,0xdb, +0x3c,0xcd,0xbc,0xb8,0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f, +0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1d,0xb1,0xa7,0x8f,0xe7,0xbf,0x16,0x7f, +0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc, +0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0xe8,0xe2,0x0, 0xc4,0x87,0xe0,0xd, 0x34,0xa6, +0xe7,0xfc,0x14,0xbf,0x3c,0xdb,0x3c,0xcd,0xbc,0xe8,0xe2,0x0, 0xc5,0xf, 0xa4,0xe8, +0x15,0xc3,0xe0,0xd, 0x35,0x22,0xe0,0xa, 0x3c,0xdb,0x3d,0x4d,0xbd,0x68,0xe2,0x40, +0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x2, 0x1f,0xf3,0xe2,0x1f,0xc4,0x7f,0xa7,0xf, 0xe7,0xe0,0x17,0x80,0xe0,0x4, +0xa6,0x8e,0x3f,0xdd,0x3c,0x4f,0xe0,0x4, 0xbc,0xe, 0x38,0x82,0xe0,0x2, 0x1f,0xf3, +0xe2,0x0, 0xc4,0x1, 0xa7,0x8f,0x17,0x7b,0xe0,0x1, 0xa6,0x6f,0xe0,0xd, 0x34,0x22, +0x3f,0x5c,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x17,0x7d,0xe0,0x1, 0xa6,0xef,0x34,0x21, +0x3f,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x6f,0xe2,0x0, 0xc4,0x8f,0xe0,0x2, 0xa6,0x3f, +0xe7,0xfe,0x17,0xf, 0xe0,0xd, 0x34,0xa4,0x3f,0x5c,0x3f,0x4d,0xe0,0x2, 0xbf,0x3f, +0x17,0x70,0xe0,0x2, 0xa6,0xbf,0x3f,0x5d,0x3c,0xce,0xe0,0x2, 0xbc,0xbf,0x38,0x82, +0xe0,0x2, 0x1f,0xf3,0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xdf,0x16,0xff,0xe0,0x1, +0xa6,0x6e,0xe0,0xf, 0x34,0x2c,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e, +0xe7,0xf0,0x17,0x80,0xe0,0x2, 0xa6,0xce,0xe2,0xf, 0xc4,0xff,0x3f,0xdd,0x3c,0xcf, +0xe0,0x2, 0xbc,0xce,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe2,0x0, 0xc4,0x1, 0xa7,0xf, +0xe7,0xef,0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, 0x34,0x2b,0xe0,0x8, 0x3e,0x5d, +0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe0,0x4, 0xb4,0xde,0x38,0x82,0xe0,0x2, 0x1f,0xf3, +0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x3, 0xa6,0x8f,0x3f,0x5d, +0x3c,0x4e,0xe0,0x3, 0xbc,0xf, 0xe0,0x6, 0xb4,0xbf,0xe0,0x6, 0xb5,0x5f,0x38,0x82, +0xe0,0x2, 0x1f,0xf3,0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x3, +0xa6,0xbf,0x3f,0x5d,0x3c,0x4e,0xe0,0x3, 0xbc,0x3f,0xe0,0x7, 0xb4,0x9f,0xe0,0x7, +0xb5,0x3f,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe7,0xbf,0x15,0x7f,0xa7,0x8f,0xe0,0xb, +0x34,0x46,0xe0,0x1, 0xa6,0xef,0xe0,0x1, 0xa7,0x6f,0x35,0xa2,0x3f,0x5a,0xe0,0x1, +0xbf,0x6f,0x17,0x73,0xe0,0x2, 0xa6,0x6f,0xe2,0x40,0xc6,0x80,0x3e,0x5e,0x3e,0x4b, +0xe0,0x2, 0xbe,0x6f,0xe0,0xb, 0x34,0x26,0xe0,0x2, 0xa6,0x6f,0xe7,0xe7,0x17,0x7f, +0xe2,0x18,0xc5,0x80,0x3e,0x5e,0x3e,0x4b,0xe0,0x2, 0xbe,0x6f,0x34,0x42,0xe0,0x2, +0xa5,0xef,0x17,0x3, 0x16,0x7c,0x3f,0x58,0xe0,0x8, 0x3d,0xdc,0x3c,0x4e,0xe0,0x2, +0xbc,0x6f,0xe0,0x1, 0xa7,0x6f,0x3f,0x5a,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x2, 0x1f,0xf3,0xe0,0x0, 0x1f,0x31,0xa6,0x8f,0xe7,0xbf,0x15,0xff,0xe0,0x1, +0xa6,0x6d,0xe0,0x1, 0xa7,0xed,0xa7,0xe, 0xe4,0x7, 0xc4,0x30,0x3f,0xdb,0xe0,0x1, +0xbf,0xed,0x3c,0x1e,0xa5,0x28,0xe0,0xe, 0x34,0xc2,0xe0,0x3, 0x1f,0x99,0xe2,0x0, +0xc7,0x3, 0xe4,0xe, 0x37,0x2d,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0xe0,0xe, 0x34,0xc6, +0xa5,0x28,0xe0,0x3, 0x1f,0x9a,0xe4,0xe, 0x37,0x2b,0x3f,0xda,0x3f,0xce,0xbf,0xa8, +0x34,0xc4,0xa5,0x28,0xe0,0x3, 0x1f,0x1b,0xe2,0x0, 0xc4,0x83,0xe4,0xf, 0x34,0xa9, +0xe0,0x9, 0x3d,0x5e,0x3c,0xcf,0xbc,0xa8,0xe2,0x40,0xc6,0x0, 0xe0,0x1, 0xa7,0xed, +0x3d,0xdf,0x3e,0x4b,0xe0,0x1, 0xbe,0x6d,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe0,0x0, +0x1f,0x31,0xa6,0x8f,0xe7,0xbf,0x15,0xff,0xe0,0x1, 0xa6,0x6d,0xe0,0x1, 0xa7,0xed, +0xa7,0xe, 0xe4,0x7, 0xc4,0x30,0x3f,0xdb,0xe0,0x1, 0xbf,0xed,0x3c,0x1e,0xa5,0x28, +0xe0,0xe, 0x34,0xc2,0xe0,0x3, 0x1f,0x9c,0xe2,0x0, 0xc7,0x3, 0xe4,0xe, 0x37,0x27, +0x3f,0xda,0x3f,0xce,0xbf,0xa8,0xe0,0xe, 0x34,0xc6,0xa5,0x28,0xe0,0x3, 0x1f,0x9d, +0xe4,0xe, 0x37,0x25,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0x34,0xc4,0xa5,0x28,0xe0,0x3, +0x1f,0x1e,0xe2,0x0, 0xc4,0x83,0xe4,0xf, 0x34,0xa3,0xe0,0x9, 0x3d,0x5e,0x3c,0xcf, +0xbc,0xa8,0xe2,0x40,0xc6,0x0, 0xe0,0x1, 0xa7,0xed,0x3d,0xdf,0x3e,0x4b,0xe0,0x1, +0xbe,0x6d,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0x17,0x77, +0xe0,0x1, 0xa6,0x6d,0xe0,0xf, 0x34,0x23,0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xe0,0x1, +0xbc,0x6d,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xfb, +0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, 0x34,0x29,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f, +0xe0,0x1, 0xbc,0x6e,0xe2,0x0, 0xc4,0x81,0xe0,0x1, 0xa6,0x6e,0xe7,0xf7,0x16,0xff, +0xe0,0xf, 0x34,0xaa,0xe0,0x9, 0x3e,0x5d,0x3c,0xcf,0xe0,0x1, 0xbc,0xee,0x38,0x82, +0xe0,0x2, 0x1f,0xf3,0xa7,0xf, 0xe7,0xf8,0x17,0x80,0xe0,0x1, 0xa6,0xfe,0x3f,0xdd, +0x3c,0x4f,0xe0,0x1, 0xbc,0x7e,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xe7,0xe0,0x17,0x0, +0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x2, 0xa6,0x8f,0xe2,0x1f,0xc4,0xff,0x3e,0xde, +0x3c,0x4d,0xe0,0x2, 0xbc,0xf, 0xe0,0x2, 0xa6,0x9f,0x3f,0x5d,0x3f,0x49,0xe0,0x2, +0xbf,0x1f,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xa6,0x8f,0xa7,0x3d,0x37,0x4c,0xe2,0x0, +0xc7,0x1, 0xe0,0x61,0x3e,0x2, 0xe7,0xfe,0x17,0xff,0x3f,0xdc,0xe0,0x61,0x3f,0x92, +0xa7,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x81,0x27,0x85,0xa7,0x9d,0xe0,0x20,0xcf,0x80, +0xbf,0x9d,0xe7,0xdf,0x17,0xff,0xa6,0x3d,0x37,0x2c,0x3f,0xdc,0x3f,0xce,0xbf,0xbd, +0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x61, +0x3f,0x2, 0xe7,0xfe,0x17,0xff,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x2, 0x1f,0xf3, +0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0xe7,0xdf,0x17,0x7f,0xa6,0x3d,0xe0,0xf, 0x34,0x2c, +0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xbc,0x3d,0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x2, 0x1f,0xf3,0xf0,0x3, 0x1b,0x1f,0xf0,0x0, +0xa2,0xf, 0xe7,0xbf,0x17,0xff,0xf8,0x1, 0xa1,0xe4,0xe8,0x1, 0xa7,0x64,0xf0,0x13, +0x31,0xcd,0x3f,0xde,0xe8,0x1, 0xbf,0xe4,0xf2,0x0, 0xc1,0x81,0x87,0x88,0xe8,0x1, +0xa6,0xd4,0xe2,0x0, 0xc7,0x87,0xe0,0xe, 0x37,0xac,0xe7,0x1f,0x17,0xff,0x3f,0xdd, +0x3f,0xce,0xe0,0x0, 0x1f,0x31,0xf0,0x3, 0x1b,0xa0,0xf0,0x0, 0xa2,0x8e,0xe0,0x3, +0x1c,0xa1,0xe8,0x1, 0xbf,0xd4,0xf0,0x0, 0x10,0x80,0x15,0x78,0xe7,0xfe,0x15,0x87, +0xe7,0xf7,0x16,0x7f,0xf0,0x0, 0x11,0x2, 0xf8,0x12,0x39,0x11,0xf0,0x10,0x30,0xa2, +0xf0,0x12,0x31,0x21,0xf0,0x12,0x39,0x18,0xf8,0x10,0x38,0x16,0xe8,0x0, 0xa7,0x0, +0xe8,0x0, 0x8f,0x82,0x3f,0x5a,0x37,0xc5,0x3f,0x4f,0xe8,0x0, 0xbf,0x0, 0xe4,0x7, +0xc7,0xb0,0xe8,0x0, 0x86,0x82,0xe8,0x0, 0xa7,0x0, 0xe2,0x0, 0xc6,0x9f,0x36,0xa3, +0x3f,0x5b,0x3f,0x4d,0xe8,0x0, 0xbf,0x0, 0xe8,0xf, 0x3f,0x95,0xe8,0x0, 0x8e,0x92, +0xa7,0xf, 0x36,0xc6,0xe2,0x0, 0xc6,0x81,0xe4,0xd, 0x36,0xac,0xe8,0xe, 0x3f,0x57, +0x3f,0x4d,0xbf,0xf, 0xf0,0x0, 0xc0,0x81,0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc3, +0xe2,0x0, 0xc6,0x83,0xe4,0xd, 0x36,0xaa,0x3f,0x59,0x3f,0x4d,0xbf,0xf, 0xf2,0x1, +0xc0,0xff,0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc7,0x36,0xaa,0x3f,0x5c,0x3f,0x4d, +0xbf,0xf, 0x8f,0x88,0xe8,0x40,0x3f,0xf1,0xe7,0xff,0x3, 0xb6,0xe8,0x1, 0xa7,0x64, +0xe7,0xbf,0x17,0xff,0xf0,0x13,0x31,0xad,0x3f,0xde,0xf0,0x13,0x39,0xcf,0xf8,0x1, +0xb9,0xe4,0x38,0x82,0xe0,0x0, 0x1f,0x94,0x17,0x1, 0xaf,0xf, 0xe0,0x2, 0x1f,0xf3, +0xe0,0x1, 0x1e,0xfa,0xa7,0x8f,0xaf,0xd, 0x17,0x7d,0xa6,0xdf,0x3f,0x5d,0xbf,0x5f, +0xa7,0x5f,0xcf,0x4, 0xbf,0x5f,0x38,0x82,0xe0,0x0, 0x1f,0x14,0x17,0x81,0xaf,0x8e, +0xe0,0x1, 0x1f,0x7a,0xaf,0x8e,0xe0,0x0, 0x1f,0x10,0xaf,0x8e,0x38,0x82,0x8, 0xb2, +0x39,0x68,0x15,0x4, 0xe1,0xf, 0x14,0x0, 0x3c,0xe2,0xd0,0xac,0xa7,0x82,0xa7,0x2, +0xa4,0x2, 0x37,0xc5,0xe4,0xe, 0x37,0x45,0xe2,0x0, 0xc7,0x7, 0xea,0x2, 0xc4,0x0, +0xe2,0x0, 0xc7,0x88,0x3f,0xce,0xe4,0x8, 0x34,0x48,0x3c,0x1f,0x9, 0x61,0xe0,0x2, +0x1e,0xf3,0xe0,0x2, 0x1e,0x29,0xa6,0x8d,0xa7,0xc, 0xa7,0x8c,0xa6,0xcd,0xe2,0x0, +0xc6,0x81,0x26,0xab,0x37,0x48,0xe4,0xf, 0x37,0xc5,0xe2,0x0, 0xc7,0x1, 0xa6,0x8c, +0x37,0x23,0xe2,0x0, 0xc7,0x87,0x3f,0xce,0xea,0x2, 0xcf,0x0, 0x3f,0x5d,0x16,0x85, +0xe0,0x2f,0x3f,0x9d,0xe4,0xe, 0x37,0x48,0x27,0x98,0x27,0x17,0x8, 0xb4,0x11,0x0, +0xe0,0x23,0x3c,0x2, 0x3a,0x69,0x14,0x9, 0x3c,0xe3,0xd0,0x55,0x14,0x9, 0xd0,0x35, +0x39,0xf8,0x14,0x5, 0x1, 0xc, 0xc1,0x1, 0xef,0xfb,0xd1,0xf6,0xe3,0xff,0xc1,0x7f, +0x3a,0x72,0x3, 0xf5,0x14,0x0, 0xa, 0x61,0x14,0x0, 0x38,0x82,0x14,0x1, 0xa, 0x61, +0xe0,0x0, 0x1f,0x94,0x8c,0xf, 0x8f,0xf, 0x27,0x1f,0xe0,0x2, 0x1f,0x73,0x16,0x80, +0xa5,0x8e,0xe0,0x0, 0x1f,0x10,0xae,0x8e,0xa6,0x5b,0xe0,0x1, 0x1f,0x31,0xce,0x1, +0xa7,0xe, 0xbe,0x5b,0xe0,0x1, 0xa6,0x6e,0xe0,0x4, 0xce,0x0, 0xe0,0x1, 0xbe,0x6e, +0xe7,0xfb,0x16,0x7f,0xe0,0x1, 0xa5,0xee,0x3e,0x5b,0xe0,0x1, 0xbe,0x6e,0xae,0x8f, +0xe0,0x1, 0x1f,0xfa,0xae,0x8f,0x38,0x82,0x8, 0xb3,0xe0,0x2, 0x1f,0xf3,0x39,0xe8, +0xa7,0x8f,0x14,0x0, 0xa1,0x3f,0xde,0xc4,0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1f,0x6e, +0xa7,0x8f,0xa6,0x8e,0xa7,0x1f,0x31,0x4c,0xcf,0x10,0xbf,0x1f,0xe2,0x0, 0xc1,0x1, +0xb1,0xdd,0x3c,0x62,0x89,0x7d,0xa6,0x9f,0x17,0x6f,0x3f,0x5d,0xbf,0x1f,0xde,0xb0, +0x3c,0x62,0x9, 0xe1,0x8, 0xb4,0xe0,0x2, 0x1f,0xf3,0x3a,0x68,0xa7,0x8f,0x14,0x0, +0xa1,0x3f,0x39,0xe9,0xde,0xa5,0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1f,0x6e,0xa7,0x8f, +0xa6,0x8e,0xa7,0x1f,0x31,0x4c,0xcf,0x10,0xbf,0x1f,0xe2,0x0, 0xc1,0x1, 0xb2,0x5d, +0x17,0x6f,0xa9,0xbd,0x3c,0x62,0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0xa, 0x21,0xe7,0xfd, +0x0, 0x90,0x8, 0xb5,0xe0,0x2, 0x1f,0xf3,0x39,0x68,0xa7,0x8f,0x14,0x0, 0xa7,0xbf, +0x12,0x81,0x37,0xcc,0x3a,0xdf,0x39,0xe9,0x3a,0x6a,0xde,0x82,0xe0,0x1, 0x1f,0xde, +0xa6,0x8f,0xa7,0x9d,0xcf,0x90,0xbf,0x9d,0x22,0x13,0xe0,0x2, 0x1f,0xee,0xe0,0xa, +0x39,0x14,0x14,0xff,0xa7,0x8f,0x3c,0x93,0xe3,0xff,0xc5,0x7f,0xb1,0x5f,0xc1,0x1, +0x8f,0x7f,0xe3,0xff,0xc1,0x7f,0x39,0x7a,0xe0,0x80,0xaf,0x19,0x1, 0xf8,0xa7,0x1d, +0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d,0xa, 0xa1,0xe7,0xfc,0x0, 0xe2,0x8, 0xb5, +0xe0,0x2, 0x1f,0xf3,0x39,0x68,0xa7,0x8f,0x14,0x0, 0xa7,0xbf,0x12,0x81,0x37,0xcc, +0x3a,0xdf,0x39,0xe9,0x3a,0x6a,0xde,0x54,0xe0,0x1, 0x1f,0xde,0xa6,0x8f,0xa7,0x9d, +0xcf,0x90,0xbf,0x9d,0x22,0x15,0xe0,0x2, 0x1f,0xee,0xe0,0xa, 0x39,0x14,0x14,0xff, +0xa7,0x8f,0x3c,0x93,0xe3,0xff,0xc5,0x7f,0x17,0x1, 0x3f,0x12,0xb1,0x5f,0x39,0x6e, +0xe3,0xff,0xc1,0x7f,0xe0,0x80,0x87,0x19,0x39,0x7a,0xaf,0x3f,0x1, 0xf6,0xa7,0x1d, +0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d,0xa, 0xa1,0xe7,0xfc,0x0, 0xb2,0x0, 0x0, +0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1f,0x42,0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28, +0xe0,0x40,0xce,0x80,0xbe,0x9f,0x16,0xa1,0xb6,0xbe,0x3c,0x98,0xe0,0x6, 0xb4,0xbe, +0xe0,0x2, 0xb5,0x5e,0xe7,0xbf,0x17,0x7f,0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0x38,0x82, +0xe0,0x1, 0x1f,0xde,0xe0,0x2, 0x1f,0x42,0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28, +0xe0,0x40,0xce,0x80,0xbe,0x9f,0x3c,0x98,0x35,0x28,0xe0,0x7, 0xb4,0xfe,0x3d,0x9a, +0xe0,0x8, 0xb5,0x9e,0xe0,0x7, 0xb6,0x5e,0xe7,0xbf,0x17,0x7f,0xa6,0x9f,0x3f,0x5d, +0xbf,0x1f,0x38,0x82,0xe0,0x2, 0x1f,0xc2,0xe0,0x0, 0x1d,0x92,0xa7,0xf, 0x8e,0xb, +0x9f,0x9e,0x16,0x80,0xcf,0x81,0x3c,0x4f,0xb4,0x1e,0x0, 0x85,0x9f,0x9e,0xe2,0x0, +0xc7,0x88,0x2f,0x8e,0xe0,0x7, 0x97,0x9e,0xe2,0x0, 0xcf,0x80,0x3, 0x78,0x2e,0x8e, +0x9f,0x9e,0xe0,0x80,0xcf,0x80,0xb7,0x9e,0x17,0x80,0xb7,0x9e,0x38,0x82,0x9f,0x9e, +0x16,0x1, 0xcf,0x84,0xb7,0x9e,0x3e,0xec,0x0, 0xee,0xae,0xb, 0x0, 0xf2,0x8, 0xb2, +0xe0,0x1, 0x1f,0xde,0x16,0x0, 0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0xf, +0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xd8,0xb6,0xde,0x96,0xf8,0xb6,0xfe, +0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9e,0xe0,0x0, 0x1e,0x92,0xae,0xd, 0x8e,0x88, +0x8e,0x18,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xa8,0xe0,0x1, 0x9c,0x28, +0xe0,0x9, 0xb6,0xde,0x8e,0xaf,0xe0,0x1, 0xb6,0xfe,0x87,0xbf,0xe2,0x0, 0xc7,0x81, +0xe4,0xf, 0x37,0xa8,0xe4,0xf, 0x37,0xc0,0xb7,0x9e,0xdf,0xad,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0x3f,0x68, +0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92, +0xe0,0x0, 0x14,0x40,0x96,0xde,0xb6,0xdf,0xe0,0x1, 0x96,0x9e,0xe0,0x1, 0xb6,0x9f, +0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, +0xb6,0xdf,0x8f,0x2e,0xe0,0x1, 0xb7,0x7f,0x17,0x0, 0xe0,0x1, 0xb4,0xbf,0xb7,0x1f, +0xdf,0x82,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb4, +0xe0,0x1, 0x1f,0xde,0x39,0xe9,0xa2,0xf, 0xe0,0x2, 0x1f,0xc2,0xa7,0x14,0xa1,0xf, +0xe0,0x40,0xcf,0x0, 0xbf,0x14,0x3f,0xe8,0xa7,0x14,0xe0,0x1, 0x14,0x20,0xe0,0x40, +0xcf,0x0, 0xbf,0x14,0x97,0x3f,0xb7,0x52,0x97,0x7f,0xb7,0x72,0x97,0x5f,0xe0,0x1, +0xb7,0x12,0x8f,0x1f,0x8e,0x8f,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f, +0xe0,0x1, 0xb7,0x32,0x17,0x0, 0xe0,0x9, 0xb7,0x52,0xe0,0x1, 0x97,0xf, 0xe0,0x1, +0xb7,0x72,0xe0,0x1, 0x97,0x1f,0xe0,0x2, 0xb7,0x12,0xe0,0x1, 0x97,0x2f,0xe0,0x2, +0xb7,0x32,0xe0,0x1, 0x97,0x3f,0xe0,0x6, 0xb7,0x12,0x8f,0xbf,0x37,0xa8,0xb7,0x92, +0xdf,0x42,0xe0,0x3, 0x9f,0xb2,0xaf,0x83,0xe0,0x3, 0x9f,0xd2,0xaf,0x93,0xe0,0x2, +0x9d,0x72,0xe0,0x3, 0x9d,0x92,0xe0,0x4, 0x9e,0x32,0xe0,0x4, 0x9e,0xd2,0xe0,0x3, +0x9f,0x72,0xe0,0x4, 0x9f,0x92,0xb5,0x13,0xb7,0xe3,0xe7,0xbf,0x17,0xff,0xb5,0xa3, +0xb6,0x33,0xb6,0xc3,0xb7,0x53,0xa7,0x14,0x3f,0xde,0xbf,0x94,0xa, 0x61,0x8, 0xb2, +0xe0,0x1, 0x1f,0xde,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0xf, 0xe0,0x40, +0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xdf,0xe0,0x1, 0x14,0x40,0xb6,0xde,0x96,0xff, +0xe0,0x1, 0xb6,0x9e,0x8e,0xbf,0x8e,0x2f,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde, +0x8e,0x9f,0x8e,0xf, 0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xbe,0x8e,0xcf,0xe0,0x1, +0xb6,0xfe,0x16,0x80,0xe0,0x9, 0xb6,0xde,0x87,0xdf,0xe2,0x0, 0xc7,0x83,0x37,0xa8, +0xb7,0x9e,0xde,0xf9,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0x3e,0xe8,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa7,0x12, +0xa7,0x8f,0xe0,0x40,0xcf,0x0, 0xbf,0x12,0x16,0x0, 0x97,0x38,0xb7,0x5f,0x97,0x58, +0xb7,0x7f,0x97,0x78,0xe0,0x0, 0x14,0x60,0xe0,0x1, 0xb7,0x1f,0x8f,0xd, 0x8e,0x9d, +0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x5f,0xe0,0x9, 0xb6,0x5f,0xb6,0x1f,0xde,0xd3, +0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb5,0x8f,0x8, +0x8f,0x98,0x39,0x68,0xa4,0x38,0x3f,0x7f,0x34,0x21,0xe0,0x6f,0x3b,0xae,0xe0,0x1, +0x14,0xff,0xe0,0x1, 0x15,0x72,0xe8,0x0, 0xc4,0x2, 0x3a,0xef,0xe0,0x1, 0xda,0x86, +0xe0,0x1, 0x1f,0xde,0x17,0x0, 0xa1,0x8f,0xe0,0x2, 0x1f,0xc2,0xe0,0x0, 0x14,0x60, +0xa2,0xf, 0xa7,0x93,0xe2,0x1, 0xc2,0xff,0xe0,0x40,0xcf,0x80,0xbf,0x93,0x97,0xb2, +0xb7,0xd4,0x97,0xd2,0xb7,0xf4,0x97,0xf2,0xe0,0x1, 0xb7,0x94,0x8f,0x82,0x8e,0x92, +0x37,0xa8,0x3f,0x9d,0xe0,0x1, 0xb7,0xd4,0xe0,0x9, 0xb7,0x54,0xb7,0x14,0xde,0x9b, +0x87,0x2, 0xa4,0xb2,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x27,0xa9,0xe0,0xb, 0x34,0xa1, +0x87,0x92,0x15,0x0, 0xe8,0x0, 0xc5,0x82,0x3e,0xef,0xe2,0x1, 0xc6,0xff,0x26,0x97, +0x16,0xb, 0x3e,0x3a,0xe0,0x0, 0x17,0x0, 0xe0,0xf, 0x3f,0x1c,0x37,0xa1,0x3f,0x9b, +0x96,0x8f,0xc7,0x1, 0xe0,0x41,0x3e,0x8d,0xb6,0x8f,0xe2,0x1, 0xc7,0x7f,0x87,0x92, +0x3e,0xef,0xe2,0x1, 0xc6,0xff,0x3e,0xfe,0x2, 0xf0,0x87,0x2, 0xc5,0x1, 0x3e,0xee, +0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc6,0xff,0x3e,0xfa,0x2, 0xdf,0xe4,0x2, 0xc2,0x81, +0xb4,0xd4,0x17,0x80,0xe0,0x1, 0xb2,0xd4,0xe0,0x1, 0x14,0x50,0xb7,0x94,0xde,0x63, +0xa5,0x32,0x17,0x0, 0x15,0xf0,0x3f,0xee,0x35,0x21,0x0, 0x92,0xe2,0x0, 0xcf,0x87, +0x2, 0xb2,0xe0,0x5, 0x9e,0x14,0x36,0x1b,0xe2,0x0, 0xc6,0xf, 0xb6,0xd, 0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8b,0xc7,0x2, 0xc5,0x84,0x1, 0x1e,0xe2,0x0, +0xcf,0x83,0xe0,0xd, 0x3f,0x1a,0xe8,0x0, 0xc6,0x82,0x2, 0xe9,0xe0,0x4, 0x9e,0x74, +0xe0,0xd, 0x37,0x21,0xc7,0x81,0xe0,0x9, 0x3f,0x1a,0xe0,0xd, 0x36,0x1d,0xe2,0x1, +0xc7,0xff,0xea,0x0, 0xce,0x2, 0x3e,0x19,0xe2,0x0, 0xc6,0x8f,0xe2,0x0, 0xcf,0x8b, +0xb6,0x8c,0xc7,0x2, 0xc5,0x84,0x1, 0xe4,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x93,0xa, 0xe1,0xe0,0x5, 0x9e,0xb4,0x14,0xf0,0x3c,0x9b,0xe0,0xc, 0x3f,0x1a, +0x36,0x99,0xe8,0x0, 0xc6,0x2, 0xe2,0x0, 0xc6,0x8f,0xb6,0x8c,0x0, 0xc9,0x8, 0xb2, +0xe0,0x1, 0x1f,0xde,0x3f,0x68,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0x8f, +0xe0,0x40,0xce,0x80,0xbe,0x92,0xe7,0xbf,0x16,0x7f,0x96,0xd8,0xb6,0xdf,0x96,0xf8, +0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x14,0x60,0xe0,0x1, 0xb6,0x9f,0x8e,0x8e, +0x8d,0x9e,0x36,0xa8,0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, 0xb6,0xdf, +0x8e,0xae,0xe0,0x1, 0xb6,0xff,0xe0,0x7, 0x9e,0x9f,0x3e,0xdc,0xe0,0x7, 0xb6,0x9f, +0x8f,0x3e,0xe0,0x7, 0x9e,0x9f,0x37,0x2d,0x3f,0x4d,0xe0,0x7, 0xb7,0x1f,0x9f,0x1f, +0x3e,0x5e,0xb6,0x1f,0xdd,0xe8,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92, +0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0x3f,0x68,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2, +0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe0,0x1, 0x14,0x60,0x96,0xde, +0xb6,0xdf,0x96,0xfe,0xb6,0xff,0xe0,0x1, 0x96,0x9e,0xe0,0x1, 0xb6,0x9f,0x8e,0x8e, +0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, 0xb6,0xdf, +0x8f,0x2e,0xe0,0x1, 0xb7,0x7f,0x9f,0x1f,0xe0,0x40,0xcf,0x0, 0xb7,0x1f,0xdd,0xbb, +0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x1, +0x1f,0xde,0x3f,0x68,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0x8f,0xe0,0x40, +0xce,0x80,0xbe,0x92,0x16,0x0, 0x96,0xd8,0x34,0xa8,0xb6,0xdf,0x3d,0x49,0x96,0xf8, +0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9f,0x8e,0x88,0x8d,0x98,0x36,0xa8, +0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xa8,0x14,0x30,0xe0,0x9, 0xb6,0xdf,0xe0,0x7, +0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8f,0x3e,0xe0,0x7, 0x9e,0x9f, +0x37,0x2e,0x3f,0x4d,0xe0,0x7, 0xb7,0x1f,0xe0,0x1, 0xb6,0x7f,0xe0,0x2, 0xb5,0x1f, +0xe0,0x1, 0x9f,0x7f,0xe0,0x1, 0xcf,0x3, 0xe0,0x1, 0xb7,0x7f,0xe0,0x1, 0xb6,0x3f, +0xb6,0x1f,0xdd,0x79,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0x3f,0x68,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92, +0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0x15,0x80,0x96,0xd8,0xb6,0xdf,0x96,0xf8, +0xb6,0xff,0xe0,0x1, 0x96,0x98,0x14,0x30,0xe0,0x1, 0xb6,0x9f,0x8e,0x8e,0x8e,0x1e, +0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, 0xb6,0xdf,0xe0,0x7, +0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8e,0xbe,0xe0,0x7, 0x9e,0x1f, +0x36,0xae,0x3e,0xcc,0xe0,0x7, 0xb6,0x9f,0xe0,0x1, 0xb5,0xff,0xe0,0x2, 0xb4,0x9f, +0xe0,0x1, 0x9e,0xff,0xe0,0x1, 0xce,0x83,0xe0,0x1, 0xb6,0xff,0xe0,0x1, 0xb5,0xbf, +0xe0,0x2, 0x8f,0x7e,0x9e,0x9f,0x37,0x2a,0x3f,0x4d,0xb7,0x1f,0xdd,0x34,0xa7,0x12, +0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xde, +0x3f,0x68,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80, +0xbe,0x92,0x14,0x0, 0x96,0xde,0xb6,0xdf,0xe0,0x1, 0x96,0x9e,0xe0,0x1, 0xb6,0x9f, +0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, +0xb6,0xdf,0xe0,0x1, 0xb4,0xff,0xe0,0x2, 0xb5,0x1f,0xe0,0x2, 0x8e,0x7e,0xe0,0x2, +0x8e,0xee,0x8f,0x3e,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0x28,0x3f,0x4d,0xb7,0x1f, +0x9f,0x1f,0xe1,0x0, 0xcf,0x0, 0xb7,0x1f,0xdc,0xfe,0xa7,0x12,0xe7,0xbf,0x17,0xff, +0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0xa1,0xf, 0xe0,0x2, +0x1f,0xc2,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xd8, +0xb6,0xde,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28,0xe0,0x1, 0xb6,0x9e,0x8e,0x8f, +0x8e,0x1f,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xaf,0xe0,0x9, 0xb6,0xde, +0xe0,0x2, 0x8e,0x7f,0xe0,0x2, 0x8e,0xef,0x8f,0xbf,0x36,0x2a,0x36,0xa9,0x3e,0xcc, +0x37,0xa8,0x3f,0xcd,0xb7,0x9e,0x9f,0x9e,0xe1,0x0, 0xcf,0x80,0xb7,0x9e,0xdc,0xcb, +0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x1, +0x1f,0xde,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80, +0xbe,0x92,0x3f,0xe8,0x96,0xdf,0x14,0x30,0xb6,0xde,0x96,0xff,0xb6,0xfe,0xe0,0x1, +0x96,0x9f,0xe0,0x1, 0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x3e,0x9c,0xe0,0x1, +0xb6,0xde,0x96,0xaf,0xe0,0x9, 0xb6,0xde,0xe0,0x2, 0x8e,0x7f,0xe0,0x2, 0x8e,0xef, +0x8f,0xbf,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0xa8,0x3f,0xcd,0xb7,0x9e,0x9f,0x9e, +0xe1,0x0, 0xcf,0x80,0xb7,0x9e,0xdc,0x97,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0x8, 0xb3,0xe0,0x1, 0x1f,0xde,0x3f,0x68,0xa1,0x8f,0xe0,0x2, +0x1f,0xc2,0xe0,0x0, 0x14,0x40,0xa1,0xf, 0xa7,0x93,0xe0,0x40,0xcf,0x80,0xbf,0x93, +0x97,0xde,0xb7,0xd2,0x8f,0x8e,0x8e,0x9e,0x37,0xa8,0x97,0x2e,0x3f,0x9d,0xe0,0x1, +0xb7,0xd2,0x17,0x80,0xe0,0x9, 0xb7,0x52,0xe0,0x1, 0xb5,0x72,0xe0,0x2, 0xb4,0x92, +0xb7,0x92,0x9f,0x92,0xe1,0x0, 0xcf,0x80,0xb7,0x92,0xdc,0x6d,0xe0,0x7, 0x9c,0x32, +0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1,0x8, 0xb3,0xe0,0x1, +0x1f,0xde,0x16,0x80,0xa1,0x8f,0xe0,0x2, 0x1f,0xc2,0xa7,0x13,0xa1,0xf, 0xe0,0x40, +0xcf,0x0, 0xbf,0x13,0x3f,0xe8,0x97,0x58,0xb7,0x52,0x97,0x78,0xb7,0x72,0xe0,0x1, +0x97,0x18,0x14,0x0, 0xe0,0x1, 0xb7,0x12,0xe0,0x0, 0x1f,0x12,0xae,0x8e,0x8f,0xf, +0x8e,0x9f,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f,0xe0,0x1, 0xb7,0x72, +0x97,0x2f,0xe0,0x9, 0xb7,0x52,0x87,0xbf,0xe2,0x0, 0xc7,0x81,0xe4,0xf, 0x37,0xa8, +0xe4,0xf, 0x37,0xc0,0xb7,0x92,0xdc,0x37,0xe0,0x6, 0x9c,0x72,0xa7,0x13,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1,0x8, 0xb3,0xe0,0x1, 0x1f,0xde,0xe2,0x0, +0xc5,0x3, 0xa1,0x8f,0xa7,0x93,0xe0,0x40,0xcf,0x80,0xbf,0x93,0xe0,0x2, 0x1f,0xc2, +0xa1,0xf, 0x2d,0x17,0xe0,0x9, 0xb5,0x52,0x35,0xaa,0xb4,0x52,0x35,0x28,0xe0,0x1, +0xb4,0xd2,0xe0,0x1, 0x14,0x10,0xb5,0x92,0x9f,0x92,0x3d,0x4f,0xb5,0x12,0xdc,0x13, +0xe0,0x5, 0x9c,0x52,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1, +0x17,0x82,0xe0,0x9, 0xb7,0xd2,0x0, 0xe9,0xe0,0x1, 0x1f,0xde,0x34,0xa3,0xa6,0xf, +0xe0,0x2, 0x1f,0xc2,0xf0,0x0, 0x1b,0x92,0xa7,0xf, 0xa7,0x9c,0xa6,0x9c,0xe0,0x40, +0xce,0x80,0xbe,0x9c,0x96,0xd8,0xe8,0x0, 0x8d,0x7, 0xe0,0x8, 0xb6,0xfe,0x96,0xf8, +0xe0,0x9, 0xb6,0x9e,0xe0,0x1, 0x96,0x98,0xe0,0x9, 0xb6,0xbe,0x8e,0xc8,0x8d,0xd8, +0x36,0xa8,0x3e,0x9b,0xe0,0x8, 0xb6,0xbe,0xe0,0xd, 0x37,0xcd,0x8f,0xe8,0x8d,0xf8, +0x37,0xa8,0xe0,0x1, 0x94,0x28,0x3f,0x9b,0xe0,0x8, 0xb7,0xde,0xe2,0x0, 0xc6,0x81, +0xe0,0x9, 0xb4,0x5e,0x15,0x80,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe,0xc7,0x80,0xe0,0x7, +0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0x3c,0xcf,0xe0,0x7, 0xb4,0x9e,0xe0,0x7, 0x9f,0x9e, +0xcf,0x90,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xcf,0x81,0xe0,0x7, 0xb7,0x9e, +0x0, 0x86,0xe0,0x7, 0x9f,0x9e,0xe2,0x0, 0xc7,0xa0,0x2f,0x9a,0xe0,0x7, 0x9f,0x9e, +0xe2,0x1, 0xc7,0x80,0x27,0xf7,0x2d,0x9c,0xe0,0x7, 0x9f,0x9e,0x36,0xad,0xcf,0x84, +0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe,0xc7,0x80,0xe0,0x7, 0xb7,0x9e, +0xe7,0xbf,0x17,0xff,0xa7,0x1c,0x3f,0xde,0x3f,0xcd,0xbf,0x9c,0x38,0x82,0xe0,0x7, +0x9f,0x9e,0x15,0x1, 0xcf,0x82,0xe0,0x7, 0xb7,0x9e,0x3d,0xea,0x0, 0xe0,0xe8,0x0, +0xad,0x7, 0x0, 0xe3,0x8, 0xb2,0xe0,0x1, 0x1f,0xde,0xa1,0xf, 0xe0,0x2, 0x1f,0xc2, +0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xd8,0xb6,0xde, +0x96,0xf8,0xb6,0xfe,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28,0xe0,0x1, 0xb6,0x9e, +0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x97,0xaf,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0xe0,0x9, +0xb7,0xde,0x17,0x80,0xb7,0x9e,0xdb,0x77,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0xe0,0x1, 0x1f,0xb1,0x14,0x3, 0xa7,0xf, 0xe0,0x1, 0xa7,0x8e, +0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x2f,0x82,0x38,0x82,0xe0,0x1, 0xa4,0xe, 0x34,0x49, +0xe2,0x0, 0xc4,0x1, 0x38,0x82,0xe0,0x2, 0x1f,0xb1,0xa7,0xf, 0xe0,0x1, 0x1f,0xb1, +0xa6,0x8f,0x17,0x80,0xe0,0x1, 0xaf,0xbe,0xa7,0x9e,0xe2,0x0, 0xc7,0x81,0x27,0xfd, +0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa6,0x9e,0x17,0xfe, +0x3f,0xdd,0xbf,0x9e,0xe0,0x1, 0x8c,0x3e,0x38,0x82,0xe0,0x2, 0x1f,0xb1,0xa7,0xf, +0xe0,0x1, 0x1f,0xb1,0xe0,0x1, 0xac,0x3e,0xa6,0x8f,0xa7,0x9e,0xe2,0x0, 0xc7,0x81, +0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa6,0x9e, +0x17,0xfe,0x3f,0xdd,0xbf,0x9e,0x38,0x82,0x24,0xa6,0x17,0xff,0xe0,0x2, 0x1f,0x31, +0xe0,0x1, 0x1e,0xb1,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f,0xa7,0xe, 0xa6,0x8d, +0x3e,0x18,0xe0,0xb, 0x3c,0x1f,0x14,0x80,0x15,0x7e,0xe0,0x1, 0xac,0xbe,0xa7,0x9e, +0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0xf7,0xa7,0x9e,0x3f,0xda,0xbf,0x9e,0xe0,0x1, 0x8f,0xbe,0xe0,0x80,0xaf,0x9c, +0x3e,0x7b,0x1, 0xec,0x38,0x82,0x24,0xa3,0x17,0xff,0xe0,0x2, 0x1f,0x31,0xe0,0x1, +0x1e,0xb1,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f,0xa7,0xe, 0xa6,0x8d,0x3e,0x18, +0xe0,0xb, 0x3c,0x1f,0x15,0x7e,0xe0,0x80,0x87,0x9c,0xe0,0x1, 0xaf,0xbe,0xa7,0x9e, +0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0xf7,0xa7,0x9e,0x3e,0x7b,0x3f,0xda,0xbf,0x9e,0x1, 0xee,0x38,0x82,0xe0,0x2, +0x1f,0xb1,0x17,0x1, 0xa7,0x8f,0x3f,0x58,0xa5,0xbf,0x16,0xfb,0xe0,0xc, 0x37,0x22, +0x3e,0xdb,0x3e,0xcc,0xbe,0xbf,0x15,0xef,0xa6,0xbf,0xe0,0xc, 0x37,0x24,0x3e,0xdb, +0x3e,0xcc,0xbe,0xbf,0x16,0xf7,0xa5,0xf, 0xe0,0xc, 0x37,0x23,0x3e,0xda,0x3e,0xcc, +0xbe,0x8f,0x16,0xfe,0xa6,0x3f,0x3e,0xdc,0x3f,0x4d,0xbf,0x3f,0xe0,0x2, 0x1f,0x28, +0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0xc, 0x2f,0xa, 0xa6,0x8f,0xe0,0x2e,0x3c,0xe, +0xe0,0x8, 0x37,0x24,0xe0,0xe, 0x3e,0xdb,0x3f,0x48,0xbf,0xf, 0x38,0x82,0xa7,0xf, +0xcf,0x40,0xbf,0xf, 0x24,0x7, 0xa6,0x8f,0xe7,0xfe,0x17,0x7f,0x3f,0x5d,0xbf,0xf, +0x38,0x82,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe7,0xff,0x17,0x3f,0xa6,0x8f, +0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x31,0x97,0x88,0xa6,0x8e,0xe2,0xff, +0xc7,0xff,0xe0,0x1, 0xb7,0x9d,0x97,0x98,0xe2,0x7f,0xc7,0xff,0xe0,0x1, 0xb7,0xbd, +0x17,0xf7,0x9f,0x8, 0xa6,0x3d,0x37,0x4f,0x37,0x23,0x3f,0xdc,0x3f,0xce,0xbf,0xbd, +0x17,0xfc,0x9f,0x18,0xa6,0x6d,0x37,0x4e,0x3f,0xdc,0x3f,0xce,0xbf,0xed,0x38,0x82, +0xe0,0x1, 0x1e,0xe1,0xe0,0x2, 0x1f,0x31,0x87,0xcd,0xa7,0xe, 0xcf,0x82,0xaf,0xcd, +0xa7,0xbe,0xcf,0x82,0xbf,0xbe,0x38,0x82,0xe0,0x1, 0x1f,0x61,0x9f,0xae,0x37,0xc9, +0xe2,0x0, 0xc7,0x81,0x2f,0xfc,0x38,0x82,0x8, 0xb5,0xc0,0x68,0xe0,0x2, 0x1f,0xc3, +0x15,0x80,0x95,0x3f,0xe0,0x2, 0x1f,0xbf,0x3e,0x6a,0xe3,0xff,0xc6,0x7f,0xf0,0x0, +0x8b,0x4f,0xf0,0x0, 0x8b,0xdf,0xe0,0x2, 0x1f,0xb7,0xe4,0x3, 0x36,0x22,0x7d,0x81, +0xe4,0x3, 0x31,0xc0,0x7d,0x82,0x7d,0x83,0x7d,0x84,0x7d,0x85,0x7d,0x86,0x99,0xf, +0x24,0x39,0xe2,0x0, 0xcc,0x1, 0x1, 0x3, 0xc0,0x18,0xa, 0xe1,0xf0,0x0, 0x23,0x73, +0x14,0xff,0xe0,0x1, 0x1f,0xd0,0xe8,0x9, 0x3c,0x97,0xa4,0xf, 0xe2,0x1, 0xc4,0xff, +0x34,0xa1,0xf0,0x4, 0x33,0xa1,0x3d,0x68,0xe0,0x0, 0xc4,0x82,0xf0,0x0, 0x23,0x8b, +0xe0,0xd, 0x3c,0x9a,0x3f,0xea,0x97,0xf, 0x3f,0x1c,0xe1,0x80,0xb7,0x1f,0x3e,0xff, +0x1, 0xfb,0xc5,0x81,0xe2,0x1, 0xc5,0xff,0xf0,0x40,0x3b,0x7b,0x3d,0x14,0x1, 0xef, +0x16,0x8c,0x3e,0x92,0xe3,0xff,0xc6,0xff,0xe0,0xf, 0x31,0x21,0x3f,0x98,0x97,0xf, +0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0x3f,0x13,0x39,0x7d,0xb7,0xf, 0x1, 0xf6,0xc0,0x18, +0xa, 0xe1,0xe0,0x1, 0x1a,0xd0,0xe0,0x1, 0x1f,0x39,0xa7,0x85,0xe2,0x1, 0xc5,0x7f, +0xe9,0xff,0xc7,0xfe,0x37,0xc1,0x3c,0xea,0x37,0x41,0xe2,0x0, 0x7c,0x4, 0xf0,0x0, +0x6b,0x85,0xe0,0x43,0x3a,0x13,0xf0,0x0, 0x6b,0x4, 0x7f,0x3, 0x7f,0x84,0x7f,0x85, +0xdc,0x4e,0x15,0x8c,0x3d,0x92,0xa6,0x5, 0xe0,0x1, 0x1d,0x4d,0xe3,0xff,0xc5,0xff, +0xe0,0x41,0x3c,0xc4,0x0, 0x8a,0x97,0xf, 0x3f,0x13,0xb7,0xf, 0xc1,0x1, 0xe3,0xff, +0xc1,0x7f,0x39,0x7b,0xe7,0xff,0x1, 0x22,0xe0,0x6, 0x17,0xa8,0x3f,0x92,0x37,0xa1, +0x3f,0x9a,0x96,0x9f,0xe0,0xe, 0x31,0x21,0x3a,0x7d,0x3f,0xee,0x3f,0x9c,0x4, 0x6c, +0x3e,0xf9,0xe0,0xf, 0x31,0x21,0x3f,0x9c,0x3, 0x6a,0x97,0xf, 0x3f,0x23,0xb7,0xf, +0x0, 0xe6,0xe0,0x1, 0x1f,0xd0,0xa4,0xf, 0xe7,0xff,0x0, 0xac,0x8, 0xb7,0xf8,0x0, +0xc, 0x3a,0xe0,0x2, 0x1f,0xa8,0xe0,0x2, 0x1e,0xbf,0x87,0xf, 0x39,0xeb,0xe0,0x3, +0x8e,0x2d,0x15,0x8e,0x3d,0xb3,0xe0,0x2, 0x1f,0xe9,0xe2,0x0, 0xc7,0x1, 0x3e,0x7e, +0x3f,0x9b,0x3a,0x68,0x3a,0xe9,0x3b,0x6a,0x8b,0x9f,0xf0,0x0, 0x8d,0x3f,0xe0,0x1, +0x1, 0x3b,0x99,0x5d,0x3c,0x63,0xef,0xfa,0xde,0xe8,0xf0,0x40,0x3c,0x68,0xef,0xf9, +0xda,0xa7,0xe0,0xc, 0x15,0x52,0x14,0x80,0x3c,0x64,0xe0,0x1, 0xd5,0x77,0xf0,0x1, +0x2c,0x23,0xe8,0x7, 0x3b,0xca,0xe0,0x0, 0x2b,0xec,0xe0,0x2, 0x1f,0xf3,0xe0,0x1, +0x1e,0xdf,0xa7,0x8f,0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, +0xc7,0x40,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0xc1,0x5, 0xf0,0x0, 0x14,0x80,0x3c,0xe3, +0xe8,0x40,0x3c,0x69,0xef,0xf9,0xdb,0x2e,0x24,0x7b,0xe0,0x1, 0x1d,0xcc,0x17,0x80, +0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3a,0x1e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81, +0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0x14,0x1, 0xef,0xf9, +0xda,0xc0,0xf0,0x0, 0x24,0x27,0xe0,0x1, 0x1d,0xcb,0x17,0x80,0xe0,0xe, 0x37,0xa1, +0xe0,0xd, 0x3a,0x9e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0xe0,0x2, 0x19,0x6d,0xe4,0x0, 0xc1,0x85, +0x3c,0x64,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0xef,0xf9,0xdb,0xca,0x2b,0x95,0x39,0x13, +0x8c,0xc2,0x3c,0x65,0xef,0xf9,0xdb,0xc4,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1, +0xe0,0x2, 0x19,0x6d,0xe4,0x0, 0xc1,0x85,0x3c,0x64,0xe0,0xf, 0x39,0x13,0x8c,0xcf, +0xef,0xf9,0xdb,0xb6,0x23,0xf2,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0x3c,0x66,0xef,0xf9, +0xdb,0xaf,0xf7,0xff,0x2c,0x66,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0xe0,0xc, +0x15,0x52,0x14,0x80,0x3c,0x66,0xe0,0x1, 0xd5,0x1, 0xe0,0x2, 0x1f,0xf3,0xe0,0x1, +0x1e,0xdf,0xa7,0x8f,0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, +0xc7,0x40,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0xf0,0x0, 0x14,0x84,0xf7,0xff,0x25,0xe, +0x3c,0xe3,0xe8,0x40,0x3c,0x69,0xef,0xf9,0xda,0xbd,0x24,0x7b,0xe0,0x1, 0x1d,0xca, +0xc1,0x5, 0x17,0x80,0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3b,0x1e,0x3f,0x1b,0x9f,0xe, +0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73, +0xe7,0xfe,0x0, 0xf5,0xe0,0xc, 0x15,0x52,0x14,0x80,0x3c,0x65,0xe0,0x1, 0xd4,0xce, +0xe7,0xfe,0x0, 0xd9,0x99,0x6d,0xe7,0xfe,0x0, 0xc7,0xe0,0x1, 0x1f,0xd0,0xe0,0x1, +0x1d,0x3e,0xa4,0x8f,0x3c,0x69,0xe7,0x65,0x0, 0x90,0xe0,0x2, 0x1f,0xb7,0xe0,0x1, +0x1f,0x50,0x9f,0x8f,0x15,0xc, 0x3d,0x1f,0xa5,0x8e,0xe0,0x1, 0x1c,0xcd,0xf0,0x2, +0x1b,0xba,0xe3,0xff,0xc5,0x7f,0xe0,0xd, 0x37,0xa1,0x14,0x7, 0xe0,0x6, 0x17,0x28, +0x3f,0x1f,0x37,0x21,0xe0,0xc, 0x3d,0x9d,0x3f,0x19,0x96,0x8c,0x97,0x1e,0xc7,0x81, +0xe3,0xff,0xc7,0xff,0x3f,0x1d,0xe0,0xd, 0x37,0xa1,0xb7,0xc, 0xe0,0xe, 0x3d,0x9d, +0x9f,0xe, 0xe2,0x1f,0xcf,0x1f,0x2, 0x83,0xe8,0x0, 0xac,0x7, 0x3f,0xfa,0x1, 0xe7, +0x38,0x82,0x0, 0x0, 0xe0,0x0, 0x1f,0x8b,0xf0,0x40,0x3a,0x68,0xf0,0x0, 0x88,0x8f, +0xe0,0x1, 0x14,0x7f,0xf0,0x0, 0x20,0xe5,0xf0,0x0, 0x1b,0xe, 0xf0,0x40,0x3a,0xe8, +0x17,0x0, 0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0x11,0x82,0xf0,0x0, 0x10,0x3, 0x0, 0x9e, +0xf1,0x2c,0x39,0xad,0xe0,0x0, 0x26,0x43,0xf0,0x0, 0x12,0x82,0xe8,0x40,0x3e,0xe5, +0x3f,0xe8,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe8,0x40,0x3e,0x65, +0x5, 0x82,0x3e,0x68,0x3c,0x6c,0xe2,0x1, 0xc4,0x7f,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f, +0xe8,0x40,0x3f,0x71,0xf0,0x0, 0xc3,0x2, 0x1, 0x38,0x3d,0x7e,0x1, 0x77,0xe8,0x0, +0x8e,0x86,0xe8,0x0, 0x8e,0x16,0xf0,0xf, 0x3a,0x2d,0xe2,0x0, 0xcf,0x80,0xe8,0x17, +0x3e,0xa4,0xf2,0x1, 0xc3,0xff,0xe0,0xd, 0x3c,0xac,0xe2,0x1, 0xc7,0xff,0xe8,0x6f, +0x3d,0x27,0x3e,0x29,0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc6,0x7f,0xe2,0x1, 0xc6,0xff, +0xf1,0x37,0x39,0x2f,0xe0,0x6d,0x3d,0x2c,0xf0,0x0, 0x23,0x85,0xf1,0x2c,0x39,0x2d, +0x2e,0x15,0xf1,0x2c,0x39,0xaf,0xe7,0xff,0x2e,0x3d,0x25,0xc1,0xf1,0x2f,0x38,0x2f, +0xe7,0xff,0x27,0xbe,0xf0,0x40,0x38,0x7d,0xe8,0x40,0x3f,0xe0,0xe8,0x6f,0x3c,0xa5, +0xf0,0x40,0x3a,0xef,0xe7,0xff,0x0, 0xb4,0x38,0x82,0x14,0x1, 0x38,0x82,0x38,0x82, +0x3d,0x78,0x5, 0x88,0xc4,0x1, 0x3c,0x1a,0x17,0x80,0xe2,0x1, 0xc4,0x7f,0xaf,0x8b, +0x38,0x82,0x17,0xff,0x3f,0x99,0x3f,0xaa,0x3c,0x7f,0x5, 0xb, 0xe0,0xf, 0x3d,0x28, +0x3c,0x9f,0xe0,0xa, 0x3c,0x2a,0x3c,0x69,0xe2,0x1, 0xc4,0x7f,0xad,0xb, 0x38,0x82, +0xe0,0x9, 0x35,0x21,0xc4,0x81,0xe0,0xa, 0x3c,0x2a,0x3c,0x69,0xe2,0x1, 0xc4,0x7f, +0xad,0xb, 0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0x34,0xf0,0x40, +0x3e,0x6a,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1d,0xe, 0xe4,0x0, 0xc5,0x8a,0x3e,0xea, +0x3e,0x9b,0x3f,0x9a,0x16,0x0, 0xe0,0x2, 0x1f,0x3f,0xe0,0x10,0xae,0x1d,0xf0,0x40, +0x3c,0xe8,0xe0,0x10,0xae,0x2d,0xe8,0x40,0x3c,0x6c,0x8e,0xf, 0x8f,0x9f,0x89,0x4e, +0x89,0xde,0x7d,0x8f,0xf0,0x40,0x3f,0x69,0x7e,0xa, 0x7f,0x88,0xef,0xfd,0xd0,0xe7, +0x14,0x83,0xe0,0x1, 0xd1,0x69,0xe0,0x1, 0x1e,0xad,0xe0,0x43,0x3c,0x18,0xe0,0x1, +0x93,0xbd,0x67,0xa, 0x3b,0xf8,0xe0,0x67,0x3c,0x28,0xe8,0x40,0x3f,0x79,0xe0,0x3, +0x3, 0x82,0x17,0x81,0x66,0xa, 0xe8,0xf, 0x3f,0x99,0x3f,0x9c,0x17,0x0, 0xe2,0x1, +0xc7,0xff,0x3b,0x6e,0x66,0x8, 0xe8,0x40,0x3e,0x7e,0xe0,0x2, 0x3, 0xe2,0x66,0x8, +0x16,0x81,0xe8,0xd, 0x3e,0x9e,0x3e,0x9c,0x16,0x0, 0xe2,0x1, 0xc6,0xff,0x7e,0x9, +0x3e,0x1e,0xe0,0x1, 0x1a,0x51,0x36,0x21,0xa7,0x4, 0xe0,0xa, 0x3f,0x96,0x3f,0x1c, +0xe0,0x1, 0x1e,0x2d,0xe9,0xff,0xc7,0x7e,0x85,0x9c,0x37,0x41,0xe0,0x1, 0x1e,0x47, +0x61,0x9, 0x7f,0x12,0x36,0x41,0x67,0x9, 0xe2,0x1, 0xc5,0x7f,0xe0,0x0, 0x6f,0xc3, +0xe2,0x0, 0x7c,0x40,0x17,0x80,0x39,0x1d,0xe0,0x0, 0x6f,0x40,0xe2,0x1, 0xc1,0x7f, +0xe0,0x0, 0x6e,0xc2,0xe0,0x0, 0x6f,0xc5,0x7d,0xb, 0x7e,0x13,0xe0,0x0, 0x6b,0x41, +0xe0,0x0, 0x6d,0xc4,0xd8,0x9d,0xe0,0x1, 0x1f,0xc4,0xf0,0x0, 0x9c,0xf, 0xe0,0x1, +0x1f,0xb8,0xf4,0x18,0x34,0x20,0xf0,0x0, 0x9d,0x8f,0xe0,0x1, 0x1f,0xb7,0xf4,0x1b, +0x35,0xa0,0xf0,0x0, 0x9d,0xf, 0xe0,0x1, 0x1f,0xb6,0xf4,0x1a,0x35,0x20,0x9e,0x8f, +0xe0,0x1, 0x1f,0xb5,0xf0,0x18,0x3c,0x1d,0x9f,0xf, 0xe0,0x1, 0x1f,0xb4,0xf0,0x1b, +0x3d,0x9e,0x9f,0x8f,0x16,0x80,0xf0,0x1a,0x3d,0x1f,0x67,0x8b,0x3f,0xf6,0xe0,0x1, +0x5, 0xc3,0xe0,0xf, 0x3b,0x33,0x66,0x89,0xa5,0x84,0x3f,0x9d,0x66,0x8a,0x37,0xa1, +0xe0,0xc, 0x3b,0x2d,0xe3,0xff,0xc6,0x7f,0x3d,0x9f,0x7e,0x7, 0x17,0x2, 0x66,0x9, +0x67,0x88,0xe0,0x1, 0x1d,0x2d,0x3e,0x2f,0x7e,0xd, 0x31,0xa1,0x66,0x9, 0xf1,0x39, +0x3c,0x9e,0x79,0x8c,0xe4,0xc, 0x36,0x28,0xe4,0x3, 0x33,0x28,0xf1,0x2e,0x3f,0x1e, +0x8a,0x9a,0x16,0x80,0x7d,0x86,0x3a,0x63,0x7e,0xe, 0xf0,0x0, 0x7c,0x82,0x7f,0x5, +0xe4,0x4, 0x32,0x48,0x67,0x9, 0x39,0x7e,0xe0,0x1, 0x5, 0x84,0xf0,0x0, 0x67,0x6, +0x67,0x87,0x67,0xd, 0x66,0xa, 0xf0,0x0, 0x66,0x89,0xe3,0xff,0xc7,0x7f,0xe0,0x43, +0x39,0x9f,0xe0,0xc, 0x3b,0x2c,0xe8,0x40,0x3f,0xee,0x64,0x8e,0xf8,0x40,0x3f,0x6d, +0x7e,0x3, 0xf0,0x40,0x3c,0xee,0x7b,0x4, 0xf0,0x40,0x3e,0xef,0x0, 0xbe,0x66,0x3, +0xe2,0x0, 0xce,0x1, 0xe0,0x0, 0x5, 0x53,0x67,0x82,0xe0,0x0, 0x27,0xdf,0x66,0x5, +0x15,0x81,0xe0,0x0, 0x26,0x5b,0xe8,0x40,0x3d,0x6c,0x3c,0x64,0x7e,0x81,0xde,0x7b, +0x15,0x7e,0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0xb, 0x33,0x1, 0xe2,0x0, 0xcd,0x1, +0xc4,0x7f,0xe0,0x43,0x3d,0x9b,0xe2,0x1, 0xc4,0x7f,0xe0,0x66,0x3d,0xab,0xe2,0x0, +0xcc,0x2, 0x66,0x81,0x2, 0x8b,0x65,0x4, 0xe8,0xb, 0x3b,0x3e,0x3d,0x36,0xf0,0x1a, +0x3d,0x2b,0xf0,0x1b,0x3d,0xaa,0xf0,0x18,0x3c,0x26,0xf0,0x0, 0xc7,0x1, 0xf4,0x9, +0x37,0x28,0x17,0x1, 0xe4,0xf, 0x34,0xc8,0xe8,0xe, 0x3f,0x19,0x39,0x7f,0xf0,0x40, +0x3c,0xee,0xf3,0xff,0xc4,0xff,0x5, 0xac,0xe9,0x80,0x97,0x9d,0xe4,0x9, 0x34,0xc8, +0x3f,0xa5,0xe0,0x43,0x3b,0x1f,0xe2,0x0, 0xcb,0x0, 0x5, 0x68,0x15,0x81,0x3d,0x9d, +0x3b,0xf6,0xe2,0x1, 0xc5,0xff,0xe0,0x6d,0x3d,0x2b,0xe2,0x0, 0xc9,0x80,0xe7,0xff, +0x2, 0x30,0xe3,0xff,0xc9,0xff,0xe7,0xff,0x4, 0x31,0xe8,0x43,0x3d,0x99,0xe2,0x0, +0xcd,0x80,0xe0,0x0, 0x5, 0x60,0x67,0x8, 0xf0,0xb, 0x3f,0x2e,0xe2,0x0, 0xcd,0x81, +0x5, 0x4d,0x67,0x82,0xe7,0xff,0x2f,0xa5,0x15,0x80,0xe7,0xff,0x0, 0xa6,0x63,0x4, +0x66,0x6, 0x65,0xc, 0x67,0x7, 0x3e,0x1a,0xc3,0x1, 0xe4,0x4, 0x33,0x28,0x7e,0x6, +0xc7,0x1, 0x66,0xb, 0xe4,0xf, 0x32,0x48,0xe3,0xff,0xc7,0x7f,0x3e,0x7f,0x7f,0x7, +0xe7,0xfe,0x2, 0xe8,0xf2,0x0, 0xcc,0x0, 0x17,0x81,0xe8,0x6f,0x39,0xa8,0x3c,0xef, +0xf0,0x8, 0x35,0xa6,0xf0,0x40,0x3c,0x6f,0x7e,0x81,0xe0,0x1, 0xd0,0x69,0x67,0xf, +0xe0,0x0, 0x19,0xe, 0xc4,0x20,0x39,0x1e,0xe0,0x7, 0xb4,0x62,0xe8,0x40,0x3c,0xe8, +0xf0,0x8, 0x35,0x26,0xe0,0x1, 0xd0,0x5c,0xe0,0x1, 0x1d,0x2d,0x66,0xa, 0xe0,0x2, +0x8f,0xda,0x67,0x8, 0xf0,0x18,0x34,0x5f,0xf2,0x0, 0xcc,0x7f,0xe0,0x0, 0x17,0xff, +0xe8,0x6f,0x3d,0xa8,0xe0,0x10,0xaf,0x92,0xc4,0x20,0x66,0x81,0xe0,0x7, 0xb4,0x72, +0xe2,0x0, 0xce,0xad,0xe0,0x10,0xae,0xa2,0xe0,0x10,0xae,0x32,0xe0,0x10,0xaf,0x42, +0x5, 0x84,0x17,0xad,0xe0,0x10,0xaf,0xa2,0xe0,0x0, 0xc0,0x4c,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe3,0xff,0xcd,0xff,0xe7,0xfe,0x3, 0x72,0xe7,0xfe,0x0, 0xc7,0x16,0xff, +0x3e,0x93,0xe8,0xd, 0x3e,0xae,0x3e,0x7d,0x2, 0x30,0xf0,0xd, 0x37,0x21,0xe8,0xc, +0x3e,0x2e,0xc6,0x81,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, 0xc6,0xff,0xe7,0xfd, +0x0, 0x99,0x17,0xff,0x3f,0x92,0xe8,0xf, 0x3f,0xa9,0x3f,0x7f,0x2, 0xf, 0x3b,0x6e, +0xf0,0xf, 0x34,0xa1,0xe8,0x6, 0x3b,0x29,0xc7,0x81,0xe2,0x1, 0xc3,0x7f,0xe2,0x1, +0xc7,0xff,0xe0,0xe, 0x3b,0x33,0xe7,0xfc,0x0, 0xf7,0x63,0xa, 0x66,0x8a,0xe8,0x6, +0x3b,0x29,0xe8,0xf, 0x39,0x19,0xe2,0x1, 0xc3,0x7f,0x3f,0xad,0xe0,0xe, 0x3b,0x33, +0xe2,0x1, 0xc7,0xff,0xe7,0xfc,0x0, 0xe8,0x66,0x8, 0x65,0x8, 0xe8,0xd, 0x39,0x9e, +0xe8,0xc, 0x3e,0x2e,0x3e,0xaa,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, 0xc6,0xff, +0xe7,0xfc,0x0, 0xe8,0xe0,0x1, 0x1f,0x1d,0xe0,0x0, 0x1f,0x8e,0x34,0x21,0x8f,0xe, +0x3c,0x1f,0x8e,0x98,0x27,0x10,0xe0,0x2, 0x1f,0x3f,0x8f,0x4e,0xe4,0x0, 0xc4,0x8a, +0x36,0xa6,0x37,0x26,0x3f,0x99,0xc6,0xa0,0xc7,0x20,0xe0,0x7, 0xb6,0xef,0xe0,0x7, +0xb7,0x7f,0x38,0x82,0xe0,0x2, 0x1f,0x3f,0x8f,0x5e,0x0, 0xf1,0xe2,0x0, 0xcc,0x1, +0x1, 0x11,0x4, 0x9b,0xc4,0x7c,0xe2,0x0, 0xcc,0x1, 0x5, 0x8c,0xe0,0x1, 0x1f,0x4b, +0xe0,0x1, 0x1f,0xc3,0xbf,0xf, 0xe0,0x1, 0x1f,0x48,0xe0,0x1, 0x1f,0xd0,0xbf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0x4a,0xe0,0x1, 0x1f,0xc3,0xbf,0xf, 0xe0,0x1, 0x1f,0x49, +0xe0,0x1, 0x1f,0xd0,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x4c,0xe0,0x1, 0x1f,0xc3, +0xe2,0x0, 0xcc,0x82,0xbf,0xf, 0x1, 0x7, 0xe0,0x1, 0x1f,0x42,0xe0,0x1, 0x1f,0xd0, +0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x33,0xe0,0x1, 0x1f,0xd0,0xbf,0xf, 0x38,0x82, +0x8, 0xb5,0xe0,0x2, 0x19,0x3c,0x8f,0x82,0x2f,0xb6,0xe0,0x1, 0x19,0xc3,0xe0,0x1, +0x1a,0x51,0xa4,0x83,0xa4,0x4, 0xe0,0x1, 0x1a,0xd0,0xef,0xfa,0xdf,0xcd,0xe0,0x2, +0x1f,0xb7,0x14,0x8c,0x9f,0x8f,0xa5,0x4, 0x3c,0x9f,0xa5,0x83,0xa4,0x5, 0xe3,0xff, +0xc4,0xff,0x0, 0x88,0xc7,0x81,0x9e,0x8c,0xe3,0xff,0xc7,0xff,0x3f,0xf9,0xb6,0x8e, +0x1, 0x19,0x8e,0x82,0xe0,0xe, 0x37,0xa1,0xe2,0x0, 0xce,0x81,0xe0,0xc, 0x3d,0x9e, +0x3f,0x1a,0x1, 0xf1,0xe0,0xe, 0x37,0xa1,0x3e,0xec,0xe0,0xc, 0x3c,0x1e,0x9e,0x8d, +0x96,0xc, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1a,0x3e,0xac,0x3f,0xf9,0xb6,0x8e, +0x1, 0xe9,0xa, 0xe1,0xe0,0x1, 0x1a,0xd0,0xe0,0x1, 0x19,0xc3,0xe0,0x1, 0x1a,0x51, +0xa5,0x5, 0xa4,0x83,0xa4,0x4, 0x15,0x81,0xef,0xfa,0xdf,0x77,0x0, 0xc9,0x0, 0x0, +0x8, 0xb4,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0x97,0x17,0x0, 0x8d,0x8f,0xe0,0x0, +0x19,0xe, 0xe0,0xc, 0x35,0xc3,0x3f,0xee,0x3e,0xee,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0x3f,0x12,0x3f,0xfc,0xe0,0xf, 0xae,0x8e,0x3f,0x6f,0x5, 0x78,0xe0,0x1, 0x1e,0x2d, +0xe0,0x1, 0x1f,0xd1,0xe0,0x2, 0x1d,0x3f,0xf0,0x1, 0x93,0xc, 0xa7,0xf, 0xf0,0x0, +0x91,0xac,0xf0,0x0, 0x92,0x3c,0xf0,0x0, 0x92,0xfc,0xe0,0x2, 0x1e,0x7a,0xf0,0x0, +0x80,0xca,0xf0,0x0, 0x81,0x5a,0xe4,0x0, 0x17,0x80,0xe2,0x0, 0x7c,0xae,0xe0,0x1, +0x1d,0x47,0xf0,0x0, 0x83,0x8c,0xe0,0x0, 0x1a,0xb, 0xe0,0x0, 0x19,0x8a,0x3f,0x1f, +0x3f,0x99,0x16,0x0, 0x37,0x41,0x37,0xc1,0x35,0x41,0xc5,0xff,0xe2,0x0, 0x7c,0x84, +0xe2,0x0, 0x7c,0x14,0xae,0x84,0xae,0x83,0xe0,0x1a,0xb6,0x52,0xe0,0x1a,0xb6,0x62, +0xe0,0x1a,0xb6,0x72,0xe0,0x1b,0xb6,0x12,0x7f,0x6, 0x7f,0x88,0x7d,0x7, 0xf0,0x0, +0x73,0x15,0x6d,0x96,0xf0,0x0, 0x6b,0x97,0xf0,0x0, 0x68,0x95,0xf0,0x0, 0x69,0x14, +0xf0,0x0, 0x71,0x92,0xf0,0x0, 0x72,0x13,0xf0,0x0, 0x72,0x94,0xef,0xff,0xd5,0xe1, +0x55,0x7, 0x5f,0x8, 0xe0,0x1a,0xb5,0x72,0xe0,0xb, 0x37,0x48,0xe0,0x0, 0x1d,0x7, +0x5f,0x86,0xaf,0xa, 0xe0,0xd, 0x37,0xc8,0xe0,0x0, 0x1f,0x8, 0xf0,0x0, 0x4b,0x84, +0xad,0x8e,0xe0,0x0, 0x1f,0x5, 0x4c,0x5, 0xf0,0x0, 0x53,0x3, 0x54,0x84,0x56,0x5, +0xaf,0x8e,0xe0,0x0, 0x1f,0x84,0xf0,0x0, 0xab,0x84,0xac,0x3, 0xf0,0x1a,0xb3,0x52, +0xe0,0x1a,0xb4,0xe2,0xe0,0x1b,0xb6,0x12,0xae,0x8f,0xf0,0x0, 0x23,0xa5,0xe0,0x1, +0x1d,0x32,0xe0,0x0, 0x1e,0xe, 0x17,0x80,0xf0,0x0, 0x13,0x1, 0xe0,0xe, 0x37,0xc3, +0xe2,0x0, 0xc7,0x1f,0x3f,0x12,0x16,0x87,0xe0,0xf, 0x84,0x8e,0x3e,0xdf,0xe0,0x80, +0x9d,0x9a,0xf0,0xd, 0x33,0x3d,0x3e,0xc9,0xc7,0x81,0xe0,0xf, 0xae,0x8e,0xe2,0x1, +0xc7,0xff,0xe0,0xe, 0x35,0xc8,0xaf,0xc, 0xf0,0x40,0x3b,0xff,0xc6,0x2, 0xe0,0x40, +0xad,0x9c,0x1, 0xe5,0x24,0x19,0x15,0xff,0x3d,0x98,0xe2,0x1, 0xc5,0xff,0x35,0xa1, +0xe2,0x0, 0x7e,0xae,0xe0,0x0, 0x1f,0x8e,0xe2,0x0, 0x7f,0x2c,0xe0,0xb, 0x3d,0x9d, +0xe0,0x80,0x9e,0x9e,0xc7,0x82,0xe0,0xc, 0x36,0xc8,0x3d,0xfe,0xe0,0x7, 0xae,0x2f, +0xe0,0x7, 0xae,0xbf,0x1, 0xf6,0xe0,0x0, 0xc0,0x68,0xa, 0x61,0x8, 0xb1,0xe0,0x0, +0x1f,0x8c,0x17,0x0, 0xaf,0xf, 0xdf,0x35,0xe0,0x0, 0x1f,0x8b,0x8f,0xf, 0x27,0x12, +0xea,0x23,0x7e,0xa9,0x87,0x8d,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0xb2, +0x2, 0x96,0xaf,0x8d,0xe0,0x1, 0x1f,0xcf,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xb, +0x8, 0xe1,0xea,0x23,0x7f,0xa9,0xaf,0xf, 0xe0,0x1, 0x1f,0xcf,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0xf7,0xe0,0x0, 0x1f,0x83,0xaf,0xf, 0x8, 0xe1,0x17,0xb2,0x0, 0xea, +0xea,0x23,0x7f,0xb0,0xea,0x23,0x7f,0x34,0x97,0x8f,0x9e,0x8e,0xe4,0x8, 0x34,0x23, +0xe0,0xe, 0x3f,0xad,0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d, +0x3f,0xad,0xe0,0x41,0x3f,0x4e,0xe4,0x8, 0x34,0x40,0xe0,0x6f,0x3d,0x2e,0x3f,0xf8, +0x2, 0x17,0xea,0x23,0x7f,0xae,0xea,0x23,0x7f,0x32,0x97,0x8f,0x9e,0x8e,0xe0,0xe, +0x3f,0xad,0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d,0x3f,0xad, +0xe0,0x41,0x3f,0x4e,0xe0,0x6f,0x3d,0x2e,0xe0,0x28,0x3c,0x2f,0x38,0x82,0x14,0x0, +0x38,0x82,0xea,0x23,0x7f,0xac,0x17,0x0, 0xaf,0xf, 0x38,0x82,0xea,0x23,0x7c,0x36, +0xe7,0x5b,0x0, 0xa7,0x3f,0x82,0x8, 0xb6,0xea,0x23,0x79,0x2c,0xe0,0x2, 0x1f,0xa0, +0x8e,0x82,0xe0,0x2, 0x1f,0x21,0x8e,0xf, 0x26,0x8f,0xea,0x23,0x79,0xb6,0x9f,0x83, +0x27,0x85,0x17,0x81,0xe1,0x2f,0x3e,0x1f,0x27,0x96,0x14,0x0, 0x17,0x80,0xaf,0x82, +0x17,0x80,0xb7,0x83,0xb, 0x61,0xe0,0x2, 0x1f,0x9f,0xe2,0x0, 0xce,0x1, 0x8c,0xf, +0x1, 0x14,0xea,0x1a,0x7f,0xe4,0xe9,0xff,0xc7,0xff,0xe0,0xe, 0x36,0xa2,0x3f,0x9e, +0xa7,0x8f,0x3f,0x82,0xe0,0x2, 0x1d,0x9f,0xe2,0x0, 0xce,0x1, 0x8c,0xb, 0xe0,0x1, +0x1, 0xa5,0xe2,0x0, 0xce,0x84,0x1, 0x62,0xe0,0x0, 0x1f,0xe5,0xe0,0x6, 0x9a,0x2e, +0x8d,0x8f,0xe0,0x0, 0x1f,0xe4,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0x7f,0xe0,0x1, +0x5, 0x91,0xe0,0x0, 0x1f,0xe3,0x8d,0x8f,0xe0,0x0, 0x1f,0xe2,0x35,0xa8,0x8f,0x8f, +0x3f,0xcb,0x3a,0x7f,0xe0,0x1, 0x3, 0x86,0xe0,0x0, 0x1f,0xe1,0xe0,0x6, 0x9a,0xbe, +0x8d,0x8f,0xe0,0x0, 0x1f,0xe0,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0xff,0xe0,0x0, +0x5, 0xf9,0xe0,0x0, 0x1f,0xdf,0x8f,0xf, 0xe0,0x0, 0x1f,0xde,0x37,0x28,0x8f,0x8f, +0x3f,0xce,0x3a,0xff,0xe0,0x0, 0x3, 0xee,0xe2,0x0, 0xce,0x84,0xe0,0x1, 0x2, 0x9d, +0xea,0x1a,0x7f,0xf8,0xe9,0xff,0xc7,0xff,0x36,0xa2,0x3f,0x9d,0xa7,0x8f,0x3f,0x82, +0x12,0x80,0x3a,0x65,0x17,0x81,0xe0,0x2c,0x3e,0xf, 0xe0,0x0, 0x26,0x59,0xe0,0x0, +0x2c,0x57,0xea,0x23,0x7f,0xae,0xea,0x23,0x7f,0x30,0xb2,0x8f,0xe0,0x0, 0x1f,0xdd, +0xb2,0xe, 0xea,0x23,0x79,0xb6,0x8e,0x8f,0xe0,0x0, 0x1f,0xdc,0x8f,0xf, 0xe0,0x0, +0x1f,0xdb,0x37,0x28,0x8b,0xf, 0xe0,0x0, 0x1f,0xda,0x36,0xa8,0x8f,0x8f,0x3b,0x4d, +0x3f,0xce,0x9f,0x3, 0xe0,0xf, 0x3b,0x2f,0x3f,0x7f,0xe7,0xff,0x2, 0x0, 0xe0,0x0, +0x1f,0xd9,0x8c,0xf, 0xdf,0x2e,0xe7,0xfe,0x24,0x7a,0xea,0x23,0x7f,0xb2,0xea,0x23, +0x7f,0x34,0x14,0x0, 0xb2,0x8f,0x17,0x83,0xb2,0xe, 0xaf,0x82,0xb3,0x3, 0xb, 0x61, +0xea,0x23,0x79,0xb6,0x14,0x24,0xe7,0xfe,0x0, 0xeb,0x2e,0x14,0xe2,0x0, 0xce,0x81, +0xe0,0x0, 0x1, 0x44,0xe0,0x0, 0x1f,0xd8,0x3c,0x6c,0x8e,0x8f,0xe0,0x0, 0x1f,0xd7, +0x36,0xa8,0x8f,0xf, 0xea,0x23,0x7f,0xb6,0x3f,0x4d,0x16,0x84,0xae,0x82,0xb7,0xf, +0xb, 0x61,0x12,0x80,0x3a,0x65,0xe0,0x0, 0x1e,0xd6,0xea,0x23,0x7f,0x30,0xea,0x23, +0x7f,0xae,0x8c,0xd, 0xb2,0xe, 0xb2,0x8f,0xde,0xfc,0x24,0x3, 0x14,0x0, 0xb, 0x61, +0xea,0x23,0x79,0xb6,0xe7,0xfe,0x0, 0xc3,0xe2,0x0, 0xce,0x84,0xe7,0xfe,0x5, 0xcb, +0xe7,0xfe,0x0, 0xbd,0xe0,0x43,0x3a,0x14,0xe0,0x43,0x3a,0x95,0x0, 0xe5,0x2c,0x6f, +0xea,0x23,0x7f,0x32,0xea,0x23,0x7f,0xb4,0xb2,0x8e,0xe0,0x0, 0x1f,0x5d,0xb2,0xf, +0xea,0x23,0x7f,0xb6,0x8e,0x8e,0xe0,0x0, 0x1f,0x5b,0x36,0xa8,0x8f,0xe, 0x3f,0x4d, +0x16,0x81,0xae,0x82,0xb7,0xf, 0xb, 0x61,0xe0,0x0, 0x1f,0xdd,0x3c,0x6c,0x8e,0x8f, +0xe0,0x0, 0x1f,0xdb,0x36,0xa8,0x8f,0xf, 0xea,0x23,0x7f,0xb6,0x3f,0x4d,0x16,0x82, +0xae,0x82,0xb7,0xf, 0xb, 0x61,0xea,0x23,0x79,0xb6,0x14,0x0, 0xe7,0xfe,0x0, 0x90, +0xf0,0x1, 0x1b,0x7d,0xe8,0x0, 0x8d,0x6, 0xe2,0x1, 0xcd,0x6f,0x2, 0x90,0xf0,0x1, +0x1b,0xf5,0xe0,0xf, 0x35,0x22,0xc5,0x1, 0xf0,0x17,0x3b,0x9f,0xe2,0x1, 0xc5,0x7f, +0xe8,0x0, 0xb4,0x7, 0xe8,0x0, 0xb4,0x97,0xe8,0x0, 0xad,0x6, 0xe0,0x2, 0x1f,0xc7, +0xe0,0x1, 0x9f,0xf, 0x3f,0x78,0xe0,0x1, 0x5, 0xa5,0xe0,0x1, 0xb4,0xf, 0xe0,0x1, +0xb4,0x9f,0x9f,0x7f,0x3f,0x79,0xe0,0x1, 0x5, 0x83,0xb4,0xff,0xb4,0x6f,0xe2,0x0, +0xcd,0xa, 0xe0,0x1, 0x1, 0xa, 0xe2,0x0, 0xcd,0x14,0xe0,0x1, 0x1, 0x1b,0xe2,0x1, +0xcd,0x6f,0xe0,0x1, 0x5, 0xa7,0x8, 0xb1,0xf0,0x0, 0x19,0x8f,0xf0,0x1, 0x1b,0xf5, +0xe8,0x0, 0x8c,0x83,0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x12,0x1, 0xe8,0x40,0x3c,0x67, +0xe2,0x0, 0xcc,0x9f,0x2, 0x86,0xc4,0x81,0xe2,0x1, 0xc4,0xff,0xf8,0x40,0x3a,0xe4, +0x17,0xfe,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xc7,0x81,0x37,0xa2,0xe8,0x0, 0x98,0x87, +0xf8,0x0, 0x99,0x17,0xe0,0x1, 0x1e,0xf5,0xe0,0x10,0x3c,0x1f,0xf0,0x40,0x3b,0xe8, +0x15,0x0, 0x0, 0xad,0xe8,0xe, 0x3f,0x22,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x3e,0x1e, +0xe2,0x0, 0xce,0x0, 0xe2,0x1, 0xc7,0xff,0x5, 0x30,0xe2,0x1, 0xc7,0x7f,0xf0,0x40, +0x38,0xef,0x3e,0x6e,0xf2,0x1, 0xc0,0xff,0xe2,0x1, 0xc6,0x7f,0xf0,0x40,0x38,0xfc, +0x3, 0x82,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x3f,0xf9,0x4, 0x8d,0xc5,0x1, 0xe2,0x1, +0xc5,0x7f,0xf0,0x0, 0x99,0x3d,0xe0,0xf, 0x35,0x22,0x3f,0x98,0xb5,0x8f,0x38,0xeb, +0xf0,0x0, 0xb1,0x1f,0xc6,0x84,0xe8,0x40,0x3e,0xf0,0x1, 0x12,0x9d,0xad,0x9f,0x3d, +0xe0,0xf, 0x3d,0xa1,0xe3,0xff,0xc7,0xff,0xe0,0x43,0x3e,0x1f,0xe2,0x0, 0xce,0x0, +0x2, 0x4a,0xe0,0x41,0x3f,0xcf,0x0, 0xc7,0xe0,0x41,0x3f,0x4e,0x0, 0xcf,0xe2,0x0, +0xcc,0x9f,0xc5,0x1, 0xe2,0x1, 0xc5,0x7f,0x2, 0x85,0xe2,0x1, 0xcd,0x6b,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0x2a,0xb4,0xe8,0x0, 0xad,0x6, 0x8, 0xe1,0xe0,0x1, 0x9f,0x3f, +0x3f,0x79,0xe7,0xfe,0x3, 0xfe,0xe2,0x0, 0xcd,0xa, 0xe0,0x1, 0xb4,0xbf,0xe0,0x1, +0xb4,0x2f,0xe7,0xfe,0x1, 0xfa,0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f, +0x96,0x7f,0x3e,0xab,0x3f,0x2c,0xe0,0x2, 0xb6,0x8f,0xe0,0x2, 0xb7,0x1f,0x38,0x82, +0x9f,0x4f,0x3f,0x78,0xe7,0xfe,0x3, 0xdf,0xb4,0x4f,0xb4,0xdf,0xe7,0xfe,0x0, 0xdb, +0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f,0x96,0x7f,0x3e,0xab,0x3f,0x2c, +0xe0,0x2, 0xb6,0xaf,0xe0,0x2, 0xb7,0x3f,0x38,0x82,0xe8,0x0, 0xac,0x83,0x0, 0xcc, +0x38,0x82,0xe0,0x1, 0x1c,0x30,0xe7,0x57,0x0, 0xc4,0xe0,0x2, 0x1f,0xc7,0x8c,0xf, +0x17,0x84,0xe0,0x28,0x3c,0xf, 0x38,0x82,0x17,0xe0,0x3f,0x98,0xe2,0x0, 0xcf,0x83, +0x5, 0x96,0x24,0x14,0xe0,0x1, 0x1e,0xfd,0x16,0x6, 0xe0,0x2, 0x1f,0xc7,0xe0,0x1, +0x1f,0x75,0xe0,0x2, 0x1d,0xc6,0xae,0xd, 0xc7,0x84,0x96,0xf, 0x96,0x9f,0xb6,0xe, +0x3f,0xfb,0xc7,0x4, 0xe0,0x40,0xb6,0x9e,0x1, 0xf8,0x38,0x82,0xe0,0x2, 0x1f,0x47, +0xe0,0x1, 0x1f,0xf5,0x95,0xae,0x96,0x3e,0xe0,0x1, 0x96,0xce,0xe0,0x1, 0x1d,0x7d, +0xe0,0x1, 0x97,0x5e,0x14,0x82,0xac,0x8a,0xb5,0x8f,0xb6,0x1f,0xb6,0xaf,0xb7,0x3f, +0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x2, 0x1f,0xa0,0xe0,0x2, 0x1f,0x1f, +0x8f,0x8f,0x8e,0xe, 0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x5, 0xfa,0xe0,0x1, 0x1f,0x30, +0x9e,0x8e,0xe0,0x0, 0x26,0xe6,0xe0,0x2, 0x19,0x47,0x8d,0x82,0x2f,0x95,0x16,0x81, +0xe0,0x2d,0x3e,0xd, 0x26,0x91,0x9f,0x8e,0xe2,0x0, 0xcd,0x83,0xb7,0x92,0xe0,0x1, +0x1, 0x61,0xe0,0x2, 0x1f,0x85,0x17,0x7e,0xe0,0xa, 0xaf,0x3f,0x17,0x80,0xaf,0x82, +0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x2, 0x1f,0x21,0xe0,0xd, 0x8e,0x8e,0xe2,0x0, +0xce,0x81,0x1, 0x70,0xe0,0x6, 0x9a,0xae,0xe0,0x6, 0x9a,0x3e,0xe0,0x0, 0x25,0xfb, +0xe2,0x0, 0xcd,0x81,0xe0,0x1, 0x1, 0x55,0xea,0x23,0x7b,0x3c,0xea,0x23,0x7b,0xba, +0x97,0x86,0x94,0x87,0xe2,0x0, 0xcd,0x83,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29, +0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff,0xe0,0x2, 0x1, 0x14,0xe0,0x43,0x3e,0x9f, +0xe0,0x43,0x3f,0x19,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xc4,0xff,0xe2,0x0, 0xce,0x80, +0xf0,0x0, 0x1c,0xf, 0xe0,0x1, 0x5, 0x20,0xe2,0x0, 0xcf,0x0, 0xe0,0x1, 0x5, 0x2b, +0x3e,0xef,0x3f,0x69,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0x7f,0x3e,0xfe,0x3, 0x82, +0x3f,0xe9,0xe8,0x0, 0x8f,0x8, 0xe2,0x1, 0xc7,0xff,0x3f,0x7f,0xe7,0xff,0x3, 0xba, +0x3c,0xe4,0x3c,0x65,0xde,0x7e,0xb2,0x86,0xb2,0x7, 0xe7,0xff,0x0, 0xb3,0xe0,0x1, +0x1f,0xd6,0x17,0x1, 0xaf,0xf, 0x17,0x7e,0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0xaf,0x3f, +0xe0,0x2, 0x1f,0xc7,0xae,0x8f,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x0, 0x1f,0xe, +0xe0,0x1a,0x9f,0x5e,0xe2,0x0, 0xcf,0x1e,0xe7,0xff,0x2, 0x82,0xe0,0x2, 0x19,0x47, +0x8d,0x82,0xe0,0x1, 0x25,0xdd,0xe0,0x1, 0x1f,0x30,0x9e,0x8e,0xe7,0xff,0x2e,0x80, +0xe0,0x1, 0x1f,0xd6,0x17,0x1, 0xaf,0xf, 0x17,0x7e,0xe0,0x2, 0x1f,0x85,0xae,0x82, +0xe0,0xa, 0xaf,0x3f,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x2, 0x1f,0x21,0xe0,0xd, +0x8e,0x8e,0xe2,0x0, 0xce,0x81,0xe7,0xfe,0x1, 0x76,0xe0,0x6, 0x9a,0xae,0xe0,0x6, +0x9a,0x3e,0x11,0x80,0xe7,0xfe,0x2e,0x76,0xf0,0x0, 0x14,0x81,0xe8,0x2f,0x3f,0x89, +0xe7,0xfe,0x27,0xf0,0xe0,0x2, 0x1c,0x47,0x15,0x28,0x3c,0xe3,0xe0,0x0, 0xdd,0x86, +0xe0,0x1, 0x1c,0x75,0xe0,0x7, 0x15,0x40,0x3c,0xe3,0xe0,0x0, 0xdd,0x7f,0xe0,0x0, +0x1f,0xd5,0xea,0x23,0x7b,0x3c,0x8f,0xf, 0xe0,0x0, 0x1f,0xd4,0x37,0x28,0x8f,0x8f, +0xea,0x23,0x7b,0xba,0x3f,0xce,0xe0,0x2, 0x1f,0x5, 0xf0,0x0, 0x1c,0xf, 0xe0,0xa, +0xa9,0xbe,0x3c,0xe4,0xe0,0x1, 0x1f,0x30,0xb7,0x8e,0xe0,0x1, 0x1f,0xfd,0x3c,0x65, +0xa9,0x8f,0x17,0x82,0xe8,0x0, 0xaf,0x88,0xb2,0xa2,0xb2,0x32,0xb2,0xc2,0xb2,0xe2, +0xe0,0x1, 0xb2,0x82,0xe0,0x1, 0xb2,0xa2,0xb2,0x52,0xb2,0x72,0xe0,0x1, 0xb2,0x12, +0xe0,0x1, 0xb2,0x32,0xb2,0x86,0xb2,0x7, 0xdd,0xfc,0x3c,0xe3,0xf0,0x0, 0xac,0x82, +0x3f,0x63,0x3f,0xe3,0xe0,0x41,0x3f,0xcf,0xe2,0x1, 0xc7,0xff,0xe7,0xfe,0x0, 0xde, +0x2f,0xbb,0xaf,0x82,0x17,0x7e,0xe0,0x2, 0x1f,0x85,0xe0,0xa, 0xaf,0x3f,0xe7,0xfe, +0x0, 0xa1,0xe0,0x41,0x3c,0xc9,0xe2,0x1, 0xc4,0xff,0xe7,0xfe,0x0, 0xd3,0xe0,0x0, +0x1f,0xd3,0x9f,0x42,0x8e,0x8f,0xe0,0x0, 0x1f,0xd2,0xe0,0x1, 0x9e,0x2, 0x8f,0x8f, +0x36,0xa8,0x3f,0x2c,0x3f,0xcd,0x3f,0x7f,0xea,0x23,0x7b,0x3c,0xea,0x23,0x7b,0xba, +0x2, 0x26,0xe0,0x0, 0x1f,0xd1,0xe0,0x1, 0x9f,0x32,0x8e,0x8f,0xe0,0x0, 0x1f,0xd0, +0x9e,0x72,0x8f,0x8f,0x36,0xa8,0x3f,0x2c,0x3f,0xcd,0x3f,0x7f,0x2, 0x18,0x97,0x86, +0x94,0x87,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff,0xc7,0xff,0xe3,0xff, +0xc4,0xff,0xe7,0xfe,0x0, 0x95,0xe0,0x1, 0x9c,0xd2,0xe0,0x1, 0x9c,0x42,0x17,0x84, +0xaf,0x82,0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xfb,0x0, 0xac,0x97,0x86,0x94,0x87, +0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff, +0x17,0x3, 0xaf,0x2, 0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe0,0x1, 0xb2,0xc2, +0xe2,0x1, 0xc7,0xff,0xe0,0x1, 0xb2,0x52,0xe2,0x1, 0xc4,0xff,0xe7,0xfd,0x0, 0xf8, +0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe0,0x1, 0xb2,0xc2,0xe2,0x1, 0xc7,0xff, +0xe0,0x1, 0xb2,0x52,0xe2,0x1, 0xc4,0xff,0xe7,0xfd,0x0, 0xea,0x17,0x1, 0xe0,0x2e, +0x3e,0xe, 0xe7,0xfe,0x27,0x34,0x3f,0x6f,0xe4,0x0, 0xcf,0x1, 0xe2,0x0, 0xc7,0x1, +0xe7,0xfe,0x27,0x2d,0xe0,0x1, 0x1f,0xb0,0x97,0x8f,0xb7,0x92,0xe7,0xfd,0x0, 0xa3, +0x8, 0xb4,0xe0,0x2, 0x19,0x85,0xe0,0xa, 0x8f,0x83,0x27,0x92,0xe0,0x2, 0x19,0x47, +0xde,0x79,0x8f,0x82,0xe2,0x0, 0xcf,0x84,0x1, 0x11,0xdc,0x5e,0x3a,0x68,0x22,0x7, +0xe0,0x2, 0x1f,0x90,0x17,0x1, 0xe0,0xa, 0xaa,0x33,0xaf,0xf, 0xa, 0x61,0xe0,0x2, +0x1f,0x47,0xaf,0x8e,0xa, 0x21,0xe7,0xf8,0x0, 0xc6,0x97,0x42,0xe0,0x1, 0x96,0x2, +0xe0,0x1, 0x97,0xb2,0x96,0xf2,0x3f,0x2c,0x3f,0xad,0xe0,0x1, 0xb7,0x62,0xe0,0x1, +0xb7,0xf2,0xd2,0xea,0x3a,0x68,0x24,0xc, 0xe2,0x1, 0xca,0x7f,0x17,0x80,0xe0,0x6f, +0x39,0xa4,0x3a,0x6f,0x3c,0x64,0xde,0x21,0x17,0x80,0xaf,0x82,0x0, 0xd9,0xe0,0x1, +0x1f,0xfd,0xe0,0x1, 0x1c,0x75,0x8d,0xf, 0x3c,0xe2,0xd6,0x6d,0x3a,0x68,0x0, 0xf3, +0x8, 0xb4,0xe2,0x0, 0xcc,0x1, 0x39,0xe8,0x39,0x68,0x17,0x80,0x5, 0x89,0x31,0x41, +0xe2,0x0, 0xc9,0x1, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x1, 0xfa,0x37,0xc1,0x31,0x3f, +0xe4,0x0, 0xc1,0x3, 0x12,0x1, 0x31,0x54,0x3c,0xe2,0x3c,0x63,0xe0,0x0, 0xda,0x40, +0x3c,0x12,0x34,0x41,0xe0,0x2, 0x3c,0x22,0xe0,0x43,0x3f,0x92,0xe0,0x41,0x3f,0x4f, +0xe2,0x0, 0xcf,0x80,0xe1,0x2e,0x3f,0x14,0xe1,0x2f,0x39,0x14,0xe0,0x6f,0x3d,0x2e, +0x39,0x68,0x2f,0xeb,0xa, 0x61,0xe0,0x1, 0x1f,0xf5,0x34,0x22,0x34,0xa2,0x3c,0x9f, +0x3c,0x1f,0x9f,0x88,0x9f,0x9, 0x9c,0x18,0x3f,0xae,0x9f,0x19,0xe0,0x43,0x3e,0x9f, +0xe2,0x0, 0xce,0x80,0x3c,0x2e,0xe0,0x43,0x3f,0x18,0xe0,0x41,0x3e,0xcd,0xe0,0x6f, +0x3d,0x2d,0xe2,0x0, 0xcf,0x0, 0xe0,0x41,0x3f,0x4e,0xe0,0x68,0x3d,0x2e,0x3f,0xbf, +0x3c,0x38,0x3c,0x1f,0xe2,0x0, 0xcc,0x5, 0x2, 0x88,0xe2,0x0, 0xcc,0x2, 0xe0,0xf, +0x34,0x41,0xe0,0x68,0x3b,0xaf,0x38,0x82,0xe7,0xff,0x0, 0xac,0x3f,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x0, 0x1f,0xcf,0x13,0x0, 0xf0,0x0, 0x8e,0xf, +0xe0,0x0, 0x1f,0xce,0x3a,0x68,0x8f,0x8f,0xf0,0x0, 0x14,0x81,0x7f,0x81,0xf0,0x40, +0x3d,0x66,0xf0,0x40,0x3d,0xe6,0x11,0xa8,0xe2,0x0, 0xca,0x1, 0xf0,0x0, 0x14,0x0, +0x5, 0xba,0x11,0x1, 0xf8,0x40,0x3e,0xe8,0xe8,0x40,0x3a,0xe8,0x0, 0x8b,0xe8,0x40, +0x3a,0xed,0x3b,0xe8,0xf0,0x40,0x3e,0xe2,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x3a,0x72, +0x1, 0x2a,0xe8,0x40,0x3c,0xed,0x3c,0x62,0xdf,0xa7,0x3c,0x73,0xf0,0x40,0x3f,0x68, +0x4, 0xf4,0xf7,0xff,0x26,0xee,0x3c,0xe2,0x3c,0x65,0xdf,0x9e,0xe8,0x8, 0x3c,0x1c, +0xe8,0xe, 0x3b,0x9e,0x3f,0x78,0x4, 0xbe,0xe2,0x0, 0xcb,0x5, 0x17,0x1, 0xe8,0xe, +0x3f,0x18,0xe0,0x0, 0x2, 0xe8,0xe8,0x40,0x3a,0xed,0xf0,0x40,0x3e,0xe2,0xc1,0x1, +0xe2,0x1, 0xc1,0x7f,0x3a,0x72,0xf0,0x40,0x3c,0x6e,0xf2,0x1, 0xc4,0x7f,0xe8,0x40, +0x3b,0xee,0x1, 0xd8,0xe2,0x0, 0xcb,0x5, 0x3f,0x66,0xe2,0x1, 0xc7,0x7f,0xc1,0x8a, +0x2, 0xb3,0xe8,0x40,0x3e,0xe8,0xe8,0x40,0x3f,0xeb,0xe2,0x1, 0xc6,0xff,0xe2,0x1, +0xc7,0xff,0x3e,0xff,0xe2,0x1, 0xc1,0xff,0x3, 0x83,0xf8,0x40,0x3c,0x6b,0xe2,0x0, +0xcf,0x5, 0xf8,0x40,0x3d,0xe8,0xf2,0x1, 0xc5,0xff,0xe0,0x0, 0x1, 0x59,0xf2,0x0, +0xcc,0x8c,0x1, 0x27,0xf0,0x0, 0xc4,0x81,0xc3,0x1, 0xf2,0x1, 0xc4,0xff,0xe7,0xff, +0x0, 0x9d,0xe2,0x0, 0xcb,0x5, 0xe8,0x40,0x3f,0xed,0xe0,0x6f,0x3a,0xa5,0x3a,0xef, +0x3f,0xe2,0xe0,0x7e,0x3a,0xa7,0xe8,0x6f,0x3a,0xad,0xe8,0x40,0x3b,0xee,0xf0,0x40, +0x3e,0xef,0xe7,0xff,0x0, 0x9b,0xe2,0x1, 0xc1,0xff,0xf0,0x0, 0x2d,0xaa,0xf0,0x0, +0x2d,0x10,0xf2,0x0, 0xcc,0x8c,0xf8,0x40,0x3d,0xea,0xf0,0x0, 0x66,0x1, 0x1, 0xdb, +0xf2,0x0, 0xcd,0x8a,0x2, 0x95,0xf0,0x0, 0x2d,0xa8,0xf0,0x0, 0x25,0x6, 0xf0,0x0, +0xc5,0x10,0xf2,0x1, 0xc5,0x7f,0xe8,0x40,0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xf0,0x0, 0xc5,0x1, 0xf2,0x1, 0xc5,0x7f,0xe7,0xfe,0x0, 0xf7,0xf0,0x0, +0x15,0xf, 0xe8,0x40,0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf2,0x0, +0xcd,0x8b,0xf0,0x0, 0x15,0xf, 0xe8,0x7a,0x3c,0xab,0xe8,0x40,0x3c,0x6a,0xc0,0x4, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf8,0x40,0x3d,0x6b,0x0, 0xde,0x11,0xb2,0xe7,0xff, +0x0, 0xab,0xe2,0x0, 0xcc,0x5, 0x5, 0x83,0xe7,0xfd,0x0, 0xdc,0xe2,0x0, 0xcc,0x2, +0xe0,0xe, 0x34,0x41,0xe0,0x68,0x3b,0xae,0x38,0x82,0xf0,0x2, 0x1a,0x47,0xf8,0x0, +0x9b,0xb4,0xe8,0x1, 0x9c,0xd4,0xe8,0x0, 0x9e,0x44,0xf0,0xa, 0x3b,0xa9,0xf0,0x40, +0x39,0x6a,0xe8,0x1, 0x9f,0x4, 0xf3,0xff,0xc1,0x7f,0xe8,0x43,0x3e,0x92,0xe0,0xf, +0x3e,0x2e,0xe2,0x0, 0xce,0x80,0xe8,0xd, 0x3c,0xa7,0xf8,0x1, 0x9b,0x34,0xf8,0x0, +0x9a,0xf4,0xf0,0x40,0x39,0xef,0xe3,0xff,0xc6,0xff,0xf3,0xff,0xc1,0xff,0xe0,0x72, +0x3d,0x2d,0xe0,0x0, 0x1e,0xcd,0xe8,0x43,0x3d,0x93,0xf8,0x8, 0x3b,0x25,0xe2,0x0, +0xcd,0x80,0x3f,0xe8,0x8d,0x8d,0xe0,0x0, 0x1e,0xcc,0xe3,0xff,0xc7,0xff,0x3f,0x2c, +0xe0,0x43,0x3d,0x1f,0xe3,0xff,0xc7,0x7f,0x8e,0x8d,0xe0,0x73,0x3d,0x2e,0xf8,0xc, +0x3a,0xa6,0xe2,0x0, 0xcd,0x0, 0xe0,0xe, 0x35,0xa8,0xe3,0xff,0xc6,0x7f,0x3f,0x4d, +0xe0,0x6f,0x3d,0x2c,0xf0,0x40,0x39,0xfe,0x14,0x0, 0xe0,0x0, 0x3, 0xd2,0xe0,0x0, +0x1f,0x4b,0xe0,0x0, 0x1e,0xca,0x8f,0xe, 0x8e,0x8d,0x37,0x28,0x3f,0x4d,0xe1,0x2d, +0x3f,0x9e,0xe0,0x0, 0x26,0xc5,0xe9,0x2f,0x3f,0x93,0xe0,0x0, 0x27,0xc1,0xe8,0x0, +0x8c,0x14,0x2c,0x3d,0xe0,0x0, 0x1f,0xd5,0xe0,0x0, 0x1e,0xc9,0x8d,0x8f,0xe0,0x0, +0x1f,0xc8,0x8e,0x8d,0x8e,0xf, 0xe0,0x0, 0x1f,0xd4,0x36,0x28,0x8f,0x8f,0x35,0xa8, +0x3e,0xcc,0x3f,0xcb,0xe8,0x0, 0x9e,0x14,0xe0,0xd, 0x3f,0xad,0x3e,0x7d,0x5, 0x28, +0xe0,0x0, 0x1e,0xc7,0x8d,0x8d,0xe0,0x0, 0x1e,0xc6,0x35,0xa8,0x8e,0x8d,0x3e,0xcb, +0x3f,0xad,0xe0,0x2f,0x3f,0x9c,0x27,0x9c,0xf1,0x2f,0x39,0x1e,0x27,0x99,0xe0,0x0, +0x1f,0xc5,0xe0,0x0, 0x1f,0x44,0x8f,0x8f,0x8f,0xe, 0xf0,0x40,0x3b,0xf9,0x37,0xa8, +0x3f,0x4f,0x3, 0x8f,0xf8,0xf, 0x3b,0xa5,0x3f,0xfe,0x3, 0xa, 0xf0,0xf, 0x3b,0x29, +0x3f,0x7f,0x17,0xa3,0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe8,0xf, 0x3c,0xa5,0x3f,0xfe,0x3, 0x7c,0xf8,0xf, 0x3b,0x27,0x3f,0x7f,0x17,0xa2, +0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0xe0,0x2, 0x1e,0x47,0xf0,0x0, 0x9b,0xac, +0xf0,0x1, 0x9a,0xcc,0xf0,0x0, 0x9a,0x4c,0xf0,0x1, 0x9b,0xc, 0xf8,0xd, 0x3b,0xa5, +0xe3,0xff,0xc6,0xff,0xe0,0x43,0x3f,0x1d,0xf8,0xf, 0x3a,0x26,0xe2,0x0, 0xcf,0x0, +0xe3,0xff,0xc7,0xff,0xf8,0xa, 0x3a,0xa7,0xe0,0x43,0x3c,0x9f,0xe0,0x1, 0x9c,0x3c, +0x9d,0xfc,0xe3,0xff,0xc5,0x7f,0xe0,0x6d,0x3d,0x2a,0xe2,0x0, 0xcc,0x80,0xf8,0xa, +0x3b,0x24,0xe0,0xe, 0x3c,0x2b,0xe3,0xff,0xc5,0x7f,0xe0,0x0, 0x1c,0xc3,0xe3,0xff, +0xc7,0x7f,0xe0,0x6f,0x3d,0x2a,0xe0,0x0, 0x1d,0x42,0xf0,0x43,0x39,0x9e,0x8c,0x89, +0x3d,0xa8,0xf2,0x0, 0xc9,0x80,0x8d,0xa, 0xe3,0xff,0xc5,0xff,0x34,0xa8,0xe0,0x6e, +0x3d,0x2b,0xe0,0xb, 0x3d,0x49,0xe1,0x2b,0x3d,0x9e,0xe0,0x0, 0x25,0xcd,0xe1,0x2f, +0x3f,0x9e,0xe0,0x0, 0x27,0xc9,0x8c,0x1c,0xe0,0x0, 0x2c,0x46,0xe0,0x0, 0x1f,0xd5, +0x9e,0x1c,0x8d,0xf, 0xe0,0x0, 0x1f,0xc1,0x35,0x28,0x8d,0x8f,0xe0,0x0, 0x1f,0xd4, +0x35,0xa8,0x8f,0xf, 0xe0,0x0, 0x1f,0xc0,0x3f,0x4a,0x8f,0x8f,0x3f,0xcb,0xe0,0xf, +0x3f,0x2f,0x3e,0x7f,0x5, 0x31,0xe0,0x0, 0x1f,0xbf,0x8d,0x8f,0xe0,0x0, 0x1f,0xbe, +0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3f,0x2f,0x3e,0x7e,0x3, 0x26,0xe0,0x0, 0x1f,0xbd, +0x8f,0xf, 0xe0,0x0, 0x1f,0xbc,0x37,0x28,0x8f,0x8f,0x3f,0xce,0x3e,0xff,0x5, 0x9c, +0xe0,0x0, 0x1f,0xc5,0xf8,0x40,0x3b,0xf5,0x8f,0xf, 0xe0,0x0, 0x1f,0xc4,0x37,0x28, +0x8f,0x8f,0x3f,0xce,0x37,0xc1,0x5, 0x91,0xf8,0x16,0x3a,0xa6,0xf0,0x40,0x3b,0x7f, +0x3, 0xb, 0xf8,0x17,0x3a,0x27,0xe8,0x40,0x3f,0xf7,0x17,0xa0,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82,0xf8,0x17,0x3b,0xa6,0xf0,0x40,0x3b,0xff, +0x3, 0x7b,0xf8,0x15,0x3a,0x25,0xe8,0x40,0x3f,0xf5,0x17,0xa1,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0xe0,0x2, 0x1e,0xc7,0x9d,0xad,0xe0,0x1, 0x9e,0x4d,0xf0,0x0, +0x9b,0x3d,0xe0,0xe, 0x3d,0xac,0xe0,0x1, 0x9c,0xdd,0xe3,0xff,0xc7,0x7f,0xe0,0x43, +0x3d,0x1e,0xf0,0xf, 0x3b,0x29,0xe2,0x0, 0xcd,0x0, 0xf0,0x0, 0x9b,0xcd,0xe0,0x1, +0x9d,0xd, 0xe3,0xff,0xc7,0xff,0x3e,0x2b,0xe3,0xff,0xc6,0x7f,0xe0,0x43,0x3d,0x9f, +0xe0,0x1, 0x9c,0x3d,0xe0,0x6e,0x3d,0x2c,0xe2,0x0, 0xcd,0x80,0xf0,0xc, 0x3b,0xaa, +0x9d,0xfd,0xe3,0xff,0xc6,0x7f,0xe8,0x9, 0x3c,0xa6,0xe0,0xd, 0x3c,0x2b,0xf0,0x43, +0x3b,0x1c,0xe3,0xff,0xc4,0xff,0xe0,0x6f,0x3d,0x29,0xe3,0xff,0xc6,0xff,0xf2,0x0, +0xcb,0x0, 0xe8,0xa, 0x3d,0x27,0xe0,0x43,0x3c,0x9d,0xe3,0xff,0xc5,0x7f,0x3d,0xa8, +0xe0,0x6c,0x3d,0x2a,0xe2,0x0, 0xcc,0x80,0xe3,0xff,0xc5,0xff,0xe0,0x6d,0x3d,0x2b, +0x3f,0xad,0xe0,0x43,0x3d,0x9f,0x16,0x9f,0xe2,0x0, 0xcd,0x80,0xe0,0x2f,0x3e,0xaf, +0x16,0xe1,0xe0,0x2b,0x3d,0xad,0xe0,0x6f,0x3d,0x2b,0x14,0x0, 0x27,0x8c,0x3f,0x2c, +0xe0,0x43,0x3f,0x9e,0x3f,0xf8,0x14,0x1f,0xe0,0x28,0x3c,0x2e,0xe0,0x2f,0x3f,0xad, +0xe0,0x68,0x3d,0x2f,0x38,0x82,0x8, 0xb1,0xe0,0x1, 0x1f,0xfd,0x84,0xf, 0xc4,0x7f, +0xe2,0x1, 0xc4,0x7f,0xdd,0x7d,0x17,0x80,0x2c,0xc, 0xde,0x50,0x3f,0xe8,0x2c,0x9, +0xde,0xf4,0xe2,0x0, 0xcc,0x0, 0xe0,0x1, 0x17,0x7f,0xe0,0x6e,0x39,0xa8,0x3f,0xee, +0x3c,0x6f,0x8, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe2,0x0, 0xcc,0x1, 0x39,0x69, +0xe0,0x0, 0x5, 0xcf,0x12,0xfe,0xf0,0x0, 0x1d,0xba,0x3a,0x98,0xe0,0x0, 0x1f,0xb6, +0xea,0x23,0x7a,0x44,0xe2,0x1, 0xc2,0xff,0xfa,0x23,0x7f,0x64,0xc2,0x81,0xf0,0x0, +0x14,0x80,0xe8,0x0, 0x93,0x8b,0x93,0xf, 0x3a,0x94,0xf8,0x40,0x3e,0x69,0xf0,0x0, +0x14,0x1, 0x8c,0x4, 0xf0,0x80,0x8e,0x94,0xe8,0x0, 0x8c,0x8e,0xf8,0x80,0x8d,0x1e, +0xe8,0x8, 0x3c,0x2d,0xe8,0x9, 0x3c,0xaa,0x34,0x24,0xd6,0xfd,0x39,0xe8,0x8c,0x14, +0xe8,0x0, 0x8c,0x9e,0xf0,0x8, 0x3e,0xa8,0xf0,0x9, 0x3d,0x29,0x34,0x24,0xd6,0xf3, +0xe0,0xf, 0x39,0xa8,0x16,0x85,0x3e,0x9f,0x17,0x1, 0x3f,0x12,0xe2,0x0, 0xce,0x8b, +0xe2,0x1, 0xc7,0x7f,0xe0,0x62,0x3b,0xae,0x3f,0xf7,0x39,0xef,0x5, 0x5, 0xe0,0x43, +0x3b,0x9f,0xf8,0x40,0x3e,0x68,0x3f,0xf6,0x3, 0x5, 0xe0,0x43,0x3b,0x13,0xf8,0x40, +0x3c,0xe8,0x3a,0x75,0x1, 0xcf,0xf0,0x0, 0x2e,0x8, 0xf0,0x0, 0x2c,0x89,0x3c,0x62, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe8,0x0, 0xb3,0x8b,0x0, 0xf8,0xe0,0x0, 0x1f,0xb6, +0xb3,0xf, 0x0, 0xf6,0x8, 0xb7,0x12,0x0, 0x16,0xff,0xf0,0x0, 0x13,0x9f,0x3e,0x98, +0xf0,0x17,0x3b,0x98,0xc4,0xff,0x3d,0x64,0x3c,0x64,0x3d,0xe4,0xe0,0x40,0x3e,0x64, +0xe0,0x80,0x8f,0x9d,0xe0,0x80,0x8f,0x19,0xe0,0x3, 0x3f,0xbf,0xe0,0x5, 0x3f,0x3e, +0xe0,0x2, 0x3f,0x3f,0xf0,0x40,0x3b,0xfd,0x3e,0x1e,0x3d,0x9f,0x3c,0x15,0x3d,0x13, +0x3a,0x12,0x1, 0xef,0xe0,0x2, 0x36,0x5, 0xe4,0x0, 0xc4,0x64,0xe0,0x0, 0x12,0xe4, +0x3a,0xba,0xe0,0x4, 0x14,0xb5,0xe0,0x6, 0x39,0x32,0xe0,0x3, 0x35,0x85,0xd6,0x9b, +0xe0,0x6, 0x3c,0x26,0xe0,0x4, 0x14,0xb5,0x3c,0x65,0xd6,0x95,0xe0,0x7, 0x39,0xb3, +0x17,0x80,0xe0,0x2f,0x3b,0xf, 0xe0,0x7, 0x3c,0x27,0xe0,0x0, 0x14,0x64,0x2f,0x9b, +0xe0,0x25,0x3b,0x8f,0x2a,0x98,0x3c,0x34,0xe0,0x4, 0x14,0xb5,0x39,0x33,0xd6,0x83, +0xe0,0x2, 0x3c,0x22,0xe0,0x0, 0x14,0x64,0x3c,0x32,0x3c,0xe6,0xd6,0x7c,0x3c,0x32, +0x3c,0xe7,0xe0,0x0, 0xd6,0x79,0xe0,0x43,0x3f,0x98,0xe2,0x0, 0xcf,0x80,0x4, 0x6, +0xe0,0x43,0x3c,0x18,0xe2,0x1, 0xc4,0x7f,0xb, 0xe1,0x3c,0x65,0x0, 0xfa,0x8, 0xb1, +0xea,0x23,0x7f,0xc1,0x8f,0x8f,0xe0,0xe, 0x34,0xa1,0xe0,0xd, 0x35,0x21,0x3f,0x18, +0xc7,0xff,0x3c,0x1d,0x86,0x9e,0x3c,0xff,0x16,0x0, 0x38,0xed,0x85,0x98,0xe0,0x61, +0x39,0xac,0x3e,0x61,0x2d,0x88,0x3c,0xfa,0xb6,0x88,0x1, 0x2, 0xb5,0x8e,0x3c,0xff, +0x1, 0xb, 0x8, 0xe1,0x3c,0xfa,0x1, 0x7c,0x3e,0x9b,0x36,0x81,0xb6,0x88,0x3c,0xff, +0x16,0x80,0xb6,0x8e,0x1, 0xf7,0xb6,0x8, 0x8, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xe1,0xff,0xc0,0xc, 0xea,0x23,0x7b,0xe3,0xea,0x23,0x7e,0x43,0x16,0xa0,0x7e,0x6, +0xc4,0x7e,0xc4,0xfe,0x3e,0x97,0x3f,0xec,0xe0,0x80,0x97,0x18,0xe0,0x80,0xaf,0x17, +0x3e,0xf7,0xe0,0x80,0x97,0x19,0xe0,0x80,0xaf,0x1f,0x1, 0xf7,0xe0,0x1, 0x1f,0xd5, +0x8a,0xf, 0xe0,0x4, 0x22,0x59,0xfa,0x23,0x79,0xe4,0xf8,0x40,0x3c,0x63,0xe0,0x1, +0x1f,0x72,0xf8,0x0, 0x8d,0x88,0x17,0x80,0xf0,0x40,0x3d,0x6e,0x7f,0x9, 0xf0,0xc, +0x35,0xa4,0xe0,0x7, 0x17,0x68,0xf0,0x0, 0x16,0xd3,0xe8,0x40,0x39,0xea,0x7f,0x87, +0xf0,0x40,0x3c,0xef,0x7e,0xb, 0xf0,0x1d,0x3e,0x90,0x7f,0x88,0xf0,0x40,0x3e,0x6f, +0x7f,0x8a,0x13,0x20,0xe0,0x0, 0x7f,0xc, 0xf0,0x40,0x3d,0x67,0xe0,0x0, 0x15,0x44, +0x3c,0xe3,0xe2,0x0, 0x7c,0x34,0xe0,0x0, 0xd8,0x37,0xe0,0x0, 0x1f,0xb6,0xe0,0xff, +0x16,0x7f,0xe0,0x0, 0x1f,0x3a,0xb6,0xf, 0x16,0x33,0x17,0x80,0x15,0x0, 0x3e,0x10, +0xb7,0x8e,0xe8,0x40,0x3d,0xe8,0xe8,0x40,0x3c,0x6d,0x64,0x86,0xf8,0x40,0x3b,0x68, +0xe8,0x40,0x3e,0xeb,0xe8,0x40,0x3a,0xec,0xe8,0x40,0x39,0x6c,0xe8,0x40,0x3b,0xec, +0xf8,0x40,0x3f,0x6c,0x0, 0x83,0xe8,0x80,0x8e,0x96,0xf0,0x80,0x8b,0x9c,0xe3,0xff, +0xc6,0xff,0xf0,0xe, 0x3b,0xad,0xe0,0x43,0x3f,0x9e,0xe8,0xd, 0x3e,0xa7,0xe2,0x0, +0xcf,0x80,0xe0,0x43,0x3e,0x9d,0xe0,0x6f,0x3d,0x2d,0xf0,0x80,0x8b,0x98,0xe0,0x80, +0x8e,0x99,0xe8,0x40,0x3f,0xfe,0xf0,0xe, 0x3b,0xad,0xe0,0x7e,0x3b,0x2f,0xe2,0x0, +0xcf,0x0, 0xe8,0xd, 0x3e,0xa7,0xe0,0x6e,0x3d,0x2d,0xf0,0x40,0x3b,0xee,0xf3,0xff, +0xc3,0xff,0xe3,0xff,0xc7,0xff,0xe8,0xd, 0x3f,0x97,0x3f,0x77,0xe8,0x5, 0x3a,0x97, +0xf0,0x43,0x3b,0x9d,0xe0,0x67,0x3b,0x2e,0xf0,0x40,0x3b,0xfa,0x3f,0x92,0xe0,0x43, +0x39,0x1f,0xe0,0x43,0x3a,0x95,0x3, 0x2, 0x3e,0xea,0xf0,0x40,0x3e,0xfc,0xe0,0x43, +0x3d,0x1d,0x1, 0xc2,0xe8,0x40,0x3e,0x6b,0x17,0x0, 0xe0,0x0, 0x16,0xff,0x0, 0x83, +0xe0,0x80,0x8e,0x1b,0xe4,0xf, 0x36,0x28,0xf0,0x40,0x3b,0xed,0xe4,0x8, 0x37,0xc8, +0xf2,0x1, 0xc3,0xff,0xf0,0x40,0x3b,0xf8,0x3c,0xee,0xe2,0x1, 0xc4,0xff,0x3f,0xe8, +0x5, 0x82,0x3e,0xec,0x3c,0xff,0xe2,0x1, 0xc6,0xff,0x3, 0x82,0x3f,0x6c,0xf0,0x40, +0x3d,0x7b,0xe2,0x1, 0xc7,0x7f,0x1, 0xe5,0xf0,0x2f,0x3f,0x16,0xe0,0x1, 0x27,0xdb, +0xe0,0x2f,0x3b,0x96,0xe0,0x1, 0x27,0xd7,0xf0,0x0, 0xc4,0x81,0xf2,0x1, 0xc4,0xff, +0xf0,0x40,0x3c,0xf4,0xe0,0x0, 0xc1,0xc4,0xe7,0xfe,0x1, 0xea,0xe0,0x9, 0x3f,0x2d, +0x64,0xb, 0xe2,0x1, 0xc4,0xff,0xd5,0x67,0x67,0x88,0x3a,0x68,0xc7,0xff,0x3f,0x6f, +0xe2,0x1, 0xc7,0x7f,0xe0,0x1, 0x17,0xfd,0xe1,0x2f,0x3f,0xae,0xe2,0x1, 0xc2,0x7f, +0xe0,0x2, 0x27,0xc8,0x66,0xa, 0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3e,0x1f,0xe0,0x2, +0x27,0xc1,0x67,0x87,0xeb,0xff,0x79,0x79,0xea,0x23,0x79,0xc2,0x67,0x8, 0xc7,0x81, +0xf0,0x0, 0x66,0x7, 0xaf,0x82,0xaf,0x3, 0xe0,0x0, 0x17,0xc4,0xe8,0xf, 0x3f,0xbc, +0x67,0x9, 0x3f,0x1f,0xe0,0x8, 0x87,0x2e,0xc7,0x4f,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, +0xcf,0x1, 0xe0,0x2, 0x5, 0x9b,0x67,0x8, 0xe2,0x0, 0xcf,0x31,0xe0,0x1, 0x1, 0x7f, +0x67,0x8, 0xe2,0x0, 0xcf,0x50,0xe0,0x2, 0x1, 0x56,0x67,0x88,0xe2,0x0, 0xcf,0xb3, +0xe0,0x1, 0x1, 0x84,0xe2,0x0, 0xca,0x8, 0xe0,0x0, 0x2, 0xfb,0x14,0x80,0x14,0x1e, +0xdd,0xfa,0xe0,0x0, 0x1f,0xb6,0x97,0x8f,0xe3,0xff,0xcf,0xca,0xe0,0x2, 0x3, 0x53, +0xf0,0x1, 0x1a,0xf4,0xf0,0x1, 0x1a,0x53,0xf0,0x1, 0x19,0x7c,0xf0,0x0, 0x18,0x9b, +0xea,0x23,0x7d,0x64,0x12,0x0, 0x17,0x80,0xea,0x23,0x7c,0xc4,0xf0,0x0, 0x13,0x9d, +0xe8,0x0, 0xb7,0x85,0xe8,0x0, 0xb7,0x84,0xf0,0x17,0x3b,0x9a,0xe8,0x0, 0xb7,0x82, +0x3a,0xe4,0xe8,0x0, 0xb7,0x81,0xf0,0x40,0x39,0xe4,0x3c,0x64,0xf0,0x40,0x3b,0x64, +0x3b,0x64,0xf0,0x40,0x3c,0x64,0xf0,0x40,0x38,0x64,0x3e,0xe4,0x13,0x81,0x0, 0x90, +0xe2,0x0, 0xcd,0x80,0xe0,0x43,0x3a,0x9e,0x3a,0x67,0xe0,0xe, 0x3f,0x96,0x4, 0x28, +0xe0,0x43,0x3b,0x1e,0xf0,0x40,0x3b,0x67,0xf0,0x40,0x3b,0xfa,0x1, 0x29,0x8d,0x8a, +0x8f,0x1a,0x8f,0x99,0xf0,0x0, 0x8c,0x89,0x3f,0x2b,0x3e,0x6e,0xe8,0xf, 0x3f,0xa9, +0xe2,0x0, 0xcf,0x0, 0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc6,0x7f,0xc5,0x1, 0xe0,0x43, +0x3d,0x9f,0xc4,0x81,0xe0,0xe, 0x3e,0x15,0x3, 0x5c,0xe2,0x0, 0xcd,0x80,0x3e,0x18, +0xe0,0x43,0x3c,0x1c,0xf0,0x40,0x39,0xe7,0xe0,0xe, 0x3f,0x96,0x3, 0x5a,0x3f,0x9d, +0xe0,0x43,0x3e,0x9f,0xf0,0x40,0x38,0x6d,0xf0,0x40,0x3c,0x67,0x0, 0xd6,0xf0,0x2, +0x2c,0xf, 0xf0,0x0, 0x23,0x4, 0xe8,0x0, 0xb3,0x2, 0xf0,0x0, 0x21,0x84,0xe8,0x0, +0xb4,0x4, 0x22,0x3, 0xe8,0x0, 0xb2,0x85,0xe3,0xff,0xce,0xe3,0x4, 0x6, 0xe0,0x0, +0x17,0xfc,0xaf,0x82,0x17,0x80,0xaf,0x83,0xe0,0x0, 0xc0,0x74,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0x16,0x30,0xf0,0x2f,0x3f,0x1c,0xe7,0xfe,0x2f,0xa8,0xe0,0x2f,0x3b,0x9c, +0xe7,0xfe,0x2f,0xa4,0xe2,0x6, 0xc9,0x0, 0xe7,0xfe,0x2, 0x20,0xeb,0xff,0x7f,0xfa, +0x8f,0x8f,0x16,0xc, 0x3e,0x3f,0x3a,0xfc,0xe7,0xfe,0x2, 0x18,0xe8,0x40,0x3c,0xe8, +0xe2,0x0, 0x7c,0x34,0x7e,0x82,0x7f,0x1, 0x7d,0x3, 0x7f,0x84,0xdd,0xbc,0xea,0x23, +0x7c,0xc4,0x3d,0xe8,0xe2,0x0, 0x7c,0x54,0x7d,0x85,0xdd,0xb5,0x16,0x3b,0xe1,0x29, +0x3e,0x28,0x65,0x85,0x66,0x82,0x67,0x1, 0xe7,0xfe,0x2c,0x80,0xe1,0x2c,0x3e,0x2b, +0xe7,0xfd,0x2e,0x7c,0xe0,0x16,0x3d,0xbb,0xe0,0xc, 0x3c,0x38,0xe0,0x9, 0x3d,0x98, +0xf0,0x8, 0x3b,0x1c,0xd4,0xac,0x3d,0xe8,0xe2,0x1, 0xc5,0xff,0xe2,0x0, 0xcd,0xd9, +0x65,0x3, 0x66,0x82,0x67,0x1, 0x67,0x84,0xe0,0x0, 0x5, 0xd9,0xe0,0x0, 0x16,0x64, +0xf0,0xf, 0x3f,0x17,0x3e,0x2b,0x36,0x21,0x3f,0x9a,0x3f,0x9c,0x66,0xc, 0xe0,0x43, +0x3f,0x9f,0x3f,0xfc,0x3, 0x8, 0xe0,0x0, 0x4e,0x76,0x7f,0x8c,0x7e,0x8, 0x7d,0x8a, +0xf0,0x0, 0x7c,0x87,0xe0,0x0, 0x17,0xc5,0x66,0xa, 0xe1,0x2f,0x3e,0x1f,0xe7,0xfd, +0x27,0xcd,0x66,0x8, 0xe0,0x1, 0x17,0xff,0xe0,0x2f,0x3e,0xf, 0xe7,0xfd,0x27,0xc6, +0x17,0x80,0x7f,0x88,0x7f,0x8a,0xe7,0xfd,0x0, 0xc1,0x66,0x9, 0x3f,0x9c,0xe0,0x8, +0x8f,0xf, 0xe2,0x0, 0xcf,0x5, 0xe7,0xff,0x1, 0x89,0xe0,0x8, 0x8f,0x9f,0xe2,0x1, +0xcf,0xb3,0xe7,0xff,0x1, 0x83,0x14,0x80,0x14,0xa, 0xdc,0xfd,0xe2,0x0, 0xcc,0x2, +0xe7,0xfe,0x2, 0xfc,0xe7,0xfe,0x0, 0xf5,0xea,0x23,0x7f,0x40,0x87,0xe, 0xe2,0x0, +0xcf,0x2, 0xe7,0xfd,0x5, 0x62,0xe0,0x0, 0x17,0x7c,0xaf,0x2, 0xe7,0xfd,0x0, 0xdd, +0xf0,0x0, 0x66,0x7, 0xea,0x23,0x79,0xc2,0xeb,0xff,0x79,0x79,0x8e,0x3, 0xe0,0x0, +0x17,0xfc,0x7e,0x8, 0xaf,0x82,0xe7,0xfd,0x0, 0xc1,0xf2,0x0, 0xcf,0x1f,0xe7,0xff, +0x2, 0x3b,0xe0,0xc, 0x37,0x81,0x3b,0xfc,0xe7,0xff,0x3, 0x36,0xf2,0x0, 0xcf,0xf, +0x5, 0x6, 0xe0,0xc, 0x37,0x82,0x3b,0xfc,0xe7,0xff,0x3, 0x2e,0xe2,0x1, 0xc9,0x7f, +0x2, 0x38,0x14,0x86,0xe0,0x8, 0x37,0xa5,0x7d,0x3, 0x7d,0x85,0x7e,0x82,0x7f,0x1, +0xd3,0xea,0xe0,0x28,0x3c,0x15,0x65,0x3, 0x65,0x85,0x66,0x82,0x67,0x1, 0xe7,0xff, +0x24,0x1b,0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3d,0x9f,0xe7,0xff,0x27,0x95,0xe7,0xfe, +0x0, 0xff,0x14,0x80,0x14,0xa, 0xdc,0xaf,0xe2,0x0, 0xcc,0x6, 0xe7,0xfe,0x2, 0xae, +0xe7,0xfe,0x0, 0xa7,0xe0,0x1, 0x1f,0xf2,0xf0,0x40,0x3e,0x64,0x7f,0x89,0xe7,0xff, +0x0, 0xbb,0xe0,0x0, 0x1e,0xba,0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x96,0x8d, +0x3f,0xae,0x3f,0x9d,0xe2,0x1, 0xcf,0x95,0xe7,0xfd,0x2, 0x24,0xe7,0xfe,0x0, 0x91, +0xe0,0xc, 0x37,0xa2,0xe0,0x2c,0x3a,0xac,0xe7,0xfe,0x2e,0x6e,0xe0,0x2, 0x16,0x54, +0xe0,0x22,0x39,0x1c,0xe7,0xfe,0x29,0x68,0xe7,0xff,0x0, 0xbd,0xf8,0x0, 0xb0,0x1, +0xe7,0xfd,0x0, 0xf1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xf4,0xc0,0x58,0xea,0x23, +0x79,0xc1,0x3a,0x6a,0xeb,0xff,0x79,0x79,0xe2,0x1, 0xc2,0x7f,0x17,0xff,0xaa,0x3, +0xaf,0x82,0xe0,0x0, 0x25,0x62,0x16,0x7f,0x3e,0x1a,0xe3,0xff,0xc6,0x7f,0xc6,0x1, +0x36,0x22,0xe0,0x3, 0x17,0x6a,0xe0,0x7, 0x17,0xca,0x3f,0x10,0x3f,0x90,0x3e,0x18, +0x96,0x88,0xc4,0x4, 0xe0,0x80,0xb6,0x9e,0x3e,0x78,0xe0,0x40,0x96,0x98,0xe0,0x80, +0xb6,0x9f,0x1, 0xf7,0xe2,0x0, 0xca,0x4, 0xe0,0x0, 0x5, 0xc7,0xf0,0x1, 0x94,0x69, +0xf0,0x1, 0x94,0xf9,0xf8,0x40,0x3c,0x79,0xe0,0x0, 0x4, 0x54,0xe8,0x40,0x3c,0xe9, +0xf0,0x2, 0x24,0xa8,0xe8,0x40,0x3c,0x68,0xd3,0x6e,0xeb,0xff,0x7b,0x7a,0xe0,0x0, +0x17,0xc0,0xe0,0x43,0x3a,0x88,0xaf,0x86,0xea,0x23,0x7f,0xc0,0xe2,0x0, 0xca,0x84, +0xaa,0x8f,0xe0,0x0, 0x5, 0x5c,0xe0,0x0, 0x17,0xfd,0xaf,0x82,0x14,0x87,0xe0,0x1, +0x1f,0x82,0xe0,0x1, 0x1f,0x1, 0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x3c,0x4f,0x34,0x21, +0xd3,0x52,0xe8,0x40,0x3c,0x78,0xe0,0x1, 0x5, 0x7d,0xe0,0x0, 0x1f,0xf1,0xe0,0x0, +0x1f,0x72,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x14,0x86,0x3c,0x4f,0xd3,0x88,0xe3,0xff, +0xc4,0x7f,0xf0,0x40,0x3c,0xf8,0xe0,0x1, 0x3, 0x6d,0xe0,0x0, 0x17,0xfd,0xaf,0x82, +0xe0,0x0, 0x16,0xfd,0x0, 0x86,0xe0,0x0, 0x17,0xff,0xaf,0x82,0xe0,0x0, 0x16,0xff, +0xe0,0x1, 0x1f,0xd5,0x17,0x0, 0x87,0x8f,0xaf,0x3, 0x3f,0xfd,0x14,0x0, 0x4, 0x4, +0xea,0x23,0x7f,0xc2,0x8c,0xf, 0xe0,0xb, 0xc0,0x28,0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0xf0,0x7, 0x34,0x21,0xf0,0x1, 0x24,0x5b,0xe8,0x40,0x3c,0xe8,0xe8,0x40,0x3c,0x69, +0xd3,0x1a,0xf0,0x40,0x3c,0xf7,0xe0,0x43,0x3a,0x88,0xeb,0xff,0x7b,0x7a,0xe0,0x1, +0x3, 0x44,0x3c,0xe7,0xf0,0x8, 0x34,0xa7,0xd3,0x52,0xea,0x23,0x7f,0xc0,0xe2,0x0, +0xca,0x84,0xac,0x6, 0xaa,0x8f,0xe7,0xff,0x2, 0x28,0xe0,0x2, 0x1f,0xc7,0xf0,0x0, +0x15,0x1, 0xe0,0x1, 0x9f,0x6f,0xe0,0x1, 0x9e,0xff,0xe2,0x0, 0xcf,0x0, 0xf8,0x40, +0x3d,0xea,0xe0,0x7b,0x39,0xae,0x8b,0x6, 0xe0,0x3, 0x12,0xec,0xe2,0x0, 0xce,0x80, +0xf0,0x7, 0x16,0xcc,0xe0,0x1, 0x9f,0xf, 0x3a,0x90,0xf0,0x1d,0x3e,0x90,0xf0,0x0, +0x9e,0x7f,0x7b,0x2, 0xe0,0x7a,0x39,0xad,0x7f,0x1, 0xe8,0x40,0x3b,0xed,0x3b,0x65, +0xf0,0x0, 0x17,0x0, 0x67,0x81,0x94,0x6, 0xe8,0x40,0x3c,0xeb,0x3c,0x2f,0x34,0x26, +0xd3,0x1e,0x97,0x87,0xe1,0x80,0xb4,0x16,0xe8,0xf, 0x3f,0xac,0x64,0x2, 0xe8,0x40, +0x3c,0xea,0x3c,0x3f,0xd3,0x14,0x15,0x1, 0xe8,0xa, 0x3d,0x1e,0xf0,0x40,0x3f,0x6a, +0xf2,0x1, 0xc7,0x7f,0xe8,0x40,0x3a,0x7e,0xe1,0x80,0xb4,0x17,0x1, 0xe4,0xe0,0x3, +0x53,0x66,0xe0,0x3, 0x4b,0xed,0xf0,0x0, 0x11,0x8c,0xf0,0x1, 0x12,0x7c,0x12,0x1, +0xf0,0x13,0x39,0x90,0xf0,0x14,0x3a,0x10,0xe2,0x1, 0xc3,0x7f,0xe8,0x0, 0xab,0x83, +0xf8,0x40,0x3b,0x6d,0xe8,0x0, 0xab,0x4, 0xf0,0x40,0x3b,0xe5,0x3c,0x64,0xf0,0x40, +0x3a,0xe4,0xf0,0x0, 0x11,0x7, 0xf0,0x0, 0x10,0x83,0x0, 0x8b,0xe8,0x2f,0x3d,0x95, +0x2f,0xaf,0xc4,0x1, 0xe2,0x1, 0xc4,0x7f,0xe8,0x40,0x3c,0x7e,0xe0,0x1, 0x1, 0x23, +0xe8,0x80,0x94,0x97,0xf8,0x80,0x90,0x16,0xe2,0x1, 0xc4,0xff,0xe0,0xd, 0x3c,0xa7, +0xe2,0x1, 0xc6,0xff,0xf2,0x1, 0xc0,0x7f,0xe0,0x43,0x3e,0xd, 0xf0,0xf, 0x38,0x26, +0xe2,0x0, 0xce,0x0, 0xe2,0x1, 0xc7,0xff,0xe0,0x41,0x3e,0xcd,0xe0,0x43,0x3d,0x8f, +0xe0,0x43,0x3e,0x8d,0xe0,0x6c,0x3c,0x2d,0xe0,0x41,0x3f,0xcf,0xe2,0x0, 0xcd,0x80, +0xe0,0x43,0x3f,0x8f,0xe8,0x2d,0x3e,0x15,0xe0,0x6b,0x3c,0x2f,0x26,0xd0,0xe2,0x1, +0xca,0x6c,0xe0,0x1, 0x2, 0xc3,0xe8,0x2f,0x3e,0x12,0x2f,0xad,0xe8,0x2f,0x3d,0x92, +0x2f,0xaa,0xe8,0x2c,0x3e,0x11,0xe0,0x0, 0x2e,0x5d,0xe8,0x2b,0x3d,0x91,0xe0,0x0, +0x2d,0xd9,0xf0,0xd, 0x39,0x94,0xf0,0xf, 0x3a,0x14,0xc2,0x1, 0xac,0x8d,0xe2,0x1, +0xc2,0x7f,0xf0,0x0, 0xa8,0xf, 0xe8,0x40,0x3b,0x60,0x3b,0xe9,0xe7,0xff,0x0, 0xb3, +0x86,0x82,0xe7,0xfe,0x0, 0x9f,0xe7,0xff,0x17,0x80,0xaf,0x86,0xe7,0xfd,0x0, 0xe6, +0x14,0x81,0xf0,0x40,0x3c,0xe9,0xe7,0xfd,0x0, 0xd7,0x13,0x82,0xf0,0x0, 0x14,0x1, +0xe7,0xfe,0x0, 0xa4,0x17,0x81,0x3f,0x94,0xe0,0xb, 0x3b,0x99,0xe8,0xc, 0x3b,0x10, +0xe2,0x1, 0xc7,0xff,0x35,0x81,0x36,0x1, 0x16,0xff,0xf0,0x1b,0x39,0x9f,0xf0,0x1a, +0x3a,0x1f,0x3e,0x9f,0x3b,0x9b,0x3b,0x1c,0xe8,0x0, 0xad,0x8b,0xf0,0x1c,0x39,0x9d, +0xe8,0x0, 0xae,0xa, 0xe0,0xb, 0x33,0x81,0xe8,0xd, 0x3e,0x94,0xe0,0xc, 0x33,0x1, +0xe8,0x0, 0xad,0x8c,0xc7,0x81,0xae,0xd, 0xf0,0xb, 0x39,0x9f,0xe8,0x0, 0x8e,0xb, +0xe8,0x0, 0x8e,0x8a,0x3e,0x19,0xe8,0xd, 0x3e,0x90,0x36,0x1, 0xe8,0xf, 0x3f,0x94, +0x36,0x81,0xc2,0x3, 0xae,0xb, 0xe2,0x1, 0xc2,0x7f,0xae,0x8f,0xe7,0xff,0x0, 0xab, +0xe0,0xd, 0x3b,0x99,0xe8,0xf, 0x3b,0x10,0xf0,0xb, 0x39,0x94,0xf0,0xc, 0x3a,0x14, +0x36,0x81,0x37,0x81,0xc2,0x1, 0xae,0x8b,0xe2,0x1, 0xc2,0x7f,0xaf,0x8c,0xe7,0xff, +0x0, 0x9a,0xe2,0x0, 0xca,0x1, 0xaa,0x3, 0x1, 0x19,0x15,0x7e,0x3d,0x14,0xe2,0x1, +0xc5,0x7f,0x17,0x8c,0x3f,0x90,0xc5,0x1, 0xe0,0x1, 0x16,0xfc,0x3e,0x90,0x3d,0x1f, +0xe0,0x80,0x8d,0x9f,0xe0,0x80,0x8e,0x1d,0x3f,0xfa,0xe0,0x80,0xb5,0x95,0xe8,0x80, +0xb6,0x1d,0x1, 0xf7,0xe2,0x0, 0xca,0x1f,0x2, 0x86,0xe0,0x0, 0x17,0xfe,0xaf,0x82, +0xe7,0xfc,0x0, 0xfe,0x12,0x82,0xf0,0x40,0x3d,0x65,0x3c,0xe4,0xe0,0x8, 0x32,0xa5, +0xd2,0x16,0xe2,0x0, 0xcc,0x2, 0xe8,0x40,0x3b,0x6a,0xe0,0x66,0x3b,0xa8,0x13,0xff, +0x3b,0x95,0xc3,0x7f,0xe2,0x1, 0xc3,0xff,0xe2,0x1, 0xc3,0x7f,0x3c,0xe7,0x3d,0x66, +0xe2,0x3, 0x7c,0x6c,0xdb,0x55,0x3d,0x66,0x3c,0xe7,0xe2,0x7, 0x7c,0x4c,0xc2,0x81, +0xdb,0x4f,0xe2,0x1, 0xc2,0xff,0x3a,0xf4,0x5, 0xe1,0xe2,0x7, 0x7c,0xcc,0xe2,0x3, +0x7c,0x6c,0xdb,0x6c,0xe7,0xfc,0x0, 0xd4,0xaa,0x3, 0xe7,0xff,0x0, 0xb8,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3d,0xe1,0xff,0xc0,0x2c,0x7c,0x3, 0x14,0xc, 0x7c,0x84,0x14,0x9c, +0x3c,0x90,0x3c,0x10,0x7d,0x5, 0x7d,0x86,0xd2,0xff,0x14,0xb0,0x3c,0x90,0xe2,0x0, +0x7c,0x14,0xd2,0xfa,0x67,0x7, 0xe2,0x0, 0xcf,0x1, 0x2, 0x8e,0x67,0x88,0x67,0xd, +0xe2,0x0, 0x7c,0x1c,0xe1,0x2f,0x3f,0x8e,0x7f,0x88,0xd2,0x38,0xe0,0x0, 0xc0,0x54, +0xf8,0x0, 0xe, 0xa8,0xb, 0xe1,0x67,0x8c,0xe2,0x0, 0xcf,0x81,0x2, 0x89,0x67,0xd, +0x67,0x88,0xe2,0x0, 0x7c,0x30,0xe1,0x2f,0x3f,0x8e,0x7f,0x8d,0x0, 0xef,0xe2,0x0, +0xcf,0x4, 0x1, 0x87,0xe2,0x0, 0xcf,0x82,0x1, 0xe2,0xe0,0x2, 0x1c,0x32,0x0, 0xe6, +0xe2,0x0, 0xcf,0x84,0x1, 0x85,0xe2,0x0, 0xcf,0x2, 0x1, 0xea,0x0, 0xf7,0xe2,0x0, +0xcf,0x2, 0x1, 0x55,0xe2,0x0, 0xcf,0x82,0x1, 0x63,0x17,0xa8,0x3f,0x90,0xe0,0xf, +0xe, 0xd, 0x17,0xbc,0x3f,0x90,0xe0,0xf, 0xd, 0xb, 0x17,0x0, 0x3f,0xeb,0xf0,0x0, +0x16,0x0, 0x3d,0xed,0x3b,0xea,0x3c,0x6e,0x3c,0xef,0xe8,0x40,0x3d,0x6c,0xf0,0x40, +0x3c,0xec,0xf0,0x40,0x3e,0xed,0xf0,0x0, 0x14,0x0, 0x7f,0x2, 0x7f,0x81,0xd1,0x92, +0xe8,0x40,0x3d,0x6c,0xe8,0x40,0x3d,0xed,0xf0,0x40,0x3d,0x68,0xf0,0x40,0x3d,0xe9, +0xe8,0x40,0x3c,0x68,0x3c,0xe7,0xd1,0x86,0xf0,0x40,0x3e,0x68,0x3d,0xe7,0xf0,0x40, +0x3e,0xe9,0xe8,0x40,0x3d,0x68,0xe8,0x40,0x3c,0x68,0xe8,0x40,0x3c,0xe9,0xd1,0x7a, +0x67,0x2, 0x67,0x81,0x3b,0x68,0x3b,0xe9,0x3d,0x6e,0x3d,0xef,0xe8,0x40,0x3c,0x68, +0xe8,0x40,0x3c,0xe9,0xd1,0x6f,0xe8,0x9, 0x3c,0x9d,0xe8,0x28,0x3c,0x7c,0xf0,0x40, +0x3e,0x78,0x2, 0x87,0xe0,0x0, 0x1, 0xc8,0xf0,0x40,0x3e,0xf9,0xe0,0x0, 0x5, 0xc4, +0x15,0x1, 0x16,0x80,0xe8,0xd, 0x3e,0x9b,0xe8,0x2c,0x3c,0xfa,0xf0,0x40,0x3d,0x7c, +0x15,0x80,0x2, 0x85,0x1, 0x88,0xf0,0x40,0x3d,0xfd,0x5, 0x85,0xc5,0x81,0x17,0x80, +0xe0,0x2a,0x3d,0x7f,0x17,0x0, 0xe0,0x9, 0x3c,0x17,0xe0,0x28,0x3f,0x76,0x3c,0x9b, +0x67,0xe, 0x67,0x89,0xe0,0x28,0x3c,0x7a,0x3f,0x9e,0x65,0x8d,0x67,0x8, 0xc7,0x84, +0xe1,0x2e,0x3f,0xb, 0xe0,0x3, 0x1d,0xa2,0x7f,0x12,0x15,0x1, 0x7f,0x93,0x17,0x0, +0x3c,0x7b,0x2, 0x9c,0x27,0x2, 0x7f,0x93,0x17,0x0, 0x67,0x93,0xe0,0x3, 0x1d,0xa3, +0x15,0x1, 0x3c,0x7b,0x2, 0xad,0xe2,0x0, 0xce,0x0, 0x3c,0x99,0xe0,0x28,0x3c,0x78, +0x3, 0x4, 0x12,0x81,0x3a,0xc9,0x3c,0xe5,0x3e,0x9d,0xe0,0x2c,0x3e,0x7c,0xc7,0xff, +0x3f,0x6a,0x0, 0xf0,0x15,0x0, 0xe7,0xff,0x0, 0xbe,0x17,0x1, 0x3f,0x59,0x27,0xc, +0xe4,0x6, 0x36,0x2f,0xe0,0x7, 0x36,0x41,0xe0,0xe, 0x36,0xc1,0xeb,0x0, 0xce,0x0, +0x3e,0x47,0xe0,0xd, 0x3b,0x4e,0xe4,0xe, 0x34,0x2f,0xe0,0x3, 0x34,0xc1,0x39,0xce, +0xe0,0x2, 0x34,0x41,0x3c,0x62,0x3c,0xe3,0xc7,0x81,0x3f,0x6a,0x0, 0xca,0x27,0x2, +0x7f,0x93,0xe0,0x1, 0x17,0xff,0x3f,0xd9,0xe2,0x1, 0xcf,0x80,0x1, 0x94,0xe0,0x2, +0x17,0x80,0x3f,0xd9,0x2f,0x90,0x3f,0xec,0x3f,0xcd,0x27,0x8d,0xe0,0x1, 0x16,0x80, +0xe0,0xf, 0x3c,0x9d,0x16,0x0, 0xe0,0x2e,0x3c,0x7c,0x3c,0x6e,0xe7,0xfe,0x17,0x0, +0xe0,0x9, 0x3f,0x5f,0xe0,0x0, 0x17,0xd0,0x3f,0x90,0xe0,0xf, 0xc, 0x19,0x17,0x83, +0xe0,0x0, 0x14,0x44,0x7f,0x91,0x3c,0x10,0xe7,0xfe,0x0, 0x89,0x8, 0xb1,0xc0,0x48, +0x7c,0x1, 0xe2,0x0, 0x7c,0x4, 0x7c,0x82,0xe2,0x0, 0x7c,0x94,0x7d,0x3, 0x7d,0x84, +0xd1,0xeb,0xe2,0x0, 0x7c,0xa8,0xe2,0x0, 0x7c,0xc, 0xd1,0xe6,0x67,0x85,0xe2,0x0, +0xcf,0x81,0x5, 0x8c,0x67,0x8a,0xe2,0x0, 0xcf,0x81,0x5, 0x88,0xe2,0x0, 0x7c,0xa8, +0xe2,0x0, 0x7c,0x14,0xd2,0x30,0xc0,0x38,0x8, 0xe1,0x14,0x7f,0x0, 0xfd,0x8, 0xb1, +0xc0,0x48,0x7c,0x1, 0xe2,0x0, 0x7c,0x4, 0x7c,0x82,0xe2,0x0, 0x7c,0x94,0x7d,0x3, +0x7d,0x84,0xd1,0xca,0xe2,0x0, 0x7c,0xa8,0xe2,0x0, 0x7c,0xc, 0xd1,0xc5,0x67,0x85, +0xe2,0x0, 0xcf,0x81,0x5, 0x8c,0x67,0x8a,0xe2,0x0, 0xcf,0x81,0x5, 0x88,0xe2,0x0, +0x7c,0xa8,0xe2,0x0, 0x7c,0x14,0xd2,0xf, 0xc0,0x38,0x8, 0xe1,0x14,0x1, 0x0, 0xfd, +0x8, 0xb4,0xc0,0x6c,0x17,0x83,0x7f,0x81,0xe4,0xf, 0x34,0x4f,0x7f,0x82,0x2c,0x8, +0x17,0x82,0x7f,0x81,0x14,0x4, 0x3c,0x10,0xd0,0xf1,0xc0,0x14,0xa, 0x61,0xe2,0x0, +0xcc,0x0, 0x3, 0x17,0xeb,0x0, 0xcf,0x80,0x3c,0x7f,0x1, 0x15,0xe0,0x41,0x39,0x48, +0x3c,0x62,0xd0,0xc8,0x11,0x9d,0x39,0x98,0x3d,0x63,0x3c,0xe2,0x14,0x0, 0xd0,0xac, +0x12,0x10,0x15,0x3c,0x3a,0x10,0x3d,0x23,0xe0,0x4, 0xc, 0x19,0x7d,0x3, 0x0, 0xe3, +0x39,0x68,0x0, 0xef,0xeb,0x83,0xcc,0x60,0x14,0x80,0x0, 0xe0,0xe4,0xa, 0x34,0x44, +0xe1,0xf7,0xc5,0x6c,0xe0,0xb, 0x34,0x2c,0x35,0xcb,0xe8,0x0, 0xcd,0xa0,0x6, 0x9, +0xe3,0xff,0xcd,0x6a,0x5, 0x16,0xe0,0x41,0x3d,0x4a,0xe0,0x8, 0x35,0xda,0x38,0x82, +0xe2,0x0, 0xcd,0xa, 0x2, 0x8, 0x35,0xba,0xe0,0x41,0x3d,0xa, 0x34,0xda,0xe0,0x8, +0x3c,0xcb,0x38,0x82,0xea,0xff,0xcd,0x70,0x3c,0x7a,0x2, 0x83,0x14,0x7f,0x38,0x82, +0x14,0x0, 0x38,0x82,0xe0,0xd, 0x3c,0x49,0xe2,0x0, 0xce,0x8f,0x3f,0xe8,0x3f,0x69, +0x2, 0x8a,0xea,0x1b,0x7c,0xa0,0xe9,0xff,0xc4,0xff,0x3c,0x9e,0x37,0xa4,0x3f,0x99, +0x8c,0xf, 0x38,0x82,0x8, 0xb2,0xe2,0x0, 0xcc,0x0, 0x3, 0x18,0xe2,0x0, 0xcc,0x80, +0xe0,0x41,0x3f,0xc8,0x3, 0xb, 0x11,0x1, 0x15,0x0, 0xe0,0x41,0x3c,0xce,0x3c,0x6f, +0xd1,0xe7,0x29,0x3, 0xe0,0x41,0x3c,0x48,0x9, 0x61,0x15,0x0, 0x3c,0x6f,0xd1,0xe0, +0x0, 0xfa,0x15,0x0, 0x9, 0x21,0xe0,0x3, 0x0, 0xdc,0xe2,0x0, 0xcc,0x80,0x3, 0x7a, +0x11,0x0, 0x0, 0xeb,0x8, 0xb2,0xe2,0x0, 0xcc,0x0, 0x3, 0xf, 0xe0,0x41,0x3c,0x48, +0x11,0x1, 0xe2,0x0, 0xcc,0x80,0x3, 0x3, 0xe0,0x41,0x3c,0xc9,0x15,0x1, 0xd1,0xc8, +0x21,0x3, 0xe0,0x41,0x3c,0x48,0x9, 0x61,0x11,0x0, 0x0, 0xf4,0x15,0x0, 0xe0,0x3, +0x0, 0xc0,0xe1,0xff,0x17,0x7f,0x3f,0x59,0xe4,0xd, 0x34,0xc0,0x3f,0xe9,0xe1,0xff, +0x14,0xff,0xe4,0xc, 0x35,0xc0,0x3c,0xdb,0xf0,0x40,0x39,0x6a,0xe0,0xa, 0x3f,0x39, +0x3c,0xbd,0x3f,0x3c,0x3e,0xbc,0xe0,0xc, 0x3f,0x19,0xe4,0xe, 0x35,0x40,0x3f,0x1c, +0x3c,0xfe,0xf0,0x40,0x3a,0x68,0x5, 0x84,0xe2,0x0, 0x16,0x0, 0x3e,0x9c,0xe8,0xf, +0x3f,0xb2,0xe8,0xb, 0x3d,0xb4,0xe4,0xc, 0x37,0x40,0xe3,0xff,0xc5,0x7f,0xe4,0xe, +0x37,0x20,0xe0,0x16,0x3e,0x1d,0xe0,0x17,0x3f,0x1a,0x3f,0x9b,0xe8,0x40,0x3c,0xe7, +0xe8,0x8, 0x3f,0x96,0x38,0x82,0x25,0xd, 0x17,0xa0,0x3f,0xaa,0xe2,0x0, 0xcf,0x80, +0x2, 0x9, 0xe0,0x41,0x3f,0xcf,0x16,0x80,0xe0,0xc, 0x34,0xbf,0x3c,0x6c,0x3c,0xed, +0x38,0x82,0x34,0x3a,0xe0,0xf, 0x34,0xdf,0xe0,0xd, 0x34,0xba,0xe0,0xc, 0x3c,0x4f, +0x0, 0xf6,0xe1,0xff,0x17,0xff,0x3c,0x7f,0x2, 0x91,0xe0,0x2, 0x17,0x80,0xe1,0x2f, +0x3c,0x2f,0x37,0xa3,0x17,0x20,0x3f,0x2f,0xe0,0xf, 0x34,0x5f,0xe0,0x2, 0x1c,0x44, +0x3f,0x98,0x8c,0xf, 0xe0,0x8, 0x3f,0x28,0x38,0x82,0xe0,0x3, 0x1f,0xa4,0x17,0x10, +0x3c,0x7f,0x17,0x98,0xe0,0x6f,0x3d,0xae,0x0, 0xee,0x8, 0xb7,0x17,0x8c,0x3f,0x98, +0xe0,0xf, 0x9, 0x3, 0xa7,0x88,0xa2,0x98,0xe2,0x0, 0xcf,0x81,0x2, 0x9c,0xe0,0xf, +0x31,0x25,0xe4,0xd, 0x31,0x28,0x37,0xcd,0xe0,0xe, 0x31,0xc8,0xea,0x0, 0xc9,0x8, +0x39,0x4f,0xe0,0x3, 0x3e,0xce,0xe0,0xf, 0x17,0xff,0xe0,0x3, 0x1c,0x25,0xe4,0x5, +0x32,0xaf,0x3c,0x52,0xe4,0xf, 0x37,0xa4,0x3c,0x45,0xea,0xff,0xc7,0xf0,0x3c,0x4f, +0x3c,0xe3,0xb, 0xe1,0xe2,0x0, 0xcf,0x84,0xe0,0x1, 0x1, 0xc, 0xe2,0x0, 0xcf,0x82, +0xe0,0x1, 0x1, 0x3, 0x3f,0xe2,0x3f,0xc3,0x27,0xe9,0xa7,0xa8,0xe3,0xf8,0xcf,0x82, +0xe0,0x0, 0x3, 0x49,0xe7,0xf8,0x12,0x2, 0x3a,0x2f,0xe2,0x0, 0xca,0x38,0x2, 0x39, +0x3d,0x64,0x3c,0x62,0x3c,0xe3,0xd1,0x38,0x3b,0x68,0x3b,0xe9,0x3d,0x64,0x14,0x0, +0x14,0x81,0xdf,0x8a,0xc4,0xff,0x17,0x7f,0xe0,0x28,0x3c,0x7e,0xe0,0xf, 0x3c,0x52, +0xe0,0xe, 0x3c,0xd3,0x3f,0xce,0x17,0x0, 0xe1,0x2b,0x3f,0x8e,0x3e,0x66,0xe0,0xd, +0x3b,0xcb,0xe0,0x1, 0x17,0xff,0x3f,0xdd,0xe2,0x1, 0xcf,0x80,0x1, 0x9d,0xe0,0x2, +0x17,0x80,0x3f,0xdd,0x27,0x86,0xe0,0x1, 0xc6,0x80,0x17,0x80,0xe0,0x2c,0x3e,0x7f, +0xe0,0x3, 0x1f,0xa6,0x17,0x1, 0x3f,0xfc,0x17,0x80,0xe0,0x6f,0x3c,0xae,0xe0,0x3, +0x36,0xc8,0xe4,0xe, 0x36,0x28,0x39,0xce,0xe0,0x2, 0x36,0x48,0xe7,0xff,0x0, 0xa7, +0x16,0x0, 0x16,0x80,0x0, 0xdf,0xe0,0x0, 0xc6,0xff,0x17,0x0, 0xe0,0x2c,0x3e,0x7e, +0x0, 0xe8,0xe2,0x7, 0xcf,0xff,0x2, 0x35,0xe0,0x1, 0x17,0x7f,0x3f,0x53,0xe2,0x1, +0xcf,0x0, 0x1, 0x9b,0xe0,0x2, 0x17,0x0, 0x3f,0x53,0x27,0x6, 0xe0,0x1, 0xc1,0x80, +0x17,0x0, 0xe0,0x22,0x39,0x7e,0xe0,0x3, 0x1f,0x27,0x39,0x7e,0x2, 0x91,0xe0,0x7, +0xc7,0xff,0xe4,0xe, 0x31,0x28,0xe0,0xd, 0x31,0xc8,0x3e,0xce,0xe0,0xc, 0x31,0x48, +0x39,0x6c,0x39,0xed,0xe7,0xfe,0x0, 0xfb,0xe0,0x0, 0xc1,0xff,0x0, 0xea,0xe4,0xe, +0x31,0x2f,0xe0,0xd, 0x31,0xc1,0x3e,0xce,0xe0,0xc, 0x31,0x41,0x39,0x6c,0x39,0xed, +0xe0,0x8, 0xc7,0x80,0x0, 0xe7,0x17,0x80,0x11,0x0, 0x11,0x80,0xe7,0xfe,0x0, 0xe7, +0xe0,0xf, 0x17,0xff,0x0, 0xfa,0xe0,0x8, 0xe, 0xd, 0xe0,0x3, 0x1f,0xa8,0xe4,0xb, +0x36,0x44,0xe4,0xa, 0x36,0x4f,0xe2,0xf, 0xc5,0xff,0xbd,0x19,0x3f,0xdc,0x3f,0x6d, +0x2d,0x9f,0xe0,0xd, 0x3f,0xcd,0x2e,0x84,0x17,0x82,0xbf,0x89,0x38,0x82,0xe4,0xb, +0x37,0x48,0xe0,0xc, 0x37,0xa8,0xe0,0xd, 0x37,0x28,0x17,0x83,0xe0,0x3, 0x1f,0x29, +0xbf,0x89,0x3e,0x4b,0xe7,0xf8,0x17,0x82,0x3e,0x9d,0xe0,0x2c,0x3e,0x7c,0x3e,0x7e, +0xc7,0xff,0x5, 0xfb,0xbf,0xa9,0xc4,0x8c,0xe0,0x9, 0xe, 0x1d,0x38,0x82,0xe2,0xf, +0xcd,0xff,0x1, 0x98,0x3f,0xcd,0x2f,0x83,0x17,0x84,0x0, 0xe0,0xea,0x0, 0xcf,0x88, +0x3f,0xdc,0x27,0x82,0x17,0x81,0xe4,0xe, 0x36,0xc8,0xbf,0x89,0xe0,0xf, 0x36,0x28, +0x3f,0xce,0xe0,0x3, 0x1f,0x2a,0x3f,0xde,0xbf,0xb9,0xe0,0xf, 0x36,0xa8,0xbf,0xc9, +0x38,0x82,0xe1,0xf8,0xc5,0x81,0xbd,0xa9,0x3e,0xe9,0x16,0x3, 0xe1,0x80,0xbe,0x3d, +0x37,0xa8,0xe4,0xc, 0x37,0x48,0x3f,0xcc,0xe8,0x20,0xcf,0x80,0x37,0x28,0xbf,0xb9, +0xbf,0x1d,0x38,0x82,0xa7,0x8, 0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xc8,0xa7,0x89, +0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x5, 0xc3,0xe2,0x0, 0xcf,0x4, 0x1, 0x91,0xe2,0x0, +0xcf,0x84,0x1, 0x86,0xa7,0x99,0xa4,0x18,0xe0,0x8, 0x3f,0xa8,0x38,0x82,0xa7,0x98, +0xe2,0x0, 0xcf,0x80,0x14,0x7f,0x17,0x81,0xe0,0x68,0x39,0x2f,0x38,0x82,0xe2,0x0, +0xcf,0x84,0x1, 0x87,0xa7,0x99,0xe2,0x0, 0xcf,0x80,0x14,0x1, 0x17,0xff,0x0, 0xf5, +0xe2,0x0, 0xcf,0x2, 0x1, 0x86,0xe2,0x0, 0xcf,0x82,0x1, 0xf5,0x14,0x0, 0x38,0x82, +0xe2,0x0, 0xcf,0x82,0x1, 0x65,0xa7,0x98,0xa7,0x19,0x3f,0xfe,0x1, 0xe2,0xa6,0xa8, +0xa7,0x29,0x3e,0xfe,0x2, 0x5e,0x4, 0x68,0xc4,0xc, 0xc4,0x8c,0xe0,0x8, 0xe, 0xd, +0xe0,0x9, 0xd, 0xb, 0x3e,0x7a,0x2, 0xd5,0x1, 0x83,0x3e,0xfb,0x2, 0xd2,0x3d,0x7c, +0x2, 0xdb,0x1, 0xe5,0x3d,0xfd,0x2, 0xd8,0x0, 0xe2,0x14,0x1, 0x38,0x82,0x17,0x81, +0x17,0x0, 0xe1,0x2d,0x3c,0x19,0x26,0x84,0xe1,0x2d,0x3f,0x8e,0x2e,0x88,0x17,0x0, +0x2f,0x8c,0xe2,0x0, 0xcd,0x0, 0xe0,0x68,0x39,0x2e,0x38,0x82,0xe2,0x0, 0xcc,0x80, +0x4, 0x77,0x34,0xa1,0x37,0xa1,0x0, 0xee,0x3c,0x79,0x4, 0x83,0x3c,0x29,0x3f,0x4f, +0x37,0xc1,0x34,0xc1,0x0, 0xee,0x25,0xd, 0x17,0xa0,0x3f,0xaa,0xe2,0x0, 0xcf,0x80, +0x2, 0x9, 0xe0,0x41,0x3f,0xcf,0x16,0x0, 0xe0,0xd, 0x34,0x5f,0x3c,0x6c,0x3c,0xed, +0x38,0x82,0xe0,0xc, 0x34,0x5a,0xe0,0xf, 0x34,0x3f,0xe0,0xa, 0x34,0xda,0xe0,0xd, +0x3d,0x4f,0x0, 0xf5,0x3d,0xe8,0xe2,0x0, 0xcd,0x3, 0x5, 0xad,0xe0,0xc, 0x3c,0x49, +0xe2,0x0, 0xc6,0x3, 0x2e,0x28,0xc5,0x7c,0xe0,0xc, 0x35,0x21,0xe2,0x0, 0xc6,0x18, +0xe1,0x80,0xa7,0x99,0x26,0x8, 0xea,0x0, 0xce,0x81,0xe0,0x4a,0xce,0x88,0x3e,0xac, +0x3f,0x6f,0x3e,0x82,0xc5,0x70,0x6, 0x93,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b, +0xe1,0x80,0xa7,0x99,0xe1,0x80,0xbf,0x1b,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b, +0xe1,0x80,0xa7,0x99,0xc5,0x70,0xe1,0x80,0xbf,0x1b,0x6, 0x6f,0xe1,0x80,0xbf,0x9b, +0xe2,0x0, 0xc5,0x3, 0xc5,0x7f,0x6, 0x87,0xe1,0x80,0x86,0x19,0xc5,0x7f,0xe1,0x80, +0xae,0x1b,0x6, 0x7b,0x38,0x82,0x0, 0x0, 0xe2,0x0, 0xcd,0x3, 0x5, 0xb1,0xe2,0x1, +0xc4,0xff,0xe0,0xc, 0x34,0xa8,0x3c,0xcc,0xe4,0xc, 0x34,0xa0,0x3c,0xcc,0xe0,0x41, +0x3e,0x48,0xe2,0x0, 0xc6,0x3, 0xe0,0xb, 0x3e,0x18,0xe0,0xd, 0x3d,0x2c,0x3e,0x6d, +0xe2,0x0, 0xc6,0xc, 0x26,0x7, 0xea,0x0, 0xcf,0x81,0xe0,0x4a,0xcf,0xf8,0x3f,0xac, +0x3f,0x82,0xe1,0xff,0xc6,0xf0,0x6, 0x8b,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b, +0xe1,0x80,0xbc,0x9b,0xc6,0xf0,0xe1,0x80,0xbc,0x9b,0x6, 0x77,0x3d,0x18,0xe0,0xc0, +0xac,0xba,0xac,0x9a,0xac,0xaa,0xac,0x88,0xac,0x98,0xac,0xa8,0x38,0x82,0x3d,0xe8, +0xc5,0x7f,0x6, 0x85,0xe1,0x80,0xac,0x9b,0xc5,0x7f,0x6, 0x7d,0x38,0x82,0xe0,0x2, +0x1f,0xca,0xbc,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x4a,0xe0,0x3, 0x1c,0x2b,0xa7,0x8e, +0x3f,0xb8,0xe0,0x3, 0x1c,0x2c,0x3f,0x98,0xe0,0x3, 0x1c,0x2d,0xbf,0x8e,0x3c,0x5f, +0x38,0x82,0x8, 0xb1,0xe0,0x60,0x3c,0x87,0xea,0x25,0x7f,0xa8,0xe0,0x0, 0x15,0x60, +0x3c,0x6f,0xdf,0x71,0xe0,0x60,0x3c,0x17,0x8, 0xe1,0x0, 0x0, 0x0, 0x0, 0x2, 0xa8, +0x0, 0x0, 0x2, 0xb2,0x0, 0x0, 0x2, 0xbc,0x0, 0x0, 0x2, 0x94,0x0, 0x0, 0x2, 0x9e, +0x0, 0x0, 0x3, 0x3c,0x0, 0x0, 0x3, 0x44,0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x36, +0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x36, +0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x36,0x0, 0x0, 0x3, 0x4a,0x0, 0x0, 0x3, 0x5a, +0x0, 0x0, 0x3, 0x6a,0x0, 0x0, 0x3, 0x6a,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32, +0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32, +0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c, +0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x5, 0x3c,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32, +0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x4, 0x32,0x0, 0x0, 0x6, 0x2a,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x6, 0x14, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0xf8,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0xe0, +0x0, 0x0, 0x5, 0xd2,0x0, 0x0, 0x5, 0xd2,0x0, 0x0, 0x5, 0xc4,0x0, 0x0, 0x5, 0xc4, +0x0, 0x0, 0x5, 0xc4,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0xb2,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x6, 0x6c,0x0, 0x0, 0x6, 0x6c, +0x0, 0x0, 0x6, 0x6c,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x8, 0xb2,0x0, 0x0, 0x6, 0x5e, +0x0, 0x0, 0x6, 0x50,0x0, 0x0, 0x5, 0xa4,0x0, 0x0, 0x5, 0x96,0x0, 0x0, 0x5, 0x72, +0x0, 0x0, 0x5, 0x72,0x0, 0x0, 0x6, 0x7c,0x80,0x0, 0xd, 0x0, 0x80,0x0, 0xc, 0x0, +0x80,0x0, 0xb, 0x0, 0x80,0x0, 0xa, 0x0, 0x80,0x0, 0x9, 0x0, 0x80,0x0, 0x7, 0x0, +0x80,0x0, 0x5, 0x0, 0x80,0x0, 0x4, 0x0, 0x80,0x0, 0x3, 0x0, 0x80,0x0, 0x2, 0x0, +0x80,0x0, 0x1, 0x0, 0x80,0x0, 0x0, 0x0, 0x80,0x1, 0x20,0x0, 0x0, 0x3, 0x86,0x60, +0x0, 0x3, 0x80,0x0, 0x80,0x1, 0x40,0x0, 0x80,0x1, 0x10,0x0, 0x80,0x0, 0x6, 0x0, +0x80,0x0, 0x8, 0x0, 0x50,0x1, 0x32,0x2, 0x0, 0x3, 0xf0,0x4, 0xce,0x5, 0x9c,0x6, +0x84,0x7, 0x81,0x8, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, +0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, +0x2, 0x1, 0x0, 0x2, 0xeb,0xaa,0x8, 0x0, 0x0, 0x2, 0xb8,0xac,0x0, 0x1, 0x6, 0xc, +0x0, 0x1, 0x5, 0xca,0x0, 0x1, 0x5, 0x50,0x0, 0x1, 0x5, 0xca,0x0, 0x1, 0x5, 0xc0, +0x0, 0x1, 0x6, 0x2e,0x0, 0x1, 0x6, 0x24,0x0, 0x1, 0x5, 0x54,0x0, 0x1, 0x6, 0x24, +0x0, 0x1, 0x5, 0xc0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x3, 0x2, 0x1, 0x1, 0x1, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x4, 0x2, 0x2, 0x1, 0x1, 0x1, +0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, +0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, +0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0xd, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0xe, 0x7, 0x4, 0x3, 0x2, 0x2, 0x2, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0xf, 0x7, 0x5, 0x3, 0x3, 0x2, 0x2, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x2, 0x2, 0x3, 0x3, 0x3, 0x3, +0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x4, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, +0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x5, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, +0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, +0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, +0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, +0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, +0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, +0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, +0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7, +0x24,0x87,0x55,0x56,0x72,0x8d,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x31, +0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x0, 0x1, 0x1, 0x12,0x0, 0x20,0x0, 0x12,0x20,0x12,0x20,0x0, 0x0, 0x2, +0x40,0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, 0x1b,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, 0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, +0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, 0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, +0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, 0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, +0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, 0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, +0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, 0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, +0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, 0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, +0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, 0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, +0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, 0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, +0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, 0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, +0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, 0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, +0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, 0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, +0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, 0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, +0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, 0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, +0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, 0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, +0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, 0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, +0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, 0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, +0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, 0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, +0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, 0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, +0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, 0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, +0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, 0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, +0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, 0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, +0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, 0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, +0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, 0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, +0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, 0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, +0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, 0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, +0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, 0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, +0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, 0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, +0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, 0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, +0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, 0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, +0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, 0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, +0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, 0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, +0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, 0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, +0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, 0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, +0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, 0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, +0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, 0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, +0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, 0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, +0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, 0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, +0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, 0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, +0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, 0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, +0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, 0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, +0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, 0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, +0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, 0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, +0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, 0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, +0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, 0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, +0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, 0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, +0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, 0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, +0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, +0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, 0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, +0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, 0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, +0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, 0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, +0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, 0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, +0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, 0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, +0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, 0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, +0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, 0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, +0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, 0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, +0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, 0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, +0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, 0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, +0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, 0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, +0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, 0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, +0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, 0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, +0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, 0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, +0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, 0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, +0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, 0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, +0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, 0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, +0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, 0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, +0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, 0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, +0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, 0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, +0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, 0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, +0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, 0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, +0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, 0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, +0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, 0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, +0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, 0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, +0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, 0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, +0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, 0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, +0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, 0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, +0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, 0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, +0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, 0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, +0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, 0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, +0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, 0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, +0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, 0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, +0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, 0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, +0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, 0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, +0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, 0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, +0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, 0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, +0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, 0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, +0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, 0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, +0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, 0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, +0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, 0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, +0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, 0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, +0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, 0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, +0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, 0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, +0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, 0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, +0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, 0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, +0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, 0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, +0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, 0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, +0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, 0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, +0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, 0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, +0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, 0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, +0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, 0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, +0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, 0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, +0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, 0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, +0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, 0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, +0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, 0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, +0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, 0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, +0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, 0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, +0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, 0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, +0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, 0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, +0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, 0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, +0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, 0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, +0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, 0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, +0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, 0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, +0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, 0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, +0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, 0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, +0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, 0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, +0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, 0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, +0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, 0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, +0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, 0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, +0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, 0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, +0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, +0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, 0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, +0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, 0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, +0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, 0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, +0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, 0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, +0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, 0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, +0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, 0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, +0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, 0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, +0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, 0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, +0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, 0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, +0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, 0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, +0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, 0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, +0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, 0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, +0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, 0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, +0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, 0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, +0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, 0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, +0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, 0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, +0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, 0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, +0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, 0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, +0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, 0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, +0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, 0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, +0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, 0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, +0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, 0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, +0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, 0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, +0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, 0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, +0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, 0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, +0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x17,0x3, 0x5, 0x0, 0xd, 0x17,0x3, 0x5, 0x1, 0x10,0x17,0x3, 0x5, 0x2, 0x10, +0x2, 0x1, 0xa, 0x1e,0x24,0x8, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x0, 0xdc,0x0, 0xdc, +0x0, 0xd2,0x1, 0xf4,0x1, 0x90,0x1, 0x90,0x1, 0x2c,0x1, 0x2c,0xa, 0x0, 0x1, 0x1e, +0x1, 0x1, 0xc, 0x1e,0x3c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x1, 0x0, 0x1, 0x80,0x1, 0x0, +0x6, 0x1, 0xda,0x0, 0x1, 0x0, 0x16,0x1, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0xf9,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0xff,0xff,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xc8,0x5, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40,0x4, 0x0, 0x2, 0xd0, +0x1, 0x68,0x28,0x28,0x1, 0x40,0x1, 0x40,0x0, 0xa0,0x0, 0xa0,0x5, 0xa0,0x2, 0xd0, +0x2e,0x2e,0x1, 0x70,0x1, 0x70,0x0, 0xb4,0x0, 0xb4,0x12,0x0, 0xb4,0x1, 0x68,0x2, +0x1c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x7, 0xa8,0x1, 0x2c,0x0, 0x48,0x0, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2, +0x4, 0x4, 0x6, 0x80,0x0, 0x64,0x7, 0xd0,0x8, 0x5, 0x6, 0x1, 0x2c,0x2, 0x58,0x1, +0x90,0x1f,0x40,0x37,0x1, 0x86,0x1, 0x86,0x0, 0x2, 0x17,0x11,0x12,0x1, 0x2c,0x0, +0xdc,0x3, 0x70,0x1, 0xb8,0x3, 0xa, 0xa, 0x0, 0x50,0x2, 0x80,0x0, 0x50,0x5, 0x50, +0x0, 0x32,0x1, 0x5e,0x1, 0x5e,0x3, 0x20,0x0, 0xc8,0x0, 0x28,0x0, 0x1e,0x0, 0x80, +0x0, 0xb4,0x2, 0xd0,0x0, 0x3c,0x3, 0xe8,0x1, 0x68,0x1, 0x68,0x0, 0x3c,0x3, 0xe8, +0x0, 0x20,0x2, 0xb0,0x0, 0x0, 0x5, 0xa0,0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88, +0x1, 0x2c,0x0, 0x0, 0x0, 0x2, 0x3b,0x8, 0x1, 0x0, 0x4, 0x0, 0x0, 0x5, 0x0, 0x20, +0x1, 0x0, 0x0, 0x0, 0x0, 0x5c,0x5c,0x0, 0x5c,0x5c,0x0, 0x5c,0x5c,0x0, 0x0, 0x0, +0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x0, 0x8b,0x0, 0x0, 0xff,0x0, 0x0, 0x0, +0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x64,0xff,0xff,0xff,0x30,0x0, 0xc, 0xc0, +0x40,0x33,0x2d,0x24,0x1e,0x18,0x10,0xa, 0xa, 0xe, 0x15,0x1e,0x24,0x2b,0x32,0x35, +0x2f,0x28,0x22,0x1a,0x13,0xa, 0x3, 0x0, 0x1, 0x4, 0xa, 0x12,0x1b,0x25,0x2c,0x31, +0x9, 0x0, 0x0, 0x2, 0x4, 0x8, 0xf, 0x19,0x20,0x27,0x2b,0x2d,0x2e,0x2e,0x2e,0x2c, +0x2c,0x2d,0x2e,0x32,0x35,0x3b,0x43,0x4d,0x56,0x5d,0x62,0x67,0x6a,0x6d,0x6e,0x70, +0xda,0xe1,0xff,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, 0x6, 0x4, +0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26,0x2a,0x30, +0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b,0x1f,0x23, +0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48,0x46,0x43, +0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x40,0x39,0x34,0x2f,0x2a,0x24,0x20,0x1b, +0x15,0x10,0xb, 0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x7, 0xa, 0xc, +0x10,0x15,0x19,0x1d,0x22,0x28,0x2d,0x31,0x4, 0x0, 0x0, 0x0, 0x1, 0x4, 0x6, 0x9, +0xd, 0x11,0x16,0x1b,0x21,0x27,0x2c,0x30,0x35,0x3c,0x42,0x46,0x4a,0x51,0x57,0x5b, +0x60,0x63,0x65,0x64,0x61,0x5d,0x59,0x56,0x89,0x65,0x34,0x55,0x0, 0x3, 0x4, 0x6, +0x7, 0x9, 0x9, 0xb, 0xd, 0xf, 0x13,0x16,0x19,0x1d,0x20,0x22,0x26,0x29,0x2b,0x2b, +0x2d,0x2e,0x30,0x31,0x33,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x13,0x19,0x1e,0x22, +0x26,0x29,0x2c,0x31,0x35,0x39,0x3c,0x3e,0x3f,0x3e,0x3b,0x38,0x35,0x32,0x2f,0x2c, +0x28,0x24,0x20,0x1c,0x19,0x16,0x12,0xe, 0xa, 0x6, 0x3, 0x1, 0x97,0xae,0xff,0x55, +0x14,0x1a,0x1f,0x25,0x2a,0x2d,0x2d,0x28,0x24,0x1f,0x1b,0x17,0x12,0xe, 0xc, 0xa, +0x8, 0x8, 0x8, 0x8, 0xa, 0xe, 0x13,0x17,0x1b,0x20,0x26,0x2c,0x32,0x36,0x3c,0x3d, +0x2c,0x2b,0x2a,0x27,0x24,0x21,0x1c,0x1a,0x1a,0x1c,0x1e,0x20,0x25,0x2a,0x2e,0x32, +0x37,0x3b,0x3f,0x43,0x47,0x4c,0x50,0x51,0x53,0x54,0x55,0x56,0x57,0x57,0x57,0x57, +0xdd,0x4, 0x33,0x55,0xe, 0x15,0x1b,0x21,0x26,0x2a,0x30,0x36,0x3a,0x3d,0x3e,0x3d, +0x3a,0x36,0x32,0x2d,0x28,0x1c,0x16,0x10,0xa, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xa, +0x15,0x29,0x39,0x39,0x37,0x35,0x32,0x2f,0x2c,0x29,0x24,0x1e,0x18,0x12,0xd, 0x9, +0x5, 0x1, 0x0, 0x0, 0x0, 0x5, 0x9, 0xe, 0x14,0x1c,0x24,0x2c,0x35,0x3e,0x45,0x4a, +0x4b,0x45,0x3f,0x3f,0xf3,0x41,0x33,0x55,0xa, 0x12,0x1a,0x1e,0x23,0x26,0x25,0x1f, +0x1b,0x12,0xa, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, 0x2, 0x6, 0x11,0x19,0x1d,0x26,0x31, +0x36,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x33,0x2c,0x23,0x1e,0x16,0xe, 0x9, 0x1, +0x1, 0x6, 0x11,0x16,0x1f,0x25,0x2e,0x39,0x3e,0x46,0x49,0x48,0x43,0x3f,0x35,0x2a, +0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa2,0x28,0x33,0x55,0x3, 0xb, 0x10,0x15, +0x1a,0x1e,0x21,0x27,0x29,0x28,0x25,0x20,0x1b,0xe, 0x9, 0x7, 0x5, 0x3, 0x1, 0x0, +0x0, 0x1, 0x3, 0x5, 0x9, 0x16,0x1f,0x29,0x33,0x36,0x36,0x36,0x22,0x20,0x1f,0x1e, +0x1b,0x18,0x15,0xc, 0x7, 0x2, 0x0, 0x0, 0x2, 0xb, 0x10,0x14,0x18,0x1c,0x21,0x2b, +0x2f,0x33,0x37,0x3b,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3b,0x3b,0x6, 0x43,0x33,0x55, +0x4, 0xc, 0x13,0x1a,0x20,0x26,0x2c,0x32,0x34,0x31,0x2b,0x24,0x1b,0x14,0xd, 0x6, +0x3, 0x1, 0x0, 0x0, 0x0, 0x2, 0x7, 0xe, 0x16,0x1d,0x23,0x29,0x30,0x36,0x3d,0x3e, +0x1b,0x1c,0x1d,0x1d,0x1d,0x1c,0x1a,0x16,0x10,0x9, 0x3, 0x0, 0x0, 0x3, 0xa, 0x12, +0x19,0x1f,0x25,0x2c,0x32,0x39,0x3f,0x44,0x47,0x48,0x47,0x46,0x43,0x3f,0x3b,0x3a, +0x7c,0x49,0x33,0x55,0xb, 0x14,0x1b,0x23,0x2e,0x34,0x38,0x39,0x36,0x32,0x2b,0x24, +0x18,0x12,0xd, 0x9, 0x4, 0x2, 0x0, 0x0, 0x2, 0x6, 0xd, 0x13,0x1f,0x25,0x2c,0x33, +0x3e,0x3f,0x3f,0x3f,0x24,0x26,0x26,0x26,0x25,0x22,0x1d,0x16,0xb, 0x5, 0x2, 0x0, +0x2, 0x6, 0xc, 0x13,0x1d,0x23,0x29,0x2f,0x3a,0x40,0x45,0x47,0x49,0x49,0x48,0x46, +0x42,0x41,0x41,0x41,0xd3,0x80,0x33,0x55,0x0, 0x8, 0x10,0x16,0x1d,0x23,0x2b,0x30, +0x32,0x32,0x30,0x2c,0x26,0x1e,0x18,0x11,0xb, 0x9, 0x6, 0x5, 0x4, 0x4, 0x6, 0xa, +0x11,0x19,0x21,0x28,0x2f,0x36,0x3c,0x3f,0x1f,0x21,0x22,0x22,0x21,0x20,0x1d,0x18, +0x12,0xc, 0x6, 0x2, 0x0, 0x0, 0x3, 0x9, 0x12,0x19,0x20,0x26,0x2c,0x34,0x3b,0x41, +0x45,0x48,0x49,0x48,0x46,0x42,0x3e,0x3c,0xdb,0x35,0x33,0x55,0x4, 0xb, 0x13,0x1b, +0x23,0x2a,0x29,0x1f,0x16,0xe, 0x6, 0x2, 0x0, 0x0, 0x3, 0x7, 0x10,0x19,0x22,0x2b, +0x33,0x38,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x2c,0x27,0x21,0x1b, +0x15,0xd, 0x4, 0x0, 0x1, 0x5, 0xc, 0x14,0x1d,0x28,0x32,0x36,0x3d,0x3f,0x3e,0x3c, +0x36,0x2e,0x26,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xb5,0x6c,0x33,0x55, +0x17,0x1c,0x20,0x27,0x2b,0x30,0x39,0x3d,0x3f,0x3d,0x3a,0x35,0x2b,0x25,0x20,0x17, +0x13,0xe, 0x6, 0x3, 0x0, 0x0, 0x2, 0x9, 0xd, 0x11,0x19,0x1a,0x1a,0x1a,0x1a,0x1a, +0xa, 0x11,0x16,0x1d,0x20,0x23,0x23,0x1f,0x1a,0x10,0xb, 0x7, 0x1, 0x0, 0x0, 0x2, +0x4, 0x7, 0x10,0x16,0x21,0x26,0x2b,0x35,0x39,0x3c,0x3f,0x40,0x40,0x40,0x40,0x40, +0x68,0xc0,0x33,0x55,0xa, 0x10,0x1a,0x1e,0x26,0x2c,0x2d,0x2c,0x29,0x20,0x15,0xf, +0x6, 0x3, 0x0, 0x0, 0x0, 0x3, 0x7, 0x10,0x1c,0x22,0x2d,0x37,0x3c,0x3f,0x3f,0x3f, +0x3f,0x3f,0x3f,0x3f,0x2b,0x29,0x24,0x21,0x1a,0x12,0xe, 0x5, 0x2, 0x0, 0x1, 0x3, +0xb, 0x10,0x1a,0x25,0x29,0x32,0x36,0x3d,0x3f,0x3e,0x3a,0x33,0x2e,0x29,0x29,0x29, +0x29,0x29,0x29,0x29,0x1e,0x4d,0x33,0x55,0x0, 0x1, 0x3, 0x5, 0x6, 0x8, 0xb, 0xd, +0x11,0x13,0x16,0x16,0x1a,0x1f,0x21,0x24,0x26,0x28,0x2a,0x2f,0x35,0x36,0x38,0x39, +0x3a,0x3c,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x42,0x37,0x2d,0x23,0x1d,0x12,0x7, 0x1, +0x9, 0x13,0x1f,0x25,0x31,0x3b,0x36,0x2c,0x20,0x1a,0xf, 0x2, 0x9, 0x11,0x20,0x2d, +0x35,0x40,0x47,0x47,0x47,0x47,0x47,0x47,0xff,0x1f,0x32,0x55,0x0, 0x0, 0x2, 0x3, +0x6, 0x9, 0xc, 0xf, 0x13,0x18,0x1c,0x1d,0x1e,0x1e,0x1e,0x1d,0x1d,0x23,0x26,0x2a, +0x2d,0x32,0x38,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3a,0x3a,0x3a,0x40,0x35,0x2f,0x28, +0x21,0x1a,0x13,0xd, 0x7, 0x1, 0x4, 0xb, 0x11,0x17,0x1d,0x24,0x2b,0x2a,0x22,0x1c, +0x15,0xf, 0x8, 0x3, 0x8, 0xf, 0x16,0x1d,0x23,0x29,0x31,0x32,0xa5,0xf2,0x32,0x55, +0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6, 0xe, 0x13,0x16,0x18,0x1b,0x1e,0x1e,0x1e, +0x1f,0x1f,0x21,0x24,0x2c,0x30,0x35,0x3a,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x40,0x39,0x30,0x27,0x22,0x19,0x10,0xd, 0x13,0x1c,0x25,0x2a,0x33,0x32,0x2d,0x23, +0x18,0x12,0x9, 0x1, 0x3, 0x9, 0x13,0x1e,0x23,0x26,0x26,0x26,0x26,0x26,0x26,0x26, +0x7b,0x12,0x32,0x55,0x19,0x14,0x11,0xc, 0x9, 0x5, 0x2, 0x0, 0x4, 0x9, 0xd, 0x11, +0x1b,0x20,0x22,0x23,0x23,0x23,0x26,0x27,0x2a,0x2d,0x30,0x37,0x39,0x3c,0x3d,0x3f, +0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x10,0x1d,0x23,0x2e,0x36,0x3d,0x35,0x27,0x1e,0x16, +0xe, 0x14,0x21,0x28,0x34,0x39,0x30,0x29,0x1d,0x16,0x10,0x16,0x1d,0x2c,0x34,0x3f, +0x3f,0x3f,0x3f,0x3f,0xe1,0xb1,0x32,0x55,0xb, 0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, +0x5, 0xf, 0x13,0x17,0x1b,0x1e,0x21,0x20,0x1d,0x19,0x17,0x16,0x16,0x19,0x1e,0x23, +0x28,0x31,0x35,0x39,0x3c,0x3f,0x3f,0x3f,0x40,0x3a,0x35,0x30,0x2b,0x25,0x20,0x1b, +0x17,0x16,0x1a,0x1e,0x23,0x27,0x2a,0x27,0x22,0x17,0x12,0xd, 0x8, 0x4, 0x1, 0x0, +0x0, 0x7, 0xb, 0xf, 0x13,0x15,0x15,0x15,0x4b,0xbb,0x32,0x55,0x0, 0x3, 0x8, 0xa, +0x11,0x14,0x1c,0x20,0x24,0x25,0x25,0x24,0x23,0x25,0x27,0x2d,0x30,0x36,0x3b,0x3f, +0x3f,0x3f,0x3f,0x3e,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x29,0x22,0x18,0x12, +0x8, 0x4, 0x0, 0x1, 0xc, 0x12,0x1c,0x22,0x2b,0x2a,0x24,0x18,0x12,0xa, 0x8, 0xf, +0x14,0x1e,0x23,0x2e,0x34,0x3d,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0xc6,0x28,0x32,0x55, +0x1f,0x1b,0x17,0x14,0x13,0x12,0x11,0x11,0x12,0x14,0x1a,0x1d,0x21,0x23,0x24,0x24, +0x25,0x24,0x24,0x23,0x21,0x21,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1a,0x1d,0x23,0x29,0x2c,0x34,0x3b,0x3e,0x47,0x4e,0x53,0x51,0x4b,0x44,0x42,0x3c, +0x35,0x32,0x2c,0x25,0x1e,0x1c,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19, +0xfa,0xf6,0x30,0x55,0x23,0x1e,0x1c,0x1a,0x18,0x17,0x16,0x15,0x15,0x14,0x14,0x14, +0x14,0x16,0x19,0x1d,0x21,0x25,0x28,0x2a,0x2b,0x2c,0x2d,0x2d,0x2c,0x2b,0x2a,0x29, +0x28,0x27,0x27,0x27,0x2f,0x36,0x3a,0x3e,0x43,0x48,0x4d,0x52,0x56,0x5b,0x60,0x65, +0x6a,0x6e,0x71,0x72,0x72,0x70,0x6c,0x67,0x62,0x5d,0x57,0x51,0x4c,0x47,0x43,0x3e, +0x38,0x34,0x31,0x31,0xe4,0xae,0x30,0x55,0x7, 0x5, 0x4, 0x4, 0x5, 0x6, 0xd, 0x14, +0x1c,0x22,0x28,0x2f,0x34,0x37,0x39,0x3a,0x39,0x38,0x36,0x32,0x2c,0x26,0x1a,0x14, +0xe, 0xb, 0x8, 0x6, 0x6, 0x5, 0x5, 0x5, 0x33,0x3d,0x43,0x4b,0x51,0x58,0x64,0x69, +0x68,0x65,0x61,0x55,0x4d,0x43,0x3b,0x32,0x22,0x1a,0x13,0xb, 0x7, 0x5, 0x8, 0xf, +0x16,0x1e,0x24,0x30,0x37,0x3c,0x3c,0x3c,0x71,0x75,0x30,0x55,0x3, 0x0, 0x0, 0x0, +0x0, 0x3, 0x7, 0xe, 0x1b,0x22,0x2d,0x32,0x37,0x3a,0x3c,0x3d,0x3c,0x3a,0x38,0x34, +0x29,0x21,0x15,0xc, 0x7, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2a,0x34,0x3c,0x47, +0x4d,0x59,0x60,0x66,0x67,0x66,0x5e,0x58,0x51,0x45,0x3e,0x30,0x29,0x22,0x17,0xf, +0x5, 0x3, 0x6, 0xb, 0x11,0x1b,0x21,0x2d,0x2e,0x2e,0x2e,0x2e,0x6a,0x73,0x30,0x55, +0xc, 0x5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5, 0xc, 0x13,0x1e,0x25,0x30,0x35,0x3b, +0x3d,0x3f,0x3f,0x3d,0x3c,0x38,0x33,0x28,0x22,0x18,0x12,0xe, 0xd, 0xd, 0xd, 0xd, +0x11,0x19,0x1f,0x2a,0x30,0x3c,0x42,0x4f,0x55,0x5f,0x63,0x64,0x61,0x59,0x51,0x44, +0x3d,0x2e,0x26,0x1c,0x16,0xa, 0x3, 0x0, 0x0, 0x4, 0x8, 0xe, 0xf, 0xf, 0xf, 0xf, +0x7d,0xd0,0x30,0x55,0x15,0xd, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x8, 0xf, +0x17,0x1f,0x2d,0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3e,0x3a,0x32,0x2c,0x26,0x20,0x19, +0xf, 0xc, 0xc, 0xc, 0x3, 0x9, 0xf, 0x17,0x1e,0x28,0x2e,0x35,0x3b,0x42,0x50,0x56, +0x57,0x56,0x50,0x49,0x41,0x39,0x31,0x25,0x1e,0x17,0xf, 0x5, 0x1, 0x0, 0x0, 0x1, +0x7, 0x9, 0x9, 0x9, 0xca,0xac,0x30,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, +0x0, 0x0, 0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40, +0x3f,0x3e,0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14, +0x1b,0x21,0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26, +0x20,0x1c,0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55,0x21,0x13,0xc, 0x8, +0x5, 0x2, 0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d, +0x3e,0x3f,0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14, +0x1a,0x22,0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31, +0x2b,0x25,0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55, +0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, +0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e,0x3f,0x3f, +0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25,0x2c,0x35, +0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25,0x1f,0x1c, +0xf9,0xa2,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x3e,0x3d,0x3a,0x35, +0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x1, 0x4, 0x8, 0xd, +0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29,0x22,0x1b,0x15,0x10,0xa, 0x5, +0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c,0x24,0x2a,0x30,0x35,0x3b,0x40, +0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, 0x4, 0x7, 0xa, 0x10,0x17,0x21, +0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b,0x38,0x31,0x29,0x21,0x18,0xf, +0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35,0x3d,0x45,0x4b,0x51,0x53,0x52, +0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17,0x11,0x9, 0x3, 0x0, 0x0, 0x2, +0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6,0x30,0x55,0x7, 0x3, 0x3, 0x3, +0x4, 0x7, 0xf, 0x17,0x20,0x28,0x30,0x36,0x3b,0x3d,0x3f,0x3f,0x3d,0x39,0x36,0x2d, +0x25,0x1d,0x16,0xd, 0x8, 0x2, 0x0, 0x0, 0x1, 0x2, 0x3, 0x5, 0x2e,0x3f,0x48,0x50, +0x59,0x5f,0x67,0x68,0x63,0x5d,0x52,0x4a,0x3e,0x35,0x2b,0x20,0x18,0x10,0xa, 0x3, +0x0, 0x0, 0x1, 0x7, 0xe, 0x19,0x22,0x2b,0x31,0x3a,0x42,0x47,0xef,0xc9,0x30,0x55, +0x37,0x38,0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, +0x2, 0x5, 0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e, +0x30,0x40,0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20, +0x1a,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c, +0x37,0xc3,0x57,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, +0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40, +0x3f,0x3f,0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53, +0x4a,0x40,0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21, +0x2a,0x32,0x39,0x3e,0x7, 0x90,0x57,0x55,0x18,0x2c,0x34,0x39,0x3c,0x3d,0x3f,0x3f, +0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, 0x6, 0x1, 0x0, 0x0, 0x0, 0x1, +0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, 0x8, 0xe, 0x14,0x1a,0x21,0x28, +0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58,0x51,0x48,0x3f,0x38,0x31,0x2b, +0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf,0x57,0x55,0x16,0x7, 0x2, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28,0x30,0x38,0x3c,0x3e,0x3f,0x40, +0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16,0xf, 0xc, 0x53,0x46,0x3e,0x35, +0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, 0x13,0x1a,0x20,0x27, +0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a,0x58,0x57,0xc6,0x55,0x57,0x55, +0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38,0x3c,0x3e,0x3f,0x3e,0x3d,0x3b, +0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, +0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17,0x20,0x2a,0x32,0x3b, +0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57,0x4f,0x47,0x40,0x38,0x32,0x2f, +0x1a,0xb5,0x57,0x55,0x0, 0xb, 0x14,0x1b,0x21,0x28,0x2f,0x37,0x3d,0x3f,0x3e,0x3c, +0x39,0x33,0x2b,0x23,0x1c,0x15,0xc, 0x5, 0x3, 0x3, 0x6, 0x9, 0xd, 0x12,0x18,0x1e, +0x24,0x2c,0x33,0x36,0x19,0x13,0x10,0x10,0xf, 0xf, 0x11,0x16,0x1c,0x25,0x2d,0x33, +0x39,0x40,0x47,0x4a,0x4c,0x4c,0x49,0x43,0x3b,0x33,0x2d,0x26,0x20,0x1a,0x14,0xe, +0xa, 0x5, 0x1, 0x0, 0xb0,0xb5,0x57,0x55,0x2, 0x9, 0xf, 0x1a,0x1f,0x29,0x2f,0x38, +0x3b,0x3e,0x3f,0x3f,0x3b,0x37,0x2e,0x29,0x1e,0x18,0xe, 0xa, 0x3, 0x1, 0x0, 0x0, +0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x3, 0x5, 0x9, 0xd, 0x18, +0x1e,0x27,0x2d,0x32,0x3c,0x3f,0x45,0x46,0x45,0x44,0x3e,0x39,0x2f,0x2a,0x25,0x1a, +0x14,0xc, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x2b,0x77,0x57,0x55,0x0, 0x1, 0x2, 0x4, +0x5, 0x8, 0xa, 0xf, 0x12,0x15,0x18,0x1a,0x1f,0x22,0x24,0x25,0x26,0x26,0x28,0x2a, +0x2c,0x2f,0x33,0x36,0x37,0x39,0x3a,0x3c,0x3e,0x3f,0x3f,0x3f,0x1, 0xf, 0x1b,0x2d, +0x3d,0x52,0x5f,0x6a,0x60,0x4a,0x39,0x2a,0x17,0xb, 0x4, 0xe, 0x1e,0x2e,0x42,0x50, +0x62,0x6b,0x65,0x53,0x43,0x31,0x23,0x13,0x7, 0x2, 0x2, 0x2, 0xa2,0x22,0x31,0x55, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x6, 0xa, 0xe, 0x12,0x15,0x18,0x1a, +0x1e,0x21,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x29,0x2f,0x34,0x3a,0x3e,0x3e,0x3e, +0x1, 0xa, 0x11,0x17,0x1e,0x24,0x29,0x2e,0x34,0x34,0x2d,0x24,0x1c,0x14,0xe, 0x8, +0x3, 0x9, 0x10,0x19,0x22,0x2a,0x31,0x36,0x3b,0x38,0x2f,0x24,0x19,0x11,0x11,0x11, +0x4c,0x9f,0x31,0x55,0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0xa, 0xc, 0x10,0x15,0x19, +0x1b,0x1f,0x1e,0x1e,0x1d,0x1c,0x1c,0x1e,0x21,0x29,0x31,0x3a,0x3e,0x3f,0x3f,0x3f, +0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x14,0x1d,0x23,0x2d,0x34,0x2d,0x29,0x1e,0x13,0xb, +0x6, 0x6, 0x10,0x19,0x1e,0x29,0x32,0x3c,0x3e,0x34,0x28,0x1b,0x14,0x12,0x12,0x12, +0x12,0x12,0x12,0x12,0xef,0x5, 0x31,0x55,0x0, 0x2, 0x4, 0x5, 0x6, 0x7, 0x9, 0xa, +0xd, 0xf, 0x11,0x12,0x14,0x16,0x19,0x1c,0x1f,0x22,0x24,0x24,0x26,0x29,0x2f,0x31, +0x33,0x35,0x37,0x39,0x3a,0x3c,0x3e,0x3e,0x6, 0x10,0x17,0x1d,0x23,0x2a,0x31,0x39, +0x3c,0x36,0x2f,0x28,0x21,0x1a,0x13,0x10,0x16,0x22,0x29,0x2f,0x36,0x3d,0x3b,0x34, +0x2e,0x27,0x21,0x1a,0x13,0xc, 0x4, 0x2, 0x56,0x3f,0x31,0x55,0x0, 0x2, 0x5, 0x7, +0xa, 0xc, 0xe, 0x14,0x17,0x1b,0x1f,0x25,0x27,0x28,0x28,0x29,0x29,0x2d,0x30,0x33, +0x36,0x39,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x8, 0xf, 0x18,0x23, +0x2d,0x37,0x40,0x41,0x3d,0x34,0x2b,0x24,0x2d,0x35,0x3e,0x47,0x4a,0x42,0x38,0x2c, +0x20,0x15,0xb, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0xf6,0x5, 0x31,0x55, +0x0, 0x1, 0x3, 0x5, 0x6, 0x7, 0x9, 0xa, 0xc, 0xd, 0xf, 0x13,0x14,0x15,0x18,0x1a, +0x21,0x25,0x26,0x27,0x27,0x27,0x2c,0x2f,0x36,0x3a,0x3d,0x3f,0x3f,0x3f,0x3f,0x3f, +0x0, 0x6, 0xb, 0x14,0x1a,0x1f,0x29,0x2e,0x37,0x3b,0x3e,0x37,0x32,0x2e,0x25,0x20, +0x18,0x1c,0x21,0x29,0x2d,0x31,0x33,0x2d,0x21,0x1b,0x15,0x10,0x10,0x10,0x10,0x10, +0x22,0x55,0x31,0x55,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x7, 0xc, 0x10,0x13,0x16, +0x19,0x1b,0x1f,0x22,0x22,0x23,0x23,0x23,0x23,0x26,0x2c,0x31,0x34,0x36,0x38,0x3a, +0x3b,0x3d,0x3f,0x3f,0xa, 0x12,0x1b,0x24,0x2d,0x34,0x3c,0x43,0x42,0x3b,0x33,0x2b, +0x22,0x1c,0x15,0x15,0x1b,0x26,0x2d,0x34,0x3a,0x41,0x41,0x3b,0x33,0x2b,0x22,0x1a, +0x11,0xa, 0x2, 0x1, 0xfa,0x31,0x31,0x55,0x2, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x6, +0xa, 0x12,0x15,0x1b,0x1d,0x1f,0x1e,0x1e,0x1d,0x1d,0x1d,0x1f,0x23,0x2a,0x2f,0x36, +0x39,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x0, 0x8, 0xe, 0x19,0x1e,0x29,0x2e,0x30, +0x2d,0x23,0x1d,0x13,0xe, 0x13,0x17,0x21,0x25,0x30,0x35,0x3e,0x3f,0x3a,0x35,0x2b, +0x27,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xc8,0x46,0x31,0x55,0x0, 0x3, 0x5, 0xc, +0x11,0x18,0x1c,0x1f,0x1f,0x1e,0x1e,0x1d,0x1d,0x23,0x26,0x2e,0x32,0x3b,0x3d,0x3f, +0x3f,0x3f,0x40,0x40,0x3f,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x1e,0x25,0x29,0x31, +0x36,0x3d,0x3f,0x39,0x35,0x2c,0x27,0x1c,0x17,0x1b,0x1f,0x2a,0x2f,0x37,0x34,0x2b, +0x27,0x1f,0x1b,0x11,0xc, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x5, 0xb3,0x31,0x55, +0x1, 0x3, 0x0, 0x0, 0x0, 0x2, 0xc2,0xfc,0x2, 0xff,0x40,0x0, 0x0, 0x0, 0x0, 0x1, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x51,0x0, +0x0, 0x2, 0x50,0xf9,0x0, 0x2, 0x50,0xf8,0x0, 0x2, 0x4f,0x47,0x0, 0x2, 0x50,0xf4, +0x0, 0x2, 0x50,0xf5,0x0, 0x2, 0x4f,0xc0,0x0, 0x2, 0x50,0xed,0x0, 0x2, 0x50,0xec, +0x0, 0x2, 0x51,0x1, 0x0, 0x2, 0x51,0x2, 0x0, 0x2, 0x4f,0x44,0x0, 0x2, 0x1b,0x50, +0x0, 0x2, 0x2c,0xff,0x0, 0x0, 0x3a,0x9c,0x0, 0x2, 0xc2,0xe0,0x0, 0x2, 0xbb,0x6c, +0x0, 0x2, 0x2d,0x0, 0x0, 0x2, 0x2c,0xfe,0x0, 0x2, 0x3b,0x2, 0x0, 0x2, 0x34,0xb0, +0x0, 0x2, 0x2e,0x60,0x0, 0x2, 0x34,0xb2,0x0, 0x2, 0x23,0x12,0x0, 0x2, 0xc6,0xe4, +0x0, 0x2, 0x24,0xd2,0x0, 0x2, 0x24,0xd4,0x0, 0x2, 0x23,0x22,0x0, 0x2, 0x23,0xa, +0x0, 0x2, 0x24,0x74,0x0, 0x2, 0x23,0xf, 0x0, 0x1, 0x28,0x40,0x0, 0x2, 0x24,0x75, +0x0, 0x2, 0x24,0xce,0x0, 0x2, 0x4e,0xfc,0x0, 0x0, 0x3b,0x6e,0x0, 0x0, 0x3b,0x60, +0x0, 0x2, 0x24,0x79,0x0, 0x1, 0x28,0x6c,0x0, 0x2, 0x23,0x54,0x0, 0x2, 0x4e,0x10, +0x0, 0x1, 0x28,0x54,0x0, 0x2, 0x2c,0xa2,0x0, 0x2, 0xe, 0x56,0x0, 0x1, 0x28,0x44, +0x0, 0x2, 0xbc,0x6c,0x0, 0x1, 0x28,0x74,0x0, 0x2, 0xe, 0x78,0x0, 0x2, 0x3b,0x4, +0x0, 0x0, 0x3a,0x90,0x0, 0x2, 0xe, 0x4c,0x0, 0x2, 0xc6,0xe6,0x0, 0x2, 0x23,0x27, +0x0, 0x2, 0x24,0x87,0x0, 0x2, 0xbb,0xac,0x0, 0x2, 0xc6,0xe8,0x0, 0x2, 0x2c,0xa0, +0x0, 0x2, 0xe, 0x29,0x0, 0x2, 0xe, 0x28,0x0, 0x2, 0xe, 0x2d,0x0, 0x2, 0xe, 0x2c, +0x0, 0x2, 0xe, 0x2f,0x0, 0x2, 0xe, 0x2e,0x0, 0x2, 0xe, 0x2b,0x0, 0x2, 0xe, 0x2a, +0x0, 0x2, 0xe, 0x41,0x0, 0x2, 0xe, 0x40,0x0, 0x2, 0xe, 0x35,0x0, 0x2, 0xe, 0x34, +0x0, 0x2, 0xe, 0x36,0x0, 0x2, 0xe, 0x37,0x0, 0x2, 0xe, 0x31,0x0, 0x2, 0xe, 0x30, +0x0, 0x2, 0xe, 0x33,0x0, 0x2, 0xe, 0x32,0x0, 0x2, 0xe, 0x27,0x0, 0x2, 0xe, 0x25, +0x0, 0x2, 0xe, 0x45,0x0, 0x2, 0xe, 0x44,0x0, 0x2, 0xe, 0x43,0x0, 0x2, 0xe, 0x42, +0x0, 0x2, 0xe, 0x47,0x0, 0x2, 0xe, 0x46,0x0, 0x2, 0xe, 0xf, 0x0, 0x2, 0xe, 0x21, +0x0, 0x2, 0xe, 0x20,0x0, 0x2, 0xe, 0xe, 0x0, 0x2, 0xe, 0x19,0x0, 0x2, 0xe, 0x1d, +0x0, 0x2, 0xe, 0x18,0x0, 0x2, 0xe, 0x1c,0x0, 0x2, 0xe, 0x17,0x0, 0x2, 0xe, 0x16, +0x0, 0x2, 0xe, 0x15,0x0, 0x2, 0xe, 0x14,0x0, 0x2, 0xe, 0x13,0x0, 0x2, 0xe, 0x12, +0x0, 0x2, 0xe, 0x11,0x0, 0x2, 0xe, 0x10,0x0, 0x2, 0xd, 0xc1,0x0, 0x2, 0xd, 0xc0, +0x0, 0x2, 0xd, 0xb9,0x0, 0x2, 0xd, 0xbd,0x0, 0x2, 0xd, 0xbc,0x0, 0x2, 0xd, 0xbf, +0x0, 0x2, 0xd, 0xbe,0x0, 0x2, 0xd, 0xb7,0x0, 0x2, 0xd, 0xa5,0x0, 0x2, 0xd, 0xb6, +0x0, 0x2, 0xd, 0xa4,0x0, 0x2, 0xd, 0xb4,0x0, 0x2, 0xd, 0xb5,0x0, 0x2, 0xd, 0xb8, +0x0, 0x2, 0xd, 0xbb,0x0, 0x2, 0xd, 0xba,0x0, 0x2, 0xd, 0xb3,0x0, 0x2, 0xd, 0xb2, +0x0, 0x2, 0xd, 0xaf,0x0, 0x2, 0xd, 0xae,0x0, 0x2, 0xd, 0xab,0x0, 0x2, 0xd, 0xb1, +0x0, 0x2, 0xd, 0xb0,0x0, 0x2, 0xd, 0xa9,0x0, 0x2, 0xd, 0xa8,0x0, 0x2, 0xd, 0xa3, +0x0, 0x2, 0xd, 0xa2,0x0, 0x2, 0xd, 0xa7,0x0, 0x2, 0xd, 0xa6,0x0, 0x2, 0xd, 0xaa, +0x0, 0x2, 0xd, 0xad,0x0, 0x2, 0xd, 0xac,0x0, 0x2, 0xd, 0x37,0x0, 0x2, 0xd, 0x36, +0x0, 0x2, 0xd, 0x33,0x0, 0x2, 0xd, 0x32,0x0, 0x2, 0xd, 0x29,0x0, 0x2, 0xd, 0x28, +0x0, 0x2, 0xd, 0x2d,0x0, 0x2, 0xd, 0x2b,0x0, 0x2, 0xd, 0x2c,0x0, 0x2, 0xd, 0x2a, +0x0, 0x2, 0xd, 0x31,0x0, 0x2, 0xd, 0x27,0x0, 0x2, 0xd, 0x30,0x0, 0x2, 0xd, 0x26, +0x0, 0x2, 0xd, 0x1c,0x0, 0x2, 0xd, 0x25,0x0, 0x2, 0xd, 0x24,0x0, 0x2, 0xd, 0x1b, +0x0, 0x2, 0xd, 0x38,0x0, 0x2, 0x0, 0x6d,0x0, 0x2, 0xe, 0xc, 0x0, 0x2, 0xe, 0xb, +0x0, 0x2, 0xd, 0x1a,0x0, 0x2, 0xd, 0xa1,0x0, 0x2, 0xd, 0xe3,0x0, 0x2, 0xd, 0xe2, +0x0, 0x2, 0xd, 0xe1,0x0, 0x2, 0xd, 0x23,0x0, 0x2, 0xd, 0x22,0x0, 0x2, 0x0, 0x0, +0x0, 0x2, 0xe, 0x6c,0x0, 0x0, 0x3b,0x7c,0x0, 0x2, 0x23,0x21,0x0, 0x2, 0xc2,0xc8, +0x0, 0x2, 0x23,0x6, 0x0, 0x0, 0x36,0x68,0x0, 0x2, 0x51,0x4, 0x0, 0x2, 0x4e,0x74, +0x0, 0x2, 0x4f,0x0, 0x0, 0x2, 0x51,0x24,0x0, 0x2, 0xa8,0x18,0x0, 0x2, 0xbb,0xb8, +0x0, 0x2, 0xc2,0xf8,0x0, 0x1, 0x28,0x60,0x0, 0x2, 0xa6,0xde,0x0, 0x2, 0x85,0xf8, +0x0, 0x2, 0xa6,0xea,0x0, 0x2, 0xa6,0xe6,0x0, 0x2, 0xa6,0xe2,0x0, 0x2, 0xa6,0xe8, +0x0, 0x2, 0xa6,0xe4,0x0, 0x0, 0x66,0x5e,0x0, 0x2, 0x66,0x5c,0x0, 0x2, 0x60,0xa, +0x0, 0x0, 0xa6,0xb8,0x0, 0x0, 0xa6,0x90,0x0, 0x2, 0x66,0x5e,0x0, 0x2, 0xa5,0x90, +0x0, 0x2, 0xa6,0x8, 0x0, 0x2, 0xa5,0x92,0x0, 0x2, 0x79,0x54,0x0, 0x2, 0xa6,0x84, +0x0, 0x2, 0xa6,0xe0,0x0, 0x2, 0xa6,0x90,0x0, 0x2, 0xa6,0xb8,0x0, 0x0, 0xa6,0xe0, +0x0, 0x2, 0x7f,0xa6,0x0, 0x2, 0x98,0xee,0x0, 0x2, 0x92,0x9c,0x0, 0x2, 0x73,0x2, +0x0, 0x2, 0x6c,0xb0,0x0, 0x2, 0x60,0xc, 0x0, 0x2, 0xa7,0xd3,0x0, 0x2, 0xa7,0xd2, +0x0, 0x2, 0xa6,0x88,0x0, 0x2, 0xa6,0x8c,0x0, 0x0, 0x3b,0x44,0x0, 0x2, 0xc6,0xea, +0x0, 0x2, 0x4e,0xa8,0x0, 0x2, 0xe, 0x84,0x0, 0x2, 0x23,0x2a,0x0, 0x2, 0x41,0x5a, +0x0, 0x2, 0x3b,0x8, 0x0, 0x2, 0x23,0x9, 0x0, 0x2, 0x23,0x3, 0x0, 0x2, 0xb8,0xcc, +0x0, 0x2, 0x24,0x80,0x0, 0x1, 0x28,0x58,0x0, 0x1, 0x28,0x64,0x0, 0x2, 0x4f,0x20, +0x0, 0x2, 0xa8,0x1c,0x0, 0x2, 0xc2,0xe4,0x0, 0x2, 0x23,0x29,0x0, 0x2, 0x47,0xac, +0x0, 0x2, 0xbb,0xf8,0x0, 0x2, 0x23,0x1a,0x0, 0x2, 0x23,0x15,0x0, 0x0, 0x3a,0xaa, +0x0, 0x2, 0x4f,0x3f,0x0, 0x2, 0x4f,0x3e,0x0, 0x2, 0x4f,0x3c,0x0, 0x2, 0xb8,0x68, +0x0, 0x2, 0x24,0x78,0x0, 0x1, 0x28,0x4c,0x0, 0x2, 0xbc,0x70,0x0, 0x2, 0xbc,0x5c, +0x0, 0x2, 0x5f,0x90,0x0, 0x2, 0xe, 0x83,0x0, 0x2, 0xe, 0x88,0x0, 0x0, 0x3d,0x2c, +0x0, 0x2, 0xc6,0xec,0x0, 0x2, 0xc2,0xfc,0x0, 0x2, 0x5f,0xca,0x0, 0x2, 0x5f,0xcc, +0x0, 0x2, 0xbc,0x68,0x0, 0x2, 0xe, 0x54,0x0, 0x2, 0x1b,0x48,0x0, 0x2, 0x23,0x2d, +0x0, 0x2, 0xc6,0xee,0x0, 0x2, 0x2d,0x10,0x0, 0x0, 0xa8,0x78,0x0, 0x2, 0xa8,0x78, +0x0, 0x2, 0x23,0x1e,0x0, 0x2, 0x4f,0x22,0x0, 0x2, 0xb8,0x69,0x0, 0x2, 0x23,0x13, +0x0, 0x2, 0xb7,0xfe,0x0, 0x2, 0xb7,0xf8,0x0, 0x2, 0x24,0xd0,0x0, 0x2, 0x23,0x24, +0x0, 0x2, 0xb8,0x6c,0x0, 0x2, 0xe, 0x5c,0x0, 0x2, 0xbc,0x74,0x0, 0x2, 0xbc,0x72, +0x0, 0x2, 0x23,0xc, 0x0, 0x2, 0xe, 0x58,0x0, 0x2, 0x2c,0xa1,0x0, 0x2, 0x52,0xc2, +0x0, 0x2, 0x52,0xc6,0x0, 0x2, 0x52,0xcf,0x0, 0x2, 0x52,0xce,0x0, 0x2, 0x52,0xc7, +0x0, 0x2, 0x52,0xcc,0x0, 0x2, 0x52,0xcb,0x0, 0x2, 0x52,0xcd,0x0, 0x2, 0x52,0xc8, +0x0, 0x2, 0x52,0xc5,0x0, 0x2, 0x52,0xc9,0x0, 0x2, 0x52,0xca,0x0, 0x2, 0x52,0x70, +0x0, 0x2, 0x51,0xa8,0x0, 0x2, 0x52,0xc, 0x0, 0x2, 0x52,0xc4,0x0, 0x2, 0x52,0xc1, +0x0, 0x2, 0x52,0xc0,0x0, 0x2, 0x51,0x44,0x0, 0x2, 0x24,0x86,0x0, 0x0, 0x3b,0x36, +0x0, 0x2, 0xb8,0xd6,0x0, 0x2, 0x47,0xb0,0x0, 0x1, 0x28,0x5c,0x0, 0x0, 0x3a,0x6c, +0x0, 0x2, 0x1b,0x49,0x0, 0x2, 0xc2,0xdc,0x0, 0x2, 0x23,0x16,0x0, 0x2, 0x23,0xe, +0x0, 0x2, 0x4f,0x24,0x0, 0x2, 0xb8,0xd8,0x0, 0x0, 0x3b,0xac,0x0, 0x2, 0xa7,0xd2, +0x0, 0x2, 0xa7,0xd4,0x0, 0x1, 0x28,0x38,0x0, 0x1, 0x28,0xe4,0x0, 0x2, 0x4e,0xb8, +0x0, 0x2, 0x47,0xb4,0x0, 0x2, 0x5f,0x76,0x0, 0x2, 0x5f,0x7c,0x0, 0x2, 0x5f,0x74, +0x0, 0x2, 0x5f,0x7a,0x0, 0x2, 0x5f,0x78,0x0, 0x2, 0x5f,0x71,0x0, 0x2, 0x5f,0x72, +0x0, 0x2, 0x5f,0x70,0x0, 0x2, 0x59,0x30,0x0, 0x2, 0x52,0xf0,0x0, 0x2, 0x52,0xd4, +0x0, 0x1, 0x28,0x50,0x0, 0x2, 0x4e,0xf8,0x0, 0x1, 0x28,0x7c,0x0, 0x2, 0x5f,0x80, +0x0, 0x1, 0x29,0xf8,0x0, 0x2, 0xb8,0xac,0x0, 0x2, 0xc6,0xd4,0x0, 0x2, 0xc6,0xbc, +0x0, 0x2, 0x47,0xb6,0x0, 0x1, 0x28,0x70,0x0, 0x2, 0x1b,0x54,0x0, 0x2, 0x24,0x68, +0x0, 0x2, 0x23,0x2, 0x0, 0x2, 0xe, 0x68,0x0, 0x2, 0x23,0x28,0x0, 0x0, 0x3a,0x84, +0x0, 0x2, 0xe, 0x52,0x0, 0x2, 0x47,0xb8,0x0, 0x0, 0x3b,0x94,0x0, 0x2, 0x47,0xbc, +0x0, 0x2, 0x23,0x26,0x0, 0x2, 0x2c,0xcc,0x0, 0x2, 0x23,0x18,0x0, 0x2, 0xb8,0xe4, +0x0, 0x2, 0xe, 0x50,0x0, 0x2, 0x47,0xc0,0x0, 0x2, 0x4f,0x28,0x0, 0x2, 0x23,0x20, +0x0, 0x2, 0x4e,0x63,0x0, 0x2, 0x4e,0x62,0x0, 0x2, 0x4e,0x61,0x0, 0x2, 0x4e,0x60, +0x0, 0x2, 0x4e,0x5f,0x0, 0x2, 0x4e,0x5e,0x0, 0x2, 0x4e,0x5d,0x0, 0x2, 0x4e,0x5c, +0x0, 0x2, 0x4e,0x5b,0x0, 0x2, 0x4e,0x5a,0x0, 0x2, 0x4e,0x59,0x0, 0x2, 0x4e,0x58, +0x0, 0x2, 0x4e,0x56,0x0, 0x2, 0x4e,0x48,0x0, 0x2, 0x23,0x1c,0x0, 0x2, 0x60,0x8, +0x0, 0x2, 0x4f,0x3b,0x0, 0x2, 0x4f,0x2c,0x0, 0x1, 0x28,0x80,0x0, 0x2, 0x4a,0xea, +0x0, 0x2, 0x47,0xc4,0x0, 0x2, 0x23,0x2b,0x0, 0x2, 0x24,0x82,0x0, 0x1, 0x28,0x78, +0x0, 0x2, 0x1b,0x4c,0x0, 0x2, 0xb9,0x2, 0x0, 0x2, 0xb9,0x1, 0x0, 0x2, 0xb8,0xf2, +0x0, 0x2, 0xb8,0xf0,0x0, 0x1, 0x28,0x68,0x0, 0x2, 0x2d,0x2, 0x0, 0x2, 0x23,0x8, +0x0, 0x0, 0x3b,0x52,0x0, 0x2, 0x4f,0x2a,0x0, 0x2, 0x23,0x10,0x0, 0x2, 0xbb,0x69, +0xf, 0xff,0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0xc0,0xff,0xff,0x55,0x50,0x47,0x52, +0x41,0x44,0x45,0x20,0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0xa0,0x0, 0x3, 0xff, +0x8, 0x0, 0x0, 0x8, 0x0, 0x82,0x32,0x1, 0x6, 0xc3,0x10,0x4, 0x8, 0x4, 0x8, 0x4, +0x6, 0xc3,0x14,0x5, 0x8, 0x5, 0x8, 0x5, 0x6, 0xc3,0x18,0x6, 0x8, 0x6, 0x8, 0x6, +0x3, 0x28,0x0, 0xfa,0x3, 0x28,0x1, 0x2c,0x40,0x8b,0x80,0x0, 0x3f,0xe9,0x99,0x99, +0x99,0x99,0x99,0x9a,0xfc,0x0, 0xff,0xff,0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff, +0xf8,0x0, 0xff,0xff,0x9f,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xf9,0xff,0xff,0xff, +0xfe,0x7f,0xff,0xff,0xff,0x9f,0xff,0xff,0xff,0xe7,0xff,0xff,0x80,0x1, 0x10,0x20, +0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0x1f,0xff,0xff,0xff,0xf, 0xff,0xff,0xff, +0x0, 0xff,0xff,0xff,0x0, 0xf, 0xff,0xff,0xf, 0xff,0xff,0xff,0x1f,0xff,0xff,0xff, +0x0, 0xf, 0xff,0xff,0xf, 0xff,0xff,0xff,0x7, 0xff,0xff,0xff,0x0, 0x19,0x66,0xd, +0x3c,0x6e,0xf3,0x5f,0x7f,0xff,0xff,0xff, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT8006m/include/firmware/black_all.i b/drivers/input/touchscreen/FT8006m/include/firmware/black_all.i new file mode 100644 index 0000000000000..f0b0e50999db4 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/include/firmware/black_all.i @@ -0,0 +1,7029 @@ +0x10,0x71,0x4, 0x3e,0x16,0xd9,0x0, 0x9d,0xbf,0x10,0x84,0x0, 0x0, 0x2, 0xc8,0x0, +0x84,0x80,0x0, 0x26,0x5a,0x51,0xb5,0x2a,0x6c,0xc5,0x4a,0x1, 0x60,0xe1,0xf, 0xc1, +0x10,0xc, 0x30,0x4b,0x0, 0x0, 0x42,0xa, 0xe3,0x29,0x99,0xf0,0xb9,0xe1,0x6b,0x68, +0x5f,0x81,0x26,0x0, 0xa1,0x80,0x8, 0x20,0x6, 0x0, 0x85,0x0, 0x0, 0x2c,0xb8,0x71, +0x3, 0x0, 0x8, 0x10,0x1b,0x27,0x35,0x38,0x6a,0x2d,0x72,0xbb,0x7b,0x94,0x62,0x5c, +0x4a,0x38,0x25,0x15,0x6, 0x0, 0x8, 0x10,0x1b,0x27,0x35,0x38,0x6a,0x2d,0x72,0xbb, +0x7b,0x94,0x62,0x5c,0x4a,0x38,0x25,0x15,0x0, 0x0, 0x85,0x80,0x0, 0x12,0x0, 0x0, +0x20,0x44,0x8, 0x0, 0x60,0x47,0x0, 0x0, 0x10,0x22,0x4, 0x0, 0xb0,0x23,0x15,0x0, +0x86,0x0, 0x0, 0x30,0xfa,0x68,0x68,0x1, 0x2d,0x6e,0x10,0x4, 0x0, 0x60,0x15,0x0, +0x50,0x15,0x56,0x51,0x15,0x55,0x61,0x15,0x0, 0x60,0x15,0x0, 0x50,0x15,0x56,0x51, +0x15,0x55,0x61,0x95,0xab,0x18,0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x80,0x4c,0x29,0x84, +0x52,0x1, 0x9, 0x0, 0x86,0x80,0x0, 0xe, 0xf0,0xb1,0x71,0xef,0x49,0xc0,0x80,0x1a, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87,0x0, 0x0, 0xc, 0xff,0x81,0x68,0xac,0xb4,0x6d, +0x24,0x0, 0x0, 0x0, 0x0, 0x0, 0x87,0x80,0x0, 0x17,0x19,0xc6,0x3e,0x20,0x1c,0x58, +0x64,0x10,0x53,0x33,0xe8,0x50,0x1, 0x32,0x8c,0x8c,0x24,0x69,0x81,0x71,0x44,0x7c, +0x14,0x88,0x0, 0x0, 0x1f,0x0, 0x80,0x3, 0xe7,0x1f,0x17,0x0, 0x48,0x40,0x2, 0xcf, +0x18,0x30,0x88,0x41,0x8a,0x39,0x28,0xa9,0xc5,0x9a,0x7b,0xf0,0x7, 0x7e,0xe0,0x7, +0x7e,0x20,0x10,0x0, 0x88,0x80,0x0, 0x79,0x43,0x77,0x3, 0x40,0x8a,0xf1,0xff,0x43, +0x30,0x8, 0xc1,0x46,0xa0,0x80,0x24,0x18,0x30,0x6, 0x64,0xc1,0x80,0x11,0x7, 0xc4, +0xe1,0xd0,0x68,0x40,0x20,0x1d,0x4, 0x48,0x40,0x40,0x28,0x10,0x60,0x70,0x38,0x1a, +0x10,0x47,0x3, 0xe2,0x20,0x0, 0x10,0x80,0x50,0x30,0x0, 0xe0,0xe1,0x1, 0x0, 0x28, +0xe, 0x6, 0xc3,0xcc,0xcc,0xcc,0xcc,0xcc,0x8c,0x88,0x88,0x88,0x88,0x88,0xc8,0x8, +0x86,0xc6,0xe3,0x81,0x0, 0x20,0x0, 0x21,0x42,0x88,0x0, 0x0, 0x0, 0x0, 0x40,0x0, +0x0, 0x31,0x4, 0x41,0x6, 0x0, 0x0, 0x0, 0x0, 0x92,0x4, 0x0, 0x92,0x4, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x85,0x11,0xc, 0x0, 0x0, 0x40,0x0, 0x0, 0x0, 0x0, 0x5e, +0x0, 0x89,0x0, 0x0, 0x19,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89,0x80, +0x0, 0x13,0x1, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7, 0x1, 0x5, 0x44,0xc, +0xce,0xe7,0x62,0xe, 0x0, 0x8a,0x0, 0x0, 0x80,0x91,0x1, 0x88,0xa6,0xe8,0xef,0xf7, +0xfb,0xfd,0x7e,0x0, 0x0, 0x0, 0x68,0xc5,0x7, 0xe8,0x3c,0x20,0x36,0x40,0xe7,0x1, +0x71,0x1, 0x3a,0xf, 0x88,0x9, 0xd0,0x79,0x80,0x39,0xbc,0xdf,0x8, 0xcc,0x20,0x83, +0x46,0x0, 0x18,0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1c,0xad,0xd1,0x2a,0x0, 0x40,0xa1,0x50,0x78,0x7, 0xa0,0xf3,0x80,0x73, +0x0, 0x6f,0x0, 0x74,0x1e,0x70,0xe, 0xe0,0x5, 0x80,0xce,0x3, 0xce,0x1, 0xbc,0x2, +0xd0,0x79,0xc0,0x39,0x80,0x77,0x1, 0x3a,0xf, 0x38,0x7, 0xf0,0x26,0x40,0xe7,0x1, +0xe7,0x0, 0xde,0x3, 0xe8,0x3c,0xe0,0x1c,0xc0,0x5b,0x0, 0x9d,0x7, 0x9c,0x3, 0x0, +0x1, 0xbf,0x1f,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a,0x80,0x0, 0x80,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, +0x6a,0xc4,0xa8,0xd5,0x96,0xa2,0xe0,0x1f,0x31,0x6a,0xb5,0xa5,0x28,0x78,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x13,0x0, 0xf0,0x0, 0x94,0xd6,0xc, 0x2d,0x49,0x30,0x14, +0xc7,0x4, 0xd5,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x4d,0x15,0xa2,0x18,0x84, +0x0, 0x4c,0x30,0x6c,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xd6,0xc, 0x29,0x8, 0x20, +0x10,0xc6,0x4, 0xd5,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x4d,0x55,0xb2,0x1c, +0xc5,0x10,0x4c,0x30,0x6c,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x5b,0x10,0x8b,0x0, 0x0, +0x16,0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xd0,0x40,0x8c,0x0, 0x0, 0x3f,0xef,0xbd,0xf7,0xde,0x7b, +0xef,0xbd,0x7, 0x8, 0x8, 0xa, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0x5c,0x9, +0xa8,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x5a,0x59,0x59,0x59,0x59,0x59, +0x59,0x59,0x59,0x59,0x59,0x59,0x9, 0x4, 0xff,0x5, 0x80,0x80,0x0, 0x4, 0x20,0x0, +0x1, 0x8, 0x40,0x0, 0x2, 0x10,0x80,0x0, 0x4, 0xf, 0x8c,0x80,0x0, 0x27,0xea,0xd3, +0xc6,0xb8,0xaf,0xa6,0x9e,0x98,0x92,0x8e,0x8a,0x85,0x0, 0x60,0xf6,0xcf,0xfc,0x6f, +0xf6,0xef,0xcf,0xaf,0xf, 0xff,0xaf,0xb5,0x71,0xe, 0x6c,0x4a,0x69,0x8, 0x0, 0x0, +0x44,0x0, 0x0, 0x0, 0x0, 0x8d,0x0, 0x0, 0x80,0x0, 0x4, 0x8, 0xc, 0x50,0x10,0x14, +0x18,0x1c,0xa5,0x20,0x28,0x30,0x39,0x3e,0x41,0x49,0x51,0x59,0x54,0x61,0x69,0x71, +0x79,0xaa,0x81,0x89,0x91,0x99,0x5a,0xa1,0xa9,0xb1,0xb9,0x1, 0xc0,0xc8,0xd0,0xd8, +0x6f,0xe0,0xe7,0xef,0xf7,0x5c,0xfb,0xfd,0xfe,0x0, 0x0, 0x4, 0x7, 0xb, 0xf0,0xf, +0x13,0x17,0x1b,0x6b,0x1f,0x27,0x2f,0x36,0xc1,0x3e,0x46,0x4e,0x56,0x1a,0x5e,0x65, +0x6d,0x75,0xac,0x7d,0x85,0x8d,0x95,0x16,0x9d,0xa4,0xac,0xb4,0xbc,0xbc,0xc4,0xcc, +0xd4,0x5a,0xdc,0xe4,0xec,0xf3,0xc1,0xf7,0xf9,0xfa,0x3f,0x0, 0x4, 0x8, 0xc, 0x0, +0x10,0x14,0x18,0x1c,0x55,0x20,0x28,0x30,0x38,0x55,0x40,0x48,0x50,0x58,0x55,0x60, +0x68,0x70,0x78,0x1, 0x7f,0x87,0x8f,0x97,0xaf,0x8d,0x80,0x0, 0x14,0x9f,0xa7,0xaf, +0xb7,0x55,0xbf,0xc7,0xcf,0xd7,0x0, 0xdf,0xe7,0xef,0xf7,0xe5,0xfb,0xfe,0xff,0x3, +0x0, 0x90,0x0, 0x0, 0x7, 0x8b,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x91,0x0, 0x0, 0xd, +0x2d,0xd3,0x0, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x1f,0x0, 0x91,0x80,0x0, +0x19,0x1, 0x5, 0x0, 0x5, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1, 0xff,0xf, 0x0, 0x0, 0x2c,0x1, 0x0, 0x0, 0x0, 0x92,0x0, 0x0, 0x10,0x0, 0x3, +0x0, 0x9d,0xbf,0x10,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd9,0x16,0xb, 0xf4, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0x0, 0x0, 0x60,0x0, 0x1, 0x79,0x84,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0xe0,0x60,0x3c,0x0, 0xcc,0x2, 0xe0,0x60,0x3c,0x10,0xea,0x0, 0xc8,0x3, 0xe0,0xff, +0xc8,0x7c,0xfa,0x0, 0xcf,0x82,0xf0,0x0, 0xcf,0x80,0xea,0x0, 0xcc,0x0, 0xe0,0x0, +0xcc,0x0, 0xe0,0x60,0x3c,0x17,0xea,0x0, 0xcc,0x2, 0xe0,0x0, 0xcc,0x0, 0xea,0x0, +0xcc,0x80,0xe0,0x32,0xcc,0xe8,0x3c,0x79,0x1, 0x8, 0xea,0x0, 0xcd,0x2, 0xe0,0x1, +0xcd,0x34,0x3d,0x28,0xe0,0x0, 0xdb,0xe2,0xea,0x0, 0xcc,0x0, 0xe0,0x2e,0xcc,0x60, +0x3c,0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x56,0x31,0x2e,0x34,0x30,0x53,0x65,0x70,0x20,0x20,0x31,0x20,0x32,0x30,0x31,0x37, +0x46,0x54,0x38,0x30,0x30,0x36,0x5f,0x42,0x4f,0x4f,0x54,0x4c,0x4f,0x41,0x44,0x45, +0x26,0x40,0xd9,0xbf,0x38,0xce,0xc7,0x31,0xd5,0xbe,0x2a,0x41,0xff,0x0, 0xff,0x0, +0x0, 0x0, 0x0, 0x0, 0xff,0xff,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80,0xb6, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xe8,0x2, 0x4f,0xa1,0xe2,0x0, 0xcf,0xe6,0x1, 0x35,0x2, 0x88,0xe2,0x0, 0xcf,0x83, +0x1, 0x2b,0xe2,0x0, 0xcf,0x85,0x1, 0x14,0x0, 0xbd,0xe2,0x1, 0xcf,0x90,0x1, 0x8, +0xe2,0x1, 0xcf,0xcc,0x1, 0x27,0xe2,0x0, 0xcf,0xea,0x1, 0xb4,0x0, 0xa6,0xe2,0x0, +0xcc,0x1, 0x2, 0xb0,0xea,0x0, 0x7f,0xd0,0x3c,0x1f,0x8c,0x8, 0x38,0x82,0x2c,0x4, +0xe8,0x0, 0x64,0x46,0x0, 0xa4,0xe2,0x0, 0xcc,0x1, 0x1, 0x86,0xe8,0x0, 0x67,0xc6, +0xe0,0x8, 0x37,0xc8,0x0, 0x9c,0xe2,0x0, 0xcc,0x2, 0x1, 0x9c,0xe8,0x0, 0x67,0xc6, +0xe4,0x8, 0x37,0xc0,0x0, 0x94,0xe8,0x2, 0x67,0xca,0x3c,0x1f,0xe0,0x1, 0x8c,0x8, +0x38,0x82,0xe8,0x2, 0x4c,0x38,0x38,0x82,0x2c,0x5, 0xe8,0x1, 0x5c,0xe, 0x34,0x48, +0x38,0x82,0xe2,0x0, 0xcc,0x1, 0x1, 0x86,0xe8,0x1, 0x5c,0xe, 0xe2,0x1, 0xc4,0x7f, +0x38,0x82,0xe0,0x1, 0x14,0x6b,0x38,0x82,0x17,0x0, 0xe8,0x2, 0x6f,0x23,0xe8,0x2, +0x4f,0xa1,0xe2,0x0, 0xcf,0xe4,0xe0,0x2, 0x1, 0x2, 0x2, 0xa6,0xe2,0x0, 0xcf,0x87, +0xe0,0x1, 0x1, 0x5a,0x2, 0x8f,0xe2,0x0, 0xcf,0x83,0xe0,0x1, 0x1, 0x27,0xe2,0x0, +0xcf,0x85,0xe0,0x1, 0x1, 0x70,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1, 0xa3,0xe0,0x1, +0x0, 0xea,0xe2,0x0, 0xcf,0x90,0xe0,0x1, 0x1, 0x63,0x2, 0x86,0xe2,0x0, 0xcf,0x89, +0xe0,0x1, 0x1, 0x52,0x38,0x82,0xe2,0x0, 0xcf,0xd5,0x1, 0x25,0xe2,0x0, 0xcf,0xe1, +0xe0,0x2, 0x1, 0x8, 0x38,0x82,0xe2,0x1, 0xcf,0x90,0x1, 0x20,0x2, 0x8c,0xe2,0x0, +0xcf,0xe6,0xe0,0x1, 0x1, 0x50,0xe0,0x1, 0x4, 0xd8,0xe2,0x0, 0xcf,0xea,0xe0,0x1, +0x1, 0x4a,0x38,0x82,0xe2,0x1, 0xcf,0xb0,0x1, 0x1f,0x2, 0x85,0xe2,0x1, 0xcf,0xaa, +0x1, 0xa, 0x38,0x82,0xe2,0x1, 0xcf,0xbf,0x1, 0x32,0xe2,0x1, 0xcf,0xcc,0xe0,0x1, +0x1, 0x3a,0x38,0x82,0xe8,0x2, 0x6f,0x38,0x38,0x82,0xe2,0x0, 0xcc,0x3, 0xe0,0x1, +0x2, 0xe9,0xe0,0x0, 0x1f,0x93,0xe8,0x2, 0x6f,0x38,0x3f,0x98,0xac,0x8f,0xe0,0x1, +0x24,0x2a,0xe0,0x1, 0x0, 0xdf,0xe2,0x0, 0xcc,0x3, 0xe0,0x1, 0x2, 0xdb,0xea,0x6, +0x7f,0x8e,0xe9,0xff,0xc7,0xfe,0x3c,0x1f,0x8c,0x8, 0x3c,0x1f,0x3c,0x2, 0x4, 0x4, +0xa, 0x18,0xe4,0x9, 0x34,0xa0,0x0, 0x85,0xe8,0x0, 0x67,0xc5,0x34,0xa8,0x3c,0x9f, +0xe8,0x0, 0x7c,0xc5,0x38,0x82,0xe8,0x0, 0x67,0xc5,0x0, 0xfa,0xe2,0x0, 0xcc,0x5, +0x2, 0xa3,0xea,0x6, 0x7f,0xc4,0xe9,0xff,0xc7,0xfe,0x34,0x21,0x3c,0x1f,0x9c,0x8, +0x3c,0x1f,0x3c,0x2, 0x1, 0x6c,0x0, 0x78,0x0, 0x98,0x0, 0xc, 0x0, 0x18,0x0, 0x22, +0xe8,0x2, 0x67,0x4a,0xa7,0x8e,0x3c,0x9f,0xbc,0x8e,0x38,0x82,0x34,0xa8,0xe8,0x2, +0x67,0xca,0xe0,0x1, 0x0, 0x96,0xe8,0x2, 0x67,0xca,0x9f,0x2f,0x3c,0x9e,0xb4,0xaf, +0x17,0x0, 0xb7,0x3f,0x38,0x82,0xe8,0x2, 0x67,0xca,0x16,0x81,0x9f,0x3f,0x3e,0x9e, +0xb6,0xbf,0x3f,0x1f,0xe0,0x1, 0xac,0x8e,0x9e,0xbf,0x9f,0x2f,0x3e,0xfe,0xe0,0x1, +0x4, 0x91,0xe8,0xa, 0x4e,0xa6,0x17,0x0, 0xe0,0x2e,0x3e,0x8e,0xe8,0x2, 0x7f,0xc6, +0x17,0x82,0xe8,0xa, 0x6f,0x26,0x0, 0xac,0xe2,0x0, 0xcc,0x2, 0x1, 0x18,0xe2,0x0, +0xcc,0x3, 0x1, 0x1b,0xe2,0x0, 0xcc,0x1, 0xe0,0x0, 0x1, 0xfc,0xe8,0xa, 0x4f,0xa6, +0x27,0x84,0xe0,0x0, 0x1f,0x8f,0x0, 0x83,0xe0,0x0, 0x1f,0x8e,0xe8,0x2, 0x7f,0xca, +0xe4,0x9, 0x34,0xa0,0xe8,0x2, 0x67,0xca,0xe0,0x0, 0x0, 0xd8,0xe8,0x2, 0x67,0x4a, +0x34,0xa8,0xa7,0x8e,0xe7,0xff,0x0, 0xb9,0xe8,0x2, 0x67,0xca,0xa7,0xf, 0x3c,0x9e, +0xbc,0x8f,0x17,0x1, 0xe8,0x2, 0x7f,0xc6,0x17,0x81,0xe8,0x2, 0x6f,0x23,0xe8,0x0, +0x7f,0xc2,0x38,0x82,0xe8,0x0, 0x67,0x9f,0x17,0x0, 0xe0,0x3, 0xb7,0x1f,0x17,0x80, +0xe0,0x2, 0x17,0x4, 0xbf,0x8e,0xe0,0x2, 0x17,0x8, 0xbf,0x8e,0x17,0x81,0xe8,0x2, +0x6f,0xa0,0x38,0x82,0xe2,0x0, 0xcc,0x1, 0x1, 0x84,0xe8,0x0, 0x6c,0xd3,0x38,0x82, +0xe2,0x0, 0xcc,0x2, 0x1, 0xbe,0xe8,0x2, 0x6c,0x9f,0x38,0x82,0xe8,0x2, 0x6c,0x9e, +0x38,0x82,0x17,0x1, 0xe8,0x2, 0x6f,0x23,0x38,0x82,0xe8,0x2, 0x6f,0x38,0x17,0x80, +0xe8,0x0, 0x7f,0xc4,0x38,0x82,0xc4,0x7f,0xe2,0x0, 0xcc,0x4, 0x2, 0xaa,0xea,0x8, +0x7f,0xf2,0xe9,0xff,0xc7,0xfe,0x3c,0x1f,0x8c,0x8, 0x3c,0x1f,0xe8,0x2, 0x67,0xca, +0x3c,0x2, 0x6, 0xc, 0x12,0x1a,0x20,0x0, 0xe4,0x9, 0x34,0xa0,0x0, 0x86,0xa7,0xf, +0x34,0xa8,0x0, 0x82,0xa7,0xf, 0x3c,0x9e,0xbc,0x8f,0x38,0x82,0x34,0xa8,0xb4,0xaf, +0x38,0x82,0x9f,0x2f,0x3c,0x9e,0xb4,0xaf,0x17,0x3, 0xe8,0x0, 0x7f,0x42,0x38,0x82, +0x17,0x84,0xe8,0x0, 0x7f,0xc2,0xe8,0x2, 0x6f,0x38,0x17,0x0, 0xe8,0x0, 0x7f,0x44, +0x38,0x82,0x8, 0xb2,0xe8,0x0, 0xc, 0x37,0xf8,0x0, 0xf, 0xbf,0x17,0x81,0xe8,0x0, +0x61,0x1c,0xe8,0x0, 0x6f,0xd4,0xa7,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x99,0xa7,0x2, +0x17,0xfe,0x3f,0xde,0xbf,0x82,0x8c,0xf2,0xe8,0x2, 0x4f,0xa2,0x2f,0x83,0xe8,0x2, +0x6c,0xa1,0xe8,0x2, 0x4c,0x22,0xde,0xa9,0xe8,0x2, 0x4f,0xa2,0xc7,0x81,0xe8,0x2, +0x6f,0xa2,0xe8,0x2, 0x4f,0xa3,0x27,0x84,0x14,0x0, 0xde,0x53,0xac,0x72,0xa7,0x82, +0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x8e,0xa7,0x2, 0x17,0xfd,0x3f,0xde,0xbf,0x82, +0xe8,0x2, 0x4f,0xa2,0xc7,0x81,0xe8,0x2, 0x6f,0xa2,0xe8,0x2, 0x4c,0x22,0xde,0x41, +0xac,0x72,0x17,0x88,0xe0,0x61,0x3f,0x91,0xf8,0x0, 0xf, 0xaf,0xf0,0x0, 0xb, 0xa8, +0x9, 0x21,0x38,0x0, 0xe, 0xbf,0xe8,0x0, 0x67,0x1c,0x17,0xfe,0xa6,0xbe,0x3f,0xdd, +0xbf,0xbe,0x17,0x80,0xe8,0x2, 0x6f,0xa2,0x17,0x90,0xe0,0x61,0x3f,0x91,0xf, 0xad, +0x38,0x0, 0x8, 0xb6,0xe1,0xff,0xc0,0x0, 0xe8,0x0, 0x67,0xc4,0x39,0xe8,0x3f,0x99, +0x39,0x69,0x3b,0x6a,0xe8,0x0, 0x7f,0xc4,0x21,0x27,0xe2,0x0, 0xc9,0x7f,0x2, 0x85, +0x3a,0xe2,0xe2,0x1, 0xc2,0xff,0x0, 0x83,0xe0,0x1, 0x12,0x80,0x3a,0x65,0xe2,0x1, +0xc2,0x7f,0x3c,0x63,0x3d,0x64,0xe2,0x0, 0x7c,0x84,0xd7,0xb0,0x39,0x24,0x8f,0x86, +0xe3,0xff,0xc1,0x7f,0x39,0x95,0xe2,0x0, 0x7e,0x84,0x17,0x0, 0xc7,0x1, 0xe1,0x80, +0x8e,0x1d,0xe3,0xff,0xc7,0x7f,0x3a,0x7e,0xe2,0xf, 0x3e,0x4f,0xe2,0x1, 0xc7,0xff, +0x2, 0xf6,0xaf,0x86,0x0, 0xda,0xe0,0x1, 0xc0,0x0, 0xb, 0x61,0xe8,0x0, 0x4f,0xd3, +0xe2,0x0, 0xcf,0x8b,0xe0,0x0, 0x1, 0xd1,0x8, 0xb6,0xe2,0x9f,0xcc,0x7f,0x3a,0xe8, +0xe0,0x0, 0x5, 0xca,0xe8,0x0, 0x67,0x45,0xe2,0xf0,0x17,0x80,0x3f,0x7f,0xe0,0x0, +0x2, 0xc3,0xe8,0x0, 0x67,0xc4,0x3b,0x69,0x39,0xea,0x2f,0x83,0xe8,0x2, 0x6f,0x84, +0xe8,0x0, 0x67,0xc4,0xe8,0x2, 0x4a,0x4, 0x3f,0x93,0xe2,0x0, 0xca,0x3, 0xe8,0x0, +0x7f,0xc4,0x2, 0x9a,0x17,0x84,0xe0,0x2, 0x3f,0xa4,0xe2,0x1, 0xc1,0x7f,0x39,0xf2, +0x3, 0x84,0x39,0x63,0xe2,0x1, 0xc1,0x7f,0xea,0x2, 0x7c,0x0, 0x3c,0xe6,0x3c,0x14, +0x3d,0x62,0x3a,0x12,0x39,0xa2,0xe0,0x0, 0xd9,0x21,0x3a,0x92,0xe8,0x2, 0x6a,0x4, +0x3b,0x12,0xe3,0xff,0xc1,0xff,0x21,0x85,0x3d,0x63,0x3c,0xe6,0x3c,0x65,0xd6,0xf7, +0xe8,0x0, 0x67,0x44,0xe8,0x0, 0x67,0xc5,0x3f,0x7f,0x1, 0x8d,0x15,0x4, 0xea,0x2, +0x7c,0x80,0xe0,0xa0,0x14,0x0, 0xd6,0xeb,0x17,0x80,0xe8,0x0, 0x7f,0xc4,0xb, 0x21, +0xe0,0x9, 0x0, 0x9f,0xb, 0x61,0x38,0x82,0x8, 0xb1,0xe8,0x0, 0x67,0xc2,0xc7,0xff, +0xe2,0x0, 0xcf,0x83,0xe0,0x0, 0x2, 0xe4,0xea,0xd, 0x7f,0xe, 0xe9,0xff,0xc7,0x7e, +0x3f,0x9e,0x8f,0x8f,0x3f,0x9e,0x17,0x0, 0xe8,0x0, 0x7f,0x42,0x3f,0x82,0x4c,0x4, +0x70,0x8e,0xe8,0x1, 0x77,0xe, 0xe8,0x0, 0x4f,0xd3,0xe8,0x2, 0x64,0xc6,0xe2,0x0, +0xcf,0x8b,0x1, 0x86,0xa4,0x9, 0x9d,0x29,0xc4,0x88,0xdf,0x89,0x0, 0x8b,0xa7,0x89, +0x9f,0x29,0x3f,0x9e,0xe2,0x20,0xcf,0x80,0x2, 0x85,0xa4,0x9, 0x9d,0x29,0xc4,0x88, +0xd6,0xb6,0xe8,0x2, 0x67,0xc6,0xa4,0xf, 0x9c,0xaf,0xe0,0x0, 0xd8,0xa9,0xe0,0x20, +0xc4,0x0, 0xe8,0x1, 0x74,0xe, 0xd5,0x23,0x0, 0xb2,0xe8,0x2, 0x64,0xc6,0xe0,0x2, +0x15,0x0, 0xe1,0x80,0xa4,0x29,0xd7,0x2, 0xe8,0x0, 0x4f,0xd4,0x27,0xa8,0xe8,0x2, +0x67,0x46,0xe8,0x0, 0x67,0x9c,0xe0,0x1, 0x87,0xe, 0xaf,0x7f,0x0, 0xa0,0xe8,0x2, +0x67,0xc6,0xe8,0x1, 0x77,0xe, 0xea,0x2, 0x7d,0x38,0xa4,0xf, 0x9c,0xaf,0xdf,0x22, +0xd5,0x6, 0xe7,0xe0,0x17,0x55,0xe8,0x1, 0x77,0xe, 0x0, 0x91,0xe8,0x1, 0x77,0xe, +0xe8,0x0, 0x4f,0xd3,0xe2,0x0, 0xcf,0x8b,0x1, 0x83,0xd3,0x49,0x0, 0x83,0x14,0x0, +0xd6,0xbb,0xd4,0xf5,0xe7,0xe1,0x17,0xaa,0xe8,0x1, 0x77,0x8e,0xe8,0x2, 0x4f,0xa0, +0x27,0x89,0xe0,0x27,0x14,0x8, 0xd4,0xdc,0xe8,0x0, 0x67,0x9f,0x17,0x7f,0xe0,0x7, +0xaf,0x3f,0x8, 0xe1,0xe0,0x0, 0x1f,0x83,0xe0,0x2, 0x8f,0xf, 0xe0,0x2, 0x8e,0x9f, +0x3e,0x9e,0xe2,0x1, 0xce,0xff,0x1, 0x84,0xe2,0x0, 0xcf,0x4, 0x5, 0x8e,0xe0,0x0, +0x1f,0x88,0xe0,0x2, 0x8f,0xf, 0xe0,0x2, 0x8e,0x9f,0x3e,0x9e,0xe2,0x1, 0xce,0xff, +0x1, 0x9c,0xe2,0x0, 0xcf,0x4, 0x2, 0x99,0xe0,0x2, 0x8e,0x2f,0xe0,0x2, 0x8e,0xbf, +0x3e,0x9c,0xe2,0x1, 0xce,0xff,0x1, 0x91,0xe0,0x2, 0x8e,0xcf,0xe0,0x2, 0x8f,0xdf, +0x3f,0x9d,0xe2,0x1, 0xcf,0xff,0x1, 0x89,0xe8,0x2, 0x6f,0x26,0x14,0x1, 0xe8,0x2, +0x6e,0x25,0xe8,0x2, 0x6e,0xa4,0x38,0x82,0x14,0x0, 0x38,0x82,0xc0,0x78,0xe8,0x0, +0x66,0xa0,0xe0,0x0, 0x17,0x50,0xa7,0x9d,0x16,0x4, 0xcf,0x90,0xbf,0x9d,0x3e,0x10, +0xe8,0x0, 0x67,0x99,0xe1,0x2, 0x15,0x5, 0xb7,0x5f,0x8d,0xff,0xb7,0x5f,0xe0,0x0, +0x17,0x5a,0xaf,0x3f,0xe0,0x0, 0x17,0x51,0xb7,0x5f,0x17,0x2, 0xaf,0x3f,0xe1,0x2, +0x17,0x0, 0xb7,0x5f,0xc7,0x1, 0x8c,0xff,0xe3,0xff,0xc7,0x7f,0x3f,0x7a,0xe1,0x80, +0xac,0x9c,0x1, 0xf8,0xe2,0x0, 0xcd,0xda,0x1, 0x6, 0xe0,0x0, 0x17,0x50,0xb7,0x5f, +0x17,0x0, 0xaf,0x3f,0x17,0xef,0xa7,0x1d,0x3f,0xde,0xbf,0x9d,0xe2,0x0, 0x7f,0x88, +0x3c,0x1f,0xe0,0x40,0x8c,0x48,0xc0,0x8, 0x38,0x82,0x16,0x80,0xe8,0x0, 0x67,0x9f, +0xae,0x88,0xe0,0x1, 0xa7,0xff,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0x93,0xe8,0x0, +0x67,0xa0,0xe0,0x0, 0x16,0xd4,0xa7,0x1f,0xcf,0x10,0xbf,0x1f,0xe8,0x0, 0x67,0x19, +0xb6,0xde,0x8f,0x7e,0xe2,0x0, 0xc7,0x3, 0xaf,0x8, 0x17,0x6f,0xa6,0x9f,0x3f,0x5d, +0xbf,0x1f,0x38,0x82,0x8, 0xb5,0xc0,0x7c,0xdf,0x76,0x2c,0x4, 0x12,0x82,0x14,0x0, +0x0, 0x90,0xe8,0x2, 0x4c,0x26,0xdf,0xa3,0xe8,0x2, 0x6c,0x27,0xe8,0x2, 0x4f,0x27, +0xe8,0x2, 0x4f,0xa4,0x3f,0x7f,0x1, 0xf3,0xe0,0xf, 0x12,0xc2,0xe0,0xf, 0x14,0x40, +0x15,0x4, 0xe2,0x0, 0x7c,0x84,0xd6,0x2a,0x49,0x6, 0x4f,0x87,0x31,0x28,0x39,0x1f, +0xe3,0xff,0xc1,0x7f,0x17,0xf8,0x3f,0x92,0xe2,0x1e,0xcf,0xf7,0x2, 0xa3,0xc1,0x7e, +0xe3,0xff,0xc1,0x7f,0xe0,0x0, 0x1c,0x8d,0x3c,0x65,0x3d,0x62,0x4a,0x4, 0x49,0x85, +0xe8,0x1, 0x71,0x16,0xd6,0x13,0xe0,0x0, 0x1c,0xc, 0x32,0x28,0x34,0x41,0x15,0x0, +0xe0,0x9, 0x31,0x41,0xe3,0xff,0xc4,0x7f,0x39,0x94,0xe0,0xb, 0xd7,0xeb,0xe3,0xff, +0xc1,0xff,0x39,0xf8,0xe0,0x0, 0x1a,0x8d,0x1, 0x7, 0x14,0x0, 0xbc,0x5, 0xbc,0x15, +0x0, 0x84,0x14,0x0, 0x0, 0x82,0x14,0x1, 0xc0,0x4, 0xa, 0xe1,0x8, 0xb2,0x11,0x3, +0xdf,0xb2,0xe8,0x2, 0x6c,0x2e,0xe8,0x2, 0x4f,0xae,0x2f,0x85,0xc1,0x7f,0xe2,0x1, +0xc1,0x7f,0x29,0x77,0x9, 0x61,0xe8,0x0, 0x67,0x20,0xe0,0x0, 0x16,0xd0,0xa7,0x9e, +0xe0,0x0, 0x16,0x5a,0xcf,0x90,0xbf,0x9e,0xe8,0x0, 0x67,0x99,0xb6,0xdf,0x8d,0xff, +0xb6,0xdf,0xe2,0x0, 0xcd,0xda,0xae,0x3f,0xe7,0x24,0x16,0x10,0xb6,0x5f,0x16,0x0, +0xae,0x3f,0x1, 0x3, 0xb6,0xdf,0xae,0x3f,0x17,0xef,0xa6,0x9e,0x3f,0xdd,0xbf,0x9e, +0x38,0x82,0x8, 0xb3,0xe8,0x0, 0x61,0x19,0xe0,0x0, 0x16,0xd4,0xb6,0xd2,0x17,0x3, +0xaf,0x32,0x8f,0x88,0x8f,0x18,0x37,0xa8,0x3f,0x9e,0xe3,0xff,0xc7,0xff,0x17,0x74, +0x3f,0x1f,0xe2,0x1e,0xcf,0x74,0x5, 0x84,0x14,0x1, 0xe0,0x0, 0x0, 0xfb,0xe0,0x0, +0x16,0xd0,0xc7,0xfe,0xb6,0xd2,0xe0,0x0, 0x17,0x5a,0x16,0x0, 0xe3,0xff,0xc7,0xff, +0x15,0x7d,0xaf,0x32,0x3e,0xec,0x3d,0xec,0x17,0x8, 0x3d,0x1f,0x2d,0x93,0xe0,0xb, +0x3c,0x1e,0x8e,0x8b,0x8e,0x1b,0x36,0xa8,0x3e,0x9c,0x8e,0x2b,0x8d,0xbb,0x36,0x28, +0x3e,0x1b,0xc7,0x4, 0xe3,0xff,0xc6,0xff,0xe3,0xff,0xc6,0x7f,0xe3,0xff,0xc7,0x7f, +0x15,0x84,0xe0,0x9, 0x3c,0x1e,0x8c,0x89,0xb6,0xd2,0xc5,0x81,0xac,0xb2,0x14,0x83, +0xe3,0xff,0xc5,0xff,0x3c,0x9c,0x3c,0xfb,0xc6,0x81,0xc7,0x1, 0xe3,0xff,0xc6,0xff, +0xe3,0xff,0xc7,0x7f,0x3, 0x5, 0x3d,0x7e,0x2, 0x2, 0x3f,0x6f,0x15,0x80,0x3f,0xfe, +0x2, 0xd6,0xe7,0x24,0x17,0x82,0xb7,0xd2,0xe7,0x24,0x16,0x83,0x8f,0x72,0xe7,0x24, +0x17,0x84,0xb6,0xd2,0xe4,0xc, 0x37,0x28,0xe7,0x24,0x16,0x85,0x8f,0x72,0xb7,0xd2, +0xe4,0xe, 0x37,0x20,0x8f,0xf2,0xb6,0xd2,0x3f,0x1c,0x8e,0xf2,0x37,0xa8,0x3f,0x1d, +0x3f,0x9e,0xa7,0x18,0xe0,0x0, 0x16,0xd0,0xb6,0xd2,0x3f,0xfe,0x16,0x80,0xae,0xb2, +0xe7,0xff,0x1, 0xa4,0xe0,0x0, 0x17,0xf0,0xb7,0xd2,0x17,0x2a,0xae,0xb2,0x39,0xe8, +0xb7,0xd2,0xe0,0x27,0x14,0x8, 0xaf,0x32,0xd3,0x5b,0xe0,0x0, 0x17,0xf6,0xb7,0xd2, +0xe0,0x0, 0x16,0xf5,0x8c,0x72,0xb6,0xd2,0x34,0x28,0x8f,0x23,0x8f,0xf2,0xe0,0xd, +0x37,0x28,0x8f,0x33,0x3c,0x1f,0x3f,0x1d,0xe3,0xff,0xc4,0x7f,0xe1,0x28,0x3f,0x8, +0x9, 0xe1,0x8, 0xb5,0xe8,0x0, 0x61,0xa0,0x3a,0x68,0x11,0x3, 0x12,0xef,0xa7,0x93, +0x3c,0x64,0xcf,0x90,0xbf,0x93,0xdf,0x66,0xa7,0x93,0x3f,0xd5,0xbf,0x93,0x24,0x5, +0xc1,0x7f,0xe2,0x1, 0xc1,0x7f,0x29,0x74,0xa, 0xe1,0x8, 0xb4,0xe8,0x0, 0x4f,0xd9, +0x39,0x68,0xe2,0x0, 0xcf,0x81,0x1, 0xaa,0xe1,0x11,0x14,0x2a,0xe0,0xb, 0xd8,0x56, +0xe0,0xb, 0xd7,0x54,0x3a,0x68,0x2c,0x7d,0xe8,0x0, 0x61,0x9f,0xe0,0x1, 0x14,0x14, +0xe0,0x2, 0x9f,0x93,0xe3,0xff,0xc7,0xfe,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd7,0x2c, +0x3c,0x64,0xe0,0xb, 0xd7,0x29,0xac,0x2, 0xe8,0x2, 0x4f,0xae,0x27,0x85,0xe8,0x2, +0x4f,0x29,0x8f,0x82,0x3f,0xce,0xaf,0x82,0x8c,0x2, 0xe0,0xb, 0xd7,0x1d,0xe0,0x2, +0x9f,0x93,0xcf,0x81,0xe0,0x2, 0xb7,0x93,0x0, 0xac,0x2f,0xa8,0xe1,0x11,0x14,0x2a, +0xe0,0xb, 0xd8,0x2c,0xe8,0x0, 0x67,0x9f,0xe0,0x2, 0x9f,0x1f,0xe2,0xff,0xc7,0x7f, +0xe0,0x2, 0xb7,0x1f,0xe0,0x2, 0x9f,0x1f,0xcf,0x4, 0xe0,0x2, 0xb7,0x1f,0xe8,0x2, +0x4f,0x49,0x27,0x7e,0x17,0x0, 0xe8,0x2, 0x6f,0x49,0xe0,0x2, 0x9f,0x1f,0xe1,0x0, +0xcf,0x0, 0xe0,0x2, 0xb7,0x1f,0xe0,0x2, 0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x2, +0xb7,0x1f,0xe0,0x0, 0x1f,0x84,0x87,0x8f,0x0, 0x83,0xe8,0x2, 0x47,0xa9,0xaf,0x82, +0xa, 0x61,0x8, 0xb7,0xf8,0x0, 0xc, 0x3d,0xc0,0x7c,0x17,0x80,0xe2,0x0, 0x79,0x4, +0xe0,0x80,0xaf,0xb2,0xde,0xcc,0xea,0x2, 0x7c,0x29,0xde,0x60,0x3c,0x62,0xdf,0x96, +0x4f,0x87,0xe0,0x0, 0x27,0xf9,0xe8,0x0, 0x4f,0xd9,0xe2,0x0, 0xcf,0x81,0x1, 0x10, +0xe0,0x0, 0x1c,0xd, 0xdf,0x77,0xe8,0x2, 0x6c,0x29,0x14,0x7, 0x3c,0x10,0xdf,0x86, +0xe8,0x0, 0x4f,0xd8,0xe0,0x0, 0x27,0xe8,0xde,0xbf,0xe0,0x0, 0x0, 0xe5,0xe0,0x0, +0x1a,0xc, 0x11,0x80,0x32,0x42,0xe8,0x0, 0x61,0x17,0xe3,0xff,0xc2,0x7f,0xe0,0x7, +0x13,0x60,0x13,0xfc,0xf0,0xe, 0x14,0x41,0xf0,0x0, 0x14,0x9f,0xf0,0x0, 0x15,0x60, +0xf0,0x40,0x3d,0xe3,0xf0,0xe, 0x16,0x1, 0xe1,0x33,0x14,0x3b,0xe0,0xb, 0xd7,0xc6, +0xe0,0xb, 0xd6,0xc4,0x2c,0x7e,0xe0,0x1, 0xb2,0x12,0xe0,0x1, 0xb3,0x32,0xa7,0xe2, +0x3f,0xd7,0xcf,0x82,0xbf,0xe2,0xf0,0x0, 0xbc,0x2, 0xf0,0x0, 0xbc,0xb2,0xa7,0x92, +0x37,0xca,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x12,0x17,0xfe,0x3f,0xde,0xbf,0x92, +0xa7,0x82,0xe0,0x1, 0xcf,0x80,0xbf,0x82,0xe0,0xb, 0xd6,0xa8,0x24,0x7e,0xf0,0x0, +0xbd,0x12,0xf0,0x0, 0xbd,0xb2,0xf0,0x0, 0xbe,0x2, 0xe0,0xb, 0xd6,0x9f,0x3a,0xe8, +0x2c,0x7d,0xf8,0x0, 0x66,0x9f,0x14,0x5, 0xe8,0x2, 0x9f,0x9d,0xc1,0x81,0xe3,0xff, +0xc7,0xfe,0xe8,0x2, 0xb7,0x9d,0xe0,0xb, 0xd6,0x77,0x3c,0x65,0xe0,0xb, 0xd6,0x74, +0xe8,0x2, 0x9f,0x9d,0xe0,0x28,0x3c,0x5, 0xcf,0x81,0xe8,0x2, 0xb7,0x9d,0xe2,0x1, +0xc1,0xff,0xe7,0xff,0x24,0x17,0x17,0x82,0xe1,0x2f,0x3f,0xa3,0xe7,0xff,0x2f,0xb6, +0xe7,0xff,0x0, 0x90,0xc0,0x4, 0xf8,0x0, 0xe, 0xa8,0xb, 0xe1,0x8, 0xb7,0xf8,0x0, +0xc, 0x3c,0xc0,0x7c,0xe8,0x0, 0x61,0x1f,0xe2,0x0, 0x79,0x84,0x17,0x80,0xe0,0x80, +0xaf,0xb3,0xea,0x2, 0x7c,0x28,0xe0,0x2, 0x9f,0x92,0xe1,0x0, 0xcf,0x80,0xe0,0x2, +0xb7,0x92,0xdd,0xcc,0x3c,0x63,0xdf,0x2, 0x4f,0x87,0xe0,0x1, 0x27,0x86,0xe0,0x0, +0x1a,0xc, 0xe8,0x0, 0x61,0x97,0x32,0x42,0xe3,0xff,0xc2,0x7f,0x12,0x83,0xf0,0x7, +0x14,0x60,0xf7,0xff,0x14,0xfc,0xf0,0xe, 0x15,0x0, 0xe7,0x0, 0x13,0x0, 0x13,0xfb, +0xf0,0x0, 0x15,0xe0,0xf0,0x1e,0x16,0x10,0xe1,0x33,0x14,0x3b,0xe0,0xb, 0xd7,0x46, +0xe0,0x1, 0xb2,0x13,0xf0,0x1, 0xb4,0x33,0xa7,0xe3,0xe8,0xf, 0x3f,0xd9,0xcf,0x82, +0xbf,0xe3,0x17,0x97,0xf0,0x0, 0xbd,0x3, 0xbf,0xb3,0xa7,0x83,0xe0,0x10,0xcf,0x80, +0xbf,0x83,0xe0,0x2, 0x9f,0x92,0xe2,0xff,0xc7,0xff,0xe0,0x2, 0xb7,0x92,0xe0,0x2, +0x9f,0x92,0xcf,0x84,0xe0,0x2, 0xb7,0x92,0xa7,0x93,0x37,0xca,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x93,0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x2f,0x84,0x17,0x81,0xe8,0x2, +0x6f,0xaa,0xe0,0x2, 0x9f,0x92,0x3f,0xc6,0xe0,0x2, 0xb7,0x92,0xe0,0x2, 0x9f,0x92, +0x3f,0xd7,0xe0,0x2, 0xb7,0x92,0x17,0x80,0xf0,0x0, 0xbd,0x93,0xbf,0xb3,0xf0,0x0, +0xbe,0x3, 0xe8,0x2, 0x6f,0xc9,0xe0,0x2, 0x9f,0x92,0xe2,0xff,0xc7,0xff,0xe0,0x2, +0xb7,0x92,0xe0,0x2, 0x9f,0x92,0xcf,0x84,0xe0,0x2, 0xb7,0x92,0xe8,0x2, 0x4f,0xc9, +0x27,0xfe,0x17,0x80,0xe8,0x2, 0x6f,0xc9,0xe0,0x2, 0x9f,0x92,0x3f,0xc6,0xe0,0x2, +0xb7,0x92,0xe0,0x2, 0x9f,0x92,0x3f,0xd7,0xe0,0x2, 0xb7,0x92,0xe8,0x2, 0x4f,0xaa, +0x2f,0x84,0xc2,0xff,0xe7,0xff,0x2a,0xa2,0xe8,0x2, 0x4f,0xaa,0x27,0x8d,0xe0,0x0, +0x1c,0xd, 0x17,0x80,0xe8,0x2, 0x6f,0xaa,0xde,0x6d,0xe8,0x2, 0x6c,0x28,0xdd,0xbc, +0x14,0x7, 0x3c,0x10,0xde,0x7b,0xc0,0x4, 0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe8,0x0, +0x4f,0xd9,0x2f,0x83,0xe7,0xfe,0x0, 0xdc,0xe7,0xfd,0x0, 0xcd,0x8, 0xb2,0x11,0x5, +0x3c,0x62,0xc1,0x1, 0xd3,0x71,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, 0xc9,0x1d,0x1, 0xf9, +0x9, 0x61,0xe2,0xff,0x17,0xf0,0xa7,0xf, 0xe0,0x0, 0x1f,0xa1,0x3f,0x7f,0x1, 0x97, +0xe2,0xff,0x17,0xf4,0xa7,0xf, 0xe0,0x0, 0x1f,0xa2,0x3f,0x7f,0x1, 0x90,0xe2,0xff, +0x17,0xf8,0xa7,0xf, 0xe0,0x0, 0x1f,0xa3,0x3f,0x7f,0x1, 0x89,0xe2,0xff,0x17,0xfc, +0xa4,0xf, 0xe0,0x0, 0x1f,0xa4,0xe0,0x28,0x3c,0xf, 0x38,0x82,0x14,0x0, 0x38,0x82, +0xe8,0x0, 0x4f,0xd9,0x27,0x9b,0x8, 0xb1,0xe8,0x0, 0x67,0x9f,0xe0,0x1, 0xa7,0xef, +0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x27,0x85,0xe2,0xff,0x17,0xf8,0x17,0x0, 0xbf,0xf, +0xdf,0xd1,0x24,0x9, 0xe2,0xff,0x17,0xf8,0x17,0x0, 0xbf,0xf, 0x17,0x81,0xe8,0x2, +0x6f,0xb0,0x0, 0x83,0xe8,0x2, 0x6c,0x30,0x8, 0xe1,0x38,0x82,0xe8,0x2, 0x4c,0x30, +0x38,0x82,0x8, 0xb1,0xd5,0x7d,0xe0,0x60,0x3f,0x87,0xe0,0x0, 0x1f,0x9, 0xe0,0x1, +0xbf,0x3f,0xe0,0x0, 0x1f,0x11,0xe0,0x1, 0xbf,0x4f,0xe0,0x0, 0x1f,0x5, 0xe0,0x1, +0xbf,0x6f,0xe0,0x0, 0x1f,0x6, 0xe0,0x2, 0xbf,0x4f,0x8, 0xe1,0xe0,0x0, 0x1e,0xa5, +0xe0,0x2, 0x9f,0x9d,0xe2,0x2, 0xc7,0x80,0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0, +0x27,0x93,0xe0,0x2, 0x9f,0x9d,0x37,0xc9,0xe2,0x0, 0xc7,0x81,0xe8,0x0, 0x6f,0xd9, +0xe4,0x0, 0xcf,0x81,0xa6,0xd, 0xe0,0xe, 0x37,0xa9,0xe7,0xfb,0x17,0xff,0x3f,0xdc, +0x3f,0xce,0xbf,0x8d,0x38,0x82,0x17,0x83,0xe8,0x0, 0x6f,0xd9,0x38,0x82,0xe0,0x0, +0x1f,0xa5,0x17,0x7f,0xb7,0x5f,0xe0,0x1, 0xb7,0x5f,0xe0,0x1e,0x17,0x3, 0xb7,0x3f, +0xe8,0x0, 0x4f,0x59,0x27,0xf, 0xe0,0xa0,0x17,0x14,0xb7,0x7f,0xe0,0x20,0x17,0x4, +0xe0,0x1, 0xb7,0x1f,0xe0,0x1, 0x9f,0x7f,0xe3,0xff,0xc7,0x7b,0xe0,0x1, 0xb7,0x7f, +0x0, 0x90,0x17,0x4, 0xb7,0x7f,0xe0,0x1, 0xb7,0x1f,0xe0,0x1, 0x9f,0x7f,0xcf,0x4, +0xe0,0x1, 0xb7,0x7f,0xe0,0x2, 0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x2, 0xb7,0x1f, +0xa7,0xf, 0xe0,0x10,0xcf,0x0, 0xbf,0xf, 0x17,0x7b,0xe0,0x1, 0xb7,0x3f,0xeb,0x0, +0xcf,0x80,0xa6,0xaf,0x17,0x78,0x3f,0x5d,0xbf,0x2f,0xe1,0x80,0x17,0xb, 0xbf,0x1f, +0x38,0x82,0x8f,0x8, 0x8f,0x98,0xe0,0x1, 0x14,0x7f,0x3f,0x9e,0xe0,0x28,0x3f,0x88, +0x38,0x82,0x8, 0xb4,0xe0,0x0, 0x19,0x83,0x39,0x68,0x39,0x98,0x3c,0x63,0x3a,0x69, +0xdf,0xf1,0x24,0x3, 0x8f,0x83,0x0, 0x88,0xe0,0x0, 0x1f,0x88,0x39,0x1f,0x3c,0x62, +0xdf,0xe9,0x24,0x3, 0x8f,0x82,0xaf,0x84,0xa, 0x61,0xe8,0x0, 0x4f,0xd9,0x27,0x97, +0x8, 0xb1,0xe0,0x0, 0x1c,0x83,0x15,0x16,0xe0,0x1f,0x14,0x0, 0xd2,0xb7,0xe0,0x0, +0x1c,0x88,0x15,0x16,0xe0,0x22,0x14,0x20,0xd2,0xb1,0xea,0x0, 0x7c,0xda,0x14,0x0, +0xdf,0xd9,0xea,0x0, 0x7c,0xd8,0x14,0xe, 0x8, 0xa1,0x0, 0xd4,0x38,0x82,0xe8,0x0, +0x4f,0xd9,0x27,0x9e,0x8, 0xb1,0xc0,0x7c,0x14,0x86,0x15,0x2, 0x3c,0x90,0xe0,0x1f, +0x14,0x0, 0xd2,0x9c,0x5f,0x3, 0xe1,0xff,0x17,0xff,0x3f,0x7f,0x1, 0x8f,0xe0,0x0, +0x1c,0x88,0xe0,0x1, 0x15,0x0, 0xe0,0xa2,0x14,0x20,0xd2,0x90,0xe0,0x0, 0x1c,0x88, +0xe0,0x1, 0x15,0x0, 0xe0,0x1f,0x14,0x0, 0xd2,0x2a,0xc0,0x4, 0x8, 0xe1,0x38,0x82, +0xe0,0x0, 0x1f,0xa6,0x17,0x0, 0xaf,0x7f,0x17,0x7c,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, +0x17,0x88,0xe0,0x61,0x3f,0x91,0x17,0x90,0xe0,0x61,0x3f,0x91,0x38,0x82,0x8, 0xb1, +0xeb,0x0, 0xcf,0x0, 0xa7,0x9e,0xcf,0xc0,0xbf,0x9e,0xdf,0xeb,0xe8,0x0, 0x4f,0xd9, +0x27,0x92,0xe8,0x0, 0x47,0xda,0xe0,0x0, 0x1f,0x26,0xe2,0x1, 0xc7,0xfe,0xe0,0x1, +0xaf,0xbe,0xe0,0x61,0x3f,0x82,0xcf,0x88,0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82, +0xcf,0x90,0x0, 0x8b,0xe0,0x61,0x3f,0x2, 0x17,0xf7,0x3f,0xde,0xe0,0x61,0x3f,0x92, +0xe0,0x61,0x3f,0x2, 0x17,0xef,0x3f,0xde,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0xe, 0xbf, +0xe8,0x0, 0x67,0xcf,0xe0,0x0, 0x1f,0x27,0xc7,0x81,0xe8,0x0, 0x7f,0xcf,0x17,0xdf, +0xa6,0xbe,0x3f,0xdd,0xbf,0xbe,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xad, +0x38,0x0, 0xe0,0x0, 0x1f,0x27,0x17,0x80,0xe8,0x0, 0x7f,0xcf,0x17,0x81,0xbf,0xbe, +0x17,0xfc,0xa6,0xae,0x3f,0xdd,0xcf,0x82,0xbf,0xae,0xe0,0x2, 0x17,0x80,0xb7,0x9e, +0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xe0,0x61,0x3f,0x82,0xe0,0x20,0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x0, 0x1f,0xa7,0x17,0x6f,0xa6,0xbf,0x3f,0x5d, +0xbf,0x3f,0x17,0x0, 0xe8,0x0, 0x7f,0x4f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0x38,0x82, +0xe0,0x0, 0x1f,0x27,0x17,0xef,0xa6,0xbe,0x3f,0xdd,0xbf,0xbe,0x17,0x80,0xe8,0x0, +0x7f,0xcf,0x38,0x82,0xe0,0x0, 0x1f,0xa7,0x17,0x0, 0xbf,0x3f,0xb7,0x1f,0x17,0x7c, +0xa6,0xaf,0x3f,0x5d,0xbf,0x2f,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xe0,0x61, +0x3f,0x2, 0xe7,0xdf,0x17,0xff,0x3f,0xde,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe1,0xff, +0x17,0x7f,0xc4,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7e,0x1, 0x8, 0x17,0x89,0xc7,0xff, +0xe2,0x1, 0xc7,0xff,0x27,0xf7,0x0, 0x0, 0x0, 0xfb,0x38,0x82,0xc0,0x7c,0xe0,0xa0, +0x17,0x80,0x7f,0x81,0xe8,0x2, 0x4f,0x9e,0x27,0x93,0xe0,0x0, 0x1f,0xa5,0xe0,0x1, +0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x1, 0xb7,0x1f,0x16,0xff,0x67,0x1, 0x3e,0x9e, +0x7e,0x81,0x2f,0x7c,0xe0,0x1, 0x9f,0x1f,0xcf,0x4, 0xe0,0x1, 0xb7,0x1f,0xc0,0x4, +0x38,0x82,0xe0,0x0, 0x1f,0xa8,0xa7,0x2f,0xe2,0x0, 0xc7,0x7f,0x27,0xd, 0xa6,0xaf, +0xe7,0xff,0x17,0x0, 0x3f,0x5d,0xcf,0x60,0xbf,0x2f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f, +0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x38,0x82,0xe0,0x0, 0x1f,0xa8,0xa7,0x1f,0xcf,0x1, +0xbf,0x1f,0xe7,0xff,0x17,0x3f,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0x8, 0xb1, +0xdf,0xf4,0xe8,0x0, 0x4f,0xd9,0x27,0x96,0xe0,0x0, 0x1f,0xa8,0xa7,0x2f,0xe0,0x1, +0xcf,0x0, 0xbf,0x2f,0xe7,0xff,0x17,0x0, 0xa6,0xaf,0x3f,0x5d,0xcf,0x60,0xbf,0x2f, +0xa7,0x1f,0xcf,0x2, 0xbf,0x1f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0xa7,0xf, 0xcf,0x40, +0xbf,0xf, 0xe0,0x61,0x3f,0x2, 0xe7,0xf7,0x17,0xff,0x3f,0xde,0xe0,0x61,0x3f,0x92, +0x8, 0xe1,0xe0,0x0, 0x1d,0x8b,0x17,0x80,0x16,0x1, 0xe0,0xe, 0x3d,0x9f,0xc7,0x81, +0xe2,0x0, 0xcf,0x90,0xae,0xe, 0xe0,0x0, 0x1e,0x8b,0x1, 0xf8,0x17,0x83,0xaf,0xbd, +0x17,0x2, 0xaf,0xcd,0x14,0x1, 0xaf,0x6d,0x17,0x0, 0xe0,0x0, 0x1d,0x10,0x3c,0xee, +0xe0,0xf, 0x37,0x22,0x3f,0x9a,0xbc,0x8f,0x16,0x0, 0xe0,0x17,0x3e,0x9e,0xe0,0xb, +0x3e,0x9c,0xf0,0x0, 0x8b,0xb, 0xe8,0x0, 0x8d,0x87,0xf0,0x40,0x3b,0x7b,0x5, 0x87, +0xa5,0x8f,0xe0,0x16,0x34,0x3c,0xe8,0xb, 0x3d,0xc6,0xbd,0x8f,0xc6,0x1, 0xe2,0x0, +0xce,0x10,0x1, 0xee,0xc7,0x1, 0xe2,0x0, 0xcf,0x10,0x1, 0xe3,0xe0,0x0, 0x1f,0x8a, +0x17,0x0, 0xe0,0x6, 0xaf,0xf, 0x38,0x82,0xe8,0x0, 0x4f,0xd9,0x27,0x98,0xe8,0x0, +0x67,0x20,0xa7,0x9e,0xcf,0x81,0xbf,0x9e,0xe8,0x0, 0x67,0x1f,0x9f,0xbe,0xe0,0x1e, +0xcf,0x80,0xb7,0xbe,0xe0,0x61,0x3f,0x2, 0xe7,0xef,0x17,0xff,0x3f,0xde,0xe0,0x61, +0x3f,0x92,0xe8,0x0, 0x67,0x9a,0xe0,0x6, 0x17,0x6, 0xbf,0xf, 0x38,0x82,0xe8,0x0, +0x67,0x9a,0x17,0x0, 0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c, +0xa6,0x8f,0xe7,0x7f,0x17,0x7f,0x3f,0x5d,0xbf,0xf, 0x8c,0x7f,0x38,0x82,0x8, 0xb2, +0xe8,0x0, 0x61,0x1a,0x17,0xfb,0xa7,0x2, 0xe2,0x0, 0xcc,0x1, 0x3f,0xde,0xbf,0x82, +0x1, 0x83,0x14,0x6, 0x0, 0x82,0x14,0x4, 0xe0,0xb, 0xd2,0xa4,0xa7,0x82,0xcf,0x84, +0xbf,0x82,0x9, 0x61,0x8, 0xb2,0xe8,0x0, 0x61,0x1a,0x17,0xfb,0xa7,0x2, 0x14,0x5, +0x3f,0xde,0xbf,0x82,0xe0,0xb, 0xd2,0x96,0xdf,0xd3,0xa7,0x82,0xe2,0x0, 0xc4,0x1, +0xcf,0x84,0xbf,0x82,0x9, 0x61,0x8, 0xb4,0xe8,0x0, 0x61,0x9a,0x17,0xfb,0xa7,0x3, +0xe0,0x1, 0x14,0x1f,0x3f,0xde,0xbf,0x83,0xe0,0xb, 0xd2,0x84,0xdf,0xc1,0x3a,0x68, +0xdf,0xbf,0xe4,0x2, 0x34,0x28,0xe4,0x2, 0x31,0x40,0xdf,0xba,0xa7,0x83,0x3c,0x42, +0xe4,0x4, 0x32,0x20,0xe3,0xff,0xc4,0x7f,0xcf,0x84,0x3c,0x14,0xbf,0x83,0xa, 0x61, +0x8, 0xb4,0xe8,0x0, 0x67,0x1f,0x14,0x1, 0xe0,0x1, 0x9f,0x9e,0x11,0xfb,0xe0,0x80, +0xcf,0x80,0xe0,0x1, 0xb7,0x9e,0xdf,0xb4,0xe8,0x0, 0x61,0x1a,0x14,0x5, 0xa7,0x82, +0x3f,0xd3,0xbf,0x82,0xe0,0xb, 0xd2,0x5e,0xdf,0x9b,0xa7,0x82,0x3a,0x68,0xcf,0x84, +0xbf,0x82,0x14,0x6, 0xa7,0x82,0x3f,0xd3,0xbf,0x82,0xe0,0xb, 0xd2,0x53,0xa7,0x82, +0x14,0x1, 0xcf,0x84,0xbf,0x82,0xa7,0x82,0x39,0xdf,0xb9,0x82,0xe0,0xb, 0xd2,0x4a, +0xe0,0x1, 0x14,0x3, 0x3c,0x54,0xe0,0xb, 0xd2,0x45,0xa7,0x82,0xcf,0x84,0xbf,0x82, +0xdf,0xa2,0x2c,0x7f,0xa, 0x61,0x8, 0xb2,0xe8,0x0, 0x67,0x1a,0x17,0xfb,0xa6,0x8e, +0x39,0x69,0x3f,0xdd,0xbf,0x8e,0xe0,0xb, 0xd2,0x35,0xe4,0xf, 0x31,0x40,0x3c,0x6f, +0xe2,0x1, 0xc4,0x7f,0xe0,0xb, 0xd2,0x2e,0xe0,0xf, 0x31,0x48,0x3c,0x6f,0xe2,0x1, +0xc4,0x7f,0xe0,0xb, 0xd2,0x27,0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0x9, 0x21,0xe1,0x64, +0x0, 0xa1,0x8, 0xb4,0x3a,0x68,0x14,0x1, 0x39,0x69,0x39,0xea,0xdf,0x69,0x3c,0xe4, +0x14,0x2, 0xdf,0xda,0xe8,0x0, 0x67,0x9a,0x3c,0xe2,0x39,0x92,0xe7,0x7f,0x16,0xff, +0x3c,0xf3,0x1, 0xd, 0xe1,0x80,0x87,0x19,0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0x0, 0xf3,0xa7,0xf, 0xcf,0x4, +0xbf,0xf, 0xde,0x52,0xdf,0x60,0x24,0x6, 0xe8,0x0, 0x67,0xcf,0xe2,0x0, 0xcf,0xb2, +0x5, 0xfa,0xe8,0x0, 0x67,0xcf,0xe2,0x0, 0xcf,0xb2,0x2, 0x84,0xa, 0x21,0xe7,0xfc, +0x0, 0xd1,0xe0,0x27,0x14,0x8, 0xa, 0x21,0xe7,0xfc,0x0, 0xeb,0x8, 0xb7,0xe0,0x1, +0x11,0x7f,0x39,0x58,0xe0,0x2, 0x17,0x80,0xe0,0x2, 0x3f,0xa2,0xe3,0xff,0xc1,0x7f, +0x39,0x7a,0x3, 0xaf,0x39,0xea,0x3d,0x62,0x3a,0xe9,0x3a,0x68,0xdf,0xbb,0xe0,0xa, +0x39,0xa2,0x39,0xea,0x3a,0x12,0xe3,0xff,0xc1,0xff,0x39,0x15,0x3b,0x62,0x3a,0xe3, +0xe0,0x7, 0x3a,0x22,0xe2,0x1, 0xca,0xff,0xe0,0x8, 0x3b,0x17,0x5, 0x8c,0x3c,0xe6, +0xe0,0x2, 0x15,0x0, 0xe1,0xfe,0xc2,0x80,0xdf,0xa5,0xe3,0xff,0xc2,0xff,0xe0,0x2, +0xc3,0x0, 0x0, 0xf1,0xe0,0xf, 0x31,0xc8,0xe7,0xfe,0x15,0x0, 0x3d,0x3f,0xe0,0x9, +0x37,0xa8,0x3d,0x13,0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x3a,0x19,0x3c,0x92,0x25,0x2, +0xdf,0x91,0x14,0x1, 0xb, 0xe1,0x8, 0xb2,0x39,0x68,0x14,0x1, 0xde,0xf9,0xe0,0x9, +0x31,0x2c,0x14,0x20,0xdf,0x69,0xe8,0x0, 0x67,0x1a,0xa7,0x8e,0xcf,0x84,0xbf,0x8e, +0xdd,0xf3,0xdf,0x1, 0x24,0x6, 0xe8,0x0, 0x67,0xcf,0xe2,0x3, 0xcf,0xf4,0x5, 0xfa, +0xe8,0x0, 0x67,0xcf,0xe2,0x3, 0xcf,0xf4,0x2, 0x84,0x9, 0x21,0xe7,0xfb,0x0, 0xf2, +0xe0,0x27,0x14,0x8, 0x9, 0x21,0xe7,0xfc,0x0, 0x8c,0x8, 0xb3,0x39,0x69,0x39,0xea, +0xe0,0xb, 0xd1,0x97,0xe8,0x0, 0x67,0x9a,0x39,0x92,0x16,0x80,0xe7,0x7f,0x16,0x7f, +0x39,0x73,0x1, 0xe, 0xae,0xff,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c, +0xa7,0xf, 0x3f,0x5c,0xbf,0xf, 0x8f,0x7f,0xe1,0x80,0xaf,0x12,0x0, 0xf2,0xa7,0xf, +0xcf,0x4, 0xbf,0xf, 0x9, 0xe1,0x8, 0xb1,0xe0,0x0, 0x1c,0x87,0xe0,0xa2,0x14,0x0, +0x15,0x16,0xdf,0xdc,0xe0,0x0, 0x1f,0x87,0xe1,0xff,0x17,0x7f,0x9c,0xf, 0x9e,0x9f, +0x3e,0x98,0x3e,0xfe,0x1, 0x9f,0xe0,0x1, 0x9f,0x1f,0xe0,0x1, 0x9e,0x2f,0x3e,0x1e, +0x3e,0x7d,0x1, 0x98,0x24,0x18,0x9d,0xaf,0x9e,0xbf,0x3e,0x9b,0x3e,0xfc,0x1, 0x92, +0x9e,0x4f,0x9f,0xdf,0x3f,0x9c,0x3f,0xfd,0x1, 0x8d,0xe4,0xe, 0x37,0x20,0x3c,0x4e, +0xe8,0x0, 0x7c,0x4d,0xe2,0xf0,0x17,0x80,0xe8,0x0, 0x64,0x4d,0xe1,0x28,0x3f,0xa8, +0x0, 0x82,0x14,0x0, 0x8, 0xe1,0xe8,0x0, 0x67,0x20,0xa7,0x9e,0xe0,0x80,0xcf,0x80, +0xbf,0x9e,0xe0,0x0, 0x17,0x60,0xe8,0x0, 0x67,0x97,0xbf,0x1f,0x17,0x0, 0xbf,0x3f, +0xe8,0x0, 0x4f,0x59,0xe2,0x0, 0xcf,0x1, 0x1, 0x8d,0x17,0x35,0xe0,0x3, 0xaf,0x7f, +0xe0,0xe, 0x17,0x1, 0xbf,0xf, 0xe0,0x61,0x3f,0x2, 0xe7,0xff,0x17,0xbf,0x3f,0xde, +0x0, 0x88,0x2f,0x9, 0xe0,0x1e,0x17,0x10,0xbf,0xf, 0xe0,0x61,0x3f,0x82,0xcf,0xc0, +0xe0,0x61,0x3f,0x92,0xe0,0x0, 0x17,0xc0,0xe0,0x61,0x3f,0x91,0x38,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3d,0xe8,0x0, 0x4f,0xd9,0xe8,0x0, 0x61,0x9f,0xe2,0x0, 0xcf,0x81, +0xe0,0x1, 0x1, 0xae,0xe0,0x3, 0x9f,0x93,0xe2,0x1, 0xc7,0xf0,0xe2,0x1, 0xcf,0xf0, +0xe0,0x1, 0x1, 0x26,0xe0,0x2, 0x12,0x80,0xe0,0x2, 0x17,0x82,0x9f,0x5, 0x9f,0x8f, +0x3f,0x9e,0xe1,0xff,0x17,0x7f,0x3f,0xfe,0x1, 0xd, 0xe0,0x2, 0x17,0x9c,0xa7,0xf, +0xe3,0xff,0xc7,0x7f,0xbf,0xf, 0xa7,0xf, 0xe8,0xab,0xcf,0x3b,0xbf,0xf, 0xe0,0x1, +0x0, 0x8f,0xe8,0x0, 0x61,0x17,0x13,0x0, 0x13,0xfe,0xf0,0xe, 0x15,0x41,0xf7,0xff, +0x15,0xfc,0xf0,0x0, 0x14,0xe0,0xf0,0xe, 0x14,0x1, 0x9a,0x5, 0x32,0x42,0xe0,0x1d, +0x32,0x48,0xe2,0x1, 0xc2,0x7f,0xf2,0xf, 0x3e,0xc4,0xe2,0x6, 0x3b,0x4f,0xe2,0x1, +0xc3,0x7f,0xe0,0xb, 0xd1,0x7b,0xf0,0x40,0x3e,0x68,0x2c,0x7c,0xe0,0x2, 0x9f,0x93, +0x14,0xd, 0x3f,0xd7,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd1,0x56,0x14,0x5, 0xe0,0xb, +0xd1,0x53,0xe8,0x40,0x3c,0x6c,0xe0,0xb, 0xd1,0x4f,0xe8,0x40,0x3c,0x6c,0xe0,0xb, +0xd1,0x4b,0xe8,0x40,0x3c,0x6d,0xe0,0xb, 0xd1,0x47,0x3c,0x64,0xe0,0xb, 0xd1,0x44, +0x3c,0x66,0xe0,0xb, 0xd1,0x41,0x14,0xe, 0xe0,0xb, 0xd1,0x3e,0xe0,0x1, 0x14,0x1, +0xe0,0xb, 0xd1,0x3a,0xe8,0x40,0x3c,0x6c,0xe0,0xb, 0xd1,0x36,0xe0,0x2, 0x9f,0x93, +0xcf,0x81,0xe0,0x2, 0xb7,0x93,0x24,0x20,0xa7,0xb2,0xcf,0x81,0xbf,0xb2,0xf0,0x0, +0xbd,0x2, 0xf0,0x1, 0xb6,0x12,0x9f,0x85,0x37,0xc2,0xe0,0x1, 0xb7,0xb2,0xa7,0xe2, +0xe8,0xf, 0x3f,0xdb,0xcf,0x81,0xbf,0xe2,0x17,0x9f,0xbf,0xb2,0xa7,0x92,0x37,0xca, +0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x12,0x17,0xfe,0x3f,0xde,0xbf,0x92,0xa7,0x82, +0xe0,0x1, 0xcf,0x80,0xbf,0x82,0xe0,0xb, 0xd1,0x29,0x3a,0x68,0x2c,0x7d,0xe8,0x0, +0x67,0x97,0xf0,0x0, 0xbc,0x9f,0xbc,0x3f,0x14,0xf, 0xf0,0x0, 0xbc,0xf, 0xe0,0x2, +0x9f,0x93,0x3f,0xd7,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd0,0xfe,0xe0,0x1, 0x14,0x1, +0xe0,0xb, 0xd0,0xfa,0x3c,0x64,0xe0,0xb, 0xd0,0xf7,0xe0,0x2, 0x9f,0x93,0xcf,0x81, +0xe0,0x2, 0xb7,0x93,0xe7,0xff,0x24,0x3, 0xe7,0xfe,0x0, 0xe9,0xe0,0xef,0x14,0x19, +0xe0,0xb, 0xd2,0x4, 0x17,0x80,0xe0,0x3, 0xb7,0x93,0xf8,0x0, 0xe, 0xa8,0xb, 0xe1, +0xea,0x0, 0xcc,0x2, 0xe0,0x2, 0xcc,0x0, 0x14,0x80,0xea,0x0, 0xcd,0x2, 0xe0,0x2c, +0xcd,0x58,0x3d,0x28,0xd0,0xb4,0xea,0x0, 0xcc,0x0, 0xe0,0x0, 0xcc,0x0, 0x24,0x2, +0x3c,0x1, 0x14,0x0, 0x14,0x80,0xd0,0x3e,0x3a,0x80,0x0, 0x0, 0x3a,0x80,0xe0,0x40, +0x17,0x80,0xe2,0xb0,0x16,0x80,0xa6,0xf, 0xe0,0xe, 0x3f,0x9d,0xc7,0x84,0xe2,0x4f, +0xcf,0xf0,0xbe,0xe, 0x1, 0xf9,0x38,0x82,0x8, 0xb1,0x3f,0x83,0xdb,0x68,0xdb,0x88, +0xdf,0xef,0xe0,0x61,0x3f,0x2, 0x17,0xf7,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x61, +0x3f,0x2, 0x17,0xef,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xdd,0x3f,0xde,0xdd,0xdb,0xce, +0xdc,0x51,0xdb,0x40,0xdc,0xff,0x3b,0x0, 0xdb,0x1c,0x8, 0xa1,0xe7,0xf9,0x0, 0xd9, +0xe8,0x0, 0x4f,0xd9,0x27,0x8e,0x8, 0xb1,0xdb,0x32,0x24,0xa, 0xdd,0x7d,0xe8,0x0, +0x7c,0x46,0xdd,0x97,0xdc,0x5, 0xef,0xff,0xd7,0x39,0xdc,0xac,0x0, 0xfd,0x8, 0xe1, +0x38,0x82,0x8, 0xb1,0xdf,0xd2,0xde,0xec,0xdc,0xa5,0xde,0xbe,0xda,0xd1,0xdf,0xe9, +0xdc,0x62,0xdc,0xa0,0xde,0xb9,0xe0,0xb, 0xd2,0xfc,0x0, 0x80,0x15,0x0, 0x0, 0x81, +0x3c,0xf8,0x17,0x81,0x3, 0x90,0xe2,0x0, 0xcc,0x80,0x4, 0xd, 0x16,0x0, 0x34,0xa1, +0x37,0xa1,0xe1,0x2e,0x3c,0x19,0xe1,0x2d,0x3f,0x8c,0x27,0x13,0x26,0x92,0xe2,0x0, +0xcc,0x80,0x3, 0x76,0x17,0x0, 0x3c,0x79,0x4, 0x83,0x3c,0x29,0x3f,0x4f,0x37,0xc1, +0x34,0xc1,0x2f,0xfa,0xe2,0x0, 0xcd,0x0, 0xe0,0x6e,0x39,0xa8,0x3c,0x6e,0x38,0x82, +0x3f,0x6f,0x2f,0xf1,0x0, 0xf8,0x0, 0x0, 0x3d,0xe8,0xe2,0x0, 0xcd,0x3, 0x5, 0xad, +0xe0,0xc, 0x3c,0x49,0xe2,0x0, 0xc6,0x3, 0x2e,0x28,0xc5,0x7c,0xe0,0xc, 0x35,0x21, +0xea,0x0, 0xce,0x80,0xe0,0x31,0xce,0xbc,0xe2,0x0, 0xc6,0x18,0xe1,0x80,0xa7,0x19, +0x3e,0xac,0xe0,0xc, 0x35,0x44,0x3f,0xee,0xe0,0x0, 0x3e,0x82,0xe1,0x80,0xa7,0x19, +0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99,0xe1,0x80,0xbf,0x1b,0xe1,0x80,0xa7,0x19, +0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99,0xe1,0x80,0xbf,0x1b,0xc6,0x7f,0x6, 0x6f, +0xe1,0x80,0xbf,0x9b,0xe2,0x0, 0xc5,0x3, 0xc5,0x7f,0x6, 0x87,0xe1,0x80,0x86,0x19, +0xc5,0x7f,0xe1,0x80,0xae,0x1b,0x6, 0x7b,0x38,0x82,0x0, 0x0, 0xe2,0x0, 0xcd,0x3, +0x5, 0xaf,0xe2,0x1, 0xc4,0xff,0xe0,0xc, 0x34,0xa8,0x3c,0xcc,0xe4,0xc, 0x34,0xa0, +0x3c,0xcc,0xe0,0x41,0x3e,0x48,0xe2,0x0, 0xc6,0x3, 0xe0,0xb, 0x3e,0x18,0xe0,0xc, +0x3d,0x2c,0xe0,0xd, 0x36,0x44,0xe2,0x0, 0xc6,0xc, 0xea,0x0, 0xcf,0x80,0xe0,0x32, +0xcf,0xa8,0x3f,0xac,0xe0,0x0, 0x3f,0x82,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b, +0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b,0xc6,0xff,0x6, 0x77,0x3d,0x18,0xe0,0xc0, +0xac,0xba,0xac,0x9a,0xac,0xaa,0xac,0x88,0xac,0x98,0xac,0xa8,0x38,0x82,0x3d,0xe8, +0xc5,0x7f,0x6, 0x85,0xe1,0x80,0xac,0x9b,0xc5,0x7f,0x6, 0x7d,0x38,0x82,0x8, 0xb1, +0xe0,0x60,0x3c,0x87,0xea,0x4, 0x7f,0x80,0xe0,0x0, 0x15,0x60,0x3c,0x6f,0xdf,0x85, +0xe0,0x60,0x3c,0x17,0x8, 0xe1,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x14,0xc4,0x0, 0x2, 0x16,0x48,0x0, 0x1, 0x79,0x88, +0x0, 0x0, 0x10,0x4e,0x0, 0x2, 0x14,0xac,0x0, 0x2, 0x15,0x44,0x0, 0x0, 0x4, 0xb2, +0x0, 0x2, 0x15,0xc4,0x0, 0x2, 0x15,0xf8,0x0, 0x0, 0x5, 0x2c,0x0, 0x2, 0x5, 0x2c, +0x0, 0x2, 0x3, 0x0, 0x0, 0x2, 0x4, 0xc, 0x0, 0x2, 0x16,0x8, 0x0, 0x0, 0x5, 0x34, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5, 0x1c,0x80,0xb6,0x80,0xb, 0x1, 0x0, 0x0, 0x0, +0x1, 0x3, 0x70,0x0, 0x80,0x0, 0xd, 0x0, 0x80,0x0, 0x9, 0x0, 0x80,0x0, 0x8, 0x0, +0x80,0x0, 0x7, 0x0, 0x80,0x0, 0x6, 0x0, 0x80,0x0, 0x4, 0x0, 0x80,0x0, 0x3, 0x0, +0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x1, 0x0, 0x80,0x0, 0x0, 0x0, 0x55,0x50,0x47,0x52, +0x41,0x44,0x45,0x20,0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0x80,0x0, 0x1, 0x0, +0x80,0x0, 0x4, 0x0, 0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x3, 0x0, 0x55,0x50,0x47,0x52, +0x41,0x44,0x45,0x20,0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xe8,0x0, 0x67,0x1a,0xac,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa6,0x8e,0xe7,0x7f,0x17,0xff,0x3f,0xdd,0xbf,0x8e,0x14,0x1, 0x38,0x82,0x8, 0xb2, +0xe8,0x0, 0x67,0x1a,0x17,0xfb,0xa6,0x8e,0x39,0x68,0x3f,0xdd,0xbf,0x8e,0x14,0xb, +0xdf,0xe8,0xe4,0xf, 0x31,0x40,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdf,0xe2,0xe0,0xf, +0x31,0x48,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdf,0xdc,0x3c,0x62,0xe2,0x1, 0xc4,0x7f, +0xdf,0xd8,0x14,0x0, 0x9, 0x21,0x0, 0xd5,0x8, 0xb3,0xc0,0x7c,0x39,0x6a,0x39,0xe9, +0xdf,0xdf,0x16,0x8, 0xe8,0x0, 0x67,0x9a,0xe0,0xa, 0x31,0x42,0x3e,0x10,0x15,0x80, +0xe7,0x7f,0x14,0xff,0xc5,0x7f,0xe3,0xff,0xcd,0x7f,0x1, 0x15,0xe2,0x0, 0x7f,0x4, +0xad,0xff,0xa6,0x8f,0xe2,0x80,0xc6,0x80,0x26,0xfd,0xa6,0x8f,0x3e,0xd9,0xbe,0x8f, +0x8e,0xff,0xe1,0x80,0xae,0x9e,0x3f,0x7c,0x1, 0xf4,0x67,0x1, 0xc1,0x84,0xe0,0x40, +0xbf,0x13,0x0, 0xe9,0xa7,0xf, 0x14,0x1, 0xcf,0x4, 0xbf,0xf, 0xc0,0x4, 0x9, 0xe1, +0xe8,0x0, 0x66,0xa0,0xe2,0x0, 0xcd,0x1, 0xa7,0x9d,0xe0,0x40,0xcf,0x80,0xbf,0x9d, +0xe8,0x0, 0x67,0x9b,0x1, 0x83,0x17,0x2, 0x0, 0x82,0x17,0x0, 0xe0,0x9, 0xb7,0x5f, +0x17,0x21,0xb4,0x5f,0x35,0x28,0xe0,0x1, 0xb4,0xdf,0xe0,0x1, 0xcd,0x11,0xb7,0x3f, +0x17,0x18,0xe0,0x2, 0xb7,0x5f,0xb5,0x1f,0xe0,0x7, 0x97,0x1f,0xe2,0x0, 0xcf,0x0, +0x9f,0x1f,0x4, 0xc, 0xe2,0x0, 0xc7,0x8, 0xe4,0xe, 0x37,0x20,0xe4,0xe, 0x37,0x40, +0x27,0x74,0x9f,0x1f,0xcf,0x4, 0xb7,0x1f,0x0, 0xf0,0xe0,0x80,0xcf,0x0, 0xb7,0x1f, +0x17,0x0, 0xb7,0x1f,0xe0,0x5, 0x9c,0x5f,0xa7,0x1d,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x9d,0x38,0x82,0xe8,0x0, 0x67,0x17,0xe0,0x1, 0xac,0x3e,0xa7,0x9e,0xe2,0x0, +0xc7,0x81,0x27,0xfd,0xe8,0x0, 0x66,0x9f,0xe0,0x2, 0x9f,0x9d,0xe2,0x0, 0xc7,0x82, +0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0,0x27,0xf8,0xa6,0x9e,0x17,0xfe,0x3f,0xdd, +0xbf,0x9e,0xe0,0x1, 0x8c,0x3e,0x38,0x82,0xe8,0x0, 0x67,0x9f,0xe0,0x6, 0x8f,0x7f, +0xe0,0x2, 0x9c,0x1f,0xe2,0x1, 0xcf,0x2b,0x1, 0x87,0x17,0x80,0xe2,0x0, 0xc4,0x4, +0xe0,0x28,0x3c,0xf, 0x38,0x82,0xe3,0x0, 0xc4,0x0, 0xe4,0x8, 0x34,0x20,0xe4,0x8, +0x34,0x40,0x38,0x82,0x0, 0x80,0x0, 0x80,0xe, 0x3f,0xe8,0x0, 0x4f,0xd9,0xe0,0x1, +0x2f,0x88,0xe8,0x0, 0x66,0x97,0xa7,0xbd,0xe2,0x0, 0xc7,0x81,0xe0,0x1, 0x2f,0x81, +0xa7,0x9d,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x27,0xfc,0xa7,0x1d,0x17,0xfe,0x3f,0xde, +0xbf,0x9d,0xe8,0x2, 0x4f,0xc4,0xe0,0x1, 0x8e,0x3d,0x2f,0x85,0xe8,0x2, 0x6e,0x43, +0xe8,0x2, 0x6f,0xc2,0xe8,0x2, 0x4f,0x43,0xe2,0x1, 0xcf,0x2, 0x1, 0x19,0x2, 0x86, +0xe2,0x0, 0xcf,0x5, 0x1, 0xa, 0xe0,0x0, 0x0, 0xc7,0xe2,0x1, 0xcf,0x14,0x1, 0x21, +0xe2,0x1, 0xcf,0x21,0x1, 0x2e,0x0, 0xbf,0x2f,0x87,0xe8,0x2, 0x46,0x2a,0x17,0x2, +0xe0,0x1, 0xae,0x3d,0x0, 0xa8,0xe2,0x0, 0xcf,0x81,0x1, 0xba,0x0, 0xa0,0x2f,0x88, +0x17,0x1, 0xe8,0x2, 0x6f,0x40,0xe8,0x2, 0x6f,0x41,0x17,0x1, 0x0, 0xb2,0xe2,0x0, +0xcf,0x81,0x1, 0xae,0xe0,0x0, 0x1f,0x4, 0xe8,0x2, 0x6f,0xc2,0xae,0xe, 0x0, 0xa8, +0x2f,0x86,0xe8,0x2, 0x47,0x28,0xe0,0x1, 0xaf,0x3d,0x0, 0x8c,0xe2,0x0, 0xcf,0x82, +0x1, 0x9f,0xe0,0x0, 0x1f,0x4, 0xe0,0x1, 0x86,0x3d,0xae,0xe, 0x17,0x1, 0x0, 0x96, +0x2f,0x86,0x17,0x3, 0xe8,0x2, 0x6f,0x41,0x3f,0x6f,0x0, 0x93,0xe0,0x0, 0x1f,0x4, +0xe0,0x1, 0x86,0x3d,0x3f,0x1f,0xae,0xe, 0xe8,0x2, 0x4f,0x41,0x3f,0x7f,0x5, 0xef, +0x17,0x0, 0x0, 0x8b,0x17,0x1, 0xe8,0x2, 0x6f,0x41,0xe8,0x2, 0x6f,0x42,0x17,0x0, +0xe8,0x2, 0x4e,0x41,0x3e,0x7f,0x5, 0x84,0xc7,0x81,0xe8,0x2, 0x6f,0xc4,0xe8,0x2, +0x4f,0xc2,0x27,0x89,0x17,0x80,0xe8,0x2, 0x6f,0xc4,0xe8,0x2, 0x6f,0xc3,0x17,0x81, +0xe8,0x2, 0x6f,0xc9,0x2f,0x5, 0xa7,0x8d,0xe0,0x10,0xcf,0x80,0xbf,0x8d,0xe0,0x0, +0x17,0xc0,0xe0,0x61,0x3f,0x91,0xf, 0xac,0x38,0x0, 0x8, 0xb2,0x99,0xa, 0x9f,0x9a, +0xe1,0xff,0x17,0x7f,0x3f,0x92,0x3f,0xfe,0x1, 0x8c,0x34,0xc1,0x34,0x41,0x15,0x1, +0xe3,0xff,0xc4,0xff,0xe3,0xff,0xc4,0x7f,0xde,0xf4,0xe0,0x28,0x39,0x8, 0x0, 0x82, +0x14,0x0, 0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x11,0x0, 0xe0,0x2, 0x15,0x4, 0x3c,0xe2, +0x14,0x0, 0xdf,0xe4,0x24,0x26,0xe0,0x2, 0x17,0x92,0x9c,0x8f,0xe0,0x2, 0x17,0x94, +0x9f,0xf, 0xe1,0xff,0x16,0x7f,0x3f,0x19,0xe0,0x2, 0x16,0x82,0x3f,0x7c,0x9f,0x82, +0x9e,0x8d,0x1, 0x97,0x3e,0x9f,0x3e,0xfe,0x1, 0x94,0xe4,0x9, 0x34,0xa0,0x3c,0xcf, +0xe2,0xf0,0x17,0x80,0x3c,0xff,0x2, 0x8d,0x17,0x83,0x3f,0xd9,0x2f,0x8a,0xe0,0x2, +0x15,0x8, 0xe1,0xfc,0xc4,0xe0,0xe0,0x3, 0x14,0x20,0x9, 0x21,0xe7,0xff,0x0, 0xbf, +0x14,0x0, 0x9, 0x61,0x8, 0xb2,0x11,0x3, 0xe8,0x0, 0x65,0x4d,0x14,0x80,0xe0,0xa0, +0x14,0x0, 0xde,0x8b,0xdf,0xc8,0x2c,0x7, 0xc1,0x7f,0xe2,0x1, 0xc1,0x7f,0x29,0x75, +0x3c,0x62,0x0, 0x82,0x14,0x1, 0x9, 0x61,0x8, 0xb5,0xe8,0x0, 0x4f,0xd9,0x3a,0x68, +0xe2,0x0, 0xcf,0x81,0xe2,0x1, 0xc2,0x7f,0xe0,0x2, 0x34,0x48,0x1, 0x96,0xe8,0x0, +0x61,0x9f,0x12,0xfe,0xe0,0x2, 0x9f,0x93,0xe0,0x1, 0x14,0x2, 0x3f,0xd5,0xe0,0x2, +0xb7,0x93,0xde,0xd1,0x3c,0x62,0xde,0xcf,0xe0,0x2, 0x9f,0x93,0x3a,0x78,0xcf,0x81, +0xe0,0x2, 0xb7,0x93,0x1, 0xf0,0x0, 0xa9,0x2f,0xa8,0xe8,0x0, 0x67,0x1f,0xe8,0x2, +0x6f,0xc9,0xe0,0x2, 0x9e,0x9e,0xe0,0x0, 0x1e,0x4, 0xe1,0x0, 0xce,0x80,0xe0,0x2, +0xb6,0x9e,0xe0,0x2, 0x9e,0x9e,0xe3,0xff,0xc6,0xfb,0xe0,0x2, 0xb6,0x9e,0xe8,0x0, +0x67,0x17,0xe8,0x2, 0x4e,0xc0,0x26,0xfe,0xe8,0x2, 0x6f,0xc0,0xe0,0x1, 0xaa,0x3e, +0xa6,0x8e,0xe0,0x10,0xce,0x80,0xbe,0x8e,0xe8,0x2, 0x4e,0xc9,0x26,0xfe,0xe8,0x2, +0x6f,0xc9,0x8e,0x8c,0x39,0x7d,0x1, 0xee,0xa, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xe8,0x0, 0x61,0x17,0xe8,0x0, 0x61,0x9f,0x13,0x3, 0x12,0x82,0xf0,0x0, 0x14,0x0, +0x13,0xfc,0xf0,0x1e,0x14,0x80,0xf0,0x0, 0x15,0x17,0xf7,0x0, 0x15,0x80,0xf7,0xef, +0x16,0x7f,0xf0,0xe, 0x16,0xc1,0xe8,0x0, 0x4f,0xd9,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x1, 0xce,0xde,0x9b,0x2c,0x7f,0xe8,0x0, 0x67,0xcd,0xe8,0x0, 0x62,0x4d,0xe2,0x20, +0xcf,0x80,0x5, 0x83,0x32,0x43,0x3a,0x57,0x3d,0x64,0x14,0x80,0xe0,0xa0,0x14,0x0, +0xde,0xc, 0xf8,0x0, 0x67,0x17,0xe0,0xa0,0x14,0x0, 0xe8,0x0, 0xa7,0xee,0x3c,0xe4, +0x3f,0xd7,0xcf,0x81,0xe8,0x0, 0xbf,0xee,0x3c,0x14,0xf8,0x1, 0xb4,0x1e,0xe8,0x0, +0x67,0xcd,0x37,0xc2,0xe8,0x1, 0xb7,0xbe,0x17,0x9f,0xf8,0x0, 0xbe,0x8e,0xe8,0x0, +0xbf,0xbe,0xe8,0x0, 0x65,0x4d,0x3d,0x24,0xdd,0xf0,0xe8,0x0, 0xa7,0x9e,0x37,0xca, +0xe2,0x0, 0xc7,0x81,0x27,0xfb,0xdf,0x27,0xe2,0x0, 0xcc,0x0, 0x17,0x80,0xe0,0x6f, +0x39,0xa5,0x3a,0xef,0xde,0x62,0x24,0x7f,0xe8,0x0, 0x67,0x9f,0xe0,0x2, 0x9f,0x9f, +0xe2,0x0, 0xc7,0x82,0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0,0xe2,0x0, 0xcf,0x80, +0x17,0x81,0xe0,0x6f,0x39,0x25,0x3a,0xef,0x0, 0xb7,0xe8,0x0, 0x67,0xcd,0x37,0xc2, +0xe0,0x1, 0xb7,0xb2,0xf0,0x1, 0xb4,0x12,0xa7,0xe2,0x3f,0xd7,0xcf,0x81,0xbf,0xe2, +0xf0,0x0, 0xbc,0x82,0xf0,0x0, 0xbd,0x32,0xe0,0x2, 0x9f,0x93,0xe2,0xff,0xc7,0xff, +0xe0,0x2, 0xb7,0x93,0xe0,0x2, 0x9f,0x93,0xcf,0x84,0xe0,0x2, 0xb7,0x93,0xa7,0x92, +0x37,0xca,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xde,0xee,0xa7,0x82,0x24,0x6, 0xe0,0x10, +0xcf,0x80,0xbf,0x82,0x12,0x81,0x0, 0x84,0xe8,0xf, 0x3f,0xdc,0xbf,0x82,0xe0,0x2, +0x9f,0x93,0xe8,0xf, 0x3f,0xcb,0xe0,0x2, 0xb7,0x93,0xe0,0x2, 0x9f,0x93,0xe3,0xff, +0xc7,0xfb,0xe0,0x2, 0xb7,0x93,0xc3,0x7f,0xe2,0x1, 0xc3,0x7f,0x23,0x5, 0xe2,0x0, +0xca,0x81,0xe7,0xfe,0x1, 0xf2,0x3c,0x65,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x8, 0xb2, +0xe8,0x0, 0x4c,0x59,0x24,0x5, 0xef,0xf4,0xdb,0xf0,0xe0,0x0, 0x24,0x4c,0xe8,0x0, +0x4f,0xd9,0xe2,0x0, 0xcf,0x83,0x1, 0x84,0x9, 0x21,0xe7,0xfd,0x0, 0xed,0xe2,0x0, +0xcf,0x81,0x1, 0xa9,0xe1,0x76,0x14,0x55,0xde,0xf8,0xe8,0x0, 0x61,0x1f,0xe0,0x1, +0x14,0x21,0xe0,0x2, 0x9f,0x92,0xe3,0xff,0xc7,0xfe,0xe0,0x2, 0xb7,0x92,0xdd,0xd3, +0xe8,0x0, 0x67,0xcd,0xe4,0xf, 0x37,0xc0,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdd,0xcb, +0xe8,0x0, 0x67,0xcd,0x37,0xc8,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdd,0xc4,0xe8,0x0, +0x64,0x4d,0xe2,0x1, 0xc4,0x7f,0xdd,0xbf,0xe0,0x2, 0x9f,0x92,0xcf,0x81,0xe0,0x2, +0xb7,0x92,0x0, 0x95,0x2f,0x97,0xe1,0x76,0x14,0x55,0xde,0xcf,0xe8,0x2, 0x4f,0xc9, +0x27,0xfe,0x17,0x80,0xe0,0x0, 0x1f,0x4, 0xe8,0x2, 0x6f,0xc9,0xaf,0x8e,0x9f,0x8e, +0x9f,0x1e,0xe4,0xf, 0x37,0xa0,0x3f,0xce,0xe8,0x0, 0x7f,0xcd,0x9, 0x21,0xe7,0xfe, +0x0, 0x86,0x9, 0x61,0xe0,0x0, 0x1f,0x29,0xe2,0xff,0x17,0xf0,0xbf,0xf, 0xe2,0xff, +0x17,0xf4,0xe0,0x0, 0x1f,0x2a,0xbf,0xf, 0xe2,0xff,0x17,0xf8,0xe0,0x0, 0x1f,0x2b, +0xbf,0xf, 0xe2,0xff,0x17,0xfc,0xe0,0x0, 0x1f,0x2c,0xbf,0xf, 0x38,0x82,0x8, 0xb1, +0xdf,0x97,0xe8,0x0, 0x4f,0xd9,0x27,0x93,0xe2,0x0, 0xcc,0x1, 0x1, 0xa, 0x17,0x80, +0xe0,0x2, 0x17,0x4, 0xbf,0x8e,0xe0,0x2, 0x17,0x8, 0xbf,0x8e,0x2c,0x2, 0xdf,0xdb, +0x3f,0x83,0xe8,0x0, 0x67,0x9f,0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x0, 0x80,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0x0, 0x0, 0x60,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0xe0,0x60,0x3c,0x0, 0xcc,0x2, 0xe0,0x60,0x3c,0x10,0xea,0x0, 0xc8,0x3, 0xe0,0xff, +0xc8,0x7c,0xfa,0x0, 0xcf,0x82,0xf0,0x37,0xcf,0x88,0xea,0x0, 0xcc,0x0, 0xe0,0x0, +0xcc,0x0, 0xe0,0x60,0x3c,0x17,0xea,0x0, 0xcc,0x2, 0xe0,0x0, 0xcc,0x0, 0xea,0x0, +0xcc,0x81,0xe0,0x88,0xcc,0xa4,0x3c,0x79,0x1, 0x8, 0xea,0x0, 0xcd,0x2, 0xe0,0x46, +0xcd,0x28,0x3d,0x28,0xe0,0x9, 0xdf,0x36,0xea,0x0, 0xcc,0x0, 0xe0,0xf7,0xcc,0x44, +0x3c,0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x67,0x4c,0x98,0xb3,0xec,0x7c,0x13,0x83,0xf0,0xa, 0xf, 0xf5,0xda,0x25,0x14,0xeb, +0x0, 0x0, 0x0, 0x1, 0xff,0xfe,0x0, 0x0, 0x0, 0x0, 0xc8,0x37,0x0, 0x0, 0x80,0xa6, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x8, 0xb5,0xc0,0x68,0xe0,0x3, 0x1f,0x84,0x15,0x80,0x95,0x3f,0xe0,0x2, 0x1f,0xfd, +0x3e,0x6a,0xe3,0xff,0xc6,0x7f,0xf0,0x0, 0x8b,0x4f,0xf0,0x0, 0x8b,0xdf,0xe0,0x2, +0x1f,0xfc,0xe4,0x3, 0x36,0x22,0x7d,0x81,0xe4,0x3, 0x31,0xc0,0x7d,0x82,0x7d,0x83, +0x7d,0x84,0x7d,0x85,0x7d,0x86,0x99,0xf, 0x24,0x39,0xe2,0x0, 0xcc,0x1, 0x1, 0x3, +0xc0,0x18,0xa, 0xe1,0xf0,0x0, 0x23,0x74,0x14,0xff,0xe0,0x2, 0x1f,0x81,0xe8,0x9, +0x3c,0x97,0xa4,0xf, 0xe2,0x1, 0xc4,0xff,0x34,0xa1,0xf0,0x4, 0x33,0xa1,0x3d,0x68, +0xe0,0x0, 0xc4,0x82,0xf0,0x0, 0x23,0x8b,0xe0,0xd, 0x3c,0x9a,0x3f,0xea,0x97,0xf, +0x3f,0x1c,0xe1,0x80,0xb7,0x1f,0x3e,0xff,0x1, 0xfb,0xc5,0x81,0xe2,0x1, 0xc5,0xff, +0xf0,0x40,0x3b,0x7b,0x3d,0x14,0x1, 0xef,0x16,0x8c,0x3e,0x92,0xe3,0xff,0xc6,0xff, +0xe0,0xf, 0x31,0x21,0x3f,0x98,0x97,0xf, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0x3f,0x13, +0x39,0x7d,0xb7,0xf, 0x1, 0xf6,0xc0,0x18,0xa, 0xe1,0xe0,0x2, 0x1a,0x81,0xe0,0x2, +0x1f,0x0, 0xa7,0x85,0xe2,0x1, 0xc5,0x7f,0xe9,0xff,0xc7,0xfe,0x37,0xc1,0x3c,0xea, +0x37,0x41,0xe2,0x0, 0x7c,0x4, 0xf0,0x0, 0x6b,0x85,0xe0,0x43,0x3a,0x13,0xf0,0x0, +0x6b,0x4, 0x7f,0x3, 0x7f,0x84,0x7f,0x85,0xe0,0x9, 0xda,0xa4,0x15,0x8c,0x3d,0x92, +0xa6,0x5, 0xe0,0x1, 0x1d,0x7f,0xe3,0xff,0xc5,0xff,0xe0,0x41,0x3c,0xc4,0x0, 0x8a, +0x97,0xf, 0x3f,0x13,0xb7,0xf, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0x39,0x7b,0xe7,0xff, +0x1, 0x21,0xe0,0x6, 0x17,0xa8,0x3f,0x92,0x37,0xa1,0x3f,0x9a,0x96,0x9f,0xe0,0xe, +0x31,0x21,0x3a,0x7d,0x3f,0xee,0x3f,0x9c,0x4, 0x6c,0x3e,0xf9,0xe0,0xf, 0x31,0x21, +0x3f,0x9c,0x3, 0x6a,0x97,0xf, 0x3f,0x23,0xb7,0xf, 0x0, 0xe6,0xe0,0x2, 0x1f,0x81, +0xa4,0xf, 0xe7,0xff,0x0, 0xab,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3a,0xe0,0x2, +0x1f,0xe6,0xe0,0x2, 0x1e,0xfd,0x87,0xf, 0x39,0xeb,0xe0,0x3, 0x8e,0x2d,0x15,0x8e, +0x3d,0xb3,0xe0,0x3, 0x1f,0xac,0xe2,0x0, 0xc7,0x1, 0x3e,0x7e,0x3f,0x9b,0x3a,0x68, +0x3a,0xe9,0x3b,0x6a,0x8b,0x9f,0xf0,0x0, 0x8d,0x3f,0xe0,0x1, 0x1, 0x3b,0x99,0x5d, +0x3c,0x63,0xe0,0x3, 0xdc,0x72,0xf0,0x40,0x3c,0x68,0xe0,0x2, 0xd9,0xf4,0xe0,0xc, +0x15,0x52,0x14,0x80,0x3c,0x64,0xe0,0x9, 0xde,0x2f,0xf0,0x1, 0x2c,0x23,0xe8,0x7, +0x3b,0xca,0xe0,0x0, 0x2b,0xec,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f, +0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, 0xc7,0x40,0x3f,0xdc, +0x3f,0xce,0xb7,0x8d,0xc1,0x5, 0xf0,0x0, 0x14,0x80,0x3c,0xe3,0xe8,0x40,0x3c,0x69, +0xe0,0x2, 0xda,0x7b,0x24,0x7b,0xe0,0x1, 0x1d,0xfe,0x17,0x80,0xe0,0xe, 0x37,0xa1, +0xe0,0xd, 0x3a,0x1e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0x14,0x1, 0xe0,0x2, 0xda,0xd, 0xf0,0x0, +0x24,0x27,0xe0,0x1, 0x1d,0xfd,0x17,0x80,0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3a,0x9e, +0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2, +0xb7,0xd, 0x5, 0x73,0xe0,0x3, 0x19,0x30,0xe4,0x0, 0xc1,0x85,0x3c,0x64,0xe0,0xf, +0x39,0x13,0x8c,0xcf,0xe0,0x2, 0xdb,0x3c,0x2b,0x95,0x39,0x13,0x8c,0xc2,0x3c,0x65, +0xe0,0x2, 0xdb,0x36,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0xe0,0x3, 0x19,0x30, +0xe4,0x0, 0xc1,0x85,0x3c,0x64,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0xe0,0x2, 0xdb,0x28, +0x23,0xf2,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0x3c,0x66,0xe0,0x2, 0xdb,0x21,0xf7,0xff, +0x2c,0x66,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0xe0,0xc, 0x15,0x52,0x14,0x80, +0x3c,0x66,0xe0,0x9, 0xdd,0xb9,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f, +0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, 0xc7,0x40,0x3f,0xdc, +0x3f,0xce,0xb7,0x8d,0xf0,0x0, 0x14,0x84,0xf7,0xff,0x25,0xe, 0x3c,0xe3,0xe8,0x40, +0x3c,0x69,0xe0,0x2, 0xda,0xa, 0x24,0x7b,0xe0,0x1, 0x1d,0xfc,0xc1,0x5, 0x17,0x80, +0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3b,0x1e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81, +0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0xe7,0xfe,0x0, 0xf5, +0xe0,0xc, 0x15,0x52,0x14,0x80,0x3c,0x65,0xe0,0x9, 0xdd,0x86,0xe7,0xfe,0x0, 0xd9, +0x99,0x6d,0xe7,0xfe,0x0, 0xc7,0xe0,0x2, 0x1f,0x81,0xe0,0x1, 0x1d,0x7b,0xa4,0x8f, +0x3c,0x69,0xe0,0x8e,0x0, 0x9c,0xe0,0x0, 0x1f,0x8e,0xf0,0x40,0x3a,0x68,0xf0,0x0, +0x88,0x8f,0xe0,0x1, 0x14,0x7f,0xf0,0x0, 0x20,0xe5,0xf0,0x0, 0x1b,0xd, 0xf0,0x40, +0x3a,0xe8,0x17,0x0, 0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0x11,0x82,0xf0,0x0, 0x10,0x3, +0x0, 0x9e,0xf1,0x2c,0x39,0xad,0xe0,0x0, 0x26,0x43,0xf0,0x0, 0x12,0x82,0xe8,0x40, +0x3e,0xe5,0x3f,0xe8,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe8,0x40, +0x3e,0x65,0x5, 0x82,0x3e,0x68,0x3c,0x6c,0xe2,0x1, 0xc4,0x7f,0xc7,0x1, 0xe2,0x1, +0xc7,0x7f,0xe8,0x40,0x3f,0x71,0xf0,0x0, 0xc3,0x2, 0x1, 0x38,0x3d,0x7e,0x1, 0x77, +0xe8,0x0, 0x8e,0x86,0xe8,0x0, 0x8e,0x16,0xf0,0xf, 0x3a,0x2d,0xe2,0x0, 0xcf,0x80, +0xe8,0x17,0x3e,0xa4,0xf2,0x1, 0xc3,0xff,0xe0,0xd, 0x3c,0xac,0xe2,0x1, 0xc7,0xff, +0xe8,0x6f,0x3d,0x27,0x3e,0x29,0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc6,0x7f,0xe2,0x1, +0xc6,0xff,0xf1,0x37,0x39,0x2f,0xe0,0x6d,0x3d,0x2c,0xf0,0x0, 0x23,0x85,0xf1,0x2c, +0x39,0x2d,0x2e,0x15,0xf1,0x2c,0x39,0xaf,0xe7,0xff,0x2e,0x3d,0x25,0xc1,0xf1,0x2f, +0x38,0x2f,0xe7,0xff,0x27,0xbe,0xf0,0x40,0x38,0x7d,0xe8,0x40,0x3f,0xe0,0xe8,0x6f, +0x3c,0xa5,0xf0,0x40,0x3a,0xef,0xe7,0xff,0x0, 0xb4,0x38,0x82,0x14,0x1, 0x38,0x82, +0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0x30,0xf0,0x40, +0x3e,0x6a,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1d,0xd, 0xe4,0x0, 0xc5,0x8a,0x3e,0xea, +0x3e,0x9b,0x3f,0x9a,0x16,0x0, 0xe0,0x2, 0x1f,0x7d,0xe0,0x10,0xae,0x1d,0xf0,0x40, +0x3c,0xe8,0xe0,0x10,0xae,0x2d,0xe8,0x40,0x3c,0x6c,0x8e,0xf, 0x8f,0x9f,0x89,0x4e, +0x89,0xde,0x7d,0x90,0xf0,0x40,0x3f,0x69,0x7e,0xa, 0x7f,0x88,0xe0,0x6, 0xd6,0xc4, +0x14,0x83,0xe0,0x9, 0xdc,0x45,0xe0,0x1, 0x1e,0xd7,0xe0,0x43,0x3c,0x18,0xe0,0x1, +0x93,0xcd,0x67,0xa, 0x3b,0xf8,0xe0,0x67,0x3c,0x28,0xe8,0x40,0x3f,0x79,0xe0,0x3, +0x3, 0xa9,0x67,0x8a,0x17,0x1, 0xe8,0xe, 0x3f,0x19,0x3f,0x1f,0x17,0x80,0xe2,0x1, +0xc7,0x7f,0x3b,0x6f,0x66,0x88,0xe8,0x40,0x3e,0xfe,0xe0,0x3, 0x3, 0x87,0x66,0x88, +0x11,0x1, 0xe8,0x2, 0x39,0x1e,0x39,0x1d,0x16,0x80,0xe2,0x1, 0xc1,0x7f,0x7e,0x89, +0x3f,0x9d,0xe0,0x1, 0x1e,0xfa,0x37,0xa1,0x3f,0x9d,0xe0,0x1, 0x1e,0xd7,0x37,0xc1, +0x65,0x89,0x86,0x1d,0x7f,0x93,0xe0,0xa, 0x3f,0x16,0x67,0x89,0xe0,0x1, 0x1e,0xf9, +0x3d,0x92,0x36,0xc1,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc5,0xff,0xe0,0x0, 0x6f,0xc4, +0xe2,0x0, 0x7c,0x44,0x17,0x80,0x7e,0x94,0xe0,0x0, 0x6f,0x47,0xe0,0x0, 0x6e,0x48, +0xe0,0x0, 0x6f,0xc9,0x7d,0xb, 0x7d,0x8c,0xe0,0x0, 0x6b,0x45,0xe0,0x0, 0x69,0x46, +0xe0,0x9, 0xd7,0x43,0xe0,0x1, 0x1f,0xf8,0x66,0xb, 0xf0,0x0, 0x9c,0xf, 0xe0,0x1, +0x1f,0xf7,0x3e,0x76,0xf0,0x0, 0x9d,0x8f,0xe0,0x1, 0x1f,0xf6,0xf4,0x18,0x34,0x20, +0xf0,0x0, 0x9d,0xf, 0xe0,0x1, 0x1f,0xf5,0xf4,0x1b,0x35,0xa0,0x9e,0x8f,0xe0,0x1, +0x1f,0xf4,0xf4,0x1a,0x35,0x20,0x9f,0xf, 0xe0,0x1, 0x1f,0xf3,0xf0,0x18,0x3c,0x1d, +0x9f,0x8f,0xf0,0x1b,0x3d,0x9e,0xf0,0x1a,0x3d,0x1f,0x16,0x80,0xe0,0x1, 0x5, 0xcc, +0xe0,0xe, 0x39,0xb6,0x66,0x89,0xe0,0x1, 0x1d,0x57,0xe0,0x2c,0xc7,0x1f,0x3f,0x1d, +0x37,0x21,0x8a,0x9a,0xe0,0x1, 0x1d,0x7f,0xc7,0x7e,0x3f,0x1a,0x67,0x8a,0xc1,0x7f, +0xe2,0x1, 0xc1,0x7f,0x7f,0x6, 0x16,0x2, 0x67,0x9, 0x65,0x8, 0xe0,0xb, 0x3b,0x2f, +0x31,0xa1,0xe0,0xf, 0x31,0x21,0x3f,0x9c,0xf1,0x39,0x3c,0x9c,0x79,0x8d,0xe3,0xff, +0xc5,0xff,0xe4,0x3, 0x33,0x28,0x3f,0x2a,0xf1,0x2c,0x3f,0x1c,0x16,0x80,0x7d,0x87, +0x3a,0x63,0x7f,0xe, 0x7f,0x8f,0xf0,0x0, 0x7c,0x82,0x7e,0x5, 0xe4,0x4, 0x32,0x48, +0x66,0xc, 0x67,0x9, 0x3e,0x7e,0xe0,0x1, 0x5, 0x85,0x67,0x86,0x61,0xf, 0xf0,0x40, +0x3f,0x6f,0x39,0x1f,0x67,0x8a,0x67,0xe, 0xf0,0x0, 0x66,0x89,0xe0,0xf, 0x3b,0x2f, +0x66,0x7, 0xe3,0xff,0xc7,0x7f,0x7f,0x83,0xe8,0x40,0x3f,0xee,0xe0,0x43,0x39,0x9c, +0xf8,0x40,0x3f,0x6d,0xf0,0x40,0x3c,0xee,0x7b,0x4, 0xf0,0x40,0x3e,0xef,0x0, 0xbb, +0x67,0x3, 0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0x52,0x66,0x2, 0xe0,0x0, 0x26,0x5e, +0x67,0x5, 0x15,0x81,0xe0,0x0, 0x27,0x5a,0xe8,0x40,0x3d,0x6c,0x3c,0x64,0x7e,0x81, +0xde,0x93,0x15,0x7e,0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0xb, 0x33,0x1, 0xe2,0x0, +0xcd,0x1, 0xc4,0x7f,0xe0,0x43,0x3d,0x9b,0xe2,0x1, 0xc4,0x7f,0xe0,0x66,0x3d,0xab, +0xe2,0x0, 0xcc,0x2, 0x66,0x81,0x2, 0x8b,0x65,0x4, 0xe8,0xb, 0x3b,0x3e,0x3d,0x36, +0xf0,0x1a,0x3d,0x2b,0xf0,0x1b,0x3d,0xaa,0xf0,0x18,0x3c,0x26,0x17,0x1, 0xe8,0xe, +0x3f,0x19,0xf0,0x40,0x3e,0xf2,0xf0,0x40,0x3c,0xee,0xf3,0xff,0xc4,0xff,0xf0,0x0, +0xc7,0x1, 0x1, 0x2e,0xe8,0x80,0x97,0x9d,0xe8,0x40,0x3c,0xee,0x3f,0xa5,0xe0,0x43, +0x3b,0x1f,0xe2,0x0, 0xcb,0x0, 0xe2,0x1, 0xc4,0xff,0x5, 0x69,0x15,0x81,0x3d,0x9d, +0x3b,0xf6,0xe2,0x1, 0xc5,0xff,0xe0,0x6d,0x3d,0x2b,0xe2,0x0, 0xc9,0x80,0xe7,0xff, +0x2, 0x31,0xe3,0xff,0xc9,0xff,0xe7,0xff,0x4, 0x32,0xe8,0x43,0x3d,0x99,0xe2,0x0, +0xcd,0x80,0xe0,0x0, 0x5, 0x7d,0x67,0x88,0xf0,0xb, 0x3f,0x2f,0xe2,0x0, 0xcd,0x81, +0x5, 0x4e,0x66,0x2, 0xe7,0xff,0x2e,0x26,0x15,0x80,0xe7,0xff,0x0, 0xa7,0x63,0x4, +0x66,0x6, 0x65,0xd, 0x67,0x7, 0x3e,0x1a,0xc3,0x1, 0xe4,0x4, 0x33,0x28,0x7e,0x6, +0xc7,0x1, 0x66,0xb, 0xe4,0xf, 0x32,0x48,0xe3,0xff,0xc7,0x7f,0x3e,0x7f,0x7f,0x7, +0xe7,0xfe,0x2, 0xe6,0xf2,0x0, 0xcc,0x0, 0x11,0x81,0x3d,0x63,0xe8,0x6a,0x39,0xa8, +0x3c,0xea,0xf0,0x8, 0x35,0xa6,0xf0,0x40,0x3c,0x6a,0x7e,0x81,0xe0,0x9, 0xdb,0x3b, +0x66,0x10,0xe0,0x0, 0x19,0xd, 0xc4,0x20,0x39,0x1c,0xe0,0x7, 0xb4,0x62,0xe8,0x40, +0x3c,0xe8,0xf0,0x8, 0x35,0x26,0xe0,0x9, 0xdb,0x2e,0x17,0xa0,0x3f,0x98,0xe0,0x7, +0xb7,0xf2,0xe8,0x40,0x3c,0x6c,0xe0,0x6, 0xd5,0x5f,0xe2,0x0, 0xcc,0x0, 0x39,0x68, +0x66,0x81,0xe0,0x1, 0x5, 0x0, 0xe0,0x1, 0x1f,0x57,0xe0,0x43,0x39,0x12,0xe0,0x2, +0x8c,0xfe,0x2c,0x85,0x17,0x94,0xe0,0x2, 0xaf,0xfe,0x14,0x94,0xe8,0x40,0x3c,0x68, +0x7e,0x81,0xe0,0x9, 0xdb,0x10,0x3c,0x72,0x3c,0xe2,0xe0,0x62,0x3d,0xa8,0xe0,0x0, +0x14,0x7f,0x3c,0x32,0x66,0x10,0xe0,0x0, 0x19,0xd, 0x39,0x1c,0xe0,0x9, 0xdb,0x3, +0xe0,0x10,0xac,0x12,0x66,0x81,0x67,0xa, 0x67,0x88,0xe2,0x0, 0xce,0xad,0xe0,0x10, +0xae,0xa2,0xe0,0x10,0xaf,0x32,0xe0,0x10,0xaf,0xc2,0x5, 0x84,0x17,0xad,0xe0,0x10, +0xaf,0xa2,0xe0,0x0, 0xc0,0x50,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe3,0xff,0xcd,0xff, +0xe7,0xfe,0x3, 0x56,0xe7,0xfe,0x0, 0xab,0x16,0xff,0x3e,0x93,0x66,0x8, 0xe8,0xd, +0x3e,0xae,0x3e,0x7d,0x2, 0x31,0x3e,0xec,0xf0,0x2, 0x37,0x21,0xe8,0xd, 0x3e,0xae, +0xc1,0x1, 0xe2,0x1, 0xc6,0xff,0x7e,0x89,0xe2,0x1, 0xc1,0x7f,0xe7,0xfc,0x0, 0xf2, +0x17,0xff,0x3f,0x92,0xe8,0xf, 0x3f,0xa9,0x3f,0x7f,0x2, 0xf, 0x63,0xa, 0xf0,0xe, +0x34,0xa1,0xe8,0x6, 0x3b,0x29,0xc7,0x1, 0xe2,0x1, 0xc3,0x7f,0xe2,0x1, 0xc7,0x7f, +0xe0,0xf, 0x3b,0x33,0xe7,0xfc,0x0, 0xd0,0x63,0xa, 0x66,0xa, 0xe8,0x6, 0x3b,0x29, +0xe8,0xe, 0x39,0x19,0xe2,0x1, 0xc3,0x7f,0x3f,0x2c,0xe0,0xf, 0x3b,0x33,0xe2,0x1, +0xc7,0x7f,0xe7,0xfc,0x0, 0xc1,0x66,0x88,0x66,0x8, 0xe8,0x2, 0x39,0x9e,0xe8,0xd, +0x3e,0xae,0x39,0x2c,0xe2,0x1, 0xc6,0xff,0x7e,0x89,0xe2,0x1, 0xc1,0x7f,0xe7,0xfc, +0x0, 0xc1,0x39,0x63,0xe7,0xff,0x0, 0x81,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff, +0xc0,0x34,0xf0,0x40,0x3e,0x6a,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1d,0xd, 0xe4,0x0, +0xc5,0x8a,0x3e,0xea,0x3e,0x9b,0x3f,0x9a,0x16,0x0, 0xe0,0x2, 0x1f,0x7d,0xe0,0x10, +0xae,0x1d,0xf0,0x40,0x3c,0xe8,0xe0,0x10,0xae,0x2d,0xe8,0x40,0x3c,0x6c,0x8e,0xf, +0x8f,0x9f,0x89,0x4e,0x89,0xde,0x7d,0x8f,0xf0,0x40,0x3f,0x69,0x7e,0xa, 0x7f,0x88, +0xe0,0x6, 0xd4,0xb2,0x14,0x83,0xe0,0x9, 0xda,0x33,0xe0,0x1, 0x1e,0xd7,0xe0,0x43, +0x3c,0x18,0xe0,0x1, 0x93,0xcd,0x67,0xa, 0x3b,0xf8,0xe0,0x67,0x3c,0x28,0xe8,0x40, +0x3f,0x79,0xe0,0x3, 0x3, 0xa1,0x17,0x81,0x66,0xa, 0xe8,0xf, 0x3f,0x99,0x3f,0x9c, +0x17,0x0, 0xe2,0x1, 0xc7,0xff,0x3b,0x6e,0x66,0x8, 0xe8,0x40,0x3e,0x7e,0xe0,0x3, +0x3, 0x81,0x66,0x8, 0x16,0x81,0xe8,0xd, 0x3e,0x9e,0x3e,0x9c,0x16,0x0, 0xe2,0x1, +0xc6,0xff,0x7e,0x9, 0x3e,0x1e,0xe0,0x1, 0x1a,0x72,0x36,0x21,0xa7,0x4, 0xe0,0xa, +0x3f,0x96,0x3f,0x1c,0xe0,0x1, 0x1e,0x57,0xe9,0xff,0xc7,0x7e,0x85,0x9c,0x37,0x41, +0xe0,0x1, 0x1e,0x79,0x61,0x9, 0x7f,0x12,0x36,0x41,0x67,0x9, 0xe2,0x1, 0xc5,0x7f, +0xe0,0x0, 0x6f,0xc3,0xe2,0x0, 0x7c,0x40,0x17,0x80,0x39,0x1d,0xe0,0x0, 0x6f,0x40, +0xe2,0x1, 0xc1,0x7f,0xe0,0x0, 0x6e,0xc2,0xe0,0x0, 0x6f,0xc5,0x7d,0xb, 0x7e,0x13, +0xe0,0x0, 0x6b,0x41,0xe0,0x0, 0x6d,0xc4,0xe0,0x9, 0xd5,0x2f,0xe0,0x1, 0x1f,0xf8, +0xf0,0x0, 0x9c,0xf, 0xe0,0x1, 0x1f,0xf7,0xf4,0x18,0x34,0x20,0xf0,0x0, 0x9d,0x8f, +0xe0,0x1, 0x1f,0xf6,0xf4,0x1b,0x35,0xa0,0xf0,0x0, 0x9d,0xf, 0xe0,0x1, 0x1f,0xf5, +0xf4,0x1a,0x35,0x20,0x9e,0x8f,0xe0,0x1, 0x1f,0xf4,0xf0,0x18,0x3c,0x1d,0x9f,0xf, +0xe0,0x1, 0x1f,0xf3,0xf0,0x1b,0x3d,0x9e,0x9f,0x8f,0x16,0x80,0xf0,0x1a,0x3d,0x1f, +0x67,0x8b,0x3f,0xf6,0xe0,0x1, 0x5, 0xc4,0xe0,0xf, 0x3b,0x33,0x66,0x89,0xa5,0x84, +0x3f,0x9d,0x66,0x8a,0x37,0xa1,0xe0,0xc, 0x3b,0x2d,0xe3,0xff,0xc6,0x7f,0x3d,0x9f, +0x7e,0x7, 0x17,0x2, 0x66,0x9, 0x67,0x88,0xe0,0x1, 0x1d,0x57,0x3e,0x2f,0x7e,0xd, +0x31,0xa1,0x66,0x9, 0xf1,0x39,0x3c,0x9e,0x79,0x8c,0xe4,0xc, 0x36,0x28,0xe4,0x3, +0x33,0x28,0xf1,0x2e,0x3f,0x1e,0x8a,0x9a,0x16,0x80,0x7d,0x86,0x3a,0x63,0x7e,0xe, +0xf0,0x0, 0x7c,0x82,0xe0,0x0, 0x7f,0x5, 0xe4,0x4, 0x32,0x48,0x67,0x9, 0x39,0x7e, +0xe0,0x1, 0x5, 0x84,0xf0,0x0, 0x67,0x6, 0x67,0x87,0x67,0xd, 0x66,0xa, 0xf0,0x0, +0x66,0x89,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x39,0x9f,0xe0,0xc, 0x3b,0x2c,0xe8,0x40, +0x3f,0xee,0x64,0x8e,0xf8,0x40,0x3f,0x6d,0x7e,0x3, 0xf0,0x40,0x3c,0xee,0x7b,0x4, +0xf0,0x40,0x3e,0xef,0x0, 0xbe,0x66,0x3, 0xe2,0x0, 0xce,0x1, 0xe0,0x0, 0x5, 0x53, +0x67,0x82,0xe0,0x0, 0x27,0xdf,0x66,0x5, 0x15,0x81,0xe0,0x0, 0x26,0x5b,0xe8,0x40, +0x3d,0x6c,0x3c,0x64,0x7e,0x81,0xdc,0x88,0x15,0x7e,0x3d,0x18,0xe2,0x1, 0xc5,0x7f, +0xe0,0xb, 0x33,0x1, 0xe2,0x0, 0xcd,0x1, 0xc4,0x7f,0xe0,0x43,0x3d,0x9b,0xe2,0x1, +0xc4,0x7f,0xe0,0x66,0x3d,0xab,0xe2,0x0, 0xcc,0x2, 0x66,0x81,0x2, 0x8b,0x65,0x4, +0xe8,0xb, 0x3b,0x3e,0x3d,0x36,0xf0,0x1a,0x3d,0x2b,0xf0,0x1b,0x3d,0xaa,0xf0,0x18, +0x3c,0x26,0xf0,0x0, 0xc7,0x1, 0xf4,0x9, 0x37,0x28,0x17,0x1, 0xe4,0xf, 0x34,0xc8, +0xe8,0xe, 0x3f,0x19,0x39,0x7f,0xf0,0x40,0x3c,0xee,0xf3,0xff,0xc4,0xff,0x5, 0xac, +0xe9,0x80,0x97,0x9d,0xe4,0x9, 0x34,0xc8,0x3f,0xa5,0xe0,0x43,0x3b,0x1f,0xe2,0x0, +0xcb,0x0, 0x5, 0x68,0x15,0x81,0x3d,0x9d,0x3b,0xf6,0xe2,0x1, 0xc5,0xff,0xe0,0x6d, +0x3d,0x2b,0xe2,0x0, 0xc9,0x80,0xe7,0xff,0x2, 0x30,0xe3,0xff,0xc9,0xff,0xe7,0xff, +0x4, 0x31,0xe8,0x43,0x3d,0x99,0xe2,0x0, 0xcd,0x80,0xe0,0x0, 0x5, 0x7d,0x67,0x8, +0xf0,0xb, 0x3f,0x2e,0xe2,0x0, 0xcd,0x81,0x5, 0x4d,0x67,0x82,0xe7,0xff,0x2f,0xa5, +0x15,0x80,0xe7,0xff,0x0, 0xa6,0x63,0x4, 0x66,0x6, 0x65,0xc, 0x67,0x7, 0x3e,0x1a, +0xc3,0x1, 0xe4,0x4, 0x33,0x28,0x7e,0x6, 0xc7,0x1, 0x66,0xb, 0xe4,0xf, 0x32,0x48, +0xe3,0xff,0xc7,0x7f,0x3e,0x7f,0x7f,0x7, 0xe7,0xfe,0x2, 0xe8,0xf2,0x0, 0xcc,0x0, +0x11,0x81,0x3f,0x63,0xe8,0x6e,0x39,0xa8,0x3c,0xee,0xf0,0x8, 0x35,0xa6,0xf0,0x40, +0x3c,0x6e,0x7e,0x81,0xe0,0x9, 0xd9,0x2f,0x67,0x8f,0xe0,0x0, 0x19,0xd, 0xc4,0x20, +0x39,0x1f,0xe0,0x7, 0xb4,0x62,0xe8,0x40,0x3c,0xe8,0xf0,0x8, 0x35,0x26,0xe0,0x9, +0xd9,0x22,0x17,0xa0,0x3f,0x98,0xe0,0x7, 0xb7,0xf2,0xe8,0x40,0x3c,0x6c,0xe0,0x6, +0xd3,0x53,0xe2,0x0, 0xcc,0x0, 0x39,0x68,0x66,0x81,0xe0,0x0, 0x5, 0x7e,0xe0,0x1, +0x1d,0x57,0xe0,0x43,0x39,0x12,0xe0,0x2, 0x8c,0xfa,0x2c,0x85,0x17,0x94,0xe0,0x2, +0xaf,0xfa,0x14,0x94,0xe8,0x40,0x3c,0x68,0x7e,0x81,0xe0,0x9, 0xd9,0x4, 0x3c,0x72, +0x3c,0xe2,0xe0,0x62,0x3d,0xa8,0xe0,0x0, 0x14,0x7f,0x3c,0x32,0x66,0xf, 0xe0,0x0, +0x19,0xd, 0x39,0x1c,0xe0,0x9, 0xd8,0xf7,0xe0,0x10,0xac,0x12,0x66,0x81,0x67,0xa, +0x67,0x88,0xe2,0x0, 0xce,0xad,0xe0,0x10,0xae,0xa2,0xe0,0x10,0xaf,0x32,0xe0,0x10, +0xaf,0xc2,0x5, 0x84,0x17,0xad,0xe0,0x10,0xaf,0xa2,0xe0,0x0, 0xc0,0x4c,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe3,0xff,0xcd,0xff,0xe7,0xfe,0x3, 0x55,0xe7,0xfe,0x0, 0xaa, +0x16,0xff,0x3e,0x93,0xe8,0xd, 0x3e,0xae,0x3e,0x7d,0x2, 0x30,0xf0,0xd, 0x37,0x21, +0xe8,0xc, 0x3e,0x2e,0xc6,0x81,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, 0xc6,0xff, +0xe7,0xfc,0x0, 0xfa,0x17,0xff,0x3f,0x92,0xe8,0xf, 0x3f,0xa9,0x3f,0x7f,0x2, 0xf, +0x3b,0x6e,0xf0,0xf, 0x34,0xa1,0xe8,0x6, 0x3b,0x29,0xc7,0x81,0xe2,0x1, 0xc3,0x7f, +0xe2,0x1, 0xc7,0xff,0xe0,0xe, 0x3b,0x33,0xe7,0xfc,0x0, 0xd8,0x63,0xa, 0x66,0x8a, +0xe8,0x6, 0x3b,0x29,0xe8,0xf, 0x39,0x19,0xe2,0x1, 0xc3,0x7f,0x3f,0xad,0xe0,0xe, +0x3b,0x33,0xe2,0x1, 0xc7,0xff,0xe7,0xfc,0x0, 0xc9,0x66,0x8, 0x65,0x8, 0xe8,0xd, +0x39,0x9e,0xe8,0xc, 0x3e,0x2e,0x3e,0xaa,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, +0xc6,0xff,0xe7,0xfc,0x0, 0xc9,0x39,0x63,0xe7,0xff,0x0, 0x83,0xe2,0x0, 0xcc,0x1, +0x1, 0x11,0x4, 0x9b,0xc4,0x7c,0xe2,0x0, 0xcc,0x1, 0x5, 0x8c,0xe0,0x1, 0x1f,0x7d, +0xe0,0x1, 0x1f,0xf1,0xbf,0xf, 0xe0,0x1, 0x1f,0x70,0xe0,0x2, 0x1f,0x81,0xbf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0x7c,0xe0,0x1, 0x1f,0xf1,0xbf,0xf, 0xe0,0x1, 0x1f,0x6f, +0xe0,0x2, 0x1f,0x81,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x7e,0xe0,0x1, 0x1f,0xf1, +0xe2,0x0, 0xcc,0x82,0xbf,0xf, 0x1, 0x7, 0xe0,0x1, 0x1f,0x6e,0xe0,0x2, 0x1f,0x81, +0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x6d,0xe0,0x2, 0x1f,0x81,0xbf,0xf, 0x38,0x82, +0x8, 0xb5,0xe0,0x2, 0x19,0x7a,0x8f,0x82,0x2f,0xb6,0xe0,0x1, 0x19,0xf1,0xe0,0x1, +0x1a,0x72,0xa4,0x83,0xa4,0x4, 0xe0,0x2, 0x1a,0x81,0xe0,0x4, 0xd2,0x8f,0xe0,0x2, +0x1f,0xfc,0x14,0x8c,0x9f,0x8f,0xa5,0x4, 0x3c,0x9f,0xa5,0x83,0xa4,0x5, 0xe3,0xff, +0xc4,0xff,0x0, 0x88,0xc7,0x81,0x9e,0x8c,0xe3,0xff,0xc7,0xff,0x3f,0xf9,0xb6,0x8e, +0x1, 0x19,0x8e,0x82,0xe0,0xe, 0x37,0xa1,0xe2,0x0, 0xce,0x81,0xe0,0xc, 0x3d,0x9e, +0x3f,0x1a,0x1, 0xf1,0xe0,0xe, 0x37,0xa1,0x3e,0xec,0xe0,0xc, 0x3c,0x1e,0x9e,0x8d, +0x96,0xc, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1a,0x3e,0xac,0x3f,0xf9,0xb6,0x8e, +0x1, 0xe9,0xa, 0xe1,0xe0,0x2, 0x1a,0x81,0xe0,0x1, 0x19,0xf1,0xe0,0x1, 0x1a,0x72, +0xa5,0x5, 0xa4,0x83,0xa4,0x4, 0x15,0x81,0xe0,0x4, 0xd2,0x39,0x0, 0xc9,0xe0,0x0, +0x1f,0x8e,0x8f,0x8f,0x27,0xbc,0x14,0x7f,0x3c,0x1f,0xe0,0x2, 0x1f,0xfd,0xe2,0x1, +0xc4,0x7f,0xf0,0x0, 0x8b,0x5f,0xc4,0x1, 0xe0,0x0, 0x1e,0x8d,0xe0,0x1, 0x1f,0xf2, +0x34,0x21,0xf7,0xff,0x12,0xff,0xf0,0x0, 0xa3,0x8f,0xf8,0x15,0x3a,0x96,0x3c,0x1d, +0x14,0x80,0x0, 0x88,0x3e,0x7b,0x4, 0x1e,0xc7,0x7f,0xaf,0x1d,0xc6,0x82,0x3c,0x7d, +0x1, 0x1e,0x8f,0x8d,0x8f,0x1d,0xe8,0xf, 0x3f,0xb6,0x3e,0x69,0x3f,0x9e,0x37,0xa1, +0xf0,0xb, 0x3b,0x9f,0x95,0xb, 0x27,0x3, 0xe0,0x40,0x96,0x1b,0xe8,0x40,0x3f,0x75, +0x3d,0xe9,0x3, 0x4, 0xe8,0xf, 0x3f,0x97,0x95,0x9f,0x3d,0x7c,0x4, 0x64,0x3d,0x7b, +0x3, 0x66,0xc7,0x1, 0xaf,0x1d,0xc6,0x82,0x3c,0x7d,0x1, 0xe4,0x38,0x82,0x0, 0x0, +0x8, 0xb4,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0xc3,0x17,0x0, 0x8d,0x8f,0xe0,0x0, +0x19,0xd, 0xe0,0xc, 0x35,0xc3,0x3f,0xee,0x3e,0xee,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0x3f,0x12,0x3f,0xfc,0xe0,0xf, 0xae,0x8e,0x3f,0x6f,0x5, 0x78,0xe0,0x1, 0x1e,0x57, +0xe0,0x1, 0x1f,0xf2,0xe0,0x2, 0x1d,0x7d,0xf0,0x1, 0x93,0xc, 0xa7,0xf, 0xf0,0x0, +0x91,0xac,0xf0,0x0, 0x92,0x3c,0xf0,0x0, 0x92,0xfc,0xe0,0x3, 0x1e,0x40,0xf0,0x0, +0x80,0xca,0xf0,0x0, 0x81,0x5a,0xe4,0x0, 0x17,0x80,0xe2,0x0, 0x7c,0xae,0xe0,0x1, +0x1d,0x79,0xf0,0x0, 0x83,0x8c,0xe0,0x0, 0x1a,0xe, 0xe0,0x0, 0x19,0x8c,0x3f,0x1f, +0x3f,0x99,0x16,0x0, 0x37,0x41,0x37,0xc1,0x35,0x41,0xc5,0xff,0xe2,0x0, 0x7c,0x84, +0xe2,0x0, 0x7c,0x14,0xae,0x84,0xae,0x83,0xe0,0x1a,0xb6,0x52,0xe0,0x1a,0xb6,0x62, +0xe0,0x1a,0xb6,0x72,0xe0,0x1b,0xb6,0x12,0x7f,0x6, 0x7f,0x88,0x7d,0x7, 0xf0,0x0, +0x73,0x15,0x6d,0x96,0xf0,0x0, 0x6b,0x97,0xf0,0x0, 0x68,0x95,0xf0,0x0, 0x69,0x14, +0xf0,0x0, 0x71,0x92,0xf0,0x0, 0x72,0x13,0xf0,0x0, 0x72,0x94,0xe0,0x9, 0xd2,0x2d, +0x55,0x7, 0x5f,0x8, 0xe0,0x1a,0xb5,0x72,0xe0,0xb, 0x37,0x48,0xe0,0x0, 0x1d,0xb, +0x5f,0x86,0xaf,0xa, 0xe0,0xd, 0x37,0xc8,0xe0,0x0, 0x1f,0xa, 0xf0,0x0, 0x4b,0x84, +0xad,0x8e,0xe0,0x0, 0x1f,0x9, 0x4c,0x5, 0xf0,0x0, 0x53,0x3, 0x54,0x84,0x56,0x5, +0xaf,0x8e,0xe0,0x0, 0x1f,0x88,0xf0,0x0, 0xab,0x84,0xac,0x3, 0xf0,0x1a,0xb3,0x52, +0xe0,0x1a,0xb4,0xe2,0xe0,0x1b,0xb6,0x12,0xae,0x8f,0xf0,0x0, 0x23,0xa5,0xe0,0x1, +0x1d,0x6c,0xe0,0x0, 0x1e,0xd, 0x17,0x80,0xf0,0x0, 0x13,0x1, 0xe0,0xe, 0x37,0xc3, +0xe2,0x0, 0xc7,0x1f,0x3f,0x12,0x16,0x87,0xe0,0xf, 0x84,0x8e,0x3e,0xdf,0xe0,0x80, +0x9d,0x9a,0xf0,0xd, 0x33,0x3d,0x3e,0xc9,0xc7,0x81,0xe0,0xf, 0xae,0x8e,0xe2,0x1, +0xc7,0xff,0xe0,0xe, 0x35,0xc8,0xaf,0xc, 0xf0,0x40,0x3b,0xff,0xc6,0x2, 0xe0,0x40, +0xad,0x9c,0x1, 0xe5,0x24,0x19,0x15,0xff,0x3d,0x98,0xe2,0x1, 0xc5,0xff,0x35,0xa1, +0xe2,0x0, 0x7e,0xae,0xe0,0x0, 0x1f,0x8d,0xe2,0x0, 0x7f,0x2c,0xe0,0xb, 0x3d,0x9d, +0xe0,0x80,0x9e,0x9e,0xc7,0x82,0xe0,0xc, 0x36,0xc8,0x3d,0xfe,0xe0,0x7, 0xae,0x2f, +0xe0,0x7, 0xae,0xbf,0x1, 0xf6,0xe0,0x0, 0xc0,0x68,0xa, 0x61,0xe0,0x2, 0x1f,0xfd, +0xf0,0x0, 0x89,0xdf,0xf0,0xa, 0x31,0xc1,0xf0,0x0, 0x21,0xde,0xe0,0x1, 0x1f,0x72, +0x14,0x0, 0xf0,0x0, 0xa2,0x8e,0x8d,0xef,0xf0,0x1, 0x19,0x7f,0xf0,0x17,0x31,0xa1, +0x35,0x21,0xf8,0x40,0x3a,0x65,0x3c,0xe8,0xf0,0x40,0x3b,0x68,0x17,0x81,0xe8,0xf, +0x3f,0xd6,0x27,0xa6,0x25,0x97,0xe0,0x1, 0x17,0x7e,0xe8,0xe, 0x3f,0x56,0xe0,0x65, +0xc7,0x10,0xe8,0xe, 0x3f,0x12,0xe8,0x40,0x3e,0xe5,0x17,0x80,0xc7,0x81,0x96,0xd, +0xe2,0x1, 0xc7,0xff,0x3f,0xfb,0xb6,0xe, 0x3c,0x9c,0xe8,0xd, 0x3e,0x97,0x3f,0x1a, +0x1, 0xf6,0xf0,0x0, 0xc3,0x1, 0xf2,0x1, 0xc3,0x7f,0xf8,0x40,0x39,0xf6,0xf0,0x0, +0xc2,0x82,0xf0,0x0, 0xc2,0x2, 0x1, 0xdb,0xe0,0x28,0x3c,0x19,0x38,0x82,0x25,0xf2, +0xe0,0x1, 0x17,0x7e,0xe8,0xe, 0x3f,0x56,0xe0,0x6b,0xc7,0x38,0xe8,0xe, 0x3f,0x12, +0xe8,0x40,0x3e,0xe4,0xc7,0x81,0x96,0xd, 0xe2,0x1, 0xc7,0xff,0x3f,0xfb,0xb6,0xe, +0x3c,0x1c,0xe8,0xd, 0x3e,0x97,0x3f,0x1a,0x1, 0xf6,0xf0,0x0, 0xc3,0x1, 0xf2,0x1, +0xc3,0x7f,0xf8,0x40,0x39,0xf6,0xf0,0x0, 0xc2,0x82,0xf0,0x0, 0xc2,0x2, 0xe7,0xff, +0x1, 0xb7,0x0, 0xdb,0xe8,0x40,0x3c,0x63,0x38,0x82,0x0, 0x0, 0x8, 0xb6,0xe1,0xff, +0xc0,0x18,0xe0,0x1, 0x1f,0xc3,0x17,0x0, 0x8d,0x8f,0xe0,0x0, 0x19,0x8d,0x39,0x68, +0xe0,0xc, 0x35,0xc3,0x3f,0xee,0x3e,0xee,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0x13, +0x3f,0xfc,0xe0,0xf, 0xae,0x8e,0x3f,0x6f,0x5, 0x78,0xe0,0x0, 0x1b,0xe, 0xe0,0x0, +0x1a,0x8c,0x17,0x80,0xae,0x86,0xae,0x85,0xe0,0x1a,0xb7,0xd3,0xe0,0x1a,0xb7,0xe3, +0xe0,0x1a,0xb7,0xf3,0xe0,0x1b,0xb7,0x93,0xe0,0x1, 0x21,0x7f,0xe0,0x1, 0x1f,0xeb, +0x37,0xc1,0x7f,0x86,0xe2,0x0, 0x7e,0x2e,0xe0,0x2, 0x1e,0xfd,0xe0,0x1, 0x1a,0x42, +0x8f,0x5d,0xe0,0x1, 0x1f,0xd7,0xf0,0x0, 0x81,0xcd,0xe0,0xe, 0x8c,0xa4,0xe0,0x1, +0x1e,0xf9,0xf0,0x0, 0x92,0x2f,0xf0,0x0, 0x92,0xbf,0xf0,0x0, 0x93,0x7f,0xf0,0x1, +0x93,0x8f,0xe0,0xe, 0x8c,0x14,0xe0,0xf, 0x37,0x41,0xe9,0xff,0xc6,0x7e,0x36,0x41, +0x36,0xc1,0xc5,0xff,0xe0,0x1, 0x15,0x78,0x34,0xc1,0x6f,0x94,0x17,0x81,0x7e,0x8, +0x7e,0x87,0xf0,0x0, 0x69,0x95,0xf0,0x0, 0x72,0x12,0xf0,0x0, 0x72,0x93,0xf0,0x0, +0x73,0x14,0x6d,0x96,0x6f,0x97,0xf0,0x0, 0x73,0x95,0xe0,0x9, 0xd0,0x47,0xe2,0x0, +0x7c,0x84,0xe2,0x0, 0x7c,0x14,0xe0,0x9, 0xd0,0xf8,0xe0,0xe, 0x8c,0xa4,0xe0,0xe, +0x8c,0x14,0xe0,0x1, 0x15,0x78,0xe0,0x9, 0xd0,0x39,0x56,0x7, 0x5f,0x8, 0x5f,0x86, +0xe0,0x1a,0xb6,0x73,0xe0,0x16,0x37,0x47,0xe0,0x0, 0x1e,0xb, 0x4c,0x84,0x4d,0x5, +0x54,0x3, 0x55,0x84,0xf0,0x0, 0x1a,0xa, 0x56,0x85,0xe0,0x15,0x37,0xc7,0xf0,0x0, +0x19,0x88,0xaf,0xc, 0xf2,0x1, 0xc3,0x7e,0xe0,0x0, 0x1f,0x9, 0xf2,0x1, 0xc2,0xfe, +0xac,0x86,0xad,0x5, 0xe0,0x1a,0xb4,0x53,0xe0,0x1a,0xb5,0xe3,0xf8,0x0, 0xab,0x4, +0xe0,0x1b,0xb6,0x93,0xaf,0x8e,0xf8,0x0, 0xaa,0x83,0xe0,0x0, 0x29,0x4d,0x24,0xa5, +0xf0,0x1, 0x1b,0xec,0xe0,0x0, 0x1e,0xd, 0x3c,0x62,0x11,0x1, 0xe0,0xf, 0x34,0x43, +0xe2,0x0, 0xc7,0x9f,0x3f,0x93,0x17,0x7, 0xe0,0xf, 0x85,0x8f,0x3f,0x58,0xe8,0x80, +0x9e,0x97,0xe0,0xe, 0x31,0x3e,0x3f,0x4b,0xc4,0x1, 0xe0,0xf, 0xaf,0xf, 0xe0,0xb, +0x36,0xa1,0x17,0x81,0x36,0xc8,0xe2,0x1, 0xc4,0x7f,0xae,0x8c,0x3f,0x9b,0xc6,0x2, +0x3c,0xf8,0xe0,0x40,0xaf,0x9c,0x1, 0xe3,0x25,0x1b,0x15,0xff,0x3d,0x9a,0xe2,0x1, +0xc5,0xff,0x35,0xa1,0xe2,0x0, 0x7f,0xae,0xe0,0x0, 0x1f,0xd, 0xe2,0x0, 0x7e,0x2c, +0xe0,0xb, 0x3d,0x9f,0xe0,0x80,0x9f,0x9c,0xc7,0x2, 0xe0,0xd, 0x37,0xa1,0xc6,0x81, +0x37,0xc8,0x3d,0xfc,0xe0,0x7, 0xaf,0xae,0xe0,0x7, 0xae,0xbe,0x1, 0xf4,0xf0,0x0, +0xc3,0x1, 0xf0,0x0, 0xc2,0x81,0xf8,0x0, 0xab,0x4, 0xf8,0x0, 0xaa,0x83,0xe0,0x0, +0xc0,0x68,0xb, 0x61,0x24,0xa4,0xe0,0x1, 0x1c,0x6c,0xe0,0x0, 0x1d,0x8d,0x17,0x80, +0xf0,0x0, 0x13,0x81,0xe0,0xe, 0x37,0xc3,0xe2,0x0, 0xc7,0x1f,0x3f,0x13,0x16,0x87, +0xe0,0xf, 0x81,0xe, 0x3e,0xdf,0xe0,0x80,0x9e,0x18,0xf0,0xd, 0x33,0xbd,0x3e,0xc2, +0xc7,0x81,0xe0,0xf, 0xae,0x8e,0xe2,0x1, 0xc7,0xff,0xe0,0xe, 0x36,0x48,0xaf,0xb, +0x36,0x21,0xc5,0x82,0x3c,0xff,0xe0,0x40,0xae,0x1b,0x1, 0xe5,0x25,0x59,0x15,0xff, +0x3d,0x9a,0xe2,0x1, 0xc5,0xff,0x35,0xa1,0xe2,0x0, 0x7f,0xae,0xe0,0x0, 0x1f,0xd, +0xe2,0x0, 0x7e,0xac,0xe0,0xb, 0x3d,0x9f,0xe0,0x80,0x9f,0x9d,0xc7,0x2, 0xe0,0xc, +0x37,0xc8,0x3d,0xfd,0x37,0xa1,0xe0,0x7, 0xae,0x2e,0xe0,0x7, 0xaf,0xbe,0x1, 0xf5, +0xe0,0x0, 0xc0,0x68,0xb, 0x61,0xe0,0x1, 0x1f,0xea,0x37,0xc1,0x7f,0x86,0xe7,0xfe, +0x0, 0x83,0x8, 0xb4,0xe0,0x0, 0x1f,0x87,0x17,0x0, 0xaf,0xf, 0xdd,0xa2,0xe0,0x3, +0x1f,0xc7,0xea,0x10,0x79,0x78,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x21,0xe0,0x0, +0x1f,0x8e,0x8f,0xf, 0x27,0x10,0x87,0x82,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0xb2,0x2, 0x94,0xaf,0x82,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x9, 0xa, 0x61,0xe0,0x1, 0x1f,0xe9,0xaf,0x2, 0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0xf9,0xe0,0x0, 0x1f,0x86,0xaf,0xf, 0xa, 0x61,0x17,0xb2,0x0, 0xec,0x8c,0x2, +0xe0,0x0, 0x19,0x8e,0xe0,0x6, 0xd2,0xae,0xe0,0x0, 0x1f,0x93,0x8f,0x3, 0x8f,0x8f, +0xe0,0x0, 0x1e,0x9a,0x3f,0x7f,0xac,0xd, 0x1, 0x56,0x8e,0x82,0x17,0xb1,0xe1,0x2f, +0x3f,0xad,0x27,0xd1,0x2c,0x50,0xe0,0x1, 0x1f,0xe8,0x87,0x8f,0xe2,0x1, 0xc7,0xfd, +0x2f,0xca,0xe0,0x2, 0x1a,0x48,0x8f,0x84,0xe2,0x0, 0xcf,0x81,0x1, 0xc, 0x8f,0x84, +0xe2,0x0, 0xcf,0x81,0x1, 0x4, 0x8f,0x3, 0xe7,0xff,0x0, 0xbe,0xdd,0x11,0x8f,0x3, +0xe7,0xff,0x0, 0xba,0xde,0x14,0xde,0x7b,0x0, 0xf3,0xea,0x10,0x7f,0xfe,0xea,0x11, +0x7f,0x2, 0x97,0x8f,0x9e,0x8e,0xe4,0x8, 0x34,0x23,0xe0,0xe, 0x3f,0xad,0xe0,0x43, +0x3f,0x1e,0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d,0x3f,0xad,0xe0,0x41,0x3f,0x4e, +0xe4,0x8, 0x34,0x40,0xe0,0x6f,0x3d,0x2e,0x3f,0xf8,0x2, 0x17,0xea,0x10,0x7f,0xfc, +0xea,0x11,0x7f,0x0, 0x97,0x8f,0x9e,0x8e,0xe0,0xe, 0x3f,0xad,0xe0,0x43,0x3f,0x1e, +0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d,0x3f,0xad,0xe0,0x41,0x3f,0x4e,0xe0,0x6f, +0x3d,0x2e,0xe0,0x28,0x3c,0x2f,0x38,0x82,0x14,0x0, 0x38,0x82,0xea,0x10,0x7f,0xfa, +0x17,0x0, 0xaf,0xf, 0x38,0x82,0xea,0x11,0x7c,0x4, 0xe0,0x7d,0x0, 0xdb,0x0, 0x0, +0x8, 0xb6,0xea,0x10,0x79,0x7a,0xe0,0x2, 0x1f,0xdf,0x8e,0x82,0xe0,0x2, 0x1f,0x5e, +0x8e,0xf, 0x26,0x8f,0xea,0x11,0x79,0x84,0x9f,0x83,0x27,0x85,0x17,0x81,0xe1,0x2f, +0x3e,0x1f,0x27,0x96,0x14,0x0, 0x17,0x80,0xaf,0x82,0x17,0x80,0xb7,0x83,0xb, 0x61, +0xe0,0x2, 0x1f,0xdd,0xe2,0x0, 0xce,0x1, 0x8c,0xf, 0x1, 0x15,0xea,0x49,0x7f,0xb0, +0xe9,0xff,0xc7,0xff,0xe0,0xe, 0x36,0xa2,0x3f,0x9e,0xa7,0x8f,0x3f,0x82,0xe0,0x2, +0x1d,0xdd,0xe2,0x0, 0xce,0x1, 0xe0,0x0, 0x8c,0xb, 0xe0,0x1, 0x1, 0xa5,0xe2,0x0, +0xce,0x84,0x1, 0x61,0xe0,0x1, 0x1f,0xc1,0xe0,0x6, 0x9a,0x2e,0x8d,0x8f,0xe0,0x1, +0x1f,0xc0,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0x7f,0xe0,0x1, 0x5, 0x91,0xe0,0x1, +0x1f,0xbf,0x8d,0x8f,0xe0,0x1, 0x1f,0xbe,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0x7f, +0xe0,0x1, 0x3, 0x86,0xe0,0x1, 0x1f,0xbd,0xe0,0x6, 0x9a,0xbe,0x8d,0x8f,0xe0,0x1, +0x1f,0xbc,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0xff,0xe0,0x0, 0x5, 0xf9,0xe0,0x1, +0x1f,0xbb,0x8f,0xf, 0xe0,0x1, 0x1f,0xba,0x37,0x28,0x8f,0x8f,0x3f,0xce,0x3a,0xff, +0xe0,0x0, 0x3, 0xee,0xe2,0x0, 0xce,0x84,0xe0,0x1, 0x2, 0x9d,0xea,0x49,0x7f,0xc4, +0xe9,0xff,0xc7,0xff,0x36,0xa2,0x3f,0x9d,0xa7,0x8f,0x3f,0x82,0x12,0x80,0x3a,0x65, +0x17,0x81,0xe0,0x2c,0x3e,0xf, 0xe0,0x0, 0x26,0x59,0xe0,0x0, 0x2c,0x57,0xea,0x10, +0x7f,0xfc,0xea,0x10,0x7f,0x7e,0xb2,0x8f,0xe0,0x1, 0x1f,0xb9,0xb2,0xe, 0xea,0x11, +0x79,0x84,0x8e,0x8f,0xe0,0x1, 0x1f,0xb8,0x8f,0xf, 0xe0,0x1, 0x1f,0xb7,0x37,0x28, +0x8b,0xf, 0xe0,0x1, 0x1f,0xb6,0x36,0xa8,0x8f,0x8f,0x3b,0x4d,0x3f,0xce,0x9f,0x3, +0xe0,0xf, 0x3b,0x2f,0x3f,0x7f,0xe7,0xfe,0x2, 0x7f,0xe0,0x1, 0x1f,0xb5,0x8c,0xf, +0xdf,0x2d,0xe7,0xfe,0x24,0x79,0xea,0x11,0x7f,0x80,0xea,0x11,0x7f,0x2, 0x14,0x0, +0xb2,0x8f,0x17,0x83,0xb2,0xe, 0xaf,0x82,0xb3,0x3, 0xb, 0x61,0xea,0x11,0x79,0x84, +0x14,0x24,0xe7,0xfe,0x0, 0xea,0x2e,0x14,0xe2,0x0, 0xce,0x81,0xe0,0x0, 0x1, 0x44, +0xe0,0x1, 0x1f,0xb4,0x3c,0x6c,0x8e,0x8f,0xe0,0x1, 0x1f,0xb3,0x36,0xa8,0x8f,0xf, +0xea,0x11,0x7f,0x84,0x3f,0x4d,0x16,0x84,0xae,0x82,0xb7,0xf, 0xb, 0x61,0x12,0x80, +0x3a,0x65,0xe0,0x1, 0x1e,0xb2,0xea,0x10,0x7f,0x7e,0xea,0x10,0x7f,0xfc,0x8c,0xd, +0xb2,0xe, 0xb2,0x8f,0xde,0xfb,0x24,0x3, 0x14,0x0, 0xb, 0x61,0xea,0x11,0x79,0x84, +0xe7,0xfe,0x0, 0xc2,0xe2,0x0, 0xce,0x84,0xe7,0xfe,0x5, 0xca,0xe7,0xfe,0x0, 0xbc, +0xe0,0x43,0x3a,0x14,0xe0,0x43,0x3a,0x95,0x0, 0xe5,0x2c,0x6f,0xea,0x11,0x7f,0x0, +0xea,0x11,0x7f,0x82,0xb2,0x8e,0xe0,0x1, 0x1f,0x39,0xb2,0xf, 0xea,0x11,0x7f,0x84, +0x8e,0x8e,0xe0,0x1, 0x1f,0x37,0x36,0xa8,0x8f,0xe, 0x3f,0x4d,0x16,0x81,0xae,0x82, +0xb7,0xf, 0xb, 0x61,0xe0,0x1, 0x1f,0xb9,0x3c,0x6c,0x8e,0x8f,0xe0,0x1, 0x1f,0xb7, +0x36,0xa8,0x8f,0xf, 0xea,0x11,0x7f,0x84,0x3f,0x4d,0x16,0x82,0xae,0x82,0xb7,0xf, +0xb, 0x61,0xea,0x11,0x79,0x84,0x14,0x0, 0xe7,0xfe,0x0, 0x8f,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xe2,0x0, 0xcc,0x1, 0x39,0x69,0xe0,0x0, 0x5, 0xd1,0x12,0xfe,0xf0,0x0, +0x1d,0xd0,0x3a,0x98,0xe0,0x0, 0x1f,0xcc,0xea,0x11,0x7a,0xc, 0xe2,0x1, 0xc2,0xff, +0xfa,0x11,0x7f,0x2c,0xc2,0x81,0xf0,0x0, 0x14,0x80,0xe8,0x0, 0x93,0x8b,0x93,0xf, +0x3a,0x94,0xf8,0x40,0x3e,0x69,0xf0,0x0, 0x14,0x1, 0x8c,0x4, 0xf0,0x80,0x8e,0x94, +0xe8,0x0, 0x8c,0x8e,0xf8,0x80,0x8d,0x1e,0xe8,0x8, 0x3c,0x2d,0xe8,0x9, 0x3c,0xaa, +0x34,0x24,0xe0,0x9, 0xd3,0x75,0x39,0xe8,0x8c,0x14,0xe8,0x0, 0x8c,0x9e,0xf0,0x8, +0x3e,0xa8,0xf0,0x9, 0x3d,0x29,0x34,0x24,0xe0,0x9, 0xd3,0x6a,0xe0,0xf, 0x39,0xa8, +0x16,0x85,0x3e,0x9f,0x17,0x1, 0x3f,0x12,0xe2,0x0, 0xce,0x8b,0xe2,0x1, 0xc7,0x7f, +0xe0,0x62,0x3b,0xae,0x3f,0xf7,0x39,0xef,0x5, 0x5, 0xe0,0x43,0x3b,0x9f,0xf8,0x40, +0x3e,0x68,0x3f,0xf6,0x3, 0x5, 0xe0,0x43,0x3b,0x13,0xf8,0x40,0x3c,0xe8,0x3a,0x75, +0x1, 0xcd,0xf0,0x0, 0x2e,0x8, 0xf0,0x0, 0x2c,0x89,0x3c,0x62,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe8,0x0, 0xb3,0x8b,0x0, 0xf8,0xe0,0x0, 0x1f,0xcc,0xb3,0xf, 0x0, 0xf6, +0x8, 0xb7,0x12,0x0, 0x16,0xff,0xf0,0x0, 0x13,0x9f,0x3e,0x98,0xf0,0x17,0x3b,0x98, +0xc4,0xff,0x3d,0x64,0x3c,0x64,0x3d,0xe4,0xe0,0x40,0x3e,0x64,0xe0,0x80,0x8f,0x9d, +0xe0,0x80,0x8f,0x19,0xe0,0x3, 0x3f,0xbf,0xe0,0x5, 0x3f,0x3e,0xe0,0x2, 0x3f,0x3f, +0xf0,0x40,0x3b,0xfd,0x3e,0x1e,0x3d,0x9f,0x3c,0x15,0x3d,0x13,0x3a,0x12,0x1, 0xef, +0xe0,0x2, 0x36,0x5, 0xe4,0x0, 0xc4,0x64,0xe0,0x0, 0x12,0xe4,0x3a,0xba,0xe0,0x4, +0x14,0xb5,0xe0,0x6, 0x39,0x32,0xe0,0x3, 0x35,0x85,0xe0,0x9, 0xd3,0x11,0xe0,0x6, +0x3c,0x26,0xe0,0x4, 0x14,0xb5,0x3c,0x65,0xe0,0x9, 0xd3,0xa, 0xe0,0x7, 0x39,0xb3, +0x17,0x80,0xe0,0x2f,0x3b,0xf, 0xe0,0x7, 0x3c,0x27,0xe0,0x0, 0x14,0x64,0x2f,0x9d, +0xe0,0x25,0x3b,0x8f,0x2a,0x9a,0x3c,0x34,0xe0,0x4, 0x14,0xb5,0x39,0x33,0xe0,0x9, +0xd2,0xf7,0xe0,0x2, 0x3c,0x22,0xe0,0x0, 0x14,0x64,0x3c,0x32,0x3c,0xe6,0xe0,0x9, +0xd2,0xef,0x3c,0x32,0x3c,0xe7,0xe0,0x9, 0xd2,0xeb,0xe0,0x43,0x3f,0x98,0xe2,0x0, +0xcf,0x80,0x4, 0x6, 0xe0,0x43,0x3c,0x18,0xe2,0x1, 0xc4,0x7f,0xb, 0xe1,0x3c,0x65, +0x0, 0xfa,0x8, 0xb1,0xea,0x11,0x7f,0x87,0x8f,0x8f,0xe0,0xe, 0x34,0xa1,0xe0,0xd, +0x35,0x21,0x3f,0x18,0xc7,0xff,0x3c,0x1d,0x86,0x9e,0x3c,0xff,0x16,0x0, 0x38,0xed, +0x85,0x98,0xe0,0x61,0x39,0xac,0x3e,0x61,0x2d,0x88,0x3c,0xfa,0xb6,0x88,0x1, 0x2, +0xb5,0x8e,0x3c,0xff,0x1, 0xb, 0x8, 0xe1,0x3c,0xfa,0x1, 0x7c,0x3e,0x9b,0x36,0x81, +0xb6,0x88,0x3c,0xff,0x16,0x80,0xb6,0x8e,0x1, 0xf7,0xb6,0x8, 0x8, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0xc, 0xea,0x11,0x7b,0xab,0xea,0x11, +0x7e,0xb, 0x16,0xa0,0x7e,0x6, 0xc4,0x7e,0xc4,0xfe,0x3e,0x97,0xe0,0x40,0x3f,0xec, +0xe0,0x80,0x97,0x18,0xe0,0x80,0xaf,0x17,0x3e,0xf7,0xe0,0x80,0x97,0x19,0xe0,0x80, +0xaf,0x1f,0x1, 0xf7,0xe0,0x2, 0x1f,0x86,0x8a,0xf, 0xe0,0x4, 0x22,0x5c,0xfa,0x11, +0x79,0xac,0xf8,0x40,0x3c,0x63,0xe0,0x2, 0x1f,0x29,0xf8,0x0, 0x8d,0x88,0x17,0x80, +0xf0,0x40,0x3d,0x6e,0x7f,0x9, 0xf0,0xc, 0x35,0xa4,0xe0,0x7, 0x17,0x68,0xf0,0x0, +0x16,0xd3,0xe8,0x40,0x39,0xea,0x7f,0x87,0xf0,0x40,0x3c,0xef,0x7e,0xb, 0xf0,0x1d, +0x3e,0x90,0x7f,0x88,0xf0,0x40,0x3e,0x6f,0x7f,0x8a,0x13,0x20,0xe0,0x0, 0x7f,0xc, +0xf0,0x40,0x3d,0x67,0xe0,0x0, 0x15,0x44,0x3c,0xe3,0xe2,0x0, 0x7c,0x34,0xe0,0x9, +0xd2,0xd1,0xe0,0x0, 0x1f,0xcc,0xe0,0xff,0x16,0x7f,0xe0,0x0, 0x1f,0x50,0xb6,0xf, +0x16,0x33,0x17,0x80,0x15,0x0, 0x3e,0x10,0xb7,0x8e,0xe8,0x40,0x3d,0xe8,0xe8,0x40, +0x3c,0x6d,0x64,0x86,0xf8,0x40,0x3b,0x68,0xe8,0x40,0x3e,0xeb,0xe8,0x40,0x3a,0xec, +0xe8,0x40,0x39,0x6c,0xe8,0x40,0x3b,0xec,0xf8,0x40,0x3f,0x6c,0x0, 0x83,0xe8,0x80, +0x8e,0x96,0xf0,0x80,0x8b,0x9c,0xe3,0xff,0xc6,0xff,0xf0,0xe, 0x3b,0xad,0xe0,0x43, +0x3f,0x9e,0xe8,0xd, 0x3e,0xa7,0xe2,0x0, 0xcf,0x80,0xe0,0x43,0x3e,0x9d,0xe0,0x6f, +0x3d,0x2d,0xf0,0x80,0x8b,0x98,0xe0,0x80,0x8e,0x99,0xe8,0x40,0x3f,0xfe,0xf0,0xe, +0x3b,0xad,0xe0,0x7e,0x3b,0x2f,0xe2,0x0, 0xcf,0x0, 0xe8,0xd, 0x3e,0xa7,0xe0,0x6e, +0x3d,0x2d,0xf0,0x40,0x3b,0xee,0xf3,0xff,0xc3,0xff,0xe3,0xff,0xc7,0xff,0xe8,0xd, +0x3f,0x97,0x3f,0x77,0xe8,0x5, 0x3a,0x97,0xf0,0x43,0x3b,0x9d,0xe0,0x67,0x3b,0x2e, +0xf0,0x40,0x3b,0xfa,0x3f,0x92,0xe0,0x43,0x39,0x1f,0xe0,0x43,0x3a,0x95,0x3, 0x2, +0x3e,0xea,0xf0,0x40,0x3e,0xfc,0xe0,0x43,0x3d,0x1d,0x1, 0xc2,0xe8,0x40,0x3e,0x6b, +0x17,0x0, 0xe0,0x0, 0x16,0xff,0x0, 0x83,0xe0,0x80,0x8e,0x1b,0xe4,0xf, 0x36,0x28, +0xf0,0x40,0x3b,0xed,0xe4,0x8, 0x37,0xc8,0xf2,0x1, 0xc3,0xff,0xf0,0x40,0x3b,0xf8, +0x3c,0xee,0xe2,0x1, 0xc4,0xff,0x3f,0xe8,0x5, 0x82,0x3e,0xec,0x3c,0xff,0xe2,0x1, +0xc6,0xff,0x3, 0x82,0x3f,0x6c,0xf0,0x40,0x3d,0x7b,0xe2,0x1, 0xc7,0x7f,0x1, 0xe5, +0xf0,0x2f,0x3f,0x16,0xe0,0x1, 0x27,0xdc,0xe0,0x2f,0x3b,0x96,0xe0,0x1, 0x27,0xd8, +0xf0,0x0, 0xc4,0x81,0xf2,0x1, 0xc4,0xff,0xf0,0x40,0x3c,0xf4,0xe0,0x0, 0xc1,0xc4, +0xe7,0xfe,0x1, 0xea,0xe0,0x9, 0x3f,0x2d,0x64,0xb, 0xe2,0x1, 0xc4,0xff,0xe0,0x9, +0xd1,0xd7,0x67,0x88,0x3a,0x68,0xc7,0xff,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0xe0,0x1, +0x17,0xfd,0xe1,0x2f,0x3f,0xae,0xe2,0x1, 0xc2,0x7f,0xe0,0x2, 0x27,0xc9,0x66,0xa, +0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3e,0x1f,0xe0,0x2, 0x27,0xc2,0x67,0x87,0xeb,0xc8, +0x79,0x78,0xea,0x11,0x79,0x88,0x67,0x8, 0xc7,0x81,0xf0,0x0, 0x66,0x7, 0xaf,0x82, +0xaf,0x3, 0xe0,0x0, 0x17,0xc4,0xe8,0xf, 0x3f,0xbc,0x67,0x9, 0x3f,0x1f,0xe0,0x8, +0x87,0x2e,0xc7,0x4f,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x2, 0x5, 0x9c, +0x67,0x8, 0xe2,0x0, 0xcf,0x31,0xe0,0x2, 0x1, 0x0, 0x67,0x8, 0xe2,0x0, 0xcf,0x50, +0xe0,0x2, 0x1, 0x58,0x67,0x88,0xe2,0x0, 0xcf,0xb3,0xe0,0x1, 0x1, 0x84,0xe2,0x0, +0xca,0x8, 0xe0,0x0, 0x2, 0xfb,0x14,0x80,0x14,0x1e,0xdd,0xf1,0xe0,0x0, 0x1f,0xcc, +0x97,0x8f,0xe3,0xff,0xcf,0xca,0xe0,0x2, 0x3, 0x55,0xf0,0x2, 0x1a,0xad,0xf0,0x2, +0x1a,0x3, 0xf0,0x2, 0x19,0x35,0xf0,0x0, 0x18,0xa5,0xea,0x11,0x7d,0x2c,0x12,0x0, +0x17,0x80,0xea,0x11,0x7c,0x8c,0xf0,0x0, 0x13,0x9d,0xe8,0x0, 0xb7,0x85,0xe8,0x0, +0xb7,0x84,0xf0,0x17,0x3b,0x9a,0xe8,0x0, 0xb7,0x82,0x3a,0xe4,0xe8,0x0, 0xb7,0x81, +0xf0,0x40,0x39,0xe4,0x3c,0x64,0xf0,0x40,0x3b,0x64,0x3b,0x64,0xf0,0x40,0x3c,0x64, +0xf0,0x40,0x38,0x64,0x3e,0xe4,0x13,0x81,0x0, 0x90,0xe2,0x0, 0xcd,0x80,0xe0,0x43, +0x3a,0x9e,0x3a,0x67,0xe0,0xe, 0x3f,0x96,0x4, 0x28,0xe0,0x43,0x3b,0x1e,0xf0,0x40, +0x3b,0x67,0xf0,0x40,0x3b,0xfa,0x1, 0x29,0x8d,0x8a,0x8f,0x1a,0x8f,0x99,0xf0,0x0, +0x8c,0x89,0x3f,0x2b,0x3e,0x6e,0xe8,0xf, 0x3f,0xa9,0xe2,0x0, 0xcf,0x0, 0xe3,0xff, +0xc7,0xff,0xe3,0xff,0xc6,0x7f,0xc5,0x1, 0xe0,0x43,0x3d,0x9f,0xc4,0x81,0xe0,0xe, +0x3e,0x15,0x3, 0x5c,0xe2,0x0, 0xcd,0x80,0x3e,0x18,0xe0,0x43,0x3c,0x1c,0xf0,0x40, +0x39,0xe7,0xe0,0xe, 0x3f,0x96,0x3, 0x5a,0x3f,0x9d,0xe0,0x43,0x3e,0x9f,0xf0,0x40, +0x38,0x6d,0xf0,0x40,0x3c,0x67,0x0, 0xd6,0xf0,0x2, 0x2c,0x11,0xf0,0x0, 0x23,0x4, +0xe8,0x0, 0xb3,0x2, 0xf0,0x0, 0x21,0x84,0xe8,0x0, 0xb4,0x4, 0x22,0x3, 0xe8,0x0, +0xb2,0x85,0xe3,0xff,0xce,0xe3,0x4, 0x6, 0xe0,0x0, 0x17,0xfc,0xaf,0x82,0x17,0x80, +0xaf,0x83,0xe0,0x0, 0xc0,0x74,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x16,0x30,0xf0,0x2f, +0x3f,0x1c,0xe7,0xfe,0x2f,0xa7,0xe0,0x2f,0x3b,0x9c,0xe7,0xfe,0x2f,0xa3,0xe2,0x6, +0xc9,0x0, 0xe7,0xfe,0x2, 0x1f,0xeb,0xc8,0x7f,0xf9,0x8f,0x8f,0x16,0xc, 0x3e,0x3f, +0x3a,0xfc,0xe7,0xfe,0x2, 0x17,0xe8,0x40,0x3c,0xe8,0xe2,0x0, 0x7c,0x34,0x7e,0x82, +0x7f,0x1, 0x7d,0x3, 0x7f,0x84,0xdd,0xb5,0xea,0x11,0x7c,0x8c,0x3d,0xe8,0xe2,0x0, +0x7c,0x54,0x7d,0x85,0xdd,0xae,0x16,0x3b,0xe1,0x29,0x3e,0x28,0x65,0x85,0x66,0x82, +0x67,0x1, 0xe7,0xfd,0x2c,0xff,0xe1,0x2c,0x3e,0x2b,0xe7,0xfd,0x2e,0x7b,0xe0,0x16, +0x3d,0xbb,0xe0,0xc, 0x3c,0x38,0xe0,0x9, 0x3d,0x98,0xf0,0x8, 0x3b,0x1c,0xe0,0x9, +0xd1,0x1a,0x3d,0xe8,0xe2,0x1, 0xc5,0xff,0xe2,0x0, 0xcd,0xd9,0x65,0x3, 0x66,0x82, +0x67,0x1, 0x67,0x84,0xe0,0x0, 0x5, 0xd9,0xe0,0x0, 0x16,0x64,0xf0,0xf, 0x3f,0x17, +0x3e,0x2b,0x36,0x21,0x3f,0x9a,0x3f,0x9c,0x66,0xc, 0xe0,0x43,0x3f,0x9f,0x3f,0xfc, +0x3, 0x8, 0xe0,0x0, 0x4e,0x76,0x7f,0x8c,0x7e,0x8, 0x7d,0x8a,0xf0,0x0, 0x7c,0x87, +0xe0,0x0, 0x17,0xc5,0x66,0xa, 0xe1,0x2f,0x3e,0x1f,0xe7,0xfd,0x27,0xcb,0x66,0x8, +0xe0,0x1, 0x17,0xff,0xe0,0x2f,0x3e,0xf, 0xe7,0xfd,0x27,0xc4,0x17,0x80,0x7f,0x88, +0x7f,0x8a,0xe7,0xfd,0x0, 0xbf,0x66,0x9, 0x3f,0x9c,0xe0,0x8, 0x8f,0xf, 0xe2,0x0, +0xcf,0x5, 0xe7,0xff,0x1, 0x88,0xe0,0x8, 0x8f,0x9f,0xe2,0x1, 0xcf,0xb3,0xe7,0xff, +0x1, 0x82,0x14,0x80,0x14,0xa, 0xdc,0xf3,0xe2,0x0, 0xcc,0x2, 0xe7,0xfe,0x2, 0xfb, +0xe7,0xfe,0x0, 0xf4,0xea,0x11,0x7f,0x6, 0x87,0xe, 0xe2,0x0, 0xcf,0x2, 0xe7,0xfd, +0x5, 0x61,0xe0,0x0, 0x17,0x7c,0xaf,0x2, 0xe7,0xfd,0x0, 0xdc,0xf0,0x0, 0x66,0x7, +0xea,0x11,0x79,0x88,0xeb,0xc8,0x79,0x78,0x8e,0x3, 0xe0,0x0, 0x17,0xfc,0x7e,0x8, +0xaf,0x82,0xe7,0xfd,0x0, 0xc0,0xf2,0x0, 0xcf,0x1f,0xe7,0xff,0x2, 0x3b,0xe0,0xc, +0x37,0x81,0x3b,0xfc,0xe7,0xff,0x3, 0x36,0xf2,0x0, 0xcf,0xf, 0x5, 0x6, 0xe0,0xc, +0x37,0x82,0x3b,0xfc,0xe7,0xff,0x3, 0x2e,0xe2,0x1, 0xc9,0x7f,0x2, 0x39,0x14,0x86, +0xe0,0x8, 0x37,0xa5,0x7d,0x3, 0x7d,0x85,0x7e,0x82,0x7f,0x1, 0xe0,0x9, 0xd0,0x58, +0xe0,0x28,0x3c,0x15,0x65,0x3, 0x65,0x85,0x66,0x82,0x67,0x1, 0xe7,0xff,0x24,0x1a, +0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3d,0x9f,0xe7,0xff,0x27,0x94,0xe7,0xfe,0x0, 0xfe, +0x14,0x80,0x14,0xa, 0xdc,0xa4,0xe2,0x0, 0xcc,0x6, 0xe7,0xfe,0x2, 0xac,0xe7,0xfe, +0x0, 0xa5,0xe0,0x2, 0x1f,0xa9,0xf0,0x40,0x3e,0x64,0x7f,0x89,0xe7,0xff,0x0, 0xba, +0xe0,0x0, 0x1e,0xd0,0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x96,0x8d,0x3f,0xae, +0x3f,0x9d,0xe2,0x1, 0xcf,0x95,0xe7,0xfd,0x2, 0x22,0xe7,0xfe,0x0, 0x8f,0xe0,0xc, +0x37,0xa2,0xe0,0x2c,0x3a,0xac,0xe7,0xfe,0x2e,0x6d,0xe0,0x2, 0x16,0x54,0xe0,0x22, +0x39,0x1c,0xe7,0xfe,0x29,0x67,0xe7,0xff,0x0, 0xbc,0xf8,0x0, 0xb0,0x1, 0xe7,0xfd, +0x0, 0xef,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xf4,0xc0,0x58,0xea,0x11, +0x79,0x87,0x3a,0x6a,0xeb,0xc8,0x79,0x78,0xe2,0x1, 0xc2,0x7f,0x17,0xff,0xaa,0x3, +0xaf,0x82,0xe0,0x0, 0x25,0x65,0x16,0x7f,0x3e,0x1a,0xe3,0xff,0xc6,0x7f,0xc6,0x1, +0x36,0x22,0xe0,0x3, 0x17,0x6a,0xe0,0x7, 0x17,0xca,0x3f,0x10,0x3f,0x90,0x3e,0x18, +0x96,0x88,0xc4,0x4, 0xe0,0x80,0xb6,0x9e,0x3e,0x78,0xe0,0x40,0x96,0x98,0xe0,0x80, +0xb6,0x9f,0x1, 0xf7,0xe2,0x0, 0xca,0x4, 0xe0,0x0, 0x5, 0xca,0xf0,0x1, 0x94,0x69, +0xf0,0x1, 0x94,0xf9,0xf8,0x40,0x3c,0x79,0xe0,0x0, 0x4, 0x57,0xe8,0x40,0x3c,0xe9, +0xf0,0x2, 0x24,0xaf,0xe8,0x40,0x3c,0x68,0xe0,0x8, 0xdf,0xda,0xeb,0xc8,0x7b,0x79, +0xe0,0x0, 0x17,0xc0,0xe0,0x43,0x3a,0x88,0xaf,0x86,0xea,0x11,0x7f,0x86,0xe2,0x0, +0xca,0x84,0xaa,0x8f,0xe0,0x0, 0x5, 0x60,0xe0,0x0, 0x17,0xfd,0xaf,0x82,0x14,0x87, +0xe0,0x1, 0x1f,0xb1,0xe0,0x1, 0x1f,0x30,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x3c,0x4f, +0x34,0x21,0xe0,0x8, 0xdf,0xbd,0xe8,0x40,0x3c,0x78,0xe0,0x2, 0x5, 0x2, 0xe0,0x1, +0x1f,0xaf,0xe0,0x1, 0x1f,0x2e,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x14,0x86,0x3c,0x4f, +0xe0,0x8, 0xdf,0xf1,0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0xf8,0xe0,0x1, 0x3, 0x71, +0xe0,0x0, 0x17,0xfd,0xaf,0x82,0xe0,0x0, 0x16,0xfd,0x0, 0x86,0xe0,0x0, 0x17,0xff, +0xaf,0x82,0xe0,0x0, 0x16,0xff,0xe0,0x2, 0x1f,0x86,0x17,0x0, 0x87,0x8f,0xaf,0x3, +0x3f,0xfd,0x14,0x0, 0x4, 0x4, 0xea,0x11,0x7f,0x88,0x8c,0xf, 0xe0,0xb, 0xc0,0x28, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x7, 0x34,0x21,0xf0,0x1, 0x24,0x5f,0xe8,0x40, +0x3c,0xe8,0xe8,0x40,0x3c,0x69,0xe0,0x8, 0xdf,0x83,0xf0,0x40,0x3c,0xf7,0xe0,0x43, +0x3a,0x88,0xeb,0xc8,0x7b,0x79,0xe0,0x1, 0x3, 0x47,0x3c,0xe7,0xf0,0x8, 0x34,0xa7, +0xe0,0x8, 0xdf,0xb9,0xea,0x11,0x7f,0x86,0xe2,0x0, 0xca,0x84,0xac,0x6, 0xaa,0x8f, +0xe7,0xff,0x2, 0x24,0xe0,0x3, 0x1f,0x88,0xf0,0x0, 0x15,0x1, 0xe0,0x1, 0x9f,0x6f, +0xe0,0x1, 0x9e,0xff,0xe2,0x0, 0xcf,0x0, 0xf8,0x40,0x3d,0xea,0xe0,0x7b,0x39,0xae, +0x8b,0x6, 0xe0,0x3, 0x12,0xec,0xe2,0x0, 0xce,0x80,0xf0,0x7, 0x16,0xcc,0xe0,0x1, +0x9f,0xf, 0x3a,0x90,0xf0,0x1d,0x3e,0x90,0xf0,0x0, 0x9e,0x7f,0x7b,0x2, 0xe0,0x7a, +0x39,0xad,0x7f,0x1, 0xe8,0x40,0x3b,0xed,0x3b,0x65,0xf0,0x0, 0x17,0x0, 0x67,0x81, +0x94,0x6, 0xe8,0x40,0x3c,0xeb,0x3c,0x2f,0x34,0x26,0xe0,0x8, 0xdf,0x84,0x97,0x87, +0xe1,0x80,0xb4,0x16,0xe8,0xf, 0x3f,0xac,0x64,0x2, 0xe8,0x40,0x3c,0xea,0x3c,0x3f, +0xe0,0x8, 0xdf,0x79,0x15,0x1, 0xe8,0xa, 0x3d,0x1e,0xf0,0x40,0x3f,0x6a,0xf2,0x1, +0xc7,0x7f,0xe8,0x40,0x3a,0x7e,0xe1,0x80,0xb4,0x17,0x1, 0xe2,0xe0,0x3, 0x53,0x66, +0xe0,0x3, 0x4b,0xed,0xf0,0x0, 0x11,0x8c,0xf0,0x1, 0x12,0x7c,0x12,0x1, 0xf0,0x13, +0x39,0x90,0xf0,0x14,0x3a,0x10,0xe2,0x1, 0xc3,0x7f,0xe8,0x0, 0xab,0x83,0xf8,0x40, +0x3b,0x6d,0xe8,0x0, 0xab,0x4, 0xf0,0x40,0x3b,0xe5,0x3c,0x64,0xf0,0x40,0x3a,0xe4, +0xf0,0x0, 0x11,0x7, 0xf0,0x0, 0x10,0x83,0x0, 0x8b,0xe8,0x2f,0x3d,0x95,0x2f,0xaf, +0xc4,0x1, 0xe2,0x1, 0xc4,0x7f,0xe8,0x40,0x3c,0x7e,0xe0,0x1, 0x1, 0x23,0xe8,0x80, +0x94,0x97,0xf8,0x80,0x90,0x16,0xe2,0x1, 0xc4,0xff,0xe0,0xd, 0x3c,0xa7,0xe2,0x1, +0xc6,0xff,0xf2,0x1, 0xc0,0x7f,0xe0,0x43,0x3e,0xd, 0xf0,0xf, 0x38,0x26,0xe2,0x0, +0xce,0x0, 0xe2,0x1, 0xc7,0xff,0xe0,0x41,0x3e,0xcd,0xe0,0x43,0x3d,0x8f,0xe0,0x43, +0x3e,0x8d,0xe0,0x6c,0x3c,0x2d,0xe0,0x41,0x3f,0xcf,0xe2,0x0, 0xcd,0x80,0xe0,0x43, +0x3f,0x8f,0xe8,0x2d,0x3e,0x15,0xe0,0x6b,0x3c,0x2f,0x26,0xd0,0xe2,0x1, 0xca,0x6c, +0xe0,0x1, 0x2, 0xc5,0xe8,0x2f,0x3e,0x12,0x2f,0xad,0xe8,0x2f,0x3d,0x92,0x2f,0xaa, +0xe8,0x2c,0x3e,0x11,0xe0,0x0, 0x2e,0x5d,0xe8,0x2b,0x3d,0x91,0xe0,0x0, 0x2d,0xd9, +0xf0,0xd, 0x39,0x94,0xf0,0xf, 0x3a,0x14,0xc2,0x1, 0xac,0x8d,0xe2,0x1, 0xc2,0x7f, +0xf0,0x0, 0xa8,0xf, 0xe8,0x40,0x3b,0x60,0x3b,0xe9,0xe7,0xff,0x0, 0xb3,0x86,0x82, +0xe7,0xfe,0x0, 0x9b,0xe7,0xff,0x17,0x80,0xaf,0x86,0xe7,0xfd,0x0, 0xe0,0x14,0x81, +0xf0,0x40,0x3c,0xe9,0xe7,0xfd,0x0, 0xd0,0x13,0x82,0xf0,0x0, 0x14,0x1, 0xe7,0xfe, +0x0, 0xa0,0x17,0x81,0x3f,0x94,0xe0,0xb, 0x3b,0x99,0xe8,0xc, 0x3b,0x10,0xe2,0x1, +0xc7,0xff,0x35,0x81,0x36,0x1, 0x16,0xff,0xf0,0x1b,0x39,0x9f,0xf0,0x1a,0x3a,0x1f, +0x3e,0x9f,0x3b,0x9b,0x3b,0x1c,0xe8,0x0, 0xad,0x8b,0xf0,0x1c,0x39,0x9d,0xe8,0x0, +0xae,0xa, 0xe0,0xb, 0x33,0x81,0xe8,0xd, 0x3e,0x94,0xe0,0xc, 0x33,0x1, 0xe8,0x0, +0xad,0x8c,0xc7,0x81,0xae,0xd, 0xf0,0xb, 0x39,0x9f,0xe8,0x0, 0x8e,0xb, 0xe8,0x0, +0x8e,0x8a,0x3e,0x19,0xe8,0xd, 0x3e,0x90,0x36,0x1, 0xe8,0xf, 0x3f,0x94,0x36,0x81, +0xc2,0x3, 0xae,0xb, 0xe2,0x1, 0xc2,0x7f,0xae,0x8f,0xe7,0xff,0x0, 0xab,0xe0,0xd, +0x3b,0x99,0xe8,0xf, 0x3b,0x10,0xf0,0xb, 0x39,0x94,0xf0,0xc, 0x3a,0x14,0x36,0x81, +0x37,0x81,0xc2,0x1, 0xae,0x8b,0xe2,0x1, 0xc2,0x7f,0xaf,0x8c,0xe7,0xff,0x0, 0x9a, +0xe2,0x0, 0xca,0x1, 0xaa,0x3, 0x1, 0x1a,0x15,0x7e,0x3d,0x14,0xe2,0x1, 0xc5,0x7f, +0x17,0x8c,0x3f,0x90,0xc5,0x1, 0xe0,0x1, 0x16,0xfc,0x3e,0x90,0xe0,0xa, 0x3d,0x1f, +0xe0,0x80,0x8d,0x9f,0xe0,0x80,0x8e,0x1d,0x3f,0xfa,0xe0,0x80,0xb5,0x95,0xe8,0x80, +0xb6,0x1d,0x1, 0xf7,0xe2,0x0, 0xca,0x1f,0x2, 0x86,0xe0,0x0, 0x17,0xfe,0xaf,0x82, +0xe7,0xfc,0x0, 0xf7,0x12,0x82,0xf0,0x40,0x3d,0x65,0x3c,0xe4,0xe0,0x8, 0x32,0xa5, +0xe0,0x8, 0xde,0x79,0xe2,0x0, 0xcc,0x2, 0xe8,0x40,0x3b,0x6a,0xe0,0x66,0x3b,0xa8, +0x13,0xff,0x3b,0x95,0xc3,0x7f,0xe2,0x1, 0xc3,0xff,0xe2,0x1, 0xc3,0x7f,0x3c,0xe7, +0x3d,0x66,0xe2,0x3, 0x7c,0x6c,0xdb,0x46,0x3d,0x66,0x3c,0xe7,0xe2,0x7, 0x7c,0x4c, +0xc2,0x81,0xdb,0x40,0xe2,0x1, 0xc2,0xff,0x3a,0xf4,0x5, 0xe0,0xe2,0x7, 0x7c,0xcc, +0xe2,0x3, 0x7c,0x6c,0xdb,0x5e,0xe7,0xfc,0x0, 0xcc,0xaa,0x3, 0xe7,0xff,0x0, 0xb6, +0xf0,0x2, 0x1b,0x36,0xe8,0x0, 0x8d,0x6, 0xe2,0x1, 0xcd,0x6f,0x2, 0x90,0xf0,0x2, +0x1b,0xae,0xe0,0xf, 0x35,0x22,0xc5,0x1, 0xf0,0x17,0x3b,0x9f,0xe2,0x1, 0xc5,0x7f, +0xe8,0x0, 0xb4,0x7, 0xe8,0x0, 0xb4,0x97,0xe8,0x0, 0xad,0x6, 0xe0,0x3, 0x1f,0x88, +0xe0,0x1, 0x9f,0xf, 0x3f,0x78,0xe0,0x1, 0x5, 0xa5,0xe0,0x1, 0xb4,0xf, 0xe0,0x1, +0xb4,0x9f,0x9f,0x7f,0x3f,0x79,0xe0,0x1, 0x5, 0x83,0xb4,0xff,0xb4,0x6f,0xe2,0x0, +0xcd,0xa, 0xe0,0x1, 0x1, 0xa, 0xe2,0x0, 0xcd,0x14,0xe0,0x1, 0x1, 0x1b,0xe2,0x1, +0xcd,0x6f,0xe0,0x1, 0x5, 0xa7,0x8, 0xb1,0xf0,0x0, 0x19,0x8f,0xf0,0x2, 0x1b,0xae, +0xe8,0x0, 0x8c,0x83,0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x12,0x1, 0xe8,0x40,0x3c,0x67, +0xe2,0x0, 0xcc,0x9f,0x2, 0x86,0xc4,0x81,0xe2,0x1, 0xc4,0xff,0xf8,0x40,0x3a,0xe4, +0x17,0xfe,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xc7,0x81,0x37,0xa2,0xe8,0x0, 0x98,0x87, +0xf8,0x0, 0x99,0x17,0xe0,0x2, 0x1e,0xae,0xe0,0x10,0x3c,0x1f,0xf0,0x40,0x3b,0xe8, +0x15,0x0, 0x0, 0xad,0xe8,0xe, 0x3f,0x22,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x3e,0x1e, +0xe2,0x0, 0xce,0x0, 0xe2,0x1, 0xc7,0xff,0x5, 0x30,0xe2,0x1, 0xc7,0x7f,0xf0,0x40, +0x38,0xef,0x3e,0x6e,0xf2,0x1, 0xc0,0xff,0xe2,0x1, 0xc6,0x7f,0xf0,0x40,0x38,0xfc, +0x3, 0x82,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x3f,0xf9,0x4, 0x8d,0xc5,0x1, 0xe2,0x1, +0xc5,0x7f,0xf0,0x0, 0x99,0x3d,0xe0,0xf, 0x35,0x22,0x3f,0x98,0xb5,0x8f,0x38,0xeb, +0xf0,0x0, 0xb1,0x1f,0xc6,0x84,0xe8,0x40,0x3e,0xf0,0x1, 0x12,0x9d,0xad,0x9f,0x3d, +0xe0,0xf, 0x3d,0xa1,0xe3,0xff,0xc7,0xff,0xe0,0x43,0x3e,0x1f,0xe2,0x0, 0xce,0x0, +0x2, 0x4a,0xe0,0x41,0x3f,0xcf,0x0, 0xc7,0xe0,0x41,0x3f,0x4e,0x0, 0xcf,0xe2,0x0, +0xcc,0x9f,0xc5,0x1, 0xe2,0x1, 0xc5,0x7f,0x2, 0x85,0xe2,0x1, 0xcd,0x6b,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0x2a,0xb4,0xe8,0x0, 0xad,0x6, 0x8, 0xe1,0xe0,0x1, 0x9f,0x3f, +0x3f,0x79,0xe7,0xfe,0x3, 0xfe,0xe2,0x0, 0xcd,0xa, 0xe0,0x1, 0xb4,0xbf,0xe0,0x1, +0xb4,0x2f,0xe7,0xfe,0x1, 0xfa,0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f, +0x96,0x7f,0x3e,0xab,0x3f,0x2c,0xe0,0x2, 0xb6,0x8f,0xe0,0x2, 0xb7,0x1f,0x38,0x82, +0x9f,0x4f,0x3f,0x78,0xe7,0xfe,0x3, 0xdf,0xb4,0x4f,0xb4,0xdf,0xe7,0xfe,0x0, 0xdb, +0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f,0x96,0x7f,0x3e,0xab,0x3f,0x2c, +0xe0,0x2, 0xb6,0xaf,0xe0,0x2, 0xb7,0x3f,0x38,0x82,0xe8,0x0, 0xac,0x83,0x0, 0xcc, +0x38,0x82,0xe0,0x1, 0x1c,0x5b,0xe0,0x6e,0x0, 0xe5,0x0, 0x0, 0x17,0xe0,0x3f,0x98, +0xe2,0x0, 0xcf,0x83,0x5, 0x96,0x24,0x14,0xe0,0x2, 0x1e,0xb6,0x16,0x6, 0xe0,0x3, +0x1f,0x88,0xe0,0x2, 0x1f,0x2e,0xe0,0x3, 0x1d,0x87,0xae,0xd, 0xc7,0x84,0x96,0xf, +0x96,0x9f,0xb6,0xe, 0x3f,0xfb,0xc7,0x4, 0xe0,0x40,0xb6,0x9e,0x1, 0xf8,0x38,0x82, +0xe0,0x3, 0x1f,0x8, 0xe0,0x2, 0x1f,0xae,0x95,0xae,0x96,0x3e,0xe0,0x1, 0x96,0xce, +0xe0,0x2, 0x1d,0x36,0xe0,0x1, 0x97,0x5e,0x14,0x82,0xac,0x8a,0xb5,0x8f,0xb6,0x1f, +0xb6,0xaf,0xb7,0x3f,0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x2, +0x1f,0xdf,0xe0,0x2, 0x1f,0x5d,0x8f,0x8f,0x8e,0xe, 0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xfa,0xe0,0x1, 0x1f,0x5b,0x9e,0x8e,0xe0,0x0, 0x26,0xe6,0xe0,0x3, 0x19,0x8, +0x8d,0x82,0x2f,0x95,0x16,0x81,0xe0,0x2d,0x3e,0xd, 0x26,0x91,0x9f,0x8e,0xe2,0x0, +0xcd,0x83,0xb7,0x92,0xe0,0x1, 0x1, 0x61,0xe0,0x2, 0x1f,0xc0,0x17,0x7e,0xe0,0xa, +0xaf,0x3f,0x17,0x80,0xaf,0x82,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x2, 0x1f,0x5e, +0xe0,0xd, 0x8e,0x8e,0xe2,0x0, 0xce,0x81,0x1, 0x70,0xe0,0x6, 0x9a,0xae,0xe0,0x6, +0x9a,0x3e,0xe0,0x0, 0x25,0xfb,0xe2,0x0, 0xcd,0x81,0xe0,0x1, 0x1, 0x55,0xea,0x11, +0x7b,0x50,0xea,0x11,0x7b,0xce,0x97,0x86,0x94,0x87,0xe2,0x0, 0xcd,0x83,0xe0,0xf, +0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff,0xe0,0x2, +0x1, 0x14,0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe2,0x1, 0xc7,0xff,0xe2,0x1, +0xc4,0xff,0xe2,0x0, 0xce,0x80,0xf0,0x0, 0x1c,0xf, 0xe0,0x1, 0x5, 0x20,0xe2,0x0, +0xcf,0x0, 0xe0,0x1, 0x5, 0x2b,0x3e,0xef,0x3f,0x69,0xe2,0x1, 0xc6,0xff,0xe2,0x1, +0xc7,0x7f,0x3e,0xfe,0x3, 0x82,0x3f,0xe9,0xe8,0x0, 0x8f,0x8, 0xe2,0x1, 0xc7,0xff, +0x3f,0x7f,0xe7,0xff,0x3, 0xba,0x3c,0xe4,0x3c,0x65,0xde,0x83,0xb2,0x86,0xb2,0x7, +0xe7,0xff,0x0, 0xb3,0xe0,0x2, 0x1f,0x87,0x17,0x1, 0xaf,0xf, 0x17,0x7e,0xe0,0x2, +0x1f,0xc0,0xe0,0xa, 0xaf,0x3f,0xe0,0x3, 0x1f,0x88,0xae,0x8f,0xf8,0x0, 0xc, 0xa8, +0xb, 0xe1,0xe0,0x0, 0x1f,0xd, 0xe0,0x1a,0x9f,0x5e,0xe2,0x0, 0xcf,0x1e,0xe7,0xff, +0x2, 0x82,0xe0,0x3, 0x19,0x8, 0x8d,0x82,0xe0,0x1, 0x25,0xdd,0xe0,0x1, 0x1f,0x5b, +0x9e,0x8e,0xe7,0xff,0x2e,0x80,0xe0,0x2, 0x1f,0x87,0x17,0x1, 0xaf,0xf, 0x17,0x7e, +0xe0,0x2, 0x1f,0xc0,0xae,0x82,0xe0,0xa, 0xaf,0x3f,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1, +0xe0,0x2, 0x1f,0x5e,0xe0,0xd, 0x8e,0x8e,0xe2,0x0, 0xce,0x81,0xe7,0xfe,0x1, 0x76, +0xe0,0x6, 0x9a,0xae,0xe0,0x6, 0x9a,0x3e,0x11,0x80,0xe7,0xfe,0x2e,0x76,0xf0,0x0, +0x14,0x81,0xe8,0x2f,0x3f,0x89,0xe7,0xfe,0x27,0xf0,0xe0,0x3, 0x1c,0x8, 0x15,0x28, +0x3c,0xe3,0xe0,0x8, 0xdc,0xe1,0xe0,0x2, 0x1c,0x2e,0xe0,0x7, 0x15,0x40,0x3c,0xe3, +0xe0,0x8, 0xdc,0xda,0xe0,0x1, 0x1f,0xad,0xea,0x11,0x7b,0x50,0x8f,0xf, 0xe0,0x1, +0x1f,0xac,0x37,0x28,0x8f,0x8f,0xea,0x11,0x7b,0xce,0x3f,0xce,0xe0,0x2, 0x1f,0x40, +0xf0,0x0, 0x1c,0xf, 0xe0,0xa, 0xa9,0xbe,0x3c,0xe4,0xe0,0x1, 0x1f,0x5b,0xb7,0x8e, +0xe0,0x2, 0x1f,0xb6,0x3c,0x65,0xa9,0x8f,0x17,0x82,0xe8,0x0, 0xaf,0x88,0xb2,0xa2, +0xb2,0x32,0xb2,0xc2,0xb2,0xe2,0xe0,0x1, 0xb2,0x82,0xe0,0x1, 0xb2,0xa2,0xb2,0x52, +0xb2,0x72,0xe0,0x1, 0xb2,0x12,0xe0,0x1, 0xb2,0x32,0xb2,0x86,0xb2,0x7, 0xde,0x1, +0x3c,0xe3,0xf0,0x0, 0xac,0x82,0x3f,0x63,0x3f,0xe3,0xe0,0x41,0x3f,0xcf,0xe2,0x1, +0xc7,0xff,0xe7,0xfe,0x0, 0xde,0x2f,0xbb,0xaf,0x82,0x17,0x7e,0xe0,0x2, 0x1f,0xc0, +0xe0,0xa, 0xaf,0x3f,0xe7,0xfe,0x0, 0xa1,0xe0,0x41,0x3c,0xc9,0xe2,0x1, 0xc4,0xff, +0xe7,0xfe,0x0, 0xd3,0xe0,0x1, 0x1f,0xab,0x9f,0x42,0x8e,0x8f,0xe0,0x1, 0x1f,0xaa, +0xe0,0x1, 0x9e,0x2, 0x8f,0x8f,0x36,0xa8,0x3f,0x2c,0x3f,0xcd,0x3f,0x7f,0xea,0x11, +0x7b,0x50,0xea,0x11,0x7b,0xce,0x2, 0x26,0xe0,0x1, 0x1f,0xa9,0xe0,0x1, 0x9f,0x32, +0x8e,0x8f,0xe0,0x1, 0x1f,0xa8,0x9e,0x72,0x8f,0x8f,0x36,0xa8,0x3f,0x2c,0x3f,0xcd, +0x3f,0x7f,0x2, 0x18,0x97,0x86,0x94,0x87,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29, +0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff,0xe7,0xfe,0x0, 0x95,0xe0,0x1, 0x9c,0xd2, +0xe0,0x1, 0x9c,0x42,0x17,0x84,0xaf,0x82,0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xfb, +0x0, 0xb1,0x97,0x86,0x94,0x87,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff, +0xc7,0xff,0xe3,0xff,0xc4,0xff,0x17,0x3, 0xaf,0x2, 0xe0,0x43,0x3e,0x9f,0xe0,0x43, +0x3f,0x19,0xe0,0x1, 0xb2,0xc2,0xe2,0x1, 0xc7,0xff,0xe0,0x1, 0xb2,0x52,0xe2,0x1, +0xc4,0xff,0xe7,0xfd,0x0, 0xf8,0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe0,0x1, +0xb2,0xc2,0xe2,0x1, 0xc7,0xff,0xe0,0x1, 0xb2,0x52,0xe2,0x1, 0xc4,0xff,0xe7,0xfd, +0x0, 0xea,0x17,0x1, 0xe0,0x2e,0x3e,0xe, 0xe7,0xfe,0x27,0x34,0x3f,0x6f,0xe4,0x0, +0xcf,0x1, 0xe2,0x0, 0xc7,0x1, 0xe7,0xfe,0x27,0x2d,0xe0,0x1, 0x1f,0xdb,0x97,0x8f, +0xb7,0x92,0xe7,0xfd,0x0, 0xa3,0x8, 0xb4,0xe0,0x2, 0x19,0xc0,0xe0,0xa, 0x8f,0x83, +0x27,0x93,0xe0,0x3, 0x19,0x8, 0xde,0x79,0x8f,0x82,0xe2,0x0, 0xcf,0x84,0x1, 0x12, +0xef,0xff,0xd6,0xd0,0x3a,0x68,0x22,0x7, 0xe0,0x2, 0x1f,0xdc,0x17,0x1, 0xe0,0xa, +0xaa,0x33,0xaf,0xf, 0xa, 0x61,0xe0,0x3, 0x1f,0x8, 0xaf,0x8e,0xa, 0x21,0xe7,0xed, +0x0, 0xb7,0x97,0x42,0xe0,0x1, 0x96,0x2, 0xe0,0x1, 0x97,0xb2,0x96,0xf2,0x3f,0x2c, +0x3f,0xad,0xe0,0x1, 0xb7,0x62,0xe0,0x1, 0xb7,0xf2,0xd2,0x7d,0x3a,0x68,0x24,0xc, +0xe2,0x1, 0xca,0x7f,0x17,0x80,0xe0,0x6f,0x39,0xa4,0x3a,0x6f,0x3c,0x64,0xde,0x1f, +0x17,0x80,0xaf,0x82,0x0, 0xd9,0xe0,0x2, 0x1f,0xb6,0xe0,0x2, 0x1c,0x2e,0x8d,0xf, +0x3c,0xe2,0xdb,0x31,0x3a,0x68,0x0, 0xf3,0x8, 0xb4,0xe2,0x0, 0xcc,0x1, 0x39,0xe8, +0x39,0x68,0x17,0x80,0x5, 0x89,0x31,0x41,0xe2,0x0, 0xc9,0x1, 0xc7,0x81,0xe2,0x1, +0xc7,0xff,0x1, 0xfa,0x37,0xc1,0x31,0x3f,0xe4,0x0, 0xc1,0x3, 0x12,0x1, 0x31,0x54, +0x3c,0xe2,0x3c,0x63,0xe0,0x8, 0xdb,0x6f,0x3c,0x12,0x34,0x41,0xe0,0x2, 0x3c,0x22, +0xe0,0x43,0x3f,0x92,0xe0,0x41,0x3f,0x4f,0xe2,0x0, 0xcf,0x80,0xe1,0x2e,0x3f,0x14, +0xe1,0x2f,0x39,0x14,0xe0,0x6f,0x3d,0x2e,0x39,0x68,0x2f,0xeb,0xa, 0x61,0xe0,0x2, +0x1f,0xae,0x34,0x22,0x34,0xa2,0x3c,0x9f,0x3c,0x1f,0x9f,0x88,0x9f,0x9, 0x9c,0x18, +0x3f,0xae,0x9f,0x19,0xe0,0x43,0x3e,0x9f,0xe2,0x0, 0xce,0x80,0x3c,0x2e,0xe0,0x43, +0x3f,0x18,0xe0,0x41,0x3e,0xcd,0xe0,0x6f,0x3d,0x2d,0xe2,0x0, 0xcf,0x0, 0xe0,0x41, +0x3f,0x4e,0xe0,0x68,0x3d,0x2e,0x3f,0xbf,0x3c,0x38,0x3c,0x1f,0xe2,0x0, 0xcc,0x5, +0x2, 0x88,0xe2,0x0, 0xcc,0x2, 0xe0,0xf, 0x34,0x41,0xe0,0x68,0x3b,0xaf,0x38,0x82, +0xe7,0xff,0x0, 0xac,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x1, 0x1f,0xa7, +0x13,0x0, 0xf0,0x0, 0x8e,0xf, 0xe0,0x1, 0x1f,0xa6,0x3a,0x68,0x8f,0x8f,0xf0,0x0, +0x14,0x81,0x7f,0x81,0xf0,0x40,0x3d,0x66,0xf0,0x40,0x3d,0xe6,0xe0,0x0, 0x11,0xa8, +0xe2,0x0, 0xca,0x1, 0xf0,0x0, 0x14,0x0, 0x5, 0xba,0x11,0x1, 0xf8,0x40,0x3e,0xe8, +0xe8,0x40,0x3a,0xe8,0x0, 0x8b,0xe8,0x40,0x3a,0xed,0x3b,0xe8,0xf0,0x40,0x3e,0xe2, +0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x3a,0x72,0x1, 0x2a,0xe8,0x40,0x3c,0xed,0x3c,0x62, +0xdf,0xa7,0x3c,0x73,0xf0,0x40,0x3f,0x68,0x4, 0xf4,0xf7,0xff,0x26,0xee,0x3c,0xe2, +0x3c,0x65,0xdf,0x9e,0xe8,0x8, 0x3c,0x1c,0xe8,0xe, 0x3b,0x9e,0x3f,0x78,0x4, 0xbe, +0xe2,0x0, 0xcb,0x5, 0x17,0x1, 0xe8,0xe, 0x3f,0x18,0xe0,0x0, 0x2, 0xe8,0xe8,0x40, +0x3a,0xed,0xf0,0x40,0x3e,0xe2,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x3a,0x72,0xf0,0x40, +0x3c,0x6e,0xf2,0x1, 0xc4,0x7f,0xe8,0x40,0x3b,0xee,0x1, 0xd8,0xe2,0x0, 0xcb,0x5, +0x3f,0x66,0xe2,0x1, 0xc7,0x7f,0xc1,0x8a,0x2, 0xb3,0xe8,0x40,0x3e,0xe8,0xe8,0x40, +0x3f,0xeb,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe2,0x1, 0xc1,0xff, +0x3, 0x83,0xf8,0x40,0x3c,0x6b,0xe2,0x0, 0xcf,0x5, 0xf8,0x40,0x3d,0xe8,0xf2,0x1, +0xc5,0xff,0xe0,0x0, 0x1, 0x59,0xf2,0x0, 0xcc,0x8c,0x1, 0x27,0xf0,0x0, 0xc4,0x81, +0xc3,0x1, 0xf2,0x1, 0xc4,0xff,0xe7,0xff,0x0, 0x9d,0xe2,0x0, 0xcb,0x5, 0xe8,0x40, +0x3f,0xed,0xe0,0x6f,0x3a,0xa5,0x3a,0xef,0x3f,0xe2,0xe0,0x7e,0x3a,0xa7,0xe8,0x6f, +0x3a,0xad,0xe8,0x40,0x3b,0xee,0xf0,0x40,0x3e,0xef,0xe7,0xff,0x0, 0x9b,0xe2,0x1, +0xc1,0xff,0xf0,0x0, 0x2d,0xaa,0xf0,0x0, 0x2d,0x10,0xf2,0x0, 0xcc,0x8c,0xf8,0x40, +0x3d,0xea,0xf0,0x0, 0x66,0x1, 0x1, 0xdb,0xf2,0x0, 0xcd,0x8a,0x2, 0x95,0xf0,0x0, +0x2d,0xa8,0xf0,0x0, 0x25,0x6, 0xf0,0x0, 0xc5,0x10,0xf2,0x1, 0xc5,0x7f,0xe8,0x40, +0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x0, 0xc5,0x1, 0xf2,0x1, +0xc5,0x7f,0xe7,0xfe,0x0, 0xf7,0xf0,0x0, 0x15,0xf, 0xe8,0x40,0x3c,0x6a,0xc0,0x4, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf2,0x0, 0xcd,0x8b,0xf0,0x0, 0x15,0xf, 0xe8,0x7a, +0x3c,0xab,0xe8,0x40,0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf8,0x40, +0x3d,0x6b,0x0, 0xde,0x11,0xb2,0xe7,0xff,0x0, 0xab,0xf0,0x3, 0x1a,0x8, 0xf8,0x0, +0x9b,0xb4,0xe8,0x1, 0x9c,0xd4,0xe8,0x0, 0x9e,0x44,0xf0,0xa, 0x3b,0xa9,0xf0,0x40, +0x39,0x6a,0xe8,0x1, 0x9f,0x4, 0xf3,0xff,0xc1,0x7f,0xe8,0x43,0x3e,0x92,0xe0,0xf, +0x3e,0x2e,0xe2,0x0, 0xce,0x80,0xe8,0xd, 0x3c,0xa7,0xf8,0x1, 0x9b,0x34,0xf8,0x0, +0x9a,0xf4,0xf0,0x40,0x39,0xef,0xe3,0xff,0xc6,0xff,0xf3,0xff,0xc1,0xff,0xe0,0x72, +0x3d,0x2d,0xe0,0x1, 0x1e,0xa5,0xe8,0x43,0x3d,0x93,0xf8,0x8, 0x3b,0x25,0xe2,0x0, +0xcd,0x80,0x3f,0xe8,0x8d,0x8d,0xe0,0x1, 0x1e,0xa4,0xe3,0xff,0xc7,0xff,0x3f,0x2c, +0xe0,0x43,0x3d,0x1f,0xe3,0xff,0xc7,0x7f,0x8e,0x8d,0xe0,0x73,0x3d,0x2e,0xf8,0xc, +0x3a,0xa6,0xe2,0x0, 0xcd,0x0, 0xe0,0xe, 0x35,0xa8,0xe3,0xff,0xc6,0x7f,0x3f,0x4d, +0xe0,0x6f,0x3d,0x2c,0xf0,0x40,0x39,0xfe,0x14,0x0, 0xe0,0x0, 0x3, 0xd2,0xe0,0x1, +0x1f,0x23,0xe0,0x1, 0x1e,0xa2,0x8f,0xe, 0x8e,0x8d,0x37,0x28,0x3f,0x4d,0xe1,0x2d, +0x3f,0x9e,0xe0,0x0, 0x26,0xc5,0xe9,0x2f,0x3f,0x93,0xe0,0x0, 0x27,0xc1,0xe8,0x0, +0x8c,0x14,0x2c,0x3d,0xe0,0x1, 0x1f,0xad,0xe0,0x1, 0x1e,0xa1,0x8d,0x8f,0xe0,0x1, +0x1f,0xa0,0x8e,0x8d,0x8e,0xf, 0xe0,0x1, 0x1f,0xac,0x36,0x28,0x8f,0x8f,0x35,0xa8, +0x3e,0xcc,0x3f,0xcb,0xe8,0x0, 0x9e,0x14,0xe0,0xd, 0x3f,0xad,0x3e,0x7d,0x5, 0x28, +0xe0,0x1, 0x1e,0x9f,0x8d,0x8d,0xe0,0x1, 0x1e,0x9e,0x35,0xa8,0x8e,0x8d,0x3e,0xcb, +0x3f,0xad,0xe0,0x2f,0x3f,0x9c,0x27,0x9c,0xf1,0x2f,0x39,0x1e,0x27,0x99,0xe0,0x1, +0x1f,0x9d,0xe0,0x1, 0x1f,0x1c,0x8f,0x8f,0x8f,0xe, 0xf0,0x40,0x3b,0xf9,0x37,0xa8, +0x3f,0x4f,0x3, 0x8f,0xf8,0xf, 0x3b,0xa5,0x3f,0xfe,0x3, 0xa, 0xf0,0xf, 0x3b,0x29, +0x3f,0x7f,0x17,0xa3,0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe8,0xf, 0x3c,0xa5,0x3f,0xfe,0x3, 0x7c,0xf8,0xf, 0x3b,0x27,0x3f,0x7f,0x17,0xa2, +0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0xe0,0x3, 0x1e,0x8, 0xf0,0x0, 0x9b,0xac, +0xf0,0x1, 0x9a,0xcc,0xf0,0x0, 0x9a,0x4c,0xf0,0x1, 0x9b,0xc, 0xf8,0xd, 0x3b,0xa5, +0xe3,0xff,0xc6,0xff,0xe0,0x43,0x3f,0x1d,0xf8,0xf, 0x3a,0x26,0xe2,0x0, 0xcf,0x0, +0xe3,0xff,0xc7,0xff,0xf8,0xa, 0x3a,0xa7,0xe0,0x43,0x3c,0x9f,0xe0,0x1, 0x9c,0x3c, +0x9d,0xfc,0xe3,0xff,0xc5,0x7f,0xe0,0x6d,0x3d,0x2a,0xe2,0x0, 0xcc,0x80,0xf8,0xa, +0x3b,0x24,0xe0,0xe, 0x3c,0x2b,0xe3,0xff,0xc5,0x7f,0xe0,0x1, 0x1c,0x9b,0xe3,0xff, +0xc7,0x7f,0xe0,0x6f,0x3d,0x2a,0xe0,0x1, 0x1d,0x1a,0xf0,0x43,0x39,0x9e,0x8c,0x89, +0x3d,0xa8,0xf2,0x0, 0xc9,0x80,0x8d,0xa, 0xe3,0xff,0xc5,0xff,0x34,0xa8,0xe0,0x6e, +0x3d,0x2b,0xe0,0xb, 0x3d,0x49,0xe1,0x2b,0x3d,0x9e,0xe0,0x0, 0x25,0xcd,0xe1,0x2f, +0x3f,0x9e,0xe0,0x0, 0x27,0xc9,0x8c,0x1c,0xe0,0x0, 0x2c,0x46,0xe0,0x1, 0x1f,0xad, +0x9e,0x1c,0x8d,0xf, 0xe0,0x1, 0x1f,0x99,0x35,0x28,0x8d,0x8f,0xe0,0x1, 0x1f,0xac, +0x35,0xa8,0x8f,0xf, 0xe0,0x1, 0x1f,0x98,0x3f,0x4a,0x8f,0x8f,0x3f,0xcb,0xe0,0xf, +0x3f,0x2f,0x3e,0x7f,0x5, 0x31,0xe0,0x1, 0x1f,0x97,0x8d,0x8f,0xe0,0x1, 0x1f,0x96, +0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3f,0x2f,0x3e,0x7e,0x3, 0x26,0xe0,0x1, 0x1f,0x95, +0x8f,0xf, 0xe0,0x1, 0x1f,0x94,0x37,0x28,0x8f,0x8f,0x3f,0xce,0x3e,0xff,0x5, 0x9c, +0xe0,0x1, 0x1f,0x9d,0xf8,0x40,0x3b,0xf5,0x8f,0xf, 0xe0,0x1, 0x1f,0x9c,0x37,0x28, +0x8f,0x8f,0x3f,0xce,0x37,0xc1,0x5, 0x91,0xf8,0x16,0x3a,0xa6,0xf0,0x40,0x3b,0x7f, +0x3, 0xb, 0xf8,0x17,0x3a,0x27,0xe8,0x40,0x3f,0xf7,0x17,0xa0,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82,0xf8,0x17,0x3b,0xa6,0xf0,0x40,0x3b,0xff, +0x3, 0x7b,0xf8,0x15,0x3a,0x25,0xe8,0x40,0x3f,0xf5,0x17,0xa1,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0x8, 0xb1,0xe0,0x2, 0x1f,0xb6,0x84,0xf, 0xc4,0x7f,0xe2,0x1, +0xc4,0x7f,0xdd,0xe9,0x17,0x80,0x2c,0xc, 0xde,0xb1,0x3f,0xe8,0x2c,0x9, 0xdf,0x55, +0xe2,0x0, 0xcc,0x0, 0xe0,0x1, 0x17,0x7f,0xe0,0x6e,0x39,0xa8,0x3f,0xee,0x3c,0x6f, +0x8, 0xe1,0xe0,0x2, 0x1f,0x91,0xe6,0x1, 0x16,0xff,0xa7,0x8f,0x34,0x28,0xa7,0x5f, +0x3f,0x5d,0xbf,0x5f,0xa7,0x5f,0x3c,0x4e,0xbc,0x5f,0x38,0x82,0xe0,0x2, 0x1e,0xfd, +0xe0,0x3, 0x1f,0x13,0x8f,0xdd,0x8e,0x4d,0xe0,0x2, 0x1e,0x93,0x3f,0xbc,0x37,0xa1, +0xb7,0x8e,0x9f,0x8e,0x37,0xc9,0xe0,0x3, 0xaf,0xcd,0x9f,0x8e,0x37,0xc1,0xe0,0x3, +0xaf,0xdd,0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x19,0x13,0xe0,0x6, 0x8c,0x12,0xe0,0x6, +0x8c,0xa2,0xe0,0x2, 0xd7,0x4f,0xe4,0x8, 0x34,0x21,0xe0,0x3, 0x9f,0xc2,0xe4,0x8, +0x34,0x40,0x3c,0x7f,0x3, 0x88,0xe0,0x1, 0x1f,0x4f,0xe0,0x3, 0xb4,0x42,0x9f,0x8e, +0xcf,0xa0,0xb7,0x8e,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x20, +0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0x37,0x28,0xe0,0x2, 0x19,0x13, +0x3c,0x4e,0x17,0x81,0xaf,0xc2,0xe0,0x7, 0xd3,0x42,0x14,0x1, 0xe0,0x4, 0xd0,0xa2, +0xe0,0x2, 0x1f,0xfd,0xe0,0x19,0x16,0x9d,0x17,0x7, 0x3e,0x9f,0xaf,0xd, 0xe0,0x19, +0xc7,0x9e,0xaf,0xf, 0xe0,0x1, 0xd8,0x2b,0x17,0x82,0xaf,0xc2,0x9, 0x61,0xe0,0x3, +0x1f,0x38,0xe0,0x3, 0x1f,0x9d,0xa6,0xe, 0x15,0xfe,0xa6,0xcc,0x97,0xf, 0xe2,0x0, +0xc6,0x81,0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0xfd,0xa6,0xcc,0x97,0xf, 0x36,0xc9, +0xe2,0x0, 0xc6,0x82,0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0x77,0x97,0xf, 0x3d,0xe8, +0xe3,0xff,0xc7,0x7b,0xb7,0xf, 0xe7,0xff,0x17,0x10,0xa6,0x4c,0x96,0x8f,0x3f,0x18, +0x36,0x4c,0xe2,0x0, 0xc6,0x8, 0x3e,0xda,0xe2,0x1, 0xc7,0x7f,0x3e,0xcc,0xe2,0x0, +0xcf,0xd, 0xb6,0x8f,0x9e,0x8f,0x2, 0x89,0xea,0x49,0x7f,0xd8,0xe9,0xff,0xc7,0xff, +0x37,0x22,0x3f,0x1f,0xa7,0x8e,0x3f,0x82,0xe0,0x1, 0x14,0x7f,0x38,0x82,0x3c,0x6d, +0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x8, 0x36,0xc8,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0xa7,0x8f,0xe0,0x1, 0xa4,0x7f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x2, 0x1f,0x91, +0xa7,0x8f,0xa4,0x5f,0x34,0x48,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x2, 0x1e,0x9a, +0x16,0x1, 0x8f,0xd, 0xe0,0x2, 0x1f,0x93,0x3e,0x1e,0xae,0xd, 0xe0,0x1, 0x1e,0xd6, +0x3e,0x9e,0xe0,0x4, 0x8f,0x4f,0x8c,0xd, 0xc7,0x1, 0xe0,0x4, 0xaf,0x4f,0xe0,0x4, +0x8f,0x4f,0x2f,0x6, 0xe0,0x4, 0x8f,0x3f,0xc7,0x1, 0xe0,0x4, 0xaf,0x3f,0xe2,0x0, +0xcd,0xfd,0x1, 0xcd,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x7c,0xaf,0xf, 0x38,0x82, +0x8, 0xb1,0x2c,0x17,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x1, 0x48,0x3c,0x69,0xe0,0x4, 0xd9,0x33,0xe0,0x1, 0x1f,0xcf,0x9f,0x8f,0x27,0x88, +0xe0,0x2, 0x1f,0x13,0xe0,0x1, 0x8f,0xee,0xcf,0x82,0xe0,0x1, 0xaf,0xee,0x8, 0xe1, +0xe2,0x0, 0xcc,0xf, 0x1, 0x3b,0xe2,0x0, 0xcc,0x12,0xe0,0x0, 0x1, 0x52,0xe2,0x0, +0xcc,0x13,0xe0,0x0, 0x1, 0x53,0xe2,0x0, 0xcc,0x11,0x1, 0x3e,0xe2,0x0, 0xcc,0x1, +0xe0,0x2, 0x1, 0x1b,0xe2,0x0, 0xcc,0x9, 0xe0,0x2, 0x1, 0x35,0xe2,0x0, 0xcc,0x5b, +0xe0,0x0, 0x5, 0xce,0xe7,0xff,0x17,0x94,0x3f,0x98,0xe2,0x0, 0xcf,0x81,0xe0,0x2, +0x5, 0xdb,0xe7,0xff,0x17,0x92,0x3f,0x98,0xe2,0x0, 0xcf,0x81,0xe0,0x3, 0x5, 0xb9, +0xe7,0xff,0x17,0x90,0xe0,0xf, 0x3f,0x98,0xe2,0x0, 0xcf,0x8f,0xe0,0x2, 0x2, 0xe8, +0xe2,0x0, 0xcc,0x7b,0xe0,0x3, 0x1, 0x5e,0xe0,0x1, 0x1f,0xcf,0x0, 0xc0,0xe0,0x2, +0x1f,0xe6,0x8f,0x8f,0xe7,0xff,0x2f,0xb7,0x8, 0xe1,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0x93,0x17,0x1, 0xe0,0x1, 0xaf,0x7f, +0xe0,0x2, 0xaf,0xf, 0x8, 0xe1,0xe2,0x0, 0xcc,0x81,0x1, 0x29,0xe7,0xff,0x2c,0xb1, +0xe0,0x1, 0x1f,0xf2,0xa7,0xf, 0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x8, 0xe1,0xe0,0x2, +0x1f,0x93,0xe0,0x2, 0xac,0xaf,0x8, 0xe1,0xe0,0x2, 0x1f,0x93,0xe0,0x2, 0xac,0xbf, +0x8, 0xe1,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x2f,0xdf,0x8, 0xe1,0xe2,0x0, 0xcc,0x30, +0xe0,0x1, 0x1, 0x6f,0xe2,0x0, 0xcc,0x53,0x2, 0x98,0xea,0x4a,0x7f,0x90,0xe9,0xff, +0xc7,0xff,0xe0,0xe, 0x34,0x22,0x3f,0x9e,0xa7,0x8f,0x3f,0x82,0xe0,0x2, 0x1f,0x93, +0xe0,0x2, 0x8f,0x1f,0xe7,0xff,0x2f,0x5, 0xe0,0x2, 0xac,0x9f,0xe7,0xff,0x16,0x80, +0x87,0xf, 0x3f,0x4d,0xaf,0xf, 0x8, 0xe1,0xe0,0x0, 0x1f,0xb0,0x3e,0xe8,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x62,0x17,0xf8,0xe0,0x2, 0x1f,0x13,0x3f,0x98, +0xe2,0x1, 0xc7,0xff,0x3e,0x9e,0xe2,0x0, 0xcf,0xaf,0xac,0x8d,0x2, 0x89,0xea,0x4c, +0x7e,0xe0,0xe9,0xff,0xc6,0xff,0x37,0xa2,0x3f,0x9d,0xa7,0x8f,0x3f,0x82,0xe0,0x1, +0x1f,0xcf,0x17,0x48,0x3f,0x18,0xe2,0x0, 0xcf,0x1e,0xe0,0x2, 0x5, 0x99,0xe2,0x0, +0xcc,0x57,0xe0,0x2, 0x5, 0x99,0x9f,0xf, 0xe0,0x4, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfe, +0x0, 0xc7,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x8, 0xb7,0xf, 0xe7,0xfe,0x0, 0xc0, +0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x4, 0xb7,0xf, 0xe7,0xfe,0x0, 0xb9,0xe0,0x4, +0x87,0xbe,0xe0,0x2, 0x1f,0x1a,0xe0,0x1, 0x1f,0xcf,0xac,0x8e,0xe7,0xfe,0x0, 0xb0, +0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xe0,0x40,0xcf,0x0, 0xb7,0xf, 0x0, 0xd3,0xe0,0x1, +0x1f,0xcf,0x9f,0xf, 0xe0,0x80,0xcf,0x0, 0xb7,0xf, 0x0, 0xcc,0xe0,0x3, 0x8f,0xce, +0xe0,0x3, 0x1f,0x13,0x37,0xa8,0x3f,0x99,0x37,0xa1,0xb7,0x8e,0xe0,0x1, 0x1f,0xcf, +0xe7,0xfe,0x0, 0x96,0xe0,0x3, 0x8f,0xae,0xe0,0x2, 0x1f,0x72,0x37,0xa8,0x3f,0x99, +0x37,0xa1,0xb7,0x8e,0x97,0xe, 0xe0,0x0, 0x1f,0xc8,0xb7,0xf, 0xe7,0xfe,0x0, 0xc6, +0xe0,0x3, 0x8f,0x8e,0x37,0xa8,0x3c,0x9f,0xe0,0x3, 0x1f,0x89,0xb4,0x8f,0xe0,0x1, +0x1f,0xcf,0xe7,0xfd,0x0, 0xfd,0xe0,0x1, 0x1f,0xdc,0x15,0xfb,0xa6,0xf, 0xe0,0x1, +0x1f,0xcf,0xa7,0x4c,0xa6,0xcc,0x37,0x42,0xe2,0x0, 0xc7,0x1, 0xe4,0x0, 0xcf,0x1, +0x37,0x22,0x3e,0xdb,0x3f,0x4d,0xbf,0x4c,0xe7,0xfd,0x0, 0xea,0xe0,0x1, 0x1f,0xcf, +0x9f,0xf, 0xcf,0x2, 0xb7,0xf, 0xe7,0xfd,0x0, 0xe3,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, +0xcf,0x1, 0xb7,0xf, 0xe7,0xfd,0x0, 0xdc,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xe0,0x2, +0xcf,0x0, 0xb7,0xf, 0xe7,0xfe,0x0, 0xff,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x10, +0xb7,0xf, 0xe7,0xfd,0x0, 0xcd,0xe0,0x2, 0x1f,0x8d,0x8f,0x8f,0x2f,0x87,0xe0,0x1, +0x1f,0xf2,0xa7,0xf, 0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x17,0x0, 0xe0,0x3, 0x1f,0x93, +0xe0,0x2, 0x1e,0x93,0xb7,0xf, 0xe2,0x1, 0xcc,0xad,0xac,0x9d,0xe7,0xff,0x1, 0x2f, +0xe2,0x1, 0xcc,0xae,0xe7,0xfd,0x1, 0xf2,0xdd,0xe2,0xe0,0x1, 0x1f,0xcf,0xe7,0xfd, +0x0, 0xaf,0xe2,0x0, 0xcc,0x85,0xe7,0xfd,0x2, 0xb4,0xe0,0x2, 0x1f,0x13,0xe0,0x1, +0xac,0x9e,0xe0,0x0, 0x2c,0xfb,0xe0,0x2, 0xac,0xde,0xe7,0xfd,0x0, 0xdf,0xe0,0x2, +0x1f,0x13,0xe0,0x6, 0x8f,0x8e,0xe0,0x2f,0x3c,0x8f,0xe7,0xfd,0x2f,0xa2,0x17,0x82, +0xe1,0x2f,0x3c,0x9f,0xe7,0xfd,0x2f,0x9d,0xe0,0x0, 0x1f,0xb0,0x16,0xb0,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0xd3,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0xe7,0xfe, +0x2f,0x9d,0xe2,0x0, 0xcc,0x4, 0xe7,0xfd,0x1, 0xc, 0xe2,0x0, 0xcc,0x30,0xe7,0xfe, +0x1, 0x95,0x8, 0xe1,0xe0,0x1, 0x1f,0xcf,0xe0,0x0, 0x1e,0x48,0x9f,0xf, 0x15,0x81, +0xe0,0x1, 0xcf,0x0, 0xb7,0xf, 0xe2,0x0, 0xcc,0x6d,0xe0,0x3, 0x1f,0x15,0x9e,0x8c, +0xa7,0xe, 0x3d,0x9d,0xb5,0x8c,0x3f,0x1d,0xac,0x8e,0xe7,0xfc,0x1, 0xe9,0xe0,0x1, +0x1f,0x58,0xe0,0x0, 0x16,0xec,0xae,0x8e,0xe7,0xfc,0x0, 0xe2,0xe2,0x1, 0xcc,0x6, +0xe0,0x0, 0x1, 0x7e,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x11,0xe2,0x1, 0xcc,0x8, +0xe7,0xfd,0x1, 0x14,0xe2,0x1, 0xcc,0xb, 0xe0,0x1, 0x1, 0x23,0xe2,0x1, 0xcc,0xc, +0xe0,0x1, 0x1, 0x33,0xe2,0x1, 0xcc,0xd, 0xe0,0x1, 0x1f,0xcf,0xe7,0xfc,0x1, 0xc8, +0xe0,0x3, 0x1f,0x38,0x16,0x60,0xa6,0x8e,0xe2,0x0, 0xc4,0x9f,0xe0,0x1, 0xa7,0x5d, +0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x5d,0xe7,0xfc,0x0, 0xba,0x17,0x1, 0x3f,0x58, +0xe0,0x0, 0x2f,0x4b,0xe2,0x0, 0xcc,0xa, 0xe7,0xfc,0x1, 0xb2,0x9f,0xf, 0xe0,0x8, +0xcf,0x0, 0xb7,0xf, 0xe7,0xfc,0x0, 0xac,0xe2,0x0, 0xcc,0x82,0xe0,0x0, 0x1, 0x58, +0xe0,0x1, 0x17,0xfd,0x3f,0xd9,0xe2,0x0, 0xcf,0x81,0x1, 0x6, 0xe2,0x0, 0xcc,0x84, +0xe7,0xfc,0x1, 0xdc,0x17,0x82,0xe0,0x2, 0xaf,0xde,0xe7,0xfc,0x0, 0xd7,0xe0,0x1, +0x1f,0xcf,0xe0,0x2, 0x1e,0x93,0x9f,0xf, 0xcf,0x40,0xb7,0xf, 0xe0,0x3, 0x8f,0xd, +0xe0,0x3, 0x8d,0x9d,0xe0,0x3, 0x8e,0x1d,0x37,0x28,0xc6,0x1, 0xe0,0x3, 0xae,0x1d, +0x3f,0x1b,0xe0,0x3, 0x8e,0x1d,0xe3,0xff,0xc7,0x7f,0x2e,0x6, 0xe0,0x3, 0x8e,0xd, +0xc6,0x1, 0xe0,0x3, 0xae,0xd, 0xe2,0x0, 0xcc,0x6f,0xe0,0x3, 0x1e,0x9b,0xa6,0x8d, +0x3f,0x1d,0xac,0x8e,0xe7,0xfb,0x1, 0xf4,0xe0,0x1, 0x1f,0x58,0xe0,0x0, 0x16,0xee, +0xae,0x8e,0xe7,0xfb,0x0, 0xed,0x9f,0xf, 0xcf,0x20,0xb7,0xf, 0xe7,0xfb,0x0, 0xe8, +0x3c,0x69,0xdd,0x8, 0xe0,0x1, 0x1f,0xcf,0xe7,0xfb,0x0, 0xe2,0xe0,0x1, 0x1f,0xdc, +0x16,0x78,0xa6,0x8f,0xe2,0x0, 0xc4,0x87,0xe0,0x1, 0xa7,0x2d,0xe0,0x1, 0x1f,0xcf, +0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x2d,0xe7,0xfb,0x0, 0xd2,0x16,0x83,0xe0,0x2, +0xae,0xde,0xe0,0x1, 0x1f,0xcf,0xe7,0xfb,0x0, 0xcb,0xe0,0x1, 0x1f,0xdc,0x17,0x3, +0xa6,0x8f,0x3f,0x59,0xe0,0x1, 0xa7,0xad,0xe7,0x9f,0x16,0x7f,0x37,0x2c,0x3f,0xdc, +0x3f,0xce,0xe0,0x1, 0xbf,0xad,0xe7,0xfb,0x0, 0xf9,0xe0,0x6, 0xac,0x8e,0xe0,0x1, +0x1f,0xcf,0x9f,0xf, 0xe1,0x0, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfb,0x0, 0xb1,0xe0,0x1, +0x1f,0xdc,0x15,0xe0,0xa7,0xf, 0x16,0x9f,0xe0,0x1, 0xa6,0x3e,0x3e,0xd9,0x3e,0x5b, +0xe0,0x1, 0xbe,0x3e,0xe0,0x1, 0xa6,0x3e,0xe0,0x1, 0x1f,0xcf,0x3e,0xcc,0xe0,0x1, +0xbe,0xbe,0xe7,0xfb,0x0, 0x9d,0xe0,0x3, 0x1f,0x8d,0x3c,0x69,0xac,0x8f,0xe0,0x2, +0xd1,0x75,0xe7,0xfb,0x0, 0xd3,0xe2,0x0, 0xcc,0x5b,0x3f,0xe8,0xe0,0x0, 0x5, 0xf4, +0xe7,0xff,0x17,0x16,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xf2,0xe0,0x0, +0x17,0x64,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x8c, +0xe7,0xff,0x17,0x12,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x99,0xe7,0xff, +0x17,0x14,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xea,0xe7,0xff,0x17,0x18, +0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xc3,0xe0,0x0, 0x17,0x77,0x3f,0x18, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xe0,0xe7,0xff,0x17,0x10, +0x3f,0x18,0xe2,0x0, 0xcf,0xf, 0xe0,0x1, 0x5, 0xee,0xe0,0x0, 0x17,0x7f,0x3f,0x18, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x8c,0xe2,0x1, 0xcc,0x6, +0xe0,0x1, 0x1, 0x63,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x6f,0xe2,0x1, 0xcc,0x8, +0xe0,0x2, 0x1, 0x3, 0xe2,0x1, 0xcc,0xb, 0xe0,0x2, 0x1, 0x1, 0xe2,0x1, 0xcc,0xc, +0xe0,0x2, 0x1, 0x5, 0xe2,0x1, 0xcc,0xd, 0xe0,0x2, 0x1, 0x5, 0xe0,0x0, 0x17,0x70, +0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x4, 0xe0,0x1, 0x2, 0xdf,0xe2,0x1, +0xcc,0x12,0xe0,0x2, 0x1, 0x12,0xe0,0x1, 0x5, 0xfe,0xe2,0x1, 0xcc,0x13,0xe0,0x2, +0x1, 0x2, 0xe2,0x1, 0xcc,0x14,0xe0,0x2, 0x1, 0x83,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, +0x8c,0x7f,0x38,0x82,0xe0,0x2, 0x1f,0x13,0x3f,0x9e,0x8c,0xf, 0x38,0x82,0xe0,0x3, +0x1e,0x13,0xe0,0x2, 0x1f,0x63,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, +0xcf,0xeb,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0x3e,0x38,0x82,0xe0,0x2, 0x1e,0x72, +0xe0,0x3, 0x1f,0x15,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, 0xcf,0xed, +0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xf2,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6c, +0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x17,0xe0,0x0, 0x1f,0x4a,0x9e,0x8c,0xa7,0xe, +0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x9d,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xde, +0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x1c,0xaf,0xf, 0x38,0x82,0xe0,0x3, 0x1e,0x9, +0xe0,0x3, 0x1f,0x1b,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, 0xcf,0xef, +0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xca,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6e, +0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6a,0xaf,0xf, 0x38,0x82, +0xe0,0x2, 0x1f,0x13,0x16,0x60,0xe0,0x2, 0x8e,0xfe,0x3e,0x1d,0xe2,0x0, 0xce,0x1f, +0xe0,0x0, 0x2, 0xdb,0xe0,0x1, 0x1e,0x53,0x3e,0x9c,0xe0,0x44,0x8c,0xd, 0xe0,0x2, +0x8e,0xfe,0xe2,0x1, 0xcf,0x82,0xc6,0x81,0xe0,0x2, 0xae,0xfe,0xe7,0xff,0x1, 0xa7, +0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x1, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x72, +0xe0,0x3, 0x1f,0x15,0x9e,0x8c,0xa7,0xe, 0xe1,0xff,0x15,0xfe,0x3d,0xdd,0x3f,0x1b, +0x97,0xe, 0xe2,0x0, 0xc6,0x81,0xc7,0x1, 0xe3,0xff,0xc7,0x7f,0xe2,0x0, 0xce,0x80, +0x9d,0x8c,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0x37,0x48,0x16,0x81,0x3e,0x9b,0xe0,0x68, +0x39,0x2e,0xe2,0x0, 0xcf,0xe9,0xb6,0x8c,0xe7,0xff,0x1, 0x81,0xe0,0x1, 0x1f,0xd8, +0xe0,0x0, 0x17,0x68,0xaf,0xf, 0x38,0x82,0xe0,0x0, 0x1e,0x43,0xe0,0x2, 0x1f,0x25, +0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x8a,0xb5,0x8c,0x3f,0x1d, +0x8c,0xe, 0xe7,0xfe,0x1, 0xec,0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x9, 0xaf,0xf, +0x38,0x82,0xe7,0xf7,0x0, 0xee,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f,0xe0,0x1, 0xa4,0x2f, +0xe2,0x0, 0xc4,0x7, 0x38,0x82,0xe0,0x2, 0x8e,0x7e,0xe0,0x1, 0x1e,0xc2,0x3e,0x9c, +0x8c,0xd, 0xe7,0xff,0x0, 0xa6,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f,0xe0,0x1, 0xa4,0x2f, +0x34,0x4c,0xe2,0x0, 0xc4,0x3, 0x38,0x82,0xe2,0x1, 0xcf,0xfe,0x14,0x0, 0xe7,0xfe, +0x1, 0xc6,0xe0,0x2, 0x1f,0xc8,0x17,0x5, 0x8f,0x8f,0x3f,0x3f,0xe0,0x3, 0x1f,0xb0, +0x3f,0x9e,0x8c,0xf, 0x38,0x82,0x14,0x0, 0x38,0x82,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f, +0xe0,0x1, 0xa4,0x3f,0xe2,0x0, 0xc4,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0x8d,0x8c,0xf, +0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x1, 0xa4,0x5f,0xe2,0x0, 0xc4,0x1f, +0x38,0x82,0xe2,0x1, 0xcc,0x11,0x1, 0x8b,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x4f, +0x38,0x82,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x6f,0x38,0x82,0xe0,0x1, 0x1f,0xd6, +0xe0,0x2, 0x8c,0x3f,0x38,0x82,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x5f,0x38,0x82, +0x8, 0xb3,0xe0,0x2, 0x19,0x13,0xe0,0x2, 0x19,0xfd,0xe0,0x3, 0x8f,0xe2,0xe0,0x1, +0x8f,0x3, 0x3f,0x7f,0x1, 0x16,0xe0,0x3, 0x8f,0xe2,0xe0,0x1, 0x8c,0x93,0xe2,0x0, +0xc7,0xbf,0xe0,0x3, 0xaf,0xe2,0xe0,0x3, 0x8f,0xe2,0x3c,0x6f,0xe0,0x1, 0xaf,0x83, +0xe0,0x3, 0xd1,0x2e,0xe0,0x2, 0x1f,0xe6,0x87,0x8f,0xe2,0x0, 0xc7,0x81,0x2f,0xa2, +0xe0,0x3, 0x8f,0xf2,0xe0,0x1, 0x8f,0x13,0x3f,0x7f,0x1, 0x16,0xe0,0x3, 0x8f,0xf2, +0xe0,0x1, 0x8c,0x3, 0xe2,0x0, 0xc7,0xbf,0xe0,0x3, 0xaf,0xf2,0xe0,0x3, 0x8f,0xf2, +0x3c,0xef,0xe0,0x1, 0xaf,0x93,0xe0,0x3, 0xd1,0x13,0xe0,0x2, 0x1f,0xe6,0x87,0x8f, +0xe2,0x0, 0xc7,0x81,0x27,0x82,0x9, 0xe1,0xe0,0x1, 0x8c,0x13,0x9, 0xa1,0xe0,0xe, +0x0, 0x9f,0xe0,0x1, 0x8c,0x3, 0xd7,0x1b,0x0, 0xdc,0x8, 0xb2,0xe0,0x2, 0x1f,0x93, +0x16,0x85,0xe0,0x5, 0x8f,0x1f,0x3e,0xb8,0xe0,0x3, 0x1f,0xb0,0x39,0x68,0x3f,0x9d, +0x8c,0x3f,0xe0,0x3, 0x1f,0x8e,0x3c,0xee,0x3f,0x92,0xaf,0xf, 0xe0,0x7, 0xd9,0x75, +0xe2,0x0, 0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0x14,0x80,0x14,0x3, 0xe0,0x7, 0xd9,0x6d, +0x14,0x80,0x14,0x4, 0xe0,0x7, 0xd9,0x69,0x14,0x80,0x14,0x0, 0xe0,0x7, 0xd9,0x65, +0x9, 0x61,0x8, 0xb5,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0xaf,0x3a,0x68,0xe0,0x3, +0x34,0x23,0x8c,0x32,0xaa,0x2, 0x3c,0xe3,0xe0,0x7, 0xd9,0xd1,0xc1,0x5, 0x39,0x75, +0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xca,0x3c,0xe3,0x14,0x4, 0xa, 0xa1, +0xe0,0xf3,0x0, 0xc5,0x8, 0xb5,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0xaf,0x3a,0x68, +0xe0,0x3, 0x34,0x23,0x8c,0x32,0xaa,0x12,0x3c,0xe3,0xe0,0x7, 0xd9,0xdb,0xc1,0x5, +0x39,0x75,0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xd4,0x3c,0xe3,0x14,0x4, +0xa, 0xa1,0xe0,0xf3,0x0, 0xcf,0x8, 0xb4,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0x2f, +0x39,0xe8,0x8c,0x32,0xa9,0xa2,0x3d,0x63,0x3c,0xe3,0xe0,0x7, 0xd9,0xe8,0xc1,0x5, +0x39,0x74,0x1, 0xf8,0x3d,0x63,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xe0,0x3d,0x63, +0x3c,0xe3,0x14,0x4, 0xa, 0x21,0xe0,0xf3,0x0, 0xda,0x8, 0xb2,0xe0,0x0, 0x1f,0xcd, +0x39,0x68,0x8f,0x8f,0x2f,0xa2,0xe0,0x2, 0x1f,0x93,0x16,0x85,0xe0,0x3, 0x9f,0x4f, +0x3e,0xb2,0xe0,0x3, 0x1f,0xb0,0xe2,0x1, 0xc7,0x7f,0x3f,0x9d,0x8c,0x3f,0x3c,0xee, +0xaf,0x4f,0xe0,0x7, 0xd8,0xd7,0xe2,0x0, 0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0x14,0x8a, +0x14,0x3, 0xe0,0x7, 0xd8,0xcf,0x14,0x8a,0x14,0x4, 0xe0,0x7, 0xd8,0xcb,0x14,0x85, +0x14,0x0, 0x9, 0x21,0xe0,0xf1,0x0, 0xc6,0xda,0x7e,0x0, 0xde,0x16,0x83,0xe0,0x2, +0x1f,0xc4,0x3e,0xb8,0xe0,0x2, 0x1f,0x13,0xe0,0xc, 0x3f,0x9d,0xe0,0x4, 0x8d,0x8e, +0x8d,0xc, 0x3d,0x7b,0x1, 0x4, 0xe0,0x4, 0x8d,0x8e,0xad,0x8c,0xe0,0xc, 0x3f,0x9d, +0xe0,0x4, 0x8d,0x9e,0x8d,0x1c,0x3d,0x7b,0x1, 0x4, 0xe0,0x4, 0x8d,0x9e,0xad,0x9c, +0x3f,0x9d,0x8e,0x2f,0xe0,0x4, 0x8e,0xae,0x3e,0x7d,0x1, 0x4, 0xe0,0x4, 0x8f,0x2e, +0xaf,0x2f,0xe0,0x10,0x0, 0x8b,0x8, 0xb3,0xe0,0x3, 0x1f,0x38,0xe0,0x2, 0x19,0x48, +0xa7,0x8e,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x86,0x8f,0x82,0xe2,0x0, 0xcf,0x82, +0x1, 0x2, 0x17,0x81,0xe0,0x0, 0x19,0xcd,0xaf,0x82,0xaf,0x83,0x8c,0x82,0x24,0x94, +0xe2,0x0, 0xcc,0x82,0x1, 0x89,0xa7,0x8e,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x83, +0xac,0x82,0xac,0x83,0x9, 0xe1,0x14,0x81,0x14,0x0, 0xe0,0x0, 0xd8,0x1c,0x17,0x81, +0xaf,0x82,0xaf,0x83,0x9, 0xe1,0x3c,0x69,0x9, 0xa1,0xe0,0x10,0x0, 0x94,0x0, 0x0, +0x8, 0xb3,0xe0,0x1, 0x1f,0xf2,0xe0,0x2, 0x19,0x13,0xa6,0x8f,0xe0,0x2, 0x1f,0x63, +0xe0,0x2, 0x8f,0xd2,0xbe,0x8e,0xe0,0x0, 0x27,0xfd,0xe0,0x2, 0x8f,0xd2,0xe2,0x0, +0xcf,0x81,0xe0,0x0, 0x1, 0x77,0xe0,0x2, 0x8f,0xd2,0xe0,0x2, 0x19,0xc8,0xe2,0x0, +0xcf,0x83,0x1, 0x86,0xe0,0x3, 0x1f,0x33,0xe0,0x3, 0x1f,0x9b,0xbf,0xf, 0x16,0x0, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8f,0x2e,0xe2,0x0, +0xc7,0x81,0xe0,0x3, 0x1e,0x89,0x3f,0x7f,0xb6,0xd, 0xe0,0x0, 0x1, 0x69,0xe0,0x2, +0x1f,0x79,0xe0,0x3, 0x1f,0x95,0xbf,0xf, 0x16,0x0, 0x8f,0x3, 0xe0,0x3, 0x1f,0xb0, +0xe4,0x0, 0xc7,0x5, 0x3f,0x1f,0x87,0xe, 0xe0,0x6, 0xaf,0x12,0x8f,0x3, 0xe4,0x0, +0xc7,0x5, 0x3f,0x1f,0x87,0x1e,0xe0,0x6, 0xaf,0x22,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, +0x3f,0x1f,0x87,0x2e,0xe0,0x6, 0xaf,0x42,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, 0x3f,0x1f, +0x87,0x3e,0xe0,0x6, 0xaf,0x52,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, 0x3f,0x9e,0x8f,0xcf, +0xe0,0x3, 0xb7,0xc2,0x17,0x80,0xe0,0x6, 0xaf,0xb2,0xe0,0x3, 0xb6,0x32,0x8f,0x3, +0xe0,0x3, 0x1f,0x8e,0x8c,0x3, 0x3f,0x9e,0x87,0x8f,0xe0,0x5, 0xaf,0x92,0xd7,0x75, +0x8f,0x3, 0xe0,0x2, 0x1f,0xc4,0xe4,0x0, 0xc7,0x3, 0x3f,0x1f,0x87,0xe, 0xe0,0x4, +0xaf,0x2, 0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x1f,0x87,0x1e,0xe0,0x4, 0xaf,0x12, +0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x9e,0x87,0xaf,0xe0,0x4, 0xaf,0xa2,0x81,0x83, +0xe0,0x0, 0x1f,0xcd,0xe0,0x6, 0xa9,0x82,0x87,0x8f,0xe0,0x1, 0xaf,0xc2,0x9, 0xe1, +0xe0,0x2, 0x19,0xc8,0x8f,0x83,0xe2,0x0, 0xcf,0x82,0xe7,0xff,0x1, 0x8d,0xe0,0x3, +0x1f,0x32,0xe0,0x3, 0x1f,0x9b,0xbf,0xf, 0xe7,0xff,0x0, 0x8b,0xe0,0x2, 0x1f,0x78, +0xe0,0x3, 0x1f,0x95,0xbf,0xf, 0xe7,0xff,0x0, 0x99,0x8, 0xb1,0xe0,0x3, 0x1f,0x93, +0x17,0x0, 0x14,0x1, 0xb7,0xf, 0xe0,0x0, 0xde,0xd7,0xdf,0x2e,0xe0,0x0, 0x1f,0xcd, +0x8c,0xf, 0xe0,0x0, 0xdd,0x3d,0x8, 0xa1,0xe7,0xfe,0x0, 0xd4,0x8, 0xb7,0xf8,0x0, +0xc, 0x38,0xe0,0x2, 0x1f,0xc8,0xe0,0x2, 0x19,0x93,0x8a,0xf, 0xe0,0x1, 0x19,0x4f, +0x13,0x5, 0xe0,0x3, 0x1a,0xb0,0x3b,0x34,0xe0,0x6, 0x8d,0x13,0xe0,0x6, 0x8d,0xa3, +0xe0,0x6, 0x8e,0x43,0xe0,0x3, 0x9e,0xc3,0x9f,0x2, 0xe0,0xf, 0x3a,0x96,0x8b,0x8f, +0xf0,0x0, 0x8c,0x1f,0xad,0xf, 0xe2,0x2, 0xc7,0x0, 0xad,0x9f,0xae,0x2f,0xae,0xcf, +0xe0,0x1, 0x2f,0x72,0x9f,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x91,0x9f,0x82,0xe3,0xff, +0xc7,0xfe,0xb7,0x82,0xe0,0x6, 0x8f,0x93,0x37,0xa3,0xe2,0x0, 0xcf,0x86,0xe0,0x0, +0x2, 0x76,0xe0,0xf, 0x3a,0x96,0xab,0x8f,0xe0,0x6, 0xab,0x93,0x9f,0x82,0xe2,0x0, +0xc7,0x82,0x27,0x91,0x9f,0x82,0xe3,0xff,0xc7,0xfd,0xb7,0x82,0xe0,0x6, 0x8f,0xa3, +0x37,0xa3,0xe2,0x0, 0xcf,0x8b,0xe0,0x0, 0x2, 0x73,0x3a,0x96,0xf0,0x0, 0xac,0x15, +0xf0,0x6, 0xac,0x23,0x9f,0x82,0xe2,0x0, 0xc7,0x84,0xe0,0x0, 0x2f,0xfe,0x9f,0x82, +0xe2,0x0, 0xc7,0x88,0xe0,0x1, 0x2f,0x88,0x9f,0x82,0xe2,0x0, 0xc7,0xa0,0xe0,0x1, +0x2f,0x8f,0x9f,0x82,0xe2,0x0, 0xc7,0xc0,0xe0,0x1, 0x2f,0x9d,0x9f,0x82,0xe2,0x1, +0xc7,0x80,0xe0,0x1, 0x2f,0xaa,0x9f,0x82,0xe2,0x4, 0xc7,0x80,0x27,0xa6,0x9f,0x82, +0xe0,0x3, 0x1f,0x38,0xe3,0xfb,0xc7,0xff,0xa6,0x8e,0xb7,0x82,0xe7,0xbf,0x17,0x7f, +0xe0,0x1, 0xa7,0xed,0xe7,0xc0,0x15,0x80,0x3f,0xde,0xe0,0x1, 0xbf,0xed,0xe0,0x0, +0x1f,0xc4,0xe0,0xb, 0x8f,0x23,0xa6,0xf, 0xe4,0x0, 0xc7,0x32,0xe0,0x1d,0xc6,0x40, +0xa7,0xfc,0xe2,0x3f,0xc7,0x7e,0x3f,0xdb,0x3f,0xce,0xbf,0xfc,0xe0,0x1, 0xa7,0xed, +0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x9f,0x82,0xe2,0x8, 0xc7,0x80,0xe0,0x1, +0x2f,0x93,0x9f,0x82,0xe2,0x20,0xc7,0x80,0x27,0x85,0x9f,0x82,0xe3,0xdf,0xc7,0xff, +0xb7,0x82,0x9f,0x82,0xe2,0x40,0xc7,0x80,0xe0,0x0, 0x2f,0xfe,0x9f,0x82,0xe2,0x80, +0xc7,0x80,0x2f,0xa0,0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe0,0x6, 0x8c,0x13,0xe0,0x3, +0xdd,0x6d,0xe7,0xff,0x24,0x8, 0xe0,0x6, 0x8c,0x13,0xdd,0xdc,0xe0,0x0, 0x1f,0xcd, +0x8f,0x8f,0xe7,0xff,0x27,0x85,0xd8,0xc7,0xe7,0xff,0x0, 0x82,0xe0,0x6, 0x8c,0x23, +0xdd,0xea,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0xe7,0xff,0x27,0x8e,0xd8,0xbc,0xe7,0xff, +0x0, 0x8b,0x9f,0x82,0x3c,0x64,0xe3,0x7f,0xc7,0xff,0xb7,0x82,0xf8,0x0, 0xc, 0x28, +0xb, 0xa1,0xe7,0xfa,0x0, 0xd7,0x9f,0x82,0x3c,0x64,0xe3,0xff,0xc7,0xfb,0xb7,0x82, +0x9f,0x82,0xe0,0x20,0xcf,0x80,0xb7,0x82,0xde,0x1, 0x9f,0x82,0xe2,0x0, 0xc7,0x88, +0xe7,0xfe,0x27,0xfc,0x9f,0x82,0xe3,0xff,0xc7,0xf7,0xb7,0x82,0xe0,0x6, 0x8c,0x43, +0xdd,0xdb,0x9f,0x82,0xe2,0x0, 0xc7,0xa0,0xe7,0xfe,0x27,0xf5,0x9f,0x82,0x3c,0x64, +0xe3,0xff,0xc7,0xdf,0xb7,0x82,0x9f,0x82,0xe0,0x4, 0xcf,0x80,0xb7,0x82,0x9f,0x82, +0xe0,0x20,0xcf,0x80,0xb7,0x82,0xdd,0xe2,0x9f,0x82,0xe2,0x0, 0xc7,0xc0,0xe7,0xfe, +0x27,0xe7,0xe0,0x2, 0x1f,0xac,0x9f,0x2, 0x8e,0x8f,0xe3,0xff,0xc7,0x3f,0xe4,0x0, +0xc6,0x9c,0x3c,0xe4,0x3f,0x9d,0xa4,0x4f,0xb7,0x2, 0xd4,0xc7,0x9f,0x82,0xe2,0x1, +0xc7,0x80,0xe7,0xfe,0x27,0xda,0x9f,0x82,0xe3,0xfe,0xc7,0xff,0xb7,0x82,0xd5,0xc4, +0xe7,0xfe,0x0, 0xd3,0x9f,0x82,0x3c,0x64,0xe3,0xfd,0xc7,0xff,0xb7,0x82,0xdd,0x4e, +0xe7,0xfe,0x0, 0x8a,0x9f,0x82,0x3c,0x64,0xe3,0xbf,0xc7,0xff,0xb7,0x82,0xdd,0xdf, +0xe7,0xfe,0x0, 0xfe,0x9f,0x82,0x3c,0x64,0xe3,0xf7,0xc7,0xff,0xb7,0x82,0xe0,0x1, +0x8c,0xa3,0xe0,0x3, 0xdc,0xff,0xe7,0xfe,0x0, 0xe6,0x8, 0xb4,0xe0,0x2, 0x19,0x13, +0x8f,0xc2,0xe2,0x0, 0xcf,0x85,0x1, 0x21,0xe2,0x0, 0xcf,0x84,0x1, 0x36,0xe0,0x1, +0x8f,0xf2,0x2f,0x98,0xe0,0x1, 0x1a,0x4f,0x99,0x84,0x29,0x82,0xa, 0x61,0x14,0x1, +0xe0,0x0, 0xdd,0x8a,0xe0,0x43,0x39,0x93,0xe2,0x0, 0xc9,0x80,0x4, 0x13,0xde,0xb7, +0xe0,0x1, 0x8f,0xe2,0xe2,0x1, 0xc7,0xfd,0xe0,0x1, 0xaf,0xe2,0xa, 0x21,0xe0,0x1a, +0x0, 0xaa,0xe0,0x7, 0xd3,0x9f,0x0, 0xe7,0x17,0x81,0xaf,0xc2,0x17,0x82,0xaf,0xc2, +0x0, 0xdf,0x9f,0x84,0xe0,0x2, 0x1f,0x48,0xe2,0xff,0xc7,0xff,0xb7,0x84,0xe0,0x6, +0x8e,0x82,0x8f,0x8e,0x3e,0xff,0x1, 0x64,0xe0,0x6, 0x87,0x82,0xaf,0x8e,0xde,0x86, +0x14,0x1, 0xe0,0x3, 0xd8,0xdf,0x0, 0xdc,0xd8,0x27,0x0, 0xca,0xe0,0x2, 0x1f,0x93, +0xe0,0x2, 0x8f,0x5f,0x27,0x12,0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0xd, +0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x3, 0x1, 0x1d,0xe0,0x0, 0x1f,0x33,0x8e,0x8e, +0xe2,0x0, 0xce,0x81,0x1, 0x27,0x38,0x82,0xe0,0x2, 0x1f,0x48,0x8f,0xe, 0xe2,0x0, +0xcf,0x2, 0xe0,0x2, 0x1f,0x2c,0x8e,0x8e,0xe4,0x0, 0xc6,0x9c,0x3f,0x1d,0x1, 0x2f, +0xa6,0xce,0xe0,0x3, 0x1f,0x1b,0xbe,0x8e,0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x3, +0x1, 0xe5,0xe0,0x2, 0x1f,0x2c,0x8e,0x8e,0xe4,0x0, 0xc6,0x9c,0x3f,0x1d,0xa6,0xce, +0xe0,0x3, 0x1f,0x1b,0xbe,0x8e,0xe0,0x0, 0x1f,0x33,0x8e,0x8e,0xe2,0x0, 0xce,0x81, +0x1, 0xdb,0xe0,0x2, 0x1d,0xc8,0xe0,0x3, 0x1e,0x30,0x8e,0x8b,0xe4,0x0, 0xc6,0x85, +0x3e,0x9c,0x86,0x8d,0xe0,0x6, 0xae,0x9f,0x8e,0x8b,0xe4,0x0, 0xc6,0x85,0x3e,0x1d, +0x86,0x1c,0xe0,0x6, 0xae,0x2f,0x17,0x80,0xaf,0x8e,0x38,0x82,0xa7,0x4e,0xe0,0x3, +0x1e,0x9b,0xe0,0x6, 0xc7,0x26,0xbf,0xd, 0xe7,0xff,0x0, 0xb4,0x8, 0xb1,0xe0,0x2, +0x1e,0xc0,0xe0,0x2, 0x1e,0x12,0x17,0x80,0xe0,0x4, 0xaf,0xdd,0x17,0x80,0x97,0xc, +0xe3,0xfe,0xc7,0x7f,0xb7,0xc, 0xe0,0x3, 0x1f,0x13,0xe0,0x4, 0x8e,0xdd,0xb7,0x8e, +0xe0,0x2, 0x1f,0x72,0xb7,0x8e,0xe0,0x0, 0x1f,0x48,0xb7,0x8e,0xe0,0x2, 0x1f,0x93, +0x8f,0x6f,0xe0,0x0, 0x1f,0xae,0xae,0x8f,0xe0,0x2, 0x1f,0xfa,0xaf,0xf, 0xe0,0x1, +0xdf,0x41,0xdd,0x67,0x14,0x0, 0xe0,0x3, 0xd8,0x5d,0xe0,0x1, 0x1f,0xf2,0xe0,0xc, +0x15,0x52,0xa4,0xf, 0xe0,0x2, 0x1f,0x81,0xa4,0x8f,0xe0,0x8, 0xd0,0x8b,0xe0,0x3, +0xd6,0x1e,0xe0,0x2, 0x1f,0xf7,0xe0,0x2, 0x1f,0x48,0x8f,0x8f,0x8f,0xe, 0x37,0xde, +0xe2,0x0, 0xc7,0x81,0x27,0x82,0x8, 0xe1,0x8, 0xa1,0xe0,0x18,0x0, 0xf4,0xe0,0x0, +0x1f,0xcd,0xe0,0x2, 0x1f,0x13,0x87,0x8f,0xe0,0x1, 0x1e,0xcc,0xe0,0x1, 0xaf,0xce, +0x14,0x3, 0x86,0x8d,0xe0,0x2, 0x1f,0xde,0xae,0xfe,0xe0,0x3, 0x16,0x91,0x8d,0xee, +0xe0,0x2, 0x1e,0x7a,0x17,0x0, 0x3e,0x9f,0xe0,0x3, 0xc7,0x90,0xad,0x8c,0xaf,0xd, +0xaf,0xf, 0xe0,0x3, 0x0, 0xa8,0x0, 0x0, 0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, +0x1c,0x1f,0xa4,0x8f,0xe0,0xc, 0x15,0x52,0xe0,0x8, 0xd0,0x54,0xe0,0x0, 0x1e,0x1e, +0xe0,0x0, 0x1f,0x1d,0xe0,0x0, 0x1d,0x1c,0x9f,0x9e,0xe0,0x43,0x3d,0x9f,0xe2,0x0, +0xcd,0x80,0xe0,0x41,0x3e,0xcf,0xe3,0xff,0xc6,0xff,0xe0,0x6f,0x3d,0x2d,0xe0,0x80, +0xb7,0x9e,0x9e,0x8c,0x3e,0xff,0x3, 0x82,0xb7,0x8c,0x3f,0x7a,0xc6,0x2, 0x1, 0xed, +0x8, 0xe1,0x0, 0x0, 0x8, 0xb6,0xea,0x11,0x7b,0x52,0xe0,0x2, 0x1a,0x13,0x99,0x6, +0xe0,0x2, 0xa9,0x44,0xe0,0x2, 0x8f,0x94,0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0x21,0x8, +0xe0,0x2, 0x1f,0x12,0x16,0x80,0x97,0x8e,0xb6,0x86,0xcf,0x84,0xb7,0x8e,0xb, 0x61, +0x87,0x84,0xe7,0xff,0x17,0x0, 0x3f,0xce,0xe2,0x0, 0xc9,0x5, 0xaf,0x84,0x2, 0x9d, +0xe0,0x0, 0x1c,0x1e,0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x4d,0xe0,0x2, +0x1c,0xa, 0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x46,0xe0,0x0, 0x1c,0x1f, +0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x3f,0xe0,0x2, 0x1c,0x9, 0xe0,0xc, +0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x38,0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x0, +0xc9,0x5, 0xb1,0x6, 0x2, 0xb8,0xe0,0x2, 0x8f,0xb4,0xe0,0x2, 0x8f,0x24,0x37,0xa8, +0x3f,0x9e,0xc7,0x85,0x39,0x7f,0x1, 0xcc,0xe0,0x3, 0x1f,0x13,0x17,0x80,0xe0,0x2, +0x1e,0x97,0xb7,0x8e,0x11,0x0, 0xb7,0x8d,0x12,0x8a,0xe0,0x0, 0x1f,0x1e,0xe0,0x2, +0xaf,0x94,0x39,0xee,0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x9a,0x3, 0xe2,0x0, 0xca,0x46, +0x5, 0x8c,0x21,0x1b,0xe0,0x40,0x9f,0x93,0x9c,0x13,0x3c,0xe5,0x3c,0x1f,0xe0,0x7, +0xdf,0x9e,0xe0,0x8, 0x3a,0x28,0xb4,0x3, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x6, +0xc9,0x29,0xc1,0x82,0x1, 0xeb,0x17,0x80,0xb7,0x86,0x17,0x1, 0xe0,0x2, 0x1f,0x8d, +0xaf,0xf, 0xb, 0x61,0xdf,0x62,0x0, 0xc8,0x3f,0xe2,0x0, 0xe7,0x8, 0xb7,0xf8,0x0, +0xc, 0x3b,0xe0,0x3, 0x19,0xc7,0xde,0xfb,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0xe0,0x0, +0x1, 0xc0,0xe0,0x2, 0x19,0x13,0xe0,0x2, 0x1b,0xfa,0xe0,0x2, 0x1a,0xe6,0xf0,0x1, +0x1d,0xf2,0xf0,0x2, 0x1d,0x9, 0xe0,0x13,0x12,0x44,0x13,0x1, 0xf0,0x0, 0x14,0x0, +0xf0,0xc, 0x14,0xd2,0x0, 0x86,0xdf,0x24,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0x1, 0xa8, +0xde,0x45,0xe0,0x0, 0xde,0xf4,0xde,0x83,0x3c,0x64,0xe0,0x6, 0xd9,0xf8,0x8f,0x82, +0x37,0xc7,0x27,0xf2,0x3c,0x66,0xe0,0x0, 0xdb,0xd7,0xe0,0x1, 0xde,0x77,0xe0,0x2, +0xdb,0x9f,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0x1, 0x1d,0xe0,0x2, 0x8f,0x92,0x2f,0x9a, +0x8f,0x85,0x27,0x82,0xdf,0x48,0xe0,0x2, 0x8f,0x92,0x2f,0xde,0x87,0x82,0xe2,0x0, +0xc7,0xff,0xaf,0x82,0xde,0xfd,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0x1, 0x5a,0xe0,0x1, +0x1f,0xc5,0x17,0x1, 0x14,0x1, 0xaf,0xf, 0xf8,0x0, 0xd, 0xa8,0xb, 0xa1,0xe0,0x17, +0x0, 0xb3,0x8f,0x85,0x27,0xe9,0xe0,0x3, 0xdf,0xee,0xe0,0x2, 0x8f,0x92,0xe2,0x0, +0xcf,0x81,0x1, 0xc, 0xe0,0x3, 0xde,0x4b,0xef,0xfe,0xd9,0xbd,0xe0,0x1, 0xdf,0xcc, +0xe8,0x40,0x3c,0x68,0xe0,0x4, 0xdf,0xe4,0x0, 0xd4,0xe8,0x0, 0xa4,0x8b,0xe8,0x40, +0x3d,0x69,0xe8,0x40,0x3c,0x6a,0xe0,0x7, 0xdf,0x4d,0x0, 0xed,0x8, 0xb1,0xe2,0x0, +0xcc,0x66,0x1, 0x2f,0x5, 0x98,0xe2,0x1, 0xcc,0x8, 0x1, 0x9, 0xe2,0x1, 0xcc,0x2a, +0x1, 0xa3,0xe0,0x3, 0x1f,0x9a,0x17,0x5, 0xaf,0xf, 0x8, 0xe1,0xe0,0x3, 0x1f,0x9a, +0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xfa,0x14,0x1, 0xe0,0x1, 0xd9,0x9f,0x8, 0xa1, +0xe0,0x32,0x0, 0xf6,0xe2,0x0, 0xcc,0x55,0x1, 0x8f,0xe0,0x3, 0x1f,0x9a,0x8f,0x8f, +0xe2,0x0, 0xcf,0x85,0x1, 0xeb,0x14,0x1, 0xe0,0x1, 0xd9,0x90,0xe0,0x1, 0xd9,0x42, +0x8, 0xa1,0xe0,0x32,0x0, 0xd4,0xe0,0x3, 0x1f,0x9a,0x17,0x1, 0xaf,0xf, 0x8, 0xe1, +0xe0,0x3, 0x1f,0x9a,0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xd8,0x14,0x1, 0xe0,0x1, +0xd9,0x7d,0xe0,0x1, 0x1f,0xdc,0x17,0x7f,0xa7,0x8f,0xe0,0x7, 0xaf,0x3f,0x8, 0xe1, +0x8, 0xb4,0xe0,0x1, 0x1a,0x72,0xe0,0xc, 0x11,0xd2,0xa4,0x84,0xe0,0x3, 0x1c,0x10, +0x3d,0x63,0xe0,0x7, 0xde,0xff,0xe0,0x4, 0xdc,0x37,0xe0,0x0, 0x1c,0x8d,0xe0,0x0, +0x1c,0x12,0xe0,0x3, 0x19,0x3e,0xe0,0x3, 0x15,0x40,0xe0,0x7, 0xde,0xf3,0x3d,0x63, +0x14,0x80,0x3c,0x62,0xe0,0x7, 0xdf,0x28,0xa4,0x84,0x3d,0x63,0x3c,0x62,0xe0,0x7, +0xde,0xe9,0x17,0xac,0xb7,0x82,0xa, 0x61,0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x3, +0x1c,0x10,0xa4,0x8f,0xe0,0xc, 0x15,0x52,0xe0,0x7, 0xde,0xdc,0xe0,0x0, 0x1c,0x8d, +0xe0,0x0, 0x1c,0x12,0xe0,0x3, 0x15,0x40,0xe0,0x7, 0xde,0xd4,0x8, 0xe1,0x8, 0xb1, +0xe0,0x1, 0x1f,0xf2,0xe0,0x3, 0x1c,0x90,0xa4,0xf, 0xe0,0xc, 0x15,0x52,0xe0,0x7, +0xde,0xc9,0xe0,0x1, 0x1f,0xd7,0xe0,0x3, 0x8f,0xbf,0x2f,0x85,0xe0,0x3, 0xd3,0x7f, +0xef,0xfe,0xd9,0x21,0x14,0x1, 0xe0,0x6, 0xd6,0xe, 0x14,0x1, 0x8, 0xa1,0xe0,0x9e, +0x0, 0xc7,0xe0,0x2, 0x1f,0x40,0xe0,0x3, 0x1f,0xc7,0xe0,0x4, 0x87,0x7e,0xaf,0xf, +0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x1f,0xc0,0x17,0x0, 0xe0,0x4, 0xaf,0x5f,0x17,0x0, +0xe0,0x4, 0x8e,0x5f,0xe0,0x0, 0x1e,0xae,0xe0,0x2, 0x1f,0xec,0xe0,0x2, 0x19,0x7d, +0xae,0xd, 0xb7,0xf, 0xe0,0x19,0x17,0x1c,0xe0,0x2, 0x1e,0xc8,0x3f,0x12,0x17,0x81, +0xaf,0x8d,0xaf,0x8e,0xe0,0x1, 0xdd,0x3e,0xdb,0x64,0xe0,0x1b,0x14,0x2c,0xe0,0x6, +0xd8,0xf6,0xe0,0x6, 0xd2,0x9b,0xe0,0x3, 0xd4,0x22,0x14,0x1, 0xe0,0x3, 0xd6,0x52, +0xe0,0x5, 0xd7,0x9a,0xe0,0x19,0x17,0x1d,0x17,0x87,0x3f,0x12,0xaf,0x8e,0xe0,0x19, +0xc1,0x1e,0xaf,0x82,0x9, 0x61,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe0,0x1, +0x1f,0xc5,0xe0,0x2, 0x19,0x40,0x8f,0x8f,0x27,0x87,0xe0,0xd, 0x8f,0xe2,0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x1, 0x19,0xdf,0xbe,0xe0,0x3, 0x19,0xc7,0xe0,0x0, 0x1b,0xb8, +0xf0,0x0, 0x1d,0x9a,0xe0,0x0, 0x1a,0x39,0xe0,0x0, 0x1a,0xbc,0xf0,0x1, 0x1d,0x13, +0xf0,0x1, 0x1c,0x92,0xf0,0x2, 0x1c,0x66,0xe0,0x1, 0x1b,0x69,0xf0,0x1, 0x1e,0x68, +0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x96,0x87,0x84,0x17,0x0, 0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0xe0,0x2, 0xaf,0x92,0xe0,0xa, 0x8e,0x82,0xaf,0x7, 0xe8,0x0, +0xaf,0xb, 0xaf,0x84,0xe0,0x1, 0x2e,0x98,0x9f,0x85,0xe2,0x0, 0xcf,0xe3,0xe0,0x1, +0x2, 0x93,0x9f,0x85,0xc7,0x81,0xb7,0x85,0xe0,0x1, 0xd3,0x77,0xe0,0x4, 0xd7,0xbe, +0xe0,0x0, 0xdd,0x95,0xe8,0x0, 0x8f,0x8a,0xe8,0x0, 0x8c,0x9, 0x37,0xa8,0x3c,0x4f, +0xe0,0x6, 0xd8,0x95,0xe0,0x2, 0xd9,0x94,0xe0,0x4, 0xde,0x97,0xe8,0x0, 0x8f,0x88, +0xe0,0x0, 0x27,0xfe,0x8f,0x86,0xe0,0x0, 0x27,0xdb,0xe0,0x3, 0xde,0xac,0xe8,0x0, +0x8f,0x8c,0xe2,0x0, 0xcf,0x84,0xe0,0x1, 0x1, 0x15,0xf0,0x1, 0x1f,0x57,0xe8,0x3, +0x8f,0xbe,0xe0,0x0, 0x27,0xf7,0xf0,0x2, 0x1e,0xc8,0xe0,0x1, 0xde,0x85,0xe8,0x0, +0x8c,0x8d,0xe8,0x0, 0x8c,0xc, 0xe0,0x2, 0xd9,0x56,0xe8,0x0, 0x8f,0xd, 0xe8,0x0, +0x8f,0x8d,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x6b,0xe0,0x0, 0x1f,0x93,0x17,0x0, +0xaf,0xf, 0x8f,0x86,0x27,0xb4,0x14,0x1, 0xe0,0x6, 0xd5,0x4d,0x14,0x0, 0xe0,0x4, +0xde,0x87,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x23,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x1, 0x18,0xe8,0x0, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x1d, +0xe0,0x4, 0x8f,0xc2,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x6, 0xe0,0x2, 0xd6,0xb2, +0xe0,0x2, 0xde,0x2f,0x14,0x2, 0xe0,0x6, 0xd5,0x2e,0xe0,0x6, 0xd5,0xd3,0x14,0x3, +0xe0,0x6, 0xd5,0x29,0xe0,0x4, 0xd4,0xd0,0x14,0x4, 0xe0,0x6, 0xd5,0x24,0xe0,0x6, +0xd8,0x4d,0xef,0xff,0xd1,0xea,0x8f,0x86,0xe0,0x0, 0x2f,0xca,0x87,0x83,0xe0,0x5, +0xd6,0xd2,0xe0,0x4, 0x87,0xf2,0xaf,0x83,0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe7,0xfe, +0x1, 0x6e,0x14,0x1, 0xe0,0x0, 0xda,0x8, 0xe0,0x4, 0x8f,0xc2,0xe2,0x0, 0xcf,0x81, +0x1, 0x87,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xa7,0xce,0xcf,0x84,0xbf,0xce,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0x17,0x80,0xb7,0x85,0xe7,0xfe,0x0, 0xf0,0x8f,0x86,0xe7,0xfe, +0x27,0xd1,0xe0,0x1, 0xd6,0x4a,0xe0,0x4, 0x87,0xf2,0xaf,0x83,0xe7,0xfe,0x0, 0xca, +0xe0,0x3, 0xd2,0x5d,0xef,0xfe,0xd7,0xff,0xe7,0xff,0x0, 0x87,0xe8,0x0, 0x8f,0x8c, +0x16,0x84,0xe0,0x2f,0x3f,0x8d,0xe7,0xff,0x27,0x96,0xe0,0x3, 0x1f,0xac,0xe4,0x0, +0xc7,0xe, 0x3f,0x1f,0x8f,0xbe,0xe7,0xff,0x27,0x8e,0xde,0x83,0xe7,0xff,0x0, 0x8b, +0xe0,0x3, 0x1f,0xc0,0x17,0x1, 0xaf,0xf, 0xe7,0xfe,0x0, 0xe9,0xe0,0x6, 0xdf,0xa5, +0xe0,0x0, 0x1f,0x87,0xe8,0x3, 0x87,0x3e,0x86,0xf, 0xe0,0x2, 0x1f,0xdf,0x86,0x8f, +0xe0,0x0, 0x1f,0x85,0xae,0xf, 0xe0,0x2, 0x1f,0xdd,0xae,0x8f,0x16,0x80,0xe0,0x2, +0x1f,0xdb,0xae,0x8f,0xe0,0x1, 0x1f,0xcc,0x87,0x8f,0xe0,0x5, 0xaf,0xb2,0xe0,0x2, +0x1f,0xa8,0xaf,0xf, 0xe0,0x1, 0xd6,0x9, 0xef,0xfe,0xdf,0xcd,0xef,0xfe,0xd8,0x55, +0xe7,0xff,0x0, 0xbb,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xa7,0xce,0xcf,0x84,0xbf,0xce, +0xe7,0xfe,0x0, 0xf6,0xe0,0x2, 0x1f,0x7a,0xaf,0x8e,0xe7,0xfd,0x0, 0xe7,0xde,0x80, +0x8f,0x87,0xe7,0xfe,0x0, 0xdd,0xde,0x69,0xe7,0xfe,0x0, 0xe4,0x8, 0xb2,0xe0,0x2, +0x1f,0x40,0x16,0x81,0xe0,0x4, 0xae,0xfe,0x14,0x2, 0xe0,0x4, 0x87,0x7e,0xe0,0x3, +0x1e,0xc7,0xe0,0x2, 0x1f,0xfd,0xaf,0xd, 0x16,0x80,0xe0,0x2, 0x1f,0x13,0xe0,0x1, +0x1e,0x5c,0xae,0x8e,0xe0,0x19,0x16,0x9d,0x3e,0x9f,0x17,0x7, 0xa1,0xc, 0xaf,0xd, +0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0x17,0x7b,0xa7,0xc2,0x3f,0xde,0xbf,0xc2,0xe0,0x1, +0xd7,0x95,0xa7,0xc2,0xcf,0x84,0xbf,0xc2,0x9, 0x61,0x0, 0x0, 0x8, 0xb2,0xe0,0x2, +0x19,0x40,0xe0,0x6, 0xd7,0x22,0xe0,0x2, 0xda,0xa7,0xe0,0x2, 0xdb,0xf8,0xe0,0x1, +0xdb,0xbb,0xe0,0x4, 0xd0,0x21,0xe0,0x4, 0xd1,0x49,0xdf,0xc9,0xe0,0x4, 0x8f,0xf2, +0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0xe2,0x0, 0xcf,0x83,0x1, 0xf9,0xdd,0x50,0xe0,0x4, +0x8f,0xf2,0xe2,0x0, 0xcf,0x81,0x1, 0xf8,0xde,0x88,0x0, 0xf1,0xe0,0xe, 0x34,0x22, +0xe0,0xf, 0x34,0x42,0xe0,0x43,0x3f,0xe, 0xe0,0x3, 0x1d,0xb8,0x16,0x4, 0x16,0x81, +0x3e,0xdf,0x3e,0x5e,0xf0,0x0, 0xa3,0x8b,0x3e,0x4d,0xe2,0x0, 0xc4,0x12,0x16,0x88, +0xe2,0x0, 0xc7,0x20,0x3e,0xdf,0x3e,0x48,0xe0,0x0, 0x1f,0xc4,0xe8,0x1, 0xa5,0xe7, +0x3e,0x4e,0x3e,0xcc,0xa7,0x8f,0xe7,0xbf,0x17,0x7f,0x3f,0x5b,0xe4,0xd, 0x36,0xa5, +0xe0,0x24,0x15,0xf0,0xe0,0x3, 0x1c,0xc8,0xe0,0x3, 0x1d,0x49,0xe8,0x1, 0xbf,0x67, +0xe4,0xc, 0x36,0x2c,0xea,0xe, 0xc6,0x80,0x3d,0x9f,0xe0,0x1a,0xa7,0x2f,0xe0,0x7, +0xc7,0xb0,0x3f,0x59,0xe0,0x43,0xbf,0x2f,0x3f,0xfb,0xe0,0x43,0xa7,0x2f,0x3f,0x4c, +0xe0,0x43,0xbf,0x2f,0xe0,0x40,0xa7,0x1f,0x3f,0x5a,0xe0,0x40,0xbf,0x1f,0xe0,0x40, +0xa7,0x1f,0x3f,0x4d,0xe0,0x40,0xbf,0x1f,0x1, 0xe9,0xe8,0x1, 0xa7,0xe7,0xe0,0x40, +0xcf,0x80,0xe8,0x1, 0xbf,0xe7,0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3b,0xe0,0x2, +0x1f,0x66,0xe0,0x2, 0x1f,0xfd,0x87,0xe, 0x15,0x85,0xe0,0x3, 0x8e,0x2f,0x3d,0xb9, +0xe0,0x3, 0x1e,0xb0,0xe2,0x0, 0xc7,0x1, 0x3e,0x7e,0x3e,0x9b,0xf0,0x40,0x3d,0x69, +0xf0,0x40,0x3c,0xe8,0x8a,0xbd,0xe0,0x1, 0x1, 0x69,0x9b,0x5f,0xe0,0x1, 0x8a,0xf, +0xf0,0x2, 0x1d,0xf9,0xe0,0x3, 0x1f,0xb8,0xe4,0x7, 0xc2,0xb0,0xa1,0x8f,0xe0,0x0, +0x1f,0xc4,0xe7,0xbf,0x17,0x7f,0xa1,0xf, 0xe0,0x1, 0xa7,0xe3,0x3a,0x92,0x13,0xa0, +0x3f,0xde,0xf2,0x0, 0xcd,0x2, 0x3b,0x95,0xe0,0x6, 0x17,0x26,0xe8,0xe, 0x3f,0x19, +0xe0,0x6, 0x15,0x28,0x14,0x80,0xe0,0x1, 0xbf,0xe3,0x3c,0x67,0xf0,0x6, 0x14,0x48, +0xe0,0x79,0x39,0x2e,0xf0,0x18,0x3c,0x15,0xe0,0x7, 0xdc,0xae,0xe0,0x0, 0x15,0x68, +0x14,0x80,0xe8,0x40,0x3c,0x68,0xe0,0x7, 0xdc,0xa7,0x23,0x2e,0x14,0x7f,0x3c,0x16, +0xe3,0xff,0xc4,0x7f,0x14,0xfe,0x15,0x7f,0xe8,0x9, 0x3c,0x9b,0xe8,0xa, 0x3d,0x19, +0xe8,0x8, 0x3c,0x19,0xf0,0x0, 0x13,0x81,0xe0,0x80,0x9f,0x19,0x17,0x84,0x3f,0x9e, +0xe0,0xd, 0x37,0x82,0x36,0xa2,0xe0,0x80,0x8d,0x9a,0x3e,0x97,0xe0,0x41,0x3f,0xe, +0xa6,0xd, 0x37,0x23,0x35,0xbe,0xe0,0xe, 0x37,0x85,0x3e,0x4b,0x37,0x22,0xbe,0xd, +0xe8,0xe, 0x3f,0x18,0xa6,0x8e,0xe0,0x41,0x3f,0x8f,0xf0,0xf, 0x33,0xbf,0x3f,0xcd, +0x3c,0x7a,0xbf,0x8e,0x1, 0xe2,0xe0,0x1, 0xa6,0x5, 0xe0,0x1a,0xa6,0x95,0xe8,0x6, +0x3b,0x19,0x17,0x90,0xe1,0x80,0x8f,0x16,0x37,0x3f,0x3e,0x4e,0xe0,0x1, 0xbe,0x5, +0x8f,0x26,0x37,0x3f,0xc7,0xf8,0x3e,0xce,0xe3,0xff,0xcf,0xf8,0xe0,0x1a,0xbe,0x95, +0x1, 0xf2,0xf2,0x0, 0xcd,0x1, 0x1, 0xe, 0xe0,0x1, 0xa7,0xe3,0x3c,0x64,0xe0,0x40, +0xcf,0x80,0xe0,0x1, 0xbf,0xe3,0xf8,0x0, 0xd, 0xa8,0xb, 0xa1,0xe7,0xfe,0x0, 0x98, +0x3d,0x2, 0x16,0x9c,0x3e,0x95,0xe0,0x16,0x15,0x90,0x3e,0x6d,0x17,0x0, 0x3d,0x92, +0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x1, +0xcf,0x4a,0xbd,0xf, 0x1, 0xf6,0xe0,0x6, 0xc2,0xc4,0xe0,0x16,0x15,0x90,0x3e,0x65, +0x17,0x0, 0x3d,0x92,0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80, +0xa5,0x1c,0x3f,0x9b,0xe2,0x0, 0xcf,0x1a,0xbd,0xf, 0x1, 0xf5,0xe0,0x1d,0x15,0xc0, +0x3e,0x6d,0x17,0x0, 0x3d,0x92,0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80, +0xa5,0x1c,0x3f,0x9b,0xe2,0x1, 0xcf,0x4a,0xbd,0xf, 0x1, 0xf6,0xe0,0x1d,0x15,0xc0, +0x3e,0x65,0x17,0x0, 0xe0,0xb, 0x3d,0x92,0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2, +0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x0, 0xcf,0x1a,0xbd,0xf, 0x1, 0xf5, +0x17,0x0, 0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa6,0x1d,0x3f,0x92, +0xe2,0x1, 0xcf,0x4a,0xbe,0xf, 0x1, 0xf6,0xe0,0x0, 0x17,0x0, 0xe0,0x1, 0x17,0xd2, +0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa6,0x95,0x3f,0x92,0xe2,0x0, 0xcf,0x1a, +0xbe,0x8f,0x1, 0xf5,0xe7,0xff,0x0, 0x92,0x9b,0x6f,0xe0,0x1, 0x8a,0x1f,0xf0,0x2, +0x1d,0xf8,0xe7,0xfe,0x0, 0x99,0x8, 0xb5,0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d, +0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, 0xc7,0x81,0x3e,0xff,0xe0,0x0, 0x1, 0x49, +0x9a,0x5e,0xe0,0x2, 0x19,0x79,0xe0,0x3, 0x1f,0xb8,0xe7,0xbf,0x17,0x7f,0xa2,0x8f, +0xe0,0xc, 0x15,0x40,0xe0,0x1, 0xa7,0xe5,0x14,0x80,0x3f,0xde,0xe0,0x3, 0x1f,0x3f, +0xe0,0x1, 0xbf,0xe5,0xa1,0x8e,0xe0,0xc, 0xc1,0xd0,0x3c,0x63,0xe0,0x7, 0xdb,0xc4, +0x3e,0x62,0x16,0x80,0x2a,0xe, 0x0, 0xa5,0x9d,0x8c,0xa7,0xf, 0xc6,0x81,0xe4,0xb, +0x35,0xa0,0xe3,0xff,0xc6,0xff,0x3f,0x4b,0x3a,0x7d,0xbf,0xf, 0xc6,0x2, 0x1, 0x19, +0xe0,0xf, 0x36,0xc1,0x3f,0x6f,0x15,0x81,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc7,0x7f, +0x37,0xa2,0x3d,0xdd,0x37,0x22,0x3f,0x93,0x25,0xe8,0x3f,0x13,0x9d,0x8c,0xa7,0x8e, +0xc6,0x81,0xe3,0xff,0xc6,0xff,0x3f,0xcb,0x3a,0x7d,0xbf,0x8e,0xc6,0x2, 0x1, 0xe9, +0xe0,0x1, 0xa7,0xe5,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xe5,0xa, 0xe1,0x9a,0x6e, +0xe0,0x2, 0x19,0x78,0xe7,0xff,0x0, 0xb9,0x8, 0xb5,0x11,0x3, 0x39,0x38,0xe0,0x2, +0x1a,0x44,0x17,0x5, 0x3f,0x38,0x39,0x14,0xe0,0x3, 0x1f,0xb0,0x39,0xe8,0x8c,0x2, +0x3f,0x9e,0x8a,0xbf,0xe0,0x7, 0xd2,0x2c,0x8c,0x92,0x3c,0x65,0xe0,0x7, 0xd2,0x5e, +0x8c,0xa2,0x3c,0x65,0xe0,0x7, 0xd2,0x97,0xe2,0x0, 0xc9,0x81,0x1, 0x2, 0xa, 0xe1, +0x8c,0xc4,0x14,0x3, 0xe0,0x7, 0xd2,0x52,0x8c,0xd4,0x14,0x3, 0xe0,0x7, 0xd2,0x8b, +0x8c,0xc4,0x14,0x4, 0xe0,0x7, 0xd2,0x4a,0x8c,0xd4,0x14,0x4, 0xe0,0x7, 0xd2,0x83, +0x8c,0xc4,0x14,0x0, 0xe0,0x7, 0xd2,0x42,0x8c,0xd4,0x14,0x0, 0xa, 0xa1,0xe0,0xe4, +0x0, 0xfa,0xe2,0x0, 0xcc,0x82,0xe0,0x0, 0x2, 0xe1,0x8, 0xb5,0x17,0xfd,0x3f,0x98, +0xe2,0x0, 0xcf,0x81,0x39,0x68,0x3a,0x69,0xe0,0x1, 0x5, 0x88,0xe0,0x0, 0x2c,0x57, +0xe0,0x3, 0x1f,0xb8,0xe7,0xbf,0x16,0x7f,0xa6,0x8f,0xe0,0x0, 0x1f,0xc4,0xe0,0x1, +0xa7,0x6d,0xa7,0x8f,0x3f,0x5c,0xe0,0x1, 0xbf,0x6d,0xe2,0x0, 0xcc,0x81,0xa7,0x4f, +0xe6,0x7, 0x16,0x7f,0x3f,0x5c,0xe0,0x0, 0x1, 0x4a,0xe0,0x28,0xcf,0x0, 0xbf,0x4f, +0x16,0x40,0xa7,0x4f,0xe7,0xf8,0x15,0x80,0x3f,0x5c,0xcf,0x5, 0xbf,0x4f,0x12,0x85, +0xa7,0x5f,0xe0,0x3, 0x1e,0x4a,0x3a,0xb9,0x3f,0x5c,0xe8,0x0, 0xcf,0x5, 0xbf,0x5f, +0xa7,0x5f,0xe0,0x3, 0x19,0xb0,0x3f,0x5b,0xcf,0x5, 0xbf,0x5f,0xe0,0xc, 0x39,0x95, +0xe0,0x1, 0xa7,0xed,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x8c,0xcc,0xe0,0x7, +0xd0,0x19,0xe0,0x3, 0x1f,0x8e,0x3c,0x62,0x3f,0x94,0x84,0x8f,0xe0,0x7, 0xd0,0x3d, +0x39,0x95,0x8d,0x23,0x3c,0x62,0x3c,0xea,0xe0,0x7, 0xd0,0xf9,0x8c,0x83,0x3c,0x62, +0x34,0xa3,0xe0,0x7, 0xd0,0xac,0x8c,0x93,0x3c,0x62,0x34,0xa3,0xe0,0x7, 0xd0,0xca, +0x3c,0x64,0xa, 0xa1,0xe7,0xfe,0x0, 0xea,0x38,0x82,0x12,0x85,0x3a,0xb9,0xe0,0x3, +0x19,0xb0,0xe0,0xf, 0x39,0x95,0x8c,0xcf,0x0, 0xdb,0xe0,0x50,0xcf,0x0, 0xbf,0x4f, +0x16,0x40,0xa7,0x4f,0x14,0x85,0x3f,0x5c,0xcf,0xa, 0xbf,0x4f,0x3a,0xe9,0xa7,0x5f, +0xe0,0x3, 0x1e,0x4a,0xe0,0x3, 0x19,0xb0,0x3f,0x5c,0xe8,0x0, 0xcf,0xa, 0xbf,0x5f, +0xe7,0xf8,0x16,0x0, 0xa7,0x5f,0x3f,0x5c,0xcf,0xa, 0xbf,0x5f,0xe0,0x1, 0xa7,0xed, +0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0xe0,0x6, 0xdf,0xd4,0x3c,0xe2,0x3c,0x62, +0xe0,0x6, 0xdf,0xfb,0xe7,0xff,0x0, 0xbe,0x14,0x8a,0xe0,0x6, 0xdf,0xcb,0x14,0x80, +0x3c,0x62,0x12,0x85,0xe0,0x6, 0xdf,0xf1,0xe0,0x3, 0x19,0xb0,0x3a,0xb4,0xe7,0xff, +0x0, 0xb1,0x0, 0x0, 0xe0,0x2, 0x1f,0x66,0xe0,0x0, 0x1d,0x3b,0xe0,0x2, 0x1f,0xfd, +0x87,0xe, 0xf0,0x1, 0x8b,0xfa,0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, 0xe8,0xc, +0x3d,0x17,0x3e,0xfe,0xf0,0x6, 0x89,0xc, 0xe0,0x1, 0x1, 0x35,0xf0,0x0, 0x9a,0x5f, +0xf0,0x1, 0x89,0x8f,0xe0,0x1, 0x24,0x25,0xe0,0x0, 0x1f,0xba,0xf0,0x3, 0x1b,0x41, +0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe0,0x1, 0x27,0xa5,0x8, 0xb2,0xe0,0x1, 0x1f,0xdc, +0xe7,0x7f,0x16,0xff,0xa4,0xf, 0xa7,0x88,0xa7,0x8, 0x37,0xce,0xe2,0x0, 0xc7,0x81, +0xe4,0x0, 0xcf,0x81,0x3f,0x5d,0x37,0xae,0x3f,0xce,0xbf,0x88,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe0,0x1, 0x1f,0xcd,0xf0,0xe, 0x33,0xa2,0x96,0xfb,0x3f,0x9e,0xb6,0x8f, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0,0x1, 0x97,0xb, 0xf0,0x0, 0x12,0x82,0xb7,0x1f, +0xf0,0x15,0x3a,0x9b,0xf0,0x2, 0x18,0xc8,0xf0,0x1, 0x18,0x7f,0xe8,0x40,0x3f,0x64, +0x16,0x0, 0x0, 0x96,0xe8,0x0, 0x8e,0x81,0xe0,0xf, 0x37,0x21,0xe2,0x0, 0xce,0x81, +0x3f,0x99,0xe0,0x0, 0x1, 0x49,0xe8,0x0, 0x96,0x85,0xb6,0x8f,0xc6,0x1, 0xe2,0x0, +0xce,0x6, 0xc7,0x1, 0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82,0x1, 0x13,0xf0,0xf, +0x31,0xdc,0xe0,0xd, 0x37,0x21,0xe2,0x0, 0xc7,0x81,0x3e,0x99,0x2f,0xe4,0xc6,0x1, +0xe2,0x0, 0xce,0x6, 0xc7,0x1, 0xb7,0x8d,0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82, +0x1, 0xef,0xe8,0x0, 0x8f,0x81,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x52,0xf0,0x0, +0x22,0x14,0x16,0x89,0xe8,0xd, 0x3e,0x94,0xe3,0xff,0xc6,0xff,0xe0,0x0, 0x17,0x89, +0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff,0x97,0xe, 0x3f,0xfd, +0xe1,0x80,0xb7,0x19,0x1, 0xf6,0xe0,0x6, 0x8f,0xda,0xc7,0xff,0xf0,0x40,0x3b,0xff, +0x4, 0x6, 0xa7,0x88,0xe7,0x7f,0x17,0x7f,0x3f,0xde,0xbf,0x88,0x17,0x0, 0xe8,0x0, +0xaf,0x6, 0x9, 0x61,0xf2,0x0, 0xc9,0x4, 0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe7,0xff, +0x1, 0xb4,0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe0,0x45,0x16,0xc2,0xe8,0x0, 0x98,0x85, +0x3e,0x9e,0x99,0xf, 0x36,0xa1,0x38,0xa2,0xe8,0xd, 0x3e,0x90,0xb0,0x8d,0x9e,0x8f, +0xe8,0x0, 0x98,0x85,0x3e,0x91,0x36,0xc1,0xb6,0x8f,0xe7,0xff,0x0, 0xa1,0xe0,0x3, +0x1f,0x8a,0xf0,0x3, 0x1b,0x41,0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe7,0xfe,0x2f,0xdf, +0x38,0x82,0xf0,0x0, 0x9a,0x6f,0xf0,0x1, 0x89,0x9f,0xe7,0xfe,0x0, 0xcd,0xf2,0x0, +0xc9,0x4, 0x1, 0x17,0xf7,0xff,0x22,0x41,0xf0,0x0, 0xc2,0x9, 0xf3,0xff,0xc2,0x7f, +0xe0,0x0, 0x17,0x89,0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x97,0xe, 0xe8,0x40,0x3f,0xf4,0xe1,0x80,0xb7,0x19,0x1, 0xf5,0xe7,0xff,0x0, 0xad, +0xf0,0x0, 0x22,0x27,0xf7,0xff,0x11,0xff,0xf8,0x13,0x39,0x94,0xf3,0xff,0xc1,0xff, +0xf0,0x1, 0x19,0x7f,0xc5,0x92,0x3e,0xe9,0xf0,0x0, 0xc1,0x81,0xe0,0x0, 0x17,0x0, +0xe0,0x45,0x17,0xc2,0x9e,0xb, 0x3f,0x9e,0xf0,0x0, 0x9a,0x8d,0x37,0xa1,0xe8,0xc, +0x3e,0x25,0xe8,0xf, 0x3f,0x92,0xb6,0xf, 0xc7,0x1, 0x9f,0x8d,0xe1,0x80,0x9e,0x1b, +0xf0,0x40,0x39,0xfe,0x3f,0x9c,0x37,0xc1,0xe1,0x80,0xb7,0x9d,0x1, 0xea,0x17,0x86, +0xe0,0x3, 0x1f,0x44,0xf0,0xc, 0x33,0xa1,0xe8,0xf, 0x3f,0x94,0x16,0x80,0x3f,0x1c, +0x37,0xa1,0xb6,0x8e,0x3c,0x9f,0xb6,0x89,0xe7,0xfe,0x0, 0xf7,0xe0,0x2, 0x1f,0xba, +0x86,0xc8,0x8f,0x8f,0x87,0x68,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1f,0xcc,0x8f,0x8f, +0x1, 0x22,0x37,0xc1,0x16,0x60,0xc7,0x81,0x3e,0xdc,0xe2,0x0, 0xc7,0x9f,0x3f,0x5c, +0xce,0x81,0x3f,0xce,0xae,0xc8,0xaf,0xe8,0x15,0x80,0x87,0x48,0x87,0xe8,0x86,0x58, +0x86,0xf8,0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xc7,0x9f,0xcf,0x20,0xce,0x40,0xcf,0xa0, +0xce,0xc0,0x15,0x1, 0xad,0x8, 0xad,0x98,0xad,0xb8,0xaf,0x48,0xae,0x58,0xaf,0xe8, +0xae,0xf8,0x38,0x82,0xc7,0x81,0x37,0x81,0x16,0x60,0xc7,0x81,0x3e,0xdc,0xe2,0x0, +0xc7,0x9f,0x3f,0x5c,0xce,0x82,0x3f,0xce,0xae,0xc8,0xaf,0xe8,0x0, 0xde,0xe0,0x2, +0x1f,0xba,0xf0,0x0, 0x11,0x81,0x8d,0x8f,0xe2,0x0, 0xcd,0x82,0x1, 0x4, 0xf0,0x0, +0x11,0x80,0x15,0x81,0xc4,0x82,0xe2,0x1, 0xc4,0xff,0x17,0x81,0xf0,0x1, 0x1a,0x4c, +0xac,0x88,0x17,0x0, 0xaf,0xb8,0x15,0x47,0xf7,0xff,0x13,0xe0,0xf7,0xff,0x12,0x80, +0xf7,0xff,0x13,0x3f,0x0, 0x92,0x87,0xc8,0x86,0xd8,0xe2,0x0, 0xc7,0x9f,0xcf,0xe0, +0xe8,0xf, 0x3f,0xd7,0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xd8,0xaf,0xc8,0xc7,0x1, +0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0x4, 0xac,0x17,0x82,0x3f,0x9e,0x37,0xa1,0x3f,0x98, +0x86,0x9f,0x3e,0xda,0xae,0x9f,0x27,0x68,0xe2,0x0, 0xcf,0x1, 0xf0,0x0, 0x11,0x1f, +0xf0,0x0, 0x10,0x81,0xf0,0x12,0x39,0x5b,0xce,0xc0,0xf0,0x11,0x38,0x9b,0x1, 0x19, +0x86,0xf, 0xe2,0x0, 0xcf,0x2, 0xe8,0xc, 0x3e,0x57,0xe8,0xc, 0x3e,0x42,0xe8,0x40, +0x3d,0xe1,0xae,0xf, 0xe2,0x0, 0xc6,0x1f,0xe2,0x1, 0xc5,0xff,0xce,0x20,0x1, 0x17, +0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0xae,0xf, 0xae,0x9f,0x3, 0xd6,0x38,0x82, +0x87,0xe8,0x86,0xf8,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0xc5,0xe8,0xf, 0x3f,0xd7, +0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xf8,0xaf,0xe8,0x0, 0xc2,0xe0,0x1, 0x86,0x98, +0xe0,0x1, 0x87,0x88,0xce,0xc0,0xe0,0x1, 0xae,0x98,0xe2,0x0, 0xc7,0x9f,0xe8,0x0, +0x8d,0x84,0xcf,0xa0,0xe8,0xb, 0x3d,0x93,0x35,0x81,0xc5,0x81,0xe0,0x1, 0xaf,0x88, +0xe2,0x1, 0xc5,0xff,0xe7,0xff,0x0, 0xad,0x17,0x0, 0x3f,0xe8,0xe1,0x80,0xaf,0x1f, +0xc7,0x81,0xaf,0x18,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xaf,0xf, 0xe7,0xfe,0x0, 0xe6,0xe0,0x2, 0x1f,0xba,0x16,0x82,0x8f,0x8f,0x87,0x58, +0xe0,0x2f,0x3f,0x8d,0xc7,0x81,0x16,0x80,0xcf,0x40,0xcf,0xa0,0xae,0x88,0xae,0x98, +0xae,0xb8,0xaf,0x58,0xaf,0xc8,0x38,0x82,0x8, 0xb2,0xe0,0x3, 0x19,0x2c,0x15,0x2a, +0x14,0x80,0x3c,0x62,0xe0,0x7, 0xd8,0xb0,0xe0,0x2, 0x1f,0xba,0x17,0x1, 0xaf,0x42, +0xe0,0x0, 0x17,0x41,0x8f,0x8f,0xe0,0x4, 0xaf,0x2, 0x2f,0x8c,0xe0,0x2, 0x87,0xa2, +0x17,0x60,0xe2,0x0, 0xc7,0x9f,0xcf,0xa0,0x3f,0xde,0xcf,0x81,0xe0,0x2, 0xaf,0xa2, +0x9, 0x61,0xe0,0x3, 0x1e,0xab,0x17,0x0, 0xe0,0x3, 0x1f,0xaa,0xaf,0xd, 0x3c,0x6d, +0xaf,0x1d,0xaf,0xf, 0xe0,0x3, 0x1f,0xa9,0xe0,0x3, 0x1e,0xc3,0xaf,0xf, 0xe0,0x3, +0x1f,0xa8,0x8c,0x8d,0xaf,0xf, 0xe0,0x3, 0x1f,0xa7,0xaf,0xf, 0xe0,0x3, 0x1f,0xa6, +0xaf,0xf, 0xe0,0x3, 0x1f,0xa5,0xaf,0xf, 0xe0,0x3, 0x1f,0xa4,0xaf,0xf, 0xe0,0x3, +0x1f,0xa3,0xaf,0xf, 0xe0,0x3, 0x1f,0xa2,0xaf,0xf, 0xe0,0x3, 0x1f,0xa1,0xaf,0xf, +0xe0,0x3, 0x1f,0xa0,0xaf,0xf, 0xe0,0x3, 0x1f,0x9f,0xaf,0xf, 0x9, 0x21,0xe7,0xfe, +0x0, 0x88,0xe0,0x0, 0x1f,0xbb,0x17,0x0, 0xaf,0xf, 0x16,0xff,0xaf,0x1f,0xae,0xaf, +0xaf,0x3f,0xaf,0x4f,0xaf,0x5f,0xaf,0x6f,0xaf,0x7f,0xe0,0x1, 0xaf,0xf, 0xe0,0x1, +0xaf,0x6f,0xe0,0x1, 0xae,0xff,0xe0,0x2, 0xaf,0xf, 0xe0,0x2, 0xaf,0x1f,0x38,0x82, +0xe0,0x0, 0x1f,0x3b,0x8e,0x8e,0xe0,0x0, 0x2e,0xdc,0x8f,0x8e,0x85,0x89,0x37,0xa5, +0x3f,0x9e,0xbc,0x6f,0xc5,0x81,0x8f,0x8e,0xe2,0x1, 0xc5,0xff,0x37,0xa5,0x3f,0x9e, +0x8c,0x39,0xe0,0x6, 0xad,0xdf,0x15,0x7f,0x3e,0x6d,0x8f,0x8e,0x37,0xa5,0x3f,0x9e, +0x3f,0x9d,0xe0,0x6, 0xad,0xf, 0x8f,0x8e,0x37,0xa3,0x3f,0x9d,0xc7,0x87,0x37,0xa2, +0xc6,0x81,0x3f,0x9e,0xe2,0x0, 0xce,0x85,0xbe,0xf, 0x1, 0xf0,0xe0,0x2, 0xae,0x2e, +0xe0,0x2, 0xae,0x3e,0xe0,0x2, 0xae,0x4e,0xe0,0x2, 0xae,0x5e,0xe0,0x2, 0xae,0x6e, +0xe0,0x2, 0x1f,0xc8,0xe0,0x2, 0xae,0x7e,0x8d,0xf, 0xe2,0x0, 0xcd,0x1, 0x1, 0x2a, +0x8f,0x8e,0x8e,0x99,0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0xf, 0x3d,0xad,0xe0,0x2, +0xae,0x2e,0xe2,0x0, 0xcd,0x81,0x8f,0x8e,0xe0,0x1, 0x1e,0xfe,0x37,0xa5,0x3f,0x9e, +0xbe,0xff,0x5, 0x11,0x8f,0x8e,0x16,0x82,0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0x9f, +0x17,0x81,0xe0,0x2, 0xaf,0xce,0x8f,0x8e,0xe0,0x1, 0x1e,0xfd,0xc7,0x81,0x37,0xa5, +0x3f,0x9e,0xbe,0x8f,0x14,0x0, 0x8f,0x8e,0xc7,0x81,0xaf,0x8e,0x38,0x82,0x14,0x1, +0x38,0x82,0xe0,0x0, 0x24,0x50,0x8f,0x8e,0xf0,0x1, 0x1b,0x7c,0x37,0xa5,0x3f,0x9e, +0xe0,0x6, 0xae,0x8f,0x16,0x84,0xe0,0x2, 0xae,0x7e,0x14,0x82,0x8f,0x8e,0x16,0x3, +0x37,0xa5,0x3f,0x9e,0xf0,0x0, 0xbb,0x7f,0xf0,0x40,0x3b,0xe9,0x8f,0x8e,0x37,0xa5, +0x3f,0x9e,0xe0,0x6, 0xae,0x9f,0xe0,0x2, 0xad,0x6e,0x8e,0x8e,0xc6,0x81,0x36,0xa5, +0x3e,0x9e,0xf0,0x0, 0xbb,0xd, 0x17,0x80,0x8e,0x8e,0x34,0x21,0x36,0xa5,0x3e,0x9e, +0x3e,0x99,0xe0,0x6, 0xaf,0x8d,0x3d,0xa8,0xf0,0x2, 0xab,0xae,0xe2,0x0, 0xcd,0x81, +0x8f,0x8e,0xe0,0x1, 0x1e,0xfe,0x37,0xa3,0x3f,0x99,0xc7,0x87,0x37,0xa2,0x3f,0x9e, +0xbe,0x8f,0x5, 0x41,0x8e,0x8e,0x17,0x82,0x36,0xa5,0x3e,0x9e,0x3e,0x9c,0xe0,0x6, +0xaf,0x8d,0x14,0x0, 0xe0,0x2, 0xae,0x4e,0x8f,0x8e,0xe0,0x1, 0x1e,0xfd,0x37,0xa3, +0x3f,0x9c,0xc7,0x87,0x37,0xa2,0x3f,0x9e,0xbe,0x8f,0x8f,0x8e,0xc7,0x81,0xaf,0x8e, +0x38,0x82,0xf0,0x40,0x3b,0xe8,0x3e,0x6a,0x3c,0xe8,0x0, 0xce,0xe2,0x0, 0xcc,0x4, +0x1, 0x20,0x5, 0x92,0xe2,0x0, 0xcc,0x6, 0x2, 0x9f,0x17,0x80,0x8f,0x39,0xaf,0x89, +0xaf,0x99,0x27,0x7, 0x87,0xd9,0xe2,0x1, 0xc7,0xbf,0xaf,0xd9,0x17,0xa1,0xaf,0xc9, +0x17,0x80,0xaf,0xb9,0x38,0x82,0xe2,0x0, 0xcc,0x3, 0x1, 0x8f,0x87,0xd9,0x17,0x47, +0x3f,0xde,0xcf,0x90,0x17,0x0, 0xaf,0x9, 0xaf,0x19,0xaf,0x39,0xaf,0xd9,0x38,0x82, +0x3c,0x69,0xe7,0xfb,0x0, 0xdd,0x38,0x82,0x38,0x82,0x0, 0x0, 0x8, 0xb4,0xc0,0x60, +0xe0,0x0, 0x19,0x3b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0x11,0x94,0xaf,0x22, +0x39,0x90,0xaf,0xb2,0x3c,0x63,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, +0xaf,0x82,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0x17,0xe, 0xe0,0x2, 0xaf,0x82, +0xe0,0x2, 0x1a,0x48,0xe0,0x2, 0xaf,0x92,0x8f,0x84,0x3f,0x3f,0xe0,0x3, 0x1f,0xac, +0x3f,0x9e,0xf0,0x0, 0x80,0x8f,0xf0,0x0, 0x81,0x1f,0xf0,0x0, 0x81,0xaf,0xf0,0x0, +0x82,0x3f,0xf0,0x0, 0x68,0x94,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, +0x83,0xff,0xe0,0x1, 0x84,0x8f,0xe0,0x1, 0x85,0x1f,0xe0,0x1, 0x85,0xaf,0xe0,0x1, +0x86,0x3f,0xe0,0x1, 0x86,0xcf,0xe0,0x1, 0x87,0x5f,0x87,0xcf,0xf0,0x0, 0xa9,0x13, +0xf0,0x0, 0xa9,0xa3,0xf0,0x0, 0xaa,0x33,0xaf,0xc3,0xf0,0x0, 0xaa,0xd3,0xf0,0x0, +0xab,0x63,0xf0,0x0, 0xab,0xf3,0xe0,0x1, 0xac,0x83,0xe0,0x1, 0xad,0x13,0xe0,0x1, +0xad,0xa3,0xe0,0x1, 0xae,0x33,0xe0,0x1, 0xae,0xc3,0xe0,0x1, 0xaf,0x53,0xdd,0x7f, +0xf8,0x3, 0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x4, 0x77,0x88,0xde,0xbe,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x84,0xc7,0x81, +0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, 0xaf,0x92, +0x17,0x80,0xe0,0x0, 0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0xa, 0x61,0x8, 0xb3,0xc0,0x60, +0xe0,0x0, 0x19,0x3b,0x17,0x0, 0xaf,0x2, 0x17,0xff,0xaf,0x12,0x16,0x8e,0xaf,0xa2, +0xaf,0x32,0xaf,0x42,0xaf,0x52,0xaf,0x62,0xaf,0x72,0xe0,0x1, 0xaf,0x2, 0xe0,0x1, +0xaf,0x62,0xe0,0x1, 0xaf,0xf2,0xe0,0x2, 0xaf,0x2, 0xe0,0x2, 0x19,0xc8,0xe0,0x2, +0xaf,0x12,0x8f,0x83,0x3e,0xbf,0xe0,0x3, 0x1f,0xac,0x3f,0x9d,0xf0,0x0, 0x81,0x2f, +0xf0,0x0, 0x81,0xcf,0xf0,0x0, 0x82,0x5f,0xf0,0x0, 0x82,0xef,0xf0,0x0, 0x83,0x7f, +0xf0,0x1, 0x83,0x8f,0x86,0xbf,0xe0,0x1, 0x84,0xaf,0xe0,0x1, 0x85,0x3f,0xe0,0x1, +0x85,0xcf,0xe0,0x1, 0x86,0x5f,0xe0,0x1, 0x84,0x1f,0xf0,0x0, 0x69,0x16,0x3f,0xed, +0xf0,0x0, 0x69,0x98,0xe2,0x1, 0xc7,0xff,0xf0,0x0, 0x6a,0x19,0xf0,0x0, 0x6a,0x9a, +0xf0,0x0, 0x6b,0x1b,0xf0,0x0, 0x6b,0x9c,0x6c,0x1d,0x6c,0x9e,0x6d,0x1f,0x6d,0xa0, +0x6e,0x21,0x6f,0x14,0x6f,0x15,0x27,0x87,0x57,0x8c,0xe2,0x1, 0xc7,0xbf,0xe0,0x42, +0xcf,0x80,0x77,0x8c,0x17,0x80,0xf0,0x0, 0x11,0x14,0x6f,0x97,0xf0,0x12,0x39,0x10, +0xf8,0x12,0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x6, 0x77,0x88,0xef,0xff,0xde,0x36,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x83, +0xc7,0x81,0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, +0xaf,0x92,0x17,0x80,0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0x9, 0xe1,0x8, 0xb1,0xc0,0x70, +0xe0,0x3, 0x1f,0xac,0xe2,0x0, 0x7c,0x84,0xf0,0x0, 0x80,0xf, 0xf0,0x0, 0x80,0x9f, +0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf, +0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f, +0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf, +0x14,0x0, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, +0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, +0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdd,0xd9, +0xe0,0x0, 0x1f,0xbb,0x17,0x0, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, +0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x8, 0xb1, +0xc0,0x70,0xe0,0x3, 0x1f,0x2c,0x17,0x8e,0x3f,0x9e,0xf0,0x1, 0x80,0x6e,0xf0,0x0, +0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, +0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, +0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, +0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x1, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, +0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, +0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d, +0x6e,0xe, 0x6e,0x8f,0xdd,0x8e,0xe0,0x0, 0x1f,0xbb,0x17,0x1, 0xe0,0x1, 0xaf,0x1f, +0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f, +0xc0,0x10,0x8, 0xe1,0x8, 0xb1,0xc0,0x70,0xe0,0x3, 0x1f,0x2c,0x17,0x9c,0x3f,0x9e, +0xf0,0x3, 0x80,0x4e,0xf0,0x0, 0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf, +0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff, +0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf, +0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x2, 0x6f,0x10, +0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, +0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, +0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdd,0x43,0xe0,0x0, 0x1f,0xbb, +0x17,0x2, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, +0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x0, 0x0, 0x8, 0xb2,0xe0,0x0, +0x19,0x3b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0xe2,0x0, 0xcc,0x1, 0xaf,0x22, +0xaf,0xb2,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, 0xaf,0x82,0xe0,0x1, +0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82,0xe0,0x2, 0xaf,0x92,0x1, 0x20, +0x4, 0x9d,0xe2,0x0, 0xcc,0x2, 0x1, 0x18,0x17,0x80,0xe0,0x2, 0xaf,0x92,0x17,0x80, +0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, 0x8f,0x5e,0xe0,0x2, +0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, 0xc7,0xff,0x8f,0x2, +0x3f,0xfe,0x4, 0xf1,0x9, 0x61,0xdf,0x7f,0x0, 0xe8,0xde,0xe9,0x0, 0xe6,0xdf,0x30, +0x0, 0xe4,0x8, 0xb2,0xe0,0x0, 0x1f,0xbb,0xe0,0x2, 0x8f,0xcf,0x27,0x96,0xe0,0x2, +0x1f,0x3a,0x8f,0xe, 0xe2,0x0, 0xcf,0x2, 0x1, 0x27,0xe0,0x1, 0x1f,0x4c,0xc7,0x82, +0x8f,0xe, 0x37,0xa1,0x3f,0x98,0x86,0x8f,0x37,0x41,0xc7,0x1, 0x16,0x60,0xe2,0x0, +0xc7,0x1f,0x3e,0xdc,0x3f,0x4d,0xaf,0xf, 0xe0,0x2, 0x1f,0xc8,0x89,0xf, 0xe2,0x0, +0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xcd,0xe2,0x0, +0xc7,0x81,0x2f,0x9b,0x14,0x8a,0x14,0x3, 0xe0,0x6, 0xda,0x24,0x14,0x8a,0x14,0x4, +0x9, 0x21,0xe0,0xd4,0x0, 0x9f,0x3f,0x1f,0xe0,0x1, 0x1f,0xcc,0x37,0x21,0x8f,0x8f, +0x3c,0x1e,0xc7,0x81,0x87,0x8, 0x37,0x81,0xc7,0x81,0x16,0xe0,0xe2,0x0, 0xc7,0x9f, +0x3f,0x5d,0x3f,0xce,0xaf,0x88,0x0, 0xd9,0x97,0x8e,0xe7,0x0, 0x16,0x80,0xe3,0xbf, +0xc7,0xff,0xb7,0x8e,0x3c,0xe2,0x97,0x8e,0x14,0x3, 0x3f,0xcd,0xb7,0x8e,0xe0,0x6, +0xda,0x1, 0x3c,0xe2,0x14,0x4, 0x9, 0x21,0xe0,0xd3,0x0, 0xfc,0x8, 0xb1,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x27,0x99,0xe0,0x2, 0x1f,0xba,0x8f,0x8f,0x27,0xaf,0xe0,0x2, +0x1f,0x48,0x16,0x82,0x8f,0x8e,0xe0,0x2f,0x3f,0x8d,0x2f,0xa8,0x17,0x83,0xe0,0x2f, +0x3c,0xf, 0x2f,0xa4,0x8f,0x8e,0x17,0x1, 0xe0,0x2f,0x3f,0x8e,0x2f,0x9f,0x17,0x86, +0xe0,0x28,0x3c,0xf, 0x2c,0x1b,0xe0,0x7, 0xd4,0x33,0xe0,0x0, 0xdd,0x61,0xe0,0x3, +0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0xe7,0xfb,0x16,0x7f,0xa7,0x4f,0x97,0x8d, +0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0x17,0x1, 0xe0,0x0, +0x1f,0xbb,0xaf,0x3f,0x8, 0xa1,0xe0,0xda,0x0, 0xb3,0xe0,0x7, 0xd4,0x19,0xe0,0x0, +0xdd,0x47,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0xe7,0xfb,0x16,0x7f, +0xa7,0x4f,0x97,0x8d,0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d, +0x17,0x1, 0xe0,0x0, 0x1f,0xbb,0xaf,0x3f,0x8, 0xa1,0xe0,0xda,0x0, 0xab,0x8, 0xb3, +0xc0,0x70,0xe2,0x0, 0xcc,0x2, 0x39,0x68,0xe0,0x0, 0x5, 0xce,0xe2,0x0, 0xc9,0x6, +0x14,0x0, 0x5, 0x83,0xc0,0x10,0x9, 0xe1,0xe0,0x2, 0x1f,0xc8,0x17,0xe, 0x8f,0x8f, +0xe2,0x0, 0x7c,0x4, 0x3f,0x3f,0xe0,0x3, 0x1f,0xac,0x3f,0x9e,0xf0,0x0, 0x81,0xf, +0xf0,0x0, 0x81,0x9f,0xf0,0x0, 0x82,0x2f,0xf0,0x0, 0x82,0xbf,0xf0,0x0, 0x83,0x4f, +0xf0,0x0, 0x83,0xdf,0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f,0xe0,0x1, 0x86,0x2f, +0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0x81,0xef,0x84,0xff,0xe0,0x1, 0x87,0xdf, +0xf0,0x0, 0x69,0x4, 0xf0,0x0, 0x69,0x85,0xf0,0x0, 0x6a,0x6, 0xf0,0x0, 0x6a,0x87, +0xf0,0x0, 0x6b,0x8, 0xf0,0x0, 0x6b,0x89,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f, +0x6f,0x10,0x6f,0x91,0x6c,0x8b,0x69,0x8a,0xdf,0x15,0xe2,0x0, 0x7c,0x84,0x3c,0x62, +0xdc,0xbe,0xe2,0x0, 0x7c,0x4, 0xe0,0x6, 0xdc,0x44,0x3c,0x62,0xdf,0x60,0x14,0x1, +0xc0,0x10,0x9, 0xe1,0x11,0x8e,0xe0,0x3, 0x1f,0xac,0x39,0xb8,0x39,0x9f,0x3c,0x63, +0xdf,0x1, 0x3c,0x63,0xe0,0x6, 0xdc,0x35,0x3c,0x62,0xdf,0x51,0x14,0x1, 0xc0,0x10, +0x9, 0xe1,0x8, 0xb2,0xe0,0x3, 0x1f,0x47,0xe0,0x2, 0x1f,0x94,0x8e,0x8e,0x87,0x6f, +0xe2,0x0, 0xc6,0x87,0x36,0xa5,0xe2,0x0, 0xc7,0x1f,0x3f,0x4d,0xaf,0x6f,0x16,0x60, +0x9f,0x3f,0x86,0xef,0x37,0x48,0xc7,0x1, 0xe2,0x0, 0xc7,0x1f,0x3e,0xdc,0x3f,0x4d, +0xaf,0x6f,0x9f,0x3f,0x37,0x48,0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xcf,0x1f,0x1, 0x85, +0x87,0x6f,0x3f,0x5c,0xcf,0x4, 0xaf,0x6f,0x17,0x80,0xe0,0x0, 0x19,0x3b,0x17,0x7f, +0xaf,0xb2,0x14,0x0, 0xaf,0x92,0xaf,0x22,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2, +0xe0,0x1, 0xaf,0x82,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82, +0xe0,0x1, 0xd0,0xb2,0x8f,0x12,0x8f,0x82,0x3f,0x7f,0x4, 0x87,0x17,0x83,0x14,0x1, +0xaf,0xb2,0x9, 0x21,0xe0,0x21,0x0, 0xa8,0x8f,0x92,0x37,0xa5,0x3f,0x92,0xa4,0x6f, +0xe2,0x1, 0xc4,0x7f,0xdf,0x55,0xe2,0x0, 0xcc,0x1, 0x1, 0xf1,0x14,0x1, 0x9, 0x21, +0xe0,0x21,0x0, 0x9a,0x8, 0xb5,0xe0,0x0, 0x19,0x3b,0x3a,0xe8,0x8f,0xb2,0xe2,0x0, +0xcf,0x81,0x1, 0x97,0xe0,0x2, 0x19,0x92,0xe0,0x3, 0x1a,0x38,0x97,0x83,0xe2,0x0, +0xc7,0x81,0x2f,0x87,0xa7,0x84,0xe0,0x4, 0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x27,0x83, +0xe0,0x1, 0xd0,0x48,0xe0,0x3, 0xd9,0x37,0x8f,0xb2,0xe2,0x0, 0xcf,0x81,0x1, 0x6f, +0x2a,0x82,0xa, 0xe1,0xa, 0xa1,0xe0,0xd6,0x0, 0xfb,0x8, 0xb1,0xe0,0x2, 0x1f,0x92, +0x97,0x8f,0xe2,0x0, 0xc7,0x81,0x2f,0xa0,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x4, +0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x2f,0x98,0xe0,0x3, 0xd9,0x1d,0xe0,0x0, 0x1f,0x3b, +0xe0,0x2, 0x8c,0x1e,0x24,0x10,0x8f,0xce,0x27,0x84,0x0, 0x91,0x8e,0xcc,0x2e,0x8f, +0xe0,0x2, 0x8e,0x9e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe0,0xc, 0x3f,0x1f, +0x2, 0xf6,0x14,0x0, 0x8, 0xe1,0xe0,0x1, 0xd0,0x15,0x0, 0xe7,0x14,0x1, 0x8, 0xe1, +0xe2,0x0, 0xcc,0x5, 0x2, 0x87,0xe0,0x0, 0x1f,0xbb,0x3c,0x1f,0xe0,0x2, 0x8c,0x28, +0x38,0x82,0x14,0x0, 0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x1f,0x92,0x39,0x68,0x97,0x8f, +0xe2,0x0, 0xc7,0x81,0x2f,0x9f,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x4, 0xa7,0xff, +0xe2,0x0, 0xc7,0x81,0x2f,0x97,0xe0,0x3, 0xd8,0xe6,0xe2,0x0, 0xc9,0x5, 0xe0,0x0, +0x1f,0xbb,0x17,0x0, 0x2, 0x84,0x39,0x1f,0xe0,0x2, 0x8f,0x22,0xe0,0x2, 0x8e,0x9f, +0x14,0x1, 0x3e,0xfe,0x5, 0x86,0x3f,0x9e,0x8c,0x4f,0x17,0x80,0xe1,0x28,0x3c,0xf, +0x9, 0x61,0xe0,0x0, 0xdf,0xdf,0x0, 0xe8,0x8, 0xb1,0xe0,0x6, 0xdb,0x19,0xe0,0x0, +0x1f,0xbb,0x16,0x83,0xae,0xbf,0x17,0x2, 0xaf,0x4f,0x16,0x80,0xaf,0x5f,0xaf,0x6f, +0xaf,0x7f,0xe0,0x2, 0x1e,0x12,0xe0,0x1, 0xaf,0xf, 0x97,0x8c,0xe0,0x3, 0x1f,0x1d, +0xe3,0xff,0xc7,0xef,0xb7,0x8c,0x97,0x8e,0xe3,0xff,0xc7,0xdf,0xb7,0x8e,0xe0,0x2, +0x1f,0xb3,0xae,0x8f,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xe0,0x0, 0x1f,0x90,0xae,0x8f, +0xe7,0x7f,0x16,0xff,0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0x8, 0xe1,0xe0,0x0, 0x1f,0xbb, +0x8f,0x3f,0xe2,0x0, 0xcf,0x1, 0x1, 0x2, 0x38,0x82,0x87,0x1f,0xaf,0x2f,0xe0,0x1, +0x8f,0x7f,0xc7,0x1, 0xe0,0x1, 0xaf,0x7f,0xe0,0x1, 0x8f,0x6f,0xc7,0x1, 0xe0,0x1, +0xaf,0x6f,0xe0,0x1, 0x8e,0xef,0x8f,0x1f,0x37,0x25,0x3f,0x1f,0xe0,0x6, 0x8f,0x5e, +0x3e,0xfe,0x4, 0xeb,0x17,0x0, 0xe0,0x1, 0xaf,0x6f,0x8f,0x1f,0xc7,0x1, 0xaf,0x1f, +0x8e,0x9f,0x8f,0xf, 0x3e,0xfe,0x3, 0xe1,0x17,0x3, 0xaf,0x3f,0x38,0x82,0x0, 0x0, +0x8, 0xb4,0xc0,0x7c,0xe0,0x0, 0x19,0x3b,0xe0,0x1, 0x89,0xf2,0x8f,0xa2,0x8f,0x32, +0xe2,0x0, 0xcf,0x1, 0x1, 0x3, 0xc0,0x4, 0xa, 0x61,0x8e,0x22,0x8e,0x82,0x3e,0x7d, +0xe0,0x0, 0x3, 0xc7,0x37,0xa3,0x8e,0xa2,0x3f,0x93,0xc7,0x87,0x36,0xa5,0x37,0xa2, +0x3e,0x92,0x3f,0x92,0xe0,0xb, 0x39,0x13,0xa6,0x6d,0xa4,0x8f,0xe0,0x1, 0x8f,0x9b, +0xe0,0x3, 0x1e,0xac,0xe4,0x0, 0xc7,0x87,0x3f,0x93,0xc7,0x82,0x37,0xa1,0x3f,0x9d, +0x8c,0x1f,0xe0,0x4, 0x34,0x47,0x24,0xac,0xe0,0x1, 0x17,0xff,0x3f,0xdc,0xe0,0x3, +0x1e,0xc1,0xe2,0x0, 0xcf,0x86,0xaf,0xd, 0x2, 0xa3,0x37,0x3f,0xe2,0x0, 0xc7,0x57, +0x27,0x1f,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8a, +0xe0,0x2, 0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0x5, 0x9f,0x3c,0x64,0xd8,0x18,0xe0,0x2, 0x1f,0x92,0x39,0x92,0x9f,0x8f,0x37,0xc4, +0xe2,0x0, 0xc7,0x81,0x27,0x92,0x17,0x2, 0xaf,0x43,0xe0,0x6, 0xda,0x71,0x8f,0x12, +0x8f,0x82,0x3f,0x7f,0xe7,0xff,0x4, 0xb1,0x17,0x2, 0xe0,0x0, 0x1f,0x99,0xaf,0x32, +0x17,0x0, 0xaf,0xf, 0xc0,0x4, 0xa, 0x61,0x17,0x81,0xaf,0xc3,0x0, 0xef,0xe0,0x2, +0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xdd,0x7c,0x81,0xe0,0x3, 0xd5,0xc3, +0xe0,0x1, 0x1f,0xd7,0x64,0x81,0xe0,0x1, 0xb4,0x2f,0x0, 0xd4,0x8, 0xb1,0xc0,0x68, +0xe0,0x2, 0x1f,0xfd,0xe9,0xff,0xc4,0x7e,0x87,0x5f,0x86,0xcf,0xe0,0xf, 0x34,0x41, +0x6f,0x5, 0x14,0x85,0x17,0x0, 0x7f,0x83,0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0x80, +0x6e,0x84,0x6f,0x6, 0x77,0x84,0xe0,0x6, 0xdc,0xbd,0xc0,0x18,0x8, 0xe1,0x0, 0x0, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0x1, 0x2e,0x9f,0xde,0xe0,0x3, 0x1e,0xb3,0xe2,0x0, 0xcc,0x2, +0xe0,0x3, 0x1f,0x32,0x3d,0xed,0xe0,0x6b,0x39,0x2e,0xe2,0x0, 0xcc,0x85,0x16,0x1, +0x36,0x39,0x2, 0x12,0x27,0x91,0x15,0x7f,0x3d,0x1f,0xe3,0xff,0xc5,0x7f,0x17,0x7f, +0xe2,0x1, 0xc6,0x7f,0x3f,0x1b,0x3d,0x1b,0x86,0x9e,0x3e,0xcc,0xe0,0x80,0xae,0x9e, +0x3f,0x7a,0x1, 0xfb,0x0, 0x83,0xe2,0x1, 0xc6,0x7f,0x16,0x86,0x3e,0x9f,0x3e,0x9b, +0x3f,0x9b,0x87,0xf, 0x3f,0x4c,0xe1,0x80,0xaf,0x1f,0x3e,0xff,0x1, 0xfb,0x38,0x82, +0x9f,0xee,0x0, 0xd3,0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, +0x8e,0xae,0xe2,0x0, 0xc7,0x81,0x3e,0xff,0x1, 0x3c,0x9f,0xde,0xe0,0x3, 0x1f,0x33, +0xe2,0x0, 0xcc,0x2, 0xe0,0x3, 0x1e,0xb2,0x3e,0x6e,0xe0,0x6c,0x39,0x2d,0xe2,0x0, +0xcc,0x85,0x14,0x1, 0x34,0x39,0x2, 0x18,0x27,0x97,0x14,0xff,0x3c,0x9f,0xe3,0xff, +0xc4,0xff,0xc4,0x81,0x3e,0xea,0x3f,0x6c,0x3c,0x9c,0xf0,0x41,0x3b,0x88,0x9d,0x8d, +0xc6,0x82,0xe2,0x9, 0xcd,0xaf,0x2, 0x85,0x85,0x8e,0xe8,0xb, 0x3d,0xd7,0xad,0x8e, +0xc7,0x1, 0x3f,0x79,0x1, 0xf5,0x17,0x6, 0xe0,0xd, 0x37,0xa1,0x3f,0x1f,0x3f,0x1c, +0x3f,0x9c,0x3d,0x1d,0xe0,0x41,0x3e,0x8, 0x9e,0x8a,0xc5,0x2, 0xe2,0x9, 0xce,0xaf, +0x2, 0x84,0x86,0x8f,0x3e,0xdc,0xae,0x8f,0xc7,0x81,0x3f,0x7f,0x1, 0xf6,0x38,0x82, +0x9f,0xee,0x0, 0xc5,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0x39,0x68,0xe0,0x1, 0xd0,0x3d, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0x3b,0x68,0xe0,0x0, 0x1, 0x77,0x95,0x5e,0xc5,0x6, 0xe3,0xff, +0xc5,0x7f,0xe2,0x0, 0xc9,0x2, 0xe0,0x3, 0x1c,0x32,0xe0,0x3, 0x1f,0xb3,0x14,0x80, +0xe0,0x68,0x39,0xaf,0xe0,0x7, 0xd1,0xe8,0xe0,0x0, 0x2b,0x62,0xe0,0x3, 0x1f,0xb8, +0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0x16,0x5f,0xa7,0x4f,0x97,0x8d,0x37,0x45,0xe2,0x0, +0xc7,0x20,0x3f,0xdc,0x3f,0xce,0xe0,0x3, 0x1a,0xb3,0xf0,0x1, 0x1c,0x7e,0xf0,0x1, +0x1c,0xfd,0xb7,0x8d,0x11,0x85,0xe0,0x13,0x13,0xc4,0x12,0x1, 0x3c,0x67,0xe0,0x5, +0xdb,0xf6,0x3c,0xe3,0x3c,0x62,0xdf,0x3d,0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd4,0xd6, +0xdd,0x81,0x23,0x2d,0x3c,0xe2,0x3c,0x64,0xde,0x27,0x24,0x7d,0xe8,0x40,0x3d,0x68, +0x3c,0xe3,0x3c,0x62,0xc1,0xff,0xdf,0x67,0xe0,0x43,0x39,0x83,0x3c,0xe3,0x3c,0x62, +0xdf,0x28,0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd4,0xc1,0x3c,0x64,0xdd,0xbc,0xe8,0x40, +0x3d,0x69,0x3c,0xe3,0x3c,0x62,0xdf,0x57,0xe0,0x1, 0xd0,0x49,0x2c,0xd, 0xc1,0xff, +0xe0,0x43,0x39,0x83,0xe2,0x0, 0xc9,0x80,0x3, 0x52,0xe0,0x3, 0x1c,0x33,0x3c,0xe2, +0xef,0xff,0xd4,0xac,0x2b,0xc, 0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x3c,0x64,0xdd,0xa3, +0xe8,0x40,0x3d,0x68,0x3c,0xe3,0x3c,0x62,0xdf,0x3e,0x0, 0xe7,0xe0,0x0, 0x1f,0xcd, +0x8c,0xf, 0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xf8,0x0, 0x82,0xda,0x10,0x13,0x1, +0xe7,0xff,0x0, 0x9e,0x95,0x6e,0xc5,0x6, 0xe3,0xff,0xc5,0x7f,0xe7,0xff,0x0, 0x8b, +0x8, 0xb3,0xe0,0x2, 0x1f,0xc2,0x17,0x0, 0x39,0xe8,0xb7,0xf, 0xe0,0x2, 0xd9,0xf3, +0xe2,0x0, 0xcc,0x1, 0x39,0x68,0x1, 0x3, 0x3c,0x62,0x9, 0xe1,0x3c,0x63,0xdf,0x63, +0x3c,0x62,0x9, 0xe1,0x8, 0xb4,0xe0,0x2, 0x1f,0xc8,0x89,0xf, 0xe0,0x1, 0xd0,0x7, +0x2c,0x19,0xe0,0x2, 0x19,0xfb,0x14,0x1, 0x8f,0x83,0x37,0xd2,0x3f,0xd8,0x2f,0x82, +0xa, 0x61,0xe0,0x2, 0x1f,0x77,0xe0,0x4, 0x34,0x32,0x8f,0x8e,0xe2,0x1, 0xc2,0x7f, +0x3f,0xc4,0xaf,0x8e,0xdd,0x60,0xe2,0x0, 0xc9,0x1, 0x1, 0x12,0x3c,0x62,0xdf,0xd1, +0x2c,0x3, 0x14,0x0, 0xa, 0x61,0xe0,0x0, 0xdf,0xea,0x2c,0x7c,0x8f,0x83,0xe3,0x4, +0x3f,0xd4,0xaa,0x3, 0xd6,0x41,0xe0,0x0, 0xdf,0x33,0x14,0x1, 0xa, 0x61,0x3c,0x62, +0xe0,0x3, 0xd4,0xe2,0xe0,0x2, 0x1f,0xe7,0xa9,0xf, 0x0, 0xe9,0x8, 0xb5,0xe0,0x2, +0x1f,0xc8,0x3a,0xe8,0x89,0xf, 0xe0,0x0, 0xdf,0xd2,0x2c,0x17,0xe0,0x2, 0x1a,0x77, +0x39,0xe8,0x8f,0x84,0x14,0x1, 0x37,0xd2,0x3f,0xd8,0x2f,0x82,0xa, 0xe1,0xdd,0x33, +0xe2,0x0, 0xc9,0x1, 0x1, 0x86,0xe0,0x2, 0x1f,0xe7,0x8f,0xf, 0x27,0x39,0xa9,0x8f, +0x3c,0x62,0xe0,0x2, 0xd9,0xc5,0x2c,0x3, 0x14,0x0, 0xa, 0xe1,0xe0,0x2, 0x1f,0xea, +0x3c,0x62,0x8c,0x8f,0xe0,0x2, 0xda,0xb4,0x3c,0xe2,0x14,0x0, 0xef,0xfd,0xd8,0x20, +0xe0,0x2, 0x1f,0x81,0xe0,0x1, 0x1d,0x6f,0xe0,0x1, 0x1c,0xf0,0xa4,0xf, 0x3d,0xe2, +0xef,0xfd,0xd2,0xac,0x24,0x6a,0xe0,0x2, 0x1f,0xac,0x3c,0x62,0x8c,0x8f,0xe0,0x2, +0xda,0x9f,0xe0,0x0, 0xdf,0x9c,0x2c,0x61,0x2a,0x97,0x3c,0x62,0xe0,0x2, 0xd9,0xf3, +0x14,0x0, 0xe0,0x2, 0xd8,0x7f,0x8f,0x84,0x11,0x81,0xe0,0x2, 0x31,0xb2,0xe3,0x2, +0x3f,0xd2,0xa9,0x4, 0xe0,0x0, 0xde,0xdc,0xd5,0xe7,0x3c,0x63,0xa, 0xe1,0x3c,0x62, +0xe0,0x3, 0xd4,0x8a,0x0, 0xc6,0xdc,0x9e,0x0, 0xe9,0x8, 0xb3,0xe0,0x3, 0xd4,0xd6, +0xe0,0x0, 0xdf,0x8c,0xe0,0x2, 0x1f,0xfb,0x8f,0x8f,0x27,0x8b,0xe0,0x13,0x11,0x44, +0x0, 0x86,0x3c,0x62,0xe0,0x5, 0xda,0xfb,0xe0,0x0, 0xdf,0x80,0xdf,0x64,0x24,0x7a, +0xe0,0x2, 0x1f,0xf7,0x11,0x1, 0x8f,0x8f,0xe0,0x13,0x11,0xc4,0x2f,0x87,0x0, 0x89, +0x3c,0x63,0xe0,0x5, 0xda,0xec,0xe0,0x0, 0xdf,0x71,0x3c,0x62,0xdf,0x88,0x24,0x79, +0x9, 0xe1,0xe0,0x2, 0x1f,0x91,0x16,0x7e,0xa6,0x8f,0xe0,0x0, 0x1f,0xbd,0xa7,0x1d, +0xa7,0x8f,0xcf,0x40,0xbf,0x1d,0x17,0x0, 0xaf,0x7f,0x15,0xfd,0xa7,0xf, 0xe0,0x1, +0x1e,0xdc,0x3f,0x5c,0xbf,0xf, 0xa7,0xf, 0xa6,0x8d,0x3f,0x5b,0xbf,0xf, 0xe0,0x1, +0xa7,0xd, 0x37,0x48,0xe2,0x0, 0xc7,0x1, 0x2f,0x1c,0xe0,0x1, 0x1f,0x42,0x87,0xe, +0xe2,0x1, 0xc7,0x7e,0xe0,0x1, 0xaf,0x3f,0x17,0x8, 0xe0,0x61,0x3f,0x11,0x17,0x10, +0xe0,0x61,0x3f,0x11,0xa7,0x4f,0xcf,0x10,0xbf,0x4f,0xe0,0x61,0x3f,0x82,0xcf,0x88, +0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82,0xcf,0x90,0xe0,0x61,0x3f,0x92,0x38,0x82, +0xe0,0x1, 0xa7,0xd, 0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x2f,0x60,0xe0,0x1, 0x1f,0x42, +0xe0,0x1, 0x87,0x4e,0x3e,0x5e,0xe0,0x1, 0xae,0x3f,0x0, 0xdf,0xd, 0xbf,0xe0,0x2, +0x1f,0x91,0xa7,0x8f,0xa7,0x6f,0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x5c,0xa6,0x8e,0xe0,0x2, 0xa7,0xd, 0x37,0x49,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, +0x2f,0x57,0xa7,0x6f,0x37,0x41,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x41,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x32, +0xa7,0x6f,0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x16,0xa7,0x6f, +0xe2,0x0, 0xc7,0x1, 0x27,0xa, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x7e,0xa7,0x6f,0x37,0x48,0xe2,0x0, 0xc7,0x1, +0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x48,0xe2,0x0, +0xc7,0x1, 0xe0,0x2, 0x2f,0x62,0xa7,0x6f,0x37,0x43,0xe2,0x0, 0xc7,0x1, 0x27,0xb, +0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, +0xe0,0x2, 0x2f,0x48,0xa7,0x6f,0x37,0x42,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x42,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, +0x2f,0x25,0xa7,0x6f,0x37,0x47,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x9, +0xa7,0x6f,0x37,0x4b,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x4b,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x60,0xa7,0x6f, +0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, +0xa7,0xe, 0x37,0x4d,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x44,0xa7,0x6f,0x37,0x4d, +0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x28,0xa7,0x6f,0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4e, +0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0xc, 0xa7,0x6f,0x37,0x4f,0xe2,0x0, 0xc7,0x1, +0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4f,0xe2,0x0, +0xc7,0x1, 0xe0,0x0, 0x2f,0x69,0xa7,0x6f,0x37,0x44,0xe2,0x0, 0xc7,0x1, 0x27,0xb, +0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x44,0xe2,0x0, 0xc7,0x1, +0xe0,0x0, 0x2f,0x4f,0xa7,0x6f,0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x27,0xa, 0xe0,0x1, +0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x2f,0x29, +0xa7,0x6f,0x37,0x46,0xe2,0x0, 0xc7,0x1, 0x27,0x1f,0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x46,0xe2,0x0, 0xc7,0x1, 0x27,0x16,0xa7,0x5f,0xa6,0xdf, +0x37,0x46,0xe2,0x0, 0xc7,0x1, 0xe7,0xff,0x16,0x3f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc, +0x37,0x26,0x3f,0x4d,0xbf,0x5f,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f, +0x9f,0x8d,0xcf,0xc0,0xb7,0x8d,0x17,0x81,0xe0,0x61,0x3f,0x91,0xf, 0xab,0x38,0x0, +0xa7,0x5f,0xa6,0xdf,0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe7,0xfe,0x16,0x7f,0xe4,0x0, +0xcf,0x1, 0x3e,0xdc,0x37,0x27,0x3f,0x4d,0xbf,0x5f,0x16,0x5f,0xa7,0x6f,0xe0,0x2, +0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x20,0xb7,0xd, 0x0, 0xc2,0xa7,0x6f, +0x16,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x10,0xb7,0xd, +0xe7,0xff,0x0, 0xaa,0xa7,0x6f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xe0,0x2, 0x1e,0xbd, +0xbf,0x6f,0x17,0x1, 0xe0,0x0, 0x1e,0x21,0xaf,0xd, 0xe0,0x2, 0x1e,0xe9,0xaf,0xc, +0x9f,0xd, 0xe1,0x0, 0xcf,0x0, 0xb7,0xd, 0xe7,0xff,0x0, 0x87,0xa7,0x6f,0xe7,0x7f, +0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x80,0xcf,0x0, +0xb7,0xd, 0xe7,0xfe,0x0, 0xeb,0xa7,0x6f,0xe7,0xbf,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x40,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0xcf, +0xa7,0x6f,0xe7,0xdf,0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, +0xe0,0x20,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0xb3,0xa7,0x5f,0xa6,0xdf,0x37,0x4f, +0xe2,0x0, 0xc7,0x1, 0xe6,0xff,0x16,0x7f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc,0x37,0x2f, +0x3f,0x4d,0xbf,0x5f,0xe7,0xef,0x16,0x7f,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c, +0xbf,0x6f,0x9f,0xd, 0xe0,0x10,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0x8a,0xa7,0x6f, +0xe7,0xfe,0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x1, +0xcf,0x0, 0xb7,0xd, 0xe7,0xfd,0x0, 0xee,0xa6,0xef,0xe0,0x0, 0x1f,0x2f,0x16,0x7b, +0xa7,0xe, 0x3e,0xdc,0xbe,0xef,0xa6,0x9e,0xe0,0x2, 0x1e,0x69,0xce,0x81,0xbe,0x9e, +0xa6,0x9e,0xce,0x90,0xbe,0x9e,0x9f,0xc, 0xcf,0x4, 0xb7,0xc, 0xe7,0xfd,0x0, 0xcb, +0xa7,0x6f,0x16,0x77,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x8, +0xb7,0xd, 0xe7,0xfd,0x0, 0xb1,0xa7,0x6f,0xe7,0xfd,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x2, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfd,0x0, 0x95, +0xa7,0x6f,0x16,0x7e,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x1, +0xb7,0xd, 0xe7,0xfc,0x0, 0xfb,0xa7,0x6f,0xe7,0xf7,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x8, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfc,0x0, 0xe1, +0xe0,0x2, 0x1f,0xc, 0x16,0x81,0xae,0x8e,0x16,0x5f,0xe0,0x0, 0x1f,0x3d,0xa6,0x8e, +0xa7,0xd, 0x3f,0x5c,0xbf,0xd, 0x16,0x7d,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c, +0xbf,0x6f,0x9f,0xd, 0xcf,0x2, 0xb7,0xd, 0xe7,0xfc,0x0, 0xbc,0xe0,0x1, 0xa7,0x6d, +0xe7,0xef,0x15,0xff,0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6d,0xe0,0x1, 0xa7,0x6d, +0xe0,0x2, 0x1e,0x69,0x3f,0x5b,0xe0,0x1, 0xbf,0x6d,0xe7,0xfb,0x16,0xff,0xa7,0x6f, +0x3f,0x5d,0xbf,0x6f,0x9f,0xc, 0xe0,0x4, 0xcf,0x0, 0xb7,0xc, 0xe7,0xfc,0x0, 0x93, +0xf, 0x3f,0xe0,0x2, 0x1f,0x14,0x97,0xde,0xe0,0x40,0xcf,0x80,0xb7,0xde,0x17,0x82, +0xe0,0x61,0x3f,0x91,0xf, 0xae,0x38,0x0, 0xf, 0xbf,0x17,0x84,0xe0,0x61,0x3f,0x91, +0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0x17,0xa0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0xf, 0xbf,0xe0,0x0, 0x17,0xc0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xe, 0x3f, +0xe0,0x2, 0x1f,0x42,0xe0,0x0, 0x1e,0xaa,0x9f,0x8e,0xe0,0x2, 0x1e,0x47,0xc7,0x81, +0xb7,0x8e,0x9f,0x8d,0x9f,0xc, 0xc7,0x81,0xb7,0x8d,0x27,0x3, 0xc7,0x7f,0xb7,0xc, +0xe0,0x3, 0x1f,0x96,0x8f,0xf, 0x27,0x4, 0x8f,0xf, 0xc7,0x7f,0xaf,0xf, 0x8f,0x8f, +0x2f,0x86,0xe0,0x2, 0x1f,0x12,0x97,0x8e,0xcf,0x88,0xb7,0x8e,0xe0,0x2, 0x1e,0xec, +0xe0,0x2, 0x1f,0x39,0x9f,0x8d,0xc7,0x81,0xb7,0x8d,0x9f,0x8e,0x27,0x84,0x9f,0x8e, +0xc7,0xff,0xb7,0x8e,0xe0,0x3, 0x1f,0xad,0x9f,0xf, 0x27,0x4, 0x9f,0xf, 0xc7,0x7f, +0xb7,0xf, 0xe0,0x3, 0x1f,0x81,0xe0,0x0, 0x1f,0x40,0xa7,0x8f,0x97,0xe, 0xb7,0x3f, +0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe0,0x2, +0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xac,0x38,0x0, 0xf, 0xbf,0xe0,0x4, 0x17,0x80, +0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x8, 0x17,0x80,0xe0,0x61, +0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x10,0x17,0x80,0xe0,0x61,0x3f,0x91, +0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x80,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf, +0x38,0x0, 0xf, 0xbf,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x2, 0xdf,0xf9,0x17,0x88,0xe0,0x61,0x3f,0x91, +0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x3, +0xd0,0x28,0x17,0x90,0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, +0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x2, 0x1f,0xe4,0xe7,0xfe,0x16,0xff,0xa7,0xf, +0xa7,0xbe,0x3f,0xdd,0xbf,0xbe,0xe0,0x5, 0xd7,0xfa,0xe0,0x40,0x17,0x80,0xe0,0x61, +0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x3f,0x83,0xe0,0x1, 0x1f,0xd4, +0xe0,0x6, 0x8f,0xf, 0xc7,0x7f,0xe0,0x6, 0xaf,0xf, 0xe0,0x6, 0x8f,0xf, 0x37,0x24, +0x3f,0x1f,0xa7,0xe, 0xe0,0x60,0x3f,0x19,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f, +0xa7,0x1e,0xe0,0x60,0x3f,0x1a,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f,0xa7,0x2e, +0xe0,0x60,0x3f,0x18,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x9e,0xa7,0xbf,0xe0,0x61, +0x3f,0x92,0x3b,0x0, 0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1d,0x5, 0x16,0x84,0xae,0x8a, +0x17,0x81,0xaf,0x9a,0x17,0x2, 0xaf,0xaa,0xf0,0x0, 0x13,0x80,0xae,0xba,0xf8,0x40, +0x3a,0xe7,0xae,0xca,0x14,0x1, 0xaf,0x5a,0xaf,0x6a,0xaf,0x7a,0xe0,0x1, 0xaf,0xa, +0x17,0x3, 0xe0,0x1, 0xaf,0x9a,0xe0,0x1, 0xaf,0xaa,0xe0,0x1, 0xaf,0xba,0xe0,0x1, +0xaf,0xca,0xe0,0x1, 0xaf,0xda,0x17,0x80,0xe0,0x1, 0xaf,0x6a,0xf0,0x2, 0x1b,0x71, +0xe0,0x1, 0xaf,0xfa,0xf0,0xb, 0x33,0xa2,0xe8,0xb, 0x3d,0x96,0xf0,0x0, 0xba,0x8b, +0xe0,0x0, 0x17,0x80,0xe8,0x9, 0x3d,0x17,0xe0,0xe, 0x3d,0x1f,0x8e,0xe, 0x8e,0x89, +0xe0,0xe, 0x34,0x3f,0x3e,0x7d,0xc7,0x81,0x5, 0x84,0xa6,0x8b,0x3f,0x4d,0xbf,0xb, +0xe2,0x0, 0xcf,0x90,0x1, 0xf2,0xf0,0x0, 0xc3,0x81,0xf2,0x0, 0xcb,0x90,0x1, 0xe3, +0xe0,0x1, 0x1f,0xd4,0x17,0x0, 0xe0,0x6, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x71, +0xe0,0xf, 0x34,0x22,0x3f,0x1f,0xa7,0x8e,0x27,0xb3,0x3f,0x83,0xe0,0x1, 0x1f,0xd4, +0xe0,0x6, 0x8e,0x8f,0xe0,0x60,0x3e,0x9, 0x36,0xa4,0x3e,0x9f,0xbe,0xd, 0xe0,0x6, +0x8e,0x8f,0xe0,0x60,0x3e,0xa, 0x36,0xa4,0x3e,0x9f,0xbe,0x1d,0xe0,0x6, 0x8e,0x8f, +0xe0,0x60,0x3e,0x8, 0x36,0xa4,0x3e,0x9f,0xbe,0x2d,0xe0,0x6, 0x8e,0x8f,0xe0,0x61, +0x3e,0x2, 0x36,0xa4,0x3e,0x9f,0xbe,0x3d,0xe0,0x6, 0x8e,0x8f,0xc6,0x81,0xe0,0x6, +0xae,0x8f,0xa7,0x8e,0xe0,0x61,0x3f,0x92,0x17,0x81,0xe0,0x8, 0x37,0xb8,0xe0,0x61, +0x3c,0x11,0xe0,0x60,0x3f,0x80,0xcf,0x82,0xe0,0x60,0x3f,0x90,0x3b,0x0, 0x38,0x82, +0x8, 0xb4,0xe8,0x0, 0xc, 0x37,0xe0,0x3, 0x1f,0xb8,0xa1,0xf, 0xa7,0xb2,0x37,0xcf, +0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0xe0,0x0, +0x2f,0xf2,0xa7,0xb2,0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0xe2,0x0, 0xc7,0x81, +0xe0,0x0, 0x2f,0xf1,0xa7,0xb2,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82, +0x37,0xc1,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xed,0xa7,0xb2,0x37,0xca,0xe2,0x0, +0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xca,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xe9, +0xa7,0xb2,0x37,0xcb,0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0x37,0xcb,0xe2,0x0, +0xc7,0x81,0x2f,0xbd,0xa7,0xb2,0x37,0xcc,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82, +0x37,0xcc,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xe6,0xa7,0xb2,0x37,0xc7,0xe2,0x0, +0xc7,0x81,0x27,0xa5,0xa7,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0xa0,0xa7,0x92, +0xe0,0x0, 0x1a,0x10,0xe0,0x1, 0xcf,0x80,0xbf,0x92,0x8f,0x84,0xe0,0x2, 0x19,0x92, +0x27,0x89,0x99,0x3, 0x31,0x4c,0xe2,0x0, 0xc1,0x1, 0x29,0x4, 0xe0,0x6, 0xd5,0x28, +0xa9,0x4, 0x97,0x83,0xe0,0x3, 0x1f,0x37,0xe3,0xdf,0xc7,0xff,0xb7,0x83,0x97,0x83, +0xe3,0xbf,0xc7,0xff,0xb7,0x83,0x9f,0x8e,0xc7,0x81,0xb7,0x8e,0xe0,0x1, 0x17,0x80, +0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0xa, 0x21,0x38,0x0, 0xa7,0x92,0xe0,0x3, +0x1f,0x1d,0xe0,0x10,0xcf,0x80,0xbf,0x92,0x97,0x8e,0xcf,0xa0,0xb7,0x8e,0xe7,0xff, +0x0, 0xbb,0xa7,0x92,0xe1,0x0, 0xcf,0x80,0xbf,0x92,0xe0,0x0, 0xd9,0x1f,0xe7,0xff, +0x0, 0x8a,0xa7,0x92,0xcf,0x81,0xbf,0x92,0xe0,0x0, 0xd9,0x5, 0xe7,0xff,0x0, 0x8c, +0xa7,0x92,0xcf,0x82,0xbf,0x92,0xe0,0x0, 0xd9,0x11,0xe7,0xff,0x0, 0x90,0xa7,0x92, +0xe0,0x2, 0x19,0x92,0xe0,0x8, 0xcf,0x80,0xbf,0x92,0x97,0x83,0xe0,0x2, 0x1f,0x14, +0xcf,0x82,0xb7,0x83,0x97,0xce,0xcf,0x88,0xb7,0xce,0xe0,0x0, 0xd8,0xdb,0xe7,0xff, +0x0, 0x89,0xa7,0x92,0x14,0x7, 0xe0,0x20,0xcf,0x80,0xbf,0x92,0xdf,0x18,0xe0,0x3, +0x1e,0x9d,0xe0,0x2, 0x19,0x92,0x9f,0xd, 0x97,0x83,0x16,0x6f,0x37,0x41,0xe2,0x0, +0xc7,0x10,0x3f,0xdc,0x3f,0xce,0xb7,0x83,0x97,0x8d,0xe3,0xff,0xc7,0xdf,0xb7,0x8d, +0xd9,0xe, 0xd9,0x37,0xa7,0x92,0xe0,0x2, 0x1f,0x14,0xe0,0x20,0xcf,0x80,0xbf,0x92, +0xe7,0x0, 0x16,0x80,0x97,0xde,0x3f,0xcd,0xb7,0xde,0xe0,0x2, 0x1f,0xf1,0xa7,0xff, +0x2f,0x87,0xe0,0x1, 0x17,0x80,0xe0,0x61,0x3f,0x91,0xe7,0xfe,0x0, 0xf0,0xde,0x7e, +0xe7,0xfe,0x0, 0xed,0x8, 0xb1,0xe0,0x6, 0xdc,0x84,0xe0,0x60,0x3f,0x87,0xe0,0x1, +0x1f,0x50,0xe0,0x1, 0xbf,0xf, 0xe0,0x2, 0x1f,0x65,0xe0,0x1, 0xbf,0x1f,0xe0,0x3, +0x1f,0x11,0xe0,0x1, 0xbf,0x2f,0xe0,0x1, 0x1f,0x4b,0xe0,0x1, 0xbf,0x3f,0xe0,0x3, +0x1f,0x14,0xe0,0x1, 0xbf,0x4f,0xe0,0x0, 0x1f,0x49,0xe0,0x1, 0xbf,0x5f,0xe0,0x0, +0x1f,0x14,0xe0,0x1, 0xbf,0x6f,0xe0,0x2, 0x1f,0x2a,0xe0,0x1, 0xbf,0x7f,0xe0,0x2, +0x1f,0x1d,0xe0,0x2, 0xbf,0xf, 0xe0,0x2, 0x1f,0x61,0xe0,0x2, 0xbf,0x1f,0xe0,0x2, +0x1f,0x2, 0xe0,0x2, 0xbf,0x2f,0xe0,0x3, 0x1f,0x42,0xe0,0x2, 0xbf,0x3f,0xe0,0x0, +0x1f,0x35,0xe0,0x2, 0xbf,0x4f,0xe0,0x2, 0x1f,0x6e,0xe0,0x2, 0xbf,0x5f,0xe0,0x0, +0x1f,0x36,0xe0,0x2, 0xbf,0x6f,0x8, 0xe1,0xe0,0x2, 0x1f,0x91,0xe7,0x7f,0x16,0x7f, +0xa7,0xf, 0xe0,0x1, 0x1f,0xdc,0xa6,0xae,0xa7,0x8f,0x3e,0xdc,0xbe,0xae,0xe0,0xa0, +0x17,0x0, 0x9e,0xbf,0xe0,0x1e,0xce,0x80,0xb6,0xbf,0xb7,0x7f,0xa7,0x4f,0x3f,0x5c, +0xbf,0x4f,0xa7,0x4f,0xe0,0x20,0xcf,0x0, 0xbf,0x4f,0x38,0x82,0xe0,0x2, 0x1f,0x91, +0xe7,0x7f,0x16,0x7f,0xa6,0x8f,0xe0,0x2, 0x1f,0xa4,0xa7,0x1d,0xa7,0x8f,0xcf,0x1, +0xbf,0x1d,0xe6,0xff,0x16,0xff,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0xa6,0x8f,0xe0,0x1, +0x1f,0x5c,0x3e,0xdc,0xa7,0xe, 0xbe,0x8f,0x9e,0xbe,0xe0,0x1e,0xce,0x80,0xb6,0xbe, +0xe0,0x61,0x3e,0x82,0xe7,0xef,0x15,0xff,0x3e,0xdb,0xe0,0x61,0x3e,0x92,0xe0,0x46, +0x16,0x80,0xbe,0x8f,0x15,0xfe,0xa6,0x8f,0xce,0x84,0xbe,0x8f,0xa6,0x8f,0xce,0x82, +0xbe,0x8f,0xa6,0x8f,0x3e,0xdb,0xbe,0x8f,0xa7,0xce,0x3f,0xdc,0xbf,0xce,0x17,0x0, +0xe0,0x0, 0x1f,0xab,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xa4,0x16,0xfb,0xa7,0x8f, +0xe4,0xc, 0x34,0x40,0xa7,0xf, 0xe2,0x1, 0xc6,0x7f,0x3f,0x5d,0xbf,0xf, 0xe0,0xd, +0x34,0x48,0x17,0xb, 0xaf,0x7f,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc4,0x7f,0xa7,0xf, +0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x15,0xff,0x3f,0x5b, +0xbf,0xf, 0xae,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, +0xe7,0x7f,0x16,0x7f,0x3f,0x5c,0xbf,0xf, 0xae,0xff,0xa7,0xf, 0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, 0xac,0x7f, +0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff, +0x3f,0x5d,0xbf,0xf, 0x17,0x0, 0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, +0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0x0, 0x0, +0x8, 0xb3,0x39,0xea,0x39,0x69,0xdf,0xb1,0x21,0xa1,0xe0,0x2, 0x1f,0xa4,0xc1,0xff, +0xe3,0xff,0xc1,0xff,0x16,0xff,0xa7,0xf, 0x3e,0x92,0xe0,0xc, 0x39,0x13,0x15,0x0, +0xe7,0x7f,0x15,0xff,0xad,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa7,0x8e,0x3f,0xdb,0xbf,0x8e,0x8f,0xfe,0xe0,0x80,0xaf,0x9d,0x3e,0xfc,0x1, 0xf3, +0xa7,0x8e,0x14,0x1, 0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0xe0,0x2, 0x1f,0xa4,0x14,0x1, +0xa7,0xf, 0xa7,0x8e,0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0x8, 0xb2,0x14,0x1, 0xef,0xff, +0xd7,0x3b,0xe0,0x1, 0x14,0xc8,0x14,0x0, 0xe0,0x6, 0xd3,0xcf,0x24,0x14,0xe0,0x2, +0x1f,0x48,0x17,0x82,0xe0,0x0, 0x19,0x4d,0xaf,0x8e,0xe0,0x2, 0x1f,0x12,0xaf,0x82, +0x97,0x8e,0xe0,0x20,0xcf,0x80,0xb7,0x8e,0x8c,0x2, 0xef,0xff,0xd5,0x91,0x9, 0x21, +0xe7,0xed,0x0, 0xd1,0xe0,0x2, 0x1f,0xc8,0x17,0x1, 0xe0,0x0, 0x19,0x4d,0xaf,0xf, +0x3c,0xe8,0xaf,0x2, 0x8f,0x8f,0xe0,0x3, 0x1c,0x2c,0xe4,0x0, 0xc7,0x8e,0x3c,0x1f, +0xef,0xff,0xd2,0x3b,0x0, 0xea,0x8, 0xb2,0xe0,0x2, 0x19,0x40,0xe0,0x1, 0x8c,0xa2, +0xe0,0x4, 0x8f,0xd2,0x2f,0x95,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0xe0,0x0, 0x2f,0xcb, +0xe0,0x1, 0x8c,0x82,0x14,0x5, 0xe2,0x0, 0xcc,0x94,0x2, 0x98,0xe0,0x0, 0x14,0x64, +0x24,0x95,0xe0,0x0, 0x14,0x63,0x3c,0x19,0xe0,0x6, 0xda,0x4a,0x0, 0x8f,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x2f,0xa3,0xe0,0x1, 0x8f,0x92,0xe0,0x0, 0x14,0x7f,0xe0,0x43, +0x3f,0xf, 0xe2,0x0, 0xcf,0x0, 0xe0,0x68,0x3b,0x2f,0xe0,0x5, 0x8f,0xc2,0x14,0x98, +0x3c,0x3f,0xe0,0x6, 0xda,0x35,0xe0,0x0, 0x1f,0xb2,0xe0,0x3, 0x1f,0x16,0xac,0xf, +0x87,0x8f,0xaf,0x8e,0xe0,0x2, 0x1f,0x12,0x97,0x8e,0xe3,0xff,0xc7,0xf7,0xb7,0x8e, +0x17,0x0, 0xe0,0x2, 0x1f,0xc2,0xb7,0xf, 0x9, 0x61,0xe0,0x3, 0x1f,0xc6,0x8f,0x8f, +0xe2,0x0, 0xcf,0xb8,0x5, 0x87,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x17,0xe0,0x7, 0x14,0x68,0xe0,0x6, 0xda,0x13,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f, +0x0, 0xd5,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xf3,0xe0,0x3, +0x14,0x74,0xe0,0x6, 0xda,0x5, 0xc4,0x7e,0xe2,0x1, 0xc4,0x7f,0x0, 0xc7,0xe0,0x3, +0x14,0x74,0xe0,0x6, 0xd9,0xfd,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0xe7,0xff,0x0, 0xbf, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0xa0,0x8, 0xb4, +0xe0,0x2, 0x19,0x12,0x9f,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0x96,0xe0,0x3, +0x1f,0x43,0x97,0x82,0x89,0x8e,0xe3,0xfe,0xc7,0xff,0xe2,0x0, 0xc9,0x81,0xb7,0x82, +0x1, 0x10,0x9f,0x82,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0x87,0x97,0x82,0x14,0x0, +0xe3,0x7f,0xc7,0xff,0xb7,0x82,0xa, 0x61,0x14,0x1, 0xa, 0x61,0x14,0x1, 0x38,0x82, +0x3c,0x63,0xef,0xff,0xd6,0x79,0xe0,0x1, 0x14,0xc8,0x3c,0x63,0xe0,0x6, 0xd3,0xd, +0xe0,0x0, 0x1a,0x4d,0x2c,0x5, 0x8c,0x4, 0xef,0xff,0xd4,0xda,0x0, 0xe3,0x97,0x82, +0xe0,0x2, 0x1f,0x48,0xe3,0xdf,0xc7,0xff,0xb7,0x82,0x3c,0xe3,0x97,0x82,0xe0,0x3, +0x1c,0x2c,0xe0,0x40,0xcf,0x80,0xb7,0x82,0xa9,0x8e,0xa9,0x84,0x8f,0x8e,0xe4,0x0, +0xc7,0x8e,0x3c,0x1f,0xef,0xff,0xd1,0x62,0x0, 0xe7,0x8, 0xb6,0xe0,0x0, 0x1f,0xbd, +0xe0,0x3, 0x19,0x36,0xa1,0x8f,0xa7,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0x99, +0xe0,0x2, 0x1b,0x12,0xe7,0xff,0x12,0x81,0xe0,0x1, 0x12,0x7f,0x0, 0x8c,0x9f,0x86, +0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xd4,0xbe,0xa7,0x83,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x27,0x87,0xaa,0x82,0xef,0xff,0xd6,0x5a,0x3c,0xe4,0x24,0x71,0xb, 0x61, +0xe0,0x1, 0x1f,0xdc,0xe7,0xef,0x16,0xff,0xa7,0x8f,0xe0,0x4, 0x14,0x89,0xe0,0x1, +0xa7,0x6f,0x14,0x2, 0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6f,0xe0,0x1, 0xa7,0x6f, +0x3f,0x5d,0xe0,0x1, 0xbf,0x6f,0xe7,0xff,0x17,0x81,0xaf,0x82,0xb, 0x21,0xe0,0x9, +0x0, 0x9b,0x0, 0x0, 0x8, 0xb2,0xe0,0x2, 0x19,0x12,0x9f,0x82,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x2f,0x8d,0x9f,0x82,0xe0,0xf, 0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x87, +0xdf,0xb5,0x9f,0x82,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0xfb,0xef,0xff,0xd6,0x27, +0x24,0x3, 0x0, 0x85,0xdf,0xab,0xef,0xff,0xd6,0x22,0x24,0x7d,0x9, 0x61,0xe0,0x0, +0x1f,0xbd,0xa7,0x8f,0xa7,0x8f,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x94,0xe0,0x3, +0x1e,0xb6,0xe0,0x2, 0x1f,0xc, 0xe7,0xff,0x16,0x1, 0xae,0xd, 0x8e,0x8e,0xe2,0x0, +0xce,0x81,0x1, 0xa, 0xe0,0x2, 0x1f,0xc7,0x9f,0x8f,0x2f,0x8c,0x14,0x83,0x14,0x1, +0xe0,0x8, 0x0, 0xe2,0x38,0x82,0xe0,0x2, 0x1e,0xc7,0xe0,0x1f,0x16,0x20,0xb6,0xd, +0xaf,0x8e,0xe0,0x4, 0x14,0x81,0x14,0x2, 0xe0,0x8, 0x0, 0xd6,0x8, 0xb5,0xef,0xff, +0xd5,0xf6,0xe0,0x0, 0x24,0x4b,0x14,0x0, 0xd6,0xa, 0xe0,0x2, 0x1f,0x91,0xe7,0xdf, +0x17,0x7f,0xa1,0xf, 0xe0,0x2, 0x1a,0x96,0xa7,0x92,0xe0,0x2, 0x19,0x92,0x3f,0xde, +0xbf,0x92,0xe7,0xfb,0x17,0x7f,0xa7,0x92,0xe0,0x2, 0x1a,0x40,0x3f,0xde,0xbf,0x92, +0xe7,0xfd,0x17,0x7f,0xa7,0x92,0x3f,0xde,0xbf,0x92,0xe7,0xfe,0x17,0x7f,0xa7,0xa2, +0x3f,0xde,0xbf,0xa2,0x9f,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xe0,0xa, +0x8f,0x84,0x27,0xa8,0x8f,0x85,0x2f,0xa6,0xdf,0xab,0x9f,0x83,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x27,0xf6,0x8f,0x85,0x27,0x84,0x8f,0x85,0xc7,0xff,0xaf,0x85,0x14,0x1, +0xa7,0x92,0xe0,0x20,0xcf,0x80,0xbf,0x92,0xa7,0x92,0xe0,0x4, 0xcf,0x80,0xbf,0x92, +0xa7,0x92,0xe0,0x2, 0xcf,0x80,0xbf,0x92,0xa7,0xa2,0xe0,0x1, 0xcf,0x80,0xbf,0xa2, +0xa, 0xa1,0xe0,0xb, 0x0, 0xc5,0xdf,0x32,0xef,0xff,0xd5,0xa9,0x24,0x7d,0xe7,0xff, +0x0, 0xb4,0xdf,0x2c,0x0, 0xd0,0x0, 0x0, 0x8, 0xb3,0x14,0x1, 0xef,0xff,0xd5,0x7c, +0xe0,0x0, 0x1f,0xbd,0xa7,0x8f,0xa1,0xf, 0x31,0x43,0xe2,0x0, 0xc1,0x1, 0x29,0x7c, +0x3c,0x62,0xd5,0xad,0xe0,0x2, 0x1f,0x91,0xe7,0xdf,0x17,0x7f,0xa1,0x8f,0x14,0x1, +0xa7,0x93,0x3c,0xe2,0x3f,0xde,0xbf,0x93,0xe7,0xfb,0x17,0x7f,0xa7,0x93,0x3f,0xde, +0xbf,0x93,0xe7,0xfd,0x17,0x7f,0xa7,0x93,0x3f,0xde,0xbf,0x93,0xe7,0xfe,0x17,0x7f, +0xa7,0xa3,0x3f,0xde,0xbf,0xa3,0xe7,0xff,0x17,0x1, 0xe0,0x3, 0x1f,0xb6,0xaf,0xf, +0xd3,0xd2,0xa7,0x93,0x14,0x1, 0xe0,0x20,0xcf,0x80,0xbf,0x93,0xa7,0x93,0xe0,0x4, +0xcf,0x80,0xbf,0x93,0xa7,0x93,0xe0,0x2, 0xcf,0x80,0xbf,0x93,0xa7,0xa3,0xe0,0x1, +0xcf,0x80,0xbf,0xa3,0x9, 0xa1,0xe0,0xa, 0x0, 0xfb,0x8, 0xb1,0xe0,0x1, 0x1f,0xc2, +0xe0,0x1a,0x17,0x20,0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0x37,0x28, +0x3c,0x4e,0xe0,0x5, 0xd3,0x4c,0xe0,0x5, 0xd2,0xe8,0xe0,0x1, 0xd7,0xc0,0xe0,0x2, +0x1f,0x40,0x17,0x81,0xe0,0x4, 0xaf,0xfe,0xe0,0x1b,0x14,0x2c,0xe0,0x3, 0x1f,0x47, +0xaf,0x8e,0xe0,0x5, 0xd3,0x3c,0xe0,0x2, 0x1f,0xfd,0xe0,0x19,0x16,0x9d,0x17,0x7, +0x3e,0x9f,0xaf,0xd, 0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0x8, 0xe1,0x8, 0xb2,0xe0,0x2, +0x1f,0xc0,0x17,0x0, 0xe0,0x0, 0x1e,0xb2,0xe0,0x4, 0xaf,0x5f,0xe0,0x3, 0x1f,0x16, +0x8f,0x8d,0x8e,0xe, 0x37,0xc1,0x3f,0xfc,0x3, 0x9d,0x8e,0x8d,0x8f,0x8e,0x36,0xc1, +0x3f,0xad,0xe0,0x2, 0x19,0x12,0xaf,0x8e,0x17,0x0, 0xe0,0x2, 0x1f,0xec,0xb7,0xf, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x85,0x97,0x82, +0xe0,0x1, 0xcf,0x80,0xb7,0x82,0x9f,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x2f,0x88, +0x9, 0x61,0xe0,0x2, 0x19,0x12,0x97,0x82,0xcf,0x88,0xb7,0x82,0x0, 0xe6,0xd5,0x41, +0x97,0x82,0xcf,0x88,0xb7,0x82,0x97,0x82,0xe0,0x80,0xcf,0x80,0xb7,0x82,0x9, 0x61, +0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f,0x27,0x86,0xe0,0x2, 0x1f,0x87,0x8f,0x8f, +0x27,0x89,0x38,0x82,0x8, 0xb1,0xdf,0xbb,0xe0,0x2, 0x1f,0xeb,0x17,0x2, 0xaf,0xf, +0x8, 0xe1,0xe7,0xff,0x0, 0xb5,0x8, 0xb1,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x22, +0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa3,0x8c,0xf, 0x37,0x28,0x3c,0x4e,0xe0,0x5, +0xd2,0xd6,0xdf,0x3b,0xdf,0x7b,0xdf,0xa3,0xde,0x14,0x8, 0xa1,0xe7,0xe8,0x0, 0xe3, +0x8, 0xb4,0xe0,0x2, 0x1f,0xba,0x12,0x3c,0x8f,0x8f,0x27,0x8a,0xe0,0x3, 0x1f,0xc3, +0x8f,0x8f,0xe2,0x0, 0xcf,0x80,0x17,0xb9,0xe0,0x6f,0x39,0x24,0x3a,0x6f,0xe0,0x2, +0x19,0x40,0xe0,0x3, 0x19,0x82,0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0x1, 0x1b, +0x8f,0x3, 0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0x1, 0x2, 0xa, 0x61,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x27,0xfc,0x3a,0x7e,0x1, 0x23,0x17,0x81,0x3f,0x9e,0xe2,0x1, +0xc7,0xff,0xe0,0x3, 0x1e,0xc6,0xe2,0x0, 0xcf,0xbc,0xaf,0xd, 0x5, 0x82,0x17,0x80, +0xaf,0x83,0xa, 0x61,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0x27,0xe3,0x8f,0x3, 0x2f,0x62, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0xdb,0xe0,0x3, +0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xd5,0xdd,0x30,0x0, 0xd2,0xe0,0x3, +0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x2, 0x1f,0x12, +0x97,0x8e,0xe0,0x1, 0xcf,0x80,0xb7,0x8e,0xdd,0xbc,0xef,0xff,0xd4,0xc, 0x8f,0x3, +0x0, 0xcd,0x8, 0xb4,0xe0,0x2, 0x1f,0xe0,0xe0,0x2, 0x19,0x40,0x8f,0xf, 0x27,0xd, +0x17,0x0, 0xe0,0x4, 0x8e,0xd2,0xaf,0xf, 0xe0,0x0, 0x26,0xce,0xe0,0x4, 0x8f,0xd2, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x3, 0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81, +0x1, 0x3b,0x4, 0x8b,0xe2,0x0, 0xcf,0x83,0x1, 0x84,0xa, 0x21,0xe7,0xfe,0x0, 0xf5, +0x17,0x81,0xe0,0x4, 0xaf,0xd2,0xa, 0x61,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x27,0xb6, +0xe0,0x2, 0x1e,0xec,0x17,0x0, 0xb7,0xd, 0x8f,0xe2,0xe2,0x0, 0xc7,0x81,0x27,0xf4, +0xe0,0xa, 0x8f,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0xef,0xe0,0x2, 0x1f,0x87,0x8e,0xf, +0xe2,0x0, 0xce,0x1, 0x1, 0xe9,0xe0,0x4, 0xae,0x52,0xe0,0x3, 0x1d,0x16,0xe0,0x0, +0x1e,0x32,0xe0,0x2, 0x1d,0xf7,0x8e,0xc, 0x8c,0x8a,0xaf,0xf, 0x3e,0x19,0xae,0xa, +0xb7,0xd, 0xe0,0x3, 0x1f,0x82,0x8e,0x8b,0xaf,0xf, 0xce,0x84,0xe0,0x3, 0x1f,0xc6, +0xae,0x8b,0xaf,0xf, 0xa, 0x61,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x27,0xcd,0xa, 0x21, +0xe7,0xfe,0x0, 0xa8,0xde,0xec,0xe7,0xff,0x0, 0xb9,0x8f,0xe2,0xe2,0x0, 0xc7,0x81, +0x27,0xc3,0xe0,0x2, 0x19,0xec,0xe0,0x7, 0x14,0xe8,0x9c,0x3, 0x8a,0x72,0xe0,0x6, +0xd7,0x8a,0xe3,0xff,0xc4,0x7f,0x3c,0x74,0x3, 0x8c,0xe0,0xa, 0x8f,0x82,0xe2,0x0, +0xcf,0x81,0xe7,0xff,0x1, 0xb2,0x9f,0x83,0xe2,0x7, 0xcf,0xe7,0xe7,0xff,0x5, 0xad, +0x17,0x81,0xe0,0x4, 0xaf,0xd2,0x16,0x0, 0xe0,0x3, 0x1e,0x96,0xe0,0x0, 0x1f,0xb2, +0xe0,0x2, 0x1f,0x77,0x8f,0x8f,0x8d,0x8d,0x3f,0x9b,0xe0,0x2, 0x1d,0x87,0xaf,0x8d, +0x16,0x80,0xb6,0x3, 0xae,0x8b,0xe0,0x3, 0x1d,0x82,0x8f,0x8e,0xae,0xb, 0xcf,0x84, +0xe0,0x3, 0x1e,0x46,0xaf,0x8e,0xae,0x8c,0xa, 0x61,0xe0,0x4, 0xaf,0xd2,0x16,0x0, +0xe0,0x3, 0x1e,0x96,0xe0,0x0, 0x1f,0xb2,0x8f,0x8f,0x8d,0x8d,0x3f,0x9b,0xaf,0x8d, +0xe0,0x2, 0x1d,0x87,0xe0,0x2, 0x1f,0xec,0xe0,0x2, 0x1e,0xf7,0xb6,0xf, 0xaf,0xb, +0xe0,0x3, 0x1d,0x82,0x8f,0x8d,0xae,0xb, 0xcf,0x84,0xe0,0x3, 0x1e,0x46,0xaf,0x8d, +0xaf,0xc, 0xe7,0xfe,0x0, 0xe3,0x8, 0xb1,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x2f,0x8d, +0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0x27,0x85,0xdd,0x86,0x8, 0xa1,0xe7,0xfd,0x0, 0xea, +0xdd,0xc6,0x8, 0xa1,0xe7,0xfd,0x0, 0xe6,0xdf,0x3d,0x0, 0xf3,0xe0,0x3, 0x1f,0x2d, +0xe0,0x2, 0x1e,0x92,0x0, 0x86,0x9f,0x8d,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x83, +0x9f,0x8e,0x2f,0xfa,0x17,0x87,0xb7,0x8e,0x38,0x82,0x0, 0x0, 0xe0,0x0, 0x1f,0xcd, +0x8f,0x8f,0x2f,0x9f,0x8, 0xb2,0xe0,0x2, 0x19,0x39,0x9f,0x82,0x2f,0xff,0xdc,0x6c, +0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0x13,0xe0,0x1, +0x8c,0x8f,0xe0,0x0, 0x14,0x64,0xe0,0x6, 0xd6,0xc3,0xc4,0x7f,0xb4,0x2, 0xe0,0x2, +0x1f,0xb2,0x9e,0x82,0x9f,0xf, 0x3e,0xfe,0x5, 0x83,0x97,0x8f,0xb7,0x82,0x9, 0x61, +0x38,0x82,0xe0,0x1, 0x8f,0x9f,0xc7,0xff,0xb7,0x82,0x0, 0xf2,0xe0,0x2, 0x1f,0x91, +0xe7,0x7f,0x16,0xff,0xa7,0x8f,0xe2,0x0, 0xcc,0x7, 0xa7,0x1f,0xe1,0x0, 0xcf,0x0, +0xbf,0x1f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0xe7,0xdf,0x16,0xff,0xa7,0x2f,0x3f,0x5d, +0xbf,0x2f,0xe7,0xbf,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x2, 0x88,0xa7,0x2f, +0x16,0xf8,0xe2,0x0, 0xc4,0x7, 0x3f,0x5d,0x3c,0x4e,0xbc,0x2f,0x38,0x82,0xe0,0x2, +0x1f,0xe4,0x16,0xdf,0xa7,0xf, 0x15,0xfe,0xa7,0xbe,0x3f,0xdd,0xbf,0xbe,0xe7,0xfe, +0x16,0xff,0xa6,0x3e,0xe0,0x0, 0x1f,0xbd,0x3e,0x5d,0xa7,0x8f,0xbe,0x3e,0x17,0x0, +0xaf,0x7f,0x16,0xfd,0xa6,0xf, 0xe0,0x1, 0x1f,0x5c,0x3e,0x5b,0xbe,0xf, 0xa6,0xf, +0xa7,0xe, 0x3e,0x5d,0xbe,0xf, 0xa6,0xbf,0x3e,0xdb,0xbe,0xbf,0x16,0xfc,0xa7,0x8e, +0x3f,0xdd,0xbf,0x8e,0x17,0x80,0xe0,0x3, 0xb7,0x9e,0x17,0x80,0xe0,0x61,0x3f,0x92, +0xe1,0xff,0x17,0xff,0xe0,0x61,0x3f,0x91,0x38,0x82,0xe0,0x2, 0x1f,0xe4,0xe0,0x0, +0x1f,0x3d,0xa6,0x8f,0x16,0x7e,0xa7,0xbd,0xa7,0xe, 0x3f,0xdc,0xbf,0xbd,0xe7,0xff, +0x16,0xbf,0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0xe0,0x61,0x3f,0x82,0xcf,0x81,0xe0,0x61, +0x3f,0x92,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xe0,0x1, 0x1f,0x5c,0xa6,0x8f,0x16,0x6f, +0xa7,0x9d,0xa7,0xe, 0x3f,0xdc,0xbf,0x9d,0xe0,0x1, 0xa7,0xee,0xe0,0x20,0xcf,0x80, +0xe0,0x1, 0xbf,0xee,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xe0,0x2, 0x1f,0xe4, +0xa7,0x1d,0xa7,0x8f,0xcf,0x8, 0xbf,0x1d,0xe7,0xff,0x16,0xbf,0xa7,0x3f,0x3f,0x5d, +0xbf,0x3f,0xa7,0x2f,0xe2,0x1, 0xc7,0x4f,0xcf,0x20,0xbf,0x2f,0xe0,0x2, 0x17,0x0, +0xb7,0x3f,0xa7,0x3f,0xcf,0x40,0xbf,0x3f,0xe0,0x61,0x3f,0x82,0xe0,0x40,0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0x8, 0xb2,0xe0,0x1, 0x1f,0x5c,0x17,0xff,0xa1,0xe, +0xb7,0xd2,0xe0,0x1, 0xb7,0xd2,0xe0,0x6, 0xd5,0x11,0xe0,0x2, 0x1f,0xe6,0xe0,0x41, +0x3f,0x8, 0xac,0xf, 0xe7,0xfb,0x16,0xff,0xa7,0x82,0xe2,0x0, 0xc7,0x1, 0x37,0x29, +0x3f,0xdd,0x3f,0xce,0xbf,0x82,0xe0,0x1, 0x17,0xc3,0xb7,0xb2,0xda,0xa6,0xa7,0xb2, +0x16,0xef,0xcf,0x84,0xbf,0xb2,0x17,0xfb,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0x17,0xf7, +0xa7,0x32,0xcf,0x8, 0xbf,0x32,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0xa7,0x32,0xcf,0x10, +0xbf,0x32,0xa7,0x12,0x3f,0x5d,0xbf,0x12,0xa7,0xc2,0x3f,0xdd,0xbf,0xc2,0x9, 0x61, +0xe0,0x2, 0x1f,0x90,0xe7,0xff,0x16,0xbf,0xa7,0x8f,0xa7,0x1f,0xcf,0x1, 0xbf,0x1f, +0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0xe7,0xfe,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0x17,0x2f,0xbf,0x2f,0xa7,0x1f,0xcf,0x2, 0xbf,0x1f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f, +0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0xe0,0x61,0x3f,0x82,0xe7,0xf7,0x17,0x7f,0x3f,0xde, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x2, 0x1f,0x90,0xa7,0x8f,0xa7,0x2f,0x27,0x7, +0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x38,0x82,0xe0,0x2, +0x1f,0x91,0xe0,0x0, 0x1e,0x40,0xa7,0xf, 0xe7,0xfe,0x15,0x7f,0xa7,0xbe,0xe0,0x0, +0x1d,0xc2,0xcf,0x81,0xbf,0xbe,0xa6,0x8e,0xe0,0x3, 0x1f,0x81,0xce,0x82,0xbe,0x8e, +0x16,0xa0,0xb6,0x8c,0xa6,0x9e,0xa7,0x8f,0x3e,0xda,0xbe,0x9e,0xa6,0x9e,0xa5,0x8b, +0xe0,0x8, 0xce,0x80,0xbe,0x9e,0x16,0xf7,0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, +0xcf,0x8, 0xbf,0xf, 0xa7,0xb, 0x3f,0x5d,0xbf,0xb, 0x17,0x0, 0xe0,0x1, 0xaf,0x3f, +0x96,0xc, 0xb6,0x3f,0xe0,0x61,0x3f,0x2, 0xe0,0x2, 0xcf,0x0, 0xe0,0x61,0x3f,0x12, +0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0x38,0x82, +0xe0,0x3, 0x1f,0x4b,0xe2,0xff,0x17,0xf0,0xbf,0xf, 0xe2,0xff,0x17,0xf4,0xe0,0x3, +0x1f,0x4c,0xbf,0xf, 0xe2,0xff,0x17,0xf8,0xe0,0x3, 0x1f,0x4d,0xbf,0xf, 0xe2,0xff, +0x17,0xfc,0xe0,0x3, 0x1f,0x4e,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xdc,0x16,0x80, +0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf,0xe0,0x2, 0x16,0x84,0xbf,0xd, 0xe0,0x2, +0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0xe0,0x0, 0x16,0xeb,0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf,0xe0,0x2, 0x16,0x84, +0xbf,0xd, 0xe0,0x2, 0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x38,0x82, +0xc4,0x7f,0xe1,0xff,0x17,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7e,0x1, 0xc, 0x17,0x88, +0x0, 0x0, 0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc4,0x7f,0xe3,0xff,0xc4,0x7f, +0x3c,0x7e,0x1, 0xf6,0x38,0x82,0x0, 0x0, 0xc4,0x7f,0xe1,0xff,0x16,0x7f,0xe3,0xff, +0xc4,0x7f,0x3c,0x7c,0x1, 0x17,0x16,0x84,0xe0,0x1, 0x17,0x7a,0x17,0x88,0x0, 0x0, +0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0x2f,0x77, +0xc6,0xff,0xe2,0x1, 0xc6,0xff,0x2e,0xf1,0xc4,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7c, +0x1, 0xeb,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0xf, 0xa7,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0x98,0xe0,0x2, 0x1f,0x91,0xe7,0xff,0x16,0x3f,0xa7,0x8f,0xa6,0xdf,0xe0,0x1, +0xce,0x80,0xbe,0xdf,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a,0xe2,0x0, +0xc7,0x1, 0x2f,0x1e,0xa7,0x5f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xbf,0x5f,0x38,0x82, +0xa7,0xce,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0x98,0xe0,0x2, 0x1f,0x91,0xe7,0xff, +0x16,0x3f,0xa7,0x8f,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xe7,0xfe,0x16,0x7f,0xa6,0xdf, +0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0x27,0x64,0xa7,0x5f, +0xe1,0x0, 0xcf,0x0, 0xbf,0x5f,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xa7,0x8f,0xa6,0xdf, +0xce,0xc0,0x0, 0xeb,0x8, 0xb4,0xe0,0x3, 0x19,0x36,0x8f,0x82,0xe2,0x1, 0xcf,0x81, +0x1, 0x4, 0x17,0x80,0xaf,0x82,0xa, 0x61,0x24,0x2b,0xe2,0x0, 0xcc,0x1, 0x39,0xe9, +0x1, 0x30,0xe2,0x0, 0xcc,0x2, 0x1, 0xf6,0x3f,0x83,0xdf,0xad,0xe0,0x2, 0x1f,0x91, +0xe0,0x3, 0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0x21,0x84,0xa4,0xef,0x3c,0xc3, +0xbc,0xef,0xe0,0x0, 0x1f,0x3d,0xa7,0xe, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, +0x2f,0xe, 0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,0x80,0xaf,0x82,0xa, 0x61, +0x3f,0x83,0x17,0x82,0x3f,0xd9,0x2f,0xae,0xdf,0x7e,0xe0,0x2, 0x1f,0x91,0xe0,0x3, +0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xe0,0x0, 0x1f,0x3d,0xa2,0xe, 0x29,0xb0, +0xa7,0x3f,0xe7,0xfe,0x16,0xff,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7,0x84,0x37,0xc5,0xe2,0x0, +0xc7,0x81,0xe7,0xff,0x27,0xa0,0xa7,0x84,0x17,0x5f,0x3f,0xde,0xbf,0x84,0xe7,0xff, +0x0, 0x9a,0xe0,0x0, 0x1f,0xbd,0xa2,0xf, 0xa7,0x84,0xcf,0xa0,0xbf,0x84,0xdf,0x4b, +0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xa4,0xef, +0x3c,0xc3,0xbc,0xef,0x0, 0xce,0x8, 0xb1,0xe0,0x1, 0x1f,0xdc,0x17,0x0, 0xa6,0x8f, +0xe0,0x2, 0x1f,0x91,0xe0,0x2, 0xbf,0xd, 0x16,0x6f,0xa7,0x8f,0xbf,0x6f,0xa6,0xdf, +0xe0,0x80,0xce,0x80,0xbe,0xdf,0xa6,0xdf,0xe0,0x40,0xce,0x80,0xbe,0xdf,0xa6,0xdf, +0xe0,0x20,0xce,0x80,0xbe,0xdf,0xa6,0xef,0xce,0xc0,0xbe,0xef,0xa6,0xef,0xce,0xa0, +0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0x7f,0x16,0x7f,0xa6,0xef,0xe1,0x0, +0xce,0x80,0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0xbf,0x16,0x7f,0xa6,0xef, +0x3e,0xdc,0xbe,0xef,0xe7,0xdf,0x16,0x7f,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xa6,0xef, +0xe0,0x10,0xce,0x80,0xbe,0xef,0xe0,0x3, 0x1f,0x98,0xb7,0xf, 0xdf,0x4, 0xe0,0x61, +0x3f,0x82,0x17,0x7d,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82,0x17,0x7b, +0x3f,0xde,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0xe0,0x1, 0x1f,0xdc,0xe2,0x0, 0xcc,0x2, +0xa7,0x8f,0xe0,0x0, 0x1, 0x57,0xe2,0x0, 0xcc,0x3, 0x1, 0x36,0xe2,0x0, 0xcc,0x1, +0x1, 0x19,0xa6,0x8f,0xe0,0x2, 0x1f,0x11,0x16,0x7b,0xa7,0xe, 0x3e,0xdc,0xbe,0x8f, +0xe6,0xff,0x16,0x7f,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0x16,0x78,0xa6,0xce,0x3e,0xdc, +0xbe,0xce,0x16,0xf7,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0x16,0x80,0xe0,0x1, 0xbe,0xbf, +0x38,0x82,0xa7,0xf, 0x16,0x77,0x3f,0x5c,0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f, +0x16,0x78,0xa7,0xf, 0xe0,0x2, 0x1e,0x91,0xcf,0x4, 0xa6,0x8d,0xbf,0xf, 0xa7,0x4d, +0xe1,0x0, 0xcf,0x0, 0xbf,0x4d,0xa7,0x4d,0x3f,0x5c,0xcf,0x1, 0xbf,0x4d,0xa7,0x1f, +0xcf,0x8, 0xbf,0x1f,0x38,0x82,0xa7,0xf, 0xe0,0x2, 0x1e,0x91,0x16,0x7b,0x3f,0x5c, +0xa6,0x8d,0xbf,0xf, 0xe6,0xff,0x16,0x7f,0xa7,0x4d,0x3f,0x5c,0xbf,0x4d,0xa7,0xf, +0xcf,0x8, 0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, +0xbf,0x1f,0xa7,0x1f,0xcf,0x10,0xbf,0x1f,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f,0x38,0x82, +0xa6,0x8f,0x16,0x77,0x3e,0xdc,0xbe,0x8f,0x16,0x80,0xe0,0x1, 0xbe,0xbf,0x16,0x78, +0xa6,0x8f,0xe0,0x2, 0x1f,0x11,0xce,0x84,0xa7,0xe, 0xbe,0x8f,0xa6,0xce,0xe1,0x0, +0xce,0x80,0xbe,0xce,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f, +0x38,0x82,0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0xa1,0x8f,0xe0,0x1, 0x1f,0xdc,0xa1,0xf, +0xa7,0xb3,0xcf,0x81,0xbf,0xb3,0xa7,0x83,0xcf,0x88,0xbf,0x83,0xe0,0x1, 0xa7,0x92, +0xcf,0x82,0xe0,0x1, 0xbf,0x92,0xe0,0x1, 0xa7,0x92,0xcf,0x81,0xe0,0x1, 0xbf,0x92, +0xe0,0x3, 0x1f,0x8d,0x8c,0xf, 0xdf,0x71,0xa7,0xd3,0x17,0x7d,0xcf,0x81,0xbf,0xd3, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x7b,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x77, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x6f,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0xe6,0xff, +0x17,0x7f,0xa7,0xd3,0xcf,0xa0,0xbf,0xd3,0xe0,0x1, 0xa7,0xa2,0x3f,0xde,0xe0,0x1, +0xbf,0xa2,0x17,0x78,0xe0,0x1, 0xa7,0xa2,0xe0,0x60,0xcf,0x80,0xe0,0x1, 0xbf,0xa2, +0xe0,0x1, 0xa7,0xa2,0xcf,0x88,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0x3f,0xde, +0xcf,0x85,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x2, 0xcf,0x80,0xe0,0x1, +0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x4, 0xcf,0x80,0xe0,0x1, 0xbf,0xa2,0x9, 0xe1, +0xe0,0x2, 0x1f,0x91,0xe7,0xfd,0x16,0xff,0xa7,0x8f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, +0xbf,0x1f,0xa7,0x1f,0xe0,0x2, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0xe7,0xff,0x16,0xbf,0xa7,0x1f,0xe0,0x4, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0xe0,0x1, +0xcf,0x0, 0xbf,0x2f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x16,0xef,0xa7,0x2f,0x3f,0x5d, +0xbf,0x2f,0x16,0xf7,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0x17,0x1, 0xa7,0x8f,0x3f,0x58,0xe0,0x1, 0xa6,0xaf,0x15,0xf7,0xe0,0xc, 0x37,0x23, +0x3e,0xdb,0x3e,0xcc,0xe0,0x1, 0xbe,0xaf,0xe7,0xfd,0x15,0xff,0xe0,0x1, 0xa6,0xaf, +0xe0,0xc, 0x37,0x28,0x3e,0xdb,0x3e,0xcc,0xe0,0x1, 0xbe,0xaf,0xe7,0xfb,0x16,0xff, +0xe0,0x1, 0xa4,0x2f,0x37,0x29,0x3c,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x2f,0x38,0x82, +0x8, 0xb1,0xe0,0x5, 0xdc,0x73,0x24,0x6, 0xe0,0x2, 0x1f,0x14,0x97,0xce,0xcf,0x82, +0xb7,0xce,0xe0,0x2, 0x1f,0xb3,0x8f,0x8f,0x27,0x82,0x8, 0xe1,0x8, 0xa1,0xe7,0xe0, +0x0, 0x95,0xe0,0x2, 0x1e,0x92,0xe0,0x2, 0x1f,0x14,0x97,0x8d,0xcf,0x81,0xb7,0x8d, +0x97,0xce,0xcf,0x84,0xb7,0xce,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, +0xc7,0x81,0x2f,0x82,0x38,0x82,0x0, 0xdd,0xe0,0x2, 0x1f,0x12,0xe0,0x2, 0x1e,0x94, +0x97,0x8e,0xcf,0x81,0xb7,0x8e,0x97,0x4d,0xe0,0x3, 0x1f,0xb8,0xcf,0x4, 0xa7,0x8f, +0xb7,0x4d,0xa7,0x5f,0xcf,0x8, 0xbf,0x5f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x82, +0x38,0x82,0x0, 0xc7,0xe0,0x61,0x3f,0x82,0xe0,0x61,0x3f,0x2, 0xe7,0xfe,0x16,0xff, +0x3f,0x5d,0xe0,0x61,0x3f,0x12,0xe0,0x3, 0x1f,0x38,0x16,0x7e,0xa7,0xe, 0xe2,0x0, +0xc4,0x1, 0xa6,0xbe,0x15,0xfd,0x3e,0xdc,0x3e,0xc8,0xbe,0xbe,0xe0,0xc, 0x34,0x21, +0xa6,0xbe,0x34,0x2a,0x3e,0xdb,0x3e,0xcc,0xbe,0xbe,0xe7,0xf7,0x16,0x7f,0xa6,0xbe, +0x37,0xc7,0x3e,0xdc,0x3c,0x4d,0xbc,0x3e,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x61, +0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0x8, 0xb1,0xe0,0x1, +0x1f,0xdc,0xe7,0x7f,0x16,0xff,0xa7,0xf, 0xe7,0xfb,0x16,0x7f,0xa7,0x8e,0xe7,0xe0, +0x14,0x80,0x3f,0xdd,0xbf,0x8e,0xf0,0x1a,0x13,0x98,0xe0,0x1, 0xa6,0xee,0xe0,0x3, +0x1f,0xb8,0xe0,0x4, 0xce,0x80,0xe0,0x1, 0xbe,0xee,0xe0,0x1a,0x15,0x19,0xe0,0x1, +0xa6,0xee,0xa7,0x8f,0x3e,0xdc,0xe0,0x1, 0xbe,0xee,0x16,0x81,0xbe,0xdf,0xe7,0xf8, +0x16,0x0, 0xa6,0xef,0x17,0x0, 0xe3,0xfe,0xc6,0x9f,0xbe,0xef,0xe7,0x80,0x14,0x0, +0xa6,0xef,0xe0,0x1, 0x1d,0xc2,0xbe,0xef,0xf0,0x17,0x3b,0x9b,0xe0,0x1, 0xa6,0xdf, +0x3d,0x1b,0xe3,0xff,0xc6,0x80,0xe0,0x1, 0xbe,0xdf,0xe0,0x1, 0xa6,0xdf,0xe0,0x1, +0xbe,0xdf,0xe0,0x3, 0x16,0xe0,0xe0,0x1, 0xbe,0xef,0xe0,0x1, 0xa6,0xff,0x3e,0xdc, +0xe0,0x1, 0xbe,0xff,0xe7,0xf0,0x16,0x0, 0xe0,0x2, 0xa6,0x8f,0x3e,0xd9,0xe0,0x2, +0xbe,0x8f,0xe0,0x2, 0xa6,0x9f,0x3e,0xd9,0xe0,0x2, 0xbe,0x9f,0xe0,0x17,0x16,0xb8, +0xe0,0x4, 0xb6,0xdf,0xe0,0x2, 0xa6,0xcf,0x3e,0xdc,0xe0,0x2, 0xbe,0xcf,0xe0,0x9, +0x16,0x88,0xe0,0x2, 0xbe,0xbf,0xe0,0x12,0x16,0xdc,0xe0,0x2, 0xbe,0xdf,0xe1,0x20, +0x16,0x80,0xe0,0x2, 0xbf,0x6f,0xe0,0x2, 0xbe,0xff,0xe0,0x3, 0xa5,0xef,0x3d,0xd8, +0xcd,0xe4,0xe0,0x3, 0xbd,0xef,0xe0,0x3, 0xa6,0x7f,0x3e,0x58,0xce,0x64,0xe0,0x3, +0xbe,0x7f,0xe0,0x4, 0xa6,0x8f,0x3e,0xd9,0xe0,0x7, 0xce,0xe8,0xe0,0x4, 0xbe,0x8f, +0xe1,0xff,0x16,0xff,0xe0,0x4, 0xbf,0x1f,0xbe,0x9f,0xe1,0x39,0x16,0x83,0xbf,0x3f, +0xbe,0xbf,0xe0,0x2, 0x1e,0x92,0xb7,0xd, 0xa6,0xbf,0xbe,0xaf,0xe0,0x3, 0x1f,0x9d, +0xe8,0x0, 0x86,0x87,0xb7,0xf, 0xe0,0x2, 0x1f,0xba,0x87,0xa, 0xae,0x8f,0xe0,0x3, +0x1f,0xc3,0xaf,0xf, 0xef,0xfe,0xda,0x2f,0xe0,0x5, 0xda,0x42,0xe0,0x61,0x3f,0x82, +0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0x8, 0xb1,0xf0,0x3, 0x18,0xb8, +0xe7,0xbf,0x16,0x7f,0xe8,0x0, 0xa7,0x1, 0xe0,0x2, 0x1e,0xfd,0xe0,0x1, 0xa7,0xee, +0xf0,0x3, 0x19,0xcf,0x3f,0xdc,0xe0,0x1, 0xbf,0xee,0xfa,0xd7,0xca,0xa8,0xe0,0x2, +0x1f,0xe6,0xe0,0x1, 0x9d,0x2d,0x85,0x8f,0xe0,0x1, 0x1f,0xc2,0xe0,0x1, 0x9e,0x1d, +0xf0,0x10,0x89,0x7f,0xe0,0x0, 0x1f,0xc4,0xe0,0x3, 0x1e,0xd0,0xe4,0xa, 0x35,0x20, +0xe4,0xc, 0x36,0x20,0xa7,0x8f,0xf0,0x3, 0x1b,0xd1,0xe0,0x3, 0x1c,0x52,0xe0,0x3, +0x1c,0xd3,0xe0,0x3, 0x18,0xd4,0xf0,0x3, 0x18,0x55,0xf0,0x3, 0x1a,0x56,0x17,0x0, +0xe2,0x0, 0xc5,0x81,0x3d,0x4d,0x3e,0x4d,0xf0,0xa9,0x13,0x15,0xe8,0x40,0x3d,0xf2, +0xf0,0x0, 0xb9,0x8f,0x1, 0x24,0xbe,0x1f,0x16,0xfd,0x3e,0x9e,0xe2,0x1, 0xc6,0xff, +0xf0,0x0, 0xba,0xaf,0xe2,0x0, 0xce,0x81,0xf0,0x0, 0xbb,0x3f,0x5, 0x9a,0xbc,0x4f, +0xbc,0xdf,0xf0,0x0, 0xbb,0xef,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x5, +0xf0,0x0, 0xba,0x7f,0xe0,0x7, 0xc7,0xb0,0x1, 0xe2,0xe8,0x0, 0xa7,0x1, 0xe0,0x1, +0xa7,0xee,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xee,0x8, 0xe1,0xbd,0x1f,0x0, 0xdd, +0xb8,0xcf,0xe2,0x0, 0xcf,0x4, 0xf0,0x0, 0xb8,0x5f,0xf0,0x0, 0xbb,0xef,0x1, 0xe4, +0xe0,0x3, 0x1f,0x57,0xbf,0x7f,0x0, 0xea,0x8, 0xb2,0xe0,0x2, 0x19,0x3d,0x8f,0x82, +0x27,0x8d,0xe0,0x0, 0x14,0xda,0x14,0x11,0xe0,0x5, 0xdb,0x3a,0xe0,0x0, 0x14,0xda, +0x14,0x29,0xe0,0x5, 0xdb,0x35,0x17,0x80,0xaf,0x82,0x9, 0x61,0xe0,0x2, 0x1f,0xec, +0x17,0x0, 0xb7,0xf, 0xe0,0x2, 0x1f,0x99,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x19, +0x87,0x8e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xcf,0xc8,0x5, 0x82,0x17,0xc8, +0xaf,0x8e,0x38,0x82,0xe0,0x0, 0x1f,0xcd,0x14,0x1, 0x8f,0x8f,0x2f,0x89,0xe0,0x2, +0x1f,0x99,0x8c,0xf, 0xe0,0x3, 0x1f,0x92,0x8f,0x8f,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0x8, 0xb1,0x3c,0x98,0x34,0xa4,0xe1,0x77,0x14,0x0, 0xe0,0x6, 0xd1,0x49,0xe3,0xff, +0xc4,0x7f,0x8, 0xe1,0xea,0x0, 0xcc,0x2, 0xe0,0x48,0xcc,0x0, 0x14,0x80,0xea,0x0, +0xcd,0x3, 0xe0,0x22,0xcd,0x7c,0x3d,0x28,0xe0,0x6, 0xd1,0xd6,0xea,0x0, 0xcc,0x0, +0xe0,0x0, 0xcc,0x0, 0x24,0x2, 0x3c,0x1, 0x14,0x0, 0x14,0x80,0xef,0xfe,0xd4,0x70, +0x3a,0x80,0x0, 0x0, 0x3a,0x80,0xe0,0x3, 0x1f,0xc3,0xe0,0x1, 0x17,0x7d,0x8f,0x8f, +0x3f,0x58,0xe2,0x0, 0xcf,0x80,0x3c,0x6f,0x17,0x80,0xe1,0x2f,0x3f,0xf, 0xe0,0x68, +0x39,0xaf,0x38,0x82,0x8, 0xb3,0xe0,0x3, 0x19,0xb0,0x11,0x0, 0x8c,0x33,0x3c,0xe2, +0xc1,0x1, 0xef,0xfe,0xd6,0x58,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, 0xc9,0x3, 0xc1,0x85, +0x1, 0xf6,0x14,0x81,0x3c,0x62,0xef,0xfe,0xd6,0x4e,0x14,0x81,0x14,0x4, 0xef,0xfe, +0xd6,0x4a,0xe0,0x2, 0x1f,0xc8,0x8c,0x8f,0x24,0x82,0x14,0x81,0x14,0x0, 0x9, 0xa1, +0xe7,0xcc,0x0, 0xc1,0x8, 0xb1,0xdf,0xa, 0xef,0xfe,0xd5,0xaf,0x8, 0xa1,0x0, 0xdb, +0x8, 0xb2,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x19,0x4d,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, +0xc7,0x81,0x2f,0x95,0xe0,0x2, 0x1f,0x48,0xaf,0x82,0x3c,0xef,0xaf,0x8e,0x3c,0x6f, +0xe0,0x1, 0x1f,0x4c,0xaf,0x8e,0xe0,0x3, 0x1f,0x2, 0xaf,0x8e,0xef,0xfe,0xd6,0x23, +0xef,0xfe,0xd8,0xc4,0x8c,0x2, 0x9, 0x21,0xe7,0xd7,0x0, 0xf2,0x17,0x81,0xe0,0x2, +0x1f,0x48,0xe0,0x2, 0x1c,0x68,0xaf,0x82,0xaf,0x8e,0xe0,0x2, 0xd6,0x8f,0xe0,0x1, +0x1f,0xcc,0xe0,0x3, 0x1f,0x1e,0xac,0xf, 0x87,0x8f,0xaf,0x8e,0xe0,0x2, 0xd5,0x3b, +0x14,0x81,0x14,0x0, 0xef,0xfe,0xd6,0x7, 0x0, 0xe4,0x8, 0xb3,0x14,0x0, 0xde,0x3, +0xe0,0x2, 0x1f,0x92,0x14,0x1, 0x91,0x8f,0x99,0xf, 0x39,0xd8,0x31,0x58,0x39,0x58, +0xdd,0xfa,0xe0,0x8, 0x39,0xc2,0x9, 0xe1,0x8, 0xb2,0xe0,0x2, 0xd6,0xac,0xdf,0x2d, +0x14,0x0, 0xdd,0xf1,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0x8b,0x97,0x8e,0xe0,0x2, 0x1e,0x94,0xe3,0xff,0xc7,0xfd,0xb7,0x8e,0x97,0xcd, +0xe3,0xff,0xc7,0xf7,0xb7,0xcd,0x97,0x8e,0xe0,0x2, 0x19,0x77,0xe2,0x0, 0xc7,0x81, +0x2f,0x97,0x14,0x1, 0xdd,0xd8,0xe0,0x2, 0x1f,0x48,0x8f,0x82,0x8e,0x8e,0x37,0xdd, +0xe2,0x0, 0xc7,0x81,0x2f,0x89,0xe0,0x2, 0x1f,0xfb,0x8f,0x8f,0x8f,0xe, 0x37,0xde, +0xe2,0x0, 0xc7,0x81,0x27,0x84,0x9, 0x21,0xe7,0xed,0x0, 0x8c,0x9, 0x61,0x97,0x8e, +0xe0,0x2, 0x1e,0x94,0xe3,0xff,0xc7,0xfe,0xb7,0x8e,0x97,0xcd,0xe3,0xff,0xc7,0xfb, +0xb7,0xcd,0xdf,0x7f,0xef,0xfd,0xdd,0xa6,0x14,0x1, 0xe0,0x1, 0xd8,0x9b,0xe0,0x2, +0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xaf,0x82,0x0, 0xd5,0xe0,0x1, 0x1f,0xe8,0xe0,0x3, +0x1f,0x4, 0x8f,0x8f,0xe0,0x1, 0x8e,0xce,0xe2,0x0, 0xcf,0x85,0x2, 0x8c,0x26,0x9c, +0xe0,0x2, 0x1e,0x21,0xe0,0x1, 0x8d,0x9e,0x3f,0x9c,0x8e,0xf, 0x3d,0xfc,0x5, 0xb6, +0xc6,0x1, 0xae,0xf, 0xe2,0x0, 0xce,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0xb4,0x16,0x80, +0xae,0x8f,0xe0,0x1, 0x8f,0xee,0xe2,0x0, 0xcf,0x81,0xeb,0xe5,0x7f,0xeb,0x1, 0x9, +0x17,0x1, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x21,0x3f,0x9c,0xae,0x8f,0x0, 0xee, +0x8e,0x8f,0xe0,0x1, 0x8e,0xe, 0x3e,0x7d,0x5, 0xf4,0xc6,0x81,0x16,0x0, 0xe0,0x1, +0xae,0x6e,0xae,0x8f,0x38,0x82,0xe0,0x2, 0x1e,0x34,0xe0,0x1, 0x8e,0x9e,0x8f,0x8c, +0x15,0x80,0x3e,0xff,0xe0,0x1, 0xad,0xee,0x5, 0x8c,0x16,0x81,0x3e,0x9f,0xeb,0xe5, +0x7f,0xeb,0xe0,0x1, 0xad,0xce,0xae,0x8c,0x0, 0xdc,0x16,0x80,0xae,0x8f,0x0, 0xd2, +0xeb,0xe5,0x7f,0xeb,0xad,0x8c,0x0, 0xd5,0x8, 0xb5,0xe0,0x3, 0x19,0x4, 0x17,0x1, +0x9f,0xd2,0xe0,0x1, 0xaf,0x62,0xe0,0x43,0x3f,0x1f,0xe2,0x0, 0xcf,0x0, 0xe0,0x1, +0x4, 0x4a,0xe0,0x2, 0x1f,0x5d,0x8f,0xe, 0x27,0x4, 0x17,0x0, 0xe0,0x1, 0xaf,0x62, +0xe2,0x0, 0xc7,0xa0,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0x19,0xe9, +0x8f,0x83,0x2f,0x83,0xe0,0x1, 0xaf,0xe2,0xe0,0x2, 0x1a,0x48,0xe0,0x2, 0x1a,0xc0, +0x8c,0x4, 0xde,0xca,0x24,0x7, 0xe0,0x4, 0x8f,0xd5,0xe2,0x0, 0xcf,0x81,0xe0,0x1, +0x1, 0x1e,0x9f,0x52,0x17,0x80,0xe0,0x80,0x16,0x80,0xe0,0x1, 0xaf,0xc2,0x3e,0xde, +0xe0,0x1, 0xaf,0xd2,0x26,0x84,0x17,0x81,0xe0,0x1, 0xaf,0xc2,0xe0,0x4, 0x17,0x80, +0x3f,0xde,0x2f,0x83,0xe0,0x1, 0xaf,0xc2,0xe0,0x1, 0x1f,0xc7,0x9f,0x8f,0xe2,0x4, +0xcf,0xd8,0xe0,0x2, 0x1f,0xfe,0xe0,0x0, 0x5, 0xe5,0x16,0x8f,0xae,0x8f,0x8e,0x84, +0xe2,0x0, 0xce,0x81,0xe0,0x0, 0x1, 0x68,0x16,0x80,0xae,0x8f,0x17,0xa0,0x3f,0xde, +0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xc2,0x8f,0x83,0x2f,0x83,0xe0,0x1, 0xaf,0xc2, +0xe0,0x1, 0x17,0x80,0x3f,0xde,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xc2,0x11,0x84, +0xe0,0x1, 0x1f,0xd7,0x96,0xbf,0xe0,0x0, 0x1f,0x8d,0xe0,0x1b,0x96,0x1f,0xe0,0xf, +0x36,0xa1,0x3e,0x7f,0x4, 0x5, 0x3e,0x7d,0x11,0x83,0xe0,0x0, 0x3, 0x4e,0xe2,0x2, +0xc7,0x0, 0xe2,0x0, 0xcf,0x0, 0x17,0x84,0xe0,0x6f,0x39,0x23,0x39,0xef,0xe0,0x1, +0xda,0x3d,0xe0,0x1, 0x1f,0x91,0xe2,0x0, 0xcc,0x0, 0x8f,0xf, 0xe0,0x1, 0x1f,0x90, +0x37,0x28,0x8f,0x8f,0x16,0x81,0xe0,0x6d,0x39,0x23,0x3f,0xce,0xe0,0x1, 0x1f,0xf, +0x3f,0xbd,0xe0,0x0, 0x1e,0x8e,0x8f,0xe, 0xe0,0x43,0x3f,0x9f,0x8e,0x8d,0xb7,0xb2, +0xe0,0x1, 0xaf,0x2, 0x26,0x8a,0x96,0xd2,0xe2,0x0, 0xce,0x80,0x4, 0x6, 0xe2,0x0, +0xcf,0x81,0x5, 0x3d,0x37,0x81,0xb7,0xb2,0xe0,0x4, 0x8f,0xd5,0xe2,0x0, 0xcf,0x81, +0x1, 0x85,0x97,0xb2,0xe4,0x0, 0xc7,0x85,0xb7,0xb2,0xa, 0xa1,0xe7,0xfe,0x0, 0x87, +0x8e,0x8f,0xe7,0xff,0x26,0x9e,0xc6,0xff,0xae,0x8f,0x8e,0x84,0xe2,0x0, 0xce,0x81, +0xe7,0xff,0x1, 0x9c,0x16,0xa0,0x3e,0xde,0xe7,0xff,0x2e,0x9d,0x8f,0x8f,0xe7,0xff, +0x2f,0x9a,0xe7,0xff,0x0, 0x9b,0xe4,0xf, 0x36,0xcf,0x3f,0x9d,0x37,0x81,0xe0,0x2f, +0x3f,0x9c,0x11,0x81,0x39,0x9f,0xe7,0xff,0x0, 0xac,0xe0,0x3, 0x1f,0xc6,0x8f,0x8f, +0xe2,0x0, 0xcf,0xb8,0xe7,0xfe,0x2, 0xdf,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe7,0xfe, +0x0, 0xda,0x17,0x0, 0xe0,0x1, 0xaf,0x62,0xe7,0xfe,0x0, 0xb5,0x37,0x21,0xe0,0x1, +0xaf,0x2, 0x0, 0xc3,0xe0,0x2, 0x1e,0xa1,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xaf,0x1f, +0xc7,0x81,0xaf,0x1d,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xaf,0xf, 0x38,0x82,0x8, 0xb2,0xc0,0x7c,0xe0,0x1, 0xd1,0x1a,0xdf,0xe, 0xdd,0xcb, +0xe0,0x2, 0x1f,0x8f,0x2c,0x10,0x8f,0xf, 0xe0,0x3, 0x19,0x4, 0xe2,0x0, 0xcf,0x1, +0xe0,0x1, 0xac,0x42,0x1, 0x25,0xdd,0xbf,0x24,0x11,0xe0,0x1, 0x8f,0xe2,0x2f,0x9b, +0xc0,0x4, 0x9, 0x61,0x8f,0xf, 0xe0,0x3, 0x19,0x4, 0xe2,0x0, 0xcf,0x1, 0x1, 0x18, +0xe0,0x1, 0x8f,0xc2,0x2f,0x9a,0xdd,0xaf,0x2c,0x71,0x7c,0x1, 0xef,0xfc,0xd2,0x25, +0xe0,0x0, 0x1f,0x8e,0x64,0x1, 0xac,0xf, 0xe0,0x0, 0x1f,0x8c,0xac,0xf, 0xe0,0x1, +0x8f,0xe2,0x27,0xe7,0x14,0x0, 0xc0,0x4, 0x9, 0x21,0xe7,0x81,0x0, 0xa3,0x17,0x1, +0x16,0x0, 0xe0,0x1, 0xaf,0x42,0xae,0xf, 0x17,0x80,0xe0,0x2, 0x1e,0xa1,0xe0,0x2, +0x1f,0x20,0xaf,0x8d,0x16,0x7, 0xaf,0x9d,0xe0,0x2, 0x1e,0xf7,0xaf,0x8e,0xae,0xd, +0xe0,0x2, 0x1f,0x1f,0xe0,0x2, 0x1e,0xb4,0xaf,0x8e,0xaf,0x8d,0x0, 0xc5,0x0, 0x0, +0xe0,0x0, 0x1f,0x85,0x8f,0xf, 0xe0,0x0, 0x1f,0x8d,0xe0,0x0, 0x27,0x60,0xe0,0x0, +0x1f,0xe, 0x8e,0xe, 0xe2,0x0, 0xce,0x2, 0x1, 0x8, 0x17,0xa, 0x3f,0x38,0x3f,0x9e, +0xf0,0x10,0x8b,0xaf,0x5, 0xb4,0x38,0x82,0x8e,0xbf,0xf0,0x0, 0x8b,0x9f,0xf0,0x0, +0x8b,0xf, 0xf0,0xe, 0x3b,0xad,0x8d,0xaf,0xe2,0x0, 0xcf,0x0, 0xe8,0x17,0x3e,0xa7, +0xf2,0x1, 0xc3,0xff,0xf0,0xd, 0x3b,0x2b,0xe2,0x1, 0xc7,0x7f,0xe8,0x6e,0x3d,0x27, +0xe8,0xb, 0x3d,0xa6,0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc5,0xff,0xe2,0x1, 0xc6,0xff, +0xe0,0x6d,0x3d,0x2b,0xf0,0x40,0x3b,0xee,0x3d,0xed,0xf2,0x1, 0xc3,0xff,0xe2,0x1, +0xc5,0xff,0xf0,0x40,0x3b,0xfb,0x3, 0x82,0x3f,0x6d,0x15,0x8a,0x3d,0xb8,0x3e,0xee, +0xe0,0xf, 0x3f,0x9b,0xf0,0x10,0x8b,0xaf,0xe2,0x1, 0xc6,0xff,0xf2,0x0, 0xcb,0x94, +0x2, 0x99,0xf2,0x0, 0xcb,0x8a,0x2, 0xad,0xea,0x12,0x7f,0x4, 0xe0,0xf, 0x3f,0x18, +0x8d,0x89,0xf0,0x0, 0x8b,0xf, 0xe8,0x40,0x3d,0xf6,0x3, 0x86,0xf0,0x0, 0xab,0x9, +0x8f,0x8f,0xaf,0x8a,0x8d,0x89,0xe2,0x0, 0xce,0x2, 0x1, 0x1f,0x3f,0x18,0xad,0x8e, +0x38,0x82,0x17,0x85,0xaf,0x89,0xaf,0x8a,0x0, 0xe8,0xea,0x12,0x7e,0x84,0x3f,0xed, +0xe1,0x80,0xbf,0x1f,0xc7,0x84,0xbf,0x1d,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f, +0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xb7,0xf, 0x38,0x82, +0x17,0x84,0xaf,0x89,0xaf,0x8a,0x0, 0xd1,0xe0,0xf, 0x36,0xc1,0xe2,0x1, 0xc7,0xff, +0x3f,0xfb,0x3, 0x8d,0xf2,0x0, 0xcb,0x95,0x16,0x83,0xe0,0x6d,0x3c,0xac,0x3e,0xff, +0xe0,0x6f,0x3b,0xad,0x3d,0xef,0xe2,0x1, 0xc5,0xff,0xad,0x89,0xad,0x8a,0x8d,0x89, +0x0, 0xce,0x0, 0x0, 0x8, 0xb3,0x39,0x68,0xe0,0x1, 0x1c,0x67,0x39,0xe9,0xe0,0xc, +0x15,0x52,0x14,0x80,0xe0,0x5, 0xde,0xe0,0xe0,0x2, 0x1f,0xfd,0x16,0x7a,0x8c,0x5f, +0x3e,0x12,0xf0,0x2c,0x13,0x99,0xe0,0xe, 0x3e,0x38,0xf0,0x17,0x3b,0x93,0xf0,0x17, +0x3b,0x9e,0x8c,0xcf,0xe0,0x1, 0x1f,0xff,0xf0,0x17,0x33,0xa1,0xf0,0x0, 0x12,0x87, +0x15,0xd, 0xf0,0x1, 0x1b,0x4a,0xe0,0x14,0x34,0x21,0xf0,0x17,0x3b,0x9f,0xf0,0x15, +0x3a,0x92,0xe0,0xa, 0x3d,0x13,0x3f,0xe3,0xe8,0x40,0x3e,0xe7,0xe8,0x40,0x3f,0x66, +0xe2,0x0, 0xce,0x0, 0x4, 0xc, 0x3c,0xfc,0x15,0xfa,0x3d,0x9f,0x5, 0x8, 0xe2,0x0, +0xcd,0x80,0x4, 0x5, 0x3c,0x7b,0x5, 0x3, 0x95,0x8e,0xb5,0x8d,0xc7,0x81,0x3f,0xfa, +0xc7,0x2, 0xc6,0x82,0x1, 0xee,0xc6,0x1, 0xe8,0x40,0x3e,0x75,0xf0,0x0, 0xc3,0x1a, +0xf8,0x17,0x3b,0x94,0x1, 0xe1,0x9, 0xe1,0xe0,0x0, 0x1f,0xe, 0xf0,0x2, 0x1a,0x1c, +0x17,0x80,0xf0,0x0, 0x89,0x8e,0xe8,0x7, 0xaf,0xc4,0xe8,0xf, 0xaf,0x94,0xe8,0x16, +0xaf,0xe4,0xe8,0x1e,0xaf,0xb4,0xf0,0x1, 0x21,0xb9,0x8, 0xb7,0x11,0x0, 0xe4,0x8, +0x34,0x29,0xe4,0x9, 0x34,0xa9,0xf0,0x0, 0x1b,0xd, 0xe4,0x8, 0x34,0x48,0xe4,0x9, +0x34,0xc8,0xf0,0x40,0x39,0x62,0x3a,0x62,0xf0,0x40,0x38,0xe2,0x3a,0xe2,0xf0,0x40, +0x38,0x62,0x39,0xe2,0x38,0xe2,0x3e,0xe2,0x3d,0x7d,0xe0,0x1, 0x1, 0xd, 0xe8,0x0, +0x8f,0x6, 0xe8,0x0, 0x8f,0x96,0xe4,0xe, 0x37,0x29,0xe4,0xf, 0x37,0xa9,0xe4,0xe, +0x37,0x48,0xe4,0xf, 0x37,0xc8,0xe0,0xb, 0x3f,0x18,0xe0,0xc, 0x3f,0x99,0xe4,0xb, +0x35,0xa7,0xe4,0xc, 0x36,0x27,0xe1,0x37,0x3c,0x2e,0xe4,0xb, 0x35,0xc8,0xe4,0xc, +0x36,0x48,0xe1,0x35,0x3c,0xaf,0xf0,0x0, 0x23,0x94,0xf0,0x0, 0x22,0x92,0xe1,0x26, +0x3c,0x2b,0xe1,0x27,0x3c,0xac,0x3b,0x57,0x23,0xb, 0xe0,0x3, 0x30,0xa1,0xe8,0x3, +0x39,0x94,0xc0,0x81,0xad,0x83,0xe2,0x1, 0xc0,0xff,0xae,0x13,0x39,0xe6,0xe1,0x2e, +0x3f,0x28,0xf0,0x0, 0x22,0x9e,0x27,0x1c,0xe1,0x35,0x3d,0xa8,0xe1,0x26,0x3c,0xac, +0xf0,0x15,0x3a,0xd6,0xf0,0x0, 0x22,0x95,0x12,0xbc,0xe8,0x5, 0x3a,0x90,0x32,0xa1, +0xf0,0x6, 0x30,0x21,0xe8,0x5, 0x3a,0x94,0xad,0xa5,0xf0,0x0, 0xc0,0x1, 0xf0,0x5, +0x3a,0x16,0xe0,0xf, 0xae,0x35,0xf2,0x1, 0xc0,0x7f,0xe8,0x40,0x3a,0xe5,0xe1,0x2f, +0x3f,0xa9,0xf0,0x0, 0x23,0x9e,0x27,0x9c,0xe1,0x37,0x3c,0x2b,0xe1,0x26,0x3e,0x29, +0xf0,0x17,0x3b,0xd6,0xf0,0x0, 0x23,0x95,0x12,0x1e,0xe8,0x4, 0x3a,0x11,0x32,0x21, +0xf0,0x6, 0x30,0xa1,0xe8,0x4, 0x3a,0x14,0xad,0x94,0xf0,0x0, 0xc0,0x81,0xf0,0x4, +0x3a,0x16,0xe0,0x7, 0xae,0x64,0xf2,0x1, 0xc0,0xff,0xe8,0x40,0x3a,0x67,0x27,0x1b, +0x27,0x9a,0xe1,0x2f,0x3d,0xa8,0xe1,0x2e,0x3e,0x29,0x3f,0xde,0x27,0x94,0xe0,0x0, +0x17,0x5a,0xe8,0xe, 0x3f,0x12,0x37,0x21,0xf0,0x2, 0x31,0x21,0xe8,0xe, 0x3f,0x14, +0xad,0xbe,0xf0,0x0, 0xc1,0x1, 0xf0,0xe, 0x3a,0x12,0xe0,0x17,0xae,0xe, 0xf2,0x1, +0xc1,0x7f,0x39,0x6f,0xc6,0x81,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf3,0xf0,0x0, +0xc3,0x2, 0xe7,0xfe,0x1, 0xeb,0x29,0x8a,0x22,0x83,0xf8,0x16,0xa8,0x64,0x22,0x3, +0xf8,0xf, 0xa8,0x94,0x29,0x6, 0xb, 0xe1,0x38,0x82,0xe8,0x7, 0xa8,0xc4,0x0, 0xf5, +0xf8,0x1e,0xa9,0x34,0xb, 0xe1,0x2c,0x2a,0x3f,0xe9,0x24,0x95,0x3f,0xe8,0x17,0xd, +0x3f,0x38,0x3f,0x19,0xe0,0xd, 0x37,0x21,0x3e,0x9b,0xe0,0x40,0x96,0x9d,0x3f,0x1a, +0xe2,0x0, 0xce,0x80,0xe0,0x0, 0x5, 0x47,0x16,0x81,0xe0,0x40,0xae,0x9e,0xe2,0x0, +0xcc,0xb, 0x2, 0x90,0x17,0x1, 0x3f,0x1f,0xe4,0x0, 0xc7,0xd, 0x3f,0x19,0xe0,0xd, +0x37,0x21,0x3e,0x9b,0x96,0x8d,0x3f,0x1a,0xe2,0x0, 0xce,0x80,0x5, 0x2d,0x16,0x81, +0xae,0x8e,0xe2,0x0, 0xcc,0x8b,0x5, 0x96,0x38,0x82,0x17,0x7f,0x3f,0x18,0xe4,0x0, +0xc7,0xd, 0x3f,0xe8,0x3f,0x19,0xe0,0xd, 0x37,0x21,0x3e,0x9b,0x96,0x8d,0x3f,0x1a, +0xe2,0x0, 0xce,0x80,0x5, 0x1c,0x16,0x81,0xae,0x8e,0x2c,0xca,0xe2,0x0, 0xcc,0xb, +0x5, 0xda,0xe4,0x0, 0xc7,0x8d,0x3f,0x99,0xc7,0x81,0xe0,0xe, 0x37,0xa1,0x3d,0x9e, +0x97,0xb, 0x3f,0x9a,0xe2,0x0, 0xcf,0x0, 0x5, 0x4, 0x17,0x1, 0xaf,0xf, 0x38,0x82, +0x17,0x2, 0xaf,0xf, 0x38,0x82,0x16,0x82,0xae,0x8e,0x0, 0xd4,0x16,0x82,0xae,0x8e, +0x0, 0xe5,0x16,0x82,0xe0,0x40,0xae,0x9e,0xe7,0xff,0x0, 0xbb,0x8, 0xb7,0xe1,0xfc, +0xc0,0x0, 0xe0,0x2, 0x1f,0xdd,0x17,0x1, 0x8f,0x8f,0xe0,0x2f,0x3f,0x8e,0xe0,0x1, +0x27,0x83,0x17,0x94,0xe1,0x28,0x3c,0x1f,0xe0,0x0, 0x24,0x7e,0xe0,0x1, 0x1f,0xca, +0x16,0x0, 0xe0,0xa, 0x97,0xcf,0xe2,0x7, 0xcf,0xe8,0xe0,0x0, 0x5, 0x79,0xe0,0x1, +0x1a,0x49,0x11,0x0, 0xe0,0x1, 0x1d,0xc8,0x39,0xe4,0x3c,0xe2,0x17,0xe6,0x3f,0x93, +0xe0,0x80,0x97,0x1f,0x16,0x81,0x3e,0x7e,0x3e,0x99,0x3, 0x5, 0x3c,0xed,0x39,0x1e, +0xe3,0xff,0xc4,0xff,0x3f,0xf3,0x1, 0xf5,0xc1,0x9a,0x39,0xfb,0x1, 0xf0,0x24,0x85, +0x3c,0x62,0xe0,0x5, 0xdc,0xe8,0x39,0x68,0xe0,0x2, 0x15,0x52,0x14,0x80,0xe2,0x1, +0x7c,0x30,0xe0,0x5, 0xdd,0x39,0xe2,0x1, 0x7d,0xb0,0x15,0x0, 0x17,0x66,0x3f,0x14, +0x3e,0x6b,0x0, 0x85,0xb7,0x8c,0x3f,0x74,0xc6,0x2, 0x1, 0x11,0xe0,0x80,0x96,0x9e, +0xe2,0x0, 0xce,0x80,0xe0,0xf, 0x3e,0xa2,0xe0,0x43,0x3f,0x9f,0x5, 0x75,0xe2,0x0, +0xcf,0x80,0x3, 0x71,0x3f,0x74,0xb5,0xc, 0xc6,0x2, 0x1, 0xf1,0x12,0x1a,0x3a,0x1e, +0x3a,0x73,0xc5,0x9a,0x1, 0xe4,0x13,0x4, 0x3b,0x10,0x14,0x80,0xe0,0x1, 0x15,0x29, +0x3c,0x66,0xe0,0x5, 0xdd,0x11,0x17,0x81,0x14,0x86,0xe0,0x0, 0x12,0xd7,0xe0,0xa, +0xaf,0xc6,0x3a,0x90,0x17,0x81,0x3b,0xe9,0x3a,0x69,0xe7,0xff,0x11,0xb3,0xe2,0x1, +0xc2,0x7f,0x39,0x95,0x39,0x67,0x0, 0x83,0xe0,0x9, 0x8f,0xe3,0xe2,0x0, 0xcf,0x81, +0xc1,0xf3,0x1, 0x19,0xc1,0x7f,0xe0,0x43,0x39,0x2, 0xe3,0xff,0xc9,0x7f,0x1, 0xf5, +0x14,0xff,0x3c,0x94,0xe0,0x43,0x3c,0x89,0xe3,0xff,0xcc,0xff,0x1, 0x15,0xe1,0xc0, +0x8f,0x95,0x0, 0xe3,0xe0,0x1, 0x1f,0xca,0xe0,0xa, 0x97,0xcf,0xe0,0xc, 0x37,0x82, +0xe7,0xff,0x0, 0x87,0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0x3d,0x66, +0x3c,0xe4,0xdf,0xa, 0x0, 0xe0,0x12,0x8a,0x3a,0x90,0x14,0x86,0x13,0x7, 0x3a,0x69, +0xe2,0x1, 0xc2,0x7f,0x39,0x65,0x39,0xe6,0xe0,0xb, 0x8f,0xb2,0xc1,0xd, 0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x1, 0xa, 0x17,0x81,0x3f,0x93,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xe0,0x43,0x39,0x8f,0x1, 0xf1,0x14,0xff,0x3c,0x94,0xe0,0x43,0x3c,0x89, +0xe3,0xff,0xcc,0xff,0xc2,0xff,0x1, 0xe4,0x12,0x8b,0x3a,0x90,0x3b,0x65,0x12,0x7, +0xe0,0x0, 0x13,0x86,0xe2,0x1, 0xc2,0x7f,0x39,0xe6,0x39,0x67,0xe0,0x9, 0x8f,0xe3, +0xc1,0xf3,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x5d,0xc1,0x7f,0xe0,0x43,0x39,0x2, +0xe3,0xff,0xc9,0x7f,0x1, 0xf4,0x17,0x81,0x3f,0x94,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xc3,0x1, 0xe0,0x43,0x3a,0xf, 0x1, 0xe6,0x12,0x7, 0xe0,0x40,0x3b,0x64, +0xe2,0x1, 0xc2,0x7f,0x39,0x65,0x39,0xe6,0xe0,0xb, 0x8f,0xb2,0xc1,0xd, 0xe2,0x0, +0xcf,0x81,0xe0,0x1, 0x1, 0x55,0x17,0x81,0x3f,0x93,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xe0,0x43,0x39,0x8f,0x1, 0xf1,0x17,0x81,0x3f,0x94,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x8d,0xc2,0x81,0xe0,0x43,0x3a,0xf, 0x1, 0xe3,0x15,0x0, 0x14,0x11, +0x3c,0x10,0x39,0x6a,0x14,0x82,0x12,0x82,0x12,0x1, 0x39,0xea,0x17,0x72,0x3f,0x18, +0x3e,0xe8,0x3d,0xe2,0x8e,0x1e,0xe0,0x0, 0x2e,0x56,0xe0,0x1, 0x25,0x47,0xe0,0x43, +0x8f,0xad,0xe2,0x0, 0xcf,0x82,0xe0,0x0, 0x1, 0x6a,0xe0,0x0, 0x25,0xda,0x8f,0x8e, +0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x0, 0xe2,0x0, 0xcd,0xc, 0xe0,0x1, 0x1, 0x5d, +0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x46,0xe2,0x0, 0xcd,0x8c,0xe0,0x1, +0x1, 0xd8,0x17,0x81,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8d,0xc4,0xd, +0xe0,0x43,0x3d,0xf, 0x1, 0xd4,0x16,0x10,0xe0,0x1, 0x15,0x39,0xe0,0x1, 0x1d,0xca, +0x3e,0x10,0x3d,0x10,0x17,0xf3,0x3f,0x9c,0xe0,0x40,0x3f,0x6b,0xe0,0x80,0x8e,0x9f, +0x2e,0x82,0xb6,0x8e,0x3f,0xfc,0xc7,0x2, 0x1, 0xfa,0x16,0xd, 0x3e,0x1f,0x3d,0x7c, +0xc5,0x9a,0x1, 0xf1,0xe0,0x4, 0xc0,0x0, 0xb, 0xe1,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, +0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x0, 0x1, 0x41,0x8f,0xae,0xe2,0x0, 0xcf,0x82, +0x1, 0x89,0x16,0x1, 0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0xe2,0x0, 0xce,0x1, 0x5, 0x82, +0xac,0x9e,0x17,0x81,0x3f,0x9b,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8d,0xc6,0x81, +0xc7,0x1, 0xe0,0x43,0x3d,0x8f,0xe7,0xff,0x1, 0x9f,0xe7,0xff,0x0, 0xbc,0xe2,0x0, +0xcd,0xc, 0xe0,0x0, 0x1, 0x5c,0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0x8f,0xae,0x1, 0x5f, +0xe2,0x0, 0xcf,0x82,0x1, 0xe7,0x3e,0x6b,0x0, 0xde,0x25,0xd0,0x8f,0x8e,0xe2,0x0, +0xcf,0x82,0x1, 0x8, 0xe2,0x0, 0xcd,0xc, 0x1, 0x99,0xe2,0x0, 0xcd,0x8c,0x1, 0xce, +0x0, 0xd9,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x0, +0x1, 0x6a,0xe2,0x0, 0xcd,0x8c,0x1, 0x4d,0x8e,0x2e,0xe2,0x0, 0xce,0x2, 0x1, 0x43, +0xac,0x9e,0x0, 0xc8,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82, +0xe0,0x0, 0x1, 0x57,0xe2,0x0, 0xcd,0x8c,0xe7,0xff,0x1, 0xb1,0xe7,0xff,0x0, 0x83, +0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0xe2,0x0, 0x7d,0x4, 0x3c,0xe4, +0xdd,0xf3,0xe7,0xfe,0x0, 0x9c,0x3c,0x63,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0, +0xe2,0x0, 0x7d,0x4, 0x3c,0xe4,0xdd,0xe8,0xe7,0xfd,0x0, 0xef,0x3c,0x63,0xe2,0x1, +0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0xe2,0x0, 0x7d,0x4, 0x3c,0xe4,0xdd,0xdd,0xe7,0xfe, +0x0, 0xa4,0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0x1, 0x1d,0x8f,0xae,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x1, 0x91,0xe7,0xff,0x0, 0xa9,0x25,0xf5,0x8f,0x8e,0xe2,0x0, 0xcf,0x82, +0x8f,0x8d,0x1, 0x45,0xe2,0x0, 0xcf,0x82,0x1, 0xd, 0xe2,0x0, 0xcd,0x8c,0xe7,0xfe, +0x1, 0x4a,0x8f,0xae,0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xfd,0x3e,0x6a,0xe7,0xfe, +0x0, 0xf3,0x3e,0x63,0xe2,0x0, 0xcd,0x8c,0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0x1, 0x17, +0x8f,0xae,0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xea,0xe7,0xfe,0x0, 0xe5,0x3e,0x64, +0x0, 0xf2,0x3e,0x65,0x0, 0xf0,0xe2,0x0, 0xcd,0x8c,0xe7,0xfe,0x1, 0x64,0x8f,0xae, +0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xdf,0xe7,0xfe,0x0, 0xd6,0xe2,0x0, 0xce,0x1, +0xe7,0xfe,0x2, 0xd8,0xe7,0xfe,0x0, 0x9f,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x64, +0xe0,0x2, 0x1e,0xfd,0x39,0x68,0x8e,0xdd,0xf0,0x40,0x3d,0x69,0x3f,0xed,0x7e,0x86, +0x3f,0xb8,0xe0,0x1, 0x1e,0xf2,0x3f,0x99,0xa7,0xd, 0x37,0xa1,0x3f,0x9e,0x94,0xf, +0x14,0x8a,0x7d,0x1, 0xe0,0x5, 0xda,0xb4,0xe0,0x2, 0x1f,0x7d,0x65,0x1, 0x8f,0x4e, +0xe0,0x43,0x39,0x98,0xe8,0x40,0x3c,0xea,0x3c,0x62,0x7f,0x3, 0xdc,0xa6,0xe8,0x43, +0x3f,0x8a,0xe2,0x0, 0xcf,0x80,0x7f,0x85,0xe0,0x5, 0x4, 0x7b,0xe0,0x2, 0x1e,0xdd, +0x17,0x0, 0x7e,0x84,0xf7,0xff,0x14,0x7a,0x7f,0x2, 0xf0,0x0, 0x16,0x86,0xe0,0x1, +0x1f,0xf2,0xe0,0x2, 0x1d,0x9c,0xe0,0x2, 0x1e,0xfd,0x67,0x4, 0x63,0x82,0xa2,0x8f, +0x8a,0x5d,0xe0,0x43,0x3f,0x82,0xe0,0x7, 0x8c,0xcb,0xf0,0x0, 0x8d,0x8e,0x60,0x85, +0x7f,0x87,0x3b,0x67,0x66,0x87,0xe2,0x0, 0xce,0x80,0xe0,0x1, 0x4, 0xc, 0x67,0x2, +0xf0,0x0, 0x11,0x80,0xf0,0x43,0x3c,0x8e,0xe8,0x14,0x38,0xaa,0xf8,0x3c,0x3c,0x19, +0xf8,0x3e,0x3c,0x9d,0xe0,0x8, 0x30,0xa1,0xf0,0x40,0x39,0x62,0xf8,0x40,0x38,0x63, +0xf8,0x43,0x3b,0x14,0xf0,0x0, 0xc4,0x86,0xe8,0x43,0x3d,0x2, 0xe0,0xf, 0x3d,0x34, +0x3f,0x91,0x37,0xa1,0x3f,0x95,0xf0,0x0, 0x90,0x8f,0x24,0xaa,0xe0,0x15,0x3d,0x22, +0x3e,0xe7,0x35,0x21,0x3f,0xe6,0xf8,0x43,0x3b,0x95,0x0, 0x8e,0xf2,0x0, 0xca,0x1, +0x2, 0x1d,0xf2,0x0, 0xcb,0x80,0xe0,0x0, 0x5, 0x4a,0xf2,0x0, 0xca,0x81,0x2, 0x16, +0x3c,0xff,0x3e,0xef,0x5, 0x15,0xe0,0xe, 0x36,0xa1,0x3f,0x1b,0x8e,0xe, 0xc7,0x81, +0x3e,0x7a,0xe0,0x43,0x3f,0x8f,0x4, 0x75,0x8f,0x1e,0x3c,0x7e,0x2, 0x72,0xf2,0x0, +0xcb,0x0, 0x2, 0x65,0xf3,0xff,0xcb,0x7f,0x3, 0x65,0x3c,0xfd,0x2, 0x35,0xe8,0x40, +0x39,0xf1,0xe0,0x0, 0x2, 0x51,0xe8,0x43,0x3f,0x83,0xf0,0x2e,0x3c,0x1f,0x2f,0x13, +0xf0,0x0, 0x2e,0x12,0xe8,0x2e,0x3f,0x9d,0x2f,0xe, 0xf0,0x0, 0x2f,0xd, 0xc7,0x86, +0xe4,0x0, 0xc7,0x8d,0xe0,0x1, 0x1e,0xca,0xe8,0xf, 0x3f,0x99,0x37,0xa1,0x3f,0x9d, +0xf0,0x0, 0xb0,0x8f,0xf0,0x0, 0xc0,0x1, 0xf3,0xff,0xc0,0x7f,0x17,0xff,0xe8,0xf, +0x3f,0x92,0xf1,0xff,0xc1,0xff,0xe2,0x1, 0xc7,0xff,0xf2,0x1, 0xc1,0xff,0xf0,0x0, +0x21,0xc, 0xf0,0x40,0x39,0x6f,0xe7,0xff,0x0, 0xa1,0xf3,0xff,0xcb,0xff,0xe7,0xff, +0x3, 0x39,0x3c,0xfd,0x5, 0x4d,0xf0,0x0, 0x20,0xe, 0x67,0x82,0xc0,0xff,0xc7,0xff, +0xe0,0x43,0x38,0x81,0xe2,0x1, 0xc7,0xff,0xe3,0xff,0xc8,0xff,0x7f,0x82,0xe7,0xfe, +0x1, 0xf3,0xf0,0x0, 0x61,0x83,0xf1,0xff,0xc1,0xff,0xe8,0x40,0x39,0x73,0x4, 0xf, +0x67,0x86,0xc7,0xff,0xe8,0x40,0x3f,0xfa,0xe0,0x1, 0x2, 0x3b,0xc0,0x1c,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xf2,0x0, 0xcd,0x81,0x5, 0xca,0x0, 0xde,0x66,0x84,0xe0,0x1, +0x1f,0x72,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, 0x15,0x81,0x8e,0x8d,0xf0,0x0, 0x13,0x0, +0xf0,0x1b,0x3d,0x92,0xf0,0x0, 0xa0,0x8e,0xf0,0x0, 0x8c,0xdf,0xe0,0x16,0x8d,0x6b, +0xf0,0x0, 0x62,0x85,0x7e,0x82,0xf2,0x1, 0xc5,0xff,0xf8,0x40,0x3e,0x66,0xf7,0xff, +0x16,0xfa,0xf0,0x0, 0x17,0x6, 0xf8,0x40,0x38,0x66,0x67,0x3, 0xe8,0x40,0x3f,0x7b, +0x5, 0xd0,0xe8,0x43,0x3f,0x86,0xe8,0x2d,0x3f,0x9e,0xf8,0x6, 0x3a,0xaa,0xf0,0x38, +0x3e,0x9f,0xc7,0x86,0xf0,0x8, 0x32,0xa1,0xe8,0x40,0x3b,0xeb,0xf0,0x0, 0x13,0x81, +0xf0,0x0, 0x12,0x0, 0xe0,0x43,0x38,0x96,0x7e,0x84,0x7f,0x85,0xe8,0xf, 0x3b,0xb9, +0xe8,0xf, 0x3f,0x95,0x37,0xa1,0xe8,0xf, 0x3f,0x91,0xf0,0x0, 0x91,0xf, 0x25,0x32, +0xe0,0x5, 0x3b,0xa2,0xe0,0x9, 0x33,0xa1,0xe8,0x40,0x3e,0x6c,0xe8,0x40,0x3f,0xe0, +0xe0,0x43,0x3a,0x15,0x0, 0x8e,0xe2,0x0, 0xcb,0x1, 0x2, 0x22,0xe2,0x0, 0xca,0x0, +0xe0,0x2, 0x5, 0xa, 0xe2,0x0, 0xca,0x81,0x2, 0x1b,0x3f,0xfa,0x3e,0x6f,0x3, 0x1a, +0x17,0x3c,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x2e,0xe0,0xd, 0x36,0x21,0x3f,0x79, +0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x2, 0x71,0xe0,0xf, 0x8f,0x3d,0x3c,0x7e, +0x2, 0x6d,0xe2,0x0, 0xc8,0x80,0x2, 0x60,0xe3,0xff,0xc8,0xff,0x3, 0x60,0x3e,0x7a, +0x4, 0x2b,0xe8,0x40,0x39,0xf2,0xe0,0x1, 0x2, 0x6d,0xe8,0x43,0x3f,0x87,0xf0,0x2e, +0x3e,0x9f,0x2f,0x13,0xf0,0x0, 0x2c,0x12,0xe8,0x2e,0x3f,0x9e,0x2f,0xe, 0x67,0x4, +0x2f,0xc, 0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0x66,0x85,0xe0,0x1, 0x1f,0x4a,0x3f,0x9d, +0x37,0xa1,0x3f,0x9e,0xf0,0x0, 0xb1,0xf, 0xf0,0x0, 0xc2,0x1, 0xf3,0xff,0xc2,0x7f, +0xc3,0x81,0x66,0x83,0xe2,0x1, 0xc3,0xff,0x3e,0xf7,0xf0,0x0, 0xc3,0x81,0xf2,0x1, +0xc3,0xff,0xe7,0xff,0x2, 0x9d,0xf7,0xfe,0x22,0x55,0xf1,0xff,0xc2,0xff,0xf8,0x43, +0x3a,0x85,0xf3,0xff,0xca,0xff,0xf1,0xff,0xc3,0x7f,0xf2,0x1, 0xc3,0x7f,0xe7,0xfe, +0x1, 0xf6,0x67,0x86,0xc7,0xff,0xe8,0x40,0x3f,0xfa,0xe7,0xfe,0x5, 0x49,0x13,0x81, +0xe8,0x7, 0x3b,0x9a,0x67,0x6, 0xe2,0x1, 0xc3,0xff,0x3f,0x77,0xe7,0xfe,0x5, 0xc0, +0xe0,0x2, 0x1f,0xdd,0xe0,0x1, 0x1e,0xf2,0xe0,0x2, 0x1d,0x9c,0xe0,0x2, 0x1f,0x7d, +0x7f,0x84,0xf0,0x40,0x3b,0x67,0x8f,0x8f,0xf0,0x0, 0xa6,0xd, 0xf0,0x0, 0x8e,0xde, +0xe0,0x43,0x3e,0x82,0xe0,0xf, 0x8c,0x9b,0x7f,0x82,0xf0,0x0, 0x15,0x81,0x7e,0x85, +0xf0,0x0, 0x14,0x80,0xf7,0xff,0x17,0x7a,0xf0,0x0, 0x10,0x6, 0x67,0x5, 0xe2,0x0, +0xcf,0x0, 0xe0,0x1, 0x4, 0x23,0xe8,0x43,0x3f,0x8b,0xf0,0x0, 0x13,0x80,0xf8,0x6, +0x3b,0x2a,0xf0,0x38,0x3f,0x1f,0xe8,0x31,0x3f,0x90,0xc7,0x86,0xf0,0x8, 0x33,0x21, +0xf0,0x40,0x3a,0xe2,0xf8,0x40,0x3a,0x67,0xe0,0x43,0x38,0x96,0x7f,0x87,0xe8,0x43, +0x3d,0x5, 0xe8,0xf, 0x3d,0x3d,0xe8,0xf, 0x3f,0x96,0x37,0xa1,0xe8,0xf, 0x3f,0x9c, +0xf0,0x0, 0x91,0xf, 0x24,0xb2,0xe0,0x5, 0x3d,0x22,0xe8,0x40,0x3e,0x69,0x35,0x21, +0xe8,0x40,0x3f,0xe9,0xe0,0x43,0x3a,0x15,0x0, 0x8e,0xe2,0x0, 0xcb,0x1, 0x2, 0x22, +0xe2,0x0, 0xca,0x0, 0xe0,0x0, 0x5, 0x5d,0xe2,0x0, 0xca,0x81,0x2, 0x1b,0x3f,0xf9, +0x3e,0x6f,0x3, 0x1b,0x17,0x1e,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x1e,0xe0,0xd, +0x36,0x21,0x3f,0x7a,0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x4, 0x71,0xe0,0x7, +0x8f,0x6d,0x3c,0x7e,0x4, 0x6d,0xe2,0x0, 0xc8,0x80,0x2, 0x60,0xe3,0xff,0xc8,0xff, +0x3, 0x60,0x3e,0x79,0xe0,0x0, 0x4, 0x43,0xe8,0x40,0x39,0xf2,0xe0,0x1, 0x2, 0x4e, +0xe8,0x43,0x3f,0x87,0xf0,0x2e,0x3f,0x1f,0x2f,0x13,0xf0,0x0, 0x2c,0x12,0xe8,0x2e, +0x3f,0x90,0x2f,0xe, 0xf0,0x0, 0x28,0x8d,0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0x66,0x87, +0xe0,0x1, 0x1f,0x4a,0x3f,0x9d,0x37,0xa1,0x3f,0x9e,0xf0,0x0, 0xb1,0xf, 0xf0,0x0, +0xc2,0x1, 0xf3,0xff,0xc2,0x7f,0x17,0xff,0xe8,0xf, 0x3f,0x95,0xf1,0xff,0xc3,0xff, +0xe2,0x1, 0xc7,0xff,0xf2,0x1, 0xc3,0xff,0xf0,0x0, 0x22,0x99,0xf0,0x40,0x3a,0xef, +0xe7,0xff,0x0, 0x97,0xe3,0xff,0xca,0x7f,0xe7,0xfd,0x3, 0x79,0xe7,0xfe,0x0, 0x91, +0x67,0x82,0xe2,0x0, 0xcf,0x81,0xe7,0xfe,0x5, 0xad,0xe7,0xfe,0x0, 0xb6,0xe3,0xff, +0xca,0x7f,0xe7,0xff,0x3, 0x26,0x3e,0x79,0x3, 0x40,0xf0,0x0, 0x22,0xf, 0xf0,0x0, +0xc3,0x1, 0x66,0x86,0xf2,0x1, 0xc3,0x7f,0xe8,0x40,0x3e,0xf6,0xf0,0x0, 0xc5,0x81, +0xf2,0x1, 0xc5,0xff,0xe7,0xfe,0x2, 0xdc,0xe8,0x40,0x39,0x73,0xe7,0xfc,0x3, 0x78, +0x66,0x84,0xe0,0x1, 0x1f,0x72,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, 0x13,0x1, 0x8e,0x8d, +0xf0,0x16,0x3b,0x12,0xf0,0x0, 0xa6,0x8e,0xf0,0x0, 0x8f,0x5f,0xe0,0x1e,0x8d,0x3b, +0x7e,0x82,0xf2,0x1, 0xc3,0x7f,0x12,0x1, 0xf0,0x0, 0x10,0x80,0xf7,0xff,0x11,0x7a, +0xf0,0x0, 0x11,0x86,0x67,0x3, 0xe8,0x40,0x3f,0x76,0xe7,0xfc,0x5, 0xd9,0xe0,0x43, +0x38,0x84,0xe8,0x10,0x3b,0xaa,0xf0,0x3c,0x39,0x11,0xe8,0x3b,0x38,0x93,0xe0,0x17, +0x33,0xa1,0xe8,0x40,0x3c,0x66,0x13,0x1, 0x12,0x80,0xf8,0x43,0x3a,0x90,0xc0,0x86, +0xe8,0xf, 0x3c,0x3e,0x3f,0x97,0x37,0xa1,0xe8,0xf, 0x3f,0x9d,0xf0,0x0, 0x94,0xf, +0xe0,0x0, 0x25,0x51,0xe0,0x19,0x3c,0x22,0xe0,0x9, 0x34,0x21,0xe8,0x40,0x3e,0x61, +0xe8,0x40,0x3f,0xe1,0xf8,0x43,0x3a,0x19,0x0, 0x8d,0xf2,0x0, 0xc8,0x1, 0x2, 0x23, +0xf2,0x0, 0xca,0x0, 0x5, 0x39,0xf2,0x0, 0xcc,0x81,0x2, 0x1d,0x3f,0xfa,0x3e,0x6f, +0x3, 0x39,0xe0,0x0, 0x17,0x5a,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x3e,0xe0,0xd, +0x36,0x21,0x3f,0x79,0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x2, 0x70,0xe0,0x17, +0x8f,0xd, 0xf0,0x40,0x3b,0xfe,0x4, 0x6b,0xf2,0x0, 0xca,0x80,0x2, 0x5f,0xf3,0xff, +0xca,0xff,0x3, 0x5f,0x3e,0x7a,0x3, 0x1e,0xe7,0xfc,0x22,0x8a,0xc3,0x81,0x66,0x86, +0xe2,0x1, 0xc3,0xff,0x3e,0xf7,0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0xe7,0xff,0x2, 0xa4, +0xc0,0x1c,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x67,0x82,0xe2,0x0, 0xcf,0x81,0xe7,0xfe, +0x5, 0xcc,0xe7,0xfe,0x0, 0xec,0xf3,0xff,0xca,0x7f,0x4, 0x65,0x3f,0xfa,0x3e,0x6f, +0x4, 0x49,0xe8,0x40,0x39,0xf8,0x2, 0x26,0xe0,0x43,0x3f,0x86,0xf0,0x2e,0x39,0x1f, +0x2f,0x12,0xf0,0x0, 0x2e,0x11,0xe8,0x2e,0x3f,0x93,0x2f,0xd, 0xf0,0x0, 0x2d,0x8c, +0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0xe0,0x1, 0x1e,0xca,0x3f,0x91,0x37,0xa1,0x3f,0x9d, +0xf0,0x0, 0xb4,0xf, 0xc2,0x81,0xe3,0xff,0xc2,0xff,0xc4,0x1, 0x67,0x83,0xe2,0x1, +0xc4,0x7f,0x3f,0xf8,0xc3,0x1, 0xe2,0x1, 0xc3,0x7f,0xe7,0xff,0x2, 0x83,0xe7,0xff, +0x0, 0xbd,0x67,0x2, 0xe2,0x0, 0xcf,0x1, 0x5, 0xf1,0xe7,0xff,0x0, 0xb7,0xf0,0x0, +0x61,0x83,0xf1,0xff,0xc1,0xff,0xe7,0xfb,0x0, 0xb5,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xc0,0x70,0x3b,0xe8,0xe0,0x1, 0x1c,0x4a,0xe0,0x0, 0x4a,0xcf,0x39,0x6a,0xf0,0x40, +0x3c,0x69,0xe0,0x2, 0x15,0x52,0x14,0x80,0x39,0xec,0x3a,0x6d,0x3b,0x6b,0xe0,0x5, +0xd8,0x2b,0x3d,0xe5,0x3d,0x62,0x3c,0xe4,0x3c,0x63,0xdc,0xbf,0xe0,0x2, 0x1f,0xda, +0x8f,0x8f,0x27,0x87,0xe0,0x2, 0x1f,0xdd,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x11, +0x3c,0x65,0xda,0xa5,0x3c,0xe4,0x3c,0x63,0xd9,0x2e,0x3d,0xe6,0x3d,0x62,0xe8,0x40, +0x3c,0xe8,0x3c,0x67,0xc0,0x10,0xf8,0x0, 0xf, 0x28,0xb, 0xa1,0xe7,0x76,0x0, 0x84, +0xe0,0x0, 0x1f,0x8e,0xf0,0x2, 0x1f,0x5e,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x5, +0xe0,0x3, 0x1f,0x9c,0x8f,0x8f,0x27,0xe5,0xf0,0x0, 0x15,0x8a,0xf0,0x1b,0x3d,0xb6, +0x3c,0xe4,0x3c,0x63,0xd9,0x10,0xf0,0x0, 0x1e,0xd, 0xf0,0x0, 0x14,0xfc,0x3d,0x62, +0x3d,0xe6,0xe8,0x40,0x3c,0xe8,0x3c,0x67,0xf8,0x19,0x3c,0x9b,0xef,0xfb,0xda,0xe4, +0xf8,0x19,0x3c,0x9c,0xe8,0x0, 0x8f,0xd9,0x3c,0x65,0x7f,0x81,0xe8,0x0, 0x8f,0xe9, +0xf8,0x0, 0x9d,0x9, 0x7f,0x82,0xe8,0x0, 0x8f,0xf9,0xe8,0x0, 0x9a,0x99,0x7f,0x83, +0xe8,0x1, 0x8f,0x89,0xf8,0x0, 0x8e,0xc9,0x7f,0x84,0xda,0x61,0x3c,0xe4,0x3c,0x63, +0xd8,0xea,0x3d,0x62,0x3d,0xe6,0xe8,0x40,0x3c,0xe8,0x3c,0x67,0xef,0xfb,0xda,0xc4, +0xe8,0x0, 0x9c,0x8e,0xe8,0x0, 0x9d,0x1e,0xf0,0xe, 0x3d,0x29,0xe3,0xff,0xc7,0x7f, +0xf8,0xb, 0x3e,0x1b,0xe0,0x43,0x3e,0x9e,0xe0,0x7, 0x99,0xeb,0xe0,0xb, 0x3a,0xaa, +0xe2,0x0, 0xce,0x80,0xe3,0xff,0xc5,0xff,0xe8,0xd, 0x3c,0xaa,0xf8,0xf, 0x3e,0x1b, +0xe0,0x43,0x3a,0x1b,0xe0,0x7, 0x99,0x7f,0xe3,0xff,0xc6,0xff,0xe0,0xf, 0x39,0xa9, +0xe0,0x6e,0x3d,0x2d,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xca,0x0, 0xe0,0x8, 0x3d,0x25, +0xe0,0x43,0x3a,0x1f,0xe3,0xff,0xc4,0x7f,0xe0,0xd, 0x39,0x2a,0xe0,0x6b,0x3d,0x28, +0xe3,0xff,0xc6,0xff,0xe2,0x0, 0xca,0x0, 0x3c,0xa3,0xe0,0x43,0x3c,0x1d,0xe3,0xff, +0xc4,0xff,0xe0,0x6f,0x3d,0x29,0x3d,0x22,0xe2,0x0, 0xcc,0x0, 0xe3,0xff,0xc5,0x7f, +0xe0,0x6d,0x3d,0x2a,0x3f,0x1b,0x3f,0x9d,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc7,0xff, +0x3f,0x7f,0x3, 0x93,0x67,0x81,0xf8,0x0, 0xb5,0x9, 0xe8,0x0, 0xaf,0xd9,0x67,0x82, +0xe8,0x0, 0xb2,0x99,0xe8,0x0, 0xaf,0xe9,0x67,0x83,0xf8,0x0, 0xae,0xc9,0xe8,0x0, +0xaf,0xf9,0x67,0x84,0xe8,0x1, 0xaf,0x89,0xc0,0x10,0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x6c,0xe0,0x2, 0x1f,0xdd,0xf0,0x0, 0x1e,0xe, +0x8f,0x8f,0x2f,0x9f,0xea,0x12,0x7a,0x3, 0xf8,0x0, 0x8d,0x8c,0xaf,0x84,0xf0,0x0, +0x25,0xa1,0x17,0x1, 0xaf,0x4, 0x17,0x4, 0xe1,0x2f,0x3f,0x2f,0x2f,0x9a,0x17,0x82, +0xe9,0x2f,0x3f,0xab,0x2f,0x96,0xe0,0x1, 0x1f,0x69,0xea,0x12,0x79,0x82,0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0xaf,0x83,0x1, 0x19,0xc0,0x14,0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0xf8,0x0, 0x8d,0x8c,0xf0,0x0, 0x2d,0xed,0xea,0x12,0x7a,0x3, 0xf0,0x0, 0xad,0x84, +0xea,0x12,0x79,0x82,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0x17,0x1, 0xe2,0x0, 0xcf,0x81, +0xaf,0x3, 0x1, 0xeb,0xf0,0x0, 0x25,0xea,0xf0,0x0, 0x15,0x80,0xf0,0x3, 0x1e,0x9c, +0xe0,0x0, 0x1b,0xd, 0xe0,0x2, 0x1a,0xfd,0xf0,0x1, 0x1c,0x72,0xf0,0x1, 0x1c,0xd7, +0xf0,0x1, 0x1d,0x44,0xe0,0x2, 0x1b,0xff,0xe8,0x40,0x39,0x6b,0x0, 0x90,0x8f,0x87, +0x3f,0xf2,0x1, 0x10,0xf0,0x0, 0xc5,0x81,0xf2,0x1, 0xc5,0xff,0xc1,0x1, 0xe8,0x0, +0x8f,0x8c,0xe2,0x1, 0xc1,0x7f,0x3f,0xf2,0xe0,0x0, 0x5, 0xc8,0xe8,0x0, 0x8f,0x8d, +0x2f,0xef,0xe0,0xe, 0x31,0x21,0x3f,0x16,0x8e,0xe, 0x8f,0xd5,0x8e,0x9e,0x3f,0xbc, +0xe8,0x0, 0xa7,0x8, 0x3f,0x9d,0x37,0xa1,0x3f,0x9e,0x97,0xf, 0xe8,0x0, 0x97,0xa9, +0x3f,0x7f,0x4, 0x65,0x8f,0x83,0x2f,0xb7,0x17,0x83,0xe8,0x3, 0x8d,0xb9,0x6f,0x96, +0x6f,0x97,0x25,0xbd,0x17,0x84,0x14,0x84,0x6f,0x96,0x3c,0x69,0x6f,0x97,0xe8,0x40, +0x3d,0xeb,0x3d,0x62,0xef,0xfb,0xdb,0xf2,0xe8,0x0, 0x8f,0x8a,0xe2,0x0, 0xcf,0x81, +0x1, 0xca,0x17,0x8a,0xe8,0xf, 0x3f,0xbb,0x3f,0x96,0xe0,0x7, 0x9e,0xef,0xe0,0x7, +0x97,0x7f,0xe0,0x7, 0xb6,0xff,0xe0,0x7, 0xb7,0x6f,0xe7,0xff,0x0, 0xbd,0xea,0x12, +0x7a,0x3, 0x87,0x4, 0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x32,0xe7,0xfe, +0x5, 0xf3,0x17,0x32,0xe7,0xfe,0x0, 0xf0,0xf8,0x0, 0xad,0x8c,0xc0,0x14,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0x8f,0x4, 0x14,0x86,0x17,0x86,0x7f,0x1, 0xe8,0x40,0x3d,0xeb, +0x3d,0x62,0x3c,0x69,0x6f,0x96,0x6f,0x97,0xde,0x79,0x0, 0xcf,0x8f,0xf5,0x3c,0xed, +0x3c,0x6c,0x3d,0x62,0x7f,0x84,0x7e,0x3, 0x7e,0x82,0xf0,0x0, 0x8f,0x65,0xef,0xfb, +0xd9,0x34,0xe8,0x0, 0x8f,0x8c,0x66,0x3, 0xe2,0x0, 0xcf,0x83,0x66,0x82,0x5, 0x84, +0x17,0x82,0x6f,0x96,0x6f,0x97,0xe2,0x1, 0xcc,0x7f,0x1, 0x4, 0x17,0x82,0x6f,0x96, +0x6f,0x97,0xe2,0x0, 0xce,0x1, 0x5, 0x86,0xf1,0xff,0xc7,0x7e,0xe8,0x40,0x3e,0x7e, +0x4, 0x3, 0x17,0x82,0x6f,0x96,0xe2,0x0, 0xce,0x81,0x5, 0x85,0x67,0x84,0xc7,0xfe, +0x3e,0xff,0x4, 0x3, 0x17,0x82,0x6f,0x97,0x14,0x96,0x3c,0x90,0x3c,0x62,0xe2,0x0, +0x7d,0x17,0xef,0xff,0xd7,0x7, 0x4c,0x16,0x4c,0x97,0xe7,0xff,0x0, 0x92,0x8f,0x8, +0x3f,0xe8,0x3f,0x79,0x2, 0x8c,0x8f,0x28,0x14,0x0, 0x3f,0x79,0x5, 0x89,0x8f,0x1f, +0x3f,0x7a,0x2, 0x86,0x8c,0x3f,0xe1,0x28,0x3c,0x1a,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe0,0x2, 0x1f,0x42,0x9f,0x88,0x9e,0x8e,0x3f,0xfd,0x2, 0x84,0x17,0x80,0xb7,0x88, +0x38,0x82,0x9f,0xe, 0x3f,0xae,0xb7,0x88,0x38,0x82,0x8, 0xb1,0xc0,0x68,0xe4,0x0, +0x17,0x80,0xe0,0x2, 0x1e,0xfd,0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd, +0x3d,0x1f,0xe0,0xf, 0x34,0x41,0x7f,0x1, 0x34,0xc1,0x7f,0x6, 0x35,0x41,0x7f,0x85, +0xe2,0x0, 0x7c,0x4, 0x17,0x90,0x7f,0x2, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, +0x77,0x8c,0xe0,0x5, 0xd0,0x3a,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, +0x1e,0xfd,0xe4,0x0, 0x17,0x80,0x17,0x0, 0x86,0x5d,0x3c,0x1f,0x86,0xcd,0x3c,0x9f, +0x3d,0x1f,0x7f,0x1, 0xe0,0xf, 0x34,0x41,0x34,0xc1,0x35,0x41,0xe2,0x0, 0x7c,0x4, +0x7f,0x2, 0x7f,0x6, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, 0x7f,0x85,0x6d,0x87, +0xe0,0x5, 0xd0,0x1b,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe4,0x0, 0x17,0x80, +0xe0,0x2, 0x1e,0xfd,0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd,0xe0,0xf, +0x34,0x41,0x7f,0x1, 0x34,0xc1,0x7f,0x6, 0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0xa0, +0x7f,0x2, 0x7f,0x4, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x77,0x8c,0xe0,0x4, 0xdf,0xfd, +0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0x57,0xe0,0x2, +0x1e,0xfd,0xe4,0x0, 0x17,0x80,0xe2,0x0, 0x7d,0xae,0x3c,0x1f,0xf0,0x0, 0x93,0x2e, +0xf0,0x0, 0x93,0xbe,0x95,0x7e,0x3f,0x9b,0xe0,0x1, 0x95,0x8e,0xe0,0x1, 0x1f,0x79, +0xf0,0x0, 0x82,0x4d,0xf0,0x0, 0x82,0xdd,0x16,0x1, 0xe0,0xd, 0x34,0x41,0x37,0xc1, +0x37,0x41,0xe2,0x0, 0x7c,0x14,0xe2,0x0, 0x7c,0x84,0x7e,0x86,0x7f,0x88,0x7f,0x7, +0x75,0x95,0x6e,0x16,0x6e,0x17,0xf0,0x0, 0x6a,0x15,0xf0,0x0, 0x6a,0x94,0xf0,0x0, +0x73,0x12,0xf0,0x0, 0x73,0x93,0x75,0x14,0xe0,0x5, 0xd0,0x27,0x5c,0x7, 0x5f,0x5, +0xe0,0x43,0x3f,0x98,0xe2,0x0, 0xcf,0x80,0xe0,0x41,0x3e,0x4f,0xe0,0x43,0x3e,0x9e, +0x3d,0xe8,0xe0,0x6b,0x3d,0x2c,0xe2,0x0, 0xce,0x80,0x5, 0x13,0x3d,0xfe,0x5, 0xd, +0xe0,0x41,0x3f,0x48,0xe2,0x0, 0xcf,0x80,0x3f,0xee,0xe3,0xff,0xc7,0xff,0xe0,0x68, +0x3d,0x2f,0xe0,0x0, 0xc0,0x68,0x8, 0xe1,0x3c,0x6e,0xe0,0x0, 0xc0,0x68,0x8, 0xe1, +0xe0,0x41,0x3e,0xcd,0x3d,0xfd,0x2, 0x6d,0xe0,0x41,0x3c,0x4e,0xe3,0xff,0xc4,0x7f, +0xe0,0x0, 0xc0,0x68,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, 0x1f,0x7d,0xe4,0x0, +0x17,0x80,0x16,0x80,0x3c,0x9f,0xf0,0x0, 0x81,0xde,0xf0,0x0, 0x82,0x4e,0x3f,0x98, +0xe0,0x16,0x35,0x41,0xe0,0x17,0x35,0x42,0x17,0x1, 0x7e,0x81,0xe0,0x15,0x34,0xc1, +0x7e,0x86,0x3f,0x5a,0x37,0xc1,0xf2,0x0, 0xc3,0x1, 0xf2,0x0, 0xc3,0x81,0x3d,0x6c, +0x3c,0xeb,0xe2,0x0, 0x7c,0x4, 0x7e,0x82,0x7e,0x84,0xf0,0x0, 0x69,0x85,0xf0,0x0, +0x6a,0x4, 0xf0,0x0, 0x7a,0x83,0x7f,0x85,0x6f,0x7, 0xf0,0x0, 0x6b,0x1a,0xf0,0x0, +0x6b,0x9b,0xe0,0x5, 0xd2,0x16,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, +0x1f,0x7d,0x17,0x80,0x86,0x5e,0x86,0xce,0xe9,0xff,0xc4,0x7e,0x7f,0x81,0xe0,0xe, +0x34,0x41,0xe2,0x0, 0x7c,0x4, 0x7f,0x82,0x7f,0x84,0x7f,0x85,0x7f,0x86,0x6e,0x5, +0x6e,0x84,0x7f,0x3, 0xe0,0x5, 0xd2,0x9a,0xc0,0x18,0x8, 0xe1,0x8, 0xb2,0xc0,0x70, +0xf0,0x1, 0x1b,0xe6,0xf0,0x1, 0x1a,0xe5,0xe0,0x1, 0x19,0x78,0xe4,0x0, 0x17,0x80, +0xe0,0x1, 0x1f,0x7f,0xf0,0xc, 0x3a,0x9f,0xf0,0xd, 0x3b,0x9f,0xe8,0x0, 0xb4,0x5, +0x3f,0x92,0xf0,0x99,0x12,0xd6,0xf0,0x0, 0x13,0x1, 0xf0,0x15,0x3a,0x9e,0x36,0x41, +0x36,0xc1,0x37,0xc1,0xe0,0x99,0xc7,0x7e,0xe2,0x0, 0x7c,0x4, 0x7e,0x2, 0x7e,0x83, +0x7f,0x84,0xf0,0x0, 0x6b,0x4, 0xf0,0x0, 0x6b,0x5, 0xe8,0x0, 0xb4,0x85,0xe8,0x0, +0xb5,0x7, 0xb5,0x8e,0xe0,0x5, 0xd0,0xa, 0x9c,0x2, 0xc0,0x10,0x9, 0x61,0xe0,0x3, +0x1f,0xc7,0x8f,0x8f,0xe2,0x0, 0xcf,0x83,0x1, 0x3, 0x14,0x1, 0x38,0x82,0x8, 0xb2, +0x39,0x68,0x3c,0x69,0xef,0xff,0xd3,0x51,0xe0,0x2, 0x1f,0x93,0xe0,0x1, 0x8f,0x1f, +0xe2,0x0, 0xcf,0x5, 0x24,0x7, 0x1, 0x8, 0xe0,0x1, 0x8c,0x1f,0xe0,0x28,0x39,0x8, +0x9, 0x61,0x1, 0xfb,0x0, 0xfc,0xe2,0x1, 0xc1,0x7d,0x14,0x0, 0x29,0x7a,0xea,0x12, +0x7f,0xa2,0x8e,0xf, 0x17,0x1, 0x3f,0x1c,0xe0,0x1, 0x1e,0xc6,0xe2,0x1, 0xc7,0x7f, +0xe2,0x0, 0xcf,0x3, 0x3e,0x9c,0x8c,0xd, 0x2, 0x83,0xaf,0xf, 0x9, 0x61,0xa9,0xf, +0x9, 0x61,0xe0,0x3, 0x1f,0xac,0xe4,0x0, 0xc4,0x8e,0xe0,0xe, 0x3f,0x99,0x8f,0x1e, +0x27,0x5, 0x17,0x1, 0xe0,0x2e,0x3c,0xe, 0x2f,0xd, 0x3f,0x99,0x8f,0xbf,0x27,0x89, +0x17,0x84,0xe0,0x28,0x3c,0xf, 0x24,0x5, 0xe0,0x1, 0x1f,0xe9,0x17,0x0, 0xaf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0x69,0x16,0x80,0xae,0x8e,0x0, 0xf0,0x8, 0xb7,0xe0,0x2, +0x1b,0xc8,0x89,0x87,0xef,0xfe,0xd1,0x3, 0x24,0x7e,0xe0,0x0, 0x19,0x3b,0xe0,0x2, +0x8a,0x2, 0xe0,0xf, 0x39,0x14,0xe0,0x6, 0x8b,0xf, 0x8f,0x4f,0x2f,0x1f,0xe0,0x1, +0x1a,0xe9,0x8f,0x85,0xe2,0x0, 0xcf,0x81,0x1, 0x3f,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f, +0xe2,0x0, 0xcf,0x83,0x1, 0x39,0xe0,0x2, 0x8f,0x2, 0xe0,0x2, 0x8f,0x92,0x3f,0x7f, +0xe0,0x0, 0x3, 0xe6,0xef,0xff,0xd2,0xac,0xef,0xff,0xd2,0xb6,0x24,0x6, 0xe0,0x2, +0x1f,0xe6,0x8f,0x8f,0xe0,0x0, 0x2f,0xd7,0xb, 0xe1,0x8f,0x4f,0xe0,0x2, 0x1e,0x93, +0xc7,0x7f,0xe0,0x5, 0xaf,0x3d,0x8f,0xcf,0xe0,0x1, 0x1a,0xe9,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x1, 0x5e,0x17,0x0, 0xaf,0x5, 0xe0,0xf, 0x39,0x14,0x17,0x0, 0xaf,0x4f, +0x3c,0x66,0xe0,0x1, 0x89,0x9f,0x3c,0xe3,0xef,0xfb,0xdb,0xa2,0x3c,0xe3,0x3c,0x64, +0xe0,0x0, 0xdb,0xf3,0xe0,0x2, 0x8f,0x82,0xc7,0x81,0xe0,0x2, 0xaf,0x82,0x8f,0x85, +0xe2,0x0, 0xcf,0x81,0x1, 0xc3,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x27,0xc5,0xe2,0x0, +0xcb,0x5, 0xe0,0x0, 0x1, 0x40,0x17,0x5, 0x3f,0x33,0xe0,0x3, 0x1f,0xb0,0x3f,0x9e, +0x8c,0xcf,0xe0,0x1, 0x1f,0xf1,0xa4,0xf, 0xef,0xfe,0xd1,0xca,0x3c,0xe3,0x3c,0x66, +0xdf,0x47,0x3a,0x68,0x3c,0xe3,0x3c,0x66,0xe0,0x0, 0xda,0x4c,0x2a,0x2f,0xe2,0x0, +0xcb,0x4, 0xe7,0xff,0x1, 0xaa,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xcf,0xe7,0xff, +0x27,0xa4,0x97,0x8e,0xe2,0xff,0xc7,0xff,0xb7,0x8e,0x17,0x80,0xaf,0x85,0xe7,0xff, +0x0, 0x9c,0x3c,0xe6,0x3c,0x63,0xb, 0xa1,0xe0,0x1c,0x0, 0xd4,0xef,0xfe,0xd9,0xba, +0xac,0x5, 0xe0,0x1, 0xd8,0x43,0xe0,0x1, 0xd7,0x8d,0xef,0xff,0xd2,0xf7,0x8c,0x7, +0xe0,0x0, 0xdd,0xf3,0xef,0xfd,0xdf,0xff,0xe7,0xff,0x0, 0x8e,0xaf,0x85,0xe7,0xff, +0x0, 0xa5,0x17,0x0, 0xaf,0x5, 0xe7,0xff,0x0, 0x80,0xef,0xfb,0xdb,0x7b,0x3c,0xe3, +0x3c,0x66,0xe0,0x0, 0xdd,0x7f,0xe0,0x1, 0x1f,0xe8,0xab,0xf, 0xe0,0x2, 0x1f,0x93, +0xe0,0x5, 0xab,0x4f,0xe0,0x3, 0x1f,0x8f,0xa9,0x8f,0x0, 0xc2,0x8, 0xb3,0xe0,0x0, +0x19,0xbb,0x11,0x0, 0xdf,0x4c,0xc1,0x1, 0xe0,0x2, 0x8f,0x93,0xe2,0x1, 0xc1,0x7f, +0x39,0x7f,0x4, 0xf9,0xe0,0x2, 0x1f,0x93,0xe0,0x5, 0x8c,0x4f,0xe0,0x3, 0x1f,0x8f, +0x8c,0x8f,0x9, 0xa1,0xe7,0x76,0x0, 0xa4,0xe0,0x1, 0x1f,0x42,0xe0,0x2, 0x1f,0x93, +0xe0,0xe, 0x85,0x9e,0x16,0x0, 0xae,0xf, 0x15,0x2, 0xad,0xaf,0xe0,0x2, 0x1e,0xe6, +0xe0,0xe, 0x85,0xae,0x8e,0x8d,0xad,0xbf,0x3d,0x5d,0xe0,0xe, 0x85,0xde,0xe0,0x3, +0xad,0xef,0x2d,0x2d,0xe0,0x10,0x86,0x5e,0xe0,0x10,0x85,0xee,0x3e,0x1b,0xe0,0x2, +0xae,0x6f,0xe0,0xe, 0x86,0x6e,0xe0,0x3, 0xae,0x7f,0x16,0x3f,0x3e,0x5d,0xe0,0x11, +0x8e,0x8e,0xe0,0x10,0x8d,0xfe,0x36,0xa6,0x3e,0xcc,0xe0,0xc, 0x35,0xa7,0x3e,0xcc, +0xe0,0x4, 0xae,0xef,0x2d,0x9b,0xe0,0xd, 0x86,0x5e,0xe0,0xd, 0x86,0xfe,0xe0,0xa, +0xae,0xf, 0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x2d,0x72,0xe0,0xd, 0x85,0xee,0xe0,0xe, +0x87,0xe, 0xe0,0xa, 0xad,0xaf,0xe0,0xa, 0xaf,0x3f,0x0, 0x97,0xe0,0x10,0x85,0xde, +0xe0,0x2, 0xad,0xef,0xe0,0x3, 0xae,0x7f,0x0, 0xd9,0xe0,0xd, 0x86,0x6e,0xe0,0xe, +0x86,0x8e,0xe0,0xa, 0xae,0xf, 0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x25,0x4e,0x17,0x0, +0xe0,0xa, 0xaf,0x2f,0xe0,0xa, 0xaf,0x3f,0x17,0x0, 0xe0,0x1, 0x1e,0x8e,0xe0,0x2, +0x1e,0x44,0x86,0x8d,0x15,0x81,0xae,0xdf,0xaf,0x6f,0xe0,0x1, 0xaf,0x3f,0xe0,0x2, +0xaf,0xf, 0xe0,0x0, 0x1e,0xcd,0xe0,0x1, 0xaf,0x7f,0x86,0x8d,0xe0,0x1, 0xae,0xcf, +0xe0,0x1, 0xaf,0x5f,0x86,0xbc,0xe0,0x1, 0xaf,0x6f,0x87,0x4c,0xe0,0x4, 0xae,0x8f, +0xe0,0x4, 0xaf,0x1f,0xe0,0x1, 0x1f,0xd, 0x86,0x5c,0x8e,0x8e,0xe0,0x1, 0x1f,0xc, +0xe0,0x4, 0xae,0x2f,0x36,0xa8,0xe0,0x3, 0x1e,0xe, 0x8f,0xe, 0x86,0x1c,0x3f,0x4d, +0xe0,0x3, 0x1e,0xc3,0xe0,0x5, 0xae,0x1f,0xe0,0x6, 0xad,0x8f,0x8e,0x8d,0xe0,0x5, +0xb7,0x5f,0x26,0xa2,0xe0,0x3, 0x1f,0x38,0xa7,0xe, 0xa7,0x4e,0xe2,0x0, 0xc7,0x1, +0x27,0x1b,0x16,0x85,0xe0,0x1, 0xae,0x9f,0x17,0x0, 0xe0,0x2, 0xaf,0x5f,0xe0,0x2, +0xaf,0x1f,0xaf,0x4f,0x38,0x82,0xe0,0xd, 0x85,0xde,0xe0,0xd, 0x87,0x7e,0xe0,0xa, +0xad,0xaf,0xe0,0xa, 0xaf,0x3f,0xe7,0xff,0x0, 0xb1,0xe0,0xa, 0xad,0xaf,0xe0,0xa, +0xad,0xbf,0xe7,0xff,0x0, 0xab,0x16,0x0, 0xe0,0x1, 0xae,0x1f,0x17,0x0, 0xe0,0x2, +0xaf,0x5f,0xe0,0x2, 0xaf,0x1f,0xaf,0x4f,0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1f,0x76, +0x34,0xa6,0xf0,0x2, 0x1b,0xf5,0x3c,0x19,0x17,0x80,0xb4,0xe, 0x17,0x0, 0x3d,0xef, +0xe8,0x0, 0xaf,0x7, 0x3e,0xef,0x15,0x1, 0xe0,0xe, 0x34,0x1f,0x16,0x1, 0xe2,0x0, +0xc7,0x1, 0xc7,0x81,0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0xea, +0xe2,0x0, 0xcf,0x8c,0x1, 0xf2,0x2d,0x82,0x38,0x82,0xe8,0x0, 0xae,0x87,0x38,0x82, +0x8, 0xb1,0xf0,0x2, 0x1b,0xfd,0xe0,0x1, 0x1c,0x8b,0xe8,0x40,0x3c,0x67,0xe0,0x19, +0x15,0x1c,0xe0,0x5, 0xd2,0xef,0xe0,0x2, 0x1f,0xe6,0xf0,0x40,0x3b,0xe8,0x87,0x8f, +0xe2,0x0, 0xc7,0x82,0x2f,0xbe,0xe0,0x3, 0x8e,0x98,0xe0,0x3, 0x8f,0x88,0x97,0x58, +0x96,0x68,0x3f,0x9d,0xe0,0x2, 0x1e,0xfc,0x3f,0x1c,0xb7,0xd, 0xe0,0x2, 0x1f,0x74, +0xb7,0x8e,0x17,0x80,0xe0,0x1, 0x1e,0xc2,0xe0,0x2, 0x1c,0x75,0xe0,0xe, 0x8f,0x6d, +0xe0,0xe, 0x8d,0xdd,0x37,0x26,0x3d,0x9e,0xe0,0x2, 0x1f,0x76,0x3d,0x6f,0xb5,0x8e, +0x17,0x0, 0xaf,0x8, 0x3e,0xef,0x14,0x81,0xe0,0xe, 0x35,0x9f,0x16,0x1, 0xe2,0x0, +0xc7,0x1, 0xc7,0x81,0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0x69, +0xe2,0x0, 0xcf,0x8c,0x1, 0xf2,0x2d,0x1f,0xe0,0x1, 0x1f,0xc4,0x8f,0x8f,0x27,0x93, +0xe8,0x0, 0x8f,0xc7,0xe0,0x2, 0x1f,0x73,0x37,0xa6,0xc7,0xff,0xb7,0x8e,0x8, 0xe1, +0xe0,0x2, 0x1f,0xfc,0x96,0xd8,0xe0,0x3, 0x8f,0x8, 0xb6,0x8f,0xe0,0x2, 0x1f,0xf4, +0xb7,0xf, 0x0, 0xc8,0xe8,0x0, 0x8f,0xd7,0xe0,0x2, 0x1f,0x73,0x37,0xa6,0xc7,0xff, +0xb7,0x8e,0x8, 0xe1,0xae,0x88,0x0, 0xe1,0x8, 0xb3,0xe0,0x1, 0x19,0x7f,0xe0,0x1, +0x1f,0xee,0xe0,0xc, 0x11,0xd2,0xe0,0x99,0x16,0xcc,0xe0,0x99,0x17,0x50,0x3e,0x92, +0x3f,0x12,0x3d,0x63,0x3c,0x6f,0x14,0x80,0xbf,0x8d,0xb9,0xe, 0xe0,0x5, 0xd2,0xbc, +0x3d,0x63,0x14,0x80,0x3c,0x62,0xe0,0x5, 0xd2,0xb7,0xe0,0x9c,0xc1,0x16,0x17,0x80, +0xaf,0x82,0x9, 0xe1,0x8, 0xb2,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x24,0x3f,0x1f, +0xe0,0x1a,0x16,0x25,0xe0,0x1a,0x15,0x2a,0x8e,0x8e,0x3e,0x1f,0x3d,0x1f,0xe0,0x1a, +0x17,0x26,0x8d,0x8c,0x8c,0xa, 0x3f,0x1f,0xe0,0x1a,0x16,0x27,0xe0,0x1a,0x14,0xab, +0xe0,0x1a,0x15,0x2c,0x8f,0xe, 0x3c,0x9f,0x3d,0x1f,0x3e,0x1f,0x36,0xa8,0xe0,0x2, +0x19,0x40,0x8e,0xc, 0x3d,0xcd,0xf0,0x1a,0x13,0xad,0x8e,0x89,0x8c,0x8a,0xe0,0x1a, +0x15,0x34,0xf0,0x17,0x3b,0x9f,0x3d,0x1f,0x37,0x28,0x35,0xc5,0x8d,0xa, 0x3e,0x4e, +0x34,0x28,0xe8,0x0, 0x8f,0x7, 0xe0,0x1a,0xc7,0xb5,0xad,0x82,0x36,0x45,0x8f,0x8f, +0xe0,0xb, 0x34,0xa8,0x3e,0xc8,0xae,0x12,0x36,0xc5,0xe0,0xc, 0x35,0x28,0x3f,0x4b, +0xae,0xa2,0x37,0x45,0x3f,0xcc,0xe0,0x1, 0x1c,0x8a,0xe0,0x2, 0x1c,0x3f,0xaf,0x32, +0x37,0xc5,0xe0,0x0, 0x15,0x6a,0xaf,0xd2,0xe0,0x5, 0xd2,0x2c,0xe0,0x4, 0x8f,0xe2, +0xe0,0x1, 0x1c,0xd3,0xe0,0x41,0x3f,0x8f,0x15,0x20,0xe0,0x22,0x14,0x40,0xe0,0x6, +0xaf,0xc2,0xef,0xfe,0xd6,0xff,0x9, 0x21,0xe0,0x2f,0x0, 0x93,0x8, 0xb6,0xe0,0x1, +0x1f,0xc2,0xe0,0x1a,0x15,0xa8,0xe0,0x1a,0x16,0x2e,0xe0,0x1a,0x16,0xb2,0x3d,0x9f, +0x3e,0x1f,0x3e,0x9f,0xe0,0x1a,0x14,0x2a,0xe0,0x1a,0x14,0xac,0xe0,0x1a,0x15,0x30, +0x8a,0x8b,0x8a,0xc, 0x89,0x8d,0x3c,0x1f,0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x11,0x24, +0xe0,0x1a,0x10,0xa6,0xe0,0x1a,0x15,0xa9,0xe0,0x1a,0x16,0x2f,0xe0,0x1a,0x16,0xb3, +0xf0,0x1a,0x13,0xa5,0xe0,0x1a,0x13,0x27,0xf0,0x0, 0x89,0x88,0xf0,0x0, 0x8a,0x9, +0xf0,0x0, 0x8a,0x8a,0xf0,0x17,0x3b,0x9f,0x3b,0x1f,0x39,0x1f,0x38,0x9f,0x3d,0x9f, +0x3e,0x1f,0x3e,0x9f,0xe0,0x1a,0x14,0x2b,0xe0,0x1a,0x14,0xad,0xe0,0x1a,0x15,0x31, +0xf8,0x0, 0x8b,0x7, 0x89,0x2, 0xf0,0x0, 0x8b,0x86,0x88,0x81,0x8d,0x8b,0x8e,0xc, +0x8e,0x8d,0x3c,0x1f,0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x13,0x1a,0xf0,0x1a,0x10,0x1c, +0xf0,0x1a,0x10,0xe4,0xf0,0x1a,0x11,0x1d,0x8c,0x8, 0x8c,0x89,0x8d,0xa, 0x3b,0x1f, +0xf0,0x10,0x38,0x1f,0xf0,0x11,0x38,0x9f,0xf0,0x12,0x39,0x1f,0x32,0xa8,0x32,0x28, +0x31,0xa8,0xe0,0x1, 0x1f,0x57,0x83,0x6, 0xf8,0x0, 0x80,0x0, 0xf8,0x0, 0x88,0x81, +0xf8,0x0, 0x81,0x2, 0x31,0x28,0x30,0xa8,0x3d,0xc5,0xf0,0x13,0x31,0xa8,0xf0,0x14, +0x32,0x28,0x3e,0x44,0xf0,0x15,0x32,0xa8,0x3e,0xc3,0xf0,0x16,0x3b,0x42,0xf0,0x17, +0x3b,0xc1,0xe0,0x41,0x3d,0xcb,0xe0,0x41,0x3e,0x4c,0xe0,0x41,0x3e,0xcd,0xe8,0x8, +0x3c,0x43,0xe8,0x9, 0x3c,0xc4,0xe8,0xa, 0x3d,0x45,0xe0,0x1a,0x12,0x1e,0xe0,0x1a, +0x11,0xb4,0x3a,0x1f,0x39,0x9f,0xb6,0x6e,0xe0,0x1a,0x11,0x1f,0xe0,0x1, 0xb6,0x8e, +0x39,0x1f,0xab,0xe, 0xe0,0x1a,0xc7,0xb5,0xf0,0x0, 0xa8,0x1e,0x10,0x80,0xf0,0x0, +0xb3,0x1e,0xf0,0x0, 0xb3,0xae,0xb5,0xbe,0xb4,0x4e,0xb4,0xde,0xb5,0x7e,0xf0,0x2, +0xa8,0xee,0xf0,0x2, 0xa9,0x7e,0x8d,0x84,0x8e,0x3, 0x8e,0x82,0x8f,0x8f,0x35,0xa8, +0x36,0x28,0x3e,0xcb,0x3f,0xcc,0xe0,0x1, 0xb6,0xce,0xe0,0x1, 0xb7,0x9e,0xe0,0x3, +0xa8,0xae,0xe0,0x3, 0xa8,0xbe,0xb, 0x61,0x8, 0xb1,0xe0,0x0, 0x1c,0xd, 0xe0,0x3, +0x15,0x40,0x14,0x80,0xe0,0x5, 0xd1,0xa0,0xe0,0x1, 0x1f,0xc3,0xe0,0x0, 0x1c,0x4, +0x8d,0xf, 0xe0,0x1, 0x14,0xff,0xe4,0x0, 0xc5,0xa, 0x8, 0xa1,0xe0,0xa3,0x0, 0x94, +0x8, 0xb2,0xe0,0x1, 0x1f,0x8e,0xe0,0x2, 0x1c,0x5e,0x89,0xf, 0xe0,0x1, 0x14,0xff, +0xe4,0x0, 0xc1,0xa, 0x3d,0x62,0xe0,0x5, 0xd1,0x87,0xe0,0x2, 0x1c,0x59,0x3d,0x62, +0xe0,0x1, 0x14,0xff,0xe0,0x5, 0xd1,0x80,0xe0,0x2, 0x1c,0x58,0x3d,0x62,0xe0,0x1, +0x14,0xff,0xe0,0x5, 0xd1,0x79,0xe0,0x2, 0x1c,0x57,0xe0,0x3, 0xd8,0xc3,0xe0,0x2, +0x1e,0xdf,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xb7,0x1f,0xc7,0x82,0xb7,0x1d,0xe1,0x80, +0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80, +0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xb7,0xf, 0x9, 0x61,0x8, 0xb4,0xdd,0x4e,0xde,0x29, +0xde,0x8c,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x15,0x89,0x3d,0x9f,0xe0,0x3, 0x1f,0x30, +0x82,0xb, 0xe0,0x1b,0x15,0x5e,0x3d,0x1f,0xe0,0x1a,0x16,0xe, 0x8c,0x8a,0x3e,0x1f, +0x84,0x1b,0xaa,0xe, 0xe0,0x1a,0x16,0x93,0x82,0x3b,0xf0,0x0, 0x82,0xab,0xf0,0x0, +0x83,0x4b,0xf0,0x0, 0x83,0x8c,0xe0,0x1b,0x15,0x5f,0x80,0xcc,0x3e,0x9f,0xaa,0x3e, +0x3d,0x1f,0x81,0x9c,0x81,0x3c,0xac,0x1e,0x15,0x85,0x84,0x2c,0x8d,0xa, 0xf0,0x0, +0x80,0xd, 0x3d,0x9e,0xf0,0x0, 0xab,0xde,0x16,0xa, 0xf0,0x0, 0xab,0x4e,0x3e,0x1e, +0xf0,0x0, 0xaa,0xae,0x34,0xa8,0xa8,0xcb,0x3d,0x49,0xf0,0x0, 0x80,0x9d,0xf0,0x0, +0x81,0x2d,0xf0,0x0, 0x81,0xbd,0xf0,0x0, 0x82,0x4d,0xa9,0x3b,0xf0,0x1b,0x12,0xe2, +0xac,0x2b,0xf0,0x15,0x3a,0x9f,0xa9,0x9b,0xf0,0x1b,0x13,0xe3,0xe0,0x3, 0x1e,0x84, +0xf0,0x1, 0xa8,0x2e,0xf0,0x17,0x3b,0x9f,0xf0,0x0, 0xa8,0x9c,0xe0,0x1b,0x14,0xe0, +0xf0,0x0, 0xa9,0x2c,0xf0,0x1b,0x13,0x61,0xf0,0x0, 0xa9,0xbc,0xe0,0x1b,0x14,0x64, +0xf0,0x0, 0xaa,0x4c,0xe7,0xef,0x16,0x7f,0xb5,0x1d,0xf0,0x16,0x3b,0x1f,0x97,0x5d, +0xe8,0x0, 0x8d,0x5, 0x3c,0x1f,0x3c,0x9f,0x3f,0x5c,0xe0,0x1b,0xc7,0xe5,0xe8,0x0, +0x8e,0x7, 0xf7,0xf7,0x13,0xff,0x35,0x28,0x8c,0x89,0xe8,0xe, 0x3f,0x57,0xf0,0x0, +0x83,0x88,0x84,0xf, 0xe7,0xfe,0x17,0xff,0xe8,0x0, 0x8d,0x86,0x3f,0xde,0xe0,0xe, +0x3e,0x4a,0xe7,0xff,0x16,0x3f,0x34,0xa8,0x3f,0xdc,0x3d,0xc9,0xb7,0xdd,0xb5,0xad, +0xb7,0x3d,0xf0,0x1, 0xab,0x8d,0xe0,0x1, 0xac,0x1d,0xef,0xff,0xd0,0xfd,0xde,0x7f, +0xdf,0x2c,0xdf,0x3f,0xe0,0x1, 0xd8,0x2a,0xef,0xfe,0xdf,0x3c,0xa, 0x21,0xe0,0x11, +0x0, 0x99,0xe0,0x1, 0x1f,0x89,0x8f,0xf, 0xe0,0x1, 0x1f,0x88,0x37,0x28,0x8f,0x8f, +0x3f,0xce,0xe2,0x1, 0xcf,0xdf,0x3c,0x6f,0x2, 0x83,0xe0,0x1, 0x14,0x60,0x34,0x45, +0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x0, 0x0, 0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0xe0,0x0, +0x24,0x4e,0xe0,0x1, 0x1f,0xc2,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0x16,0x1, 0xe0,0xe, +0x8c,0x9f,0xf0,0xe, 0x8a,0x2f,0x3e,0x18,0xe0,0x0, 0x1f,0x8d,0x14,0x0, 0x36,0x21, +0xf7,0xff,0x12,0xfd,0xf7,0xff,0x11,0xfd,0xf0,0x15,0x3a,0x99,0xf8,0x13,0x39,0x94, +0xc4,0xff,0xf1,0xff,0xc2,0x7f,0x3e,0x1f,0x3d,0xe8,0xf0,0x40,0x3b,0x68,0xf0,0x0, +0x13,0x81,0x0, 0x95,0xe8,0x40,0x3f,0x75,0x3, 0x17,0x15,0x81,0xe8,0x2a,0x3e,0x86, +0x2d,0x1e,0xe0,0x2e,0x3f,0x9, 0x2f,0x1b,0xe8,0x40,0x3e,0xf4,0xe8,0x40,0x3f,0x67, +0xc7,0x82,0xe0,0x6e,0x39,0xa8,0x3e,0x7f,0x3c,0x6e,0x1, 0x15,0x8f,0xf, 0x8e,0x9f, +0xe2,0x0, 0xcf,0x2, 0x2, 0xe8,0xe2,0x0, 0xce,0x82,0x5, 0x88,0xe8,0x40,0x3e,0xf3, +0xe8,0x40,0x3d,0x67,0xe0,0x6a,0x3b,0x2b,0x3d,0xea,0x2f,0x61,0xc7,0x82,0x3e,0x7f, +0x14,0x1, 0x1, 0xed,0x3c,0x5b,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3c,0xe0,0x3, 0x1a,0x99,0xdf,0xa9,0xe0,0x0, 0x19,0x8e,0xac,0x5, 0xf0,0x0, +0x8d,0x83,0x24,0x3, 0xf0,0x0, 0x2d,0xe6,0xe0,0x2, 0x1b,0xbc,0x17,0x80,0xaf,0x87, +0xaf,0x85,0xf0,0x0, 0x25,0xe3,0xf0,0x0, 0x15,0x80,0xe0,0x3, 0x1a,0x1c,0xf0,0x0, +0x1c,0x9a,0xe0,0x0, 0x1b,0xd, 0xf0,0x2, 0x1c,0x5e,0xf0,0x2, 0x1d,0x7f,0xe8,0x40, +0x39,0x6b,0x0, 0x8b,0xe8,0x0, 0x8f,0x8a,0x3f,0xf2,0x1, 0x9, 0xc1,0x1, 0x8f,0x83, +0xe2,0x1, 0xc1,0x7f,0x3f,0xf2,0x5, 0xb9,0x8f,0x84,0x2f,0xf5,0xe8,0x0, 0x8f,0x89, +0x2f,0xf6,0x3c,0x62,0xe0,0x1, 0xda,0x10,0xe0,0xf, 0x31,0x21,0x3f,0x96,0xf0,0x40, +0x3e,0x68,0x8c,0x9f,0x8c,0xf, 0xe0,0x1, 0xda,0x19,0xe0,0x43,0x3c,0x18,0xf0,0x40, +0x3e,0x78,0x4, 0x65,0x3c,0x62,0xe0,0x1, 0xd9,0xd8,0x24,0x61,0x17,0x8a,0x3f,0xb2, +0x17,0xa, 0xe0,0x0, 0xc7,0xfc,0x3f,0x96,0xe8,0xe, 0x3f,0x3b,0x94,0x8f,0x95,0x1f, +0x95,0xaf,0x96,0x3f,0x96,0xcf,0xe8,0xf, 0x3f,0x18,0xb4,0x8f,0xc1,0x1, 0xb5,0x1f, +0xe2,0x1, 0xc1,0x7f,0xb5,0xaf,0xf0,0x0, 0xc5,0x81,0xb6,0x3f,0xf2,0x1, 0xc5,0xff, +0xb6,0xcf,0x8f,0x83,0x3f,0xf2,0x2, 0xc9,0x87,0x5, 0xaf,0x7, 0xe0,0x0, 0x1f,0x7, +0xaf,0x8e,0xe0,0x2, 0x1f,0xdf,0xf0,0x0, 0xad,0x8f,0xf8,0x0, 0xe, 0x28,0xb, 0xe1, +0xe0,0x2, 0x1b,0xbc,0xe7,0xff,0x0, 0xa1,0xe8,0x40,0x3f,0xeb,0x0, 0xee,0xe7,0xff, +0x0, 0x87,0x0, 0x0, 0xe0,0x0, 0x1f,0x97,0xe0,0x0, 0x1d,0x96,0x16,0x7f,0x17,0x0, +0x16,0x83,0xae,0xf, 0xc7,0x84,0x3f,0xfb,0xe0,0x40,0xaf,0x3f,0xe0,0x40,0xae,0xaf, +0xe0,0x40,0xaf,0x1f,0x1, 0xf7,0x38,0x82,0xe0,0x0, 0x1f,0x8e,0x8f,0x8f,0x2f,0x86, +0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x2f,0x82,0x0, 0xe6,0x38,0x82,0xe0,0x3, 0x1f,0x4, +0x3f,0xe8,0x94,0x5e,0xe2,0x10,0xc4,0x0, 0x24,0xc, 0xe0,0x0, 0x1f,0x8e,0x14,0x0, +0x8f,0x8f,0x2f,0x86,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0xe0,0x1, 0x27,0x87,0x38,0x82, +0xe2,0x0, 0xcd,0xa, 0x2, 0xfd,0xf0,0x0, 0x1b,0x97,0x35,0x22,0xf0,0xe, 0x3b,0x9a, +0xe0,0x43,0x3c,0xf, 0x17,0x83,0xaf,0xae,0x3f,0x68,0xf0,0x2, 0x1b,0x7d,0xe0,0x1, +0x1f,0xf2,0xe8,0x0, 0x8d,0xd6,0xa6,0xf, 0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4, +0x5, 0x10,0x3e,0xee,0xe2,0x1, 0xc6,0xff,0x17,0x7f,0x3f,0x1d,0xe0,0x43,0x3f,0xe, +0xe0,0xf, 0x3f,0x3b,0xe2,0x0, 0xcf,0x0, 0x3f,0x99,0x37,0xa1,0x3f,0x9c,0x3, 0x6e, +0xf8,0x0, 0x8a,0xe6,0xf8,0x43,0x3b,0x5, 0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4, +0x5, 0x10,0x3f,0x68,0xe2,0x1, 0xc7,0x7f,0x14,0x1, 0x3c,0x1e,0xe0,0x43,0x3c,0x8, +0xe0,0xf, 0x3c,0x3b,0xf0,0x40,0x3b,0x78,0x3f,0x99,0x37,0xa1,0x3f,0x9c,0x2, 0x6e, +0xf1,0xff,0xc2,0xff,0xf0,0x40,0x3a,0xfe,0xe0,0x0, 0x1, 0x47,0x2e,0xb8,0xe0,0x43, +0x3c,0x89,0x3e,0xbb,0x3f,0xe9,0x0, 0x85,0x97,0xe, 0xe2,0x3, 0xcf,0x74,0x5, 0xf, +0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0x17,0xff,0x3f,0x98,0xe0,0x43,0x3f,0x8f,0xe0,0xe, +0x3f,0x9d,0xe2,0x0, 0xcf,0x80,0x37,0x21,0x3f,0x1c,0x3, 0x6f,0xe0,0x43,0x3d,0x8b, +0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4,0x5, 0xe, 0x3f,0x69,0xe2,0x1, 0xc7,0x7f, +0x14,0x81,0x3c,0x9e,0xe0,0x43,0x3c,0x89,0xe0,0xf, 0x3c,0x9d,0x3d,0xf9,0x37,0xa1, +0x3f,0x9c,0x2, 0x70,0x3f,0x28,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x3, 0x5, 0x97, +0xe8,0xa, 0x3d,0x17,0x17,0x81,0xaf,0x9a,0x14,0x1, 0x38,0x82,0xe8,0xa, 0x3d,0x17, +0x17,0x80,0xaf,0x9a,0x14,0x0, 0x38,0x82,0x8, 0xb1,0xc0,0x7c,0x7c,0x1, 0xdf,0x4b, +0x64,0x1, 0xc0,0x4, 0x8, 0xe1,0x3e,0xee,0xe7,0xff,0x0, 0xbb,0xf0,0xf, 0x3b,0x9a, +0x8f,0x1f,0x27,0x6d,0x17,0x1, 0xaf,0x1f,0x14,0x1, 0x38,0x82,0xe0,0x0, 0x1f,0x8e, +0x14,0x0, 0xf0,0x0, 0x8b,0x8f,0xf2,0x0, 0xcb,0x84,0xe0,0x0, 0x2, 0xee,0xe0,0x1, +0x1f,0x89,0xe0,0x0, 0x1f,0xd, 0x8e,0x8f,0xe0,0x1, 0x1f,0x88,0x36,0xa8,0x8f,0x8f, +0xe0,0x1a,0x96,0x7e,0x3f,0xcd,0x3e,0x7f,0xe0,0x0, 0x5, 0x5f,0xf0,0x0, 0x23,0xde, +0x8, 0xb1,0xf0,0x0, 0x13,0x7f,0x3d,0x68,0x3c,0xe8,0xf8,0x40,0x3a,0xe6,0x8f,0x8e, +0xe8,0x40,0x3e,0x65,0x8e,0x9e,0xe2,0x1, 0xc6,0x7f,0x3f,0xfc,0xc4,0x1, 0x38,0xe9, +0xf8,0x40,0x38,0x66,0xf0,0x40,0x38,0xea,0xe4,0xb, 0x37,0xa8,0xe4,0xc, 0x36,0xa8, +0xe2,0x1, 0xc0,0xff,0xf2,0x1, 0xc0,0x7f,0xf2,0x1, 0xc0,0xff,0xe2,0x1, 0xc4,0x7f, +0xf0,0x40,0x39,0x6f,0xe4,0xb, 0x35,0xc8,0xf0,0x40,0x39,0xed,0xf0,0x40,0x3a,0x6d, +0xe4,0xc, 0x36,0x48,0xc7,0x2, 0x5, 0x83,0xf8,0x40,0x39,0x65,0x3d,0xf1,0xf8,0x40, +0x3a,0xe2,0xf2,0x1, 0xc2,0xff,0x3, 0x82,0x3f,0xe9,0xe8,0x40,0x3e,0xf0,0x3c,0xef, +0xe2,0x1, 0xc4,0xff,0x5, 0x83,0xf8,0x40,0x39,0xe6,0xe8,0x40,0x3e,0x71,0xf8,0x40, +0x3b,0x63,0xf2,0x1, 0xc3,0x7f,0x3, 0x83,0xf0,0x40,0x3a,0x6a,0xf0,0x40,0x3b,0xf8, +0xe8,0x40,0x3d,0x64,0xe2,0x1, 0xc5,0x7f,0xe7,0xff,0x1, 0xbb,0xe8,0x9, 0x3c,0xa5, +0xe8,0xa, 0x3d,0x26,0xe2,0x0, 0xcc,0x84,0x17,0x84,0xe0,0x2a,0x3f,0xaa,0x14,0x0, +0xe0,0x68,0x3d,0x2a,0x8, 0xe1,0x38,0x82,0x14,0x1, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3a,0xc0,0x7c,0xe0,0x3, 0x19,0x84,0xe0,0x2, 0x1a,0xfd,0x97,0xd3,0xe0,0x0, +0x1b,0xe, 0x86,0x45,0x8e,0xd5,0x17,0x0, 0xe2,0xff,0xc7,0xff,0x8d,0x86,0x6f,0x4, +0xb7,0xd3,0x6f,0x5, 0x6e,0x6, 0x6e,0x87,0xe0,0x1, 0x25,0xfb,0xe0,0x1, 0x1f,0xd7, +0xe0,0x0, 0x19,0xd, 0xf0,0x0, 0x94,0x2f,0x93,0xdf,0xf0,0x1, 0x1d,0x72,0x12,0x0, +0x0, 0x89,0xf8,0x40,0x3c,0x79,0x4, 0x1e,0x8d,0x86,0x8e,0xd5,0x3a,0x7b,0xe0,0x1, +0x3, 0xed,0xe0,0xf, 0x32,0x21,0x3f,0x92,0x8c,0x8f,0x8d,0x1f,0x3e,0xb9,0xe8,0x0, +0xa7,0x8a,0x3e,0x9a,0x36,0xa1,0x3e,0x9f,0xe2,0x0, 0x7c,0x4, 0xf0,0x0, 0x94,0x8d, +0xc2,0x1, 0xef,0xff,0xd7,0xf6,0xe2,0x1, 0xc2,0x7f,0x2c,0x64,0xe8,0x40,0x3b,0xf9, +0x3, 0x64,0x8d,0x86,0x8e,0xd5,0x16,0x1, 0xe0,0x1a,0x9a,0x52,0xe0,0x1a,0x9f,0xe2, +0x97,0x53,0x9d,0x23,0x3f,0x94,0x36,0x2f,0xe2,0xf7,0xc7,0x7f,0xe0,0x2f,0x3f,0x9a, +0x37,0xaa,0x3f,0x4c,0xe0,0x3, 0x1a,0x8c,0x3f,0x4f,0xe0,0x4, 0xcf,0x0, 0x8f,0x85, +0xb7,0x53,0x27,0xbb,0xe0,0x2, 0x1e,0x27,0xe0,0x1, 0x1c,0xf2,0x8f,0xc, 0x8d,0x1c, +0x3f,0x3d,0xa4,0x9, 0x3f,0x1a,0x37,0x21,0xe0,0x2, 0x1d,0x30,0x3f,0x18,0x94,0x8a, +0x97,0xe, 0x9b,0x93,0x3f,0x29,0xe0,0x43,0x3f,0x1e,0xe4,0x9, 0x37,0xf, 0xe2,0xe, +0x3c,0xce,0x3f,0x29,0x3f,0x77,0xe0,0x0, 0x2, 0x78,0x13,0x7f,0x3b,0x1f,0xe2,0x1, +0xc3,0x7f,0x33,0x21,0x3b,0x1c,0x0, 0x95,0x8f,0x2f,0x8f,0xbf,0x3f,0x3d,0xe0,0x80, +0x94,0x9a,0x3f,0x1f,0x37,0x21,0x3f,0x18,0x97,0x8e,0x3f,0xa9,0xe0,0x43,0x3f,0x9f, +0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x3f,0xae,0x3f,0xf7,0xe0,0x0, 0x2, 0x5d, +0x3b,0x7c,0x3f,0xec,0xc6,0x2, 0x1, 0xe9,0x17,0x81,0x2d,0x82,0xad,0x85,0xe7,0xfb, +0x17,0x7f,0x92,0xd3,0x37,0xa9,0x3a,0xde,0x3a,0xcf,0xe7,0x7f,0x17,0xff,0x3a,0xdf, +0xe0,0x0, 0x1f,0x8c,0x8f,0x8f,0xb2,0xd3,0x27,0xa9,0xe0,0x1b,0x97,0x92,0xe0,0x17, +0xc7,0xb7,0xe3,0xff,0xc7,0xff,0xe2,0x14,0xcf,0xd8,0x2, 0x8c,0xe0,0x2, 0x1f,0xc0, +0xe0,0xa, 0x8f,0x8f,0xe0,0x0, 0x2f,0xe5,0xde,0xd2,0x2c,0x4, 0xe0,0x80,0xca,0x80, +0xb2,0xd3,0x16,0x83,0xe0,0x1, 0x1f,0xd7,0xe0,0x1b,0x97,0x42,0x97,0xef,0xe4,0x0, +0xc7,0x8a,0xe2,0x0, 0xcf,0x80,0x3e,0x9f,0xe0,0x6f,0x3c,0x2d,0x37,0x82,0x3f,0x7f, +0x3, 0x5, 0x97,0xd3,0xe0,0x40,0xcf,0x80,0xb7,0xd3,0x97,0xd3,0xe3,0xdf,0xc7,0xff, +0xb7,0xd3,0xe7,0xef,0x16,0xff,0xe0,0x2, 0x1f,0x7c,0x97,0xd3,0x9f,0xe, 0x3f,0xdd, +0x37,0x42,0xe7,0xfd,0x16,0xff,0x3f,0xdd,0x3f,0x74,0xb7,0xd3,0x4, 0x85,0xe0,0x1a, +0x9f,0xe2,0x3f,0xfe,0x5, 0x85,0x97,0xd3,0xe0,0x2, 0xcf,0x80,0xb7,0xd3,0xc0,0x4, +0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0x25,0xa0,0x13,0xff,0x3b,0x9b,0xe2,0x1, 0xc3,0xff, +0xc3,0x81,0x33,0xa1,0xe0,0x0, 0x1f,0xd, 0xe0,0x2, 0x1b,0x2f,0xe0,0x2, 0x1e,0x27, +0x3b,0x92,0x8c,0x8e,0x8d,0x1e,0xe0,0xf, 0x3c,0xbd,0xc7,0x2, 0x3f,0x9a,0x37,0xa1, +0x3f,0x98,0x97,0x8f,0xc6,0x2, 0x3f,0x77,0xe0,0x40,0xac,0xac,0xe0,0x40,0xad,0x1c, +0xe0,0x80,0xb7,0x96,0x1, 0xef,0xad,0x85,0x17,0x80,0xe7,0xff,0x0, 0x88,0xe0,0x0, +0x19,0xd, 0x3e,0x6b,0xe7,0xfe,0x0, 0xb2,0x16,0x0, 0xe7,0xfe,0x0, 0xaf,0xe0,0x2, +0x1f,0xf7,0x17,0x7, 0xaf,0xf, 0x17,0x0, 0xe0,0x1, 0x1f,0xe9,0xaf,0xf, 0xe7,0xff, +0x0, 0xb2,0x0, 0x0, 0x8, 0xb7,0xc0,0x70,0xea,0x4e,0x7f,0xe4,0xe9,0xff,0xc7,0xff, +0xf0,0x0, 0x83,0xf, 0xf0,0x0, 0x83,0x9f,0x83,0xaf,0x83,0x3f,0x82,0xcf,0x82,0x5f, +0x81,0xef,0x81,0x7f,0xe0,0x1, 0x84,0xf, 0xe0,0x1, 0x84,0x9f,0xe0,0x1, 0x85,0x2f, +0xe0,0x1, 0x85,0xbf,0xe0,0x1, 0x86,0x4f,0xe0,0x1, 0x86,0xdf,0xe0,0x1, 0x87,0x6f, +0xe0,0x1, 0x87,0xff,0xf0,0x0, 0x6b,0x4, 0x6f,0x93,0xe0,0x0, 0x1f,0x8e,0xf0,0x0, +0x6b,0x85,0x6b,0x86,0x6b,0x7, 0x6a,0x88,0x6a,0x9, 0x69,0x8a,0x69,0xb, 0x6c,0xc, +0x6c,0x8d,0x6d,0xe, 0x6d,0x8f,0x6e,0x10,0x6e,0x91,0x6f,0x12,0x8f,0x8f,0xe0,0x1, +0x27,0x9c,0xe0,0x2, 0x1f,0xdd,0x89,0x8f,0xe0,0x1, 0x29,0x97,0xe0,0x0, 0x1b,0xd, +0xf0,0x2, 0x1a,0xfd,0xe0,0x1, 0x1f,0xf2,0x89,0x16,0x8b,0x86,0xe8,0x0, 0x8a,0xd5, +0xf7,0xff,0x13,0xff,0xf7,0xff,0x13,0x7f,0x14,0x81,0xa2,0xf, 0xe0,0x43,0x3e,0x97, +0x3d,0x63,0xf0,0x17,0x3b,0x92,0xf0,0x16,0x3b,0x15,0x3c,0x92,0xe0,0xb, 0x3e,0xb5, +0xe8,0x40,0x3f,0x67,0xe0,0xc, 0x3d,0x92,0x36,0x21,0x3e,0x14,0x96,0xc, 0x3f,0xe9, +0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0x3f,0x1b,0x3f,0x9b,0xe2,0x1, 0xce,0x20, +0x37,0x21,0x37,0xa1,0xc6,0xff,0x16,0x1, 0x3f,0x14,0x3f,0x94,0xe0,0x43,0x3e,0x9d, +0x3e,0x13,0x5, 0x18,0x21,0x8, 0x94,0xe, 0x39,0xec,0x3d,0x18,0xe2,0x1, 0xc1,0xff, +0xe0,0x43,0x3d,0x1a,0xe8,0x40,0x39,0x76,0x17,0x1, 0x3f,0x13,0x3, 0x8, 0x94,0xf, +0x39,0xee,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0xe3,0xff,0xce,0xff, +0x1, 0xce,0xf8,0x0, 0x8b,0x45,0x16,0x1, 0xf7,0xff,0x13,0xff,0xf7,0xff,0x12,0xff, +0x14,0x81,0x3e,0x17,0xf0,0x17,0x3b,0x92,0xf0,0x15,0x3a,0x95,0x3c,0x92,0x3f,0xec, +0xe2,0x1, 0xc7,0xff,0xe0,0xd, 0x3f,0xb5,0xe8,0x40,0x3f,0x67,0x3f,0xe9,0xe2,0x1, +0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0xe0,0xb, 0x3e,0x92,0x3f,0x1d,0x3f,0x9d,0xe0,0x43, +0x3e,0x9c,0xe8,0x40,0x3e,0xf6,0x35,0xa1,0x37,0x21,0x37,0xa1,0xf0,0x0, 0x12,0x1, +0x3d,0x94,0x3f,0x14,0x3f,0x94,0xc6,0x1, 0xf0,0x14,0x3a,0x13,0x3, 0x24,0x96,0x8b, +0xe3,0xff,0xc6,0x7f,0xe2,0x1, 0xce,0xa0,0x5, 0x1e,0x21,0x9, 0x94,0xe, 0xe8,0x40, +0x39,0xe4,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0xe8,0x40,0x39,0x75, +0x17,0x1, 0x3f,0x13,0x3, 0x4d,0x94,0xf, 0x39,0xee,0x3d,0x18,0xe2,0x1, 0xc1,0xff, +0xe0,0x43,0x3d,0x1a,0x0, 0xc5,0xea,0x12,0x7f,0xa7,0x17,0x0, 0xaf,0xf, 0x14,0x0, +0xc0,0x10,0xb, 0xe1,0xe4,0x8, 0x35,0xf, 0xe2,0xa, 0x3c,0x4a,0x3c,0xe3,0xe0,0x8, +0x3d,0x28,0xe0,0x4, 0xdc,0xd, 0xe2,0x0, 0xcc,0x64,0x2, 0x6e,0x29,0xe, 0xe0,0x0, +0x1f,0xc, 0xea,0x12,0x7f,0xa7,0x16,0x81,0x8f,0xe, 0xae,0x8f,0x14,0x1, 0x27,0x69, +0x17,0x3, 0xaf,0xf, 0x14,0x3, 0x0, 0xe5,0x16,0xff,0x3e,0x95,0x39,0x7d,0x1, 0x70, +0x17,0xff,0x3a,0xb7,0x3f,0x92,0xe2,0x0, 0xc9,0x8f,0xe2,0x1, 0xc7,0xff,0x16,0x3, +0x3f,0x95,0x17,0x0, 0xe0,0x6e,0x3a,0xac,0x37,0xa1,0x39,0x7d,0x3f,0x94,0x96,0xf, +0xe0,0x0, 0x4, 0x4d,0x17,0x84,0x15,0xf4,0x36,0x1, 0x3f,0x90,0xe0,0xb, 0x3d,0x90, +0xe0,0x1, 0x86,0xef,0x3e,0xfc,0x5, 0x6, 0xe0,0x1, 0x86,0xff,0x3f,0x1d,0xe3,0xff, +0xc7,0x7f,0xc7,0xfe,0x3d,0xff,0x1, 0xf5,0x39,0x15,0x31,0x21,0x3a,0x12,0x97,0x84, +0x16,0xa8,0xe4,0xc, 0x37,0x8f,0xe2,0xf, 0x3e,0x4f,0x3e,0x9e,0x3f,0xac,0xe2,0xb, +0xcf,0xdd,0x3f,0xed,0xe3,0xff,0xc7,0xff,0xe0,0x1a,0x96,0x76,0xe0,0x0, 0x1e,0xa1, +0xe0,0x6e,0x3b,0x2f,0x17,0xa8,0xe2,0xb, 0xce,0x5d,0x3f,0x9e,0x8e,0xd, 0xe3,0xff, +0xc7,0xff,0xe0,0x6e,0x3b,0x2f,0xe2,0x0, 0xce,0x1, 0x1, 0x25,0x3f,0xee,0xe3,0xff, +0xc7,0xff,0xe2,0x1, 0xcf,0xfa,0x2, 0x8f,0xea,0x12,0x7f,0xa7,0x8c,0xf, 0xe3,0xff, +0xc7,0x7f,0x3f,0x78,0xe7,0xff,0x5, 0x8e,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0xac,0xf, +0xe7,0xff,0x0, 0x88,0xe0,0x1, 0x17,0x7a,0x0, 0xf0,0x17,0x81,0x3f,0x92,0xe2,0x1, +0xc7,0xff,0x3f,0x95,0x37,0xa1,0x3f,0x94,0x97,0x8f,0x3e,0x1f,0xe0,0x43,0x3e,0x1c, +0xe7,0xff,0x0, 0xaa,0xc7,0x28,0x17,0x80,0xaf,0x8d,0xe3,0xff,0xc7,0x7f,0x0, 0xd7, +0x8, 0xb6,0xe0,0x2, 0x19,0xc0,0xe0,0x3, 0x1a,0x2e,0xe0,0xa, 0x8f,0x83,0x17,0x1, +0xe2,0x0, 0xcf,0x81,0xaf,0x4, 0xe0,0x0, 0x1, 0x62,0xe0,0x1, 0x1b,0x7, 0xe0,0x1, +0x19,0x57,0x8f,0x86,0xe0,0x0, 0x12,0xee,0x37,0xc1,0xaf,0x92,0xb2,0x92,0xb2,0xa2, +0xef,0xfb,0xd3,0xd8,0xe0,0x0, 0x1f,0x8e,0xe0,0x0, 0x1f,0xd, 0x8f,0x8f,0x2f,0xaf, +0x17,0x80,0xaf,0x84,0xe0,0x1, 0x1f,0x89,0x8d,0xf, 0xe0,0x1, 0x1f,0x86,0x35,0x28, +0x8d,0x8f,0xe0,0x1, 0x1f,0x85,0x35,0xa8,0x8e,0xf, 0xe0,0x1, 0x1f,0x88,0x36,0x28, +0x8e,0x8f,0xe0,0x1, 0x1f,0x84,0x3e,0xca,0x8f,0xf, 0xe0,0x1, 0x1f,0x83,0x3f,0x4b, +0x8f,0x8f,0xe0,0x43,0x3f,0x1e,0x3f,0xcc,0xe0,0x43,0x3f,0x9f,0xe0,0xc, 0x36,0xc5, +0x85,0x6, 0xae,0x3, 0xe0,0x41,0x3d,0xcf,0xe0,0xc, 0x37,0x5, 0xad,0x12,0xb6,0x92, +0xb7,0x22,0xb7,0xf2,0xe0,0x1, 0xb5,0x82,0xae,0x13,0xb, 0x61,0xe2,0x0, 0xcf,0x88, +0x5, 0xa0,0xe0,0x1a,0x97,0xfe,0xe2,0x2, 0xcf,0xab,0x2, 0x32,0x8f,0x86,0x17,0x3, +0x37,0xc1,0xaf,0x92,0xe0,0x1, 0x17,0x96,0xaf,0x3, 0xb7,0xf2,0xe7,0xfe,0x17,0xea, +0xb2,0x92,0xb2,0xa2,0xe0,0x1, 0xb7,0x82,0xaf,0x13,0x8f,0x84,0xe7,0xff,0x27,0xbc, +0xe0,0x0, 0x1f,0xce,0x17,0x1, 0xaf,0xf, 0xb, 0x61,0x17,0x80,0xaf,0x84,0xb, 0x61, +0xe2,0x0, 0xcf,0x86,0x2, 0x93,0xe2,0x0, 0xcf,0x84,0x2, 0xa6,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x5, 0xa8,0xe0,0x1a,0x97,0xfe,0xe2,0x5, 0xcf,0xbb,0xe7,0xff,0x2, 0x22, +0x17,0x84,0x86,0x86,0xe0,0x1, 0x17,0x1b,0x0, 0x8a,0xe0,0x1a,0x97,0xfe,0xe2,0x3, +0xcf,0x8f,0x2, 0x14,0x86,0x86,0x17,0x83,0xe0,0x0, 0x17,0x78,0xaf,0x83,0xb7,0x12, +0xb7,0x22,0xe0,0x1, 0x17,0x20,0xb7,0x72,0xe7,0xfe,0x17,0x60,0xae,0x92,0xe0,0x1, +0xb7,0x2, 0xaf,0x93,0x0, 0xcb,0xe0,0x1a,0x97,0xfe,0xe2,0x3, 0xcf,0xf3,0x2, 0x5d, +0x17,0x84,0x86,0x86,0xe0,0x1, 0x17,0x7, 0x0, 0xea,0x8, 0xb4,0xe0,0x2, 0x19,0xc0, +0xe0,0xa, 0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x0, 0xe0,0x1, 0x19,0x57, +0xe0,0x3, 0x8f,0xe2,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x4f,0xe0,0x3, 0x1a,0x2e, +0x17,0xff,0xaf,0x84,0xdf,0x46,0x8f,0x84,0xe0,0x1, 0x27,0x99,0xe0,0x1, 0x8f,0xb3, +0x27,0xa1,0x9f,0x12,0x97,0xa2,0x96,0xf2,0xe4,0x0, 0xc7,0xa, 0xe4,0x0, 0xc7,0x8a, +0x37,0x3, 0xe4,0x0, 0xc6,0x8a,0xe3,0xff,0xc7,0x7f,0x37,0x83,0xe0,0x43,0x3e,0x1f, +0x36,0x83,0xe0,0xb, 0x37,0x45,0xad,0x83,0xe0,0x41,0x3f,0xcf,0xe0,0x41,0x3d,0x4d, +0xe0,0xb, 0x36,0x5, 0xb7,0x12,0xb6,0x22,0xb7,0xb2,0xb6,0xf2,0xe0,0x1, 0xb5,0x2, +0xad,0x93,0x8f,0xc3,0xe2,0x1, 0xcf,0xaa,0x1, 0x13,0xe0,0x1, 0x1f,0x82,0x8e,0xf, +0xe0,0x1, 0x1f,0x81,0x36,0x28,0x8e,0x8f,0xe0,0x1, 0x1f,0x80,0x36,0xa8,0x8f,0xf, +0xe0,0x0, 0x1f,0xff,0x3f,0x4c,0x8f,0x8f,0xb7,0x42,0x3f,0xcd,0xb7,0xd2,0xe0,0x0, +0x1f,0xfe,0x8f,0xf, 0xe0,0x0, 0x1f,0xfd,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xe0,0x41, +0x3f,0xcf,0xb7,0xb2,0xa, 0x61,0xe0,0x0, 0x1f,0xfc,0xe0,0x1, 0x1f,0x3, 0x8e,0xf, +0xe0,0x1, 0x1f,0x85,0x8f,0xe, 0x8e,0x8f,0xe0,0x0, 0x1f,0xfb,0x36,0xa8,0x8f,0x8f, +0x3f,0x4d,0x16,0x84,0x36,0x28,0xae,0x83,0xe0,0x1, 0x16,0x96,0xe0,0x1, 0x1d,0x87, +0x3f,0xcc,0xb6,0x92,0xe0,0x0, 0x16,0xf8,0xe0,0x41,0x3f,0xcf,0x85,0x8b,0xb6,0xa2, +0x16,0x0, 0xe0,0x3, 0x1e,0xae,0xe0,0x1, 0xb7,0x82,0x17,0x83,0xad,0x92,0xae,0xd, +0xb7,0x72,0xaf,0x93,0xe7,0xff,0x0, 0x94,0xe0,0x0, 0x1f,0xfc,0xe0,0x1, 0x1f,0x3, +0x8e,0xf, 0xe0,0x1, 0x1f,0x85,0x8f,0xe, 0x8e,0x8f,0xe0,0x0, 0x1f,0xfb,0x36,0xa8, +0x8f,0x8f,0xe0,0x1, 0x19,0x57,0x3f,0x4d,0x16,0x89,0x36,0x28,0xae,0x83,0xe0,0x2, +0x16,0xac,0xe0,0x1, 0x1d,0x87,0x3f,0xcc,0xb6,0x92,0xe0,0x2, 0x16,0x8e,0xe0,0x41, +0x3f,0xcf,0x85,0x8b,0xb6,0xa2,0x16,0x0, 0xe0,0x3, 0x1e,0xae,0xe0,0x1, 0xb7,0x82, +0x17,0x88,0xad,0x92,0xae,0xd, 0xb7,0x72,0xaf,0x93,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f, +0xe7,0xfe,0x2f,0xe6,0xe0,0x3, 0x8f,0xe2,0xe7,0xfe,0x2f,0xe2,0xe0,0x0, 0x1f,0xfa, +0x8f,0xf, 0xe0,0x0, 0x1f,0xf9,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xb7,0x92,0xe7,0xfe, +0x0, 0xd7,0x8, 0xb4,0x17,0x9c,0xe0,0x2, 0x19,0xac,0x3f,0xb8,0x3a,0x68,0x3f,0x93, +0xe0,0x1, 0x8c,0xf, 0xe0,0x2, 0x1f,0x9e,0x11,0x1, 0xa9,0xf, 0xef,0xfc,0xd6,0x7b, +0xe0,0x0, 0x1f,0xb3,0xaa,0x3, 0xa9,0xf, 0xa, 0x61,0xe0,0x1, 0x1e,0xc7,0x17,0x0, +0x3f,0xed,0xe1,0x80,0xb7,0x1f,0xc7,0x82,0xb7,0x1d,0xe1,0x80,0xb7,0x1f,0xb7,0xf, +0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xe1,0xff,0xc0,0x8, 0xe0,0x2, +0x1f,0x66,0xe0,0x2, 0x1f,0xfd,0x87,0xe, 0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, +0x3e,0xfe,0x3a,0x68,0xe0,0x0, 0x1, 0x68,0x8b,0xf, 0xf0,0x0, 0x8e,0x2f,0x3c,0x64, +0xe0,0x0, 0xd6,0x38,0xf0,0x0, 0x26,0x52,0x13,0xff,0xe8,0x7, 0x3b,0x9c,0x11,0xff, +0xe2,0x1, 0xc3,0xff,0x39,0x96,0xe0,0x4c,0xc3,0xa7,0xe2,0x1, 0xc1,0xff,0xf0,0x0, +0x14,0x4, 0xe0,0x1, 0x1f,0xff,0xf0,0x18,0x3c,0x10,0x33,0xa1,0x31,0xa1,0xe0,0x1, +0x1a,0xe4,0x3b,0x9f,0xf0,0x1c,0x36,0x21,0xe8,0x3, 0x39,0x98,0xf0,0x0, 0x15,0x3, +0xf0,0x0, 0x14,0xda,0xf0,0x0, 0x15,0x80,0xe0,0x80,0x97,0x95,0xe8,0x40,0x3c,0xea, +0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f,0xe0,0x8, 0x3f,0xa8,0xe0,0x4, 0xd9,0xb8, +0xe2,0x0, 0xcc,0x5a,0xe8,0x40,0x3d,0x69,0xe0,0x6a,0x3b,0x28,0xe3,0xff,0xc5,0x7f, +0x23,0x21,0x11,0x2, 0x39,0x10,0x3f,0x62,0x3f,0xe4,0x96,0x8f,0xe8,0xf, 0x3f,0x9c, +0xe0,0x80,0xb6,0x9e,0x3f,0x73,0x1, 0xfa,0x3c,0xe6,0xe8,0x40,0x3c,0x68,0xe0,0x0, +0xd6,0x2f,0x3f,0xe4,0xe0,0x80,0x97,0x12,0x39,0x73,0xb7,0xf, 0xe8,0xf, 0x3f,0x9c, +0x1, 0xfa,0x3a,0xf7,0xc2,0x2, 0x1, 0xd1,0xe0,0x0, 0xc0,0x78,0xf8,0x0, 0xe, 0x28, +0xb, 0xe1,0xe8,0x40,0x3c,0xeb,0xe8,0x40,0x3c,0x68,0xd6,0x19,0x3a,0xf7,0xc2,0x2, +0x1, 0xc4,0x0, 0xf3,0x8b,0x1f,0xf0,0x0, 0x8e,0x3f,0xe7,0xff,0x0, 0x9a,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe1,0xe6,0xc0,0x58,0x3b,0xe8,0x3c,0x69,0x3b,0x69, +0xef,0xfe,0xd8,0x4b,0xe2,0x0, 0xcb,0x1, 0xe0,0x1, 0x1, 0x4d,0xe0,0x3, 0x19,0x4, +0xe0,0x1, 0x19,0xc7,0x97,0xd2,0x17,0x0, 0xe3,0xff,0xc7,0xdf,0xb7,0x3, 0x3a,0xe8, +0xb7,0xd2,0x3c,0x66,0xef,0xfe,0xd8,0x39,0xe2,0x0, 0xcc,0x0, 0x12,0x2, 0x3f,0xe4, +0xe0,0x6f,0x39,0x28,0x3b,0xff,0x1, 0x6, 0xe0,0x19,0xc0,0x28,0xf8,0x0, 0xc, 0xa8, +0xb, 0xe1,0xe0,0x0, 0x1f,0xbf,0xe0,0x0, 0x1f,0x78,0x8f,0x8f,0x8f,0xe, 0x3f,0x7f, +0xe0,0x2, 0x1, 0x42,0xe0,0x0, 0x1f,0x77,0x8f,0xe, 0x3f,0x7f,0xe0,0x2, 0x1, 0x46, +0xe0,0x0, 0x1f,0x76,0x8f,0xe, 0x3f,0x7f,0xe0,0x2, 0x1, 0x44,0x17,0x80,0x3a,0x6f, +0xe2,0x0, 0xcb,0x2, 0xe0,0x1, 0x1, 0x63,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, 0x1f,0x2c, +0xe0,0x1, 0x1b,0x6e,0x3f,0x9e,0xf0,0x0, 0xa4,0x5f,0xa3,0xef,0xfb,0xe5,0x7c,0xf0, +0xe8,0x0, 0x8f,0x89,0x27,0x8c,0xe0,0x1, 0x22,0xcb,0xe0,0x1, 0x1c,0xf0,0xe0,0x1, +0x1c,0x7d,0xef,0xff,0xd3,0xa3,0x17,0x80,0xe8,0x0, 0xaf,0x89,0x15,0x81,0xe0,0x1, +0x1d,0x7e,0xe0,0x1, 0x1c,0xfd,0xe2,0x0, 0x7c,0x6, 0xef,0xff,0xd3,0x78,0xe0,0x2, +0x1f,0xfc,0x15,0x8c,0x9f,0x8f,0xe0,0x1, 0x1c,0xfd,0x3d,0x9f,0xe0,0x1, 0x1d,0x7e, +0xe3,0xff,0xc5,0xff,0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3c,0x9e,0xe0,0xc, 0x3d,0x1e, +0x96,0x8d,0x96,0xc, 0xc7,0x81,0xe2,0x0, 0x7c,0x6, 0xe3,0xff,0xc7,0xff,0x3f,0x18, +0x3e,0xac,0x3f,0xfb,0xb6,0x8e,0x1, 0xef,0x22,0xad,0xe0,0x2, 0x1f,0xea,0x8f,0x8f, +0x3f,0xf4,0xe0,0x1, 0x1, 0x53,0x3c,0xe6,0xe2,0xc, 0x7c,0x5a,0xe8,0x40,0x3d,0x68, +0xef,0xff,0xd3,0x2d,0xe0,0x1, 0x1c,0xf0,0x3d,0x67,0xe2,0x0, 0x7c,0x6, 0xef,0xff, +0xd3,0x26,0xe2,0xc, 0x7c,0xda,0x3c,0x69,0xe2,0x0, 0x7d,0x6, 0x15,0x81,0xef,0xff, +0xd3,0x3e,0xe0,0x1, 0x1d,0x7e,0xe0,0x1, 0x1c,0xfd,0xe2,0x0, 0x7c,0x6, 0x15,0x81, +0xef,0xff,0xd3,0x35,0xe2,0x0, 0x7d,0x6, 0xe2,0xc, 0x7c,0xda,0x3c,0x6a,0xef,0xff, +0xd3,0xe, 0xe2,0x0, 0x7c,0x6, 0xef,0xff,0xd3,0x67,0xe0,0x43,0x3f,0x98,0xe2,0x0, +0xcf,0x80,0xe0,0xff,0x17,0xff,0xe0,0x6f,0x3b,0x28,0x3c,0x6f,0xe0,0x0, 0x1f,0xf5, +0x8f,0x8f,0xb4,0x3, 0xe0,0xe, 0x37,0xa8,0xe0,0x0, 0x1f,0xf4,0x9e,0x83,0x8f,0x8f, +0x3f,0xce,0x3e,0xff,0x97,0xd2,0xe0,0x0, 0x5, 0xce,0xcf,0xa0,0xb7,0xd2,0xe7,0xfe, +0x2a,0xd5,0xe0,0x1, 0x1c,0xfe,0xe0,0x1, 0x1c,0x7d,0xef,0xff,0xd3,0x27,0xe7,0xfe, +0x0, 0xcd,0xe2,0x0, 0xcb,0x84,0xe7,0xfe,0x1, 0xc9,0xe0,0x1, 0x1c,0x63,0xde,0xa3, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0xe0,0x1, 0x1, 0xc, 0x97,0xde,0xc7,0x86,0xe3,0xff,0xc7,0xff, +0xe0,0x0, 0x27,0xd7,0xc7,0xff,0xe3,0xff,0xc7,0xff,0x17,0x0, 0x15,0x1, 0xe0,0x1, +0x1d,0xff,0x3d,0x1f,0x3e,0x6e,0x0, 0x91,0x9e,0x8f,0xe0,0x45,0x17,0xc2,0x3f,0x9e, +0x3e,0xfc,0x37,0xa1,0x3f,0x9b,0x5, 0x6, 0x96,0x8f,0x9e,0xf, 0xe2,0x0, 0xce,0x80, +0x5, 0x2e,0xc7,0x1, 0x3f,0x7a,0x1, 0x30,0xe0,0x45,0x17,0xc2,0x3f,0x9e,0x37,0xa1, +0x3f,0x9b,0x96,0x8f,0xe2,0x0, 0xce,0x80,0x2, 0x68,0x96,0x8f,0xe0,0x41,0x3e,0xcd, +0x0, 0xe5,0xe3,0xff,0xc7,0xdf,0xb7,0xd2,0xe7,0xff,0x0, 0xb3,0xe0,0x1, 0x1c,0x7d, +0x3c,0xe6,0xef,0xff,0xd2,0xdb,0xe7,0xfe,0x0, 0xb8,0x17,0x1, 0x3f,0x1f,0xe0,0x2, +0x1e,0xac,0xe4,0x0, 0xc7,0x1c,0xe4,0x0, 0xc7,0x9c,0x3f,0x1d,0x3f,0x9d,0xf0,0x0, +0xa4,0xe, 0xa3,0xef,0xe0,0x1, 0x1b,0x6d,0xe7,0xfe,0x0, 0x9a,0xe0,0x41,0x3e,0x4c, +0xe3,0xff,0xc6,0x7f,0x0, 0xcf,0xe0,0x43,0x3f,0x9c,0xe4,0x0, 0xc6,0x5, 0xe2,0x0, +0xcf,0x80,0xe3,0xff,0xc6,0x7f,0xe0,0xff,0x17,0xfb,0xe0,0x6f,0x3b,0x2c,0xe0,0x1, +0x1e,0xc7,0xe0,0x0, 0x1f,0x75,0x8f,0xe, 0xb7,0x8d,0x37,0x28,0xe0,0x0, 0x1f,0xf4, +0x9e,0x8d,0x8f,0x8f,0x3f,0xce,0x3e,0xff,0xe0,0x3, 0x1f,0x4, 0x97,0xde,0x5, 0x96, +0xcf,0xa0,0xb7,0xde,0xe7,0xfd,0x0, 0xca,0xe0,0x1, 0x1d,0x70,0x3c,0xe6,0xe2,0xc, +0x7c,0x5a,0x15,0x81,0xef,0xff,0xd2,0x7b,0xe2,0x0, 0x7c,0x86,0xe2,0xc, 0x7d,0x5a, +0x3c,0x69,0xef,0xff,0xd2,0x54,0xe7,0xfe,0x0, 0xc6,0xe3,0xff,0xc7,0xdf,0xb7,0xde, +0xe7,0xfd,0x0, 0xb4,0x12,0x0, 0x3f,0xe4,0xe7,0xfd,0x0, 0xcc,0x97,0xee,0xc7,0x86, +0xe3,0xff,0xc7,0xff,0xe7,0xfe,0x0, 0xf6,0x12,0x1, 0x3f,0xe4,0xe7,0xfd,0x0, 0xc2, +0x3f,0xe4,0xe7,0xfd,0x0, 0xbf,0xe0,0x1, 0x1f,0x4d,0xe0,0x1, 0x1f,0xc7,0x34,0x22, +0x3c,0x1e,0x9e,0x88,0x97,0x2f,0x16,0x7d,0xe2,0x0, 0xc6,0x82,0x3f,0x5c,0x3f,0x4d, +0xb7,0x2f,0x16,0x7e,0x96,0x88,0x97,0x2f,0xe2,0x0, 0xc6,0x81,0x3f,0x5c,0x3f,0x4d, +0xb7,0x2f,0xe4,0x0, 0xc4,0x85,0x9f,0x18,0xe0,0x3, 0x1e,0xb0,0xe4,0x0, 0xc7,0x5, +0x3c,0x9d,0x86,0x89,0xb7,0x1f,0xe0,0x0, 0x1f,0xbf,0xae,0x8f,0x38,0x82,0x0, 0x0, +0x8, 0xb3,0xe0,0x2, 0x19,0x2c,0x39,0xe8,0x8f,0xb2,0x2f,0xab,0xe0,0x0, 0x1f,0xa4, +0xe0,0x0, 0x1e,0xa3,0xe0,0x0, 0x17,0x0, 0xe0,0x80,0xaf,0x1f,0x3e,0xff,0x1, 0xfd, +0x17,0x80,0x16,0xff,0xaf,0x12,0xaf,0x22,0xaf,0x42,0xaf,0x32,0xae,0xd2,0xb7,0xd2, +0xb7,0xe2,0xe0,0x1, 0xaf,0x12,0xe0,0x2, 0xb7,0xb2,0xe0,0x2, 0xb7,0xc2,0xe0,0x4, +0xaf,0x52,0xe0,0x4, 0xb7,0x92,0xe0,0x4, 0xb7,0xa2,0xe0,0x8, 0xaf,0x12,0x21,0x88, +0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0x9, 0xe1, +0x8f,0x82,0x17,0x1, 0xe4,0x0, 0xc7,0x9c,0x3f,0x92,0xe0,0x1, 0x8c,0xf, 0xe0,0x2, +0x1f,0xc8,0x87,0x8f,0xe0,0x2, 0x1f,0x9e,0xaf,0xf, 0xef,0xfc,0xd4,0x4, 0x0, 0xc7, +0x8, 0xb1,0x14,0x1, 0xdf,0xbe,0xe0,0x2, 0x1f,0xac,0x15,0x0, 0x8c,0x8f,0xe0,0x0, +0x1c,0x78,0xf0,0x2, 0x19,0xc8,0xf0,0x3, 0x1a,0x30,0x3f,0x6f,0xf0,0x40,0x3a,0xef, +0x3d,0xef,0x3e,0xea,0xf0,0x0, 0x13,0x1, 0xe8,0x0, 0x8f,0x83,0xe1,0x80,0x8e,0x18, +0xe4,0x0, 0xc7,0x85,0xf0,0x0, 0x13,0x81,0xe8,0xf, 0x3f,0x94,0x8f,0x8f,0xf0,0x17, +0x3b,0x9d,0x3f,0xfc,0xe0,0x1, 0xae,0xb, 0xe0,0x6d,0x39,0xa9,0x3c,0xed,0x3f,0xfc, +0xe8,0x40,0x3e,0xe7,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3f,0xe6,0xe0,0x6f,0x39,0xaa, +0xe2,0x0, 0xce,0x83,0xc5,0x9c,0x3d,0x6f,0x1, 0xe0,0xe0,0x0, 0x2f,0xd1,0xf8,0x0, +0x8b,0x85,0xf2,0x0, 0xcb,0x82,0x5, 0x86,0x17,0x80,0xe8,0x0, 0xaf,0x85,0xf0,0x0, +0x13,0x80,0xe0,0x0, 0x1f,0xc6,0xf0,0xb, 0x33,0xa2,0xf0,0x3, 0x1b,0x33,0xe0,0x0, +0x1e,0x4b,0xf0,0x1, 0x18,0xee,0xf0,0x1, 0x19,0x70,0xf0,0x1, 0x19,0xef,0xf0,0x1, +0x1a,0x6d,0x3d,0x9f,0x16,0x80,0xf0,0x40,0x3b,0xfd,0x1, 0x26,0x8f,0x8b,0xe0,0xc, +0x14,0x52,0xe4,0x32,0xc7,0xc8,0xe0,0x25,0x14,0xf6,0xe0,0x19,0x15,0x24,0x3c,0x1f, +0x3c,0x9f,0x3d,0x1f,0x3c,0x1c,0x3f,0x9c,0x3c,0x9c,0x3d,0x1c,0xf0,0x0, 0xbb,0x4e, +0xbf,0xde,0xbc,0x6e,0xe0,0x1, 0xbc,0x8e,0xbd,0x7e,0xc6,0x81,0xe2,0x1, 0xc6,0xff, +0xe2,0x0, 0xce,0x83,0xc7,0x1c,0xc5,0x81,0x1, 0xdf,0xe8,0x0, 0x87,0x5, 0xe0,0x2, +0x1f,0xea,0xaf,0xf, 0x8, 0xe1,0xf0,0x0, 0xbb,0x4e,0xf0,0x0, 0xb8,0xde,0xf0,0x0, +0xb9,0x6e,0xf0,0x1, 0xb9,0x8e,0xf0,0x0, 0xba,0x7e,0x0, 0xe8,0xe8,0x0, 0xac,0x85, +0xe7,0xff,0x0, 0xaf,0xe0,0x2, 0x1f,0x6a,0x16,0x81,0x17,0x80,0x8d,0x8e,0xe0,0x2, +0x1c,0xfb,0xe0,0x2, 0x1f,0x2c,0xe0,0x2, 0x1d,0x77,0xe0,0x8, 0x36,0xb8,0x3e,0x6d, +0xf0,0x40,0x3b,0xef,0x3d,0xff,0x1, 0x13,0x8e,0x89,0x3e,0xd8,0x26,0x83,0xe0,0x1, +0xae,0x7e,0x8e,0x8a,0x3e,0xd8,0x26,0x83,0xe0,0x1, 0xae,0x7e,0xc7,0x81,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xee,0x38,0x82,0xf0,0x1, 0xab,0xfe, +0x0, 0xf6,0xe0,0x2, 0x1f,0x6a,0xe0,0x2, 0x1d,0xac,0x16,0x81,0x17,0x80,0xe0,0x2, +0x1c,0xfb,0x8d,0xe, 0xe0,0x8, 0x36,0xb8,0x3f,0x6b,0x3e,0x6d,0xf0,0x40,0x3b,0xef, +0x3d,0x7f,0x1, 0x18,0x8e,0x89,0x3e,0xd8,0x26,0x85,0xe0,0x1, 0xae,0x6e,0xe0,0x1, +0xae,0x7e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xf1, +0x17,0x80,0xe0,0x1, 0xaf,0xeb,0x14,0x1, 0xe0,0x5, 0xaf,0xab,0xe0,0x8, 0xaf,0xeb, +0x38,0x82,0xf0,0x1, 0xab,0xee,0xf0,0x1, 0xab,0xfe,0x0, 0xec,0x8, 0xb7,0xf8,0x0, +0xc, 0x39,0xe0,0x2, 0x1a,0xac,0x11,0x81,0xe0,0x2, 0x1a,0x2b,0xf0,0x2, 0x1c,0x9e, +0x3b,0xe8,0x39,0x65,0xdf,0xa0,0x13,0x0, 0xf0,0x40,0x3c,0x63,0xe0,0x1, 0x8f,0xf2, +0x2f,0x98,0xc1,0x1c,0xef,0xfe,0xd5,0xe3,0x2c,0x2c,0x39,0x74,0x1, 0xf8,0x11,0x1, +0x23,0xc, 0x8f,0x85,0xe0,0x2, 0x1f,0x1e,0xe4,0x0, 0xc7,0x9c,0xa9,0xe, 0x3a,0x9f, +0xe0,0x1, 0x8c,0x5, 0xef,0xfc,0xd2,0xff,0x3c,0x62,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1, +0x3c,0x63,0xef,0xfd,0xd3,0x39,0xe0,0x1, 0x8c,0x2, 0xf8,0x0, 0xac,0x9, 0xef,0xfc, +0xd2,0xf2,0xe2,0x0, 0xcb,0x82,0x1, 0x1c,0xa4,0x52,0xe0,0x1, 0xa5,0x2, 0xa4,0xe2, +0x3d,0xe7,0xef,0xfa,0xd8,0xc3,0x3b,0x63,0xc1,0x1c,0xef,0xfe,0xd5,0xb8,0x24,0x56, +0x11,0x0, 0x23,0x63,0x8f,0x85,0x17,0x1, 0xe4,0x0, 0xc7,0x9c,0x3a,0x9f,0xe0,0x1, +0x8c,0x5, 0xe0,0x2, 0x1f,0x9e,0xaf,0xf, 0xef,0xfc,0xd2,0xd5,0x0, 0xd6,0xa4,0x72, +0x0, 0xe5,0x8, 0xb7,0xf8,0x0, 0xc, 0x3b,0x17,0xe, 0x3f,0x38,0xe0,0x3, 0x1f,0xac, +0x3a,0xe8,0x3f,0x9e,0xf0,0x0, 0x8c,0x3f,0x89,0x9f,0xef,0xfe,0xd5,0x2e,0xe2,0x0, +0xca,0x82,0xe0,0x1, 0x1a,0x6e,0xe0,0x1, 0x1f,0xed,0xe0,0x2, 0x19,0x2c,0xe0,0x2, +0x1b,0x2b,0xf0,0x1, 0x1d,0xef,0xf0,0x1, 0x1d,0x70,0xe8,0x3, 0x39,0xc8,0xf0,0x40, +0x3c,0xe8,0xe0,0x64,0x39,0x2f,0x13,0x81,0xf0,0x0, 0x14,0x0, 0xe0,0x1, 0x8f,0xf2, +0x27,0x8f,0xe2,0x0, 0xca,0x82,0x1, 0x23,0xa4,0xd2,0x3d,0xe7,0x3d,0x64,0x3c,0x69, +0xef,0xff,0xd0,0x95,0xf0,0x0, 0x2c,0x8b,0x29,0x91,0xf0,0x1, 0xac,0x72,0xc1,0x1c, +0x39,0x76,0x1, 0xed,0xf8,0x0, 0xd, 0xa8,0xb, 0xe1,0xa4,0xe2,0x3d,0xe7,0xe8,0x40, +0x3d,0x6a,0x3c,0x69,0xef,0xff,0xd0,0x83,0x21,0xf1,0xe0,0x1, 0xa4,0x82,0x3d,0xe7, +0xe8,0x40,0x3d,0x6b,0x3c,0x69,0xef,0xff,0xd0,0x7a,0x0, 0xe8,0xa4,0xf2,0x0, 0xde, +0xe0,0x2, 0x1f,0xfa,0x8f,0x8f,0x27,0xac,0xe0,0x0, 0x1f,0xbf,0x8f,0xf, 0xe0,0x0, +0x1f,0xf8,0x8f,0x8f,0x3f,0xfe,0xe0,0x0, 0x1, 0x47,0xe0,0x0, 0x1f,0xf7,0x8f,0x8f, +0x3f,0xfe,0xe0,0x0, 0x1, 0x43,0xe0,0x0, 0x1f,0xf6,0x8f,0x8f,0xe0,0x2f,0x3f,0x8e, +0x37,0xa1,0xe0,0x2, 0x1f,0x6a,0x8f,0xe, 0x3f,0x7f,0x1, 0x12,0x2c,0x12,0x17,0x1c, +0xe0,0x2, 0x1e,0xac,0x3f,0x3f,0xe2,0x0, 0xcc,0x82,0x3f,0x1d,0xa5,0x5e,0x1, 0x1e, +0xe0,0x1, 0x1f,0xf2,0x15,0x80,0xa4,0x8f,0x3c,0x69,0xe7,0xe0,0x0, 0xc8,0x38,0x82, +0x17,0x7e,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0x5, 0x97,0x15,0x1, 0xe0,0x2a,0x3c,0xa, +0x2d,0x5, 0x17,0x4, 0xe0,0x28,0x3c,0xe, 0x24,0x6c,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, +0x1f,0x2c,0x3f,0x9e,0xe0,0x1, 0xa5,0xf, 0x0, 0xe4,0xc7,0x81,0xe4,0x0, 0xc7,0x9c, +0x3f,0x9d,0xa5,0xf, 0x0, 0xde,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, 0x1f,0x2c,0x3f,0x9e, +0xa5,0x6f,0x0, 0xd7,0x17,0x80,0x0, 0xc6,0x17,0x81,0x0, 0xc4,0xe0,0x2, 0x1f,0xac, +0xe4,0x0, 0xc4,0x9c,0x17,0x1, 0x3c,0x9f,0xe0,0x1, 0x8c,0x9, 0xe0,0x2, 0x1f,0x9e, +0xaf,0xf, 0xe7,0x84,0x0, 0xa0,0x8, 0xb3,0xe0,0x2, 0x1f,0x66,0xe0,0x2, 0x19,0x9e, +0x17,0x80,0x8f,0xe, 0xaf,0x83,0x27,0xa, 0xe0,0x2, 0x19,0x2c,0x8f,0x32,0xe2,0x0, +0xcf,0x2, 0x1, 0x19,0xe2,0x0, 0xcf,0x3, 0x1, 0x2, 0x9, 0xe1,0x8c,0x52,0x8f,0x82, +0xe2,0x1, 0xcc,0x7f,0x1, 0x30,0x17,0x2, 0xe1,0x2f,0x3f,0x9e,0x2f,0x85,0xe1,0x2e, +0x3c,0x1e,0x2f,0x2, 0xdb,0x77,0x17,0x80,0xaf,0xc2,0x17,0xff,0xaf,0xd2,0x17,0x80, +0xaf,0xb2,0x9, 0xe1,0xe0,0x1, 0x1e,0x51,0x16,0x9c,0x8f,0xc, 0x3e,0xbe,0x3e,0x92, +0xe0,0x1, 0x8d,0x9d,0x25,0xe3,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x2, +0xe0,0x1, 0xaf,0x9d,0x2, 0x8d,0xaf,0xc, 0xe4,0x0, 0xc7,0x1c,0x17,0x81,0x3f,0x12, +0xe0,0x1, 0x8c,0xe, 0xaf,0x83,0xef,0xfc,0xd1,0xde,0x8f,0x32,0x0, 0xcc,0xaf,0x8c, +0x17,0x0, 0x0, 0xf3,0xe4,0x0, 0xc7,0x9c,0x17,0x1, 0x3f,0x92,0xe0,0x1, 0x8c,0xf, +0xaf,0x3, 0xef,0xfc,0xd1,0xd0,0x0, 0xd4,0xe0,0x2, 0x1f,0xac,0x8c,0x4f,0x38,0x82, +0xe0,0x2, 0x1f,0xfa,0x8f,0x8f,0xe0,0x0, 0x27,0xdf,0xe0,0x2, 0x1f,0xc0,0xe0,0x4, +0x8f,0xdf,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x57,0x8, 0xb5,0xe2,0x0, 0xcc,0x1, +0x39,0x68,0x39,0xe9,0x17,0x84,0x1, 0x9, 0xef,0xfe,0xd4,0x1f,0xe2,0x0, 0xcc,0x0, +0x17,0x2, 0xe0,0x6e,0x39,0x28,0x3f,0xee,0x39,0xff,0xe0,0x2, 0x1a,0x2c,0xe0,0x1, +0x1, 0x54,0x8f,0xb4,0x2f,0xa0,0xe0,0x0, 0x1e,0xa4,0xe0,0x0, 0x1d,0xa3,0x17,0x80, +0xe0,0x80,0x8e,0x1d,0x17,0x1, 0x3f,0x1f,0xe2,0x0, 0xce,0x1, 0xe2,0x1, 0xc7,0x7f, +0xe0,0x6f,0x39,0x2e,0x3d,0xfd,0x1, 0xf5,0xe2,0x0, 0xcf,0x87,0xea,0x12,0x7f,0xa8, +0xe0,0x1, 0x2, 0xe0,0x8f,0xf, 0xe2,0x0, 0xcf,0x1f,0x5, 0x85,0x17,0x20,0xaf,0xf, +0x17,0x80,0xaf,0xc4,0x3c,0xe2,0x3c,0x63,0xef,0xfd,0xd2,0x14,0x8a,0xb4,0xe2,0x0, +0xca,0x81,0xe0,0x1, 0x1, 0x5, 0xe2,0x0, 0xca,0x82,0x1, 0x94,0xe2,0x0, 0xc9,0x1, +0xe0,0x1, 0x1, 0x44,0x3c,0x62,0xef,0xfe,0xd3,0xe0,0xe2,0x0, 0xcc,0x0, 0x17,0x80, +0xe0,0x65,0x39,0x28,0x3c,0x65,0xe1,0x2f,0x39,0x8f,0x27,0x86,0xe1,0x29,0x39,0x88, +0x24,0x83,0xa, 0xe1,0x38,0x82,0x8f,0x94,0x16,0x9c,0x3e,0xbf,0xe0,0xc, 0x3a,0x1d, +0xe0,0x1, 0x87,0x1c,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, +0xaf,0x1c,0x5, 0xf0,0xe0,0x1, 0x1d,0xc7,0x9d,0x5c,0x9f,0xb, 0x3f,0x1a,0xe2,0xff, +0xcf,0x7e,0xe0,0x1, 0x5, 0x34,0xe0,0xff,0x17,0x7f,0xb7,0x5c,0x3e,0x94,0x9f,0xb, +0x9e,0x6d,0x3e,0x7e,0x3, 0x83,0x9f,0xb, 0xb7,0x6d,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x2, 0xac,0xaf,0x94,0x8d,0x84,0x3f,0xfb,0xe0,0x1, +0x1, 0x2c,0x8f,0xa4,0xe0,0x0, 0x1f,0x73,0x8f,0xe, 0x3f,0x7f,0x2, 0xcb,0x14,0x0, +0xe0,0x2, 0x1f,0x2c,0x3c,0xe8,0xe1,0xff,0x16,0x7f,0x3f,0xe8,0x9e,0xde,0x15,0x1, +0x3e,0xfc,0x3d,0x1f,0x3, 0x84,0x9c,0x6e,0x3c,0xef,0x3e,0x6d,0x3f,0xea,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xf2,0x3d,0xf9,0x1, 0x1a,0xe4,0x0, +0xc5,0x9c,0xe0,0xf, 0x3a,0x1b,0x9f,0xdf,0xe0,0xe, 0x37,0xc2,0xe4,0x0, 0xc7,0x3, +0x3f,0x7c,0x5, 0x8b,0xe0,0x0, 0x1f,0x75,0x8e,0x8e,0xe0,0x0, 0x1f,0x74,0x36,0xa8, +0x8f,0xe, 0x3f,0x4d,0x3f,0x78,0x2, 0x87,0x37,0xc1,0x3f,0xfc,0xe0,0x0, 0x2, 0xfc, +0xe0,0x1, 0x14,0xff,0x17,0x83,0xac,0xd4,0xaf,0xb4,0xa, 0xe1,0xe0,0x0, 0x1f,0xbb, +0xe0,0x6, 0x8f,0xdf,0xc7,0xff,0x3c,0x7f,0xe7,0xff,0x1, 0x8d,0x17,0x80,0x8e,0x84, +0xb7,0xd4,0x17,0x0, 0xb7,0xe4,0x16,0x7f,0xe0,0x1, 0xaf,0x94,0xe0,0x2, 0xb7,0xb4, +0xe0,0x2, 0xb7,0xc4,0xe0,0x4, 0xb7,0x94,0xe0,0x4, 0xb7,0xa4,0xe0,0x1, 0x1f,0xd1, +0xae,0x94,0xae,0x8f,0x17,0x82,0xaf,0x24,0xae,0x54,0xe0,0x4, 0xaf,0x54,0xe0,0x8, +0xaf,0x14,0xaf,0xb4,0xa, 0xe1,0x8f,0x34,0xe7,0xfe,0x2f,0x4e,0xea,0x12,0x7e,0xa9, +0x87,0x8d,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x93,0x2, 0xac,0xaf,0x8d, +0xe0,0x0, 0x1f,0x75,0xe0,0x1, 0x1e,0x47,0x8e,0x8e,0xe0,0x0, 0x1f,0x74,0x9e,0xc, +0x8f,0xe, 0x36,0xa8,0x3f,0x4d,0x3e,0x7e,0xe0,0x0, 0x1f,0x22,0x3f,0x9e,0x5, 0xa3, +0x17,0x1, 0xaf,0xf, 0xe7,0xfe,0x0, 0x91,0x17,0x85,0x14,0x4, 0xe7,0xfe,0x0, 0xc5, +0xe0,0x0, 0x1c,0x22,0x17,0x1, 0x16,0x80,0x15,0x14,0x14,0x80,0xae,0x8f,0xaf,0x44, +0xaf,0x34,0xe0,0x4, 0xd4,0xd9,0xe0,0x0, 0x1f,0x91,0xe0,0x2, 0x17,0x68,0xb7,0xf, +0xe7,0xfe,0x0, 0x9a,0xaf,0xd, 0x3f,0xee,0x0, 0xd4,0x9f,0xb, 0x3d,0x1e,0xb5,0x5c, +0xe7,0xfe,0x0, 0xce,0x17,0x0, 0xaf,0xf, 0xe7,0xfd,0x0, 0xef,0x17,0x80,0xaf,0x94, +0x17,0x80,0xe7,0xfe,0x0, 0xd4,0x87,0xa4,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xaf,0xa4, +0xe7,0xfe,0x0, 0xd2,0xe0,0x0, 0x1f,0xf5,0x3d,0x94,0x8f,0xf, 0xe0,0x0, 0x1f,0xf4, +0x37,0x28,0x8f,0x8f,0x9e,0xeb,0x3f,0xce,0x3e,0xff,0xe0,0x1, 0x17,0xff,0xe0,0x6f, +0x3a,0xa9,0x3c,0xef,0xe7,0xfe,0x0, 0xf8,0xe0,0x2, 0x1f,0xac,0xe0,0x1, 0x8f,0xf, +0x3f,0x78,0x1, 0xd, 0xe0,0x4, 0x8f,0x4f,0x3f,0x78,0x1, 0x9, 0xe0,0x8, 0x8f,0xf, +0x3f,0x78,0x1, 0x5, 0xe0,0x1, 0xac,0xf, 0x14,0x1, 0x38,0x82,0x14,0x0, 0x38,0x82, +0xe2,0x1, 0xcc,0x80,0xe0,0x2, 0x1f,0xac,0x1, 0x1f,0xe2,0x1, 0xcc,0x81,0x1, 0x2b, +0xe2,0x0, 0xcc,0x82,0x5, 0x82,0x14,0x80,0x8f,0x8f,0x3c,0xff,0x1, 0x4, 0xe2,0x0, +0xcf,0x82,0x5, 0x86,0xe0,0x2, 0x1f,0x93,0xe0,0x1, 0xac,0xaf,0x38,0x82,0x8, 0xb1, +0xc0,0x7c,0x3c,0x69,0x7c,0x81,0xd9,0xbe,0x64,0x81,0xe0,0x2, 0x1f,0x93,0xe0,0x1, +0xac,0xaf,0xc0,0x4, 0x8, 0xe1,0xe0,0x1, 0x8f,0xf, 0xe0,0x4, 0x8e,0xcf,0x14,0x80, +0x3f,0x7d,0x3, 0x9b,0xe0,0x8, 0x8e,0x8f,0x3e,0xfe,0x17,0x2, 0xe0,0x6e,0x3a,0xa9, +0x3c,0xee,0x0, 0xdb,0xe0,0x1, 0x8f,0xf, 0xe0,0x4, 0x8e,0xcf,0x14,0x80,0x3f,0x7d, +0x5, 0x89,0xe0,0x8, 0x8e,0x8f,0x3e,0xfe,0x17,0x2, 0xe0,0x6e,0x3c,0xa9,0x3c,0xee, +0x0, 0xcc,0x3f,0x6d,0x14,0x81,0x0, 0xf6,0x3f,0x6d,0x14,0x81,0x0, 0xe4,0x0, 0x0, +0x8, 0xb7,0xe0,0x2, 0x1f,0x7d,0x8f,0xfe,0x89,0x6e,0x8a,0x5e,0x27,0xad,0x12,0xff, +0x3a,0x9f,0xe2,0x1, 0xc2,0xff,0xe0,0x4c,0xc2,0xa7,0xe0,0x1, 0x1f,0xff,0x32,0xa1, +0xe0,0x1, 0x1b,0x64,0x39,0xe8,0x3a,0x9f,0xe0,0x0, 0x13,0x80,0x21,0x1e,0x14,0x0, +0x3f,0x67,0x3e,0x64,0xe3,0xff,0xc7,0x7f,0xe0,0x40,0x3f,0xe8,0xe0,0xd, 0x37,0x21, +0xc7,0x81,0x3e,0x93,0xe2,0x1, 0xc7,0xff,0x96,0x8d,0x39,0x7f,0x3f,0x1c,0x3c,0x1d, +0xe3,0xff,0xc7,0x7f,0x1, 0xf4,0x3c,0xe2,0xe0,0x4, 0xd3,0x82,0xe0,0x80,0xb4,0x16, +0x3a,0xf6,0xc3,0x81,0x1, 0xe4,0xb, 0xe1,0x3c,0x62,0x3c,0xe2,0xe0,0x4, 0xd3,0x78, +0xe0,0x80,0xb4,0x16,0x3a,0xf6,0xc3,0x81,0x1, 0xda,0x0, 0xf6,0xe0,0x0, 0x24,0xd3, +0x8, 0xb3,0x16,0x7f,0x3e,0x19,0xe2,0x1, 0xc6,0x7f,0x11,0x7e,0x39,0x18,0x36,0x21, +0x3e,0x18,0x39,0xe2,0xe0,0x0, 0x14,0x0, 0xe0,0x43,0x3d,0x9a,0xe0,0x80,0x97,0x13, +0xe4,0xd, 0x37,0xf, 0xe2,0xf, 0x3e,0xce,0x3f,0xad,0xe0,0x43,0x3f,0x9f,0x3f,0xfa, +0xe0,0x6f,0x3a,0x2b,0x3e,0x73,0x3c,0x1f,0x1, 0xf2,0xe0,0x4, 0xd3,0x51,0xe2,0x0, +0xcc,0x8, 0x15,0x88,0xe0,0x6b,0x3b,0x28,0xe7,0xfe,0x16,0x2f,0xe0,0x0, 0x15,0x6d, +0x0, 0x91,0xe0,0xe, 0x3f,0xab,0xe0,0x2d,0x3f,0xac,0xe0,0x43,0x3f,0x1e,0x26,0x99, +0xe0,0x2d,0x3e,0x1e,0x26,0x96,0xe0,0xf, 0x37,0x2, 0xe0,0x80,0xb7,0x92,0x39,0xf2, +0x1, 0x18,0xe0,0x0, 0x97,0x92,0xe2,0x0, 0xcf,0x87,0x2, 0x6c,0xe3,0xff,0xcf,0xf9, +0x3, 0x75,0xe0,0xe, 0x3d,0x9f,0xe0,0x2d,0x3f,0xac,0xe0,0x43,0x3f,0x1e,0x2e,0xe9, +0xe0,0x2f,0x3d,0x2f,0x27,0x84,0xe0,0x2f,0x3f,0x1a,0x2f,0xe6,0x3f,0xee,0x0, 0xe6, +0x9, 0xe1,0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x2, 0x1f,0xfd,0xe0,0x1, +0x1b,0x72,0x8a,0x6f,0xa4,0x86,0xe0,0x1, 0x1c,0x62,0xe7,0x0, 0x16,0x0, 0xe0,0xff, +0x15,0xff,0x15,0x0, 0x8a,0xff,0xef,0xfe,0xde,0x8, 0x22,0x2f,0xc2,0x7f,0xe2,0x1, +0xc2,0x7f,0xe0,0x4b,0xc2,0x6b,0xe0,0x1, 0x1f,0xff,0x32,0x21,0xe0,0x1, 0x19,0xe1, +0xe0,0x19,0x32,0xa1,0x3a,0x1f,0x11,0x0, 0xf0,0x0, 0x14,0x3, 0xe0,0x0, 0x13,0xda, +0xe0,0x80,0x97,0x93,0xe8,0x40,0x3c,0xe8,0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f, +0xe0,0x8, 0x3f,0xa8,0xe0,0x4, 0xd2,0xec,0xe2,0x0, 0xcc,0x5a,0xa7,0x86,0x3d,0x67, +0xe0,0x6a,0x3b,0x28,0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x3f,0x92,0x3c,0xe5,0xdf,0x6f, +0x3a,0x73,0xe8,0x2, 0x39,0x19,0x1, 0xe5,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xe1,0xff,0xc0,0x8, 0xe0,0x2, 0x1f,0xfd,0xf0,0x1, +0x1e,0x7f,0x8a,0x7f,0xe8,0x40,0x3c,0x6c,0x8b,0x6f,0xef,0xff,0xdf,0x1b,0xe0,0x0, +0x22,0x4f,0x13,0xff,0x3b,0x94,0x11,0xff,0xe2,0x1, 0xc3,0xff,0x39,0x96,0xe0,0x4c, +0xc3,0xa7,0xe2,0x1, 0xc1,0xff,0xf0,0x0, 0x14,0x4, 0xf0,0x18,0x3c,0x10,0x33,0xa1, +0x31,0xa1,0xe0,0x1, 0x1a,0xe4,0xe8,0x7, 0x3b,0x9c,0x32,0x21,0xe8,0x3, 0x39,0x98, +0xf0,0x0, 0x15,0x3, 0xf0,0x0, 0x14,0xda,0xf0,0x0, 0x15,0x80,0xe0,0x80,0x97,0x95, +0xe8,0x40,0x3c,0xea,0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f,0xe0,0x8, 0x3f,0xa8, +0xe0,0x4, 0xd2,0x9e,0xe2,0x0, 0xcc,0x5a,0xe8,0x40,0x3d,0x69,0xe0,0x6a,0x3b,0x28, +0xe3,0xff,0xc5,0x7f,0x23,0x21,0x11,0x2, 0x39,0x10,0x3f,0x62,0xe8,0x40,0x3f,0xec, +0x96,0x8f,0x3f,0x94,0xe0,0x80,0xb6,0x9e,0x3f,0x73,0x1, 0xfb,0x3c,0xe6,0xe8,0x40, +0x3c,0x68,0xdf,0x15,0xe8,0x40,0x3f,0xec,0xe0,0x80,0x97,0x12,0x39,0x73,0xb7,0xf, +0x3f,0x94,0x1, 0xfb,0x3a,0xf7,0xf0,0x0, 0xc6,0x2, 0x1, 0xd1,0xe0,0x0, 0xc0,0x78, +0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe8,0x40,0x3c,0xeb,0xe8,0x40,0x3c,0x68,0xde,0xff, +0x3a,0xf7,0xf0,0x0, 0xc6,0x2, 0x1, 0xc3,0x0, 0xf2,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x68,0xe0,0x3, 0x1f,0xc7,0xf0,0x2, 0x1e,0x7d,0x8f,0xf, 0xe8,0x0, +0x8e,0x4c,0xe8,0x0, 0x8e,0xdc,0xe2,0x0, 0xcf,0x1, 0x7e,0x4, 0x3a,0x68,0x7e,0x85, +0x39,0xe9,0xe0,0x2, 0x1, 0x77,0x8f,0x8f,0xe0,0x1, 0x1f,0x8, 0xe2,0x0, 0xcf,0x83, +0xe0,0x1, 0x1f,0x89,0x8f,0x8f,0xe0,0x2, 0x1, 0x73,0xf0,0x0, 0x8d,0xe, 0x37,0xa8, +0xf0,0x1a,0x3d,0x4f,0xf0,0x0, 0x7d,0x1, 0xe0,0x2, 0x22,0x1f,0x67,0x4, 0x12,0x80, +0x3f,0xee,0xc7,0xff,0x7f,0x86,0xf0,0x40,0x3f,0x65,0xf0,0x0, 0x1e,0x8d,0xf0,0x2, +0x1c,0xbc,0xe0,0x1, 0x1b,0xff,0x13,0x3, 0xe0,0x1, 0x29,0x8e,0xe8,0x0, 0x8f,0x8d, +0xf8,0x0, 0x8d,0x9d,0x3f,0xfe,0xe0,0x0, 0x1, 0x76,0xe8,0x0, 0x8f,0x9, 0xe2,0x0, +0xcf,0x1, 0xe0,0x1, 0x1, 0x7, 0xe8,0x0, 0x89,0x5c,0x66,0x1, 0x39,0x3f,0xe8,0x2, +0x39,0x1b,0xf0,0x40,0x3d,0xe2,0xf3,0xff,0xc5,0xff,0xf0,0xe, 0x35,0xa1,0x3f,0x17, +0x96,0x8e,0xe4,0x9, 0x36,0x8f,0xe2,0xe, 0x3c,0xcd,0x3f,0x29,0x3f,0x7c,0xe0,0x0, +0x2, 0x5a,0xe0,0x1, 0x2f,0x96,0x67,0x84,0x39,0x65,0xe2,0x0, 0xcf,0x81,0xe0,0x2, +0x2, 0x47,0xe2,0x0, 0xce,0x80,0xe0,0x1, 0x4, 0x26,0x3f,0xe5,0xe3,0xff,0xc7,0xff, +0x37,0xcf,0xe0,0x1, 0x27,0xad,0x3f,0xe2,0xe3,0xff,0xc7,0xff,0x37,0xcf,0xe0,0x1, +0x27,0xa7,0x17,0x8e,0xe8,0xf, 0x3f,0x9b,0x37,0xa1,0xe8,0xf, 0x3f,0x9c,0x9c,0xf, +0x3c,0xe6,0xe0,0x4, 0xd2,0x30,0x11,0x7c,0xe8,0x2, 0x39,0x1b,0xf0,0x40,0x3c,0x68, +0xf3,0xff,0xc4,0x7f,0xe3,0xff,0xc1,0x7f,0x17,0x7f,0xe8,0xe, 0x3f,0x1b,0xf0,0x40, +0x3d,0x6e,0xf3,0xff,0xc5,0x7f,0x17,0x8e,0xe8,0xf, 0x3f,0x9a,0x37,0xa1,0x3c,0xe6, +0xe8,0xf, 0x3f,0x9c,0xf0,0x2, 0x25,0x8e,0xf0,0x40,0x3d,0x72,0xe0,0x1, 0x1, 0x31, +0x9c,0xf, 0xe0,0x4, 0xd2,0x10,0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0x78,0xe0,0x1, +0x1, 0xfb,0xf8,0x40,0x3d,0xea,0x0, 0xe1,0x17,0xff,0x3f,0x92,0x39,0x6f,0xe2,0x1, +0xc1,0x7f,0xe0,0x1, 0x29,0x49,0x29,0x86,0x14,0x80,0xe8,0x40,0x3c,0x6e,0xe0,0x0, +0xdc,0x1d,0x16,0x1, 0xe8,0xc, 0x3e,0x1e,0xf0,0x40,0x3f,0x6c,0xf2,0x1, 0xc7,0x7f, +0xe8,0x40,0x3a,0x7e,0xf0,0x0, 0xc6,0x82,0xe0,0x1, 0x1, 0x7, 0xe8,0x0, 0x8f,0x4c, +0xe7,0xfe,0x21,0xf6,0xe8,0x7, 0x8f,0xcd,0xf8,0x7, 0x8d,0xdd,0xe7,0xfe,0x0, 0xf4, +0x27,0xe9,0xe0,0x1, 0x1e,0x42,0xe0,0xe, 0x8f,0x1c,0xc7,0x7f,0xe0,0x2e,0x3f,0xf, +0x2f,0x61,0xf0,0x2e,0x3d,0x8e,0x2f,0x5e,0xe0,0xe, 0x8f,0x2c,0xc7,0x7f,0xf0,0x40, +0x3d,0xfe,0x1, 0x58,0xe8,0x0, 0x89,0x5c,0x66,0x1, 0x39,0x3f,0xe8,0x2, 0x39,0x1b, +0xf0,0x40,0x3d,0xe2,0xf3,0xff,0xc5,0xff,0xf0,0xe, 0x35,0xa1,0x3f,0x17,0x96,0x8e, +0xe4,0x9, 0x36,0x8f,0xe2,0xe, 0x3c,0xcd,0x3f,0x29,0x3f,0x7c,0x2, 0x43,0x66,0x5, +0xf0,0x9, 0x3d,0xac,0x66,0x6, 0x34,0xa1,0x3e,0x7f,0x3c,0x97,0x91,0x9, 0xe0,0x1, +0x5, 0x38,0x64,0x85,0xe2,0x0, 0xcf,0x80,0xe8,0x9, 0x3c,0x9b,0x34,0xa1,0x3c,0x97, +0x92,0x89,0x3f,0xe5,0xe0,0x6f,0x39,0xa2,0xe2,0x0, 0xce,0x80,0x39,0x6f,0xe7,0xfe, +0x3, 0x5e,0xe0,0x41,0x3f,0x82,0xe3,0xff,0xc7,0xff,0x37,0xcf,0x27,0x88,0xe0,0x41, +0x3f,0x85,0xe3,0xff,0xc7,0xff,0x37,0xcf,0xe7,0xfe,0x2f,0xdd,0xe4,0x0, 0xc7,0xa, +0xe1,0xff,0x14,0x7e,0x3c,0x5e,0x14,0x9e,0xe0,0x4, 0xd1,0x8d,0xe4,0xe, 0x31,0xf, +0xe2,0xf, 0x3f,0x42,0x3f,0xae,0xe3,0xff,0xc4,0x7f,0xe3,0xff,0xc7,0xff,0xe1,0x2f, +0x3c,0x1f,0xe7,0xff,0x27,0x88,0xe4,0xe, 0x32,0x8f,0xe2,0xf, 0x3f,0x45,0x3f,0xae, +0xe3,0xff,0xc7,0xff,0xe1,0x2f,0x3c,0x1f,0xe7,0xfe,0x2f,0xbd,0x16,0x1, 0xe8,0xc, +0x3e,0x1e,0xf0,0x40,0x3f,0x6c,0xf2,0x1, 0xc7,0x7f,0xe8,0x40,0x3a,0x7e,0xf0,0x0, +0xc6,0x82,0xe7,0xfe,0x1, 0xfd,0xc0,0x18,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x79,0x3, +0xf0,0xd, 0x35,0x21,0xe8,0x0, 0x9f,0x5c,0xc6,0x9a,0x7f,0x2, 0xf0,0x1b,0x3e,0x1d, +0x11,0x1, 0xe8,0x80,0x9c,0x1b,0x3c,0xe6,0xe0,0x4, 0xd1,0x55,0xe3,0xff,0xc4,0x7f, +0xf0,0x40,0x3c,0x78,0xf0,0x0, 0x13,0x81,0x14,0x81,0xf0,0x17,0x3b,0x92,0xe8,0x9, +0x3c,0x9a,0xe7,0xfe,0x1, 0xc3,0x67,0x82,0xe8,0x40,0x3f,0xfa,0xf0,0x40,0x3d,0x69, +0xf3,0xff,0xc5,0x7f,0x5, 0x88,0xe8,0x40,0x39,0x67,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, +0xc9,0x5, 0x1, 0xe0,0x16,0xff,0x3e,0x92,0x67,0x83,0x66,0x3, 0xe2,0x1, 0xc6,0xff, +0x37,0xa1,0x3e,0x9c,0xc7,0xfe,0x36,0xa1,0x3f,0x97,0x3e,0x97,0x97,0x1f,0x37,0x2, +0xe0,0x80,0xb7,0x1f,0x3f,0xfd,0x1, 0xfb,0xe7,0xfe,0x29,0xad,0xe7,0xfe,0x0, 0xa6, +0xe0,0x1, 0x1f,0xd7,0x9f,0xaf,0x7f,0x81,0xe7,0xfd,0x0, 0x98,0x8c,0xe, 0x37,0xa8, +0x3c,0x4f,0x14,0x8a,0x34,0x23,0xe0,0x4, 0xd0,0xd3,0xe3,0xff,0xc4,0x7f,0x7c,0x1, +0xe7,0xfd,0x0, 0x8c,0xf0,0x0, 0x7d,0x83,0xf8,0x40,0x3d,0x6b,0xe7,0xff,0x0, 0xaa, +0xf8,0x40,0x3d,0x6b,0xf0,0x0, 0x7d,0x83,0xe7,0xff,0x0, 0xa4,0x67,0x85,0xe8,0xf, +0x3f,0x9b,0x37,0xa1,0x3f,0x97,0x92,0x8f,0x39,0x65,0xe7,0xfd,0x0, 0xb4,0x3e,0x62, +0xe0,0x6c,0x39,0xa5,0x3a,0xec,0xe7,0xfd,0x0, 0xae,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f, +0xe2,0x0, 0xcf,0x83,0x1, 0x2, 0x38,0x82,0x8, 0xb1,0xe0,0x1, 0x1f,0x7, 0xe0,0x1, +0x1f,0xd7,0x86,0x8e,0xe0,0x0, 0x17,0x5a,0xb7,0x1f,0xb7,0x2f,0xe7,0xff,0x17,0x26, +0xae,0x9f,0xb7,0x3f,0xef,0xfa,0xd9,0x6, 0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0x2c,0xa, +0xe0,0x0, 0x1f,0x8c,0x8c,0xf, 0x2c,0x2, 0x8, 0xe1,0x14,0x81,0x8, 0xa1,0xe7,0xfc, +0x0, 0xa7,0x14,0x80,0xde,0x24,0x0, 0xf5,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0x2, 0x38,0x82,0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0x24,0x7c,0x14,0x80, +0xe7,0xfc,0x0, 0x96,0x8, 0xb7,0xe1,0xff,0xc0,0x30,0x12,0x8c,0x3a,0x90,0xe0,0x0, +0x15,0x48,0x14,0x80,0x3c,0x65,0xe0,0x4, 0xd1,0xf, 0xef,0xfa,0xd8,0xdb,0xe0,0x2, +0x1f,0xe6,0xe0,0x2, 0x1a,0x7d,0x87,0x8f,0xe0,0x3, 0x8f,0x24,0xe2,0x0, 0xc7,0x81, +0x3f,0x7f,0xe0,0x2, 0x1, 0x45,0x87,0xa4,0x89,0x4, 0xe4,0xf, 0x37,0xa8,0xe4,0xe, +0x37,0xc8,0xe2,0x0, 0xcf,0x21,0xea,0x40,0xcf,0x0, 0xe0,0x6f,0x3b,0xae,0xe4,0xf, +0x37,0xc8,0x39,0xef,0xe0,0x2, 0x27,0xba,0xf7,0xff,0x12,0x7f,0xf0,0x14,0x3a,0x1f, +0xfa,0x4e,0x7b,0xf4,0xe0,0x1, 0x1f,0xf2,0x8d,0x54,0xf9,0xff,0xc3,0xff,0xf3,0xff, +0xc2,0x7f,0xf0,0x0, 0xa3,0xf, 0x3d,0xe2,0xf8,0x14,0x3a,0x17,0x35,0x21,0x17,0x80, +0xf0,0x40,0x3a,0xe5,0x25,0x9a,0x14,0x98,0x3c,0xbf,0xe8,0x40,0x3f,0x66,0xf0,0xf, +0x3a,0x99,0xe0,0x1, 0x9c,0x1f,0xa6,0x8f,0x17,0x80,0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x96,0xe, 0x3f,0xfb,0x3e,0x9c,0x3f,0x1a,0x1, 0xf9,0xf0,0xf, 0x3a,0x99,0xe0,0xe, +0x3d,0x98,0xbe,0x8f,0xe0,0x1, 0xb7,0x1f,0xf8,0x40,0x3a,0x77,0xf0,0x0, 0xc3,0x2, +0x1, 0x4, 0xe8,0x80,0x8f,0x97,0x0, 0xdf,0x64,0x3, 0x5c,0x8f,0x12,0x8c,0x3a,0x90, +0xe0,0x4, 0xd0,0x16,0xb4,0x65,0xe0,0x2, 0x9c,0xd5,0xa4,0x65,0xe0,0x4, 0xd0,0x10, +0xe0,0x2, 0xb4,0x25,0xe0,0x4, 0x9c,0x95,0xe0,0x1, 0xa4,0x45,0xe0,0x4, 0xd0,0x8, +0xe0,0x3, 0xb4,0x65,0xe0,0x0, 0x21,0xd9,0xf7,0xff,0x10,0xff,0xe0,0x1, 0x1f,0xf2, +0xfa,0x4e,0x79,0xf4,0xf0,0x11,0x38,0x93,0xf0,0x0, 0x8a,0x54,0xf9,0xff,0xc1,0xff, +0xf3,0xff,0xc0,0xff,0x3c,0xe2,0xf0,0x0, 0xa1,0xf, 0xe2,0x1, 0xc4,0xff,0xf8,0x11, +0x38,0x93,0xf0,0x14,0x32,0x21,0x15,0x0, 0x24,0xb7,0xe4,0x0, 0xc5,0x18,0xf0,0x0, +0x13,0x8, 0x3d,0x15,0xf0,0x0, 0x13,0x96,0x14,0x4, 0xf0,0x0, 0x92,0xea,0xf0,0x16, +0x3b,0x1a,0xf0,0x17,0x3b,0x9a,0x3c,0x1a,0xe8,0x40,0x3f,0x62,0x17,0x80,0xc5,0x14, +0x0, 0x8e,0xa5,0x88,0x96,0xa, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3e,0x9b,0xc6,0x1, +0x3f,0xf9,0xbe,0x88,0xe8,0xe, 0x3f,0x14,0xb6,0xa, 0x1, 0x16,0x96,0x8e,0xe8,0x40, +0x3e,0xf5,0x5, 0x70,0xe8,0x0, 0xa5,0x86,0xe8,0x0, 0x96,0x7, 0xc7,0x81,0xe3,0xff, +0xc7,0xff,0x3e,0x9b,0xc6,0x1, 0x3f,0xf9,0xe8,0x0, 0xbe,0x86,0xe8,0xe, 0x3f,0x14, +0xe8,0x0, 0xb6,0x7, 0x1, 0xec,0xf8,0x40,0x39,0xf1,0xf0,0x0, 0xc1,0x2, 0x1, 0x4, +0xe8,0x80,0x8d,0x13,0x0, 0xc2,0x13,0xc, 0x3b,0x10,0xe0,0x0, 0x13,0xd4,0x3b,0x90, +0x3a,0xe6,0xe0,0x1, 0x9f,0xa5,0x3c,0xef,0xe0,0x0, 0x27,0xfc,0xa4,0x15,0xe0,0x3, +0xdf,0x9f,0xb4,0x75,0xe0,0x1, 0x9f,0xb5,0x3c,0xef,0xe0,0x0, 0x27,0xef,0xa4,0x25, +0xe0,0x3, 0xdf,0x96,0xe0,0x1, 0xb4,0x5, 0xc2,0x98,0x3b,0xf5,0x1, 0xeb,0xe0,0x0, +0x1f,0x8d,0x17,0x4, 0x3f,0x10,0xe0,0x1b,0x95,0x1f,0x3d,0xee,0x17,0x80,0xe0,0x1, +0x14,0x16,0xe7,0xfe,0x14,0xea,0xe3,0xfe,0xcd,0x38,0xe0,0x0, 0x3, 0x45,0xe0,0x1, +0x9e,0xb6,0xe2,0x0, 0xce,0xe3,0x5, 0xbf,0xe0,0x1, 0x96,0x86,0xe0,0xc, 0x37,0xa1, +0xe3,0xfe,0xce,0xea,0xb6,0x8e,0x3e,0x1b,0x3, 0x3e,0xb4,0x8c,0xc7,0x81,0xe2,0x0, +0xcf,0x83,0xc3,0x18,0xc7,0x2, 0x1, 0xe8,0xe0,0x0, 0x21,0xc7,0xe0,0x1, 0x1f,0xf2, +0xea,0x4e,0x7a,0xf4,0xc1,0xff,0xe9,0xff,0xc2,0xff,0xe3,0xff,0xc1,0xff,0xa4,0x8f, +0xe2,0x1, 0xc1,0x7f,0x39,0x95,0x3c,0x65,0xe0,0x0, 0x17,0x80,0xe0,0xb, 0x3c,0x25, +0x21,0x15,0xe2,0x0, 0x7f,0x4, 0x37,0xa1,0x3f,0x9e,0x9d,0xf, 0x17,0x0, 0x8f,0xd4, +0x3f,0xbe,0xc7,0x1, 0x3f,0x9b,0x37,0xa1,0x3f,0x99,0x96,0x8f,0x3e,0x6e,0xe3,0xff, +0xc6,0x7f,0x3e,0xaa,0x3e,0x72,0xb6,0x8f,0x4, 0xf3,0x3c,0x73,0x1, 0x1d,0xe0,0x80, +0x8f,0x98,0x0, 0xe5,0x96,0xf6,0xe0,0xc, 0x37,0xa1,0xe3,0xfe,0xce,0xea,0xb6,0x8e, +0x3e,0x1b,0x4, 0x44,0xe2,0x1, 0xce,0x96,0xe0,0xd, 0x37,0xa1,0x3e,0x9b,0xe7,0xff, +0x5, 0x3f,0xb4,0xd, 0xe7,0xff,0x0, 0xbc,0xe0,0x1, 0xb7,0x85,0xe7,0xff,0x0, 0x96, +0xb7,0xf5,0xe7,0xff,0x0, 0x89,0xe0,0x0, 0xc0,0x50,0xb, 0xe1,0x14,0x80,0x3c,0x69, +0x39,0x69,0x39,0xe9,0xe7,0xfe,0x0, 0x84,0x3c,0xef,0x3c,0x6f,0x39,0xef,0xe7,0xfd, +0x0, 0xff,0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x1, 0x1c,0x7b,0xa4,0x8f,0xef,0xfe, +0xd9,0x8d,0xde,0x91,0xdb,0xf0,0xdc,0x35,0xe0,0x1, 0xd5,0x7d,0x2c,0x5, 0xe0,0x3, +0x1f,0xc0,0xac,0xf, 0x8, 0xe1,0xe0,0x3, 0x1f,0xc0,0x17,0x1, 0xaf,0xf, 0x8, 0xe1, +0xea,0x12,0x7f,0xb4,0xe0,0x1, 0x17,0x2a,0xe0,0x2e,0x3c,0xe, 0xa6,0x8f,0x27,0x2, +0x26,0x89,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1f,0x58,0x1, 0xe, 0x17,0xea,0xaf,0x8e, +0x38,0x82,0xe0,0x1, 0x1f,0x58,0x8e,0x8e,0xc6,0xff,0xae,0x8e,0x16,0x80,0xbe,0x8f, +0x17,0xea,0xaf,0x8e,0x38,0x82,0xe2,0x0, 0xcc,0x9, 0x1, 0xf9,0x16,0x82,0xbe,0x8f, +0x0, 0xee,0xe0,0x2, 0x1f,0xb6,0xea,0x12,0x7f,0x32,0x8c,0xf, 0xe0,0xd, 0x34,0x22, +0x9f,0x8e,0xc6,0x81,0x3f,0xfd,0x5, 0x4, 0xe0,0x1, 0x14,0x7f,0x38,0x82,0xc7,0x81, +0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xb7,0x8e,0x1, 0xb, 0xe2,0x0, 0xcf,0x82, +0x1, 0x76,0xe0,0x3, 0x1f,0x39,0xa7,0xe, 0x3f,0x9e,0xe0,0x40,0x8c,0x3f,0x38,0x82, +0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8c,0x3f,0x38,0x82,0xe0,0x2, 0x1e,0x93,0x17,0x6, +0xac,0xd, 0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f,0xe2,0x0, 0xc7,0x5, +0x27,0xc, 0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xc0,0x17,0x1, 0xe0,0x4, 0xaf,0x7f, +0x5, 0x8a,0x17,0x80,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1f,0xc0,0x17,0x3, 0xe0,0x4, +0xaf,0x7f,0x38,0x82,0x38,0x82,0x8, 0xb3,0x39,0xe9,0x2c,0x1d,0xe0,0x0, 0x1f,0x30, +0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0x3a,0xe0,0x2, 0x1e,0x93,0x17,0x6, 0xa9,0x8d, +0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f,0xe2,0x0, 0xc7,0x5, 0x2f,0x23, +0xe0,0x2, 0x1f,0xc0,0x17,0x3, 0xe0,0x4, 0xaf,0x7f,0x17,0x1, 0xe0,0x3, 0x1f,0x9a, +0xaf,0xf, 0x9, 0xe1,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0x39,0x68,0x5, 0xa1,0xe4,0x1, 0xcc,0x0, 0xe2,0x0, 0xcc,0x6f,0x5, 0xa3,0xe2,0x1, +0xc9,0x7c,0x1, 0x23,0xe2,0x1, 0xc9,0x7d,0x1, 0x19,0xe0,0x3, 0x1f,0x9a,0x17,0x1, +0xaf,0xf, 0x9, 0xe1,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xc0,0x17,0x1, 0xe0,0x4, +0xaf,0x7f,0x5, 0xf4,0x17,0x80,0xaf,0x8d,0x0, 0xf1,0xe0,0x2, 0x1f,0x66,0x8f,0xe, +0x2f,0x44,0x9, 0xe1,0x3c,0x69,0xdf,0x55,0x0, 0xe6,0xe0,0x0, 0x1f,0xad,0xa9,0x8f, +0x9, 0xe1,0xe0,0x0, 0xd8,0x73,0x0, 0xdc,0x3c,0x63,0x9, 0xa1,0xe7,0x7e,0x0, 0xe0, +0xe0,0x0, 0x24,0x52,0xe2,0x0, 0xcc,0x3, 0x2, 0x91,0xe0,0x0, 0x1f,0x9b,0x8f,0x8f, +0xe0,0x0, 0x2f,0xcf,0xe0,0x0, 0x1f,0x18,0xe0,0x2, 0x1e,0xb1,0x3f,0xee,0xbf,0xd, +0x3c,0x1f,0xe0,0x40,0x8f,0x98,0x3c,0x6f,0x38,0x82,0xe2,0x0, 0xcc,0x5f,0xe0,0x0, +0x5, 0xc8,0x17,0xad,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xc5,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xd5,0xe0,0x0, 0x17,0xe7,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x5, 0xe6,0xe7,0xff,0x17,0x80,0x3f,0x98,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f, +0xe2,0x0, 0xcf,0x6f,0x5, 0xb4,0xe2,0x1, 0xcc,0x7c,0xe0,0x1, 0x1, 0xb, 0xe2,0x1, +0xcc,0x7d,0xe0,0x1, 0x1, 0xd, 0xe2,0x1, 0xcc,0x7e,0xe0,0x1, 0x17,0xff,0x1, 0x8e, +0xe0,0x2, 0x1f,0xc8,0x17,0x5, 0x8f,0x8f,0x3f,0x3f,0xe0,0x3, 0x1f,0xb0,0x3f,0x9e, +0x8f,0x8f,0x0, 0x84,0xe0,0x2, 0x1f,0x93,0x8f,0x8f,0x3c,0x6f,0x38,0x82,0xe0,0x1, +0x1f,0x5a,0xe0,0x2, 0x1e,0xb1,0x3f,0xee,0xbf,0xd, 0xe7,0xff,0x0, 0xb3,0xe0,0x2, +0x1f,0xb1,0xa7,0x8f,0xe7,0xff,0x0, 0xae,0xe2,0x1, 0xcc,0x53,0x1, 0x11,0xe0,0x1, +0x1f,0x58,0x8f,0x8e,0xc7,0xff,0xaf,0x8e,0xe7,0xfd,0x0, 0xfd,0xe2,0x1, 0xcc,0x0, +0xe0,0x0, 0x1, 0x63,0xe0,0x2, 0x1f,0x40,0x3f,0x9e,0x8f,0x8f,0x0, 0xdf,0xea,0x12, +0x7f,0xb2,0x17,0x0, 0xb7,0xf, 0x0, 0xf1,0xe2,0x1, 0xcc,0x6b,0xe0,0x0, 0x1, 0x44, +0xea,0x12,0x7f,0x30,0x8e,0xe, 0x16,0x81,0x3e,0x9c,0xea,0x4f,0x7f,0x94,0xe2,0x1, +0xc6,0xff,0xe9,0xff,0xc7,0xff,0xe2,0x0, 0xce,0x83,0x3f,0x9c,0x8f,0x8f,0x1, 0x25, +0xae,0x8e,0x16,0xeb,0xe0,0x1, 0x1f,0x58,0xae,0x8e,0x0, 0xc0,0xe0,0x2, 0x1f,0x40, +0x16,0xe0,0xe0,0x2, 0x8f,0x8e,0x3e,0x9f,0xe2,0x0, 0xce,0x9f,0x2, 0x9d,0xe0,0x1, +0x1e,0xd3,0x3f,0x9d,0xe0,0x44,0x8f,0x8f,0xe0,0x2, 0x8e,0x8e,0xe2,0x1, 0xcc,0x1a, +0xc6,0x81,0xe0,0x2, 0xae,0x8e,0xe7,0xff,0x1, 0xaa,0xe0,0x1, 0x1f,0x58,0xe7,0xff, +0x16,0x99,0xae,0x8e,0xe7,0xff,0x0, 0xa3,0xea,0x12,0x7e,0xb4,0x16,0x0, 0xae,0xe, +0x17,0x0, 0xbf,0xd, 0x0, 0xd7,0xe0,0x2, 0x8e,0x8e,0xe0,0x1, 0x1f,0xc2,0x3f,0x9d, +0x8f,0x8f,0x0, 0xe3,0xea,0x12,0x7f,0xb0,0x17,0x1, 0xaf,0xf, 0x3f,0xe8,0x0, 0xca, +0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0xff,0xe7,0xff,0x0, 0x89,0xe0,0x0, 0x1f,0xad, +0x8f,0x8f,0xe7,0xff,0x0, 0x84,0xe7,0xda,0x0, 0xc6,0xe0,0x2, 0x1f,0x93,0x9f,0x8f, +0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x86,0xe2,0x0, 0xcf,0x84,0x1, 0x5, 0x14,0x0, +0x38,0x82,0xe7,0xfe,0x0, 0x9f,0xe7,0x6f,0x0, 0xe8,0xe0,0x2, 0x1f,0x93,0x9f,0x8f, +0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x85,0xe2,0x0, 0xcf,0x84,0x1, 0x4, 0x38,0x82, +0xe7,0xfd,0x0, 0xbb,0xe7,0x6a,0x0, 0xde,0x8, 0xb4,0xe0,0x0, 0x1f,0xbd,0xa1,0xf, +0xa7,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x97,0xa7,0x2, 0x17,0xfe,0x3f,0x5f,0xea,0x12, +0x7f,0xba,0xbf,0x2, 0x8f,0xf, 0x27,0x22,0xe0,0x0, 0x1a,0x30,0xe0,0x1, 0x19,0xd8, +0x17,0x81,0x8c,0xf2,0xaf,0x84,0x8c,0x3, 0xdf,0xd9,0x17,0x0, 0xaf,0x4, 0x8f,0x83, +0xc7,0x81,0xaf,0x83,0xa7,0x82,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x2f,0x82,0xa, 0x61, +0xa7,0x2, 0x16,0xfd,0xe0,0x1, 0x1f,0xd8,0x3f,0x5d,0xbf,0x2, 0x8f,0xf, 0xc7,0x1, +0xaf,0xf, 0x8c,0xf, 0xdf,0xb3,0xac,0x72,0xa, 0x61,0x17,0x1, 0xaf,0xf, 0x87,0x72, +0xe0,0x1, 0x1f,0xd8,0xaf,0xf, 0x8c,0xf, 0xdf,0xa9,0xac,0x72,0xa, 0x61,0xe0,0x0, +0x1f,0xbd,0x16,0x7e,0xa6,0x8f,0xea,0x12,0x7f,0xba,0xa7,0x3d,0x3f,0x5c,0xbf,0x3d, +0x17,0x0, 0xaf,0xf, 0x38,0x82,0x8, 0xb4,0xe0,0x1, 0x1a,0x5a,0xe0,0x2, 0x19,0x93, +0x11,0x0, 0x15,0x3e,0xe0,0x1, 0x14,0xff,0x3c,0x64,0xa9,0x3, 0xe0,0x3, 0xdd,0x9c, +0xe0,0x0, 0x1c,0x18,0x15,0x3e,0xe0,0x1, 0x14,0xff,0xe0,0x3, 0xdd,0x95,0xe0,0x2, +0x1f,0xb1,0xba,0xf, 0xef,0xfc,0xdc,0xd7,0xea,0x12,0x7f,0xba,0xe0,0x1, 0x1f,0x58, +0xa9,0xf, 0xe0,0x0, 0x1f,0xbd,0xa9,0xe, 0xa7,0x8f,0x81,0x83,0xa9,0xff,0xa, 0x61, +0x8, 0xb2,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x85,0xe0,0x0, 0x14,0xda,0x39,0x68, +0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x9c,0xe1,0xd, 0x14,0x6, 0xe0,0x3, 0xd6,0x7a, +0xe0,0x0, 0x14,0xff,0x3c,0xd8,0xe0,0x1, 0xcc,0x80,0xe1,0xd, 0x14,0x6, 0xe0,0x3, +0xd6,0x8f,0xe2,0x0, 0xc9,0x5a,0x1, 0x6, 0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x3, +0xd6,0x87,0xe0,0x0, 0x14,0xda,0x14,0x4, 0xe0,0x3, 0xd6,0x82,0xe0,0x0, 0x14,0xda, +0x14,0x5, 0x9, 0x21,0xe0,0x6c,0x0, 0xfc,0x8, 0xb4,0xe0,0x2, 0x19,0xb8,0x15,0x4, +0x3c,0xe3,0x14,0x0, 0xef,0xfd,0xd1,0xf6,0x9d,0x13,0x17,0xf8,0x3f,0x9a,0xe2,0x1e, +0xcf,0xf7,0x12,0x0, 0x2, 0x96,0x11,0x7e,0x39,0x1a,0xe3,0xff,0xc1,0x7f,0x3c,0xe3, +0x3d,0x62,0x14,0x2, 0x99,0x83,0xef,0xfd,0xd1,0xe5,0xe0,0x2, 0x1c,0x37,0x3d,0xe4, +0x3d,0x64,0xe0,0x9, 0x31,0x41,0x34,0x41,0xe0,0x3, 0xda,0xda,0xe0,0x24,0x39,0x88, +0x3c,0x64,0xa, 0x61,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x27,0x8f,0x8, 0xb2,0xe0,0x0, +0x19,0x37,0xdf,0xd3,0xac,0x2, 0x8f,0x82,0x2f,0x87,0xdf,0xcf,0xac,0x2, 0x8f,0x82, +0x2f,0x83,0xdf,0xcb,0xac,0x2, 0x9, 0x61,0x38,0x82,0x8, 0xb4,0xe0,0x2, 0x1f,0x91, +0x39,0xe8,0xa1,0xf, 0xe0,0x0, 0x14,0x50,0xa7,0x92,0xcf,0x90,0xbf,0x92,0xe0,0x3, +0xd6,0x19,0x3a,0x68,0xe0,0x0, 0x14,0xda,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x30, +0x3c,0xe3,0xe2,0x1, 0xc4,0xff,0xe1,0x20,0x14,0x0, 0xe0,0x3, 0xd6,0x29,0xe0,0x9, +0x31,0xc8,0xe2,0x0, 0xc4,0x83,0xe1,0x20,0x14,0x1, 0xe0,0x3, 0xd6,0x21,0x14,0x8a, +0xe1,0x23,0x14,0x4, 0xe0,0x3, 0xd6,0x1c,0xe2,0x0, 0xca,0x5a,0x1, 0x6, 0x14,0x80, +0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x14,0xa7,0x92,0x17,0x6f,0x3f,0xde,0xbf,0x92, +0xa, 0x61,0x8, 0xb4,0xe0,0x2, 0x1f,0x91,0xe0,0x0, 0x14,0x50,0xa1,0x8f,0xa7,0x93, +0xcf,0x90,0xbf,0x93,0xe0,0x3, 0xd5,0xe6,0xe0,0x0, 0x14,0xda,0x3a,0x68,0xe0,0x0, +0x14,0x50,0xe0,0x3, 0xd5,0xfd,0xe1,0x20,0x14,0x1, 0xe0,0x3, 0xd5,0xdb,0x39,0x68, +0xe1,0x20,0x14,0x0, 0xe0,0x3, 0xd5,0xd6,0x31,0x28,0xe2,0x6, 0xc1,0x0, 0xe2,0x0, +0xca,0x5a,0x39,0x48,0xe3,0xff,0xc1,0x7f,0x1, 0x6, 0x14,0x80,0xe0,0x0, 0x14,0x50, +0xe0,0x3, 0xd5,0xe6,0xa7,0x93,0x17,0x6f,0x3f,0xde,0x3c,0x62,0xbf,0x93,0xa, 0x61, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8a,0xe0,0x2, +0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0x5, 0x82, +0x38,0x82,0xe0,0x2, 0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xfa,0x8, 0xb2, +0xe0,0x3, 0x19,0x37,0x9f,0x82,0xe2,0x0, 0xcf,0x82,0x2, 0x82,0x9, 0x61,0xe0,0x0, +0x1f,0xaa,0x9c,0xf, 0xe0,0x3, 0xdc,0xd3,0xe0,0x3, 0xdc,0xd5,0xe0,0x0, 0x14,0xd3, +0xe0,0x3, 0xdc,0x25,0xeb,0xe6,0x7f,0x4, 0xe3,0xff,0xc4,0x7f,0xe0,0x1, 0x17,0xbc, +0x3f,0x98,0x9e,0x8e,0xe3,0xff,0xc7,0xff,0xea,0x12,0x7e,0x3c,0x3f,0xfd,0xb7,0x8c, +0x3, 0x98,0xc6,0xf9,0x3f,0xfd,0x4, 0xf, 0xe0,0x1, 0x17,0xb4,0x3f,0x98,0xe3,0xff, +0xc7,0xff,0xe2,0x1, 0xcf,0xbb,0x2, 0x86,0xe0,0x2, 0x17,0x87,0x3f,0x98,0xe3,0xff, +0xc7,0xff,0xb7,0x8c,0x3c,0x6f,0xb7,0x8e,0xdf,0x51,0x17,0x80,0xb7,0x82,0x9, 0x61, +0xc6,0x87,0x3f,0xfd,0x2, 0x78,0xe0,0x1, 0x17,0xc4,0x3f,0x98,0xe3,0xff,0xc7,0xff, +0xe2,0x2, 0xcf,0x8e,0x5, 0xef,0xe0,0x0, 0x17,0xf1,0x3f,0x98,0xe3,0xff,0xc7,0xff, +0xb7,0x8c,0x0, 0xe9,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81, +0x27,0x8a,0xe0,0x2, 0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x81,0x5, 0x82,0x38,0x82,0xe0,0x2, 0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0xfa,0x8, 0xb5,0x39,0x68,0xe0,0x1, 0x14,0x4e,0xdf,0x20,0xe0,0x3, 0x1a,0x37, +0x17,0x80,0xb7,0x84,0x11,0x83,0x12,0x90,0x21,0xc, 0x9f,0x84,0x3c,0x65,0xe2,0x0, +0xcf,0x82,0x2, 0x87,0xc1,0xff,0xe2,0x1, 0xc1,0xff,0xef,0xfd,0xd6,0x5f,0x29,0xf6, +0xa, 0xe1,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8b, +0xe0,0x2, 0x1f,0xba,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x1, 0x6, 0x27,0x8c,0xe2,0x0, +0xcf,0x81,0x1, 0xe, 0x38,0x82,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x7, 0x2f,0xf9,0xe0,0x1, 0x14,0xc8,0x14,0x0, 0xe0,0x69,0x0, 0xb6,0xe0,0x1, +0x14,0xc8,0x14,0x1, 0xe0,0x69,0x0, 0xb1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe0,0x1, +0x1f,0xdc,0xe0,0x2, 0x1f,0x23,0x16,0x0, 0xa7,0x8f,0xae,0xe, 0xe0,0x1, 0xa7,0xff, +0x37,0xc2,0xe2,0x0, 0xc7,0x81,0x27,0x95,0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1e,0xb1, +0xa7,0x8f,0xa6,0xd, 0xa6,0x9f,0xce,0x90,0xbe,0x9f,0xe0,0x0, 0x16,0xd4,0xb6,0xdc, +0x8e,0xfc,0x16,0x6f,0xe2,0x0, 0xc6,0x83,0xae,0x8e,0xa6,0x9f,0x3e,0xdc,0xbe,0x9f, +0xe0,0x2, 0x1b,0xe6,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x5d,0x8f,0xe, +0xe0,0x1, 0x27,0x1b,0xe0,0x0, 0x1f,0x37,0x8a,0xe, 0xe0,0x0, 0x22,0x72,0xe0,0x2, +0x1f,0x91,0x12,0x3, 0xa2,0x8f,0xe0,0x3, 0x1f,0xb1,0xe0,0x2, 0x19,0xb8,0xa1,0xf, +0xf0,0x0, 0x17,0x54,0xf0,0x40,0x3e,0xe4,0xf0,0x0, 0x14,0x50,0xf0,0x0, 0x16,0x5a, +0x13,0x5, 0xf7,0x24,0x15,0x82,0xf7,0x24,0x15,0x3, 0xf7,0x24,0x14,0x84,0xa7,0x95, +0xcf,0x90,0xbf,0x95,0x17,0xf8,0x9c,0x3, 0x3f,0x98,0xe2,0x1e,0xcf,0xf8,0xe0,0x1, +0x2, 0x96,0xf0,0x0, 0xb7,0x52,0xc4,0x7e,0xf0,0x0, 0xae,0xb2,0xe3,0xff,0xc4,0x7f, +0xf0,0x0, 0xb4,0x52,0xe2,0x0, 0xcc,0x8, 0xf0,0x0, 0xae,0x32,0xe0,0x0, 0x5, 0xeb, +0x16,0x80,0xf7,0xff,0x13,0xfd,0x3f,0x6d,0x17,0x88,0x3e,0x6d,0xf0,0x17,0x3b,0x98, +0x26,0x21,0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0xf0,0x40,0x3b,0x6c,0xe0,0xb, 0x39,0x9f, +0x8c,0x8b,0x15,0x83,0x15,0x1, 0x3d,0x9d,0xb7,0x52,0x3d,0x1e,0xe8,0x40,0x3d,0xf6, +0xc7,0x81,0x3f,0x6a,0xac,0xb2,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc7,0xff,0xe0,0x0, +0x3, 0x47,0xf0,0x2e,0x3b,0x9f,0xe0,0x0, 0x27,0x46,0xe1,0x2e,0x3c,0x1f,0xe0,0x0, +0x27,0x42,0xe0,0xc, 0x39,0x9f,0x8d,0xc, 0x8d,0xac,0x8f,0x1c,0x8e,0xbc,0x35,0x28, +0xe0,0xc, 0x35,0xa8,0x3e,0x9c,0x3f,0x1a,0xc7,0x84,0xe3,0xff,0xc7,0x7f,0xe3,0xff, +0xc6,0xff,0xe3,0xff,0xc7,0xff,0xf0,0x40,0x3b,0x66,0x16,0x5, 0x0, 0xd0,0xe0,0x2, +0x1f,0x11,0xa2,0x8e,0xe0,0x3, 0x1f,0x31,0xa1,0xe, 0xe0,0x0, 0x2f,0xcc,0xa7,0x15, +0xe0,0x0, 0x16,0xd0,0xcf,0x10,0xbf,0x15,0xe0,0x0, 0x16,0x5a,0xb6,0xd2,0xe7,0x24, +0x17,0x10,0xae,0x32,0xb7,0x52,0xaf,0xb2,0xb6,0xd2,0x17,0x6f,0xaf,0xb2,0xa7,0x95, +0x3f,0xde,0xbf,0x95,0x22,0x9, 0xdf,0x1e,0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e, +0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x3c,0x7f,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0xb5,0xd2,0xe7,0x24,0x16,0x5, 0x8f,0xf2,0xf0,0x0, 0xb5,0x52, +0xe4,0xd, 0x37,0xa8,0x8f,0xf2,0xf0,0x0, 0xb4,0xd2,0xe4,0xf, 0x37,0xa0,0x8f,0x72, +0xb6,0x52,0x3f,0x9d,0x8e,0xf2,0x37,0x28,0x3f,0x9d,0xa6,0x93,0x3f,0x9e,0xf0,0x0, +0xb4,0x52,0x17,0x0, 0x3f,0xfd,0xaf,0x32,0x1, 0x22,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xc2,0x7f,0xbf,0x95,0xe2,0x1, 0xc2,0x7f,0xe7,0xfe,0x2a,0x5b,0x8f,0x87,0xe7,0xff, +0x27,0xb8,0xa7,0x95,0xe0,0x0, 0x17,0x50,0xcf,0x90,0xbf,0x95,0xe0,0x0, 0x16,0x5a, +0xb7,0x52,0xe7,0x24,0x16,0x90,0xae,0x32,0x17,0x80,0xb6,0xd2,0xaf,0xb2,0xb7,0x52, +0xe7,0xff,0x0, 0xb5,0x86,0xe, 0xae,0xe, 0xe7,0xfe,0x0, 0xa3,0xe0,0x0, 0x17,0xf0, +0xb7,0xd2,0x16,0x2a,0xae,0x32,0x3c,0x66,0xef,0xfd,0xd5,0x28,0xe0,0x0, 0x16,0xf6, +0xb6,0xd2,0xe0,0x0, 0x17,0x75,0x8f,0xf2,0xb7,0x52,0x37,0xa8,0x8e,0xf2,0x9f,0x13, +0x3f,0x9d,0xe3,0xff,0xc7,0xff,0x3f,0x7f,0x1, 0xc9,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xbf,0x95,0x12,0x1, 0x8f,0x87,0x0, 0xcc,0x8, 0xb3,0x39,0x68,0xe0,0x0, 0x14,0x50, +0xe0,0x3, 0xd3,0xe0,0x39,0xe8,0xe0,0x0, 0x14,0xda,0xe0,0x0, 0x14,0x50,0xe0,0x3, +0xd3,0xf7,0x3c,0x62,0xe0,0x3, 0xd3,0x61,0xe2,0x0, 0xc9,0xda,0x39,0x68,0x1, 0x6, +0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd3,0xeb,0x3c,0x62,0x9, 0xe1,0x8, 0xb1, +0xc0,0x7c,0x15,0x2, 0x14,0x86,0x3c,0x90,0x3c,0x6a,0xef,0xfc,0xdf,0x63,0x5c,0x3, +0x15,0x2, 0xe2,0x0, 0x7c,0x84,0xef,0xfc,0xdf,0x5d,0x4f,0x4, 0x4f,0x85,0xe0,0xd, +0x3f,0x1f,0xe2,0x1, 0xce,0xff,0x1, 0x8, 0xe0,0x2, 0x1f,0xc0,0x17,0x7f,0xe0,0xc, +0xaf,0x4f,0xc0,0x4, 0x8, 0xe1,0xe0,0x2, 0x1f,0xc0,0xe0,0xc, 0xaf,0x4f,0xc0,0x4, +0x8, 0xe1,0xe0,0x0, 0x1f,0xad,0x8f,0x8f,0xe2,0x0, 0xcf,0xda,0x1, 0x2, 0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0xf8, +0xe7,0xfa,0x0, 0x90,0xe0,0x1, 0x1f,0xc2,0xe0,0xa, 0x8f,0xdf,0x27,0xb1,0xe0,0x1, +0x1f,0xc4,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, 0x1, 0x6b, +0x8f,0xef,0x37,0xa6,0xc7,0xff,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcc,0x3f,0x2, 0xa1, +0xe0,0x0, 0x1f,0xf2,0xe0,0x0, 0x1f,0x71,0x8f,0x8f,0x8f,0xe, 0xe0,0xd, 0x37,0xa8, +0x17,0xbf,0xe0,0x8, 0x3f,0xa8,0xe0,0xf, 0x3f,0x4d,0x3c,0x3f,0xe0,0x0, 0x1f,0xf0, +0x34,0x48,0x8f,0x8f,0x3c,0x7f,0x3f,0x6f,0xe0,0x6e,0x3d,0xa8,0x3f,0xae,0xe2,0x5, +0xcf,0xcf,0xe0,0x5, 0x14,0x4f,0xe0,0x68,0x3d,0xaf,0xe3,0xff,0xc4,0x7f,0x38,0x82, +0xe0,0x1, 0x1f,0x31,0xe0,0x1, 0x1e,0xb0,0x8f,0xe, 0xc7,0xc1,0x8e,0x8d,0x3c,0x7f, +0x37,0x28,0xe0,0xc, 0x3e,0xce,0x3, 0x3d,0xe0,0x0, 0x1f,0xef,0x8d,0x8f,0xe0,0x0, +0x1f,0xee,0x35,0xa8,0x8f,0xf, 0xe0,0x0, 0x1f,0xed,0x37,0x28,0x8e,0x8f,0xe0,0x0, +0x1f,0xec,0x3e,0xcb,0x8f,0x8f,0x3c,0x7d,0x3f,0xce,0xe0,0x0, 0x3, 0x45,0xe0,0x0, +0x1f,0x6b,0xc6,0xff,0x8d,0x8e,0xe0,0x0, 0x1f,0x6a,0x35,0xa8,0x8f,0xe, 0xe0,0x8, +0x3e,0xa8,0xe0,0xd, 0x3f,0x4b,0x3c,0x3d,0xc7,0xff,0x34,0x48,0x3f,0xa8,0xe0,0x0, +0x1f,0x70,0x8c,0xe, 0x3f,0xf8,0x4, 0xca,0xe0,0x0, 0x1f,0x69,0x8f,0xe, 0xe0,0xe, +0x3e,0x2e,0x3e,0xee,0xe3,0xff,0xc6,0xff,0x3f,0xfd,0xe0,0x6f,0x3a,0xae,0xe7,0xff, +0x0, 0xb8,0x8f,0xff,0x37,0xa6,0xc7,0xff,0xe3,0xff,0xc7,0xff,0xe7,0xff,0x0, 0x97, +0xe0,0x0, 0x1f,0x68,0xe0,0xf, 0x3c,0x2f,0x8e,0x8e,0xe0,0x0, 0x1f,0x67,0x36,0xa8, +0x8f,0xe, 0xe0,0x8, 0x3f,0x4d,0xe0,0x0, 0x1f,0x69,0x3f,0xb8,0x8f,0xe, 0x37,0xc8, +0x3f,0xfe,0x16,0xff,0x3e,0x9e,0xe0,0x6f,0x3b,0xad,0xe0,0xe, 0x3e,0x2e,0x3f,0x9e, +0xe7,0xff,0x0, 0x97,0xe0,0x0, 0x1f,0x66,0x3c,0x2d,0x8d,0x8e,0xe0,0x0, 0x1f,0x65, +0x35,0xa8,0x8f,0xe, 0xe0,0xd, 0x3f,0x4b,0x3c,0x3d,0xe0,0xd, 0x34,0x48,0x3f,0x9d, +0xe7,0xff,0x0, 0xbf,0xe0,0x1, 0x1f,0xc2,0x3e,0xe8,0xe0,0xa, 0x8f,0xdf,0x27,0xaa, +0xe0,0x1, 0x1f,0xc4,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, +0x1, 0x58,0x8f,0x7f,0x37,0x26,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe2,0x0, 0xce,0xbf, +0x2, 0x9a,0xe0,0x0, 0x1f,0xe4,0xe0,0x0, 0x1f,0x63,0x8f,0x8f,0x8c,0xe, 0x37,0xa8, +0x17,0x3f,0x3f,0x2d,0xe0,0xd, 0x3c,0x4f,0xe0,0x0, 0x1f,0xe2,0x3f,0x3d,0x8c,0xf, +0x37,0x8, 0x3f,0x78,0x3f,0xe8,0xe0,0x6f,0x3d,0x2e,0x3c,0x2f,0xe3,0xff,0xc4,0x7f, +0x38,0x82,0x38,0x82,0xe0,0x1, 0x1e,0x2e,0xe0,0x1, 0x1f,0xaf,0x8c,0xc, 0x16,0x41, +0x8f,0x8f,0x3e,0x1e,0x3e,0xfc,0x37,0xa8,0xe0,0xb, 0x3c,0x4f,0x3, 0x30,0xe0,0x0, +0x1f,0xe1,0x8e,0xf, 0xe0,0x0, 0x1f,0xe0,0x36,0x28,0x8c,0xf, 0xe0,0x0, 0x1f,0xdf, +0x34,0x28,0x8f,0xf, 0xe0,0x0, 0x1f,0xde,0x3f,0x4c,0x8f,0x8f,0x3e,0xfe,0x3f,0xc8, +0xe0,0x0, 0x3, 0x4a,0xe0,0x0, 0x1e,0x5d,0xe0,0x0, 0x1d,0x5c,0x8e,0xc, 0x8c,0xa, +0x36,0x28,0x3c,0x4c,0x3f,0x2d,0x3f,0x38,0x14,0x7f,0x3c,0x1f,0x37,0x8, 0x3c,0x2e, +0xe0,0x0, 0x1f,0xe2,0x8f,0x8f,0x3c,0x7f,0x3, 0x2b,0x3c,0x6f,0x38,0x82,0x8f,0x6f, +0x37,0x26,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe7,0xff,0x0, 0xaa,0x17,0xe2,0x3f,0x9e, +0x3e,0xff,0x14,0x0, 0xe7,0xff,0x3, 0x3f,0xe0,0x0, 0x1f,0xdb,0xe0,0x0, 0x1e,0x5a, +0x8f,0x8f,0x8c,0xc, 0xc7,0x40,0x37,0xa8,0xe0,0xe, 0x3e,0xae,0x3c,0x4f,0xe0,0x0, +0x1f,0xd9,0x3f,0x38,0x8f,0x8f,0x37,0x8, 0x3f,0x7f,0x16,0xff,0x3e,0x9f,0xe0,0x6e, +0x3b,0x2d,0xe0,0x8, 0x3d,0xaf,0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x38,0x82,0xe0,0x0, +0x1f,0xd9,0x8f,0x8f,0xe0,0xf, 0x3d,0xaf,0x3f,0xf8,0xe0,0x68,0x3d,0x2f,0xe3,0xff, +0xc4,0x7f,0x38,0x82,0xe0,0x0, 0x1e,0x58,0xe0,0x0, 0x1d,0x57,0x8e,0xc, 0x8c,0xa, +0x36,0x28,0x3c,0x4c,0xe0,0xe, 0x3e,0xae,0x3f,0x38,0xe0,0x8, 0x37,0x8, 0x3c,0x1f, +0xe7,0xff,0x0, 0xb8,0x8, 0xb5,0xe0,0x2, 0x1a,0xdf,0xe0,0x2, 0x1a,0x5e,0x8f,0x85, +0xe0,0x0, 0x2f,0xc5,0xe0,0x2, 0x1f,0x5d,0xe0,0x2, 0x1e,0xd5,0x8f,0xe, 0xaf,0x8d, +0xe0,0x0, 0x2f,0x4b,0xe0,0x1, 0x1f,0x8e,0x15,0xa, 0x89,0x8f,0xe0,0x2, 0x1c,0xde, +0x3d,0x33,0xe0,0x2, 0x1c,0x58,0xe0,0x3, 0xd8,0xed,0xe0,0x1, 0x1f,0xc2,0xe0,0xa, +0x8f,0xdf,0x27,0xab,0x21,0x96,0xc1,0xff,0xe2,0x1, 0xc1,0xff,0xc1,0x81,0xe4,0x0, +0xc1,0x8a,0xe0,0x2, 0x19,0x5e,0x39,0x94,0x9c,0x2, 0xc1,0xa, 0xde,0x84,0xe0,0x5, +0xb4,0x52,0xe0,0x40,0x9c,0x42,0xdf,0x27,0x39,0xf2,0xe0,0x5, 0xb4,0x62,0x1, 0xf5, +0xe0,0x19,0x9f,0x84,0xe2,0x2, 0xcf,0x81,0x1, 0x28,0xe2,0x2, 0xcf,0x80,0xe0,0x0, +0x1, 0x4c,0x8f,0x85,0x2f,0x8a,0xe0,0x0, 0x1f,0x34,0xb7,0x8e,0xe0,0x2, 0x1f,0x1b, +0xb7,0x8e,0xe0,0x1, 0x1f,0x59,0xaf,0x8e,0xa, 0xe1,0xe0,0x2, 0x1f,0x5d,0xe0,0x2, +0x1e,0xd5,0x17,0x81,0x8f,0xe, 0xaf,0x8d,0xe7,0xff,0x2f,0x3e,0xe0,0x2, 0x1f,0x5b, +0xaf,0x8e,0xe7,0xff,0x0, 0xb9,0xe0,0x2, 0x1f,0x54,0x16,0x81,0xae,0x8e,0xe0,0x2, +0x1f,0x53,0xaf,0x8e,0xe7,0xff,0x0, 0xb0,0xe0,0x0, 0x1f,0xb4,0xe0,0x2, 0x1f,0x1b, +0xe0,0x6, 0x9e,0x24,0x9f,0xe, 0xe0,0x6, 0x9e,0xb4,0x9f,0x8f,0xe0,0xe, 0x3e,0xae, +0xe0,0xf, 0x3e,0x2f,0xe4,0xa, 0x37,0x8f,0xe4,0xb, 0x37,0xf, 0xe2,0xf, 0x3d,0x4f, +0xe2,0xe, 0x3d,0xce,0x3f,0x2b,0x3f,0xaa,0x3f,0x9e,0xe0,0x0, 0x1f,0x26,0xe2,0x1, +0xcf,0x96,0xb6,0xe, 0xe0,0x0, 0x1f,0x20,0xb6,0x8e,0x5, 0x47,0xe0,0x1, 0x1f,0xd9, +0x17,0x1, 0xaf,0xf, 0xa, 0xe1,0xe0,0x6, 0x9f,0x24,0xe0,0x0, 0x1e,0xa6,0xe0,0x6, +0x9f,0xb4,0xb7,0xd, 0xe0,0x0, 0x1e,0xa0,0xb7,0x8d,0xe0,0x0, 0x1e,0xb4,0xb7,0xd, +0xe0,0x2, 0x1f,0x1b,0xb7,0x8e,0xa, 0xe1,0xe0,0x3, 0x1f,0x80,0x17,0x0, 0xb7,0x1f, +0xaf,0xf, 0xaf,0x1f,0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f, +0xe0,0x3, 0x2f,0xba,0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xf0,0x3, 0x18,0x0, 0xe8,0x0, +0x9f,0x90,0x2f,0x93,0xea,0x12,0x7f,0x47,0xe0,0x0, 0x19,0xe, 0xaf,0x8e,0x8f,0x82, +0xe0,0x0, 0x19,0x8d,0x2f,0x93,0xea,0x12,0x7f,0xc6,0x8f,0xf, 0x27,0x3, 0xc7,0x7f, +0xaf,0xf, 0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe0,0x0, 0x19,0xe, 0xc7,0xff,0xe8,0x0, +0xb7,0x90,0x8f,0x82,0xe0,0x0, 0x19,0x8d,0x27,0xef,0xe0,0x0, 0x1f,0x56,0xe0,0x0, +0x1e,0xd5,0x8f,0xe, 0xf0,0x0, 0x88,0x8d,0x37,0x28,0xf0,0x11,0x38,0xce,0xe0,0x1a, +0x97,0x73,0xf8,0x43,0x38,0x91,0xe0,0x2, 0x1e,0xfd,0xf0,0x40,0x38,0xfe,0x8c,0x4d, +0x8e,0x5d,0x5, 0xa, 0xe0,0x1, 0x1e,0xd7,0x37,0x1, 0xe0,0x3, 0x8e,0xbd,0xe2,0x0, +0xce,0x82,0xe0,0x71,0x39,0xae,0xf7,0xff,0x11,0x7f,0xf0,0x12,0x39,0x1f,0xe0,0x1, +0x1f,0xf2,0xf2,0x1, 0xc1,0x7f,0xa4,0x8f,0xe0,0x0, 0x1f,0xd4,0xf0,0x0, 0xc1,0x1, +0xf0,0x12,0x31,0x21,0x10,0xff,0x12,0x7f,0x8a,0x8f,0xf0,0x0, 0x1b,0xd, 0xf0,0x12, +0x39,0x13,0x38,0x98,0xe0,0x4, 0x3a,0x1c,0xf8,0x0, 0x8a,0x6, 0xf8,0x0, 0x89,0x96, +0xf0,0xf, 0x3a,0x3c,0xe8,0xf, 0x3f,0x93,0x37,0xa1,0x3f,0x99,0x95,0x8f,0xe8,0x40, +0x3d,0xf1,0xe0,0x2, 0x4, 0x1a,0xf1,0x2f,0x3a,0x28,0xe0,0x2, 0x2f,0x96,0xf1,0x2d, +0x39,0xac,0xe0,0x2, 0x2e,0x92,0xe8,0x43,0x3b,0x3, 0xf0,0x0, 0x12,0x81,0xe2,0x0, +0xcb,0x0, 0xe0,0xa, 0x35,0x82,0xe0,0xf, 0x35,0x81,0xf8,0x15,0x3a,0x94,0xf8,0x43, +0x3b,0x84,0x3d,0x1f,0xf2,0x1, 0xc2,0xff,0xf0,0x40,0x3c,0xe6,0xf8,0x40,0x3d,0x67, +0xe0,0x0, 0x4, 0x75,0xf2,0x0, 0xcb,0x80,0x4, 0x37,0xe8,0x40,0x3f,0x67,0x13,0x80, +0x0, 0x92,0x27,0xa7,0xe8,0x40,0x3e,0xe8,0xe8,0x40,0x3b,0xec,0xe3,0xff,0xc6,0xff, +0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3d,0x6e,0xc7,0x7f,0xe0,0x43,0x3f,0xe, 0xe3,0xff, +0xcf,0x7f,0x1, 0x1a,0xe0,0xf, 0x3f,0x3c,0xf0,0x0, 0x14,0x1, 0xe8,0xf, 0x3f,0x99, +0x37,0xa1,0x3f,0x99,0xe0,0x0, 0x97,0x8f,0xf0,0x0, 0x16,0x1, 0xe0,0x3b,0x3f,0xaa, +0xf0,0x18,0x3c,0x1d,0xf0,0x1c,0x3e,0x17,0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2d,0xdb, +0xe8,0x40,0x3f,0x7a,0x2, 0x62,0x23,0x88,0xf1,0xff,0xc4,0xff,0xf8,0x43,0x3c,0x89, +0xf3,0xff,0xcc,0xff,0x1, 0xc8,0xf0,0x40,0x3a,0x71,0x3, 0x38,0xf8,0x40,0x3c,0xe5, +0xe8,0x40,0x3c,0x75,0x5, 0xb3,0xe8,0x40,0x3f,0x65,0x13,0x80,0x0, 0x91,0x27,0xa4, +0xe8,0x40,0x3e,0xe8,0xe8,0x40,0x3b,0xeb,0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff, +0xf0,0x40,0x3c,0xee,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0x7e,0x5, 0x98,0xe0,0xf, +0x3f,0x3c,0xf0,0x0, 0x14,0x1, 0x3f,0x96,0x37,0xa1,0x3f,0x99,0x97,0x8f,0xf0,0x0, +0x15,0x81,0xe0,0x3a,0x3f,0xaa,0xf0,0x18,0x3c,0x1d,0xf0,0x1b,0x3d,0x97,0xe0,0x2f, +0x3d,0xaf,0xf7,0xff,0x2d,0x5e,0xe8,0x40,0x3f,0x79,0x4, 0xe5,0x23,0x87,0xc3,0x7f, +0xe0,0x43,0x3b,0x6, 0xe3,0xff,0xcb,0x7f,0x1, 0xcc,0xf0,0x40,0x39,0xf4,0xe0,0x1, +0x3, 0x1, 0x13,0x1, 0xe8,0x6, 0x3b,0x13,0xe2,0x1, 0xc3,0x7f,0xe0,0x40,0x3e,0x76, +0xf0,0x40,0x3c,0xe6,0xf8,0x40,0x3d,0x67,0xe0,0x0, 0x5, 0xf4,0xf2,0x0, 0xcb,0x80, +0x4, 0x37,0xe8,0x40,0x3f,0x67,0x13,0x80,0x0, 0x92,0x27,0xa7,0xe8,0x40,0x3e,0xe8, +0xe8,0x40,0x3b,0xec,0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3d,0x6e, +0xc7,0x7f,0xe0,0x43,0x3f,0xe, 0xe3,0xff,0xcf,0x7f,0x1, 0x1a,0xe0,0xf, 0x3f,0x3c, +0xf0,0x0, 0x14,0x1, 0xe8,0xf, 0x3f,0x99,0x37,0xa1,0x3f,0x99,0xe0,0x0, 0x97,0x8f, +0xf0,0x0, 0x16,0x1, 0xe0,0x3b,0x3f,0xaa,0xf0,0x18,0x3c,0x1d,0xf0,0x1c,0x3e,0x17, +0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2d,0xdb,0xe8,0x40,0x3f,0x7a,0x2, 0x62,0x23,0x88, +0xf0,0x0, 0xc4,0x81,0xf2,0x1, 0xc4,0xff,0xe8,0x40,0x3e,0x79,0x2, 0xc8,0xf0,0x40, +0x3a,0x71,0x3, 0x37,0xf8,0x40,0x3c,0x65,0xe8,0x40,0x3c,0x75,0x5, 0xb2,0xe8,0x40, +0x3f,0x65,0x13,0x80,0x0, 0x91,0x27,0xa4,0xe8,0x40,0x3e,0xe7,0xe8,0x40,0x3b,0xea, +0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3c,0x6e,0xc7,0x1, 0xe2,0x1, +0xc7,0x7f,0x3c,0x7e,0x5, 0x98,0xe0,0xf, 0x3f,0x3c,0xf0,0x0, 0x13,0x81,0x3f,0x96, +0x37,0xa1,0x3f,0x99,0x97,0x8f,0xf0,0x0, 0x15,0x1, 0xe0,0x39,0x3f,0xaa,0xf0,0x17, +0x3b,0x9d,0xf0,0x1a,0x3d,0x17,0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2c,0xde,0xe8,0x40, +0x3f,0x78,0x4, 0xe5,0x23,0x86,0xc3,0x1, 0xe2,0x1, 0xc3,0x7f,0x3e,0x76,0x2, 0xcd, +0x3a,0xfd,0xe0,0x0, 0x5, 0xd3,0xf0,0x0, 0xc3,0x2, 0xf8,0x40,0x39,0x76,0xe7,0xfd, +0x1, 0xd5,0xe8,0x0, 0x9f,0x90,0x27,0x88,0xc7,0xff,0xe8,0x0, 0xb7,0x90,0xea,0x12, +0x7f,0xc7,0x17,0x1, 0xaf,0xf, 0xe0,0xf, 0x3e,0x38,0xe0,0x1a,0x9f,0x53,0xe0,0x1a, +0x9e,0xe3,0xe0,0xc, 0x37,0x81,0xe0,0xb, 0x3f,0x1d,0x3d,0xfc,0x2, 0x1d,0x37,0x82, +0xe0,0x2d,0x3e,0x9f,0x2e,0x99,0xe0,0x2f,0x3f,0x1f,0x2f,0x96,0xea,0x12,0x7f,0xc7, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x10,0xea,0x12,0x7e,0xc5,0x8f,0x8d,0xe2,0x0, +0xcf,0x81,0xe7,0xfc,0x1, 0xe8,0xea,0x12,0x7f,0xc6,0x8f,0xf, 0x2f,0xc, 0xaf,0xd, +0xe7,0xfc,0x0, 0xe1,0x38,0x82,0xea,0x12,0x7f,0x45,0xea,0x12,0x7f,0xc6,0x16,0x81, +0xae,0x8e,0x17,0x14,0xc7,0x7f,0x8e,0x82,0xaf,0xf, 0xe7,0xfc,0x26,0xd4,0x11,0x80, +0x3a,0x63,0x3c,0x63,0x3c,0xe4,0xd0,0x99,0xc1,0x81,0x8f,0x82,0xe2,0x1, 0xc1,0xff, +0x3f,0xf3,0x2, 0xf8,0xe7,0xfc,0x0, 0xc7,0xe0,0x0, 0x1f,0xd3,0x8f,0xf, 0xe0,0x0, +0x1f,0xd2,0x37,0x28,0x8f,0x8f,0xf8,0x0, 0xaa,0x0, 0x3f,0xce,0xf8,0x0, 0xa9,0x90, +0xe8,0x0, 0xb7,0x90,0xe7,0xff,0x0, 0xad,0xe0,0x0, 0x1e,0x4e,0x8f,0x8c,0x2f,0x97, +0xea,0x12,0x7f,0xc8,0x9e,0x8f,0xe0,0x1, 0x1f,0x57,0x2e,0x8a,0xe0,0x1, 0x1e,0x89, +0x8e,0xd, 0xe0,0x1, 0x1e,0x88,0x36,0x28,0x8e,0x8d,0x3e,0xcc,0xb6,0x8f,0xe0,0x2, +0x1e,0xdf,0x8e,0x8d,0x26,0xa0,0x97,0x8f,0xb7,0x9e,0x38,0x82,0xe0,0x2, 0x1f,0xc0, +0xe0,0x1, 0x1f,0x57,0x8e,0x8f,0x8c,0x1f,0x8c,0xaf,0x8d,0x3f,0x8d,0xdf,0xea,0x12, +0x7f,0xc8,0x36,0xa5,0x34,0x25,0x34,0xa5,0x35,0x25,0x35,0xa5,0xf0,0x0, 0x13,0x80, +0xf0,0x0, 0xab,0x8c,0xb6,0x9e,0xb4,0x2e,0xb4,0xce,0xb5,0x5e,0xe0,0x1, 0xb5,0x9e, +0xb6,0x8f,0x0, 0xd4,0xe0,0x0, 0x1f,0xfa,0x8e,0x8f,0xe0,0x0, 0x1f,0xf9,0x36,0xa8, +0x8f,0x8f,0x3f,0xcd,0xb7,0x9e,0x38,0x82,0x17,0xdd,0x3f,0x98,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x8c,0x2, 0x9b,0x17,0x1, 0xe0,0xf, 0x37,0x3f,0xe2,0x30,0xc7,0xa9, +0x2f,0x9d,0xe2,0x0, 0xcc,0x25,0x1, 0x92,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f,0x3f,0xfe, +0x1, 0x16,0xe0,0x2, 0x1f,0x40,0x17,0x81,0xe0,0x4, 0xac,0xde,0xe0,0x0, 0x1f,0x4e, +0xaf,0x8e,0xe0,0x2, 0x1f,0x60,0xaf,0x8e,0x38,0x82,0xe0,0x2, 0x1f,0xc0,0x17,0x1, +0x3c,0x1f,0xe0,0x0, 0x1f,0xce,0xac,0x88,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xe6, +0x8f,0x8f,0x2f,0xe8,0x0, 0xfb,0xe0,0x0, 0x1f,0xd, 0xe0,0xf, 0x34,0x43,0x3f,0x1f, +0xe0,0x0, 0x1f,0xc7,0xe2,0x0, 0xc4,0x7, 0x3f,0x98,0x87,0x8f,0xe0,0xf, 0x84,0xe, +0x3c,0x5f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x17,0x7, 0xe0,0x0, 0x1f,0xc7,0x3f,0x58, +0x3f,0x9e,0xe0,0x0, 0x1f,0xd, 0x34,0x43,0x3c,0x1e,0x8f,0x8f,0xe0,0xf, 0x87,0x8, +0x2c,0x86,0xe3,0xf, 0x3f,0x5f,0xe0,0xf, 0xaf,0x88,0x38,0x82,0x3f,0xce,0xe0,0xf, +0xaf,0x88,0x38,0x82,0xe0,0x0, 0x1f,0x8d,0xe0,0x2, 0x1f,0x7d,0x34,0x21,0x3c,0x1f, +0x8f,0x88,0x8e,0xde,0x8f,0x18,0x3f,0xbd,0x3f,0x9e,0xe0,0x1, 0x1f,0x72,0x37,0xa1, +0xa7,0xe, 0x3f,0x9e,0x94,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xfd,0xe0,0x1, 0x1f,0x57, +0x8e,0xef,0x9f,0x9e,0x3e,0xf8,0x2, 0x82,0x9f,0xce,0xe0,0x2, 0x1f,0x3c,0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0x1, 0x3, 0x3c,0x6f,0x38,0x82,0x2c,0x5, 0xe0,0x1, 0x17,0x87, +0x3c,0x6f,0x38,0x82,0xe0,0x1, 0x1e,0xc2,0xe0,0xe, 0x8f,0x1d,0xc7,0x7f,0xe0,0x28, +0x3f,0x8, 0x2c,0x75,0xe0,0x28,0x3c,0x88,0x2c,0x72,0xe0,0xe, 0x8f,0x2d,0xc7,0x7f, +0x3c,0xfe,0xe0,0x1, 0x17,0x7, 0xe0,0x6e,0x39,0xaf,0x3f,0xee,0x0, 0xe5,0x0, 0x0, +0xf0,0x0, 0x1a,0x8e,0xe8,0x0, 0x8e,0x5, 0x26,0x3d,0x16,0x0, 0xe0,0x0, 0x1d,0x8d, +0xf0,0x0, 0x1b,0x47,0xe0,0x40,0x3f,0xec,0xe0,0xd, 0x37,0xc3,0x15,0x7, 0x3d,0x5f, +0xe2,0x0, 0xc6,0x9f,0x3e,0x9b,0xe8,0xa, 0x3d,0x16,0x85,0xa, 0xe0,0xf, 0x86,0x8d, +0xe0,0xe, 0x37,0xa1,0x3e,0xda,0xe0,0x17,0x3d,0x9e,0x14,0x7, 0xe0,0xe, 0x36,0x43, +0xe0,0x9, 0x36,0x21,0x3c,0x5c,0xe2,0x0, 0xc7,0x1f,0xc7,0x81,0x15,0x1, 0xe2,0x1, +0xc6,0xff,0x3c,0x9b,0x3f,0x1b,0xe8,0x8, 0x3c,0x16,0xe2,0x1, 0xc7,0xff,0x3d,0x1c, +0x26,0x8d,0xe8,0x0, 0x9e,0x7, 0x86,0x88,0xb6,0x9, 0x3e,0x6a,0xe0,0xf, 0x85,0xe, +0xe2,0x1, 0xc6,0x7f,0x3e,0xca,0xe0,0xf, 0xae,0x8e,0xe8,0x0, 0x8f,0x5, 0x3f,0x7f, +0x2, 0xcc,0xe8,0x0, 0xae,0x5, 0x38,0x82,0x8, 0xb5,0xe0,0x0, 0x19,0x41,0xe0,0x3, +0x1a,0x45,0x17,0x81,0xe0,0x1, 0x19,0xd2,0xaf,0x82,0xaf,0x84,0x17,0x80,0xaf,0x83, +0xef,0xff,0xdf,0xb0,0xe0,0x0, 0x1f,0x8e,0xe0,0x0, 0x1c,0x8d,0x8d,0xf, 0xe0,0x1, +0x25,0x46,0xf7,0xff,0x13,0xff,0xe0,0x2, 0x1f,0xfd,0xf0,0x17,0x3b,0x9a,0xf2,0x1, +0xc3,0xff,0xf0,0x0, 0x89,0x4f,0xe0,0x1, 0x1f,0x72,0xf0,0x0, 0xc3,0x81,0xf0,0x0, +0x11,0x80,0xf0,0x17,0x33,0xa1,0x12,0xfe,0xa0,0x8e,0xe8,0x5, 0x3a,0x92,0xf0,0x0, +0x88,0x5f,0xf0,0x0, 0x88,0x82,0x8d,0x84,0x3f,0x69,0xf0,0x17,0x3b,0x99,0xe8,0x40, +0x3e,0xe3,0xe8,0x40,0x3e,0x63,0xf8,0x40,0x3b,0x63,0xf1,0xff,0xc1,0x7f,0xf0,0x0, +0x12,0x1, 0xf8,0x40,0x3a,0xe3,0x0, 0xb1,0x3f,0xf5,0x14,0x1, 0xe8,0x8, 0x3c,0x16, +0x3, 0x38,0xf0,0x40,0x3b,0x68,0xf2,0x1, 0xc3,0x7f,0xf0,0x40,0x39,0x7f,0xe8,0x40, +0x3c,0x64,0xe8,0x68,0x3d,0x23,0xf0,0x40,0x39,0x7f,0xf0,0x40,0x39,0xe8,0xe8,0x40, +0x3c,0x65,0xe8,0x68,0x3d,0x21,0xf0,0x40,0x38,0xe8,0x8c,0x1e,0xe8,0xf, 0x3f,0xb0, +0xc7,0x2, 0x3f,0x98,0x37,0xa1,0x3f,0x91,0x97,0x8f,0xe8,0x40,0x3c,0x64,0xe2,0x3, +0xcf,0xf3,0xe8,0x40,0x3f,0xe5,0xe0,0x68,0x3a,0x2d,0xe0,0x6f,0x3a,0x2b,0xf0,0x40, +0x3b,0xfe,0x3e,0xe8,0x3d,0xef,0x1, 0x15,0x8f,0x8e,0xe2,0x0, 0xcf,0x82,0x2, 0xcd, +0x14,0x1, 0x3c,0x1c,0x1, 0xa, 0x3e,0x68,0xe2,0x1, 0xc6,0x7f,0x27,0xdf,0x0, 0xce, +0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0x0, 0xca,0xe2,0x0, 0xca,0x82,0x5, 0x75,0x0, 0xc6, +0xe0,0x0, 0x2c,0x7d,0xf0,0x0, 0x29,0xf7,0x8f,0x4, 0xf1,0xff,0xc3,0x7f,0xe2,0x0, +0xcf,0x1, 0xe0,0x0, 0x1, 0x63,0x17,0x1, 0xf2,0x1, 0xc3,0x7f,0xe9,0x2f,0x3f,0x26, +0xe1,0x2c,0x3e,0x1e,0x3e,0x5f,0xe0,0x0, 0x26,0x46,0xe0,0x3, 0x1f,0x86,0x16,0x80, +0x87,0xf, 0xae,0x82,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xaf,0xf, 0xe0,0x0, 0x27,0x43, +0x17,0x0, 0xaf,0xf, 0x17,0x81,0xaf,0x83,0xe0,0x3, 0x17,0x74,0xe0,0x3, 0x1f,0xb5, +0x10,0x81,0xb7,0xf, 0x25,0x2a,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, 0x1e,0xd, 0x89,0x4f, +0xe0,0x0, 0x1c,0x47,0xc1,0x7f,0x17,0x80,0xe0,0xe, 0x37,0xc3,0x16,0x87,0x8d,0x8c, +0x3e,0xdf,0xe2,0x0, 0xc7,0x1f,0xc7,0x81,0x3f,0x19,0x3e,0x98,0xe2,0x1, 0xc7,0xff, +0xc6,0x2, 0x25,0x83,0x3d,0xf2,0x4, 0x8, 0xe0,0xf, 0x85,0x8e,0x86,0x8d,0xe3,0xd, +0x3d,0xdd,0xe0,0xf, 0xae,0x8e,0x3f,0xfa,0x4, 0xe8,0x28,0x87,0xe0,0x3, 0x1f,0x35, +0x9f,0x8e,0x27,0x83,0xc7,0xff,0xb7,0x8e,0xa, 0xe1,0x8f,0x84,0xe2,0x0, 0xcf,0x81, +0x1, 0x1f,0xe0,0x3, 0x1f,0x86,0x8f,0xf, 0x2f,0x44,0x8f,0x2, 0xe2,0x0, 0xcf,0x1, +0x1, 0x40,0x88,0x83,0xe2,0x0, 0xc8,0x81,0x1, 0x1c,0xe0,0x3, 0x1f,0xb5,0x9f,0x8f, +0x27,0xec,0x2d,0x42,0x20,0xe4,0x0, 0xe9,0xf2,0x1, 0xc3,0x7f,0xe9,0x2f,0x3f,0x26, +0xe1,0x2c,0x3e,0x1e,0x3e,0x5f,0x17,0x80,0xaf,0x82,0xe7,0xff,0x0, 0x9e,0x3e,0x6a, +0x0, 0xfb,0xf0,0x0, 0xa8,0x82,0xe7,0xff,0x0, 0x89,0xaf,0x84,0xe7,0xff,0x0, 0x84, +0xe7,0xff,0x2d,0x2b,0xa, 0xe1,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfe, +0xc0,0x7c,0xe0,0x0, 0x1f,0xe, 0x11,0x90,0xf0,0x0, 0x8e,0xe, 0x39,0x90,0xe0,0x0, +0x1c,0x8d,0xf0,0xa, 0x36,0x21,0x3c,0x63,0xe0,0x3, 0xd4,0x4c,0xea,0x12,0x7f,0xce, +0x89,0xf, 0xea,0x12,0x7a,0xd0,0xe0,0x2, 0x21,0x7a,0xe0,0x1, 0x1f,0xf2,0xa7,0x8f, +0x7a,0x83,0xf0,0x0, 0x16,0x80,0x7f,0x81,0xe8,0x40,0x3b,0xed,0xe0,0x2, 0x1f,0xfd, +0xf0,0x0, 0x1c,0x8d,0x8f,0xdf,0xe0,0x0, 0x1a,0xc7,0x63,0x3, 0xe0,0x0, 0x7f,0x82, +0xf0,0x7, 0x14,0x7f,0xf0,0x1, 0x26,0xb, 0x14,0x90,0x3c,0x90,0xe8,0x40,0x3c,0x68, +0xf0,0x1, 0x13,0x7f,0xe0,0x0, 0x16,0x80,0xe0,0xf, 0x36,0xc3,0xf0,0x0, 0x12,0x87, +0xf0,0x15,0x3a,0xdd,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0x99,0xf0,0x15,0x3a,0x95, +0xe0,0xf, 0x87,0x8f,0xf8,0x0, 0x82,0x85,0xf0,0x0, 0x12,0x1, 0xe8,0xf, 0x3f,0xd5, +0xe2,0x1, 0xc7,0xff,0xf0,0x14,0x3a,0x1d,0x27,0xb7,0x8f,0x89,0xe2,0x1, 0xcf,0xff, +0xf0,0x40,0x39,0xef,0x1, 0x31,0xf0,0x0, 0x88,0x6, 0xf0,0x0, 0x89,0x19,0xf0,0x0, +0x88,0x96,0xf0,0xf, 0x38,0x2f,0xe3,0xff,0xc7,0xff,0xe0,0x43,0x38,0x9f,0xf8,0x15, +0x38,0xa2,0xf3,0xff,0xc2,0xff,0xe2,0x0, 0xc8,0x80,0xf8,0x13,0x39,0xa0,0xf3,0xff, +0xc1,0xff,0xf8,0x43,0x38,0x15,0xe8,0x6f,0x3d,0x23,0xf8,0x12,0x39,0x21,0xf2,0x0, +0xc8,0x0, 0xf3,0xff,0xc1,0x7f,0xe8,0x75,0x3d,0x22,0xe8,0xf, 0x3f,0x95,0xe3,0xff, +0xc7,0xff,0x3f,0xf8,0xf0,0x40,0x3a,0xe8,0xe0,0x75,0x3c,0xaf,0x3f,0xf8,0xe8,0x40, +0x3c,0x65,0xe0,0x76,0x3c,0xad,0xe8,0x40,0x3e,0xe4,0xe2,0x1, 0xc6,0xff,0xf0,0x40, +0x3e,0x7d,0xc4,0x82,0xe7,0xff,0x1, 0xaa,0xf2,0x1, 0xcb,0x7f,0x1, 0x27,0xf0,0x16, +0x33,0x21,0xf2,0x0, 0x7d,0x10,0xf8,0x1a,0x3d,0x16,0xe8,0x0, 0x8a,0xa, 0xe8,0x0, +0x89,0x9a,0x3c,0x64,0x3c,0xe3,0xdd,0xe9,0x67,0x82,0x67,0x1, 0x3f,0xb4,0xe0,0x43, +0x3c,0x18,0x3f,0x93,0x37,0xa1,0x3f,0x9e,0x97,0x8f,0x3f,0xf8,0x4, 0xf, 0xf0,0xf, +0x36,0xa1,0xe2,0x0, 0x7f,0x4c,0x3f,0x9e,0xf0,0x0, 0xc6,0x81,0xaa,0xf, 0xf2,0x1, +0xc6,0xff,0xa9,0x9f,0x17,0xff,0xe8,0x0, 0xaf,0x8a,0xf0,0x0, 0x13,0x81,0xf0,0x17, +0x3b,0x97,0xe8,0x40,0x3b,0xe7,0xe2,0x1, 0xc3,0xff,0x3b,0xf2,0xc3,0x2, 0xe7,0xfe, +0x1, 0xeb,0xe0,0x1, 0x1f,0x8e,0xf0,0x0, 0x8c,0xf, 0xf8,0x40,0x3c,0x7d,0xe0,0x0, +0x5, 0xed,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, 0x1c,0x8d,0xf0,0x0, 0xa3,0x8f,0xe0,0x2, +0x1f,0xfd,0xe0,0x0, 0x1d,0x47,0x89,0xdf,0xe8,0x40,0x3a,0x6d,0xf0,0x1, 0x12,0xff, +0xf0,0x0, 0x13,0x0, 0xf7,0xff,0x12,0x7f,0xf0,0x0, 0x26,0x51,0x15,0x90,0x3d,0x90, +0xe8,0x40,0x3c,0x65,0xe8,0x40,0x39,0x66,0xe0,0x0, 0x16,0x0, 0xe0,0xf, 0x36,0x43, +0x16,0x87,0x3e,0xdc,0xe2,0x0, 0xc7,0x9f,0x3e,0x9a,0x3f,0x99,0xf0,0x0, 0x81,0x8d, +0xe0,0xf, 0x87,0x8f,0x16,0x81,0xe8,0xf, 0x3f,0xd3,0xe2,0x1, 0xc7,0xff,0x3e,0x9c, +0x27,0x98,0xf0,0x0, 0x89,0x8b,0xf2,0x1, 0xc9,0xff,0xf0,0xf, 0x39,0xb3,0x1, 0x11, +0xf0,0x0, 0x89,0x1b,0xe8,0xf, 0x3f,0x92,0x37,0xa1,0xe8,0xf, 0x3f,0x97,0x97,0x8f, +0x3f,0xf2,0x5, 0x7, 0x3c,0x6c,0xf8,0x40,0x3d,0xe2,0xf8,0x40,0x3f,0x63,0x39,0x6f, +0x3e,0x6d,0xe2,0x1, 0xc6,0x7f,0xf0,0x40,0x3e,0x7c,0xc5,0x82,0x1, 0xd0,0xe2,0x1, +0xcc,0x7f,0x1, 0x14,0xf0,0xf, 0x36,0xa1,0xe2,0x0, 0x7f,0x4c,0x3f,0x9e,0x34,0x21, +0xe2,0x0, 0x7f,0x10,0x3c,0x1e,0xf0,0x0, 0xc6,0x81,0xf0,0x0, 0xaf,0xf, 0xf2,0x1, +0xc6,0xff,0xf0,0x0, 0xad,0x9f,0xf0,0x0, 0xaa,0x8, 0xc2,0x1, 0xe2,0x1, 0xc2,0x7f, +0xf0,0x40,0x3c,0x74,0xe7,0xff,0x1, 0xaa,0xe0,0x1, 0x1f,0xc3,0xe0,0x0, 0x14,0xcc, +0x8d,0xf, 0x3c,0x90,0x35,0x21,0xe2,0x0, 0x7c,0x10,0xe0,0x3, 0xd3,0x1b,0x64,0x3, +0xf0,0xa, 0x34,0x21,0xe0,0x1, 0x14,0xff,0xe0,0x3, 0xd3,0x4e,0xf0,0x0, 0x2e,0x8f, +0xe0,0x0, 0x1f,0xe, 0xea,0x12,0x7f,0xce,0xf0,0x0, 0xae,0x8f,0xf0,0x0, 0xae,0x8e, +0xe0,0x1, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x2, 0x36,0xa1,0xe0,0x0, +0x1c,0xd, 0x3d,0x62,0xe2,0x0, 0x7c,0x90,0xe0,0x3, 0xd2,0xfc,0x64,0x3, 0x3d,0x62, +0xe2,0x0, 0x7c,0x90,0xe0,0x3, 0xd2,0xf6,0xe0,0x0, 0x1c,0x8d,0xe0,0x0, 0x1d,0x47, +0xe0,0x0, 0x17,0x80,0xe0,0xe, 0x37,0xc3,0x16,0x7, 0x3e,0x5f,0xe2,0x0, 0xc7,0x1f, +0x3f,0x19,0x3e,0x1a,0xe0,0xf, 0x85,0x8e,0x86,0x8c,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0x3e,0xcb,0xe8,0x40,0x3f,0xfd,0xe0,0xf, 0xae,0x8e,0x1, 0xed,0xea,0x12,0x7f,0x4e, +0xf0,0x40,0x3c,0x7f,0xaf,0x8e,0xe8,0x6f,0x3c,0xa8,0xe0,0x0, 0x1f,0xe, 0xaf,0x8e, +0xe0,0x1, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x40,0x3e,0xe2,0x7a,0x83, +0xe7,0xfe,0x0, 0xb1,0x8, 0xb1,0xe0,0x0, 0xd8,0xdd,0x8, 0xa1,0xe7,0xfa,0x0, 0x9a, +0xe0,0x2, 0x1f,0xc8,0x17,0x1, 0x8f,0x8f,0xe0,0x2f,0x3f,0x8e,0xe0,0x1, 0x27,0x87, +0xe0,0x1, 0x2c,0x5, 0xe0,0x0, 0x1f,0x93,0xf0,0x0, 0x88,0x8f,0xf0,0x1, 0x28,0x81, +0xe0,0x0, 0x1f,0x8e,0xf0,0x0, 0x8a,0x8f,0xf0,0x40,0x3a,0xfe,0xe0,0x0, 0x5, 0xf9, +0xe0,0x0, 0x8, 0xb1,0xf7,0xff,0x10,0x7f,0xf0,0x0, 0x1a,0xd, 0xf8,0x10,0x38,0x15, +0xe8,0x40,0x3d,0x61,0xe8,0x40,0x3d,0xe1,0xf8,0x40,0x38,0xf0,0xe0,0x0, 0x3, 0x5e, +0xf0,0xf, 0x30,0xa1,0xf0,0x0, 0xc0,0x81,0xf2,0x1, 0xc0,0xff,0xf8,0x40,0x3a,0xf1, +0xe8,0xf, 0x3f,0x94,0x8c,0xf, 0xe0,0x0, 0x8c,0x9f,0x5, 0xef,0xf0,0x40,0x39,0x68, +0xf0,0x40,0x39,0xe9,0xe8,0x40,0x3e,0x61,0xe0,0xe, 0x36,0x21,0xe8,0xe, 0x3f,0x14, +0x8f,0x8e,0x8e,0x9e,0xe8,0xe, 0x3f,0xa2,0xe2,0x0, 0xcf,0x0, 0xe0,0xe, 0x3f,0xa8, +0xe0,0xf, 0x3c,0x2f,0xe8,0x1, 0x3e,0xa3,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xc7,0x7f, +0xe0,0x6e,0x3d,0x2f,0xe2,0x0, 0xc8,0x80,0xe0,0xf, 0x3e,0xa9,0xe0,0xd, 0x3c,0xad, +0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0xe0,0x6f,0x3d,0x2d,0x38,0xee,0x3e,0xeb, +0xe2,0x1, 0xc0,0xff,0xe2,0x1, 0xc6,0xff,0x38,0xfd,0xc6,0x1, 0xf0,0x40,0x3b,0xea, +0xf0,0x40,0x3b,0x6f,0xf2,0x1, 0xc3,0xff,0xe2,0x1, 0xc6,0x7f,0xf2,0x1, 0xc3,0x7f, +0x3, 0x82,0x3f,0x6b,0xf8,0x40,0x3b,0x77,0x3d,0xee,0xe2,0x1, 0xc5,0xff,0x3, 0x82, +0x3f,0xea,0xf0,0x40,0x3a,0xfc,0x3d,0x6f,0xe2,0x1, 0xc5,0x7f,0xe7,0xff,0x1, 0xbe, +0xf8,0x40,0x38,0xf0,0xe7,0xff,0x4, 0x26,0x14,0x4, 0xe1,0x2a,0x3c,0x2a,0x14,0x3, +0xe1,0x2b,0x3c,0x2b,0xe0,0x8, 0x3d,0x5b,0x8, 0xe1,0x14,0x0, 0x38,0x82,0x38,0x82, +0xe0,0x0, 0x1f,0x8e,0x8e,0x8f,0xe0,0x1, 0x26,0xcf,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xc0,0x70,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, 0x1a,0xd, 0xf0,0x0, 0xa4,0xf, 0xe0,0x2, +0x1f,0xfd,0xe0,0x1, 0x12,0xff,0x8b,0xdf,0xf0,0x40,0x3e,0xe9,0xf0,0x40,0x3f,0x68, +0x3d,0xe8,0x3e,0x69,0xf0,0x40,0x3e,0x64,0x3b,0x65,0xf0,0x40,0x3c,0xe5,0x3f,0x65, +0xe0,0x0, 0x11,0x80,0xf8,0x0, 0x8d,0xc, 0xf8,0x0, 0x8d,0x9c,0xf0,0xf, 0x3d,0x2b, +0xe2,0x0, 0xcf,0x80,0xf8,0x2, 0x3d,0x2e,0xf8,0xf, 0x3f,0x2a,0xe2,0x1, 0xc7,0xff, +0xe2,0x1, 0xc1,0x7f,0xe0,0x62,0x3d,0x2f,0xf0,0xa, 0x3d,0xac,0xe2,0x0, 0xcd,0x0, +0x3f,0xe2,0xf8,0xa, 0x3e,0xab,0xf8,0x2, 0x3d,0xad,0xe2,0x1, 0xc1,0x7f,0xe2,0x1, +0xc5,0x7f,0xe0,0x62,0x3d,0x2a,0x39,0x1f,0x39,0x7e,0xe8,0x40,0x3c,0x6a,0xe8,0x40, +0x3c,0xeb,0xf0,0x0, 0xc6,0x2, 0x3, 0x1f,0x7d,0x82,0x7e,0x1, 0x7e,0x83,0x7f,0x4, +0xdc,0xc, 0xf0,0xf, 0x3d,0x37,0xe0,0x43,0x3c,0x18,0xe8,0xf, 0x3f,0x9b,0x37,0xa1, +0xe8,0xf, 0x3f,0x98,0x97,0x8f,0x65,0x82,0x3f,0xf8,0x66,0x1, 0x66,0x83,0x67,0x4, +0x5, 0xa, 0x3f,0x62,0xf0,0x40,0x3c,0xe3,0xe2,0x1, 0xc7,0x7f,0xe8,0x40,0x3a,0xeb, +0xe8,0x40,0x3b,0x6a,0xc1,0x81,0xe2,0x1, 0xc1,0xff,0x39,0xfd,0xe7,0xff,0x1, 0xb4, +0xe0,0xa, 0x3b,0x37,0xf0,0x2, 0x1b,0xff,0x3d,0x15,0x35,0x21,0xf8,0x0, 0xac,0x87, +0xe8,0xa, 0x3d,0x18,0x16,0x80,0x11,0x1, 0x14,0x2, 0x14,0x84,0x0, 0x8e,0x27,0x3e, +0x97,0xc, 0x97,0x8a,0x3f,0x7f,0xe0,0x0, 0x2, 0x49,0xc6,0x81,0xe2,0x1, 0xc6,0xff, +0x39,0xfd,0xc2,0x2, 0xe0,0x0, 0x1, 0x44,0xf0,0x40,0x3c,0xfd,0x1, 0x77,0x8d,0x84, +0xf0,0x0, 0x8b,0x14,0xe0,0xe, 0x3d,0xa6,0xf0,0x43,0x3a,0x1e,0xf2,0x0, 0xca,0x0, +0xf0,0xf, 0x3b,0x25,0xe0,0x15,0x3b,0x2b,0xf2,0x1, 0xc2,0xff,0xf0,0x43,0x3a,0x1f, +0xe2,0x1, 0xc7,0x7f,0xe8,0x6e,0x3d,0x25,0xe0,0xc, 0x3d,0xb7,0xe8,0x15,0x3a,0xa6, +0xf2,0x0, 0xca,0x0, 0xf2,0x1, 0xc2,0xff,0xe2,0x1, 0xc7,0xff,0xe8,0x6f,0x3d,0x25, +0xe8,0xc, 0x3e,0x16,0x36,0x21,0xe1,0x35,0x3c,0x2f,0xe8,0xc, 0x3e,0x18,0xe1,0x2f, +0x3c,0xaf,0xe1,0x2e,0x39,0x2e,0xf7,0xff,0x2a,0xc4,0x3d,0xb7,0x27,0xc7,0xe8,0xb, +0x3d,0x96,0x35,0xa1,0xe8,0xb, 0x3d,0x98,0x27,0x41,0x97,0x8a,0x97,0xb, 0xe0,0x1, +0xc7,0xc8,0x3f,0x7f,0xe7,0xff,0x5, 0x3b,0xe8,0x0, 0xae,0x87,0xc0,0x10,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1f,0xff,0x17,0x7f,0xaf,0xf, 0x38,0x82,0x0, 0x0, +0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1e,0xde,0x8f,0xf, 0xe0,0x0, 0x2f,0x56,0xe0,0x0, +0x1f,0x8e,0xf0,0x0, 0x1a,0x8d,0xf0,0x0, 0x8b,0xf, 0xf0,0x0, 0x23,0x4d,0xe0,0x1, +0x1f,0xf2,0xf0,0x0, 0x18,0x8b,0xf0,0x0, 0xa1,0x8f,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, +0x19,0xa, 0xf0,0x0, 0x8a,0x5f,0xe8,0x40,0x3e,0x65,0x3e,0xee,0xe0,0x1, 0x14,0x7f, +0xf0,0x40,0x3b,0xee,0x8d,0xc, 0x8d,0x9c,0xe8,0xf, 0x3d,0x34,0x14,0x81,0x3f,0x9b, +0x37,0xa1,0xe8,0xf, 0x3f,0x93,0x97,0x8f,0x3c,0x9d,0xe8,0x40,0x3f,0xf7,0xc6,0x2, +0x5, 0x8, 0xe8,0x0, 0xad,0x1, 0x3c,0x6d,0xe8,0x0, 0xad,0x82,0xf0,0x40,0x3b,0xef, +0x3e,0xe9,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf6,0x1, 0xe5,0xe0,0x0, 0x1d,0x47, +0x15,0x81,0xe0,0xf, 0x37,0x43,0x16,0x7, 0x3d,0x9e,0x3c,0x7e,0x3e,0x5e,0xe2,0x0, +0xc7,0x9f,0x3f,0x6b,0xe8,0xf, 0x3f,0x95,0x3e,0x1a,0xe2,0x1, 0xc7,0x7f,0x1, 0x8, +0xe0,0xf, 0x85,0x8f,0x86,0xc, 0xe3,0xc, 0x3d,0xdc,0xe0,0xf, 0xae,0xf, 0x3e,0xfe, +0x1, 0xe8,0x38,0x82,0x38,0x82,0xe0,0x1, 0x8c,0x8d,0x8c,0x7d,0xe7,0xfd,0x0, 0xca, +0xe0,0x0, 0x1f,0x8e,0xe0,0x1, 0x1c,0xce,0x8d,0xf, 0x17,0x80,0xaf,0x89,0xea,0x12, +0x7f,0xcd,0x2d,0xd, 0xe0,0x2, 0x1f,0x48,0xad,0xf, 0x8f,0xe, 0xe2,0x0, 0xcf,0x1, +0x1, 0x15,0xea,0x12,0x7f,0xcc,0x17,0x0, 0xaf,0xf, 0x38,0x82,0x87,0xf, 0xc7,0x1, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x6, 0x5, 0x82,0x17,0x6, 0xaf,0xf, 0xe0,0x2, +0x1f,0x48,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0xed,0x8, 0xb3,0xe0,0x2, 0x1e,0xeb, +0xe0,0x3, 0x19,0x1c,0x16,0x0, 0x8f,0xd, 0xae,0x2, 0xe0,0x0, 0x2f,0x5a,0xe2,0x0, +0xcd,0xf, 0xe0,0x0, 0x2, 0xd1,0xe2,0x0, 0xcd,0x1, 0xe0,0x0, 0x5, 0xd6,0x8f,0x8f, +0xe2,0x0, 0xcf,0x85,0xe0,0x0, 0x2, 0xd1,0xfa,0x12,0x78,0xcc,0xf8,0x0, 0x89,0x81, +0xf0,0x1, 0x29,0xd9,0xf7,0xff,0x11,0x7f,0xf0,0x0, 0x1a,0x8d,0xf0,0x12,0x39,0x1a, +0xe8,0x40,0x3e,0xe3,0xf8,0x40,0x39,0xf2,0xe0,0x1, 0x3, 0x2e,0xf0,0xf, 0x31,0xa1, +0xf0,0x0, 0xc1,0x81,0xf2,0x1, 0xc1,0xff,0xe8,0x40,0x3d,0x73,0xe8,0xf, 0x3f,0x95, +0xf0,0x0, 0x8b,0x1f,0x5, 0xf0,0xf8,0x40,0x3a,0x66,0xe8,0x40,0x3f,0xe3,0x0, 0x89, +0x3d,0xfd,0xe8,0x6d,0x3a,0x27,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3d,0x7f,0x1, 0x63, +0xe0,0xe, 0x37,0xa1,0xe8,0xe, 0x3f,0x15,0x8f,0x1e,0xe8,0xc, 0x3f,0x24,0xe8,0xb, +0x3f,0x26,0xe2,0x0, 0xce,0x0, 0xf0,0x40,0x3b,0xeb,0xf2,0x1, 0xc3,0xff,0x2, 0x69, +0xe0,0x41,0x3e,0x4c,0x3e,0x7d,0xf0,0xe, 0x3b,0x2e,0xe2,0x1, 0xc7,0x7f,0xe0,0x6d, +0x3a,0x2e,0x0, 0xe2,0xea,0x12,0x7f,0xcc,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xc7,0x7f, +0xaf,0xd, 0xe7,0xff,0x0, 0xa6,0xea,0x12,0x7f,0xcc,0x8f,0xf, 0x27,0x3, 0xc7,0x7f, +0xaf,0xf, 0xe0,0x0, 0x1f,0x93,0xe0,0x0, 0x1f,0x12,0x89,0x8f,0x3d,0x73,0x5, 0x96, +0xe0,0x0, 0x21,0xfd,0xe2,0x0, 0xc9,0x81,0xe0,0x1, 0x1, 0x7, 0xe0,0x1, 0x1f,0xe8, +0x17,0x3, 0x8f,0x8f,0xaf,0x9, 0xe0,0x0, 0x27,0xfb,0xe2,0x0, 0xcf,0x82,0x1, 0xdf, +0xe0,0x0, 0x1f,0x38,0xaf,0x8e,0xe0,0x0, 0x9, 0xe1,0xe0,0x0, 0x4, 0xd5,0xe2,0x0, +0xcd,0x1, 0x5, 0xd5,0xf0,0x0, 0x1b,0x8d,0xf0,0x0, 0x11,0x1, 0xf8,0x40,0x38,0xe7, +0xf0,0x0, 0x13,0x2, 0xe8,0x0, 0x8c,0x1, 0xe8,0x0, 0x8d,0x91,0xf0,0x40,0x39,0xe8, +0xf0,0x40,0x3a,0x6b,0xe8,0x40,0x3e,0x62,0xe0,0xf, 0x36,0x21,0xf0,0xe, 0x3b,0x9f, +0x8e,0x8e,0x8f,0x1e,0xf0,0xf, 0x39,0xad,0xe2,0x0, 0xcf,0x80,0xe0,0xf, 0x3c,0x2d, +0x3e,0xa8,0xe2,0x1, 0xc6,0xff,0xf0,0x15,0x3a,0x2e,0xe2,0x1, 0xc7,0xff,0xe0,0x6f, +0x3d,0x2d,0xe0,0xd, 0x3d,0xae,0xf2,0x0, 0xca,0x80,0x3f,0x2b,0xe2,0x1, 0xc7,0x7f, +0xe2,0x1, 0xc6,0xff,0xc6,0x1, 0xe0,0x6d,0x3d,0x2e,0xf1,0x2f,0x3b,0x2f,0xe2,0x1, +0xc6,0x7f,0xf1,0x2e,0x3b,0x2d,0x27,0x83,0xe7,0xff,0x2f,0x32,0x3d,0x7c,0x2, 0xd5, +0xf0,0x0, 0xc1,0x1, 0xf2,0x1, 0xc1,0x7f,0xe8,0x40,0x3d,0x72,0xf0,0x0, 0xc0,0x82, +0x1, 0xc2,0x9, 0xe1,0xe2,0x0, 0xce,0x85,0xe7,0xff,0x5, 0x95,0x17,0x81,0xe8,0x0, +0xaf,0x81,0x9, 0xe1,0xe2,0x0, 0xcd,0x1, 0xe7,0xff,0x1, 0x9a,0xe0,0x2, 0x1f,0xdd, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe7,0xff,0x1, 0x93,0xe0,0x1, 0x1f,0xc7,0x9f,0x8f, +0xe2,0x1, 0xcf,0xc8,0xe7,0xff,0x5, 0x8c,0x9, 0xe1,0xde,0x8b,0x17,0x81,0xaf,0x82, +0x9, 0xe1,0xf1,0xff,0xc1,0xff,0xf8,0x0, 0xa9,0x81,0x9, 0xe1,0xe0,0x0, 0x1f,0xb8, +0x17,0x1, 0xaf,0xf, 0x9, 0xe1,0x8c,0x9e,0x8c,0xe, 0xdd,0xa3,0xa9,0x82,0x9, 0xe1, +0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x1, 0x15,0x48,0xa4,0xf, 0x14,0xa8,0xef,0xfd, +0xda,0x96,0xe0,0x0, 0x1d,0x8d,0xe0,0x1a,0x97,0xfb,0xe2,0x1b,0xcf,0xac,0xe0,0x0, +0x1f,0x8e,0x8d,0xf, 0x2, 0x6, 0xe0,0x1b,0x97,0x9b,0xe3,0xe4,0xcf,0xd4,0x3, 0x19, +0x25,0x17,0xe0,0x0, 0x1c,0xc7,0x16,0x80,0x3f,0xed,0xe2,0x1, 0xc7,0xff,0xe0,0xe, +0x37,0xc3,0xe2,0x0, 0xc7,0x87,0x3f,0x1b,0x3f,0x99,0xe0,0xf, 0x86,0xe, 0x87,0x8f, +0xc6,0x81,0xe3,0xf, 0x3e,0x5f,0x3e,0xfa,0xe0,0xf, 0xaf,0x8e,0x1, 0xee,0x8, 0xe1, +0xe0,0xf, 0x35,0x24,0x3c,0x7f,0x5, 0x7c,0xe0,0x3, 0x1f,0xae,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0x5f,0x8, 0xe1,0xe0,0x0, 0x1f,0xbb,0xe0,0x2, 0x8f,0xf, 0x3f,0x9e, +0xe0,0x6, 0x8c,0x8f,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x2, +0x38,0x82,0xe2,0x1, 0xc4,0xfd,0x2c,0xfd,0x8, 0xb1,0xe0,0x1, 0x1f,0xf1,0xe0,0x13, +0x15,0x44,0xa4,0xf, 0xef,0xfd,0xda,0x4b,0xe2,0x0, 0xcc,0x64,0x5, 0x87,0xe0,0x1, +0x1f,0xdc,0x17,0x7f,0xa7,0x8f,0xe0,0x7, 0xaf,0x3f,0x8, 0xe1,0x8, 0xb2,0xe0,0x1, +0x1f,0xd7,0xe0,0x3, 0x8f,0xaf,0x27,0xb1,0xe0,0x0, 0x19,0xe, 0xdf,0x9a,0xd9,0xc1, +0xd9,0xc0,0xef,0xff,0xd7,0x3, 0xd9,0xbd,0xe0,0x0, 0x1f,0xa7,0x87,0x2, 0xaf,0xf, +0xd5,0x78,0xd9,0xb7,0xd9,0xb6,0x8f,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0x9, 0xd9,0xf5, +0xd9,0xb0,0xda,0xfb,0xe0,0x0, 0x1f,0xb8,0x8f,0x8f,0x27,0x93,0x9, 0x61,0xe0,0x3, +0x1f,0x6, 0x16,0x80,0xae,0x8e,0x17,0x80,0xe0,0x3, 0x1f,0x35,0xb7,0x8e,0xe0,0x0, +0x1f,0x41,0xaf,0x8e,0xd9,0x9e,0xda,0xe9,0xe0,0x0, 0x1f,0xb8,0x8f,0x8f,0x2f,0xef, +0xde,0x48,0x9, 0x21,0xe7,0xf3,0x0, 0x96,0xef,0xfe,0xde,0x50,0xd9,0x92,0x0, 0xcd, +0x8, 0xb6,0xc0,0x74,0x3c,0x7a,0xe4,0xf, 0x35,0x28,0xe4,0xe, 0x34,0x28,0x39,0x68, +0x4, 0x82,0x39,0x6a,0x3f,0x7f,0x3f,0xe8,0xe0,0x6f,0x3d,0xaa,0x3c,0xfb,0x38,0xef, +0xe2,0x1, 0xc1,0x7f,0xe2,0x1, 0xc0,0xff,0x39,0xeb,0xe4,0xf, 0x35,0xa8,0xe4,0xe, +0x34,0xa8,0x3, 0x82,0x39,0xe9,0x3f,0x7f,0xe2,0x1, 0xc1,0xff,0x3f,0xe9,0xe0,0x6f, +0x3d,0xab,0x3c,0xf3,0xf0,0x40,0x3b,0x6f,0xf2,0x1, 0xc3,0x7f,0xe0,0x1, 0x1, 0x1e, +0x3d,0x72,0xe0,0x1, 0x2, 0x9e,0xf0,0x40,0x3a,0xe2,0xf0,0x0, 0x11,0x81,0xe0,0x1, +0x1f,0xf2,0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0xa2,0xf, 0xe0,0x2, 0x1f,0xfd,0xe0,0x0, +0x1a,0x29,0xf0,0x0, 0x8b,0xdf,0xf8,0x12,0x39,0x16,0x3c,0xe3,0x15,0x0, 0xf0,0x1, +0x10,0x7f,0xf7,0x0, 0x10,0x81,0x14,0x7f,0xf0,0x40,0x39,0x79,0xe0,0x0, 0x1, 0x62, +0xe8,0x40,0x3c,0xf6,0xf0,0x1, 0x21,0x83,0xe0,0x1, 0x3, 0x65,0x17,0x1, 0x3f,0x19, +0xf0,0x40,0x3a,0xf1,0xf0,0x0, 0x6a,0x84,0x6f,0x5, 0xe0,0x1, 0x3, 0x61,0x17,0x81, +0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88,0x6c,0x89,0x6f,0x8c,0x6f,0xd, +0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0x60,0xe8,0x40,0x3b,0x61,0x16,0x80,0x8d,0x8e, +0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d,0xe8,0xf, 0x3d,0xb7,0x1, 0x10,0x8d,0x9e, +0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1,0xe8,0xf, 0x3f,0x94,0x1, 0x8, 0x97,0x8f, +0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6,0xe0,0x66,0x3a,0x2f,0x3e,0xe5,0xe2,0x1, +0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, 0x1, 0xe3,0xe0,0xf, 0x36,0x22,0xe2,0x0, +0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40,0x3b,0x7d,0xe0,0x1, 0x1, 0x34,0xe8,0x40, +0x39,0xf6,0xe0,0x1, 0x1, 0x30,0xe2,0x1, 0xce,0x7f,0xe7,0xff,0x1, 0x2f,0xe0,0xe, +0x35,0x21,0x3c,0xed,0x3f,0x14,0xe2,0x0, 0x7e,0x4, 0xf0,0x40,0x39,0x79,0x3f,0x9c, +0xc5,0x1, 0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0xf0,0x0, 0x8a,0x8f,0xe7,0xff,0x1, 0xa2, +0xe0,0xff,0x14,0x7f,0x25,0x18,0x17,0xff,0x3f,0x9a,0x3d,0x6f,0xe2,0x1, 0xc5,0x7f, +0xe0,0x0, 0x1e,0xa9,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1f,0x28,0xe0,0xf, 0x3f,0x9d, +0xe0,0xff,0x14,0x7f,0xe0,0x80,0x96,0x9e,0x3e,0xf8,0xe0,0x6d,0x3a,0x28,0x3f,0x7f, +0x3c,0x6d,0x1, 0xf9,0xc0,0xc, 0xb, 0x61,0x3c,0x72,0xe7,0xfe,0x5, 0xe6,0xf0,0x40, +0x3a,0xe1,0xf0,0x0, 0x11,0x80,0xe7,0xfe,0x0, 0xe4,0xe0,0x0, 0x3, 0x59,0x17,0x1, +0x3f,0x19,0xe8,0x40,0x39,0x75,0xf0,0x0, 0x6a,0x84,0x6f,0x5, 0xe0,0x0, 0x3, 0x55, +0x17,0xff,0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88,0x6c,0x89,0x6f,0x8c, +0x6f,0xd, 0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0xe3,0xe8,0x40,0x3e,0x60,0xe8,0x40, +0x3b,0x61,0x8d,0x8e,0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d,0xe8,0xf, 0x3d,0xb7, +0x1, 0x10,0x8d,0x9e,0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1,0xe8,0xf, 0x3f,0x94, +0x1, 0x8, 0x97,0x8f,0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6,0xe0,0x66,0x3a,0x2f, +0x3e,0xe5,0xe2,0x1, 0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, 0x1, 0xe3,0xe0,0xf, +0x36,0x22,0xe2,0x0, 0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40,0x3b,0x7d,0x1, 0x2d, +0xe8,0x40,0x39,0xf6,0x1, 0x2a,0xe2,0x1, 0xce,0x7f,0xe7,0xfe,0x1, 0x2f,0xe0,0xe, +0x35,0x21,0xe2,0x0, 0x7e,0x4, 0x3f,0x9c,0x3f,0x14,0xc5,0x1, 0xf0,0x0, 0x8a,0x8f, +0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0x3c,0xed,0xe7,0xfe,0x0, 0xa0,0xf0,0x40,0x3a,0xf2, +0x6c,0x4, 0x6c,0x5, 0x2, 0x23,0x6c,0x8, 0x6c,0x9, 0x6c,0xc, 0x6c,0xd, 0xe7,0xff, +0x0, 0xb2,0xe8,0x40,0x38,0xf5,0x6c,0x4, 0x6c,0x5, 0x2, 0x12,0x6c,0x8, 0x6c,0x9, +0x6c,0xc, 0x6c,0xd, 0xe7,0xfe,0x0, 0xa6,0x8f,0xe, 0x3f,0x72,0x1, 0xd5,0xe7,0xfe, +0x0, 0xe9,0x8f,0xe, 0x3f,0x71,0xe7,0xfe,0x1, 0xd0,0xe7,0xfe,0x0, 0xe3,0x17,0x81, +0xe8,0xf, 0x3f,0x95,0x6f,0x88,0x6c,0x89,0x0, 0xec,0x17,0xff,0xe8,0xf, 0x3f,0x95, +0x6f,0x88,0x6c,0x89,0x0, 0xdb,0x0, 0x0, 0x8, 0xb3,0xf7,0xff,0x12,0x7f,0xf0,0x43, +0x38,0x8, 0xf0,0x14,0x3a,0x18,0xf0,0x0, 0x10,0x81,0xf8,0x43,0x3a,0x4, 0xf8,0x11, +0x38,0x90,0xe0,0x2, 0x1f,0xfd,0xf8,0x40,0x3a,0x71,0x80,0xef,0xf0,0x0, 0x82,0xff, +0xe0,0x0, 0x2, 0x65,0xe0,0x1, 0x1f,0x72,0xf7,0xff,0x11,0x7f,0xf0,0x0, 0x11,0x81, +0xf0,0x13,0x39,0x98,0xf0,0x43,0x3b,0x89,0xf0,0x12,0x39,0x19,0x15,0x1, 0x11,0x81, +0xf0,0x0, 0xa3,0xe, 0x89,0x5f,0xf8,0x43,0x39,0x2, 0xe8,0xa, 0x3d,0x17,0xf2,0x1, +0xc1,0xff,0xe7,0x0, 0x14,0x1, 0x39,0x99,0xf2,0x0, 0xca,0x0, 0xe8,0x43,0x3f,0x83, +0xe8,0x40,0x3d,0xe4,0xe0,0x6b,0x3c,0x2f,0xe8,0x40,0x38,0xf4,0xe0,0x6b,0x3d,0x2f, +0xe8,0x40,0x3d,0x72,0x4, 0x2e,0x3e,0x63,0xe0,0x9, 0x39,0x3b,0xe2,0x1, 0xc6,0x7f, +0xe8,0x2b,0x3d,0x80,0xe8,0x40,0x3f,0xe2,0x0, 0x84,0x25,0x9c,0x3f,0xfa,0x2, 0x21, +0xe2,0x0, 0xcf,0x80,0xe0,0x43,0x3e,0x8c,0x3f,0x6f,0xe0,0x6e,0x3c,0x2d,0xf0,0x40, +0x3a,0xff,0xc6,0x7f,0xe0,0x6e,0x3d,0x2d,0xe0,0xd, 0x3f,0x19,0xc7,0x81,0x36,0xa1, +0xe8,0x2e,0x3f,0x7, 0xe0,0x43,0x3f,0x8f,0xe8,0xd, 0x3e,0x96,0xe2,0x1, 0xc6,0x7f, +0x2f,0x65,0x97,0xd, 0x3f,0x78,0xe0,0x6e,0x3c,0x28,0x3f,0xfa,0x3c,0x6e,0x5, 0x61, +0xf0,0x0, 0xc2,0x1, 0xf8,0x43,0x3a,0x4, 0xf8,0x40,0x3a,0x71,0xf1,0xff,0xc1,0xff, +0xf2,0x1, 0xc1,0xff,0xe7,0xff,0x5, 0x3a,0x9, 0xe1,0xe7,0x0, 0x14,0x1, 0x9, 0xe1, +0x8, 0xb4,0xc0,0x78,0x39,0xea,0x3a,0x6b,0x7e,0x2, 0x7e,0x81,0xdf,0x7e,0x39,0x68, +0x3c,0xe4,0x3c,0x63,0xdf,0x7a,0x39,0x18,0xe4,0x8, 0x31,0x4f,0x3c,0x12,0x34,0x1, +0x66,0x81,0x3f,0xe8,0xe3,0xff,0xc6,0xff,0xe3,0xff,0xc7,0xff,0xe0,0xe, 0x3e,0xaf, +0xe0,0x43,0x3f,0x1e,0x66,0x2, 0xe2,0x0, 0xcf,0x0, 0xe0,0x8, 0x3e,0xa8,0xe0,0xe, +0x3f,0xad,0xe3,0xff,0xc6,0x7f,0xe0,0x43,0x3f,0x1e,0xe0,0x43,0x3c,0x18,0xe0,0xf, +0x3e,0xac,0xe0,0x68,0x3d,0x2e,0xe0,0x2, 0x1f,0x41,0xe0,0x43,0x3f,0x9f,0x3e,0x2d, +0xe2,0x0, 0xcf,0x80,0x9f,0xe, 0xe0,0x43,0x3e,0x1c,0xe0,0x6f,0x3d,0x2c,0xe2,0x0, +0xcf,0xb, 0x16,0x86,0x17,0x3, 0xe0,0x6e,0x3c,0xad,0x3f,0x38,0x3f,0xfe,0x5, 0xa, +0xe0,0x0, 0x17,0x64,0xe0,0x2f,0x3f,0x9e,0xe0,0x28,0x3c,0x1e,0x3c,0x5f,0xc0,0x8, +0xa, 0x61,0x14,0x0, 0xc0,0x8, 0xa, 0x61,0x8, 0xb1,0xc0,0x44,0x15,0x3c,0x14,0x80, +0xe2,0x0, 0x7c,0x4, 0xe0,0x2, 0xdd,0x50,0xe0,0x0, 0x1f,0x8e,0x14,0x0, 0x8d,0x8f, +0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5, 0xc8,0x15,0x7f,0x3d,0x1b,0xe2,0x1, 0xc5,0x7f, +0xc5,0x1, 0xe0,0x0, 0x1f,0x8d,0xf2,0x0, 0x7b,0x4, 0x35,0x21,0x3d,0x1f,0xe8,0x40, +0x3f,0x66,0x86,0xf, 0x86,0x9f,0xc7,0x82,0xae,0xe, 0x3f,0xfa,0xc7,0x2, 0xe0,0x40, +0xae,0x9e,0x1, 0xf8,0xf0,0x0, 0x13,0x80,0xe8,0x40,0x3e,0xe7,0xf0,0x0, 0xc3,0x81, +0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3d,0xf7,0x14,0x1, 0x1, 0x25,0xe8,0x0, 0x8c,0x86, +0xe8,0x0, 0x8d,0x16,0xe8,0x40,0x3f,0xe7,0xe0,0xe, 0x37,0xa1,0xe2,0x0, 0x7e,0x4, +0x3f,0x1c,0x8e,0xe, 0x8f,0x1e,0x3e,0x79,0x3e,0x6d,0xe0,0x6c,0x39,0xa8,0xc7,0x81, +0x3f,0x7a,0xe2,0x1, 0xc7,0xff,0x3f,0x6d,0xe0,0x6e,0x39,0xac,0x3d,0xff,0x3c,0x6e, +0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3d,0xf7,0xf0,0x0, +0xc3,0x2, 0x1, 0xdd,0xc0,0x3c,0x8, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x40, +0xe0,0x0, 0x1f,0xe, 0xe0,0x1, 0x1f,0xc3,0x8f,0xe, 0xea,0x4f,0x7d,0x98,0x89,0xf, +0xe9,0xff,0xc5,0xff,0xe0,0x2, 0x1e,0x3b,0x7f,0xa, 0x17,0x80,0xe0,0x2, 0x1f,0x22, +0xf0,0x40,0x38,0xe8,0xf0,0x2, 0x1c,0xc3,0xa4,0xb, 0xaf,0x8e,0x3d,0x62,0xaf,0x8c, +0x14,0x80,0xf0,0x0, 0x78,0x81,0xe8,0x7, 0xaf,0xd9,0xe8,0x7, 0xaf,0xe9,0xe0,0x2, +0xdc,0xdb,0xe0,0xa, 0x31,0x21,0x14,0x80,0xe8,0x40,0x3c,0x69,0xe0,0x2, 0xdc,0xd4, +0x67,0xa, 0xf0,0x0, 0x60,0x81,0xe2,0x0, 0xcf,0x1, 0xe0,0x2, 0x5, 0xe1,0xea,0x4f, +0x7f,0x98,0xe9,0xff,0xc7,0xff,0xf0,0x0, 0xa6,0x8f,0xf0,0x0, 0x15,0x81,0xf8,0xe, +0x3d,0xad,0xf0,0x0, 0x18,0x3, 0xf8,0x40,0x3e,0x6b,0x7f,0xe, 0xf2,0x0, 0xcd,0x81, +0xf8,0x40,0x8c,0x30,0xe8,0x40,0x8b,0xa0,0xe0,0x2, 0x1, 0x43,0xe8,0x0, 0x8f,0xd, +0xe0,0x2, 0x27,0x3f,0x67,0x8a,0xf0,0x40,0x3d,0xff,0xe0,0x2, 0x3, 0xc1,0x3b,0x6f, +0xc3,0x7f,0xe2,0x1, 0xc3,0x7f,0x67,0xe, 0xe8,0x17,0x3b,0x2b,0xe8,0xe, 0x3f,0x1d, +0xf2,0x1, 0xc3,0xff,0xf0,0x17,0x3b,0x9e,0xf0,0x17,0x33,0xa1,0xe0,0x0, 0x1f,0x8d, +0x17,0x1, 0xf0,0x0, 0xc3,0x83,0xe0,0x3, 0x1d,0x85,0xe8,0xe, 0x3f,0x1d,0xc3,0x1, +0xf0,0x17,0x3b,0x9f,0x7f,0x9, 0x3a,0x6e,0xf0,0x0, 0x7d,0x8b,0xf8,0x40,0x3a,0xe8, +0xe8,0x40,0x3a,0xe0,0x17,0x5, 0x3b,0x1b,0xf8,0x40,0x3d,0xe7,0xf0,0x0, 0x78,0xc, +0xf0,0x40,0x3f,0x67,0x0, 0x9e,0xe0,0x0, 0x27,0xc9,0x16,0x81,0xe8,0xd, 0x3e,0xd1, +0xe0,0x0, 0x26,0xc4,0xe0,0x2, 0x1e,0x3b,0xe8,0x7, 0x87,0xd9,0x86,0x8c,0xc7,0x81, +0xc6,0x81,0xae,0x8c,0xe8,0x7, 0xaf,0xd9,0x8e,0x4, 0xe0,0x2, 0x2e,0x6, 0xe8,0x0, +0x8f,0x8d,0xaf,0x84,0xc2,0x82,0xf0,0x40,0x3d,0xf5,0xc2,0x1, 0xe0,0x1, 0x1, 0x60, +0xf0,0x40,0x8d,0x15,0xf0,0x0, 0x88,0x5, 0xf8,0xf, 0x3a,0xaa,0xe2,0x0, 0xcf,0x80, +0xf8,0x2, 0x3c,0x2a,0xf8,0xf, 0x3d,0x28,0xe2,0x1, 0xc7,0xff,0xf8,0xd, 0x3f,0x20, +0xe2,0x1, 0xc1,0x7f,0xe0,0x62,0x3d,0x2f,0xe8,0x3, 0x3b,0xa0,0xe2,0x0, 0xce,0x80, +0xf0,0xf, 0x38,0x27,0xe2,0x1, 0xc1,0xff,0xe2,0x1, 0xc7,0xff,0xe1,0x2d,0x39,0x1e, +0xe0,0x63,0x3d,0x2f,0x2e,0xd8,0xe1,0x2f,0x39,0x9e,0x2f,0xd5,0xf1,0x2d,0x3e,0x23, +0xf1,0x2f,0x3e,0x22,0xe7,0xff,0x2e,0xb9,0xe9,0x2d,0x39,0x1c,0x2e,0x84,0xe9,0x2d, +0x39,0x9c,0x26,0xc9,0x16,0x82,0xe8,0xd, 0x3e,0xd1,0x26,0xc5,0xe0,0x2, 0x1d,0xfd, +0xe0,0x1, 0x1e,0x72,0x8e,0xdb,0xa5,0x8c,0xf0,0xc, 0x3c,0x3d,0xe8,0xd, 0x3e,0xba, +0x3e,0x17,0xe8,0xd, 0x3e,0x90,0x36,0x21,0x36,0xa1,0x3e,0x1b,0x3e,0x9b,0xf0,0x0, +0x91,0xc, 0xf0,0x0, 0x92,0xd, 0x16,0x82,0xe1,0x2c,0x3e,0xa2,0xe8,0x40,0x3d,0xe0, +0xe8,0x40,0x3d,0x6a,0xe1,0x2d,0x3e,0xa3,0x3c,0xe7,0xe8,0x40,0x3c,0x68,0x7f,0x3, +0x7f,0x84,0xf0,0x0, 0x78,0x81,0xf0,0x0, 0x7a,0x82,0x7e,0x8, 0x7e,0x8d,0xf0,0x0, +0x78,0x7, 0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x7a,0x5, 0xdc,0x8b,0xf0,0x0, 0x61,0x6, +0xf0,0x0, 0x62,0x5, 0xe2,0xff,0xcc,0x7f,0xf8,0xc, 0x39,0x14,0xe4,0xd, 0x36,0x4f, +0xf0,0x0, 0x60,0x7, 0x3e,0x9c,0x16,0x0, 0xe0,0x6c,0x39,0xa8,0x36,0x81,0xf8,0x40, +0x39,0x74,0xe8,0x40,0x3d,0xe0,0xe8,0x40,0x3d,0x6a,0xe0,0x43,0x3e,0x9d,0xf8,0x40, +0x3d,0x64,0x3c,0xe7,0xe8,0x40,0x3c,0x68,0xe8,0x7a,0x3b,0x22,0x7e,0x7, 0xde,0x39, +0x65,0x8d,0x66,0x88,0x7c,0x10,0x3e,0xdb,0x7e,0x8f,0xde,0x7f,0x67,0x3, 0x67,0x84, +0xf0,0x0, 0x60,0x81,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x61,0x87,0xf0,0x0, 0x62,0x5, +0xf0,0x0, 0x62,0x82,0xe0,0x1, 0x24,0x1d,0xf8,0x40,0x3a,0x6a,0xe0,0x2, 0x1e,0xc1, +0xe0,0x0, 0x1d,0xb1,0x9e,0xd, 0x9e,0x8b,0xe2,0x0, 0xce,0xb, 0xe8,0x7a,0x3c,0xa4, +0xe2,0x0, 0xce,0x8a,0xf8,0x40,0x3a,0x6a,0xe0,0x0, 0x2, 0xee,0xe0,0x2, 0x1e,0x5d, +0xe0,0x0, 0x14,0x51,0x8e,0x8c,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1, 0xa, 0xe8,0x8, +0x3c,0x34,0xe0,0x0, 0x14,0xe4,0x7f,0x3, 0xf0,0x0, 0x78,0x81,0xf0,0x0, 0x79,0x87, +0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xdb,0x4, 0xf0,0x0, 0x61,0x87,0x67,0x3, 0xf0,0x40, +0x39,0xf8,0xf0,0x0, 0x60,0x81,0xf0,0x0, 0x62,0x82,0xe7,0xfe,0x5, 0x2d,0x65,0x90, +0x17,0x80,0x66,0xf, 0xe1,0x3a,0x3d,0x8f,0xf0,0x40,0x3d,0x7c,0xe7,0xfe,0x5, 0x9e, +0xc2,0x82,0xf0,0x40,0x3d,0xf5,0xc2,0x1, 0xe7,0xfe,0x1, 0xa4,0xf0,0x0, 0x65,0x8b, +0x17,0x81,0xf0,0x0, 0x60,0xc, 0xe8,0xf, 0x3f,0x9b,0xf0,0x40,0x3d,0xef,0xf0,0x0, +0xc0,0x2, 0xf2,0x1, 0xc5,0xff,0xf0,0x0, 0x66,0x89,0xe7,0xfd,0x0, 0xb9,0x67,0x8a, +0xf8,0x0, 0xad,0x8d,0xf0,0x40,0x3d,0xff,0xe7,0xfd,0x4, 0xc3,0xe0,0x0, 0xc0,0x40, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe8,0x0, 0x8e,0x8d,0x3f,0xec,0xe2,0x1, 0xc7,0xff, +0x3f,0xfd,0x3d,0xec,0x5, 0x82,0x3d,0xed,0xea,0x4f,0x7e,0x98,0xe9,0xff,0xc6,0xff, +0xe2,0x1, 0xc5,0xff,0xa7,0x8d,0x0, 0x8a,0xe8,0x0, 0x8e,0xd, 0x3e,0x7d,0x1, 0x9, +0xc7,0x81,0x3b,0x7f,0xe7,0xfd,0x1, 0x68,0x8e,0x4, 0x8e,0x8f,0x3e,0xfc,0x1, 0xf5, +0xad,0x8f,0x0, 0xf7,0xe0,0x2, 0x1d,0xdd,0xe0,0x0, 0x14,0x51,0x8e,0x8b,0xe2,0x0, +0xce,0x81,0xe7,0xff,0x1, 0x96,0x15,0x80,0x16,0xbc,0x7d,0x90,0x66,0xf, 0x2e,0x16, +0x16,0x3, 0xe1,0x2c,0x3e,0x23,0x26,0x16,0x65,0x88,0x25,0x94,0x16,0xb4,0x27,0x85, +0x67,0x8d,0x14,0x1e,0xe7,0xff,0x2f,0x85,0x3c,0x6d,0xe7,0xff,0x0, 0x82,0xf8,0x40, +0x39,0x74,0xe8,0x74,0x3d,0x22,0xe7,0xfe,0x0, 0xe3,0x16,0xb2,0x0, 0xf1,0x3e,0xe8, +0x0, 0xe6,0x16,0x4, 0xe1,0x23,0x3e,0x23,0x21,0x85,0x66,0x8, 0x26,0x3, 0x16,0xba, +0x0, 0xe7,0xe2,0x0, 0xc9,0x2, 0x14,0x3c,0xe7,0xfe,0x5, 0xeb,0x0, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x38,0xe0,0x0, 0x1f,0x8e,0xf0,0x0, 0x8c,0xf, 0xf0,0x1, +0x24,0x5c,0xe0,0x0, 0x1e,0xd, 0xe0,0x2, 0x1f,0xfd,0x8b,0xc, 0x8a,0xdf,0x89,0x1c, +0xe0,0xf, 0x3b,0x35,0xe0,0x1, 0x1f,0x72,0x14,0xff,0xa2,0xe, 0x3f,0x92,0xe8,0x9, +0x3c,0x98,0x37,0xa1,0xe2,0x1, 0xc4,0xff,0x3f,0x94,0x34,0xa1,0x94,0xf, 0x39,0xe6, +0x3b,0xe2,0x3c,0x9c,0xe0,0x0, 0x0, 0xc5,0x3e,0x79,0xe0,0x0, 0x1, 0x50,0x8f,0x2c, +0x8f,0xbc,0xe0,0xd, 0x3f,0x35,0x3d,0x6e,0x3e,0x9f,0x36,0xa1,0x3e,0x94,0x96,0x8d, +0xe4,0xb, 0x37,0x28,0x3e,0xf8,0xe0,0x6d,0x3a,0x28,0x3c,0x6d,0x3e,0xe6,0xe2,0x1, +0xc6,0xff,0x3f,0x7d,0x5, 0x82,0x3d,0x66,0x3e,0xe3,0xe4,0xb, 0x35,0xc8,0xe2,0x1, +0xc6,0xff,0x3d,0xfd,0x3b,0x6a,0xe2,0x1, 0xc3,0x7f,0x3, 0x82,0x3f,0x63,0x39,0xee, +0x3f,0x62,0xe2,0x1, 0xc7,0x7f,0x3f,0xfe,0xe2,0x1, 0xc1,0xff,0x3d,0xef,0xe4,0xd, +0x37,0xa8,0x5, 0x82,0x3d,0xe2,0x3f,0x67,0xe4,0xd, 0x36,0xc8,0xe2,0x1, 0xc7,0x7f, +0x3e,0xfe,0x39,0x6b,0xe2,0x1, 0xc1,0x7f,0x3, 0x82,0x3f,0xe7,0xe0,0xe, 0x39,0xa6, +0xe2,0x0, 0xcf,0x7, 0x3b,0xef,0xe2,0x1, 0xc3,0xff,0xc6,0x2, 0x2, 0x7, 0xe0,0xf, +0x3b,0xa2,0xe2,0x0, 0xcf,0x87,0xe7,0xff,0x5, 0x39,0xe0,0x2, 0x1f,0xc1,0xe0,0x3, +0x17,0x74,0xb7,0xf, 0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0x14,0x83,0x34,0x21,0xe0,0x2, +0xd9,0xff,0x3b,0xf2,0x15,0x80,0xe0,0x43,0x3c,0x18,0x3e,0xeb,0x4, 0xa1,0x39,0xf6, +0x4, 0x9a,0x3f,0x66,0xe0,0xf, 0x3f,0x35,0x16,0x1, 0x3f,0x92,0x37,0xa1,0x3f,0x94, +0x97,0x8f,0x3e,0x1d,0x3f,0xf8,0xc7,0x1, 0x3f,0xec,0xe2,0x1, 0xc7,0xff,0x16,0x1, +0xe2,0x1, 0xc7,0x7f,0x3e,0x1b,0xe0,0x6d,0x3a,0x2f,0x3f,0x73,0x3d,0xec,0xe2,0x1, +0xc5,0xff,0x5, 0xe9,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x39,0x77,0x5, 0xe1,0xe0,0x2, +0x1f,0xdd,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x5, 0xa0,0xe0,0x2, 0x1f,0x41,0x9f,0x8e, +0xe2,0x7, 0xcf,0xe7,0x2, 0x83,0xc7,0x81,0xb7,0x8e,0xf7,0xff,0x24,0x45,0xe4,0x0, +0xc6,0x83,0xe0,0xf, 0x35,0xa1,0x3e,0xff,0x5, 0x20,0xe0,0x0, 0x1f,0x31,0xe0,0x2, +0x1e,0xc1,0x9f,0x8e,0x16,0x0, 0xe2,0x3, 0xcf,0xf3,0xb6,0xd, 0xe7,0xff,0x2, 0xb4, +0xc7,0x81,0xb7,0x8e,0xe7,0xff,0x0, 0xb0,0x1, 0x69,0xe0,0x2, 0x1f,0x41,0x9f,0x8e, +0xe2,0x0, 0xcf,0x82,0x5, 0x83,0xc7,0xfe,0xb7,0x8e,0xe0,0x0, 0x1f,0x31,0x9f,0x8e, +0xe2,0x3, 0xcf,0xf3,0x2, 0xdb,0x0, 0xd8,0xe0,0x2, 0x1f,0x41,0x9f,0x8e,0xe2,0x7, +0xcf,0xe7,0x2, 0x83,0xc7,0x82,0xb7,0x8e,0x17,0x0, 0xe0,0x0, 0x1f,0xb1,0xb7,0xf, +0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe8,0x40,0x3d,0xe8,0xe8,0x40,0x3e,0xe8,0xe7,0xff, +0x0, 0xb8,0xe0,0x2, 0x1f,0xc1,0x9c,0xf, 0x17,0x8a,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x2, 0x1b,0xc3,0x17,0x80,0xe0,0x7, +0xaf,0xc7,0xe0,0x2, 0x1f,0xdd,0xe0,0x0, 0x1a,0xe, 0x8b,0xf, 0xdf,0x2, 0x8f,0x84, +0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x5, 0xf4,0x14,0x3, 0xdd,0xf, 0xeb,0xe6,0x7f,0x90, +0x7f,0x81,0xe0,0x2, 0x23,0x2b,0xe2,0x0, 0xcb,0x1, 0x5, 0x86,0x8f,0x8f,0xe2,0x0, +0xcf,0x86,0xe0,0x2, 0x2, 0xa3,0xf0,0x0, 0x88,0x84,0xe0,0x0, 0x1a,0x8d,0xe8,0x40, +0x3b,0x71,0xe0,0x2, 0x1, 0x70,0xe0,0x7, 0x8f,0xd7,0xfa,0x13,0x7c,0x11,0xf0,0xf, +0x38,0xaf,0xc7,0x81,0x3b,0x7f,0xe0,0x3, 0x1, 0x1a,0xe0,0x2, 0x1f,0xbb,0x8f,0x8f, +0xe8,0x0, 0x8f,0x8, 0xf0,0xf, 0x38,0xaf,0xc7,0x81,0x3f,0x7f,0x14,0x3, 0xe0,0x2, +0x1, 0x76,0xf0,0x3, 0x20,0x84,0x16,0x7f,0xe8,0xc, 0x3e,0x11,0xf0,0x3, 0x1c,0x85, +0xe2,0x1, 0xc6,0x7f,0xe0,0x0, 0xc6,0x1, 0xe8,0xc, 0x3e,0x19,0xf8,0x40,0x3b,0xe9, +0xf0,0x0, 0x13,0x0, 0xe9,0x80,0x8f,0x17,0xe8,0x40,0x3f,0xe6,0xe2,0x1, 0xc7,0xff, +0x3f,0x7f,0x3e,0xee,0x3, 0x83,0xe8,0x40,0x3e,0xe6,0xe8,0x40,0x3e,0x77,0xf0,0x40, +0x3b,0x6d,0xf2,0x1, 0xc3,0x7f,0x1, 0xef,0xf8,0x40,0x38,0xe6,0xf0,0x2, 0x23,0x5f, +0xe0,0x1, 0x1f,0xf2,0xfb,0xe6,0x7e,0x12,0xfb,0xe6,0x7d,0x91,0xf0,0x0, 0xa2,0xf, +0xe0,0x2, 0x1f,0xfd,0xf8,0x0, 0x89,0xc, 0xf8,0x0, 0x88,0xb, 0xf0,0x0, 0x10,0x80, +0xf0,0x0, 0x8a,0xdf,0xe8,0x40,0x3b,0x62,0xe8,0x40,0x38,0xe0,0x16,0x1, 0xf0,0x1, +0x11,0xff,0xf8,0x40,0x3d,0x61,0x3d,0x62,0xe0,0x0, 0x1f,0xd, 0xe8,0x40,0x3f,0xe9, +0xf8,0x40,0x3e,0xea,0x15,0x80,0x0, 0x85,0xf0,0x40,0x3b,0xff,0xc7,0x2, 0x1, 0x2b, +0xe1,0x80,0x8e,0x9f,0x3e,0xfc,0x1, 0xf9,0x8c,0x8e,0xc5,0x81,0xe2,0x1, 0xc5,0xff, +0xe2,0x0, 0xcd,0x81,0x8c,0x1e,0xe8,0xd, 0x3c,0xb5,0xe0,0x6a,0x39,0x28,0x3e,0x98, +0xe0,0x63,0x39,0x29,0xf2,0x0, 0xcb,0x1, 0x36,0xa1,0xe8,0xd, 0x3e,0x94,0xe0,0x1, +0x1, 0x25,0x96,0x8d,0xc7,0x2, 0xe8,0x40,0x3e,0xfd,0xe0,0x6a,0x3a,0x28,0xe8,0x40, +0x3e,0xfd,0xe0,0x63,0x3a,0x29,0xe8,0x40,0x3e,0xfd,0xe0,0x7d,0x3a,0x2d,0xf0,0x40, +0x3b,0xff,0x1, 0xd7,0x25,0x8a,0xf0,0xf, 0x30,0xa1,0x3f,0x97,0xf0,0x0, 0xc0,0x81, +0xa9,0x8f,0xf2,0x1, 0xc0,0xff,0xad,0x1f,0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0xe8,0x40, +0x3e,0x76,0xe7,0xff,0x5, 0xbb,0xf2,0x0, 0xc8,0x81,0xf0,0xa, 0x30,0xa1,0xe0,0x1, +0x1, 0x6b,0x17,0xff,0xe8,0x0, 0xaf,0x8c,0xe8,0x0, 0xaf,0x8b,0xe0,0x2, 0x1c,0xc3, +0xe0,0x0, 0x1c,0xd, 0xf0,0x7, 0xa8,0xc7,0xf0,0x0, 0xa8,0x84,0xe0,0x2, 0xd9,0xa, +0x88,0x84,0xe8,0x0, 0xa8,0x88,0xe0,0x1, 0x20,0xdf,0x12,0x0, 0xc2,0x1, 0xe2,0x1, +0xc2,0x7f,0x38,0xf4,0xe0,0x0, 0x1b,0xd, 0xe0,0x0, 0x15,0xe4,0xe0,0x0, 0x1, 0x4a, +0x8c,0x86,0x8d,0x16,0x3b,0xe9,0x39,0xea,0xe0,0x40,0x3e,0x64,0xe0,0xf, 0x36,0x21, +0xe0,0xe, 0x3a,0x9f,0x8e,0x8e,0x8f,0x1e,0xe0,0x8, 0x3b,0xad,0xe2,0x0, 0xcc,0x0, +0xe0,0xf, 0x3c,0xad,0x3e,0xa9,0xe0,0x8, 0x39,0xae,0xe2,0x1, 0xc6,0xff,0xe2,0x1, +0xc7,0xff,0xe0,0x6f,0x3d,0x2d,0xe2,0x0, 0xcc,0x0, 0xe0,0xd, 0x3d,0x2e,0x3f,0x2a, +0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc6,0xff,0xe0,0x6d,0x3d,0x2e,0x3c,0x6d,0x39,0x6f, +0xe2,0x1, 0xc1,0x7f,0xe2,0x1, 0xc4,0x7f,0x39,0x78,0x3f,0x6d,0xc6,0x1, 0x3e,0xeb, +0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc6,0x7f,0x3, 0x82,0x3f,0xee,0x3f,0x6f,0xe2,0x1, +0xc7,0x7f,0x3f,0x7d,0x5, 0x82,0x3f,0xeb,0x38,0xfc,0x3d,0xef,0xe2,0x1, 0xc5,0xff, +0x1, 0xc6,0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0x38,0xf4,0xc3,0x2, 0xe7,0xff,0x1, 0xba, +0xe2,0x0, 0xcd,0xe4,0x17,0x80,0xe0,0x6f,0x39,0xab,0x3d,0xef,0x67,0x1, 0xad,0x8e, +0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xfa,0x13,0x7c,0x11,0xf0,0x0, 0x88,0x84, +0xe0,0x0, 0x1a,0x8d,0xe7,0xfd,0x0, 0xf7,0xf2,0x1, 0xc9,0x7f,0xe7,0xfe,0x1, 0x5b, +0xe0,0xd, 0x3c,0xa6,0xe0,0x43,0x3e,0x9d,0xe2,0x0, 0xce,0x80,0xf0,0x2, 0x39,0x29, +0xe8,0xd, 0x3c,0xa2,0xe2,0x1, 0xc1,0x7f,0xe0,0x1e,0x3c,0x21,0xe2,0x1, 0xc6,0xff, +0xe0,0x6d,0x3d,0x22,0xf8,0x43,0x3f,0x1e,0x39,0x6d,0xf2,0x0, 0xcf,0x0, 0xe8,0xd, +0x3c,0x20,0xf0,0x1e,0x38,0x28,0xe2,0x1, 0xc6,0xff,0xf2,0x1, 0xc7,0x7f,0xe8,0x6d, +0x3d,0x2e,0x3e,0x92,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf3,0xe8,0x40,0x39,0x63, +0xe0,0x62,0x3c,0xad,0xe8,0x40,0x3e,0xf3,0xe0,0x6a,0x3c,0xa8,0xe8,0x40,0x3e,0xf3, +0xf0,0x40,0x39,0xe2,0xe0,0x63,0x3c,0xa9,0xe7,0xfe,0x0, 0x88,0xeb,0xe6,0x7d,0x90, +0xea,0x13,0x7e,0x11,0xeb,0xe6,0x7e,0x92,0xeb,0xe6,0x7f,0x11,0x15,0x7f,0xe0,0x0, +0x14,0xe4,0xac,0x8b,0xaf,0x8c,0xad,0xd, 0xad,0xe, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe0,0x0, 0x1f,0x85,0x8f,0x8f,0x27,0x96,0xe0,0x10,0x8f,0x25,0xe2,0x0, +0xcf,0x10,0x2, 0xae,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe4,0x0, 0xc7,0x8a,0x3f,0x65, +0x3f,0x95,0x0, 0x86,0xe0,0x10,0x8e,0xae,0xe2,0x0, 0xce,0x90,0x2, 0xa1,0x3f,0x7f, +0xc7,0xa, 0x1, 0xf9,0xfa,0x13,0x7c,0x11,0x14,0x1, 0xdb,0x6f,0xf0,0x0, 0x88,0x84, +0xe7,0xfd,0x0, 0x89,0x87,0x7, 0x87,0x97,0xe8,0x0, 0xaf,0xc, 0xe8,0x0, 0xaf,0x8b, +0xe7,0xfe,0x0, 0x96,0x3d,0xe1,0xe7,0xfe,0x0, 0xfb,0xfb,0xe6,0x7e,0x12,0xfb,0xe6, +0x7d,0x91,0xe8,0x40,0x3d,0x61,0xe7,0xfe,0x0, 0x86,0x14,0x1, 0x0, 0xe7,0xfa,0x13, +0x7c,0x11,0x14,0x3, 0x0, 0xe3,0x0, 0x0, 0xe0,0x1, 0x1f,0x8e,0x8f,0x8f,0xe0,0x1, +0x27,0x82,0x8, 0xb4,0xf7,0xff,0x11,0x7f,0xf0,0x12,0x39,0x1f,0xf0,0x0, 0x12,0x1, +0xf2,0x1, 0xc1,0x7f,0xf0,0x14,0x3a,0x19,0xf0,0x0, 0x10,0xa, 0xe0,0x2, 0x1a,0x5e, +0xf4,0x0, 0xc1,0xa, 0xf2,0x1, 0xc2,0x7f,0x11,0xa, 0xf0,0x10,0x38,0x39,0xe8,0x2, +0x39,0x34,0x10,0xff,0xf0,0x1, 0xc1,0x52,0xf0,0x10,0x38,0x14,0x38,0x9a,0xf0,0x2, +0x19,0xd9,0xf0,0x12,0x39,0x14,0x39,0x14,0xe0,0x1, 0x11,0xff,0xf0,0x0, 0xc0,0x4, +0x38,0xa9,0x3c,0xfa,0x3, 0xa4,0xe8,0x0, 0x8e,0x43,0xe8,0x0, 0x8f,0x80,0xf8,0x40, +0x38,0xe3,0xe0,0x2f,0x3f,0x8c,0xf0,0x40,0x3b,0xe9,0xe1,0x35,0x3e,0x3, 0x27,0x83, +0xf0,0x0, 0x2a,0x9c,0xf0,0x40,0x3b,0x61,0xf2,0x1, 0xc3,0x7f,0x3e,0xe2,0x17,0x0, +0x0, 0x89,0x8f,0xcd,0xc7,0x1, 0xe0,0x2f,0x3f,0x8c,0xe8,0xf, 0x3f,0xd5,0xc6,0x8a, +0x2f,0x8c,0xe8,0x40,0x3f,0x76,0xe8,0x17,0x3f,0x14,0x1, 0xf4,0xf0,0x0, 0xc1,0x8a, +0xf8,0x40,0x39,0xf2,0x1, 0xd7,0xa, 0x61,0x17,0x8a,0x3f,0xbc,0xf4,0x0, 0xc3,0x8a, +0x3f,0x94,0xe0,0x2, 0xc7,0xac,0x8f,0x8f,0x2f,0x83,0xe8,0x11,0x3a,0x17,0x17,0xa, +0x3f,0x38,0xe8,0x0, 0x8f,0xc1,0x3f,0x1b,0xaf,0xce,0xe8,0xf, 0x3a,0x17,0xe8,0x0, +0x9e,0x91,0xe8,0x0, 0x9e,0x1, 0xb6,0x9e,0xf0,0x0, 0xc1,0x8a,0xb6,0xe, 0xf8,0x40, +0x39,0xf2,0x8e,0xdf,0xc4,0x1, 0xae,0xde,0xe2,0x1, 0xc4,0x7f,0x8e,0xef,0xae,0xee, +0x8e,0xff,0xae,0xfe,0xe0,0x1, 0x8f,0x8f,0xe0,0x1, 0xaf,0x8e,0xe7,0xff,0x1, 0xab, +0x0, 0xd3,0x38,0x82,0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1f,0x52,0x8f,0x8f,0x8f,0xe, +0x2f,0x9a,0x2f,0x19,0xe0,0x0, 0x1f,0xe, 0x8e,0x8e,0xe0,0x0, 0x1f,0x13,0x8f,0xe, +0x3e,0xfe,0x5, 0x90,0xe0,0x2, 0x1f,0x51,0xe0,0x2, 0x1e,0xd0,0x8e,0xe, 0xe0,0x2, +0x1f,0x5f,0xae,0xd, 0x8e,0xe, 0x3e,0x7f,0x2, 0xa2,0xea,0x22,0x7f,0xba,0x17,0x0, +0xaf,0xf, 0x38,0x82,0xe0,0x0, 0x1e,0x8e,0xe0,0x0, 0x1d,0x8d,0x8e,0xd, 0xe0,0x0, +0x1e,0x93,0x8e,0x8d,0x3e,0xfc,0xe0,0x2, 0x1e,0xd0,0x3, 0x86,0x15,0x1, 0xe2,0x0, +0xce,0x1, 0xad,0xd, 0x1, 0x1a,0xe0,0x2, 0x1e,0x51,0x8e,0xc, 0x3e,0x7e,0x3, 0xe0, +0xaf,0xd, 0xe0,0x2, 0x1f,0x5f,0x8e,0xe, 0x3e,0x7f,0x5, 0xe0,0xea,0x22,0x7e,0x3a, +0x8d,0x8c,0x8e,0x8d,0x3e,0xfb,0x5, 0xde,0xaf,0x8e,0xc5,0x81,0xe0,0x0, 0x1f,0xbe, +0xad,0x8c,0x17,0x1, 0xaf,0xf, 0x38,0x82,0x8d,0xb, 0xe2,0x0, 0xcd,0x1, 0x5, 0x87, +0xe0,0x2, 0x1e,0x7d,0x8e,0x4c,0xc6,0x7e,0x3e,0x7a,0x2, 0x5e,0x8d,0x9b,0xe2,0x0, +0xcd,0x81,0x5, 0x87,0xe0,0x2, 0x1e,0x7d,0x8e,0x5c,0xc6,0x7e,0x3e,0x7b,0x2, 0x54, +0x16,0x0, 0xae,0xd, 0x0, 0xd1,0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1e,0x5f,0x8d,0x8f, +0x8f,0xc, 0xe0,0x0, 0x1e,0xbe,0x17,0x80,0x3f,0x7b,0xaf,0x8d,0x3, 0x9e,0xe0,0x2, +0x1f,0xd2,0xe0,0x2, 0x1f,0x51,0x8f,0x8f,0x8f,0xe, 0xe0,0x2, 0x1d,0x50,0x3f,0xfe, +0x5, 0x9b,0xaf,0x8a,0x2f,0x84,0x17,0x81,0xaf,0x8a,0x17,0x81,0xea,0x22,0x7f,0x3b, +0x8d,0xe, 0x3d,0x7f,0x3, 0x94,0xad,0x8c,0x17,0x81,0xe0,0x2, 0x1e,0x4f,0xc5,0x1, +0xaf,0x8c,0xad,0xe, 0xaf,0x8d,0x38,0x82,0xea,0x22,0x7f,0x3b,0xaf,0x8e,0xe0,0x2, +0x1f,0x4f,0xaf,0x8e,0x38,0x82,0x3f,0xee,0xaf,0xa, 0x0, 0xe5,0x17,0x80,0xaf,0x8e, +0x38,0x82,0xe0,0x3, 0x1f,0x17,0x8f,0x8e,0xe2,0x1, 0xcf,0xf9,0x2, 0x83,0xc7,0x81, +0xaf,0x8e,0x38,0x82,0xe0,0x3, 0x1c,0x3d,0xe0,0x4, 0x15,0x6a,0x14,0x80,0xe0,0x4e, +0x0, 0xa3,0x0, 0x0, 0xe0,0x3, 0x1c,0xbd,0xe0,0x2, 0x1f,0x5f,0x8d,0x9, 0x8c,0xe, +0xe0,0xf, 0x3c,0x9a,0x17,0x0, 0xaf,0x2f,0x24,0x1b,0x15,0xff,0x3d,0x98,0xe2,0x1, +0xc5,0xff,0xc5,0x81,0x17,0x28,0x3f,0x3a,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1f,0xde, +0x3f,0x19,0x3d,0x9f,0x96,0xf, 0x96,0x9f,0xc7,0x8a,0xe0,0x1, 0xb6,0x1e,0x3f,0xfb, +0xc7,0x4, 0xe0,0x1, 0xb6,0x8e,0x1, 0xf7,0xe0,0xf, 0x3c,0x9a,0xac,0x2f,0xc5,0x1, +0xe2,0x1, 0xc5,0x7f,0xe2,0x0, 0xcd,0xf, 0x1, 0x18,0xad,0x9, 0xe0,0x0, 0x16,0x0, +0xe0,0x3, 0x1f,0x3c,0xe0,0x3, 0x1d,0x3b,0xe1,0x80,0x8e,0x9e,0x3f,0xec,0xe2,0x1, +0xc7,0xff,0x3e,0xff,0x3d,0xed,0x3, 0x82,0x3d,0xec,0x3f,0x7a,0x3e,0x6b,0xe2,0x1, +0xc6,0x7f,0x1, 0xf3,0xae,0x19,0x38,0x82,0x17,0x80,0xaf,0x89,0x0, 0xe8,0xf0,0x3, +0x1b,0x3c,0xf0,0x3, 0x1a,0x3a,0xf0,0x3, 0x19,0x3b,0xf0,0x3, 0x19,0xbd,0xf0,0x0, +0x12,0x80,0xf0,0x0, 0x13,0xcf,0xe9,0x80,0x8f,0x96,0x27,0xb5,0x15,0x7f,0x3d,0x1f, +0xe2,0x1, 0xc5,0x7f,0xe8,0xa, 0x3d,0x15,0x35,0x22,0xc5,0x16,0xe8,0xa, 0x3d,0x13, +0xe8,0x40,0x3d,0xe4,0x0, 0x83,0x3d,0x7b,0x1, 0x26,0x9e,0xb, 0x9e,0x9b,0xe0,0xf, +0x3c,0x2c,0xe3,0xff,0xc7,0xff,0xf0,0x43,0x38,0x9f,0xe0,0xe, 0x3c,0xad,0xf2,0x0, +0xc8,0x80,0xe3,0xff,0xc7,0x7f,0x3e,0x28,0xf0,0x43,0x38,0x9e,0xe3,0xff,0xc6,0x7f, +0xe0,0x6f,0x3d,0x2c,0x3e,0xa9,0xf2,0x0, 0xc8,0x80,0xe3,0xff,0xc6,0xff,0xe0,0x6e, +0x3d,0x2d,0xf1,0x2f,0x3b,0xaf,0xc5,0x84,0xf1,0x2e,0x3b,0xae,0x27,0xdd,0x27,0x5c, +0x14,0x1, 0x38,0x82,0xf8,0x40,0x3b,0x72,0xf0,0x0, 0xc2,0x28,0xf0,0x0, 0xc2,0x8a, +0x1, 0xc3,0x14,0x0, 0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfd, +0xc0,0x60,0xe0,0x2, 0x1e,0xdf,0xea,0x22,0x7f,0xb8,0xf0,0x0, 0x8d,0xd, 0x7f,0x8b, +0xf0,0x0, 0x25,0xf, 0x97,0x8f,0xc7,0x81,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0xe4, +0xe0,0x3, 0x5, 0xc1,0x66,0x8b,0xe0,0x0, 0x17,0xe4,0xb7,0x8d,0x0, 0x83,0xf0,0x0, +0xb5,0xf, 0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0xdf,0xe2,0x0, 0xcf,0x81,0xea,0x22, +0x7f,0xb6,0x7f,0x8a,0xe0,0x8, 0x1, 0xc, 0x8f,0x8f,0xe0,0x3, 0x2f,0xa7,0xe0,0x2, +0x1f,0xcf,0x8f,0x8f,0x7f,0x87,0xe0,0x3, 0x2f,0x9c,0xe0,0x0, 0x1f,0xaa,0xe0,0x2, +0x1e,0xe2,0x9e,0xf, 0x9f,0xd, 0x9e,0xf, 0x9d,0x8f,0xe0,0xe, 0x3e,0x2e,0xe2,0x1, +0xc7,0x7f,0xe0,0x1, 0x1f,0xe8,0x7f,0x5, 0x8e,0xf, 0x67,0x5, 0xe2,0x0, 0xce,0x2, +0xc7,0x2, 0x66,0x5, 0xe2,0x1, 0xc7,0x7f,0xb5,0x8d,0x17,0x80,0xe0,0x2, 0x1e,0xc9, +0xe0,0x6c,0x39,0x2e,0x17,0x0, 0x7e,0x5, 0xaf,0xd, 0x7f,0xa6,0x7f,0xa7,0x7f,0xa8, +0x7f,0xa9,0x7f,0xaa,0x7f,0xab,0x7f,0xac,0x7f,0xad,0x7f,0xae,0x7f,0xaf,0xf0,0x2, +0x2d,0x7e,0xe0,0x1, 0x1f,0x8e,0x89,0xf, 0x7f,0x91,0xe0,0xb, 0x21,0x66,0x11,0xff, +0xea,0x21,0x7f,0x14,0x39,0x92,0xf0,0x40,0x3c,0xee,0xea,0x22,0x7f,0xac,0xe2,0x1, +0xc1,0xff,0xea,0x22,0x7e,0xa0,0xea,0x22,0x7d,0xc, 0xea,0x21,0x7d,0xf8,0xea,0x21, +0x7e,0x8, 0xc1,0x81,0xe8,0x40,0x3f,0x69,0x39,0x9f,0x14,0x80,0x14,0x0, 0x12,0xff, +0xe0,0x0, 0x12,0x1, 0xe1,0x80,0xac,0x9f,0xc7,0xa, 0x3f,0xf3,0xe0,0x40,0xaa,0xee, +0xe1,0x80,0xac,0x9d,0xe1,0x80,0xb4,0x1a,0xe1,0x80,0xb4,0x1b,0xe1,0x80,0xaa,0x1c, +0x1, 0xf2,0xe0,0x0, 0x1f,0x51,0x7f,0x17,0xac,0x8e,0xf0,0xb, 0x25,0x3c,0x67,0x85, +0x66,0x85,0x37,0xa3,0xc7,0x94,0x7f,0x98,0xea,0x22,0x7f,0xa0,0x3b,0x6f,0xea,0x22, +0x7f,0x8c,0x7f,0x89,0xea,0x22,0x7f,0xac,0xe4,0x0, 0xc6,0x9e,0xf0,0x0, 0x63,0x7, +0x7f,0x8d,0xea,0x21,0x7f,0x88,0xf0,0x2, 0x1c,0x5e,0x7e,0x99,0x7f,0x93,0xe8,0x40, +0x3a,0x66,0xf8,0x40,0x3f,0x69,0x17,0x8a,0x3f,0xb4,0xf0,0xe, 0x3c,0x1f,0x81,0xce, +0xe2,0x0, 0xc1,0x8f,0x39,0xf2,0x3, 0xbd,0xf0,0x0, 0x14,0x8a,0xf0,0x19,0x3c,0xb3, +0xf8,0xb, 0x3c,0x19,0xe0,0x2, 0xc5,0xac,0x8c,0xb, 0xe2,0x0, 0xcc,0x1, 0xe0,0x4, +0x1, 0x28,0x64,0x89,0xe0,0x5, 0x31,0xa1,0x3c,0x95,0x95,0x89,0xc5,0x81,0xb5,0x89, +0x2c,0x10,0xea,0x20,0x7d,0xe0,0xea,0x21,0x7d,0x78,0xe0,0x9, 0x31,0xa2,0xf0,0x0, +0x93,0xe, 0x93,0x9e,0x3d,0x99,0x3d,0x15,0xf0,0x0, 0xb3,0xb, 0xb3,0x9b,0xb4,0xa, +0x21,0x18,0xe8,0x0, 0x8a,0xce,0xe8,0x40,0x3d,0xee,0x39,0xf5,0x17,0x1, 0x1, 0x89, +0xe0,0xa, 0x0, 0xda,0xe0,0x1, 0x8e,0xeb,0xc5,0x8a,0x39,0xfd,0xe0,0x2, 0x1, 0x31, +0x3e,0xee,0xe2,0x1, 0xc6,0xff,0x3e,0xf2,0x3d,0x6e,0x17,0x1, 0x3f,0x1a,0x4, 0xf3, +0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0xf0,0x40,0x3d,0x74,0xe7,0xff,0x2, 0xb6,0x12,0x8a, +0x3a,0xb2,0xe0,0x1, 0x14,0x40,0xe0,0x2, 0x1c,0xde,0x3d,0x65,0x3c,0x10,0xf8,0x40, +0x3c,0xee,0xe0,0x2, 0xd5,0x4f,0xf0,0xb, 0x25,0x77,0xe0,0x2, 0x1f,0xfd,0x12,0x7f, +0xe8,0x4, 0x3a,0x1a,0x8b,0xcf,0x8b,0x5f,0xe2,0x1, 0xc2,0x7f,0xc2,0x1, 0x33,0xa6, +0x33,0x26,0xe4,0x0, 0xc2,0xa, 0xea,0x22,0x7e,0xa0,0xc3,0xe0,0xc3,0x60,0x39,0xed, +0xea,0x16,0x7c,0x4c,0xe0,0x2, 0x1c,0xde,0xe0,0x43,0x3b,0x97,0xe0,0x43,0x3b,0x16, +0xe8,0x4, 0x3a,0x18,0xf0,0x0, 0x13,0xa0,0x8d,0x49,0xe0,0xf, 0x39,0x9a,0x8d,0x8f, +0xe0,0x0, 0x25,0xc6,0xe0,0x0, 0x21,0x44,0xe8,0x40,0x3f,0x69,0x3e,0xe8,0x17,0x80, +0x0, 0x8d,0xe2,0x0, 0xcd,0x82,0xe0,0x1, 0x1, 0x37,0xc7,0x81,0x3e,0x6f,0xe2,0x1, +0xc6,0x7f,0x3e,0x72,0xc7,0xa, 0xc6,0x8a,0x3, 0xb2,0xe2,0x0, 0xcd,0x81,0x1, 0xf2, +0x8e,0x4e,0x3e,0x7a,0x1, 0xf3,0xe4,0x0, 0xc7,0x8a,0x35,0x22,0xe2,0x1, 0x7e,0x98, +0x3e,0x9a,0xf0,0xe, 0x3c,0x9f,0x96,0xd, 0x97,0xe, 0xe8,0x40,0x3e,0xe7,0x3f,0x1c, +0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x1f,0x5, 0x5, 0x3b,0xfe,0x3e,0xee,0xe0,0x6d, +0x3d,0x27,0xe2,0x1, 0x7f,0x18,0xe8,0xf, 0x3f,0x99,0x3d,0x1e,0x97,0x1a,0x97,0x9f, +0xb6,0x89,0x3f,0x9e,0xe0,0x43,0x3f,0x9f,0xe2,0x0, 0xcf,0x9f,0xe8,0x40,0x3f,0x67, +0x5, 0x5, 0x3b,0x7f,0x3f,0x6f,0xe0,0x6e,0x3d,0x26,0xb7,0x19,0xc4,0x8a,0x3a,0x79, +0xe7,0xff,0x1, 0xb4,0xe8,0x40,0x3c,0xe9,0x3d,0x65,0xe0,0x2, 0xd4,0xdb,0xe0,0x1, +0x14,0xc0,0x3d,0x65,0x3c,0x90,0xe8,0x40,0x3c,0x69,0xe0,0x2, 0xd4,0xd3,0xe0,0x0, +0x21,0x40,0x12,0x7f,0x3a,0x12,0xe2,0x1, 0xc2,0x7f,0xc2,0x1, 0xe4,0x0, 0xc2,0xa, +0xe0,0x2, 0x1a,0xde,0xe8,0x40,0x3e,0xe9,0xe8,0x4, 0x3a,0x19,0xf7,0xff,0x13,0xfd, +0x13,0x80,0x13,0x0, 0xf7,0xff,0x13,0x7f,0x8f,0x4d,0x17,0x8a,0x3f,0xbe,0x3f,0x72, +0x3f,0x95,0xe0,0x2, 0xc7,0xac,0x3, 0xa1,0x87,0x8f,0xea,0x22,0x7c,0x2c,0xe8,0xf, +0x3f,0xd7,0xe2,0x1, 0xc7,0xfd,0xea,0x22,0x7c,0xa0,0xea,0x22,0x7d,0xc, 0xea,0x21, +0x7d,0xf8,0xea,0x21,0x7e,0x8, 0xe2,0x0, 0xcf,0x81,0xe0,0x3, 0x37,0x21,0x3c,0x1e, +0x3c,0x9e,0x3d,0x13,0x3d,0x93,0x3f,0x1c,0x1, 0x88,0xf0,0x0, 0xab,0x4d,0xab,0x88, +0xab,0x89,0xb3,0xa, 0xb3,0xb, 0xaf,0x8e,0xc6,0x8a,0x3e,0xf4,0x1, 0xd6,0xe0,0x2, +0x1f,0xdf,0x17,0x0, 0xf0,0x0, 0xad,0xf, 0xe0,0x3, 0x1f,0x97,0xaf,0xf, 0xe0,0x2, +0xc0,0x20,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x66,0x8a,0xc7,0xff,0xaf,0x8d,0xe7,0xfc, +0x0, 0xd8,0x67,0xb, 0xb7,0x8e,0xe7,0xfc,0x0, 0xc6,0xe0,0x2, 0x1f,0x5d,0x8f,0xe, +0xe0,0x6, 0x2f,0x44,0xe0,0x1, 0x1f,0xe, 0x89,0xe, 0x7f,0x11,0xe7,0xfd,0x29,0x1, +0xe0,0x0, 0x1e,0xd1,0xea,0x21,0x7f,0x14,0xf0,0x40,0x3c,0xee,0x7e,0x97,0xa9,0xd, +0xe7,0xfd,0x0, 0xa7,0x8e,0x4d,0x3e,0x7a,0xe7,0xfe,0x1, 0xc9,0xe4,0x0, 0xc7,0x8a, +0x35,0x22,0xe2,0x1, 0x7e,0x98,0x3e,0x9a,0xe0,0xe, 0x3c,0x1f,0x96,0xd, 0x97,0xe, +0xe8,0x40,0x3e,0xe7,0x3f,0x1c,0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x1f,0xe0,0x5, +0x2, 0x46,0xe2,0x1, 0x7f,0x18,0x3f,0x98,0x3d,0x1e,0x97,0x1a,0x97,0x9f,0xb6,0x89, +0x3f,0x9e,0xe0,0x43,0x3f,0x9f,0xe2,0x0, 0xcf,0x9f,0xe8,0x40,0x3f,0x67,0xe7,0xfe, +0x5, 0x5e,0x3f,0xf6,0x3f,0x66,0xe0,0x6e,0x3d,0x2f,0xe7,0xfe,0x0, 0xd8,0x3a,0xe3, +0xf0,0x0, 0x15,0x8a,0xf0,0x1b,0x3d,0xba,0xe8,0x1d,0x3f,0x98,0xf8,0xe, 0x3f,0x1b, +0xe0,0x0, 0x11,0x78,0x9d,0x9e,0x9d,0xe, 0xe8,0x0, 0x9c,0x9d,0xe8,0x0, 0x9c,0xd, +0x39,0x35,0xea,0x17,0x7f,0x30,0xe0,0x1c,0x39,0x1e,0x7f,0x81,0xef,0xfc,0xdf,0x8, +0xe0,0xe, 0x32,0xa2,0xea,0x20,0x7d,0xe0,0x3d,0x6e,0x3d,0x1b,0x9d,0x9a,0x3b,0xe8, +0x9d,0xa, 0xe8,0x0, 0x9c,0x9d,0xe8,0x0, 0x9c,0xd, 0x7f,0x10,0xef,0xfc,0xde,0xf8, +0xea,0x21,0x7d,0xf8,0xe0,0x16,0x32,0xa1,0xe8,0xb, 0x3d,0x96,0x91,0xb, 0x7c,0x14, +0x39,0x17,0xe3,0xff,0xc1,0x7f,0xe2,0x1f,0xc9,0x20,0x67,0x81,0xe0,0x3, 0x2, 0xd9, +0xb1,0xb, 0xf8,0xa, 0x3f,0x1b,0x65,0x8d,0xe8,0x0, 0x9e,0x9d,0xf8,0x0, 0x9d,0x8d, +0x94,0xa, 0x95,0x1a,0x3d,0x95,0xf8,0x0, 0x8e,0xed,0x8c,0x8b,0xf0,0x8, 0x3d,0xa8, +0x65,0x89,0xe0,0xa, 0x3e,0xaa,0xe0,0x43,0x3c,0x18,0xe0,0x43,0x3d,0x1a,0xe8,0xb, +0x3d,0x96,0xf0,0x0, 0x7e,0x8e,0x7e,0x86,0x7c,0x15,0x7d,0x16,0xf0,0x0, 0x9e,0x8b, +0xe0,0x1, 0x24,0x9d,0x15,0x98,0x3d,0xb9,0xf7,0xff,0x12,0xe8,0xe8,0xb, 0x3d,0x9c, +0xf0,0x15,0x3a,0x9b,0xe0,0x0, 0x15,0x68,0xf8,0x15,0x8, 0x5, 0x3d,0x10,0xe2,0x0, +0xcc,0x81,0xf8,0xa, 0x8, 0x15,0xf0,0x0, 0x9b,0x5a,0xe0,0x8, 0x5, 0xf9,0xf7,0xff, +0x12,0xd0,0xf0,0x15,0x3a,0x9b,0xf8,0x15,0x8, 0x5, 0xe0,0x1, 0x15,0x80,0x3d,0x90, +0xf8,0xb, 0x8, 0x15,0xf8,0x40,0x3a,0xec,0x65,0x7, 0x14,0x0, 0xc5,0x1, 0xe8,0x0, +0x97,0x55,0xe2,0x1, 0xc5,0x7f,0x3c,0xfa,0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0xf0,0x0, +0xc2,0x98,0x2, 0xf5,0x7f,0x81,0xf0,0x0, 0x7b,0x4, 0xe0,0x2, 0xd3,0x49,0x65,0x93, +0xe3,0xff,0xc4,0x7f,0x3d,0x95,0x8d,0x8b,0x7c,0xf, 0x67,0x81,0xf0,0x0, 0x63,0x4, +0xe0,0x0, 0x2d,0xf1,0x67,0x18,0xe8,0x40,0x3d,0xe6,0xf0,0x40,0x3b,0x7e,0x5, 0x5, +0x66,0x98,0x3e,0xf7,0xe0,0x4, 0x4, 0x79,0xe0,0x0, 0x4d,0x68,0x5c,0xb9,0xe4,0x0, +0xc5,0x5, 0x16,0x80,0x3c,0xfa,0x7e,0x92,0x5, 0xa, 0xe0,0x1, 0x4d,0x0, 0xe0,0x0, +0x5c,0xc5,0xe4,0x0, 0xc5,0x5, 0x3c,0xfa,0xe0,0x4, 0x2, 0x60,0x65,0x19,0x3d,0x1b, +0x3d,0x77,0xe0,0x3, 0x4, 0x38,0xe4,0x0, 0xc5,0x83,0xe0,0x2b,0x3b,0x9b,0xe0,0x4, +0x25,0xe2,0xe0,0x0, 0x15,0xe4,0xe1,0x2b,0x3b,0x9b,0xe0,0x4, 0x25,0xdc,0x66,0x92, +0xe0,0x6, 0x2e,0xdd,0xe0,0x1, 0x17,0x48,0x7f,0xc, 0xe0,0x3, 0x0, 0xa7,0xea,0x21, +0x7f,0x78,0xe0,0x7, 0x31,0xa1,0xea,0x22,0x7d,0x2c,0xea,0x22,0x7d,0x8c,0xea,0x21, +0x7f,0x88,0xc2,0x1, 0x14,0x80,0x3f,0x17,0xe2,0x1, 0xc2,0x7f,0x12,0x80,0x3d,0x13, +0xe0,0x16,0x3b,0x13,0x3d,0x97,0xf8,0x17,0x3f,0x19,0x3f,0x93,0xb4,0x8e,0xf0,0x40, +0x3d,0x74,0x17,0x7f,0xaa,0x8a,0xe8,0x0, 0xaa,0x86,0xb4,0x8b,0xe8,0x0, 0xaf,0x47, +0xac,0xf, 0xe7,0xfb,0x2, 0xa2,0xe7,0xfb,0x0, 0xec,0x65,0x93,0x7c,0x9a,0x3d,0x95, +0x8d,0x8b,0x7c,0x9b,0x7c,0x9c,0x7c,0x9d,0x7c,0x9e,0x7c,0x9f,0x7c,0xa0,0x7c,0xa1, +0x7c,0xa2,0x7c,0xa3,0x7c,0xa4,0x7c,0xa5,0xe0,0x3, 0x25,0xfb,0xf0,0x40,0x3b,0x69, +0x7c,0x8f,0xe0,0xa, 0x3b,0x15,0x67,0x7, 0x64,0x93,0xc5,0xff,0x3c,0x95,0x7f,0x12, +0xe0,0x0, 0x16,0xf8,0x17,0x1, 0x8d,0xa, 0xad,0x89,0xe0,0x1, 0x15,0xb4,0x7e,0x8c, +0x7f,0x8, 0xe0,0x1, 0x2d,0x51,0xe1,0x2b,0x3b,0x9b,0xe0,0x1, 0x25,0xc5,0x66,0x88, +0xe0,0x1, 0x26,0xc2,0xf0,0x0, 0x62,0x85,0xe0,0xb, 0x3b,0x15,0x14,0x81,0xac,0x8b, +0xf2,0x1, 0xc2,0xff,0xf0,0x40,0x3b,0x6a,0xe0,0x0, 0x15,0xe4,0xe8,0xb, 0x3d,0xb5, +0xe3,0xff,0xc5,0xfc,0xe2,0x5, 0xcd,0x80,0x5, 0x8a,0x66,0x8a,0x8d,0xd, 0xe2,0x0, +0xcd,0x0, 0xe0,0x5, 0x15,0x0, 0xe0,0x6a,0x39,0xab,0x3d,0xea,0x3d,0xf7,0xe0,0x1, +0x3, 0x98,0xf2,0x0, 0xce,0x82,0xe0,0x1, 0x5, 0x94,0xf8,0xb, 0x3c,0x19,0xe0,0x2, +0xc5,0xac,0xe0,0x9, 0x3b,0x15,0x14,0x0, 0x8d,0xb, 0xac,0x9, 0xe0,0x2, 0x2d,0x39, +0x15,0x3, 0xad,0xb, 0x15,0x8a,0x3d,0xb5,0x15,0x3, 0xe8,0xb, 0x3d,0x98,0xe0,0x2, +0xc5,0xad,0xad,0xb, 0xf0,0x0, 0x25,0x3d,0x16,0xff,0xe8,0xd, 0x3e,0x9a,0xf0,0x40, +0x3d,0x6d,0xf2,0x1, 0xc5,0x7f,0x15,0x8a,0xe8,0xb, 0x3d,0xba,0xe8,0xf, 0x3f,0x98, +0xe8,0xb, 0x3d,0x98,0xf0,0x0, 0x91,0xab,0xf0,0x0, 0x92,0x3b,0xf0,0x0, 0x90,0xb, +0xf0,0x0, 0x91,0x1b,0xf0,0x0, 0x90,0xcb,0xf0,0x0, 0x9a,0x8f,0xf0,0x0, 0x9b,0x1f, +0xf0,0x0, 0x8b,0xcf,0x89,0xdf,0x8c,0x6f,0x8c,0xff,0xe0,0x1, 0x8d,0xf, 0xf0,0x0, +0xb0,0xf, 0xc2,0x7f,0xf0,0x0, 0xb1,0x1f,0xe2,0x1, 0xc2,0x7f,0xf0,0x0, 0xb1,0xaf, +0xf0,0x0, 0xb2,0x3f,0xf0,0x0, 0xb0,0xcf,0xf0,0x0, 0xb2,0x8b,0xf0,0x0, 0xb3,0x1b, +0xf0,0x0, 0xab,0xcb,0xa9,0xdb,0xac,0x6b,0xac,0xfb,0xe0,0x1, 0xad,0xb, 0xe0,0xf, +0x3b,0x15,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x43,0xe2,0x0, 0xcf,0x82, +0xe0,0x3, 0x1, 0x7, 0x67,0x8d,0x3a,0x9f,0x8d,0x85,0xe2,0x0, 0xcd,0x85,0xe0,0x0, +0x1, 0x74,0x17,0x98,0x3f,0xbb,0x66,0x8c,0xf0,0xe, 0x3e,0x1f,0x67,0x85,0xae,0x9e, +0xc2,0x1, 0xaf,0x8e,0xe2,0x1, 0xc2,0x7f,0x67,0x8e,0x66,0x92,0xaf,0xae,0xc5,0x81, +0xae,0xbe,0xf0,0x40,0x3d,0x74,0x67,0x88,0x66,0x95,0xaf,0xce,0xb6,0xbe,0x67,0x96, +0x66,0x94,0xb7,0xce,0xb6,0xee,0x67,0x86,0x66,0x8f,0xe0,0x1, 0xb1,0x3e,0xb3,0xde, +0xf0,0x0, 0xb5,0xfe,0xe0,0x1, 0xb7,0x8e,0xf0,0x1, 0xb6,0x9e,0xe0,0x1, 0xb6,0xae, +0x67,0x11,0xad,0x85,0x89,0xe, 0xe7,0xf9,0x2, 0xc0,0xe7,0xfa,0x0, 0x8a,0xf7,0xff, +0x23,0x40,0xe7,0xfe,0x0, 0xec,0x15,0x0, 0xe0,0x0, 0x17,0x6e,0x16,0x80,0xad,0xb, +0x7f,0xc, 0x7e,0x88,0xf0,0x0, 0x13,0x0, 0xf0,0x0, 0x62,0x85,0xf2,0x1, 0xc2,0xff, +0xe7,0xfe,0x0, 0xc4,0xe2,0x0, 0xcd,0x1, 0xe0,0x2, 0x1, 0x52,0xe2,0x0, 0xcd,0x2, +0x1, 0xf2,0xf0,0x0, 0x62,0x85,0xe0,0x1, 0x4c,0x80,0xe0,0x0, 0x5c,0x45,0xf2,0x1, +0xc2,0xff,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xd1,0xda,0xf0,0x0, 0x62,0x82, +0xe0,0xa, 0x34,0x1, 0xe8,0xa, 0x3d,0x35,0xe0,0xb, 0x3b,0x15,0xe3,0xff,0xc5,0x7f, +0xe1,0x36,0x3d,0x17,0x15,0x0, 0xad,0xb, 0x67,0x81,0xe7,0xfe,0x0, 0x9f,0xe0,0x1f, +0x15,0x20,0xb5,0xb, 0xe0,0x1f,0x11,0x20,0xe7,0xfc,0x0, 0xa5,0x67,0xa, 0x17,0x83, +0xaf,0x8e,0xe7,0xf7,0x0, 0xf6,0xe0,0x0, 0x12,0xe0,0xf8,0x40,0x3c,0xec,0xe8,0x5, +0x3a,0x9c,0x11,0x98,0xe8,0x40,0x3c,0x69,0xf0,0x0, 0xc4,0x98,0x3d,0x63,0xe8,0x40, +0x3c,0xe9,0xe0,0x2, 0xd2,0xf, 0xe8,0x40,0x3a,0xf9,0x1, 0xf5,0x66,0x85,0x67,0xc, +0x67,0x8e,0xe8,0xc, 0xae,0x8c,0xc2,0x1, 0x66,0x92,0xe8,0xc, 0xaf,0x1c,0xe2,0x1, +0xc2,0x7f,0x67,0x8, 0xe8,0xc, 0xaf,0xac,0xf0,0x40,0x3d,0x74,0x67,0x95,0xe8,0xc, +0xae,0xbc,0x66,0x96,0xe8,0xc, 0xaf,0x4c,0x67,0x14,0xe8,0x6, 0xb7,0xbc,0xe8,0x6, +0xb6,0xcc,0x67,0x86,0x66,0x8f,0xe8,0x6, 0xb7,0x6c,0x67,0x11,0xe8,0x7, 0xb1,0x3c, +0xe8,0x6, 0xb3,0xdc,0xf8,0x6, 0xb5,0xfc,0xe8,0x7, 0xb7,0x8c,0xf8,0x7, 0xb6,0x9c, +0xe8,0x7, 0xb6,0xac,0x89,0xe, 0xe7,0xf8,0x2, 0xb8,0xe7,0xf9,0x0, 0x82,0x67,0x8c, +0xe2,0x0, 0xcf,0xf8,0xe7,0xfe,0x1, 0x40,0x66,0x90,0x55,0xb7,0x57,0xb8,0xf2,0x1, +0x7c,0x98,0xf0,0x19,0x3c,0x9d,0xe8,0x0, 0xb5,0x89,0xe8,0x0, 0xb7,0x99,0xe7,0xfe, +0x0, 0xb3,0xe0,0x0, 0x16,0xe4,0x7e,0x8c,0x67,0xf, 0xe2,0x0, 0xcf,0xa, 0x2, 0xbc, +0x16,0x81,0x7e,0x88,0x66,0x97,0x8d,0x8d,0xe2,0x0, 0xcd,0x81,0xe0,0xb, 0x3b,0x15, +0xe7,0xfe,0x1, 0x5b,0x8d,0xb, 0xe0,0x0, 0x15,0xe4,0xe7,0xfd,0x0, 0x94,0x67,0x11, +0x15,0x1, 0x8c,0xe, 0xad,0xb, 0xe7,0xfd,0x24,0x47,0xe8,0x19,0x8d,0xc8,0x3d,0xf3, +0xe0,0x4, 0x1, 0x26,0xe0,0x2, 0x1d,0x5e,0x15,0x81,0x3f,0x6b,0xe2,0x1, 0xc7,0x7f, +0x3c,0x7e,0xf0,0x40,0x3b,0xeb,0xc5,0x81,0xe7,0xfd,0x5, 0xb6,0xe0,0x1a,0x8f,0x6a, +0xc5,0xa, 0x39,0xfe,0x1, 0xf3,0x15,0x8a,0xe8,0xb, 0x3d,0xb7,0x15,0x7f,0xe8,0xb, +0x3d,0x98,0xe0,0x19,0xad,0x4b,0xe7,0xfd,0x0, 0xa7,0x3f,0x77,0x3e,0xe7,0xe0,0x6d, +0x3d,0x2e,0xe7,0xfa,0x0, 0xb8,0xf0,0x0, 0x5a,0xbe,0x17,0x1, 0xf2,0x0, 0xca,0x8a, +0x7f,0x8, 0x5, 0xc1,0xe0,0x0, 0x5d,0xca,0xe2,0x0, 0xcd,0x8a,0xe7,0xff,0x5, 0xbc, +0x55,0xbc,0x54,0x38,0x55,0x37,0x3d,0x98,0xe0,0x43,0x3d,0x9b,0x54,0xbb,0xe2,0x0, +0xcd,0x80,0x3c,0x9a,0xe0,0x43,0x3c,0x99,0x3d,0x6b,0xe0,0x4, 0x4, 0x2, 0xe2,0x0, +0xcc,0x80,0x3d,0xea,0xe3,0xff,0xc5,0xff,0x3d,0x69,0xe0,0x3, 0x4, 0x77,0x64,0x86, +0xe3,0xff,0xc5,0x7f,0xe8,0x40,0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xf0,0x0, +0x7b,0x4, 0xef,0xfc,0xdc,0x3d,0x5d,0xbf,0xe0,0x43,0x3c,0x18,0xe2,0x1f,0xcd,0x9f, +0x67,0x81,0xf0,0x0, 0x62,0x82,0xf0,0x0, 0x63,0x4, 0xe0,0x3, 0x5, 0xcd,0x15,0x8f, +0xe8,0xb, 0x3d,0xb5,0xe3,0xff,0xc5,0xff,0x3c,0x7b,0x67,0xc, 0xe0,0x28,0x3c,0x2b, +0x15,0xa8,0xe0,0x6b,0x3b,0x2e,0x7c,0x8, 0x7d,0x8c,0xe7,0xfe,0x0, 0xfd,0xf0,0x40, +0x3b,0x6b,0x7d,0x8f,0xe7,0xfb,0x0, 0xa2,0xe0,0x0, 0x1f,0x51,0xe0,0x1, 0x1e,0x8e, +0x7f,0x17,0xea,0x21,0x7f,0x14,0x7e,0x91,0xf0,0x40,0x3c,0xee,0x66,0x97,0x67,0x11, +0xaf,0x8d,0x89,0xe, 0xe7,0xf6,0x0, 0xe5,0x5c,0xbe,0x15,0x14,0xe1,0x2a,0x3c,0x9a, +0x7d,0x12,0xe7,0xfb,0x0, 0x9d,0xe0,0x2, 0x1f,0x49,0x15,0x1, 0xad,0xe, 0xe7,0xfb, +0x0, 0x85,0x17,0x14,0x16,0x80,0x7f,0xc, 0x7e,0x88,0xe7,0xfe,0x0, 0xd5,0xe0,0x0, +0x4f,0xe9,0xe2,0x0, 0xcf,0xf8,0xe7,0xfc,0x1, 0x77,0xe0,0x0, 0x55,0xc3,0xe0,0x0, +0x57,0xc4,0x67,0x10,0xf2,0x1, 0x7c,0x98,0xf0,0x19,0x3c,0x9e,0x35,0xa1,0x37,0xa1, +0xe8,0x0, 0xb5,0x89,0xe8,0x0, 0xb7,0x99,0xe7,0xfc,0x0, 0xe6,0xe0,0x0, 0x5d,0x4a, +0xe2,0x0, 0xcd,0x2, 0x2, 0x98,0x5c,0xb9,0xe2,0x0, 0xcc,0xcf,0x2, 0x94,0xf2,0x0, +0xce,0x93,0xe0,0x0, 0x2, 0xc9,0xe0,0x0, 0x5c,0xc6,0xe2,0x0, 0xcc,0x9d,0x2, 0x8b, +0x5c,0xba,0xe2,0x0, 0xcc,0xcf,0x2, 0x87,0xf0,0x0, 0x62,0x85,0xf2,0x1, 0xc2,0xff, +0xe0,0x1, 0x0, 0xb7,0xf2,0x0, 0xce,0x89,0x2, 0xb6,0xf0,0x0, 0x5a,0x3e,0xf2,0x0, +0xca,0x8, 0x5, 0xbe,0x67,0xe, 0xe2,0x0, 0xcf,0xe, 0x2, 0xaf,0xe0,0x0, 0x4d,0x68, +0xe8,0x40,0x3c,0x66,0x3c,0xea,0x7d,0x4, 0x7d,0x83,0x7f,0x81,0xe0,0x2, 0xd0,0x68, +0xf0,0x0, 0x62,0x85,0xe0,0x16,0x34,0x2, 0xf2,0x1, 0xc2,0xff,0xf8,0x16,0x3b,0x35, +0x65,0x4, 0xf3,0xff,0xc3,0x7f,0xf2,0x0, 0xcb,0x78,0x65,0x83,0x67,0x81,0xe0,0x2, +0x2, 0xb3,0xe2,0x0, 0xcd,0xa, 0xe0,0x1, 0x5, 0x8c,0xf2,0x0, 0xcb,0x4f,0xe8,0x40, +0x3d,0x66,0x2, 0x83,0xe0,0x0, 0x15,0x50,0xf0,0x40,0x3b,0x6a,0xf3,0xff,0xc3,0x7f, +0xe0,0x0, 0x0, 0xff,0xf0,0x0, 0x5a,0x3e,0x14,0x8f,0xf1,0x28,0x3a,0x19,0x24,0x8, +0xe1,0x2a,0x3d,0x19,0x25,0x5, 0x66,0x8e,0xe2,0x0, 0xce,0x89,0x5, 0xc8,0xe0,0x1, +0x4d,0x3, 0x25,0x20,0xe0,0x1, 0x1d,0x4e,0x8d,0xa, 0x25,0x1c,0xf0,0x0, 0x62,0x85, +0xf2,0x1, 0xc2,0xff,0xe1,0x2b,0x3b,0x9b,0xe0,0x1, 0x25,0xd0,0x66,0x88,0xe0,0x1, +0x26,0xcd,0xe0,0xb, 0x3b,0x15,0x15,0x3, 0xf2,0x0, 0xce,0x9d,0xad,0xb, 0xf0,0x0, +0x13,0x0, 0xe0,0x1, 0x5, 0xc8,0xe0,0xb, 0x3b,0x15,0x15,0x1, 0xad,0xb, 0xe7,0xfa, +0x0, 0xed,0xf0,0x0, 0x62,0x85,0xe0,0x0, 0x4c,0xe8,0x5c,0x39,0xf2,0x1, 0xc2,0xff, +0x7d,0x83,0x7f,0x81,0xf0,0x0, 0x7a,0x4, 0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xd0,0x8, +0xe0,0x0, 0x4c,0xea,0xf0,0x0, 0x62,0x82,0xe0,0xa, 0x34,0x1, 0x67,0xe, 0xe8,0xa, +0x3d,0x35,0x34,0xa1,0xe0,0x29,0x3f,0x19,0xe3,0xff,0xc5,0x7f,0x65,0x83,0x67,0x81, +0xf0,0x0, 0x62,0x4, 0x24,0xa0,0x14,0x9d,0xe9,0x34,0x3c,0xa4,0xf0,0x0, 0x22,0x1c, +0xe0,0x2, 0x1c,0xce,0x8c,0x89,0x2c,0x97,0xe0,0x1, 0x4c,0x82,0xe0,0x9, 0x3f,0x29, +0xe0,0x43,0x3c,0x19,0xe2,0x0, 0xcc,0x0, 0x5, 0xb, 0xe2,0x0, 0xcc,0x85,0x5, 0xb, +0xe2,0x1, 0xcd,0x47,0xf0,0x40,0x3b,0x6a,0x2, 0x91,0xe0,0x0, 0x0, 0xc7,0xe3,0xff, +0xcc,0x7b,0x4, 0x77,0x66,0x8e,0xf0,0x40,0x3b,0x6a,0xe2,0x0, 0xce,0x8f,0x2, 0xba, +0xe2,0x0, 0xcd,0x78,0x5, 0x83,0xf0,0x0, 0x13,0x78,0xf3,0xff,0xc3,0x7f,0xf0,0x40, +0x3b,0x77,0xe7,0xff,0x5, 0x99,0xf2,0x0, 0xce,0x87,0x2, 0xb2,0xe2,0x0, 0xcb,0x94, +0xe0,0x0, 0x5, 0xc0,0xe0,0xb, 0x3b,0x15,0x15,0x2, 0xad,0xb, 0xf0,0x0, 0x13,0x0, +0xe7,0xfa,0x0, 0x8c,0x15,0x0, 0xe7,0xf7,0x0, 0xdd,0x16,0x8a,0x17,0x0, 0x7e,0x8c, +0x7f,0x8, 0xe7,0xfc,0x0, 0xd1,0xe0,0x0, 0x1f,0xd1,0xfa,0x21,0x7c,0x94,0xf0,0x0, +0xad,0xf, 0x12,0x8a,0x3a,0xb2,0xe0,0x2, 0x1c,0xde,0xe0,0x1, 0x14,0x40,0x3d,0x65, +0x3c,0x10,0xe0,0x1, 0xdf,0xff,0xea,0x16,0x7c,0x4c,0xf0,0x0, 0x65,0x7, 0xe7,0xf6, +0x0, 0x9b,0xe2,0x1, 0xcd,0x48,0x5, 0xca,0xf0,0x1, 0x13,0x48,0x0, 0xc7,0xe0,0x0, +0x5d,0xc6,0xe2,0x0, 0xcd,0xe4,0x5, 0x8d,0x15,0x94,0xe1,0x2b,0x3b,0x9b,0x25,0x89, +0x15,0x93,0xe9,0x2b,0x3d,0xad,0x25,0x85,0x67,0xe, 0xe2,0x0, 0xcf,0x13,0x5, 0xc3, +0xf0,0x0, 0x13,0x1, 0xe0,0x0, 0x5d,0xc8,0xe0,0x0, 0x5d,0x47,0x64,0x86,0xe8,0x40, +0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xf0,0x0, 0x7b,0x4, 0xef,0xfc,0xda,0xb8, +0xe2,0x0, 0xcc,0x3b,0x67,0x81,0xf0,0x0, 0x62,0x82,0xf0,0x0, 0x63,0x4, 0x2, 0x87, +0x65,0x8d,0x15,0x0, 0x3d,0x95,0xad,0xb, 0xf0,0x0, 0x13,0x0, 0xe0,0xb, 0x3b,0x15, +0x15,0x0, 0xad,0xb, 0xe7,0xf9,0x0, 0xb2,0xf2,0x0, 0xce,0x9d,0xf0,0x0, 0x13,0x0, +0x2, 0xda,0xe0,0x3, 0x1f,0x3d,0x8d,0x9e,0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5d,0xc6, +0x5, 0x96,0xe0,0x0, 0x4d,0x6b,0x2d,0x13,0xe2,0x0, 0xcd,0x9d,0xf0,0x40,0x3b,0x6a, +0xe0,0x0, 0x5, 0xc2,0xe0,0xb, 0x3b,0x15,0x8d,0x8b,0xe2,0x0, 0xcd,0x81,0x1, 0x43, +0xe2,0x0, 0xcd,0x83,0xe7,0xf9,0x1, 0x92,0xe7,0xfe,0x0, 0x9f,0xe2,0x0, 0xcd,0x9d, +0xf0,0x0, 0x13,0x0, 0x2, 0xf0,0x66,0x94,0xe2,0x0, 0xce,0x9d,0x2, 0xec,0x67,0xb, +0x9d,0x8e,0xe2,0x0, 0xcd,0xf7,0x2, 0xe7,0xe0,0x2, 0x1d,0xce,0x8d,0x8b,0xe8,0x36, +0x3d,0x86,0x0, 0xe1,0xf0,0x0, 0x13,0x78,0xe7,0xfe,0x0, 0xdb,0xf0,0x0, 0x13,0x80, +0xe7,0xfb,0x0, 0xeb,0x15,0x9, 0x15,0x86,0x66,0x8e,0xe8,0xa, 0x3d,0x35,0xe8,0xb, +0x3d,0xb5,0xe2,0x0, 0xce,0x8b,0xe3,0xff,0xc5,0xfe,0xe3,0xff,0xc5,0x7f,0xe0,0x6a, +0x3c,0xab,0x3d,0xea,0xe7,0xfc,0x0, 0xaa,0x15,0x0, 0xe7,0xfc,0x0, 0x8a,0x15,0x0, +0xe7,0xfb,0x0, 0xff,0x64,0x86,0xe8,0x40,0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82, +0xd8,0xbf,0xf0,0x40,0x3b,0x68,0x67,0x81,0xf0,0x0, 0x62,0x82,0xe7,0xff,0x24,0x34, +0xe7,0xfe,0x0, 0xba,0xea,0x16,0x7c,0x4c,0xe7,0xf4,0x0, 0xf6,0x15,0x80,0x7d,0xa0, +0x7d,0xa1,0x7d,0xa2,0x7d,0xa3,0x7d,0xa4,0x7d,0xa5,0xe7,0xf7,0x0, 0x8d,0x8, 0xb2, +0xe0,0x1, 0x1f,0x8e,0xea,0x22,0x7c,0x40,0x89,0xf, 0x14,0x80,0x31,0x21,0x3d,0x62, +0xe0,0x1, 0xdf,0x7a,0xea,0x22,0x7c,0x54,0x3d,0x62,0x14,0x80,0x9, 0x21,0xe0,0x3e, +0x0, 0xf3,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfe,0xc0,0x64,0xe0,0x2, +0x19,0x5f,0xea,0x16,0x7d,0xca,0xf0,0x0, 0x8e,0x82,0xf0,0x2, 0x1d,0x5e,0x8f,0x8b, +0xf0,0x0, 0x2e,0x90,0xe0,0x3, 0x27,0xa4,0xe0,0x2, 0x1f,0x4f,0x7f,0xa, 0xf0,0x0, +0xae,0x8e,0xef,0xff,0xdf,0xd6,0xf0,0x1, 0x1e,0xe, 0xe8,0x0, 0x89,0x8c,0x0, 0xb1, +0xf0,0x1, 0x1e,0xe, 0xe8,0x0, 0x89,0x8c,0x2f,0x93,0x21,0x92,0x17,0x7f,0x3f,0x13, +0xe2,0x1, 0xc7,0x7f,0xc7,0x1, 0xe4,0x0, 0xc7,0xa, 0xe8,0x40,0x3f,0xea,0xe8,0xe, +0x3f,0x1a,0x16,0xff,0xe0,0x19,0xae,0xcf,0xc7,0x8a,0x3f,0x7f,0x1, 0xfc,0x15,0xff, +0xe8,0xb, 0x3d,0x9d,0xe2,0x1, 0xc5,0xff,0xc5,0x81,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, +0x1f,0xde,0xe8,0xb, 0x3d,0x9a,0x96,0x8f,0x97,0x1f,0x36,0xa4,0xb6,0x8f,0xc7,0x8a, +0x37,0x24,0x3d,0xff,0xe0,0x40,0xb7,0x4f,0x1, 0xf7,0xe0,0x2, 0x1f,0xcf,0x7f,0x8a, +0x12,0xa, 0x3a,0x33,0xe0,0x1, 0x14,0xff,0x3d,0x64,0xe2,0x0, 0x7c,0x3c,0xe0,0x1, +0xdf,0x1b,0x14,0x80,0xe2,0x0, 0x7d,0xbc,0xe8,0x40,0x3d,0x6d,0x3c,0x69,0xef,0xff, +0xd6,0xc5,0x3d,0x63,0xe8,0x40,0x3c,0xed,0xe2,0x0, 0x7d,0xbc,0xef,0xff,0xd6,0xbe, +0xe0,0x2, 0x1c,0xde,0x15,0x0, 0xe2,0x0, 0x78,0xbc,0x21,0xad,0x24,0x11,0x8e,0x49, +0x8f,0xc1,0x3f,0xfc,0x1, 0x21,0x3f,0x61,0x17,0x80,0x0, 0x84,0x8e,0xce,0x3e,0xfc, +0x1, 0x1b,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0xf8,0xc7,0xa, 0x1, 0xf8,0x17,0xa, +0x3f,0x3a,0x17,0x8a,0xe8,0xe, 0x3f,0x1a,0x3f,0xb8,0x92,0x8e,0x95,0x9e,0x96,0x2e, +0x96,0xbe,0x97,0x4e,0x3f,0x91,0xc4,0x1, 0xb2,0x8f,0xe2,0x1, 0xc4,0x7f,0xb5,0x9f, +0xb6,0x2f,0xb6,0xbf,0xb7,0x4f,0xc5,0x1, 0x3f,0xea,0xe2,0x1, 0xc7,0xff,0x3f,0xf3, +0xc4,0x8a,0x4, 0xd5,0xe0,0x2, 0x1c,0x59,0x14,0xbc,0x3d,0x64,0x3c,0x90,0xe0,0x1, +0xde,0x99,0x66,0x8a,0xf0,0x2, 0x19,0x5e,0x8f,0x8d,0xe0,0x5, 0x2f,0x89,0xea,0x16, +0x7d,0xca,0x8f,0xb, 0xe0,0x5, 0x27,0xa, 0xf0,0x5, 0x26,0x94,0xf7,0xff,0x12,0x7f, +0xe0,0x1, 0x1f,0xd7,0xf8,0x14,0x3a,0x1d,0xf2,0x1, 0xc2,0x7f,0xf0,0x1, 0x99,0x9f, +0xf0,0x0, 0xc2,0x1, 0xe0,0x2, 0x1f,0xcd,0xf4,0x0, 0xc2,0xa, 0xf8,0x19,0x88,0xca, +0xf0,0x0, 0x88,0xf, 0x89,0x2, 0xfa,0x22,0x7b,0x40,0xf8,0x14,0x3a,0x1a,0xea,0x22, +0x7d,0xd4,0xf8,0x40,0x3f,0x66,0xf8,0x0, 0x8c,0xc, 0xf8,0x40,0x3d,0x62,0x79,0xe, +0xf8,0x40,0x3d,0xe2,0xe0,0x0, 0x7d,0x8b,0xf7,0xff,0x12,0xfc,0xf0,0x0, 0x7e,0x8c, +0xe8,0x40,0x3a,0x63,0xe8,0x40,0x3b,0xe0,0xe8,0x40,0x3a,0xe1,0xe8,0x40,0x3b,0x64, +0xf0,0x0, 0x7e,0xd, 0xf0,0x0, 0x24,0x19,0xe8,0x0, 0x8e,0x4b,0x3e,0x75,0xe0,0x1, +0x1, 0x54,0xe8,0x40,0x3f,0x62,0x17,0x81,0x0, 0x87,0xe0,0x1a,0x8e,0xee,0xc7,0xa, +0x3e,0x7d,0xe0,0x1, 0x1, 0x4d,0x3e,0xef,0xe2,0x1, 0xc6,0xff,0xf0,0x40,0x3c,0x7d, +0x3d,0xef,0xc7,0x81,0x2, 0xf3,0xf0,0x0, 0x66,0x8c,0xf0,0x0, 0x66,0xd, 0xe0,0x2, +0x1f,0xdd,0x8f,0x8f,0x2f,0x89,0xea,0x16,0x7c,0x40,0xe8,0x40,0x3d,0x68,0xe0,0x1, +0x14,0xff,0xe0,0x1, 0xde,0x69,0xf0,0x0, 0x14,0x80,0xf0,0x1, 0x24,0x20,0xfa,0x16, +0x7d,0xc0,0x11,0x3, 0xe8,0x40,0x3a,0x69,0xe0,0x0, 0x0, 0xd3,0xf0,0xc, 0x3d,0x93, +0x8f,0xc, 0x34,0x44,0xe2,0x1, 0xcf,0x7f,0x34,0xc4,0xe0,0x3, 0x1, 0x69,0xe2,0x0, +0xcf,0x2, 0xe0,0x3, 0x2, 0xdf,0x13,0x81,0x3b,0x9e,0xe2,0x1, 0xc3,0xff,0x13,0x1e, +0xe4,0x0, 0xc7,0xa, 0x3b,0x33,0xea,0x14,0x7e,0x14,0x65,0x8a,0xe0,0xf, 0x3f,0x16, +0x3f,0x9c,0x8f,0xb, 0xb4,0xf, 0xb4,0x9f,0xe0,0x3, 0x2f,0x46,0x3b,0x1c,0x97,0x56, +0x94,0x6, 0xe0,0x1, 0x97,0xa6,0x3c,0x1e,0x3c,0x1f,0x3c,0xe2,0x12,0x8a,0xe3,0xff, +0xc4,0x7f,0xf0,0x18,0x3d,0x1d,0x3a,0x96,0xe0,0x1, 0xdd,0xd5,0xf0,0x0, 0x17,0x14, +0x96,0x95,0xf0,0x1e,0x3f,0x16,0x97,0x96,0xe8,0x0, 0x97,0x1e,0x3f,0x9d,0x3f,0x9e, +0xe8,0x0, 0xb4,0x8, 0x3c,0x6f,0x3c,0xe2,0xe3,0xff,0xc4,0x7f,0xe0,0x1, 0xdd,0xc3, +0xe8,0x0, 0xb4,0x18,0xe8,0x3, 0x39,0x9b,0xab,0x83,0xf0,0x0, 0xc4,0x81,0xf8,0x0, +0x8c,0xc, 0xf2,0x1, 0xc4,0xff,0xf8,0x40,0x3c,0x79,0xe0,0x0, 0x5, 0xc8,0x16,0x8a, +0xe8,0xd, 0x3e,0xb9,0xf8,0x40,0x3e,0xf9,0xf0,0xf, 0x3d,0x1d,0xe0,0x19,0x89,0xcf, +0xe0,0xc, 0x9c,0x4f,0xa9,0xcf,0xe0,0xc, 0x9c,0xdf,0x5, 0x87,0x9e,0xf, 0x9f,0x1f, +0x36,0x44,0x37,0x44,0xb6,0xf, 0xb7,0x1f,0xf0,0xf, 0x3d,0x1d,0xe0,0x19,0x85,0x5f, +0xe0,0x19,0x85,0xef,0xe0,0x19,0x86,0x7f,0xe0,0x1a,0x87,0xf, 0xe2,0x0, 0xc1,0x8f, +0xe8,0x40,0x39,0xf8,0xad,0x5f,0xad,0xef,0xae,0x7f,0xe0,0x1, 0xaf,0xf, 0x3, 0x4e, +0x17,0xa, 0x3f,0x33,0xe8,0xe, 0x3f,0x1a,0xe0,0x2, 0xc7,0x2c,0x8f,0xe, 0xe2,0x0, +0xcf,0x3, 0x1, 0x44,0xe2,0x0, 0xcf,0x1, 0xe7,0xfe,0x1, 0xfa,0xea,0x16,0x7f,0xc0, +0xf0,0x0, 0xc4,0x81,0xf8,0x0, 0x8c,0xc, 0xf2,0x1, 0xc4,0xff,0x3f,0x93,0x17,0x7f, +0xf8,0x40,0x3c,0x79,0xaf,0xf, 0xe7,0xff,0x2, 0xbc,0xea,0x16,0x7e,0xca,0xf0,0x0, +0xae,0x8d,0xe0,0x1, 0xc0,0x1c,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1e,0xcf, +0x7e,0x8a,0xe7,0xfc,0x0, 0xe0,0x3e,0x65,0xe0,0x0, 0x15,0x80,0xf0,0x0, 0x14,0x8a, +0xf0,0x19,0x3c,0xbb,0xf8,0x0, 0x9e,0x9b,0xf8,0xf, 0x3d,0x19,0xe0,0xc, 0x9e,0xdf, +0xe0,0xc, 0x99,0x4f,0xe8,0x0, 0x99,0x8b,0xf0,0xf, 0x3e,0xad,0x3d,0x6f,0xe0,0xe, +0x39,0xa2,0x17,0x8a,0xe3,0xff,0xc7,0x7f,0x3f,0xbc,0xf0,0x43,0x3e,0x1e,0xf2,0x0, +0xce,0x0, 0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x39,0x23,0xe8,0xf, 0x3f,0x9a,0xe3,0xff, +0xc4,0x7f,0xf0,0x43,0x3b,0x9a,0x3c,0xee,0xe0,0x2, 0xc7,0xac,0xe0,0x69,0x3d,0x28, +0x8f,0x8f,0xf2,0x0, 0xcb,0x80,0xe8,0x8, 0x3e,0xad,0xf0,0x40,0x39,0xea,0xe3,0xff, +0xc4,0x7f,0xe0,0x73,0x3d,0x28,0xe2,0x0, 0xcf,0x81,0xf0,0x13,0x39,0x99,0xf3,0xff, +0xc1,0xff,0x36,0x21,0xe0,0x1, 0x1, 0x37,0xf0,0x40,0x39,0xf4,0xf0,0xf, 0x3f,0x1c, +0xe0,0x0, 0x3, 0xff,0x9f,0x8f,0xf0,0x8, 0x31,0xa8,0x3c,0xe4,0x7d,0x6, 0x7e,0x2, +0x7e,0x87,0x7f,0x8, 0x7f,0x89,0xf0,0x0, 0x79,0x3, 0xf0,0x0, 0x79,0x84,0xf0,0x0, +0x7a,0x81,0xf0,0x0, 0x7b,0x85,0xe0,0x1, 0xdd,0x6, 0xe3,0xff,0xc4,0x7f,0xe2,0x0, +0xcc,0xf, 0x65,0x6, 0x66,0x2, 0x66,0x87,0x67,0x8, 0x67,0x89,0xf0,0x0, 0x61,0x3, +0xf0,0x0, 0x61,0x84,0xf0,0x0, 0x62,0x81,0xf0,0x0, 0x63,0x85,0xe0,0x2, 0x2, 0x80, +0xf0,0x40,0x39,0xff,0xe0,0x1, 0x3, 0xbf,0xf0,0x0, 0x60,0xb, 0xf0,0x10,0x38,0x1c, +0xe8,0x0, 0x9c,0x0, 0xe8,0xc, 0x3e,0x1e,0xf0,0x0, 0xb1,0x8c,0xe0,0x0, 0x2b,0xe0, +0x3e,0x68,0xe3,0xff,0xc6,0x7f,0xe2,0x2, 0xce,0x0, 0x3f,0xe8,0x5, 0x83,0xe0,0x2, +0x17,0x80,0xe3,0xff,0xc7,0xff,0xf2,0x0, 0xce,0x0, 0xe0,0xc, 0x39,0x23,0xe3,0xff, +0xc6,0x7f,0xe0,0x6e,0x3d,0x2c,0x3f,0x3f,0x39,0xf2,0x37,0x48,0xe8,0xe, 0x3f,0x55, +0xe3,0xff,0xc7,0x7c,0xf8,0xc, 0x3d,0x19,0xe0,0x0, 0x5, 0xd3,0x3f,0x12,0xe0,0xc, +0xb7,0x4c,0xf2,0x0, 0xcb,0x80,0xe8,0xe, 0x3e,0xad,0xe3,0xff,0xc7,0x7f,0xe0,0x6a, +0x3d,0x2e,0x3f,0xba,0xf0,0x40,0x3e,0xfd,0x37,0xc8,0xe8,0xf, 0x3f,0xd5,0xe3,0xff, +0xc7,0xfc,0xf8,0xb, 0x3d,0x19,0xe0,0x0, 0x2, 0xc2,0xe0,0xf, 0x3e,0xaf,0xe0,0xc, +0xb7,0xdb,0xf0,0x0, 0xc5,0x8a,0xf0,0x40,0x3d,0xf6,0xe7,0xfc,0x1, 0xed,0xf0,0x0, +0x66,0xd, 0xf0,0x0, 0x66,0x8c,0xf8,0x0, 0x8c,0xc, 0xe7,0xfd,0x0, 0x82,0x9f,0x8f, +0xe8,0x40,0x3f,0xf3,0xe7,0xff,0x2, 0xaa,0xfa,0x22,0x78,0x54,0xf0,0x10,0x38,0x1c, +0xe0,0x2, 0x17,0x80,0xe8,0xc, 0x3e,0x1e,0xe8,0x0, 0xb7,0x80,0xe0,0x2, 0x17,0x80, +0xf0,0x0, 0xb1,0x8c,0xe7,0xff,0x23,0xb1,0xe0,0x2, 0x14,0x0, 0x67,0x8e,0xe2,0x0, +0xcf,0x81,0xe7,0xff,0x1, 0x9f,0xe8,0x0, 0x8f,0xeb,0xe0,0xc, 0x34,0x41,0xe2,0x0, +0xcf,0x8f,0xe3,0xff,0xc6,0x7f,0xe0,0x68,0x3b,0xac,0xe7,0xff,0x0, 0x93,0xe0,0xe, +0x39,0x2e,0xe0,0xc, 0xb7,0x4c,0xe7,0xff,0x0, 0xae,0x3f,0x9d,0xe0,0xc, 0xb7,0xdb, +0x0, 0xc1,0xf0,0x0, 0x60,0xb, 0x15,0x80,0xf0,0x9, 0x38,0x1c,0xf0,0xf, 0x3f,0x1c, +0xf0,0x40,0x39,0xf4,0xb5,0x89,0xb5,0x8f,0x3, 0xca,0xf0,0x8, 0x31,0xa8,0x3c,0xe4, +0x7d,0x6, 0x7e,0x2, 0x7e,0x87,0x7f,0x8, 0xf0,0x0, 0x78,0x9, 0xf0,0x0, 0x79,0x3, +0xf0,0x0, 0x79,0x84,0xf0,0x0, 0x7a,0x81,0xf0,0x0, 0x7b,0x85,0xe0,0x1, 0xdc,0x4b, +0xe3,0xff,0xc4,0x7f,0xe2,0x0, 0xcc,0xf, 0x65,0x6, 0x66,0x2, 0x66,0x87,0x67,0x8, +0xf0,0x0, 0x60,0x9, 0xf0,0x0, 0x61,0x3, 0xf0,0x0, 0x61,0x84,0xf0,0x0, 0x62,0x81, +0xf0,0x0, 0x63,0x85,0x5, 0x89,0xf0,0x10,0x38,0x1c,0xe8,0x0, 0xb4,0x0, 0xe7,0xfe, +0x0, 0xcb,0xfa,0x22,0x78,0x54,0xf0,0x10,0x38,0x1c,0x15,0x90,0xe8,0xc, 0x3e,0x1e, +0xe8,0x0, 0xb5,0x80,0x17,0x90,0xf0,0x0, 0xb1,0x8c,0xe7,0xfe,0x23,0xce,0x14,0x10, +0xe7,0xff,0x0, 0x9e,0xf0,0xf, 0x3d,0x1d,0xb4,0xf, 0xb4,0x9f,0xe7,0xfc,0x0, 0xdc, +0x17,0x0, 0xaf,0xc, 0x13,0x81,0x3f,0x64,0xe7,0xfc,0x0, 0xa3,0x17,0x1e,0x3f,0x33, +0xea,0x14,0x7e,0x94,0x15,0x81,0x3f,0x1d,0xad,0x8c,0x16,0x83,0xb4,0xf, 0xb4,0x9f, +0xc7,0xa, 0x94,0xf, 0x94,0x9f,0x95,0x2f,0x95,0xbf,0x96,0x4f,0xe0,0x40,0xb4,0x5e, +0xc6,0xff,0xe0,0x40,0xb4,0xce,0xe2,0x1, 0xc6,0xff,0xe0,0x40,0xb5,0x3e,0xe0,0x40, +0xb5,0xae,0xe0,0x40,0xb6,0x1e,0x2e,0xed,0xe7,0xfc,0x0, 0xb9,0xf0,0x40,0x39,0xff, +0xe7,0xfe,0x4, 0x84,0xfa,0x22,0x78,0x54,0xe7,0xff,0x0, 0xb7,0xf8,0x0, 0x8c,0xc, +0xf7,0xfb,0x26,0xd3,0xe7,0xfb,0x0, 0xcd,0xf8,0x0, 0x8c,0xc, 0x15,0xa, 0xe8,0xa, +0x3d,0x38,0xe0,0x2, 0x1c,0x59,0xe8,0x40,0x3c,0xe2,0xe0,0x1, 0xdb,0xfb,0x0, 0xf1, +0xf8,0x0, 0x8c,0xc, 0xe7,0xfb,0x0, 0xc1,0x8, 0xb1,0xe0,0x2, 0x1c,0x6d,0x15,0xa, +0x14,0x99,0xe0,0x1, 0xdc,0x29,0xe0,0x2, 0x1e,0x8e,0x17,0x0, 0x3f,0xed,0xe1,0x80, +0xaf,0x1f,0xc7,0x81,0xaf,0x1d,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xaf,0xf, 0x8, 0xe1,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x58, +0xf0,0x2, 0x19,0xdf,0xe8,0x0, 0x89,0x3, 0xe0,0x3, 0x21,0x69,0xe0,0x1, 0x1f,0x8e, +0xe0,0x1, 0x1f,0x42,0x8f,0x8f,0xe0,0x0, 0x27,0xf3,0x13,0xff,0x3b,0x9f,0xe2,0x1, +0xc3,0xff,0xf0,0xe, 0x8c,0x9e,0xf0,0xe, 0x8c,0x2e,0xc3,0x81,0xe4,0x0, 0xc3,0x8a, +0xe0,0x2, 0x19,0xde,0xea,0x13,0x7c,0xba,0xfa,0x13,0x7f,0x3c,0xf0,0x19,0x34,0xa6, +0xf0,0x18,0x34,0x26,0xf0,0x0, 0x10,0x80,0xea,0x13,0x7d,0xf0,0xfa,0x13,0x7a,0xe4, +0xfa,0x13,0x7b,0x7c,0xfa,0x14,0x7b,0x88,0xf0,0x0, 0x8e,0x89,0xf0,0x2, 0x1e,0x57, +0xf0,0x2, 0x19,0x6d,0xf1,0xff,0xc4,0xe0,0xf1,0xff,0xc4,0x60,0x3b,0x93,0xf8,0x40, +0x38,0x61,0x7d,0x8a,0xf8,0x40,0x3a,0x6e,0x0, 0x8a,0xea,0x13,0x7f,0x3c,0x31,0x22, +0x3f,0x12,0xb2,0xe, 0xb7,0x9e,0xc1,0x8a,0x3b,0xf3,0x1, 0x37,0x89,0x43,0xe2,0x1, +0xc9,0x7f,0x1, 0x7a,0x9a,0x3, 0x17,0xa, 0x3f,0x32,0xe2,0x0, 0xca,0x21,0x9f,0x93, +0xe8,0x2d,0x3a,0x29,0xe8,0xe, 0x3f,0x1c,0x15,0x81,0xe0,0x6b,0x3b,0xad,0x8f,0xe, +0xe2,0x0, 0xcf,0xa1,0xe8,0x2d,0x3f,0xa8,0x16,0x1, 0xe0,0x6c,0x3b,0xad,0xe2,0x0, +0xcf,0x2, 0x1, 0x21,0x27,0x5b,0xe2,0x0, 0xcf,0x1, 0x1, 0xde,0x66,0x8a,0xea,0x14, +0x7d,0x88,0xea,0x13,0x7e,0x7c,0xea,0x13,0x7f,0xe4,0x3d,0x92,0x3e,0x12,0x3e,0x92, +0xc1,0x8a,0x39,0x1f,0xf0,0x0, 0xa8,0xb, 0x3b,0xf3,0xf0,0x0, 0xa8,0xc, 0xe0,0x0, +0xaf,0xd, 0xf0,0x0, 0xa8,0x2, 0x1, 0xcb,0xf0,0x3, 0x28,0xd0,0xc0,0x28,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe0,0x6, 0x31,0x22,0xf0,0xe, 0x3a,0x16,0xf0,0x0, 0x9d,0xe, +0xf0,0x0, 0x9d,0x9e,0xe8,0xe, 0x3a,0x2a,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x3c,0x1e, +0xe8,0xd, 0x3f,0xab,0xe3,0xff,0xc6,0xff,0xe0,0x41,0x3c,0xce,0xe2,0x0, 0xcc,0x0, +0xf0,0x43,0x3f,0x1d,0xe3,0xff,0xc4,0xff,0xf0,0x1, 0x3a,0x92,0xe0,0x41,0x3d,0x4d, +0xe0,0x6e,0x3d,0x29,0xf2,0x0, 0xcf,0x0, 0x8c,0x81,0xe3,0xff,0xc5,0x7f,0xe0,0x6d, +0x3d,0x2a,0xe2,0x0, 0xcc,0xe3,0x2, 0x83,0xc4,0x81,0xac,0x81,0xe8,0x0, 0x8d,0x3, +0xe2,0x0, 0xcd,0x7, 0xe0,0x2, 0x5, 0x8a,0xf0,0xa, 0x3b,0x92,0x88,0x8a,0x15,0xa, +0xf0,0x0, 0x26,0x89,0xf1,0xff,0xc6,0xff,0xf2,0x1, 0xc6,0xff,0xf0,0x0, 0x10,0x81, +0x15,0xa, 0xf0,0x9, 0x39,0x12,0x8a,0x89,0x3d,0x75,0x5, 0x83,0xad,0x9, 0x3a,0xea, +0x28,0x99,0xf0,0xa, 0x3a,0x92,0x8d,0xa, 0xe2,0x0, 0xcd,0x11,0x2, 0x8d,0x8d,0x53, +0x14,0xa2,0xe1,0x2a,0x3c,0xaa,0xe0,0x2, 0x2d,0x3, 0x8c,0xe3,0x15,0x7, 0xe1,0x2a, +0x3d,0x29,0xe0,0x1, 0x2d,0x7d,0xe0,0xa, 0x3f,0x1d,0xe2,0x0, 0xcd,0x3, 0xe0,0x2, +0x5, 0x0, 0x3d,0x65,0xe3,0xff,0xc5,0x7f,0xe1,0x29,0x3d,0x1e,0xe0,0x0, 0x24,0xdb, +0xe1,0x2a,0x3d,0x1d,0xe0,0x0, 0x25,0x57,0x2d,0x83,0xf0,0x0, 0xb5,0x3, 0x2e,0x3, +0xf0,0x0, 0xb5,0x93,0xe0,0x2, 0x1f,0xe, 0x3f,0x12,0x87,0x8e,0xc7,0x81,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x9d,0xaf,0x8e,0xe7,0xfe,0x5, 0xc7,0x8c,0x53,0x14,0x83, +0xf0,0x0, 0x78,0x7, 0xf0,0x0, 0x78,0x85,0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x79,0x88, +0xf0,0x0, 0x7a,0x4, 0xf0,0x0, 0x7a,0x83,0xf0,0x0, 0x7b,0x2, 0xf0,0x0, 0x7b,0x81, +0xe0,0x1, 0xda,0xa1,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x9e,0xf0,0x0, +0x60,0x7, 0xf0,0x0, 0x60,0x85,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x61,0x88,0xf0,0x0, +0x62,0x4, 0xf0,0x0, 0x62,0x83,0xf0,0x0, 0x63,0x2, 0xf0,0x0, 0x63,0x81,0xe0,0x2, +0x2, 0x84,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8e,0x3f,0x6f,0xe0,0x2, +0x5, 0x85,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x3f,0xf5,0x5, 0x85,0xf0,0xf, 0x39,0x12, +0xc2,0x81,0xaa,0x8f,0xea,0x13,0x7f,0xfc,0x39,0x1f,0x15,0x81,0xad,0x82,0xe7,0xfe, +0x0, 0x84,0xf0,0xc, 0x3b,0x12,0x8e,0xc, 0x26,0x1c,0x14,0x94,0xe1,0x2c,0x3f,0x19, +0xe0,0x1, 0x2e,0x1b,0xe1,0x2c,0x3e,0x99,0xe0,0x1, 0x2e,0x17,0x14,0x89,0xe1,0x2c, +0x3f,0x19,0xe0,0x1, 0x2e,0x6c,0xe1,0x2c,0x3e,0x99,0xe0,0x1, 0x2e,0x68,0x15,0x84, +0xe1,0x2e,0x3f,0x1b,0xe0,0x1, 0x2f,0x69,0xe1,0x2d,0x3e,0x9b,0xe0,0x1, 0x2e,0xe5, +0x66,0x8a,0xe0,0xe, 0x3e,0x92,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x5, 0xbc,0x17,0xff, +0x3f,0x9e,0xe2,0x1, 0xc7,0xff,0x3f,0x6f,0x3e,0x92,0xaf,0x8d,0x3c,0xee,0xf0,0x0, +0x78,0x7, 0xf0,0x0, 0x78,0x85,0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x79,0x88,0xf0,0x0, +0x7a,0x4, 0xf0,0x0, 0x7a,0x83,0xf0,0x0, 0x7b,0x2, 0xf0,0x0, 0x7b,0x81,0x7f,0x9, +0xe0,0x1, 0xd9,0xee,0xf0,0x4, 0x3d,0x18,0x67,0x9, 0xe3,0xff,0xc2,0x7f,0xb2,0x3, +0x3c,0xee,0xe8,0x40,0x3c,0x6e,0xe0,0x1, 0xd9,0xe3,0xf0,0xf, 0x3d,0x98,0xe3,0xff, +0xc7,0xff,0xf0,0x0, 0x63,0x81,0xf0,0x0, 0x63,0x2, 0xf0,0x0, 0x62,0x83,0xf0,0x0, +0x62,0x4, 0xf0,0x0, 0x61,0x88,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x60,0x85,0xf0,0x0, +0x60,0x7, 0xb7,0x93,0xe8,0x6, 0x3b,0x14,0xf0,0xd, 0x3b,0x92,0xf0,0xe, 0x3b,0x12, +0x16,0x1, 0xe2,0x0, 0xca,0x8e,0xae,0xd, 0xf0,0x0, 0xa8,0xe, 0xb2,0x6, 0xb7,0x96, +0x5, 0x95,0xf0,0xf, 0x39,0x12,0x17,0x5, 0xaf,0xf, 0xe0,0x2, 0x1f,0x8e,0x39,0x1f, +0xf0,0x0, 0xa8,0x2, 0xe7,0xfd,0x0, 0x89,0xe2,0x0, 0xcd,0x2, 0x5, 0x8f,0xf0,0xa, +0x3b,0x92,0x88,0x8a,0x15,0x9, 0xe7,0xfd,0x0, 0xf5,0xe2,0x0, 0xca,0x81,0x5, 0xee, +0xf0,0xf, 0x39,0x12,0xc2,0xff,0xaa,0x8f,0x0, 0xe9,0xe0,0x0, 0x1, 0x4e,0xf0,0x0, +0x26,0xbe,0xf0,0xa, 0x3b,0x92,0x88,0x8a,0xe7,0xfd,0x0, 0xe6,0x14,0x9f,0xe1,0x2a, +0x3c,0xae,0xe7,0xfe,0x25,0x2, 0xe1,0x2a,0x3c,0xad,0xe7,0xfd,0x25,0x7e,0x16,0x80, +0x3f,0x6d,0xe7,0xfe,0x0, 0x80,0x8f,0x53,0xe2,0x0, 0xcf,0x3c,0x5, 0xaf,0xea,0x13, +0x7e,0xf0,0x17,0xb, 0x3f,0xee,0xe7,0xff,0x0, 0x81,0xdd,0xef,0xea,0x14,0x7f,0x8, +0xea,0x13,0x7f,0xfc,0x3e,0x6e,0x3e,0xef,0xe1,0x80,0xb9,0x1c,0xea,0x13,0x7c,0x70, +0xe1,0x80,0xb9,0x1d,0x15,0xa, 0xb9,0x1e,0x14,0x81,0xb9,0x1f,0xb1,0x2c,0xb1,0x2d, +0xe0,0x1, 0xda,0xa, 0xea,0x13,0x7f,0xe4,0x3f,0x6f,0xe1,0x80,0xb9,0x1e,0xb9,0x1f, +0xb1,0x2e,0xc0,0x28,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x9, 0x39,0x12,0xf0,0xa, +0x3b,0x92,0x8a,0x89,0x88,0x8a,0xe7,0xfd,0x0, 0xb5,0x66,0x8a,0x15,0x81,0x3e,0x92, +0xad,0x8d,0xe7,0xff,0x0, 0x89,0x8d,0x53,0xe2,0x0, 0xcd,0x3c,0xe7,0xff,0x5, 0xb1, +0xf0,0xa, 0x3b,0x92,0x88,0x8a,0x20,0xa6,0xf7,0xfd,0x2e,0x96,0xf0,0xa, 0x39,0x12, +0x8a,0x8a,0xe7,0xfd,0x0, 0xb8,0x14,0x1e,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8e,0x3f,0x6f,0xe7,0xfd,0x2, 0xff,0x17,0xf, 0x3f,0xee,0xe2,0x1, 0xc7,0xff, +0x3f,0xf5,0xe7,0xfe,0x5, 0x81,0xe7,0xfd,0x0, 0xfb,0xea,0x13,0x7e,0xf0,0x17,0x5, +0x3f,0xee,0xe7,0xfe,0x0, 0xab,0xea,0x13,0x7e,0xf0,0x17,0x2, 0x3f,0xee,0xe7,0xfe, +0x0, 0xa5,0x15,0x12,0xe7,0xfc,0x0, 0xee,0xea,0x13,0x7c,0xba,0xf0,0x0, 0xae,0x89, +0xe7,0xfc,0x0, 0xae,0xe0,0x2, 0x1f,0x40,0xe0,0x2, 0x1f,0xc8,0xe0,0xa, 0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x1, 0x77,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0xe0,0x0, +0x1, 0x75,0xea,0x13,0x7f,0xb8,0x8f,0xf, 0x27,0x37,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, +0x1e,0xc7,0xe0,0x1, 0x1, 0xb, 0xe0,0x2, 0x1f,0xd1,0x17,0x0, 0xaf,0xf, 0x9f,0x8d, +0xe2,0x1, 0xcf,0x96,0xe0,0x0, 0x5, 0xce,0xea,0x13,0x7f,0x36,0x87,0x8e,0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xaf,0x8e,0xe0,0x1, 0x5, 0x97,0xe0,0x2, +0x1e,0xda,0x16,0x28,0xe2,0x0, 0xcf,0x83,0xae,0xd, 0xe0,0x0, 0x5, 0xed,0x17,0x80, +0xe0,0x2, 0x1e,0x4e,0xe0,0x2, 0x1d,0x4d,0xaf,0x8e,0xe0,0x0, 0x15,0xf7,0x17,0x1e, +0xaf,0xc, 0x17,0xa8,0x17,0x1e,0xad,0x8a,0x27,0x3, 0xc7,0x7f,0xaf,0xc, 0x27,0xb9, +0xc7,0xff,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1e,0xdd,0x8e,0x8d,0xe0,0x0, 0x26,0xd0, +0xe0,0x1, 0x1e,0xc7,0x9e,0xd, 0xe2,0x3, 0xce,0x10,0xe0,0x0, 0x5, 0xe1,0xea,0x13, +0x7d,0xb7,0x86,0xb, 0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0xe2,0x0, 0xce,0x1, 0xae,0xb, +0xe7,0xff,0x5, 0xbb,0xea,0x13,0x7e,0x39,0xaf,0xc, 0x17,0x1, 0xaf,0xf, 0x17,0x4, +0xe0,0x2, 0x1f,0xd1,0xaf,0xf, 0x9f,0x8d,0xe2,0x1, 0xcf,0x96,0xe7,0xff,0x2, 0xb6, +0xea,0x13,0x7f,0xb6,0xe0,0x2, 0x1e,0xda,0x17,0x0, 0xaf,0xf, 0x8f,0x8d,0xe0,0x2, +0x1d,0x4d,0xe0,0x2, 0x1e,0x4e,0x8f,0xa, 0xe0,0x0, 0x2f,0x4d,0x8f,0xc, 0x0, 0xc5, +0x38,0x82,0x8f,0xf, 0xe7,0xff,0x2f,0xa, 0xea,0x13,0x7f,0x36,0x17,0x80,0xaf,0x8e, +0xea,0x13,0x7d,0xb9,0xe0,0x2, 0x1f,0x51,0xea,0x13,0x7e,0x38,0xaf,0x8e,0xea,0x13, +0x7e,0xb7,0xe0,0x2, 0x1f,0x4d,0xaf,0x8e,0xe0,0x2, 0x1f,0x4e,0xaf,0x8e,0xe0,0x2, +0x1f,0x5a,0xaf,0x8b,0xaf,0x8c,0xaf,0x8d,0xaf,0x8e,0x38,0x82,0xe0,0x1, 0x1e,0xc7, +0xe7,0xfe,0x0, 0xfb,0x17,0xa8,0x0, 0xd4,0x9f,0xd, 0xe2,0x2, 0xcf,0x2b,0x2, 0x94, +0xea,0x13,0x7e,0x39,0x87,0xc, 0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x32, +0x5, 0x91,0x17,0x0, 0xaf,0xc, 0xaf,0xf, 0xe7,0xfe,0x0, 0xe7,0xea,0x13,0x7f,0xb7, +0xaf,0xf, 0xe7,0xfe,0x0, 0xe2,0xea,0x13,0x7f,0xb9,0x17,0x0, 0xaf,0xf, 0xe7,0xff, +0x0, 0xa8,0xaf,0xc, 0xe7,0xff,0x0, 0xa5,0xe0,0x2, 0x1e,0xda,0x8f,0x8d,0xe7,0xff, +0x0, 0xb0,0x15,0xff,0x3d,0x9e,0xe2,0x1, 0xc5,0xff,0x8f,0xc, 0xad,0x8a,0xe7,0xfe, +0x0, 0xf5,0x8, 0xb1,0xe2,0x0, 0xcc,0x2, 0x1, 0x21,0xe2,0x0, 0xcc,0x3, 0x1, 0x16, +0xe2,0x0, 0xcc,0x1, 0x1, 0x2, 0x8, 0xe1,0xef,0xfc,0xdb,0x56,0xe0,0x2, 0x1f,0xd2, +0xac,0xf, 0xe0,0x2, 0x1f,0x84,0x24,0x20,0x17,0x0, 0xaf,0xf, 0x17,0xa, 0xe0,0x2, +0x1f,0x88,0xb7,0xf, 0x8, 0xa1,0xe7,0xfe,0x0, 0x97,0xef,0xff,0xd2,0x3f,0xef,0xff, +0xd1,0xab,0xdc,0xbb,0x8, 0xa1,0xe7,0xf2,0x0, 0xd7,0xe0,0x2, 0x1f,0xd0,0x17,0x0, +0xaf,0xf, 0xef,0xff,0xd1,0x5a,0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f,0x2f,0xdc, +0x8, 0xa1,0xe7,0xe1,0x0, 0xf1,0x8f,0xf, 0xe2,0x0, 0xcf,0x1, 0x1, 0xe4,0x0, 0xdd, +0xe0,0x1, 0x1f,0x8e,0x8f,0x8f,0x27,0x9b,0x16,0x7f,0x3e,0x1f,0xe2,0x1, 0xc6,0x7f, +0xc6,0x1, 0xe4,0x0, 0xc6,0xa, 0x16,0x83,0x3e,0x18,0xe0,0xff,0x17,0x7f,0x17,0x80, +0xae,0x88,0xc4,0xa, 0x3c,0x7c,0xe0,0x41,0xae,0x98,0xe0,0x40,0xb7,0x48,0xe0,0x40, +0xb7,0x38,0xe0,0x40,0xaf,0xc8,0xe0,0x40,0xaf,0xa8,0x1, 0xf3,0x38,0x82,0x0, 0x0, +0xe0,0x1, 0x1f,0x8e,0xc4,0xff,0x8e,0xf, 0xe0,0x2, 0x1f,0xdf,0x8e,0x8f,0x17,0x80, +0xe0,0x0, 0x26,0x41,0xf0,0x2, 0x1b,0xde,0xf0,0x40,0x3a,0x6f,0xf0,0x0, 0x12,0x82, +0xf0,0x0, 0x13,0x3, 0x15,0xfd,0x15,0x1, 0x0, 0x8f,0x8f,0x78,0x27,0x17,0xf0,0x0, +0xab,0x8, 0x17,0x3, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xaf,0x18,0x3f,0xfc,0xc4,0xa, +0xe0,0x40,0xaf,0x38,0x1, 0x27,0xe0,0x80,0x8f,0x19,0xe2,0x0, 0xcf,0x1, 0x1, 0x11, +0x87,0x18,0x3f,0x5b,0xe2,0x1, 0xc7,0x7d,0x2f,0x69,0x17,0xa, 0x3f,0x3d,0xad,0x8, +0xe8,0xe, 0x3f,0x17,0xc6,0x81,0xaf,0xce,0xe2,0x1, 0xc6,0xff,0x8f,0x8, 0x0, 0xe3, +0x8f,0x18,0xe2,0x0, 0xcf,0x1, 0x1, 0xf, 0xe2,0x0, 0xcf,0x3, 0x1, 0xe, 0x2f,0x5, +0xf0,0x0, 0xaa,0x88,0x17,0x2, 0x0, 0xd7,0xe2,0x0, 0xcf,0x2, 0x1, 0xf0,0xaf,0x8, +0x0, 0xd2,0x38,0x82,0xf0,0x0, 0xab,0x18,0x17,0x0, 0xf0,0x0, 0xaa,0x8, 0x0, 0xcb, +0x8, 0xb6,0xc0,0x4c,0xe0,0x1, 0x1a,0x8e,0xe0,0x2, 0x1f,0xfd,0x8d,0x5, 0xf0,0x0, +0x8a,0x6f,0xf0,0x0, 0x89,0x7f,0xe0,0x3, 0x25,0x6b,0x14,0x7f,0x3c,0x1a,0xe2,0x1, +0xc4,0x7f,0xc4,0x1, 0xe0,0x2, 0x19,0x5e,0xe4,0x0, 0xc4,0xa, 0x14,0x9c,0x15,0x84, +0x16,0x10,0x3f,0xe2,0x3c,0x90,0x3d,0x90,0x3e,0x10,0x3c,0x12,0x16,0xff,0x17,0x0, +0xae,0xcf,0xc7,0x8a,0x3f,0xf8,0xe1,0x80,0xae,0x99,0xe1,0x80,0xaf,0x1b,0xe1,0x80, +0xaf,0x1c,0x1, 0xf7,0xe0,0x2, 0x1a,0x5f,0xea,0x23,0x79,0x94,0xf0,0x0, 0x8b,0x4, +0xf0,0x0, 0x2b,0x22,0x8f,0x83,0x27,0x97,0xe0,0x3, 0x25,0x50,0x17,0x7f,0x3f,0x1a, +0xe2,0x1, 0xc7,0x7f,0xc7,0x1, 0xe4,0x0, 0xc7,0xa, 0xe0,0x2, 0x1f,0xde,0x39,0x1e, +0xe0,0xff,0x17,0x7f,0xe0,0x12,0xb7,0x7f,0xc7,0x8a,0x39,0x7f,0xe0,0x12,0xb7,0x3f, +0x1, 0xfa,0x8f,0x84,0xe0,0x2, 0x1c,0x57,0x14,0x84,0x3c,0x90,0xaf,0x83,0xdf,0x61, +0xc0,0x34,0xb, 0x61,0xf0,0x0, 0x8b,0x83,0xf0,0x2, 0x23,0x8f,0xe0,0x3, 0x25,0x31, +0x16,0xff,0x3e,0x9a,0xe2,0x1, 0xc6,0xff,0xe0,0x1, 0x1f,0x7f,0xf0,0x1, 0x1a,0xe5, +0xe0,0x26,0xc6,0xb6,0x36,0xa2,0x3e,0x9e,0xe8,0x40,0x3f,0xe5,0xe0,0xff,0x17,0x7f, +0xb7,0xf, 0xc7,0x84,0x3f,0xfd,0xe0,0x40,0xb7,0x1f,0xe0,0x2, 0xb7,0x2f,0xe0,0x2, +0xb7,0x3f,0x1, 0xf7,0x17,0x81,0xf0,0x13,0x32,0x26,0xf0,0x14,0x31,0x26,0xf9,0x31, +0x3b,0x96,0xf1,0x2e,0x3b,0x9f,0xf1,0xff,0xc1,0xdf,0xf1,0xff,0xc2,0x5f,0x14,0x0, +0xf0,0x11,0x38,0xde,0xf8,0x43,0x39,0x93,0xf8,0x43,0x3a,0x14,0xf0,0x40,0x39,0x6f, +0xf0,0x40,0x38,0x68,0x25,0x19,0x17,0x80,0x16,0x10,0xe0,0x2, 0x1f,0x57,0x3e,0x10, +0x3e,0xef,0x9d,0x9e,0xe4,0xd, 0x36,0xc8,0xe2,0xff,0xcd,0xff,0x1, 0x4, 0x8c,0x8c, +0xe0,0x1, 0x24,0xec,0xc7,0x81,0xe4,0xd, 0x37,0xa8,0xe4,0xb, 0x36,0xc8,0x3d,0x7b, +0xc7,0xa, 0xc6,0x1, 0x2, 0xef,0xc4,0x1, 0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40, +0x3b,0xff,0xf0,0x0, 0xc2,0x84,0x2, 0xdf,0xe0,0x0, 0x25,0x40,0x14,0x7f,0x3c,0x1a, +0xe2,0x1, 0xc4,0x7f,0xc4,0x1, 0x14,0x8a,0x3c,0xb8,0xea,0x23,0x7e,0x80,0xea,0x22, +0x7f,0x6c,0xe0,0x2, 0x1f,0xde,0x3c,0x92,0xe0,0x12,0x95,0xff,0xe0,0x13,0x96,0xf, +0xc7,0x8a,0x3f,0xf9,0xe1,0x80,0xb5,0x9d,0xe1,0x80,0xb6,0x1e,0x1, 0xf6,0x15,0x9c, +0x3d,0x90,0x3c,0x1b,0x10,0x81,0x13,0x0, 0x0, 0x84,0xc5,0x81,0x3d,0xf8,0x1, 0x1d, +0x8f,0x8b,0xe2,0x1, 0xcf,0xff,0x1, 0xfa,0x4f,0x10,0x16,0x91,0x3e,0x90,0x17,0x81, +0xe0,0x2, 0x27,0x29,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3f,0x7a,0x3c,0xef,0x3, 0xee, +0xe1,0x80,0x8e,0x1d,0xc7,0x81,0x2e,0x77,0xaf,0xb, 0xe2,0x0, 0x7e,0x90,0xc5,0x81, +0x3c,0x9d,0x3d,0xf8,0xa8,0x89,0x1, 0xe5,0x15,0xff,0xe8,0xb, 0x3d,0x96,0xe2,0x1, +0xc5,0xff,0xc5,0x81,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1f,0xde,0xe0,0x1, 0x1f,0x66, +0x3d,0x92,0x96,0xf, 0x96,0x9f,0xc7,0x8a,0xb6,0xe, 0x3f,0xfb,0xc7,0x4, 0xe0,0x40, +0xb6,0x9e,0x1, 0xf8,0xe0,0x1, 0x1e,0xe0,0xe0,0x1, 0x1f,0x5f,0xe0,0x1, 0x1f,0xf9, +0x36,0xc1,0x37,0xc1,0x37,0x41,0xe2,0x0, 0x7c,0x28,0x7f,0x8d,0x7e,0x8b,0x7f,0xc, +0xf0,0x0, 0x6b,0xa8,0xf0,0x0, 0x6b,0x29,0xe0,0x1, 0xd2,0x36,0x8f,0x84,0x8c,0x5, +0x27,0xae,0x15,0x7f,0xe0,0x1, 0x1f,0xf8,0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0x4d, +0xc5,0x12,0x9a,0x8f,0xe0,0x1, 0x1f,0xff,0x35,0x21,0x14,0x80,0xf0,0x2, 0x1b,0xd7, +0x3d,0x1f,0xf0,0x0, 0x13,0x1, 0x38,0xe9,0x24,0x14,0x3d,0xe9,0xe2,0x1, 0xc5,0xff, +0x3a,0xfb,0xe0,0x1, 0x1f,0x78,0x17,0x81,0x1, 0x88,0xe0,0x1, 0x0, 0x9d,0xe0,0x80, +0x9e,0x9e,0x3e,0xfb,0xe0,0x1, 0x1, 0x1a,0x3d,0x7e,0x3e,0x6f,0xc7,0x81,0x1, 0xf8, +0xc4,0x81,0x8f,0x84,0xe2,0x1, 0xc4,0xff,0x3f,0xf9,0x2, 0xe7,0xe7,0xfe,0x24,0x3, +0x16,0xff,0x3e,0x98,0xe2,0x1, 0xc6,0xff,0x17,0x4, 0x3f,0x10,0xc6,0x81,0xe0,0x2, +0x1f,0xde,0x3e,0x9e,0xe0,0xff,0x15,0xff,0xe1,0x80,0x8e,0x1e,0xe2,0x0, 0xce,0x1, +0x1, 0x5, 0xe0,0x12,0xb5,0xff,0xe0,0x13,0xb5,0x8f,0x3e,0xfe,0xc7,0x8a,0x1, 0xf5, +0x8f,0x84,0xe7,0xfd,0x0, 0xe9,0xe0,0x2, 0x1c,0xd7,0x15,0x1, 0x17,0x8a,0xe8,0xf, +0x3f,0xb7,0x16,0x1, 0xe0,0xe, 0x39,0x1f,0x96,0x8e,0x95,0x9e,0x3f,0x99,0xb6,0x9f, +0xe8,0xc, 0x3e,0x17,0xb5,0xaf,0xe2,0x0, 0x7e,0x84,0xe8,0xd, 0x3e,0x97,0x8f,0x84, +0xf0,0x0, 0xab,0xce,0xf0,0x40,0x3b,0xec,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3f,0xf7, +0xad,0xd, 0x2, 0xe5,0xe7,0xfd,0x0, 0xc8,0xf0,0x0, 0x28,0x9c,0x97,0x2e,0xe8,0x0, +0xb5,0x85,0xe8,0x0, 0xb7,0x15,0xe2,0x0, 0x7f,0x1c,0xe2,0x0, 0x7e,0x10,0x3f,0x18, +0x3f,0x9c,0xc4,0x1, 0xf0,0x0, 0xa9,0xf, 0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40, +0x3b,0xff,0xae,0x8e,0xf0,0x0, 0xc2,0x84,0xe7,0xfd,0x2, 0xee,0xe7,0xfe,0x0, 0x8e, +0xea,0x23,0x7e,0x0, 0xe0,0x6, 0x37,0xa1,0x3e,0x16,0x98,0x8c,0xe2,0xff,0xc8,0xff, +0x1, 0x5e,0xea,0x22,0x7c,0xec,0x9e,0x2e,0xe0,0xe, 0x35,0xa1,0x3c,0x96,0x3f,0x21, +0x95,0x89,0xe0,0x43,0x3f,0x1e,0x36,0x21,0xe2,0x0, 0xcf,0x0, 0x3e,0x2b,0xe0,0x43, +0x3e,0x1c,0x3d,0xee,0xe0,0x0, 0x4, 0x43,0xe2,0x0, 0xce,0x0, 0xe0,0x43,0x3d,0x9b, +0x3f,0x6c,0x4, 0x39,0xf0,0x40,0x39,0xfb,0xe0,0x43,0x3f,0x1e,0xe8,0x6b,0x3d,0x23, +0xf0,0x40,0x3a,0x7e,0xe8,0x0, 0xb5,0x85,0xe8,0x6e,0x3d,0x24,0xe8,0x0, 0xb7,0x15, +0xe7,0xff,0x0, 0xbb,0xe0,0x40,0x3e,0x61,0xe2,0x0, 0x7f,0x9c,0x3e,0x1f,0x8f,0x8c, +0xe2,0x1, 0xcf,0xff,0xe7,0xfe,0x1, 0x66,0x17,0xa, 0x3f,0x39,0x16,0x8a,0x3f,0x12, +0x3e,0xbf,0x96,0x1e,0x95,0x8e,0xaf,0xce,0xe8,0xe, 0x3e,0x97,0xe2,0x0, 0x7e,0x84, +0x3f,0x9d,0xb5,0x9e,0xc4,0x81,0xb6,0x2e,0xe2,0x1, 0xc4,0xff,0xf0,0x0, 0xab,0xf, +0x8f,0x84,0x3f,0xf9,0xe7,0xfe,0x2, 0xba,0xe7,0xfe,0x0, 0xd2,0xe0,0x2, 0x19,0x5e, +0xe7,0xfc,0x0, 0xb2,0xe8,0x40,0x3f,0x60,0x0, 0xc6,0xe8,0x40,0x3d,0xe0,0xe7,0xff, +0x0, 0xbd,0x3c,0xe6,0xe7,0xfd,0x0, 0xe2,0x3f,0xea,0xe7,0xfc,0x0, 0xc5,0xf0,0x1, +0x1a,0xe5,0xe7,0xfc,0x0, 0xe9,0x8, 0xb3,0x3f,0x83,0xef,0xfa,0xdf,0xa, 0x14,0x0, +0xef,0xfa,0xde,0xe6,0xef,0xfb,0xd2,0x56,0xef,0xfa,0xdf,0x46,0xef,0xfa,0xd8,0x96, +0xef,0xfa,0xd9,0xf2,0xef,0xfa,0xdf,0x71,0xea,0x23,0x7f,0x18,0x16,0x80,0xea,0x23, +0x7f,0x96,0xb6,0x8e,0xe0,0x13,0x17,0x44,0xb7,0xf, 0xef,0xfa,0xdf,0x20,0xe0,0x2, +0x19,0xe6,0xef,0xfb,0xd1,0x2a,0xef,0xfa,0xdf,0x40,0xef,0xfa,0xdf,0x93,0x17,0x83, +0xaf,0x83,0xef,0xfd,0xd8,0x6a,0xef,0xfa,0xdf,0xbc,0xef,0xfb,0xd2,0xe1,0xef,0xfb, +0xd1,0xda,0x3b,0x0, 0xe0,0x1, 0x19,0x42,0xef,0xfa,0xda,0x2a,0xe0,0xe, 0x8c,0xa2, +0xe0,0xe, 0x8c,0x12,0xe0,0x1, 0x15,0x78,0xe0,0x0, 0xdf,0xa0,0x87,0x83,0xe0,0x10, +0x8f,0x72,0xe2,0x0, 0xc7,0x81,0x3f,0x7f,0x1, 0x11,0xe0,0xe, 0x8d,0x82,0xe0,0xd, +0x8d,0x62,0xe0,0xd, 0x8c,0xf2,0xe0,0xd, 0x8c,0x52,0x16,0x18,0xe0,0x0, 0xdf,0xa6, +0xe0,0x3, 0x1f,0xb4,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xe0,0xd, 0x8d,0xf2,0xe0,0xd, +0x8d,0x52,0xe0,0xe, 0x8c,0x82,0xe0,0xd, 0x8c,0x62,0x16,0x18,0xe0,0x0, 0xdf,0x96, +0xe0,0x3, 0x1f,0xb4,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xea,0x23,0x7f,0x18,0xea,0x23, +0x7f,0x96,0x16,0x80,0xb6,0x8e,0xb4,0xf, 0x38,0x82,0xea,0x23,0x7f,0x18,0x97,0x8e, +0xea,0x23,0x7e,0x96,0xc7,0x81,0x9e,0x8d,0xe3,0xff,0xc7,0xff,0x3e,0xff,0xb7,0x8e, +0x2, 0x82,0x38,0x82,0xe7,0x5e,0x0, 0xe1,0xe0,0x2, 0x1f,0xdf,0xe0,0x2, 0x1e,0xde, +0x8f,0xf, 0xe2,0x0, 0xcf,0x1, 0x1, 0xd, 0xea,0x23,0x7f,0x32,0x16,0x0, 0xea,0x23, +0x7e,0xb3,0xeb,0xff,0x7f,0xd8,0xae,0xe, 0x17,0x1e,0xae,0xd, 0xaf,0xf, 0x38,0x82, +0xfa,0x23,0x7b,0x33,0xe8,0x0, 0x8f,0x86,0x2f,0x96,0xe0,0x19,0x9f,0x8d,0xe2,0x2, +0xcf,0x80,0xe0,0x6, 0x9f,0xbd,0xe0,0x1, 0x1, 0x17,0xe0,0x6, 0x9e,0x2d,0xea,0x23, +0x7d,0xb2,0x8f,0xb, 0xe2,0x0, 0xcf,0x1, 0x1, 0x36,0xea,0x23,0x7f,0x1c,0xb6,0xe, +0xb7,0x9e,0x38,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0xf, 0xea,0x23,0x7d,0xb2,0x8f,0x8b, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x69,0xea,0x23,0x7f,0x1c,0xe0,0x6, 0x9f,0xbd, +0xe0,0x6, 0x9e,0x2d,0x0, 0xed,0xe0,0x19,0x9f,0x8d,0xf0,0x6, 0x9a,0x3d,0xe2,0x2, +0xcf,0x81,0xf0,0x6, 0x99,0xad,0xe0,0x1, 0x1, 0x16,0xea,0x23,0x7d,0xb2,0x8f,0x8b, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x6d,0xf2,0xa, 0xca,0x50,0xe0,0x1, 0x2, 0xd9, +0xeb,0xff,0x7c,0x58,0x17,0x81,0xaf,0x8b,0x17,0x1d,0x17,0x9d,0xaf,0x88,0xf0,0x40, +0x3b,0xee,0x0, 0x8b,0xeb,0xff,0x7c,0x58,0xf0,0x0, 0x8b,0x88,0xf0,0x40,0x3a,0x6f, +0xe8,0x40,0x3f,0x67,0xf0,0x40,0x39,0xec,0xe0,0x1, 0x1f,0xd5,0xe0,0x0, 0x14,0xc0, +0x3f,0x9e,0xea,0x23,0x7f,0x1c,0x8f,0x8f,0x9d,0xe, 0xf0,0x0, 0x9a,0x9e,0x3c,0xaf, +0xe0,0xc, 0x3d,0x3f,0xf0,0x12,0x39,0xb9,0xe8,0xf, 0x3f,0xb5,0xe8,0x9, 0x3c,0xb4, +0xe8,0xc, 0x3e,0x12,0x3f,0x99,0x36,0x46,0x37,0xc6,0xe3,0xff,0xc6,0x7f,0xe3,0xff, +0xc7,0xff,0x14,0x80,0xe8,0x0, 0xac,0x86,0xe0,0x6, 0xb6,0x2d,0xe0,0x6, 0xb7,0xbd, +0xf0,0x0, 0x2b,0x86,0xf0,0x0, 0xab,0x8b,0xe7,0xff,0x0, 0x9b,0xf0,0xa, 0x39,0xaa, +0xe0,0x43,0x3d,0x1a,0xe4,0xb, 0x35,0xf, 0xe2,0xd, 0x3d,0xca,0x3e,0xab,0xe0,0x43, +0x3e,0x9d,0x15,0x82,0xe0,0x2d,0x3e,0x9b,0x2e,0x90,0xf8,0xd, 0x3a,0x25,0xe0,0x43, +0x3e,0x9d,0xe4,0xa, 0x36,0x8f,0xe2,0xd, 0x3d,0x4d,0x3e,0xaa,0xe0,0x43,0x3e,0x9d, +0xe0,0x2d,0x3e,0x9b,0xe7,0xfe,0x26,0xfd,0xf1,0xff,0xc3,0xff,0xf0,0x0, 0xab,0x88, +0xe7,0xfe,0x0, 0xf7,0xe7,0xf5,0x16,0x2f,0x3e,0x1f,0xe2,0x0, 0xce,0x4e,0xe0,0x6, +0x9e,0x2d,0xe7,0xfe,0x2, 0xe6,0xe7,0xff,0x15,0xaf,0x3d,0x9c,0xe2,0x4, 0xcd,0xa4, +0xe7,0xfe,0x2, 0xdf,0xea,0x23,0x7d,0xb2,0x8c,0x8b,0xea,0x23,0x7d,0x28,0xeb,0xff, +0x7c,0x58,0xe8,0x0, 0xaf,0x6, 0xe2,0x0, 0xcc,0x81,0x17,0x1e,0xb6,0xa, 0xb7,0x9a, +0xaf,0x8, 0xe7,0xfe,0x1, 0xd4,0xf0,0x40,0x39,0xec,0xf0,0x40,0x3a,0x6f,0xe7,0xfe, +0x0, 0xfd,0xe7,0xf5,0x17,0xaf,0xe8,0xf, 0x3f,0x94,0xe2,0x0, 0xcf,0xce,0xe7,0xfe, +0x2, 0xe6,0xea,0x23,0x7f,0xa8,0xf0,0x0, 0x9b,0x8f,0x9c,0x1f,0xf8,0xb, 0x39,0xa7, +0xe0,0x43,0x3d,0x9b,0xe4,0xe, 0x35,0x8f,0xf0,0xc, 0x3a,0x28,0xe0,0x43,0x3e,0x1c, +0xe2,0xf, 0x3f,0x4b,0xe4,0x9, 0x36,0xf, 0x3f,0xae,0xe0,0x43,0x3f,0x9f,0xe2,0xe, +0x3c,0xcc,0xe0,0x0, 0x15,0x63,0x3f,0x29,0xe0,0x29,0x3d,0x2f,0xe0,0x43,0x3f,0x1e, +0x24,0xaf,0xe0,0x2a,0x3d,0x2e,0x25,0x2c,0x3f,0x9e,0xe2,0x1, 0xcf,0x95,0x2, 0x28, +0x35,0x82,0x36,0x2, 0xe8,0xb, 0x3d,0x97,0x3e,0x18,0xf0,0x40,0x39,0xeb,0xf0,0x40, +0x3a,0x6c,0xf3,0xff,0xc1,0xff,0xf3,0xff,0xc2,0x7f,0xf0,0x6, 0xb1,0xad,0xf0,0x6, +0xb2,0x3d,0xe7,0xfe,0x0, 0xac,0xeb,0xff,0x7c,0x58,0xf0,0x0, 0x8b,0x88,0xf0,0x6, +0x99,0xad,0xe8,0x40,0x3f,0x67,0xf0,0x6, 0x9a,0x3d,0xe7,0xfe,0x0, 0xbf,0xea,0x23, +0x7f,0x1c,0xe8,0x40,0x3f,0xe4,0xe8,0x40,0x3e,0x63,0xe7,0xfd,0x0, 0xfa,0xea,0x23, +0x7d,0xb2,0xeb,0xff,0x7c,0x58,0x17,0x81,0xaf,0x8b,0xe7,0xfe,0x0, 0x9f,0xeb,0xff, +0x7c,0x58,0xe7,0xfe,0x0, 0x9b,0xf0,0x2, 0x1b,0x5e,0xe4,0x0, 0xc5,0xa, 0xf0,0x1, +0x1a,0xd7,0xf0,0xe, 0x3b,0x1a,0xf0,0xd, 0x8b,0x8e,0xe8,0x0, 0x8e,0x85,0xe0,0xd, +0x87,0xae,0xe8,0x40,0x3e,0xf7,0xe4,0xf, 0x37,0xac,0xe0,0xd, 0x8f,0x1e,0xe4,0xf, +0x37,0xc8,0x5, 0x9a,0xe0,0x2, 0x1e,0xcf,0xe0,0x2, 0x1d,0xa6,0x8e,0x8d,0x26,0xa2, +0xe0,0x0, 0x1e,0x4f,0xe8,0xe, 0x3d,0x97,0xe8,0xf, 0x3e,0x17,0x8f,0xe, 0x8f,0x8f, +0x16,0x8a,0xe8,0xd, 0x3e,0xb7,0xe8,0xd, 0x3e,0x96,0xe0,0x2, 0xc6,0xac,0x8e,0x8d, +0xe2,0x0, 0xce,0x81,0x1, 0x31,0xe8,0x2, 0x8e,0xe5,0xe2,0x1, 0xce,0xff,0x1, 0x87, +0xe8,0xa, 0x3d,0x16,0xe0,0xd, 0x8f,0xa, 0xe1,0x2e,0x3f,0xd, 0xaf,0x8, 0xaf,0x89, +0x38,0x82,0xe8,0xc, 0x3d,0x97,0x8e,0x8c,0x2e,0xa9,0xaf,0xc, 0xe0,0x0, 0x1e,0x4f, +0xe8,0x14,0x3e,0x17,0xe8,0x0, 0x8e,0x84,0x26,0xb9,0xe0,0x13,0x3f,0xad,0xf8,0x43, +0x39,0x13,0xf2,0x0, 0xc9,0x0, 0xf8,0x41,0x39,0x42,0xe8,0x73,0x3d,0x22,0xf2,0x0, +0xc9,0xa0,0x5, 0x30,0x3f,0xfd,0x5, 0xa6,0x17,0x90,0x3f,0x9d,0xe2,0x1, 0xc7,0xff, +0xe8,0x0, 0xaf,0x84,0x0, 0xc6,0x16,0x80,0xe8,0xb, 0x3d,0x97,0xe8,0xc, 0x3e,0x17, +0x17,0x80,0xae,0x8b,0x3f,0x6f,0xae,0x8c,0x0, 0xc7,0xe0,0x14,0x3f,0x2d,0xf8,0x43, +0x39,0x94,0xf2,0x0, 0xc9,0x80,0xf8,0x41,0x39,0xc3,0xe8,0x74,0x3d,0x23,0xf2,0x0, +0xca,0xf, 0x5, 0x13,0x3f,0x7d,0x5, 0x94,0x17,0x1, 0x3f,0x1d,0xe2,0x1, 0xc7,0x7f, +0x0, 0xc5,0x17,0xf0,0x3f,0x9d,0xe2,0x1, 0xc7,0xff,0xe8,0x0, 0xaf,0x84,0xe7,0xff, +0x0, 0xa1,0x3f,0xed,0xe7,0xff,0x0, 0x9e,0x3f,0x6d,0xe7,0xff,0x0, 0xb9,0x17,0x7f, +0x3f,0x1d,0xe2,0x1, 0xc7,0x7f,0xaf,0xc, 0xe7,0xff,0x0, 0xb2,0xe0,0x2, 0x1e,0xde, +0xe0,0x19,0x9f,0x8d,0xe2,0x0, 0xcf,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0xcc,0x8f,0xf, +0x27,0x1a,0xe0,0x0, 0x1f,0xc5,0xe0,0x2, 0x1e,0x58,0x94,0xf, 0x94,0x9f,0x95,0x2f, +0x95,0xbf,0x97,0xcf,0xe0,0x6, 0xb4,0x2d,0xe2,0x0, 0xcf,0x3, 0xb4,0x9c,0xb5,0x2c, +0xb5,0xbc,0xb7,0xcc,0x1, 0x27,0xe2,0x0, 0xcf,0x1, 0x1, 0x2, 0x17,0x2, 0xe0,0x2, +0x1f,0xd7,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xcb,0x87,0x8f,0xc7,0xff,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0xba,0x2, 0xda,0xe0,0x0, 0x1f,0xc5,0xe0,0x2, 0x1f,0x58, +0x94,0x8f,0x95,0x1f,0x95,0xaf,0x96,0x3f,0xe0,0x2, 0x1c,0x4c,0x97,0xcf,0xe0,0x6, +0xb4,0xad,0xf0,0x0, 0x13,0x83,0xf0,0x0, 0xab,0x88,0xb5,0x1e,0xb5,0xae,0xb6,0x3e, +0xb7,0xce,0x17,0x0, 0xe0,0x2, 0x1f,0xd7,0xaf,0xf, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x5c,0xe0,0x2, 0x18,0xc0,0xe0,0x1, 0x1e,0xda,0x17,0x80,0xe0,0xa, +0x8f,0x1, 0x6f,0xa6,0x7c,0x8, 0x6f,0xa7,0xaf,0x9d,0xe0,0x4, 0x27,0x5a,0xe0,0x2, +0x1a,0xdc,0xf0,0x2, 0x1f,0x5e,0x7a,0x86,0xef,0xfc,0xd3,0xb8,0xe0,0x1, 0x1b,0xd7, +0xdf,0x9e,0x8a,0x7, 0xe0,0x0, 0x22,0x4a,0xf0,0x1, 0x1e,0x8e,0xfa,0x23,0x7c,0x38, +0xe8,0x0, 0x8c,0x8d,0xe0,0x2, 0x1e,0x5e,0xe0,0x2, 0x18,0xd7,0x16,0x80,0x0, 0x87, +0xc6,0x81,0x3f,0xed,0xe2,0x1, 0xc7,0xff,0x3f,0xf4,0x3, 0xbb,0xe0,0xd, 0x8f,0x8c, +0x15,0x8a,0x3f,0xf9,0xc6,0xa, 0x3d,0xbf,0x3, 0xf4,0xe0,0xa, 0x3d,0x91,0x8f,0xa, +0xe2,0x0, 0xcf,0x1, 0x1, 0xee,0xf0,0x2, 0x3c,0x1f,0x8f,0x2, 0x2f,0x6a,0xe0,0x1, +0x87,0xa, 0xc7,0x7f,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x3a,0x2, 0xe2,0xea,0x23, +0x7e,0x34,0xe4,0x0, 0xc6,0x8a,0x14,0x83,0xac,0x82,0xe0,0x0, 0xc6,0xe4,0xaf,0x8c, +0xe8,0xd, 0x3e,0x9e,0xe0,0x0, 0x1e,0x45,0x3d,0x9c,0x94,0x9b,0x91,0xb, 0x90,0xab, +0x94,0x3b,0x96,0x4b,0xb4,0x9d,0x14,0x83,0xb1,0xd, 0xb0,0xad,0xb4,0x3d,0xb6,0x4d, +0x16,0x80,0xae,0x8a,0xe0,0x6, 0x0, 0xcd,0xfa,0x23,0x7c,0x38,0xf0,0x1, 0x1e,0x8e, +0xea,0x23,0x7f,0xb4,0x8f,0x8f,0xf0,0xd, 0x3c,0x1f,0x8c,0x8d,0xe0,0x6, 0x2c,0x98, +0xe0,0x2, 0x1e,0xd5,0xe0,0x2, 0x1f,0x54,0x8f,0x8d,0x7e,0x87,0x7f,0x5, 0xe0,0x4, +0x27,0x86,0xe0,0x2, 0x1e,0x4c,0x89,0xc, 0x7e,0x3, 0xe0,0x4, 0x29,0xe, 0xe0,0x0, +0x1f,0x1b,0xf0,0x0, 0x1c,0x98,0x8f,0x8e,0x15,0x3e,0xe2,0x0, 0xcf,0x80,0xe0,0x1, +0x1f,0xda,0xe0,0x1, 0x14,0xff,0xe0,0x79,0x39,0x2f,0xe8,0x40,0x3c,0x69,0xf0,0x0, +0x7c,0x82,0xe0,0x1, 0xd3,0x11,0xe0,0x4, 0x22,0x65,0x12,0x0, 0xf0,0x2, 0x1c,0xd7, +0xf0,0x0, 0x1d,0x17,0xf0,0x0, 0x7c,0x4, 0xf0,0x40,0x3e,0x64,0xf8,0x40,0x3c,0x6d, +0x39,0xe4,0x39,0x64,0xf8,0x40,0x3e,0xee,0xf0,0x0, 0x17,0xa, 0xf0,0x1e,0x3f,0x33, +0xe8,0x0, 0x8e,0x8, 0xf8,0xe, 0x3e,0x9e,0xe0,0xd, 0x8d,0xe, 0x3d,0x7c,0xe0,0x1, +0x3, 0x90,0x17,0x8f,0xe0,0x6, 0x35,0x22,0x3f,0xda,0xe4,0x0, 0xc7,0x8a,0xf0,0xd, +0x3d,0x16,0x8c,0xbd,0xe8,0xf, 0x3f,0x99,0x8a,0x8f,0x24,0xb8,0xe0,0x6, 0x9c,0x2e, +0x2c,0x4, 0xe0,0x6, 0x9f,0xbe,0x27,0xb2,0xe2,0x0, 0xcc,0x84,0x10,0xb8,0x2, 0x8d, +0x10,0xb0,0x1, 0xb, 0xe2,0x0, 0xcc,0x83,0x10,0xa0,0x1, 0x7, 0xe2,0x0, 0xcc,0x82, +0x10,0x98,0x17,0x90,0xe0,0x61,0x39,0xaf,0x26,0x1d,0xf0,0x2, 0x1b,0x98,0xe8,0x0, +0x87,0xc7,0xe2,0x0, 0xc7,0x8f,0x3f,0xfa,0xe0,0x2, 0x1, 0x6d,0xe0,0x2, 0x1e,0x98, +0x17,0x81,0x0, 0x89,0xe0,0x1, 0x87,0x6d,0xc6,0x8a,0xe2,0x0, 0xc7,0xf, 0x3f,0x7a, +0xe0,0x2, 0x1, 0x62,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0x3d,0xef,0xc7,0x81, +0x2, 0xf2,0xf0,0xf, 0x3d,0x16,0xc4,0xff,0xac,0xbf,0x17,0xa, 0x3f,0x3a,0xf0,0xf, +0x3c,0x9e,0x8e,0x8f,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1, 0x2, 0xe0,0x1, 0x2a,0x8c, +0x66,0x84,0x3e,0x9a,0x8e,0x8d,0xe0,0x1, 0x2e,0xdf,0x62,0x83,0x8e,0x85,0xe0,0x1, +0x2e,0xdb,0xf8,0xd, 0x3e,0x9e,0xe0,0x6, 0x9e,0xad,0xe2,0x0, 0xce,0x9e,0xe0,0x3, +0x2, 0x96,0xf8,0x9, 0x3e,0x9e,0xe0,0x6, 0x9e,0x39,0xe2,0x0, 0xce,0x13,0xe0,0x3, +0x5, 0x9b,0xe0,0x1, 0x18,0xaf,0xe0,0x1, 0x1a,0xae,0x8c,0x1, 0x8d,0x85,0x34,0x28, +0x3d,0xc8,0xc5,0xed,0x3d,0xfc,0xe0,0x3, 0x5, 0xf, 0xe0,0x2, 0x1d,0xfd,0xe0,0xd, +0x8c,0x39,0x8d,0xdb,0xe0,0xd, 0x8c,0xc9,0x3d,0xb8,0xe0,0x1, 0x18,0xf2,0x3d,0x99, +0xa0,0x81,0x35,0xa1,0x3d,0x91,0x95,0x8b,0xe2,0x1, 0xcd,0xc7,0xe0,0x6, 0x2, 0x4f, +0xe2,0x0, 0xce,0x9e,0xe0,0x6, 0x2, 0xbe,0x17,0x3, 0xaf,0xf, 0xaf,0x1f,0xc1,0x81, +0x8f,0x87,0xe2,0x1, 0xc1,0xff,0x3f,0xf3,0xe7,0xfe,0x2, 0xe0,0xe0,0x2, 0x1f,0x40, +0xe0,0x2, 0x1e,0x4a,0xe0,0xa, 0x8f,0x8e,0xf0,0x0, 0x63,0x82,0x86,0xc, 0xe2,0x0, +0xcf,0x81,0xe8,0x0, 0xa9,0x17,0xf8,0x40,0x3e,0xe8,0xe8,0x0, 0xae,0x7, 0xe0,0x4, +0x1, 0x71,0xe0,0x3, 0x22,0x2d,0x62,0x88,0x11,0x1, 0xe0,0x5, 0x2a,0xaa,0x66,0x5, +0x8f,0x8c,0xe0,0x2, 0x2f,0xaf,0xe8,0x0, 0x89,0x8d,0x67,0x7, 0xe4,0x0, 0xc1,0x8a, +0xf0,0x0, 0x63,0x85,0x62,0x86,0xe0,0x2, 0x1c,0xd8,0xe0,0x2, 0x1c,0x18,0x17,0x80, +0x3d,0x63,0xaf,0x8e,0xe8,0x0, 0xaf,0x87,0xaf,0x85,0xe0,0x1, 0xd1,0xf3,0xe0,0x3, +0x22,0x33,0x3c,0x62,0xc0,0x24,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x66,0x84,0x3e,0x9a, +0x8e,0x8d,0x2e,0x87,0xf0,0x0, 0x63,0x83,0xe8,0x0, 0x8e,0x87,0xe0,0x2, 0x26,0x93, +0xe0,0x0, 0x22,0xda,0xe2,0x0, 0xca,0x83,0xe7,0xff,0x1, 0x33,0xe2,0x0, 0xca,0x81, +0xf8,0xf, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2f,0xf0,0x6, 0x9d,0xbf,0xe0,0x1, 0x1, 0x18, +0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63,0x3c,0x90,0x3c,0x10,0x7f,0x81,0xdd,0x84, +0x67,0x81,0xf2,0x1f,0xc5,0xff,0xe0,0xd, 0x8f,0x8f,0xe2,0x1f,0xc3,0x7f,0xe0,0xe, +0x37,0xac,0xe2,0x1, 0xcf,0xff,0xf0,0x1b,0x3d,0x9e,0xf3,0xff,0xc5,0xff,0xe0,0x0, +0x1, 0x79,0xe4,0x5, 0x32,0xae,0xe4,0x5, 0x32,0xc0,0xf0,0x0, 0x13,0x81,0xf0,0x17, +0x3b,0x92,0xe8,0x40,0x39,0x67,0xe2,0x1, 0xc1,0x7f,0xc2,0x1, 0x3b,0x15,0xe2,0x1, +0xc2,0x7f,0xe3,0xff,0xc3,0x7f,0x17,0x86,0xe8,0xf, 0x3f,0xbc,0x66,0x82,0xf0,0xe, +0x35,0xc8,0x3f,0x9d,0xaf,0x4f,0xe0,0xd, 0x33,0x48,0x47,0x26,0xae,0xaf,0xc1,0x81, +0xaf,0x6f,0xe2,0x1, 0xc1,0xff,0x47,0x27,0xab,0x3f,0xf0,0x0, 0xc6,0x1, 0xf0,0x0, +0xad,0xdf,0xf2,0x1, 0xc6,0x7f,0xaf,0x7f,0x8f,0x87,0x3f,0xf3,0xe7,0xfd,0x2, 0xc6, +0xe7,0xfe,0x0, 0xe6,0xf8,0xf, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2f,0xf0,0x6, 0x9d,0xbf, +0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63,0x3c,0x90,0x3c,0x10,0xdd,0x35,0xf8,0x1e, +0x3f,0x1d,0xe8,0xd, 0x8f,0x8e,0xf2,0x1f,0xc5,0xff,0xe0,0xe, 0x37,0xac,0xe2,0x1, +0xcf,0xff,0xf0,0x1b,0x3d,0x9e,0xe2,0x1f,0xc3,0x7f,0xf3,0xff,0xc5,0xff,0x1, 0x29, +0x12,0x80,0xe7,0xff,0x0, 0xb4,0x15,0x80,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1e,0x18, +0x3d,0x9c,0x9b,0xb, 0xf0,0x0, 0x9d,0x9b,0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63, +0x3c,0x90,0x3c,0x10,0xef,0xff,0xdd,0x11,0xf8,0x1e,0x3f,0x1d,0xe8,0xd, 0x8f,0x8e, +0xf2,0x1f,0xc5,0xff,0xe0,0xe, 0x37,0xac,0xe2,0x1, 0xcf,0xff,0xf0,0x1b,0x3d,0x9e, +0xe2,0x1f,0xc3,0x7f,0xf3,0xff,0xc5,0xff,0xe0,0x80,0x12,0x80,0xe7,0xff,0x1, 0x97, +0xe1,0x80,0xc3,0x0, 0xe3,0xff,0xc3,0x7f,0xe7,0xff,0x0, 0x97,0x26,0x5e,0xe0,0x2, +0x1c,0x98,0x87,0xc9,0xe2,0x0, 0xc7,0x8f,0x3d,0x7f,0x1, 0x4e,0xe0,0x2, 0x1e,0x98, +0x3f,0xe5,0x0, 0x88,0xe0,0x1, 0x87,0x6d,0xc6,0x8a,0xe2,0x0, 0xc7,0xf, 0x3f,0x7a, +0x1, 0x44,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0x3d,0xef,0xc7,0x81,0x2, 0xf3, +0x0, 0xc4,0x15,0x80,0xe0,0x2, 0x1f,0x18,0xe4,0x0, 0xc5,0x8a,0xf8,0xd, 0x3e,0x9e, +0x3d,0x9e,0xf0,0x6, 0x9a,0xbd,0x9f,0xb, 0x9f,0x9b,0xe0,0x0, 0x15,0xc0,0x3d,0xa1, +0x3c,0x3b,0x3f,0x31,0x3f,0xb1,0xe8,0xb, 0x3d,0xb5,0x3f,0x18,0x3f,0x9b,0x37,0x46, +0x37,0xc6,0xe0,0x6, 0xb7,0x2d,0xe0,0x6, 0xb7,0xbd,0xe7,0xfd,0x0, 0x8c,0xe0,0x2, +0x1f,0x4a,0xf0,0x2, 0x1f,0x5e,0x8f,0x8e,0xe0,0x1, 0x27,0xca,0xe0,0x2, 0x1e,0xdc, +0x17,0x81,0x7e,0x86,0xaf,0x8d,0x16,0xb7,0xe0,0x0, 0x1f,0x8d,0xe0,0x1a,0x9f,0xdf, +0xe1,0x2f,0x3f,0x9d,0xaf,0x8e,0xe7,0xfb,0x0, 0x99,0x62,0x85,0x8f,0x85,0xe7,0xfb, +0x2f,0xfa,0x66,0x6, 0x8c,0x8c,0xe7,0xfb,0x2c,0xf6,0xe0,0x2, 0x1a,0xcc,0x89,0x5, +0x7a,0x83,0xe0,0x4, 0x21,0x7e,0x66,0x83,0xc1,0x7f,0xa9,0xd, 0xe7,0xfb,0x0, 0xf1, +0x66,0x83,0x8f,0x8d,0xe7,0xfd,0x2f,0xd1,0xe0,0x2, 0x1c,0x57,0xd8,0x5a,0xe7,0xfd, +0x0, 0xcc,0xf0,0xb, 0x3d,0x16,0xae,0xbb,0xe0,0x2, 0x1d,0xef,0xe0,0x1, 0xae,0x8f, +0xae,0x8b,0xe7,0xfd,0x2a,0xe9,0xe7,0xfc,0x0, 0xe2,0xe0,0x1, 0x1c,0xb1,0xf0,0x1, +0x1b,0xb0,0x8d,0x89,0xe8,0x0, 0x8e,0x7, 0x35,0xa8,0x3e,0x4b,0xc6,0x62,0x3e,0xfc, +0xe7,0xfc,0x3, 0x61,0xe0,0x1, 0x8d,0x8f,0xe0,0x1, 0x25,0x87,0xe0,0x2, 0x1e,0x6f, +0x8e,0xc, 0xe0,0x1, 0x2e,0x2, 0xe0,0x0, 0x1c,0xc5,0xe0,0xc, 0x3c,0x9e,0x9d,0x8c, +0x9c,0x1c,0x2d,0x82,0x24,0x2b,0xf8,0x1, 0x3e,0x9e,0xe0,0x6, 0x9e,0x31,0xe0,0xb, +0x3e,0xab,0xe0,0xd, 0x3e,0x28,0xe4,0x8, 0x36,0x8f,0xe4,0xc, 0x35,0x8f,0xe2,0xd, +0x3c,0x4d,0xe2,0xb, 0x3e,0x4b,0x3e,0xa8,0xe0,0xc, 0x3d,0xac,0x3e,0x9c,0xe2,0x2, +0xce,0xac,0x2, 0x14,0x3f,0x19,0x94,0xe, 0x94,0x9e,0x95,0xae,0x96,0x3e,0x96,0xce, +0xe0,0x0, 0x17,0x64,0xe0,0x6, 0xb4,0x21,0x3f,0x11,0xf0,0x8, 0x3d,0x16,0x10,0x85, +0xa8,0xb8,0xb4,0x9e,0xb5,0xae,0xb6,0x3e,0xb6,0xce,0x17,0x3c,0xe0,0x1, 0xaf,0xf, +0xf8,0xe, 0x3e,0x9e,0xe0,0xd, 0x8c,0x3e,0xe0,0xd, 0x8c,0xce,0xe0,0x0, 0x0, 0xd1, +0xf0,0x2, 0x1b,0xc0,0xe0,0x2, 0x1e,0xca,0xe8,0xa, 0x8f,0x87,0x62,0x82,0x86,0x8d, +0xe2,0x0, 0xcf,0x81,0xaa,0x15,0xae,0x85,0xe0,0x1, 0x1, 0x44,0xf0,0x0, 0x63,0x86, +0xe8,0x0, 0x8f,0x87,0xe0,0x1, 0x2f,0xf8,0xf0,0x0, 0x63,0x85,0xe8,0x0, 0x89,0x7, +0xe0,0x2, 0x21,0x3a,0x62,0x83,0x89,0x5, 0xe0,0x4, 0x21,0x15,0xe8,0x0, 0x89,0x8d, +0x66,0x87,0xe4,0x0, 0xc1,0x8a,0x67,0x5, 0xf0,0x0, 0x63,0x86,0xe0,0x2, 0x1c,0xd8, +0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xaf,0x8d,0x39,0x6f,0xaf,0x8e,0xe8,0x0, 0xaf,0x87, +0xe0,0x1, 0xd0,0x40,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xe0,0x1, 0x14,0xff,0xe0,0x1, +0xd0,0x73,0x3c,0x62,0xc0,0x24,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1e,0x5c, +0x7e,0x6, 0xe7,0xfe,0x0, 0xba,0xf8,0xc, 0x3e,0x9e,0xe0,0x6, 0x9c,0xbc,0xe2,0x0, +0xcc,0xbc,0xe0,0x1, 0x5, 0x9c,0xe0,0xd, 0x8c,0x3c,0xe0,0xd, 0x8c,0xcc,0x7f,0x81, +0xef,0xfc,0xd0,0x8e,0xe0,0x2, 0x1e,0x8b,0xe2,0x0, 0xcc,0x1, 0xac,0xd, 0x67,0x81, +0xe0,0x3, 0x1, 0x0, 0xf8,0xd, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2d,0xe2,0x0, 0xcb,0x1e, +0xe0,0x1, 0x5, 0xc5,0xe0,0x1, 0x1d,0xb1,0xf0,0x1, 0x1b,0xb0,0x8e,0xb, 0xe8,0x0, +0x8f,0x7, 0x36,0x28,0x3f,0x4c,0xc7,0x62,0x3b,0x7e,0xf0,0x6, 0x9d,0xbd,0xe0,0x2, +0x4, 0x7f,0xf2,0x0, 0xcd,0x94,0x5, 0x94,0xe0,0x1, 0x1f,0x2f,0xf0,0x1, 0x1b,0xae, +0x8e,0x8e,0xe8,0x0, 0x8f,0x7, 0x36,0xa8,0x3f,0x4d,0x16,0xec,0x3e,0x9e,0xf0,0x2d, +0x3d,0xad,0xe7,0xfc,0x26,0xef,0xe9,0x2e,0x3f,0x2b,0xe7,0xfc,0x27,0x6b,0x8f,0x6f, +0xe7,0xfc,0x2f,0x68,0x17,0x2, 0xaf,0x6f,0xe7,0xfc,0x0, 0xe4,0xe2,0x0, 0xcc,0x83, +0xe0,0x3, 0x1, 0x6b,0x22,0x1a,0xe8,0xd, 0x8e,0x8e,0xe2,0x1, 0xce,0xff,0xe0,0x3, +0x1, 0x3e,0xe0,0x2, 0x1e,0x5e,0x16,0x81,0x0, 0x89,0xe0,0xe, 0x8d,0xac,0xc6,0xa, +0xe2,0x1, 0xcd,0xff,0xe0,0x1, 0x1, 0x11,0x3e,0xee,0x3f,0x6d,0xe2,0x1, 0xc7,0x7f, +0x3f,0x74,0x17,0x1, 0x3f,0x1d,0x4, 0xf2,0xe2,0x0, 0xcc,0x81,0x15,0x8a,0x3d,0xbf, +0xe0,0x1, 0x1, 0x1c,0xe0,0x2, 0x1e,0xd7,0x3d,0x9d,0x16,0x82,0xae,0x8b,0xe0,0x2, +0x1a,0xd5,0x8e,0x85,0x7a,0x87,0xe0,0x2, 0x2e,0x98,0xe0,0x2, 0x1f,0x54,0x8e,0x8e, +0x7f,0x5, 0x26,0x9c,0xe7,0xf9,0x24,0xbf,0xe0,0x2, 0x1e,0x4c,0xe8,0xf, 0x3f,0x98, +0xc4,0xff,0x89,0xc, 0xac,0x8f,0x7e,0x3, 0xe7,0xf9,0x21,0x3b,0xe7,0xfd,0x0, 0xc5, +0x62,0x86,0x89,0x5, 0xe2,0x0, 0xc9,0x1, 0xe0,0x1, 0x1, 0x11,0x66,0x5, 0x11,0x0, +0x8f,0x8c,0xe7,0xfb,0x27,0x92,0xe7,0xfd,0x0, 0xbd,0xf0,0x0, 0x63,0x86,0xe8,0x0, +0x8e,0x87,0x2e,0xe1,0x2c,0xe2,0xe7,0xfd,0x0, 0xaa,0xe0,0x1, 0x18,0xb1,0xe0,0x1, +0x1a,0xb0,0x8c,0x1, 0x8c,0x85,0x34,0x28,0x3c,0xc8,0x3e,0xf9,0xe7,0xfe,0x2, 0x5d, +0xe0,0x0, 0x1c,0xac,0x8e,0x89,0xe2,0x0, 0xce,0x81,0xe7,0xfe,0x1, 0xd6,0xe0,0x2, +0x25,0xe2,0xe2,0x0, 0xcd,0xbb,0x2, 0x84,0xc5,0x81,0xe0,0x1, 0xad,0x8f,0x17,0x3, +0xaf,0xf, 0xaf,0x1f,0x17,0x80,0xaf,0x89,0x17,0x1, 0xe0,0x2, 0x1f,0xef,0xaf,0xf, +0xe7,0xfa,0x0, 0xbf,0x62,0x88,0x12,0x0, 0x11,0x1, 0xe7,0xfa,0x22,0xda,0xe0,0x0, +0x1c,0x9b,0x16,0x80,0x8f,0x89,0xe0,0x2f,0x3f,0x8d,0xaf,0x89,0xef,0xfa,0xd8,0x10, +0xe0,0x1, 0x1f,0xdc,0x16,0x7b,0xa6,0x8f,0xa7,0xcd,0x3f,0xdc,0xbf,0xcd,0x66,0x5, +0x8f,0x8c,0xe7,0xfa,0x27,0xca,0xe7,0xfc,0x0, 0xf5,0xf0,0x6, 0x9d,0xbd,0xf2,0x0, +0xcd,0x94,0xe7,0xfe,0x5, 0xde,0xe0,0x1, 0x18,0xaf,0xe0,0x1, 0x1a,0xae,0x8e,0x81, +0x8f,0x5, 0xe7,0xfe,0x0, 0xca,0xe4,0x0, 0xc6,0x8a,0xe0,0x0, 0xc6,0xe4,0x15,0x8a, +0x3d,0xbf,0xe0,0x0, 0x1e,0x45,0xe8,0xd, 0x3e,0x9e,0x3e,0x1b,0x91,0xc, 0x90,0x9c, +0x94,0x2c,0x95,0x3c,0x96,0x4c,0xe2,0x0, 0xcc,0x81,0xb1,0xd, 0xb0,0x9d,0xb4,0x2d, +0xb5,0x3d,0xb6,0x4d,0xe7,0xfe,0x1, 0xe8,0xe0,0x2, 0x1e,0xd7,0x3d,0x9d,0xac,0x8b, +0xe7,0xfe,0x0, 0xe7,0xe8,0x0, 0x89,0x8d,0x66,0x7, 0xe4,0x0, 0xc1,0x8a,0x66,0x85, +0x67,0x6, 0xe0,0x2, 0x1c,0xd8,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xa9,0xc, 0xa9,0xd, +0xa9,0xe, 0xe0,0x0, 0xdf,0xf, 0xe7,0xfd,0x0, 0xcf,0xe0,0x2, 0x1f,0x96,0x14,0x85, +0x66,0x8, 0xac,0x8f,0xe7,0xf9,0x26,0x7d,0xef,0xfa,0xd7,0xba,0xe0,0x0, 0x1e,0x9b, +0x16,0x0, 0x8f,0x8d,0xe0,0x1, 0x1e,0xdc,0xe0,0x0, 0x1f,0x1b,0xe0,0x2f,0x3f,0x8c, +0xa6,0x8d,0xaf,0x8e,0x16,0x7b,0xa7,0xcd,0x3f,0xdc,0xbf,0xcd,0xe7,0xf9,0x0, 0xe9, +0xe0,0x1, 0x1d,0xb1,0xf0,0x1, 0x1b,0xb0,0x88,0x8b,0xe8,0x0, 0x8d,0x87,0x30,0xa8, +0x3d,0xc1,0xc5,0xe2,0x3e,0xfb,0xe7,0xf9,0x3, 0x39,0xe0,0x1, 0x8d,0x8f,0xe0,0x0, +0x25,0xe5,0xe0,0x0, 0x18,0xc5,0x38,0x9e,0xf0,0x0, 0x92,0x81,0xf0,0x0, 0x9a,0x11, +0xe8,0x40,0x3a,0xe5,0xe3,0xff,0xc2,0xff,0xe0,0xe, 0x3e,0xa5,0xe8,0xc, 0x3e,0x24, +0xe4,0xb, 0x37,0xf, 0xe4,0x13,0x36,0xf, 0xe2,0xe, 0x3d,0xce,0xf2,0xc, 0x39,0xcc, +0xe0,0xb, 0x3f,0x2b,0xe8,0xe, 0x3e,0x23,0x3f,0x1b,0xe2,0x0, 0xcf,0x31,0xe0,0x1, +0x2, 0x5, 0xe2,0x0, 0xce,0x9e,0x5, 0x8d,0xe0,0x1, 0x18,0xb1,0xe0,0x1, 0x1a,0xb0, +0x8e,0x1, 0x8f,0x5, 0x36,0x28,0x3f,0x4c,0xc7,0x62,0x3e,0xfe,0xe7,0xfd,0x4, 0x11, +0x7f,0x81,0xef,0xfb,0xdf,0x1d,0xe2,0x0, 0xcc,0x1, 0x67,0x81,0xe0,0x1, 0x1, 0x30, +0xe0,0x1, 0x8f,0xf, 0xe2,0x0, 0xcf,0x3b,0xe7,0xf8,0x2, 0xf8,0xc7,0x1, 0xe0,0x1, +0xaf,0xf, 0xe7,0xf8,0x0, 0xf3,0xe0,0x2, 0x1e,0x54,0x7e,0x5, 0xe7,0xfd,0x0, 0xee, +0xe8,0x6, 0x3b,0x1a,0x16,0x80,0x8f,0x6f,0xae,0xb6,0x27,0x15,0xe2,0x0, 0xcf,0x1, +0xe7,0xfa,0x2, 0x8a,0x16,0xbc,0xe0,0x2, 0x1c,0xbe,0x17,0x3, 0xe0,0x1, 0xae,0x8f, +0x16,0x81,0xae,0x89,0xaf,0xf, 0xaf,0x1f,0xe7,0xf8,0x0, 0xdb,0xf7,0xfd,0x2d,0x99, +0xe7,0xfa,0x0, 0x80,0xac,0x6f,0x0, 0xef,0xe0,0x0, 0x16,0xe4,0xe8,0xd, 0x3e,0x9e, +0xe8,0xd, 0x3e,0x9d,0x94,0xd, 0x94,0x9d,0x95,0x2d,0x95,0xbd,0x96,0x4d,0xe0,0x0, +0x1e,0xc5,0x3f,0x1d,0xb4,0xe, 0x16,0x83,0xb4,0x9e,0xb5,0x2e,0xb5,0xbe,0xb6,0x4e, +0x17,0x1, 0xe0,0x1, 0xaf,0xf, 0xae,0x8f,0xae,0x9f,0xe7,0xf8,0x0, 0xba,0xe0,0x2, +0x1c,0x57,0xef,0xff,0xd5,0xe7,0x16,0x8a,0xe8,0xd, 0x3e,0x98,0x3f,0xe2,0xe9,0x80, +0xaf,0x98,0xe8,0x40,0x3e,0xf8,0x1, 0xfc,0x66,0x8, 0x26,0x7, 0xe0,0x1, 0x1f,0xdc, +0xa6,0x8f,0xa7,0xcd,0xcf,0x84,0xbf,0xcd,0xe8,0x0, 0x89,0x8d,0xe0,0x2, 0x1c,0xd8, +0xe4,0x0, 0xc1,0x8a,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xe0,0x0, 0xde,0x43,0xe7,0xfc, +0x0, 0x83,0x3a,0x62,0xe7,0xfa,0x0, 0xea,0xe2,0x0, 0xce,0x9e,0xe0,0x0, 0x2, 0xce, +0xe8,0x5, 0x3a,0xc4,0xe7,0xfb,0x22,0xbb,0xe2,0x2, 0xcf,0x2c,0xe7,0xfb,0x2, 0x37, +0xf8,0xd, 0x3e,0x9e,0x94,0x11,0x94,0xa1,0x95,0xb1,0x96,0x41,0xe0,0x0, 0x17,0x64, +0x3f,0x1d,0xf0,0x6, 0xb2,0xad,0x10,0x85,0xf0,0xd, 0x3d,0x16,0xa8,0xbd,0xb4,0x1e, +0xb4,0xae,0xb5,0xbe,0xb6,0x4e,0xe7,0xfb,0x0, 0xa2,0xe0,0x0, 0x16,0xe4,0xe7,0xfd, +0x0, 0xe0,0xe0,0x0, 0x16,0x64,0xe8,0xc, 0x3e,0x1e,0xe8,0xc, 0x3e,0x1d,0x90,0x8c, +0x94,0x1c,0x94,0xac,0x95,0x3c,0x95,0xcc,0xe0,0x0, 0x1e,0x45,0xe0,0x1, 0xae,0x8f, +0x3f,0x1c,0xb0,0x8e,0x16,0x3, 0xb4,0x1e,0xb4,0xae,0xb5,0x3e,0xb5,0xce,0xe0,0x2, +0x1f,0x6f,0xae,0xf, 0xae,0x8e,0xae,0x1f,0xe7,0xf7,0x0, 0xd3,0x17,0x3c,0xe0,0x1, +0xaf,0xf, 0xe7,0xf7,0x0, 0xcb,0x15,0x8a,0x3d,0xbf,0xe0,0x2, 0x1d,0x57,0xe0,0x0, +0x16,0xe4,0x3d,0x1b,0xe7,0xf5,0x0, 0xd6,0xe0,0x1, 0x1e,0x31,0xf0,0x1, 0x1b,0xb0, +0x8d,0x8c,0xe8,0x0, 0x8e,0x7, 0x35,0xa8,0x3e,0x4b,0xc6,0x62,0x3e,0xfc,0xe7,0xff, +0x3, 0x29,0xe7,0xfb,0x0, 0xbe,0x14,0x1, 0xe7,0xf4,0x0, 0xf2,0x8, 0xb3,0xe0,0x3, +0x1f,0xb8,0x17,0x1, 0xa1,0xf, 0x16,0xfe,0xe0,0x1, 0xa7,0xe2,0x3f,0x58,0x3f,0xdd, +0x3f,0xce,0xe0,0x1, 0xbf,0xe2,0x2c,0x21,0xe0,0x2, 0x19,0xc8,0x17,0x3, 0x8f,0x83, +0x3f,0x3f,0xe0,0x2, 0x1f,0xc4,0x3f,0x9e,0x8c,0xf, 0xd4,0xa9,0xe0,0x2, 0xa7,0xd2, +0x17,0x43,0x3f,0xde,0xcf,0x9c,0xe0,0x2, 0xbf,0xd2,0x8e,0x83,0x8f,0x83,0xe0,0x3, +0x1f,0x30,0xe4,0x0, 0xc6,0x85,0xe4,0x0, 0xc7,0x85,0x3f,0x9e,0x3f,0x1d,0x8c,0xcf, +0x8c,0x3e,0x9, 0xa1,0xe0,0x5, 0x0, 0xee,0x14,0x28,0xd4,0x91,0xe0,0x2, 0xa7,0xd2, +0xe0,0x2, 0x1f,0x48,0xcf,0xbc,0xe0,0x2, 0xbf,0xd2,0x8e,0x8e,0x8f,0x8e,0xe0,0x3, +0x1f,0x30,0xe4,0x0, 0xc7,0x85,0xe4,0x0, 0xc6,0x85,0x3f,0x9e,0x84,0xcf,0x3f,0x1d, +0xc4,0xfc,0x8c,0x3e,0xe2,0x1, 0xc4,0xff,0x9, 0xa1,0xe0,0x5, 0x0, 0xd3,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x64,0xe0,0x2, 0x1f,0x66,0xe0,0x2, 0x1f,0xfd, +0x87,0xe, 0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, 0x3e,0xfe,0xe0,0x4, 0x1, 0x7f, +0x8d,0x8f,0x89,0xaf,0x7d,0x85,0x3e,0x6b,0xe0,0x2, 0x1d,0xf9,0x99,0x5f,0x8f,0x1f, +0x8f,0xbf,0x3e,0xe3,0x7d,0x83,0x3d,0x6e,0x3d,0xec,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, +0xc5,0xff,0x3d,0x7b,0x3, 0x82,0x3f,0x6c,0xf0,0x40,0x3d,0xee,0x3e,0x6f,0x3f,0x6d, +0xe2,0x1, 0xc6,0x7f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0xf2,0x1, 0xc5,0xff,0x3, 0x82, +0x3f,0xed,0xe0,0x0, 0x1f,0x43,0x15,0x80,0xf0,0x1, 0x1f,0x5e,0xb5,0x8e,0xe2,0x1, +0xc7,0xff,0xe0,0x2, 0x1f,0x46,0xe0,0x1, 0x1d,0xdd,0x7f,0x82,0xf8,0x40,0x3e,0x6e, +0xe0,0x1f,0x17,0xff,0xe8,0x80,0xb7,0x9c,0xf0,0x40,0x3e,0x7b,0xe0,0x80,0xb7,0x9e, +0x1, 0xfa,0x14,0x1, 0xef,0xf9,0xd9,0x90,0xef,0xfa,0xdc,0x30,0xef,0xf9,0xd6,0x90, +0xe0,0x2, 0x1e,0xc8,0x17,0x5, 0x8f,0x8d,0xf8,0x40,0x3c,0xeb,0x3f,0x3f,0xe0,0x3, +0x1f,0xb0,0x3f,0x9e,0x8f,0xbf,0xe0,0x0, 0x1f,0x44,0xe4,0x7, 0xc7,0xb0,0xf0,0x0, +0xa4,0xe, 0xf0,0x18,0x3c,0x1f,0xe8,0x40,0x3f,0x68,0xe0,0x6, 0xc7,0x48,0xf0,0x0, +0x7c,0x1, 0x7f,0x4, 0xf0,0x1, 0x25,0xe0,0xf0,0x40,0x3d,0xe3,0x62,0x5, 0xf2,0x1, +0xc5,0xff,0xf0,0x0, 0x7f,0x6, 0x13,0x81,0xe2,0x1, 0xc2,0x7f,0xe8,0x40,0x3b,0x6b, +0x12,0x80,0xf0,0x1, 0x1e,0xff,0xf8,0x40,0x3f,0x6b,0xf0,0x0, 0x7e,0x7, 0x0, 0x96, +0x14,0x1, 0xdf,0x35,0xef,0xf9,0xd9,0x7, 0x14,0x1, 0xef,0xf9,0xd9,0x55,0x17,0x81, +0xe8,0x40,0x3b,0xf9,0x3f,0x97,0xe8,0x6, 0x3b,0x1e,0xc2,0x81,0xe3,0xff,0xc7,0xff, +0xe3,0xff,0xc3,0x7f,0xe0,0x1, 0x3, 0xb4,0x3b,0xef,0xf0,0x40,0x3d,0xe5,0xf3,0xff, +0xc5,0xff,0xf0,0x40,0x3d,0xf4,0x3, 0xe5,0xe0,0x3, 0x1d,0xb8,0xe7,0xbf,0x16,0xff, +0xf0,0x0, 0xa4,0xb, 0xe0,0x0, 0x15,0x68,0xe8,0x1, 0xa7,0xe8,0xe0,0x1, 0x14,0xff, +0x3f,0xdd,0xe8,0x1, 0xbf,0xe8,0xf0,0x0, 0x16,0x0, 0x64,0x4, 0xe0,0x0, 0xdd,0x1c, +0xf0,0x0, 0x65,0x3, 0x29,0x6, 0x0, 0xa9,0x39,0x7d,0xf0,0x0, 0xc5,0x2, 0x5, 0xa5, +0xe8,0x40,0x3c,0x6c,0x3c,0xe3,0xe0,0x0, 0xdc,0x73,0xf0,0x0, 0xc6,0x1, 0x3c,0x75, +0xe8,0x40,0x3e,0xec,0xe3,0xff,0xc6,0xff,0x1, 0xf0,0xe8,0x0, 0x9f,0x8a,0x67,0x1, +0xc7,0x84,0xe0,0xc, 0x37,0x85,0x36,0x22,0x3e,0x1e,0xe0,0x1a,0xa5,0xac,0xe0,0x41, +0x3f,0x8f,0x17,0x1, 0xe0,0xf, 0x37,0x3f,0xe3,0xf, 0x3d,0xdf,0x39,0x7d,0xe0,0x1a, +0xbf,0xac,0xf0,0x0, 0xc5,0x2, 0x2, 0xdd,0xe8,0x1, 0xa7,0xe8,0x14,0x1, 0xe0,0x40, +0xcf,0x80,0xe8,0x1, 0xbf,0xe8,0xde,0xd3,0xef,0xf9,0xd8,0xa5,0x14,0x1, 0xef,0xf9, +0xd8,0xf3,0x14,0x0, 0xf0,0x40,0x3b,0x68,0xf0,0x0, 0x25,0xaa,0xf0,0xa, 0x3f,0x18, +0xe3,0xff,0xc5,0x7f,0xe0,0x40,0x3f,0xe8,0xf0,0x0, 0x27,0x17,0xe0,0xc, 0x17,0x52, +0x3f,0x1f,0xe0,0xd, 0x37,0xa1,0x37,0x21,0xe8,0xe, 0x3f,0x1d,0xe8,0xd, 0x3e,0x9d, +0x9d,0x8e,0x96,0xd, 0xc7,0x81,0x3d,0xfc,0xe3,0xff,0xc7,0xff,0x3, 0x3, 0x9f,0xe, +0xb7,0xd, 0x3f,0xfa,0x1, 0xec,0xf0,0x0, 0xc3,0x1, 0xf3,0xff,0xc3,0x7f,0xf8,0x40, +0x3b,0x7b,0xe8,0x8, 0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x1, 0xd9,0x3b,0xf4,0x3c,0x66, +0xf0,0x40,0x3b,0xe7,0xe7,0xfe,0x3, 0xed,0xf0,0xa, 0x3f,0x18,0xe3,0xff,0xc5,0x7f, +0xe0,0x40,0x3f,0xe8,0xf0,0x0, 0x27,0x17,0xe0,0xc, 0x17,0x52,0x3f,0x1f,0xe0,0xd, +0x37,0xa1,0x37,0x21,0xe8,0xe, 0x3f,0x1d,0xe8,0xd, 0x3e,0x9d,0x9d,0x8e,0x96,0xd, +0xc7,0x81,0x3d,0xfc,0xe3,0xff,0xc7,0xff,0x3, 0x3, 0x9f,0xe, 0xb7,0xd, 0x3f,0xfa, +0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf3,0xff,0xc3,0xff,0xf0,0x40,0x3b,0xf4,0xe8,0x8, +0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x1, 0xd9,0xe7,0xfe,0x0, 0xc3,0xf0,0x0, 0x67,0x6, +0xf0,0x0, 0x66,0x7, 0x67,0x82,0xf0,0x2, 0x1e,0xc5,0xe0,0x2, 0x27,0x95,0xf0,0x0, +0x65,0x5, 0xf0,0x40,0x3c,0xe3,0xf2,0x1, 0xc4,0xff,0xf2,0x1, 0xc5,0x7f,0xf8,0x7, +0x3c,0xba,0xf0,0x2, 0x1e,0xc5,0x3f,0xe7,0xe3,0xff,0xc7,0xff,0xf0,0x0, 0x7f,0x6, +0x12,0x81,0xf0,0x0, 0x7e,0x7, 0x3b,0x6f,0xf8,0x40,0x3e,0x69,0x7f,0x85,0x12,0x0, +0xf0,0x1, 0x1d,0xff,0xf8,0x40,0x3f,0x6a,0xf8,0x40,0x3c,0xed,0x0, 0x92,0x14,0x1, +0xde,0x46,0xef,0xf9,0xd8,0x18,0x14,0x1, 0xef,0xf9,0xd8,0x66,0x66,0x82,0x17,0x81, +0x3e,0xf5,0x3f,0x95,0xc2,0x1, 0xe3,0xff,0xc7,0xff,0xe0,0x1, 0x5, 0xdf,0x3a,0xef, +0xf0,0x40,0x3d,0x64,0xf3,0xff,0xc5,0x7f,0xf8,0x40,0x3d,0x7c,0x3, 0xe9,0xe0,0x3, +0x1d,0xb8,0xe7,0xbf,0x16,0xff,0xf0,0x0, 0xa6,0x8b,0xe0,0x0, 0x15,0x68,0xe8,0x1, +0xa7,0xed,0xe0,0x1, 0x14,0xff,0x3f,0xdd,0xe8,0x1, 0xbf,0xed,0xf0,0x0, 0x14,0x0, +0x64,0x4, 0xe0,0x0, 0xdc,0x31,0x63,0x83,0x29,0x5, 0x0, 0xa6,0x39,0x79,0xc3,0x82, +0x5, 0xa3,0xe8,0x40,0x3c,0x68,0x3c,0xe3,0xe0,0x0, 0xdb,0xb9,0xf0,0x0, 0xc4,0x1, +0x3c,0x74,0xe8,0x40,0x3c,0xe8,0xe3,0xff,0xc4,0xff,0x1, 0xf1,0x9f,0x7, 0x67,0x81, +0xc7,0x4, 0xe0,0x8, 0x37,0x5, 0x34,0x22,0x3c,0x1f,0xf0,0x1a,0xa3,0x28,0xe0,0x41, +0x3f,0xe, 0x15,0x81,0xe0,0xe, 0x35,0xbe,0xf3,0xe, 0x3b,0x5e,0x39,0x79,0xe0,0x1a, +0xbf,0x28,0xc3,0x82,0x2, 0xdf,0x17,0x80,0x3f,0x6f,0xe3,0xff,0xc7,0x7f,0xe8,0x40, +0x3f,0x7a,0xe0,0x1, 0x1, 0x68,0xc7,0x81,0xe2,0x0, 0xcf,0x86,0x1, 0xf6,0xe8,0x1, +0xa7,0xed,0x14,0x1, 0xe0,0x40,0xcf,0x80,0xe8,0x1, 0xbf,0xed,0xdd,0xe0,0xef,0xf9, +0xd7,0xb2,0x14,0x1, 0xef,0xf9,0xd8,0x0, 0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x25,0x30, +0xe8,0x40,0x3f,0x65,0xe0,0x0, 0x15,0x0, 0xf0,0x0, 0x27,0x1f,0xe0,0xc, 0x17,0xd2, +0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1,0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99, +0x9c,0xf, 0xf0,0x0, 0x9b,0x9, 0xc5,0x1, 0xf0,0x40,0x3b,0x78,0xe8,0xe, 0x3f,0x1c, +0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f,0x5, 0x84,0x9f,0x8f,0xe0,0x0, 0xb7,0x89, +0xe8,0x40,0x3d,0x7e,0x1, 0xe4,0xf2,0x0, 0xca,0x85,0xe0,0x1, 0x5, 0x95,0xf0,0x0, +0xc2,0x81,0xf3,0xff,0xc2,0xff,0xf8,0x40,0x3a,0xfa,0x1, 0xd3,0xf0,0x40,0x3e,0x75, +0xf0,0x40,0x3b,0x65,0xe7,0xfe,0x5, 0xe4,0xe8,0x40,0x3f,0x66,0xe0,0x0, 0x15,0x0, +0xf0,0x0, 0x27,0x1e,0xe0,0xc, 0x17,0xd2,0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1, +0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99,0x9c,0xf, 0xf0,0x0, 0x9b,0x89,0xc5,0x1, +0xf0,0x40,0x3b,0xf8,0xe8,0xe, 0x3f,0x1c,0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f, +0x5, 0x83,0x9f,0x8f,0xb7,0x89,0xe8,0x40,0x3d,0x7e,0x1, 0xe5,0xf2,0x0, 0xcb,0x5, +0x2, 0x94,0xe8,0xf, 0x3b,0x16,0xe3,0xff,0xc7,0xff,0xe0,0xc, 0x17,0x52,0x3f,0x1f, +0x37,0x21,0x37,0xa1,0xe8,0xe, 0x3f,0x1b,0xe8,0xf, 0x3f,0x99,0x9d,0xe, 0x9c,0x8f, +0x3c,0xfa,0x5, 0x83,0x9f,0xe, 0xb7,0xf, 0xf0,0x0, 0xc3,0x1, 0xf3,0xff,0xc3,0x7f, +0xf8,0x40,0x3b,0x7c,0x1, 0xc2,0x66,0x82,0x17,0x81,0x3e,0xf5,0x3f,0x95,0xc2,0x1, +0xe3,0xff,0xc7,0xff,0xe7,0xfe,0x2, 0xa5,0xf0,0x0, 0x67,0x6, 0xf0,0x0, 0x66,0x7, +0xf8,0x40,0x3e,0xe9,0xe0,0x2, 0x1f,0xc5,0xe8,0x80,0x97,0x1e,0x9e,0x8f,0x3f,0x7d, +0x3, 0x2, 0xb7,0xf, 0xf8,0x40,0x3f,0x7c,0xc7,0x82,0x1, 0xf7,0xe0,0x2, 0x1f,0x93, +0x17,0x0, 0xe0,0x2, 0x1e,0xa5,0xe0,0x2, 0xaf,0xf, 0x14,0x0, 0xe0,0x1, 0xaf,0x7f, +0xf0,0x0, 0xbe,0x8d,0xdd,0x3c,0xe0,0x2, 0x1f,0x48,0x8c,0xe, 0xef,0xf9,0xd5,0xc8, +0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0xc0,0x1c, +0xf8,0x0, 0xf, 0x28,0xb, 0xa1,0xe7,0x34,0x0, 0xe2,0x8e,0x9f,0xe0,0x2, 0x1f,0x78, +0x89,0xbf,0x7e,0x85,0x99,0x6f,0x8e,0xf, 0x8e,0xaf,0x7f,0x3, 0x3f,0xe3,0x67,0x5, +0xe7,0xfb,0x0, 0x83,0x67,0x85,0xe0,0xc, 0x17,0x52,0xe8,0xf, 0x3f,0x95,0xe3,0xff, +0xc7,0xff,0x3f,0x1f,0x37,0x21,0x37,0xa1,0xe8,0xe, 0x3f,0x1b,0xe8,0xf, 0x3f,0x99, +0x9d,0xe, 0x9c,0x8f,0x3c,0xfa,0xe7,0xfe,0x5, 0xdc,0x9f,0xe, 0xb7,0xf, 0xe7,0xfe, +0x0, 0xd8,0x17,0x1e,0xf2,0x0, 0xcd,0x2, 0x3f,0x2f,0x16,0x81,0xe0,0xe, 0x36,0xbe, +0x2, 0x8a,0x65,0x81,0xe0,0x1a,0xa5,0x2b,0xe3,0xe, 0x3d,0x5e,0xe0,0x1a,0xbf,0x2b, +0xe7,0xfe,0x0, 0x8b,0x66,0x81,0x17,0x1d,0xe0,0x1d,0xa5,0x3d,0x3f,0x2f,0x15,0x81, +0xe0,0xe, 0x35,0xbe,0xe3,0xe, 0x3d,0x5e,0xe0,0x1d,0xbf,0x3d,0xe7,0xfd,0x0, 0xfd, +0xe0,0x3, 0x1f,0xb8,0x16,0x80,0xa6,0xf, 0xe0,0x1, 0xa7,0x6c,0x37,0x4d,0xe2,0x0, +0xc7,0x1, 0x24,0x85,0xc4,0xff,0xe0,0x7, 0x16,0xff,0x3e,0xd9,0xe0,0x1, 0xa5,0xec, +0xe7,0xbf,0x17,0xff,0x3d,0xdf,0xe0,0x1, 0xbd,0xec,0xe4,0x7, 0xc4,0x30,0xe0,0x0, +0x1d,0xc4,0xe4,0xd, 0x36,0xa0,0xa5,0x8b,0x37,0x2d,0x3c,0x1b,0xa5,0x8, 0xe0,0x3, +0x1d,0xd8,0x3d,0xda,0x3e,0xcb,0xbe,0x88,0xe0,0x1, 0xa6,0xec,0x3f,0xdd,0x3f,0xce, +0xe0,0x1, 0xbf,0xec,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f, +0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, +0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0x88,0xe2,0x0, 0xc4,0x8f, +0xe0,0xd, 0x34,0xab,0xe7,0xf, 0x14,0xff,0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe2,0x40, +0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, +0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, +0xbe,0xef,0x3c,0x1b,0xa5,0x88,0xe2,0x0, 0xc4,0x81,0xe0,0xd, 0x34,0xaa,0xe7,0xf7, +0x14,0xff,0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xe2,0x0, +0xc4,0x81,0xa5,0x88,0xe4,0xd, 0x34,0xac,0xe0,0x3, 0x1c,0xd9,0xe2,0x0, 0xc5,0x3, +0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe4,0xd, 0x35,0x2a,0xa4,0x88,0xe0,0x3, 0x1d,0xda, +0xe2,0x40,0xc7,0x0, 0xe0,0xa, 0x3c,0xdb,0x3d,0x4d,0xbd,0x8, 0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0xff,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0x6f, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0x5d,0xe0,0x1, 0xbe,0x6f,0x3c,0x1b,0xa5,0xa8, +0xe7,0xf0,0x16,0x0, 0x3e,0x5b,0xe2,0xf, 0xc4,0xff,0x3c,0xcc,0xbc,0xa8,0xe2,0x40, +0xc7,0x0, 0xe0,0x1, 0xa6,0x6f,0x3e,0xdc,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, +0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, +0xbe,0xef,0x3c,0x1b,0xe2,0xf, 0xc4,0xff,0xa5,0xb8,0xe4,0xd, 0x34,0xa0,0xe0,0x3, +0x1c,0xdb,0xe2,0x40,0xc7,0x0, 0x3c,0xdb,0x3c,0xcd,0xbc,0xb8,0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0xe8, +0xe2,0x0, 0xc4,0x87,0xe0,0xd, 0x34,0xa6,0xe7,0xfc,0x14,0xbf,0x3c,0xdb,0x3c,0xcd, +0xbc,0xe8,0xe2,0x0, 0xc5,0xf, 0xa4,0xe8,0x15,0xc3,0xe0,0xd, 0x35,0x22,0xe0,0xa, +0x3c,0xdb,0x3d,0x4d,0xbd,0x68,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d, +0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x1f,0xc4,0x7f, +0xa7,0xf, 0xe7,0xe0,0x17,0x80,0xe0,0x4, 0xa6,0x8e,0x3f,0xdd,0x3c,0x4f,0xe0,0x4, +0xbc,0xe, 0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa7,0x8f,0x17,0x7b, +0xe0,0x1, 0xa6,0x6f,0xe0,0xd, 0x34,0x22,0x3f,0x5c,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f, +0x17,0x7d,0xe0,0x1, 0xa6,0xef,0x34,0x21,0x3f,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x6f, +0xe2,0x0, 0xc4,0x8f,0xe0,0x2, 0xa6,0x3f,0xe7,0xfe,0x17,0xf, 0xe0,0xd, 0x34,0xa4, +0x3f,0x5c,0x3f,0x4d,0xe0,0x2, 0xbf,0x3f,0x17,0x70,0xe0,0x2, 0xa6,0xbf,0x3f,0x5d, +0x3c,0xce,0xe0,0x2, 0xbc,0xbf,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, +0xa7,0xf, 0xe7,0xdf,0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, 0x34,0x2c,0xe0,0x8, +0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe7,0xf0,0x17,0x80,0xe0,0x2, 0xa6,0xce, +0xe2,0xf, 0xc4,0xff,0x3f,0xdd,0x3c,0xcf,0xe0,0x2, 0xbc,0xce,0x38,0x82,0xe0,0x3, +0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xef,0x16,0xff,0xe0,0x1, 0xa6,0x6e, +0xe0,0xf, 0x34,0x2b,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe0,0x4, +0xb4,0xde,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f, +0xc4,0x7f,0xe0,0x3, 0xa6,0x8f,0x3f,0x5d,0x3c,0x4e,0xe0,0x3, 0xbc,0xf, 0xe0,0x6, +0xb4,0xbf,0xe0,0x6, 0xb5,0x5f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, +0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x3, 0xa6,0xbf,0x3f,0x5d,0x3c,0x4e,0xe0,0x3, +0xbc,0x3f,0xe0,0x7, 0xb4,0x9f,0xe0,0x7, 0xb5,0x3f,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe7,0xbf,0x15,0x7f,0xa7,0x8f,0xe0,0xb, 0x34,0x46,0xe0,0x1, 0xa6,0xef,0xe0,0x1, +0xa7,0x6f,0x35,0xa2,0x3f,0x5a,0xe0,0x1, 0xbf,0x6f,0x17,0x73,0xe0,0x2, 0xa6,0x6f, +0xe2,0x40,0xc6,0x80,0x3e,0x5e,0x3e,0x4b,0xe0,0x2, 0xbe,0x6f,0xe0,0xb, 0x34,0x26, +0xe0,0x2, 0xa6,0x6f,0xe7,0xe7,0x17,0x7f,0xe2,0x18,0xc5,0x80,0x3e,0x5e,0x3e,0x4b, +0xe0,0x2, 0xbe,0x6f,0x34,0x42,0xe0,0x2, 0xa5,0xef,0x17,0x3, 0x16,0x7c,0x3f,0x58, +0xe0,0x8, 0x3d,0xdc,0x3c,0x4e,0xe0,0x2, 0xbc,0x6f,0xe0,0x1, 0xa7,0x6f,0x3f,0x5a, +0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1f,0x44, +0xa6,0x8f,0xe7,0xbf,0x15,0xff,0xe0,0x1, 0xa6,0x6d,0xe0,0x1, 0xa7,0xed,0xa7,0xe, +0xe4,0x7, 0xc4,0x30,0x3f,0xdb,0xe0,0x1, 0xbf,0xed,0x3c,0x1e,0xa5,0x28,0xe0,0xe, +0x34,0xc2,0xe0,0x3, 0x1f,0xdc,0xe2,0x0, 0xc7,0x3, 0xe4,0xe, 0x37,0x2d,0x3f,0xda, +0x3f,0xce,0xbf,0xa8,0xe0,0xe, 0x34,0xc6,0xa5,0x28,0xe0,0x3, 0x1f,0xdd,0xe4,0xe, +0x37,0x2b,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0x34,0xc4,0xa5,0x28,0xe0,0x3, 0x1f,0x5e, +0xe2,0x0, 0xc4,0x83,0xe4,0xf, 0x34,0xa9,0xe0,0x9, 0x3d,0x5e,0x3c,0xcf,0xbc,0xa8, +0xe2,0x40,0xc6,0x0, 0xe0,0x1, 0xa7,0xed,0x3d,0xdf,0x3e,0x4b,0xe0,0x1, 0xbe,0x6d, +0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1f,0x44,0xa6,0x8f,0xe7,0xbf,0x15,0xff, +0xe0,0x1, 0xa6,0x6d,0xe0,0x1, 0xa7,0xed,0xa7,0xe, 0xe4,0x7, 0xc4,0x30,0x3f,0xdb, +0xe0,0x1, 0xbf,0xed,0x3c,0x1e,0xa5,0x28,0xe0,0xe, 0x34,0xc2,0xe0,0x3, 0x1f,0xdf, +0xe2,0x0, 0xc7,0x3, 0xe4,0xe, 0x37,0x27,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0xe0,0xe, +0x34,0xc6,0xa5,0x28,0xe0,0x3, 0x1f,0xe0,0xe4,0xe, 0x37,0x25,0x3f,0xda,0x3f,0xce, +0xbf,0xa8,0x34,0xc4,0xa5,0x28,0xe0,0x3, 0x1f,0x61,0xe2,0x0, 0xc4,0x83,0xe4,0xf, +0x34,0xa3,0xe0,0x9, 0x3d,0x5e,0x3c,0xcf,0xbc,0xa8,0xe2,0x40,0xc6,0x0, 0xe0,0x1, +0xa7,0xed,0x3d,0xdf,0x3e,0x4b,0xe0,0x1, 0xbe,0x6d,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0x17,0x77,0xe0,0x1, 0xa6,0x6d,0xe0,0xf, 0x34,0x23, +0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xe0,0x1, 0xbc,0x6d,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xfb,0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, +0x34,0x29,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe2,0x0, 0xc4,0x81, +0xe0,0x1, 0xa6,0x6e,0xe7,0xf7,0x16,0xff,0xe0,0xf, 0x34,0xaa,0xe0,0x9, 0x3e,0x5d, +0x3c,0xcf,0xe0,0x1, 0xbc,0xee,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0xf, 0xe7,0xf8, +0x17,0x80,0xe0,0x1, 0xa6,0xfe,0x3f,0xdd,0x3c,0x4f,0xe0,0x1, 0xbc,0x7e,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x2, +0xa6,0x8f,0xe2,0x1f,0xc4,0xff,0x3e,0xde,0x3c,0x4d,0xe0,0x2, 0xbc,0xf, 0xe0,0x2, +0xa6,0x9f,0x3f,0x5d,0x3f,0x49,0xe0,0x2, 0xbf,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xa6,0x8f,0xa7,0x3d,0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0xe0,0x61,0x3e,0x2, 0xe7,0xfe, +0x17,0xff,0x3f,0xdc,0xe0,0x61,0x3f,0x92,0xa7,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x81, +0x27,0x85,0xa7,0x9d,0xe0,0x20,0xcf,0x80,0xbf,0x9d,0xe7,0xdf,0x17,0xff,0xa6,0x3d, +0x37,0x2c,0x3f,0xdc,0x3f,0xce,0xbf,0xbd,0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x61,0x3f,0x2, 0xe7,0xfe,0x17,0xff,0x3f,0xde, +0xe0,0x61,0x3f,0x92,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0xe7,0xdf, +0x17,0x7f,0xa6,0x3d,0xe0,0xf, 0x34,0x2c,0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xbc,0x3d, +0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x3, +0x1f,0xb8,0xf0,0x3, 0x1b,0x62,0xf0,0x0, 0xa2,0xf, 0xe7,0xbf,0x17,0xff,0xf8,0x1, +0xa1,0xe4,0xe8,0x1, 0xa7,0x64,0xf0,0x13,0x31,0xcd,0x3f,0xde,0xe8,0x1, 0xbf,0xe4, +0xf2,0x0, 0xc1,0x81,0x87,0x88,0xe8,0x1, 0xa6,0xd4,0xe2,0x0, 0xc7,0x87,0xe0,0xe, +0x37,0xac,0xe7,0x1f,0x17,0xff,0x3f,0xdd,0x3f,0xce,0xe0,0x0, 0x1f,0x44,0xf0,0x3, +0x1b,0xe3,0xf0,0x0, 0xa2,0x8e,0xe0,0x3, 0x1c,0xe4,0xe8,0x1, 0xbf,0xd4,0xf0,0x0, +0x10,0x80,0x15,0x78,0xe7,0xfe,0x15,0x87,0xe7,0xf7,0x16,0x7f,0xf0,0x0, 0x11,0x2, +0xf8,0x12,0x39,0x11,0xf0,0x10,0x30,0xa2,0xf0,0x12,0x31,0x21,0xf0,0x12,0x39,0x18, +0xf8,0x10,0x38,0x16,0xe8,0x0, 0xa7,0x0, 0xe8,0x0, 0x8f,0x82,0x3f,0x5a,0x37,0xc5, +0x3f,0x4f,0xe8,0x0, 0xbf,0x0, 0xe4,0x7, 0xc7,0xb0,0xe8,0x0, 0x86,0x82,0xe8,0x0, +0xa7,0x0, 0xe2,0x0, 0xc6,0x9f,0x36,0xa3,0x3f,0x5b,0x3f,0x4d,0xe8,0x0, 0xbf,0x0, +0xe8,0xf, 0x3f,0x95,0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc6,0xe2,0x0, 0xc6,0x81, +0xe4,0xd, 0x36,0xac,0xe8,0xe, 0x3f,0x57,0x3f,0x4d,0xbf,0xf, 0xf0,0x0, 0xc0,0x81, +0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc3,0xe2,0x0, 0xc6,0x83,0xe4,0xd, 0x36,0xaa, +0x3f,0x59,0x3f,0x4d,0xbf,0xf, 0xf2,0x1, 0xc0,0xff,0xe8,0x0, 0x8e,0x92,0xa7,0xf, +0x36,0xc7,0x36,0xaa,0x3f,0x5c,0x3f,0x4d,0xbf,0xf, 0x8f,0x88,0xe8,0x40,0x3f,0xf1, +0xe7,0xff,0x3, 0xb6,0xe8,0x1, 0xa7,0x64,0xe7,0xbf,0x17,0xff,0xf0,0x13,0x31,0xad, +0x3f,0xde,0xf0,0x13,0x39,0xcf,0xf8,0x1, 0xb9,0xe4,0x38,0x82,0xe0,0x0, 0x1f,0x99, +0x17,0x1, 0xaf,0xf, 0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0xb3,0xa7,0x8f,0xaf,0xd, +0x17,0x7d,0xa6,0xdf,0x3f,0x5d,0xbf,0x5f,0xa7,0x5f,0xcf,0x4, 0xbf,0x5f,0x38,0x82, +0xe0,0x0, 0x1f,0x19,0x17,0x81,0xaf,0x8e,0xe0,0x2, 0x1f,0x33,0xaf,0x8e,0xe0,0x0, +0x1f,0x10,0xaf,0x8e,0x38,0x82,0x8, 0xb2,0x39,0x68,0x15,0x4, 0xe1,0xf, 0x14,0x0, +0x3c,0xe2,0xd0,0xac,0xa7,0x82,0xa7,0x2, 0xa4,0x2, 0x37,0xc5,0xe4,0xe, 0x37,0x45, +0xe2,0x0, 0xc7,0x7, 0xea,0x2, 0xc4,0x0, 0xe2,0x0, 0xc7,0x88,0x3f,0xce,0xe4,0x8, +0x34,0x48,0x3c,0x1f,0x9, 0x61,0xe0,0x3, 0x1e,0xb8,0xe0,0x2, 0x1e,0x68,0xa6,0x8d, +0xa7,0xc, 0xa7,0x8c,0xa6,0xcd,0xe2,0x0, 0xc6,0x81,0x26,0xab,0x37,0x48,0xe4,0xf, +0x37,0xc5,0xe2,0x0, 0xc7,0x1, 0xa6,0x8c,0x37,0x23,0xe2,0x0, 0xc7,0x87,0x3f,0xce, +0xea,0x2, 0xcf,0x0, 0x3f,0x5d,0x16,0x85,0xe0,0x2f,0x3f,0x9d,0xe4,0xe, 0x37,0x48, +0x27,0x98,0x27,0x17,0x8, 0xb4,0x11,0x0, 0xe0,0x23,0x3c,0x2, 0x3a,0x69,0x14,0x9, +0x3c,0xe3,0xd0,0x55,0x14,0x9, 0xd0,0x35,0x39,0xf8,0x14,0x5, 0x1, 0xc, 0xc1,0x1, +0xef,0xfa,0xd1,0x48,0xe3,0xff,0xc1,0x7f,0x3a,0x72,0x3, 0xf5,0x14,0x0, 0xa, 0x61, +0x14,0x0, 0x38,0x82,0x14,0x1, 0xa, 0x61,0xe0,0x0, 0x1f,0x99,0x8c,0xf, 0x8f,0xf, +0x27,0x1f,0xe0,0x3, 0x1f,0x38,0x16,0x80,0xa5,0x8e,0xe0,0x0, 0x1f,0x10,0xae,0x8e, +0xa6,0x5b,0xe0,0x1, 0x1f,0x5c,0xce,0x1, 0xa7,0xe, 0xbe,0x5b,0xe0,0x1, 0xa6,0x6e, +0xe0,0x4, 0xce,0x0, 0xe0,0x1, 0xbe,0x6e,0xe7,0xfb,0x16,0x7f,0xe0,0x1, 0xa5,0xee, +0x3e,0x5b,0xe0,0x1, 0xbe,0x6e,0xae,0x8f,0xe0,0x2, 0x1f,0xb3,0xae,0x8f,0x38,0x82, +0x8, 0xb3,0xe0,0x3, 0x1f,0xb8,0x39,0xe8,0xa7,0x8f,0x14,0x0, 0xa1,0x3f,0xde,0xc4, +0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x31,0xa7,0x8f,0xa6,0x8e,0xa7,0x1f,0x31,0x4c, +0xcf,0x10,0xbf,0x1f,0xe2,0x0, 0xc1,0x1, 0xb1,0xdd,0x3c,0x62,0x89,0x7d,0xa6,0x9f, +0x17,0x6f,0x3f,0x5d,0xbf,0x1f,0xde,0xb0,0x3c,0x62,0x9, 0xe1,0x8, 0xb4,0xe0,0x3, +0x1f,0xb8,0x3a,0x68,0xa7,0x8f,0x14,0x0, 0xa1,0x3f,0x39,0xe9,0xde,0xa5,0xe0,0x2, +0x1f,0x91,0xe0,0x3, 0x1f,0x31,0xa7,0x8f,0xa6,0x8e,0xa7,0x1f,0x31,0x4c,0xcf,0x10, +0xbf,0x1f,0xe2,0x0, 0xc1,0x1, 0xb2,0x5d,0x17,0x6f,0xa9,0xbd,0x3c,0x62,0xa6,0x9f, +0x3f,0x5d,0xbf,0x1f,0xa, 0x21,0xe7,0xfd,0x0, 0x90,0x8, 0xb5,0xe0,0x3, 0x1f,0xb8, +0x39,0x68,0xa7,0x8f,0x14,0x0, 0xa7,0xbf,0x12,0x81,0x37,0xcc,0x3a,0xdf,0x39,0xe9, +0x3a,0x6a,0xde,0x82,0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xa7,0x9d,0xcf,0x90,0xbf,0x9d, +0x22,0x13,0xe0,0x3, 0x1f,0xb1,0xe0,0xa, 0x39,0x14,0x14,0xff,0xa7,0x8f,0x3c,0x93, +0xe3,0xff,0xc5,0x7f,0xb1,0x5f,0xc1,0x1, 0x8f,0x7f,0xe3,0xff,0xc1,0x7f,0x39,0x7a, +0xe0,0x80,0xaf,0x19,0x1, 0xf8,0xa7,0x1d,0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d, +0xa, 0xa1,0xe7,0xfc,0x0, 0xe2,0x8, 0xb5,0xe0,0x3, 0x1f,0xb8,0x39,0x68,0xa7,0x8f, +0x14,0x0, 0xa7,0xbf,0x12,0x81,0x37,0xcc,0x3a,0xdf,0x39,0xe9,0x3a,0x6a,0xde,0x54, +0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xa7,0x9d,0xcf,0x90,0xbf,0x9d,0x22,0x15,0xe0,0x3, +0x1f,0xb1,0xe0,0xa, 0x39,0x14,0x14,0xff,0xa7,0x8f,0x3c,0x93,0xe3,0xff,0xc5,0x7f, +0x17,0x1, 0x3f,0x12,0xb1,0x5f,0x39,0x6e,0xe3,0xff,0xc1,0x7f,0xe0,0x80,0x87,0x19, +0x39,0x7a,0xaf,0x3f,0x1, 0xf6,0xa7,0x1d,0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d, +0xa, 0xa1,0xe7,0xfc,0x0, 0xb2,0x0, 0x0, 0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x3, +0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28,0xe0,0x40,0xce,0x80,0xbe,0x9f,0x16,0xa1, +0xb6,0xbe,0x3c,0x98,0xe0,0x6, 0xb4,0xbe,0xe0,0x2, 0xb5,0x5e,0xe7,0xbf,0x17,0x7f, +0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x3, +0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28,0xe0,0x40,0xce,0x80,0xbe,0x9f,0x3c,0x98, +0x35,0x28,0xe0,0x7, 0xb4,0xfe,0x3d,0x9a,0xe0,0x8, 0xb5,0x9e,0xe0,0x7, 0xb6,0x5e, +0xe7,0xbf,0x17,0x7f,0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0x83, +0xe0,0x0, 0x1d,0x95,0xa7,0xf, 0x8e,0xb, 0x9f,0x9e,0x16,0x80,0xcf,0x81,0x3c,0x4f, +0xb4,0x1e,0x0, 0x85,0x9f,0x9e,0xe2,0x0, 0xc7,0x88,0x2f,0x8e,0xe0,0x7, 0x97,0x9e, +0xe2,0x0, 0xcf,0x80,0x3, 0x78,0x2e,0x8e,0x9f,0x9e,0xe0,0x80,0xcf,0x80,0xb7,0x9e, +0x17,0x80,0xb7,0x9e,0x38,0x82,0x9f,0x9e,0x16,0x1, 0xcf,0x84,0xb7,0x9e,0x3e,0xec, +0x0, 0xee,0xae,0xb, 0x0, 0xf2,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x16,0x0, 0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8, +0x96,0xd8,0xb6,0xde,0x96,0xf8,0xb6,0xfe,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9e, +0xe0,0x0, 0x1e,0x95,0xae,0xd, 0x8e,0x88,0x8e,0x18,0x36,0xa8,0x3e,0x9c,0xe0,0x1, +0xb6,0xde,0x96,0xa8,0xe0,0x1, 0x9c,0x28,0xe0,0x9, 0xb6,0xde,0x8e,0xaf,0xe0,0x1, +0xb6,0xfe,0x87,0xbf,0xe2,0x0, 0xc7,0x81,0xe4,0xf, 0x37,0xa8,0xe4,0xf, 0x37,0xc0, +0xb7,0x9e,0xdf,0xad,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92, +0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe0,0x0, 0x14,0x40,0x96,0xde,0xb6,0xdf, +0xe0,0x1, 0x96,0x9e,0xe0,0x1, 0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c, +0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, 0xb6,0xdf,0x8f,0x2e,0xe0,0x1, 0xb7,0x7f, +0x17,0x0, 0xe0,0x1, 0xb4,0xbf,0xb7,0x1f,0xdf,0x82,0xa7,0x12,0xe7,0xbf,0x17,0xff, +0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb4,0xe0,0x2, 0x1f,0x91,0x39,0xe9,0xa2,0xf, +0xe0,0x3, 0x1f,0x83,0xa7,0x14,0xa1,0xf, 0xe0,0x40,0xcf,0x0, 0xbf,0x14,0x3f,0xe8, +0xa7,0x14,0xe0,0x1, 0x14,0x20,0xe0,0x40,0xcf,0x0, 0xbf,0x14,0x97,0x3f,0xb7,0x52, +0x97,0x7f,0xb7,0x72,0x97,0x5f,0xe0,0x1, 0xb7,0x12,0x8f,0x1f,0x8e,0x8f,0x37,0x28, +0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f,0xe0,0x1, 0xb7,0x32,0x17,0x0, 0xe0,0x9, +0xb7,0x52,0xe0,0x1, 0x97,0xf, 0xe0,0x1, 0xb7,0x72,0xe0,0x1, 0x97,0x1f,0xe0,0x2, +0xb7,0x12,0xe0,0x1, 0x97,0x2f,0xe0,0x2, 0xb7,0x32,0xe0,0x1, 0x97,0x3f,0xe0,0x6, +0xb7,0x12,0x8f,0xbf,0x37,0xa8,0xb7,0x92,0xdf,0x42,0xe0,0x3, 0x9f,0xb2,0xaf,0x83, +0xe0,0x3, 0x9f,0xd2,0xaf,0x93,0xe0,0x2, 0x9d,0x72,0xe0,0x3, 0x9d,0x92,0xe0,0x4, +0x9e,0x32,0xe0,0x4, 0x9e,0xd2,0xe0,0x3, 0x9f,0x72,0xe0,0x4, 0x9f,0x92,0xb5,0x13, +0xb7,0xe3,0xe7,0xbf,0x17,0xff,0xb5,0xa3,0xb6,0x33,0xb6,0xc3,0xb7,0x53,0xa7,0x14, +0x3f,0xde,0xbf,0x94,0xa, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, 0xe0,0x3, +0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xdf, +0xe0,0x1, 0x14,0x40,0xb6,0xde,0x96,0xff,0xe0,0x1, 0xb6,0x9e,0x8e,0xbf,0x8e,0x2f, +0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x8e,0x9f,0x8e,0xf, 0x36,0xa8,0x3e,0x9c, +0xe0,0x1, 0xb6,0xbe,0x8e,0xcf,0xe0,0x1, 0xb6,0xfe,0x16,0x80,0xe0,0x9, 0xb6,0xde, +0x87,0xdf,0xe2,0x0, 0xc7,0x83,0x37,0xa8,0xb7,0x9e,0xde,0xf9,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3e,0xe8, +0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa7,0x12,0xa7,0x8f,0xe0,0x40,0xcf,0x0, 0xbf,0x12, +0x16,0x0, 0x97,0x38,0xb7,0x5f,0x97,0x58,0xb7,0x7f,0x97,0x78,0xe0,0x0, 0x14,0x60, +0xe0,0x1, 0xb7,0x1f,0x8f,0xd, 0x8e,0x9d,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x5f, +0xe0,0x9, 0xb6,0x5f,0xb6,0x1f,0xde,0xd3,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0x8, 0xb5,0x8f,0x8, 0x8f,0x98,0x39,0x68,0xa4,0x38,0x3f,0x7f, +0x34,0x21,0xe0,0x6f,0x3b,0xae,0xe0,0x1, 0x14,0xff,0xe0,0x1, 0x15,0x72,0xe8,0x0, +0xc4,0x2, 0x3a,0xef,0xd4,0xe8,0xe0,0x2, 0x1f,0x91,0x17,0x0, 0xa1,0x8f,0xe0,0x3, +0x1f,0x83,0xe0,0x0, 0x14,0x60,0xa2,0xf, 0xa7,0x93,0xe2,0x1, 0xc2,0xff,0xe0,0x40, +0xcf,0x80,0xbf,0x93,0x97,0xb2,0xb7,0xd4,0x97,0xd2,0xb7,0xf4,0x97,0xf2,0xe0,0x1, +0xb7,0x94,0x8f,0x82,0x8e,0x92,0x37,0xa8,0x3f,0x9d,0xe0,0x1, 0xb7,0xd4,0xe0,0x9, +0xb7,0x54,0xb7,0x14,0xde,0x9c,0x87,0x2, 0xa4,0xb2,0x3f,0xee,0xe2,0x1, 0xc7,0xff, +0x27,0xa8,0xe0,0xb, 0x34,0xa1,0x87,0x92,0x15,0x0, 0xe8,0x0, 0xc5,0x82,0x3e,0xef, +0xe2,0x1, 0xc6,0xff,0x26,0x96,0x16,0xb, 0x3e,0x3a,0x17,0x0, 0xe0,0xf, 0x3f,0x1c, +0x37,0xa1,0x3f,0x9b,0x96,0x8f,0xc7,0x1, 0xe0,0x41,0x3e,0x8d,0xb6,0x8f,0xe2,0x1, +0xc7,0x7f,0x87,0x92,0x3e,0xef,0xe2,0x1, 0xc6,0xff,0x3e,0xfe,0x2, 0xf0,0x87,0x2, +0xc5,0x1, 0x3e,0xee,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc6,0xff,0x3e,0xfa,0x2, 0xe0, +0xe4,0x2, 0xc2,0x81,0xb4,0xd4,0x17,0x80,0xe0,0x1, 0xb2,0xd4,0xe0,0x1, 0x14,0x50, +0xb7,0x94,0xde,0x65,0xa5,0x32,0x17,0x0, 0x15,0xf0,0x3f,0xee,0x35,0x21,0x0, 0x92, +0xe2,0x0, 0xcf,0x87,0x2, 0xb2,0xe0,0x5, 0x9e,0x14,0x36,0x1b,0xe2,0x0, 0xc6,0xf, +0xb6,0xd, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8b,0xc7,0x2, 0xc5,0x84, +0x1, 0x1e,0xe2,0x0, 0xcf,0x83,0xe0,0xd, 0x3f,0x1a,0xe8,0x0, 0xc6,0x82,0x2, 0xe9, +0xe0,0x4, 0x9e,0x74,0xe0,0xd, 0x37,0x21,0xc7,0x81,0xe0,0x9, 0x3f,0x1a,0xe0,0xd, +0x36,0x1d,0xe2,0x1, 0xc7,0xff,0xea,0x0, 0xce,0x2, 0x3e,0x19,0xe2,0x0, 0xc6,0x8f, +0xe2,0x0, 0xcf,0x8b,0xb6,0x8c,0xc7,0x2, 0xc5,0x84,0x1, 0xe4,0xa7,0x13,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x93,0xa, 0xe1,0xe0,0x5, 0x9e,0xb4,0x14,0xf0,0x3c,0x9b, +0xe0,0xc, 0x3f,0x1a,0x36,0x99,0xe8,0x0, 0xc6,0x2, 0xe2,0x0, 0xc6,0x8f,0xb6,0x8c, +0x0, 0xc9,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83, +0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe7,0xbf,0x16,0x7f,0x96,0xd8, +0xb6,0xdf,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x14,0x60,0xe0,0x1, +0xb6,0x9f,0x8e,0x8e,0x8d,0x9e,0x36,0xa8,0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xae, +0xe0,0x9, 0xb6,0xdf,0x8e,0xae,0xe0,0x1, 0xb6,0xff,0xe0,0x7, 0x9e,0x9f,0x3e,0xdc, +0xe0,0x7, 0xb6,0x9f,0x8f,0x3e,0xe0,0x7, 0x9e,0x9f,0x37,0x2d,0x3f,0x4d,0xe0,0x7, +0xb7,0x1f,0x9f,0x1f,0x3e,0x5e,0xb6,0x1f,0xdd,0xea,0xa7,0x12,0xe7,0xbf,0x17,0xff, +0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe0,0x1, +0x14,0x60,0x96,0xde,0xb6,0xdf,0x96,0xfe,0xb6,0xff,0xe0,0x1, 0x96,0x9e,0xe0,0x1, +0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae, +0xe0,0x9, 0xb6,0xdf,0x8f,0x2e,0xe0,0x1, 0xb7,0x7f,0x9f,0x1f,0xe0,0x40,0xcf,0x0, +0xb7,0x1f,0xdd,0xbd,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92, +0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0x16,0x0, 0x96,0xd8,0x34,0xa8,0xb6,0xdf, +0x3d,0x49,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9f,0x8e,0x88, +0x8d,0x98,0x36,0xa8,0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xa8,0x14,0x30,0xe0,0x9, +0xb6,0xdf,0xe0,0x7, 0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8f,0x3e, +0xe0,0x7, 0x9e,0x9f,0x37,0x2e,0x3f,0x4d,0xe0,0x7, 0xb7,0x1f,0xe0,0x1, 0xb6,0x7f, +0xe0,0x2, 0xb5,0x1f,0xe0,0x1, 0x9f,0x7f,0xe0,0x1, 0xcf,0x3, 0xe0,0x1, 0xb7,0x7f, +0xe0,0x1, 0xb6,0x3f,0xb6,0x1f,0xdd,0x7b,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, +0x1f,0x83,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0x15,0x80,0x96,0xd8, +0xb6,0xdf,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0x14,0x30,0xe0,0x1, 0xb6,0x9f, +0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, +0xb6,0xdf,0xe0,0x7, 0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8e,0xbe, +0xe0,0x7, 0x9e,0x1f,0x36,0xae,0x3e,0xcc,0xe0,0x7, 0xb6,0x9f,0xe0,0x1, 0xb5,0xff, +0xe0,0x2, 0xb4,0x9f,0xe0,0x1, 0x9e,0xff,0xe0,0x1, 0xce,0x83,0xe0,0x1, 0xb6,0xff, +0xe0,0x1, 0xb5,0xbf,0xe0,0x2, 0x8f,0x7e,0x9e,0x9f,0x37,0x2a,0x3f,0x4d,0xb7,0x1f, +0xdd,0x36,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2, +0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0x8f, +0xe0,0x40,0xce,0x80,0xbe,0x92,0x14,0x0, 0x96,0xde,0xb6,0xdf,0xe0,0x1, 0x96,0x9e, +0xe0,0x1, 0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf, +0x96,0xae,0xe0,0x9, 0xb6,0xdf,0xe0,0x1, 0xb4,0xff,0xe0,0x2, 0xb5,0x1f,0xe0,0x2, +0x8e,0x7e,0xe0,0x2, 0x8e,0xee,0x8f,0x3e,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0x28, +0x3f,0x4d,0xb7,0x1f,0x9f,0x1f,0xe1,0x0, 0xcf,0x0, 0xb7,0x1f,0xdd,0x0, 0xa7,0x12, +0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91, +0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92, +0x3f,0xe8,0x96,0xd8,0xb6,0xde,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28,0xe0,0x1, +0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xaf, +0xe0,0x9, 0xb6,0xde,0xe0,0x2, 0x8e,0x7f,0xe0,0x2, 0x8e,0xef,0x8f,0xbf,0x36,0x2a, +0x36,0xa9,0x3e,0xcc,0x37,0xa8,0x3f,0xcd,0xb7,0x9e,0x9f,0x9e,0xe1,0x0, 0xcf,0x80, +0xb7,0x9e,0xdc,0xcd,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, +0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xdf,0x14,0x30,0xb6,0xde,0x96,0xff, +0xb6,0xfe,0xe0,0x1, 0x96,0x9f,0xe0,0x1, 0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8, +0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xaf,0xe0,0x9, 0xb6,0xde,0xe0,0x2, 0x8e,0x7f, +0xe0,0x2, 0x8e,0xef,0x8f,0xbf,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0xa8,0x3f,0xcd, +0xb7,0x9e,0x9f,0x9e,0xe1,0x0, 0xcf,0x80,0xb7,0x9e,0xdc,0x99,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0x3f,0x68, +0xa1,0x8f,0xe0,0x3, 0x1f,0x83,0xe0,0x0, 0x14,0x40,0xa1,0xf, 0xa7,0x93,0xe0,0x40, +0xcf,0x80,0xbf,0x93,0x97,0xde,0xb7,0xd2,0x8f,0x8e,0x8e,0x9e,0x37,0xa8,0x97,0x2e, +0x3f,0x9d,0xe0,0x1, 0xb7,0xd2,0x17,0x80,0xe0,0x9, 0xb7,0x52,0xe0,0x1, 0xb5,0x72, +0xe0,0x2, 0xb4,0x92,0xb7,0x92,0x9f,0x92,0xe1,0x0, 0xcf,0x80,0xb7,0x92,0xdc,0x6f, +0xe0,0x7, 0x9c,0x32,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1, +0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0x16,0x80,0xa1,0x8f,0xe0,0x3, 0x1f,0x83,0xa7,0x13, +0xa1,0xf, 0xe0,0x40,0xcf,0x0, 0xbf,0x13,0x3f,0xe8,0x97,0x58,0xb7,0x52,0x97,0x78, +0xb7,0x72,0xe0,0x1, 0x97,0x18,0x14,0x0, 0xe0,0x1, 0xb7,0x12,0xe0,0x0, 0x1f,0x15, +0xae,0x8e,0x8f,0xf, 0x8e,0x9f,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f, +0xe0,0x1, 0xb7,0x72,0x97,0x2f,0xe0,0x9, 0xb7,0x52,0x87,0xbf,0xe2,0x0, 0xc7,0x81, +0xe4,0xf, 0x37,0xa8,0xe4,0xf, 0x37,0xc0,0xb7,0x92,0xdc,0x39,0xe0,0x6, 0x9c,0x72, +0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1,0x8, 0xb3,0xe0,0x2, +0x1f,0x91,0xe2,0x0, 0xc5,0x3, 0xa1,0x8f,0xa7,0x93,0xe0,0x40,0xcf,0x80,0xbf,0x93, +0xe0,0x3, 0x1f,0x83,0xa1,0xf, 0x2d,0x17,0xe0,0x9, 0xb5,0x52,0x35,0xaa,0xb4,0x52, +0x35,0x28,0xe0,0x1, 0xb4,0xd2,0xe0,0x1, 0x14,0x10,0xb5,0x92,0x9f,0x92,0x3d,0x4f, +0xb5,0x12,0xdc,0x15,0xe0,0x5, 0x9c,0x52,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x93,0x9, 0xe1,0x17,0x82,0xe0,0x9, 0xb7,0xd2,0x0, 0xe9,0xe0,0x2, 0x1f,0x91, +0x34,0xa3,0xa6,0xf, 0xe0,0x3, 0x1f,0x83,0xf0,0x0, 0x1b,0x95,0xa7,0xf, 0xa7,0x9c, +0xa6,0x9c,0xe0,0x40,0xce,0x80,0xbe,0x9c,0x96,0xd8,0xe8,0x0, 0x8d,0x7, 0xe0,0x8, +0xb6,0xfe,0x96,0xf8,0xe0,0x9, 0xb6,0x9e,0xe0,0x1, 0x96,0x98,0xe0,0x9, 0xb6,0xbe, +0x8e,0xc8,0x8d,0xd8,0x36,0xa8,0x3e,0x9b,0xe0,0x8, 0xb6,0xbe,0xe0,0xd, 0x37,0xcd, +0x8f,0xe8,0x8d,0xf8,0x37,0xa8,0xe0,0x1, 0x94,0x28,0x3f,0x9b,0xe0,0x8, 0xb7,0xde, +0xe2,0x0, 0xc6,0x81,0xe0,0x9, 0xb4,0x5e,0x15,0x80,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe, +0xc7,0x80,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0x3c,0xcf,0xe0,0x7, 0xb4,0x9e, +0xe0,0x7, 0x9f,0x9e,0xcf,0x90,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xcf,0x81, +0xe0,0x7, 0xb7,0x9e,0x0, 0x86,0xe0,0x7, 0x9f,0x9e,0xe2,0x0, 0xc7,0xa0,0x2f,0x9a, +0xe0,0x7, 0x9f,0x9e,0xe2,0x1, 0xc7,0x80,0x27,0xf7,0x2d,0x9c,0xe0,0x7, 0x9f,0x9e, +0x36,0xad,0xcf,0x84,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe,0xc7,0x80, +0xe0,0x7, 0xb7,0x9e,0xe7,0xbf,0x17,0xff,0xa7,0x1c,0x3f,0xde,0x3f,0xcd,0xbf,0x9c, +0x38,0x82,0xe0,0x7, 0x9f,0x9e,0x15,0x1, 0xcf,0x82,0xe0,0x7, 0xb7,0x9e,0x3d,0xea, +0x0, 0xe0,0xe8,0x0, 0xad,0x7, 0x0, 0xe3,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8, +0x96,0xd8,0xb6,0xde,0x96,0xf8,0xb6,0xfe,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28, +0xe0,0x1, 0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x97,0xaf,0x3e,0x9c,0xe0,0x1, +0xb6,0xde,0xe0,0x9, 0xb7,0xde,0x17,0x80,0xb7,0x9e,0xdb,0x79,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0xe0,0x1, 0x1f,0xdc,0x14,0x3, 0xa7,0xf, +0xe0,0x1, 0xa7,0x8e,0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x2f,0x82,0x38,0x82,0xe0,0x1, +0xa4,0xe, 0x34,0x49,0xe2,0x0, 0xc4,0x1, 0x38,0x82,0xe0,0x2, 0x1f,0xf0,0xa7,0xf, +0xe0,0x1, 0x1f,0xdc,0xa6,0x8f,0x17,0x80,0xe0,0x1, 0xaf,0xbe,0xa7,0x9e,0xe2,0x0, +0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0xf7, +0xa6,0x9e,0x17,0xfe,0x3f,0xdd,0xbf,0x9e,0xe0,0x1, 0x8c,0x3e,0x38,0x82,0xe0,0x2, +0x1f,0xf0,0xa7,0xf, 0xe0,0x1, 0x1f,0xdc,0xe0,0x1, 0xac,0x3e,0xa6,0x8f,0xa7,0x9e, +0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0xf7,0xa6,0x9e,0x17,0xfe,0x3f,0xdd,0xbf,0x9e,0x38,0x82,0x24,0xa6,0x17,0xff, +0xe0,0x2, 0x1f,0x70,0xe0,0x1, 0x1e,0xdc,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f, +0xa7,0xe, 0xa6,0x8d,0x3e,0x18,0xe0,0xb, 0x3c,0x1f,0x14,0x80,0x15,0x7e,0xe0,0x1, +0xac,0xbe,0xa7,0x9e,0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1, +0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa7,0x9e,0x3f,0xda,0xbf,0x9e,0xe0,0x1, 0x8f,0xbe, +0xe0,0x80,0xaf,0x9c,0x3e,0x7b,0x1, 0xec,0x38,0x82,0x24,0xa3,0x17,0xff,0xe0,0x2, +0x1f,0x70,0xe0,0x1, 0x1e,0xdc,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f,0xa7,0xe, +0xa6,0x8d,0x3e,0x18,0xe0,0xb, 0x3c,0x1f,0x15,0x7e,0xe0,0x80,0x87,0x9c,0xe0,0x1, +0xaf,0xbe,0xa7,0x9e,0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1, +0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa7,0x9e,0x3e,0x7b,0x3f,0xda,0xbf,0x9e,0x1, 0xee, +0x38,0x82,0xe0,0x2, 0x1f,0xf0,0x17,0x1, 0xa7,0x8f,0x3f,0x58,0xa5,0xbf,0x16,0xfb, +0xe0,0xc, 0x37,0x22,0x3e,0xdb,0x3e,0xcc,0xbe,0xbf,0x15,0xef,0xa6,0xbf,0xe0,0xc, +0x37,0x24,0x3e,0xdb,0x3e,0xcc,0xbe,0xbf,0x16,0xf7,0xa5,0xf, 0xe0,0xc, 0x37,0x23, +0x3e,0xda,0x3e,0xcc,0xbe,0x8f,0x16,0xfe,0xa6,0x3f,0x3e,0xdc,0x3f,0x4d,0xbf,0x3f, +0xe0,0x2, 0x1f,0x66,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0xc, 0x2f,0xa, 0xa6,0x8f, +0xe0,0x2e,0x3c,0xe, 0xe0,0x8, 0x37,0x24,0xe0,0xe, 0x3e,0xdb,0x3f,0x48,0xbf,0xf, +0x38,0x82,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x24,0x7, 0xa6,0x8f,0xe7,0xfe,0x17,0x7f, +0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe7,0xff, +0x17,0x3f,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x70,0x97,0x88, +0xa6,0x8e,0xe2,0xff,0xc7,0xff,0xe0,0x1, 0xb7,0x9d,0x97,0x98,0xe2,0x7f,0xc7,0xff, +0xe0,0x1, 0xb7,0xbd,0x17,0xf7,0x9f,0x8, 0xa6,0x3d,0x37,0x4f,0x37,0x23,0x3f,0xdc, +0x3f,0xce,0xbf,0xbd,0x17,0xfc,0x9f,0x18,0xa6,0x6d,0x37,0x4e,0x3f,0xdc,0x3f,0xce, +0xbf,0xed,0x38,0x82,0xe0,0x2, 0x1e,0x94,0xe0,0x2, 0x1f,0x70,0x87,0xcd,0xa7,0xe, +0xcf,0x82,0xaf,0xcd,0xa7,0xbe,0xcf,0x82,0xbf,0xbe,0x38,0x82,0xe0,0x2, 0x1f,0x14, +0x9f,0xae,0x37,0xc9,0xe2,0x0, 0xc7,0x81,0x2f,0xfc,0x38,0x82,0xe0,0xd, 0x3c,0x49, +0xe2,0x0, 0xce,0x8f,0x3f,0xe8,0x3f,0x69,0x2, 0x8a,0xea,0x4f,0x7c,0x9c,0xe9,0xff, +0xc4,0xff,0x3c,0x9e,0x37,0xa4,0x3f,0x99,0x8c,0xf, 0x38,0x82,0x8, 0xb2,0xe2,0x0, +0xcc,0x0, 0x3, 0x17,0xe2,0x0, 0xcc,0x80,0xe0,0x41,0x3f,0xc8,0x3, 0xb, 0x11,0x1, +0x15,0x0, 0xe0,0x41,0x3c,0xce,0x3c,0x6f,0xd0,0x27,0x29,0x3, 0xe0,0x41,0x3c,0x48, +0x9, 0x61,0x15,0x0, 0x3c,0x6f,0xd0,0x20,0x0, 0xfa,0x15,0x0, 0x9, 0x21,0x0, 0x9c, +0xe2,0x0, 0xcc,0x80,0x3, 0x7b,0x11,0x0, 0x0, 0xec,0x8, 0xb2,0xe2,0x0, 0xcc,0x0, +0x3, 0xf, 0xe0,0x41,0x3c,0x48,0x11,0x1, 0xe2,0x0, 0xcc,0x80,0x3, 0x3, 0xe0,0x41, +0x3c,0xc9,0x15,0x1, 0xd0,0x9, 0x21,0x3, 0xe0,0x41,0x3c,0x48,0x9, 0x61,0x11,0x0, +0x0, 0xf4,0x15,0x0, 0x0, 0x81,0x17,0x81,0x17,0x0, 0xe1,0x2d,0x3c,0x19,0x26,0x84, +0xe1,0x2d,0x3f,0x8e,0x2e,0x88,0x17,0x0, 0x2f,0x8c,0xe2,0x0, 0xcd,0x0, 0xe0,0x68, +0x39,0x2e,0x38,0x82,0xe2,0x0, 0xcc,0x80,0x4, 0x77,0x34,0xa1,0x37,0xa1,0x0, 0xee, +0x3c,0x79,0x4, 0x83,0x3c,0x29,0x3f,0x4f,0x37,0xc1,0x34,0xc1,0x0, 0xee,0x0, 0x0, +0x3d,0xe8,0xe2,0x0, 0xcd,0x3, 0x5, 0xad,0xe0,0xc, 0x3c,0x49,0xe2,0x0, 0xc6,0x3, +0x2e,0x28,0xc5,0x7c,0xe0,0xc, 0x35,0x21,0xe2,0x0, 0xc6,0x18,0xe1,0x80,0xa7,0x99, +0x26,0x8, 0xea,0x0, 0xce,0x81,0xe0,0x7e,0xce,0xe4,0x3e,0xac,0x3f,0x6f,0x3e,0x82, +0xc5,0x70,0x6, 0x93,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99, +0xe1,0x80,0xbf,0x1b,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99, +0xc5,0x70,0xe1,0x80,0xbf,0x1b,0x6, 0x6f,0xe1,0x80,0xbf,0x9b,0xe2,0x0, 0xc5,0x3, +0xc5,0x7f,0x6, 0x87,0xe1,0x80,0x86,0x19,0xc5,0x7f,0xe1,0x80,0xae,0x1b,0x6, 0x7b, +0x38,0x82,0x0, 0x0, 0xe2,0x0, 0xcd,0x3, 0x5, 0xb1,0xe2,0x1, 0xc4,0xff,0xe0,0xc, +0x34,0xa8,0x3c,0xcc,0xe4,0xc, 0x34,0xa0,0x3c,0xcc,0xe0,0x41,0x3e,0x48,0xe2,0x0, +0xc6,0x3, 0xe0,0xb, 0x3e,0x18,0xe0,0xd, 0x3d,0x2c,0x3e,0x6d,0xe2,0x0, 0xc6,0xc, +0x26,0x7, 0xea,0x0, 0xcf,0x81,0xe0,0x7f,0xcf,0xd4,0x3f,0xac,0x3f,0x82,0xe1,0xff, +0xc6,0xf0,0x6, 0x8b,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b, +0xc6,0xf0,0xe1,0x80,0xbc,0x9b,0x6, 0x77,0x3d,0x18,0xe0,0xc0,0xac,0xba,0xac,0x9a, +0xac,0xaa,0xac,0x88,0xac,0x98,0xac,0xa8,0x38,0x82,0x3d,0xe8,0xc5,0x7f,0x6, 0x85, +0xe1,0x80,0xac,0x9b,0xc5,0x7f,0x6, 0x7d,0x38,0x82,0xe0,0x3, 0x1f,0x8b,0xbc,0xf, +0x38,0x82,0xe0,0x3, 0x1f,0xb, 0xe0,0x3, 0x1c,0x65,0xa7,0x8e,0x3f,0xb8,0xe0,0x3, +0x1c,0x66,0x3f,0x98,0xe0,0x3, 0x1c,0x67,0xbf,0x8e,0x3c,0x5f,0x38,0x82,0x8, 0xb1, +0xe0,0x60,0x3c,0x87,0xea,0x24,0x7f,0xf8,0xe0,0x0, 0x15,0x60,0x3c,0x6f,0xdf,0x71, +0xe0,0x60,0x3c,0x17,0x8, 0xe1,0x0, 0x0, 0x0, 0x0, 0x16,0x98,0x0, 0x0, 0x16,0x56, +0x0, 0x0, 0x15,0xdc,0x0, 0x0, 0x16,0x56,0x0, 0x0, 0x16,0x4c,0x0, 0x0, 0x16,0xba, +0x0, 0x0, 0x16,0xb0,0x0, 0x0, 0x15,0xe0,0x0, 0x0, 0x16,0xb0,0x0, 0x0, 0x16,0x4c, +0x0, 0x0, 0x2d,0xee,0x0, 0x0, 0x2d,0xf6,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8, +0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8, +0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xfc,0x0, 0x0, 0x2e,0xc, +0x0, 0x0, 0x2e,0x1c,0x0, 0x0, 0x2e,0x1c,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x30,0x86,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x70, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x54,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x3c, +0x0, 0x0, 0x30,0x2e,0x0, 0x0, 0x30,0x2e,0x0, 0x0, 0x30,0x20,0x0, 0x0, 0x30,0x20, +0x0, 0x0, 0x30,0x20,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xe, 0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xc8,0x0, 0x0, 0x30,0xc8, +0x0, 0x0, 0x30,0xc8,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x33,0xe, 0x0, 0x0, 0x30,0xba, +0x0, 0x0, 0x30,0xac,0x0, 0x0, 0x30,0x0, 0x0, 0x0, 0x2f,0xf2,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xd8,0x80,0x0, 0xd, 0x0, 0x80,0x0, 0xb, 0x0, +0x80,0x0, 0xa, 0x0, 0x80,0x0, 0x7, 0x0, 0x80,0x0, 0x5, 0x0, 0x80,0x0, 0x4, 0x0, +0x80,0x0, 0x3, 0x0, 0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x1, 0x0, 0x80,0x0, 0x0, 0x0, +0x80,0x1, 0x20,0x0, 0x0, 0x3, 0x86,0x60,0x0, 0x3, 0x80,0x0, 0x80,0x1, 0x40,0x0, +0x80,0x1, 0x10,0x0, 0x80,0x0, 0x6, 0x0, 0x80,0x0, 0x8, 0x0, 0x50,0x1, 0x32,0x2, +0x0, 0x3, 0xf0,0x4, 0xce,0x5, 0x9c,0x6, 0x84,0x7, 0x81,0x8, 0x0, 0x2, 0x1, 0x0, +0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, +0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0xeb,0xaa,0x8, 0x0, +0x0, 0x3, 0x6, 0xa8,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x3, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x4, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x0, 0x0, 0x0, 0x0, 0xd, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x0, 0x0, 0x0, 0xe, 0x7, 0x4, 0x3, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x0, 0x0, 0xf, 0x7, 0x5, 0x3, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0xff,0x40,0x0, 0x0, 0x0, 0x2, 0x2e,0x70,0x2, 0x0, 0x0, 0x0, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x34,0x33,0x35,0x33,0x32,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x12,0x0, 0x20, +0x0, 0x12,0x20,0x12,0x20,0x0, 0x0, 0x2, 0x40,0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, +0x1b,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, +0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, 0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, +0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, 0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, +0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, 0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, +0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, 0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, +0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, 0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, +0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, 0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, +0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, 0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, +0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, 0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, +0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, 0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, +0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, 0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, +0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, 0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, +0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, 0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, +0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, 0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, +0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, 0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, +0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, 0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, +0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, 0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, +0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, 0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, +0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, 0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, +0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, 0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, +0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, 0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, +0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, 0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, +0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, 0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, +0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, 0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, +0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, 0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, +0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, 0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, +0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, 0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, +0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, 0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, +0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, 0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, +0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, 0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, +0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, 0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, +0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, 0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, +0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, 0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, +0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, 0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, +0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, 0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, +0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, 0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, +0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, 0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, +0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, 0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, +0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, 0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, +0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, 0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, +0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, 0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, +0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, 0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, +0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, 0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, +0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, 0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, +0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, 0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, +0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, 0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, +0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, 0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, +0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, +0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, 0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, +0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, +0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, +0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, +0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, +0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, +0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, +0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, +0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, +0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, +0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, +0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, +0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, 0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, +0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, +0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, +0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, +0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, +0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, +0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, +0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, +0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, +0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, +0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, +0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, +0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, +0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, 0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, +0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, 0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, +0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, 0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, +0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, 0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, +0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, 0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, +0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, 0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, +0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, 0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, +0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, 0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, +0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, 0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, +0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, 0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, +0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, 0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, +0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, 0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, +0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, 0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, +0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, 0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, +0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, 0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, +0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, 0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, +0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, 0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, +0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, 0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, +0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, 0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, +0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, 0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, +0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, 0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, +0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, 0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, +0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, 0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, +0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, 0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, +0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, 0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, +0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, 0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, +0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, 0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, +0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, 0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, +0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, 0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, +0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, 0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, +0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, 0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, +0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, 0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, +0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, 0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, +0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, 0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, +0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, 0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, +0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, 0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, +0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, 0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, +0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, 0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, +0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, 0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, +0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, 0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, +0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, 0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, +0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, 0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, +0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, 0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, +0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, 0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, +0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, 0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, +0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, 0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, +0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, +0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, 0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, +0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, +0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, +0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, +0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, +0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, +0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, +0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, +0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, +0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, +0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, +0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, +0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, 0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, +0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, +0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, +0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, +0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, +0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, +0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, +0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, +0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, +0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, +0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, +0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, +0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,0x3, 0x5, 0x0, 0xd, 0x17,0x3, +0x5, 0x1, 0xe, 0x17,0x3, 0x5, 0x2, 0x10,0x2, 0x1, 0xa, 0x1e,0x24,0x14,0x0, 0x64, +0xd, 0xac,0x0, 0xc8,0x1, 0x4, 0x0, 0x87,0x0, 0xd2,0x1, 0xf4,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x2c,0xa, 0x0, 0x2, 0x56,0x1, 0x5, 0xc, 0x1e,0x3c,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x6, 0x1, 0x0, 0x1, 0x80,0x1, 0x0, 0x14,0x1, 0xda,0x0, 0x1, 0x0, 0x16,0x1, +0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0xeb,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1d,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x3, 0x3, 0x0, 0xff,0xff,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1, 0xc8,0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x2, 0x40,0x4, 0x0, 0x2, 0xd5,0x1, 0x68,0x28,0x28,0x1, 0x9a,0x1, +0xb8,0x0, 0xa0,0x0, 0xa2,0x5, 0xa0,0x2, 0xd0,0x2e,0x2e,0x1, 0x98,0x1, 0x7a,0x0, +0xb4,0x0, 0xb4,0x12,0x0, 0xb4,0x1, 0x68,0x2, 0x1c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa8,0x1, 0x2c, +0x0, 0x48,0x0, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2, 0x4, 0x4, 0x6, 0x80,0x0, 0x64,0x7, +0xd0,0x8, 0x5, 0x6, 0x1, 0x2c,0x2, 0x58,0x1, 0x90,0x1f,0x40,0x23,0x1, 0x86,0x1, +0x86,0x0, 0xc, 0x17,0x11,0x12,0x1, 0x2c,0x1, 0x4, 0x4, 0x10,0x2, 0x8, 0x3, 0xa, +0xa, 0x0, 0x50,0x2, 0x85,0x0, 0x50,0x5, 0x50,0x0, 0x32,0x1, 0x5e,0x1, 0x5e,0x3, +0x20,0x0, 0xc8,0x0, 0x28,0x0, 0x1e,0x0, 0x80,0x0, 0xb5,0x2, 0xd0,0x0, 0x3c,0x3, +0xe8,0x1, 0x68,0x1, 0x6a,0x0, 0x3c,0x3, 0xe8,0x0, 0x20,0x2, 0xb5,0x0, 0x0, 0x5, +0xa0,0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88,0x1, 0x2c,0x0, 0x0, 0x2, 0x3f,0x0, +0x1, 0x4, 0x0, 0x5, 0x0, 0x20,0x1, 0x0, 0x0, 0x5c,0x5c,0x0, 0x5c,0x5c,0x0, 0x5c, +0x5c,0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7f,0xff,0x1, 0x1, 0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x64,0xff,0xff,0xff, +0x30,0x0, 0x0, 0x0, 0x40,0x33,0x2d,0x24,0x1e,0x18,0x10,0xa, 0xa, 0xe, 0x15,0x1e, +0x24,0x2b,0x32,0x35,0x2f,0x28,0x22,0x1a,0x13,0xa, 0x3, 0x0, 0x1, 0x4, 0xa, 0x12, +0x1b,0x25,0x2c,0x31,0x9, 0x0, 0x0, 0x2, 0x4, 0x8, 0xf, 0x19,0x20,0x27,0x2b,0x2d, +0x2e,0x2e,0x2e,0x2c,0x2c,0x2d,0x2e,0x32,0x35,0x3b,0x43,0x4d,0x56,0x5d,0x62,0x67, +0x6a,0x6d,0x6e,0x70,0xda,0xe1,0xff,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10, +0xc, 0x8, 0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d, +0x22,0x26,0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10, +0x16,0x1b,0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b, +0x4a,0x48,0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x40,0x39,0x34,0x2f, +0x2a,0x24,0x20,0x1b,0x15,0x10,0xb, 0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3, +0x4, 0x7, 0xa, 0xc, 0x10,0x15,0x19,0x1d,0x22,0x28,0x2d,0x31,0x4, 0x0, 0x0, 0x0, +0x1, 0x4, 0x6, 0x9, 0xd, 0x11,0x16,0x1b,0x21,0x27,0x2c,0x30,0x35,0x3c,0x42,0x46, +0x4a,0x51,0x57,0x5b,0x60,0x63,0x65,0x64,0x61,0x5d,0x59,0x56,0x89,0x65,0x34,0x55, +0x0, 0x3, 0x4, 0x6, 0x7, 0x9, 0x9, 0xb, 0xd, 0xf, 0x13,0x16,0x19,0x1d,0x20,0x22, +0x26,0x29,0x2b,0x2b,0x2d,0x2e,0x30,0x31,0x33,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f, +0x13,0x19,0x1e,0x22,0x26,0x29,0x2c,0x31,0x35,0x39,0x3c,0x3e,0x3f,0x3e,0x3b,0x38, +0x35,0x32,0x2f,0x2c,0x28,0x24,0x20,0x1c,0x19,0x16,0x12,0xe, 0xa, 0x6, 0x3, 0x1, +0x97,0xae,0xff,0x55,0x14,0x1a,0x1f,0x25,0x2a,0x2d,0x2d,0x28,0x24,0x1f,0x1b,0x17, +0x12,0xe, 0xc, 0xa, 0x8, 0x8, 0x8, 0x8, 0xa, 0xe, 0x13,0x17,0x1b,0x20,0x26,0x2c, +0x32,0x36,0x3c,0x3d,0x2c,0x2b,0x2a,0x27,0x24,0x21,0x1c,0x1a,0x1a,0x1c,0x1e,0x20, +0x25,0x2a,0x2e,0x32,0x37,0x3b,0x3f,0x43,0x47,0x4c,0x50,0x51,0x53,0x54,0x55,0x56, +0x57,0x57,0x57,0x57,0xdd,0x4, 0x33,0x55,0xe, 0x15,0x1b,0x21,0x26,0x2a,0x30,0x36, +0x3a,0x3d,0x3e,0x3d,0x3a,0x36,0x32,0x2d,0x28,0x1c,0x16,0x10,0xa, 0x6, 0x3, 0x1, +0x0, 0x0, 0x3, 0xa, 0x15,0x29,0x39,0x39,0x37,0x35,0x32,0x2f,0x2c,0x29,0x24,0x1e, +0x18,0x12,0xd, 0x9, 0x5, 0x1, 0x0, 0x0, 0x0, 0x5, 0x9, 0xe, 0x14,0x1c,0x24,0x2c, +0x35,0x3e,0x45,0x4a,0x4b,0x45,0x3f,0x3f,0xf3,0x41,0x33,0x55,0xa, 0x12,0x1a,0x1e, +0x23,0x26,0x25,0x1f,0x1b,0x12,0xa, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, 0x2, 0x6, 0x11, +0x19,0x1d,0x26,0x31,0x36,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x33,0x2c,0x23,0x1e, +0x16,0xe, 0x9, 0x1, 0x1, 0x6, 0x11,0x16,0x1f,0x25,0x2e,0x39,0x3e,0x46,0x49,0x48, +0x43,0x3f,0x35,0x2a,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa2,0x28,0x33,0x55, +0x3, 0xb, 0x10,0x15,0x1a,0x1e,0x21,0x27,0x29,0x28,0x25,0x20,0x1b,0xe, 0x9, 0x7, +0x5, 0x3, 0x1, 0x0, 0x0, 0x1, 0x3, 0x5, 0x9, 0x16,0x1f,0x29,0x33,0x36,0x36,0x36, +0x22,0x20,0x1f,0x1e,0x1b,0x18,0x15,0xc, 0x7, 0x2, 0x0, 0x0, 0x2, 0xb, 0x10,0x14, +0x18,0x1c,0x21,0x2b,0x2f,0x33,0x37,0x3b,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3b,0x3b, +0x6, 0x43,0x33,0x55,0x4, 0xc, 0x13,0x1a,0x20,0x26,0x2c,0x32,0x34,0x31,0x2b,0x24, +0x1b,0x14,0xd, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, 0x2, 0x7, 0xe, 0x16,0x1d,0x23,0x29, +0x30,0x36,0x3d,0x3e,0x1b,0x1c,0x1d,0x1d,0x1d,0x1c,0x1a,0x16,0x10,0x9, 0x3, 0x0, +0x0, 0x3, 0xa, 0x12,0x19,0x1f,0x25,0x2c,0x32,0x39,0x3f,0x44,0x47,0x48,0x47,0x46, +0x43,0x3f,0x3b,0x3a,0x7c,0x49,0x33,0x55,0xb, 0x14,0x1b,0x23,0x2e,0x34,0x38,0x39, +0x36,0x32,0x2b,0x24,0x18,0x12,0xd, 0x9, 0x4, 0x2, 0x0, 0x0, 0x2, 0x6, 0xd, 0x13, +0x1f,0x25,0x2c,0x33,0x3e,0x3f,0x3f,0x3f,0x24,0x26,0x26,0x26,0x25,0x22,0x1d,0x16, +0xb, 0x5, 0x2, 0x0, 0x2, 0x6, 0xc, 0x13,0x1d,0x23,0x29,0x2f,0x3a,0x40,0x45,0x47, +0x49,0x49,0x48,0x46,0x42,0x41,0x41,0x41,0xd3,0x80,0x33,0x55,0x0, 0x8, 0x10,0x16, +0x1d,0x23,0x2b,0x30,0x32,0x32,0x30,0x2c,0x26,0x1e,0x18,0x11,0xb, 0x9, 0x6, 0x5, +0x4, 0x4, 0x6, 0xa, 0x11,0x19,0x21,0x28,0x2f,0x36,0x3c,0x3f,0x1f,0x21,0x22,0x22, +0x21,0x20,0x1d,0x18,0x12,0xc, 0x6, 0x2, 0x0, 0x0, 0x3, 0x9, 0x12,0x19,0x20,0x26, +0x2c,0x34,0x3b,0x41,0x45,0x48,0x49,0x48,0x46,0x42,0x3e,0x3c,0xdb,0x35,0x33,0x55, +0x4, 0xb, 0x13,0x1b,0x23,0x2a,0x29,0x1f,0x16,0xe, 0x6, 0x2, 0x0, 0x0, 0x3, 0x7, +0x10,0x19,0x22,0x2b,0x33,0x38,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x2c,0x27,0x21,0x1b,0x15,0xd, 0x4, 0x0, 0x1, 0x5, 0xc, 0x14,0x1d,0x28,0x32,0x36, +0x3d,0x3f,0x3e,0x3c,0x36,0x2e,0x26,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0xb5,0x6c,0x33,0x55,0x17,0x1c,0x20,0x27,0x2b,0x30,0x39,0x3d,0x3f,0x3d,0x3a,0x35, +0x2b,0x25,0x20,0x17,0x13,0xe, 0x6, 0x3, 0x0, 0x0, 0x2, 0x9, 0xd, 0x11,0x19,0x1a, +0x1a,0x1a,0x1a,0x1a,0xa, 0x11,0x16,0x1d,0x20,0x23,0x23,0x1f,0x1a,0x10,0xb, 0x7, +0x1, 0x0, 0x0, 0x2, 0x4, 0x7, 0x10,0x16,0x21,0x26,0x2b,0x35,0x39,0x3c,0x3f,0x40, +0x40,0x40,0x40,0x40,0x68,0xc0,0x33,0x55,0xa, 0x10,0x1a,0x1e,0x26,0x2c,0x2d,0x2c, +0x29,0x20,0x15,0xf, 0x6, 0x3, 0x0, 0x0, 0x0, 0x3, 0x7, 0x10,0x1c,0x22,0x2d,0x37, +0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x2b,0x29,0x24,0x21,0x1a,0x12,0xe, 0x5, +0x2, 0x0, 0x1, 0x3, 0xb, 0x10,0x1a,0x25,0x29,0x32,0x36,0x3d,0x3f,0x3e,0x3a,0x33, +0x2e,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x1e,0x4d,0x33,0x55,0x0, 0x1, 0x3, 0x5, +0x6, 0x8, 0xb, 0xd, 0x11,0x13,0x16,0x16,0x1a,0x1f,0x21,0x24,0x26,0x28,0x2a,0x2f, +0x35,0x36,0x38,0x39,0x3a,0x3c,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x42,0x37,0x2d,0x23, +0x1d,0x12,0x7, 0x1, 0x9, 0x13,0x1f,0x25,0x31,0x3b,0x36,0x2c,0x20,0x1a,0xf, 0x2, +0x9, 0x11,0x20,0x2d,0x35,0x40,0x47,0x47,0x47,0x47,0x47,0x47,0xff,0x1f,0x32,0x55, +0x0, 0x0, 0x2, 0x3, 0x6, 0x9, 0xc, 0xf, 0x13,0x18,0x1c,0x1d,0x1e,0x1e,0x1e,0x1d, +0x1d,0x23,0x26,0x2a,0x2d,0x32,0x38,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3a,0x3a,0x3a, +0x40,0x35,0x2f,0x28,0x21,0x1a,0x13,0xd, 0x7, 0x1, 0x4, 0xb, 0x11,0x17,0x1d,0x24, +0x2b,0x2a,0x22,0x1c,0x15,0xf, 0x8, 0x3, 0x8, 0xf, 0x16,0x1d,0x23,0x29,0x31,0x32, +0xa5,0xf2,0x32,0x55,0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6, 0xe, 0x13,0x16,0x18, +0x1b,0x1e,0x1e,0x1e,0x1f,0x1f,0x21,0x24,0x2c,0x30,0x35,0x3a,0x3c,0x3f,0x3f,0x3f, +0x3f,0x3f,0x3f,0x3f,0x40,0x39,0x30,0x27,0x22,0x19,0x10,0xd, 0x13,0x1c,0x25,0x2a, +0x33,0x32,0x2d,0x23,0x18,0x12,0x9, 0x1, 0x3, 0x9, 0x13,0x1e,0x23,0x26,0x26,0x26, +0x26,0x26,0x26,0x26,0x7b,0x12,0x32,0x55,0x19,0x14,0x11,0xc, 0x9, 0x5, 0x2, 0x0, +0x4, 0x9, 0xd, 0x11,0x1b,0x20,0x22,0x23,0x23,0x23,0x26,0x27,0x2a,0x2d,0x30,0x37, +0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x10,0x1d,0x23,0x2e,0x36,0x3d, +0x35,0x27,0x1e,0x16,0xe, 0x14,0x21,0x28,0x34,0x39,0x30,0x29,0x1d,0x16,0x10,0x16, +0x1d,0x2c,0x34,0x3f,0x3f,0x3f,0x3f,0x3f,0xe1,0xb1,0x32,0x55,0xb, 0x6, 0x4, 0x2, +0x0, 0x0, 0x0, 0x1, 0x5, 0xf, 0x13,0x17,0x1b,0x1e,0x21,0x20,0x1d,0x19,0x17,0x16, +0x16,0x19,0x1e,0x23,0x28,0x31,0x35,0x39,0x3c,0x3f,0x3f,0x3f,0x40,0x3a,0x35,0x30, +0x2b,0x25,0x20,0x1b,0x17,0x16,0x1a,0x1e,0x23,0x27,0x2a,0x27,0x22,0x17,0x12,0xd, +0x8, 0x4, 0x1, 0x0, 0x0, 0x7, 0xb, 0xf, 0x13,0x15,0x15,0x15,0x4b,0xbb,0x32,0x55, +0x0, 0x3, 0x8, 0xa, 0x11,0x14,0x1c,0x20,0x24,0x25,0x25,0x24,0x23,0x25,0x27,0x2d, +0x30,0x36,0x3b,0x3f,0x3f,0x3f,0x3f,0x3e,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d, +0x29,0x22,0x18,0x12,0x8, 0x4, 0x0, 0x1, 0xc, 0x12,0x1c,0x22,0x2b,0x2a,0x24,0x18, +0x12,0xa, 0x8, 0xf, 0x14,0x1e,0x23,0x2e,0x34,0x3d,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e, +0xc6,0x28,0x32,0x55,0x1f,0x1b,0x17,0x14,0x13,0x12,0x11,0x11,0x12,0x14,0x1a,0x1d, +0x21,0x23,0x24,0x24,0x25,0x24,0x24,0x23,0x21,0x21,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1a,0x1d,0x23,0x29,0x2c,0x34,0x3b,0x3e,0x47,0x4e,0x53,0x51, +0x4b,0x44,0x42,0x3c,0x35,0x32,0x2c,0x25,0x1e,0x1c,0x19,0x19,0x19,0x19,0x19,0x19, +0x19,0x19,0x19,0x19,0xfa,0xf6,0x30,0x55,0x23,0x1e,0x1c,0x1a,0x18,0x17,0x16,0x15, +0x15,0x14,0x14,0x14,0x14,0x16,0x19,0x1d,0x21,0x25,0x28,0x2a,0x2b,0x2c,0x2d,0x2d, +0x2c,0x2b,0x2a,0x29,0x28,0x27,0x27,0x27,0x2f,0x36,0x3a,0x3e,0x43,0x48,0x4d,0x52, +0x56,0x5b,0x60,0x65,0x6a,0x6e,0x71,0x72,0x72,0x70,0x6c,0x67,0x62,0x5d,0x57,0x51, +0x4c,0x47,0x43,0x3e,0x38,0x34,0x31,0x31,0xe4,0xae,0x30,0x55,0x7, 0x5, 0x4, 0x4, +0x5, 0x6, 0xd, 0x14,0x1c,0x22,0x28,0x2f,0x34,0x37,0x39,0x3a,0x39,0x38,0x36,0x32, +0x2c,0x26,0x1a,0x14,0xe, 0xb, 0x8, 0x6, 0x6, 0x5, 0x5, 0x5, 0x33,0x3d,0x43,0x4b, +0x51,0x58,0x64,0x69,0x68,0x65,0x61,0x55,0x4d,0x43,0x3b,0x32,0x22,0x1a,0x13,0xb, +0x7, 0x5, 0x8, 0xf, 0x16,0x1e,0x24,0x30,0x37,0x3c,0x3c,0x3c,0x71,0x75,0x30,0x55, +0x3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7, 0xe, 0x1b,0x22,0x2d,0x32,0x37,0x3a,0x3c,0x3d, +0x3c,0x3a,0x38,0x34,0x29,0x21,0x15,0xc, 0x7, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x2a,0x34,0x3c,0x47,0x4d,0x59,0x60,0x66,0x67,0x66,0x5e,0x58,0x51,0x45,0x3e,0x30, +0x29,0x22,0x17,0xf, 0x5, 0x3, 0x6, 0xb, 0x11,0x1b,0x21,0x2d,0x2e,0x2e,0x2e,0x2e, +0x6a,0x73,0x30,0x55,0xc, 0x5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5, 0xc, 0x13,0x1e, +0x25,0x30,0x35,0x3b,0x3d,0x3f,0x3f,0x3d,0x3c,0x38,0x33,0x28,0x22,0x18,0x12,0xe, +0xd, 0xd, 0xd, 0xd, 0x11,0x19,0x1f,0x2a,0x30,0x3c,0x42,0x4f,0x55,0x5f,0x63,0x64, +0x61,0x59,0x51,0x44,0x3d,0x2e,0x26,0x1c,0x16,0xa, 0x3, 0x0, 0x0, 0x4, 0x8, 0xe, +0xf, 0xf, 0xf, 0xf, 0x7d,0xd0,0x30,0x55,0x15,0xd, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, +0x0, 0x1, 0x8, 0xf, 0x17,0x1f,0x2d,0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3e,0x3a,0x32, +0x2c,0x26,0x20,0x19,0xf, 0xc, 0xc, 0xc, 0x3, 0x9, 0xf, 0x17,0x1e,0x28,0x2e,0x35, +0x3b,0x42,0x50,0x56,0x57,0x56,0x50,0x49,0x41,0x39,0x31,0x25,0x1e,0x17,0xf, 0x5, +0x1, 0x0, 0x0, 0x1, 0x7, 0x9, 0x9, 0x9, 0xca,0xac,0x30,0x55,0x2c,0x23,0x1f,0x19, +0x13,0xc, 0x7, 0x3, 0x0, 0x0, 0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30, +0x36,0x3b,0x3e,0x40,0x3f,0x3e,0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, +0x3, 0x9, 0xe, 0x14,0x1b,0x21,0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a, +0x36,0x2f,0x2b,0x26,0x20,0x1c,0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55, +0x21,0x13,0xc, 0x8, 0x5, 0x2, 0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24, +0x2b,0x32,0x39,0x3d,0x3e,0x3f,0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13, +0x5, 0x9, 0xe, 0x14,0x1a,0x22,0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d, +0x49,0x42,0x39,0x31,0x2b,0x25,0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, +0xaf,0x13,0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, +0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b, +0x3c,0x3e,0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18, +0x1e,0x25,0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33, +0x2c,0x25,0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e,0x3f,0x3f, +0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x1, +0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29,0x22,0x1b, +0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c,0x24,0x2a, +0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, 0x4, 0x7, +0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b,0x38,0x31, +0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35,0x3d,0x45, +0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17,0x11,0x9, +0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6,0x30,0x55, +0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28,0x30,0x36,0x3b,0x3d,0x3f,0x3f, +0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, 0x0, 0x0, 0x1, 0x2, 0x3, 0x5, +0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d,0x52,0x4a,0x3e,0x35,0x2b,0x20, +0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19,0x22,0x2b,0x31,0x3a,0x42,0x47, +0xef,0xc9,0x30,0x55,0x37,0x38,0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, +0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3e,0x30,0x40,0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41, +0x39,0x33,0x2a,0x20,0x1a,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f, +0x25,0x2f,0x38,0x3c,0x37,0xc3,0x57,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c, +0x13,0xe, 0x8, 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31, +0x39,0x3d,0x3f,0x40,0x3f,0x3f,0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a, +0x66,0x63,0x5c,0x53,0x4a,0x40,0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, +0x9, 0x10,0x19,0x21,0x2a,0x32,0x39,0x3e,0x7, 0x90,0x57,0x55,0x18,0x2c,0x34,0x39, +0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, 0x6, 0x1, +0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, 0x8, 0xe, +0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58,0x51,0x48, +0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf,0x57,0x55, +0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28,0x30,0x38, +0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16,0xf, 0xc, +0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, +0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a,0x58,0x57, +0xc6,0x55,0x57,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38,0x3c,0x3e, +0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, 0x1, 0x0, +0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17, +0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57,0x4f,0x47, +0x40,0x38,0x32,0x2f,0x1a,0xb5,0x57,0x55,0x0, 0xb, 0x14,0x1b,0x21,0x28,0x2f,0x37, +0x3d,0x3f,0x3e,0x3c,0x39,0x33,0x2b,0x23,0x1c,0x15,0xc, 0x5, 0x3, 0x3, 0x6, 0x9, +0xd, 0x12,0x18,0x1e,0x24,0x2c,0x33,0x36,0x19,0x13,0x10,0x10,0xf, 0xf, 0x11,0x16, +0x1c,0x25,0x2d,0x33,0x39,0x40,0x47,0x4a,0x4c,0x4c,0x49,0x43,0x3b,0x33,0x2d,0x26, +0x20,0x1a,0x14,0xe, 0xa, 0x5, 0x1, 0x0, 0xb0,0xb5,0x57,0x55,0x2, 0x9, 0xf, 0x1a, +0x1f,0x29,0x2f,0x38,0x3b,0x3e,0x3f,0x3f,0x3b,0x37,0x2e,0x29,0x1e,0x18,0xe, 0xa, +0x3, 0x1, 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x3, +0x5, 0x9, 0xd, 0x18,0x1e,0x27,0x2d,0x32,0x3c,0x3f,0x45,0x46,0x45,0x44,0x3e,0x39, +0x2f,0x2a,0x25,0x1a,0x14,0xc, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x2b,0x77,0x57,0x55, +0x0, 0x1, 0x2, 0x4, 0x5, 0x8, 0xa, 0xf, 0x12,0x15,0x18,0x1a,0x1f,0x22,0x24,0x25, +0x26,0x26,0x28,0x2a,0x2c,0x2f,0x33,0x36,0x37,0x39,0x3a,0x3c,0x3e,0x3f,0x3f,0x3f, +0x1, 0xf, 0x1b,0x2d,0x3d,0x52,0x5f,0x6a,0x60,0x4a,0x39,0x2a,0x17,0xb, 0x4, 0xe, +0x1e,0x2e,0x42,0x50,0x62,0x6b,0x65,0x53,0x43,0x31,0x23,0x13,0x7, 0x2, 0x2, 0x2, +0xa2,0x22,0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x6, 0xa, 0xe, +0x12,0x15,0x18,0x1a,0x1e,0x21,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x29,0x2f,0x34, +0x3a,0x3e,0x3e,0x3e,0x1, 0xa, 0x11,0x17,0x1e,0x24,0x29,0x2e,0x34,0x34,0x2d,0x24, +0x1c,0x14,0xe, 0x8, 0x3, 0x9, 0x10,0x19,0x22,0x2a,0x31,0x36,0x3b,0x38,0x2f,0x24, +0x19,0x11,0x11,0x11,0x4c,0x9f,0x31,0x55,0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0xa, +0xc, 0x10,0x15,0x19,0x1b,0x1f,0x1e,0x1e,0x1d,0x1c,0x1c,0x1e,0x21,0x29,0x31,0x3a, +0x3e,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x14,0x1d,0x23,0x2d,0x34,0x2d, +0x29,0x1e,0x13,0xb, 0x6, 0x6, 0x10,0x19,0x1e,0x29,0x32,0x3c,0x3e,0x34,0x28,0x1b, +0x14,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xef,0x5, 0x31,0x55,0x0, 0x2, 0x4, 0x5, +0x6, 0x7, 0x9, 0xa, 0xd, 0xf, 0x11,0x12,0x14,0x16,0x19,0x1c,0x1f,0x22,0x24,0x24, +0x26,0x29,0x2f,0x31,0x33,0x35,0x37,0x39,0x3a,0x3c,0x3e,0x3e,0x6, 0x10,0x17,0x1d, +0x23,0x2a,0x31,0x39,0x3c,0x36,0x2f,0x28,0x21,0x1a,0x13,0x10,0x16,0x22,0x29,0x2f, +0x36,0x3d,0x3b,0x34,0x2e,0x27,0x21,0x1a,0x13,0xc, 0x4, 0x2, 0x56,0x3f,0x31,0x55, +0x0, 0x2, 0x5, 0x7, 0xa, 0xc, 0xe, 0x14,0x17,0x1b,0x1f,0x25,0x27,0x28,0x28,0x29, +0x29,0x2d,0x30,0x33,0x36,0x39,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x8, 0xf, 0x18,0x23,0x2d,0x37,0x40,0x41,0x3d,0x34,0x2b,0x24,0x2d,0x35,0x3e,0x47, +0x4a,0x42,0x38,0x2c,0x20,0x15,0xb, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0xf6,0x5, 0x31,0x55,0x0, 0x1, 0x3, 0x5, 0x6, 0x7, 0x9, 0xa, 0xc, 0xd, 0xf, 0x13, +0x14,0x15,0x18,0x1a,0x21,0x25,0x26,0x27,0x27,0x27,0x2c,0x2f,0x36,0x3a,0x3d,0x3f, +0x3f,0x3f,0x3f,0x3f,0x0, 0x6, 0xb, 0x14,0x1a,0x1f,0x29,0x2e,0x37,0x3b,0x3e,0x37, +0x32,0x2e,0x25,0x20,0x18,0x1c,0x21,0x29,0x2d,0x31,0x33,0x2d,0x21,0x1b,0x15,0x10, +0x10,0x10,0x10,0x10,0x22,0x55,0x31,0x55,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x7, +0xc, 0x10,0x13,0x16,0x19,0x1b,0x1f,0x22,0x22,0x23,0x23,0x23,0x23,0x26,0x2c,0x31, +0x34,0x36,0x38,0x3a,0x3b,0x3d,0x3f,0x3f,0xa, 0x12,0x1b,0x24,0x2d,0x34,0x3c,0x43, +0x42,0x3b,0x33,0x2b,0x22,0x1c,0x15,0x15,0x1b,0x26,0x2d,0x34,0x3a,0x41,0x41,0x3b, +0x33,0x2b,0x22,0x1a,0x11,0xa, 0x2, 0x1, 0xfa,0x31,0x31,0x55,0x2, 0x2, 0x1, 0x1, +0x0, 0x0, 0x0, 0x6, 0xa, 0x12,0x15,0x1b,0x1d,0x1f,0x1e,0x1e,0x1d,0x1d,0x1d,0x1f, +0x23,0x2a,0x2f,0x36,0x39,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x0, 0x8, 0xe, 0x19, +0x1e,0x29,0x2e,0x30,0x2d,0x23,0x1d,0x13,0xe, 0x13,0x17,0x21,0x25,0x30,0x35,0x3e, +0x3f,0x3a,0x35,0x2b,0x27,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xc8,0x46,0x31,0x55, +0x0, 0x3, 0x5, 0xc, 0x11,0x18,0x1c,0x1f,0x1f,0x1e,0x1e,0x1d,0x1d,0x23,0x26,0x2e, +0x32,0x3b,0x3d,0x3f,0x3f,0x3f,0x40,0x40,0x3f,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d, +0x1e,0x25,0x29,0x31,0x36,0x3d,0x3f,0x39,0x35,0x2c,0x27,0x1c,0x17,0x1b,0x1f,0x2a, +0x2f,0x37,0x34,0x2b,0x27,0x1f,0x1b,0x11,0xc, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x5, 0xb3,0x31,0x55,0x1e,0x0, 0x0, 0x0, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, +0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30, +0x32,0x34,0x36,0x38,0x3a,0x3c,0x1, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x62,0x33,0x0, 0x2, 0x62,0xac, +0x0, 0x2, 0x63,0xee,0x0, 0x2, 0x63,0xec,0x0, 0x2, 0x63,0xed,0x0, 0x2, 0x63,0xe5, +0x0, 0x2, 0x63,0xe4,0x0, 0x2, 0x63,0xe1,0x0, 0x2, 0x63,0xe0,0x0, 0x2, 0x63,0xd9, +0x0, 0x2, 0x62,0x30,0x0, 0x2, 0x63,0xd8,0x0, 0x2, 0x0, 0x8, 0x0, 0x2, 0x2d,0x4d, +0x0, 0x2, 0x24,0xb2,0x0, 0x2, 0x63,0xf0,0x0, 0x2, 0x65,0x98,0x0, 0x0, 0x62,0xd0, +0x0, 0x3, 0x11,0x64,0x0, 0x3, 0x9, 0x88,0x0, 0x3, 0x9, 0x60,0x0, 0x3, 0x9, 0x88, +0x0, 0x2, 0x2d,0x4e,0x0, 0x3, 0x6, 0x5c,0x0, 0x2, 0x2d,0x4c,0x0, 0x2, 0x3e,0xfa, +0x0, 0x2, 0x38,0xa8,0x0, 0x2, 0x32,0x58,0x0, 0x2, 0x38,0xaa,0x0, 0x3, 0x5, 0xe0, +0x0, 0x2, 0x24,0x6f,0x0, 0x2, 0x74,0xcc,0x0, 0x2, 0x74,0xdf,0x0, 0x2, 0x74,0xcb, +0x0, 0x2, 0x2e,0x60,0x0, 0x3, 0x5, 0xe2,0x0, 0x3, 0x6, 0x5d,0x0, 0x2, 0x25,0x1e, +0x0, 0x2, 0x25,0x20,0x0, 0x2, 0x24,0x7e,0x0, 0x2, 0x24,0x62,0x0, 0x3, 0x6, 0xc8, +0x0, 0x2, 0x24,0xc0,0x0, 0x2, 0x24,0x67,0x0, 0x1, 0x42,0xac,0x0, 0x2, 0x24,0xc1, +0x0, 0x2, 0x25,0x1a,0x0, 0x2, 0x5f,0xa0,0x0, 0x2, 0x24,0xb4,0x0, 0x3, 0x5, 0xe4, +0x0, 0x0, 0x63,0xa2,0x0, 0x0, 0x63,0x94,0x0, 0x2, 0x24,0xc7,0x0, 0x2, 0x4b,0xbc, +0x0, 0x2, 0x4b,0xbd,0x0, 0x1, 0x42,0xd4,0x0, 0x2, 0x5e,0xb4,0x0, 0x2, 0x24,0x6a, +0x0, 0x1, 0x42,0xbc,0x0, 0x2, 0x2c,0xc6,0x0, 0x2, 0x74,0xe0,0x0, 0x2, 0xe, 0x60, +0x0, 0x2, 0xe, 0x8f,0x0, 0x1, 0x42,0xb0,0x0, 0x3, 0xa, 0xf0,0x0, 0x1, 0x42,0xdc, +0x0, 0x3, 0x9, 0xc8,0x0, 0x2, 0xe, 0x7c,0x0, 0x2, 0xe, 0x90,0x0, 0x2, 0x3e,0xfc, +0x0, 0x0, 0x62,0xc4,0x0, 0x2, 0xe, 0x58,0x0, 0x2, 0x75,0x54,0x0, 0x2, 0x2e,0x62, +0x0, 0x2, 0x24,0x83,0x0, 0x2, 0x24,0xd3,0x0, 0x3, 0xa, 0x2c,0x0, 0x2, 0x2e,0x64, +0x0, 0x2, 0x2c,0xc4,0x0, 0x2, 0xe, 0xe, 0x0, 0x2, 0xe, 0xd, 0x0, 0x2, 0xe, 0x8, +0x0, 0x2, 0xe, 0xa, 0x0, 0x2, 0xe, 0x9, 0x0, 0x2, 0xd, 0xce,0x0, 0x2, 0xd, 0xcd, +0x0, 0x2, 0xd, 0xc6,0x0, 0x2, 0xd, 0xca,0x0, 0x2, 0xd, 0xc9,0x0, 0x2, 0xd, 0xcc, +0x0, 0x2, 0xd, 0xcb,0x0, 0x2, 0xd, 0xc4,0x0, 0x2, 0xd, 0xb2,0x0, 0x2, 0xd, 0xc3, +0x0, 0x2, 0xd, 0xb1,0x0, 0x2, 0xd, 0xc5,0x0, 0x2, 0xd, 0xc8,0x0, 0x2, 0xd, 0xc7, +0x0, 0x2, 0xd, 0xc0,0x0, 0x2, 0xd, 0xbf,0x0, 0x2, 0xd, 0xbc,0x0, 0x2, 0xd, 0xbb, +0x0, 0x2, 0xd, 0xb8,0x0, 0x2, 0xd, 0xbe,0x0, 0x2, 0xd, 0xbd,0x0, 0x2, 0xd, 0xb6, +0x0, 0x2, 0xd, 0xb0,0x0, 0x2, 0xd, 0xb5,0x0, 0x2, 0xd, 0xaf,0x0, 0x2, 0xd, 0xb7, +0x0, 0x2, 0xd, 0xba,0x0, 0x2, 0xd, 0xb9,0x0, 0x2, 0xe, 0x1a,0x0, 0x2, 0xe, 0x13, +0x0, 0x2, 0xe, 0x12,0x0, 0x2, 0xe, 0x11,0x0, 0x2, 0xe, 0x10,0x0, 0x2, 0xe, 0xf, +0x0, 0x2, 0xd, 0x43,0x0, 0x2, 0xd, 0x42,0x0, 0x2, 0xd, 0x3f,0x0, 0x2, 0xd, 0x3e, +0x0, 0x2, 0xd, 0x35,0x0, 0x2, 0xd, 0x34,0x0, 0x2, 0xd, 0x39,0x0, 0x2, 0xd, 0x37, +0x0, 0x2, 0xd, 0x38,0x0, 0x2, 0xd, 0x36,0x0, 0x2, 0xd, 0x3d,0x0, 0x2, 0xd, 0x33, +0x0, 0x2, 0xd, 0x3c,0x0, 0x2, 0xd, 0x32,0x0, 0x2, 0xd, 0x28,0x0, 0x2, 0xd, 0x31, +0x0, 0x2, 0xd, 0x30,0x0, 0x2, 0xd, 0x44,0x0, 0x2, 0x0, 0x79,0x0, 0x2, 0xe, 0x19, +0x0, 0x2, 0xe, 0x18,0x0, 0x2, 0xd, 0x26,0x0, 0x2, 0xd, 0xf0,0x0, 0x2, 0xd, 0xef, +0x0, 0x2, 0xd, 0xee,0x0, 0x2, 0xd, 0x2f,0x0, 0x2, 0xd, 0x2e,0x0, 0x2, 0xe, 0x36, +0x0, 0x2, 0xe, 0x35,0x0, 0x2, 0xe, 0x3a,0x0, 0x2, 0xe, 0x39,0x0, 0x2, 0xe, 0x3c, +0x0, 0x2, 0xe, 0x3b,0x0, 0x2, 0xe, 0x38,0x0, 0x2, 0xe, 0x37,0x0, 0x2, 0xe, 0x4e, +0x0, 0x2, 0xe, 0x4d,0x0, 0x2, 0xe, 0x42,0x0, 0x2, 0xe, 0x41,0x0, 0x2, 0xe, 0x43, +0x0, 0x2, 0xe, 0x44,0x0, 0x2, 0xe, 0x3e,0x0, 0x2, 0xe, 0x3d,0x0, 0x2, 0xe, 0x40, +0x0, 0x2, 0xe, 0x3f,0x0, 0x2, 0xe, 0x34,0x0, 0x2, 0xe, 0x32,0x0, 0x2, 0xe, 0x52, +0x0, 0x2, 0xe, 0x51,0x0, 0x2, 0xe, 0x50,0x0, 0x2, 0xe, 0x4f,0x0, 0x2, 0xe, 0x54, +0x0, 0x2, 0xe, 0x53,0x0, 0x2, 0xd, 0xc2,0x0, 0x2, 0xd, 0xc1,0x0, 0x2, 0xd, 0xb4, +0x0, 0x2, 0xd, 0xb3,0x0, 0x2, 0xe, 0x1c,0x0, 0x2, 0xe, 0x2e,0x0, 0x2, 0xe, 0x2d, +0x0, 0x2, 0xe, 0x1b,0x0, 0x2, 0xe, 0x26,0x0, 0x2, 0xe, 0x2a,0x0, 0x2, 0xe, 0x25, +0x0, 0x2, 0xe, 0x29,0x0, 0x2, 0xe, 0x24,0x0, 0x2, 0xe, 0x23,0x0, 0x2, 0xe, 0x22, +0x0, 0x2, 0xe, 0x21,0x0, 0x2, 0xe, 0x20,0x0, 0x2, 0xe, 0x1f,0x0, 0x2, 0xe, 0x1e, +0x0, 0x2, 0xe, 0x1d,0x0, 0x2, 0x0, 0xc, 0x0, 0x2, 0xd, 0x27,0x0, 0x2, 0xd, 0xae, +0x0, 0x2, 0x24,0xab,0x0, 0x2, 0xe, 0x74,0x0, 0x2, 0x74,0xe4,0x0, 0x2, 0x61,0x52, +0x0, 0x2, 0x60,0x0, 0x0, 0x2, 0x5f,0xe8,0x0, 0x0, 0x63,0xb0,0x0, 0x2, 0x24,0x7d, +0x0, 0x3, 0x11,0x4c,0x0, 0x3, 0x6, 0x5e,0x0, 0x2, 0x24,0x5e,0x0, 0x0, 0x5e,0x9c, +0x0, 0x2, 0x24,0xb5,0x0, 0x2, 0x25,0x18,0x0, 0x2, 0x65,0xb0,0x0, 0x2, 0x5f,0x18, +0x0, 0x2, 0x1b,0x64,0x0, 0x2, 0x5f,0xa4,0x0, 0x2, 0x65,0xd0,0x0, 0x2, 0xf6,0x0, +0x0, 0x2, 0x24,0xcc,0x0, 0x3, 0xa, 0x38,0x0, 0x2, 0x2e,0x6c,0x0, 0x1, 0x42,0xc8, +0x0, 0x2, 0xae,0x34,0x0, 0x2, 0xa7,0xe2,0x0, 0x0, 0xf4,0xe0,0x0, 0x0, 0xf4,0xb8, +0x0, 0x2, 0xf3,0xb8,0x0, 0x2, 0xf3,0xba,0x0, 0x2, 0xed,0x68,0x0, 0x2, 0xf4,0x30, +0x0, 0x2, 0xf4,0xb8,0x0, 0x2, 0xf4,0xe0,0x0, 0x2, 0xd4,0x22,0x0, 0x2, 0xf5,0xfb, +0x0, 0x2, 0xf5,0xfa,0x0, 0x0, 0xda,0x74,0x0, 0x0, 0xdd,0x9c,0x0, 0x2, 0xf5,0x6, +0x0, 0x2, 0xcd,0xd0,0x0, 0x2, 0xc1,0x2c,0x0, 0x2, 0xe7,0x16,0x0, 0x2, 0xc7,0x7e, +0x0, 0x2, 0xf4,0xac,0x0, 0x2, 0xf4,0xb4,0x0, 0x2, 0xf5,0x12,0x0, 0x2, 0xf5,0xe, +0x0, 0x2, 0xf5,0xa, 0x0, 0x2, 0xf5,0x10,0x0, 0x2, 0xf5,0xc, 0x0, 0x2, 0xf5,0x8, +0x0, 0x0, 0xf5,0x8, 0x0, 0x0, 0xd4,0x22,0x0, 0x2, 0xae,0x36,0x0, 0x2, 0xe0,0xc4, +0x0, 0x2, 0xba,0xda,0x0, 0x2, 0xb4,0x88,0x0, 0x2, 0xa7,0xe4,0x0, 0x0, 0xae,0x36, +0x0, 0x2, 0xf4,0xb0,0x0, 0x0, 0x63,0x78,0x0, 0x2, 0x2e,0x66,0x0, 0x2, 0x24,0x6e, +0x0, 0x2, 0x5f,0x4c,0x0, 0x2, 0xe, 0x9c,0x0, 0x2, 0x24,0x86,0x0, 0x2, 0x24,0x6c, +0x0, 0x2, 0x45,0x52,0x0, 0x2, 0x3f,0x0, 0x0, 0x2, 0x2d,0x4b,0x0, 0x2, 0x24,0x61, +0x0, 0x2, 0x24,0x5d,0x0, 0x3, 0x6, 0xcc,0x0, 0x2, 0x24,0xc9,0x0, 0x1, 0x42,0xc0, +0x0, 0x1, 0x42,0xcc,0x0, 0x2, 0x5f,0xc4,0x0, 0x2, 0xf6,0x4, 0x0, 0x3, 0x11,0x68, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x24,0x85,0x0, 0x2, 0x4b,0xa4,0x0, 0x3, 0xa, 0x78, +0x0, 0x2, 0x24,0x76,0x0, 0x2, 0x24,0x71,0x0, 0x3, 0x5, 0xe6,0x0, 0x2, 0x61,0x3c, +0x0, 0x0, 0x62,0xde,0x0, 0x2, 0x24,0xb6,0x0, 0x2, 0x5f,0xe3,0x0, 0x2, 0x5f,0xe2, +0x0, 0x2, 0x5f,0xe0,0x0, 0x3, 0x6, 0x64,0x0, 0x2, 0x24,0xc6,0x0, 0x1, 0x42,0xb4, +0x0, 0x3, 0xa, 0xf4,0x0, 0x3, 0xa, 0xdc,0x0, 0x2, 0x74,0x50,0x0, 0x2, 0xe, 0x9b, +0x0, 0x2, 0xe, 0xa0,0x0, 0x0, 0x65,0x60,0x0, 0x2, 0x75,0x40,0x0, 0x2, 0x74,0xec, +0x0, 0x2, 0x2e,0x68,0x0, 0x2, 0x2e,0x70,0x0, 0x2, 0x74,0x8a,0x0, 0x2, 0x74,0x8c, +0x0, 0x3, 0xa, 0xe8,0x0, 0x2, 0xe, 0x5e,0x0, 0x2, 0x1b,0x82,0x0, 0x2, 0x24,0x89, +0x0, 0x2, 0x2e,0x6a,0x0, 0x2, 0x24,0x54,0x0, 0x0, 0xf6,0x60,0x0, 0x2, 0xf6,0x60, +0x0, 0x2, 0x24,0x7a,0x0, 0x2, 0x5f,0xc6,0x0, 0x3, 0x6, 0x65,0x0, 0x2, 0x24,0xad, +0x0, 0x2, 0x24,0x70,0x0, 0x2, 0x2d,0x4a,0x0, 0x3, 0x5, 0xf2,0x0, 0x3, 0x5, 0xec, +0x0, 0x2, 0x25,0x1c,0x0, 0x2, 0x24,0x80,0x0, 0x3, 0x6, 0x68,0x0, 0x2, 0xe, 0x64, +0x0, 0x3, 0xa, 0xf8,0x0, 0x3, 0xa, 0xf6,0x0, 0x2, 0x24,0x64,0x0, 0x2, 0xe, 0x62, +0x0, 0x2, 0x2c,0xc5,0x0, 0x2, 0x67,0x82,0x0, 0x2, 0x67,0x24,0x0, 0x2, 0x67,0x91, +0x0, 0x2, 0x67,0x8d,0x0, 0x2, 0x67,0x8e,0x0, 0x2, 0x67,0x87,0x0, 0x2, 0x67,0x8a, +0x0, 0x2, 0x67,0x8c,0x0, 0x2, 0x67,0x8b,0x0, 0x2, 0x67,0x88,0x0, 0x2, 0x67,0x85, +0x0, 0x2, 0x67,0x89,0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67,0x1c,0x0, 0x2, 0x66,0x54, +0x0, 0x2, 0x66,0xb8,0x0, 0x2, 0x67,0x8f,0x0, 0x2, 0x67,0x84,0x0, 0x2, 0x67,0x86, +0x0, 0x2, 0x67,0x81,0x0, 0x2, 0x65,0xf0,0x0, 0x2, 0x67,0x80,0x0, 0x2, 0x24,0xd2, +0x0, 0x0, 0x63,0x6a,0x0, 0x3, 0x6, 0xd6,0x0, 0x2, 0x4b,0xa8,0x0, 0x1, 0x42,0xc4, +0x0, 0x0, 0x62,0xa0,0x0, 0x2, 0x1b,0x83,0x0, 0x2, 0x24,0xc8,0x0, 0x3, 0x11,0x60, +0x0, 0x2, 0x24,0x72,0x0, 0x2, 0x24,0xb7,0x0, 0x2, 0x24,0x66,0x0, 0x2, 0x5f,0xc8, +0x0, 0x3, 0x6, 0xd8,0x0, 0x0, 0x63,0xe0,0x0, 0x3, 0xa, 0xec,0x0, 0x1, 0x42,0xa8, +0x0, 0x2, 0x5f,0x5c,0x0, 0x2, 0x4b,0xac,0x0, 0x2, 0x74,0x36,0x0, 0x2, 0x74,0x3c, +0x0, 0x2, 0x74,0x3a,0x0, 0x2, 0x74,0x38,0x0, 0x2, 0x74,0x32,0x0, 0x2, 0x6d,0xf0, +0x0, 0x2, 0x67,0xb0,0x0, 0x2, 0x74,0x30,0x0, 0x2, 0x74,0x31,0x0, 0x2, 0x74,0x34, +0x0, 0x2, 0x67,0x94,0x0, 0x2, 0x24,0x88,0x0, 0x3, 0x6, 0x5f,0x0, 0x3, 0x5, 0xe8, +0x0, 0x1, 0x42,0xb8,0x0, 0x2, 0x5f,0x9c,0x0, 0x1, 0x42,0xe4,0x0, 0x2, 0x74,0x40, +0x0, 0x3, 0x6, 0xa8,0x0, 0x2, 0x25,0x14,0x0, 0x2, 0x32,0x48,0x0, 0x2, 0x32,0x30, +0x0, 0x2, 0x4b,0xae,0x0, 0x1, 0x42,0xd8,0x0, 0x2, 0x1b,0x84,0x0, 0x2, 0x24,0xae, +0x0, 0x2, 0x24,0x5c,0x0, 0x2, 0xe, 0x70,0x0, 0x2, 0x24,0x84,0x0, 0x2, 0x4b,0xc0, +0x0, 0x0, 0x62,0xb8,0x0, 0x2, 0xe, 0x5d,0x0, 0x2, 0x4b,0xb0,0x0, 0x0, 0x63,0xc8, +0x0, 0x2, 0x4b,0xb4,0x0, 0x2, 0x24,0x82,0x0, 0x2, 0x2c,0xf0,0x0, 0x2, 0x24,0x74, +0x0, 0x2, 0x24,0xac,0x0, 0x2, 0xe, 0x5c,0x0, 0x2, 0x4b,0xb8,0x0, 0x3, 0x6, 0x61, +0x0, 0x2, 0x5f,0xcc,0x0, 0x2, 0x24,0x7c,0x0, 0x2, 0x5f,0x7, 0x0, 0x2, 0x5f,0x6, +0x0, 0x2, 0x5f,0x5, 0x0, 0x2, 0x5f,0x4, 0x0, 0x2, 0x5f,0x3, 0x0, 0x2, 0x5f,0x2, +0x0, 0x2, 0x5f,0x1, 0x0, 0x2, 0x5f,0x0, 0x0, 0x2, 0x5e,0xff,0x0, 0x2, 0x5e,0xfe, +0x0, 0x2, 0x5e,0xfd,0x0, 0x2, 0x5e,0xfc,0x0, 0x2, 0x5e,0xfa,0x0, 0x2, 0x5e,0xec, +0x0, 0x2, 0x24,0x78,0x0, 0x2, 0x74,0xc8,0x0, 0x2, 0x5f,0xdf,0x0, 0x2, 0x5f,0xd0, +0x0, 0x1, 0x42,0xe8,0x0, 0x2, 0x5b,0x8e,0x0, 0x2, 0x58,0x68,0x0, 0x0, 0x1, 0x0, +0x0, 0x2, 0x25,0x16,0x0, 0x2, 0x24,0x87,0x0, 0x2, 0x24,0xca,0x0, 0x1, 0x42,0xe0, +0x0, 0x2, 0x0, 0x4, 0x0, 0x3, 0x6, 0xf6,0x0, 0x3, 0x6, 0xf5,0x0, 0x3, 0x6, 0xe6, +0x0, 0x3, 0x6, 0xe4,0x0, 0x2, 0x52,0x14,0x0, 0x1, 0x42,0xd0,0x0, 0x2, 0x24,0x1, +0x0, 0x2, 0x24,0x60,0x0, 0x0, 0x63,0x86,0x0, 0x2, 0x5f,0xce,0x0, 0x2, 0x75,0x48, +0x0, 0x2, 0xe, 0x8e,0x0, 0x2, 0x24,0x68,0x0, 0x3, 0x9, 0x5d,0xf, 0xff,0xff,0xff, +0xf0,0xff,0xff,0xff,0xff,0xc0,0xff,0xff,0x55,0x50,0x47,0x52,0x41,0x44,0x45,0x20, +0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0xa0,0x0, 0x3, 0xff,0x8, 0x0, 0x0, 0x8, +0x0, 0x82,0x52,0x1, 0x6, 0xc3,0x14,0x5, 0x8, 0x5, 0x8, 0x5, 0x6, 0xc3,0x18,0x6, +0x8, 0x6, 0x8, 0x6, 0x3, 0x28,0x0, 0xfa,0x3, 0x28,0x1, 0x2c,0xfc,0x0, 0xff,0xff, +0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0xf8,0x0, 0xff,0xff,0x9f,0xff,0xff,0xff, +0xe7,0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0xfe,0x7f,0xff,0xff,0xff,0x9f,0xff,0xff, +0xff,0xe7,0xff,0xff,0x80,0x1, 0x10,0x20,0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff, +0x0, 0x19,0x66,0xd, 0x3c,0x6e,0xf3,0x5f,0x7f,0xff,0xff,0xff, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT8006m/include/firmware/white_all.i b/drivers/input/touchscreen/FT8006m/include/firmware/white_all.i new file mode 100644 index 0000000000000..cc3688aa98db6 --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/include/firmware/white_all.i @@ -0,0 +1,7029 @@ +0x10,0x71,0x4, 0x3e,0x16,0xd9,0x0, 0x9d,0xbf,0x10,0x84,0x0, 0x0, 0x2, 0xc8,0x0, +0x84,0x80,0x0, 0x26,0x5a,0x51,0xb5,0x2a,0x6c,0xc5,0x4a,0x1, 0x60,0xe1,0xf, 0xc1, +0x10,0xc, 0x30,0x4b,0x0, 0x0, 0x42,0xa, 0xe3,0x29,0x99,0xf0,0xb9,0xe1,0x6b,0x68, +0x5f,0x81,0x26,0x0, 0xa1,0x80,0x8, 0x20,0x6, 0x0, 0x85,0x0, 0x0, 0x2c,0xb8,0x71, +0x3, 0x0, 0x8, 0x10,0x1b,0x27,0x35,0x38,0x6a,0x2d,0x72,0xbb,0x7b,0x94,0x62,0x5c, +0x4a,0x38,0x25,0x15,0x6, 0x0, 0x8, 0x10,0x1b,0x27,0x35,0x38,0x6a,0x2d,0x72,0xbb, +0x7b,0x94,0x62,0x5c,0x4a,0x38,0x25,0x15,0x0, 0x0, 0x85,0x80,0x0, 0x12,0x0, 0x0, +0x20,0x44,0x8, 0x0, 0x60,0x47,0x0, 0x0, 0x10,0x22,0x4, 0x0, 0xb0,0x23,0x15,0x0, +0x86,0x0, 0x0, 0x30,0xfa,0x68,0x68,0x1, 0x2d,0x6e,0x10,0x4, 0x0, 0x60,0x15,0x0, +0x50,0x15,0x56,0x51,0x15,0x55,0x61,0x15,0x0, 0x60,0x15,0x0, 0x50,0x15,0x56,0x51, +0x15,0x55,0x61,0x95,0xab,0x18,0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x80,0x4c,0x29,0x84, +0x52,0x1, 0x9, 0x0, 0x86,0x80,0x0, 0xe, 0xf0,0xb1,0x71,0xef,0x49,0xc0,0x80,0x1a, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x87,0x0, 0x0, 0xc, 0xff,0x81,0x68,0xac,0xb4,0x6d, +0x24,0x0, 0x0, 0x0, 0x0, 0x0, 0x87,0x80,0x0, 0x17,0x19,0xc6,0x3e,0x20,0x1c,0x58, +0x64,0x10,0x53,0x33,0xe8,0x50,0x1, 0x32,0x8c,0x8c,0x24,0x69,0x81,0x71,0x44,0x7c, +0x14,0x88,0x0, 0x0, 0x1f,0x0, 0x80,0x3, 0xe7,0x1f,0x17,0x0, 0x48,0x40,0x2, 0xcf, +0x18,0x30,0x88,0x41,0x8a,0x39,0x28,0xa9,0xc5,0x9a,0x7b,0xf0,0x7, 0x7e,0xe0,0x7, +0x7e,0x20,0x10,0x0, 0x88,0x80,0x0, 0x79,0x43,0x77,0x3, 0x40,0x8a,0xf1,0xff,0x43, +0x30,0x8, 0xc1,0x46,0xa0,0x80,0x24,0x18,0x30,0x6, 0x64,0xc1,0x80,0x11,0x7, 0xc4, +0xe1,0xd0,0x68,0x40,0x20,0x1d,0x4, 0x48,0x40,0x40,0x28,0x10,0x60,0x70,0x38,0x1a, +0x10,0x47,0x3, 0xe2,0x20,0x0, 0x10,0x80,0x50,0x30,0x0, 0xe0,0xe1,0x1, 0x0, 0x28, +0xe, 0x6, 0xc3,0xcc,0xcc,0xcc,0xcc,0xcc,0x8c,0x88,0x88,0x88,0x88,0x88,0xc8,0x8, +0x86,0xc6,0xe3,0x81,0x0, 0x20,0x0, 0x21,0x42,0x88,0x0, 0x0, 0x0, 0x0, 0x40,0x0, +0x0, 0x31,0x4, 0x41,0x6, 0x0, 0x0, 0x0, 0x0, 0x92,0x4, 0x0, 0x92,0x4, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x85,0x11,0xc, 0x0, 0x0, 0x40,0x0, 0x0, 0x0, 0x0, 0x5e, +0x0, 0x89,0x0, 0x0, 0x19,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x89,0x80, +0x0, 0x13,0x1, 0x0, 0x0, 0xc, 0x0, 0x0, 0x0, 0x0, 0x1, 0x7, 0x1, 0x5, 0x44,0xc, +0xce,0xe7,0x62,0xe, 0x0, 0x8a,0x0, 0x0, 0x80,0x91,0x1, 0x88,0xa6,0xe8,0xef,0xf7, +0xfb,0xfd,0x7e,0x0, 0x0, 0x0, 0x68,0xc5,0x7, 0xe8,0x3c,0x20,0x36,0x40,0xe7,0x1, +0x71,0x1, 0x3a,0xf, 0x88,0x9, 0xd0,0x79,0x80,0x39,0xbc,0xdf,0x8, 0xcc,0x20,0x83, +0x46,0x0, 0x18,0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x1c,0xad,0xd1,0x2a,0x0, 0x40,0xa1,0x50,0x78,0x7, 0xa0,0xf3,0x80,0x73, +0x0, 0x6f,0x0, 0x74,0x1e,0x70,0xe, 0xe0,0x5, 0x80,0xce,0x3, 0xce,0x1, 0xbc,0x2, +0xd0,0x79,0xc0,0x39,0x80,0x77,0x1, 0x3a,0xf, 0x38,0x7, 0xf0,0x26,0x40,0xe7,0x1, +0xe7,0x0, 0xde,0x3, 0xe8,0x3c,0xe0,0x1c,0xc0,0x5b,0x0, 0x9d,0x7, 0x9c,0x3, 0x0, +0x1, 0xbf,0x1f,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8a,0x80,0x0, 0x80,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd1, +0x6a,0xc4,0xa8,0xd5,0x96,0xa2,0xe0,0x1f,0x31,0x6a,0xb5,0xa5,0x28,0x78,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x13,0x0, 0xf0,0x0, 0x94,0xd6,0xc, 0x2d,0x49,0x30,0x14, +0xc7,0x4, 0xd5,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x4d,0x15,0xa2,0x18,0x84, +0x0, 0x4c,0x30,0x6c,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xd6,0xc, 0x29,0x8, 0x20, +0x10,0xc6,0x4, 0xd5,0xb6,0x6d,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x4d,0x55,0xb2,0x1c, +0xc5,0x10,0x4c,0x30,0x6c,0xdb,0xb6,0x6d,0xdb,0xb6,0x6d,0x5b,0x10,0x8b,0x0, 0x0, +0x16,0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xd0,0x40,0x8c,0x0, 0x0, 0x3f,0xef,0xbd,0xf7,0xde,0x7b, +0xef,0xbd,0x7, 0x8, 0x8, 0xa, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0x5c,0x9, +0xa8,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x5a,0x59,0x59,0x59,0x59,0x59, +0x59,0x59,0x59,0x59,0x59,0x59,0x9, 0x4, 0xff,0x5, 0x80,0x80,0x0, 0x4, 0x20,0x0, +0x1, 0x8, 0x40,0x0, 0x2, 0x10,0x80,0x0, 0x4, 0xf, 0x8c,0x80,0x0, 0x27,0xea,0xd3, +0xc6,0xb8,0xaf,0xa6,0x9e,0x98,0x92,0x8e,0x8a,0x85,0x0, 0x60,0xf6,0xcf,0xfc,0x6f, +0xf6,0xef,0xcf,0xaf,0xf, 0xff,0xaf,0xb5,0x71,0xe, 0x6c,0x4a,0x69,0x8, 0x0, 0x0, +0x44,0x0, 0x0, 0x0, 0x0, 0x8d,0x0, 0x0, 0x80,0x0, 0x4, 0x8, 0xc, 0x50,0x10,0x14, +0x18,0x1c,0xa5,0x20,0x28,0x30,0x39,0x3e,0x41,0x49,0x51,0x59,0x54,0x61,0x69,0x71, +0x79,0xaa,0x81,0x89,0x91,0x99,0x5a,0xa1,0xa9,0xb1,0xb9,0x1, 0xc0,0xc8,0xd0,0xd8, +0x6f,0xe0,0xe7,0xef,0xf7,0x5c,0xfb,0xfd,0xfe,0x0, 0x0, 0x4, 0x7, 0xb, 0xf0,0xf, +0x13,0x17,0x1b,0x6b,0x1f,0x27,0x2f,0x36,0xc1,0x3e,0x46,0x4e,0x56,0x1a,0x5e,0x65, +0x6d,0x75,0xac,0x7d,0x85,0x8d,0x95,0x16,0x9d,0xa4,0xac,0xb4,0xbc,0xbc,0xc4,0xcc, +0xd4,0x5a,0xdc,0xe4,0xec,0xf3,0xc1,0xf7,0xf9,0xfa,0x3f,0x0, 0x4, 0x8, 0xc, 0x0, +0x10,0x14,0x18,0x1c,0x55,0x20,0x28,0x30,0x38,0x55,0x40,0x48,0x50,0x58,0x55,0x60, +0x68,0x70,0x78,0x1, 0x7f,0x87,0x8f,0x97,0xaf,0x8d,0x80,0x0, 0x14,0x9f,0xa7,0xaf, +0xb7,0x55,0xbf,0xc7,0xcf,0xd7,0x0, 0xdf,0xe7,0xef,0xf7,0xe5,0xfb,0xfe,0xff,0x3, +0x0, 0x90,0x0, 0x0, 0x7, 0x8b,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x91,0x0, 0x0, 0xd, +0x2d,0xd3,0x0, 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x1f,0x0, 0x91,0x80,0x0, +0x19,0x1, 0x5, 0x0, 0x5, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1, 0xff,0xf, 0x0, 0x0, 0x2c,0x1, 0x0, 0x0, 0x0, 0x92,0x0, 0x0, 0x10,0x0, 0x3, +0x0, 0x9d,0xbf,0x10,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xd9,0x16,0xb, 0xf4, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x31,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0x0, 0x0, 0x60,0x0, 0x1, 0x79,0x84,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86,0x0, 0x1, 0x79,0x86, +0xe0,0x60,0x3c,0x0, 0xcc,0x2, 0xe0,0x60,0x3c,0x10,0xea,0x0, 0xc8,0x3, 0xe0,0xff, +0xc8,0x7c,0xfa,0x0, 0xcf,0x82,0xf0,0x0, 0xcf,0x80,0xea,0x0, 0xcc,0x0, 0xe0,0x0, +0xcc,0x0, 0xe0,0x60,0x3c,0x17,0xea,0x0, 0xcc,0x2, 0xe0,0x0, 0xcc,0x0, 0xea,0x0, +0xcc,0x80,0xe0,0x32,0xcc,0xe8,0x3c,0x79,0x1, 0x8, 0xea,0x0, 0xcd,0x2, 0xe0,0x1, +0xcd,0x34,0x3d,0x28,0xe0,0x0, 0xdb,0xe2,0xea,0x0, 0xcc,0x0, 0xe0,0x2e,0xcc,0x60, +0x3c,0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x56,0x31,0x2e,0x34,0x30,0x53,0x65,0x70,0x20,0x20,0x31,0x20,0x32,0x30,0x31,0x37, +0x46,0x54,0x38,0x30,0x30,0x36,0x5f,0x42,0x4f,0x4f,0x54,0x4c,0x4f,0x41,0x44,0x45, +0x26,0x40,0xd9,0xbf,0x38,0xce,0xc7,0x31,0xd5,0xbe,0x2a,0x41,0xff,0x0, 0xff,0x0, +0x0, 0x0, 0x0, 0x0, 0xff,0xff,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80,0xb6, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x31,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xe8,0x2, 0x4f,0xa1,0xe2,0x0, 0xcf,0xe6,0x1, 0x35,0x2, 0x88,0xe2,0x0, 0xcf,0x83, +0x1, 0x2b,0xe2,0x0, 0xcf,0x85,0x1, 0x14,0x0, 0xbd,0xe2,0x1, 0xcf,0x90,0x1, 0x8, +0xe2,0x1, 0xcf,0xcc,0x1, 0x27,0xe2,0x0, 0xcf,0xea,0x1, 0xb4,0x0, 0xa6,0xe2,0x0, +0xcc,0x1, 0x2, 0xb0,0xea,0x0, 0x7f,0xd0,0x3c,0x1f,0x8c,0x8, 0x38,0x82,0x2c,0x4, +0xe8,0x0, 0x64,0x46,0x0, 0xa4,0xe2,0x0, 0xcc,0x1, 0x1, 0x86,0xe8,0x0, 0x67,0xc6, +0xe0,0x8, 0x37,0xc8,0x0, 0x9c,0xe2,0x0, 0xcc,0x2, 0x1, 0x9c,0xe8,0x0, 0x67,0xc6, +0xe4,0x8, 0x37,0xc0,0x0, 0x94,0xe8,0x2, 0x67,0xca,0x3c,0x1f,0xe0,0x1, 0x8c,0x8, +0x38,0x82,0xe8,0x2, 0x4c,0x38,0x38,0x82,0x2c,0x5, 0xe8,0x1, 0x5c,0xe, 0x34,0x48, +0x38,0x82,0xe2,0x0, 0xcc,0x1, 0x1, 0x86,0xe8,0x1, 0x5c,0xe, 0xe2,0x1, 0xc4,0x7f, +0x38,0x82,0xe0,0x1, 0x14,0x6b,0x38,0x82,0x17,0x0, 0xe8,0x2, 0x6f,0x23,0xe8,0x2, +0x4f,0xa1,0xe2,0x0, 0xcf,0xe4,0xe0,0x2, 0x1, 0x2, 0x2, 0xa6,0xe2,0x0, 0xcf,0x87, +0xe0,0x1, 0x1, 0x5a,0x2, 0x8f,0xe2,0x0, 0xcf,0x83,0xe0,0x1, 0x1, 0x27,0xe2,0x0, +0xcf,0x85,0xe0,0x1, 0x1, 0x70,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1, 0xa3,0xe0,0x1, +0x0, 0xea,0xe2,0x0, 0xcf,0x90,0xe0,0x1, 0x1, 0x63,0x2, 0x86,0xe2,0x0, 0xcf,0x89, +0xe0,0x1, 0x1, 0x52,0x38,0x82,0xe2,0x0, 0xcf,0xd5,0x1, 0x25,0xe2,0x0, 0xcf,0xe1, +0xe0,0x2, 0x1, 0x8, 0x38,0x82,0xe2,0x1, 0xcf,0x90,0x1, 0x20,0x2, 0x8c,0xe2,0x0, +0xcf,0xe6,0xe0,0x1, 0x1, 0x50,0xe0,0x1, 0x4, 0xd8,0xe2,0x0, 0xcf,0xea,0xe0,0x1, +0x1, 0x4a,0x38,0x82,0xe2,0x1, 0xcf,0xb0,0x1, 0x1f,0x2, 0x85,0xe2,0x1, 0xcf,0xaa, +0x1, 0xa, 0x38,0x82,0xe2,0x1, 0xcf,0xbf,0x1, 0x32,0xe2,0x1, 0xcf,0xcc,0xe0,0x1, +0x1, 0x3a,0x38,0x82,0xe8,0x2, 0x6f,0x38,0x38,0x82,0xe2,0x0, 0xcc,0x3, 0xe0,0x1, +0x2, 0xe9,0xe0,0x0, 0x1f,0x93,0xe8,0x2, 0x6f,0x38,0x3f,0x98,0xac,0x8f,0xe0,0x1, +0x24,0x2a,0xe0,0x1, 0x0, 0xdf,0xe2,0x0, 0xcc,0x3, 0xe0,0x1, 0x2, 0xdb,0xea,0x6, +0x7f,0x8e,0xe9,0xff,0xc7,0xfe,0x3c,0x1f,0x8c,0x8, 0x3c,0x1f,0x3c,0x2, 0x4, 0x4, +0xa, 0x18,0xe4,0x9, 0x34,0xa0,0x0, 0x85,0xe8,0x0, 0x67,0xc5,0x34,0xa8,0x3c,0x9f, +0xe8,0x0, 0x7c,0xc5,0x38,0x82,0xe8,0x0, 0x67,0xc5,0x0, 0xfa,0xe2,0x0, 0xcc,0x5, +0x2, 0xa3,0xea,0x6, 0x7f,0xc4,0xe9,0xff,0xc7,0xfe,0x34,0x21,0x3c,0x1f,0x9c,0x8, +0x3c,0x1f,0x3c,0x2, 0x1, 0x6c,0x0, 0x78,0x0, 0x98,0x0, 0xc, 0x0, 0x18,0x0, 0x22, +0xe8,0x2, 0x67,0x4a,0xa7,0x8e,0x3c,0x9f,0xbc,0x8e,0x38,0x82,0x34,0xa8,0xe8,0x2, +0x67,0xca,0xe0,0x1, 0x0, 0x96,0xe8,0x2, 0x67,0xca,0x9f,0x2f,0x3c,0x9e,0xb4,0xaf, +0x17,0x0, 0xb7,0x3f,0x38,0x82,0xe8,0x2, 0x67,0xca,0x16,0x81,0x9f,0x3f,0x3e,0x9e, +0xb6,0xbf,0x3f,0x1f,0xe0,0x1, 0xac,0x8e,0x9e,0xbf,0x9f,0x2f,0x3e,0xfe,0xe0,0x1, +0x4, 0x91,0xe8,0xa, 0x4e,0xa6,0x17,0x0, 0xe0,0x2e,0x3e,0x8e,0xe8,0x2, 0x7f,0xc6, +0x17,0x82,0xe8,0xa, 0x6f,0x26,0x0, 0xac,0xe2,0x0, 0xcc,0x2, 0x1, 0x18,0xe2,0x0, +0xcc,0x3, 0x1, 0x1b,0xe2,0x0, 0xcc,0x1, 0xe0,0x0, 0x1, 0xfc,0xe8,0xa, 0x4f,0xa6, +0x27,0x84,0xe0,0x0, 0x1f,0x8f,0x0, 0x83,0xe0,0x0, 0x1f,0x8e,0xe8,0x2, 0x7f,0xca, +0xe4,0x9, 0x34,0xa0,0xe8,0x2, 0x67,0xca,0xe0,0x0, 0x0, 0xd8,0xe8,0x2, 0x67,0x4a, +0x34,0xa8,0xa7,0x8e,0xe7,0xff,0x0, 0xb9,0xe8,0x2, 0x67,0xca,0xa7,0xf, 0x3c,0x9e, +0xbc,0x8f,0x17,0x1, 0xe8,0x2, 0x7f,0xc6,0x17,0x81,0xe8,0x2, 0x6f,0x23,0xe8,0x0, +0x7f,0xc2,0x38,0x82,0xe8,0x0, 0x67,0x9f,0x17,0x0, 0xe0,0x3, 0xb7,0x1f,0x17,0x80, +0xe0,0x2, 0x17,0x4, 0xbf,0x8e,0xe0,0x2, 0x17,0x8, 0xbf,0x8e,0x17,0x81,0xe8,0x2, +0x6f,0xa0,0x38,0x82,0xe2,0x0, 0xcc,0x1, 0x1, 0x84,0xe8,0x0, 0x6c,0xd3,0x38,0x82, +0xe2,0x0, 0xcc,0x2, 0x1, 0xbe,0xe8,0x2, 0x6c,0x9f,0x38,0x82,0xe8,0x2, 0x6c,0x9e, +0x38,0x82,0x17,0x1, 0xe8,0x2, 0x6f,0x23,0x38,0x82,0xe8,0x2, 0x6f,0x38,0x17,0x80, +0xe8,0x0, 0x7f,0xc4,0x38,0x82,0xc4,0x7f,0xe2,0x0, 0xcc,0x4, 0x2, 0xaa,0xea,0x8, +0x7f,0xf2,0xe9,0xff,0xc7,0xfe,0x3c,0x1f,0x8c,0x8, 0x3c,0x1f,0xe8,0x2, 0x67,0xca, +0x3c,0x2, 0x6, 0xc, 0x12,0x1a,0x20,0x0, 0xe4,0x9, 0x34,0xa0,0x0, 0x86,0xa7,0xf, +0x34,0xa8,0x0, 0x82,0xa7,0xf, 0x3c,0x9e,0xbc,0x8f,0x38,0x82,0x34,0xa8,0xb4,0xaf, +0x38,0x82,0x9f,0x2f,0x3c,0x9e,0xb4,0xaf,0x17,0x3, 0xe8,0x0, 0x7f,0x42,0x38,0x82, +0x17,0x84,0xe8,0x0, 0x7f,0xc2,0xe8,0x2, 0x6f,0x38,0x17,0x0, 0xe8,0x0, 0x7f,0x44, +0x38,0x82,0x8, 0xb2,0xe8,0x0, 0xc, 0x37,0xf8,0x0, 0xf, 0xbf,0x17,0x81,0xe8,0x0, +0x61,0x1c,0xe8,0x0, 0x6f,0xd4,0xa7,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x99,0xa7,0x2, +0x17,0xfe,0x3f,0xde,0xbf,0x82,0x8c,0xf2,0xe8,0x2, 0x4f,0xa2,0x2f,0x83,0xe8,0x2, +0x6c,0xa1,0xe8,0x2, 0x4c,0x22,0xde,0xa9,0xe8,0x2, 0x4f,0xa2,0xc7,0x81,0xe8,0x2, +0x6f,0xa2,0xe8,0x2, 0x4f,0xa3,0x27,0x84,0x14,0x0, 0xde,0x53,0xac,0x72,0xa7,0x82, +0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x8e,0xa7,0x2, 0x17,0xfd,0x3f,0xde,0xbf,0x82, +0xe8,0x2, 0x4f,0xa2,0xc7,0x81,0xe8,0x2, 0x6f,0xa2,0xe8,0x2, 0x4c,0x22,0xde,0x41, +0xac,0x72,0x17,0x88,0xe0,0x61,0x3f,0x91,0xf8,0x0, 0xf, 0xaf,0xf0,0x0, 0xb, 0xa8, +0x9, 0x21,0x38,0x0, 0xe, 0xbf,0xe8,0x0, 0x67,0x1c,0x17,0xfe,0xa6,0xbe,0x3f,0xdd, +0xbf,0xbe,0x17,0x80,0xe8,0x2, 0x6f,0xa2,0x17,0x90,0xe0,0x61,0x3f,0x91,0xf, 0xad, +0x38,0x0, 0x8, 0xb6,0xe1,0xff,0xc0,0x0, 0xe8,0x0, 0x67,0xc4,0x39,0xe8,0x3f,0x99, +0x39,0x69,0x3b,0x6a,0xe8,0x0, 0x7f,0xc4,0x21,0x27,0xe2,0x0, 0xc9,0x7f,0x2, 0x85, +0x3a,0xe2,0xe2,0x1, 0xc2,0xff,0x0, 0x83,0xe0,0x1, 0x12,0x80,0x3a,0x65,0xe2,0x1, +0xc2,0x7f,0x3c,0x63,0x3d,0x64,0xe2,0x0, 0x7c,0x84,0xd7,0xb0,0x39,0x24,0x8f,0x86, +0xe3,0xff,0xc1,0x7f,0x39,0x95,0xe2,0x0, 0x7e,0x84,0x17,0x0, 0xc7,0x1, 0xe1,0x80, +0x8e,0x1d,0xe3,0xff,0xc7,0x7f,0x3a,0x7e,0xe2,0xf, 0x3e,0x4f,0xe2,0x1, 0xc7,0xff, +0x2, 0xf6,0xaf,0x86,0x0, 0xda,0xe0,0x1, 0xc0,0x0, 0xb, 0x61,0xe8,0x0, 0x4f,0xd3, +0xe2,0x0, 0xcf,0x8b,0xe0,0x0, 0x1, 0xd1,0x8, 0xb6,0xe2,0x9f,0xcc,0x7f,0x3a,0xe8, +0xe0,0x0, 0x5, 0xca,0xe8,0x0, 0x67,0x45,0xe2,0xf0,0x17,0x80,0x3f,0x7f,0xe0,0x0, +0x2, 0xc3,0xe8,0x0, 0x67,0xc4,0x3b,0x69,0x39,0xea,0x2f,0x83,0xe8,0x2, 0x6f,0x84, +0xe8,0x0, 0x67,0xc4,0xe8,0x2, 0x4a,0x4, 0x3f,0x93,0xe2,0x0, 0xca,0x3, 0xe8,0x0, +0x7f,0xc4,0x2, 0x9a,0x17,0x84,0xe0,0x2, 0x3f,0xa4,0xe2,0x1, 0xc1,0x7f,0x39,0xf2, +0x3, 0x84,0x39,0x63,0xe2,0x1, 0xc1,0x7f,0xea,0x2, 0x7c,0x0, 0x3c,0xe6,0x3c,0x14, +0x3d,0x62,0x3a,0x12,0x39,0xa2,0xe0,0x0, 0xd9,0x21,0x3a,0x92,0xe8,0x2, 0x6a,0x4, +0x3b,0x12,0xe3,0xff,0xc1,0xff,0x21,0x85,0x3d,0x63,0x3c,0xe6,0x3c,0x65,0xd6,0xf7, +0xe8,0x0, 0x67,0x44,0xe8,0x0, 0x67,0xc5,0x3f,0x7f,0x1, 0x8d,0x15,0x4, 0xea,0x2, +0x7c,0x80,0xe0,0xa0,0x14,0x0, 0xd6,0xeb,0x17,0x80,0xe8,0x0, 0x7f,0xc4,0xb, 0x21, +0xe0,0x9, 0x0, 0x9f,0xb, 0x61,0x38,0x82,0x8, 0xb1,0xe8,0x0, 0x67,0xc2,0xc7,0xff, +0xe2,0x0, 0xcf,0x83,0xe0,0x0, 0x2, 0xe4,0xea,0xd, 0x7f,0xe, 0xe9,0xff,0xc7,0x7e, +0x3f,0x9e,0x8f,0x8f,0x3f,0x9e,0x17,0x0, 0xe8,0x0, 0x7f,0x42,0x3f,0x82,0x4c,0x4, +0x70,0x8e,0xe8,0x1, 0x77,0xe, 0xe8,0x0, 0x4f,0xd3,0xe8,0x2, 0x64,0xc6,0xe2,0x0, +0xcf,0x8b,0x1, 0x86,0xa4,0x9, 0x9d,0x29,0xc4,0x88,0xdf,0x89,0x0, 0x8b,0xa7,0x89, +0x9f,0x29,0x3f,0x9e,0xe2,0x20,0xcf,0x80,0x2, 0x85,0xa4,0x9, 0x9d,0x29,0xc4,0x88, +0xd6,0xb6,0xe8,0x2, 0x67,0xc6,0xa4,0xf, 0x9c,0xaf,0xe0,0x0, 0xd8,0xa9,0xe0,0x20, +0xc4,0x0, 0xe8,0x1, 0x74,0xe, 0xd5,0x23,0x0, 0xb2,0xe8,0x2, 0x64,0xc6,0xe0,0x2, +0x15,0x0, 0xe1,0x80,0xa4,0x29,0xd7,0x2, 0xe8,0x0, 0x4f,0xd4,0x27,0xa8,0xe8,0x2, +0x67,0x46,0xe8,0x0, 0x67,0x9c,0xe0,0x1, 0x87,0xe, 0xaf,0x7f,0x0, 0xa0,0xe8,0x2, +0x67,0xc6,0xe8,0x1, 0x77,0xe, 0xea,0x2, 0x7d,0x38,0xa4,0xf, 0x9c,0xaf,0xdf,0x22, +0xd5,0x6, 0xe7,0xe0,0x17,0x55,0xe8,0x1, 0x77,0xe, 0x0, 0x91,0xe8,0x1, 0x77,0xe, +0xe8,0x0, 0x4f,0xd3,0xe2,0x0, 0xcf,0x8b,0x1, 0x83,0xd3,0x49,0x0, 0x83,0x14,0x0, +0xd6,0xbb,0xd4,0xf5,0xe7,0xe1,0x17,0xaa,0xe8,0x1, 0x77,0x8e,0xe8,0x2, 0x4f,0xa0, +0x27,0x89,0xe0,0x27,0x14,0x8, 0xd4,0xdc,0xe8,0x0, 0x67,0x9f,0x17,0x7f,0xe0,0x7, +0xaf,0x3f,0x8, 0xe1,0xe0,0x0, 0x1f,0x83,0xe0,0x2, 0x8f,0xf, 0xe0,0x2, 0x8e,0x9f, +0x3e,0x9e,0xe2,0x1, 0xce,0xff,0x1, 0x84,0xe2,0x0, 0xcf,0x4, 0x5, 0x8e,0xe0,0x0, +0x1f,0x88,0xe0,0x2, 0x8f,0xf, 0xe0,0x2, 0x8e,0x9f,0x3e,0x9e,0xe2,0x1, 0xce,0xff, +0x1, 0x9c,0xe2,0x0, 0xcf,0x4, 0x2, 0x99,0xe0,0x2, 0x8e,0x2f,0xe0,0x2, 0x8e,0xbf, +0x3e,0x9c,0xe2,0x1, 0xce,0xff,0x1, 0x91,0xe0,0x2, 0x8e,0xcf,0xe0,0x2, 0x8f,0xdf, +0x3f,0x9d,0xe2,0x1, 0xcf,0xff,0x1, 0x89,0xe8,0x2, 0x6f,0x26,0x14,0x1, 0xe8,0x2, +0x6e,0x25,0xe8,0x2, 0x6e,0xa4,0x38,0x82,0x14,0x0, 0x38,0x82,0xc0,0x78,0xe8,0x0, +0x66,0xa0,0xe0,0x0, 0x17,0x50,0xa7,0x9d,0x16,0x4, 0xcf,0x90,0xbf,0x9d,0x3e,0x10, +0xe8,0x0, 0x67,0x99,0xe1,0x2, 0x15,0x5, 0xb7,0x5f,0x8d,0xff,0xb7,0x5f,0xe0,0x0, +0x17,0x5a,0xaf,0x3f,0xe0,0x0, 0x17,0x51,0xb7,0x5f,0x17,0x2, 0xaf,0x3f,0xe1,0x2, +0x17,0x0, 0xb7,0x5f,0xc7,0x1, 0x8c,0xff,0xe3,0xff,0xc7,0x7f,0x3f,0x7a,0xe1,0x80, +0xac,0x9c,0x1, 0xf8,0xe2,0x0, 0xcd,0xda,0x1, 0x6, 0xe0,0x0, 0x17,0x50,0xb7,0x5f, +0x17,0x0, 0xaf,0x3f,0x17,0xef,0xa7,0x1d,0x3f,0xde,0xbf,0x9d,0xe2,0x0, 0x7f,0x88, +0x3c,0x1f,0xe0,0x40,0x8c,0x48,0xc0,0x8, 0x38,0x82,0x16,0x80,0xe8,0x0, 0x67,0x9f, +0xae,0x88,0xe0,0x1, 0xa7,0xff,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0x93,0xe8,0x0, +0x67,0xa0,0xe0,0x0, 0x16,0xd4,0xa7,0x1f,0xcf,0x10,0xbf,0x1f,0xe8,0x0, 0x67,0x19, +0xb6,0xde,0x8f,0x7e,0xe2,0x0, 0xc7,0x3, 0xaf,0x8, 0x17,0x6f,0xa6,0x9f,0x3f,0x5d, +0xbf,0x1f,0x38,0x82,0x8, 0xb5,0xc0,0x7c,0xdf,0x76,0x2c,0x4, 0x12,0x82,0x14,0x0, +0x0, 0x90,0xe8,0x2, 0x4c,0x26,0xdf,0xa3,0xe8,0x2, 0x6c,0x27,0xe8,0x2, 0x4f,0x27, +0xe8,0x2, 0x4f,0xa4,0x3f,0x7f,0x1, 0xf3,0xe0,0xf, 0x12,0xc2,0xe0,0xf, 0x14,0x40, +0x15,0x4, 0xe2,0x0, 0x7c,0x84,0xd6,0x2a,0x49,0x6, 0x4f,0x87,0x31,0x28,0x39,0x1f, +0xe3,0xff,0xc1,0x7f,0x17,0xf8,0x3f,0x92,0xe2,0x1e,0xcf,0xf7,0x2, 0xa3,0xc1,0x7e, +0xe3,0xff,0xc1,0x7f,0xe0,0x0, 0x1c,0x8d,0x3c,0x65,0x3d,0x62,0x4a,0x4, 0x49,0x85, +0xe8,0x1, 0x71,0x16,0xd6,0x13,0xe0,0x0, 0x1c,0xc, 0x32,0x28,0x34,0x41,0x15,0x0, +0xe0,0x9, 0x31,0x41,0xe3,0xff,0xc4,0x7f,0x39,0x94,0xe0,0xb, 0xd7,0xeb,0xe3,0xff, +0xc1,0xff,0x39,0xf8,0xe0,0x0, 0x1a,0x8d,0x1, 0x7, 0x14,0x0, 0xbc,0x5, 0xbc,0x15, +0x0, 0x84,0x14,0x0, 0x0, 0x82,0x14,0x1, 0xc0,0x4, 0xa, 0xe1,0x8, 0xb2,0x11,0x3, +0xdf,0xb2,0xe8,0x2, 0x6c,0x2e,0xe8,0x2, 0x4f,0xae,0x2f,0x85,0xc1,0x7f,0xe2,0x1, +0xc1,0x7f,0x29,0x77,0x9, 0x61,0xe8,0x0, 0x67,0x20,0xe0,0x0, 0x16,0xd0,0xa7,0x9e, +0xe0,0x0, 0x16,0x5a,0xcf,0x90,0xbf,0x9e,0xe8,0x0, 0x67,0x99,0xb6,0xdf,0x8d,0xff, +0xb6,0xdf,0xe2,0x0, 0xcd,0xda,0xae,0x3f,0xe7,0x24,0x16,0x10,0xb6,0x5f,0x16,0x0, +0xae,0x3f,0x1, 0x3, 0xb6,0xdf,0xae,0x3f,0x17,0xef,0xa6,0x9e,0x3f,0xdd,0xbf,0x9e, +0x38,0x82,0x8, 0xb3,0xe8,0x0, 0x61,0x19,0xe0,0x0, 0x16,0xd4,0xb6,0xd2,0x17,0x3, +0xaf,0x32,0x8f,0x88,0x8f,0x18,0x37,0xa8,0x3f,0x9e,0xe3,0xff,0xc7,0xff,0x17,0x74, +0x3f,0x1f,0xe2,0x1e,0xcf,0x74,0x5, 0x84,0x14,0x1, 0xe0,0x0, 0x0, 0xfb,0xe0,0x0, +0x16,0xd0,0xc7,0xfe,0xb6,0xd2,0xe0,0x0, 0x17,0x5a,0x16,0x0, 0xe3,0xff,0xc7,0xff, +0x15,0x7d,0xaf,0x32,0x3e,0xec,0x3d,0xec,0x17,0x8, 0x3d,0x1f,0x2d,0x93,0xe0,0xb, +0x3c,0x1e,0x8e,0x8b,0x8e,0x1b,0x36,0xa8,0x3e,0x9c,0x8e,0x2b,0x8d,0xbb,0x36,0x28, +0x3e,0x1b,0xc7,0x4, 0xe3,0xff,0xc6,0xff,0xe3,0xff,0xc6,0x7f,0xe3,0xff,0xc7,0x7f, +0x15,0x84,0xe0,0x9, 0x3c,0x1e,0x8c,0x89,0xb6,0xd2,0xc5,0x81,0xac,0xb2,0x14,0x83, +0xe3,0xff,0xc5,0xff,0x3c,0x9c,0x3c,0xfb,0xc6,0x81,0xc7,0x1, 0xe3,0xff,0xc6,0xff, +0xe3,0xff,0xc7,0x7f,0x3, 0x5, 0x3d,0x7e,0x2, 0x2, 0x3f,0x6f,0x15,0x80,0x3f,0xfe, +0x2, 0xd6,0xe7,0x24,0x17,0x82,0xb7,0xd2,0xe7,0x24,0x16,0x83,0x8f,0x72,0xe7,0x24, +0x17,0x84,0xb6,0xd2,0xe4,0xc, 0x37,0x28,0xe7,0x24,0x16,0x85,0x8f,0x72,0xb7,0xd2, +0xe4,0xe, 0x37,0x20,0x8f,0xf2,0xb6,0xd2,0x3f,0x1c,0x8e,0xf2,0x37,0xa8,0x3f,0x1d, +0x3f,0x9e,0xa7,0x18,0xe0,0x0, 0x16,0xd0,0xb6,0xd2,0x3f,0xfe,0x16,0x80,0xae,0xb2, +0xe7,0xff,0x1, 0xa4,0xe0,0x0, 0x17,0xf0,0xb7,0xd2,0x17,0x2a,0xae,0xb2,0x39,0xe8, +0xb7,0xd2,0xe0,0x27,0x14,0x8, 0xaf,0x32,0xd3,0x5b,0xe0,0x0, 0x17,0xf6,0xb7,0xd2, +0xe0,0x0, 0x16,0xf5,0x8c,0x72,0xb6,0xd2,0x34,0x28,0x8f,0x23,0x8f,0xf2,0xe0,0xd, +0x37,0x28,0x8f,0x33,0x3c,0x1f,0x3f,0x1d,0xe3,0xff,0xc4,0x7f,0xe1,0x28,0x3f,0x8, +0x9, 0xe1,0x8, 0xb5,0xe8,0x0, 0x61,0xa0,0x3a,0x68,0x11,0x3, 0x12,0xef,0xa7,0x93, +0x3c,0x64,0xcf,0x90,0xbf,0x93,0xdf,0x66,0xa7,0x93,0x3f,0xd5,0xbf,0x93,0x24,0x5, +0xc1,0x7f,0xe2,0x1, 0xc1,0x7f,0x29,0x74,0xa, 0xe1,0x8, 0xb4,0xe8,0x0, 0x4f,0xd9, +0x39,0x68,0xe2,0x0, 0xcf,0x81,0x1, 0xaa,0xe1,0x11,0x14,0x2a,0xe0,0xb, 0xd8,0x56, +0xe0,0xb, 0xd7,0x54,0x3a,0x68,0x2c,0x7d,0xe8,0x0, 0x61,0x9f,0xe0,0x1, 0x14,0x14, +0xe0,0x2, 0x9f,0x93,0xe3,0xff,0xc7,0xfe,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd7,0x2c, +0x3c,0x64,0xe0,0xb, 0xd7,0x29,0xac,0x2, 0xe8,0x2, 0x4f,0xae,0x27,0x85,0xe8,0x2, +0x4f,0x29,0x8f,0x82,0x3f,0xce,0xaf,0x82,0x8c,0x2, 0xe0,0xb, 0xd7,0x1d,0xe0,0x2, +0x9f,0x93,0xcf,0x81,0xe0,0x2, 0xb7,0x93,0x0, 0xac,0x2f,0xa8,0xe1,0x11,0x14,0x2a, +0xe0,0xb, 0xd8,0x2c,0xe8,0x0, 0x67,0x9f,0xe0,0x2, 0x9f,0x1f,0xe2,0xff,0xc7,0x7f, +0xe0,0x2, 0xb7,0x1f,0xe0,0x2, 0x9f,0x1f,0xcf,0x4, 0xe0,0x2, 0xb7,0x1f,0xe8,0x2, +0x4f,0x49,0x27,0x7e,0x17,0x0, 0xe8,0x2, 0x6f,0x49,0xe0,0x2, 0x9f,0x1f,0xe1,0x0, +0xcf,0x0, 0xe0,0x2, 0xb7,0x1f,0xe0,0x2, 0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x2, +0xb7,0x1f,0xe0,0x0, 0x1f,0x84,0x87,0x8f,0x0, 0x83,0xe8,0x2, 0x47,0xa9,0xaf,0x82, +0xa, 0x61,0x8, 0xb7,0xf8,0x0, 0xc, 0x3d,0xc0,0x7c,0x17,0x80,0xe2,0x0, 0x79,0x4, +0xe0,0x80,0xaf,0xb2,0xde,0xcc,0xea,0x2, 0x7c,0x29,0xde,0x60,0x3c,0x62,0xdf,0x96, +0x4f,0x87,0xe0,0x0, 0x27,0xf9,0xe8,0x0, 0x4f,0xd9,0xe2,0x0, 0xcf,0x81,0x1, 0x10, +0xe0,0x0, 0x1c,0xd, 0xdf,0x77,0xe8,0x2, 0x6c,0x29,0x14,0x7, 0x3c,0x10,0xdf,0x86, +0xe8,0x0, 0x4f,0xd8,0xe0,0x0, 0x27,0xe8,0xde,0xbf,0xe0,0x0, 0x0, 0xe5,0xe0,0x0, +0x1a,0xc, 0x11,0x80,0x32,0x42,0xe8,0x0, 0x61,0x17,0xe3,0xff,0xc2,0x7f,0xe0,0x7, +0x13,0x60,0x13,0xfc,0xf0,0xe, 0x14,0x41,0xf0,0x0, 0x14,0x9f,0xf0,0x0, 0x15,0x60, +0xf0,0x40,0x3d,0xe3,0xf0,0xe, 0x16,0x1, 0xe1,0x33,0x14,0x3b,0xe0,0xb, 0xd7,0xc6, +0xe0,0xb, 0xd6,0xc4,0x2c,0x7e,0xe0,0x1, 0xb2,0x12,0xe0,0x1, 0xb3,0x32,0xa7,0xe2, +0x3f,0xd7,0xcf,0x82,0xbf,0xe2,0xf0,0x0, 0xbc,0x2, 0xf0,0x0, 0xbc,0xb2,0xa7,0x92, +0x37,0xca,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x12,0x17,0xfe,0x3f,0xde,0xbf,0x92, +0xa7,0x82,0xe0,0x1, 0xcf,0x80,0xbf,0x82,0xe0,0xb, 0xd6,0xa8,0x24,0x7e,0xf0,0x0, +0xbd,0x12,0xf0,0x0, 0xbd,0xb2,0xf0,0x0, 0xbe,0x2, 0xe0,0xb, 0xd6,0x9f,0x3a,0xe8, +0x2c,0x7d,0xf8,0x0, 0x66,0x9f,0x14,0x5, 0xe8,0x2, 0x9f,0x9d,0xc1,0x81,0xe3,0xff, +0xc7,0xfe,0xe8,0x2, 0xb7,0x9d,0xe0,0xb, 0xd6,0x77,0x3c,0x65,0xe0,0xb, 0xd6,0x74, +0xe8,0x2, 0x9f,0x9d,0xe0,0x28,0x3c,0x5, 0xcf,0x81,0xe8,0x2, 0xb7,0x9d,0xe2,0x1, +0xc1,0xff,0xe7,0xff,0x24,0x17,0x17,0x82,0xe1,0x2f,0x3f,0xa3,0xe7,0xff,0x2f,0xb6, +0xe7,0xff,0x0, 0x90,0xc0,0x4, 0xf8,0x0, 0xe, 0xa8,0xb, 0xe1,0x8, 0xb7,0xf8,0x0, +0xc, 0x3c,0xc0,0x7c,0xe8,0x0, 0x61,0x1f,0xe2,0x0, 0x79,0x84,0x17,0x80,0xe0,0x80, +0xaf,0xb3,0xea,0x2, 0x7c,0x28,0xe0,0x2, 0x9f,0x92,0xe1,0x0, 0xcf,0x80,0xe0,0x2, +0xb7,0x92,0xdd,0xcc,0x3c,0x63,0xdf,0x2, 0x4f,0x87,0xe0,0x1, 0x27,0x86,0xe0,0x0, +0x1a,0xc, 0xe8,0x0, 0x61,0x97,0x32,0x42,0xe3,0xff,0xc2,0x7f,0x12,0x83,0xf0,0x7, +0x14,0x60,0xf7,0xff,0x14,0xfc,0xf0,0xe, 0x15,0x0, 0xe7,0x0, 0x13,0x0, 0x13,0xfb, +0xf0,0x0, 0x15,0xe0,0xf0,0x1e,0x16,0x10,0xe1,0x33,0x14,0x3b,0xe0,0xb, 0xd7,0x46, +0xe0,0x1, 0xb2,0x13,0xf0,0x1, 0xb4,0x33,0xa7,0xe3,0xe8,0xf, 0x3f,0xd9,0xcf,0x82, +0xbf,0xe3,0x17,0x97,0xf0,0x0, 0xbd,0x3, 0xbf,0xb3,0xa7,0x83,0xe0,0x10,0xcf,0x80, +0xbf,0x83,0xe0,0x2, 0x9f,0x92,0xe2,0xff,0xc7,0xff,0xe0,0x2, 0xb7,0x92,0xe0,0x2, +0x9f,0x92,0xcf,0x84,0xe0,0x2, 0xb7,0x92,0xa7,0x93,0x37,0xca,0xe2,0x0, 0xc7,0x81, +0x27,0xfc,0xa7,0x93,0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x2f,0x84,0x17,0x81,0xe8,0x2, +0x6f,0xaa,0xe0,0x2, 0x9f,0x92,0x3f,0xc6,0xe0,0x2, 0xb7,0x92,0xe0,0x2, 0x9f,0x92, +0x3f,0xd7,0xe0,0x2, 0xb7,0x92,0x17,0x80,0xf0,0x0, 0xbd,0x93,0xbf,0xb3,0xf0,0x0, +0xbe,0x3, 0xe8,0x2, 0x6f,0xc9,0xe0,0x2, 0x9f,0x92,0xe2,0xff,0xc7,0xff,0xe0,0x2, +0xb7,0x92,0xe0,0x2, 0x9f,0x92,0xcf,0x84,0xe0,0x2, 0xb7,0x92,0xe8,0x2, 0x4f,0xc9, +0x27,0xfe,0x17,0x80,0xe8,0x2, 0x6f,0xc9,0xe0,0x2, 0x9f,0x92,0x3f,0xc6,0xe0,0x2, +0xb7,0x92,0xe0,0x2, 0x9f,0x92,0x3f,0xd7,0xe0,0x2, 0xb7,0x92,0xe8,0x2, 0x4f,0xaa, +0x2f,0x84,0xc2,0xff,0xe7,0xff,0x2a,0xa2,0xe8,0x2, 0x4f,0xaa,0x27,0x8d,0xe0,0x0, +0x1c,0xd, 0x17,0x80,0xe8,0x2, 0x6f,0xaa,0xde,0x6d,0xe8,0x2, 0x6c,0x28,0xdd,0xbc, +0x14,0x7, 0x3c,0x10,0xde,0x7b,0xc0,0x4, 0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe8,0x0, +0x4f,0xd9,0x2f,0x83,0xe7,0xfe,0x0, 0xdc,0xe7,0xfd,0x0, 0xcd,0x8, 0xb2,0x11,0x5, +0x3c,0x62,0xc1,0x1, 0xd3,0x71,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, 0xc9,0x1d,0x1, 0xf9, +0x9, 0x61,0xe2,0xff,0x17,0xf0,0xa7,0xf, 0xe0,0x0, 0x1f,0xa1,0x3f,0x7f,0x1, 0x97, +0xe2,0xff,0x17,0xf4,0xa7,0xf, 0xe0,0x0, 0x1f,0xa2,0x3f,0x7f,0x1, 0x90,0xe2,0xff, +0x17,0xf8,0xa7,0xf, 0xe0,0x0, 0x1f,0xa3,0x3f,0x7f,0x1, 0x89,0xe2,0xff,0x17,0xfc, +0xa4,0xf, 0xe0,0x0, 0x1f,0xa4,0xe0,0x28,0x3c,0xf, 0x38,0x82,0x14,0x0, 0x38,0x82, +0xe8,0x0, 0x4f,0xd9,0x27,0x9b,0x8, 0xb1,0xe8,0x0, 0x67,0x9f,0xe0,0x1, 0xa7,0xef, +0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x27,0x85,0xe2,0xff,0x17,0xf8,0x17,0x0, 0xbf,0xf, +0xdf,0xd1,0x24,0x9, 0xe2,0xff,0x17,0xf8,0x17,0x0, 0xbf,0xf, 0x17,0x81,0xe8,0x2, +0x6f,0xb0,0x0, 0x83,0xe8,0x2, 0x6c,0x30,0x8, 0xe1,0x38,0x82,0xe8,0x2, 0x4c,0x30, +0x38,0x82,0x8, 0xb1,0xd5,0x7d,0xe0,0x60,0x3f,0x87,0xe0,0x0, 0x1f,0x9, 0xe0,0x1, +0xbf,0x3f,0xe0,0x0, 0x1f,0x11,0xe0,0x1, 0xbf,0x4f,0xe0,0x0, 0x1f,0x5, 0xe0,0x1, +0xbf,0x6f,0xe0,0x0, 0x1f,0x6, 0xe0,0x2, 0xbf,0x4f,0x8, 0xe1,0xe0,0x0, 0x1e,0xa5, +0xe0,0x2, 0x9f,0x9d,0xe2,0x2, 0xc7,0x80,0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0, +0x27,0x93,0xe0,0x2, 0x9f,0x9d,0x37,0xc9,0xe2,0x0, 0xc7,0x81,0xe8,0x0, 0x6f,0xd9, +0xe4,0x0, 0xcf,0x81,0xa6,0xd, 0xe0,0xe, 0x37,0xa9,0xe7,0xfb,0x17,0xff,0x3f,0xdc, +0x3f,0xce,0xbf,0x8d,0x38,0x82,0x17,0x83,0xe8,0x0, 0x6f,0xd9,0x38,0x82,0xe0,0x0, +0x1f,0xa5,0x17,0x7f,0xb7,0x5f,0xe0,0x1, 0xb7,0x5f,0xe0,0x1e,0x17,0x3, 0xb7,0x3f, +0xe8,0x0, 0x4f,0x59,0x27,0xf, 0xe0,0xa0,0x17,0x14,0xb7,0x7f,0xe0,0x20,0x17,0x4, +0xe0,0x1, 0xb7,0x1f,0xe0,0x1, 0x9f,0x7f,0xe3,0xff,0xc7,0x7b,0xe0,0x1, 0xb7,0x7f, +0x0, 0x90,0x17,0x4, 0xb7,0x7f,0xe0,0x1, 0xb7,0x1f,0xe0,0x1, 0x9f,0x7f,0xcf,0x4, +0xe0,0x1, 0xb7,0x7f,0xe0,0x2, 0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x2, 0xb7,0x1f, +0xa7,0xf, 0xe0,0x10,0xcf,0x0, 0xbf,0xf, 0x17,0x7b,0xe0,0x1, 0xb7,0x3f,0xeb,0x0, +0xcf,0x80,0xa6,0xaf,0x17,0x78,0x3f,0x5d,0xbf,0x2f,0xe1,0x80,0x17,0xb, 0xbf,0x1f, +0x38,0x82,0x8f,0x8, 0x8f,0x98,0xe0,0x1, 0x14,0x7f,0x3f,0x9e,0xe0,0x28,0x3f,0x88, +0x38,0x82,0x8, 0xb4,0xe0,0x0, 0x19,0x83,0x39,0x68,0x39,0x98,0x3c,0x63,0x3a,0x69, +0xdf,0xf1,0x24,0x3, 0x8f,0x83,0x0, 0x88,0xe0,0x0, 0x1f,0x88,0x39,0x1f,0x3c,0x62, +0xdf,0xe9,0x24,0x3, 0x8f,0x82,0xaf,0x84,0xa, 0x61,0xe8,0x0, 0x4f,0xd9,0x27,0x97, +0x8, 0xb1,0xe0,0x0, 0x1c,0x83,0x15,0x16,0xe0,0x1f,0x14,0x0, 0xd2,0xb7,0xe0,0x0, +0x1c,0x88,0x15,0x16,0xe0,0x22,0x14,0x20,0xd2,0xb1,0xea,0x0, 0x7c,0xda,0x14,0x0, +0xdf,0xd9,0xea,0x0, 0x7c,0xd8,0x14,0xe, 0x8, 0xa1,0x0, 0xd4,0x38,0x82,0xe8,0x0, +0x4f,0xd9,0x27,0x9e,0x8, 0xb1,0xc0,0x7c,0x14,0x86,0x15,0x2, 0x3c,0x90,0xe0,0x1f, +0x14,0x0, 0xd2,0x9c,0x5f,0x3, 0xe1,0xff,0x17,0xff,0x3f,0x7f,0x1, 0x8f,0xe0,0x0, +0x1c,0x88,0xe0,0x1, 0x15,0x0, 0xe0,0xa2,0x14,0x20,0xd2,0x90,0xe0,0x0, 0x1c,0x88, +0xe0,0x1, 0x15,0x0, 0xe0,0x1f,0x14,0x0, 0xd2,0x2a,0xc0,0x4, 0x8, 0xe1,0x38,0x82, +0xe0,0x0, 0x1f,0xa6,0x17,0x0, 0xaf,0x7f,0x17,0x7c,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, +0x17,0x88,0xe0,0x61,0x3f,0x91,0x17,0x90,0xe0,0x61,0x3f,0x91,0x38,0x82,0x8, 0xb1, +0xeb,0x0, 0xcf,0x0, 0xa7,0x9e,0xcf,0xc0,0xbf,0x9e,0xdf,0xeb,0xe8,0x0, 0x4f,0xd9, +0x27,0x92,0xe8,0x0, 0x47,0xda,0xe0,0x0, 0x1f,0x26,0xe2,0x1, 0xc7,0xfe,0xe0,0x1, +0xaf,0xbe,0xe0,0x61,0x3f,0x82,0xcf,0x88,0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82, +0xcf,0x90,0x0, 0x8b,0xe0,0x61,0x3f,0x2, 0x17,0xf7,0x3f,0xde,0xe0,0x61,0x3f,0x92, +0xe0,0x61,0x3f,0x2, 0x17,0xef,0x3f,0xde,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0xe, 0xbf, +0xe8,0x0, 0x67,0xcf,0xe0,0x0, 0x1f,0x27,0xc7,0x81,0xe8,0x0, 0x7f,0xcf,0x17,0xdf, +0xa6,0xbe,0x3f,0xdd,0xbf,0xbe,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xad, +0x38,0x0, 0xe0,0x0, 0x1f,0x27,0x17,0x80,0xe8,0x0, 0x7f,0xcf,0x17,0x81,0xbf,0xbe, +0x17,0xfc,0xa6,0xae,0x3f,0xdd,0xcf,0x82,0xbf,0xae,0xe0,0x2, 0x17,0x80,0xb7,0x9e, +0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xe0,0x61,0x3f,0x82,0xe0,0x20,0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x0, 0x1f,0xa7,0x17,0x6f,0xa6,0xbf,0x3f,0x5d, +0xbf,0x3f,0x17,0x0, 0xe8,0x0, 0x7f,0x4f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0x38,0x82, +0xe0,0x0, 0x1f,0x27,0x17,0xef,0xa6,0xbe,0x3f,0xdd,0xbf,0xbe,0x17,0x80,0xe8,0x0, +0x7f,0xcf,0x38,0x82,0xe0,0x0, 0x1f,0xa7,0x17,0x0, 0xbf,0x3f,0xb7,0x1f,0x17,0x7c, +0xa6,0xaf,0x3f,0x5d,0xbf,0x2f,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xe0,0x61, +0x3f,0x2, 0xe7,0xdf,0x17,0xff,0x3f,0xde,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe1,0xff, +0x17,0x7f,0xc4,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7e,0x1, 0x8, 0x17,0x89,0xc7,0xff, +0xe2,0x1, 0xc7,0xff,0x27,0xf7,0x0, 0x0, 0x0, 0xfb,0x38,0x82,0xc0,0x7c,0xe0,0xa0, +0x17,0x80,0x7f,0x81,0xe8,0x2, 0x4f,0x9e,0x27,0x93,0xe0,0x0, 0x1f,0xa5,0xe0,0x1, +0x9f,0x1f,0xe3,0xff,0xc7,0x7b,0xe0,0x1, 0xb7,0x1f,0x16,0xff,0x67,0x1, 0x3e,0x9e, +0x7e,0x81,0x2f,0x7c,0xe0,0x1, 0x9f,0x1f,0xcf,0x4, 0xe0,0x1, 0xb7,0x1f,0xc0,0x4, +0x38,0x82,0xe0,0x0, 0x1f,0xa8,0xa7,0x2f,0xe2,0x0, 0xc7,0x7f,0x27,0xd, 0xa6,0xaf, +0xe7,0xff,0x17,0x0, 0x3f,0x5d,0xcf,0x60,0xbf,0x2f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f, +0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x38,0x82,0xe0,0x0, 0x1f,0xa8,0xa7,0x1f,0xcf,0x1, +0xbf,0x1f,0xe7,0xff,0x17,0x3f,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0x8, 0xb1, +0xdf,0xf4,0xe8,0x0, 0x4f,0xd9,0x27,0x96,0xe0,0x0, 0x1f,0xa8,0xa7,0x2f,0xe0,0x1, +0xcf,0x0, 0xbf,0x2f,0xe7,0xff,0x17,0x0, 0xa6,0xaf,0x3f,0x5d,0xcf,0x60,0xbf,0x2f, +0xa7,0x1f,0xcf,0x2, 0xbf,0x1f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0xa7,0xf, 0xcf,0x40, +0xbf,0xf, 0xe0,0x61,0x3f,0x2, 0xe7,0xf7,0x17,0xff,0x3f,0xde,0xe0,0x61,0x3f,0x92, +0x8, 0xe1,0xe0,0x0, 0x1d,0x8b,0x17,0x80,0x16,0x1, 0xe0,0xe, 0x3d,0x9f,0xc7,0x81, +0xe2,0x0, 0xcf,0x90,0xae,0xe, 0xe0,0x0, 0x1e,0x8b,0x1, 0xf8,0x17,0x83,0xaf,0xbd, +0x17,0x2, 0xaf,0xcd,0x14,0x1, 0xaf,0x6d,0x17,0x0, 0xe0,0x0, 0x1d,0x10,0x3c,0xee, +0xe0,0xf, 0x37,0x22,0x3f,0x9a,0xbc,0x8f,0x16,0x0, 0xe0,0x17,0x3e,0x9e,0xe0,0xb, +0x3e,0x9c,0xf0,0x0, 0x8b,0xb, 0xe8,0x0, 0x8d,0x87,0xf0,0x40,0x3b,0x7b,0x5, 0x87, +0xa5,0x8f,0xe0,0x16,0x34,0x3c,0xe8,0xb, 0x3d,0xc6,0xbd,0x8f,0xc6,0x1, 0xe2,0x0, +0xce,0x10,0x1, 0xee,0xc7,0x1, 0xe2,0x0, 0xcf,0x10,0x1, 0xe3,0xe0,0x0, 0x1f,0x8a, +0x17,0x0, 0xe0,0x6, 0xaf,0xf, 0x38,0x82,0xe8,0x0, 0x4f,0xd9,0x27,0x98,0xe8,0x0, +0x67,0x20,0xa7,0x9e,0xcf,0x81,0xbf,0x9e,0xe8,0x0, 0x67,0x1f,0x9f,0xbe,0xe0,0x1e, +0xcf,0x80,0xb7,0xbe,0xe0,0x61,0x3f,0x2, 0xe7,0xef,0x17,0xff,0x3f,0xde,0xe0,0x61, +0x3f,0x92,0xe8,0x0, 0x67,0x9a,0xe0,0x6, 0x17,0x6, 0xbf,0xf, 0x38,0x82,0xe8,0x0, +0x67,0x9a,0x17,0x0, 0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c, +0xa6,0x8f,0xe7,0x7f,0x17,0x7f,0x3f,0x5d,0xbf,0xf, 0x8c,0x7f,0x38,0x82,0x8, 0xb2, +0xe8,0x0, 0x61,0x1a,0x17,0xfb,0xa7,0x2, 0xe2,0x0, 0xcc,0x1, 0x3f,0xde,0xbf,0x82, +0x1, 0x83,0x14,0x6, 0x0, 0x82,0x14,0x4, 0xe0,0xb, 0xd2,0xa4,0xa7,0x82,0xcf,0x84, +0xbf,0x82,0x9, 0x61,0x8, 0xb2,0xe8,0x0, 0x61,0x1a,0x17,0xfb,0xa7,0x2, 0x14,0x5, +0x3f,0xde,0xbf,0x82,0xe0,0xb, 0xd2,0x96,0xdf,0xd3,0xa7,0x82,0xe2,0x0, 0xc4,0x1, +0xcf,0x84,0xbf,0x82,0x9, 0x61,0x8, 0xb4,0xe8,0x0, 0x61,0x9a,0x17,0xfb,0xa7,0x3, +0xe0,0x1, 0x14,0x1f,0x3f,0xde,0xbf,0x83,0xe0,0xb, 0xd2,0x84,0xdf,0xc1,0x3a,0x68, +0xdf,0xbf,0xe4,0x2, 0x34,0x28,0xe4,0x2, 0x31,0x40,0xdf,0xba,0xa7,0x83,0x3c,0x42, +0xe4,0x4, 0x32,0x20,0xe3,0xff,0xc4,0x7f,0xcf,0x84,0x3c,0x14,0xbf,0x83,0xa, 0x61, +0x8, 0xb4,0xe8,0x0, 0x67,0x1f,0x14,0x1, 0xe0,0x1, 0x9f,0x9e,0x11,0xfb,0xe0,0x80, +0xcf,0x80,0xe0,0x1, 0xb7,0x9e,0xdf,0xb4,0xe8,0x0, 0x61,0x1a,0x14,0x5, 0xa7,0x82, +0x3f,0xd3,0xbf,0x82,0xe0,0xb, 0xd2,0x5e,0xdf,0x9b,0xa7,0x82,0x3a,0x68,0xcf,0x84, +0xbf,0x82,0x14,0x6, 0xa7,0x82,0x3f,0xd3,0xbf,0x82,0xe0,0xb, 0xd2,0x53,0xa7,0x82, +0x14,0x1, 0xcf,0x84,0xbf,0x82,0xa7,0x82,0x39,0xdf,0xb9,0x82,0xe0,0xb, 0xd2,0x4a, +0xe0,0x1, 0x14,0x3, 0x3c,0x54,0xe0,0xb, 0xd2,0x45,0xa7,0x82,0xcf,0x84,0xbf,0x82, +0xdf,0xa2,0x2c,0x7f,0xa, 0x61,0x8, 0xb2,0xe8,0x0, 0x67,0x1a,0x17,0xfb,0xa6,0x8e, +0x39,0x69,0x3f,0xdd,0xbf,0x8e,0xe0,0xb, 0xd2,0x35,0xe4,0xf, 0x31,0x40,0x3c,0x6f, +0xe2,0x1, 0xc4,0x7f,0xe0,0xb, 0xd2,0x2e,0xe0,0xf, 0x31,0x48,0x3c,0x6f,0xe2,0x1, +0xc4,0x7f,0xe0,0xb, 0xd2,0x27,0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0x9, 0x21,0xe1,0x64, +0x0, 0xa1,0x8, 0xb4,0x3a,0x68,0x14,0x1, 0x39,0x69,0x39,0xea,0xdf,0x69,0x3c,0xe4, +0x14,0x2, 0xdf,0xda,0xe8,0x0, 0x67,0x9a,0x3c,0xe2,0x39,0x92,0xe7,0x7f,0x16,0xff, +0x3c,0xf3,0x1, 0xd, 0xe1,0x80,0x87,0x19,0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0x0, 0xf3,0xa7,0xf, 0xcf,0x4, +0xbf,0xf, 0xde,0x52,0xdf,0x60,0x24,0x6, 0xe8,0x0, 0x67,0xcf,0xe2,0x0, 0xcf,0xb2, +0x5, 0xfa,0xe8,0x0, 0x67,0xcf,0xe2,0x0, 0xcf,0xb2,0x2, 0x84,0xa, 0x21,0xe7,0xfc, +0x0, 0xd1,0xe0,0x27,0x14,0x8, 0xa, 0x21,0xe7,0xfc,0x0, 0xeb,0x8, 0xb7,0xe0,0x1, +0x11,0x7f,0x39,0x58,0xe0,0x2, 0x17,0x80,0xe0,0x2, 0x3f,0xa2,0xe3,0xff,0xc1,0x7f, +0x39,0x7a,0x3, 0xaf,0x39,0xea,0x3d,0x62,0x3a,0xe9,0x3a,0x68,0xdf,0xbb,0xe0,0xa, +0x39,0xa2,0x39,0xea,0x3a,0x12,0xe3,0xff,0xc1,0xff,0x39,0x15,0x3b,0x62,0x3a,0xe3, +0xe0,0x7, 0x3a,0x22,0xe2,0x1, 0xca,0xff,0xe0,0x8, 0x3b,0x17,0x5, 0x8c,0x3c,0xe6, +0xe0,0x2, 0x15,0x0, 0xe1,0xfe,0xc2,0x80,0xdf,0xa5,0xe3,0xff,0xc2,0xff,0xe0,0x2, +0xc3,0x0, 0x0, 0xf1,0xe0,0xf, 0x31,0xc8,0xe7,0xfe,0x15,0x0, 0x3d,0x3f,0xe0,0x9, +0x37,0xa8,0x3d,0x13,0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x3a,0x19,0x3c,0x92,0x25,0x2, +0xdf,0x91,0x14,0x1, 0xb, 0xe1,0x8, 0xb2,0x39,0x68,0x14,0x1, 0xde,0xf9,0xe0,0x9, +0x31,0x2c,0x14,0x20,0xdf,0x69,0xe8,0x0, 0x67,0x1a,0xa7,0x8e,0xcf,0x84,0xbf,0x8e, +0xdd,0xf3,0xdf,0x1, 0x24,0x6, 0xe8,0x0, 0x67,0xcf,0xe2,0x3, 0xcf,0xf4,0x5, 0xfa, +0xe8,0x0, 0x67,0xcf,0xe2,0x3, 0xcf,0xf4,0x2, 0x84,0x9, 0x21,0xe7,0xfb,0x0, 0xf2, +0xe0,0x27,0x14,0x8, 0x9, 0x21,0xe7,0xfc,0x0, 0x8c,0x8, 0xb3,0x39,0x69,0x39,0xea, +0xe0,0xb, 0xd1,0x97,0xe8,0x0, 0x67,0x9a,0x39,0x92,0x16,0x80,0xe7,0x7f,0x16,0x7f, +0x39,0x73,0x1, 0xe, 0xae,0xff,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c, +0xa7,0xf, 0x3f,0x5c,0xbf,0xf, 0x8f,0x7f,0xe1,0x80,0xaf,0x12,0x0, 0xf2,0xa7,0xf, +0xcf,0x4, 0xbf,0xf, 0x9, 0xe1,0x8, 0xb1,0xe0,0x0, 0x1c,0x87,0xe0,0xa2,0x14,0x0, +0x15,0x16,0xdf,0xdc,0xe0,0x0, 0x1f,0x87,0xe1,0xff,0x17,0x7f,0x9c,0xf, 0x9e,0x9f, +0x3e,0x98,0x3e,0xfe,0x1, 0x9f,0xe0,0x1, 0x9f,0x1f,0xe0,0x1, 0x9e,0x2f,0x3e,0x1e, +0x3e,0x7d,0x1, 0x98,0x24,0x18,0x9d,0xaf,0x9e,0xbf,0x3e,0x9b,0x3e,0xfc,0x1, 0x92, +0x9e,0x4f,0x9f,0xdf,0x3f,0x9c,0x3f,0xfd,0x1, 0x8d,0xe4,0xe, 0x37,0x20,0x3c,0x4e, +0xe8,0x0, 0x7c,0x4d,0xe2,0xf0,0x17,0x80,0xe8,0x0, 0x64,0x4d,0xe1,0x28,0x3f,0xa8, +0x0, 0x82,0x14,0x0, 0x8, 0xe1,0xe8,0x0, 0x67,0x20,0xa7,0x9e,0xe0,0x80,0xcf,0x80, +0xbf,0x9e,0xe0,0x0, 0x17,0x60,0xe8,0x0, 0x67,0x97,0xbf,0x1f,0x17,0x0, 0xbf,0x3f, +0xe8,0x0, 0x4f,0x59,0xe2,0x0, 0xcf,0x1, 0x1, 0x8d,0x17,0x35,0xe0,0x3, 0xaf,0x7f, +0xe0,0xe, 0x17,0x1, 0xbf,0xf, 0xe0,0x61,0x3f,0x2, 0xe7,0xff,0x17,0xbf,0x3f,0xde, +0x0, 0x88,0x2f,0x9, 0xe0,0x1e,0x17,0x10,0xbf,0xf, 0xe0,0x61,0x3f,0x82,0xcf,0xc0, +0xe0,0x61,0x3f,0x92,0xe0,0x0, 0x17,0xc0,0xe0,0x61,0x3f,0x91,0x38,0x82,0x8, 0xb7, +0xf8,0x0, 0xc, 0x3d,0xe8,0x0, 0x4f,0xd9,0xe8,0x0, 0x61,0x9f,0xe2,0x0, 0xcf,0x81, +0xe0,0x1, 0x1, 0xae,0xe0,0x3, 0x9f,0x93,0xe2,0x1, 0xc7,0xf0,0xe2,0x1, 0xcf,0xf0, +0xe0,0x1, 0x1, 0x26,0xe0,0x2, 0x12,0x80,0xe0,0x2, 0x17,0x82,0x9f,0x5, 0x9f,0x8f, +0x3f,0x9e,0xe1,0xff,0x17,0x7f,0x3f,0xfe,0x1, 0xd, 0xe0,0x2, 0x17,0x9c,0xa7,0xf, +0xe3,0xff,0xc7,0x7f,0xbf,0xf, 0xa7,0xf, 0xe8,0xab,0xcf,0x3b,0xbf,0xf, 0xe0,0x1, +0x0, 0x8f,0xe8,0x0, 0x61,0x17,0x13,0x0, 0x13,0xfe,0xf0,0xe, 0x15,0x41,0xf7,0xff, +0x15,0xfc,0xf0,0x0, 0x14,0xe0,0xf0,0xe, 0x14,0x1, 0x9a,0x5, 0x32,0x42,0xe0,0x1d, +0x32,0x48,0xe2,0x1, 0xc2,0x7f,0xf2,0xf, 0x3e,0xc4,0xe2,0x6, 0x3b,0x4f,0xe2,0x1, +0xc3,0x7f,0xe0,0xb, 0xd1,0x7b,0xf0,0x40,0x3e,0x68,0x2c,0x7c,0xe0,0x2, 0x9f,0x93, +0x14,0xd, 0x3f,0xd7,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd1,0x56,0x14,0x5, 0xe0,0xb, +0xd1,0x53,0xe8,0x40,0x3c,0x6c,0xe0,0xb, 0xd1,0x4f,0xe8,0x40,0x3c,0x6c,0xe0,0xb, +0xd1,0x4b,0xe8,0x40,0x3c,0x6d,0xe0,0xb, 0xd1,0x47,0x3c,0x64,0xe0,0xb, 0xd1,0x44, +0x3c,0x66,0xe0,0xb, 0xd1,0x41,0x14,0xe, 0xe0,0xb, 0xd1,0x3e,0xe0,0x1, 0x14,0x1, +0xe0,0xb, 0xd1,0x3a,0xe8,0x40,0x3c,0x6c,0xe0,0xb, 0xd1,0x36,0xe0,0x2, 0x9f,0x93, +0xcf,0x81,0xe0,0x2, 0xb7,0x93,0x24,0x20,0xa7,0xb2,0xcf,0x81,0xbf,0xb2,0xf0,0x0, +0xbd,0x2, 0xf0,0x1, 0xb6,0x12,0x9f,0x85,0x37,0xc2,0xe0,0x1, 0xb7,0xb2,0xa7,0xe2, +0xe8,0xf, 0x3f,0xdb,0xcf,0x81,0xbf,0xe2,0x17,0x9f,0xbf,0xb2,0xa7,0x92,0x37,0xca, +0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xa7,0x12,0x17,0xfe,0x3f,0xde,0xbf,0x92,0xa7,0x82, +0xe0,0x1, 0xcf,0x80,0xbf,0x82,0xe0,0xb, 0xd1,0x29,0x3a,0x68,0x2c,0x7d,0xe8,0x0, +0x67,0x97,0xf0,0x0, 0xbc,0x9f,0xbc,0x3f,0x14,0xf, 0xf0,0x0, 0xbc,0xf, 0xe0,0x2, +0x9f,0x93,0x3f,0xd7,0xe0,0x2, 0xb7,0x93,0xe0,0xb, 0xd0,0xfe,0xe0,0x1, 0x14,0x1, +0xe0,0xb, 0xd0,0xfa,0x3c,0x64,0xe0,0xb, 0xd0,0xf7,0xe0,0x2, 0x9f,0x93,0xcf,0x81, +0xe0,0x2, 0xb7,0x93,0xe7,0xff,0x24,0x3, 0xe7,0xfe,0x0, 0xe9,0xe0,0xef,0x14,0x19, +0xe0,0xb, 0xd2,0x4, 0x17,0x80,0xe0,0x3, 0xb7,0x93,0xf8,0x0, 0xe, 0xa8,0xb, 0xe1, +0xea,0x0, 0xcc,0x2, 0xe0,0x2, 0xcc,0x0, 0x14,0x80,0xea,0x0, 0xcd,0x2, 0xe0,0x2c, +0xcd,0x58,0x3d,0x28,0xd0,0xb4,0xea,0x0, 0xcc,0x0, 0xe0,0x0, 0xcc,0x0, 0x24,0x2, +0x3c,0x1, 0x14,0x0, 0x14,0x80,0xd0,0x3e,0x3a,0x80,0x0, 0x0, 0x3a,0x80,0xe0,0x40, +0x17,0x80,0xe2,0xb0,0x16,0x80,0xa6,0xf, 0xe0,0xe, 0x3f,0x9d,0xc7,0x84,0xe2,0x4f, +0xcf,0xf0,0xbe,0xe, 0x1, 0xf9,0x38,0x82,0x8, 0xb1,0x3f,0x83,0xdb,0x68,0xdb,0x88, +0xdf,0xef,0xe0,0x61,0x3f,0x2, 0x17,0xf7,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x61, +0x3f,0x2, 0x17,0xef,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xdd,0x3f,0xde,0xdd,0xdb,0xce, +0xdc,0x51,0xdb,0x40,0xdc,0xff,0x3b,0x0, 0xdb,0x1c,0x8, 0xa1,0xe7,0xf9,0x0, 0xd9, +0xe8,0x0, 0x4f,0xd9,0x27,0x8e,0x8, 0xb1,0xdb,0x32,0x24,0xa, 0xdd,0x7d,0xe8,0x0, +0x7c,0x46,0xdd,0x97,0xdc,0x5, 0xef,0xff,0xd7,0x39,0xdc,0xac,0x0, 0xfd,0x8, 0xe1, +0x38,0x82,0x8, 0xb1,0xdf,0xd2,0xde,0xec,0xdc,0xa5,0xde,0xbe,0xda,0xd1,0xdf,0xe9, +0xdc,0x62,0xdc,0xa0,0xde,0xb9,0xe0,0xb, 0xd2,0xfc,0x0, 0x80,0x15,0x0, 0x0, 0x81, +0x3c,0xf8,0x17,0x81,0x3, 0x90,0xe2,0x0, 0xcc,0x80,0x4, 0xd, 0x16,0x0, 0x34,0xa1, +0x37,0xa1,0xe1,0x2e,0x3c,0x19,0xe1,0x2d,0x3f,0x8c,0x27,0x13,0x26,0x92,0xe2,0x0, +0xcc,0x80,0x3, 0x76,0x17,0x0, 0x3c,0x79,0x4, 0x83,0x3c,0x29,0x3f,0x4f,0x37,0xc1, +0x34,0xc1,0x2f,0xfa,0xe2,0x0, 0xcd,0x0, 0xe0,0x6e,0x39,0xa8,0x3c,0x6e,0x38,0x82, +0x3f,0x6f,0x2f,0xf1,0x0, 0xf8,0x0, 0x0, 0x3d,0xe8,0xe2,0x0, 0xcd,0x3, 0x5, 0xad, +0xe0,0xc, 0x3c,0x49,0xe2,0x0, 0xc6,0x3, 0x2e,0x28,0xc5,0x7c,0xe0,0xc, 0x35,0x21, +0xea,0x0, 0xce,0x80,0xe0,0x31,0xce,0xbc,0xe2,0x0, 0xc6,0x18,0xe1,0x80,0xa7,0x19, +0x3e,0xac,0xe0,0xc, 0x35,0x44,0x3f,0xee,0xe0,0x0, 0x3e,0x82,0xe1,0x80,0xa7,0x19, +0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99,0xe1,0x80,0xbf,0x1b,0xe1,0x80,0xa7,0x19, +0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99,0xe1,0x80,0xbf,0x1b,0xc6,0x7f,0x6, 0x6f, +0xe1,0x80,0xbf,0x9b,0xe2,0x0, 0xc5,0x3, 0xc5,0x7f,0x6, 0x87,0xe1,0x80,0x86,0x19, +0xc5,0x7f,0xe1,0x80,0xae,0x1b,0x6, 0x7b,0x38,0x82,0x0, 0x0, 0xe2,0x0, 0xcd,0x3, +0x5, 0xaf,0xe2,0x1, 0xc4,0xff,0xe0,0xc, 0x34,0xa8,0x3c,0xcc,0xe4,0xc, 0x34,0xa0, +0x3c,0xcc,0xe0,0x41,0x3e,0x48,0xe2,0x0, 0xc6,0x3, 0xe0,0xb, 0x3e,0x18,0xe0,0xc, +0x3d,0x2c,0xe0,0xd, 0x36,0x44,0xe2,0x0, 0xc6,0xc, 0xea,0x0, 0xcf,0x80,0xe0,0x32, +0xcf,0xa8,0x3f,0xac,0xe0,0x0, 0x3f,0x82,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b, +0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b,0xc6,0xff,0x6, 0x77,0x3d,0x18,0xe0,0xc0, +0xac,0xba,0xac,0x9a,0xac,0xaa,0xac,0x88,0xac,0x98,0xac,0xa8,0x38,0x82,0x3d,0xe8, +0xc5,0x7f,0x6, 0x85,0xe1,0x80,0xac,0x9b,0xc5,0x7f,0x6, 0x7d,0x38,0x82,0x8, 0xb1, +0xe0,0x60,0x3c,0x87,0xea,0x4, 0x7f,0x80,0xe0,0x0, 0x15,0x60,0x3c,0x6f,0xdf,0x85, +0xe0,0x60,0x3c,0x17,0x8, 0xe1,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x14,0xc4,0x0, 0x2, 0x16,0x48,0x0, 0x1, 0x79,0x88, +0x0, 0x0, 0x10,0x4e,0x0, 0x2, 0x14,0xac,0x0, 0x2, 0x15,0x44,0x0, 0x0, 0x4, 0xb2, +0x0, 0x2, 0x15,0xc4,0x0, 0x2, 0x15,0xf8,0x0, 0x0, 0x5, 0x2c,0x0, 0x2, 0x5, 0x2c, +0x0, 0x2, 0x3, 0x0, 0x0, 0x2, 0x4, 0xc, 0x0, 0x2, 0x16,0x8, 0x0, 0x0, 0x5, 0x34, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5, 0x1c,0x80,0xb6,0x80,0xb, 0x1, 0x0, 0x0, 0x0, +0x1, 0x3, 0x70,0x0, 0x80,0x0, 0xd, 0x0, 0x80,0x0, 0x9, 0x0, 0x80,0x0, 0x8, 0x0, +0x80,0x0, 0x7, 0x0, 0x80,0x0, 0x6, 0x0, 0x80,0x0, 0x4, 0x0, 0x80,0x0, 0x3, 0x0, +0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x1, 0x0, 0x80,0x0, 0x0, 0x0, 0x55,0x50,0x47,0x52, +0x41,0x44,0x45,0x20,0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0x80,0x0, 0x1, 0x0, +0x80,0x0, 0x4, 0x0, 0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x3, 0x0, 0x55,0x50,0x47,0x52, +0x41,0x44,0x45,0x20,0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0xe8,0x0, 0x67,0x1a,0xac,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa6,0x8e,0xe7,0x7f,0x17,0xff,0x3f,0xdd,0xbf,0x8e,0x14,0x1, 0x38,0x82,0x8, 0xb2, +0xe8,0x0, 0x67,0x1a,0x17,0xfb,0xa6,0x8e,0x39,0x68,0x3f,0xdd,0xbf,0x8e,0x14,0xb, +0xdf,0xe8,0xe4,0xf, 0x31,0x40,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdf,0xe2,0xe0,0xf, +0x31,0x48,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdf,0xdc,0x3c,0x62,0xe2,0x1, 0xc4,0x7f, +0xdf,0xd8,0x14,0x0, 0x9, 0x21,0x0, 0xd5,0x8, 0xb3,0xc0,0x7c,0x39,0x6a,0x39,0xe9, +0xdf,0xdf,0x16,0x8, 0xe8,0x0, 0x67,0x9a,0xe0,0xa, 0x31,0x42,0x3e,0x10,0x15,0x80, +0xe7,0x7f,0x14,0xff,0xc5,0x7f,0xe3,0xff,0xcd,0x7f,0x1, 0x15,0xe2,0x0, 0x7f,0x4, +0xad,0xff,0xa6,0x8f,0xe2,0x80,0xc6,0x80,0x26,0xfd,0xa6,0x8f,0x3e,0xd9,0xbe,0x8f, +0x8e,0xff,0xe1,0x80,0xae,0x9e,0x3f,0x7c,0x1, 0xf4,0x67,0x1, 0xc1,0x84,0xe0,0x40, +0xbf,0x13,0x0, 0xe9,0xa7,0xf, 0x14,0x1, 0xcf,0x4, 0xbf,0xf, 0xc0,0x4, 0x9, 0xe1, +0xe8,0x0, 0x66,0xa0,0xe2,0x0, 0xcd,0x1, 0xa7,0x9d,0xe0,0x40,0xcf,0x80,0xbf,0x9d, +0xe8,0x0, 0x67,0x9b,0x1, 0x83,0x17,0x2, 0x0, 0x82,0x17,0x0, 0xe0,0x9, 0xb7,0x5f, +0x17,0x21,0xb4,0x5f,0x35,0x28,0xe0,0x1, 0xb4,0xdf,0xe0,0x1, 0xcd,0x11,0xb7,0x3f, +0x17,0x18,0xe0,0x2, 0xb7,0x5f,0xb5,0x1f,0xe0,0x7, 0x97,0x1f,0xe2,0x0, 0xcf,0x0, +0x9f,0x1f,0x4, 0xc, 0xe2,0x0, 0xc7,0x8, 0xe4,0xe, 0x37,0x20,0xe4,0xe, 0x37,0x40, +0x27,0x74,0x9f,0x1f,0xcf,0x4, 0xb7,0x1f,0x0, 0xf0,0xe0,0x80,0xcf,0x0, 0xb7,0x1f, +0x17,0x0, 0xb7,0x1f,0xe0,0x5, 0x9c,0x5f,0xa7,0x1d,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x9d,0x38,0x82,0xe8,0x0, 0x67,0x17,0xe0,0x1, 0xac,0x3e,0xa7,0x9e,0xe2,0x0, +0xc7,0x81,0x27,0xfd,0xe8,0x0, 0x66,0x9f,0xe0,0x2, 0x9f,0x9d,0xe2,0x0, 0xc7,0x82, +0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0,0x27,0xf8,0xa6,0x9e,0x17,0xfe,0x3f,0xdd, +0xbf,0x9e,0xe0,0x1, 0x8c,0x3e,0x38,0x82,0xe8,0x0, 0x67,0x9f,0xe0,0x6, 0x8f,0x7f, +0xe0,0x2, 0x9c,0x1f,0xe2,0x1, 0xcf,0x2b,0x1, 0x87,0x17,0x80,0xe2,0x0, 0xc4,0x4, +0xe0,0x28,0x3c,0xf, 0x38,0x82,0xe3,0x0, 0xc4,0x0, 0xe4,0x8, 0x34,0x20,0xe4,0x8, +0x34,0x40,0x38,0x82,0x0, 0x80,0x0, 0x80,0xe, 0x3f,0xe8,0x0, 0x4f,0xd9,0xe0,0x1, +0x2f,0x88,0xe8,0x0, 0x66,0x97,0xa7,0xbd,0xe2,0x0, 0xc7,0x81,0xe0,0x1, 0x2f,0x81, +0xa7,0x9d,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x27,0xfc,0xa7,0x1d,0x17,0xfe,0x3f,0xde, +0xbf,0x9d,0xe8,0x2, 0x4f,0xc4,0xe0,0x1, 0x8e,0x3d,0x2f,0x85,0xe8,0x2, 0x6e,0x43, +0xe8,0x2, 0x6f,0xc2,0xe8,0x2, 0x4f,0x43,0xe2,0x1, 0xcf,0x2, 0x1, 0x19,0x2, 0x86, +0xe2,0x0, 0xcf,0x5, 0x1, 0xa, 0xe0,0x0, 0x0, 0xc7,0xe2,0x1, 0xcf,0x14,0x1, 0x21, +0xe2,0x1, 0xcf,0x21,0x1, 0x2e,0x0, 0xbf,0x2f,0x87,0xe8,0x2, 0x46,0x2a,0x17,0x2, +0xe0,0x1, 0xae,0x3d,0x0, 0xa8,0xe2,0x0, 0xcf,0x81,0x1, 0xba,0x0, 0xa0,0x2f,0x88, +0x17,0x1, 0xe8,0x2, 0x6f,0x40,0xe8,0x2, 0x6f,0x41,0x17,0x1, 0x0, 0xb2,0xe2,0x0, +0xcf,0x81,0x1, 0xae,0xe0,0x0, 0x1f,0x4, 0xe8,0x2, 0x6f,0xc2,0xae,0xe, 0x0, 0xa8, +0x2f,0x86,0xe8,0x2, 0x47,0x28,0xe0,0x1, 0xaf,0x3d,0x0, 0x8c,0xe2,0x0, 0xcf,0x82, +0x1, 0x9f,0xe0,0x0, 0x1f,0x4, 0xe0,0x1, 0x86,0x3d,0xae,0xe, 0x17,0x1, 0x0, 0x96, +0x2f,0x86,0x17,0x3, 0xe8,0x2, 0x6f,0x41,0x3f,0x6f,0x0, 0x93,0xe0,0x0, 0x1f,0x4, +0xe0,0x1, 0x86,0x3d,0x3f,0x1f,0xae,0xe, 0xe8,0x2, 0x4f,0x41,0x3f,0x7f,0x5, 0xef, +0x17,0x0, 0x0, 0x8b,0x17,0x1, 0xe8,0x2, 0x6f,0x41,0xe8,0x2, 0x6f,0x42,0x17,0x0, +0xe8,0x2, 0x4e,0x41,0x3e,0x7f,0x5, 0x84,0xc7,0x81,0xe8,0x2, 0x6f,0xc4,0xe8,0x2, +0x4f,0xc2,0x27,0x89,0x17,0x80,0xe8,0x2, 0x6f,0xc4,0xe8,0x2, 0x6f,0xc3,0x17,0x81, +0xe8,0x2, 0x6f,0xc9,0x2f,0x5, 0xa7,0x8d,0xe0,0x10,0xcf,0x80,0xbf,0x8d,0xe0,0x0, +0x17,0xc0,0xe0,0x61,0x3f,0x91,0xf, 0xac,0x38,0x0, 0x8, 0xb2,0x99,0xa, 0x9f,0x9a, +0xe1,0xff,0x17,0x7f,0x3f,0x92,0x3f,0xfe,0x1, 0x8c,0x34,0xc1,0x34,0x41,0x15,0x1, +0xe3,0xff,0xc4,0xff,0xe3,0xff,0xc4,0x7f,0xde,0xf4,0xe0,0x28,0x39,0x8, 0x0, 0x82, +0x14,0x0, 0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x11,0x0, 0xe0,0x2, 0x15,0x4, 0x3c,0xe2, +0x14,0x0, 0xdf,0xe4,0x24,0x26,0xe0,0x2, 0x17,0x92,0x9c,0x8f,0xe0,0x2, 0x17,0x94, +0x9f,0xf, 0xe1,0xff,0x16,0x7f,0x3f,0x19,0xe0,0x2, 0x16,0x82,0x3f,0x7c,0x9f,0x82, +0x9e,0x8d,0x1, 0x97,0x3e,0x9f,0x3e,0xfe,0x1, 0x94,0xe4,0x9, 0x34,0xa0,0x3c,0xcf, +0xe2,0xf0,0x17,0x80,0x3c,0xff,0x2, 0x8d,0x17,0x83,0x3f,0xd9,0x2f,0x8a,0xe0,0x2, +0x15,0x8, 0xe1,0xfc,0xc4,0xe0,0xe0,0x3, 0x14,0x20,0x9, 0x21,0xe7,0xff,0x0, 0xbf, +0x14,0x0, 0x9, 0x61,0x8, 0xb2,0x11,0x3, 0xe8,0x0, 0x65,0x4d,0x14,0x80,0xe0,0xa0, +0x14,0x0, 0xde,0x8b,0xdf,0xc8,0x2c,0x7, 0xc1,0x7f,0xe2,0x1, 0xc1,0x7f,0x29,0x75, +0x3c,0x62,0x0, 0x82,0x14,0x1, 0x9, 0x61,0x8, 0xb5,0xe8,0x0, 0x4f,0xd9,0x3a,0x68, +0xe2,0x0, 0xcf,0x81,0xe2,0x1, 0xc2,0x7f,0xe0,0x2, 0x34,0x48,0x1, 0x96,0xe8,0x0, +0x61,0x9f,0x12,0xfe,0xe0,0x2, 0x9f,0x93,0xe0,0x1, 0x14,0x2, 0x3f,0xd5,0xe0,0x2, +0xb7,0x93,0xde,0xd1,0x3c,0x62,0xde,0xcf,0xe0,0x2, 0x9f,0x93,0x3a,0x78,0xcf,0x81, +0xe0,0x2, 0xb7,0x93,0x1, 0xf0,0x0, 0xa9,0x2f,0xa8,0xe8,0x0, 0x67,0x1f,0xe8,0x2, +0x6f,0xc9,0xe0,0x2, 0x9e,0x9e,0xe0,0x0, 0x1e,0x4, 0xe1,0x0, 0xce,0x80,0xe0,0x2, +0xb6,0x9e,0xe0,0x2, 0x9e,0x9e,0xe3,0xff,0xc6,0xfb,0xe0,0x2, 0xb6,0x9e,0xe8,0x0, +0x67,0x17,0xe8,0x2, 0x4e,0xc0,0x26,0xfe,0xe8,0x2, 0x6f,0xc0,0xe0,0x1, 0xaa,0x3e, +0xa6,0x8e,0xe0,0x10,0xce,0x80,0xbe,0x8e,0xe8,0x2, 0x4e,0xc9,0x26,0xfe,0xe8,0x2, +0x6f,0xc9,0x8e,0x8c,0x39,0x7d,0x1, 0xee,0xa, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xe8,0x0, 0x61,0x17,0xe8,0x0, 0x61,0x9f,0x13,0x3, 0x12,0x82,0xf0,0x0, 0x14,0x0, +0x13,0xfc,0xf0,0x1e,0x14,0x80,0xf0,0x0, 0x15,0x17,0xf7,0x0, 0x15,0x80,0xf7,0xef, +0x16,0x7f,0xf0,0xe, 0x16,0xc1,0xe8,0x0, 0x4f,0xd9,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x1, 0xce,0xde,0x9b,0x2c,0x7f,0xe8,0x0, 0x67,0xcd,0xe8,0x0, 0x62,0x4d,0xe2,0x20, +0xcf,0x80,0x5, 0x83,0x32,0x43,0x3a,0x57,0x3d,0x64,0x14,0x80,0xe0,0xa0,0x14,0x0, +0xde,0xc, 0xf8,0x0, 0x67,0x17,0xe0,0xa0,0x14,0x0, 0xe8,0x0, 0xa7,0xee,0x3c,0xe4, +0x3f,0xd7,0xcf,0x81,0xe8,0x0, 0xbf,0xee,0x3c,0x14,0xf8,0x1, 0xb4,0x1e,0xe8,0x0, +0x67,0xcd,0x37,0xc2,0xe8,0x1, 0xb7,0xbe,0x17,0x9f,0xf8,0x0, 0xbe,0x8e,0xe8,0x0, +0xbf,0xbe,0xe8,0x0, 0x65,0x4d,0x3d,0x24,0xdd,0xf0,0xe8,0x0, 0xa7,0x9e,0x37,0xca, +0xe2,0x0, 0xc7,0x81,0x27,0xfb,0xdf,0x27,0xe2,0x0, 0xcc,0x0, 0x17,0x80,0xe0,0x6f, +0x39,0xa5,0x3a,0xef,0xde,0x62,0x24,0x7f,0xe8,0x0, 0x67,0x9f,0xe0,0x2, 0x9f,0x9f, +0xe2,0x0, 0xc7,0x82,0xe4,0xf, 0x37,0xa0,0xe4,0xf, 0x37,0xc0,0xe2,0x0, 0xcf,0x80, +0x17,0x81,0xe0,0x6f,0x39,0x25,0x3a,0xef,0x0, 0xb7,0xe8,0x0, 0x67,0xcd,0x37,0xc2, +0xe0,0x1, 0xb7,0xb2,0xf0,0x1, 0xb4,0x12,0xa7,0xe2,0x3f,0xd7,0xcf,0x81,0xbf,0xe2, +0xf0,0x0, 0xbc,0x82,0xf0,0x0, 0xbd,0x32,0xe0,0x2, 0x9f,0x93,0xe2,0xff,0xc7,0xff, +0xe0,0x2, 0xb7,0x93,0xe0,0x2, 0x9f,0x93,0xcf,0x84,0xe0,0x2, 0xb7,0x93,0xa7,0x92, +0x37,0xca,0xe2,0x0, 0xc7,0x81,0x27,0xfc,0xde,0xee,0xa7,0x82,0x24,0x6, 0xe0,0x10, +0xcf,0x80,0xbf,0x82,0x12,0x81,0x0, 0x84,0xe8,0xf, 0x3f,0xdc,0xbf,0x82,0xe0,0x2, +0x9f,0x93,0xe8,0xf, 0x3f,0xcb,0xe0,0x2, 0xb7,0x93,0xe0,0x2, 0x9f,0x93,0xe3,0xff, +0xc7,0xfb,0xe0,0x2, 0xb7,0x93,0xc3,0x7f,0xe2,0x1, 0xc3,0x7f,0x23,0x5, 0xe2,0x0, +0xca,0x81,0xe7,0xfe,0x1, 0xf2,0x3c,0x65,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x8, 0xb2, +0xe8,0x0, 0x4c,0x59,0x24,0x5, 0xef,0xf4,0xdb,0xf0,0xe0,0x0, 0x24,0x4c,0xe8,0x0, +0x4f,0xd9,0xe2,0x0, 0xcf,0x83,0x1, 0x84,0x9, 0x21,0xe7,0xfd,0x0, 0xed,0xe2,0x0, +0xcf,0x81,0x1, 0xa9,0xe1,0x76,0x14,0x55,0xde,0xf8,0xe8,0x0, 0x61,0x1f,0xe0,0x1, +0x14,0x21,0xe0,0x2, 0x9f,0x92,0xe3,0xff,0xc7,0xfe,0xe0,0x2, 0xb7,0x92,0xdd,0xd3, +0xe8,0x0, 0x67,0xcd,0xe4,0xf, 0x37,0xc0,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdd,0xcb, +0xe8,0x0, 0x67,0xcd,0x37,0xc8,0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0xdd,0xc4,0xe8,0x0, +0x64,0x4d,0xe2,0x1, 0xc4,0x7f,0xdd,0xbf,0xe0,0x2, 0x9f,0x92,0xcf,0x81,0xe0,0x2, +0xb7,0x92,0x0, 0x95,0x2f,0x97,0xe1,0x76,0x14,0x55,0xde,0xcf,0xe8,0x2, 0x4f,0xc9, +0x27,0xfe,0x17,0x80,0xe0,0x0, 0x1f,0x4, 0xe8,0x2, 0x6f,0xc9,0xaf,0x8e,0x9f,0x8e, +0x9f,0x1e,0xe4,0xf, 0x37,0xa0,0x3f,0xce,0xe8,0x0, 0x7f,0xcd,0x9, 0x21,0xe7,0xfe, +0x0, 0x86,0x9, 0x61,0xe0,0x0, 0x1f,0x29,0xe2,0xff,0x17,0xf0,0xbf,0xf, 0xe2,0xff, +0x17,0xf4,0xe0,0x0, 0x1f,0x2a,0xbf,0xf, 0xe2,0xff,0x17,0xf8,0xe0,0x0, 0x1f,0x2b, +0xbf,0xf, 0xe2,0xff,0x17,0xfc,0xe0,0x0, 0x1f,0x2c,0xbf,0xf, 0x38,0x82,0x8, 0xb1, +0xdf,0x97,0xe8,0x0, 0x4f,0xd9,0x27,0x93,0xe2,0x0, 0xcc,0x1, 0x1, 0xa, 0x17,0x80, +0xe0,0x2, 0x17,0x4, 0xbf,0x8e,0xe0,0x2, 0x17,0x8, 0xbf,0x8e,0x2c,0x2, 0xdf,0xdb, +0x3f,0x83,0xe8,0x0, 0x67,0x9f,0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x0, 0x80,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0x0, 0x0, 0x60,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4,0x0, 0x0, 0x7b,0xf4, +0xe0,0x60,0x3c,0x0, 0xcc,0x2, 0xe0,0x60,0x3c,0x10,0xea,0x0, 0xc8,0x3, 0xe0,0xff, +0xc8,0x7c,0xfa,0x0, 0xcf,0x82,0xf0,0x37,0xcf,0x88,0xea,0x0, 0xcc,0x0, 0xe0,0x0, +0xcc,0x0, 0xe0,0x60,0x3c,0x17,0xea,0x0, 0xcc,0x2, 0xe0,0x0, 0xcc,0x0, 0xea,0x0, +0xcc,0x81,0xe0,0x88,0xcc,0xa4,0x3c,0x79,0x1, 0x8, 0xea,0x0, 0xcd,0x2, 0xe0,0x46, +0xcd,0x28,0x3d,0x28,0xe0,0x9, 0xdf,0x36,0xea,0x0, 0xcc,0x0, 0xe0,0xf7,0xcc,0x44, +0x3c,0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x67,0x4c,0x98,0xb3,0xec,0x7c,0x13,0x83,0xa9,0x3a,0x56,0xc5,0xda,0x25,0x14,0xeb, +0x0, 0x0, 0x0, 0x1, 0xff,0xfe,0x0, 0x0, 0x0, 0x0, 0xc8,0x37,0x0, 0x0, 0x80,0xa6, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x1, 0xfe, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc8,0x37, +0x34,0x34,0x33,0x35,0x33,0x31,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x30,0x30,0x31,0x0, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x8, 0xb5,0xc0,0x68,0xe0,0x3, 0x1f,0x84,0x15,0x80,0x95,0x3f,0xe0,0x2, 0x1f,0xfd, +0x3e,0x6a,0xe3,0xff,0xc6,0x7f,0xf0,0x0, 0x8b,0x4f,0xf0,0x0, 0x8b,0xdf,0xe0,0x2, +0x1f,0xfc,0xe4,0x3, 0x36,0x22,0x7d,0x81,0xe4,0x3, 0x31,0xc0,0x7d,0x82,0x7d,0x83, +0x7d,0x84,0x7d,0x85,0x7d,0x86,0x99,0xf, 0x24,0x39,0xe2,0x0, 0xcc,0x1, 0x1, 0x3, +0xc0,0x18,0xa, 0xe1,0xf0,0x0, 0x23,0x74,0x14,0xff,0xe0,0x2, 0x1f,0x81,0xe8,0x9, +0x3c,0x97,0xa4,0xf, 0xe2,0x1, 0xc4,0xff,0x34,0xa1,0xf0,0x4, 0x33,0xa1,0x3d,0x68, +0xe0,0x0, 0xc4,0x82,0xf0,0x0, 0x23,0x8b,0xe0,0xd, 0x3c,0x9a,0x3f,0xea,0x97,0xf, +0x3f,0x1c,0xe1,0x80,0xb7,0x1f,0x3e,0xff,0x1, 0xfb,0xc5,0x81,0xe2,0x1, 0xc5,0xff, +0xf0,0x40,0x3b,0x7b,0x3d,0x14,0x1, 0xef,0x16,0x8c,0x3e,0x92,0xe3,0xff,0xc6,0xff, +0xe0,0xf, 0x31,0x21,0x3f,0x98,0x97,0xf, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0x3f,0x13, +0x39,0x7d,0xb7,0xf, 0x1, 0xf6,0xc0,0x18,0xa, 0xe1,0xe0,0x2, 0x1a,0x81,0xe0,0x2, +0x1f,0x0, 0xa7,0x85,0xe2,0x1, 0xc5,0x7f,0xe9,0xff,0xc7,0xfe,0x37,0xc1,0x3c,0xea, +0x37,0x41,0xe2,0x0, 0x7c,0x4, 0xf0,0x0, 0x6b,0x85,0xe0,0x43,0x3a,0x13,0xf0,0x0, +0x6b,0x4, 0x7f,0x3, 0x7f,0x84,0x7f,0x85,0xe0,0x9, 0xda,0xa4,0x15,0x8c,0x3d,0x92, +0xa6,0x5, 0xe0,0x1, 0x1d,0x7f,0xe3,0xff,0xc5,0xff,0xe0,0x41,0x3c,0xc4,0x0, 0x8a, +0x97,0xf, 0x3f,0x13,0xb7,0xf, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0x39,0x7b,0xe7,0xff, +0x1, 0x21,0xe0,0x6, 0x17,0xa8,0x3f,0x92,0x37,0xa1,0x3f,0x9a,0x96,0x9f,0xe0,0xe, +0x31,0x21,0x3a,0x7d,0x3f,0xee,0x3f,0x9c,0x4, 0x6c,0x3e,0xf9,0xe0,0xf, 0x31,0x21, +0x3f,0x9c,0x3, 0x6a,0x97,0xf, 0x3f,0x23,0xb7,0xf, 0x0, 0xe6,0xe0,0x2, 0x1f,0x81, +0xa4,0xf, 0xe7,0xff,0x0, 0xab,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3a,0xe0,0x2, +0x1f,0xe6,0xe0,0x2, 0x1e,0xfd,0x87,0xf, 0x39,0xeb,0xe0,0x3, 0x8e,0x2d,0x15,0x8e, +0x3d,0xb3,0xe0,0x3, 0x1f,0xac,0xe2,0x0, 0xc7,0x1, 0x3e,0x7e,0x3f,0x9b,0x3a,0x68, +0x3a,0xe9,0x3b,0x6a,0x8b,0x9f,0xf0,0x0, 0x8d,0x3f,0xe0,0x1, 0x1, 0x3b,0x99,0x5d, +0x3c,0x63,0xe0,0x3, 0xdc,0x72,0xf0,0x40,0x3c,0x68,0xe0,0x2, 0xd9,0xf4,0xe0,0xc, +0x15,0x52,0x14,0x80,0x3c,0x64,0xe0,0x9, 0xde,0x2f,0xf0,0x1, 0x2c,0x23,0xe8,0x7, +0x3b,0xca,0xe0,0x0, 0x2b,0xec,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f, +0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, 0xc7,0x40,0x3f,0xdc, +0x3f,0xce,0xb7,0x8d,0xc1,0x5, 0xf0,0x0, 0x14,0x80,0x3c,0xe3,0xe8,0x40,0x3c,0x69, +0xe0,0x2, 0xda,0x7b,0x24,0x7b,0xe0,0x1, 0x1d,0xfe,0x17,0x80,0xe0,0xe, 0x37,0xa1, +0xe0,0xd, 0x3a,0x1e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0x14,0x1, 0xe0,0x2, 0xda,0xd, 0xf0,0x0, +0x24,0x27,0xe0,0x1, 0x1d,0xfd,0x17,0x80,0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3a,0x9e, +0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2, +0xb7,0xd, 0x5, 0x73,0xe0,0x3, 0x19,0x30,0xe4,0x0, 0xc1,0x85,0x3c,0x64,0xe0,0xf, +0x39,0x13,0x8c,0xcf,0xe0,0x2, 0xdb,0x3c,0x2b,0x95,0x39,0x13,0x8c,0xc2,0x3c,0x65, +0xe0,0x2, 0xdb,0x36,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0xe0,0x3, 0x19,0x30, +0xe4,0x0, 0xc1,0x85,0x3c,0x64,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0xe0,0x2, 0xdb,0x28, +0x23,0xf2,0xe0,0xf, 0x39,0x13,0x8c,0xcf,0x3c,0x66,0xe0,0x2, 0xdb,0x21,0xf7,0xff, +0x2c,0x66,0x14,0x1, 0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0xe0,0xc, 0x15,0x52,0x14,0x80, +0x3c,0x66,0xe0,0x9, 0xdd,0xb9,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f, +0xe7,0xff,0x16,0x3f,0xa7,0x4f,0x97,0x8d,0x37,0x44,0xe2,0x0, 0xc7,0x40,0x3f,0xdc, +0x3f,0xce,0xb7,0x8d,0xf0,0x0, 0x14,0x84,0xf7,0xff,0x25,0xe, 0x3c,0xe3,0xe8,0x40, +0x3c,0x69,0xe0,0x2, 0xda,0xa, 0x24,0x7b,0xe0,0x1, 0x1d,0xfc,0xc1,0x5, 0x17,0x80, +0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3b,0x1e,0x3f,0x1b,0x9f,0xe, 0x96,0xd, 0xc7,0x81, +0xe3,0xff,0xc7,0xff,0x3f,0x1c,0x3f,0xf2,0xb7,0xd, 0x5, 0x73,0xe7,0xfe,0x0, 0xf5, +0xe0,0xc, 0x15,0x52,0x14,0x80,0x3c,0x65,0xe0,0x9, 0xdd,0x86,0xe7,0xfe,0x0, 0xd9, +0x99,0x6d,0xe7,0xfe,0x0, 0xc7,0xe0,0x2, 0x1f,0x81,0xe0,0x1, 0x1d,0x7b,0xa4,0x8f, +0x3c,0x69,0xe0,0x8e,0x0, 0x9c,0xe0,0x0, 0x1f,0x8e,0xf0,0x40,0x3a,0x68,0xf0,0x0, +0x88,0x8f,0xe0,0x1, 0x14,0x7f,0xf0,0x0, 0x20,0xe5,0xf0,0x0, 0x1b,0xd, 0xf0,0x40, +0x3a,0xe8,0x17,0x0, 0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0x11,0x82,0xf0,0x0, 0x10,0x3, +0x0, 0x9e,0xf1,0x2c,0x39,0xad,0xe0,0x0, 0x26,0x43,0xf0,0x0, 0x12,0x82,0xe8,0x40, +0x3e,0xe5,0x3f,0xe8,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe8,0x40, +0x3e,0x65,0x5, 0x82,0x3e,0x68,0x3c,0x6c,0xe2,0x1, 0xc4,0x7f,0xc7,0x1, 0xe2,0x1, +0xc7,0x7f,0xe8,0x40,0x3f,0x71,0xf0,0x0, 0xc3,0x2, 0x1, 0x38,0x3d,0x7e,0x1, 0x77, +0xe8,0x0, 0x8e,0x86,0xe8,0x0, 0x8e,0x16,0xf0,0xf, 0x3a,0x2d,0xe2,0x0, 0xcf,0x80, +0xe8,0x17,0x3e,0xa4,0xf2,0x1, 0xc3,0xff,0xe0,0xd, 0x3c,0xac,0xe2,0x1, 0xc7,0xff, +0xe8,0x6f,0x3d,0x27,0x3e,0x29,0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc6,0x7f,0xe2,0x1, +0xc6,0xff,0xf1,0x37,0x39,0x2f,0xe0,0x6d,0x3d,0x2c,0xf0,0x0, 0x23,0x85,0xf1,0x2c, +0x39,0x2d,0x2e,0x15,0xf1,0x2c,0x39,0xaf,0xe7,0xff,0x2e,0x3d,0x25,0xc1,0xf1,0x2f, +0x38,0x2f,0xe7,0xff,0x27,0xbe,0xf0,0x40,0x38,0x7d,0xe8,0x40,0x3f,0xe0,0xe8,0x6f, +0x3c,0xa5,0xf0,0x40,0x3a,0xef,0xe7,0xff,0x0, 0xb4,0x38,0x82,0x14,0x1, 0x38,0x82, +0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0x30,0xf0,0x40, +0x3e,0x6a,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1d,0xd, 0xe4,0x0, 0xc5,0x8a,0x3e,0xea, +0x3e,0x9b,0x3f,0x9a,0x16,0x0, 0xe0,0x2, 0x1f,0x7d,0xe0,0x10,0xae,0x1d,0xf0,0x40, +0x3c,0xe8,0xe0,0x10,0xae,0x2d,0xe8,0x40,0x3c,0x6c,0x8e,0xf, 0x8f,0x9f,0x89,0x4e, +0x89,0xde,0x7d,0x90,0xf0,0x40,0x3f,0x69,0x7e,0xa, 0x7f,0x88,0xe0,0x6, 0xd6,0xc4, +0x14,0x83,0xe0,0x9, 0xdc,0x45,0xe0,0x1, 0x1e,0xd7,0xe0,0x43,0x3c,0x18,0xe0,0x1, +0x93,0xcd,0x67,0xa, 0x3b,0xf8,0xe0,0x67,0x3c,0x28,0xe8,0x40,0x3f,0x79,0xe0,0x3, +0x3, 0xa9,0x67,0x8a,0x17,0x1, 0xe8,0xe, 0x3f,0x19,0x3f,0x1f,0x17,0x80,0xe2,0x1, +0xc7,0x7f,0x3b,0x6f,0x66,0x88,0xe8,0x40,0x3e,0xfe,0xe0,0x3, 0x3, 0x87,0x66,0x88, +0x11,0x1, 0xe8,0x2, 0x39,0x1e,0x39,0x1d,0x16,0x80,0xe2,0x1, 0xc1,0x7f,0x7e,0x89, +0x3f,0x9d,0xe0,0x1, 0x1e,0xfa,0x37,0xa1,0x3f,0x9d,0xe0,0x1, 0x1e,0xd7,0x37,0xc1, +0x65,0x89,0x86,0x1d,0x7f,0x93,0xe0,0xa, 0x3f,0x16,0x67,0x89,0xe0,0x1, 0x1e,0xf9, +0x3d,0x92,0x36,0xc1,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc5,0xff,0xe0,0x0, 0x6f,0xc4, +0xe2,0x0, 0x7c,0x44,0x17,0x80,0x7e,0x94,0xe0,0x0, 0x6f,0x47,0xe0,0x0, 0x6e,0x48, +0xe0,0x0, 0x6f,0xc9,0x7d,0xb, 0x7d,0x8c,0xe0,0x0, 0x6b,0x45,0xe0,0x0, 0x69,0x46, +0xe0,0x9, 0xd7,0x43,0xe0,0x1, 0x1f,0xf8,0x66,0xb, 0xf0,0x0, 0x9c,0xf, 0xe0,0x1, +0x1f,0xf7,0x3e,0x76,0xf0,0x0, 0x9d,0x8f,0xe0,0x1, 0x1f,0xf6,0xf4,0x18,0x34,0x20, +0xf0,0x0, 0x9d,0xf, 0xe0,0x1, 0x1f,0xf5,0xf4,0x1b,0x35,0xa0,0x9e,0x8f,0xe0,0x1, +0x1f,0xf4,0xf4,0x1a,0x35,0x20,0x9f,0xf, 0xe0,0x1, 0x1f,0xf3,0xf0,0x18,0x3c,0x1d, +0x9f,0x8f,0xf0,0x1b,0x3d,0x9e,0xf0,0x1a,0x3d,0x1f,0x16,0x80,0xe0,0x1, 0x5, 0xcc, +0xe0,0xe, 0x39,0xb6,0x66,0x89,0xe0,0x1, 0x1d,0x57,0xe0,0x2c,0xc7,0x1f,0x3f,0x1d, +0x37,0x21,0x8a,0x9a,0xe0,0x1, 0x1d,0x7f,0xc7,0x7e,0x3f,0x1a,0x67,0x8a,0xc1,0x7f, +0xe2,0x1, 0xc1,0x7f,0x7f,0x6, 0x16,0x2, 0x67,0x9, 0x65,0x8, 0xe0,0xb, 0x3b,0x2f, +0x31,0xa1,0xe0,0xf, 0x31,0x21,0x3f,0x9c,0xf1,0x39,0x3c,0x9c,0x79,0x8d,0xe3,0xff, +0xc5,0xff,0xe4,0x3, 0x33,0x28,0x3f,0x2a,0xf1,0x2c,0x3f,0x1c,0x16,0x80,0x7d,0x87, +0x3a,0x63,0x7f,0xe, 0x7f,0x8f,0xf0,0x0, 0x7c,0x82,0x7e,0x5, 0xe4,0x4, 0x32,0x48, +0x66,0xc, 0x67,0x9, 0x3e,0x7e,0xe0,0x1, 0x5, 0x85,0x67,0x86,0x61,0xf, 0xf0,0x40, +0x3f,0x6f,0x39,0x1f,0x67,0x8a,0x67,0xe, 0xf0,0x0, 0x66,0x89,0xe0,0xf, 0x3b,0x2f, +0x66,0x7, 0xe3,0xff,0xc7,0x7f,0x7f,0x83,0xe8,0x40,0x3f,0xee,0xe0,0x43,0x39,0x9c, +0xf8,0x40,0x3f,0x6d,0xf0,0x40,0x3c,0xee,0x7b,0x4, 0xf0,0x40,0x3e,0xef,0x0, 0xbb, +0x67,0x3, 0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0x52,0x66,0x2, 0xe0,0x0, 0x26,0x5e, +0x67,0x5, 0x15,0x81,0xe0,0x0, 0x27,0x5a,0xe8,0x40,0x3d,0x6c,0x3c,0x64,0x7e,0x81, +0xde,0x93,0x15,0x7e,0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0xb, 0x33,0x1, 0xe2,0x0, +0xcd,0x1, 0xc4,0x7f,0xe0,0x43,0x3d,0x9b,0xe2,0x1, 0xc4,0x7f,0xe0,0x66,0x3d,0xab, +0xe2,0x0, 0xcc,0x2, 0x66,0x81,0x2, 0x8b,0x65,0x4, 0xe8,0xb, 0x3b,0x3e,0x3d,0x36, +0xf0,0x1a,0x3d,0x2b,0xf0,0x1b,0x3d,0xaa,0xf0,0x18,0x3c,0x26,0x17,0x1, 0xe8,0xe, +0x3f,0x19,0xf0,0x40,0x3e,0xf2,0xf0,0x40,0x3c,0xee,0xf3,0xff,0xc4,0xff,0xf0,0x0, +0xc7,0x1, 0x1, 0x2e,0xe8,0x80,0x97,0x9d,0xe8,0x40,0x3c,0xee,0x3f,0xa5,0xe0,0x43, +0x3b,0x1f,0xe2,0x0, 0xcb,0x0, 0xe2,0x1, 0xc4,0xff,0x5, 0x69,0x15,0x81,0x3d,0x9d, +0x3b,0xf6,0xe2,0x1, 0xc5,0xff,0xe0,0x6d,0x3d,0x2b,0xe2,0x0, 0xc9,0x80,0xe7,0xff, +0x2, 0x31,0xe3,0xff,0xc9,0xff,0xe7,0xff,0x4, 0x32,0xe8,0x43,0x3d,0x99,0xe2,0x0, +0xcd,0x80,0xe0,0x0, 0x5, 0x7d,0x67,0x88,0xf0,0xb, 0x3f,0x2f,0xe2,0x0, 0xcd,0x81, +0x5, 0x4e,0x66,0x2, 0xe7,0xff,0x2e,0x26,0x15,0x80,0xe7,0xff,0x0, 0xa7,0x63,0x4, +0x66,0x6, 0x65,0xd, 0x67,0x7, 0x3e,0x1a,0xc3,0x1, 0xe4,0x4, 0x33,0x28,0x7e,0x6, +0xc7,0x1, 0x66,0xb, 0xe4,0xf, 0x32,0x48,0xe3,0xff,0xc7,0x7f,0x3e,0x7f,0x7f,0x7, +0xe7,0xfe,0x2, 0xe6,0xf2,0x0, 0xcc,0x0, 0x11,0x81,0x3d,0x63,0xe8,0x6a,0x39,0xa8, +0x3c,0xea,0xf0,0x8, 0x35,0xa6,0xf0,0x40,0x3c,0x6a,0x7e,0x81,0xe0,0x9, 0xdb,0x3b, +0x66,0x10,0xe0,0x0, 0x19,0xd, 0xc4,0x20,0x39,0x1c,0xe0,0x7, 0xb4,0x62,0xe8,0x40, +0x3c,0xe8,0xf0,0x8, 0x35,0x26,0xe0,0x9, 0xdb,0x2e,0x17,0xa0,0x3f,0x98,0xe0,0x7, +0xb7,0xf2,0xe8,0x40,0x3c,0x6c,0xe0,0x6, 0xd5,0x5f,0xe2,0x0, 0xcc,0x0, 0x39,0x68, +0x66,0x81,0xe0,0x1, 0x5, 0x0, 0xe0,0x1, 0x1f,0x57,0xe0,0x43,0x39,0x12,0xe0,0x2, +0x8c,0xfe,0x2c,0x85,0x17,0x94,0xe0,0x2, 0xaf,0xfe,0x14,0x94,0xe8,0x40,0x3c,0x68, +0x7e,0x81,0xe0,0x9, 0xdb,0x10,0x3c,0x72,0x3c,0xe2,0xe0,0x62,0x3d,0xa8,0xe0,0x0, +0x14,0x7f,0x3c,0x32,0x66,0x10,0xe0,0x0, 0x19,0xd, 0x39,0x1c,0xe0,0x9, 0xdb,0x3, +0xe0,0x10,0xac,0x12,0x66,0x81,0x67,0xa, 0x67,0x88,0xe2,0x0, 0xce,0xad,0xe0,0x10, +0xae,0xa2,0xe0,0x10,0xaf,0x32,0xe0,0x10,0xaf,0xc2,0x5, 0x84,0x17,0xad,0xe0,0x10, +0xaf,0xa2,0xe0,0x0, 0xc0,0x50,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe3,0xff,0xcd,0xff, +0xe7,0xfe,0x3, 0x56,0xe7,0xfe,0x0, 0xab,0x16,0xff,0x3e,0x93,0x66,0x8, 0xe8,0xd, +0x3e,0xae,0x3e,0x7d,0x2, 0x31,0x3e,0xec,0xf0,0x2, 0x37,0x21,0xe8,0xd, 0x3e,0xae, +0xc1,0x1, 0xe2,0x1, 0xc6,0xff,0x7e,0x89,0xe2,0x1, 0xc1,0x7f,0xe7,0xfc,0x0, 0xf2, +0x17,0xff,0x3f,0x92,0xe8,0xf, 0x3f,0xa9,0x3f,0x7f,0x2, 0xf, 0x63,0xa, 0xf0,0xe, +0x34,0xa1,0xe8,0x6, 0x3b,0x29,0xc7,0x1, 0xe2,0x1, 0xc3,0x7f,0xe2,0x1, 0xc7,0x7f, +0xe0,0xf, 0x3b,0x33,0xe7,0xfc,0x0, 0xd0,0x63,0xa, 0x66,0xa, 0xe8,0x6, 0x3b,0x29, +0xe8,0xe, 0x39,0x19,0xe2,0x1, 0xc3,0x7f,0x3f,0x2c,0xe0,0xf, 0x3b,0x33,0xe2,0x1, +0xc7,0x7f,0xe7,0xfc,0x0, 0xc1,0x66,0x88,0x66,0x8, 0xe8,0x2, 0x39,0x9e,0xe8,0xd, +0x3e,0xae,0x39,0x2c,0xe2,0x1, 0xc6,0xff,0x7e,0x89,0xe2,0x1, 0xc1,0x7f,0xe7,0xfc, +0x0, 0xc1,0x39,0x63,0xe7,0xff,0x0, 0x81,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff, +0xc0,0x34,0xf0,0x40,0x3e,0x6a,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1d,0xd, 0xe4,0x0, +0xc5,0x8a,0x3e,0xea,0x3e,0x9b,0x3f,0x9a,0x16,0x0, 0xe0,0x2, 0x1f,0x7d,0xe0,0x10, +0xae,0x1d,0xf0,0x40,0x3c,0xe8,0xe0,0x10,0xae,0x2d,0xe8,0x40,0x3c,0x6c,0x8e,0xf, +0x8f,0x9f,0x89,0x4e,0x89,0xde,0x7d,0x8f,0xf0,0x40,0x3f,0x69,0x7e,0xa, 0x7f,0x88, +0xe0,0x6, 0xd4,0xb2,0x14,0x83,0xe0,0x9, 0xda,0x33,0xe0,0x1, 0x1e,0xd7,0xe0,0x43, +0x3c,0x18,0xe0,0x1, 0x93,0xcd,0x67,0xa, 0x3b,0xf8,0xe0,0x67,0x3c,0x28,0xe8,0x40, +0x3f,0x79,0xe0,0x3, 0x3, 0xa1,0x17,0x81,0x66,0xa, 0xe8,0xf, 0x3f,0x99,0x3f,0x9c, +0x17,0x0, 0xe2,0x1, 0xc7,0xff,0x3b,0x6e,0x66,0x8, 0xe8,0x40,0x3e,0x7e,0xe0,0x3, +0x3, 0x81,0x66,0x8, 0x16,0x81,0xe8,0xd, 0x3e,0x9e,0x3e,0x9c,0x16,0x0, 0xe2,0x1, +0xc6,0xff,0x7e,0x9, 0x3e,0x1e,0xe0,0x1, 0x1a,0x72,0x36,0x21,0xa7,0x4, 0xe0,0xa, +0x3f,0x96,0x3f,0x1c,0xe0,0x1, 0x1e,0x57,0xe9,0xff,0xc7,0x7e,0x85,0x9c,0x37,0x41, +0xe0,0x1, 0x1e,0x79,0x61,0x9, 0x7f,0x12,0x36,0x41,0x67,0x9, 0xe2,0x1, 0xc5,0x7f, +0xe0,0x0, 0x6f,0xc3,0xe2,0x0, 0x7c,0x40,0x17,0x80,0x39,0x1d,0xe0,0x0, 0x6f,0x40, +0xe2,0x1, 0xc1,0x7f,0xe0,0x0, 0x6e,0xc2,0xe0,0x0, 0x6f,0xc5,0x7d,0xb, 0x7e,0x13, +0xe0,0x0, 0x6b,0x41,0xe0,0x0, 0x6d,0xc4,0xe0,0x9, 0xd5,0x2f,0xe0,0x1, 0x1f,0xf8, +0xf0,0x0, 0x9c,0xf, 0xe0,0x1, 0x1f,0xf7,0xf4,0x18,0x34,0x20,0xf0,0x0, 0x9d,0x8f, +0xe0,0x1, 0x1f,0xf6,0xf4,0x1b,0x35,0xa0,0xf0,0x0, 0x9d,0xf, 0xe0,0x1, 0x1f,0xf5, +0xf4,0x1a,0x35,0x20,0x9e,0x8f,0xe0,0x1, 0x1f,0xf4,0xf0,0x18,0x3c,0x1d,0x9f,0xf, +0xe0,0x1, 0x1f,0xf3,0xf0,0x1b,0x3d,0x9e,0x9f,0x8f,0x16,0x80,0xf0,0x1a,0x3d,0x1f, +0x67,0x8b,0x3f,0xf6,0xe0,0x1, 0x5, 0xc4,0xe0,0xf, 0x3b,0x33,0x66,0x89,0xa5,0x84, +0x3f,0x9d,0x66,0x8a,0x37,0xa1,0xe0,0xc, 0x3b,0x2d,0xe3,0xff,0xc6,0x7f,0x3d,0x9f, +0x7e,0x7, 0x17,0x2, 0x66,0x9, 0x67,0x88,0xe0,0x1, 0x1d,0x57,0x3e,0x2f,0x7e,0xd, +0x31,0xa1,0x66,0x9, 0xf1,0x39,0x3c,0x9e,0x79,0x8c,0xe4,0xc, 0x36,0x28,0xe4,0x3, +0x33,0x28,0xf1,0x2e,0x3f,0x1e,0x8a,0x9a,0x16,0x80,0x7d,0x86,0x3a,0x63,0x7e,0xe, +0xf0,0x0, 0x7c,0x82,0xe0,0x0, 0x7f,0x5, 0xe4,0x4, 0x32,0x48,0x67,0x9, 0x39,0x7e, +0xe0,0x1, 0x5, 0x84,0xf0,0x0, 0x67,0x6, 0x67,0x87,0x67,0xd, 0x66,0xa, 0xf0,0x0, +0x66,0x89,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x39,0x9f,0xe0,0xc, 0x3b,0x2c,0xe8,0x40, +0x3f,0xee,0x64,0x8e,0xf8,0x40,0x3f,0x6d,0x7e,0x3, 0xf0,0x40,0x3c,0xee,0x7b,0x4, +0xf0,0x40,0x3e,0xef,0x0, 0xbe,0x66,0x3, 0xe2,0x0, 0xce,0x1, 0xe0,0x0, 0x5, 0x53, +0x67,0x82,0xe0,0x0, 0x27,0xdf,0x66,0x5, 0x15,0x81,0xe0,0x0, 0x26,0x5b,0xe8,0x40, +0x3d,0x6c,0x3c,0x64,0x7e,0x81,0xdc,0x88,0x15,0x7e,0x3d,0x18,0xe2,0x1, 0xc5,0x7f, +0xe0,0xb, 0x33,0x1, 0xe2,0x0, 0xcd,0x1, 0xc4,0x7f,0xe0,0x43,0x3d,0x9b,0xe2,0x1, +0xc4,0x7f,0xe0,0x66,0x3d,0xab,0xe2,0x0, 0xcc,0x2, 0x66,0x81,0x2, 0x8b,0x65,0x4, +0xe8,0xb, 0x3b,0x3e,0x3d,0x36,0xf0,0x1a,0x3d,0x2b,0xf0,0x1b,0x3d,0xaa,0xf0,0x18, +0x3c,0x26,0xf0,0x0, 0xc7,0x1, 0xf4,0x9, 0x37,0x28,0x17,0x1, 0xe4,0xf, 0x34,0xc8, +0xe8,0xe, 0x3f,0x19,0x39,0x7f,0xf0,0x40,0x3c,0xee,0xf3,0xff,0xc4,0xff,0x5, 0xac, +0xe9,0x80,0x97,0x9d,0xe4,0x9, 0x34,0xc8,0x3f,0xa5,0xe0,0x43,0x3b,0x1f,0xe2,0x0, +0xcb,0x0, 0x5, 0x68,0x15,0x81,0x3d,0x9d,0x3b,0xf6,0xe2,0x1, 0xc5,0xff,0xe0,0x6d, +0x3d,0x2b,0xe2,0x0, 0xc9,0x80,0xe7,0xff,0x2, 0x30,0xe3,0xff,0xc9,0xff,0xe7,0xff, +0x4, 0x31,0xe8,0x43,0x3d,0x99,0xe2,0x0, 0xcd,0x80,0xe0,0x0, 0x5, 0x7d,0x67,0x8, +0xf0,0xb, 0x3f,0x2e,0xe2,0x0, 0xcd,0x81,0x5, 0x4d,0x67,0x82,0xe7,0xff,0x2f,0xa5, +0x15,0x80,0xe7,0xff,0x0, 0xa6,0x63,0x4, 0x66,0x6, 0x65,0xc, 0x67,0x7, 0x3e,0x1a, +0xc3,0x1, 0xe4,0x4, 0x33,0x28,0x7e,0x6, 0xc7,0x1, 0x66,0xb, 0xe4,0xf, 0x32,0x48, +0xe3,0xff,0xc7,0x7f,0x3e,0x7f,0x7f,0x7, 0xe7,0xfe,0x2, 0xe8,0xf2,0x0, 0xcc,0x0, +0x11,0x81,0x3f,0x63,0xe8,0x6e,0x39,0xa8,0x3c,0xee,0xf0,0x8, 0x35,0xa6,0xf0,0x40, +0x3c,0x6e,0x7e,0x81,0xe0,0x9, 0xd9,0x2f,0x67,0x8f,0xe0,0x0, 0x19,0xd, 0xc4,0x20, +0x39,0x1f,0xe0,0x7, 0xb4,0x62,0xe8,0x40,0x3c,0xe8,0xf0,0x8, 0x35,0x26,0xe0,0x9, +0xd9,0x22,0x17,0xa0,0x3f,0x98,0xe0,0x7, 0xb7,0xf2,0xe8,0x40,0x3c,0x6c,0xe0,0x6, +0xd3,0x53,0xe2,0x0, 0xcc,0x0, 0x39,0x68,0x66,0x81,0xe0,0x0, 0x5, 0x7e,0xe0,0x1, +0x1d,0x57,0xe0,0x43,0x39,0x12,0xe0,0x2, 0x8c,0xfa,0x2c,0x85,0x17,0x94,0xe0,0x2, +0xaf,0xfa,0x14,0x94,0xe8,0x40,0x3c,0x68,0x7e,0x81,0xe0,0x9, 0xd9,0x4, 0x3c,0x72, +0x3c,0xe2,0xe0,0x62,0x3d,0xa8,0xe0,0x0, 0x14,0x7f,0x3c,0x32,0x66,0xf, 0xe0,0x0, +0x19,0xd, 0x39,0x1c,0xe0,0x9, 0xd8,0xf7,0xe0,0x10,0xac,0x12,0x66,0x81,0x67,0xa, +0x67,0x88,0xe2,0x0, 0xce,0xad,0xe0,0x10,0xae,0xa2,0xe0,0x10,0xaf,0x32,0xe0,0x10, +0xaf,0xc2,0x5, 0x84,0x17,0xad,0xe0,0x10,0xaf,0xa2,0xe0,0x0, 0xc0,0x4c,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe3,0xff,0xcd,0xff,0xe7,0xfe,0x3, 0x55,0xe7,0xfe,0x0, 0xaa, +0x16,0xff,0x3e,0x93,0xe8,0xd, 0x3e,0xae,0x3e,0x7d,0x2, 0x30,0xf0,0xd, 0x37,0x21, +0xe8,0xc, 0x3e,0x2e,0xc6,0x81,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, 0xc6,0xff, +0xe7,0xfc,0x0, 0xfa,0x17,0xff,0x3f,0x92,0xe8,0xf, 0x3f,0xa9,0x3f,0x7f,0x2, 0xf, +0x3b,0x6e,0xf0,0xf, 0x34,0xa1,0xe8,0x6, 0x3b,0x29,0xc7,0x81,0xe2,0x1, 0xc3,0x7f, +0xe2,0x1, 0xc7,0xff,0xe0,0xe, 0x3b,0x33,0xe7,0xfc,0x0, 0xd8,0x63,0xa, 0x66,0x8a, +0xe8,0x6, 0x3b,0x29,0xe8,0xf, 0x39,0x19,0xe2,0x1, 0xc3,0x7f,0x3f,0xad,0xe0,0xe, +0x3b,0x33,0xe2,0x1, 0xc7,0xff,0xe7,0xfc,0x0, 0xc9,0x66,0x8, 0x65,0x8, 0xe8,0xd, +0x39,0x9e,0xe8,0xc, 0x3e,0x2e,0x3e,0xaa,0xe2,0x1, 0xc6,0x7f,0x7e,0x9, 0xe2,0x1, +0xc6,0xff,0xe7,0xfc,0x0, 0xc9,0x39,0x63,0xe7,0xff,0x0, 0x83,0xe2,0x0, 0xcc,0x1, +0x1, 0x11,0x4, 0x9b,0xc4,0x7c,0xe2,0x0, 0xcc,0x1, 0x5, 0x8c,0xe0,0x1, 0x1f,0x7d, +0xe0,0x1, 0x1f,0xf1,0xbf,0xf, 0xe0,0x1, 0x1f,0x70,0xe0,0x2, 0x1f,0x81,0xbf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0x7c,0xe0,0x1, 0x1f,0xf1,0xbf,0xf, 0xe0,0x1, 0x1f,0x6f, +0xe0,0x2, 0x1f,0x81,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x7e,0xe0,0x1, 0x1f,0xf1, +0xe2,0x0, 0xcc,0x82,0xbf,0xf, 0x1, 0x7, 0xe0,0x1, 0x1f,0x6e,0xe0,0x2, 0x1f,0x81, +0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0x6d,0xe0,0x2, 0x1f,0x81,0xbf,0xf, 0x38,0x82, +0x8, 0xb5,0xe0,0x2, 0x19,0x7a,0x8f,0x82,0x2f,0xb6,0xe0,0x1, 0x19,0xf1,0xe0,0x1, +0x1a,0x72,0xa4,0x83,0xa4,0x4, 0xe0,0x2, 0x1a,0x81,0xe0,0x4, 0xd2,0x8f,0xe0,0x2, +0x1f,0xfc,0x14,0x8c,0x9f,0x8f,0xa5,0x4, 0x3c,0x9f,0xa5,0x83,0xa4,0x5, 0xe3,0xff, +0xc4,0xff,0x0, 0x88,0xc7,0x81,0x9e,0x8c,0xe3,0xff,0xc7,0xff,0x3f,0xf9,0xb6,0x8e, +0x1, 0x19,0x8e,0x82,0xe0,0xe, 0x37,0xa1,0xe2,0x0, 0xce,0x81,0xe0,0xc, 0x3d,0x9e, +0x3f,0x1a,0x1, 0xf1,0xe0,0xe, 0x37,0xa1,0x3e,0xec,0xe0,0xc, 0x3c,0x1e,0x9e,0x8d, +0x96,0xc, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3f,0x1a,0x3e,0xac,0x3f,0xf9,0xb6,0x8e, +0x1, 0xe9,0xa, 0xe1,0xe0,0x2, 0x1a,0x81,0xe0,0x1, 0x19,0xf1,0xe0,0x1, 0x1a,0x72, +0xa5,0x5, 0xa4,0x83,0xa4,0x4, 0x15,0x81,0xe0,0x4, 0xd2,0x39,0x0, 0xc9,0xe0,0x0, +0x1f,0x8e,0x8f,0x8f,0x27,0xbc,0x14,0x7f,0x3c,0x1f,0xe0,0x2, 0x1f,0xfd,0xe2,0x1, +0xc4,0x7f,0xf0,0x0, 0x8b,0x5f,0xc4,0x1, 0xe0,0x0, 0x1e,0x8d,0xe0,0x1, 0x1f,0xf2, +0x34,0x21,0xf7,0xff,0x12,0xff,0xf0,0x0, 0xa3,0x8f,0xf8,0x15,0x3a,0x96,0x3c,0x1d, +0x14,0x80,0x0, 0x88,0x3e,0x7b,0x4, 0x1e,0xc7,0x7f,0xaf,0x1d,0xc6,0x82,0x3c,0x7d, +0x1, 0x1e,0x8f,0x8d,0x8f,0x1d,0xe8,0xf, 0x3f,0xb6,0x3e,0x69,0x3f,0x9e,0x37,0xa1, +0xf0,0xb, 0x3b,0x9f,0x95,0xb, 0x27,0x3, 0xe0,0x40,0x96,0x1b,0xe8,0x40,0x3f,0x75, +0x3d,0xe9,0x3, 0x4, 0xe8,0xf, 0x3f,0x97,0x95,0x9f,0x3d,0x7c,0x4, 0x64,0x3d,0x7b, +0x3, 0x66,0xc7,0x1, 0xaf,0x1d,0xc6,0x82,0x3c,0x7d,0x1, 0xe4,0x38,0x82,0x0, 0x0, +0x8, 0xb4,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0xc3,0x17,0x0, 0x8d,0x8f,0xe0,0x0, +0x19,0xd, 0xe0,0xc, 0x35,0xc3,0x3f,0xee,0x3e,0xee,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0x3f,0x12,0x3f,0xfc,0xe0,0xf, 0xae,0x8e,0x3f,0x6f,0x5, 0x78,0xe0,0x1, 0x1e,0x57, +0xe0,0x1, 0x1f,0xf2,0xe0,0x2, 0x1d,0x7d,0xf0,0x1, 0x93,0xc, 0xa7,0xf, 0xf0,0x0, +0x91,0xac,0xf0,0x0, 0x92,0x3c,0xf0,0x0, 0x92,0xfc,0xe0,0x3, 0x1e,0x40,0xf0,0x0, +0x80,0xca,0xf0,0x0, 0x81,0x5a,0xe4,0x0, 0x17,0x80,0xe2,0x0, 0x7c,0xae,0xe0,0x1, +0x1d,0x79,0xf0,0x0, 0x83,0x8c,0xe0,0x0, 0x1a,0xe, 0xe0,0x0, 0x19,0x8c,0x3f,0x1f, +0x3f,0x99,0x16,0x0, 0x37,0x41,0x37,0xc1,0x35,0x41,0xc5,0xff,0xe2,0x0, 0x7c,0x84, +0xe2,0x0, 0x7c,0x14,0xae,0x84,0xae,0x83,0xe0,0x1a,0xb6,0x52,0xe0,0x1a,0xb6,0x62, +0xe0,0x1a,0xb6,0x72,0xe0,0x1b,0xb6,0x12,0x7f,0x6, 0x7f,0x88,0x7d,0x7, 0xf0,0x0, +0x73,0x15,0x6d,0x96,0xf0,0x0, 0x6b,0x97,0xf0,0x0, 0x68,0x95,0xf0,0x0, 0x69,0x14, +0xf0,0x0, 0x71,0x92,0xf0,0x0, 0x72,0x13,0xf0,0x0, 0x72,0x94,0xe0,0x9, 0xd2,0x2d, +0x55,0x7, 0x5f,0x8, 0xe0,0x1a,0xb5,0x72,0xe0,0xb, 0x37,0x48,0xe0,0x0, 0x1d,0xb, +0x5f,0x86,0xaf,0xa, 0xe0,0xd, 0x37,0xc8,0xe0,0x0, 0x1f,0xa, 0xf0,0x0, 0x4b,0x84, +0xad,0x8e,0xe0,0x0, 0x1f,0x9, 0x4c,0x5, 0xf0,0x0, 0x53,0x3, 0x54,0x84,0x56,0x5, +0xaf,0x8e,0xe0,0x0, 0x1f,0x88,0xf0,0x0, 0xab,0x84,0xac,0x3, 0xf0,0x1a,0xb3,0x52, +0xe0,0x1a,0xb4,0xe2,0xe0,0x1b,0xb6,0x12,0xae,0x8f,0xf0,0x0, 0x23,0xa5,0xe0,0x1, +0x1d,0x6c,0xe0,0x0, 0x1e,0xd, 0x17,0x80,0xf0,0x0, 0x13,0x1, 0xe0,0xe, 0x37,0xc3, +0xe2,0x0, 0xc7,0x1f,0x3f,0x12,0x16,0x87,0xe0,0xf, 0x84,0x8e,0x3e,0xdf,0xe0,0x80, +0x9d,0x9a,0xf0,0xd, 0x33,0x3d,0x3e,0xc9,0xc7,0x81,0xe0,0xf, 0xae,0x8e,0xe2,0x1, +0xc7,0xff,0xe0,0xe, 0x35,0xc8,0xaf,0xc, 0xf0,0x40,0x3b,0xff,0xc6,0x2, 0xe0,0x40, +0xad,0x9c,0x1, 0xe5,0x24,0x19,0x15,0xff,0x3d,0x98,0xe2,0x1, 0xc5,0xff,0x35,0xa1, +0xe2,0x0, 0x7e,0xae,0xe0,0x0, 0x1f,0x8d,0xe2,0x0, 0x7f,0x2c,0xe0,0xb, 0x3d,0x9d, +0xe0,0x80,0x9e,0x9e,0xc7,0x82,0xe0,0xc, 0x36,0xc8,0x3d,0xfe,0xe0,0x7, 0xae,0x2f, +0xe0,0x7, 0xae,0xbf,0x1, 0xf6,0xe0,0x0, 0xc0,0x68,0xa, 0x61,0xe0,0x2, 0x1f,0xfd, +0xf0,0x0, 0x89,0xdf,0xf0,0xa, 0x31,0xc1,0xf0,0x0, 0x21,0xde,0xe0,0x1, 0x1f,0x72, +0x14,0x0, 0xf0,0x0, 0xa2,0x8e,0x8d,0xef,0xf0,0x1, 0x19,0x7f,0xf0,0x17,0x31,0xa1, +0x35,0x21,0xf8,0x40,0x3a,0x65,0x3c,0xe8,0xf0,0x40,0x3b,0x68,0x17,0x81,0xe8,0xf, +0x3f,0xd6,0x27,0xa6,0x25,0x97,0xe0,0x1, 0x17,0x7e,0xe8,0xe, 0x3f,0x56,0xe0,0x65, +0xc7,0x10,0xe8,0xe, 0x3f,0x12,0xe8,0x40,0x3e,0xe5,0x17,0x80,0xc7,0x81,0x96,0xd, +0xe2,0x1, 0xc7,0xff,0x3f,0xfb,0xb6,0xe, 0x3c,0x9c,0xe8,0xd, 0x3e,0x97,0x3f,0x1a, +0x1, 0xf6,0xf0,0x0, 0xc3,0x1, 0xf2,0x1, 0xc3,0x7f,0xf8,0x40,0x39,0xf6,0xf0,0x0, +0xc2,0x82,0xf0,0x0, 0xc2,0x2, 0x1, 0xdb,0xe0,0x28,0x3c,0x19,0x38,0x82,0x25,0xf2, +0xe0,0x1, 0x17,0x7e,0xe8,0xe, 0x3f,0x56,0xe0,0x6b,0xc7,0x38,0xe8,0xe, 0x3f,0x12, +0xe8,0x40,0x3e,0xe4,0xc7,0x81,0x96,0xd, 0xe2,0x1, 0xc7,0xff,0x3f,0xfb,0xb6,0xe, +0x3c,0x1c,0xe8,0xd, 0x3e,0x97,0x3f,0x1a,0x1, 0xf6,0xf0,0x0, 0xc3,0x1, 0xf2,0x1, +0xc3,0x7f,0xf8,0x40,0x39,0xf6,0xf0,0x0, 0xc2,0x82,0xf0,0x0, 0xc2,0x2, 0xe7,0xff, +0x1, 0xb7,0x0, 0xdb,0xe8,0x40,0x3c,0x63,0x38,0x82,0x0, 0x0, 0x8, 0xb6,0xe1,0xff, +0xc0,0x18,0xe0,0x1, 0x1f,0xc3,0x17,0x0, 0x8d,0x8f,0xe0,0x0, 0x19,0x8d,0x39,0x68, +0xe0,0xc, 0x35,0xc3,0x3f,0xee,0x3e,0xee,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0x13, +0x3f,0xfc,0xe0,0xf, 0xae,0x8e,0x3f,0x6f,0x5, 0x78,0xe0,0x0, 0x1b,0xe, 0xe0,0x0, +0x1a,0x8c,0x17,0x80,0xae,0x86,0xae,0x85,0xe0,0x1a,0xb7,0xd3,0xe0,0x1a,0xb7,0xe3, +0xe0,0x1a,0xb7,0xf3,0xe0,0x1b,0xb7,0x93,0xe0,0x1, 0x21,0x7f,0xe0,0x1, 0x1f,0xeb, +0x37,0xc1,0x7f,0x86,0xe2,0x0, 0x7e,0x2e,0xe0,0x2, 0x1e,0xfd,0xe0,0x1, 0x1a,0x42, +0x8f,0x5d,0xe0,0x1, 0x1f,0xd7,0xf0,0x0, 0x81,0xcd,0xe0,0xe, 0x8c,0xa4,0xe0,0x1, +0x1e,0xf9,0xf0,0x0, 0x92,0x2f,0xf0,0x0, 0x92,0xbf,0xf0,0x0, 0x93,0x7f,0xf0,0x1, +0x93,0x8f,0xe0,0xe, 0x8c,0x14,0xe0,0xf, 0x37,0x41,0xe9,0xff,0xc6,0x7e,0x36,0x41, +0x36,0xc1,0xc5,0xff,0xe0,0x1, 0x15,0x78,0x34,0xc1,0x6f,0x94,0x17,0x81,0x7e,0x8, +0x7e,0x87,0xf0,0x0, 0x69,0x95,0xf0,0x0, 0x72,0x12,0xf0,0x0, 0x72,0x93,0xf0,0x0, +0x73,0x14,0x6d,0x96,0x6f,0x97,0xf0,0x0, 0x73,0x95,0xe0,0x9, 0xd0,0x47,0xe2,0x0, +0x7c,0x84,0xe2,0x0, 0x7c,0x14,0xe0,0x9, 0xd0,0xf8,0xe0,0xe, 0x8c,0xa4,0xe0,0xe, +0x8c,0x14,0xe0,0x1, 0x15,0x78,0xe0,0x9, 0xd0,0x39,0x56,0x7, 0x5f,0x8, 0x5f,0x86, +0xe0,0x1a,0xb6,0x73,0xe0,0x16,0x37,0x47,0xe0,0x0, 0x1e,0xb, 0x4c,0x84,0x4d,0x5, +0x54,0x3, 0x55,0x84,0xf0,0x0, 0x1a,0xa, 0x56,0x85,0xe0,0x15,0x37,0xc7,0xf0,0x0, +0x19,0x88,0xaf,0xc, 0xf2,0x1, 0xc3,0x7e,0xe0,0x0, 0x1f,0x9, 0xf2,0x1, 0xc2,0xfe, +0xac,0x86,0xad,0x5, 0xe0,0x1a,0xb4,0x53,0xe0,0x1a,0xb5,0xe3,0xf8,0x0, 0xab,0x4, +0xe0,0x1b,0xb6,0x93,0xaf,0x8e,0xf8,0x0, 0xaa,0x83,0xe0,0x0, 0x29,0x4d,0x24,0xa5, +0xf0,0x1, 0x1b,0xec,0xe0,0x0, 0x1e,0xd, 0x3c,0x62,0x11,0x1, 0xe0,0xf, 0x34,0x43, +0xe2,0x0, 0xc7,0x9f,0x3f,0x93,0x17,0x7, 0xe0,0xf, 0x85,0x8f,0x3f,0x58,0xe8,0x80, +0x9e,0x97,0xe0,0xe, 0x31,0x3e,0x3f,0x4b,0xc4,0x1, 0xe0,0xf, 0xaf,0xf, 0xe0,0xb, +0x36,0xa1,0x17,0x81,0x36,0xc8,0xe2,0x1, 0xc4,0x7f,0xae,0x8c,0x3f,0x9b,0xc6,0x2, +0x3c,0xf8,0xe0,0x40,0xaf,0x9c,0x1, 0xe3,0x25,0x1b,0x15,0xff,0x3d,0x9a,0xe2,0x1, +0xc5,0xff,0x35,0xa1,0xe2,0x0, 0x7f,0xae,0xe0,0x0, 0x1f,0xd, 0xe2,0x0, 0x7e,0x2c, +0xe0,0xb, 0x3d,0x9f,0xe0,0x80,0x9f,0x9c,0xc7,0x2, 0xe0,0xd, 0x37,0xa1,0xc6,0x81, +0x37,0xc8,0x3d,0xfc,0xe0,0x7, 0xaf,0xae,0xe0,0x7, 0xae,0xbe,0x1, 0xf4,0xf0,0x0, +0xc3,0x1, 0xf0,0x0, 0xc2,0x81,0xf8,0x0, 0xab,0x4, 0xf8,0x0, 0xaa,0x83,0xe0,0x0, +0xc0,0x68,0xb, 0x61,0x24,0xa4,0xe0,0x1, 0x1c,0x6c,0xe0,0x0, 0x1d,0x8d,0x17,0x80, +0xf0,0x0, 0x13,0x81,0xe0,0xe, 0x37,0xc3,0xe2,0x0, 0xc7,0x1f,0x3f,0x13,0x16,0x87, +0xe0,0xf, 0x81,0xe, 0x3e,0xdf,0xe0,0x80,0x9e,0x18,0xf0,0xd, 0x33,0xbd,0x3e,0xc2, +0xc7,0x81,0xe0,0xf, 0xae,0x8e,0xe2,0x1, 0xc7,0xff,0xe0,0xe, 0x36,0x48,0xaf,0xb, +0x36,0x21,0xc5,0x82,0x3c,0xff,0xe0,0x40,0xae,0x1b,0x1, 0xe5,0x25,0x59,0x15,0xff, +0x3d,0x9a,0xe2,0x1, 0xc5,0xff,0x35,0xa1,0xe2,0x0, 0x7f,0xae,0xe0,0x0, 0x1f,0xd, +0xe2,0x0, 0x7e,0xac,0xe0,0xb, 0x3d,0x9f,0xe0,0x80,0x9f,0x9d,0xc7,0x2, 0xe0,0xc, +0x37,0xc8,0x3d,0xfd,0x37,0xa1,0xe0,0x7, 0xae,0x2e,0xe0,0x7, 0xaf,0xbe,0x1, 0xf5, +0xe0,0x0, 0xc0,0x68,0xb, 0x61,0xe0,0x1, 0x1f,0xea,0x37,0xc1,0x7f,0x86,0xe7,0xfe, +0x0, 0x83,0x8, 0xb4,0xe0,0x0, 0x1f,0x87,0x17,0x0, 0xaf,0xf, 0xdd,0xa2,0xe0,0x3, +0x1f,0xc7,0xea,0x10,0x79,0x78,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x21,0xe0,0x0, +0x1f,0x8e,0x8f,0xf, 0x27,0x10,0x87,0x82,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0xb2,0x2, 0x94,0xaf,0x82,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x9, 0xa, 0x61,0xe0,0x1, 0x1f,0xe9,0xaf,0x2, 0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0xf9,0xe0,0x0, 0x1f,0x86,0xaf,0xf, 0xa, 0x61,0x17,0xb2,0x0, 0xec,0x8c,0x2, +0xe0,0x0, 0x19,0x8e,0xe0,0x6, 0xd2,0xae,0xe0,0x0, 0x1f,0x93,0x8f,0x3, 0x8f,0x8f, +0xe0,0x0, 0x1e,0x9a,0x3f,0x7f,0xac,0xd, 0x1, 0x56,0x8e,0x82,0x17,0xb1,0xe1,0x2f, +0x3f,0xad,0x27,0xd1,0x2c,0x50,0xe0,0x1, 0x1f,0xe8,0x87,0x8f,0xe2,0x1, 0xc7,0xfd, +0x2f,0xca,0xe0,0x2, 0x1a,0x48,0x8f,0x84,0xe2,0x0, 0xcf,0x81,0x1, 0xc, 0x8f,0x84, +0xe2,0x0, 0xcf,0x81,0x1, 0x4, 0x8f,0x3, 0xe7,0xff,0x0, 0xbe,0xdd,0x11,0x8f,0x3, +0xe7,0xff,0x0, 0xba,0xde,0x14,0xde,0x7b,0x0, 0xf3,0xea,0x10,0x7f,0xfe,0xea,0x11, +0x7f,0x2, 0x97,0x8f,0x9e,0x8e,0xe4,0x8, 0x34,0x23,0xe0,0xe, 0x3f,0xad,0xe0,0x43, +0x3f,0x1e,0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d,0x3f,0xad,0xe0,0x41,0x3f,0x4e, +0xe4,0x8, 0x34,0x40,0xe0,0x6f,0x3d,0x2e,0x3f,0xf8,0x2, 0x17,0xea,0x10,0x7f,0xfc, +0xea,0x11,0x7f,0x0, 0x97,0x8f,0x9e,0x8e,0xe0,0xe, 0x3f,0xad,0xe0,0x43,0x3f,0x1e, +0xe2,0x0, 0xcf,0x0, 0xe0,0x43,0x3e,0x9d,0x3f,0xad,0xe0,0x41,0x3f,0x4e,0xe0,0x6f, +0x3d,0x2e,0xe0,0x28,0x3c,0x2f,0x38,0x82,0x14,0x0, 0x38,0x82,0xea,0x10,0x7f,0xfa, +0x17,0x0, 0xaf,0xf, 0x38,0x82,0xea,0x11,0x7c,0x4, 0xe0,0x7d,0x0, 0xdb,0x0, 0x0, +0x8, 0xb6,0xea,0x10,0x79,0x7a,0xe0,0x2, 0x1f,0xdf,0x8e,0x82,0xe0,0x2, 0x1f,0x5e, +0x8e,0xf, 0x26,0x8f,0xea,0x11,0x79,0x84,0x9f,0x83,0x27,0x85,0x17,0x81,0xe1,0x2f, +0x3e,0x1f,0x27,0x96,0x14,0x0, 0x17,0x80,0xaf,0x82,0x17,0x80,0xb7,0x83,0xb, 0x61, +0xe0,0x2, 0x1f,0xdd,0xe2,0x0, 0xce,0x1, 0x8c,0xf, 0x1, 0x15,0xea,0x49,0x7f,0xb0, +0xe9,0xff,0xc7,0xff,0xe0,0xe, 0x36,0xa2,0x3f,0x9e,0xa7,0x8f,0x3f,0x82,0xe0,0x2, +0x1d,0xdd,0xe2,0x0, 0xce,0x1, 0xe0,0x0, 0x8c,0xb, 0xe0,0x1, 0x1, 0xa5,0xe2,0x0, +0xce,0x84,0x1, 0x61,0xe0,0x1, 0x1f,0xc1,0xe0,0x6, 0x9a,0x2e,0x8d,0x8f,0xe0,0x1, +0x1f,0xc0,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0x7f,0xe0,0x1, 0x5, 0x91,0xe0,0x1, +0x1f,0xbf,0x8d,0x8f,0xe0,0x1, 0x1f,0xbe,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0x7f, +0xe0,0x1, 0x3, 0x86,0xe0,0x1, 0x1f,0xbd,0xe0,0x6, 0x9a,0xbe,0x8d,0x8f,0xe0,0x1, +0x1f,0xbc,0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3a,0xff,0xe0,0x0, 0x5, 0xf9,0xe0,0x1, +0x1f,0xbb,0x8f,0xf, 0xe0,0x1, 0x1f,0xba,0x37,0x28,0x8f,0x8f,0x3f,0xce,0x3a,0xff, +0xe0,0x0, 0x3, 0xee,0xe2,0x0, 0xce,0x84,0xe0,0x1, 0x2, 0x9d,0xea,0x49,0x7f,0xc4, +0xe9,0xff,0xc7,0xff,0x36,0xa2,0x3f,0x9d,0xa7,0x8f,0x3f,0x82,0x12,0x80,0x3a,0x65, +0x17,0x81,0xe0,0x2c,0x3e,0xf, 0xe0,0x0, 0x26,0x59,0xe0,0x0, 0x2c,0x57,0xea,0x10, +0x7f,0xfc,0xea,0x10,0x7f,0x7e,0xb2,0x8f,0xe0,0x1, 0x1f,0xb9,0xb2,0xe, 0xea,0x11, +0x79,0x84,0x8e,0x8f,0xe0,0x1, 0x1f,0xb8,0x8f,0xf, 0xe0,0x1, 0x1f,0xb7,0x37,0x28, +0x8b,0xf, 0xe0,0x1, 0x1f,0xb6,0x36,0xa8,0x8f,0x8f,0x3b,0x4d,0x3f,0xce,0x9f,0x3, +0xe0,0xf, 0x3b,0x2f,0x3f,0x7f,0xe7,0xfe,0x2, 0x7f,0xe0,0x1, 0x1f,0xb5,0x8c,0xf, +0xdf,0x2d,0xe7,0xfe,0x24,0x79,0xea,0x11,0x7f,0x80,0xea,0x11,0x7f,0x2, 0x14,0x0, +0xb2,0x8f,0x17,0x83,0xb2,0xe, 0xaf,0x82,0xb3,0x3, 0xb, 0x61,0xea,0x11,0x79,0x84, +0x14,0x24,0xe7,0xfe,0x0, 0xea,0x2e,0x14,0xe2,0x0, 0xce,0x81,0xe0,0x0, 0x1, 0x44, +0xe0,0x1, 0x1f,0xb4,0x3c,0x6c,0x8e,0x8f,0xe0,0x1, 0x1f,0xb3,0x36,0xa8,0x8f,0xf, +0xea,0x11,0x7f,0x84,0x3f,0x4d,0x16,0x84,0xae,0x82,0xb7,0xf, 0xb, 0x61,0x12,0x80, +0x3a,0x65,0xe0,0x1, 0x1e,0xb2,0xea,0x10,0x7f,0x7e,0xea,0x10,0x7f,0xfc,0x8c,0xd, +0xb2,0xe, 0xb2,0x8f,0xde,0xfb,0x24,0x3, 0x14,0x0, 0xb, 0x61,0xea,0x11,0x79,0x84, +0xe7,0xfe,0x0, 0xc2,0xe2,0x0, 0xce,0x84,0xe7,0xfe,0x5, 0xca,0xe7,0xfe,0x0, 0xbc, +0xe0,0x43,0x3a,0x14,0xe0,0x43,0x3a,0x95,0x0, 0xe5,0x2c,0x6f,0xea,0x11,0x7f,0x0, +0xea,0x11,0x7f,0x82,0xb2,0x8e,0xe0,0x1, 0x1f,0x39,0xb2,0xf, 0xea,0x11,0x7f,0x84, +0x8e,0x8e,0xe0,0x1, 0x1f,0x37,0x36,0xa8,0x8f,0xe, 0x3f,0x4d,0x16,0x81,0xae,0x82, +0xb7,0xf, 0xb, 0x61,0xe0,0x1, 0x1f,0xb9,0x3c,0x6c,0x8e,0x8f,0xe0,0x1, 0x1f,0xb7, +0x36,0xa8,0x8f,0xf, 0xea,0x11,0x7f,0x84,0x3f,0x4d,0x16,0x82,0xae,0x82,0xb7,0xf, +0xb, 0x61,0xea,0x11,0x79,0x84,0x14,0x0, 0xe7,0xfe,0x0, 0x8f,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xe2,0x0, 0xcc,0x1, 0x39,0x69,0xe0,0x0, 0x5, 0xd1,0x12,0xfe,0xf0,0x0, +0x1d,0xd0,0x3a,0x98,0xe0,0x0, 0x1f,0xcc,0xea,0x11,0x7a,0xc, 0xe2,0x1, 0xc2,0xff, +0xfa,0x11,0x7f,0x2c,0xc2,0x81,0xf0,0x0, 0x14,0x80,0xe8,0x0, 0x93,0x8b,0x93,0xf, +0x3a,0x94,0xf8,0x40,0x3e,0x69,0xf0,0x0, 0x14,0x1, 0x8c,0x4, 0xf0,0x80,0x8e,0x94, +0xe8,0x0, 0x8c,0x8e,0xf8,0x80,0x8d,0x1e,0xe8,0x8, 0x3c,0x2d,0xe8,0x9, 0x3c,0xaa, +0x34,0x24,0xe0,0x9, 0xd3,0x75,0x39,0xe8,0x8c,0x14,0xe8,0x0, 0x8c,0x9e,0xf0,0x8, +0x3e,0xa8,0xf0,0x9, 0x3d,0x29,0x34,0x24,0xe0,0x9, 0xd3,0x6a,0xe0,0xf, 0x39,0xa8, +0x16,0x85,0x3e,0x9f,0x17,0x1, 0x3f,0x12,0xe2,0x0, 0xce,0x8b,0xe2,0x1, 0xc7,0x7f, +0xe0,0x62,0x3b,0xae,0x3f,0xf7,0x39,0xef,0x5, 0x5, 0xe0,0x43,0x3b,0x9f,0xf8,0x40, +0x3e,0x68,0x3f,0xf6,0x3, 0x5, 0xe0,0x43,0x3b,0x13,0xf8,0x40,0x3c,0xe8,0x3a,0x75, +0x1, 0xcd,0xf0,0x0, 0x2e,0x8, 0xf0,0x0, 0x2c,0x89,0x3c,0x62,0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe8,0x0, 0xb3,0x8b,0x0, 0xf8,0xe0,0x0, 0x1f,0xcc,0xb3,0xf, 0x0, 0xf6, +0x8, 0xb7,0x12,0x0, 0x16,0xff,0xf0,0x0, 0x13,0x9f,0x3e,0x98,0xf0,0x17,0x3b,0x98, +0xc4,0xff,0x3d,0x64,0x3c,0x64,0x3d,0xe4,0xe0,0x40,0x3e,0x64,0xe0,0x80,0x8f,0x9d, +0xe0,0x80,0x8f,0x19,0xe0,0x3, 0x3f,0xbf,0xe0,0x5, 0x3f,0x3e,0xe0,0x2, 0x3f,0x3f, +0xf0,0x40,0x3b,0xfd,0x3e,0x1e,0x3d,0x9f,0x3c,0x15,0x3d,0x13,0x3a,0x12,0x1, 0xef, +0xe0,0x2, 0x36,0x5, 0xe4,0x0, 0xc4,0x64,0xe0,0x0, 0x12,0xe4,0x3a,0xba,0xe0,0x4, +0x14,0xb5,0xe0,0x6, 0x39,0x32,0xe0,0x3, 0x35,0x85,0xe0,0x9, 0xd3,0x11,0xe0,0x6, +0x3c,0x26,0xe0,0x4, 0x14,0xb5,0x3c,0x65,0xe0,0x9, 0xd3,0xa, 0xe0,0x7, 0x39,0xb3, +0x17,0x80,0xe0,0x2f,0x3b,0xf, 0xe0,0x7, 0x3c,0x27,0xe0,0x0, 0x14,0x64,0x2f,0x9d, +0xe0,0x25,0x3b,0x8f,0x2a,0x9a,0x3c,0x34,0xe0,0x4, 0x14,0xb5,0x39,0x33,0xe0,0x9, +0xd2,0xf7,0xe0,0x2, 0x3c,0x22,0xe0,0x0, 0x14,0x64,0x3c,0x32,0x3c,0xe6,0xe0,0x9, +0xd2,0xef,0x3c,0x32,0x3c,0xe7,0xe0,0x9, 0xd2,0xeb,0xe0,0x43,0x3f,0x98,0xe2,0x0, +0xcf,0x80,0x4, 0x6, 0xe0,0x43,0x3c,0x18,0xe2,0x1, 0xc4,0x7f,0xb, 0xe1,0x3c,0x65, +0x0, 0xfa,0x8, 0xb1,0xea,0x11,0x7f,0x87,0x8f,0x8f,0xe0,0xe, 0x34,0xa1,0xe0,0xd, +0x35,0x21,0x3f,0x18,0xc7,0xff,0x3c,0x1d,0x86,0x9e,0x3c,0xff,0x16,0x0, 0x38,0xed, +0x85,0x98,0xe0,0x61,0x39,0xac,0x3e,0x61,0x2d,0x88,0x3c,0xfa,0xb6,0x88,0x1, 0x2, +0xb5,0x8e,0x3c,0xff,0x1, 0xb, 0x8, 0xe1,0x3c,0xfa,0x1, 0x7c,0x3e,0x9b,0x36,0x81, +0xb6,0x88,0x3c,0xff,0x16,0x80,0xb6,0x8e,0x1, 0xf7,0xb6,0x8, 0x8, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xff,0xc0,0xc, 0xea,0x11,0x7b,0xab,0xea,0x11, +0x7e,0xb, 0x16,0xa0,0x7e,0x6, 0xc4,0x7e,0xc4,0xfe,0x3e,0x97,0xe0,0x40,0x3f,0xec, +0xe0,0x80,0x97,0x18,0xe0,0x80,0xaf,0x17,0x3e,0xf7,0xe0,0x80,0x97,0x19,0xe0,0x80, +0xaf,0x1f,0x1, 0xf7,0xe0,0x2, 0x1f,0x86,0x8a,0xf, 0xe0,0x4, 0x22,0x5c,0xfa,0x11, +0x79,0xac,0xf8,0x40,0x3c,0x63,0xe0,0x2, 0x1f,0x29,0xf8,0x0, 0x8d,0x88,0x17,0x80, +0xf0,0x40,0x3d,0x6e,0x7f,0x9, 0xf0,0xc, 0x35,0xa4,0xe0,0x7, 0x17,0x68,0xf0,0x0, +0x16,0xd3,0xe8,0x40,0x39,0xea,0x7f,0x87,0xf0,0x40,0x3c,0xef,0x7e,0xb, 0xf0,0x1d, +0x3e,0x90,0x7f,0x88,0xf0,0x40,0x3e,0x6f,0x7f,0x8a,0x13,0x20,0xe0,0x0, 0x7f,0xc, +0xf0,0x40,0x3d,0x67,0xe0,0x0, 0x15,0x44,0x3c,0xe3,0xe2,0x0, 0x7c,0x34,0xe0,0x9, +0xd2,0xd1,0xe0,0x0, 0x1f,0xcc,0xe0,0xff,0x16,0x7f,0xe0,0x0, 0x1f,0x50,0xb6,0xf, +0x16,0x33,0x17,0x80,0x15,0x0, 0x3e,0x10,0xb7,0x8e,0xe8,0x40,0x3d,0xe8,0xe8,0x40, +0x3c,0x6d,0x64,0x86,0xf8,0x40,0x3b,0x68,0xe8,0x40,0x3e,0xeb,0xe8,0x40,0x3a,0xec, +0xe8,0x40,0x39,0x6c,0xe8,0x40,0x3b,0xec,0xf8,0x40,0x3f,0x6c,0x0, 0x83,0xe8,0x80, +0x8e,0x96,0xf0,0x80,0x8b,0x9c,0xe3,0xff,0xc6,0xff,0xf0,0xe, 0x3b,0xad,0xe0,0x43, +0x3f,0x9e,0xe8,0xd, 0x3e,0xa7,0xe2,0x0, 0xcf,0x80,0xe0,0x43,0x3e,0x9d,0xe0,0x6f, +0x3d,0x2d,0xf0,0x80,0x8b,0x98,0xe0,0x80,0x8e,0x99,0xe8,0x40,0x3f,0xfe,0xf0,0xe, +0x3b,0xad,0xe0,0x7e,0x3b,0x2f,0xe2,0x0, 0xcf,0x0, 0xe8,0xd, 0x3e,0xa7,0xe0,0x6e, +0x3d,0x2d,0xf0,0x40,0x3b,0xee,0xf3,0xff,0xc3,0xff,0xe3,0xff,0xc7,0xff,0xe8,0xd, +0x3f,0x97,0x3f,0x77,0xe8,0x5, 0x3a,0x97,0xf0,0x43,0x3b,0x9d,0xe0,0x67,0x3b,0x2e, +0xf0,0x40,0x3b,0xfa,0x3f,0x92,0xe0,0x43,0x39,0x1f,0xe0,0x43,0x3a,0x95,0x3, 0x2, +0x3e,0xea,0xf0,0x40,0x3e,0xfc,0xe0,0x43,0x3d,0x1d,0x1, 0xc2,0xe8,0x40,0x3e,0x6b, +0x17,0x0, 0xe0,0x0, 0x16,0xff,0x0, 0x83,0xe0,0x80,0x8e,0x1b,0xe4,0xf, 0x36,0x28, +0xf0,0x40,0x3b,0xed,0xe4,0x8, 0x37,0xc8,0xf2,0x1, 0xc3,0xff,0xf0,0x40,0x3b,0xf8, +0x3c,0xee,0xe2,0x1, 0xc4,0xff,0x3f,0xe8,0x5, 0x82,0x3e,0xec,0x3c,0xff,0xe2,0x1, +0xc6,0xff,0x3, 0x82,0x3f,0x6c,0xf0,0x40,0x3d,0x7b,0xe2,0x1, 0xc7,0x7f,0x1, 0xe5, +0xf0,0x2f,0x3f,0x16,0xe0,0x1, 0x27,0xdc,0xe0,0x2f,0x3b,0x96,0xe0,0x1, 0x27,0xd8, +0xf0,0x0, 0xc4,0x81,0xf2,0x1, 0xc4,0xff,0xf0,0x40,0x3c,0xf4,0xe0,0x0, 0xc1,0xc4, +0xe7,0xfe,0x1, 0xea,0xe0,0x9, 0x3f,0x2d,0x64,0xb, 0xe2,0x1, 0xc4,0xff,0xe0,0x9, +0xd1,0xd7,0x67,0x88,0x3a,0x68,0xc7,0xff,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0xe0,0x1, +0x17,0xfd,0xe1,0x2f,0x3f,0xae,0xe2,0x1, 0xc2,0x7f,0xe0,0x2, 0x27,0xc9,0x66,0xa, +0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3e,0x1f,0xe0,0x2, 0x27,0xc2,0x67,0x87,0xeb,0xc8, +0x79,0x78,0xea,0x11,0x79,0x88,0x67,0x8, 0xc7,0x81,0xf0,0x0, 0x66,0x7, 0xaf,0x82, +0xaf,0x3, 0xe0,0x0, 0x17,0xc4,0xe8,0xf, 0x3f,0xbc,0x67,0x9, 0x3f,0x1f,0xe0,0x8, +0x87,0x2e,0xc7,0x4f,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x2, 0x5, 0x9c, +0x67,0x8, 0xe2,0x0, 0xcf,0x31,0xe0,0x2, 0x1, 0x0, 0x67,0x8, 0xe2,0x0, 0xcf,0x50, +0xe0,0x2, 0x1, 0x58,0x67,0x88,0xe2,0x0, 0xcf,0xb3,0xe0,0x1, 0x1, 0x84,0xe2,0x0, +0xca,0x8, 0xe0,0x0, 0x2, 0xfb,0x14,0x80,0x14,0x1e,0xdd,0xf1,0xe0,0x0, 0x1f,0xcc, +0x97,0x8f,0xe3,0xff,0xcf,0xca,0xe0,0x2, 0x3, 0x55,0xf0,0x2, 0x1a,0xad,0xf0,0x2, +0x1a,0x3, 0xf0,0x2, 0x19,0x35,0xf0,0x0, 0x18,0xa5,0xea,0x11,0x7d,0x2c,0x12,0x0, +0x17,0x80,0xea,0x11,0x7c,0x8c,0xf0,0x0, 0x13,0x9d,0xe8,0x0, 0xb7,0x85,0xe8,0x0, +0xb7,0x84,0xf0,0x17,0x3b,0x9a,0xe8,0x0, 0xb7,0x82,0x3a,0xe4,0xe8,0x0, 0xb7,0x81, +0xf0,0x40,0x39,0xe4,0x3c,0x64,0xf0,0x40,0x3b,0x64,0x3b,0x64,0xf0,0x40,0x3c,0x64, +0xf0,0x40,0x38,0x64,0x3e,0xe4,0x13,0x81,0x0, 0x90,0xe2,0x0, 0xcd,0x80,0xe0,0x43, +0x3a,0x9e,0x3a,0x67,0xe0,0xe, 0x3f,0x96,0x4, 0x28,0xe0,0x43,0x3b,0x1e,0xf0,0x40, +0x3b,0x67,0xf0,0x40,0x3b,0xfa,0x1, 0x29,0x8d,0x8a,0x8f,0x1a,0x8f,0x99,0xf0,0x0, +0x8c,0x89,0x3f,0x2b,0x3e,0x6e,0xe8,0xf, 0x3f,0xa9,0xe2,0x0, 0xcf,0x0, 0xe3,0xff, +0xc7,0xff,0xe3,0xff,0xc6,0x7f,0xc5,0x1, 0xe0,0x43,0x3d,0x9f,0xc4,0x81,0xe0,0xe, +0x3e,0x15,0x3, 0x5c,0xe2,0x0, 0xcd,0x80,0x3e,0x18,0xe0,0x43,0x3c,0x1c,0xf0,0x40, +0x39,0xe7,0xe0,0xe, 0x3f,0x96,0x3, 0x5a,0x3f,0x9d,0xe0,0x43,0x3e,0x9f,0xf0,0x40, +0x38,0x6d,0xf0,0x40,0x3c,0x67,0x0, 0xd6,0xf0,0x2, 0x2c,0x11,0xf0,0x0, 0x23,0x4, +0xe8,0x0, 0xb3,0x2, 0xf0,0x0, 0x21,0x84,0xe8,0x0, 0xb4,0x4, 0x22,0x3, 0xe8,0x0, +0xb2,0x85,0xe3,0xff,0xce,0xe3,0x4, 0x6, 0xe0,0x0, 0x17,0xfc,0xaf,0x82,0x17,0x80, +0xaf,0x83,0xe0,0x0, 0xc0,0x74,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x16,0x30,0xf0,0x2f, +0x3f,0x1c,0xe7,0xfe,0x2f,0xa7,0xe0,0x2f,0x3b,0x9c,0xe7,0xfe,0x2f,0xa3,0xe2,0x6, +0xc9,0x0, 0xe7,0xfe,0x2, 0x1f,0xeb,0xc8,0x7f,0xf9,0x8f,0x8f,0x16,0xc, 0x3e,0x3f, +0x3a,0xfc,0xe7,0xfe,0x2, 0x17,0xe8,0x40,0x3c,0xe8,0xe2,0x0, 0x7c,0x34,0x7e,0x82, +0x7f,0x1, 0x7d,0x3, 0x7f,0x84,0xdd,0xb5,0xea,0x11,0x7c,0x8c,0x3d,0xe8,0xe2,0x0, +0x7c,0x54,0x7d,0x85,0xdd,0xae,0x16,0x3b,0xe1,0x29,0x3e,0x28,0x65,0x85,0x66,0x82, +0x67,0x1, 0xe7,0xfd,0x2c,0xff,0xe1,0x2c,0x3e,0x2b,0xe7,0xfd,0x2e,0x7b,0xe0,0x16, +0x3d,0xbb,0xe0,0xc, 0x3c,0x38,0xe0,0x9, 0x3d,0x98,0xf0,0x8, 0x3b,0x1c,0xe0,0x9, +0xd1,0x1a,0x3d,0xe8,0xe2,0x1, 0xc5,0xff,0xe2,0x0, 0xcd,0xd9,0x65,0x3, 0x66,0x82, +0x67,0x1, 0x67,0x84,0xe0,0x0, 0x5, 0xd9,0xe0,0x0, 0x16,0x64,0xf0,0xf, 0x3f,0x17, +0x3e,0x2b,0x36,0x21,0x3f,0x9a,0x3f,0x9c,0x66,0xc, 0xe0,0x43,0x3f,0x9f,0x3f,0xfc, +0x3, 0x8, 0xe0,0x0, 0x4e,0x76,0x7f,0x8c,0x7e,0x8, 0x7d,0x8a,0xf0,0x0, 0x7c,0x87, +0xe0,0x0, 0x17,0xc5,0x66,0xa, 0xe1,0x2f,0x3e,0x1f,0xe7,0xfd,0x27,0xcb,0x66,0x8, +0xe0,0x1, 0x17,0xff,0xe0,0x2f,0x3e,0xf, 0xe7,0xfd,0x27,0xc4,0x17,0x80,0x7f,0x88, +0x7f,0x8a,0xe7,0xfd,0x0, 0xbf,0x66,0x9, 0x3f,0x9c,0xe0,0x8, 0x8f,0xf, 0xe2,0x0, +0xcf,0x5, 0xe7,0xff,0x1, 0x88,0xe0,0x8, 0x8f,0x9f,0xe2,0x1, 0xcf,0xb3,0xe7,0xff, +0x1, 0x82,0x14,0x80,0x14,0xa, 0xdc,0xf3,0xe2,0x0, 0xcc,0x2, 0xe7,0xfe,0x2, 0xfb, +0xe7,0xfe,0x0, 0xf4,0xea,0x11,0x7f,0x6, 0x87,0xe, 0xe2,0x0, 0xcf,0x2, 0xe7,0xfd, +0x5, 0x61,0xe0,0x0, 0x17,0x7c,0xaf,0x2, 0xe7,0xfd,0x0, 0xdc,0xf0,0x0, 0x66,0x7, +0xea,0x11,0x79,0x88,0xeb,0xc8,0x79,0x78,0x8e,0x3, 0xe0,0x0, 0x17,0xfc,0x7e,0x8, +0xaf,0x82,0xe7,0xfd,0x0, 0xc0,0xf2,0x0, 0xcf,0x1f,0xe7,0xff,0x2, 0x3b,0xe0,0xc, +0x37,0x81,0x3b,0xfc,0xe7,0xff,0x3, 0x36,0xf2,0x0, 0xcf,0xf, 0x5, 0x6, 0xe0,0xc, +0x37,0x82,0x3b,0xfc,0xe7,0xff,0x3, 0x2e,0xe2,0x1, 0xc9,0x7f,0x2, 0x39,0x14,0x86, +0xe0,0x8, 0x37,0xa5,0x7d,0x3, 0x7d,0x85,0x7e,0x82,0x7f,0x1, 0xe0,0x9, 0xd0,0x58, +0xe0,0x28,0x3c,0x15,0x65,0x3, 0x65,0x85,0x66,0x82,0x67,0x1, 0xe7,0xff,0x24,0x1a, +0xe0,0x0, 0x17,0xc5,0xe1,0x2f,0x3d,0x9f,0xe7,0xff,0x27,0x94,0xe7,0xfe,0x0, 0xfe, +0x14,0x80,0x14,0xa, 0xdc,0xa4,0xe2,0x0, 0xcc,0x6, 0xe7,0xfe,0x2, 0xac,0xe7,0xfe, +0x0, 0xa5,0xe0,0x2, 0x1f,0xa9,0xf0,0x40,0x3e,0x64,0x7f,0x89,0xe7,0xff,0x0, 0xba, +0xe0,0x0, 0x1e,0xd0,0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x96,0x8d,0x3f,0xae, +0x3f,0x9d,0xe2,0x1, 0xcf,0x95,0xe7,0xfd,0x2, 0x22,0xe7,0xfe,0x0, 0x8f,0xe0,0xc, +0x37,0xa2,0xe0,0x2c,0x3a,0xac,0xe7,0xfe,0x2e,0x6d,0xe0,0x2, 0x16,0x54,0xe0,0x22, +0x39,0x1c,0xe7,0xfe,0x29,0x67,0xe7,0xff,0x0, 0xbc,0xf8,0x0, 0xb0,0x1, 0xe7,0xfd, +0x0, 0xef,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xf4,0xc0,0x58,0xea,0x11, +0x79,0x87,0x3a,0x6a,0xeb,0xc8,0x79,0x78,0xe2,0x1, 0xc2,0x7f,0x17,0xff,0xaa,0x3, +0xaf,0x82,0xe0,0x0, 0x25,0x65,0x16,0x7f,0x3e,0x1a,0xe3,0xff,0xc6,0x7f,0xc6,0x1, +0x36,0x22,0xe0,0x3, 0x17,0x6a,0xe0,0x7, 0x17,0xca,0x3f,0x10,0x3f,0x90,0x3e,0x18, +0x96,0x88,0xc4,0x4, 0xe0,0x80,0xb6,0x9e,0x3e,0x78,0xe0,0x40,0x96,0x98,0xe0,0x80, +0xb6,0x9f,0x1, 0xf7,0xe2,0x0, 0xca,0x4, 0xe0,0x0, 0x5, 0xca,0xf0,0x1, 0x94,0x69, +0xf0,0x1, 0x94,0xf9,0xf8,0x40,0x3c,0x79,0xe0,0x0, 0x4, 0x57,0xe8,0x40,0x3c,0xe9, +0xf0,0x2, 0x24,0xaf,0xe8,0x40,0x3c,0x68,0xe0,0x8, 0xdf,0xda,0xeb,0xc8,0x7b,0x79, +0xe0,0x0, 0x17,0xc0,0xe0,0x43,0x3a,0x88,0xaf,0x86,0xea,0x11,0x7f,0x86,0xe2,0x0, +0xca,0x84,0xaa,0x8f,0xe0,0x0, 0x5, 0x60,0xe0,0x0, 0x17,0xfd,0xaf,0x82,0x14,0x87, +0xe0,0x1, 0x1f,0xb1,0xe0,0x1, 0x1f,0x30,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x3c,0x4f, +0x34,0x21,0xe0,0x8, 0xdf,0xbd,0xe8,0x40,0x3c,0x78,0xe0,0x2, 0x5, 0x2, 0xe0,0x1, +0x1f,0xaf,0xe0,0x1, 0x1f,0x2e,0x8f,0x8f,0x8c,0xe, 0x37,0xa8,0x14,0x86,0x3c,0x4f, +0xe0,0x8, 0xdf,0xf1,0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0xf8,0xe0,0x1, 0x3, 0x71, +0xe0,0x0, 0x17,0xfd,0xaf,0x82,0xe0,0x0, 0x16,0xfd,0x0, 0x86,0xe0,0x0, 0x17,0xff, +0xaf,0x82,0xe0,0x0, 0x16,0xff,0xe0,0x2, 0x1f,0x86,0x17,0x0, 0x87,0x8f,0xaf,0x3, +0x3f,0xfd,0x14,0x0, 0x4, 0x4, 0xea,0x11,0x7f,0x88,0x8c,0xf, 0xe0,0xb, 0xc0,0x28, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x7, 0x34,0x21,0xf0,0x1, 0x24,0x5f,0xe8,0x40, +0x3c,0xe8,0xe8,0x40,0x3c,0x69,0xe0,0x8, 0xdf,0x83,0xf0,0x40,0x3c,0xf7,0xe0,0x43, +0x3a,0x88,0xeb,0xc8,0x7b,0x79,0xe0,0x1, 0x3, 0x47,0x3c,0xe7,0xf0,0x8, 0x34,0xa7, +0xe0,0x8, 0xdf,0xb9,0xea,0x11,0x7f,0x86,0xe2,0x0, 0xca,0x84,0xac,0x6, 0xaa,0x8f, +0xe7,0xff,0x2, 0x24,0xe0,0x3, 0x1f,0x88,0xf0,0x0, 0x15,0x1, 0xe0,0x1, 0x9f,0x6f, +0xe0,0x1, 0x9e,0xff,0xe2,0x0, 0xcf,0x0, 0xf8,0x40,0x3d,0xea,0xe0,0x7b,0x39,0xae, +0x8b,0x6, 0xe0,0x3, 0x12,0xec,0xe2,0x0, 0xce,0x80,0xf0,0x7, 0x16,0xcc,0xe0,0x1, +0x9f,0xf, 0x3a,0x90,0xf0,0x1d,0x3e,0x90,0xf0,0x0, 0x9e,0x7f,0x7b,0x2, 0xe0,0x7a, +0x39,0xad,0x7f,0x1, 0xe8,0x40,0x3b,0xed,0x3b,0x65,0xf0,0x0, 0x17,0x0, 0x67,0x81, +0x94,0x6, 0xe8,0x40,0x3c,0xeb,0x3c,0x2f,0x34,0x26,0xe0,0x8, 0xdf,0x84,0x97,0x87, +0xe1,0x80,0xb4,0x16,0xe8,0xf, 0x3f,0xac,0x64,0x2, 0xe8,0x40,0x3c,0xea,0x3c,0x3f, +0xe0,0x8, 0xdf,0x79,0x15,0x1, 0xe8,0xa, 0x3d,0x1e,0xf0,0x40,0x3f,0x6a,0xf2,0x1, +0xc7,0x7f,0xe8,0x40,0x3a,0x7e,0xe1,0x80,0xb4,0x17,0x1, 0xe2,0xe0,0x3, 0x53,0x66, +0xe0,0x3, 0x4b,0xed,0xf0,0x0, 0x11,0x8c,0xf0,0x1, 0x12,0x7c,0x12,0x1, 0xf0,0x13, +0x39,0x90,0xf0,0x14,0x3a,0x10,0xe2,0x1, 0xc3,0x7f,0xe8,0x0, 0xab,0x83,0xf8,0x40, +0x3b,0x6d,0xe8,0x0, 0xab,0x4, 0xf0,0x40,0x3b,0xe5,0x3c,0x64,0xf0,0x40,0x3a,0xe4, +0xf0,0x0, 0x11,0x7, 0xf0,0x0, 0x10,0x83,0x0, 0x8b,0xe8,0x2f,0x3d,0x95,0x2f,0xaf, +0xc4,0x1, 0xe2,0x1, 0xc4,0x7f,0xe8,0x40,0x3c,0x7e,0xe0,0x1, 0x1, 0x23,0xe8,0x80, +0x94,0x97,0xf8,0x80,0x90,0x16,0xe2,0x1, 0xc4,0xff,0xe0,0xd, 0x3c,0xa7,0xe2,0x1, +0xc6,0xff,0xf2,0x1, 0xc0,0x7f,0xe0,0x43,0x3e,0xd, 0xf0,0xf, 0x38,0x26,0xe2,0x0, +0xce,0x0, 0xe2,0x1, 0xc7,0xff,0xe0,0x41,0x3e,0xcd,0xe0,0x43,0x3d,0x8f,0xe0,0x43, +0x3e,0x8d,0xe0,0x6c,0x3c,0x2d,0xe0,0x41,0x3f,0xcf,0xe2,0x0, 0xcd,0x80,0xe0,0x43, +0x3f,0x8f,0xe8,0x2d,0x3e,0x15,0xe0,0x6b,0x3c,0x2f,0x26,0xd0,0xe2,0x1, 0xca,0x6c, +0xe0,0x1, 0x2, 0xc5,0xe8,0x2f,0x3e,0x12,0x2f,0xad,0xe8,0x2f,0x3d,0x92,0x2f,0xaa, +0xe8,0x2c,0x3e,0x11,0xe0,0x0, 0x2e,0x5d,0xe8,0x2b,0x3d,0x91,0xe0,0x0, 0x2d,0xd9, +0xf0,0xd, 0x39,0x94,0xf0,0xf, 0x3a,0x14,0xc2,0x1, 0xac,0x8d,0xe2,0x1, 0xc2,0x7f, +0xf0,0x0, 0xa8,0xf, 0xe8,0x40,0x3b,0x60,0x3b,0xe9,0xe7,0xff,0x0, 0xb3,0x86,0x82, +0xe7,0xfe,0x0, 0x9b,0xe7,0xff,0x17,0x80,0xaf,0x86,0xe7,0xfd,0x0, 0xe0,0x14,0x81, +0xf0,0x40,0x3c,0xe9,0xe7,0xfd,0x0, 0xd0,0x13,0x82,0xf0,0x0, 0x14,0x1, 0xe7,0xfe, +0x0, 0xa0,0x17,0x81,0x3f,0x94,0xe0,0xb, 0x3b,0x99,0xe8,0xc, 0x3b,0x10,0xe2,0x1, +0xc7,0xff,0x35,0x81,0x36,0x1, 0x16,0xff,0xf0,0x1b,0x39,0x9f,0xf0,0x1a,0x3a,0x1f, +0x3e,0x9f,0x3b,0x9b,0x3b,0x1c,0xe8,0x0, 0xad,0x8b,0xf0,0x1c,0x39,0x9d,0xe8,0x0, +0xae,0xa, 0xe0,0xb, 0x33,0x81,0xe8,0xd, 0x3e,0x94,0xe0,0xc, 0x33,0x1, 0xe8,0x0, +0xad,0x8c,0xc7,0x81,0xae,0xd, 0xf0,0xb, 0x39,0x9f,0xe8,0x0, 0x8e,0xb, 0xe8,0x0, +0x8e,0x8a,0x3e,0x19,0xe8,0xd, 0x3e,0x90,0x36,0x1, 0xe8,0xf, 0x3f,0x94,0x36,0x81, +0xc2,0x3, 0xae,0xb, 0xe2,0x1, 0xc2,0x7f,0xae,0x8f,0xe7,0xff,0x0, 0xab,0xe0,0xd, +0x3b,0x99,0xe8,0xf, 0x3b,0x10,0xf0,0xb, 0x39,0x94,0xf0,0xc, 0x3a,0x14,0x36,0x81, +0x37,0x81,0xc2,0x1, 0xae,0x8b,0xe2,0x1, 0xc2,0x7f,0xaf,0x8c,0xe7,0xff,0x0, 0x9a, +0xe2,0x0, 0xca,0x1, 0xaa,0x3, 0x1, 0x1a,0x15,0x7e,0x3d,0x14,0xe2,0x1, 0xc5,0x7f, +0x17,0x8c,0x3f,0x90,0xc5,0x1, 0xe0,0x1, 0x16,0xfc,0x3e,0x90,0xe0,0xa, 0x3d,0x1f, +0xe0,0x80,0x8d,0x9f,0xe0,0x80,0x8e,0x1d,0x3f,0xfa,0xe0,0x80,0xb5,0x95,0xe8,0x80, +0xb6,0x1d,0x1, 0xf7,0xe2,0x0, 0xca,0x1f,0x2, 0x86,0xe0,0x0, 0x17,0xfe,0xaf,0x82, +0xe7,0xfc,0x0, 0xf7,0x12,0x82,0xf0,0x40,0x3d,0x65,0x3c,0xe4,0xe0,0x8, 0x32,0xa5, +0xe0,0x8, 0xde,0x79,0xe2,0x0, 0xcc,0x2, 0xe8,0x40,0x3b,0x6a,0xe0,0x66,0x3b,0xa8, +0x13,0xff,0x3b,0x95,0xc3,0x7f,0xe2,0x1, 0xc3,0xff,0xe2,0x1, 0xc3,0x7f,0x3c,0xe7, +0x3d,0x66,0xe2,0x3, 0x7c,0x6c,0xdb,0x46,0x3d,0x66,0x3c,0xe7,0xe2,0x7, 0x7c,0x4c, +0xc2,0x81,0xdb,0x40,0xe2,0x1, 0xc2,0xff,0x3a,0xf4,0x5, 0xe0,0xe2,0x7, 0x7c,0xcc, +0xe2,0x3, 0x7c,0x6c,0xdb,0x5e,0xe7,0xfc,0x0, 0xcc,0xaa,0x3, 0xe7,0xff,0x0, 0xb6, +0xf0,0x2, 0x1b,0x36,0xe8,0x0, 0x8d,0x6, 0xe2,0x1, 0xcd,0x6f,0x2, 0x90,0xf0,0x2, +0x1b,0xae,0xe0,0xf, 0x35,0x22,0xc5,0x1, 0xf0,0x17,0x3b,0x9f,0xe2,0x1, 0xc5,0x7f, +0xe8,0x0, 0xb4,0x7, 0xe8,0x0, 0xb4,0x97,0xe8,0x0, 0xad,0x6, 0xe0,0x3, 0x1f,0x88, +0xe0,0x1, 0x9f,0xf, 0x3f,0x78,0xe0,0x1, 0x5, 0xa5,0xe0,0x1, 0xb4,0xf, 0xe0,0x1, +0xb4,0x9f,0x9f,0x7f,0x3f,0x79,0xe0,0x1, 0x5, 0x83,0xb4,0xff,0xb4,0x6f,0xe2,0x0, +0xcd,0xa, 0xe0,0x1, 0x1, 0xa, 0xe2,0x0, 0xcd,0x14,0xe0,0x1, 0x1, 0x1b,0xe2,0x1, +0xcd,0x6f,0xe0,0x1, 0x5, 0xa7,0x8, 0xb1,0xf0,0x0, 0x19,0x8f,0xf0,0x2, 0x1b,0xae, +0xe8,0x0, 0x8c,0x83,0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x12,0x1, 0xe8,0x40,0x3c,0x67, +0xe2,0x0, 0xcc,0x9f,0x2, 0x86,0xc4,0x81,0xe2,0x1, 0xc4,0xff,0xf8,0x40,0x3a,0xe4, +0x17,0xfe,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xc7,0x81,0x37,0xa2,0xe8,0x0, 0x98,0x87, +0xf8,0x0, 0x99,0x17,0xe0,0x2, 0x1e,0xae,0xe0,0x10,0x3c,0x1f,0xf0,0x40,0x3b,0xe8, +0x15,0x0, 0x0, 0xad,0xe8,0xe, 0x3f,0x22,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x3e,0x1e, +0xe2,0x0, 0xce,0x0, 0xe2,0x1, 0xc7,0xff,0x5, 0x30,0xe2,0x1, 0xc7,0x7f,0xf0,0x40, +0x38,0xef,0x3e,0x6e,0xf2,0x1, 0xc0,0xff,0xe2,0x1, 0xc6,0x7f,0xf0,0x40,0x38,0xfc, +0x3, 0x82,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x3f,0xf9,0x4, 0x8d,0xc5,0x1, 0xe2,0x1, +0xc5,0x7f,0xf0,0x0, 0x99,0x3d,0xe0,0xf, 0x35,0x22,0x3f,0x98,0xb5,0x8f,0x38,0xeb, +0xf0,0x0, 0xb1,0x1f,0xc6,0x84,0xe8,0x40,0x3e,0xf0,0x1, 0x12,0x9d,0xad,0x9f,0x3d, +0xe0,0xf, 0x3d,0xa1,0xe3,0xff,0xc7,0xff,0xe0,0x43,0x3e,0x1f,0xe2,0x0, 0xce,0x0, +0x2, 0x4a,0xe0,0x41,0x3f,0xcf,0x0, 0xc7,0xe0,0x41,0x3f,0x4e,0x0, 0xcf,0xe2,0x0, +0xcc,0x9f,0xc5,0x1, 0xe2,0x1, 0xc5,0x7f,0x2, 0x85,0xe2,0x1, 0xcd,0x6b,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0x2a,0xb4,0xe8,0x0, 0xad,0x6, 0x8, 0xe1,0xe0,0x1, 0x9f,0x3f, +0x3f,0x79,0xe7,0xfe,0x3, 0xfe,0xe2,0x0, 0xcd,0xa, 0xe0,0x1, 0xb4,0xbf,0xe0,0x1, +0xb4,0x2f,0xe7,0xfe,0x1, 0xfa,0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f, +0x96,0x7f,0x3e,0xab,0x3f,0x2c,0xe0,0x2, 0xb6,0x8f,0xe0,0x2, 0xb7,0x1f,0x38,0x82, +0x9f,0x4f,0x3f,0x78,0xe7,0xfe,0x3, 0xdf,0xb4,0x4f,0xb4,0xdf,0xe7,0xfe,0x0, 0xdb, +0x96,0xcf,0xe0,0x1, 0x95,0x8f,0xe0,0x1, 0x97,0x3f,0x96,0x7f,0x3e,0xab,0x3f,0x2c, +0xe0,0x2, 0xb6,0xaf,0xe0,0x2, 0xb7,0x3f,0x38,0x82,0xe8,0x0, 0xac,0x83,0x0, 0xcc, +0x38,0x82,0xe0,0x1, 0x1c,0x5b,0xe0,0x6e,0x0, 0xe5,0x0, 0x0, 0x17,0xe0,0x3f,0x98, +0xe2,0x0, 0xcf,0x83,0x5, 0x96,0x24,0x14,0xe0,0x2, 0x1e,0xb6,0x16,0x6, 0xe0,0x3, +0x1f,0x88,0xe0,0x2, 0x1f,0x2e,0xe0,0x3, 0x1d,0x87,0xae,0xd, 0xc7,0x84,0x96,0xf, +0x96,0x9f,0xb6,0xe, 0x3f,0xfb,0xc7,0x4, 0xe0,0x40,0xb6,0x9e,0x1, 0xf8,0x38,0x82, +0xe0,0x3, 0x1f,0x8, 0xe0,0x2, 0x1f,0xae,0x95,0xae,0x96,0x3e,0xe0,0x1, 0x96,0xce, +0xe0,0x2, 0x1d,0x36,0xe0,0x1, 0x97,0x5e,0x14,0x82,0xac,0x8a,0xb5,0x8f,0xb6,0x1f, +0xb6,0xaf,0xb7,0x3f,0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x2, +0x1f,0xdf,0xe0,0x2, 0x1f,0x5d,0x8f,0x8f,0x8e,0xe, 0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xfa,0xe0,0x1, 0x1f,0x5b,0x9e,0x8e,0xe0,0x0, 0x26,0xe6,0xe0,0x3, 0x19,0x8, +0x8d,0x82,0x2f,0x95,0x16,0x81,0xe0,0x2d,0x3e,0xd, 0x26,0x91,0x9f,0x8e,0xe2,0x0, +0xcd,0x83,0xb7,0x92,0xe0,0x1, 0x1, 0x61,0xe0,0x2, 0x1f,0xc0,0x17,0x7e,0xe0,0xa, +0xaf,0x3f,0x17,0x80,0xaf,0x82,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0xe0,0x2, 0x1f,0x5e, +0xe0,0xd, 0x8e,0x8e,0xe2,0x0, 0xce,0x81,0x1, 0x70,0xe0,0x6, 0x9a,0xae,0xe0,0x6, +0x9a,0x3e,0xe0,0x0, 0x25,0xfb,0xe2,0x0, 0xcd,0x81,0xe0,0x1, 0x1, 0x55,0xea,0x11, +0x7b,0x50,0xea,0x11,0x7b,0xce,0x97,0x86,0x94,0x87,0xe2,0x0, 0xcd,0x83,0xe0,0xf, +0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff,0xe0,0x2, +0x1, 0x14,0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe2,0x1, 0xc7,0xff,0xe2,0x1, +0xc4,0xff,0xe2,0x0, 0xce,0x80,0xf0,0x0, 0x1c,0xf, 0xe0,0x1, 0x5, 0x20,0xe2,0x0, +0xcf,0x0, 0xe0,0x1, 0x5, 0x2b,0x3e,0xef,0x3f,0x69,0xe2,0x1, 0xc6,0xff,0xe2,0x1, +0xc7,0x7f,0x3e,0xfe,0x3, 0x82,0x3f,0xe9,0xe8,0x0, 0x8f,0x8, 0xe2,0x1, 0xc7,0xff, +0x3f,0x7f,0xe7,0xff,0x3, 0xba,0x3c,0xe4,0x3c,0x65,0xde,0x83,0xb2,0x86,0xb2,0x7, +0xe7,0xff,0x0, 0xb3,0xe0,0x2, 0x1f,0x87,0x17,0x1, 0xaf,0xf, 0x17,0x7e,0xe0,0x2, +0x1f,0xc0,0xe0,0xa, 0xaf,0x3f,0xe0,0x3, 0x1f,0x88,0xae,0x8f,0xf8,0x0, 0xc, 0xa8, +0xb, 0xe1,0xe0,0x0, 0x1f,0xd, 0xe0,0x1a,0x9f,0x5e,0xe2,0x0, 0xcf,0x1e,0xe7,0xff, +0x2, 0x82,0xe0,0x3, 0x19,0x8, 0x8d,0x82,0xe0,0x1, 0x25,0xdd,0xe0,0x1, 0x1f,0x5b, +0x9e,0x8e,0xe7,0xff,0x2e,0x80,0xe0,0x2, 0x1f,0x87,0x17,0x1, 0xaf,0xf, 0x17,0x7e, +0xe0,0x2, 0x1f,0xc0,0xae,0x82,0xe0,0xa, 0xaf,0x3f,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1, +0xe0,0x2, 0x1f,0x5e,0xe0,0xd, 0x8e,0x8e,0xe2,0x0, 0xce,0x81,0xe7,0xfe,0x1, 0x76, +0xe0,0x6, 0x9a,0xae,0xe0,0x6, 0x9a,0x3e,0x11,0x80,0xe7,0xfe,0x2e,0x76,0xf0,0x0, +0x14,0x81,0xe8,0x2f,0x3f,0x89,0xe7,0xfe,0x27,0xf0,0xe0,0x3, 0x1c,0x8, 0x15,0x28, +0x3c,0xe3,0xe0,0x8, 0xdc,0xe1,0xe0,0x2, 0x1c,0x2e,0xe0,0x7, 0x15,0x40,0x3c,0xe3, +0xe0,0x8, 0xdc,0xda,0xe0,0x1, 0x1f,0xad,0xea,0x11,0x7b,0x50,0x8f,0xf, 0xe0,0x1, +0x1f,0xac,0x37,0x28,0x8f,0x8f,0xea,0x11,0x7b,0xce,0x3f,0xce,0xe0,0x2, 0x1f,0x40, +0xf0,0x0, 0x1c,0xf, 0xe0,0xa, 0xa9,0xbe,0x3c,0xe4,0xe0,0x1, 0x1f,0x5b,0xb7,0x8e, +0xe0,0x2, 0x1f,0xb6,0x3c,0x65,0xa9,0x8f,0x17,0x82,0xe8,0x0, 0xaf,0x88,0xb2,0xa2, +0xb2,0x32,0xb2,0xc2,0xb2,0xe2,0xe0,0x1, 0xb2,0x82,0xe0,0x1, 0xb2,0xa2,0xb2,0x52, +0xb2,0x72,0xe0,0x1, 0xb2,0x12,0xe0,0x1, 0xb2,0x32,0xb2,0x86,0xb2,0x7, 0xde,0x1, +0x3c,0xe3,0xf0,0x0, 0xac,0x82,0x3f,0x63,0x3f,0xe3,0xe0,0x41,0x3f,0xcf,0xe2,0x1, +0xc7,0xff,0xe7,0xfe,0x0, 0xde,0x2f,0xbb,0xaf,0x82,0x17,0x7e,0xe0,0x2, 0x1f,0xc0, +0xe0,0xa, 0xaf,0x3f,0xe7,0xfe,0x0, 0xa1,0xe0,0x41,0x3c,0xc9,0xe2,0x1, 0xc4,0xff, +0xe7,0xfe,0x0, 0xd3,0xe0,0x1, 0x1f,0xab,0x9f,0x42,0x8e,0x8f,0xe0,0x1, 0x1f,0xaa, +0xe0,0x1, 0x9e,0x2, 0x8f,0x8f,0x36,0xa8,0x3f,0x2c,0x3f,0xcd,0x3f,0x7f,0xea,0x11, +0x7b,0x50,0xea,0x11,0x7b,0xce,0x2, 0x26,0xe0,0x1, 0x1f,0xa9,0xe0,0x1, 0x9f,0x32, +0x8e,0x8f,0xe0,0x1, 0x1f,0xa8,0x9e,0x72,0x8f,0x8f,0x36,0xa8,0x3f,0x2c,0x3f,0xcd, +0x3f,0x7f,0x2, 0x18,0x97,0x86,0x94,0x87,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29, +0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc4,0xff,0xe7,0xfe,0x0, 0x95,0xe0,0x1, 0x9c,0xd2, +0xe0,0x1, 0x9c,0x42,0x17,0x84,0xaf,0x82,0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xfb, +0x0, 0xb1,0x97,0x86,0x94,0x87,0xe0,0xf, 0x3a,0xaf,0xe0,0x9, 0x3a,0x29,0xe3,0xff, +0xc7,0xff,0xe3,0xff,0xc4,0xff,0x17,0x3, 0xaf,0x2, 0xe0,0x43,0x3e,0x9f,0xe0,0x43, +0x3f,0x19,0xe0,0x1, 0xb2,0xc2,0xe2,0x1, 0xc7,0xff,0xe0,0x1, 0xb2,0x52,0xe2,0x1, +0xc4,0xff,0xe7,0xfd,0x0, 0xf8,0xe0,0x43,0x3e,0x9f,0xe0,0x43,0x3f,0x19,0xe0,0x1, +0xb2,0xc2,0xe2,0x1, 0xc7,0xff,0xe0,0x1, 0xb2,0x52,0xe2,0x1, 0xc4,0xff,0xe7,0xfd, +0x0, 0xea,0x17,0x1, 0xe0,0x2e,0x3e,0xe, 0xe7,0xfe,0x27,0x34,0x3f,0x6f,0xe4,0x0, +0xcf,0x1, 0xe2,0x0, 0xc7,0x1, 0xe7,0xfe,0x27,0x2d,0xe0,0x1, 0x1f,0xdb,0x97,0x8f, +0xb7,0x92,0xe7,0xfd,0x0, 0xa3,0x8, 0xb4,0xe0,0x2, 0x19,0xc0,0xe0,0xa, 0x8f,0x83, +0x27,0x93,0xe0,0x3, 0x19,0x8, 0xde,0x79,0x8f,0x82,0xe2,0x0, 0xcf,0x84,0x1, 0x12, +0xef,0xff,0xd6,0xd0,0x3a,0x68,0x22,0x7, 0xe0,0x2, 0x1f,0xdc,0x17,0x1, 0xe0,0xa, +0xaa,0x33,0xaf,0xf, 0xa, 0x61,0xe0,0x3, 0x1f,0x8, 0xaf,0x8e,0xa, 0x21,0xe7,0xed, +0x0, 0xb7,0x97,0x42,0xe0,0x1, 0x96,0x2, 0xe0,0x1, 0x97,0xb2,0x96,0xf2,0x3f,0x2c, +0x3f,0xad,0xe0,0x1, 0xb7,0x62,0xe0,0x1, 0xb7,0xf2,0xd2,0x7d,0x3a,0x68,0x24,0xc, +0xe2,0x1, 0xca,0x7f,0x17,0x80,0xe0,0x6f,0x39,0xa4,0x3a,0x6f,0x3c,0x64,0xde,0x1f, +0x17,0x80,0xaf,0x82,0x0, 0xd9,0xe0,0x2, 0x1f,0xb6,0xe0,0x2, 0x1c,0x2e,0x8d,0xf, +0x3c,0xe2,0xdb,0x31,0x3a,0x68,0x0, 0xf3,0x8, 0xb4,0xe2,0x0, 0xcc,0x1, 0x39,0xe8, +0x39,0x68,0x17,0x80,0x5, 0x89,0x31,0x41,0xe2,0x0, 0xc9,0x1, 0xc7,0x81,0xe2,0x1, +0xc7,0xff,0x1, 0xfa,0x37,0xc1,0x31,0x3f,0xe4,0x0, 0xc1,0x3, 0x12,0x1, 0x31,0x54, +0x3c,0xe2,0x3c,0x63,0xe0,0x8, 0xdb,0x6f,0x3c,0x12,0x34,0x41,0xe0,0x2, 0x3c,0x22, +0xe0,0x43,0x3f,0x92,0xe0,0x41,0x3f,0x4f,0xe2,0x0, 0xcf,0x80,0xe1,0x2e,0x3f,0x14, +0xe1,0x2f,0x39,0x14,0xe0,0x6f,0x3d,0x2e,0x39,0x68,0x2f,0xeb,0xa, 0x61,0xe0,0x2, +0x1f,0xae,0x34,0x22,0x34,0xa2,0x3c,0x9f,0x3c,0x1f,0x9f,0x88,0x9f,0x9, 0x9c,0x18, +0x3f,0xae,0x9f,0x19,0xe0,0x43,0x3e,0x9f,0xe2,0x0, 0xce,0x80,0x3c,0x2e,0xe0,0x43, +0x3f,0x18,0xe0,0x41,0x3e,0xcd,0xe0,0x6f,0x3d,0x2d,0xe2,0x0, 0xcf,0x0, 0xe0,0x41, +0x3f,0x4e,0xe0,0x68,0x3d,0x2e,0x3f,0xbf,0x3c,0x38,0x3c,0x1f,0xe2,0x0, 0xcc,0x5, +0x2, 0x88,0xe2,0x0, 0xcc,0x2, 0xe0,0xf, 0x34,0x41,0xe0,0x68,0x3b,0xaf,0x38,0x82, +0xe7,0xff,0x0, 0xac,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x1, 0x1f,0xa7, +0x13,0x0, 0xf0,0x0, 0x8e,0xf, 0xe0,0x1, 0x1f,0xa6,0x3a,0x68,0x8f,0x8f,0xf0,0x0, +0x14,0x81,0x7f,0x81,0xf0,0x40,0x3d,0x66,0xf0,0x40,0x3d,0xe6,0xe0,0x0, 0x11,0xa8, +0xe2,0x0, 0xca,0x1, 0xf0,0x0, 0x14,0x0, 0x5, 0xba,0x11,0x1, 0xf8,0x40,0x3e,0xe8, +0xe8,0x40,0x3a,0xe8,0x0, 0x8b,0xe8,0x40,0x3a,0xed,0x3b,0xe8,0xf0,0x40,0x3e,0xe2, +0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x3a,0x72,0x1, 0x2a,0xe8,0x40,0x3c,0xed,0x3c,0x62, +0xdf,0xa7,0x3c,0x73,0xf0,0x40,0x3f,0x68,0x4, 0xf4,0xf7,0xff,0x26,0xee,0x3c,0xe2, +0x3c,0x65,0xdf,0x9e,0xe8,0x8, 0x3c,0x1c,0xe8,0xe, 0x3b,0x9e,0x3f,0x78,0x4, 0xbe, +0xe2,0x0, 0xcb,0x5, 0x17,0x1, 0xe8,0xe, 0x3f,0x18,0xe0,0x0, 0x2, 0xe8,0xe8,0x40, +0x3a,0xed,0xf0,0x40,0x3e,0xe2,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x3a,0x72,0xf0,0x40, +0x3c,0x6e,0xf2,0x1, 0xc4,0x7f,0xe8,0x40,0x3b,0xee,0x1, 0xd8,0xe2,0x0, 0xcb,0x5, +0x3f,0x66,0xe2,0x1, 0xc7,0x7f,0xc1,0x8a,0x2, 0xb3,0xe8,0x40,0x3e,0xe8,0xe8,0x40, +0x3f,0xeb,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe2,0x1, 0xc1,0xff, +0x3, 0x83,0xf8,0x40,0x3c,0x6b,0xe2,0x0, 0xcf,0x5, 0xf8,0x40,0x3d,0xe8,0xf2,0x1, +0xc5,0xff,0xe0,0x0, 0x1, 0x59,0xf2,0x0, 0xcc,0x8c,0x1, 0x27,0xf0,0x0, 0xc4,0x81, +0xc3,0x1, 0xf2,0x1, 0xc4,0xff,0xe7,0xff,0x0, 0x9d,0xe2,0x0, 0xcb,0x5, 0xe8,0x40, +0x3f,0xed,0xe0,0x6f,0x3a,0xa5,0x3a,0xef,0x3f,0xe2,0xe0,0x7e,0x3a,0xa7,0xe8,0x6f, +0x3a,0xad,0xe8,0x40,0x3b,0xee,0xf0,0x40,0x3e,0xef,0xe7,0xff,0x0, 0x9b,0xe2,0x1, +0xc1,0xff,0xf0,0x0, 0x2d,0xaa,0xf0,0x0, 0x2d,0x10,0xf2,0x0, 0xcc,0x8c,0xf8,0x40, +0x3d,0xea,0xf0,0x0, 0x66,0x1, 0x1, 0xdb,0xf2,0x0, 0xcd,0x8a,0x2, 0x95,0xf0,0x0, +0x2d,0xa8,0xf0,0x0, 0x25,0x6, 0xf0,0x0, 0xc5,0x10,0xf2,0x1, 0xc5,0x7f,0xe8,0x40, +0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x0, 0xc5,0x1, 0xf2,0x1, +0xc5,0x7f,0xe7,0xfe,0x0, 0xf7,0xf0,0x0, 0x15,0xf, 0xe8,0x40,0x3c,0x6a,0xc0,0x4, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf2,0x0, 0xcd,0x8b,0xf0,0x0, 0x15,0xf, 0xe8,0x7a, +0x3c,0xab,0xe8,0x40,0x3c,0x6a,0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf8,0x40, +0x3d,0x6b,0x0, 0xde,0x11,0xb2,0xe7,0xff,0x0, 0xab,0xf0,0x3, 0x1a,0x8, 0xf8,0x0, +0x9b,0xb4,0xe8,0x1, 0x9c,0xd4,0xe8,0x0, 0x9e,0x44,0xf0,0xa, 0x3b,0xa9,0xf0,0x40, +0x39,0x6a,0xe8,0x1, 0x9f,0x4, 0xf3,0xff,0xc1,0x7f,0xe8,0x43,0x3e,0x92,0xe0,0xf, +0x3e,0x2e,0xe2,0x0, 0xce,0x80,0xe8,0xd, 0x3c,0xa7,0xf8,0x1, 0x9b,0x34,0xf8,0x0, +0x9a,0xf4,0xf0,0x40,0x39,0xef,0xe3,0xff,0xc6,0xff,0xf3,0xff,0xc1,0xff,0xe0,0x72, +0x3d,0x2d,0xe0,0x1, 0x1e,0xa5,0xe8,0x43,0x3d,0x93,0xf8,0x8, 0x3b,0x25,0xe2,0x0, +0xcd,0x80,0x3f,0xe8,0x8d,0x8d,0xe0,0x1, 0x1e,0xa4,0xe3,0xff,0xc7,0xff,0x3f,0x2c, +0xe0,0x43,0x3d,0x1f,0xe3,0xff,0xc7,0x7f,0x8e,0x8d,0xe0,0x73,0x3d,0x2e,0xf8,0xc, +0x3a,0xa6,0xe2,0x0, 0xcd,0x0, 0xe0,0xe, 0x35,0xa8,0xe3,0xff,0xc6,0x7f,0x3f,0x4d, +0xe0,0x6f,0x3d,0x2c,0xf0,0x40,0x39,0xfe,0x14,0x0, 0xe0,0x0, 0x3, 0xd2,0xe0,0x1, +0x1f,0x23,0xe0,0x1, 0x1e,0xa2,0x8f,0xe, 0x8e,0x8d,0x37,0x28,0x3f,0x4d,0xe1,0x2d, +0x3f,0x9e,0xe0,0x0, 0x26,0xc5,0xe9,0x2f,0x3f,0x93,0xe0,0x0, 0x27,0xc1,0xe8,0x0, +0x8c,0x14,0x2c,0x3d,0xe0,0x1, 0x1f,0xad,0xe0,0x1, 0x1e,0xa1,0x8d,0x8f,0xe0,0x1, +0x1f,0xa0,0x8e,0x8d,0x8e,0xf, 0xe0,0x1, 0x1f,0xac,0x36,0x28,0x8f,0x8f,0x35,0xa8, +0x3e,0xcc,0x3f,0xcb,0xe8,0x0, 0x9e,0x14,0xe0,0xd, 0x3f,0xad,0x3e,0x7d,0x5, 0x28, +0xe0,0x1, 0x1e,0x9f,0x8d,0x8d,0xe0,0x1, 0x1e,0x9e,0x35,0xa8,0x8e,0x8d,0x3e,0xcb, +0x3f,0xad,0xe0,0x2f,0x3f,0x9c,0x27,0x9c,0xf1,0x2f,0x39,0x1e,0x27,0x99,0xe0,0x1, +0x1f,0x9d,0xe0,0x1, 0x1f,0x1c,0x8f,0x8f,0x8f,0xe, 0xf0,0x40,0x3b,0xf9,0x37,0xa8, +0x3f,0x4f,0x3, 0x8f,0xf8,0xf, 0x3b,0xa5,0x3f,0xfe,0x3, 0xa, 0xf0,0xf, 0x3b,0x29, +0x3f,0x7f,0x17,0xa3,0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe8,0xf, 0x3c,0xa5,0x3f,0xfe,0x3, 0x7c,0xf8,0xf, 0x3b,0x27,0x3f,0x7f,0x17,0xa2, +0xe0,0x6f,0x3d,0x28,0x3c,0x6f,0x38,0x82,0xe0,0x3, 0x1e,0x8, 0xf0,0x0, 0x9b,0xac, +0xf0,0x1, 0x9a,0xcc,0xf0,0x0, 0x9a,0x4c,0xf0,0x1, 0x9b,0xc, 0xf8,0xd, 0x3b,0xa5, +0xe3,0xff,0xc6,0xff,0xe0,0x43,0x3f,0x1d,0xf8,0xf, 0x3a,0x26,0xe2,0x0, 0xcf,0x0, +0xe3,0xff,0xc7,0xff,0xf8,0xa, 0x3a,0xa7,0xe0,0x43,0x3c,0x9f,0xe0,0x1, 0x9c,0x3c, +0x9d,0xfc,0xe3,0xff,0xc5,0x7f,0xe0,0x6d,0x3d,0x2a,0xe2,0x0, 0xcc,0x80,0xf8,0xa, +0x3b,0x24,0xe0,0xe, 0x3c,0x2b,0xe3,0xff,0xc5,0x7f,0xe0,0x1, 0x1c,0x9b,0xe3,0xff, +0xc7,0x7f,0xe0,0x6f,0x3d,0x2a,0xe0,0x1, 0x1d,0x1a,0xf0,0x43,0x39,0x9e,0x8c,0x89, +0x3d,0xa8,0xf2,0x0, 0xc9,0x80,0x8d,0xa, 0xe3,0xff,0xc5,0xff,0x34,0xa8,0xe0,0x6e, +0x3d,0x2b,0xe0,0xb, 0x3d,0x49,0xe1,0x2b,0x3d,0x9e,0xe0,0x0, 0x25,0xcd,0xe1,0x2f, +0x3f,0x9e,0xe0,0x0, 0x27,0xc9,0x8c,0x1c,0xe0,0x0, 0x2c,0x46,0xe0,0x1, 0x1f,0xad, +0x9e,0x1c,0x8d,0xf, 0xe0,0x1, 0x1f,0x99,0x35,0x28,0x8d,0x8f,0xe0,0x1, 0x1f,0xac, +0x35,0xa8,0x8f,0xf, 0xe0,0x1, 0x1f,0x98,0x3f,0x4a,0x8f,0x8f,0x3f,0xcb,0xe0,0xf, +0x3f,0x2f,0x3e,0x7f,0x5, 0x31,0xe0,0x1, 0x1f,0x97,0x8d,0x8f,0xe0,0x1, 0x1f,0x96, +0x35,0xa8,0x8f,0x8f,0x3f,0xcb,0x3f,0x2f,0x3e,0x7e,0x3, 0x26,0xe0,0x1, 0x1f,0x95, +0x8f,0xf, 0xe0,0x1, 0x1f,0x94,0x37,0x28,0x8f,0x8f,0x3f,0xce,0x3e,0xff,0x5, 0x9c, +0xe0,0x1, 0x1f,0x9d,0xf8,0x40,0x3b,0xf5,0x8f,0xf, 0xe0,0x1, 0x1f,0x9c,0x37,0x28, +0x8f,0x8f,0x3f,0xce,0x37,0xc1,0x5, 0x91,0xf8,0x16,0x3a,0xa6,0xf0,0x40,0x3b,0x7f, +0x3, 0xb, 0xf8,0x17,0x3a,0x27,0xe8,0x40,0x3f,0xf7,0x17,0xa0,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0x14,0x0, 0x38,0x82,0xf8,0x17,0x3b,0xa6,0xf0,0x40,0x3b,0xff, +0x3, 0x7b,0xf8,0x15,0x3a,0x25,0xe8,0x40,0x3f,0xf5,0x17,0xa1,0xe0,0x6f,0x3d,0x28, +0x3c,0x6f,0x38,0x82,0x8, 0xb1,0xe0,0x2, 0x1f,0xb6,0x84,0xf, 0xc4,0x7f,0xe2,0x1, +0xc4,0x7f,0xdd,0xe9,0x17,0x80,0x2c,0xc, 0xde,0xb1,0x3f,0xe8,0x2c,0x9, 0xdf,0x55, +0xe2,0x0, 0xcc,0x0, 0xe0,0x1, 0x17,0x7f,0xe0,0x6e,0x39,0xa8,0x3f,0xee,0x3c,0x6f, +0x8, 0xe1,0xe0,0x2, 0x1f,0x91,0xe6,0x1, 0x16,0xff,0xa7,0x8f,0x34,0x28,0xa7,0x5f, +0x3f,0x5d,0xbf,0x5f,0xa7,0x5f,0x3c,0x4e,0xbc,0x5f,0x38,0x82,0xe0,0x2, 0x1e,0xfd, +0xe0,0x3, 0x1f,0x13,0x8f,0xdd,0x8e,0x4d,0xe0,0x2, 0x1e,0x93,0x3f,0xbc,0x37,0xa1, +0xb7,0x8e,0x9f,0x8e,0x37,0xc9,0xe0,0x3, 0xaf,0xcd,0x9f,0x8e,0x37,0xc1,0xe0,0x3, +0xaf,0xdd,0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x19,0x13,0xe0,0x6, 0x8c,0x12,0xe0,0x6, +0x8c,0xa2,0xe0,0x2, 0xd7,0x4f,0xe4,0x8, 0x34,0x21,0xe0,0x3, 0x9f,0xc2,0xe4,0x8, +0x34,0x40,0x3c,0x7f,0x3, 0x88,0xe0,0x1, 0x1f,0x4f,0xe0,0x3, 0xb4,0x42,0x9f,0x8e, +0xcf,0xa0,0xb7,0x8e,0x9, 0x61,0x8, 0xb2,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x20, +0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0x37,0x28,0xe0,0x2, 0x19,0x13, +0x3c,0x4e,0x17,0x81,0xaf,0xc2,0xe0,0x7, 0xd3,0x42,0x14,0x1, 0xe0,0x4, 0xd0,0xa2, +0xe0,0x2, 0x1f,0xfd,0xe0,0x19,0x16,0x9d,0x17,0x7, 0x3e,0x9f,0xaf,0xd, 0xe0,0x19, +0xc7,0x9e,0xaf,0xf, 0xe0,0x1, 0xd8,0x2b,0x17,0x82,0xaf,0xc2,0x9, 0x61,0xe0,0x3, +0x1f,0x38,0xe0,0x3, 0x1f,0x9d,0xa6,0xe, 0x15,0xfe,0xa6,0xcc,0x97,0xf, 0xe2,0x0, +0xc6,0x81,0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0xfd,0xa6,0xcc,0x97,0xf, 0x36,0xc9, +0xe2,0x0, 0xc6,0x82,0x3f,0x5b,0x3f,0x4d,0xb7,0xf, 0x15,0x77,0x97,0xf, 0x3d,0xe8, +0xe3,0xff,0xc7,0x7b,0xb7,0xf, 0xe7,0xff,0x17,0x10,0xa6,0x4c,0x96,0x8f,0x3f,0x18, +0x36,0x4c,0xe2,0x0, 0xc6,0x8, 0x3e,0xda,0xe2,0x1, 0xc7,0x7f,0x3e,0xcc,0xe2,0x0, +0xcf,0xd, 0xb6,0x8f,0x9e,0x8f,0x2, 0x89,0xea,0x49,0x7f,0xd8,0xe9,0xff,0xc7,0xff, +0x37,0x22,0x3f,0x1f,0xa7,0x8e,0x3f,0x82,0xe0,0x1, 0x14,0x7f,0x38,0x82,0x3c,0x6d, +0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x8, 0x36,0xc8,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0xa7,0x8f,0xe0,0x1, 0xa4,0x7f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x2, 0x1f,0x91, +0xa7,0x8f,0xa4,0x5f,0x34,0x48,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0xe0,0x2, 0x1e,0x9a, +0x16,0x1, 0x8f,0xd, 0xe0,0x2, 0x1f,0x93,0x3e,0x1e,0xae,0xd, 0xe0,0x1, 0x1e,0xd6, +0x3e,0x9e,0xe0,0x4, 0x8f,0x4f,0x8c,0xd, 0xc7,0x1, 0xe0,0x4, 0xaf,0x4f,0xe0,0x4, +0x8f,0x4f,0x2f,0x6, 0xe0,0x4, 0x8f,0x3f,0xc7,0x1, 0xe0,0x4, 0xaf,0x3f,0xe2,0x0, +0xcd,0xfd,0x1, 0xcd,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x7c,0xaf,0xf, 0x38,0x82, +0x8, 0xb1,0x2c,0x17,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x1, 0x48,0x3c,0x69,0xe0,0x4, 0xd9,0x33,0xe0,0x1, 0x1f,0xcf,0x9f,0x8f,0x27,0x88, +0xe0,0x2, 0x1f,0x13,0xe0,0x1, 0x8f,0xee,0xcf,0x82,0xe0,0x1, 0xaf,0xee,0x8, 0xe1, +0xe2,0x0, 0xcc,0xf, 0x1, 0x3b,0xe2,0x0, 0xcc,0x12,0xe0,0x0, 0x1, 0x52,0xe2,0x0, +0xcc,0x13,0xe0,0x0, 0x1, 0x53,0xe2,0x0, 0xcc,0x11,0x1, 0x3e,0xe2,0x0, 0xcc,0x1, +0xe0,0x2, 0x1, 0x1b,0xe2,0x0, 0xcc,0x9, 0xe0,0x2, 0x1, 0x35,0xe2,0x0, 0xcc,0x5b, +0xe0,0x0, 0x5, 0xce,0xe7,0xff,0x17,0x94,0x3f,0x98,0xe2,0x0, 0xcf,0x81,0xe0,0x2, +0x5, 0xdb,0xe7,0xff,0x17,0x92,0x3f,0x98,0xe2,0x0, 0xcf,0x81,0xe0,0x3, 0x5, 0xb9, +0xe7,0xff,0x17,0x90,0xe0,0xf, 0x3f,0x98,0xe2,0x0, 0xcf,0x8f,0xe0,0x2, 0x2, 0xe8, +0xe2,0x0, 0xcc,0x7b,0xe0,0x3, 0x1, 0x5e,0xe0,0x1, 0x1f,0xcf,0x0, 0xc0,0xe0,0x2, +0x1f,0xe6,0x8f,0x8f,0xe7,0xff,0x2f,0xb7,0x8, 0xe1,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0x93,0x17,0x1, 0xe0,0x1, 0xaf,0x7f, +0xe0,0x2, 0xaf,0xf, 0x8, 0xe1,0xe2,0x0, 0xcc,0x81,0x1, 0x29,0xe7,0xff,0x2c,0xb1, +0xe0,0x1, 0x1f,0xf2,0xa7,0xf, 0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x8, 0xe1,0xe0,0x2, +0x1f,0x93,0xe0,0x2, 0xac,0xaf,0x8, 0xe1,0xe0,0x2, 0x1f,0x93,0xe0,0x2, 0xac,0xbf, +0x8, 0xe1,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x2f,0xdf,0x8, 0xe1,0xe2,0x0, 0xcc,0x30, +0xe0,0x1, 0x1, 0x6f,0xe2,0x0, 0xcc,0x53,0x2, 0x98,0xea,0x4a,0x7f,0x90,0xe9,0xff, +0xc7,0xff,0xe0,0xe, 0x34,0x22,0x3f,0x9e,0xa7,0x8f,0x3f,0x82,0xe0,0x2, 0x1f,0x93, +0xe0,0x2, 0x8f,0x1f,0xe7,0xff,0x2f,0x5, 0xe0,0x2, 0xac,0x9f,0xe7,0xff,0x16,0x80, +0x87,0xf, 0x3f,0x4d,0xaf,0xf, 0x8, 0xe1,0xe0,0x0, 0x1f,0xb0,0x3e,0xe8,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x62,0x17,0xf8,0xe0,0x2, 0x1f,0x13,0x3f,0x98, +0xe2,0x1, 0xc7,0xff,0x3e,0x9e,0xe2,0x0, 0xcf,0xaf,0xac,0x8d,0x2, 0x89,0xea,0x4c, +0x7e,0xe0,0xe9,0xff,0xc6,0xff,0x37,0xa2,0x3f,0x9d,0xa7,0x8f,0x3f,0x82,0xe0,0x1, +0x1f,0xcf,0x17,0x48,0x3f,0x18,0xe2,0x0, 0xcf,0x1e,0xe0,0x2, 0x5, 0x99,0xe2,0x0, +0xcc,0x57,0xe0,0x2, 0x5, 0x99,0x9f,0xf, 0xe0,0x4, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfe, +0x0, 0xc7,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x8, 0xb7,0xf, 0xe7,0xfe,0x0, 0xc0, +0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x4, 0xb7,0xf, 0xe7,0xfe,0x0, 0xb9,0xe0,0x4, +0x87,0xbe,0xe0,0x2, 0x1f,0x1a,0xe0,0x1, 0x1f,0xcf,0xac,0x8e,0xe7,0xfe,0x0, 0xb0, +0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xe0,0x40,0xcf,0x0, 0xb7,0xf, 0x0, 0xd3,0xe0,0x1, +0x1f,0xcf,0x9f,0xf, 0xe0,0x80,0xcf,0x0, 0xb7,0xf, 0x0, 0xcc,0xe0,0x3, 0x8f,0xce, +0xe0,0x3, 0x1f,0x13,0x37,0xa8,0x3f,0x99,0x37,0xa1,0xb7,0x8e,0xe0,0x1, 0x1f,0xcf, +0xe7,0xfe,0x0, 0x96,0xe0,0x3, 0x8f,0xae,0xe0,0x2, 0x1f,0x72,0x37,0xa8,0x3f,0x99, +0x37,0xa1,0xb7,0x8e,0x97,0xe, 0xe0,0x0, 0x1f,0xc8,0xb7,0xf, 0xe7,0xfe,0x0, 0xc6, +0xe0,0x3, 0x8f,0x8e,0x37,0xa8,0x3c,0x9f,0xe0,0x3, 0x1f,0x89,0xb4,0x8f,0xe0,0x1, +0x1f,0xcf,0xe7,0xfd,0x0, 0xfd,0xe0,0x1, 0x1f,0xdc,0x15,0xfb,0xa6,0xf, 0xe0,0x1, +0x1f,0xcf,0xa7,0x4c,0xa6,0xcc,0x37,0x42,0xe2,0x0, 0xc7,0x1, 0xe4,0x0, 0xcf,0x1, +0x37,0x22,0x3e,0xdb,0x3f,0x4d,0xbf,0x4c,0xe7,0xfd,0x0, 0xea,0xe0,0x1, 0x1f,0xcf, +0x9f,0xf, 0xcf,0x2, 0xb7,0xf, 0xe7,0xfd,0x0, 0xe3,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, +0xcf,0x1, 0xb7,0xf, 0xe7,0xfd,0x0, 0xdc,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xe0,0x2, +0xcf,0x0, 0xb7,0xf, 0xe7,0xfe,0x0, 0xff,0xe0,0x1, 0x1f,0xcf,0x9f,0xf, 0xcf,0x10, +0xb7,0xf, 0xe7,0xfd,0x0, 0xcd,0xe0,0x2, 0x1f,0x8d,0x8f,0x8f,0x2f,0x87,0xe0,0x1, +0x1f,0xf2,0xa7,0xf, 0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x17,0x0, 0xe0,0x3, 0x1f,0x93, +0xe0,0x2, 0x1e,0x93,0xb7,0xf, 0xe2,0x1, 0xcc,0xad,0xac,0x9d,0xe7,0xff,0x1, 0x2f, +0xe2,0x1, 0xcc,0xae,0xe7,0xfd,0x1, 0xf2,0xdd,0xe2,0xe0,0x1, 0x1f,0xcf,0xe7,0xfd, +0x0, 0xaf,0xe2,0x0, 0xcc,0x85,0xe7,0xfd,0x2, 0xb4,0xe0,0x2, 0x1f,0x13,0xe0,0x1, +0xac,0x9e,0xe0,0x0, 0x2c,0xfb,0xe0,0x2, 0xac,0xde,0xe7,0xfd,0x0, 0xdf,0xe0,0x2, +0x1f,0x13,0xe0,0x6, 0x8f,0x8e,0xe0,0x2f,0x3c,0x8f,0xe7,0xfd,0x2f,0xa2,0x17,0x82, +0xe1,0x2f,0x3c,0x9f,0xe7,0xfd,0x2f,0x9d,0xe0,0x0, 0x1f,0xb0,0x16,0xb0,0x8f,0x8f, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0xd3,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0xe7,0xfe, +0x2f,0x9d,0xe2,0x0, 0xcc,0x4, 0xe7,0xfd,0x1, 0xc, 0xe2,0x0, 0xcc,0x30,0xe7,0xfe, +0x1, 0x95,0x8, 0xe1,0xe0,0x1, 0x1f,0xcf,0xe0,0x0, 0x1e,0x48,0x9f,0xf, 0x15,0x81, +0xe0,0x1, 0xcf,0x0, 0xb7,0xf, 0xe2,0x0, 0xcc,0x6d,0xe0,0x3, 0x1f,0x15,0x9e,0x8c, +0xa7,0xe, 0x3d,0x9d,0xb5,0x8c,0x3f,0x1d,0xac,0x8e,0xe7,0xfc,0x1, 0xe9,0xe0,0x1, +0x1f,0x58,0xe0,0x0, 0x16,0xec,0xae,0x8e,0xe7,0xfc,0x0, 0xe2,0xe2,0x1, 0xcc,0x6, +0xe0,0x0, 0x1, 0x7e,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x11,0xe2,0x1, 0xcc,0x8, +0xe7,0xfd,0x1, 0x14,0xe2,0x1, 0xcc,0xb, 0xe0,0x1, 0x1, 0x23,0xe2,0x1, 0xcc,0xc, +0xe0,0x1, 0x1, 0x33,0xe2,0x1, 0xcc,0xd, 0xe0,0x1, 0x1f,0xcf,0xe7,0xfc,0x1, 0xc8, +0xe0,0x3, 0x1f,0x38,0x16,0x60,0xa6,0x8e,0xe2,0x0, 0xc4,0x9f,0xe0,0x1, 0xa7,0x5d, +0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x5d,0xe7,0xfc,0x0, 0xba,0x17,0x1, 0x3f,0x58, +0xe0,0x0, 0x2f,0x4b,0xe2,0x0, 0xcc,0xa, 0xe7,0xfc,0x1, 0xb2,0x9f,0xf, 0xe0,0x8, +0xcf,0x0, 0xb7,0xf, 0xe7,0xfc,0x0, 0xac,0xe2,0x0, 0xcc,0x82,0xe0,0x0, 0x1, 0x58, +0xe0,0x1, 0x17,0xfd,0x3f,0xd9,0xe2,0x0, 0xcf,0x81,0x1, 0x6, 0xe2,0x0, 0xcc,0x84, +0xe7,0xfc,0x1, 0xdc,0x17,0x82,0xe0,0x2, 0xaf,0xde,0xe7,0xfc,0x0, 0xd7,0xe0,0x1, +0x1f,0xcf,0xe0,0x2, 0x1e,0x93,0x9f,0xf, 0xcf,0x40,0xb7,0xf, 0xe0,0x3, 0x8f,0xd, +0xe0,0x3, 0x8d,0x9d,0xe0,0x3, 0x8e,0x1d,0x37,0x28,0xc6,0x1, 0xe0,0x3, 0xae,0x1d, +0x3f,0x1b,0xe0,0x3, 0x8e,0x1d,0xe3,0xff,0xc7,0x7f,0x2e,0x6, 0xe0,0x3, 0x8e,0xd, +0xc6,0x1, 0xe0,0x3, 0xae,0xd, 0xe2,0x0, 0xcc,0x6f,0xe0,0x3, 0x1e,0x9b,0xa6,0x8d, +0x3f,0x1d,0xac,0x8e,0xe7,0xfb,0x1, 0xf4,0xe0,0x1, 0x1f,0x58,0xe0,0x0, 0x16,0xee, +0xae,0x8e,0xe7,0xfb,0x0, 0xed,0x9f,0xf, 0xcf,0x20,0xb7,0xf, 0xe7,0xfb,0x0, 0xe8, +0x3c,0x69,0xdd,0x8, 0xe0,0x1, 0x1f,0xcf,0xe7,0xfb,0x0, 0xe2,0xe0,0x1, 0x1f,0xdc, +0x16,0x78,0xa6,0x8f,0xe2,0x0, 0xc4,0x87,0xe0,0x1, 0xa7,0x2d,0xe0,0x1, 0x1f,0xcf, +0x3f,0x5c,0x3f,0x49,0xe0,0x1, 0xbf,0x2d,0xe7,0xfb,0x0, 0xd2,0x16,0x83,0xe0,0x2, +0xae,0xde,0xe0,0x1, 0x1f,0xcf,0xe7,0xfb,0x0, 0xcb,0xe0,0x1, 0x1f,0xdc,0x17,0x3, +0xa6,0x8f,0x3f,0x59,0xe0,0x1, 0xa7,0xad,0xe7,0x9f,0x16,0x7f,0x37,0x2c,0x3f,0xdc, +0x3f,0xce,0xe0,0x1, 0xbf,0xad,0xe7,0xfb,0x0, 0xf9,0xe0,0x6, 0xac,0x8e,0xe0,0x1, +0x1f,0xcf,0x9f,0xf, 0xe1,0x0, 0xcf,0x0, 0xb7,0xf, 0xe7,0xfb,0x0, 0xb1,0xe0,0x1, +0x1f,0xdc,0x15,0xe0,0xa7,0xf, 0x16,0x9f,0xe0,0x1, 0xa6,0x3e,0x3e,0xd9,0x3e,0x5b, +0xe0,0x1, 0xbe,0x3e,0xe0,0x1, 0xa6,0x3e,0xe0,0x1, 0x1f,0xcf,0x3e,0xcc,0xe0,0x1, +0xbe,0xbe,0xe7,0xfb,0x0, 0x9d,0xe0,0x3, 0x1f,0x8d,0x3c,0x69,0xac,0x8f,0xe0,0x2, +0xd1,0x75,0xe7,0xfb,0x0, 0xd3,0xe2,0x0, 0xcc,0x5b,0x3f,0xe8,0xe0,0x0, 0x5, 0xf4, +0xe7,0xff,0x17,0x16,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xf2,0xe0,0x0, +0x17,0x64,0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x8c, +0xe7,0xff,0x17,0x12,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x99,0xe7,0xff, +0x17,0x14,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x5, 0xea,0xe7,0xff,0x17,0x18, +0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xc3,0xe0,0x0, 0x17,0x77,0x3f,0x18, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0xe0,0xe7,0xff,0x17,0x10, +0x3f,0x18,0xe2,0x0, 0xcf,0xf, 0xe0,0x1, 0x5, 0xee,0xe0,0x0, 0x17,0x7f,0x3f,0x18, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, 0x5, 0x8c,0xe2,0x1, 0xcc,0x6, +0xe0,0x1, 0x1, 0x63,0xe2,0x1, 0xcc,0x7, 0xe0,0x1, 0x1, 0x6f,0xe2,0x1, 0xcc,0x8, +0xe0,0x2, 0x1, 0x3, 0xe2,0x1, 0xcc,0xb, 0xe0,0x2, 0x1, 0x1, 0xe2,0x1, 0xcc,0xc, +0xe0,0x2, 0x1, 0x5, 0xe2,0x1, 0xcc,0xd, 0xe0,0x2, 0x1, 0x5, 0xe0,0x0, 0x17,0x70, +0x3f,0x18,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x4, 0xe0,0x1, 0x2, 0xdf,0xe2,0x1, +0xcc,0x12,0xe0,0x2, 0x1, 0x12,0xe0,0x1, 0x5, 0xfe,0xe2,0x1, 0xcc,0x13,0xe0,0x2, +0x1, 0x2, 0xe2,0x1, 0xcc,0x14,0xe0,0x2, 0x1, 0x83,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, +0x8c,0x7f,0x38,0x82,0xe0,0x2, 0x1f,0x13,0x3f,0x9e,0x8c,0xf, 0x38,0x82,0xe0,0x3, +0x1e,0x13,0xe0,0x2, 0x1f,0x63,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, +0xcf,0xeb,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0x3e,0x38,0x82,0xe0,0x2, 0x1e,0x72, +0xe0,0x3, 0x1f,0x15,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, 0xcf,0xed, +0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xf2,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6c, +0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x17,0xe0,0x0, 0x1f,0x4a,0x9e,0x8c,0xa7,0xe, +0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x9d,0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xde, +0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x1c,0xaf,0xf, 0x38,0x82,0xe0,0x3, 0x1e,0x9, +0xe0,0x3, 0x1f,0x1b,0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x0, 0xcf,0xef, +0xb5,0x8c,0x3f,0x1d,0x8c,0xe, 0x1, 0xca,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6e, +0xaf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xd8,0xe0,0x0, 0x17,0x6a,0xaf,0xf, 0x38,0x82, +0xe0,0x2, 0x1f,0x13,0x16,0x60,0xe0,0x2, 0x8e,0xfe,0x3e,0x1d,0xe2,0x0, 0xce,0x1f, +0xe0,0x0, 0x2, 0xdb,0xe0,0x1, 0x1e,0x53,0x3e,0x9c,0xe0,0x44,0x8c,0xd, 0xe0,0x2, +0x8e,0xfe,0xe2,0x1, 0xcf,0x82,0xc6,0x81,0xe0,0x2, 0xae,0xfe,0xe7,0xff,0x1, 0xa7, +0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x1, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x72, +0xe0,0x3, 0x1f,0x15,0x9e,0x8c,0xa7,0xe, 0xe1,0xff,0x15,0xfe,0x3d,0xdd,0x3f,0x1b, +0x97,0xe, 0xe2,0x0, 0xc6,0x81,0xc7,0x1, 0xe3,0xff,0xc7,0x7f,0xe2,0x0, 0xce,0x80, +0x9d,0x8c,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0x37,0x48,0x16,0x81,0x3e,0x9b,0xe0,0x68, +0x39,0x2e,0xe2,0x0, 0xcf,0xe9,0xb6,0x8c,0xe7,0xff,0x1, 0x81,0xe0,0x1, 0x1f,0xd8, +0xe0,0x0, 0x17,0x68,0xaf,0xf, 0x38,0x82,0xe0,0x0, 0x1e,0x43,0xe0,0x2, 0x1f,0x25, +0x9e,0x8c,0xa7,0xe, 0x15,0x81,0x3d,0x9d,0xe2,0x1, 0xcf,0x8a,0xb5,0x8c,0x3f,0x1d, +0x8c,0xe, 0xe7,0xfe,0x1, 0xec,0xe0,0x1, 0x1f,0xd8,0xe7,0xff,0x17,0x9, 0xaf,0xf, +0x38,0x82,0xe7,0xf7,0x0, 0xee,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f,0xe0,0x1, 0xa4,0x2f, +0xe2,0x0, 0xc4,0x7, 0x38,0x82,0xe0,0x2, 0x8e,0x7e,0xe0,0x1, 0x1e,0xc2,0x3e,0x9c, +0x8c,0xd, 0xe7,0xff,0x0, 0xa6,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f,0xe0,0x1, 0xa4,0x2f, +0x34,0x4c,0xe2,0x0, 0xc4,0x3, 0x38,0x82,0xe2,0x1, 0xcf,0xfe,0x14,0x0, 0xe7,0xfe, +0x1, 0xc6,0xe0,0x2, 0x1f,0xc8,0x17,0x5, 0x8f,0x8f,0x3f,0x3f,0xe0,0x3, 0x1f,0xb0, +0x3f,0x9e,0x8c,0xf, 0x38,0x82,0x14,0x0, 0x38,0x82,0xe0,0x1, 0x1f,0xdc,0xa7,0x8f, +0xe0,0x1, 0xa4,0x3f,0xe2,0x0, 0xc4,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0x8d,0x8c,0xf, +0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x1, 0xa4,0x5f,0xe2,0x0, 0xc4,0x1f, +0x38,0x82,0xe2,0x1, 0xcc,0x11,0x1, 0x8b,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x4f, +0x38,0x82,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x6f,0x38,0x82,0xe0,0x1, 0x1f,0xd6, +0xe0,0x2, 0x8c,0x3f,0x38,0x82,0xe0,0x1, 0x1f,0xd6,0xe0,0x2, 0x8c,0x5f,0x38,0x82, +0x8, 0xb3,0xe0,0x2, 0x19,0x13,0xe0,0x2, 0x19,0xfd,0xe0,0x3, 0x8f,0xe2,0xe0,0x1, +0x8f,0x3, 0x3f,0x7f,0x1, 0x16,0xe0,0x3, 0x8f,0xe2,0xe0,0x1, 0x8c,0x93,0xe2,0x0, +0xc7,0xbf,0xe0,0x3, 0xaf,0xe2,0xe0,0x3, 0x8f,0xe2,0x3c,0x6f,0xe0,0x1, 0xaf,0x83, +0xe0,0x3, 0xd1,0x2e,0xe0,0x2, 0x1f,0xe6,0x87,0x8f,0xe2,0x0, 0xc7,0x81,0x2f,0xa2, +0xe0,0x3, 0x8f,0xf2,0xe0,0x1, 0x8f,0x13,0x3f,0x7f,0x1, 0x16,0xe0,0x3, 0x8f,0xf2, +0xe0,0x1, 0x8c,0x3, 0xe2,0x0, 0xc7,0xbf,0xe0,0x3, 0xaf,0xf2,0xe0,0x3, 0x8f,0xf2, +0x3c,0xef,0xe0,0x1, 0xaf,0x93,0xe0,0x3, 0xd1,0x13,0xe0,0x2, 0x1f,0xe6,0x87,0x8f, +0xe2,0x0, 0xc7,0x81,0x27,0x82,0x9, 0xe1,0xe0,0x1, 0x8c,0x13,0x9, 0xa1,0xe0,0xe, +0x0, 0x9f,0xe0,0x1, 0x8c,0x3, 0xd7,0x1b,0x0, 0xdc,0x8, 0xb2,0xe0,0x2, 0x1f,0x93, +0x16,0x85,0xe0,0x5, 0x8f,0x1f,0x3e,0xb8,0xe0,0x3, 0x1f,0xb0,0x39,0x68,0x3f,0x9d, +0x8c,0x3f,0xe0,0x3, 0x1f,0x8e,0x3c,0xee,0x3f,0x92,0xaf,0xf, 0xe0,0x7, 0xd9,0x75, +0xe2,0x0, 0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0x14,0x80,0x14,0x3, 0xe0,0x7, 0xd9,0x6d, +0x14,0x80,0x14,0x4, 0xe0,0x7, 0xd9,0x69,0x14,0x80,0x14,0x0, 0xe0,0x7, 0xd9,0x65, +0x9, 0x61,0x8, 0xb5,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0xaf,0x3a,0x68,0xe0,0x3, +0x34,0x23,0x8c,0x32,0xaa,0x2, 0x3c,0xe3,0xe0,0x7, 0xd9,0xd1,0xc1,0x5, 0x39,0x75, +0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xca,0x3c,0xe3,0x14,0x4, 0xa, 0xa1, +0xe0,0xf3,0x0, 0xc5,0x8, 0xb5,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0xaf,0x3a,0x68, +0xe0,0x3, 0x34,0x23,0x8c,0x32,0xaa,0x12,0x3c,0xe3,0xe0,0x7, 0xd9,0xdb,0xc1,0x5, +0x39,0x75,0x1, 0xf9,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xd4,0x3c,0xe3,0x14,0x4, +0xa, 0xa1,0xe0,0xf3,0x0, 0xcf,0x8, 0xb4,0xe0,0x3, 0x19,0x30,0xe0,0x3, 0x1a,0x2f, +0x39,0xe8,0x8c,0x32,0xa9,0xa2,0x3d,0x63,0x3c,0xe3,0xe0,0x7, 0xd9,0xe8,0xc1,0x5, +0x39,0x74,0x1, 0xf8,0x3d,0x63,0x3c,0xe3,0x14,0x3, 0xe0,0x7, 0xd9,0xe0,0x3d,0x63, +0x3c,0xe3,0x14,0x4, 0xa, 0x21,0xe0,0xf3,0x0, 0xda,0x8, 0xb2,0xe0,0x0, 0x1f,0xcd, +0x39,0x68,0x8f,0x8f,0x2f,0xa2,0xe0,0x2, 0x1f,0x93,0x16,0x85,0xe0,0x3, 0x9f,0x4f, +0x3e,0xb2,0xe0,0x3, 0x1f,0xb0,0xe2,0x1, 0xc7,0x7f,0x3f,0x9d,0x8c,0x3f,0x3c,0xee, +0xaf,0x4f,0xe0,0x7, 0xd8,0xd7,0xe2,0x0, 0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0x14,0x8a, +0x14,0x3, 0xe0,0x7, 0xd8,0xcf,0x14,0x8a,0x14,0x4, 0xe0,0x7, 0xd8,0xcb,0x14,0x85, +0x14,0x0, 0x9, 0x21,0xe0,0xf1,0x0, 0xc6,0xda,0x7e,0x0, 0xde,0x16,0x83,0xe0,0x2, +0x1f,0xc4,0x3e,0xb8,0xe0,0x2, 0x1f,0x13,0xe0,0xc, 0x3f,0x9d,0xe0,0x4, 0x8d,0x8e, +0x8d,0xc, 0x3d,0x7b,0x1, 0x4, 0xe0,0x4, 0x8d,0x8e,0xad,0x8c,0xe0,0xc, 0x3f,0x9d, +0xe0,0x4, 0x8d,0x9e,0x8d,0x1c,0x3d,0x7b,0x1, 0x4, 0xe0,0x4, 0x8d,0x9e,0xad,0x9c, +0x3f,0x9d,0x8e,0x2f,0xe0,0x4, 0x8e,0xae,0x3e,0x7d,0x1, 0x4, 0xe0,0x4, 0x8f,0x2e, +0xaf,0x2f,0xe0,0x10,0x0, 0x8b,0x8, 0xb3,0xe0,0x3, 0x1f,0x38,0xe0,0x2, 0x19,0x48, +0xa7,0x8e,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x86,0x8f,0x82,0xe2,0x0, 0xcf,0x82, +0x1, 0x2, 0x17,0x81,0xe0,0x0, 0x19,0xcd,0xaf,0x82,0xaf,0x83,0x8c,0x82,0x24,0x94, +0xe2,0x0, 0xcc,0x82,0x1, 0x89,0xa7,0x8e,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x83, +0xac,0x82,0xac,0x83,0x9, 0xe1,0x14,0x81,0x14,0x0, 0xe0,0x0, 0xd8,0x1c,0x17,0x81, +0xaf,0x82,0xaf,0x83,0x9, 0xe1,0x3c,0x69,0x9, 0xa1,0xe0,0x10,0x0, 0x94,0x0, 0x0, +0x8, 0xb3,0xe0,0x1, 0x1f,0xf2,0xe0,0x2, 0x19,0x13,0xa6,0x8f,0xe0,0x2, 0x1f,0x63, +0xe0,0x2, 0x8f,0xd2,0xbe,0x8e,0xe0,0x0, 0x27,0xfd,0xe0,0x2, 0x8f,0xd2,0xe2,0x0, +0xcf,0x81,0xe0,0x0, 0x1, 0x77,0xe0,0x2, 0x8f,0xd2,0xe0,0x2, 0x19,0xc8,0xe2,0x0, +0xcf,0x83,0x1, 0x86,0xe0,0x3, 0x1f,0x33,0xe0,0x3, 0x1f,0x9b,0xbf,0xf, 0x16,0x0, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8f,0x2e,0xe2,0x0, +0xc7,0x81,0xe0,0x3, 0x1e,0x89,0x3f,0x7f,0xb6,0xd, 0xe0,0x0, 0x1, 0x69,0xe0,0x2, +0x1f,0x79,0xe0,0x3, 0x1f,0x95,0xbf,0xf, 0x16,0x0, 0x8f,0x3, 0xe0,0x3, 0x1f,0xb0, +0xe4,0x0, 0xc7,0x5, 0x3f,0x1f,0x87,0xe, 0xe0,0x6, 0xaf,0x12,0x8f,0x3, 0xe4,0x0, +0xc7,0x5, 0x3f,0x1f,0x87,0x1e,0xe0,0x6, 0xaf,0x22,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, +0x3f,0x1f,0x87,0x2e,0xe0,0x6, 0xaf,0x42,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, 0x3f,0x1f, +0x87,0x3e,0xe0,0x6, 0xaf,0x52,0x8f,0x3, 0xe4,0x0, 0xc7,0x5, 0x3f,0x9e,0x8f,0xcf, +0xe0,0x3, 0xb7,0xc2,0x17,0x80,0xe0,0x6, 0xaf,0xb2,0xe0,0x3, 0xb6,0x32,0x8f,0x3, +0xe0,0x3, 0x1f,0x8e,0x8c,0x3, 0x3f,0x9e,0x87,0x8f,0xe0,0x5, 0xaf,0x92,0xd7,0x75, +0x8f,0x3, 0xe0,0x2, 0x1f,0xc4,0xe4,0x0, 0xc7,0x3, 0x3f,0x1f,0x87,0xe, 0xe0,0x4, +0xaf,0x2, 0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x1f,0x87,0x1e,0xe0,0x4, 0xaf,0x12, +0x8f,0x3, 0xe4,0x0, 0xc7,0x3, 0x3f,0x9e,0x87,0xaf,0xe0,0x4, 0xaf,0xa2,0x81,0x83, +0xe0,0x0, 0x1f,0xcd,0xe0,0x6, 0xa9,0x82,0x87,0x8f,0xe0,0x1, 0xaf,0xc2,0x9, 0xe1, +0xe0,0x2, 0x19,0xc8,0x8f,0x83,0xe2,0x0, 0xcf,0x82,0xe7,0xff,0x1, 0x8d,0xe0,0x3, +0x1f,0x32,0xe0,0x3, 0x1f,0x9b,0xbf,0xf, 0xe7,0xff,0x0, 0x8b,0xe0,0x2, 0x1f,0x78, +0xe0,0x3, 0x1f,0x95,0xbf,0xf, 0xe7,0xff,0x0, 0x99,0x8, 0xb1,0xe0,0x3, 0x1f,0x93, +0x17,0x0, 0x14,0x1, 0xb7,0xf, 0xe0,0x0, 0xde,0xd7,0xdf,0x2e,0xe0,0x0, 0x1f,0xcd, +0x8c,0xf, 0xe0,0x0, 0xdd,0x3d,0x8, 0xa1,0xe7,0xfe,0x0, 0xd4,0x8, 0xb7,0xf8,0x0, +0xc, 0x38,0xe0,0x2, 0x1f,0xc8,0xe0,0x2, 0x19,0x93,0x8a,0xf, 0xe0,0x1, 0x19,0x4f, +0x13,0x5, 0xe0,0x3, 0x1a,0xb0,0x3b,0x34,0xe0,0x6, 0x8d,0x13,0xe0,0x6, 0x8d,0xa3, +0xe0,0x6, 0x8e,0x43,0xe0,0x3, 0x9e,0xc3,0x9f,0x2, 0xe0,0xf, 0x3a,0x96,0x8b,0x8f, +0xf0,0x0, 0x8c,0x1f,0xad,0xf, 0xe2,0x2, 0xc7,0x0, 0xad,0x9f,0xae,0x2f,0xae,0xcf, +0xe0,0x1, 0x2f,0x72,0x9f,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x91,0x9f,0x82,0xe3,0xff, +0xc7,0xfe,0xb7,0x82,0xe0,0x6, 0x8f,0x93,0x37,0xa3,0xe2,0x0, 0xcf,0x86,0xe0,0x0, +0x2, 0x76,0xe0,0xf, 0x3a,0x96,0xab,0x8f,0xe0,0x6, 0xab,0x93,0x9f,0x82,0xe2,0x0, +0xc7,0x82,0x27,0x91,0x9f,0x82,0xe3,0xff,0xc7,0xfd,0xb7,0x82,0xe0,0x6, 0x8f,0xa3, +0x37,0xa3,0xe2,0x0, 0xcf,0x8b,0xe0,0x0, 0x2, 0x73,0x3a,0x96,0xf0,0x0, 0xac,0x15, +0xf0,0x6, 0xac,0x23,0x9f,0x82,0xe2,0x0, 0xc7,0x84,0xe0,0x0, 0x2f,0xfe,0x9f,0x82, +0xe2,0x0, 0xc7,0x88,0xe0,0x1, 0x2f,0x88,0x9f,0x82,0xe2,0x0, 0xc7,0xa0,0xe0,0x1, +0x2f,0x8f,0x9f,0x82,0xe2,0x0, 0xc7,0xc0,0xe0,0x1, 0x2f,0x9d,0x9f,0x82,0xe2,0x1, +0xc7,0x80,0xe0,0x1, 0x2f,0xaa,0x9f,0x82,0xe2,0x4, 0xc7,0x80,0x27,0xa6,0x9f,0x82, +0xe0,0x3, 0x1f,0x38,0xe3,0xfb,0xc7,0xff,0xa6,0x8e,0xb7,0x82,0xe7,0xbf,0x17,0x7f, +0xe0,0x1, 0xa7,0xed,0xe7,0xc0,0x15,0x80,0x3f,0xde,0xe0,0x1, 0xbf,0xed,0xe0,0x0, +0x1f,0xc4,0xe0,0xb, 0x8f,0x23,0xa6,0xf, 0xe4,0x0, 0xc7,0x32,0xe0,0x1d,0xc6,0x40, +0xa7,0xfc,0xe2,0x3f,0xc7,0x7e,0x3f,0xdb,0x3f,0xce,0xbf,0xfc,0xe0,0x1, 0xa7,0xed, +0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x9f,0x82,0xe2,0x8, 0xc7,0x80,0xe0,0x1, +0x2f,0x93,0x9f,0x82,0xe2,0x20,0xc7,0x80,0x27,0x85,0x9f,0x82,0xe3,0xdf,0xc7,0xff, +0xb7,0x82,0x9f,0x82,0xe2,0x40,0xc7,0x80,0xe0,0x0, 0x2f,0xfe,0x9f,0x82,0xe2,0x80, +0xc7,0x80,0x2f,0xa0,0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe0,0x6, 0x8c,0x13,0xe0,0x3, +0xdd,0x6d,0xe7,0xff,0x24,0x8, 0xe0,0x6, 0x8c,0x13,0xdd,0xdc,0xe0,0x0, 0x1f,0xcd, +0x8f,0x8f,0xe7,0xff,0x27,0x85,0xd8,0xc7,0xe7,0xff,0x0, 0x82,0xe0,0x6, 0x8c,0x23, +0xdd,0xea,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0xe7,0xff,0x27,0x8e,0xd8,0xbc,0xe7,0xff, +0x0, 0x8b,0x9f,0x82,0x3c,0x64,0xe3,0x7f,0xc7,0xff,0xb7,0x82,0xf8,0x0, 0xc, 0x28, +0xb, 0xa1,0xe7,0xfa,0x0, 0xd7,0x9f,0x82,0x3c,0x64,0xe3,0xff,0xc7,0xfb,0xb7,0x82, +0x9f,0x82,0xe0,0x20,0xcf,0x80,0xb7,0x82,0xde,0x1, 0x9f,0x82,0xe2,0x0, 0xc7,0x88, +0xe7,0xfe,0x27,0xfc,0x9f,0x82,0xe3,0xff,0xc7,0xf7,0xb7,0x82,0xe0,0x6, 0x8c,0x43, +0xdd,0xdb,0x9f,0x82,0xe2,0x0, 0xc7,0xa0,0xe7,0xfe,0x27,0xf5,0x9f,0x82,0x3c,0x64, +0xe3,0xff,0xc7,0xdf,0xb7,0x82,0x9f,0x82,0xe0,0x4, 0xcf,0x80,0xb7,0x82,0x9f,0x82, +0xe0,0x20,0xcf,0x80,0xb7,0x82,0xdd,0xe2,0x9f,0x82,0xe2,0x0, 0xc7,0xc0,0xe7,0xfe, +0x27,0xe7,0xe0,0x2, 0x1f,0xac,0x9f,0x2, 0x8e,0x8f,0xe3,0xff,0xc7,0x3f,0xe4,0x0, +0xc6,0x9c,0x3c,0xe4,0x3f,0x9d,0xa4,0x4f,0xb7,0x2, 0xd4,0xc7,0x9f,0x82,0xe2,0x1, +0xc7,0x80,0xe7,0xfe,0x27,0xda,0x9f,0x82,0xe3,0xfe,0xc7,0xff,0xb7,0x82,0xd5,0xc4, +0xe7,0xfe,0x0, 0xd3,0x9f,0x82,0x3c,0x64,0xe3,0xfd,0xc7,0xff,0xb7,0x82,0xdd,0x4e, +0xe7,0xfe,0x0, 0x8a,0x9f,0x82,0x3c,0x64,0xe3,0xbf,0xc7,0xff,0xb7,0x82,0xdd,0xdf, +0xe7,0xfe,0x0, 0xfe,0x9f,0x82,0x3c,0x64,0xe3,0xf7,0xc7,0xff,0xb7,0x82,0xe0,0x1, +0x8c,0xa3,0xe0,0x3, 0xdc,0xff,0xe7,0xfe,0x0, 0xe6,0x8, 0xb4,0xe0,0x2, 0x19,0x13, +0x8f,0xc2,0xe2,0x0, 0xcf,0x85,0x1, 0x21,0xe2,0x0, 0xcf,0x84,0x1, 0x36,0xe0,0x1, +0x8f,0xf2,0x2f,0x98,0xe0,0x1, 0x1a,0x4f,0x99,0x84,0x29,0x82,0xa, 0x61,0x14,0x1, +0xe0,0x0, 0xdd,0x8a,0xe0,0x43,0x39,0x93,0xe2,0x0, 0xc9,0x80,0x4, 0x13,0xde,0xb7, +0xe0,0x1, 0x8f,0xe2,0xe2,0x1, 0xc7,0xfd,0xe0,0x1, 0xaf,0xe2,0xa, 0x21,0xe0,0x1a, +0x0, 0xaa,0xe0,0x7, 0xd3,0x9f,0x0, 0xe7,0x17,0x81,0xaf,0xc2,0x17,0x82,0xaf,0xc2, +0x0, 0xdf,0x9f,0x84,0xe0,0x2, 0x1f,0x48,0xe2,0xff,0xc7,0xff,0xb7,0x84,0xe0,0x6, +0x8e,0x82,0x8f,0x8e,0x3e,0xff,0x1, 0x64,0xe0,0x6, 0x87,0x82,0xaf,0x8e,0xde,0x86, +0x14,0x1, 0xe0,0x3, 0xd8,0xdf,0x0, 0xdc,0xd8,0x27,0x0, 0xca,0xe0,0x2, 0x1f,0x93, +0xe0,0x2, 0x8f,0x5f,0x27,0x12,0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0xd, +0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x3, 0x1, 0x1d,0xe0,0x0, 0x1f,0x33,0x8e,0x8e, +0xe2,0x0, 0xce,0x81,0x1, 0x27,0x38,0x82,0xe0,0x2, 0x1f,0x48,0x8f,0xe, 0xe2,0x0, +0xcf,0x2, 0xe0,0x2, 0x1f,0x2c,0x8e,0x8e,0xe4,0x0, 0xc6,0x9c,0x3f,0x1d,0x1, 0x2f, +0xa6,0xce,0xe0,0x3, 0x1f,0x1b,0xbe,0x8e,0xe0,0x2, 0x8f,0x5f,0xe2,0x0, 0xcf,0x3, +0x1, 0xe5,0xe0,0x2, 0x1f,0x2c,0x8e,0x8e,0xe4,0x0, 0xc6,0x9c,0x3f,0x1d,0xa6,0xce, +0xe0,0x3, 0x1f,0x1b,0xbe,0x8e,0xe0,0x0, 0x1f,0x33,0x8e,0x8e,0xe2,0x0, 0xce,0x81, +0x1, 0xdb,0xe0,0x2, 0x1d,0xc8,0xe0,0x3, 0x1e,0x30,0x8e,0x8b,0xe4,0x0, 0xc6,0x85, +0x3e,0x9c,0x86,0x8d,0xe0,0x6, 0xae,0x9f,0x8e,0x8b,0xe4,0x0, 0xc6,0x85,0x3e,0x1d, +0x86,0x1c,0xe0,0x6, 0xae,0x2f,0x17,0x80,0xaf,0x8e,0x38,0x82,0xa7,0x4e,0xe0,0x3, +0x1e,0x9b,0xe0,0x6, 0xc7,0x26,0xbf,0xd, 0xe7,0xff,0x0, 0xb4,0x8, 0xb1,0xe0,0x2, +0x1e,0xc0,0xe0,0x2, 0x1e,0x12,0x17,0x80,0xe0,0x4, 0xaf,0xdd,0x17,0x80,0x97,0xc, +0xe3,0xfe,0xc7,0x7f,0xb7,0xc, 0xe0,0x3, 0x1f,0x13,0xe0,0x4, 0x8e,0xdd,0xb7,0x8e, +0xe0,0x2, 0x1f,0x72,0xb7,0x8e,0xe0,0x0, 0x1f,0x48,0xb7,0x8e,0xe0,0x2, 0x1f,0x93, +0x8f,0x6f,0xe0,0x0, 0x1f,0xae,0xae,0x8f,0xe0,0x2, 0x1f,0xfa,0xaf,0xf, 0xe0,0x1, +0xdf,0x41,0xdd,0x67,0x14,0x0, 0xe0,0x3, 0xd8,0x5d,0xe0,0x1, 0x1f,0xf2,0xe0,0xc, +0x15,0x52,0xa4,0xf, 0xe0,0x2, 0x1f,0x81,0xa4,0x8f,0xe0,0x8, 0xd0,0x8b,0xe0,0x3, +0xd6,0x1e,0xe0,0x2, 0x1f,0xf7,0xe0,0x2, 0x1f,0x48,0x8f,0x8f,0x8f,0xe, 0x37,0xde, +0xe2,0x0, 0xc7,0x81,0x27,0x82,0x8, 0xe1,0x8, 0xa1,0xe0,0x18,0x0, 0xf4,0xe0,0x0, +0x1f,0xcd,0xe0,0x2, 0x1f,0x13,0x87,0x8f,0xe0,0x1, 0x1e,0xcc,0xe0,0x1, 0xaf,0xce, +0x14,0x3, 0x86,0x8d,0xe0,0x2, 0x1f,0xde,0xae,0xfe,0xe0,0x3, 0x16,0x91,0x8d,0xee, +0xe0,0x2, 0x1e,0x7a,0x17,0x0, 0x3e,0x9f,0xe0,0x3, 0xc7,0x90,0xad,0x8c,0xaf,0xd, +0xaf,0xf, 0xe0,0x3, 0x0, 0xa8,0x0, 0x0, 0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, +0x1c,0x1f,0xa4,0x8f,0xe0,0xc, 0x15,0x52,0xe0,0x8, 0xd0,0x54,0xe0,0x0, 0x1e,0x1e, +0xe0,0x0, 0x1f,0x1d,0xe0,0x0, 0x1d,0x1c,0x9f,0x9e,0xe0,0x43,0x3d,0x9f,0xe2,0x0, +0xcd,0x80,0xe0,0x41,0x3e,0xcf,0xe3,0xff,0xc6,0xff,0xe0,0x6f,0x3d,0x2d,0xe0,0x80, +0xb7,0x9e,0x9e,0x8c,0x3e,0xff,0x3, 0x82,0xb7,0x8c,0x3f,0x7a,0xc6,0x2, 0x1, 0xed, +0x8, 0xe1,0x0, 0x0, 0x8, 0xb6,0xea,0x11,0x7b,0x52,0xe0,0x2, 0x1a,0x13,0x99,0x6, +0xe0,0x2, 0xa9,0x44,0xe0,0x2, 0x8f,0x94,0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0x21,0x8, +0xe0,0x2, 0x1f,0x12,0x16,0x80,0x97,0x8e,0xb6,0x86,0xcf,0x84,0xb7,0x8e,0xb, 0x61, +0x87,0x84,0xe7,0xff,0x17,0x0, 0x3f,0xce,0xe2,0x0, 0xc9,0x5, 0xaf,0x84,0x2, 0x9d, +0xe0,0x0, 0x1c,0x1e,0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x4d,0xe0,0x2, +0x1c,0xa, 0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x46,0xe0,0x0, 0x1c,0x1f, +0xe0,0xc, 0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x3f,0xe0,0x2, 0x1c,0x9, 0xe0,0xc, +0x15,0x52,0x14,0x80,0xe0,0x8, 0xd0,0x38,0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x0, +0xc9,0x5, 0xb1,0x6, 0x2, 0xb8,0xe0,0x2, 0x8f,0xb4,0xe0,0x2, 0x8f,0x24,0x37,0xa8, +0x3f,0x9e,0xc7,0x85,0x39,0x7f,0x1, 0xcc,0xe0,0x3, 0x1f,0x13,0x17,0x80,0xe0,0x2, +0x1e,0x97,0xb7,0x8e,0x11,0x0, 0xb7,0x8d,0x12,0x8a,0xe0,0x0, 0x1f,0x1e,0xe0,0x2, +0xaf,0x94,0x39,0xee,0xe0,0x2, 0x1f,0xe3,0xbf,0xf, 0x9a,0x3, 0xe2,0x0, 0xca,0x46, +0x5, 0x8c,0x21,0x1b,0xe0,0x40,0x9f,0x93,0x9c,0x13,0x3c,0xe5,0x3c,0x1f,0xe0,0x7, +0xdf,0x9e,0xe0,0x8, 0x3a,0x28,0xb4,0x3, 0xc1,0x1, 0xe3,0xff,0xc1,0x7f,0xe2,0x6, +0xc9,0x29,0xc1,0x82,0x1, 0xeb,0x17,0x80,0xb7,0x86,0x17,0x1, 0xe0,0x2, 0x1f,0x8d, +0xaf,0xf, 0xb, 0x61,0xdf,0x62,0x0, 0xc8,0x3f,0xe2,0x0, 0xe7,0x8, 0xb7,0xf8,0x0, +0xc, 0x3b,0xe0,0x3, 0x19,0xc7,0xde,0xfb,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0xe0,0x0, +0x1, 0xc0,0xe0,0x2, 0x19,0x13,0xe0,0x2, 0x1b,0xfa,0xe0,0x2, 0x1a,0xe6,0xf0,0x1, +0x1d,0xf2,0xf0,0x2, 0x1d,0x9, 0xe0,0x13,0x12,0x44,0x13,0x1, 0xf0,0x0, 0x14,0x0, +0xf0,0xc, 0x14,0xd2,0x0, 0x86,0xdf,0x24,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0x1, 0xa8, +0xde,0x45,0xe0,0x0, 0xde,0xf4,0xde,0x83,0x3c,0x64,0xe0,0x6, 0xd9,0xf8,0x8f,0x82, +0x37,0xc7,0x27,0xf2,0x3c,0x66,0xe0,0x0, 0xdb,0xd7,0xe0,0x1, 0xde,0x77,0xe0,0x2, +0xdb,0x9f,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0x1, 0x1d,0xe0,0x2, 0x8f,0x92,0x2f,0x9a, +0x8f,0x85,0x27,0x82,0xdf,0x48,0xe0,0x2, 0x8f,0x92,0x2f,0xde,0x87,0x82,0xe2,0x0, +0xc7,0xff,0xaf,0x82,0xde,0xfd,0x8f,0x83,0xe2,0x0, 0xcf,0x83,0x1, 0x5a,0xe0,0x1, +0x1f,0xc5,0x17,0x1, 0x14,0x1, 0xaf,0xf, 0xf8,0x0, 0xd, 0xa8,0xb, 0xa1,0xe0,0x17, +0x0, 0xb3,0x8f,0x85,0x27,0xe9,0xe0,0x3, 0xdf,0xee,0xe0,0x2, 0x8f,0x92,0xe2,0x0, +0xcf,0x81,0x1, 0xc, 0xe0,0x3, 0xde,0x4b,0xef,0xfe,0xd9,0xbd,0xe0,0x1, 0xdf,0xcc, +0xe8,0x40,0x3c,0x68,0xe0,0x4, 0xdf,0xe4,0x0, 0xd4,0xe8,0x0, 0xa4,0x8b,0xe8,0x40, +0x3d,0x69,0xe8,0x40,0x3c,0x6a,0xe0,0x7, 0xdf,0x4d,0x0, 0xed,0x8, 0xb1,0xe2,0x0, +0xcc,0x66,0x1, 0x2f,0x5, 0x98,0xe2,0x1, 0xcc,0x8, 0x1, 0x9, 0xe2,0x1, 0xcc,0x2a, +0x1, 0xa3,0xe0,0x3, 0x1f,0x9a,0x17,0x5, 0xaf,0xf, 0x8, 0xe1,0xe0,0x3, 0x1f,0x9a, +0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xfa,0x14,0x1, 0xe0,0x1, 0xd9,0x9f,0x8, 0xa1, +0xe0,0x32,0x0, 0xf6,0xe2,0x0, 0xcc,0x55,0x1, 0x8f,0xe0,0x3, 0x1f,0x9a,0x8f,0x8f, +0xe2,0x0, 0xcf,0x85,0x1, 0xeb,0x14,0x1, 0xe0,0x1, 0xd9,0x90,0xe0,0x1, 0xd9,0x42, +0x8, 0xa1,0xe0,0x32,0x0, 0xd4,0xe0,0x3, 0x1f,0x9a,0x17,0x1, 0xaf,0xf, 0x8, 0xe1, +0xe0,0x3, 0x1f,0x9a,0x8f,0x8f,0xe2,0x0, 0xcf,0x85,0x1, 0xd8,0x14,0x1, 0xe0,0x1, +0xd9,0x7d,0xe0,0x1, 0x1f,0xdc,0x17,0x7f,0xa7,0x8f,0xe0,0x7, 0xaf,0x3f,0x8, 0xe1, +0x8, 0xb4,0xe0,0x1, 0x1a,0x72,0xe0,0xc, 0x11,0xd2,0xa4,0x84,0xe0,0x3, 0x1c,0x10, +0x3d,0x63,0xe0,0x7, 0xde,0xff,0xe0,0x4, 0xdc,0x37,0xe0,0x0, 0x1c,0x8d,0xe0,0x0, +0x1c,0x12,0xe0,0x3, 0x19,0x3e,0xe0,0x3, 0x15,0x40,0xe0,0x7, 0xde,0xf3,0x3d,0x63, +0x14,0x80,0x3c,0x62,0xe0,0x7, 0xdf,0x28,0xa4,0x84,0x3d,0x63,0x3c,0x62,0xe0,0x7, +0xde,0xe9,0x17,0xac,0xb7,0x82,0xa, 0x61,0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x3, +0x1c,0x10,0xa4,0x8f,0xe0,0xc, 0x15,0x52,0xe0,0x7, 0xde,0xdc,0xe0,0x0, 0x1c,0x8d, +0xe0,0x0, 0x1c,0x12,0xe0,0x3, 0x15,0x40,0xe0,0x7, 0xde,0xd4,0x8, 0xe1,0x8, 0xb1, +0xe0,0x1, 0x1f,0xf2,0xe0,0x3, 0x1c,0x90,0xa4,0xf, 0xe0,0xc, 0x15,0x52,0xe0,0x7, +0xde,0xc9,0xe0,0x1, 0x1f,0xd7,0xe0,0x3, 0x8f,0xbf,0x2f,0x85,0xe0,0x3, 0xd3,0x7f, +0xef,0xfe,0xd9,0x21,0x14,0x1, 0xe0,0x6, 0xd6,0xe, 0x14,0x1, 0x8, 0xa1,0xe0,0x9e, +0x0, 0xc7,0xe0,0x2, 0x1f,0x40,0xe0,0x3, 0x1f,0xc7,0xe0,0x4, 0x87,0x7e,0xaf,0xf, +0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x1f,0xc0,0x17,0x0, 0xe0,0x4, 0xaf,0x5f,0x17,0x0, +0xe0,0x4, 0x8e,0x5f,0xe0,0x0, 0x1e,0xae,0xe0,0x2, 0x1f,0xec,0xe0,0x2, 0x19,0x7d, +0xae,0xd, 0xb7,0xf, 0xe0,0x19,0x17,0x1c,0xe0,0x2, 0x1e,0xc8,0x3f,0x12,0x17,0x81, +0xaf,0x8d,0xaf,0x8e,0xe0,0x1, 0xdd,0x3e,0xdb,0x64,0xe0,0x1b,0x14,0x2c,0xe0,0x6, +0xd8,0xf6,0xe0,0x6, 0xd2,0x9b,0xe0,0x3, 0xd4,0x22,0x14,0x1, 0xe0,0x3, 0xd6,0x52, +0xe0,0x5, 0xd7,0x9a,0xe0,0x19,0x17,0x1d,0x17,0x87,0x3f,0x12,0xaf,0x8e,0xe0,0x19, +0xc1,0x1e,0xaf,0x82,0x9, 0x61,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe0,0x1, +0x1f,0xc5,0xe0,0x2, 0x19,0x40,0x8f,0x8f,0x27,0x87,0xe0,0xd, 0x8f,0xe2,0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x1, 0x19,0xdf,0xbe,0xe0,0x3, 0x19,0xc7,0xe0,0x0, 0x1b,0xb8, +0xf0,0x0, 0x1d,0x9a,0xe0,0x0, 0x1a,0x39,0xe0,0x0, 0x1a,0xbc,0xf0,0x1, 0x1d,0x13, +0xf0,0x1, 0x1c,0x92,0xf0,0x2, 0x1c,0x66,0xe0,0x1, 0x1b,0x69,0xf0,0x1, 0x1e,0x68, +0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x96,0x87,0x84,0x17,0x0, 0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0xe0,0x2, 0xaf,0x92,0xe0,0xa, 0x8e,0x82,0xaf,0x7, 0xe8,0x0, +0xaf,0xb, 0xaf,0x84,0xe0,0x1, 0x2e,0x98,0x9f,0x85,0xe2,0x0, 0xcf,0xe3,0xe0,0x1, +0x2, 0x93,0x9f,0x85,0xc7,0x81,0xb7,0x85,0xe0,0x1, 0xd3,0x77,0xe0,0x4, 0xd7,0xbe, +0xe0,0x0, 0xdd,0x95,0xe8,0x0, 0x8f,0x8a,0xe8,0x0, 0x8c,0x9, 0x37,0xa8,0x3c,0x4f, +0xe0,0x6, 0xd8,0x95,0xe0,0x2, 0xd9,0x94,0xe0,0x4, 0xde,0x97,0xe8,0x0, 0x8f,0x88, +0xe0,0x0, 0x27,0xfe,0x8f,0x86,0xe0,0x0, 0x27,0xdb,0xe0,0x3, 0xde,0xac,0xe8,0x0, +0x8f,0x8c,0xe2,0x0, 0xcf,0x84,0xe0,0x1, 0x1, 0x15,0xf0,0x1, 0x1f,0x57,0xe8,0x3, +0x8f,0xbe,0xe0,0x0, 0x27,0xf7,0xf0,0x2, 0x1e,0xc8,0xe0,0x1, 0xde,0x85,0xe8,0x0, +0x8c,0x8d,0xe8,0x0, 0x8c,0xc, 0xe0,0x2, 0xd9,0x56,0xe8,0x0, 0x8f,0xd, 0xe8,0x0, +0x8f,0x8d,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x6b,0xe0,0x0, 0x1f,0x93,0x17,0x0, +0xaf,0xf, 0x8f,0x86,0x27,0xb4,0x14,0x1, 0xe0,0x6, 0xd5,0x4d,0x14,0x0, 0xe0,0x4, +0xde,0x87,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x23,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x1, 0x18,0xe8,0x0, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x1d, +0xe0,0x4, 0x8f,0xc2,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x6, 0xe0,0x2, 0xd6,0xb2, +0xe0,0x2, 0xde,0x2f,0x14,0x2, 0xe0,0x6, 0xd5,0x2e,0xe0,0x6, 0xd5,0xd3,0x14,0x3, +0xe0,0x6, 0xd5,0x29,0xe0,0x4, 0xd4,0xd0,0x14,0x4, 0xe0,0x6, 0xd5,0x24,0xe0,0x6, +0xd8,0x4d,0xef,0xff,0xd1,0xea,0x8f,0x86,0xe0,0x0, 0x2f,0xca,0x87,0x83,0xe0,0x5, +0xd6,0xd2,0xe0,0x4, 0x87,0xf2,0xaf,0x83,0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe7,0xfe, +0x1, 0x6e,0x14,0x1, 0xe0,0x0, 0xda,0x8, 0xe0,0x4, 0x8f,0xc2,0xe2,0x0, 0xcf,0x81, +0x1, 0x87,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xa7,0xce,0xcf,0x84,0xbf,0xce,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0x17,0x80,0xb7,0x85,0xe7,0xfe,0x0, 0xf0,0x8f,0x86,0xe7,0xfe, +0x27,0xd1,0xe0,0x1, 0xd6,0x4a,0xe0,0x4, 0x87,0xf2,0xaf,0x83,0xe7,0xfe,0x0, 0xca, +0xe0,0x3, 0xd2,0x5d,0xef,0xfe,0xd7,0xff,0xe7,0xff,0x0, 0x87,0xe8,0x0, 0x8f,0x8c, +0x16,0x84,0xe0,0x2f,0x3f,0x8d,0xe7,0xff,0x27,0x96,0xe0,0x3, 0x1f,0xac,0xe4,0x0, +0xc7,0xe, 0x3f,0x1f,0x8f,0xbe,0xe7,0xff,0x27,0x8e,0xde,0x83,0xe7,0xff,0x0, 0x8b, +0xe0,0x3, 0x1f,0xc0,0x17,0x1, 0xaf,0xf, 0xe7,0xfe,0x0, 0xe9,0xe0,0x6, 0xdf,0xa5, +0xe0,0x0, 0x1f,0x87,0xe8,0x3, 0x87,0x3e,0x86,0xf, 0xe0,0x2, 0x1f,0xdf,0x86,0x8f, +0xe0,0x0, 0x1f,0x85,0xae,0xf, 0xe0,0x2, 0x1f,0xdd,0xae,0x8f,0x16,0x80,0xe0,0x2, +0x1f,0xdb,0xae,0x8f,0xe0,0x1, 0x1f,0xcc,0x87,0x8f,0xe0,0x5, 0xaf,0xb2,0xe0,0x2, +0x1f,0xa8,0xaf,0xf, 0xe0,0x1, 0xd6,0x9, 0xef,0xfe,0xdf,0xcd,0xef,0xfe,0xd8,0x55, +0xe7,0xff,0x0, 0xbb,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xa7,0xce,0xcf,0x84,0xbf,0xce, +0xe7,0xfe,0x0, 0xf6,0xe0,0x2, 0x1f,0x7a,0xaf,0x8e,0xe7,0xfd,0x0, 0xe7,0xde,0x80, +0x8f,0x87,0xe7,0xfe,0x0, 0xdd,0xde,0x69,0xe7,0xfe,0x0, 0xe4,0x8, 0xb2,0xe0,0x2, +0x1f,0x40,0x16,0x81,0xe0,0x4, 0xae,0xfe,0x14,0x2, 0xe0,0x4, 0x87,0x7e,0xe0,0x3, +0x1e,0xc7,0xe0,0x2, 0x1f,0xfd,0xaf,0xd, 0x16,0x80,0xe0,0x2, 0x1f,0x13,0xe0,0x1, +0x1e,0x5c,0xae,0x8e,0xe0,0x19,0x16,0x9d,0x3e,0x9f,0x17,0x7, 0xa1,0xc, 0xaf,0xd, +0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0x17,0x7b,0xa7,0xc2,0x3f,0xde,0xbf,0xc2,0xe0,0x1, +0xd7,0x95,0xa7,0xc2,0xcf,0x84,0xbf,0xc2,0x9, 0x61,0x0, 0x0, 0x8, 0xb2,0xe0,0x2, +0x19,0x40,0xe0,0x6, 0xd7,0x22,0xe0,0x2, 0xda,0xa7,0xe0,0x2, 0xdb,0xf8,0xe0,0x1, +0xdb,0xbb,0xe0,0x4, 0xd0,0x21,0xe0,0x4, 0xd1,0x49,0xdf,0xc9,0xe0,0x4, 0x8f,0xf2, +0xe2,0x0, 0xcf,0x81,0x1, 0xa, 0xe2,0x0, 0xcf,0x83,0x1, 0xf9,0xdd,0x50,0xe0,0x4, +0x8f,0xf2,0xe2,0x0, 0xcf,0x81,0x1, 0xf8,0xde,0x88,0x0, 0xf1,0xe0,0xe, 0x34,0x22, +0xe0,0xf, 0x34,0x42,0xe0,0x43,0x3f,0xe, 0xe0,0x3, 0x1d,0xb8,0x16,0x4, 0x16,0x81, +0x3e,0xdf,0x3e,0x5e,0xf0,0x0, 0xa3,0x8b,0x3e,0x4d,0xe2,0x0, 0xc4,0x12,0x16,0x88, +0xe2,0x0, 0xc7,0x20,0x3e,0xdf,0x3e,0x48,0xe0,0x0, 0x1f,0xc4,0xe8,0x1, 0xa5,0xe7, +0x3e,0x4e,0x3e,0xcc,0xa7,0x8f,0xe7,0xbf,0x17,0x7f,0x3f,0x5b,0xe4,0xd, 0x36,0xa5, +0xe0,0x24,0x15,0xf0,0xe0,0x3, 0x1c,0xc8,0xe0,0x3, 0x1d,0x49,0xe8,0x1, 0xbf,0x67, +0xe4,0xc, 0x36,0x2c,0xea,0xe, 0xc6,0x80,0x3d,0x9f,0xe0,0x1a,0xa7,0x2f,0xe0,0x7, +0xc7,0xb0,0x3f,0x59,0xe0,0x43,0xbf,0x2f,0x3f,0xfb,0xe0,0x43,0xa7,0x2f,0x3f,0x4c, +0xe0,0x43,0xbf,0x2f,0xe0,0x40,0xa7,0x1f,0x3f,0x5a,0xe0,0x40,0xbf,0x1f,0xe0,0x40, +0xa7,0x1f,0x3f,0x4d,0xe0,0x40,0xbf,0x1f,0x1, 0xe9,0xe8,0x1, 0xa7,0xe7,0xe0,0x40, +0xcf,0x80,0xe8,0x1, 0xbf,0xe7,0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x3b,0xe0,0x2, +0x1f,0x66,0xe0,0x2, 0x1f,0xfd,0x87,0xe, 0x15,0x85,0xe0,0x3, 0x8e,0x2f,0x3d,0xb9, +0xe0,0x3, 0x1e,0xb0,0xe2,0x0, 0xc7,0x1, 0x3e,0x7e,0x3e,0x9b,0xf0,0x40,0x3d,0x69, +0xf0,0x40,0x3c,0xe8,0x8a,0xbd,0xe0,0x1, 0x1, 0x69,0x9b,0x5f,0xe0,0x1, 0x8a,0xf, +0xf0,0x2, 0x1d,0xf9,0xe0,0x3, 0x1f,0xb8,0xe4,0x7, 0xc2,0xb0,0xa1,0x8f,0xe0,0x0, +0x1f,0xc4,0xe7,0xbf,0x17,0x7f,0xa1,0xf, 0xe0,0x1, 0xa7,0xe3,0x3a,0x92,0x13,0xa0, +0x3f,0xde,0xf2,0x0, 0xcd,0x2, 0x3b,0x95,0xe0,0x6, 0x17,0x26,0xe8,0xe, 0x3f,0x19, +0xe0,0x6, 0x15,0x28,0x14,0x80,0xe0,0x1, 0xbf,0xe3,0x3c,0x67,0xf0,0x6, 0x14,0x48, +0xe0,0x79,0x39,0x2e,0xf0,0x18,0x3c,0x15,0xe0,0x7, 0xdc,0xae,0xe0,0x0, 0x15,0x68, +0x14,0x80,0xe8,0x40,0x3c,0x68,0xe0,0x7, 0xdc,0xa7,0x23,0x2e,0x14,0x7f,0x3c,0x16, +0xe3,0xff,0xc4,0x7f,0x14,0xfe,0x15,0x7f,0xe8,0x9, 0x3c,0x9b,0xe8,0xa, 0x3d,0x19, +0xe8,0x8, 0x3c,0x19,0xf0,0x0, 0x13,0x81,0xe0,0x80,0x9f,0x19,0x17,0x84,0x3f,0x9e, +0xe0,0xd, 0x37,0x82,0x36,0xa2,0xe0,0x80,0x8d,0x9a,0x3e,0x97,0xe0,0x41,0x3f,0xe, +0xa6,0xd, 0x37,0x23,0x35,0xbe,0xe0,0xe, 0x37,0x85,0x3e,0x4b,0x37,0x22,0xbe,0xd, +0xe8,0xe, 0x3f,0x18,0xa6,0x8e,0xe0,0x41,0x3f,0x8f,0xf0,0xf, 0x33,0xbf,0x3f,0xcd, +0x3c,0x7a,0xbf,0x8e,0x1, 0xe2,0xe0,0x1, 0xa6,0x5, 0xe0,0x1a,0xa6,0x95,0xe8,0x6, +0x3b,0x19,0x17,0x90,0xe1,0x80,0x8f,0x16,0x37,0x3f,0x3e,0x4e,0xe0,0x1, 0xbe,0x5, +0x8f,0x26,0x37,0x3f,0xc7,0xf8,0x3e,0xce,0xe3,0xff,0xcf,0xf8,0xe0,0x1a,0xbe,0x95, +0x1, 0xf2,0xf2,0x0, 0xcd,0x1, 0x1, 0xe, 0xe0,0x1, 0xa7,0xe3,0x3c,0x64,0xe0,0x40, +0xcf,0x80,0xe0,0x1, 0xbf,0xe3,0xf8,0x0, 0xd, 0xa8,0xb, 0xa1,0xe7,0xfe,0x0, 0x98, +0x3d,0x2, 0x16,0x9c,0x3e,0x95,0xe0,0x16,0x15,0x90,0x3e,0x6d,0x17,0x0, 0x3d,0x92, +0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x1, +0xcf,0x4a,0xbd,0xf, 0x1, 0xf6,0xe0,0x6, 0xc2,0xc4,0xe0,0x16,0x15,0x90,0x3e,0x65, +0x17,0x0, 0x3d,0x92,0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80, +0xa5,0x1c,0x3f,0x9b,0xe2,0x0, 0xcf,0x1a,0xbd,0xf, 0x1, 0xf5,0xe0,0x1d,0x15,0xc0, +0x3e,0x6d,0x17,0x0, 0x3d,0x92,0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80, +0xa5,0x1c,0x3f,0x9b,0xe2,0x1, 0xcf,0x4a,0xbd,0xf, 0x1, 0xf6,0xe0,0x1d,0x15,0xc0, +0x3e,0x65,0x17,0x0, 0xe0,0xb, 0x3d,0x92,0xe0,0x1, 0x17,0xd2,0x3f,0x9e,0x37,0xa2, +0xc7,0x1, 0xe0,0x80,0xa5,0x1c,0x3f,0x9b,0xe2,0x0, 0xcf,0x1a,0xbd,0xf, 0x1, 0xf5, +0x17,0x0, 0x17,0x88,0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa6,0x1d,0x3f,0x92, +0xe2,0x1, 0xcf,0x4a,0xbe,0xf, 0x1, 0xf6,0xe0,0x0, 0x17,0x0, 0xe0,0x1, 0x17,0xd2, +0x3f,0x9e,0x37,0xa2,0xc7,0x1, 0xe0,0x80,0xa6,0x95,0x3f,0x92,0xe2,0x0, 0xcf,0x1a, +0xbe,0x8f,0x1, 0xf5,0xe7,0xff,0x0, 0x92,0x9b,0x6f,0xe0,0x1, 0x8a,0x1f,0xf0,0x2, +0x1d,0xf8,0xe7,0xfe,0x0, 0x99,0x8, 0xb5,0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d, +0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, 0xc7,0x81,0x3e,0xff,0xe0,0x0, 0x1, 0x49, +0x9a,0x5e,0xe0,0x2, 0x19,0x79,0xe0,0x3, 0x1f,0xb8,0xe7,0xbf,0x17,0x7f,0xa2,0x8f, +0xe0,0xc, 0x15,0x40,0xe0,0x1, 0xa7,0xe5,0x14,0x80,0x3f,0xde,0xe0,0x3, 0x1f,0x3f, +0xe0,0x1, 0xbf,0xe5,0xa1,0x8e,0xe0,0xc, 0xc1,0xd0,0x3c,0x63,0xe0,0x7, 0xdb,0xc4, +0x3e,0x62,0x16,0x80,0x2a,0xe, 0x0, 0xa5,0x9d,0x8c,0xa7,0xf, 0xc6,0x81,0xe4,0xb, +0x35,0xa0,0xe3,0xff,0xc6,0xff,0x3f,0x4b,0x3a,0x7d,0xbf,0xf, 0xc6,0x2, 0x1, 0x19, +0xe0,0xf, 0x36,0xc1,0x3f,0x6f,0x15,0x81,0xe3,0xff,0xc7,0xff,0xe3,0xff,0xc7,0x7f, +0x37,0xa2,0x3d,0xdd,0x37,0x22,0x3f,0x93,0x25,0xe8,0x3f,0x13,0x9d,0x8c,0xa7,0x8e, +0xc6,0x81,0xe3,0xff,0xc6,0xff,0x3f,0xcb,0x3a,0x7d,0xbf,0x8e,0xc6,0x2, 0x1, 0xe9, +0xe0,0x1, 0xa7,0xe5,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xe5,0xa, 0xe1,0x9a,0x6e, +0xe0,0x2, 0x19,0x78,0xe7,0xff,0x0, 0xb9,0x8, 0xb5,0x11,0x3, 0x39,0x38,0xe0,0x2, +0x1a,0x44,0x17,0x5, 0x3f,0x38,0x39,0x14,0xe0,0x3, 0x1f,0xb0,0x39,0xe8,0x8c,0x2, +0x3f,0x9e,0x8a,0xbf,0xe0,0x7, 0xd2,0x2c,0x8c,0x92,0x3c,0x65,0xe0,0x7, 0xd2,0x5e, +0x8c,0xa2,0x3c,0x65,0xe0,0x7, 0xd2,0x97,0xe2,0x0, 0xc9,0x81,0x1, 0x2, 0xa, 0xe1, +0x8c,0xc4,0x14,0x3, 0xe0,0x7, 0xd2,0x52,0x8c,0xd4,0x14,0x3, 0xe0,0x7, 0xd2,0x8b, +0x8c,0xc4,0x14,0x4, 0xe0,0x7, 0xd2,0x4a,0x8c,0xd4,0x14,0x4, 0xe0,0x7, 0xd2,0x83, +0x8c,0xc4,0x14,0x0, 0xe0,0x7, 0xd2,0x42,0x8c,0xd4,0x14,0x0, 0xa, 0xa1,0xe0,0xe4, +0x0, 0xfa,0xe2,0x0, 0xcc,0x82,0xe0,0x0, 0x2, 0xe1,0x8, 0xb5,0x17,0xfd,0x3f,0x98, +0xe2,0x0, 0xcf,0x81,0x39,0x68,0x3a,0x69,0xe0,0x1, 0x5, 0x88,0xe0,0x0, 0x2c,0x57, +0xe0,0x3, 0x1f,0xb8,0xe7,0xbf,0x16,0x7f,0xa6,0x8f,0xe0,0x0, 0x1f,0xc4,0xe0,0x1, +0xa7,0x6d,0xa7,0x8f,0x3f,0x5c,0xe0,0x1, 0xbf,0x6d,0xe2,0x0, 0xcc,0x81,0xa7,0x4f, +0xe6,0x7, 0x16,0x7f,0x3f,0x5c,0xe0,0x0, 0x1, 0x4a,0xe0,0x28,0xcf,0x0, 0xbf,0x4f, +0x16,0x40,0xa7,0x4f,0xe7,0xf8,0x15,0x80,0x3f,0x5c,0xcf,0x5, 0xbf,0x4f,0x12,0x85, +0xa7,0x5f,0xe0,0x3, 0x1e,0x4a,0x3a,0xb9,0x3f,0x5c,0xe8,0x0, 0xcf,0x5, 0xbf,0x5f, +0xa7,0x5f,0xe0,0x3, 0x19,0xb0,0x3f,0x5b,0xcf,0x5, 0xbf,0x5f,0xe0,0xc, 0x39,0x95, +0xe0,0x1, 0xa7,0xed,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0x8c,0xcc,0xe0,0x7, +0xd0,0x19,0xe0,0x3, 0x1f,0x8e,0x3c,0x62,0x3f,0x94,0x84,0x8f,0xe0,0x7, 0xd0,0x3d, +0x39,0x95,0x8d,0x23,0x3c,0x62,0x3c,0xea,0xe0,0x7, 0xd0,0xf9,0x8c,0x83,0x3c,0x62, +0x34,0xa3,0xe0,0x7, 0xd0,0xac,0x8c,0x93,0x3c,0x62,0x34,0xa3,0xe0,0x7, 0xd0,0xca, +0x3c,0x64,0xa, 0xa1,0xe7,0xfe,0x0, 0xea,0x38,0x82,0x12,0x85,0x3a,0xb9,0xe0,0x3, +0x19,0xb0,0xe0,0xf, 0x39,0x95,0x8c,0xcf,0x0, 0xdb,0xe0,0x50,0xcf,0x0, 0xbf,0x4f, +0x16,0x40,0xa7,0x4f,0x14,0x85,0x3f,0x5c,0xcf,0xa, 0xbf,0x4f,0x3a,0xe9,0xa7,0x5f, +0xe0,0x3, 0x1e,0x4a,0xe0,0x3, 0x19,0xb0,0x3f,0x5c,0xe8,0x0, 0xcf,0xa, 0xbf,0x5f, +0xe7,0xf8,0x16,0x0, 0xa7,0x5f,0x3f,0x5c,0xcf,0xa, 0xbf,0x5f,0xe0,0x1, 0xa7,0xed, +0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xed,0xe0,0x6, 0xdf,0xd4,0x3c,0xe2,0x3c,0x62, +0xe0,0x6, 0xdf,0xfb,0xe7,0xff,0x0, 0xbe,0x14,0x8a,0xe0,0x6, 0xdf,0xcb,0x14,0x80, +0x3c,0x62,0x12,0x85,0xe0,0x6, 0xdf,0xf1,0xe0,0x3, 0x19,0xb0,0x3a,0xb4,0xe7,0xff, +0x0, 0xb1,0x0, 0x0, 0xe0,0x2, 0x1f,0x66,0xe0,0x0, 0x1d,0x3b,0xe0,0x2, 0x1f,0xfd, +0x87,0xe, 0xf0,0x1, 0x8b,0xfa,0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, 0xe8,0xc, +0x3d,0x17,0x3e,0xfe,0xf0,0x6, 0x89,0xc, 0xe0,0x1, 0x1, 0x35,0xf0,0x0, 0x9a,0x5f, +0xf0,0x1, 0x89,0x8f,0xe0,0x1, 0x24,0x25,0xe0,0x0, 0x1f,0xba,0xf0,0x3, 0x1b,0x41, +0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe0,0x1, 0x27,0xa5,0x8, 0xb2,0xe0,0x1, 0x1f,0xdc, +0xe7,0x7f,0x16,0xff,0xa4,0xf, 0xa7,0x88,0xa7,0x8, 0x37,0xce,0xe2,0x0, 0xc7,0x81, +0xe4,0x0, 0xcf,0x81,0x3f,0x5d,0x37,0xae,0x3f,0xce,0xbf,0x88,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe0,0x1, 0x1f,0xcd,0xf0,0xe, 0x33,0xa2,0x96,0xfb,0x3f,0x9e,0xb6,0x8f, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe0,0x1, 0x97,0xb, 0xf0,0x0, 0x12,0x82,0xb7,0x1f, +0xf0,0x15,0x3a,0x9b,0xf0,0x2, 0x18,0xc8,0xf0,0x1, 0x18,0x7f,0xe8,0x40,0x3f,0x64, +0x16,0x0, 0x0, 0x96,0xe8,0x0, 0x8e,0x81,0xe0,0xf, 0x37,0x21,0xe2,0x0, 0xce,0x81, +0x3f,0x99,0xe0,0x0, 0x1, 0x49,0xe8,0x0, 0x96,0x85,0xb6,0x8f,0xc6,0x1, 0xe2,0x0, +0xce,0x6, 0xc7,0x1, 0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82,0x1, 0x13,0xf0,0xf, +0x31,0xdc,0xe0,0xd, 0x37,0x21,0xe2,0x0, 0xc7,0x81,0x3e,0x99,0x2f,0xe4,0xc6,0x1, +0xe2,0x0, 0xce,0x6, 0xc7,0x1, 0xb7,0x8d,0xe3,0xff,0xc7,0x7f,0xf0,0x0, 0xc2,0x82, +0x1, 0xef,0xe8,0x0, 0x8f,0x81,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x52,0xf0,0x0, +0x22,0x14,0x16,0x89,0xe8,0xd, 0x3e,0x94,0xe3,0xff,0xc6,0xff,0xe0,0x0, 0x17,0x89, +0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff,0x97,0xe, 0x3f,0xfd, +0xe1,0x80,0xb7,0x19,0x1, 0xf6,0xe0,0x6, 0x8f,0xda,0xc7,0xff,0xf0,0x40,0x3b,0xff, +0x4, 0x6, 0xa7,0x88,0xe7,0x7f,0x17,0x7f,0x3f,0xde,0xbf,0x88,0x17,0x0, 0xe8,0x0, +0xaf,0x6, 0x9, 0x61,0xf2,0x0, 0xc9,0x4, 0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe7,0xff, +0x1, 0xb4,0xe0,0xf, 0x37,0x21,0x3f,0x99,0xe0,0x45,0x16,0xc2,0xe8,0x0, 0x98,0x85, +0x3e,0x9e,0x99,0xf, 0x36,0xa1,0x38,0xa2,0xe8,0xd, 0x3e,0x90,0xb0,0x8d,0x9e,0x8f, +0xe8,0x0, 0x98,0x85,0x3e,0x91,0x36,0xc1,0xb6,0x8f,0xe7,0xff,0x0, 0xa1,0xe0,0x3, +0x1f,0x8a,0xf0,0x3, 0x1b,0x41,0xa5,0x8f,0xe8,0x0, 0x8f,0x86,0xe7,0xfe,0x2f,0xdf, +0x38,0x82,0xf0,0x0, 0x9a,0x6f,0xf0,0x1, 0x89,0x9f,0xe7,0xfe,0x0, 0xcd,0xf2,0x0, +0xc9,0x4, 0x1, 0x17,0xf7,0xff,0x22,0x41,0xf0,0x0, 0xc2,0x9, 0xf3,0xff,0xc2,0x7f, +0xe0,0x0, 0x17,0x89,0xe0,0xe, 0x37,0xa1,0x3f,0x1b,0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x97,0xe, 0xe8,0x40,0x3f,0xf4,0xe1,0x80,0xb7,0x19,0x1, 0xf5,0xe7,0xff,0x0, 0xad, +0xf0,0x0, 0x22,0x27,0xf7,0xff,0x11,0xff,0xf8,0x13,0x39,0x94,0xf3,0xff,0xc1,0xff, +0xf0,0x1, 0x19,0x7f,0xc5,0x92,0x3e,0xe9,0xf0,0x0, 0xc1,0x81,0xe0,0x0, 0x17,0x0, +0xe0,0x45,0x17,0xc2,0x9e,0xb, 0x3f,0x9e,0xf0,0x0, 0x9a,0x8d,0x37,0xa1,0xe8,0xc, +0x3e,0x25,0xe8,0xf, 0x3f,0x92,0xb6,0xf, 0xc7,0x1, 0x9f,0x8d,0xe1,0x80,0x9e,0x1b, +0xf0,0x40,0x39,0xfe,0x3f,0x9c,0x37,0xc1,0xe1,0x80,0xb7,0x9d,0x1, 0xea,0x17,0x86, +0xe0,0x3, 0x1f,0x44,0xf0,0xc, 0x33,0xa1,0xe8,0xf, 0x3f,0x94,0x16,0x80,0x3f,0x1c, +0x37,0xa1,0xb6,0x8e,0x3c,0x9f,0xb6,0x89,0xe7,0xfe,0x0, 0xf7,0xe0,0x2, 0x1f,0xba, +0x86,0xc8,0x8f,0x8f,0x87,0x68,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1f,0xcc,0x8f,0x8f, +0x1, 0x22,0x37,0xc1,0x16,0x60,0xc7,0x81,0x3e,0xdc,0xe2,0x0, 0xc7,0x9f,0x3f,0x5c, +0xce,0x81,0x3f,0xce,0xae,0xc8,0xaf,0xe8,0x15,0x80,0x87,0x48,0x87,0xe8,0x86,0x58, +0x86,0xf8,0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xc7,0x9f,0xcf,0x20,0xce,0x40,0xcf,0xa0, +0xce,0xc0,0x15,0x1, 0xad,0x8, 0xad,0x98,0xad,0xb8,0xaf,0x48,0xae,0x58,0xaf,0xe8, +0xae,0xf8,0x38,0x82,0xc7,0x81,0x37,0x81,0x16,0x60,0xc7,0x81,0x3e,0xdc,0xe2,0x0, +0xc7,0x9f,0x3f,0x5c,0xce,0x82,0x3f,0xce,0xae,0xc8,0xaf,0xe8,0x0, 0xde,0xe0,0x2, +0x1f,0xba,0xf0,0x0, 0x11,0x81,0x8d,0x8f,0xe2,0x0, 0xcd,0x82,0x1, 0x4, 0xf0,0x0, +0x11,0x80,0x15,0x81,0xc4,0x82,0xe2,0x1, 0xc4,0xff,0x17,0x81,0xf0,0x1, 0x1a,0x4c, +0xac,0x88,0x17,0x0, 0xaf,0xb8,0x15,0x47,0xf7,0xff,0x13,0xe0,0xf7,0xff,0x12,0x80, +0xf7,0xff,0x13,0x3f,0x0, 0x92,0x87,0xc8,0x86,0xd8,0xe2,0x0, 0xc7,0x9f,0xcf,0xe0, +0xe8,0xf, 0x3f,0xd7,0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xd8,0xaf,0xc8,0xc7,0x1, +0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0x4, 0xac,0x17,0x82,0x3f,0x9e,0x37,0xa1,0x3f,0x98, +0x86,0x9f,0x3e,0xda,0xae,0x9f,0x27,0x68,0xe2,0x0, 0xcf,0x1, 0xf0,0x0, 0x11,0x1f, +0xf0,0x0, 0x10,0x81,0xf0,0x12,0x39,0x5b,0xce,0xc0,0xf0,0x11,0x38,0x9b,0x1, 0x19, +0x86,0xf, 0xe2,0x0, 0xcf,0x2, 0xe8,0xc, 0x3e,0x57,0xe8,0xc, 0x3e,0x42,0xe8,0x40, +0x3d,0xe1,0xae,0xf, 0xe2,0x0, 0xc6,0x1f,0xe2,0x1, 0xc5,0xff,0xce,0x20,0x1, 0x17, +0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0xfe,0xae,0xf, 0xae,0x9f,0x3, 0xd6,0x38,0x82, +0x87,0xe8,0x86,0xf8,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0xc5,0xe8,0xf, 0x3f,0xd7, +0xe8,0xd, 0x3e,0xd6,0xcf,0x81,0xae,0xf8,0xaf,0xe8,0x0, 0xc2,0xe0,0x1, 0x86,0x98, +0xe0,0x1, 0x87,0x88,0xce,0xc0,0xe0,0x1, 0xae,0x98,0xe2,0x0, 0xc7,0x9f,0xe8,0x0, +0x8d,0x84,0xcf,0xa0,0xe8,0xb, 0x3d,0x93,0x35,0x81,0xc5,0x81,0xe0,0x1, 0xaf,0x88, +0xe2,0x1, 0xc5,0xff,0xe7,0xff,0x0, 0xad,0x17,0x0, 0x3f,0xe8,0xe1,0x80,0xaf,0x1f, +0xc7,0x81,0xaf,0x18,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xaf,0xf, 0xe7,0xfe,0x0, 0xe6,0xe0,0x2, 0x1f,0xba,0x16,0x82,0x8f,0x8f,0x87,0x58, +0xe0,0x2f,0x3f,0x8d,0xc7,0x81,0x16,0x80,0xcf,0x40,0xcf,0xa0,0xae,0x88,0xae,0x98, +0xae,0xb8,0xaf,0x58,0xaf,0xc8,0x38,0x82,0x8, 0xb2,0xe0,0x3, 0x19,0x2c,0x15,0x2a, +0x14,0x80,0x3c,0x62,0xe0,0x7, 0xd8,0xb0,0xe0,0x2, 0x1f,0xba,0x17,0x1, 0xaf,0x42, +0xe0,0x0, 0x17,0x41,0x8f,0x8f,0xe0,0x4, 0xaf,0x2, 0x2f,0x8c,0xe0,0x2, 0x87,0xa2, +0x17,0x60,0xe2,0x0, 0xc7,0x9f,0xcf,0xa0,0x3f,0xde,0xcf,0x81,0xe0,0x2, 0xaf,0xa2, +0x9, 0x61,0xe0,0x3, 0x1e,0xab,0x17,0x0, 0xe0,0x3, 0x1f,0xaa,0xaf,0xd, 0x3c,0x6d, +0xaf,0x1d,0xaf,0xf, 0xe0,0x3, 0x1f,0xa9,0xe0,0x3, 0x1e,0xc3,0xaf,0xf, 0xe0,0x3, +0x1f,0xa8,0x8c,0x8d,0xaf,0xf, 0xe0,0x3, 0x1f,0xa7,0xaf,0xf, 0xe0,0x3, 0x1f,0xa6, +0xaf,0xf, 0xe0,0x3, 0x1f,0xa5,0xaf,0xf, 0xe0,0x3, 0x1f,0xa4,0xaf,0xf, 0xe0,0x3, +0x1f,0xa3,0xaf,0xf, 0xe0,0x3, 0x1f,0xa2,0xaf,0xf, 0xe0,0x3, 0x1f,0xa1,0xaf,0xf, +0xe0,0x3, 0x1f,0xa0,0xaf,0xf, 0xe0,0x3, 0x1f,0x9f,0xaf,0xf, 0x9, 0x21,0xe7,0xfe, +0x0, 0x88,0xe0,0x0, 0x1f,0xbb,0x17,0x0, 0xaf,0xf, 0x16,0xff,0xaf,0x1f,0xae,0xaf, +0xaf,0x3f,0xaf,0x4f,0xaf,0x5f,0xaf,0x6f,0xaf,0x7f,0xe0,0x1, 0xaf,0xf, 0xe0,0x1, +0xaf,0x6f,0xe0,0x1, 0xae,0xff,0xe0,0x2, 0xaf,0xf, 0xe0,0x2, 0xaf,0x1f,0x38,0x82, +0xe0,0x0, 0x1f,0x3b,0x8e,0x8e,0xe0,0x0, 0x2e,0xdc,0x8f,0x8e,0x85,0x89,0x37,0xa5, +0x3f,0x9e,0xbc,0x6f,0xc5,0x81,0x8f,0x8e,0xe2,0x1, 0xc5,0xff,0x37,0xa5,0x3f,0x9e, +0x8c,0x39,0xe0,0x6, 0xad,0xdf,0x15,0x7f,0x3e,0x6d,0x8f,0x8e,0x37,0xa5,0x3f,0x9e, +0x3f,0x9d,0xe0,0x6, 0xad,0xf, 0x8f,0x8e,0x37,0xa3,0x3f,0x9d,0xc7,0x87,0x37,0xa2, +0xc6,0x81,0x3f,0x9e,0xe2,0x0, 0xce,0x85,0xbe,0xf, 0x1, 0xf0,0xe0,0x2, 0xae,0x2e, +0xe0,0x2, 0xae,0x3e,0xe0,0x2, 0xae,0x4e,0xe0,0x2, 0xae,0x5e,0xe0,0x2, 0xae,0x6e, +0xe0,0x2, 0x1f,0xc8,0xe0,0x2, 0xae,0x7e,0x8d,0xf, 0xe2,0x0, 0xcd,0x1, 0x1, 0x2a, +0x8f,0x8e,0x8e,0x99,0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0xf, 0x3d,0xad,0xe0,0x2, +0xae,0x2e,0xe2,0x0, 0xcd,0x81,0x8f,0x8e,0xe0,0x1, 0x1e,0xfe,0x37,0xa5,0x3f,0x9e, +0xbe,0xff,0x5, 0x11,0x8f,0x8e,0x16,0x82,0x37,0xa5,0x3f,0x9e,0xe0,0x6, 0xae,0x9f, +0x17,0x81,0xe0,0x2, 0xaf,0xce,0x8f,0x8e,0xe0,0x1, 0x1e,0xfd,0xc7,0x81,0x37,0xa5, +0x3f,0x9e,0xbe,0x8f,0x14,0x0, 0x8f,0x8e,0xc7,0x81,0xaf,0x8e,0x38,0x82,0x14,0x1, +0x38,0x82,0xe0,0x0, 0x24,0x50,0x8f,0x8e,0xf0,0x1, 0x1b,0x7c,0x37,0xa5,0x3f,0x9e, +0xe0,0x6, 0xae,0x8f,0x16,0x84,0xe0,0x2, 0xae,0x7e,0x14,0x82,0x8f,0x8e,0x16,0x3, +0x37,0xa5,0x3f,0x9e,0xf0,0x0, 0xbb,0x7f,0xf0,0x40,0x3b,0xe9,0x8f,0x8e,0x37,0xa5, +0x3f,0x9e,0xe0,0x6, 0xae,0x9f,0xe0,0x2, 0xad,0x6e,0x8e,0x8e,0xc6,0x81,0x36,0xa5, +0x3e,0x9e,0xf0,0x0, 0xbb,0xd, 0x17,0x80,0x8e,0x8e,0x34,0x21,0x36,0xa5,0x3e,0x9e, +0x3e,0x99,0xe0,0x6, 0xaf,0x8d,0x3d,0xa8,0xf0,0x2, 0xab,0xae,0xe2,0x0, 0xcd,0x81, +0x8f,0x8e,0xe0,0x1, 0x1e,0xfe,0x37,0xa3,0x3f,0x99,0xc7,0x87,0x37,0xa2,0x3f,0x9e, +0xbe,0x8f,0x5, 0x41,0x8e,0x8e,0x17,0x82,0x36,0xa5,0x3e,0x9e,0x3e,0x9c,0xe0,0x6, +0xaf,0x8d,0x14,0x0, 0xe0,0x2, 0xae,0x4e,0x8f,0x8e,0xe0,0x1, 0x1e,0xfd,0x37,0xa3, +0x3f,0x9c,0xc7,0x87,0x37,0xa2,0x3f,0x9e,0xbe,0x8f,0x8f,0x8e,0xc7,0x81,0xaf,0x8e, +0x38,0x82,0xf0,0x40,0x3b,0xe8,0x3e,0x6a,0x3c,0xe8,0x0, 0xce,0xe2,0x0, 0xcc,0x4, +0x1, 0x20,0x5, 0x92,0xe2,0x0, 0xcc,0x6, 0x2, 0x9f,0x17,0x80,0x8f,0x39,0xaf,0x89, +0xaf,0x99,0x27,0x7, 0x87,0xd9,0xe2,0x1, 0xc7,0xbf,0xaf,0xd9,0x17,0xa1,0xaf,0xc9, +0x17,0x80,0xaf,0xb9,0x38,0x82,0xe2,0x0, 0xcc,0x3, 0x1, 0x8f,0x87,0xd9,0x17,0x47, +0x3f,0xde,0xcf,0x90,0x17,0x0, 0xaf,0x9, 0xaf,0x19,0xaf,0x39,0xaf,0xd9,0x38,0x82, +0x3c,0x69,0xe7,0xfb,0x0, 0xdd,0x38,0x82,0x38,0x82,0x0, 0x0, 0x8, 0xb4,0xc0,0x60, +0xe0,0x0, 0x19,0x3b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0x11,0x94,0xaf,0x22, +0x39,0x90,0xaf,0xb2,0x3c,0x63,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, +0xaf,0x82,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0x17,0xe, 0xe0,0x2, 0xaf,0x82, +0xe0,0x2, 0x1a,0x48,0xe0,0x2, 0xaf,0x92,0x8f,0x84,0x3f,0x3f,0xe0,0x3, 0x1f,0xac, +0x3f,0x9e,0xf0,0x0, 0x80,0x8f,0xf0,0x0, 0x81,0x1f,0xf0,0x0, 0x81,0xaf,0xf0,0x0, +0x82,0x3f,0xf0,0x0, 0x68,0x94,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, +0x83,0xff,0xe0,0x1, 0x84,0x8f,0xe0,0x1, 0x85,0x1f,0xe0,0x1, 0x85,0xaf,0xe0,0x1, +0x86,0x3f,0xe0,0x1, 0x86,0xcf,0xe0,0x1, 0x87,0x5f,0x87,0xcf,0xf0,0x0, 0xa9,0x13, +0xf0,0x0, 0xa9,0xa3,0xf0,0x0, 0xaa,0x33,0xaf,0xc3,0xf0,0x0, 0xaa,0xd3,0xf0,0x0, +0xab,0x63,0xf0,0x0, 0xab,0xf3,0xe0,0x1, 0xac,0x83,0xe0,0x1, 0xad,0x13,0xe0,0x1, +0xad,0xa3,0xe0,0x1, 0xae,0x33,0xe0,0x1, 0xae,0xc3,0xe0,0x1, 0xaf,0x53,0xdd,0x7f, +0xf8,0x3, 0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x4, 0x77,0x88,0xde,0xbe,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x84,0xc7,0x81, +0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, 0xaf,0x92, +0x17,0x80,0xe0,0x0, 0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0xa, 0x61,0x8, 0xb3,0xc0,0x60, +0xe0,0x0, 0x19,0x3b,0x17,0x0, 0xaf,0x2, 0x17,0xff,0xaf,0x12,0x16,0x8e,0xaf,0xa2, +0xaf,0x32,0xaf,0x42,0xaf,0x52,0xaf,0x62,0xaf,0x72,0xe0,0x1, 0xaf,0x2, 0xe0,0x1, +0xaf,0x62,0xe0,0x1, 0xaf,0xf2,0xe0,0x2, 0xaf,0x2, 0xe0,0x2, 0x19,0xc8,0xe0,0x2, +0xaf,0x12,0x8f,0x83,0x3e,0xbf,0xe0,0x3, 0x1f,0xac,0x3f,0x9d,0xf0,0x0, 0x81,0x2f, +0xf0,0x0, 0x81,0xcf,0xf0,0x0, 0x82,0x5f,0xf0,0x0, 0x82,0xef,0xf0,0x0, 0x83,0x7f, +0xf0,0x1, 0x83,0x8f,0x86,0xbf,0xe0,0x1, 0x84,0xaf,0xe0,0x1, 0x85,0x3f,0xe0,0x1, +0x85,0xcf,0xe0,0x1, 0x86,0x5f,0xe0,0x1, 0x84,0x1f,0xf0,0x0, 0x69,0x16,0x3f,0xed, +0xf0,0x0, 0x69,0x98,0xe2,0x1, 0xc7,0xff,0xf0,0x0, 0x6a,0x19,0xf0,0x0, 0x6a,0x9a, +0xf0,0x0, 0x6b,0x1b,0xf0,0x0, 0x6b,0x9c,0x6c,0x1d,0x6c,0x9e,0x6d,0x1f,0x6d,0xa0, +0x6e,0x21,0x6f,0x14,0x6f,0x15,0x27,0x87,0x57,0x8c,0xe2,0x1, 0xc7,0xbf,0xe0,0x42, +0xcf,0x80,0x77,0x8c,0x17,0x80,0xf0,0x0, 0x11,0x14,0x6f,0x97,0xf0,0x12,0x39,0x10, +0xf8,0x12,0x8, 0x2, 0x17,0x84,0x3f,0x90,0xf8,0xf, 0x8, 0x12,0x3c,0xef,0x57,0x90, +0x14,0x6, 0x77,0x88,0xef,0xff,0xde,0x36,0x17,0x80,0xe0,0xe, 0x39,0x1f,0x86,0x83, +0xc7,0x81,0xe2,0x0, 0xcf,0x85,0xe0,0x1, 0xae,0x9e,0x1, 0xf8,0x17,0x80,0xe0,0x2, +0xaf,0x92,0x17,0x80,0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, +0x8f,0x5e,0xe0,0x2, 0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, +0xc7,0xff,0x8f,0x2, 0x3f,0xfe,0x4, 0xf1,0xc0,0x20,0x9, 0xe1,0x8, 0xb1,0xc0,0x70, +0xe0,0x3, 0x1f,0xac,0xe2,0x0, 0x7c,0x84,0xf0,0x0, 0x80,0xf, 0xf0,0x0, 0x80,0x9f, +0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf, +0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f, +0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf, +0x14,0x0, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, +0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, +0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdd,0xd9, +0xe0,0x0, 0x1f,0xbb,0x17,0x0, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, +0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x8, 0xb1, +0xc0,0x70,0xe0,0x3, 0x1f,0x2c,0x17,0x8e,0x3f,0x9e,0xf0,0x1, 0x80,0x6e,0xf0,0x0, +0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf,0xf0,0x0, 0x82,0x4f,0xf0,0x0, +0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff,0xe0,0x1, 0x85,0xf, 0xe0,0x1, +0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0xe0,0x1, +0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x1, 0x6f,0x10,0x6f,0x91,0xf0,0x0, 0x68,0x4, +0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, 0x69,0x87,0xf0,0x0, 0x6a,0x8, +0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, 0x6b,0x8b,0x6d,0xc, 0x6d,0x8d, +0x6e,0xe, 0x6e,0x8f,0xdd,0x8e,0xe0,0x0, 0x1f,0xbb,0x17,0x1, 0xe0,0x1, 0xaf,0x1f, +0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, 0xaf,0x4f,0xe0,0x1, 0xaf,0x5f, +0xc0,0x10,0x8, 0xe1,0x8, 0xb1,0xc0,0x70,0xe0,0x3, 0x1f,0x2c,0x17,0x9c,0x3f,0x9e, +0xf0,0x3, 0x80,0x4e,0xf0,0x0, 0x80,0x9f,0xf0,0x0, 0x81,0x2f,0xf0,0x0, 0x81,0xbf, +0xf0,0x0, 0x82,0x4f,0xf0,0x0, 0x82,0xdf,0xf0,0x0, 0x83,0x6f,0xf0,0x0, 0x83,0xff, +0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f,0xe0,0x1, 0x86,0x2f,0xe0,0x1, 0x86,0xbf, +0xe0,0x1, 0x87,0x4f,0xe0,0x1, 0x87,0xdf,0xe2,0x0, 0x7c,0x84,0x14,0x2, 0x6f,0x10, +0x6f,0x91,0xf0,0x0, 0x68,0x4, 0xf0,0x0, 0x68,0x85,0xf0,0x0, 0x69,0x6, 0xf0,0x0, +0x69,0x87,0xf0,0x0, 0x6a,0x8, 0xf0,0x0, 0x6a,0x89,0xf0,0x0, 0x6b,0xa, 0xf0,0x0, +0x6b,0x8b,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f,0xdd,0x43,0xe0,0x0, 0x1f,0xbb, +0x17,0x2, 0xe0,0x1, 0xaf,0x1f,0xe0,0x1, 0xaf,0x2f,0xe0,0x1, 0xaf,0x3f,0xe0,0x1, +0xaf,0x4f,0xe0,0x1, 0xaf,0x5f,0xc0,0x10,0x8, 0xe1,0x0, 0x0, 0x8, 0xb2,0xe0,0x0, +0x19,0x3b,0x17,0x80,0xaf,0x82,0x17,0x7f,0xaf,0x92,0xe2,0x0, 0xcc,0x1, 0xaf,0x22, +0xaf,0xb2,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2,0xe0,0x1, 0xaf,0x82,0xe0,0x1, +0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82,0xe0,0x2, 0xaf,0x92,0x1, 0x20, +0x4, 0x9d,0xe2,0x0, 0xcc,0x2, 0x1, 0x18,0x17,0x80,0xe0,0x2, 0xaf,0x92,0x17,0x80, +0x8f,0x2, 0x27,0x11,0xe0,0xe, 0x37,0xa5,0x3f,0x12,0xe0,0x6, 0x8f,0x5e,0xe0,0x2, +0x8e,0x92,0xc7,0x81,0x3f,0x1d,0xe0,0x2, 0xaf,0x12,0xe2,0x1, 0xc7,0xff,0x8f,0x2, +0x3f,0xfe,0x4, 0xf1,0x9, 0x61,0xdf,0x7f,0x0, 0xe8,0xde,0xe9,0x0, 0xe6,0xdf,0x30, +0x0, 0xe4,0x8, 0xb2,0xe0,0x0, 0x1f,0xbb,0xe0,0x2, 0x8f,0xcf,0x27,0x96,0xe0,0x2, +0x1f,0x3a,0x8f,0xe, 0xe2,0x0, 0xcf,0x2, 0x1, 0x27,0xe0,0x1, 0x1f,0x4c,0xc7,0x82, +0x8f,0xe, 0x37,0xa1,0x3f,0x98,0x86,0x8f,0x37,0x41,0xc7,0x1, 0x16,0x60,0xe2,0x0, +0xc7,0x1f,0x3e,0xdc,0x3f,0x4d,0xaf,0xf, 0xe0,0x2, 0x1f,0xc8,0x89,0xf, 0xe2,0x0, +0xc9,0x1, 0x1, 0x2, 0x9, 0x61,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xcd,0xe2,0x0, +0xc7,0x81,0x2f,0x9b,0x14,0x8a,0x14,0x3, 0xe0,0x6, 0xda,0x24,0x14,0x8a,0x14,0x4, +0x9, 0x21,0xe0,0xd4,0x0, 0x9f,0x3f,0x1f,0xe0,0x1, 0x1f,0xcc,0x37,0x21,0x8f,0x8f, +0x3c,0x1e,0xc7,0x81,0x87,0x8, 0x37,0x81,0xc7,0x81,0x16,0xe0,0xe2,0x0, 0xc7,0x9f, +0x3f,0x5d,0x3f,0xce,0xaf,0x88,0x0, 0xd9,0x97,0x8e,0xe7,0x0, 0x16,0x80,0xe3,0xbf, +0xc7,0xff,0xb7,0x8e,0x3c,0xe2,0x97,0x8e,0x14,0x3, 0x3f,0xcd,0xb7,0x8e,0xe0,0x6, +0xda,0x1, 0x3c,0xe2,0x14,0x4, 0x9, 0x21,0xe0,0xd3,0x0, 0xfc,0x8, 0xb1,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x27,0x99,0xe0,0x2, 0x1f,0xba,0x8f,0x8f,0x27,0xaf,0xe0,0x2, +0x1f,0x48,0x16,0x82,0x8f,0x8e,0xe0,0x2f,0x3f,0x8d,0x2f,0xa8,0x17,0x83,0xe0,0x2f, +0x3c,0xf, 0x2f,0xa4,0x8f,0x8e,0x17,0x1, 0xe0,0x2f,0x3f,0x8e,0x2f,0x9f,0x17,0x86, +0xe0,0x28,0x3c,0xf, 0x2c,0x1b,0xe0,0x7, 0xd4,0x33,0xe0,0x0, 0xdd,0x61,0xe0,0x3, +0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0xe7,0xfb,0x16,0x7f,0xa7,0x4f,0x97,0x8d, +0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d,0x17,0x1, 0xe0,0x0, +0x1f,0xbb,0xaf,0x3f,0x8, 0xa1,0xe0,0xda,0x0, 0xb3,0xe0,0x7, 0xd4,0x19,0xe0,0x0, +0xdd,0x47,0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0xe7,0xfb,0x16,0x7f, +0xa7,0x4f,0x97,0x8d,0xe2,0x0, 0xc7,0x1, 0x37,0x29,0x3f,0xdc,0x3f,0xce,0xb7,0x8d, +0x17,0x1, 0xe0,0x0, 0x1f,0xbb,0xaf,0x3f,0x8, 0xa1,0xe0,0xda,0x0, 0xab,0x8, 0xb3, +0xc0,0x70,0xe2,0x0, 0xcc,0x2, 0x39,0x68,0xe0,0x0, 0x5, 0xce,0xe2,0x0, 0xc9,0x6, +0x14,0x0, 0x5, 0x83,0xc0,0x10,0x9, 0xe1,0xe0,0x2, 0x1f,0xc8,0x17,0xe, 0x8f,0x8f, +0xe2,0x0, 0x7c,0x4, 0x3f,0x3f,0xe0,0x3, 0x1f,0xac,0x3f,0x9e,0xf0,0x0, 0x81,0xf, +0xf0,0x0, 0x81,0x9f,0xf0,0x0, 0x82,0x2f,0xf0,0x0, 0x82,0xbf,0xf0,0x0, 0x83,0x4f, +0xf0,0x0, 0x83,0xdf,0xe0,0x1, 0x85,0xf, 0xe0,0x1, 0x85,0x9f,0xe0,0x1, 0x86,0x2f, +0xe0,0x1, 0x86,0xbf,0xe0,0x1, 0x87,0x4f,0x81,0xef,0x84,0xff,0xe0,0x1, 0x87,0xdf, +0xf0,0x0, 0x69,0x4, 0xf0,0x0, 0x69,0x85,0xf0,0x0, 0x6a,0x6, 0xf0,0x0, 0x6a,0x87, +0xf0,0x0, 0x6b,0x8, 0xf0,0x0, 0x6b,0x89,0x6d,0xc, 0x6d,0x8d,0x6e,0xe, 0x6e,0x8f, +0x6f,0x10,0x6f,0x91,0x6c,0x8b,0x69,0x8a,0xdf,0x15,0xe2,0x0, 0x7c,0x84,0x3c,0x62, +0xdc,0xbe,0xe2,0x0, 0x7c,0x4, 0xe0,0x6, 0xdc,0x44,0x3c,0x62,0xdf,0x60,0x14,0x1, +0xc0,0x10,0x9, 0xe1,0x11,0x8e,0xe0,0x3, 0x1f,0xac,0x39,0xb8,0x39,0x9f,0x3c,0x63, +0xdf,0x1, 0x3c,0x63,0xe0,0x6, 0xdc,0x35,0x3c,0x62,0xdf,0x51,0x14,0x1, 0xc0,0x10, +0x9, 0xe1,0x8, 0xb2,0xe0,0x3, 0x1f,0x47,0xe0,0x2, 0x1f,0x94,0x8e,0x8e,0x87,0x6f, +0xe2,0x0, 0xc6,0x87,0x36,0xa5,0xe2,0x0, 0xc7,0x1f,0x3f,0x4d,0xaf,0x6f,0x16,0x60, +0x9f,0x3f,0x86,0xef,0x37,0x48,0xc7,0x1, 0xe2,0x0, 0xc7,0x1f,0x3e,0xdc,0x3f,0x4d, +0xaf,0x6f,0x9f,0x3f,0x37,0x48,0xe2,0x0, 0xc7,0x1f,0xe2,0x0, 0xcf,0x1f,0x1, 0x85, +0x87,0x6f,0x3f,0x5c,0xcf,0x4, 0xaf,0x6f,0x17,0x80,0xe0,0x0, 0x19,0x3b,0x17,0x7f, +0xaf,0xb2,0x14,0x0, 0xaf,0x92,0xaf,0x22,0xaf,0xc2,0xaf,0xd2,0xaf,0xe2,0xaf,0xf2, +0xe0,0x1, 0xaf,0x82,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0xaf,0x72,0xe0,0x2, 0xaf,0x82, +0xe0,0x1, 0xd0,0xb2,0x8f,0x12,0x8f,0x82,0x3f,0x7f,0x4, 0x87,0x17,0x83,0x14,0x1, +0xaf,0xb2,0x9, 0x21,0xe0,0x21,0x0, 0xa8,0x8f,0x92,0x37,0xa5,0x3f,0x92,0xa4,0x6f, +0xe2,0x1, 0xc4,0x7f,0xdf,0x55,0xe2,0x0, 0xcc,0x1, 0x1, 0xf1,0x14,0x1, 0x9, 0x21, +0xe0,0x21,0x0, 0x9a,0x8, 0xb5,0xe0,0x0, 0x19,0x3b,0x3a,0xe8,0x8f,0xb2,0xe2,0x0, +0xcf,0x81,0x1, 0x97,0xe0,0x2, 0x19,0x92,0xe0,0x3, 0x1a,0x38,0x97,0x83,0xe2,0x0, +0xc7,0x81,0x2f,0x87,0xa7,0x84,0xe0,0x4, 0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x27,0x83, +0xe0,0x1, 0xd0,0x48,0xe0,0x3, 0xd9,0x37,0x8f,0xb2,0xe2,0x0, 0xcf,0x81,0x1, 0x6f, +0x2a,0x82,0xa, 0xe1,0xa, 0xa1,0xe0,0xd6,0x0, 0xfb,0x8, 0xb1,0xe0,0x2, 0x1f,0x92, +0x97,0x8f,0xe2,0x0, 0xc7,0x81,0x2f,0xa0,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x4, +0xa7,0xff,0xe2,0x0, 0xc7,0x81,0x2f,0x98,0xe0,0x3, 0xd9,0x1d,0xe0,0x0, 0x1f,0x3b, +0xe0,0x2, 0x8c,0x1e,0x24,0x10,0x8f,0xce,0x27,0x84,0x0, 0x91,0x8e,0xcc,0x2e,0x8f, +0xe0,0x2, 0x8e,0x9e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3e,0xff,0xe0,0xc, 0x3f,0x1f, +0x2, 0xf6,0x14,0x0, 0x8, 0xe1,0xe0,0x1, 0xd0,0x15,0x0, 0xe7,0x14,0x1, 0x8, 0xe1, +0xe2,0x0, 0xcc,0x5, 0x2, 0x87,0xe0,0x0, 0x1f,0xbb,0x3c,0x1f,0xe0,0x2, 0x8c,0x28, +0x38,0x82,0x14,0x0, 0x38,0x82,0x8, 0xb2,0xe0,0x2, 0x1f,0x92,0x39,0x68,0x97,0x8f, +0xe2,0x0, 0xc7,0x81,0x2f,0x9f,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xe0,0x4, 0xa7,0xff, +0xe2,0x0, 0xc7,0x81,0x2f,0x97,0xe0,0x3, 0xd8,0xe6,0xe2,0x0, 0xc9,0x5, 0xe0,0x0, +0x1f,0xbb,0x17,0x0, 0x2, 0x84,0x39,0x1f,0xe0,0x2, 0x8f,0x22,0xe0,0x2, 0x8e,0x9f, +0x14,0x1, 0x3e,0xfe,0x5, 0x86,0x3f,0x9e,0x8c,0x4f,0x17,0x80,0xe1,0x28,0x3c,0xf, +0x9, 0x61,0xe0,0x0, 0xdf,0xdf,0x0, 0xe8,0x8, 0xb1,0xe0,0x6, 0xdb,0x19,0xe0,0x0, +0x1f,0xbb,0x16,0x83,0xae,0xbf,0x17,0x2, 0xaf,0x4f,0x16,0x80,0xaf,0x5f,0xaf,0x6f, +0xaf,0x7f,0xe0,0x2, 0x1e,0x12,0xe0,0x1, 0xaf,0xf, 0x97,0x8c,0xe0,0x3, 0x1f,0x1d, +0xe3,0xff,0xc7,0xef,0xb7,0x8c,0x97,0x8e,0xe3,0xff,0xc7,0xdf,0xb7,0x8e,0xe0,0x2, +0x1f,0xb3,0xae,0x8f,0xe0,0x1, 0x1f,0xdc,0xa7,0xf, 0xe0,0x0, 0x1f,0x90,0xae,0x8f, +0xe7,0x7f,0x16,0xff,0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0x8, 0xe1,0xe0,0x0, 0x1f,0xbb, +0x8f,0x3f,0xe2,0x0, 0xcf,0x1, 0x1, 0x2, 0x38,0x82,0x87,0x1f,0xaf,0x2f,0xe0,0x1, +0x8f,0x7f,0xc7,0x1, 0xe0,0x1, 0xaf,0x7f,0xe0,0x1, 0x8f,0x6f,0xc7,0x1, 0xe0,0x1, +0xaf,0x6f,0xe0,0x1, 0x8e,0xef,0x8f,0x1f,0x37,0x25,0x3f,0x1f,0xe0,0x6, 0x8f,0x5e, +0x3e,0xfe,0x4, 0xeb,0x17,0x0, 0xe0,0x1, 0xaf,0x6f,0x8f,0x1f,0xc7,0x1, 0xaf,0x1f, +0x8e,0x9f,0x8f,0xf, 0x3e,0xfe,0x3, 0xe1,0x17,0x3, 0xaf,0x3f,0x38,0x82,0x0, 0x0, +0x8, 0xb4,0xc0,0x7c,0xe0,0x0, 0x19,0x3b,0xe0,0x1, 0x89,0xf2,0x8f,0xa2,0x8f,0x32, +0xe2,0x0, 0xcf,0x1, 0x1, 0x3, 0xc0,0x4, 0xa, 0x61,0x8e,0x22,0x8e,0x82,0x3e,0x7d, +0xe0,0x0, 0x3, 0xc7,0x37,0xa3,0x8e,0xa2,0x3f,0x93,0xc7,0x87,0x36,0xa5,0x37,0xa2, +0x3e,0x92,0x3f,0x92,0xe0,0xb, 0x39,0x13,0xa6,0x6d,0xa4,0x8f,0xe0,0x1, 0x8f,0x9b, +0xe0,0x3, 0x1e,0xac,0xe4,0x0, 0xc7,0x87,0x3f,0x93,0xc7,0x82,0x37,0xa1,0x3f,0x9d, +0x8c,0x1f,0xe0,0x4, 0x34,0x47,0x24,0xac,0xe0,0x1, 0x17,0xff,0x3f,0xdc,0xe0,0x3, +0x1e,0xc1,0xe2,0x0, 0xcf,0x86,0xaf,0xd, 0x2, 0xa3,0x37,0x3f,0xe2,0x0, 0xc7,0x57, +0x27,0x1f,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8a, +0xe0,0x2, 0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0x5, 0x9f,0x3c,0x64,0xd8,0x18,0xe0,0x2, 0x1f,0x92,0x39,0x92,0x9f,0x8f,0x37,0xc4, +0xe2,0x0, 0xc7,0x81,0x27,0x92,0x17,0x2, 0xaf,0x43,0xe0,0x6, 0xda,0x71,0x8f,0x12, +0x8f,0x82,0x3f,0x7f,0xe7,0xff,0x4, 0xb1,0x17,0x2, 0xe0,0x0, 0x1f,0x99,0xaf,0x32, +0x17,0x0, 0xaf,0xf, 0xc0,0x4, 0xa, 0x61,0x17,0x81,0xaf,0xc3,0x0, 0xef,0xe0,0x2, +0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xdd,0x7c,0x81,0xe0,0x3, 0xd5,0xc3, +0xe0,0x1, 0x1f,0xd7,0x64,0x81,0xe0,0x1, 0xb4,0x2f,0x0, 0xd4,0x8, 0xb1,0xc0,0x68, +0xe0,0x2, 0x1f,0xfd,0xe9,0xff,0xc4,0x7e,0x87,0x5f,0x86,0xcf,0xe0,0xf, 0x34,0x41, +0x6f,0x5, 0x14,0x85,0x17,0x0, 0x7f,0x83,0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0x80, +0x6e,0x84,0x6f,0x6, 0x77,0x84,0xe0,0x6, 0xdc,0xbd,0xc0,0x18,0x8, 0xe1,0x0, 0x0, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0x1, 0x2e,0x9f,0xde,0xe0,0x3, 0x1e,0xb3,0xe2,0x0, 0xcc,0x2, +0xe0,0x3, 0x1f,0x32,0x3d,0xed,0xe0,0x6b,0x39,0x2e,0xe2,0x0, 0xcc,0x85,0x16,0x1, +0x36,0x39,0x2, 0x12,0x27,0x91,0x15,0x7f,0x3d,0x1f,0xe3,0xff,0xc5,0x7f,0x17,0x7f, +0xe2,0x1, 0xc6,0x7f,0x3f,0x1b,0x3d,0x1b,0x86,0x9e,0x3e,0xcc,0xe0,0x80,0xae,0x9e, +0x3f,0x7a,0x1, 0xfb,0x0, 0x83,0xe2,0x1, 0xc6,0x7f,0x16,0x86,0x3e,0x9f,0x3e,0x9b, +0x3f,0x9b,0x87,0xf, 0x3f,0x4c,0xe1,0x80,0xaf,0x1f,0x3e,0xff,0x1, 0xfb,0x38,0x82, +0x9f,0xee,0x0, 0xd3,0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, +0x8e,0xae,0xe2,0x0, 0xc7,0x81,0x3e,0xff,0x1, 0x3c,0x9f,0xde,0xe0,0x3, 0x1f,0x33, +0xe2,0x0, 0xcc,0x2, 0xe0,0x3, 0x1e,0xb2,0x3e,0x6e,0xe0,0x6c,0x39,0x2d,0xe2,0x0, +0xcc,0x85,0x14,0x1, 0x34,0x39,0x2, 0x18,0x27,0x97,0x14,0xff,0x3c,0x9f,0xe3,0xff, +0xc4,0xff,0xc4,0x81,0x3e,0xea,0x3f,0x6c,0x3c,0x9c,0xf0,0x41,0x3b,0x88,0x9d,0x8d, +0xc6,0x82,0xe2,0x9, 0xcd,0xaf,0x2, 0x85,0x85,0x8e,0xe8,0xb, 0x3d,0xd7,0xad,0x8e, +0xc7,0x1, 0x3f,0x79,0x1, 0xf5,0x17,0x6, 0xe0,0xd, 0x37,0xa1,0x3f,0x1f,0x3f,0x1c, +0x3f,0x9c,0x3d,0x1d,0xe0,0x41,0x3e,0x8, 0x9e,0x8a,0xc5,0x2, 0xe2,0x9, 0xce,0xaf, +0x2, 0x84,0x86,0x8f,0x3e,0xdc,0xae,0x8f,0xc7,0x81,0x3f,0x7f,0x1, 0xf6,0x38,0x82, +0x9f,0xee,0x0, 0xc5,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0x39,0x68,0xe0,0x1, 0xd0,0x3d, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0x3b,0x68,0xe0,0x0, 0x1, 0x77,0x95,0x5e,0xc5,0x6, 0xe3,0xff, +0xc5,0x7f,0xe2,0x0, 0xc9,0x2, 0xe0,0x3, 0x1c,0x32,0xe0,0x3, 0x1f,0xb3,0x14,0x80, +0xe0,0x68,0x39,0xaf,0xe0,0x7, 0xd1,0xe8,0xe0,0x0, 0x2b,0x62,0xe0,0x3, 0x1f,0xb8, +0xe0,0x2, 0x1e,0x92,0xa7,0x8f,0x16,0x5f,0xa7,0x4f,0x97,0x8d,0x37,0x45,0xe2,0x0, +0xc7,0x20,0x3f,0xdc,0x3f,0xce,0xe0,0x3, 0x1a,0xb3,0xf0,0x1, 0x1c,0x7e,0xf0,0x1, +0x1c,0xfd,0xb7,0x8d,0x11,0x85,0xe0,0x13,0x13,0xc4,0x12,0x1, 0x3c,0x67,0xe0,0x5, +0xdb,0xf6,0x3c,0xe3,0x3c,0x62,0xdf,0x3d,0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd4,0xd6, +0xdd,0x81,0x23,0x2d,0x3c,0xe2,0x3c,0x64,0xde,0x27,0x24,0x7d,0xe8,0x40,0x3d,0x68, +0x3c,0xe3,0x3c,0x62,0xc1,0xff,0xdf,0x67,0xe0,0x43,0x39,0x83,0x3c,0xe3,0x3c,0x62, +0xdf,0x28,0x3c,0xe2,0x3c,0x65,0xef,0xff,0xd4,0xc1,0x3c,0x64,0xdd,0xbc,0xe8,0x40, +0x3d,0x69,0x3c,0xe3,0x3c,0x62,0xdf,0x57,0xe0,0x1, 0xd0,0x49,0x2c,0xd, 0xc1,0xff, +0xe0,0x43,0x39,0x83,0xe2,0x0, 0xc9,0x80,0x3, 0x52,0xe0,0x3, 0x1c,0x33,0x3c,0xe2, +0xef,0xff,0xd4,0xac,0x2b,0xc, 0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x3c,0x64,0xdd,0xa3, +0xe8,0x40,0x3d,0x68,0x3c,0xe3,0x3c,0x62,0xdf,0x3e,0x0, 0xe7,0xe0,0x0, 0x1f,0xcd, +0x8c,0xf, 0xf8,0x0, 0xc, 0xa8,0xb, 0xa1,0xe7,0xf8,0x0, 0x82,0xda,0x10,0x13,0x1, +0xe7,0xff,0x0, 0x9e,0x95,0x6e,0xc5,0x6, 0xe3,0xff,0xc5,0x7f,0xe7,0xff,0x0, 0x8b, +0x8, 0xb3,0xe0,0x2, 0x1f,0xc2,0x17,0x0, 0x39,0xe8,0xb7,0xf, 0xe0,0x2, 0xd9,0xf3, +0xe2,0x0, 0xcc,0x1, 0x39,0x68,0x1, 0x3, 0x3c,0x62,0x9, 0xe1,0x3c,0x63,0xdf,0x63, +0x3c,0x62,0x9, 0xe1,0x8, 0xb4,0xe0,0x2, 0x1f,0xc8,0x89,0xf, 0xe0,0x1, 0xd0,0x7, +0x2c,0x19,0xe0,0x2, 0x19,0xfb,0x14,0x1, 0x8f,0x83,0x37,0xd2,0x3f,0xd8,0x2f,0x82, +0xa, 0x61,0xe0,0x2, 0x1f,0x77,0xe0,0x4, 0x34,0x32,0x8f,0x8e,0xe2,0x1, 0xc2,0x7f, +0x3f,0xc4,0xaf,0x8e,0xdd,0x60,0xe2,0x0, 0xc9,0x1, 0x1, 0x12,0x3c,0x62,0xdf,0xd1, +0x2c,0x3, 0x14,0x0, 0xa, 0x61,0xe0,0x0, 0xdf,0xea,0x2c,0x7c,0x8f,0x83,0xe3,0x4, +0x3f,0xd4,0xaa,0x3, 0xd6,0x41,0xe0,0x0, 0xdf,0x33,0x14,0x1, 0xa, 0x61,0x3c,0x62, +0xe0,0x3, 0xd4,0xe2,0xe0,0x2, 0x1f,0xe7,0xa9,0xf, 0x0, 0xe9,0x8, 0xb5,0xe0,0x2, +0x1f,0xc8,0x3a,0xe8,0x89,0xf, 0xe0,0x0, 0xdf,0xd2,0x2c,0x17,0xe0,0x2, 0x1a,0x77, +0x39,0xe8,0x8f,0x84,0x14,0x1, 0x37,0xd2,0x3f,0xd8,0x2f,0x82,0xa, 0xe1,0xdd,0x33, +0xe2,0x0, 0xc9,0x1, 0x1, 0x86,0xe0,0x2, 0x1f,0xe7,0x8f,0xf, 0x27,0x39,0xa9,0x8f, +0x3c,0x62,0xe0,0x2, 0xd9,0xc5,0x2c,0x3, 0x14,0x0, 0xa, 0xe1,0xe0,0x2, 0x1f,0xea, +0x3c,0x62,0x8c,0x8f,0xe0,0x2, 0xda,0xb4,0x3c,0xe2,0x14,0x0, 0xef,0xfd,0xd8,0x20, +0xe0,0x2, 0x1f,0x81,0xe0,0x1, 0x1d,0x6f,0xe0,0x1, 0x1c,0xf0,0xa4,0xf, 0x3d,0xe2, +0xef,0xfd,0xd2,0xac,0x24,0x6a,0xe0,0x2, 0x1f,0xac,0x3c,0x62,0x8c,0x8f,0xe0,0x2, +0xda,0x9f,0xe0,0x0, 0xdf,0x9c,0x2c,0x61,0x2a,0x97,0x3c,0x62,0xe0,0x2, 0xd9,0xf3, +0x14,0x0, 0xe0,0x2, 0xd8,0x7f,0x8f,0x84,0x11,0x81,0xe0,0x2, 0x31,0xb2,0xe3,0x2, +0x3f,0xd2,0xa9,0x4, 0xe0,0x0, 0xde,0xdc,0xd5,0xe7,0x3c,0x63,0xa, 0xe1,0x3c,0x62, +0xe0,0x3, 0xd4,0x8a,0x0, 0xc6,0xdc,0x9e,0x0, 0xe9,0x8, 0xb3,0xe0,0x3, 0xd4,0xd6, +0xe0,0x0, 0xdf,0x8c,0xe0,0x2, 0x1f,0xfb,0x8f,0x8f,0x27,0x8b,0xe0,0x13,0x11,0x44, +0x0, 0x86,0x3c,0x62,0xe0,0x5, 0xda,0xfb,0xe0,0x0, 0xdf,0x80,0xdf,0x64,0x24,0x7a, +0xe0,0x2, 0x1f,0xf7,0x11,0x1, 0x8f,0x8f,0xe0,0x13,0x11,0xc4,0x2f,0x87,0x0, 0x89, +0x3c,0x63,0xe0,0x5, 0xda,0xec,0xe0,0x0, 0xdf,0x71,0x3c,0x62,0xdf,0x88,0x24,0x79, +0x9, 0xe1,0xe0,0x2, 0x1f,0x91,0x16,0x7e,0xa6,0x8f,0xe0,0x0, 0x1f,0xbd,0xa7,0x1d, +0xa7,0x8f,0xcf,0x40,0xbf,0x1d,0x17,0x0, 0xaf,0x7f,0x15,0xfd,0xa7,0xf, 0xe0,0x1, +0x1e,0xdc,0x3f,0x5c,0xbf,0xf, 0xa7,0xf, 0xa6,0x8d,0x3f,0x5b,0xbf,0xf, 0xe0,0x1, +0xa7,0xd, 0x37,0x48,0xe2,0x0, 0xc7,0x1, 0x2f,0x1c,0xe0,0x1, 0x1f,0x42,0x87,0xe, +0xe2,0x1, 0xc7,0x7e,0xe0,0x1, 0xaf,0x3f,0x17,0x8, 0xe0,0x61,0x3f,0x11,0x17,0x10, +0xe0,0x61,0x3f,0x11,0xa7,0x4f,0xcf,0x10,0xbf,0x4f,0xe0,0x61,0x3f,0x82,0xcf,0x88, +0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82,0xcf,0x90,0xe0,0x61,0x3f,0x92,0x38,0x82, +0xe0,0x1, 0xa7,0xd, 0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x2f,0x60,0xe0,0x1, 0x1f,0x42, +0xe0,0x1, 0x87,0x4e,0x3e,0x5e,0xe0,0x1, 0xae,0x3f,0x0, 0xdf,0xd, 0xbf,0xe0,0x2, +0x1f,0x91,0xa7,0x8f,0xa7,0x6f,0x37,0x49,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x5c,0xa6,0x8e,0xe0,0x2, 0xa7,0xd, 0x37,0x49,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, +0x2f,0x57,0xa7,0x6f,0x37,0x41,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x41,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x32, +0xa7,0x6f,0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0xe0,0x3, 0x2f,0x16,0xa7,0x6f, +0xe2,0x0, 0xc7,0x1, 0x27,0xa, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x7e,0xa7,0x6f,0x37,0x48,0xe2,0x0, 0xc7,0x1, +0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x48,0xe2,0x0, +0xc7,0x1, 0xe0,0x2, 0x2f,0x62,0xa7,0x6f,0x37,0x43,0xe2,0x0, 0xc7,0x1, 0x27,0xb, +0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, +0xe0,0x2, 0x2f,0x48,0xa7,0x6f,0x37,0x42,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, +0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x42,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, +0x2f,0x25,0xa7,0x6f,0x37,0x47,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c, +0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe0,0x2, 0x2f,0x9, +0xa7,0x6f,0x37,0x4b,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x4b,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x60,0xa7,0x6f, +0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, +0xa7,0xe, 0x37,0x4d,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x44,0xa7,0x6f,0x37,0x4d, +0xe2,0x0, 0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, +0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0x28,0xa7,0x6f,0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4e, +0xe2,0x0, 0xc7,0x1, 0xe0,0x1, 0x2f,0xc, 0xa7,0x6f,0x37,0x4f,0xe2,0x0, 0xc7,0x1, +0x27,0xb, 0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x4f,0xe2,0x0, +0xc7,0x1, 0xe0,0x0, 0x2f,0x69,0xa7,0x6f,0x37,0x44,0xe2,0x0, 0xc7,0x1, 0x27,0xb, +0xe0,0x1, 0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x44,0xe2,0x0, 0xc7,0x1, +0xe0,0x0, 0x2f,0x4f,0xa7,0x6f,0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x27,0xa, 0xe0,0x1, +0x1f,0x5c,0xa7,0xe, 0xe0,0x2, 0xa7,0xe, 0x37,0x45,0xe2,0x0, 0xc7,0x1, 0x2f,0x29, +0xa7,0x6f,0x37,0x46,0xe2,0x0, 0xc7,0x1, 0x27,0x1f,0xe0,0x1, 0x1f,0x5c,0xa7,0xe, +0xe0,0x2, 0xa7,0xe, 0x37,0x46,0xe2,0x0, 0xc7,0x1, 0x27,0x16,0xa7,0x5f,0xa6,0xdf, +0x37,0x46,0xe2,0x0, 0xc7,0x1, 0xe7,0xff,0x16,0x3f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc, +0x37,0x26,0x3f,0x4d,0xbf,0x5f,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f, +0x9f,0x8d,0xcf,0xc0,0xb7,0x8d,0x17,0x81,0xe0,0x61,0x3f,0x91,0xf, 0xab,0x38,0x0, +0xa7,0x5f,0xa6,0xdf,0x37,0x47,0xe2,0x0, 0xc7,0x1, 0xe7,0xfe,0x16,0x7f,0xe4,0x0, +0xcf,0x1, 0x3e,0xdc,0x37,0x27,0x3f,0x4d,0xbf,0x5f,0x16,0x5f,0xa7,0x6f,0xe0,0x2, +0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x20,0xb7,0xd, 0x0, 0xc2,0xa7,0x6f, +0x16,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x10,0xb7,0xd, +0xe7,0xff,0x0, 0xaa,0xa7,0x6f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xe0,0x2, 0x1e,0xbd, +0xbf,0x6f,0x17,0x1, 0xe0,0x0, 0x1e,0x21,0xaf,0xd, 0xe0,0x2, 0x1e,0xe9,0xaf,0xc, +0x9f,0xd, 0xe1,0x0, 0xcf,0x0, 0xb7,0xd, 0xe7,0xff,0x0, 0x87,0xa7,0x6f,0xe7,0x7f, +0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x80,0xcf,0x0, +0xb7,0xd, 0xe7,0xfe,0x0, 0xeb,0xa7,0x6f,0xe7,0xbf,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x40,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0xcf, +0xa7,0x6f,0xe7,0xdf,0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, +0xe0,0x20,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0xb3,0xa7,0x5f,0xa6,0xdf,0x37,0x4f, +0xe2,0x0, 0xc7,0x1, 0xe6,0xff,0x16,0x7f,0xe4,0x0, 0xcf,0x1, 0x3e,0xdc,0x37,0x2f, +0x3f,0x4d,0xbf,0x5f,0xe7,0xef,0x16,0x7f,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c, +0xbf,0x6f,0x9f,0xd, 0xe0,0x10,0xcf,0x0, 0xb7,0xd, 0xe7,0xfe,0x0, 0x8a,0xa7,0x6f, +0xe7,0xfe,0x16,0x7f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x1, +0xcf,0x0, 0xb7,0xd, 0xe7,0xfd,0x0, 0xee,0xa6,0xef,0xe0,0x0, 0x1f,0x2f,0x16,0x7b, +0xa7,0xe, 0x3e,0xdc,0xbe,0xef,0xa6,0x9e,0xe0,0x2, 0x1e,0x69,0xce,0x81,0xbe,0x9e, +0xa6,0x9e,0xce,0x90,0xbe,0x9e,0x9f,0xc, 0xcf,0x4, 0xb7,0xc, 0xe7,0xfd,0x0, 0xcb, +0xa7,0x6f,0x16,0x77,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x8, +0xb7,0xd, 0xe7,0xfd,0x0, 0xb1,0xa7,0x6f,0xe7,0xfd,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x2, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfd,0x0, 0x95, +0xa7,0x6f,0x16,0x7e,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xcf,0x1, +0xb7,0xd, 0xe7,0xfc,0x0, 0xfb,0xa7,0x6f,0xe7,0xf7,0x16,0x7f,0xe0,0x2, 0x1e,0xe9, +0x3f,0x5c,0xbf,0x6f,0x9f,0xd, 0xe0,0x8, 0xcf,0x0, 0xb7,0xd, 0xe7,0xfc,0x0, 0xe1, +0xe0,0x2, 0x1f,0xc, 0x16,0x81,0xae,0x8e,0x16,0x5f,0xe0,0x0, 0x1f,0x3d,0xa6,0x8e, +0xa7,0xd, 0x3f,0x5c,0xbf,0xd, 0x16,0x7d,0xa7,0x6f,0xe0,0x2, 0x1e,0xe9,0x3f,0x5c, +0xbf,0x6f,0x9f,0xd, 0xcf,0x2, 0xb7,0xd, 0xe7,0xfc,0x0, 0xbc,0xe0,0x1, 0xa7,0x6d, +0xe7,0xef,0x15,0xff,0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6d,0xe0,0x1, 0xa7,0x6d, +0xe0,0x2, 0x1e,0x69,0x3f,0x5b,0xe0,0x1, 0xbf,0x6d,0xe7,0xfb,0x16,0xff,0xa7,0x6f, +0x3f,0x5d,0xbf,0x6f,0x9f,0xc, 0xe0,0x4, 0xcf,0x0, 0xb7,0xc, 0xe7,0xfc,0x0, 0x93, +0xf, 0x3f,0xe0,0x2, 0x1f,0x14,0x97,0xde,0xe0,0x40,0xcf,0x80,0xb7,0xde,0x17,0x82, +0xe0,0x61,0x3f,0x91,0xf, 0xae,0x38,0x0, 0xf, 0xbf,0x17,0x84,0xe0,0x61,0x3f,0x91, +0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0x17,0xa0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0xf, 0xbf,0xe0,0x0, 0x17,0xc0,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xe, 0x3f, +0xe0,0x2, 0x1f,0x42,0xe0,0x0, 0x1e,0xaa,0x9f,0x8e,0xe0,0x2, 0x1e,0x47,0xc7,0x81, +0xb7,0x8e,0x9f,0x8d,0x9f,0xc, 0xc7,0x81,0xb7,0x8d,0x27,0x3, 0xc7,0x7f,0xb7,0xc, +0xe0,0x3, 0x1f,0x96,0x8f,0xf, 0x27,0x4, 0x8f,0xf, 0xc7,0x7f,0xaf,0xf, 0x8f,0x8f, +0x2f,0x86,0xe0,0x2, 0x1f,0x12,0x97,0x8e,0xcf,0x88,0xb7,0x8e,0xe0,0x2, 0x1e,0xec, +0xe0,0x2, 0x1f,0x39,0x9f,0x8d,0xc7,0x81,0xb7,0x8d,0x9f,0x8e,0x27,0x84,0x9f,0x8e, +0xc7,0xff,0xb7,0x8e,0xe0,0x3, 0x1f,0xad,0x9f,0xf, 0x27,0x4, 0x9f,0xf, 0xc7,0x7f, +0xb7,0xf, 0xe0,0x3, 0x1f,0x81,0xe0,0x0, 0x1f,0x40,0xa7,0x8f,0x97,0xe, 0xb7,0x3f, +0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe0,0x2, +0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xac,0x38,0x0, 0xf, 0xbf,0xe0,0x4, 0x17,0x80, +0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x8, 0x17,0x80,0xe0,0x61, +0x3f,0x91,0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x10,0x17,0x80,0xe0,0x61,0x3f,0x91, +0xf, 0xaf,0x38,0x0, 0xf, 0xbf,0xe0,0x80,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf, +0x38,0x0, 0xf, 0xbf,0xe0,0x20,0x17,0x80,0xe0,0x61,0x3f,0x91,0xf, 0xaf,0x38,0x0, +0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x2, 0xdf,0xf9,0x17,0x88,0xe0,0x61,0x3f,0x91, +0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x3, +0xd0,0x28,0x17,0x90,0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, +0x8, 0xb1,0xe8,0x0, 0xc, 0x37,0xe0,0x2, 0x1f,0xe4,0xe7,0xfe,0x16,0xff,0xa7,0xf, +0xa7,0xbe,0x3f,0xdd,0xbf,0xbe,0xe0,0x5, 0xd7,0xfa,0xe0,0x40,0x17,0x80,0xe0,0x61, +0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0x8, 0xa1,0x38,0x0, 0x3f,0x83,0xe0,0x1, 0x1f,0xd4, +0xe0,0x6, 0x8f,0xf, 0xc7,0x7f,0xe0,0x6, 0xaf,0xf, 0xe0,0x6, 0x8f,0xf, 0x37,0x24, +0x3f,0x1f,0xa7,0xe, 0xe0,0x60,0x3f,0x19,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f, +0xa7,0x1e,0xe0,0x60,0x3f,0x1a,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x1f,0xa7,0x2e, +0xe0,0x60,0x3f,0x18,0xe0,0x6, 0x8f,0xf, 0x37,0x24,0x3f,0x9e,0xa7,0xbf,0xe0,0x61, +0x3f,0x92,0x3b,0x0, 0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1d,0x5, 0x16,0x84,0xae,0x8a, +0x17,0x81,0xaf,0x9a,0x17,0x2, 0xaf,0xaa,0xf0,0x0, 0x13,0x80,0xae,0xba,0xf8,0x40, +0x3a,0xe7,0xae,0xca,0x14,0x1, 0xaf,0x5a,0xaf,0x6a,0xaf,0x7a,0xe0,0x1, 0xaf,0xa, +0x17,0x3, 0xe0,0x1, 0xaf,0x9a,0xe0,0x1, 0xaf,0xaa,0xe0,0x1, 0xaf,0xba,0xe0,0x1, +0xaf,0xca,0xe0,0x1, 0xaf,0xda,0x17,0x80,0xe0,0x1, 0xaf,0x6a,0xf0,0x2, 0x1b,0x71, +0xe0,0x1, 0xaf,0xfa,0xf0,0xb, 0x33,0xa2,0xe8,0xb, 0x3d,0x96,0xf0,0x0, 0xba,0x8b, +0xe0,0x0, 0x17,0x80,0xe8,0x9, 0x3d,0x17,0xe0,0xe, 0x3d,0x1f,0x8e,0xe, 0x8e,0x89, +0xe0,0xe, 0x34,0x3f,0x3e,0x7d,0xc7,0x81,0x5, 0x84,0xa6,0x8b,0x3f,0x4d,0xbf,0xb, +0xe2,0x0, 0xcf,0x90,0x1, 0xf2,0xf0,0x0, 0xc3,0x81,0xf2,0x0, 0xcb,0x90,0x1, 0xe3, +0xe0,0x1, 0x1f,0xd4,0x17,0x0, 0xe0,0x6, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x71, +0xe0,0xf, 0x34,0x22,0x3f,0x1f,0xa7,0x8e,0x27,0xb3,0x3f,0x83,0xe0,0x1, 0x1f,0xd4, +0xe0,0x6, 0x8e,0x8f,0xe0,0x60,0x3e,0x9, 0x36,0xa4,0x3e,0x9f,0xbe,0xd, 0xe0,0x6, +0x8e,0x8f,0xe0,0x60,0x3e,0xa, 0x36,0xa4,0x3e,0x9f,0xbe,0x1d,0xe0,0x6, 0x8e,0x8f, +0xe0,0x60,0x3e,0x8, 0x36,0xa4,0x3e,0x9f,0xbe,0x2d,0xe0,0x6, 0x8e,0x8f,0xe0,0x61, +0x3e,0x2, 0x36,0xa4,0x3e,0x9f,0xbe,0x3d,0xe0,0x6, 0x8e,0x8f,0xc6,0x81,0xe0,0x6, +0xae,0x8f,0xa7,0x8e,0xe0,0x61,0x3f,0x92,0x17,0x81,0xe0,0x8, 0x37,0xb8,0xe0,0x61, +0x3c,0x11,0xe0,0x60,0x3f,0x80,0xcf,0x82,0xe0,0x60,0x3f,0x90,0x3b,0x0, 0x38,0x82, +0x8, 0xb4,0xe8,0x0, 0xc, 0x37,0xe0,0x3, 0x1f,0xb8,0xa1,0xf, 0xa7,0xb2,0x37,0xcf, +0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0xe0,0x0, +0x2f,0xf2,0xa7,0xb2,0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0xe2,0x0, 0xc7,0x81, +0xe0,0x0, 0x2f,0xf1,0xa7,0xb2,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82, +0x37,0xc1,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xed,0xa7,0xb2,0x37,0xca,0xe2,0x0, +0xc7,0x81,0x27,0x87,0xa7,0x82,0x37,0xca,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xe9, +0xa7,0xb2,0x37,0xcb,0xe2,0x0, 0xc7,0x81,0x27,0x86,0xa7,0x82,0x37,0xcb,0xe2,0x0, +0xc7,0x81,0x2f,0xbd,0xa7,0xb2,0x37,0xcc,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xa7,0x82, +0x37,0xcc,0xe2,0x0, 0xc7,0x81,0xe0,0x0, 0x2f,0xe6,0xa7,0xb2,0x37,0xc7,0xe2,0x0, +0xc7,0x81,0x27,0xa5,0xa7,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0xa0,0xa7,0x92, +0xe0,0x0, 0x1a,0x10,0xe0,0x1, 0xcf,0x80,0xbf,0x92,0x8f,0x84,0xe0,0x2, 0x19,0x92, +0x27,0x89,0x99,0x3, 0x31,0x4c,0xe2,0x0, 0xc1,0x1, 0x29,0x4, 0xe0,0x6, 0xd5,0x28, +0xa9,0x4, 0x97,0x83,0xe0,0x3, 0x1f,0x37,0xe3,0xdf,0xc7,0xff,0xb7,0x83,0x97,0x83, +0xe3,0xbf,0xc7,0xff,0xb7,0x83,0x9f,0x8e,0xc7,0x81,0xb7,0x8e,0xe0,0x1, 0x17,0x80, +0xe0,0x61,0x3f,0x91,0xf0,0x0, 0xb, 0xa8,0xa, 0x21,0x38,0x0, 0xa7,0x92,0xe0,0x3, +0x1f,0x1d,0xe0,0x10,0xcf,0x80,0xbf,0x92,0x97,0x8e,0xcf,0xa0,0xb7,0x8e,0xe7,0xff, +0x0, 0xbb,0xa7,0x92,0xe1,0x0, 0xcf,0x80,0xbf,0x92,0xe0,0x0, 0xd9,0x1f,0xe7,0xff, +0x0, 0x8a,0xa7,0x92,0xcf,0x81,0xbf,0x92,0xe0,0x0, 0xd9,0x5, 0xe7,0xff,0x0, 0x8c, +0xa7,0x92,0xcf,0x82,0xbf,0x92,0xe0,0x0, 0xd9,0x11,0xe7,0xff,0x0, 0x90,0xa7,0x92, +0xe0,0x2, 0x19,0x92,0xe0,0x8, 0xcf,0x80,0xbf,0x92,0x97,0x83,0xe0,0x2, 0x1f,0x14, +0xcf,0x82,0xb7,0x83,0x97,0xce,0xcf,0x88,0xb7,0xce,0xe0,0x0, 0xd8,0xdb,0xe7,0xff, +0x0, 0x89,0xa7,0x92,0x14,0x7, 0xe0,0x20,0xcf,0x80,0xbf,0x92,0xdf,0x18,0xe0,0x3, +0x1e,0x9d,0xe0,0x2, 0x19,0x92,0x9f,0xd, 0x97,0x83,0x16,0x6f,0x37,0x41,0xe2,0x0, +0xc7,0x10,0x3f,0xdc,0x3f,0xce,0xb7,0x83,0x97,0x8d,0xe3,0xff,0xc7,0xdf,0xb7,0x8d, +0xd9,0xe, 0xd9,0x37,0xa7,0x92,0xe0,0x2, 0x1f,0x14,0xe0,0x20,0xcf,0x80,0xbf,0x92, +0xe7,0x0, 0x16,0x80,0x97,0xde,0x3f,0xcd,0xb7,0xde,0xe0,0x2, 0x1f,0xf1,0xa7,0xff, +0x2f,0x87,0xe0,0x1, 0x17,0x80,0xe0,0x61,0x3f,0x91,0xe7,0xfe,0x0, 0xf0,0xde,0x7e, +0xe7,0xfe,0x0, 0xed,0x8, 0xb1,0xe0,0x6, 0xdc,0x84,0xe0,0x60,0x3f,0x87,0xe0,0x1, +0x1f,0x50,0xe0,0x1, 0xbf,0xf, 0xe0,0x2, 0x1f,0x65,0xe0,0x1, 0xbf,0x1f,0xe0,0x3, +0x1f,0x11,0xe0,0x1, 0xbf,0x2f,0xe0,0x1, 0x1f,0x4b,0xe0,0x1, 0xbf,0x3f,0xe0,0x3, +0x1f,0x14,0xe0,0x1, 0xbf,0x4f,0xe0,0x0, 0x1f,0x49,0xe0,0x1, 0xbf,0x5f,0xe0,0x0, +0x1f,0x14,0xe0,0x1, 0xbf,0x6f,0xe0,0x2, 0x1f,0x2a,0xe0,0x1, 0xbf,0x7f,0xe0,0x2, +0x1f,0x1d,0xe0,0x2, 0xbf,0xf, 0xe0,0x2, 0x1f,0x61,0xe0,0x2, 0xbf,0x1f,0xe0,0x2, +0x1f,0x2, 0xe0,0x2, 0xbf,0x2f,0xe0,0x3, 0x1f,0x42,0xe0,0x2, 0xbf,0x3f,0xe0,0x0, +0x1f,0x35,0xe0,0x2, 0xbf,0x4f,0xe0,0x2, 0x1f,0x6e,0xe0,0x2, 0xbf,0x5f,0xe0,0x0, +0x1f,0x36,0xe0,0x2, 0xbf,0x6f,0x8, 0xe1,0xe0,0x2, 0x1f,0x91,0xe7,0x7f,0x16,0x7f, +0xa7,0xf, 0xe0,0x1, 0x1f,0xdc,0xa6,0xae,0xa7,0x8f,0x3e,0xdc,0xbe,0xae,0xe0,0xa0, +0x17,0x0, 0x9e,0xbf,0xe0,0x1e,0xce,0x80,0xb6,0xbf,0xb7,0x7f,0xa7,0x4f,0x3f,0x5c, +0xbf,0x4f,0xa7,0x4f,0xe0,0x20,0xcf,0x0, 0xbf,0x4f,0x38,0x82,0xe0,0x2, 0x1f,0x91, +0xe7,0x7f,0x16,0x7f,0xa6,0x8f,0xe0,0x2, 0x1f,0xa4,0xa7,0x1d,0xa7,0x8f,0xcf,0x1, +0xbf,0x1d,0xe6,0xff,0x16,0xff,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0xa6,0x8f,0xe0,0x1, +0x1f,0x5c,0x3e,0xdc,0xa7,0xe, 0xbe,0x8f,0x9e,0xbe,0xe0,0x1e,0xce,0x80,0xb6,0xbe, +0xe0,0x61,0x3e,0x82,0xe7,0xef,0x15,0xff,0x3e,0xdb,0xe0,0x61,0x3e,0x92,0xe0,0x46, +0x16,0x80,0xbe,0x8f,0x15,0xfe,0xa6,0x8f,0xce,0x84,0xbe,0x8f,0xa6,0x8f,0xce,0x82, +0xbe,0x8f,0xa6,0x8f,0x3e,0xdb,0xbe,0x8f,0xa7,0xce,0x3f,0xdc,0xbf,0xce,0x17,0x0, +0xe0,0x0, 0x1f,0xab,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xa4,0x16,0xfb,0xa7,0x8f, +0xe4,0xc, 0x34,0x40,0xa7,0xf, 0xe2,0x1, 0xc6,0x7f,0x3f,0x5d,0xbf,0xf, 0xe0,0xd, +0x34,0x48,0x17,0xb, 0xaf,0x7f,0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc4,0x7f,0xa7,0xf, +0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x15,0xff,0x3f,0x5b, +0xbf,0xf, 0xae,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, +0xe7,0x7f,0x16,0x7f,0x3f,0x5c,0xbf,0xf, 0xae,0xff,0xa7,0xf, 0x37,0x4e,0xe2,0x0, +0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, 0xac,0x7f, +0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, 0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff, +0x3f,0x5d,0xbf,0xf, 0x17,0x0, 0xaf,0x7f,0xa7,0xf, 0x37,0x4e,0xe2,0x0, 0xc7,0x1, +0x27,0x7c,0xa7,0xf, 0xe7,0x7f,0x16,0xff,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0x0, 0x0, +0x8, 0xb3,0x39,0xea,0x39,0x69,0xdf,0xb1,0x21,0xa1,0xe0,0x2, 0x1f,0xa4,0xc1,0xff, +0xe3,0xff,0xc1,0xff,0x16,0xff,0xa7,0xf, 0x3e,0x92,0xe0,0xc, 0x39,0x13,0x15,0x0, +0xe7,0x7f,0x15,0xff,0xad,0x7e,0xa7,0x8e,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0xfc, +0xa7,0x8e,0x3f,0xdb,0xbf,0x8e,0x8f,0xfe,0xe0,0x80,0xaf,0x9d,0x3e,0xfc,0x1, 0xf3, +0xa7,0x8e,0x14,0x1, 0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0xe0,0x2, 0x1f,0xa4,0x14,0x1, +0xa7,0xf, 0xa7,0x8e,0xcf,0x84,0xbf,0x8e,0x9, 0xe1,0x8, 0xb2,0x14,0x1, 0xef,0xff, +0xd7,0x3b,0xe0,0x1, 0x14,0xc8,0x14,0x0, 0xe0,0x6, 0xd3,0xcf,0x24,0x14,0xe0,0x2, +0x1f,0x48,0x17,0x82,0xe0,0x0, 0x19,0x4d,0xaf,0x8e,0xe0,0x2, 0x1f,0x12,0xaf,0x82, +0x97,0x8e,0xe0,0x20,0xcf,0x80,0xb7,0x8e,0x8c,0x2, 0xef,0xff,0xd5,0x91,0x9, 0x21, +0xe7,0xed,0x0, 0xd1,0xe0,0x2, 0x1f,0xc8,0x17,0x1, 0xe0,0x0, 0x19,0x4d,0xaf,0xf, +0x3c,0xe8,0xaf,0x2, 0x8f,0x8f,0xe0,0x3, 0x1c,0x2c,0xe4,0x0, 0xc7,0x8e,0x3c,0x1f, +0xef,0xff,0xd2,0x3b,0x0, 0xea,0x8, 0xb2,0xe0,0x2, 0x19,0x40,0xe0,0x1, 0x8c,0xa2, +0xe0,0x4, 0x8f,0xd2,0x2f,0x95,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0xe0,0x0, 0x2f,0xcb, +0xe0,0x1, 0x8c,0x82,0x14,0x5, 0xe2,0x0, 0xcc,0x94,0x2, 0x98,0xe0,0x0, 0x14,0x64, +0x24,0x95,0xe0,0x0, 0x14,0x63,0x3c,0x19,0xe0,0x6, 0xda,0x4a,0x0, 0x8f,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x2f,0xa3,0xe0,0x1, 0x8f,0x92,0xe0,0x0, 0x14,0x7f,0xe0,0x43, +0x3f,0xf, 0xe2,0x0, 0xcf,0x0, 0xe0,0x68,0x3b,0x2f,0xe0,0x5, 0x8f,0xc2,0x14,0x98, +0x3c,0x3f,0xe0,0x6, 0xda,0x35,0xe0,0x0, 0x1f,0xb2,0xe0,0x3, 0x1f,0x16,0xac,0xf, +0x87,0x8f,0xaf,0x8e,0xe0,0x2, 0x1f,0x12,0x97,0x8e,0xe3,0xff,0xc7,0xf7,0xb7,0x8e, +0x17,0x0, 0xe0,0x2, 0x1f,0xc2,0xb7,0xf, 0x9, 0x61,0xe0,0x3, 0x1f,0xc6,0x8f,0x8f, +0xe2,0x0, 0xcf,0xb8,0x5, 0x87,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x17,0xe0,0x7, 0x14,0x68,0xe0,0x6, 0xda,0x13,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f, +0x0, 0xd5,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xf3,0xe0,0x3, +0x14,0x74,0xe0,0x6, 0xda,0x5, 0xc4,0x7e,0xe2,0x1, 0xc4,0x7f,0x0, 0xc7,0xe0,0x3, +0x14,0x74,0xe0,0x6, 0xd9,0xfd,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0xe7,0xff,0x0, 0xbf, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0xa0,0x8, 0xb4, +0xe0,0x2, 0x19,0x12,0x9f,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x27,0x96,0xe0,0x3, +0x1f,0x43,0x97,0x82,0x89,0x8e,0xe3,0xfe,0xc7,0xff,0xe2,0x0, 0xc9,0x81,0xb7,0x82, +0x1, 0x10,0x9f,0x82,0x37,0xce,0xe2,0x0, 0xc7,0x81,0x27,0x87,0x97,0x82,0x14,0x0, +0xe3,0x7f,0xc7,0xff,0xb7,0x82,0xa, 0x61,0x14,0x1, 0xa, 0x61,0x14,0x1, 0x38,0x82, +0x3c,0x63,0xef,0xff,0xd6,0x79,0xe0,0x1, 0x14,0xc8,0x3c,0x63,0xe0,0x6, 0xd3,0xd, +0xe0,0x0, 0x1a,0x4d,0x2c,0x5, 0x8c,0x4, 0xef,0xff,0xd4,0xda,0x0, 0xe3,0x97,0x82, +0xe0,0x2, 0x1f,0x48,0xe3,0xdf,0xc7,0xff,0xb7,0x82,0x3c,0xe3,0x97,0x82,0xe0,0x3, +0x1c,0x2c,0xe0,0x40,0xcf,0x80,0xb7,0x82,0xa9,0x8e,0xa9,0x84,0x8f,0x8e,0xe4,0x0, +0xc7,0x8e,0x3c,0x1f,0xef,0xff,0xd1,0x62,0x0, 0xe7,0x8, 0xb6,0xe0,0x0, 0x1f,0xbd, +0xe0,0x3, 0x19,0x36,0xa1,0x8f,0xa7,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0x99, +0xe0,0x2, 0x1b,0x12,0xe7,0xff,0x12,0x81,0xe0,0x1, 0x12,0x7f,0x0, 0x8c,0x9f,0x86, +0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xd4,0xbe,0xa7,0x83,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x27,0x87,0xaa,0x82,0xef,0xff,0xd6,0x5a,0x3c,0xe4,0x24,0x71,0xb, 0x61, +0xe0,0x1, 0x1f,0xdc,0xe7,0xef,0x16,0xff,0xa7,0x8f,0xe0,0x4, 0x14,0x89,0xe0,0x1, +0xa7,0x6f,0x14,0x2, 0xe0,0x10,0xcf,0x0, 0xe0,0x1, 0xbf,0x6f,0xe0,0x1, 0xa7,0x6f, +0x3f,0x5d,0xe0,0x1, 0xbf,0x6f,0xe7,0xff,0x17,0x81,0xaf,0x82,0xb, 0x21,0xe0,0x9, +0x0, 0x9b,0x0, 0x0, 0x8, 0xb2,0xe0,0x2, 0x19,0x12,0x9f,0x82,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x2f,0x8d,0x9f,0x82,0xe0,0xf, 0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x87, +0xdf,0xb5,0x9f,0x82,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x27,0xfb,0xef,0xff,0xd6,0x27, +0x24,0x3, 0x0, 0x85,0xdf,0xab,0xef,0xff,0xd6,0x22,0x24,0x7d,0x9, 0x61,0xe0,0x0, +0x1f,0xbd,0xa7,0x8f,0xa7,0x8f,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x94,0xe0,0x3, +0x1e,0xb6,0xe0,0x2, 0x1f,0xc, 0xe7,0xff,0x16,0x1, 0xae,0xd, 0x8e,0x8e,0xe2,0x0, +0xce,0x81,0x1, 0xa, 0xe0,0x2, 0x1f,0xc7,0x9f,0x8f,0x2f,0x8c,0x14,0x83,0x14,0x1, +0xe0,0x8, 0x0, 0xe2,0x38,0x82,0xe0,0x2, 0x1e,0xc7,0xe0,0x1f,0x16,0x20,0xb6,0xd, +0xaf,0x8e,0xe0,0x4, 0x14,0x81,0x14,0x2, 0xe0,0x8, 0x0, 0xd6,0x8, 0xb5,0xef,0xff, +0xd5,0xf6,0xe0,0x0, 0x24,0x4b,0x14,0x0, 0xd6,0xa, 0xe0,0x2, 0x1f,0x91,0xe7,0xdf, +0x17,0x7f,0xa1,0xf, 0xe0,0x2, 0x1a,0x96,0xa7,0x92,0xe0,0x2, 0x19,0x92,0x3f,0xde, +0xbf,0x92,0xe7,0xfb,0x17,0x7f,0xa7,0x92,0xe0,0x2, 0x1a,0x40,0x3f,0xde,0xbf,0x92, +0xe7,0xfd,0x17,0x7f,0xa7,0x92,0x3f,0xde,0xbf,0x92,0xe7,0xfe,0x17,0x7f,0xa7,0xa2, +0x3f,0xde,0xbf,0xa2,0x9f,0x83,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x8c,0xe0,0xa, +0x8f,0x84,0x27,0xa8,0x8f,0x85,0x2f,0xa6,0xdf,0xab,0x9f,0x83,0x37,0xc3,0xe2,0x0, +0xc7,0x81,0x27,0xf6,0x8f,0x85,0x27,0x84,0x8f,0x85,0xc7,0xff,0xaf,0x85,0x14,0x1, +0xa7,0x92,0xe0,0x20,0xcf,0x80,0xbf,0x92,0xa7,0x92,0xe0,0x4, 0xcf,0x80,0xbf,0x92, +0xa7,0x92,0xe0,0x2, 0xcf,0x80,0xbf,0x92,0xa7,0xa2,0xe0,0x1, 0xcf,0x80,0xbf,0xa2, +0xa, 0xa1,0xe0,0xb, 0x0, 0xc5,0xdf,0x32,0xef,0xff,0xd5,0xa9,0x24,0x7d,0xe7,0xff, +0x0, 0xb4,0xdf,0x2c,0x0, 0xd0,0x0, 0x0, 0x8, 0xb3,0x14,0x1, 0xef,0xff,0xd5,0x7c, +0xe0,0x0, 0x1f,0xbd,0xa7,0x8f,0xa1,0xf, 0x31,0x43,0xe2,0x0, 0xc1,0x1, 0x29,0x7c, +0x3c,0x62,0xd5,0xad,0xe0,0x2, 0x1f,0x91,0xe7,0xdf,0x17,0x7f,0xa1,0x8f,0x14,0x1, +0xa7,0x93,0x3c,0xe2,0x3f,0xde,0xbf,0x93,0xe7,0xfb,0x17,0x7f,0xa7,0x93,0x3f,0xde, +0xbf,0x93,0xe7,0xfd,0x17,0x7f,0xa7,0x93,0x3f,0xde,0xbf,0x93,0xe7,0xfe,0x17,0x7f, +0xa7,0xa3,0x3f,0xde,0xbf,0xa3,0xe7,0xff,0x17,0x1, 0xe0,0x3, 0x1f,0xb6,0xaf,0xf, +0xd3,0xd2,0xa7,0x93,0x14,0x1, 0xe0,0x20,0xcf,0x80,0xbf,0x93,0xa7,0x93,0xe0,0x4, +0xcf,0x80,0xbf,0x93,0xa7,0x93,0xe0,0x2, 0xcf,0x80,0xbf,0x93,0xa7,0xa3,0xe0,0x1, +0xcf,0x80,0xbf,0xa3,0x9, 0xa1,0xe0,0xa, 0x0, 0xfb,0x8, 0xb1,0xe0,0x1, 0x1f,0xc2, +0xe0,0x1a,0x17,0x20,0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa1,0x8c,0xf, 0x37,0x28, +0x3c,0x4e,0xe0,0x5, 0xd3,0x4c,0xe0,0x5, 0xd2,0xe8,0xe0,0x1, 0xd7,0xc0,0xe0,0x2, +0x1f,0x40,0x17,0x81,0xe0,0x4, 0xaf,0xfe,0xe0,0x1b,0x14,0x2c,0xe0,0x3, 0x1f,0x47, +0xaf,0x8e,0xe0,0x5, 0xd3,0x3c,0xe0,0x2, 0x1f,0xfd,0xe0,0x19,0x16,0x9d,0x17,0x7, +0x3e,0x9f,0xaf,0xd, 0xe0,0x19,0xc7,0x9e,0xaf,0xf, 0x8, 0xe1,0x8, 0xb2,0xe0,0x2, +0x1f,0xc0,0x17,0x0, 0xe0,0x0, 0x1e,0xb2,0xe0,0x4, 0xaf,0x5f,0xe0,0x3, 0x1f,0x16, +0x8f,0x8d,0x8e,0xe, 0x37,0xc1,0x3f,0xfc,0x3, 0x9d,0x8e,0x8d,0x8f,0x8e,0x36,0xc1, +0x3f,0xad,0xe0,0x2, 0x19,0x12,0xaf,0x8e,0x17,0x0, 0xe0,0x2, 0x1f,0xec,0xb7,0xf, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x85,0x97,0x82, +0xe0,0x1, 0xcf,0x80,0xb7,0x82,0x9f,0x82,0x37,0xc7,0xe2,0x0, 0xc7,0x81,0x2f,0x88, +0x9, 0x61,0xe0,0x2, 0x19,0x12,0x97,0x82,0xcf,0x88,0xb7,0x82,0x0, 0xe6,0xd5,0x41, +0x97,0x82,0xcf,0x88,0xb7,0x82,0x97,0x82,0xe0,0x80,0xcf,0x80,0xb7,0x82,0x9, 0x61, +0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f,0x27,0x86,0xe0,0x2, 0x1f,0x87,0x8f,0x8f, +0x27,0x89,0x38,0x82,0x8, 0xb1,0xdf,0xbb,0xe0,0x2, 0x1f,0xeb,0x17,0x2, 0xaf,0xf, +0x8, 0xe1,0xe7,0xff,0x0, 0xb5,0x8, 0xb1,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x22, +0x3f,0x1f,0x8f,0xe, 0xe0,0x1a,0xc7,0xa3,0x8c,0xf, 0x37,0x28,0x3c,0x4e,0xe0,0x5, +0xd2,0xd6,0xdf,0x3b,0xdf,0x7b,0xdf,0xa3,0xde,0x14,0x8, 0xa1,0xe7,0xe8,0x0, 0xe3, +0x8, 0xb4,0xe0,0x2, 0x1f,0xba,0x12,0x3c,0x8f,0x8f,0x27,0x8a,0xe0,0x3, 0x1f,0xc3, +0x8f,0x8f,0xe2,0x0, 0xcf,0x80,0x17,0xb9,0xe0,0x6f,0x39,0x24,0x3a,0x6f,0xe0,0x2, +0x19,0x40,0xe0,0x3, 0x19,0x82,0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0x1, 0x1b, +0x8f,0x3, 0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81,0x1, 0x2, 0xa, 0x61,0xe0,0x0, +0x1f,0xcd,0x8f,0x8f,0x27,0xfc,0x3a,0x7e,0x1, 0x23,0x17,0x81,0x3f,0x9e,0xe2,0x1, +0xc7,0xff,0xe0,0x3, 0x1e,0xc6,0xe2,0x0, 0xcf,0xbc,0xaf,0xd, 0x5, 0x82,0x17,0x80, +0xaf,0x83,0xa, 0x61,0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0x27,0xe3,0x8f,0x3, 0x2f,0x62, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0xdb,0xe0,0x3, +0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xd5,0xdd,0x30,0x0, 0xd2,0xe0,0x3, +0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x2, 0x1f,0x12, +0x97,0x8e,0xe0,0x1, 0xcf,0x80,0xb7,0x8e,0xdd,0xbc,0xef,0xff,0xd4,0xc, 0x8f,0x3, +0x0, 0xcd,0x8, 0xb4,0xe0,0x2, 0x1f,0xe0,0xe0,0x2, 0x19,0x40,0x8f,0xf, 0x27,0xd, +0x17,0x0, 0xe0,0x4, 0x8e,0xd2,0xaf,0xf, 0xe0,0x0, 0x26,0xce,0xe0,0x4, 0x8f,0xd2, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x3, 0xe0,0x4, 0x8f,0xd2,0xe2,0x0, 0xcf,0x81, +0x1, 0x3b,0x4, 0x8b,0xe2,0x0, 0xcf,0x83,0x1, 0x84,0xa, 0x21,0xe7,0xfe,0x0, 0xf5, +0x17,0x81,0xe0,0x4, 0xaf,0xd2,0xa, 0x61,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x27,0xb6, +0xe0,0x2, 0x1e,0xec,0x17,0x0, 0xb7,0xd, 0x8f,0xe2,0xe2,0x0, 0xc7,0x81,0x27,0xf4, +0xe0,0xa, 0x8f,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0xef,0xe0,0x2, 0x1f,0x87,0x8e,0xf, +0xe2,0x0, 0xce,0x1, 0x1, 0xe9,0xe0,0x4, 0xae,0x52,0xe0,0x3, 0x1d,0x16,0xe0,0x0, +0x1e,0x32,0xe0,0x2, 0x1d,0xf7,0x8e,0xc, 0x8c,0x8a,0xaf,0xf, 0x3e,0x19,0xae,0xa, +0xb7,0xd, 0xe0,0x3, 0x1f,0x82,0x8e,0x8b,0xaf,0xf, 0xce,0x84,0xe0,0x3, 0x1f,0xc6, +0xae,0x8b,0xaf,0xf, 0xa, 0x61,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x27,0xcd,0xa, 0x21, +0xe7,0xfe,0x0, 0xa8,0xde,0xec,0xe7,0xff,0x0, 0xb9,0x8f,0xe2,0xe2,0x0, 0xc7,0x81, +0x27,0xc3,0xe0,0x2, 0x19,0xec,0xe0,0x7, 0x14,0xe8,0x9c,0x3, 0x8a,0x72,0xe0,0x6, +0xd7,0x8a,0xe3,0xff,0xc4,0x7f,0x3c,0x74,0x3, 0x8c,0xe0,0xa, 0x8f,0x82,0xe2,0x0, +0xcf,0x81,0xe7,0xff,0x1, 0xb2,0x9f,0x83,0xe2,0x7, 0xcf,0xe7,0xe7,0xff,0x5, 0xad, +0x17,0x81,0xe0,0x4, 0xaf,0xd2,0x16,0x0, 0xe0,0x3, 0x1e,0x96,0xe0,0x0, 0x1f,0xb2, +0xe0,0x2, 0x1f,0x77,0x8f,0x8f,0x8d,0x8d,0x3f,0x9b,0xe0,0x2, 0x1d,0x87,0xaf,0x8d, +0x16,0x80,0xb6,0x3, 0xae,0x8b,0xe0,0x3, 0x1d,0x82,0x8f,0x8e,0xae,0xb, 0xcf,0x84, +0xe0,0x3, 0x1e,0x46,0xaf,0x8e,0xae,0x8c,0xa, 0x61,0xe0,0x4, 0xaf,0xd2,0x16,0x0, +0xe0,0x3, 0x1e,0x96,0xe0,0x0, 0x1f,0xb2,0x8f,0x8f,0x8d,0x8d,0x3f,0x9b,0xaf,0x8d, +0xe0,0x2, 0x1d,0x87,0xe0,0x2, 0x1f,0xec,0xe0,0x2, 0x1e,0xf7,0xb6,0xf, 0xaf,0xb, +0xe0,0x3, 0x1d,0x82,0x8f,0x8d,0xae,0xb, 0xcf,0x84,0xe0,0x3, 0x1e,0x46,0xaf,0x8d, +0xaf,0xc, 0xe7,0xfe,0x0, 0xe3,0x8, 0xb1,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x2f,0x8d, +0xe0,0x0, 0x1f,0xcd,0x8f,0x8f,0x27,0x85,0xdd,0x86,0x8, 0xa1,0xe7,0xfd,0x0, 0xea, +0xdd,0xc6,0x8, 0xa1,0xe7,0xfd,0x0, 0xe6,0xdf,0x3d,0x0, 0xf3,0xe0,0x3, 0x1f,0x2d, +0xe0,0x2, 0x1e,0x92,0x0, 0x86,0x9f,0x8d,0x37,0xc3,0xe2,0x0, 0xc7,0x81,0x2f,0x83, +0x9f,0x8e,0x2f,0xfa,0x17,0x87,0xb7,0x8e,0x38,0x82,0x0, 0x0, 0xe0,0x0, 0x1f,0xcd, +0x8f,0x8f,0x2f,0x9f,0x8, 0xb2,0xe0,0x2, 0x19,0x39,0x9f,0x82,0x2f,0xff,0xdc,0x6c, +0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0x5f,0xe2,0x0, 0xcf,0x1, 0x1, 0x13,0xe0,0x1, +0x8c,0x8f,0xe0,0x0, 0x14,0x64,0xe0,0x6, 0xd6,0xc3,0xc4,0x7f,0xb4,0x2, 0xe0,0x2, +0x1f,0xb2,0x9e,0x82,0x9f,0xf, 0x3e,0xfe,0x5, 0x83,0x97,0x8f,0xb7,0x82,0x9, 0x61, +0x38,0x82,0xe0,0x1, 0x8f,0x9f,0xc7,0xff,0xb7,0x82,0x0, 0xf2,0xe0,0x2, 0x1f,0x91, +0xe7,0x7f,0x16,0xff,0xa7,0x8f,0xe2,0x0, 0xcc,0x7, 0xa7,0x1f,0xe1,0x0, 0xcf,0x0, +0xbf,0x1f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0xe7,0xdf,0x16,0xff,0xa7,0x2f,0x3f,0x5d, +0xbf,0x2f,0xe7,0xbf,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x2, 0x88,0xa7,0x2f, +0x16,0xf8,0xe2,0x0, 0xc4,0x7, 0x3f,0x5d,0x3c,0x4e,0xbc,0x2f,0x38,0x82,0xe0,0x2, +0x1f,0xe4,0x16,0xdf,0xa7,0xf, 0x15,0xfe,0xa7,0xbe,0x3f,0xdd,0xbf,0xbe,0xe7,0xfe, +0x16,0xff,0xa6,0x3e,0xe0,0x0, 0x1f,0xbd,0x3e,0x5d,0xa7,0x8f,0xbe,0x3e,0x17,0x0, +0xaf,0x7f,0x16,0xfd,0xa6,0xf, 0xe0,0x1, 0x1f,0x5c,0x3e,0x5b,0xbe,0xf, 0xa6,0xf, +0xa7,0xe, 0x3e,0x5d,0xbe,0xf, 0xa6,0xbf,0x3e,0xdb,0xbe,0xbf,0x16,0xfc,0xa7,0x8e, +0x3f,0xdd,0xbf,0x8e,0x17,0x80,0xe0,0x3, 0xb7,0x9e,0x17,0x80,0xe0,0x61,0x3f,0x92, +0xe1,0xff,0x17,0xff,0xe0,0x61,0x3f,0x91,0x38,0x82,0xe0,0x2, 0x1f,0xe4,0xe0,0x0, +0x1f,0x3d,0xa6,0x8f,0x16,0x7e,0xa7,0xbd,0xa7,0xe, 0x3f,0xdc,0xbf,0xbd,0xe7,0xff, +0x16,0xbf,0xa7,0x8e,0x3f,0xdd,0xbf,0x8e,0xe0,0x61,0x3f,0x82,0xcf,0x81,0xe0,0x61, +0x3f,0x92,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xe0,0x1, 0x1f,0x5c,0xa6,0x8f,0x16,0x6f, +0xa7,0x9d,0xa7,0xe, 0x3f,0xdc,0xbf,0x9d,0xe0,0x1, 0xa7,0xee,0xe0,0x20,0xcf,0x80, +0xe0,0x1, 0xbf,0xee,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xe0,0x2, 0x1f,0xe4, +0xa7,0x1d,0xa7,0x8f,0xcf,0x8, 0xbf,0x1d,0xe7,0xff,0x16,0xbf,0xa7,0x3f,0x3f,0x5d, +0xbf,0x3f,0xa7,0x2f,0xe2,0x1, 0xc7,0x4f,0xcf,0x20,0xbf,0x2f,0xe0,0x2, 0x17,0x0, +0xb7,0x3f,0xa7,0x3f,0xcf,0x40,0xbf,0x3f,0xe0,0x61,0x3f,0x82,0xe0,0x40,0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0x8, 0xb2,0xe0,0x1, 0x1f,0x5c,0x17,0xff,0xa1,0xe, +0xb7,0xd2,0xe0,0x1, 0xb7,0xd2,0xe0,0x6, 0xd5,0x11,0xe0,0x2, 0x1f,0xe6,0xe0,0x41, +0x3f,0x8, 0xac,0xf, 0xe7,0xfb,0x16,0xff,0xa7,0x82,0xe2,0x0, 0xc7,0x1, 0x37,0x29, +0x3f,0xdd,0x3f,0xce,0xbf,0x82,0xe0,0x1, 0x17,0xc3,0xb7,0xb2,0xda,0xa6,0xa7,0xb2, +0x16,0xef,0xcf,0x84,0xbf,0xb2,0x17,0xfb,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0x17,0xf7, +0xa7,0x32,0xcf,0x8, 0xbf,0x32,0xa7,0x12,0x3f,0x5f,0xbf,0x12,0xa7,0x32,0xcf,0x10, +0xbf,0x32,0xa7,0x12,0x3f,0x5d,0xbf,0x12,0xa7,0xc2,0x3f,0xdd,0xbf,0xc2,0x9, 0x61, +0xe0,0x2, 0x1f,0x90,0xe7,0xff,0x16,0xbf,0xa7,0x8f,0xa7,0x1f,0xcf,0x1, 0xbf,0x1f, +0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0xe7,0xfe,0x16,0xff,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0x17,0x2f,0xbf,0x2f,0xa7,0x1f,0xcf,0x2, 0xbf,0x1f,0xa7,0x3f,0xcf,0x10,0xbf,0x3f, +0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0xe0,0x61,0x3f,0x82,0xe7,0xf7,0x17,0x7f,0x3f,0xde, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x2, 0x1f,0x90,0xa7,0x8f,0xa7,0x2f,0x27,0x7, +0xa7,0x3f,0xcf,0x10,0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x38,0x82,0xe0,0x2, +0x1f,0x91,0xe0,0x0, 0x1e,0x40,0xa7,0xf, 0xe7,0xfe,0x15,0x7f,0xa7,0xbe,0xe0,0x0, +0x1d,0xc2,0xcf,0x81,0xbf,0xbe,0xa6,0x8e,0xe0,0x3, 0x1f,0x81,0xce,0x82,0xbe,0x8e, +0x16,0xa0,0xb6,0x8c,0xa6,0x9e,0xa7,0x8f,0x3e,0xda,0xbe,0x9e,0xa6,0x9e,0xa5,0x8b, +0xe0,0x8, 0xce,0x80,0xbe,0x9e,0x16,0xf7,0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, +0xcf,0x8, 0xbf,0xf, 0xa7,0xb, 0x3f,0x5d,0xbf,0xb, 0x17,0x0, 0xe0,0x1, 0xaf,0x3f, +0x96,0xc, 0xb6,0x3f,0xe0,0x61,0x3f,0x2, 0xe0,0x2, 0xcf,0x0, 0xe0,0x61,0x3f,0x12, +0xa7,0xf, 0xcf,0x1, 0xbf,0xf, 0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0x38,0x82, +0xe0,0x3, 0x1f,0x4b,0xe2,0xff,0x17,0xf0,0xbf,0xf, 0xe2,0xff,0x17,0xf4,0xe0,0x3, +0x1f,0x4c,0xbf,0xf, 0xe2,0xff,0x17,0xf8,0xe0,0x3, 0x1f,0x4d,0xbf,0xf, 0xe2,0xff, +0x17,0xfc,0xe0,0x3, 0x1f,0x4e,0xbf,0xf, 0x38,0x82,0xe0,0x1, 0x1f,0xdc,0x16,0x80, +0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf,0xe0,0x2, 0x16,0x84,0xbf,0xd, 0xe0,0x2, +0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0xe0,0x0, 0x16,0xeb,0xa7,0x8f,0x17,0x0, 0xe0,0x3, 0xb6,0xbf,0xe0,0x2, 0x16,0x84, +0xbf,0xd, 0xe0,0x2, 0x16,0x88,0xbf,0xd, 0x17,0x7f,0xe0,0x7, 0xaf,0x3f,0x38,0x82, +0xc4,0x7f,0xe1,0xff,0x17,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7e,0x1, 0xc, 0x17,0x88, +0x0, 0x0, 0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc4,0x7f,0xe3,0xff,0xc4,0x7f, +0x3c,0x7e,0x1, 0xf6,0x38,0x82,0x0, 0x0, 0xc4,0x7f,0xe1,0xff,0x16,0x7f,0xe3,0xff, +0xc4,0x7f,0x3c,0x7c,0x1, 0x17,0x16,0x84,0xe0,0x1, 0x17,0x7a,0x17,0x88,0x0, 0x0, +0xc7,0xff,0xe2,0x1, 0xc7,0xff,0x2f,0xfc,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0x2f,0x77, +0xc6,0xff,0xe2,0x1, 0xc6,0xff,0x2e,0xf1,0xc4,0x7f,0xe3,0xff,0xc4,0x7f,0x3c,0x7c, +0x1, 0xeb,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0xf, 0xa7,0xce,0xe2,0x0, 0xc7,0x81, +0x27,0x98,0xe0,0x2, 0x1f,0x91,0xe7,0xff,0x16,0x3f,0xa7,0x8f,0xa6,0xdf,0xe0,0x1, +0xce,0x80,0xbe,0xdf,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a,0xe2,0x0, +0xc7,0x1, 0x2f,0x1e,0xa7,0x5f,0xe6,0xff,0x16,0xff,0x3f,0x5d,0xbf,0x5f,0x38,0x82, +0xa7,0xce,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0x98,0xe0,0x2, 0x1f,0x91,0xe7,0xff, +0x16,0x3f,0xa7,0x8f,0xa6,0xdf,0x3e,0xdc,0xbe,0xdf,0xe7,0xfe,0x16,0x7f,0xa6,0xdf, +0x3e,0xdc,0xbe,0xdf,0xa7,0x4e,0x37,0x4a,0xe2,0x0, 0xc7,0x1, 0x27,0x64,0xa7,0x5f, +0xe1,0x0, 0xcf,0x0, 0xbf,0x5f,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xa7,0x8f,0xa6,0xdf, +0xce,0xc0,0x0, 0xeb,0x8, 0xb4,0xe0,0x3, 0x19,0x36,0x8f,0x82,0xe2,0x1, 0xcf,0x81, +0x1, 0x4, 0x17,0x80,0xaf,0x82,0xa, 0x61,0x24,0x2b,0xe2,0x0, 0xcc,0x1, 0x39,0xe9, +0x1, 0x30,0xe2,0x0, 0xcc,0x2, 0x1, 0xf6,0x3f,0x83,0xdf,0xad,0xe0,0x2, 0x1f,0x91, +0xe0,0x3, 0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0x21,0x84,0xa4,0xef,0x3c,0xc3, +0xbc,0xef,0xe0,0x0, 0x1f,0x3d,0xa7,0xe, 0xa7,0xe, 0x37,0x43,0xe2,0x0, 0xc7,0x1, +0x2f,0xe, 0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,0x80,0xaf,0x82,0xa, 0x61, +0x3f,0x83,0x17,0x82,0x3f,0xd9,0x2f,0xae,0xdf,0x7e,0xe0,0x2, 0x1f,0x91,0xe0,0x3, +0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xe0,0x0, 0x1f,0x3d,0xa2,0xe, 0x29,0xb0, +0xa7,0x3f,0xe7,0xfe,0x16,0xff,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, +0xa7,0x3f,0xcf,0x1, 0xbf,0x3f,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x3b,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa7,0x84,0x37,0xc5,0xe2,0x0, +0xc7,0x81,0xe7,0xff,0x27,0xa0,0xa7,0x84,0x17,0x5f,0x3f,0xde,0xbf,0x84,0xe7,0xff, +0x0, 0x9a,0xe0,0x0, 0x1f,0xbd,0xa2,0xf, 0xa7,0x84,0xcf,0xa0,0xbf,0x84,0xdf,0x4b, +0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x18,0xa7,0x8f,0x9f,0xe, 0xbf,0x6f,0xa4,0xef, +0x3c,0xc3,0xbc,0xef,0x0, 0xce,0x8, 0xb1,0xe0,0x1, 0x1f,0xdc,0x17,0x0, 0xa6,0x8f, +0xe0,0x2, 0x1f,0x91,0xe0,0x2, 0xbf,0xd, 0x16,0x6f,0xa7,0x8f,0xbf,0x6f,0xa6,0xdf, +0xe0,0x80,0xce,0x80,0xbe,0xdf,0xa6,0xdf,0xe0,0x40,0xce,0x80,0xbe,0xdf,0xa6,0xdf, +0xe0,0x20,0xce,0x80,0xbe,0xdf,0xa6,0xef,0xce,0xc0,0xbe,0xef,0xa6,0xef,0xce,0xa0, +0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0x7f,0x16,0x7f,0xa6,0xef,0xe1,0x0, +0xce,0x80,0xbe,0xef,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xe7,0xbf,0x16,0x7f,0xa6,0xef, +0x3e,0xdc,0xbe,0xef,0xe7,0xdf,0x16,0x7f,0xa6,0xef,0x3e,0xdc,0xbe,0xef,0xa6,0xef, +0xe0,0x10,0xce,0x80,0xbe,0xef,0xe0,0x3, 0x1f,0x98,0xb7,0xf, 0xdf,0x4, 0xe0,0x61, +0x3f,0x82,0x17,0x7d,0x3f,0xde,0xe0,0x61,0x3f,0x92,0xe0,0x61,0x3f,0x82,0x17,0x7b, +0x3f,0xde,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0xe0,0x1, 0x1f,0xdc,0xe2,0x0, 0xcc,0x2, +0xa7,0x8f,0xe0,0x0, 0x1, 0x57,0xe2,0x0, 0xcc,0x3, 0x1, 0x36,0xe2,0x0, 0xcc,0x1, +0x1, 0x19,0xa6,0x8f,0xe0,0x2, 0x1f,0x11,0x16,0x7b,0xa7,0xe, 0x3e,0xdc,0xbe,0x8f, +0xe6,0xff,0x16,0x7f,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0x16,0x78,0xa6,0xce,0x3e,0xdc, +0xbe,0xce,0x16,0xf7,0xa7,0xf, 0x3f,0x5d,0xbf,0xf, 0x16,0x80,0xe0,0x1, 0xbe,0xbf, +0x38,0x82,0xa7,0xf, 0x16,0x77,0x3f,0x5c,0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f, +0x16,0x78,0xa7,0xf, 0xe0,0x2, 0x1e,0x91,0xcf,0x4, 0xa6,0x8d,0xbf,0xf, 0xa7,0x4d, +0xe1,0x0, 0xcf,0x0, 0xbf,0x4d,0xa7,0x4d,0x3f,0x5c,0xcf,0x1, 0xbf,0x4d,0xa7,0x1f, +0xcf,0x8, 0xbf,0x1f,0x38,0x82,0xa7,0xf, 0xe0,0x2, 0x1e,0x91,0x16,0x7b,0x3f,0x5c, +0xa6,0x8d,0xbf,0xf, 0xe6,0xff,0x16,0x7f,0xa7,0x4d,0x3f,0x5c,0xbf,0x4d,0xa7,0xf, +0xcf,0x8, 0xbf,0xf, 0x17,0x0, 0xe0,0x1, 0xbf,0x3f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, +0xbf,0x1f,0xa7,0x1f,0xcf,0x10,0xbf,0x1f,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f,0x38,0x82, +0xa6,0x8f,0x16,0x77,0x3e,0xdc,0xbe,0x8f,0x16,0x80,0xe0,0x1, 0xbe,0xbf,0x16,0x78, +0xa6,0x8f,0xe0,0x2, 0x1f,0x11,0xce,0x84,0xa7,0xe, 0xbe,0x8f,0xa6,0xce,0xe1,0x0, +0xce,0x80,0xbe,0xce,0xa6,0xce,0x3e,0xdc,0xbe,0xce,0xa7,0x1f,0xcf,0x8, 0xbf,0x1f, +0x38,0x82,0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0xa1,0x8f,0xe0,0x1, 0x1f,0xdc,0xa1,0xf, +0xa7,0xb3,0xcf,0x81,0xbf,0xb3,0xa7,0x83,0xcf,0x88,0xbf,0x83,0xe0,0x1, 0xa7,0x92, +0xcf,0x82,0xe0,0x1, 0xbf,0x92,0xe0,0x1, 0xa7,0x92,0xcf,0x81,0xe0,0x1, 0xbf,0x92, +0xe0,0x3, 0x1f,0x8d,0x8c,0xf, 0xdf,0x71,0xa7,0xd3,0x17,0x7d,0xcf,0x81,0xbf,0xd3, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x7b,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x77, +0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0x17,0x6f,0xa7,0xd3,0x3f,0xde,0xbf,0xd3,0xe6,0xff, +0x17,0x7f,0xa7,0xd3,0xcf,0xa0,0xbf,0xd3,0xe0,0x1, 0xa7,0xa2,0x3f,0xde,0xe0,0x1, +0xbf,0xa2,0x17,0x78,0xe0,0x1, 0xa7,0xa2,0xe0,0x60,0xcf,0x80,0xe0,0x1, 0xbf,0xa2, +0xe0,0x1, 0xa7,0xa2,0xcf,0x88,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0x3f,0xde, +0xcf,0x85,0xe0,0x1, 0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x2, 0xcf,0x80,0xe0,0x1, +0xbf,0xa2,0xe0,0x1, 0xa7,0xa2,0xe0,0x4, 0xcf,0x80,0xe0,0x1, 0xbf,0xa2,0x9, 0xe1, +0xe0,0x2, 0x1f,0x91,0xe7,0xfd,0x16,0xff,0xa7,0x8f,0xa7,0x1f,0xe0,0x20,0xcf,0x0, +0xbf,0x1f,0xa7,0x1f,0xe0,0x2, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f, +0xe7,0xff,0x16,0xbf,0xa7,0x1f,0xe0,0x4, 0xcf,0x0, 0xbf,0x1f,0xa7,0x2f,0xe0,0x1, +0xcf,0x0, 0xbf,0x2f,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x16,0xef,0xa7,0x2f,0x3f,0x5d, +0xbf,0x2f,0x16,0xf7,0xa7,0x2f,0x3f,0x5d,0xbf,0x2f,0x38,0x82,0xe0,0x1, 0x1f,0xdc, +0x17,0x1, 0xa7,0x8f,0x3f,0x58,0xe0,0x1, 0xa6,0xaf,0x15,0xf7,0xe0,0xc, 0x37,0x23, +0x3e,0xdb,0x3e,0xcc,0xe0,0x1, 0xbe,0xaf,0xe7,0xfd,0x15,0xff,0xe0,0x1, 0xa6,0xaf, +0xe0,0xc, 0x37,0x28,0x3e,0xdb,0x3e,0xcc,0xe0,0x1, 0xbe,0xaf,0xe7,0xfb,0x16,0xff, +0xe0,0x1, 0xa4,0x2f,0x37,0x29,0x3c,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x2f,0x38,0x82, +0x8, 0xb1,0xe0,0x5, 0xdc,0x73,0x24,0x6, 0xe0,0x2, 0x1f,0x14,0x97,0xce,0xcf,0x82, +0xb7,0xce,0xe0,0x2, 0x1f,0xb3,0x8f,0x8f,0x27,0x82,0x8, 0xe1,0x8, 0xa1,0xe7,0xe0, +0x0, 0x95,0xe0,0x2, 0x1e,0x92,0xe0,0x2, 0x1f,0x14,0x97,0x8d,0xcf,0x81,0xb7,0x8d, +0x97,0xce,0xcf,0x84,0xb7,0xce,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, +0xc7,0x81,0x2f,0x82,0x38,0x82,0x0, 0xdd,0xe0,0x2, 0x1f,0x12,0xe0,0x2, 0x1e,0x94, +0x97,0x8e,0xcf,0x81,0xb7,0x8e,0x97,0x4d,0xe0,0x3, 0x1f,0xb8,0xcf,0x4, 0xa7,0x8f, +0xb7,0x4d,0xa7,0x5f,0xcf,0x8, 0xbf,0x5f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x82, +0x38,0x82,0x0, 0xc7,0xe0,0x61,0x3f,0x82,0xe0,0x61,0x3f,0x2, 0xe7,0xfe,0x16,0xff, +0x3f,0x5d,0xe0,0x61,0x3f,0x12,0xe0,0x3, 0x1f,0x38,0x16,0x7e,0xa7,0xe, 0xe2,0x0, +0xc4,0x1, 0xa6,0xbe,0x15,0xfd,0x3e,0xdc,0x3e,0xc8,0xbe,0xbe,0xe0,0xc, 0x34,0x21, +0xa6,0xbe,0x34,0x2a,0x3e,0xdb,0x3e,0xcc,0xbe,0xbe,0xe7,0xf7,0x16,0x7f,0xa6,0xbe, +0x37,0xc7,0x3e,0xdc,0x3c,0x4d,0xbc,0x3e,0xe2,0x0, 0xc7,0x81,0x27,0x87,0xe0,0x61, +0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0x8, 0xb1,0xe0,0x1, +0x1f,0xdc,0xe7,0x7f,0x16,0xff,0xa7,0xf, 0xe7,0xfb,0x16,0x7f,0xa7,0x8e,0xe7,0xe0, +0x14,0x80,0x3f,0xdd,0xbf,0x8e,0xf0,0x1a,0x13,0x98,0xe0,0x1, 0xa6,0xee,0xe0,0x3, +0x1f,0xb8,0xe0,0x4, 0xce,0x80,0xe0,0x1, 0xbe,0xee,0xe0,0x1a,0x15,0x19,0xe0,0x1, +0xa6,0xee,0xa7,0x8f,0x3e,0xdc,0xe0,0x1, 0xbe,0xee,0x16,0x81,0xbe,0xdf,0xe7,0xf8, +0x16,0x0, 0xa6,0xef,0x17,0x0, 0xe3,0xfe,0xc6,0x9f,0xbe,0xef,0xe7,0x80,0x14,0x0, +0xa6,0xef,0xe0,0x1, 0x1d,0xc2,0xbe,0xef,0xf0,0x17,0x3b,0x9b,0xe0,0x1, 0xa6,0xdf, +0x3d,0x1b,0xe3,0xff,0xc6,0x80,0xe0,0x1, 0xbe,0xdf,0xe0,0x1, 0xa6,0xdf,0xe0,0x1, +0xbe,0xdf,0xe0,0x3, 0x16,0xe0,0xe0,0x1, 0xbe,0xef,0xe0,0x1, 0xa6,0xff,0x3e,0xdc, +0xe0,0x1, 0xbe,0xff,0xe7,0xf0,0x16,0x0, 0xe0,0x2, 0xa6,0x8f,0x3e,0xd9,0xe0,0x2, +0xbe,0x8f,0xe0,0x2, 0xa6,0x9f,0x3e,0xd9,0xe0,0x2, 0xbe,0x9f,0xe0,0x17,0x16,0xb8, +0xe0,0x4, 0xb6,0xdf,0xe0,0x2, 0xa6,0xcf,0x3e,0xdc,0xe0,0x2, 0xbe,0xcf,0xe0,0x9, +0x16,0x88,0xe0,0x2, 0xbe,0xbf,0xe0,0x12,0x16,0xdc,0xe0,0x2, 0xbe,0xdf,0xe1,0x20, +0x16,0x80,0xe0,0x2, 0xbf,0x6f,0xe0,0x2, 0xbe,0xff,0xe0,0x3, 0xa5,0xef,0x3d,0xd8, +0xcd,0xe4,0xe0,0x3, 0xbd,0xef,0xe0,0x3, 0xa6,0x7f,0x3e,0x58,0xce,0x64,0xe0,0x3, +0xbe,0x7f,0xe0,0x4, 0xa6,0x8f,0x3e,0xd9,0xe0,0x7, 0xce,0xe8,0xe0,0x4, 0xbe,0x8f, +0xe1,0xff,0x16,0xff,0xe0,0x4, 0xbf,0x1f,0xbe,0x9f,0xe1,0x39,0x16,0x83,0xbf,0x3f, +0xbe,0xbf,0xe0,0x2, 0x1e,0x92,0xb7,0xd, 0xa6,0xbf,0xbe,0xaf,0xe0,0x3, 0x1f,0x9d, +0xe8,0x0, 0x86,0x87,0xb7,0xf, 0xe0,0x2, 0x1f,0xba,0x87,0xa, 0xae,0x8f,0xe0,0x3, +0x1f,0xc3,0xaf,0xf, 0xef,0xfe,0xda,0x2f,0xe0,0x5, 0xda,0x42,0xe0,0x61,0x3f,0x82, +0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x8, 0xe1,0x8, 0xb1,0xf0,0x3, 0x18,0xb8, +0xe7,0xbf,0x16,0x7f,0xe8,0x0, 0xa7,0x1, 0xe0,0x2, 0x1e,0xfd,0xe0,0x1, 0xa7,0xee, +0xf0,0x3, 0x19,0xcf,0x3f,0xdc,0xe0,0x1, 0xbf,0xee,0xfa,0xd7,0xca,0xa8,0xe0,0x2, +0x1f,0xe6,0xe0,0x1, 0x9d,0x2d,0x85,0x8f,0xe0,0x1, 0x1f,0xc2,0xe0,0x1, 0x9e,0x1d, +0xf0,0x10,0x89,0x7f,0xe0,0x0, 0x1f,0xc4,0xe0,0x3, 0x1e,0xd0,0xe4,0xa, 0x35,0x20, +0xe4,0xc, 0x36,0x20,0xa7,0x8f,0xf0,0x3, 0x1b,0xd1,0xe0,0x3, 0x1c,0x52,0xe0,0x3, +0x1c,0xd3,0xe0,0x3, 0x18,0xd4,0xf0,0x3, 0x18,0x55,0xf0,0x3, 0x1a,0x56,0x17,0x0, +0xe2,0x0, 0xc5,0x81,0x3d,0x4d,0x3e,0x4d,0xf0,0xa9,0x13,0x15,0xe8,0x40,0x3d,0xf2, +0xf0,0x0, 0xb9,0x8f,0x1, 0x24,0xbe,0x1f,0x16,0xfd,0x3e,0x9e,0xe2,0x1, 0xc6,0xff, +0xf0,0x0, 0xba,0xaf,0xe2,0x0, 0xce,0x81,0xf0,0x0, 0xbb,0x3f,0x5, 0x9a,0xbc,0x4f, +0xbc,0xdf,0xf0,0x0, 0xbb,0xef,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x5, +0xf0,0x0, 0xba,0x7f,0xe0,0x7, 0xc7,0xb0,0x1, 0xe2,0xe8,0x0, 0xa7,0x1, 0xe0,0x1, +0xa7,0xee,0xe0,0x40,0xcf,0x80,0xe0,0x1, 0xbf,0xee,0x8, 0xe1,0xbd,0x1f,0x0, 0xdd, +0xb8,0xcf,0xe2,0x0, 0xcf,0x4, 0xf0,0x0, 0xb8,0x5f,0xf0,0x0, 0xbb,0xef,0x1, 0xe4, +0xe0,0x3, 0x1f,0x57,0xbf,0x7f,0x0, 0xea,0x8, 0xb2,0xe0,0x2, 0x19,0x3d,0x8f,0x82, +0x27,0x8d,0xe0,0x0, 0x14,0xda,0x14,0x11,0xe0,0x5, 0xdb,0x3a,0xe0,0x0, 0x14,0xda, +0x14,0x29,0xe0,0x5, 0xdb,0x35,0x17,0x80,0xaf,0x82,0x9, 0x61,0xe0,0x2, 0x1f,0xec, +0x17,0x0, 0xb7,0xf, 0xe0,0x2, 0x1f,0x99,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x19, +0x87,0x8e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xcf,0xc8,0x5, 0x82,0x17,0xc8, +0xaf,0x8e,0x38,0x82,0xe0,0x0, 0x1f,0xcd,0x14,0x1, 0x8f,0x8f,0x2f,0x89,0xe0,0x2, +0x1f,0x99,0x8c,0xf, 0xe0,0x3, 0x1f,0x92,0x8f,0x8f,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0x8, 0xb1,0x3c,0x98,0x34,0xa4,0xe1,0x77,0x14,0x0, 0xe0,0x6, 0xd1,0x49,0xe3,0xff, +0xc4,0x7f,0x8, 0xe1,0xea,0x0, 0xcc,0x2, 0xe0,0x48,0xcc,0x0, 0x14,0x80,0xea,0x0, +0xcd,0x3, 0xe0,0x22,0xcd,0x7c,0x3d,0x28,0xe0,0x6, 0xd1,0xd6,0xea,0x0, 0xcc,0x0, +0xe0,0x0, 0xcc,0x0, 0x24,0x2, 0x3c,0x1, 0x14,0x0, 0x14,0x80,0xef,0xfe,0xd4,0x70, +0x3a,0x80,0x0, 0x0, 0x3a,0x80,0xe0,0x3, 0x1f,0xc3,0xe0,0x1, 0x17,0x7d,0x8f,0x8f, +0x3f,0x58,0xe2,0x0, 0xcf,0x80,0x3c,0x6f,0x17,0x80,0xe1,0x2f,0x3f,0xf, 0xe0,0x68, +0x39,0xaf,0x38,0x82,0x8, 0xb3,0xe0,0x3, 0x19,0xb0,0x11,0x0, 0x8c,0x33,0x3c,0xe2, +0xc1,0x1, 0xef,0xfe,0xd6,0x58,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, 0xc9,0x3, 0xc1,0x85, +0x1, 0xf6,0x14,0x81,0x3c,0x62,0xef,0xfe,0xd6,0x4e,0x14,0x81,0x14,0x4, 0xef,0xfe, +0xd6,0x4a,0xe0,0x2, 0x1f,0xc8,0x8c,0x8f,0x24,0x82,0x14,0x81,0x14,0x0, 0x9, 0xa1, +0xe7,0xcc,0x0, 0xc1,0x8, 0xb1,0xdf,0xa, 0xef,0xfe,0xd5,0xaf,0x8, 0xa1,0x0, 0xdb, +0x8, 0xb2,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x19,0x4d,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, +0xc7,0x81,0x2f,0x95,0xe0,0x2, 0x1f,0x48,0xaf,0x82,0x3c,0xef,0xaf,0x8e,0x3c,0x6f, +0xe0,0x1, 0x1f,0x4c,0xaf,0x8e,0xe0,0x3, 0x1f,0x2, 0xaf,0x8e,0xef,0xfe,0xd6,0x23, +0xef,0xfe,0xd8,0xc4,0x8c,0x2, 0x9, 0x21,0xe7,0xd7,0x0, 0xf2,0x17,0x81,0xe0,0x2, +0x1f,0x48,0xe0,0x2, 0x1c,0x68,0xaf,0x82,0xaf,0x8e,0xe0,0x2, 0xd6,0x8f,0xe0,0x1, +0x1f,0xcc,0xe0,0x3, 0x1f,0x1e,0xac,0xf, 0x87,0x8f,0xaf,0x8e,0xe0,0x2, 0xd5,0x3b, +0x14,0x81,0x14,0x0, 0xef,0xfe,0xd6,0x7, 0x0, 0xe4,0x8, 0xb3,0x14,0x0, 0xde,0x3, +0xe0,0x2, 0x1f,0x92,0x14,0x1, 0x91,0x8f,0x99,0xf, 0x39,0xd8,0x31,0x58,0x39,0x58, +0xdd,0xfa,0xe0,0x8, 0x39,0xc2,0x9, 0xe1,0x8, 0xb2,0xe0,0x2, 0xd6,0xac,0xdf,0x2d, +0x14,0x0, 0xdd,0xf1,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0x8b,0x97,0x8e,0xe0,0x2, 0x1e,0x94,0xe3,0xff,0xc7,0xfd,0xb7,0x8e,0x97,0xcd, +0xe3,0xff,0xc7,0xf7,0xb7,0xcd,0x97,0x8e,0xe0,0x2, 0x19,0x77,0xe2,0x0, 0xc7,0x81, +0x2f,0x97,0x14,0x1, 0xdd,0xd8,0xe0,0x2, 0x1f,0x48,0x8f,0x82,0x8e,0x8e,0x37,0xdd, +0xe2,0x0, 0xc7,0x81,0x2f,0x89,0xe0,0x2, 0x1f,0xfb,0x8f,0x8f,0x8f,0xe, 0x37,0xde, +0xe2,0x0, 0xc7,0x81,0x27,0x84,0x9, 0x21,0xe7,0xed,0x0, 0x8c,0x9, 0x61,0x97,0x8e, +0xe0,0x2, 0x1e,0x94,0xe3,0xff,0xc7,0xfe,0xb7,0x8e,0x97,0xcd,0xe3,0xff,0xc7,0xfb, +0xb7,0xcd,0xdf,0x7f,0xef,0xfd,0xdd,0xa6,0x14,0x1, 0xe0,0x1, 0xd8,0x9b,0xe0,0x2, +0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xaf,0x82,0x0, 0xd5,0xe0,0x1, 0x1f,0xe8,0xe0,0x3, +0x1f,0x4, 0x8f,0x8f,0xe0,0x1, 0x8e,0xce,0xe2,0x0, 0xcf,0x85,0x2, 0x8c,0x26,0x9c, +0xe0,0x2, 0x1e,0x21,0xe0,0x1, 0x8d,0x9e,0x3f,0x9c,0x8e,0xf, 0x3d,0xfc,0x5, 0xb6, +0xc6,0x1, 0xae,0xf, 0xe2,0x0, 0xce,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0xb4,0x16,0x80, +0xae,0x8f,0xe0,0x1, 0x8f,0xee,0xe2,0x0, 0xcf,0x81,0xeb,0xe5,0x7f,0xeb,0x1, 0x9, +0x17,0x1, 0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1e,0x21,0x3f,0x9c,0xae,0x8f,0x0, 0xee, +0x8e,0x8f,0xe0,0x1, 0x8e,0xe, 0x3e,0x7d,0x5, 0xf4,0xc6,0x81,0x16,0x0, 0xe0,0x1, +0xae,0x6e,0xae,0x8f,0x38,0x82,0xe0,0x2, 0x1e,0x34,0xe0,0x1, 0x8e,0x9e,0x8f,0x8c, +0x15,0x80,0x3e,0xff,0xe0,0x1, 0xad,0xee,0x5, 0x8c,0x16,0x81,0x3e,0x9f,0xeb,0xe5, +0x7f,0xeb,0xe0,0x1, 0xad,0xce,0xae,0x8c,0x0, 0xdc,0x16,0x80,0xae,0x8f,0x0, 0xd2, +0xeb,0xe5,0x7f,0xeb,0xad,0x8c,0x0, 0xd5,0x8, 0xb5,0xe0,0x3, 0x19,0x4, 0x17,0x1, +0x9f,0xd2,0xe0,0x1, 0xaf,0x62,0xe0,0x43,0x3f,0x1f,0xe2,0x0, 0xcf,0x0, 0xe0,0x1, +0x4, 0x4a,0xe0,0x2, 0x1f,0x5d,0x8f,0xe, 0x27,0x4, 0x17,0x0, 0xe0,0x1, 0xaf,0x62, +0xe2,0x0, 0xc7,0xa0,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe0,0x1, 0x19,0xe9, +0x8f,0x83,0x2f,0x83,0xe0,0x1, 0xaf,0xe2,0xe0,0x2, 0x1a,0x48,0xe0,0x2, 0x1a,0xc0, +0x8c,0x4, 0xde,0xca,0x24,0x7, 0xe0,0x4, 0x8f,0xd5,0xe2,0x0, 0xcf,0x81,0xe0,0x1, +0x1, 0x1e,0x9f,0x52,0x17,0x80,0xe0,0x80,0x16,0x80,0xe0,0x1, 0xaf,0xc2,0x3e,0xde, +0xe0,0x1, 0xaf,0xd2,0x26,0x84,0x17,0x81,0xe0,0x1, 0xaf,0xc2,0xe0,0x4, 0x17,0x80, +0x3f,0xde,0x2f,0x83,0xe0,0x1, 0xaf,0xc2,0xe0,0x1, 0x1f,0xc7,0x9f,0x8f,0xe2,0x4, +0xcf,0xd8,0xe0,0x2, 0x1f,0xfe,0xe0,0x0, 0x5, 0xe5,0x16,0x8f,0xae,0x8f,0x8e,0x84, +0xe2,0x0, 0xce,0x81,0xe0,0x0, 0x1, 0x68,0x16,0x80,0xae,0x8f,0x17,0xa0,0x3f,0xde, +0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xc2,0x8f,0x83,0x2f,0x83,0xe0,0x1, 0xaf,0xc2, +0xe0,0x1, 0x17,0x80,0x3f,0xde,0x27,0x84,0x17,0x80,0xe0,0x1, 0xaf,0xc2,0x11,0x84, +0xe0,0x1, 0x1f,0xd7,0x96,0xbf,0xe0,0x0, 0x1f,0x8d,0xe0,0x1b,0x96,0x1f,0xe0,0xf, +0x36,0xa1,0x3e,0x7f,0x4, 0x5, 0x3e,0x7d,0x11,0x83,0xe0,0x0, 0x3, 0x4e,0xe2,0x2, +0xc7,0x0, 0xe2,0x0, 0xcf,0x0, 0x17,0x84,0xe0,0x6f,0x39,0x23,0x39,0xef,0xe0,0x1, +0xda,0x3d,0xe0,0x1, 0x1f,0x91,0xe2,0x0, 0xcc,0x0, 0x8f,0xf, 0xe0,0x1, 0x1f,0x90, +0x37,0x28,0x8f,0x8f,0x16,0x81,0xe0,0x6d,0x39,0x23,0x3f,0xce,0xe0,0x1, 0x1f,0xf, +0x3f,0xbd,0xe0,0x0, 0x1e,0x8e,0x8f,0xe, 0xe0,0x43,0x3f,0x9f,0x8e,0x8d,0xb7,0xb2, +0xe0,0x1, 0xaf,0x2, 0x26,0x8a,0x96,0xd2,0xe2,0x0, 0xce,0x80,0x4, 0x6, 0xe2,0x0, +0xcf,0x81,0x5, 0x3d,0x37,0x81,0xb7,0xb2,0xe0,0x4, 0x8f,0xd5,0xe2,0x0, 0xcf,0x81, +0x1, 0x85,0x97,0xb2,0xe4,0x0, 0xc7,0x85,0xb7,0xb2,0xa, 0xa1,0xe7,0xfe,0x0, 0x87, +0x8e,0x8f,0xe7,0xff,0x26,0x9e,0xc6,0xff,0xae,0x8f,0x8e,0x84,0xe2,0x0, 0xce,0x81, +0xe7,0xff,0x1, 0x9c,0x16,0xa0,0x3e,0xde,0xe7,0xff,0x2e,0x9d,0x8f,0x8f,0xe7,0xff, +0x2f,0x9a,0xe7,0xff,0x0, 0x9b,0xe4,0xf, 0x36,0xcf,0x3f,0x9d,0x37,0x81,0xe0,0x2f, +0x3f,0x9c,0x11,0x81,0x39,0x9f,0xe7,0xff,0x0, 0xac,0xe0,0x3, 0x1f,0xc6,0x8f,0x8f, +0xe2,0x0, 0xcf,0xb8,0xe7,0xfe,0x2, 0xdf,0x17,0x80,0xe0,0x1, 0xaf,0xe2,0xe7,0xfe, +0x0, 0xda,0x17,0x0, 0xe0,0x1, 0xaf,0x62,0xe7,0xfe,0x0, 0xb5,0x37,0x21,0xe0,0x1, +0xaf,0x2, 0x0, 0xc3,0xe0,0x2, 0x1e,0xa1,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xaf,0x1f, +0xc7,0x81,0xaf,0x1d,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f, +0xaf,0xf, 0x38,0x82,0x8, 0xb2,0xc0,0x7c,0xe0,0x1, 0xd1,0x1a,0xdf,0xe, 0xdd,0xcb, +0xe0,0x2, 0x1f,0x8f,0x2c,0x10,0x8f,0xf, 0xe0,0x3, 0x19,0x4, 0xe2,0x0, 0xcf,0x1, +0xe0,0x1, 0xac,0x42,0x1, 0x25,0xdd,0xbf,0x24,0x11,0xe0,0x1, 0x8f,0xe2,0x2f,0x9b, +0xc0,0x4, 0x9, 0x61,0x8f,0xf, 0xe0,0x3, 0x19,0x4, 0xe2,0x0, 0xcf,0x1, 0x1, 0x18, +0xe0,0x1, 0x8f,0xc2,0x2f,0x9a,0xdd,0xaf,0x2c,0x71,0x7c,0x1, 0xef,0xfc,0xd2,0x25, +0xe0,0x0, 0x1f,0x8e,0x64,0x1, 0xac,0xf, 0xe0,0x0, 0x1f,0x8c,0xac,0xf, 0xe0,0x1, +0x8f,0xe2,0x27,0xe7,0x14,0x0, 0xc0,0x4, 0x9, 0x21,0xe7,0x81,0x0, 0xa3,0x17,0x1, +0x16,0x0, 0xe0,0x1, 0xaf,0x42,0xae,0xf, 0x17,0x80,0xe0,0x2, 0x1e,0xa1,0xe0,0x2, +0x1f,0x20,0xaf,0x8d,0x16,0x7, 0xaf,0x9d,0xe0,0x2, 0x1e,0xf7,0xaf,0x8e,0xae,0xd, +0xe0,0x2, 0x1f,0x1f,0xe0,0x2, 0x1e,0xb4,0xaf,0x8e,0xaf,0x8d,0x0, 0xc5,0x0, 0x0, +0xe0,0x0, 0x1f,0x85,0x8f,0xf, 0xe0,0x0, 0x1f,0x8d,0xe0,0x0, 0x27,0x60,0xe0,0x0, +0x1f,0xe, 0x8e,0xe, 0xe2,0x0, 0xce,0x2, 0x1, 0x8, 0x17,0xa, 0x3f,0x38,0x3f,0x9e, +0xf0,0x10,0x8b,0xaf,0x5, 0xb4,0x38,0x82,0x8e,0xbf,0xf0,0x0, 0x8b,0x9f,0xf0,0x0, +0x8b,0xf, 0xf0,0xe, 0x3b,0xad,0x8d,0xaf,0xe2,0x0, 0xcf,0x0, 0xe8,0x17,0x3e,0xa7, +0xf2,0x1, 0xc3,0xff,0xf0,0xd, 0x3b,0x2b,0xe2,0x1, 0xc7,0x7f,0xe8,0x6e,0x3d,0x27, +0xe8,0xb, 0x3d,0xa6,0xe2,0x0, 0xce,0x80,0xe2,0x1, 0xc5,0xff,0xe2,0x1, 0xc6,0xff, +0xe0,0x6d,0x3d,0x2b,0xf0,0x40,0x3b,0xee,0x3d,0xed,0xf2,0x1, 0xc3,0xff,0xe2,0x1, +0xc5,0xff,0xf0,0x40,0x3b,0xfb,0x3, 0x82,0x3f,0x6d,0x15,0x8a,0x3d,0xb8,0x3e,0xee, +0xe0,0xf, 0x3f,0x9b,0xf0,0x10,0x8b,0xaf,0xe2,0x1, 0xc6,0xff,0xf2,0x0, 0xcb,0x94, +0x2, 0x99,0xf2,0x0, 0xcb,0x8a,0x2, 0xad,0xea,0x12,0x7f,0x4, 0xe0,0xf, 0x3f,0x18, +0x8d,0x89,0xf0,0x0, 0x8b,0xf, 0xe8,0x40,0x3d,0xf6,0x3, 0x86,0xf0,0x0, 0xab,0x9, +0x8f,0x8f,0xaf,0x8a,0x8d,0x89,0xe2,0x0, 0xce,0x2, 0x1, 0x1f,0x3f,0x18,0xad,0x8e, +0x38,0x82,0x17,0x85,0xaf,0x89,0xaf,0x8a,0x0, 0xe8,0xea,0x12,0x7e,0x84,0x3f,0xed, +0xe1,0x80,0xbf,0x1f,0xc7,0x84,0xbf,0x1d,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f, +0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xe1,0x80,0xbf,0x1f,0xb7,0xf, 0x38,0x82, +0x17,0x84,0xaf,0x89,0xaf,0x8a,0x0, 0xd1,0xe0,0xf, 0x36,0xc1,0xe2,0x1, 0xc7,0xff, +0x3f,0xfb,0x3, 0x8d,0xf2,0x0, 0xcb,0x95,0x16,0x83,0xe0,0x6d,0x3c,0xac,0x3e,0xff, +0xe0,0x6f,0x3b,0xad,0x3d,0xef,0xe2,0x1, 0xc5,0xff,0xad,0x89,0xad,0x8a,0x8d,0x89, +0x0, 0xce,0x0, 0x0, 0x8, 0xb3,0x39,0x68,0xe0,0x1, 0x1c,0x67,0x39,0xe9,0xe0,0xc, +0x15,0x52,0x14,0x80,0xe0,0x5, 0xde,0xe0,0xe0,0x2, 0x1f,0xfd,0x16,0x7a,0x8c,0x5f, +0x3e,0x12,0xf0,0x2c,0x13,0x99,0xe0,0xe, 0x3e,0x38,0xf0,0x17,0x3b,0x93,0xf0,0x17, +0x3b,0x9e,0x8c,0xcf,0xe0,0x1, 0x1f,0xff,0xf0,0x17,0x33,0xa1,0xf0,0x0, 0x12,0x87, +0x15,0xd, 0xf0,0x1, 0x1b,0x4a,0xe0,0x14,0x34,0x21,0xf0,0x17,0x3b,0x9f,0xf0,0x15, +0x3a,0x92,0xe0,0xa, 0x3d,0x13,0x3f,0xe3,0xe8,0x40,0x3e,0xe7,0xe8,0x40,0x3f,0x66, +0xe2,0x0, 0xce,0x0, 0x4, 0xc, 0x3c,0xfc,0x15,0xfa,0x3d,0x9f,0x5, 0x8, 0xe2,0x0, +0xcd,0x80,0x4, 0x5, 0x3c,0x7b,0x5, 0x3, 0x95,0x8e,0xb5,0x8d,0xc7,0x81,0x3f,0xfa, +0xc7,0x2, 0xc6,0x82,0x1, 0xee,0xc6,0x1, 0xe8,0x40,0x3e,0x75,0xf0,0x0, 0xc3,0x1a, +0xf8,0x17,0x3b,0x94,0x1, 0xe1,0x9, 0xe1,0xe0,0x0, 0x1f,0xe, 0xf0,0x2, 0x1a,0x1c, +0x17,0x80,0xf0,0x0, 0x89,0x8e,0xe8,0x7, 0xaf,0xc4,0xe8,0xf, 0xaf,0x94,0xe8,0x16, +0xaf,0xe4,0xe8,0x1e,0xaf,0xb4,0xf0,0x1, 0x21,0xb9,0x8, 0xb7,0x11,0x0, 0xe4,0x8, +0x34,0x29,0xe4,0x9, 0x34,0xa9,0xf0,0x0, 0x1b,0xd, 0xe4,0x8, 0x34,0x48,0xe4,0x9, +0x34,0xc8,0xf0,0x40,0x39,0x62,0x3a,0x62,0xf0,0x40,0x38,0xe2,0x3a,0xe2,0xf0,0x40, +0x38,0x62,0x39,0xe2,0x38,0xe2,0x3e,0xe2,0x3d,0x7d,0xe0,0x1, 0x1, 0xd, 0xe8,0x0, +0x8f,0x6, 0xe8,0x0, 0x8f,0x96,0xe4,0xe, 0x37,0x29,0xe4,0xf, 0x37,0xa9,0xe4,0xe, +0x37,0x48,0xe4,0xf, 0x37,0xc8,0xe0,0xb, 0x3f,0x18,0xe0,0xc, 0x3f,0x99,0xe4,0xb, +0x35,0xa7,0xe4,0xc, 0x36,0x27,0xe1,0x37,0x3c,0x2e,0xe4,0xb, 0x35,0xc8,0xe4,0xc, +0x36,0x48,0xe1,0x35,0x3c,0xaf,0xf0,0x0, 0x23,0x94,0xf0,0x0, 0x22,0x92,0xe1,0x26, +0x3c,0x2b,0xe1,0x27,0x3c,0xac,0x3b,0x57,0x23,0xb, 0xe0,0x3, 0x30,0xa1,0xe8,0x3, +0x39,0x94,0xc0,0x81,0xad,0x83,0xe2,0x1, 0xc0,0xff,0xae,0x13,0x39,0xe6,0xe1,0x2e, +0x3f,0x28,0xf0,0x0, 0x22,0x9e,0x27,0x1c,0xe1,0x35,0x3d,0xa8,0xe1,0x26,0x3c,0xac, +0xf0,0x15,0x3a,0xd6,0xf0,0x0, 0x22,0x95,0x12,0xbc,0xe8,0x5, 0x3a,0x90,0x32,0xa1, +0xf0,0x6, 0x30,0x21,0xe8,0x5, 0x3a,0x94,0xad,0xa5,0xf0,0x0, 0xc0,0x1, 0xf0,0x5, +0x3a,0x16,0xe0,0xf, 0xae,0x35,0xf2,0x1, 0xc0,0x7f,0xe8,0x40,0x3a,0xe5,0xe1,0x2f, +0x3f,0xa9,0xf0,0x0, 0x23,0x9e,0x27,0x9c,0xe1,0x37,0x3c,0x2b,0xe1,0x26,0x3e,0x29, +0xf0,0x17,0x3b,0xd6,0xf0,0x0, 0x23,0x95,0x12,0x1e,0xe8,0x4, 0x3a,0x11,0x32,0x21, +0xf0,0x6, 0x30,0xa1,0xe8,0x4, 0x3a,0x14,0xad,0x94,0xf0,0x0, 0xc0,0x81,0xf0,0x4, +0x3a,0x16,0xe0,0x7, 0xae,0x64,0xf2,0x1, 0xc0,0xff,0xe8,0x40,0x3a,0x67,0x27,0x1b, +0x27,0x9a,0xe1,0x2f,0x3d,0xa8,0xe1,0x2e,0x3e,0x29,0x3f,0xde,0x27,0x94,0xe0,0x0, +0x17,0x5a,0xe8,0xe, 0x3f,0x12,0x37,0x21,0xf0,0x2, 0x31,0x21,0xe8,0xe, 0x3f,0x14, +0xad,0xbe,0xf0,0x0, 0xc1,0x1, 0xf0,0xe, 0x3a,0x12,0xe0,0x17,0xae,0xe, 0xf2,0x1, +0xc1,0x7f,0x39,0x6f,0xc6,0x81,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf3,0xf0,0x0, +0xc3,0x2, 0xe7,0xfe,0x1, 0xeb,0x29,0x8a,0x22,0x83,0xf8,0x16,0xa8,0x64,0x22,0x3, +0xf8,0xf, 0xa8,0x94,0x29,0x6, 0xb, 0xe1,0x38,0x82,0xe8,0x7, 0xa8,0xc4,0x0, 0xf5, +0xf8,0x1e,0xa9,0x34,0xb, 0xe1,0x2c,0x2a,0x3f,0xe9,0x24,0x95,0x3f,0xe8,0x17,0xd, +0x3f,0x38,0x3f,0x19,0xe0,0xd, 0x37,0x21,0x3e,0x9b,0xe0,0x40,0x96,0x9d,0x3f,0x1a, +0xe2,0x0, 0xce,0x80,0xe0,0x0, 0x5, 0x47,0x16,0x81,0xe0,0x40,0xae,0x9e,0xe2,0x0, +0xcc,0xb, 0x2, 0x90,0x17,0x1, 0x3f,0x1f,0xe4,0x0, 0xc7,0xd, 0x3f,0x19,0xe0,0xd, +0x37,0x21,0x3e,0x9b,0x96,0x8d,0x3f,0x1a,0xe2,0x0, 0xce,0x80,0x5, 0x2d,0x16,0x81, +0xae,0x8e,0xe2,0x0, 0xcc,0x8b,0x5, 0x96,0x38,0x82,0x17,0x7f,0x3f,0x18,0xe4,0x0, +0xc7,0xd, 0x3f,0xe8,0x3f,0x19,0xe0,0xd, 0x37,0x21,0x3e,0x9b,0x96,0x8d,0x3f,0x1a, +0xe2,0x0, 0xce,0x80,0x5, 0x1c,0x16,0x81,0xae,0x8e,0x2c,0xca,0xe2,0x0, 0xcc,0xb, +0x5, 0xda,0xe4,0x0, 0xc7,0x8d,0x3f,0x99,0xc7,0x81,0xe0,0xe, 0x37,0xa1,0x3d,0x9e, +0x97,0xb, 0x3f,0x9a,0xe2,0x0, 0xcf,0x0, 0x5, 0x4, 0x17,0x1, 0xaf,0xf, 0x38,0x82, +0x17,0x2, 0xaf,0xf, 0x38,0x82,0x16,0x82,0xae,0x8e,0x0, 0xd4,0x16,0x82,0xae,0x8e, +0x0, 0xe5,0x16,0x82,0xe0,0x40,0xae,0x9e,0xe7,0xff,0x0, 0xbb,0x8, 0xb7,0xe1,0xfc, +0xc0,0x0, 0xe0,0x2, 0x1f,0xdd,0x17,0x1, 0x8f,0x8f,0xe0,0x2f,0x3f,0x8e,0xe0,0x1, +0x27,0x83,0x17,0x94,0xe1,0x28,0x3c,0x1f,0xe0,0x0, 0x24,0x7e,0xe0,0x1, 0x1f,0xca, +0x16,0x0, 0xe0,0xa, 0x97,0xcf,0xe2,0x7, 0xcf,0xe8,0xe0,0x0, 0x5, 0x79,0xe0,0x1, +0x1a,0x49,0x11,0x0, 0xe0,0x1, 0x1d,0xc8,0x39,0xe4,0x3c,0xe2,0x17,0xe6,0x3f,0x93, +0xe0,0x80,0x97,0x1f,0x16,0x81,0x3e,0x7e,0x3e,0x99,0x3, 0x5, 0x3c,0xed,0x39,0x1e, +0xe3,0xff,0xc4,0xff,0x3f,0xf3,0x1, 0xf5,0xc1,0x9a,0x39,0xfb,0x1, 0xf0,0x24,0x85, +0x3c,0x62,0xe0,0x5, 0xdc,0xe8,0x39,0x68,0xe0,0x2, 0x15,0x52,0x14,0x80,0xe2,0x1, +0x7c,0x30,0xe0,0x5, 0xdd,0x39,0xe2,0x1, 0x7d,0xb0,0x15,0x0, 0x17,0x66,0x3f,0x14, +0x3e,0x6b,0x0, 0x85,0xb7,0x8c,0x3f,0x74,0xc6,0x2, 0x1, 0x11,0xe0,0x80,0x96,0x9e, +0xe2,0x0, 0xce,0x80,0xe0,0xf, 0x3e,0xa2,0xe0,0x43,0x3f,0x9f,0x5, 0x75,0xe2,0x0, +0xcf,0x80,0x3, 0x71,0x3f,0x74,0xb5,0xc, 0xc6,0x2, 0x1, 0xf1,0x12,0x1a,0x3a,0x1e, +0x3a,0x73,0xc5,0x9a,0x1, 0xe4,0x13,0x4, 0x3b,0x10,0x14,0x80,0xe0,0x1, 0x15,0x29, +0x3c,0x66,0xe0,0x5, 0xdd,0x11,0x17,0x81,0x14,0x86,0xe0,0x0, 0x12,0xd7,0xe0,0xa, +0xaf,0xc6,0x3a,0x90,0x17,0x81,0x3b,0xe9,0x3a,0x69,0xe7,0xff,0x11,0xb3,0xe2,0x1, +0xc2,0x7f,0x39,0x95,0x39,0x67,0x0, 0x83,0xe0,0x9, 0x8f,0xe3,0xe2,0x0, 0xcf,0x81, +0xc1,0xf3,0x1, 0x19,0xc1,0x7f,0xe0,0x43,0x39,0x2, 0xe3,0xff,0xc9,0x7f,0x1, 0xf5, +0x14,0xff,0x3c,0x94,0xe0,0x43,0x3c,0x89,0xe3,0xff,0xcc,0xff,0x1, 0x15,0xe1,0xc0, +0x8f,0x95,0x0, 0xe3,0xe0,0x1, 0x1f,0xca,0xe0,0xa, 0x97,0xcf,0xe0,0xc, 0x37,0x82, +0xe7,0xff,0x0, 0x87,0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0x3d,0x66, +0x3c,0xe4,0xdf,0xa, 0x0, 0xe0,0x12,0x8a,0x3a,0x90,0x14,0x86,0x13,0x7, 0x3a,0x69, +0xe2,0x1, 0xc2,0x7f,0x39,0x65,0x39,0xe6,0xe0,0xb, 0x8f,0xb2,0xc1,0xd, 0xe2,0x0, +0xcf,0x81,0xe0,0x2, 0x1, 0xa, 0x17,0x81,0x3f,0x93,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xe0,0x43,0x39,0x8f,0x1, 0xf1,0x14,0xff,0x3c,0x94,0xe0,0x43,0x3c,0x89, +0xe3,0xff,0xcc,0xff,0xc2,0xff,0x1, 0xe4,0x12,0x8b,0x3a,0x90,0x3b,0x65,0x12,0x7, +0xe0,0x0, 0x13,0x86,0xe2,0x1, 0xc2,0x7f,0x39,0xe6,0x39,0x67,0xe0,0x9, 0x8f,0xe3, +0xc1,0xf3,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x5d,0xc1,0x7f,0xe0,0x43,0x39,0x2, +0xe3,0xff,0xc9,0x7f,0x1, 0xf4,0x17,0x81,0x3f,0x94,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xc3,0x1, 0xe0,0x43,0x3a,0xf, 0x1, 0xe6,0x12,0x7, 0xe0,0x40,0x3b,0x64, +0xe2,0x1, 0xc2,0x7f,0x39,0x65,0x39,0xe6,0xe0,0xb, 0x8f,0xb2,0xc1,0xd, 0xe2,0x0, +0xcf,0x81,0xe0,0x1, 0x1, 0x55,0x17,0x81,0x3f,0x93,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8d,0xe0,0x43,0x39,0x8f,0x1, 0xf1,0x17,0x81,0x3f,0x94,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x8d,0xc2,0x81,0xe0,0x43,0x3a,0xf, 0x1, 0xe3,0x15,0x0, 0x14,0x11, +0x3c,0x10,0x39,0x6a,0x14,0x82,0x12,0x82,0x12,0x1, 0x39,0xea,0x17,0x72,0x3f,0x18, +0x3e,0xe8,0x3d,0xe2,0x8e,0x1e,0xe0,0x0, 0x2e,0x56,0xe0,0x1, 0x25,0x47,0xe0,0x43, +0x8f,0xad,0xe2,0x0, 0xcf,0x82,0xe0,0x0, 0x1, 0x6a,0xe0,0x0, 0x25,0xda,0x8f,0x8e, +0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x0, 0xe2,0x0, 0xcd,0xc, 0xe0,0x1, 0x1, 0x5d, +0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x1, 0x46,0xe2,0x0, 0xcd,0x8c,0xe0,0x1, +0x1, 0xd8,0x17,0x81,0x3f,0x9a,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8d,0xc4,0xd, +0xe0,0x43,0x3d,0xf, 0x1, 0xd4,0x16,0x10,0xe0,0x1, 0x15,0x39,0xe0,0x1, 0x1d,0xca, +0x3e,0x10,0x3d,0x10,0x17,0xf3,0x3f,0x9c,0xe0,0x40,0x3f,0x6b,0xe0,0x80,0x8e,0x9f, +0x2e,0x82,0xb6,0x8e,0x3f,0xfc,0xc7,0x2, 0x1, 0xfa,0x16,0xd, 0x3e,0x1f,0x3d,0x7c, +0xc5,0x9a,0x1, 0xf1,0xe0,0x4, 0xc0,0x0, 0xb, 0xe1,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, +0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x0, 0x1, 0x41,0x8f,0xae,0xe2,0x0, 0xcf,0x82, +0x1, 0x89,0x16,0x1, 0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0xe2,0x0, 0xce,0x1, 0x5, 0x82, +0xac,0x9e,0x17,0x81,0x3f,0x9b,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8d,0xc6,0x81, +0xc7,0x1, 0xe0,0x43,0x3d,0x8f,0xe7,0xff,0x1, 0x9f,0xe7,0xff,0x0, 0xbc,0xe2,0x0, +0xcd,0xc, 0xe0,0x0, 0x1, 0x5c,0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0x8f,0xae,0x1, 0x5f, +0xe2,0x0, 0xcf,0x82,0x1, 0xe7,0x3e,0x6b,0x0, 0xde,0x25,0xd0,0x8f,0x8e,0xe2,0x0, +0xcf,0x82,0x1, 0x8, 0xe2,0x0, 0xcd,0xc, 0x1, 0x99,0xe2,0x0, 0xcd,0x8c,0x1, 0xce, +0x0, 0xd9,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0xe0,0x0, +0x1, 0x6a,0xe2,0x0, 0xcd,0x8c,0x1, 0x4d,0x8e,0x2e,0xe2,0x0, 0xce,0x2, 0x1, 0x43, +0xac,0x9e,0x0, 0xc8,0xe2,0x0, 0xcd,0xc, 0x1, 0x6, 0x8f,0x8d,0xe2,0x0, 0xcf,0x82, +0xe0,0x0, 0x1, 0x57,0xe2,0x0, 0xcd,0x8c,0xe7,0xff,0x1, 0xb1,0xe7,0xff,0x0, 0x83, +0x3c,0x62,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0xe2,0x0, 0x7d,0x4, 0x3c,0xe4, +0xdd,0xf3,0xe7,0xfe,0x0, 0x9c,0x3c,0x63,0xe2,0x1, 0xc4,0x7f,0xe2,0x1, 0x7d,0xb0, +0xe2,0x0, 0x7d,0x4, 0x3c,0xe4,0xdd,0xe8,0xe7,0xfd,0x0, 0xef,0x3c,0x63,0xe2,0x1, +0xc4,0x7f,0xe2,0x1, 0x7d,0xb0,0xe2,0x0, 0x7d,0x4, 0x3c,0xe4,0xdd,0xdd,0xe7,0xfe, +0x0, 0xa4,0x8f,0x8d,0xe2,0x0, 0xcf,0x82,0x1, 0x1d,0x8f,0xae,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x1, 0x91,0xe7,0xff,0x0, 0xa9,0x25,0xf5,0x8f,0x8e,0xe2,0x0, 0xcf,0x82, +0x8f,0x8d,0x1, 0x45,0xe2,0x0, 0xcf,0x82,0x1, 0xd, 0xe2,0x0, 0xcd,0x8c,0xe7,0xfe, +0x1, 0x4a,0x8f,0xae,0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xfd,0x3e,0x6a,0xe7,0xfe, +0x0, 0xf3,0x3e,0x63,0xe2,0x0, 0xcd,0x8c,0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0x1, 0x17, +0x8f,0xae,0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xea,0xe7,0xfe,0x0, 0xe5,0x3e,0x64, +0x0, 0xf2,0x3e,0x65,0x0, 0xf0,0xe2,0x0, 0xcd,0x8c,0xe7,0xfe,0x1, 0x64,0x8f,0xae, +0xe2,0x0, 0xcf,0x82,0xe7,0xfe,0x1, 0xdf,0xe7,0xfe,0x0, 0xd6,0xe2,0x0, 0xce,0x1, +0xe7,0xfe,0x2, 0xd8,0xe7,0xfe,0x0, 0x9f,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x64, +0xe0,0x2, 0x1e,0xfd,0x39,0x68,0x8e,0xdd,0xf0,0x40,0x3d,0x69,0x3f,0xed,0x7e,0x86, +0x3f,0xb8,0xe0,0x1, 0x1e,0xf2,0x3f,0x99,0xa7,0xd, 0x37,0xa1,0x3f,0x9e,0x94,0xf, +0x14,0x8a,0x7d,0x1, 0xe0,0x5, 0xda,0xb4,0xe0,0x2, 0x1f,0x7d,0x65,0x1, 0x8f,0x4e, +0xe0,0x43,0x39,0x98,0xe8,0x40,0x3c,0xea,0x3c,0x62,0x7f,0x3, 0xdc,0xa6,0xe8,0x43, +0x3f,0x8a,0xe2,0x0, 0xcf,0x80,0x7f,0x85,0xe0,0x5, 0x4, 0x7b,0xe0,0x2, 0x1e,0xdd, +0x17,0x0, 0x7e,0x84,0xf7,0xff,0x14,0x7a,0x7f,0x2, 0xf0,0x0, 0x16,0x86,0xe0,0x1, +0x1f,0xf2,0xe0,0x2, 0x1d,0x9c,0xe0,0x2, 0x1e,0xfd,0x67,0x4, 0x63,0x82,0xa2,0x8f, +0x8a,0x5d,0xe0,0x43,0x3f,0x82,0xe0,0x7, 0x8c,0xcb,0xf0,0x0, 0x8d,0x8e,0x60,0x85, +0x7f,0x87,0x3b,0x67,0x66,0x87,0xe2,0x0, 0xce,0x80,0xe0,0x1, 0x4, 0xc, 0x67,0x2, +0xf0,0x0, 0x11,0x80,0xf0,0x43,0x3c,0x8e,0xe8,0x14,0x38,0xaa,0xf8,0x3c,0x3c,0x19, +0xf8,0x3e,0x3c,0x9d,0xe0,0x8, 0x30,0xa1,0xf0,0x40,0x39,0x62,0xf8,0x40,0x38,0x63, +0xf8,0x43,0x3b,0x14,0xf0,0x0, 0xc4,0x86,0xe8,0x43,0x3d,0x2, 0xe0,0xf, 0x3d,0x34, +0x3f,0x91,0x37,0xa1,0x3f,0x95,0xf0,0x0, 0x90,0x8f,0x24,0xaa,0xe0,0x15,0x3d,0x22, +0x3e,0xe7,0x35,0x21,0x3f,0xe6,0xf8,0x43,0x3b,0x95,0x0, 0x8e,0xf2,0x0, 0xca,0x1, +0x2, 0x1d,0xf2,0x0, 0xcb,0x80,0xe0,0x0, 0x5, 0x4a,0xf2,0x0, 0xca,0x81,0x2, 0x16, +0x3c,0xff,0x3e,0xef,0x5, 0x15,0xe0,0xe, 0x36,0xa1,0x3f,0x1b,0x8e,0xe, 0xc7,0x81, +0x3e,0x7a,0xe0,0x43,0x3f,0x8f,0x4, 0x75,0x8f,0x1e,0x3c,0x7e,0x2, 0x72,0xf2,0x0, +0xcb,0x0, 0x2, 0x65,0xf3,0xff,0xcb,0x7f,0x3, 0x65,0x3c,0xfd,0x2, 0x35,0xe8,0x40, +0x39,0xf1,0xe0,0x0, 0x2, 0x51,0xe8,0x43,0x3f,0x83,0xf0,0x2e,0x3c,0x1f,0x2f,0x13, +0xf0,0x0, 0x2e,0x12,0xe8,0x2e,0x3f,0x9d,0x2f,0xe, 0xf0,0x0, 0x2f,0xd, 0xc7,0x86, +0xe4,0x0, 0xc7,0x8d,0xe0,0x1, 0x1e,0xca,0xe8,0xf, 0x3f,0x99,0x37,0xa1,0x3f,0x9d, +0xf0,0x0, 0xb0,0x8f,0xf0,0x0, 0xc0,0x1, 0xf3,0xff,0xc0,0x7f,0x17,0xff,0xe8,0xf, +0x3f,0x92,0xf1,0xff,0xc1,0xff,0xe2,0x1, 0xc7,0xff,0xf2,0x1, 0xc1,0xff,0xf0,0x0, +0x21,0xc, 0xf0,0x40,0x39,0x6f,0xe7,0xff,0x0, 0xa1,0xf3,0xff,0xcb,0xff,0xe7,0xff, +0x3, 0x39,0x3c,0xfd,0x5, 0x4d,0xf0,0x0, 0x20,0xe, 0x67,0x82,0xc0,0xff,0xc7,0xff, +0xe0,0x43,0x38,0x81,0xe2,0x1, 0xc7,0xff,0xe3,0xff,0xc8,0xff,0x7f,0x82,0xe7,0xfe, +0x1, 0xf3,0xf0,0x0, 0x61,0x83,0xf1,0xff,0xc1,0xff,0xe8,0x40,0x39,0x73,0x4, 0xf, +0x67,0x86,0xc7,0xff,0xe8,0x40,0x3f,0xfa,0xe0,0x1, 0x2, 0x3b,0xc0,0x1c,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xf2,0x0, 0xcd,0x81,0x5, 0xca,0x0, 0xde,0x66,0x84,0xe0,0x1, +0x1f,0x72,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, 0x15,0x81,0x8e,0x8d,0xf0,0x0, 0x13,0x0, +0xf0,0x1b,0x3d,0x92,0xf0,0x0, 0xa0,0x8e,0xf0,0x0, 0x8c,0xdf,0xe0,0x16,0x8d,0x6b, +0xf0,0x0, 0x62,0x85,0x7e,0x82,0xf2,0x1, 0xc5,0xff,0xf8,0x40,0x3e,0x66,0xf7,0xff, +0x16,0xfa,0xf0,0x0, 0x17,0x6, 0xf8,0x40,0x38,0x66,0x67,0x3, 0xe8,0x40,0x3f,0x7b, +0x5, 0xd0,0xe8,0x43,0x3f,0x86,0xe8,0x2d,0x3f,0x9e,0xf8,0x6, 0x3a,0xaa,0xf0,0x38, +0x3e,0x9f,0xc7,0x86,0xf0,0x8, 0x32,0xa1,0xe8,0x40,0x3b,0xeb,0xf0,0x0, 0x13,0x81, +0xf0,0x0, 0x12,0x0, 0xe0,0x43,0x38,0x96,0x7e,0x84,0x7f,0x85,0xe8,0xf, 0x3b,0xb9, +0xe8,0xf, 0x3f,0x95,0x37,0xa1,0xe8,0xf, 0x3f,0x91,0xf0,0x0, 0x91,0xf, 0x25,0x32, +0xe0,0x5, 0x3b,0xa2,0xe0,0x9, 0x33,0xa1,0xe8,0x40,0x3e,0x6c,0xe8,0x40,0x3f,0xe0, +0xe0,0x43,0x3a,0x15,0x0, 0x8e,0xe2,0x0, 0xcb,0x1, 0x2, 0x22,0xe2,0x0, 0xca,0x0, +0xe0,0x2, 0x5, 0xa, 0xe2,0x0, 0xca,0x81,0x2, 0x1b,0x3f,0xfa,0x3e,0x6f,0x3, 0x1a, +0x17,0x3c,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x2e,0xe0,0xd, 0x36,0x21,0x3f,0x79, +0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x2, 0x71,0xe0,0xf, 0x8f,0x3d,0x3c,0x7e, +0x2, 0x6d,0xe2,0x0, 0xc8,0x80,0x2, 0x60,0xe3,0xff,0xc8,0xff,0x3, 0x60,0x3e,0x7a, +0x4, 0x2b,0xe8,0x40,0x39,0xf2,0xe0,0x1, 0x2, 0x6d,0xe8,0x43,0x3f,0x87,0xf0,0x2e, +0x3e,0x9f,0x2f,0x13,0xf0,0x0, 0x2c,0x12,0xe8,0x2e,0x3f,0x9e,0x2f,0xe, 0x67,0x4, +0x2f,0xc, 0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0x66,0x85,0xe0,0x1, 0x1f,0x4a,0x3f,0x9d, +0x37,0xa1,0x3f,0x9e,0xf0,0x0, 0xb1,0xf, 0xf0,0x0, 0xc2,0x1, 0xf3,0xff,0xc2,0x7f, +0xc3,0x81,0x66,0x83,0xe2,0x1, 0xc3,0xff,0x3e,0xf7,0xf0,0x0, 0xc3,0x81,0xf2,0x1, +0xc3,0xff,0xe7,0xff,0x2, 0x9d,0xf7,0xfe,0x22,0x55,0xf1,0xff,0xc2,0xff,0xf8,0x43, +0x3a,0x85,0xf3,0xff,0xca,0xff,0xf1,0xff,0xc3,0x7f,0xf2,0x1, 0xc3,0x7f,0xe7,0xfe, +0x1, 0xf6,0x67,0x86,0xc7,0xff,0xe8,0x40,0x3f,0xfa,0xe7,0xfe,0x5, 0x49,0x13,0x81, +0xe8,0x7, 0x3b,0x9a,0x67,0x6, 0xe2,0x1, 0xc3,0xff,0x3f,0x77,0xe7,0xfe,0x5, 0xc0, +0xe0,0x2, 0x1f,0xdd,0xe0,0x1, 0x1e,0xf2,0xe0,0x2, 0x1d,0x9c,0xe0,0x2, 0x1f,0x7d, +0x7f,0x84,0xf0,0x40,0x3b,0x67,0x8f,0x8f,0xf0,0x0, 0xa6,0xd, 0xf0,0x0, 0x8e,0xde, +0xe0,0x43,0x3e,0x82,0xe0,0xf, 0x8c,0x9b,0x7f,0x82,0xf0,0x0, 0x15,0x81,0x7e,0x85, +0xf0,0x0, 0x14,0x80,0xf7,0xff,0x17,0x7a,0xf0,0x0, 0x10,0x6, 0x67,0x5, 0xe2,0x0, +0xcf,0x0, 0xe0,0x1, 0x4, 0x23,0xe8,0x43,0x3f,0x8b,0xf0,0x0, 0x13,0x80,0xf8,0x6, +0x3b,0x2a,0xf0,0x38,0x3f,0x1f,0xe8,0x31,0x3f,0x90,0xc7,0x86,0xf0,0x8, 0x33,0x21, +0xf0,0x40,0x3a,0xe2,0xf8,0x40,0x3a,0x67,0xe0,0x43,0x38,0x96,0x7f,0x87,0xe8,0x43, +0x3d,0x5, 0xe8,0xf, 0x3d,0x3d,0xe8,0xf, 0x3f,0x96,0x37,0xa1,0xe8,0xf, 0x3f,0x9c, +0xf0,0x0, 0x91,0xf, 0x24,0xb2,0xe0,0x5, 0x3d,0x22,0xe8,0x40,0x3e,0x69,0x35,0x21, +0xe8,0x40,0x3f,0xe9,0xe0,0x43,0x3a,0x15,0x0, 0x8e,0xe2,0x0, 0xcb,0x1, 0x2, 0x22, +0xe2,0x0, 0xca,0x0, 0xe0,0x0, 0x5, 0x5d,0xe2,0x0, 0xca,0x81,0x2, 0x1b,0x3f,0xf9, +0x3e,0x6f,0x3, 0x1b,0x17,0x1e,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x1e,0xe0,0xd, +0x36,0x21,0x3f,0x7a,0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x4, 0x71,0xe0,0x7, +0x8f,0x6d,0x3c,0x7e,0x4, 0x6d,0xe2,0x0, 0xc8,0x80,0x2, 0x60,0xe3,0xff,0xc8,0xff, +0x3, 0x60,0x3e,0x79,0xe0,0x0, 0x4, 0x43,0xe8,0x40,0x39,0xf2,0xe0,0x1, 0x2, 0x4e, +0xe8,0x43,0x3f,0x87,0xf0,0x2e,0x3f,0x1f,0x2f,0x13,0xf0,0x0, 0x2c,0x12,0xe8,0x2e, +0x3f,0x90,0x2f,0xe, 0xf0,0x0, 0x28,0x8d,0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0x66,0x87, +0xe0,0x1, 0x1f,0x4a,0x3f,0x9d,0x37,0xa1,0x3f,0x9e,0xf0,0x0, 0xb1,0xf, 0xf0,0x0, +0xc2,0x1, 0xf3,0xff,0xc2,0x7f,0x17,0xff,0xe8,0xf, 0x3f,0x95,0xf1,0xff,0xc3,0xff, +0xe2,0x1, 0xc7,0xff,0xf2,0x1, 0xc3,0xff,0xf0,0x0, 0x22,0x99,0xf0,0x40,0x3a,0xef, +0xe7,0xff,0x0, 0x97,0xe3,0xff,0xca,0x7f,0xe7,0xfd,0x3, 0x79,0xe7,0xfe,0x0, 0x91, +0x67,0x82,0xe2,0x0, 0xcf,0x81,0xe7,0xfe,0x5, 0xad,0xe7,0xfe,0x0, 0xb6,0xe3,0xff, +0xca,0x7f,0xe7,0xff,0x3, 0x26,0x3e,0x79,0x3, 0x40,0xf0,0x0, 0x22,0xf, 0xf0,0x0, +0xc3,0x1, 0x66,0x86,0xf2,0x1, 0xc3,0x7f,0xe8,0x40,0x3e,0xf6,0xf0,0x0, 0xc5,0x81, +0xf2,0x1, 0xc5,0xff,0xe7,0xfe,0x2, 0xdc,0xe8,0x40,0x39,0x73,0xe7,0xfc,0x3, 0x78, +0x66,0x84,0xe0,0x1, 0x1f,0x72,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, 0x13,0x1, 0x8e,0x8d, +0xf0,0x16,0x3b,0x12,0xf0,0x0, 0xa6,0x8e,0xf0,0x0, 0x8f,0x5f,0xe0,0x1e,0x8d,0x3b, +0x7e,0x82,0xf2,0x1, 0xc3,0x7f,0x12,0x1, 0xf0,0x0, 0x10,0x80,0xf7,0xff,0x11,0x7a, +0xf0,0x0, 0x11,0x86,0x67,0x3, 0xe8,0x40,0x3f,0x76,0xe7,0xfc,0x5, 0xd9,0xe0,0x43, +0x38,0x84,0xe8,0x10,0x3b,0xaa,0xf0,0x3c,0x39,0x11,0xe8,0x3b,0x38,0x93,0xe0,0x17, +0x33,0xa1,0xe8,0x40,0x3c,0x66,0x13,0x1, 0x12,0x80,0xf8,0x43,0x3a,0x90,0xc0,0x86, +0xe8,0xf, 0x3c,0x3e,0x3f,0x97,0x37,0xa1,0xe8,0xf, 0x3f,0x9d,0xf0,0x0, 0x94,0xf, +0xe0,0x0, 0x25,0x51,0xe0,0x19,0x3c,0x22,0xe0,0x9, 0x34,0x21,0xe8,0x40,0x3e,0x61, +0xe8,0x40,0x3f,0xe1,0xf8,0x43,0x3a,0x19,0x0, 0x8d,0xf2,0x0, 0xc8,0x1, 0x2, 0x23, +0xf2,0x0, 0xca,0x0, 0x5, 0x39,0xf2,0x0, 0xcc,0x81,0x2, 0x1d,0x3f,0xfa,0x3e,0x6f, +0x3, 0x39,0xe0,0x0, 0x17,0x5a,0x3f,0x1c,0x37,0x21,0x3f,0x1b,0x8f,0x3e,0xe0,0xd, +0x36,0x21,0x3f,0x79,0xc7,0x81,0x3e,0x9b,0xe0,0x43,0x3f,0x8f,0x2, 0x70,0xe0,0x17, +0x8f,0xd, 0xf0,0x40,0x3b,0xfe,0x4, 0x6b,0xf2,0x0, 0xca,0x80,0x2, 0x5f,0xf3,0xff, +0xca,0xff,0x3, 0x5f,0x3e,0x7a,0x3, 0x1e,0xe7,0xfc,0x22,0x8a,0xc3,0x81,0x66,0x86, +0xe2,0x1, 0xc3,0xff,0x3e,0xf7,0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0xe7,0xff,0x2, 0xa4, +0xc0,0x1c,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x67,0x82,0xe2,0x0, 0xcf,0x81,0xe7,0xfe, +0x5, 0xcc,0xe7,0xfe,0x0, 0xec,0xf3,0xff,0xca,0x7f,0x4, 0x65,0x3f,0xfa,0x3e,0x6f, +0x4, 0x49,0xe8,0x40,0x39,0xf8,0x2, 0x26,0xe0,0x43,0x3f,0x86,0xf0,0x2e,0x39,0x1f, +0x2f,0x12,0xf0,0x0, 0x2e,0x11,0xe8,0x2e,0x3f,0x93,0x2f,0xd, 0xf0,0x0, 0x2d,0x8c, +0xc7,0x86,0xe4,0x0, 0xc7,0x8d,0xe0,0x1, 0x1e,0xca,0x3f,0x91,0x37,0xa1,0x3f,0x9d, +0xf0,0x0, 0xb4,0xf, 0xc2,0x81,0xe3,0xff,0xc2,0xff,0xc4,0x1, 0x67,0x83,0xe2,0x1, +0xc4,0x7f,0x3f,0xf8,0xc3,0x1, 0xe2,0x1, 0xc3,0x7f,0xe7,0xff,0x2, 0x83,0xe7,0xff, +0x0, 0xbd,0x67,0x2, 0xe2,0x0, 0xcf,0x1, 0x5, 0xf1,0xe7,0xff,0x0, 0xb7,0xf0,0x0, +0x61,0x83,0xf1,0xff,0xc1,0xff,0xe7,0xfb,0x0, 0xb5,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xc0,0x70,0x3b,0xe8,0xe0,0x1, 0x1c,0x4a,0xe0,0x0, 0x4a,0xcf,0x39,0x6a,0xf0,0x40, +0x3c,0x69,0xe0,0x2, 0x15,0x52,0x14,0x80,0x39,0xec,0x3a,0x6d,0x3b,0x6b,0xe0,0x5, +0xd8,0x2b,0x3d,0xe5,0x3d,0x62,0x3c,0xe4,0x3c,0x63,0xdc,0xbf,0xe0,0x2, 0x1f,0xda, +0x8f,0x8f,0x27,0x87,0xe0,0x2, 0x1f,0xdd,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x11, +0x3c,0x65,0xda,0xa5,0x3c,0xe4,0x3c,0x63,0xd9,0x2e,0x3d,0xe6,0x3d,0x62,0xe8,0x40, +0x3c,0xe8,0x3c,0x67,0xc0,0x10,0xf8,0x0, 0xf, 0x28,0xb, 0xa1,0xe7,0x76,0x0, 0x84, +0xe0,0x0, 0x1f,0x8e,0xf0,0x2, 0x1f,0x5e,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x5, +0xe0,0x3, 0x1f,0x9c,0x8f,0x8f,0x27,0xe5,0xf0,0x0, 0x15,0x8a,0xf0,0x1b,0x3d,0xb6, +0x3c,0xe4,0x3c,0x63,0xd9,0x10,0xf0,0x0, 0x1e,0xd, 0xf0,0x0, 0x14,0xfc,0x3d,0x62, +0x3d,0xe6,0xe8,0x40,0x3c,0xe8,0x3c,0x67,0xf8,0x19,0x3c,0x9b,0xef,0xfb,0xda,0xe4, +0xf8,0x19,0x3c,0x9c,0xe8,0x0, 0x8f,0xd9,0x3c,0x65,0x7f,0x81,0xe8,0x0, 0x8f,0xe9, +0xf8,0x0, 0x9d,0x9, 0x7f,0x82,0xe8,0x0, 0x8f,0xf9,0xe8,0x0, 0x9a,0x99,0x7f,0x83, +0xe8,0x1, 0x8f,0x89,0xf8,0x0, 0x8e,0xc9,0x7f,0x84,0xda,0x61,0x3c,0xe4,0x3c,0x63, +0xd8,0xea,0x3d,0x62,0x3d,0xe6,0xe8,0x40,0x3c,0xe8,0x3c,0x67,0xef,0xfb,0xda,0xc4, +0xe8,0x0, 0x9c,0x8e,0xe8,0x0, 0x9d,0x1e,0xf0,0xe, 0x3d,0x29,0xe3,0xff,0xc7,0x7f, +0xf8,0xb, 0x3e,0x1b,0xe0,0x43,0x3e,0x9e,0xe0,0x7, 0x99,0xeb,0xe0,0xb, 0x3a,0xaa, +0xe2,0x0, 0xce,0x80,0xe3,0xff,0xc5,0xff,0xe8,0xd, 0x3c,0xaa,0xf8,0xf, 0x3e,0x1b, +0xe0,0x43,0x3a,0x1b,0xe0,0x7, 0x99,0x7f,0xe3,0xff,0xc6,0xff,0xe0,0xf, 0x39,0xa9, +0xe0,0x6e,0x3d,0x2d,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xca,0x0, 0xe0,0x8, 0x3d,0x25, +0xe0,0x43,0x3a,0x1f,0xe3,0xff,0xc4,0x7f,0xe0,0xd, 0x39,0x2a,0xe0,0x6b,0x3d,0x28, +0xe3,0xff,0xc6,0xff,0xe2,0x0, 0xca,0x0, 0x3c,0xa3,0xe0,0x43,0x3c,0x1d,0xe3,0xff, +0xc4,0xff,0xe0,0x6f,0x3d,0x29,0x3d,0x22,0xe2,0x0, 0xcc,0x0, 0xe3,0xff,0xc5,0x7f, +0xe0,0x6d,0x3d,0x2a,0x3f,0x1b,0x3f,0x9d,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc7,0xff, +0x3f,0x7f,0x3, 0x93,0x67,0x81,0xf8,0x0, 0xb5,0x9, 0xe8,0x0, 0xaf,0xd9,0x67,0x82, +0xe8,0x0, 0xb2,0x99,0xe8,0x0, 0xaf,0xe9,0x67,0x83,0xf8,0x0, 0xae,0xc9,0xe8,0x0, +0xaf,0xf9,0x67,0x84,0xe8,0x1, 0xaf,0x89,0xc0,0x10,0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x6c,0xe0,0x2, 0x1f,0xdd,0xf0,0x0, 0x1e,0xe, +0x8f,0x8f,0x2f,0x9f,0xea,0x12,0x7a,0x3, 0xf8,0x0, 0x8d,0x8c,0xaf,0x84,0xf0,0x0, +0x25,0xa1,0x17,0x1, 0xaf,0x4, 0x17,0x4, 0xe1,0x2f,0x3f,0x2f,0x2f,0x9a,0x17,0x82, +0xe9,0x2f,0x3f,0xab,0x2f,0x96,0xe0,0x1, 0x1f,0x69,0xea,0x12,0x79,0x82,0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0xaf,0x83,0x1, 0x19,0xc0,0x14,0xf8,0x0, 0xf, 0x28,0xb, 0xe1, +0xf8,0x0, 0x8d,0x8c,0xf0,0x0, 0x2d,0xed,0xea,0x12,0x7a,0x3, 0xf0,0x0, 0xad,0x84, +0xea,0x12,0x79,0x82,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0x17,0x1, 0xe2,0x0, 0xcf,0x81, +0xaf,0x3, 0x1, 0xeb,0xf0,0x0, 0x25,0xea,0xf0,0x0, 0x15,0x80,0xf0,0x3, 0x1e,0x9c, +0xe0,0x0, 0x1b,0xd, 0xe0,0x2, 0x1a,0xfd,0xf0,0x1, 0x1c,0x72,0xf0,0x1, 0x1c,0xd7, +0xf0,0x1, 0x1d,0x44,0xe0,0x2, 0x1b,0xff,0xe8,0x40,0x39,0x6b,0x0, 0x90,0x8f,0x87, +0x3f,0xf2,0x1, 0x10,0xf0,0x0, 0xc5,0x81,0xf2,0x1, 0xc5,0xff,0xc1,0x1, 0xe8,0x0, +0x8f,0x8c,0xe2,0x1, 0xc1,0x7f,0x3f,0xf2,0xe0,0x0, 0x5, 0xc8,0xe8,0x0, 0x8f,0x8d, +0x2f,0xef,0xe0,0xe, 0x31,0x21,0x3f,0x16,0x8e,0xe, 0x8f,0xd5,0x8e,0x9e,0x3f,0xbc, +0xe8,0x0, 0xa7,0x8, 0x3f,0x9d,0x37,0xa1,0x3f,0x9e,0x97,0xf, 0xe8,0x0, 0x97,0xa9, +0x3f,0x7f,0x4, 0x65,0x8f,0x83,0x2f,0xb7,0x17,0x83,0xe8,0x3, 0x8d,0xb9,0x6f,0x96, +0x6f,0x97,0x25,0xbd,0x17,0x84,0x14,0x84,0x6f,0x96,0x3c,0x69,0x6f,0x97,0xe8,0x40, +0x3d,0xeb,0x3d,0x62,0xef,0xfb,0xdb,0xf2,0xe8,0x0, 0x8f,0x8a,0xe2,0x0, 0xcf,0x81, +0x1, 0xca,0x17,0x8a,0xe8,0xf, 0x3f,0xbb,0x3f,0x96,0xe0,0x7, 0x9e,0xef,0xe0,0x7, +0x97,0x7f,0xe0,0x7, 0xb6,0xff,0xe0,0x7, 0xb7,0x6f,0xe7,0xff,0x0, 0xbd,0xea,0x12, +0x7a,0x3, 0x87,0x4, 0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x32,0xe7,0xfe, +0x5, 0xf3,0x17,0x32,0xe7,0xfe,0x0, 0xf0,0xf8,0x0, 0xad,0x8c,0xc0,0x14,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0x8f,0x4, 0x14,0x86,0x17,0x86,0x7f,0x1, 0xe8,0x40,0x3d,0xeb, +0x3d,0x62,0x3c,0x69,0x6f,0x96,0x6f,0x97,0xde,0x79,0x0, 0xcf,0x8f,0xf5,0x3c,0xed, +0x3c,0x6c,0x3d,0x62,0x7f,0x84,0x7e,0x3, 0x7e,0x82,0xf0,0x0, 0x8f,0x65,0xef,0xfb, +0xd9,0x34,0xe8,0x0, 0x8f,0x8c,0x66,0x3, 0xe2,0x0, 0xcf,0x83,0x66,0x82,0x5, 0x84, +0x17,0x82,0x6f,0x96,0x6f,0x97,0xe2,0x1, 0xcc,0x7f,0x1, 0x4, 0x17,0x82,0x6f,0x96, +0x6f,0x97,0xe2,0x0, 0xce,0x1, 0x5, 0x86,0xf1,0xff,0xc7,0x7e,0xe8,0x40,0x3e,0x7e, +0x4, 0x3, 0x17,0x82,0x6f,0x96,0xe2,0x0, 0xce,0x81,0x5, 0x85,0x67,0x84,0xc7,0xfe, +0x3e,0xff,0x4, 0x3, 0x17,0x82,0x6f,0x97,0x14,0x96,0x3c,0x90,0x3c,0x62,0xe2,0x0, +0x7d,0x17,0xef,0xff,0xd7,0x7, 0x4c,0x16,0x4c,0x97,0xe7,0xff,0x0, 0x92,0x8f,0x8, +0x3f,0xe8,0x3f,0x79,0x2, 0x8c,0x8f,0x28,0x14,0x0, 0x3f,0x79,0x5, 0x89,0x8f,0x1f, +0x3f,0x7a,0x2, 0x86,0x8c,0x3f,0xe1,0x28,0x3c,0x1a,0x38,0x82,0x14,0x0, 0x38,0x82, +0xe0,0x2, 0x1f,0x42,0x9f,0x88,0x9e,0x8e,0x3f,0xfd,0x2, 0x84,0x17,0x80,0xb7,0x88, +0x38,0x82,0x9f,0xe, 0x3f,0xae,0xb7,0x88,0x38,0x82,0x8, 0xb1,0xc0,0x68,0xe4,0x0, +0x17,0x80,0xe0,0x2, 0x1e,0xfd,0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd, +0x3d,0x1f,0xe0,0xf, 0x34,0x41,0x7f,0x1, 0x34,0xc1,0x7f,0x6, 0x35,0x41,0x7f,0x85, +0xe2,0x0, 0x7c,0x4, 0x17,0x90,0x7f,0x2, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, +0x77,0x8c,0xe0,0x5, 0xd0,0x3a,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, +0x1e,0xfd,0xe4,0x0, 0x17,0x80,0x17,0x0, 0x86,0x5d,0x3c,0x1f,0x86,0xcd,0x3c,0x9f, +0x3d,0x1f,0x7f,0x1, 0xe0,0xf, 0x34,0x41,0x34,0xc1,0x35,0x41,0xe2,0x0, 0x7c,0x4, +0x7f,0x2, 0x7f,0x6, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x7d,0x4, 0x7f,0x85,0x6d,0x87, +0xe0,0x5, 0xd0,0x1b,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe4,0x0, 0x17,0x80, +0xe0,0x2, 0x1e,0xfd,0x3c,0x1f,0x17,0x0, 0x86,0x5d,0x3c,0x9f,0x86,0xcd,0xe0,0xf, +0x34,0x41,0x7f,0x1, 0x34,0xc1,0x7f,0x6, 0xe2,0x0, 0x7c,0x4, 0x7f,0x85,0x17,0xa0, +0x7f,0x2, 0x7f,0x4, 0x6e,0x5, 0x6e,0x84,0x7c,0x83,0x77,0x8c,0xe0,0x4, 0xdf,0xfd, +0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xe1,0xff,0xc0,0x18,0xe0,0x1, 0x1f,0x57,0xe0,0x2, +0x1e,0xfd,0xe4,0x0, 0x17,0x80,0xe2,0x0, 0x7d,0xae,0x3c,0x1f,0xf0,0x0, 0x93,0x2e, +0xf0,0x0, 0x93,0xbe,0x95,0x7e,0x3f,0x9b,0xe0,0x1, 0x95,0x8e,0xe0,0x1, 0x1f,0x79, +0xf0,0x0, 0x82,0x4d,0xf0,0x0, 0x82,0xdd,0x16,0x1, 0xe0,0xd, 0x34,0x41,0x37,0xc1, +0x37,0x41,0xe2,0x0, 0x7c,0x14,0xe2,0x0, 0x7c,0x84,0x7e,0x86,0x7f,0x88,0x7f,0x7, +0x75,0x95,0x6e,0x16,0x6e,0x17,0xf0,0x0, 0x6a,0x15,0xf0,0x0, 0x6a,0x94,0xf0,0x0, +0x73,0x12,0xf0,0x0, 0x73,0x93,0x75,0x14,0xe0,0x5, 0xd0,0x27,0x5c,0x7, 0x5f,0x5, +0xe0,0x43,0x3f,0x98,0xe2,0x0, 0xcf,0x80,0xe0,0x41,0x3e,0x4f,0xe0,0x43,0x3e,0x9e, +0x3d,0xe8,0xe0,0x6b,0x3d,0x2c,0xe2,0x0, 0xce,0x80,0x5, 0x13,0x3d,0xfe,0x5, 0xd, +0xe0,0x41,0x3f,0x48,0xe2,0x0, 0xcf,0x80,0x3f,0xee,0xe3,0xff,0xc7,0xff,0xe0,0x68, +0x3d,0x2f,0xe0,0x0, 0xc0,0x68,0x8, 0xe1,0x3c,0x6e,0xe0,0x0, 0xc0,0x68,0x8, 0xe1, +0xe0,0x41,0x3e,0xcd,0x3d,0xfd,0x2, 0x6d,0xe0,0x41,0x3c,0x4e,0xe3,0xff,0xc4,0x7f, +0xe0,0x0, 0xc0,0x68,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, 0x1f,0x7d,0xe4,0x0, +0x17,0x80,0x16,0x80,0x3c,0x9f,0xf0,0x0, 0x81,0xde,0xf0,0x0, 0x82,0x4e,0x3f,0x98, +0xe0,0x16,0x35,0x41,0xe0,0x17,0x35,0x42,0x17,0x1, 0x7e,0x81,0xe0,0x15,0x34,0xc1, +0x7e,0x86,0x3f,0x5a,0x37,0xc1,0xf2,0x0, 0xc3,0x1, 0xf2,0x0, 0xc3,0x81,0x3d,0x6c, +0x3c,0xeb,0xe2,0x0, 0x7c,0x4, 0x7e,0x82,0x7e,0x84,0xf0,0x0, 0x69,0x85,0xf0,0x0, +0x6a,0x4, 0xf0,0x0, 0x7a,0x83,0x7f,0x85,0x6f,0x7, 0xf0,0x0, 0x6b,0x1a,0xf0,0x0, +0x6b,0x9b,0xe0,0x5, 0xd2,0x16,0xc0,0x18,0x8, 0xe1,0x8, 0xb1,0xc0,0x68,0xe0,0x2, +0x1f,0x7d,0x17,0x80,0x86,0x5e,0x86,0xce,0xe9,0xff,0xc4,0x7e,0x7f,0x81,0xe0,0xe, +0x34,0x41,0xe2,0x0, 0x7c,0x4, 0x7f,0x82,0x7f,0x84,0x7f,0x85,0x7f,0x86,0x6e,0x5, +0x6e,0x84,0x7f,0x3, 0xe0,0x5, 0xd2,0x9a,0xc0,0x18,0x8, 0xe1,0x8, 0xb2,0xc0,0x70, +0xf0,0x1, 0x1b,0xe6,0xf0,0x1, 0x1a,0xe5,0xe0,0x1, 0x19,0x78,0xe4,0x0, 0x17,0x80, +0xe0,0x1, 0x1f,0x7f,0xf0,0xc, 0x3a,0x9f,0xf0,0xd, 0x3b,0x9f,0xe8,0x0, 0xb4,0x5, +0x3f,0x92,0xf0,0x99,0x12,0xd6,0xf0,0x0, 0x13,0x1, 0xf0,0x15,0x3a,0x9e,0x36,0x41, +0x36,0xc1,0x37,0xc1,0xe0,0x99,0xc7,0x7e,0xe2,0x0, 0x7c,0x4, 0x7e,0x2, 0x7e,0x83, +0x7f,0x84,0xf0,0x0, 0x6b,0x4, 0xf0,0x0, 0x6b,0x5, 0xe8,0x0, 0xb4,0x85,0xe8,0x0, +0xb5,0x7, 0xb5,0x8e,0xe0,0x5, 0xd0,0xa, 0x9c,0x2, 0xc0,0x10,0x9, 0x61,0xe0,0x3, +0x1f,0xc7,0x8f,0x8f,0xe2,0x0, 0xcf,0x83,0x1, 0x3, 0x14,0x1, 0x38,0x82,0x8, 0xb2, +0x39,0x68,0x3c,0x69,0xef,0xff,0xd3,0x51,0xe0,0x2, 0x1f,0x93,0xe0,0x1, 0x8f,0x1f, +0xe2,0x0, 0xcf,0x5, 0x24,0x7, 0x1, 0x8, 0xe0,0x1, 0x8c,0x1f,0xe0,0x28,0x39,0x8, +0x9, 0x61,0x1, 0xfb,0x0, 0xfc,0xe2,0x1, 0xc1,0x7d,0x14,0x0, 0x29,0x7a,0xea,0x12, +0x7f,0xa2,0x8e,0xf, 0x17,0x1, 0x3f,0x1c,0xe0,0x1, 0x1e,0xc6,0xe2,0x1, 0xc7,0x7f, +0xe2,0x0, 0xcf,0x3, 0x3e,0x9c,0x8c,0xd, 0x2, 0x83,0xaf,0xf, 0x9, 0x61,0xa9,0xf, +0x9, 0x61,0xe0,0x3, 0x1f,0xac,0xe4,0x0, 0xc4,0x8e,0xe0,0xe, 0x3f,0x99,0x8f,0x1e, +0x27,0x5, 0x17,0x1, 0xe0,0x2e,0x3c,0xe, 0x2f,0xd, 0x3f,0x99,0x8f,0xbf,0x27,0x89, +0x17,0x84,0xe0,0x28,0x3c,0xf, 0x24,0x5, 0xe0,0x1, 0x1f,0xe9,0x17,0x0, 0xaf,0xf, +0x38,0x82,0xe0,0x1, 0x1f,0x69,0x16,0x80,0xae,0x8e,0x0, 0xf0,0x8, 0xb7,0xe0,0x2, +0x1b,0xc8,0x89,0x87,0xef,0xfe,0xd1,0x3, 0x24,0x7e,0xe0,0x0, 0x19,0x3b,0xe0,0x2, +0x8a,0x2, 0xe0,0xf, 0x39,0x14,0xe0,0x6, 0x8b,0xf, 0x8f,0x4f,0x2f,0x1f,0xe0,0x1, +0x1a,0xe9,0x8f,0x85,0xe2,0x0, 0xcf,0x81,0x1, 0x3f,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f, +0xe2,0x0, 0xcf,0x83,0x1, 0x39,0xe0,0x2, 0x8f,0x2, 0xe0,0x2, 0x8f,0x92,0x3f,0x7f, +0xe0,0x0, 0x3, 0xe6,0xef,0xff,0xd2,0xac,0xef,0xff,0xd2,0xb6,0x24,0x6, 0xe0,0x2, +0x1f,0xe6,0x8f,0x8f,0xe0,0x0, 0x2f,0xd7,0xb, 0xe1,0x8f,0x4f,0xe0,0x2, 0x1e,0x93, +0xc7,0x7f,0xe0,0x5, 0xaf,0x3d,0x8f,0xcf,0xe0,0x1, 0x1a,0xe9,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x1, 0x5e,0x17,0x0, 0xaf,0x5, 0xe0,0xf, 0x39,0x14,0x17,0x0, 0xaf,0x4f, +0x3c,0x66,0xe0,0x1, 0x89,0x9f,0x3c,0xe3,0xef,0xfb,0xdb,0xa2,0x3c,0xe3,0x3c,0x64, +0xe0,0x0, 0xdb,0xf3,0xe0,0x2, 0x8f,0x82,0xc7,0x81,0xe0,0x2, 0xaf,0x82,0x8f,0x85, +0xe2,0x0, 0xcf,0x81,0x1, 0xc3,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x27,0xc5,0xe2,0x0, +0xcb,0x5, 0xe0,0x0, 0x1, 0x40,0x17,0x5, 0x3f,0x33,0xe0,0x3, 0x1f,0xb0,0x3f,0x9e, +0x8c,0xcf,0xe0,0x1, 0x1f,0xf1,0xa4,0xf, 0xef,0xfe,0xd1,0xca,0x3c,0xe3,0x3c,0x66, +0xdf,0x47,0x3a,0x68,0x3c,0xe3,0x3c,0x66,0xe0,0x0, 0xda,0x4c,0x2a,0x2f,0xe2,0x0, +0xcb,0x4, 0xe7,0xff,0x1, 0xaa,0xe0,0x2, 0x1f,0x12,0x9f,0x8e,0x37,0xcf,0xe7,0xff, +0x27,0xa4,0x97,0x8e,0xe2,0xff,0xc7,0xff,0xb7,0x8e,0x17,0x80,0xaf,0x85,0xe7,0xff, +0x0, 0x9c,0x3c,0xe6,0x3c,0x63,0xb, 0xa1,0xe0,0x1c,0x0, 0xd4,0xef,0xfe,0xd9,0xba, +0xac,0x5, 0xe0,0x1, 0xd8,0x43,0xe0,0x1, 0xd7,0x8d,0xef,0xff,0xd2,0xf7,0x8c,0x7, +0xe0,0x0, 0xdd,0xf3,0xef,0xfd,0xdf,0xff,0xe7,0xff,0x0, 0x8e,0xaf,0x85,0xe7,0xff, +0x0, 0xa5,0x17,0x0, 0xaf,0x5, 0xe7,0xff,0x0, 0x80,0xef,0xfb,0xdb,0x7b,0x3c,0xe3, +0x3c,0x66,0xe0,0x0, 0xdd,0x7f,0xe0,0x1, 0x1f,0xe8,0xab,0xf, 0xe0,0x2, 0x1f,0x93, +0xe0,0x5, 0xab,0x4f,0xe0,0x3, 0x1f,0x8f,0xa9,0x8f,0x0, 0xc2,0x8, 0xb3,0xe0,0x0, +0x19,0xbb,0x11,0x0, 0xdf,0x4c,0xc1,0x1, 0xe0,0x2, 0x8f,0x93,0xe2,0x1, 0xc1,0x7f, +0x39,0x7f,0x4, 0xf9,0xe0,0x2, 0x1f,0x93,0xe0,0x5, 0x8c,0x4f,0xe0,0x3, 0x1f,0x8f, +0x8c,0x8f,0x9, 0xa1,0xe7,0x76,0x0, 0xa4,0xe0,0x1, 0x1f,0x42,0xe0,0x2, 0x1f,0x93, +0xe0,0xe, 0x85,0x9e,0x16,0x0, 0xae,0xf, 0x15,0x2, 0xad,0xaf,0xe0,0x2, 0x1e,0xe6, +0xe0,0xe, 0x85,0xae,0x8e,0x8d,0xad,0xbf,0x3d,0x5d,0xe0,0xe, 0x85,0xde,0xe0,0x3, +0xad,0xef,0x2d,0x2d,0xe0,0x10,0x86,0x5e,0xe0,0x10,0x85,0xee,0x3e,0x1b,0xe0,0x2, +0xae,0x6f,0xe0,0xe, 0x86,0x6e,0xe0,0x3, 0xae,0x7f,0x16,0x3f,0x3e,0x5d,0xe0,0x11, +0x8e,0x8e,0xe0,0x10,0x8d,0xfe,0x36,0xa6,0x3e,0xcc,0xe0,0xc, 0x35,0xa7,0x3e,0xcc, +0xe0,0x4, 0xae,0xef,0x2d,0x9b,0xe0,0xd, 0x86,0x5e,0xe0,0xd, 0x86,0xfe,0xe0,0xa, +0xae,0xf, 0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x2d,0x72,0xe0,0xd, 0x85,0xee,0xe0,0xe, +0x87,0xe, 0xe0,0xa, 0xad,0xaf,0xe0,0xa, 0xaf,0x3f,0x0, 0x97,0xe0,0x10,0x85,0xde, +0xe0,0x2, 0xad,0xef,0xe0,0x3, 0xae,0x7f,0x0, 0xd9,0xe0,0xd, 0x86,0x6e,0xe0,0xe, +0x86,0x8e,0xe0,0xa, 0xae,0xf, 0xe0,0xa, 0xae,0x9f,0xe0,0x0, 0x25,0x4e,0x17,0x0, +0xe0,0xa, 0xaf,0x2f,0xe0,0xa, 0xaf,0x3f,0x17,0x0, 0xe0,0x1, 0x1e,0x8e,0xe0,0x2, +0x1e,0x44,0x86,0x8d,0x15,0x81,0xae,0xdf,0xaf,0x6f,0xe0,0x1, 0xaf,0x3f,0xe0,0x2, +0xaf,0xf, 0xe0,0x0, 0x1e,0xcd,0xe0,0x1, 0xaf,0x7f,0x86,0x8d,0xe0,0x1, 0xae,0xcf, +0xe0,0x1, 0xaf,0x5f,0x86,0xbc,0xe0,0x1, 0xaf,0x6f,0x87,0x4c,0xe0,0x4, 0xae,0x8f, +0xe0,0x4, 0xaf,0x1f,0xe0,0x1, 0x1f,0xd, 0x86,0x5c,0x8e,0x8e,0xe0,0x1, 0x1f,0xc, +0xe0,0x4, 0xae,0x2f,0x36,0xa8,0xe0,0x3, 0x1e,0xe, 0x8f,0xe, 0x86,0x1c,0x3f,0x4d, +0xe0,0x3, 0x1e,0xc3,0xe0,0x5, 0xae,0x1f,0xe0,0x6, 0xad,0x8f,0x8e,0x8d,0xe0,0x5, +0xb7,0x5f,0x26,0xa2,0xe0,0x3, 0x1f,0x38,0xa7,0xe, 0xa7,0x4e,0xe2,0x0, 0xc7,0x1, +0x27,0x1b,0x16,0x85,0xe0,0x1, 0xae,0x9f,0x17,0x0, 0xe0,0x2, 0xaf,0x5f,0xe0,0x2, +0xaf,0x1f,0xaf,0x4f,0x38,0x82,0xe0,0xd, 0x85,0xde,0xe0,0xd, 0x87,0x7e,0xe0,0xa, +0xad,0xaf,0xe0,0xa, 0xaf,0x3f,0xe7,0xff,0x0, 0xb1,0xe0,0xa, 0xad,0xaf,0xe0,0xa, +0xad,0xbf,0xe7,0xff,0x0, 0xab,0x16,0x0, 0xe0,0x1, 0xae,0x1f,0x17,0x0, 0xe0,0x2, +0xaf,0x5f,0xe0,0x2, 0xaf,0x1f,0xaf,0x4f,0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1f,0x76, +0x34,0xa6,0xf0,0x2, 0x1b,0xf5,0x3c,0x19,0x17,0x80,0xb4,0xe, 0x17,0x0, 0x3d,0xef, +0xe8,0x0, 0xaf,0x7, 0x3e,0xef,0x15,0x1, 0xe0,0xe, 0x34,0x1f,0x16,0x1, 0xe2,0x0, +0xc7,0x1, 0xc7,0x81,0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0xea, +0xe2,0x0, 0xcf,0x8c,0x1, 0xf2,0x2d,0x82,0x38,0x82,0xe8,0x0, 0xae,0x87,0x38,0x82, +0x8, 0xb1,0xf0,0x2, 0x1b,0xfd,0xe0,0x1, 0x1c,0x8b,0xe8,0x40,0x3c,0x67,0xe0,0x19, +0x15,0x1c,0xe0,0x5, 0xd2,0xef,0xe0,0x2, 0x1f,0xe6,0xf0,0x40,0x3b,0xe8,0x87,0x8f, +0xe2,0x0, 0xc7,0x82,0x2f,0xbe,0xe0,0x3, 0x8e,0x98,0xe0,0x3, 0x8f,0x88,0x97,0x58, +0x96,0x68,0x3f,0x9d,0xe0,0x2, 0x1e,0xfc,0x3f,0x1c,0xb7,0xd, 0xe0,0x2, 0x1f,0x74, +0xb7,0x8e,0x17,0x80,0xe0,0x1, 0x1e,0xc2,0xe0,0x2, 0x1c,0x75,0xe0,0xe, 0x8f,0x6d, +0xe0,0xe, 0x8d,0xdd,0x37,0x26,0x3d,0x9e,0xe0,0x2, 0x1f,0x76,0x3d,0x6f,0xb5,0x8e, +0x17,0x0, 0xaf,0x8, 0x3e,0xef,0x14,0x81,0xe0,0xe, 0x35,0x9f,0x16,0x1, 0xe2,0x0, +0xc7,0x1, 0xc7,0x81,0x3e,0x1d,0x27,0x5, 0x3e,0xec,0xe2,0x1, 0xc6,0xff,0x3d,0x69, +0xe2,0x0, 0xcf,0x8c,0x1, 0xf2,0x2d,0x1f,0xe0,0x1, 0x1f,0xc4,0x8f,0x8f,0x27,0x93, +0xe8,0x0, 0x8f,0xc7,0xe0,0x2, 0x1f,0x73,0x37,0xa6,0xc7,0xff,0xb7,0x8e,0x8, 0xe1, +0xe0,0x2, 0x1f,0xfc,0x96,0xd8,0xe0,0x3, 0x8f,0x8, 0xb6,0x8f,0xe0,0x2, 0x1f,0xf4, +0xb7,0xf, 0x0, 0xc8,0xe8,0x0, 0x8f,0xd7,0xe0,0x2, 0x1f,0x73,0x37,0xa6,0xc7,0xff, +0xb7,0x8e,0x8, 0xe1,0xae,0x88,0x0, 0xe1,0x8, 0xb3,0xe0,0x1, 0x19,0x7f,0xe0,0x1, +0x1f,0xee,0xe0,0xc, 0x11,0xd2,0xe0,0x99,0x16,0xcc,0xe0,0x99,0x17,0x50,0x3e,0x92, +0x3f,0x12,0x3d,0x63,0x3c,0x6f,0x14,0x80,0xbf,0x8d,0xb9,0xe, 0xe0,0x5, 0xd2,0xbc, +0x3d,0x63,0x14,0x80,0x3c,0x62,0xe0,0x5, 0xd2,0xb7,0xe0,0x9c,0xc1,0x16,0x17,0x80, +0xaf,0x82,0x9, 0xe1,0x8, 0xb2,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x17,0x24,0x3f,0x1f, +0xe0,0x1a,0x16,0x25,0xe0,0x1a,0x15,0x2a,0x8e,0x8e,0x3e,0x1f,0x3d,0x1f,0xe0,0x1a, +0x17,0x26,0x8d,0x8c,0x8c,0xa, 0x3f,0x1f,0xe0,0x1a,0x16,0x27,0xe0,0x1a,0x14,0xab, +0xe0,0x1a,0x15,0x2c,0x8f,0xe, 0x3c,0x9f,0x3d,0x1f,0x3e,0x1f,0x36,0xa8,0xe0,0x2, +0x19,0x40,0x8e,0xc, 0x3d,0xcd,0xf0,0x1a,0x13,0xad,0x8e,0x89,0x8c,0x8a,0xe0,0x1a, +0x15,0x34,0xf0,0x17,0x3b,0x9f,0x3d,0x1f,0x37,0x28,0x35,0xc5,0x8d,0xa, 0x3e,0x4e, +0x34,0x28,0xe8,0x0, 0x8f,0x7, 0xe0,0x1a,0xc7,0xb5,0xad,0x82,0x36,0x45,0x8f,0x8f, +0xe0,0xb, 0x34,0xa8,0x3e,0xc8,0xae,0x12,0x36,0xc5,0xe0,0xc, 0x35,0x28,0x3f,0x4b, +0xae,0xa2,0x37,0x45,0x3f,0xcc,0xe0,0x1, 0x1c,0x8a,0xe0,0x2, 0x1c,0x3f,0xaf,0x32, +0x37,0xc5,0xe0,0x0, 0x15,0x6a,0xaf,0xd2,0xe0,0x5, 0xd2,0x2c,0xe0,0x4, 0x8f,0xe2, +0xe0,0x1, 0x1c,0xd3,0xe0,0x41,0x3f,0x8f,0x15,0x20,0xe0,0x22,0x14,0x40,0xe0,0x6, +0xaf,0xc2,0xef,0xfe,0xd6,0xff,0x9, 0x21,0xe0,0x2f,0x0, 0x93,0x8, 0xb6,0xe0,0x1, +0x1f,0xc2,0xe0,0x1a,0x15,0xa8,0xe0,0x1a,0x16,0x2e,0xe0,0x1a,0x16,0xb2,0x3d,0x9f, +0x3e,0x1f,0x3e,0x9f,0xe0,0x1a,0x14,0x2a,0xe0,0x1a,0x14,0xac,0xe0,0x1a,0x15,0x30, +0x8a,0x8b,0x8a,0xc, 0x89,0x8d,0x3c,0x1f,0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x11,0x24, +0xe0,0x1a,0x10,0xa6,0xe0,0x1a,0x15,0xa9,0xe0,0x1a,0x16,0x2f,0xe0,0x1a,0x16,0xb3, +0xf0,0x1a,0x13,0xa5,0xe0,0x1a,0x13,0x27,0xf0,0x0, 0x89,0x88,0xf0,0x0, 0x8a,0x9, +0xf0,0x0, 0x8a,0x8a,0xf0,0x17,0x3b,0x9f,0x3b,0x1f,0x39,0x1f,0x38,0x9f,0x3d,0x9f, +0x3e,0x1f,0x3e,0x9f,0xe0,0x1a,0x14,0x2b,0xe0,0x1a,0x14,0xad,0xe0,0x1a,0x15,0x31, +0xf8,0x0, 0x8b,0x7, 0x89,0x2, 0xf0,0x0, 0x8b,0x86,0x88,0x81,0x8d,0x8b,0x8e,0xc, +0x8e,0x8d,0x3c,0x1f,0x3c,0x9f,0x3d,0x1f,0xe0,0x1a,0x13,0x1a,0xf0,0x1a,0x10,0x1c, +0xf0,0x1a,0x10,0xe4,0xf0,0x1a,0x11,0x1d,0x8c,0x8, 0x8c,0x89,0x8d,0xa, 0x3b,0x1f, +0xf0,0x10,0x38,0x1f,0xf0,0x11,0x38,0x9f,0xf0,0x12,0x39,0x1f,0x32,0xa8,0x32,0x28, +0x31,0xa8,0xe0,0x1, 0x1f,0x57,0x83,0x6, 0xf8,0x0, 0x80,0x0, 0xf8,0x0, 0x88,0x81, +0xf8,0x0, 0x81,0x2, 0x31,0x28,0x30,0xa8,0x3d,0xc5,0xf0,0x13,0x31,0xa8,0xf0,0x14, +0x32,0x28,0x3e,0x44,0xf0,0x15,0x32,0xa8,0x3e,0xc3,0xf0,0x16,0x3b,0x42,0xf0,0x17, +0x3b,0xc1,0xe0,0x41,0x3d,0xcb,0xe0,0x41,0x3e,0x4c,0xe0,0x41,0x3e,0xcd,0xe8,0x8, +0x3c,0x43,0xe8,0x9, 0x3c,0xc4,0xe8,0xa, 0x3d,0x45,0xe0,0x1a,0x12,0x1e,0xe0,0x1a, +0x11,0xb4,0x3a,0x1f,0x39,0x9f,0xb6,0x6e,0xe0,0x1a,0x11,0x1f,0xe0,0x1, 0xb6,0x8e, +0x39,0x1f,0xab,0xe, 0xe0,0x1a,0xc7,0xb5,0xf0,0x0, 0xa8,0x1e,0x10,0x80,0xf0,0x0, +0xb3,0x1e,0xf0,0x0, 0xb3,0xae,0xb5,0xbe,0xb4,0x4e,0xb4,0xde,0xb5,0x7e,0xf0,0x2, +0xa8,0xee,0xf0,0x2, 0xa9,0x7e,0x8d,0x84,0x8e,0x3, 0x8e,0x82,0x8f,0x8f,0x35,0xa8, +0x36,0x28,0x3e,0xcb,0x3f,0xcc,0xe0,0x1, 0xb6,0xce,0xe0,0x1, 0xb7,0x9e,0xe0,0x3, +0xa8,0xae,0xe0,0x3, 0xa8,0xbe,0xb, 0x61,0x8, 0xb1,0xe0,0x0, 0x1c,0xd, 0xe0,0x3, +0x15,0x40,0x14,0x80,0xe0,0x5, 0xd1,0xa0,0xe0,0x1, 0x1f,0xc3,0xe0,0x0, 0x1c,0x4, +0x8d,0xf, 0xe0,0x1, 0x14,0xff,0xe4,0x0, 0xc5,0xa, 0x8, 0xa1,0xe0,0xa3,0x0, 0x94, +0x8, 0xb2,0xe0,0x1, 0x1f,0x8e,0xe0,0x2, 0x1c,0x5e,0x89,0xf, 0xe0,0x1, 0x14,0xff, +0xe4,0x0, 0xc1,0xa, 0x3d,0x62,0xe0,0x5, 0xd1,0x87,0xe0,0x2, 0x1c,0x59,0x3d,0x62, +0xe0,0x1, 0x14,0xff,0xe0,0x5, 0xd1,0x80,0xe0,0x2, 0x1c,0x58,0x3d,0x62,0xe0,0x1, +0x14,0xff,0xe0,0x5, 0xd1,0x79,0xe0,0x2, 0x1c,0x57,0xe0,0x3, 0xd8,0xc3,0xe0,0x2, +0x1e,0xdf,0x17,0x0, 0x3f,0xed,0xe1,0x80,0xb7,0x1f,0xc7,0x82,0xb7,0x1d,0xe1,0x80, +0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xe1,0x80, +0xb7,0x1f,0xe1,0x80,0xb7,0x1f,0xb7,0xf, 0x9, 0x61,0x8, 0xb4,0xdd,0x4e,0xde,0x29, +0xde,0x8c,0xe0,0x1, 0x1f,0xc2,0xe0,0x1a,0x15,0x89,0x3d,0x9f,0xe0,0x3, 0x1f,0x30, +0x82,0xb, 0xe0,0x1b,0x15,0x5e,0x3d,0x1f,0xe0,0x1a,0x16,0xe, 0x8c,0x8a,0x3e,0x1f, +0x84,0x1b,0xaa,0xe, 0xe0,0x1a,0x16,0x93,0x82,0x3b,0xf0,0x0, 0x82,0xab,0xf0,0x0, +0x83,0x4b,0xf0,0x0, 0x83,0x8c,0xe0,0x1b,0x15,0x5f,0x80,0xcc,0x3e,0x9f,0xaa,0x3e, +0x3d,0x1f,0x81,0x9c,0x81,0x3c,0xac,0x1e,0x15,0x85,0x84,0x2c,0x8d,0xa, 0xf0,0x0, +0x80,0xd, 0x3d,0x9e,0xf0,0x0, 0xab,0xde,0x16,0xa, 0xf0,0x0, 0xab,0x4e,0x3e,0x1e, +0xf0,0x0, 0xaa,0xae,0x34,0xa8,0xa8,0xcb,0x3d,0x49,0xf0,0x0, 0x80,0x9d,0xf0,0x0, +0x81,0x2d,0xf0,0x0, 0x81,0xbd,0xf0,0x0, 0x82,0x4d,0xa9,0x3b,0xf0,0x1b,0x12,0xe2, +0xac,0x2b,0xf0,0x15,0x3a,0x9f,0xa9,0x9b,0xf0,0x1b,0x13,0xe3,0xe0,0x3, 0x1e,0x84, +0xf0,0x1, 0xa8,0x2e,0xf0,0x17,0x3b,0x9f,0xf0,0x0, 0xa8,0x9c,0xe0,0x1b,0x14,0xe0, +0xf0,0x0, 0xa9,0x2c,0xf0,0x1b,0x13,0x61,0xf0,0x0, 0xa9,0xbc,0xe0,0x1b,0x14,0x64, +0xf0,0x0, 0xaa,0x4c,0xe7,0xef,0x16,0x7f,0xb5,0x1d,0xf0,0x16,0x3b,0x1f,0x97,0x5d, +0xe8,0x0, 0x8d,0x5, 0x3c,0x1f,0x3c,0x9f,0x3f,0x5c,0xe0,0x1b,0xc7,0xe5,0xe8,0x0, +0x8e,0x7, 0xf7,0xf7,0x13,0xff,0x35,0x28,0x8c,0x89,0xe8,0xe, 0x3f,0x57,0xf0,0x0, +0x83,0x88,0x84,0xf, 0xe7,0xfe,0x17,0xff,0xe8,0x0, 0x8d,0x86,0x3f,0xde,0xe0,0xe, +0x3e,0x4a,0xe7,0xff,0x16,0x3f,0x34,0xa8,0x3f,0xdc,0x3d,0xc9,0xb7,0xdd,0xb5,0xad, +0xb7,0x3d,0xf0,0x1, 0xab,0x8d,0xe0,0x1, 0xac,0x1d,0xef,0xff,0xd0,0xfd,0xde,0x7f, +0xdf,0x2c,0xdf,0x3f,0xe0,0x1, 0xd8,0x2a,0xef,0xfe,0xdf,0x3c,0xa, 0x21,0xe0,0x11, +0x0, 0x99,0xe0,0x1, 0x1f,0x89,0x8f,0xf, 0xe0,0x1, 0x1f,0x88,0x37,0x28,0x8f,0x8f, +0x3f,0xce,0xe2,0x1, 0xcf,0xdf,0x3c,0x6f,0x2, 0x83,0xe0,0x1, 0x14,0x60,0x34,0x45, +0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x0, 0x0, 0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0xe0,0x0, +0x24,0x4e,0xe0,0x1, 0x1f,0xc2,0xc4,0x7f,0xe2,0x1, 0xc4,0x7f,0x16,0x1, 0xe0,0xe, +0x8c,0x9f,0xf0,0xe, 0x8a,0x2f,0x3e,0x18,0xe0,0x0, 0x1f,0x8d,0x14,0x0, 0x36,0x21, +0xf7,0xff,0x12,0xfd,0xf7,0xff,0x11,0xfd,0xf0,0x15,0x3a,0x99,0xf8,0x13,0x39,0x94, +0xc4,0xff,0xf1,0xff,0xc2,0x7f,0x3e,0x1f,0x3d,0xe8,0xf0,0x40,0x3b,0x68,0xf0,0x0, +0x13,0x81,0x0, 0x95,0xe8,0x40,0x3f,0x75,0x3, 0x17,0x15,0x81,0xe8,0x2a,0x3e,0x86, +0x2d,0x1e,0xe0,0x2e,0x3f,0x9, 0x2f,0x1b,0xe8,0x40,0x3e,0xf4,0xe8,0x40,0x3f,0x67, +0xc7,0x82,0xe0,0x6e,0x39,0xa8,0x3e,0x7f,0x3c,0x6e,0x1, 0x15,0x8f,0xf, 0x8e,0x9f, +0xe2,0x0, 0xcf,0x2, 0x2, 0xe8,0xe2,0x0, 0xce,0x82,0x5, 0x88,0xe8,0x40,0x3e,0xf3, +0xe8,0x40,0x3d,0x67,0xe0,0x6a,0x3b,0x2b,0x3d,0xea,0x2f,0x61,0xc7,0x82,0x3e,0x7f, +0x14,0x1, 0x1, 0xed,0x3c,0x5b,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3c,0xe0,0x3, 0x1a,0x99,0xdf,0xa9,0xe0,0x0, 0x19,0x8e,0xac,0x5, 0xf0,0x0, +0x8d,0x83,0x24,0x3, 0xf0,0x0, 0x2d,0xe6,0xe0,0x2, 0x1b,0xbc,0x17,0x80,0xaf,0x87, +0xaf,0x85,0xf0,0x0, 0x25,0xe3,0xf0,0x0, 0x15,0x80,0xe0,0x3, 0x1a,0x1c,0xf0,0x0, +0x1c,0x9a,0xe0,0x0, 0x1b,0xd, 0xf0,0x2, 0x1c,0x5e,0xf0,0x2, 0x1d,0x7f,0xe8,0x40, +0x39,0x6b,0x0, 0x8b,0xe8,0x0, 0x8f,0x8a,0x3f,0xf2,0x1, 0x9, 0xc1,0x1, 0x8f,0x83, +0xe2,0x1, 0xc1,0x7f,0x3f,0xf2,0x5, 0xb9,0x8f,0x84,0x2f,0xf5,0xe8,0x0, 0x8f,0x89, +0x2f,0xf6,0x3c,0x62,0xe0,0x1, 0xda,0x10,0xe0,0xf, 0x31,0x21,0x3f,0x96,0xf0,0x40, +0x3e,0x68,0x8c,0x9f,0x8c,0xf, 0xe0,0x1, 0xda,0x19,0xe0,0x43,0x3c,0x18,0xf0,0x40, +0x3e,0x78,0x4, 0x65,0x3c,0x62,0xe0,0x1, 0xd9,0xd8,0x24,0x61,0x17,0x8a,0x3f,0xb2, +0x17,0xa, 0xe0,0x0, 0xc7,0xfc,0x3f,0x96,0xe8,0xe, 0x3f,0x3b,0x94,0x8f,0x95,0x1f, +0x95,0xaf,0x96,0x3f,0x96,0xcf,0xe8,0xf, 0x3f,0x18,0xb4,0x8f,0xc1,0x1, 0xb5,0x1f, +0xe2,0x1, 0xc1,0x7f,0xb5,0xaf,0xf0,0x0, 0xc5,0x81,0xb6,0x3f,0xf2,0x1, 0xc5,0xff, +0xb6,0xcf,0x8f,0x83,0x3f,0xf2,0x2, 0xc9,0x87,0x5, 0xaf,0x7, 0xe0,0x0, 0x1f,0x7, +0xaf,0x8e,0xe0,0x2, 0x1f,0xdf,0xf0,0x0, 0xad,0x8f,0xf8,0x0, 0xe, 0x28,0xb, 0xe1, +0xe0,0x2, 0x1b,0xbc,0xe7,0xff,0x0, 0xa1,0xe8,0x40,0x3f,0xeb,0x0, 0xee,0xe7,0xff, +0x0, 0x87,0x0, 0x0, 0xe0,0x0, 0x1f,0x97,0xe0,0x0, 0x1d,0x96,0x16,0x7f,0x17,0x0, +0x16,0x83,0xae,0xf, 0xc7,0x84,0x3f,0xfb,0xe0,0x40,0xaf,0x3f,0xe0,0x40,0xae,0xaf, +0xe0,0x40,0xaf,0x1f,0x1, 0xf7,0x38,0x82,0xe0,0x0, 0x1f,0x8e,0x8f,0x8f,0x2f,0x86, +0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0x2f,0x82,0x0, 0xe6,0x38,0x82,0xe0,0x3, 0x1f,0x4, +0x3f,0xe8,0x94,0x5e,0xe2,0x10,0xc4,0x0, 0x24,0xc, 0xe0,0x0, 0x1f,0x8e,0x14,0x0, +0x8f,0x8f,0x2f,0x86,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f,0xe0,0x1, 0x27,0x87,0x38,0x82, +0xe2,0x0, 0xcd,0xa, 0x2, 0xfd,0xf0,0x0, 0x1b,0x97,0x35,0x22,0xf0,0xe, 0x3b,0x9a, +0xe0,0x43,0x3c,0xf, 0x17,0x83,0xaf,0xae,0x3f,0x68,0xf0,0x2, 0x1b,0x7d,0xe0,0x1, +0x1f,0xf2,0xe8,0x0, 0x8d,0xd6,0xa6,0xf, 0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4, +0x5, 0x10,0x3e,0xee,0xe2,0x1, 0xc6,0xff,0x17,0x7f,0x3f,0x1d,0xe0,0x43,0x3f,0xe, +0xe0,0xf, 0x3f,0x3b,0xe2,0x0, 0xcf,0x0, 0x3f,0x99,0x37,0xa1,0x3f,0x9c,0x3, 0x6e, +0xf8,0x0, 0x8a,0xe6,0xf8,0x43,0x3b,0x5, 0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4, +0x5, 0x10,0x3f,0x68,0xe2,0x1, 0xc7,0x7f,0x14,0x1, 0x3c,0x1e,0xe0,0x43,0x3c,0x8, +0xe0,0xf, 0x3c,0x3b,0xf0,0x40,0x3b,0x78,0x3f,0x99,0x37,0xa1,0x3f,0x9c,0x2, 0x6e, +0xf1,0xff,0xc2,0xff,0xf0,0x40,0x3a,0xfe,0xe0,0x0, 0x1, 0x47,0x2e,0xb8,0xe0,0x43, +0x3c,0x89,0x3e,0xbb,0x3f,0xe9,0x0, 0x85,0x97,0xe, 0xe2,0x3, 0xcf,0x74,0x5, 0xf, +0x3c,0x6f,0xe2,0x1, 0xc4,0x7f,0x17,0xff,0x3f,0x98,0xe0,0x43,0x3f,0x8f,0xe0,0xe, +0x3f,0x9d,0xe2,0x0, 0xcf,0x80,0x37,0x21,0x3f,0x1c,0x3, 0x6f,0xe0,0x43,0x3d,0x8b, +0x0, 0x85,0x97,0x8f,0xe2,0x3, 0xcf,0xf4,0x5, 0xe, 0x3f,0x69,0xe2,0x1, 0xc7,0x7f, +0x14,0x81,0x3c,0x9e,0xe0,0x43,0x3c,0x89,0xe0,0xf, 0x3c,0x9d,0x3d,0xf9,0x37,0xa1, +0x3f,0x9c,0x2, 0x70,0x3f,0x28,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x3, 0x5, 0x97, +0xe8,0xa, 0x3d,0x17,0x17,0x81,0xaf,0x9a,0x14,0x1, 0x38,0x82,0xe8,0xa, 0x3d,0x17, +0x17,0x80,0xaf,0x9a,0x14,0x0, 0x38,0x82,0x8, 0xb1,0xc0,0x7c,0x7c,0x1, 0xdf,0x4b, +0x64,0x1, 0xc0,0x4, 0x8, 0xe1,0x3e,0xee,0xe7,0xff,0x0, 0xbb,0xf0,0xf, 0x3b,0x9a, +0x8f,0x1f,0x27,0x6d,0x17,0x1, 0xaf,0x1f,0x14,0x1, 0x38,0x82,0xe0,0x0, 0x1f,0x8e, +0x14,0x0, 0xf0,0x0, 0x8b,0x8f,0xf2,0x0, 0xcb,0x84,0xe0,0x0, 0x2, 0xee,0xe0,0x1, +0x1f,0x89,0xe0,0x0, 0x1f,0xd, 0x8e,0x8f,0xe0,0x1, 0x1f,0x88,0x36,0xa8,0x8f,0x8f, +0xe0,0x1a,0x96,0x7e,0x3f,0xcd,0x3e,0x7f,0xe0,0x0, 0x5, 0x5f,0xf0,0x0, 0x23,0xde, +0x8, 0xb1,0xf0,0x0, 0x13,0x7f,0x3d,0x68,0x3c,0xe8,0xf8,0x40,0x3a,0xe6,0x8f,0x8e, +0xe8,0x40,0x3e,0x65,0x8e,0x9e,0xe2,0x1, 0xc6,0x7f,0x3f,0xfc,0xc4,0x1, 0x38,0xe9, +0xf8,0x40,0x38,0x66,0xf0,0x40,0x38,0xea,0xe4,0xb, 0x37,0xa8,0xe4,0xc, 0x36,0xa8, +0xe2,0x1, 0xc0,0xff,0xf2,0x1, 0xc0,0x7f,0xf2,0x1, 0xc0,0xff,0xe2,0x1, 0xc4,0x7f, +0xf0,0x40,0x39,0x6f,0xe4,0xb, 0x35,0xc8,0xf0,0x40,0x39,0xed,0xf0,0x40,0x3a,0x6d, +0xe4,0xc, 0x36,0x48,0xc7,0x2, 0x5, 0x83,0xf8,0x40,0x39,0x65,0x3d,0xf1,0xf8,0x40, +0x3a,0xe2,0xf2,0x1, 0xc2,0xff,0x3, 0x82,0x3f,0xe9,0xe8,0x40,0x3e,0xf0,0x3c,0xef, +0xe2,0x1, 0xc4,0xff,0x5, 0x83,0xf8,0x40,0x39,0xe6,0xe8,0x40,0x3e,0x71,0xf8,0x40, +0x3b,0x63,0xf2,0x1, 0xc3,0x7f,0x3, 0x83,0xf0,0x40,0x3a,0x6a,0xf0,0x40,0x3b,0xf8, +0xe8,0x40,0x3d,0x64,0xe2,0x1, 0xc5,0x7f,0xe7,0xff,0x1, 0xbb,0xe8,0x9, 0x3c,0xa5, +0xe8,0xa, 0x3d,0x26,0xe2,0x0, 0xcc,0x84,0x17,0x84,0xe0,0x2a,0x3f,0xaa,0x14,0x0, +0xe0,0x68,0x3d,0x2a,0x8, 0xe1,0x38,0x82,0x14,0x1, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3a,0xc0,0x7c,0xe0,0x3, 0x19,0x84,0xe0,0x2, 0x1a,0xfd,0x97,0xd3,0xe0,0x0, +0x1b,0xe, 0x86,0x45,0x8e,0xd5,0x17,0x0, 0xe2,0xff,0xc7,0xff,0x8d,0x86,0x6f,0x4, +0xb7,0xd3,0x6f,0x5, 0x6e,0x6, 0x6e,0x87,0xe0,0x1, 0x25,0xfb,0xe0,0x1, 0x1f,0xd7, +0xe0,0x0, 0x19,0xd, 0xf0,0x0, 0x94,0x2f,0x93,0xdf,0xf0,0x1, 0x1d,0x72,0x12,0x0, +0x0, 0x89,0xf8,0x40,0x3c,0x79,0x4, 0x1e,0x8d,0x86,0x8e,0xd5,0x3a,0x7b,0xe0,0x1, +0x3, 0xed,0xe0,0xf, 0x32,0x21,0x3f,0x92,0x8c,0x8f,0x8d,0x1f,0x3e,0xb9,0xe8,0x0, +0xa7,0x8a,0x3e,0x9a,0x36,0xa1,0x3e,0x9f,0xe2,0x0, 0x7c,0x4, 0xf0,0x0, 0x94,0x8d, +0xc2,0x1, 0xef,0xff,0xd7,0xf6,0xe2,0x1, 0xc2,0x7f,0x2c,0x64,0xe8,0x40,0x3b,0xf9, +0x3, 0x64,0x8d,0x86,0x8e,0xd5,0x16,0x1, 0xe0,0x1a,0x9a,0x52,0xe0,0x1a,0x9f,0xe2, +0x97,0x53,0x9d,0x23,0x3f,0x94,0x36,0x2f,0xe2,0xf7,0xc7,0x7f,0xe0,0x2f,0x3f,0x9a, +0x37,0xaa,0x3f,0x4c,0xe0,0x3, 0x1a,0x8c,0x3f,0x4f,0xe0,0x4, 0xcf,0x0, 0x8f,0x85, +0xb7,0x53,0x27,0xbb,0xe0,0x2, 0x1e,0x27,0xe0,0x1, 0x1c,0xf2,0x8f,0xc, 0x8d,0x1c, +0x3f,0x3d,0xa4,0x9, 0x3f,0x1a,0x37,0x21,0xe0,0x2, 0x1d,0x30,0x3f,0x18,0x94,0x8a, +0x97,0xe, 0x9b,0x93,0x3f,0x29,0xe0,0x43,0x3f,0x1e,0xe4,0x9, 0x37,0xf, 0xe2,0xe, +0x3c,0xce,0x3f,0x29,0x3f,0x77,0xe0,0x0, 0x2, 0x78,0x13,0x7f,0x3b,0x1f,0xe2,0x1, +0xc3,0x7f,0x33,0x21,0x3b,0x1c,0x0, 0x95,0x8f,0x2f,0x8f,0xbf,0x3f,0x3d,0xe0,0x80, +0x94,0x9a,0x3f,0x1f,0x37,0x21,0x3f,0x18,0x97,0x8e,0x3f,0xa9,0xe0,0x43,0x3f,0x9f, +0xe4,0xe, 0x37,0x8f,0xe2,0xf, 0x3f,0x4f,0x3f,0xae,0x3f,0xf7,0xe0,0x0, 0x2, 0x5d, +0x3b,0x7c,0x3f,0xec,0xc6,0x2, 0x1, 0xe9,0x17,0x81,0x2d,0x82,0xad,0x85,0xe7,0xfb, +0x17,0x7f,0x92,0xd3,0x37,0xa9,0x3a,0xde,0x3a,0xcf,0xe7,0x7f,0x17,0xff,0x3a,0xdf, +0xe0,0x0, 0x1f,0x8c,0x8f,0x8f,0xb2,0xd3,0x27,0xa9,0xe0,0x1b,0x97,0x92,0xe0,0x17, +0xc7,0xb7,0xe3,0xff,0xc7,0xff,0xe2,0x14,0xcf,0xd8,0x2, 0x8c,0xe0,0x2, 0x1f,0xc0, +0xe0,0xa, 0x8f,0x8f,0xe0,0x0, 0x2f,0xe5,0xde,0xd2,0x2c,0x4, 0xe0,0x80,0xca,0x80, +0xb2,0xd3,0x16,0x83,0xe0,0x1, 0x1f,0xd7,0xe0,0x1b,0x97,0x42,0x97,0xef,0xe4,0x0, +0xc7,0x8a,0xe2,0x0, 0xcf,0x80,0x3e,0x9f,0xe0,0x6f,0x3c,0x2d,0x37,0x82,0x3f,0x7f, +0x3, 0x5, 0x97,0xd3,0xe0,0x40,0xcf,0x80,0xb7,0xd3,0x97,0xd3,0xe3,0xdf,0xc7,0xff, +0xb7,0xd3,0xe7,0xef,0x16,0xff,0xe0,0x2, 0x1f,0x7c,0x97,0xd3,0x9f,0xe, 0x3f,0xdd, +0x37,0x42,0xe7,0xfd,0x16,0xff,0x3f,0xdd,0x3f,0x74,0xb7,0xd3,0x4, 0x85,0xe0,0x1a, +0x9f,0xe2,0x3f,0xfe,0x5, 0x85,0x97,0xd3,0xe0,0x2, 0xcf,0x80,0xb7,0xd3,0xc0,0x4, +0xf8,0x0, 0xd, 0x28,0xb, 0xe1,0x25,0xa0,0x13,0xff,0x3b,0x9b,0xe2,0x1, 0xc3,0xff, +0xc3,0x81,0x33,0xa1,0xe0,0x0, 0x1f,0xd, 0xe0,0x2, 0x1b,0x2f,0xe0,0x2, 0x1e,0x27, +0x3b,0x92,0x8c,0x8e,0x8d,0x1e,0xe0,0xf, 0x3c,0xbd,0xc7,0x2, 0x3f,0x9a,0x37,0xa1, +0x3f,0x98,0x97,0x8f,0xc6,0x2, 0x3f,0x77,0xe0,0x40,0xac,0xac,0xe0,0x40,0xad,0x1c, +0xe0,0x80,0xb7,0x96,0x1, 0xef,0xad,0x85,0x17,0x80,0xe7,0xff,0x0, 0x88,0xe0,0x0, +0x19,0xd, 0x3e,0x6b,0xe7,0xfe,0x0, 0xb2,0x16,0x0, 0xe7,0xfe,0x0, 0xaf,0xe0,0x2, +0x1f,0xf7,0x17,0x7, 0xaf,0xf, 0x17,0x0, 0xe0,0x1, 0x1f,0xe9,0xaf,0xf, 0xe7,0xff, +0x0, 0xb2,0x0, 0x0, 0x8, 0xb7,0xc0,0x70,0xea,0x4e,0x7f,0xe4,0xe9,0xff,0xc7,0xff, +0xf0,0x0, 0x83,0xf, 0xf0,0x0, 0x83,0x9f,0x83,0xaf,0x83,0x3f,0x82,0xcf,0x82,0x5f, +0x81,0xef,0x81,0x7f,0xe0,0x1, 0x84,0xf, 0xe0,0x1, 0x84,0x9f,0xe0,0x1, 0x85,0x2f, +0xe0,0x1, 0x85,0xbf,0xe0,0x1, 0x86,0x4f,0xe0,0x1, 0x86,0xdf,0xe0,0x1, 0x87,0x6f, +0xe0,0x1, 0x87,0xff,0xf0,0x0, 0x6b,0x4, 0x6f,0x93,0xe0,0x0, 0x1f,0x8e,0xf0,0x0, +0x6b,0x85,0x6b,0x86,0x6b,0x7, 0x6a,0x88,0x6a,0x9, 0x69,0x8a,0x69,0xb, 0x6c,0xc, +0x6c,0x8d,0x6d,0xe, 0x6d,0x8f,0x6e,0x10,0x6e,0x91,0x6f,0x12,0x8f,0x8f,0xe0,0x1, +0x27,0x9c,0xe0,0x2, 0x1f,0xdd,0x89,0x8f,0xe0,0x1, 0x29,0x97,0xe0,0x0, 0x1b,0xd, +0xf0,0x2, 0x1a,0xfd,0xe0,0x1, 0x1f,0xf2,0x89,0x16,0x8b,0x86,0xe8,0x0, 0x8a,0xd5, +0xf7,0xff,0x13,0xff,0xf7,0xff,0x13,0x7f,0x14,0x81,0xa2,0xf, 0xe0,0x43,0x3e,0x97, +0x3d,0x63,0xf0,0x17,0x3b,0x92,0xf0,0x16,0x3b,0x15,0x3c,0x92,0xe0,0xb, 0x3e,0xb5, +0xe8,0x40,0x3f,0x67,0xe0,0xc, 0x3d,0x92,0x36,0x21,0x3e,0x14,0x96,0xc, 0x3f,0xe9, +0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0x3f,0x1b,0x3f,0x9b,0xe2,0x1, 0xce,0x20, +0x37,0x21,0x37,0xa1,0xc6,0xff,0x16,0x1, 0x3f,0x14,0x3f,0x94,0xe0,0x43,0x3e,0x9d, +0x3e,0x13,0x5, 0x18,0x21,0x8, 0x94,0xe, 0x39,0xec,0x3d,0x18,0xe2,0x1, 0xc1,0xff, +0xe0,0x43,0x3d,0x1a,0xe8,0x40,0x39,0x76,0x17,0x1, 0x3f,0x13,0x3, 0x8, 0x94,0xf, +0x39,0xee,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0xe3,0xff,0xce,0xff, +0x1, 0xce,0xf8,0x0, 0x8b,0x45,0x16,0x1, 0xf7,0xff,0x13,0xff,0xf7,0xff,0x12,0xff, +0x14,0x81,0x3e,0x17,0xf0,0x17,0x3b,0x92,0xf0,0x15,0x3a,0x95,0x3c,0x92,0x3f,0xec, +0xe2,0x1, 0xc7,0xff,0xe0,0xd, 0x3f,0xb5,0xe8,0x40,0x3f,0x67,0x3f,0xe9,0xe2,0x1, +0xc7,0x7f,0xe2,0x1, 0xc7,0xff,0xe0,0xb, 0x3e,0x92,0x3f,0x1d,0x3f,0x9d,0xe0,0x43, +0x3e,0x9c,0xe8,0x40,0x3e,0xf6,0x35,0xa1,0x37,0x21,0x37,0xa1,0xf0,0x0, 0x12,0x1, +0x3d,0x94,0x3f,0x14,0x3f,0x94,0xc6,0x1, 0xf0,0x14,0x3a,0x13,0x3, 0x24,0x96,0x8b, +0xe3,0xff,0xc6,0x7f,0xe2,0x1, 0xce,0xa0,0x5, 0x1e,0x21,0x9, 0x94,0xe, 0xe8,0x40, +0x39,0xe4,0x3d,0x18,0xe2,0x1, 0xc1,0xff,0xe0,0x43,0x3d,0x1a,0xe8,0x40,0x39,0x75, +0x17,0x1, 0x3f,0x13,0x3, 0x4d,0x94,0xf, 0x39,0xee,0x3d,0x18,0xe2,0x1, 0xc1,0xff, +0xe0,0x43,0x3d,0x1a,0x0, 0xc5,0xea,0x12,0x7f,0xa7,0x17,0x0, 0xaf,0xf, 0x14,0x0, +0xc0,0x10,0xb, 0xe1,0xe4,0x8, 0x35,0xf, 0xe2,0xa, 0x3c,0x4a,0x3c,0xe3,0xe0,0x8, +0x3d,0x28,0xe0,0x4, 0xdc,0xd, 0xe2,0x0, 0xcc,0x64,0x2, 0x6e,0x29,0xe, 0xe0,0x0, +0x1f,0xc, 0xea,0x12,0x7f,0xa7,0x16,0x81,0x8f,0xe, 0xae,0x8f,0x14,0x1, 0x27,0x69, +0x17,0x3, 0xaf,0xf, 0x14,0x3, 0x0, 0xe5,0x16,0xff,0x3e,0x95,0x39,0x7d,0x1, 0x70, +0x17,0xff,0x3a,0xb7,0x3f,0x92,0xe2,0x0, 0xc9,0x8f,0xe2,0x1, 0xc7,0xff,0x16,0x3, +0x3f,0x95,0x17,0x0, 0xe0,0x6e,0x3a,0xac,0x37,0xa1,0x39,0x7d,0x3f,0x94,0x96,0xf, +0xe0,0x0, 0x4, 0x4d,0x17,0x84,0x15,0xf4,0x36,0x1, 0x3f,0x90,0xe0,0xb, 0x3d,0x90, +0xe0,0x1, 0x86,0xef,0x3e,0xfc,0x5, 0x6, 0xe0,0x1, 0x86,0xff,0x3f,0x1d,0xe3,0xff, +0xc7,0x7f,0xc7,0xfe,0x3d,0xff,0x1, 0xf5,0x39,0x15,0x31,0x21,0x3a,0x12,0x97,0x84, +0x16,0xa8,0xe4,0xc, 0x37,0x8f,0xe2,0xf, 0x3e,0x4f,0x3e,0x9e,0x3f,0xac,0xe2,0xb, +0xcf,0xdd,0x3f,0xed,0xe3,0xff,0xc7,0xff,0xe0,0x1a,0x96,0x76,0xe0,0x0, 0x1e,0xa1, +0xe0,0x6e,0x3b,0x2f,0x17,0xa8,0xe2,0xb, 0xce,0x5d,0x3f,0x9e,0x8e,0xd, 0xe3,0xff, +0xc7,0xff,0xe0,0x6e,0x3b,0x2f,0xe2,0x0, 0xce,0x1, 0x1, 0x25,0x3f,0xee,0xe3,0xff, +0xc7,0xff,0xe2,0x1, 0xcf,0xfa,0x2, 0x8f,0xea,0x12,0x7f,0xa7,0x8c,0xf, 0xe3,0xff, +0xc7,0x7f,0x3f,0x78,0xe7,0xff,0x5, 0x8e,0x3c,0x6e,0xe2,0x1, 0xc4,0x7f,0xac,0xf, +0xe7,0xff,0x0, 0x88,0xe0,0x1, 0x17,0x7a,0x0, 0xf0,0x17,0x81,0x3f,0x92,0xe2,0x1, +0xc7,0xff,0x3f,0x95,0x37,0xa1,0x3f,0x94,0x97,0x8f,0x3e,0x1f,0xe0,0x43,0x3e,0x1c, +0xe7,0xff,0x0, 0xaa,0xc7,0x28,0x17,0x80,0xaf,0x8d,0xe3,0xff,0xc7,0x7f,0x0, 0xd7, +0x8, 0xb6,0xe0,0x2, 0x19,0xc0,0xe0,0x3, 0x1a,0x2e,0xe0,0xa, 0x8f,0x83,0x17,0x1, +0xe2,0x0, 0xcf,0x81,0xaf,0x4, 0xe0,0x0, 0x1, 0x62,0xe0,0x1, 0x1b,0x7, 0xe0,0x1, +0x19,0x57,0x8f,0x86,0xe0,0x0, 0x12,0xee,0x37,0xc1,0xaf,0x92,0xb2,0x92,0xb2,0xa2, +0xef,0xfb,0xd3,0xd8,0xe0,0x0, 0x1f,0x8e,0xe0,0x0, 0x1f,0xd, 0x8f,0x8f,0x2f,0xaf, +0x17,0x80,0xaf,0x84,0xe0,0x1, 0x1f,0x89,0x8d,0xf, 0xe0,0x1, 0x1f,0x86,0x35,0x28, +0x8d,0x8f,0xe0,0x1, 0x1f,0x85,0x35,0xa8,0x8e,0xf, 0xe0,0x1, 0x1f,0x88,0x36,0x28, +0x8e,0x8f,0xe0,0x1, 0x1f,0x84,0x3e,0xca,0x8f,0xf, 0xe0,0x1, 0x1f,0x83,0x3f,0x4b, +0x8f,0x8f,0xe0,0x43,0x3f,0x1e,0x3f,0xcc,0xe0,0x43,0x3f,0x9f,0xe0,0xc, 0x36,0xc5, +0x85,0x6, 0xae,0x3, 0xe0,0x41,0x3d,0xcf,0xe0,0xc, 0x37,0x5, 0xad,0x12,0xb6,0x92, +0xb7,0x22,0xb7,0xf2,0xe0,0x1, 0xb5,0x82,0xae,0x13,0xb, 0x61,0xe2,0x0, 0xcf,0x88, +0x5, 0xa0,0xe0,0x1a,0x97,0xfe,0xe2,0x2, 0xcf,0xab,0x2, 0x32,0x8f,0x86,0x17,0x3, +0x37,0xc1,0xaf,0x92,0xe0,0x1, 0x17,0x96,0xaf,0x3, 0xb7,0xf2,0xe7,0xfe,0x17,0xea, +0xb2,0x92,0xb2,0xa2,0xe0,0x1, 0xb7,0x82,0xaf,0x13,0x8f,0x84,0xe7,0xff,0x27,0xbc, +0xe0,0x0, 0x1f,0xce,0x17,0x1, 0xaf,0xf, 0xb, 0x61,0x17,0x80,0xaf,0x84,0xb, 0x61, +0xe2,0x0, 0xcf,0x86,0x2, 0x93,0xe2,0x0, 0xcf,0x84,0x2, 0xa6,0xe2,0x0, 0xcf,0x82, +0xe7,0xff,0x5, 0xa8,0xe0,0x1a,0x97,0xfe,0xe2,0x5, 0xcf,0xbb,0xe7,0xff,0x2, 0x22, +0x17,0x84,0x86,0x86,0xe0,0x1, 0x17,0x1b,0x0, 0x8a,0xe0,0x1a,0x97,0xfe,0xe2,0x3, +0xcf,0x8f,0x2, 0x14,0x86,0x86,0x17,0x83,0xe0,0x0, 0x17,0x78,0xaf,0x83,0xb7,0x12, +0xb7,0x22,0xe0,0x1, 0x17,0x20,0xb7,0x72,0xe7,0xfe,0x17,0x60,0xae,0x92,0xe0,0x1, +0xb7,0x2, 0xaf,0x93,0x0, 0xcb,0xe0,0x1a,0x97,0xfe,0xe2,0x3, 0xcf,0xf3,0x2, 0x5d, +0x17,0x84,0x86,0x86,0xe0,0x1, 0x17,0x7, 0x0, 0xea,0x8, 0xb4,0xe0,0x2, 0x19,0xc0, +0xe0,0xa, 0x8f,0x83,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x0, 0xe0,0x1, 0x19,0x57, +0xe0,0x3, 0x8f,0xe2,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x4f,0xe0,0x3, 0x1a,0x2e, +0x17,0xff,0xaf,0x84,0xdf,0x46,0x8f,0x84,0xe0,0x1, 0x27,0x99,0xe0,0x1, 0x8f,0xb3, +0x27,0xa1,0x9f,0x12,0x97,0xa2,0x96,0xf2,0xe4,0x0, 0xc7,0xa, 0xe4,0x0, 0xc7,0x8a, +0x37,0x3, 0xe4,0x0, 0xc6,0x8a,0xe3,0xff,0xc7,0x7f,0x37,0x83,0xe0,0x43,0x3e,0x1f, +0x36,0x83,0xe0,0xb, 0x37,0x45,0xad,0x83,0xe0,0x41,0x3f,0xcf,0xe0,0x41,0x3d,0x4d, +0xe0,0xb, 0x36,0x5, 0xb7,0x12,0xb6,0x22,0xb7,0xb2,0xb6,0xf2,0xe0,0x1, 0xb5,0x2, +0xad,0x93,0x8f,0xc3,0xe2,0x1, 0xcf,0xaa,0x1, 0x13,0xe0,0x1, 0x1f,0x82,0x8e,0xf, +0xe0,0x1, 0x1f,0x81,0x36,0x28,0x8e,0x8f,0xe0,0x1, 0x1f,0x80,0x36,0xa8,0x8f,0xf, +0xe0,0x0, 0x1f,0xff,0x3f,0x4c,0x8f,0x8f,0xb7,0x42,0x3f,0xcd,0xb7,0xd2,0xe0,0x0, +0x1f,0xfe,0x8f,0xf, 0xe0,0x0, 0x1f,0xfd,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xe0,0x41, +0x3f,0xcf,0xb7,0xb2,0xa, 0x61,0xe0,0x0, 0x1f,0xfc,0xe0,0x1, 0x1f,0x3, 0x8e,0xf, +0xe0,0x1, 0x1f,0x85,0x8f,0xe, 0x8e,0x8f,0xe0,0x0, 0x1f,0xfb,0x36,0xa8,0x8f,0x8f, +0x3f,0x4d,0x16,0x84,0x36,0x28,0xae,0x83,0xe0,0x1, 0x16,0x96,0xe0,0x1, 0x1d,0x87, +0x3f,0xcc,0xb6,0x92,0xe0,0x0, 0x16,0xf8,0xe0,0x41,0x3f,0xcf,0x85,0x8b,0xb6,0xa2, +0x16,0x0, 0xe0,0x3, 0x1e,0xae,0xe0,0x1, 0xb7,0x82,0x17,0x83,0xad,0x92,0xae,0xd, +0xb7,0x72,0xaf,0x93,0xe7,0xff,0x0, 0x94,0xe0,0x0, 0x1f,0xfc,0xe0,0x1, 0x1f,0x3, +0x8e,0xf, 0xe0,0x1, 0x1f,0x85,0x8f,0xe, 0x8e,0x8f,0xe0,0x0, 0x1f,0xfb,0x36,0xa8, +0x8f,0x8f,0xe0,0x1, 0x19,0x57,0x3f,0x4d,0x16,0x89,0x36,0x28,0xae,0x83,0xe0,0x2, +0x16,0xac,0xe0,0x1, 0x1d,0x87,0x3f,0xcc,0xb6,0x92,0xe0,0x2, 0x16,0x8e,0xe0,0x41, +0x3f,0xcf,0x85,0x8b,0xb6,0xa2,0x16,0x0, 0xe0,0x3, 0x1e,0xae,0xe0,0x1, 0xb7,0x82, +0x17,0x88,0xad,0x92,0xae,0xd, 0xb7,0x72,0xaf,0x93,0xe0,0x2, 0x1f,0xdf,0x8f,0x8f, +0xe7,0xfe,0x2f,0xe6,0xe0,0x3, 0x8f,0xe2,0xe7,0xfe,0x2f,0xe2,0xe0,0x0, 0x1f,0xfa, +0x8f,0xf, 0xe0,0x0, 0x1f,0xf9,0x37,0x28,0x8f,0x8f,0x3f,0xce,0xb7,0x92,0xe7,0xfe, +0x0, 0xd7,0x8, 0xb4,0x17,0x9c,0xe0,0x2, 0x19,0xac,0x3f,0xb8,0x3a,0x68,0x3f,0x93, +0xe0,0x1, 0x8c,0xf, 0xe0,0x2, 0x1f,0x9e,0x11,0x1, 0xa9,0xf, 0xef,0xfc,0xd6,0x7b, +0xe0,0x0, 0x1f,0xb3,0xaa,0x3, 0xa9,0xf, 0xa, 0x61,0xe0,0x1, 0x1e,0xc7,0x17,0x0, +0x3f,0xed,0xe1,0x80,0xb7,0x1f,0xc7,0x82,0xb7,0x1d,0xe1,0x80,0xb7,0x1f,0xb7,0xf, +0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xe1,0xff,0xc0,0x8, 0xe0,0x2, +0x1f,0x66,0xe0,0x2, 0x1f,0xfd,0x87,0xe, 0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, +0x3e,0xfe,0x3a,0x68,0xe0,0x0, 0x1, 0x68,0x8b,0xf, 0xf0,0x0, 0x8e,0x2f,0x3c,0x64, +0xe0,0x0, 0xd6,0x38,0xf0,0x0, 0x26,0x52,0x13,0xff,0xe8,0x7, 0x3b,0x9c,0x11,0xff, +0xe2,0x1, 0xc3,0xff,0x39,0x96,0xe0,0x4c,0xc3,0xa7,0xe2,0x1, 0xc1,0xff,0xf0,0x0, +0x14,0x4, 0xe0,0x1, 0x1f,0xff,0xf0,0x18,0x3c,0x10,0x33,0xa1,0x31,0xa1,0xe0,0x1, +0x1a,0xe4,0x3b,0x9f,0xf0,0x1c,0x36,0x21,0xe8,0x3, 0x39,0x98,0xf0,0x0, 0x15,0x3, +0xf0,0x0, 0x14,0xda,0xf0,0x0, 0x15,0x80,0xe0,0x80,0x97,0x95,0xe8,0x40,0x3c,0xea, +0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f,0xe0,0x8, 0x3f,0xa8,0xe0,0x4, 0xd9,0xb8, +0xe2,0x0, 0xcc,0x5a,0xe8,0x40,0x3d,0x69,0xe0,0x6a,0x3b,0x28,0xe3,0xff,0xc5,0x7f, +0x23,0x21,0x11,0x2, 0x39,0x10,0x3f,0x62,0x3f,0xe4,0x96,0x8f,0xe8,0xf, 0x3f,0x9c, +0xe0,0x80,0xb6,0x9e,0x3f,0x73,0x1, 0xfa,0x3c,0xe6,0xe8,0x40,0x3c,0x68,0xe0,0x0, +0xd6,0x2f,0x3f,0xe4,0xe0,0x80,0x97,0x12,0x39,0x73,0xb7,0xf, 0xe8,0xf, 0x3f,0x9c, +0x1, 0xfa,0x3a,0xf7,0xc2,0x2, 0x1, 0xd1,0xe0,0x0, 0xc0,0x78,0xf8,0x0, 0xe, 0x28, +0xb, 0xe1,0xe8,0x40,0x3c,0xeb,0xe8,0x40,0x3c,0x68,0xd6,0x19,0x3a,0xf7,0xc2,0x2, +0x1, 0xc4,0x0, 0xf3,0x8b,0x1f,0xf0,0x0, 0x8e,0x3f,0xe7,0xff,0x0, 0x9a,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe1,0xe6,0xc0,0x58,0x3b,0xe8,0x3c,0x69,0x3b,0x69, +0xef,0xfe,0xd8,0x4b,0xe2,0x0, 0xcb,0x1, 0xe0,0x1, 0x1, 0x4d,0xe0,0x3, 0x19,0x4, +0xe0,0x1, 0x19,0xc7,0x97,0xd2,0x17,0x0, 0xe3,0xff,0xc7,0xdf,0xb7,0x3, 0x3a,0xe8, +0xb7,0xd2,0x3c,0x66,0xef,0xfe,0xd8,0x39,0xe2,0x0, 0xcc,0x0, 0x12,0x2, 0x3f,0xe4, +0xe0,0x6f,0x39,0x28,0x3b,0xff,0x1, 0x6, 0xe0,0x19,0xc0,0x28,0xf8,0x0, 0xc, 0xa8, +0xb, 0xe1,0xe0,0x0, 0x1f,0xbf,0xe0,0x0, 0x1f,0x78,0x8f,0x8f,0x8f,0xe, 0x3f,0x7f, +0xe0,0x2, 0x1, 0x42,0xe0,0x0, 0x1f,0x77,0x8f,0xe, 0x3f,0x7f,0xe0,0x2, 0x1, 0x46, +0xe0,0x0, 0x1f,0x76,0x8f,0xe, 0x3f,0x7f,0xe0,0x2, 0x1, 0x44,0x17,0x80,0x3a,0x6f, +0xe2,0x0, 0xcb,0x2, 0xe0,0x1, 0x1, 0x63,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, 0x1f,0x2c, +0xe0,0x1, 0x1b,0x6e,0x3f,0x9e,0xf0,0x0, 0xa4,0x5f,0xa3,0xef,0xfb,0xe5,0x7c,0xf0, +0xe8,0x0, 0x8f,0x89,0x27,0x8c,0xe0,0x1, 0x22,0xcb,0xe0,0x1, 0x1c,0xf0,0xe0,0x1, +0x1c,0x7d,0xef,0xff,0xd3,0xa3,0x17,0x80,0xe8,0x0, 0xaf,0x89,0x15,0x81,0xe0,0x1, +0x1d,0x7e,0xe0,0x1, 0x1c,0xfd,0xe2,0x0, 0x7c,0x6, 0xef,0xff,0xd3,0x78,0xe0,0x2, +0x1f,0xfc,0x15,0x8c,0x9f,0x8f,0xe0,0x1, 0x1c,0xfd,0x3d,0x9f,0xe0,0x1, 0x1d,0x7e, +0xe3,0xff,0xc5,0xff,0xe0,0xe, 0x37,0xa1,0xe0,0xd, 0x3c,0x9e,0xe0,0xc, 0x3d,0x1e, +0x96,0x8d,0x96,0xc, 0xc7,0x81,0xe2,0x0, 0x7c,0x6, 0xe3,0xff,0xc7,0xff,0x3f,0x18, +0x3e,0xac,0x3f,0xfb,0xb6,0x8e,0x1, 0xef,0x22,0xad,0xe0,0x2, 0x1f,0xea,0x8f,0x8f, +0x3f,0xf4,0xe0,0x1, 0x1, 0x53,0x3c,0xe6,0xe2,0xc, 0x7c,0x5a,0xe8,0x40,0x3d,0x68, +0xef,0xff,0xd3,0x2d,0xe0,0x1, 0x1c,0xf0,0x3d,0x67,0xe2,0x0, 0x7c,0x6, 0xef,0xff, +0xd3,0x26,0xe2,0xc, 0x7c,0xda,0x3c,0x69,0xe2,0x0, 0x7d,0x6, 0x15,0x81,0xef,0xff, +0xd3,0x3e,0xe0,0x1, 0x1d,0x7e,0xe0,0x1, 0x1c,0xfd,0xe2,0x0, 0x7c,0x6, 0x15,0x81, +0xef,0xff,0xd3,0x35,0xe2,0x0, 0x7d,0x6, 0xe2,0xc, 0x7c,0xda,0x3c,0x6a,0xef,0xff, +0xd3,0xe, 0xe2,0x0, 0x7c,0x6, 0xef,0xff,0xd3,0x67,0xe0,0x43,0x3f,0x98,0xe2,0x0, +0xcf,0x80,0xe0,0xff,0x17,0xff,0xe0,0x6f,0x3b,0x28,0x3c,0x6f,0xe0,0x0, 0x1f,0xf5, +0x8f,0x8f,0xb4,0x3, 0xe0,0xe, 0x37,0xa8,0xe0,0x0, 0x1f,0xf4,0x9e,0x83,0x8f,0x8f, +0x3f,0xce,0x3e,0xff,0x97,0xd2,0xe0,0x0, 0x5, 0xce,0xcf,0xa0,0xb7,0xd2,0xe7,0xfe, +0x2a,0xd5,0xe0,0x1, 0x1c,0xfe,0xe0,0x1, 0x1c,0x7d,0xef,0xff,0xd3,0x27,0xe7,0xfe, +0x0, 0xcd,0xe2,0x0, 0xcb,0x84,0xe7,0xfe,0x1, 0xc9,0xe0,0x1, 0x1c,0x63,0xde,0xa3, +0xe0,0x2, 0x1f,0xe6,0xe0,0x2, 0x1f,0x7d,0x87,0x8f,0xe0,0x3, 0x8e,0xae,0xe2,0x0, +0xc7,0x81,0x3e,0xff,0xe0,0x1, 0x1, 0xc, 0x97,0xde,0xc7,0x86,0xe3,0xff,0xc7,0xff, +0xe0,0x0, 0x27,0xd7,0xc7,0xff,0xe3,0xff,0xc7,0xff,0x17,0x0, 0x15,0x1, 0xe0,0x1, +0x1d,0xff,0x3d,0x1f,0x3e,0x6e,0x0, 0x91,0x9e,0x8f,0xe0,0x45,0x17,0xc2,0x3f,0x9e, +0x3e,0xfc,0x37,0xa1,0x3f,0x9b,0x5, 0x6, 0x96,0x8f,0x9e,0xf, 0xe2,0x0, 0xce,0x80, +0x5, 0x2e,0xc7,0x1, 0x3f,0x7a,0x1, 0x30,0xe0,0x45,0x17,0xc2,0x3f,0x9e,0x37,0xa1, +0x3f,0x9b,0x96,0x8f,0xe2,0x0, 0xce,0x80,0x2, 0x68,0x96,0x8f,0xe0,0x41,0x3e,0xcd, +0x0, 0xe5,0xe3,0xff,0xc7,0xdf,0xb7,0xd2,0xe7,0xff,0x0, 0xb3,0xe0,0x1, 0x1c,0x7d, +0x3c,0xe6,0xef,0xff,0xd2,0xdb,0xe7,0xfe,0x0, 0xb8,0x17,0x1, 0x3f,0x1f,0xe0,0x2, +0x1e,0xac,0xe4,0x0, 0xc7,0x1c,0xe4,0x0, 0xc7,0x9c,0x3f,0x1d,0x3f,0x9d,0xf0,0x0, +0xa4,0xe, 0xa3,0xef,0xe0,0x1, 0x1b,0x6d,0xe7,0xfe,0x0, 0x9a,0xe0,0x41,0x3e,0x4c, +0xe3,0xff,0xc6,0x7f,0x0, 0xcf,0xe0,0x43,0x3f,0x9c,0xe4,0x0, 0xc6,0x5, 0xe2,0x0, +0xcf,0x80,0xe3,0xff,0xc6,0x7f,0xe0,0xff,0x17,0xfb,0xe0,0x6f,0x3b,0x2c,0xe0,0x1, +0x1e,0xc7,0xe0,0x0, 0x1f,0x75,0x8f,0xe, 0xb7,0x8d,0x37,0x28,0xe0,0x0, 0x1f,0xf4, +0x9e,0x8d,0x8f,0x8f,0x3f,0xce,0x3e,0xff,0xe0,0x3, 0x1f,0x4, 0x97,0xde,0x5, 0x96, +0xcf,0xa0,0xb7,0xde,0xe7,0xfd,0x0, 0xca,0xe0,0x1, 0x1d,0x70,0x3c,0xe6,0xe2,0xc, +0x7c,0x5a,0x15,0x81,0xef,0xff,0xd2,0x7b,0xe2,0x0, 0x7c,0x86,0xe2,0xc, 0x7d,0x5a, +0x3c,0x69,0xef,0xff,0xd2,0x54,0xe7,0xfe,0x0, 0xc6,0xe3,0xff,0xc7,0xdf,0xb7,0xde, +0xe7,0xfd,0x0, 0xb4,0x12,0x0, 0x3f,0xe4,0xe7,0xfd,0x0, 0xcc,0x97,0xee,0xc7,0x86, +0xe3,0xff,0xc7,0xff,0xe7,0xfe,0x0, 0xf6,0x12,0x1, 0x3f,0xe4,0xe7,0xfd,0x0, 0xc2, +0x3f,0xe4,0xe7,0xfd,0x0, 0xbf,0xe0,0x1, 0x1f,0x4d,0xe0,0x1, 0x1f,0xc7,0x34,0x22, +0x3c,0x1e,0x9e,0x88,0x97,0x2f,0x16,0x7d,0xe2,0x0, 0xc6,0x82,0x3f,0x5c,0x3f,0x4d, +0xb7,0x2f,0x16,0x7e,0x96,0x88,0x97,0x2f,0xe2,0x0, 0xc6,0x81,0x3f,0x5c,0x3f,0x4d, +0xb7,0x2f,0xe4,0x0, 0xc4,0x85,0x9f,0x18,0xe0,0x3, 0x1e,0xb0,0xe4,0x0, 0xc7,0x5, +0x3c,0x9d,0x86,0x89,0xb7,0x1f,0xe0,0x0, 0x1f,0xbf,0xae,0x8f,0x38,0x82,0x0, 0x0, +0x8, 0xb3,0xe0,0x2, 0x19,0x2c,0x39,0xe8,0x8f,0xb2,0x2f,0xab,0xe0,0x0, 0x1f,0xa4, +0xe0,0x0, 0x1e,0xa3,0xe0,0x0, 0x17,0x0, 0xe0,0x80,0xaf,0x1f,0x3e,0xff,0x1, 0xfd, +0x17,0x80,0x16,0xff,0xaf,0x12,0xaf,0x22,0xaf,0x42,0xaf,0x32,0xae,0xd2,0xb7,0xd2, +0xb7,0xe2,0xe0,0x1, 0xaf,0x12,0xe0,0x2, 0xb7,0xb2,0xe0,0x2, 0xb7,0xc2,0xe0,0x4, +0xaf,0x52,0xe0,0x4, 0xb7,0x92,0xe0,0x4, 0xb7,0xa2,0xe0,0x8, 0xaf,0x12,0x21,0x88, +0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0x9, 0xe1, +0x8f,0x82,0x17,0x1, 0xe4,0x0, 0xc7,0x9c,0x3f,0x92,0xe0,0x1, 0x8c,0xf, 0xe0,0x2, +0x1f,0xc8,0x87,0x8f,0xe0,0x2, 0x1f,0x9e,0xaf,0xf, 0xef,0xfc,0xd4,0x4, 0x0, 0xc7, +0x8, 0xb1,0x14,0x1, 0xdf,0xbe,0xe0,0x2, 0x1f,0xac,0x15,0x0, 0x8c,0x8f,0xe0,0x0, +0x1c,0x78,0xf0,0x2, 0x19,0xc8,0xf0,0x3, 0x1a,0x30,0x3f,0x6f,0xf0,0x40,0x3a,0xef, +0x3d,0xef,0x3e,0xea,0xf0,0x0, 0x13,0x1, 0xe8,0x0, 0x8f,0x83,0xe1,0x80,0x8e,0x18, +0xe4,0x0, 0xc7,0x85,0xf0,0x0, 0x13,0x81,0xe8,0xf, 0x3f,0x94,0x8f,0x8f,0xf0,0x17, +0x3b,0x9d,0x3f,0xfc,0xe0,0x1, 0xae,0xb, 0xe0,0x6d,0x39,0xa9,0x3c,0xed,0x3f,0xfc, +0xe8,0x40,0x3e,0xe7,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3f,0xe6,0xe0,0x6f,0x39,0xaa, +0xe2,0x0, 0xce,0x83,0xc5,0x9c,0x3d,0x6f,0x1, 0xe0,0xe0,0x0, 0x2f,0xd1,0xf8,0x0, +0x8b,0x85,0xf2,0x0, 0xcb,0x82,0x5, 0x86,0x17,0x80,0xe8,0x0, 0xaf,0x85,0xf0,0x0, +0x13,0x80,0xe0,0x0, 0x1f,0xc6,0xf0,0xb, 0x33,0xa2,0xf0,0x3, 0x1b,0x33,0xe0,0x0, +0x1e,0x4b,0xf0,0x1, 0x18,0xee,0xf0,0x1, 0x19,0x70,0xf0,0x1, 0x19,0xef,0xf0,0x1, +0x1a,0x6d,0x3d,0x9f,0x16,0x80,0xf0,0x40,0x3b,0xfd,0x1, 0x26,0x8f,0x8b,0xe0,0xc, +0x14,0x52,0xe4,0x32,0xc7,0xc8,0xe0,0x25,0x14,0xf6,0xe0,0x19,0x15,0x24,0x3c,0x1f, +0x3c,0x9f,0x3d,0x1f,0x3c,0x1c,0x3f,0x9c,0x3c,0x9c,0x3d,0x1c,0xf0,0x0, 0xbb,0x4e, +0xbf,0xde,0xbc,0x6e,0xe0,0x1, 0xbc,0x8e,0xbd,0x7e,0xc6,0x81,0xe2,0x1, 0xc6,0xff, +0xe2,0x0, 0xce,0x83,0xc7,0x1c,0xc5,0x81,0x1, 0xdf,0xe8,0x0, 0x87,0x5, 0xe0,0x2, +0x1f,0xea,0xaf,0xf, 0x8, 0xe1,0xf0,0x0, 0xbb,0x4e,0xf0,0x0, 0xb8,0xde,0xf0,0x0, +0xb9,0x6e,0xf0,0x1, 0xb9,0x8e,0xf0,0x0, 0xba,0x7e,0x0, 0xe8,0xe8,0x0, 0xac,0x85, +0xe7,0xff,0x0, 0xaf,0xe0,0x2, 0x1f,0x6a,0x16,0x81,0x17,0x80,0x8d,0x8e,0xe0,0x2, +0x1c,0xfb,0xe0,0x2, 0x1f,0x2c,0xe0,0x2, 0x1d,0x77,0xe0,0x8, 0x36,0xb8,0x3e,0x6d, +0xf0,0x40,0x3b,0xef,0x3d,0xff,0x1, 0x13,0x8e,0x89,0x3e,0xd8,0x26,0x83,0xe0,0x1, +0xae,0x7e,0x8e,0x8a,0x3e,0xd8,0x26,0x83,0xe0,0x1, 0xae,0x7e,0xc7,0x81,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xee,0x38,0x82,0xf0,0x1, 0xab,0xfe, +0x0, 0xf6,0xe0,0x2, 0x1f,0x6a,0xe0,0x2, 0x1d,0xac,0x16,0x81,0x17,0x80,0xe0,0x2, +0x1c,0xfb,0x8d,0xe, 0xe0,0x8, 0x36,0xb8,0x3f,0x6b,0x3e,0x6d,0xf0,0x40,0x3b,0xef, +0x3d,0x7f,0x1, 0x18,0x8e,0x89,0x3e,0xd8,0x26,0x85,0xe0,0x1, 0xae,0x6e,0xe0,0x1, +0xae,0x7e,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xf1, +0x17,0x80,0xe0,0x1, 0xaf,0xeb,0x14,0x1, 0xe0,0x5, 0xaf,0xab,0xe0,0x8, 0xaf,0xeb, +0x38,0x82,0xf0,0x1, 0xab,0xee,0xf0,0x1, 0xab,0xfe,0x0, 0xec,0x8, 0xb7,0xf8,0x0, +0xc, 0x39,0xe0,0x2, 0x1a,0xac,0x11,0x81,0xe0,0x2, 0x1a,0x2b,0xf0,0x2, 0x1c,0x9e, +0x3b,0xe8,0x39,0x65,0xdf,0xa0,0x13,0x0, 0xf0,0x40,0x3c,0x63,0xe0,0x1, 0x8f,0xf2, +0x2f,0x98,0xc1,0x1c,0xef,0xfe,0xd5,0xe3,0x2c,0x2c,0x39,0x74,0x1, 0xf8,0x11,0x1, +0x23,0xc, 0x8f,0x85,0xe0,0x2, 0x1f,0x1e,0xe4,0x0, 0xc7,0x9c,0xa9,0xe, 0x3a,0x9f, +0xe0,0x1, 0x8c,0x5, 0xef,0xfc,0xd2,0xff,0x3c,0x62,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1, +0x3c,0x63,0xef,0xfd,0xd3,0x39,0xe0,0x1, 0x8c,0x2, 0xf8,0x0, 0xac,0x9, 0xef,0xfc, +0xd2,0xf2,0xe2,0x0, 0xcb,0x82,0x1, 0x1c,0xa4,0x52,0xe0,0x1, 0xa5,0x2, 0xa4,0xe2, +0x3d,0xe7,0xef,0xfa,0xd8,0xc3,0x3b,0x63,0xc1,0x1c,0xef,0xfe,0xd5,0xb8,0x24,0x56, +0x11,0x0, 0x23,0x63,0x8f,0x85,0x17,0x1, 0xe4,0x0, 0xc7,0x9c,0x3a,0x9f,0xe0,0x1, +0x8c,0x5, 0xe0,0x2, 0x1f,0x9e,0xaf,0xf, 0xef,0xfc,0xd2,0xd5,0x0, 0xd6,0xa4,0x72, +0x0, 0xe5,0x8, 0xb7,0xf8,0x0, 0xc, 0x3b,0x17,0xe, 0x3f,0x38,0xe0,0x3, 0x1f,0xac, +0x3a,0xe8,0x3f,0x9e,0xf0,0x0, 0x8c,0x3f,0x89,0x9f,0xef,0xfe,0xd5,0x2e,0xe2,0x0, +0xca,0x82,0xe0,0x1, 0x1a,0x6e,0xe0,0x1, 0x1f,0xed,0xe0,0x2, 0x19,0x2c,0xe0,0x2, +0x1b,0x2b,0xf0,0x1, 0x1d,0xef,0xf0,0x1, 0x1d,0x70,0xe8,0x3, 0x39,0xc8,0xf0,0x40, +0x3c,0xe8,0xe0,0x64,0x39,0x2f,0x13,0x81,0xf0,0x0, 0x14,0x0, 0xe0,0x1, 0x8f,0xf2, +0x27,0x8f,0xe2,0x0, 0xca,0x82,0x1, 0x23,0xa4,0xd2,0x3d,0xe7,0x3d,0x64,0x3c,0x69, +0xef,0xff,0xd0,0x95,0xf0,0x0, 0x2c,0x8b,0x29,0x91,0xf0,0x1, 0xac,0x72,0xc1,0x1c, +0x39,0x76,0x1, 0xed,0xf8,0x0, 0xd, 0xa8,0xb, 0xe1,0xa4,0xe2,0x3d,0xe7,0xe8,0x40, +0x3d,0x6a,0x3c,0x69,0xef,0xff,0xd0,0x83,0x21,0xf1,0xe0,0x1, 0xa4,0x82,0x3d,0xe7, +0xe8,0x40,0x3d,0x6b,0x3c,0x69,0xef,0xff,0xd0,0x7a,0x0, 0xe8,0xa4,0xf2,0x0, 0xde, +0xe0,0x2, 0x1f,0xfa,0x8f,0x8f,0x27,0xac,0xe0,0x0, 0x1f,0xbf,0x8f,0xf, 0xe0,0x0, +0x1f,0xf8,0x8f,0x8f,0x3f,0xfe,0xe0,0x0, 0x1, 0x47,0xe0,0x0, 0x1f,0xf7,0x8f,0x8f, +0x3f,0xfe,0xe0,0x0, 0x1, 0x43,0xe0,0x0, 0x1f,0xf6,0x8f,0x8f,0xe0,0x2f,0x3f,0x8e, +0x37,0xa1,0xe0,0x2, 0x1f,0x6a,0x8f,0xe, 0x3f,0x7f,0x1, 0x12,0x2c,0x12,0x17,0x1c, +0xe0,0x2, 0x1e,0xac,0x3f,0x3f,0xe2,0x0, 0xcc,0x82,0x3f,0x1d,0xa5,0x5e,0x1, 0x1e, +0xe0,0x1, 0x1f,0xf2,0x15,0x80,0xa4,0x8f,0x3c,0x69,0xe7,0xe0,0x0, 0xc8,0x38,0x82, +0x17,0x7e,0x3f,0x18,0xe2,0x0, 0xcf,0x1, 0x5, 0x97,0x15,0x1, 0xe0,0x2a,0x3c,0xa, +0x2d,0x5, 0x17,0x4, 0xe0,0x28,0x3c,0xe, 0x24,0x6c,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, +0x1f,0x2c,0x3f,0x9e,0xe0,0x1, 0xa5,0xf, 0x0, 0xe4,0xc7,0x81,0xe4,0x0, 0xc7,0x9c, +0x3f,0x9d,0xa5,0xf, 0x0, 0xde,0xe4,0x0, 0xc7,0x9c,0xe0,0x2, 0x1f,0x2c,0x3f,0x9e, +0xa5,0x6f,0x0, 0xd7,0x17,0x80,0x0, 0xc6,0x17,0x81,0x0, 0xc4,0xe0,0x2, 0x1f,0xac, +0xe4,0x0, 0xc4,0x9c,0x17,0x1, 0x3c,0x9f,0xe0,0x1, 0x8c,0x9, 0xe0,0x2, 0x1f,0x9e, +0xaf,0xf, 0xe7,0x84,0x0, 0xa0,0x8, 0xb3,0xe0,0x2, 0x1f,0x66,0xe0,0x2, 0x19,0x9e, +0x17,0x80,0x8f,0xe, 0xaf,0x83,0x27,0xa, 0xe0,0x2, 0x19,0x2c,0x8f,0x32,0xe2,0x0, +0xcf,0x2, 0x1, 0x19,0xe2,0x0, 0xcf,0x3, 0x1, 0x2, 0x9, 0xe1,0x8c,0x52,0x8f,0x82, +0xe2,0x1, 0xcc,0x7f,0x1, 0x30,0x17,0x2, 0xe1,0x2f,0x3f,0x9e,0x2f,0x85,0xe1,0x2e, +0x3c,0x1e,0x2f,0x2, 0xdb,0x77,0x17,0x80,0xaf,0xc2,0x17,0xff,0xaf,0xd2,0x17,0x80, +0xaf,0xb2,0x9, 0xe1,0xe0,0x1, 0x1e,0x51,0x16,0x9c,0x8f,0xc, 0x3e,0xbe,0x3e,0x92, +0xe0,0x1, 0x8d,0x9d,0x25,0xe3,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x2, +0xe0,0x1, 0xaf,0x9d,0x2, 0x8d,0xaf,0xc, 0xe4,0x0, 0xc7,0x1c,0x17,0x81,0x3f,0x12, +0xe0,0x1, 0x8c,0xe, 0xaf,0x83,0xef,0xfc,0xd1,0xde,0x8f,0x32,0x0, 0xcc,0xaf,0x8c, +0x17,0x0, 0x0, 0xf3,0xe4,0x0, 0xc7,0x9c,0x17,0x1, 0x3f,0x92,0xe0,0x1, 0x8c,0xf, +0xaf,0x3, 0xef,0xfc,0xd1,0xd0,0x0, 0xd4,0xe0,0x2, 0x1f,0xac,0x8c,0x4f,0x38,0x82, +0xe0,0x2, 0x1f,0xfa,0x8f,0x8f,0xe0,0x0, 0x27,0xdf,0xe0,0x2, 0x1f,0xc0,0xe0,0x4, +0x8f,0xdf,0xe2,0x0, 0xcf,0x81,0xe0,0x0, 0x1, 0x57,0x8, 0xb5,0xe2,0x0, 0xcc,0x1, +0x39,0x68,0x39,0xe9,0x17,0x84,0x1, 0x9, 0xef,0xfe,0xd4,0x1f,0xe2,0x0, 0xcc,0x0, +0x17,0x2, 0xe0,0x6e,0x39,0x28,0x3f,0xee,0x39,0xff,0xe0,0x2, 0x1a,0x2c,0xe0,0x1, +0x1, 0x54,0x8f,0xb4,0x2f,0xa0,0xe0,0x0, 0x1e,0xa4,0xe0,0x0, 0x1d,0xa3,0x17,0x80, +0xe0,0x80,0x8e,0x1d,0x17,0x1, 0x3f,0x1f,0xe2,0x0, 0xce,0x1, 0xe2,0x1, 0xc7,0x7f, +0xe0,0x6f,0x39,0x2e,0x3d,0xfd,0x1, 0xf5,0xe2,0x0, 0xcf,0x87,0xea,0x12,0x7f,0xa8, +0xe0,0x1, 0x2, 0xe0,0x8f,0xf, 0xe2,0x0, 0xcf,0x1f,0x5, 0x85,0x17,0x20,0xaf,0xf, +0x17,0x80,0xaf,0xc4,0x3c,0xe2,0x3c,0x63,0xef,0xfd,0xd2,0x14,0x8a,0xb4,0xe2,0x0, +0xca,0x81,0xe0,0x1, 0x1, 0x5, 0xe2,0x0, 0xca,0x82,0x1, 0x94,0xe2,0x0, 0xc9,0x1, +0xe0,0x1, 0x1, 0x44,0x3c,0x62,0xef,0xfe,0xd3,0xe0,0xe2,0x0, 0xcc,0x0, 0x17,0x80, +0xe0,0x65,0x39,0x28,0x3c,0x65,0xe1,0x2f,0x39,0x8f,0x27,0x86,0xe1,0x29,0x39,0x88, +0x24,0x83,0xa, 0xe1,0x38,0x82,0x8f,0x94,0x16,0x9c,0x3e,0xbf,0xe0,0xc, 0x3a,0x1d, +0xe0,0x1, 0x87,0x1c,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, +0xaf,0x1c,0x5, 0xf0,0xe0,0x1, 0x1d,0xc7,0x9d,0x5c,0x9f,0xb, 0x3f,0x1a,0xe2,0xff, +0xcf,0x7e,0xe0,0x1, 0x5, 0x34,0xe0,0xff,0x17,0x7f,0xb7,0x5c,0x3e,0x94,0x9f,0xb, +0x9e,0x6d,0x3e,0x7e,0x3, 0x83,0x9f,0xb, 0xb7,0x6d,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x82,0xe0,0x1, 0x2, 0xac,0xaf,0x94,0x8d,0x84,0x3f,0xfb,0xe0,0x1, +0x1, 0x2c,0x8f,0xa4,0xe0,0x0, 0x1f,0x73,0x8f,0xe, 0x3f,0x7f,0x2, 0xcb,0x14,0x0, +0xe0,0x2, 0x1f,0x2c,0x3c,0xe8,0xe1,0xff,0x16,0x7f,0x3f,0xe8,0x9e,0xde,0x15,0x1, +0x3e,0xfc,0x3d,0x1f,0x3, 0x84,0x9c,0x6e,0x3c,0xef,0x3e,0x6d,0x3f,0xea,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x83,0xc7,0x1c,0x1, 0xf2,0x3d,0xf9,0x1, 0x1a,0xe4,0x0, +0xc5,0x9c,0xe0,0xf, 0x3a,0x1b,0x9f,0xdf,0xe0,0xe, 0x37,0xc2,0xe4,0x0, 0xc7,0x3, +0x3f,0x7c,0x5, 0x8b,0xe0,0x0, 0x1f,0x75,0x8e,0x8e,0xe0,0x0, 0x1f,0x74,0x36,0xa8, +0x8f,0xe, 0x3f,0x4d,0x3f,0x78,0x2, 0x87,0x37,0xc1,0x3f,0xfc,0xe0,0x0, 0x2, 0xfc, +0xe0,0x1, 0x14,0xff,0x17,0x83,0xac,0xd4,0xaf,0xb4,0xa, 0xe1,0xe0,0x0, 0x1f,0xbb, +0xe0,0x6, 0x8f,0xdf,0xc7,0xff,0x3c,0x7f,0xe7,0xff,0x1, 0x8d,0x17,0x80,0x8e,0x84, +0xb7,0xd4,0x17,0x0, 0xb7,0xe4,0x16,0x7f,0xe0,0x1, 0xaf,0x94,0xe0,0x2, 0xb7,0xb4, +0xe0,0x2, 0xb7,0xc4,0xe0,0x4, 0xb7,0x94,0xe0,0x4, 0xb7,0xa4,0xe0,0x1, 0x1f,0xd1, +0xae,0x94,0xae,0x8f,0x17,0x82,0xaf,0x24,0xae,0x54,0xe0,0x4, 0xaf,0x54,0xe0,0x8, +0xaf,0x14,0xaf,0xb4,0xa, 0xe1,0x8f,0x34,0xe7,0xfe,0x2f,0x4e,0xea,0x12,0x7e,0xa9, +0x87,0x8d,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x93,0x2, 0xac,0xaf,0x8d, +0xe0,0x0, 0x1f,0x75,0xe0,0x1, 0x1e,0x47,0x8e,0x8e,0xe0,0x0, 0x1f,0x74,0x9e,0xc, +0x8f,0xe, 0x36,0xa8,0x3f,0x4d,0x3e,0x7e,0xe0,0x0, 0x1f,0x22,0x3f,0x9e,0x5, 0xa3, +0x17,0x1, 0xaf,0xf, 0xe7,0xfe,0x0, 0x91,0x17,0x85,0x14,0x4, 0xe7,0xfe,0x0, 0xc5, +0xe0,0x0, 0x1c,0x22,0x17,0x1, 0x16,0x80,0x15,0x14,0x14,0x80,0xae,0x8f,0xaf,0x44, +0xaf,0x34,0xe0,0x4, 0xd4,0xd9,0xe0,0x0, 0x1f,0x91,0xe0,0x2, 0x17,0x68,0xb7,0xf, +0xe7,0xfe,0x0, 0x9a,0xaf,0xd, 0x3f,0xee,0x0, 0xd4,0x9f,0xb, 0x3d,0x1e,0xb5,0x5c, +0xe7,0xfe,0x0, 0xce,0x17,0x0, 0xaf,0xf, 0xe7,0xfd,0x0, 0xef,0x17,0x80,0xaf,0x94, +0x17,0x80,0xe7,0xfe,0x0, 0xd4,0x87,0xa4,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xaf,0xa4, +0xe7,0xfe,0x0, 0xd2,0xe0,0x0, 0x1f,0xf5,0x3d,0x94,0x8f,0xf, 0xe0,0x0, 0x1f,0xf4, +0x37,0x28,0x8f,0x8f,0x9e,0xeb,0x3f,0xce,0x3e,0xff,0xe0,0x1, 0x17,0xff,0xe0,0x6f, +0x3a,0xa9,0x3c,0xef,0xe7,0xfe,0x0, 0xf8,0xe0,0x2, 0x1f,0xac,0xe0,0x1, 0x8f,0xf, +0x3f,0x78,0x1, 0xd, 0xe0,0x4, 0x8f,0x4f,0x3f,0x78,0x1, 0x9, 0xe0,0x8, 0x8f,0xf, +0x3f,0x78,0x1, 0x5, 0xe0,0x1, 0xac,0xf, 0x14,0x1, 0x38,0x82,0x14,0x0, 0x38,0x82, +0xe2,0x1, 0xcc,0x80,0xe0,0x2, 0x1f,0xac,0x1, 0x1f,0xe2,0x1, 0xcc,0x81,0x1, 0x2b, +0xe2,0x0, 0xcc,0x82,0x5, 0x82,0x14,0x80,0x8f,0x8f,0x3c,0xff,0x1, 0x4, 0xe2,0x0, +0xcf,0x82,0x5, 0x86,0xe0,0x2, 0x1f,0x93,0xe0,0x1, 0xac,0xaf,0x38,0x82,0x8, 0xb1, +0xc0,0x7c,0x3c,0x69,0x7c,0x81,0xd9,0xbe,0x64,0x81,0xe0,0x2, 0x1f,0x93,0xe0,0x1, +0xac,0xaf,0xc0,0x4, 0x8, 0xe1,0xe0,0x1, 0x8f,0xf, 0xe0,0x4, 0x8e,0xcf,0x14,0x80, +0x3f,0x7d,0x3, 0x9b,0xe0,0x8, 0x8e,0x8f,0x3e,0xfe,0x17,0x2, 0xe0,0x6e,0x3a,0xa9, +0x3c,0xee,0x0, 0xdb,0xe0,0x1, 0x8f,0xf, 0xe0,0x4, 0x8e,0xcf,0x14,0x80,0x3f,0x7d, +0x5, 0x89,0xe0,0x8, 0x8e,0x8f,0x3e,0xfe,0x17,0x2, 0xe0,0x6e,0x3c,0xa9,0x3c,0xee, +0x0, 0xcc,0x3f,0x6d,0x14,0x81,0x0, 0xf6,0x3f,0x6d,0x14,0x81,0x0, 0xe4,0x0, 0x0, +0x8, 0xb7,0xe0,0x2, 0x1f,0x7d,0x8f,0xfe,0x89,0x6e,0x8a,0x5e,0x27,0xad,0x12,0xff, +0x3a,0x9f,0xe2,0x1, 0xc2,0xff,0xe0,0x4c,0xc2,0xa7,0xe0,0x1, 0x1f,0xff,0x32,0xa1, +0xe0,0x1, 0x1b,0x64,0x39,0xe8,0x3a,0x9f,0xe0,0x0, 0x13,0x80,0x21,0x1e,0x14,0x0, +0x3f,0x67,0x3e,0x64,0xe3,0xff,0xc7,0x7f,0xe0,0x40,0x3f,0xe8,0xe0,0xd, 0x37,0x21, +0xc7,0x81,0x3e,0x93,0xe2,0x1, 0xc7,0xff,0x96,0x8d,0x39,0x7f,0x3f,0x1c,0x3c,0x1d, +0xe3,0xff,0xc7,0x7f,0x1, 0xf4,0x3c,0xe2,0xe0,0x4, 0xd3,0x82,0xe0,0x80,0xb4,0x16, +0x3a,0xf6,0xc3,0x81,0x1, 0xe4,0xb, 0xe1,0x3c,0x62,0x3c,0xe2,0xe0,0x4, 0xd3,0x78, +0xe0,0x80,0xb4,0x16,0x3a,0xf6,0xc3,0x81,0x1, 0xda,0x0, 0xf6,0xe0,0x0, 0x24,0xd3, +0x8, 0xb3,0x16,0x7f,0x3e,0x19,0xe2,0x1, 0xc6,0x7f,0x11,0x7e,0x39,0x18,0x36,0x21, +0x3e,0x18,0x39,0xe2,0xe0,0x0, 0x14,0x0, 0xe0,0x43,0x3d,0x9a,0xe0,0x80,0x97,0x13, +0xe4,0xd, 0x37,0xf, 0xe2,0xf, 0x3e,0xce,0x3f,0xad,0xe0,0x43,0x3f,0x9f,0x3f,0xfa, +0xe0,0x6f,0x3a,0x2b,0x3e,0x73,0x3c,0x1f,0x1, 0xf2,0xe0,0x4, 0xd3,0x51,0xe2,0x0, +0xcc,0x8, 0x15,0x88,0xe0,0x6b,0x3b,0x28,0xe7,0xfe,0x16,0x2f,0xe0,0x0, 0x15,0x6d, +0x0, 0x91,0xe0,0xe, 0x3f,0xab,0xe0,0x2d,0x3f,0xac,0xe0,0x43,0x3f,0x1e,0x26,0x99, +0xe0,0x2d,0x3e,0x1e,0x26,0x96,0xe0,0xf, 0x37,0x2, 0xe0,0x80,0xb7,0x92,0x39,0xf2, +0x1, 0x18,0xe0,0x0, 0x97,0x92,0xe2,0x0, 0xcf,0x87,0x2, 0x6c,0xe3,0xff,0xcf,0xf9, +0x3, 0x75,0xe0,0xe, 0x3d,0x9f,0xe0,0x2d,0x3f,0xac,0xe0,0x43,0x3f,0x1e,0x2e,0xe9, +0xe0,0x2f,0x3d,0x2f,0x27,0x84,0xe0,0x2f,0x3f,0x1a,0x2f,0xe6,0x3f,0xee,0x0, 0xe6, +0x9, 0xe1,0x38,0x82,0x8, 0xb7,0xf8,0x0, 0xc, 0x39,0xe0,0x2, 0x1f,0xfd,0xe0,0x1, +0x1b,0x72,0x8a,0x6f,0xa4,0x86,0xe0,0x1, 0x1c,0x62,0xe7,0x0, 0x16,0x0, 0xe0,0xff, +0x15,0xff,0x15,0x0, 0x8a,0xff,0xef,0xfe,0xde,0x8, 0x22,0x2f,0xc2,0x7f,0xe2,0x1, +0xc2,0x7f,0xe0,0x4b,0xc2,0x6b,0xe0,0x1, 0x1f,0xff,0x32,0x21,0xe0,0x1, 0x19,0xe1, +0xe0,0x19,0x32,0xa1,0x3a,0x1f,0x11,0x0, 0xf0,0x0, 0x14,0x3, 0xe0,0x0, 0x13,0xda, +0xe0,0x80,0x97,0x93,0xe8,0x40,0x3c,0xe8,0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f, +0xe0,0x8, 0x3f,0xa8,0xe0,0x4, 0xd2,0xec,0xe2,0x0, 0xcc,0x5a,0xa7,0x86,0x3d,0x67, +0xe0,0x6a,0x3b,0x28,0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x3f,0x92,0x3c,0xe5,0xdf,0x6f, +0x3a,0x73,0xe8,0x2, 0x39,0x19,0x1, 0xe5,0xf8,0x0, 0xc, 0xa8,0xb, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xe1,0xff,0xc0,0x8, 0xe0,0x2, 0x1f,0xfd,0xf0,0x1, +0x1e,0x7f,0x8a,0x7f,0xe8,0x40,0x3c,0x6c,0x8b,0x6f,0xef,0xff,0xdf,0x1b,0xe0,0x0, +0x22,0x4f,0x13,0xff,0x3b,0x94,0x11,0xff,0xe2,0x1, 0xc3,0xff,0x39,0x96,0xe0,0x4c, +0xc3,0xa7,0xe2,0x1, 0xc1,0xff,0xf0,0x0, 0x14,0x4, 0xf0,0x18,0x3c,0x10,0x33,0xa1, +0x31,0xa1,0xe0,0x1, 0x1a,0xe4,0xe8,0x7, 0x3b,0x9c,0x32,0x21,0xe8,0x3, 0x39,0x98, +0xf0,0x0, 0x15,0x3, 0xf0,0x0, 0x14,0xda,0xf0,0x0, 0x15,0x80,0xe0,0x80,0x97,0x95, +0xe8,0x40,0x3c,0xea,0xe4,0x8, 0x37,0x8f,0xe2,0xf, 0x3c,0x4f,0xe0,0x8, 0x3f,0xa8, +0xe0,0x4, 0xd2,0x9e,0xe2,0x0, 0xcc,0x5a,0xe8,0x40,0x3d,0x69,0xe0,0x6a,0x3b,0x28, +0xe3,0xff,0xc5,0x7f,0x23,0x21,0x11,0x2, 0x39,0x10,0x3f,0x62,0xe8,0x40,0x3f,0xec, +0x96,0x8f,0x3f,0x94,0xe0,0x80,0xb6,0x9e,0x3f,0x73,0x1, 0xfb,0x3c,0xe6,0xe8,0x40, +0x3c,0x68,0xdf,0x15,0xe8,0x40,0x3f,0xec,0xe0,0x80,0x97,0x12,0x39,0x73,0xb7,0xf, +0x3f,0x94,0x1, 0xfb,0x3a,0xf7,0xf0,0x0, 0xc6,0x2, 0x1, 0xd1,0xe0,0x0, 0xc0,0x78, +0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe8,0x40,0x3c,0xeb,0xe8,0x40,0x3c,0x68,0xde,0xff, +0x3a,0xf7,0xf0,0x0, 0xc6,0x2, 0x1, 0xc3,0x0, 0xf2,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x68,0xe0,0x3, 0x1f,0xc7,0xf0,0x2, 0x1e,0x7d,0x8f,0xf, 0xe8,0x0, +0x8e,0x4c,0xe8,0x0, 0x8e,0xdc,0xe2,0x0, 0xcf,0x1, 0x7e,0x4, 0x3a,0x68,0x7e,0x85, +0x39,0xe9,0xe0,0x2, 0x1, 0x77,0x8f,0x8f,0xe0,0x1, 0x1f,0x8, 0xe2,0x0, 0xcf,0x83, +0xe0,0x1, 0x1f,0x89,0x8f,0x8f,0xe0,0x2, 0x1, 0x73,0xf0,0x0, 0x8d,0xe, 0x37,0xa8, +0xf0,0x1a,0x3d,0x4f,0xf0,0x0, 0x7d,0x1, 0xe0,0x2, 0x22,0x1f,0x67,0x4, 0x12,0x80, +0x3f,0xee,0xc7,0xff,0x7f,0x86,0xf0,0x40,0x3f,0x65,0xf0,0x0, 0x1e,0x8d,0xf0,0x2, +0x1c,0xbc,0xe0,0x1, 0x1b,0xff,0x13,0x3, 0xe0,0x1, 0x29,0x8e,0xe8,0x0, 0x8f,0x8d, +0xf8,0x0, 0x8d,0x9d,0x3f,0xfe,0xe0,0x0, 0x1, 0x76,0xe8,0x0, 0x8f,0x9, 0xe2,0x0, +0xcf,0x1, 0xe0,0x1, 0x1, 0x7, 0xe8,0x0, 0x89,0x5c,0x66,0x1, 0x39,0x3f,0xe8,0x2, +0x39,0x1b,0xf0,0x40,0x3d,0xe2,0xf3,0xff,0xc5,0xff,0xf0,0xe, 0x35,0xa1,0x3f,0x17, +0x96,0x8e,0xe4,0x9, 0x36,0x8f,0xe2,0xe, 0x3c,0xcd,0x3f,0x29,0x3f,0x7c,0xe0,0x0, +0x2, 0x5a,0xe0,0x1, 0x2f,0x96,0x67,0x84,0x39,0x65,0xe2,0x0, 0xcf,0x81,0xe0,0x2, +0x2, 0x47,0xe2,0x0, 0xce,0x80,0xe0,0x1, 0x4, 0x26,0x3f,0xe5,0xe3,0xff,0xc7,0xff, +0x37,0xcf,0xe0,0x1, 0x27,0xad,0x3f,0xe2,0xe3,0xff,0xc7,0xff,0x37,0xcf,0xe0,0x1, +0x27,0xa7,0x17,0x8e,0xe8,0xf, 0x3f,0x9b,0x37,0xa1,0xe8,0xf, 0x3f,0x9c,0x9c,0xf, +0x3c,0xe6,0xe0,0x4, 0xd2,0x30,0x11,0x7c,0xe8,0x2, 0x39,0x1b,0xf0,0x40,0x3c,0x68, +0xf3,0xff,0xc4,0x7f,0xe3,0xff,0xc1,0x7f,0x17,0x7f,0xe8,0xe, 0x3f,0x1b,0xf0,0x40, +0x3d,0x6e,0xf3,0xff,0xc5,0x7f,0x17,0x8e,0xe8,0xf, 0x3f,0x9a,0x37,0xa1,0x3c,0xe6, +0xe8,0xf, 0x3f,0x9c,0xf0,0x2, 0x25,0x8e,0xf0,0x40,0x3d,0x72,0xe0,0x1, 0x1, 0x31, +0x9c,0xf, 0xe0,0x4, 0xd2,0x10,0xe3,0xff,0xc4,0x7f,0xf0,0x40,0x3c,0x78,0xe0,0x1, +0x1, 0xfb,0xf8,0x40,0x3d,0xea,0x0, 0xe1,0x17,0xff,0x3f,0x92,0x39,0x6f,0xe2,0x1, +0xc1,0x7f,0xe0,0x1, 0x29,0x49,0x29,0x86,0x14,0x80,0xe8,0x40,0x3c,0x6e,0xe0,0x0, +0xdc,0x1d,0x16,0x1, 0xe8,0xc, 0x3e,0x1e,0xf0,0x40,0x3f,0x6c,0xf2,0x1, 0xc7,0x7f, +0xe8,0x40,0x3a,0x7e,0xf0,0x0, 0xc6,0x82,0xe0,0x1, 0x1, 0x7, 0xe8,0x0, 0x8f,0x4c, +0xe7,0xfe,0x21,0xf6,0xe8,0x7, 0x8f,0xcd,0xf8,0x7, 0x8d,0xdd,0xe7,0xfe,0x0, 0xf4, +0x27,0xe9,0xe0,0x1, 0x1e,0x42,0xe0,0xe, 0x8f,0x1c,0xc7,0x7f,0xe0,0x2e,0x3f,0xf, +0x2f,0x61,0xf0,0x2e,0x3d,0x8e,0x2f,0x5e,0xe0,0xe, 0x8f,0x2c,0xc7,0x7f,0xf0,0x40, +0x3d,0xfe,0x1, 0x58,0xe8,0x0, 0x89,0x5c,0x66,0x1, 0x39,0x3f,0xe8,0x2, 0x39,0x1b, +0xf0,0x40,0x3d,0xe2,0xf3,0xff,0xc5,0xff,0xf0,0xe, 0x35,0xa1,0x3f,0x17,0x96,0x8e, +0xe4,0x9, 0x36,0x8f,0xe2,0xe, 0x3c,0xcd,0x3f,0x29,0x3f,0x7c,0x2, 0x43,0x66,0x5, +0xf0,0x9, 0x3d,0xac,0x66,0x6, 0x34,0xa1,0x3e,0x7f,0x3c,0x97,0x91,0x9, 0xe0,0x1, +0x5, 0x38,0x64,0x85,0xe2,0x0, 0xcf,0x80,0xe8,0x9, 0x3c,0x9b,0x34,0xa1,0x3c,0x97, +0x92,0x89,0x3f,0xe5,0xe0,0x6f,0x39,0xa2,0xe2,0x0, 0xce,0x80,0x39,0x6f,0xe7,0xfe, +0x3, 0x5e,0xe0,0x41,0x3f,0x82,0xe3,0xff,0xc7,0xff,0x37,0xcf,0x27,0x88,0xe0,0x41, +0x3f,0x85,0xe3,0xff,0xc7,0xff,0x37,0xcf,0xe7,0xfe,0x2f,0xdd,0xe4,0x0, 0xc7,0xa, +0xe1,0xff,0x14,0x7e,0x3c,0x5e,0x14,0x9e,0xe0,0x4, 0xd1,0x8d,0xe4,0xe, 0x31,0xf, +0xe2,0xf, 0x3f,0x42,0x3f,0xae,0xe3,0xff,0xc4,0x7f,0xe3,0xff,0xc7,0xff,0xe1,0x2f, +0x3c,0x1f,0xe7,0xff,0x27,0x88,0xe4,0xe, 0x32,0x8f,0xe2,0xf, 0x3f,0x45,0x3f,0xae, +0xe3,0xff,0xc7,0xff,0xe1,0x2f,0x3c,0x1f,0xe7,0xfe,0x2f,0xbd,0x16,0x1, 0xe8,0xc, +0x3e,0x1e,0xf0,0x40,0x3f,0x6c,0xf2,0x1, 0xc7,0x7f,0xe8,0x40,0x3a,0x7e,0xf0,0x0, +0xc6,0x82,0xe7,0xfe,0x1, 0xfd,0xc0,0x18,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x79,0x3, +0xf0,0xd, 0x35,0x21,0xe8,0x0, 0x9f,0x5c,0xc6,0x9a,0x7f,0x2, 0xf0,0x1b,0x3e,0x1d, +0x11,0x1, 0xe8,0x80,0x9c,0x1b,0x3c,0xe6,0xe0,0x4, 0xd1,0x55,0xe3,0xff,0xc4,0x7f, +0xf0,0x40,0x3c,0x78,0xf0,0x0, 0x13,0x81,0x14,0x81,0xf0,0x17,0x3b,0x92,0xe8,0x9, +0x3c,0x9a,0xe7,0xfe,0x1, 0xc3,0x67,0x82,0xe8,0x40,0x3f,0xfa,0xf0,0x40,0x3d,0x69, +0xf3,0xff,0xc5,0x7f,0x5, 0x88,0xe8,0x40,0x39,0x67,0xe2,0x1, 0xc1,0x7f,0xe2,0x0, +0xc9,0x5, 0x1, 0xe0,0x16,0xff,0x3e,0x92,0x67,0x83,0x66,0x3, 0xe2,0x1, 0xc6,0xff, +0x37,0xa1,0x3e,0x9c,0xc7,0xfe,0x36,0xa1,0x3f,0x97,0x3e,0x97,0x97,0x1f,0x37,0x2, +0xe0,0x80,0xb7,0x1f,0x3f,0xfd,0x1, 0xfb,0xe7,0xfe,0x29,0xad,0xe7,0xfe,0x0, 0xa6, +0xe0,0x1, 0x1f,0xd7,0x9f,0xaf,0x7f,0x81,0xe7,0xfd,0x0, 0x98,0x8c,0xe, 0x37,0xa8, +0x3c,0x4f,0x14,0x8a,0x34,0x23,0xe0,0x4, 0xd0,0xd3,0xe3,0xff,0xc4,0x7f,0x7c,0x1, +0xe7,0xfd,0x0, 0x8c,0xf0,0x0, 0x7d,0x83,0xf8,0x40,0x3d,0x6b,0xe7,0xff,0x0, 0xaa, +0xf8,0x40,0x3d,0x6b,0xf0,0x0, 0x7d,0x83,0xe7,0xff,0x0, 0xa4,0x67,0x85,0xe8,0xf, +0x3f,0x9b,0x37,0xa1,0x3f,0x97,0x92,0x8f,0x39,0x65,0xe7,0xfd,0x0, 0xb4,0x3e,0x62, +0xe0,0x6c,0x39,0xa5,0x3a,0xec,0xe7,0xfd,0x0, 0xae,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f, +0xe2,0x0, 0xcf,0x83,0x1, 0x2, 0x38,0x82,0x8, 0xb1,0xe0,0x1, 0x1f,0x7, 0xe0,0x1, +0x1f,0xd7,0x86,0x8e,0xe0,0x0, 0x17,0x5a,0xb7,0x1f,0xb7,0x2f,0xe7,0xff,0x17,0x26, +0xae,0x9f,0xb7,0x3f,0xef,0xfa,0xd9,0x6, 0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0x2c,0xa, +0xe0,0x0, 0x1f,0x8c,0x8c,0xf, 0x2c,0x2, 0x8, 0xe1,0x14,0x81,0x8, 0xa1,0xe7,0xfc, +0x0, 0xa7,0x14,0x80,0xde,0x24,0x0, 0xf5,0xe0,0x3, 0x1f,0xc7,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0x2, 0x38,0x82,0xe0,0x0, 0x1f,0x8e,0x8c,0xf, 0x24,0x7c,0x14,0x80, +0xe7,0xfc,0x0, 0x96,0x8, 0xb7,0xe1,0xff,0xc0,0x30,0x12,0x8c,0x3a,0x90,0xe0,0x0, +0x15,0x48,0x14,0x80,0x3c,0x65,0xe0,0x4, 0xd1,0xf, 0xef,0xfa,0xd8,0xdb,0xe0,0x2, +0x1f,0xe6,0xe0,0x2, 0x1a,0x7d,0x87,0x8f,0xe0,0x3, 0x8f,0x24,0xe2,0x0, 0xc7,0x81, +0x3f,0x7f,0xe0,0x2, 0x1, 0x45,0x87,0xa4,0x89,0x4, 0xe4,0xf, 0x37,0xa8,0xe4,0xe, +0x37,0xc8,0xe2,0x0, 0xcf,0x21,0xea,0x40,0xcf,0x0, 0xe0,0x6f,0x3b,0xae,0xe4,0xf, +0x37,0xc8,0x39,0xef,0xe0,0x2, 0x27,0xba,0xf7,0xff,0x12,0x7f,0xf0,0x14,0x3a,0x1f, +0xfa,0x4e,0x7b,0xf4,0xe0,0x1, 0x1f,0xf2,0x8d,0x54,0xf9,0xff,0xc3,0xff,0xf3,0xff, +0xc2,0x7f,0xf0,0x0, 0xa3,0xf, 0x3d,0xe2,0xf8,0x14,0x3a,0x17,0x35,0x21,0x17,0x80, +0xf0,0x40,0x3a,0xe5,0x25,0x9a,0x14,0x98,0x3c,0xbf,0xe8,0x40,0x3f,0x66,0xf0,0xf, +0x3a,0x99,0xe0,0x1, 0x9c,0x1f,0xa6,0x8f,0x17,0x80,0xc7,0x81,0xe3,0xff,0xc7,0xff, +0x96,0xe, 0x3f,0xfb,0x3e,0x9c,0x3f,0x1a,0x1, 0xf9,0xf0,0xf, 0x3a,0x99,0xe0,0xe, +0x3d,0x98,0xbe,0x8f,0xe0,0x1, 0xb7,0x1f,0xf8,0x40,0x3a,0x77,0xf0,0x0, 0xc3,0x2, +0x1, 0x4, 0xe8,0x80,0x8f,0x97,0x0, 0xdf,0x64,0x3, 0x5c,0x8f,0x12,0x8c,0x3a,0x90, +0xe0,0x4, 0xd0,0x16,0xb4,0x65,0xe0,0x2, 0x9c,0xd5,0xa4,0x65,0xe0,0x4, 0xd0,0x10, +0xe0,0x2, 0xb4,0x25,0xe0,0x4, 0x9c,0x95,0xe0,0x1, 0xa4,0x45,0xe0,0x4, 0xd0,0x8, +0xe0,0x3, 0xb4,0x65,0xe0,0x0, 0x21,0xd9,0xf7,0xff,0x10,0xff,0xe0,0x1, 0x1f,0xf2, +0xfa,0x4e,0x79,0xf4,0xf0,0x11,0x38,0x93,0xf0,0x0, 0x8a,0x54,0xf9,0xff,0xc1,0xff, +0xf3,0xff,0xc0,0xff,0x3c,0xe2,0xf0,0x0, 0xa1,0xf, 0xe2,0x1, 0xc4,0xff,0xf8,0x11, +0x38,0x93,0xf0,0x14,0x32,0x21,0x15,0x0, 0x24,0xb7,0xe4,0x0, 0xc5,0x18,0xf0,0x0, +0x13,0x8, 0x3d,0x15,0xf0,0x0, 0x13,0x96,0x14,0x4, 0xf0,0x0, 0x92,0xea,0xf0,0x16, +0x3b,0x1a,0xf0,0x17,0x3b,0x9a,0x3c,0x1a,0xe8,0x40,0x3f,0x62,0x17,0x80,0xc5,0x14, +0x0, 0x8e,0xa5,0x88,0x96,0xa, 0xc7,0x81,0xe3,0xff,0xc7,0xff,0x3e,0x9b,0xc6,0x1, +0x3f,0xf9,0xbe,0x88,0xe8,0xe, 0x3f,0x14,0xb6,0xa, 0x1, 0x16,0x96,0x8e,0xe8,0x40, +0x3e,0xf5,0x5, 0x70,0xe8,0x0, 0xa5,0x86,0xe8,0x0, 0x96,0x7, 0xc7,0x81,0xe3,0xff, +0xc7,0xff,0x3e,0x9b,0xc6,0x1, 0x3f,0xf9,0xe8,0x0, 0xbe,0x86,0xe8,0xe, 0x3f,0x14, +0xe8,0x0, 0xb6,0x7, 0x1, 0xec,0xf8,0x40,0x39,0xf1,0xf0,0x0, 0xc1,0x2, 0x1, 0x4, +0xe8,0x80,0x8d,0x13,0x0, 0xc2,0x13,0xc, 0x3b,0x10,0xe0,0x0, 0x13,0xd4,0x3b,0x90, +0x3a,0xe6,0xe0,0x1, 0x9f,0xa5,0x3c,0xef,0xe0,0x0, 0x27,0xfc,0xa4,0x15,0xe0,0x3, +0xdf,0x9f,0xb4,0x75,0xe0,0x1, 0x9f,0xb5,0x3c,0xef,0xe0,0x0, 0x27,0xef,0xa4,0x25, +0xe0,0x3, 0xdf,0x96,0xe0,0x1, 0xb4,0x5, 0xc2,0x98,0x3b,0xf5,0x1, 0xeb,0xe0,0x0, +0x1f,0x8d,0x17,0x4, 0x3f,0x10,0xe0,0x1b,0x95,0x1f,0x3d,0xee,0x17,0x80,0xe0,0x1, +0x14,0x16,0xe7,0xfe,0x14,0xea,0xe3,0xfe,0xcd,0x38,0xe0,0x0, 0x3, 0x45,0xe0,0x1, +0x9e,0xb6,0xe2,0x0, 0xce,0xe3,0x5, 0xbf,0xe0,0x1, 0x96,0x86,0xe0,0xc, 0x37,0xa1, +0xe3,0xfe,0xce,0xea,0xb6,0x8e,0x3e,0x1b,0x3, 0x3e,0xb4,0x8c,0xc7,0x81,0xe2,0x0, +0xcf,0x83,0xc3,0x18,0xc7,0x2, 0x1, 0xe8,0xe0,0x0, 0x21,0xc7,0xe0,0x1, 0x1f,0xf2, +0xea,0x4e,0x7a,0xf4,0xc1,0xff,0xe9,0xff,0xc2,0xff,0xe3,0xff,0xc1,0xff,0xa4,0x8f, +0xe2,0x1, 0xc1,0x7f,0x39,0x95,0x3c,0x65,0xe0,0x0, 0x17,0x80,0xe0,0xb, 0x3c,0x25, +0x21,0x15,0xe2,0x0, 0x7f,0x4, 0x37,0xa1,0x3f,0x9e,0x9d,0xf, 0x17,0x0, 0x8f,0xd4, +0x3f,0xbe,0xc7,0x1, 0x3f,0x9b,0x37,0xa1,0x3f,0x99,0x96,0x8f,0x3e,0x6e,0xe3,0xff, +0xc6,0x7f,0x3e,0xaa,0x3e,0x72,0xb6,0x8f,0x4, 0xf3,0x3c,0x73,0x1, 0x1d,0xe0,0x80, +0x8f,0x98,0x0, 0xe5,0x96,0xf6,0xe0,0xc, 0x37,0xa1,0xe3,0xfe,0xce,0xea,0xb6,0x8e, +0x3e,0x1b,0x4, 0x44,0xe2,0x1, 0xce,0x96,0xe0,0xd, 0x37,0xa1,0x3e,0x9b,0xe7,0xff, +0x5, 0x3f,0xb4,0xd, 0xe7,0xff,0x0, 0xbc,0xe0,0x1, 0xb7,0x85,0xe7,0xff,0x0, 0x96, +0xb7,0xf5,0xe7,0xff,0x0, 0x89,0xe0,0x0, 0xc0,0x50,0xb, 0xe1,0x14,0x80,0x3c,0x69, +0x39,0x69,0x39,0xe9,0xe7,0xfe,0x0, 0x84,0x3c,0xef,0x3c,0x6f,0x39,0xef,0xe7,0xfd, +0x0, 0xff,0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x1, 0x1c,0x7b,0xa4,0x8f,0xef,0xfe, +0xd9,0x8d,0xde,0x91,0xdb,0xf0,0xdc,0x35,0xe0,0x1, 0xd5,0x7d,0x2c,0x5, 0xe0,0x3, +0x1f,0xc0,0xac,0xf, 0x8, 0xe1,0xe0,0x3, 0x1f,0xc0,0x17,0x1, 0xaf,0xf, 0x8, 0xe1, +0xea,0x12,0x7f,0xb4,0xe0,0x1, 0x17,0x2a,0xe0,0x2e,0x3c,0xe, 0xa6,0x8f,0x27,0x2, +0x26,0x89,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1f,0x58,0x1, 0xe, 0x17,0xea,0xaf,0x8e, +0x38,0x82,0xe0,0x1, 0x1f,0x58,0x8e,0x8e,0xc6,0xff,0xae,0x8e,0x16,0x80,0xbe,0x8f, +0x17,0xea,0xaf,0x8e,0x38,0x82,0xe2,0x0, 0xcc,0x9, 0x1, 0xf9,0x16,0x82,0xbe,0x8f, +0x0, 0xee,0xe0,0x2, 0x1f,0xb6,0xea,0x12,0x7f,0x32,0x8c,0xf, 0xe0,0xd, 0x34,0x22, +0x9f,0x8e,0xc6,0x81,0x3f,0xfd,0x5, 0x4, 0xe0,0x1, 0x14,0x7f,0x38,0x82,0xc7,0x81, +0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xb7,0x8e,0x1, 0xb, 0xe2,0x0, 0xcf,0x82, +0x1, 0x76,0xe0,0x3, 0x1f,0x39,0xa7,0xe, 0x3f,0x9e,0xe0,0x40,0x8c,0x3f,0x38,0x82, +0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8c,0x3f,0x38,0x82,0xe0,0x2, 0x1e,0x93,0x17,0x6, +0xac,0xd, 0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f,0xe2,0x0, 0xc7,0x5, +0x27,0xc, 0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xc0,0x17,0x1, 0xe0,0x4, 0xaf,0x7f, +0x5, 0x8a,0x17,0x80,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1f,0xc0,0x17,0x3, 0xe0,0x4, +0xaf,0x7f,0x38,0x82,0x38,0x82,0x8, 0xb3,0x39,0xe9,0x2c,0x1d,0xe0,0x0, 0x1f,0x30, +0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0x3a,0xe0,0x2, 0x1e,0x93,0x17,0x6, 0xa9,0x8d, +0x9f,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x3f,0x1f,0xe2,0x0, 0xc7,0x5, 0x2f,0x23, +0xe0,0x2, 0x1f,0xc0,0x17,0x3, 0xe0,0x4, 0xaf,0x7f,0x17,0x1, 0xe0,0x3, 0x1f,0x9a, +0xaf,0xf, 0x9, 0xe1,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0x39,0x68,0x5, 0xa1,0xe4,0x1, 0xcc,0x0, 0xe2,0x0, 0xcc,0x6f,0x5, 0xa3,0xe2,0x1, +0xc9,0x7c,0x1, 0x23,0xe2,0x1, 0xc9,0x7d,0x1, 0x19,0xe0,0x3, 0x1f,0x9a,0x17,0x1, +0xaf,0xf, 0x9, 0xe1,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xc0,0x17,0x1, 0xe0,0x4, +0xaf,0x7f,0x5, 0xf4,0x17,0x80,0xaf,0x8d,0x0, 0xf1,0xe0,0x2, 0x1f,0x66,0x8f,0xe, +0x2f,0x44,0x9, 0xe1,0x3c,0x69,0xdf,0x55,0x0, 0xe6,0xe0,0x0, 0x1f,0xad,0xa9,0x8f, +0x9, 0xe1,0xe0,0x0, 0xd8,0x73,0x0, 0xdc,0x3c,0x63,0x9, 0xa1,0xe7,0x7e,0x0, 0xe0, +0xe0,0x0, 0x24,0x52,0xe2,0x0, 0xcc,0x3, 0x2, 0x91,0xe0,0x0, 0x1f,0x9b,0x8f,0x8f, +0xe0,0x0, 0x2f,0xcf,0xe0,0x0, 0x1f,0x18,0xe0,0x2, 0x1e,0xb1,0x3f,0xee,0xbf,0xd, +0x3c,0x1f,0xe0,0x40,0x8f,0x98,0x3c,0x6f,0x38,0x82,0xe2,0x0, 0xcc,0x5f,0xe0,0x0, +0x5, 0xc8,0x17,0xad,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xc5,0x17,0x95,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xe0,0x0, +0x5, 0xd5,0xe0,0x0, 0x17,0xe7,0x3f,0x98,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81, +0xe0,0x0, 0x5, 0xe6,0xe7,0xff,0x17,0x80,0x3f,0x98,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f, +0xe2,0x0, 0xcf,0x6f,0x5, 0xb4,0xe2,0x1, 0xcc,0x7c,0xe0,0x1, 0x1, 0xb, 0xe2,0x1, +0xcc,0x7d,0xe0,0x1, 0x1, 0xd, 0xe2,0x1, 0xcc,0x7e,0xe0,0x1, 0x17,0xff,0x1, 0x8e, +0xe0,0x2, 0x1f,0xc8,0x17,0x5, 0x8f,0x8f,0x3f,0x3f,0xe0,0x3, 0x1f,0xb0,0x3f,0x9e, +0x8f,0x8f,0x0, 0x84,0xe0,0x2, 0x1f,0x93,0x8f,0x8f,0x3c,0x6f,0x38,0x82,0xe0,0x1, +0x1f,0x5a,0xe0,0x2, 0x1e,0xb1,0x3f,0xee,0xbf,0xd, 0xe7,0xff,0x0, 0xb3,0xe0,0x2, +0x1f,0xb1,0xa7,0x8f,0xe7,0xff,0x0, 0xae,0xe2,0x1, 0xcc,0x53,0x1, 0x11,0xe0,0x1, +0x1f,0x58,0x8f,0x8e,0xc7,0xff,0xaf,0x8e,0xe7,0xfd,0x0, 0xfd,0xe2,0x1, 0xcc,0x0, +0xe0,0x0, 0x1, 0x63,0xe0,0x2, 0x1f,0x40,0x3f,0x9e,0x8f,0x8f,0x0, 0xdf,0xea,0x12, +0x7f,0xb2,0x17,0x0, 0xb7,0xf, 0x0, 0xf1,0xe2,0x1, 0xcc,0x6b,0xe0,0x0, 0x1, 0x44, +0xea,0x12,0x7f,0x30,0x8e,0xe, 0x16,0x81,0x3e,0x9c,0xea,0x4f,0x7f,0x94,0xe2,0x1, +0xc6,0xff,0xe9,0xff,0xc7,0xff,0xe2,0x0, 0xce,0x83,0x3f,0x9c,0x8f,0x8f,0x1, 0x25, +0xae,0x8e,0x16,0xeb,0xe0,0x1, 0x1f,0x58,0xae,0x8e,0x0, 0xc0,0xe0,0x2, 0x1f,0x40, +0x16,0xe0,0xe0,0x2, 0x8f,0x8e,0x3e,0x9f,0xe2,0x0, 0xce,0x9f,0x2, 0x9d,0xe0,0x1, +0x1e,0xd3,0x3f,0x9d,0xe0,0x44,0x8f,0x8f,0xe0,0x2, 0x8e,0x8e,0xe2,0x1, 0xcc,0x1a, +0xc6,0x81,0xe0,0x2, 0xae,0x8e,0xe7,0xff,0x1, 0xaa,0xe0,0x1, 0x1f,0x58,0xe7,0xff, +0x16,0x99,0xae,0x8e,0xe7,0xff,0x0, 0xa3,0xea,0x12,0x7e,0xb4,0x16,0x0, 0xae,0xe, +0x17,0x0, 0xbf,0xd, 0x0, 0xd7,0xe0,0x2, 0x8e,0x8e,0xe0,0x1, 0x1f,0xc2,0x3f,0x9d, +0x8f,0x8f,0x0, 0xe3,0xea,0x12,0x7f,0xb0,0x17,0x1, 0xaf,0xf, 0x3f,0xe8,0x0, 0xca, +0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0xff,0xe7,0xff,0x0, 0x89,0xe0,0x0, 0x1f,0xad, +0x8f,0x8f,0xe7,0xff,0x0, 0x84,0xe7,0xda,0x0, 0xc6,0xe0,0x2, 0x1f,0x93,0x9f,0x8f, +0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x86,0xe2,0x0, 0xcf,0x84,0x1, 0x5, 0x14,0x0, +0x38,0x82,0xe7,0xfe,0x0, 0x9f,0xe7,0x6f,0x0, 0xe8,0xe0,0x2, 0x1f,0x93,0x9f,0x8f, +0x37,0xcc,0xe2,0x0, 0xc7,0x87,0x27,0x85,0xe2,0x0, 0xcf,0x84,0x1, 0x4, 0x38,0x82, +0xe7,0xfd,0x0, 0xbb,0xe7,0x6a,0x0, 0xde,0x8, 0xb4,0xe0,0x0, 0x1f,0xbd,0xa1,0xf, +0xa7,0x82,0xe2,0x0, 0xc7,0x81,0x27,0x97,0xa7,0x2, 0x17,0xfe,0x3f,0x5f,0xea,0x12, +0x7f,0xba,0xbf,0x2, 0x8f,0xf, 0x27,0x22,0xe0,0x0, 0x1a,0x30,0xe0,0x1, 0x19,0xd8, +0x17,0x81,0x8c,0xf2,0xaf,0x84,0x8c,0x3, 0xdf,0xd9,0x17,0x0, 0xaf,0x4, 0x8f,0x83, +0xc7,0x81,0xaf,0x83,0xa7,0x82,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x2f,0x82,0xa, 0x61, +0xa7,0x2, 0x16,0xfd,0xe0,0x1, 0x1f,0xd8,0x3f,0x5d,0xbf,0x2, 0x8f,0xf, 0xc7,0x1, +0xaf,0xf, 0x8c,0xf, 0xdf,0xb3,0xac,0x72,0xa, 0x61,0x17,0x1, 0xaf,0xf, 0x87,0x72, +0xe0,0x1, 0x1f,0xd8,0xaf,0xf, 0x8c,0xf, 0xdf,0xa9,0xac,0x72,0xa, 0x61,0xe0,0x0, +0x1f,0xbd,0x16,0x7e,0xa6,0x8f,0xea,0x12,0x7f,0xba,0xa7,0x3d,0x3f,0x5c,0xbf,0x3d, +0x17,0x0, 0xaf,0xf, 0x38,0x82,0x8, 0xb4,0xe0,0x1, 0x1a,0x5a,0xe0,0x2, 0x19,0x93, +0x11,0x0, 0x15,0x3e,0xe0,0x1, 0x14,0xff,0x3c,0x64,0xa9,0x3, 0xe0,0x3, 0xdd,0x9c, +0xe0,0x0, 0x1c,0x18,0x15,0x3e,0xe0,0x1, 0x14,0xff,0xe0,0x3, 0xdd,0x95,0xe0,0x2, +0x1f,0xb1,0xba,0xf, 0xef,0xfc,0xdc,0xd7,0xea,0x12,0x7f,0xba,0xe0,0x1, 0x1f,0x58, +0xa9,0xf, 0xe0,0x0, 0x1f,0xbd,0xa9,0xe, 0xa7,0x8f,0x81,0x83,0xa9,0xff,0xa, 0x61, +0x8, 0xb2,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x85,0xe0,0x0, 0x14,0xda,0x39,0x68, +0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x9c,0xe1,0xd, 0x14,0x6, 0xe0,0x3, 0xd6,0x7a, +0xe0,0x0, 0x14,0xff,0x3c,0xd8,0xe0,0x1, 0xcc,0x80,0xe1,0xd, 0x14,0x6, 0xe0,0x3, +0xd6,0x8f,0xe2,0x0, 0xc9,0x5a,0x1, 0x6, 0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x3, +0xd6,0x87,0xe0,0x0, 0x14,0xda,0x14,0x4, 0xe0,0x3, 0xd6,0x82,0xe0,0x0, 0x14,0xda, +0x14,0x5, 0x9, 0x21,0xe0,0x6c,0x0, 0xfc,0x8, 0xb4,0xe0,0x2, 0x19,0xb8,0x15,0x4, +0x3c,0xe3,0x14,0x0, 0xef,0xfd,0xd1,0xf6,0x9d,0x13,0x17,0xf8,0x3f,0x9a,0xe2,0x1e, +0xcf,0xf7,0x12,0x0, 0x2, 0x96,0x11,0x7e,0x39,0x1a,0xe3,0xff,0xc1,0x7f,0x3c,0xe3, +0x3d,0x62,0x14,0x2, 0x99,0x83,0xef,0xfd,0xd1,0xe5,0xe0,0x2, 0x1c,0x37,0x3d,0xe4, +0x3d,0x64,0xe0,0x9, 0x31,0x41,0x34,0x41,0xe0,0x3, 0xda,0xda,0xe0,0x24,0x39,0x88, +0x3c,0x64,0xa, 0x61,0xe0,0x2, 0x1f,0xe6,0x8f,0x8f,0x27,0x8f,0x8, 0xb2,0xe0,0x0, +0x19,0x37,0xdf,0xd3,0xac,0x2, 0x8f,0x82,0x2f,0x87,0xdf,0xcf,0xac,0x2, 0x8f,0x82, +0x2f,0x83,0xdf,0xcb,0xac,0x2, 0x9, 0x61,0x38,0x82,0x8, 0xb4,0xe0,0x2, 0x1f,0x91, +0x39,0xe8,0xa1,0xf, 0xe0,0x0, 0x14,0x50,0xa7,0x92,0xcf,0x90,0xbf,0x92,0xe0,0x3, +0xd6,0x19,0x3a,0x68,0xe0,0x0, 0x14,0xda,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x30, +0x3c,0xe3,0xe2,0x1, 0xc4,0xff,0xe1,0x20,0x14,0x0, 0xe0,0x3, 0xd6,0x29,0xe0,0x9, +0x31,0xc8,0xe2,0x0, 0xc4,0x83,0xe1,0x20,0x14,0x1, 0xe0,0x3, 0xd6,0x21,0x14,0x8a, +0xe1,0x23,0x14,0x4, 0xe0,0x3, 0xd6,0x1c,0xe2,0x0, 0xca,0x5a,0x1, 0x6, 0x14,0x80, +0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd6,0x14,0xa7,0x92,0x17,0x6f,0x3f,0xde,0xbf,0x92, +0xa, 0x61,0x8, 0xb4,0xe0,0x2, 0x1f,0x91,0xe0,0x0, 0x14,0x50,0xa1,0x8f,0xa7,0x93, +0xcf,0x90,0xbf,0x93,0xe0,0x3, 0xd5,0xe6,0xe0,0x0, 0x14,0xda,0x3a,0x68,0xe0,0x0, +0x14,0x50,0xe0,0x3, 0xd5,0xfd,0xe1,0x20,0x14,0x1, 0xe0,0x3, 0xd5,0xdb,0x39,0x68, +0xe1,0x20,0x14,0x0, 0xe0,0x3, 0xd5,0xd6,0x31,0x28,0xe2,0x6, 0xc1,0x0, 0xe2,0x0, +0xca,0x5a,0x39,0x48,0xe3,0xff,0xc1,0x7f,0x1, 0x6, 0x14,0x80,0xe0,0x0, 0x14,0x50, +0xe0,0x3, 0xd5,0xe6,0xa7,0x93,0x17,0x6f,0x3f,0xde,0x3c,0x62,0xbf,0x93,0xa, 0x61, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8a,0xe0,0x2, +0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0x5, 0x82, +0x38,0x82,0xe0,0x2, 0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0xfa,0x8, 0xb2, +0xe0,0x3, 0x19,0x37,0x9f,0x82,0xe2,0x0, 0xcf,0x82,0x2, 0x82,0x9, 0x61,0xe0,0x0, +0x1f,0xaa,0x9c,0xf, 0xe0,0x3, 0xdc,0xd3,0xe0,0x3, 0xdc,0xd5,0xe0,0x0, 0x14,0xd3, +0xe0,0x3, 0xdc,0x25,0xeb,0xe6,0x7f,0x4, 0xe3,0xff,0xc4,0x7f,0xe0,0x1, 0x17,0xbc, +0x3f,0x98,0x9e,0x8e,0xe3,0xff,0xc7,0xff,0xea,0x12,0x7e,0x3c,0x3f,0xfd,0xb7,0x8c, +0x3, 0x98,0xc6,0xf9,0x3f,0xfd,0x4, 0xf, 0xe0,0x1, 0x17,0xb4,0x3f,0x98,0xe3,0xff, +0xc7,0xff,0xe2,0x1, 0xcf,0xbb,0x2, 0x86,0xe0,0x2, 0x17,0x87,0x3f,0x98,0xe3,0xff, +0xc7,0xff,0xb7,0x8c,0x3c,0x6f,0xb7,0x8e,0xdf,0x51,0x17,0x80,0xb7,0x82,0x9, 0x61, +0xc6,0x87,0x3f,0xfd,0x2, 0x78,0xe0,0x1, 0x17,0xc4,0x3f,0x98,0xe3,0xff,0xc7,0xff, +0xe2,0x2, 0xcf,0x8e,0x5, 0xef,0xe0,0x0, 0x17,0xf1,0x3f,0x98,0xe3,0xff,0xc7,0xff, +0xb7,0x8c,0x0, 0xe9,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81, +0x27,0x8a,0xe0,0x2, 0x1f,0xba,0x87,0x8f,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x81,0x5, 0x82,0x38,0x82,0xe0,0x2, 0x1f,0xc8,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0xfa,0x8, 0xb5,0x39,0x68,0xe0,0x1, 0x14,0x4e,0xdf,0x20,0xe0,0x3, 0x1a,0x37, +0x17,0x80,0xb7,0x84,0x11,0x83,0x12,0x90,0x21,0xc, 0x9f,0x84,0x3c,0x65,0xe2,0x0, +0xcf,0x82,0x2, 0x87,0xc1,0xff,0xe2,0x1, 0xc1,0xff,0xef,0xfd,0xd6,0x5f,0x29,0xf6, +0xa, 0xe1,0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0xe2,0x0, 0xc7,0x81,0x27,0x8b, +0xe0,0x2, 0x1f,0xba,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x1, 0x6, 0x27,0x8c,0xe2,0x0, +0xcf,0x81,0x1, 0xe, 0x38,0x82,0xe0,0x3, 0x1f,0xc3,0x8f,0x8f,0xe2,0x0, 0xcf,0x81, +0x1, 0x7, 0x2f,0xf9,0xe0,0x1, 0x14,0xc8,0x14,0x0, 0xe0,0x69,0x0, 0xb6,0xe0,0x1, +0x14,0xc8,0x14,0x1, 0xe0,0x69,0x0, 0xb1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe0,0x1, +0x1f,0xdc,0xe0,0x2, 0x1f,0x23,0x16,0x0, 0xa7,0x8f,0xae,0xe, 0xe0,0x1, 0xa7,0xff, +0x37,0xc2,0xe2,0x0, 0xc7,0x81,0x27,0x95,0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1e,0xb1, +0xa7,0x8f,0xa6,0xd, 0xa6,0x9f,0xce,0x90,0xbe,0x9f,0xe0,0x0, 0x16,0xd4,0xb6,0xdc, +0x8e,0xfc,0x16,0x6f,0xe2,0x0, 0xc6,0x83,0xae,0x8e,0xa6,0x9f,0x3e,0xdc,0xbe,0x9f, +0xe0,0x2, 0x1b,0xe6,0x8f,0x87,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x5d,0x8f,0xe, +0xe0,0x1, 0x27,0x1b,0xe0,0x0, 0x1f,0x37,0x8a,0xe, 0xe0,0x0, 0x22,0x72,0xe0,0x2, +0x1f,0x91,0x12,0x3, 0xa2,0x8f,0xe0,0x3, 0x1f,0xb1,0xe0,0x2, 0x19,0xb8,0xa1,0xf, +0xf0,0x0, 0x17,0x54,0xf0,0x40,0x3e,0xe4,0xf0,0x0, 0x14,0x50,0xf0,0x0, 0x16,0x5a, +0x13,0x5, 0xf7,0x24,0x15,0x82,0xf7,0x24,0x15,0x3, 0xf7,0x24,0x14,0x84,0xa7,0x95, +0xcf,0x90,0xbf,0x95,0x17,0xf8,0x9c,0x3, 0x3f,0x98,0xe2,0x1e,0xcf,0xf8,0xe0,0x1, +0x2, 0x96,0xf0,0x0, 0xb7,0x52,0xc4,0x7e,0xf0,0x0, 0xae,0xb2,0xe3,0xff,0xc4,0x7f, +0xf0,0x0, 0xb4,0x52,0xe2,0x0, 0xcc,0x8, 0xf0,0x0, 0xae,0x32,0xe0,0x0, 0x5, 0xeb, +0x16,0x80,0xf7,0xff,0x13,0xfd,0x3f,0x6d,0x17,0x88,0x3e,0x6d,0xf0,0x17,0x3b,0x98, +0x26,0x21,0xc6,0x1, 0xe3,0xff,0xc6,0x7f,0xf0,0x40,0x3b,0x6c,0xe0,0xb, 0x39,0x9f, +0x8c,0x8b,0x15,0x83,0x15,0x1, 0x3d,0x9d,0xb7,0x52,0x3d,0x1e,0xe8,0x40,0x3d,0xf6, +0xc7,0x81,0x3f,0x6a,0xac,0xb2,0xe3,0xff,0xc7,0x7f,0xe3,0xff,0xc7,0xff,0xe0,0x0, +0x3, 0x47,0xf0,0x2e,0x3b,0x9f,0xe0,0x0, 0x27,0x46,0xe1,0x2e,0x3c,0x1f,0xe0,0x0, +0x27,0x42,0xe0,0xc, 0x39,0x9f,0x8d,0xc, 0x8d,0xac,0x8f,0x1c,0x8e,0xbc,0x35,0x28, +0xe0,0xc, 0x35,0xa8,0x3e,0x9c,0x3f,0x1a,0xc7,0x84,0xe3,0xff,0xc7,0x7f,0xe3,0xff, +0xc6,0xff,0xe3,0xff,0xc7,0xff,0xf0,0x40,0x3b,0x66,0x16,0x5, 0x0, 0xd0,0xe0,0x2, +0x1f,0x11,0xa2,0x8e,0xe0,0x3, 0x1f,0x31,0xa1,0xe, 0xe0,0x0, 0x2f,0xcc,0xa7,0x15, +0xe0,0x0, 0x16,0xd0,0xcf,0x10,0xbf,0x15,0xe0,0x0, 0x16,0x5a,0xb6,0xd2,0xe7,0x24, +0x17,0x10,0xae,0x32,0xb7,0x52,0xaf,0xb2,0xb6,0xd2,0x17,0x6f,0xaf,0xb2,0xa7,0x95, +0x3f,0xde,0xbf,0x95,0x22,0x9, 0xdf,0x1e,0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e, +0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x3c,0x7f,0xe7,0xff, +0x2, 0xa1,0xf0,0x0, 0xb5,0xd2,0xe7,0x24,0x16,0x5, 0x8f,0xf2,0xf0,0x0, 0xb5,0x52, +0xe4,0xd, 0x37,0xa8,0x8f,0xf2,0xf0,0x0, 0xb4,0xd2,0xe4,0xf, 0x37,0xa0,0x8f,0x72, +0xb6,0x52,0x3f,0x9d,0x8e,0xf2,0x37,0x28,0x3f,0x9d,0xa6,0x93,0x3f,0x9e,0xf0,0x0, +0xb4,0x52,0x17,0x0, 0x3f,0xfd,0xaf,0x32,0x1, 0x22,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xc2,0x7f,0xbf,0x95,0xe2,0x1, 0xc2,0x7f,0xe7,0xfe,0x2a,0x5b,0x8f,0x87,0xe7,0xff, +0x27,0xb8,0xa7,0x95,0xe0,0x0, 0x17,0x50,0xcf,0x90,0xbf,0x95,0xe0,0x0, 0x16,0x5a, +0xb7,0x52,0xe7,0x24,0x16,0x90,0xae,0x32,0x17,0x80,0xb6,0xd2,0xaf,0xb2,0xb7,0x52, +0xe7,0xff,0x0, 0xb5,0x86,0xe, 0xae,0xe, 0xe7,0xfe,0x0, 0xa3,0xe0,0x0, 0x17,0xf0, +0xb7,0xd2,0x16,0x2a,0xae,0x32,0x3c,0x66,0xef,0xfd,0xd5,0x28,0xe0,0x0, 0x16,0xf6, +0xb6,0xd2,0xe0,0x0, 0x17,0x75,0x8f,0xf2,0xb7,0x52,0x37,0xa8,0x8e,0xf2,0x9f,0x13, +0x3f,0x9d,0xe3,0xff,0xc7,0xff,0x3f,0x7f,0x1, 0xc9,0xa7,0x95,0x17,0x6f,0x3f,0xde, +0xbf,0x95,0x12,0x1, 0x8f,0x87,0x0, 0xcc,0x8, 0xb3,0x39,0x68,0xe0,0x0, 0x14,0x50, +0xe0,0x3, 0xd3,0xe0,0x39,0xe8,0xe0,0x0, 0x14,0xda,0xe0,0x0, 0x14,0x50,0xe0,0x3, +0xd3,0xf7,0x3c,0x62,0xe0,0x3, 0xd3,0x61,0xe2,0x0, 0xc9,0xda,0x39,0x68,0x1, 0x6, +0x14,0x80,0xe0,0x0, 0x14,0x50,0xe0,0x3, 0xd3,0xeb,0x3c,0x62,0x9, 0xe1,0x8, 0xb1, +0xc0,0x7c,0x15,0x2, 0x14,0x86,0x3c,0x90,0x3c,0x6a,0xef,0xfc,0xdf,0x63,0x5c,0x3, +0x15,0x2, 0xe2,0x0, 0x7c,0x84,0xef,0xfc,0xdf,0x5d,0x4f,0x4, 0x4f,0x85,0xe0,0xd, +0x3f,0x1f,0xe2,0x1, 0xce,0xff,0x1, 0x8, 0xe0,0x2, 0x1f,0xc0,0x17,0x7f,0xe0,0xc, +0xaf,0x4f,0xc0,0x4, 0x8, 0xe1,0xe0,0x2, 0x1f,0xc0,0xe0,0xc, 0xaf,0x4f,0xc0,0x4, +0x8, 0xe1,0xe0,0x0, 0x1f,0xad,0x8f,0x8f,0xe2,0x0, 0xcf,0xda,0x1, 0x2, 0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xa7,0x8f,0xa7,0xcf,0x37,0xcf,0xe2,0x0, 0xc7,0x81,0x2f,0xf8, +0xe7,0xfa,0x0, 0x90,0xe0,0x1, 0x1f,0xc2,0xe0,0xa, 0x8f,0xdf,0x27,0xb1,0xe0,0x1, +0x1f,0xc4,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, 0x1, 0x6b, +0x8f,0xef,0x37,0xa6,0xc7,0xff,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcc,0x3f,0x2, 0xa1, +0xe0,0x0, 0x1f,0xf2,0xe0,0x0, 0x1f,0x71,0x8f,0x8f,0x8f,0xe, 0xe0,0xd, 0x37,0xa8, +0x17,0xbf,0xe0,0x8, 0x3f,0xa8,0xe0,0xf, 0x3f,0x4d,0x3c,0x3f,0xe0,0x0, 0x1f,0xf0, +0x34,0x48,0x8f,0x8f,0x3c,0x7f,0x3f,0x6f,0xe0,0x6e,0x3d,0xa8,0x3f,0xae,0xe2,0x5, +0xcf,0xcf,0xe0,0x5, 0x14,0x4f,0xe0,0x68,0x3d,0xaf,0xe3,0xff,0xc4,0x7f,0x38,0x82, +0xe0,0x1, 0x1f,0x31,0xe0,0x1, 0x1e,0xb0,0x8f,0xe, 0xc7,0xc1,0x8e,0x8d,0x3c,0x7f, +0x37,0x28,0xe0,0xc, 0x3e,0xce,0x3, 0x3d,0xe0,0x0, 0x1f,0xef,0x8d,0x8f,0xe0,0x0, +0x1f,0xee,0x35,0xa8,0x8f,0xf, 0xe0,0x0, 0x1f,0xed,0x37,0x28,0x8e,0x8f,0xe0,0x0, +0x1f,0xec,0x3e,0xcb,0x8f,0x8f,0x3c,0x7d,0x3f,0xce,0xe0,0x0, 0x3, 0x45,0xe0,0x0, +0x1f,0x6b,0xc6,0xff,0x8d,0x8e,0xe0,0x0, 0x1f,0x6a,0x35,0xa8,0x8f,0xe, 0xe0,0x8, +0x3e,0xa8,0xe0,0xd, 0x3f,0x4b,0x3c,0x3d,0xc7,0xff,0x34,0x48,0x3f,0xa8,0xe0,0x0, +0x1f,0x70,0x8c,0xe, 0x3f,0xf8,0x4, 0xca,0xe0,0x0, 0x1f,0x69,0x8f,0xe, 0xe0,0xe, +0x3e,0x2e,0x3e,0xee,0xe3,0xff,0xc6,0xff,0x3f,0xfd,0xe0,0x6f,0x3a,0xae,0xe7,0xff, +0x0, 0xb8,0x8f,0xff,0x37,0xa6,0xc7,0xff,0xe3,0xff,0xc7,0xff,0xe7,0xff,0x0, 0x97, +0xe0,0x0, 0x1f,0x68,0xe0,0xf, 0x3c,0x2f,0x8e,0x8e,0xe0,0x0, 0x1f,0x67,0x36,0xa8, +0x8f,0xe, 0xe0,0x8, 0x3f,0x4d,0xe0,0x0, 0x1f,0x69,0x3f,0xb8,0x8f,0xe, 0x37,0xc8, +0x3f,0xfe,0x16,0xff,0x3e,0x9e,0xe0,0x6f,0x3b,0xad,0xe0,0xe, 0x3e,0x2e,0x3f,0x9e, +0xe7,0xff,0x0, 0x97,0xe0,0x0, 0x1f,0x66,0x3c,0x2d,0x8d,0x8e,0xe0,0x0, 0x1f,0x65, +0x35,0xa8,0x8f,0xe, 0xe0,0xd, 0x3f,0x4b,0x3c,0x3d,0xe0,0xd, 0x34,0x48,0x3f,0x9d, +0xe7,0xff,0x0, 0xbf,0xe0,0x1, 0x1f,0xc2,0x3e,0xe8,0xe0,0xa, 0x8f,0xdf,0x27,0xaa, +0xe0,0x1, 0x1f,0xc4,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, +0x1, 0x58,0x8f,0x7f,0x37,0x26,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe2,0x0, 0xce,0xbf, +0x2, 0x9a,0xe0,0x0, 0x1f,0xe4,0xe0,0x0, 0x1f,0x63,0x8f,0x8f,0x8c,0xe, 0x37,0xa8, +0x17,0x3f,0x3f,0x2d,0xe0,0xd, 0x3c,0x4f,0xe0,0x0, 0x1f,0xe2,0x3f,0x3d,0x8c,0xf, +0x37,0x8, 0x3f,0x78,0x3f,0xe8,0xe0,0x6f,0x3d,0x2e,0x3c,0x2f,0xe3,0xff,0xc4,0x7f, +0x38,0x82,0x38,0x82,0xe0,0x1, 0x1e,0x2e,0xe0,0x1, 0x1f,0xaf,0x8c,0xc, 0x16,0x41, +0x8f,0x8f,0x3e,0x1e,0x3e,0xfc,0x37,0xa8,0xe0,0xb, 0x3c,0x4f,0x3, 0x30,0xe0,0x0, +0x1f,0xe1,0x8e,0xf, 0xe0,0x0, 0x1f,0xe0,0x36,0x28,0x8c,0xf, 0xe0,0x0, 0x1f,0xdf, +0x34,0x28,0x8f,0xf, 0xe0,0x0, 0x1f,0xde,0x3f,0x4c,0x8f,0x8f,0x3e,0xfe,0x3f,0xc8, +0xe0,0x0, 0x3, 0x4a,0xe0,0x0, 0x1e,0x5d,0xe0,0x0, 0x1d,0x5c,0x8e,0xc, 0x8c,0xa, +0x36,0x28,0x3c,0x4c,0x3f,0x2d,0x3f,0x38,0x14,0x7f,0x3c,0x1f,0x37,0x8, 0x3c,0x2e, +0xe0,0x0, 0x1f,0xe2,0x8f,0x8f,0x3c,0x7f,0x3, 0x2b,0x3c,0x6f,0x38,0x82,0x8f,0x6f, +0x37,0x26,0xc7,0x7f,0xe3,0xff,0xc7,0x7f,0xe7,0xff,0x0, 0xaa,0x17,0xe2,0x3f,0x9e, +0x3e,0xff,0x14,0x0, 0xe7,0xff,0x3, 0x3f,0xe0,0x0, 0x1f,0xdb,0xe0,0x0, 0x1e,0x5a, +0x8f,0x8f,0x8c,0xc, 0xc7,0x40,0x37,0xa8,0xe0,0xe, 0x3e,0xae,0x3c,0x4f,0xe0,0x0, +0x1f,0xd9,0x3f,0x38,0x8f,0x8f,0x37,0x8, 0x3f,0x7f,0x16,0xff,0x3e,0x9f,0xe0,0x6e, +0x3b,0x2d,0xe0,0x8, 0x3d,0xaf,0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x38,0x82,0xe0,0x0, +0x1f,0xd9,0x8f,0x8f,0xe0,0xf, 0x3d,0xaf,0x3f,0xf8,0xe0,0x68,0x3d,0x2f,0xe3,0xff, +0xc4,0x7f,0x38,0x82,0xe0,0x0, 0x1e,0x58,0xe0,0x0, 0x1d,0x57,0x8e,0xc, 0x8c,0xa, +0x36,0x28,0x3c,0x4c,0xe0,0xe, 0x3e,0xae,0x3f,0x38,0xe0,0x8, 0x37,0x8, 0x3c,0x1f, +0xe7,0xff,0x0, 0xb8,0x8, 0xb5,0xe0,0x2, 0x1a,0xdf,0xe0,0x2, 0x1a,0x5e,0x8f,0x85, +0xe0,0x0, 0x2f,0xc5,0xe0,0x2, 0x1f,0x5d,0xe0,0x2, 0x1e,0xd5,0x8f,0xe, 0xaf,0x8d, +0xe0,0x0, 0x2f,0x4b,0xe0,0x1, 0x1f,0x8e,0x15,0xa, 0x89,0x8f,0xe0,0x2, 0x1c,0xde, +0x3d,0x33,0xe0,0x2, 0x1c,0x58,0xe0,0x3, 0xd8,0xed,0xe0,0x1, 0x1f,0xc2,0xe0,0xa, +0x8f,0xdf,0x27,0xab,0x21,0x96,0xc1,0xff,0xe2,0x1, 0xc1,0xff,0xc1,0x81,0xe4,0x0, +0xc1,0x8a,0xe0,0x2, 0x19,0x5e,0x39,0x94,0x9c,0x2, 0xc1,0xa, 0xde,0x84,0xe0,0x5, +0xb4,0x52,0xe0,0x40,0x9c,0x42,0xdf,0x27,0x39,0xf2,0xe0,0x5, 0xb4,0x62,0x1, 0xf5, +0xe0,0x19,0x9f,0x84,0xe2,0x2, 0xcf,0x81,0x1, 0x28,0xe2,0x2, 0xcf,0x80,0xe0,0x0, +0x1, 0x4c,0x8f,0x85,0x2f,0x8a,0xe0,0x0, 0x1f,0x34,0xb7,0x8e,0xe0,0x2, 0x1f,0x1b, +0xb7,0x8e,0xe0,0x1, 0x1f,0x59,0xaf,0x8e,0xa, 0xe1,0xe0,0x2, 0x1f,0x5d,0xe0,0x2, +0x1e,0xd5,0x17,0x81,0x8f,0xe, 0xaf,0x8d,0xe7,0xff,0x2f,0x3e,0xe0,0x2, 0x1f,0x5b, +0xaf,0x8e,0xe7,0xff,0x0, 0xb9,0xe0,0x2, 0x1f,0x54,0x16,0x81,0xae,0x8e,0xe0,0x2, +0x1f,0x53,0xaf,0x8e,0xe7,0xff,0x0, 0xb0,0xe0,0x0, 0x1f,0xb4,0xe0,0x2, 0x1f,0x1b, +0xe0,0x6, 0x9e,0x24,0x9f,0xe, 0xe0,0x6, 0x9e,0xb4,0x9f,0x8f,0xe0,0xe, 0x3e,0xae, +0xe0,0xf, 0x3e,0x2f,0xe4,0xa, 0x37,0x8f,0xe4,0xb, 0x37,0xf, 0xe2,0xf, 0x3d,0x4f, +0xe2,0xe, 0x3d,0xce,0x3f,0x2b,0x3f,0xaa,0x3f,0x9e,0xe0,0x0, 0x1f,0x26,0xe2,0x1, +0xcf,0x96,0xb6,0xe, 0xe0,0x0, 0x1f,0x20,0xb6,0x8e,0x5, 0x47,0xe0,0x1, 0x1f,0xd9, +0x17,0x1, 0xaf,0xf, 0xa, 0xe1,0xe0,0x6, 0x9f,0x24,0xe0,0x0, 0x1e,0xa6,0xe0,0x6, +0x9f,0xb4,0xb7,0xd, 0xe0,0x0, 0x1e,0xa0,0xb7,0x8d,0xe0,0x0, 0x1e,0xb4,0xb7,0xd, +0xe0,0x2, 0x1f,0x1b,0xb7,0x8e,0xa, 0xe1,0xe0,0x3, 0x1f,0x80,0x17,0x0, 0xb7,0x1f, +0xaf,0xf, 0xaf,0x1f,0x38,0x82,0x0, 0x0, 0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f, +0xe0,0x3, 0x2f,0xba,0x8, 0xb7,0xf8,0x0, 0xc, 0x3c,0xf0,0x3, 0x18,0x0, 0xe8,0x0, +0x9f,0x90,0x2f,0x93,0xea,0x12,0x7f,0x47,0xe0,0x0, 0x19,0xe, 0xaf,0x8e,0x8f,0x82, +0xe0,0x0, 0x19,0x8d,0x2f,0x93,0xea,0x12,0x7f,0xc6,0x8f,0xf, 0x27,0x3, 0xc7,0x7f, +0xaf,0xf, 0xf8,0x0, 0xe, 0x28,0xb, 0xe1,0xe0,0x0, 0x19,0xe, 0xc7,0xff,0xe8,0x0, +0xb7,0x90,0x8f,0x82,0xe0,0x0, 0x19,0x8d,0x27,0xef,0xe0,0x0, 0x1f,0x56,0xe0,0x0, +0x1e,0xd5,0x8f,0xe, 0xf0,0x0, 0x88,0x8d,0x37,0x28,0xf0,0x11,0x38,0xce,0xe0,0x1a, +0x97,0x73,0xf8,0x43,0x38,0x91,0xe0,0x2, 0x1e,0xfd,0xf0,0x40,0x38,0xfe,0x8c,0x4d, +0x8e,0x5d,0x5, 0xa, 0xe0,0x1, 0x1e,0xd7,0x37,0x1, 0xe0,0x3, 0x8e,0xbd,0xe2,0x0, +0xce,0x82,0xe0,0x71,0x39,0xae,0xf7,0xff,0x11,0x7f,0xf0,0x12,0x39,0x1f,0xe0,0x1, +0x1f,0xf2,0xf2,0x1, 0xc1,0x7f,0xa4,0x8f,0xe0,0x0, 0x1f,0xd4,0xf0,0x0, 0xc1,0x1, +0xf0,0x12,0x31,0x21,0x10,0xff,0x12,0x7f,0x8a,0x8f,0xf0,0x0, 0x1b,0xd, 0xf0,0x12, +0x39,0x13,0x38,0x98,0xe0,0x4, 0x3a,0x1c,0xf8,0x0, 0x8a,0x6, 0xf8,0x0, 0x89,0x96, +0xf0,0xf, 0x3a,0x3c,0xe8,0xf, 0x3f,0x93,0x37,0xa1,0x3f,0x99,0x95,0x8f,0xe8,0x40, +0x3d,0xf1,0xe0,0x2, 0x4, 0x1a,0xf1,0x2f,0x3a,0x28,0xe0,0x2, 0x2f,0x96,0xf1,0x2d, +0x39,0xac,0xe0,0x2, 0x2e,0x92,0xe8,0x43,0x3b,0x3, 0xf0,0x0, 0x12,0x81,0xe2,0x0, +0xcb,0x0, 0xe0,0xa, 0x35,0x82,0xe0,0xf, 0x35,0x81,0xf8,0x15,0x3a,0x94,0xf8,0x43, +0x3b,0x84,0x3d,0x1f,0xf2,0x1, 0xc2,0xff,0xf0,0x40,0x3c,0xe6,0xf8,0x40,0x3d,0x67, +0xe0,0x0, 0x4, 0x75,0xf2,0x0, 0xcb,0x80,0x4, 0x37,0xe8,0x40,0x3f,0x67,0x13,0x80, +0x0, 0x92,0x27,0xa7,0xe8,0x40,0x3e,0xe8,0xe8,0x40,0x3b,0xec,0xe3,0xff,0xc6,0xff, +0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3d,0x6e,0xc7,0x7f,0xe0,0x43,0x3f,0xe, 0xe3,0xff, +0xcf,0x7f,0x1, 0x1a,0xe0,0xf, 0x3f,0x3c,0xf0,0x0, 0x14,0x1, 0xe8,0xf, 0x3f,0x99, +0x37,0xa1,0x3f,0x99,0xe0,0x0, 0x97,0x8f,0xf0,0x0, 0x16,0x1, 0xe0,0x3b,0x3f,0xaa, +0xf0,0x18,0x3c,0x1d,0xf0,0x1c,0x3e,0x17,0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2d,0xdb, +0xe8,0x40,0x3f,0x7a,0x2, 0x62,0x23,0x88,0xf1,0xff,0xc4,0xff,0xf8,0x43,0x3c,0x89, +0xf3,0xff,0xcc,0xff,0x1, 0xc8,0xf0,0x40,0x3a,0x71,0x3, 0x38,0xf8,0x40,0x3c,0xe5, +0xe8,0x40,0x3c,0x75,0x5, 0xb3,0xe8,0x40,0x3f,0x65,0x13,0x80,0x0, 0x91,0x27,0xa4, +0xe8,0x40,0x3e,0xe8,0xe8,0x40,0x3b,0xeb,0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff, +0xf0,0x40,0x3c,0xee,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0x3c,0x7e,0x5, 0x98,0xe0,0xf, +0x3f,0x3c,0xf0,0x0, 0x14,0x1, 0x3f,0x96,0x37,0xa1,0x3f,0x99,0x97,0x8f,0xf0,0x0, +0x15,0x81,0xe0,0x3a,0x3f,0xaa,0xf0,0x18,0x3c,0x1d,0xf0,0x1b,0x3d,0x97,0xe0,0x2f, +0x3d,0xaf,0xf7,0xff,0x2d,0x5e,0xe8,0x40,0x3f,0x79,0x4, 0xe5,0x23,0x87,0xc3,0x7f, +0xe0,0x43,0x3b,0x6, 0xe3,0xff,0xcb,0x7f,0x1, 0xcc,0xf0,0x40,0x39,0xf4,0xe0,0x1, +0x3, 0x1, 0x13,0x1, 0xe8,0x6, 0x3b,0x13,0xe2,0x1, 0xc3,0x7f,0xe0,0x40,0x3e,0x76, +0xf0,0x40,0x3c,0xe6,0xf8,0x40,0x3d,0x67,0xe0,0x0, 0x5, 0xf4,0xf2,0x0, 0xcb,0x80, +0x4, 0x37,0xe8,0x40,0x3f,0x67,0x13,0x80,0x0, 0x92,0x27,0xa7,0xe8,0x40,0x3e,0xe8, +0xe8,0x40,0x3b,0xec,0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3d,0x6e, +0xc7,0x7f,0xe0,0x43,0x3f,0xe, 0xe3,0xff,0xcf,0x7f,0x1, 0x1a,0xe0,0xf, 0x3f,0x3c, +0xf0,0x0, 0x14,0x1, 0xe8,0xf, 0x3f,0x99,0x37,0xa1,0x3f,0x99,0xe0,0x0, 0x97,0x8f, +0xf0,0x0, 0x16,0x1, 0xe0,0x3b,0x3f,0xaa,0xf0,0x18,0x3c,0x1d,0xf0,0x1c,0x3e,0x17, +0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2d,0xdb,0xe8,0x40,0x3f,0x7a,0x2, 0x62,0x23,0x88, +0xf0,0x0, 0xc4,0x81,0xf2,0x1, 0xc4,0xff,0xe8,0x40,0x3e,0x79,0x2, 0xc8,0xf0,0x40, +0x3a,0x71,0x3, 0x37,0xf8,0x40,0x3c,0x65,0xe8,0x40,0x3c,0x75,0x5, 0xb2,0xe8,0x40, +0x3f,0x65,0x13,0x80,0x0, 0x91,0x27,0xa4,0xe8,0x40,0x3e,0xe7,0xe8,0x40,0x3b,0xea, +0xe3,0xff,0xc6,0xff,0xe2,0x1, 0xc3,0xff,0xf0,0x40,0x3c,0x6e,0xc7,0x1, 0xe2,0x1, +0xc7,0x7f,0x3c,0x7e,0x5, 0x98,0xe0,0xf, 0x3f,0x3c,0xf0,0x0, 0x13,0x81,0x3f,0x96, +0x37,0xa1,0x3f,0x99,0x97,0x8f,0xf0,0x0, 0x15,0x1, 0xe0,0x39,0x3f,0xaa,0xf0,0x17, +0x3b,0x9d,0xf0,0x1a,0x3d,0x17,0xe0,0x2f,0x3d,0xaf,0xf7,0xff,0x2c,0xde,0xe8,0x40, +0x3f,0x78,0x4, 0xe5,0x23,0x86,0xc3,0x1, 0xe2,0x1, 0xc3,0x7f,0x3e,0x76,0x2, 0xcd, +0x3a,0xfd,0xe0,0x0, 0x5, 0xd3,0xf0,0x0, 0xc3,0x2, 0xf8,0x40,0x39,0x76,0xe7,0xfd, +0x1, 0xd5,0xe8,0x0, 0x9f,0x90,0x27,0x88,0xc7,0xff,0xe8,0x0, 0xb7,0x90,0xea,0x12, +0x7f,0xc7,0x17,0x1, 0xaf,0xf, 0xe0,0xf, 0x3e,0x38,0xe0,0x1a,0x9f,0x53,0xe0,0x1a, +0x9e,0xe3,0xe0,0xc, 0x37,0x81,0xe0,0xb, 0x3f,0x1d,0x3d,0xfc,0x2, 0x1d,0x37,0x82, +0xe0,0x2d,0x3e,0x9f,0x2e,0x99,0xe0,0x2f,0x3f,0x1f,0x2f,0x96,0xea,0x12,0x7f,0xc7, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x10,0xea,0x12,0x7e,0xc5,0x8f,0x8d,0xe2,0x0, +0xcf,0x81,0xe7,0xfc,0x1, 0xe8,0xea,0x12,0x7f,0xc6,0x8f,0xf, 0x2f,0xc, 0xaf,0xd, +0xe7,0xfc,0x0, 0xe1,0x38,0x82,0xea,0x12,0x7f,0x45,0xea,0x12,0x7f,0xc6,0x16,0x81, +0xae,0x8e,0x17,0x14,0xc7,0x7f,0x8e,0x82,0xaf,0xf, 0xe7,0xfc,0x26,0xd4,0x11,0x80, +0x3a,0x63,0x3c,0x63,0x3c,0xe4,0xd0,0x99,0xc1,0x81,0x8f,0x82,0xe2,0x1, 0xc1,0xff, +0x3f,0xf3,0x2, 0xf8,0xe7,0xfc,0x0, 0xc7,0xe0,0x0, 0x1f,0xd3,0x8f,0xf, 0xe0,0x0, +0x1f,0xd2,0x37,0x28,0x8f,0x8f,0xf8,0x0, 0xaa,0x0, 0x3f,0xce,0xf8,0x0, 0xa9,0x90, +0xe8,0x0, 0xb7,0x90,0xe7,0xff,0x0, 0xad,0xe0,0x0, 0x1e,0x4e,0x8f,0x8c,0x2f,0x97, +0xea,0x12,0x7f,0xc8,0x9e,0x8f,0xe0,0x1, 0x1f,0x57,0x2e,0x8a,0xe0,0x1, 0x1e,0x89, +0x8e,0xd, 0xe0,0x1, 0x1e,0x88,0x36,0x28,0x8e,0x8d,0x3e,0xcc,0xb6,0x8f,0xe0,0x2, +0x1e,0xdf,0x8e,0x8d,0x26,0xa0,0x97,0x8f,0xb7,0x9e,0x38,0x82,0xe0,0x2, 0x1f,0xc0, +0xe0,0x1, 0x1f,0x57,0x8e,0x8f,0x8c,0x1f,0x8c,0xaf,0x8d,0x3f,0x8d,0xdf,0xea,0x12, +0x7f,0xc8,0x36,0xa5,0x34,0x25,0x34,0xa5,0x35,0x25,0x35,0xa5,0xf0,0x0, 0x13,0x80, +0xf0,0x0, 0xab,0x8c,0xb6,0x9e,0xb4,0x2e,0xb4,0xce,0xb5,0x5e,0xe0,0x1, 0xb5,0x9e, +0xb6,0x8f,0x0, 0xd4,0xe0,0x0, 0x1f,0xfa,0x8e,0x8f,0xe0,0x0, 0x1f,0xf9,0x36,0xa8, +0x8f,0x8f,0x3f,0xcd,0xb7,0x9e,0x38,0x82,0x17,0xdd,0x3f,0x98,0xe2,0x1, 0xc7,0xff, +0xe2,0x0, 0xcf,0x8c,0x2, 0x9b,0x17,0x1, 0xe0,0xf, 0x37,0x3f,0xe2,0x30,0xc7,0xa9, +0x2f,0x9d,0xe2,0x0, 0xcc,0x25,0x1, 0x92,0xe0,0x0, 0x1f,0xb0,0x8f,0x8f,0x3f,0xfe, +0x1, 0x16,0xe0,0x2, 0x1f,0x40,0x17,0x81,0xe0,0x4, 0xac,0xde,0xe0,0x0, 0x1f,0x4e, +0xaf,0x8e,0xe0,0x2, 0x1f,0x60,0xaf,0x8e,0x38,0x82,0xe0,0x2, 0x1f,0xc0,0x17,0x1, +0x3c,0x1f,0xe0,0x0, 0x1f,0xce,0xac,0x88,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xe6, +0x8f,0x8f,0x2f,0xe8,0x0, 0xfb,0xe0,0x0, 0x1f,0xd, 0xe0,0xf, 0x34,0x43,0x3f,0x1f, +0xe0,0x0, 0x1f,0xc7,0xe2,0x0, 0xc4,0x7, 0x3f,0x98,0x87,0x8f,0xe0,0xf, 0x84,0xe, +0x3c,0x5f,0xe2,0x1, 0xc4,0x7f,0x38,0x82,0x17,0x7, 0xe0,0x0, 0x1f,0xc7,0x3f,0x58, +0x3f,0x9e,0xe0,0x0, 0x1f,0xd, 0x34,0x43,0x3c,0x1e,0x8f,0x8f,0xe0,0xf, 0x87,0x8, +0x2c,0x86,0xe3,0xf, 0x3f,0x5f,0xe0,0xf, 0xaf,0x88,0x38,0x82,0x3f,0xce,0xe0,0xf, +0xaf,0x88,0x38,0x82,0xe0,0x0, 0x1f,0x8d,0xe0,0x2, 0x1f,0x7d,0x34,0x21,0x3c,0x1f, +0x8f,0x88,0x8e,0xde,0x8f,0x18,0x3f,0xbd,0x3f,0x9e,0xe0,0x1, 0x1f,0x72,0x37,0xa1, +0xa7,0xe, 0x3f,0x9e,0x94,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xfd,0xe0,0x1, 0x1f,0x57, +0x8e,0xef,0x9f,0x9e,0x3e,0xf8,0x2, 0x82,0x9f,0xce,0xe0,0x2, 0x1f,0x3c,0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0x1, 0x3, 0x3c,0x6f,0x38,0x82,0x2c,0x5, 0xe0,0x1, 0x17,0x87, +0x3c,0x6f,0x38,0x82,0xe0,0x1, 0x1e,0xc2,0xe0,0xe, 0x8f,0x1d,0xc7,0x7f,0xe0,0x28, +0x3f,0x8, 0x2c,0x75,0xe0,0x28,0x3c,0x88,0x2c,0x72,0xe0,0xe, 0x8f,0x2d,0xc7,0x7f, +0x3c,0xfe,0xe0,0x1, 0x17,0x7, 0xe0,0x6e,0x39,0xaf,0x3f,0xee,0x0, 0xe5,0x0, 0x0, +0xf0,0x0, 0x1a,0x8e,0xe8,0x0, 0x8e,0x5, 0x26,0x3d,0x16,0x0, 0xe0,0x0, 0x1d,0x8d, +0xf0,0x0, 0x1b,0x47,0xe0,0x40,0x3f,0xec,0xe0,0xd, 0x37,0xc3,0x15,0x7, 0x3d,0x5f, +0xe2,0x0, 0xc6,0x9f,0x3e,0x9b,0xe8,0xa, 0x3d,0x16,0x85,0xa, 0xe0,0xf, 0x86,0x8d, +0xe0,0xe, 0x37,0xa1,0x3e,0xda,0xe0,0x17,0x3d,0x9e,0x14,0x7, 0xe0,0xe, 0x36,0x43, +0xe0,0x9, 0x36,0x21,0x3c,0x5c,0xe2,0x0, 0xc7,0x1f,0xc7,0x81,0x15,0x1, 0xe2,0x1, +0xc6,0xff,0x3c,0x9b,0x3f,0x1b,0xe8,0x8, 0x3c,0x16,0xe2,0x1, 0xc7,0xff,0x3d,0x1c, +0x26,0x8d,0xe8,0x0, 0x9e,0x7, 0x86,0x88,0xb6,0x9, 0x3e,0x6a,0xe0,0xf, 0x85,0xe, +0xe2,0x1, 0xc6,0x7f,0x3e,0xca,0xe0,0xf, 0xae,0x8e,0xe8,0x0, 0x8f,0x5, 0x3f,0x7f, +0x2, 0xcc,0xe8,0x0, 0xae,0x5, 0x38,0x82,0x8, 0xb5,0xe0,0x0, 0x19,0x41,0xe0,0x3, +0x1a,0x45,0x17,0x81,0xe0,0x1, 0x19,0xd2,0xaf,0x82,0xaf,0x84,0x17,0x80,0xaf,0x83, +0xef,0xff,0xdf,0xb0,0xe0,0x0, 0x1f,0x8e,0xe0,0x0, 0x1c,0x8d,0x8d,0xf, 0xe0,0x1, +0x25,0x46,0xf7,0xff,0x13,0xff,0xe0,0x2, 0x1f,0xfd,0xf0,0x17,0x3b,0x9a,0xf2,0x1, +0xc3,0xff,0xf0,0x0, 0x89,0x4f,0xe0,0x1, 0x1f,0x72,0xf0,0x0, 0xc3,0x81,0xf0,0x0, +0x11,0x80,0xf0,0x17,0x33,0xa1,0x12,0xfe,0xa0,0x8e,0xe8,0x5, 0x3a,0x92,0xf0,0x0, +0x88,0x5f,0xf0,0x0, 0x88,0x82,0x8d,0x84,0x3f,0x69,0xf0,0x17,0x3b,0x99,0xe8,0x40, +0x3e,0xe3,0xe8,0x40,0x3e,0x63,0xf8,0x40,0x3b,0x63,0xf1,0xff,0xc1,0x7f,0xf0,0x0, +0x12,0x1, 0xf8,0x40,0x3a,0xe3,0x0, 0xb1,0x3f,0xf5,0x14,0x1, 0xe8,0x8, 0x3c,0x16, +0x3, 0x38,0xf0,0x40,0x3b,0x68,0xf2,0x1, 0xc3,0x7f,0xf0,0x40,0x39,0x7f,0xe8,0x40, +0x3c,0x64,0xe8,0x68,0x3d,0x23,0xf0,0x40,0x39,0x7f,0xf0,0x40,0x39,0xe8,0xe8,0x40, +0x3c,0x65,0xe8,0x68,0x3d,0x21,0xf0,0x40,0x38,0xe8,0x8c,0x1e,0xe8,0xf, 0x3f,0xb0, +0xc7,0x2, 0x3f,0x98,0x37,0xa1,0x3f,0x91,0x97,0x8f,0xe8,0x40,0x3c,0x64,0xe2,0x3, +0xcf,0xf3,0xe8,0x40,0x3f,0xe5,0xe0,0x68,0x3a,0x2d,0xe0,0x6f,0x3a,0x2b,0xf0,0x40, +0x3b,0xfe,0x3e,0xe8,0x3d,0xef,0x1, 0x15,0x8f,0x8e,0xe2,0x0, 0xcf,0x82,0x2, 0xcd, +0x14,0x1, 0x3c,0x1c,0x1, 0xa, 0x3e,0x68,0xe2,0x1, 0xc6,0x7f,0x27,0xdf,0x0, 0xce, +0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0x0, 0xca,0xe2,0x0, 0xca,0x82,0x5, 0x75,0x0, 0xc6, +0xe0,0x0, 0x2c,0x7d,0xf0,0x0, 0x29,0xf7,0x8f,0x4, 0xf1,0xff,0xc3,0x7f,0xe2,0x0, +0xcf,0x1, 0xe0,0x0, 0x1, 0x63,0x17,0x1, 0xf2,0x1, 0xc3,0x7f,0xe9,0x2f,0x3f,0x26, +0xe1,0x2c,0x3e,0x1e,0x3e,0x5f,0xe0,0x0, 0x26,0x46,0xe0,0x3, 0x1f,0x86,0x16,0x80, +0x87,0xf, 0xae,0x82,0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xaf,0xf, 0xe0,0x0, 0x27,0x43, +0x17,0x0, 0xaf,0xf, 0x17,0x81,0xaf,0x83,0xe0,0x3, 0x17,0x74,0xe0,0x3, 0x1f,0xb5, +0x10,0x81,0xb7,0xf, 0x25,0x2a,0xe0,0x2, 0x1f,0xfd,0xe0,0x0, 0x1e,0xd, 0x89,0x4f, +0xe0,0x0, 0x1c,0x47,0xc1,0x7f,0x17,0x80,0xe0,0xe, 0x37,0xc3,0x16,0x87,0x8d,0x8c, +0x3e,0xdf,0xe2,0x0, 0xc7,0x1f,0xc7,0x81,0x3f,0x19,0x3e,0x98,0xe2,0x1, 0xc7,0xff, +0xc6,0x2, 0x25,0x83,0x3d,0xf2,0x4, 0x8, 0xe0,0xf, 0x85,0x8e,0x86,0x8d,0xe3,0xd, +0x3d,0xdd,0xe0,0xf, 0xae,0x8e,0x3f,0xfa,0x4, 0xe8,0x28,0x87,0xe0,0x3, 0x1f,0x35, +0x9f,0x8e,0x27,0x83,0xc7,0xff,0xb7,0x8e,0xa, 0xe1,0x8f,0x84,0xe2,0x0, 0xcf,0x81, +0x1, 0x1f,0xe0,0x3, 0x1f,0x86,0x8f,0xf, 0x2f,0x44,0x8f,0x2, 0xe2,0x0, 0xcf,0x1, +0x1, 0x40,0x88,0x83,0xe2,0x0, 0xc8,0x81,0x1, 0x1c,0xe0,0x3, 0x1f,0xb5,0x9f,0x8f, +0x27,0xec,0x2d,0x42,0x20,0xe4,0x0, 0xe9,0xf2,0x1, 0xc3,0x7f,0xe9,0x2f,0x3f,0x26, +0xe1,0x2c,0x3e,0x1e,0x3e,0x5f,0x17,0x80,0xaf,0x82,0xe7,0xff,0x0, 0x9e,0x3e,0x6a, +0x0, 0xfb,0xf0,0x0, 0xa8,0x82,0xe7,0xff,0x0, 0x89,0xaf,0x84,0xe7,0xff,0x0, 0x84, +0xe7,0xff,0x2d,0x2b,0xa, 0xe1,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfe, +0xc0,0x7c,0xe0,0x0, 0x1f,0xe, 0x11,0x90,0xf0,0x0, 0x8e,0xe, 0x39,0x90,0xe0,0x0, +0x1c,0x8d,0xf0,0xa, 0x36,0x21,0x3c,0x63,0xe0,0x3, 0xd4,0x4c,0xea,0x12,0x7f,0xce, +0x89,0xf, 0xea,0x12,0x7a,0xd0,0xe0,0x2, 0x21,0x7a,0xe0,0x1, 0x1f,0xf2,0xa7,0x8f, +0x7a,0x83,0xf0,0x0, 0x16,0x80,0x7f,0x81,0xe8,0x40,0x3b,0xed,0xe0,0x2, 0x1f,0xfd, +0xf0,0x0, 0x1c,0x8d,0x8f,0xdf,0xe0,0x0, 0x1a,0xc7,0x63,0x3, 0xe0,0x0, 0x7f,0x82, +0xf0,0x7, 0x14,0x7f,0xf0,0x1, 0x26,0xb, 0x14,0x90,0x3c,0x90,0xe8,0x40,0x3c,0x68, +0xf0,0x1, 0x13,0x7f,0xe0,0x0, 0x16,0x80,0xe0,0xf, 0x36,0xc3,0xf0,0x0, 0x12,0x87, +0xf0,0x15,0x3a,0xdd,0xe2,0x0, 0xc7,0x9f,0xe8,0xf, 0x3f,0x99,0xf0,0x15,0x3a,0x95, +0xe0,0xf, 0x87,0x8f,0xf8,0x0, 0x82,0x85,0xf0,0x0, 0x12,0x1, 0xe8,0xf, 0x3f,0xd5, +0xe2,0x1, 0xc7,0xff,0xf0,0x14,0x3a,0x1d,0x27,0xb7,0x8f,0x89,0xe2,0x1, 0xcf,0xff, +0xf0,0x40,0x39,0xef,0x1, 0x31,0xf0,0x0, 0x88,0x6, 0xf0,0x0, 0x89,0x19,0xf0,0x0, +0x88,0x96,0xf0,0xf, 0x38,0x2f,0xe3,0xff,0xc7,0xff,0xe0,0x43,0x38,0x9f,0xf8,0x15, +0x38,0xa2,0xf3,0xff,0xc2,0xff,0xe2,0x0, 0xc8,0x80,0xf8,0x13,0x39,0xa0,0xf3,0xff, +0xc1,0xff,0xf8,0x43,0x38,0x15,0xe8,0x6f,0x3d,0x23,0xf8,0x12,0x39,0x21,0xf2,0x0, +0xc8,0x0, 0xf3,0xff,0xc1,0x7f,0xe8,0x75,0x3d,0x22,0xe8,0xf, 0x3f,0x95,0xe3,0xff, +0xc7,0xff,0x3f,0xf8,0xf0,0x40,0x3a,0xe8,0xe0,0x75,0x3c,0xaf,0x3f,0xf8,0xe8,0x40, +0x3c,0x65,0xe0,0x76,0x3c,0xad,0xe8,0x40,0x3e,0xe4,0xe2,0x1, 0xc6,0xff,0xf0,0x40, +0x3e,0x7d,0xc4,0x82,0xe7,0xff,0x1, 0xaa,0xf2,0x1, 0xcb,0x7f,0x1, 0x27,0xf0,0x16, +0x33,0x21,0xf2,0x0, 0x7d,0x10,0xf8,0x1a,0x3d,0x16,0xe8,0x0, 0x8a,0xa, 0xe8,0x0, +0x89,0x9a,0x3c,0x64,0x3c,0xe3,0xdd,0xe9,0x67,0x82,0x67,0x1, 0x3f,0xb4,0xe0,0x43, +0x3c,0x18,0x3f,0x93,0x37,0xa1,0x3f,0x9e,0x97,0x8f,0x3f,0xf8,0x4, 0xf, 0xf0,0xf, +0x36,0xa1,0xe2,0x0, 0x7f,0x4c,0x3f,0x9e,0xf0,0x0, 0xc6,0x81,0xaa,0xf, 0xf2,0x1, +0xc6,0xff,0xa9,0x9f,0x17,0xff,0xe8,0x0, 0xaf,0x8a,0xf0,0x0, 0x13,0x81,0xf0,0x17, +0x3b,0x97,0xe8,0x40,0x3b,0xe7,0xe2,0x1, 0xc3,0xff,0x3b,0xf2,0xc3,0x2, 0xe7,0xfe, +0x1, 0xeb,0xe0,0x1, 0x1f,0x8e,0xf0,0x0, 0x8c,0xf, 0xf8,0x40,0x3c,0x7d,0xe0,0x0, +0x5, 0xed,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, 0x1c,0x8d,0xf0,0x0, 0xa3,0x8f,0xe0,0x2, +0x1f,0xfd,0xe0,0x0, 0x1d,0x47,0x89,0xdf,0xe8,0x40,0x3a,0x6d,0xf0,0x1, 0x12,0xff, +0xf0,0x0, 0x13,0x0, 0xf7,0xff,0x12,0x7f,0xf0,0x0, 0x26,0x51,0x15,0x90,0x3d,0x90, +0xe8,0x40,0x3c,0x65,0xe8,0x40,0x39,0x66,0xe0,0x0, 0x16,0x0, 0xe0,0xf, 0x36,0x43, +0x16,0x87,0x3e,0xdc,0xe2,0x0, 0xc7,0x9f,0x3e,0x9a,0x3f,0x99,0xf0,0x0, 0x81,0x8d, +0xe0,0xf, 0x87,0x8f,0x16,0x81,0xe8,0xf, 0x3f,0xd3,0xe2,0x1, 0xc7,0xff,0x3e,0x9c, +0x27,0x98,0xf0,0x0, 0x89,0x8b,0xf2,0x1, 0xc9,0xff,0xf0,0xf, 0x39,0xb3,0x1, 0x11, +0xf0,0x0, 0x89,0x1b,0xe8,0xf, 0x3f,0x92,0x37,0xa1,0xe8,0xf, 0x3f,0x97,0x97,0x8f, +0x3f,0xf2,0x5, 0x7, 0x3c,0x6c,0xf8,0x40,0x3d,0xe2,0xf8,0x40,0x3f,0x63,0x39,0x6f, +0x3e,0x6d,0xe2,0x1, 0xc6,0x7f,0xf0,0x40,0x3e,0x7c,0xc5,0x82,0x1, 0xd0,0xe2,0x1, +0xcc,0x7f,0x1, 0x14,0xf0,0xf, 0x36,0xa1,0xe2,0x0, 0x7f,0x4c,0x3f,0x9e,0x34,0x21, +0xe2,0x0, 0x7f,0x10,0x3c,0x1e,0xf0,0x0, 0xc6,0x81,0xf0,0x0, 0xaf,0xf, 0xf2,0x1, +0xc6,0xff,0xf0,0x0, 0xad,0x9f,0xf0,0x0, 0xaa,0x8, 0xc2,0x1, 0xe2,0x1, 0xc2,0x7f, +0xf0,0x40,0x3c,0x74,0xe7,0xff,0x1, 0xaa,0xe0,0x1, 0x1f,0xc3,0xe0,0x0, 0x14,0xcc, +0x8d,0xf, 0x3c,0x90,0x35,0x21,0xe2,0x0, 0x7c,0x10,0xe0,0x3, 0xd3,0x1b,0x64,0x3, +0xf0,0xa, 0x34,0x21,0xe0,0x1, 0x14,0xff,0xe0,0x3, 0xd3,0x4e,0xf0,0x0, 0x2e,0x8f, +0xe0,0x0, 0x1f,0xe, 0xea,0x12,0x7f,0xce,0xf0,0x0, 0xae,0x8f,0xf0,0x0, 0xae,0x8e, +0xe0,0x1, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x2, 0x36,0xa1,0xe0,0x0, +0x1c,0xd, 0x3d,0x62,0xe2,0x0, 0x7c,0x90,0xe0,0x3, 0xd2,0xfc,0x64,0x3, 0x3d,0x62, +0xe2,0x0, 0x7c,0x90,0xe0,0x3, 0xd2,0xf6,0xe0,0x0, 0x1c,0x8d,0xe0,0x0, 0x1d,0x47, +0xe0,0x0, 0x17,0x80,0xe0,0xe, 0x37,0xc3,0x16,0x7, 0x3e,0x5f,0xe2,0x0, 0xc7,0x1f, +0x3f,0x19,0x3e,0x1a,0xe0,0xf, 0x85,0x8e,0x86,0x8c,0xc7,0x81,0xe2,0x1, 0xc7,0xff, +0x3e,0xcb,0xe8,0x40,0x3f,0xfd,0xe0,0xf, 0xae,0x8e,0x1, 0xed,0xea,0x12,0x7f,0x4e, +0xf0,0x40,0x3c,0x7f,0xaf,0x8e,0xe8,0x6f,0x3c,0xa8,0xe0,0x0, 0x1f,0xe, 0xaf,0x8e, +0xe0,0x1, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x40,0x3e,0xe2,0x7a,0x83, +0xe7,0xfe,0x0, 0xb1,0x8, 0xb1,0xe0,0x0, 0xd8,0xdd,0x8, 0xa1,0xe7,0xfa,0x0, 0x9a, +0xe0,0x2, 0x1f,0xc8,0x17,0x1, 0x8f,0x8f,0xe0,0x2f,0x3f,0x8e,0xe0,0x1, 0x27,0x87, +0xe0,0x1, 0x2c,0x5, 0xe0,0x0, 0x1f,0x93,0xf0,0x0, 0x88,0x8f,0xf0,0x1, 0x28,0x81, +0xe0,0x0, 0x1f,0x8e,0xf0,0x0, 0x8a,0x8f,0xf0,0x40,0x3a,0xfe,0xe0,0x0, 0x5, 0xf9, +0xe0,0x0, 0x8, 0xb1,0xf7,0xff,0x10,0x7f,0xf0,0x0, 0x1a,0xd, 0xf8,0x10,0x38,0x15, +0xe8,0x40,0x3d,0x61,0xe8,0x40,0x3d,0xe1,0xf8,0x40,0x38,0xf0,0xe0,0x0, 0x3, 0x5e, +0xf0,0xf, 0x30,0xa1,0xf0,0x0, 0xc0,0x81,0xf2,0x1, 0xc0,0xff,0xf8,0x40,0x3a,0xf1, +0xe8,0xf, 0x3f,0x94,0x8c,0xf, 0xe0,0x0, 0x8c,0x9f,0x5, 0xef,0xf0,0x40,0x39,0x68, +0xf0,0x40,0x39,0xe9,0xe8,0x40,0x3e,0x61,0xe0,0xe, 0x36,0x21,0xe8,0xe, 0x3f,0x14, +0x8f,0x8e,0x8e,0x9e,0xe8,0xe, 0x3f,0xa2,0xe2,0x0, 0xcf,0x0, 0xe0,0xe, 0x3f,0xa8, +0xe0,0xf, 0x3c,0x2f,0xe8,0x1, 0x3e,0xa3,0xe2,0x1, 0xc7,0xff,0xe2,0x1, 0xc7,0x7f, +0xe0,0x6e,0x3d,0x2f,0xe2,0x0, 0xc8,0x80,0xe0,0xf, 0x3e,0xa9,0xe0,0xd, 0x3c,0xad, +0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc7,0xff,0xe0,0x6f,0x3d,0x2d,0x38,0xee,0x3e,0xeb, +0xe2,0x1, 0xc0,0xff,0xe2,0x1, 0xc6,0xff,0x38,0xfd,0xc6,0x1, 0xf0,0x40,0x3b,0xea, +0xf0,0x40,0x3b,0x6f,0xf2,0x1, 0xc3,0xff,0xe2,0x1, 0xc6,0x7f,0xf2,0x1, 0xc3,0x7f, +0x3, 0x82,0x3f,0x6b,0xf8,0x40,0x3b,0x77,0x3d,0xee,0xe2,0x1, 0xc5,0xff,0x3, 0x82, +0x3f,0xea,0xf0,0x40,0x3a,0xfc,0x3d,0x6f,0xe2,0x1, 0xc5,0x7f,0xe7,0xff,0x1, 0xbe, +0xf8,0x40,0x38,0xf0,0xe7,0xff,0x4, 0x26,0x14,0x4, 0xe1,0x2a,0x3c,0x2a,0x14,0x3, +0xe1,0x2b,0x3c,0x2b,0xe0,0x8, 0x3d,0x5b,0x8, 0xe1,0x14,0x0, 0x38,0x82,0x38,0x82, +0xe0,0x0, 0x1f,0x8e,0x8e,0x8f,0xe0,0x1, 0x26,0xcf,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e, +0xc0,0x70,0xe0,0x1, 0x1f,0xf2,0xe0,0x0, 0x1a,0xd, 0xf0,0x0, 0xa4,0xf, 0xe0,0x2, +0x1f,0xfd,0xe0,0x1, 0x12,0xff,0x8b,0xdf,0xf0,0x40,0x3e,0xe9,0xf0,0x40,0x3f,0x68, +0x3d,0xe8,0x3e,0x69,0xf0,0x40,0x3e,0x64,0x3b,0x65,0xf0,0x40,0x3c,0xe5,0x3f,0x65, +0xe0,0x0, 0x11,0x80,0xf8,0x0, 0x8d,0xc, 0xf8,0x0, 0x8d,0x9c,0xf0,0xf, 0x3d,0x2b, +0xe2,0x0, 0xcf,0x80,0xf8,0x2, 0x3d,0x2e,0xf8,0xf, 0x3f,0x2a,0xe2,0x1, 0xc7,0xff, +0xe2,0x1, 0xc1,0x7f,0xe0,0x62,0x3d,0x2f,0xf0,0xa, 0x3d,0xac,0xe2,0x0, 0xcd,0x0, +0x3f,0xe2,0xf8,0xa, 0x3e,0xab,0xf8,0x2, 0x3d,0xad,0xe2,0x1, 0xc1,0x7f,0xe2,0x1, +0xc5,0x7f,0xe0,0x62,0x3d,0x2a,0x39,0x1f,0x39,0x7e,0xe8,0x40,0x3c,0x6a,0xe8,0x40, +0x3c,0xeb,0xf0,0x0, 0xc6,0x2, 0x3, 0x1f,0x7d,0x82,0x7e,0x1, 0x7e,0x83,0x7f,0x4, +0xdc,0xc, 0xf0,0xf, 0x3d,0x37,0xe0,0x43,0x3c,0x18,0xe8,0xf, 0x3f,0x9b,0x37,0xa1, +0xe8,0xf, 0x3f,0x98,0x97,0x8f,0x65,0x82,0x3f,0xf8,0x66,0x1, 0x66,0x83,0x67,0x4, +0x5, 0xa, 0x3f,0x62,0xf0,0x40,0x3c,0xe3,0xe2,0x1, 0xc7,0x7f,0xe8,0x40,0x3a,0xeb, +0xe8,0x40,0x3b,0x6a,0xc1,0x81,0xe2,0x1, 0xc1,0xff,0x39,0xfd,0xe7,0xff,0x1, 0xb4, +0xe0,0xa, 0x3b,0x37,0xf0,0x2, 0x1b,0xff,0x3d,0x15,0x35,0x21,0xf8,0x0, 0xac,0x87, +0xe8,0xa, 0x3d,0x18,0x16,0x80,0x11,0x1, 0x14,0x2, 0x14,0x84,0x0, 0x8e,0x27,0x3e, +0x97,0xc, 0x97,0x8a,0x3f,0x7f,0xe0,0x0, 0x2, 0x49,0xc6,0x81,0xe2,0x1, 0xc6,0xff, +0x39,0xfd,0xc2,0x2, 0xe0,0x0, 0x1, 0x44,0xf0,0x40,0x3c,0xfd,0x1, 0x77,0x8d,0x84, +0xf0,0x0, 0x8b,0x14,0xe0,0xe, 0x3d,0xa6,0xf0,0x43,0x3a,0x1e,0xf2,0x0, 0xca,0x0, +0xf0,0xf, 0x3b,0x25,0xe0,0x15,0x3b,0x2b,0xf2,0x1, 0xc2,0xff,0xf0,0x43,0x3a,0x1f, +0xe2,0x1, 0xc7,0x7f,0xe8,0x6e,0x3d,0x25,0xe0,0xc, 0x3d,0xb7,0xe8,0x15,0x3a,0xa6, +0xf2,0x0, 0xca,0x0, 0xf2,0x1, 0xc2,0xff,0xe2,0x1, 0xc7,0xff,0xe8,0x6f,0x3d,0x25, +0xe8,0xc, 0x3e,0x16,0x36,0x21,0xe1,0x35,0x3c,0x2f,0xe8,0xc, 0x3e,0x18,0xe1,0x2f, +0x3c,0xaf,0xe1,0x2e,0x39,0x2e,0xf7,0xff,0x2a,0xc4,0x3d,0xb7,0x27,0xc7,0xe8,0xb, +0x3d,0x96,0x35,0xa1,0xe8,0xb, 0x3d,0x98,0x27,0x41,0x97,0x8a,0x97,0xb, 0xe0,0x1, +0xc7,0xc8,0x3f,0x7f,0xe7,0xff,0x5, 0x3b,0xe8,0x0, 0xae,0x87,0xc0,0x10,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1f,0xff,0x17,0x7f,0xaf,0xf, 0x38,0x82,0x0, 0x0, +0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1e,0xde,0x8f,0xf, 0xe0,0x0, 0x2f,0x56,0xe0,0x0, +0x1f,0x8e,0xf0,0x0, 0x1a,0x8d,0xf0,0x0, 0x8b,0xf, 0xf0,0x0, 0x23,0x4d,0xe0,0x1, +0x1f,0xf2,0xf0,0x0, 0x18,0x8b,0xf0,0x0, 0xa1,0x8f,0xe0,0x2, 0x1f,0xfd,0xf0,0x0, +0x19,0xa, 0xf0,0x0, 0x8a,0x5f,0xe8,0x40,0x3e,0x65,0x3e,0xee,0xe0,0x1, 0x14,0x7f, +0xf0,0x40,0x3b,0xee,0x8d,0xc, 0x8d,0x9c,0xe8,0xf, 0x3d,0x34,0x14,0x81,0x3f,0x9b, +0x37,0xa1,0xe8,0xf, 0x3f,0x93,0x97,0x8f,0x3c,0x9d,0xe8,0x40,0x3f,0xf7,0xc6,0x2, +0x5, 0x8, 0xe8,0x0, 0xad,0x1, 0x3c,0x6d,0xe8,0x0, 0xad,0x82,0xf0,0x40,0x3b,0xef, +0x3e,0xe9,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf6,0x1, 0xe5,0xe0,0x0, 0x1d,0x47, +0x15,0x81,0xe0,0xf, 0x37,0x43,0x16,0x7, 0x3d,0x9e,0x3c,0x7e,0x3e,0x5e,0xe2,0x0, +0xc7,0x9f,0x3f,0x6b,0xe8,0xf, 0x3f,0x95,0x3e,0x1a,0xe2,0x1, 0xc7,0x7f,0x1, 0x8, +0xe0,0xf, 0x85,0x8f,0x86,0xc, 0xe3,0xc, 0x3d,0xdc,0xe0,0xf, 0xae,0xf, 0x3e,0xfe, +0x1, 0xe8,0x38,0x82,0x38,0x82,0xe0,0x1, 0x8c,0x8d,0x8c,0x7d,0xe7,0xfd,0x0, 0xca, +0xe0,0x0, 0x1f,0x8e,0xe0,0x1, 0x1c,0xce,0x8d,0xf, 0x17,0x80,0xaf,0x89,0xea,0x12, +0x7f,0xcd,0x2d,0xd, 0xe0,0x2, 0x1f,0x48,0xad,0xf, 0x8f,0xe, 0xe2,0x0, 0xcf,0x1, +0x1, 0x15,0xea,0x12,0x7f,0xcc,0x17,0x0, 0xaf,0xf, 0x38,0x82,0x87,0xf, 0xc7,0x1, +0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x6, 0x5, 0x82,0x17,0x6, 0xaf,0xf, 0xe0,0x2, +0x1f,0x48,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0xed,0x8, 0xb3,0xe0,0x2, 0x1e,0xeb, +0xe0,0x3, 0x19,0x1c,0x16,0x0, 0x8f,0xd, 0xae,0x2, 0xe0,0x0, 0x2f,0x5a,0xe2,0x0, +0xcd,0xf, 0xe0,0x0, 0x2, 0xd1,0xe2,0x0, 0xcd,0x1, 0xe0,0x0, 0x5, 0xd6,0x8f,0x8f, +0xe2,0x0, 0xcf,0x85,0xe0,0x0, 0x2, 0xd1,0xfa,0x12,0x78,0xcc,0xf8,0x0, 0x89,0x81, +0xf0,0x1, 0x29,0xd9,0xf7,0xff,0x11,0x7f,0xf0,0x0, 0x1a,0x8d,0xf0,0x12,0x39,0x1a, +0xe8,0x40,0x3e,0xe3,0xf8,0x40,0x39,0xf2,0xe0,0x1, 0x3, 0x2e,0xf0,0xf, 0x31,0xa1, +0xf0,0x0, 0xc1,0x81,0xf2,0x1, 0xc1,0xff,0xe8,0x40,0x3d,0x73,0xe8,0xf, 0x3f,0x95, +0xf0,0x0, 0x8b,0x1f,0x5, 0xf0,0xf8,0x40,0x3a,0x66,0xe8,0x40,0x3f,0xe3,0x0, 0x89, +0x3d,0xfd,0xe8,0x6d,0x3a,0x27,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3d,0x7f,0x1, 0x63, +0xe0,0xe, 0x37,0xa1,0xe8,0xe, 0x3f,0x15,0x8f,0x1e,0xe8,0xc, 0x3f,0x24,0xe8,0xb, +0x3f,0x26,0xe2,0x0, 0xce,0x0, 0xf0,0x40,0x3b,0xeb,0xf2,0x1, 0xc3,0xff,0x2, 0x69, +0xe0,0x41,0x3e,0x4c,0x3e,0x7d,0xf0,0xe, 0x3b,0x2e,0xe2,0x1, 0xc7,0x7f,0xe0,0x6d, +0x3a,0x2e,0x0, 0xe2,0xea,0x12,0x7f,0xcc,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xc7,0x7f, +0xaf,0xd, 0xe7,0xff,0x0, 0xa6,0xea,0x12,0x7f,0xcc,0x8f,0xf, 0x27,0x3, 0xc7,0x7f, +0xaf,0xf, 0xe0,0x0, 0x1f,0x93,0xe0,0x0, 0x1f,0x12,0x89,0x8f,0x3d,0x73,0x5, 0x96, +0xe0,0x0, 0x21,0xfd,0xe2,0x0, 0xc9,0x81,0xe0,0x1, 0x1, 0x7, 0xe0,0x1, 0x1f,0xe8, +0x17,0x3, 0x8f,0x8f,0xaf,0x9, 0xe0,0x0, 0x27,0xfb,0xe2,0x0, 0xcf,0x82,0x1, 0xdf, +0xe0,0x0, 0x1f,0x38,0xaf,0x8e,0xe0,0x0, 0x9, 0xe1,0xe0,0x0, 0x4, 0xd5,0xe2,0x0, +0xcd,0x1, 0x5, 0xd5,0xf0,0x0, 0x1b,0x8d,0xf0,0x0, 0x11,0x1, 0xf8,0x40,0x38,0xe7, +0xf0,0x0, 0x13,0x2, 0xe8,0x0, 0x8c,0x1, 0xe8,0x0, 0x8d,0x91,0xf0,0x40,0x39,0xe8, +0xf0,0x40,0x3a,0x6b,0xe8,0x40,0x3e,0x62,0xe0,0xf, 0x36,0x21,0xf0,0xe, 0x3b,0x9f, +0x8e,0x8e,0x8f,0x1e,0xf0,0xf, 0x39,0xad,0xe2,0x0, 0xcf,0x80,0xe0,0xf, 0x3c,0x2d, +0x3e,0xa8,0xe2,0x1, 0xc6,0xff,0xf0,0x15,0x3a,0x2e,0xe2,0x1, 0xc7,0xff,0xe0,0x6f, +0x3d,0x2d,0xe0,0xd, 0x3d,0xae,0xf2,0x0, 0xca,0x80,0x3f,0x2b,0xe2,0x1, 0xc7,0x7f, +0xe2,0x1, 0xc6,0xff,0xc6,0x1, 0xe0,0x6d,0x3d,0x2e,0xf1,0x2f,0x3b,0x2f,0xe2,0x1, +0xc6,0x7f,0xf1,0x2e,0x3b,0x2d,0x27,0x83,0xe7,0xff,0x2f,0x32,0x3d,0x7c,0x2, 0xd5, +0xf0,0x0, 0xc1,0x1, 0xf2,0x1, 0xc1,0x7f,0xe8,0x40,0x3d,0x72,0xf0,0x0, 0xc0,0x82, +0x1, 0xc2,0x9, 0xe1,0xe2,0x0, 0xce,0x85,0xe7,0xff,0x5, 0x95,0x17,0x81,0xe8,0x0, +0xaf,0x81,0x9, 0xe1,0xe2,0x0, 0xcd,0x1, 0xe7,0xff,0x1, 0x9a,0xe0,0x2, 0x1f,0xdd, +0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe7,0xff,0x1, 0x93,0xe0,0x1, 0x1f,0xc7,0x9f,0x8f, +0xe2,0x1, 0xcf,0xc8,0xe7,0xff,0x5, 0x8c,0x9, 0xe1,0xde,0x8b,0x17,0x81,0xaf,0x82, +0x9, 0xe1,0xf1,0xff,0xc1,0xff,0xf8,0x0, 0xa9,0x81,0x9, 0xe1,0xe0,0x0, 0x1f,0xb8, +0x17,0x1, 0xaf,0xf, 0x9, 0xe1,0x8c,0x9e,0x8c,0xe, 0xdd,0xa3,0xa9,0x82,0x9, 0xe1, +0x8, 0xb1,0xe0,0x1, 0x1f,0xf2,0xe0,0x1, 0x15,0x48,0xa4,0xf, 0x14,0xa8,0xef,0xfd, +0xda,0x96,0xe0,0x0, 0x1d,0x8d,0xe0,0x1a,0x97,0xfb,0xe2,0x1b,0xcf,0xac,0xe0,0x0, +0x1f,0x8e,0x8d,0xf, 0x2, 0x6, 0xe0,0x1b,0x97,0x9b,0xe3,0xe4,0xcf,0xd4,0x3, 0x19, +0x25,0x17,0xe0,0x0, 0x1c,0xc7,0x16,0x80,0x3f,0xed,0xe2,0x1, 0xc7,0xff,0xe0,0xe, +0x37,0xc3,0xe2,0x0, 0xc7,0x87,0x3f,0x1b,0x3f,0x99,0xe0,0xf, 0x86,0xe, 0x87,0x8f, +0xc6,0x81,0xe3,0xf, 0x3e,0x5f,0x3e,0xfa,0xe0,0xf, 0xaf,0x8e,0x1, 0xee,0x8, 0xe1, +0xe0,0xf, 0x35,0x24,0x3c,0x7f,0x5, 0x7c,0xe0,0x3, 0x1f,0xae,0x8f,0x8f,0xe2,0x0, +0xcf,0x81,0x1, 0x5f,0x8, 0xe1,0xe0,0x0, 0x1f,0xbb,0xe0,0x2, 0x8f,0xf, 0x3f,0x9e, +0xe0,0x6, 0x8c,0x8f,0xe0,0x1, 0x1f,0xe9,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0x1, 0x2, +0x38,0x82,0xe2,0x1, 0xc4,0xfd,0x2c,0xfd,0x8, 0xb1,0xe0,0x1, 0x1f,0xf1,0xe0,0x13, +0x15,0x44,0xa4,0xf, 0xef,0xfd,0xda,0x4b,0xe2,0x0, 0xcc,0x64,0x5, 0x87,0xe0,0x1, +0x1f,0xdc,0x17,0x7f,0xa7,0x8f,0xe0,0x7, 0xaf,0x3f,0x8, 0xe1,0x8, 0xb2,0xe0,0x1, +0x1f,0xd7,0xe0,0x3, 0x8f,0xaf,0x27,0xb1,0xe0,0x0, 0x19,0xe, 0xdf,0x9a,0xd9,0xc1, +0xd9,0xc0,0xef,0xff,0xd7,0x3, 0xd9,0xbd,0xe0,0x0, 0x1f,0xa7,0x87,0x2, 0xaf,0xf, +0xd5,0x78,0xd9,0xb7,0xd9,0xb6,0x8f,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0x9, 0xd9,0xf5, +0xd9,0xb0,0xda,0xfb,0xe0,0x0, 0x1f,0xb8,0x8f,0x8f,0x27,0x93,0x9, 0x61,0xe0,0x3, +0x1f,0x6, 0x16,0x80,0xae,0x8e,0x17,0x80,0xe0,0x3, 0x1f,0x35,0xb7,0x8e,0xe0,0x0, +0x1f,0x41,0xaf,0x8e,0xd9,0x9e,0xda,0xe9,0xe0,0x0, 0x1f,0xb8,0x8f,0x8f,0x2f,0xef, +0xde,0x48,0x9, 0x21,0xe7,0xf3,0x0, 0x96,0xef,0xfe,0xde,0x50,0xd9,0x92,0x0, 0xcd, +0x8, 0xb6,0xc0,0x74,0x3c,0x7a,0xe4,0xf, 0x35,0x28,0xe4,0xe, 0x34,0x28,0x39,0x68, +0x4, 0x82,0x39,0x6a,0x3f,0x7f,0x3f,0xe8,0xe0,0x6f,0x3d,0xaa,0x3c,0xfb,0x38,0xef, +0xe2,0x1, 0xc1,0x7f,0xe2,0x1, 0xc0,0xff,0x39,0xeb,0xe4,0xf, 0x35,0xa8,0xe4,0xe, +0x34,0xa8,0x3, 0x82,0x39,0xe9,0x3f,0x7f,0xe2,0x1, 0xc1,0xff,0x3f,0xe9,0xe0,0x6f, +0x3d,0xab,0x3c,0xf3,0xf0,0x40,0x3b,0x6f,0xf2,0x1, 0xc3,0x7f,0xe0,0x1, 0x1, 0x1e, +0x3d,0x72,0xe0,0x1, 0x2, 0x9e,0xf0,0x40,0x3a,0xe2,0xf0,0x0, 0x11,0x81,0xe0,0x1, +0x1f,0xf2,0xf0,0x0, 0x11,0x1, 0xf0,0x0, 0xa2,0xf, 0xe0,0x2, 0x1f,0xfd,0xe0,0x0, +0x1a,0x29,0xf0,0x0, 0x8b,0xdf,0xf8,0x12,0x39,0x16,0x3c,0xe3,0x15,0x0, 0xf0,0x1, +0x10,0x7f,0xf7,0x0, 0x10,0x81,0x14,0x7f,0xf0,0x40,0x39,0x79,0xe0,0x0, 0x1, 0x62, +0xe8,0x40,0x3c,0xf6,0xf0,0x1, 0x21,0x83,0xe0,0x1, 0x3, 0x65,0x17,0x1, 0x3f,0x19, +0xf0,0x40,0x3a,0xf1,0xf0,0x0, 0x6a,0x84,0x6f,0x5, 0xe0,0x1, 0x3, 0x61,0x17,0x81, +0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88,0x6c,0x89,0x6f,0x8c,0x6f,0xd, +0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0x60,0xe8,0x40,0x3b,0x61,0x16,0x80,0x8d,0x8e, +0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d,0xe8,0xf, 0x3d,0xb7,0x1, 0x10,0x8d,0x9e, +0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1,0xe8,0xf, 0x3f,0x94,0x1, 0x8, 0x97,0x8f, +0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6,0xe0,0x66,0x3a,0x2f,0x3e,0xe5,0xe2,0x1, +0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, 0x1, 0xe3,0xe0,0xf, 0x36,0x22,0xe2,0x0, +0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40,0x3b,0x7d,0xe0,0x1, 0x1, 0x34,0xe8,0x40, +0x39,0xf6,0xe0,0x1, 0x1, 0x30,0xe2,0x1, 0xce,0x7f,0xe7,0xff,0x1, 0x2f,0xe0,0xe, +0x35,0x21,0x3c,0xed,0x3f,0x14,0xe2,0x0, 0x7e,0x4, 0xf0,0x40,0x39,0x79,0x3f,0x9c, +0xc5,0x1, 0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0xf0,0x0, 0x8a,0x8f,0xe7,0xff,0x1, 0xa2, +0xe0,0xff,0x14,0x7f,0x25,0x18,0x17,0xff,0x3f,0x9a,0x3d,0x6f,0xe2,0x1, 0xc5,0x7f, +0xe0,0x0, 0x1e,0xa9,0xe0,0xf, 0x35,0x21,0xe0,0x0, 0x1f,0x28,0xe0,0xf, 0x3f,0x9d, +0xe0,0xff,0x14,0x7f,0xe0,0x80,0x96,0x9e,0x3e,0xf8,0xe0,0x6d,0x3a,0x28,0x3f,0x7f, +0x3c,0x6d,0x1, 0xf9,0xc0,0xc, 0xb, 0x61,0x3c,0x72,0xe7,0xfe,0x5, 0xe6,0xf0,0x40, +0x3a,0xe1,0xf0,0x0, 0x11,0x80,0xe7,0xfe,0x0, 0xe4,0xe0,0x0, 0x3, 0x59,0x17,0x1, +0x3f,0x19,0xe8,0x40,0x39,0x75,0xf0,0x0, 0x6a,0x84,0x6f,0x5, 0xe0,0x0, 0x3, 0x55, +0x17,0xff,0xe8,0xf, 0x3f,0x95,0xe2,0x1, 0xc7,0xff,0x6f,0x88,0x6c,0x89,0x6f,0x8c, +0x6f,0xd, 0x17,0x4, 0x3f,0x10,0xe8,0x40,0x3e,0xe3,0xe8,0x40,0x3e,0x60,0xe8,0x40, +0x3b,0x61,0x8d,0x8e,0x12,0x81,0xe2,0x1, 0xcd,0xff,0x3a,0x9d,0xe8,0xf, 0x3d,0xb7, +0x1, 0x10,0x8d,0x9e,0x3f,0x9b,0xe2,0x1, 0xcd,0xff,0x37,0xa1,0xe8,0xf, 0x3f,0x94, +0x1, 0x8, 0x97,0x8f,0x3f,0xf6,0xe0,0x6c,0x3a,0x2d,0x3f,0xf6,0xe0,0x66,0x3a,0x2f, +0x3e,0xe5,0xe2,0x1, 0xc6,0xff,0xe2,0x0, 0xce,0x83,0xc7,0x4, 0x1, 0xe3,0xe0,0xf, +0x36,0x22,0xe2,0x0, 0x7f,0x4, 0x3f,0x1f,0x8e,0x9e,0xf0,0x40,0x3b,0x7d,0x1, 0x2d, +0xe8,0x40,0x39,0xf6,0x1, 0x2a,0xe2,0x1, 0xce,0x7f,0xe7,0xfe,0x1, 0x2f,0xe0,0xe, +0x35,0x21,0xe2,0x0, 0x7e,0x4, 0x3f,0x9c,0x3f,0x14,0xc5,0x1, 0xf0,0x0, 0x8a,0x8f, +0xb3,0xe, 0xe2,0x1, 0xc5,0x7f,0x3c,0xed,0xe7,0xfe,0x0, 0xa0,0xf0,0x40,0x3a,0xf2, +0x6c,0x4, 0x6c,0x5, 0x2, 0x23,0x6c,0x8, 0x6c,0x9, 0x6c,0xc, 0x6c,0xd, 0xe7,0xff, +0x0, 0xb2,0xe8,0x40,0x38,0xf5,0x6c,0x4, 0x6c,0x5, 0x2, 0x12,0x6c,0x8, 0x6c,0x9, +0x6c,0xc, 0x6c,0xd, 0xe7,0xfe,0x0, 0xa6,0x8f,0xe, 0x3f,0x72,0x1, 0xd5,0xe7,0xfe, +0x0, 0xe9,0x8f,0xe, 0x3f,0x71,0xe7,0xfe,0x1, 0xd0,0xe7,0xfe,0x0, 0xe3,0x17,0x81, +0xe8,0xf, 0x3f,0x95,0x6f,0x88,0x6c,0x89,0x0, 0xec,0x17,0xff,0xe8,0xf, 0x3f,0x95, +0x6f,0x88,0x6c,0x89,0x0, 0xdb,0x0, 0x0, 0x8, 0xb3,0xf7,0xff,0x12,0x7f,0xf0,0x43, +0x38,0x8, 0xf0,0x14,0x3a,0x18,0xf0,0x0, 0x10,0x81,0xf8,0x43,0x3a,0x4, 0xf8,0x11, +0x38,0x90,0xe0,0x2, 0x1f,0xfd,0xf8,0x40,0x3a,0x71,0x80,0xef,0xf0,0x0, 0x82,0xff, +0xe0,0x0, 0x2, 0x65,0xe0,0x1, 0x1f,0x72,0xf7,0xff,0x11,0x7f,0xf0,0x0, 0x11,0x81, +0xf0,0x13,0x39,0x98,0xf0,0x43,0x3b,0x89,0xf0,0x12,0x39,0x19,0x15,0x1, 0x11,0x81, +0xf0,0x0, 0xa3,0xe, 0x89,0x5f,0xf8,0x43,0x39,0x2, 0xe8,0xa, 0x3d,0x17,0xf2,0x1, +0xc1,0xff,0xe7,0x0, 0x14,0x1, 0x39,0x99,0xf2,0x0, 0xca,0x0, 0xe8,0x43,0x3f,0x83, +0xe8,0x40,0x3d,0xe4,0xe0,0x6b,0x3c,0x2f,0xe8,0x40,0x38,0xf4,0xe0,0x6b,0x3d,0x2f, +0xe8,0x40,0x3d,0x72,0x4, 0x2e,0x3e,0x63,0xe0,0x9, 0x39,0x3b,0xe2,0x1, 0xc6,0x7f, +0xe8,0x2b,0x3d,0x80,0xe8,0x40,0x3f,0xe2,0x0, 0x84,0x25,0x9c,0x3f,0xfa,0x2, 0x21, +0xe2,0x0, 0xcf,0x80,0xe0,0x43,0x3e,0x8c,0x3f,0x6f,0xe0,0x6e,0x3c,0x2d,0xf0,0x40, +0x3a,0xff,0xc6,0x7f,0xe0,0x6e,0x3d,0x2d,0xe0,0xd, 0x3f,0x19,0xc7,0x81,0x36,0xa1, +0xe8,0x2e,0x3f,0x7, 0xe0,0x43,0x3f,0x8f,0xe8,0xd, 0x3e,0x96,0xe2,0x1, 0xc6,0x7f, +0x2f,0x65,0x97,0xd, 0x3f,0x78,0xe0,0x6e,0x3c,0x28,0x3f,0xfa,0x3c,0x6e,0x5, 0x61, +0xf0,0x0, 0xc2,0x1, 0xf8,0x43,0x3a,0x4, 0xf8,0x40,0x3a,0x71,0xf1,0xff,0xc1,0xff, +0xf2,0x1, 0xc1,0xff,0xe7,0xff,0x5, 0x3a,0x9, 0xe1,0xe7,0x0, 0x14,0x1, 0x9, 0xe1, +0x8, 0xb4,0xc0,0x78,0x39,0xea,0x3a,0x6b,0x7e,0x2, 0x7e,0x81,0xdf,0x7e,0x39,0x68, +0x3c,0xe4,0x3c,0x63,0xdf,0x7a,0x39,0x18,0xe4,0x8, 0x31,0x4f,0x3c,0x12,0x34,0x1, +0x66,0x81,0x3f,0xe8,0xe3,0xff,0xc6,0xff,0xe3,0xff,0xc7,0xff,0xe0,0xe, 0x3e,0xaf, +0xe0,0x43,0x3f,0x1e,0x66,0x2, 0xe2,0x0, 0xcf,0x0, 0xe0,0x8, 0x3e,0xa8,0xe0,0xe, +0x3f,0xad,0xe3,0xff,0xc6,0x7f,0xe0,0x43,0x3f,0x1e,0xe0,0x43,0x3c,0x18,0xe0,0xf, +0x3e,0xac,0xe0,0x68,0x3d,0x2e,0xe0,0x2, 0x1f,0x41,0xe0,0x43,0x3f,0x9f,0x3e,0x2d, +0xe2,0x0, 0xcf,0x80,0x9f,0xe, 0xe0,0x43,0x3e,0x1c,0xe0,0x6f,0x3d,0x2c,0xe2,0x0, +0xcf,0xb, 0x16,0x86,0x17,0x3, 0xe0,0x6e,0x3c,0xad,0x3f,0x38,0x3f,0xfe,0x5, 0xa, +0xe0,0x0, 0x17,0x64,0xe0,0x2f,0x3f,0x9e,0xe0,0x28,0x3c,0x1e,0x3c,0x5f,0xc0,0x8, +0xa, 0x61,0x14,0x0, 0xc0,0x8, 0xa, 0x61,0x8, 0xb1,0xc0,0x44,0x15,0x3c,0x14,0x80, +0xe2,0x0, 0x7c,0x4, 0xe0,0x2, 0xdd,0x50,0xe0,0x0, 0x1f,0x8e,0x14,0x0, 0x8d,0x8f, +0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5, 0xc8,0x15,0x7f,0x3d,0x1b,0xe2,0x1, 0xc5,0x7f, +0xc5,0x1, 0xe0,0x0, 0x1f,0x8d,0xf2,0x0, 0x7b,0x4, 0x35,0x21,0x3d,0x1f,0xe8,0x40, +0x3f,0x66,0x86,0xf, 0x86,0x9f,0xc7,0x82,0xae,0xe, 0x3f,0xfa,0xc7,0x2, 0xe0,0x40, +0xae,0x9e,0x1, 0xf8,0xf0,0x0, 0x13,0x80,0xe8,0x40,0x3e,0xe7,0xf0,0x0, 0xc3,0x81, +0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3d,0xf7,0x14,0x1, 0x1, 0x25,0xe8,0x0, 0x8c,0x86, +0xe8,0x0, 0x8d,0x16,0xe8,0x40,0x3f,0xe7,0xe0,0xe, 0x37,0xa1,0xe2,0x0, 0x7e,0x4, +0x3f,0x1c,0x8e,0xe, 0x8f,0x1e,0x3e,0x79,0x3e,0x6d,0xe0,0x6c,0x39,0xa8,0xc7,0x81, +0x3f,0x7a,0xe2,0x1, 0xc7,0xff,0x3f,0x6d,0xe0,0x6e,0x39,0xac,0x3d,0xff,0x3c,0x6e, +0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3d,0xf7,0xf0,0x0, +0xc3,0x2, 0x1, 0xdd,0xc0,0x3c,0x8, 0xe1,0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x40, +0xe0,0x0, 0x1f,0xe, 0xe0,0x1, 0x1f,0xc3,0x8f,0xe, 0xea,0x4f,0x7d,0x98,0x89,0xf, +0xe9,0xff,0xc5,0xff,0xe0,0x2, 0x1e,0x3b,0x7f,0xa, 0x17,0x80,0xe0,0x2, 0x1f,0x22, +0xf0,0x40,0x38,0xe8,0xf0,0x2, 0x1c,0xc3,0xa4,0xb, 0xaf,0x8e,0x3d,0x62,0xaf,0x8c, +0x14,0x80,0xf0,0x0, 0x78,0x81,0xe8,0x7, 0xaf,0xd9,0xe8,0x7, 0xaf,0xe9,0xe0,0x2, +0xdc,0xdb,0xe0,0xa, 0x31,0x21,0x14,0x80,0xe8,0x40,0x3c,0x69,0xe0,0x2, 0xdc,0xd4, +0x67,0xa, 0xf0,0x0, 0x60,0x81,0xe2,0x0, 0xcf,0x1, 0xe0,0x2, 0x5, 0xe1,0xea,0x4f, +0x7f,0x98,0xe9,0xff,0xc7,0xff,0xf0,0x0, 0xa6,0x8f,0xf0,0x0, 0x15,0x81,0xf8,0xe, +0x3d,0xad,0xf0,0x0, 0x18,0x3, 0xf8,0x40,0x3e,0x6b,0x7f,0xe, 0xf2,0x0, 0xcd,0x81, +0xf8,0x40,0x8c,0x30,0xe8,0x40,0x8b,0xa0,0xe0,0x2, 0x1, 0x43,0xe8,0x0, 0x8f,0xd, +0xe0,0x2, 0x27,0x3f,0x67,0x8a,0xf0,0x40,0x3d,0xff,0xe0,0x2, 0x3, 0xc1,0x3b,0x6f, +0xc3,0x7f,0xe2,0x1, 0xc3,0x7f,0x67,0xe, 0xe8,0x17,0x3b,0x2b,0xe8,0xe, 0x3f,0x1d, +0xf2,0x1, 0xc3,0xff,0xf0,0x17,0x3b,0x9e,0xf0,0x17,0x33,0xa1,0xe0,0x0, 0x1f,0x8d, +0x17,0x1, 0xf0,0x0, 0xc3,0x83,0xe0,0x3, 0x1d,0x85,0xe8,0xe, 0x3f,0x1d,0xc3,0x1, +0xf0,0x17,0x3b,0x9f,0x7f,0x9, 0x3a,0x6e,0xf0,0x0, 0x7d,0x8b,0xf8,0x40,0x3a,0xe8, +0xe8,0x40,0x3a,0xe0,0x17,0x5, 0x3b,0x1b,0xf8,0x40,0x3d,0xe7,0xf0,0x0, 0x78,0xc, +0xf0,0x40,0x3f,0x67,0x0, 0x9e,0xe0,0x0, 0x27,0xc9,0x16,0x81,0xe8,0xd, 0x3e,0xd1, +0xe0,0x0, 0x26,0xc4,0xe0,0x2, 0x1e,0x3b,0xe8,0x7, 0x87,0xd9,0x86,0x8c,0xc7,0x81, +0xc6,0x81,0xae,0x8c,0xe8,0x7, 0xaf,0xd9,0x8e,0x4, 0xe0,0x2, 0x2e,0x6, 0xe8,0x0, +0x8f,0x8d,0xaf,0x84,0xc2,0x82,0xf0,0x40,0x3d,0xf5,0xc2,0x1, 0xe0,0x1, 0x1, 0x60, +0xf0,0x40,0x8d,0x15,0xf0,0x0, 0x88,0x5, 0xf8,0xf, 0x3a,0xaa,0xe2,0x0, 0xcf,0x80, +0xf8,0x2, 0x3c,0x2a,0xf8,0xf, 0x3d,0x28,0xe2,0x1, 0xc7,0xff,0xf8,0xd, 0x3f,0x20, +0xe2,0x1, 0xc1,0x7f,0xe0,0x62,0x3d,0x2f,0xe8,0x3, 0x3b,0xa0,0xe2,0x0, 0xce,0x80, +0xf0,0xf, 0x38,0x27,0xe2,0x1, 0xc1,0xff,0xe2,0x1, 0xc7,0xff,0xe1,0x2d,0x39,0x1e, +0xe0,0x63,0x3d,0x2f,0x2e,0xd8,0xe1,0x2f,0x39,0x9e,0x2f,0xd5,0xf1,0x2d,0x3e,0x23, +0xf1,0x2f,0x3e,0x22,0xe7,0xff,0x2e,0xb9,0xe9,0x2d,0x39,0x1c,0x2e,0x84,0xe9,0x2d, +0x39,0x9c,0x26,0xc9,0x16,0x82,0xe8,0xd, 0x3e,0xd1,0x26,0xc5,0xe0,0x2, 0x1d,0xfd, +0xe0,0x1, 0x1e,0x72,0x8e,0xdb,0xa5,0x8c,0xf0,0xc, 0x3c,0x3d,0xe8,0xd, 0x3e,0xba, +0x3e,0x17,0xe8,0xd, 0x3e,0x90,0x36,0x21,0x36,0xa1,0x3e,0x1b,0x3e,0x9b,0xf0,0x0, +0x91,0xc, 0xf0,0x0, 0x92,0xd, 0x16,0x82,0xe1,0x2c,0x3e,0xa2,0xe8,0x40,0x3d,0xe0, +0xe8,0x40,0x3d,0x6a,0xe1,0x2d,0x3e,0xa3,0x3c,0xe7,0xe8,0x40,0x3c,0x68,0x7f,0x3, +0x7f,0x84,0xf0,0x0, 0x78,0x81,0xf0,0x0, 0x7a,0x82,0x7e,0x8, 0x7e,0x8d,0xf0,0x0, +0x78,0x7, 0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x7a,0x5, 0xdc,0x8b,0xf0,0x0, 0x61,0x6, +0xf0,0x0, 0x62,0x5, 0xe2,0xff,0xcc,0x7f,0xf8,0xc, 0x39,0x14,0xe4,0xd, 0x36,0x4f, +0xf0,0x0, 0x60,0x7, 0x3e,0x9c,0x16,0x0, 0xe0,0x6c,0x39,0xa8,0x36,0x81,0xf8,0x40, +0x39,0x74,0xe8,0x40,0x3d,0xe0,0xe8,0x40,0x3d,0x6a,0xe0,0x43,0x3e,0x9d,0xf8,0x40, +0x3d,0x64,0x3c,0xe7,0xe8,0x40,0x3c,0x68,0xe8,0x7a,0x3b,0x22,0x7e,0x7, 0xde,0x39, +0x65,0x8d,0x66,0x88,0x7c,0x10,0x3e,0xdb,0x7e,0x8f,0xde,0x7f,0x67,0x3, 0x67,0x84, +0xf0,0x0, 0x60,0x81,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x61,0x87,0xf0,0x0, 0x62,0x5, +0xf0,0x0, 0x62,0x82,0xe0,0x1, 0x24,0x1d,0xf8,0x40,0x3a,0x6a,0xe0,0x2, 0x1e,0xc1, +0xe0,0x0, 0x1d,0xb1,0x9e,0xd, 0x9e,0x8b,0xe2,0x0, 0xce,0xb, 0xe8,0x7a,0x3c,0xa4, +0xe2,0x0, 0xce,0x8a,0xf8,0x40,0x3a,0x6a,0xe0,0x0, 0x2, 0xee,0xe0,0x2, 0x1e,0x5d, +0xe0,0x0, 0x14,0x51,0x8e,0x8c,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1, 0xa, 0xe8,0x8, +0x3c,0x34,0xe0,0x0, 0x14,0xe4,0x7f,0x3, 0xf0,0x0, 0x78,0x81,0xf0,0x0, 0x79,0x87, +0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xdb,0x4, 0xf0,0x0, 0x61,0x87,0x67,0x3, 0xf0,0x40, +0x39,0xf8,0xf0,0x0, 0x60,0x81,0xf0,0x0, 0x62,0x82,0xe7,0xfe,0x5, 0x2d,0x65,0x90, +0x17,0x80,0x66,0xf, 0xe1,0x3a,0x3d,0x8f,0xf0,0x40,0x3d,0x7c,0xe7,0xfe,0x5, 0x9e, +0xc2,0x82,0xf0,0x40,0x3d,0xf5,0xc2,0x1, 0xe7,0xfe,0x1, 0xa4,0xf0,0x0, 0x65,0x8b, +0x17,0x81,0xf0,0x0, 0x60,0xc, 0xe8,0xf, 0x3f,0x9b,0xf0,0x40,0x3d,0xef,0xf0,0x0, +0xc0,0x2, 0xf2,0x1, 0xc5,0xff,0xf0,0x0, 0x66,0x89,0xe7,0xfd,0x0, 0xb9,0x67,0x8a, +0xf8,0x0, 0xad,0x8d,0xf0,0x40,0x3d,0xff,0xe7,0xfd,0x4, 0xc3,0xe0,0x0, 0xc0,0x40, +0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe8,0x0, 0x8e,0x8d,0x3f,0xec,0xe2,0x1, 0xc7,0xff, +0x3f,0xfd,0x3d,0xec,0x5, 0x82,0x3d,0xed,0xea,0x4f,0x7e,0x98,0xe9,0xff,0xc6,0xff, +0xe2,0x1, 0xc5,0xff,0xa7,0x8d,0x0, 0x8a,0xe8,0x0, 0x8e,0xd, 0x3e,0x7d,0x1, 0x9, +0xc7,0x81,0x3b,0x7f,0xe7,0xfd,0x1, 0x68,0x8e,0x4, 0x8e,0x8f,0x3e,0xfc,0x1, 0xf5, +0xad,0x8f,0x0, 0xf7,0xe0,0x2, 0x1d,0xdd,0xe0,0x0, 0x14,0x51,0x8e,0x8b,0xe2,0x0, +0xce,0x81,0xe7,0xff,0x1, 0x96,0x15,0x80,0x16,0xbc,0x7d,0x90,0x66,0xf, 0x2e,0x16, +0x16,0x3, 0xe1,0x2c,0x3e,0x23,0x26,0x16,0x65,0x88,0x25,0x94,0x16,0xb4,0x27,0x85, +0x67,0x8d,0x14,0x1e,0xe7,0xff,0x2f,0x85,0x3c,0x6d,0xe7,0xff,0x0, 0x82,0xf8,0x40, +0x39,0x74,0xe8,0x74,0x3d,0x22,0xe7,0xfe,0x0, 0xe3,0x16,0xb2,0x0, 0xf1,0x3e,0xe8, +0x0, 0xe6,0x16,0x4, 0xe1,0x23,0x3e,0x23,0x21,0x85,0x66,0x8, 0x26,0x3, 0x16,0xba, +0x0, 0xe7,0xe2,0x0, 0xc9,0x2, 0x14,0x3c,0xe7,0xfe,0x5, 0xeb,0x0, 0xe1,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x38,0xe0,0x0, 0x1f,0x8e,0xf0,0x0, 0x8c,0xf, 0xf0,0x1, +0x24,0x5c,0xe0,0x0, 0x1e,0xd, 0xe0,0x2, 0x1f,0xfd,0x8b,0xc, 0x8a,0xdf,0x89,0x1c, +0xe0,0xf, 0x3b,0x35,0xe0,0x1, 0x1f,0x72,0x14,0xff,0xa2,0xe, 0x3f,0x92,0xe8,0x9, +0x3c,0x98,0x37,0xa1,0xe2,0x1, 0xc4,0xff,0x3f,0x94,0x34,0xa1,0x94,0xf, 0x39,0xe6, +0x3b,0xe2,0x3c,0x9c,0xe0,0x0, 0x0, 0xc5,0x3e,0x79,0xe0,0x0, 0x1, 0x50,0x8f,0x2c, +0x8f,0xbc,0xe0,0xd, 0x3f,0x35,0x3d,0x6e,0x3e,0x9f,0x36,0xa1,0x3e,0x94,0x96,0x8d, +0xe4,0xb, 0x37,0x28,0x3e,0xf8,0xe0,0x6d,0x3a,0x28,0x3c,0x6d,0x3e,0xe6,0xe2,0x1, +0xc6,0xff,0x3f,0x7d,0x5, 0x82,0x3d,0x66,0x3e,0xe3,0xe4,0xb, 0x35,0xc8,0xe2,0x1, +0xc6,0xff,0x3d,0xfd,0x3b,0x6a,0xe2,0x1, 0xc3,0x7f,0x3, 0x82,0x3f,0x63,0x39,0xee, +0x3f,0x62,0xe2,0x1, 0xc7,0x7f,0x3f,0xfe,0xe2,0x1, 0xc1,0xff,0x3d,0xef,0xe4,0xd, +0x37,0xa8,0x5, 0x82,0x3d,0xe2,0x3f,0x67,0xe4,0xd, 0x36,0xc8,0xe2,0x1, 0xc7,0x7f, +0x3e,0xfe,0x39,0x6b,0xe2,0x1, 0xc1,0x7f,0x3, 0x82,0x3f,0xe7,0xe0,0xe, 0x39,0xa6, +0xe2,0x0, 0xcf,0x7, 0x3b,0xef,0xe2,0x1, 0xc3,0xff,0xc6,0x2, 0x2, 0x7, 0xe0,0xf, +0x3b,0xa2,0xe2,0x0, 0xcf,0x87,0xe7,0xff,0x5, 0x39,0xe0,0x2, 0x1f,0xc1,0xe0,0x3, +0x17,0x74,0xb7,0xf, 0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0x14,0x83,0x34,0x21,0xe0,0x2, +0xd9,0xff,0x3b,0xf2,0x15,0x80,0xe0,0x43,0x3c,0x18,0x3e,0xeb,0x4, 0xa1,0x39,0xf6, +0x4, 0x9a,0x3f,0x66,0xe0,0xf, 0x3f,0x35,0x16,0x1, 0x3f,0x92,0x37,0xa1,0x3f,0x94, +0x97,0x8f,0x3e,0x1d,0x3f,0xf8,0xc7,0x1, 0x3f,0xec,0xe2,0x1, 0xc7,0xff,0x16,0x1, +0xe2,0x1, 0xc7,0x7f,0x3e,0x1b,0xe0,0x6d,0x3a,0x2f,0x3f,0x73,0x3d,0xec,0xe2,0x1, +0xc5,0xff,0x5, 0xe9,0xc1,0x1, 0xe2,0x1, 0xc1,0x7f,0x39,0x77,0x5, 0xe1,0xe0,0x2, +0x1f,0xdd,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0x5, 0xa0,0xe0,0x2, 0x1f,0x41,0x9f,0x8e, +0xe2,0x7, 0xcf,0xe7,0x2, 0x83,0xc7,0x81,0xb7,0x8e,0xf7,0xff,0x24,0x45,0xe4,0x0, +0xc6,0x83,0xe0,0xf, 0x35,0xa1,0x3e,0xff,0x5, 0x20,0xe0,0x0, 0x1f,0x31,0xe0,0x2, +0x1e,0xc1,0x9f,0x8e,0x16,0x0, 0xe2,0x3, 0xcf,0xf3,0xb6,0xd, 0xe7,0xff,0x2, 0xb4, +0xc7,0x81,0xb7,0x8e,0xe7,0xff,0x0, 0xb0,0x1, 0x69,0xe0,0x2, 0x1f,0x41,0x9f,0x8e, +0xe2,0x0, 0xcf,0x82,0x5, 0x83,0xc7,0xfe,0xb7,0x8e,0xe0,0x0, 0x1f,0x31,0x9f,0x8e, +0xe2,0x3, 0xcf,0xf3,0x2, 0xdb,0x0, 0xd8,0xe0,0x2, 0x1f,0x41,0x9f,0x8e,0xe2,0x7, +0xcf,0xe7,0x2, 0x83,0xc7,0x82,0xb7,0x8e,0x17,0x0, 0xe0,0x0, 0x1f,0xb1,0xb7,0xf, +0xf8,0x0, 0xc, 0x28,0xb, 0xe1,0xe8,0x40,0x3d,0xe8,0xe8,0x40,0x3e,0xe8,0xe7,0xff, +0x0, 0xb8,0xe0,0x2, 0x1f,0xc1,0x9c,0xf, 0x17,0x8a,0xe1,0x28,0x3c,0x1f,0x38,0x82, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x7c,0xe0,0x2, 0x1b,0xc3,0x17,0x80,0xe0,0x7, +0xaf,0xc7,0xe0,0x2, 0x1f,0xdd,0xe0,0x0, 0x1a,0xe, 0x8b,0xf, 0xdf,0x2, 0x8f,0x84, +0xe2,0x0, 0xcf,0x81,0xe0,0x2, 0x5, 0xf4,0x14,0x3, 0xdd,0xf, 0xeb,0xe6,0x7f,0x90, +0x7f,0x81,0xe0,0x2, 0x23,0x2b,0xe2,0x0, 0xcb,0x1, 0x5, 0x86,0x8f,0x8f,0xe2,0x0, +0xcf,0x86,0xe0,0x2, 0x2, 0xa3,0xf0,0x0, 0x88,0x84,0xe0,0x0, 0x1a,0x8d,0xe8,0x40, +0x3b,0x71,0xe0,0x2, 0x1, 0x70,0xe0,0x7, 0x8f,0xd7,0xfa,0x13,0x7c,0x11,0xf0,0xf, +0x38,0xaf,0xc7,0x81,0x3b,0x7f,0xe0,0x3, 0x1, 0x1a,0xe0,0x2, 0x1f,0xbb,0x8f,0x8f, +0xe8,0x0, 0x8f,0x8, 0xf0,0xf, 0x38,0xaf,0xc7,0x81,0x3f,0x7f,0x14,0x3, 0xe0,0x2, +0x1, 0x76,0xf0,0x3, 0x20,0x84,0x16,0x7f,0xe8,0xc, 0x3e,0x11,0xf0,0x3, 0x1c,0x85, +0xe2,0x1, 0xc6,0x7f,0xe0,0x0, 0xc6,0x1, 0xe8,0xc, 0x3e,0x19,0xf8,0x40,0x3b,0xe9, +0xf0,0x0, 0x13,0x0, 0xe9,0x80,0x8f,0x17,0xe8,0x40,0x3f,0xe6,0xe2,0x1, 0xc7,0xff, +0x3f,0x7f,0x3e,0xee,0x3, 0x83,0xe8,0x40,0x3e,0xe6,0xe8,0x40,0x3e,0x77,0xf0,0x40, +0x3b,0x6d,0xf2,0x1, 0xc3,0x7f,0x1, 0xef,0xf8,0x40,0x38,0xe6,0xf0,0x2, 0x23,0x5f, +0xe0,0x1, 0x1f,0xf2,0xfb,0xe6,0x7e,0x12,0xfb,0xe6,0x7d,0x91,0xf0,0x0, 0xa2,0xf, +0xe0,0x2, 0x1f,0xfd,0xf8,0x0, 0x89,0xc, 0xf8,0x0, 0x88,0xb, 0xf0,0x0, 0x10,0x80, +0xf0,0x0, 0x8a,0xdf,0xe8,0x40,0x3b,0x62,0xe8,0x40,0x38,0xe0,0x16,0x1, 0xf0,0x1, +0x11,0xff,0xf8,0x40,0x3d,0x61,0x3d,0x62,0xe0,0x0, 0x1f,0xd, 0xe8,0x40,0x3f,0xe9, +0xf8,0x40,0x3e,0xea,0x15,0x80,0x0, 0x85,0xf0,0x40,0x3b,0xff,0xc7,0x2, 0x1, 0x2b, +0xe1,0x80,0x8e,0x9f,0x3e,0xfc,0x1, 0xf9,0x8c,0x8e,0xc5,0x81,0xe2,0x1, 0xc5,0xff, +0xe2,0x0, 0xcd,0x81,0x8c,0x1e,0xe8,0xd, 0x3c,0xb5,0xe0,0x6a,0x39,0x28,0x3e,0x98, +0xe0,0x63,0x39,0x29,0xf2,0x0, 0xcb,0x1, 0x36,0xa1,0xe8,0xd, 0x3e,0x94,0xe0,0x1, +0x1, 0x25,0x96,0x8d,0xc7,0x2, 0xe8,0x40,0x3e,0xfd,0xe0,0x6a,0x3a,0x28,0xe8,0x40, +0x3e,0xfd,0xe0,0x63,0x3a,0x29,0xe8,0x40,0x3e,0xfd,0xe0,0x7d,0x3a,0x2d,0xf0,0x40, +0x3b,0xff,0x1, 0xd7,0x25,0x8a,0xf0,0xf, 0x30,0xa1,0x3f,0x97,0xf0,0x0, 0xc0,0x81, +0xa9,0x8f,0xf2,0x1, 0xc0,0xff,0xad,0x1f,0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0xe8,0x40, +0x3e,0x76,0xe7,0xff,0x5, 0xbb,0xf2,0x0, 0xc8,0x81,0xf0,0xa, 0x30,0xa1,0xe0,0x1, +0x1, 0x6b,0x17,0xff,0xe8,0x0, 0xaf,0x8c,0xe8,0x0, 0xaf,0x8b,0xe0,0x2, 0x1c,0xc3, +0xe0,0x0, 0x1c,0xd, 0xf0,0x7, 0xa8,0xc7,0xf0,0x0, 0xa8,0x84,0xe0,0x2, 0xd9,0xa, +0x88,0x84,0xe8,0x0, 0xa8,0x88,0xe0,0x1, 0x20,0xdf,0x12,0x0, 0xc2,0x1, 0xe2,0x1, +0xc2,0x7f,0x38,0xf4,0xe0,0x0, 0x1b,0xd, 0xe0,0x0, 0x15,0xe4,0xe0,0x0, 0x1, 0x4a, +0x8c,0x86,0x8d,0x16,0x3b,0xe9,0x39,0xea,0xe0,0x40,0x3e,0x64,0xe0,0xf, 0x36,0x21, +0xe0,0xe, 0x3a,0x9f,0x8e,0x8e,0x8f,0x1e,0xe0,0x8, 0x3b,0xad,0xe2,0x0, 0xcc,0x0, +0xe0,0xf, 0x3c,0xad,0x3e,0xa9,0xe0,0x8, 0x39,0xae,0xe2,0x1, 0xc6,0xff,0xe2,0x1, +0xc7,0xff,0xe0,0x6f,0x3d,0x2d,0xe2,0x0, 0xcc,0x0, 0xe0,0xd, 0x3d,0x2e,0x3f,0x2a, +0xe2,0x1, 0xc7,0x7f,0xe2,0x1, 0xc6,0xff,0xe0,0x6d,0x3d,0x2e,0x3c,0x6d,0x39,0x6f, +0xe2,0x1, 0xc1,0x7f,0xe2,0x1, 0xc4,0x7f,0x39,0x78,0x3f,0x6d,0xc6,0x1, 0x3e,0xeb, +0xe2,0x1, 0xc6,0xff,0xe2,0x1, 0xc6,0x7f,0x3, 0x82,0x3f,0xee,0x3f,0x6f,0xe2,0x1, +0xc7,0x7f,0x3f,0x7d,0x5, 0x82,0x3f,0xeb,0x38,0xfc,0x3d,0xef,0xe2,0x1, 0xc5,0xff, +0x1, 0xc6,0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0x38,0xf4,0xc3,0x2, 0xe7,0xff,0x1, 0xba, +0xe2,0x0, 0xcd,0xe4,0x17,0x80,0xe0,0x6f,0x39,0xab,0x3d,0xef,0x67,0x1, 0xad,0x8e, +0xc0,0x4, 0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xfa,0x13,0x7c,0x11,0xf0,0x0, 0x88,0x84, +0xe0,0x0, 0x1a,0x8d,0xe7,0xfd,0x0, 0xf7,0xf2,0x1, 0xc9,0x7f,0xe7,0xfe,0x1, 0x5b, +0xe0,0xd, 0x3c,0xa6,0xe0,0x43,0x3e,0x9d,0xe2,0x0, 0xce,0x80,0xf0,0x2, 0x39,0x29, +0xe8,0xd, 0x3c,0xa2,0xe2,0x1, 0xc1,0x7f,0xe0,0x1e,0x3c,0x21,0xe2,0x1, 0xc6,0xff, +0xe0,0x6d,0x3d,0x22,0xf8,0x43,0x3f,0x1e,0x39,0x6d,0xf2,0x0, 0xcf,0x0, 0xe8,0xd, +0x3c,0x20,0xf0,0x1e,0x38,0x28,0xe2,0x1, 0xc6,0xff,0xf2,0x1, 0xc7,0x7f,0xe8,0x6d, +0x3d,0x2e,0x3e,0x92,0xe2,0x1, 0xc6,0xff,0xe8,0x40,0x3e,0xf3,0xe8,0x40,0x39,0x63, +0xe0,0x62,0x3c,0xad,0xe8,0x40,0x3e,0xf3,0xe0,0x6a,0x3c,0xa8,0xe8,0x40,0x3e,0xf3, +0xf0,0x40,0x39,0xe2,0xe0,0x63,0x3c,0xa9,0xe7,0xfe,0x0, 0x88,0xeb,0xe6,0x7d,0x90, +0xea,0x13,0x7e,0x11,0xeb,0xe6,0x7e,0x92,0xeb,0xe6,0x7f,0x11,0x15,0x7f,0xe0,0x0, +0x14,0xe4,0xac,0x8b,0xaf,0x8c,0xad,0xd, 0xad,0xe, 0xc0,0x4, 0xf8,0x0, 0xf, 0x28, +0xb, 0xe1,0xe0,0x0, 0x1f,0x85,0x8f,0x8f,0x27,0x96,0xe0,0x10,0x8f,0x25,0xe2,0x0, +0xcf,0x10,0x2, 0xae,0xc7,0xff,0xe2,0x1, 0xc7,0xff,0xe4,0x0, 0xc7,0x8a,0x3f,0x65, +0x3f,0x95,0x0, 0x86,0xe0,0x10,0x8e,0xae,0xe2,0x0, 0xce,0x90,0x2, 0xa1,0x3f,0x7f, +0xc7,0xa, 0x1, 0xf9,0xfa,0x13,0x7c,0x11,0x14,0x1, 0xdb,0x6f,0xf0,0x0, 0x88,0x84, +0xe7,0xfd,0x0, 0x89,0x87,0x7, 0x87,0x97,0xe8,0x0, 0xaf,0xc, 0xe8,0x0, 0xaf,0x8b, +0xe7,0xfe,0x0, 0x96,0x3d,0xe1,0xe7,0xfe,0x0, 0xfb,0xfb,0xe6,0x7e,0x12,0xfb,0xe6, +0x7d,0x91,0xe8,0x40,0x3d,0x61,0xe7,0xfe,0x0, 0x86,0x14,0x1, 0x0, 0xe7,0xfa,0x13, +0x7c,0x11,0x14,0x3, 0x0, 0xe3,0x0, 0x0, 0xe0,0x1, 0x1f,0x8e,0x8f,0x8f,0xe0,0x1, +0x27,0x82,0x8, 0xb4,0xf7,0xff,0x11,0x7f,0xf0,0x12,0x39,0x1f,0xf0,0x0, 0x12,0x1, +0xf2,0x1, 0xc1,0x7f,0xf0,0x14,0x3a,0x19,0xf0,0x0, 0x10,0xa, 0xe0,0x2, 0x1a,0x5e, +0xf4,0x0, 0xc1,0xa, 0xf2,0x1, 0xc2,0x7f,0x11,0xa, 0xf0,0x10,0x38,0x39,0xe8,0x2, +0x39,0x34,0x10,0xff,0xf0,0x1, 0xc1,0x52,0xf0,0x10,0x38,0x14,0x38,0x9a,0xf0,0x2, +0x19,0xd9,0xf0,0x12,0x39,0x14,0x39,0x14,0xe0,0x1, 0x11,0xff,0xf0,0x0, 0xc0,0x4, +0x38,0xa9,0x3c,0xfa,0x3, 0xa4,0xe8,0x0, 0x8e,0x43,0xe8,0x0, 0x8f,0x80,0xf8,0x40, +0x38,0xe3,0xe0,0x2f,0x3f,0x8c,0xf0,0x40,0x3b,0xe9,0xe1,0x35,0x3e,0x3, 0x27,0x83, +0xf0,0x0, 0x2a,0x9c,0xf0,0x40,0x3b,0x61,0xf2,0x1, 0xc3,0x7f,0x3e,0xe2,0x17,0x0, +0x0, 0x89,0x8f,0xcd,0xc7,0x1, 0xe0,0x2f,0x3f,0x8c,0xe8,0xf, 0x3f,0xd5,0xc6,0x8a, +0x2f,0x8c,0xe8,0x40,0x3f,0x76,0xe8,0x17,0x3f,0x14,0x1, 0xf4,0xf0,0x0, 0xc1,0x8a, +0xf8,0x40,0x39,0xf2,0x1, 0xd7,0xa, 0x61,0x17,0x8a,0x3f,0xbc,0xf4,0x0, 0xc3,0x8a, +0x3f,0x94,0xe0,0x2, 0xc7,0xac,0x8f,0x8f,0x2f,0x83,0xe8,0x11,0x3a,0x17,0x17,0xa, +0x3f,0x38,0xe8,0x0, 0x8f,0xc1,0x3f,0x1b,0xaf,0xce,0xe8,0xf, 0x3a,0x17,0xe8,0x0, +0x9e,0x91,0xe8,0x0, 0x9e,0x1, 0xb6,0x9e,0xf0,0x0, 0xc1,0x8a,0xb6,0xe, 0xf8,0x40, +0x39,0xf2,0x8e,0xdf,0xc4,0x1, 0xae,0xde,0xe2,0x1, 0xc4,0x7f,0x8e,0xef,0xae,0xee, +0x8e,0xff,0xae,0xfe,0xe0,0x1, 0x8f,0x8f,0xe0,0x1, 0xaf,0x8e,0xe7,0xff,0x1, 0xab, +0x0, 0xd3,0x38,0x82,0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1f,0x52,0x8f,0x8f,0x8f,0xe, +0x2f,0x9a,0x2f,0x19,0xe0,0x0, 0x1f,0xe, 0x8e,0x8e,0xe0,0x0, 0x1f,0x13,0x8f,0xe, +0x3e,0xfe,0x5, 0x90,0xe0,0x2, 0x1f,0x51,0xe0,0x2, 0x1e,0xd0,0x8e,0xe, 0xe0,0x2, +0x1f,0x5f,0xae,0xd, 0x8e,0xe, 0x3e,0x7f,0x2, 0xa2,0xea,0x22,0x7f,0xba,0x17,0x0, +0xaf,0xf, 0x38,0x82,0xe0,0x0, 0x1e,0x8e,0xe0,0x0, 0x1d,0x8d,0x8e,0xd, 0xe0,0x0, +0x1e,0x93,0x8e,0x8d,0x3e,0xfc,0xe0,0x2, 0x1e,0xd0,0x3, 0x86,0x15,0x1, 0xe2,0x0, +0xce,0x1, 0xad,0xd, 0x1, 0x1a,0xe0,0x2, 0x1e,0x51,0x8e,0xc, 0x3e,0x7e,0x3, 0xe0, +0xaf,0xd, 0xe0,0x2, 0x1f,0x5f,0x8e,0xe, 0x3e,0x7f,0x5, 0xe0,0xea,0x22,0x7e,0x3a, +0x8d,0x8c,0x8e,0x8d,0x3e,0xfb,0x5, 0xde,0xaf,0x8e,0xc5,0x81,0xe0,0x0, 0x1f,0xbe, +0xad,0x8c,0x17,0x1, 0xaf,0xf, 0x38,0x82,0x8d,0xb, 0xe2,0x0, 0xcd,0x1, 0x5, 0x87, +0xe0,0x2, 0x1e,0x7d,0x8e,0x4c,0xc6,0x7e,0x3e,0x7a,0x2, 0x5e,0x8d,0x9b,0xe2,0x0, +0xcd,0x81,0x5, 0x87,0xe0,0x2, 0x1e,0x7d,0x8e,0x5c,0xc6,0x7e,0x3e,0x7b,0x2, 0x54, +0x16,0x0, 0xae,0xd, 0x0, 0xd1,0xe0,0x2, 0x1f,0xdd,0xe0,0x2, 0x1e,0x5f,0x8d,0x8f, +0x8f,0xc, 0xe0,0x0, 0x1e,0xbe,0x17,0x80,0x3f,0x7b,0xaf,0x8d,0x3, 0x9e,0xe0,0x2, +0x1f,0xd2,0xe0,0x2, 0x1f,0x51,0x8f,0x8f,0x8f,0xe, 0xe0,0x2, 0x1d,0x50,0x3f,0xfe, +0x5, 0x9b,0xaf,0x8a,0x2f,0x84,0x17,0x81,0xaf,0x8a,0x17,0x81,0xea,0x22,0x7f,0x3b, +0x8d,0xe, 0x3d,0x7f,0x3, 0x94,0xad,0x8c,0x17,0x81,0xe0,0x2, 0x1e,0x4f,0xc5,0x1, +0xaf,0x8c,0xad,0xe, 0xaf,0x8d,0x38,0x82,0xea,0x22,0x7f,0x3b,0xaf,0x8e,0xe0,0x2, +0x1f,0x4f,0xaf,0x8e,0x38,0x82,0x3f,0xee,0xaf,0xa, 0x0, 0xe5,0x17,0x80,0xaf,0x8e, +0x38,0x82,0xe0,0x3, 0x1f,0x17,0x8f,0x8e,0xe2,0x1, 0xcf,0xf9,0x2, 0x83,0xc7,0x81, +0xaf,0x8e,0x38,0x82,0xe0,0x3, 0x1c,0x3d,0xe0,0x4, 0x15,0x6a,0x14,0x80,0xe0,0x4e, +0x0, 0xa3,0x0, 0x0, 0xe0,0x3, 0x1c,0xbd,0xe0,0x2, 0x1f,0x5f,0x8d,0x9, 0x8c,0xe, +0xe0,0xf, 0x3c,0x9a,0x17,0x0, 0xaf,0x2f,0x24,0x1b,0x15,0xff,0x3d,0x98,0xe2,0x1, +0xc5,0xff,0xc5,0x81,0x17,0x28,0x3f,0x3a,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1f,0xde, +0x3f,0x19,0x3d,0x9f,0x96,0xf, 0x96,0x9f,0xc7,0x8a,0xe0,0x1, 0xb6,0x1e,0x3f,0xfb, +0xc7,0x4, 0xe0,0x1, 0xb6,0x8e,0x1, 0xf7,0xe0,0xf, 0x3c,0x9a,0xac,0x2f,0xc5,0x1, +0xe2,0x1, 0xc5,0x7f,0xe2,0x0, 0xcd,0xf, 0x1, 0x18,0xad,0x9, 0xe0,0x0, 0x16,0x0, +0xe0,0x3, 0x1f,0x3c,0xe0,0x3, 0x1d,0x3b,0xe1,0x80,0x8e,0x9e,0x3f,0xec,0xe2,0x1, +0xc7,0xff,0x3e,0xff,0x3d,0xed,0x3, 0x82,0x3d,0xec,0x3f,0x7a,0x3e,0x6b,0xe2,0x1, +0xc6,0x7f,0x1, 0xf3,0xae,0x19,0x38,0x82,0x17,0x80,0xaf,0x89,0x0, 0xe8,0xf0,0x3, +0x1b,0x3c,0xf0,0x3, 0x1a,0x3a,0xf0,0x3, 0x19,0x3b,0xf0,0x3, 0x19,0xbd,0xf0,0x0, +0x12,0x80,0xf0,0x0, 0x13,0xcf,0xe9,0x80,0x8f,0x96,0x27,0xb5,0x15,0x7f,0x3d,0x1f, +0xe2,0x1, 0xc5,0x7f,0xe8,0xa, 0x3d,0x15,0x35,0x22,0xc5,0x16,0xe8,0xa, 0x3d,0x13, +0xe8,0x40,0x3d,0xe4,0x0, 0x83,0x3d,0x7b,0x1, 0x26,0x9e,0xb, 0x9e,0x9b,0xe0,0xf, +0x3c,0x2c,0xe3,0xff,0xc7,0xff,0xf0,0x43,0x38,0x9f,0xe0,0xe, 0x3c,0xad,0xf2,0x0, +0xc8,0x80,0xe3,0xff,0xc7,0x7f,0x3e,0x28,0xf0,0x43,0x38,0x9e,0xe3,0xff,0xc6,0x7f, +0xe0,0x6f,0x3d,0x2c,0x3e,0xa9,0xf2,0x0, 0xc8,0x80,0xe3,0xff,0xc6,0xff,0xe0,0x6e, +0x3d,0x2d,0xf1,0x2f,0x3b,0xaf,0xc5,0x84,0xf1,0x2e,0x3b,0xae,0x27,0xdd,0x27,0x5c, +0x14,0x1, 0x38,0x82,0xf8,0x40,0x3b,0x72,0xf0,0x0, 0xc2,0x28,0xf0,0x0, 0xc2,0x8a, +0x1, 0xc3,0x14,0x0, 0x38,0x82,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfd, +0xc0,0x60,0xe0,0x2, 0x1e,0xdf,0xea,0x22,0x7f,0xb8,0xf0,0x0, 0x8d,0xd, 0x7f,0x8b, +0xf0,0x0, 0x25,0xf, 0x97,0x8f,0xc7,0x81,0xe3,0xff,0xc7,0xff,0xe2,0x0, 0xcf,0xe4, +0xe0,0x3, 0x5, 0xc1,0x66,0x8b,0xe0,0x0, 0x17,0xe4,0xb7,0x8d,0x0, 0x83,0xf0,0x0, +0xb5,0xf, 0xe0,0x2, 0x1f,0xc0,0xe0,0x4, 0x8f,0xdf,0xe2,0x0, 0xcf,0x81,0xea,0x22, +0x7f,0xb6,0x7f,0x8a,0xe0,0x8, 0x1, 0xc, 0x8f,0x8f,0xe0,0x3, 0x2f,0xa7,0xe0,0x2, +0x1f,0xcf,0x8f,0x8f,0x7f,0x87,0xe0,0x3, 0x2f,0x9c,0xe0,0x0, 0x1f,0xaa,0xe0,0x2, +0x1e,0xe2,0x9e,0xf, 0x9f,0xd, 0x9e,0xf, 0x9d,0x8f,0xe0,0xe, 0x3e,0x2e,0xe2,0x1, +0xc7,0x7f,0xe0,0x1, 0x1f,0xe8,0x7f,0x5, 0x8e,0xf, 0x67,0x5, 0xe2,0x0, 0xce,0x2, +0xc7,0x2, 0x66,0x5, 0xe2,0x1, 0xc7,0x7f,0xb5,0x8d,0x17,0x80,0xe0,0x2, 0x1e,0xc9, +0xe0,0x6c,0x39,0x2e,0x17,0x0, 0x7e,0x5, 0xaf,0xd, 0x7f,0xa6,0x7f,0xa7,0x7f,0xa8, +0x7f,0xa9,0x7f,0xaa,0x7f,0xab,0x7f,0xac,0x7f,0xad,0x7f,0xae,0x7f,0xaf,0xf0,0x2, +0x2d,0x7e,0xe0,0x1, 0x1f,0x8e,0x89,0xf, 0x7f,0x91,0xe0,0xb, 0x21,0x66,0x11,0xff, +0xea,0x21,0x7f,0x14,0x39,0x92,0xf0,0x40,0x3c,0xee,0xea,0x22,0x7f,0xac,0xe2,0x1, +0xc1,0xff,0xea,0x22,0x7e,0xa0,0xea,0x22,0x7d,0xc, 0xea,0x21,0x7d,0xf8,0xea,0x21, +0x7e,0x8, 0xc1,0x81,0xe8,0x40,0x3f,0x69,0x39,0x9f,0x14,0x80,0x14,0x0, 0x12,0xff, +0xe0,0x0, 0x12,0x1, 0xe1,0x80,0xac,0x9f,0xc7,0xa, 0x3f,0xf3,0xe0,0x40,0xaa,0xee, +0xe1,0x80,0xac,0x9d,0xe1,0x80,0xb4,0x1a,0xe1,0x80,0xb4,0x1b,0xe1,0x80,0xaa,0x1c, +0x1, 0xf2,0xe0,0x0, 0x1f,0x51,0x7f,0x17,0xac,0x8e,0xf0,0xb, 0x25,0x3c,0x67,0x85, +0x66,0x85,0x37,0xa3,0xc7,0x94,0x7f,0x98,0xea,0x22,0x7f,0xa0,0x3b,0x6f,0xea,0x22, +0x7f,0x8c,0x7f,0x89,0xea,0x22,0x7f,0xac,0xe4,0x0, 0xc6,0x9e,0xf0,0x0, 0x63,0x7, +0x7f,0x8d,0xea,0x21,0x7f,0x88,0xf0,0x2, 0x1c,0x5e,0x7e,0x99,0x7f,0x93,0xe8,0x40, +0x3a,0x66,0xf8,0x40,0x3f,0x69,0x17,0x8a,0x3f,0xb4,0xf0,0xe, 0x3c,0x1f,0x81,0xce, +0xe2,0x0, 0xc1,0x8f,0x39,0xf2,0x3, 0xbd,0xf0,0x0, 0x14,0x8a,0xf0,0x19,0x3c,0xb3, +0xf8,0xb, 0x3c,0x19,0xe0,0x2, 0xc5,0xac,0x8c,0xb, 0xe2,0x0, 0xcc,0x1, 0xe0,0x4, +0x1, 0x28,0x64,0x89,0xe0,0x5, 0x31,0xa1,0x3c,0x95,0x95,0x89,0xc5,0x81,0xb5,0x89, +0x2c,0x10,0xea,0x20,0x7d,0xe0,0xea,0x21,0x7d,0x78,0xe0,0x9, 0x31,0xa2,0xf0,0x0, +0x93,0xe, 0x93,0x9e,0x3d,0x99,0x3d,0x15,0xf0,0x0, 0xb3,0xb, 0xb3,0x9b,0xb4,0xa, +0x21,0x18,0xe8,0x0, 0x8a,0xce,0xe8,0x40,0x3d,0xee,0x39,0xf5,0x17,0x1, 0x1, 0x89, +0xe0,0xa, 0x0, 0xda,0xe0,0x1, 0x8e,0xeb,0xc5,0x8a,0x39,0xfd,0xe0,0x2, 0x1, 0x31, +0x3e,0xee,0xe2,0x1, 0xc6,0xff,0x3e,0xf2,0x3d,0x6e,0x17,0x1, 0x3f,0x1a,0x4, 0xf3, +0xc2,0x1, 0xe2,0x1, 0xc2,0x7f,0xf0,0x40,0x3d,0x74,0xe7,0xff,0x2, 0xb6,0x12,0x8a, +0x3a,0xb2,0xe0,0x1, 0x14,0x40,0xe0,0x2, 0x1c,0xde,0x3d,0x65,0x3c,0x10,0xf8,0x40, +0x3c,0xee,0xe0,0x2, 0xd5,0x4f,0xf0,0xb, 0x25,0x77,0xe0,0x2, 0x1f,0xfd,0x12,0x7f, +0xe8,0x4, 0x3a,0x1a,0x8b,0xcf,0x8b,0x5f,0xe2,0x1, 0xc2,0x7f,0xc2,0x1, 0x33,0xa6, +0x33,0x26,0xe4,0x0, 0xc2,0xa, 0xea,0x22,0x7e,0xa0,0xc3,0xe0,0xc3,0x60,0x39,0xed, +0xea,0x16,0x7c,0x4c,0xe0,0x2, 0x1c,0xde,0xe0,0x43,0x3b,0x97,0xe0,0x43,0x3b,0x16, +0xe8,0x4, 0x3a,0x18,0xf0,0x0, 0x13,0xa0,0x8d,0x49,0xe0,0xf, 0x39,0x9a,0x8d,0x8f, +0xe0,0x0, 0x25,0xc6,0xe0,0x0, 0x21,0x44,0xe8,0x40,0x3f,0x69,0x3e,0xe8,0x17,0x80, +0x0, 0x8d,0xe2,0x0, 0xcd,0x82,0xe0,0x1, 0x1, 0x37,0xc7,0x81,0x3e,0x6f,0xe2,0x1, +0xc6,0x7f,0x3e,0x72,0xc7,0xa, 0xc6,0x8a,0x3, 0xb2,0xe2,0x0, 0xcd,0x81,0x1, 0xf2, +0x8e,0x4e,0x3e,0x7a,0x1, 0xf3,0xe4,0x0, 0xc7,0x8a,0x35,0x22,0xe2,0x1, 0x7e,0x98, +0x3e,0x9a,0xf0,0xe, 0x3c,0x9f,0x96,0xd, 0x97,0xe, 0xe8,0x40,0x3e,0xe7,0x3f,0x1c, +0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x1f,0x5, 0x5, 0x3b,0xfe,0x3e,0xee,0xe0,0x6d, +0x3d,0x27,0xe2,0x1, 0x7f,0x18,0xe8,0xf, 0x3f,0x99,0x3d,0x1e,0x97,0x1a,0x97,0x9f, +0xb6,0x89,0x3f,0x9e,0xe0,0x43,0x3f,0x9f,0xe2,0x0, 0xcf,0x9f,0xe8,0x40,0x3f,0x67, +0x5, 0x5, 0x3b,0x7f,0x3f,0x6f,0xe0,0x6e,0x3d,0x26,0xb7,0x19,0xc4,0x8a,0x3a,0x79, +0xe7,0xff,0x1, 0xb4,0xe8,0x40,0x3c,0xe9,0x3d,0x65,0xe0,0x2, 0xd4,0xdb,0xe0,0x1, +0x14,0xc0,0x3d,0x65,0x3c,0x90,0xe8,0x40,0x3c,0x69,0xe0,0x2, 0xd4,0xd3,0xe0,0x0, +0x21,0x40,0x12,0x7f,0x3a,0x12,0xe2,0x1, 0xc2,0x7f,0xc2,0x1, 0xe4,0x0, 0xc2,0xa, +0xe0,0x2, 0x1a,0xde,0xe8,0x40,0x3e,0xe9,0xe8,0x4, 0x3a,0x19,0xf7,0xff,0x13,0xfd, +0x13,0x80,0x13,0x0, 0xf7,0xff,0x13,0x7f,0x8f,0x4d,0x17,0x8a,0x3f,0xbe,0x3f,0x72, +0x3f,0x95,0xe0,0x2, 0xc7,0xac,0x3, 0xa1,0x87,0x8f,0xea,0x22,0x7c,0x2c,0xe8,0xf, +0x3f,0xd7,0xe2,0x1, 0xc7,0xfd,0xea,0x22,0x7c,0xa0,0xea,0x22,0x7d,0xc, 0xea,0x21, +0x7d,0xf8,0xea,0x21,0x7e,0x8, 0xe2,0x0, 0xcf,0x81,0xe0,0x3, 0x37,0x21,0x3c,0x1e, +0x3c,0x9e,0x3d,0x13,0x3d,0x93,0x3f,0x1c,0x1, 0x88,0xf0,0x0, 0xab,0x4d,0xab,0x88, +0xab,0x89,0xb3,0xa, 0xb3,0xb, 0xaf,0x8e,0xc6,0x8a,0x3e,0xf4,0x1, 0xd6,0xe0,0x2, +0x1f,0xdf,0x17,0x0, 0xf0,0x0, 0xad,0xf, 0xe0,0x3, 0x1f,0x97,0xaf,0xf, 0xe0,0x2, +0xc0,0x20,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x66,0x8a,0xc7,0xff,0xaf,0x8d,0xe7,0xfc, +0x0, 0xd8,0x67,0xb, 0xb7,0x8e,0xe7,0xfc,0x0, 0xc6,0xe0,0x2, 0x1f,0x5d,0x8f,0xe, +0xe0,0x6, 0x2f,0x44,0xe0,0x1, 0x1f,0xe, 0x89,0xe, 0x7f,0x11,0xe7,0xfd,0x29,0x1, +0xe0,0x0, 0x1e,0xd1,0xea,0x21,0x7f,0x14,0xf0,0x40,0x3c,0xee,0x7e,0x97,0xa9,0xd, +0xe7,0xfd,0x0, 0xa7,0x8e,0x4d,0x3e,0x7a,0xe7,0xfe,0x1, 0xc9,0xe4,0x0, 0xc7,0x8a, +0x35,0x22,0xe2,0x1, 0x7e,0x98,0x3e,0x9a,0xe0,0xe, 0x3c,0x1f,0x96,0xd, 0x97,0xe, +0xe8,0x40,0x3e,0xe7,0x3f,0x1c,0xe0,0x43,0x3f,0x1e,0xe2,0x0, 0xcf,0x1f,0xe0,0x5, +0x2, 0x46,0xe2,0x1, 0x7f,0x18,0x3f,0x98,0x3d,0x1e,0x97,0x1a,0x97,0x9f,0xb6,0x89, +0x3f,0x9e,0xe0,0x43,0x3f,0x9f,0xe2,0x0, 0xcf,0x9f,0xe8,0x40,0x3f,0x67,0xe7,0xfe, +0x5, 0x5e,0x3f,0xf6,0x3f,0x66,0xe0,0x6e,0x3d,0x2f,0xe7,0xfe,0x0, 0xd8,0x3a,0xe3, +0xf0,0x0, 0x15,0x8a,0xf0,0x1b,0x3d,0xba,0xe8,0x1d,0x3f,0x98,0xf8,0xe, 0x3f,0x1b, +0xe0,0x0, 0x11,0x78,0x9d,0x9e,0x9d,0xe, 0xe8,0x0, 0x9c,0x9d,0xe8,0x0, 0x9c,0xd, +0x39,0x35,0xea,0x17,0x7f,0x30,0xe0,0x1c,0x39,0x1e,0x7f,0x81,0xef,0xfc,0xdf,0x8, +0xe0,0xe, 0x32,0xa2,0xea,0x20,0x7d,0xe0,0x3d,0x6e,0x3d,0x1b,0x9d,0x9a,0x3b,0xe8, +0x9d,0xa, 0xe8,0x0, 0x9c,0x9d,0xe8,0x0, 0x9c,0xd, 0x7f,0x10,0xef,0xfc,0xde,0xf8, +0xea,0x21,0x7d,0xf8,0xe0,0x16,0x32,0xa1,0xe8,0xb, 0x3d,0x96,0x91,0xb, 0x7c,0x14, +0x39,0x17,0xe3,0xff,0xc1,0x7f,0xe2,0x1f,0xc9,0x20,0x67,0x81,0xe0,0x3, 0x2, 0xd9, +0xb1,0xb, 0xf8,0xa, 0x3f,0x1b,0x65,0x8d,0xe8,0x0, 0x9e,0x9d,0xf8,0x0, 0x9d,0x8d, +0x94,0xa, 0x95,0x1a,0x3d,0x95,0xf8,0x0, 0x8e,0xed,0x8c,0x8b,0xf0,0x8, 0x3d,0xa8, +0x65,0x89,0xe0,0xa, 0x3e,0xaa,0xe0,0x43,0x3c,0x18,0xe0,0x43,0x3d,0x1a,0xe8,0xb, +0x3d,0x96,0xf0,0x0, 0x7e,0x8e,0x7e,0x86,0x7c,0x15,0x7d,0x16,0xf0,0x0, 0x9e,0x8b, +0xe0,0x1, 0x24,0x9d,0x15,0x98,0x3d,0xb9,0xf7,0xff,0x12,0xe8,0xe8,0xb, 0x3d,0x9c, +0xf0,0x15,0x3a,0x9b,0xe0,0x0, 0x15,0x68,0xf8,0x15,0x8, 0x5, 0x3d,0x10,0xe2,0x0, +0xcc,0x81,0xf8,0xa, 0x8, 0x15,0xf0,0x0, 0x9b,0x5a,0xe0,0x8, 0x5, 0xf9,0xf7,0xff, +0x12,0xd0,0xf0,0x15,0x3a,0x9b,0xf8,0x15,0x8, 0x5, 0xe0,0x1, 0x15,0x80,0x3d,0x90, +0xf8,0xb, 0x8, 0x15,0xf8,0x40,0x3a,0xec,0x65,0x7, 0x14,0x0, 0xc5,0x1, 0xe8,0x0, +0x97,0x55,0xe2,0x1, 0xc5,0x7f,0x3c,0xfa,0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0xf0,0x0, +0xc2,0x98,0x2, 0xf5,0x7f,0x81,0xf0,0x0, 0x7b,0x4, 0xe0,0x2, 0xd3,0x49,0x65,0x93, +0xe3,0xff,0xc4,0x7f,0x3d,0x95,0x8d,0x8b,0x7c,0xf, 0x67,0x81,0xf0,0x0, 0x63,0x4, +0xe0,0x0, 0x2d,0xf1,0x67,0x18,0xe8,0x40,0x3d,0xe6,0xf0,0x40,0x3b,0x7e,0x5, 0x5, +0x66,0x98,0x3e,0xf7,0xe0,0x4, 0x4, 0x79,0xe0,0x0, 0x4d,0x68,0x5c,0xb9,0xe4,0x0, +0xc5,0x5, 0x16,0x80,0x3c,0xfa,0x7e,0x92,0x5, 0xa, 0xe0,0x1, 0x4d,0x0, 0xe0,0x0, +0x5c,0xc5,0xe4,0x0, 0xc5,0x5, 0x3c,0xfa,0xe0,0x4, 0x2, 0x60,0x65,0x19,0x3d,0x1b, +0x3d,0x77,0xe0,0x3, 0x4, 0x38,0xe4,0x0, 0xc5,0x83,0xe0,0x2b,0x3b,0x9b,0xe0,0x4, +0x25,0xe2,0xe0,0x0, 0x15,0xe4,0xe1,0x2b,0x3b,0x9b,0xe0,0x4, 0x25,0xdc,0x66,0x92, +0xe0,0x6, 0x2e,0xdd,0xe0,0x1, 0x17,0x48,0x7f,0xc, 0xe0,0x3, 0x0, 0xa7,0xea,0x21, +0x7f,0x78,0xe0,0x7, 0x31,0xa1,0xea,0x22,0x7d,0x2c,0xea,0x22,0x7d,0x8c,0xea,0x21, +0x7f,0x88,0xc2,0x1, 0x14,0x80,0x3f,0x17,0xe2,0x1, 0xc2,0x7f,0x12,0x80,0x3d,0x13, +0xe0,0x16,0x3b,0x13,0x3d,0x97,0xf8,0x17,0x3f,0x19,0x3f,0x93,0xb4,0x8e,0xf0,0x40, +0x3d,0x74,0x17,0x7f,0xaa,0x8a,0xe8,0x0, 0xaa,0x86,0xb4,0x8b,0xe8,0x0, 0xaf,0x47, +0xac,0xf, 0xe7,0xfb,0x2, 0xa2,0xe7,0xfb,0x0, 0xec,0x65,0x93,0x7c,0x9a,0x3d,0x95, +0x8d,0x8b,0x7c,0x9b,0x7c,0x9c,0x7c,0x9d,0x7c,0x9e,0x7c,0x9f,0x7c,0xa0,0x7c,0xa1, +0x7c,0xa2,0x7c,0xa3,0x7c,0xa4,0x7c,0xa5,0xe0,0x3, 0x25,0xfb,0xf0,0x40,0x3b,0x69, +0x7c,0x8f,0xe0,0xa, 0x3b,0x15,0x67,0x7, 0x64,0x93,0xc5,0xff,0x3c,0x95,0x7f,0x12, +0xe0,0x0, 0x16,0xf8,0x17,0x1, 0x8d,0xa, 0xad,0x89,0xe0,0x1, 0x15,0xb4,0x7e,0x8c, +0x7f,0x8, 0xe0,0x1, 0x2d,0x51,0xe1,0x2b,0x3b,0x9b,0xe0,0x1, 0x25,0xc5,0x66,0x88, +0xe0,0x1, 0x26,0xc2,0xf0,0x0, 0x62,0x85,0xe0,0xb, 0x3b,0x15,0x14,0x81,0xac,0x8b, +0xf2,0x1, 0xc2,0xff,0xf0,0x40,0x3b,0x6a,0xe0,0x0, 0x15,0xe4,0xe8,0xb, 0x3d,0xb5, +0xe3,0xff,0xc5,0xfc,0xe2,0x5, 0xcd,0x80,0x5, 0x8a,0x66,0x8a,0x8d,0xd, 0xe2,0x0, +0xcd,0x0, 0xe0,0x5, 0x15,0x0, 0xe0,0x6a,0x39,0xab,0x3d,0xea,0x3d,0xf7,0xe0,0x1, +0x3, 0x98,0xf2,0x0, 0xce,0x82,0xe0,0x1, 0x5, 0x94,0xf8,0xb, 0x3c,0x19,0xe0,0x2, +0xc5,0xac,0xe0,0x9, 0x3b,0x15,0x14,0x0, 0x8d,0xb, 0xac,0x9, 0xe0,0x2, 0x2d,0x39, +0x15,0x3, 0xad,0xb, 0x15,0x8a,0x3d,0xb5,0x15,0x3, 0xe8,0xb, 0x3d,0x98,0xe0,0x2, +0xc5,0xad,0xad,0xb, 0xf0,0x0, 0x25,0x3d,0x16,0xff,0xe8,0xd, 0x3e,0x9a,0xf0,0x40, +0x3d,0x6d,0xf2,0x1, 0xc5,0x7f,0x15,0x8a,0xe8,0xb, 0x3d,0xba,0xe8,0xf, 0x3f,0x98, +0xe8,0xb, 0x3d,0x98,0xf0,0x0, 0x91,0xab,0xf0,0x0, 0x92,0x3b,0xf0,0x0, 0x90,0xb, +0xf0,0x0, 0x91,0x1b,0xf0,0x0, 0x90,0xcb,0xf0,0x0, 0x9a,0x8f,0xf0,0x0, 0x9b,0x1f, +0xf0,0x0, 0x8b,0xcf,0x89,0xdf,0x8c,0x6f,0x8c,0xff,0xe0,0x1, 0x8d,0xf, 0xf0,0x0, +0xb0,0xf, 0xc2,0x7f,0xf0,0x0, 0xb1,0x1f,0xe2,0x1, 0xc2,0x7f,0xf0,0x0, 0xb1,0xaf, +0xf0,0x0, 0xb2,0x3f,0xf0,0x0, 0xb0,0xcf,0xf0,0x0, 0xb2,0x8b,0xf0,0x0, 0xb3,0x1b, +0xf0,0x0, 0xab,0xcb,0xa9,0xdb,0xac,0x6b,0xac,0xfb,0xe0,0x1, 0xad,0xb, 0xe0,0xf, +0x3b,0x15,0x8f,0x8f,0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x43,0xe2,0x0, 0xcf,0x82, +0xe0,0x3, 0x1, 0x7, 0x67,0x8d,0x3a,0x9f,0x8d,0x85,0xe2,0x0, 0xcd,0x85,0xe0,0x0, +0x1, 0x74,0x17,0x98,0x3f,0xbb,0x66,0x8c,0xf0,0xe, 0x3e,0x1f,0x67,0x85,0xae,0x9e, +0xc2,0x1, 0xaf,0x8e,0xe2,0x1, 0xc2,0x7f,0x67,0x8e,0x66,0x92,0xaf,0xae,0xc5,0x81, +0xae,0xbe,0xf0,0x40,0x3d,0x74,0x67,0x88,0x66,0x95,0xaf,0xce,0xb6,0xbe,0x67,0x96, +0x66,0x94,0xb7,0xce,0xb6,0xee,0x67,0x86,0x66,0x8f,0xe0,0x1, 0xb1,0x3e,0xb3,0xde, +0xf0,0x0, 0xb5,0xfe,0xe0,0x1, 0xb7,0x8e,0xf0,0x1, 0xb6,0x9e,0xe0,0x1, 0xb6,0xae, +0x67,0x11,0xad,0x85,0x89,0xe, 0xe7,0xf9,0x2, 0xc0,0xe7,0xfa,0x0, 0x8a,0xf7,0xff, +0x23,0x40,0xe7,0xfe,0x0, 0xec,0x15,0x0, 0xe0,0x0, 0x17,0x6e,0x16,0x80,0xad,0xb, +0x7f,0xc, 0x7e,0x88,0xf0,0x0, 0x13,0x0, 0xf0,0x0, 0x62,0x85,0xf2,0x1, 0xc2,0xff, +0xe7,0xfe,0x0, 0xc4,0xe2,0x0, 0xcd,0x1, 0xe0,0x2, 0x1, 0x52,0xe2,0x0, 0xcd,0x2, +0x1, 0xf2,0xf0,0x0, 0x62,0x85,0xe0,0x1, 0x4c,0x80,0xe0,0x0, 0x5c,0x45,0xf2,0x1, +0xc2,0xff,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xd1,0xda,0xf0,0x0, 0x62,0x82, +0xe0,0xa, 0x34,0x1, 0xe8,0xa, 0x3d,0x35,0xe0,0xb, 0x3b,0x15,0xe3,0xff,0xc5,0x7f, +0xe1,0x36,0x3d,0x17,0x15,0x0, 0xad,0xb, 0x67,0x81,0xe7,0xfe,0x0, 0x9f,0xe0,0x1f, +0x15,0x20,0xb5,0xb, 0xe0,0x1f,0x11,0x20,0xe7,0xfc,0x0, 0xa5,0x67,0xa, 0x17,0x83, +0xaf,0x8e,0xe7,0xf7,0x0, 0xf6,0xe0,0x0, 0x12,0xe0,0xf8,0x40,0x3c,0xec,0xe8,0x5, +0x3a,0x9c,0x11,0x98,0xe8,0x40,0x3c,0x69,0xf0,0x0, 0xc4,0x98,0x3d,0x63,0xe8,0x40, +0x3c,0xe9,0xe0,0x2, 0xd2,0xf, 0xe8,0x40,0x3a,0xf9,0x1, 0xf5,0x66,0x85,0x67,0xc, +0x67,0x8e,0xe8,0xc, 0xae,0x8c,0xc2,0x1, 0x66,0x92,0xe8,0xc, 0xaf,0x1c,0xe2,0x1, +0xc2,0x7f,0x67,0x8, 0xe8,0xc, 0xaf,0xac,0xf0,0x40,0x3d,0x74,0x67,0x95,0xe8,0xc, +0xae,0xbc,0x66,0x96,0xe8,0xc, 0xaf,0x4c,0x67,0x14,0xe8,0x6, 0xb7,0xbc,0xe8,0x6, +0xb6,0xcc,0x67,0x86,0x66,0x8f,0xe8,0x6, 0xb7,0x6c,0x67,0x11,0xe8,0x7, 0xb1,0x3c, +0xe8,0x6, 0xb3,0xdc,0xf8,0x6, 0xb5,0xfc,0xe8,0x7, 0xb7,0x8c,0xf8,0x7, 0xb6,0x9c, +0xe8,0x7, 0xb6,0xac,0x89,0xe, 0xe7,0xf8,0x2, 0xb8,0xe7,0xf9,0x0, 0x82,0x67,0x8c, +0xe2,0x0, 0xcf,0xf8,0xe7,0xfe,0x1, 0x40,0x66,0x90,0x55,0xb7,0x57,0xb8,0xf2,0x1, +0x7c,0x98,0xf0,0x19,0x3c,0x9d,0xe8,0x0, 0xb5,0x89,0xe8,0x0, 0xb7,0x99,0xe7,0xfe, +0x0, 0xb3,0xe0,0x0, 0x16,0xe4,0x7e,0x8c,0x67,0xf, 0xe2,0x0, 0xcf,0xa, 0x2, 0xbc, +0x16,0x81,0x7e,0x88,0x66,0x97,0x8d,0x8d,0xe2,0x0, 0xcd,0x81,0xe0,0xb, 0x3b,0x15, +0xe7,0xfe,0x1, 0x5b,0x8d,0xb, 0xe0,0x0, 0x15,0xe4,0xe7,0xfd,0x0, 0x94,0x67,0x11, +0x15,0x1, 0x8c,0xe, 0xad,0xb, 0xe7,0xfd,0x24,0x47,0xe8,0x19,0x8d,0xc8,0x3d,0xf3, +0xe0,0x4, 0x1, 0x26,0xe0,0x2, 0x1d,0x5e,0x15,0x81,0x3f,0x6b,0xe2,0x1, 0xc7,0x7f, +0x3c,0x7e,0xf0,0x40,0x3b,0xeb,0xc5,0x81,0xe7,0xfd,0x5, 0xb6,0xe0,0x1a,0x8f,0x6a, +0xc5,0xa, 0x39,0xfe,0x1, 0xf3,0x15,0x8a,0xe8,0xb, 0x3d,0xb7,0x15,0x7f,0xe8,0xb, +0x3d,0x98,0xe0,0x19,0xad,0x4b,0xe7,0xfd,0x0, 0xa7,0x3f,0x77,0x3e,0xe7,0xe0,0x6d, +0x3d,0x2e,0xe7,0xfa,0x0, 0xb8,0xf0,0x0, 0x5a,0xbe,0x17,0x1, 0xf2,0x0, 0xca,0x8a, +0x7f,0x8, 0x5, 0xc1,0xe0,0x0, 0x5d,0xca,0xe2,0x0, 0xcd,0x8a,0xe7,0xff,0x5, 0xbc, +0x55,0xbc,0x54,0x38,0x55,0x37,0x3d,0x98,0xe0,0x43,0x3d,0x9b,0x54,0xbb,0xe2,0x0, +0xcd,0x80,0x3c,0x9a,0xe0,0x43,0x3c,0x99,0x3d,0x6b,0xe0,0x4, 0x4, 0x2, 0xe2,0x0, +0xcc,0x80,0x3d,0xea,0xe3,0xff,0xc5,0xff,0x3d,0x69,0xe0,0x3, 0x4, 0x77,0x64,0x86, +0xe3,0xff,0xc5,0x7f,0xe8,0x40,0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xf0,0x0, +0x7b,0x4, 0xef,0xfc,0xdc,0x3d,0x5d,0xbf,0xe0,0x43,0x3c,0x18,0xe2,0x1f,0xcd,0x9f, +0x67,0x81,0xf0,0x0, 0x62,0x82,0xf0,0x0, 0x63,0x4, 0xe0,0x3, 0x5, 0xcd,0x15,0x8f, +0xe8,0xb, 0x3d,0xb5,0xe3,0xff,0xc5,0xff,0x3c,0x7b,0x67,0xc, 0xe0,0x28,0x3c,0x2b, +0x15,0xa8,0xe0,0x6b,0x3b,0x2e,0x7c,0x8, 0x7d,0x8c,0xe7,0xfe,0x0, 0xfd,0xf0,0x40, +0x3b,0x6b,0x7d,0x8f,0xe7,0xfb,0x0, 0xa2,0xe0,0x0, 0x1f,0x51,0xe0,0x1, 0x1e,0x8e, +0x7f,0x17,0xea,0x21,0x7f,0x14,0x7e,0x91,0xf0,0x40,0x3c,0xee,0x66,0x97,0x67,0x11, +0xaf,0x8d,0x89,0xe, 0xe7,0xf6,0x0, 0xe5,0x5c,0xbe,0x15,0x14,0xe1,0x2a,0x3c,0x9a, +0x7d,0x12,0xe7,0xfb,0x0, 0x9d,0xe0,0x2, 0x1f,0x49,0x15,0x1, 0xad,0xe, 0xe7,0xfb, +0x0, 0x85,0x17,0x14,0x16,0x80,0x7f,0xc, 0x7e,0x88,0xe7,0xfe,0x0, 0xd5,0xe0,0x0, +0x4f,0xe9,0xe2,0x0, 0xcf,0xf8,0xe7,0xfc,0x1, 0x77,0xe0,0x0, 0x55,0xc3,0xe0,0x0, +0x57,0xc4,0x67,0x10,0xf2,0x1, 0x7c,0x98,0xf0,0x19,0x3c,0x9e,0x35,0xa1,0x37,0xa1, +0xe8,0x0, 0xb5,0x89,0xe8,0x0, 0xb7,0x99,0xe7,0xfc,0x0, 0xe6,0xe0,0x0, 0x5d,0x4a, +0xe2,0x0, 0xcd,0x2, 0x2, 0x98,0x5c,0xb9,0xe2,0x0, 0xcc,0xcf,0x2, 0x94,0xf2,0x0, +0xce,0x93,0xe0,0x0, 0x2, 0xc9,0xe0,0x0, 0x5c,0xc6,0xe2,0x0, 0xcc,0x9d,0x2, 0x8b, +0x5c,0xba,0xe2,0x0, 0xcc,0xcf,0x2, 0x87,0xf0,0x0, 0x62,0x85,0xf2,0x1, 0xc2,0xff, +0xe0,0x1, 0x0, 0xb7,0xf2,0x0, 0xce,0x89,0x2, 0xb6,0xf0,0x0, 0x5a,0x3e,0xf2,0x0, +0xca,0x8, 0x5, 0xbe,0x67,0xe, 0xe2,0x0, 0xcf,0xe, 0x2, 0xaf,0xe0,0x0, 0x4d,0x68, +0xe8,0x40,0x3c,0x66,0x3c,0xea,0x7d,0x4, 0x7d,0x83,0x7f,0x81,0xe0,0x2, 0xd0,0x68, +0xf0,0x0, 0x62,0x85,0xe0,0x16,0x34,0x2, 0xf2,0x1, 0xc2,0xff,0xf8,0x16,0x3b,0x35, +0x65,0x4, 0xf3,0xff,0xc3,0x7f,0xf2,0x0, 0xcb,0x78,0x65,0x83,0x67,0x81,0xe0,0x2, +0x2, 0xb3,0xe2,0x0, 0xcd,0xa, 0xe0,0x1, 0x5, 0x8c,0xf2,0x0, 0xcb,0x4f,0xe8,0x40, +0x3d,0x66,0x2, 0x83,0xe0,0x0, 0x15,0x50,0xf0,0x40,0x3b,0x6a,0xf3,0xff,0xc3,0x7f, +0xe0,0x0, 0x0, 0xff,0xf0,0x0, 0x5a,0x3e,0x14,0x8f,0xf1,0x28,0x3a,0x19,0x24,0x8, +0xe1,0x2a,0x3d,0x19,0x25,0x5, 0x66,0x8e,0xe2,0x0, 0xce,0x89,0x5, 0xc8,0xe0,0x1, +0x4d,0x3, 0x25,0x20,0xe0,0x1, 0x1d,0x4e,0x8d,0xa, 0x25,0x1c,0xf0,0x0, 0x62,0x85, +0xf2,0x1, 0xc2,0xff,0xe1,0x2b,0x3b,0x9b,0xe0,0x1, 0x25,0xd0,0x66,0x88,0xe0,0x1, +0x26,0xcd,0xe0,0xb, 0x3b,0x15,0x15,0x3, 0xf2,0x0, 0xce,0x9d,0xad,0xb, 0xf0,0x0, +0x13,0x0, 0xe0,0x1, 0x5, 0xc8,0xe0,0xb, 0x3b,0x15,0x15,0x1, 0xad,0xb, 0xe7,0xfa, +0x0, 0xed,0xf0,0x0, 0x62,0x85,0xe0,0x0, 0x4c,0xe8,0x5c,0x39,0xf2,0x1, 0xc2,0xff, +0x7d,0x83,0x7f,0x81,0xf0,0x0, 0x7a,0x4, 0xf0,0x0, 0x7a,0x82,0xe0,0x2, 0xd0,0x8, +0xe0,0x0, 0x4c,0xea,0xf0,0x0, 0x62,0x82,0xe0,0xa, 0x34,0x1, 0x67,0xe, 0xe8,0xa, +0x3d,0x35,0x34,0xa1,0xe0,0x29,0x3f,0x19,0xe3,0xff,0xc5,0x7f,0x65,0x83,0x67,0x81, +0xf0,0x0, 0x62,0x4, 0x24,0xa0,0x14,0x9d,0xe9,0x34,0x3c,0xa4,0xf0,0x0, 0x22,0x1c, +0xe0,0x2, 0x1c,0xce,0x8c,0x89,0x2c,0x97,0xe0,0x1, 0x4c,0x82,0xe0,0x9, 0x3f,0x29, +0xe0,0x43,0x3c,0x19,0xe2,0x0, 0xcc,0x0, 0x5, 0xb, 0xe2,0x0, 0xcc,0x85,0x5, 0xb, +0xe2,0x1, 0xcd,0x47,0xf0,0x40,0x3b,0x6a,0x2, 0x91,0xe0,0x0, 0x0, 0xc7,0xe3,0xff, +0xcc,0x7b,0x4, 0x77,0x66,0x8e,0xf0,0x40,0x3b,0x6a,0xe2,0x0, 0xce,0x8f,0x2, 0xba, +0xe2,0x0, 0xcd,0x78,0x5, 0x83,0xf0,0x0, 0x13,0x78,0xf3,0xff,0xc3,0x7f,0xf0,0x40, +0x3b,0x77,0xe7,0xff,0x5, 0x99,0xf2,0x0, 0xce,0x87,0x2, 0xb2,0xe2,0x0, 0xcb,0x94, +0xe0,0x0, 0x5, 0xc0,0xe0,0xb, 0x3b,0x15,0x15,0x2, 0xad,0xb, 0xf0,0x0, 0x13,0x0, +0xe7,0xfa,0x0, 0x8c,0x15,0x0, 0xe7,0xf7,0x0, 0xdd,0x16,0x8a,0x17,0x0, 0x7e,0x8c, +0x7f,0x8, 0xe7,0xfc,0x0, 0xd1,0xe0,0x0, 0x1f,0xd1,0xfa,0x21,0x7c,0x94,0xf0,0x0, +0xad,0xf, 0x12,0x8a,0x3a,0xb2,0xe0,0x2, 0x1c,0xde,0xe0,0x1, 0x14,0x40,0x3d,0x65, +0x3c,0x10,0xe0,0x1, 0xdf,0xff,0xea,0x16,0x7c,0x4c,0xf0,0x0, 0x65,0x7, 0xe7,0xf6, +0x0, 0x9b,0xe2,0x1, 0xcd,0x48,0x5, 0xca,0xf0,0x1, 0x13,0x48,0x0, 0xc7,0xe0,0x0, +0x5d,0xc6,0xe2,0x0, 0xcd,0xe4,0x5, 0x8d,0x15,0x94,0xe1,0x2b,0x3b,0x9b,0x25,0x89, +0x15,0x93,0xe9,0x2b,0x3d,0xad,0x25,0x85,0x67,0xe, 0xe2,0x0, 0xcf,0x13,0x5, 0xc3, +0xf0,0x0, 0x13,0x1, 0xe0,0x0, 0x5d,0xc8,0xe0,0x0, 0x5d,0x47,0x64,0x86,0xe8,0x40, +0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82,0xf0,0x0, 0x7b,0x4, 0xef,0xfc,0xda,0xb8, +0xe2,0x0, 0xcc,0x3b,0x67,0x81,0xf0,0x0, 0x62,0x82,0xf0,0x0, 0x63,0x4, 0x2, 0x87, +0x65,0x8d,0x15,0x0, 0x3d,0x95,0xad,0xb, 0xf0,0x0, 0x13,0x0, 0xe0,0xb, 0x3b,0x15, +0x15,0x0, 0xad,0xb, 0xe7,0xf9,0x0, 0xb2,0xf2,0x0, 0xce,0x9d,0xf0,0x0, 0x13,0x0, +0x2, 0xda,0xe0,0x3, 0x1f,0x3d,0x8d,0x9e,0xe2,0x0, 0xcd,0x82,0xe0,0x0, 0x5d,0xc6, +0x5, 0x96,0xe0,0x0, 0x4d,0x6b,0x2d,0x13,0xe2,0x0, 0xcd,0x9d,0xf0,0x40,0x3b,0x6a, +0xe0,0x0, 0x5, 0xc2,0xe0,0xb, 0x3b,0x15,0x8d,0x8b,0xe2,0x0, 0xcd,0x81,0x1, 0x43, +0xe2,0x0, 0xcd,0x83,0xe7,0xf9,0x1, 0x92,0xe7,0xfe,0x0, 0x9f,0xe2,0x0, 0xcd,0x9d, +0xf0,0x0, 0x13,0x0, 0x2, 0xf0,0x66,0x94,0xe2,0x0, 0xce,0x9d,0x2, 0xec,0x67,0xb, +0x9d,0x8e,0xe2,0x0, 0xcd,0xf7,0x2, 0xe7,0xe0,0x2, 0x1d,0xce,0x8d,0x8b,0xe8,0x36, +0x3d,0x86,0x0, 0xe1,0xf0,0x0, 0x13,0x78,0xe7,0xfe,0x0, 0xdb,0xf0,0x0, 0x13,0x80, +0xe7,0xfb,0x0, 0xeb,0x15,0x9, 0x15,0x86,0x66,0x8e,0xe8,0xa, 0x3d,0x35,0xe8,0xb, +0x3d,0xb5,0xe2,0x0, 0xce,0x8b,0xe3,0xff,0xc5,0xfe,0xe3,0xff,0xc5,0x7f,0xe0,0x6a, +0x3c,0xab,0x3d,0xea,0xe7,0xfc,0x0, 0xaa,0x15,0x0, 0xe7,0xfc,0x0, 0x8a,0x15,0x0, +0xe7,0xfb,0x0, 0xff,0x64,0x86,0xe8,0x40,0x3c,0x6b,0x7f,0x81,0xf0,0x0, 0x7a,0x82, +0xd8,0xbf,0xf0,0x40,0x3b,0x68,0x67,0x81,0xf0,0x0, 0x62,0x82,0xe7,0xff,0x24,0x34, +0xe7,0xfe,0x0, 0xba,0xea,0x16,0x7c,0x4c,0xe7,0xf4,0x0, 0xf6,0x15,0x80,0x7d,0xa0, +0x7d,0xa1,0x7d,0xa2,0x7d,0xa3,0x7d,0xa4,0x7d,0xa5,0xe7,0xf7,0x0, 0x8d,0x8, 0xb2, +0xe0,0x1, 0x1f,0x8e,0xea,0x22,0x7c,0x40,0x89,0xf, 0x14,0x80,0x31,0x21,0x3d,0x62, +0xe0,0x1, 0xdf,0x7a,0xea,0x22,0x7c,0x54,0x3d,0x62,0x14,0x80,0x9, 0x21,0xe0,0x3e, +0x0, 0xf3,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xe1,0xfe,0xc0,0x64,0xe0,0x2, +0x19,0x5f,0xea,0x16,0x7d,0xca,0xf0,0x0, 0x8e,0x82,0xf0,0x2, 0x1d,0x5e,0x8f,0x8b, +0xf0,0x0, 0x2e,0x90,0xe0,0x3, 0x27,0xa4,0xe0,0x2, 0x1f,0x4f,0x7f,0xa, 0xf0,0x0, +0xae,0x8e,0xef,0xff,0xdf,0xd6,0xf0,0x1, 0x1e,0xe, 0xe8,0x0, 0x89,0x8c,0x0, 0xb1, +0xf0,0x1, 0x1e,0xe, 0xe8,0x0, 0x89,0x8c,0x2f,0x93,0x21,0x92,0x17,0x7f,0x3f,0x13, +0xe2,0x1, 0xc7,0x7f,0xc7,0x1, 0xe4,0x0, 0xc7,0xa, 0xe8,0x40,0x3f,0xea,0xe8,0xe, +0x3f,0x1a,0x16,0xff,0xe0,0x19,0xae,0xcf,0xc7,0x8a,0x3f,0x7f,0x1, 0xfc,0x15,0xff, +0xe8,0xb, 0x3d,0x9d,0xe2,0x1, 0xc5,0xff,0xc5,0x81,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, +0x1f,0xde,0xe8,0xb, 0x3d,0x9a,0x96,0x8f,0x97,0x1f,0x36,0xa4,0xb6,0x8f,0xc7,0x8a, +0x37,0x24,0x3d,0xff,0xe0,0x40,0xb7,0x4f,0x1, 0xf7,0xe0,0x2, 0x1f,0xcf,0x7f,0x8a, +0x12,0xa, 0x3a,0x33,0xe0,0x1, 0x14,0xff,0x3d,0x64,0xe2,0x0, 0x7c,0x3c,0xe0,0x1, +0xdf,0x1b,0x14,0x80,0xe2,0x0, 0x7d,0xbc,0xe8,0x40,0x3d,0x6d,0x3c,0x69,0xef,0xff, +0xd6,0xc5,0x3d,0x63,0xe8,0x40,0x3c,0xed,0xe2,0x0, 0x7d,0xbc,0xef,0xff,0xd6,0xbe, +0xe0,0x2, 0x1c,0xde,0x15,0x0, 0xe2,0x0, 0x78,0xbc,0x21,0xad,0x24,0x11,0x8e,0x49, +0x8f,0xc1,0x3f,0xfc,0x1, 0x21,0x3f,0x61,0x17,0x80,0x0, 0x84,0x8e,0xce,0x3e,0xfc, +0x1, 0x1b,0xc7,0x81,0xe2,0x1, 0xc7,0xff,0x3f,0xf8,0xc7,0xa, 0x1, 0xf8,0x17,0xa, +0x3f,0x3a,0x17,0x8a,0xe8,0xe, 0x3f,0x1a,0x3f,0xb8,0x92,0x8e,0x95,0x9e,0x96,0x2e, +0x96,0xbe,0x97,0x4e,0x3f,0x91,0xc4,0x1, 0xb2,0x8f,0xe2,0x1, 0xc4,0x7f,0xb5,0x9f, +0xb6,0x2f,0xb6,0xbf,0xb7,0x4f,0xc5,0x1, 0x3f,0xea,0xe2,0x1, 0xc7,0xff,0x3f,0xf3, +0xc4,0x8a,0x4, 0xd5,0xe0,0x2, 0x1c,0x59,0x14,0xbc,0x3d,0x64,0x3c,0x90,0xe0,0x1, +0xde,0x99,0x66,0x8a,0xf0,0x2, 0x19,0x5e,0x8f,0x8d,0xe0,0x5, 0x2f,0x89,0xea,0x16, +0x7d,0xca,0x8f,0xb, 0xe0,0x5, 0x27,0xa, 0xf0,0x5, 0x26,0x94,0xf7,0xff,0x12,0x7f, +0xe0,0x1, 0x1f,0xd7,0xf8,0x14,0x3a,0x1d,0xf2,0x1, 0xc2,0x7f,0xf0,0x1, 0x99,0x9f, +0xf0,0x0, 0xc2,0x1, 0xe0,0x2, 0x1f,0xcd,0xf4,0x0, 0xc2,0xa, 0xf8,0x19,0x88,0xca, +0xf0,0x0, 0x88,0xf, 0x89,0x2, 0xfa,0x22,0x7b,0x40,0xf8,0x14,0x3a,0x1a,0xea,0x22, +0x7d,0xd4,0xf8,0x40,0x3f,0x66,0xf8,0x0, 0x8c,0xc, 0xf8,0x40,0x3d,0x62,0x79,0xe, +0xf8,0x40,0x3d,0xe2,0xe0,0x0, 0x7d,0x8b,0xf7,0xff,0x12,0xfc,0xf0,0x0, 0x7e,0x8c, +0xe8,0x40,0x3a,0x63,0xe8,0x40,0x3b,0xe0,0xe8,0x40,0x3a,0xe1,0xe8,0x40,0x3b,0x64, +0xf0,0x0, 0x7e,0xd, 0xf0,0x0, 0x24,0x19,0xe8,0x0, 0x8e,0x4b,0x3e,0x75,0xe0,0x1, +0x1, 0x54,0xe8,0x40,0x3f,0x62,0x17,0x81,0x0, 0x87,0xe0,0x1a,0x8e,0xee,0xc7,0xa, +0x3e,0x7d,0xe0,0x1, 0x1, 0x4d,0x3e,0xef,0xe2,0x1, 0xc6,0xff,0xf0,0x40,0x3c,0x7d, +0x3d,0xef,0xc7,0x81,0x2, 0xf3,0xf0,0x0, 0x66,0x8c,0xf0,0x0, 0x66,0xd, 0xe0,0x2, +0x1f,0xdd,0x8f,0x8f,0x2f,0x89,0xea,0x16,0x7c,0x40,0xe8,0x40,0x3d,0x68,0xe0,0x1, +0x14,0xff,0xe0,0x1, 0xde,0x69,0xf0,0x0, 0x14,0x80,0xf0,0x1, 0x24,0x20,0xfa,0x16, +0x7d,0xc0,0x11,0x3, 0xe8,0x40,0x3a,0x69,0xe0,0x0, 0x0, 0xd3,0xf0,0xc, 0x3d,0x93, +0x8f,0xc, 0x34,0x44,0xe2,0x1, 0xcf,0x7f,0x34,0xc4,0xe0,0x3, 0x1, 0x69,0xe2,0x0, +0xcf,0x2, 0xe0,0x3, 0x2, 0xdf,0x13,0x81,0x3b,0x9e,0xe2,0x1, 0xc3,0xff,0x13,0x1e, +0xe4,0x0, 0xc7,0xa, 0x3b,0x33,0xea,0x14,0x7e,0x14,0x65,0x8a,0xe0,0xf, 0x3f,0x16, +0x3f,0x9c,0x8f,0xb, 0xb4,0xf, 0xb4,0x9f,0xe0,0x3, 0x2f,0x46,0x3b,0x1c,0x97,0x56, +0x94,0x6, 0xe0,0x1, 0x97,0xa6,0x3c,0x1e,0x3c,0x1f,0x3c,0xe2,0x12,0x8a,0xe3,0xff, +0xc4,0x7f,0xf0,0x18,0x3d,0x1d,0x3a,0x96,0xe0,0x1, 0xdd,0xd5,0xf0,0x0, 0x17,0x14, +0x96,0x95,0xf0,0x1e,0x3f,0x16,0x97,0x96,0xe8,0x0, 0x97,0x1e,0x3f,0x9d,0x3f,0x9e, +0xe8,0x0, 0xb4,0x8, 0x3c,0x6f,0x3c,0xe2,0xe3,0xff,0xc4,0x7f,0xe0,0x1, 0xdd,0xc3, +0xe8,0x0, 0xb4,0x18,0xe8,0x3, 0x39,0x9b,0xab,0x83,0xf0,0x0, 0xc4,0x81,0xf8,0x0, +0x8c,0xc, 0xf2,0x1, 0xc4,0xff,0xf8,0x40,0x3c,0x79,0xe0,0x0, 0x5, 0xc8,0x16,0x8a, +0xe8,0xd, 0x3e,0xb9,0xf8,0x40,0x3e,0xf9,0xf0,0xf, 0x3d,0x1d,0xe0,0x19,0x89,0xcf, +0xe0,0xc, 0x9c,0x4f,0xa9,0xcf,0xe0,0xc, 0x9c,0xdf,0x5, 0x87,0x9e,0xf, 0x9f,0x1f, +0x36,0x44,0x37,0x44,0xb6,0xf, 0xb7,0x1f,0xf0,0xf, 0x3d,0x1d,0xe0,0x19,0x85,0x5f, +0xe0,0x19,0x85,0xef,0xe0,0x19,0x86,0x7f,0xe0,0x1a,0x87,0xf, 0xe2,0x0, 0xc1,0x8f, +0xe8,0x40,0x39,0xf8,0xad,0x5f,0xad,0xef,0xae,0x7f,0xe0,0x1, 0xaf,0xf, 0x3, 0x4e, +0x17,0xa, 0x3f,0x33,0xe8,0xe, 0x3f,0x1a,0xe0,0x2, 0xc7,0x2c,0x8f,0xe, 0xe2,0x0, +0xcf,0x3, 0x1, 0x44,0xe2,0x0, 0xcf,0x1, 0xe7,0xfe,0x1, 0xfa,0xea,0x16,0x7f,0xc0, +0xf0,0x0, 0xc4,0x81,0xf8,0x0, 0x8c,0xc, 0xf2,0x1, 0xc4,0xff,0x3f,0x93,0x17,0x7f, +0xf8,0x40,0x3c,0x79,0xaf,0xf, 0xe7,0xff,0x2, 0xbc,0xea,0x16,0x7e,0xca,0xf0,0x0, +0xae,0x8d,0xe0,0x1, 0xc0,0x1c,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1e,0xcf, +0x7e,0x8a,0xe7,0xfc,0x0, 0xe0,0x3e,0x65,0xe0,0x0, 0x15,0x80,0xf0,0x0, 0x14,0x8a, +0xf0,0x19,0x3c,0xbb,0xf8,0x0, 0x9e,0x9b,0xf8,0xf, 0x3d,0x19,0xe0,0xc, 0x9e,0xdf, +0xe0,0xc, 0x99,0x4f,0xe8,0x0, 0x99,0x8b,0xf0,0xf, 0x3e,0xad,0x3d,0x6f,0xe0,0xe, +0x39,0xa2,0x17,0x8a,0xe3,0xff,0xc7,0x7f,0x3f,0xbc,0xf0,0x43,0x3e,0x1e,0xf2,0x0, +0xce,0x0, 0xe3,0xff,0xc5,0x7f,0xe0,0x8, 0x39,0x23,0xe8,0xf, 0x3f,0x9a,0xe3,0xff, +0xc4,0x7f,0xf0,0x43,0x3b,0x9a,0x3c,0xee,0xe0,0x2, 0xc7,0xac,0xe0,0x69,0x3d,0x28, +0x8f,0x8f,0xf2,0x0, 0xcb,0x80,0xe8,0x8, 0x3e,0xad,0xf0,0x40,0x39,0xea,0xe3,0xff, +0xc4,0x7f,0xe0,0x73,0x3d,0x28,0xe2,0x0, 0xcf,0x81,0xf0,0x13,0x39,0x99,0xf3,0xff, +0xc1,0xff,0x36,0x21,0xe0,0x1, 0x1, 0x37,0xf0,0x40,0x39,0xf4,0xf0,0xf, 0x3f,0x1c, +0xe0,0x0, 0x3, 0xff,0x9f,0x8f,0xf0,0x8, 0x31,0xa8,0x3c,0xe4,0x7d,0x6, 0x7e,0x2, +0x7e,0x87,0x7f,0x8, 0x7f,0x89,0xf0,0x0, 0x79,0x3, 0xf0,0x0, 0x79,0x84,0xf0,0x0, +0x7a,0x81,0xf0,0x0, 0x7b,0x85,0xe0,0x1, 0xdd,0x6, 0xe3,0xff,0xc4,0x7f,0xe2,0x0, +0xcc,0xf, 0x65,0x6, 0x66,0x2, 0x66,0x87,0x67,0x8, 0x67,0x89,0xf0,0x0, 0x61,0x3, +0xf0,0x0, 0x61,0x84,0xf0,0x0, 0x62,0x81,0xf0,0x0, 0x63,0x85,0xe0,0x2, 0x2, 0x80, +0xf0,0x40,0x39,0xff,0xe0,0x1, 0x3, 0xbf,0xf0,0x0, 0x60,0xb, 0xf0,0x10,0x38,0x1c, +0xe8,0x0, 0x9c,0x0, 0xe8,0xc, 0x3e,0x1e,0xf0,0x0, 0xb1,0x8c,0xe0,0x0, 0x2b,0xe0, +0x3e,0x68,0xe3,0xff,0xc6,0x7f,0xe2,0x2, 0xce,0x0, 0x3f,0xe8,0x5, 0x83,0xe0,0x2, +0x17,0x80,0xe3,0xff,0xc7,0xff,0xf2,0x0, 0xce,0x0, 0xe0,0xc, 0x39,0x23,0xe3,0xff, +0xc6,0x7f,0xe0,0x6e,0x3d,0x2c,0x3f,0x3f,0x39,0xf2,0x37,0x48,0xe8,0xe, 0x3f,0x55, +0xe3,0xff,0xc7,0x7c,0xf8,0xc, 0x3d,0x19,0xe0,0x0, 0x5, 0xd3,0x3f,0x12,0xe0,0xc, +0xb7,0x4c,0xf2,0x0, 0xcb,0x80,0xe8,0xe, 0x3e,0xad,0xe3,0xff,0xc7,0x7f,0xe0,0x6a, +0x3d,0x2e,0x3f,0xba,0xf0,0x40,0x3e,0xfd,0x37,0xc8,0xe8,0xf, 0x3f,0xd5,0xe3,0xff, +0xc7,0xfc,0xf8,0xb, 0x3d,0x19,0xe0,0x0, 0x2, 0xc2,0xe0,0xf, 0x3e,0xaf,0xe0,0xc, +0xb7,0xdb,0xf0,0x0, 0xc5,0x8a,0xf0,0x40,0x3d,0xf6,0xe7,0xfc,0x1, 0xed,0xf0,0x0, +0x66,0xd, 0xf0,0x0, 0x66,0x8c,0xf8,0x0, 0x8c,0xc, 0xe7,0xfd,0x0, 0x82,0x9f,0x8f, +0xe8,0x40,0x3f,0xf3,0xe7,0xff,0x2, 0xaa,0xfa,0x22,0x78,0x54,0xf0,0x10,0x38,0x1c, +0xe0,0x2, 0x17,0x80,0xe8,0xc, 0x3e,0x1e,0xe8,0x0, 0xb7,0x80,0xe0,0x2, 0x17,0x80, +0xf0,0x0, 0xb1,0x8c,0xe7,0xff,0x23,0xb1,0xe0,0x2, 0x14,0x0, 0x67,0x8e,0xe2,0x0, +0xcf,0x81,0xe7,0xff,0x1, 0x9f,0xe8,0x0, 0x8f,0xeb,0xe0,0xc, 0x34,0x41,0xe2,0x0, +0xcf,0x8f,0xe3,0xff,0xc6,0x7f,0xe0,0x68,0x3b,0xac,0xe7,0xff,0x0, 0x93,0xe0,0xe, +0x39,0x2e,0xe0,0xc, 0xb7,0x4c,0xe7,0xff,0x0, 0xae,0x3f,0x9d,0xe0,0xc, 0xb7,0xdb, +0x0, 0xc1,0xf0,0x0, 0x60,0xb, 0x15,0x80,0xf0,0x9, 0x38,0x1c,0xf0,0xf, 0x3f,0x1c, +0xf0,0x40,0x39,0xf4,0xb5,0x89,0xb5,0x8f,0x3, 0xca,0xf0,0x8, 0x31,0xa8,0x3c,0xe4, +0x7d,0x6, 0x7e,0x2, 0x7e,0x87,0x7f,0x8, 0xf0,0x0, 0x78,0x9, 0xf0,0x0, 0x79,0x3, +0xf0,0x0, 0x79,0x84,0xf0,0x0, 0x7a,0x81,0xf0,0x0, 0x7b,0x85,0xe0,0x1, 0xdc,0x4b, +0xe3,0xff,0xc4,0x7f,0xe2,0x0, 0xcc,0xf, 0x65,0x6, 0x66,0x2, 0x66,0x87,0x67,0x8, +0xf0,0x0, 0x60,0x9, 0xf0,0x0, 0x61,0x3, 0xf0,0x0, 0x61,0x84,0xf0,0x0, 0x62,0x81, +0xf0,0x0, 0x63,0x85,0x5, 0x89,0xf0,0x10,0x38,0x1c,0xe8,0x0, 0xb4,0x0, 0xe7,0xfe, +0x0, 0xcb,0xfa,0x22,0x78,0x54,0xf0,0x10,0x38,0x1c,0x15,0x90,0xe8,0xc, 0x3e,0x1e, +0xe8,0x0, 0xb5,0x80,0x17,0x90,0xf0,0x0, 0xb1,0x8c,0xe7,0xfe,0x23,0xce,0x14,0x10, +0xe7,0xff,0x0, 0x9e,0xf0,0xf, 0x3d,0x1d,0xb4,0xf, 0xb4,0x9f,0xe7,0xfc,0x0, 0xdc, +0x17,0x0, 0xaf,0xc, 0x13,0x81,0x3f,0x64,0xe7,0xfc,0x0, 0xa3,0x17,0x1e,0x3f,0x33, +0xea,0x14,0x7e,0x94,0x15,0x81,0x3f,0x1d,0xad,0x8c,0x16,0x83,0xb4,0xf, 0xb4,0x9f, +0xc7,0xa, 0x94,0xf, 0x94,0x9f,0x95,0x2f,0x95,0xbf,0x96,0x4f,0xe0,0x40,0xb4,0x5e, +0xc6,0xff,0xe0,0x40,0xb4,0xce,0xe2,0x1, 0xc6,0xff,0xe0,0x40,0xb5,0x3e,0xe0,0x40, +0xb5,0xae,0xe0,0x40,0xb6,0x1e,0x2e,0xed,0xe7,0xfc,0x0, 0xb9,0xf0,0x40,0x39,0xff, +0xe7,0xfe,0x4, 0x84,0xfa,0x22,0x78,0x54,0xe7,0xff,0x0, 0xb7,0xf8,0x0, 0x8c,0xc, +0xf7,0xfb,0x26,0xd3,0xe7,0xfb,0x0, 0xcd,0xf8,0x0, 0x8c,0xc, 0x15,0xa, 0xe8,0xa, +0x3d,0x38,0xe0,0x2, 0x1c,0x59,0xe8,0x40,0x3c,0xe2,0xe0,0x1, 0xdb,0xfb,0x0, 0xf1, +0xf8,0x0, 0x8c,0xc, 0xe7,0xfb,0x0, 0xc1,0x8, 0xb1,0xe0,0x2, 0x1c,0x6d,0x15,0xa, +0x14,0x99,0xe0,0x1, 0xdc,0x29,0xe0,0x2, 0x1e,0x8e,0x17,0x0, 0x3f,0xed,0xe1,0x80, +0xaf,0x1f,0xc7,0x81,0xaf,0x1d,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80,0xaf,0x1f,0xe1,0x80, +0xaf,0x1f,0xaf,0xf, 0x8, 0xe1,0x0, 0x0, 0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x58, +0xf0,0x2, 0x19,0xdf,0xe8,0x0, 0x89,0x3, 0xe0,0x3, 0x21,0x69,0xe0,0x1, 0x1f,0x8e, +0xe0,0x1, 0x1f,0x42,0x8f,0x8f,0xe0,0x0, 0x27,0xf3,0x13,0xff,0x3b,0x9f,0xe2,0x1, +0xc3,0xff,0xf0,0xe, 0x8c,0x9e,0xf0,0xe, 0x8c,0x2e,0xc3,0x81,0xe4,0x0, 0xc3,0x8a, +0xe0,0x2, 0x19,0xde,0xea,0x13,0x7c,0xba,0xfa,0x13,0x7f,0x3c,0xf0,0x19,0x34,0xa6, +0xf0,0x18,0x34,0x26,0xf0,0x0, 0x10,0x80,0xea,0x13,0x7d,0xf0,0xfa,0x13,0x7a,0xe4, +0xfa,0x13,0x7b,0x7c,0xfa,0x14,0x7b,0x88,0xf0,0x0, 0x8e,0x89,0xf0,0x2, 0x1e,0x57, +0xf0,0x2, 0x19,0x6d,0xf1,0xff,0xc4,0xe0,0xf1,0xff,0xc4,0x60,0x3b,0x93,0xf8,0x40, +0x38,0x61,0x7d,0x8a,0xf8,0x40,0x3a,0x6e,0x0, 0x8a,0xea,0x13,0x7f,0x3c,0x31,0x22, +0x3f,0x12,0xb2,0xe, 0xb7,0x9e,0xc1,0x8a,0x3b,0xf3,0x1, 0x37,0x89,0x43,0xe2,0x1, +0xc9,0x7f,0x1, 0x7a,0x9a,0x3, 0x17,0xa, 0x3f,0x32,0xe2,0x0, 0xca,0x21,0x9f,0x93, +0xe8,0x2d,0x3a,0x29,0xe8,0xe, 0x3f,0x1c,0x15,0x81,0xe0,0x6b,0x3b,0xad,0x8f,0xe, +0xe2,0x0, 0xcf,0xa1,0xe8,0x2d,0x3f,0xa8,0x16,0x1, 0xe0,0x6c,0x3b,0xad,0xe2,0x0, +0xcf,0x2, 0x1, 0x21,0x27,0x5b,0xe2,0x0, 0xcf,0x1, 0x1, 0xde,0x66,0x8a,0xea,0x14, +0x7d,0x88,0xea,0x13,0x7e,0x7c,0xea,0x13,0x7f,0xe4,0x3d,0x92,0x3e,0x12,0x3e,0x92, +0xc1,0x8a,0x39,0x1f,0xf0,0x0, 0xa8,0xb, 0x3b,0xf3,0xf0,0x0, 0xa8,0xc, 0xe0,0x0, +0xaf,0xd, 0xf0,0x0, 0xa8,0x2, 0x1, 0xcb,0xf0,0x3, 0x28,0xd0,0xc0,0x28,0xf8,0x0, +0xf, 0x28,0xb, 0xe1,0xe0,0x6, 0x31,0x22,0xf0,0xe, 0x3a,0x16,0xf0,0x0, 0x9d,0xe, +0xf0,0x0, 0x9d,0x9e,0xe8,0xe, 0x3a,0x2a,0xe3,0xff,0xc7,0x7f,0xe0,0x43,0x3c,0x1e, +0xe8,0xd, 0x3f,0xab,0xe3,0xff,0xc6,0xff,0xe0,0x41,0x3c,0xce,0xe2,0x0, 0xcc,0x0, +0xf0,0x43,0x3f,0x1d,0xe3,0xff,0xc4,0xff,0xf0,0x1, 0x3a,0x92,0xe0,0x41,0x3d,0x4d, +0xe0,0x6e,0x3d,0x29,0xf2,0x0, 0xcf,0x0, 0x8c,0x81,0xe3,0xff,0xc5,0x7f,0xe0,0x6d, +0x3d,0x2a,0xe2,0x0, 0xcc,0xe3,0x2, 0x83,0xc4,0x81,0xac,0x81,0xe8,0x0, 0x8d,0x3, +0xe2,0x0, 0xcd,0x7, 0xe0,0x2, 0x5, 0x8a,0xf0,0xa, 0x3b,0x92,0x88,0x8a,0x15,0xa, +0xf0,0x0, 0x26,0x89,0xf1,0xff,0xc6,0xff,0xf2,0x1, 0xc6,0xff,0xf0,0x0, 0x10,0x81, +0x15,0xa, 0xf0,0x9, 0x39,0x12,0x8a,0x89,0x3d,0x75,0x5, 0x83,0xad,0x9, 0x3a,0xea, +0x28,0x99,0xf0,0xa, 0x3a,0x92,0x8d,0xa, 0xe2,0x0, 0xcd,0x11,0x2, 0x8d,0x8d,0x53, +0x14,0xa2,0xe1,0x2a,0x3c,0xaa,0xe0,0x2, 0x2d,0x3, 0x8c,0xe3,0x15,0x7, 0xe1,0x2a, +0x3d,0x29,0xe0,0x1, 0x2d,0x7d,0xe0,0xa, 0x3f,0x1d,0xe2,0x0, 0xcd,0x3, 0xe0,0x2, +0x5, 0x0, 0x3d,0x65,0xe3,0xff,0xc5,0x7f,0xe1,0x29,0x3d,0x1e,0xe0,0x0, 0x24,0xdb, +0xe1,0x2a,0x3d,0x1d,0xe0,0x0, 0x25,0x57,0x2d,0x83,0xf0,0x0, 0xb5,0x3, 0x2e,0x3, +0xf0,0x0, 0xb5,0x93,0xe0,0x2, 0x1f,0xe, 0x3f,0x12,0x87,0x8e,0xc7,0x81,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0x9d,0xaf,0x8e,0xe7,0xfe,0x5, 0xc7,0x8c,0x53,0x14,0x83, +0xf0,0x0, 0x78,0x7, 0xf0,0x0, 0x78,0x85,0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x79,0x88, +0xf0,0x0, 0x7a,0x4, 0xf0,0x0, 0x7a,0x83,0xf0,0x0, 0x7b,0x2, 0xf0,0x0, 0x7b,0x81, +0xe0,0x1, 0xda,0xa1,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x9e,0xf0,0x0, +0x60,0x7, 0xf0,0x0, 0x60,0x85,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x61,0x88,0xf0,0x0, +0x62,0x4, 0xf0,0x0, 0x62,0x83,0xf0,0x0, 0x63,0x2, 0xf0,0x0, 0x63,0x81,0xe0,0x2, +0x2, 0x84,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8e,0x3f,0x6f,0xe0,0x2, +0x5, 0x85,0x3f,0xee,0xe2,0x1, 0xc7,0xff,0x3f,0xf5,0x5, 0x85,0xf0,0xf, 0x39,0x12, +0xc2,0x81,0xaa,0x8f,0xea,0x13,0x7f,0xfc,0x39,0x1f,0x15,0x81,0xad,0x82,0xe7,0xfe, +0x0, 0x84,0xf0,0xc, 0x3b,0x12,0x8e,0xc, 0x26,0x1c,0x14,0x94,0xe1,0x2c,0x3f,0x19, +0xe0,0x1, 0x2e,0x1b,0xe1,0x2c,0x3e,0x99,0xe0,0x1, 0x2e,0x17,0x14,0x89,0xe1,0x2c, +0x3f,0x19,0xe0,0x1, 0x2e,0x6c,0xe1,0x2c,0x3e,0x99,0xe0,0x1, 0x2e,0x68,0x15,0x84, +0xe1,0x2e,0x3f,0x1b,0xe0,0x1, 0x2f,0x69,0xe1,0x2d,0x3e,0x9b,0xe0,0x1, 0x2e,0xe5, +0x66,0x8a,0xe0,0xe, 0x3e,0x92,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x5, 0xbc,0x17,0xff, +0x3f,0x9e,0xe2,0x1, 0xc7,0xff,0x3f,0x6f,0x3e,0x92,0xaf,0x8d,0x3c,0xee,0xf0,0x0, +0x78,0x7, 0xf0,0x0, 0x78,0x85,0xf0,0x0, 0x79,0x6, 0xf0,0x0, 0x79,0x88,0xf0,0x0, +0x7a,0x4, 0xf0,0x0, 0x7a,0x83,0xf0,0x0, 0x7b,0x2, 0xf0,0x0, 0x7b,0x81,0x7f,0x9, +0xe0,0x1, 0xd9,0xee,0xf0,0x4, 0x3d,0x18,0x67,0x9, 0xe3,0xff,0xc2,0x7f,0xb2,0x3, +0x3c,0xee,0xe8,0x40,0x3c,0x6e,0xe0,0x1, 0xd9,0xe3,0xf0,0xf, 0x3d,0x98,0xe3,0xff, +0xc7,0xff,0xf0,0x0, 0x63,0x81,0xf0,0x0, 0x63,0x2, 0xf0,0x0, 0x62,0x83,0xf0,0x0, +0x62,0x4, 0xf0,0x0, 0x61,0x88,0xf0,0x0, 0x61,0x6, 0xf0,0x0, 0x60,0x85,0xf0,0x0, +0x60,0x7, 0xb7,0x93,0xe8,0x6, 0x3b,0x14,0xf0,0xd, 0x3b,0x92,0xf0,0xe, 0x3b,0x12, +0x16,0x1, 0xe2,0x0, 0xca,0x8e,0xae,0xd, 0xf0,0x0, 0xa8,0xe, 0xb2,0x6, 0xb7,0x96, +0x5, 0x95,0xf0,0xf, 0x39,0x12,0x17,0x5, 0xaf,0xf, 0xe0,0x2, 0x1f,0x8e,0x39,0x1f, +0xf0,0x0, 0xa8,0x2, 0xe7,0xfd,0x0, 0x89,0xe2,0x0, 0xcd,0x2, 0x5, 0x8f,0xf0,0xa, +0x3b,0x92,0x88,0x8a,0x15,0x9, 0xe7,0xfd,0x0, 0xf5,0xe2,0x0, 0xca,0x81,0x5, 0xee, +0xf0,0xf, 0x39,0x12,0xc2,0xff,0xaa,0x8f,0x0, 0xe9,0xe0,0x0, 0x1, 0x4e,0xf0,0x0, +0x26,0xbe,0xf0,0xa, 0x3b,0x92,0x88,0x8a,0xe7,0xfd,0x0, 0xe6,0x14,0x9f,0xe1,0x2a, +0x3c,0xae,0xe7,0xfe,0x25,0x2, 0xe1,0x2a,0x3c,0xad,0xe7,0xfd,0x25,0x7e,0x16,0x80, +0x3f,0x6d,0xe7,0xfe,0x0, 0x80,0x8f,0x53,0xe2,0x0, 0xcf,0x3c,0x5, 0xaf,0xea,0x13, +0x7e,0xf0,0x17,0xb, 0x3f,0xee,0xe7,0xff,0x0, 0x81,0xdd,0xef,0xea,0x14,0x7f,0x8, +0xea,0x13,0x7f,0xfc,0x3e,0x6e,0x3e,0xef,0xe1,0x80,0xb9,0x1c,0xea,0x13,0x7c,0x70, +0xe1,0x80,0xb9,0x1d,0x15,0xa, 0xb9,0x1e,0x14,0x81,0xb9,0x1f,0xb1,0x2c,0xb1,0x2d, +0xe0,0x1, 0xda,0xa, 0xea,0x13,0x7f,0xe4,0x3f,0x6f,0xe1,0x80,0xb9,0x1e,0xb9,0x1f, +0xb1,0x2e,0xc0,0x28,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xf0,0x9, 0x39,0x12,0xf0,0xa, +0x3b,0x92,0x8a,0x89,0x88,0x8a,0xe7,0xfd,0x0, 0xb5,0x66,0x8a,0x15,0x81,0x3e,0x92, +0xad,0x8d,0xe7,0xff,0x0, 0x89,0x8d,0x53,0xe2,0x0, 0xcd,0x3c,0xe7,0xff,0x5, 0xb1, +0xf0,0xa, 0x3b,0x92,0x88,0x8a,0x20,0xa6,0xf7,0xfd,0x2e,0x96,0xf0,0xa, 0x39,0x12, +0x8a,0x8a,0xe7,0xfd,0x0, 0xb8,0x14,0x1e,0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xe2,0x0, +0xcf,0x8e,0x3f,0x6f,0xe7,0xfd,0x2, 0xff,0x17,0xf, 0x3f,0xee,0xe2,0x1, 0xc7,0xff, +0x3f,0xf5,0xe7,0xfe,0x5, 0x81,0xe7,0xfd,0x0, 0xfb,0xea,0x13,0x7e,0xf0,0x17,0x5, +0x3f,0xee,0xe7,0xfe,0x0, 0xab,0xea,0x13,0x7e,0xf0,0x17,0x2, 0x3f,0xee,0xe7,0xfe, +0x0, 0xa5,0x15,0x12,0xe7,0xfc,0x0, 0xee,0xea,0x13,0x7c,0xba,0xf0,0x0, 0xae,0x89, +0xe7,0xfc,0x0, 0xae,0xe0,0x2, 0x1f,0x40,0xe0,0x2, 0x1f,0xc8,0xe0,0xa, 0x8f,0xe, +0xe2,0x0, 0xcf,0x1, 0xe0,0x0, 0x1, 0x77,0x8f,0x8f,0xe2,0x0, 0xcf,0x82,0xe0,0x0, +0x1, 0x75,0xea,0x13,0x7f,0xb8,0x8f,0xf, 0x27,0x37,0xe2,0x0, 0xcf,0x1, 0xe0,0x1, +0x1e,0xc7,0xe0,0x1, 0x1, 0xb, 0xe0,0x2, 0x1f,0xd1,0x17,0x0, 0xaf,0xf, 0x9f,0x8d, +0xe2,0x1, 0xcf,0x96,0xe0,0x0, 0x5, 0xce,0xea,0x13,0x7f,0x36,0x87,0x8e,0xc7,0x81, +0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x81,0xaf,0x8e,0xe0,0x1, 0x5, 0x97,0xe0,0x2, +0x1e,0xda,0x16,0x28,0xe2,0x0, 0xcf,0x83,0xae,0xd, 0xe0,0x0, 0x5, 0xed,0x17,0x80, +0xe0,0x2, 0x1e,0x4e,0xe0,0x2, 0x1d,0x4d,0xaf,0x8e,0xe0,0x0, 0x15,0xf7,0x17,0x1e, +0xaf,0xc, 0x17,0xa8,0x17,0x1e,0xad,0x8a,0x27,0x3, 0xc7,0x7f,0xaf,0xc, 0x27,0xb9, +0xc7,0xff,0xaf,0x8d,0x38,0x82,0xe0,0x2, 0x1e,0xdd,0x8e,0x8d,0xe0,0x0, 0x26,0xd0, +0xe0,0x1, 0x1e,0xc7,0x9e,0xd, 0xe2,0x3, 0xce,0x10,0xe0,0x0, 0x5, 0xe1,0xea,0x13, +0x7d,0xb7,0x86,0xb, 0xc6,0x1, 0xe2,0x1, 0xc6,0x7f,0xe2,0x0, 0xce,0x1, 0xae,0xb, +0xe7,0xff,0x5, 0xbb,0xea,0x13,0x7e,0x39,0xaf,0xc, 0x17,0x1, 0xaf,0xf, 0x17,0x4, +0xe0,0x2, 0x1f,0xd1,0xaf,0xf, 0x9f,0x8d,0xe2,0x1, 0xcf,0x96,0xe7,0xff,0x2, 0xb6, +0xea,0x13,0x7f,0xb6,0xe0,0x2, 0x1e,0xda,0x17,0x0, 0xaf,0xf, 0x8f,0x8d,0xe0,0x2, +0x1d,0x4d,0xe0,0x2, 0x1e,0x4e,0x8f,0xa, 0xe0,0x0, 0x2f,0x4d,0x8f,0xc, 0x0, 0xc5, +0x38,0x82,0x8f,0xf, 0xe7,0xff,0x2f,0xa, 0xea,0x13,0x7f,0x36,0x17,0x80,0xaf,0x8e, +0xea,0x13,0x7d,0xb9,0xe0,0x2, 0x1f,0x51,0xea,0x13,0x7e,0x38,0xaf,0x8e,0xea,0x13, +0x7e,0xb7,0xe0,0x2, 0x1f,0x4d,0xaf,0x8e,0xe0,0x2, 0x1f,0x4e,0xaf,0x8e,0xe0,0x2, +0x1f,0x5a,0xaf,0x8b,0xaf,0x8c,0xaf,0x8d,0xaf,0x8e,0x38,0x82,0xe0,0x1, 0x1e,0xc7, +0xe7,0xfe,0x0, 0xfb,0x17,0xa8,0x0, 0xd4,0x9f,0xd, 0xe2,0x2, 0xcf,0x2b,0x2, 0x94, +0xea,0x13,0x7e,0x39,0x87,0xc, 0xc7,0x1, 0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x32, +0x5, 0x91,0x17,0x0, 0xaf,0xc, 0xaf,0xf, 0xe7,0xfe,0x0, 0xe7,0xea,0x13,0x7f,0xb7, +0xaf,0xf, 0xe7,0xfe,0x0, 0xe2,0xea,0x13,0x7f,0xb9,0x17,0x0, 0xaf,0xf, 0xe7,0xff, +0x0, 0xa8,0xaf,0xc, 0xe7,0xff,0x0, 0xa5,0xe0,0x2, 0x1e,0xda,0x8f,0x8d,0xe7,0xff, +0x0, 0xb0,0x15,0xff,0x3d,0x9e,0xe2,0x1, 0xc5,0xff,0x8f,0xc, 0xad,0x8a,0xe7,0xfe, +0x0, 0xf5,0x8, 0xb1,0xe2,0x0, 0xcc,0x2, 0x1, 0x21,0xe2,0x0, 0xcc,0x3, 0x1, 0x16, +0xe2,0x0, 0xcc,0x1, 0x1, 0x2, 0x8, 0xe1,0xef,0xfc,0xdb,0x56,0xe0,0x2, 0x1f,0xd2, +0xac,0xf, 0xe0,0x2, 0x1f,0x84,0x24,0x20,0x17,0x0, 0xaf,0xf, 0x17,0xa, 0xe0,0x2, +0x1f,0x88,0xb7,0xf, 0x8, 0xa1,0xe7,0xfe,0x0, 0x97,0xef,0xff,0xd2,0x3f,0xef,0xff, +0xd1,0xab,0xdc,0xbb,0x8, 0xa1,0xe7,0xf2,0x0, 0xd7,0xe0,0x2, 0x1f,0xd0,0x17,0x0, +0xaf,0xf, 0xef,0xff,0xd1,0x5a,0xe0,0x2, 0x1f,0xc0,0xe0,0xa, 0x8f,0x8f,0x2f,0xdc, +0x8, 0xa1,0xe7,0xe1,0x0, 0xf1,0x8f,0xf, 0xe2,0x0, 0xcf,0x1, 0x1, 0xe4,0x0, 0xdd, +0xe0,0x1, 0x1f,0x8e,0x8f,0x8f,0x27,0x9b,0x16,0x7f,0x3e,0x1f,0xe2,0x1, 0xc6,0x7f, +0xc6,0x1, 0xe4,0x0, 0xc6,0xa, 0x16,0x83,0x3e,0x18,0xe0,0xff,0x17,0x7f,0x17,0x80, +0xae,0x88,0xc4,0xa, 0x3c,0x7c,0xe0,0x41,0xae,0x98,0xe0,0x40,0xb7,0x48,0xe0,0x40, +0xb7,0x38,0xe0,0x40,0xaf,0xc8,0xe0,0x40,0xaf,0xa8,0x1, 0xf3,0x38,0x82,0x0, 0x0, +0xe0,0x1, 0x1f,0x8e,0xc4,0xff,0x8e,0xf, 0xe0,0x2, 0x1f,0xdf,0x8e,0x8f,0x17,0x80, +0xe0,0x0, 0x26,0x41,0xf0,0x2, 0x1b,0xde,0xf0,0x40,0x3a,0x6f,0xf0,0x0, 0x12,0x82, +0xf0,0x0, 0x13,0x3, 0x15,0xfd,0x15,0x1, 0x0, 0x8f,0x8f,0x78,0x27,0x17,0xf0,0x0, +0xab,0x8, 0x17,0x3, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xaf,0x18,0x3f,0xfc,0xc4,0xa, +0xe0,0x40,0xaf,0x38,0x1, 0x27,0xe0,0x80,0x8f,0x19,0xe2,0x0, 0xcf,0x1, 0x1, 0x11, +0x87,0x18,0x3f,0x5b,0xe2,0x1, 0xc7,0x7d,0x2f,0x69,0x17,0xa, 0x3f,0x3d,0xad,0x8, +0xe8,0xe, 0x3f,0x17,0xc6,0x81,0xaf,0xce,0xe2,0x1, 0xc6,0xff,0x8f,0x8, 0x0, 0xe3, +0x8f,0x18,0xe2,0x0, 0xcf,0x1, 0x1, 0xf, 0xe2,0x0, 0xcf,0x3, 0x1, 0xe, 0x2f,0x5, +0xf0,0x0, 0xaa,0x88,0x17,0x2, 0x0, 0xd7,0xe2,0x0, 0xcf,0x2, 0x1, 0xf0,0xaf,0x8, +0x0, 0xd2,0x38,0x82,0xf0,0x0, 0xab,0x18,0x17,0x0, 0xf0,0x0, 0xaa,0x8, 0x0, 0xcb, +0x8, 0xb6,0xc0,0x4c,0xe0,0x1, 0x1a,0x8e,0xe0,0x2, 0x1f,0xfd,0x8d,0x5, 0xf0,0x0, +0x8a,0x6f,0xf0,0x0, 0x89,0x7f,0xe0,0x3, 0x25,0x6b,0x14,0x7f,0x3c,0x1a,0xe2,0x1, +0xc4,0x7f,0xc4,0x1, 0xe0,0x2, 0x19,0x5e,0xe4,0x0, 0xc4,0xa, 0x14,0x9c,0x15,0x84, +0x16,0x10,0x3f,0xe2,0x3c,0x90,0x3d,0x90,0x3e,0x10,0x3c,0x12,0x16,0xff,0x17,0x0, +0xae,0xcf,0xc7,0x8a,0x3f,0xf8,0xe1,0x80,0xae,0x99,0xe1,0x80,0xaf,0x1b,0xe1,0x80, +0xaf,0x1c,0x1, 0xf7,0xe0,0x2, 0x1a,0x5f,0xea,0x23,0x79,0x94,0xf0,0x0, 0x8b,0x4, +0xf0,0x0, 0x2b,0x22,0x8f,0x83,0x27,0x97,0xe0,0x3, 0x25,0x50,0x17,0x7f,0x3f,0x1a, +0xe2,0x1, 0xc7,0x7f,0xc7,0x1, 0xe4,0x0, 0xc7,0xa, 0xe0,0x2, 0x1f,0xde,0x39,0x1e, +0xe0,0xff,0x17,0x7f,0xe0,0x12,0xb7,0x7f,0xc7,0x8a,0x39,0x7f,0xe0,0x12,0xb7,0x3f, +0x1, 0xfa,0x8f,0x84,0xe0,0x2, 0x1c,0x57,0x14,0x84,0x3c,0x90,0xaf,0x83,0xdf,0x61, +0xc0,0x34,0xb, 0x61,0xf0,0x0, 0x8b,0x83,0xf0,0x2, 0x23,0x8f,0xe0,0x3, 0x25,0x31, +0x16,0xff,0x3e,0x9a,0xe2,0x1, 0xc6,0xff,0xe0,0x1, 0x1f,0x7f,0xf0,0x1, 0x1a,0xe5, +0xe0,0x26,0xc6,0xb6,0x36,0xa2,0x3e,0x9e,0xe8,0x40,0x3f,0xe5,0xe0,0xff,0x17,0x7f, +0xb7,0xf, 0xc7,0x84,0x3f,0xfd,0xe0,0x40,0xb7,0x1f,0xe0,0x2, 0xb7,0x2f,0xe0,0x2, +0xb7,0x3f,0x1, 0xf7,0x17,0x81,0xf0,0x13,0x32,0x26,0xf0,0x14,0x31,0x26,0xf9,0x31, +0x3b,0x96,0xf1,0x2e,0x3b,0x9f,0xf1,0xff,0xc1,0xdf,0xf1,0xff,0xc2,0x5f,0x14,0x0, +0xf0,0x11,0x38,0xde,0xf8,0x43,0x39,0x93,0xf8,0x43,0x3a,0x14,0xf0,0x40,0x39,0x6f, +0xf0,0x40,0x38,0x68,0x25,0x19,0x17,0x80,0x16,0x10,0xe0,0x2, 0x1f,0x57,0x3e,0x10, +0x3e,0xef,0x9d,0x9e,0xe4,0xd, 0x36,0xc8,0xe2,0xff,0xcd,0xff,0x1, 0x4, 0x8c,0x8c, +0xe0,0x1, 0x24,0xec,0xc7,0x81,0xe4,0xd, 0x37,0xa8,0xe4,0xb, 0x36,0xc8,0x3d,0x7b, +0xc7,0xa, 0xc6,0x1, 0x2, 0xef,0xc4,0x1, 0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40, +0x3b,0xff,0xf0,0x0, 0xc2,0x84,0x2, 0xdf,0xe0,0x0, 0x25,0x40,0x14,0x7f,0x3c,0x1a, +0xe2,0x1, 0xc4,0x7f,0xc4,0x1, 0x14,0x8a,0x3c,0xb8,0xea,0x23,0x7e,0x80,0xea,0x22, +0x7f,0x6c,0xe0,0x2, 0x1f,0xde,0x3c,0x92,0xe0,0x12,0x95,0xff,0xe0,0x13,0x96,0xf, +0xc7,0x8a,0x3f,0xf9,0xe1,0x80,0xb5,0x9d,0xe1,0x80,0xb6,0x1e,0x1, 0xf6,0x15,0x9c, +0x3d,0x90,0x3c,0x1b,0x10,0x81,0x13,0x0, 0x0, 0x84,0xc5,0x81,0x3d,0xf8,0x1, 0x1d, +0x8f,0x8b,0xe2,0x1, 0xcf,0xff,0x1, 0xfa,0x4f,0x10,0x16,0x91,0x3e,0x90,0x17,0x81, +0xe0,0x2, 0x27,0x29,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3f,0x7a,0x3c,0xef,0x3, 0xee, +0xe1,0x80,0x8e,0x1d,0xc7,0x81,0x2e,0x77,0xaf,0xb, 0xe2,0x0, 0x7e,0x90,0xc5,0x81, +0x3c,0x9d,0x3d,0xf8,0xa8,0x89,0x1, 0xe5,0x15,0xff,0xe8,0xb, 0x3d,0x96,0xe2,0x1, +0xc5,0xff,0xc5,0x81,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1f,0xde,0xe0,0x1, 0x1f,0x66, +0x3d,0x92,0x96,0xf, 0x96,0x9f,0xc7,0x8a,0xb6,0xe, 0x3f,0xfb,0xc7,0x4, 0xe0,0x40, +0xb6,0x9e,0x1, 0xf8,0xe0,0x1, 0x1e,0xe0,0xe0,0x1, 0x1f,0x5f,0xe0,0x1, 0x1f,0xf9, +0x36,0xc1,0x37,0xc1,0x37,0x41,0xe2,0x0, 0x7c,0x28,0x7f,0x8d,0x7e,0x8b,0x7f,0xc, +0xf0,0x0, 0x6b,0xa8,0xf0,0x0, 0x6b,0x29,0xe0,0x1, 0xd2,0x36,0x8f,0x84,0x8c,0x5, +0x27,0xae,0x15,0x7f,0xe0,0x1, 0x1f,0xf8,0x3d,0x18,0xe2,0x1, 0xc5,0x7f,0xe0,0x4d, +0xc5,0x12,0x9a,0x8f,0xe0,0x1, 0x1f,0xff,0x35,0x21,0x14,0x80,0xf0,0x2, 0x1b,0xd7, +0x3d,0x1f,0xf0,0x0, 0x13,0x1, 0x38,0xe9,0x24,0x14,0x3d,0xe9,0xe2,0x1, 0xc5,0xff, +0x3a,0xfb,0xe0,0x1, 0x1f,0x78,0x17,0x81,0x1, 0x88,0xe0,0x1, 0x0, 0x9d,0xe0,0x80, +0x9e,0x9e,0x3e,0xfb,0xe0,0x1, 0x1, 0x1a,0x3d,0x7e,0x3e,0x6f,0xc7,0x81,0x1, 0xf8, +0xc4,0x81,0x8f,0x84,0xe2,0x1, 0xc4,0xff,0x3f,0xf9,0x2, 0xe7,0xe7,0xfe,0x24,0x3, +0x16,0xff,0x3e,0x98,0xe2,0x1, 0xc6,0xff,0x17,0x4, 0x3f,0x10,0xc6,0x81,0xe0,0x2, +0x1f,0xde,0x3e,0x9e,0xe0,0xff,0x15,0xff,0xe1,0x80,0x8e,0x1e,0xe2,0x0, 0xce,0x1, +0x1, 0x5, 0xe0,0x12,0xb5,0xff,0xe0,0x13,0xb5,0x8f,0x3e,0xfe,0xc7,0x8a,0x1, 0xf5, +0x8f,0x84,0xe7,0xfd,0x0, 0xe9,0xe0,0x2, 0x1c,0xd7,0x15,0x1, 0x17,0x8a,0xe8,0xf, +0x3f,0xb7,0x16,0x1, 0xe0,0xe, 0x39,0x1f,0x96,0x8e,0x95,0x9e,0x3f,0x99,0xb6,0x9f, +0xe8,0xc, 0x3e,0x17,0xb5,0xaf,0xe2,0x0, 0x7e,0x84,0xe8,0xd, 0x3e,0x97,0x8f,0x84, +0xf0,0x0, 0xab,0xce,0xf0,0x40,0x3b,0xec,0xf2,0x1, 0xc3,0xff,0xe8,0x40,0x3f,0xf7, +0xad,0xd, 0x2, 0xe5,0xe7,0xfd,0x0, 0xc8,0xf0,0x0, 0x28,0x9c,0x97,0x2e,0xe8,0x0, +0xb5,0x85,0xe8,0x0, 0xb7,0x15,0xe2,0x0, 0x7f,0x1c,0xe2,0x0, 0x7e,0x10,0x3f,0x18, +0x3f,0x9c,0xc4,0x1, 0xf0,0x0, 0xa9,0xf, 0x3f,0xe8,0xe2,0x1, 0xc7,0xff,0xf0,0x40, +0x3b,0xff,0xae,0x8e,0xf0,0x0, 0xc2,0x84,0xe7,0xfd,0x2, 0xee,0xe7,0xfe,0x0, 0x8e, +0xea,0x23,0x7e,0x0, 0xe0,0x6, 0x37,0xa1,0x3e,0x16,0x98,0x8c,0xe2,0xff,0xc8,0xff, +0x1, 0x5e,0xea,0x22,0x7c,0xec,0x9e,0x2e,0xe0,0xe, 0x35,0xa1,0x3c,0x96,0x3f,0x21, +0x95,0x89,0xe0,0x43,0x3f,0x1e,0x36,0x21,0xe2,0x0, 0xcf,0x0, 0x3e,0x2b,0xe0,0x43, +0x3e,0x1c,0x3d,0xee,0xe0,0x0, 0x4, 0x43,0xe2,0x0, 0xce,0x0, 0xe0,0x43,0x3d,0x9b, +0x3f,0x6c,0x4, 0x39,0xf0,0x40,0x39,0xfb,0xe0,0x43,0x3f,0x1e,0xe8,0x6b,0x3d,0x23, +0xf0,0x40,0x3a,0x7e,0xe8,0x0, 0xb5,0x85,0xe8,0x6e,0x3d,0x24,0xe8,0x0, 0xb7,0x15, +0xe7,0xff,0x0, 0xbb,0xe0,0x40,0x3e,0x61,0xe2,0x0, 0x7f,0x9c,0x3e,0x1f,0x8f,0x8c, +0xe2,0x1, 0xcf,0xff,0xe7,0xfe,0x1, 0x66,0x17,0xa, 0x3f,0x39,0x16,0x8a,0x3f,0x12, +0x3e,0xbf,0x96,0x1e,0x95,0x8e,0xaf,0xce,0xe8,0xe, 0x3e,0x97,0xe2,0x0, 0x7e,0x84, +0x3f,0x9d,0xb5,0x9e,0xc4,0x81,0xb6,0x2e,0xe2,0x1, 0xc4,0xff,0xf0,0x0, 0xab,0xf, +0x8f,0x84,0x3f,0xf9,0xe7,0xfe,0x2, 0xba,0xe7,0xfe,0x0, 0xd2,0xe0,0x2, 0x19,0x5e, +0xe7,0xfc,0x0, 0xb2,0xe8,0x40,0x3f,0x60,0x0, 0xc6,0xe8,0x40,0x3d,0xe0,0xe7,0xff, +0x0, 0xbd,0x3c,0xe6,0xe7,0xfd,0x0, 0xe2,0x3f,0xea,0xe7,0xfc,0x0, 0xc5,0xf0,0x1, +0x1a,0xe5,0xe7,0xfc,0x0, 0xe9,0x8, 0xb3,0x3f,0x83,0xef,0xfa,0xdf,0xa, 0x14,0x0, +0xef,0xfa,0xde,0xe6,0xef,0xfb,0xd2,0x56,0xef,0xfa,0xdf,0x46,0xef,0xfa,0xd8,0x96, +0xef,0xfa,0xd9,0xf2,0xef,0xfa,0xdf,0x71,0xea,0x23,0x7f,0x18,0x16,0x80,0xea,0x23, +0x7f,0x96,0xb6,0x8e,0xe0,0x13,0x17,0x44,0xb7,0xf, 0xef,0xfa,0xdf,0x20,0xe0,0x2, +0x19,0xe6,0xef,0xfb,0xd1,0x2a,0xef,0xfa,0xdf,0x40,0xef,0xfa,0xdf,0x93,0x17,0x83, +0xaf,0x83,0xef,0xfd,0xd8,0x6a,0xef,0xfa,0xdf,0xbc,0xef,0xfb,0xd2,0xe1,0xef,0xfb, +0xd1,0xda,0x3b,0x0, 0xe0,0x1, 0x19,0x42,0xef,0xfa,0xda,0x2a,0xe0,0xe, 0x8c,0xa2, +0xe0,0xe, 0x8c,0x12,0xe0,0x1, 0x15,0x78,0xe0,0x0, 0xdf,0xa0,0x87,0x83,0xe0,0x10, +0x8f,0x72,0xe2,0x0, 0xc7,0x81,0x3f,0x7f,0x1, 0x11,0xe0,0xe, 0x8d,0x82,0xe0,0xd, +0x8d,0x62,0xe0,0xd, 0x8c,0xf2,0xe0,0xd, 0x8c,0x52,0x16,0x18,0xe0,0x0, 0xdf,0xa6, +0xe0,0x3, 0x1f,0xb4,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xe0,0xd, 0x8d,0xf2,0xe0,0xd, +0x8d,0x52,0xe0,0xe, 0x8c,0x82,0xe0,0xd, 0x8c,0x62,0x16,0x18,0xe0,0x0, 0xdf,0x96, +0xe0,0x3, 0x1f,0xb4,0x17,0x0, 0xaf,0xf, 0x9, 0xe1,0xea,0x23,0x7f,0x18,0xea,0x23, +0x7f,0x96,0x16,0x80,0xb6,0x8e,0xb4,0xf, 0x38,0x82,0xea,0x23,0x7f,0x18,0x97,0x8e, +0xea,0x23,0x7e,0x96,0xc7,0x81,0x9e,0x8d,0xe3,0xff,0xc7,0xff,0x3e,0xff,0xb7,0x8e, +0x2, 0x82,0x38,0x82,0xe7,0x5e,0x0, 0xe1,0xe0,0x2, 0x1f,0xdf,0xe0,0x2, 0x1e,0xde, +0x8f,0xf, 0xe2,0x0, 0xcf,0x1, 0x1, 0xd, 0xea,0x23,0x7f,0x32,0x16,0x0, 0xea,0x23, +0x7e,0xb3,0xeb,0xff,0x7f,0xd8,0xae,0xe, 0x17,0x1e,0xae,0xd, 0xaf,0xf, 0x38,0x82, +0xfa,0x23,0x7b,0x33,0xe8,0x0, 0x8f,0x86,0x2f,0x96,0xe0,0x19,0x9f,0x8d,0xe2,0x2, +0xcf,0x80,0xe0,0x6, 0x9f,0xbd,0xe0,0x1, 0x1, 0x17,0xe0,0x6, 0x9e,0x2d,0xea,0x23, +0x7d,0xb2,0x8f,0xb, 0xe2,0x0, 0xcf,0x1, 0x1, 0x36,0xea,0x23,0x7f,0x1c,0xb6,0xe, +0xb7,0x9e,0x38,0x82,0xe2,0x0, 0xcf,0x81,0x1, 0xf, 0xea,0x23,0x7d,0xb2,0x8f,0x8b, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x69,0xea,0x23,0x7f,0x1c,0xe0,0x6, 0x9f,0xbd, +0xe0,0x6, 0x9e,0x2d,0x0, 0xed,0xe0,0x19,0x9f,0x8d,0xf0,0x6, 0x9a,0x3d,0xe2,0x2, +0xcf,0x81,0xf0,0x6, 0x99,0xad,0xe0,0x1, 0x1, 0x16,0xea,0x23,0x7d,0xb2,0x8f,0x8b, +0xe2,0x0, 0xcf,0x81,0xe0,0x1, 0x1, 0x6d,0xf2,0xa, 0xca,0x50,0xe0,0x1, 0x2, 0xd9, +0xeb,0xff,0x7c,0x58,0x17,0x81,0xaf,0x8b,0x17,0x1d,0x17,0x9d,0xaf,0x88,0xf0,0x40, +0x3b,0xee,0x0, 0x8b,0xeb,0xff,0x7c,0x58,0xf0,0x0, 0x8b,0x88,0xf0,0x40,0x3a,0x6f, +0xe8,0x40,0x3f,0x67,0xf0,0x40,0x39,0xec,0xe0,0x1, 0x1f,0xd5,0xe0,0x0, 0x14,0xc0, +0x3f,0x9e,0xea,0x23,0x7f,0x1c,0x8f,0x8f,0x9d,0xe, 0xf0,0x0, 0x9a,0x9e,0x3c,0xaf, +0xe0,0xc, 0x3d,0x3f,0xf0,0x12,0x39,0xb9,0xe8,0xf, 0x3f,0xb5,0xe8,0x9, 0x3c,0xb4, +0xe8,0xc, 0x3e,0x12,0x3f,0x99,0x36,0x46,0x37,0xc6,0xe3,0xff,0xc6,0x7f,0xe3,0xff, +0xc7,0xff,0x14,0x80,0xe8,0x0, 0xac,0x86,0xe0,0x6, 0xb6,0x2d,0xe0,0x6, 0xb7,0xbd, +0xf0,0x0, 0x2b,0x86,0xf0,0x0, 0xab,0x8b,0xe7,0xff,0x0, 0x9b,0xf0,0xa, 0x39,0xaa, +0xe0,0x43,0x3d,0x1a,0xe4,0xb, 0x35,0xf, 0xe2,0xd, 0x3d,0xca,0x3e,0xab,0xe0,0x43, +0x3e,0x9d,0x15,0x82,0xe0,0x2d,0x3e,0x9b,0x2e,0x90,0xf8,0xd, 0x3a,0x25,0xe0,0x43, +0x3e,0x9d,0xe4,0xa, 0x36,0x8f,0xe2,0xd, 0x3d,0x4d,0x3e,0xaa,0xe0,0x43,0x3e,0x9d, +0xe0,0x2d,0x3e,0x9b,0xe7,0xfe,0x26,0xfd,0xf1,0xff,0xc3,0xff,0xf0,0x0, 0xab,0x88, +0xe7,0xfe,0x0, 0xf7,0xe7,0xf5,0x16,0x2f,0x3e,0x1f,0xe2,0x0, 0xce,0x4e,0xe0,0x6, +0x9e,0x2d,0xe7,0xfe,0x2, 0xe6,0xe7,0xff,0x15,0xaf,0x3d,0x9c,0xe2,0x4, 0xcd,0xa4, +0xe7,0xfe,0x2, 0xdf,0xea,0x23,0x7d,0xb2,0x8c,0x8b,0xea,0x23,0x7d,0x28,0xeb,0xff, +0x7c,0x58,0xe8,0x0, 0xaf,0x6, 0xe2,0x0, 0xcc,0x81,0x17,0x1e,0xb6,0xa, 0xb7,0x9a, +0xaf,0x8, 0xe7,0xfe,0x1, 0xd4,0xf0,0x40,0x39,0xec,0xf0,0x40,0x3a,0x6f,0xe7,0xfe, +0x0, 0xfd,0xe7,0xf5,0x17,0xaf,0xe8,0xf, 0x3f,0x94,0xe2,0x0, 0xcf,0xce,0xe7,0xfe, +0x2, 0xe6,0xea,0x23,0x7f,0xa8,0xf0,0x0, 0x9b,0x8f,0x9c,0x1f,0xf8,0xb, 0x39,0xa7, +0xe0,0x43,0x3d,0x9b,0xe4,0xe, 0x35,0x8f,0xf0,0xc, 0x3a,0x28,0xe0,0x43,0x3e,0x1c, +0xe2,0xf, 0x3f,0x4b,0xe4,0x9, 0x36,0xf, 0x3f,0xae,0xe0,0x43,0x3f,0x9f,0xe2,0xe, +0x3c,0xcc,0xe0,0x0, 0x15,0x63,0x3f,0x29,0xe0,0x29,0x3d,0x2f,0xe0,0x43,0x3f,0x1e, +0x24,0xaf,0xe0,0x2a,0x3d,0x2e,0x25,0x2c,0x3f,0x9e,0xe2,0x1, 0xcf,0x95,0x2, 0x28, +0x35,0x82,0x36,0x2, 0xe8,0xb, 0x3d,0x97,0x3e,0x18,0xf0,0x40,0x39,0xeb,0xf0,0x40, +0x3a,0x6c,0xf3,0xff,0xc1,0xff,0xf3,0xff,0xc2,0x7f,0xf0,0x6, 0xb1,0xad,0xf0,0x6, +0xb2,0x3d,0xe7,0xfe,0x0, 0xac,0xeb,0xff,0x7c,0x58,0xf0,0x0, 0x8b,0x88,0xf0,0x6, +0x99,0xad,0xe8,0x40,0x3f,0x67,0xf0,0x6, 0x9a,0x3d,0xe7,0xfe,0x0, 0xbf,0xea,0x23, +0x7f,0x1c,0xe8,0x40,0x3f,0xe4,0xe8,0x40,0x3e,0x63,0xe7,0xfd,0x0, 0xfa,0xea,0x23, +0x7d,0xb2,0xeb,0xff,0x7c,0x58,0x17,0x81,0xaf,0x8b,0xe7,0xfe,0x0, 0x9f,0xeb,0xff, +0x7c,0x58,0xe7,0xfe,0x0, 0x9b,0xf0,0x2, 0x1b,0x5e,0xe4,0x0, 0xc5,0xa, 0xf0,0x1, +0x1a,0xd7,0xf0,0xe, 0x3b,0x1a,0xf0,0xd, 0x8b,0x8e,0xe8,0x0, 0x8e,0x85,0xe0,0xd, +0x87,0xae,0xe8,0x40,0x3e,0xf7,0xe4,0xf, 0x37,0xac,0xe0,0xd, 0x8f,0x1e,0xe4,0xf, +0x37,0xc8,0x5, 0x9a,0xe0,0x2, 0x1e,0xcf,0xe0,0x2, 0x1d,0xa6,0x8e,0x8d,0x26,0xa2, +0xe0,0x0, 0x1e,0x4f,0xe8,0xe, 0x3d,0x97,0xe8,0xf, 0x3e,0x17,0x8f,0xe, 0x8f,0x8f, +0x16,0x8a,0xe8,0xd, 0x3e,0xb7,0xe8,0xd, 0x3e,0x96,0xe0,0x2, 0xc6,0xac,0x8e,0x8d, +0xe2,0x0, 0xce,0x81,0x1, 0x31,0xe8,0x2, 0x8e,0xe5,0xe2,0x1, 0xce,0xff,0x1, 0x87, +0xe8,0xa, 0x3d,0x16,0xe0,0xd, 0x8f,0xa, 0xe1,0x2e,0x3f,0xd, 0xaf,0x8, 0xaf,0x89, +0x38,0x82,0xe8,0xc, 0x3d,0x97,0x8e,0x8c,0x2e,0xa9,0xaf,0xc, 0xe0,0x0, 0x1e,0x4f, +0xe8,0x14,0x3e,0x17,0xe8,0x0, 0x8e,0x84,0x26,0xb9,0xe0,0x13,0x3f,0xad,0xf8,0x43, +0x39,0x13,0xf2,0x0, 0xc9,0x0, 0xf8,0x41,0x39,0x42,0xe8,0x73,0x3d,0x22,0xf2,0x0, +0xc9,0xa0,0x5, 0x30,0x3f,0xfd,0x5, 0xa6,0x17,0x90,0x3f,0x9d,0xe2,0x1, 0xc7,0xff, +0xe8,0x0, 0xaf,0x84,0x0, 0xc6,0x16,0x80,0xe8,0xb, 0x3d,0x97,0xe8,0xc, 0x3e,0x17, +0x17,0x80,0xae,0x8b,0x3f,0x6f,0xae,0x8c,0x0, 0xc7,0xe0,0x14,0x3f,0x2d,0xf8,0x43, +0x39,0x94,0xf2,0x0, 0xc9,0x80,0xf8,0x41,0x39,0xc3,0xe8,0x74,0x3d,0x23,0xf2,0x0, +0xca,0xf, 0x5, 0x13,0x3f,0x7d,0x5, 0x94,0x17,0x1, 0x3f,0x1d,0xe2,0x1, 0xc7,0x7f, +0x0, 0xc5,0x17,0xf0,0x3f,0x9d,0xe2,0x1, 0xc7,0xff,0xe8,0x0, 0xaf,0x84,0xe7,0xff, +0x0, 0xa1,0x3f,0xed,0xe7,0xff,0x0, 0x9e,0x3f,0x6d,0xe7,0xff,0x0, 0xb9,0x17,0x7f, +0x3f,0x1d,0xe2,0x1, 0xc7,0x7f,0xaf,0xc, 0xe7,0xff,0x0, 0xb2,0xe0,0x2, 0x1e,0xde, +0xe0,0x19,0x9f,0x8d,0xe2,0x0, 0xcf,0x81,0x1, 0x1f,0xe0,0x2, 0x1f,0xcc,0x8f,0xf, +0x27,0x1a,0xe0,0x0, 0x1f,0xc5,0xe0,0x2, 0x1e,0x58,0x94,0xf, 0x94,0x9f,0x95,0x2f, +0x95,0xbf,0x97,0xcf,0xe0,0x6, 0xb4,0x2d,0xe2,0x0, 0xcf,0x3, 0xb4,0x9c,0xb5,0x2c, +0xb5,0xbc,0xb7,0xcc,0x1, 0x27,0xe2,0x0, 0xcf,0x1, 0x1, 0x2, 0x17,0x2, 0xe0,0x2, +0x1f,0xd7,0xaf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0xcb,0x87,0x8f,0xc7,0xff,0xe2,0x1, +0xc7,0xff,0xe2,0x0, 0xcf,0xba,0x2, 0xda,0xe0,0x0, 0x1f,0xc5,0xe0,0x2, 0x1f,0x58, +0x94,0x8f,0x95,0x1f,0x95,0xaf,0x96,0x3f,0xe0,0x2, 0x1c,0x4c,0x97,0xcf,0xe0,0x6, +0xb4,0xad,0xf0,0x0, 0x13,0x83,0xf0,0x0, 0xab,0x88,0xb5,0x1e,0xb5,0xae,0xb6,0x3e, +0xb7,0xce,0x17,0x0, 0xe0,0x2, 0x1f,0xd7,0xaf,0xf, 0x38,0x82,0x8, 0xb7,0xf8,0x0, +0xc, 0x3e,0xc0,0x5c,0xe0,0x2, 0x18,0xc0,0xe0,0x1, 0x1e,0xda,0x17,0x80,0xe0,0xa, +0x8f,0x1, 0x6f,0xa6,0x7c,0x8, 0x6f,0xa7,0xaf,0x9d,0xe0,0x4, 0x27,0x5a,0xe0,0x2, +0x1a,0xdc,0xf0,0x2, 0x1f,0x5e,0x7a,0x86,0xef,0xfc,0xd3,0xb8,0xe0,0x1, 0x1b,0xd7, +0xdf,0x9e,0x8a,0x7, 0xe0,0x0, 0x22,0x4a,0xf0,0x1, 0x1e,0x8e,0xfa,0x23,0x7c,0x38, +0xe8,0x0, 0x8c,0x8d,0xe0,0x2, 0x1e,0x5e,0xe0,0x2, 0x18,0xd7,0x16,0x80,0x0, 0x87, +0xc6,0x81,0x3f,0xed,0xe2,0x1, 0xc7,0xff,0x3f,0xf4,0x3, 0xbb,0xe0,0xd, 0x8f,0x8c, +0x15,0x8a,0x3f,0xf9,0xc6,0xa, 0x3d,0xbf,0x3, 0xf4,0xe0,0xa, 0x3d,0x91,0x8f,0xa, +0xe2,0x0, 0xcf,0x1, 0x1, 0xee,0xf0,0x2, 0x3c,0x1f,0x8f,0x2, 0x2f,0x6a,0xe0,0x1, +0x87,0xa, 0xc7,0x7f,0xe2,0x1, 0xc7,0x7f,0xe2,0x0, 0xcf,0x3a,0x2, 0xe2,0xea,0x23, +0x7e,0x34,0xe4,0x0, 0xc6,0x8a,0x14,0x83,0xac,0x82,0xe0,0x0, 0xc6,0xe4,0xaf,0x8c, +0xe8,0xd, 0x3e,0x9e,0xe0,0x0, 0x1e,0x45,0x3d,0x9c,0x94,0x9b,0x91,0xb, 0x90,0xab, +0x94,0x3b,0x96,0x4b,0xb4,0x9d,0x14,0x83,0xb1,0xd, 0xb0,0xad,0xb4,0x3d,0xb6,0x4d, +0x16,0x80,0xae,0x8a,0xe0,0x6, 0x0, 0xcd,0xfa,0x23,0x7c,0x38,0xf0,0x1, 0x1e,0x8e, +0xea,0x23,0x7f,0xb4,0x8f,0x8f,0xf0,0xd, 0x3c,0x1f,0x8c,0x8d,0xe0,0x6, 0x2c,0x98, +0xe0,0x2, 0x1e,0xd5,0xe0,0x2, 0x1f,0x54,0x8f,0x8d,0x7e,0x87,0x7f,0x5, 0xe0,0x4, +0x27,0x86,0xe0,0x2, 0x1e,0x4c,0x89,0xc, 0x7e,0x3, 0xe0,0x4, 0x29,0xe, 0xe0,0x0, +0x1f,0x1b,0xf0,0x0, 0x1c,0x98,0x8f,0x8e,0x15,0x3e,0xe2,0x0, 0xcf,0x80,0xe0,0x1, +0x1f,0xda,0xe0,0x1, 0x14,0xff,0xe0,0x79,0x39,0x2f,0xe8,0x40,0x3c,0x69,0xf0,0x0, +0x7c,0x82,0xe0,0x1, 0xd3,0x11,0xe0,0x4, 0x22,0x65,0x12,0x0, 0xf0,0x2, 0x1c,0xd7, +0xf0,0x0, 0x1d,0x17,0xf0,0x0, 0x7c,0x4, 0xf0,0x40,0x3e,0x64,0xf8,0x40,0x3c,0x6d, +0x39,0xe4,0x39,0x64,0xf8,0x40,0x3e,0xee,0xf0,0x0, 0x17,0xa, 0xf0,0x1e,0x3f,0x33, +0xe8,0x0, 0x8e,0x8, 0xf8,0xe, 0x3e,0x9e,0xe0,0xd, 0x8d,0xe, 0x3d,0x7c,0xe0,0x1, +0x3, 0x90,0x17,0x8f,0xe0,0x6, 0x35,0x22,0x3f,0xda,0xe4,0x0, 0xc7,0x8a,0xf0,0xd, +0x3d,0x16,0x8c,0xbd,0xe8,0xf, 0x3f,0x99,0x8a,0x8f,0x24,0xb8,0xe0,0x6, 0x9c,0x2e, +0x2c,0x4, 0xe0,0x6, 0x9f,0xbe,0x27,0xb2,0xe2,0x0, 0xcc,0x84,0x10,0xb8,0x2, 0x8d, +0x10,0xb0,0x1, 0xb, 0xe2,0x0, 0xcc,0x83,0x10,0xa0,0x1, 0x7, 0xe2,0x0, 0xcc,0x82, +0x10,0x98,0x17,0x90,0xe0,0x61,0x39,0xaf,0x26,0x1d,0xf0,0x2, 0x1b,0x98,0xe8,0x0, +0x87,0xc7,0xe2,0x0, 0xc7,0x8f,0x3f,0xfa,0xe0,0x2, 0x1, 0x6d,0xe0,0x2, 0x1e,0x98, +0x17,0x81,0x0, 0x89,0xe0,0x1, 0x87,0x6d,0xc6,0x8a,0xe2,0x0, 0xc7,0xf, 0x3f,0x7a, +0xe0,0x2, 0x1, 0x62,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0x3d,0xef,0xc7,0x81, +0x2, 0xf2,0xf0,0xf, 0x3d,0x16,0xc4,0xff,0xac,0xbf,0x17,0xa, 0x3f,0x3a,0xf0,0xf, +0x3c,0x9e,0x8e,0x8f,0xe2,0x0, 0xce,0x81,0xe0,0x1, 0x1, 0x2, 0xe0,0x1, 0x2a,0x8c, +0x66,0x84,0x3e,0x9a,0x8e,0x8d,0xe0,0x1, 0x2e,0xdf,0x62,0x83,0x8e,0x85,0xe0,0x1, +0x2e,0xdb,0xf8,0xd, 0x3e,0x9e,0xe0,0x6, 0x9e,0xad,0xe2,0x0, 0xce,0x9e,0xe0,0x3, +0x2, 0x96,0xf8,0x9, 0x3e,0x9e,0xe0,0x6, 0x9e,0x39,0xe2,0x0, 0xce,0x13,0xe0,0x3, +0x5, 0x9b,0xe0,0x1, 0x18,0xaf,0xe0,0x1, 0x1a,0xae,0x8c,0x1, 0x8d,0x85,0x34,0x28, +0x3d,0xc8,0xc5,0xed,0x3d,0xfc,0xe0,0x3, 0x5, 0xf, 0xe0,0x2, 0x1d,0xfd,0xe0,0xd, +0x8c,0x39,0x8d,0xdb,0xe0,0xd, 0x8c,0xc9,0x3d,0xb8,0xe0,0x1, 0x18,0xf2,0x3d,0x99, +0xa0,0x81,0x35,0xa1,0x3d,0x91,0x95,0x8b,0xe2,0x1, 0xcd,0xc7,0xe0,0x6, 0x2, 0x4f, +0xe2,0x0, 0xce,0x9e,0xe0,0x6, 0x2, 0xbe,0x17,0x3, 0xaf,0xf, 0xaf,0x1f,0xc1,0x81, +0x8f,0x87,0xe2,0x1, 0xc1,0xff,0x3f,0xf3,0xe7,0xfe,0x2, 0xe0,0xe0,0x2, 0x1f,0x40, +0xe0,0x2, 0x1e,0x4a,0xe0,0xa, 0x8f,0x8e,0xf0,0x0, 0x63,0x82,0x86,0xc, 0xe2,0x0, +0xcf,0x81,0xe8,0x0, 0xa9,0x17,0xf8,0x40,0x3e,0xe8,0xe8,0x0, 0xae,0x7, 0xe0,0x4, +0x1, 0x71,0xe0,0x3, 0x22,0x2d,0x62,0x88,0x11,0x1, 0xe0,0x5, 0x2a,0xaa,0x66,0x5, +0x8f,0x8c,0xe0,0x2, 0x2f,0xaf,0xe8,0x0, 0x89,0x8d,0x67,0x7, 0xe4,0x0, 0xc1,0x8a, +0xf0,0x0, 0x63,0x85,0x62,0x86,0xe0,0x2, 0x1c,0xd8,0xe0,0x2, 0x1c,0x18,0x17,0x80, +0x3d,0x63,0xaf,0x8e,0xe8,0x0, 0xaf,0x87,0xaf,0x85,0xe0,0x1, 0xd1,0xf3,0xe0,0x3, +0x22,0x33,0x3c,0x62,0xc0,0x24,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0x66,0x84,0x3e,0x9a, +0x8e,0x8d,0x2e,0x87,0xf0,0x0, 0x63,0x83,0xe8,0x0, 0x8e,0x87,0xe0,0x2, 0x26,0x93, +0xe0,0x0, 0x22,0xda,0xe2,0x0, 0xca,0x83,0xe7,0xff,0x1, 0x33,0xe2,0x0, 0xca,0x81, +0xf8,0xf, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2f,0xf0,0x6, 0x9d,0xbf,0xe0,0x1, 0x1, 0x18, +0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63,0x3c,0x90,0x3c,0x10,0x7f,0x81,0xdd,0x84, +0x67,0x81,0xf2,0x1f,0xc5,0xff,0xe0,0xd, 0x8f,0x8f,0xe2,0x1f,0xc3,0x7f,0xe0,0xe, +0x37,0xac,0xe2,0x1, 0xcf,0xff,0xf0,0x1b,0x3d,0x9e,0xf3,0xff,0xc5,0xff,0xe0,0x0, +0x1, 0x79,0xe4,0x5, 0x32,0xae,0xe4,0x5, 0x32,0xc0,0xf0,0x0, 0x13,0x81,0xf0,0x17, +0x3b,0x92,0xe8,0x40,0x39,0x67,0xe2,0x1, 0xc1,0x7f,0xc2,0x1, 0x3b,0x15,0xe2,0x1, +0xc2,0x7f,0xe3,0xff,0xc3,0x7f,0x17,0x86,0xe8,0xf, 0x3f,0xbc,0x66,0x82,0xf0,0xe, +0x35,0xc8,0x3f,0x9d,0xaf,0x4f,0xe0,0xd, 0x33,0x48,0x47,0x26,0xae,0xaf,0xc1,0x81, +0xaf,0x6f,0xe2,0x1, 0xc1,0xff,0x47,0x27,0xab,0x3f,0xf0,0x0, 0xc6,0x1, 0xf0,0x0, +0xad,0xdf,0xf2,0x1, 0xc6,0x7f,0xaf,0x7f,0x8f,0x87,0x3f,0xf3,0xe7,0xfd,0x2, 0xc6, +0xe7,0xfe,0x0, 0xe6,0xf8,0xf, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2f,0xf0,0x6, 0x9d,0xbf, +0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63,0x3c,0x90,0x3c,0x10,0xdd,0x35,0xf8,0x1e, +0x3f,0x1d,0xe8,0xd, 0x8f,0x8e,0xf2,0x1f,0xc5,0xff,0xe0,0xe, 0x37,0xac,0xe2,0x1, +0xcf,0xff,0xf0,0x1b,0x3d,0x9e,0xe2,0x1f,0xc3,0x7f,0xf3,0xff,0xc5,0xff,0x1, 0x29, +0x12,0x80,0xe7,0xff,0x0, 0xb4,0x15,0x80,0xe4,0x0, 0xc5,0x8a,0xe0,0x2, 0x1e,0x18, +0x3d,0x9c,0x9b,0xb, 0xf0,0x0, 0x9d,0x9b,0x14,0xa7,0x14,0x26,0x3d,0xe2,0x3d,0x63, +0x3c,0x90,0x3c,0x10,0xef,0xff,0xdd,0x11,0xf8,0x1e,0x3f,0x1d,0xe8,0xd, 0x8f,0x8e, +0xf2,0x1f,0xc5,0xff,0xe0,0xe, 0x37,0xac,0xe2,0x1, 0xcf,0xff,0xf0,0x1b,0x3d,0x9e, +0xe2,0x1f,0xc3,0x7f,0xf3,0xff,0xc5,0xff,0xe0,0x80,0x12,0x80,0xe7,0xff,0x1, 0x97, +0xe1,0x80,0xc3,0x0, 0xe3,0xff,0xc3,0x7f,0xe7,0xff,0x0, 0x97,0x26,0x5e,0xe0,0x2, +0x1c,0x98,0x87,0xc9,0xe2,0x0, 0xc7,0x8f,0x3d,0x7f,0x1, 0x4e,0xe0,0x2, 0x1e,0x98, +0x3f,0xe5,0x0, 0x88,0xe0,0x1, 0x87,0x6d,0xc6,0x8a,0xe2,0x0, 0xc7,0xf, 0x3f,0x7a, +0x1, 0x44,0x3f,0x6f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0x3d,0xef,0xc7,0x81,0x2, 0xf3, +0x0, 0xc4,0x15,0x80,0xe0,0x2, 0x1f,0x18,0xe4,0x0, 0xc5,0x8a,0xf8,0xd, 0x3e,0x9e, +0x3d,0x9e,0xf0,0x6, 0x9a,0xbd,0x9f,0xb, 0x9f,0x9b,0xe0,0x0, 0x15,0xc0,0x3d,0xa1, +0x3c,0x3b,0x3f,0x31,0x3f,0xb1,0xe8,0xb, 0x3d,0xb5,0x3f,0x18,0x3f,0x9b,0x37,0x46, +0x37,0xc6,0xe0,0x6, 0xb7,0x2d,0xe0,0x6, 0xb7,0xbd,0xe7,0xfd,0x0, 0x8c,0xe0,0x2, +0x1f,0x4a,0xf0,0x2, 0x1f,0x5e,0x8f,0x8e,0xe0,0x1, 0x27,0xca,0xe0,0x2, 0x1e,0xdc, +0x17,0x81,0x7e,0x86,0xaf,0x8d,0x16,0xb7,0xe0,0x0, 0x1f,0x8d,0xe0,0x1a,0x9f,0xdf, +0xe1,0x2f,0x3f,0x9d,0xaf,0x8e,0xe7,0xfb,0x0, 0x99,0x62,0x85,0x8f,0x85,0xe7,0xfb, +0x2f,0xfa,0x66,0x6, 0x8c,0x8c,0xe7,0xfb,0x2c,0xf6,0xe0,0x2, 0x1a,0xcc,0x89,0x5, +0x7a,0x83,0xe0,0x4, 0x21,0x7e,0x66,0x83,0xc1,0x7f,0xa9,0xd, 0xe7,0xfb,0x0, 0xf1, +0x66,0x83,0x8f,0x8d,0xe7,0xfd,0x2f,0xd1,0xe0,0x2, 0x1c,0x57,0xd8,0x5a,0xe7,0xfd, +0x0, 0xcc,0xf0,0xb, 0x3d,0x16,0xae,0xbb,0xe0,0x2, 0x1d,0xef,0xe0,0x1, 0xae,0x8f, +0xae,0x8b,0xe7,0xfd,0x2a,0xe9,0xe7,0xfc,0x0, 0xe2,0xe0,0x1, 0x1c,0xb1,0xf0,0x1, +0x1b,0xb0,0x8d,0x89,0xe8,0x0, 0x8e,0x7, 0x35,0xa8,0x3e,0x4b,0xc6,0x62,0x3e,0xfc, +0xe7,0xfc,0x3, 0x61,0xe0,0x1, 0x8d,0x8f,0xe0,0x1, 0x25,0x87,0xe0,0x2, 0x1e,0x6f, +0x8e,0xc, 0xe0,0x1, 0x2e,0x2, 0xe0,0x0, 0x1c,0xc5,0xe0,0xc, 0x3c,0x9e,0x9d,0x8c, +0x9c,0x1c,0x2d,0x82,0x24,0x2b,0xf8,0x1, 0x3e,0x9e,0xe0,0x6, 0x9e,0x31,0xe0,0xb, +0x3e,0xab,0xe0,0xd, 0x3e,0x28,0xe4,0x8, 0x36,0x8f,0xe4,0xc, 0x35,0x8f,0xe2,0xd, +0x3c,0x4d,0xe2,0xb, 0x3e,0x4b,0x3e,0xa8,0xe0,0xc, 0x3d,0xac,0x3e,0x9c,0xe2,0x2, +0xce,0xac,0x2, 0x14,0x3f,0x19,0x94,0xe, 0x94,0x9e,0x95,0xae,0x96,0x3e,0x96,0xce, +0xe0,0x0, 0x17,0x64,0xe0,0x6, 0xb4,0x21,0x3f,0x11,0xf0,0x8, 0x3d,0x16,0x10,0x85, +0xa8,0xb8,0xb4,0x9e,0xb5,0xae,0xb6,0x3e,0xb6,0xce,0x17,0x3c,0xe0,0x1, 0xaf,0xf, +0xf8,0xe, 0x3e,0x9e,0xe0,0xd, 0x8c,0x3e,0xe0,0xd, 0x8c,0xce,0xe0,0x0, 0x0, 0xd1, +0xf0,0x2, 0x1b,0xc0,0xe0,0x2, 0x1e,0xca,0xe8,0xa, 0x8f,0x87,0x62,0x82,0x86,0x8d, +0xe2,0x0, 0xcf,0x81,0xaa,0x15,0xae,0x85,0xe0,0x1, 0x1, 0x44,0xf0,0x0, 0x63,0x86, +0xe8,0x0, 0x8f,0x87,0xe0,0x1, 0x2f,0xf8,0xf0,0x0, 0x63,0x85,0xe8,0x0, 0x89,0x7, +0xe0,0x2, 0x21,0x3a,0x62,0x83,0x89,0x5, 0xe0,0x4, 0x21,0x15,0xe8,0x0, 0x89,0x8d, +0x66,0x87,0xe4,0x0, 0xc1,0x8a,0x67,0x5, 0xf0,0x0, 0x63,0x86,0xe0,0x2, 0x1c,0xd8, +0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xaf,0x8d,0x39,0x6f,0xaf,0x8e,0xe8,0x0, 0xaf,0x87, +0xe0,0x1, 0xd0,0x40,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xe0,0x1, 0x14,0xff,0xe0,0x1, +0xd0,0x73,0x3c,0x62,0xc0,0x24,0xf8,0x0, 0xf, 0x28,0xb, 0xe1,0xe0,0x2, 0x1e,0x5c, +0x7e,0x6, 0xe7,0xfe,0x0, 0xba,0xf8,0xc, 0x3e,0x9e,0xe0,0x6, 0x9c,0xbc,0xe2,0x0, +0xcc,0xbc,0xe0,0x1, 0x5, 0x9c,0xe0,0xd, 0x8c,0x3c,0xe0,0xd, 0x8c,0xcc,0x7f,0x81, +0xef,0xfc,0xd0,0x8e,0xe0,0x2, 0x1e,0x8b,0xe2,0x0, 0xcc,0x1, 0xac,0xd, 0x67,0x81, +0xe0,0x3, 0x1, 0x0, 0xf8,0xd, 0x3e,0x9e,0xe0,0x6, 0x9b,0x2d,0xe2,0x0, 0xcb,0x1e, +0xe0,0x1, 0x5, 0xc5,0xe0,0x1, 0x1d,0xb1,0xf0,0x1, 0x1b,0xb0,0x8e,0xb, 0xe8,0x0, +0x8f,0x7, 0x36,0x28,0x3f,0x4c,0xc7,0x62,0x3b,0x7e,0xf0,0x6, 0x9d,0xbd,0xe0,0x2, +0x4, 0x7f,0xf2,0x0, 0xcd,0x94,0x5, 0x94,0xe0,0x1, 0x1f,0x2f,0xf0,0x1, 0x1b,0xae, +0x8e,0x8e,0xe8,0x0, 0x8f,0x7, 0x36,0xa8,0x3f,0x4d,0x16,0xec,0x3e,0x9e,0xf0,0x2d, +0x3d,0xad,0xe7,0xfc,0x26,0xef,0xe9,0x2e,0x3f,0x2b,0xe7,0xfc,0x27,0x6b,0x8f,0x6f, +0xe7,0xfc,0x2f,0x68,0x17,0x2, 0xaf,0x6f,0xe7,0xfc,0x0, 0xe4,0xe2,0x0, 0xcc,0x83, +0xe0,0x3, 0x1, 0x6b,0x22,0x1a,0xe8,0xd, 0x8e,0x8e,0xe2,0x1, 0xce,0xff,0xe0,0x3, +0x1, 0x3e,0xe0,0x2, 0x1e,0x5e,0x16,0x81,0x0, 0x89,0xe0,0xe, 0x8d,0xac,0xc6,0xa, +0xe2,0x1, 0xcd,0xff,0xe0,0x1, 0x1, 0x11,0x3e,0xee,0x3f,0x6d,0xe2,0x1, 0xc7,0x7f, +0x3f,0x74,0x17,0x1, 0x3f,0x1d,0x4, 0xf2,0xe2,0x0, 0xcc,0x81,0x15,0x8a,0x3d,0xbf, +0xe0,0x1, 0x1, 0x1c,0xe0,0x2, 0x1e,0xd7,0x3d,0x9d,0x16,0x82,0xae,0x8b,0xe0,0x2, +0x1a,0xd5,0x8e,0x85,0x7a,0x87,0xe0,0x2, 0x2e,0x98,0xe0,0x2, 0x1f,0x54,0x8e,0x8e, +0x7f,0x5, 0x26,0x9c,0xe7,0xf9,0x24,0xbf,0xe0,0x2, 0x1e,0x4c,0xe8,0xf, 0x3f,0x98, +0xc4,0xff,0x89,0xc, 0xac,0x8f,0x7e,0x3, 0xe7,0xf9,0x21,0x3b,0xe7,0xfd,0x0, 0xc5, +0x62,0x86,0x89,0x5, 0xe2,0x0, 0xc9,0x1, 0xe0,0x1, 0x1, 0x11,0x66,0x5, 0x11,0x0, +0x8f,0x8c,0xe7,0xfb,0x27,0x92,0xe7,0xfd,0x0, 0xbd,0xf0,0x0, 0x63,0x86,0xe8,0x0, +0x8e,0x87,0x2e,0xe1,0x2c,0xe2,0xe7,0xfd,0x0, 0xaa,0xe0,0x1, 0x18,0xb1,0xe0,0x1, +0x1a,0xb0,0x8c,0x1, 0x8c,0x85,0x34,0x28,0x3c,0xc8,0x3e,0xf9,0xe7,0xfe,0x2, 0x5d, +0xe0,0x0, 0x1c,0xac,0x8e,0x89,0xe2,0x0, 0xce,0x81,0xe7,0xfe,0x1, 0xd6,0xe0,0x2, +0x25,0xe2,0xe2,0x0, 0xcd,0xbb,0x2, 0x84,0xc5,0x81,0xe0,0x1, 0xad,0x8f,0x17,0x3, +0xaf,0xf, 0xaf,0x1f,0x17,0x80,0xaf,0x89,0x17,0x1, 0xe0,0x2, 0x1f,0xef,0xaf,0xf, +0xe7,0xfa,0x0, 0xbf,0x62,0x88,0x12,0x0, 0x11,0x1, 0xe7,0xfa,0x22,0xda,0xe0,0x0, +0x1c,0x9b,0x16,0x80,0x8f,0x89,0xe0,0x2f,0x3f,0x8d,0xaf,0x89,0xef,0xfa,0xd8,0x10, +0xe0,0x1, 0x1f,0xdc,0x16,0x7b,0xa6,0x8f,0xa7,0xcd,0x3f,0xdc,0xbf,0xcd,0x66,0x5, +0x8f,0x8c,0xe7,0xfa,0x27,0xca,0xe7,0xfc,0x0, 0xf5,0xf0,0x6, 0x9d,0xbd,0xf2,0x0, +0xcd,0x94,0xe7,0xfe,0x5, 0xde,0xe0,0x1, 0x18,0xaf,0xe0,0x1, 0x1a,0xae,0x8e,0x81, +0x8f,0x5, 0xe7,0xfe,0x0, 0xca,0xe4,0x0, 0xc6,0x8a,0xe0,0x0, 0xc6,0xe4,0x15,0x8a, +0x3d,0xbf,0xe0,0x0, 0x1e,0x45,0xe8,0xd, 0x3e,0x9e,0x3e,0x1b,0x91,0xc, 0x90,0x9c, +0x94,0x2c,0x95,0x3c,0x96,0x4c,0xe2,0x0, 0xcc,0x81,0xb1,0xd, 0xb0,0x9d,0xb4,0x2d, +0xb5,0x3d,0xb6,0x4d,0xe7,0xfe,0x1, 0xe8,0xe0,0x2, 0x1e,0xd7,0x3d,0x9d,0xac,0x8b, +0xe7,0xfe,0x0, 0xe7,0xe8,0x0, 0x89,0x8d,0x66,0x7, 0xe4,0x0, 0xc1,0x8a,0x66,0x85, +0x67,0x6, 0xe0,0x2, 0x1c,0xd8,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xa9,0xc, 0xa9,0xd, +0xa9,0xe, 0xe0,0x0, 0xdf,0xf, 0xe7,0xfd,0x0, 0xcf,0xe0,0x2, 0x1f,0x96,0x14,0x85, +0x66,0x8, 0xac,0x8f,0xe7,0xf9,0x26,0x7d,0xef,0xfa,0xd7,0xba,0xe0,0x0, 0x1e,0x9b, +0x16,0x0, 0x8f,0x8d,0xe0,0x1, 0x1e,0xdc,0xe0,0x0, 0x1f,0x1b,0xe0,0x2f,0x3f,0x8c, +0xa6,0x8d,0xaf,0x8e,0x16,0x7b,0xa7,0xcd,0x3f,0xdc,0xbf,0xcd,0xe7,0xf9,0x0, 0xe9, +0xe0,0x1, 0x1d,0xb1,0xf0,0x1, 0x1b,0xb0,0x88,0x8b,0xe8,0x0, 0x8d,0x87,0x30,0xa8, +0x3d,0xc1,0xc5,0xe2,0x3e,0xfb,0xe7,0xf9,0x3, 0x39,0xe0,0x1, 0x8d,0x8f,0xe0,0x0, +0x25,0xe5,0xe0,0x0, 0x18,0xc5,0x38,0x9e,0xf0,0x0, 0x92,0x81,0xf0,0x0, 0x9a,0x11, +0xe8,0x40,0x3a,0xe5,0xe3,0xff,0xc2,0xff,0xe0,0xe, 0x3e,0xa5,0xe8,0xc, 0x3e,0x24, +0xe4,0xb, 0x37,0xf, 0xe4,0x13,0x36,0xf, 0xe2,0xe, 0x3d,0xce,0xf2,0xc, 0x39,0xcc, +0xe0,0xb, 0x3f,0x2b,0xe8,0xe, 0x3e,0x23,0x3f,0x1b,0xe2,0x0, 0xcf,0x31,0xe0,0x1, +0x2, 0x5, 0xe2,0x0, 0xce,0x9e,0x5, 0x8d,0xe0,0x1, 0x18,0xb1,0xe0,0x1, 0x1a,0xb0, +0x8e,0x1, 0x8f,0x5, 0x36,0x28,0x3f,0x4c,0xc7,0x62,0x3e,0xfe,0xe7,0xfd,0x4, 0x11, +0x7f,0x81,0xef,0xfb,0xdf,0x1d,0xe2,0x0, 0xcc,0x1, 0x67,0x81,0xe0,0x1, 0x1, 0x30, +0xe0,0x1, 0x8f,0xf, 0xe2,0x0, 0xcf,0x3b,0xe7,0xf8,0x2, 0xf8,0xc7,0x1, 0xe0,0x1, +0xaf,0xf, 0xe7,0xf8,0x0, 0xf3,0xe0,0x2, 0x1e,0x54,0x7e,0x5, 0xe7,0xfd,0x0, 0xee, +0xe8,0x6, 0x3b,0x1a,0x16,0x80,0x8f,0x6f,0xae,0xb6,0x27,0x15,0xe2,0x0, 0xcf,0x1, +0xe7,0xfa,0x2, 0x8a,0x16,0xbc,0xe0,0x2, 0x1c,0xbe,0x17,0x3, 0xe0,0x1, 0xae,0x8f, +0x16,0x81,0xae,0x89,0xaf,0xf, 0xaf,0x1f,0xe7,0xf8,0x0, 0xdb,0xf7,0xfd,0x2d,0x99, +0xe7,0xfa,0x0, 0x80,0xac,0x6f,0x0, 0xef,0xe0,0x0, 0x16,0xe4,0xe8,0xd, 0x3e,0x9e, +0xe8,0xd, 0x3e,0x9d,0x94,0xd, 0x94,0x9d,0x95,0x2d,0x95,0xbd,0x96,0x4d,0xe0,0x0, +0x1e,0xc5,0x3f,0x1d,0xb4,0xe, 0x16,0x83,0xb4,0x9e,0xb5,0x2e,0xb5,0xbe,0xb6,0x4e, +0x17,0x1, 0xe0,0x1, 0xaf,0xf, 0xae,0x8f,0xae,0x9f,0xe7,0xf8,0x0, 0xba,0xe0,0x2, +0x1c,0x57,0xef,0xff,0xd5,0xe7,0x16,0x8a,0xe8,0xd, 0x3e,0x98,0x3f,0xe2,0xe9,0x80, +0xaf,0x98,0xe8,0x40,0x3e,0xf8,0x1, 0xfc,0x66,0x8, 0x26,0x7, 0xe0,0x1, 0x1f,0xdc, +0xa6,0x8f,0xa7,0xcd,0xcf,0x84,0xbf,0xcd,0xe8,0x0, 0x89,0x8d,0xe0,0x2, 0x1c,0xd8, +0xe4,0x0, 0xc1,0x8a,0xe0,0x2, 0x1c,0x18,0x3d,0x63,0xe0,0x0, 0xde,0x43,0xe7,0xfc, +0x0, 0x83,0x3a,0x62,0xe7,0xfa,0x0, 0xea,0xe2,0x0, 0xce,0x9e,0xe0,0x0, 0x2, 0xce, +0xe8,0x5, 0x3a,0xc4,0xe7,0xfb,0x22,0xbb,0xe2,0x2, 0xcf,0x2c,0xe7,0xfb,0x2, 0x37, +0xf8,0xd, 0x3e,0x9e,0x94,0x11,0x94,0xa1,0x95,0xb1,0x96,0x41,0xe0,0x0, 0x17,0x64, +0x3f,0x1d,0xf0,0x6, 0xb2,0xad,0x10,0x85,0xf0,0xd, 0x3d,0x16,0xa8,0xbd,0xb4,0x1e, +0xb4,0xae,0xb5,0xbe,0xb6,0x4e,0xe7,0xfb,0x0, 0xa2,0xe0,0x0, 0x16,0xe4,0xe7,0xfd, +0x0, 0xe0,0xe0,0x0, 0x16,0x64,0xe8,0xc, 0x3e,0x1e,0xe8,0xc, 0x3e,0x1d,0x90,0x8c, +0x94,0x1c,0x94,0xac,0x95,0x3c,0x95,0xcc,0xe0,0x0, 0x1e,0x45,0xe0,0x1, 0xae,0x8f, +0x3f,0x1c,0xb0,0x8e,0x16,0x3, 0xb4,0x1e,0xb4,0xae,0xb5,0x3e,0xb5,0xce,0xe0,0x2, +0x1f,0x6f,0xae,0xf, 0xae,0x8e,0xae,0x1f,0xe7,0xf7,0x0, 0xd3,0x17,0x3c,0xe0,0x1, +0xaf,0xf, 0xe7,0xf7,0x0, 0xcb,0x15,0x8a,0x3d,0xbf,0xe0,0x2, 0x1d,0x57,0xe0,0x0, +0x16,0xe4,0x3d,0x1b,0xe7,0xf5,0x0, 0xd6,0xe0,0x1, 0x1e,0x31,0xf0,0x1, 0x1b,0xb0, +0x8d,0x8c,0xe8,0x0, 0x8e,0x7, 0x35,0xa8,0x3e,0x4b,0xc6,0x62,0x3e,0xfc,0xe7,0xff, +0x3, 0x29,0xe7,0xfb,0x0, 0xbe,0x14,0x1, 0xe7,0xf4,0x0, 0xf2,0x8, 0xb3,0xe0,0x3, +0x1f,0xb8,0x17,0x1, 0xa1,0xf, 0x16,0xfe,0xe0,0x1, 0xa7,0xe2,0x3f,0x58,0x3f,0xdd, +0x3f,0xce,0xe0,0x1, 0xbf,0xe2,0x2c,0x21,0xe0,0x2, 0x19,0xc8,0x17,0x3, 0x8f,0x83, +0x3f,0x3f,0xe0,0x2, 0x1f,0xc4,0x3f,0x9e,0x8c,0xf, 0xd4,0xa9,0xe0,0x2, 0xa7,0xd2, +0x17,0x43,0x3f,0xde,0xcf,0x9c,0xe0,0x2, 0xbf,0xd2,0x8e,0x83,0x8f,0x83,0xe0,0x3, +0x1f,0x30,0xe4,0x0, 0xc6,0x85,0xe4,0x0, 0xc7,0x85,0x3f,0x9e,0x3f,0x1d,0x8c,0xcf, +0x8c,0x3e,0x9, 0xa1,0xe0,0x5, 0x0, 0xee,0x14,0x28,0xd4,0x91,0xe0,0x2, 0xa7,0xd2, +0xe0,0x2, 0x1f,0x48,0xcf,0xbc,0xe0,0x2, 0xbf,0xd2,0x8e,0x8e,0x8f,0x8e,0xe0,0x3, +0x1f,0x30,0xe4,0x0, 0xc7,0x85,0xe4,0x0, 0xc6,0x85,0x3f,0x9e,0x84,0xcf,0x3f,0x1d, +0xc4,0xfc,0x8c,0x3e,0xe2,0x1, 0xc4,0xff,0x9, 0xa1,0xe0,0x5, 0x0, 0xd3,0x0, 0x0, +0x8, 0xb7,0xf8,0x0, 0xc, 0x3e,0xc0,0x64,0xe0,0x2, 0x1f,0x66,0xe0,0x2, 0x1f,0xfd, +0x87,0xe, 0xe0,0x3, 0x8e,0xaf,0xe2,0x0, 0xc7,0x1, 0x3e,0xfe,0xe0,0x4, 0x1, 0x7f, +0x8d,0x8f,0x89,0xaf,0x7d,0x85,0x3e,0x6b,0xe0,0x2, 0x1d,0xf9,0x99,0x5f,0x8f,0x1f, +0x8f,0xbf,0x3e,0xe3,0x7d,0x83,0x3d,0x6e,0x3d,0xec,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, +0xc5,0xff,0x3d,0x7b,0x3, 0x82,0x3f,0x6c,0xf0,0x40,0x3d,0xee,0x3e,0x6f,0x3f,0x6d, +0xe2,0x1, 0xc6,0x7f,0xe2,0x1, 0xc7,0x7f,0x3e,0x7e,0xf2,0x1, 0xc5,0xff,0x3, 0x82, +0x3f,0xed,0xe0,0x0, 0x1f,0x43,0x15,0x80,0xf0,0x1, 0x1f,0x5e,0xb5,0x8e,0xe2,0x1, +0xc7,0xff,0xe0,0x2, 0x1f,0x46,0xe0,0x1, 0x1d,0xdd,0x7f,0x82,0xf8,0x40,0x3e,0x6e, +0xe0,0x1f,0x17,0xff,0xe8,0x80,0xb7,0x9c,0xf0,0x40,0x3e,0x7b,0xe0,0x80,0xb7,0x9e, +0x1, 0xfa,0x14,0x1, 0xef,0xf9,0xd9,0x90,0xef,0xfa,0xdc,0x30,0xef,0xf9,0xd6,0x90, +0xe0,0x2, 0x1e,0xc8,0x17,0x5, 0x8f,0x8d,0xf8,0x40,0x3c,0xeb,0x3f,0x3f,0xe0,0x3, +0x1f,0xb0,0x3f,0x9e,0x8f,0xbf,0xe0,0x0, 0x1f,0x44,0xe4,0x7, 0xc7,0xb0,0xf0,0x0, +0xa4,0xe, 0xf0,0x18,0x3c,0x1f,0xe8,0x40,0x3f,0x68,0xe0,0x6, 0xc7,0x48,0xf0,0x0, +0x7c,0x1, 0x7f,0x4, 0xf0,0x1, 0x25,0xe0,0xf0,0x40,0x3d,0xe3,0x62,0x5, 0xf2,0x1, +0xc5,0xff,0xf0,0x0, 0x7f,0x6, 0x13,0x81,0xe2,0x1, 0xc2,0x7f,0xe8,0x40,0x3b,0x6b, +0x12,0x80,0xf0,0x1, 0x1e,0xff,0xf8,0x40,0x3f,0x6b,0xf0,0x0, 0x7e,0x7, 0x0, 0x96, +0x14,0x1, 0xdf,0x35,0xef,0xf9,0xd9,0x7, 0x14,0x1, 0xef,0xf9,0xd9,0x55,0x17,0x81, +0xe8,0x40,0x3b,0xf9,0x3f,0x97,0xe8,0x6, 0x3b,0x1e,0xc2,0x81,0xe3,0xff,0xc7,0xff, +0xe3,0xff,0xc3,0x7f,0xe0,0x1, 0x3, 0xb4,0x3b,0xef,0xf0,0x40,0x3d,0xe5,0xf3,0xff, +0xc5,0xff,0xf0,0x40,0x3d,0xf4,0x3, 0xe5,0xe0,0x3, 0x1d,0xb8,0xe7,0xbf,0x16,0xff, +0xf0,0x0, 0xa4,0xb, 0xe0,0x0, 0x15,0x68,0xe8,0x1, 0xa7,0xe8,0xe0,0x1, 0x14,0xff, +0x3f,0xdd,0xe8,0x1, 0xbf,0xe8,0xf0,0x0, 0x16,0x0, 0x64,0x4, 0xe0,0x0, 0xdd,0x1c, +0xf0,0x0, 0x65,0x3, 0x29,0x6, 0x0, 0xa9,0x39,0x7d,0xf0,0x0, 0xc5,0x2, 0x5, 0xa5, +0xe8,0x40,0x3c,0x6c,0x3c,0xe3,0xe0,0x0, 0xdc,0x73,0xf0,0x0, 0xc6,0x1, 0x3c,0x75, +0xe8,0x40,0x3e,0xec,0xe3,0xff,0xc6,0xff,0x1, 0xf0,0xe8,0x0, 0x9f,0x8a,0x67,0x1, +0xc7,0x84,0xe0,0xc, 0x37,0x85,0x36,0x22,0x3e,0x1e,0xe0,0x1a,0xa5,0xac,0xe0,0x41, +0x3f,0x8f,0x17,0x1, 0xe0,0xf, 0x37,0x3f,0xe3,0xf, 0x3d,0xdf,0x39,0x7d,0xe0,0x1a, +0xbf,0xac,0xf0,0x0, 0xc5,0x2, 0x2, 0xdd,0xe8,0x1, 0xa7,0xe8,0x14,0x1, 0xe0,0x40, +0xcf,0x80,0xe8,0x1, 0xbf,0xe8,0xde,0xd3,0xef,0xf9,0xd8,0xa5,0x14,0x1, 0xef,0xf9, +0xd8,0xf3,0x14,0x0, 0xf0,0x40,0x3b,0x68,0xf0,0x0, 0x25,0xaa,0xf0,0xa, 0x3f,0x18, +0xe3,0xff,0xc5,0x7f,0xe0,0x40,0x3f,0xe8,0xf0,0x0, 0x27,0x17,0xe0,0xc, 0x17,0x52, +0x3f,0x1f,0xe0,0xd, 0x37,0xa1,0x37,0x21,0xe8,0xe, 0x3f,0x1d,0xe8,0xd, 0x3e,0x9d, +0x9d,0x8e,0x96,0xd, 0xc7,0x81,0x3d,0xfc,0xe3,0xff,0xc7,0xff,0x3, 0x3, 0x9f,0xe, +0xb7,0xd, 0x3f,0xfa,0x1, 0xec,0xf0,0x0, 0xc3,0x1, 0xf3,0xff,0xc3,0x7f,0xf8,0x40, +0x3b,0x7b,0xe8,0x8, 0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x1, 0xd9,0x3b,0xf4,0x3c,0x66, +0xf0,0x40,0x3b,0xe7,0xe7,0xfe,0x3, 0xed,0xf0,0xa, 0x3f,0x18,0xe3,0xff,0xc5,0x7f, +0xe0,0x40,0x3f,0xe8,0xf0,0x0, 0x27,0x17,0xe0,0xc, 0x17,0x52,0x3f,0x1f,0xe0,0xd, +0x37,0xa1,0x37,0x21,0xe8,0xe, 0x3f,0x1d,0xe8,0xd, 0x3e,0x9d,0x9d,0x8e,0x96,0xd, +0xc7,0x81,0x3d,0xfc,0xe3,0xff,0xc7,0xff,0x3, 0x3, 0x9f,0xe, 0xb7,0xd, 0x3f,0xfa, +0x1, 0xec,0xf0,0x0, 0xc3,0x81,0xf3,0xff,0xc3,0xff,0xf0,0x40,0x3b,0xf4,0xe8,0x8, +0x3c,0x1e,0xe3,0xff,0xc4,0x7f,0x1, 0xd9,0xe7,0xfe,0x0, 0xc3,0xf0,0x0, 0x67,0x6, +0xf0,0x0, 0x66,0x7, 0x67,0x82,0xf0,0x2, 0x1e,0xc5,0xe0,0x2, 0x27,0x95,0xf0,0x0, +0x65,0x5, 0xf0,0x40,0x3c,0xe3,0xf2,0x1, 0xc4,0xff,0xf2,0x1, 0xc5,0x7f,0xf8,0x7, +0x3c,0xba,0xf0,0x2, 0x1e,0xc5,0x3f,0xe7,0xe3,0xff,0xc7,0xff,0xf0,0x0, 0x7f,0x6, +0x12,0x81,0xf0,0x0, 0x7e,0x7, 0x3b,0x6f,0xf8,0x40,0x3e,0x69,0x7f,0x85,0x12,0x0, +0xf0,0x1, 0x1d,0xff,0xf8,0x40,0x3f,0x6a,0xf8,0x40,0x3c,0xed,0x0, 0x92,0x14,0x1, +0xde,0x46,0xef,0xf9,0xd8,0x18,0x14,0x1, 0xef,0xf9,0xd8,0x66,0x66,0x82,0x17,0x81, +0x3e,0xf5,0x3f,0x95,0xc2,0x1, 0xe3,0xff,0xc7,0xff,0xe0,0x1, 0x5, 0xdf,0x3a,0xef, +0xf0,0x40,0x3d,0x64,0xf3,0xff,0xc5,0x7f,0xf8,0x40,0x3d,0x7c,0x3, 0xe9,0xe0,0x3, +0x1d,0xb8,0xe7,0xbf,0x16,0xff,0xf0,0x0, 0xa6,0x8b,0xe0,0x0, 0x15,0x68,0xe8,0x1, +0xa7,0xed,0xe0,0x1, 0x14,0xff,0x3f,0xdd,0xe8,0x1, 0xbf,0xed,0xf0,0x0, 0x14,0x0, +0x64,0x4, 0xe0,0x0, 0xdc,0x31,0x63,0x83,0x29,0x5, 0x0, 0xa6,0x39,0x79,0xc3,0x82, +0x5, 0xa3,0xe8,0x40,0x3c,0x68,0x3c,0xe3,0xe0,0x0, 0xdb,0xb9,0xf0,0x0, 0xc4,0x1, +0x3c,0x74,0xe8,0x40,0x3c,0xe8,0xe3,0xff,0xc4,0xff,0x1, 0xf1,0x9f,0x7, 0x67,0x81, +0xc7,0x4, 0xe0,0x8, 0x37,0x5, 0x34,0x22,0x3c,0x1f,0xf0,0x1a,0xa3,0x28,0xe0,0x41, +0x3f,0xe, 0x15,0x81,0xe0,0xe, 0x35,0xbe,0xf3,0xe, 0x3b,0x5e,0x39,0x79,0xe0,0x1a, +0xbf,0x28,0xc3,0x82,0x2, 0xdf,0x17,0x80,0x3f,0x6f,0xe3,0xff,0xc7,0x7f,0xe8,0x40, +0x3f,0x7a,0xe0,0x1, 0x1, 0x68,0xc7,0x81,0xe2,0x0, 0xcf,0x86,0x1, 0xf6,0xe8,0x1, +0xa7,0xed,0x14,0x1, 0xe0,0x40,0xcf,0x80,0xe8,0x1, 0xbf,0xed,0xdd,0xe0,0xef,0xf9, +0xd7,0xb2,0x14,0x1, 0xef,0xf9,0xd8,0x0, 0xf0,0x0, 0x12,0x80,0xf0,0x0, 0x25,0x30, +0xe8,0x40,0x3f,0x65,0xe0,0x0, 0x15,0x0, 0xf0,0x0, 0x27,0x1f,0xe0,0xc, 0x17,0xd2, +0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1,0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99, +0x9c,0xf, 0xf0,0x0, 0x9b,0x9, 0xc5,0x1, 0xf0,0x40,0x3b,0x78,0xe8,0xe, 0x3f,0x1c, +0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f,0x5, 0x84,0x9f,0x8f,0xe0,0x0, 0xb7,0x89, +0xe8,0x40,0x3d,0x7e,0x1, 0xe4,0xf2,0x0, 0xca,0x85,0xe0,0x1, 0x5, 0x95,0xf0,0x0, +0xc2,0x81,0xf3,0xff,0xc2,0xff,0xf8,0x40,0x3a,0xfa,0x1, 0xd3,0xf0,0x40,0x3e,0x75, +0xf0,0x40,0x3b,0x65,0xe7,0xfe,0x5, 0xe4,0xe8,0x40,0x3f,0x66,0xe0,0x0, 0x15,0x0, +0xf0,0x0, 0x27,0x1e,0xe0,0xc, 0x17,0xd2,0x3f,0x9e,0xe0,0x9, 0x37,0x21,0x37,0xa1, +0xe8,0xf, 0x3f,0x9b,0xe8,0x9, 0x3c,0x99,0x9c,0xf, 0xf0,0x0, 0x9b,0x89,0xc5,0x1, +0xf0,0x40,0x3b,0xf8,0xe8,0xe, 0x3f,0x1c,0xe3,0xff,0xc5,0x7f,0xe3,0xff,0xc7,0x7f, +0x5, 0x83,0x9f,0x8f,0xb7,0x89,0xe8,0x40,0x3d,0x7e,0x1, 0xe5,0xf2,0x0, 0xcb,0x5, +0x2, 0x94,0xe8,0xf, 0x3b,0x16,0xe3,0xff,0xc7,0xff,0xe0,0xc, 0x17,0x52,0x3f,0x1f, +0x37,0x21,0x37,0xa1,0xe8,0xe, 0x3f,0x1b,0xe8,0xf, 0x3f,0x99,0x9d,0xe, 0x9c,0x8f, +0x3c,0xfa,0x5, 0x83,0x9f,0xe, 0xb7,0xf, 0xf0,0x0, 0xc3,0x1, 0xf3,0xff,0xc3,0x7f, +0xf8,0x40,0x3b,0x7c,0x1, 0xc2,0x66,0x82,0x17,0x81,0x3e,0xf5,0x3f,0x95,0xc2,0x1, +0xe3,0xff,0xc7,0xff,0xe7,0xfe,0x2, 0xa5,0xf0,0x0, 0x67,0x6, 0xf0,0x0, 0x66,0x7, +0xf8,0x40,0x3e,0xe9,0xe0,0x2, 0x1f,0xc5,0xe8,0x80,0x97,0x1e,0x9e,0x8f,0x3f,0x7d, +0x3, 0x2, 0xb7,0xf, 0xf8,0x40,0x3f,0x7c,0xc7,0x82,0x1, 0xf7,0xe0,0x2, 0x1f,0x93, +0x17,0x0, 0xe0,0x2, 0x1e,0xa5,0xe0,0x2, 0xaf,0xf, 0x14,0x0, 0xe0,0x1, 0xaf,0x7f, +0xf0,0x0, 0xbe,0x8d,0xdd,0x3c,0xe0,0x2, 0x1f,0x48,0x8c,0xe, 0xef,0xf9,0xd5,0xc8, +0xe0,0x2, 0x1f,0x7b,0x17,0x87,0xaf,0x8e,0xe0,0x2, 0x1f,0x77,0xaf,0x8e,0xc0,0x1c, +0xf8,0x0, 0xf, 0x28,0xb, 0xa1,0xe7,0x34,0x0, 0xe2,0x8e,0x9f,0xe0,0x2, 0x1f,0x78, +0x89,0xbf,0x7e,0x85,0x99,0x6f,0x8e,0xf, 0x8e,0xaf,0x7f,0x3, 0x3f,0xe3,0x67,0x5, +0xe7,0xfb,0x0, 0x83,0x67,0x85,0xe0,0xc, 0x17,0x52,0xe8,0xf, 0x3f,0x95,0xe3,0xff, +0xc7,0xff,0x3f,0x1f,0x37,0x21,0x37,0xa1,0xe8,0xe, 0x3f,0x1b,0xe8,0xf, 0x3f,0x99, +0x9d,0xe, 0x9c,0x8f,0x3c,0xfa,0xe7,0xfe,0x5, 0xdc,0x9f,0xe, 0xb7,0xf, 0xe7,0xfe, +0x0, 0xd8,0x17,0x1e,0xf2,0x0, 0xcd,0x2, 0x3f,0x2f,0x16,0x81,0xe0,0xe, 0x36,0xbe, +0x2, 0x8a,0x65,0x81,0xe0,0x1a,0xa5,0x2b,0xe3,0xe, 0x3d,0x5e,0xe0,0x1a,0xbf,0x2b, +0xe7,0xfe,0x0, 0x8b,0x66,0x81,0x17,0x1d,0xe0,0x1d,0xa5,0x3d,0x3f,0x2f,0x15,0x81, +0xe0,0xe, 0x35,0xbe,0xe3,0xe, 0x3d,0x5e,0xe0,0x1d,0xbf,0x3d,0xe7,0xfd,0x0, 0xfd, +0xe0,0x3, 0x1f,0xb8,0x16,0x80,0xa6,0xf, 0xe0,0x1, 0xa7,0x6c,0x37,0x4d,0xe2,0x0, +0xc7,0x1, 0x24,0x85,0xc4,0xff,0xe0,0x7, 0x16,0xff,0x3e,0xd9,0xe0,0x1, 0xa5,0xec, +0xe7,0xbf,0x17,0xff,0x3d,0xdf,0xe0,0x1, 0xbd,0xec,0xe4,0x7, 0xc4,0x30,0xe0,0x0, +0x1d,0xc4,0xe4,0xd, 0x36,0xa0,0xa5,0x8b,0x37,0x2d,0x3c,0x1b,0xa5,0x8, 0xe0,0x3, +0x1d,0xd8,0x3d,0xda,0x3e,0xcb,0xbe,0x88,0xe0,0x1, 0xa6,0xec,0x3f,0xdd,0x3f,0xce, +0xe0,0x1, 0xbf,0xec,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f, +0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, +0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0x88,0xe2,0x0, 0xc4,0x8f, +0xe0,0xd, 0x34,0xab,0xe7,0xf, 0x14,0xff,0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe2,0x40, +0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, +0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, +0xbe,0xef,0x3c,0x1b,0xa5,0x88,0xe2,0x0, 0xc4,0x81,0xe0,0xd, 0x34,0xaa,0xe7,0xf7, +0x14,0xff,0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xe2,0x0, +0xc4,0x81,0xa5,0x88,0xe4,0xd, 0x34,0xac,0xe0,0x3, 0x1c,0xd9,0xe2,0x0, 0xc5,0x3, +0x3c,0xdb,0x3c,0xcd,0xbc,0x88,0xe4,0xd, 0x35,0x2a,0xa4,0x88,0xe0,0x3, 0x1d,0xda, +0xe2,0x40,0xc7,0x0, 0xe0,0xa, 0x3c,0xdb,0x3d,0x4d,0xbd,0x8, 0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0xff,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0x6f, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0x5d,0xe0,0x1, 0xbe,0x6f,0x3c,0x1b,0xa5,0xa8, +0xe7,0xf0,0x16,0x0, 0x3e,0x5b,0xe2,0xf, 0xc4,0xff,0x3c,0xcc,0xbc,0xa8,0xe2,0x40, +0xc7,0x0, 0xe0,0x1, 0xa6,0x6f,0x3e,0xdc,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, +0xa7,0x6f,0xe0,0x1, 0xa6,0xef,0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, +0xbe,0xef,0x3c,0x1b,0xe2,0xf, 0xc4,0xff,0xa5,0xb8,0xe4,0xd, 0x34,0xa0,0xe0,0x3, +0x1c,0xdb,0xe2,0x40,0xc7,0x0, 0x3c,0xdb,0x3c,0xcd,0xbc,0xb8,0xe0,0x1, 0xa6,0xef, +0x3e,0x5d,0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, +0x1d,0xc4,0xa7,0x8f,0xe7,0xbf,0x16,0x7f,0xe0,0x1, 0xa7,0x6f,0xe0,0x1, 0xa6,0xef, +0xa5,0x8b,0xe4,0x7, 0xc4,0x30,0x3e,0xdc,0xe0,0x1, 0xbe,0xef,0x3c,0x1b,0xa5,0xe8, +0xe2,0x0, 0xc4,0x87,0xe0,0xd, 0x34,0xa6,0xe7,0xfc,0x14,0xbf,0x3c,0xdb,0x3c,0xcd, +0xbc,0xe8,0xe2,0x0, 0xc5,0xf, 0xa4,0xe8,0x15,0xc3,0xe0,0xd, 0x35,0x22,0xe0,0xa, +0x3c,0xdb,0x3d,0x4d,0xbd,0x68,0xe2,0x40,0xc7,0x0, 0xe0,0x1, 0xa6,0xef,0x3e,0x5d, +0x3f,0x4c,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x1f,0xc4,0x7f, +0xa7,0xf, 0xe7,0xe0,0x17,0x80,0xe0,0x4, 0xa6,0x8e,0x3f,0xdd,0x3c,0x4f,0xe0,0x4, +0xbc,0xe, 0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa7,0x8f,0x17,0x7b, +0xe0,0x1, 0xa6,0x6f,0xe0,0xd, 0x34,0x22,0x3f,0x5c,0x3f,0x4d,0xe0,0x1, 0xbf,0x6f, +0x17,0x7d,0xe0,0x1, 0xa6,0xef,0x34,0x21,0x3f,0x5d,0x3c,0x4e,0xe0,0x1, 0xbc,0x6f, +0xe2,0x0, 0xc4,0x8f,0xe0,0x2, 0xa6,0x3f,0xe7,0xfe,0x17,0xf, 0xe0,0xd, 0x34,0xa4, +0x3f,0x5c,0x3f,0x4d,0xe0,0x2, 0xbf,0x3f,0x17,0x70,0xe0,0x2, 0xa6,0xbf,0x3f,0x5d, +0x3c,0xce,0xe0,0x2, 0xbc,0xbf,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, +0xa7,0xf, 0xe7,0xdf,0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, 0x34,0x2c,0xe0,0x8, +0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe7,0xf0,0x17,0x80,0xe0,0x2, 0xa6,0xce, +0xe2,0xf, 0xc4,0xff,0x3f,0xdd,0x3c,0xcf,0xe0,0x2, 0xbc,0xce,0x38,0x82,0xe0,0x3, +0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xef,0x16,0xff,0xe0,0x1, 0xa6,0x6e, +0xe0,0xf, 0x34,0x2b,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe0,0x4, +0xb4,0xde,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f, +0xc4,0x7f,0xe0,0x3, 0xa6,0x8f,0x3f,0x5d,0x3c,0x4e,0xe0,0x3, 0xbc,0xf, 0xe0,0x6, +0xb4,0xbf,0xe0,0x6, 0xb5,0x5f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, +0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x3, 0xa6,0xbf,0x3f,0x5d,0x3c,0x4e,0xe0,0x3, +0xbc,0x3f,0xe0,0x7, 0xb4,0x9f,0xe0,0x7, 0xb5,0x3f,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe7,0xbf,0x15,0x7f,0xa7,0x8f,0xe0,0xb, 0x34,0x46,0xe0,0x1, 0xa6,0xef,0xe0,0x1, +0xa7,0x6f,0x35,0xa2,0x3f,0x5a,0xe0,0x1, 0xbf,0x6f,0x17,0x73,0xe0,0x2, 0xa6,0x6f, +0xe2,0x40,0xc6,0x80,0x3e,0x5e,0x3e,0x4b,0xe0,0x2, 0xbe,0x6f,0xe0,0xb, 0x34,0x26, +0xe0,0x2, 0xa6,0x6f,0xe7,0xe7,0x17,0x7f,0xe2,0x18,0xc5,0x80,0x3e,0x5e,0x3e,0x4b, +0xe0,0x2, 0xbe,0x6f,0x34,0x42,0xe0,0x2, 0xa5,0xef,0x17,0x3, 0x16,0x7c,0x3f,0x58, +0xe0,0x8, 0x3d,0xdc,0x3c,0x4e,0xe0,0x2, 0xbc,0x6f,0xe0,0x1, 0xa7,0x6f,0x3f,0x5a, +0x3f,0x4d,0xe0,0x1, 0xbf,0x6f,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1f,0x44, +0xa6,0x8f,0xe7,0xbf,0x15,0xff,0xe0,0x1, 0xa6,0x6d,0xe0,0x1, 0xa7,0xed,0xa7,0xe, +0xe4,0x7, 0xc4,0x30,0x3f,0xdb,0xe0,0x1, 0xbf,0xed,0x3c,0x1e,0xa5,0x28,0xe0,0xe, +0x34,0xc2,0xe0,0x3, 0x1f,0xdc,0xe2,0x0, 0xc7,0x3, 0xe4,0xe, 0x37,0x2d,0x3f,0xda, +0x3f,0xce,0xbf,0xa8,0xe0,0xe, 0x34,0xc6,0xa5,0x28,0xe0,0x3, 0x1f,0xdd,0xe4,0xe, +0x37,0x2b,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0x34,0xc4,0xa5,0x28,0xe0,0x3, 0x1f,0x5e, +0xe2,0x0, 0xc4,0x83,0xe4,0xf, 0x34,0xa9,0xe0,0x9, 0x3d,0x5e,0x3c,0xcf,0xbc,0xa8, +0xe2,0x40,0xc6,0x0, 0xe0,0x1, 0xa7,0xed,0x3d,0xdf,0x3e,0x4b,0xe0,0x1, 0xbe,0x6d, +0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xe0,0x0, 0x1f,0x44,0xa6,0x8f,0xe7,0xbf,0x15,0xff, +0xe0,0x1, 0xa6,0x6d,0xe0,0x1, 0xa7,0xed,0xa7,0xe, 0xe4,0x7, 0xc4,0x30,0x3f,0xdb, +0xe0,0x1, 0xbf,0xed,0x3c,0x1e,0xa5,0x28,0xe0,0xe, 0x34,0xc2,0xe0,0x3, 0x1f,0xdf, +0xe2,0x0, 0xc7,0x3, 0xe4,0xe, 0x37,0x27,0x3f,0xda,0x3f,0xce,0xbf,0xa8,0xe0,0xe, +0x34,0xc6,0xa5,0x28,0xe0,0x3, 0x1f,0xe0,0xe4,0xe, 0x37,0x25,0x3f,0xda,0x3f,0xce, +0xbf,0xa8,0x34,0xc4,0xa5,0x28,0xe0,0x3, 0x1f,0x61,0xe2,0x0, 0xc4,0x83,0xe4,0xf, +0x34,0xa3,0xe0,0x9, 0x3d,0x5e,0x3c,0xcf,0xbc,0xa8,0xe2,0x40,0xc6,0x0, 0xe0,0x1, +0xa7,0xed,0x3d,0xdf,0x3e,0x4b,0xe0,0x1, 0xbe,0x6d,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0x17,0x77,0xe0,0x1, 0xa6,0x6d,0xe0,0xf, 0x34,0x23, +0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xe0,0x1, 0xbc,0x6d,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xe2,0x0, 0xc4,0x1, 0xa7,0xf, 0xe7,0xfb,0x16,0xff,0xe0,0x1, 0xa6,0x6e,0xe0,0xf, +0x34,0x29,0xe0,0x8, 0x3e,0x5d,0x3c,0x4f,0xe0,0x1, 0xbc,0x6e,0xe2,0x0, 0xc4,0x81, +0xe0,0x1, 0xa6,0x6e,0xe7,0xf7,0x16,0xff,0xe0,0xf, 0x34,0xaa,0xe0,0x9, 0x3e,0x5d, +0x3c,0xcf,0xe0,0x1, 0xbc,0xee,0x38,0x82,0xe0,0x3, 0x1f,0xb8,0xa7,0xf, 0xe7,0xf8, +0x17,0x80,0xe0,0x1, 0xa6,0xfe,0x3f,0xdd,0x3c,0x4f,0xe0,0x1, 0xbc,0x7e,0x38,0x82, +0xe0,0x3, 0x1f,0xb8,0xe7,0xe0,0x17,0x0, 0xa7,0x8f,0xe2,0x1f,0xc4,0x7f,0xe0,0x2, +0xa6,0x8f,0xe2,0x1f,0xc4,0xff,0x3e,0xde,0x3c,0x4d,0xe0,0x2, 0xbc,0xf, 0xe0,0x2, +0xa6,0x9f,0x3f,0x5d,0x3f,0x49,0xe0,0x2, 0xbf,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0xb8, +0xa6,0x8f,0xa7,0x3d,0x37,0x4c,0xe2,0x0, 0xc7,0x1, 0xe0,0x61,0x3e,0x2, 0xe7,0xfe, +0x17,0xff,0x3f,0xdc,0xe0,0x61,0x3f,0x92,0xa7,0x8d,0x37,0xcc,0xe2,0x0, 0xc7,0x81, +0x27,0x85,0xa7,0x9d,0xe0,0x20,0xcf,0x80,0xbf,0x9d,0xe7,0xdf,0x17,0xff,0xa6,0x3d, +0x37,0x2c,0x3f,0xdc,0x3f,0xce,0xbf,0xbd,0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80, +0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x61,0x3f,0x2, 0xe7,0xfe,0x17,0xff,0x3f,0xde, +0xe0,0x61,0x3f,0x92,0xe0,0x3, 0x1f,0xb8,0xe2,0x0, 0xc4,0x1, 0xa6,0x8f,0xe7,0xdf, +0x17,0x7f,0xa6,0x3d,0xe0,0xf, 0x34,0x2c,0xe0,0x8, 0x3e,0x5e,0x3c,0x4f,0xbc,0x3d, +0xe0,0x61,0x3f,0x82,0xe0,0x1, 0xcf,0x80,0xe0,0x61,0x3f,0x92,0x38,0x82,0xe0,0x3, +0x1f,0xb8,0xf0,0x3, 0x1b,0x62,0xf0,0x0, 0xa2,0xf, 0xe7,0xbf,0x17,0xff,0xf8,0x1, +0xa1,0xe4,0xe8,0x1, 0xa7,0x64,0xf0,0x13,0x31,0xcd,0x3f,0xde,0xe8,0x1, 0xbf,0xe4, +0xf2,0x0, 0xc1,0x81,0x87,0x88,0xe8,0x1, 0xa6,0xd4,0xe2,0x0, 0xc7,0x87,0xe0,0xe, +0x37,0xac,0xe7,0x1f,0x17,0xff,0x3f,0xdd,0x3f,0xce,0xe0,0x0, 0x1f,0x44,0xf0,0x3, +0x1b,0xe3,0xf0,0x0, 0xa2,0x8e,0xe0,0x3, 0x1c,0xe4,0xe8,0x1, 0xbf,0xd4,0xf0,0x0, +0x10,0x80,0x15,0x78,0xe7,0xfe,0x15,0x87,0xe7,0xf7,0x16,0x7f,0xf0,0x0, 0x11,0x2, +0xf8,0x12,0x39,0x11,0xf0,0x10,0x30,0xa2,0xf0,0x12,0x31,0x21,0xf0,0x12,0x39,0x18, +0xf8,0x10,0x38,0x16,0xe8,0x0, 0xa7,0x0, 0xe8,0x0, 0x8f,0x82,0x3f,0x5a,0x37,0xc5, +0x3f,0x4f,0xe8,0x0, 0xbf,0x0, 0xe4,0x7, 0xc7,0xb0,0xe8,0x0, 0x86,0x82,0xe8,0x0, +0xa7,0x0, 0xe2,0x0, 0xc6,0x9f,0x36,0xa3,0x3f,0x5b,0x3f,0x4d,0xe8,0x0, 0xbf,0x0, +0xe8,0xf, 0x3f,0x95,0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc6,0xe2,0x0, 0xc6,0x81, +0xe4,0xd, 0x36,0xac,0xe8,0xe, 0x3f,0x57,0x3f,0x4d,0xbf,0xf, 0xf0,0x0, 0xc0,0x81, +0xe8,0x0, 0x8e,0x92,0xa7,0xf, 0x36,0xc3,0xe2,0x0, 0xc6,0x83,0xe4,0xd, 0x36,0xaa, +0x3f,0x59,0x3f,0x4d,0xbf,0xf, 0xf2,0x1, 0xc0,0xff,0xe8,0x0, 0x8e,0x92,0xa7,0xf, +0x36,0xc7,0x36,0xaa,0x3f,0x5c,0x3f,0x4d,0xbf,0xf, 0x8f,0x88,0xe8,0x40,0x3f,0xf1, +0xe7,0xff,0x3, 0xb6,0xe8,0x1, 0xa7,0x64,0xe7,0xbf,0x17,0xff,0xf0,0x13,0x31,0xad, +0x3f,0xde,0xf0,0x13,0x39,0xcf,0xf8,0x1, 0xb9,0xe4,0x38,0x82,0xe0,0x0, 0x1f,0x99, +0x17,0x1, 0xaf,0xf, 0xe0,0x3, 0x1f,0xb8,0xe0,0x2, 0x1e,0xb3,0xa7,0x8f,0xaf,0xd, +0x17,0x7d,0xa6,0xdf,0x3f,0x5d,0xbf,0x5f,0xa7,0x5f,0xcf,0x4, 0xbf,0x5f,0x38,0x82, +0xe0,0x0, 0x1f,0x19,0x17,0x81,0xaf,0x8e,0xe0,0x2, 0x1f,0x33,0xaf,0x8e,0xe0,0x0, +0x1f,0x10,0xaf,0x8e,0x38,0x82,0x8, 0xb2,0x39,0x68,0x15,0x4, 0xe1,0xf, 0x14,0x0, +0x3c,0xe2,0xd0,0xac,0xa7,0x82,0xa7,0x2, 0xa4,0x2, 0x37,0xc5,0xe4,0xe, 0x37,0x45, +0xe2,0x0, 0xc7,0x7, 0xea,0x2, 0xc4,0x0, 0xe2,0x0, 0xc7,0x88,0x3f,0xce,0xe4,0x8, +0x34,0x48,0x3c,0x1f,0x9, 0x61,0xe0,0x3, 0x1e,0xb8,0xe0,0x2, 0x1e,0x68,0xa6,0x8d, +0xa7,0xc, 0xa7,0x8c,0xa6,0xcd,0xe2,0x0, 0xc6,0x81,0x26,0xab,0x37,0x48,0xe4,0xf, +0x37,0xc5,0xe2,0x0, 0xc7,0x1, 0xa6,0x8c,0x37,0x23,0xe2,0x0, 0xc7,0x87,0x3f,0xce, +0xea,0x2, 0xcf,0x0, 0x3f,0x5d,0x16,0x85,0xe0,0x2f,0x3f,0x9d,0xe4,0xe, 0x37,0x48, +0x27,0x98,0x27,0x17,0x8, 0xb4,0x11,0x0, 0xe0,0x23,0x3c,0x2, 0x3a,0x69,0x14,0x9, +0x3c,0xe3,0xd0,0x55,0x14,0x9, 0xd0,0x35,0x39,0xf8,0x14,0x5, 0x1, 0xc, 0xc1,0x1, +0xef,0xfa,0xd1,0x48,0xe3,0xff,0xc1,0x7f,0x3a,0x72,0x3, 0xf5,0x14,0x0, 0xa, 0x61, +0x14,0x0, 0x38,0x82,0x14,0x1, 0xa, 0x61,0xe0,0x0, 0x1f,0x99,0x8c,0xf, 0x8f,0xf, +0x27,0x1f,0xe0,0x3, 0x1f,0x38,0x16,0x80,0xa5,0x8e,0xe0,0x0, 0x1f,0x10,0xae,0x8e, +0xa6,0x5b,0xe0,0x1, 0x1f,0x5c,0xce,0x1, 0xa7,0xe, 0xbe,0x5b,0xe0,0x1, 0xa6,0x6e, +0xe0,0x4, 0xce,0x0, 0xe0,0x1, 0xbe,0x6e,0xe7,0xfb,0x16,0x7f,0xe0,0x1, 0xa5,0xee, +0x3e,0x5b,0xe0,0x1, 0xbe,0x6e,0xae,0x8f,0xe0,0x2, 0x1f,0xb3,0xae,0x8f,0x38,0x82, +0x8, 0xb3,0xe0,0x3, 0x1f,0xb8,0x39,0xe8,0xa7,0x8f,0x14,0x0, 0xa1,0x3f,0xde,0xc4, +0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x31,0xa7,0x8f,0xa6,0x8e,0xa7,0x1f,0x31,0x4c, +0xcf,0x10,0xbf,0x1f,0xe2,0x0, 0xc1,0x1, 0xb1,0xdd,0x3c,0x62,0x89,0x7d,0xa6,0x9f, +0x17,0x6f,0x3f,0x5d,0xbf,0x1f,0xde,0xb0,0x3c,0x62,0x9, 0xe1,0x8, 0xb4,0xe0,0x3, +0x1f,0xb8,0x3a,0x68,0xa7,0x8f,0x14,0x0, 0xa1,0x3f,0x39,0xe9,0xde,0xa5,0xe0,0x2, +0x1f,0x91,0xe0,0x3, 0x1f,0x31,0xa7,0x8f,0xa6,0x8e,0xa7,0x1f,0x31,0x4c,0xcf,0x10, +0xbf,0x1f,0xe2,0x0, 0xc1,0x1, 0xb2,0x5d,0x17,0x6f,0xa9,0xbd,0x3c,0x62,0xa6,0x9f, +0x3f,0x5d,0xbf,0x1f,0xa, 0x21,0xe7,0xfd,0x0, 0x90,0x8, 0xb5,0xe0,0x3, 0x1f,0xb8, +0x39,0x68,0xa7,0x8f,0x14,0x0, 0xa7,0xbf,0x12,0x81,0x37,0xcc,0x3a,0xdf,0x39,0xe9, +0x3a,0x6a,0xde,0x82,0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xa7,0x9d,0xcf,0x90,0xbf,0x9d, +0x22,0x13,0xe0,0x3, 0x1f,0xb1,0xe0,0xa, 0x39,0x14,0x14,0xff,0xa7,0x8f,0x3c,0x93, +0xe3,0xff,0xc5,0x7f,0xb1,0x5f,0xc1,0x1, 0x8f,0x7f,0xe3,0xff,0xc1,0x7f,0x39,0x7a, +0xe0,0x80,0xaf,0x19,0x1, 0xf8,0xa7,0x1d,0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d, +0xa, 0xa1,0xe7,0xfc,0x0, 0xe2,0x8, 0xb5,0xe0,0x3, 0x1f,0xb8,0x39,0x68,0xa7,0x8f, +0x14,0x0, 0xa7,0xbf,0x12,0x81,0x37,0xcc,0x3a,0xdf,0x39,0xe9,0x3a,0x6a,0xde,0x54, +0xe0,0x2, 0x1f,0x91,0xa6,0x8f,0xa7,0x9d,0xcf,0x90,0xbf,0x9d,0x22,0x15,0xe0,0x3, +0x1f,0xb1,0xe0,0xa, 0x39,0x14,0x14,0xff,0xa7,0x8f,0x3c,0x93,0xe3,0xff,0xc5,0x7f, +0x17,0x1, 0x3f,0x12,0xb1,0x5f,0x39,0x6e,0xe3,0xff,0xc1,0x7f,0xe0,0x80,0x87,0x19, +0x39,0x7a,0xaf,0x3f,0x1, 0xf6,0xa7,0x1d,0x17,0xef,0x3f,0xde,0x3c,0x65,0xbf,0x9d, +0xa, 0xa1,0xe7,0xfc,0x0, 0xb2,0x0, 0x0, 0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x3, +0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28,0xe0,0x40,0xce,0x80,0xbe,0x9f,0x16,0xa1, +0xb6,0xbe,0x3c,0x98,0xe0,0x6, 0xb4,0xbe,0xe0,0x2, 0xb5,0x5e,0xe7,0xbf,0x17,0x7f, +0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0x38,0x82,0xe0,0x2, 0x1f,0x91,0xe0,0x3, 0x1f,0x3, +0xa7,0x8f,0xa7,0xe, 0xa6,0x9f,0x34,0x28,0xe0,0x40,0xce,0x80,0xbe,0x9f,0x3c,0x98, +0x35,0x28,0xe0,0x7, 0xb4,0xfe,0x3d,0x9a,0xe0,0x8, 0xb5,0x9e,0xe0,0x7, 0xb6,0x5e, +0xe7,0xbf,0x17,0x7f,0xa6,0x9f,0x3f,0x5d,0xbf,0x1f,0x38,0x82,0xe0,0x3, 0x1f,0x83, +0xe0,0x0, 0x1d,0x95,0xa7,0xf, 0x8e,0xb, 0x9f,0x9e,0x16,0x80,0xcf,0x81,0x3c,0x4f, +0xb4,0x1e,0x0, 0x85,0x9f,0x9e,0xe2,0x0, 0xc7,0x88,0x2f,0x8e,0xe0,0x7, 0x97,0x9e, +0xe2,0x0, 0xcf,0x80,0x3, 0x78,0x2e,0x8e,0x9f,0x9e,0xe0,0x80,0xcf,0x80,0xb7,0x9e, +0x17,0x80,0xb7,0x9e,0x38,0x82,0x9f,0x9e,0x16,0x1, 0xcf,0x84,0xb7,0x9e,0x3e,0xec, +0x0, 0xee,0xae,0xb, 0x0, 0xf2,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x16,0x0, 0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8, +0x96,0xd8,0xb6,0xde,0x96,0xf8,0xb6,0xfe,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9e, +0xe0,0x0, 0x1e,0x95,0xae,0xd, 0x8e,0x88,0x8e,0x18,0x36,0xa8,0x3e,0x9c,0xe0,0x1, +0xb6,0xde,0x96,0xa8,0xe0,0x1, 0x9c,0x28,0xe0,0x9, 0xb6,0xde,0x8e,0xaf,0xe0,0x1, +0xb6,0xfe,0x87,0xbf,0xe2,0x0, 0xc7,0x81,0xe4,0xf, 0x37,0xa8,0xe4,0xf, 0x37,0xc0, +0xb7,0x9e,0xdf,0xad,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92, +0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe0,0x0, 0x14,0x40,0x96,0xde,0xb6,0xdf, +0xe0,0x1, 0x96,0x9e,0xe0,0x1, 0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c, +0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, 0xb6,0xdf,0x8f,0x2e,0xe0,0x1, 0xb7,0x7f, +0x17,0x0, 0xe0,0x1, 0xb4,0xbf,0xb7,0x1f,0xdf,0x82,0xa7,0x12,0xe7,0xbf,0x17,0xff, +0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb4,0xe0,0x2, 0x1f,0x91,0x39,0xe9,0xa2,0xf, +0xe0,0x3, 0x1f,0x83,0xa7,0x14,0xa1,0xf, 0xe0,0x40,0xcf,0x0, 0xbf,0x14,0x3f,0xe8, +0xa7,0x14,0xe0,0x1, 0x14,0x20,0xe0,0x40,0xcf,0x0, 0xbf,0x14,0x97,0x3f,0xb7,0x52, +0x97,0x7f,0xb7,0x72,0x97,0x5f,0xe0,0x1, 0xb7,0x12,0x8f,0x1f,0x8e,0x8f,0x37,0x28, +0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f,0xe0,0x1, 0xb7,0x32,0x17,0x0, 0xe0,0x9, +0xb7,0x52,0xe0,0x1, 0x97,0xf, 0xe0,0x1, 0xb7,0x72,0xe0,0x1, 0x97,0x1f,0xe0,0x2, +0xb7,0x12,0xe0,0x1, 0x97,0x2f,0xe0,0x2, 0xb7,0x32,0xe0,0x1, 0x97,0x3f,0xe0,0x6, +0xb7,0x12,0x8f,0xbf,0x37,0xa8,0xb7,0x92,0xdf,0x42,0xe0,0x3, 0x9f,0xb2,0xaf,0x83, +0xe0,0x3, 0x9f,0xd2,0xaf,0x93,0xe0,0x2, 0x9d,0x72,0xe0,0x3, 0x9d,0x92,0xe0,0x4, +0x9e,0x32,0xe0,0x4, 0x9e,0xd2,0xe0,0x3, 0x9f,0x72,0xe0,0x4, 0x9f,0x92,0xb5,0x13, +0xb7,0xe3,0xe7,0xbf,0x17,0xff,0xb5,0xa3,0xb6,0x33,0xb6,0xc3,0xb7,0x53,0xa7,0x14, +0x3f,0xde,0xbf,0x94,0xa, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, 0xe0,0x3, +0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xdf, +0xe0,0x1, 0x14,0x40,0xb6,0xde,0x96,0xff,0xe0,0x1, 0xb6,0x9e,0x8e,0xbf,0x8e,0x2f, +0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x8e,0x9f,0x8e,0xf, 0x36,0xa8,0x3e,0x9c, +0xe0,0x1, 0xb6,0xbe,0x8e,0xcf,0xe0,0x1, 0xb6,0xfe,0x16,0x80,0xe0,0x9, 0xb6,0xde, +0x87,0xdf,0xe2,0x0, 0xc7,0x83,0x37,0xa8,0xb7,0x9e,0xde,0xf9,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3e,0xe8, +0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa7,0x12,0xa7,0x8f,0xe0,0x40,0xcf,0x0, 0xbf,0x12, +0x16,0x0, 0x97,0x38,0xb7,0x5f,0x97,0x58,0xb7,0x7f,0x97,0x78,0xe0,0x0, 0x14,0x60, +0xe0,0x1, 0xb7,0x1f,0x8f,0xd, 0x8e,0x9d,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x5f, +0xe0,0x9, 0xb6,0x5f,0xb6,0x1f,0xde,0xd3,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0x8, 0xb5,0x8f,0x8, 0x8f,0x98,0x39,0x68,0xa4,0x38,0x3f,0x7f, +0x34,0x21,0xe0,0x6f,0x3b,0xae,0xe0,0x1, 0x14,0xff,0xe0,0x1, 0x15,0x72,0xe8,0x0, +0xc4,0x2, 0x3a,0xef,0xd4,0xe8,0xe0,0x2, 0x1f,0x91,0x17,0x0, 0xa1,0x8f,0xe0,0x3, +0x1f,0x83,0xe0,0x0, 0x14,0x60,0xa2,0xf, 0xa7,0x93,0xe2,0x1, 0xc2,0xff,0xe0,0x40, +0xcf,0x80,0xbf,0x93,0x97,0xb2,0xb7,0xd4,0x97,0xd2,0xb7,0xf4,0x97,0xf2,0xe0,0x1, +0xb7,0x94,0x8f,0x82,0x8e,0x92,0x37,0xa8,0x3f,0x9d,0xe0,0x1, 0xb7,0xd4,0xe0,0x9, +0xb7,0x54,0xb7,0x14,0xde,0x9c,0x87,0x2, 0xa4,0xb2,0x3f,0xee,0xe2,0x1, 0xc7,0xff, +0x27,0xa8,0xe0,0xb, 0x34,0xa1,0x87,0x92,0x15,0x0, 0xe8,0x0, 0xc5,0x82,0x3e,0xef, +0xe2,0x1, 0xc6,0xff,0x26,0x96,0x16,0xb, 0x3e,0x3a,0x17,0x0, 0xe0,0xf, 0x3f,0x1c, +0x37,0xa1,0x3f,0x9b,0x96,0x8f,0xc7,0x1, 0xe0,0x41,0x3e,0x8d,0xb6,0x8f,0xe2,0x1, +0xc7,0x7f,0x87,0x92,0x3e,0xef,0xe2,0x1, 0xc6,0xff,0x3e,0xfe,0x2, 0xf0,0x87,0x2, +0xc5,0x1, 0x3e,0xee,0xe2,0x1, 0xc5,0x7f,0xe2,0x1, 0xc6,0xff,0x3e,0xfa,0x2, 0xe0, +0xe4,0x2, 0xc2,0x81,0xb4,0xd4,0x17,0x80,0xe0,0x1, 0xb2,0xd4,0xe0,0x1, 0x14,0x50, +0xb7,0x94,0xde,0x65,0xa5,0x32,0x17,0x0, 0x15,0xf0,0x3f,0xee,0x35,0x21,0x0, 0x92, +0xe2,0x0, 0xcf,0x87,0x2, 0xb2,0xe0,0x5, 0x9e,0x14,0x36,0x1b,0xe2,0x0, 0xc6,0xf, +0xb6,0xd, 0xc7,0x81,0xe2,0x1, 0xc7,0xff,0xe2,0x0, 0xcf,0x8b,0xc7,0x2, 0xc5,0x84, +0x1, 0x1e,0xe2,0x0, 0xcf,0x83,0xe0,0xd, 0x3f,0x1a,0xe8,0x0, 0xc6,0x82,0x2, 0xe9, +0xe0,0x4, 0x9e,0x74,0xe0,0xd, 0x37,0x21,0xc7,0x81,0xe0,0x9, 0x3f,0x1a,0xe0,0xd, +0x36,0x1d,0xe2,0x1, 0xc7,0xff,0xea,0x0, 0xce,0x2, 0x3e,0x19,0xe2,0x0, 0xc6,0x8f, +0xe2,0x0, 0xcf,0x8b,0xb6,0x8c,0xc7,0x2, 0xc5,0x84,0x1, 0xe4,0xa7,0x13,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x93,0xa, 0xe1,0xe0,0x5, 0x9e,0xb4,0x14,0xf0,0x3c,0x9b, +0xe0,0xc, 0x3f,0x1a,0x36,0x99,0xe8,0x0, 0xc6,0x2, 0xe2,0x0, 0xc6,0x8f,0xb6,0x8c, +0x0, 0xc9,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83, +0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe7,0xbf,0x16,0x7f,0x96,0xd8, +0xb6,0xdf,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x14,0x60,0xe0,0x1, +0xb6,0x9f,0x8e,0x8e,0x8d,0x9e,0x36,0xa8,0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xae, +0xe0,0x9, 0xb6,0xdf,0x8e,0xae,0xe0,0x1, 0xb6,0xff,0xe0,0x7, 0x9e,0x9f,0x3e,0xdc, +0xe0,0x7, 0xb6,0x9f,0x8f,0x3e,0xe0,0x7, 0x9e,0x9f,0x37,0x2d,0x3f,0x4d,0xe0,0x7, +0xb7,0x1f,0x9f,0x1f,0x3e,0x5e,0xb6,0x1f,0xdd,0xea,0xa7,0x12,0xe7,0xbf,0x17,0xff, +0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0xe0,0x1, +0x14,0x60,0x96,0xde,0xb6,0xdf,0x96,0xfe,0xb6,0xff,0xe0,0x1, 0x96,0x9e,0xe0,0x1, +0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae, +0xe0,0x9, 0xb6,0xdf,0x8f,0x2e,0xe0,0x1, 0xb7,0x7f,0x9f,0x1f,0xe0,0x40,0xcf,0x0, +0xb7,0x1f,0xdd,0xbd,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92, +0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0x16,0x0, 0x96,0xd8,0x34,0xa8,0xb6,0xdf, +0x3d,0x49,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0xb6,0x9f,0x8e,0x88, +0x8d,0x98,0x36,0xa8,0x3e,0x9b,0xe0,0x1, 0xb6,0xdf,0x96,0xa8,0x14,0x30,0xe0,0x9, +0xb6,0xdf,0xe0,0x7, 0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8f,0x3e, +0xe0,0x7, 0x9e,0x9f,0x37,0x2e,0x3f,0x4d,0xe0,0x7, 0xb7,0x1f,0xe0,0x1, 0xb6,0x7f, +0xe0,0x2, 0xb5,0x1f,0xe0,0x1, 0x9f,0x7f,0xe0,0x1, 0xcf,0x3, 0xe0,0x1, 0xb7,0x7f, +0xe0,0x1, 0xb6,0x3f,0xb6,0x1f,0xdd,0x7b,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, +0x1f,0x83,0xa6,0x92,0xa7,0x8f,0xe0,0x40,0xce,0x80,0xbe,0x92,0x15,0x80,0x96,0xd8, +0xb6,0xdf,0x96,0xf8,0xb6,0xff,0xe0,0x1, 0x96,0x98,0x14,0x30,0xe0,0x1, 0xb6,0x9f, +0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf,0x96,0xae,0xe0,0x9, +0xb6,0xdf,0xe0,0x7, 0x9e,0x9f,0xe3,0x7f,0xc6,0xff,0xe0,0x7, 0xb6,0x9f,0x8e,0xbe, +0xe0,0x7, 0x9e,0x1f,0x36,0xae,0x3e,0xcc,0xe0,0x7, 0xb6,0x9f,0xe0,0x1, 0xb5,0xff, +0xe0,0x2, 0xb4,0x9f,0xe0,0x1, 0x9e,0xff,0xe0,0x1, 0xce,0x83,0xe0,0x1, 0xb6,0xff, +0xe0,0x1, 0xb5,0xbf,0xe0,0x2, 0x8f,0x7e,0x9e,0x9f,0x37,0x2a,0x3f,0x4d,0xb7,0x1f, +0xdd,0x36,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2, +0xe0,0x2, 0x1f,0x91,0x3f,0x68,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0x8f, +0xe0,0x40,0xce,0x80,0xbe,0x92,0x14,0x0, 0x96,0xde,0xb6,0xdf,0xe0,0x1, 0x96,0x9e, +0xe0,0x1, 0xb6,0x9f,0x8e,0x8e,0x8e,0x1e,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xdf, +0x96,0xae,0xe0,0x9, 0xb6,0xdf,0xe0,0x1, 0xb4,0xff,0xe0,0x2, 0xb5,0x1f,0xe0,0x2, +0x8e,0x7e,0xe0,0x2, 0x8e,0xee,0x8f,0x3e,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0x28, +0x3f,0x4d,0xb7,0x1f,0x9f,0x1f,0xe1,0x0, 0xcf,0x0, 0xb7,0x1f,0xdd,0x0, 0xa7,0x12, +0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb2,0xe0,0x2, 0x1f,0x91, +0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92, +0x3f,0xe8,0x96,0xd8,0xb6,0xde,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28,0xe0,0x1, +0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xaf, +0xe0,0x9, 0xb6,0xde,0xe0,0x2, 0x8e,0x7f,0xe0,0x2, 0x8e,0xef,0x8f,0xbf,0x36,0x2a, +0x36,0xa9,0x3e,0xcc,0x37,0xa8,0x3f,0xcd,0xb7,0x9e,0x9f,0x9e,0xe1,0x0, 0xcf,0x80, +0xb7,0x9e,0xdc,0xcd,0xa7,0x12,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61, +0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, 0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, +0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8,0x96,0xdf,0x14,0x30,0xb6,0xde,0x96,0xff, +0xb6,0xfe,0xe0,0x1, 0x96,0x9f,0xe0,0x1, 0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8, +0x3e,0x9c,0xe0,0x1, 0xb6,0xde,0x96,0xaf,0xe0,0x9, 0xb6,0xde,0xe0,0x2, 0x8e,0x7f, +0xe0,0x2, 0x8e,0xef,0x8f,0xbf,0x36,0x2a,0x36,0xa9,0x3e,0xcc,0x37,0xa8,0x3f,0xcd, +0xb7,0x9e,0x9f,0x9e,0xe1,0x0, 0xcf,0x80,0xb7,0x9e,0xdc,0x99,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0x3f,0x68, +0xa1,0x8f,0xe0,0x3, 0x1f,0x83,0xe0,0x0, 0x14,0x40,0xa1,0xf, 0xa7,0x93,0xe0,0x40, +0xcf,0x80,0xbf,0x93,0x97,0xde,0xb7,0xd2,0x8f,0x8e,0x8e,0x9e,0x37,0xa8,0x97,0x2e, +0x3f,0x9d,0xe0,0x1, 0xb7,0xd2,0x17,0x80,0xe0,0x9, 0xb7,0x52,0xe0,0x1, 0xb5,0x72, +0xe0,0x2, 0xb4,0x92,0xb7,0x92,0x9f,0x92,0xe1,0x0, 0xcf,0x80,0xb7,0x92,0xdc,0x6f, +0xe0,0x7, 0x9c,0x32,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1, +0x8, 0xb3,0xe0,0x2, 0x1f,0x91,0x16,0x80,0xa1,0x8f,0xe0,0x3, 0x1f,0x83,0xa7,0x13, +0xa1,0xf, 0xe0,0x40,0xcf,0x0, 0xbf,0x13,0x3f,0xe8,0x97,0x58,0xb7,0x52,0x97,0x78, +0xb7,0x72,0xe0,0x1, 0x97,0x18,0x14,0x0, 0xe0,0x1, 0xb7,0x12,0xe0,0x0, 0x1f,0x15, +0xae,0x8e,0x8f,0xf, 0x8e,0x9f,0x37,0x28,0x3f,0x1d,0xe0,0x1, 0xb7,0x52,0x8f,0x2f, +0xe0,0x1, 0xb7,0x72,0x97,0x2f,0xe0,0x9, 0xb7,0x52,0x87,0xbf,0xe2,0x0, 0xc7,0x81, +0xe4,0xf, 0x37,0xa8,0xe4,0xf, 0x37,0xc0,0xb7,0x92,0xdc,0x39,0xe0,0x6, 0x9c,0x72, +0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde,0xbf,0x93,0x9, 0xe1,0x8, 0xb3,0xe0,0x2, +0x1f,0x91,0xe2,0x0, 0xc5,0x3, 0xa1,0x8f,0xa7,0x93,0xe0,0x40,0xcf,0x80,0xbf,0x93, +0xe0,0x3, 0x1f,0x83,0xa1,0xf, 0x2d,0x17,0xe0,0x9, 0xb5,0x52,0x35,0xaa,0xb4,0x52, +0x35,0x28,0xe0,0x1, 0xb4,0xd2,0xe0,0x1, 0x14,0x10,0xb5,0x92,0x9f,0x92,0x3d,0x4f, +0xb5,0x12,0xdc,0x15,0xe0,0x5, 0x9c,0x52,0xa7,0x13,0xe7,0xbf,0x17,0xff,0x3f,0xde, +0xbf,0x93,0x9, 0xe1,0x17,0x82,0xe0,0x9, 0xb7,0xd2,0x0, 0xe9,0xe0,0x2, 0x1f,0x91, +0x34,0xa3,0xa6,0xf, 0xe0,0x3, 0x1f,0x83,0xf0,0x0, 0x1b,0x95,0xa7,0xf, 0xa7,0x9c, +0xa6,0x9c,0xe0,0x40,0xce,0x80,0xbe,0x9c,0x96,0xd8,0xe8,0x0, 0x8d,0x7, 0xe0,0x8, +0xb6,0xfe,0x96,0xf8,0xe0,0x9, 0xb6,0x9e,0xe0,0x1, 0x96,0x98,0xe0,0x9, 0xb6,0xbe, +0x8e,0xc8,0x8d,0xd8,0x36,0xa8,0x3e,0x9b,0xe0,0x8, 0xb6,0xbe,0xe0,0xd, 0x37,0xcd, +0x8f,0xe8,0x8d,0xf8,0x37,0xa8,0xe0,0x1, 0x94,0x28,0x3f,0x9b,0xe0,0x8, 0xb7,0xde, +0xe2,0x0, 0xc6,0x81,0xe0,0x9, 0xb4,0x5e,0x15,0x80,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe, +0xc7,0x80,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0x3c,0xcf,0xe0,0x7, 0xb4,0x9e, +0xe0,0x7, 0x9f,0x9e,0xcf,0x90,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xcf,0x81, +0xe0,0x7, 0xb7,0x9e,0x0, 0x86,0xe0,0x7, 0x9f,0x9e,0xe2,0x0, 0xc7,0xa0,0x2f,0x9a, +0xe0,0x7, 0x9f,0x9e,0xe2,0x1, 0xc7,0x80,0x27,0xf7,0x2d,0x9c,0xe0,0x7, 0x9f,0x9e, +0x36,0xad,0xcf,0x84,0xe0,0x7, 0xb7,0x9e,0xe0,0x7, 0x9f,0x9e,0xe3,0xfe,0xc7,0x80, +0xe0,0x7, 0xb7,0x9e,0xe7,0xbf,0x17,0xff,0xa7,0x1c,0x3f,0xde,0x3f,0xcd,0xbf,0x9c, +0x38,0x82,0xe0,0x7, 0x9f,0x9e,0x15,0x1, 0xcf,0x82,0xe0,0x7, 0xb7,0x9e,0x3d,0xea, +0x0, 0xe0,0xe8,0x0, 0xad,0x7, 0x0, 0xe3,0x8, 0xb2,0xe0,0x2, 0x1f,0x91,0xa1,0xf, +0xe0,0x3, 0x1f,0x83,0xa6,0x92,0xa7,0xf, 0xe0,0x40,0xce,0x80,0xbe,0x92,0x3f,0xe8, +0x96,0xd8,0xb6,0xde,0x96,0xf8,0xb6,0xfe,0xe0,0x1, 0x96,0x98,0xe0,0x1, 0x9c,0x28, +0xe0,0x1, 0xb6,0x9e,0x8e,0x8f,0x8e,0x1f,0x36,0xa8,0x97,0xaf,0x3e,0x9c,0xe0,0x1, +0xb6,0xde,0xe0,0x9, 0xb7,0xde,0x17,0x80,0xb7,0x9e,0xdb,0x79,0xa7,0x12,0xe7,0xbf, +0x17,0xff,0x3f,0xde,0xbf,0x92,0x9, 0x61,0xe0,0x1, 0x1f,0xdc,0x14,0x3, 0xa7,0xf, +0xe0,0x1, 0xa7,0x8e,0x37,0xc8,0xe2,0x0, 0xc7,0x81,0x2f,0x82,0x38,0x82,0xe0,0x1, +0xa4,0xe, 0x34,0x49,0xe2,0x0, 0xc4,0x1, 0x38,0x82,0xe0,0x2, 0x1f,0xf0,0xa7,0xf, +0xe0,0x1, 0x1f,0xdc,0xa6,0x8f,0x17,0x80,0xe0,0x1, 0xaf,0xbe,0xa7,0x9e,0xe2,0x0, +0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81,0x27,0xf7, +0xa6,0x9e,0x17,0xfe,0x3f,0xdd,0xbf,0x9e,0xe0,0x1, 0x8c,0x3e,0x38,0x82,0xe0,0x2, +0x1f,0xf0,0xa7,0xf, 0xe0,0x1, 0x1f,0xdc,0xe0,0x1, 0xac,0x3e,0xa6,0x8f,0xa7,0x9e, +0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1,0xe2,0x0, 0xc7,0x81, +0x27,0xf7,0xa6,0x9e,0x17,0xfe,0x3f,0xdd,0xbf,0x9e,0x38,0x82,0x24,0xa6,0x17,0xff, +0xe0,0x2, 0x1f,0x70,0xe0,0x1, 0x1e,0xdc,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f, +0xa7,0xe, 0xa6,0x8d,0x3e,0x18,0xe0,0xb, 0x3c,0x1f,0x14,0x80,0x15,0x7e,0xe0,0x1, +0xac,0xbe,0xa7,0x9e,0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1, +0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa7,0x9e,0x3f,0xda,0xbf,0x9e,0xe0,0x1, 0x8f,0xbe, +0xe0,0x80,0xaf,0x9c,0x3e,0x7b,0x1, 0xec,0x38,0x82,0x24,0xa3,0x17,0xff,0xe0,0x2, +0x1f,0x70,0xe0,0x1, 0x1e,0xdc,0x3f,0x99,0xe3,0xff,0xc7,0xff,0x16,0x7f,0xa7,0xe, +0xa6,0x8d,0x3e,0x18,0xe0,0xb, 0x3c,0x1f,0x15,0x7e,0xe0,0x80,0x87,0x9c,0xe0,0x1, +0xaf,0xbe,0xa7,0x9e,0xe2,0x0, 0xc7,0x81,0x27,0xfd,0xe0,0x1, 0xa7,0x8d,0x37,0xc1, +0xe2,0x0, 0xc7,0x81,0x27,0xf7,0xa7,0x9e,0x3e,0x7b,0x3f,0xda,0xbf,0x9e,0x1, 0xee, +0x38,0x82,0xe0,0x2, 0x1f,0xf0,0x17,0x1, 0xa7,0x8f,0x3f,0x58,0xa5,0xbf,0x16,0xfb, +0xe0,0xc, 0x37,0x22,0x3e,0xdb,0x3e,0xcc,0xbe,0xbf,0x15,0xef,0xa6,0xbf,0xe0,0xc, +0x37,0x24,0x3e,0xdb,0x3e,0xcc,0xbe,0xbf,0x16,0xf7,0xa5,0xf, 0xe0,0xc, 0x37,0x23, +0x3e,0xda,0x3e,0xcc,0xbe,0x8f,0x16,0xfe,0xa6,0x3f,0x3e,0xdc,0x3f,0x4d,0xbf,0x3f, +0xe0,0x2, 0x1f,0x66,0x8f,0xe, 0xe2,0x0, 0xcf,0x1, 0x1, 0xc, 0x2f,0xa, 0xa6,0x8f, +0xe0,0x2e,0x3c,0xe, 0xe0,0x8, 0x37,0x24,0xe0,0xe, 0x3e,0xdb,0x3f,0x48,0xbf,0xf, +0x38,0x82,0xa7,0xf, 0xcf,0x40,0xbf,0xf, 0x24,0x7, 0xa6,0x8f,0xe7,0xfe,0x17,0x7f, +0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xa7,0xf, 0xe0,0x1, 0xcf,0x0, 0xbf,0xf, 0xe7,0xff, +0x17,0x3f,0xa6,0x8f,0x3f,0x5d,0xbf,0xf, 0x38,0x82,0xe0,0x2, 0x1f,0x70,0x97,0x88, +0xa6,0x8e,0xe2,0xff,0xc7,0xff,0xe0,0x1, 0xb7,0x9d,0x97,0x98,0xe2,0x7f,0xc7,0xff, +0xe0,0x1, 0xb7,0xbd,0x17,0xf7,0x9f,0x8, 0xa6,0x3d,0x37,0x4f,0x37,0x23,0x3f,0xdc, +0x3f,0xce,0xbf,0xbd,0x17,0xfc,0x9f,0x18,0xa6,0x6d,0x37,0x4e,0x3f,0xdc,0x3f,0xce, +0xbf,0xed,0x38,0x82,0xe0,0x2, 0x1e,0x94,0xe0,0x2, 0x1f,0x70,0x87,0xcd,0xa7,0xe, +0xcf,0x82,0xaf,0xcd,0xa7,0xbe,0xcf,0x82,0xbf,0xbe,0x38,0x82,0xe0,0x2, 0x1f,0x14, +0x9f,0xae,0x37,0xc9,0xe2,0x0, 0xc7,0x81,0x2f,0xfc,0x38,0x82,0xe0,0xd, 0x3c,0x49, +0xe2,0x0, 0xce,0x8f,0x3f,0xe8,0x3f,0x69,0x2, 0x8a,0xea,0x4f,0x7c,0x9c,0xe9,0xff, +0xc4,0xff,0x3c,0x9e,0x37,0xa4,0x3f,0x99,0x8c,0xf, 0x38,0x82,0x8, 0xb2,0xe2,0x0, +0xcc,0x0, 0x3, 0x17,0xe2,0x0, 0xcc,0x80,0xe0,0x41,0x3f,0xc8,0x3, 0xb, 0x11,0x1, +0x15,0x0, 0xe0,0x41,0x3c,0xce,0x3c,0x6f,0xd0,0x27,0x29,0x3, 0xe0,0x41,0x3c,0x48, +0x9, 0x61,0x15,0x0, 0x3c,0x6f,0xd0,0x20,0x0, 0xfa,0x15,0x0, 0x9, 0x21,0x0, 0x9c, +0xe2,0x0, 0xcc,0x80,0x3, 0x7b,0x11,0x0, 0x0, 0xec,0x8, 0xb2,0xe2,0x0, 0xcc,0x0, +0x3, 0xf, 0xe0,0x41,0x3c,0x48,0x11,0x1, 0xe2,0x0, 0xcc,0x80,0x3, 0x3, 0xe0,0x41, +0x3c,0xc9,0x15,0x1, 0xd0,0x9, 0x21,0x3, 0xe0,0x41,0x3c,0x48,0x9, 0x61,0x11,0x0, +0x0, 0xf4,0x15,0x0, 0x0, 0x81,0x17,0x81,0x17,0x0, 0xe1,0x2d,0x3c,0x19,0x26,0x84, +0xe1,0x2d,0x3f,0x8e,0x2e,0x88,0x17,0x0, 0x2f,0x8c,0xe2,0x0, 0xcd,0x0, 0xe0,0x68, +0x39,0x2e,0x38,0x82,0xe2,0x0, 0xcc,0x80,0x4, 0x77,0x34,0xa1,0x37,0xa1,0x0, 0xee, +0x3c,0x79,0x4, 0x83,0x3c,0x29,0x3f,0x4f,0x37,0xc1,0x34,0xc1,0x0, 0xee,0x0, 0x0, +0x3d,0xe8,0xe2,0x0, 0xcd,0x3, 0x5, 0xad,0xe0,0xc, 0x3c,0x49,0xe2,0x0, 0xc6,0x3, +0x2e,0x28,0xc5,0x7c,0xe0,0xc, 0x35,0x21,0xe2,0x0, 0xc6,0x18,0xe1,0x80,0xa7,0x99, +0x26,0x8, 0xea,0x0, 0xce,0x81,0xe0,0x7e,0xce,0xe4,0x3e,0xac,0x3f,0x6f,0x3e,0x82, +0xc5,0x70,0x6, 0x93,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99, +0xe1,0x80,0xbf,0x1b,0xe1,0x80,0xa7,0x19,0xe1,0x80,0xbf,0x9b,0xe1,0x80,0xa7,0x99, +0xc5,0x70,0xe1,0x80,0xbf,0x1b,0x6, 0x6f,0xe1,0x80,0xbf,0x9b,0xe2,0x0, 0xc5,0x3, +0xc5,0x7f,0x6, 0x87,0xe1,0x80,0x86,0x19,0xc5,0x7f,0xe1,0x80,0xae,0x1b,0x6, 0x7b, +0x38,0x82,0x0, 0x0, 0xe2,0x0, 0xcd,0x3, 0x5, 0xb1,0xe2,0x1, 0xc4,0xff,0xe0,0xc, +0x34,0xa8,0x3c,0xcc,0xe4,0xc, 0x34,0xa0,0x3c,0xcc,0xe0,0x41,0x3e,0x48,0xe2,0x0, +0xc6,0x3, 0xe0,0xb, 0x3e,0x18,0xe0,0xd, 0x3d,0x2c,0x3e,0x6d,0xe2,0x0, 0xc6,0xc, +0x26,0x7, 0xea,0x0, 0xcf,0x81,0xe0,0x7f,0xcf,0xd4,0x3f,0xac,0x3f,0x82,0xe1,0xff, +0xc6,0xf0,0x6, 0x8b,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b,0xe1,0x80,0xbc,0x9b, +0xc6,0xf0,0xe1,0x80,0xbc,0x9b,0x6, 0x77,0x3d,0x18,0xe0,0xc0,0xac,0xba,0xac,0x9a, +0xac,0xaa,0xac,0x88,0xac,0x98,0xac,0xa8,0x38,0x82,0x3d,0xe8,0xc5,0x7f,0x6, 0x85, +0xe1,0x80,0xac,0x9b,0xc5,0x7f,0x6, 0x7d,0x38,0x82,0xe0,0x3, 0x1f,0x8b,0xbc,0xf, +0x38,0x82,0xe0,0x3, 0x1f,0xb, 0xe0,0x3, 0x1c,0x65,0xa7,0x8e,0x3f,0xb8,0xe0,0x3, +0x1c,0x66,0x3f,0x98,0xe0,0x3, 0x1c,0x67,0xbf,0x8e,0x3c,0x5f,0x38,0x82,0x8, 0xb1, +0xe0,0x60,0x3c,0x87,0xea,0x24,0x7f,0xf8,0xe0,0x0, 0x15,0x60,0x3c,0x6f,0xdf,0x71, +0xe0,0x60,0x3c,0x17,0x8, 0xe1,0x0, 0x0, 0x0, 0x0, 0x16,0x98,0x0, 0x0, 0x16,0x56, +0x0, 0x0, 0x15,0xdc,0x0, 0x0, 0x16,0x56,0x0, 0x0, 0x16,0x4c,0x0, 0x0, 0x16,0xba, +0x0, 0x0, 0x16,0xb0,0x0, 0x0, 0x15,0xe0,0x0, 0x0, 0x16,0xb0,0x0, 0x0, 0x16,0x4c, +0x0, 0x0, 0x2d,0xee,0x0, 0x0, 0x2d,0xf6,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8, +0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8, +0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xe8,0x0, 0x0, 0x2d,0xfc,0x0, 0x0, 0x2e,0xc, +0x0, 0x0, 0x2e,0x1c,0x0, 0x0, 0x2e,0x1c,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98, +0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2f,0x98,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e, +0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x2e,0x8e,0x0, 0x0, 0x30,0x86,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x70, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x54,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0x3c, +0x0, 0x0, 0x30,0x2e,0x0, 0x0, 0x30,0x2e,0x0, 0x0, 0x30,0x20,0x0, 0x0, 0x30,0x20, +0x0, 0x0, 0x30,0x20,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xe, 0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xc8,0x0, 0x0, 0x30,0xc8, +0x0, 0x0, 0x30,0xc8,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x33,0xe, 0x0, 0x0, 0x30,0xba, +0x0, 0x0, 0x30,0xac,0x0, 0x0, 0x30,0x0, 0x0, 0x0, 0x2f,0xf2,0x0, 0x0, 0x2f,0xce, +0x0, 0x0, 0x2f,0xce,0x0, 0x0, 0x30,0xd8,0x80,0x0, 0xd, 0x0, 0x80,0x0, 0xb, 0x0, +0x80,0x0, 0xa, 0x0, 0x80,0x0, 0x7, 0x0, 0x80,0x0, 0x5, 0x0, 0x80,0x0, 0x4, 0x0, +0x80,0x0, 0x3, 0x0, 0x80,0x0, 0x2, 0x0, 0x80,0x0, 0x1, 0x0, 0x80,0x0, 0x0, 0x0, +0x80,0x1, 0x20,0x0, 0x0, 0x3, 0x86,0x60,0x0, 0x3, 0x80,0x0, 0x80,0x1, 0x40,0x0, +0x80,0x1, 0x10,0x0, 0x80,0x0, 0x6, 0x0, 0x80,0x0, 0x8, 0x0, 0x50,0x1, 0x32,0x2, +0x0, 0x3, 0xf0,0x4, 0xce,0x5, 0x9c,0x6, 0x84,0x7, 0x81,0x8, 0x0, 0x2, 0x1, 0x0, +0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, +0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0x1, 0x0, 0x2, 0xeb,0xaa,0x8, 0x0, +0x0, 0x3, 0x6, 0xa8,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x3, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x4, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x4, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0x5, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x0, 0x0, 0x0, 0x0, 0xd, 0x6, 0x4, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x0, 0x0, 0x0, 0xe, 0x7, 0x4, 0x3, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x0, 0x0, 0xf, 0x7, 0x5, 0x3, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0xff,0x40,0x0, 0x0, 0x0, 0x2, 0x2e,0x70,0x2, 0x0, 0x0, 0x0, +0x72,0x8d,0x0, 0xff,0xda,0x25,0x4, 0xa7,0x24,0x87,0x55,0x56,0x72,0x8d,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x34,0x34,0x33,0x35,0x33,0x31,0x30,0x32,0x44,0x31,0x30,0x30,0x33,0x31,0x30,0x30, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x12,0x0, 0x20, +0x0, 0x12,0x20,0x12,0x20,0x0, 0x0, 0x2, 0x40,0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x3, +0x1b,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, +0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, 0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, +0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, 0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, +0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, 0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, +0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, 0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, +0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, 0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, +0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, 0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, +0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, 0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, +0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, 0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, +0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, 0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, +0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, 0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, +0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, 0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, +0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, 0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, +0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, 0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, +0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, 0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, +0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, 0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, +0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, 0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, +0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, 0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, +0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, 0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, +0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, 0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, +0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, 0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, +0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, 0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, +0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, 0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, +0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, 0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, +0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, 0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, +0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, 0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, +0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, 0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, +0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, 0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, +0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, 0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, +0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, 0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, +0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, 0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, +0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, 0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, +0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, 0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, +0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, 0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, +0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, 0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, +0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, 0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, +0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, 0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, +0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, 0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, +0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, 0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, +0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, 0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, +0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, 0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, +0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, 0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, +0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, 0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, +0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, 0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, +0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, 0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, +0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, 0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, +0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, 0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, +0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, +0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, 0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, +0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, +0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, +0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, +0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, +0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, +0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, +0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, +0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, +0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, +0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, +0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, +0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, 0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, +0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, +0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, +0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, +0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, +0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, +0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, +0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, +0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, +0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, +0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, +0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, +0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1b,0x3, 0x1a,0x3, 0x19,0x3, +0x18,0x3, 0x17,0x3, 0x16,0x3, 0x15,0x3, 0x14,0x3, 0x13,0x3, 0x12,0x3, 0x11,0x3, +0x10,0x3, 0xf, 0x3, 0xe, 0x3, 0xd, 0x3, 0xc, 0x3, 0xb, 0x3, 0xa, 0x3, 0x9, 0x3, +0x8, 0x3, 0x7, 0x3, 0x6, 0x3, 0x5, 0x3, 0x4, 0x3, 0x3, 0x3, 0x2, 0x3, 0x1, 0x3, +0x0, 0x2, 0xff,0x2, 0xfe,0x2, 0xfd,0x2, 0xfc,0x2, 0xf4,0x2, 0xf3,0x2, 0xf2,0x2, +0xf1,0x2, 0xf0,0x2, 0xef,0x2, 0xee,0x2, 0xed,0x2, 0xec,0x2, 0xeb,0x2, 0xea,0x2, +0xe9,0x2, 0xe8,0x2, 0xe7,0x2, 0xe6,0x2, 0xe5,0x2, 0xe4,0x2, 0xe3,0x2, 0xe2,0x2, +0xe1,0x2, 0xe0,0x2, 0xdf,0x2, 0xde,0x2, 0xdd,0x2, 0xdc,0x2, 0xdb,0x2, 0xda,0x2, +0xd9,0x2, 0xd8,0x2, 0xd7,0x2, 0xd6,0x2, 0xd5,0x2, 0xcd,0x2, 0xcc,0x2, 0xcb,0x2, +0xca,0x2, 0xc9,0x2, 0xc8,0x2, 0xc7,0x2, 0xc6,0x2, 0xc5,0x2, 0xc4,0x2, 0xc3,0x2, +0xc2,0x2, 0xc1,0x2, 0xc0,0x2, 0xbf,0x2, 0xbe,0x2, 0xbd,0x2, 0xbc,0x2, 0xbb,0x2, +0xba,0x2, 0xb9,0x2, 0xb8,0x2, 0xb7,0x2, 0xb6,0x2, 0xb5,0x2, 0xb4,0x2, 0xb3,0x2, +0xb2,0x2, 0xb1,0x2, 0xb0,0x2, 0xaf,0x2, 0xae,0x2, 0xa3,0x2, 0xa2,0x2, 0xa1,0x2, +0xa0,0x2, 0x9f,0x2, 0x9e,0x2, 0x9d,0x2, 0x9c,0x2, 0x9b,0x2, 0x9a,0x2, 0x99,0x2, +0x98,0x2, 0x97,0x2, 0x96,0x2, 0x95,0x2, 0x94,0x2, 0x93,0x2, 0x92,0x2, 0x91,0x2, +0x90,0x2, 0x8f,0x2, 0x8e,0x2, 0x8d,0x2, 0x8c,0x2, 0x8b,0x2, 0x8a,0x2, 0x89,0x2, +0x88,0x2, 0x87,0x2, 0x86,0x2, 0x85,0x2, 0x84,0x2, 0x7c,0x2, 0x7b,0x2, 0x7a,0x2, +0x79,0x2, 0x78,0x2, 0x77,0x2, 0x76,0x2, 0x75,0x2, 0x74,0x2, 0x73,0x2, 0x72,0x2, +0x71,0x2, 0x70,0x2, 0x6f,0x2, 0x6e,0x2, 0x6d,0x2, 0x6c,0x2, 0x6b,0x2, 0x6a,0x2, +0x69,0x2, 0x68,0x2, 0x67,0x2, 0x66,0x2, 0x65,0x2, 0x64,0x2, 0x63,0x2, 0x62,0x2, +0x61,0x2, 0x60,0x2, 0x5f,0x2, 0x5e,0x2, 0x5d,0x2, 0x55,0x2, 0x54,0x2, 0x53,0x2, +0x52,0x2, 0x51,0x2, 0x50,0x2, 0x4f,0x2, 0x4e,0x2, 0x4d,0x2, 0x4c,0x2, 0x4b,0x2, +0x4a,0x2, 0x49,0x2, 0x48,0x2, 0x47,0x2, 0x46,0x2, 0x45,0x2, 0x44,0x2, 0x43,0x2, +0x42,0x2, 0x41,0x2, 0x40,0x2, 0x3f,0x2, 0x3e,0x2, 0x3d,0x2, 0x3c,0x2, 0x3b,0x2, +0x3a,0x2, 0x39,0x2, 0x38,0x2, 0x37,0x2, 0x36,0x2, 0x2b,0x2, 0x2a,0x2, 0x29,0x2, +0x28,0x2, 0x27,0x2, 0x26,0x2, 0x25,0x2, 0x24,0x2, 0x23,0x2, 0x22,0x2, 0x21,0x2, +0x20,0x2, 0x1f,0x2, 0x1e,0x2, 0x1d,0x2, 0x1c,0x2, 0x1b,0x2, 0x1a,0x2, 0x19,0x2, +0x18,0x2, 0x17,0x2, 0x16,0x2, 0x15,0x2, 0x14,0x2, 0x13,0x2, 0x12,0x2, 0x11,0x2, +0x10,0x2, 0xf, 0x2, 0xe, 0x2, 0xd, 0x2, 0xc, 0x2, 0x4, 0x2, 0x3, 0x2, 0x2, 0x2, +0x1, 0x2, 0x0, 0x1, 0xff,0x1, 0xfe,0x1, 0xfd,0x1, 0xfc,0x1, 0xfb,0x1, 0xfa,0x1, +0xf9,0x1, 0xf8,0x1, 0xf7,0x1, 0xf6,0x1, 0xf5,0x1, 0xf4,0x1, 0xf3,0x1, 0xf2,0x1, +0xf1,0x1, 0xf0,0x1, 0xef,0x1, 0xee,0x1, 0xed,0x1, 0xec,0x1, 0xeb,0x1, 0xea,0x1, +0xe9,0x1, 0xe8,0x1, 0xe7,0x1, 0xe6,0x1, 0xe5,0x1, 0xdd,0x1, 0xdc,0x1, 0xdb,0x1, +0xda,0x1, 0xd9,0x1, 0xd8,0x1, 0xd7,0x1, 0xd6,0x1, 0xd5,0x1, 0xd4,0x1, 0xd3,0x1, +0xd2,0x1, 0xd1,0x1, 0xd0,0x1, 0xcf,0x1, 0xce,0x1, 0xcd,0x1, 0xcc,0x1, 0xcb,0x1, +0xca,0x1, 0xc9,0x1, 0xc8,0x1, 0xc7,0x1, 0xc6,0x1, 0xc5,0x1, 0xc4,0x1, 0xc3,0x1, +0xc2,0x1, 0xc1,0x1, 0xc0,0x1, 0xbf,0x1, 0xbe,0x1, 0x62,0x1, 0x61,0x1, 0x60,0x1, +0x5f,0x1, 0x5e,0x1, 0x5d,0x1, 0x5c,0x1, 0x5b,0x1, 0x5a,0x1, 0x59,0x1, 0x58,0x1, +0x57,0x1, 0x56,0x1, 0x55,0x1, 0x54,0x1, 0x53,0x1, 0x52,0x1, 0x51,0x1, 0x50,0x1, +0x4f,0x1, 0x4e,0x1, 0x4d,0x1, 0x4c,0x1, 0x4b,0x1, 0x4a,0x1, 0x49,0x1, 0x48,0x1, +0x47,0x1, 0x46,0x1, 0x45,0x1, 0x44,0x1, 0x43,0x1, 0x3b,0x1, 0x3a,0x1, 0x39,0x1, +0x38,0x1, 0x37,0x1, 0x36,0x1, 0x35,0x1, 0x34,0x1, 0x33,0x1, 0x32,0x1, 0x31,0x1, +0x30,0x1, 0x2f,0x1, 0x2e,0x1, 0x2d,0x1, 0x2c,0x1, 0x2b,0x1, 0x2a,0x1, 0x29,0x1, +0x28,0x1, 0x27,0x1, 0x26,0x1, 0x25,0x1, 0x24,0x1, 0x23,0x1, 0x22,0x1, 0x21,0x1, +0x20,0x1, 0x1f,0x1, 0x1e,0x1, 0x1d,0x1, 0x1c,0x1, 0x14,0x1, 0x13,0x1, 0x12,0x1, +0x11,0x1, 0x10,0x1, 0xf, 0x1, 0xe, 0x1, 0xd, 0x1, 0xc, 0x1, 0xb, 0x1, 0xa, 0x1, +0x9, 0x1, 0x8, 0x1, 0x7, 0x1, 0x6, 0x1, 0x5, 0x1, 0x4, 0x1, 0x3, 0x1, 0x2, 0x1, +0x1, 0x1, 0x0, 0x0, 0xff,0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, +0xf9,0x0, 0xf8,0x0, 0xf7,0x0, 0xf6,0x0, 0xf5,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, +0xe7,0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, +0xdf,0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, +0xd7,0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, +0xcf,0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, +0xc0,0x0, 0xbf,0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, +0xb8,0x0, 0xb7,0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, +0xb0,0x0, 0xaf,0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, +0xa8,0x0, 0xa7,0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, +0x99,0x0, 0x98,0x0, 0x97,0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, +0x91,0x0, 0x90,0x0, 0x8f,0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, +0x89,0x0, 0x88,0x0, 0x87,0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, +0x81,0x0, 0x80,0x0, 0x7f,0x0, 0x7e,0x0, 0x7d,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, +0x6f,0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, +0x67,0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, +0x5f,0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, +0x57,0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, +0x48,0x0, 0x47,0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, +0x40,0x0, 0x3f,0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, +0x38,0x0, 0x37,0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, +0x30,0x0, 0x2f,0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, +0x21,0x0, 0x20,0x0, 0x1f,0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, +0x19,0x0, 0x18,0x0, 0x17,0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, +0x11,0x0, 0x10,0x0, 0xf, 0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, +0x9, 0x0, 0x8, 0x0, 0x7, 0x0, 0x6, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x17,0x3, 0x5, 0x0, 0xd, 0x17,0x3, +0x5, 0x1, 0xe, 0x17,0x3, 0x5, 0x2, 0x10,0x2, 0x1, 0xa, 0x1e,0x24,0x14,0x0, 0x64, +0xd, 0xac,0x0, 0xc8,0x1, 0x4, 0x0, 0x87,0x0, 0xd2,0x1, 0xf4,0x1, 0x90,0x1, 0x90, +0x1, 0x2c,0x1, 0x2c,0xa, 0x0, 0x2, 0x56,0x1, 0x5, 0xc, 0x1e,0x3c,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x6, 0x1, 0x0, 0x1, 0x80,0x1, 0x0, 0x14,0x1, 0xda,0x0, 0x1, 0x0, 0x16,0x1, +0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0xeb,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x1d,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x3, 0x3, 0x0, 0xff,0xff,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x1, 0xc8,0xb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x2, 0x40,0x4, 0x0, 0x2, 0xd5,0x1, 0x68,0x28,0x28,0x1, 0x9a,0x1, +0xb8,0x0, 0xa0,0x0, 0xa2,0x5, 0xa0,0x2, 0xd0,0x2e,0x2e,0x1, 0x98,0x1, 0x7a,0x0, +0xb4,0x0, 0xb4,0x12,0x0, 0xb4,0x1, 0x68,0x2, 0x1c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xa8,0x1, 0x2c, +0x0, 0x48,0x0, 0x1, 0x1, 0x5, 0x1, 0x2, 0x2, 0x4, 0x4, 0x6, 0x80,0x0, 0x64,0x7, +0xd0,0x8, 0x5, 0x6, 0x1, 0x2c,0x2, 0x58,0x1, 0x90,0x1f,0x40,0x23,0x1, 0x86,0x1, +0x86,0x0, 0xc, 0x17,0x11,0x12,0x1, 0x2c,0x1, 0x4, 0x4, 0x10,0x2, 0x8, 0x3, 0xa, +0xa, 0x0, 0x50,0x2, 0x85,0x0, 0x50,0x5, 0x50,0x0, 0x32,0x1, 0x5e,0x1, 0x5e,0x3, +0x20,0x0, 0xc8,0x0, 0x28,0x0, 0x1e,0x0, 0x80,0x0, 0xb5,0x2, 0xd0,0x0, 0x3c,0x3, +0xe8,0x1, 0x68,0x1, 0x6a,0x0, 0x3c,0x3, 0xe8,0x0, 0x20,0x2, 0xb5,0x0, 0x0, 0x5, +0xa0,0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x13,0x88,0x1, 0x2c,0x0, 0x0, 0x2, 0x3f,0x0, +0x1, 0x4, 0x0, 0x5, 0x0, 0x20,0x1, 0x0, 0x0, 0x5c,0x5c,0x0, 0x5c,0x5c,0x0, 0x5c, +0x5c,0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, +0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff, +0x7f,0xff,0x1, 0x1, 0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0x64,0xff,0xff,0xff, +0x30,0x0, 0x0, 0x0, 0x40,0x33,0x2d,0x24,0x1e,0x18,0x10,0xa, 0xa, 0xe, 0x15,0x1e, +0x24,0x2b,0x32,0x35,0x2f,0x28,0x22,0x1a,0x13,0xa, 0x3, 0x0, 0x1, 0x4, 0xa, 0x12, +0x1b,0x25,0x2c,0x31,0x9, 0x0, 0x0, 0x2, 0x4, 0x8, 0xf, 0x19,0x20,0x27,0x2b,0x2d, +0x2e,0x2e,0x2e,0x2c,0x2c,0x2d,0x2e,0x32,0x35,0x3b,0x43,0x4d,0x56,0x5d,0x62,0x67, +0x6a,0x6d,0x6e,0x70,0xda,0xe1,0xff,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10, +0xc, 0x8, 0x6, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d, +0x22,0x26,0x2a,0x30,0x35,0x39,0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10, +0x16,0x1b,0x1f,0x23,0x28,0x2d,0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b, +0x4a,0x48,0x46,0x43,0x40,0x3e,0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x40,0x39,0x34,0x2f, +0x2a,0x24,0x20,0x1b,0x15,0x10,0xb, 0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3, +0x4, 0x7, 0xa, 0xc, 0x10,0x15,0x19,0x1d,0x22,0x28,0x2d,0x31,0x4, 0x0, 0x0, 0x0, +0x1, 0x4, 0x6, 0x9, 0xd, 0x11,0x16,0x1b,0x21,0x27,0x2c,0x30,0x35,0x3c,0x42,0x46, +0x4a,0x51,0x57,0x5b,0x60,0x63,0x65,0x64,0x61,0x5d,0x59,0x56,0x89,0x65,0x34,0x55, +0x0, 0x3, 0x4, 0x6, 0x7, 0x9, 0x9, 0xb, 0xd, 0xf, 0x13,0x16,0x19,0x1d,0x20,0x22, +0x26,0x29,0x2b,0x2b,0x2d,0x2e,0x30,0x31,0x33,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f, +0x13,0x19,0x1e,0x22,0x26,0x29,0x2c,0x31,0x35,0x39,0x3c,0x3e,0x3f,0x3e,0x3b,0x38, +0x35,0x32,0x2f,0x2c,0x28,0x24,0x20,0x1c,0x19,0x16,0x12,0xe, 0xa, 0x6, 0x3, 0x1, +0x97,0xae,0xff,0x55,0x14,0x1a,0x1f,0x25,0x2a,0x2d,0x2d,0x28,0x24,0x1f,0x1b,0x17, +0x12,0xe, 0xc, 0xa, 0x8, 0x8, 0x8, 0x8, 0xa, 0xe, 0x13,0x17,0x1b,0x20,0x26,0x2c, +0x32,0x36,0x3c,0x3d,0x2c,0x2b,0x2a,0x27,0x24,0x21,0x1c,0x1a,0x1a,0x1c,0x1e,0x20, +0x25,0x2a,0x2e,0x32,0x37,0x3b,0x3f,0x43,0x47,0x4c,0x50,0x51,0x53,0x54,0x55,0x56, +0x57,0x57,0x57,0x57,0xdd,0x4, 0x33,0x55,0xe, 0x15,0x1b,0x21,0x26,0x2a,0x30,0x36, +0x3a,0x3d,0x3e,0x3d,0x3a,0x36,0x32,0x2d,0x28,0x1c,0x16,0x10,0xa, 0x6, 0x3, 0x1, +0x0, 0x0, 0x3, 0xa, 0x15,0x29,0x39,0x39,0x37,0x35,0x32,0x2f,0x2c,0x29,0x24,0x1e, +0x18,0x12,0xd, 0x9, 0x5, 0x1, 0x0, 0x0, 0x0, 0x5, 0x9, 0xe, 0x14,0x1c,0x24,0x2c, +0x35,0x3e,0x45,0x4a,0x4b,0x45,0x3f,0x3f,0xf3,0x41,0x33,0x55,0xa, 0x12,0x1a,0x1e, +0x23,0x26,0x25,0x1f,0x1b,0x12,0xa, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, 0x2, 0x6, 0x11, +0x19,0x1d,0x26,0x31,0x36,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x33,0x2c,0x23,0x1e, +0x16,0xe, 0x9, 0x1, 0x1, 0x6, 0x11,0x16,0x1f,0x25,0x2e,0x39,0x3e,0x46,0x49,0x48, +0x43,0x3f,0x35,0x2a,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xa2,0x28,0x33,0x55, +0x3, 0xb, 0x10,0x15,0x1a,0x1e,0x21,0x27,0x29,0x28,0x25,0x20,0x1b,0xe, 0x9, 0x7, +0x5, 0x3, 0x1, 0x0, 0x0, 0x1, 0x3, 0x5, 0x9, 0x16,0x1f,0x29,0x33,0x36,0x36,0x36, +0x22,0x20,0x1f,0x1e,0x1b,0x18,0x15,0xc, 0x7, 0x2, 0x0, 0x0, 0x2, 0xb, 0x10,0x14, +0x18,0x1c,0x21,0x2b,0x2f,0x33,0x37,0x3b,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3b,0x3b, +0x6, 0x43,0x33,0x55,0x4, 0xc, 0x13,0x1a,0x20,0x26,0x2c,0x32,0x34,0x31,0x2b,0x24, +0x1b,0x14,0xd, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, 0x2, 0x7, 0xe, 0x16,0x1d,0x23,0x29, +0x30,0x36,0x3d,0x3e,0x1b,0x1c,0x1d,0x1d,0x1d,0x1c,0x1a,0x16,0x10,0x9, 0x3, 0x0, +0x0, 0x3, 0xa, 0x12,0x19,0x1f,0x25,0x2c,0x32,0x39,0x3f,0x44,0x47,0x48,0x47,0x46, +0x43,0x3f,0x3b,0x3a,0x7c,0x49,0x33,0x55,0xb, 0x14,0x1b,0x23,0x2e,0x34,0x38,0x39, +0x36,0x32,0x2b,0x24,0x18,0x12,0xd, 0x9, 0x4, 0x2, 0x0, 0x0, 0x2, 0x6, 0xd, 0x13, +0x1f,0x25,0x2c,0x33,0x3e,0x3f,0x3f,0x3f,0x24,0x26,0x26,0x26,0x25,0x22,0x1d,0x16, +0xb, 0x5, 0x2, 0x0, 0x2, 0x6, 0xc, 0x13,0x1d,0x23,0x29,0x2f,0x3a,0x40,0x45,0x47, +0x49,0x49,0x48,0x46,0x42,0x41,0x41,0x41,0xd3,0x80,0x33,0x55,0x0, 0x8, 0x10,0x16, +0x1d,0x23,0x2b,0x30,0x32,0x32,0x30,0x2c,0x26,0x1e,0x18,0x11,0xb, 0x9, 0x6, 0x5, +0x4, 0x4, 0x6, 0xa, 0x11,0x19,0x21,0x28,0x2f,0x36,0x3c,0x3f,0x1f,0x21,0x22,0x22, +0x21,0x20,0x1d,0x18,0x12,0xc, 0x6, 0x2, 0x0, 0x0, 0x3, 0x9, 0x12,0x19,0x20,0x26, +0x2c,0x34,0x3b,0x41,0x45,0x48,0x49,0x48,0x46,0x42,0x3e,0x3c,0xdb,0x35,0x33,0x55, +0x4, 0xb, 0x13,0x1b,0x23,0x2a,0x29,0x1f,0x16,0xe, 0x6, 0x2, 0x0, 0x0, 0x3, 0x7, +0x10,0x19,0x22,0x2b,0x33,0x38,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x2c,0x27,0x21,0x1b,0x15,0xd, 0x4, 0x0, 0x1, 0x5, 0xc, 0x14,0x1d,0x28,0x32,0x36, +0x3d,0x3f,0x3e,0x3c,0x36,0x2e,0x26,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d, +0xb5,0x6c,0x33,0x55,0x17,0x1c,0x20,0x27,0x2b,0x30,0x39,0x3d,0x3f,0x3d,0x3a,0x35, +0x2b,0x25,0x20,0x17,0x13,0xe, 0x6, 0x3, 0x0, 0x0, 0x2, 0x9, 0xd, 0x11,0x19,0x1a, +0x1a,0x1a,0x1a,0x1a,0xa, 0x11,0x16,0x1d,0x20,0x23,0x23,0x1f,0x1a,0x10,0xb, 0x7, +0x1, 0x0, 0x0, 0x2, 0x4, 0x7, 0x10,0x16,0x21,0x26,0x2b,0x35,0x39,0x3c,0x3f,0x40, +0x40,0x40,0x40,0x40,0x68,0xc0,0x33,0x55,0xa, 0x10,0x1a,0x1e,0x26,0x2c,0x2d,0x2c, +0x29,0x20,0x15,0xf, 0x6, 0x3, 0x0, 0x0, 0x0, 0x3, 0x7, 0x10,0x1c,0x22,0x2d,0x37, +0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x2b,0x29,0x24,0x21,0x1a,0x12,0xe, 0x5, +0x2, 0x0, 0x1, 0x3, 0xb, 0x10,0x1a,0x25,0x29,0x32,0x36,0x3d,0x3f,0x3e,0x3a,0x33, +0x2e,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x1e,0x4d,0x33,0x55,0x0, 0x1, 0x3, 0x5, +0x6, 0x8, 0xb, 0xd, 0x11,0x13,0x16,0x16,0x1a,0x1f,0x21,0x24,0x26,0x28,0x2a,0x2f, +0x35,0x36,0x38,0x39,0x3a,0x3c,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x42,0x37,0x2d,0x23, +0x1d,0x12,0x7, 0x1, 0x9, 0x13,0x1f,0x25,0x31,0x3b,0x36,0x2c,0x20,0x1a,0xf, 0x2, +0x9, 0x11,0x20,0x2d,0x35,0x40,0x47,0x47,0x47,0x47,0x47,0x47,0xff,0x1f,0x32,0x55, +0x0, 0x0, 0x2, 0x3, 0x6, 0x9, 0xc, 0xf, 0x13,0x18,0x1c,0x1d,0x1e,0x1e,0x1e,0x1d, +0x1d,0x23,0x26,0x2a,0x2d,0x32,0x38,0x3d,0x3f,0x3f,0x3e,0x3c,0x3b,0x3a,0x3a,0x3a, +0x40,0x35,0x2f,0x28,0x21,0x1a,0x13,0xd, 0x7, 0x1, 0x4, 0xb, 0x11,0x17,0x1d,0x24, +0x2b,0x2a,0x22,0x1c,0x15,0xf, 0x8, 0x3, 0x8, 0xf, 0x16,0x1d,0x23,0x29,0x31,0x32, +0xa5,0xf2,0x32,0x55,0x4, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x6, 0xe, 0x13,0x16,0x18, +0x1b,0x1e,0x1e,0x1e,0x1f,0x1f,0x21,0x24,0x2c,0x30,0x35,0x3a,0x3c,0x3f,0x3f,0x3f, +0x3f,0x3f,0x3f,0x3f,0x40,0x39,0x30,0x27,0x22,0x19,0x10,0xd, 0x13,0x1c,0x25,0x2a, +0x33,0x32,0x2d,0x23,0x18,0x12,0x9, 0x1, 0x3, 0x9, 0x13,0x1e,0x23,0x26,0x26,0x26, +0x26,0x26,0x26,0x26,0x7b,0x12,0x32,0x55,0x19,0x14,0x11,0xc, 0x9, 0x5, 0x2, 0x0, +0x4, 0x9, 0xd, 0x11,0x1b,0x20,0x22,0x23,0x23,0x23,0x26,0x27,0x2a,0x2d,0x30,0x37, +0x39,0x3c,0x3d,0x3f,0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x10,0x1d,0x23,0x2e,0x36,0x3d, +0x35,0x27,0x1e,0x16,0xe, 0x14,0x21,0x28,0x34,0x39,0x30,0x29,0x1d,0x16,0x10,0x16, +0x1d,0x2c,0x34,0x3f,0x3f,0x3f,0x3f,0x3f,0xe1,0xb1,0x32,0x55,0xb, 0x6, 0x4, 0x2, +0x0, 0x0, 0x0, 0x1, 0x5, 0xf, 0x13,0x17,0x1b,0x1e,0x21,0x20,0x1d,0x19,0x17,0x16, +0x16,0x19,0x1e,0x23,0x28,0x31,0x35,0x39,0x3c,0x3f,0x3f,0x3f,0x40,0x3a,0x35,0x30, +0x2b,0x25,0x20,0x1b,0x17,0x16,0x1a,0x1e,0x23,0x27,0x2a,0x27,0x22,0x17,0x12,0xd, +0x8, 0x4, 0x1, 0x0, 0x0, 0x7, 0xb, 0xf, 0x13,0x15,0x15,0x15,0x4b,0xbb,0x32,0x55, +0x0, 0x3, 0x8, 0xa, 0x11,0x14,0x1c,0x20,0x24,0x25,0x25,0x24,0x23,0x25,0x27,0x2d, +0x30,0x36,0x3b,0x3f,0x3f,0x3f,0x3f,0x3e,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d, +0x29,0x22,0x18,0x12,0x8, 0x4, 0x0, 0x1, 0xc, 0x12,0x1c,0x22,0x2b,0x2a,0x24,0x18, +0x12,0xa, 0x8, 0xf, 0x14,0x1e,0x23,0x2e,0x34,0x3d,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e, +0xc6,0x28,0x32,0x55,0x1f,0x1b,0x17,0x14,0x13,0x12,0x11,0x11,0x12,0x14,0x1a,0x1d, +0x21,0x23,0x24,0x24,0x25,0x24,0x24,0x23,0x21,0x21,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e, +0x1e,0x1e,0x1e,0x1e,0x1a,0x1d,0x23,0x29,0x2c,0x34,0x3b,0x3e,0x47,0x4e,0x53,0x51, +0x4b,0x44,0x42,0x3c,0x35,0x32,0x2c,0x25,0x1e,0x1c,0x19,0x19,0x19,0x19,0x19,0x19, +0x19,0x19,0x19,0x19,0xfa,0xf6,0x30,0x55,0x23,0x1e,0x1c,0x1a,0x18,0x17,0x16,0x15, +0x15,0x14,0x14,0x14,0x14,0x16,0x19,0x1d,0x21,0x25,0x28,0x2a,0x2b,0x2c,0x2d,0x2d, +0x2c,0x2b,0x2a,0x29,0x28,0x27,0x27,0x27,0x2f,0x36,0x3a,0x3e,0x43,0x48,0x4d,0x52, +0x56,0x5b,0x60,0x65,0x6a,0x6e,0x71,0x72,0x72,0x70,0x6c,0x67,0x62,0x5d,0x57,0x51, +0x4c,0x47,0x43,0x3e,0x38,0x34,0x31,0x31,0xe4,0xae,0x30,0x55,0x7, 0x5, 0x4, 0x4, +0x5, 0x6, 0xd, 0x14,0x1c,0x22,0x28,0x2f,0x34,0x37,0x39,0x3a,0x39,0x38,0x36,0x32, +0x2c,0x26,0x1a,0x14,0xe, 0xb, 0x8, 0x6, 0x6, 0x5, 0x5, 0x5, 0x33,0x3d,0x43,0x4b, +0x51,0x58,0x64,0x69,0x68,0x65,0x61,0x55,0x4d,0x43,0x3b,0x32,0x22,0x1a,0x13,0xb, +0x7, 0x5, 0x8, 0xf, 0x16,0x1e,0x24,0x30,0x37,0x3c,0x3c,0x3c,0x71,0x75,0x30,0x55, +0x3, 0x0, 0x0, 0x0, 0x0, 0x3, 0x7, 0xe, 0x1b,0x22,0x2d,0x32,0x37,0x3a,0x3c,0x3d, +0x3c,0x3a,0x38,0x34,0x29,0x21,0x15,0xc, 0x7, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x2a,0x34,0x3c,0x47,0x4d,0x59,0x60,0x66,0x67,0x66,0x5e,0x58,0x51,0x45,0x3e,0x30, +0x29,0x22,0x17,0xf, 0x5, 0x3, 0x6, 0xb, 0x11,0x1b,0x21,0x2d,0x2e,0x2e,0x2e,0x2e, +0x6a,0x73,0x30,0x55,0xc, 0x5, 0x2, 0x0, 0x0, 0x0, 0x0, 0x2, 0x5, 0xc, 0x13,0x1e, +0x25,0x30,0x35,0x3b,0x3d,0x3f,0x3f,0x3d,0x3c,0x38,0x33,0x28,0x22,0x18,0x12,0xe, +0xd, 0xd, 0xd, 0xd, 0x11,0x19,0x1f,0x2a,0x30,0x3c,0x42,0x4f,0x55,0x5f,0x63,0x64, +0x61,0x59,0x51,0x44,0x3d,0x2e,0x26,0x1c,0x16,0xa, 0x3, 0x0, 0x0, 0x4, 0x8, 0xe, +0xf, 0xf, 0xf, 0xf, 0x7d,0xd0,0x30,0x55,0x15,0xd, 0x8, 0x4, 0x2, 0x0, 0x0, 0x0, +0x0, 0x1, 0x8, 0xf, 0x17,0x1f,0x2d,0x34,0x39,0x3c,0x3d,0x3f,0x3f,0x3e,0x3a,0x32, +0x2c,0x26,0x20,0x19,0xf, 0xc, 0xc, 0xc, 0x3, 0x9, 0xf, 0x17,0x1e,0x28,0x2e,0x35, +0x3b,0x42,0x50,0x56,0x57,0x56,0x50,0x49,0x41,0x39,0x31,0x25,0x1e,0x17,0xf, 0x5, +0x1, 0x0, 0x0, 0x1, 0x7, 0x9, 0x9, 0x9, 0xca,0xac,0x30,0x55,0x2c,0x23,0x1f,0x19, +0x13,0xc, 0x7, 0x3, 0x0, 0x0, 0x0, 0x1, 0x5, 0xa, 0xf, 0x16,0x1d,0x23,0x2a,0x30, +0x36,0x3b,0x3e,0x40,0x3f,0x3e,0x3b,0x38,0x33,0x2f,0x2b,0x28,0x9, 0x1, 0x0, 0x1, +0x3, 0x9, 0xe, 0x14,0x1b,0x21,0x27,0x2e,0x36,0x3b,0x3e,0x41,0x41,0x40,0x3d,0x3a, +0x36,0x2f,0x2b,0x26,0x20,0x1c,0x16,0x10,0xc, 0xa, 0x9, 0xb, 0x36,0xdc,0x30,0x55, +0x21,0x13,0xc, 0x8, 0x5, 0x2, 0x1, 0x0, 0x0, 0x1, 0x3, 0x8, 0xf, 0x17,0x1e,0x24, +0x2b,0x32,0x39,0x3d,0x3e,0x3f,0x3f,0x3d,0x3a,0x36,0x30,0x29,0x21,0x1a,0x16,0x13, +0x5, 0x9, 0xe, 0x14,0x1a,0x22,0x29,0x30,0x38,0x3f,0x47,0x4d,0x51,0x51,0x4f,0x4d, +0x49,0x42,0x39,0x31,0x2b,0x25,0x1e,0x17,0x10,0x8, 0x3, 0x0, 0x0, 0x1, 0x3, 0x5, +0xaf,0x13,0x30,0x55,0x3e,0x3b,0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, +0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b, +0x3c,0x3e,0x3f,0x3f,0x1f,0x10,0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18, +0x1e,0x25,0x2c,0x35,0x3c,0x42,0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33, +0x2c,0x25,0x1f,0x1c,0xf9,0xa2,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e,0x3f,0x3f, +0x3e,0x3d,0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x1, +0x1, 0x4, 0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29,0x22,0x1b, +0x15,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c,0x24,0x2a, +0x30,0x35,0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, 0x4, 0x7, +0xa, 0x10,0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b,0x38,0x31, +0x29,0x21,0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35,0x3d,0x45, +0x4b,0x51,0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17,0x11,0x9, +0x3, 0x0, 0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6,0x30,0x55, +0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28,0x30,0x36,0x3b,0x3d,0x3f,0x3f, +0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, 0x0, 0x0, 0x1, 0x2, 0x3, 0x5, +0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d,0x52,0x4a,0x3e,0x35,0x2b,0x20, +0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19,0x22,0x2b,0x31,0x3a,0x42,0x47, +0xef,0xc9,0x30,0x55,0x37,0x38,0x37,0x34,0x2d,0x26,0x1c,0x16,0xe, 0x9, 0x4, 0x2, +0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x10,0x17,0x20,0x26,0x2e,0x35,0x3a,0x3c,0x3e, +0x3f,0x3f,0x3e,0x3e,0x30,0x40,0x49,0x50,0x59,0x5e,0x60,0x5d,0x56,0x50,0x47,0x41, +0x39,0x33,0x2a,0x20,0x1a,0x10,0xa, 0x5, 0x1, 0x0, 0x0, 0x3, 0x8, 0x10,0x17,0x1f, +0x25,0x2f,0x38,0x3c,0x37,0xc3,0x57,0x55,0x3b,0x3d,0x3d,0x3b,0x38,0x32,0x27,0x1c, +0x13,0xe, 0x8, 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, 0xb, 0x12,0x18,0x20,0x28,0x31, +0x39,0x3d,0x3f,0x40,0x3f,0x3f,0x3e,0x3e,0x33,0x45,0x4e,0x57,0x5d,0x65,0x6c,0x6a, +0x66,0x63,0x5c,0x53,0x4a,0x40,0x38,0x2e,0x25,0x1a,0x11,0x8, 0x4, 0x0, 0x0, 0x2, +0x9, 0x10,0x19,0x21,0x2a,0x32,0x39,0x3e,0x7, 0x90,0x57,0x55,0x18,0x2c,0x34,0x39, +0x3c,0x3d,0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, 0x6, 0x1, +0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, 0x8, 0xe, +0x14,0x1a,0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58,0x51,0x48, +0x3f,0x38,0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf,0x57,0x55, +0x16,0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28,0x30,0x38, +0x3c,0x3e,0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16,0xf, 0xc, +0x53,0x46,0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, +0x13,0x1a,0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a,0x58,0x57, +0xc6,0x55,0x57,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38,0x3c,0x3e, +0x3f,0x3e,0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, 0x1, 0x0, +0x0, 0x0, 0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17, +0x20,0x2a,0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57,0x4f,0x47, +0x40,0x38,0x32,0x2f,0x1a,0xb5,0x57,0x55,0x0, 0xb, 0x14,0x1b,0x21,0x28,0x2f,0x37, +0x3d,0x3f,0x3e,0x3c,0x39,0x33,0x2b,0x23,0x1c,0x15,0xc, 0x5, 0x3, 0x3, 0x6, 0x9, +0xd, 0x12,0x18,0x1e,0x24,0x2c,0x33,0x36,0x19,0x13,0x10,0x10,0xf, 0xf, 0x11,0x16, +0x1c,0x25,0x2d,0x33,0x39,0x40,0x47,0x4a,0x4c,0x4c,0x49,0x43,0x3b,0x33,0x2d,0x26, +0x20,0x1a,0x14,0xe, 0xa, 0x5, 0x1, 0x0, 0xb0,0xb5,0x57,0x55,0x2, 0x9, 0xf, 0x1a, +0x1f,0x29,0x2f,0x38,0x3b,0x3e,0x3f,0x3f,0x3b,0x37,0x2e,0x29,0x1e,0x18,0xe, 0xa, +0x3, 0x1, 0x0, 0x0, 0x0, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x3, +0x5, 0x9, 0xd, 0x18,0x1e,0x27,0x2d,0x32,0x3c,0x3f,0x45,0x46,0x45,0x44,0x3e,0x39, +0x2f,0x2a,0x25,0x1a,0x14,0xc, 0x9, 0x9, 0x9, 0x9, 0x9, 0x9, 0x2b,0x77,0x57,0x55, +0x0, 0x1, 0x2, 0x4, 0x5, 0x8, 0xa, 0xf, 0x12,0x15,0x18,0x1a,0x1f,0x22,0x24,0x25, +0x26,0x26,0x28,0x2a,0x2c,0x2f,0x33,0x36,0x37,0x39,0x3a,0x3c,0x3e,0x3f,0x3f,0x3f, +0x1, 0xf, 0x1b,0x2d,0x3d,0x52,0x5f,0x6a,0x60,0x4a,0x39,0x2a,0x17,0xb, 0x4, 0xe, +0x1e,0x2e,0x42,0x50,0x62,0x6b,0x65,0x53,0x43,0x31,0x23,0x13,0x7, 0x2, 0x2, 0x2, +0xa2,0x22,0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x6, 0xa, 0xe, +0x12,0x15,0x18,0x1a,0x1e,0x21,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x29,0x2f,0x34, +0x3a,0x3e,0x3e,0x3e,0x1, 0xa, 0x11,0x17,0x1e,0x24,0x29,0x2e,0x34,0x34,0x2d,0x24, +0x1c,0x14,0xe, 0x8, 0x3, 0x9, 0x10,0x19,0x22,0x2a,0x31,0x36,0x3b,0x38,0x2f,0x24, +0x19,0x11,0x11,0x11,0x4c,0x9f,0x31,0x55,0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0xa, +0xc, 0x10,0x15,0x19,0x1b,0x1f,0x1e,0x1e,0x1d,0x1c,0x1c,0x1e,0x21,0x29,0x31,0x3a, +0x3e,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x0, 0x8, 0x14,0x1d,0x23,0x2d,0x34,0x2d, +0x29,0x1e,0x13,0xb, 0x6, 0x6, 0x10,0x19,0x1e,0x29,0x32,0x3c,0x3e,0x34,0x28,0x1b, +0x14,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0xef,0x5, 0x31,0x55,0x0, 0x2, 0x4, 0x5, +0x6, 0x7, 0x9, 0xa, 0xd, 0xf, 0x11,0x12,0x14,0x16,0x19,0x1c,0x1f,0x22,0x24,0x24, +0x26,0x29,0x2f,0x31,0x33,0x35,0x37,0x39,0x3a,0x3c,0x3e,0x3e,0x6, 0x10,0x17,0x1d, +0x23,0x2a,0x31,0x39,0x3c,0x36,0x2f,0x28,0x21,0x1a,0x13,0x10,0x16,0x22,0x29,0x2f, +0x36,0x3d,0x3b,0x34,0x2e,0x27,0x21,0x1a,0x13,0xc, 0x4, 0x2, 0x56,0x3f,0x31,0x55, +0x0, 0x2, 0x5, 0x7, 0xa, 0xc, 0xe, 0x14,0x17,0x1b,0x1f,0x25,0x27,0x28,0x28,0x29, +0x29,0x2d,0x30,0x33,0x36,0x39,0x3c,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f, +0x8, 0xf, 0x18,0x23,0x2d,0x37,0x40,0x41,0x3d,0x34,0x2b,0x24,0x2d,0x35,0x3e,0x47, +0x4a,0x42,0x38,0x2c,0x20,0x15,0xb, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0xf6,0x5, 0x31,0x55,0x0, 0x1, 0x3, 0x5, 0x6, 0x7, 0x9, 0xa, 0xc, 0xd, 0xf, 0x13, +0x14,0x15,0x18,0x1a,0x21,0x25,0x26,0x27,0x27,0x27,0x2c,0x2f,0x36,0x3a,0x3d,0x3f, +0x3f,0x3f,0x3f,0x3f,0x0, 0x6, 0xb, 0x14,0x1a,0x1f,0x29,0x2e,0x37,0x3b,0x3e,0x37, +0x32,0x2e,0x25,0x20,0x18,0x1c,0x21,0x29,0x2d,0x31,0x33,0x2d,0x21,0x1b,0x15,0x10, +0x10,0x10,0x10,0x10,0x22,0x55,0x31,0x55,0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x4, 0x7, +0xc, 0x10,0x13,0x16,0x19,0x1b,0x1f,0x22,0x22,0x23,0x23,0x23,0x23,0x26,0x2c,0x31, +0x34,0x36,0x38,0x3a,0x3b,0x3d,0x3f,0x3f,0xa, 0x12,0x1b,0x24,0x2d,0x34,0x3c,0x43, +0x42,0x3b,0x33,0x2b,0x22,0x1c,0x15,0x15,0x1b,0x26,0x2d,0x34,0x3a,0x41,0x41,0x3b, +0x33,0x2b,0x22,0x1a,0x11,0xa, 0x2, 0x1, 0xfa,0x31,0x31,0x55,0x2, 0x2, 0x1, 0x1, +0x0, 0x0, 0x0, 0x6, 0xa, 0x12,0x15,0x1b,0x1d,0x1f,0x1e,0x1e,0x1d,0x1d,0x1d,0x1f, +0x23,0x2a,0x2f,0x36,0x39,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x3e,0x0, 0x8, 0xe, 0x19, +0x1e,0x29,0x2e,0x30,0x2d,0x23,0x1d,0x13,0xe, 0x13,0x17,0x21,0x25,0x30,0x35,0x3e, +0x3f,0x3a,0x35,0x2b,0x27,0x1e,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0xc8,0x46,0x31,0x55, +0x0, 0x3, 0x5, 0xc, 0x11,0x18,0x1c,0x1f,0x1f,0x1e,0x1e,0x1d,0x1d,0x23,0x26,0x2e, +0x32,0x3b,0x3d,0x3f,0x3f,0x3f,0x40,0x40,0x3f,0x3e,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d, +0x1e,0x25,0x29,0x31,0x36,0x3d,0x3f,0x39,0x35,0x2c,0x27,0x1c,0x17,0x1b,0x1f,0x2a, +0x2f,0x37,0x34,0x2b,0x27,0x1f,0x1b,0x11,0xc, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x5, 0xb3,0x31,0x55,0x1e,0x0, 0x0, 0x0, 0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10, +0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30, +0x32,0x34,0x36,0x38,0x3a,0x3c,0x1, 0x3, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x62,0x33,0x0, 0x2, 0x62,0xac, +0x0, 0x2, 0x63,0xee,0x0, 0x2, 0x63,0xec,0x0, 0x2, 0x63,0xed,0x0, 0x2, 0x63,0xe5, +0x0, 0x2, 0x63,0xe4,0x0, 0x2, 0x63,0xe1,0x0, 0x2, 0x63,0xe0,0x0, 0x2, 0x63,0xd9, +0x0, 0x2, 0x62,0x30,0x0, 0x2, 0x63,0xd8,0x0, 0x2, 0x0, 0x8, 0x0, 0x2, 0x2d,0x4d, +0x0, 0x2, 0x24,0xb2,0x0, 0x2, 0x63,0xf0,0x0, 0x2, 0x65,0x98,0x0, 0x0, 0x62,0xd0, +0x0, 0x3, 0x11,0x64,0x0, 0x3, 0x9, 0x88,0x0, 0x3, 0x9, 0x60,0x0, 0x3, 0x9, 0x88, +0x0, 0x2, 0x2d,0x4e,0x0, 0x3, 0x6, 0x5c,0x0, 0x2, 0x2d,0x4c,0x0, 0x2, 0x3e,0xfa, +0x0, 0x2, 0x38,0xa8,0x0, 0x2, 0x32,0x58,0x0, 0x2, 0x38,0xaa,0x0, 0x3, 0x5, 0xe0, +0x0, 0x2, 0x24,0x6f,0x0, 0x2, 0x74,0xcc,0x0, 0x2, 0x74,0xdf,0x0, 0x2, 0x74,0xcb, +0x0, 0x2, 0x2e,0x60,0x0, 0x3, 0x5, 0xe2,0x0, 0x3, 0x6, 0x5d,0x0, 0x2, 0x25,0x1e, +0x0, 0x2, 0x25,0x20,0x0, 0x2, 0x24,0x7e,0x0, 0x2, 0x24,0x62,0x0, 0x3, 0x6, 0xc8, +0x0, 0x2, 0x24,0xc0,0x0, 0x2, 0x24,0x67,0x0, 0x1, 0x42,0xac,0x0, 0x2, 0x24,0xc1, +0x0, 0x2, 0x25,0x1a,0x0, 0x2, 0x5f,0xa0,0x0, 0x2, 0x24,0xb4,0x0, 0x3, 0x5, 0xe4, +0x0, 0x0, 0x63,0xa2,0x0, 0x0, 0x63,0x94,0x0, 0x2, 0x24,0xc7,0x0, 0x2, 0x4b,0xbc, +0x0, 0x2, 0x4b,0xbd,0x0, 0x1, 0x42,0xd4,0x0, 0x2, 0x5e,0xb4,0x0, 0x2, 0x24,0x6a, +0x0, 0x1, 0x42,0xbc,0x0, 0x2, 0x2c,0xc6,0x0, 0x2, 0x74,0xe0,0x0, 0x2, 0xe, 0x60, +0x0, 0x2, 0xe, 0x8f,0x0, 0x1, 0x42,0xb0,0x0, 0x3, 0xa, 0xf0,0x0, 0x1, 0x42,0xdc, +0x0, 0x3, 0x9, 0xc8,0x0, 0x2, 0xe, 0x7c,0x0, 0x2, 0xe, 0x90,0x0, 0x2, 0x3e,0xfc, +0x0, 0x0, 0x62,0xc4,0x0, 0x2, 0xe, 0x58,0x0, 0x2, 0x75,0x54,0x0, 0x2, 0x2e,0x62, +0x0, 0x2, 0x24,0x83,0x0, 0x2, 0x24,0xd3,0x0, 0x3, 0xa, 0x2c,0x0, 0x2, 0x2e,0x64, +0x0, 0x2, 0x2c,0xc4,0x0, 0x2, 0xe, 0xe, 0x0, 0x2, 0xe, 0xd, 0x0, 0x2, 0xe, 0x8, +0x0, 0x2, 0xe, 0xa, 0x0, 0x2, 0xe, 0x9, 0x0, 0x2, 0xd, 0xce,0x0, 0x2, 0xd, 0xcd, +0x0, 0x2, 0xd, 0xc6,0x0, 0x2, 0xd, 0xca,0x0, 0x2, 0xd, 0xc9,0x0, 0x2, 0xd, 0xcc, +0x0, 0x2, 0xd, 0xcb,0x0, 0x2, 0xd, 0xc4,0x0, 0x2, 0xd, 0xb2,0x0, 0x2, 0xd, 0xc3, +0x0, 0x2, 0xd, 0xb1,0x0, 0x2, 0xd, 0xc5,0x0, 0x2, 0xd, 0xc8,0x0, 0x2, 0xd, 0xc7, +0x0, 0x2, 0xd, 0xc0,0x0, 0x2, 0xd, 0xbf,0x0, 0x2, 0xd, 0xbc,0x0, 0x2, 0xd, 0xbb, +0x0, 0x2, 0xd, 0xb8,0x0, 0x2, 0xd, 0xbe,0x0, 0x2, 0xd, 0xbd,0x0, 0x2, 0xd, 0xb6, +0x0, 0x2, 0xd, 0xb0,0x0, 0x2, 0xd, 0xb5,0x0, 0x2, 0xd, 0xaf,0x0, 0x2, 0xd, 0xb7, +0x0, 0x2, 0xd, 0xba,0x0, 0x2, 0xd, 0xb9,0x0, 0x2, 0xe, 0x1a,0x0, 0x2, 0xe, 0x13, +0x0, 0x2, 0xe, 0x12,0x0, 0x2, 0xe, 0x11,0x0, 0x2, 0xe, 0x10,0x0, 0x2, 0xe, 0xf, +0x0, 0x2, 0xd, 0x43,0x0, 0x2, 0xd, 0x42,0x0, 0x2, 0xd, 0x3f,0x0, 0x2, 0xd, 0x3e, +0x0, 0x2, 0xd, 0x35,0x0, 0x2, 0xd, 0x34,0x0, 0x2, 0xd, 0x39,0x0, 0x2, 0xd, 0x37, +0x0, 0x2, 0xd, 0x38,0x0, 0x2, 0xd, 0x36,0x0, 0x2, 0xd, 0x3d,0x0, 0x2, 0xd, 0x33, +0x0, 0x2, 0xd, 0x3c,0x0, 0x2, 0xd, 0x32,0x0, 0x2, 0xd, 0x28,0x0, 0x2, 0xd, 0x31, +0x0, 0x2, 0xd, 0x30,0x0, 0x2, 0xd, 0x44,0x0, 0x2, 0x0, 0x79,0x0, 0x2, 0xe, 0x19, +0x0, 0x2, 0xe, 0x18,0x0, 0x2, 0xd, 0x26,0x0, 0x2, 0xd, 0xf0,0x0, 0x2, 0xd, 0xef, +0x0, 0x2, 0xd, 0xee,0x0, 0x2, 0xd, 0x2f,0x0, 0x2, 0xd, 0x2e,0x0, 0x2, 0xe, 0x36, +0x0, 0x2, 0xe, 0x35,0x0, 0x2, 0xe, 0x3a,0x0, 0x2, 0xe, 0x39,0x0, 0x2, 0xe, 0x3c, +0x0, 0x2, 0xe, 0x3b,0x0, 0x2, 0xe, 0x38,0x0, 0x2, 0xe, 0x37,0x0, 0x2, 0xe, 0x4e, +0x0, 0x2, 0xe, 0x4d,0x0, 0x2, 0xe, 0x42,0x0, 0x2, 0xe, 0x41,0x0, 0x2, 0xe, 0x43, +0x0, 0x2, 0xe, 0x44,0x0, 0x2, 0xe, 0x3e,0x0, 0x2, 0xe, 0x3d,0x0, 0x2, 0xe, 0x40, +0x0, 0x2, 0xe, 0x3f,0x0, 0x2, 0xe, 0x34,0x0, 0x2, 0xe, 0x32,0x0, 0x2, 0xe, 0x52, +0x0, 0x2, 0xe, 0x51,0x0, 0x2, 0xe, 0x50,0x0, 0x2, 0xe, 0x4f,0x0, 0x2, 0xe, 0x54, +0x0, 0x2, 0xe, 0x53,0x0, 0x2, 0xd, 0xc2,0x0, 0x2, 0xd, 0xc1,0x0, 0x2, 0xd, 0xb4, +0x0, 0x2, 0xd, 0xb3,0x0, 0x2, 0xe, 0x1c,0x0, 0x2, 0xe, 0x2e,0x0, 0x2, 0xe, 0x2d, +0x0, 0x2, 0xe, 0x1b,0x0, 0x2, 0xe, 0x26,0x0, 0x2, 0xe, 0x2a,0x0, 0x2, 0xe, 0x25, +0x0, 0x2, 0xe, 0x29,0x0, 0x2, 0xe, 0x24,0x0, 0x2, 0xe, 0x23,0x0, 0x2, 0xe, 0x22, +0x0, 0x2, 0xe, 0x21,0x0, 0x2, 0xe, 0x20,0x0, 0x2, 0xe, 0x1f,0x0, 0x2, 0xe, 0x1e, +0x0, 0x2, 0xe, 0x1d,0x0, 0x2, 0x0, 0xc, 0x0, 0x2, 0xd, 0x27,0x0, 0x2, 0xd, 0xae, +0x0, 0x2, 0x24,0xab,0x0, 0x2, 0xe, 0x74,0x0, 0x2, 0x74,0xe4,0x0, 0x2, 0x61,0x52, +0x0, 0x2, 0x60,0x0, 0x0, 0x2, 0x5f,0xe8,0x0, 0x0, 0x63,0xb0,0x0, 0x2, 0x24,0x7d, +0x0, 0x3, 0x11,0x4c,0x0, 0x3, 0x6, 0x5e,0x0, 0x2, 0x24,0x5e,0x0, 0x0, 0x5e,0x9c, +0x0, 0x2, 0x24,0xb5,0x0, 0x2, 0x25,0x18,0x0, 0x2, 0x65,0xb0,0x0, 0x2, 0x5f,0x18, +0x0, 0x2, 0x1b,0x64,0x0, 0x2, 0x5f,0xa4,0x0, 0x2, 0x65,0xd0,0x0, 0x2, 0xf6,0x0, +0x0, 0x2, 0x24,0xcc,0x0, 0x3, 0xa, 0x38,0x0, 0x2, 0x2e,0x6c,0x0, 0x1, 0x42,0xc8, +0x0, 0x2, 0xae,0x34,0x0, 0x2, 0xa7,0xe2,0x0, 0x0, 0xf4,0xe0,0x0, 0x0, 0xf4,0xb8, +0x0, 0x2, 0xf3,0xb8,0x0, 0x2, 0xf3,0xba,0x0, 0x2, 0xed,0x68,0x0, 0x2, 0xf4,0x30, +0x0, 0x2, 0xf4,0xb8,0x0, 0x2, 0xf4,0xe0,0x0, 0x2, 0xd4,0x22,0x0, 0x2, 0xf5,0xfb, +0x0, 0x2, 0xf5,0xfa,0x0, 0x0, 0xda,0x74,0x0, 0x0, 0xdd,0x9c,0x0, 0x2, 0xf5,0x6, +0x0, 0x2, 0xcd,0xd0,0x0, 0x2, 0xc1,0x2c,0x0, 0x2, 0xe7,0x16,0x0, 0x2, 0xc7,0x7e, +0x0, 0x2, 0xf4,0xac,0x0, 0x2, 0xf4,0xb4,0x0, 0x2, 0xf5,0x12,0x0, 0x2, 0xf5,0xe, +0x0, 0x2, 0xf5,0xa, 0x0, 0x2, 0xf5,0x10,0x0, 0x2, 0xf5,0xc, 0x0, 0x2, 0xf5,0x8, +0x0, 0x0, 0xf5,0x8, 0x0, 0x0, 0xd4,0x22,0x0, 0x2, 0xae,0x36,0x0, 0x2, 0xe0,0xc4, +0x0, 0x2, 0xba,0xda,0x0, 0x2, 0xb4,0x88,0x0, 0x2, 0xa7,0xe4,0x0, 0x0, 0xae,0x36, +0x0, 0x2, 0xf4,0xb0,0x0, 0x0, 0x63,0x78,0x0, 0x2, 0x2e,0x66,0x0, 0x2, 0x24,0x6e, +0x0, 0x2, 0x5f,0x4c,0x0, 0x2, 0xe, 0x9c,0x0, 0x2, 0x24,0x86,0x0, 0x2, 0x24,0x6c, +0x0, 0x2, 0x45,0x52,0x0, 0x2, 0x3f,0x0, 0x0, 0x2, 0x2d,0x4b,0x0, 0x2, 0x24,0x61, +0x0, 0x2, 0x24,0x5d,0x0, 0x3, 0x6, 0xcc,0x0, 0x2, 0x24,0xc9,0x0, 0x1, 0x42,0xc0, +0x0, 0x1, 0x42,0xcc,0x0, 0x2, 0x5f,0xc4,0x0, 0x2, 0xf6,0x4, 0x0, 0x3, 0x11,0x68, +0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x24,0x85,0x0, 0x2, 0x4b,0xa4,0x0, 0x3, 0xa, 0x78, +0x0, 0x2, 0x24,0x76,0x0, 0x2, 0x24,0x71,0x0, 0x3, 0x5, 0xe6,0x0, 0x2, 0x61,0x3c, +0x0, 0x0, 0x62,0xde,0x0, 0x2, 0x24,0xb6,0x0, 0x2, 0x5f,0xe3,0x0, 0x2, 0x5f,0xe2, +0x0, 0x2, 0x5f,0xe0,0x0, 0x3, 0x6, 0x64,0x0, 0x2, 0x24,0xc6,0x0, 0x1, 0x42,0xb4, +0x0, 0x3, 0xa, 0xf4,0x0, 0x3, 0xa, 0xdc,0x0, 0x2, 0x74,0x50,0x0, 0x2, 0xe, 0x9b, +0x0, 0x2, 0xe, 0xa0,0x0, 0x0, 0x65,0x60,0x0, 0x2, 0x75,0x40,0x0, 0x2, 0x74,0xec, +0x0, 0x2, 0x2e,0x68,0x0, 0x2, 0x2e,0x70,0x0, 0x2, 0x74,0x8a,0x0, 0x2, 0x74,0x8c, +0x0, 0x3, 0xa, 0xe8,0x0, 0x2, 0xe, 0x5e,0x0, 0x2, 0x1b,0x82,0x0, 0x2, 0x24,0x89, +0x0, 0x2, 0x2e,0x6a,0x0, 0x2, 0x24,0x54,0x0, 0x0, 0xf6,0x60,0x0, 0x2, 0xf6,0x60, +0x0, 0x2, 0x24,0x7a,0x0, 0x2, 0x5f,0xc6,0x0, 0x3, 0x6, 0x65,0x0, 0x2, 0x24,0xad, +0x0, 0x2, 0x24,0x70,0x0, 0x2, 0x2d,0x4a,0x0, 0x3, 0x5, 0xf2,0x0, 0x3, 0x5, 0xec, +0x0, 0x2, 0x25,0x1c,0x0, 0x2, 0x24,0x80,0x0, 0x3, 0x6, 0x68,0x0, 0x2, 0xe, 0x64, +0x0, 0x3, 0xa, 0xf8,0x0, 0x3, 0xa, 0xf6,0x0, 0x2, 0x24,0x64,0x0, 0x2, 0xe, 0x62, +0x0, 0x2, 0x2c,0xc5,0x0, 0x2, 0x67,0x82,0x0, 0x2, 0x67,0x24,0x0, 0x2, 0x67,0x91, +0x0, 0x2, 0x67,0x8d,0x0, 0x2, 0x67,0x8e,0x0, 0x2, 0x67,0x87,0x0, 0x2, 0x67,0x8a, +0x0, 0x2, 0x67,0x8c,0x0, 0x2, 0x67,0x8b,0x0, 0x2, 0x67,0x88,0x0, 0x2, 0x67,0x85, +0x0, 0x2, 0x67,0x89,0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x67,0x1c,0x0, 0x2, 0x66,0x54, +0x0, 0x2, 0x66,0xb8,0x0, 0x2, 0x67,0x8f,0x0, 0x2, 0x67,0x84,0x0, 0x2, 0x67,0x86, +0x0, 0x2, 0x67,0x81,0x0, 0x2, 0x65,0xf0,0x0, 0x2, 0x67,0x80,0x0, 0x2, 0x24,0xd2, +0x0, 0x0, 0x63,0x6a,0x0, 0x3, 0x6, 0xd6,0x0, 0x2, 0x4b,0xa8,0x0, 0x1, 0x42,0xc4, +0x0, 0x0, 0x62,0xa0,0x0, 0x2, 0x1b,0x83,0x0, 0x2, 0x24,0xc8,0x0, 0x3, 0x11,0x60, +0x0, 0x2, 0x24,0x72,0x0, 0x2, 0x24,0xb7,0x0, 0x2, 0x24,0x66,0x0, 0x2, 0x5f,0xc8, +0x0, 0x3, 0x6, 0xd8,0x0, 0x0, 0x63,0xe0,0x0, 0x3, 0xa, 0xec,0x0, 0x1, 0x42,0xa8, +0x0, 0x2, 0x5f,0x5c,0x0, 0x2, 0x4b,0xac,0x0, 0x2, 0x74,0x36,0x0, 0x2, 0x74,0x3c, +0x0, 0x2, 0x74,0x3a,0x0, 0x2, 0x74,0x38,0x0, 0x2, 0x74,0x32,0x0, 0x2, 0x6d,0xf0, +0x0, 0x2, 0x67,0xb0,0x0, 0x2, 0x74,0x30,0x0, 0x2, 0x74,0x31,0x0, 0x2, 0x74,0x34, +0x0, 0x2, 0x67,0x94,0x0, 0x2, 0x24,0x88,0x0, 0x3, 0x6, 0x5f,0x0, 0x3, 0x5, 0xe8, +0x0, 0x1, 0x42,0xb8,0x0, 0x2, 0x5f,0x9c,0x0, 0x1, 0x42,0xe4,0x0, 0x2, 0x74,0x40, +0x0, 0x3, 0x6, 0xa8,0x0, 0x2, 0x25,0x14,0x0, 0x2, 0x32,0x48,0x0, 0x2, 0x32,0x30, +0x0, 0x2, 0x4b,0xae,0x0, 0x1, 0x42,0xd8,0x0, 0x2, 0x1b,0x84,0x0, 0x2, 0x24,0xae, +0x0, 0x2, 0x24,0x5c,0x0, 0x2, 0xe, 0x70,0x0, 0x2, 0x24,0x84,0x0, 0x2, 0x4b,0xc0, +0x0, 0x0, 0x62,0xb8,0x0, 0x2, 0xe, 0x5d,0x0, 0x2, 0x4b,0xb0,0x0, 0x0, 0x63,0xc8, +0x0, 0x2, 0x4b,0xb4,0x0, 0x2, 0x24,0x82,0x0, 0x2, 0x2c,0xf0,0x0, 0x2, 0x24,0x74, +0x0, 0x2, 0x24,0xac,0x0, 0x2, 0xe, 0x5c,0x0, 0x2, 0x4b,0xb8,0x0, 0x3, 0x6, 0x61, +0x0, 0x2, 0x5f,0xcc,0x0, 0x2, 0x24,0x7c,0x0, 0x2, 0x5f,0x7, 0x0, 0x2, 0x5f,0x6, +0x0, 0x2, 0x5f,0x5, 0x0, 0x2, 0x5f,0x4, 0x0, 0x2, 0x5f,0x3, 0x0, 0x2, 0x5f,0x2, +0x0, 0x2, 0x5f,0x1, 0x0, 0x2, 0x5f,0x0, 0x0, 0x2, 0x5e,0xff,0x0, 0x2, 0x5e,0xfe, +0x0, 0x2, 0x5e,0xfd,0x0, 0x2, 0x5e,0xfc,0x0, 0x2, 0x5e,0xfa,0x0, 0x2, 0x5e,0xec, +0x0, 0x2, 0x24,0x78,0x0, 0x2, 0x74,0xc8,0x0, 0x2, 0x5f,0xdf,0x0, 0x2, 0x5f,0xd0, +0x0, 0x1, 0x42,0xe8,0x0, 0x2, 0x5b,0x8e,0x0, 0x2, 0x58,0x68,0x0, 0x0, 0x1, 0x0, +0x0, 0x2, 0x25,0x16,0x0, 0x2, 0x24,0x87,0x0, 0x2, 0x24,0xca,0x0, 0x1, 0x42,0xe0, +0x0, 0x2, 0x0, 0x4, 0x0, 0x3, 0x6, 0xf6,0x0, 0x3, 0x6, 0xf5,0x0, 0x3, 0x6, 0xe6, +0x0, 0x3, 0x6, 0xe4,0x0, 0x2, 0x52,0x14,0x0, 0x1, 0x42,0xd0,0x0, 0x2, 0x24,0x1, +0x0, 0x2, 0x24,0x60,0x0, 0x0, 0x63,0x86,0x0, 0x2, 0x5f,0xce,0x0, 0x2, 0x75,0x48, +0x0, 0x2, 0xe, 0x8e,0x0, 0x2, 0x24,0x68,0x0, 0x3, 0x9, 0x5d,0xf, 0xff,0xff,0xff, +0xf0,0xff,0xff,0xff,0xff,0xc0,0xff,0xff,0x55,0x50,0x47,0x52,0x41,0x44,0x45,0x20, +0x66,0xcc,0x99,0x33,0x46,0x4c,0x41,0x47,0xa0,0x0, 0x3, 0xff,0x8, 0x0, 0x0, 0x8, +0x0, 0x82,0x52,0x1, 0x6, 0xc3,0x14,0x5, 0x8, 0x5, 0x8, 0x5, 0x6, 0xc3,0x18,0x6, +0x8, 0x6, 0x8, 0x6, 0x3, 0x28,0x0, 0xfa,0x3, 0x28,0x1, 0x2c,0xfc,0x0, 0xff,0xff, +0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0xf8,0x0, 0xff,0xff,0x9f,0xff,0xff,0xff, +0xe7,0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0xfe,0x7f,0xff,0xff,0xff,0x9f,0xff,0xff, +0xff,0xe7,0xff,0xff,0x80,0x1, 0x10,0x20,0xef,0xff,0xff,0xff,0xf3,0xff,0xff,0xff, +0x0, 0x19,0x66,0xd, 0x3c,0x6e,0xf3,0x5f,0x7f,0xff,0xff,0xff, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT8006m/include/pramboot/FT8716_Pramboot_V0.5_20160723.i b/drivers/input/touchscreen/FT8006m/include/pramboot/FT8716_Pramboot_V0.5_20160723.i new file mode 100755 index 0000000000000..8c27370a9170b --- /dev/null +++ b/drivers/input/touchscreen/FT8006m/include/pramboot/FT8716_Pramboot_V0.5_20160723.i @@ -0,0 +1,246 @@ +0x2, 0x3, 0x83,0xca,0x39,0x12,0xf, 0x3c,0xda,0x39,0x32,0x2, 0x0, 0x3, 0x6d,0x22, +0x80,0x13,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, +0xb0,0xb, 0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0xff,0x2, 0xd, 0xf, 0xe5,0x33, +0xb4,0xc, 0xf, 0xc2,0x86,0xc2,0x87,0x7e,0x34,0x0, 0x64,0x12,0xe, 0x86,0xd2,0x86, +0xd2,0x87,0x22,0x2, 0x0, 0xf9,0xca,0x3b,0x7a,0xd, 0x10,0x7f,0x31,0xe5,0x24,0xb4, +0x80,0x2, 0x80,0x3, 0x2, 0x0, 0xdc,0x7f,0x13,0x5e,0x34,0x0, 0x7f,0x7d,0x23,0x7e, +0x34,0x0, 0x80,0x9d,0x32,0x7a,0x35,0x16,0x7e,0x35,0x14,0xbe,0x35,0x16,0x38,0x2, +0x80,0x5d,0x7e,0x35,0x16,0x7a,0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6, +0x7e,0x35,0x14,0x9e,0x35,0x16,0x7a,0x35,0x14,0x7e,0x35,0x16,0x6d,0x22,0x2f,0x31, +0x7e,0x1d,0x10,0x2e,0x35,0x16,0x7a,0x1d,0x10,0x80,0x27,0x7e,0x34,0x0, 0x80,0x7a, +0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6,0x7e,0x35,0x14,0x9e,0x34,0x0, +0x80,0x7a,0x35,0x14,0x7e,0x1d,0x10,0x2e,0x34,0x0, 0x80,0x7a,0x1d,0x10,0x2e,0x38, +0x0, 0x80,0x7e,0x35,0x14,0xbe,0x34,0x0, 0x80,0x50,0xd0,0x4d,0x33,0x68,0x26,0x7a, +0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6,0x80,0x19,0x74,0x2, 0x12,0xa, +0x89,0x5e,0x70,0xf4,0x12,0xc, 0x86,0x7e,0x35,0x14,0x7a,0x35,0x18,0x7f,0x13,0x7e, +0xd, 0x10,0x12,0x8, 0xe, 0xd3,0xda,0x3b,0x22,0xa9,0xc0,0x93,0x75,0x39,0x0, 0x32, +0xf, 0x60,0xf0,0x9f,0x4c,0xf1,0xb3,0xe, 0xce,0xb9,0x31,0x46,0xff,0x0, 0xff,0x0, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x7c,0x6b,0xc2,0x2, 0xe5,0x22,0x14,0x78,0x3, 0x2, 0x2, 0xda,0x1b,0xb1,0x78,0x3, +0x2, 0x2, 0x3d,0x1b,0xb1,0x78,0x3, 0x2, 0x2, 0x89,0x1b,0xb1,0x78,0x3, 0x2, 0x2, +0x9a,0x1b,0xb1,0x78,0x3, 0x2, 0x2, 0xc1,0x24,0xf9,0x78,0x3, 0x2, 0x2, 0xd6,0x24, +0xaf,0x78,0x3, 0x2, 0x3, 0x3b,0x24,0xfd,0x68,0x3a,0x14,0x78,0x3, 0x2, 0x2, 0xdd, +0x14,0x78,0x3, 0x2, 0x2, 0xda,0x1b,0xb2,0x78,0x3, 0x2, 0x2, 0xda,0x24,0xda,0x68, +0x26,0x24,0xe6,0x68,0x1f,0x24,0xeb,0x68,0x3b,0x24,0xf3,0x78,0x3, 0x2, 0x2, 0xda, +0x24,0xe4,0x78,0x3, 0x2, 0x3, 0x46,0x14,0x78,0x3, 0x2, 0x2, 0xda,0x24,0x94,0x68, +0x3, 0x2, 0x3, 0x82,0x2, 0x3, 0x42,0xbe,0x60,0x4, 0x50,0xc, 0x75,0x3f,0x0, 0x7c, +0x16,0x2e,0x10,0x25,0x7c,0xb7,0xa5,0xf7,0xa5,0xbe,0x0, 0x2, 0x80,0x3, 0x2, 0x3, +0x82,0xd2,0x2, 0x22,0x7c,0xb6,0x24,0x0, 0x78,0x3, 0x2, 0x3, 0x82,0x1b,0xb1,0x68, +0x1e,0x14,0x68,0x1e,0x14,0x68,0x1e,0x14,0x68,0x1e,0xb, 0xb2,0x78,0x33,0x30,0x1, +0x7, 0x7e,0x8, 0x0, 0x44,0x2, 0x2, 0x5a,0x7e,0x8, 0x1, 0x50,0x2, 0x2, 0x5a,0x2, +0x2, 0xfb,0x2, 0x3, 0x2, 0x2, 0x3, 0x1a,0xa, 0x27,0x7e,0xd, 0x3a,0xb, 0x16,0xb, +0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x6d,0x33,0x7e,0xd, 0x3a,0x79,0x30,0x0, 0x6, +0x22,0x7c,0xb7,0x62,0x3f,0x7e,0x2d,0x3a,0x2e,0x54,0x0, 0x6, 0xb, 0x2a,0x20,0x7d, +0x12,0xb, 0x14,0x1b,0x2a,0x10,0x7e,0xd, 0x3a,0x2d,0x12,0x39,0x70,0x0, 0x8, 0x7e, +0xd, 0x3a,0x69,0x50,0x0, 0x4, 0x69,0x20,0x0, 0x6, 0xbd,0x25,0x50,0x3, 0x2, 0x3, +0x82,0xb2,0x1, 0x7a,0xd, 0x34,0x7e,0x34,0x0, 0x2, 0x2, 0x3, 0x7f,0x7c,0xb6,0x1b, +0xb1,0x68,0x1d,0x14,0x68,0x1d,0xb, 0xb1,0x68,0x3, 0x2, 0x3, 0x82,0x30,0x1, 0x6, +0x7e,0x8, 0x0, 0x44,0x80,0x4, 0x7e,0x8, 0x1, 0x50,0x7a,0xd, 0x3a,0x2, 0x2, 0xf3, +0x2, 0x2, 0xfb,0xa, 0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, +0x20,0x2f,0x12,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x1d,0x3a,0x7a,0x1d,0x34, +0xd2,0x2, 0x7e,0x34,0x0, 0x1, 0x2, 0x3, 0x7f,0xbe,0x60,0x1, 0x68,0x9, 0xa5,0xbe, +0x2, 0x5, 0x7a,0x71,0x3e,0xd2,0x3, 0xd2,0x2, 0x22,0x75,0xe6,0x0, 0xe4,0x7e,0x34, +0x1, 0x4, 0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x5, 0x7a,0x1b,0xb0, +0x7e,0x34,0x1, 0x8, 0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x9, 0x7a,0x1b,0xb0,0xd2,0x4, +0x22,0xa5,0xbe,0x1, 0x4, 0x7a,0x71,0x38,0x22,0xa5,0xbe,0x2, 0x2, 0x80,0x3, 0x2, +0x3, 0x82,0x7a,0x71,0x23,0x22,0x7a,0x71,0x33,0x22,0xd2,0x2, 0x22,0x7c,0xb6,0x1b, +0xb1,0x68,0x18,0x14,0x68,0x1c,0x14,0x68,0x31,0x14,0x68,0x3a,0xb, 0xb2,0x68,0x3, +0x2, 0x3, 0x82,0xa, 0x37,0x7d,0x3, 0x6d,0x11,0x80,0x59,0xa, 0x57,0x7c,0xab,0xe4, +0x80,0x2, 0xa, 0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x2f,0x12,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x22,0x7c,0x67,0x6c,0x77,0x7e,0xd, +0x3a,0x79,0x30,0x0, 0x4, 0x22,0xa, 0x27,0x7e,0xd, 0x3a,0xb, 0x16,0xb, 0xa, 0x30, +0x2d,0x32,0x1b,0xa, 0x30,0x7e,0x34,0x0, 0x3, 0x80,0x44,0x7e,0x34,0x0, 0x4, 0x7a, +0x35,0x2f,0x75,0x3f,0x0, 0x22,0x1b,0x61,0x68,0x15,0xb, 0x60,0x78,0x34,0x7c,0x27, +0x6c,0x33,0x6d,0x0, 0x7e,0x1d,0x3a,0x79,0x11,0x0, 0x2, 0x1b,0x1a,0x0, 0x22,0xa, +0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x2f,0x12,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0xe4,0x7a,0xb3,0x2, 0xe4,0x7e,0x34,0x0, 0x5, 0x7a, +0x35,0x2f,0x22,0x75,0x84,0x1, 0x7e,0x44,0x1f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44, +0x78,0xf9,0x7e,0xf8,0x2, 0xe8,0xd2,0x7, 0xc2,0x8, 0x75,0x3f,0x0, 0x75,0x40,0x87, +0x75,0x41,0xa6,0x75,0x42,0x0, 0x75,0x43,0x0, 0xd2,0x0, 0xc2,0x2, 0xc2,0x3, 0xc2, +0x4, 0x75,0x22,0x0, 0x75,0x23,0x0, 0x75,0x24,0x80,0x75,0x2f,0x0, 0x75,0x30,0x0, +0x75,0x31,0x0, 0x75,0x32,0x0, 0x75,0x33,0x0, 0x75,0x38,0xb, 0x75,0x39,0x0, 0x75, +0x3e,0x1, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0xf, 0x50,0xb, 0xa, 0x40,0x5d,0x44,0x68, +0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29, +0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x4, 0x20,0xff,0xff, +0x56,0x30,0x2e,0x35,0x4a,0x75,0x6c,0x20,0x32,0x33,0x20,0x32,0x30,0x31,0x36,0x0, +0x46,0x54,0x53,0x38,0x37,0x31,0x36,0x5f,0x70,0x72,0x61,0x6d,0x62,0x6f,0x6f,0x74, +0x12,0xe, 0x63,0x2, 0x5, 0xbc,0x7e,0x35,0x2f,0x1b,0x34,0x68,0x60,0x1b,0x35,0x78, +0x3, 0x2, 0x4, 0xbc,0x1b,0x34,0x78,0x3, 0x2, 0x4, 0xe6,0x1b,0x34,0x78,0x3, 0x2, +0x5, 0x96,0x2e,0x34,0x0, 0x3, 0x68,0x3, 0x2, 0x5, 0xa8,0x6d,0x33,0x7a,0x35,0x2f, +0x7a,0x35,0x31,0x30,0x7, 0x5, 0x12,0x0, 0x2e,0xc2,0x7, 0x7e,0xd, 0x34,0x69,0x30, +0x0, 0x4, 0x7a,0x35,0x14,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x2e,0x14,0x0, 0x8, +0x12,0x0, 0x46,0xd2,0x7, 0x7e,0x2d,0x34,0x69,0x12,0x0, 0x4, 0x69,0x32,0x0, 0x2, +0xb, 0x2a,0x20,0x12,0xb, 0xe2,0x2e,0x34,0x10,0x0, 0x2, 0x5, 0x91,0x6d,0x33,0x7a, +0x35,0x2f,0x7e,0x34,0x1, 0x0, 0x7a,0x35,0x15,0x7e,0xd, 0x34,0x69,0x30,0x0, 0x2, +0xb, 0xa, 0x20,0x2e,0x14,0x0, 0x8, 0x12,0xe, 0xf2,0x20,0x0, 0x3, 0x2, 0x5, 0xa8, +0x7e,0x1d,0x34,0x29,0xb1,0x0, 0x8, 0xf5,0x91,0x2, 0x5, 0xa8,0x6d,0x33,0x7a,0x35, +0x2f,0x7a,0x35,0x31,0x7e,0x18,0x0, 0x3f,0x7a,0x1d,0xe, 0x7e,0xd, 0x34,0x69,0x30, +0x0, 0x2, 0xb, 0xa, 0x20,0x69,0x10,0x0, 0x4, 0x12,0x7, 0x62,0x12,0x0, 0x2e,0x7e, +0x34,0xf0,0x55,0x2, 0x5, 0x91,0x7e,0x18,0x10,0x0, 0x7a,0x1d,0x8, 0xd2,0x5, 0x6d, +0x33,0x7a,0x35,0x2f,0x7a,0x35,0x31,0xe5,0x38,0xb4,0xa, 0x17,0xe5,0x24,0xb4,0x80, +0xc, 0xe4,0x12,0xc, 0xd1,0x74,0x1, 0x12,0xc, 0xd1,0x2, 0x5, 0x7f,0x12,0x8, 0xa4, +0x2, 0x5, 0x7f,0xe5,0x38,0xb4,0xb, 0x27,0xe5,0x24,0xb4,0x80,0x11,0x7e,0xf0,0x1, +0x7c,0xbf,0x12,0x5, 0xc3,0xb, 0xf0,0xbe,0xf0,0x11,0x78,0xf4,0x80,0x51,0x7e,0xf0, +0x4, 0x7c,0xbf,0x12,0x5, 0xc3,0xb, 0xf0,0xbe,0xf0,0x40,0x78,0xf4,0x80,0x40,0xe5, +0x38,0xa, 0x3b,0x9e,0x34,0x0, 0x80,0x7c,0xe7,0xe5,0x24,0xb4,0x80,0x10,0xa, 0x3e, +0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x8, 0x80,0xe, 0xa, 0x3e, +0x6d,0x22,0x74,0xa, 0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x8, 0x6c,0xdd,0x80,0x9, +0x7c,0xbe,0x12,0x5, 0xc3,0xb, 0xe0,0xb, 0xd0,0xe5,0x23,0xbc,0xbd,0x38,0xf1,0x7e, +0x1d,0x8, 0x12,0xe, 0xd, 0x92,0x5, 0x12,0x0, 0x2e,0x30,0x5, 0x1b,0x7e,0x34,0xf0, +0xaa,0x7a,0x35,0x31,0x80,0x12,0x6d,0x33,0x7a,0x35,0x2f,0x7a,0x35,0x31,0x7e,0xd, +0x34,0x69,0x30,0x0, 0x2, 0x12,0x6, 0x98,0x30,0x4, 0x11,0x7e,0x34,0x13,0x88,0x12, +0xe, 0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0x75,0xe9,0xff,0x30,0x8, 0x3, 0x2, +0x4, 0x26,0x22,0xca,0xf8,0x7c,0xfb,0xe5,0x24,0xb4,0x80,0x4a,0xd2,0x6, 0x12,0xe, +0xdf,0x74,0x20,0xca,0xb8,0xa, 0x3f,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb, +0xda,0xb8,0x12,0xd, 0xb3,0xa9,0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, +0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4, +0x38,0x6, 0x12,0xf, 0x4d,0x2, 0x6, 0x95,0xc2,0x86,0x7e,0x34,0x13,0x88,0x12,0xe, +0x86,0xd2,0x86,0x2, 0x6, 0x95,0x74,0x1, 0x12,0xa, 0x21,0x74,0x1, 0x6d,0x33,0x12, +0xc, 0x86,0xe4,0x12,0xa, 0x89,0x5e,0x34,0x80,0x0, 0x7c,0x4f,0x6c,0x55,0x3e,0x24, +0x4d,0x32,0x12,0xc, 0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, 0x86,0x7e,0x34,0x0, 0x50, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x51, +0x12,0xc, 0x86,0x7e,0x34,0xa2,0x1c,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x11, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x10, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, +0x86,0x7e,0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, 0x21,0x74,0x4, 0x7e,0x34, +0xff,0xf7,0x12,0xc, 0x86,0xda,0xf8,0x22,0xca,0xf8,0xe4,0x7a,0xb3,0x2, 0xe4,0xe5, +0x24,0xbe,0xb0,0x80,0x68,0x9, 0x74,0x1, 0x7a,0xb3,0x2, 0xe4,0x2, 0x7, 0x5f,0xbe, +0x34,0xff,0xff,0x68,0x6, 0xbe,0x34,0x0, 0x12,0x50,0x4, 0x7e,0x34,0x0, 0x12,0x7d, +0x13,0x6d,0x0, 0x74,0xc, 0x2f,0x0, 0x14,0x78,0xfb,0x7a,0xd, 0xc, 0x7c,0xb7,0x12, +0x5, 0xc3,0x7e,0x1d,0xc, 0x12,0xe, 0xd, 0xe4,0x33,0x7c,0xfb,0xbe,0xf0,0x1, 0x78, +0xa, 0x7e,0xb3,0x2, 0xe4,0x44,0x2, 0x7a,0xb3,0x2, 0xe4,0x6c,0xaa,0xa, 0x3a,0x19, +0xa3,0x2, 0xdc,0xb, 0xa0,0xbe,0xa0,0x8, 0x78,0xf3,0x7e,0x34,0x0, 0x8, 0x7a,0x35, +0x14,0x7e,0x1d,0xc, 0x7e,0x8, 0x2, 0xdc,0x12,0x0, 0x46,0x6c,0xaa,0xe4,0xa, 0x4a, +0x19,0xb4,0x2, 0xdc,0xb, 0xa0,0xbe,0xa0,0x8, 0x78,0xf3,0x7e,0x34,0x0, 0x8, 0x7a, +0x35,0x15,0x7e,0x1d,0xc, 0x7e,0x8, 0x2, 0xdc,0x12,0xe, 0xf2,0x7e,0xf0,0x1, 0x6c, +0xaa,0xa, 0x3a,0x9, 0xb3,0x2, 0xdc,0xbc,0xba,0x68,0x4, 0x6c,0xff,0x80,0x7, 0xb, +0xa0,0xbe,0xa0,0x8, 0x40,0xeb,0xbe,0xf0,0x1, 0x78,0xa, 0x7e,0xb3,0x2, 0xe4,0x44, +0x4, 0x7a,0xb3,0x2, 0xe4,0x7e,0xb3,0x2, 0xe4,0x44,0x1, 0x7a,0xb3,0x2, 0xe4,0xda, +0xf8,0x22,0xca,0x3b,0x7a,0x15,0xc, 0x7f,0x31,0x75,0x12,0x0, 0x7e,0x35,0xc, 0xbe, +0x34,0x0, 0x0, 0x38,0x4f,0x7e,0x34,0xff,0xff,0x7a,0x35,0xc, 0x75,0x12,0x1, 0x80, +0x43,0x7e,0x34,0x0, 0x80,0x7a,0x35,0x15,0x7f,0x13,0x7e,0x8, 0x2, 0x5c,0x12,0xe, +0xf2,0x7e,0x35,0xc, 0x9e,0x34,0x0, 0x80,0x7a,0x35,0xc, 0x2e,0x38,0x0, 0x80,0x6d, +0x33,0x7a,0x35,0x13,0x7e,0x35,0x13,0x9, 0x63,0x2, 0x5c,0x7e,0xd, 0xe, 0x7e,0xb, +0x70,0x6c,0x76,0x7a,0xb, 0x70,0x7e,0x35,0x13,0xb, 0x34,0x7a,0x35,0x13,0xbe,0x34, +0x0, 0x80,0x78,0xe0,0x7e,0x35,0xc, 0xbe,0x34,0x0, 0x80,0x38,0xb4,0xe5,0x12,0x60, +0x5, 0xb, 0x34,0x7a,0x35,0xc, 0x7e,0x35,0xc, 0x7a,0x35,0x15,0x7f,0x13,0x7e,0x8, +0x2, 0x5c,0x12,0xe, 0xf2,0x6d,0x33,0x80,0x17,0x7e,0x35,0x13,0x9, 0x63,0x2, 0x5c, +0x7e,0xd, 0xe, 0x7e,0xb, 0x70,0x6c,0x76,0x7a,0xb, 0x70,0x7e,0x35,0x13,0xb, 0x34, +0x7a,0x35,0x13,0x7e,0x35,0xc, 0xbe,0x35,0x13,0x38,0xde,0xda,0x3b,0x22,0xca,0x3b, +0x7f,0x30,0x7c,0xb6,0xf5,0x1a,0x7c,0xb7,0xf5,0x1b,0x74,0x1, 0x7e,0x35,0x18,0x1e, +0x34,0x1b,0x34,0x4e,0x60,0x80,0x12,0xc, 0x86,0x12,0xa, 0x21,0xa9,0xc2,0xb4,0xa9, +0xc6,0xb3,0x75,0xb5,0x2, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x85,0x1a,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x85,0x1b,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x6d,0x33,0x80,0x2a,0x7f,0x13, +0x2e,0x35,0x1c,0x7e,0x1b,0xb0,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e, +0x35,0x1c,0x5e,0x34,0x0, 0x1, 0xbe,0x34,0x0, 0x1, 0x78,0x7, 0x7e,0x34,0x0, 0x78, +0x12,0xe, 0x86,0x7e,0x35,0x1c,0xb, 0x34,0x7a,0x35,0x1c,0x7e,0x35,0x18,0xbe,0x35, +0x1c,0x38,0xcb,0xa9,0xd2,0xb4,0x7e,0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, +0x21,0xda,0x3b,0x22,0xe5,0x24,0xb4,0x80,0x16,0xd2,0x6, 0x12,0xe, 0xdf,0xa9,0xc2, +0xb4,0x74,0x60,0x12,0xf, 0x27,0xa9,0xd2,0xb4,0x12,0xe, 0xca,0x40,0xfb,0x22,0x74, +0x1, 0x12,0xa, 0x21,0xe4,0x6d,0x33,0x12,0xc, 0x86,0x74,0x1, 0x6d,0x33,0x12,0xc, +0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, 0x86,0x7e,0x34,0x0, 0x54,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x55,0x12,0xc, 0x86,0x7e, +0x34,0xa2,0x1c,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x15,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0xa0,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x14,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x4, 0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, 0x21,0x74,0x4, 0x7e,0x34,0xff,0xf7, +0x2, 0xc, 0x86,0x7c,0x7b,0x7e,0xa0,0xef,0xe5,0x22,0x24,0xfd,0x68,0x3c,0x1b,0xb1, +0x68,0x26,0x24,0x9f,0x68,0x41,0x1b,0xb2,0x68,0x42,0x24,0x9e,0x68,0x39,0x24,0xe3, +0x68,0x52,0x24,0x59,0x78,0x52,0xa5,0xbf,0x0, 0x5, 0x7e,0xa1,0x40,0x80,0x49,0xa5, +0xbf,0x1, 0x45,0x7e,0xa1,0x41,0x80,0x40,0xa5,0xbf,0x0, 0x5, 0x7e,0xa1,0x24,0x80, +0x37,0xa5,0xbf,0x1, 0x33,0x7e,0xa1,0x3e,0x80,0x2e,0xa, 0x17,0x7e,0x1d,0x3a,0x2d, +0x31,0x29,0xa1,0x0, 0x8, 0x80,0x21,0x7e,0xa1,0x3f,0x80,0x1c,0xa5,0xbf,0x0, 0x9, +0x7e,0x35,0x31,0xa, 0x56,0x7c,0xab,0x80,0xf, 0xa5,0xbf,0x1, 0xb, 0x7e,0x55,0x31, +0x7c,0xab,0x80,0x4, 0x7e,0xa3,0x2, 0xe4,0x7c,0xba,0x22,0xca,0x79,0x6c,0xee,0x7e, +0xf0,0x70,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x30,0x8, 0x31,0x7e,0x34,0x0, 0x2, +0x7a,0x35,0x15,0x9f,0x11,0x7e,0x8, 0x0, 0xc, 0x12,0xe, 0xf2,0xe5,0xc, 0xbe,0xb0, +0xff,0x68,0x1a,0xe5,0xc, 0x60,0x16,0xe5,0xd, 0xa, 0x2b,0xe5,0xc, 0xa, 0x3b,0x2d, +0x32,0xbe,0x34,0x0, 0xff,0x78,0x6, 0x7e,0xf1,0xc, 0x7e,0xe0,0x1, 0x4c,0xee,0x78, +0x1c,0xa9,0xd1,0xcb,0xd2,0xcc,0x12,0xc, 0x35,0x7c,0xfb,0xc2,0xcc,0xa9,0xc1,0xcb, +0xbe,0xf0,0x2, 0x40,0x5, 0xbe,0xf0,0xfd,0x28,0x3, 0x7e,0xf0,0x70,0x7c,0xbf,0x54, +0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xd2,0xad,0xda,0x79, +0x22,0xca,0x79,0xbe,0xb0,0x0, 0x28,0x2e,0x74,0x6, 0x12,0xa, 0x89,0x7d,0x73,0x6c, +0xff,0x7e,0xf0,0xa5,0x7d,0x37,0x12,0xc, 0x86,0x6c,0xff,0x7e,0xf0,0xf, 0x7d,0x37, +0x12,0xc, 0x86,0x6c,0xff,0x7e,0xf0,0x6a,0x7d,0x37,0x12,0xc, 0x86,0x7e,0x34,0x0, +0x5, 0x12,0xe, 0x86,0x80,0x30,0x74,0x1, 0x7e,0x34,0xdf,0xff,0x12,0xc, 0x86,0x74, +0x6, 0x12,0xa, 0x89,0x7d,0x73,0x6c,0xff,0x7d,0x37,0x12,0xc, 0x86,0x7d,0x37,0x12, +0xc, 0x86,0x7d,0x37,0x12,0xc, 0x86,0x74,0x2, 0x12,0xa, 0x89,0x7d,0x73,0x4e,0xf0, +0x1, 0x7d,0x37,0x12,0xc, 0x86,0xda,0x79,0x22,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x75, +0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c, +0x55,0xa, 0x3a,0x4d,0x32,0x22,0x7f,0x70,0xd2,0x6, 0x12,0xe, 0xdf,0x74,0x2, 0x12, +0xd, 0xb3,0x6d,0x33,0x80,0x12,0x7f,0x7, 0x2d,0x13,0x7e,0xb, 0xb0,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xb, 0x34,0x7e,0x25,0x18,0xbd,0x23,0x38,0xe7,0xa9, +0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, 0x7e,0x35,0x42,0xbe,0x34,0x1, +0xf4,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4,0x38,0x3, 0x2, 0xf, 0x4d,0xc2, +0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0xd2,0x86,0x22,0xa9,0xd1,0xcb,0xd2,0xcc, +0x7e,0x34,0x0, 0x4, 0x7e,0x8, 0x2, 0x5c,0x74,0xc, 0x12,0xb, 0x8f,0xa9,0xd1,0xcb, +0xc2,0xcc,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0x8, 0x2, 0x5c,0x2d,0x13,0xb, +0xa, 0x30,0x7d,0x23,0x7c,0x45,0x6c,0x55,0xa, 0x36,0x4d,0x32,0x1b,0xa, 0x30,0xb, +0xa0,0xbe,0xa0,0xc, 0x78,0xde,0x7e,0x37,0x2, 0x6c,0x7d,0x23,0xa, 0x54,0x7c,0xa7, +0xb4,0xe7,0xb, 0xbe,0xa0,0x16,0x78,0x6, 0x75,0x40,0xe7,0x75,0x41,0xa6,0x22,0x7e, +0x24,0x0, 0x1, 0x7e,0x7f,0x2, 0xe5,0x79,0x27,0x0, 0x6, 0x7e,0x7f,0x2, 0xe5,0x69, +0x27,0x0, 0x6, 0x4d,0x22,0x78,0xf4,0x5e,0x60,0x7f,0x1b,0x7a,0x30,0x7e,0x1f,0x2, +0xe5,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6c,0xaa,0x80,0x20,0x6d,0x44,0x7e, +0x1f,0x2, 0xe5,0x1b,0x1a,0x40,0x7e,0x1f,0x2, 0xe5,0x69,0x41,0x0, 0x8, 0x4d,0x44, +0x68,0xf4,0x69,0x41,0x0, 0x2, 0x1b,0xa, 0x40,0xb, 0x15,0xb, 0xa0,0xbc,0xba,0x38, +0xdc,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31, +0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50, +0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, +0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40, +0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31, +0x7d,0x10,0x6d,0x0, 0x22,0x7e,0x34,0x0, 0x2, 0x7e,0xf, 0x2, 0xe5,0x79,0x30,0x0, +0x4, 0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x2, 0xe5,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x2, +0xe5,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7e,0x34,0x0, 0x4, 0x1b,0xa, 0x30, +0x7e,0xf, 0x2, 0xe5,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, +0x30,0x7e,0x1f,0x2, 0xe5,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x51,0x0, +0x2, 0x5e,0x54,0x0, 0xfe,0x22,0x7d,0x23,0xa, 0x36,0x7c,0xa5,0xa9,0xc2,0xb4,0xa9, +0xc6,0xb3,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4, +0x22,0x7c,0xab,0xd2,0x6, 0x12,0xe, 0xdf,0x74,0xd8,0xa, 0x3a,0x7d,0x23,0x6d,0x33, +0x12,0xd, 0xb3,0xa9,0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, 0x7e,0x35, +0x42,0xbe,0x34,0x5, 0xdc,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x5, 0xdc,0x38,0x3, +0x2, 0xf, 0x4d,0xc2,0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0xd2,0x86,0x22,0xca, +0x2b,0xca,0x1b,0xca,0xb, 0xd2,0x0, 0x30,0x90,0x1c,0xc2,0x90,0x7e,0x71,0x91,0xe5, +0x39,0x70,0x3, 0x7a,0x71,0x22,0xe5,0x39,0x12,0x1, 0x20,0x5, 0x39,0x30,0x2, 0x6, +0xe4,0x12,0x9, 0x33,0xf5,0x91,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x39,0xe5,0x39,0x12, +0x9, 0x33,0xf5,0x91,0xda,0xb, 0xda,0x1b,0xda,0x2b,0x32,0xd2,0x6, 0x12,0xe, 0xdf, +0xa9,0xc2,0xb4,0x74,0x9f,0x12,0xf, 0x27,0x12,0xf, 0xe, 0xa9,0xd2,0xb4,0x60,0x3, +0xb4,0xff,0x1a,0x75,0x24,0x81,0xa9,0xd5,0xca,0xa9,0xd0,0xca,0x75,0xed,0x9f,0x75, +0xad,0x20,0xa9,0xd1,0xea,0xa9,0xc1,0xea,0x74,0x1, 0x2, 0xd, 0xe0,0x2, 0xd, 0x80, +0xd2,0x6, 0x12,0xe, 0xdf,0xa9,0xc2,0xb4,0x74,0x5, 0x12,0xf, 0x27,0x12,0xf, 0xe, +0x7c,0xab,0xa9,0xd2,0xb4,0xd2,0x6, 0x12,0xe, 0xdf,0x5e,0xa0,0xe3,0xa9,0xc2,0xb4, +0x74,0x1, 0x12,0xf, 0x27,0x7c,0xba,0x12,0xf, 0x27,0xa9,0xd2,0xb4,0x12,0xe, 0xca, +0x40,0xfb,0x22,0x7c,0xab,0x7d,0x12,0x7c,0xb3,0xf5,0x1c,0x7c,0x36,0x7c,0x25,0xa, +0x4, 0x7c,0xb3,0xf5,0x1b,0x7c,0xb7,0xf5,0x1a,0xa9,0xc2,0xb4,0x7c,0xba,0x12,0xf, +0x27,0xe5,0x1c,0x12,0xf, 0x27,0xe5,0x1b,0x12,0xf, 0x27,0xe5,0x1a,0x2, 0xf, 0x27, +0xca,0xf8,0x7c,0xfb,0xe5,0x24,0xb4,0x81,0x21,0x74,0x2, 0x12,0xa, 0x89,0x4c,0xff, +0x78,0x8, 0xa9,0xc0,0xca,0x5e,0x70,0xdf,0x80,0x6, 0xa9,0xd0,0xca,0x4e,0x70,0x20, +0x74,0x2, 0x12,0xc, 0x86,0x74,0x2, 0x12,0xa, 0x89,0xda,0xf8,0x22,0xd2,0x6, 0x7e, +0x14,0x0, 0x8, 0x7a,0x15,0x15,0x7e,0x8, 0x2, 0xdc,0x12,0xe, 0xf2,0x6c,0xaa,0xa, +0x3a,0x9, 0xb3,0x2, 0xdc,0xbe,0xb0,0xff,0x68,0x4, 0xc2,0x6, 0x80,0x7, 0xb, 0xa0, +0xbe,0xa0,0x8, 0x40,0xea,0xa2,0x6, 0x22,0x7d,0x52,0xf5,0x19,0x7c,0xb6,0x7c,0xa5, +0xa, 0x44,0xf5,0x18,0x7f,0x21,0xf5,0x17,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xf, 0x27, +0xe5,0x19,0x12,0xf, 0x27,0xe5,0x18,0x12,0xf, 0x27,0xe5,0x17,0x12,0xf, 0x27,0xe4, +0x2, 0xf, 0x27,0x12,0xe, 0xa9,0x12,0xb, 0x3b,0xa9,0xa6,0x94,0xb3,0x92,0x8, 0x30, +0x8, 0x6, 0x12,0xf, 0x1b,0x12,0xd, 0x4b,0x12,0x9, 0xab,0x12,0xf, 0x0, 0xd2,0xaf, +0x30,0x3, 0xfd,0x2, 0xf, 0x45,0x80,0x18,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe5,0x3e,0x70,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xe0,0x22,0xd2,0xcf,0x85,0x3e,0xcc,0x75,0xec, +0xff,0x75,0xee,0xff,0x75,0xeb,0x3, 0x75,0xac,0xc0,0xa9,0xc5,0xca,0x75,0xed,0xf, +0x75,0xad,0xb0,0xa9,0xd7,0x94,0xa9,0xd4,0x94,0x22,0xa9,0xc2,0xb4,0x74,0x5, 0x12, +0xf, 0x27,0x12,0xf, 0xe, 0xa9,0xd2,0xb4,0x30,0xe0,0x2, 0xd3,0x22,0xc3,0x22,0xa9, +0xc2,0xb4,0x30,0x6, 0x4, 0x74,0x6, 0x80,0x2, 0x74,0x4, 0x12,0xf, 0x27,0xa9,0xd2, +0xb4,0x22,0x12,0xe, 0x38,0x7e,0x35,0x15,0x12,0x0, 0xe, 0xa9,0xd2,0xb4,0xd3,0x22, +0xc2,0x8c,0x43,0x89,0x2, 0x75,0x8c,0x1, 0x75,0x8a,0x0, 0xd2,0xa9,0x22,0x75,0xb5, +0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x22,0xd2,0xc8,0x75,0xb3,0x13, +0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x22,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xd3,0x22,0xc2,0x8c,0x6d,0x33,0x7a,0x35,0x42,0xd2,0x8c,0x22,0x7e,0x35,0x42,0xb, +0x34,0x7a,0x35,0x42,0x22,0x85,0x3e,0xcc,0xe5,0x3e,0x2, 0xd, 0xe0,0x2, 0xf, 0x3c, +0x0, 0x1, 0x2, 0xe4,0x0, 0x0, 0x4, 0x2, 0xe5,0x0, 0x0, 0x9c,0x0, 0x0, 0x0, 0xff, diff --git a/drivers/input/touchscreen/FT8716/Kconfig b/drivers/input/touchscreen/FT8716/Kconfig new file mode 100755 index 0000000000000..15cf98981c357 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/Kconfig @@ -0,0 +1,16 @@ +# +# Focaltech Touchscreen driver configuration +# + +config TOUCHSCREEN_FTS + bool "Focaltech Touchscreen" + depends on I2C + default n + help + Say Y here if you have Focaltech touch panel. + If unsure, say N. + +config TOUCHSCREEN_FTS_DIRECTORY + string "Focaltech ts directory name" + default "focaltech_touch" + depends on TOUCHSCREEN_FTS diff --git a/drivers/input/touchscreen/FT8716/Makefile b/drivers/input/touchscreen/FT8716/Makefile new file mode 100755 index 0000000000000..eaab65495f13f --- /dev/null +++ b/drivers/input/touchscreen/FT8716/Makefile @@ -0,0 +1,18 @@ +# +# Makefile for the focaltech touchscreen drivers. +# + +# Each configuration option enables a list of files. + +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_core.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_ex_fun.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_ex_mode.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_flash.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_gesture.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_esdcheck.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_i2c.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_sensor.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_point_report_check.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_flash/ +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test/ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_common.h b/drivers/input/touchscreen/FT8716/focaltech_common.h new file mode 100755 index 0000000000000..3f9abc44ba1d3 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_common.h @@ -0,0 +1,221 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ +/***************************************************************************** +* +* File Name: focaltech_common.h +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-16 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +#ifndef __LINUX_FOCALTECH_COMMON_H__ +#define __LINUX_FOCALTECH_COMMON_H__ + +#include "focaltech_config.h" + +/***************************************************************************** +* Macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_VERSION "Focaltech V1.3 20170306" + +#define FLAGBIT(x) (0x00000001 << (x)) +#define FLAGBITS(x, y) ((0xFFFFFFFF >> (32 - (y) - 1)) << (x)) + +#define FLAG_ICSERIALS_LEN 5 +#define FLAG_IDC_BIT 11 + +#define IC_SERIALS (FTS_CHIP_TYPE & FLAGBITS(0, FLAG_ICSERIALS_LEN-1)) +#define FTS_CHIP_IDC ((FTS_CHIP_TYPE & FLAGBIT(FLAG_IDC_BIT)) == FLAGBIT(FLAG_IDC_BIT)) + +#define FTS_CHIP_TYPE_MAPPING {{0x05, 0x86, 0x13, 0x87, 0x16, 0x87, 0xA6, 0x00, 0x00} } + +#define I2C_BUFFER_LENGTH_MAXINUM 256 +#define FILE_NAME_LENGTH 128 +#define ENABLE 1 +#define DISABLE 0 +/*register address*/ +#define FTS_REG_INT_CNT 0x8F +#define FTS_REG_FLOW_WORK_CNT 0x91 +#define FTS_REG_WORKMODE 0x00 +#define FTS_REG_WORKMODE_FACTORY_VALUE 0x40 +#define FTS_REG_WORKMODE_WORK_VALUE 0x00 +#define FTS_REG_CHIP_ID 0xA3 +#define FTS_REG_CHIP_ID2 0x9F +#define FTS_REG_POWER_MODE 0xA5 +#define FTS_REG_POWER_MODE_SLEEP_VALUE 0x03 +#define FTS_REG_FW_VER 0xA6 +#define FTS_REG_VENDOR_ID 0xA8 +#define FTS_REG_LCD_BUSY_NUM 0xAB +#define FTS_REG_FACE_DEC_MODE_EN 0xB0 +#define FTS_REG_GLOVE_MODE_EN 0xC0 +#define FTS_REG_COVER_MODE_EN 0xC1 +#define FTS_REG_CHARGER_MODE_EN 0x8B +#define FTS_REG_GESTURE_EN 0xD0 +#define FTS_REG_GESTURE_OUTPUT_ADDRESS 0xD3 +#define FTS_REG_ESD_SATURATE 0xED + + + +/***************************************************************************** +* Alternative mode (When something goes wrong, the modules may be able to solve the problem.) +*****************************************************************************/ +/* + * point report check + * default: disable + */ +#define FTS_POINT_REPORT_CHECK_EN 0 + + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct ft_chip_t { + unsigned long type; + unsigned char chip_idh; + unsigned char chip_idl; + unsigned char rom_idh; + unsigned char rom_idl; + unsigned char pramboot_idh; + unsigned char pramboot_idl; + unsigned char bootloader_idh; + unsigned char bootloader_idl; +}; + +/* i2c communication*/ +int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue); +int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue); +int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen); +int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen); +int fts_i2c_init(void); +int fts_i2c_exit(void); + +/* Gesture functions */ +#if FTS_GESTURE_EN +int fts_gesture_init(struct input_dev *input_dev, struct i2c_client *client); +int fts_gesture_exit(struct i2c_client *client); +void fts_gesture_recovery(struct i2c_client *client); +int fts_gesture_readdata(struct i2c_client *client); +int fts_gesture_suspend(struct i2c_client *i2c_client); +int fts_gesture_resume(struct i2c_client *client); +#endif + +/* Apk and functions */ +#if FTS_APK_NODE_EN +int fts_create_apk_debug_channel(struct i2c_client *client); +void fts_release_apk_debug_channel(void); +#endif + +/* ADB functions */ +#if FTS_SYSFS_NODE_EN +int fts_create_sysfs(struct i2c_client *client); +int fts_remove_sysfs(struct i2c_client *client); +#endif + +/* ESD */ +#if FTS_ESDCHECK_EN +int fts_esdcheck_init(void); +int fts_esdcheck_exit(void); +int fts_esdcheck_switch(bool enable); +int fts_esdcheck_proc_busy(bool proc_debug); +int fts_esdcheck_set_intr(bool intr); +int fts_esdcheck_suspend(void); +int fts_esdcheck_resume(void); +int fts_esdcheck_get_status(void); +#endif + +/* Production test */ +#if FTS_TEST_EN +int fts_test_init(struct i2c_client *client); +int fts_test_exit(struct i2c_client *client); +#endif + +#if FTS_LOCK_DOWN_INFO +int fts_lockdown_init(struct i2c_client *client); +#endif + +#if FTS_CAT_RAWDATA +int fts_rawdata_init(struct i2c_client *client); +#endif +/* Point Report Check*/ +#if FTS_POINT_REPORT_CHECK_EN +int fts_point_report_check_init(void); +int fts_point_report_check_exit(void); +void fts_point_report_check_queue_work(void); +#endif + +/* Other */ +extern int g_show_log; +int fts_reset_proc(int hdelayms); +int fts_wait_tp_to_valid(struct i2c_client *client); +void fts_tp_state_recovery(struct i2c_client *client); +int fts_ex_mode_init(struct i2c_client *client); +int fts_ex_mode_exit(struct i2c_client *client); +int fts_ex_mode_recovery(struct i2c_client *client); + +void fts_irq_disable(void); +void fts_irq_enable(void); + +/***************************************************************************** +* DEBUG function define here +*****************************************************************************/ +#if FTS_DEBUG_EN +#define FTS_DEBUG_LEVEL 1 + +#if (FTS_DEBUG_LEVEL == 2) +#define FTS_DEBUG(fmt, args...) printk(KERN_ERR "[FTS][%s]"fmt"\n", __func__, ##args) +#define FTS_FUNC_ENTER() printk(KERN_ERR "[FTS]%s: Enter\n", __func__) +#define FTS_FUNC_EXIT() printk(KERN_ERR "[FTS]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_DEBUG(fmt, args...) printk(KERN_ERR "[FTS]"fmt"\n", ##args) +#define FTS_FUNC_ENTER() +#define FTS_FUNC_EXIT() +#endif + +#else +#define FTS_DEBUG(fmt, args...) +#define FTS_FUNC_ENTER() +#define FTS_FUNC_EXIT() +#endif + +#define FTS_INFO(fmt, args...) do { \ + if (g_show_log) {printk(KERN_ERR "[FTS][Info]"fmt"\n", ##args); } \ + } while (0) + +#define FTS_ERROR(fmt, args...) do { \ + if (g_show_log) {printk(KERN_ERR "[FTS][Error]"fmt"\n", ##args); } \ + } while (0) + + +#if FTS_GESTURE_EN +#define GESTURE_NODE "onoff" +#define GESTURE_DATA "data" +#define DOUBLE_CLICK 143 +struct gesture_struct { + int gesture_all_switch; + unsigned long gesture_mask; +}; +#endif + +#endif /* __LINUX_FOCALTECH_COMMON_H__ */ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_config.h b/drivers/input/touchscreen/FT8716/focaltech_config.h new file mode 100755 index 0000000000000..5892431914f81 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_config.h @@ -0,0 +1,261 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ +/************************************************************************ +* +* File Name: focaltech_config.h +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: global configurations +* +* Version: v1.0 +* +************************************************************************/ +#ifndef _LINUX_FOCLATECH_CONFIG_H_ +#define _LINUX_FOCLATECH_CONFIG_H_ + +/**************************************************/ +/****** G: A, I: B, S: C, U: D ******************/ +/****** chip type defines, do not modify *********/ +#define _FT8716 0x87160805 +#define _FT8736 0x87360806 +#define _FT8006 0x80060807 +#define _FT8606 0x86060808 +#define _FT8607 0x86070809 +#define _FTE716 0xE716080a + +#define _FT5416 0x54160002 +#define _FT5426 0x54260002 +#define _FT5435 0x54350002 +#define _FT5436 0x54360002 +#define _FT5526 0x55260002 +#define _FT5526I 0x5526B002 +#define _FT5446 0x54460002 +#define _FT5346 0x53460002 +#define _FT5446I 0x5446B002 +#define _FT5346I 0x5346B002 +#define _FT7661 0x76610002 +#define _FT7511 0x75110002 +#define _FT7421 0x74210002 +#define _FT7681 0x76810002 +#define _FT3C47U 0x3C47D002 +#define _FT3417 0x34170002 +#define _FT3517 0x35170002 +#define _FT3327 0x33270002 +#define _FT3427 0x34270002 + +#define _FT5626 0x56260001 +#define _FT5726 0x57260001 +#define _FT5826B 0x5826B001 +#define _FT5826S 0x5826C001 +#define _FT7811 0x78110001 +#define _FT3D47 0x3D470001 +#define _FT3617 0x36170001 +#define _FT3717 0x37170001 +#define _FT3817B 0x3817B001 + +#define _FT6236U 0x6236D003 +#define _FT6336G 0x6336A003 +#define _FT6336U 0x6336D003 +#define _FT6436U 0x6436D003 + +#define _FT3267 0x32670004 +#define _FT3367 0x33670004 + + + +/*************************************************/ + +/* + * choose your ic chip type of focaltech + */ +#define FTS_CHIP_TYPE _FT8716 + +/******************* Enables *********************/ +/*********** 1 to enable, 0 to disable ***********/ + +/* + * show debug log info + * enable it for debug, disable it for release + */ +#define FTS_DEBUG_EN 1 + +#define FTS_LOCK_DOWN_INFO 1 + +#define FTS_CAT_RAWDATA 1 + +/* + * Linux MultiTouch Protocol + * 1: Protocol B(default), 0: Protocol A + */ + +#define FTS_MT_PROTOCOL_B_EN 0 + + +/* + * Report Pressure in multitouch + * 1:enable(default),0:disable +*/ +#define FTS_REPORT_PRESSURE_EN 1 + +/* + * Force touch support + * different pressure for multitouch + * 1: true pressure for force touch + * 0: constant pressure(default) + */ +#define FTS_FORCE_TOUCH_EN 0 + +/* + * Gesture function enable + * default: disable + */ +#define FTS_GESTURE_EN 1 + +/* + * ESD check & protection + * default: disable + */ +#define FTS_ESDCHECK_EN 1 + +/* + * Production test enable + * 1: enable, 0:disable(default) + */ +#define FTS_TEST_EN 1 + +/* + * Glove mode enable + * 1: enable, 0:disable(default) + */ +#define FTS_GLOVE_EN 0 +/* + * cover enable + * 1: enable, 0:disable(default) + */ +#define FTS_COVER_EN 0 +/* + * Charger enable + * 1: enable, 0:disable(default) + */ +#define FTS_CHARGER_EN 0 + +/* + * Proximity sensor + * default: disable + */ +#define FTS_PSENSOR_EN 0 + +/* + * Nodes for tools, please keep enable + */ +#define FTS_SYSFS_NODE_EN 1 +#define FTS_APK_NODE_EN 1 + +/* + * Customer power enable + * enable it when customer need control TP power + * default: disable + */ +#define FTS_POWER_SOURCE_CUST_EN 1 + +/****************************************************/ + +/********************** Upgrade ****************************/ +/* + * auto upgrade, please keep enable + */ +#ifdef WT_COMPILE_FACTORY_VERSION + #define FTS_AUTO_UPGRADE_EN 0 +#else + #define FTS_AUTO_UPGRADE_EN 1 +#endif + +/* + * auto upgrade for lcd cfg + * default: 0 + */ +#define FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN 0 + +/* auto cb check + * default: disable + */ +#define FTS_AUTO_CLB_EN 0 + +/* + * Check vendor_id number + * 0:No check vendor_id (default) + * 1/2/3: Check vendor_id for vendor compatibility + */ +#define FTS_GET_VENDOR_ID_NUM 0 + +/* + * vendor_id(s) for vendor(s) to be compatible with. + * a confirmation of vendor_id(s) is recommended. + * FTS_GET_VENDOR_ID_NUM == 0, no check vendor id, you may ignore them + * FTS_GET_VENDOR_ID_NUM >= 1, compatible with FTS_VENDOR_1_ID + * FTS_GET_VENDOR_ID_NUM >= 2, compatible with FTS_VENDOR_2_ID + * FTS_GET_VENDOR_ID_NUM == 3, compatible with FTS_VENDOR_3_ID + */ +#define FTS_VENDOR_1_ID 0x00 +#define FTS_VENDOR_2_ID 0x00 +#define FTS_VENDOR_3_ID 0x00 + +/* + * FW_APP.i file for auto upgrade, you must replace it with your own + * define your own fw_app, the sample one to be replaced is invalid + * NOTE: if FTS_GET_VENDOR_ID_NUM >= 1, it's the fw corresponding with FTS_VENDOR_1_ID + */ +#define FTS_UPGRADE_FW_APP_EBBG "include/firmware/FT8716_app_ebbg_sample.i" +#define FTS_UPGRADE_FW_APP_CSOT "include/firmware/FT8716_app_csot_sample.i" + + +/* + * if FTS_GET_VENDOR_ID_NUM >= 2, fw corrsponding with FTS_VENDOR_2_ID + * define your own fw_app, the sample one is invalid + */ +#define FTS_UPGRADE_FW2_APP "include/firmware/FT8716_app_sample.i" + +/* + * if FTS_GET_VENDOR_ID_NUM == 3, fw corrsponding with FTS_VENDOR_3_ID + * define your own fw_app, the sample one is invalid + */ +#define FTS_UPGRADE_FW3_APP "include/firmware/FT8716_app_sample.i" + +/* + * lcd_cfg.i file for lcd cfg upgrade + * define your own lcd_cfg.i, the sample one is invalid + */ + + + +/* + * upgrade stress test for debug + * enable it for upgrade debug if needed + * default: disable + */ +#define FTS_UPGRADE_STRESS_TEST 0 +/* stress test times, default: 1000 */ +#define FTS_UPGRADE_TEST_NUMBER 1000 + +/*********************************************************/ + +#endif /* _LINUX_FOCLATECH_CONFIG_H_ */ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_core.c b/drivers/input/touchscreen/FT8716/focaltech_core.c new file mode 100755 index 0000000000000..23356e002722d --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_core.c @@ -0,0 +1,1723 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ +/***************************************************************************** +* +* File Name: focaltech_core.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#if FTS_GESTURE_EN +extern struct gesture_struct gesture_data; +#define MXT_INPUT_EVENT_START 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define MXT_INPUT_EVENT_STYLUS_MODE_OFF 2 +#define MXT_INPUT_EVENT_STYLUS_MODE_ON 3 +#define MXT_INPUT_EVENT_WAKUP_MODE_OFF 4 +#define MXT_INPUT_EVENT_WAKUP_MODE_ON 5 +#define MXT_INPUT_EVENT_EDGE_DISABLE 6 +#define MXT_INPUT_EVENT_EDGE_FINGER 7 +#define MXT_INPUT_EVENT_EDGE_HANDGRIP 8 +#define MXT_INPUT_EVENT_EDGE_FINGER_HANDGRIP 9 +#define MXT_INPUT_EVENT_END 9 +#endif +#if defined(CONFIG_FB) +#include +#include +#elif defined(CONFIG_HAS_EARLYSUSPEND) +#include +#define FTS_SUSPEND_LEVEL 1 /* Early-suspend level */ +#endif +#include +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_DRIVER_NAME "fts_ts" +#define INTERVAL_READ_REG 20 +#define TIMEOUT_READ_REG 300 +#if FTS_POWER_SOURCE_CUST_EN +#define FTS_VTG_MIN_UV 1600000 +#define FTS_VTG_MAX_UV 2000000 +#define FTS_I2C_VTG_MIN_UV 1800000 +#define FTS_I2C_VTG_MAX_UV 1800000 +#endif +#define FTS_READ_TOUCH_BUFFER_DIVIDED 0 +/***************************************************************************** +* Global variable or extern global variabls/functions +******************************************************************************/ +struct i2c_client *fts_i2c_client; +struct fts_ts_data *fts_wq_data; +struct input_dev *fts_input_dev; +extern char Lcm_name[HARDWARE_MAX_ITEM_LONGTH]; + +#if FTS_DEBUG_EN +int g_show_log = 1; +#else +int g_show_log = 0; +#endif + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) +char g_sz_debug[1024] = {0}; +#endif + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static void fts_release_all_finger(void); +int fts_ts_suspend(struct device *dev); +static int fts_ts_resume(struct device *dev); + +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" + + +extern int panel_dead2tp; + +/***************************************************************************** +* Name: fts_wait_tp_to_valid +* Brief: Read chip id until TP FW become valid, need call when reset/power on/resume... +* 1. Read Chip ID per INTERVAL_READ_REG(20ms) +* 2. Timeout: TIMEOUT_READ_REG(300ms) +* Input: +* Output: +* Return: 0 - Get correct Device ID +*****************************************************************************/ +int fts_wait_tp_to_valid(struct i2c_client *client) +{ + int ret = 0; + int cnt = 0; + u8 reg_value = 0; + + do { + ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID, ®_value); + if ((ret < 0) || (reg_value != chip_types.chip_idh)) { + FTS_INFO("TP Not Ready, ReadData = 0x%x", reg_value); + } else if (reg_value == chip_types.chip_idh) { + FTS_INFO("TP Ready, Device ID = 0x%x", reg_value); + return 0; + } + cnt++; + msleep(INTERVAL_READ_REG); + } while ((cnt * INTERVAL_READ_REG) < TIMEOUT_READ_REG); + + /* error: not get correct reg data */ + return -EPERM; +} + +/***************************************************************************** +* Name: fts_recover_state +* Brief: Need execute this function when reset +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_tp_state_recovery(struct i2c_client *client) +{ + /* wait tp stable */ + fts_wait_tp_to_valid(client); + /* recover TP charger state 0x8B */ + /* recover TP glove state 0xC0 */ + /* recover TP cover state 0xC1 */ + fts_ex_mode_recovery(client); + /* recover TP gesture state 0xD0 */ +#if FTS_GESTURE_EN + if (gesture_data.gesture_all_switch) + fts_gesture_recovery(client); +#endif +} + + +/***************************************************************************** +* Name: fts_reset_proc +* Brief: Execute reset operation +* Input: hdelayms - delay time unit:ms +* Output: +* Return: +*****************************************************************************/ +int fts_reset_proc(int hdelayms) +{ + gpio_direction_output(fts_wq_data->pdata->reset_gpio, 0); + msleep(20); + gpio_direction_output(fts_wq_data->pdata->reset_gpio, 1); + msleep(hdelayms); + + return 0; +} + +/***************************************************************************** +* Name: fts_irq_disable +* Brief: disable irq +* Input: +* sync: +* Output: +* Return: +*****************************************************************************/ +void fts_irq_disable(void) +{ + unsigned long irqflags; + spin_lock_irqsave(&fts_wq_data->irq_lock, irqflags); + + if (!fts_wq_data->irq_disable) { + disable_irq_nosync(fts_wq_data->client->irq); + fts_wq_data->irq_disable = 1; + } + + spin_unlock_irqrestore(&fts_wq_data->irq_lock, irqflags); +} + +/***************************************************************************** +* Name: fts_irq_enable +* Brief: enable irq +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_irq_enable(void) +{ + unsigned long irqflags = 0; + spin_lock_irqsave(&fts_wq_data->irq_lock, irqflags); + + if (fts_wq_data->irq_disable) { + enable_irq(fts_wq_data->client->irq); + fts_wq_data->irq_disable = 0; + } + + spin_unlock_irqrestore(&fts_wq_data->irq_lock, irqflags); +} + +#if FTS_GESTURE_EN +static int fts_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + char buffer[16]; + + if (type == EV_SYN && code == SYN_CONFIG) { + sprintf(buffer, "%d", value); + + FTS_INFO("FTS:Gesture on/off : %d", value); + if (value >= MXT_INPUT_EVENT_START && value <= MXT_INPUT_EVENT_END) { + if (value == MXT_INPUT_EVENT_WAKUP_MODE_ON) { + gesture_data.gesture_all_switch = 1; + } else if (value == MXT_INPUT_EVENT_WAKUP_MODE_OFF) { + gesture_data.gesture_all_switch = 0; + } else { + gesture_data.gesture_all_switch = 0; + FTS_ERROR("Failed Open/Close Gesture Function!\n"); + return -ENOMEM; + } + } + } + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_input_dev_init +* Brief: input dev init +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_input_dev_init(struct i2c_client *client, struct fts_ts_data *data, struct input_dev *input_dev, struct fts_ts_platform_data *pdata) +{ + int err, len; + + FTS_FUNC_ENTER(); + + /* Init and register Input device */ + input_dev->name = FTS_DRIVER_NAME; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; +#if FTS_GESTURE_EN + input_dev->event = fts_input_event; +#endif + + input_set_drvdata(input_dev, data); + i2c_set_clientdata(client, data); + + __set_bit(EV_KEY, input_dev->evbit); + if (data->pdata->have_key) { + FTS_DEBUG("set key capabilities"); + for (len = 0; len < data->pdata->key_number; len++) { + input_set_capability(input_dev, EV_KEY, data->pdata->keys[len]); + } + } + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + +#if FTS_MT_PROTOCOL_B_EN + input_mt_init_slots(input_dev, pdata->max_touch_number, INPUT_MT_DIRECT); +#else + input_set_abs_params(input_dev, ABS_MT_TRACKING_ID, 0, 0x0f, 0, 0); +#endif + input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, pdata->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, pdata->y_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 0xFF, 0, 0); +#if FTS_REPORT_PRESSURE_EN + input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 0xFF, 0, 0); +#endif + + err = input_register_device(input_dev); + if (err) { + FTS_ERROR("Input device registration failed"); + goto free_inputdev; + } + + FTS_FUNC_EXIT(); + + return 0; + +free_inputdev: + input_free_device(input_dev); + FTS_FUNC_EXIT(); + return err; + +} + +/***************************************************************************** +* Power Control +*****************************************************************************/ +#if FTS_POWER_SOURCE_CUST_EN +static int fts_power_source_init(struct fts_ts_data *data) +{ + int rc; + + FTS_FUNC_ENTER(); + + data->vcc_i2c = regulator_get(&data->client->dev, "vcc_i2c"); + if (IS_ERR(data->vcc_i2c)) { + rc = PTR_ERR(data->vcc_i2c); + FTS_ERROR("Regulator get failed vcc_i2c rc=%d", rc); + goto reg_vdd_set_vtg; + } + + data->lab = regulator_get(&data->client->dev, "lab"); + if (IS_ERR(data->lab)) { + rc = PTR_ERR(data->lab); + FTS_ERROR("Regulator get failed lab rc=%d", rc); + } + + data->ibb = regulator_get(&data->client->dev, "ibb"); + if (IS_ERR(data->ibb)) { + rc = PTR_ERR(data->ibb); + FTS_ERROR("Regulator get failed ibb rc=%d", rc); + } + data->panel_iovdd = regulator_get(&data->client->dev, "panel_iovdd"); + if (IS_ERR(data->panel_iovdd)) { + + FTS_ERROR("!!! panel_iovdd not present !!!"); + } + + FTS_FUNC_EXIT(); + return 0; + + + +reg_vdd_set_vtg: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FTS_VTG_MAX_UV); + + + FTS_FUNC_EXIT(); + return rc; +} + +static int fts_power_source_ctrl(struct fts_ts_data *data, int enable) +{ + int rc; + + FTS_FUNC_ENTER(); + if (enable) { + rc = regulator_enable(data->vcc_i2c); + if (rc) { + FTS_ERROR("Regulator vcc_i2c enable failed rc=%d", rc); + } + } else { + rc = regulator_disable(data->vcc_i2c); + if (rc) { + FTS_ERROR("Regulator vcc_i2c disable failed rc=%d", rc); + } + } + FTS_FUNC_EXIT(); + return 0; +} + +static int lcd_power_ctrl(struct fts_ts_data *data, int enable) +{ + int rc; + + FTS_FUNC_ENTER(); + if (enable) { + rc = regulator_enable(data->panel_iovdd); + if (rc) { + FTS_ERROR("Regulator panel_iovdd enable failed rc=%d\n", rc); + } + + rc = regulator_enable(data->lab); + if (rc) { + FTS_ERROR("Regulator labenable failed rc=%d\n", rc); + } + + rc = regulator_enable(data->ibb); + if (rc) { + FTS_ERROR("Regulator ibb enable failed rc=%d\n", rc); + } + } else { + rc = regulator_disable(data->lab); + if (rc) { + FTS_ERROR("Regulator lab disable failed rc=%d\n", rc); + } + + rc = regulator_disable(data->ibb); + if (rc) { + FTS_ERROR("Regulator ibb disable failed rc=%d\n", rc); + } + + mdelay(10); + rc = regulator_disable(data->panel_iovdd); + if (rc) { + FTS_ERROR("Regulator panel_iovdd disable failed rc=%d\n", rc); + } + + } + FTS_FUNC_EXIT(); + return 0; +} + + +#endif + + +/***************************************************************************** +* Reprot related +*****************************************************************************/ +/***************************************************************************** +* Name: fts_release_all_finger +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_release_all_finger(void) +{ +#if FTS_MT_PROTOCOL_B_EN + unsigned int finger_count = 0; +#endif + + mutex_lock(&fts_wq_data->report_mutex); +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < fts_wq_data->pdata->max_touch_number; finger_count++) { + input_mt_slot(fts_input_dev, finger_count); + input_mt_report_slot_state(fts_input_dev, MT_TOOL_FINGER, false); + } +#else + input_mt_sync(fts_input_dev); +#endif + input_report_key(fts_input_dev, BTN_TOUCH, 0); + input_sync(fts_input_dev); + mutex_unlock(&fts_wq_data->report_mutex); +} + + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) +static void fts_show_touch_buffer(u8 *buf, int point_num) +{ + int len = point_num * FTS_ONE_TCH_LEN; + int count = 0; + int i; + + memset(g_sz_debug, 0, 1024); + if (len > (POINT_READ_BUF-3)) { + len = POINT_READ_BUF-3; + } else if (len == 0) { + len += FTS_ONE_TCH_LEN; + } + count += sprintf(g_sz_debug, "%02X,%02X,%02X", buf[0], buf[1], buf[2]); + for (i = 0; i < len; i++) { + count += sprintf(g_sz_debug+count, ",%02X", buf[i+3]); + } + +} +#endif + +static int fts_input_dev_report_key_event(struct ts_event *event, struct fts_ts_data *data) +{ + int i; + + if (data->pdata->have_key) { + if ((1 == event->touch_point || 1 == event->point_num) && + (event->au16_y[0] == data->pdata->key_y_coord)) { + + if (event->point_num == 0) { + FTS_DEBUG("Keys All Up!"); + for (i = 0; i < data->pdata->key_number; i++) { + input_report_key(data->input_dev, data->pdata->keys[i], 0); + } + } else { + for (i = 0; i < data->pdata->key_number; i++) { + if (event->au16_x[0] > (data->pdata->key_x_coords[i] - FTS_KEY_WIDTH) && + event->au16_x[0] < (data->pdata->key_x_coords[i] + FTS_KEY_WIDTH)) { + + if (event->au8_touch_event[i] == 0 || + event->au8_touch_event[i] == 2) { + input_report_key(data->input_dev, data->pdata->keys[i], 1); + FTS_DEBUG("Key%d(%d, %d) DOWN!", i, event->au16_x[0], event->au16_y[0]); + } else { + input_report_key(data->input_dev, data->pdata->keys[i], 0); + FTS_DEBUG("Key%d(%d, %d) Up!", i, event->au16_x[0], event->au16_y[0]); + } + break; + } + } + } + input_sync(data->input_dev); + return 0; + } + } + + return -EPERM; +} + +#if FTS_MT_PROTOCOL_B_EN +static int fts_input_dev_report_b(struct ts_event *event, struct fts_ts_data *data) +{ + int i = 0; + int uppoint = 0; + int touchs = 0; + for (i = 0; i < event->touch_point; i++) { + if (event->au8_finger_id[i] >= data->pdata->max_touch_number) { + break; + } + input_mt_slot(data->input_dev, event->au8_finger_id[i]); + + if (event->au8_touch_event[i] == FTS_TOUCH_DOWN || event->au8_touch_event[i] == FTS_TOUCH_CONTACT) { + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, true); + +#if FTS_REPORT_PRESSURE_EN +#if FTS_FORCE_TOUCH_EN + if (event->pressure[i] <= 0) { + FTS_ERROR("[B]Illegal pressure: %d", event->pressure[i]); + event->pressure[i] = 1; + } +#else + event->pressure[i] = 0x3f; +#endif + input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]); +#endif + + if (event->area[i] <= 0) { + FTS_ERROR("[B]Illegal touch-major: %d", event->area[i]); + event->area[i] = 1; + } + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]); + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]); + touchs |= BIT(event->au8_finger_id[i]); + data->touchs |= BIT(event->au8_finger_id[i]); + +#if FTS_REPORT_PRESSURE_EN + + +#else + +#endif + } else { + uppoint++; + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); +#if FTS_REPORT_PRESSURE_EN + input_report_abs(data->input_dev, ABS_MT_PRESSURE, 0); +#endif + data->touchs &= ~BIT(event->au8_finger_id[i]); + + } + } + + if (unlikely(data->touchs ^ touchs)) { + for (i = 0; i < data->pdata->max_touch_number; i++) { + if (BIT(i) & (data->touchs ^ touchs)) { + + input_mt_slot(data->input_dev, i); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, false); +#if FTS_REPORT_PRESSURE_EN + input_report_abs(data->input_dev, ABS_MT_PRESSURE, 0); +#endif + } + } + } + + data->touchs = touchs; + if (event->touch_point == uppoint) { + + input_report_key(data->input_dev, BTN_TOUCH, 0); + } else { + input_report_key(data->input_dev, BTN_TOUCH, event->touch_point > 0); + } + + input_sync(data->input_dev); + + return 0; + +} + +#else +static int fts_input_dev_report_a(struct ts_event *event, struct fts_ts_data *data) +{ + int i = 0; + int uppoint = 0; + int touchs = 0; + for (i = 0; i < event->touch_point; i++) { + + if (event->au8_touch_event[i] == FTS_TOUCH_DOWN || event->au8_touch_event[i] == FTS_TOUCH_CONTACT) { + input_report_abs(data->input_dev, ABS_MT_TRACKING_ID, event->au8_finger_id[i]); +#if FTS_REPORT_PRESSURE_EN +#if FTS_FORCE_TOUCH_EN + if (event->pressure[i] <= 0) { + FTS_ERROR("[B]Illegal pressure: %d", event->pressure[i]); + event->pressure[i] = 1; + } +#else + event->pressure[i] = 0x3f; +#endif + input_report_abs(data->input_dev, ABS_MT_PRESSURE, event->pressure[i]); +#endif + + if (event->area[i] <= 0) { + FTS_ERROR("[B]Illegal touch-major: %d", event->area[i]); + event->area[i] = 1; + } + input_report_abs(data->input_dev, ABS_MT_TOUCH_MAJOR, event->area[i]); + + input_report_abs(data->input_dev, ABS_MT_POSITION_X, event->au16_x[i]); + input_report_abs(data->input_dev, ABS_MT_POSITION_Y, event->au16_y[i]); + + input_mt_sync(data->input_dev); + +#if FTS_REPORT_PRESSURE_EN + + +#else + FTS_DEBUG("[B]P%d(%d, %d)[tm:%d] DOWN!", event->au8_finger_id[i], event->au16_x[i], event->au16_y[i], event->area[i]); +#endif + } else { + uppoint++; + } + } + + data->touchs = touchs; + if (event->touch_point == uppoint) { + + input_report_key(data->input_dev, BTN_TOUCH, 0); + input_mt_sync(data->input_dev); + } else { + input_report_key(data->input_dev, BTN_TOUCH, event->touch_point > 0); + } + + input_sync(data->input_dev); + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_read_touchdata +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_read_touchdata(struct fts_ts_data *data) +{ + u8 buf[POINT_READ_BUF] = { 0 }; + u8 pointid = FTS_MAX_ID; + int ret = -1; + int i; + struct ts_event *event = &(data->event); + +#if FTS_GESTURE_EN + if (gesture_data.gesture_all_switch) { + u8 state; + if (data->suspended) { + fts_i2c_read_reg(data->client, FTS_REG_GESTURE_EN, &state); + if (state == 1) { + fts_gesture_readdata(data->client); + return 1; + } + } + } +#endif + +#if FTS_PSENSOR_EN + if ((fts_sensor_read_data(data) != 0) && (data->suspended == 1)) { + return 1; + } +#endif + + +#if FTS_READ_TOUCH_BUFFER_DIVIDED + memset(buf, 0xFF, POINT_READ_BUF); + memset(event, 0, sizeof(struct ts_event)); + + buf[0] = 0x00; + ret = fts_i2c_read(data->client, buf, 1, buf, (3 + FTS_ONE_TCH_LEN)); + if (ret < 0) { + FTS_ERROR("%s read touchdata failed.", __func__); + return ret; + } + event->touch_point = 0; + event->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F; + if (event->point_num > data->pdata->max_touch_number) + event->point_num = data->pdata->max_touch_number; + + if (event->point_num > 1) { + buf[9] = 0x09; + fts_i2c_read(data->client, buf+9, 1, buf+9, (event->point_num - 1) * FTS_ONE_TCH_LEN); + } +#else + ret = fts_i2c_read(data->client, buf, 1, buf, POINT_READ_BUF); + if (ret < 0) { + FTS_ERROR("[B]Read touchdata failed, ret: %d", ret); + return ret; + } + +#if FTS_POINT_REPORT_CHECK_EN + fts_point_report_check_queue_work(); +#endif + + memset(event, 0, sizeof(struct ts_event)); + event->point_num = buf[FTS_TOUCH_POINT_NUM] & 0x0F; + if (event->point_num > data->pdata->max_touch_number) + event->point_num = data->pdata->max_touch_number; + event->touch_point = 0; +#endif + +#if (FTS_DEBUG_EN && (FTS_DEBUG_LEVEL == 2)) + fts_show_touch_buffer(buf, event->point_num); +#endif + + for (i = 0; i < data->pdata->max_touch_number; i++) { + pointid = (buf[FTS_TOUCH_ID_POS + FTS_ONE_TCH_LEN * i]) >> 4; + if (pointid >= FTS_MAX_ID) + break; + else + event->touch_point++; + + event->au16_x[i] = + (s16) (buf[FTS_TOUCH_X_H_POS + FTS_ONE_TCH_LEN * i] & 0x0F) << + 8 | (s16) buf[FTS_TOUCH_X_L_POS + FTS_ONE_TCH_LEN * i]; + event->au16_y[i] = + (s16) (buf[FTS_TOUCH_Y_H_POS + FTS_ONE_TCH_LEN * i] & 0x0F) << + 8 | (s16) buf[FTS_TOUCH_Y_L_POS + FTS_ONE_TCH_LEN * i]; + event->au8_touch_event[i] = + buf[FTS_TOUCH_EVENT_POS + FTS_ONE_TCH_LEN * i] >> 6; + event->au8_finger_id[i] = + (buf[FTS_TOUCH_ID_POS + FTS_ONE_TCH_LEN * i]) >> 4; + event->area[i] = + (buf[FTS_TOUCH_AREA_POS + FTS_ONE_TCH_LEN * i]) >> 4; + event->pressure[i] = + (s16) buf[FTS_TOUCH_PRE_POS + FTS_ONE_TCH_LEN * i]; + + if (0 == event->area[i]) + event->area[i] = 0x09; + + if (0 == event->pressure[i]) + event->pressure[i] = 0x3f; + + if ((event->au8_touch_event[i] == 0 || event->au8_touch_event[i] == 2) && (event->point_num == 0)) { + FTS_DEBUG("abnormal touch data from fw"); + return -EPERM; + } + } + if (event->touch_point == 0) { + return -EPERM; + } + return 0; +} + +/***************************************************************************** +* Name: fts_report_value +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_report_value(struct fts_ts_data *data) +{ + struct ts_event *event = &data->event; + + + + + + if (0 == fts_input_dev_report_key_event(event, data)) { + return; + } + +#if FTS_MT_PROTOCOL_B_EN + fts_input_dev_report_b(event, data); +#else + fts_input_dev_report_a(event, data); +#endif + + + return; + +} + +/***************************************************************************** +* Name: fts_ts_interrupt +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static irqreturn_t fts_ts_interrupt(int irq, void *dev_id) +{ + struct fts_ts_data *fts_ts = dev_id; + int ret = -1; + + if (!fts_ts) { + FTS_ERROR("[INTR]: Invalid fts_ts"); + return IRQ_HANDLED; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_set_intr(1); +#endif + + ret = fts_read_touchdata(fts_wq_data); + + if (ret == 0) { + mutex_lock(&fts_wq_data->report_mutex); + fts_report_value(fts_wq_data); + mutex_unlock(&fts_wq_data->report_mutex); + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_set_intr(0); +#endif + + return IRQ_HANDLED; +} + +/***************************************************************************** +* Name: fts_gpio_configure +* Brief: Configure IRQ&RESET GPIO +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_gpio_configure(struct fts_ts_data *data) +{ + int err = 0; + + FTS_FUNC_ENTER(); + /* request irq gpio */ + if (gpio_is_valid(data->pdata->irq_gpio)) { + err = gpio_request(data->pdata->irq_gpio, "fts_irq_gpio"); + if (err) { + FTS_ERROR("[GPIO]irq gpio request failed"); + goto err_irq_gpio_req; + } + + err = gpio_direction_input(data->pdata->irq_gpio); + if (err) { + FTS_ERROR("[GPIO]set_direction for irq gpio failed"); + goto err_irq_gpio_dir; + } + } + /* request reset gpio */ + if (gpio_is_valid(data->pdata->reset_gpio)) { + err = gpio_request(data->pdata->reset_gpio, "fts_reset_gpio"); + if (err) { + FTS_ERROR("[GPIO]reset gpio request failed"); + goto err_irq_gpio_dir; + } + + err = gpio_direction_output(data->pdata->reset_gpio, 1); + if (err) { + FTS_ERROR("[GPIO]set_direction for reset gpio failed"); + goto err_reset_gpio_dir; + } + } + + FTS_FUNC_EXIT(); + return 0; + +err_reset_gpio_dir: + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); +err_irq_gpio_dir: + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); +err_irq_gpio_req: + FTS_FUNC_EXIT(); + return err; +} + + +/***************************************************************************** +* Name: fts_get_dt_coords +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_get_dt_coords(struct device *dev, char *name, + struct fts_ts_platform_data *pdata) { + u32 coords[FTS_COORDS_ARR_SIZE]; + struct property *prop; + struct device_node *np = dev->of_node; + int coords_size, rc; + + prop = of_find_property(np, name, NULL); + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + + coords_size = prop->length / sizeof(u32); + if (coords_size != FTS_COORDS_ARR_SIZE) { + FTS_ERROR("invalid %s", name); + return -EINVAL; + } + + rc = of_property_read_u32_array(np, name, coords, coords_size); + if (rc && (rc != -EINVAL)) { + FTS_ERROR("Unable to read %s", name); + return rc; + } + + if (!strcmp(name, "focaltech,display-coords")) { + if (!strcmp(Lcm_name, "ft8613_ebbg_5p5_1080p_video")) { + pdata->x_min = 0; + pdata->y_min = 0; + pdata->x_max = 1080; + pdata->y_max = 1920; + } else { + pdata->x_min = coords[0]; + pdata->y_min = coords[1]; + pdata->x_max = coords[2]; + pdata->y_max = coords[3]; + } + FTS_INFO("Lcdname:%s \n", Lcm_name); + FTS_INFO("x_min:%d y_min:%d x_max:%d y_max:%d", pdata->x_min, pdata->y_min, pdata->x_max, pdata->y_max); + + } else { + FTS_ERROR("unsupported property %s", name); + return -EINVAL; + } + + return 0; +} + +/***************************************************************************** +* Name: fts_parse_dt +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_parse_dt(struct device *dev, struct fts_ts_platform_data *pdata) +{ + int rc; + struct device_node *np = dev->of_node; + u32 temp_val; + + FTS_FUNC_ENTER(); + + rc = fts_get_dt_coords(dev, "focaltech,display-coords", pdata); + if (rc) + FTS_ERROR("Unable to get display-coords"); + + /* key */ + pdata->have_key = of_property_read_bool(np, "focaltech,have-key"); + if (pdata->have_key) { + rc = of_property_read_u32(np, "focaltech,key-number", &pdata->key_number); + if (rc) { + FTS_ERROR("Key number undefined!"); + } + rc = of_property_read_u32_array(np, "focaltech,keys", + pdata->keys, pdata->key_number); + if (rc) { + FTS_ERROR("Keys undefined!"); + } + rc = of_property_read_u32(np, "focaltech,key-y-coord", &pdata->key_y_coord); + if (rc) { + FTS_ERROR("Key Y Coord undefined!"); + } + rc = of_property_read_u32_array(np, "focaltech,key-x-coords", + pdata->key_x_coords, pdata->key_number); + if (rc) { + FTS_ERROR("Key X Coords undefined!"); + } + FTS_DEBUG("%d: (%d, %d, %d), [%d, %d, %d][%d]", + pdata->key_number, pdata->keys[0], pdata->keys[1], pdata->keys[2], + pdata->key_x_coords[0], pdata->key_x_coords[1], pdata->key_x_coords[2], + pdata->key_y_coord); + } + + /* reset, irq gpio info */ + pdata->reset_gpio = of_get_named_gpio_flags(np, "focaltech,reset-gpio", 0, &pdata->reset_gpio_flags); + if (pdata->reset_gpio < 0) { + FTS_ERROR("Unable to get reset_gpio"); + } + + pdata->irq_gpio = of_get_named_gpio_flags(np, "focaltech,irq-gpio", 0, &pdata->irq_gpio_flags); + if (pdata->irq_gpio < 0) { + FTS_ERROR("Unable to get irq_gpio"); + } + + rc = of_property_read_u32(np, "focaltech,max-touch-number", &temp_val); + if (!rc) { + pdata->max_touch_number = temp_val; + FTS_DEBUG("max_touch_number=%d", pdata->max_touch_number); + } else { + FTS_ERROR("Unable to get max-touch-number"); + pdata->max_touch_number = FTS_MAX_POINTS; + } + + + + FTS_FUNC_EXIT(); + return 0; +} + +#if defined(CONFIG_FB) +/***************************************************************************** +* Name: fb_notifier_callback +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fb_notifier_callback(struct notifier_block *self, + unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct fts_ts_data *fts_data = + container_of(self, struct fts_ts_data, fb_notif); + + if (evdata && evdata->data && event == FB_EVENT_BLANK && + fts_data && fts_data->client) { + blank = evdata->data; + if (*blank == FB_BLANK_UNBLANK) + fts_ts_resume(&fts_data->client->dev); + else if (*blank == FB_BLANK_POWERDOWN) + fts_ts_suspend(&fts_data->client->dev); + } + + return 0; +} +#elif defined(CONFIG_HAS_EARLYSUSPEND) +/***************************************************************************** +* Name: fts_ts_early_suspend +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_early_suspend(struct early_suspend *handler) +{ + struct fts_ts_data *data = container_of(handler, + struct fts_ts_data, + early_suspend); + + fts_ts_suspend(&data->client->dev); +} + +/***************************************************************************** +* Name: fts_ts_late_resume +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_late_resume(struct early_suspend *handler) +{ + struct fts_ts_data *data = container_of(handler, + struct fts_ts_data, + early_suspend); + + fts_ts_resume(&data->client->dev); +} +#endif +#if 1 +static int fts_ts_pinctrl_init(struct fts_ts_data *data) +{ + int retval; + + /* Get pinctrl if target uses pinctrl */ + data->ts_pinctrl = devm_pinctrl_get(&(data->client->dev)); + if (IS_ERR_OR_NULL(data->ts_pinctrl)) { + retval = PTR_ERR(data->ts_pinctrl); + dev_dbg(&data->client->dev, + "Target does not use pinctrl %d\n", retval); + goto err_pinctrl_get; + } + + data->pinctrl_state_active + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_ACTIVE); + if (IS_ERR_OR_NULL(data->pinctrl_state_active)) { + retval = PTR_ERR(data->pinctrl_state_active); + dev_err(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_lookup; + } + + data->pinctrl_state_suspend + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_SUSPEND); + if (IS_ERR_OR_NULL(data->pinctrl_state_suspend)) { + retval = PTR_ERR(data->pinctrl_state_suspend); + dev_err(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_SUSPEND, retval); + goto err_pinctrl_lookup; + } + + data->pinctrl_state_release + = pinctrl_lookup_state(data->ts_pinctrl, + PINCTRL_STATE_RELEASE); + if (IS_ERR_OR_NULL(data->pinctrl_state_release)) { + retval = PTR_ERR(data->pinctrl_state_release); + dev_dbg(&data->client->dev, + "Can not lookup %s pinstate %d\n", + PINCTRL_STATE_RELEASE, retval); + } + + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(data->ts_pinctrl); +err_pinctrl_get: + data->ts_pinctrl = NULL; + return retval; +} +#endif + +static void hardwareinfo_set(void *drv_data) +{ + char firmware_ver[HARDWARE_MAX_ITEM_LONGTH]; + char vendor_for_id[HARDWARE_MAX_ITEM_LONGTH]; + char ic_name[HARDWARE_MAX_ITEM_LONGTH]; + int err; + + u8 vendor_id; + u8 ic_type; + u8 fw_ver; + + fts_i2c_read_reg(fts_i2c_client, FTS_REG_VENDOR_ID, &vendor_id); + fts_i2c_read_reg(fts_i2c_client, FTS_REG_FW_VER, &fw_ver); + fts_i2c_read_reg(fts_i2c_client, FTS_REG_CHIP_ID, &ic_type); + + if (vendor_id == EBBG_VENDOR) { + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "EBBG"); + } else if (vendor_id == CSOT_VENDOR) { + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "CSOT"); + } else{ + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "Other vendor"); + } + + if (ic_type == TP_IC_FT8613) { + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT8613"); + } else{ + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "Other IC"); + } + + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x", vendor_for_id, ic_name, fw_ver); + FTS_INFO("firmware_ver=%s\n", firmware_ver); + + err = hardwareinfo_set_prop(HARDWARE_TP, firmware_ver); + if (err < 0) + return ; + + return ; + +} + + +#ifndef WT_COMPILE_FACTORY_VERSION +static int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, strlen("ffbm")); + FTS_INFO("cmd_line =%s \n", cmd_line); + if (ret == 0) { + FTS_INFO("mode: ffbm\n"); + return 1;/* factory mode*/ + } else { + FTS_INFO("mode: no ffbm\n"); + return 2;/* not factory mode*/ + } + } + FTS_INFO("Normal mode \n"); + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_ts_probe +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_ts_shutdown(struct i2c_client *client) +{ + lcd_power_ctrl(fts_wq_data, 0); +} + +static int fts_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct fts_ts_platform_data *pdata; + struct fts_ts_data *data; + struct input_dev *input_dev; + int err; + int i; + u8 reg_addr, reg_value; + + FTS_FUNC_ENTER(); + /* 1. Get Platform data */ + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, + sizeof(struct fts_ts_platform_data), + GFP_KERNEL); + if (!pdata) { + FTS_ERROR("[MEMORY]Failed to allocate memory"); + FTS_FUNC_EXIT(); + return -ENOMEM; + } + err = fts_parse_dt(&client->dev, pdata); + if (err) { + FTS_ERROR("[DTS]DT parsing failed"); + } + } else { + pdata = client->dev.platform_data; + } + + if (!pdata) { + FTS_ERROR("Invalid pdata"); + FTS_FUNC_EXIT(); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + FTS_ERROR("I2C not supported"); + FTS_FUNC_EXIT(); + goto free_platform_data; + } + + data = devm_kzalloc(&client->dev, sizeof(struct fts_ts_data), GFP_KERNEL); + if (!data) { + FTS_ERROR("[MEMORY]Failed to allocate memory"); + FTS_FUNC_EXIT(); + return -ENOMEM; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + FTS_ERROR("[INPUT]Failed to allocate input device"); + FTS_FUNC_EXIT(); + goto free_ts_data; + } + + + + data->input_dev = input_dev; + data->client = client; + data->pdata = pdata; + + fts_wq_data = data; + fts_i2c_client = client; + fts_input_dev = input_dev; + + spin_lock_init(&fts_wq_data->irq_lock); + mutex_init(&fts_wq_data->report_mutex); + + fts_input_dev_init(client, data, input_dev, pdata); + + fts_ctpm_get_upgrade_array(); + + err = fts_gpio_configure(data); + if (err < 0) { + FTS_ERROR("[GPIO]Failed to configure the gpios"); + goto input_destroy; + } + + msleep(1); + + +#if 1 + err = fts_ts_pinctrl_init(data); + if (!err && data->ts_pinctrl) { + /* + * Pinctrl handle is optional. If pinctrl handle is found + * let pins to be configured in active state. If not + * found continue further without error. + */ + err = pinctrl_select_state(data->ts_pinctrl, + data->pinctrl_state_active); + if (err < 0) { + dev_err(&client->dev, + "failed to select pin to active state"); + } + } +#endif + + +#if FTS_POWER_SOURCE_CUST_EN + fts_power_source_init(data); + fts_power_source_ctrl(data, 1); + lcd_power_ctrl(data, 1); +#endif + fts_reset_proc(200); + + + /* check the controller id */ + reg_addr = 0xA3; + for (i = 0; i < 5; i++) { + err = fts_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + msleep(5); + else + break; + + } + if (i >= 5) { + dev_err(&client->dev, "version read failed"); + goto free_gpio; + } + + fts_wait_tp_to_valid(client); + + err = request_threaded_irq(client->irq, NULL, fts_ts_interrupt, + /*pdata->irq_gpio_flags | */IRQF_ONESHOT | IRQF_TRIGGER_FALLING, + client->dev.driver->name, data); + if (err) { + FTS_ERROR("Request irq failed!"); + goto free_gpio; + } + + fts_irq_disable(); + +#if FTS_PSENSOR_EN + if (fts_sensor_init(data) != 0) { + FTS_ERROR("fts_sensor_init failed!"); + FTS_FUNC_EXIT(); + goto irq_free; + } +#endif + +#if FTS_APK_NODE_EN + fts_create_apk_debug_channel(client); +#endif + +#if FTS_SYSFS_NODE_EN + fts_create_sysfs(client); +#endif + +#if FTS_POINT_REPORT_CHECK_EN + fts_point_report_check_init(); +#endif + + fts_ex_mode_init(client); + +#if FTS_GESTURE_EN + fts_gesture_init(input_dev, client); +#endif + +#if FTS_ESDCHECK_EN + fts_esdcheck_init(); +#endif + + fts_irq_enable(); + fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &data->fw_vendor_id); + fts_i2c_read_reg(client, FTS_REG_FW_VER, data->fw_ver); + FTS_INFO("vendor_id=0x%x\n", data->fw_vendor_id); + FTS_INFO("tp_fw=0x%x\n", data->fw_ver[0]); +#if FTS_TEST_EN + fts_test_init(client); +#endif + +#if FTS_LOCK_DOWN_INFO + fts_lockdown_init(client); +#endif + +#if FTS_CAT_RAWDATA + fts_rawdata_init(client); +#endif + + +#if FTS_AUTO_UPGRADE_EN + err = get_boot_mode(client); + if (err == 0) { + fts_ctpm_upgrade_init(); + } else { + FTS_INFO("Not in normal mode!\n"); + } + +#endif + + +#if defined(CONFIG_FB) + data->fb_notif.notifier_call = fb_notifier_callback; + err = fb_register_client(&data->fb_notif); + if (err) + FTS_ERROR("[FB]Unable to register fb_notifier: %d", err); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + FTS_SUSPEND_LEVEL; + data->early_suspend.suspend = fts_ts_early_suspend; + data->early_suspend.resume = fts_ts_late_resume; + register_early_suspend(&data->early_suspend); +#endif + + hardwareinfo_tp_register(hardwareinfo_set, data); + + FTS_FUNC_EXIT(); + return 0; + +#if FTS_PSENSOR_EN +irq_free: + free_irq(client->irq, data); +#endif +free_gpio: + if (gpio_is_valid(pdata->reset_gpio)) + gpio_free(pdata->reset_gpio); + if (gpio_is_valid(pdata->irq_gpio)) + gpio_free(pdata->irq_gpio); + + lcd_power_ctrl(data, 0); +input_destroy: + input_unregister_device(input_dev); + input_dev = NULL; + input_free_device(input_dev); +free_ts_data: + devm_kfree(&client->dev, data); +free_platform_data: + devm_kfree(&client->dev, pdata); + + return err; + +} + +/***************************************************************************** +* Name: fts_ts_remove +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_ts_remove(struct i2c_client *client) +{ + struct fts_ts_data *data = i2c_get_clientdata(client); + + FTS_FUNC_ENTER(); + cancel_work_sync(&data->touch_event_work); + +#if FTS_PSENSOR_EN + fts_sensor_remove(data); +#endif + +#if FTS_POINT_REPORT_CHECK_EN + fts_point_report_check_exit(); +#endif + +#if FTS_APK_NODE_EN + fts_release_apk_debug_channel(); +#endif + +#if FTS_SYSFS_NODE_EN + fts_remove_sysfs(client); +#endif + + fts_ex_mode_exit(client); + +#if FTS_AUTO_UPGRADE_EN + cancel_work_sync(&fw_update_work); +#endif + +#if defined(CONFIG_FB) + if (fb_unregister_client(&data->fb_notif)) + FTS_ERROR("Error occurred while unregistering fb_notifier."); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&data->early_suspend); +#endif + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + input_unregister_device(data->input_dev); + +#if FTS_TEST_EN + fts_test_exit(client); +#endif + +#if FTS_ESDCHECK_EN + fts_esdcheck_exit(); +#endif + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_ts_suspend +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_ts_suspend(struct device *dev) +{ + struct fts_ts_data *data = fts_wq_data; + int retval = 0, i = 0; + + FTS_FUNC_ENTER(); + if (data->suspended) { + FTS_INFO("Already in suspend state"); + FTS_FUNC_EXIT(); + return -EPERM; + } +#if FTS_ESDCHECK_EN + fts_esdcheck_suspend(); +#endif + +#if FTS_GESTURE_EN + if (gesture_data.gesture_all_switch) { + + if (panel_dead2tp) { + FTS_ERROR("%s: panel_dead2tp=%d", __func__, panel_dead2tp); + lcd_power_ctrl(data, 0); + data->suspended = true; + return 0; + } + + retval = fts_gesture_suspend(data->client); + if (retval == 0) { + /* Enter into gesture mode(suspend) */ + retval = enable_irq_wake(fts_wq_data->client->irq); + if (retval) + FTS_ERROR("%s: set_irq_wake failed", __func__); + data->suspended = true; + FTS_FUNC_EXIT(); + return 0; + } + } + +#endif + +#if FTS_PSENSOR_EN + if (fts_sensor_suspend(data) != 0) { + enable_irq_wake(data->client->irq); + data->suspended = true; + return 0; + } +#endif + + fts_irq_disable(); + + for (; i < 5; i++) { + /* TP enter sleep mode */ + retval = fts_i2c_write_reg(data->client, FTS_REG_POWER_MODE, FTS_REG_POWER_MODE_SLEEP_VALUE); + if (retval < 0) { + FTS_ERROR("Set TP to sleep mode fail, ret=%d!", retval); + } else { + FTS_INFO("go into sleep mode successfully\n"); + break; + } + msleep(20); + } + + +if (!(gesture_data.gesture_all_switch)) { + lcd_power_ctrl(data, 0); + } + + data->suspended = true; + + FTS_FUNC_EXIT(); + + return 0; +} +EXPORT_SYMBOL(fts_ts_suspend); +/***************************************************************************** +* Name: fts_ts_resume +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_ts_resume(struct device *dev) +{ + struct fts_ts_data *data = dev_get_drvdata(dev); + + FTS_FUNC_ENTER(); + if (!data->suspended) { + FTS_DEBUG("Already in awake state"); + FTS_FUNC_EXIT(); + return -EPERM; + } + fts_release_all_finger(); + + + + if ((!(gesture_data.gesture_all_switch)) || panel_dead2tp) { + FTS_ERROR("%s:panel_dead2tp=%d", __func__, panel_dead2tp); + panel_dead2tp = 0; + lcd_power_ctrl(data, 1); + } + +#if (!FTS_CHIP_IDC) + fts_reset_proc(200); +#endif + + fts_tp_state_recovery(data->client); + +#if FTS_ESDCHECK_EN + fts_esdcheck_resume(); +#endif + +#if FTS_GESTURE_EN + if (gesture_data.gesture_all_switch) { + if (fts_gesture_resume(data->client) == 0) { + int err; + err = disable_irq_wake(data->client->irq); + if (err) + FTS_ERROR("%s: disable_irq_wake failed", __func__); + data->suspended = false; + FTS_FUNC_EXIT(); + return 0; + } + } + +#endif + +#if FTS_PSENSOR_EN + if (fts_sensor_resume(data) != 0) { + disable_irq_wake(data->client->irq); + data->suspended = false; + FTS_FUNC_EXIT(); + return 0; + } +#endif + + data->suspended = false; + + fts_irq_enable(); + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* I2C Driver +*****************************************************************************/ +static const struct i2c_device_id fts_ts_id[] = { + {FTS_DRIVER_NAME, 0}, + {}, +}; +MODULE_DEVICE_TABLE(i2c, fts_ts_id); + +static struct of_device_id fts_match_table[] = { + { .compatible = "focaltech,fts", }, + { }, +}; + +static struct i2c_driver fts_ts_driver = { + .probe = fts_ts_probe, + .remove = fts_ts_remove, + .shutdown = fts_ts_shutdown, + .driver = { + .name = FTS_DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = fts_match_table, + }, + .id_table = fts_ts_id, +}; + +/***************************************************************************** +* Name: fts_ts_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int __init fts_ts_init(void) +{ + int ret = 0; + + FTS_FUNC_ENTER(); + ret = i2c_add_driver(&fts_ts_driver); + if (ret != 0) { + FTS_ERROR("Focaltech touch screen driver init failed!"); + } + FTS_FUNC_EXIT(); + return ret; +} + +/***************************************************************************** +* Name: fts_ts_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void __exit fts_ts_exit(void) +{ + i2c_del_driver(&fts_ts_driver); +} + +module_init(fts_ts_init); +module_exit(fts_ts_exit); + +MODULE_AUTHOR("FocalTech Driver Team"); +MODULE_DESCRIPTION("FocalTech Touchscreen Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/FT8716/focaltech_core.h b/drivers/input/touchscreen/FT8716/focaltech_core.h new file mode 100755 index 0000000000000..b249d71fcfb1f --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_core.h @@ -0,0 +1,212 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ +/***************************************************************************** +* +* File Name: focaltech_core.h + +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +#ifndef __LINUX_FOCALTECH_CORE_H__ +#define __LINUX_FOCALTECH_CORE_H__ +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "focaltech_common.h" +#include "focaltech_flash.h" +#if FTS_PSENSOR_EN +#include +#endif +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define LEN_FLASH_ECC_MAX 0xFFFE + +#define FTS_WORKQUEUE_NAME "fts_wq" + +#define FTS_MAX_POINTS 10 +#define FTS_KEY_WIDTH 50 +#define FTS_ONE_TCH_LEN 6 +#define POINT_READ_BUF (3 + FTS_ONE_TCH_LEN * FTS_MAX_POINTS) + +#define FTS_MAX_ID 0x0F +#define FTS_TOUCH_X_H_POS 3 +#define FTS_TOUCH_X_L_POS 4 +#define FTS_TOUCH_Y_H_POS 5 +#define FTS_TOUCH_Y_L_POS 6 +#define FTS_TOUCH_PRE_POS 7 +#define FTS_TOUCH_AREA_POS 8 +#define FTS_TOUCH_POINT_NUM 2 +#define FTS_TOUCH_EVENT_POS 3 +#define FTS_TOUCH_ID_POS 5 +#define FTS_COORDS_ARR_SIZE 4 + +#define FTS_TOUCH_DOWN 0 +#define FTS_TOUCH_UP 1 +#define FTS_TOUCH_CONTACT 2 + +#define FTS_SYSFS_ECHO_ON(buf) ((strnicmp(buf, "1", 1) == 0) || \ + (strnicmp(buf, "on", 2) == 0)) +#define FTS_SYSFS_ECHO_OFF(buf) ((strnicmp(buf, "0", 1) == 0) || \ + (strnicmp(buf, "off", 3) == 0)) + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + + +struct fts_ts_platform_data { + u32 irq_gpio; + u32 irq_gpio_flags; + u32 reset_gpio; + u32 reset_gpio_flags; + bool have_key; + u32 key_number; + u32 keys[4]; + u32 key_y_coord; + u32 key_x_coords[4]; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; + u32 max_touch_number; +}; + +struct ts_event { + u16 au16_x[FTS_MAX_POINTS]; /*x coordinate */ + u16 au16_y[FTS_MAX_POINTS]; /*y coordinate */ + u16 pressure[FTS_MAX_POINTS]; + u8 au8_touch_event[FTS_MAX_POINTS]; /* touch event: 0 -- down; 1-- up; 2 -- contact */ + u8 au8_finger_id[FTS_MAX_POINTS]; /*touch ID */ + u8 area[FTS_MAX_POINTS]; + u8 touch_point; + u8 point_num; +}; + +struct fts_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + struct ts_event event; + const struct fts_ts_platform_data *pdata; +#if FTS_PSENSOR_EN + struct fts_psensor_platform_data *psensor_pdata; +#endif + struct work_struct touch_event_work; + struct workqueue_struct *ts_workqueue; + struct regulator *vdd; + struct regulator *vcc_i2c; + struct regulator *lab; + struct regulator *ibb; + struct regulator *panel_iovdd; + spinlock_t irq_lock; + struct mutex report_mutex; + u16 addr; + bool suspended; + u8 fw_ver[3]; + u8 fw_vendor_id; + int touchs; + int irq_disable; + +#if defined(CONFIG_FB) + struct notifier_block fb_notif; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + struct pinctrl_state *pinctrl_state_release; +}; + + +#if FTS_PSENSOR_EN +struct fts_psensor_platform_data { + struct input_dev *input_psensor_dev; + struct sensors_classdev ps_cdev; + int tp_psensor_opened; + char tp_psensor_data; /* 0 near, 1 far */ + struct fts_ts_data *data; +}; + +int fts_sensor_init(struct fts_ts_data *data); +int fts_sensor_read_data(struct fts_ts_data *data); +int fts_sensor_suspend(struct fts_ts_data *data); +int fts_sensor_resume(struct fts_ts_data *data); +int fts_sensor_remove(struct fts_ts_data *data); +#endif + +/***************************************************************************** +* Static variables +*****************************************************************************/ +extern struct i2c_client *fts_i2c_client; +extern struct fts_ts_data *fts_wq_data; +extern struct input_dev *fts_input_dev; + + +#define EACHOPTO_VENDOR 0x80 +#define OFILM_VENDOR 0x51 +#define JUNDA_VENDOR 0x85 +#define HOLITECH_VENDOR 0x82 +#define TXD_VENDOR 0xe9 +#define EBBG_VENDOR 0xd0 +#define CSOT_VENDOR 0x89 +#define FW_NO_UPGRADE 0 +#define FW_UPGRADING 1 +#define FW_UPGRADED 2 +#define TP_IC_FT8716 0x87 +#define TP_IC_FT8613 0x86 +extern u8 fw_upgrade_status; +#endif /* __LINUX_FOCALTECH_CORE_H__ */ diff --git a/drivers/input/touchscreen/FT8716/focaltech_esdcheck.c b/drivers/input/touchscreen/FT8716/focaltech_esdcheck.c new file mode 100755 index 0000000000000..92b05f0afcce9 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_esdcheck.c @@ -0,0 +1,466 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_esdcheck.c +* +* Author: luoguojin +* +* Created: 2016-08-03 +* +* Abstract: ESD check function +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By luougojin 2016-08-03 +* v1.1: By luougojin 2017-02-15 +* 1. Add LCD_ESD_PATCH to control idc_esdcheck_lcderror +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_ESDCHECK_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define ESDCHECK_WAIT_TIME 4000 +#define LCD_ESD_PATCH 0 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_esdcheck_st { + u8 active:1; /* 1- esd check active, need check esd 0- no esd check */ + u8 suspend:1; + u8 proc_debug:1; /* apk or adb is accessing I2C */ + u8 intr:1; /* 1- Interrupt trigger */ + u8 unused:4; + u8 flow_work_hold_cnt; /* Flow Work Cnt(reg0x91) keep a same value for x times. >=5 times is ESD, need reset */ + u8 flow_work_cnt_last; /* Save Flow Work Cnt(reg0x91) value */ + u32 hardware_reset_cnt; + u32 i2c_nack_cnt; + u32 i2c_dataerror_cnt; +}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct delayed_work fts_esdcheck_work; +static struct workqueue_struct *fts_esdcheck_workqueue; +static struct fts_esdcheck_st fts_esdcheck_data; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ +#if LCD_ESD_PATCH +/***************************************************************************** +* Name: lcd_esdcheck +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int lcd_need_reset; +static int tp_need_recovery; /* LCD reset cause Tp reset */ +int idc_esdcheck_lcderror(void) +{ + u8 val; + int ret; + + FTS_DEBUG("[ESD]Check LCD ESD"); + if ((tp_need_recovery == 1) && (lcd_need_reset == 0)) { + tp_need_recovery = 0; + /* LCD reset, need recover TP state */ + fts_tp_state_recovery(fts_i2c_client); + } + + ret = fts_i2c_read_reg(fts_i2c_client, FTS_REG_ESD_SATURATE, &val); + if (ret < 0) { + FTS_ERROR("[ESD]: Read ESD_SATURATE(0xED) failed ret=%d!", ret); + return -EIO; + } + + if (val == 0xAA) { + /* + * 1. Set flag lcd_need_reset = 1; + * 2. LCD driver need reset(recovery) LCD and set lcd_need_reset to 0 + * 3. recover TP state + */ + FTS_INFO("LCD ESD, Execute LCD reset!"); + lcd_need_reset = 1; + tp_need_recovery = 1; + } + + return 0; +} +#endif + +/***************************************************************************** +* Name: fts_esdcheck_tp_reset +* Brief: esd check algorithm +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_esdcheck_tp_reset(void) +{ + FTS_FUNC_ENTER(); + + fts_esdcheck_data.flow_work_hold_cnt = 0; + fts_esdcheck_data.hardware_reset_cnt++; + + fts_reset_proc(200); + fts_tp_state_recovery(fts_i2c_client); + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: get_chip_id +* Brief: Read Chip Id 3 times +* Input: +* Output: +* Return: 1 - Read Chip Id 3 times failed +* 0 - Read Chip Id pass +*****************************************************************************/ +static bool get_chip_id(void) +{ + int err = 0; + int i = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + + for (i = 0; i < 3; i++) { + reg_addr = FTS_REG_CHIP_ID; + err = fts_i2c_read(fts_i2c_client, ®_addr, 1, ®_value, 1); + + if (err < 0) { + FTS_ERROR("[ESD]: Read Reg 0xA3 failed ret = %d!!", err); + fts_esdcheck_data.i2c_nack_cnt++; + } else { + if ((reg_value == chip_types.chip_idh) || (reg_value == 0xEF)) {/* Upgrade sometimes can't detect */ + break; + } else { + fts_esdcheck_data.i2c_dataerror_cnt++; + } + } + } + + /* if can't get correct data in 3 times, then need hardware reset */ + if (i >= 3) { + FTS_ERROR("[ESD]: Read Chip id 3 times failed, need execute TP reset!!"); + return 1; + } + + return 0; +} + +/***************************************************************************** +* Name: get_flow_cnt +* Brief: Read flow cnt(0x91) +* Input: +* Output: +* Return: 1 - Reg 0x91(flow cnt) abnormal: hold a value for 5 times +* 0 - Reg 0x91(flow cnt) normal +*****************************************************************************/ +static bool get_flow_cnt(void) +{ + int err = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + + reg_addr = FTS_REG_FLOW_WORK_CNT; + err = fts_i2c_read(fts_i2c_client, ®_addr, 1, ®_value, 1); + if (err < 0) { + FTS_ERROR("[ESD]: Read Reg 0x91 failed ret = %d!!", err); + fts_esdcheck_data.i2c_nack_cnt++; + } else { + if (reg_value == fts_esdcheck_data.flow_work_cnt_last) { + fts_esdcheck_data.flow_work_hold_cnt++; + } else { + fts_esdcheck_data.flow_work_hold_cnt = 0; + } + + fts_esdcheck_data.flow_work_cnt_last = reg_value; + } + + /* if read flow work cnt 5 times and the value are all the same, then need hardware_reset */ + if (fts_esdcheck_data.flow_work_hold_cnt >= 5) { + FTS_DEBUG("[ESD]: Flow Work Cnt(reg0x91) keep a value for 5 times, need execute TP reset!!"); + return 1; + } + + return 0; +} + +extern int panel_dead2tp; +/***************************************************************************** +* Name: esdcheck_algorithm +* Brief: esd check algorithm +* Input: +* Output: +* Return: +*****************************************************************************/ +static int esdcheck_algorithm(void) +{ + int err = 0; + u8 reg_value = 0; + u8 reg_addr = 0; + bool hardware_reset = 0; + + /* 1. esdcheck is interrupt, then return */ + if (fts_esdcheck_data.intr == 1) { + FTS_INFO("[ESD]: In interrupt state, not check esd, return immediately!!"); + return 0; + } + + /* 2. check power state, if suspend, no need check esd */ + if (fts_esdcheck_data.suspend == 1) { + FTS_INFO("[ESD]: In suspend, not check esd, return immediately!!"); + /* because in suspend state, adb can be used, when upgrade FW, will active ESD check(active = 1) + * But in suspend, then will don't queue_delayed_work, when resume, don't check ESD again + */ + fts_esdcheck_data.active = 0; + return 0; + } + + /* 3. check fts_esdcheck_data.proc_debug state, if 1-proc busy, no need check esd*/ + if (fts_esdcheck_data.proc_debug == 1) { + FTS_INFO("[ESD]: In apk or adb command mode, not check esd, return immediately!!"); + return 0; + } + + /* 4. In factory mode, can't check esd */ + reg_addr = FTS_REG_WORKMODE; + err = fts_i2c_read(fts_i2c_client, ®_addr, 1, ®_value, 1); + if (err < 0) { + fts_esdcheck_data.i2c_nack_cnt++; + } else if ((reg_value & 0x70) == FTS_REG_WORKMODE_FACTORY_VALUE) { + FTS_INFO("[ESD]: In factory mode, not check esd, return immediately!!"); + return 0; + } + + /* 5. IDC esd check lcd default:close */ +#if LCD_ESD_PATCH + idc_esdcheck_lcderror(); +#endif + + /* 6. Get Chip ID */ + hardware_reset = get_chip_id(); + + /* 7. get Flow work cnt: 0x91 If no change for 5 times, then ESD and reset */ + if (!hardware_reset) { + + hardware_reset = get_flow_cnt(); + } + +reg_addr = 0xED; +fts_i2c_read(fts_i2c_client, ®_addr, 1, ®_value, 1); +if (reg_value == 0xAA) { + panel_dead2tp = 1; + printk("FTS:change panel_dead2tp:%d\n", panel_dead2tp); +} + /* 8. If need hardware reset, then handle it here */ + if (hardware_reset == 1) { + fts_esdcheck_tp_reset(); + } + + + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_func +* Brief: fts_esdcheck_func +* Input: +* Output: +* Return: +*****************************************************************************/ +static void esdcheck_func(struct work_struct *work) +{ + FTS_FUNC_ENTER(); + + esdcheck_algorithm(); + + if (fts_esdcheck_data.suspend == 0) { + queue_delayed_work(fts_esdcheck_workqueue, &fts_esdcheck_work, msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } + + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: fts_esdcheck_set_intr +* Brief: interrupt flag (main used in interrupt tp report) +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_set_intr(bool intr) +{ + /* interrupt don't add debug message */ + fts_esdcheck_data.intr = intr; + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_get_status(void) +* Brief: get current status +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_get_status(void) +{ + /* interrupt don't add debug message */ + return fts_esdcheck_data.active; +} + +/***************************************************************************** +* Name: fts_esdcheck_proc_busy +* Brief: When APK or ADB command access TP via driver, then need set proc_debug, +* then will not check ESD. +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_proc_busy(bool proc_debug) +{ + fts_esdcheck_data.proc_debug = proc_debug; + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_switch +* Brief: FTS esd check function switch. +* Input: enable: 1 - Enable esd check +* 0 - Disable esd check +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_switch(bool enable) +{ + FTS_FUNC_ENTER(); + if (enable == 1) { + if (fts_esdcheck_data.active == 0) { + FTS_INFO("[ESD]: ESD check start!!"); + fts_esdcheck_data.active = 1; + queue_delayed_work(fts_esdcheck_workqueue, &fts_esdcheck_work, msecs_to_jiffies(ESDCHECK_WAIT_TIME)); + } + } else { + if (fts_esdcheck_data.active == 1) { + FTS_INFO("[ESD]: ESD check stop!!"); + fts_esdcheck_data.active = 0; + cancel_delayed_work_sync(&fts_esdcheck_work); + } + } + + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_suspend +* Brief: Run when tp enter into suspend +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_suspend(void) +{ + FTS_FUNC_ENTER(); + fts_esdcheck_switch(DISABLE); + fts_esdcheck_data.suspend = 1; + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_resume +* Brief: Run when tp resume +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_resume(void) +{ + FTS_FUNC_ENTER(); + fts_esdcheck_switch(ENABLE); + fts_esdcheck_data.suspend = 0; + FTS_FUNC_EXIT(); + return 0; +} + + +/***************************************************************************** +* Name: fts_esdcheck_init +* Brief: Init and create a queue work to check esd +* Input: +* Output: +* Return: < 0: Fail to create esd check queue +*****************************************************************************/ +int fts_esdcheck_init(void) +{ + FTS_FUNC_ENTER(); + + INIT_DELAYED_WORK(&fts_esdcheck_work, esdcheck_func); + fts_esdcheck_workqueue = create_workqueue("fts_esdcheck_wq"); + if (fts_esdcheck_workqueue == NULL) { + FTS_INFO("[ESD]: Failed to create esd work queue!!"); + } + + memset((u8 *)&fts_esdcheck_data, 0, sizeof(struct fts_esdcheck_st)); + + fts_esdcheck_switch(ENABLE); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_esdcheck_exit +* Brief: When FTS TP driver is removed, then call this function to destory work queue +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_esdcheck_exit(void) +{ + FTS_FUNC_ENTER(); + + destroy_workqueue(fts_esdcheck_workqueue); + + FTS_FUNC_EXIT(); + return 0; +} +#endif /* FTS_ESDCHECK_EN */ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_ex_fun.c b/drivers/input/touchscreen/FT8716/focaltech_ex_fun.c new file mode 100755 index 0000000000000..007ff7314009e --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_ex_fun.c @@ -0,0 +1,1230 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: Focaltech_ex_fun.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +/*create apk debug channel*/ +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_AUTOCLB 4 +#define PROC_UPGRADE_INFO 5 +#define PROC_WRITE_DATA 6 +#define PROC_READ_DATA 7 +#define PROC_SET_TEST_FLAG 8 +#define PROC_SET_SLAVE_ADDR 10 +#define PROC_HW_RESET 11 +#define PROC_NAME "ftxxxx-debug" +#define WRITE_BUF_SIZE 512 +#define READ_BUF_SIZE 512 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static unsigned char proc_operate_mode = PROC_UPGRADE; +static struct proc_dir_entry *fts_proc_entry; +static struct +{ + int op; + int reg; + int value; + int result; +} g_rwreg_result; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if FTS_ESDCHECK_EN +static void esd_process(u8 *writebuf, int buflen, bool flag) +{ + if (flag) { + if ((writebuf[1] == 0xFC) && (writebuf[2] == 0x55) && (buflen == 0x03)) { + /* Upgrade command */ + FTS_DEBUG("[ESD]: Upgrade command(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + fts_esdcheck_switch(DISABLE); + } else if ((writebuf[1] == 0x00) && (writebuf[2] == 0x40) && (buflen == 0x03)) { + /* factory mode bit 4 5 6 */ + FTS_DEBUG("[ESD]: Entry factory mode(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + fts_esdcheck_switch(DISABLE); + } else if ((writebuf[1] == 0x00) && (writebuf[2] == 0x00) && (buflen == 0x03)) { + /* normal mode bit 4 5 6 */ + FTS_DEBUG("[ESD]: Exit factory mode(%x %x %x)!!", writebuf[0], writebuf[1], writebuf[2]); + fts_esdcheck_switch(ENABLE); + } else { + fts_esdcheck_proc_busy(1); + } + } else { + if ((writebuf[1] == 0x07) && (buflen == 0x02)) { + FTS_DEBUG("[ESD]: Upgrade finish-trigger reset(07)(%x %x)!!", writebuf[0], writebuf[1]); + fts_esdcheck_switch(ENABLE); + } else { + fts_esdcheck_proc_busy(0); + } + } +} +#endif +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) +/*interface of write proc*/ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static ssize_t fts_debug_write(struct file *filp, const char __user *buff, size_t count, loff_t *ppos) +{ + unsigned char writebuf[WRITE_BUF_SIZE]; + int buflen = count; + int writelen = 0; + int ret = 0; + char tmp[25]; + + if (copy_from_user(&writebuf, buff, buflen)) { + FTS_DEBUG("[APK]: copy from user error!!"); + return -EFAULT; + } +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 1); +#endif + proc_operate_mode = writebuf[0]; + switch (proc_operate_mode) { + case PROC_UPGRADE: + { + char upgrade_file_path[FILE_NAME_LENGTH]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + FTS_DEBUG("%s\n", upgrade_file_path); + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + if (fts_updatefun_curr.upgrade_with_app_bin_file) + ret = fts_updatefun_curr.upgrade_with_app_bin_file(fts_i2c_client, upgrade_file_path); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + if (ret < 0) { + FTS_ERROR("[APK]: upgrade failed!!"); + } + } + break; + + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]); +#if FTS_ESDCHECK_EN + if (writebuf[1] == 0) { + fts_esdcheck_switch(DISABLE); + } else { + fts_esdcheck_switch(ENABLE); + } +#endif + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_SET_SLAVE_ADDR: + + ret = fts_i2c_client->addr; + FTS_DEBUG("Original i2c addr 0x%x ", ret<<1); + if (writebuf[1] != fts_i2c_client->addr) { + fts_i2c_client->addr = writebuf[1]; + FTS_DEBUG("Change i2c addr 0x%x to 0x%x", ret<<1, writebuf[1]<<1); + + } + break; + + case PROC_HW_RESET: + + sprintf(tmp, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_DEBUG("Begin HW Reset"); + fts_reset_proc(1); + } + + break; + + case PROC_AUTOCLB: + FTS_DEBUG("[APK]: autoclb!!"); + fts_ctpm_auto_clb(fts_i2c_client); + break; + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = count - 1; + if (writelen > 0) { + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + } + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 0); +#endif + + if (ret < 0) { + return ret; + } else { + return count; + } +} + +/* interface of read proc */ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static ssize_t fts_debug_read(struct file *filp, char __user *buff, size_t count, loff_t *ppos) +{ + int ret = 0; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + unsigned char buf[READ_BUF_SIZE]; + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + switch (proc_operate_mode) { + case PROC_UPGRADE: + + regaddr = FTS_REG_FW_VER; + ret = fts_i2c_read_reg(fts_i2c_client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + + if (copy_to_user(buff, buf, num_read_chars)) { + FTS_ERROR("[APK]: copy to user error!!"); + return -EFAULT; + } + + return num_read_chars; +} +static const struct file_operations fts_proc_fops = { + .owner = THIS_MODULE, + .read = fts_debug_read, + .write = fts_debug_write, +}; +#else +/* interface of write proc */ +/************************************************************************ +* Name: fts_debug_write +* Brief:interface of write proc +* Input: file point, data buf, data len, no use +* Output: no +* Return: data len +***********************************************************************/ +static int fts_debug_write(struct file *filp, + const char __user *buff, unsigned long len, void *data) +{ + unsigned char writebuf[WRITE_BUF_SIZE]; + int buflen = len; + int writelen = 0; + int ret = 0; + char tmp[25]; + + if (copy_from_user(&writebuf, buff, buflen)) { + FTS_ERROR("[APK]: copy from user error!!"); + return -EFAULT; + } +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 1); +#endif + proc_operate_mode = writebuf[0]; + switch (proc_operate_mode) { + + case PROC_UPGRADE: + { + char upgrade_file_path[FILE_NAME_LENGTH]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + FTS_DEBUG("%s\n", upgrade_file_path); + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + if (fts_updatefun_curr.upgrade_with_app_bin_file) + ret = fts_updatefun_curr.upgrade_with_app_bin_file(fts_i2c_client, upgrade_file_path); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + if (ret < 0) { + FTS_ERROR("[APK]: upgrade failed!!"); + } + } + break; + case PROC_SET_TEST_FLAG: + FTS_DEBUG("[APK]: PROC_SET_TEST_FLAG = %x!!", writebuf[1]); +#if FTS_ESDCHECK_EN + if (writebuf[1] == 0) { + fts_esdcheck_switch(DISABLE); + } else { + fts_esdcheck_switch(ENABLE); + } +#endif + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!n"); + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + break; + case PROC_SET_SLAVE_ADDR: + + ret = fts_i2c_client->addr; + FTS_DEBUG("Original i2c addr 0x%x ", ret<<1); + if (writebuf[1] != fts_i2c_client->addr) { + fts_i2c_client->addr = writebuf[1]; + FTS_DEBUG("Change i2c addr 0x%x to 0x%x", ret<<1, writebuf[1]<<1); + } + break; + + case PROC_HW_RESET: + + sprintf(tmp, "%s", writebuf + 1); + tmp[buflen - 1] = '\0'; + if (strncmp(tmp, "focal_driver", 12) == 0) { + FTS_DEBUG("Begin HW Reset"); + fts_reset_proc(1); + } + + break; + + case PROC_AUTOCLB: + FTS_DEBUG("[APK]: autoclb!!"); + fts_ctpm_auto_clb(fts_i2c_client); + break; + case PROC_READ_DATA: + case PROC_WRITE_DATA: + writelen = len - 1; + if (writelen > 0) { + ret = fts_i2c_write(fts_i2c_client, writebuf + 1, writelen); + if (ret < 0) { + FTS_ERROR("[APK]: write iic error!!"); + } + } + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + esd_process(writebuf, buflen, 0); +#endif + + if (ret < 0) { + return ret; + } else { + return len; + } +} + +/* interface of read proc */ +/************************************************************************ +* Name: fts_debug_read +* Brief:interface of read proc +* Input: point to the data, no use, no use, read len, no use, no use +* Output: page point to data +* Return: read char number +***********************************************************************/ +static int fts_debug_read(char *page, char **start, + off_t off, int count, int *eof, void *data) +{ + int ret = 0; + unsigned char buf[READ_BUF_SIZE]; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + switch (proc_operate_mode) { + case PROC_UPGRADE: + regaddr = FTS_REG_FW_VER; + ret = fts_i2c_read_reg(fts_i2c_client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + num_read_chars = 1; + break; + case PROC_READ_DATA: + readlen = count; + ret = fts_i2c_read(fts_i2c_client, NULL, 0, buf, readlen); + if (ret < 0) { +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + FTS_ERROR("[APK]: read iic error!!"); + return ret; + } + + num_read_chars = readlen; + break; + case PROC_WRITE_DATA: + break; + default: + break; + } + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + + memcpy(page, buf, num_read_chars); + return num_read_chars; +} +#endif +/************************************************************************ +* Name: fts_create_apk_debug_channel +* Brief: create apk debug channel +* Input: i2c info +* Output: no +* Return: success =0 +***********************************************************************/ +int fts_create_apk_debug_channel(struct i2c_client *client) +{ +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + fts_proc_entry = proc_create(PROC_NAME, 0777, NULL, &fts_proc_fops); +#else + fts_proc_entry = create_proc_entry(PROC_NAME, 0777, NULL); +#endif + if (NULL == fts_proc_entry) { + FTS_ERROR("Couldn't create proc entry!"); + return -ENOMEM; + } else { + FTS_INFO("Create proc entry success!"); + +#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 10, 0)) + fts_proc_entry->write_proc = fts_debug_write; + fts_proc_entry->read_proc = fts_debug_read; +#endif + } + return 0; +} +/************************************************************************ +* Name: fts_release_apk_debug_channel +* Brief: release apk debug channel +* Input: no +* Output: no +* Return: no +***********************************************************************/ +void fts_release_apk_debug_channel(void) +{ + + if (fts_proc_entry) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 10, 0)) + proc_remove(fts_proc_entry); +#else + remove_proc_entry(PROC_NAME, NULL); +#endif +} + +/* + * fts_hw_reset interface + */ +static ssize_t fts_hw_reset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + return -EPERM; +} +static ssize_t fts_hw_reset_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t count = 0; + + fts_reset_proc(200); + + count = snprintf(buf, PAGE_SIZE, "hw reset executed\n"); + + return count; +} + +/* + * fts_irq interface + */ +static ssize_t fts_irq_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[EX-FUN]enable irq"); + fts_irq_enable(); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[EX-FUN]disable irq"); + fts_irq_disable(); + } + return count; +} + +static ssize_t fts_irq_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return -EPERM; +} + +/************************************************************************ +* Name: fts_tpfwver_show +* Brief: show tp fw vwersion +* Input: device, device attribute, char buf +* Output: no +* Return: char number +***********************************************************************/ +static ssize_t fts_tpfwver_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + ssize_t num_read_chars = 0; + u8 fwver = 0; + + mutex_lock(&fts_input_dev->mutex); + +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + if (fts_i2c_read_reg(fts_i2c_client, FTS_REG_FW_VER, &fwver) < 0) { + num_read_chars = snprintf(buf, PAGE_SIZE, "I2c transfer error!\n"); + } +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + if (fwver == 255) + num_read_chars = snprintf(buf, PAGE_SIZE, "get tp fw version fail!\n"); + else { + num_read_chars = snprintf(buf, PAGE_SIZE, "%02X\n", fwver); + } + + mutex_unlock(&fts_input_dev->mutex); + + return num_read_chars; +} +/************************************************************************ +* Name: fts_tpfwver_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tpfwver_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +static int fts_is_hex_char(const char ch) +{ + int result = 0; + if (ch >= '0' && ch <= '9') { + result = 1; + } else if (ch >= 'a' && ch <= 'f') { + result = 1; + } else if (ch >= 'A' && ch <= 'F') { + result = 1; + } else { + result = 0; + } + + return result; +} + +static int fts_hex_char_to_int(const char ch) +{ + int result = 0; + if (ch >= '0' && ch <= '9') { + result = (int)(ch - '0'); + } else if (ch >= 'a' && ch <= 'f') { + result = (int)(ch - 'a') + 10; + } else if (ch >= 'A' && ch <= 'F') { + result = (int)(ch - 'A') + 10; + } else { + result = -1; + } + + return result; +} + +static int fts_hex_to_str(char *hex, int iHexLen, char *ch, int *iChLen) +{ + int high = 0; + int low = 0; + int tmp = 0; + int i = 0; + int iCharLen = 0; + if (hex == NULL || ch == NULL) { + return -EPERM; + } + + FTS_DEBUG("iHexLen: %d in function:%s!!\n\n", iHexLen, __func__); + + if (iHexLen % 2 == 1) { + return -ENOENT; + } + + for (i = 0; i < iHexLen; i += 2) { + high = fts_hex_char_to_int(hex[i]); + if (high < 0) { + ch[iCharLen] = '\0'; + return -ESRCH; + } + + low = fts_hex_char_to_int(hex[i+1]); + if (low < 0) { + ch[iCharLen] = '\0'; + return -ESRCH; + } + tmp = (high << 4) + low; + ch[iCharLen++] = (char)tmp; + } + ch[iCharLen] = '\0'; + *iChLen = iCharLen; + FTS_DEBUG("iCharLen: %d, iChLen: %d in function:%s!!\n\n", iCharLen, *iChLen, __func__); + return 0; +} + +static void fts_str_to_bytes(char *bufStr, int iLen, char *uBytes, int *iBytesLen) +{ + int i = 0; + int iNumChLen = 0; + + *iBytesLen = 0; + + for (i = 0; i < iLen; i++) { + if (fts_is_hex_char(bufStr[i])) { + bufStr[iNumChLen++] = bufStr[i]; + } + } + + bufStr[iNumChLen] = '\0'; + + fts_hex_to_str(bufStr, iNumChLen, uBytes, iBytesLen); +} +/************************************************************************ +* Name: fts_tprwreg_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_tprwreg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&fts_input_dev->mutex); + + if (!g_rwreg_result.op) { + if (g_rwreg_result.result == 0) { + count = sprintf(buf, "Read %02X: %02X\n", g_rwreg_result.reg, g_rwreg_result.value); + } else { + count = sprintf(buf, "Read %02X failed, ret: %d\n", g_rwreg_result.reg, g_rwreg_result.result); + } + } else { + if (g_rwreg_result.result == 0) { + count = sprintf(buf, "Write %02X, %02X success\n", g_rwreg_result.reg, g_rwreg_result.value); + } else { + count = sprintf(buf, "Write %02X failed, ret: %d\n", g_rwreg_result.reg, g_rwreg_result.result); + } + } + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_tprwreg_store +* Brief: read/write register +* Input: device, device attribute, char buf, char count +* Output: print register value +* Return: char count +***********************************************************************/ +static ssize_t fts_tprwreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + ssize_t num_read_chars = 0; + int retval; + long unsigned int wmreg = 0; + u8 regaddr = 0xff, regvalue = 0xff; + u8 valbuf[5] = {0}; + + memset(valbuf, 0, sizeof(valbuf)); + mutex_lock(&fts_input_dev->mutex); + num_read_chars = count - 1; + if (num_read_chars != 2) { + if (num_read_chars != 4) { + FTS_ERROR("please input 2 or 4 character"); + goto error_return; + } + } + memcpy(valbuf, buf, num_read_chars); + retval = kstrtoul(valbuf, 16, &wmreg); + fts_str_to_bytes((char *)buf, num_read_chars, valbuf, &retval); + + if (1 == retval) { + regaddr = valbuf[0]; + retval = 0; + } else if (2 == retval) { + regaddr = valbuf[0]; + regvalue = valbuf[1]; + retval = 0; + } else + retval = -1; + + if (0 != retval) { + FTS_ERROR("%s() - ERROR: Could not convert the given input to a number. The given input was: \"%s\"", __FUNCTION__, buf); + goto error_return; + } +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + if (2 == num_read_chars) { + g_rwreg_result.op = 0; + g_rwreg_result.reg = regaddr; + /*read register*/ + regaddr = wmreg; + g_rwreg_result.result = fts_i2c_read_reg(client, regaddr, ®value); + if (g_rwreg_result.result < 0) { + FTS_ERROR("Could not read the register(0x%02x)", regaddr); + } else { + FTS_INFO("the register(0x%02x) is 0x%02x", regaddr, regvalue); + g_rwreg_result.value = regvalue; + g_rwreg_result.result = 0; + } + } else { + regaddr = wmreg>>8; + regvalue = wmreg; + + g_rwreg_result.op = 1; + g_rwreg_result.reg = regaddr; + g_rwreg_result.value = regvalue; + g_rwreg_result.result = fts_i2c_write_reg(client, regaddr, regvalue); + if (g_rwreg_result.result < 0) { + FTS_ERROR("Could not write the register(0x%02x)", regaddr); + + } else { + FTS_INFO("Write 0x%02x into register(0x%02x) successful", regvalue, regaddr); + g_rwreg_result.result = 0; + } + } +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif +error_return: + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_fwupdate_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_fwupdate_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_fwupdate_store +* Brief: upgrade from *.i +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_fwupdate_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&fts_input_dev->mutex); + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + if (fts_updatefun_curr.upgrade_with_app_i_file) + fts_updatefun_curr.upgrade_with_app_i_file(client); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_fwupgradeapp_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_fwupgradeapp_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_fwupgradeapp_store +* Brief: upgrade from app.bin +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_fwupgradeapp_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + char fwname[FILE_NAME_LENGTH]; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + + mutex_lock(&fts_input_dev->mutex); + fts_irq_disable(); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + if (fts_updatefun_curr.upgrade_with_app_bin_file) + fts_updatefun_curr.upgrade_with_app_bin_file(client, fwname); +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_driverversion_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_driverversion_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&fts_input_dev->mutex); + + count = sprintf(buf, FTS_DRIVER_VERSION "\n"); + + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_driverversion_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_driverversion_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +#if FTS_ESDCHECK_EN +/************************************************************************ +* Name: fts_esdcheck_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_esdcheck_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + mutex_lock(&fts_input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_DEBUG("enable esdcheck"); + fts_esdcheck_switch(ENABLE); + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_DEBUG("disable esdcheck"); + fts_esdcheck_switch(DISABLE); + } + mutex_unlock(&fts_input_dev->mutex); + + return -EPERM; +} + +/************************************************************************ +* Name: fts_esdcheck_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_esdcheck_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&fts_input_dev->mutex); + + count = sprintf(buf, "Esd check: %s\n", fts_esdcheck_get_status() ? "On" : "Off"); + + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +#endif +/************************************************************************ +* Name: fts_module_config_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_module_config_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count = 0; + + mutex_lock(&fts_input_dev->mutex); + + count += sprintf(buf, "FTS_CHIP_TYPE: \t\t\t%04X\n", FTS_CHIP_TYPE); + count += sprintf(buf+count, "FTS_DEBUG_EN: \t\t\t%s\n", FTS_DEBUG_EN ? "ON" : "OFF"); +#if defined(FTS_MT_PROTOCOL_B_EN) + count += sprintf(buf+count, "TS_MT_PROTOCOL_B_EN: \t\t%s\n", FTS_MT_PROTOCOL_B_EN ? "ON" : "OFF"); +#endif + count += sprintf(buf+count, "FTS_GESTURE_EN: \t\t%s\n", FTS_GESTURE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_ESDCHECK_EN: \t\t%s\n", FTS_ESDCHECK_EN ? "ON" : "OFF"); +#if defined(FTS_PSENSOR_EN) + count += sprintf(buf+count, "FTS_PSENSOR_EN: \t\t%s\n", FTS_PSENSOR_EN ? "ON" : "OFF"); +#endif + count += sprintf(buf+count, "FTS_GLOVE_EN: \t\t\t%s\n", FTS_GLOVE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_COVER_EN: \t\t%s\n", FTS_COVER_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_CHARGER_EN: \t\t\t%s\n", FTS_CHARGER_EN ? "ON" : "OFF"); + + count += sprintf(buf+count, "FTS_REPORT_PRESSURE_EN: \t\t%s\n", FTS_REPORT_PRESSURE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_FORCE_TOUCH_EN: \t\t%s\n", FTS_FORCE_TOUCH_EN ? "ON" : "OFF"); + + count += sprintf(buf+count, "FTS_TEST_EN: \t\t\t%s\n", FTS_TEST_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_APK_NODE_EN: \t\t%s\n", FTS_APK_NODE_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_POWER_SOURCE_CUST_EN: \t%s\n", FTS_POWER_SOURCE_CUST_EN ? "ON" : "OFF"); + count += sprintf(buf+count, "FTS_AUTO_UPGRADE_EN: \t\t%s\n", FTS_AUTO_UPGRADE_EN ? "ON" : "OFF"); + + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_module_config_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_module_config_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_show_log_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_show_log_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + + mutex_lock(&fts_input_dev->mutex); + + count = sprintf(buf, "Log: %s\n", g_show_log ? "On" : "Off"); + + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +/************************************************************************ +* Name: fts_show_log_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_show_log_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + + mutex_lock(&fts_input_dev->mutex); + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_DEBUG("enable show log info/error"); + g_show_log = 1; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_DEBUG("disable show log info/error"); + g_show_log = 0; + } + mutex_unlock(&fts_input_dev->mutex); + return count; +} +/************************************************************************ +* Name: fts_dumpreg_store +* Brief: no +* Input: device, device attribute, char buf, char count +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_dumpreg_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/************************************************************************ +* Name: fts_dumpreg_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_dumpreg_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + char tmp[256]; + int count = 0; + u8 regvalue = 0; + struct i2c_client *client; + + mutex_lock(&fts_input_dev->mutex); +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(1); +#endif + client = container_of(dev, struct i2c_client, dev); + fts_i2c_read_reg(client, FTS_REG_POWER_MODE, ®value); + count += sprintf(tmp + count, "Power Mode:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_FW_VER, ®value); + count += sprintf(tmp + count, "FW Ver:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, ®value); + count += sprintf(tmp + count, "Vendor ID:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_LCD_BUSY_NUM, ®value); + count += sprintf(tmp + count, "LCD Busy Number:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, ®value); + count += sprintf(tmp + count, "Gesture Mode:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_CHARGER_MODE_EN, ®value); + count += sprintf(tmp + count, "charge stat:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_INT_CNT, ®value); + count += sprintf(tmp + count, "INT count:0x%02x\n", regvalue); + + fts_i2c_read_reg(client, FTS_REG_FLOW_WORK_CNT, ®value); + count += sprintf(tmp + count, "ESD count:0x%02x\n", regvalue); +#if FTS_ESDCHECK_EN + fts_esdcheck_proc_busy(0); +#endif + memcpy(buf, tmp, count); + mutex_unlock(&fts_input_dev->mutex); + return count; +} + +/****************************************/ +/* sysfs */ +/* get the fw version +* example:cat fw_version +*/ +static DEVICE_ATTR(fts_fw_version, S_IRUGO|S_IWUSR, fts_tpfwver_show, fts_tpfwver_store); + +/* upgrade from *.i +* example: echo 1 > fw_update +*/ +static DEVICE_ATTR(fts_fw_update, S_IRUGO|S_IWUSR, fts_fwupdate_show, fts_fwupdate_store); +/* read and write register +* read example: echo 88 > rw_reg ---read register 0x88 +* write example:echo 8807 > rw_reg ---write 0x07 into register 0x88 +* +* note:the number of input must be 2 or 4.if it not enough,please fill in the 0. +*/ +static DEVICE_ATTR(fts_rw_reg, S_IRUGO|S_IWUSR, fts_tprwreg_show, fts_tprwreg_store); +/* upgrade from app.bin +* example:echo "*_app.bin" > upgrade_app +*/ +static DEVICE_ATTR(fts_upgrade_app, S_IRUGO|S_IWUSR, fts_fwupgradeapp_show, fts_fwupgradeapp_store); +static DEVICE_ATTR(fts_driver_version, S_IRUGO|S_IWUSR, fts_driverversion_show, fts_driverversion_store); +static DEVICE_ATTR(fts_dump_reg, S_IRUGO|S_IWUSR, fts_dumpreg_show, fts_dumpreg_store); +static DEVICE_ATTR(fts_show_log, S_IRUGO|S_IWUSR, fts_show_log_show, fts_show_log_store); +static DEVICE_ATTR(fts_module_config, S_IRUGO|S_IWUSR, fts_module_config_show, fts_module_config_store); +static DEVICE_ATTR(fts_hw_reset, S_IRUGO|S_IWUSR, fts_hw_reset_show, fts_hw_reset_store); +static DEVICE_ATTR(fts_irq, S_IRUGO|S_IWUSR, fts_irq_show, fts_irq_store); + +#if FTS_ESDCHECK_EN +static DEVICE_ATTR(fts_esd_check, S_IRUGO|S_IWUSR, fts_esdcheck_show, fts_esdcheck_store); +#endif + +/* add your attr in here*/ +static struct attribute *fts_attributes[] = { + &dev_attr_fts_fw_version.attr, + &dev_attr_fts_fw_update.attr, + &dev_attr_fts_rw_reg.attr, + &dev_attr_fts_dump_reg.attr, + &dev_attr_fts_upgrade_app.attr, + &dev_attr_fts_driver_version.attr, + &dev_attr_fts_show_log.attr, + &dev_attr_fts_module_config.attr, + &dev_attr_fts_hw_reset.attr, + &dev_attr_fts_irq.attr, +#if FTS_ESDCHECK_EN + &dev_attr_fts_esd_check.attr, +#endif + NULL +}; + +static struct attribute_group fts_attribute_group = { + .attrs = fts_attributes +}; + +/************************************************************************ +* Name: fts_create_sysfs +* Brief: create sysfs for debug +* Input: i2c info +* Output: no +* Return: success =0 +***********************************************************************/ +int fts_create_sysfs(struct i2c_client *client) +{ + int err; + err = sysfs_create_group(&client->dev.kobj, &fts_attribute_group); + if (0 != err) { + FTS_ERROR("[EX]: sysfs_create_group() failed!!"); + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return -EIO; + } else { + FTS_INFO("[EX]: sysfs_create_group() succeeded!!"); + } + return err; +} +/************************************************************************ +* Name: fts_remove_sysfs +* Brief: remove sys +* Input: i2c info +* Output: no +* Return: no +***********************************************************************/ +int fts_remove_sysfs(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_attribute_group); + return 0; +} diff --git a/drivers/input/touchscreen/FT8716/focaltech_ex_mode.c b/drivers/input/touchscreen/FT8716/focaltech_ex_mode.c new file mode 100755 index 0000000000000..9bd3e9a28290f --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_ex_mode.c @@ -0,0 +1,347 @@ +/* + * + * FocalTech ftxxxx TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_ex_mode.c +* +* Author: Liu WeiGuang +* +* Created: 2016-08-31 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* 2.Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* 3.Private enumerations, structures and unions using typedef +*****************************************************************************/ +struct fts_mode_flag { + int fts_glove_mode_flag; + int fts_cover_mode_flag; + int fts_charger_mode_flag; +}; + +struct fts_mode_flag g_fts_mode_flag; + +/***************************************************************************** +* 4.Static variables +*****************************************************************************/ + +/***************************************************************************** +* 5.Global variable or extern global variabls/functions +*****************************************************************************/ +int fts_enter_glove_mode(struct i2c_client *client, int mode); +int fts_glove_init(struct i2c_client *client); +int fts_glove_exit(struct i2c_client *client); + +int fts_enter_cover_mode(struct i2c_client *client, int mode); +int fts_cover_init(struct i2c_client *client); +int fts_cover_exit(struct i2c_client *client); + +int fts_enter_charger_mode(struct i2c_client *client, int mode); +int fts_charger_init(struct i2c_client *client); +int fts_charger_exit(struct i2c_client *client); + +/***************************************************************************** +* 6.Static function prototypes +*******************************************************************************/ + +#if FTS_GLOVE_EN +static ssize_t fts_touch_glove_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Glove: %s\n", g_fts_mode_flag.fts_glove_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_glove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_fts_mode_flag.fts_glove_mode_flag) { + FTS_INFO("[Mode]enter glove mode"); + ret = fts_enter_glove_mode(fts_i2c_client, true); + if (ret >= 0) { + g_fts_mode_flag.fts_glove_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_fts_mode_flag.fts_glove_mode_flag) { + FTS_INFO("[Mode]exit glove mode"); + ret = fts_enter_glove_mode(fts_i2c_client, false); + if (ret >= 0) { + g_fts_mode_flag.fts_glove_mode_flag = false; + } + } + } + FTS_INFO("[Mode]glove mode status: %d", g_fts_mode_flag.fts_glove_mode_flag); + return count; +} + +/************************************************************************ +* Name: fts_enter_glove_mode +* Brief: change glove mode +* Input: glove mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int fts_enter_glove_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_GLOVE_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_ERROR("[Mode]fts_enter_glove_mode write value fail"); + } + + return ret ; + +} + +/* read and write glove mode +* read example: cat fts_touch_glove_mode---read glove mode +* write example:echo 01 > fts_touch_glove_mode ---write glove mode to 01 +* +*/ +static DEVICE_ATTR (fts_glove_mode, S_IRUGO|S_IWUSR, fts_touch_glove_show, fts_touch_glove_store); + +#endif + +#if FTS_COVER_EN +static ssize_t fts_touch_cover_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Cover: %s\n", g_fts_mode_flag.fts_cover_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_cover_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_fts_mode_flag.fts_cover_mode_flag) { + FTS_INFO("[Mode]enter cover mode"); + ret = fts_enter_cover_mode(fts_i2c_client, true); + if (ret >= 0) { + g_fts_mode_flag.fts_cover_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_fts_mode_flag.fts_cover_mode_flag) { + FTS_INFO("[Mode]exit cover mode"); + ret = fts_enter_cover_mode(fts_i2c_client, false); + if (ret >= 0) { + g_fts_mode_flag.fts_cover_mode_flag = false; + } + } + } + FTS_INFO("[Mode]cover mode status: %d", g_fts_mode_flag.fts_cover_mode_flag); + return count; +} + +/************************************************************************ +* Name: fts_enter_cover_mode +* Brief: change cover mode +* Input: cover mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int fts_enter_cover_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_COVER_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_ERROR("[Mode] fts_enter_cover_mode write value fail \n"); + } + + return ret ; + +} + +/* read and write cover mode +* read example: cat fts_touch_cover_mode---read cover mode +* write example:echo 01 > fts_touch_cover_mode ---write cover mode to 01 +* +*/ +static DEVICE_ATTR (fts_cover_mode, S_IRUGO|S_IWUSR, fts_touch_cover_show, fts_touch_cover_store); + +#endif + +#if FTS_CHARGER_EN +static ssize_t fts_touch_charger_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "Charger: %s\n", g_fts_mode_flag.fts_charger_mode_flag ? "On" : "Off"); +} + +static ssize_t fts_touch_charger_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + int ret; + + if (FTS_SYSFS_ECHO_ON(buf)) { + if (!g_fts_mode_flag.fts_charger_mode_flag) { + FTS_INFO("[Mode]enter charger mode"); + ret = fts_enter_charger_mode(fts_i2c_client, true); + if (ret >= 0) { + g_fts_mode_flag.fts_charger_mode_flag = true; + } + } + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + if (g_fts_mode_flag.fts_charger_mode_flag) { + FTS_INFO("[Mode]exit charger mode"); + ret = fts_enter_charger_mode(fts_i2c_client, false); + if (ret >= 0) { + g_fts_mode_flag.fts_charger_mode_flag = false; + } + } + } + FTS_INFO("[Mode]charger mode status: %d", g_fts_mode_flag.fts_charger_mode_flag); + return count; +} + +/************************************************************************ +* Name: fts_enter_charger_mode +* Brief: change charger mode +* Input: charger mode +* Output: no +* Return: success >=0, otherwise failed +***********************************************************************/ +int fts_enter_charger_mode(struct i2c_client *client, int mode) +{ + int ret = 0; + static u8 buf_addr[2] = { 0 }; + static u8 buf_value[2] = { 0 }; + buf_addr[0] = FTS_REG_CHARGER_MODE_EN; + + if (mode) + buf_value[0] = 0x01; + else + buf_value[0] = 0x00; + + ret = fts_i2c_write_reg(client, buf_addr[0], buf_value[0]); + if (ret < 0) { + FTS_DEBUG("[Mode]fts_enter_charger_mode write value fail"); + } + + return ret ; + +} + +/* read and write charger mode +* read example: cat fts_touch_charger_mode---read charger mode +* write example:echo 01 > fts_touch_charger_mode ---write charger mode to 01 +* +*/ +static DEVICE_ATTR (fts_charger_mode, S_IRUGO|S_IWUSR, fts_touch_charger_show, fts_touch_charger_store); + +#endif + +static struct attribute *fts_touch_mode_attrs[] = { +#if FTS_GLOVE_EN + &dev_attr_fts_glove_mode.attr, +#endif + +#if FTS_COVER_EN + &dev_attr_fts_cover_mode.attr, +#endif + +#if FTS_CHARGER_EN + &dev_attr_fts_charger_mode.attr, +#endif + + NULL, +}; + +static struct attribute_group fts_touch_mode_group = { + .attrs = fts_touch_mode_attrs, +}; + +int fts_ex_mode_init(struct i2c_client *client) +{ + int err = 0; + + g_fts_mode_flag.fts_glove_mode_flag = false; + g_fts_mode_flag.fts_cover_mode_flag = false; + g_fts_mode_flag.fts_charger_mode_flag = false; + + err = sysfs_create_group(&client->dev.kobj, &fts_touch_mode_group); + if (0 != err) { + FTS_ERROR("[Mode]create sysfs failed."); + sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group); + return -EIO; + } else { + FTS_DEBUG("[Mode]create sysfs succeeded"); + } + + return err; + +} + +int fts_ex_mode_exit(struct i2c_client *client) +{ + sysfs_remove_group(&client->dev.kobj, &fts_touch_mode_group); + return 0; +} + +int fts_ex_mode_recovery(struct i2c_client *client) +{ + int ret = 0; +#if FTS_GLOVE_EN + if (g_fts_mode_flag.fts_glove_mode_flag) + ret = fts_enter_glove_mode(client, true); +#endif + +#if FTS_COVER_EN + if (g_fts_mode_flag.fts_cover_mode_flag) + ret = fts_enter_cover_mode(client, true); +#endif + +#if FTS_CHARGER_EN + if (g_fts_mode_flag.fts_charger_mode_flag) + ret = fts_enter_charger_mode(client, true); +#endif + + return ret; +} + diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash.c b/drivers/input/touchscreen/FT8716/focaltech_flash.c new file mode 100755 index 0000000000000..f9055208b55f7 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash.c @@ -0,0 +1,723 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_flash.c +* +* Author: fupeipei +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#include "focaltech_flash.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ +struct ft_chip_t chip_types; +u8 fw_upgrade_status = FW_NO_UPGRADE; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +/* Upgrade FW/PRAMBOOT/LCD CFG */ +u8 CTPM_FW[] = { +#include FTS_UPGRADE_FW_APP_EBBG +}; + +u8 CTPM_FW1[] = { +#include FTS_UPGRADE_FW_APP_CSOT +}; + +#if (FTS_GET_VENDOR_ID_NUM >= 2) +u8 CTPM_FW2[] = { +#include FTS_UPGRADE_FW2_APP +}; +#endif + +#if (FTS_GET_VENDOR_ID_NUM >= 3) +u8 CTPM_FW3[] = { +#include FTS_UPGRADE_FW3_APP +}; +#endif + +u8 aucFW_PRAM_BOOT[] = { +#ifdef FTS_UPGRADE_PRAMBOOT +#include FTS_UPGRADE_PRAMBOOT +#endif +}; + +u8 CTPM_LCD_CFG[] = { +#ifdef FTS_UPGRADE_LCD_CFG +#include FTS_UPGRADE_LCD_CFG +#endif +}; + +struct fts_upgrade_fun fts_updatefun_curr; +struct workqueue_struct *touch_wq; +struct work_struct fw_update_work; +u8 *g_fw_file; +int g_fw_len; +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/************************************************************************ +* Name: fts_ctpm_upgrade_delay +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +void fts_ctpm_upgrade_delay(u32 i) +{ + do { + i--; + } while (i > 0); +} + +/************************************************************************ +* Name: fts_ctpm_i2c_hid2std +* Brief: HID to I2C +* Input: i2c info +* Output: no +* Return: fail =0 +***********************************************************************/ +int fts_ctpm_i2c_hid2std(struct i2c_client *client) +{ +#if (FTS_CHIP_IDC) + return 0; +#else + u8 buf[5] = {0}; + int bRet = 0; + + buf[0] = 0xeb; + buf[1] = 0xaa; + buf[2] = 0x09; + bRet = fts_i2c_write(client, buf, 3); + msleep(10); + buf[0] = buf[1] = buf[2] = 0; + fts_i2c_read(client, buf, 0, buf, 3); + + if ((0xeb == buf[0]) && (0xaa == buf[1]) && (0x08 == buf[2])) { + FTS_DEBUG("hidi2c change to stdi2c successful!!"); + bRet = 1; + } else { + FTS_ERROR("hidi2c change to stdi2c error!!"); + bRet = 0; + } + + return bRet; +#endif +} + +/************************************************************************ +* Name: fts_get_chip_types +* Brief: get correct chip information +* Input: +* Output: +* Return: +***********************************************************************/ +void fts_get_chip_types(void) +{ + struct ft_chip_t ctype[] = FTS_CHIP_TYPE_MAPPING; + int ic_type = 0; + + if (sizeof(ctype) != sizeof(struct ft_chip_t)) /* only one array */ + ic_type = IC_SERIALS - 1; + + chip_types = ctype[ic_type]; + + FTS_INFO("CHIP TYPE ID = 0x%02x%02x", chip_types.chip_idh, chip_types.chip_idl); +} + +/************************************************************************ +* Name: fts_ctpm_get_upgrade_array +* Brief: decide which ic +* Input: no +* Output: get ic info in fts_updateinfo_curr +* Return: no +***********************************************************************/ +void fts_ctpm_get_upgrade_array(void) +{ + + FTS_FUNC_ENTER(); + + fts_get_chip_types(); + + fts_ctpm_i2c_hid2std(fts_i2c_client); + + /* Get functin pointer */ + memcpy(&fts_updatefun_curr, &fts_updatefun, sizeof(struct fts_upgrade_fun)); + + FTS_FUNC_EXIT(); +} + +/************************************************************************ +* Name: fts_ctpm_rom_or_pram_reset +* Brief: RST CMD(07), reset to romboot(maybe->bootloader) +* Input: +* Output: +* Return: +***********************************************************************/ +void fts_ctpm_rom_or_pram_reset(struct i2c_client *client) +{ + u8 rst_cmd = FTS_REG_RESET_FW; + + FTS_INFO("[UPGRADE]******Reset to romboot/bootloader******"); + fts_i2c_write(client, &rst_cmd, 1); + /* The delay can't be changed */ + msleep(300); +} + +/************************************************************************ +* Name: fts_ctpm_auto_clb +* Brief: auto calibration +* Input: i2c info +* Output: no +* Return: 0 +***********************************************************************/ +int fts_ctpm_auto_clb(struct i2c_client *client) +{ +#if FTS_AUTO_CLB_EN + u8 uc_temp = 0x00; + u8 i = 0; + + /*start auto CLB */ + msleep(200); + + fts_i2c_write_reg(client, 0, FTS_REG_WORKMODE_FACTORY_VALUE); + /*make sure already enter factory mode */ + msleep(100); + /*write command to start calibration */ + fts_i2c_write_reg(client, 2, 0x4); + msleep(300); + if ((chip_types.chip_idh == 0x11) || (chip_types.chip_idh == 0x12) || (chip_types.chip_idh == 0x13) || (chip_types.chip_idh == 0x14)) { + for (i = 0; i < 100; i++) { + fts_i2c_read_reg(client, 0x02, &uc_temp); + if (0x02 == uc_temp || + 0xFF == uc_temp) { + break; + } + msleep(20); + } + } else { + for (i = 0; i < 100; i++) { + fts_i2c_read_reg(client, 0, &uc_temp); + if (0x0 == ((uc_temp&0x70)>>4)) { + break; + } + msleep(20); + } + } + fts_i2c_write_reg(client, 0, 0x40); + msleep(200); + fts_i2c_write_reg(client, 2, 0x5); + msleep(300); + fts_i2c_write_reg(client, 0, FTS_REG_WORKMODE_WORK_VALUE); + msleep(300); +#endif + + return 0; +} + +/************************************************************************ +* Name: fts_GetFirmwareSize +* Brief: get file size +* Input: file name +* Output: no +* Return: file size +***********************************************************************/ +int fts_GetFirmwareSize(char *firmware_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[FILE_NAME_LENGTH]; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTXXXX_INI_FILEPATH_CONFIG, firmware_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_ERROR("error occured while opening file %s", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +/************************************************************************ +* Name: fts_ReadFirmware +* Brief: read firmware buf for .bin file. +* Input: file name, data buf +* Output: data buf +* Return: 0 +***********************************************************************/ +int fts_ReadFirmware(char *firmware_name, u8 *firmware_buf) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[FILE_NAME_LENGTH]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTXXXX_INI_FILEPATH_CONFIG, firmware_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_ERROR("[UPGRADE] Error occured while opening file %s.\n", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, firmware_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +/************************************************************************ +* Name: fts_getsize +* Brief: Get different file's size +* Input: +* Output: +* Return: file's size +***********************************************************************/ +u32 fts_getsize(u8 fw_type) +{ + int fw_len = 0; + + if (fw_type == FW_SIZE) + fw_len = sizeof(CTPM_FW); + if (fw_type == FW1_SIZE) + fw_len = sizeof(CTPM_FW1); +#if (FTS_GET_VENDOR_ID_NUM >= 2) + else if (fw_type == FW2_SIZE) + fw_len = sizeof(CTPM_FW2); +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 3) + else if (fw_type == FW3_SIZE) + fw_len = sizeof(CTPM_FW3); +#endif +#if FTS_CHIP_IDC + else if (fw_type == PRAMBOOT_SIZE) + fw_len = sizeof(aucFW_PRAM_BOOT); +#endif +#if (FTS_CHIP_TYPE == _FT8006) + else if (fw_type == LCD_CFG_SIZE) + fw_len = sizeof(CTPM_LCD_CFG); +#endif + + return fw_len; +} + +/************************************************************************ +* Name: fts_ctpm_get_pram_or_rom_id +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +enum FW_STATUS fts_ctpm_get_pram_or_rom_id(struct i2c_client *client) +{ + u8 buf[4]; + u8 reg_val[2] = {0}; + enum FW_STATUS inRomBoot = FTS_RUN_IN_ERROR; + + fts_ctpm_i2c_hid2std(client); + + /*Enter upgrade mode*/ + /*send 0x55 in time windows*/ + buf[0] = FTS_UPGRADE_55; + buf[1] = FTS_UPGRADE_AA; + fts_i2c_write(client, buf, 2); + + msleep(20); + + buf[0] = 0x90; + buf[1] = buf[2] = buf[3] = 0x00; + fts_i2c_read(client, buf, 4, reg_val, 2); + + FTS_DEBUG("[UPGRADE] Read ROM/PRAM/Bootloader id:0x%02x%02x", reg_val[0], reg_val[1]); + if ((reg_val[0] == 0x00) || (reg_val[0] == 0xFF)) { + inRomBoot = FTS_RUN_IN_ERROR; + } else if (reg_val[0] == chip_types.pramboot_idh && reg_val[1] == chip_types.pramboot_idl) { + inRomBoot = FTS_RUN_IN_PRAM; + } else if (reg_val[0] == chip_types.rom_idh && reg_val[1] == chip_types.rom_idl) { + inRomBoot = FTS_RUN_IN_ROM; + } else if (reg_val[0] == chip_types.bootloader_idh && reg_val[1] == chip_types.bootloader_idl) { + inRomBoot = FTS_RUN_IN_BOOTLOADER; + } + + return inRomBoot; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_file +* Brief: get app file by Vendor ID +* Input: +* Output: +* Return: <0: vendor id not correct,not upgrade +***********************************************************************/ +int fts_ctpm_get_i_file(struct i2c_client *client, int fw_valid) +{ + int ret; + + if (fts_updatefun_curr.get_i_file) + ret = fts_updatefun_curr.get_i_file(client, fw_valid); + else + ret = -EIO; + + return ret; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_ver +* Brief: get app file version +* Input: +* Output: +* Return: fw version +***********************************************************************/ +int fts_ctpm_get_app_ver(void) +{ + int i_ret = 0; + + if (fts_updatefun_curr.get_app_i_file_ver) + i_ret = fts_updatefun_curr.get_app_i_file_ver(); + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade +* Brief: fw upgrade entry funciotn +* Input: +* Output: +* Return: 0 - upgrade successfully +* <0 - upgrade failed +***********************************************************************/ +int fts_ctpm_fw_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + if (fts_updatefun_curr.upgrade_with_app_i_file) + i_ret = fts_updatefun_curr.upgrade_with_app_i_file(client); + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade +* Brief: fw upgrade entry funciotn +* Input: +* Output: +* Return: 0 - upgrade successfully +* <0 - upgrade failed +***********************************************************************/ +int fts_ctpm_lcd_cfg_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + if (fts_updatefun_curr.upgrade_with_lcd_cfg_i_file) + i_ret = fts_updatefun_curr.upgrade_with_lcd_cfg_i_file(client); + + return i_ret; +} + +#if (!(FTS_UPGRADE_STRESS_TEST)) +/************************************************************************ +* Name: fts_ctpm_check_fw_status +* Brief: Check App is valid or not +* Input: +* Output: +* Return: -EIO - I2C communication error +* FTS_RUN_IN_APP - APP valid +* 0 - APP invalid +***********************************************************************/ +static int fts_ctpm_check_fw_status(struct i2c_client *client) +{ + u8 chip_id1 = 0; + u8 chip_id2 = 0; + int fw_status = FTS_RUN_IN_ERROR; + int i = 0; + int ret = 0; + int i2c_noack_retry = 0; + + for (i = 0; i < 5; i++) { + ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID, &chip_id1); + if (ret < 0) { + i2c_noack_retry++; + continue; + } + ret = fts_i2c_read_reg(client, FTS_REG_CHIP_ID2, &chip_id2); + if (ret < 0) { + i2c_noack_retry++; + continue; + } + + if (((chip_id1 == chip_types.chip_idh) || (chip_id1 == 87)) +#if FTS_CHIP_IDC + && ((chip_id2 == chip_types.chip_idl) || (chip_id2 == 16)) +#endif + ) { + fw_status = FTS_RUN_IN_APP; + break; + } + } + + FTS_DEBUG("[UPGRADE]: chip_id = %02x%02x, chip_types.chip_idh = %02x%02x", + chip_id1, chip_id2, chip_types.chip_idh, chip_types.chip_idl); + + /* I2C No ACK 5 times, then return -EIO */ + if (i2c_noack_retry >= 5) + return -EIO; + + /* I2C communication ok, but not get correct ID, need check pram/rom/bootloader */ + if (i >= 5) { + fw_status = fts_ctpm_get_pram_or_rom_id(client); + } + + return fw_status; +} + +/************************************************************************ +* Name: fts_ctpm_check_fw_ver +* Brief: Check vendor id is valid or not +* Input: +* Output: +* Return: 1 - vendor id valid +* 0 - vendor id invalid +***********************************************************************/ +static int fts_ctpm_check_fw_ver(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + u8 uc_host_fm_ver = 0; + + fts_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + uc_host_fm_ver = fts_ctpm_get_app_ver(); + + FTS_DEBUG("[UPGRADE]: uc_tp_fm_ver = 0x%x, uc_host_fm_ver = 0x%x!!", uc_tp_fm_ver, uc_host_fm_ver); + if (uc_tp_fm_ver < uc_host_fm_ver) { + return 1; + } else { + return 0; + } +} + +/************************************************************************ +* Name: fts_ctpm_check_need_upgrade +* Brief: +* Input: +* Output: +* Return: 1 - Need upgrade +* 0 - No upgrade +***********************************************************************/ +static int fts_ctpm_check_need_upgrade(struct i2c_client *client) +{ + int fw_status = 0; + int bUpgradeFlag = false; + + FTS_FUNC_ENTER(); + + /* 1. veriry FW APP is valid or not */ + fw_status = fts_ctpm_check_fw_status(client); + FTS_DEBUG("[UPGRADE]: fw_status = %d!!", fw_status); + if (fw_status < 0) { + /* I2C no ACK, return immediately */ + FTS_ERROR("[UPGRADE]******I2C NO ACK,exit upgrade******"); + return -EIO; + } else if (fw_status == FTS_RUN_IN_ERROR) { + FTS_ERROR("[UPGRADE]******IC Type Fail******"); + } else if (fw_status == FTS_RUN_IN_APP) { + FTS_INFO("[UPGRADE]**********FW APP valid**********"); + + if (fts_ctpm_get_i_file(client, 1) != 0) { + FTS_DEBUG("[UPGRADE]******Get upgrade file(fw) fail******"); + return -EIO; + } + + if (fts_ctpm_check_fw_ver(client) == 1) { + FTS_DEBUG("[UPGRADE]**********need upgrade fw**********"); + bUpgradeFlag = true; + } else { + FTS_DEBUG("[UPGRADE]**********Don't need upgrade fw**********"); + bUpgradeFlag = false; + } + } else { + /* if app is invalid, reset to run ROM */ + FTS_INFO("[UPGRADE]**********FW APP invalid**********"); + fts_ctpm_rom_or_pram_reset(client); + if (fts_ctpm_get_i_file(client, 0) != 0) { + FTS_DEBUG("[UPGRADE]******Get upgrade file(flash) fail******"); + fts_ctpm_rom_or_pram_reset(client); + return -EIO; + } + fts_ctpm_rom_or_pram_reset(client); + bUpgradeFlag = true; + } + + FTS_FUNC_EXIT(); + + return bUpgradeFlag; +} + +/************************************************************************ +* Name: fts_ctpm_auto_upgrade +* Brief: auto upgrade +* Input: +* Output: +* Return: 0 - no upgrade +***********************************************************************/ +int fts_ctpm_auto_upgrade(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + int i_ret = 0; + int bUpgradeFlag = false; + u8 uc_upgrade_times = 0; + + FTS_DEBUG("[UPGRADE]********************check upgrade need or not********************"); + bUpgradeFlag = fts_ctpm_check_need_upgrade(client); + FTS_DEBUG("[UPGRADE]**********bUpgradeFlag = 0x%x**********", bUpgradeFlag); + if (bUpgradeFlag <= 0) { + FTS_DEBUG("[UPGRADE]**********No Upgrade, exit**********"); + return 0; + } else { + /* FW Upgrade */ + fw_upgrade_status = FW_UPGRADING; + do { + uc_upgrade_times++; + FTS_DEBUG("[UPGRADE]********************star upgrade(%d)********************", uc_upgrade_times); + + i_ret = fts_ctpm_fw_upgrade(client); + if (i_ret == 0) { + /* upgrade success */ + fts_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + FTS_DEBUG("[UPGRADE]********************Success upgrade to new fw version 0x%x********************", uc_tp_fm_ver); + + fts_ctpm_auto_clb(client); + break; + } else { + /* upgrade fail, reset to run ROM BOOT.. + * if app in flash is ok, TP will work success + */ + FTS_ERROR("[UPGRADE]********************upgrade fail, reset now********************"); + fts_ctpm_rom_or_pram_reset(client); + } + } while (uc_upgrade_times < 2); /* if upgrade fail, upgrade again. then return */ + fw_upgrade_status = FW_UPGRADED; + } + + return i_ret; +} +#endif + +#if FTS_AUTO_UPGRADE_EN +static void fts_ctpm_update_work_func(struct work_struct *work) +{ + int i_ret = 0; + + FTS_DEBUG("[UPGRADE]******************************FTS enter upgrade******************************"); + fts_irq_disable(); + + /* esd check */ +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(DISABLE); +#endif + + i_ret = fts_ctpm_auto_upgrade(fts_i2c_client); + if (i_ret < 0) + FTS_ERROR("[UPGRADE]**********TP FW upgrade failed**********"); + +#if FTS_AUTO_UPGRADE_FOR_LCD_CFG_EN + msleep(2000); + + /* lcd_cfg upgrade */ + i_ret = fts_ctpm_lcd_cfg_upgrade(fts_i2c_client); + if (i_ret < 0) + FTS_ERROR("[UPGRADE]**********LCD cfg upgrade failed*********"); +#endif + +#if FTS_ESDCHECK_EN + fts_esdcheck_switch(ENABLE); +#endif + fts_irq_enable(); + + FTS_DEBUG("[UPGRADE]******************************FTS exit upgrade******************************"); +} + +/***************************************************************************** +* Name: fts_ctpm_upgrade_init +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_ctpm_upgrade_init(void) +{ + FTS_FUNC_ENTER(); + + touch_wq = create_singlethread_workqueue("touch_wq"); + if (touch_wq) { + INIT_WORK(&fw_update_work, fts_ctpm_update_work_func); + queue_work(touch_wq, &fw_update_work); + } else { + FTS_ERROR("[UPGRADE]create_singlethread_workqueue failed\n"); + } + + FTS_FUNC_EXIT(); +} + +/***************************************************************************** +* Name: fts_ctpm_upgrade_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_ctpm_upgrade_exit(void) +{ + FTS_FUNC_ENTER(); + destroy_workqueue(touch_wq); + FTS_FUNC_EXIT(); +} + +#endif /* #if FTS_AUTO_UPGRADE_EN */ diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash.h b/drivers/input/touchscreen/FT8716/focaltech_flash.h new file mode 100755 index 0000000000000..fe65ce4b7663e --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash.h @@ -0,0 +1,131 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_flash.h +* +* Author: fupeipei +* +* Created: 2016-08-07 +* +* Abstract: +* +************************************************************************/ +#ifndef __LINUX_FOCALTECH_FLASH_H__ +#define __LINUX_FOCALTECH_FLASH_H__ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_flash/focaltech_upgrade_common.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FTS_REG_ECC 0xCC +#define FTS_RST_CMD_REG2 0xBC +#define FTS_READ_ID_REG 0x90 +#define FTS_ERASE_APP_REG 0x61 +#define FTS_ERASE_PARAMS_CMD 0x63 +#define FTS_FW_WRITE_CMD 0xBF +#define FTS_REG_RESET_FW 0x07 +#define FTS_RST_CMD_REG1 0xFC +#define LEN_FLASH_ECC_MAX 0xFFFE + +#define FTS_PACKET_LENGTH 128 +#define FTS_SETTING_BUF_LEN 128 + +#define FTS_UPGRADE_LOOP 30 +#define AUTO_CLB_NEED 1 +#define AUTO_CLB_NONEED 0 +#define FTS_UPGRADE_AA 0xAA +#define FTS_UPGRADE_55 0x55 +#define FTXXXX_INI_FILEPATH_CONFIG "/sdcard/" + +enum FW_STATUS { + FTS_RUN_IN_ERROR, + FTS_RUN_IN_APP, + FTS_RUN_IN_ROM, + FTS_RUN_IN_PRAM, + FTS_RUN_IN_BOOTLOADER +}; + +enum FILE_SIZE_TYPE { + FW_SIZE, + FW1_SIZE, + FW2_SIZE, + FW3_SIZE, + PRAMBOOT_SIZE, + LCD_CFG_SIZE +}; + +/* pramboot for 8716 */ +#define FTS_PRAMBOOT_8716 "include/pramboot/FT8716_Pramboot_V0.5_20160723.i" +#define FTS_UPGRADE_PRAMBOOT FTS_PRAMBOOT_8716 + + +#define FTS_PRAMBOOT_E716 "include/pramboot/FT8716_Pramboot_V0.5_20160723.i" +#define FTS_UPGRADE_PRAMBOOT FTS_PRAMBOOT_8716 + + + + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* IC info */ + +struct fts_upgrade_fun { + int (*get_i_file)(struct i2c_client *, int); + int (*get_app_bin_file_ver)(char *); + int (*get_app_i_file_ver)(void); + int (*upgrade_with_app_i_file)(struct i2c_client *); + int (*upgrade_with_app_bin_file)(struct i2c_client *, char *); + int (*upgrade_with_lcd_cfg_i_file)(struct i2c_client *); + int (*upgrade_with_lcd_cfg_bin_file)(struct i2c_client *, char *); +}; +extern struct fts_upgrade_fun fts_updatefun; + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern u8 CTPM_FW[]; +extern u8 CTPM_FW1[]; +extern u8 CTPM_FW2[]; +extern u8 CTPM_FW3[]; +extern u8 aucFW_PRAM_BOOT[]; +extern u8 CTPM_LCD_CFG[]; +extern u8 *g_fw_file; +extern int g_fw_len; +extern struct fts_upgrade_fun fts_updatefun_curr; +extern struct ft_chip_t chip_types; + +#if FTS_AUTO_UPGRADE_EN +extern struct workqueue_struct *touch_wq; +extern struct work_struct fw_update_work; +#endif + +void fts_ctpm_upgrade_init(void); +void fts_ctpm_upgrade_exit(void); +void fts_ctpm_upgrade_delay(u32 i); +void fts_ctpm_get_upgrade_array(void); +int fts_ctpm_auto_upgrade(struct i2c_client *client); +int fts_fw_upgrade(struct device *dev, bool force); +int fts_ctpm_auto_clb(struct i2c_client *client); + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +u32 fts_getsize(u8 fw_type); +int fts_GetFirmwareSize(char *firmware_name); +int fts_ctpm_i2c_hid2std(struct i2c_client *client); +int fts_ReadFirmware(char *firmware_name, u8 *firmware_buf); +void fts_ctpm_rom_or_pram_reset(struct i2c_client *client); +enum FW_STATUS fts_ctpm_get_pram_or_rom_id(struct i2c_client *client); +#endif + + diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash/Makefile b/drivers/input/touchscreen/FT8716/focaltech_flash/Makefile new file mode 100755 index 0000000000000..af1e9ce00953f --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash/Makefile @@ -0,0 +1,10 @@ +# +# Makefile for the focaltech touchscreen drivers. +# + +# Each configuration option enables a list of files. + + +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_upgrade_idc.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_upgrade_ft8716.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_upgrade_test.o diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_common.h b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_common.h new file mode 100755 index 0000000000000..9d433fb072af4 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_common.h @@ -0,0 +1,57 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* +* File Name: focaltech_upgrade_common.h +* +* Author: fupeipei +* +* Created: 2016-08-16 +* +* Abstract: +* +************************************************************************/ +#ifndef __LINUX_FOCALTECH_UPGRADE_COMMON_H__ +#define __LINUX_FOCALTECH_UPGRADE_COMMON_H__ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_flash.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +int fts_ctpm_erase_flash(struct i2c_client *client); +int fts_ctpm_pramboot_ecc(struct i2c_client *client); +bool fts_ctpm_check_run_state(struct i2c_client *client, int state); +void fts_ctpm_start_pramboot(struct i2c_client *client); +int fts_ctpm_start_fw_upgrade(struct i2c_client *client); +bool fts_ctpm_check_in_pramboot(struct i2c_client *client); +int fts_ctpm_upgrade_idc_init(struct i2c_client *client); +int fts_ctpm_write_app_for_idc(struct i2c_client *client, u32 length, u8 *readbuf); +int fts_ctpm_upgrade_ecc(struct i2c_client *client, u32 startaddr, u32 length); +int fts_ctpm_write_pramboot_for_idc(struct i2c_client *client, u32 length, u8 *readbuf); +int fts_writeflash(struct i2c_client *client, u32 writeaddr, u32 length, u8 *readbuf, u32 cnt); +bool fts_check_app_bin_valid_idc(u8 *pbt_buf); + +int fts_ctpm_get_app_ver(void); +int fts_ctpm_fw_upgrade(struct i2c_client *client); +int fts_ctpm_lcd_cfg_upgrade(struct i2c_client *client); + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_ft8716.c b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_ft8716.c new file mode 100755 index 0000000000000..629a1398a24d7 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_ft8716.c @@ -0,0 +1,497 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_ft8716.c +* +* Author: fupeipei +* +* Created: 2016-08-15 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" + +#if ((FTS_CHIP_TYPE == _FT8716) || (FTS_CHIP_TYPE == _FTE716)) +#include "../focaltech_flash.h" +#include "focaltech_upgrade_common.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ +#define APP_FILE_MAX_SIZE (64 * 1024) +#define APP_FILE_MIN_SIZE (8) +#define APP_FILE_VER_MAPPING (0x10E) +#define APP_FILE_VENDORID_MAPPING (0x10C) +#define APP_FILE_CHIPID_MAPPING (0x11E) +#define CONFIG_START_ADDR (0x0000) +#define CONFIG_VENDOR_ID_OFFSET (0x04) +#define CONFIG_PROJECT_ID_OFFSET (0x20) +#define CONFIG_VENDOR_ID_ADDR (CONFIG_START_ADDR+CONFIG_VENDOR_ID_OFFSET) +#define CONFIG_PROJECT_ID_ADDR (CONFIG_START_ADDR+CONFIG_PROJECT_ID_OFFSET) +extern char Lcm_name[64]; + + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +static int fts_ctpm_get_i_file(struct i2c_client *client, int fw_valid); +static int fts_ctpm_get_app_i_file_ver(void); +static int fts_ctpm_get_app_bin_file_ver(char *firmware_name); +static int fts_ctpm_write_pram(struct i2c_client *client, u8 *pbt_buf, u32 dw_lenth); +static int fts_ctpm_fw_upgrade_with_app_i_file(struct i2c_client *client); +static int fts_ctpm_fw_upgrade_with_app_bin_file(struct i2c_client *client, char *firmware_name); + +struct fts_upgrade_fun fts_updatefun = { + .get_i_file = fts_ctpm_get_i_file, + .get_app_bin_file_ver = fts_ctpm_get_app_bin_file_ver, + .get_app_i_file_ver = fts_ctpm_get_app_i_file_ver, + .upgrade_with_app_i_file = fts_ctpm_fw_upgrade_with_app_i_file, + .upgrade_with_app_bin_file = fts_ctpm_fw_upgrade_with_app_bin_file, + .upgrade_with_lcd_cfg_i_file = NULL, + .upgrade_with_lcd_cfg_bin_file = NULL, +}; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if (FTS_GET_VENDOR_ID_NUM != 0) +/************************************************************************ +* Name: fts_ctpm_get_vendor_id_flash +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +static int fts_ctpm_get_vendor_id_flash(struct i2c_client *client, u8 *vendor_id) +{ + u8 rw_buf[10]; + int i_ret; + int fw_len; + bool inpram = false; + + FTS_FUNC_ENTER(); + + /*write pramboot*/ + fw_len = fts_getsize(PRAMBOOT_SIZE); + FTS_DEBUG("[UPGRADE]: pramboot size : %d!!", fw_len); + i_ret = fts_ctpm_write_pram(client, aucFW_PRAM_BOOT, fw_len); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE]: write pram failed!!"); + return -EIO; + } + + /*check run in pramboot or not! if not rum in pramboot, can not upgrade*/ + inpram = fts_ctpm_check_run_state(client, FTS_RUN_IN_PRAM); + if (!inpram) { + FTS_ERROR("[UPGRADE]: not run in pram, upgrade fail!!"); + return -EIO; + } + + /*read vendor id*/ + rw_buf[0] = 0x03; + rw_buf[1] = 0x00; + rw_buf[2] = (u8)(CONFIG_VENDOR_ID_ADDR >> 8); + rw_buf[3] = (u8)(CONFIG_VENDOR_ID_ADDR); + i_ret = fts_i2c_write(client, rw_buf, 4); + msleep(10); /* must wait, otherwise read vendor id wrong */ + i_ret = fts_i2c_read(client, NULL, 0, vendor_id, 1); + if (i_ret < 0) { + return -EIO; + } + FTS_DEBUG("Vendor ID from Flash:%x", *vendor_id); + return 0; +} +#endif + +/************************************************************************ +* Name: fts_ctpm_get_i_file +* Brief: get .i file +* Input: +* Output: +* Return: 0 - ok +* <0 - fail +***********************************************************************/ +static int fts_ctpm_get_i_file(struct i2c_client *client, int fw_valid) +{ + int ret = 0; + +#if (FTS_GET_VENDOR_ID_NUM != 0) + u8 vendor_id = 0; + + if (fw_valid) { + ret = fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &vendor_id); + } else { + ret = fts_i2c_read_reg(client, FTS_REG_VENDOR_ID, &vendor_id); + if ((ret < 0) || (vendor_id == 0xEF) || (vendor_id == 0xED)) { + /* 8736 can't read vendor id from A8 command */ + ret = fts_ctpm_get_vendor_id_flash(client, &vendor_id); + } + } + if (ret < 0) { + FTS_ERROR("Get upgrade file fail because of Vendor ID wrong"); + return ret; + } + FTS_INFO("[UPGRADE] vendor id in tp=%x", vendor_id); + FTS_INFO("[UPGRADE] vendor id in driver:%x, FTS_VENDOR_ID:%02x %02x %02x", + vendor_id, FTS_VENDOR_1_ID, FTS_VENDOR_2_ID, FTS_VENDOR_3_ID); + + ret = 0; + switch (vendor_id) { +#if (FTS_GET_VENDOR_ID_NUM >= 1) + case FTS_VENDOR_1_ID: + g_fw_file = CTPM_FW; + g_fw_len = fts_getsize(FW_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:CTPM_FW, SIZE:%x", g_fw_len); + break; +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 2) + case FTS_VENDOR_2_ID: + g_fw_file = CTPM_FW2; + g_fw_len = fts_getsize(FW2_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:CTPM_FW2, SIZE:%x", g_fw_len); + break; +#endif +#if (FTS_GET_VENDOR_ID_NUM >= 3) + case FTS_VENDOR_3_ID: + g_fw_file = CTPM_FW3; + g_fw_len = fts_getsize(FW3_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:CTPM_FW3, SIZE:%x", g_fw_len); + break; +#endif + default: + FTS_ERROR("[UPGRADE]Vendor ID check fail, get fw file fail"); + ret = -EIO; + break; + } +#else + /* (FTS_GET_VENDOR_ID_NUM == 0) */ + if (strstr(Lcm_name, "ebbg")) { + g_fw_file = CTPM_FW; + g_fw_len = fts_getsize(FW_SIZE); + } else if (strstr(Lcm_name, "csot")) { + g_fw_file = CTPM_FW1; + g_fw_len = fts_getsize(FW1_SIZE); + } + FTS_DEBUG("[UPGRADE]FW FILE:CTPM_FW, SIZE:%x", g_fw_len); +#endif + if (!g_fw_len) + return -EIO; + + return ret; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_bin_file_ver +* Brief: get .i file version +* Input: no +* Output: no +* Return: fw version +***********************************************************************/ +static int fts_ctpm_get_app_bin_file_ver(char *firmware_name) +{ + u8 *pbt_buf = NULL; + int fwsize = 0; + int fw_ver = 0; + + FTS_FUNC_ENTER(); + + fwsize = fts_GetFirmwareSize(firmware_name); + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fwsize); + return -EIO; + } + + pbt_buf = (unsigned char *)kmalloc(fwsize + 1, GFP_KERNEL); + if (fts_ReadFirmware(firmware_name, pbt_buf)) { + FTS_ERROR("[UPGRADE]: request_firmware failed!!"); + kfree(pbt_buf); + return -EIO; + } + + fw_ver = pbt_buf[APP_FILE_VER_MAPPING]; + + kfree(pbt_buf); + FTS_FUNC_EXIT(); + + return fw_ver; +} + +/************************************************************************ +* Name: fts_ctpm_get_app_i_file_ver +* Brief: get .i file version +* Input: no +* Output: no +* Return: fw version +***********************************************************************/ +static int fts_ctpm_get_app_i_file_ver(void) +{ + int fwsize = g_fw_len; + + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fwsize); + return 0; + } + + return g_fw_file[APP_FILE_VER_MAPPING]; +} + +/************************************************************************ +* Name: fts_ctpm_write_pram +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +static int fts_ctpm_write_pram(struct i2c_client *client, u8 *pbt_buf, u32 dw_lenth) +{ + int i_ret; + bool inrom = false; + + FTS_FUNC_ENTER(); + + /*check the length of the pramboot*/ + if (dw_lenth > APP_FILE_MAX_SIZE || dw_lenth < APP_FILE_MIN_SIZE) { + FTS_ERROR("[UPGRADE] pramboot length(%d) fail", dw_lenth); + return -EIO; + } + + /*send comond to FW, reset and start write pramboot*/ + i_ret = fts_ctpm_start_fw_upgrade(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: send upgrade cmd to FW error!!"); + return i_ret; + } + + /*check run in rom or not! if run in rom, will write pramboot*/ + inrom = fts_ctpm_check_run_state(client, FTS_RUN_IN_ROM); + if (!inrom) { + FTS_ERROR("[UPGRADE]: not run in rom, write pramboot fail!!"); + return -EIO; + } + + /*write pramboot to pram*/ + i_ret = fts_ctpm_write_pramboot_for_idc(client, dw_lenth, aucFW_PRAM_BOOT); + if (i_ret < 0) { + return i_ret; + FTS_ERROR("[UPGRADE]: write pramboot fail!!"); + } + + /*read out checksum*/ + i_ret = fts_ctpm_pramboot_ecc(client); + if (i_ret < 0) { + return i_ret; + FTS_ERROR("[UPGRADE]: write pramboot ecc error!!"); + } + + /*start pram*/ + fts_ctpm_start_pramboot(client); + + FTS_FUNC_EXIT(); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_write_app +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +***********************************************************************/ +static int fts_ctpm_write_app(struct i2c_client *client, u8 *pbt_buf, u32 dw_lenth) +{ + u32 temp; + int i_ret; + bool inpram = false; + + FTS_FUNC_ENTER(); + + /*check run in pramboot or not! if not rum in pramboot, can not upgrade*/ + inpram = fts_ctpm_check_run_state(client, FTS_RUN_IN_PRAM); + if (!inpram) { + FTS_ERROR("[UPGRADE]: not run in pram, upgrade fail!!"); + return -EIO; + } + + /*upgrade init*/ + i_ret = fts_ctpm_upgrade_idc_init(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: upgrade init error, upgrade fail!!"); + return i_ret; + } + + /*erase the app erea in flash*/ + i_ret = fts_ctpm_erase_flash(client); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: erase flash error!!"); + return i_ret; + } + + /*start to write app*/ + i_ret = fts_ctpm_write_app_for_idc(client, dw_lenth, pbt_buf); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: write app error!!"); + return i_ret; + } + + /*read check sum*/ + temp = 0x1000; + i_ret = fts_ctpm_upgrade_ecc(client, temp, dw_lenth); + if (i_ret < 0) { + FTS_ERROR("[UPGRADE]: ecc error!!"); + return i_ret; + } + + /*upgrade success, reset the FW*/ + fts_ctpm_rom_or_pram_reset(client); + + FTS_FUNC_EXIT(); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_use_buf +* Brief: fw upgrade +* Input: i2c info, file buf, file len +* Output: no +* Return: fail <0 +* success =0 +***********************************************************************/ +static int fts_ctpm_fw_upgrade_use_buf(struct i2c_client *client, u8 *pbt_buf, u32 fwsize) +{ + int i_ret = 0; + int fw_len; + + FTS_FUNC_ENTER(); + + /*write pramboot*/ + fw_len = fts_getsize(PRAMBOOT_SIZE); + FTS_DEBUG("[UPGRADE]: pramboot size : %d!!", fw_len); + i_ret = fts_ctpm_write_pram(client, aucFW_PRAM_BOOT, fw_len); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE]: write pram failed!!"); + return -EIO; + } + + /*write app*/ + i_ret = fts_ctpm_write_app(client, pbt_buf, fwsize); + + FTS_FUNC_EXIT(); + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_with_app_i_file +* Brief: upgrade with *.i file +* Input: i2c info +* Output: +* Return: fail < 0 +***********************************************************************/ +static int fts_ctpm_fw_upgrade_with_app_i_file(struct i2c_client *client) +{ + int i_ret = 0; + u32 fw_len; + u8 *fw_buf; + + FTS_INFO("[UPGRADE]**********start upgrade with app.i**********"); + + fw_len = g_fw_len; + fw_buf = g_fw_file; + if (fw_len < APP_FILE_MIN_SIZE || fw_len > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: FW length(%x) error", fw_len); + return -EIO; + } + + i_ret = fts_ctpm_fw_upgrade_use_buf(client, fw_buf, fw_len); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE] upgrade app.i failed"); + } else { + FTS_INFO("[UPGRADE]: upgrade app.i succeed"); + } + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_fw_upgrade_with_app_bin_file +* Brief: upgrade with *.bin file +* Input: i2c info, file name +* Output: no +* Return: success =0 +***********************************************************************/ +static int fts_ctpm_fw_upgrade_with_app_bin_file(struct i2c_client *client, char *firmware_name) +{ + u8 *pbt_buf = NULL; + int i_ret = 0; + bool ecc_ok = false; + int fwsize = 0; + + FTS_INFO("[UPGRADE]**********start upgrade with app.bin**********"); + + fwsize = fts_GetFirmwareSize(firmware_name); + if (fwsize < APP_FILE_MIN_SIZE || fwsize > APP_FILE_MAX_SIZE) { + FTS_ERROR("[UPGRADE]: app.bin length(%x) error, upgrade fail", fwsize); + return -EIO; + } + + pbt_buf = (unsigned char *)kmalloc(fwsize + 1, GFP_KERNEL); + if (NULL == pbt_buf) { + FTS_ERROR(" malloc pbt_buf failed "); + goto ERROR_BIN; + } + + if (fts_ReadFirmware(firmware_name, pbt_buf)) { + FTS_ERROR("[UPGRADE]: request_firmware failed!!"); + goto ERROR_BIN; + } + + /*check the app.bin invalid or not*/ + ecc_ok = fts_check_app_bin_valid_idc(pbt_buf); + + if (ecc_ok) { + FTS_INFO("[UPGRADE] app.bin ecc ok"); + i_ret = fts_ctpm_fw_upgrade_use_buf(client, pbt_buf, fwsize); + if (i_ret != 0) { + FTS_ERROR("[UPGRADE]: upgrade app.bin failed"); + goto ERROR_BIN; + } else { + FTS_INFO("[UPGRADE]: upgrade app.bin succeed"); + } + } else { + FTS_ERROR("[UPGRADE] app.bin ecc failed"); + goto ERROR_BIN; + } + + kfree(pbt_buf); + return i_ret; +ERROR_BIN: + kfree(pbt_buf); + return -EIO; +} +#endif /* #if (FTS_CHIP_TYPE == _FT8716) */ diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_idc.c b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_idc.c new file mode 100755 index 0000000000000..606abe2c9b0f8 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_idc.c @@ -0,0 +1,575 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_idc.c +* +* Author: fupeipei +* +* Created: 2016-08-22 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" + +#if (FTS_CHIP_IDC == 1) +#include "../focaltech_flash.h" + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +u8 upgrade_ecc; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/************************************************************************ +* Name: fts_ctpm_upgrade_idc_init +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_upgrade_idc_init(struct i2c_client *client) +{ + int i_ret = 0; + u8 reg_val_id[4] = {0}; + u8 auc_i2c_write_buf[10]; + + FTS_INFO("[UPGRADE]**********Upgrade setting Init**********"); + + /*read flash ID*/ + auc_i2c_write_buf[0] = 0x05; + reg_val_id[0] = 0x00; + i_ret = fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val_id, 1); + if (i_ret < 0) { + return -EIO; + } + + /*set flash clk*/ + auc_i2c_write_buf[0] = 0x05; + auc_i2c_write_buf[1] = reg_val_id[0]; + auc_i2c_write_buf[2] = 0x00; + fts_i2c_write(client, auc_i2c_write_buf, 3); + + /*send upgrade type to reg 0x09: 0x0B: upgrade; 0x0A: download*/ + auc_i2c_write_buf[0] = 0x09; + auc_i2c_write_buf[1] = 0x0B; + fts_i2c_write(client, auc_i2c_write_buf, 2); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_start_pramboot +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +void fts_ctpm_start_pramboot(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[10]; + + FTS_INFO("[UPGRADE]**********start pramboot**********"); + auc_i2c_write_buf[0] = 0x08; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(20); +} + +/************************************************************************ +* Name: fts_ctpm_start_fw_upgrade +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_start_fw_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + + /*send the soft upgrade commond to FW, and start upgrade*/ + FTS_INFO("[UPGRADE]**********send 0xAA and 0x55 to FW, start upgrade**********"); + + i_ret = fts_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_AA); + msleep(10); + i_ret = fts_i2c_write_reg(client, FTS_RST_CMD_REG1, FTS_UPGRADE_55); + msleep(200); + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_check_run_state +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +bool fts_ctpm_check_run_state(struct i2c_client *client, int rstate) +{ + int i = 0; + enum FW_STATUS cstate = FTS_RUN_IN_ERROR; + + for (i = 0; i < FTS_UPGRADE_LOOP; i++) { + cstate = fts_ctpm_get_pram_or_rom_id(client); + FTS_DEBUG("[UPGRADE]: run state = %d", cstate); + + if (cstate == rstate) + return true; + msleep(20); + } + + return false; +} + +/************************************************************************ +* Name: fts_ctpm_pramboot_ecc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_pramboot_ecc(struct i2c_client *client) +{ + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_FUNC_ENTER(); + + /*read out checksum, if pramboot checksum != host checksum, upgrade fail*/ + FTS_INFO("[UPGRADE]******read out pramboot checksum******"); + auc_i2c_write_buf[0] = 0xcc; + msleep(2); + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != upgrade_ecc) { /*pramboot checksum != host checksum, upgrade fail*/ + FTS_ERROR("[UPGRADE]: checksum fail : pramboot_ecc = %X, host_ecc = %X!!", reg_val[0], upgrade_ecc); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: checksum success : pramboot_ecc = %X, host_ecc = %X!!", reg_val[0], upgrade_ecc); + msleep(100); + + FTS_FUNC_EXIT(); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_upgrade_ecc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_upgrade_ecc(struct i2c_client *client, u32 startaddr, u32 length) +{ + u32 i = 0; + u8 auc_i2c_write_buf[10]; + u32 temp; + u8 reg_val[4] = {0}; + int i_ret = 0; + + FTS_INFO("[UPGRADE]**********read out checksum**********"); + + /*check sum init*/ + auc_i2c_write_buf[0] = 0x64; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(300); + + /*send commond to pramboot to start checksum*/ + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(startaddr >> 16); + auc_i2c_write_buf[2] = (u8)(startaddr >> 8); + auc_i2c_write_buf[3] = (u8)(startaddr); + + if (length > LEN_FLASH_ECC_MAX) { + temp = LEN_FLASH_ECC_MAX; + } else { + temp = length; + } + + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 6); + msleep(length/256); + + /*read status : if check sum is finished?*/ + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + break; + } + msleep(1); + + } + + if (length > LEN_FLASH_ECC_MAX) { + temp = LEN_FLASH_ECC_MAX; + auc_i2c_write_buf[0] = 0x65; + auc_i2c_write_buf[1] = (u8)(temp >> 16); + auc_i2c_write_buf[2] = (u8)(temp >> 8); + auc_i2c_write_buf[3] = (u8)(temp); + temp = length-LEN_FLASH_ECC_MAX; + auc_i2c_write_buf[4] = (u8)(temp >> 8); + auc_i2c_write_buf[5] = (u8)(temp); + i_ret = fts_i2c_write(client, auc_i2c_write_buf, 6); + + msleep(length/256); + + for (i = 0; i < 100; i++) { + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0x55 == reg_val[1]) { + break; + } + msleep(1); + } + } + + /*read out check sum*/ + auc_i2c_write_buf[0] = 0x66; + i_ret = fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 1); + if (reg_val[0] != upgrade_ecc) /*if check sum fail, upgrade fail*/ { + FTS_ERROR("[UPGRADE]: ecc error! FW=%02x upgrade_ecc=%02x!!", reg_val[0], upgrade_ecc); + return -EIO; + } + + FTS_DEBUG("[UPGRADE]: ecc success : FW=%02x upgrade_ecc=%02x!!", reg_val[0], upgrade_ecc); + + upgrade_ecc = 0; + + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_erase_flash +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_erase_flash(struct i2c_client *client) +{ + u32 i = 0; + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_INFO("[UPGRADE]**********erase app now**********"); + + /*send to erase flash*/ + auc_i2c_write_buf[0] = 0x61; + fts_i2c_write(client, auc_i2c_write_buf, 1); + msleep(1350); + + for (i = 0; i < 15; i++) { + /*get the erase app status, if get 0xF0AA£¬erase flash success*/ + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if (0xF0 == reg_val[0] && 0xAA == reg_val[1]) /*erase flash success*/ { + break; + } + msleep(50); + } + + if ((0xF0 != reg_val[0] || 0xAA != reg_val[1]) && (i >= 15)) /*erase flash fail*/ { + FTS_ERROR("[UPGRADE]: erase app error.reset tp and reload FW!!"); + return -EIO; + } + FTS_DEBUG("[UPGRADE]: erase app ok!!"); + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_write_pramboot_for_idc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_write_pramboot_for_idc(struct i2c_client *client, u32 length, u8 *readbuf) +{ + u32 i = 0; + u32 j; + u32 temp; + u32 packet_number; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + + upgrade_ecc = 0; + FTS_INFO("[UPGRADE]**********write pramboot to pram**********"); + + temp = 0; + packet_number = (length) / FTS_PACKET_LENGTH; + if ((length) % FTS_PACKET_LENGTH > 0) { + packet_number++; + } + packet_buf[0] = 0xae; + packet_buf[1] = 0x00; + + for (j = 0; j < packet_number; j++) { + temp = j * FTS_PACKET_LENGTH; + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + if (j < (packet_number-1)) { + temp = FTS_PACKET_LENGTH; + } else { + temp = (length) % FTS_PACKET_LENGTH; + } + packet_buf[4] = (u8) (temp >> 8); + packet_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + packet_buf[6 + i] = readbuf[j * FTS_PACKET_LENGTH + i]; + upgrade_ecc ^= packet_buf[6 + i]; + } + fts_i2c_write(client, packet_buf, temp + 6); + } + + return 0; +} + +/************************************************************************ +* Name: fts_ctpm_write_app_for_idc +* Brief: +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_ctpm_write_app_for_idc(struct i2c_client *client, u32 length, u8 *readbuf) +{ + u32 j; + u32 i = 0; + u32 packet_number; + u32 temp; + u32 writelenght; + u8 packet_buf[FTS_PACKET_LENGTH + 6]; + u8 auc_i2c_write_buf[10]; + u8 reg_val[4] = {0}; + + FTS_INFO("[UPGRADE]**********write app to flash**********"); + + upgrade_ecc = 0; + + packet_number = (length) / FTS_PACKET_LENGTH; + if (((length) % FTS_PACKET_LENGTH) > 0) { + packet_number++; + } + + packet_buf[0] = 0xbf; + + for (j = 0; j < packet_number; j++) { + temp = 0x1000+j * FTS_PACKET_LENGTH; + + if (j < (packet_number-1)) { + writelenght = FTS_PACKET_LENGTH; + } else { + writelenght = ((length) % FTS_PACKET_LENGTH); + } + packet_buf[1] = (u8) (temp >> 16); + packet_buf[2] = (u8) (temp >> 8); + packet_buf[3] = (u8) temp; + packet_buf[4] = (u8) (writelenght >> 8); + packet_buf[5] = (u8) writelenght; + + for (i = 0; i < writelenght; i++) { + packet_buf[6 + i] = readbuf[(temp - 0x1000+i)]; + upgrade_ecc ^= packet_buf[6 + i]; + } + + fts_i2c_write(client, packet_buf, (writelenght + 6)); + + for (i = 0; i < 30; i++) { + /*read status and check if the app writting is finished*/ + auc_i2c_write_buf[0] = 0x6a; + reg_val[0] = reg_val[1] = 0x00; + fts_i2c_read(client, auc_i2c_write_buf, 1, reg_val, 2); + + if ((j + 0x20+0x1000) == (((reg_val[0]) << 8) | reg_val[1])) { + break; + } + + fts_ctpm_upgrade_delay(1000); + } + } + msleep(50); + + return 0; +} + + +typedef enum { + APP_LEN = 0x00, + APP_LEN_NE = 0x02, + APP_P1_ECC = 0x04, + APP_P1_ECC_NE = 0x06, + APP_P2_ECC = 0x08, + APP_P2_ECC_NE = 0x0A, + APP_LEN_H = 0x12, + APP_LEN_H_NE = 0x14, + APP_BLR_ID = 0x1C, + APP_BLR_ID_NE = 0x1D, + PBOOT_ID_H = 0x1E, + PBOOT_ID_L = 0x1F +} ENUM_APP_INFO; + +#define AL2_FCS_COEF ((1 << 15) + (1 << 10) + (1 << 3)) + +#if ((FTS_CHIP_TYPE == _FT8006) || (FTS_CHIP_TYPE == _FT8736)) +#define FW_CFG_TOTAL_SIZE 0x80 +#else +#define FW_CFG_TOTAL_SIZE 0x00 +#endif +#define APP1_START 0x00 +#define APP1_LEN 0x100 +#define APP_VERIF_ADDR (APP1_START + APP1_LEN) +#define APP_VERIF_LEN 0x20 +#define APP1_ECC_ADDR (APP_VERIF_ADDR + APP_P1_ECC) +#define APP2_START (APP_VERIF_ADDR + APP_VERIF_LEN + FW_CFG_TOTAL_SIZE) +#define APP2_ECC_ADDR (APP_VERIF_ADDR + APP_P2_ECC) +/***************************************************************************** +* Name: DrvReadPram16 +* Brief: Get Word +* Input: +* Output: +* Return: +*****************************************************************************/ +static u16 data_word(u8 *pbt_buf, u32 addr) +{ + return (((u16)pbt_buf[addr]<<8) + pbt_buf[addr+1]); +} + +/****************************************************************************** +* Name: GetCrc16 +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +u16 crc_calc(u8 *pbt_buf, u32 addr, u16 length) +{ + u16 cFcs = 0; + u16 i, j; + + FTS_DEBUG("[UPGRADE][ECC] : %04x data:%04x, len:%04x!!", (addr), data_word(pbt_buf, (addr)), length); + for (i = 0; i < length; i++) { + cFcs ^= data_word(pbt_buf, (addr+i*2)); + for (j = 0; j < 16; j++) { + if (cFcs & 1) { + cFcs = (u16)((cFcs >> 1) ^ AL2_FCS_COEF); + } else { + cFcs >>= 1; + } + } + } + return cFcs; +} + +/***************************************************************************** +* Name: task_check_mem +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +bool ecc_check(u8 *pbt_buf, u32 star_addr, u32 len, u16 ecc_addr) +{ + u16 ecc1; + u16 ecc2; + u16 cal_ecc; + + ecc1 = data_word(pbt_buf, ecc_addr); + ecc2 = data_word(pbt_buf, ecc_addr+2); + + if ((ecc1 + ecc2) != 0xFFFF) { + return false; + } + + cal_ecc = crc_calc(pbt_buf, star_addr, (len/2)); + + FTS_DEBUG("[UPGRADE][ECC] : ecc1 = %x, cal_ecc = %x", ecc1, cal_ecc); + if (ecc1 != cal_ecc) { + FTS_DEBUG("[UPGRADE][ECC] : ecc error!!"); + return false; + } + return true; +} + +/***************************************************************************** +* Name: fts_check_app_bin_valid_idc +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +bool fts_check_app_bin_valid_idc(u8 *pbt_buf) +{ + u32 len; +#if (FTS_CHIP_TYPE != _FT8006) + /* 1. First Byte */ + if (pbt_buf[0] != 0x02) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- the first byte(%x) error", pbt_buf[0]); + return false; + } +#endif + /* 2 PART1 ECC */ + if (!ecc_check(pbt_buf, APP1_START, APP1_LEN, APP1_ECC_ADDR)) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- ecc1 error"); + return false; + } + + /* 3. PART2 ECC */ + if ((data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN) + data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_NE)) != 0xFFFF) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- Length XOR error"); + return false; + } + len = data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN); +#if (FTS_CHIP_TYPE == _FT8006) + if ((data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) + data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H_NE)) != 0xFFFF) { + FTS_DEBUG("[UPGRADE]APP.BIN Verify- Length2 XOR error"); + return false; + } + len += ((u32)data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) << 16); +#endif + FTS_DEBUG("%x %x %x %x", APP2_START, len, ((u32)data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN_H) << 16), data_word(pbt_buf, APP_VERIF_ADDR+APP_LEN)); + len -= APP2_START; + + return ecc_check(pbt_buf, APP2_START, len, APP2_ECC_ADDR); +} + + +#endif /* IDC */ diff --git a/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_test.c b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_test.c new file mode 100755 index 0000000000000..2535d02aa16f7 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_flash/focaltech_upgrade_test.c @@ -0,0 +1,167 @@ +/* + * + * FocalTech fts TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_upgrade_test.c +* +* Author: fupeipei +* +* Created: 2016-08-22 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "../focaltech_core.h" +#include "../focaltech_flash.h" +#include +#include + +/***************************************************************************** +* Static variables +*****************************************************************************/ +#define FTS_GET_UPGRADE_TIME 0 + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +struct wake_lock ps_lock; + +#define FTS_DEBUG_UPGRADE(fmt, args...) do {\ + printk(KERN_ERR "[FTS][UPGRADE]:##############################################################################\n");\ + printk(KERN_ERR "[FTS][UPGRADE]: "fmt"\n", ##args);\ + printk(KERN_ERR "[FTS][UPGRADE]:##############################################################################\n");\ + } while (0)\ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +#if (FTS_UPGRADE_STRESS_TEST) +/************************************************************************ +* Name: fts_ctpm_auto_upgrade_pingpong +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +static int fts_ctpm_auto_upgrade_pingpong(struct i2c_client *client) +{ + u8 uc_tp_fm_ver; + int i_ret = 0; + u8 uc_upgrade_times = 0; + + FTS_FUNC_ENTER(); + + /* pingpong test mode, need upgrade */ + FTS_INFO("[UPGRADE]: pingpong test mode, need upgrade!!"); + do { + uc_upgrade_times++; + + /* fw upgrade */ + i_ret = fts_ctpm_fw_upgrade(client); + + if (i_ret == 0) /* upgrade success */ { + fts_i2c_read_reg(client, FTS_REG_FW_VER, &uc_tp_fm_ver); + FTS_DEBUG("[UPGRADE]: upgrade to new version 0x%x", uc_tp_fm_ver); + } else /* upgrade fail */ { + /* if upgrade fail, reset to run ROM. if app in flash is ok. TP will work success */ + FTS_INFO("[UPGRADE]: upgrade fail, reset now!!"); + fts_ctpm_rom_or_pram_reset(client); + } + } while ((i_ret != 0) && (uc_upgrade_times < 2)); /* if upgrade fail, upgrade again. then return */ + + FTS_FUNC_EXIT(); + return i_ret; +} + +/************************************************************************ +* Name: fts_ctpm_auto_upgrade +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +void fts_ctpm_display_upgrade_time(bool start_time) +{ +#if FTS_GET_UPGRADE_TIME + static struct timeval tpend; + static struct timeval tpstart; + static int timeuse; + + if (start_time) { + do_gettimeofday(&tpstart); + } else { + do_gettimeofday(&tpend); + timeuse = 1000000 * (tpend.tv_sec-tpstart.tv_sec) + tpend.tv_usec-tpstart.tv_usec; + timeuse /= 1000000; + FTS_DEBUG("[UPGRADE]: upgrade success : Use time: %d Seconds!!", timeuse); + } +#endif +} + +/************************************************************************ +* Name: fts_ctpm_auto_upgrade +* Brief: 0 +* Input: 0 +* Output: 0 +* Return: 0 +***********************************************************************/ +int fts_ctpm_auto_upgrade(struct i2c_client *client) +{ + int i_ret = 0; + static int uc_ErrorTimes + static int uc_UpgradeTimes + + wake_lock_init(&ps_lock, WAKE_LOCK_SUSPEND, "tp_wakelock"); + + wake_lock(&ps_lock); + + /* (FTS_GET_VENDOR_ID_NUM == 0) */ + g_fw_file = CTPM_FW; + g_fw_len = fts_getsize(FW_SIZE); + FTS_DEBUG("[UPGRADE]FW FILE:CTPM_FW, SIZE:%x", g_fw_len); + + do { + uc_UpgradeTimes++; + + FTS_DEBUG_UPGRADE("start to upgrade %d times !!", uc_UpgradeTimes); + + fts_ctpm_display_upgrade_time(true); + + i_ret = fts_ctpm_auto_upgrade_pingpong(client); + if (i_ret == 0) { + fts_ctpm_display_upgrade_time(false); + } else { + uc_ErrorTimes++; + } + + FTS_DEBUG_UPGRADE("upgrade %d times, error %d times!!", uc_UpgradeTimes, uc_ErrorTimes); + } while (uc_UpgradeTimes < (FTS_UPGRADE_TEST_NUMBER)); + + wake_unlock(&ps_lock); + + return 0; +} +#endif + diff --git a/drivers/input/touchscreen/FT8716/focaltech_gesture.c b/drivers/input/touchscreen/FT8716/focaltech_gesture.c new file mode 100755 index 0000000000000..b0a6df7e68cdd --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_gesture.c @@ -0,0 +1,683 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, Focaltech Ltd. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_gestrue.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-08 +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ +#include "focaltech_core.h" +#if FTS_GESTURE_EN +/****************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define KEY_GESTURE_U KEY_U +#define KEY_GESTURE_UP KEY_UP +#define KEY_GESTURE_DOWN KEY_DOWN +#define KEY_GESTURE_LEFT KEY_LEFT +#define KEY_GESTURE_RIGHT KEY_RIGHT +#define KEY_GESTURE_O KEY_O +#define KEY_GESTURE_E KEY_E +#define KEY_GESTURE_M KEY_M +#define KEY_GESTURE_L KEY_L +#define KEY_GESTURE_W KEY_W +#define KEY_GESTURE_S KEY_S +#define KEY_GESTURE_V KEY_V +#define KEY_GESTURE_C KEY_C +#define KEY_GESTURE_Z KEY_Z + +#define GESTURE_LEFT 0x20 +#define GESTURE_RIGHT 0x21 +#define GESTURE_UP 0x22 +#define GESTURE_DOWN 0x23 +#define GESTURE_DOUBLECLICK 0x24 +#define GESTURE_O 0x30 +#define GESTURE_W 0x31 +#define GESTURE_M 0x32 +#define GESTURE_E 0x33 +#define GESTURE_L 0x44 +#define GESTURE_S 0x46 +#define GESTURE_V 0x54 +#define GESTURE_Z 0x41 +#define GESTURE_C 0x34 +#define FTS_GESTRUE_POINTS 255 +#define FTS_GESTRUE_POINTS_HEADER 8 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ +/* +* header - byte0:gesture id +* byte1:pointnum +* byte2~7:reserved +* coordinate_x - All gesture point x coordinate +* coordinate_y - All gesture point y coordinate +* mode - 1:enable gesture function(default) +* - 0:disable +* active - 1:enter into gesture(suspend) +* 0:gesture disable or resume +*/ +struct fts_gesture_st { + u8 header[FTS_GESTRUE_POINTS_HEADER]; + u16 coordinate_x[FTS_GESTRUE_POINTS]; + u16 coordinate_y[FTS_GESTRUE_POINTS]; + u8 mode; + u8 active; +}; + + + +struct gesture_struct gesture_data = {0, 0}; + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct fts_gesture_st fts_gesture_data; + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf); +static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); + +/* sysfs gesture node + * read example: cat fts_gesture_mode ---read gesture mode + * write example:echo 01 > fts_gesture_mode ---write gesture mode to 01 + * + */ +static DEVICE_ATTR (fts_gesture_mode, S_IRUGO|S_IWUSR, fts_gesture_show, fts_gesture_store); +/* + * read example: cat fts_gesture_buf ---read gesture buf + */ +static DEVICE_ATTR (fts_gesture_buf, S_IRUGO|S_IWUSR, fts_gesture_buf_show, fts_gesture_buf_store); +static struct attribute *fts_gesture_mode_attrs[] = { + + &dev_attr_fts_gesture_mode.attr, + &dev_attr_fts_gesture_buf.attr, + NULL, +}; + +static struct attribute_group fts_gesture_group = { + .attrs = fts_gesture_mode_attrs, +}; + +/************************************************************************ +* Name: fts_gesture_show +* Brief: +* Input: device, device attribute, char buf +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + u8 val; + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + mutex_lock(&fts_input_dev->mutex); + fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &val); + count = sprintf(buf, "Gesture Mode: %s\n", fts_gesture_data.mode ? "On" : "Off"); + count += sprintf(buf + count, "Reg(0xD0) = %d\n", val); + mutex_unlock(&fts_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_store +* Brief: +* Input: device, device attribute, char buf, char count +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + mutex_lock(&fts_input_dev->mutex); + + if (FTS_SYSFS_ECHO_ON(buf)) { + FTS_INFO("[GESTURE]enable gesture"); + fts_gesture_data.mode = ENABLE; + } else if (FTS_SYSFS_ECHO_OFF(buf)) { + FTS_INFO("[GESTURE]disable gesture"); + fts_gesture_data.mode = DISABLE; + } + + mutex_unlock(&fts_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_buf_show +* Brief: +* Input: device, device attribute, char buf +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_buf_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + int count; + int i = 0; + + mutex_lock(&fts_input_dev->mutex); + count = snprintf(buf, PAGE_SIZE, "Gesture ID: 0x%x\n", fts_gesture_data.header[0]); + count += snprintf(buf + count, PAGE_SIZE, "Gesture PointNum: %d\n", fts_gesture_data.header[1]); + count += snprintf(buf + count, PAGE_SIZE, "Gesture Point Buf:\n"); + for (i = 0; i < fts_gesture_data.header[1]; i++) { + count += snprintf(buf + count, PAGE_SIZE, "%3d(%4d,%4d) ", i, fts_gesture_data.coordinate_x[i], fts_gesture_data.coordinate_y[i]); + if ((i + 1)%4 == 0) + count += snprintf(buf + count, PAGE_SIZE, "\n"); + } + count += snprintf(buf + count, PAGE_SIZE, "\n"); + mutex_unlock(&fts_input_dev->mutex); + + return count; +} + +/************************************************************************ +* Name: fts_gesture_buf_store +* Brief: +* Input: device, device attribute, char buf, char count +* Output: +* Return: +***********************************************************************/ +static ssize_t fts_gesture_buf_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + /* place holder for future use */ + return -EPERM; +} + +/***************************************************************************** +* Name: fts_create_gesture_sysfs +* Brief: +* Input: +* Output: +* Return: 0-success or others-error +*****************************************************************************/ +int fts_create_gesture_sysfs(struct i2c_client *client) +{ + int ret = 0; + + ret = sysfs_create_group(&client->dev.kobj, &fts_gesture_group); + if (ret != 0) { + FTS_ERROR("[GESTURE]fts_gesture_mode_group(sysfs) create failed!"); + sysfs_remove_group(&client->dev.kobj, &fts_gesture_group); + return ret; + } + return 0; +} + +/***************************************************************************** +* Name: fts_gesture_report +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_gesture_report(struct input_dev *input_dev, int gesture_id) +{ + int gesture; + + FTS_FUNC_ENTER(); + FTS_DEBUG("fts gesture_id==0x%x ", gesture_id); + switch (gesture_id) { + case GESTURE_LEFT: + gesture = KEY_GESTURE_LEFT; + break; + case GESTURE_RIGHT: + gesture = KEY_GESTURE_RIGHT; + break; + case GESTURE_UP: + gesture = KEY_GESTURE_UP; + break; + case GESTURE_DOWN: + gesture = KEY_GESTURE_DOWN; + break; + case GESTURE_DOUBLECLICK: + gesture = KEY_GESTURE_U; + break; + case GESTURE_O: + gesture = KEY_GESTURE_O; + break; + case GESTURE_W: + gesture = KEY_GESTURE_W; + break; + case GESTURE_M: + gesture = KEY_GESTURE_M; + break; + case GESTURE_E: + gesture = KEY_GESTURE_E; + break; + case GESTURE_L: + gesture = KEY_GESTURE_L; + break; + case GESTURE_S: + gesture = KEY_GESTURE_S; + break; + case GESTURE_V: + gesture = KEY_GESTURE_V; + break; + case GESTURE_Z: + gesture = KEY_GESTURE_Z; + break; + case GESTURE_C: + gesture = KEY_GESTURE_C; + break; + default: + gesture = -1; + break; + } + /* report event key */ + if (gesture != -1) { + if (gesture_id == GESTURE_DOUBLECLICK) { + FTS_DEBUG("Gesture Code=%d", gesture); + input_report_key(input_dev, DOUBLE_CLICK, 1); + input_sync(input_dev); + input_report_key(input_dev, DOUBLE_CLICK, 0); + input_sync(input_dev); + } + } + + FTS_FUNC_EXIT(); +} + +/************************************************************************ +* Name: fts_gesture_readdata +* Brief: read data from TP register +* Input: +* Output: +* Return: fail <0 +***********************************************************************/ +static int fts_gesture_read_buffer(struct i2c_client *client, u8 *buf, int read_bytes) +{ + int remain_bytes; + int ret; + int i; + if (read_bytes <= I2C_BUFFER_LENGTH_MAXINUM) { + ret = fts_i2c_read(client, buf, 1, buf, read_bytes); + } else { + ret = fts_i2c_read(client, buf, 1, buf, I2C_BUFFER_LENGTH_MAXINUM); + remain_bytes = read_bytes - I2C_BUFFER_LENGTH_MAXINUM; + for (i = 1; remain_bytes > 0; i++) { + if (remain_bytes <= I2C_BUFFER_LENGTH_MAXINUM) + ret = fts_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, remain_bytes); + else + ret = fts_i2c_read(client, buf, 0, buf + I2C_BUFFER_LENGTH_MAXINUM * i, I2C_BUFFER_LENGTH_MAXINUM); + remain_bytes -= I2C_BUFFER_LENGTH_MAXINUM; + } + } + + return ret; +} + +/************************************************************************ +* Name: fts_gesture_fw +* Brief: Check IC's gesture recognise by FW or not +* Input: +* Output: +* Return: 1- FW 0- Driver +***********************************************************************/ +static int fts_gesture_fw(void) +{ + int ret = 0; + + switch (chip_types.chip_idh) { + case 0x54: + case 0x58: + case 0x64: + case 0x87: + case 0x86: + case 0x80: + case 0xE7: + ret = 1; + break; + default: + ret = 0; + break; + } + return ret; +} + +/************************************************************************ +* Name: fts_gesture_readdata +* Brief: read data from TP register +* Input: +* Output: +* Return: fail <0 +***********************************************************************/ +int fts_gesture_readdata(struct i2c_client *client) +{ + u8 buf[FTS_GESTRUE_POINTS * 4] = { 0 }; + int ret = -1; + int i = 0; + int gestrue_id = 0; + int read_bytes = 0; + u8 pointnum; + + FTS_FUNC_ENTER(); + /* init variable before read gesture point */ + memset(fts_gesture_data.header, 0, FTS_GESTRUE_POINTS_HEADER); + memset(fts_gesture_data.coordinate_x, 0, FTS_GESTRUE_POINTS * sizeof(u16)); + memset(fts_gesture_data.coordinate_y, 0, FTS_GESTRUE_POINTS * sizeof(u16)); + + buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + ret = fts_i2c_read(client, buf, 1, buf, FTS_GESTRUE_POINTS_HEADER); + if (ret < 0) { + FTS_ERROR("[GESTURE]Read gesture header data failed!!"); + FTS_FUNC_EXIT(); + return ret; + } + + /* FW recognize gesture */ + if (fts_gesture_fw()) { + memcpy(fts_gesture_data.header, buf, FTS_GESTRUE_POINTS_HEADER); + gestrue_id = buf[0]; + pointnum = buf[1]; + read_bytes = ((int)pointnum) * 4 + 2; + buf[0] = FTS_REG_GESTURE_OUTPUT_ADDRESS; + FTS_DEBUG("[GESTURE]PointNum=%d", pointnum); + ret = fts_gesture_read_buffer(client, buf, read_bytes); + if (ret < 0) { + FTS_ERROR("[GESTURE]Read gesture touch data failed!!"); + FTS_FUNC_EXIT(); + return ret; + } + + fts_gesture_report(fts_input_dev, gestrue_id); + for (i = 0; i < pointnum; i++) { + fts_gesture_data.coordinate_x[i] = (((s16) buf[0 + (4 * i + 2)]) & 0x0F) << 8 + | (((s16) buf[1 + (4 * i + 2)]) & 0xFF); + fts_gesture_data.coordinate_y[i] = (((s16) buf[2 + (4 * i + 2)]) & 0x0F) << 8 + | (((s16) buf[3 + (4 * i + 2)]) & 0xFF); + } + FTS_FUNC_EXIT(); + return 0; + } else { + FTS_ERROR("[GESTURE]IC 0x%x need gesture lib to support gestures.", chip_types.chip_idh); + return 0; + } +} + +/***************************************************************************** +* Name: fts_gesture_recovery +* Brief: recovery gesture state when reset or power on +* Input: +* Output: +* Return: +*****************************************************************************/ +void fts_gesture_recovery(struct i2c_client *client) +{ + if (fts_gesture_data.mode && fts_gesture_data.active) { + fts_i2c_write_reg(client, 0xD1, 0xff); + fts_i2c_write_reg(client, 0xD2, 0xff); + fts_i2c_write_reg(client, 0xD5, 0xff); + fts_i2c_write_reg(client, 0xD6, 0xff); + fts_i2c_write_reg(client, 0xD7, 0xff); + fts_i2c_write_reg(client, 0xD8, 0xff); + fts_i2c_write_reg(client, FTS_REG_GESTURE_EN, ENABLE); + } +} + +/***************************************************************************** +* Name: fts_gesture_suspend +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int fts_gesture_suspend(struct i2c_client *i2c_client) +{ + int i; + u8 state; + + FTS_FUNC_ENTER(); + + /* gesture not enable, return immediately */ + if (fts_gesture_data.mode == 0) { + FTS_DEBUG("gesture is disabled"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + for (i = 0; i < 5; i++) { + fts_i2c_write_reg(i2c_client, 0xd1, 0xff); + fts_i2c_write_reg(i2c_client, 0xd2, 0xff); + fts_i2c_write_reg(i2c_client, 0xd5, 0xff); + fts_i2c_write_reg(i2c_client, 0xd6, 0xff); + fts_i2c_write_reg(i2c_client, 0xd7, 0xff); + fts_i2c_write_reg(i2c_client, 0xd8, 0xff); + fts_i2c_write_reg(i2c_client, FTS_REG_GESTURE_EN, 0x01); + msleep(1); + fts_i2c_read_reg(i2c_client, FTS_REG_GESTURE_EN, &state); + if (state == 1) + break; + } + + if (i >= 5) { + FTS_ERROR("[GESTURE]Enter into gesture(suspend) failed!\n"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + fts_gesture_data.active = 1; + FTS_DEBUG("[GESTURE]Enter into gesture(suspend) successfully!"); + FTS_FUNC_EXIT(); + return 0; +} + +/***************************************************************************** +* Name: fts_gesture_resume +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int fts_gesture_resume(struct i2c_client *client) +{ + int i; + u8 state; + FTS_FUNC_ENTER(); + + /* gesture not enable, return immediately */ + if (fts_gesture_data.mode == 0) { + FTS_DEBUG("gesture is disabled"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + if (fts_gesture_data.active == 0) { + FTS_DEBUG("gesture is unactive"); + FTS_FUNC_EXIT(); + return -EPERM; + } + + fts_gesture_data.active = 0; + for (i = 0; i < 5; i++) { + fts_i2c_write_reg(client, FTS_REG_GESTURE_EN, 0x00); + msleep(1); + fts_i2c_read_reg(client, FTS_REG_GESTURE_EN, &state); + if (state == 0) + break; + } + + if (i >= 5) { + FTS_ERROR("[GESTURE]Clear gesture(resume) failed!\n"); + } + + FTS_FUNC_EXIT(); + return 0; +} +extern int tp_gesture_onoff; + + +static ssize_t gesture_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + int num; + + if (*ppos) + return 0; + + num = sprintf(page, "%d\n", gesture_data.gesture_all_switch); + *ppos += num; + + return num; +} + +static ssize_t gesture_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + int ret; + char temp[20] = ""; + + ret = copy_from_user(temp, buff, len); + if (ret) { + FTS_ERROR("<%s> copy_from_user failed.\n", __func__); + return -EPERM; + } + + FTS_DEBUG("%s copy_from_user :%s\n", __func__, temp); +#if 0 + if (strnstr(temp, "on", strlen(temp))) + gesture_data.gesture_all_switch = 1; + else + gesture_data.gesture_all_switch = 0; +#else + ret = kstrtouint(temp, 0, &gesture_data.gesture_all_switch); + if (ret) { + FTS_ERROR("kstrtouint failed.\n"); + return -EFAULT; + } +#endif + + FTS_DEBUG("%s gesture_data.gesture_all_switch :%d\n", __func__, gesture_data.gesture_all_switch); + tp_gesture_onoff = gesture_data.gesture_all_switch; + + return len; +} +static const struct file_operations gesture_fops = { + .owner = THIS_MODULE, + .read = gesture_read, + .write = gesture_write, +}; + +static ssize_t gesture_data_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + int num; + + if (*ppos) + return 0; + + num = sprintf(page, "K\n"); + *ppos += num; + + return num; +} + +static ssize_t gesture_data_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + return len; +} + +static const struct file_operations gesture_data_fops = { + .owner = THIS_MODULE, + .read = gesture_data_read, + .write = gesture_data_write, +}; + +int gesture_init(struct input_dev *input_dev) +{ + struct proc_dir_entry *proc_entry = NULL; + struct proc_dir_entry *proc_data = NULL; + struct proc_dir_entry *parent; + + parent = proc_mkdir("gesture", NULL); + if (!parent) { + pr_err("%s: failed to create proc entry\n", __func__); + return -ENOMEM; + } + + proc_entry = proc_create(GESTURE_NODE, 0666, parent, &gesture_fops); + if (proc_entry == NULL) { + FTS_ERROR("CAN't create proc entry /proc/%s !", GESTURE_NODE); + return -EPERM; + } else { + FTS_DEBUG("Created proc entry /proc/%s !", GESTURE_NODE); + } + + proc_data = proc_create(GESTURE_DATA, 0666, parent, &gesture_data_fops); + if (proc_data == NULL) { + FTS_ERROR("CAN't create proc entry /proc/%s !", GESTURE_DATA); + return -EPERM; + } else { + FTS_DEBUG("Created proc entry /proc/%s !", GESTURE_DATA); + } + input_set_capability(input_dev, EV_KEY, DOUBLE_CLICK); + __set_bit(DOUBLE_CLICK, input_dev->keybit); + + return 0; +} +/***************************************************************************** +* Name: fts_gesture_init +* Brief: +* Input: +* Output: None +* Return: None +*****************************************************************************/ +int fts_gesture_init(struct input_dev *input_dev, struct i2c_client *client) +{ + FTS_FUNC_ENTER(); + gesture_init(input_dev); + fts_gesture_data.mode = 1; + fts_gesture_data.active = 0; + FTS_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: fts_gesture_exit +* Brief: call when driver removed +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_gesture_exit(struct i2c_client *client) +{ + FTS_FUNC_ENTER(); + sysfs_remove_group(&client->dev.kobj, &fts_gesture_group); + FTS_FUNC_EXIT(); + return 0; +} + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_i2c.c b/drivers/input/touchscreen/FT8716/focaltech_i2c.c new file mode 100755 index 0000000000000..a68549d08471a --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_i2c.c @@ -0,0 +1,206 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/************************************************************************ +* +* File Name: focaltech_i2c.c +* +* Author: fupeipei +* +* Created: 2016-08-04 +* +* Abstract: i2c communication with TP +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By fupeipei 2016-08-04 +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static DEFINE_MUTEX(i2c_rw_access); + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ + +/************************************************************************ +* Name: fts_i2c_read +* Brief: i2c read +* Input: i2c info, write buf, write len, read buf, read len +* Output: get data in the 3rd buf +* Return: fail <0 +***********************************************************************/ +int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen) +{ + int ret; + + mutex_lock(&i2c_rw_access); + + if (readlen > 0) { + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) { + FTS_ERROR("[IIC]: i2c_transfer(write) error, ret=%d!!", ret); + } + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + FTS_ERROR("[IIC]: i2c_transfer(read) error, ret=%d!!", ret); + } + } + } + + mutex_unlock(&i2c_rw_access); + return ret; +} + +/************************************************************************ +* Name: fts_i2c_write +* Brief: i2c write +* Input: i2c info, write buf, write len +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret = 0; + + mutex_lock(&i2c_rw_access); + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) { + FTS_ERROR("%s: i2c_transfer(write) error, ret=%d", __func__, ret); + } + } + mutex_unlock(&i2c_rw_access); + + return ret; +} + +/************************************************************************ +* Name: fts_i2c_write_reg +* Brief: write register +* Input: i2c info, reg address, reg value +* Output: no +* Return: fail <0 +***********************************************************************/ +int fts_i2c_write_reg(struct i2c_client *client, u8 regaddr, u8 regvalue) +{ + u8 buf[2] = {0}; + + buf[0] = regaddr; + buf[1] = regvalue; + return fts_i2c_write(client, buf, sizeof(buf)); +} + +/************************************************************************ +* Name: fts_i2c_read_reg +* Brief: read register +* Input: i2c info, reg address, reg value +* Output: get reg value +* Return: fail <0 +***********************************************************************/ +int fts_i2c_read_reg(struct i2c_client *client, u8 regaddr, u8 *regvalue) +{ + return fts_i2c_read(client, ®addr, 1, regvalue, 1); +} + +/************************************************************************ +* Name: fts_i2c_init +* Brief: fts i2c init +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_i2c_init(void) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} +/************************************************************************ +* Name: fts_i2c_exit +* Brief: fts i2c exit +* Input: +* Output: +* Return: +***********************************************************************/ +int fts_i2c_exit(void) +{ + FTS_FUNC_ENTER(); + + FTS_FUNC_EXIT(); + return 0; +} + diff --git a/drivers/input/touchscreen/FT8716/focaltech_point_report_check.c b/drivers/input/touchscreen/FT8716/focaltech_point_report_check.c new file mode 100755 index 0000000000000..6801b882dd242 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_point_report_check.c @@ -0,0 +1,150 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_point_report_check.c +* +* Author: WangTao +* +* Created: 2016-11-16 +* +* Abstract: point report check function +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By WangTao 2016-11-16 +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_POINT_REPORT_CHECK_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define POINT_REPORT_CHECK_WAIT_TIME 200 + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct delayed_work fts_point_report_check_work; +static struct workqueue_struct *fts_point_report_check_workqueue + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + +/***************************************************************************** +* functions body +*****************************************************************************/ + + +/***************************************************************************** +* Name: fts_point_report_check_func +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_point_report_check_func(struct work_struct *work) +{ + +#if FTS_MT_PROTOCOL_B_EN + unsigned int finger_count = 0; +#endif + + FTS_FUNC_ENTER(); + mutex_lock(&fts_wq_data->report_mutex); + +#if FTS_MT_PROTOCOL_B_EN + for (finger_count = 0; finger_count < fts_wq_data->pdata->max_touch_number; finger_count++) { + input_mt_slot(fts_input_dev, finger_count); + input_mt_report_slot_state(fts_input_dev, MT_TOOL_FINGER, false); + } +#else + input_mt_sync(fts_input_dev); +#endif + input_report_key(fts_input_dev, BTN_TOUCH, 0); + input_sync(fts_input_dev); + + mutex_unlock(&fts_wq_data->report_mutex); + + FTS_FUNC_EXIT(); +} + +void fts_point_report_check_queue_work(void) +{ + cancel_delayed_work(&fts_point_report_check_work); + queue_delayed_work(fts_point_report_check_workqueue, &fts_point_report_check_work, msecs_to_jiffies(POINT_REPORT_CHECK_WAIT_TIME)); +} + +/***************************************************************************** +* Name: fts_point_report_check_init +* Brief: +* Input: +* Output: +* Return: < 0: Fail to create esd check queue +*****************************************************************************/ +int fts_point_report_check_init(void) +{ + FTS_FUNC_ENTER(); + + INIT_DELAYED_WORK(&fts_point_report_check_work, fts_point_report_check_func); + fts_point_report_check_workqueue = create_workqueue("fts_point_report_check_func_wq"); + if (fts_point_report_check_workqueue == NULL) { + FTS_ERROR("[POINT_REPORT]: Failed to create fts_point_report_check_workqueue!!"); + } else { + FTS_DEBUG("[POINT_REPORT]: Success to create fts_point_report_check_workqueue!!"); + } + + FTS_FUNC_EXIT(); + + return 0; +} + +/***************************************************************************** +* Name: fts_point_report_check_exit +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +int fts_point_report_check_exit(void) +{ + FTS_FUNC_ENTER(); + + destroy_workqueue(fts_point_report_check_workqueue); + + FTS_FUNC_EXIT(); + return 0; +} +#endif /* FTS_POINT_REPORT_CHECK_EN */ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_sensor.c b/drivers/input/touchscreen/FT8716/focaltech_sensor.c new file mode 100755 index 0000000000000..30a130b1a7be6 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_sensor.c @@ -0,0 +1,314 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: focaltech_esdcheck.c +* +* Author: Focaltech Driver Team +* +* Created: 2016-08-03 +* +* Abstract: Sensor +* +* Version: v1.0 +* +* Revision History: +* v1.0: +* First release. By luougojin 2016-08-03 +*****************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include "focaltech_core.h" + +#if FTS_PSENSOR_EN +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +/* psensor register address*/ +#define FTS_REG_PSENSOR_ENABLE 0xB0 +#define FTS_REG_PSENSOR_STATUS 0x01 + +/* psensor register bits*/ +#define FTS_PSENSOR_ENABLE_MASK 0x01 +#define FTS_PSENSOR_STATUS_NEAR 0xC0 +#define FTS_PSENSOR_STATUS_FAR 0xE0 +#define FTS_PSENSOR_FAR_TO_NEAR 0 +#define FTS_PSENSOR_NEAR_TO_FAR 1 +#define FTS_PSENSOR_ORIGINAL_STATE_FAR 1 +#define FTS_PSENSOR_WAKEUP_TIMEOUT 500 + +/***************************************************************************** +* Static variables +*****************************************************************************/ +static struct sensors_classdev __maybe_unused sensors_proximity_cdev = { + .name = "fts-proximity", + .vendor = "FocalTech", + .version = 1, + .handle = SENSORS_PROXIMITY_HANDLE, + .type = SENSOR_TYPE_PROXIMITY, + .max_range = "5.0", + .resolution = "5.0", + .sensor_power = "0.1", + .min_delay = 0, + .fifo_reserved_event_count = 0, + .fifo_max_event_count = 0, + .enabled = 0, + .delay_msec = 200, + .sensors_enable = NULL, + .sensors_poll_delay = NULL, +}; + +/***************************************************************************** +* functions body +*****************************************************************************/ +/***************************************************************************** +* Name: fts_psensor_support_enabled +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static inline bool fts_psensor_support_enabled(void) +{ + /*return config_enabled(CONFIG_TOUCHSCREEN_FTS_PSENSOR);*/ + return FTS_PSENSOR_EN; +} + +/***************************************************************************** +* Name: fts_psensor_enable +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static void fts_psensor_enable(struct fts_ts_data *data, int enable) +{ + u8 state; + int ret = -1; + + if (data->client == NULL) + return; + + fts_i2c_read_reg(data->client, FTS_REG_PSENSOR_ENABLE, &state); + if (enable) + state |= FTS_PSENSOR_ENABLE_MASK; + else + state &= ~FTS_PSENSOR_ENABLE_MASK; + + ret = fts_i2c_write_reg(data->client, FTS_REG_PSENSOR_ENABLE, state); + if (ret < 0) + FTS_ERROR("write psensor switch command failed"); + return; +} + +/***************************************************************************** +* Name: fts_psensor_enable_set +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_psensor_enable_set(struct sensors_classdev *sensors_cdev, + unsigned int enable) +{ + struct fts_psensor_platform_data *psensor_pdata = + container_of(sensors_cdev, + struct fts_psensor_platform_data, ps_cdev); + struct fts_ts_data *data = psensor_pdata->data; + struct input_dev *input_dev = data->psensor_pdata->input_psensor_dev; + + mutex_lock(&input_dev->mutex); + fts_psensor_enable(data, enable); + psensor_pdata->tp_psensor_data = FTS_PSENSOR_ORIGINAL_STATE_FAR; + if (enable) + psensor_pdata->tp_psensor_opened = 1; + else + psensor_pdata->tp_psensor_opened = 0; + mutex_unlock(&input_dev->mutex); + return enable; +} + +/***************************************************************************** +* Name: fts_read_tp_psensor_data +* Brief: +* Input: +* Output: +* Return: +*****************************************************************************/ +static int fts_read_tp_psensor_data(struct fts_ts_data *data) +{ + u8 psensor_status; + char tmp; + int ret = 1; + + fts_i2c_read_reg(data->client, + FTS_REG_PSENSOR_STATUS, &psensor_status); + + tmp = data->psensor_pdata->tp_psensor_data; + if (psensor_status == FTS_PSENSOR_STATUS_NEAR) + data->psensor_pdata->tp_psensor_data = + FTS_PSENSOR_FAR_TO_NEAR; + else if (psensor_status == FTS_PSENSOR_STATUS_FAR) + data->psensor_pdata->tp_psensor_data = + FTS_PSENSOR_NEAR_TO_FAR; + + if (tmp != data->psensor_pdata->tp_psensor_data) { + FTS_ERROR("%s sensor data changed", __func__); + ret = 0; + } + return ret; +} + + +int fts_sensor_read_data(struct fts_ts_data *data) +{ + int ret = 0; + if (fts_psensor_support_enabled() && data->psensor_pdata->tp_psensor_opened) { + ret = fts_read_tp_psensor_data(data); + if (!ret) { + if (data->suspended) { + pm_wakeup_event(&data->client->dev, FTS_PSENSOR_WAKEUP_TIMEOUT); + } + input_report_abs(data->psensor_pdata->input_psensor_dev, + ABS_DISTANCE, + data->psensor_pdata->tp_psensor_data); + input_sync(data->psensor_pdata->input_psensor_dev); + } + return 1; + } + return 0; +} + +int fts_sensor_suspend(struct fts_ts_data *data) +{ + int ret = 0; + + if (fts_psensor_support_enabled() && + device_may_wakeup(&data->client->dev) && + data->psensor_pdata->tp_psensor_opened) { + ret = enable_irq_wake(data->client->irq); + if (ret != 0) { + FTS_ERROR("%s: set_irq_wake failed", __func__); + } + data->suspended = true; + return 1; + } + + return 0; +} + + +int fts_sensor_resume(struct fts_ts_data *data) +{ + int ret = 0; + + if (fts_psensor_support_enabled() && + device_may_wakeup(&data->client->dev) && data->psensor_pdata->tp_psensor_opened) { + ret = disable_irq_wake(data->client->irq); + if (ret) { + FTS_ERROR("%s: disable_irq_wake failed", __func__); + } + data->suspended = false; + return 1; + } + + return 0; +} + + +int fts_sensor_init(struct fts_ts_data *data) +{ + struct fts_psensor_platform_data *psensor_pdata; + struct input_dev *psensor_input_dev; + int err; + + if (fts_psensor_support_enabled()) { + device_init_wakeup(&data->client->dev, 1); + psensor_pdata = devm_kzalloc(&data->client->dev, + sizeof(struct fts_psensor_platform_data), + GFP_KERNEL); + if (!psensor_pdata) { + FTS_ERROR("Failed to allocate memory"); + goto irq_free; + } + data->psensor_pdata = psensor_pdata; + + psensor_input_dev = input_allocate_device(); + if (!psensor_input_dev) { + FTS_ERROR("Failed to allocate device"); + goto free_psensor_pdata; + } + + __set_bit(EV_ABS, psensor_input_dev->evbit); + input_set_abs_params(psensor_input_dev, ABS_DISTANCE, 0, 1, 0, 0); + psensor_input_dev->name = "proximity"; + psensor_input_dev->id.bustype = BUS_I2C; + psensor_input_dev->dev.parent = &data->client->dev; + data->psensor_pdata->input_psensor_dev = psensor_input_dev; + + err = input_register_device(psensor_input_dev); + if (err) { + FTS_ERROR("Unable to register device, err=%d", err); + goto free_psensor_input_dev; + } + + psensor_pdata->ps_cdev = sensors_proximity_cdev; + psensor_pdata->ps_cdev.sensors_enable = fts_psensor_enable_set; + psensor_pdata->data = data; + + err = sensors_classdev_register(&data->client->dev, &psensor_pdata->ps_cdev); + if (err) { + goto unregister_psensor_input_device; + } + } + + return 0; +unregister_psensor_input_device: + if (fts_psensor_support_enabled()) + input_unregister_device(data->psensor_pdata->input_psensor_dev); +free_psensor_input_dev: + if (fts_psensor_support_enabled()) + input_free_device(data->psensor_pdata->input_psensor_dev); +free_psensor_pdata: + if (fts_psensor_support_enabled()) { + devm_kfree(&data->client->dev, psensor_pdata); + data->psensor_pdata = NULL; + } +irq_free: + if (fts_psensor_support_enabled()) + device_init_wakeup(&data->client->dev, 0); + free_irq(data->client->irq, data); + + return 1; +} + +int fts_sensor_remove(struct fts_ts_data *data) +{ + if (fts_psensor_support_enabled()) { + device_init_wakeup(&data->client->dev, 0); + sensors_classdev_unregister(&data->psensor_pdata->ps_cdev); + input_unregister_device(data->psensor_pdata->input_psensor_dev); + devm_kfree(&data->client->dev, data->psensor_pdata); + data->psensor_pdata = NULL; + } + return 0; +} +#endif /* FTS_PSENSOR_EN */ diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/Makefile b/drivers/input/touchscreen/FT8716/focaltech_test/Makefile new file mode 100755 index 0000000000000..410b854ae591e --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/Makefile @@ -0,0 +1,10 @@ +#drivers/input/touchscreen/focaltech_touch/focaltech_test +# +#Makefile for test module +# + + + +obj-$(CONFIG_TOUCHSCREEN_FTS) += src/ +obj-$(CONFIG_TOUCHSCREEN_FTS) += supported_ic/ + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/focaltech_test_config.h b/drivers/input/touchscreen/FT8716/focaltech_test/focaltech_test_config.h new file mode 100755 index 0000000000000..394e5eaa86485 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/focaltech_test_config.h @@ -0,0 +1,63 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_config.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +************************************************************************/ +#include "../focaltech_core.h" + + +/*----------------------------------------------------------- +IC Type Test +-----------------------------------------------------------*/ +#define FT5X46_TEST 0x20 +#define FT6X36_TEST 0x40 +#define FT5822_TEST 0x70 +#define FT8606_TEST 0x90 +#define FT8716_TEST 0xA0 +#define FT3C47_TEST 0xB0 +#define FT8607_TEST 0xC0 +#define FT8736_TEST 0xE0 +#define FT3D47_TEST 0xF0 +#define FTE716_TEST 0x100 +#define FTE736_TEST 0x140 +#define FT8006_TEST 0x130 + + +#ifdef FTS_CHIP_TYPE + +#if (FTS_CHIP_TYPE == _FT8716) +#define FTS_CHIP_TEST_TYPE FT8716_TEST +#elif(FTS_CHIP_TYPE == _FT8736) +#define FTS_CHIP_TEST_TYPE FT8736_TEST +#elif(FTS_CHIP_TYPE == _FT8006) +#define FTS_CHIP_TEST_TYPE FT8006_TEST +#elif(FTS_CHIP_TYPE == _FT8606) +#define FTS_CHIP_TEST_TYPE FT8606_TEST +#elif(FTS_CHIP_TYPE == _FT8607) +#define FTS_CHIP_TEST_TYPE FT8607_TEST +#elif(FTS_CHIP_TYPE == _FTE716) +#define FTS_CHIP_TEST_TYPE FTE716_TEST +#elif(FTS_CHIP_TYPE == _FT3D47) +#define FTS_CHIP_TEST_TYPE FT3D47_TEST +#elif(IC_SERIALS == 0x01) +#define FTS_CHIP_TEST_TYPE FT5822_TEST +#elif(FTS_CHIP_TYPE == _FT3C47U) +#define FTS_CHIP_TEST_TYPE FT3C47_TEST +#elif(IC_SERIALS == 0x02) +#define FTS_CHIP_TEST_TYPE FT5X46_TEST +#elif((IC_SERIALS == 0x03) || (IC_SERIALS == 0x04)) +#define FTS_CHIP_TEST_TYPE FT6X36_TEST +#endif + +#else +#define FTS_CHIP_TEST_TYPE FT8716_TEST + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_ic_table.h b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_ic_table.h new file mode 100755 index 0000000000000..bfb5ab7510479 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_ic_table.h @@ -0,0 +1,115 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +#ifndef __FOCALTECH_IC_TABLE_H__ +#define __FOCALTECH_IC_TABLE_H__ +/***************************************************************************** +* +* File Name: focaltech_ic_table.h +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ + +/*----------------------------------------------------------- +IC corresponding code, each of the IC code is 8 bit, high 4 bit on behalf of the same series, low 4 bit on behalf of the specific IC +-----------------------------------------------------------*/ +enum IC_Type { + IC_FT5X36 = 0x10, + IC_FT5X36i = 0x11, + IC_FT3X16 = 0x12, + IC_FT3X26 = 0x13, + + IC_FT5X46 = 0x21, + IC_FT5X46i = 0x22, + IC_FT5526 = 0x23, + IC_FT3X17 = 0x24, + IC_FT5436 = 0x25, + IC_FT3X27 = 0x26, + IC_FT5526I = 0x27, + IC_FT5416 = 0x28, + IC_FT5426 = 0x29, + IC_FT5435 = 0x2A, + IC_FT7681 = 0x2B, + IC_FT7661 = 0x2C, + IC_FT7511 = 0x2D, + IC_FT7421 = 0x2E, + IC_FT6X06 = 0x30, + IC_FT3X06 = 0x31, + IC_FT6X36 = 0x40, + IC_FT3X07 = 0x41, + IC_FT6416 = 0x42, + IC_FT6426 = 0x43, + IC_FT7401 = 0x44, + IC_FT3407U = 0x45, + IC_FT6236U = 0x46, + IC_FT6436U = 0x47, + IC_FT3267 = 0x48, + IC_FT3367 = 0x49, + IC_FT5X16 = 0x50, + IC_FT5X12 = 0x51, + IC_FT5506 = 0x60, + IC_FT5606 = 0x61, + IC_FT5816 = 0x62, + IC_FT5822 = 0x70, + IC_FT5626 = 0x71, + IC_FT5726 = 0x72, + IC_FT5826B = 0x73, + IC_FT3617 = 0x74, + IC_FT3717 = 0x75, + IC_FT7811 = 0x76, + IC_FT5826S = 0x77, + IC_FT5306 = 0x80, + IC_FT5406 = 0x81, + IC_FT8606 = 0x90, + IC_FT8716 = 0xA0, + IC_FT3C47U = 0xB0, + IC_FT8607 = 0xC0, + IC_FT8707 = 0xD0, + IC_FT8736 = 0xE0, + IC_FT3D47 = 0xF0, + IC_FTE716 = 0x100, + IC_FT5442 = 0x110, + IC_FT3428U = 0x120, + IC_FT8201 = 0x130, + IC_FT8006M = 0x131, + IC_FTE736 = 0x140 +}; + + + +extern unsigned int fts_ic_table_get_ic_code_from_ic_name(char *strIcName); +extern void fts_ic_table_get_ic_name_from_ic_code(unsigned int ic_code, char *strIcName); + +extern unsigned int fts_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2); +extern unsigned int fts_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2); +extern int fts_ic_table_need_chip_id2(unsigned int chip_id); + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_detail_threshold.h b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_detail_threshold.h new file mode 100755 index 0000000000000..c93ca27592419 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_detail_threshold.h @@ -0,0 +1,131 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ + +#ifndef _DETAIL_THRESHOLD_H +#define _DETAIL_THRESHOLD_H + +#define TX_NUM_MAX 60 +#define RX_NUM_MAX 60 +#define NUM_MAX (TX_NUM_MAX)*(RX_NUM_MAX) +#define MAX_PATH 256 + +#define BUFFER_LENGTH 512 +#define MAX_TEST_ITEM 20 +#define MAX_GRAPH_ITEM 20 +#define MAX_CHANNEL_NUM 144 + +#define FORCETOUCH_ROW 1 + +struct stCfg_Incell_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + + int (*CBTest_Min)[RX_NUM_MAX]; + int (*CBTest_Max)[RX_NUM_MAX]; + + int (*CBUniformityTest_CHX_Linearity)[RX_NUM_MAX]; + int (*CBUniformityTest_CHY_Linearity)[RX_NUM_MAX]; + +}; + +struct stCfg_MCap_DetailThreshold { + unsigned char (*InvalidNode)[RX_NUM_MAX]; + unsigned char (*InvalidNode_SC)[RX_NUM_MAX]; + + int (*RawDataTest_Min)[RX_NUM_MAX]; + int (*RawDataTest_Max)[RX_NUM_MAX]; + int (*RawDataTest_Low_Min)[RX_NUM_MAX]; + int (*RawDataTest_Low_Max)[RX_NUM_MAX]; + int (*RawDataTest_High_Min)[RX_NUM_MAX]; + int (*RawDataTest_High_Max)[RX_NUM_MAX]; + int (*RxLinearityTest_Max)[RX_NUM_MAX]; + int (*TxLinearityTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Max)[RX_NUM_MAX]; + int (*PanelDifferTest_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_ON_Min)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Max)[RX_NUM_MAX]; + int (*SCapRawDataTest_OFF_Min)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Max)[RX_NUM_MAX]; + short (*SCapCbTest_ON_Min)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Max)[RX_NUM_MAX]; + short (*SCapCbTest_OFF_Min)[RX_NUM_MAX]; + int (*NoistTest_Coefficient)[RX_NUM_MAX]; + int (*LCDNoistTest_Coefficient)[RX_NUM_MAX]; + + int ForceTouch_SCapRawDataTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapRawDataTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_ON_Min[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Max[FORCETOUCH_ROW][RX_NUM_MAX]; + int ForceTouch_SCapCbTest_OFF_Min[FORCETOUCH_ROW][RX_NUM_MAX]; +}; + +struct stCfg_SCap_DetailThreshold { + int TempData[MAX_CHANNEL_NUM]; + int RawDataTest_Max[MAX_CHANNEL_NUM]; + int RawDataTest_Min[MAX_CHANNEL_NUM]; + int CiTest_Max[MAX_CHANNEL_NUM]; + int CiTest_Min[MAX_CHANNEL_NUM]; + int DeltaCiTest_Base[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase1[MAX_CHANNEL_NUM]; + int DeltaCiTest_AnotherBase2[MAX_CHANNEL_NUM]; + int CiDeviationTest_Base[MAX_CHANNEL_NUM]; + + int NoiseTest_Max[MAX_CHANNEL_NUM]; + int DeltaCxTest_Sort[MAX_CHANNEL_NUM]; + int DeltaCxTest_Area[MAX_CHANNEL_NUM]; + + int CbTest_Max[MAX_CHANNEL_NUM]; + int CbTest_Min[MAX_CHANNEL_NUM]; + int DeltaCbTest_Base[MAX_CHANNEL_NUM]; + int DifferTest_Base[MAX_CHANNEL_NUM]; + int CBDeviationTest_Base[MAX_CHANNEL_NUM]; + int K1DifferTest_Base[MAX_CHANNEL_NUM]; +}; + +void OnInit_MCap_DetailThreshold(char *strIniFile); +void OnInit_SCap_DetailThreshold(char *strIniFile); +void OnInit_Incell_DetailThreshold(char *strIniFile); + +void set_max_channel_num(void); + +void OnInit_InvalidNode(char *strIniFile); +void OnInit_DThreshold_RawDataTest(char *strIniFile); +void OnInit_DThreshold_SCapRawDataTest(char *strIniFile); +void OnInit_DThreshold_SCapCbTest(char *strIniFile); + +void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile); +void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile); + + +void OnInit_DThreshold_RxLinearityTest(char *strIniFile); +void OnInit_DThreshold_TxLinearityTest(char *strIniFile); + +void OnInit_DThreshold_PanelDifferTest(char *strIniFile); + +void OnInit_DThreshold_CBTest(char *strIniFile); +void OnInit_DThreshold_AllButtonCBTest(char *strIniFile); +void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile); + +void OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue); + +int malloc_struct_DetailThreshold(void); +void free_struct_DetailThreshold(void); +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_ini.h b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_ini.h new file mode 100755 index 0000000000000..2385d63f72272 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_ini.h @@ -0,0 +1,66 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#ifndef INI_H +#define INI_H + +#define MAX_KEY_NUM 300 +#define MAX_KEY_NAME_LEN 50 +#define MAX_KEY_VALUE_LEN 360 + +#define MAX_CFG_BUF 480 +#define SUCCESS 0 +/* return value */ +#define CFG_OK SUCCESS +#define CFG_SECTION_NOT_FOUND -1 +#define CFG_KEY_NOT_FOUND -2 +#define CFG_ERR -10 + +#define CFG_ERR_OPEN_FILE -10 +#define CFG_ERR_CREATE_FILE -11 +#define CFG_ERR_READ_FILE -12 +#define CFG_ERR_WRITE_FILE -13 +#define CFG_ERR_FILE_FORMAT -14 +#define CFG_ERR_TOO_MANY_KEY_NUM -15 +#define CFG_ERR_OUT_OF_LEN -16 + +#define CFG_ERR_EXCEED_BUF_SIZE -22 + +#define COPYF_OK SUCCESS +#define COPYF_ERR_OPEN_FILE -10 +#define COPYF_ERR_CREATE_FILE -11 +#define COPYF_ERR_READ_FILE -12 +#define COPYF_ERR_WRITE_FILE -13 + +typedef struct _ST_INI_FILE_DATA { + char pSectionName[MAX_KEY_NAME_LEN]; + char pKeyName[MAX_KEY_NAME_LEN]; + char pKeyValue[MAX_KEY_VALUE_LEN]; + int iSectionNameLen; + int iKeyNameLen; + int iKeyValueLen; +} ST_INI_FILE_DATA; + + + +int ini_get_key(char *filedata, char *section, char *key, char *value); + + +int fts_atoi(char *nptr); +char *ini_str_trim_r(char *buf); +char *ini_str_trim_l(char *buf); + +int init_key_data(void); +int ini_get_key_data(char *filedata); +int release_key_data(void); +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_main.h b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_main.h new file mode 100755 index 0000000000000..5b22edfd3d87f --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_main.h @@ -0,0 +1,240 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#ifndef _TEST_LIB_H +#define _TEST_LIB_H + +#include "focaltech_test_detail_threshold.h" +#include "../focaltech_test_config.h" + +#define boolean unsigned char +#define bool unsigned char +#define BYTE unsigned char +#define false 0 +#define true 1 + +enum NodeType { + NODE_INVALID_TYPE = 0, + NODE_VALID_TYPE = 1, + NODE_KEY_TYPE = 2, + NODE_AST_TYPE = 3, +}; + + +typedef int (*FTS_I2C_READ_FUNCTION)(unsigned char *, int , unsigned char *, int); +typedef int (*FTS_I2C_WRITE_FUNCTION)(unsigned char *, int); + +extern FTS_I2C_READ_FUNCTION fts_i2c_read_test; +extern FTS_I2C_WRITE_FUNCTION fts_i2c_write_test; + +extern int init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read); +extern int init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write); + + + + + + +int set_param_data(char *TestParamData); +boolean start_test_tp(void); +int get_test_data(char *pTestData); + + +int focaltech_test_main_init(void); +int focaltech_test_main_exit(void); + + +#define MIN_HOLE_LEVEL (-1) +#define MAX_HOLE_LEVEL 0x7F +/*----------------------------------------------------------- +Error Code for Comm +-----------------------------------------------------------*/ +#define ERROR_CODE_OK 0x00 +#define ERROR_CODE_CHECKSUM_ERROR 0x01 +#define ERROR_CODE_INVALID_COMMAND 0x02 +#define ERROR_CODE_INVALID_PARAM 0x03 +#define ERROR_CODE_IIC_WRITE_ERROR 0x04 +#define ERROR_CODE_IIC_READ_ERROR 0x05 +#define ERROR_CODE_WRITE_USB_ERROR 0x06 +#define ERROR_CODE_WAIT_RESPONSE_TIMEOUT 0x07 +#define ERROR_CODE_PACKET_RE_ERROR 0x08 +#define ERROR_CODE_NO_DEVICE 0x09 +#define ERROR_CODE_WAIT_WRITE_TIMEOUT 0x0a +#define ERROR_CODE_READ_USB_ERROR 0x0b +#define ERROR_CODE_COMM_ERROR 0x0c +#define ERROR_CODE_ALLOCATE_BUFFER_ERROR 0x0d +#define ERROR_CODE_DEVICE_OPENED 0x0e +#define ERROR_CODE_DEVICE_CLOSED 0x0f + +/*----------------------------------------------------------- +Test Status +-----------------------------------------------------------*/ +#define RESULT_NULL 0 +#define RESULT_PASS 1 +#define RESULT_NG 2 +#define RESULT_TESTING 3 +#define RESULT_TBD 4 +#define RESULT_REPLACE 5 +#define RESULT_CONNECTING 6 + +/*----------------------------------------------------------- + +read write max bytes per time +-----------------------------------------------------------*/ + +#define BYTES_PER_TIME 128 + +extern void fts_test_funcs(void); +struct StTestFuncs { + void (*OnInit_TestItem)(char *); + void (*OnInit_BasicThreshold)(char *) ; + void (*SetTestItem)(void) ; + boolean (*Start_Test)(void); + int (*Get_test_data)(char *); +}; +extern struct StTestFuncs g_stTestFuncs; + +struct StruScreenSeting { + int iSelectedIC; + int iTxNum; + int iRxNum; + int isNormalize; + int iUsedMaxTxNum; + int iUsedMaxRxNum; + + unsigned char iChannelsNum; + unsigned char iKeyNum; +}; +extern struct StruScreenSeting g_ScreenSetParam; +struct stTestItem { + unsigned char ItemType; + unsigned char TestNum; + unsigned char TestResult; + unsigned char ItemCode; + + +}; +extern struct stTestItem g_stTestItem[1][MAX_TEST_ITEM]; + +struct structSCapConfEx { + unsigned char ChannelXNum; + unsigned char ChannelYNum; + unsigned char KeyNum; + unsigned char KeyNumTotal; + bool bLeftKey1; + bool bLeftKey2; + bool bLeftKey3; + bool bRightKey1; + bool bRightKey2; + bool bRightKey3; +}; +extern struct structSCapConfEx g_stSCapConfEx; + +enum NORMALIZE_Type { + Overall_Normalize = 0, + Auto_Normalize = 1, +}; + +enum PROOF_TYPE { + Proof_Normal, + Proof_Level0, + Proof_NoWaterProof, +}; + +/*----------------------------------------------------------- +IC Capacitance Type 0:Self Capacitance, 1:Mutual Capacitance, 2:IDC +-----------------------------------------------------------*/ +enum enum_Report_Protocol_Type { + Self_Capacitance = 0, + Mutual_Capacitance = 1, + IDC_Capacitance = 2, +}; + +#if (FTS_CHIP_TEST_TYPE == FT6X36_TEST) +#define IC_Capacitance_Type 0 +#elif ((FTS_CHIP_TEST_TYPE == FT3C47_TEST) || (FTS_CHIP_TEST_TYPE == FT5822_TEST) || (FTS_CHIP_TEST_TYPE == FT5X46_TEST) || (FTS_CHIP_TEST_TYPE == FT3D47_TEST)) +#define IC_Capacitance_Type 1 +#elif ((FTS_CHIP_TEST_TYPE == FT8606_TEST) || (FTS_CHIP_TEST_TYPE == FT8607_TEST) || (FTS_CHIP_TEST_TYPE == FT8716_TEST) || (FTS_CHIP_TEST_TYPE == FT8736_TEST) || (FTS_CHIP_TEST_TYPE == FTE716_TEST) || (FTS_CHIP_TEST_TYPE == FTE736_TEST) || (FTS_CHIP_TEST_TYPE == FT8006_TEST)) +#define IC_Capacitance_Type 2 +#endif + + + + +extern struct stCfg_MCap_DetailThreshold g_stCfg_MCap_DetailThreshold; +extern struct stCfg_SCap_DetailThreshold g_stCfg_SCap_DetailThreshold; +extern struct stCfg_Incell_DetailThreshold g_stCfg_Incell_DetailThreshold; + + +extern int g_TestItemNum;/*test item num*/ +extern char g_strIcName[20];/*IC Name*/ +extern char *g_pStoreAllData; + +int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile); +void focal_msleep(int ms); +void SysDelay(int ms); +int focal_abs(int value); + + +void OnInit_InterfaceCfg(char *strIniFile); + +int ReadReg(unsigned char RegAddr, unsigned char *RegData); +int WriteReg(unsigned char RegAddr, unsigned char RegData); +unsigned char Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead); + +unsigned char EnterWork(void); +unsigned char EnterFactory(void); + +void fts_SetTestItemCodeName(unsigned char ucitemcode); + +extern void *fts_malloc(size_t size); +extern void fts_free(void *p); + +extern int InitTest(void); +extern void FinishTest(void); +extern void InitStoreParamOfTestData(void); +extern void MergeAllTestData(void); +extern int AllocateMemory(void); +extern void FreeMemory(void); + +extern char *g_pTmpBuff; +extern char *g_pStoreMsgArea; +extern int g_lenStoreMsgArea; +extern char *g_pMsgAreaLine2; +extern int g_lenMsgAreaLine2; +extern char *g_pStoreDataArea; +extern int g_lenStoreDataArea; +extern unsigned char m_ucTestItemCode; +extern int m_iStartLine; +extern int m_iTestDataCount; + +extern char *TestResult ; +extern int TestResultLen; + +#define FOCAL_TEST_DEBUG_EN 0 +#if (FOCAL_TEST_DEBUG_EN) +#define FTS_TEST_DBG(fmt, args...) do {printk(KERN_ERR "[FTS] [TEST]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_FUNC_ENTER() printk(KERN_ERR "[FTS][TEST]%s: Enter(%d)\n", __func__, __LINE__) +#define FTS_TEST_FUNC_EXIT() printk(KERN_ERR "[FTS][TEST]%s: Exit(%d)\n", __func__, __LINE__) +#else +#define FTS_TEST_DBG(fmt, args...) do {} while (0) +#define FTS_TEST_FUNC_ENTER() +#define FTS_TEST_FUNC_EXIT() +#endif + +#define FTS_TEST_INFO(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Info]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) +#define FTS_TEST_ERROR(fmt, args...) do { printk(KERN_ERR "[FTS][TEST][Error]%s. line: %d. "fmt"\n", __FUNCTION__, __LINE__, ##args); } while (0) + + + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_supported_ic.h b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_supported_ic.h new file mode 100755 index 0000000000000..7bd7ff7eb5c35 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/include/focaltech_test_supported_ic.h @@ -0,0 +1,1589 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R) All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.h +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ + +#include +#include + +#include "../focaltech_test_config.h" +#include "focaltech_test_main.h" + +#if (FTS_CHIP_TEST_TYPE == FT8716_TEST) + +struct stCfg_FT8716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + +}; +struct stCfg_FT8716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + bool bCBTest_VKey_DCheck_Check; + int CbTest_Min_DCheck_Vkey; + int CbTest_Max_DCheck_Vkey; + + bool bLcdBusyAdjust; + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + int LCDNoiseTest_SequenceFrame; + int LCDNoiseTest_MaxFrame; + +}; +enum enumTestItem_FT8716 { + Code_FT8716_ENTER_FACTORY_MODE, + Code_FT8716_DOWNLOAD, + Code_FT8716_UPGRADE, + Code_FT8716_FACTORY_ID_TEST, + Code_FT8716_PROJECT_CODE_TEST, + Code_FT8716_FW_VERSION_TEST, + Code_FT8716_IC_VERSION_TEST, + Code_FT8716_RAWDATA_TEST, + Code_FT8716_CHANNEL_NUM_TEST, + + Code_FT8716_INT_PIN_TEST, + Code_FT8716_RESET_PIN_TEST, + Code_FT8716_NOISE_TEST, + Code_FT8716_CB_TEST, + + + Code_FT8716_WRITE_CONFIG, + + Code_FT8716_SHORT_CIRCUIT_TEST, + Code_FT8716_OPEN_TEST, + Code_FT8716_CB_UNIFORMITY_TEST, + Code_FT8716_DIFFER_UNIFORMITY_TEST, + Code_FT8716_DIFFER2_UNIFORMITY_TEST, + Code_FT8716_LCD_NOISE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT3D47_TEST) + +struct stCfg_FT3D47_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + + bool FORCETOUCH_CHANNEL_NUM_TEST; + bool FORCETOUCH_RAWDATA_TEST; + bool FORCETOUCH_CB_TEST; + bool FORCETOUCH_WEAK_SHORT_CIRCUIT_TEST; + bool FORCETOUCH_FLATNESS_TEST; +}; + +struct stCfg_FT3D47_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int ForceTouch_ChannelNumTest_ChannelNum; + + int ForceTouch_SCapRawDataTest_OFF_Min; + int ForceTouch_SCapRawDataTest_OFF_Max; + int ForceTouch_SCapRawDataTest_ON_Min; + int ForceTouch_SCapRawDataTest_ON_Max; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_ON; + + int ForceTouch_SCapCbTest_OFF_Min; + int ForceTouch_SCapCbTest_OFF_Max; + int ForceTouch_SCapCbTest_ON_Min; + int ForceTouch_SCapCbTest_ON_Max; + BYTE ForceTouch_SCapCBTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapCBTest_SetWaterproof_ON; + + int ForceTouch_WeakShortTest_CG; + int ForceTouch_WeakShortTest_CC; + bool bForceTouch_WeakShortTest_CapShortTest; + + int ForceTouch_FlatnessTest_Differ_Threshold; + int ForceTouch_FlatnessTest_Differ_Coefficient; + bool ForceTouch_FlatnessTest_Differ_Threshold_Check; + bool ForceTouch_FlatnessTest_Differ_Coefficient_Check; + +}; +enum enumTestItem_FT3D47 { + Code_FT3D47_ENTER_FACTORY_MODE, + Code_FT3D47_DOWNLOAD, + Code_FT3D47_UPGRADE, + Code_FT3D47_FACTORY_ID_TEST, + Code_FT3D47_PROJECT_CODE_TEST, + Code_FT3D47_FW_VERSION_TEST, + Code_FT3D47_IC_VERSION_TEST, + Code_FT3D47_RAWDATA_TEST, + Code_FT3D47_ADCDETECT_TEST, + Code_FT3D47_SCAP_CB_TEST, + Code_FT3D47_SCAP_RAWDATA_TEST, + Code_FT3D47_CHANNEL_NUM_TEST, + Code_FT3D47_INT_PIN_TEST, + Code_FT3D47_RESET_PIN_TEST, + Code_FT3D47_NOISE_TEST, + Code_FT3D47_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3D47_UNIFORMITY_TEST, + Code_FT3D47_CM_TEST, + Code_FT3D47_RAWDATA_MARGIN_TEST, + Code_FT3D47_WRITE_CONFIG, + Code_FT3D47_PANELDIFFER_TEST, + Code_FT3D47_PANELDIFFER_UNIFORMITY_TEST, + Code_FT3D47_LCM_ID_TEST, + Code_FT3D47_JUDEG_NORMALIZE_TYPE, + Code_FT3D47_TE_TEST, + Code_FT3D47_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT3D47_PATTERN_TEST, + + Code_FT3D47_GPIO_TEST, + Code_FT3D47_LCD_NOISE_TEST, + Code_FT3D47_FORCE_TOUCH_CHANNEL_NUM_TEST, + Code_FT3D47_FORCE_TOUCH_SCAP_RAWDATA_TEST, + Code_FT3D47_FORCE_TOUCH_SCAP_CB_TEST, + Code_FT3D47_FORCE_TOUCH_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3D47_FORCE_TOUCH_FLATNESS_TEST, +}; + + +#elif (FTS_CHIP_TEST_TYPE == FT8607_TEST) + +struct stCfg_FT8607_TESTItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool OPEN_TEST; +}; + +struct stCfg_FT8607_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMax; + + int iLCDNoiseCoefficient; + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Open_Test_CBMin; +}; + + +enum enumTestItem_FT8607 { + Code_FT8607_ENTER_FACTORY_MODE, + Code_FT8607_DOWNLOAD, + Code_FT8607_UPGRADE, + Code_FT8607_FACTORY_ID_TEST, + Code_FT8607_PROJECT_CODE_TEST, + Code_FT8607_FW_VERSION_TEST, + Code_FT8607_IC_VERSION_TEST, + Code_FT8607_RAWDATA_TEST, + Code_FT8607_CHANNEL_NUM_TEST, + + Code_FT8607_INT_PIN_TEST, + Code_FT8607_RESET_PIN_TEST, + Code_FT8607_NOISE_TEST, + Code_FT8607_CB_TEST, + + + Code_FT8607_WRITE_CONFIG, + + Code_FT8607_SHORT_CIRCUIT_TEST, + Code_FT8607_LCD_NOISE_TEST, + + Code_FT8607_OSC60MHZ_TEST, + Code_FT8607_OSCTRM_TEST, + Code_FT8607_SNR_TEST, + Code_FT8607_DIFFER_TEST, + Code_FT8607_DIFFER_UNIFORMITY_TEST, + + Code_FT8607_LPWG_RAWDATA_TEST, + Code_FT8607_LPWG_CB_TEST, + Code_FT8607_LPWG_NOISE_TEST, + + Code_FT8607_OPEN_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT5X46_TEST) +/*----------------------------------------------- +FT5X46 and FT5X22 is the same series of chips +FT5422\FT5X22 is the chip code for internally develope +FT5X46 is the chip code for market +------------------------------------------------*/ +struct stCfg_FT5X46_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + bool PANEL_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + bool GPIO_TEST; + bool LCD_NOISE_TEST; +}; +struct stCfg_FT5X46_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int Lcd_Noise_MaxFrame; + int Lcd_Noise_Conficient; + int Lcd_Noise_Noise_Mode; + int Lcd_Noise_MaxNgPoint; + int Lcd_Noise_FrameNum; + + bool Lcd_Noise_NoiseThresholdMode; + int Lcd_Noise_NoiseCoefficient; + int Lcd_Noise_NoiseMax; + int Lcd_Noise_SetFrequency; +}; +enum enumTestItem_FT5X46 { + Code_FT5X46_ENTER_FACTORY_MODE, + Code_FT5X46_DOWNLOAD, + Code_FT5X46_UPGRADE, + Code_FT5X46_FACTORY_ID_TEST, + Code_FT5X46_PROJECT_CODE_TEST, + Code_FT5X46_FW_VERSION_TEST, + Code_FT5X46_IC_VERSION_TEST, + Code_FT5X46_RAWDATA_TEST, + Code_FT5X46_ADCDETECT_TEST, + Code_FT5X46_SCAP_CB_TEST, + Code_FT5X46_SCAP_RAWDATA_TEST, + Code_FT5X46_CHANNEL_NUM_TEST, + Code_FT5X46_INT_PIN_TEST, + Code_FT5X46_RESET_PIN_TEST, + Code_FT5X46_NOISE_TEST, + Code_FT5X46_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5X46_UNIFORMITY_TEST, + Code_FT5X46_CM_TEST, + Code_FT5X46_RAWDATA_MARGIN_TEST, + Code_FT5X46_WRITE_CONFIG, + Code_FT5X46_PANELDIFFER_TEST, + Code_FT5X46_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5X46_LCM_ID_TEST, + Code_FT5X46_JUDEG_NORMALIZE_TYPE, + Code_FT5X46_TE_TEST, + Code_FT5X46_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5X46_PATTERN_TEST, + Code_FT5X46_GPIO_TEST, + Code_FT5X46_LCD_NOISE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT6X36_TEST) + +struct stCfg_FT6X36_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool CHANNEL_SHORT_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool DELTA_CB_TEST; + bool CHANNELS_DEVIATION_TEST; + bool TWO_SIDES_DEVIATION_TEST; + bool FPC_SHORT_TEST; + bool FPC_OPEN_TEST; + bool SREF_OPEN_TEST; + bool TE_TEST; + bool CB_DEVIATION_TEST; + bool DIFFER_TEST; + bool WEAK_SHORT_TEST; + bool DIFFER_TEST2; + bool K1_DIFFER_TEST; +}; + +struct stCfg_FT6X36_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelNum; + BYTE ChannelNumTest_KeyNum; + int ChannelShortTest_K1; + int ChannelShortTest_K2; + int ChannelShortTest_CB; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int WeakShortThreshold; + int NoiseTest_Max; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int FPCShort_CB_Min; + int FPCShort_CB_Max; + int FPCShort_RawData_Min; + int FPCShort_RawData_Max; + int FPCOpen_CB_Min; + int FPCOpen_CB_Max; + int FPCOpen_RawData_Min; + int FPCOpen_RawData_Max; + int SREFOpen_Hole_Base1; + int SREFOpen_Hole_Base2; + int SREFOpen_Hole; + int CBDeviationTest_Hole; + int Differ_Ave_Hole; + int Differ_Max_Hole; + int CbTest_Min; + int CbTest_Max; + int DeltaCbTest_Base; + int DeltaCbTest_Differ_Max; + bool DeltaCbTest_Include_Key_Test; + int DeltaCbTest_Key_Differ_Max; + int DeltaCbTest_Deviation_S1; + int DeltaCbTest_Deviation_S2; + int DeltaCbTest_Deviation_S3; + int DeltaCbTest_Deviation_S4; + int DeltaCbTest_Deviation_S5; + int DeltaCbTest_Deviation_S6; + bool DeltaCbTest_Set_Critical; + int DeltaCbTest_Critical_S1; + int DeltaCbTest_Critical_S2; + int DeltaCbTest_Critical_S3; + int DeltaCbTest_Critical_S4; + int DeltaCbTest_Critical_S5; + int DeltaCbTest_Critical_S6; + + int ChannelsDeviationTest_Deviation_S1; + int ChannelsDeviationTest_Deviation_S2; + int ChannelsDeviationTest_Deviation_S3; + int ChannelsDeviationTest_Deviation_S4; + int ChannelsDeviationTest_Deviation_S5; + int ChannelsDeviationTest_Deviation_S6; + bool ChannelsDeviationTest_Set_Critical; + int ChannelsDeviationTest_Critical_S1; + int ChannelsDeviationTest_Critical_S2; + int ChannelsDeviationTest_Critical_S3; + int ChannelsDeviationTest_Critical_S4; + int ChannelsDeviationTest_Critical_S5; + int ChannelsDeviationTest_Critical_S6; + + int TwoSidesDeviationTest_Deviation_S1; + int TwoSidesDeviationTest_Deviation_S2; + int TwoSidesDeviationTest_Deviation_S3; + int TwoSidesDeviationTest_Deviation_S4; + int TwoSidesDeviationTest_Deviation_S5; + int TwoSidesDeviationTest_Deviation_S6; + bool TwoSidesDeviationTest_Set_Critical; + int TwoSidesDeviationTest_Critical_S1; + int TwoSidesDeviationTest_Critical_S2; + int TwoSidesDeviationTest_Critical_S3; + int TwoSidesDeviationTest_Critical_S4; + int TwoSidesDeviationTest_Critical_S5; + int TwoSidesDeviationTest_Critical_S6; + + int DifferTest2_Data_H_Min; + int DifferTest2_Data_H_Max; + int DifferTest2_Data_M_Min; + int DifferTest2_Data_M_Max; + int DifferTest2_Data_L_Min; + int DifferTest2_Data_L_Max; + bool bDifferTest2_Data_H; + bool bDifferTest2_Data_M; + bool bDifferTest2_Data_L; + int K1DifferTest_StartK1; + int K1DifferTest_EndK1; + int K1DifferTest_MinHold2; + int K1DifferTest_MaxHold2; + int K1DifferTest_MinHold4; + int K1DifferTest_MaxHold4; + int K1DifferTest_Deviation2; + int K1DifferTest_Deviation4; +}; + +enum enumTestItem_FT6X36 { + Code_FT6X36_ENTER_FACTORY_MODE, + Code_FT6X36_DOWNLOAD, + Code_FT6X36_UPGRADE, + Code_FT6X36_FACTORY_ID_TEST, + Code_FT6X36_PROJECT_CODE_TEST, + Code_FT6X36_FW_VERSION_TEST, + Code_FT6X36_IC_VERSION_TEST, + Code_FT6X36_RAWDATA_TEST, + Code_FT6X36_CHANNEL_NUM_TEST, + Code_FT6X36_CHANNEL_SHORT_TEST, + Code_FT6X36_INT_PIN_TEST, + Code_FT6X36_RESET_PIN_TEST, + Code_FT6X36_NOISE_TEST, + Code_FT6X36_CB_TEST, + Code_FT6X36_DELTA_CB_TEST, + Code_FT6X36_CHANNELS_DEVIATION_TEST, + Code_FT6X36_TWO_SIDES_DEVIATION_TEST, + Code_FT6X36_FPC_SHORT_TEST, + Code_FT6X36_FPC_OPEN_TEST, + Code_FT6X36_SREF_OPEN_TEST, + Code_FT6X36_TE_TEST, + Code_FT6X36_CB_DEVIATION_TEST, + Code_FT6X36_WRITE_CONFIG, + Code_FT6X36_DIFFER_TEST, + Code_FT6X36_WEAK_SHORT_TEST, + Code_FT6X36_DIFFER_TEST2, + Code_FT6X36_K1_DIFFER_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT5822_TEST) + +struct stCfg_FT5822_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; +}; +struct stCfg_FT5822_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; +}; +enum enumTestItem_FT5822 { + Code_FT5822_ENTER_FACTORY_MODE, + Code_FT5822_DOWNLOAD, + Code_FT5822_UPGRADE, + Code_FT5822_FACTORY_ID_TEST, + Code_FT5822_PROJECT_CODE_TEST, + Code_FT5822_FW_VERSION_TEST, + Code_FT5822_IC_VERSION_TEST, + Code_FT5822_RAWDATA_TEST, + Code_FT5822_ADCDETECT_TEST, + Code_FT5822_SCAP_CB_TEST, + Code_FT5822_SCAP_RAWDATA_TEST, + Code_FT5822_CHANNEL_NUM_TEST, + Code_FT5822_INT_PIN_TEST, + Code_FT5822_RESET_PIN_TEST, + Code_FT5822_NOISE_TEST, + Code_FT5822_WEAK_SHORT_CIRCUIT_TEST, + Code_FT5822_UNIFORMITY_TEST, + Code_FT5822_CM_TEST, + Code_FT5822_RAWDATA_MARGIN_TEST, + Code_FT5822_WRITE_CONFIG, + Code_FT5822_PANELDIFFER_TEST, + Code_FT5822_PANELDIFFER_UNIFORMITY_TEST, + Code_FT5822_LCM_ID_TEST, + Code_FT5822_JUDEG_NORMALIZE_TYPE, + Code_FT5822_TE_TEST, + Code_FT5822_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT5822_PATTERN_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT8006_TEST) + +struct stCfg_FT8006_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool SNR_TEST; + bool LPWG_RAWDATA_TEST; + bool LPWG_CB_TEST; + bool LPWG_NOISE_TEST; + bool DIFFER_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_TEST; + +}; +struct stCfg_FT8006_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + BYTE IsDifferMode; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + int ShortCircuit_ResMin; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; + int SNRTest_FrameNum; + int SNRTest_Min; + + int DIFFERTest_FrameNum; + int DIFFERTest_DifferMax; + int DIFFERTest_DifferMin; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + + int LPWG_RawDataTest_Min; + int LPWG_RawDataTest_Max; + + bool bLPWG_CBTest_VA_Check; + int LPWG_CbTest_Min; + int LPWG_CbTest_Max; + bool bLPWG_CBTest_VKey_Check; + int LPWG_CbTest_Min_Vkey; + int LPWG_CbTest_Max_Vkey; + + int LPWG_NoiseTest_Coefficient; + int LPWG_NoiseTest_Frames; + int LPWG_NoiseTest_Time; + BYTE LPWG_NoiseTest_SampeMode; + BYTE LPWG_NoiseTest_NoiseMode; + BYTE LPWG_NoiseTest_ShowTip; + BYTE LPWG_IsDifferMode; + + int Differ2Test_Min; + int Differ2Test_Max; + +}; +enum enumTestItem_FT8006 { + Code_FT8006_ENTER_FACTORY_MODE, + Code_FT8006_DOWNLOAD, + Code_FT8006_UPGRADE, + Code_FT8006_FACTORY_ID_TEST, + Code_FT8006_PROJECT_CODE_TEST, + Code_FT8006_FW_VERSION_TEST, + Code_FT8006_IC_VERSION_TEST, + Code_FT8006_RAWDATA_TEST, + Code_FT8006_CHANNEL_NUM_TEST, + Code_FT8006_INT_PIN_TEST, + Code_FT8006_RESET_PIN_TEST, + Code_FT8006_NOISE_TEST, + Code_FT8006_CB_TEST, + Code_FT8006_WRITE_CONFIG, + Code_FT8006_SHORT_CIRCUIT_TEST, + Code_FT8006_LCD_NOISE_TEST, + + Code_FT8006_OSC60MHZ_TEST, + Code_FT8006_OSCTRM_TEST, + Code_FT8006_SNR_TEST, + Code_FT8006_DIFFER_TEST, + Code_FT8006_DIFFER_UNIFORMITY_TEST, + + Code_FT8006_LPWG_RAWDATA_TEST, + Code_FT8006_LPWG_CB_TEST, + Code_FT8006_LPWG_NOISE_TEST, + Code_FT8006_DIFFER2_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FT8736_TEST) + +struct stCfg_FT8736_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool CB_DECREASE_TEST; + bool VREF_DECREASE_TEST; +}; +struct stCfg_FT8736_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + int LCDNoiseTest_Coefficient_Key; + BYTE LCDNoiseTest_NoiseMode; + + int CBDecrease_Step; + int CBDecrease_OrgMin; + int CBDecrease_OrgMax; + int CBDecrease_CalcMin; + int CBDecrease_CalcMax; + + int VRefDecrease_StepBegin; + int VRefDecrease_StepEnd; + int VRefDecrease_OrgMin; + int VRefDecrease_OrgMax; + int VRefDecrease_CalcMin; + int VRefDecrease_CalcMax; +}; + +enum enumTestItem_FT8736 { + Code_FT8736_ENTER_FACTORY_MODE, + Code_FT8736_DOWNLOAD, + Code_FT8736_UPGRADE, + Code_FT8736_FACTORY_ID_TEST, + Code_FT8736_PROJECT_CODE_TEST, + Code_FT8736_FW_VERSION_TEST, + Code_FT8736_IC_VERSION_TEST, + Code_FT8736_RAWDATA_TEST, + Code_FT8736_CHANNEL_NUM_TEST, + + Code_FT8736_INT_PIN_TEST, + Code_FT8736_RESET_PIN_TEST, + Code_FT8736_NOISE_TEST, + Code_FT8736_CB_TEST, + + + Code_FT8736_WRITE_CONFIG, + + Code_FT8736_SHORT_CIRCUIT_TEST, + Code_FT8736_OPEN_TEST, + Code_FT8736_CB_UNIFORMITY_TEST, + Code_FT8736_DIFFER_UNIFORMITY_TEST, + Code_FT8736_DIFFER2_UNIFORMITY_TEST, + Code_FT8736_LCD_NOISE_TEST, + Code_FT8736_CB_DECREASE_TEST, + Code_FT8736_VREF_DECREASE_TEST, + Code_FT8736_IC_TYPE_TEST, +}; + +#elif (FTS_CHIP_TEST_TYPE == FTE716_TEST) +struct stCfg_FTE716_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool ICTYPE_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool OPEN_TEST; + bool CB_UNIFORMITY_TEST; + bool DIFFER_UNIFORMITY_TEST; + bool DIFFER2_UNIFORMITY_TEST; + bool LCD_NOISE_TEST; + bool GPIO_TEST; +}; +struct stCfg_FTE716_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + bool bOri_ProjectCode; + BYTE IC_Version; + bool bRawDataTest_VA_Check; + int RawDataTest_Min; + int RawDataTest_Max; + bool bRawDataTest_VKey_Check; + int RawDataTest_Min_VKey; + int RawDataTest_Max_VKey; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bCBTest_VA_Check; + int CbTest_Min; + int CbTest_Max; + bool bCBTest_VKey_Check; + int CbTest_Min_Vkey; + int CbTest_Max_Vkey; + + int ShortCircuit_ResMin; + + int OpenTest_CBMin; + bool OpenTest_Check_K1; + int OpenTest_K1Threshold; + bool OpenTest_Check_K2; + int OpenTest_K2Threshold; + + bool CBUniformityTest_Check_CHX; + bool CBUniformityTest_Check_CHY; + bool CBUniformityTest_Check_MinMax; + int CBUniformityTest_CHX_Hole; + int CBUniformityTest_CHY_Hole; + int CBUniformityTest_MinMax_Hole; + + bool DifferUniformityTest_Check_CHX; + bool DifferUniformityTest_Check_CHY; + bool DifferUniformityTest_Check_MinMax; + int DifferUniformityTest_CHX_Hole; + int DifferUniformityTest_CHY_Hole; + int DifferUniformityTest_MinMax_Hole; + int DeltaVol; + + bool Differ2UniformityTest_Check_CHX; + bool Differ2UniformityTest_Check_CHY; + int Differ2UniformityTest_CHX_Hole; + int Differ2UniformityTest_CHY_Hole; + int Differ2UniformityTest_Differ_Min; + int Differ2UniformityTest_Differ_Max; + + int LCDNoiseTest_FrameNum; + int LCDNoiseTest_Coefficient; + BYTE LCDNoiseTest_NoiseMode; +}; + +enum enumTestItem_FTE716 { + Code_FTE716_ENTER_FACTORY_MODE, + Code_FTE716_DOWNLOAD, + Code_FTE716_UPGRADE, + Code_FTE716_FACTORY_ID_TEST, + Code_FTE716_PROJECT_CODE_TEST, + Code_FTE716_FW_VERSION_TEST, + Code_FTE716_IC_VERSION_TEST, + Code_FTE716_RAWDATA_TEST, + Code_FTE716_CHANNEL_NUM_TEST, + + Code_FTE716_INT_PIN_TEST, + Code_FTE716_RESET_PIN_TEST, + Code_FTE716_NOISE_TEST, + Code_FTE716_CB_TEST, + + + Code_FTE716_WRITE_CONFIG, + + Code_FTE716_SHORT_CIRCUIT_TEST, + Code_FTE716_OPEN_TEST, + Code_FTE716_CB_UNIFORMITY_TEST, + Code_FTE716_DIFFER_UNIFORMITY_TEST, + Code_FTE716_DIFFER2_UNIFORMITY_TEST, + Code_FTE716_LCD_NOISE_TEST, + Code_FTE716_GPIO_TEST, + Code_FTE716_IC_TYPE_TEST, +}; +#elif(FTS_CHIP_TEST_TYPE == FT8606_TEST) + +struct stCfg_FT8606_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool CB_TEST; + bool SHORT_CIRCUIT_TEST; + bool LCD_NOISE_TEST; + bool OSC60MHZ_TEST; + bool OSCTRM_TEST; + bool IVSN_TEST; +}; +struct stCfg_FT8606_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + int RawDataTest_Min; + int RawDataTest_Max; + BYTE ChannelNumTest_ChannelXNum; + BYTE ChannelNumTest_ChannelYNum; + BYTE ChannelNumTest_KeyNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + int NoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + int CbTest_Min; + int CbTest_Max; + int ShortTest_Max; + int ShortTest_K2Value; + bool ShortTest_Tip; + bool IsDifferMode; + int iLCDNoiseTestFrame; + int iLCDNoiseTestMaxScreen; + int iLCDNoiseTestMaxFrame; + int iLCDNoiseCoefficient; + + int OSC60MHZTest_OSCMin; + int OSC60MHZTest_OSCMax; + + int OSCTRMTest_OSCMin; + int OSCTRMTest_OSCMax; + int OSCTRMTest_OSCDetMin; + int OSCTRMTest_OSCDetMax; +}; + + +enum enumTestItem_FT8606 { + Code_FT8606_ENTER_FACTORY_MODE, + Code_FT8606_DOWNLOAD, + Code_FT8606_UPGRADE, + Code_FT8606_FACTORY_ID_TEST, + Code_FT8606_PROJECT_CODE_TEST, + Code_FT8606_FW_VERSION_TEST, + Code_FT8606_IC_VERSION_TEST, + Code_FT8606_RAWDATA_TEST, + Code_FT8606_CHANNEL_NUM_TEST, + + Code_FT8606_INT_PIN_TEST, + Code_FT8606_RESET_PIN_TEST, + Code_FT8606_NOISE_TEST, + Code_FT8606_CB_TEST, + + + Code_FT8606_WRITE_CONFIG, + + Code_FT8606_SHORT_CIRCUIT_TEST, + Code_FT8606_LCD_NOISE_TEST, + Code_FT8606_OSC60MHZ_TEST, + Code_FT8606_OSCTRM_TEST, + Code_FT8606_IVSN_TEST, +}; +#elif(FTS_CHIP_TEST_TYPE == FT3C47_TEST) + +struct stCfg_FT3C47_TestItem { + bool FW_VERSION_TEST; + bool FACTORY_ID_TEST; + bool PROJECT_CODE_TEST; + bool IC_VERSION_TEST; + bool RAWDATA_TEST; + bool ADC_DETECT_TEST; + bool SCAP_CB_TEST; + bool SCAP_RAWDATA_TEST; + bool CHANNEL_NUM_TEST; + bool INT_PIN_TEST; + bool RESET_PIN_TEST; + bool NOISE_TEST; + bool WEAK_SHORT_CIRCUIT_TEST; + bool UNIFORMITY_TEST; + bool CM_TEST; + + bool RAWDATA_MARGIN_TEST; + bool PANEL_DIFFER_TEST; + bool PANEL_DIFFER_UNIFORMITY_TEST; + + bool LCM_ID_TEST; + + bool TE_TEST; + bool SITO_RAWDATA_UNIFORMITY_TEST; + bool PATTERN_TEST; + + bool FORCETOUCH_CHANNEL_NUM_TEST; + bool FORCETOUCH_RAWDATA_TEST; + bool FORCETOUCH_CB_TEST; + bool FORCETOUCH_WEAK_SHORT_CIRCUIT_TEST; + bool FORCETOUCH_FLATNESS_TEST; +}; + +struct stCfg_FT3C47_BasicThreshold { + BYTE FW_VER_VALUE; + BYTE Factory_ID_Number; + char Project_Code[32]; + BYTE IC_Version; + BYTE LCM_ID; + int RawDataTest_low_Min; + int RawDataTest_Low_Max; + int RawDataTest_high_Min; + int RawDataTest_high_Max; + BYTE RawDataTest_SetLowFreq; + BYTE RawDataTest_SetHighFreq; + int AdcDetect_Max; + + int SCapCbTest_OFF_Min; + int SCapCbTest_OFF_Max; + int SCapCbTest_ON_Min; + int SCapCbTest_ON_Max; + bool SCapCbTest_LetTx_Disable; + BYTE SCapCbTest_SetWaterproof_OFF; + BYTE SCapCbTest_SetWaterproof_ON; + int SCapRawDataTest_OFF_Min; + int SCapRawDataTest_OFF_Max; + int SCapRawDataTest_ON_Min; + int SCapRawDataTest_ON_Max; + bool SCapRawDataTest_LetTx_Disable; + BYTE SCapRawDataTest_SetWaterproof_OFF; + BYTE SCapRawDataTest_SetWaterproof_ON; + bool bChannelTestMapping; + bool bChannelTestNoMapping; + BYTE ChannelNumTest_TxNum; + BYTE ChannelNumTest_RxNum; + BYTE ChannelNumTest_TxNpNum; + BYTE ChannelNumTest_RxNpNum; + BYTE ResetPinTest_RegAddr; + BYTE IntPinTest_RegAddr; + BYTE IntPinTest_TestNum; + int NoiseTest_Max; + int GloveNoiseTest_Coefficient; + int NoiseTest_Frames; + int NoiseTest_Time; + BYTE NoiseTest_SampeMode; + BYTE NoiseTest_NoiseMode; + BYTE NoiseTest_ShowTip; + bool bNoiseTest_GloveMode; + int NoiseTest_RawdataMin; + unsigned char Set_Frequency; + bool bNoiseThreshold_Choose; + int NoiseTest_Threshold; + int NoiseTest_MinNgFrame; + int WeakShortTest_CG; + int WeakShortTest_CC; + int WeakShortTest_CC_Rsen; + bool WeakShortTest_CapShortTest; + + bool Uniformity_CheckTx; + bool Uniformity_CheckRx; + bool Uniformity_CheckMinMax; + int Uniformity_Tx_Hole; + int Uniformity_Rx_Hole; + int Uniformity_MinMax_Hole; + bool CMTest_CheckMin; + bool CMTest_CheckMax; + int CMTest_MinHole; + int CMTest_MaxHole; + + int RawdataMarginTest_Min; + int RawdataMarginTest_Max; + + int PanelDifferTest_Min; + int PanelDifferTest_Max; + + bool PanelDiffer_UniformityTest_Check_Tx; + bool PanelDiffer_UniformityTest_Check_Rx; + bool PanelDiffer_UniformityTest_Check_MinMax; + int PanelDiffer_UniformityTest_Tx_Hole; + int PanelDiffer_UniformityTest_Rx_Hole; + int PanelDiffer_UniformityTest_MinMax_Hole; + + bool SITO_RawdtaUniformityTest_Check_Tx; + bool SITO_RawdtaUniformityTest_Check_Rx; + int SITO_RawdtaUniformityTest_Tx_Hole; + int SITO_RawdtaUniformityTest_Rx_Hole; + + bool bPattern00; + bool bPatternFF; + bool bPattern55; + bool bPatternAA; + bool bPatternBin; + + int ForceTouch_ChannelNumTest_ChannelNum; + + int ForceTouch_SCapRawDataTest_OFF_Min; + int ForceTouch_SCapRawDataTest_OFF_Max; + int ForceTouch_SCapRawDataTest_ON_Min; + int ForceTouch_SCapRawDataTest_ON_Max; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapRawDataTest_SetWaterproof_ON; + + int ForceTouch_SCapCbTest_OFF_Min; + int ForceTouch_SCapCbTest_OFF_Max; + int ForceTouch_SCapCbTest_ON_Min; + int ForceTouch_SCapCbTest_ON_Max; + BYTE ForceTouch_SCapCBTest_SetWaterproof_OFF; + BYTE ForceTouch_SCapCBTest_SetWaterproof_ON; + + int ForceTouch_WeakShortTest_CG; + int ForceTouch_WeakShortTest_CC; + bool bForceTouch_WeakShortTest_CapShortTest; + + int ForceTouch_FlatnessTest_Differ_Threshold; + int ForceTouch_FlatnessTest_Differ_Coefficient; + bool ForceTouch_FlatnessTest_Differ_Threshold_Check; + bool ForceTouch_FlatnessTest_Differ_Coefficient_Check; + +}; +enum enumTestItem_FT3C47 { + Code_FT3C47_ENTER_FACTORY_MODE, + Code_FT3C47_DOWNLOAD, + Code_FT3C47_UPGRADE, + Code_FT3C47_FACTORY_ID_TEST, + Code_FT3C47_PROJECT_CODE_TEST, + Code_FT3C47_FW_VERSION_TEST, + Code_FT3C47_IC_VERSION_TEST, + Code_FT3C47_RAWDATA_TEST, + Code_FT3C47_ADCDETECT_TEST, + Code_FT3C47_SCAP_CB_TEST, + Code_FT3C47_SCAP_RAWDATA_TEST, + Code_FT3C47_CHANNEL_NUM_TEST, + Code_FT3C47_INT_PIN_TEST, + Code_FT3C47_RESET_PIN_TEST, + Code_FT3C47_NOISE_TEST, + Code_FT3C47_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_UNIFORMITY_TEST, + Code_FT3C47_CM_TEST, + Code_FT3C47_RAWDATA_MARGIN_TEST, + Code_FT3C47_WRITE_CONFIG, + Code_FT3C47_PANELDIFFER_TEST, + Code_FT3C47_PANELDIFFER_UNIFORMITY_TEST, + Code_FT3C47_LCM_ID_TEST, + Code_FT3C47_JUDEG_NORMALIZE_TYPE, + Code_FT3C47_TE_TEST, + Code_FT3C47_SITO_RAWDATA_UNIFORMITY_TEST, + Code_FT3C47_PATTERN_TEST, + + Code_FT3C47_GPIO_TEST, + Code_FT3C47_LCD_NOISE_TEST, + Code_FT3C47_FORCE_TOUCH_CHANNEL_NUM_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_RAWDATA_TEST, + Code_FT3C47_FORCE_TOUCH_SCAP_CB_TEST, + Code_FT3C47_FORCE_TOUCH_WEAK_SHORT_CIRCUIT_TEST, + Code_FT3C47_FORCE_TOUCH_FLATNESS_TEST, +}; +#endif + + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/Makefile b/drivers/input/touchscreen/FT8716/focaltech_test/src/Makefile new file mode 100755 index 0000000000000..cb7b431f884c6 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/Makefile @@ -0,0 +1,12 @@ +#drivers/input/touchscreen/focaltech_touch/focaltech_test/src +# +# Makefile for test module +# +# Linux driver folder + +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_main.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_ini.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_global.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_detail_threshold.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_ic_table.o diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_ic_table.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_ic_table.c new file mode 100755 index 0000000000000..9c6db37efbfd1 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_ic_table.c @@ -0,0 +1,534 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/***************************************************************************** +* +* File Name: Focaltech_ic_table.c +* +* Author: Xu YF & ZR, Software Department, FocalTech +* +* Created: 2016-03-17 +* +* Modify: +* +* Abstract: +* +* Reference: +* +*****************************************************************************/ + +/***************************************************************************** +* 1.Included header files +*****************************************************************************/ + +#include +#include +#include "../include/focaltech_ic_table.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define FOCALTECH_IC_TABLE_INFO "File Version of focaltech_ic_table.c: V1.0.0 2016-03-22" + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + + +/***************************************************************************** +* functions body +*****************************************************************************/ + + +unsigned int fts_ic_table_get_ic_code_from_ic_name(char *strIcName) +{ + + if (strncmp(strIcName, "FT5X36", 6) == 0) + return IC_FT5X36; + if (strncmp(strIcName, "FT5X36i", 7) == 0) + return IC_FT5X36i; + if (strncmp(strIcName, "FT3X16", 6) == 0) + return IC_FT3X16; + if (strncmp(strIcName, "FT3X26", 6) == 0) + return IC_FT3X26; + + if (strncmp(strIcName, "FT5X22", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46", 6) == 0) + return IC_FT5X46; + if (strncmp(strIcName, "FT5X46i", 7) == 0) + return IC_FT5X46i; + if (strncmp(strIcName, "FT5526", 6) == 0) + return IC_FT5526; + if (strncmp(strIcName, "FT3X17", 6) == 0) + return IC_FT3X17; + if (strncmp(strIcName, "FT5436", 6) == 0) + return IC_FT5436; + if (strncmp(strIcName, "FT3X27", 6) == 0) + return IC_FT3X27; + if (strncmp(strIcName, "FT5526i", 7) == 0) + return IC_FT5526I; + if (strncmp(strIcName, "FT5416", 6) == 0) + return IC_FT5416; + if (strncmp(strIcName, "FT5426", 6) == 0) + return IC_FT5426; + if (strncmp(strIcName, "FT5435", 6) == 0) + return IC_FT5435; + if (strncmp(strIcName, "FT7681", 6) == 0) + return IC_FT7681; + if (strncmp(strIcName, "FT7661", 6) == 0) + return IC_FT7661; + if (strncmp(strIcName, "FT7511", 6) == 0) + return IC_FT7511; + if (strncmp(strIcName, "FT7421", 6) == 0) + return IC_FT7421; + + + if (strncmp(strIcName, "FT6X06", 6) == 0) + return IC_FT6X06; + if (strncmp(strIcName, "FT3X06", 6) == 0) + return IC_FT3X06; + + if (strncmp(strIcName, "FT6X36", 6) == 0) + return IC_FT6X36; + if (strncmp(strIcName, "FT3X07", 6) == 0) + return IC_FT3X07; + if (strncmp(strIcName, "FT6416", 6) == 0) + return IC_FT6416; + if (strncmp(strIcName, "FT6336G/U", 9) == 0) + return IC_FT6426; + if (strncmp(strIcName, "FT6236U", 7) == 0) + return IC_FT6236U; + if (strncmp(strIcName, "FT6436U", 7) == 0) + return IC_FT6436U; + if (strncmp(strIcName, "FT3267", 6) == 0) + return IC_FT3267; + if (strncmp(strIcName, "FT3367", 6) == 0) + return IC_FT3367; + if (strncmp(strIcName, "FT7401", 6) == 0) + return IC_FT7401; + if (strncmp(strIcName, "FT3407U", 7) == 0) + return IC_FT3407U; + + + + if (strncmp(strIcName, "FT5X16", 6) == 0) + return IC_FT5X16; + if (strncmp(strIcName, "FT5X12", 6) == 0) + return IC_FT5X12; + + if (strncmp(strIcName, "FT5506", 6) == 0) + return IC_FT5506; + if (strncmp(strIcName, "FT5606", 6) == 0) + return IC_FT5606; + if (strncmp(strIcName, "FT5816", 6) == 0) + return IC_FT5816; + + if (strncmp(strIcName, "FT5822", 6) == 0) + return IC_FT5822; + if (strncmp(strIcName, "FT5626", 6) == 0) + return IC_FT5626; + if (strncmp(strIcName, "FT5726", 6) == 0) + return IC_FT5726; + if (strncmp(strIcName, "FT5826B", 7) == 0) + return IC_FT5826B; + if (strncmp(strIcName, "FT3617", 6) == 0) + return IC_FT3617; + if (strncmp(strIcName, "FT3717", 6) == 0) + return IC_FT3717; + if (strncmp(strIcName, "FT7811", 6) == 0) + return IC_FT7811; + if (strncmp(strIcName, "FT5826S", 7) == 0) + return IC_FT5826S; + + if (strncmp(strIcName, "FT5306", 6) == 0) + return IC_FT5306; + if (strncmp(strIcName, "FT5406", 6) == 0) + return IC_FT5406; + + if (strncmp(strIcName, "FT8606", 6) == 0) + return IC_FT8606; + if (strncmp(strIcName, "FT8716", 6) == 0) + return IC_FT8716; + + if (strncmp(strIcName, "FT3C47U", 7) == 0) + return IC_FT3C47U; + + if (strncmp(strIcName, "FT8607", 6) == 0) + return IC_FT8607; + if (strncmp(strIcName, "FT8707", 6) == 0) + return IC_FT8707; + + + if (strncmp(strIcName, "FT8736", 6) == 0) + return IC_FT8736; + + if (strncmp(strIcName, "FT3D47", 6) == 0) + return IC_FT3D47; + + if (strncmp(strIcName, "FTE716", 6) == 0) + return IC_FTE716; + + if (strncmp(strIcName, "FT5442", 6) == 0) + return IC_FT5442; + + if (strncmp(strIcName, "FT3428U", 7) == 0) + return IC_FT3428U; + + if (strncmp(strIcName, "FT8006M", 7) == 0) + return IC_FT8006M; + + if (strncmp(strIcName, "FT8201", 6) == 0) + return IC_FT8201; + + if (strncmp(strIcName, "FTE736", 6) == 0) + return IC_FTE736; + + printk("%s. can NOT get ic code. ERROR !!! \n", __func__); + + return 0xff; +} + + +void fts_ic_table_get_ic_name_from_ic_code(unsigned int ucIcCode, char *strIcName) +{ + if (NULL == strIcName)return; + + sprintf(strIcName, "%s", "NA");/*if can't find IC , set 'NA'*/ + + if (ucIcCode == IC_FT5X36) + sprintf(strIcName, "%s", "FT5X36"); + if (ucIcCode == IC_FT5X36i) + sprintf(strIcName, "%s", "FT5X36i"); + if (ucIcCode == IC_FT3X16) + sprintf(strIcName, "%s", "FT3X16"); + if (ucIcCode == IC_FT3X26) + sprintf(strIcName, "%s", "FT3X26"); + + + if (ucIcCode == IC_FT5X46) + sprintf(strIcName, "%s", "FT5X46"); + if (ucIcCode == IC_FT5X46i) + sprintf(strIcName, "%s", "FT5X46i"); + if (ucIcCode == IC_FT5526) + sprintf(strIcName, "%s", "FT5526"); + if (ucIcCode == IC_FT3X17) + sprintf(strIcName, "%s", "FT3X17"); + if (ucIcCode == IC_FT5436) + sprintf(strIcName, "%s", "FT5436"); + if (ucIcCode == IC_FT3X27) + sprintf(strIcName, "%s", "FT3X27"); + if (ucIcCode == IC_FT5526I) + sprintf(strIcName, "%s", "FT5526i"); + if (ucIcCode == IC_FT5416) + sprintf(strIcName, "%s", "FT5416"); + if (ucIcCode == IC_FT5426) + sprintf(strIcName, "%s", "FT5426"); + if (ucIcCode == IC_FT5435) + sprintf(strIcName, "%s", "FT5435"); + if (ucIcCode == IC_FT7681) + sprintf(strIcName, "%s", "FT7681"); + if (ucIcCode == IC_FT7661) + sprintf(strIcName, "%s", "FT7661"); + if (ucIcCode == IC_FT7511) + sprintf(strIcName, "%s", "FT7511"); + if (ucIcCode == IC_FT7421) + sprintf(strIcName, "%s", "FT7421"); + + if (ucIcCode == IC_FT6X06) + sprintf(strIcName, "%s", "FT6X06"); + if (ucIcCode == IC_FT3X06) + sprintf(strIcName, "%s", "FT3X06"); + + if (ucIcCode == IC_FT6X36) + sprintf(strIcName, "%s", "FT6X36"); + if (ucIcCode == IC_FT3X07) + sprintf(strIcName, "%s", "FT3X07"); + if (ucIcCode == IC_FT6416) + sprintf(strIcName, "%s", "FT6416"); + if (ucIcCode == IC_FT6426) + sprintf(strIcName, "%s", "FT6336G/U"); + if (ucIcCode == IC_FT6236U) + sprintf(strIcName, "%s", "FT6236U"); + if (ucIcCode == IC_FT6436U) + sprintf(strIcName, "%s", "FT6436U"); + if (ucIcCode == IC_FT3267) + sprintf(strIcName, "%s", "FT3267"); + if (ucIcCode == IC_FT3367) + sprintf(strIcName, "%s", "FT3367"); + if (ucIcCode == IC_FT7401) + sprintf(strIcName, "%s", "FT7401"); + if (ucIcCode == IC_FT3407U) + sprintf(strIcName, "%s", "FT3407U"); + + if (ucIcCode == IC_FT5X16) + sprintf(strIcName, "%s", "FT5X16"); + if (ucIcCode == IC_FT5X12) + sprintf(strIcName, "%s", "FT5X12"); + + if (ucIcCode == IC_FT5506) + sprintf(strIcName, "%s", "FT5506"); + if (ucIcCode == IC_FT5606) + sprintf(strIcName, "%s", "FT5606"); + if (ucIcCode == IC_FT5816) + sprintf(strIcName, "%s", "FT5816"); + + if (ucIcCode == IC_FT5822) + sprintf(strIcName, "%s", "FT5822"); + if (ucIcCode == IC_FT5626) + sprintf(strIcName, "%s", "FT5626"); + if (ucIcCode == IC_FT5726) + sprintf(strIcName, "%s", "FT5726"); + if (ucIcCode == IC_FT5826B) + sprintf(strIcName, "%s", "FT5826B"); + if (ucIcCode == IC_FT3617) + sprintf(strIcName, "%s", "FT3617"); + if (ucIcCode == IC_FT3717) + sprintf(strIcName, "%s", "FT3717"); + if (ucIcCode == IC_FT7811) + sprintf(strIcName, "%s", "FT7811"); + if (ucIcCode == IC_FT5826S) + sprintf(strIcName, "%s", "FT5826S"); + + if (ucIcCode == IC_FT5306) + sprintf(strIcName, "%s", "FT5306"); + if (ucIcCode == IC_FT5406) + sprintf(strIcName, "%s", "FT5406"); + + if (ucIcCode == IC_FT8606) + sprintf(strIcName, "%s", "FT8606"); + if (ucIcCode == IC_FT8716) + sprintf(strIcName, "%s", "FT8716"); + + if (ucIcCode == IC_FT3C47U) + sprintf(strIcName, "%s", "FT3C47U"); + + if (ucIcCode == IC_FT8607) + sprintf(strIcName, "%s", "FT8607"); + if (ucIcCode == IC_FT8707) + sprintf(strIcName, "%s", "FT8707"); + if (ucIcCode == IC_FT8736) + sprintf(strIcName, "%s", "FT8736"); + + if (ucIcCode == IC_FT3D47) + sprintf(strIcName, "%s", "FT3D47"); + + if (ucIcCode == IC_FTE716) + sprintf(strIcName, "%s", "FTE716"); + + if (ucIcCode == IC_FT5442) + sprintf(strIcName, "%s", "FT5442"); + + if (ucIcCode == IC_FT3428U) + sprintf(strIcName, "%s", "FT3428U"); + + if (ucIcCode == IC_FT8006M) + sprintf(strIcName, "%s", "FT8006M"); + + if (ucIcCode == IC_FT8201) + sprintf(strIcName, "%s", "FT8201"); + + if (ucIcCode == IC_FTE736) + sprintf(strIcName, "%s", "FTE736"); + + + + return ; +} + + +unsigned int fts_ic_table_get_ic_code_from_chip_id(unsigned char chip_id, unsigned char chip_id2) +{ + unsigned int ic_code = 0; + switch (chip_id) { + case 0x55: + ic_code = IC_FT5306; + break; + case 0x08: + ic_code = IC_FT5606; + break; + case 0x0a: + ic_code = IC_FT5X16; + break; + case 0x06: + ic_code = IC_FT6X06; + break; + case 0x36: + ic_code = IC_FT6X36; + break; + case 0x14: + ic_code = IC_FT5X36; + break; + case 0x13: + ic_code = IC_FT3X16; + break; + case 0x12: + ic_code = IC_FT5X36i; + break; + case 0x11: + ic_code = IC_FT5X36i; + break; + case 0x54: + ic_code = IC_FT5X46; + break; + case 0x58: + ic_code = IC_FT5822; + break; + + + case 0x86: + if (0x06 == chip_id2) + ic_code = IC_FT8606; + else if (0x07 == chip_id2) + ic_code = IC_FT8607; + break; + case 0x87: + if (0x07 == chip_id2) + ic_code = IC_FT8707; + else if (0x16 == chip_id2) + ic_code = IC_FT8716; + else if (0x36 == chip_id2) + ic_code = IC_FT8736; + break; + case 0xE7: + if (0x16 == chip_id2) + ic_code = IC_FTE716; + else if (0x36 == chip_id2) + ic_code = IC_FTE736; + break; + default: + ic_code = 0; + break; + } + return ic_code; +} + +unsigned int fts_ic_table_get_chip_id_from_ic_code(unsigned int ic_code, unsigned char *chip_id, unsigned char *chip_id2) +{ + unsigned char uc_chip_id = 0; + unsigned char uc_chip_id2 = 0; + switch (ic_code>>4) { + case (IC_FT5306>>4): + uc_chip_id = 0x55; + break; + case (IC_FT5606>>4): + uc_chip_id = 0x08; + break; + case (IC_FT5X16>>4): + uc_chip_id = 0x0a; + break; + case (IC_FT6X06>>4): + uc_chip_id = 0x06; + break; + case (IC_FT6X36>>4): + uc_chip_id = 0x36; + break; + case (IC_FT5X36>>4): + switch (ic_code) { + case (IC_FT5X36): + uc_chip_id = 0x14; + break; + case (IC_FT3X26): + uc_chip_id = 0x13; + break; + case (IC_FT3X16): + uc_chip_id = 0x12; + break; + case (IC_FT5X36i): + uc_chip_id = 0x11; + break; + } + break; + case (IC_FT5X46>>4): + uc_chip_id = 0x54; + break; + case (IC_FT5822>>4): + uc_chip_id = 0x58; + break; + + + case (IC_FT8606>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x06; + break; + case (IC_FT8607>>4): + uc_chip_id = 0x86; + uc_chip_id2 = 0x07; + break; + case (IC_FT8707>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x07; + break; + case (IC_FT8716>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x16; + break; + case (IC_FT8736>>4): + uc_chip_id = 0x87; + uc_chip_id2 = 0x36; + break; + case (IC_FTE716>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x16; + break; + case (IC_FTE736>>4): + uc_chip_id = 0xE7; + uc_chip_id2 = 0x36; + break; + + default: + uc_chip_id = 0; + break; + + } + + *chip_id = uc_chip_id; + *chip_id2 = uc_chip_id2; + + return 0; +} +int fts_ic_table_need_chip_id2(unsigned int chip_id) +{ + int b_need_id2 = -1; + switch (chip_id) { + case 0x86: + case 0x87: + case 0xE7: + b_need_id2 = 0; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + default: + b_need_id2 = -1; + printk("b_need_id2 = %d, chip_id = 0x%02x\n", b_need_id2, chip_id); + break; + + } + return b_need_id2; +} diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test.c new file mode 100755 index 0000000000000..3b3210f0b4118 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test.c @@ -0,0 +1,902 @@ +/* + * + * FocalTech TouchScreen driver. + * + * Copyright (c) 2010-2017, FocalTech Systems, Ltd., all rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ + +/************************************************************************ +* +* File Name: focaltech_test.c +* +* Author: Software Department, FocalTech +* +* Created: 2016-08-01 +* +* Modify: +* +* Abstract: create char device and proc node for the comm between APK and TP +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include +#include +#include +#include +#include + +#include +#include + +#include "../../focaltech_core.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_test_ini.h" + +#include +#include +#define CTP_PARENT_PROC_NAME "touchscreen" +#define CTP_OPEN_PROC_NAME "ctp_openshort_test" + +#if FTS_LOCK_DOWN_INFO +static char tp_lockdown_info[128]; +#define FTS_PROC_LOCKDOWN_FILE "lockdown_info" +static int fts_lockdown_proc_show(struct seq_file *file, void *data) +{ + char temp[40] = {0}; + + sprintf(temp, "%s\n", tp_lockdown_info); + seq_printf(file, "%s\n", temp); + + return 0; +} + +static int fts_lockdown_proc_open (struct inode *inode, struct file *file) +{ + return single_open(file, fts_lockdown_proc_show, inode->i_private); +} + +static const struct file_operations fts_lockdown_proc_fops = { + .open = fts_lockdown_proc_open, + .read = seq_read, +}; + +#endif + +#if FTS_CAT_RAWDATA +#define FTS_PROC_RAWDATA "rawdata" +static u8 g_isdiff = 1; +/************************************************************************ +* Name: StartScan(Same function name as FT_MultipleTest) +* Brief: Scan TP, do it before read Raw Data +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static int StartScan(struct i2c_client *client) +{ + u8 RegVal = 0x00; + u8 times = 0; + const u8 MaxTimes = 20; + u8 ReCode = -1; + + ReCode = fts_i2c_write_reg(client, 0x00, 0xC0); + if (ReCode >= 0) { + while (times++ < MaxTimes) { + msleep(8); + ReCode = fts_i2c_read_reg(client, 0x00, &RegVal); + if (RegVal == 0x40) + break; + } + + if (times > MaxTimes) + return -EPERM; + } + return ReCode; +} + +int read_rawdata(struct i2c_client *client, int is_diff, s16 *data, int len) +{ + u8 reg = 0x6A; + u8 regdata[1280] = { 0 }; + int remain_bytes; + int pos = 0; + int i = 0; + + FTS_DEBUG("len=%d, is_diff=%d", len, is_diff); + fts_i2c_write_reg(client, 0x06, is_diff); + + if (StartScan(client) < 0) + return -EPERM; + + fts_i2c_write_reg(client, 0x01, 0xAD); + + if (len <= 256) + fts_i2c_read(client, ®, 1, regdata, len); + else { + fts_i2c_read(client, ®, 1, regdata, 256); + remain_bytes = len - 256; + for (i = 1; remain_bytes > 0; i++) { + if (remain_bytes > 256) + fts_i2c_read(client, ®, 0, regdata + i * 256, 256); + else + fts_i2c_read(client, ®, 0, regdata + i * 256, remain_bytes); + remain_bytes -= 256; + } + } + + for (i = 0; i < len;) { + data[pos++] = ((s16)(regdata[i]) << 8) + regdata[i+1]; + i += 2; + } + return 0; +} + +int get_rawdata(struct i2c_client *client, s16 *data, u8 *txlen, u8 *rxlen) +{ + u8 val; + int i; + + /* 0xEE = 1, not clb */ + fts_i2c_write_reg(client, 0xEE, 1); + + /* Enter Factory Mode */ + fts_i2c_write_reg(client, 0x00, 0x40); + do { + fts_i2c_read_reg(client, 0x00, &val); + if (val == 0x40) + break; + msleep(1); + } while (i < 10); + + /* Get Tx/Rx Num */ + fts_i2c_read_reg(client, 0x02, txlen); + fts_i2c_read_reg(client, 0x03, rxlen); + + /* read_rawdata */ + read_rawdata(client, g_isdiff, data, (*txlen) * (*rxlen) * 2); + + /* Enter in work mode */ + fts_i2c_write_reg(client, 0x00, 0x00); + do { + fts_i2c_read_reg(client, 0x00, &val); + if (val == 0x00) + break; + msleep(1); + } while (i < 10); + + return 0; +} + +static char temp[PAGE_SIZE] = {0}; + +static int fts_rawdata_proc_show(struct seq_file *file, void *buf) +{ + int count; + int i = 0, j = 0; + u8 val; + s16 data[600] = { 0 }; + u8 txlen = 0; + u8 rxlen = 0; + struct i2c_client *client = fts_i2c_client; + + if (fts_wq_data->suspended) { + FTS_INFO("Already in suspend state"); + return -EPERM; + } + mutex_lock(&fts_input_dev->mutex); + + get_rawdata(client, data, &txlen, &rxlen); + + fts_i2c_read_reg(client, 0xEE, &val); + count = snprintf(temp, PAGE_SIZE, "0xEE = %d\n", val); + count += snprintf(temp + count, PAGE_SIZE-count, "%s :\n", g_isdiff ? "DIFF DATA" : "RAWDATA"); + for (i = 0; i < txlen; i++) { + for (j = 0; j < rxlen; j++) { + count += snprintf(temp + count, PAGE_SIZE-count, "%5d ", data[i*rxlen + j]); + } + count += snprintf(temp + count, PAGE_SIZE-count, "\n"); + } + count += snprintf(temp + count, PAGE_SIZE-count, "\n\n"); + seq_printf(file, "%s\n", temp); + memset(temp, 0, PAGE_SIZE); + mutex_unlock(&fts_input_dev->mutex); + + return 0; +} + +static int fts_rawdata_proc_open (struct inode *inode, struct file *file) +{ + return single_open(file, fts_rawdata_proc_show, inode->i_private); +} + +static ssize_t fts_rawdata_proc_store(struct file *file, const char __user *buf, size_t count, loff_t *len) +{ + unsigned long val; + int ret; + char *buff[5] = {0}; + if (fts_wq_data->suspended) { + FTS_INFO("Already in suspend state"); + return -EPERM; + } + ret = copy_from_user(buff, buf, 5); + mutex_lock(&fts_input_dev->mutex); + val = simple_strtoul((char *)buff, NULL, 10); + if (val) + g_isdiff = 1; + else + g_isdiff = 0; + mutex_unlock(&fts_input_dev->mutex); + + return count; +} +static const struct file_operations fts_rawdata_proc_fops = { + .open = fts_rawdata_proc_open, + .read = seq_read, + .write = fts_rawdata_proc_store, +}; +#endif + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); +static const struct file_operations ctp_open_procs_fops = { + .write = ctp_open_proc_write, + .read = ctp_open_proc_read, + .owner = THIS_MODULE, +}; +static struct proc_dir_entry *ctp_device_proc; +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#define IC_TEST_VERSION "Test version: V1.0.0--2016-12-28, (sync version of FT_MultipleTest: V4.0.0.0 ------ 2016-07-18)" + + +#define FTS_INI_FILE_PATH "/etc/" + +#define FTS_SAVE_DATA_FILE_PATH "/mnt/sdcard/" + + +#define FTS_TEST_BUFFER_SIZE 80*1024 +#define FTS_TEST_PRINT_SIZE 128 +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ + + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ +static int fts_test_get_ini_size(char *config_name); +static int fts_test_read_ini_data(char *config_name, char *config_buf); +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen); +static int fts_test_get_testparam_from_ini(char *config_name); +static int fts_test_entry(char *ini_file_name); + +static int fts_test_i2c_read(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen); +static int fts_test_i2c_write(unsigned char *writebuf, int writelen); + + +/***************************************************************************** +* functions body +*****************************************************************************/ +#if 0 + +extern struct i2c_client *fts_i2c_client; +extern int fts_i2c_read(struct i2c_client *client, char *writebuf, int writelen, char *readbuf, int readlen); +extern int fts_i2c_write(struct i2c_client *client, char *writebuf, int writelen); +#endif +static int fts_test_i2c_read(unsigned char *writebuf, int writelen, unsigned char *readbuf, int readlen) +{ + int iret = -1; +#if 1 + + + iret = fts_i2c_read(fts_i2c_client, writebuf, writelen, readbuf, readlen); +#else + iret = fts_i2c_read(writebuf, writelen, readbuf, readlen); +#endif + + return iret; + +} + +static int fts_test_i2c_write(unsigned char *writebuf, int writelen) +{ + int iret = -1; +#if 1 + + + iret = fts_i2c_write(fts_i2c_client, writebuf, writelen); +#else + iret = fts_i2c_write(writebuf, writelen); +#endif + + return iret; +} + + +static int fts_test_get_ini_size(char *config_name) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + filp_close(pfile, NULL); + + FTS_TEST_FUNC_ENTER(); + + return fsize; +} + + +static int fts_test_read_ini_data(char *config_name, char *config_buf) +{ + struct file *pfile = NULL; + struct inode *inode = NULL; + + off_t fsize = 0; + char filepath[128]; + loff_t pos = 0; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_INI_FILE_PATH, config_name); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + inode = pfile->f_dentry->d_inode; + + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, config_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_save_test_data(char *file_name, char *data_buf, int iLen) +{ + struct file *pfile = NULL; + + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + FTS_TEST_FUNC_ENTER(); + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FTS_SAVE_DATA_FILE_PATH, file_name); + if (NULL == pfile) { + + pfile = filp_open(filepath, O_TRUNC|O_CREAT|O_RDWR, 0); + } + if (IS_ERR(pfile)) { + FTS_TEST_ERROR("error occured while opening file %s.", filepath); + return -EIO; + } + + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_write(pfile, data_buf, iLen, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + +static int fts_test_get_testparam_from_ini(char *config_name) +{ + char *pcfiledata = NULL; + int ret = 0; + int inisize = 0; + + FTS_TEST_FUNC_ENTER(); + + inisize = fts_test_get_ini_size(config_name); + FTS_TEST_DBG("ini_size = %d ", inisize); + if (inisize <= 0) { + FTS_TEST_ERROR("%s ERROR:Get firmware size failed", __func__); + return -EIO; + } + + pcfiledata = fts_malloc(inisize + 1); + if (NULL == pcfiledata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + + memset(pcfiledata, 0, inisize + 1); + + if (fts_test_read_ini_data(config_name, pcfiledata)) { + FTS_TEST_ERROR(" - ERROR: fts_test_read_ini_data failed"); + fts_free(pcfiledata); + pcfiledata = NULL; + + return -EIO; + } else { + FTS_TEST_DBG("fts_test_read_ini_data successful"); + } + + ret = set_param_data(pcfiledata); + + fts_free(pcfiledata); + pcfiledata = NULL; + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} + + + + +static int fts_test_entry(char *ini_file_name) +{ + /* place holder for future use */ + char cfgname[128]; + char *testdata = NULL; + char *printdata = NULL; + int iTestDataLen = 0; + int ret = 0; + int icycle = 0, i = 0; + int print_index = 0; + + + FTS_TEST_FUNC_ENTER(); + FTS_TEST_DBG("ini_file_name:%s.", ini_file_name); + /*Used to obtain the test data stored in the library, pay attention to the size of the distribution space.*/ + FTS_TEST_DBG("Allocate memory, size: %d", FTS_TEST_BUFFER_SIZE); + testdata = fts_malloc(FTS_TEST_BUFFER_SIZE); + if (NULL == testdata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + printdata = fts_malloc(FTS_TEST_PRINT_SIZE); + if (NULL == printdata) { + FTS_TEST_ERROR("fts_malloc failed in function:%s", __func__); + return -EPERM; + } + /*Initialize the platform related I2C read and write functions*/ + +#if 0 + init_i2c_write_func(fts_i2c_write); + init_i2c_read_func(fts_i2c_read); +#else + init_i2c_write_func(fts_test_i2c_write); + init_i2c_read_func(fts_test_i2c_read); +#endif + + /*Initialize pointer memory*/ + ret = focaltech_test_main_init(); + if (ret < 0) { + FTS_TEST_ERROR("focaltech_test_main_init() error."); + goto TEST_ERR; + } + + /*Read parse configuration file*/ + memset(cfgname, 0, sizeof(cfgname)); + sprintf(cfgname, "%s", ini_file_name); + FTS_TEST_DBG("ini_file_name = %s", cfgname); + + fts_test_funcs(); + + if (fts_test_get_testparam_from_ini(cfgname) < 0) { + FTS_TEST_ERROR("get testparam from ini failure"); + goto TEST_ERR; + } + + + if ((g_ScreenSetParam.iSelectedIC >> 4 != FTS_CHIP_TEST_TYPE >> 4)) { + FTS_TEST_ERROR("Select IC and Read IC from INI does not match "); + + } + + + /*Start testing according to the test configuration*/ + if (true == start_test_tp()) { + TestResultLen += sprintf(TestResult+TestResultLen, "Tp test pass. \n\n"); + FTS_TEST_INFO("tp test pass"); + ret = 0; + } + + else { + TestResultLen += sprintf(TestResult+TestResultLen, "Tp test failure. \n\n"); + FTS_TEST_INFO("tp test failure"); + ret = 1; + } + + + /*Gets the number of tests in the test library and saves it*/ + iTestDataLen = get_test_data(testdata); + + + icycle = 0; + /*Print test data packets */ + FTS_TEST_DBG("print test data: \n"); + for (i = 0; i < iTestDataLen; i++) { + if (('\0' == testdata[i]) + || (icycle == FTS_TEST_PRINT_SIZE - 2) + || (i == iTestDataLen-1) + ) { + if (icycle == 0) { + print_index++; + } else { + memcpy(printdata, testdata + print_index, icycle); + printdata[FTS_TEST_PRINT_SIZE-1] = '\0'; + FTS_TEST_DBG("%s", printdata); + print_index += icycle; + icycle = 0; + } + } else { + icycle++; + } + } + FTS_TEST_DBG("\n"); + + + + fts_test_save_test_data("testdata.csv", testdata, iTestDataLen); + fts_test_save_test_data("testresult.txt", TestResult, TestResultLen); + + + /*Release memory */ + focaltech_test_main_exit(); + + + + if (NULL != testdata) + fts_free(testdata); + if (NULL != printdata) + fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return ret; + +TEST_ERR: + if (NULL != testdata) + fts_free(testdata); + if (NULL != printdata) + fts_free(printdata); + + FTS_TEST_FUNC_EXIT(); + + return -EPERM; +} + +static int fts_set_ini_name(char *cfgname) +{ + int ret; + u8 vid; + + ret = fts_i2c_read_reg(fts_i2c_client, FTS_REG_VENDOR_ID, &vid); + FTS_TEST_DBG("vendor id:0x%x\n", vid); + if (vid == OFILM_VENDOR) { + sprintf(cfgname, "%s", "fts_ofilm.ini"); + } else if (vid == EACHOPTO_VENDOR) { + sprintf(cfgname, "%s", "fts_eachopto.ini"); + } else if (vid == TXD_VENDOR) { + + sprintf(cfgname, "%s", "fts_holitech.ini"); + } else if (vid == EBBG_VENDOR) { + sprintf(cfgname, "%s", "fts_ebbg.ini"); + } else if (vid == CSOT_VENDOR) { + sprintf(cfgname, "%s", "fts_csot.ini"); + } else{ + pr_err("ctp test not found test config \n"); + } + + return ret; +} + +#if FTS_AUTO_UPGRADE_EN +void waite_for_fw_upgrading(void) +{ + int vid = 0; + if (fw_upgrade_status == FW_UPGRADING) { + for (; fw_upgrade_status == FW_UPGRADING; ) { + + if ((vid%4) == 0) + FTS_TEST_DBG("tp firmware upgrading status:%d\n", fw_upgrade_status); + msleep(200); + vid++; + if (vid > 30) { + FTS_TEST_DBG("takes 6s tp still upgrading status:%d\n", fw_upgrade_status); + break; + } + } + } + return; +} +#endif + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + char fwname[128] = {0}; + int ret; + u8 result = 0; + struct i2c_client *client = fts_i2c_client; + + FTS_TEST_FUNC_ENTER(); +#if FTS_AUTO_UPGRADE_EN + waite_for_fw_upgrading(); +#endif + + if (*ppos) { + FTS_TEST_ERROR("tp test again return\n"); + return 0; + } + *ppos += count; + + memset(fwname, 0, sizeof(fwname)); + fts_set_ini_name(fwname); + fwname[strlen(fwname)] = '\0'; + FTS_TEST_DBG("fwname:%s.", fwname); + + mutex_lock(&fts_input_dev->mutex); + + disable_irq(client->irq); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(DISABLE); +#endif + ret = fts_test_entry(fwname); + if (0 != ret) { + result = 0; + FTS_TEST_ERROR("fts open short test fail \n"); + } else { + result = 1; + FTS_TEST_ERROR("fts open short test success \n"); + } +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(ENABLE); +#endif + enable_irq(client->irq); + + mutex_unlock(&fts_input_dev->mutex); + + FTS_TEST_FUNC_EXIT(); + + return sprintf(ptr, "result=%d\n", result); +} + + +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + void create_ctp_proc(void) +{ + + + + + + struct proc_dir_entry *ctp_open_proc = NULL; + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return; + } + } + ctp_open_proc = proc_create(CTP_OPEN_PROC_NAME, 0777, ctp_device_proc, &ctp_open_procs_fops); + if (ctp_open_proc == NULL) { + FTS_TEST_ERROR("create open_proc fail\n"); + } +} +#if 0 +/************************************************************************ +* Name: fts_test_show +* Brief: no +* Input: device, device attribute, char buf +* Output: no +* Return: EPERM +***********************************************************************/ +static ssize_t fts_test_show(struct device *dev, struct device_attribute *attr, char *buf) +{ + char fwname[128] = {0}; + int ret; + struct i2c_client *client = fts_i2c_client; + + FTS_TEST_FUNC_ENTER(); + +#if FTS_AUTO_UPGRADE_EN + waite_for_fw_upgrading(); +#endif + memset(fwname, 0, sizeof(fwname)); + fts_set_ini_name(fwname); + fwname[strlen(fwname)] = '\0'; + FTS_TEST_DBG("fwname:%s.", fwname); + + mutex_lock(&fts_input_dev->mutex); + + disable_irq(client->irq); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(DISABLE); +#endif + ret = fts_test_entry(fwname); + +#if defined(FTS_ESDCHECK_EN) && (FTS_ESDCHECK_EN) + fts_esdcheck_switch(ENABLE); +#endif + enable_irq(client->irq); + + mutex_unlock(&fts_input_dev->mutex); + + FTS_TEST_FUNC_EXIT(); + + return sprintf(buf, "result=%d\n", ret); +} + +/************************************************************************ +* Name: fts_test_store +* Brief: upgrade from app.bin +* Input: device, device attribute, char buf, char count +* Output: no +* Return: char count +***********************************************************************/ +static ssize_t fts_test_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) +{ + + return count; +} +/* upgrade from app.bin +* example:echo "***.ini" > fts_test +*/ +static DEVICE_ATTR(fts_test, S_IRUGO|S_IWUSR, fts_test_show, fts_test_store); + +/* add your attr in here*/ +static struct attribute *fts_test_attributes[] = { + &dev_attr_fts_test.attr, + NULL +}; + +static struct attribute_group fts_test_attribute_group = { + .attrs = fts_test_attributes +}; +#endif + +int fts_test_init(struct i2c_client *client) +{ + int err = 0; + + FTS_TEST_FUNC_ENTER(); + + FTS_TEST_INFO("%s\n", IC_TEST_VERSION); + + create_ctp_proc(); + + FTS_TEST_FUNC_EXIT(); + + return err; +} +int fts_test_exit(struct i2c_client *client) +{ + FTS_TEST_FUNC_ENTER(); + + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +#if FTS_LOCK_DOWN_INFO +int fts_lockdown_init(struct i2c_client *client) +{ + int err = 0; + unsigned char auc_i2c_write_buf[10]; + u8 r_buf[10] = {0}; + struct proc_dir_entry *fts_lockdown_status_proc = NULL; + err = fts_i2c_write_reg(client, 0x90, 0x20); + if (err < 0) + FTS_ERROR("[FTS] i2c write 0x90 err\n"); + + msleep(5); + auc_i2c_write_buf[0] = 0x99; + err = fts_i2c_read(client, auc_i2c_write_buf, 1, r_buf, 8); + if (err < 0) + FTS_ERROR("[FTS] i2c read 0x99 err\n"); + + sprintf(tp_lockdown_info, "%02x%02x%02x%02x%02x%02x%02x%02x", \ + r_buf[0], r_buf[1], r_buf[2], r_buf[3], r_buf[4], r_buf[5], r_buf[6], r_buf[7]); + FTS_INFO("tpd_probe, ft8716_ctpm_LockDownInfo_get_from_boot, tp_lockdown_info=%s\n", tp_lockdown_info); + + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return 1; + } + } + fts_lockdown_status_proc = proc_create(FTS_PROC_LOCKDOWN_FILE, 0644, ctp_device_proc, &fts_lockdown_proc_fops); + if (fts_lockdown_status_proc == NULL) { + FTS_ERROR("fts, create_proc_entry ctp_lockdown_status_proc failed\n"); + return 1; + } + return 0 ; +} +#endif + +#if FTS_CAT_RAWDATA +int fts_rawdata_init(struct i2c_client *client) +{ + + struct proc_dir_entry *fts_rawdata_status_proc = NULL; + + + if (ctp_device_proc == NULL) { + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + FTS_TEST_ERROR("create parent_proc fail\n"); + return 1; + } + } + fts_rawdata_status_proc = proc_create(FTS_PROC_RAWDATA, 0777, ctp_device_proc, &fts_rawdata_proc_fops); + if (fts_rawdata_status_proc == NULL) { + FTS_ERROR("fts, create_proc_entry ctp_lockdown_status_proc failed\n"); + return 1; + } + return 0 ; +} +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_detail_threshold.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_detail_threshold.c new file mode 100755 index 0000000000000..cb06aedc132a1 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_detail_threshold.c @@ -0,0 +1,1812 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_detail_threshold.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Detail Threshold for all IC +* +************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_ic_table.h" + + +struct stCfg_MCap_DetailThreshold g_stCfg_MCap_DetailThreshold; +struct stCfg_SCap_DetailThreshold g_stCfg_SCap_DetailThreshold; +struct stCfg_Incell_DetailThreshold g_stCfg_Incell_DetailThreshold; + +void set_max_channel_num(void) +{ + + FTS_TEST_FUNC_ENTER(); + switch (g_ScreenSetParam.iSelectedIC>>4) { + case IC_FT5822>>4: + case IC_FT8006M>>4: + case IC_FTE716>>4: + case IC_FT3D47>>4: + g_ScreenSetParam.iUsedMaxTxNum = TX_NUM_MAX; + g_ScreenSetParam.iUsedMaxRxNum = RX_NUM_MAX; + break; + default: + g_ScreenSetParam.iUsedMaxTxNum = 30; + g_ScreenSetParam.iUsedMaxRxNum = 32; + break; + } + + FTS_TEST_DBG("MaxTxNum = %d, MaxRxNum = %d. ", g_ScreenSetParam.iUsedMaxTxNum, g_ScreenSetParam.iUsedMaxRxNum); + + FTS_TEST_FUNC_EXIT(); + +} + +int malloc_struct_DetailThreshold(void) +{ + FTS_TEST_FUNC_ENTER(); + + + g_stCfg_MCap_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_MCap_DetailThreshold.InvalidNode) + goto ERR; + + g_stCfg_MCap_DetailThreshold.InvalidNode_SC = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_MCap_DetailThreshold.InvalidNode_SC) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) + goto ERR; + + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min = (short (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(short)); + if (NULL == g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) + goto ERR; + + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) + goto ERR; + + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) + goto ERR; + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) + goto ERR; + + + + g_stCfg_Incell_DetailThreshold.InvalidNode = (unsigned char (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(unsigned char)); + if (NULL == g_stCfg_Incell_DetailThreshold.InvalidNode) { + FTS_TEST_DBG("InvalidNode. \n"); + goto ERR; + } + + + g_stCfg_Incell_DetailThreshold.RawDataTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + FTS_TEST_DBG("RawDataTest_Min. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + FTS_TEST_DBG("RawDataTest_Max. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBTest_Min = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBTest_Min) { + FTS_TEST_DBG("CBTest_Min. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBTest_Max = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBTest_Max) { + FTS_TEST_DBG("CBTest_Max. \n"); + goto ERR; + } + + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHY_Linearity. \n"); + goto ERR; + } + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = (int (*)[RX_NUM_MAX])fts_malloc(NUM_MAX*sizeof(int)); + if (NULL == g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + FTS_TEST_DBG("CBUniformityTest_CHX_Linearity. \n"); + goto ERR; + } + + FTS_TEST_FUNC_EXIT(); + + return 0; + +ERR: + FTS_TEST_ERROR("fts_malloc memory failed in function."); + return -EPERM; +} + +void free_struct_DetailThreshold(void) +{ + if (NULL != g_stCfg_MCap_DetailThreshold.InvalidNode) { + fts_free(g_stCfg_MCap_DetailThreshold.InvalidNode); + g_stCfg_MCap_DetailThreshold.InvalidNode = NULL; + } + if (NULL != g_stCfg_MCap_DetailThreshold.InvalidNode_SC) { + fts_free(g_stCfg_MCap_DetailThreshold.InvalidNode_SC); + g_stCfg_MCap_DetailThreshold.InvalidNode_SC = NULL; + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max); + } + if (NULL != g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min); + } + if (NULL != g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient) { + fts_free(g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient); + g_stCfg_MCap_DetailThreshold.NoistTest_Coefficient = NULL; + } + + if (NULL != g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max) { + fts_free(g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max); + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max = NULL; + } + + if (NULL != g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min) { + fts_free(g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min); + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.InvalidNode) { + fts_free(g_stCfg_Incell_DetailThreshold.InvalidNode); + g_stCfg_Incell_DetailThreshold.InvalidNode = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Min) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Min); + g_stCfg_Incell_DetailThreshold.RawDataTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.RawDataTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.RawDataTest_Max); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBTest_Min) { + fts_free(g_stCfg_Incell_DetailThreshold.CBTest_Min); + g_stCfg_Incell_DetailThreshold.CBTest_Min = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBTest_Max) { + fts_free(g_stCfg_Incell_DetailThreshold.CBTest_Max); + g_stCfg_Incell_DetailThreshold.CBTest_Max = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity); + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHX_Linearity = NULL; + } + + if (NULL != g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity) { + fts_free(g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity); + g_stCfg_Incell_DetailThreshold.CBUniformityTest_CHY_Linearity = NULL; + } + + + +} + +void OnInit_SCap_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + OnGetTestItemParam("RawDataTest_Max", strIniFile, 12500); + memcpy(g_stCfg_SCap_DetailThreshold.RawDataTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("RawDataTest_Min", strIniFile, 16500); + memcpy(g_stCfg_SCap_DetailThreshold.RawDataTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiTest_Max", strIniFile, 5); + memcpy(g_stCfg_SCap_DetailThreshold.CiTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiTest_Min", strIniFile, 250); + memcpy(g_stCfg_SCap_DetailThreshold.CiTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_AnotherBase1", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase1, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCiTest_AnotherBase2", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCiTest_AnotherBase2, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("NoiseTest_Max", strIniFile, 20); + memcpy(g_stCfg_SCap_DetailThreshold.NoiseTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("CiDeviation_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CiDeviationTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCxTest_Sort", strIniFile, 1); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCxTest_Sort, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + OnGetTestItemParam("DeltaCxTest_Area", strIniFile, 1); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCxTest_Area, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + + OnGetTestItemParam("CbTest_Max", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CbTest_Max, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("CbTest_Min", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CbTest_Min, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("DeltaCbTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DeltaCbTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("DifferTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.DifferTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("CBDeviation_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.CBDeviationTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + + OnGetTestItemParam("K1DifferTest_Base", strIniFile, 0); + memcpy(g_stCfg_SCap_DetailThreshold.K1DifferTest_Base, g_stCfg_SCap_DetailThreshold.TempData, MAX_CHANNEL_NUM*sizeof(int)); + + FTS_TEST_FUNC_EXIT(); +} + +void OnGetTestItemParam(char *strItemName, char *strIniFile, int iDefautValue) +{ + + char strValue[800]; + char str_tmp[128]; + int iValue = 0; + int dividerPos = 0; + int index = 0; + int i = 0, j = 0, k = 0; + memset(g_stCfg_SCap_DetailThreshold.TempData, 0, sizeof(g_stCfg_SCap_DetailThreshold.TempData)); + sprintf(str_tmp, "%d", iDefautValue); + GetPrivateProfileString("Basic_Threshold", strItemName, str_tmp, strValue, strIniFile); + iValue = fts_atoi(strValue); + for (i = 0; i < MAX_CHANNEL_NUM; i++) { + g_stCfg_SCap_DetailThreshold.TempData[i] = iValue; + } + + dividerPos = GetPrivateProfileString("SpecialSet", strItemName, "", strValue, strIniFile); + if (dividerPos > 0) { + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_SCap_DetailThreshold.TempData[k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } +} + +void OnInit_MCap_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + set_max_channel_num(); + + OnInit_InvalidNode(strIniFile); + OnInit_DThreshold_RawDataTest(strIniFile); + OnInit_DThreshold_SCapRawDataTest(strIniFile); + OnInit_DThreshold_SCapCbTest(strIniFile); + + OnInit_DThreshold_ForceTouch_SCapRawDataTest(strIniFile); + OnInit_DThreshold_ForceTouch_SCapCbTest(strIniFile); + + OnInit_DThreshold_RxLinearityTest(strIniFile); + OnInit_DThreshold_TxLinearityTest(strIniFile); + + OnInit_DThreshold_PanelDifferTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} +void OnInit_InvalidNode(char *strIniFile) +{ + + char str[MAX_PATH] = {0}, strTemp[MAX_PATH] = {0}; + int i = 0, j = 0; + + + + FTS_TEST_FUNC_ENTER(); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + sprintf(strTemp, "InvalidNode[%d][%d]", (i+1), (j+1)); + + GetPrivateProfileString("INVALID_NODE", strTemp, "1", str, strIniFile); + if (fts_atoi(str) == 0) { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 0; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 0; + FTS_TEST_DBG("node (%d, %d) \n", (i+1), (j+1)); + + } else if (fts_atoi(str) == 2) { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 2; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 2; + } else { + g_stCfg_MCap_DetailThreshold.InvalidNode[i][j] = 1; + g_stCfg_Incell_DetailThreshold.InvalidNode[i][j] = 1; + } + + + + + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + sprintf(strTemp, "InvalidNodeS[%d][%d]", (i+1), (j+1)); + GetPrivateProfileString("INVALID_NODES", strTemp, "1", str, strIniFile); + if (fts_atoi(str) == 0) { + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 0; + } else if (fts_atoi(str) == 2) { + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 2; + } else + g_stCfg_MCap_DetailThreshold.InvalidNode_SC[i][j] = 1; + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_RawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if ((g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8716 >> 4) || (g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8736 >> 4) || (g_ScreenSetParam.iSelectedIC >> 4 == IC_FTE716 >> 4)) { + return; + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "10000", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "7000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Max", "15000", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][j] = MaxValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_Low_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Low_Min", "3000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_Low_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_Low_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Max", "15000", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][j] = MaxValue; + } + } + GetPrivateProfileString("Basic_Threshold", "RawDataTest_High_Min", "3000", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][j] = MinValue; + } + } + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Max_High_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "RawData_Min_High_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RawDataTest_High_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapRawDataTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 2; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 2; i++) { + sprintf(str, "ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.SCapCbTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_PanelDifferTest(char *strIniFile) +{ + + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + int index = 0; + int k = 0, i = 0, j = 0; + char str_tmp[128]; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Max_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "PanelDifferTest_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "Panel_Differ_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.PanelDifferTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); + +} + + + +void OnInit_DThreshold_RxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "RxLinearityTest_Max", "50", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Rx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.RxLinearityTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_TxLinearityTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue = 0; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "TxLinearityTest_Max", "50", str, strIniFile); + MaxValue = fts_atoi(str); + + + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < g_ScreenSetParam.iUsedMaxTxNum; i++) { + sprintf(str, "Tx_Linearity_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "111", strTemp, strIniFile); + + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.TxLinearityTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_ForceTouch_SCapRawDataTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_OFF_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Min", "150", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapRawDataTest_ON_Max", "1000", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapRawData_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapRawDataTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_ForceTouch_SCapCbTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_ON_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_ON_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + FTS_TEST_DBG("%s\r", strTemp); + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_ON_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Min", "0", str, strIniFile); + MinValue = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ForceTouch_SCapCbTest_OFF_Max", "240", str, strIniFile); + MaxValue = fts_atoi(str); + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][j] = MaxValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Max_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Max[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + for (i = 0; i < 1; i++) { + for (j = 0; j < g_ScreenSetParam.iUsedMaxRxNum; j++) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][j] = MinValue; + } + } + for (i = 0; i < 1; i++) { + sprintf(str, "ForceTouch_ScapCB_OFF_Min_%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_MCap_DetailThreshold.ForceTouch_SCapCbTest_OFF_Min[i][k] = (short)(fts_atoi(str_tmp)); + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_Incell_DetailThreshold(char *strIniFile) +{ + + FTS_TEST_FUNC_ENTER(); + + set_max_channel_num(); + + OnInit_InvalidNode(strIniFile); + + OnInit_DThreshold_RawDataTest(strIniFile); + OnInit_DThreshold_CBTest(strIniFile); + OnInit_DThreshold_AllButtonCBTest(strIniFile); + OnThreshold_VkAndVaRawDataSeparateTest(strIniFile); + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_DThreshold_CBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + if (g_ScreenSetParam.iSelectedIC >> 4 == IC_FT8606 >> 4) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, strIniFile); + MaxValue_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, strIniFile); + MinValue_Vkey = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + + +void OnInit_DThreshold_AllButtonCBTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + FTS_TEST_FUNC_ENTER(); + + if (g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8606 >> 4) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + MaxValue = fts_atoi(str); + + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][j] = MaxValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Max_Tx%d", (i + 1)); + + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + + + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + MinValue = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][j] = MinValue; + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "CB_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.CBTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + FTS_TEST_FUNC_EXIT(); +} + + +void OnThreshold_VkAndVaRawDataSeparateTest(char *strIniFile) +{ + char str[128], strTemp[MAX_PATH], strValue[MAX_PATH]; + int MaxValue, MinValue, MaxValue_Vkey, MinValue_Vkey; + int ChannelNumTest_ChannelXNum, ChannelNumTest_ChannelYNum; + int dividerPos = 0; + char str_tmp[128]; + int index = 0; + int k = 0, i = 0, j = 0; + + + FTS_TEST_FUNC_ENTER(); + + if ((g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8716 >> 4) && (g_ScreenSetParam.iSelectedIC >> 4 != IC_FT8736 >> 4) && (g_ScreenSetParam.iSelectedIC >> 4 != IC_FTE716 >> 4)) { + return; + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", str, strIniFile); + MaxValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max_VKey", "11000", str, strIniFile); + MaxValue_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + ChannelNumTest_ChannelXNum = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + ChannelNumTest_ChannelYNum = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][j] = MaxValue_Vkey; + } + } + } + + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Max_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Max[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, strIniFile); + MinValue = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min_VKey", "5000", str, strIniFile); + MinValue_Vkey = fts_atoi(str); + + for (i = 0; i < TX_NUM_MAX; i++) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue; + } + + if (i == ChannelNumTest_ChannelXNum) { + for (j = 0; j < RX_NUM_MAX; j++) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][j] = MinValue_Vkey; + } + } + } + + for (i = 0; i < TX_NUM_MAX; i++) { + sprintf(str, "RawData_Min_Tx%d", (i + 1)); + dividerPos = GetPrivateProfileString("SpecialSet", str, "NULL", strTemp, strIniFile); + sprintf(strValue, "%s", strTemp); + + if (0 == dividerPos) + continue; + index = 0; + k = 0; + memset(str_tmp, 0, sizeof(str_tmp)); + for (j = 0; j < dividerPos; j++) { + if (',' == strValue[j]) { + g_stCfg_Incell_DetailThreshold.RawDataTest_Min[i][k] = (short)(fts_atoi(str_tmp)); + + index = 0; + memset(str_tmp, 0x00, sizeof(str_tmp)); + k++; + } else { + if (' ' == strValue[j]) + continue; + str_tmp[index] = strValue[j]; + index++; + } + } + } + FTS_TEST_FUNC_EXIT(); +} + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_global.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_global.c new file mode 100755 index 0000000000000..1ffd1a743b1af --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_global.c @@ -0,0 +1,499 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_global.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: global function for test +* +************************************************************************/ + +#include +#include +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_main.h" +#include "../include/focaltech_ic_table.h" + +#define DEVIDE_MODE_ADDR 0x00 + +/*buff length*/ +#define BUFF_LEN_STORE_MSG_AREA 1024*10 +#define BUFF_LEN_MSG_AREA_LINE2 1024*4 +#define BUFF_LEN_STORE_DATA_AREA 1024*80 +#define BUFF_LEN_TMP_BUFFER 1024*16 + + +char *g_pTmpBuff = NULL; +char *g_pStoreMsgArea = NULL; +int g_lenStoreMsgArea = 0; +char *g_pMsgAreaLine2 = NULL; +int g_lenMsgAreaLine2 = 0; +char *g_pStoreDataArea = NULL; +int g_lenStoreDataArea = 0; +unsigned char m_ucTestItemCode = 0; +int m_iStartLine = 0; +int m_iTestDataCount = 0; + +char *TestResult = NULL; +int TestResultLen = 0; + +/*ÄÚ´æÉêÇ뷽ʽ*/ +#define FTS_MALLOC_TYPE 1 +enum enum_malloc_mode { + kmalloc_mode = 0, + vmalloc_mode = 1, +}; + +struct StruScreenSeting g_ScreenSetParam; +struct stTestItem g_stTestItem[1][MAX_TEST_ITEM]; +struct structSCapConfEx g_stSCapConfEx; + +int g_TestItemNum = 0; +char g_strIcName[20] = {0}; +char *g_pStoreAllData = NULL; + +int GetPrivateProfileString(char *section, char *ItemName, char *defaultvalue, char *returnValue, char *IniFile) +{ + char value[512] = {0}; + int len = 0; + + if (NULL == returnValue) { + FTS_TEST_DBG("[FTS] returnValue==NULL in function %s.", __func__); + return 0; + } + + if (ini_get_key(IniFile, section, ItemName, value) < 0) { + if (NULL != defaultvalue) + memcpy(value, defaultvalue, strlen(defaultvalue)); + sprintf(returnValue, "%s", value); + return 0; + } else { + len = sprintf(returnValue, "%s", value); + } + + return len; +} + +void focal_msleep(int ms) +{ + msleep(ms); +} + +void SysDelay(int ms) +{ + msleep(ms); +} + +int focal_abs(int value) +{ + if (value < 0) + value = 0 - value; + + return value; +} + +void *fts_malloc(size_t size) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kmalloc(size, GFP_ATOMIC); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vmalloc(size); + } else { + FTS_TEST_DBG("invalid malloc. \n"); + return NULL; + } + + return NULL; +} + +void fts_free(void *p) +{ + if (FTS_MALLOC_TYPE == kmalloc_mode) { + return kfree(p); + } else if (FTS_MALLOC_TYPE == vmalloc_mode) { + return vfree(p); + } else { + FTS_TEST_DBG("invalid free. \n"); + return ; + } + + return ; +} + +void OnInit_InterfaceCfg(char *strIniFile) +{ + char str[128] = {0}; + + FTS_TEST_FUNC_ENTER(); + + GetPrivateProfileString("Interface", "IC_Type", "FT5X36", str, strIniFile); + g_ScreenSetParam.iSelectedIC = fts_ic_table_get_ic_code_from_ic_name(str); + FTS_TEST_INFO(" IC code :0x%02x. ", g_ScreenSetParam.iSelectedIC); + + + GetPrivateProfileString("Interface", "Normalize_Type", 0, str, strIniFile); + g_ScreenSetParam.isNormalize = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); + +} +/************************************************************************ +* Name: ReadReg(Same function name as FT_MultipleTest) +* Brief: Read Register +* Input: RegAddr +* Output: RegData +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int ReadReg(unsigned char RegAddr, unsigned char *RegData) +{ + int iRet; + + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + iRet = fts_i2c_read_test(&RegAddr, 1, RegData, 1); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} + +/************************************************************************ +* Name: WriteReg(Same function name as FT_MultipleTest) +* Brief: Write Register +* Input: RegAddr, RegData +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +int WriteReg(unsigned char RegAddr, unsigned char RegData) +{ + int iRet; + unsigned char cmd[2] = {0}; + + if (NULL == fts_i2c_write_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_write_test == NULL !!!", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + cmd[0] = RegAddr; + cmd[1] = RegData; + iRet = fts_i2c_write_test(cmd, 2); + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: Comm_Base_IIC_IO(Same function name as FT_MultipleTest) +* Brief: Write/Read Data by IIC +* Input: pWriteBuffer, iBytesToWrite, iBytesToRead +* Output: pReadBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char Comm_Base_IIC_IO(unsigned char *pWriteBuffer, int iBytesToWrite, unsigned char *pReadBuffer, int iBytesToRead) +{ + int iRet; + + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL !!! ", __func__); + return (ERROR_CODE_INVALID_COMMAND); + } + + if (iBytesToRead > 0) { + iRet = fts_i2c_read_test(pWriteBuffer, iBytesToWrite, pReadBuffer, iBytesToRead); + } else { + iRet = fts_i2c_write_test(pWriteBuffer, iBytesToWrite); + } + + if (iRet >= 0) + return (ERROR_CODE_OK); + else + return (ERROR_CODE_COMM_ERROR); +} +/************************************************************************ +* Name: EnterWork(Same function name as FT_MultipleTest) +* Brief: Enter Work Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char EnterWork(void) +{ + unsigned char RunState = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = WriteReg(DEVIDE_MODE_ADDR, 0); + if (ReCode == ERROR_CODE_OK) { + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x00) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } else + FTS_TEST_ERROR("EnterWork read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("EnterWork write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("EnterWork read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + + return ReCode; + +} +/************************************************************************ +* Name: EnterFactory +* Brief: enter Fcatory Mode +* Input: null +* Output: null +* Return: Comm Code. Code = 0 is OK, else fail. +***********************************************************************/ +unsigned char EnterFactory(void) +{ + unsigned char RunState = 0; + int index = 0; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + FTS_TEST_FUNC_ENTER(); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + } else { + ReCode = WriteReg(DEVIDE_MODE_ADDR, 0x40); + if (ReCode == ERROR_CODE_OK) { + for (index = 0; index < 20; ++index) { + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RunState); + if (ReCode == ERROR_CODE_OK) { + if (((RunState>>4)&0x07) == 0x04) { + ReCode = ERROR_CODE_OK; + break; + } else { + ReCode = ERROR_CODE_COMM_ERROR; + } + } + SysDelay(50); + } + if (ReCode != ERROR_CODE_OK) + FTS_TEST_ERROR("EnterFactory read DEVIDE_MODE_ADDR error 3."); + } else + FTS_TEST_ERROR("EnterFactory write DEVIDE_MODE_ADDR error 2."); + } + } else + FTS_TEST_ERROR("EnterFactory read DEVIDE_MODE_ADDR error 1."); + + FTS_TEST_FUNC_EXIT(); + return ReCode; +} + +/************************************************************************ +* Name: fts_SetTestItemCodeName +* Brief: set test item code and name +* Input: null +* Output: null +* Return: +**********************************************************************/ + +void fts_SetTestItemCodeName(unsigned char ucitemcode) +{ + g_stTestItem[0][g_TestItemNum].ItemCode = ucitemcode; + + g_stTestItem[0][g_TestItemNum].TestNum = g_TestItemNum; + g_stTestItem[0][g_TestItemNum].TestResult = RESULT_NULL; + g_TestItemNum++; +} + +/************************************************************************ +* Name: InitTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int InitTest(void) +{ + int ret = 0; + ret = AllocateMemory(); + if (ret < 0) + return -EPERM; + + InitStoreParamOfTestData(); + + g_stSCapConfEx.ChannelXNum = 0; + g_stSCapConfEx.ChannelYNum = 0; + g_stSCapConfEx.KeyNum = 0; + g_stSCapConfEx.KeyNumTotal = 6; + + return 0; + +} + +/************************************************************************ +* Name: FinishTest +* Brief: Init all param before test +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void FinishTest(void) +{ + MergeAllTestData(); + FreeMemory(); +} + + +/************************************************************************ +* Name: InitStoreParamOfTestData +* Brief: Init store param of test data +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void InitStoreParamOfTestData(void) +{ + g_lenStoreMsgArea = 0; + + g_lenStoreMsgArea += sprintf(g_pStoreMsgArea, "ECC, 85, 170, IC Name, %s, IC Code, %x\n", g_strIcName, g_ScreenSetParam.iSelectedIC); + + + + g_lenMsgAreaLine2 = 0; + + + + g_lenStoreDataArea = 0; + m_iStartLine = 11; + + m_iTestDataCount = 0; +} +/************************************************************************ +* Name: MergeAllTestData +* Brief: Merge All Data of test result +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void MergeAllTestData(void) +{ + int iLen = 0; + + + iLen = sprintf(g_pTmpBuff, "TestItem, %d, ", m_iTestDataCount); + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pTmpBuff, iLen); + g_lenStoreMsgArea += iLen; + + + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pMsgAreaLine2, g_lenMsgAreaLine2); + g_lenStoreMsgArea += g_lenMsgAreaLine2; + + + iLen = sprintf(g_pTmpBuff, "\n\n\n\n\n\n\n\n\n"); + memcpy(g_pStoreMsgArea+g_lenStoreMsgArea, g_pTmpBuff, iLen); + g_lenStoreMsgArea += iLen; + + + memcpy(g_pStoreAllData, g_pStoreMsgArea, g_lenStoreMsgArea); + + + if (0 != g_lenStoreDataArea) { + memcpy(g_pStoreAllData+g_lenStoreMsgArea, g_pStoreDataArea, g_lenStoreDataArea); + } + + FTS_TEST_DBG("lenStoreMsgArea=%d, lenStoreDataArea = %d", g_lenStoreMsgArea, g_lenStoreDataArea); +} + + + +/************************************************************************ +* Name: AllocateMemory +* Brief: Allocate pointer Memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +int AllocateMemory(void) +{ + + g_pStoreMsgArea = NULL; + if (NULL == g_pStoreMsgArea) + g_pStoreMsgArea = fts_malloc(BUFF_LEN_STORE_MSG_AREA); + if (NULL == g_pStoreMsgArea) + goto ERR; + + g_pMsgAreaLine2 = NULL; + if (NULL == g_pMsgAreaLine2) + g_pMsgAreaLine2 = fts_malloc(BUFF_LEN_MSG_AREA_LINE2); + if (NULL == g_pMsgAreaLine2) + goto ERR; + + g_pStoreDataArea = NULL; + if (NULL == g_pStoreDataArea) + g_pStoreDataArea = fts_malloc(BUFF_LEN_STORE_DATA_AREA); + if (NULL == g_pStoreDataArea) + goto ERR; + + g_pTmpBuff = NULL; + if (NULL == g_pTmpBuff) + g_pTmpBuff = fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == g_pTmpBuff) + goto ERR; + + TestResult = NULL; + if (NULL == TestResult) + TestResult = fts_malloc(BUFF_LEN_TMP_BUFFER); + if (NULL == TestResult) + goto ERR; + + return 0; + +ERR: + FTS_TEST_ERROR("fts_malloc memory failed in function."); + return -EPERM; + +} + +/************************************************************************ +* Name: FreeMemory +* Brief: Release pointer memory +* Input: none +* Output: none +* Return: none +***********************************************************************/ +void FreeMemory(void) +{ + + if (NULL != g_pStoreMsgArea) + fts_free(g_pStoreMsgArea); + + if (NULL != g_pMsgAreaLine2) + fts_free(g_pMsgAreaLine2); + + if (NULL != g_pStoreDataArea) + fts_free(g_pStoreDataArea); + + if (NULL != g_pTmpBuff) + fts_free(g_pTmpBuff); +} diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_ini.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_ini.c new file mode 100755 index 0000000000000..9641490fc8e90 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_ini.c @@ -0,0 +1,433 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ini.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: parsing function of INI file +* +************************************************************************/ +#include +#include +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_main.h" + + +char CFG_SSL = '['; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char CFG_SSR = ']'; /* Section Symbol --Can be defined according to the special need to change. For example {} */ +char CFG_NIS = ':'; /* Separator between name and index */ +char CFG_NTS = '#'; /* annotator */ +char CFG_EQS = '='; /* The equal sign */ + + +ST_INI_FILE_DATA *g_st_ini_file_data = NULL; +int g_used_key_num = 0; + + +static int ini_file_get_line(char *filedata, char *buffer, int maxlen); +static long fts_atol(char *nptr); + + +/* Works only for digits and letters, but small and fast */ +#define TOLOWER(x) ((x) | 0x20) + +int fts_strncmp(const char *cs, const char *ct, size_t count) +{ + unsigned char c1 = 0, c2 = 0; + + while (count) { + c1 = TOLOWER(*cs++); + c2 = TOLOWER(*ct++); + if (c1 != c2) + return c1 < c2 ? -1 : 1; + if (!c1) + break; + count--; + } + return 0; +} + +/************************************************************* +Function: Get the value of key +Input: char * filedata; char * section; char * key +Output: char * value¡¡key +Return: 0 SUCCESS + -1 can not find section + -2 can not find key + -10 File open failed + -12 File read failed + -14 File format error + -22 Out of buffer size +Note: +*************************************************************/ +int ini_get_key(char *filedata, char *section, char *key, char *value) +{ + int i = 0; + int ret = -2; + for (i = 0; i < g_used_key_num; i++) { + if (fts_strncmp(section, g_st_ini_file_data[i].pSectionName, + g_st_ini_file_data[i].iSectionNameLen) != 0) + continue; + + if (strlen(key) == g_st_ini_file_data[i].iKeyNameLen) { + if (fts_strncmp(key, g_st_ini_file_data[i].pKeyName, g_st_ini_file_data[i].iKeyNameLen) == 0) + + { + memcpy(value, g_st_ini_file_data[i].pKeyValue, g_st_ini_file_data[i].iKeyValueLen); + ret = 0; + break; + } + } + } + + return ret; +} + +/************************************************************* +Function: Remove empty character on the right side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ini_str_trim_r(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + for (i = 0; i < len; i++) { + if (buf[i] != ' ') + break; + } + if (i < len) { + strncpy(tmp, (buf+i), (len-i)); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Remove empty character on the left side of the string +Input: char * buf --String pointer +Output: +Return: String pointer +Note: +*************************************************************/ +char *ini_str_trim_l(char *buf) +{ + int len, i; + char tmp[512]; + + memset(tmp, 0, sizeof(tmp)); + len = strlen(buf); + + + memset(tmp, 0x00, len); + + for (i = 0; i < len; i++) { + if (buf[len-i-1] != ' ') + break; + } + if (i < len) { + strncpy(tmp, buf, len-i); + } + strncpy(buf, tmp, len); + + return buf; +} + +/************************************************************* +Function: Read a line from file +Input: FILE *fp; int maxlen-- Maximum length of buffer +Output: char *buffer -- A string +Return: >0 Actual read length + -1 End of file + -2 Error reading file +Note: +*************************************************************/ +static int ini_file_get_line(char *filedata, char *buffer, int maxlen) +{ + int i = 0; + int j = 0; + int iRetNum = -1; + char ch1 = '\0'; + + for (i = 0, j = 0; i < maxlen; j++) { + ch1 = filedata[j]; + iRetNum = j+1; + if (ch1 == '\n' || ch1 == '\r') { + ch1 = filedata[j+1]; + if (ch1 == '\n' || ch1 == '\r') { + iRetNum++; + } + + break; + } else if (ch1 == 0x00) { + iRetNum = -1; + break; + } else { + buffer[i++] = ch1; /* ignore carriage return */ + } + } + buffer[i] = '\0'; + + return iRetNum; +} + +int my_fts_atoi(const char *str) +{ + int result = 0; + int signal = 1; /* The default is positive number*/ + if ((*str >= '0' && *str <= '9') || *str == '-' || *str == '+') { + if (*str == '-' || *str == '+') { + if (*str == '-') + signal = -1; /*enter negative number*/ + str++; + } + } else + return 0; + /*start transform*/ + while (*str >= '0' && *str <= '9') + result = result*10 + (*str++ - '0'); + + return signal*result; +} + +int isspace(int x) +{ + if (x == ' ' || x == '\t' || x == '\n' || x == '\f' || x == '\b' || x == '\r') + return 1; + else + return 0; +} + +int isdigit(int x) +{ + if (x <= '9' && x >= '0') + return 1; + else + return 0; + +} + +static long fts_atol(char *nptr) +{ + int c; /* current char */ + long total; /* current total */ + int sign; /* if ''-'', then negative, otherwise positive */ + /* skip whitespace */ + while (isspace((int)(unsigned char)*nptr)) + ++nptr; + c = (int)(unsigned char)*nptr++; + sign = c; /* save sign indication */ + if (c == '-' || c == '+') + c = (int)(unsigned char)*nptr++; /* skip sign */ + total = 0; + while (isdigit(c)) { + total = 10 * total + (c - '0'); /* accumulate digit */ + c = (int)(unsigned char)*nptr++; /* get next char */ + } + if (sign == '-') + return -total; + else + return total; /* return result, negated if necessary */ +} + +int fts_atoi(char *nptr) +{ + return (int)fts_atol(nptr); +} + +int init_key_data(void) +{ + int i = 0; + + FTS_TEST_FUNC_ENTER(); + + g_used_key_num = 0; + + g_st_ini_file_data = NULL; + if (NULL == g_st_ini_file_data) + g_st_ini_file_data = fts_malloc(sizeof(ST_INI_FILE_DATA)*MAX_KEY_NUM); + if (NULL == g_st_ini_file_data) { + FTS_TEST_ERROR("fts_malloc failed in function."); + return -EPERM; + } + for (i = 0; i < MAX_KEY_NUM; i++) { + memset(g_st_ini_file_data[i].pSectionName, 0, MAX_KEY_NAME_LEN); + memset(g_st_ini_file_data[i].pKeyName, 0, MAX_KEY_NAME_LEN); + memset(g_st_ini_file_data[i].pKeyValue, 0, MAX_KEY_VALUE_LEN); + g_st_ini_file_data[i].iSectionNameLen = 0; + g_st_ini_file_data[i].iKeyNameLen = 0; + g_st_ini_file_data[i].iKeyValueLen = 0; + } + + FTS_TEST_FUNC_EXIT(); + return 1; +} + +int release_key_data(void) +{ + if (NULL != g_st_ini_file_data) + fts_free(g_st_ini_file_data); + + return 0; +} +int print_key_data(void) +{ + int i = 0; + + + + FTS_TEST_DBG("g_used_key_num = %d", g_used_key_num); + for (i = 0; i < MAX_KEY_NUM; i++) { + + FTS_TEST_DBG("pSectionName_%d:%s, pKeyName_%d:%s\n,pKeyValue_%d:%s", + i, g_st_ini_file_data[i].pSectionName, + i, g_st_ini_file_data[i].pKeyName, + i, g_st_ini_file_data[i].pKeyValue + ); + + } + + return 1; +} +/************************************************************* +Function: Read all the parameters and values to the structure. +Return: Returns the number of key. If you go wrong, return a negative number. + -10 File open failed + -12 File read failed + -14 File format error +Note: +*************************************************************/ +int ini_get_key_data(char *filedata) +{ + + char buf1[MAX_CFG_BUF + 1] = {0}; + int n = 0; + int ret = 0; + int dataoff = 0; + int iEqualSign = 0; + int i = 0; + char tmpSectionName[MAX_CFG_BUF + 1] = {0}; + + + + FTS_TEST_FUNC_ENTER(); + + ret = init_key_data();/*init*/ + if (ret < 0) { + return -EPERM; + } + + g_used_key_num = 0; + while (1) { /*find section */ + ret = CFG_ERR_READ_FILE; + n = ini_file_get_line(filedata+dataoff, buf1, MAX_CFG_BUF); + + if (n < -1) + goto cfg_scts_end; + if (n < 0) + break;/* file end */ + if (n >= MAX_CFG_BUF) { + FTS_TEST_ERROR("Error Length:%d\n", n); + goto cfg_scts_end; + } + + dataoff += n; + + n = strlen(ini_str_trim_l(ini_str_trim_r(buf1))); + if (n == 0 || buf1[0] == CFG_NTS) + continue; /* A blank line or a comment line */ + ret = CFG_ERR_FILE_FORMAT; + + if (n > 2 && ((buf1[0] == CFG_SSL && buf1[n-1] != CFG_SSR))) { + FTS_TEST_ERROR("Bad Section:%s\n", buf1); + goto cfg_scts_end; + } + + + if (buf1[0] == CFG_SSL) { + g_st_ini_file_data[g_used_key_num].iSectionNameLen = n-2; + if (MAX_KEY_NAME_LEN < g_st_ini_file_data[g_used_key_num].iSectionNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + + buf1[n-1] = 0x00; + strcpy((char *)tmpSectionName, buf1+1); + + + continue; + } + + + strcpy(g_st_ini_file_data[g_used_key_num].pSectionName, tmpSectionName); + g_st_ini_file_data[g_used_key_num].iSectionNameLen = strlen(tmpSectionName); + + iEqualSign = 0; + for (i = 0; i < n; i++) { + if (buf1[i] == CFG_EQS) { + iEqualSign = i; + break; + } + } + if (0 == iEqualSign) + continue; + /* before equal sign is assigned to the key name*/ + g_st_ini_file_data[g_used_key_num].iKeyNameLen = iEqualSign; + if (MAX_KEY_NAME_LEN < g_st_ini_file_data[g_used_key_num].iKeyNameLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_NAME_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(g_st_ini_file_data[g_used_key_num].pKeyName, + buf1, g_st_ini_file_data[g_used_key_num].iKeyNameLen); + + /* After equal sign is assigned to the key value*/ + g_st_ini_file_data[g_used_key_num].iKeyValueLen = n-iEqualSign-1; + if (MAX_KEY_VALUE_LEN < g_st_ini_file_data[g_used_key_num].iKeyValueLen) { + ret = CFG_ERR_OUT_OF_LEN; + FTS_TEST_ERROR("MAX_KEY_VALUE_LEN: CFG_ERR_OUT_OF_LEN\n"); + goto cfg_scts_end; + } + memcpy(g_st_ini_file_data[g_used_key_num].pKeyValue, + buf1 + iEqualSign + 1, g_st_ini_file_data[g_used_key_num].iKeyValueLen); + + + ret = g_used_key_num; + + g_used_key_num++; /*Parameter number accumulation*/ + if (MAX_KEY_NUM < g_used_key_num) { + ret = CFG_ERR_TOO_MANY_KEY_NUM; + FTS_TEST_ERROR("MAX_KEY_NUM: CFG_ERR_TOO_MANY_KEY_NUM\n"); + goto cfg_scts_end; + } + } + + + + FTS_TEST_FUNC_EXIT(); + + return 0; + +cfg_scts_end: + + FTS_TEST_FUNC_EXIT(); + return ret; +} + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_main.c b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_main.c new file mode 100755 index 0000000000000..0342249e508ae --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/src/focaltech_test_main.c @@ -0,0 +1,252 @@ +/************************************************************************ +* Copyright (C) 2010-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_main.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: test entry for all IC +* +************************************************************************/ +#include +#include +#include +#include + +#include "../../focaltech_core.h" +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_ic_table.h" + + +#define FTS_TEST_STORE_DATA_SIZE 80*1024 + + + +FTS_I2C_READ_FUNCTION fts_i2c_read_test; +FTS_I2C_WRITE_FUNCTION fts_i2c_write_test; + +char *g_testparamstring = NULL; + +struct StTestFuncs g_stTestFuncs; + + +int init_i2c_read_func(FTS_I2C_READ_FUNCTION fpI2C_Read) +{ + unsigned char value = 0; + unsigned char recode = 0; + + FTS_TEST_FUNC_ENTER(); + + fts_i2c_read_test = fpI2C_Read; + if (NULL == fts_i2c_read_test) { + FTS_TEST_DBG("[focal] %s fts_i2c_read_test == NULL ", __func__); + } + + + recode = ReadReg(0xa6, &value); + if (recode != ERROR_CODE_OK) { + FTS_TEST_ERROR("[focal] ReadReg Error, code: %d ", recode); + } else { + FTS_TEST_DBG("[focal] ReadReg successed, Addr: 0xa6, value: 0x%02x ", value); + } + + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +int init_i2c_write_func(FTS_I2C_WRITE_FUNCTION fpI2C_Write) +{ + FTS_TEST_FUNC_ENTER(); + + fts_i2c_write_test = fpI2C_Write; + if (NULL == fts_i2c_write_test) { + FTS_TEST_ERROR("[focal] fts_i2c_read_test == NULL "); + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + + + +/************************************************************************ +* Name: set_param_data +* Brief: load Config. Set IC series, init test items, init basic threshold, int detailThreshold, and set order of test items +* Input: TestParamData, from ini file. +* Output: none +* Return: 0. No sense, just according to the old format. +***********************************************************************/ +int set_param_data(char *TestParamData) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + g_testparamstring = TestParamData; + ret = ini_get_key_data(g_testparamstring); + if (ret < 0) { + FTS_TEST_ERROR("ini_get_key_data error."); + return ret; + } + + + + OnInit_InterfaceCfg(g_testparamstring); + + /*Get IC Name*/ + fts_ic_table_get_ic_name_from_ic_code(g_ScreenSetParam.iSelectedIC, g_strIcName); + + + + if (g_stTestFuncs.OnInit_TestItem) { + g_stTestFuncs.OnInit_TestItem(g_testparamstring); + + } + + if (g_stTestFuncs.OnInit_BasicThreshold) { + g_stTestFuncs.OnInit_BasicThreshold(g_testparamstring); + + + } + + if (IC_Capacitance_Type == Self_Capacitance) { + OnInit_SCap_DetailThreshold(g_testparamstring); + } else if (IC_Capacitance_Type == Mutual_Capacitance) { + OnInit_MCap_DetailThreshold(g_testparamstring); + } else if (IC_Capacitance_Type == IDC_Capacitance) { + OnInit_Incell_DetailThreshold(g_testparamstring); + } + + if (g_stTestFuncs.SetTestItem) { + + g_stTestFuncs.SetTestItem(); + + } + + FTS_TEST_FUNC_EXIT(); + return 0; +} + +/************************************************************************ +* Name: start_test_tp +* Brief: Test entry. Select test items based on IC series +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ + +boolean start_test_tp(void) +{ + boolean bTestResult = false; + + FTS_TEST_FUNC_ENTER(); + FTS_TEST_DBG("IC_%s Test", g_strIcName); + + if (g_stTestFuncs.Start_Test) { + + bTestResult = g_stTestFuncs.Start_Test(); + + } else { + FTS_TEST_DBG("[Focal]Start_Test func null!\n"); + bTestResult = false; + } + + EnterWork(); + + FTS_TEST_FUNC_EXIT(); + + return bTestResult; +} +/************************************************************************ +* Name: get_test_data +* Brief: Get test data based on IC series +* Input: none +* Output: pTestData, External application for memory, buff size >= 1024*8 +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int get_test_data(char *pTestData) +{ + int iLen = 0; + FTS_TEST_DBG("[focal] %s start ", __func__); + + + if (g_stTestFuncs.Get_test_data) { + + iLen = g_stTestFuncs.Get_test_data(pTestData); + + } else { + FTS_TEST_DBG("[Focal]Get_test_data func null!\n"); + } + + FTS_TEST_FUNC_EXIT(); + return iLen; +} + +int focaltech_test_main_init(void) +{ + int ret = 0; + + FTS_TEST_FUNC_ENTER(); + + /*Allocate memory, storage test results*/ + g_pStoreAllData = NULL; + if (NULL == g_pStoreAllData) + g_pStoreAllData = fts_malloc(FTS_TEST_STORE_DATA_SIZE); + if (NULL == g_pStoreAllData) + return -EPERM; + + /* Allocate memory, assigned to detail threshold structure*/ + ret = malloc_struct_DetailThreshold(); + + FTS_TEST_FUNC_EXIT(); + + if (ret < 0) + return ret; + + return 0; +} +/************************************************************************ +* Name: free_test_param_data +* Brief: release printer memory +* Input: none +* Output: none +* Return: none. +***********************************************************************/ +int focaltech_test_main_exit(void) +{ + + FTS_TEST_DBG("[focal] release memory -start."); + + TestResultLen = 0; + + /* Release memory test results */ + if (NULL != g_pStoreAllData) { + FTS_TEST_DBG("[FTS] release memory g_pStoreAllData."); + fts_free(g_pStoreAllData); + g_pStoreAllData = NULL; + } + + + if (NULL != TestResult) { + FTS_TEST_DBG(" release memory TestResult."); + fts_free(TestResult); + TestResult = NULL; + } + + + /* Releasing the memory of the detailed threshold structure */ + FTS_TEST_DBG("[FTS] release memory free_struct_DetailThreshold."); + free_struct_DetailThreshold(); + + /* release memory of key data for ini file */ + release_key_data(); + FTS_TEST_DBG("[focal] release memory -end."); + return 0; +} + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/Makefile b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/Makefile new file mode 100755 index 0000000000000..424ad8511446a --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/Makefile @@ -0,0 +1,9 @@ +#drivers/input/touchscreen/focaltech_ts/focaltech_test +# +# Makefile for test module +# +# Linux driver folder +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_ft8716.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_config_ft8716.o +obj-$(CONFIG_TOUCHSCREEN_FTS) += focaltech_test_supported_ic.o + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_config_ft8716.c b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_config_ft8716.c new file mode 100755 index 0000000000000..7af2ebcc095ee --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_config_ft8716.c @@ -0,0 +1,360 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. + * Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: Focaltech_test_config_ft8716.c +* +* Author: Software Development Team, AE +* +* Created: 2016-08-01 +* +* Abstract: Set Config for FT8716 +* +************************************************************************/ +#include +#include + +#include "../include/focaltech_test_ini.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + +#if (FTS_CHIP_TEST_TYPE == FT8716_TEST) + + +struct stCfg_FT8716_TestItem g_stCfg_FT8716_TestItem; +struct stCfg_FT8716_BasicThreshold g_stCfg_FT8716_BasicThreshold; + +void OnInit_FT8716_TestItem(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + + GetPrivateProfileString("TestItem", "FW_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.FW_VERSION_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "FACTORY_ID_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.FACTORY_ID_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "PROJECT_CODE_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.PROJECT_CODE_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "IC_VERSION_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.IC_VERSION_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "RAWDATA_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.RAWDATA_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "CHANNEL_NUM_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.CHANNEL_NUM_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "INT_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.INT_PIN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "RESET_PIN_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.RESET_PIN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.NOISE_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "CB_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.CB_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "SHORT_CIRCUIT_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.SHORT_CIRCUIT_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "OPEN_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.OPEN_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "CB_UNIFORMITY_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.CB_UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "DIFFER_UNIFORMITY_TEST", "1", str, strIniFile); + g_stCfg_FT8716_TestItem.DIFFER_UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "DIFFER2_UNIFORMITY_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.DIFFER2_UNIFORMITY_TEST = fts_atoi(str); + + + GetPrivateProfileString("TestItem", "LCD_NOISE_TEST", "0", str, strIniFile); + g_stCfg_FT8716_TestItem.LCD_NOISE_TEST = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); +} + +void OnInit_FT8716_BasicThreshold(char *strIniFile) +{ + char str[512]; + + FTS_TEST_FUNC_ENTER(); + + + + GetPrivateProfileString("Basic_Threshold", "FW_VER_VALUE", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.FW_VER_VALUE = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Factory_ID_Number", "255", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Factory_ID_Number = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Project_Code", " ", str, strIniFile); + + sprintf(g_stCfg_FT8716_BasicThreshold.Project_Code, "%s", str); + + + GetPrivateProfileString("Basic_Threshold", "IC_Version", "3", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.IC_Version = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "RawDataTest_VA_Check", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.bRawDataTest_VA_Check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min", "5000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.RawDataTest_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max", "11000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.RawDataTest_Max = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_VKey_Check", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.bRawDataTest_VKey_Check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Min_VKey", "5000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.RawDataTest_Min_VKey = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "RawDataTest_Max_VKey", "11000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.RawDataTest_Max_VKey = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelX", "15", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelXNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_ChannelY", "24", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelYNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "ChannelNumTest_KeyNum", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.ChannelNumTest_KeyNum = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "ResetPinTest_RegAddr", "136", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.ResetPinTest_RegAddr = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "IntPinTest_RegAddr", "175", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.IntPinTest_RegAddr = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Coefficient", "50", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_Coefficient = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Frames", "32", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_Frames = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_Time", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_Time = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_SampeMode", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_SampeMode = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "NoiseTest_NoiseMode", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_NoiseMode = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_NoiseMode", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_NoiseMode = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "NoiseTest_ShowTip", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.NoiseTest_ShowTip = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "CBTest_VA_Check", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.bCBTest_VA_Check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Min", "3", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Max", "100", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Max = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_VKey_Check", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.bCBTest_VKey_Check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Min_Vkey", "3", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Min_Vkey = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Max_Vkey", "100", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Max_Vkey = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "CBTest_VKey_Double_Check", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.bCBTest_VKey_DCheck_Check = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Min_DCheck_Vkey", "140", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Min_DCheck_Vkey = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBTest_Max_DCheck_Vkey", "180", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CbTest_Max_DCheck_Vkey = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "ShortCircuit_ResMin", "1200", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.ShortCircuit_ResMin = fts_atoi(str); + /*GetPrivateProfileString("Basic_Threshold","ShortCircuit_K2Value","150",str,strIniFile); + g_stCfg_FT8716_BasicThreshold.ShortTest_K2Value = fts_atoi(str);*/ + + + GetPrivateProfileString("Basic_Threshold", "OpenTest_CBMin", "100", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.OpenTest_CBMin = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_Check_K1", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.OpenTest_Check_K1 = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_K1Threshold", "30", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.OpenTest_K1Threshold = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_Check_K2", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.OpenTest_Check_K2 = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "OpenTest_K2Threshold", "5", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.OpenTest_K2Threshold = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_Check_CHX", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_Check_CHX = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_Check_CHY", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_Check_CHY = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_Check_MinMax", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_Check_MinMax = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_CHX_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_CHX_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_CHY_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_CHY_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "CBUniformityTest_MinMax_Hole", "70", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.CBUniformityTest_MinMax_Hole = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Delta_Vol", "1", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DeltaVol = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_CHX", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_Check_CHX = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_CHY", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_Check_CHY = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_Check_MinMax", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_Check_MinMax = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_CHX_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_CHX_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_CHY_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_CHY_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "DifferUniformityTest_MinMax_Hole", "70", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.DifferUniformityTest_MinMax_Hole = fts_atoi(str); + + + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_Check_CHX", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_Check_CHX = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_Check_CHY", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_Check_CHY = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_CHX_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_CHX_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_CHY_Hole", "20", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_CHY_Hole = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_Differ_Min", "1000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_Differ_Min = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "Differ2UniformityTest_Differ_Max", "8000", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.Differ2UniformityTest_Differ_Max = fts_atoi(str); + + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_FrameNum", "200", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_FrameNum = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_Coefficient", "60", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_Coefficient = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_Coefficient_Key", "60", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_Coefficient_Key = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_NoiseMode", "0", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_NoiseMode = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_SequenceFrame", "5", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_SequenceFrame = fts_atoi(str); + GetPrivateProfileString("Basic_Threshold", "LCDNoiseTest_MaxFrame", "6", str, strIniFile); + g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_MaxFrame = fts_atoi(str); + + FTS_TEST_FUNC_EXIT(); + +} +void SetTestItem_FT8716(void) +{ + g_TestItemNum = 0; + + FTS_TEST_FUNC_ENTER(); + + + if (g_stCfg_FT8716_TestItem.FACTORY_ID_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_FACTORY_ID_TEST); + } + + + if (g_stCfg_FT8716_TestItem.PROJECT_CODE_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_PROJECT_CODE_TEST); + } + + + if (g_stCfg_FT8716_TestItem.FW_VERSION_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_FW_VERSION_TEST); + } + + + if (g_stCfg_FT8716_TestItem.IC_VERSION_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_IC_VERSION_TEST); + } + + + fts_SetTestItemCodeName(Code_FT8716_ENTER_FACTORY_MODE); + + + if (g_stCfg_FT8716_TestItem.CHANNEL_NUM_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_CHANNEL_NUM_TEST); + } + + + if (g_stCfg_FT8716_TestItem.CB_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_CB_TEST); + } + + + if (g_stCfg_FT8716_TestItem.CB_UNIFORMITY_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_CB_UNIFORMITY_TEST); + } + + + if (g_stCfg_FT8716_TestItem.RAWDATA_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_RAWDATA_TEST); + } + + + if (g_stCfg_FT8716_TestItem.NOISE_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_NOISE_TEST); + } + + + if (g_stCfg_FT8716_TestItem.LCD_NOISE_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_LCD_NOISE_TEST); + } + + + + if (g_stCfg_FT8716_TestItem.DIFFER_UNIFORMITY_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_DIFFER_UNIFORMITY_TEST); + } + + + + if (g_stCfg_FT8716_TestItem.OPEN_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_OPEN_TEST); + } + + + if (g_stCfg_FT8716_TestItem.SHORT_CIRCUIT_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_SHORT_CIRCUIT_TEST) ; + } + + + if (g_stCfg_FT8716_TestItem.DIFFER2_UNIFORMITY_TEST == 1) { + fts_SetTestItemCodeName(Code_FT8716_DIFFER2_UNIFORMITY_TEST); + } + + FTS_TEST_FUNC_EXIT(); + +} + +#endif + diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_ft8716.c b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_ft8716.c new file mode 100755 index 0000000000000..862e1892617ff --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_ft8716.c @@ -0,0 +1,1450 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_ft8716.c +* +* Author: Software Development +* +* Created: 2016-08-01 +* +* Abstract: test item for FT8716 +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ +#include +#include +#include + +#include "../include/focaltech_test_detail_threshold.h" +#include "../include/focaltech_test_supported_ic.h" +#include "../include/focaltech_test_main.h" +#include "../focaltech_test_config.h" + +/***************************************************************************** +* Private constant and macro definitions using #define +*****************************************************************************/ +#if (FTS_CHIP_TEST_TYPE == FT8716_TEST) + + + + + +#define DEVIDE_MODE_ADDR 0x00 +#define REG_LINE_NUM 0x01 +#define REG_TX_NUM 0x02 +#define REG_RX_NUM 0x03 +#define FT8716_LEFT_KEY_REG 0X1E +#define FT8716_RIGHT_KEY_REG 0X1F + +#define REG_CbAddrH 0x18 +#define REG_CbAddrL 0x19 +#define REG_OrderAddrH 0x1A +#define REG_OrderAddrL 0x1B + +#define REG_RawBuf0 0x6A +#define REG_RawBuf1 0x6B +#define REG_OrderBuf0 0x6C +#define REG_CbBuf0 0x6E + +#define REG_K1Delay 0x31 +#define REG_K2Delay 0x32 +#define REG_SCChannelCf 0x34 +#define REG_LCD_NOISE_FRAME 0X12 +#define REG_LCD_NOISE_START 0X11 +#define REG_LCD_NOISE_NUMBER 0X13 +#define REG_LCD_NOISE_DATA_READY 0X00 +#define REG_FWVERSION 0xA6 +#define REG_FACTORYID 0xA8 +#define REG_FWCNT 0x17 +#define pre 1 +#define REG_CLB 0x04 + + +/***************************************************************************** +* Private enumerations, structures and unions using typedef +*****************************************************************************/ + +enum NOISE_TYPE { + NT_AvgData = 0, + NT_MaxData = 1, + NT_MaxDevication = 2, + NT_DifferData = 3, +}; + +unsigned char localbitWise; +void SetKeyBitVal(unsigned char val) +{ + + localbitWise = val; + +} + +bool IsKeyAutoFit(void) +{ + return ((localbitWise & 0x0f) == 1); +} + + +/***************************************************************************** +* Static variables +*****************************************************************************/ + +static int m_RawData[TX_NUM_MAX][RX_NUM_MAX] = {{0, 0} } ; +static int m_CBData[TX_NUM_MAX][RX_NUM_MAX] = {{0, 0} } ; +static BYTE m_ucTempData[TX_NUM_MAX * RX_NUM_MAX*2] = {0}; +static int m_iTempRawData[TX_NUM_MAX * RX_NUM_MAX] = {0}; + + + +static int LCD_Noise[TX_NUM_MAX][RX_NUM_MAX] = {{0} } ; + + + + + + + +/***************************************************************************** +* Global variable or extern global variabls/functions +*****************************************************************************/ +extern struct stCfg_FT8716_BasicThreshold g_stCfg_FT8716_BasicThreshold; + +/***************************************************************************** +* Static function prototypes +*****************************************************************************/ + + +static int StartScan(void); +static unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer); +static unsigned char GetPanelRows(unsigned char *pPanelRows); +static unsigned char GetPanelCols(unsigned char *pPanelCols); +static unsigned char GetTxRxCB(unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer); +static unsigned char GetRawData(void); +static unsigned char GetChannelNum(void); +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount); +static unsigned char ChipClb(unsigned char *pClbResult); + + + + + +boolean FT8716_StartTest(void); +int FT8716_get_test_data(char *pTestData); + +unsigned char FT8716_TestItem_EnterFactoryMode(void); +unsigned char FT8716_TestItem_RawDataTest(bool *bTestResult); +unsigned char FT8716_TestItem_CbTest(bool *bTestResult); +unsigned char FT8716_TestItem_ChannelsTest(bool *bTestResult); +unsigned char FT8716_TestItem_LCDNoiseTest(bool *bTestResult); +unsigned char FT8716_CheckItem_FactoryIdTest(bool *bTestResult); + +/************************************************************************ +* Name: FT8716_StartTest +* Brief: Test entry. Determine which test item to test +* Input: none +* Output: none +* Return: Test Result, PASS or FAIL +***********************************************************************/ + +boolean FT8716_StartTest() +{ + bool bTestResult = true, bTempResult = 1; + unsigned char ReCode; + unsigned char ucDevice = 0; + int iItemCount = 0; + + + + if (InitTest() < 0) { + FTS_TEST_ERROR("[focal] Failed to init test."); + return false; + } + + + if (0 == g_TestItemNum) + bTestResult = false; + + + for (iItemCount = 0; iItemCount < g_TestItemNum; iItemCount++) { + m_ucTestItemCode = g_stTestItem[ucDevice][iItemCount].ItemCode; + + + if (Code_FT8716_ENTER_FACTORY_MODE == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8716_TestItem_EnterFactoryMode(); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + break; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8716_RAWDATA_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8716_TestItem_RawDataTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8716_CB_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + ReCode = FT8716_TestItem_CbTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8716_CHANNEL_NUM_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode) { + ReCode = FT8716_TestItem_ChannelsTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + break; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + + } + + + if (Code_FT8716_LCD_NOISE_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode) { + ReCode = FT8716_TestItem_LCDNoiseTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + if (Code_FT8716_FACTORY_ID_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode) { + ReCode = FT8716_CheckItem_FactoryIdTest(&bTempResult); + if (ERROR_CODE_OK != ReCode || (!bTempResult)) { + bTestResult = false; + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_NG; + } else + g_stTestItem[ucDevice][iItemCount].TestResult = RESULT_PASS; + } + + + } + + + FinishTest(); + + + return bTestResult; + +} + +/************************************************************************ +* Name: FT8716_TestItem_EnterFactoryMode +* Brief: Check whether TP can enter Factory Mode, and do some thing +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_TestItem_EnterFactoryMode(void) +{ + + unsigned char ReCode = ERROR_CODE_INVALID_PARAM; + int iRedo = 5; + int i ; + unsigned char keyFit = 0; + SysDelay(150); + FTS_TEST_DBG("Enter factory mode..."); + for (i = 1; i <= iRedo; i++) { + ReCode = EnterFactory(); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Enter factory mode..."); + if (i < iRedo) { + SysDelay(50); + continue; + } + } else { + FTS_TEST_DBG(" success to Enter factory mode..."); + break; + } + + } + SysDelay(300); + + if (ReCode == ERROR_CODE_OK) { + ReCode = GetChannelNum(); + + ReCode = ReadReg(0xFC, &keyFit); + SetKeyBitVal(keyFit); + } + return ReCode; +} + +/************************************************************************ +* Name: FT8716_TestItem_RawDataTest +* Brief: TestItem: RawDataTest. Check if MCAP RawData is within the range. +* Input: bTestResult +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_TestItem_RawDataTest(bool *bTestResult) +{ + unsigned char ReCode; + bool btmpresult = true; + int RawDataMin; + int RawDataMax; + int iValue = 0; + int i = 0; + int iRow, iCol; + bool bIncludeKey = false; + + + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Raw Data Test\n"); + + bIncludeKey = g_stCfg_FT8716_BasicThreshold.bRawDataTest_VKey_Check; + + + for (i = 0 ; i < 3; i++) { + ReCode = WriteReg(0x06, 0x00); + SysDelay(10); + ReCode = GetRawData(); + } + + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to get Raw Data!! Error Code: %d", ReCode); + return ReCode; + } + + + + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; iRow++) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; iCol++) { + FTS_TEST_DBG("%5d, ", m_RawData[iRow][iCol]); + } + } + + FTS_TEST_DBG("\nKeys: "); + if (IsKeyAutoFit()) { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNum; iCol++) + FTS_TEST_DBG("%5d, ", m_RawData[g_stSCapConfEx.ChannelXNum][iCol]); + } else { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; iCol++) { + FTS_TEST_DBG("%5d, ", m_RawData[g_stSCapConfEx.ChannelXNum][iCol]); + } + } + + + + + + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; iRow++) { + + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_Incell_DetailThreshold.RawDataTest_Min[iRow][iCol]; + RawDataMax = g_stCfg_Incell_DetailThreshold.RawDataTest_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + + + if (bIncludeKey) { + + iRow = g_stSCapConfEx.ChannelXNum; + if (IsKeyAutoFit()) { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNum; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_Incell_DetailThreshold.RawDataTest_Min[iRow][iCol]; + RawDataMax = g_stCfg_Incell_DetailThreshold.RawDataTest_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } else { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + RawDataMin = g_stCfg_Incell_DetailThreshold.RawDataTest_Min[iRow][iCol]; + RawDataMax = g_stCfg_Incell_DetailThreshold.RawDataTest_Max[iRow][iCol]; + iValue = m_RawData[iRow][iCol]; + + if (iValue < RawDataMin || iValue > RawDataMax) { + btmpresult = false; + FTS_TEST_ERROR("rawdata test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, RawDataMin, RawDataMax); + } + } + } + } + + + Save_Test_Data(m_RawData, 0, g_stSCapConfEx.ChannelXNum+1, g_stSCapConfEx.ChannelYNum, 1); + + + TestResultLen += sprintf(TestResult+TestResultLen, "RawData Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//RawData Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//RawData Test is NG!"); + } + return ReCode; +} + + +/************************************************************************ +* Name: FT8716_TestItem_CbTest +* Brief: TestItem: Cb Test. Check if Cb is within the range. +* Input: none +* Output: bTestResult, PASS or FAIL +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_TestItem_CbTest(bool *bTestResult) +{ + bool btmpresult = true; + unsigned char ReCode = ERROR_CODE_OK; + int iRow = 0; + int iCol = 0; + int iMaxValue = 0; + int iMinValue = 0; + int iValue = 0; + bool bIncludeKey = false; + + unsigned char bClbResult = 0; + unsigned char ucBits = 0; + int ReadKeyLen = g_stSCapConfEx.KeyNumTotal; + + bIncludeKey = g_stCfg_FT8716_BasicThreshold.bCBTest_VKey_Check; + + FTS_TEST_INFO("\n\n==============================Test Item: -------- CB Test\n"); + + + ReCode = ChipClb(&bClbResult); + if (ERROR_CODE_OK != ReCode) { + btmpresult = false; + FTS_TEST_ERROR("\r\n//========= auto clb Failed!"); + } + + ReCode = ReadReg(0x0B, &ucBits); + if (ERROR_CODE_OK != ReCode) { + btmpresult = false; + FTS_TEST_ERROR("\r\n//========= Read Reg Failed!"); + } + + ReadKeyLen = g_stSCapConfEx.KeyNumTotal; + if (ucBits != 0) { + ReadKeyLen = g_stSCapConfEx.KeyNumTotal * 2; + } + + + + ReCode = GetTxRxCB(0, (short)(g_stSCapConfEx.ChannelXNum * g_stSCapConfEx.ChannelYNum + ReadKeyLen), m_ucTempData); + if (ERROR_CODE_OK != ReCode) { + btmpresult = false; + FTS_TEST_ERROR("Failed to get CB value..."); + goto TEST_ERR; + } + + memset(m_CBData, 0, sizeof(m_CBData)); + + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + m_CBData[iRow][iCol] = m_ucTempData[iRow * g_stSCapConfEx.ChannelYNum + iCol]; + } + } + + + for (iCol = 0; iCol < ReadKeyLen/*g_stSCapConfEx.KeyNumTotal*/; ++iCol) { + if (ucBits != 0) { + m_CBData[g_stSCapConfEx.ChannelXNum][iCol/2] = (short)((m_ucTempData[g_stSCapConfEx.ChannelXNum*g_stSCapConfEx.ChannelYNum + iCol] & 0x01)<<8) + m_ucTempData[g_stSCapConfEx.ChannelXNum*g_stSCapConfEx.ChannelYNum + iCol + 1]; + iCol++; + } else { + m_CBData[g_stSCapConfEx.ChannelXNum][iCol] = m_ucTempData[g_stSCapConfEx.ChannelXNum*g_stSCapConfEx.ChannelYNum + iCol]; + } + + } + + + + + + + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; iRow++) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; iCol++) { + FTS_TEST_DBG("%3d, ", m_CBData[iRow][iCol]); + } + } + FTS_TEST_DBG("\nKeys: "); + if (IsKeyAutoFit()) { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNum; iCol++) { + FTS_TEST_DBG("%3d, ", m_CBData[g_stSCapConfEx.ChannelXNum][iCol]); + + } + + } else { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; iCol++) { + FTS_TEST_DBG("%3d, ", m_CBData[g_stSCapConfEx.ChannelXNum][iCol]); + } + } + + + + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; iRow++) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; iCol++) { + if ((0 == g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol])) { + continue; + } + iMinValue = g_stCfg_Incell_DetailThreshold.CBTest_Min[iRow][iCol]; + iMaxValue = g_stCfg_Incell_DetailThreshold.CBTest_Max[iRow][iCol]; + iValue = focal_abs(m_CBData[iRow][iCol]); + + if (iValue < iMinValue || iValue > iMaxValue) { + btmpresult = false; + FTS_TEST_ERROR("CB test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, iMinValue, iMaxValue); + } + } + } + + + if (bIncludeKey) { + + iRow = g_stSCapConfEx.ChannelXNum; + if (IsKeyAutoFit()) { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNum; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) { + continue; + } + iMinValue = g_stCfg_Incell_DetailThreshold.CBTest_Min[iRow][iCol]; + iMaxValue = g_stCfg_Incell_DetailThreshold.CBTest_Max[iRow][iCol]; + iValue = focal_abs(m_CBData[iRow][iCol]); + + if (iValue < iMinValue || iValue > iMaxValue) { + btmpresult = false; + FTS_TEST_ERROR("CB test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, iMinValue, iMaxValue); + } + } + } else { + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + iMinValue = g_stCfg_Incell_DetailThreshold.CBTest_Min[iRow][iCol]; + iMaxValue = g_stCfg_Incell_DetailThreshold.CBTest_Max[iRow][iCol]; + iValue = focal_abs(m_CBData[iRow][iCol]); + + if (iValue < iMinValue || iValue > iMaxValue) { + btmpresult = false; + FTS_TEST_ERROR("CB test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d) ", \ + iRow+1, iCol+1, iValue, iMinValue, iMaxValue); + } + } + } + } + + + Save_Test_Data(m_CBData, 0, g_stSCapConfEx.ChannelXNum+1, g_stSCapConfEx.ChannelYNum, 1); + + TestResultLen += sprintf(TestResult+TestResultLen, "CB Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//CB Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//CB Test is NG!"); + } + + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO("\n\n//CB Test is NG!"); + + TestResultLen += sprintf(TestResult+TestResultLen, "CB Test is NG. \n\n"); + + return ReCode; +} + + +/************************************************************************ +* Name: FT8716_TestItem_ChannelsTest +* Brief: Check whether TP can enter Factory Mode, and do some thing +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_TestItem_ChannelsTest(bool *bTestResult) +{ + unsigned char ReCode; + + FTS_TEST_DBG("\n\n==============================Test Item: -------- Channel Test "); + + ReCode = GetChannelNum(); + if (ReCode == ERROR_CODE_OK) { + if ((g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelXNum == g_stSCapConfEx.ChannelXNum) + && (g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelYNum == g_stSCapConfEx.ChannelYNum) + && (g_stCfg_FT8716_BasicThreshold.ChannelNumTest_KeyNum == g_stSCapConfEx.KeyNum)) { + *bTestResult = true; + FTS_TEST_DBG("\n\nGet channels: (CHx: %d, CHy: %d, Key: %d), Set channels: (CHx: %d, CHy: %d, Key: %d)", + g_stSCapConfEx.ChannelXNum, g_stSCapConfEx.ChannelYNum, g_stSCapConfEx.KeyNum, + g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelXNum, g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelYNum, g_stCfg_FT8716_BasicThreshold.ChannelNumTest_KeyNum); + + FTS_TEST_INFO("\n//Channel Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_ERROR("\n\nGet channels: (CHx: %d, CHy: %d, Key: %d), Set channels: (CHx: %d, CHy: %d, Key: %d)", + g_stSCapConfEx.ChannelXNum, g_stSCapConfEx.ChannelYNum, g_stSCapConfEx.KeyNum, + g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelXNum, g_stCfg_FT8716_BasicThreshold.ChannelNumTest_ChannelYNum, g_stCfg_FT8716_BasicThreshold.ChannelNumTest_KeyNum); + + FTS_TEST_INFO("\n//Channel Test is NG!"); + } + } + + + TestResultLen += sprintf(TestResult+TestResultLen, "Channel Test is %s. \n\n", (*bTestResult ? "OK" : "NG")); + + return ReCode; +} + +/************************************************************************ +* Name: SqrtNew +* Brief: calculate sqrt of input. +* Input: unsigned int n +* Output: none +* Return: sqrt of n. +***********************************************************************/ +unsigned int SqrtNew(unsigned int n) +{ + unsigned int val = 0, last = 0; + unsigned char i = 0;; + + if (n < 6) { + if (n < 2) { + return n; + } + return n/2; + } + val = n; + i = 0; + while (val > 1) { + val >>= 1; + i++; + } + val <<= (i >> 1); + val = (val + val + val) >> 1; + do { + last = val; + val = ((val + n/val) >> 1); + } while (focal_abs(val-last) > pre); + return val; +} + +/************************************************************************ +* Name: FT8716_TestItem_LCDNoiseTest +* Brief: obtain is differ mode the data and calculate the corresponding type of noise value. +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_TestItem_LCDNoiseTest(bool *bTestResult) +{ + + unsigned char ReCode = ERROR_CODE_OK; + bool bResultFlag = true; + int FrameNum = 0; + int i = 0; + int iRow = 0; + int iCol = 0; + int iValueMin = 0; + int iValueMax = 0; + int iValue = 0; + int ikey = 0; + unsigned char regData = 0, oldMode = 0, chNewMod = 0, DataReady = 0; + unsigned char chNoiseValueVa = 0xff, chNoiseValueKey = 0xff; + + FTS_TEST_INFO("\r\n\r\n==============================Test Item: -------- LCD Noise Test \r\n"); + + ReCode = ReadReg(0x06, &oldMode); + ReCode = WriteReg(0x06, 0x01); + + + SysDelay(50); + ReCode = ReadReg(0x06, &chNewMod); + if (ReCode != ERROR_CODE_OK || chNewMod != 1) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nSwitch Mode Failed!\r\n"); + goto TEST_ERR; + } + + FrameNum = g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_FrameNum/4; + ReCode = WriteReg(REG_LCD_NOISE_FRAME, FrameNum); + + + SysDelay(50); + if (ReCode != ERROR_CODE_OK) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nWrite Reg Failed!\r\n"); + goto TEST_ERR; + } + + ReCode = WriteReg(REG_LCD_NOISE_START, 0x01); + for (i = 0; i < 100; i++) { + SysDelay(50); + + ReCode = ReadReg(REG_LCD_NOISE_DATA_READY, &DataReady); + if (0x00 == (DataReady>>7)) { + SysDelay(5); + ReCode = ReadReg(REG_LCD_NOISE_START, &DataReady); + if (DataReady == 0x00) { + break; + } else { + continue; + } + } else { + continue; + } + + + if (99 == i) { + ReCode = WriteReg(REG_LCD_NOISE_START, 0x00); + if (ReCode != ERROR_CODE_OK) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nRestore Failed!\r\n"); + goto TEST_ERR; + } + + bResultFlag = false; + FTS_TEST_ERROR("\r\nTime Over!\r\n"); + goto TEST_ERR; + } + } + + memset(m_RawData, 0, sizeof(m_RawData)); + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + + + ReCode = ReadRawData(0, 0xAD, g_stSCapConfEx.ChannelXNum * g_stSCapConfEx.ChannelYNum * 2, m_iTempRawData); + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + m_RawData[iRow][iCol] = m_iTempRawData[iRow * g_stSCapConfEx.ChannelYNum + iCol]; + } + } + + + ReCode = ReadRawData(0, 0xAE, g_stSCapConfEx.KeyNumTotal * 2, m_iTempRawData); + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; ++iCol) { + m_RawData[g_stSCapConfEx.ChannelXNum][iCol] = m_iTempRawData[iCol]; + } + + ReCode = WriteReg(REG_LCD_NOISE_START, 0x00); + if (ReCode != ERROR_CODE_OK) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nRestore Failed!\r\n"); + goto TEST_ERR; + } + ReCode = ReadReg(REG_LCD_NOISE_NUMBER, ®Data); + if (regData <= 0) { + regData = 1; + } + + ReCode = WriteReg(0x06, oldMode); + if (ReCode != ERROR_CODE_OK) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nWrite Reg Failed!\r\n"); + goto TEST_ERR; + } + + if (0 == g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_NoiseMode) { + for (iRow = 0; iRow <= g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + LCD_Noise[iRow][iCol] = m_RawData[iRow][iCol]; + } + } + } + + if (1 == g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_NoiseMode) { + for (iRow = 0; iRow <= g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + LCD_Noise[iRow][iCol] = SqrtNew(m_RawData[iRow][iCol] / regData); + } + } + } + + ReCode = EnterWork(); + SysDelay(100); + ReCode = ReadReg(0x80, &chNoiseValueVa); + ReCode = ReadReg(0x82, &chNoiseValueKey); + ReCode = EnterFactory(); + SysDelay(200); + if (ReCode != ERROR_CODE_OK) { + bResultFlag = false; + FTS_TEST_ERROR("\r\nEnter factory mode failed.\r\n"); + } + +#if 1 + FTS_TEST_DBG("\nVA Channels: "); + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum+1; ++iRow) { + FTS_TEST_DBG("\nCh_%02d: ", iRow+1); + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + + FTS_TEST_DBG("%4d, ", LCD_Noise[iRow][iCol]); + } + } + FTS_TEST_DBG("\n"); +#endif + + + iValueMin = 0; + iValueMax = g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_Coefficient * chNoiseValueVa * 32 / 100; + + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; iRow++) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; iCol++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[iRow][iCol] == 0) + continue; + + iValue = LCD_Noise[iRow][iCol]; + if (iValue < iValueMin || iValue > iValueMax) { + bResultFlag = false; + FTS_TEST_ERROR(" LCD Noise test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d). \n", + iRow+1, iCol+1, iValue, iValueMin, iValueMax); + } + } + } + + FTS_TEST_DBG(" Va_Set_Range=(%d, %d). ", iValueMin, iValueMax); + + + iValueMin = 0; + iValueMax = g_stCfg_FT8716_BasicThreshold.LCDNoiseTest_Coefficient_Key * chNoiseValueKey * 32 / 100; + for (ikey = 0; ikey < g_stSCapConfEx.KeyNumTotal; ikey++) { + if (g_stCfg_Incell_DetailThreshold.InvalidNode[g_stSCapConfEx.ChannelXNum][ikey] == 0) + continue; + iValue = LCD_Noise[g_stSCapConfEx.ChannelXNum][ikey]; + if (iValue < iValueMin || iValue > iValueMax) { + bResultFlag = false; + FTS_TEST_ERROR(" LCD Noise test failure. Node=(%d, %d), Get_value=%d, Set_Range=(%d, %d). \n", + g_stSCapConfEx.ChannelXNum+1, ikey+1, iValue, iValueMin, iValueMax); + } + } + + FTS_TEST_DBG("Key_Set_Range=(%d, %d). ", iValueMin, iValueMax); + + Save_Test_Data(LCD_Noise, 0, g_stSCapConfEx.ChannelXNum + 1, g_stSCapConfEx.ChannelYNum, 1); + + TestResultLen += sprintf(TestResult+TestResultLen, " LCD Noise Test is %s. \n\n", (bResultFlag ? "OK" : "NG")); + + if (bResultFlag) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//LCD Noise Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//LCD Noise Test is NG!"); + } + + return ReCode; + +TEST_ERR: + + *bTestResult = false; + FTS_TEST_INFO("\n\n//LCD Noise Test is NG!"); + + TestResultLen += sprintf(TestResult+TestResultLen, " LCD Noise Test is NG. \n\n"); + + return ReCode; + +} + + + +/************************************************************************ +* Name: FT8716_CheckItem_FactoryIdTest +* Brief: Factory Id Testt. +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +unsigned char FT8716_CheckItem_FactoryIdTest(bool *bTestResult) +{ + unsigned char ReCode = ERROR_CODE_OK; + bool btmpresult = true; + unsigned char regData = 0; + unsigned char FactoryId = 0; + + FTS_TEST_INFO("\n\n==============================Test Item: -------- Factory Id Test\n"); + + ReCode = EnterWork(); + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR(" EnterWork failed.. Error Code: %d \n", ReCode); + btmpresult = false; + goto TEST_ERR; + } + + + SysDelay(60); + ReCode = ReadReg(REG_FACTORYID, ®Data); + + if (ReCode != ERROR_CODE_OK) { + FTS_TEST_ERROR(" Failed to Read Register: %x. Error Code: %d \n", REG_FACTORYID, ReCode); + goto TEST_ERR; + } + + FactoryId = g_stCfg_FT8716_BasicThreshold.Factory_ID_Number; + + FTS_TEST_DBG("\r\nGet FactoryId:0x%02x, Set FactoryId: 0x%02x \n", regData, FactoryId); + + if (FactoryId == regData) { + btmpresult = true; + + } else { + btmpresult = false; + } + + TestResultLen += sprintf(TestResult+TestResultLen, " FactoryId Test is %s. \n\n", (btmpresult ? "OK" : "NG")); + + if (btmpresult) { + *bTestResult = true; + FTS_TEST_INFO("\n\n//FactoryId Test is OK!"); + } else { + *bTestResult = false; + FTS_TEST_INFO("\n\n//FactoryId Test is NG!"); + } + return ReCode; + +TEST_ERR: + *bTestResult = false; + FTS_TEST_INFO("\n\n//FactoryId Test is NG!"); + + TestResultLen += sprintf(TestResult+TestResultLen, " FactoryId Test is NG. \n\n"); + + return ReCode; +} + + +static unsigned char ChipClb(unsigned char *pClbResult) +{ + unsigned char RegData = 0; + unsigned char TimeOutTimes = 50; + unsigned char ReCode = ERROR_CODE_OK; + + ReCode = WriteReg(REG_CLB, 4); + + if (ReCode == ERROR_CODE_OK) { + while (TimeOutTimes--) { + SysDelay(100); + ReCode = WriteReg(DEVIDE_MODE_ADDR, 0x04<<4); + ReCode = ReadReg(0x04, &RegData); + if (ReCode == ERROR_CODE_OK) { + if (RegData == 0x02) { + *pClbResult = 1; + break; + } + } else { + break; + } + } + + if (TimeOutTimes == 0) { + *pClbResult = 0; + } + } + return ReCode; +} +/************************************************************************ +* Name: FT8716_get_test_data +* Brief: get data of test result +* Input: none +* Output: pTestData, the returned buff +* Return: the length of test data. if length > 0, got data;else ERR. +***********************************************************************/ +int FT8716_get_test_data(char *pTestData) +{ + if (NULL == pTestData) { + FTS_TEST_ERROR(" pTestData == NULL "); + return -EPERM; + } + memcpy(pTestData, g_pStoreAllData, (g_lenStoreMsgArea+g_lenStoreDataArea)); + return (g_lenStoreMsgArea+g_lenStoreDataArea); +} + + +/************************************************************************ +* Name: Save_Test_Data +* Brief: Storage format of test data +* Input: int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount +* Output: none +* Return: none +***********************************************************************/ +static void Save_Test_Data(int iData[TX_NUM_MAX][RX_NUM_MAX], int iArrayIndex, unsigned char Row, unsigned char Col, unsigned char ItemCount) +{ + int iLen = 0; + int i = 0, j = 0; + + + iLen = sprintf(g_pTmpBuff, "NA, %d, %d, %d, %d, %d, ", \ + m_ucTestItemCode, Row, Col, m_iStartLine, ItemCount); + memcpy(g_pMsgAreaLine2+g_lenMsgAreaLine2, g_pTmpBuff, iLen); + g_lenMsgAreaLine2 += iLen; + + m_iStartLine += Row; + m_iTestDataCount++; + + + for (i = 0+iArrayIndex; (i < Row+iArrayIndex) && (i < TX_NUM_MAX); i++) { + for (j = 0; (j < Col) && (j < RX_NUM_MAX); j++) { + if (j == (Col - 1)) + iLen = sprintf(g_pTmpBuff, "%d, \n", iData[i][j]); + else + iLen = sprintf(g_pTmpBuff, "%d, ", iData[i][j]); + + memcpy(g_pStoreDataArea+g_lenStoreDataArea, g_pTmpBuff, iLen); + g_lenStoreDataArea += iLen; + } + } + +} + + +/************************************************************************ +* Name: StartScan(Same function name as FT_MultipleTest) +* Brief: Scan TP, do it before read Raw Data +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static int StartScan(void) +{ + unsigned char RegVal = 0x00; + unsigned char times = 0; + const unsigned char MaxTimes = 20; + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + + + + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RegVal); + printk("hb1 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + if (ReCode == ERROR_CODE_OK) { + RegVal |= 0x80; + ReCode = WriteReg(DEVIDE_MODE_ADDR, RegVal); + printk("hb2 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + if (ReCode == ERROR_CODE_OK) { + while (times++ < MaxTimes) { + SysDelay(8); + ReCode = ReadReg(DEVIDE_MODE_ADDR, &RegVal); + printk("hb3 :RegVal:0x%x, ReCode:0x%x, times:0x%x\n", RegVal, ReCode, times); + if (ReCode == ERROR_CODE_OK) { + if ((RegVal>>7) == 0) { + printk("hb4 :RegVal>>7:0x%x, ReCode:0x%x\n", RegVal>>7, ReCode); + break; + } + } else { + printk("hb5 :RegVal:0x%x, ReCode:0x%x\n", RegVal, ReCode); + break; + } + } + if (times < MaxTimes) { + printk("hb6 :times:0x%x, MaxTimes:0x%x ------OK\n", times, MaxTimes); + ReCode = ERROR_CODE_OK; + } + else{ + printk("hb6 :times:0x%x, MaxTimes:0x%x ------FAIL\n", times, MaxTimes); + ReCode = ERROR_CODE_COMM_ERROR; + } + } + } + return ReCode; + +} +/************************************************************************ +* Name: ReadRawData(Same function name as FT_MultipleTest) +* Brief: read Raw Data +* Input: Freq(No longer used, reserved), LineNum, ByteNum +* Output: pRevBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char ReadRawData(unsigned char Freq, unsigned char LineNum, int ByteNum, int *pRevBuffer) +{ + unsigned char ReCode = ERROR_CODE_COMM_ERROR; + unsigned char I2C_wBuffer[3] = {0}; + unsigned char pReadData[ByteNum]; + + int i, iReadNum; + unsigned short BytesNumInTestMode1 = 0; + + iReadNum = ByteNum/BYTES_PER_TIME; + + if (0 != (ByteNum%BYTES_PER_TIME)) + iReadNum++; + + if (ByteNum <= BYTES_PER_TIME) { + BytesNumInTestMode1 = ByteNum; + } else { + BytesNumInTestMode1 = BYTES_PER_TIME; + } + + ReCode = WriteReg(REG_LINE_NUM, LineNum); + + + + I2C_wBuffer[0] = REG_RawBuf0; + if (ReCode == ERROR_CODE_OK) { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(I2C_wBuffer, 1, pReadData, BytesNumInTestMode1); + } + + for (i = 1; i < iReadNum; i++) { + if (ReCode != ERROR_CODE_OK) + break; + + if (i == iReadNum-1) { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(NULL, 0, pReadData+BYTES_PER_TIME*i, ByteNum-BYTES_PER_TIME*i); + } else { + focal_msleep(10); + ReCode = Comm_Base_IIC_IO(NULL, 0, pReadData+BYTES_PER_TIME*i, BYTES_PER_TIME); + } + + } + + if (ReCode == ERROR_CODE_OK) { + for (i = 0; i < (ByteNum>>1); i++) { + pRevBuffer[i] = (pReadData[i<<1]<<8)+pReadData[(i<<1)+1]; + + + + + } + } + + + return ReCode; + +} +/************************************************************************ +* Name: GetTxRxCB(Same function name as FT_MultipleTest) +* Brief: get CB of Tx/Rx +* Input: StartNodeNo, ReadNum +* Output: pReadBuffer +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetTxRxCB(unsigned short StartNodeNo, unsigned short ReadNum, unsigned char *pReadBuffer) +{ + unsigned char ReCode = ERROR_CODE_OK; + unsigned short usReturnNum = 0; + unsigned short usTotalReturnNum = 0; + unsigned char wBuffer[4]; + int i, iReadNum; + + iReadNum = ReadNum/BYTES_PER_TIME; + + if (0 != (ReadNum%BYTES_PER_TIME)) + iReadNum++; + + wBuffer[0] = REG_CbBuf0; + + usTotalReturnNum = 0; + + for (i = 1; i <= iReadNum; i++) { + if (i*BYTES_PER_TIME > ReadNum) + usReturnNum = ReadNum - (i-1)*BYTES_PER_TIME; + else + usReturnNum = BYTES_PER_TIME; + + wBuffer[1] = (StartNodeNo+usTotalReturnNum) >> 8; + wBuffer[2] = (StartNodeNo+usTotalReturnNum)&0xff; + + ReCode = WriteReg(REG_CbAddrH, wBuffer[1]); + ReCode = WriteReg(REG_CbAddrL, wBuffer[2]); + + ReCode = Comm_Base_IIC_IO(wBuffer, 1, pReadBuffer+usTotalReturnNum, usReturnNum); + + usTotalReturnNum += usReturnNum; + + if (ReCode != ERROR_CODE_OK) + return ReCode; + + + } + + return ReCode; +} + + + + +static unsigned char GetPanelRows(unsigned char *pPanelRows) +{ + return ReadReg(REG_TX_NUM, pPanelRows); +} + + + + +static unsigned char GetPanelCols(unsigned char *pPanelCols) +{ + return ReadReg(REG_RX_NUM, pPanelCols); +} + + +/************************************************************************ +* Name: GetChannelNum +* Brief: Get Num of Ch_X, Ch_Y and key +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetChannelNum(void) +{ + unsigned char ReCode; + + int i ; + unsigned char rBuffer[1]; + + + + for (i = 0; i < 3; i++) { + ReCode = GetPanelRows(rBuffer); + if (ReCode == ERROR_CODE_OK) { + if (0 < rBuffer[0] && rBuffer[0] < 80) { + g_stSCapConfEx.ChannelXNum = rBuffer[0]; + if (g_stSCapConfEx.ChannelXNum > g_ScreenSetParam.iUsedMaxTxNum) { + FTS_TEST_ERROR("Failed to get Channel X number, Get num = %d, UsedMaxNum = %d", + g_stSCapConfEx.ChannelXNum, g_ScreenSetParam.iUsedMaxTxNum); + g_stSCapConfEx.ChannelXNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + + break; + } else { + SysDelay(150); + continue; + } + } else { + FTS_TEST_ERROR("Failed to get Channel X number"); + SysDelay(150); + } + } + + + for (i = 0; i < 3; i++) { + ReCode = GetPanelCols(rBuffer); + if (ReCode == ERROR_CODE_OK) { + if (0 < rBuffer[0] && rBuffer[0] < 80) { + g_stSCapConfEx.ChannelYNum = rBuffer[0]; + if (g_stSCapConfEx.ChannelYNum > g_ScreenSetParam.iUsedMaxRxNum) { + + FTS_TEST_ERROR("Failed to get Channel Y number, Get num = %d, UsedMaxNum = %d", + g_stSCapConfEx.ChannelYNum, g_ScreenSetParam.iUsedMaxRxNum); + g_stSCapConfEx.ChannelYNum = 0; + return ERROR_CODE_INVALID_PARAM; + } + break; + } else { + SysDelay(150); + continue; + } + } else { + FTS_TEST_ERROR("Failed to get Channel Y number"); + SysDelay(150); + } + } + + + for (i = 0; i < 3; i++) { + unsigned char regData = 0; + g_stSCapConfEx.KeyNum = 0; + ReCode = ReadReg(FT8716_LEFT_KEY_REG, ®Data); + if (ReCode == ERROR_CODE_OK) { + if (((regData >> 0) & 0x01)) { + g_stSCapConfEx.bLeftKey1 = true; + ++g_stSCapConfEx.KeyNum; + } + if (((regData >> 1) & 0x01)) { + g_stSCapConfEx.bLeftKey2 = true; + ++g_stSCapConfEx.KeyNum; + } + if (((regData >> 2) & 0x01)) { + g_stSCapConfEx.bLeftKey3 = true; + ++g_stSCapConfEx.KeyNum; + } + } else { + FTS_TEST_ERROR("Failed to get Key number"); + SysDelay(150); + continue; + } + ReCode = ReadReg(FT8716_RIGHT_KEY_REG, ®Data); + if (ReCode == ERROR_CODE_OK) { + if (((regData >> 0) & 0x01)) { + g_stSCapConfEx.bRightKey1 = true; + ++g_stSCapConfEx.KeyNum; + } + if (((regData >> 1) & 0x01)) { + g_stSCapConfEx.bRightKey2 = true; + ++g_stSCapConfEx.KeyNum; + } + if (((regData >> 2) & 0x01)) { + g_stSCapConfEx.bRightKey3 = true; + ++g_stSCapConfEx.KeyNum; + } + break; + } else { + FTS_TEST_ERROR("Failed to get Key number"); + SysDelay(150); + continue; + } + } + + + + FTS_TEST_DBG("CH_X = %d, CH_Y = %d, Key = %d", g_stSCapConfEx.ChannelXNum , g_stSCapConfEx.ChannelYNum, g_stSCapConfEx.KeyNum); + return ReCode; +} + +/************************************************************************ +* Name: GetRawData +* Brief: Get Raw Data of VA area and Key area +* Input: none +* Output: none +* Return: Comm Code. Code = 0x00 is OK, else fail. +***********************************************************************/ +static unsigned char GetRawData(void) +{ + int ReCode = ERROR_CODE_OK; + int iRow, iCol; + int i = 0; + + for (i = 0; i < 3; i++) { + + ReCode = EnterFactory(); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Enter Factory Mode..."); + return ReCode; + } + + + + if (0 == (g_stSCapConfEx.ChannelXNum + g_stSCapConfEx.ChannelYNum)) { + ReCode = GetChannelNum(); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Error Channel Num..."); + return ERROR_CODE_INVALID_PARAM; + } + } + + + + ReCode = StartScan(); + if (ERROR_CODE_OK == ReCode) { + FTS_TEST_INFO("scan pass..."); + break; + } + } + if (i >= 3) { + FTS_TEST_ERROR("scan fail..."); + return ReCode; + } + + + + + memset(m_RawData, 0, sizeof(m_RawData)); + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + ReCode = ReadRawData(0, 0xAD, g_stSCapConfEx.ChannelXNum * g_stSCapConfEx.ChannelYNum * 2, m_iTempRawData); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Get RawData"); + return ReCode; + } + + for (iRow = 0; iRow < g_stSCapConfEx.ChannelXNum; ++iRow) { + for (iCol = 0; iCol < g_stSCapConfEx.ChannelYNum; ++iCol) { + m_RawData[iRow][iCol] = m_iTempRawData[iRow * g_stSCapConfEx.ChannelYNum + iCol]; + } + } + + + memset(m_iTempRawData, 0, sizeof(m_iTempRawData)); + ReCode = ReadRawData(0, 0xAE, g_stSCapConfEx.KeyNumTotal * 2, m_iTempRawData); + if (ERROR_CODE_OK != ReCode) { + FTS_TEST_ERROR("Failed to Get RawData"); + return ReCode; + } + + for (iCol = 0; iCol < g_stSCapConfEx.KeyNumTotal; ++iCol) { + m_RawData[g_stSCapConfEx.ChannelXNum][iCol] = m_iTempRawData[iCol]; + } + + return ReCode; + +} +unsigned char FT8716_GetTestResult(void) +{ + + unsigned char ucDevice = 0; + int iItemCount = 0; + unsigned char ucResultData = 0; + + + for (iItemCount = 0; iItemCount < g_TestItemNum; iItemCount++) { + + if (Code_FT8716_RAWDATA_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + if (RESULT_PASS == g_stTestItem[ucDevice][iItemCount].TestResult) + ucResultData |= 0x01<<2; + } + + + if (Code_FT8716_CB_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode) { + if (RESULT_PASS == g_stTestItem[ucDevice][iItemCount].TestResult) + ucResultData |= 0x01<<1; + } + + + if (Code_FT8716_SHORT_CIRCUIT_TEST == g_stTestItem[ucDevice][iItemCount].ItemCode + ) { + if (RESULT_PASS == g_stTestItem[ucDevice][iItemCount].TestResult) + ucResultData |= 0x01; + } + } + + FTS_TEST_DBG("Test_result: 0x%02x", ucResultData); + + + + + + return ucResultData; +} + +#endif diff --git a/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_supported_ic.c b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_supported_ic.c new file mode 100755 index 0000000000000..3ad6871654280 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/focaltech_test/supported_ic/focaltech_test_supported_ic.c @@ -0,0 +1,268 @@ +/************************************************************************ +* Copyright (C) 2012-2017, Focaltech Systems (R)£¬All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* +* File Name: focaltech_test_supported_ic.c +* +* Author: Software Development +* +* Created: 2016-08-01 +* +* Abstract: test item for FT8716 +* +************************************************************************/ + +/***************************************************************************** +* Included header files +*****************************************************************************/ + + +#include "../include/focaltech_test_supported_ic.h" +#include "../focaltech_test_config.h" + + + +#if (FTS_CHIP_TEST_TYPE == FT8607_TEST) +void OnInit_FT8607_TestItem(char *strIniFile); +void OnInit_FT8607_BasicThreshold(char *strIniFile); +void SetTestItem_FT8607(void); +boolean FT8607_StartTest(void); +int FT8607_get_test_data(char *pTestData); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8607_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8607_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8607; + g_stTestFuncs.Start_Test = FT8607_StartTest; + g_stTestFuncs.Get_test_data = FT8607_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FTS_CHIP_TEST_TYPE == FT8716_TEST) + +boolean FT8716_StartTest(void); +int FT8716_get_test_data(char *pTestData); + +void OnInit_FT8716_TestItem(char *strIniFile); +void OnInit_FT8716_BasicThreshold(char *strIniFile); +void SetTestItem_FT8716(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8716_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8716_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8716; + g_stTestFuncs.Start_Test = FT8716_StartTest; + g_stTestFuncs.Get_test_data = FT8716_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT3D47_TEST) +boolean FT3D47_StartTest(void); + +int FT3D47_get_test_data(char *pTestData); + +void OnInit_FT3D47_TestItem(char *strIniFile); +void OnInit_FT3D47_BasicThreshold(char *strIniFile); +void SetTestItem_FT3D47(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT3D47_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT3D47_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT3D47; + g_stTestFuncs.Start_Test = FT3D47_StartTest; + g_stTestFuncs.Get_test_data = FT3D47_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT5X46_TEST) + +boolean FT5X46_StartTest(void); +int FT5X46_get_test_data(char *pTestData); + +void OnInit_FT5X46_TestItem(char *strIniFile); +void OnInit_FT5X46_BasicThreshold(char *strIniFile); +void SetTestItem_FT5X46(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT5X46_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5X46_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT5X46; + g_stTestFuncs.Start_Test = FT5X46_StartTest; + g_stTestFuncs.Get_test_data = FT5X46_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT6X36_TEST) + +boolean FT6X36_StartTest(void); +int FT6X36_get_test_data(char *pTestData); + +void OnInit_FT6X36_TestItem(char *strIniFile); +void OnInit_FT6X36_BasicThreshold(char *strIniFile); +void SetTestItem_FT6X36(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT6X36_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT6X36_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT6X36; + g_stTestFuncs.Start_Test = FT6X36_StartTest; + g_stTestFuncs.Get_test_data = FT6X36_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT5822_TEST) + +boolean FT5822_StartTest(void); +int FT5822_get_test_data(char *pTestData); + +void OnInit_FT5822_TestItem(char *strIniFile); +void OnInit_FT5822_BasicThreshold(char *strIniFile); +void SetTestItem_FT5822(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT5822_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT5822_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT5822; + g_stTestFuncs.Start_Test = FT5822_StartTest; + g_stTestFuncs.Get_test_data = FT5822_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT8006_TEST) + +boolean FT8006_StartTest(void); +int FT8006_get_test_data(char *pTestData); + +void OnInit_FT8006_TestItem(char *strIniFile); +void OnInit_FT8006_BasicThreshold(char *strIniFile); +void SetTestItem_FT8006(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8006_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8006_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8006; + g_stTestFuncs.Start_Test = FT8006_StartTest; + g_stTestFuncs.Get_test_data = FT8006_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + + +#elif (FTS_CHIP_TEST_TYPE == FT8736_TEST) + +boolean FT8736_StartTest(void); +int FT8736_get_test_data(char *pTestData); + +void OnInit_FT8736_TestItem(char *strIniFile); +void OnInit_FT8736_BasicThreshold(char *strIniFile); +void SetTestItem_FT8736(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8736_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8736_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8736; + g_stTestFuncs.Start_Test = FT8736_StartTest; + g_stTestFuncs.Get_test_data = FT8736_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FTE716_TEST) + +boolean FTE716_StartTest(void); +int FTE716_get_test_data(char *pTestData); + +void OnInit_FTE716_TestItem(char *strIniFile); +void OnInit_FTE716_BasicThreshold(char *strIniFile); +void SetTestItem_FTE716(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FTE716_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FTE716_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FTE716; + g_stTestFuncs.Start_Test = FTE716_StartTest; + g_stTestFuncs.Get_test_data = FTE716_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT8606_TEST) + +boolean FT8606_StartTest(void); +int FT8606_get_test_data(char *pTestData); + +void OnInit_FT8606_TestItem(char *strIniFile); +void OnInit_FT8606_BasicThreshold(char *strIniFile); +void SetTestItem_FT8606(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT8606_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT8606_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT8606; + g_stTestFuncs.Start_Test = FT8606_StartTest; + g_stTestFuncs.Get_test_data = FT8606_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} + +#elif (FTS_CHIP_TEST_TYPE == FT3C47_TEST) + +boolean FT3C47_StartTest(void); +int FT3C47_get_test_data(char *pTestData); + +void OnInit_FT3C47_TestItem(char *strIniFile); +void OnInit_FT3C47_BasicThreshold(char *strIniFile); +void SetTestItem_FT3C47(void); + +void fts_test_funcs(void) +{ + FTS_TEST_FUNC_ENTER(); + + g_stTestFuncs.OnInit_TestItem = OnInit_FT3C47_TestItem; + g_stTestFuncs.OnInit_BasicThreshold = OnInit_FT3C47_BasicThreshold; + g_stTestFuncs.SetTestItem = SetTestItem_FT3C47; + g_stTestFuncs.Start_Test = FT3C47_StartTest; + g_stTestFuncs.Get_test_data = FT3C47_get_test_data; + + FTS_TEST_FUNC_EXIT(); +} +#endif + + diff --git a/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_csot_sample.i b/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_csot_sample.i new file mode 100644 index 0000000000000..3887a224434b1 --- /dev/null +++ b/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_csot_sample.i @@ -0,0 +1,3694 @@ +0x2, 0x23,0x8a,0x2, 0xd2,0x5f,0x1b,0xa, 0x30,0x22,0x22,0x2, 0x0, 0x1a,0x0, 0x1, +0x1, 0x0, 0x22,0x2, 0x6b,0xd6,0xeb,0xaa,0x8, 0x22,0x32,0x2, 0x69,0x11,0x0, 0x0, +0x0, 0xff,0xff,0x2, 0x3c,0xff,0xc2,0x1c,0x22,0xff,0xff,0x2, 0x6f,0xf8,0xca,0x3b, +0x7d,0x72,0x7d,0x63,0x7d,0x27,0x12,0x6, 0x48,0x7d,0x36,0x7d,0x27,0x12,0x6, 0xc5, +0xda,0x3b,0x22,0x2, 0x70,0x10,0x7f,0x71,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e, +0x6f,0x78,0x35,0x79,0x36,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x6f,0x78,0x35,0x79, +0x36,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x6f,0x78,0x35,0x79,0x36,0x0, 0x8, 0x7e, +0x7b,0xa0,0x7c,0x6a,0x6c,0x77,0x7e,0x6f,0x78,0x35,0x79,0x36,0x0, 0xe, 0x7c,0x4b, +0x6c,0x55,0xe5,0x26,0xa, 0x3b,0x4d,0x32,0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0x10, +0x29,0x77,0x0, 0x2, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x29,0x57, +0x0, 0x4, 0x7c,0x46,0x4c,0x57,0x7e,0x2f,0x78,0x35,0x2e,0x54,0x0, 0xe, 0xb, 0x2a, +0x30,0x4d,0x32,0x1b,0x2a,0x30,0x29,0x77,0x0, 0x1, 0x7c,0x47,0x6c,0x55,0x29,0x77, +0x0, 0x3, 0x7c,0x64,0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0xa, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x78,0x35,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x30,0x12,0xa, +0x5e,0xa9,0xc6,0xcb,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0xb2,0x86,0x22, +0xe6,0xd6,0x19,0x29,0xce,0x79,0x31,0x86,0xdd,0xee,0x22,0x11,0x89,0x76,0xb, 0xf4, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x89,0x76,0xff,0xff,0x87,0xa6, +0xca,0x3b,0x7f,0x30,0x7e,0x3b,0xb0,0xf5,0x29,0x29,0xb3,0x0, 0x1, 0xbe,0xb1,0x29, +0x28,0x2, 0xf5,0x29,0x69,0x13,0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff, +0x12,0x24,0x34,0x7f,0x3, 0x12,0xa, 0x6, 0xa9,0xd6,0xcb,0x75,0x27,0x0, 0x80,0x33, +0x75,0x28,0x0, 0x80,0x23,0x7e,0x11,0x27,0x74,0xb, 0xac,0x1b,0xe5,0x28,0xa, 0x1b, +0x2d,0x1, 0x3e,0x4, 0x69,0x13,0x0, 0x6, 0x2d,0x10,0x6d,0x0, 0xb, 0xa, 0x30,0x6e, +0x34,0xff,0xff,0x1b,0xa, 0x30,0x5, 0x28,0x29,0x73,0x0, 0x1, 0xbe,0x71,0x28,0x38, +0xd4,0x5, 0x27,0x7e,0x3b,0x70,0xbe,0x71,0x27,0x38,0xc5,0x69,0x33,0x0, 0x6, 0x7e, +0xf, 0x78,0x35,0x79,0x30,0x0, 0x4, 0xe5,0x29,0xa, 0x2b,0x7d,0x32,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x78, +0x35,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xa, 0x5e,0x75,0x27,0x0, 0xe5,0x27, +0xbe,0xb0,0x4, 0x50,0x17,0x7e,0xa1,0x27,0x74,0x4, 0xa4,0x7e,0x1f,0x78,0x35,0x69, +0x11,0x0, 0x26,0x60,0x44,0x1e,0x14,0x14,0x78,0xfb,0x80,0x3d,0xe5,0x27,0xbe,0xb0, +0x8, 0x50,0x1b,0xe5,0x27,0xa, 0x5b,0x1b,0x56,0x3e,0x54,0x3e,0x54,0x7e,0x1f,0x78, +0x35,0x69,0x11,0x0, 0x28,0x60,0x22,0x1e,0x14,0x14,0x78,0xfb,0x80,0x1b,0xe5,0x27, +0xa, 0x5b,0x9e,0x54,0x0, 0x8, 0x3e,0x54,0x3e,0x54,0x7e,0x1f,0x78,0x35,0x69,0x11, +0x0, 0x2a,0x60,0x5, 0x1e,0x14,0x14,0x78,0xfb,0x5e,0x14,0x0, 0xf, 0x7e,0xa1,0x27, +0x74,0x2, 0xa4,0x69,0x33,0x0, 0x6, 0x2d,0x35,0x6d,0x22,0x1b,0x1a,0x10,0x5, 0x27, +0xe5,0x27,0xbe,0xb0,0xb, 0x40,0x87,0xa9,0xc6,0xcb,0xda,0x3b,0x22,0x6d,0x33,0x7e, +0xf, 0x78,0x39,0x79,0x30,0x0, 0x12,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x14,0xb, +0xa, 0x30,0x5e,0x60,0x7f,0x1b,0xa, 0x30,0xe5,0x37,0x54,0x1f,0xa, 0x2b,0x7e,0xf, +0x78,0x39,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0xe5,0x38, +0x54,0x1, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7e,0xf, +0x78,0x39,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0xe5,0x39, +0x54,0x3, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30, +0x7e,0x35,0x35,0xbe,0x34,0x0, 0x2, 0x78,0x63,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, +0x14,0xb, 0xa, 0x30,0x4e,0x60,0x80,0x1b,0xa, 0x30,0xe5,0x3a,0x54,0x1f,0x7c,0x4b, +0x6c,0x55,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0xe5,0x3b,0x54,0x1, 0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x7e, +0xf, 0x78,0x39,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0xe5, +0x3c,0x54,0x3, 0xa, 0x5b,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4,0x7e,0xf, 0x78,0x39, +0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0x7f,0x21,0xa9, +0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0x4, 0x69,0x30, +0x0, 0x8, 0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, 0x6, 0x7e,0x7f, +0x78,0x35,0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c,0x55,0x7e,0xb, +0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0xc, 0x29,0x70,0x0, +0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0xa, 0x69,0x30,0x0, +0xa, 0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, 0x7e,0x7f,0x78, +0x35,0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, +0x12,0x69,0x30,0x0, 0x10,0x7e,0x7f,0x78,0x35,0x79,0x37,0x0, 0x30,0x29,0x70,0x0, +0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x78,0x35,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0, +0x12,0xa, 0x5e,0x7e,0x1f,0x78,0x35,0x69,0x11,0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11, +0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, 0x16,0x79,0x12,0x0, 0x2, 0x69,0x11, +0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, 0x22,0x79,0x12,0x0, 0x6, 0x69,0x11, +0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, 0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31, +0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x7a,0x25,0x4b,0x7f, +0x30,0x7a,0x35,0x49,0xa2,0xac,0x92,0x8, 0xc2,0xac,0x7e,0x1f,0x78,0x39,0x69,0x31, +0x0, 0x4, 0x5e,0x34,0x10,0x0, 0x7a,0x37,0x6b,0x32,0xc2,0x9, 0x12,0xc, 0x17,0xa2, +0x8, 0x92,0xac,0xa9,0xd3,0xcb,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, +0xf1,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x3, 0xf1,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78, +0xf4,0x7e,0x35,0x49,0x2e,0x34,0x80,0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf1,0x69, +0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x80,0x20,0x7d,0x23,0x3e,0x24,0x7f, +0x3, 0x2d,0x12,0xb, 0xa, 0x20,0x7e,0xf, 0x3, 0xf1,0x1b,0xa, 0x20,0x7e,0xf, 0x3, +0xf1,0x69,0x20,0x0, 0x8, 0x4d,0x22,0x68,0xf4,0xb, 0x34,0xbe,0x35,0x4b,0x40,0xdb, +0xa9,0xc5,0xcb,0xa9,0xc3,0xcb,0x7e,0x37,0x6b,0x32,0x2e,0x34,0xff,0xff,0x92,0x9, +0x12,0xc, 0x17,0xda,0x3b,0x22,0xca,0x3b,0x7a,0x25,0x4b,0x7f,0x30,0x7a,0x35,0x49, +0xa2,0xac,0x92,0x8, 0xc2,0xac,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x4, 0x5e,0x34, +0x10,0x0, 0x7a,0x37,0x6b,0x32,0xc2,0x9, 0x12,0xc, 0x17,0xa2,0x8, 0x92,0xac,0xd2, +0xcd,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf5,0x79,0x30,0x0, 0x6, +0x7e,0xf, 0x3, 0xf5,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7e,0x35,0x49,0x2e, +0x34,0x80,0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf5,0x69,0x31,0x0, 0x8, 0x4d,0x33, +0x68,0xf4,0x6d,0x33,0x80,0x20,0x7d,0x23,0x3e,0x24,0x7f,0x3, 0x2d,0x12,0xb, 0xa, +0x20,0x7e,0xf, 0x3, 0xf5,0x1b,0xa, 0x20,0x7e,0xf, 0x3, 0xf5,0x69,0x20,0x0, 0x8, +0x4d,0x22,0x68,0xf4,0xb, 0x34,0xbe,0x35,0x4b,0x40,0xdb,0xa9,0xc5,0xcb,0xc2,0xcd, +0x7e,0x37,0x6b,0x32,0x2e,0x34,0xff,0xff,0x92,0x9, 0x12,0xc, 0x17,0xda,0x3b,0x22, +0xca,0x79,0x7c,0xab,0x6d,0x77,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x6, 0x5e,0x34, +0x0, 0x2, 0x68,0x18,0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b,0xa, +0x30,0x74,0x3, 0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x3, 0x80,0x3, 0xe4,0x80,0x5a,0x4c, +0xaa,0x68,0x54,0x80,0x44,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x6, 0x5e,0x34,0x0, +0x1, 0x78,0xa, 0xe4,0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x0, 0x80,0x3c,0x7e,0x34,0x0, +0x1, 0x12,0x67,0x25,0xb, 0x74,0xbe,0x74,0x3, 0xe8,0x28,0x1d,0x7e,0xf, 0x78,0x39, +0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x74,0x2, 0x7a, +0xb3,0x77,0xe1,0x75,0x1e,0x2, 0xe4,0x80,0x10,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, +0xe, 0x5e,0x34,0x0, 0x3, 0x78,0xae,0x74,0x1, 0xda,0x79,0x22,0xca,0x79,0x7c,0xab, +0x6d,0x77,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x6, 0x5e,0x34,0x0, 0x2, 0x68,0x18, +0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x74,0x2, 0x7a, +0xb3,0x77,0xe1,0x75,0x1e,0x2, 0x80,0x3, 0xe4,0x80,0x5a,0x4c,0xaa,0x68,0x54,0x80, +0x44,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x6, 0x5e,0x34,0x0, 0x1, 0x78,0xa, 0xe4, +0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x0, 0x80,0x3c,0x7e,0x34,0x0, 0x1, 0x12,0x67,0x25, +0xb, 0x74,0xbe,0x74,0x3, 0xe8,0x28,0x1d,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0xe, +0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b,0xa, 0x30,0x74,0x3, 0x7a,0xb3,0x77,0xe1,0x75, +0x1e,0x3, 0xe4,0x80,0x10,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0xe, 0x5e,0x34,0x0, +0x8, 0x68,0xae,0x74,0x1, 0xda,0x79,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xa2,0xac, +0x92,0x3, 0xc2,0xac,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x4, 0x5e,0x34,0x10,0x0, +0x7a,0x37,0x67,0x1e,0xc2,0x9, 0x12,0xc, 0x17,0xa2,0x3, 0x92,0xac,0xa9,0xd3,0xcb, +0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf1,0x79,0x30,0x0, 0x6, 0x7e, +0xf, 0x3, 0xf1,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7d,0x36,0x2e,0x34,0x80, +0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf1,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4, +0x1b,0x1a,0x70,0x7e,0x1f,0x3, 0xf1,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0xa9, +0xc5,0xcb,0xa9,0xc3,0xcb,0x7e,0x37,0x67,0x1e,0x2e,0x34,0xff,0xff,0x92,0x9, 0x12, +0xc, 0x17,0xda,0x3b,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xa2,0xac,0x92,0x3, 0xc2, +0xac,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x4, 0x5e,0x34,0x10,0x0, 0x7a,0x37,0x67, +0x1e,0xc2,0x9, 0x12,0xc, 0x17,0xa2,0x3, 0x92,0xac,0xd2,0xcd,0xa9,0xd5,0xcb,0x7e, +0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf5,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x3, 0xf5,0x69, +0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7d,0x36,0x2e,0x34,0x80,0x0, 0x1b,0xa, 0x30, +0x7e,0x1f,0x3, 0xf5,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x1b,0x1a,0x70,0x7e, +0x1f,0x3, 0xf5,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0xa9,0xc5,0xcb,0xc2,0xcd, +0x7e,0x37,0x67,0x1e,0x2e,0x34,0xff,0xff,0x92,0x9, 0x12,0xc, 0x17,0xda,0x3b,0x22, +0xca,0x3b,0x7d,0x73,0xa2,0xac,0x92,0x0, 0xc2,0xac,0x7e,0x1f,0x78,0x39,0x69,0x61, +0x0, 0x4, 0x5e,0x64,0x10,0x0, 0xc2,0x9, 0x12,0xc, 0x17,0xa2,0x0, 0x92,0xac,0xa9, +0xd3,0xcb,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf1,0x79,0x30,0x0, +0x6, 0x7e,0x1f,0x3, 0xf1,0x69,0x11,0x0, 0x6, 0x4d,0x11,0x78,0xf4,0x1b,0x1a,0x70, +0x7e,0xf, 0x3, 0xf1,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, +0x30,0x7e,0x1f,0x3, 0xf1,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x71,0x0, +0x2, 0xa9,0xc5,0xcb,0xa9,0xc3,0xcb,0x2e,0x64,0xff,0xff,0x92,0x9, 0x12,0xc, 0x17, +0x7d,0x37,0xda,0x3b,0x22,0x7e,0x8, 0x1, 0x7c,0x7e,0x34,0x0, 0x18,0xe4,0x12,0x24, +0x34,0xa9,0xd1,0xcb,0xd2,0xcc,0x7e,0x34,0x0, 0x4, 0x7e,0x8, 0x1, 0x7c,0x74,0xc, +0x12,0xa, 0xb5,0xa9,0xd1,0xcb,0xc2,0xcc,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x7e, +0x8, 0x1, 0x7c,0x2d,0x13,0xb, 0xa, 0x20,0x7c,0x45,0x6c,0x55,0xb, 0xa, 0x30,0xa, +0x36,0x4d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0x22,0xff,0xff, +0xca,0x3b,0x7d,0x73,0xa2,0xac,0x92,0x0, 0xc2,0xac,0x7e,0x1f,0x78,0x39,0x69,0x61, +0x0, 0x4, 0x5e,0x64,0x10,0x0, 0xc2,0x9, 0x12,0xc, 0x17,0xa2,0x0, 0x92,0xac,0xd2, +0xcd,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf5,0x79,0x30,0x0, 0x6, +0x7e,0x1f,0x3, 0xf5,0x69,0x11,0x0, 0x6, 0x4d,0x11,0x78,0xf4,0x1b,0x1a,0x70,0x7e, +0xf, 0x3, 0xf5,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, 0x30, +0x7e,0x1f,0x3, 0xf5,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x71,0x0, 0x2, +0xa9,0xc5,0xcb,0xc2,0xcd,0x2e,0x64,0xff,0xff,0x92,0x9, 0x12,0xc, 0x17,0x7d,0x37, +0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x78,0x35,0x79,0x32, +0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0x8, 0x29,0x70, +0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, 0xa, 0x37,0x2d,0x32,0x7e,0x2f, +0x78,0x35,0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c,0x47,0x29,0x70,0x0, 0x1, 0xa, +0x37,0x2d,0x32,0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0xa, 0x29,0x70,0x0, 0x4, 0xa, +0x37,0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x5, 0x54,0x1, 0x7c, +0x2b,0x6c,0x33,0x7e,0x1f,0x78,0x35,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xc0,0x12,0xa, +0x5e,0xa9,0xc6,0xcb,0x22,0xa9,0xd6,0xcb,0xc2,0x2f,0x69,0x30,0x0, 0x4, 0x7e,0x2f, +0x78,0x35,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x78,0x35,0x79,0x32, +0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x78,0x35,0x79,0x32,0x0, 0x8, 0x7e,0xb, +0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x78, +0x35,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x78,0x35,0x79, +0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4,0x7e,0x1f, +0x78,0x35,0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22, +0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f,0x78,0x35,0x79,0x22,0x0, 0x4, 0x69, +0x20,0x0, 0x8, 0x7e,0x2f,0x78,0x35,0x79,0x22,0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55, +0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25,0x2d,0x25,0x7e,0x2f,0x78,0x35,0x79, +0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25,0x7e,0xf, 0x78,0x35,0x79,0x20,0x0, +0xe, 0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, 0xa, 0x6d,0x11,0x7e,0x1f,0x78,0x35,0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c, +0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0xb, 0x7a,0x40,0x5e,0x80,0x3, +0x1b,0x7a,0x40,0x7e,0x90,0x6, 0xac,0x9a,0x7c,0xb9,0x7f,0x71,0x60,0xd, 0x1e,0xf4, +0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7d,0x4f,0x5e,0x44,0x0, +0x3f,0x7d,0x74,0x7c,0xef,0x6c,0xff,0x3e,0x74,0x3e,0x74,0x7e,0xd0,0x2, 0xac,0xda, +0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xf0,0x4d,0xf7,0x1b,0x6a,0xf0,0xb, 0xa0,0xbe,0xa0, +0x4, 0x40,0xae,0xda,0x3b,0x22,0x7f,0x10,0xa9,0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e, +0x2f,0x78,0x35,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, 0x4, 0x7e,0x2f,0x78,0x35,0x79, +0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f,0x78,0x35,0x79,0x12,0x0, 0x8, 0x7e, +0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad,0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37, +0x2d,0x31,0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x78,0x35, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22,0xa9,0xd7, +0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x78,0x35,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x78,0x35,0xb, 0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, +0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7,0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30, +0xd2,0x2f,0x7e,0xf, 0x78,0x35,0xb, 0xa, 0x30,0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe, +0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b,0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x78, +0x35,0x1b,0x1a,0x10,0x22,0x7e,0x24,0x0, 0x1, 0x7e,0x7f,0x3, 0xf9,0x79,0x27,0x0, +0x6, 0x7e,0x7f,0x3, 0xf9,0x69,0x27,0x0, 0x6, 0x4d,0x22,0x78,0xf4,0x5e,0x60,0x7f, +0x1b,0x7a,0x30,0x7e,0x1f,0x3, 0xf9,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6c, +0xaa,0x80,0x20,0x6d,0x44,0x7e,0x1f,0x3, 0xf9,0x1b,0x1a,0x40,0x7e,0x1f,0x3, 0xf9, +0x69,0x41,0x0, 0x8, 0x4d,0x44,0x68,0xf4,0x69,0x41,0x0, 0x2, 0x1b,0xa, 0x40,0xb, +0x15,0xb, 0xa0,0xbc,0xba,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x6c,0x99,0x80,0x2d, +0x7e,0xf0,0x2, 0xac,0xf9,0x7f,0x60,0x2d,0xd7,0xb, 0x6a,0xf0,0x5e,0xf4,0xfc,0x0, +0x1b,0x6a,0xf0,0x7f,0x71,0x2d,0xf7,0xb, 0x7a,0xe0,0x7e,0xf0,0x2, 0xac,0xf9,0x7f, +0x60,0x2d,0xd7,0xb, 0x6a,0xf0,0x4d,0xfe,0x1b,0x6a,0xf0,0xb, 0x90,0xbc,0xa9,0x38, +0xcf,0xda,0x79,0x22,0xb, 0x38,0x20,0x5e,0x50,0xc0,0x1b,0x38,0x20,0xb, 0xa, 0x20, +0x5e,0x40,0x7, 0x1b,0xa, 0x20,0xe5,0x29,0xa, 0x5b,0xb, 0x38,0x20,0x4d,0x25,0x1b, +0x38,0x20,0xe5,0x28,0xa, 0x3b,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xa9,0xd6,0xcb,0x54,0x3f, +0x5e,0x70,0x1f,0x7e,0x14,0x0, 0x1, 0x7e,0x7f,0x78,0x35,0x79,0x17,0x0, 0x2, 0x7c, +0x2b,0x6c,0x33,0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, 0x32,0x7e, +0xf, 0x78,0x35,0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x12,0x7, 0xb5,0x2, 0xd, 0x59, +0x30,0x28,0x31,0xa9,0xd2,0xea,0xa9,0xc2,0xea,0x6d,0x33,0x7e,0xf, 0x78,0x39,0x79, +0x30,0x0, 0x16,0x7e,0x34,0x1, 0x2c,0x7e,0xf, 0x78,0x39,0x79,0x30,0x0, 0x18,0xc2, +0x28,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b, +0xa, 0x30,0xc2,0x27,0x22,0xa2,0xac,0x92,0x8, 0x7e,0xf, 0x78,0x39,0xb, 0xa, 0x30, +0x5e,0x34,0x10,0x0, 0x68,0xb, 0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x1b,0xa, +0x30,0xc2,0xac,0x7e,0xf, 0x78,0x39,0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x1b, +0xa, 0x30,0xa2,0x8, 0x92,0xac,0x22,0xa2,0xac,0x92,0xa, 0xc2,0xac,0x7e,0xf, 0x78, +0x39,0x30,0x9, 0xa, 0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x80,0x8, 0xb, 0x16, +0xb, 0xa, 0x30,0x5e,0x60,0xef,0x1b,0xa, 0x30,0xa2,0xa, 0x92,0xac,0x22,0xb, 0xa, +0x30,0x5e,0x34,0xfc,0x7f,0x1b,0xa, 0x30,0xa, 0x2b,0x5e,0x24,0x0, 0x7, 0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0xa9,0xd7,0xca,0x7e,0x24,0x0, 0x1, 0x7e,0xf, 0x78,0x3d, +0x1b,0xa, 0x20,0x7e,0x24,0x9, 0x60,0x7e,0xf, 0x78,0x3d,0x79,0x20,0x0, 0x2, 0x7e, +0xf, 0x78,0x3d,0x79,0x30,0x0, 0x4, 0x22,0xb, 0xa, 0x20,0x5e,0x24,0x80,0x1f,0x1b, +0xa, 0x20,0x7d,0x23,0x5e,0x40,0x3, 0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x60,0xc7, +0x1b,0xa, 0x30,0x54,0x7, 0xa, 0x3b,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xca,0x3b,0x7d,0x72, +0x7a,0xd, 0x28,0x7d,0x63,0x7e,0xd, 0x28,0x7d,0x27,0x12,0x3, 0xfa,0x7d,0x36,0x7e, +0xd, 0x28,0x7d,0x27,0x12,0x4, 0x96,0xda,0x3b,0x22,0xb, 0xa, 0x30,0x5e,0x60,0x9f, +0x1b,0xa, 0x30,0x54,0x3, 0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0xb, 0xa, +0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x70,0xe7,0x1b,0xa, 0x30, +0x54,0x3, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0x22,0x7c,0xa7,0xb, 0xa, 0x30,0x5e,0x60,0x40,0x60,0x3, 0x4e,0x60,0x80, +0x7c,0xba,0x54,0x3f,0x7c,0x4b,0x6c,0x55,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, +0x50,0x54,0xe0,0x1b,0xa, 0x50,0x7d,0x52,0x5e,0x54,0x0, 0x1f,0xb, 0xa, 0x20,0x4d, +0x25,0x1b,0xa, 0x20,0x79,0x30,0x0, 0x2, 0x22,0x7e,0xb3,0x1, 0x8c,0xb4,0xe7,0x12, +0x7e,0xb3,0x1, 0x8d,0xb4,0x16,0xb, 0x7e,0xb3,0x1, 0x89,0x54,0x1, 0xb4,0x1, 0x2, +0x80,0xfe,0x22,0xb, 0xa, 0x30,0x5e,0x60,0xf, 0x1b,0xa, 0x30,0xa, 0x5b,0xc4,0x54, +0xf0,0x7c,0xab,0xe4,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30, +0x5e,0x60,0xfc,0x1b,0xa, 0x30,0x54,0x3, 0x7c,0x4b,0x6c,0x55,0xb, 0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x20,0x5e,0x50,0xfc,0x1b,0xa, 0x20,0x7d,0x23, +0x5e,0x24,0x0, 0x3, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xd2,0x28,0xd2, +0x27,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x4e,0x70,0x2, 0x1b, +0xa, 0x30,0x22,0x7d,0x23,0xb, 0xa, 0x30,0x5e,0x34,0xf8,0x0, 0x1b,0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0x7d,0x23,0xb, 0xa, 0x30,0x5e,0x34,0xf8,0x0, 0x1b,0xa, +0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x70,0x3, 0x70,0x3, 0x4e, +0x70,0xc, 0x1b,0xa, 0x30,0x22,0x2, 0xd, 0x14,0x1b,0x21,0x25,0x2b,0x31,0x37,0x36, +0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, 0x10,0x18,0x1e,0x23, +0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, +0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40,0x3f,0x3e,0x3d,0x3d, +0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29,0x27,0x1e,0x14,0x11, +0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, 0x5, 0x1, 0x0, 0x0, +0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21,0x2b,0x32,0x30,0x2a, +0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, 0x10,0x19,0x23,0x2d, +0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71,0x50,0x55,0x28,0x12, +0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39,0x31,0x28,0x1e,0x15, +0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32,0x37,0x39,0x20,0x29, +0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, 0x1, 0x0, 0x1, 0x5, +0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c,0x34,0x31,0x26,0xcb, +0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31,0x2e,0x2d,0x35,0x3d, +0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, 0x10,0x1b,0x24,0x2f, +0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d,0x28,0x31,0x34,0x2a, +0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40,0x47,0x47,0x44,0x3c, +0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b,0x22,0x2d,0x30,0x2e, +0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, 0x0, 0x0, 0x3, 0xb, +0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26,0x1b,0x14,0x1c,0x25, +0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c,0x25,0x30,0x38,0x40, +0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c,0x29,0x1e,0x14,0x13, +0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39,0x30,0x25,0x1b,0x10, +0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a,0x23,0x2f,0x33,0x29, +0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, 0x2, 0x0, 0x1, 0x8, +0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e,0x50,0x55,0x16,0x2b, +0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36,0x3b,0x3d,0x3b,0x37, +0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33,0x3d,0x3f,0x13,0x21, +0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37,0x2d,0x22,0x18,0xc, +0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38,0x2e,0x2a,0x31,0x62, +0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, 0x6, 0x4, 0x2, 0x0, +0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26,0x2a,0x30,0x35,0x39, +0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b,0x1f,0x23,0x28,0x2d, +0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48,0x46,0x43,0x40,0x3e, +0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x2d,0x28,0x24,0x22,0x1f,0x1c,0x19,0x16,0x13,0x10, +0xc, 0x8, 0x5, 0x2, 0x0, 0x3, 0x7, 0xa, 0xe, 0x11,0x16,0x19,0x1e,0x22,0x27,0x2c, +0x30,0x33,0x36,0x39,0x3d,0x40,0x0, 0x2, 0x6, 0x9, 0xb, 0xe, 0x11,0x14,0x16,0x18, +0x1b,0x1f,0x22,0x25,0x28,0x29,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x32,0x33,0x35,0x36, +0x38,0x39,0x3b,0x3c,0x3e,0x40,0xac,0x6a,0x34,0x55,0x25,0x1e,0x1a,0x17,0x15,0x11, +0xe, 0xb, 0x9, 0x7, 0x4, 0x2, 0x1, 0x2, 0x5, 0x9, 0xd, 0x10,0x13,0x17,0x1b,0x1e, +0x21,0x25,0x29,0x2d,0x30,0x33,0x37,0x3b,0x3e,0x40,0x0, 0x6, 0xc, 0x10,0x13,0x19, +0x1f,0x23,0x27,0x2b,0x2f,0x33,0x36,0x38,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3f,0x40,0xca,0xd8,0x34,0x55,0x9, 0x17, +0x1d,0x26,0x2e,0x37,0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, +0x1, 0x0, 0x0, 0x0, 0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30, +0x2f,0x2c,0x26,0x1e,0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c, +0x32,0x3a,0x41,0x48,0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c, +0x33,0x55,0x6, 0x11,0x18,0x1e,0x22,0x27,0x2a,0x2c,0x29,0x25,0x1f,0x18,0x11,0xb, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, 0xa, 0x11,0x18,0x20,0x26,0x2c,0x32,0x36,0x3b, +0x3d,0x3f,0x48,0x37,0x2e,0x24,0x1a,0x11,0xa, 0x4, 0x0, 0x0, 0x1, 0x5, 0xb, 0x12, +0x1b,0x21,0x28,0x30,0x37,0x41,0x47,0x4e,0x54,0x53,0x4e,0x48,0x41,0x3b,0x33,0x2c, +0x28,0x25,0xb, 0x67,0x33,0x55,0x6, 0xc, 0x15,0x19,0x22,0x2b,0x2f,0x36,0x3c,0x3e, +0x3f,0x39,0x34,0x29,0x25,0x1d,0x14,0xf, 0x7, 0x2, 0x0, 0x0, 0x0, 0x2, 0xc, 0x10, +0x10,0x10,0x10,0x10,0x10,0x10,0x36,0x35,0x32,0x31,0x2d,0x28,0x25,0x1f,0x18,0x13, +0xa, 0x2, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x17,0x21,0x26,0x31,0x3b,0x3f,0x45,0x46, +0x46,0x46,0x46,0x46,0x46,0x46,0xf0,0x59,0x33,0x55,0x0, 0x6, 0xf, 0x19,0x21,0x2a, +0x2e,0x32,0x2a,0x21,0x18,0x14,0xc, 0x6, 0x2, 0x0, 0x1, 0xb, 0x13,0x1d,0x25,0x2a, +0x32,0x3a,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x23,0x1f,0x1b,0x17,0x13,0xc, +0x9, 0x1, 0x1, 0x6, 0xe, 0x12,0x1b,0x24,0x2d,0x37,0x3b,0x3f,0x3f,0x3d,0x39,0x36, +0x2e,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xf4,0x7b,0x33,0x55,0x5, 0xd, +0x19,0x23,0x2d,0x31,0x34,0x2c,0x22,0x1e,0x15,0xd, 0x8, 0x4, 0x2, 0x0, 0x2, 0xc, +0x10,0x19,0x21,0x2a,0x2e,0x37,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x1c,0x1b, +0x18,0x16,0x10,0xd, 0x4, 0x0, 0x3, 0x5, 0xc, 0x16,0x1e,0x26,0x2a,0x35,0x3d,0x3f, +0x3e,0x3c,0x3b,0x3a,0x39,0x38,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x8d,0x3a, +0x33,0x55,0x5, 0xd, 0x13,0x19,0x20,0x26,0x2e,0x35,0x3c,0x3d,0x37,0x2f,0x20,0x19, +0x11,0xb, 0x5, 0x2, 0x0, 0x0, 0x1, 0x6, 0xc, 0x17,0x1d,0x23,0x29,0x30,0x36,0x3b, +0x3e,0x3e,0x28,0x25,0x22,0x20,0x1d,0x18,0x14,0xf, 0x8, 0x2, 0x0, 0x0, 0x4, 0x7, +0xc, 0x11,0x18,0x1e,0x24,0x2c,0x33,0x3a,0x3e,0x3f,0x3e,0x3c,0x38,0x31,0x2a,0x21, +0x1a,0x1a,0x6, 0x33,0x33,0x55,0x26,0x1c,0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18, +0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, 0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44, +0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49,0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f, +0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54,0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d, +0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, +0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c,0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22, +0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c,0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a, +0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32,0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, +0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, 0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22,0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, +0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39,0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68, +0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70,0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80, +0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10,0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, +0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39, +0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24,0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50, +0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff,0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a, +0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, 0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18, +0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22,0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33, +0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29,0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d, +0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26,0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10, +0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b,0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, +0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19,0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22, +0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39,0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34, +0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, 0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18, +0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37,0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x0, 0x0, +0x1, 0x3, 0x8, 0xb, 0x12,0x18,0x1b,0x20,0x22,0x22,0x23,0x24,0x26,0x27,0x29,0x2b, +0x30,0x31,0x31,0x32,0x32,0x34,0x35,0x37,0x3b,0x3e,0x3f,0x3f,0x3f,0x3f,0x7b,0x6d, +0x5f,0x53,0x40,0x36,0x23,0x14,0xb, 0x3, 0xe, 0x1e,0x29,0x35,0x29,0x20,0x11,0x7, +0x6, 0x16,0x1f,0x2d,0x35,0x43,0x4c,0x59,0x68,0x72,0x74,0x74,0x74,0x74,0x90,0x27, +0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, 0x0, 0x1, 0x5, 0xa, +0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e,0x3b,0x38,0x33,0x2f, +0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21,0x27,0x2e,0x36,0x3b, +0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c,0x16,0x10,0xc, 0xa, +0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, 0x0, 0x2, 0x5, 0x9, +0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f,0x3d,0x38,0x30,0x27, +0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36,0x3f,0x49,0x53,0x5c, +0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b,0x15,0xb, 0x4, 0x0, +0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c,0x34,0x39,0x3c,0x3d, +0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, 0x6, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, 0x8, 0xe, 0x14,0x1a, +0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58,0x51,0x48,0x3f,0x38, +0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf,0x30,0x55,0x16,0x7, +0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28,0x30,0x38,0x3c,0x3e, +0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16,0xf, 0xc, 0x53,0x46, +0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, 0x13,0x1a, +0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a,0x58,0x57,0xc6,0x55, +0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38,0x3c,0x3e,0x3f,0x3e, +0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17,0x20,0x2a, +0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57,0x4f,0x47,0x40,0x38, +0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, 0x1, 0x0, 0x0, 0x1, +0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f,0x3f,0x3d,0x3a,0x36, +0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22,0x29,0x30,0x38,0x3f, +0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25,0x1e,0x17,0x10,0x8, +0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f,0x3d,0x3a,0x36,0x2e, +0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0x9, 0xe, 0x14,0x1c, +0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a,0x10,0x9, 0x4, 0x0, +0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47,0x4f,0x56,0x5a,0x5b, +0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9,0x30,0x55,0x3e,0x3b, +0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, +0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e,0x3f,0x3f,0x1f,0x10, +0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25,0x2c,0x35,0x3c,0x42, +0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25,0x1f,0x1c,0xf9,0xa2, +0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d,0x3a,0x34,0x2d,0x27, +0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, 0xa, 0xf, 0x15,0x1b, +0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11,0xb, 0x6, 0x2, 0x0, +0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36,0x3c,0x42,0x47,0x48, +0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x3e,0x3d, +0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x1, 0x4, +0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29,0x22,0x1b,0x15,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c,0x24,0x2a,0x30,0x35, +0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, 0x4, 0x7, 0xa, 0x10, +0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b,0x38,0x31,0x29,0x21, +0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35,0x3d,0x45,0x4b,0x51, +0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17,0x11,0x9, 0x3, 0x0, +0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6,0x30,0x55,0xa, 0x5, +0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3c, +0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, 0x1, 0x2, 0x35,0x46, +0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37,0x2e,0x25,0x1e,0x16, +0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39,0x41,0x45,0xf0,0xbc, +0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28,0x30,0x36,0x3b,0x3d, +0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, 0x0, 0x0, 0x1, 0x2, +0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d,0x52,0x4a,0x3e,0x35, +0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19,0x22,0x2b,0x31,0x3a, +0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36,0x2f,0x27,0x21,0x19, +0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10,0x16,0x1f,0x26,0x2d, +0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d,0x56,0x59,0x5a,0x58, +0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, 0x0, 0x0, 0x1, 0x3, +0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38,0x37,0x34,0x2d,0x26, +0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x10,0x17,0x20, +0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40,0x49,0x50,0x59,0x5e, +0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10,0xa, 0x5, 0x1, 0x0, +0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3,0x30,0x55,0x3b,0x3d, +0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, +0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f,0x3e,0x3e,0x33,0x45, +0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40,0x38,0x2e,0x25,0x1a, +0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32,0x39,0x3e,0x7, 0x90, +0x30,0x55,0x8, 0x2, 0x0, 0x0, 0x0, 0x2, 0x5, 0x7, 0xc, 0x12,0x19,0x1f,0x2b,0x32, +0x37,0x3b,0x3d,0x3f,0x3f,0x3e,0x3d,0x3a,0x37,0x2f,0x29,0x23,0x1d,0x16,0xf, 0x9, +0x6, 0x6, 0x47,0x3d,0x36,0x2f,0x27,0x1e,0x16,0x10,0x9, 0x3, 0x0, 0x0, 0x1, 0x4, +0x7, 0xd, 0x14,0x1d,0x26,0x2d,0x33,0x3a,0x42,0x4e,0x53,0x55,0x56,0x54,0x4f,0x48, +0x42,0x42,0x43,0x9e,0x30,0x55,0x2, 0x0, 0x0, 0x1, 0x3, 0x7, 0xc, 0x13,0x1c,0x24, +0x2d,0x37,0x3f,0x3d,0x3b,0x39,0x36,0x34,0x31,0x2e,0x2b,0x27,0x20,0x16,0xe, 0x8, +0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x5d,0x50,0x46,0x3e,0x36,0x2c,0x20,0x16,0xd, 0x6, +0x2, 0x0, 0xb, 0x16,0x22,0x2a,0x33,0x3c,0x44,0x4c,0x55,0x5d,0x69,0x79,0x7d,0x76, +0x6d,0x63,0x59,0x50,0x48,0x47,0x12,0x3e,0x30,0x55,0x3, 0x1, 0x2, 0x6, 0xa, 0x16, +0x20,0x25,0x30,0x39,0x3e,0x3f,0x3f,0x3c,0x3a,0x32,0x28,0x22,0x19,0xe, 0x5, 0x2, +0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x29,0x23,0x18,0xf, 0xb, 0x3, +0x0, 0x0, 0x1, 0x8, 0x11,0x17,0x21,0x2a,0x2f,0x3a,0x42,0x43,0x42,0x3e,0x38,0x34, +0x2c,0x24,0x1f,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x7f,0xd2,0x30,0x55,0x39,0x2b, +0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, 0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b, +0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f,0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, +0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24,0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b, +0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65,0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a, +0x46,0x55,0x3c,0x37,0x33,0x2f,0x25,0x20,0x1b,0x10,0xc, 0x8, 0x2, 0x0, 0x0, 0x3, +0x7, 0xc, 0x16,0x1b,0x1f,0x2a,0x2f,0x33,0x3d,0x3d,0x39,0x2f,0x2b,0x28,0x28,0x28, +0x28,0x28,0x2, 0x0, 0x0, 0x0, 0x2, 0x4, 0x7, 0xc, 0xf, 0x13,0x1c,0x20,0x24,0x2d, +0x30,0x32,0x35,0x36,0x36,0x36,0x36,0x36,0x39,0x3d,0x42,0x48,0x4a,0x4b,0x4b,0x4b, +0x4b,0x4b,0x10,0xa2,0x46,0x55,0x32,0x2c,0x27,0x1c,0x16,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x2, 0x4, 0xd, 0x11,0x1a,0x1f,0x25,0x2f,0x33,0x3c,0x3d,0x34,0x2f,0x2a,0x21, +0x1d,0x1c,0x1c,0x1c,0x1c,0x1c,0x1, 0x0, 0x0, 0x0, 0x2, 0x6, 0xa, 0xe, 0x16,0x1a, +0x22,0x26,0x2b,0x31,0x32,0x35,0x36,0x38,0x3a,0x3b,0x3e,0x41,0x4a,0x4c,0x4d,0x4e, +0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x43,0x33,0x46,0x55,0x1a,0x13,0x10,0xd, 0xb, 0xa, +0xc, 0x11,0x16,0x20,0x25,0x29,0x2e,0x32,0x37,0x3c,0x3f,0x3c,0x38,0x33,0x2e,0x29, +0x24,0x1e,0x19,0xf, 0xb, 0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xb, 0x10,0x15,0x19, +0x1d,0x1e,0x1f,0x1e,0x1f,0x1f,0x20,0x21,0x24,0x29,0x2f,0x39,0x3e,0x41,0x44,0x47, +0x49,0x4b,0x4c,0x4e,0x4e,0x4f,0x4e,0x4d,0x4d,0x4d,0xa, 0x24,0x46,0x55,0x0, 0x1, +0x3, 0x5, 0x7, 0x8, 0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22, +0x24,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, +0x14,0x1b,0x23,0x28,0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53, +0x4e,0x47,0x40,0x3b,0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d, +0x54,0x55,0x40,0x39,0x38,0x36,0x35,0x33,0x31,0x2e,0x2c,0x2b,0x29,0x27,0x25,0x24, +0x22,0x1f,0x1d,0x1a,0x18,0x15,0x14,0x12,0xf, 0xc, 0x9, 0x7, 0x4, 0x2, 0x1, 0x0, +0x0, 0x0, 0x0, 0xd, 0x15,0x1d,0x23,0x2a,0x32,0x3b,0x43,0x48,0x50,0x57,0x5d,0x63, +0x68,0x65,0x5e,0x58,0x51,0x4a,0x45,0x3f,0x38,0x32,0x2b,0x26,0x1f,0x16,0x10,0x8, +0x4, 0x1, 0x6a,0xec,0x54,0x55,0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1, 0x2, 0x4, 0x5, 0x7, 0x9, 0xd, 0x10,0x13,0x18,0x1f,0x24,0x27,0x2b,0x2e,0x31, +0x34,0x36,0x39,0x3c,0x3e,0x40,0x0, 0x7, 0xf, 0x13,0x16,0x1a,0x1e,0x22,0x25,0x28, +0x2f,0x36,0x3b,0x3f,0x43,0x47,0x4b,0x4c,0x4c,0x4c,0x49,0x46,0x43,0x3f,0x3a,0x35, +0x32,0x2d,0x27,0x21,0x1d,0x1a,0xb5,0xd0,0x54,0x55,0x0, 0x1, 0x1, 0x1, 0x2, 0x3, +0x3, 0x4, 0x5, 0x9, 0xf, 0x16,0x1d,0x22,0x28,0x2d,0x30,0x32,0x34,0x37,0x39,0x3a, +0x3c,0x3d,0x3e,0x3e,0x3f,0x3f,0x3e,0x3e,0x3c,0x3a,0x22,0x2e,0x36,0x3f,0x46,0x4c, +0x51,0x56,0x5b,0x5e,0x60,0x5e,0x5c,0x58,0x53,0x4d,0x49,0x45,0x41,0x3a,0x35,0x31, +0x2d,0x27,0x23,0x1f,0x19,0x11,0xd, 0x8, 0x3, 0x0, 0x3b,0x38,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0xd, 0xd0,0x70,0x8f,0x0, 0xff,0x89,0x76,0x4, 0xa7, +0x24,0x87,0x2, 0xa9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x53,0x42,0x32,0x1, 0xd1,0x0, 0x34,0x0, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8, 0x43,0x53,0x4f,0x54,0x5f,0x35,0x50,0x37, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x0, 0x1, 0x8, 0x8, 0x10,0x20,0x10,0x20,0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, +0x3, 0x0, 0x3, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, +0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, +0x0, 0xf, 0x0, 0x10,0x0, 0x11,0x0, 0x12,0x0, 0x13,0x0, 0x14,0x0, 0x15,0x0, 0x16, +0x0, 0x17,0x0, 0x18,0x0, 0x19,0x0, 0x1a,0x0, 0x1b,0x0, 0x1c,0x0, 0x1d,0x0, 0x1e, +0x0, 0x1f,0x0, 0x20,0x0, 0x21,0x0, 0x22,0x0, 0x23,0x0, 0x24,0x0, 0x25,0x0, 0x26, +0x0, 0x27,0x0, 0x28,0x0, 0x29,0x0, 0x2a,0x0, 0x2b,0x0, 0x2c,0x0, 0x2d,0x0, 0x2e, +0x0, 0x2f,0x0, 0x30,0x0, 0x31,0x0, 0x32,0x0, 0x33,0x0, 0x34,0x0, 0x35,0x0, 0x36, +0x0, 0x37,0x0, 0x38,0x0, 0x39,0x0, 0x3a,0x0, 0x3b,0x0, 0x3c,0x0, 0x3d,0x0, 0x3e, +0x0, 0x3f,0x0, 0x40,0x0, 0x41,0x0, 0x42,0x0, 0x43,0x0, 0x44,0x0, 0x45,0x0, 0x46, +0x0, 0x47,0x0, 0x48,0x0, 0x49,0x0, 0x4a,0x0, 0x4b,0x0, 0x4c,0x0, 0x4d,0x0, 0x4e, +0x0, 0x4f,0x0, 0x50,0x0, 0x51,0x0, 0x52,0x0, 0x53,0x0, 0x54,0x0, 0x55,0x0, 0x56, +0x0, 0x57,0x0, 0x58,0x0, 0x59,0x0, 0x5a,0x0, 0x5b,0x0, 0x5c,0x0, 0x5d,0x0, 0x5e, +0x0, 0x5f,0x0, 0x60,0x0, 0x61,0x0, 0x62,0x0, 0x63,0x0, 0x64,0x0, 0x65,0x0, 0x66, +0x0, 0x67,0x0, 0x68,0x0, 0x69,0x0, 0x6a,0x0, 0x6b,0x0, 0x6c,0x0, 0x6d,0x0, 0x6e, +0x0, 0x6f,0x0, 0x70,0x0, 0x71,0x0, 0x72,0x0, 0x73,0x0, 0x74,0x0, 0x75,0x0, 0x76, +0x0, 0x77,0x0, 0x78,0x0, 0x79,0x0, 0x7a,0x0, 0x7b,0x0, 0x7c,0x0, 0x7d,0x0, 0x7e, +0x0, 0x7f,0x0, 0x80,0x0, 0x81,0x0, 0x82,0x0, 0x83,0x0, 0x84,0x0, 0x85,0x0, 0x86, +0x0, 0x87,0x0, 0x88,0x0, 0x89,0x0, 0x8a,0x0, 0x8b,0x0, 0x8c,0x0, 0x8d,0x0, 0x8e, +0x0, 0x8f,0x0, 0x90,0x0, 0x91,0x0, 0x92,0x0, 0x93,0x0, 0x94,0x0, 0x95,0x0, 0x96, +0x0, 0x97,0x0, 0x98,0x0, 0x99,0x0, 0x9a,0x0, 0x9b,0x0, 0x9c,0x0, 0x9d,0x0, 0x9e, +0x0, 0x9f,0x0, 0xa0,0x0, 0xa1,0x0, 0xa2,0x0, 0xa3,0x0, 0xa4,0x0, 0xa5,0x0, 0xa6, +0x0, 0xa7,0x0, 0xa8,0x0, 0xa9,0x0, 0xaa,0x0, 0xab,0x0, 0xac,0x0, 0xad,0x0, 0xae, +0x0, 0xaf,0x0, 0xb0,0x0, 0xb1,0x0, 0xb2,0x0, 0xb3,0x0, 0xb4,0x0, 0xb5,0x0, 0xb6, +0x0, 0xb7,0x0, 0xb8,0x0, 0xb9,0x0, 0xba,0x0, 0xbb,0x0, 0xbc,0x0, 0xbd,0x0, 0xbe, +0x0, 0xbf,0x0, 0xc0,0x0, 0xc1,0x0, 0xc2,0x0, 0xc3,0x0, 0xc4,0x0, 0xc5,0x0, 0xc6, +0x0, 0xc7,0x0, 0xc8,0x0, 0xc9,0x0, 0xca,0x0, 0xcb,0x0, 0xcc,0x0, 0xcd,0x0, 0xce, +0x0, 0xcf,0x0, 0xd0,0x0, 0xd1,0x0, 0xd2,0x0, 0xd3,0x0, 0xd4,0x0, 0xd5,0x0, 0xd6, +0x0, 0xd7,0x0, 0xd8,0x0, 0xd9,0x0, 0xda,0x0, 0xdb,0x0, 0xdc,0x0, 0xdd,0x0, 0xde, +0x0, 0xdf,0x0, 0xe0,0x0, 0xe1,0x0, 0xe2,0x0, 0xe3,0x0, 0xe4,0x0, 0xe5,0x0, 0xe6, +0x0, 0xe7,0x0, 0xe8,0x0, 0xe9,0x0, 0xea,0x0, 0xeb,0x0, 0xec,0x0, 0xed,0x0, 0xee, +0x0, 0xef,0x0, 0xf0,0x0, 0xf1,0x0, 0xf2,0x0, 0xf3,0x0, 0xf4,0x0, 0xf5,0x0, 0xf6, +0x0, 0xf7,0x0, 0xf8,0x0, 0xf9,0x0, 0xfa,0x0, 0xfb,0x0, 0xfc,0x0, 0xfd,0x0, 0xfe, +0x0, 0xff,0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0xff, +0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, 0xf9,0x0, 0xf8,0x0, 0xf7, +0x0, 0xf6,0x0, 0xf5,0x0, 0xf4,0x0, 0xf3,0x0, 0xf2,0x0, 0xf1,0x0, 0xf0,0x0, 0xef, +0x0, 0xee,0x0, 0xed,0x0, 0xec,0x0, 0xeb,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, 0xe7, +0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, 0xdf, +0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, 0xd7, +0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, 0xcf, +0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xca,0x0, 0xc9,0x0, 0xc8,0x0, 0xc7, +0x0, 0xc6,0x0, 0xc5,0x0, 0xc4,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, 0xc0,0x0, 0xbf, +0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, 0xb8,0x0, 0xb7, +0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, 0xb0,0x0, 0xaf, +0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, 0xa8,0x0, 0xa7, +0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0xa3,0x0, 0xa2,0x0, 0xa1,0x0, 0xa0,0x0, 0x9f, +0x0, 0x9e,0x0, 0x9d,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, 0x99,0x0, 0x98,0x0, 0x97, +0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, 0x91,0x0, 0x90,0x0, 0x8f, +0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, 0x89,0x0, 0x88,0x0, 0x87, +0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, 0x81,0x0, 0x80,0x0, 0x7f, +0x0, 0x7e,0x0, 0x7d,0x0, 0x7c,0x0, 0x7b,0x0, 0x7a,0x0, 0x79,0x0, 0x78,0x0, 0x77, +0x0, 0x76,0x0, 0x75,0x0, 0x74,0x0, 0x73,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, 0x6f, +0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, 0x67, +0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, 0x5f, +0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, 0x57, +0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x52,0x0, 0x51,0x0, 0x50,0x0, 0x4f, +0x0, 0x4e,0x0, 0x4d,0x0, 0x4c,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, 0x48,0x0, 0x47, +0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, 0x40,0x0, 0x3f, +0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, 0x38,0x0, 0x37, +0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, 0x30,0x0, 0x2f, +0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x2b,0x0, 0x2a,0x0, 0x29,0x0, 0x28,0x0, 0x27, +0x0, 0x26,0x0, 0x25,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, 0x21,0x0, 0x20,0x0, 0x1f, +0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, 0x19,0x0, 0x18,0x0, 0x17, +0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, 0x11,0x0, 0x10,0x0, 0xf, +0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, 0x9, 0x0, 0x8, 0x0, 0x7, +0x0, 0x6, 0x0, 0x5, 0x0, 0x4, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x18,0x19,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0xb, 0x0, 0xb, 0x0, +0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, +0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x0, 0xb, 0x18,0x19,0x2, 0x5, 0x0, +0x0, 0x0, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x18,0x19,0x2, 0x5, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, +0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, +0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x18,0x19,0x2, 0x5, 0x2, 0x0, 0x0, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x1, 0xa, 0x1e,0x50,0x14,0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x1, 0x68,0x1, 0x18,0x1, +0x18,0x5, 0xdc,0x5, 0xdc,0x5, 0xdc,0x1, 0x90,0x1, 0x90,0xa, 0x0, 0x1, 0xc2,0x1, +0xa, 0x6, 0x21,0x3c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16,0x1, 0x0, 0x1, 0x87,0x1, 0x0, 0xb, +0x1, 0x89,0x0, 0x1, 0x0, 0x15,0x1, 0x1, 0x5, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d,0x0, 0x0, 0x0, 0x0, 0x0, 0xff,0x0, +0x64,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x89,0x1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x4, 0x0, 0x2, 0xda, +0x1, 0x68,0x2e,0x2d,0x1, 0x68,0x1, 0x18,0x0, 0xb3,0x0, 0xbb,0x5, 0xa0,0x2, 0xd0, +0x2d,0x2d,0x1, 0x36,0x1, 0x4a,0x0, 0xb4,0x0, 0xb4,0x10,0x0, 0xc8,0x2, 0x58,0x3, +0x20,0x2, 0xd0,0x7, 0xd0,0x1, 0x2c,0x0, 0x40,0x0, 0x4, 0x1, 0x5, 0x2, 0x2, 0x4, +0x4, 0x6, 0x80,0x0, 0xc8,0x13,0x88,0x10,0x3, 0x6, 0x1, 0x2c,0x2, 0x58,0x3, 0x20, +0x1f,0x40,0x28,0x1, 0x5e,0x2, 0xbc,0x0, 0x14,0x19,0x5, 0xf, 0x2, 0xd0,0x1, 0x68, +0x5, 0xa0,0x0, 0x64,0x4, 0xa, 0x5, 0x0, 0x64,0x2, 0x76,0x0, 0x64,0x5, 0x3c,0x0, +0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0xc8,0x0, 0x49,0x0, 0x1e,0x0, 0x80,0x1, +0x6d,0x1, 0x68,0x0, 0x64,0x7, 0xd0,0x1, 0x68,0x1, 0x6d,0x0, 0x64,0x7, 0xd0,0x0, +0x0, 0x2, 0xda,0x0, 0x0, 0x5, 0xa0,0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x9, 0xc4,0x1, +0x2c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24, +0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e, +0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff, +0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad, +0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74, +0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22, +0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10, +0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22, +0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, +0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22, +0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c, +0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x22,0xbf,0x9f, +0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x22,0xbf,0x30,0xd5,0x6, 0x9f,0x22,0x9f, +0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38, +0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39, +0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e, +0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, 0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18, +0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x7f, +0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8,0x78,0x44,0xc2,0x22,0xc2, +0x23,0xc2,0x24,0xc2,0x1e,0xc2,0x1f,0x75,0x12,0x0, 0xc2,0x29,0xc2,0x2a,0xc2,0x25, +0xc2,0x26,0x75,0x6b,0x0, 0xc2,0x2b,0xc2,0x15,0xc2,0x16,0xc2,0x17,0xd2,0x18,0xd2, +0x19,0xc2,0xb, 0xc2,0xc, 0xc2,0xd, 0xc2,0xe, 0xc2,0xf, 0xc2,0x10,0xc2,0x11,0xc2, +0x12,0xc2,0x13,0xc2,0x14,0xc2,0x2c,0xc2,0x2d,0xd2,0x27,0xc2,0x28,0x75,0x1e,0x0, +0x75,0x1f,0x1, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x26,0xa2,0xb, 0xa, 0x40,0x5d,0x44, +0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a, +0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x2f,0xb9,0xca, +0xf8,0x7f,0x20,0x80,0xa, 0x7e,0x1b,0xf0,0x7a,0x2b,0xf0,0xb, 0x34,0xb, 0x54,0x69, +0xff,0xff,0xfc,0x7d,0xef,0x1b,0xe4,0x79,0xef,0xff,0xfc,0x4d,0xff,0x78,0xe6,0x7f, +0x10,0xda,0xf8,0x22,0x7d,0x43,0x7f,0x10,0x80,0x7, 0x1b,0x44,0x7a,0xb, 0xb0,0xb, +0x14,0x4d,0x44,0x78,0xf5,0x22,0xff,0x0, 0x1, 0x2, 0x0, 0xff,0x1, 0x2, 0x0, 0x1, +0xff,0x2, 0x0, 0x1, 0x2, 0xff,0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32, +0x22,0x6d,0x33,0x9d,0x32,0x22,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x1, 0x4a,0x60,0x1, 0x0, 0x1, 0x4a,0x66,0x1, 0x0, 0x1, 0x4a,0x68, +0x5, 0x0, 0x3, 0x4e,0x97,0x0, 0x0, 0x0, 0x0, 0x6, 0x4e,0x9a,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x6, 0x4e,0xa0,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x3, 0xff, +0x1, 0x0, 0x1, 0x78,0x8, 0x0, 0x0, 0x1, 0x78,0x9, 0x0, 0x0, 0x2, 0x76,0xda,0x0, +0x0, 0x0, 0x1, 0x76,0x7, 0xff,0x0, 0xa, 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x29,0x82,0x5, 0x0, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, +0x0, 0xc, 0x29,0xb2,0x3, 0x3, 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, +0x0, 0x1, 0x78,0x41,0x0, 0x0, 0x1, 0x77,0x70,0x0, 0x0, 0x1, 0x77,0x72,0x0, 0x0, +0x2, 0x3, 0xfd,0x0, 0x0, 0x0, 0x1, 0x3, 0xc8,0x0, 0x0, 0x1, 0x78,0x13,0x0, 0x0, +0x1, 0x5c,0xc3,0xff,0x0, 0x1, 0x5c,0xdc,0x0, 0x0, 0x2, 0x5c,0xdd,0x0, 0x0, 0x0, +0x4, 0x5c,0xdf,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x62,0x29,0x0, 0x0, 0x2, 0x62,0x7a, +0x0, 0x0, 0x0, 0x1, 0x78,0x1e,0x1, 0x0, 0x1, 0x78,0x1f,0x0, 0x0, 0x1e,0x0, 0x4d, +0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10,0x12,0x14,0x16,0x18,0x1a,0x1c,0x1e,0x20, +0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30,0x32,0x34,0x36,0x38,0x3a,0x3c,0x0, 0x1, +0x77,0xb3,0x0, 0x0, 0x1, 0x77,0xcf,0x1e,0x0, 0x1, 0x78,0x27,0x0, 0x0, 0x2, 0x76, +0x5, 0x0, 0x0, 0x0, 0x6, 0x78,0x28,0x30,0x1f,0x50,0x11,0x20,0x10,0x0, 0x1, 0x78, +0x2e,0x34,0x0, 0x1, 0x75,0x8a,0x64,0x0, 0x1, 0x78,0x43,0x0, 0x0, 0x1, 0x77,0xd7, +0x0, 0x0, 0x1, 0x77,0xdc,0x5, 0x0, 0x1, 0x77,0xe0,0x4, 0x0, 0x1, 0x77,0xe1,0x1, +0x0, 0x1, 0x77,0xe5,0x0, 0x0, 0x1, 0x78,0x30,0x0, 0x0, 0x1, 0x78,0x34,0x1, 0x0, +0x1, 0x78,0x44,0x1, 0x0, 0x1, 0x77,0xfb,0x0, 0x0, 0x2, 0x25,0xb3,0x25,0xb9,0x0, +0x1, 0x27,0x49,0x2, 0x0, 0x1, 0x27,0x72,0x0, 0x0, 0x1, 0x77,0x2b,0xff,0x0, 0x1, +0x77,0x2c,0x0, 0x0, 0x1, 0x77,0x2d,0x0, 0x0, 0x1, 0x77,0x2e,0x40,0x0, 0x1, 0x77, +0x2f,0x40,0x0, 0x4, 0x78,0x35,0x0, 0x0, 0x90,0x0, 0x0, 0x4, 0x3, 0xf1,0x0, 0x0, +0x94,0x0, 0x0, 0x4, 0x3, 0xf5,0x0, 0x0, 0x98,0x0, 0x0, 0x4, 0x3, 0xf9,0x0, 0x0, +0x9c,0x0, 0x0, 0x4, 0x1, 0x78,0x0, 0x0, 0x80,0x0, 0x0, 0x4, 0x78,0x39,0x0, 0x0, +0x91,0x0, 0x0, 0x4, 0x78,0x3d,0x0, 0x0, 0x92,0x0, 0x0, 0x0, 0x3, 0xe8,0x0, 0x51, +0x0, 0x3, 0x3, 0x20,0x0, 0x50,0x0, 0x3, 0x2, 0x58,0x0, 0x4e,0x0, 0x4, 0x1, 0xc2, +0x0, 0x4b,0x0, 0x4, 0x1, 0x40,0x0, 0x47,0x0, 0x4, 0x0, 0xc8,0x0, 0x44,0x0, 0x4, +0x0, 0x78,0x0, 0x3e,0x0, 0x5, 0x0, 0x64,0x0, 0x3c,0x0, 0x5, 0x12,0xe5,0xf2,0xe4, +0x7a,0xb3,0x76,0x7c,0x2, 0x28,0x7c,0xd2,0x1, 0x12,0x28,0x8c,0x74,0x1f,0x7a,0xb3, +0x73,0x1f,0x7a,0xb3,0x73,0x20,0x22,0x12,0x66,0xc5,0xd2,0x1, 0xe4,0x7a,0xb3,0x74, +0x7f,0x7a,0xb3,0x74,0x80,0x6c,0xaa,0x12,0xc1,0xc0,0xbe,0xa0,0x3, 0x78,0xf8,0xe4, +0x7a,0xb3,0x74,0xf4,0x7a,0xb3,0x74,0x81,0x30,0x1, 0x3, 0x12,0x28,0x7c,0x22,0xca, +0x3b,0xc2,0x4, 0x12,0x37,0xba,0xc2,0xc, 0x30,0xb, 0x18,0xc2,0xb, 0x30,0xd, 0x4, +0xc2,0xd, 0x80,0x3, 0x12,0x59,0x3e,0x12,0x3c,0x27,0x12,0x47,0x1c,0x12,0x47,0xde, +0x12,0x28,0x77,0xd2,0x4, 0x12,0x37,0xba,0xc2,0x1, 0x12,0xd3,0x1d,0x30,0xe, 0x3c, +0xc2,0xe, 0x12,0xe6,0x81,0x7d,0x23,0x5e,0x24,0x0, 0x1, 0x68,0x2f,0x5e,0x34,0x0, +0x2, 0x68,0x5, 0x12,0xe4,0x93,0x80,0x11,0x75,0x1e,0x1, 0x74,0x1, 0x7a,0xb3,0x77, +0xe1,0x7f,0x3, 0x12,0x3f,0x7c,0x12,0x37,0xe1,0x12,0x47,0x1c,0xc2,0x1, 0x12,0x28, +0x8c,0xe5,0x1e,0x12,0x3b,0xdd,0x74,0x1f,0x7a,0xb3,0x73,0x20,0xd2,0x1, 0x12,0xd3, +0x1d,0xda,0x3b,0x22,0x74,0x5, 0x7a,0xb3,0x78,0x33,0x12,0x28,0xaf,0x7e,0xb3,0x73, +0x1f,0x60,0xd, 0x80,0x6, 0x12,0x2c,0x6f,0x12,0x28,0xaf,0x12,0x8b,0x5f,0x50,0xf5, +0x7e,0xb3,0x73,0x20,0x60,0xd, 0x80,0x6, 0x12,0x2c,0x6f,0x12,0x28,0xaf,0x12,0x35, +0xf7,0x50,0xf5,0x2, 0x29,0x56,0x7e,0x63,0x77,0xe1,0x7e,0x73,0x74,0x7e,0x74,0x26, +0xa5,0xbe,0x3, 0x8, 0xac,0xb7,0x49,0x15,0x74,0x96,0x80,0x6, 0xac,0xb7,0x49,0x15, +0x74,0x92,0x7d,0x21,0x7a,0x27,0x4a,0x6f,0x30,0x15,0x10,0x7e,0x24,0x0, 0x27,0xca, +0x29,0x12,0xe5,0x39,0x12,0x24,0xf, 0x1b,0xfd,0xc2,0x15,0x22,0x7e,0xa3,0x76,0x80, +0xbe,0xa0,0x5, 0x78,0x8, 0x74,0x1, 0x7a,0xb3,0x76,0x80,0x80,0x1b,0xbe,0xa0,0x4, +0x78,0x1c,0x74,0x1, 0x7a,0xb3,0x76,0x80,0x7e,0x34,0x21,0x57,0x12,0x29,0xdb,0x12, +0x2c,0x73,0x12,0x28,0x77,0x12,0x29,0x24,0x74,0x2, 0x7a,0xb3,0x76,0x80,0x22,0x7a, +0x37,0x6e,0x8d,0xe4,0x7a,0xb3,0x78,0x42,0x7e,0x34,0x21,0x67,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x30,0x7a,0x37,0x6e,0x97,0x7e,0x34,0x21,0x69,0x7e,0x24,0x0, 0xff,0xb, +0x1a,0x30,0x22,0x90,0x21,0x51,0xe4,0x93,0x7a,0xb3,0x6e,0x89,0x12,0x2f,0x7d,0x7e, +0x34,0x21,0x5b,0x12,0x29,0xdb,0x7a,0x37,0x6e,0x8b,0x7e,0x34,0x21,0x5d,0x12,0x29, +0xdb,0x7a,0x37,0x6e,0x8d,0x7e,0x34,0x21,0x5f,0x12,0x29,0xdb,0x12,0x2b,0x49,0x7a, +0x37,0x6e,0x8f,0x7e,0x34,0x21,0x61,0x12,0x29,0xdb,0x12,0xe6,0x31,0x12,0x29,0xdb, +0x7a,0x37,0x6e,0x93,0x7e,0x34,0x21,0x65,0x12,0x29,0xdb,0x12,0x2b,0x49,0x7a,0x37, +0x6e,0x95,0x12,0x29,0xc8,0x12,0x2b,0x49,0x7a,0x37,0x6e,0x99,0x90,0x21,0x9b,0xe4, +0x93,0x7a,0xb3,0x6e,0x9d,0x90,0x21,0x54,0xe4,0x93,0x7a,0xb3,0x6e,0x9e,0x7e,0x34, +0x21,0x55,0x12,0x29,0xdb,0x7a,0x37,0x6e,0x9f,0x7e,0x34,0x21,0x6b,0x12,0x29,0xdb, +0x7a,0x37,0x6e,0x9b,0xe4,0x7a,0xb3,0x6e,0xa1,0x7a,0xb3,0x6e,0xa2,0x7a,0xb3,0x6e, +0xa3,0x7a,0xb3,0x6e,0xa4,0x7a,0xb3,0x6e,0xa5,0x7a,0xb3,0x6e,0xa6,0x7a,0xb3,0x6e, +0xa7,0x7a,0xb3,0x6e,0xa8,0x7a,0xb3,0x6e,0xa9,0x7a,0xb3,0x6e,0xaa,0x22,0x7e,0x34, +0x21,0x5b,0x12,0x29,0xdb,0x12,0x2f,0xae,0x7a,0x73,0x76,0xa, 0x7e,0x34,0x21,0x5d, +0x12,0x29,0xdb,0x12,0x2b,0x77,0x7a,0x73,0x76,0xb, 0x7e,0x34,0x21,0x63,0x12,0x29, +0xdb,0x12,0x2b,0x77,0x7a,0x73,0x76,0xc, 0x7e,0x34,0x21,0x63,0x12,0x29,0xdb,0x12, +0x2b,0x77,0x7a,0x73,0x76,0xd, 0x7e,0x34,0x21,0x6b,0x12,0x29,0xdb,0x12,0x2f,0xae, +0x7a,0x73,0x76,0xf, 0x7e,0x34,0x0, 0x6a,0xca,0x39,0x7e,0x34,0x21,0x6f,0x7e,0x24, +0x0, 0xff,0x7e,0x8, 0x76,0x10,0x12,0x24,0xf, 0x1b,0xfd,0x22,0x7e,0xb3,0x76,0x5a, +0xb4,0x1, 0x5, 0x12,0x2b,0x50,0x80,0xf, 0x7e,0xb3,0x6e,0xa3,0xb4,0x1, 0x5, 0x12, +0x2f,0x60,0x80,0x3, 0x12,0x6f,0x76,0x7e,0xb3,0x78,0x42,0x70,0x17,0x7e,0xb3,0x6e, +0x7c,0x70,0x11,0x7e,0xb3,0x6e,0xa3,0x70,0xb, 0x7e,0x34,0x21,0x6d,0x12,0x29,0xdb, +0x7a,0x37,0x6e,0x8b,0x12,0xca,0x84,0x68,0x11,0x7e,0x34,0x21,0x61,0x12,0x29,0xdb, +0x12,0xe6,0x31,0x12,0x29,0xdb,0x7a,0x37,0x6e,0x93,0x7e,0x34,0x21,0x5f,0x12,0x29, +0xdb,0x12,0x2b,0x49,0x7a,0x37,0x6e,0x8f,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x22, +0x7e,0x34,0x21,0x5b,0x12,0x29,0xdb,0x12,0x2f,0x79,0x7e,0x34,0x21,0x5d,0x12,0x29, +0xdb,0x12,0x29,0xbf,0x12,0x2f,0xa0,0x12,0x2b,0x6f,0x7a,0x73,0x76,0xb, 0x22,0x7a, +0x73,0x76,0xa, 0x7e,0x37,0x6e,0x8d,0xe, 0x34,0xe, 0x34,0xe, 0x34,0xe, 0x34,0xe, +0x34,0x22,0x30,0x29,0xf, 0x7e,0xb3,0x76,0x78,0xb4,0x1, 0x8, 0x74,0x1, 0x7a,0xb3, +0x73,0x1e,0x80,0x3, 0x12,0x52,0xda,0xc2,0x29,0x7e,0xb3,0x77,0xfa,0xb4,0x1, 0x2, +0x80,0x2, 0x81,0x36,0x12,0x68,0xda,0x12,0x8b,0xd2,0x12,0x4c,0x1f,0x12,0x29,0x24, +0x7e,0x34,0x21,0x59,0x12,0x29,0xdb,0x12,0x2c,0x73,0x12,0x8d,0x40,0x7e,0xb3,0x25, +0xae,0x70,0x2, 0x80,0x58,0x12,0xba,0x35,0x7e,0xb3,0x76,0x2e,0xb4,0x1, 0x2, 0xd2, +0x86,0x7e,0xb3,0x6e,0xa2,0x70,0x6, 0x12,0x2a,0xec,0x12,0xda,0xc3,0x12,0x74,0xa8, +0x7e,0xb3,0x25,0xae,0x70,0x2, 0x80,0x35,0x74,0x1, 0x12,0x2c,0x4b,0x12,0x2d,0xe, +0x12,0x99,0x25,0x12,0x9b,0x5b,0x74,0x2, 0x12,0x2c,0x4b,0x12,0x81,0xca,0x74,0x3, +0x12,0x2c,0x4b,0x12,0x9d,0x11,0x74,0x4, 0x12,0x2c,0x4b,0x12,0x67,0xf0,0x12,0xbb, +0xcf,0x12,0xa7,0x4e,0x12,0x70,0xd2,0x7e,0xb3,0x25,0xae,0x70,0xb, 0x12,0xb9,0xb9, +0x12,0x66,0x5a,0x12,0xd8,0x3a,0x61,0x99,0x12,0x79,0x53,0x12,0x68,0xb4,0x12,0x4f, +0x5a,0x12,0x66,0x63,0x61,0x99,0xd2,0x4, 0x12,0x36,0xe7,0x2, 0x2c,0x3e,0x12,0x0, +0x26,0x7e,0xb3,0x76,0x2e,0xb4,0x1, 0x2, 0xd2,0x86,0x22,0x1b,0xb1,0x68,0x10,0x14, +0x68,0x13,0x14,0x68,0x16,0x24,0x3, 0x78,0x15,0xe4,0x7a,0xb3,0x6e,0x86,0x22,0x12, +0x0, 0xa, 0x2, 0xb7,0xae,0x12,0xa7,0xed,0x2, 0x87,0x7, 0x2, 0xb4,0xeb,0x22,0x7e, +0x34,0x9, 0xc4,0x6d,0x22,0x7a,0x27,0x77,0xe9,0x7a,0x37,0x77,0xeb,0x22,0x12,0x52, +0x9c,0x7e,0xb3,0x77,0xfa,0xb4,0x3, 0x70,0x12,0x4e,0xc3,0x12,0x29,0x24,0x12,0x2c, +0x6f,0x7e,0xb3,0x76,0x7c,0x30,0xe7,0x5b,0x7e,0xb3,0x76,0x8d,0x70,0x5, 0xc2,0x4, +0x12,0x36,0xe7,0x12,0x28,0xaf,0x30,0x10,0x8, 0xc2,0x10,0x12,0x28,0x87,0x12,0x37, +0x94,0x7e,0xb3,0x76,0x8d,0x70,0x5, 0x12,0x8e,0x28,0x80,0x6, 0x12,0x8d,0x40,0x12, +0x8e,0x3f,0x7e,0xb3,0x73,0x1e,0xb4,0x1, 0x17,0x12,0xba,0x35,0x74,0x2, 0x12,0xca, +0x6, 0x12,0xda,0xc3,0x12,0x4f,0xf8,0x12,0xc9,0xfb,0x12,0x74,0xa8,0x12,0x2d,0xe, +0x12,0x51,0xa3,0x7e,0xb3,0x76,0x8d,0x70,0xa, 0x7e,0xb3,0x76,0x7c,0x54,0x7f,0x7a, +0xb3,0x76,0x7c,0x12,0x66,0x40,0x80,0x89,0xd2,0x29,0xd2,0x4, 0x12,0x36,0xe7,0x2, +0x2d,0x2, 0xe4,0x7a,0xb3,0x78,0x2f,0x6d,0x33,0x7a,0x37,0x78,0x31,0x22,0xc2,0x2a, +0x7e,0xb3,0x6e,0xa1,0x70,0x3, 0x12,0xc8,0x20,0x12,0x2f,0x20,0x12,0xbd,0xf2,0x12, +0x2f,0x20,0x12,0x55,0x9, 0x12,0x2f,0x20,0x12,0x5e,0xa3,0x12,0x2f,0x20,0x12,0x8f, +0xff,0x12,0x2f,0x20,0x2, 0x2d,0x37,0xca,0x3b,0xc2,0x0, 0x7e,0xd3,0x6c,0xde,0xa, +0x3d,0x3e,0x34,0xca,0x39,0x7e,0x18,0x6b,0x54,0x7e,0x8, 0x62,0xb8,0x12,0x24,0xf, +0x1b,0xfd,0x6c,0x11,0x75,0x26,0x0, 0x6c,0xcc,0xc1,0x11,0x7e,0x44,0x3, 0xff,0x7e, +0xe0,0xff,0x6c,0xff,0x80,0x5a,0x7c,0xbf,0x12,0x2f,0xde,0x60,0x51,0x12,0xe6,0x78, +0xbe,0x0, 0xff,0x68,0x49,0x9, 0x5, 0x62,0xb9,0xa, 0x10,0x7e,0x70,0x2, 0xac,0x7c, +0x9, 0x3, 0x77,0x77,0xa, 0x30,0x12,0x95,0x6b,0x8, 0x4, 0x9d,0x31,0x80,0x4, 0x6d, +0x33,0x9d,0x32,0x12,0xe6,0x78,0xa, 0xf0,0x74,0x2, 0xac,0xbc,0x9, 0x5, 0x77,0x76, +0xa, 0x10,0x7d,0x21,0x9d,0x2f,0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x9d,0x1f,0x80,0x4, +0x6d,0x11,0x9d,0x12,0x2d,0x13,0xbd,0x41,0x28,0x4, 0x7d,0x41,0x7c,0xef,0xb, 0xf0, +0xbc,0xdf,0x38,0xa2,0xbe,0xe0,0xff,0x68,0x46,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3, +0x62,0xb8,0x9, 0x73,0x62,0xb9,0x12,0x57,0x9, 0x7d,0x13,0x74,0x2, 0xac,0xbe,0x9, +0xb5,0x62,0xb8,0x12,0x97,0xf8,0xbd,0x13,0x48,0x25,0x7e,0x70,0x2, 0xac,0x7e,0x9, +0x3, 0x62,0xb8,0x7e,0xa1,0x26,0x74,0x2, 0xa4,0x19,0x5, 0x62,0xf4,0x9, 0x3, 0x62, +0xb9,0x19,0x5, 0x62,0xf5,0x74,0xff,0x19,0xb3,0x62,0xb8,0xb, 0x10,0x5, 0x26,0xb, +0xc0,0x7e,0x3, 0x77,0xb2,0xbc,0xc, 0x28,0x2, 0xa1,0x5b,0x7c,0xc1,0x80,0x76,0x6d, +0x0, 0x7e,0xe0,0xff,0x6c,0xff,0x80,0x40,0x7c,0xbf,0x12,0x2f,0xde,0x60,0x37,0x7e, +0x30,0x2, 0xac,0x3f,0x9, 0xb1,0x62,0xb8,0xbe,0xb0,0xff,0x68,0x29,0x9, 0x71,0x62, +0xb9,0x12,0x57,0x9, 0x7d,0x43,0xc2,0x0, 0xbd,0x4, 0x58,0x2, 0xd2,0x0, 0x30,0x0, +0x15,0x7e,0x70,0x2, 0xac,0x7f,0x9, 0xb3,0x62,0xb8,0xf5,0x27,0x9, 0xb3,0x62,0xb9, +0xf5,0x28,0x7d,0x4, 0x7c,0xef,0xb, 0xf0,0xbc,0xdf,0x38,0xbc,0xbe,0xe0,0xff,0x68, +0x22,0x7e,0xa1,0x27,0x7e,0x31,0x26,0x74,0x2, 0xac,0x3b,0x19,0xa1,0x62,0xf4,0xe5, +0x28,0x19,0xb1,0x62,0xf5,0x7e,0xa0,0xff,0x7e,0x30,0x2, 0xac,0x3e,0x19,0xa1,0x62, +0xb8,0x5, 0x26,0xb, 0xc0,0x90,0x21,0x51,0xe4,0x93,0xbc,0xbc,0x38,0x81,0x90,0x21, +0x52,0xe4,0x93,0x7c,0xab,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x62,0xf4,0x7e,0x8, +0x62,0xb8,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0xd1,0x26,0x12,0x54,0xc8,0x74,0x2, 0xac, +0x7b,0x7e,0x8, 0x77,0x76,0x74,0xff,0x12,0x24,0x34,0xbe,0xd0,0x0, 0x28,0x37,0xa, +0x3d,0x3e,0x34,0xca,0x39,0x7e,0x18,0x62,0xb8,0x7e,0x8, 0x6b,0x54,0x12,0x24,0xf, +0x1b,0xfd,0xa, 0x3d,0x3e,0x34,0xca,0x39,0x7e,0x18,0x62,0xb8,0x7e,0x8, 0x77,0x76, +0x12,0x24,0xf, 0x1b,0xfd,0x6c,0xcc,0x80,0x9, 0xd2,0x2, 0x7c,0xbc,0x12,0x57,0x49, +0xb, 0xc0,0xbc,0xdc,0x38,0xf3,0x7a,0xd3,0x77,0xb2,0x7a,0xd3,0x6c,0xde,0x90,0x21, +0x51,0xe4,0x93,0xbe,0xb3,0x6c,0xde,0x50,0x4, 0x7a,0xb3,0x6c,0xde,0xda,0x3b,0x22, +0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x2c,0x7c,0xbe,0x12,0x2f,0xde,0x60,0x23,0x7e, +0x34,0x0, 0x2, 0xca,0x39,0xac,0x7e,0x2e,0x34,0x6b,0x54,0x6d,0x22,0x7e,0x30,0x2, +0xac,0x3f,0x2e,0x14,0x6b,0x54,0x6d,0x0, 0x12,0x24,0xf, 0x1b,0xfd,0xd2,0x2, 0x12, +0x57,0x3d,0xb, 0xe0,0x12,0x9d,0x0, 0x38,0xcf,0x7a,0xf3,0x6c,0xde,0xda,0x79,0x22, +0x7e,0x34,0x0, 0xaa,0x12,0x2f,0x79,0x7e,0x34,0x0, 0x64,0x12,0x29,0xbf,0x12,0x2f, +0xa0,0x12,0x2b,0x6f,0x7a,0x73,0x76,0xb, 0x22,0x7a,0x37,0x6e,0x8b,0x90,0x21,0x53, +0xe4,0x93,0x7a,0xb3,0x6e,0x8a,0x22,0x7e,0x34,0x21,0x57,0x12,0x29,0xdb,0x12,0x2c, +0x73,0x12,0x69,0x3f,0x12,0x54,0x1c,0x12,0xe5,0xf2,0x12,0x2f,0xf0,0x2, 0x28,0x7c, +0x6e,0x34,0xff,0xff,0xb, 0x34,0x7a,0x37,0x6e,0x99,0x7e,0x37,0x6e,0x8b,0x1e,0x34, +0x1e,0x34,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x22,0x12,0x69,0x3f,0x12,0x2a,0x8e,0x12, +0x54,0x1c,0x12,0x59,0x32,0x12,0x28,0x6c,0x7e,0xb3,0x76,0x31,0x24,0xfd,0x68,0x9, +0xb, 0xb1,0x78,0xf4,0x12,0x2b,0x82,0x80,0xef,0x12,0x2c,0x7e,0x80,0xea,0x7c,0x7b, +0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x9, 0xa2,0x6b,0xcc,0x12,0x6e,0x60,0x5c,0xba,0x22, +0x7e,0x34,0xd, 0xac,0x2, 0x2c,0x73,0x7e,0xb3,0x76,0xae,0x12,0x34,0xac,0x7e,0x37, +0x4a,0x6d,0x4e,0x60,0x1, 0x7a,0x37,0x4a,0x6d,0x4e,0x70,0x20,0x7a,0x37,0x4a,0x6d, +0xca,0x3b,0x7e,0xf3,0x77,0xe1,0x7e,0x30,0x27,0xac,0x3f,0x9, 0xb1,0x28,0xe6,0xf5, +0x26,0x9, 0xb1,0x28,0xe7,0xf5,0x27,0x7e,0x4, 0x0, 0x27,0xca,0x9, 0x2e,0x14,0x28, +0xe6,0x6d,0x0, 0x7e,0x18,0x76,0xad,0x12,0x24,0xf, 0x1b,0xfd,0x74,0x27,0xac,0xbf, +0x9, 0xe5,0x28,0xea,0x7e,0xd0,0xb5,0xac,0xde,0x2e,0x64,0x1, 0x0, 0xe4,0x12,0x35, +0x28,0x12,0x32,0x3e,0x5e,0x24,0x1, 0x0, 0x68,0xc, 0x5e,0x60,0xfe,0x7a,0x37,0x4a, +0x6d,0x7c,0xbf,0x12,0x38,0x20,0x12,0x32,0x3e,0x5e,0x24,0x0, 0x1, 0x68,0x2e,0x5e, +0x70,0xfe,0x7a,0x37,0x4a,0x6d,0x7e,0xb3,0x76,0xad,0x12,0x38,0x8, 0x50,0xc, 0x7e, +0xb3,0x76,0xad,0x12,0x38,0x81,0x12,0x32,0xb7,0x80,0x12,0x7e,0xa1,0x26,0x7e,0x70, +0x27,0xac,0x7f,0x19,0xa3,0x28,0xe6,0xe5,0x26,0x7a,0xb3,0x76,0xad,0x12,0x32,0x3e, +0x5e,0x24,0x0, 0x2, 0x68,0x37,0x5e,0x70,0xfd,0x7a,0x37,0x4a,0x6d,0x7e,0xb3,0x76, +0xae,0x12,0xc6,0x48,0x50,0x15,0x7e,0xb3,0x76,0xae,0x12,0x39,0x17,0x50,0xc, 0x7e, +0xb3,0x76,0xae,0x12,0x34,0xac,0x12,0x32,0xb7,0x80,0x12,0x7e,0xa1,0x27,0x7e,0x70, +0x27,0xac,0x7f,0x19,0xa3,0x28,0xe7,0xe5,0x27,0x7a,0xb3,0x76,0xae,0x12,0x32,0x3e, +0x5e,0x24,0x0, 0x4, 0x68,0x2d,0x5e,0x70,0xfb,0x12,0x32,0x71,0x7e,0x30,0x2c,0xac, +0x3e,0x12,0x33,0xde,0x74,0x1, 0x7e,0x70,0x27,0xac,0x7f,0x12,0x37,0xe8,0x12,0x33, +0xe5,0x12,0x32,0x45,0x12,0x34,0xf1,0x12,0x34,0xe2,0x7d,0x36,0x74,0x2c,0xac,0xbe, +0x12,0x8a,0xed,0x12,0x32,0x3e,0x5e,0x24,0x0, 0x8, 0x68,0xe, 0x5e,0x70,0xf7,0x7a, +0x37,0x4a,0x6d,0x7e,0xb3,0x76,0xb0,0x12,0x38,0xcd,0x12,0x32,0x3e,0x5e,0x24,0x0, +0x10,0x68,0xc, 0x5e,0x70,0xef,0x12,0x32,0x78,0x12,0x32,0x45,0x12,0x34,0xf1,0x12, +0x32,0x3e,0x5e,0x24,0x0, 0x20,0x68,0x37,0x5e,0x70,0xdf,0x7a,0x37,0x4a,0x6d,0x4e, +0x60,0x2, 0x12,0x32,0x71,0x12,0x33,0xe5,0x12,0x32,0x65,0x74,0xa, 0xac,0xbf,0x12, +0xe5,0xb0,0x12,0x32,0x65,0x7e,0x70,0x27,0xac,0x7f,0x12,0xe5,0xc7,0x7c,0xbf,0x12, +0xd8,0x46,0x12,0x34,0xe2,0x12,0x32,0x5f,0x7e,0x24,0x0, 0x10,0x12,0xc, 0xcc,0x12, +0x32,0x3e,0x5e,0x24,0x0, 0x40,0x68,0x20,0x5e,0x70,0xbf,0x7a,0x37,0x4a,0x6d,0xbe, +0xf0,0x3, 0x7c,0xbf,0x12,0x8f,0x6f,0x78,0x7, 0xac,0x67,0x12,0xe6,0x4c,0x80,0x5, +0xac,0x67,0x12,0x37,0xff,0x12,0x44,0x0, 0x12,0x32,0x3e,0x5e,0x24,0x0, 0x80,0x68, +0xa, 0x5e,0x70,0x7f,0x7a,0x37,0x4a,0x6d,0x12,0x5a,0x65,0x12,0x32,0x3e,0x5e,0x24, +0x2, 0x0, 0x68,0x3b,0x5e,0x60,0xfd,0x7a,0x37,0x4a,0x6d,0x74,0x27,0xac,0xbf,0x49, +0xe5,0x28,0xed,0xb, 0xe4,0x7e,0xf7,0x76,0xd6,0xad,0xef,0xbe,0x78,0x7f,0xff,0x28, +0x4, 0x7e,0x78,0x7f,0xff,0x7e,0x8, 0x0, 0x82,0x12,0x34,0xf8,0x7e,0x8, 0x0, 0xbe, +0x12,0x34,0xf8,0x7e,0x8, 0x0, 0x82,0x7d,0x3f,0x12,0xd8,0x90,0x12,0xc, 0xcc,0x12, +0x32,0x3e,0x5e,0x24,0x4, 0x0, 0x68,0xe, 0x5e,0x60,0xfb,0x7a,0x37,0x4a,0x6d,0x7e, +0xb3,0x76,0x86,0x12,0xc2,0x16,0x12,0x32,0x3e,0x5e,0x24,0x10,0x0, 0x68,0x7, 0x5e, +0x60,0xef,0x7a,0x37,0x4a,0x6d,0x12,0x32,0x3e,0x5e,0x24,0x20,0x0, 0x68,0xc, 0x5e, +0x60,0xdf,0x7a,0x37,0x4a,0x6d,0x7c,0xbf,0x12,0x57,0xfb,0xda,0x3b,0x22,0x7e,0x37, +0x4a,0x6d,0x7d,0x23,0x22,0x7e,0x30,0x2c,0xac,0x3e,0x2e,0x14,0x1, 0x0, 0x6d,0x0, +0x74,0xa, 0xac,0xbf,0x49,0x35,0x29,0x92,0x49,0x25,0x29,0x90,0x12,0x9, 0xad,0x7d, +0x36,0x2e,0x34,0x0, 0x6, 0x7e,0x30,0x2c,0xac,0x3e,0x2e,0x14,0x1, 0x0, 0x6d,0x0, +0x22,0x7a,0x37,0x4a,0x6d,0x4e,0x60,0x10,0x7a,0x37,0x4a,0x6d,0x7c,0xbf,0xca,0xf8, +0x7c,0xfb,0x12,0x32,0xb7,0x7e,0xa3,0x76,0xaf,0x7e,0x70,0x27,0xac,0x7f,0x19,0xa3, +0x28,0xe8,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x42,0x76,0xb4,0x7e,0x70,0x27, +0xac,0x7f,0x2d,0x32,0x59,0x43,0x28,0xed,0xb, 0xa0,0xbe,0xa0,0x10,0x40,0xe5,0x7c, +0xbf,0x12,0x89,0x3a,0xda,0xf8,0x22,0x12,0x47,0xed,0x68,0x3a,0xe5,0x1e,0x60,0x36, +0x7e,0xb3,0x76,0xad,0x7e,0x73,0x76,0xae,0x12,0xd3,0x44,0x7d,0x23,0x7e,0x34,0x0, +0x3, 0xad,0x32,0x7e,0x24,0x0, 0xa, 0x8d,0x32,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x12,0x76,0xb4,0xbd,0x13,0x28,0x7, 0x59,0x32,0x76,0xb4,0x12,0xe5,0xe6,0xb, +0xa0,0xbe,0xa0,0x10,0x78,0xe5,0x22,0xca,0x79,0x7c,0xeb,0xbe,0xe0,0x4, 0x40,0x2, +0x61,0xcd,0x12,0xe6,0x43,0xbe,0xf0,0x3, 0x40,0x2, 0x61,0xcd,0x74,0x2, 0xac,0xbe, +0x9, 0xb5,0x29,0x83,0x54,0x3f,0xa, 0x3b,0x74,0x2c,0xac,0xbf,0x59,0x35,0x0, 0xf4, +0x74,0x2, 0xac,0xbe,0x9, 0xb5,0x29,0x82,0x54,0x1f,0x7c,0x6b,0x6c,0x77,0x12,0x33, +0xd2,0x74,0x2c,0xac,0xbf,0x59,0x35,0x0, 0xf6,0x12,0x33,0xd9,0x74,0x1, 0x7e,0x70, +0x27,0xac,0x7e,0x12,0x37,0xe8,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x32,0x6a,0x7e,0x70, +0x27,0xac,0x7e,0x12,0xe5,0xc7,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x38,0x7a,0x74,0x27, +0xac,0xbe,0x9, 0x75,0x28,0xe6,0x12,0x33,0xd0,0x12,0xd, 0xd3,0x7e,0x30,0x2c,0xac, +0x3f,0x12,0x34,0x9d,0x74,0x27,0xac,0xbe,0x9, 0x75,0x28,0xe7,0x12,0x33,0xd0,0x12, +0xd, 0xe5,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x34,0x9d,0x74,0xa, 0xac,0xbe,0x12,0x33, +0xf4,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x32,0x6a,0x74,0xa, 0xac,0xbe,0x12,0xe5,0xb0, +0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14,0x1, 0x8, 0x6d,0x0, 0x74,0x27,0xac,0xbe,0x9, +0xb5,0x28,0xe9,0x12,0xc, 0xaa,0xe4,0x12,0x35,0x28,0x7e,0x70,0xb5,0xac,0x7f,0x2e, +0x34,0x1, 0x0, 0x12,0x33,0xd9,0x7e,0x24,0x0, 0x16,0x12,0xc, 0xcc,0xda,0x79,0x22, +0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x22,0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14, +0x0, 0xf4,0x6d,0x0, 0x22,0x7e,0x30,0x2c,0xac,0x3e,0x2e,0x14,0x0, 0xf8,0x6d,0x0, +0x74,0xa, 0xac,0xbf,0x9, 0xb5,0x29,0x8a,0x2, 0xd, 0x73,0x12,0x34,0x94,0x7d,0x1, +0x5e,0x4, 0x0, 0x1, 0x78,0xa, 0xe4,0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x0, 0x80,0x2f, +0x5e,0x14,0x0, 0x2, 0x78,0x5, 0x12,0x34,0xff,0x80,0x24,0x7e,0xb3,0x77,0xe1,0xbe, +0xb0,0x1, 0x68,0x2, 0x70,0x19,0x12,0x34,0x8b,0x68,0xb, 0x74,0x2, 0x7a,0xb3,0x77, +0xe1,0x75,0x1e,0x2, 0x80,0x9, 0x74,0x3, 0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x3, 0x74, +0x1, 0x12,0x32,0xf7,0x7e,0xb3,0x77,0xe1,0x24,0x0, 0x68,0x2d,0x24,0xfd,0x68,0x16, +0x4, 0x78,0x2a,0x12,0x34,0x94,0x5e,0x14,0x0, 0x2, 0x68,0x2e,0x12,0x34,0x8b,0x78, +0x29,0x74,0x1, 0x2, 0x5, 0xbc,0x12,0x34,0x94,0x5e,0x14,0x0, 0x2, 0x68,0x1b,0x12, +0x34,0x8b,0x68,0x16,0x74,0x1, 0x2, 0x5, 0x30,0xe4,0x2, 0x32,0xf7,0x7e,0xf, 0x78, +0x39,0x12,0x3f,0x7c,0x12,0x37,0xe1,0x12,0x34,0xff,0x22,0x69,0x31,0x0, 0xe, 0x5e, +0x34,0x0, 0x8, 0x22,0x7e,0x1f,0x78,0x39,0x69,0x11,0x0, 0x6, 0x22,0x2e,0x14,0x0, +0xf8,0x6d,0x0, 0x22,0x74,0x26,0xac,0xbf,0x9, 0xb5,0x74,0x82,0xca,0x3b,0x7c,0xfb, +0x6c,0xee,0x74,0x27,0xac,0xbe,0x19,0xf5,0x28,0xe7,0xb, 0xe0,0xbe,0xe0,0x4, 0x78, +0xf1,0x7e,0x64,0x1, 0x0, 0x6c,0xee,0x7e,0x30,0x2c,0xac,0x3e,0x12,0x34,0x9d,0xa, +0x3f,0x12,0x33,0xd2,0x12,0xd, 0xe5,0x12,0x34,0xe2,0x12,0x38,0xc3,0x40,0xe8,0xda, +0x3b,0x22,0x7d,0x36,0xb, 0x35,0x74,0x2c,0xac,0xbe,0x49,0x25,0x0, 0xf8,0x2, 0x0, +0x2e,0x7e,0x24,0x0, 0x4, 0x2, 0xc, 0xcc,0x7e,0x37,0x76,0xd4,0x2, 0xc, 0x88,0x74, +0x1, 0x7a,0xb3,0x77,0xe1,0x75,0x1e,0x1, 0x22,0xca,0xf8,0x12,0xd3,0x56,0x7e,0xf0, +0x1, 0x7c,0xbf,0x12,0x32,0xf7,0xb, 0xf0,0xbe,0xf0,0x4, 0x78,0xf4,0xe5,0x1e,0x70, +0x4, 0xe4,0x12,0x32,0xf7,0xda,0xf8,0x22,0x7c,0xab,0x7e,0x8, 0x0, 0x7c,0x7c,0xba, +0x12,0xd, 0xf7,0x7e,0x8, 0x0, 0xb8,0x12,0xd, 0xf7,0x7e,0x34,0x0, 0x8, 0x7e,0x8, +0x0, 0x7c,0x12,0x5b,0x4d,0x7e,0x34,0x0, 0x8, 0x7e,0x8, 0x0, 0xb8,0x7e,0x24,0x0, +0x1, 0x2, 0x4, 0x96,0x7c,0xbf,0x7e,0x73,0x74,0x7e,0xca,0x79,0x7c,0xf7,0x7c,0xeb, +0xd2,0x17,0x12,0x34,0xa4,0xbe,0xe0,0x3, 0x7c,0xbe,0x7e,0x70,0x26,0x78,0x7, 0xac, +0x7f,0x12,0xe6,0x4c,0x80,0x5, 0xac,0x7f,0x12,0x37,0xff,0x12,0x44,0x0, 0xda,0x79, +0x22,0xca,0x79,0x7c,0xfb,0xc2,0x2, 0x7c,0xbf,0x12,0xc7,0x64,0xe5,0x1e,0x60,0x5d, +0x6c,0xee,0x74,0x26,0xac,0xbe,0x9, 0xb5,0x74,0x8f,0x60,0x38,0x12,0x8f,0x67,0x7c, +0x7e,0x12,0x35,0x5a,0xd2,0x2, 0xbe,0xf0,0x3, 0xa2,0x1, 0x92,0x3, 0x74,0x26,0x78, +0xc, 0xac,0xbe,0x49,0x15,0x74,0xa6,0x49,0x5, 0x74,0xa4,0x80,0xa, 0xac,0xbe,0x49, +0x15,0x74,0x9e,0x49,0x5, 0x74,0x9c,0x49,0x35,0x74,0xa2,0x49,0x25,0x74,0xa0,0x7c, +0xbf,0x12,0x36,0xff,0x20,0xb, 0x6, 0x20,0xc, 0x3, 0x30,0xe, 0x9, 0x30,0x2, 0x3, +0x12,0x35,0x54,0xc3,0x80,0xe, 0xb, 0xe0,0xbe,0xe0,0x3, 0x40,0xa5,0x30,0x2, 0x3, +0x12,0x35,0x54,0xd3,0xda,0x79,0x22,0xca,0xf8,0xc2,0x0, 0x7e,0xf3,0x77,0xe1,0x20, +0xb, 0x6, 0x20,0xc, 0x3, 0x30,0xe, 0x3, 0xc3,0xc1,0x99,0x7e,0x24,0x0, 0x1, 0x7c, +0xbf,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x73,0x20,0x6c,0x66,0x5c,0x75, +0x4d,0x33,0x68,0x74,0x7c,0xbf,0x12,0x8f,0x4b,0x50,0x2, 0xd2,0x0, 0xd2,0x4, 0x12, +0x36,0xe7,0xa2,0x0, 0x92,0x1, 0x7c,0xbf,0x12,0x35,0x81,0x40,0x3, 0xc3,0x80,0x59, +0x7c,0xbf,0x7e,0x73,0x75,0x6, 0x12,0x35,0x5a,0xe4,0x7c,0x7f,0x12,0x8e,0x47,0xa2, +0x0, 0x92,0x3, 0x7e,0xf, 0x24,0x64,0x7e,0x18,0x18,0x3c,0x7c,0xbf,0x12,0x36,0xff, +0x12,0x35,0x54,0x20,0xb, 0x6, 0x20,0xc, 0x3, 0x30,0xe, 0x3, 0xc3,0x80,0x2a,0x12, +0x37,0x94,0x12,0xc6,0x6c,0xc2,0x1, 0x12,0x28,0x8c,0x12,0x8b,0xcb,0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x6e,0x70,0xff,0x5e,0x73,0x73,0x20,0x7a,0x73,0x73,0x20,0x12, +0x47,0xde,0x12,0x8b,0xd2,0xd3,0x80,0x1, 0xd3,0xda,0xf8,0x22,0xca,0xf8,0x7c,0xfb, +0xbe,0xf0,0x3, 0x50,0x1c,0xbe,0x70,0x3, 0x50,0x17,0xd2,0x4, 0x12,0x36,0xe7,0x12, +0x34,0xa4,0x7e,0xb3,0x77,0xe1,0x7c,0x7f,0x12,0x35,0x5a,0x7a,0xf3,0x74,0x7e,0xd2, +0x15,0xda,0xf8,0x22,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x62,0xb8,0x7e,0x24,0x0, 0x12, +0x12,0x3, 0xfa,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x62,0xdc,0x7e,0x24,0x0, 0x12,0x12, +0x4, 0x96,0x12,0x37,0x94,0xd2,0x4, 0x80,0x6, 0x30,0xb, 0x3, 0x12,0x3e,0xe7,0x7e, +0xb3,0x76,0xff,0xbe,0xb0,0x1, 0x68,0xf1,0x30,0x4, 0x3, 0x2, 0xb, 0xe5,0x22,0xca, +0x3b,0xf5,0x2a,0x7f,0x31,0x7a,0xd, 0x26,0x7e,0x18,0xc, 0x18,0x7a,0x1d,0x2d,0x12, +0x37,0x94,0x7e,0xd, 0x26,0x12,0x37,0xef,0x30,0x3, 0xc, 0x7e,0x18,0x10,0x24,0x7a, +0x1d,0x31,0x7f,0x3, 0x12,0x37,0xef,0xe4,0x68,0x3, 0x12,0x37,0x94,0xd2,0x4, 0x12, +0x36,0xe7,0x30,0x3, 0x23,0x6d,0x33,0x80,0x17,0x12,0x37,0xf7,0x7e,0xd, 0x31,0x2d, +0x12,0xb, 0xa, 0x50,0x7d,0x23,0x3e,0x24,0x12,0xc5,0x5, 0x1b,0xa, 0x20,0xb, 0x34, +0x7a,0x35,0x2b,0x12,0xe6,0xf, 0x38,0xe1,0x6d,0x33,0x80,0x1f,0x12,0x37,0xf7,0x7e, +0xd, 0x2d,0x2d,0x12,0xb, 0xa, 0x20,0x3e,0x34,0x7e,0xd, 0x26,0x2d,0x13,0xb, 0xa, +0x30,0x2d,0x32,0x1b,0xa, 0x30,0x7e,0x35,0x2b,0xb, 0x34,0x7a,0x35,0x2b,0x12,0xe6, +0xf, 0x38,0xd9,0x7e,0xd, 0x26,0x12,0x8c,0x97,0x30,0x3, 0x5, 0x7f,0x3, 0x12,0x8c, +0x97,0xda,0x3b,0x22,0xe4,0x7a,0xb3,0x76,0xff,0x12,0xe5,0xd2,0x12,0xe4,0xbb,0x12, +0x3c,0xf3,0x12,0x37,0xe1,0xc2,0x4, 0x12,0x37,0xba,0x12,0xd3,0xbf,0xbe,0xb0,0x1, +0x68,0x3, 0x12,0xd3,0xaf,0xd2,0x4, 0x2, 0x37,0xba,0xa2,0xac,0x92,0x5, 0xc2,0xac, +0x7e,0xf, 0x78,0x39,0x30,0x4, 0xa, 0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x70,0x3, 0x80, +0x8, 0xb, 0x16,0xb, 0xa, 0x30,0x5e,0x70,0xfc,0x1b,0xa, 0x30,0xa2,0x5, 0x92,0xac, +0x22,0x5e,0x70,0xfb,0x1b,0xa, 0x30,0x22,0x9, 0x73,0x28,0xe8,0x2, 0xd, 0x23,0x7e, +0x34,0x4, 0xc, 0xe4,0x2, 0x24,0x34,0x7e,0x35,0x2b,0x7d,0x23,0x3e,0x24,0x22,0x49, +0x13,0x74,0x92,0x49,0x3, 0x74,0x90,0x22,0x7c,0x7b,0x74,0x8, 0xac,0x7b,0xbe,0x34, +0x0, 0x5a,0x38,0x2, 0xc3,0x22,0xbe,0x34,0x0, 0x1e,0x50,0x2, 0xc3,0x22,0xd3,0x22, +0x7c,0x7b,0x74,0x27,0xac,0xb7,0x9, 0x95,0x28,0xea,0x7e,0x63,0x76,0xa5,0x74,0x2, +0xac,0xb7,0x19,0x65,0x29,0x82,0x7e,0x63,0x76,0xa6,0x74,0x2, 0xac,0xb7,0x19,0x65, +0x29,0x83,0x74,0x2, 0xac,0x7b,0x2e,0x34,0x29,0x82,0x7e,0x14,0x0, 0x28,0x12,0x23, +0x44,0x7e,0x30,0x2c,0xac,0x39,0x7d,0x31,0x2e,0x34,0x0, 0xf4,0x12,0x38,0x7a,0x12, +0xb, 0x44,0x7e,0x70,0xb5,0xac,0x79,0x2e,0x34,0x1, 0x0, 0x7e,0x30,0x2c,0xac,0x39, +0x12,0x33,0xde,0x7e,0x24,0x0, 0x2, 0x2, 0xc, 0xcc,0x2e,0x14,0x0, 0xf6,0x6d,0x0, +0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x74,0x27,0xac,0xbe,0x19,0xf5,0x28,0xe6,0xb, +0xe0,0xbe,0xe0,0x4, 0x78,0xf1,0x7e,0x64,0x1, 0x0, 0x6c,0xee,0x7e,0x30,0x2c,0xac, +0x3e,0x12,0x38,0x7a,0xa, 0x3f,0x12,0x33,0xd2,0x12,0xd, 0xd3,0x7d,0x36,0xb, 0x34, +0x74,0x2c,0xac,0xbe,0x49,0x25,0x0, 0xf6,0x12,0x0, 0x2e,0x12,0x38,0xc3,0x40,0xdc, +0xda,0x3b,0x22,0x2e,0x64,0x0, 0xb5,0xb, 0xe0,0xbe,0xe0,0x3, 0x22,0xca,0x3b,0x7c, +0xfb,0x6c,0xee,0x74,0x27,0xac,0xbe,0x19,0xf5,0x28,0xe9,0xb, 0xe0,0xbe,0xe0,0x4, +0x78,0xf1,0x7e,0x64,0x1, 0xa, 0x6c,0xee,0x7e,0x30,0x2c,0xac,0x3e,0x2e,0x14,0x1, +0x8, 0x6d,0x0, 0x7c,0xbf,0x12,0xc, 0xaa,0x12,0x39,0xc, 0x12,0x6, 0x48,0x12,0x39, +0xc, 0x12,0x6, 0xc5,0x12,0x38,0xc3,0x40,0xdf,0xda,0x3b,0x22,0x7d,0x36,0x74,0x2c, +0xac,0xbe,0x49,0x25,0x1, 0x8, 0x22,0x7c,0x7b,0x74,0x8, 0xac,0x7b,0xbe,0x34,0x0, +0x12,0x50,0x2, 0xc3,0x22,0xd3,0x22,0x7c,0x2b,0xa5,0xba,0xfa,0x5, 0x7e,0xb3,0x4a, +0x66,0x22,0xa5,0xba,0xfc,0x3, 0x74,0x1, 0x22,0xbe,0x20,0x5b,0x38,0x7, 0xa, 0x32, +0x9, 0xb3,0x76,0x7c,0x22,0xbe,0x20,0x6a,0x68,0x4, 0xa5,0xba,0x6b,0x1d,0x7e,0x37, +0x4a,0x63,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x4a,0x63,0x2e,0x37,0x4e,0x7f,0x7e,0x39, +0x30,0xa5,0xba,0x6b,0x3, 0x75,0x1a,0x6a,0x7c,0xb3,0x22,0xbe,0x20,0x6e,0x68,0x4, +0xa5,0xba,0x6f,0x1d,0x7e,0x37,0x4a,0x61,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x4a,0x61, +0x2e,0x37,0x4a,0x6f,0x7e,0x39,0x30,0xa5,0xba,0x6f,0x3, 0x75,0x1a,0x6e,0x7c,0xb3, +0x22,0xbe,0x20,0x6c,0x68,0x4, 0xa5,0xba,0x6d,0x1d,0x7e,0x37,0x4e,0x7d,0x7d,0x23, +0xb, 0x24,0x7a,0x27,0x4e,0x7d,0x2e,0x37,0x4a,0x6b,0x7e,0x39,0x30,0xa5,0xba,0x6d, +0x3, 0x75,0x1a,0x6c,0x7c,0xb3,0x22,0xbe,0x20,0x89,0x68,0x4, 0xa5,0xba,0x8a,0x1d, +0x7e,0x37,0x4e,0x83,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x4e,0x83,0x2e,0x37,0x4e,0x81, +0x7e,0x39,0x30,0xa5,0xba,0x8a,0x3, 0x75,0x1a,0x89,0x7c,0xb3,0x22,0xbe,0x20,0x70, +0x40,0xa, 0xbe,0x20,0x7f,0x38,0x5, 0x7c,0xb2,0x2, 0x3a,0xa4,0xbe,0x20,0x81,0x68, +0x4, 0xa5,0xba,0x82,0x2a,0x7e,0xb3,0x76,0x93,0x7c,0xab,0xbe,0xa0,0x20,0x40,0xd, +0xbe,0xa0,0x40,0x50,0x8, 0xa, 0x3a,0x9, 0x33,0x6b,0x14,0x80,0x3, 0x12,0x6f,0xe6, +0x4, 0x7a,0xb3,0x76,0x93,0xa5,0xba,0x82,0x3, 0x75,0x1a,0x81,0x7c,0xb3,0x22,0xa5, +0xba,0x86,0x5, 0x7e,0xb3,0x4a,0x68,0x22,0xa5,0xba,0x87,0x5, 0x7e,0xb3,0x4a,0x60, +0x22,0xa5,0xba,0x88,0x19,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, 0x10,0x5e,0x34,0x38, +0x0, 0xa, 0x56,0x1e,0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x7, 0x22,0xbe,0x20, +0x90,0x40,0xa, 0xbe,0x20,0x94,0x38,0x5, 0x7c,0xb2,0x2, 0x66,0x98,0xbe,0x20,0x99, +0x68,0x4, 0xa5,0xba,0x9a,0x1b,0x7e,0x33,0x4a,0x65,0x7c,0xb3,0x4, 0x7a,0xb3,0x4a, +0x65,0xa, 0x33,0x9, 0x33,0x4e,0x85,0xa5,0xba,0x9a,0x3, 0x75,0x1a,0x99,0x7c,0xb3, +0x22,0xa5,0xba,0x9b,0x5, 0x7e,0xb3,0x4a,0x67,0x22,0xa5,0xba,0xf6,0x5, 0x7e,0xb3, +0x78,0x2f,0x22,0xa5,0xba,0xf7,0xb, 0x7e,0x57,0x78,0x31,0x7e,0x44,0x0, 0x64,0x8d, +0x54,0x22,0xe4,0x22,0x7c,0x6b,0x7e,0x70,0xff,0x7c,0xb6,0x24,0x8c,0xbe,0xb0,0xa, +0x40,0x2, 0x61,0x50,0x7e,0xa0,0x3, 0xa4,0x90,0x3a,0xbc,0x73,0x2, 0x3a,0xfa,0x2, +0x3b,0x50,0x2, 0x3a,0xda,0x2, 0x3a,0xe8,0x2, 0x3a,0xf1,0x2, 0x3b,0x3, 0x2, 0x3b, +0x1f,0x2, 0x3b,0xe, 0x2, 0x3b,0x24,0x2, 0x3b,0x24,0x7e,0x1f,0x78,0x39,0x69,0x31, +0x0, 0xe, 0x5e,0x34,0x0, 0x4, 0x80,0x68,0x7e,0x1f,0x78,0x39,0x12,0x34,0x8b,0x80, +0x5f,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x2, 0x80,0x56,0x12,0x3b,0x69,0x5e,0x34,0x0, +0x1, 0x80,0x4d,0x12,0x3b,0x69,0x5e,0x34,0x4, 0x0, 0xa, 0x36,0x80,0xb, 0x12,0x3b, +0x69,0x5e,0x34,0x8, 0x0, 0xa, 0x36,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x80,0x31,0x7e, +0x71,0xef,0x80,0x2c,0x7e,0x73,0x77,0xd6,0x7c,0xb7,0x4, 0x7a,0xb3,0x77,0xd6,0xa, +0x27,0x9, 0x72,0x1, 0x7c,0x7e,0xb3,0x76,0xa0,0x4, 0x7a,0xb3,0x76,0xa0,0x70,0x9, +0x7e,0xb3,0x76,0x9f,0x4, 0x7a,0xb3,0x76,0x9f,0xa5,0xbe,0x7d,0x3, 0x75,0x1a,0x7c, +0x7c,0xb7,0x22,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30, +0x75,0x1e,0x1, 0x74,0x1, 0x7a,0xb3,0x77,0xe1,0x7e,0x1f,0x78,0x39,0x69,0x31,0x0, +0x6, 0x22,0x30,0x1a,0x23,0xc2,0x1a,0xd2,0x1c,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x2, +0x74,0x1, 0x68,0x5, 0x12,0x5, 0x30,0x80,0x3, 0x12,0x35,0x1, 0x7e,0x34,0x0, 0x1, +0x12,0x3b,0xd2,0xe5,0x1e,0x2, 0x3b,0xdd,0x30,0x1d,0x2c,0xc2,0x1d,0xc2,0x1c,0x12, +0x3b,0x69,0x5e,0x34,0x0, 0x2, 0x74,0x1, 0x68,0x5, 0x12,0x5, 0xbc,0x80,0x3, 0x12, +0x35,0x1, 0x7e,0xb3,0x77,0xd9,0xb4,0x1, 0x7, 0x7e,0x34,0x0, 0x2, 0x12,0x3b,0xd2, +0xe5,0x1e,0x12,0x3b,0xdd,0x80,0x7, 0x30,0x1c,0x4, 0xe5,0x1e,0x70,0x3, 0x2, 0x37, +0x94,0x22,0x7e,0xa1,0x1e,0x74,0x8, 0xa4,0x59,0x35,0x76,0xdc,0x22,0x7c,0xab,0x12, +0x8a,0x26,0x1b,0xa0,0x68,0x12,0x1b,0xa0,0x68,0x13,0x1b,0xa0,0x68,0x14,0x2e,0xa0, +0x3, 0x78,0x12,0x12,0x8f,0x80,0x80,0xd, 0x12,0x8f,0xac,0x80,0x8, 0x12,0x8f,0x99, +0x80,0x3, 0x12,0x8f,0xec,0x2, 0x3c,0x8, 0xe4,0x7a,0xb3,0x77,0x7, 0x6c,0xaa,0x80, +0xd, 0x12,0xd6,0xc9,0x2e,0xb3,0x77,0x7, 0x7a,0xb3,0x77,0x7, 0xb, 0xa0,0x7e,0xb3, +0x76,0xfc,0xbc,0xba,0x38,0xeb,0x22,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x6, 0x5e, +0x34,0x0, 0x1, 0x68,0x18,0x12,0x3b,0x53,0x5e,0x34,0x0, 0x2, 0x68,0x3, 0x12,0xe4, +0x93,0x74,0x3, 0x12,0x3c,0x85,0x74,0x1, 0x12,0x32,0xf7,0x80,0x33,0x12,0x0, 0x26, +0x12,0xe6,0x8a,0x74,0x1, 0x12,0x3c,0x85,0xe4,0x12,0x32,0xf7,0x7e,0xf, 0x78,0x39, +0x2e,0x14,0x0, 0xa, 0xb, 0xa, 0x30,0x4e,0x60,0x10,0x1b,0xa, 0x30,0xe4,0x7a,0xb3, +0x77,0xd8,0x12,0x3c,0xf3,0x12,0x3c,0xbe,0x12,0x3f,0x52,0xe4,0x7a,0xb3,0x29,0xff, +0xe5,0x1e,0x2, 0x3b,0xdd,0xbe,0xb0,0x4, 0x50,0x33,0x7e,0x37,0x0, 0x9e,0x5e,0x70, +0xf0,0x7a,0x37,0x0, 0x9e,0xa, 0x3b,0x4e,0x37,0x0, 0x9e,0x7a,0x37,0x0, 0x9e,0x7a, +0x37,0x0, 0xda,0x7e,0x34,0x0, 0x19,0x7e,0x8, 0x0, 0x9e,0x12,0x5b,0x4d,0x7e,0x34, +0x0, 0x19,0x7e,0x8, 0x0, 0xda,0x7e,0x24,0x0, 0x1, 0x2, 0x4, 0x96,0x22,0x5e,0x70, +0xfe,0x1b,0xa, 0x30,0x22,0xca,0x3b,0x12,0xe6,0x81,0x5e,0x34,0x0, 0x1, 0x68,0x10, +0x7f,0x3, 0x12,0x3b,0x53,0x5e,0x34,0x0, 0x2, 0x68,0x13,0x12,0xe4,0x93,0x80,0xe, +0x12,0xe6,0x8a,0x7f,0x3, 0x12,0x3c,0xf7,0x12,0x3c,0xbe,0x12,0x3f,0x52,0xda,0x3b, +0x22,0xc2,0x28,0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x22,0xca, +0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0, +0x83,0xc0,0x82,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x80,0x0, 0x68, +0x2c,0xb, 0xa, 0x30,0x5e,0x34,0x80,0x0, 0x68,0x23,0x12,0x3f,0x7c,0x6e,0x70,0x40, +0x1b,0xa, 0x30,0x7e,0xf, 0x78,0x39,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x80,0x1b, +0xa, 0x30,0x12,0x3e,0xd6,0xd2,0xd, 0x12,0x3c,0xf3,0x12,0x3c,0xbe,0x7e,0xf, 0x78, +0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x0, 0x2, 0x68,0x1d,0xb, 0xa, 0x30,0x5e,0x34, +0x0, 0x2, 0x68,0x14,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x2, 0x1b,0xa, 0x30,0x12, +0x3e,0xd6,0x12,0x3c,0xf3,0x12,0x3c,0xbe,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, +0x5e,0x34,0x0, 0x1, 0x68,0x20,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x1, 0x68,0x17,0xb, +0x15,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x12,0x3f,0x3c,0x12,0x3c,0xf3, +0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34, +0x0, 0x8, 0x68,0x17,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x8, 0x68,0xe, 0xb, 0x15,0xb, +0xa, 0x30,0x4e,0x70,0x8, 0x1b,0xa, 0x30,0x12,0x3f,0x1a,0x7e,0xf, 0x78,0x39,0x69, +0x30,0x0, 0x4, 0x5e,0x34,0x0, 0x4, 0x68,0x17,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x4, +0x68,0xe, 0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x12,0x3e,0xff, +0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x40,0x0, 0x68,0x31,0xb, 0xa, +0x30,0x5e,0x34,0x40,0x0, 0x68,0x28,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x40,0x1b, +0xa, 0x30,0xd2,0xc, 0x7e,0xb3,0x77,0xd5,0xbe,0xb0,0xc8,0x50,0x5, 0x4, 0x7a,0xb3, +0x77,0xd5,0x7e,0xb3,0x77,0xd5,0xb4,0x1, 0x6, 0x12,0x28,0x7c,0x12,0x3e,0xe7,0x7e, +0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x20,0x0, 0x68,0x19,0xb, 0xa, 0x30, +0x5e,0x34,0x20,0x0, 0x68,0x10,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x20,0x1b,0xa, +0x30,0xd2,0xc, 0x12,0x3e,0xe7,0x7e,0xf, 0x78,0x39,0x69,0x30,0x0, 0x4, 0x5e,0x34, +0x10,0x0, 0x68,0x26,0xb, 0xa, 0x30,0x7d,0x23,0x5e,0x24,0x10,0x0, 0x68,0x1b,0x5e, +0x34,0x8, 0x0, 0x2e,0x34,0xff,0xff,0x92,0x12,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60, +0x8, 0x1b,0xa, 0x30,0x12,0xd3,0x70,0x12,0xd4,0x6d,0x7e,0xf, 0x78,0x39,0x69,0x30, +0x0, 0x4, 0x5e,0x34,0x0, 0x40,0x68,0x29,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x40,0x68, +0x20,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x40,0x1b,0xa, 0x30,0x7e,0x1f,0x78,0x39, +0x69,0x31,0x0, 0xa, 0x5e,0x34,0xf, 0xc0,0x12,0x2f,0xae,0x1e,0x34,0x7a,0x73,0x77, +0xd8,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda, +0x5b,0xda,0x6b,0xda,0x7b,0x32,0xd2,0xb, 0xd2,0x10,0x12,0x3b,0x69,0x5e,0x34,0x0, +0x1, 0x78,0x3, 0x2, 0x3f,0x10,0x22,0x30,0x28,0x14,0xa9,0xd2,0xea,0xa9,0xc2,0xea, +0x12,0x6c,0x9b,0x12,0x3c,0xf1,0x12,0x37,0xe1,0xc2,0x27,0x2, 0x3f,0x2b,0x22,0xd2, +0xe, 0xd2,0x10,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x2, 0x68,0x3, 0x2, 0x3f,0x10,0x22, +0x12,0xb, 0xb0,0x20,0x27,0x3, 0x2, 0x3f,0x2b,0x22,0xd2,0xe, 0xd2,0x10,0x12,0x3b, +0x69,0x5e,0x34,0x0, 0x2, 0x78,0x3, 0x2, 0x3f,0x10,0x22,0x12,0xb, 0xe5,0x12,0xd3, +0xaf,0x74,0x2, 0x7a,0xb3,0x77,0x0, 0x7a,0xb3,0x77,0x1, 0x22,0xd2,0xb, 0xd2,0x10, +0x12,0x3b,0x69,0x5e,0x34,0x0, 0x1, 0x68,0x8, 0xe4,0x7a,0xb3,0x77,0xd5,0x2, 0x3f, +0x10,0x22,0x7e,0xf, 0x78,0x39,0x12,0x3f,0x7c,0x12,0x3f,0xde,0x7e,0x70,0x1, 0x12, +0x3f,0x84,0x7e,0x70,0x1, 0x12,0x3f,0xd2,0x7e,0xb3,0x77,0xe1,0x7e,0x70,0x2, 0x12, +0x3f,0xe9,0x12,0x4c,0xff,0x5e,0x70,0xef,0x1b,0xa, 0x30,0x22,0x2e,0x14,0x0, 0xe, +0xb, 0xa, 0x30,0x22,0x12,0x3f,0x8c,0x7e,0xb3,0x77,0xe1,0x22,0x70,0xc, 0x12,0xe5, +0x2f,0x12,0xd, 0x8d,0x12,0x58,0x88,0x2, 0x4, 0x96,0x22,0x12,0x4c,0xff,0x12,0x3f, +0xde,0x7e,0x70,0x2, 0x12,0x3f,0xe9,0x74,0x14,0x12,0xd3,0x1, 0x7e,0xf, 0x78,0x39, +0x12,0x3f,0x7c,0x5e,0x70,0xef,0x12,0x3f,0xe1,0x7e,0x73,0x29,0xb2,0x12,0x3f,0xe9, +0x7e,0xb3,0x77,0xe1,0x7e,0x73,0x29,0xb3,0x12,0x3f,0x84,0x7e,0x73,0x29,0xb4,0x2, +0x3f,0xd2,0x70,0x9, 0x12,0xe5,0x2f,0x12,0x58,0x85,0x2, 0x4, 0x96,0x22,0x4e,0x70, +0x10,0x1b,0xa, 0x30,0x7e,0xb3,0x77,0xe1,0x22,0x70,0xc, 0x12,0xe5,0x2f,0x12,0xc, +0xea,0x12,0x58,0x88,0x2, 0x4, 0x96,0x22,0xca,0x3b,0x7e,0x73,0x6e,0xb3,0x7a,0x73, +0x62,0xb8,0x7e,0x73,0x6e,0xb4,0x7a,0x73,0x62,0xb9,0x7e,0xd3,0x76,0xae,0x7e,0xe3, +0x76,0xa5,0x7e,0xf3,0x76,0xa6,0x7e,0x8, 0x62,0xba,0x7e,0x34,0x0, 0x8, 0xe4,0x12, +0x24,0x34,0x7e,0x34,0x0, 0x20,0xca,0x39,0x7e,0x18,0x76,0xb4,0x7e,0x8, 0x62,0xc2, +0x12,0x24,0xf, 0x1b,0xfd,0x74,0x5, 0x7a,0xb3,0x76,0xae,0xe4,0x7a,0xb3,0x76,0xa5, +0x74,0x2, 0x7a,0xb3,0x76,0xa6,0x6c,0xcc,0x7e,0x34,0x0, 0x2, 0x74,0x2, 0xac,0xbc, +0x59,0x35,0x76,0xb4,0xb, 0xc0,0xbe,0xc0,0x10,0x78,0xf1,0x12,0x2f,0xf7,0x6c,0xcc, +0x4c,0xcc,0x78,0xd, 0x7e,0xb3,0x73,0x25,0x54,0x1, 0xb4,0x1, 0x4, 0x74,0x1, 0x80, +0x12,0xbe,0xc0,0x1, 0x78,0x14,0x7e,0xb3,0x73,0x25,0x54,0x2, 0x1e,0xb0,0xb4,0x1, +0x9, 0x74,0x4, 0x7a,0xb3,0x6e,0xb3,0xe4,0x80,0x34,0xbe,0xc0,0x2, 0x78,0x16,0x7e, +0xb3,0x73,0x25,0x54,0x4, 0x1e,0xb0,0x1e,0xb0,0xb4,0x1, 0x9, 0xe4,0x7a,0xb3,0x6e, +0xb3,0x74,0x1, 0x80,0x19,0xbe,0xc0,0x3, 0x78,0x46,0x7e,0xb3,0x73,0x25,0x54,0x8, +0xc4,0x23,0x54,0x1f,0xb4,0x1, 0x39,0xe4,0x7a,0xb3,0x6e,0xb3,0x74,0x4, 0x7a,0xb3, +0x6e,0xb4,0x7e,0x34,0x21,0x57,0x12,0x29,0xdb,0x12,0x2c,0x73,0x74,0x1f,0x7a,0xb3, +0x73,0x1f,0x12,0x29,0x24,0x7e,0x73,0x77,0xe1,0xa, 0x7, 0x12,0x41,0x5f,0xa, 0x3c, +0x2e,0x37,0x73,0x21,0x2d,0x31,0x9, 0x73,0x4e,0xa8,0xa, 0x2c,0x19,0x72,0x62,0xba, +0xb, 0xc0,0xbe,0xc0,0x4, 0x68,0x2, 0x1, 0x60,0x6c,0xcc,0xa, 0x3c,0x9, 0x73,0x62, +0xba,0x12,0x47,0xbd,0x12,0x41,0x5f,0xa, 0x2c,0x2e,0x27,0x73,0x21,0x2d,0x21,0x19, +0x72,0x4e,0xa8,0xb, 0xc0,0xbe,0xc0,0x4, 0x40,0xe1,0x7e,0x73,0x62,0xb8,0x7a,0x73, +0x6e,0xb3,0x7e,0x73,0x62,0xb9,0x7a,0x73,0x6e,0xb4,0x7a,0xd3,0x76,0xae,0x7a,0xe3, +0x76,0xa5,0x7a,0xf3,0x76,0xa6,0x7e,0x34,0x0, 0x20,0xca,0x39,0x7e,0x18,0x62,0xc2, +0x7e,0x8, 0x76,0xb4,0x12,0x24,0xf, 0x1b,0xfd,0x12,0x2f,0xf7,0xe4,0x7a,0xb3,0x76, +0xab,0x7a,0xb3,0x76,0xaa,0xda,0x3b,0x22,0x7e,0x35,0x28,0x7c,0x67,0xa, 0xf, 0x7e, +0x14,0x2, 0x3c,0xad,0x10,0x22,0xca,0x3b,0x7c,0xf7,0x7c,0xeb,0x75,0x27,0x7, 0x7e, +0x34,0x2, 0x0, 0x7a,0x35,0x2a,0x75,0x2c,0x0, 0x7e,0x34,0x24,0x66,0x7e,0x24,0x0, +0xff,0x7e,0x14,0x62,0xe2,0x7e,0x54,0x2, 0x3c,0x12,0x23,0x67,0x6d,0x66,0x80,0xe, +0x7e,0x34,0x7f,0xff,0x7d,0x26,0x3e,0x24,0x59,0x32,0x10,0x24,0xb, 0x64,0x7e,0x37, +0x73,0x21,0x7d,0x23,0xb, 0x26,0xbd,0x26,0x38,0xe6,0x2e,0x34,0x0, 0x8, 0x12,0x41, +0x5d,0x12,0x43,0xe4,0xe4,0x12,0x24,0x34,0x7e,0xb3,0x78,0x2f,0xb4,0x1, 0xa, 0x7e, +0x37,0x78,0x31,0x12,0x2f,0xb0,0x7a,0x35,0x2a,0x74,0xa, 0xac,0xbe,0x49,0x25,0x29, +0x8c,0x7e,0x35,0x2a,0xad,0x32,0x9, 0xb5,0x29,0x8a,0x60,0xc, 0x1e,0x34,0x1e,0x24, +0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7a,0x35,0x2a,0xe5,0x27,0xa, 0x5b,0x1b, +0x54,0xf5,0x26,0x61,0x4c,0xe5,0x26,0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0x7a,0x35,0x28,0x12,0x2c,0x6f,0xe5,0x26,0xbe,0xb0,0x7, 0x58,0x13,0x6d, +0x66,0x80,0xa, 0x12,0x41,0x58,0x7d,0x21,0x2d,0x26,0x12,0x46,0x26,0x12,0x43,0xeb, +0x38,0xf1,0x6d,0x66,0x12,0x41,0x58,0x7e,0x27,0x73,0x21,0x2d,0x26,0x2d,0x21,0x12, +0x46,0x26,0xbe,0x64,0x0, 0x4, 0x78,0xec,0x7c,0xbe,0x12,0x41,0x5d,0x12,0x43,0xe4, +0x12,0x44,0x0, 0x5, 0x2c,0xe5,0x2c,0x54,0x1, 0xb4,0x1, 0x8, 0x74,0x1, 0x7a,0xb3, +0x78,0x34,0x80,0xe, 0x7e,0x73,0x77,0xd8,0xa, 0x37,0x1e,0x34,0xb, 0x34,0x7a,0x73, +0x78,0x34,0x12,0x36,0xe2,0xe5,0x26,0xbe,0xb0,0x7, 0x58,0x66,0x6d,0x66,0x80,0x5d, +0x7d,0x56,0x3e,0x54,0x49,0x35,0xc, 0x18,0x7d,0x43,0x12,0x45,0xe6,0x8, 0x7, 0x7d, +0x23,0x9e,0x25,0x2a,0x80,0x4, 0x6d,0x22,0x9d,0x24,0x7a,0x25,0x2d,0x49,0x25,0x10, +0x24,0x7d,0x42,0x12,0x45,0xe6,0x8, 0x5, 0x9e,0x25,0x2a,0x80,0x4, 0x6d,0x22,0x9d, +0x24,0x7a,0x25,0x2f,0xbe,0x25,0x2d,0x40,0x13,0x59,0x35,0x10,0x24,0x12,0x41,0x5d, +0x7d,0x21,0x2d,0x26,0x9, 0x52,0x4e,0xa8,0x19,0x56,0x62,0xe2,0xbe,0x35,0x2a,0x50, +0xa, 0x12,0x43,0xf2,0x7d,0x23,0x2d,0x26,0x12,0x46,0x19,0xb, 0x64,0x12,0x43,0xeb, +0x38,0x9e,0x6d,0x66,0x7e,0x17,0x73,0x21,0x2d,0x16,0x7d,0x51,0x3e,0x54,0x49,0x5, +0xc, 0x18,0x7d,0x30,0x12,0x45,0xde,0x8, 0x7, 0x7d,0x40,0x9e,0x45,0x2a,0x80,0x4, +0x6d,0x44,0x9d,0x43,0x7a,0x45,0x2d,0x49,0x45,0x10,0x24,0x7d,0x34,0x12,0x45,0xde, +0x8, 0x5, 0x9e,0x45,0x2a,0x80,0x4, 0x6d,0x44,0x9d,0x43,0x7a,0x45,0x2f,0xbe,0x45, +0x2d,0x40,0x11,0x59,0x5, 0x10,0x24,0x12,0x43,0xf7,0x2d,0x31,0x9, 0x73,0x4e,0xa8, +0x19,0x71,0x62,0xe2,0xbe,0x5, 0x2a,0x50,0xa, 0x12,0x43,0xf2,0x7d,0x23,0x2d,0x21, +0x12,0x46,0x19,0xb, 0x64,0xbe,0x64,0x0, 0x4, 0x78,0x99,0x30,0xb, 0x2, 0x61,0xe1, +0x30,0xc, 0x2, 0x61,0xe1,0x30,0xe, 0x2, 0x61,0xe1,0x15,0x26,0xe5,0x26,0xbe,0xb0, +0x1, 0x48,0x2, 0x21,0xf5,0x7e,0xb3,0x76,0x9c,0xbe,0xb0,0x2, 0x68,0x6f,0x12,0x47, +0xed,0x68,0x6a,0x7e,0x8, 0x10,0x24,0x74,0xa, 0xac,0xbe,0x12,0x8c,0x9d,0x6d,0x66, +0x80,0x25,0x7d,0x26,0x3e,0x24,0x49,0x32,0x10,0x24,0xbe,0x34,0x3, 0xe8,0x28,0x15, +0xbe,0x34,0x3e,0x80,0x50,0xf, 0x9, 0x76,0x62,0xe2,0x12,0x41,0x5d,0x7d,0x21,0x2d, +0x26,0x19,0x72,0x4e,0xa8,0xb, 0x64,0x12,0x43,0xeb,0x38,0xd6,0x6d,0x66,0x7e,0x27, +0x73,0x21,0x2d,0x26,0x7d,0x12,0x3e,0x14,0x49,0x31,0x10,0x24,0xbe,0x34,0x3, 0xe8, +0x28,0x13,0xbe,0x34,0x3e,0x80,0x50,0xd, 0x9, 0x72,0x62,0xe2,0x12,0x41,0x5d,0x2d, +0x21,0x19,0x72,0x4e,0xa8,0xb, 0x64,0xbe,0x64,0x0, 0x4, 0x78,0xd1,0x74,0x1, 0x7a, +0xb3,0x78,0x34,0x7c,0xbe,0x12,0x41,0x5d,0x12,0x43,0xe4,0x12,0x44,0x0, 0x12,0x47, +0xde,0xda,0x3b,0x22,0x2e,0x14,0x4e,0xa8,0x6d,0x0, 0x22,0x7e,0x37,0x73,0x21,0xbd, +0x36,0x22,0x7e,0x55,0x28,0x64,0xff,0xa, 0x2f,0x7e,0x34,0x2, 0x3c,0xad,0x32,0x22, +0xca,0x3b,0x7f,0x30,0x7c,0xab,0xbe,0xa0,0x4, 0x40,0x2, 0xa1,0xaa,0x74,0x27,0xa4, +0x9, 0xb5,0x28,0xea,0xf5,0x37,0xe4,0x12,0x35,0x28,0x7e,0xf7,0x6e,0xb5,0x7e,0xe7, +0x6e,0xb7,0x2d,0xef,0x7a,0xe5,0x35,0x7e,0x8, 0x65,0x1e,0x12,0x64,0xb8,0x7e,0xb3, +0x6e,0xc1,0x60,0x62,0x6d,0xee,0x80,0x2e,0x7e,0xe5,0x31,0x3e,0xe4,0x49,0x3e,0x6e, +0xc2,0x7a,0x35,0x33,0x7f,0x3, 0x2e,0x15,0x31,0x7e,0xb, 0x50,0x19,0x53,0x2, 0xae, +0x12,0x45,0xd3,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x2f,0xb0,0x3e,0x34,0x2e, +0x34,0x65,0x42,0x12,0x45,0xad,0x7a,0xe5,0x31,0xbe,0xf5,0x31,0x38,0xca,0x7a,0xf5, +0x31,0x80,0x19,0x12,0x45,0xbb,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x2f,0xb0, +0x3e,0x34,0x2e,0x34,0x65,0x1e,0x12,0x45,0xad,0x7a,0xe5,0x31,0x7e,0xe5,0x35,0xbe, +0xe5,0x31,0x38,0xdf,0x80,0x67,0x6d,0xee,0x80,0x16,0x12,0x45,0xbb,0x60,0x5, 0x3e, +0x24,0x14,0x78,0xfb,0x12,0x2f,0xb0,0x3e,0x34,0x2e,0x34,0x65,0x1e,0x12,0x45,0xad, +0x7a,0xe5,0x31,0xbe,0xf5,0x31,0x38,0xe2,0x7a,0xf5,0x31,0x80,0x38,0x7e,0x35,0x31, +0x3e,0x34,0x49,0x23,0x6e,0xc2,0x7a,0x25,0x33,0x7f,0x3, 0x2e,0x15,0x31,0x7e,0xb, +0x70,0x19,0x72,0x2, 0xae,0x7d,0x52,0x12,0x64,0x78,0x60,0x5, 0x3e,0x14,0x14,0x78, +0xfb,0x12,0x64,0x83,0x3e,0x24,0x2e,0x24,0x65,0x42,0x12,0x47,0xf5,0x7e,0x35,0x31, +0xb, 0x34,0x7a,0x35,0x31,0x7e,0x35,0x35,0xbe,0x35,0x31,0x38,0xc0,0x7e,0x45,0x35, +0x12,0x46,0xd, 0x7a,0x73,0x1, 0x94,0x12,0x46,0x35,0x7a,0xb3,0x1, 0x95,0x12,0x45, +0xee,0x7a,0xb3,0x1, 0x96,0xb, 0x44,0x12,0x46,0xd, 0x7a,0x73,0x2, 0xae,0x12,0x46, +0x35,0x7a,0xb3,0x2, 0xaf,0x12,0x45,0xee,0x7a,0xb3,0x2, 0xb0,0x7e,0xb3,0x6e,0xb3, +0x54,0x5, 0xa, 0x3b,0x4e,0x37,0x65,0x1e,0x7a,0x37,0x65,0x1e,0x7e,0xb3,0x6e,0xb4, +0x54,0x5, 0xa, 0x3b,0x4e,0x37,0x65,0x42,0x7a,0x37,0x65,0x42,0x12,0x46,0x1, 0x2e, +0x74,0x0, 0x16,0x7d,0x37,0x7e,0x8, 0x65,0x1e,0x12,0x47,0xd0,0x7d,0x37,0x7e,0x8, +0x65,0x42,0x12,0x47,0xd7,0x12,0x46,0x1, 0x2e,0x74,0x0, 0x28,0x6d,0x33,0x7a,0x35, +0x31,0x7e,0x35,0x31,0x9, 0x53,0x1, 0x95,0x7c,0x25,0x6c,0x33,0x9, 0x53,0x1, 0x94, +0x12,0x46,0x45,0x40,0xec,0x12,0x45,0xf6,0x12,0x3, 0xfa,0x6d,0x33,0x7a,0x35,0x31, +0x7e,0x35,0x31,0x9, 0x53,0x2, 0xaf,0x7c,0x25,0x6c,0x33,0x9, 0x53,0x2, 0xae,0x12, +0x46,0x45,0x40,0xec,0x12,0x45,0xf6,0x12,0x4, 0x96,0xda,0x3b,0x22,0xb, 0x38,0xe0, +0x4d,0xe2,0x1b,0x38,0xe0,0x7e,0xe5,0x31,0xb, 0xe4,0x22,0x7e,0xe5,0x31,0x3e,0xe4, +0x49,0x3e,0x6e,0xc2,0x7a,0x35,0x33,0x7f,0x3, 0x2e,0x15,0x31,0x7e,0xb, 0x50,0x19, +0x53,0x1, 0x94,0x7d,0x53,0x5e,0x54,0x0, 0xf, 0x7e,0x24,0x0, 0x1, 0x22,0x9e,0x35, +0x2a,0xbe,0x34,0x0, 0x0, 0x22,0x9e,0x45,0x2a,0xbe,0x44,0x0, 0x0, 0x22,0x7c,0xba, +0x54,0xf0,0xc4,0x54,0xf, 0x22,0x7d,0x37,0x7e,0x8, 0x65,0x66,0x7e,0x24,0x0, 0x8d, +0x22,0x7e,0xf1,0x37,0x74,0xb5,0xac,0xfb,0x2e,0x74,0x1, 0x0, 0x22,0x7d,0x54,0xb, +0x44,0x7f,0x13,0x2d,0x35,0x7e,0x1b,0x70,0x22,0x2e,0x24,0x4e,0xa8,0x7e,0x29,0x70, +0x5c,0x7b,0x7a,0x29,0x70,0x22,0x2e,0x24,0x4e,0xa8,0x7e,0x29,0x70,0x4c,0x76,0x7a, +0x29,0x70,0xb, 0x64,0x22,0x7f,0x13,0x2d,0x34,0x7e,0x1b,0xa0,0x7c,0xba,0x54,0xf, +0x3e,0xb0,0x3e,0xb0,0x22,0xa, 0x25,0x2d,0x21,0x7d,0x13,0x1e,0x14,0x3e,0x14,0x59, +0x21,0x65,0x66,0xb, 0x35,0x7a,0x35,0x31,0xbe,0x34,0x1, 0x1a,0x22,0x7e,0xb3,0x74, +0x7e,0x7c,0xab,0x6c,0x77,0xbc,0xa7,0x78,0x2b,0x12,0x47,0xbd,0x12,0x41,0x5f,0x12, +0x46,0xf4,0x59,0x2, 0x74,0x94,0x7e,0x8, 0x14,0x30,0x59,0x12,0x74,0x9e,0x59,0x2, +0x74,0x9c,0x7e,0x8, 0x18,0x3c,0x59,0x12,0x74,0xa2,0x59,0x2, 0x74,0xa0,0x7e,0x8, +0x1c,0x48,0x80,0x4e,0x7e,0x50,0x4, 0xac,0x5a,0xa, 0x17,0x2d,0x21,0x2e,0x24,0x24, +0x46,0x12,0xc5,0x13,0x7c,0x6b,0x7e,0xb3,0x77,0xe1,0xa, 0xb, 0x12,0x41,0x5f,0x12, +0x46,0xf4,0x59,0x2, 0x74,0x94,0xa, 0x6, 0x7e,0x14,0xc, 0x24,0xad,0x10,0x7d,0xf1, +0x2e,0xf4,0x2a,0x0, 0x6d,0xee,0x59,0xf2,0x74,0x9e,0x59,0xe2,0x74,0x9c,0x7d,0xf1, +0x2e,0xf4,0x2e,0xc, 0x59,0xf2,0x74,0xa2,0x59,0xe2,0x74,0xa0,0x2e,0x14,0x32,0x18, +0x6d,0x0, 0x59,0x12,0x74,0xa6,0x59,0x2, 0x74,0xa4,0xb, 0x70,0xbe,0x70,0x3, 0x50, +0x2, 0xc1,0x65,0x22,0x2e,0x14,0x4e,0xa8,0x6d,0x0, 0x7e,0x50,0x26,0xac,0x57,0x59, +0x12,0x74,0x92,0x59,0x2, 0x74,0x90,0x7e,0x8, 0x57,0x98,0x59,0x12,0x74,0x9a,0x59, +0x2, 0x74,0x98,0x7e,0x8, 0x55,0x5c,0x59,0x12,0x74,0x96,0x22,0x12,0xe6,0xa5,0x12, +0x47,0xbd,0x12,0x41,0x5f,0x7d,0x21,0x2e,0x24,0x4e,0xa8,0x7a,0x27,0x4a,0x6f,0x6d, +0x22,0x7a,0x27,0x4a,0x61,0x7e,0x24,0x6e,0xc2,0x7a,0x27,0x4a,0x6b,0x7e,0x24,0x0, +0x27,0xca,0x29,0x12,0xe5,0x39,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, 0x2, 0xca, +0x39,0x7e,0x63,0x77,0xe1,0xac,0x67,0x2e,0x34,0x29,0x82,0x6d,0x22,0x7e,0x8, 0x76, +0xa5,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0xa3,0x77,0xe1,0x74,0xa, 0xa4,0x49,0x35,0x29, +0x8e,0x7a,0x37,0x76,0xb2,0x7e,0xb3,0x77,0xe1,0x12,0xd8,0x75,0x7e,0xb3,0x77,0xe1, +0x12,0xd8,0x46,0x7e,0xb3,0x77,0xe1,0x12,0x58,0x67,0x12,0x47,0xc8,0x9, 0x75,0x29, +0xb2,0x7a,0x73,0x76,0x9c,0x12,0x47,0xc8,0x9, 0x75,0x29,0xb3,0x7a,0x73,0x76,0x9d, +0x12,0x47,0xc8,0x9, 0x75,0x29,0xb4,0x7a,0x73,0x76,0x9e,0x7e,0x73,0x77,0xe1,0x7a, +0x73,0x76,0xac,0x2, 0x47,0xb6,0xe5,0x1e,0x7a,0xb3,0x76,0x88,0x22,0x7e,0x63,0x77, +0xe1,0xa, 0x6, 0x22,0x7e,0x8, 0x0, 0x70,0x7e,0xa3,0x77,0xe1,0x74,0x3, 0xa4,0x22, +0x7e,0x24,0x0, 0x12,0x2, 0x3, 0xfa,0x7e,0x24,0x0, 0x12,0x2, 0x4, 0x96,0xe4,0x7a, +0xb3,0x77,0xe6,0x2, 0x47,0xe6,0x6d,0x33,0x7a,0x37,0x29,0xfd,0x22,0x7e,0xb3,0x76, +0xaa,0xbe,0xb0,0x1, 0x22,0xb, 0x28,0x30,0x4d,0x31,0x1b,0x28,0x30,0x22,0x7c,0x6b, +0xa5,0xbe,0xfa,0x4, 0x7a,0x73,0x4a,0x66,0xa5,0xbe,0x0, 0x7, 0x7c,0xb7,0x12,0x70, +0x1b,0x61,0xea,0xa5,0xbe,0xf, 0xd, 0x74,0x1, 0x7a,0xb3,0x76,0x8b,0x7a,0xb3,0x76, +0x8c,0xd2,0x22,0x22,0xa5,0xbe,0x2e,0xd, 0x74,0x1, 0x7a,0xb3,0x76,0xaa,0x7a,0xb3, +0x76,0xab,0xd2,0x22,0x22,0xa5,0xbe,0x12,0x5, 0x7a,0x73,0x76,0x8e,0x22,0xa5,0xbe, +0x11,0x25,0xa5,0xbf,0x1, 0x16,0x7e,0xb3,0x76,0x8d,0x60,0x2, 0x81,0x9, 0x74,0x1, +0x7a,0xb3,0x76,0x8d,0xe4,0x7a,0xb3,0x76,0x8f,0x2, 0x52,0x91,0xa5,0xbf,0x0, 0x2, +0x80,0x2, 0x81,0x9, 0x2, 0xe6,0xa5,0xbe,0x60,0x99,0x68,0x4, 0xa5,0xbe,0x9a,0x1d, +0x7e,0xa3,0x4a,0x67,0x7c,0xba,0x4, 0x7a,0xb3,0x4a,0x67,0xa, 0x2a,0x19,0x72,0x4e, +0x85,0xa5,0xbe,0x9a,0x2, 0x80,0x2, 0x81,0x9, 0x75,0x1a,0x99,0x22,0xa5,0xbe,0x9b, +0x9, 0x7a,0x73,0x4a,0x67,0x7a,0x73,0x4a,0x65,0x22,0xa5,0xbe,0x1, 0x11,0x6d,0x22, +0x7a,0x27,0x4a,0x63,0x7a,0x73,0x76,0x7d,0x7c,0xb7,0x12,0x66,0xf, 0x61,0xea,0xbe, +0x60,0x5b,0x28,0x2, 0x41,0xe3,0xa5,0xbe,0x30,0x11,0x7e,0x53,0x76,0xac,0xbc,0x57, +0x78,0x2, 0x81,0x9, 0xbe,0x70,0x4, 0x40,0x2, 0x81,0x9, 0xbe,0x60,0x20,0x40,0xc, +0xbe,0x60,0x22,0x38,0x7, 0xbe,0x70,0x3, 0x28,0x2, 0x81,0x9, 0x7c,0xb6,0x24,0xf9, +0xbe,0xb0,0x29,0x40,0x2, 0x21,0x6a,0x7e,0xa0,0x3, 0xa4,0x90,0x48,0xef,0x73,0x2, +0x4c,0x9, 0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x4c,0x9, 0x2, 0x4c, +0x9, 0x2, 0x4c,0x9, 0x2, 0x4c,0x9, 0x2, 0x49,0x6a,0x2, 0x4c,0x9, 0x2, 0x49,0x6a, +0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, +0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49, +0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a, +0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, +0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x49,0x6a,0x2, 0x4c,0x9, 0x2, 0x4c, +0x9, 0x2, 0x4c,0x9, 0x2, 0x49,0x6a,0x2, 0x4c,0x9, 0xa, 0x26,0x19,0x72,0x76,0x7c, +0x7c,0xb6,0x1b,0xb2,0xbe,0xb0,0x34,0x40,0x2, 0x41,0xa5,0x7e,0xa0,0x3, 0xa4,0x90, +0x49,0x83,0x73,0x2, 0x4a,0x1f,0x2, 0x4a,0xa5,0x2, 0x4a,0x1f,0x2, 0x4a,0xa5,0x2, +0x4a,0x23,0x2, 0x4a,0x1f,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a, +0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5, +0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, +0x4a,0xa5,0x2, 0x4a,0x6b,0x2, 0x4a,0xa5,0x2, 0x4a,0x78,0x2, 0x4a,0xa5,0x2, 0x4a, +0x8b,0x2, 0x4a,0x1f,0x2, 0x4a,0x1f,0x2, 0x4a,0x28,0x2, 0x4a,0x28,0x2, 0x4a,0x28, +0x2, 0x4a,0xa5,0x2, 0x4a,0x9a,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, +0x4a,0x31,0x2, 0x4a,0x31,0x2, 0x4a,0x31,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a, +0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0x1f,0x2, 0x4a,0x3a,0x2, 0x4a,0x43, +0x2, 0x4a,0x4c,0x2, 0x4a,0x55,0x2, 0x4a,0xa5,0x2, 0x4a,0xa5,0x2, 0x4a,0x5e,0xd2, +0x22,0x41,0xa5,0x12,0x0, 0xfd,0x80,0x7d,0x7e,0x27,0x4a,0x6d,0x4e,0x40,0x20,0x80, +0x34,0x7e,0x27,0x4a,0x6d,0x4e,0x40,0x1, 0x80,0x2b,0x7e,0x27,0x4a,0x6d,0x4e,0x50, +0x1, 0x80,0x22,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x2, 0x80,0x19,0x7e,0x27,0x4a,0x6d, +0x4e,0x50,0x4, 0x80,0x10,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x8, 0x80,0x7, 0x7e,0x27, +0x4a,0x6d,0x4e,0x50,0x10,0x7a,0x27,0x4a,0x6d,0x80,0x3a,0x7e,0x53,0x76,0x94,0x12, +0x4c,0xa, 0x7a,0x27,0x4a,0x61,0x80,0x2d,0x7e,0x53,0x76,0x96,0x12,0x4c,0xa, 0x3e, +0x24,0x7a,0x27,0x4e,0x7d,0x7a,0x27,0x4a,0x69,0x80,0x1a,0x7e,0x53,0x76,0x98,0x12, +0x4c,0xa, 0x3e,0x24,0x7a,0x27,0x4a,0x63,0x80,0xb, 0x7e,0x53,0x76,0x9f,0x12,0x4c, +0xa, 0x7a,0x53,0x77,0xd6,0xbe,0x60,0x38,0x40,0x14,0xbe,0x60,0x56,0x38,0xf, 0xa, +0x26,0x5e,0x24,0x0, 0x1, 0xbe,0x24,0x0, 0x1, 0x78,0x3, 0x12,0xe5,0xe6,0xbe,0x60, +0x58,0x40,0xb, 0x7e,0x27,0x4a,0x6d,0x4e,0x40,0x2, 0x7a,0x27,0x4a,0x6d,0xa5,0xbe, +0xa, 0x2, 0x80,0x2, 0x61,0xea,0x7e,0x37,0x4a,0x6d,0x4e,0x60,0x4, 0x7a,0x37,0x4a, +0x6d,0x61,0xea,0xbe,0x60,0x6c,0x68,0x4, 0xa5,0xbe,0x6d,0x2b,0x7e,0x27,0x4a,0x6d, +0x4e,0x50,0x80,0x7a,0x27,0x4a,0x6d,0x7e,0x27,0x4a,0x69,0x7d,0x12,0xb, 0x14,0x7a, +0x17,0x4a,0x69,0x2e,0x27,0x4a,0x6b,0x7a,0x29,0x70,0xa5,0xbe,0x6d,0x2, 0x80,0x2, +0x61,0xea,0x75,0x1a,0x6c,0x61,0xea,0xbe,0x60,0x6e,0x68,0x4, 0xa5,0xbe,0x6f,0x43, +0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x40,0x7a,0x27,0x4a,0x6d,0x7e,0x43,0x76,0x94,0x6c, +0x55,0x7e,0xb3,0x76,0x95,0xa, 0x1b,0x2d,0x12,0x4, 0x7a,0xb3,0x76,0x95,0x70,0x9, +0x7e,0xb3,0x76,0x94,0x4, 0x7a,0xb3,0x76,0x94,0x7a,0x17,0x4a,0x61,0x7e,0x27,0x4a, +0x6f,0x2d,0x21,0x7a,0x29,0x70,0xa5,0xbe,0x6f,0x2, 0x80,0x2, 0x61,0xea,0x75,0x1a, +0x6e,0x61,0xea,0xbe,0x60,0x70,0x40,0xc, 0xbe,0x60,0x7f,0x38,0x7, 0x7c,0xb6,0x12, +0x60,0x17,0x80,0x76,0xa5,0xbe,0x86,0xf, 0x7c,0xb7,0x54,0x7, 0x7a,0xb3,0x4a,0x68, +0x53,0xc3,0xf8,0x42,0xc3,0x80,0x63,0xa5,0xbe,0x87,0xf, 0x7c,0xb7,0x54,0x3, 0x7a, +0xb3,0x4a,0x60,0x53,0xc2,0xfc,0x42,0xc2,0x80,0x50,0xa5,0xbe,0x88,0x29,0x5e,0x70, +0x7, 0x7e,0xf, 0x78,0x39,0x2e,0x14,0x0, 0x10,0xb, 0xa, 0x20,0x5e,0x40,0xc7,0x1b, +0xa, 0x20,0xa, 0x37,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x12,0x4c,0x18,0x12,0x4c,0xff, +0x4d,0x32,0x1b,0xa, 0x30,0x80,0x23,0xa5,0xbe,0xf6,0x13,0x7a,0x73,0x78,0x2f,0xa5, +0xbf,0x0, 0x3, 0xe4,0x80,0x2, 0x74,0x1, 0x7a,0xb3,0x78,0x30,0x80,0xc, 0xa5,0xbe, +0xf7,0x8, 0x74,0x64,0xac,0xb7,0x7a,0x57,0x78,0x31,0x30,0x22,0xa, 0x7e,0xb3,0x76, +0x8a,0x44,0x1, 0x7a,0xb3,0x76,0x8a,0x7e,0x37,0x4a,0x6d,0x4d,0x33,0x68,0xa, 0x7e, +0xb3,0x76,0x8a,0x44,0x2, 0x7a,0xb3,0x76,0x8a,0x22,0x7c,0x25,0x6c,0x33,0xa, 0x27, +0x2d,0x21,0x22,0xb, 0x18,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0x7e, +0x34,0x76,0xa, 0x30,0x23,0x60,0xc2,0x23,0x7e,0x39,0x50,0xa, 0x25,0x12,0x4c,0x16, +0x3e,0x24,0x7a,0x27,0x6e,0x8b,0x9, 0x53,0x0, 0x1, 0xa, 0x25,0x12,0x4c,0x16,0x3e, +0x24,0x7a,0x27,0x6e,0x8d,0x7e,0xb3,0x76,0x8, 0xb4,0x3, 0x15,0x9, 0xa3,0x0, 0x3, +0xa, 0x2a,0x12,0x4c,0x16,0x3e,0x24,0x7a,0x27,0x6e,0x93,0x19,0xa3,0x0, 0x2, 0x80, +0x16,0xb4,0x2, 0x13,0x9, 0x53,0x0, 0x2, 0xa, 0x15,0x12,0x4f,0xef,0x3e,0x14,0x7a, +0x17,0x6e,0x93,0x19,0x53,0x0, 0x3, 0x9, 0x73,0x0, 0x5, 0x12,0x33,0xd0,0x3e,0x34, +0x3e,0x34,0x7a,0x37,0x6e,0x9b,0x7e,0x37,0x6e,0x8b,0x7a,0x37,0x76,0x7a,0x4d,0x33, +0x78,0xb, 0x7e,0x34,0x21,0x5b,0x12,0x29,0xdb,0x7a,0x37,0x76,0x7a,0x22,0x7c,0x67, +0x7c,0x7b,0xa5,0xbf,0x0, 0xd, 0xbe,0x60,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0x6e,0x83, +0x2, 0xb9,0x98,0xa5,0xbe,0x0, 0x17,0x6c,0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50, +0x9, 0xac,0x5a,0x19,0x62,0x6d,0xcc,0xb, 0xa0,0x12,0x4c,0xf7,0x38,0xed,0x6c,0xaa, +0x80,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x6d,0x14,0x12,0x4c,0x13,0x1b,0x18, +0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14,0x6d,0x16,0x12,0x4c,0x13,0x1b,0x18,0x20, +0xb, 0xa0,0xbc,0x7a,0x38,0xdc,0x22,0x90,0x21,0x51,0xe4,0x93,0xbc,0xba,0x22,0x7e, +0xf, 0x78,0x39,0x2e,0x14,0x0, 0x10,0xb, 0xa, 0x30,0x22,0x30,0x0, 0x5, 0x43,0xc3, +0x80,0x80,0x3, 0x53,0xc3,0x7f,0x30,0x0, 0x5, 0x43,0xc2,0x80,0x80,0x3, 0x53,0xc2, +0x7f,0x7e,0xf, 0x78,0x39,0x30,0x0, 0x8, 0x12,0x4d,0x3, 0x4e,0x60,0xc4,0x80,0x6, +0x12,0x4d,0x3, 0x5e,0x60,0x3b,0x1b,0xa, 0x30,0x22,0x12,0x4e,0x57,0x12,0x4f,0xc4, +0x12,0x4d,0xa5,0x12,0x4d,0x5e,0xa9,0xd6,0xeb,0x74,0x1, 0x7e,0x70,0x82,0x12,0x4d, +0xc1,0xa9,0xc6,0xeb,0xd2,0x0, 0x12,0x4d,0x5e,0xd2,0x0, 0x2, 0x4d,0xb, 0xa9,0xd0, +0xce,0x30,0x0, 0x4, 0xa9,0xd5,0xc9,0x22,0xa9,0xc5,0xc9,0x22,0x12,0x4e,0x92,0x40, +0x6, 0x12,0x4e,0x87,0x12,0x0, 0x12,0x12,0x4d,0xa5,0x12,0x4d,0xad,0x80,0xb, 0x7e, +0xb3,0x76,0x5a,0x60,0x2, 0x80,0x0, 0x12,0x4e,0x38,0x30,0x14,0xf2,0x7e,0xb3,0x77, +0xdd,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a,0xb3,0x77,0xdd,0xd2,0x0, 0x12,0x4d,0xad, +0xd2,0x0, 0x2, 0x4d,0xb, 0xc2,0x0, 0x12,0x4d,0xb, 0xc2,0x0, 0x22,0xa2,0x0, 0xa9, +0x92,0xcb,0xa2,0x0, 0xa9,0x92,0xca,0xa2,0x0, 0xa9,0x91,0xcb,0x22,0xe4,0x7e,0x70, +0xff,0x7c,0x6b,0x7e,0xb3,0x77,0xd7,0xb4,0x81,0x68,0xa5,0xbe,0x0, 0x2, 0x80,0x5c, +0xa5,0xbe,0x1, 0x22,0xc2,0xaf,0xa, 0x27,0x5e,0x24,0x0, 0x2, 0x68,0x2, 0xd2,0x95, +0x7a,0x71,0xcd,0xa9,0xd0,0xce,0xa9,0xc6,0xc9,0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9, +0xd1,0x87,0xd2,0xaf,0x80,0x36,0xa5,0xbe,0x2, 0x18,0x12,0x4e,0x7d,0x70,0xf, 0xa9, +0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd0,0xce,0xa9,0xd6,0xc9,0xa9,0xd1,0x87,0xd2,0xaf, +0x80,0x1a,0xa5,0xbe,0x3, 0x1c,0x12,0x4e,0x7d,0x70,0xf, 0xa9,0xd0,0xce,0xa9,0xd7, +0xc9,0xa9,0xd0,0xce,0xa9,0xc6,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe4,0x7a,0xb3,0x77,0xd7,0x22,0x80,0xe, 0x12,0x4e,0x57,0x12,0x4e,0x92, +0x40,0x14,0x20,0x14,0x11,0x12,0x4d,0xbd,0x12,0x4e,0x82,0x70,0xed,0x12,0x4e,0x57, +0x12,0x4f,0xcf,0x2, 0x4d,0xc1,0x22,0x74,0x81,0x7a,0xb3,0x77,0xd7,0x22,0x80,0xe, +0x12,0x4e,0x57,0x12,0x4e,0x92,0x40,0x14,0x20,0x14,0x11,0x12,0x4d,0xbd,0x12,0x4e, +0x82,0x70,0xed,0x12,0x4e,0x57,0x12,0x4f,0xcf,0x2, 0x4d,0xc1,0x22,0xc2,0xaf,0x7a, +0x71,0xcd,0xa2,0x93,0xe4,0x33,0x22,0x80,0x3, 0x12,0x4e,0x5e,0x12,0x4e,0x92,0x50, +0xf8,0x22,0x30,0xb, 0x3, 0x12,0x3e,0xe7,0x7e,0xb3,0x77,0x0, 0x70,0x6, 0x7e,0xb3, +0x77,0x1, 0x60,0x2, 0xd3,0x22,0xc3,0x22,0x20,0x14,0x6, 0x12,0x4f,0xbb,0x12,0x0, +0x12,0x30,0x1c,0x3, 0x12,0x37,0x94,0x12,0x4e,0x92,0x40,0x6, 0x12,0x4e,0x87,0x2, +0x0, 0x12,0x22,0x30,0x22,0x76,0xc2,0x22,0x12,0x29,0x8c,0xd2,0x4, 0x12,0x36,0xe7, +0x7e,0x73,0x76,0xac,0xbe,0x73,0x77,0xe1,0x68,0x7, 0x7a,0x73,0x77,0xe1,0x12,0x28, +0x87,0x7e,0xb3,0x76,0x9a,0xbe,0xb3,0x6e,0xb3,0x68,0x14,0x54,0x5, 0x7a,0xb3,0x76, +0x9a,0x7e,0x73,0x76,0x9a,0x7a,0x73,0x6e,0xb3,0x12,0x4f,0xdb,0x12,0x65,0x51,0x7e, +0xb3,0x76,0x9b,0xbe,0xb3,0x6e,0xb4,0x68,0x14,0x54,0x5, 0x7a,0xb3,0x76,0x9b,0x7e, +0x73,0x76,0x9b,0x7a,0x73,0x6e,0xb4,0x12,0x4f,0xdb,0x12,0x65,0x51,0x7e,0xb3,0x76, +0x8a,0x54,0xfe,0x7a,0xb3,0x76,0x8a,0x7e,0xb3,0x76,0x8b,0x60,0x3, 0x12,0x60,0x35, +0x7e,0xb3,0x76,0xaa,0x60,0x3, 0x12,0x3f,0xf8,0x12,0x37,0x94,0x7e,0x37,0x4a,0x6d, +0x4d,0x33,0x68,0x15,0xd2,0x4, 0x12,0x36,0xe7,0x12,0x30,0x10,0x7e,0xb3,0x76,0x8a, +0x54,0xfd,0x7a,0xb3,0x76,0x8a,0x2, 0x37,0x94,0x22,0x12,0xd7,0x16,0xe5,0x1e,0x70, +0x5, 0x12,0x4d,0x6c,0x80,0x3, 0x12,0x4e,0xa8,0x2, 0x4f,0x6c,0x6c,0x77,0x7e,0x30, +0x3b,0x7e,0xa0,0x3c,0x7e,0xb3,0x76,0x2f,0xb4,0x1, 0xf, 0xe5,0x1e,0x60,0xb, 0x7e, +0x23,0x29,0xff,0xbc,0x27,0x78,0x3, 0x12,0xd7,0xf6,0x7e,0xb3,0x76,0x2f,0xb4,0x1, +0x29,0xe5,0x1e,0x60,0x25,0x7e,0xb3,0x29,0xff,0xbc,0xb3,0x78,0x3, 0x12,0xd7,0xd9, +0x7e,0xb3,0x29,0xff,0x7a,0xb3,0x29,0xfc,0x4, 0x7a,0xb3,0x29,0xff,0x7e,0x73,0x29, +0xff,0xbc,0x7a,0x28,0x5, 0xe4,0x7a,0xb3,0x29,0xff,0x22,0x80,0x3, 0x12,0x4e,0x5e, +0x30,0x14,0xfa,0x22,0xd2,0x4, 0x12,0x36,0xe7,0x12,0x4e,0x82,0x70,0xfb,0x22,0xa9, +0xd5,0xea,0xa9,0xc5,0xea,0x74,0x2, 0x7e,0x70,0x7, 0x22,0x7e,0xb3,0x6e,0xb3,0x7e, +0x73,0x6e,0xb4,0x12,0x88,0xe5,0x7e,0xb3,0x6e,0xb3,0x7e,0x73,0x6e,0xb4,0x22,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x22,0xca,0xf8,0x7e,0x14,0x0, 0x1e,0x7e,0x4, +0x0, 0xff,0x69,0x30,0x0, 0x1, 0x7e,0xb, 0x50,0x7a,0x37,0x62,0xb9,0x7a,0x53,0x62, +0xb8,0xc2,0x0, 0x6d,0xcc,0x7e,0xb4,0xff,0xff,0x20,0x21,0x2, 0x21,0x35,0x7e,0xd4, +0x4, 0xc, 0xca,0xd9,0x12,0x51,0x59,0x12,0x24,0xf, 0x1b,0xfd,0x6d,0xaa,0x7d,0xda, +0x80,0x26,0x7d,0x2d,0x3e,0x24,0x49,0x12,0x46,0x54,0xbe,0x14,0x0, 0x0, 0x8, 0x6, +0x49,0x32,0x46,0x54,0x80,0x4, 0x6d,0x33,0x9d,0x31,0x59,0x32,0x46,0x54,0xbd,0x3c, +0x28,0x4, 0x7d,0xc3,0x7d,0xbd,0xb, 0xd4,0x7e,0x37,0x73,0x21,0xbd,0x3d,0x38,0xd2, +0x7e,0x37,0x4e,0x95,0xbd,0x3c,0x50,0x4, 0x7a,0xc7,0x4e,0x95,0x7e,0x37,0x4e,0x8b, +0xbd,0x3c,0x50,0x10,0xbe,0xb4,0xff,0xff,0x68,0xa, 0x7e,0x37,0x4e,0x93,0xb, 0x34, +0x7a,0x37,0x4e,0x93,0x7e,0x73,0x6e,0xb0,0xa, 0x27,0x7d,0x3b,0x8d,0x32,0x7c,0xf5, +0xbe,0xf0,0x0, 0x40,0x7, 0xbe,0xf0,0x1d,0x38,0x2, 0xd2,0x0, 0x7d,0xda,0x7d,0x3d, +0x3e,0x34,0x49,0x23,0x4e,0x85,0xbd,0x2c,0x50,0x51,0xbe,0xb4,0xff,0xff,0x68,0x4b, +0x9, 0xbd,0x4e,0x97,0xb4,0x1, 0x25,0x49,0x23,0x4e,0xa0,0xbd,0x2b,0x78,0x10,0x7d, +0xa3,0x2e,0xa4,0x4e,0x9a,0xb, 0xa8,0x20,0xb, 0x24,0x1b,0xa8,0x20,0x80,0x32,0x4d, +0xdd,0x78,0x14,0x30,0x0, 0x25,0x80,0xf, 0x80,0x21,0x80,0xb, 0x4d,0xdd,0x78,0x7, +0x30,0x0, 0x18,0x80,0x2, 0x80,0x14,0x59,0xb3,0x4e,0xa0,0x7e,0x24,0x0, 0x1, 0x59, +0x23,0x4e,0x9a,0x74,0x1, 0x19,0xbd,0x4e,0x97,0x80,0x6, 0x74,0x1, 0x19,0xbd,0x62, +0xb8,0x49,0xa3,0x4e,0x8d,0x49,0x23,0x4e,0x9a,0xbd,0x2a,0x28,0x4, 0x59,0x23,0x4e, +0x8d,0x9, 0xbd,0x62,0xb8,0xb4,0x1, 0x11,0x6d,0x22,0x59,0x23,0x4e,0xa0,0x6d,0xaa, +0x59,0xa3,0x4e,0x9a,0xe4,0x19,0xbd,0x4e,0x97,0xb, 0xd4,0xbe,0xd4,0x0, 0x3, 0x68, +0x2, 0x1, 0x9e,0x80,0x1a,0x7e,0x8, 0x4e,0x97,0x7e,0x34,0x0, 0x3, 0xe4,0x12,0x24, +0x34,0x7e,0x8, 0x4e,0x9a,0x12,0x51,0x52,0x7e,0x8, 0x4e,0xa0,0x12,0x51,0x52,0xda, +0xf8,0x22,0x7e,0x34,0x0, 0x6, 0x2, 0x24,0x34,0x7e,0x1f,0x24,0x68,0x7e,0x8, 0x46, +0x54,0x22,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x51,0x59,0x12,0x24,0xf, 0x1b,0xfd, +0x6d,0x33,0x7d,0x13,0x3e,0x14,0x49,0x1, 0x46,0x54,0xbe,0x4, 0x0, 0x0, 0x8, 0x6, +0x49,0x21,0x46,0x54,0x80,0x4, 0x6d,0x22,0x9d,0x20,0x59,0x21,0x46,0x54,0x49,0x1, +0x42,0x48,0xbd,0x20,0x28,0x4, 0x59,0x21,0x42,0x48,0xb, 0x34,0xbe,0x34,0x2, 0x6, +0x40,0xd0,0x22,0x7e,0x37,0x4e,0xa6,0x7a,0x73,0x76,0x90,0x7e,0xb3,0x76,0x8d,0xb4, +0x1, 0x2, 0x80,0x2, 0x41,0x7e,0x12,0x52,0x91,0x7e,0xa7,0x4e,0xa6,0xbe,0xa4,0x0, +0x5, 0x38,0x30,0x6d,0xdd,0x7a,0xd7,0x4e,0x95,0x7a,0xd7,0x4e,0x93,0x7e,0x8, 0x4e, +0x8d,0x7e,0x34,0x0, 0x6, 0xe4,0x12,0x24,0x34,0x7e,0x34,0x4, 0xc, 0x7d,0x1d,0xad, +0x13,0x2e,0x14,0x42,0x48,0x6d,0x0, 0xe4,0x12,0x24,0x34,0xb, 0xd4,0xbe,0xd4,0x0, +0x2, 0x78,0xe6,0x7e,0xa7,0x4e,0xa6,0xb, 0xa4,0x7a,0xa7,0x4e,0xa6,0xbe,0xa4,0x0, +0x5, 0x28,0x5, 0xd2,0x21,0x12,0x51,0x62,0x7e,0x73,0x76,0x8e,0xa, 0xa7,0x3e,0xa4, +0x3e,0xa4,0x2e,0xa4,0x0, 0x5, 0xbe,0xa7,0x4e,0xa6,0x78,0x74,0x6d,0xdd,0x4d,0xdd, +0x78,0x4, 0x6d,0xbb,0x80,0xa, 0x7d,0x3d,0x1b,0x34,0x3e,0x34,0x49,0xb3,0x42,0x48, +0xbe,0xd4,0x2, 0x6, 0x78,0x4, 0x6d,0xcc,0x80,0x8, 0x7d,0xcd,0x3e,0xc4,0x49,0xcc, +0x42,0x4a,0x7d,0x3b,0x2d,0x3c,0x7e,0x24,0x0, 0xa, 0x8d,0x32,0x7d,0x3d,0x3e,0x34, +0x2e,0x34,0x42,0x48,0xb, 0x38,0xa0,0x2d,0xa2,0x1b,0x38,0xa0,0xb, 0xd4,0xbe,0xd4, +0x2, 0x6, 0x78,0xba,0xc2,0x21,0xe4,0x7a,0xb3,0x76,0x8d,0x6d,0xaa,0x7a,0xa7,0x4a, +0x63,0x7e,0x34,0x42,0x48,0x7a,0x37,0x4e,0x7f,0x7a,0xa7,0x4e,0xa6,0x22,0xc2,0x21, +0x7e,0xa7,0x4e,0xa6,0x4d,0xaa,0x68,0x8, 0x6d,0xaa,0x7a,0xa7,0x4e,0xa6,0xd2,0x10, +0x22,0x7e,0xb3,0x76,0x7c,0x44,0x80,0x7a,0xb3,0x76,0x7c,0x22,0xe4,0x7a,0xb3,0x76, +0x2f,0x6d,0x33,0x7a,0x37,0x4e,0x7d,0x12,0x66,0x8f,0x12,0x53,0x1, 0x12,0x66,0xc5, +0xc2,0x1, 0x12,0x28,0x8c,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x7e,0x1f,0x24,0x64,0x7e, +0xf, 0x24,0x68,0x12,0x24,0xf, 0x1b,0xfd,0x12,0x37,0x94,0x2, 0x52,0xce,0x7e,0x8, +0x74,0xfc,0x7e,0x34,0x0, 0xa, 0xe4,0x2, 0x24,0x34,0xe4,0x7a,0xb3,0x76,0x2f,0x74, +0x1, 0x7a,0xb3,0x77,0xe1,0x7a,0xb3,0x73,0x1e,0x12,0x6b,0x71,0x12,0x53,0x1, 0x12, +0x3c,0x27,0x12,0x47,0x1c,0x12,0x2f,0xf0,0x12,0xb4,0xd2,0x12,0x52,0xce,0x2, 0x28, +0x77,0x7e,0x8, 0x76,0xdc,0x7e,0x34,0x0, 0x20,0xe4,0x12,0x24,0x34,0x7e,0x34,0x0, +0x1, 0x7a,0x37,0x76,0xdc,0x7a,0xb3,0x76,0xde,0x74,0x1, 0x7a,0xb3,0x76,0xdf,0xe4, +0x7a,0xb3,0x76,0xe0,0x7e,0xb3,0x77,0xd9,0xb4,0x1, 0x31,0x7e,0x34,0x0, 0x2, 0x12, +0x53,0x9b,0x12,0x53,0x7f,0x7a,0x73,0x76,0xe9,0x74,0x1, 0x7a,0xb3,0x76,0xea,0xe4, +0x7a,0xb3,0x76,0xeb,0x7e,0x34,0x0, 0x2, 0x12,0x53,0x88,0x12,0x53,0x7f,0x7a,0x73, +0x76,0xf1,0x7a,0xb3,0x76,0xf2,0x7a,0xb3,0x76,0xf3,0x80,0xa, 0x7e,0x34,0x0, 0x1, +0x12,0x53,0x9b,0x12,0x53,0x88,0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x76,0xf4,0x74,0x1, +0x7a,0xb3,0x76,0xf6,0x7a,0xb3,0x76,0xf7,0x74,0x2, 0x7a,0xb3,0x76,0xf8,0x22,0x7e, +0x73,0x77,0xd8,0x1e,0x34,0xb, 0x34,0x22,0x7a,0x37,0x76,0xec,0x74,0x1, 0x7a,0xb3, +0x76,0xee,0x7a,0xb3,0x76,0xef,0x7a,0xb3,0x76,0xf0,0x22,0x7a,0x37,0x76,0xe4,0x74, +0x1, 0x7a,0xb3,0x76,0xe6,0x7a,0xb3,0x76,0xe7,0xe4,0x7a,0xb3,0x76,0xe8,0x22,0x7e, +0x34,0x0, 0x27,0xca,0x39,0x7e,0x34,0x20,0xb4,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x28, +0xe6,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, 0x27,0xca,0x39,0x7e,0x34,0x20,0xdb, +0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x29,0xd, 0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, +0x27,0xca,0x39,0x7e,0x34,0x21,0x2, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x29,0x34,0x12, +0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, 0x27,0xca,0x39,0x7e,0x34,0x21,0x29,0x7e,0x24, +0x0, 0xff,0x7e,0x8, 0x29,0x5b,0x12,0x24,0xf, 0x1b,0xfd,0x6c,0x88,0x7c,0xb8,0x12, +0x89,0x3a,0xb, 0x80,0xbe,0x80,0x4, 0x40,0xf4,0x2, 0x53,0x1, 0x12,0x87,0xd7,0x12, +0x65,0xcc,0x12,0x88,0x5e,0x12,0x53,0xaf,0x12,0x88,0xa4,0x12,0x29,0xe3,0x12,0x88, +0x85,0x12,0x54,0x8a,0x12,0x54,0xd0,0x12,0x3c,0xc5,0x2, 0x54,0x3d,0xd2,0x1, 0x12, +0x28,0x8c,0x6c,0xaa,0x7e,0x63,0x77,0xe1,0x7e,0x70,0x27,0xac,0x67,0x9, 0x63,0x28, +0xe7,0xa, 0x2a,0x12,0xc5,0xf, 0x7c,0x7b,0xbc,0x67,0x78,0x4, 0x7a,0xa3,0x74,0x7e, +0x7e,0x50,0x26,0xac,0x5a,0x19,0x72,0x74,0x82,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xd4, +0x7e,0x73,0x74,0x7e,0xbe,0x70,0x3, 0x40,0x5, 0xe4,0x7a,0xb3,0x74,0x7e,0x12,0x46, +0x5d,0x7e,0x73,0x74,0x7e,0x7a,0x73,0x75,0x6, 0x22,0x12,0x54,0xc8,0x74,0x9, 0xac, +0x7b,0x7e,0x8, 0x6d,0x14,0x12,0x54,0xc3,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x6d,0xc8, +0x12,0x54,0xc3,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x6d,0x6e,0x74,0xff,0x12,0x24,0x34, +0x7e,0x8, 0x6e,0x22,0x12,0x81,0x73,0x7e,0x8, 0x6e,0x7c,0x7e,0x34,0x0, 0xd, 0xe4, +0x2, 0x24,0x34,0x74,0xff,0x12,0x24,0x34,0x90,0x21,0x51,0xe4,0x93,0x7c,0x7b,0x22, +0x6d,0x33,0x7a,0x37,0x78,0x25,0xe4,0x7a,0xb3,0x78,0x23,0x7a,0xb3,0x78,0x24,0x7a, +0xb3,0x78,0x20,0x2, 0x54,0xe6,0x7a,0xb3,0x78,0x21,0x7a,0xb3,0x78,0x22,0x22,0x7e, +0x37,0x78,0x25,0xbe,0x34,0x0, 0x0, 0x28,0x7, 0x1b,0x34,0x7a,0x37,0x78,0x25,0x22, +0xe4,0x12,0x54,0xe6,0x7a,0xb3,0x78,0x20,0x22,0xca,0xf8,0xc2,0x0, 0xc2,0x1, 0x12, +0x92,0x25,0x68,0x76,0x7e,0xb3,0x76,0x5a,0x70,0x70,0x7e,0xb3,0x6c,0xde,0x70,0x5, +0x12,0x54,0xef,0x80,0x65,0x12,0x55,0x8d,0x92,0x1, 0x12,0xbe,0x41,0x92,0x0, 0x30, +0x0, 0x13,0x7e,0x34,0x22,0x27,0x12,0x29,0xdb,0x7a,0x37,0x78,0x25,0x74,0x1, 0x7a, +0xb3,0x78,0x21,0x80,0x14,0x30,0x1, 0x19,0x7e,0x34,0x22,0x27,0x12,0x29,0xdb,0x7a, +0x37,0x78,0x25,0x74,0x1, 0x7a,0xb3,0x78,0x22,0x74,0x1, 0x7a,0xb3,0x78,0x20,0x80, +0x3, 0x12,0x54,0xef,0x7e,0xb3,0x78,0x21,0x60,0xe, 0x6c,0xff,0x80,0x3, 0x12,0x57, +0x3b,0x12,0x57,0x1b,0x38,0xf8,0x80,0x12,0x7e,0xb3,0x78,0x22,0x60,0xc, 0x6c,0xff, +0x80,0x3, 0x12,0x57,0x3b,0x12,0x57,0x1b,0x38,0xf8,0xda,0xf8,0x22,0xca,0x3b,0x12, +0xda,0x48,0xc2,0x2, 0x7e,0x34,0x22,0x23,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xd0,0x7e, +0x17,0x6c,0xe4,0xbd,0x1d,0x58,0x4, 0x7d,0xd1,0xe, 0xd4,0x6c,0xcc,0xc1,0xf5,0x7e, +0x30,0x2, 0xac,0x3c,0x9, 0xb1,0x6b,0x54,0xf5,0x26,0x9, 0x71,0x6b,0x55,0x7a,0x71, +0x27,0x12,0x57,0x9, 0x7d,0xc3,0xbd,0xdc,0x8, 0x2, 0xc1,0xf3,0xbe,0xe1,0x26,0x38, +0x2, 0xc1,0xf3,0xbe,0xd1,0x27,0x38,0x2, 0xc1,0xf3,0x7d,0x1c,0xe, 0x14,0x7d,0xec, +0xe, 0xe4,0xe, 0xe4,0x2d,0xe1,0x6d,0xff,0x12,0x57,0xcd,0x85,0x27,0x2b,0x80,0x2d, +0x6c,0x99,0x7e,0xf1,0x26,0x80,0x1b,0x7c,0xbf,0x7e,0x71,0x2b,0x12,0x57,0x13,0x18, +0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x57,0x2a,0x80,0x6, 0xe5,0x2a,0xbc,0xbf,0x58,0x7, +0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe0,0x4c,0x99,0x68,0x9, 0x15,0x2b,0xe5,0x2b,0xbe, +0xb0,0x0, 0x58,0xcc,0x12,0x57,0xc2,0x58,0x36,0x85,0x27,0x2b,0x80,0x2a,0x12,0x57, +0xb7,0x80,0x1b,0x7c,0xb8,0x7e,0x71,0x2b,0x12,0x57,0x13,0x18,0x9, 0xbd,0xc0,0x48, +0x5, 0x12,0x57,0x22,0x80,0x6, 0xe5,0x29,0xbc,0xb8,0x28,0x6, 0xb, 0x80,0xbc,0xe8, +0x38,0xe1,0x4c,0x99,0x68,0x9, 0x15,0x2b,0xe5,0x2b,0xbe,0xb0,0x0, 0x58,0xcf,0x12, +0x57,0xcd,0xa, 0x3d,0x1b,0x34,0xe5,0x27,0xa, 0x1b,0xbd,0x13,0x58,0x6a,0x12,0x57, +0x32,0x80,0x2a,0x6c,0x99,0x7e,0xf1,0x26,0x80,0x18,0x7c,0xbf,0x12,0x57,0x10,0x18, +0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x57,0x2a,0x80,0x6, 0xe5,0x2a,0xbc,0xbf,0x58,0x7, +0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe3,0x4c,0x99,0x68,0x7, 0x5, 0x28,0xbe,0xd1,0x28, +0x38,0xd1,0x12,0x57,0xc2,0x58,0x31,0x12,0x57,0x32,0x80,0x27,0x12,0x57,0xb7,0x80, +0x18,0x7c,0xb8,0x12,0x57,0x10,0x18,0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x57,0x22,0x80, +0x6, 0xe5,0x29,0xbc,0xb8,0x28,0x6, 0xb, 0x80,0xbc,0xe8,0x38,0xe4,0x4c,0x99,0x68, +0x7, 0x5, 0x28,0xbe,0xd1,0x28,0x38,0xd4,0x90,0x22,0x22,0xe4,0x93,0xa, 0x1b,0xbd, +0x1f,0x38,0x10,0xd2,0x2, 0xe5,0x26,0x7a,0xb3,0x78,0x23,0xe5,0x27,0x7a,0xb3,0x78, +0x24,0x80,0xc, 0xb, 0xc0,0x7e,0x73,0x6c,0xde,0xbc,0x7c,0x28,0x2, 0xa1,0xaf,0xa2, +0x2, 0xda,0x3b,0x22,0xe5,0x2a,0x7e,0x71,0x2b,0x12,0x57,0xd9,0xb, 0x1a,0x30,0x22, +0x7e,0x71,0x28,0x12,0x57,0x9, 0x7d,0x3, 0xbd,0xe0,0x22,0x7e,0x73,0x6c,0xde,0xbc, +0x7f,0x22,0xb, 0xf4,0xb, 0x90,0x7a,0x81,0x29,0x22,0xb, 0xf4,0xb, 0x90,0x7a,0xf1, +0x2a,0x22,0xe5,0x27,0xa, 0x5b,0xb, 0x54,0xf5,0x28,0x22,0xc2,0x2, 0x7c,0xbf,0x12, +0x57,0x49,0xb, 0xf0,0x22,0xc2,0x2, 0x7c,0xb1,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0x7c, +0xab,0x12,0x6e,0x60,0x30,0x2, 0xf, 0xa, 0x3a,0x2e,0x34,0x6b,0xcc,0x7e,0x39,0xa0, +0x4c,0xba,0x7a,0x39,0xb0,0x22,0x64,0xff,0xa, 0x2a,0x2e,0x24,0x6b,0xcc,0x2, 0x46, +0x1d,0xca,0xd8,0xca,0x79,0x7d,0x43,0x7f,0x70,0x12,0xbe,0x39,0x28,0x33,0x6c,0xff, +0x80,0x2a,0x74,0x2, 0xac,0xbf,0x9, 0xe5,0x6b,0x54,0x9, 0xd5,0x6b,0x55,0x7c,0xbe, +0x7c,0x7d,0x12,0x57,0x9, 0x7d,0xd3,0x7f,0x7, 0x7c,0x7d,0x12,0xbf,0x5f,0x50,0x7, +0xbd,0x4d,0x58,0x6, 0xd3,0x80,0xb, 0xd3,0x80,0x8, 0xb, 0xf0,0x12,0x57,0x1b,0x38, +0xd1,0xc3,0xda,0x79,0xda,0xd8,0x22,0x6c,0x99,0xe5,0x26,0xa, 0x1b,0xb, 0x14,0x7c, +0x83,0x22,0xa, 0x3e,0x1b,0x34,0xe5,0x26,0xa, 0x1b,0xbd,0x13,0x22,0xe5,0x26,0xa, +0x5b,0xb, 0x54,0xf5,0x29,0x85,0x26,0x2a,0x22,0x12,0x57,0xe7,0x7d,0x13,0x3e,0x14, +0x7e,0x1f,0x24,0x68,0x2d,0x31,0x22,0x7c,0xa7,0x7e,0x73,0x6e,0xb0,0xac,0x7b,0xa, +0x2a,0x2d,0x32,0x22,0x7c,0xb9,0x7c,0x70,0x2, 0x57,0x9, 0x7c,0x9b,0x74,0x3, 0xac, +0xb9,0x9, 0x85,0x29,0xb2,0xbe,0x83,0x76,0x9c,0x68,0x8, 0x7e,0x83,0x76,0x9c,0x19, +0x85,0x29,0xb2,0x9, 0x85,0x29,0xb3,0xbe,0x83,0x76,0x9d,0x68,0x8, 0x7e,0x83,0x76, +0x9d,0x19,0x85,0x29,0xb3,0x9, 0x85,0x29,0xb4,0xbe,0x83,0x76,0x9e,0x68,0x8, 0x7e, +0x83,0x76,0x9e,0x19,0x85,0x29,0xb4,0x7e,0x8, 0x0, 0x70,0x12,0x58,0x48,0x9, 0xb5, +0x29,0xb4,0x12,0x58,0x85,0x2, 0x4, 0x96,0x9, 0xb5,0x29,0xb2,0x12,0xc, 0xea,0x7e, +0x8, 0x0, 0x70,0x74,0x3, 0xac,0xb9,0x9, 0xb5,0x29,0xb3,0x12,0xd, 0x8d,0x7e,0x8, +0x0, 0x70,0x74,0x3, 0xac,0xb9,0x22,0x7c,0x9b,0x12,0x58,0x5e,0x12,0x58,0x48,0x12, +0x58,0xac,0x4c,0x99,0x78,0x9, 0x7e,0x8, 0x0, 0x70,0x74,0x1, 0x12,0xc, 0xea,0x12, +0x58,0x88,0x2, 0x4, 0x96,0x12,0xd, 0x7, 0x7e,0x37,0x0, 0x70,0x7a,0x37,0x0, 0xac, +0x7e,0x34,0x0, 0x2, 0x7e,0x8, 0x0, 0x70,0x7e,0x24,0x0, 0x1, 0x12,0x3, 0xfa,0x7e, +0x34,0x0, 0x2, 0x7e,0x8, 0x0, 0xac,0x7e,0x24,0x0, 0x1, 0x22,0x9, 0xb5,0x29,0xb4, +0x2, 0xd, 0x7, 0x12,0x3c,0xf3,0x12,0x37,0xe1,0x12,0x5a,0xac,0x7e,0xb3,0x6e,0xc1, +0x7e,0x37,0x6e,0xbd,0x60,0xe, 0x7a,0x37,0x0, 0xba,0x7e,0x37,0x6e,0xbf,0x7a,0x37, +0x0, 0x7e,0x80,0xc, 0x7a,0x37,0x0, 0x7e,0x7e,0x37,0x6e,0xbf,0x7a,0x37,0x0, 0xba, +0x7e,0x37,0x0, 0x7c,0x4e,0x70,0x2, 0x7a,0x37,0x0, 0x7c,0x7e,0x37,0x0, 0xb8,0x4e, +0x70,0x2, 0x7a,0x37,0x0, 0xb8,0x12,0x47,0xc4,0x9, 0xb5,0x29,0xb2,0x12,0xc, 0xea, +0x12,0x47,0xc4,0x9, 0xb5,0x29,0xb3,0x12,0xd, 0x8d,0x12,0x47,0xc4,0x12,0x58,0xac, +0x7e,0x37,0x0, 0x70,0x7a,0x37,0x0, 0xac,0x6d,0x33,0x7e,0x8, 0x0, 0x6c,0x7e,0x24, +0x0, 0x1e,0x12,0x3, 0xfa,0x6d,0x33,0x7e,0x8, 0x0, 0xa8,0x7e,0x24,0x0, 0x1e,0x2, +0x4, 0x96,0x12,0x58,0xb3,0x12,0x59,0x3e,0x12,0x5a,0x62,0x2, 0x35,0x9, 0xca,0x3b, +0x7e,0x38,0x1, 0x7c,0x12,0x7, 0xb5,0x7e,0x63,0x1, 0x8c,0xbe,0x60,0xff,0x68,0x2a, +0x7e,0x73,0x1, 0x8d,0xbe,0x70,0xff,0x68,0x21,0x7e,0xa3,0x1, 0x8e,0xbe,0xa0,0xff, +0x68,0x18,0x4c,0x66,0x68,0x14,0x4c,0x77,0x68,0x10,0x4c,0xaa,0x68,0xc, 0x7a,0x63, +0x76,0x2d,0x7a,0x73,0x76,0x29,0x7a,0xa3,0x76,0x2a,0xc2,0xf, 0x7e,0x73,0x1, 0x8e, +0xbe,0x70,0x3, 0x28,0x35,0x74,0x4, 0x7a,0xb3,0x77,0xdc,0x7a,0xb3,0x4a,0x68,0x75, +0xc3,0x84,0x7e,0x34,0x1, 0x90,0x7a,0x37,0x0, 0x72,0x7a,0x37,0x0, 0xae,0x7e,0x34, +0x0, 0x3, 0x7e,0x8, 0x0, 0x72,0x12,0x5b,0x4d,0x7e,0x34,0x0, 0x3, 0x7e,0x8, 0x0, +0xae,0x7e,0x24,0x0, 0x1, 0x12,0x4, 0x96,0xd2,0xf, 0xc2,0x11,0x7e,0xb3,0x1, 0x8c, +0x54,0xf0,0xb4,0xe0,0x2, 0xd2,0x11,0x7e,0x8, 0x0, 0xa0,0x69,0x33,0x0, 0x4, 0x12, +0x5a,0x57,0x12,0x0, 0x6, 0x7e,0x8, 0x0, 0xa2,0x29,0xb3,0x0, 0x6, 0x12,0x5a,0x4c, +0x7e,0x8, 0x0, 0xdc,0x69,0x33,0x0, 0x1, 0x12,0x5a,0x57,0x12,0x0, 0x6, 0x7e,0x8, +0x0, 0xde,0x29,0xb3,0x0, 0x3, 0x12,0x5a,0x4c,0x7e,0x8, 0x0, 0xa4,0x69,0x33,0x0, +0xa, 0x12,0x5a,0x57,0x12,0x0, 0x6, 0x7e,0x8, 0x0, 0xa6,0x29,0xb3,0x0, 0xc, 0x12, +0x5a,0x4c,0x7e,0x8, 0x0, 0xe0,0x69,0x33,0x0, 0x7, 0x12,0x5a,0x57,0x12,0x0, 0x6, +0x7e,0x8, 0x0, 0xe2,0x29,0xb3,0x0, 0x9, 0x12,0x5a,0x4c,0x7e,0x34,0x0, 0x1a,0x7e, +0x8, 0x0, 0xa0,0x7e,0x24,0x0, 0x4, 0x12,0x3, 0xfa,0x7e,0x34,0x0, 0x1a,0x7e,0x8, +0x0, 0xdc,0x7e,0x24,0x0, 0x4, 0x12,0x4, 0x96,0xda,0x3b,0x22,0x54,0xc0,0x23,0x23, +0x54,0x3, 0xa, 0x3b,0x2, 0xd, 0xa5,0x7d,0x23,0x7c,0x45,0x6c,0x55,0xa, 0x36,0x4d, +0x32,0x22,0x2, 0x5a,0x65,0xca,0x3b,0x7e,0x67,0x6e,0xb5,0x7e,0x77,0x6e,0xb7,0x74, +0x1, 0x12,0x35,0x28,0x7e,0xb3,0x6e,0xc1,0x7e,0x34,0x1, 0x0, 0x7e,0x8, 0x6e,0xc2, +0x7d,0x26,0x60,0xb, 0x12,0x4, 0x96,0x12,0x5a,0x9b,0x12,0x3, 0xfa,0x80,0x9, 0x12, +0x3, 0xfa,0x12,0x5a,0x9b,0x12,0x4, 0x96,0xda,0x3b,0x22,0x7e,0x34,0x1, 0x0, 0x7d, +0x16,0x3e,0x14,0x2e,0x14,0x6e,0xc2,0x6d,0x0, 0x7d,0x27,0x22,0x7e,0x8, 0x0, 0x6c, +0x12,0x5b,0x54,0x7e,0x34,0x1, 0x5, 0x7a,0x37,0x0, 0x6c,0x7e,0x34,0x20,0x0, 0x7a, +0x37,0x0, 0x6e,0x6d,0x33,0x7a,0x37,0x0, 0x70,0x7e,0x34,0x1, 0xe0,0x7a,0x37,0x0, +0x72,0x7e,0x34,0x28,0x30,0x7a,0x37,0x0, 0x74,0x7e,0x34,0x18,0x1e,0x7a,0x37,0x0, +0x76,0x7e,0x34,0x66,0x6, 0x7a,0x37,0x0, 0x78,0x7e,0x34,0x73,0x0, 0x7a,0x37,0x0, +0x7a,0x7e,0x34,0x14,0x2, 0x7a,0x37,0x0, 0x7c,0x6d,0x33,0x7a,0x37,0x0, 0x80,0x7a, +0x37,0x0, 0x82,0x7a,0x37,0x0, 0x84,0x7a,0x37,0x0, 0x86,0x7a,0x37,0x0, 0x98,0x7e, +0x34,0x38,0x1, 0x7a,0x37,0x0, 0x9a,0x7e,0x34,0x4, 0x1, 0x7a,0x37,0x0, 0x9c,0x7e, +0x34,0x6, 0x3, 0x7a,0x37,0x0, 0x9e,0x6d,0x33,0x7a,0x37,0x0, 0xa0,0x7a,0x37,0x0, +0xa2,0x7a,0x37,0x0, 0xa4,0x7a,0x37,0x0, 0xa6,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e, +0x18,0x0, 0x6c,0x7e,0x8, 0x0, 0xa8,0x12,0x24,0xf, 0x1b,0xfd,0x22,0x7e,0x24,0x0, +0x1, 0x2, 0x3, 0xfa,0x7e,0x34,0x0, 0x3c,0xe4,0x2, 0x24,0x34,0xd2,0x5, 0x7e,0x73, +0x6c,0xde,0xbe,0x70,0x3, 0x50,0x2, 0xc3,0x22,0x7e,0x8, 0x62,0xb8,0x12,0x5b,0x54, +0x6c,0xaa,0x80,0x17,0x7e,0x90,0x2, 0xac,0x9a,0x9, 0xb4,0x6b,0x54,0x19,0xb4,0x62, +0xb8,0x9, 0xb4,0x6b,0x55,0x19,0xb4,0x62,0xb9,0xb, 0xa0,0x7e,0x73,0x6c,0xde,0xbc, +0x7a,0x38,0xe1,0x6c,0xaa,0x80,0x36,0xa, 0x2a,0xb, 0x24,0x7c,0x65,0x80,0x28,0x7e, +0x50,0x2, 0xac,0x56,0x9, 0x12,0x62,0xb8,0x7e,0x30,0x2, 0xac,0x3a,0x9, 0xb1,0x62, +0xb8,0xbc,0xb1,0x78,0x2, 0xc2,0x5, 0x9, 0x52,0x62,0xb9,0x9, 0xb1,0x62,0xb9,0xbc, +0xb5,0x78,0x2, 0xc2,0x5, 0xb, 0x60,0xbc,0x76,0x38,0xd4,0xb, 0xa0,0xbc,0x7a,0x38, +0xc6,0xa2,0x5, 0x22,0xca,0x3b,0x7c,0xfb,0x12,0x5f,0xa8,0x7e,0x94,0x0, 0x51,0x7e, +0xe3,0x6c,0xde,0xe4,0x7a,0xb3,0x75,0x4a,0x7a,0xb3,0x75,0x4b,0x7a,0xb3,0x75,0xc, +0x7e,0x8, 0x75,0x4c,0x12,0x5f,0x7c,0xe4,0x12,0x24,0x34,0x12,0x5f,0x7c,0x3e,0x34, +0x7e,0x8, 0x75,0xd, 0xe4,0x12,0x24,0x34,0xbe,0xe0,0x2, 0x50,0x2, 0xc1,0x8a,0x6c, +0xdd,0xc1,0x84,0x74,0x2, 0x7c,0x7d,0xac,0x7b,0x12,0x5f,0xb7,0x4c,0xdd,0x68,0x8, +0xa, 0x8d,0x9, 0xb8,0x75,0x4c,0x70,0xa, 0xa, 0x3d,0xb, 0x34,0xa, 0x8d,0x19,0x78, +0x75,0x4c,0xa, 0x5d,0xb, 0x54,0xf5,0x26,0xc1,0x7b,0x7e,0xa1,0x26,0x74,0x2, 0x7c, +0x7a,0xac,0x7b,0x9, 0xa3,0x6b,0x54,0x7a,0xa1,0x2a,0x9, 0xb3,0x6b,0x55,0xf5,0x2b, +0xa, 0x2a,0xe5,0x28,0x12,0x5f,0x83,0x8, 0x6, 0x7d,0x50,0x9d,0x52,0x80,0x4, 0x6d, +0x55,0x9d,0x53,0xf5,0x2c,0xe5,0x2b,0xa, 0x2b,0xe5,0x29,0x12,0x5f,0x83,0x8, 0x6, +0x7d,0x80,0x9d,0x82,0x80,0x4, 0x6d,0x88,0x9d,0x83,0x7d,0x38,0x7c,0xc7,0xe5,0x2c, +0xbe,0xb0,0x6, 0x40,0x2, 0xc1,0x79,0xbe,0xc0,0x6, 0x40,0x2, 0xc1,0x79,0x12,0x5f, +0xaf,0x7a,0x35,0x2e,0x12,0x57,0x4, 0x7d,0x83,0x7e,0x25,0x2e,0xbd,0x28,0x8, 0x4, +0x7d,0x38,0x80,0x3, 0x7e,0x35,0x2e,0x7a,0x35,0x30,0xbd,0x28,0x58,0x4, 0x7d,0x38, +0x80,0x3, 0x7e,0x35,0x2e,0x7a,0x35,0x32,0x75,0x2d,0x0, 0xe5,0x2c,0xbe,0xb0,0x1, +0x38,0x21,0xbe,0xc0,0x1, 0x38,0x1c,0x7c,0xbf,0x30,0xe0,0x17,0x7e,0xb3,0x75,0xc, +0x4, 0x7a,0xb3,0x75,0xc, 0x75,0x2d,0x1, 0x7e,0xb3,0x75,0x4a,0x4, 0x7a,0xb3,0x75, +0x4a,0xc1,0x1d,0xe5,0x2c,0xbe,0xb0,0x1, 0x38,0x7, 0xbe,0xc0,0x1, 0x38,0x2, 0xc1, +0x1d,0xe5,0x2c,0xbe,0xb0,0x6, 0x40,0x2, 0xc1,0x1d,0xbe,0xc0,0x6, 0x40,0x2, 0xc1, +0x1d,0x7c,0xbf,0x20,0xe1,0x2, 0xc1,0x1d,0xc2,0x3, 0xe5,0x2c,0xbe,0xb0,0x2, 0x28, +0x5, 0xbe,0xc0,0x2, 0x38,0x2, 0xd2,0x3, 0x12,0x5f,0x8e,0x12,0xcf,0x28,0x12,0x5f, +0xa1,0x7a,0xd, 0x3a,0x7d,0x38,0x2e,0x35,0x2e,0x12,0x5f,0x9a,0x7a,0x35,0x34,0xc2, +0x2, 0xbe,0x8, 0x7f,0xff,0x78,0x5, 0x9f,0x11,0x7a,0x1d,0x3a,0x7e,0x35,0x34,0x7a, +0x35,0x43,0x12,0x5f,0x8e,0x7e,0xd, 0x3a,0x12,0xcd,0x84,0x92,0x4, 0x12,0x5b,0x5c, +0x92,0x1, 0x7e,0x35,0x32,0x12,0x5e,0x90,0x20,0x1, 0x1a,0xe5,0x2c,0xbe,0xb0,0x4, +0x38,0x13,0xbe,0xc0,0x4, 0x38,0xe, 0xa, 0x2c,0xe5,0x2c,0xa, 0x3b,0x12,0x5e,0x9c, +0x18,0x3, 0x12,0x5e,0x8d,0x85,0x29,0x43,0x85,0x2a,0x44,0x85,0x2b,0x45,0x7e,0x8, +0x0, 0x3e,0x7e,0x18,0x0, 0x40,0xe5,0x28,0x12,0xcd,0x2f,0xe5,0x2c,0xa, 0x4b,0xbe, +0x45,0x40,0x8, 0x7, 0xa, 0x3c,0xbe,0x35,0x40,0x18,0x8, 0x12,0x5e,0x98,0x18,0x3, +0x7e,0x95,0x3e,0x7e,0x5, 0x40,0xbe,0x4, 0x0, 0x3, 0x78,0x5, 0x7e,0x35,0x32,0x80, +0x14,0xbe,0x4, 0x0, 0x4, 0x78,0x5, 0x7e,0x35,0x34,0x80,0x9, 0xbe,0x4, 0x0, 0x5, +0x78,0x6, 0x7e,0x35,0x30,0x12,0x5e,0x90,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x4, 0x7e, +0x94,0x0, 0x3c,0x7e,0xb3,0x6e,0xa2,0x60,0x18,0x12,0x5e,0x8d,0xe5,0x2c,0xbe,0xb0, +0x2, 0x38,0xe, 0xbe,0xc0,0x2, 0x38,0x9, 0x12,0x5e,0x98,0x18,0x4, 0x7e,0x94,0x0, +0x32,0x7d,0x19,0x1a,0x2, 0x1a,0x0, 0x7e,0x1d,0x36,0x12,0x22,0xa3,0x7e,0x8, 0x0, +0x64,0x12,0x23,0x10,0x7f,0x1, 0x7e,0x1d,0x3a,0xbf,0x10,0x8, 0x2, 0xd2,0x2, 0x30, +0x4, 0x5, 0x20,0x3, 0x2, 0xc2,0x2, 0x30,0x2, 0x3, 0x75,0x2d,0x2, 0xe5,0x2d,0xbe, +0xb0,0x0, 0x28,0x55,0xe5,0x26,0xa, 0x4b,0x9, 0x14,0x75,0x4c,0xa5,0xb9,0x0, 0xc, +0xa, 0x3d,0x9, 0xa3,0x75,0x4c,0x19,0xa4,0x75,0x4c,0x80,0x3d,0xa, 0x3d,0x9, 0x53, +0x75,0x4c,0x7a,0x51,0x42,0xbc,0x51,0x28,0x3, 0x7a,0x11,0x42,0x75,0x27,0x0, 0x80, +0x23,0x9, 0x64,0x75,0x4c,0xe5,0x27,0xa, 0xb, 0x9, 0x30,0x75,0x4c,0xbc,0x36,0x68, +0xa, 0xa, 0x3d,0x9, 0x63,0x75,0x4c,0xbc,0x36,0x78,0x7, 0x7e,0xa1,0x42,0x19,0xa0, +0x75,0x4c,0x5, 0x27,0xbe,0xe1,0x27,0x38,0xd8,0x5, 0x26,0xbe,0xe1,0x26,0x28,0x2, +0x81,0x3a,0xb, 0xd0,0xbc,0xed,0x28,0x2, 0x81,0x13,0xda,0x3b,0x22,0x7e,0x35,0x30, +0x1a,0x26,0x1a,0x24,0x7a,0x1d,0x36,0x22,0xa, 0x2c,0x7d,0x34,0x2d,0x32,0xbe,0x34, +0x0, 0x6, 0x22,0xca,0xd8,0xca,0x79,0xc2,0x0, 0x7e,0xe0,0x3, 0xe4,0x7a,0xb3,0x75, +0x49,0x7e,0xd3,0x6e,0x7d,0x12,0xd1,0x29,0x7e,0xf3,0x6c,0xde,0xbe,0xf0,0x1, 0x38, +0x2, 0xe1,0x6d,0x7c,0xbe,0x12,0x5b,0xd4,0x4c,0xdd,0x78,0x4, 0xc2,0x0, 0x80,0x5f, +0xbe,0xd0,0x1, 0x28,0xd, 0x7e,0x73,0x75,0x8a,0xbe,0x70,0x6, 0x28,0x4, 0xc2,0x0, +0x80,0x4d,0xc2,0x0, 0x7e,0x53,0x6c,0xde,0xbc,0x5d,0x78,0x11,0x12,0x5f,0xc4,0x50, +0x5, 0x7e,0xe0,0x3, 0x80,0x3, 0x7e,0xe0,0x1, 0xd2,0x0, 0x80,0x32,0x7e,0x43,0x75, +0x4a,0xa, 0x34,0xa, 0x25,0x7d,0x12,0x9d,0x13,0xb, 0x14,0xa, 0x3d,0xbd,0x31,0x78, +0x7, 0x7e,0xe0,0x1, 0xd2,0x0, 0x80,0x17,0x7e,0x73,0x75,0xc, 0xa, 0x37,0x9d,0x23, +0xb, 0x24,0x7e,0x73,0x75,0x8b,0xbd,0x32,0x78,0x5, 0x7e,0xe0,0x41,0xd2,0x0, 0x30, +0x0, 0x5, 0x7c,0xbe,0x12,0x5b,0xd4,0x7e,0x8, 0x75,0x4c,0x12,0xcc,0x63,0x7a,0xb3, +0x75,0x49,0x7e,0xa3,0x75,0x49,0x7a,0xa3,0x6c,0xde,0x74,0x2, 0xa4,0xca,0x59,0x7e, +0x18,0x75,0xd, 0x7e,0x8, 0x6b,0x54,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x73,0x6c,0xde, +0x7a,0x73,0x75,0x8b,0x12,0xce,0x9b,0x7a,0xb3,0x75,0x8a,0x80,0xa, 0x74,0x64,0x7a, +0xb3,0x75,0x8a,0x7a,0xf3,0x75,0x8b,0xda,0x79,0xda,0xd8,0x22,0x90,0x21,0x52,0x93, +0xa, 0x3b,0x22,0xa, 0xb, 0x7d,0x30,0x9d,0x32,0xbe,0x34,0x0, 0x0, 0x22,0xe5,0x28, +0x7e,0x71,0x29,0x7e,0x61,0x2a,0x7e,0x51,0x2b,0x22,0x7e,0x24,0x0, 0x2, 0x2, 0x22, +0x71,0x7d,0x13,0x1a,0x2, 0x1a,0x0, 0x22,0xc2,0x2, 0xc2,0x3, 0xc2,0x4, 0x22,0xe5, +0x28,0x7e,0x71,0x29,0x2, 0x57,0x9, 0x9, 0xb3,0x6b,0x54,0xf5,0x28,0x9, 0xb3,0x6b, +0x55,0xf5,0x29,0x22,0x6c,0xaa,0x80,0x12,0x7e,0x70,0x9, 0xac,0x7a,0x9, 0xb3,0x6b, +0xd6,0xbe,0xb0,0x10,0x28,0x2, 0xd3,0x22,0xb, 0xa0,0x7e,0xb3,0x6c,0xf4,0xbc,0xba, +0x38,0xe6,0xc3,0x22,0x6d,0x55,0x80,0x29,0x7d,0xf5,0x3e,0xf4,0x7f,0x61,0x2d,0xdf, +0xb, 0x6a,0x40,0xbe,0x44,0x0, 0x64,0x28,0x16,0x2d,0xf1,0x7d,0xe0,0xb, 0x7a,0xd0, +0xbe,0xd4,0x0, 0x64,0x50,0x2, 0x80,0x4, 0xbd,0xd4,0x28,0x3, 0x1b,0x7a,0x40,0xb, +0x54,0xbe,0x55,0x28,0x40,0xd2,0x22,0x24,0x8a,0x78,0x19,0x7e,0xf, 0x78,0x39,0xa5, +0xbf,0x0, 0x8, 0x12,0x3f,0x7c,0x5e,0x70,0xfb,0x80,0x6, 0x12,0x3f,0x7c,0x4e,0x70, +0x4, 0x1b,0xa, 0x30,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x37,0x4e,0x83,0x7e,0x8, 0x4a, +0x71,0x12,0x37,0xef,0x12,0x35,0x28,0x7e,0x34,0x1, 0x0, 0x12,0x7, 0x40,0x7a,0x37, +0x63,0xa, 0x7e,0x34,0x1, 0x1, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xe, 0x7e,0x34,0x1, +0x2, 0x12,0x7, 0x40,0x7a,0x37,0x63,0x10,0x7e,0x34,0x1, 0x6, 0x12,0x7, 0x40,0x7a, +0x37,0x63,0xc, 0x7e,0x34,0x1, 0x0, 0x6d,0x22,0x12,0x6, 0x48,0x7e,0x34,0x1, 0x0, +0x6d,0x22,0x12,0x6, 0xc5,0x12,0x65,0x6, 0x12,0x6, 0x48,0x12,0x65,0x6, 0x12,0x6, +0xc5,0x12,0x64,0xfd,0x12,0x6, 0x48,0x12,0x64,0xfd,0x12,0x6, 0xc5,0x12,0x65,0x35, +0x12,0x6, 0x48,0x12,0x65,0x35,0x12,0x6, 0xc5,0x6d,0x33,0x12,0x7, 0x40,0x7a,0x37, +0x63,0x0, 0x7e,0x34,0x0, 0x1, 0x12,0x7, 0x40,0x7a,0x37,0x63,0x2, 0x7e,0x34,0x0, +0x2, 0x12,0x7, 0x40,0x7a,0x37,0x63,0x4, 0x7e,0x34,0x0, 0x8, 0x12,0x7, 0x40,0x7a, +0x37,0x63,0x6, 0x7e,0x34,0x0, 0x17,0x12,0x7, 0x40,0x7a,0x37,0x63,0x8, 0x12,0x64, +0xad,0x5e,0x50,0xe0,0x4e,0x50,0xa, 0x12,0x64,0xaa,0x5e,0x50,0xe0,0x4e,0x50,0xa, +0x12,0x6, 0xc5,0x12,0x65,0x28,0x12,0x6, 0x48,0x12,0x65,0x28,0x12,0x6, 0xc5,0x12, +0x65,0x42,0x12,0x6, 0x48,0x12,0x65,0x42,0x12,0x6, 0xc5,0x12,0x65,0xf, 0x12,0x6, +0x48,0x12,0x65,0xf, 0x12,0x6, 0xc5,0x12,0x65,0x1b,0x12,0x6, 0x48,0x12,0x65,0x1b, +0x12,0x6, 0xc5,0x12,0x64,0xb4,0x6d,0x66,0x80,0x30,0x12,0x64,0xa1,0x7e,0xb3,0x6e, +0xc1,0x70,0x12,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0x81, +0x12,0x64,0x8c,0x80,0x10,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12, +0x64,0x81,0x12,0x64,0x93,0x12,0x47,0xf5,0xb, 0x64,0x12,0x64,0x9a,0xbd,0x36,0x38, +0xc9,0x7e,0xb3,0x6e,0xb3,0x54,0x1, 0xb4,0x1, 0xb, 0x7e,0x37,0x62,0xb8,0x4e,0x70, +0x1, 0x7a,0x37,0x62,0xb8,0x12,0x36,0xc4,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x7e,0x18, +0xc, 0x18,0x7e,0x8, 0x4a,0x71,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, 0x1, 0x41, +0x35,0x12,0x64,0xb4,0x7e,0x73,0x6e,0xb0,0xa, 0x27,0x7e,0x35,0x26,0xad,0x32,0x7d, +0x63,0x80,0x59,0x12,0x64,0xa1,0x7e,0x73,0x6e,0xad,0xa, 0x37,0xbe,0x35,0x26,0x28, +0x1e,0x7e,0xb3,0x6e,0xc1,0x70,0xc, 0x12,0x64,0x76,0x60,0x35,0x3e,0x14,0x14,0x78, +0xfb,0x80,0x2e,0x12,0x64,0x76,0x60,0x17,0x3e,0x14,0x14,0x78,0xfb,0x80,0x10,0x7e, +0xb3,0x6e,0xc1,0x70,0x12,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12, +0x64,0x81,0x12,0x64,0x93,0x80,0x10,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78, +0xfb,0x12,0x64,0x81,0x12,0x64,0x8c,0x12,0x47,0xf5,0xb, 0x64,0x7e,0x25,0x26,0xb, +0x24,0x12,0x64,0x9a,0xad,0x32,0xbd,0x36,0x38,0x99,0x7e,0xb3,0x6e,0xb3,0x54,0x4, +0xb4,0x4, 0xb, 0x7e,0x37,0x62,0xb8,0x4e,0x70,0x4, 0x7a,0x37,0x62,0xb8,0x12,0x36, +0xc4,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x64,0xc0,0x12,0x24,0xf, 0x1b,0xfd,0x12, +0x64,0xc9,0x12,0x64,0xd9,0x7a,0x35,0x26,0x7e,0x73,0x6e,0xaf,0xa, 0x37,0xbe,0x35, +0x26,0x28,0x2, 0x21,0x91,0x6d,0x33,0x41,0xe2,0x12,0x64,0xb4,0x7e,0x65,0x26,0x80, +0x59,0x12,0x64,0xa1,0x7e,0x37,0x6e,0xb5,0xbd,0x36,0x28,0x1e,0x7e,0xb3,0x6e,0xc1, +0x70,0xc, 0x12,0x64,0x76,0x60,0x35,0x3e,0x14,0x14,0x78,0xfb,0x80,0x2e,0x12,0x64, +0x76,0x60,0x17,0x3e,0x14,0x14,0x78,0xfb,0x80,0x10,0x7e,0xb3,0x6e,0xc1,0x70,0x12, +0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0x81,0x12,0x64,0x93, +0x80,0x10,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0x81,0x12, +0x64,0x8c,0x12,0x47,0xf5,0x12,0x64,0x9a,0x2d,0x63,0x7e,0xa3,0x6e,0xb0,0x7e,0xb3, +0x6e,0xaf,0xa4,0xbd,0x56,0x38,0x9a,0x7e,0xb3,0x6e,0xb4,0x54,0x1, 0xb4,0x1, 0xb, +0x7e,0x37,0x62,0xdc,0x4e,0x70,0x1, 0x7a,0x37,0x62,0xdc,0x12,0x36,0xc4,0x7e,0x34, +0x4, 0xc, 0xca,0x39,0x12,0x64,0xc0,0x12,0x24,0xf, 0x1b,0xfd,0x12,0x64,0xc9,0x12, +0x64,0xd9,0x7a,0x35,0x26,0x12,0x64,0x9a,0xbe,0x35,0x26,0x28,0x2, 0x41,0x49,0x12, +0x64,0xb4,0x7e,0xb3,0x6e,0xb4,0x54,0x4, 0xb4,0x4, 0xb, 0x7e,0x37,0x62,0xdc,0x4e, +0x70,0x4, 0x7a,0x37,0x62,0xdc,0x12,0x36,0xc4,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12, +0x64,0xc0,0x12,0x24,0xf, 0x1b,0xfd,0x12,0x64,0xc9,0x12,0x5f,0xe4,0x6d,0x66,0x7d, +0x26,0x3e,0x24,0x49,0x32,0x4a,0x71,0xbe,0x34,0x2, 0x0, 0x28,0xf, 0x7d,0x12,0x2e, +0x14,0x4a,0x71,0x9e,0x34,0x2, 0x0, 0x1b,0x18,0x30,0x80,0x6, 0x6d,0x33,0x59,0x32, +0x4a,0x71,0xb, 0x64,0xbe,0x64,0x2, 0x6, 0x78,0xd5,0x7e,0x34,0x4a,0x71,0x7a,0x37, +0x4e,0x81,0xe4,0x7a,0xb3,0x76,0x8c,0x7a,0xb3,0x76,0x8b,0x12,0x64,0xad,0x12,0x64, +0xaa,0x12,0x6, 0xc5,0x7e,0x34,0x0, 0x1, 0x7e,0x27,0x63,0x2, 0x12,0x6, 0x48,0x7e, +0x34,0x0, 0x1, 0x7e,0x27,0x63,0x2, 0x12,0x6, 0xc5,0x7e,0x34,0x0, 0x2, 0x7e,0x27, +0x63,0x4, 0x12,0x6, 0x48,0x7e,0x34,0x0, 0x2, 0x7e,0x27,0x63,0x4, 0x12,0x6, 0xc5, +0x7e,0x34,0x0, 0x8, 0x7e,0x27,0x63,0x6, 0x12,0x6, 0x48,0x7e,0x34,0x0, 0x8, 0x7e, +0x27,0x63,0x6, 0x12,0x6, 0xc5,0x7e,0x34,0x0, 0x17,0x7e,0x27,0x63,0x8, 0x12,0x6, +0x48,0x7e,0x34,0x0, 0x17,0x7e,0x27,0x63,0x8, 0x12,0x6, 0xc5,0x12,0x64,0xf4,0x12, +0x6, 0x48,0x12,0x64,0xf4,0x12,0x6, 0xc5,0x12,0x64,0xeb,0x12,0x6, 0x48,0x12,0x64, +0xeb,0x12,0x6, 0xc5,0x12,0x64,0xe2,0x12,0x6, 0x48,0x12,0x64,0xe2,0x12,0x6, 0xc5, +0x7e,0x34,0x1, 0x6, 0x7e,0x27,0x63,0xc, 0x12,0x6, 0x48,0x7e,0x34,0x1, 0x6, 0x7e, +0x27,0x63,0xc, 0x12,0x6, 0xc5,0x6d,0x66,0x80,0x56,0x12,0x64,0xa1,0x7e,0x37,0x6e, +0xb5,0xbd,0x36,0x28,0x1e,0x7e,0xb3,0x6e,0xc1,0x70,0xc, 0x12,0x64,0x76,0x60,0x35, +0x3e,0x14,0x14,0x78,0xfb,0x80,0x2e,0x12,0x64,0x76,0x60,0x17,0x3e,0x14,0x14,0x78, +0xfb,0x80,0x10,0x7e,0xb3,0x6e,0xc1,0x70,0x12,0x12,0x64,0x76,0x60,0x5, 0x3e,0x14, +0x14,0x78,0xfb,0x12,0x64,0x81,0x12,0x64,0x93,0x80,0x10,0x12,0x64,0x76,0x60,0x5, +0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0x81,0x12,0x64,0x8c,0x12,0x47,0xf5,0xb, 0x64, +0x12,0x65,0xc3,0xbd,0x36,0x38,0xa3,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x62,0xb8,0x12, +0x47,0xd0,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x62,0xdc,0x12,0x47,0xd7,0x12,0x4f,0xe6, +0x12,0x65,0x51,0xda,0x3b,0x22,0x7d,0x57,0x5e,0x54,0x0, 0xf, 0x7e,0x14,0x0, 0x1, +0x22,0x7d,0x27,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x22,0x3e,0x24,0x2e,0x24, +0x62,0xb8,0x22,0x3e,0x24,0x2e,0x24,0x62,0xdc,0x22,0x7e,0x73,0x6e,0xb0,0xa, 0x37, +0x22,0x7d,0x36,0x3e,0x34,0x49,0x73,0x6e,0xc2,0x22,0x12,0x6, 0x48,0x6d,0x33,0x7e, +0x27,0x63,0x0, 0x22,0x7e,0x8, 0x62,0xb8,0x7e,0x34,0x0, 0x48,0xe4,0x2, 0x24,0x34, +0x7e,0x18,0xc, 0x18,0x7e,0x8, 0x63,0x12,0x22,0x7e,0x34,0x2, 0x6, 0x7a,0x35,0x28, +0x7e,0x8, 0x4a,0x71,0x7e,0x18,0x63,0x12,0x22,0x12,0x5f,0xe4,0x7e,0x35,0x26,0xb, +0x34,0x22,0x7e,0x34,0x1, 0x2, 0x7e,0x27,0x63,0x10,0x22,0x7e,0x34,0x1, 0x1, 0x7e, +0x27,0x63,0xe, 0x22,0x7e,0x34,0x1, 0x0, 0x7e,0x27,0x63,0xa, 0x22,0x7e,0x34,0x1, +0x2, 0x7e,0x24,0x3, 0x3c,0x22,0x7e,0x34,0x1, 0x1, 0x7e,0x24,0x7, 0x8, 0x22,0x7e, +0x34,0x0, 0x8, 0x7e,0x27,0x63,0x6, 0x4e,0x40,0x40,0x22,0x7e,0x34,0x0, 0x17,0x7e, +0x27,0x63,0x8, 0x5e,0x24,0xe0,0x3f,0x22,0x7e,0x34,0x0, 0x1, 0x7e,0x27,0x63,0x2, +0x5e,0x24,0x80,0x0, 0x22,0x7e,0x34,0x1, 0x6, 0x7e,0x27,0x63,0xc, 0x5e,0x24,0xfc, +0x0, 0x22,0x7e,0x34,0x0, 0x2, 0x7e,0x27,0x63,0x4, 0x5e,0x40,0x9c,0x4e,0x40,0x21, +0x22,0xca,0xd8,0xca,0x79,0x7c,0xf7,0x7c,0xeb,0xe4,0x12,0x35,0x28,0x6c,0xdd,0x7e, +0x70,0xb5,0xac,0x7d,0x2e,0x34,0x1, 0x0, 0x2e,0x34,0x0, 0x16,0x7a,0x35,0x28,0x12, +0x7, 0x40,0x7a,0x35,0x2a,0x7e,0x35,0x28,0x12,0x8, 0x0, 0x7a,0x35,0x2c,0x7e,0x25, +0x2a,0x5e,0x50,0xf8,0x7a,0x25,0x2a,0x5e,0x70,0xf8,0x7a,0x35,0x2c,0x7c,0xbe,0x54, +0x5, 0xa, 0x3b,0x4e,0x35,0x2a,0x7a,0x35,0x2a,0x7c,0xbf,0x54,0x5, 0xa, 0x3b,0x4e, +0x35,0x2c,0x7a,0x35,0x2c,0x7e,0x35,0x28,0x7e,0x25,0x2a,0x12,0x6, 0x48,0x7e,0x35, +0x28,0x7e,0x25,0x2c,0x12,0x6, 0xc5,0xb, 0xd0,0xbe,0xd0,0x3, 0x40,0xa1,0xda,0x79, +0xda,0xd8,0x22,0x7e,0x37,0x6e,0xb7,0x2e,0x37,0x6e,0xb5,0x22,0x7e,0x34,0x4, 0x71, +0xca,0x39,0x7e,0x34,0x1c,0x43,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x6e,0xad,0x12,0x24, +0xf, 0x1b,0xfd,0x12,0x65,0xc3,0x7a,0x37,0x73,0x21,0xe4,0x7a,0xb3,0x6e,0xb3,0x7a, +0xb3,0x6e,0xb4,0x90,0x21,0xd9,0x93,0x70,0x6, 0x7e,0x63,0x6e,0xb0,0x80,0x4, 0x7e, +0x63,0x6e,0xaf,0x7e,0x70,0x40,0xac,0x67,0x1b,0x34,0x7a,0x37,0x73,0x23,0x22,0x24, +0x52,0x68,0xa, 0x4, 0x78,0x29,0x6d,0x33,0x7a,0x37,0x4a,0x63,0x22,0x7e,0x63,0x6e, +0xaf,0x7e,0x73,0x6e,0xb0,0xac,0x76,0x3e,0x34,0x7a,0x37,0x4a,0x63,0x1e,0x34,0xa, +0x36,0x7a,0x73,0x76,0x98,0x7e,0x37,0x4a,0x63,0x1e,0x34,0x7a,0x73,0x76,0x99,0x22, +0x12,0x47,0xb6,0x7e,0x73,0x77,0xd8,0x7a,0x73,0x76,0x83,0x12,0x66,0x8f,0xe4,0x7a, +0xb3,0x6e,0x7d,0x7a,0xb3,0x6e,0x7c,0x2, 0x66,0x5a,0x7e,0x73,0x76,0x31,0x7a,0x73, +0x77,0xfa,0x22,0x12,0x66,0x88,0x12,0x66,0x6c,0x2, 0x66,0x5a,0x7e,0x8, 0x78,0x4, +0x2, 0x66,0x73,0xb, 0xa, 0x30,0xbe,0x37,0x77,0xd0,0x28,0x6, 0x9e,0x37,0x77,0xd0, +0x80,0x2, 0x6d,0x33,0x1b,0xa, 0x30,0x22,0x7e,0x8, 0x25,0xb1,0x2, 0x66,0x73,0x7e, +0x73,0x76,0x82,0x7a,0x73,0x73,0x1e,0x22,0x24,0x6f,0x68,0x12,0x14,0x68,0x14,0x14, +0x68,0x16,0x14,0x68,0x18,0xb, 0xb2,0x78,0x19,0x7e,0xb3,0x1, 0x8f,0x22,0x7e,0xb3, +0x1, 0x90,0x22,0x7e,0xb3,0x1, 0x91,0x22,0x7e,0xb3,0x1, 0x92,0x22,0x7e,0xb3,0x1, +0x93,0x22,0x74,0xfe,0x22,0x6d,0x33,0x7a,0x37,0x4a,0x63,0xd2,0x4, 0x12,0x36,0xe7, +0x12,0x33,0xfb,0xe5,0x1e,0x12,0x3b,0xdd,0x2, 0x47,0x1c,0x24,0xab,0x68,0x10,0x24, +0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f,0x74,0x5, 0x80,0x2d,0x7e, +0xb3,0x3, 0xff,0xb4,0x5, 0x2a,0x12,0x67,0x21,0x12,0xd2,0xaa,0x2, 0x67,0x61,0x7e, +0xb3,0x3, 0xff,0xb4,0x5, 0x1a,0x12,0x67,0x21,0x75,0xe9,0xff,0x22,0x7e,0xb3,0x3, +0xff,0xb4,0x5, 0xc, 0x12,0x67,0x21,0x2, 0x67,0x44,0x74,0x1, 0x7a,0xb3,0x3, 0xff, +0x22,0x7e,0x34,0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74,0xfa, +0x12,0xd3,0x1, 0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24,0x4d, +0x33,0x78,0xe6,0x22,0x2, 0x67,0x47,0x75,0xe7,0x6b,0xe4,0x7e,0x34,0x1, 0x4, 0x7e, +0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x5, 0x7a,0x1b,0xb0,0x75,0xe9,0xff, +0x22,0x2, 0x67,0x47,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba,0x12,0x70, +0x1b,0x80,0x25,0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3,0x7c,0x7a, +0x12,0x70,0x46,0x80,0x13,0xbe,0x30,0x80,0x40,0xe, 0xbe,0x30,0xef,0x38,0x9, 0x7c, +0xb3,0x24,0x80,0x7c,0x7a,0x12,0x70,0xa1,0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x66, +0xdb,0x74,0x1, 0x7a,0xb3,0x3, 0xff,0x22,0x7c,0x6b,0x12,0x67,0xe8,0x78,0x5, 0x7c, +0xb6,0x2, 0x67,0x64,0xb4,0x4, 0x5, 0x7c,0xb6,0x2, 0x47,0xfe,0x22,0x30,0x90,0x19, +0xc2,0x90,0xe5,0x13,0x70,0x9, 0x75,0x13,0x1, 0xe5,0x91,0xf5,0x1a,0x80,0x11,0x7e, +0x71,0x91,0xe5,0x1a,0x12,0x67,0xa8,0x5, 0x1a,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x1a, +0xe5,0x1a,0x12,0x70,0x82,0xf5,0x91,0x22,0x7e,0xb3,0x76,0x7c,0xc4,0x54,0x7, 0x22, +0x7e,0xa3,0x6e,0x7c,0xbe,0xa0,0x0, 0x38,0x3, 0x2, 0x68,0xa6,0x7e,0xb3,0x78,0x9, +0xbe,0xb0,0x32,0x40,0x2, 0x1, 0x88,0x4, 0x7a,0xb3,0x78,0x9, 0xbe,0xa0,0x2, 0x28, +0xe, 0x7e,0xb3,0x78,0x9, 0x4, 0x7a,0xb3,0x78,0x9, 0x4, 0x7a,0xb3,0x78,0x9, 0x7e, +0xb3,0x78,0x8, 0x70,0x25,0x7e,0x37,0x6d,0x6e,0x7a,0x37,0x78,0xa, 0x7e,0x37,0x6d, +0x70,0x7a,0x37,0x78,0xc, 0x74,0x1, 0x7a,0xb3,0x78,0x8, 0xe4,0x7a,0xb3,0x78,0x7, +0x7e,0xb3,0x6d,0x72,0x7a,0xb3,0x78,0xe, 0x80,0x44,0x7e,0x27,0x6d,0x70,0x7d,0x32, +0x9e,0x37,0x78,0xc, 0xbe,0x34,0x0, 0x0, 0x8, 0x6, 0x9e,0x27,0x78,0xc, 0x80,0x4, +0x6d,0x22,0x9d,0x23,0x7e,0x37,0x6d,0x6e,0x7d,0x13,0x9e,0x17,0x78,0xa, 0xbe,0x14, +0x0, 0x0, 0x8, 0x6, 0x9e,0x37,0x78,0xa, 0x80,0x4, 0x6d,0x33,0x9d,0x31,0x2d,0x32, +0xbe,0x34,0x0, 0x32,0x28,0x8, 0x80,0x0, 0x74,0x1, 0x7a,0xb3,0x78,0x7, 0x7e,0xb3, +0x78,0x7, 0xb4,0x1, 0x1e,0xbe,0xa0,0x1, 0x78,0x19,0x7e,0x73,0x6d,0x72,0xbe,0x73, +0x78,0xe, 0x68,0xf, 0x80,0x0, 0xe4,0x7a,0xb3,0x78,0x8, 0x7a,0xb3,0x78,0x7, 0x7a, +0xb3,0x78,0x9, 0x22,0x7e,0x73,0x6c,0xf3,0x7a,0x73,0x6c,0xf4,0x7e,0x73,0x6e,0x7c, +0x7a,0x73,0x6e,0x7d,0xe4,0x7a,0xb3,0x6e,0x80,0x7e,0x73,0x77,0xd8,0x7a,0x73,0x76, +0x35,0x7e,0x73,0x6e,0xa2,0x7a,0x73,0x5c,0xc3,0x22,0x7e,0xb3,0x78,0x6, 0x4, 0x7a, +0xb3,0x78,0x6, 0x7e,0x73,0x78,0x6, 0x7a,0x73,0x76,0x1b,0x22,0x7e,0x37,0x77,0xe9, +0xb, 0x34,0x7a,0x37,0x77,0xe9,0x7e,0x37,0x77,0xeb,0xbe,0x37,0x77,0xe9,0x28,0x3, +0x2, 0x69,0x7, 0x22,0x2, 0x68,0xec,0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9,0xd6,0xdf, +0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0, +0xd0,0xc0,0x83,0xc0,0x82,0xc2,0x8f,0x12,0x69,0x4, 0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xe4, +0x12,0x6c,0x6d,0x12,0x6b,0xbc,0x12,0x69,0xf0,0x12,0x69,0xe5,0x12,0x6b,0xa5,0x7e, +0x34,0x0, 0x1c,0x12,0xc, 0x65,0x12,0x2c,0x6f,0x12,0x6b,0x95,0x12,0x6b,0x84,0x12, +0x6b,0x8f,0x12,0x6b,0x89,0x12,0x6b,0xb0,0x12,0x6c,0x8b,0x12,0x6a,0xad,0x12,0x6c, +0xce,0x12,0x69,0xc0,0x12,0x6b,0x2, 0xd2,0xaf,0x12,0x6a,0x2a,0x12,0x6a,0x6, 0x90, +0x1c,0x45,0xe4,0x93,0xca,0xb8,0x90,0x1c,0x46,0xe4,0x93,0x7c,0x7b,0x7e,0x24,0x1, +0x33,0xda,0xb8,0x2, 0x69,0x96,0xca,0x79,0x7c,0xf7,0x7c,0xeb,0x7c,0x7f,0x12,0xb, +0x7b,0xa9,0xd6,0xcb,0x5e,0xe0,0x3f,0x5e,0xf0,0x3f,0x7c,0x4e,0x6c,0x55,0xa, 0x3f, +0x2d,0x32,0x7e,0xf, 0x78,0x35,0x79,0x30,0x0, 0x32,0xa9,0xc6,0xcb,0xda,0x79,0x22, +0x2, 0x69,0xc3,0xd2,0x0, 0x12,0x4d,0x5e,0xa9,0xd0,0xcb,0xa9,0xc6,0xca,0x12,0x6b, +0xc9,0xa9,0xd3,0x9e,0xa9,0xc3,0xb9,0xc2,0x8a,0xd2,0xaa,0x2, 0x69,0xde,0xa9,0xd0, +0x9e,0xa9,0xd7,0x9e,0x22,0xc2,0x8d,0xc2,0x8f,0x12,0x6a,0xfa,0xa9,0xc0,0x93,0x22, +0x75,0xec,0xff,0x75,0xee,0xff,0x75,0xeb,0x23,0x75,0xac,0xc0,0x12,0x6c,0x7b,0xa9, +0xd5,0xad,0xa9,0xc5,0xed,0x22,0x7e,0x8, 0x6b,0x34,0x12,0x6a,0x5f,0x7e,0x34,0x0, +0x20,0x7a,0x35,0x26,0x7e,0x18,0x0, 0x20,0x12,0x6a,0x69,0x2, 0x6a,0x1e,0xa9,0xc5, +0xca,0xa9,0xc7,0x94,0xe4,0x7a,0xb3,0x78,0x43,0x22,0x6c,0x77,0xa9,0xc7,0xb3,0xa9, +0xc6,0xb3,0xd2,0xc8,0x43,0xed,0xf, 0xc2,0xea,0xb, 0x70,0xbe,0x70,0x3, 0x28,0x3, +0x7e,0x70,0x3, 0xa, 0x57,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2e,0x54,0x0, +0x3, 0xf5,0xb3,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0x6a,0x5f,0x2, 0x6a,0x1e,0xa9, +0xd7,0x94,0x74,0xa5,0x7a,0xb3,0x78,0x43,0x22,0x12,0x6a,0x77,0x7e,0x35,0x26,0x12, +0x6c,0xb2,0xa9,0xd2,0xb4,0xd3,0x22,0x7d,0x52,0xf5,0x2a,0x7c,0xb6,0x7c,0xa5,0xa, +0x44,0xf5,0x29,0x7f,0x21,0xf5,0x28,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0x6a,0xa2,0xe5, +0x2a,0x12,0x6a,0xa2,0xe5,0x29,0x12,0x6a,0xa2,0xe5,0x28,0x12,0x6a,0xa2,0xe4,0x2, +0x6a,0xa2,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0xe4,0x7a,0xb3, +0x76,0x7c,0x7e,0x8, 0x28,0x3b,0x12,0x6b,0x9c,0x7e,0x8, 0x28,0x79,0x7e,0x34,0x0, +0x3e,0x12,0x24,0x34,0x7e,0x18,0x28,0x3b,0x7a,0x1f,0x28,0xe0,0x12,0x6a,0xdf,0x2, +0x6a,0xd2,0x75,0x13,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x76,0x7c,0xf5,0x91,0x22,0x2, +0x6a,0xe2,0xc2,0x92,0x12,0x6a,0xfa,0x90,0x1b,0xd8,0xe4,0x93,0x54,0xfe,0xf5,0x92, +0xd2,0xe8,0xc2,0xc0,0xa9,0xd4,0x95,0xd2,0xad,0x22,0x75,0x91,0x0, 0xc2,0x90,0xc2, +0x91,0x22,0xa9,0xd2,0xea,0xa9,0xc2,0xea,0x6d,0x33,0x7e,0xf, 0x78,0x39,0x79,0x30, +0x0, 0x10,0x12,0x4c,0xff,0x4e,0x34,0xdc,0xe, 0x1b,0xa, 0x30,0x7e,0x34,0x1, 0xc2, +0x7e,0xf, 0x78,0x39,0x79,0x30,0x0, 0x1e,0x7e,0xf, 0x78,0x39,0x12,0x3f,0x7c,0x4e, +0x70,0x10,0x1b,0xa, 0x30,0x12,0x6c,0x9b,0x12,0xb, 0xe5,0x7e,0x34,0xff,0xff,0x7e, +0xf, 0x78,0x39,0x79,0x30,0x0, 0x2, 0x6d,0x33,0x7e,0xf, 0x78,0x39,0x79,0x30,0x0, +0x14,0x12,0x6b,0x7b,0x7e,0x34,0xf0,0x4f,0x12,0x6b,0x7b,0xd2,0x4, 0x12,0x37,0xba, +0x53,0xc3,0xf8,0x75,0xc3,0x85,0x53,0xc2,0xfc,0x43,0xc2,0x81,0xd2,0xac,0x2, 0x6b, +0x71,0x90,0x21,0x50,0xe4,0x93,0x7a,0xb3,0x77,0xd9,0x22,0x7e,0xf, 0x78,0x39,0x79, +0x30,0x0, 0x4, 0x22,0xc2,0x88,0xd2,0xa8,0x22,0xa9,0xd5,0xcd,0xd2,0x99,0x22,0xa9, +0xd6,0xcd,0xd2,0x98,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e,0x34,0x0, 0x3e, +0x74,0xff,0x2, 0x24,0x34,0xa9,0xc3,0xcb,0xc2,0xcd,0xc2,0xcc,0xa9,0xd6,0xea,0x22, +0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0xa9,0xc5,0xcb,0xa9, +0xd1,0xcb,0xa9,0xd2,0xca,0xa9,0xd2,0xcb,0x22,0xa9,0xd0,0x9e,0xa9,0xd4,0x9e,0x75, +0x9d,0x0, 0x75,0x9c,0x20,0x22,0xca,0xb8,0xca,0x39,0x12,0x6b,0xc9,0x12,0x69,0xde, +0x7e,0x37,0x77,0xd0,0xb, 0x34,0x7a,0x37,0x77,0xd0,0x7e,0x37,0x77,0xe2,0xb, 0x34, +0x7a,0x37,0x77,0xe2,0x7e,0xb3,0x76,0x31,0xb4,0x1, 0x40,0x7e,0xb3,0x77,0xe4,0x4, +0x7a,0xb3,0x77,0xe4,0x7e,0x73,0x77,0xe4,0xbe,0x70,0xa, 0x28,0x2e,0xe4,0x7a,0xb3, +0x77,0xe4,0x7e,0x73,0x77,0xdb,0xbe,0x73,0x78,0x6, 0x78,0x8, 0x7e,0x37,0x77,0xd2, +0xb, 0x34,0x80,0xa, 0x7e,0x73,0x78,0x6, 0x7a,0x73,0x77,0xdb,0x6d,0x33,0x7a,0x37, +0x77,0xd2,0xbe,0x34,0x0, 0xfa,0x28,0x3, 0x75,0xe9,0xff,0x7e,0xb3,0x77,0xd4,0x60, +0x5, 0x14,0x7a,0xb3,0x77,0xd4,0x7e,0xb3,0x77,0xd4,0x70,0x2, 0xd2,0x14,0x7e,0x37, +0x29,0xfd,0xb, 0x34,0x7a,0x37,0x29,0xfd,0x7e,0x37,0x77,0xde,0xbe,0x34,0x0, 0x0, +0x28,0x6, 0x1b,0x34,0x7a,0x37,0x77,0xde,0xda,0x39,0xda,0xb8,0x32,0xa9,0xc5,0xca, +0xbe,0xb0,0x8, 0x50,0x2, 0xf5,0xcc,0x75,0xe6,0x0, 0x22,0xa9,0xc5,0xca,0x75,0xed, +0x8f,0x75,0xad,0xb0,0xa9,0xc7,0x94,0xa9,0xd4,0x94,0x22,0xc2,0x8e,0x43,0x89,0x20, +0x75,0x8d,0x1, 0x75,0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x6d,0x33,0x7e,0xf, 0x78, +0x39,0x79,0x30,0x0, 0x16,0x7e,0x34,0x1, 0x2c,0x7e,0xf, 0x78,0x39,0x79,0x30,0x0, +0x18,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0x75,0xb7, +0x0, 0x75,0xb8,0x0, 0x75,0xf7,0x0, 0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9, +0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0xa9,0xd4,0xb7,0xc2,0xbc,0xa9,0xc2, +0xb7,0xc2,0xba,0xa9,0xc1,0xb7,0xc2,0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0x22,0x7e,0xa3, +0x27,0x72,0x7e,0x70,0x4, 0xac,0x7a,0xb, 0x34,0xbe,0x37,0x76,0xd8,0x40,0x39,0x7e, +0x37,0x76,0xd8,0xb, 0x34,0x7a,0x37,0x76,0xd8,0xbe,0x34,0x0, 0x1, 0x78,0x5, 0x7e, +0xb3,0x76,0x5d,0x22,0xbe,0x34,0x0, 0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34,0x0, +0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25,0x9, 0xb2,0x78,0x28,0x22,0x9e,0x34,0x0, 0x3, +0x2e,0x37,0x25,0xb3,0x7e,0x39,0xb0,0x22,0x74,0xff,0x22,0x7c,0x2b,0xa5,0xba,0xfa, +0x5, 0x7e,0xb3,0x4a,0x66,0x22,0xa5,0xba,0x0, 0x5, 0x7e,0xb3,0x76,0x7c,0x22,0xbe, +0x20,0x3, 0x38,0x13,0x30,0x20,0x6, 0x7e,0x18,0x28,0x3b,0x80,0x4, 0x7e,0x18,0x28, +0x79,0x7a,0x1f,0x28,0xe0,0x80,0x5, 0xbe,0x20,0x6e,0x38,0xe, 0xa, 0x2, 0x7e,0x1f, +0x28,0xe0,0x2d,0x30,0x1b,0x34,0x7e,0x1b,0xb0,0x22,0xbe,0x20,0xd3,0x68,0x4, 0xa5, +0xba,0xd4,0x11,0xa5,0xba,0xd3,0x8, 0x6d,0x33,0x7a,0x37,0x76,0xd8,0x80,0x2, 0x15, +0x1a,0x2, 0x6c,0xfe,0xa5,0xba,0xf6,0xc, 0x7e,0x34,0x1b,0xd6,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0x50,0x22,0xa5,0xba,0xf7,0xa, 0x7e,0x34,0x1b,0xd6,0x12,0x29,0xdb,0xa, +0x56,0x22,0xbe,0x20,0xf8,0x68,0x4, 0xa5,0xba,0xf9,0x1d,0xa5,0xba,0xf8,0x8, 0x6d, +0x33,0x7a,0x37,0x76,0xd8,0x80,0x2, 0x15,0x1a,0x7e,0x37,0x76,0xd8,0x7d,0x23,0xb, +0x24,0x7a,0x27,0x76,0xd8,0x2, 0x6e,0x57,0xbe,0x20,0xeb,0x68,0x4, 0xa5,0xba,0xec, +0x5, 0x7c,0xb2,0x2, 0x6f,0x9b,0xbe,0x20,0x99,0x68,0x4, 0xa5,0xba,0x9a,0x2a,0x7e, +0xb3,0x76,0x1a,0x7c,0xab,0xbe,0xa0,0x20,0x40,0xd, 0xbe,0xa0,0x40,0x50,0x8, 0xa, +0x3a,0x9, 0x33,0x6b,0x14,0x80,0x3, 0x12,0x6f,0xe6,0x4, 0x7a,0xb3,0x76,0x1a,0xa5, +0xba,0x9a,0x3, 0x75,0x1a,0x99,0x7c,0xb3,0x22,0xbe,0x20,0x80,0x40,0xc, 0xbe,0x20, +0xef,0x38,0x7, 0xa, 0x32,0x9, 0xb3,0x75,0x8a,0x22,0xa5,0xba,0xfc,0x5, 0x7e,0xb3, +0x76,0x31,0x22,0xa5,0xba,0xfe,0xd, 0x7e,0x23,0x77,0xe1,0x74,0x27,0xac,0xb2,0x9, +0xb5,0x28,0xe7,0x22,0x74,0xff,0x22,0x7e,0x24,0xe, 0x6, 0x2d,0x32,0x2, 0x6e,0x6a, +0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x0, 0xf5,0x7a,0x71,0x82,0x7a,0x61,0x83, +0xe4,0x93,0x22,0x74,0x1, 0x7a,0xb3,0x78,0x42,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x6, +0xe4,0x7a,0xb3,0x78,0x42,0x22,0x7e,0xb4,0x21,0x53,0x7d,0x3b,0x12,0x6e,0x6a,0x7c, +0x7b,0x1e,0x70,0x7a,0x73,0x6e,0x8a,0x7e,0xa4,0x0, 0x96,0x7a,0xa7,0x6e,0x8b,0x12, +0x6f,0xc4,0x12,0xda,0xdf,0x7e,0xa3,0x6c,0xde,0xbe,0xa0,0x0, 0x38,0x2, 0xe1,0x41, +0xbe,0xa0,0x8, 0x28,0x1f,0x7e,0x37,0x6c,0xe4,0xbe,0x34,0x1, 0x90,0x58,0x15,0x7d, +0x3b,0x12,0x6e,0x6a,0x1e,0xb0,0xa, 0x3b,0x7d,0x2a,0x7e,0x14,0x0, 0x8c,0x7e,0x4, +0x0, 0x82,0x80,0x66,0xbe,0xa0,0x6, 0x28,0x1b,0x7e,0x37,0x6c,0xe4,0xbe,0x34,0x1, +0xf4,0x58,0x11,0x7d,0x3b,0x12,0x6e,0x6a,0xa, 0x3b,0x7e,0x24,0x0, 0xa0,0x7d,0x1a, +0x7d,0xa, 0x80,0x46,0xbe,0xa0,0x4, 0x28,0x1f,0x7e,0xa7,0x6c,0xe4,0xbe,0xa4,0x2, +0x58,0x58,0x15,0x7d,0x3b,0x12,0x6e,0x6a,0xa, 0x3b,0x7e,0x24,0x0, 0xb4,0x7e,0x14, +0x0, 0xaa,0x7e,0x4, 0x0, 0xc8,0x80,0x22,0xbe,0xa0,0x2, 0x28,0x24,0x7e,0xa7,0x6c, +0xe4,0xbe,0xa4,0x3, 0x20,0x58,0x1a,0x7d,0x3b,0x12,0x6e,0x6a,0xa, 0x3b,0x7e,0x24, +0x0, 0xdc,0x7e,0x14,0x0, 0xd2,0x7e,0x4, 0x0, 0xe6,0x12,0x6f,0x7c,0x80,0x7, 0x80, +0x0, 0xe4,0x7a,0xb3,0x78,0x42,0x7e,0xb3,0x78,0x42,0x70,0x27,0x90,0x21,0x53,0xe4, +0x93,0xa, 0x3b,0x7e,0x14,0x21,0x5b,0x12,0x6f,0xd1,0x7e,0x14,0x21,0x5d,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x10,0x7e,0x54,0x21,0x67,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x0, +0x2, 0x6f,0x7c,0xd2,0x23,0x22,0x12,0x6f,0xd9,0x2, 0x6e,0x73,0x7a,0x73,0x6e,0x8a, +0x7a,0x27,0x6e,0x8b,0x7a,0x17,0x6e,0x8d,0x7a,0x7, 0x6e,0x97,0x6d,0x33,0x9d,0x30, +0x12,0x2f,0xa6,0x12,0x2b,0x6f,0x7a,0x73,0x76,0xb, 0x22,0xb4,0xeb,0x3, 0x75,0x1b, +0x0, 0xe5,0x1b,0xa, 0x3b,0x2e,0x34,0x0, 0x16,0x12,0x6e,0x6a,0x7c,0xab,0x5, 0x1b, +0xe5,0x1b,0xb4,0x3, 0x9, 0x75,0x1b,0x0, 0x6d,0x33,0x7a,0x37,0x76,0xda,0x75,0x1a, +0xeb,0x7c,0xba,0x22,0x7e,0x34,0x0, 0x8c,0x7a,0x37,0x6e,0x8d,0x22,0x7e,0x14,0x21, +0xec,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20,0x22,0x7e,0x8, 0x78,0x42,0x7e,0x34,0x0, +0x1, 0x74,0xff,0x2, 0x24,0x34,0x7e,0x24,0x1b,0xd8,0xa, 0x3b,0x2d,0x32,0x6d,0x22, +0x2e,0x24,0x0, 0xff,0x7e,0x1b,0x30,0x22,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0x83, +0xc0,0x82,0x12,0x67,0xbd,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda,0x1b,0xda,0x2b,0x32, +0x12,0x70,0x17,0x75,0x13,0x0, 0x32,0xa9,0xc0,0x93,0x22,0x7a,0xb3,0x76,0x7c,0xc4, +0x54,0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, +0xb4,0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x76,0x31,0x22,0x74,0x1, 0x7a,0xb3,0x76,0x31, +0xe4,0x7a,0xb3,0x76,0x7c,0x22,0xbe,0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27, +0x76,0xda,0x4d,0x22,0x78,0xe, 0xa5,0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27, +0x76,0xda,0x15,0x1a,0x7e,0x27,0x76,0xda,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf, +0x9, 0x6, 0x7e,0x34,0x0, 0x2, 0x80,0x2, 0x6d,0x33,0x7a,0x37,0x76,0xda,0x75,0x1a, +0xea,0x22,0x7c,0x7b,0x6c,0xaa,0x12,0x67,0xe8,0x78,0x9, 0x7c,0xb7,0x12,0x6d,0x4b, +0x7c,0xab,0x80,0xa, 0xb4,0x4, 0x7, 0x7c,0xb7,0x12,0x39,0x27,0x7c,0xab,0x7c,0xba, +0x22,0x7c,0x6b,0x2e,0x60,0xdd,0x68,0x29,0x2e,0x60,0xfd,0x68,0x24,0x1b,0x61,0x68, +0x20,0x2e,0x60,0xfa,0x68,0x1b,0x1b,0x60,0x68,0x17,0x80,0x0, 0xa, 0x2b,0x19,0x72, +0x76,0xa, 0xd2,0x23,0x7a,0xb3,0x76,0x8, 0xb4,0x25,0x6, 0xd2,0x24,0x7a,0x73,0x76, +0x7, 0x22,0x7e,0x18,0x6e,0x22,0x6c,0x33,0x80,0x7e,0x7e,0x10,0x9, 0xac,0x13,0x9, +0x20,0x6d,0x72,0x90,0x21,0x51,0xe4,0x93,0xbc,0xb2,0x28,0x6a,0x7c,0xa2,0x5e,0xa0, +0xf, 0x74,0x9, 0xa4,0x2d,0x53,0x7d,0x42,0x7e,0x2b,0xa0,0x49,0x40,0x6d,0x70,0xbe, +0x44,0x0, 0x40,0x38,0x4c,0x49,0x40,0x6d,0x6e,0xbe,0x44,0x0, 0x0, 0x40,0x42,0x7e, +0xf4,0x21,0xde,0x12,0x9f,0x81,0xbd,0x40,0x38,0x37,0x4c,0xaa,0x78,0x38,0x7e,0xb3, +0x28,0xdf,0x70,0x32,0x7e,0xb3,0x6e,0x7c,0xb4,0x1, 0x2b,0x74,0x1, 0x7a,0xb3,0x28, +0xdf,0x7e,0x90,0x3, 0x7e,0x10,0x9, 0xac,0x12,0x7f,0x71,0x2d,0xf0,0x7a,0x7b,0x90, +0x74,0x3, 0x7f,0x71,0x2d,0xf0,0x39,0xb7,0x0, 0x1, 0xe4,0x7a,0xb3,0x25,0xae,0x80, +0x5, 0xe4,0x7a,0xb3,0x28,0xdf,0xb, 0x30,0x7e,0xb3,0x6e,0x89,0xbc,0xb3,0x28,0x2, +0x1, 0xda,0x7e,0xb3,0x6e,0x7c,0x70,0xa, 0x12,0x71,0x73,0x28,0x5, 0xe4,0x7a,0xb3, +0x28,0xdf,0x22,0x7e,0x73,0x6e,0x7d,0xbe,0x70,0x0, 0x22,0x74,0x1, 0x7a,0xb3,0x6d, +0x13,0x7e,0xb3,0x6c,0xff,0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x6d,0x13,0x12,0x71,0x73, +0x28,0x5, 0xe4,0x7a,0xb3,0x6d,0x13,0x7e,0xb3,0x25,0xae,0x70,0x5, 0xe4,0x7a,0xb3, +0x6d,0x13,0x7e,0xb3,0x78,0x20,0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x6d,0x13,0x7e,0x34, +0x22,0x32,0x12,0x29,0xdb,0xbe,0x37,0x75,0x2, 0x50,0x5, 0xe4,0x7a,0xb3,0x6d,0x13, +0x7e,0xb3,0x76,0x5a,0x70,0xa, 0x12,0xbe,0x39,0x28,0x5, 0xe4,0x7a,0xb3,0x6d,0x13, +0x7e,0xb3,0x76,0x2f,0xb4,0x1, 0x17,0x7e,0x73,0x29,0xfc,0xbe,0x70,0x3c,0x50,0xe, +0xbe,0x70,0x0, 0x28,0x9, 0xe5,0x1e,0x60,0x5, 0xe4,0x7a,0xb3,0x6d,0x13,0x22,0x12, +0x71,0x7b,0x12,0x73,0x24,0x12,0x73,0xff,0x2, 0x71,0xfb,0x7e,0xb3,0x6d,0xd, 0xb4, +0x1, 0x18,0x12,0x73,0xf5,0xbe,0x73,0x78,0x18,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0xd, +0x7e,0xb3,0x78,0x18,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x18,0x7e, +0xb3,0x6d,0xd, 0x70,0x53,0x12,0x73,0x1d,0x78,0x15,0x7e,0xb3,0x6d,0xe, 0xb4,0x1, +0x7, 0x7e,0xb3,0x78,0x1a,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x1a,0x80,0x18,0xbe, +0xa0,0x1, 0x78,0x13,0x7e,0xb3,0x6d,0xf, 0xb4,0x1, 0x7, 0x7e,0xb3,0x78,0x1b,0x4, +0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x1b,0x7e,0x73,0x78,0x1a,0xbe,0x70,0x3, 0x50,0x9, +0x7e,0x73,0x78,0x1b,0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x6d,0xd, 0xe4, +0x7a,0xb3,0x78,0x1a,0x7a,0xb3,0x78,0x1b,0x7e,0xb3,0x6d,0x10,0xb4,0x1, 0x18,0x12, +0x73,0xf5,0xbe,0x73,0x78,0x19,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0x10,0x7e,0xb3,0x78, +0x19,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x19,0x7e,0xb3,0x6d,0x10, +0x70,0x53,0x12,0x73,0x1d,0x78,0x15,0x7e,0xb3,0x6d,0x11,0xb4,0x1, 0x7, 0x7e,0xb3, +0x78,0x1c,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x1c,0x80,0x18,0xbe,0xa0,0x1, 0x78, +0x13,0x7e,0xb3,0x6d,0x12,0xb4,0x1, 0x7, 0x7e,0xb3,0x78,0x1d,0x4, 0x80,0x1, 0xe4, +0x7a,0xb3,0x78,0x1d,0x7e,0x73,0x78,0x1c,0xbe,0x70,0x3, 0x50,0x9, 0x7e,0x73,0x78, +0x1d,0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x6d,0x10,0xe4,0x7a,0xb3,0x78, +0x1c,0x7a,0xb3,0x78,0x1d,0x7e,0xb3,0x6d,0x13,0xb4,0x1, 0x1a,0x7e,0x73,0x6c,0xfd, +0xbe,0x73,0x78,0x1e,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0x13,0x7e,0xb3,0x78,0x1e,0x4, +0x80,0x6, 0x74,0x1, 0x80,0x2, 0x74,0x1, 0x7a,0xb3,0x78,0x1e,0x22,0x7e,0xa3,0x25, +0xaf,0x4c,0xaa,0x22,0xd2,0x0, 0xe4,0x7a,0xb3,0x6d,0xd, 0x7a,0xb3,0x6d,0x10,0x7e, +0xb3,0x6d,0x0, 0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xd, 0x12,0x73,0x1d,0x78, +0x14,0xe4,0x7a,0xb3,0x6d,0xe, 0x7e,0xb3,0x6d,0x1, 0xb4,0x1, 0x1f,0x74,0x1, 0x7a, +0xb3,0x6d,0xe, 0x80,0x17,0xbe,0xa0,0x1, 0x78,0x12,0xe4,0x7a,0xb3,0x6d,0xf, 0x7e, +0xb3,0x6d,0x2, 0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xf, 0x7e,0xb3,0x6d,0x3, +0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0x10,0x4c,0xaa,0x78,0x14,0xe4,0x7a,0xb3, +0x6d,0x11,0x7e,0xb3,0x6d,0x4, 0xb4,0x1, 0x1f,0x74,0x1, 0x7a,0xb3,0x6d,0x11,0x80, +0x17,0xbe,0xa0,0x1, 0x78,0x12,0xe4,0x7a,0xb3,0x6d,0x12,0x7e,0xb3,0x6d,0x5, 0xb4, +0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0x12,0x7e,0xb3,0x6d,0x9, 0x70,0x3, 0x12,0x73, +0xe9,0x7e,0xb3,0x25,0xae,0x70,0x3, 0x12,0x73,0xe9,0x7e,0xb3,0x6d,0xb, 0xb4,0x1, +0x3, 0x12,0x73,0xe9,0x7e,0x34,0x22,0x32,0x12,0x29,0xdb,0xbe,0x37,0x75,0x2, 0x50, +0x3, 0x12,0x73,0xe9,0x20,0x0, 0x11,0xe4,0x7a,0xb3,0x6d,0xe, 0x7a,0xb3,0x6d,0xf, +0x7a,0xb3,0x6d,0x11,0x7a,0xb3,0x6d,0x12,0x22,0xe4,0x7a,0xb3,0x6d,0xd, 0x7a,0xb3, +0x6d,0x10,0xc2,0x0, 0x22,0xe4,0x7a,0xb3,0x6d,0x13,0x7e,0x73,0x6c,0xfe,0x22,0x7e, +0x47,0x6c,0xe8,0x7e,0x7, 0x6e,0x8f,0x7e,0x34,0x0, 0x6, 0xad,0x30,0x7e,0x14,0x0, +0x4, 0x12,0x74,0xa0,0x8, 0x5, 0x7e,0xa0,0x4, 0x80,0x1d,0x7d,0x30,0x3e,0x34,0x12, +0x74,0x9e,0x8, 0x5, 0x7e,0xa0,0x3, 0x80,0xf, 0x7d,0x30,0x12,0x74,0x9e,0x8, 0x5, +0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0,0x1, 0x7e,0xb3,0x6d,0xa, 0x60,0x3, 0x7e,0xa0, +0x4, 0x12,0xc6,0x43,0x60,0x3, 0x7e,0xa0,0x1, 0xa, 0x2a,0x7e,0x14,0x22,0x9, 0x12, +0x9f,0x30,0xad,0x32,0x12,0x88,0xd7,0x7e,0xb3,0x6c,0xde,0xbe,0xb0,0x0, 0x28,0x28, +0x7e,0xb3,0x6c,0xff,0x70,0x22,0x7e,0x37,0x6c,0xfb,0xbe,0x34,0x0, 0x2, 0x48,0x9, +0x12,0x5f,0x9a,0x7a,0x37,0x6c,0xfb,0x80,0xf, 0x7e,0x63,0x6c,0xfd,0x7e,0x70,0x2, +0xac,0x67,0x7c,0xb7,0x7a,0xb3,0x6c,0xfd,0x7e,0xb3,0x76,0x2f,0xb4,0x1, 0xe, 0x7e, +0x27,0x6c,0xfb,0x7e,0x34,0x0, 0x5, 0xad,0x32,0x7a,0x37,0x6c,0xfb,0x22,0x3e,0x34, +0x7d,0x21,0x12,0x22,0x71,0xbd,0x34,0x22,0xca,0xf8,0x12,0x75,0x2d,0x12,0x71,0xef, +0x12,0x75,0x1b,0x40,0x5, 0xe4,0x7a,0xb3,0x6d,0xd, 0x7e,0xb3,0x6d,0xd, 0x60,0xb, +0xe4,0x7a,0xb3,0x78,0x18,0x74,0x1f,0x7a,0xb3,0x73,0x20,0x12,0x75,0x1b,0x40,0x6, +0x12,0x76,0xa1,0x12,0xdc,0x23,0x7e,0xb3,0x6d,0x10,0x60,0x6, 0x74,0x2, 0x7a,0xb3, +0x78,0x1f,0x7e,0xf3,0x78,0x1f,0xbe,0xf0,0x0, 0x28,0x23,0xe5,0x1e,0xb4,0x1, 0x14, +0x7e,0xb3,0x76,0x2f,0xb4,0x1, 0xd, 0x7e,0xb3,0x29,0xfc,0xbe,0xb0,0x3c,0x68,0x4, +0x70,0xc, 0x80,0x0, 0x7c,0xbf,0x14,0x7a,0xb3,0x78,0x1f,0x12,0xda,0x51,0x7e,0xb3, +0x6d,0x13,0x60,0x4, 0xe4,0x12,0xd9,0x50,0xda,0xf8,0x22,0xe5,0x1e,0x70,0xc, 0x7e, +0x73,0x77,0xe0,0xbe,0x73,0x77,0xe6,0x40,0x2, 0xc3,0x22,0xd3,0x22,0x12,0xbe,0x87, +0x12,0x75,0x5d,0x12,0xbf,0x55,0x2, 0x75,0x39,0x7e,0x27,0x73,0x21,0x1e,0x24,0x1e, +0x24,0xe4,0x7a,0xb3,0x6d,0xa, 0x7e,0x37,0x6c,0xe0,0xbd,0x32,0x38,0x8, 0x7e,0x37, +0x6c,0xe2,0xbd,0x32,0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xa, 0x22,0xe4,0x7a,0xb3, +0x6d,0x0, 0x7a,0xb3,0x6d,0x3, 0x12,0x76,0x80,0x7a,0xb3,0x6d,0x4, 0x7a,0xb3,0x6d, +0x5, 0x7e,0x73,0x6c,0xdf,0xbe,0x70,0x0, 0x28,0x2e,0x12,0x76,0x89,0x8, 0x6, 0x74, +0x1, 0x7a,0xb3,0x6d,0x0, 0x7e,0x7, 0x6e,0x95,0x7d,0x30,0x12,0x76,0x74,0x8, 0x3, +0x12,0x76,0x6d,0x7d,0x30,0x3e,0x34,0x3e,0x34,0x7d,0x21,0x12,0x76,0x78,0x8, 0x8, +0xd2,0x2b,0x6d,0x33,0x7a,0x37,0x76,0x5, 0x7e,0x37,0x6c,0xee,0xbe,0x34,0x1, 0xf4, +0x8, 0x2d,0x30,0x2a,0x2a,0x30,0x2b,0x1b,0x12,0x76,0x6d,0x7e,0x37,0x76,0x5, 0xb, +0x34,0x7a,0x37,0x76,0x5, 0xbe,0x34,0x0, 0x5, 0x28,0x8, 0xc2,0x2b,0x6d,0x33,0x7a, +0x37,0x76,0x5, 0x12,0x76,0xc1,0xbe,0x34,0x0, 0x64,0x28,0x3, 0x12,0x76,0x6d,0x7e, +0xa3,0x6c,0xdf,0xbe,0xa0,0x0, 0x28,0x42,0x12,0x76,0x89,0x8, 0x1a,0x7e,0x73,0x25, +0xaf,0xa5,0xbf,0x0, 0x8, 0x74,0x1, 0x7a,0xb3,0x6d,0x1, 0x80,0xa, 0xa5,0xbf,0x1, +0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0x2, 0x7e,0x37,0x6e,0x95,0x12,0x76,0x74,0x8, 0x1a, +0x7e,0x73,0x25,0xaf,0xa5,0xbf,0x0, 0x8, 0x74,0x1, 0x7a,0xb3,0x6d,0x4, 0x80,0xa, +0xa5,0xbf,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0x5, 0x7e,0xb3,0x6d,0x0, 0xbe,0xb0, +0x1, 0x68,0x10,0x7e,0xb3,0x6d,0x1, 0xbe,0xb0,0x1, 0x68,0x7, 0x7e,0xb3,0x6d,0x2, +0xb4,0x1, 0x24,0xbe,0xa0,0x0, 0x28,0x1f,0xbe,0xa0,0x3, 0x50,0x1a,0x7e,0xb3,0x6c, +0xde,0xb4,0x1, 0x13,0x90,0x21,0xfa,0xe4,0x93,0xbe,0xb3,0x6b,0x54,0x68,0x8, 0xe4, +0x7a,0xb3,0x6d,0x0, 0x12,0x76,0x80,0xe4,0x7a,0xb3,0x6d,0x6, 0x22,0x74,0x1, 0x7a, +0xb3,0x6d,0x3, 0x22,0xad,0x31,0x7d,0x24,0x12,0x22,0x71,0xbe,0x37,0x6c,0xee,0x22, +0x7a,0xb3,0x6d,0x1, 0x7a,0xb3,0x6d,0x2, 0x22,0x7e,0x37,0x6e,0x8f,0x7e,0x14,0x0, +0x6, 0xad,0x31,0x7e,0x44,0x0, 0x4, 0x7d,0x24,0x12,0x22,0x71,0xbe,0x37,0x6c,0xe8, +0x22,0x7e,0x18,0x8, 0xc, 0x7a,0x1d,0x33,0x7e,0x1f,0x24,0x64,0x7f,0x1, 0x2, 0x76, +0xb1,0x12,0x77,0xd4,0x12,0x77,0x92,0x7e,0x34,0x0, 0x10,0x12,0x77,0x89,0x2, 0x8, +0xe5,0x6d,0x22,0x7d,0x32,0x80,0x12,0x7d,0x52,0x12,0x76,0xe2,0xb, 0xa, 0x10,0xbe, +0x14,0xff,0xb0,0x58,0x2, 0xb, 0x34,0xb, 0x24,0x7e,0x17,0x73,0x21,0xbd,0x12,0x38, +0xe6,0x22,0x3e,0x54,0x7e,0xf, 0x24,0x68,0x2d,0x15,0x22,0xca,0xf8,0x7e,0xb3,0x73, +0x1e,0x70,0x8, 0x12,0x77,0x62,0x12,0x77,0x75,0x80,0xf, 0x7e,0x1f,0x24,0x64,0x7a, +0x1d,0x33,0x12,0x77,0x62,0x74,0x1, 0x12,0x77,0xa4,0x7e,0x37,0x73,0x21,0x90,0x1c, +0x2b,0xe4,0x93,0x70,0x13,0x6c,0xff,0x6d,0x22,0x7d,0x53,0x12,0x76,0xe2,0x1b,0xa, +0x20,0x12,0x77,0x5a,0x78,0xf1,0x80,0x2f,0x6c,0xff,0x7e,0xb3,0x73,0x1e,0xb4,0x1, +0x14,0x7d,0x53,0x3e,0x54,0x7e,0xf, 0x24,0x64,0x2d,0x15,0xb, 0xa, 0x40,0x12,0x77, +0x6b,0x9d,0x24,0x80,0x7, 0x7d,0x53,0x3e,0x54,0x12,0x77,0x6b,0x12,0x76,0xe4,0x1b, +0xa, 0x20,0x12,0x77,0x5a,0x78,0xd3,0xda,0xf8,0x22,0xb, 0x34,0xb, 0xf0,0xbe,0xf0, +0x4, 0x22,0x7e,0xf, 0x24,0x68,0x7e,0x1f,0x24,0x60,0x22,0x7e,0xf, 0x24,0x60,0x2d, +0x15,0xb, 0xa, 0x20,0x22,0x12,0x77,0xd4,0x7a,0x37,0x6a,0xd8,0x12,0x77,0x9d,0x7e, +0x34,0x0, 0x20,0x12,0x77,0x89,0x2, 0x8, 0xe5,0x7a,0x37,0x6a,0xde,0x7e,0x8, 0x6a, +0xd4,0x22,0x7a,0x37,0x6a,0xd8,0x7e,0x1d,0x33,0x7a,0x37,0x6a,0xda,0x7d,0x3f,0x7a, +0x37,0x6a,0xdc,0x22,0x7c,0xab,0x7f,0x61,0x7f,0x70,0x7e,0x8, 0x6a,0xd4,0x12,0xda, +0x40,0x7e,0xb3,0x6e,0xb0,0x7a,0xb3,0x6a,0xd5,0x7e,0xb3,0x6e,0xaf,0x7a,0xb3,0x6a, +0xd4,0xe4,0x12,0x77,0xf4,0x12,0x77,0x92,0x7a,0xa3,0x6a,0xd7,0x6d,0x33,0x12,0x77, +0x89,0x2, 0x8, 0xe5,0x7f,0x61,0x7f,0x70,0x7e,0x8, 0x6a,0xd4,0x7e,0x34,0x0, 0xc, +0xe4,0x12,0x24,0x34,0x7e,0x73,0x6e,0xb0,0x7a,0x73,0x6a,0xd5,0x7e,0x73,0x6e,0xaf, +0x7a,0x73,0x6a,0xd4,0x7a,0xb3,0x6a,0xd6,0x7d,0x3d,0x22,0xca,0x79,0x7c,0xfb,0x7f, +0x51,0x7f,0x40,0x74,0x9, 0xac,0xbf,0x9, 0xb5,0x6d,0x73,0xf5,0x3a,0x74,0x9, 0xac, +0xbf,0x9, 0xb5,0x6d,0x74,0xc4,0x54,0xf0,0xf5,0x3b,0x74,0x9, 0xac,0xbf,0x9, 0xe5, +0x6d,0x72,0x12,0x78,0xf0,0x28,0x58,0x7e,0xb3,0x6e,0x83,0x70,0x28,0x75,0x3c,0xf, +0x7e,0x8, 0x0, 0x3a,0xa, 0x3e,0x2e,0x34,0x28,0x27,0x6d,0x22,0x74,0x1, 0x12,0x78, +0xa9,0x75,0x3c,0x20,0x7e,0x8, 0x0, 0x3b,0xa, 0x3e,0x2e,0x34,0x28,0x31,0x74,0x10, +0x12,0x78,0xa9,0x80,0xe, 0xa, 0x3e,0x9, 0xb3,0x28,0x27,0xf5,0x3a,0x9, 0xb3,0x28, +0x31,0xf5,0x3b,0x74,0x9, 0xac,0xbe,0x9, 0xb5,0x6e,0x22,0xb4,0x1, 0x11,0xe4,0xa, +0x3e,0x19,0xb3,0x28,0x27,0x19,0xb3,0x28,0x31,0x75,0x3a,0x0, 0x75,0x3b,0x0, 0x7e, +0xb3,0x6e,0x9d,0xb4,0xff,0x16,0x85,0x39,0x3a,0x75,0x3a,0x0, 0x74,0x9, 0xac,0xbf, +0x9, 0xb5,0x6d,0x72,0xbe,0xb0,0xff,0x68,0x3, 0x75,0x3a,0x1, 0xe5,0x3a,0x7a,0x4b, +0xb0,0xe5,0x3b,0x7a,0x5b,0xb0,0xda,0x79,0x22,0x7c,0x9b,0x7e,0x1b,0xa0,0x4c,0xaa, +0x78,0x7, 0x7e,0xb, 0xb0,0x7a,0x1b,0xb0,0x22,0xa, 0xda,0x7e,0xb, 0x80,0xa, 0xe8, +0x7d,0xfe,0x9d,0xfd,0xbe,0xf4,0x0, 0x0, 0x8, 0x4, 0x9d,0xed,0x80,0x4, 0x6d,0xee, +0x9d,0xef,0xe5,0x3c,0xa, 0xfb,0xbd,0xef,0x8, 0xf, 0xbc,0x8a,0x7c,0xba,0x28,0x4, +0x2c,0xb9,0x80,0x2, 0x9c,0xb9,0x7a,0x1b,0xb0,0x7e,0x1b,0x70,0x7a,0xb, 0x70,0x22, +0x7e,0x73,0x6e,0x89,0xbc,0x7e,0x22,0x7e,0x68,0x6e,0x22,0x7e,0xb3,0x6e,0x7d,0xb4, +0x1, 0x1a,0x7e,0xb3,0x6e,0x7c,0x70,0x14,0x29,0x76,0x0, 0x8, 0xbe,0x70,0x2d,0x50, +0xb, 0xbe,0x70,0x0, 0x28,0x6, 0x74,0x3, 0x7a,0xb3,0x6e,0x88,0x7e,0x73,0x6e,0x88, +0xbe,0x70,0x0, 0x28,0x2d,0x7e,0x34,0x0, 0x9, 0xca,0x39,0x7e,0x18,0x27,0x73,0x7e, +0x8, 0x6d,0x6e,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0xa3,0x6e,0x88,0xbe,0xa0,0x3, 0x78, +0x3, 0xe4,0x80,0xb, 0xbe,0xa0,0x1, 0x78,0x4, 0x74,0x1, 0x80,0x2, 0x74,0x2, 0x7a, +0x6b,0xb0,0x22,0xca,0x3b,0x75,0x27,0x0, 0x75,0x28,0x0, 0x75,0x29,0x0, 0x75,0x2a, +0x0, 0x75,0x2c,0x0, 0xc2,0x0, 0xc2,0x1, 0x7e,0x18,0x28,0x3b,0x7a,0x1d,0x31,0x7e, +0x18,0x6e,0x22,0x7a,0x1d,0x35,0xe4,0x7e,0x34,0x28,0x3c,0x7e,0x24,0x0, 0x0, 0x7a, +0x1b,0xb0,0x12,0xcc,0x31,0x12,0x78,0xf7,0x6c,0xee,0x80,0x39,0x74,0x9, 0xac,0xbe, +0x9, 0xf5,0x6d,0x72,0x12,0x9f,0x71,0x28,0x2a,0x12,0xe4,0x8b,0x2d,0x35,0x7e,0x1b, +0xb0,0xb4,0x1, 0x1f,0x12,0xe5,0xde,0x70,0x1a,0x29,0x1, 0x0, 0x8, 0xbe,0x0, 0x2d, +0x50,0x11,0xbe,0x0, 0x0, 0x28,0xc, 0x7a,0xe1,0x2b,0x74,0x3, 0xa5,0xf7,0x7a,0xf1, +0x12,0x80,0x7, 0xb, 0xe0,0x12,0x78,0xf0,0x38,0xc2,0x12,0xe5,0x10,0x38,0x2, 0x41, +0x4f,0xb4,0x3, 0x10,0x7e,0x34,0x0, 0x9, 0xca,0x39,0x12,0xe5,0xa2,0x7e,0x31,0x2b, +0xac,0x3b,0x80,0x19,0x6c,0xee,0x80,0x24,0x7e,0x30,0x9, 0xac,0x3e,0x9, 0xb1,0x6d, +0x72,0xb4,0xff,0x16,0x7e,0x4, 0x0, 0x9, 0xca,0x9, 0x12,0xe5,0xa2,0x2e,0x14,0x6d, +0x6e,0x6d,0x0, 0x12,0x24,0xf, 0x1b,0xfd,0x80,0x7, 0xb, 0xe0,0x12,0x78,0xf0,0x38, +0xd7,0x7e,0x11,0x12,0x2e,0x10,0x8, 0xa5,0xe7,0x7c,0xab,0xbe,0xa0,0x3, 0x78,0x13, +0x6c,0x33,0x7e,0x11,0x12,0x74,0x9, 0xac,0x1b,0x7e,0x1d,0x35,0x2d,0x30,0x7a,0x1b, +0x30,0x80,0x1c,0xbe,0xa0,0x1, 0x78,0x5, 0x7e,0xa0,0x1, 0x80,0x3, 0x7e,0xa0,0x2, +0x7e,0x31,0x12,0x74,0x9, 0xac,0x3b,0x7e,0x1d,0x35,0x2d,0x31,0x7a,0x1b,0xa0,0x7e, +0xb3,0x6e,0x85,0x70,0x1a,0x7e,0xb3,0x6e,0x81,0x70,0x14,0x7e,0xb3,0x6e,0x82,0x70, +0xe, 0x12,0xe5,0x10,0x38,0x9, 0x7e,0xb3,0x6e,0x88,0x70,0x3, 0x2, 0x81,0x15,0x12, +0xe5,0x10,0x28,0x3, 0x14,0xa5,0xf7,0x7e,0xb3,0x6e,0x88,0x60,0x5, 0x14,0x7a,0xb3, +0x6e,0x88,0x30,0x20,0x6, 0x7e,0x18,0x28,0x79,0x80,0x4, 0x7e,0x18,0x28,0x3b,0x7a, +0x1d,0x31,0x7e,0xd, 0x31,0x12,0x6b,0x9c,0x6c,0xee,0x2, 0x80,0xaf,0x7e,0x70,0x9, +0xac,0x7e,0x9, 0xf3,0x6d,0x72,0x12,0x9f,0x71,0x38,0x3, 0x2, 0x80,0xad,0x7c,0xaf, +0x5e,0xa0,0xf, 0x74,0x9, 0xa4,0x7e,0xd, 0x35,0x2d,0x15,0x7e,0xb, 0xc0,0x7e,0x90, +0x4, 0xac,0x9f,0x9, 0xa4,0x28,0xba,0x4c,0xaa,0x78,0x2, 0x61,0x84,0x49,0x23,0x6d, +0x6e,0x4d,0x22,0x78,0xa, 0x49,0x33,0x6d,0x70,0x4d,0x33,0x78,0x2, 0x61,0x84,0xbe, +0xa0,0x4, 0x28,0x5, 0x7e,0xd0,0x38,0x80,0x21,0xbe,0xa0,0x4, 0x78,0x5, 0x7e,0xd0, +0x30,0x80,0x17,0xbe,0xa0,0x3, 0x78,0x5, 0x7e,0xd0,0x20,0x80,0xd, 0xbe,0xa0,0x2, +0x78,0x5, 0x7e,0xd0,0x18,0x80,0x3, 0x7e,0xd0,0x10,0x75,0x26,0x0, 0x80,0x64,0x7e, +0x91,0x26,0x74,0x9, 0xac,0x9b,0x9, 0xb4,0x27,0xd1,0x54,0xf, 0xbc,0xbf,0x78,0x51, +0x74,0x9, 0xac,0xbe,0x49,0x35,0x6d,0x6e,0x12,0xe4,0xfc,0x49,0x34,0x27,0xcd,0x12, +0xe5,0x94,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x74,0x9, +0xac,0xbe,0x59,0x35,0x6d,0x6e,0x7e,0x90,0x9, 0xac,0x9e,0x49,0x34,0x6d,0x70,0x12, +0xe4,0xfc,0x7e,0xa1,0x26,0x74,0x9, 0xa4,0x49,0x35,0x27,0xcf,0x12,0xe5,0x94,0x1e, +0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x59,0x34,0x6d,0x70,0x80, +0x7, 0x5, 0x26,0x12,0x81,0xc1,0x38,0x97,0x7e,0x70,0x4, 0xac,0x7f,0x2e,0x34,0x28, +0xba,0x12,0xe6,0xc6,0x12,0xe4,0x8b,0x2d,0x35,0x7e,0x1b,0xb0,0xb4,0x1, 0x17,0x12, +0xe5,0xde,0x70,0x12,0x7e,0xb3,0x6e,0x88,0x70,0xc, 0xe4,0x39,0xb1,0x0, 0x8, 0x12, +0xe5,0xbb,0x7a,0xb3,0x28,0xe5,0x4c,0xcc,0x68,0x2, 0xe1,0xc6,0x12,0xe5,0xde,0x60, +0x2, 0xe1,0xc6,0x7e,0xb3,0x6e,0x88,0x60,0x2, 0xe1,0xc6,0x74,0x9, 0xac,0xbe,0x49, +0x35,0x6d,0x6e,0xbe,0x34,0x0, 0x14,0x38,0x10,0x12,0xe6,0x9c,0x40,0xb, 0x12,0x6f, +0xcd,0x9e,0x24,0x0, 0x14,0xbd,0x42,0x28,0x3b,0x7e,0x14,0x21,0xde,0x12,0xdd,0x9b, +0x7d,0x2c,0x9e,0x24,0x0, 0x14,0xbd,0x32,0x40,0x10,0x12,0xe6,0x9c,0x40,0xb, 0x12, +0x6f,0xcd,0x9e,0x24,0x0, 0x14,0xbd,0x42,0x28,0x1a,0x49,0xd5,0x6d,0x70,0xbe,0xd4, +0x0, 0x0, 0x28,0x2, 0xc1,0x7e,0xbe,0x34,0x0, 0x0, 0x50,0x2, 0xc1,0x7e,0xbd,0x3c, +0x28,0x2, 0xc1,0x7e,0x12,0xe5,0x86,0x12,0xe4,0xf5,0xbe,0x34,0x0, 0xc8,0x58,0x18, +0x12,0xe6,0x93,0xbe,0x44,0x0, 0x14,0x38,0xf, 0x12,0xe5,0x1c,0x40,0xa, 0x12,0xdd, +0x97,0x12,0xe6,0x8, 0x38,0x2, 0xa1,0x8c,0x12,0xe4,0xec,0xbe,0x34,0x0, 0xc8,0x58, +0x14,0x12,0xe4,0xa1,0x40,0xf, 0x12,0xe5,0x1c,0x40,0xa, 0x12,0xdd,0x97,0x12,0xe6, +0x8, 0x38,0x2, 0xa1,0x8c,0x12,0xe4,0xec,0xbe,0x34,0x0, 0x0, 0x58,0x25,0x74,0x9, +0xac,0xbe,0x49,0x45,0x6d,0x70,0xbe,0x44,0x0, 0x0, 0x38,0x17,0x49,0x35,0x6d,0x6e, +0xbe,0x34,0x0, 0x0, 0x40,0xd, 0x7e,0x14,0x21,0xde,0x12,0xdd,0x9b,0xbd,0x3c,0x38, +0x2, 0xa1,0x8c,0x12,0xe4,0x80,0x29,0xb1,0x0, 0x8, 0x70,0x2e,0x7e,0x4, 0x0, 0x9, +0xca,0x9, 0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x6d,0x6e,0x6d,0x22,0x2e,0x14,0x27, +0x73,0x6d,0x0, 0x12,0x24,0xf, 0x1b,0xfd,0x12,0xe4,0x8b,0x2d,0x35,0x2e,0x34,0x0, +0x8, 0x7e,0x1b,0xb0,0x4, 0x7a,0x1b,0xb0,0xa1,0x8c,0x12,0xe4,0x21,0x2d,0xc3,0xbe, +0xc4,0x0, 0x32,0x58,0x42,0x7e,0x70,0x9, 0xac,0x7e,0x49,0x23,0x6d,0x6e,0xbe,0x24, +0x0, 0x14,0x38,0x33,0x49,0xc3,0x6d,0x70,0xbe,0xc4,0x0, 0x14,0x40,0x29,0x12,0x6f, +0xcd,0x9e,0x24,0x0, 0x14,0xbd,0xc2,0x38,0x1e,0x12,0xca,0x8c,0x50,0xa, 0x7e,0xa0, +0x2d,0x12,0xe4,0x80,0x39,0xa1,0x0, 0x8, 0x12,0xe4,0x8b,0x12,0xe5,0x25,0x40,0x2, +0xa1,0x8c,0x12,0xe5,0x7d,0xa1,0x8c,0x12,0xe4,0x21,0x2d,0xc3,0xbe,0xc4,0x0, 0x32, +0x58,0x31,0x12,0xe4,0xa1,0x40,0x2c,0x12,0xe5,0x1c,0x40,0x27,0x12,0xdd,0x97,0x12, +0xe6,0x8, 0x38,0x1f,0x12,0xe5,0x86,0x12,0xca,0x90,0x50,0xa, 0x7e,0xa0,0x2d,0x12, +0xe4,0x80,0x39,0xa1,0x0, 0x8, 0x12,0xe4,0x8b,0x12,0xe5,0x25,0x50,0x4e,0x12,0xe5, +0x7d,0x80,0x49,0x12,0xe4,0x21,0x2d,0xc3,0xbe,0xc4,0x0, 0x0, 0x58,0x4a,0x7e,0x70, +0x9, 0xac,0x7e,0x49,0x23,0x6d,0x70,0xbe,0x24,0x0, 0x0, 0x38,0x3b,0x49,0xc3,0x6d, +0x6e,0xbe,0xc4,0x0, 0x0, 0x40,0x31,0x7e,0x14,0x21,0xde,0x12,0x6f,0xd1,0xbd,0xc2, +0x38,0x26,0x12,0xca,0x8c,0x50,0xa, 0x7e,0xa0,0x2d,0x12,0xe4,0x80,0x39,0xa1,0x0, +0x8, 0x12,0xe4,0x8b,0x12,0xe5,0x25,0x50,0x3, 0x12,0xe5,0x7d,0x7e,0xc0,0x3, 0x12, +0xe4,0x70,0x39,0xa1,0x0, 0x1, 0xc1,0xc8,0x7e,0x50,0x9, 0xac,0x5e,0x49,0x42,0x6d, +0x6e,0xbe,0x44,0x0, 0x14,0x38,0x47,0x49,0x32,0x6d,0x70,0xbe,0x34,0x0, 0x14,0x40, +0x3d,0x7e,0x14,0x21,0xec,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x50,0x9e,0x54,0x0, 0x14, +0xbd,0x35,0x38,0x2a,0x74,0x9, 0xac,0xbf,0x49,0xc5,0x27,0x73,0x4d,0xcc,0x78,0xa, +0x49,0xc5,0x27,0x75,0x4d,0xcc,0x78,0x2, 0xc1,0xbe,0x12,0xe4,0x2d,0x7d,0x53,0x2d, +0x5c,0xbe,0x54,0x1, 0x2c,0x8, 0x2, 0xc1,0xbe,0x12,0xe4,0x4d,0xc1,0xbe,0x7e,0x34, +0x21,0xde,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x0, 0x7d,0x10,0x9e,0x14,0x0, 0x14,0xbd, +0x41,0x40,0x4b,0x74,0x9, 0xac,0xbe,0x12,0xe5,0x1c,0x40,0x42,0x12,0x9f,0x89,0xb, +0x7a,0x20,0x9e,0x24,0x0, 0x14,0xbd,0x32,0x38,0x34,0x12,0xe5,0xfd,0x78,0xa, 0x49, +0x25,0x27,0x75,0x4d,0x22,0x78,0x2, 0xc1,0xbe,0x49,0x25,0x27,0x75,0x12,0xe6,0xce, +0x12,0xe4,0x38,0x2d,0x13,0xbe,0x14,0x1, 0x2c,0x8, 0x2, 0xc1,0xbe,0x7e,0xa0,0x5, +0x7e,0x30,0x4, 0xac,0x3f,0x19,0xa1,0x28,0xba,0x12,0xe4,0x59,0x80,0x70,0x74,0x9, +0xac,0xbe,0x12,0xe5,0x74,0x38,0x71,0xbe,0x44,0x0, 0x0, 0x40,0x6b,0xbd,0x40,0x38, +0x67,0x12,0xe5,0xfd,0x78,0x8, 0x49,0x25,0x27,0x75,0x4d,0x22,0x68,0x50,0x12,0xe4, +0x2d,0x2d,0xc3,0xbe,0xc4,0x1, 0x2c,0x18,0x45,0x12,0xe4,0x4d,0x80,0x40,0x7e,0x70, +0x9, 0xac,0x7f,0x7e,0xd, 0x35,0x2d,0x13,0x29,0x50,0x0, 0x8, 0xbe,0x50,0x0, 0x28, +0x37,0x7e,0xb3,0x28,0xe5,0x70,0x31,0x49,0x23,0x27,0x73,0x4d,0x22,0x78,0x8, 0x49, +0x23,0x27,0x75,0x4d,0x22,0x68,0x17,0x49,0x23,0x27,0x75,0x7d,0x3d,0x12,0xe6,0xce, +0x12,0xe4,0x38,0x2d,0x31,0xbe,0x34,0x1, 0x2c,0x18,0x3, 0x12,0xe4,0x4d,0x7e,0xa0, +0x2d,0x12,0xe4,0x80,0x39,0xa1,0x0, 0x8, 0x4c,0xcc,0x68,0x2, 0xe1,0xc6,0x7e,0x70, +0x9, 0xac,0x7e,0x12,0xca,0x8c,0x92,0x1e,0x30,0x1e,0x3c,0x12,0xe5,0xbb,0x12,0xe4, +0x8b,0x2d,0x35,0x29,0xb1,0x0, 0x6, 0x70,0x6, 0x74,0x1, 0x39,0xb1,0x0, 0x6, 0x12, +0xe4,0x8b,0x2d,0x35,0x29,0x31,0x0, 0x6, 0xbe,0x30,0x1, 0x28,0x2, 0xe1,0xc6,0x4c, +0xcc,0x78,0x3, 0x7e,0xc0,0x3, 0x74,0x2d,0x39,0xb1,0x0, 0x8, 0xd2,0x1f,0x12,0xe4, +0x70,0x39,0xa1,0x0, 0x1, 0xe1,0xc6,0x74,0x9, 0xac,0xbe,0x49,0x25,0x6d,0x6e,0xbe, +0x24,0x0, 0x14,0x28,0x14,0x7e,0x14,0x21,0xde,0x12,0x9f,0x30,0x9e,0x34,0x0, 0x14, +0xbd,0x23,0x50,0x5, 0x12,0xe5,0x74,0x38,0x7c,0xbe,0x24,0x0, 0x14,0x38,0xb, 0x12, +0xe5,0x74,0x40,0x6, 0xbe,0x34,0x0, 0x14,0x28,0x6b,0x7e,0x14,0x21,0xde,0x12,0x9f, +0x30,0x9e,0x34,0x0, 0x14,0xbd,0x23,0x40,0x14,0x74,0x9, 0xac,0xbe,0x49,0x15,0x6d, +0x70,0xbe,0x14,0x0, 0x0, 0x40,0x6, 0xbe,0x14,0x0, 0x14,0x28,0x48,0xbe,0x24,0x0, +0x14,0x38,0x21,0x74,0x9, 0xac,0xbe,0x49,0x5, 0x6d,0x70,0x7e,0x54,0x21,0xec,0x7e, +0x44,0x0, 0xff,0xb, 0x2a,0x10,0x7d,0x51,0x9e,0x54,0x0, 0x14,0xbd,0x5, 0x40,0x4, +0xbd,0x1, 0x28,0x21,0xbd,0x23,0x40,0x2e,0x74,0x9, 0xac,0xbe,0x49,0x25,0x6d,0x70, +0x7e,0x14,0x21,0xec,0x12,0x9f,0x30,0x7d,0x13,0x9e,0x14,0x0, 0x14,0xbd,0x21,0x40, +0x15,0xbd,0x23,0x38,0x11,0x12,0xe4,0x8b,0x2d,0x35,0x29,0xb1,0x0, 0x6, 0x70,0x6, +0x74,0x2, 0x39,0xb1,0x0, 0x6, 0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x80,0xad,0x12,0xe6, +0x93,0x7a,0x45,0x2d,0x49,0x35,0x6d,0x70,0x7a,0x35,0x2f,0xbe,0xc0,0x1, 0x78,0x3b, +0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7f,0x19,0xa3,0x28,0xb8,0x12,0xe4,0x80,0x39,0xa1, +0x0, 0x6, 0x75,0x26,0x0, 0x80,0x1f,0x12,0x85,0x95,0x9, 0xb3,0x27,0xd1,0x54,0xf, +0xbc,0xbf,0x78,0x10,0x49,0x23,0x27,0xcd,0x7a,0x25,0x2d,0x49,0x33,0x27,0xcf,0x7a, +0x35,0x2f,0x80,0x7, 0x5, 0x26,0x12,0x81,0xc1,0x38,0xdc,0x85,0x27,0x39,0x7e,0x8, +0x0, 0x29,0x7e,0x18,0x0, 0x2a,0x7c,0xbe,0x12,0x77,0xfb,0x7e,0x35,0x2d,0x5e,0x60, +0xf, 0x7a,0x35,0x2d,0x7e,0x35,0x2f,0x5e,0x60,0xf, 0x7a,0x35,0x2f,0x7e,0x90,0x9, +0xac,0x9e,0x9, 0x74,0x6d,0x72,0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x7d,0x25, +0x2e,0x25,0x2f,0x7a,0x25,0x2f,0xbe,0x70,0xff,0x68,0x19,0xbe,0xc0,0x1, 0x68,0x2, +0x5, 0x27,0x5, 0x2c,0xa, 0x5c,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4,0x7d,0x35,0x2e, +0x35,0x2d,0x80,0x7, 0x7e,0x35,0x2d,0x2e,0x34,0xc0,0x0, 0x7a,0x35,0x2d,0x12,0x81, +0x67,0x79,0x30,0x0, 0x2, 0x7e,0x35,0x2f,0x12,0x81,0x67,0x79,0x30,0x0, 0x4, 0x7e, +0xa1,0x29,0x7e,0x31,0x28,0x74,0x6, 0x12,0x81,0x5f,0x39,0xa1,0x0, 0x6, 0x7e,0xa1, +0x2a,0x7e,0x31,0x28,0x12,0x81,0x5f,0x39,0xa1,0x0, 0x7, 0x5, 0x28,0xb, 0xe0,0x12, +0x78,0xf0,0x28,0x3, 0x2, 0x7a,0x9d,0xe5,0x27,0x7e,0x1d,0x31,0x39,0xb1,0x0, 0x1, +0x7e,0x33,0x6e,0x7e,0x7e,0x1d,0x31,0x7a,0x1b,0x30,0x7e,0xb3,0x76,0x5a,0xb4,0x1, +0xf, 0x7e,0xb3,0x6e,0x82,0xb4,0x1, 0x1c,0x74,0x5, 0x7a,0xb3,0x77,0xdd,0x80,0xf, +0xe5,0x2c,0xbe,0xb0,0x0, 0x38,0x6, 0x7e,0xb3,0x6e,0x82,0x60,0x7, 0xb2,0x20,0xc2, +0x86,0x12,0x87,0xa3,0x7e,0xb3,0x6e,0x81,0x60,0xc, 0x7e,0xb3,0x6e,0x88,0x70,0x6, +0x7e,0xd, 0x35,0x12,0x81,0x73,0xe4,0x7a,0xb3,0x6e,0x85,0x7a,0xb3,0x6e,0x81,0x7a, +0xb3,0x6e,0x82,0x80,0x1e,0x7e,0xd, 0x35,0x12,0x81,0x73,0x6c,0xee,0x6c,0xaa,0x80, +0xb, 0x7c,0x1e,0x2e,0x10,0x8, 0x7c,0xba,0xa5,0xf7,0xb, 0xe0,0xbe,0xe0,0xa, 0x40, +0xf0,0xd2,0x86,0x12,0x87,0x98,0xca,0x59,0x7e,0x18,0x6d,0x6e,0x7e,0x8, 0x27,0xcd, +0x12,0x24,0xf, 0x1b,0xfd,0xe5,0x2c,0x70,0x10,0x12,0x54,0xc8,0x74,0x9, 0xac,0x7b, +0x7e,0x8, 0x27,0xcd,0x74,0xff,0x12,0x24,0x34,0x12,0x87,0xb5,0xda,0x3b,0x22,0xac, +0x3b,0x7e,0x1d,0x31,0x2d,0x31,0x22,0x7e,0xa1,0x28,0x74,0x6, 0xa4,0x7e,0xd, 0x31, +0x2d,0x15,0x22,0xca,0xf8,0x6c,0xaa,0x80,0x40,0x7e,0xf0,0x3, 0x7e,0x90,0x9, 0xac, +0x9a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xf0,0x74,0x3, 0x7f,0x10,0x2d,0x34,0x39,0xb1, +0x0, 0x1, 0x7e,0x34,0x7f,0xff,0x7f,0x70,0x2d,0xf4,0x79,0x37,0x0, 0x2, 0x7f,0x70, +0x2d,0xf4,0x79,0x37,0x0, 0x4, 0xe4,0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0x6, 0x7f, +0x10,0x2d,0x34,0x39,0xb1,0x0, 0x8, 0xb, 0xa0,0x12,0x4c,0xf7,0x38,0xbb,0xda,0xf8, +0x22,0x90,0x21,0x51,0xe4,0x93,0xbe,0xb1,0x26,0x22,0xca,0x3b,0xc2,0x0, 0x7e,0x38, +0x6e,0x22,0x6c,0xaa,0x80,0x19,0x7e,0x70,0xff,0x12,0x85,0x7f,0x74,0xff,0xa, 0x4a, +0x19,0xb4,0x62,0xcc,0xe4,0x19,0xb4,0x62,0xb8,0x19,0xb4,0x62,0xc2,0xb, 0xa0,0x12, +0x4c,0xf7,0x38,0xe2,0x7e,0x73,0x6e,0x7c,0xa5,0xbf,0x0, 0x2e,0x7e,0xb3,0x3, 0xc8, +0x70,0x2, 0x81,0xbc,0x6c,0xaa,0x80,0x1b,0x7e,0x44,0x7f,0xff,0x7e,0x50,0x9, 0xac, +0x5a,0x7f,0x3, 0x2d,0x12,0x79,0x40,0x0, 0x2, 0x7f,0x3, 0x2d,0x12,0x79,0x40,0x0, +0x4, 0xb, 0xa0,0x12,0x4c,0xf7,0x38,0xe0,0x81,0xbc,0x7e,0xb3,0x3, 0xc8,0x70,0x3e, +0xbe,0x70,0x0, 0x28,0x39,0x6c,0xaa,0x80,0x2b,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34, +0x6d,0x14,0x7f,0x3, 0x2d,0x14,0x79,0x30,0x0, 0x2, 0x49,0x34,0x6d,0x16,0x7f,0x3, +0x2d,0x14,0x79,0x30,0x0, 0x4, 0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x62,0xb8,0x19,0xa4, +0x6d,0x18,0xb, 0xa0,0x7e,0xb3,0x6e,0x7c,0xbc,0xba,0x38,0xcd,0x81,0xbc,0x6c,0xaa, +0x80,0x1d,0x7e,0x44,0x7f,0xff,0x7e,0x70,0x2, 0xac,0x7a,0x3e,0x34,0x59,0x43,0x24, +0x6c,0x59,0x43,0x24,0x6e,0x59,0x43,0x24,0x94,0x59,0x43,0x24,0x96,0xb, 0xa0,0x12, +0x4c,0xf7,0x38,0xde,0x7e,0xb3,0x3, 0xc8,0xbe,0xb3,0x6e,0x7c,0x28,0x9, 0xbe,0xb0, +0x2, 0x40,0x4, 0xd2,0x0, 0x80,0x2, 0xc2,0x0, 0x6c,0xaa,0x61,0x6a,0x75,0x26,0x0, +0x61,0x61,0x12,0x85,0x95,0x7f,0x73,0x2d,0xf3,0x69,0x17,0x0, 0x2, 0xbe,0x14,0x7f, +0xff,0x78,0x2, 0x61,0x5f,0xe5,0x26,0xa, 0x2b,0x9, 0xb2,0x62,0xc2,0x60,0x2, 0x61, +0x5f,0x30,0x0, 0x6c,0x7e,0x71,0x26,0x74,0x2, 0xac,0x7b,0x49,0x3, 0x3, 0xdd,0xbe, +0x4, 0x7f,0xff,0x68,0x5b,0x49,0xd3,0x3, 0xdd,0x69,0x7, 0x0, 0x2, 0x7d,0x40,0x9d, +0x4d,0x2d,0x40,0x49,0xd3,0x3, 0xc9,0x69,0x7, 0x0, 0x4, 0x7d,0x30,0x9d,0x3d,0x2d, +0x30,0xbe,0x44,0x0, 0x0, 0x58,0x2, 0x6d,0x44,0xbe,0x34,0x0, 0x0, 0x58,0x2, 0x6d, +0x33,0x7e,0x3, 0x6e,0xb1,0x12,0x85,0x89,0xbd,0xd4,0x18,0x6, 0x7d,0x40,0x9e,0x44, +0x0, 0x21,0x7e,0x3, 0x6e,0xb2,0x12,0x85,0x89,0xbd,0xd3,0x18,0x6, 0x7d,0x30,0x9e, +0x34,0x0, 0x21,0x12,0x85,0x63,0x59,0x40,0x24,0x6c,0x59,0x30,0x24,0x6e,0x80,0xf, +0x12,0x85,0x63,0x59,0x10,0x24,0x6c,0x69,0x17,0x0, 0x4, 0x59,0x10,0x24,0x6e,0xe5, +0x26,0xa, 0x1a,0x19,0xb1,0x62,0xcc,0x74,0x1, 0x19,0xb2,0x62,0xc2,0x80,0x9, 0x5, +0x26,0x12,0x81,0xc1,0x28,0x2, 0x41,0xb2,0xb, 0xa0,0x7e,0xb3,0x3, 0xc8,0xbc,0xba, +0x28,0x2, 0x41,0xad,0x6c,0xaa,0x80,0x1a,0x12,0x85,0x6b,0x69,0x30,0x0, 0x2, 0x7e, +0x50,0x2, 0xac,0x5a,0x59,0x32,0x3, 0xdd,0x69,0x30,0x0, 0x4, 0x59,0x32,0x3, 0xc9, +0xb, 0xa0,0x12,0x54,0xc8,0xbc,0x7a,0x38,0xdf,0x6c,0xaa,0x80,0x31,0xa, 0x2a,0x9, +0xb2,0x62,0xcc,0xb4,0xff,0x26,0x75,0x26,0x0, 0x80,0x1c,0xe5,0x26,0xa, 0x4b,0x9, +0xb4,0x62,0xc2,0x70,0x10,0xe5,0x26,0xa, 0x2a,0x19,0xb2,0x62,0xcc,0x74,0x1, 0x19, +0xb4,0x62,0xc2,0x80,0x7, 0x5, 0x26,0xbe,0x71,0x26,0x38,0xdf,0xb, 0xa0,0xbc,0x7a, +0x38,0xcb,0x6c,0xaa,0x80,0x1e,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x43,0x6d,0x14,0x7e, +0x50,0x2, 0xac,0x5a,0x3e,0x24,0x59,0x42,0x24,0x94,0x49,0x33,0x6d,0x16,0x59,0x32, +0x24,0x96,0xb, 0xa0,0x7e,0xb3,0x6e,0x7c,0xbc,0xba,0x38,0xda,0x7e,0x34,0x24,0x6c, +0x7a,0x37,0x62,0xd8,0x7e,0x34,0x24,0x94,0x7a,0x37,0x62,0xda,0x7e,0x34,0x24,0xbc, +0x7a,0x37,0x62,0xdc,0x7e,0x73,0x3, 0xc8,0x7a,0x73,0x62,0xd6,0x7e,0x73,0x6e,0x7c, +0x7a,0x73,0x62,0xd7,0x7e,0x8, 0x62,0xd6,0x12,0x1, 0x20,0x6c,0xaa,0x80,0x5c,0x7e, +0x70,0xff,0x75,0x26,0x0, 0x80,0x1d,0x7e,0x51,0x26,0x74,0x2, 0xac,0x5b,0x49,0x12, +0x24,0xbc,0xa, 0x2a,0xbd,0x21,0x78,0xa, 0xe5,0x26,0xa, 0x3b,0x9, 0x73,0x62,0xcc, +0x80,0x7, 0x5, 0x26,0x12,0x81,0xc1,0x38,0xde,0xbe,0x70,0xff,0x68,0x2b,0x12,0x85, +0x7f,0x74,0x1, 0xa, 0x47,0x19,0xb4,0x62,0xb8,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x42, +0x6d,0x14,0x12,0x85,0x75,0x79,0x40,0x0, 0x2, 0x7e,0x50,0x9, 0xac,0x5a,0x49,0x42, +0x6d,0x16,0x12,0x85,0x75,0x79,0x40,0x0, 0x4, 0xb, 0xa0,0x7e,0x63,0x6e,0x7c,0xbc, +0x6a,0x38,0x9c,0x6c,0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x62,0xb8,0xbe,0xb0,0x1, +0x68,0x13,0x7e,0x44,0x7f,0xff,0x12,0x85,0x6b,0x79,0x40,0x0, 0x2, 0x2d,0x37,0x7d, +0x26,0x79,0x41,0x0, 0x4, 0xb, 0xa0,0x12,0x4c,0xf7,0x38,0xdb,0x7e,0x73,0x6e,0x7c, +0x7a,0x73,0x3, 0xc8,0x7f,0x3, 0x7e,0x18,0x62,0xb8,0x12,0x84,0xd0,0xda,0x3b,0x22, +0xca,0x79,0x7e,0xa3,0x6e,0x7c,0x6c,0x99,0x80,0x77,0xa, 0xf9,0x2d,0xf3,0x7d,0xe2, +0x7e,0x7b,0xb0,0xb4,0x1, 0x27,0x12,0x85,0x59,0x29,0xb7,0x0, 0x1, 0xb4,0x1, 0x6, +0x74,0x3, 0x39,0xb7,0x0, 0x1, 0x12,0x85,0x59,0x29,0x87,0x0, 0x1, 0xbe,0x80,0x3, +0x78,0x3, 0xe4,0x80,0x32,0x4c,0x88,0x78,0x31,0x74,0x2, 0x80,0x2a,0x12,0x85,0x59, +0x29,0xb7,0x0, 0x1, 0xbe,0xb0,0x2, 0x68,0x8, 0x60,0x6, 0x29,0xb7,0x0, 0x7, 0x70, +0x14,0x74,0x1, 0x7a,0x7b,0xb0,0x7c,0x8a,0xb, 0xa0,0x7e,0xf0,0x9, 0xac,0xf8,0x19, +0x97,0x6d,0x18,0x80,0x5, 0x74,0x3, 0x7a,0x7b,0xb0,0x12,0x85,0x59,0x7e,0x7b,0xb0, +0x39,0xb7,0x0, 0x1, 0x12,0x85,0x59,0x29,0xb7,0x0, 0x1, 0x39,0xb7,0x0, 0x7, 0xb, +0x90,0x12,0x85,0x9d,0x38,0x84,0xda,0x79,0x22,0x7e,0xf0,0x9, 0xac,0xf9,0x7f,0x70, +0x2d,0xf7,0x22,0x7e,0x10,0x2, 0xac,0x1a,0x3e,0x4, 0x22,0x7e,0x70,0x9, 0xac,0x7a, +0x7f,0x3, 0x2d,0x13,0x22,0x7e,0x50,0x9, 0xac,0x57,0x7f,0x3, 0x2d,0x12,0x22,0x7e, +0x50,0x9, 0xac,0x5a,0x19,0x72,0x6d,0x18,0x22,0x7e,0x10,0x40,0xac,0x1, 0x7d,0xd0, +0x9e,0xd4,0x0, 0x20,0x22,0x7e,0x71,0x26,0x74,0x9, 0xac,0x7b,0x22,0x90,0x21,0x51, +0xe4,0x93,0xbc,0xb9,0x22,0x7e,0x8, 0x62,0xb8,0xca,0x69,0xca,0xf8,0x7f,0x70,0x7c, +0x86,0x7c,0xf7,0x7c,0xab,0x6c,0x99,0xc1,0x69,0x7c,0x3f,0xc1,0x61,0x7e,0x10,0x9, +0xac,0x19,0x9, 0x20,0x6d,0xcc,0x7e,0x10,0x9, 0xac,0x13,0x9, 0xb0,0x6d,0x18,0xbc, +0xb2,0x68,0x2, 0xc1,0x5f,0xbe,0x20,0xff,0x78,0x2, 0xc1,0x5f,0x7e,0xd0,0x9, 0xac, +0xd2,0x9, 0xb6,0x6e,0x22,0x70,0xa, 0x7d,0x30,0x2e,0x34,0x6d,0x14,0x6d,0x22,0x80, +0xb, 0x7e,0x70,0x9, 0xac,0x79,0x2e,0x34,0x6d,0xc8,0x6d,0x22,0x29,0x11,0x0, 0x4, +0x12,0x86,0x77,0x39,0x16,0x0, 0x4, 0xb, 0x1a,0x0, 0x12,0x86,0x77,0x1b,0x6a,0x0, +0x69,0x1, 0x0, 0x2, 0x12,0x86,0x77,0x79,0x6, 0x0, 0x2, 0x7e,0x10,0x9, 0xac,0x13, +0x9, 0x10,0x6d,0x19,0x12,0x86,0x77,0x39,0x16,0x0, 0x5, 0x7e,0x10,0x9, 0xac,0x13, +0x9, 0x10,0x6d,0x1a,0x12,0x86,0x77,0x39,0x16,0x0, 0x6, 0x7e,0x10,0x9, 0xac,0x13, +0x9, 0x10,0x6d,0x1b,0x12,0x86,0x77,0x39,0x16,0x0, 0x7, 0x7e,0x10,0x9, 0xac,0x13, +0x9, 0x10,0x6d,0x1c,0x12,0x86,0x77,0x39,0x16,0x0, 0x8, 0xb, 0xa0,0x80,0x8, 0xb, +0x30,0xbc,0x83,0x28,0x2, 0xa1,0xbd,0xb, 0x90,0x12,0x85,0x9d,0x28,0x2, 0xa1,0xb9, +0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7e,0xd0,0x9, 0xac,0xda,0x7f,0x67,0x2d,0xd6, +0x22,0xca,0x79,0x7c,0xeb,0x90,0x21,0x51,0xe4,0x93,0x7c,0xfb,0x7e,0x70,0x9, 0xac, +0x7f,0x7e,0x8, 0x62,0xb8,0x74,0xff,0x12,0x24,0x34,0xe4,0x6c,0x77,0x7c,0x6e,0x12, +0x85,0xa5,0x7c,0x7e,0x7c,0x6f,0x12,0x85,0xa5,0x7c,0x1b,0x6c,0x0, 0x80,0x3e,0x6c, +0x99,0x80,0x17,0x74,0x9, 0xac,0xb9,0x9, 0xa5,0x62,0xbc,0x7e,0x30,0x9, 0xac,0x30, +0x9, 0x81,0x6d,0x18,0xbc,0x8a,0x68,0x6, 0xb, 0x90,0xbc,0x19,0x38,0xe5,0xbc,0x19, +0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x2e,0x34,0x6d,0x14,0x7e,0x30,0x9, 0xac,0x31, +0x2e,0x14,0x62,0xb8,0x74,0x9, 0x12,0x23,0x44,0xb, 0x10,0xb, 0x0, 0xbc,0xf0,0x38, +0xbe,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x62,0xb8,0x7e,0x8, 0x6d,0xc8,0x12, +0x24,0xf, 0x1b,0xfd,0xda,0x79,0x22,0xca,0x79,0x7e,0xf3,0x6e,0x7c,0x7e,0xe3,0x6e, +0x7d,0x7c,0xbf,0x7c,0x7e,0x12,0x4c,0x9e,0x7c,0xbf,0x12,0x86,0x81,0x4c,0xee,0x78, +0x17,0x12,0x87,0x98,0xca,0x59,0x7e,0x18,0x6d,0x14,0x7e,0x8, 0x6d,0xc8,0x12,0x24, +0xf, 0x1b,0xfd,0x12,0x87,0x4e,0x80,0xe, 0x7e,0xb3,0x6e,0x83,0x70,0x8, 0x12,0x87, +0x4e,0x7c,0xbf,0x12,0xb0,0xa7,0x7c,0xbf,0x12,0xb9,0xc8,0xda,0x79,0x22,0x7e,0xa3, +0x6e,0x7c,0x6c,0x77,0x80,0x3d,0x7e,0x90,0x9, 0xac,0x97,0x9, 0x64,0x6d,0xcc,0x7e, +0x50,0x9, 0xac,0x56,0x9, 0xb2,0x6e,0x22,0x70,0x27,0x74,0x1, 0x19,0xb2,0x59,0xe1, +0x49,0x14,0x6d,0x14,0x59,0x12,0x59,0xe2,0x49,0x14,0x6d,0x16,0x59,0x12,0x59,0xe4, +0xe4,0x19,0xb2,0x59,0xe6,0x19,0xb2,0x59,0xde,0x19,0xb2,0x59,0xdf,0x19,0xb2,0x59, +0xe0,0xb, 0x70,0xbc,0xa7,0x38,0xbf,0x22,0x90,0x21,0x51,0xe4,0x93,0x7c,0xab,0x74, +0x9, 0xa4,0x22,0x7e,0xb3,0x28,0xe4,0x4, 0x7a,0xb3,0x28,0xe4,0x7e,0x73,0x28,0xe4, +0x7a,0x73,0x76,0x19,0x22,0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7a,0x9, 0xb3,0x28,0xb8, +0x60,0x8, 0x74,0x1, 0x7a,0xb3,0x6e,0x87,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0xa, 0x40, +0xe6,0xe4,0x7a,0xb3,0x6e,0x87,0x22,0xe4,0x7a,0xb3,0x76,0x7c,0x90,0x1c,0x45,0x93, +0x7a,0xb3,0x76,0x7e,0x90,0x1c,0x46,0xe4,0x93,0x7a,0xb3,0x76,0x7f,0x90,0x21,0x51, +0xe4,0x93,0x7a,0xb3,0x76,0x81,0xe4,0x7a,0xb3,0x76,0x82,0x7a,0xb3,0x76,0x87,0x12, +0x47,0xb6,0xe4,0x7a,0xb3,0x76,0x8a,0x7e,0x73,0x29,0xb5,0x7a,0x73,0x76,0x9c,0x7e, +0x73,0x29,0xb6,0x7a,0x73,0x76,0x9d,0x7e,0x73,0x29,0xb7,0x7a,0x73,0x76,0x9e,0x7e, +0x73,0x29,0x84,0x7a,0x73,0x76,0xa5,0x7e,0x73,0x29,0x85,0x7a,0x73,0x76,0xa6,0x90, +0x1c,0x49,0x93,0x7a,0xb3,0x76,0x9a,0x90,0x1c,0x4a,0xe4,0x93,0x7a,0xb3,0x76,0x9b, +0x74,0x1, 0x7a,0xb3,0x76,0xac,0x7e,0x34,0x22,0x32,0x12,0x29,0xdb,0x7a,0x37,0x76, +0xd6,0x74,0x2, 0x7a,0xb3,0x76,0x85,0x74,0x17,0x7a,0xb3,0x76,0xa9,0x22,0x7e,0x18, +0x14,0x30,0x7a,0x1f,0x24,0x64,0x7e,0x18,0x4, 0x0, 0x7a,0x1f,0x24,0x68,0x7e,0xf, +0x24,0x64,0x12,0x37,0xef,0x7e,0xf, 0x24,0x68,0x7e,0x34,0x4, 0xc, 0x12,0x24,0x34, +0x7a,0xb3,0x25,0xae,0x22,0x7e,0x8, 0x6b,0x54,0x7e,0x34,0x1, 0xa1,0xe4,0x12,0x24, +0x34,0x90,0x21,0x52,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x6b,0xd0,0x74, +0xff,0x2, 0x24,0x34,0x7e,0x34,0x22,0x5, 0x12,0x29,0xdb,0x7a,0x37,0x6c,0xf7,0x7e, +0x34,0x22,0x7, 0x12,0x29,0xdb,0x7a,0x37,0x6c,0xf9,0x7e,0x34,0x22,0x9, 0x12,0x29, +0xdb,0x12,0x88,0xd7,0x90,0x22,0xc, 0xe4,0x93,0x7a,0xb3,0x6c,0xfe,0xe4,0x7a,0xb3, +0x6d,0x7, 0x7a,0xb3,0x6d,0x8, 0x22,0x7a,0x37,0x6c,0xfb,0x90,0x22,0xb, 0xe4,0x93, +0x7a,0xb3,0x6c,0xfd,0x22,0x7c,0x6b,0x7c,0x56,0x5e,0x50,0x4, 0x1e,0x50,0xa, 0x45, +0x7c,0xb6,0x54,0x1, 0xa, 0x5b,0x2d,0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0x4, 0x1e, +0x60,0xa, 0x26,0x7c,0xb7,0x54,0x1, 0xa, 0x3b,0x2d,0x32,0x7c,0xb7,0xa, 0x4b,0x3e, +0x44,0x3e,0x44,0xa, 0x5a,0x2d,0x54,0x7c,0xab,0x7a,0xa3,0x73,0x25,0xe4,0x7a,0xb3, +0x73,0x26,0x7e,0x70,0x4, 0x7c,0xba,0x30,0xe0,0x9, 0x7e,0xb3,0x73,0x26,0x4, 0x7a, +0xb3,0x73,0x26,0x1e,0xa0,0x1b,0x70,0x78,0xec,0x22,0x7c,0x9b,0x12,0xd8,0xab,0x7e, +0x50,0xa, 0xac,0x59,0x59,0x32,0x29,0x8c,0x74,0x27,0xac,0xb9,0x49,0x5, 0x28,0xeb, +0x59,0x2, 0x29,0x8e,0x49,0x15,0x28,0xed,0xb, 0x14,0xad,0x10,0x6d,0x0, 0x59,0x12, +0x29,0x92,0x59,0x2, 0x29,0x90,0x12,0x89,0x7f,0x19,0xa3,0x29,0x8a,0x74,0x27,0xac, +0xb9,0x49,0x35,0x28,0xed,0xb, 0x34,0x12,0x89,0x7f,0x19,0xa3,0x29,0x8b,0x22,0x12, +0x89,0x8a,0x7c,0xab,0x7e,0x70,0xa, 0xac,0x79,0x22,0xe4,0x80,0x5, 0xb, 0x34,0x1e, +0x34,0x4, 0xbe,0x34,0x0, 0x10,0x38,0xf5,0x22,0xca,0x3b,0x7c,0xeb,0xc2,0x2, 0x7e, +0x70,0x27,0xac,0x7e,0x9, 0xf3,0x28,0xea,0x12,0x8a,0x4f,0x4c,0xee,0x68,0x18,0xd2, +0x2, 0xe4,0x19,0xb3,0x28,0xe8,0x7c,0xbe,0x12,0x89,0x3a,0x12,0x8a,0x26,0x12,0x8a, +0x59,0x12,0x3c,0x8, 0x12,0x8a,0xa5,0xa2,0x2, 0xda,0x3b,0x22,0xca,0x79,0x7c,0xfb, +0xd2,0x0, 0xc2,0x1, 0x6d,0x33,0x7a,0x37,0x77,0xd0,0x74,0x27,0xac,0xbf,0x9, 0xe5, +0x28,0xe8,0x7c,0xbf,0x12,0x89,0x99,0x92,0x1, 0x7c,0xbf,0x12,0x8a,0x72,0x92,0x0, +0x30,0x0, 0x7, 0x7c,0xbf,0x7c,0x7f,0x12,0x41,0x66,0x7e,0xb3,0x76,0xaa,0x70,0xc, +0x7c,0xbf,0x12,0xd8,0xe2,0x92,0x2e,0x20,0x2e,0x2, 0xc2,0x0, 0x30,0x1, 0x12,0x74, +0x27,0xac,0xbf,0x19,0xe5,0x28,0xe8,0x7c,0xbf,0x12,0x89,0x3a,0x7c,0xbf,0x12,0x8a, +0x3a,0xa2,0x0, 0xda,0x79,0x22,0xe4,0x7a,0xb3,0x76,0xfc,0x12,0xe5,0xd2,0x7a,0xb3, +0x76,0xff,0x12,0xe4,0xbb,0x7a,0xb3,0x77,0x7, 0x22,0xca,0x3b,0x7c,0xeb,0x12,0xe6, +0x43,0x12,0x8a,0x4f,0xe5,0x1e,0x12,0x3b,0xdd,0x12,0x8a,0xa5,0xda,0x3b,0x22,0x7e, +0xd0,0xb5,0xac,0xdf,0x2e,0x64,0x1, 0x0, 0x22,0x7e,0x34,0x0, 0x4, 0x12,0x8f,0x77, +0x74,0x1, 0x12,0x8f,0xbf,0x7e,0x73,0x77,0xe1,0x7a,0x73,0x77,0x2, 0x7a,0x73,0x77, +0x3, 0x22,0xca,0xf8,0x7c,0xab,0xc2,0x2, 0x12,0x8f,0x6f,0xac,0x67,0x9, 0xf3,0x74, +0x82,0x7c,0xba,0x12,0x8a,0xf4,0x6c,0xaa,0x6c,0x77,0x7e,0x50,0x26,0xac,0x57,0x19, +0xa2,0x74,0x8e,0xb, 0x70,0xa5,0xbf,0x3, 0xf1,0x30,0x2, 0x5, 0x7c,0xbf,0x12,0x34, +0xac,0xd3,0xda,0xf8,0x22,0xe4,0x12,0x35,0x28,0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14, +0x0, 0xf4,0x6d,0x0, 0x74,0x1, 0x7e,0x70,0x27,0xac,0x7e,0x9, 0x73,0x28,0xe8,0x12, +0xd, 0x23,0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14,0x0, 0xf8,0x6d,0x0, 0x74,0xa, 0xac, +0xbe,0x9, 0xb5,0x29,0x8a,0x12,0xd, 0x73,0x7d,0x36,0xb, 0x35,0x74,0x2c,0xac,0xbf, +0x49,0x25,0x0, 0xf8,0x12,0x0, 0x2e,0x7d,0x36,0x74,0x2c,0xac,0xbf,0x49,0x25,0x0, +0xf4,0x2, 0x0, 0x2e,0x7c,0x9b,0x7e,0x24,0x0, 0x1, 0x7c,0xb9,0x60,0x5, 0x3e,0x24, +0x14,0x78,0xfb,0x7e,0x83,0x73,0x1f,0xa, 0x38,0x5d,0x32,0x68,0xb, 0x12,0x46,0x5d, +0x7e,0x83,0x74,0x7e,0x7a,0x83,0x75,0x6, 0x6c,0xaa,0x7e,0xb3,0x75,0x6, 0xbc,0xba, +0x78,0x8, 0x6c,0x88,0x12,0x8b,0x55,0xe4,0x80,0x1f,0x7e,0x24,0x0, 0x1, 0x7c,0xb9, +0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0xb3,0x73,0x1f,0xa, 0x3b,0x5d,0x32,0x68, +0xc, 0x7e,0x80,0x1, 0x12,0x8b,0x55,0x74,0x1, 0x19,0xb3,0x74,0x8f,0xb, 0xa0,0xbe, +0xa0,0x3, 0x40,0xc6,0x22,0x7e,0x70,0x26,0xac,0x7a,0x19,0x83,0x74,0x8e,0x22,0xca, +0xf8,0x7e,0xf3,0x77,0xe1,0x20,0xb, 0x6, 0x20,0xc, 0x3, 0x30,0xe, 0x3, 0xc3,0x80, +0x57,0x12,0x8b,0xcb,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x73,0x1f,0x6c, +0x44,0x5c,0x57,0x4d,0x22,0x68,0x40,0x7e,0xb3,0x76,0xaa,0x70,0x8, 0x4e,0x73,0x73, +0x20,0x7a,0x73,0x73,0x20,0x12,0x8f,0x67,0x12,0x89,0xcc,0x40,0x3, 0xc3,0x80,0x28, +0x20,0xb, 0x6, 0x20,0xc, 0x3, 0x30,0xe, 0x3, 0xc3,0x80,0x1c,0x12,0x8b,0xcb,0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0x6e,0x70,0xff,0x5e,0x73,0x73,0x1f,0x7a,0x73,0x73, +0x1f,0x12,0x8b,0xd2,0xd3,0x80,0x1, 0xd3,0xda,0xf8,0x22,0x7e,0x34,0x0, 0x1, 0x7c, +0xbf,0x22,0x7e,0x73,0x76,0x14,0x7e,0xb3,0x76,0x2f,0x70,0x3a,0xe5,0x1e,0x70,0x1d, +0x7e,0x63,0x76,0x12,0xbe,0x60,0x14,0x28,0x5, 0x7e,0x60,0x14,0x80,0x7, 0xa5,0xbe, +0x0, 0x3, 0x7e,0x60,0x1, 0xa, 0x26,0x7e,0x34,0x0, 0x64,0x80,0x74,0xe5,0x1e,0xb4, +0x3, 0x2, 0x80,0x44,0x12,0x8c,0x90,0xb4,0x1, 0x6, 0x7e,0x34,0x1, 0xf4,0x80,0x61, +0x7e,0x34,0x3, 0xe8,0x80,0x5b,0xe5,0x1e,0x70,0xe, 0x7e,0x63,0x76,0x13,0xbe,0x60, +0x7f,0x28,0x53,0x7e,0x60,0x7f,0x80,0x4e,0x7e,0x63,0x29,0xfc,0xbe,0x60,0x3b,0x40, +0x12,0x12,0x8c,0x90,0xb4,0x1, 0x6, 0x7e,0x34,0x1, 0xf4,0x80,0x26,0x7e,0x34,0x3, +0xe8,0x80,0x20,0xe5,0x1e,0xb4,0x3, 0x8, 0x7e,0x73,0x76,0x49,0xa, 0x37,0x80,0x15, +0x30,0x1a,0x18,0x12,0x8c,0x90,0xb4,0x1, 0x6, 0x7e,0x34,0x1, 0xf4,0x80,0x4, 0x7e, +0x34,0x3, 0xe8,0x8d,0x32,0x1b,0x34,0x7c,0x67,0x80,0xb, 0xa, 0x27,0x7e,0x34,0x3, +0xe8,0x12,0x22,0x71,0x7c,0x67,0x7e,0x73,0x76,0x36,0xac,0x67,0x7e,0x24,0x0, 0x18, +0x12,0x22,0x71,0x7a,0x73,0x77,0xd4,0xc2,0x14,0x6d,0x33,0x7a,0x37,0x77,0xd0,0x22, +0x7e,0xb3,0x77,0xd9,0xa, 0x27,0x22,0x7e,0xa1,0x2a,0x74,0xa, 0xa4,0x49,0x35,0x29, +0x8c,0x7d,0xb3,0x7f,0x70,0x7d,0x3b,0x12,0x89,0x8a,0x7c,0x7b,0xa, 0x57,0x2e,0x54, +0x0, 0xb, 0x7e,0x18,0x0, 0x1, 0x60,0x5, 0x2f,0x11,0x14,0x78,0xfb,0x74,0x4, 0x2f, +0x11,0x14,0x78,0xfb,0x7d,0x1b,0x12,0x22,0xbd,0x7f,0x61,0xbe,0xb4,0x0, 0x10,0x68, +0x6e,0x7e,0x73,0x6e,0xaf,0x7a,0x73,0x65,0x1e,0x7e,0x73,0x6e,0xb0,0x7a,0x73,0x65, +0x1f,0x74,0xb, 0x7a,0xb3,0x65,0x20,0x7d,0xaf,0x7a,0xa7,0x65,0x22,0x7a,0xa7,0x65, +0x26,0xbe,0xb4,0x0, 0x2, 0x38,0xd, 0xe4,0x7a,0xb3,0x65,0x20,0x7e,0xd4,0x0, 0x10, +0x8d,0xdb,0x6d,0xcc,0x7e,0x8, 0x65,0x1e,0x7d,0x3d,0x12,0x9, 0x50,0x7e,0x47,0x73, +0x21,0x7e,0xa0,0x4, 0x7d,0x34,0x3e,0x34,0x7f,0x57,0x2d,0xb3,0xb, 0x5a,0x10,0x7f, +0x16,0x12,0x22,0xb4,0x7e,0xb3,0x65,0x20,0x60,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3, +0x4e,0x60,0x80,0x14,0x78,0xf4,0x1b,0x5a,0x30,0xb, 0x44,0x1b,0xa0,0x78,0xd5,0x22, +0xca,0xd8,0xca,0x79,0xd2,0x0, 0x12,0x4e,0x92,0x50,0xfb,0x7e,0xe3,0x77,0x6, 0x7a, +0xe3,0x25,0xaf,0x7e,0xd3,0x77,0x7, 0xa, 0x3e,0x9, 0xb3,0x77,0x0, 0x60,0x38,0xa, +0x3b,0x1b,0x34,0x7c,0xa7,0x7a,0xa3,0x76,0xa7,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x1, +0xe4,0x7a,0xb3,0x25,0xae,0xe4,0xa, 0x3e,0x19,0xb3,0x77,0x0, 0x9, 0xf3,0x77,0x2, +0x7c,0xbe,0x7c,0x7f,0x12,0x8e,0x47,0x7c,0xbe,0x7c,0x7f,0x12,0xc5,0xd6,0x7e,0xb3, +0x77,0x6, 0x4, 0x7a,0xb3,0x77,0x6, 0x7e,0x73,0x77,0x7, 0xbe,0x73,0x77,0x6, 0x38, +0x9, 0x12,0x28,0xaf,0x12,0x8e,0xd4,0x12,0x3b,0x72,0x7e,0xb3,0x25,0xae,0xbe,0xb0, +0x1, 0x68,0x7, 0x7e,0xb3,0x77,0xfa,0xb4,0x3, 0x46,0x74,0xa, 0xac,0xbf,0x49,0x35, +0x29,0x8c,0x7e,0xf, 0x24,0x60,0x12,0x8c,0xa1,0x7c,0xbe,0x7c,0x7f,0x12,0x8e,0x78, +0x92,0x0, 0x7e,0xb3,0x77,0xd9,0x70,0xc, 0xbe,0xe0,0x1, 0x40,0x7, 0xe4,0x7a,0xb3, +0x25,0xae,0xc2,0x0, 0x7c,0xbe,0x7c,0x7f,0x12,0xc3,0x47,0x30,0x0, 0x12,0x12,0x76, +0xeb,0x7c,0xbe,0x7c,0x7f,0x12,0xc2,0x79,0x7a,0xe3,0x76,0xa8,0x7a,0xf3,0x77,0xe5, +0x7e,0xb3,0x77,0xfa,0xb4,0x1, 0x3, 0x12,0x92,0x2d,0x7c,0xbd,0x14,0xbc,0xbe,0x78, +0x3, 0x12,0xb, 0xe5,0x12,0xd2,0xf2,0x12,0x75,0x1b,0x50,0x7, 0x7c,0xbf,0x7c,0x7e, +0x12,0xc0,0xa1,0xda,0x79,0xda,0xd8,0x22,0xca,0xf8,0x6c,0xff,0x12,0x8d,0x40,0xb, +0xf0,0x7e,0x73,0x77,0x7, 0xbc,0x7f,0x38,0xf3,0x12,0x8e,0x3f,0xda,0xf8,0x22,0x7e, +0xb3,0x76,0xa8,0x7e,0x73,0x77,0xe5,0x14,0x68,0x1d,0x4, 0x78,0x1a,0x7e,0x8, 0xc, +0x18,0x7a,0xf, 0x24,0x60,0x7e,0x8, 0x14,0x30,0x7a,0xf, 0x24,0x64,0xa5,0xbf,0x3, +0x16,0x7e,0x18,0x1c,0x48,0x80,0xc, 0x7e,0x18,0x10,0x24,0x7a,0x1f,0x24,0x60,0x7e, +0x18,0x18,0x3c,0x7a,0x1f,0x24,0x64,0x22,0x7c,0x67,0x7c,0x7b,0xd2,0x1, 0x7e,0xb3, +0x77,0xfa,0xb4,0x3, 0x4c,0x7c,0xb6,0x12,0x8f,0x4b,0x50,0x45,0x7e,0xa3,0x76,0x85, +0xbe,0xa0,0x2, 0x40,0x32,0x7e,0xb3,0x76,0x8d,0x70,0x28,0x7e,0x63,0x78,0x41,0xa, +0x26,0x2e,0x24,0x0, 0xe, 0x12,0xc5,0x13,0x24,0xff,0x92,0x1, 0x7c,0xb6,0x4, 0x7a, +0xb3,0x78,0x41,0x7e,0x63,0x78,0x41,0xbe,0x60,0x4, 0x40,0x15,0xe4,0x7a,0xb3,0x78, +0x41,0x80,0xe, 0xd2,0x1, 0x80,0xa, 0xbc,0xa7,0x78,0x4, 0xd2,0x1, 0x80,0x2, 0xc2, +0x1, 0xa2,0x1, 0x22,0x12,0xc7,0xb7,0xc2,0x17,0x7e,0xb3,0x74,0x81,0x60,0x67,0x12, +0x8f,0x47,0x40,0x10,0x7e,0xa3,0x74,0x7f,0x74,0x26,0xa4,0x9, 0x75,0x74,0x83,0xbe, +0x70,0x1, 0x40,0x52,0x7e,0x73,0x74,0x7f,0xb, 0x70,0xbe,0x70,0x3, 0x40,0x2, 0x6c, +0x77,0x7e,0x14,0x0, 0x1, 0x7c,0xb7,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x7e,0x63, +0x74,0x7b,0xa, 0x26,0x5d,0x21,0xbe,0x24,0x0, 0x0, 0x8, 0x9, 0xb, 0x70,0xbe,0x70, +0x3, 0x40,0x2, 0x6c,0x77,0x7e,0x63,0x74,0x7e,0xbc,0x67,0x78,0x9, 0x7e,0xb3,0x74, +0x80,0x4, 0x7a,0xb3,0x74,0x80,0x12,0xc1,0xa2,0x7e,0xb3,0x77,0xe1,0x38,0x4, 0x7c, +0x76,0x80,0x0, 0x2, 0x35,0x5a,0x22,0x7e,0xb3,0x77,0xe1,0x7c,0xab,0xd2,0x2, 0x7e, +0xb3,0x77,0xd9,0x70,0x4, 0xc2,0x2, 0x80,0xb, 0x4c,0xaa,0x68,0x5, 0xbe,0xa0,0x3, +0x78,0x2, 0xc2,0x2, 0xa2,0x2, 0x22,0xd2,0x4, 0x12,0x36,0xe7,0x7c,0xbf,0x22,0x7e, +0x63,0x74,0x7e,0x7e,0x70,0x26,0x22,0x7e,0x24,0xc, 0x18,0x7e,0x14,0x10,0x24,0x22, +0x6d,0x33,0x12,0x8f,0x77,0x7e,0x57,0x76,0xdc,0x12,0x8f,0xbf,0xe4,0x2, 0x8f,0x90, +0x7a,0xb3,0x77,0x2, 0x7a,0xb3,0x77,0x3, 0x22,0x7e,0x34,0x0, 0x2, 0x12,0x8f,0x77, +0x7e,0x57,0x76,0xec,0x12,0x8f,0xbf,0x74,0x2, 0x2, 0x8f,0x90,0x7e,0x34,0x0, 0x1, +0x12,0x8f,0x77,0x7e,0x57,0x76,0xe4,0x12,0x8f,0xbf,0x74,0x1, 0x2, 0x8f,0x90,0x7c, +0x1b,0x7d,0x43,0x7e,0xa3,0x76,0xfc,0xbe,0xa0,0x5, 0x50,0x1e,0x7e,0x70,0x7, 0xac, +0x7a,0x59,0x43,0x77,0x8, 0x59,0x23,0x77,0xa, 0x59,0x13,0x77,0xc, 0x19,0x13,0x77, +0xe, 0x7c,0xba,0x4, 0x7a,0xb3,0x76,0xfc,0xc3,0x22,0xd3,0x22,0x7e,0x34,0x0, 0x3, +0x12,0x8f,0x77,0x7e,0x57,0x76,0xf4,0x12,0x8f,0xbf,0x74,0x3, 0x2, 0x8f,0x90,0x7e, +0xb3,0x6e,0xa2,0x60,0x2, 0x41,0x6, 0x12,0x92,0x25,0x78,0x2, 0x41,0x6, 0x7e,0xa3, +0x6c,0xde,0xbe,0xa0,0x1, 0x78,0x1b,0x7e,0xb3,0x6c,0xf4,0x70,0x15,0x7e,0xb3,0x6b, +0x54,0x7a,0xb3,0x77,0x73,0x7e,0xb3,0x6b,0x55,0x7a,0xb3,0x77,0x74,0xe4,0x7a,0xb3, +0x77,0x75,0xbe,0xa0,0x0, 0x28,0x3e,0xc2,0x0, 0x6c,0x11,0x80,0x21,0x12,0x92,0x18, +0x7e,0x73,0x77,0x73,0xa, 0x27,0x1a,0x39,0x12,0x92,0xe, 0x58,0xf, 0x7e,0x73,0x77, +0x74,0xa, 0x27,0x1a,0x30,0x12,0x92,0xe, 0x58,0x2, 0xd2,0x0, 0xb, 0x10,0x12,0x92, +0x7, 0x38,0xda,0x30,0x0, 0xc, 0x7e,0xb3,0x77,0x75,0xbe,0xb0,0xc8,0x50,0xb, 0x4, +0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x77,0x75,0x7e,0x73,0x6c,0xde,0xbe,0x70, +0x2, 0x50,0x2, 0x41,0x6, 0x7e,0xb3,0x6e,0x7d,0xb4,0x1, 0x2, 0x80,0x2, 0x41,0x6, +0x6d,0xee,0x6c,0x11,0x80,0x1a,0x12,0x92,0x18,0x12,0x57,0xf4,0x7d,0xd3,0xbd,0xde, +0x8, 0xc, 0x7d,0xed,0x7a,0x93,0x6c,0xe6,0x7a,0x3, 0x6c,0xe7,0x7c,0x81,0xb, 0x10, +0x12,0x92,0x7, 0x38,0xe1,0x6c,0x11,0x21,0xff,0xbc,0x81,0x78,0x2, 0x21,0xfd,0x7e, +0x30,0x2, 0xac,0x31,0x9, 0xb1,0x6b,0x54,0xf5,0x2a,0x9, 0xb1,0x6b,0x55,0xf5,0x2b, +0x7e,0xa3,0x6c,0xe6,0x7a,0xa1,0x2c,0x7e,0xb3,0x6c,0xe7,0xf5,0x2d,0xbe,0xa1,0x2a, +0x28,0x4, 0xe5,0x2a,0x80,0x2, 0xe5,0x2c,0xf5,0x26,0xe5,0x2c,0xbe,0xb1,0x2a,0x50, +0x4, 0xe5,0x2a,0x80,0x2, 0xe5,0x2c,0xf5,0x28,0xe5,0x2d,0xbe,0xb1,0x2b,0x28,0x4, +0xe5,0x2b,0x80,0x2, 0xe5,0x2d,0xf5,0x27,0xe5,0x2d,0xbe,0xb1,0x2b,0x50,0x5, 0x7e, +0xa1,0x2b,0x80,0x3, 0x7e,0xa1,0x2d,0x7a,0xa1,0x29,0xe5,0x26,0x1a,0xfb,0xe5,0x28, +0x1a,0x1b,0x9d,0x1f,0xb, 0x14,0x7c,0xb3,0xf5,0x2e,0xe5,0x27,0x1a,0x1b,0x1a,0x5a, +0x9d,0x51,0xb, 0x54,0xf5,0x2f,0x12,0x57,0x4, 0x7d,0xf3,0xe5,0x2f,0xbe,0xb1,0x2e, +0x50,0x50,0xe5,0x27,0xbe,0xb0,0x0, 0x8, 0x2, 0x15,0x27,0x7e,0x73,0x6e,0xb2,0xa, +0xc7,0x1b,0xc4,0xe5,0x29,0x1a,0x1b,0xbd,0x1c,0x58,0x2, 0x5, 0x29,0x7e,0x91,0x28, +0x12,0x57,0x4, 0x7d,0xe3,0x80,0x23,0x1b,0x90,0x6d,0xdd,0x7e,0x1, 0x29,0x80,0xe, +0x12,0x57,0xf4,0xbd,0x3d,0x8, 0x5, 0x12,0x57,0xf4,0x7d,0xd3,0x1b,0x0, 0xe5,0x27, +0xbc,0xb0,0x8, 0xec,0xbd,0xde,0x58,0x2, 0x7d,0xed,0xe5,0x26,0xbc,0xb9,0x48,0xd7, +0x80,0x4e,0xe5,0x26,0xbe,0xb0,0x0, 0x8, 0x2, 0x15,0x26,0x7e,0x73,0x6e,0xb1,0xa, +0xc7,0x1b,0xc4,0xe5,0x28,0x1a,0x1b,0xbd,0x1c,0x58,0x2, 0x5, 0x28,0x7e,0x1, 0x29, +0x12,0x57,0x4, 0x7d,0xe3,0x80,0x23,0x1b,0x0, 0x6d,0xdd,0x7e,0x91,0x28,0x80,0xe, +0x12,0x57,0xf4,0xbd,0x3d,0x8, 0x5, 0x12,0x57,0xf4,0x7d,0xd3,0x1b,0x90,0xe5,0x26, +0xbc,0xb9,0x8, 0xec,0xbd,0xde,0x58,0x2, 0x7d,0xed,0xe5,0x27,0xbc,0xb0,0x48,0xd7, +0x7d,0x3f,0x3e,0x34,0x3e,0x34,0x7e,0x24,0x0, 0xa, 0x12,0x22,0x71,0xbd,0x3e,0x58, +0xc, 0x7e,0x73,0x77,0x75,0xbe,0x70,0x28,0x50,0x3, 0x12,0x57,0x45,0xb, 0x10,0x12, +0x92,0x7, 0x28,0x2, 0x1, 0xb9,0x22,0x7e,0x73,0x6c,0xde,0xbc,0x71,0x22,0x9d,0x32, +0x12,0x24,0x56,0xbe,0x34,0x0, 0x2, 0x22,0x74,0x2, 0xac,0xb1,0x9, 0x95,0x6b,0x54, +0x9, 0x5, 0x6b,0x55,0x22,0x7e,0xb3,0x6e,0xa3,0xbe,0xb0,0x1, 0x22,0x6d,0x11,0x7d, +0x21,0x7d,0x31,0x80,0x1f,0x7d,0x1, 0x3e,0x4, 0x7e,0x2f,0x24,0x60,0x2d,0x50,0xb, +0x2a,0x0, 0xbe,0x4, 0x3a,0x98,0x28,0x2, 0xb, 0x24,0xbe,0x4, 0xb, 0xb8,0x50,0x2, +0xb, 0x34,0xb, 0x14,0x7e,0x7, 0x73,0x21,0xbd,0x1, 0x38,0xd9,0xbe,0x24,0x0, 0xb4, +0x28,0x7, 0x7e,0xb3,0x77,0x70,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x77,0x70,0xbe,0x34, +0x0, 0x32,0x28,0x7, 0x7e,0xb3,0x77,0x72,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x77,0x72, +0x7e,0xa3,0x77,0x70,0xbe,0xa0,0x2, 0x40,0x6, 0x74,0xaa,0x7a,0xb3,0x76,0x77,0xbe, +0xa0,0x4, 0x50,0x9, 0x7e,0x73,0x77,0x72,0xbe,0x70,0x4, 0x40,0x3, 0x75,0xe9,0xff, +0x22,0x7c,0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x6b,0x54,0x9, 0x73,0x6b,0x55, +0x2, 0x57,0x9, 0xca,0x3b,0x7c,0xf4,0x7a,0x51,0x2b,0x7c,0xe6,0x7c,0xd7,0x7c,0xcb, +0x75,0x35,0x0, 0x75,0x36,0x0, 0x75,0x37,0x0, 0x75,0x38,0x0, 0x75,0x39,0x0, 0x75, +0x3a,0x0, 0x75,0x3f,0x0, 0x7e,0x37,0x6e,0x9f,0x7a,0x35,0x40,0x6c,0xaa,0x7e,0x71, +0x2b,0x74,0x9, 0xac,0x7b,0x19,0xa3,0x6b,0xd5,0xe4,0x19,0xb3,0x6b,0xd6,0x7e,0x13, +0x6e,0xaf,0x7e,0xb3,0x6e,0xb0,0xf5,0x34,0x12,0xe6,0x19,0xf5,0x32,0x9, 0xb3,0x6b, +0x55,0xf5,0x33,0x7c,0xbe,0x12,0x92,0xa1,0x12,0x97,0x87,0x7a,0x35,0x40,0x7e,0x37, +0x6e,0x9f,0xbe,0x35,0x40,0x8, 0x3, 0x7a,0x35,0x40,0xe5,0x32,0x7c,0x71,0x7c,0x6c, +0x7e,0x8, 0x0, 0x37,0x12,0x95,0x74,0xf5,0x35,0xe5,0x33,0x7e,0x71,0x34,0x7c,0x6d, +0x7e,0x8, 0x0, 0x38,0x12,0x95,0x74,0xf5,0x36,0xbe,0xf0,0x1, 0xe5,0x37,0x7e,0x71, +0x38,0x78,0xb, 0x12,0x57,0xe7,0x3e,0x34,0x2e,0x34,0x20,0x54,0x80,0x3, 0x12,0x57, +0xd9,0x7a,0x35,0x3d,0x7a,0x37,0x62,0xbe,0x7e,0x34,0x24,0xbc,0x7a,0x37,0x62,0xc0, +0xe5,0x37,0x7a,0xb3,0x62,0xb8,0xe5,0x38,0x7a,0xb3,0x62,0xb9,0xe5,0x35,0x7a,0xb3, +0x62,0xba,0xe5,0x36,0x7a,0xb3,0x62,0xbb,0x7e,0x73,0x6e,0x8a,0x7a,0x73,0x62,0xbc, +0xe4,0x7a,0xb3,0x62,0xbd,0x7e,0x8, 0x62,0xb8,0x12,0x8, 0x73,0x7e,0x37,0x24,0xbc, +0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x24,0xbe,0x6d,0xaa,0x2f,0x51,0x7e,0x37,0x24,0xc0, +0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x24,0xc2,0x2f,0x10,0x7a,0x1d,0x2c,0x7e, +0x37,0x24,0xc4,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x24,0xc6,0x6d,0x88,0x2f,0x41,0x7f, +0x65,0xe5,0x35,0xa, 0x4b,0xe5,0x37,0xa, 0x5b,0x2d,0x54,0xf5,0x39,0xe5,0x36,0xa, +0x4b,0xe5,0x38,0xa, 0x5b,0x2d,0x54,0xf5,0x3a,0x85,0x37,0x30,0x81,0xc4,0x85,0x38, +0x31,0x81,0xb9,0xbe,0xf0,0x1, 0x78,0x15,0xe5,0x34,0x7e,0x71,0x30,0xac,0x7b,0xe5, +0x31,0xa, 0x2b,0x2d,0x32,0x3e,0x34,0x49,0x33,0x20,0x54,0x80,0x8, 0xe5,0x30,0x7e, +0x71,0x31,0x12,0x57,0x9, 0x7e,0x53,0x6e,0x8a,0xa, 0x25,0x9d,0x32,0x12,0xe6,0xae, +0x18,0x2, 0x81,0xb7,0x7e,0x35,0x40,0xbe,0x35,0x3b,0x18,0x2, 0x5, 0x3f,0xe5,0x32, +0xa, 0x1b,0xe5,0x30,0x12,0x95,0x69,0x8, 0x4, 0x9d,0x31,0x80,0x4, 0x6d,0x33,0x9d, +0x32,0xbe,0x34,0x0, 0x1, 0x18,0x19,0xe5,0x33,0xa, 0x1b,0xe5,0x31,0x12,0x95,0x69, +0x8, 0x4, 0x9d,0x31,0x80,0x4, 0x6d,0x33,0x9d,0x32,0xbe,0x34,0x0, 0x1, 0x8, 0x67, +0xbe,0xc0,0x3, 0x40,0x9, 0xbe,0xd0,0x3, 0x40,0x4, 0xd2,0x0, 0x80,0x2, 0xc2,0x0, +0xe5,0x30,0x7e,0x71,0x31,0x7c,0x6e,0x12,0x99,0x7f,0x7c,0x9b,0xbe,0x90,0x2, 0x68, +0x5, 0xbe,0x90,0x3, 0x78,0x8, 0x7e,0x35,0x3b,0xe, 0x34,0x7a,0x35,0x3b,0xbe,0x90, +0x2, 0x68,0xa, 0xbe,0x90,0x1, 0x68,0x5, 0xbe,0x90,0x3, 0x78,0x2a,0x7e,0xf5,0x3b, +0x12,0x95,0x53,0xe5,0x30,0x12,0x95,0x5a,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a, +0x1d,0x2c,0x12,0x95,0x53,0xe5,0x31,0x12,0x95,0x5a,0x9f,0x41,0x12,0x95,0x53,0x9f, +0x51,0x1a,0x26,0x1a,0x24,0x9f,0x61,0x5, 0x31,0xe5,0x3a,0xbe,0xb1,0x31,0x28,0x2, +0x61,0xe3,0x5, 0x30,0xe5,0x39,0xbe,0xb1,0x30,0x28,0x2, 0x61,0xde,0xbe,0x58,0x0, +0x0, 0x78,0x2, 0xb, 0x5c,0xbe,0x68,0x0, 0x0, 0x78,0x2, 0xb, 0x6c,0x74,0x6, 0x7e, +0x1d,0x2c,0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x2c,0x7f,0x5, 0x12,0x95,0x61,0x7e, +0xf1,0x2b,0x74,0x9, 0xac,0xfb,0x59,0x37,0x6b,0xd0,0x74,0x6, 0x2f,0x44,0x14,0x78, +0xfb,0x7f,0x14,0x7f,0x6, 0x12,0x95,0x61,0x59,0x37,0x6b,0xd2,0x7e,0xb3,0x6e,0x9e, +0x60,0xd, 0x1e,0xd4,0x1e,0xc4,0x50,0x4, 0x4e,0xd4,0x80,0x0, 0x14,0x78,0xf3,0xbe, +0x68,0x0, 0x7f,0x28,0x4, 0x7e,0x68,0x0, 0x7f,0x7d,0x3d,0x19,0x77,0x6b,0xd5,0xe5, +0x3f,0x19,0xb7,0x6b,0xd6,0x9, 0x77,0x6b,0xd6,0xbe,0x70,0x2d,0x28,0x6, 0x74,0x2d, +0x19,0xb7,0x6b,0xd6,0xe5,0x32,0x19,0xb7,0x6b,0xd7,0xe5,0x33,0x19,0xb7,0x6b,0xd8, +0xda,0x3b,0x22,0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x22,0xa, 0x1b,0x6d,0x0, 0x2, 0x22, +0xa3,0x12,0x22,0xbf,0x2e,0x18,0x0, 0x20,0x22,0xa, 0x3b,0x7d,0x23,0x9d,0x21,0xbe, +0x24,0x0, 0x0, 0x22,0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c,0x9b,0xa, 0x2f,0x7d,0x32, +0x3e,0x34,0xb, 0x34,0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, 0xf8,0x1b,0xf4,0xa, 0x3f, +0x9d,0xf3,0xa, 0x39,0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, 0x39,0x80,0x1d,0xbc,0xf9, +0x28,0xd, 0xa, 0x39,0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c,0xab,0xe4,0x80,0x10,0xa, +0x3f,0xa, 0x58,0x2d,0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab,0x9d,0x32,0x7c,0xb7,0x7a, +0xb, 0xb0,0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x7c,0xf5,0x7c,0xe6,0x7c,0x6b,0x74, +0x2, 0xac,0xbe,0x9, 0xc5,0x6b,0x54,0x9, 0xd5,0x6b,0x55,0x7e,0x53,0x6c,0xde,0xbe, +0x50,0x2, 0x28,0x17,0x74,0x9, 0xac,0xbe,0x9, 0x55,0x6b,0xd6,0xbe,0x50,0xf, 0x50, +0xa, 0x7c,0xb6,0x7c,0x6e,0x7c,0x5f,0x6c,0x44,0x80,0x1d,0x7c,0xbc,0x7c,0x7d,0x12, +0x97,0x96,0x12,0x96,0x1e,0x7c,0xbc,0x7c,0x7d,0x12,0x9a,0x22,0x74,0x6, 0x7e,0x70, +0x6, 0x7c,0x6e,0x7c,0x5f,0x7e,0x40,0x1, 0x12,0x92,0xb3,0xda,0x3b,0x22,0xca,0x79, +0xc2,0x0, 0x7e,0x7, 0x73,0xcf,0xb, 0x4, 0x7d,0x40,0xe, 0x44,0xe, 0x44,0xe, 0x44, +0x9f,0x11,0x6d,0xff,0x6d,0x11,0x6c,0xee,0x6c,0xff,0x1a,0x5f,0x3e,0x54,0x1a,0xce, +0x7e,0xd4,0x0, 0x1a,0xad,0xdc,0x2d,0x5d,0x49,0xe5,0x73,0x27,0xbd,0x4e,0x58,0x10, +0xbd,0xe, 0x8, 0xc, 0x7d,0x5e,0x7d,0xde,0x1a,0x5a,0x1a,0xca,0x2f,0x16,0xb, 0x14, +0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xd3,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xca,0xbe,0x14, +0x0, 0x0, 0x28,0x5, 0x12,0x22,0xbd,0x7d,0xf3,0x7e,0x8, 0x62,0xb8,0x12,0x97,0x8e, +0x6c,0xee,0x6c,0xff,0x1a,0xef,0x3e,0xe4,0x1a,0x2e,0x7e,0x34,0x0, 0x1a,0xad,0x32, +0x7d,0x23,0x2d,0x2e,0x49,0xe2,0x73,0x27,0xbe,0xe4,0x0, 0x0, 0x8, 0x10,0x7d,0x3e, +0x9d,0x3f,0xbe,0x34,0x0, 0x0, 0x58,0x2, 0x6d,0x33,0x59,0x32,0x62,0xb8,0xb, 0xf0, +0xbe,0xf0,0xd, 0x78,0xcf,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xc6,0x7e,0x8, 0x64,0xa, +0x7e,0x34,0x0, 0xa9,0xe4,0x12,0x24,0x34,0x74,0x1, 0x7a,0xb3,0x64,0x5e,0x7e,0xf0, +0x6, 0x7e,0xe0,0x6, 0x12,0x97,0x76,0xb4,0x1, 0x3, 0x12,0x9a,0x94,0x1b,0xe0,0xbe, +0xe0,0x0, 0x58,0xf0,0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe6,0x7e,0xf0,0x6, 0x7e,0xe0, +0x7, 0x12,0x97,0x76,0xb4,0x1, 0x3, 0x12,0x9a,0x94,0xb, 0xe0,0xbe,0xe0,0xd, 0x78, +0xf0,0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe6,0x7e,0xf0,0x7, 0x7e,0xe0,0x6, 0x12,0x97, +0x76,0xb4,0x1, 0x3, 0x12,0x9a,0x94,0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xf0,0xb, 0xf0, +0xbe,0xf0,0xd, 0x78,0xe6,0x7e,0xf0,0x7, 0x7e,0xe0,0x7, 0x12,0x97,0x76,0xb4,0x1, +0x3, 0x12,0x9a,0x94,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xf0,0xb, 0xf0,0xbe,0xf0,0xd, +0x78,0xe6,0x6c,0xee,0x6c,0xff,0x1a,0x2e,0x7e,0x34,0x0, 0xd, 0xad,0x32,0x1a,0x2f, +0x2d,0x32,0x9, 0xb3,0x64,0xa, 0x70,0xd, 0x6d,0x33,0x3e,0x24,0x1a,0xe, 0x12,0x97, +0xef,0x59,0x32,0x73,0x27,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xda,0xb, 0xe0,0xbe,0xe0, +0xd, 0x48,0xd1,0xda,0x79,0x22,0x1a,0xe, 0x7e,0x14,0x0, 0xd, 0xad,0x10,0x1a,0x3f, +0x2d,0x31,0x9, 0xb3,0x64,0xa, 0x22,0x7e,0x24,0x0, 0x3, 0x2, 0x22,0x71,0x7e,0x34, +0x1, 0x52,0xe4,0x2, 0x24,0x34,0xca,0xf8,0x7c,0xa7,0x7c,0xfb,0x7e,0x8, 0x73,0x27, +0x12,0x97,0x8e,0x74,0xfa,0x7e,0x70,0xfa,0x12,0x9a,0x89,0x48,0x32,0x12,0x9a,0x80, +0x58,0x2d,0x1a,0x17,0xa, 0x4a,0x2d,0x41,0xbe,0x44,0x0, 0x0, 0x48,0x21,0x7e,0x63, +0x6e,0xb0,0xa, 0x16,0xbd,0x41,0x58,0x17,0xad,0x10,0x2d,0x41,0x3e,0x44,0x49,0x44, +0x4, 0x0, 0x1a,0x27,0x3e,0x24,0x1a,0xb, 0x12,0x97,0xef,0x59,0x42,0x73,0xcf,0xb, +0x70,0xbe,0x70,0x6, 0x8, 0xc2,0x4, 0xbe,0xb0,0x6, 0x8, 0xb9,0xda,0xf8,0x22,0x7e, +0x14,0x0, 0x1a,0xad,0x10,0x2d,0x21,0x22,0x7e,0x37,0x6e,0x8b,0x7e,0x53,0x6e,0xb1, +0xbc,0x5b,0x38,0x4, 0x7e,0x37,0x6e,0x91,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, 0x1a, +0x0, 0x1b,0x2a,0x0, 0x1b,0x1a,0x10,0x22,0xca,0x3b,0x6c,0xff,0x6c,0xee,0x7e,0xb3, +0x6e,0xb1,0xf5,0x2a,0x7e,0xd3,0x6e,0xb2,0xe4,0x7a,0xb3,0x74,0x7a,0x7e,0xb3,0x25, +0xae,0xb4,0x1, 0x2, 0x80,0x2, 0x21,0x22,0x6c,0xcc,0x21,0x10,0x7e,0x70,0x2, 0xac, +0x7c,0x12,0x5f,0xb7,0x75,0x26,0x3, 0x75,0x27,0x3, 0x12,0x5f,0xaf,0xbe,0x37,0x6e, +0x8d,0x58,0x2, 0x21,0xe, 0x7e,0x73,0x6c,0xde,0xbe,0x70,0x5, 0x28,0x6, 0x75,0x26, +0x2, 0x75,0x27,0x2, 0xe5,0x28,0xbe,0xb0,0x1, 0x68,0x9, 0xe5,0x2a,0x24,0xfe,0xbe, +0xb1,0x28,0x78,0x3, 0x75,0x26,0x2, 0xe5,0x29,0xbe,0xb0,0x1, 0x68,0x9, 0x7c,0xbd, +0x24,0xfe,0xbe,0xb1,0x29,0x78,0x3, 0x75,0x27,0x2, 0xe5,0x28,0x60,0x8, 0xe5,0x2a, +0x14,0xbe,0xb1,0x28,0x78,0x3, 0x75,0x26,0x2, 0xe5,0x29,0x60,0x8, 0x7c,0xbd,0x14, +0xbe,0xb1,0x29,0x78,0x3, 0x75,0x27,0x2, 0xc2,0x0, 0xe5,0x28,0x7e,0x71,0x29,0x7c, +0x6c,0x12,0x99,0x7f,0xbe,0xb0,0xff,0x68,0x6, 0x75,0x26,0x2, 0x75,0x27,0x2, 0x7c, +0xbc,0x7e,0x8, 0x0, 0x26,0x7e,0x18,0x0, 0x27,0x12,0x99,0x28,0x7e,0xb3,0x6e,0xa2, +0x60,0x6, 0x75,0x26,0x4, 0x75,0x27,0x4, 0xe5,0x26,0x7e,0x71,0x27,0x7c,0x6c,0x7c, +0x5e,0x12,0x95,0xc7,0x7e,0x70,0x9, 0xac,0x7e,0x9, 0x53,0x6b,0xd6,0xbc,0x5f,0x28, +0x2, 0x7c,0xf5,0x90,0x21,0xd9,0xe4,0x93,0xb4,0x1, 0x11,0x7d,0x13,0x2e,0x14,0x6b, +0xd0,0x6d,0x0, 0x2e,0x34,0x6b,0xd2,0x6d,0x22,0x12,0x98,0x9, 0xb, 0xe0,0xb, 0xc0, +0x7e,0x73,0x6c,0xde,0xbc,0x7c,0x28,0x2, 0x1, 0x3c,0x7a,0xe3,0x6c,0xde,0x7a,0xf3, +0x74,0x7a,0xda,0x3b,0x22,0x2, 0x98,0x18,0x7c,0xab,0x7e,0xb3,0x6c,0xf4,0x7e,0x93, +0x6c,0xde,0x60,0x4a,0xb4,0x1, 0x5, 0xbe,0x90,0x2, 0x68,0x42,0x74,0x9, 0xa4,0x9, +0xa5,0x6b,0xd6,0xbe,0x90,0x1, 0x78,0x24,0xbe,0xa0,0x19,0x28,0x7, 0x74,0x6, 0x7a, +0xb, 0xb0,0x80,0x27,0xbe,0xa0,0x14,0x28,0x7, 0x74,0x5, 0x7a,0xb, 0xb0,0x80,0x1b, +0xbe,0xa0,0xa, 0x28,0x19,0x74,0x4, 0x7a,0xb, 0xb0,0x80,0xf, 0xbe,0x90,0x2, 0x78, +0xd, 0xbe,0xa0,0x14,0x28,0x8, 0x74,0x4, 0x7a,0xb, 0xb0,0x7a,0x1b,0xb0,0x22,0xca, +0x79,0x7c,0x5b,0x7e,0x40,0xff,0x7e,0xa0,0xff,0x6c,0x33,0x41,0x13,0xbc,0x63,0x78, +0x2, 0x41,0x11,0x7e,0x90,0x2, 0xac,0x93,0x9, 0x24,0x6b,0x54,0xa, 0xf2,0xa, 0x5, +0x9d,0xf, 0xbe,0x4, 0x0, 0x0, 0x8, 0xc, 0xa, 0xe2,0xa, 0xf5,0x9d,0xfe,0x7d,0x7f, +0x7c,0x2f,0x80,0x8, 0x6e,0x4, 0xff,0xff,0xb, 0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac, +0x13,0x9, 0xb0,0x6b,0x55,0xa, 0xb, 0xa, 0x47,0x9d,0x40,0xbe,0x44,0x0, 0x0, 0x8, +0x8, 0xa, 0xfb,0xa, 0x7, 0x9d,0xf, 0x80,0x4, 0x6d,0x0, 0x9d,0x4, 0xbe,0x20,0x1, +0x38,0xa, 0xbe,0x10,0x1, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x31,0xbe,0x20,0x2, 0x38, +0xa, 0xbe,0x10,0x2, 0x38,0x5, 0x7e,0x40,0x2, 0x80,0x10,0x30,0x0, 0xd, 0xbe,0x20, +0x3, 0x38,0x8, 0xbe,0x10,0x3, 0x38,0x3, 0x7e,0x40,0x3, 0xbc,0x4a,0x50,0x2, 0x7c, +0xa4,0xb, 0x30,0x7e,0x3, 0x6c,0xde,0xbc,0x3, 0x28,0x2, 0x21,0x8d,0x7c,0xba,0xda, +0x79,0x22,0xca,0xf8,0x7c,0xa7,0x7c,0xfb,0x7e,0x8, 0x20,0x54,0x12,0x37,0xef,0x74, +0xfa,0x7e,0x70,0xfa,0x12,0x9a,0x89,0x48,0x37,0x12,0x9a,0x80,0x58,0x32,0x1a,0x17, +0xa, 0x2a,0x2d,0x21,0xbe,0x24,0x0, 0x0, 0x48,0x26,0x7e,0x63,0x6e,0xb0,0xa, 0x16, +0xbd,0x21,0x58,0x1c,0x1a,0x47,0x3e,0x44,0x1a,0xeb,0x7e,0xf4,0x0, 0x1a,0xad,0xfe, +0x2d,0x4f,0x49,0x44,0x73,0xcf,0xad,0x10,0x2d,0x21,0x3e,0x24,0x59,0x42,0x20,0x54, +0xb, 0x70,0xbe,0x70,0x6, 0x8, 0xbd,0x4, 0xbe,0xb0,0x6, 0x8, 0xb4,0xda,0xf8,0x22, +0x7e,0x63,0x6e,0xaf,0xa, 0x16,0xbd,0x1, 0x22,0x1a,0x1b,0xa, 0xf, 0x2d,0x1, 0xbe, +0x4, 0x0, 0x0, 0x22,0x7e,0x18,0x62,0xb8,0x7a,0x1d,0x2b,0x7c,0xbe,0x7c,0x7f,0x7e, +0x8, 0x64,0xa, 0x7c,0xa7,0x7c,0x5b,0xbe,0x50,0x0, 0x28,0x1f,0x12,0x9b,0x42,0x2d, +0xf3,0x2e,0xf4,0xff,0xe6,0x12,0x9b,0x53,0x8, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x2, +0x7f,0x70,0x2d,0xf4,0x2e,0xf4,0xff,0xf3,0x7a,0x7b,0xb0,0xbe,0xa0,0x0, 0x28,0x1b, +0x12,0x9b,0x42,0x2d,0xf3,0x1b,0xf5,0x12,0x9b,0x53,0x8, 0x4, 0x74,0x1, 0x80,0x2, +0x74,0x2, 0x7f,0x70,0x2d,0xf4,0x1b,0xf4,0x7a,0x7b,0xb0,0xbe,0x50,0xc, 0x50,0x1d, +0x12,0x9b,0x42,0x2d,0xf3,0x69,0x37,0x0, 0x1a,0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0x74, +0x1, 0x80,0x2, 0x74,0x2, 0x7f,0x70,0x2d,0xf4,0x39,0xb7,0x0, 0xd, 0xbe,0xa0,0xc, +0x50,0x2f,0x7e,0x70,0xd, 0xac,0x75,0xa, 0x4a,0x2d,0x34,0x7d,0x43,0x3e,0x44,0x7e, +0x7d,0x2b,0x2d,0xf4,0x69,0x47,0x0, 0x2, 0xbe,0x44,0x0, 0x0, 0x8, 0x9, 0x74,0x1, +0x2d,0x13,0x39,0xb0,0x0, 0x1, 0x22,0x74,0x2, 0x2d,0x31,0x7d,0x20,0x39,0xb1,0x0, +0x1, 0x22,0x7e,0x90,0xd, 0xac,0x95,0xa, 0x3a,0x2d,0x43,0x7d,0x34,0x3e,0x34,0x7e, +0x7d,0x2b,0x22,0xb, 0x7a,0x30,0xbe,0x34,0x0, 0x0, 0x22,0x2, 0x9b,0x5e,0xca,0x3b, +0x6c,0xff,0xc2,0x0, 0x7e,0xb3,0x6e,0xa2,0x60,0x6, 0x7e,0xd4,0x1, 0xc2,0x80,0x4, +0x7e,0xd4,0x3, 0xe8,0x7e,0xb3,0x6e,0xa3,0xb4,0x1, 0x4, 0x7e,0xd4,0x0, 0xf0,0x7e, +0xc7,0x6c,0xe4,0x6c,0xee,0x81,0x1c,0xc2,0x0, 0x7c,0xbe,0x12,0x92,0xa1,0x7d,0xb3, +0x7e,0x90,0x2, 0xac,0x9e,0x9, 0xa4,0x6b,0x54,0x7c,0xda,0x9, 0xc4,0x6b,0x55,0x7d, +0xad,0x4c,0xdd,0x68,0x16,0x7e,0xb3,0x6e,0xb1,0x14,0xbc,0xbd,0x68,0xd, 0x4c,0xcc, +0x68,0x9, 0x7e,0xb3,0x6e,0xb2,0x14,0xbc,0xbc,0x78,0x8, 0x7d,0xad,0x1e,0xa4,0x2e, +0xa4,0x0, 0x64,0x7c,0xba,0x12,0x97,0xf8,0xbd,0x3b,0x58,0x4, 0xd2,0x0, 0x80,0x26, +0x7e,0x73,0x6e,0x7d,0xbe,0x73,0x6c,0xde,0x78,0x1c,0x7e,0x37,0x3, 0xfd,0xe, 0x34, +0xbd,0x3c,0x58,0x12,0x7c,0xbe,0x7e,0x70,0x1, 0x12,0x9c,0x32,0x7d,0x1a,0x6d,0x0, +0xbf,0x10,0x8, 0x2, 0xd2,0x0, 0x30,0x0, 0x21,0x7c,0xbe,0x12,0x2f,0xde,0x60,0x1a, +0x7e,0x34,0x0, 0x9, 0xca,0x39,0xac,0x7e,0x2e,0x34,0x6b,0xd0,0x6d,0x22,0x12,0x9d, +0x7, 0x6d,0x0, 0x12,0x24,0xf, 0x1b,0xfd,0xb, 0xf0,0xb, 0xe0,0x12,0x9d,0x0, 0x28, +0x2, 0x61,0x87,0x7a,0x73,0x6c,0xf3,0x7a,0xf3,0x6e,0x7c,0x7a,0xc7,0x3, 0xfd,0xda, +0x3b,0x22,0x7c,0x67,0x7c,0x7b,0x7e,0x50,0x2, 0xac,0x57,0x9, 0xa2,0x6b,0x54,0x9, +0x72,0x6b,0x55,0x90,0x21,0xfa,0xe4,0x93,0xbc,0xba,0x78,0x3, 0x9f,0x11,0x22,0x7c, +0xba,0x2, 0x9c,0x54,0x7c,0x16,0x7c,0x7, 0x7c,0x9b,0x7e,0xb3,0x6e,0xb1,0xf5,0x29, +0x7e,0xb3,0x6e,0xb2,0xf5,0x2a,0x9f,0x77,0xa, 0x31,0xa, 0x19,0x9d,0x13,0x7c,0x83, +0x80,0x7d,0x7a,0x81,0x27,0xbe,0x80,0x0, 0x58,0xc, 0x1a,0x58,0x1a,0x19,0x9d,0x15, +0xa, 0x59,0x2d,0x51,0xf5,0x27,0xe5,0x29,0xbc,0xb8,0x18,0xc, 0x1a,0x59,0x1a,0x18, +0x9d,0x15,0xa, 0x59,0x9d,0x51,0xf5,0x27,0xa, 0x11,0xa, 0x50,0x9d,0x51,0xf5,0x26, +0x80,0x3d,0x85,0x26,0x28,0xe5,0x26,0xbe,0xb0,0x0, 0x58,0xe, 0xe5,0x26,0x1a,0x5b, +0x1a,0x10,0x9d,0x15,0xa, 0x50,0x2d,0x51,0xf5,0x28,0xe5,0x2a,0xbe,0xb1,0x26,0x18, +0xe, 0x1a,0x30,0xe5,0x26,0x1a,0x1b,0x9d,0x13,0xa, 0x50,0x9d,0x51,0xf5,0x28,0xe5, +0x27,0x7e,0x71,0x28,0x12,0x57,0x9, 0x1a,0x26,0x1a,0x24,0x2f,0x71,0x5, 0x26,0xa, +0x21,0xa, 0x30,0x2d,0x32,0xe5,0x26,0x1a,0x1b,0xbd,0x13,0x8, 0xb5,0xb, 0x80,0xa, +0x11,0xa, 0x59,0x2d,0x51,0x1a,0x18,0xbd,0x15,0x18,0x2, 0x81,0x72,0x7f,0x17,0x22, +0x7e,0x73,0x6c,0xde,0xbc,0x7e,0x22,0x7e,0x30,0x9, 0xac,0x3f,0x2e,0x14,0x6d,0x14, +0x22,0xca,0xf8,0x7e,0xb3,0x6e,0x7c,0x70,0x17,0xe4,0x7a,0xb3,0x6e,0x85,0x12,0x71, +0x73,0x28,0x1f,0x74,0x1, 0x7a,0xb3,0x6e,0x81,0xe4,0x7a,0xb3,0x6e,0x84,0x80,0x12, +0x74,0x1, 0x7a,0xb3,0x6e,0x85,0x7e,0xb3,0x6e,0x7d,0x70,0x6, 0x74,0x1, 0x7a,0xb3, +0x6e,0x80,0x12,0x87,0x98,0xca,0x59,0x7e,0x18,0x6d,0x14,0x7e,0x8, 0x6d,0x6e,0x12, +0x24,0xf, 0x1b,0xfd,0x90,0x1c,0x2c,0xe4,0x93,0xbe,0xb0,0x0, 0x38,0x2, 0xc1,0x1a, +0x6c,0xff,0x80,0x24,0x74,0x9, 0xac,0xbf,0x49,0x35,0x6d,0x14,0x12,0x9f,0x92,0x74, +0x9, 0xac,0xbf,0x59,0x35,0x6d,0x6e,0x49,0x35,0x6d,0x16,0x12,0x9e,0x1d,0x74,0x9, +0xac,0xbf,0x59,0x35,0x6d,0x70,0xb, 0xf0,0x12,0x9f,0x71,0x38,0xd7,0x7e,0xa3,0x6e, +0x7c,0xbe,0xa0,0x1, 0x78,0x9, 0x7e,0xb3,0x6e,0x7d,0xb4,0x1, 0x2, 0x80,0xb, 0xbe, +0xa0,0x1, 0x78,0x16,0x7e,0xb3,0x6e,0x7d,0x70,0x10,0x7e,0x37,0x6d,0x6e,0x7a,0x37, +0x78,0x14,0x7e,0x37,0x6d,0x70,0x7a,0x37,0x78,0x16,0xbe,0xa0,0x1, 0x78,0x18,0x7e, +0xb3,0x6e,0x7d,0x70,0x12,0x7e,0x37,0x6d,0x6e,0x7a,0x37,0x78,0xf, 0x7e,0x37,0x6d, +0x70,0x7a,0x37,0x78,0x11,0x80,0x43,0xbe,0xa0,0x1, 0x78,0x2b,0x7e,0xb3,0x6e,0x7d, +0xb4,0x1, 0x24,0x7e,0x37,0x6d,0x70,0x9e,0x37,0x78,0x11,0x12,0x24,0x56,0x7d,0x13, +0x7e,0x37,0x6d,0x6e,0x9e,0x37,0x78,0xf, 0x12,0x24,0x56,0x2d,0x31,0xbe,0x34,0x0, +0x96,0x8, 0x17,0x74,0x1, 0x80,0xf, 0x4c,0xaa,0x78,0xf, 0x6d,0x33,0x7a,0x37,0x78, +0xf, 0x7a,0x37,0x78,0x11,0xe4,0x7a,0xb3,0x78,0x13,0xda,0xf8,0x22,0x7d,0x13,0x9f, +0x11,0x7e,0xf4,0x21,0xdc,0x12,0x9f,0x81,0x12,0x9f,0x89,0xb, 0x7a,0xf0,0x7e,0xd4, +0x21,0xee,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0xe0,0x90,0x1c,0x2c,0xe4,0x93,0x70,0x3, +0x7d,0x31,0x22,0x90,0x21,0xd9,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x6e,0xb1,0x80, +0x4, 0x7e,0x83,0x6e,0xb2,0x12,0x9f,0x79,0xbe,0x14,0x0, 0x3f,0x38,0x21,0x7e,0x24, +0x0, 0x3f,0x9d,0x21,0x7e,0x14,0x21,0xf2,0x12,0x9f,0x30,0xad,0x32,0x6d,0x22,0x12, +0x9f,0x14,0x12,0x9f,0x1b,0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f,0x10,0xe1,0x9, 0x7d, +0x54,0x9e,0x54,0x0, 0x3f,0xbd,0x51,0x38,0x35,0x7d,0x54,0x9e,0x54,0x0, 0x1f,0xbd, +0x51,0x40,0x76,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x21,0x9d,0x23,0x7e,0x14,0x21, +0xf4,0x12,0x9f,0x30,0xad,0x32,0x6d,0x22,0x12,0x9f,0x14,0x90,0x21,0xf1,0x12,0x9f, +0x1e,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0x12,0x9f,0x27,0x2f,0x10,0x80,0x4b,0x7d,0x50, +0x1b,0x54,0xbd,0x51,0x40,0x19,0x7d,0x30,0x9d,0x31,0x6d,0x22,0x7e,0x14,0x21,0xf6, +0x12,0x9f,0xa, 0x7d,0x1e,0x1b,0x14,0x6d,0x0, 0x9f,0x1, 0x7f,0x10,0x80,0x13,0x7d, +0x31,0x9d,0x30,0x6d,0x22,0x7e,0x14,0x21,0xf8,0x12,0x9f,0xa, 0x7d,0x1e,0x6d,0x0, +0x2f,0x10,0x12,0x9f,0x1b,0x58,0x4, 0x7f,0x10,0x80,0xe, 0x90,0x21,0xf1,0xe4,0x93, +0x12,0x9f,0x27,0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0x7e,0x4, 0x0, 0xff,0xb, 0xa, +0x10,0x12,0x22,0xb4,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x90,0x21,0xf0,0xe4,0x93, +0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22,0xa, 0xb, 0x7d,0x1f,0x9d,0x10,0x6d,0x0, 0x22, +0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0x7d,0x13,0x7e,0x54,0x22,0x37,0x12,0x9f, +0x67,0x50,0x21,0x7e,0x54,0x22,0x39,0x12,0x9f,0x67,0x28,0x18,0x7e,0x14,0x22,0x3b, +0x12,0x9f,0x30,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x22,0x3d,0x12,0x9f,0x30,0xbd,0x32, +0x28,0x2, 0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x30,0xbd,0x31, +0x22,0x90,0x21,0x51,0xe4,0x93,0xbc,0xbf,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b,0x44, +0x22,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x22,0x7e,0xf4,0x21,0xec,0x7e,0xe4,0x0, +0xff,0x22,0x7e,0x14,0x21,0xda,0x12,0x6f,0xd1,0x7e,0x14,0x21,0xde,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0xd0,0x7e,0x14,0x21,0xe0,0x12,0xdd,0x9b,0x90,0x1c,0x2c,0xe4,0x93, +0x70,0x1, 0x22,0x90,0x21,0xd9,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x6e,0xb2,0x80, +0x4, 0x7e,0x83,0x6e,0xb1,0x12,0x9f,0x79,0xbe,0x34,0x0, 0x3f,0x38,0x21,0x7e,0xe4, +0x0, 0x3f,0x9d,0xe3,0x7e,0x34,0x21,0xe4,0x12,0xa0,0x77,0x12,0xa2,0x81,0x7f,0x71, +0x12,0xa2,0x79,0xbf,0x71,0x40,0x2, 0x7f,0x71,0x9f,0x17,0x7f,0x71,0x80,0x7b,0x7d, +0x54,0x9e,0x54,0x0, 0x3f,0xbd,0x53,0x38,0x26,0x7d,0xe3,0x9d,0xe5,0x7e,0x34,0x21, +0xe6,0x12,0xa0,0x77,0x12,0xa2,0x81,0x7f,0x71,0x90,0x21,0xe3,0xe4,0x93,0xa, 0x3b, +0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b,0x7c,0x12,0xa2,0x4b,0x2f,0x71,0x80,0x4b,0x7d, +0x52,0x1b,0x54,0xbd,0x53,0x40,0x17,0x7d,0xf5,0x9d,0xf3,0x6d,0xee,0x7e,0x34,0x21, +0xe8,0x12,0xa2,0x60,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f,0x71,0x80,0x11,0x7d,0xf3, +0x9d,0xf2,0x6d,0xee,0x7e,0x34,0x21,0xea,0x12,0xa2,0x60,0x6d,0x22,0x2f,0x71,0x12, +0xa2,0x79,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80,0xe, 0x90,0x21,0xe3,0xe4, +0x93,0x12,0xa2,0x4b,0xbf,0x71,0x28,0x2, 0x7f,0x71,0xbe,0x78,0x2, 0xce,0x28,0x4, +0x7e,0x78,0x2, 0xce,0x7d,0x3f,0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xf0,0x22,0xca, +0xf8,0x6c,0xff,0x7e,0xb7,0x27,0x66,0x7e,0xc7,0x27,0x68,0x7e,0x97,0x27,0x4e,0x7e, +0xd7,0x27,0x50,0x7e,0xa7,0x27,0x62,0x7e,0xe7,0x27,0x64,0xe4,0x7e,0x73,0x27,0x72, +0x1b,0x70,0x7d,0x2b,0x7d,0x1c,0x12,0xa1,0xd2,0x40,0x2, 0x21,0xcd,0x7e,0x73,0x27, +0x72,0xbe,0x70,0xa, 0x28,0x13,0xe4,0x7e,0x70,0x9, 0x7e,0x27,0x27,0x6a,0x7e,0x17, +0x27,0x6c,0x12,0xa1,0xd2,0x40,0x2, 0x21,0xcd,0x7e,0x73,0x27,0x72,0xbe,0x70,0xf, +0x28,0x13,0xe4,0x7e,0x70,0xe, 0x7e,0x27,0x27,0x6e,0x7e,0x17,0x27,0x70,0x12,0xa1, +0xd2,0x40,0x2, 0x21,0xcd,0x7e,0x34,0x22,0x51,0x12,0xa0,0x77,0xbd,0xfc,0x28,0x50, +0x7e,0x34,0x22,0x4f,0x12,0xa0,0x77,0xbd,0xfb,0x50,0x45,0x7e,0x34,0x22,0x55,0x12, +0x29,0xdb,0x12,0xa2,0x54,0x7d,0x8f,0x9d,0x83,0xbe,0x87,0x27,0x4c,0x50,0x31,0x7e, +0x34,0x22,0x53,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x80,0x9d,0xf8,0xbe,0xf7,0x27,0x4c, +0x28,0x1e,0x7e,0x34,0x0, 0x3, 0xad,0x3c,0x7d,0xfb,0x3e,0xf4,0xbd,0xf3,0x38,0x2, +0x21,0xcd,0xbd,0xa9,0x50,0x5, 0x7e,0xf0,0x20,0x21,0xcd,0x7e,0xf0,0x21,0x21,0xcd, +0x7e,0x34,0x22,0x59,0x12,0xa0,0x77,0xbd,0xfb,0x38,0x2, 0x21,0xcd,0x7e,0x34,0x22, +0x57,0x12,0xa0,0x77,0xbd,0xfc,0x50,0x75,0x7e,0xb3,0x27,0x4b,0x70,0x6f,0x7e,0x34, +0x22,0x5d,0x12,0x29,0xdb,0x12,0xa2,0x54,0x7d,0xaf,0x9d,0xa3,0xbe,0xa7,0x27,0x4c, +0x50,0x5b,0x7e,0x34,0x22,0x5b,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0xa0,0x9d,0xfa,0xbe, +0xf7,0x27,0x4c,0x28,0x48,0x7d,0xfb,0x3e,0xf4,0x7e,0x34,0x0, 0x3, 0xad,0x3c,0xbd, +0x3f,0x28,0x3a,0xbd,0xed,0x50,0x5, 0x7e,0xf0,0x22,0x80,0x31,0x7e,0xa3,0x27,0x72, +0x7e,0x10,0x4, 0xac,0x1a,0x49,0x30,0x25,0xb5,0x49,0x10,0x25,0xb7,0x49,0x20,0x25, +0xa5,0x49,0x0, 0x25,0xa7,0x9d,0x10,0xbe,0x14,0x0, 0x20,0x18,0xd, 0x9d,0x32,0xbe, +0x34,0x0, 0x10,0x48,0x5, 0xbe,0xa0,0x6, 0x50,0x3, 0x7e,0xf0,0x23,0x7c,0xbf,0xda, +0xf8,0x22,0x7d,0x41,0x7d,0x2, 0x7c,0x6b,0x74,0x4, 0xac,0xb6,0x49,0x15,0x25,0xb9, +0x49,0x25,0x25,0xbb,0x74,0x4, 0xac,0xb7,0x49,0xf5,0x25,0xb9,0x49,0x55,0x25,0xbb, +0x7d,0x31,0x9d,0x3f,0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0x9d,0x1f,0x80,0x4, 0x6d,0x11, +0x9d,0x13,0x7d,0x32,0x9d,0x35,0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0x9d,0x25,0x80,0x4, +0x6d,0x22,0x9d,0x23,0x9d,0x24,0x9d,0x10,0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x7d,0x32, +0x80,0x4, 0x6d,0x33,0x9d,0x32,0x7e,0x54,0x22,0x49,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x32,0x50,0x14,0xbe,0x14,0x0, 0x0, 0x8, 0x4, 0x7d,0x31,0x80,0x4, 0x6d, +0x33,0x9d,0x31,0xbd,0x32,0x50,0x2, 0xd3,0x22,0xc3,0x22,0xa, 0x2b,0x7d,0x3d,0x9d, +0x32,0x6d,0x22,0x22,0x7e,0x14,0x22,0x6d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xf0,0x22, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x10,0x7f,0x17,0x12,0x22,0xb4,0x7f,0x71,0x7c,0x76, +0x7c,0x65,0xa, 0x24,0x7f,0x71,0x7d,0x3c,0x22,0x90,0x21,0xe2,0xe4,0x93,0xa, 0x3b, +0x22,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d,0x2e,0x7c,0x76,0x7c,0x65,0x22,0x12,0xa5, +0x93,0x7a,0x37,0x27,0x66,0x12,0xa5,0x1e,0x7a,0x37,0x27,0x68,0x12,0xa0,0x7f,0x60, +0x1, 0x22,0x7e,0x73,0x27,0x72,0xa, 0x37,0x7a,0x35,0x26,0x7e,0x8, 0x25,0xb9,0x7e, +0x18,0x27,0x4a,0x2, 0xa2,0xb6,0xca,0xf8,0x7e,0x45,0x26,0x7c,0xb9,0x7a,0xb3,0x77, +0x2c,0x74,0xff,0x7a,0xb3,0x77,0x2b,0x6d,0x55,0x80,0x1f,0x7d,0xf5,0x3e,0xf4,0x3e, +0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x7d,0xe5,0x3e,0xe4,0x59,0xfe,0x62,0xb8, +0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x63,0x80,0xb, 0x54,0xbd,0x45,0x38,0xdd,0x7e,0x33, +0x77,0x2c,0xbe,0x30,0x4, 0x38,0x2, 0x61,0x7e,0x69,0xf1,0x0, 0x1c,0x69,0x11,0x0, +0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78,0x4, 0x7e,0x14,0x0, 0x1, 0x7d,0x3f,0x7d, +0x21,0x12,0x22,0x71,0x7c,0xf7,0x74,0x40,0x7a,0xb3,0x77,0x2f,0x80,0x43,0x4d,0xff, +0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31,0x7d,0x2f,0x12,0x22,0x71,0x7c,0xf7,0x74, +0x80,0x7a,0xb3,0x77,0x2f,0x7d,0xf, 0x2d,0xf, 0xbd,0x1, 0x8, 0x24,0x1a,0x2, 0x1a, +0x0, 0x7e,0x73,0x77,0x2f,0xa, 0x37,0x6d,0x22,0x12,0x22,0xa3,0x7d,0x5f,0x1a,0x4a, +0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x12,0x22,0xbf,0x7a,0x73,0x77, +0x2f,0xbe,0xf0,0x5, 0x58,0x14,0x12,0xa3,0x9d,0x12,0xe2,0x76,0x12,0xa3,0x9d,0x12, +0xa3,0xa6,0x12,0xa3,0x9d,0x12,0xe3,0x65,0x80,0xa, 0x74,0x7d,0x80,0x2, 0x74,0x7f, +0x7a,0xb3,0x77,0x2b,0xe4,0x7a,0xb3,0x77,0x2c,0x7e,0x73,0x78,0x2e,0xbe,0x73,0x77, +0x2b,0x48,0x6, 0x7e,0xb3,0x77,0x2d,0x80,0x1, 0xe4,0xda,0xf8,0x22,0x7e,0x8, 0x62, +0xb8,0x7e,0x18,0x63,0x80,0x22,0xca,0x3b,0x7f,0x71,0x7e,0x60,0x1, 0xb, 0xa, 0x20, +0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x64,0x48,0x7a,0x43,0x64,0xac,0x7e,0x70,0x1, +0x7e,0xa0,0x1, 0x81,0xc7,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x60,0x2d,0xd4,0xb, 0x6a, +0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x28,0x7f,0x67,0x2d,0xd4,0xb, 0x6a,0x40,0xa, 0xd5, +0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a,0x7c,0x8f,0xbe,0x80,0x0, 0x58,0x5, 0x6e, +0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79,0x9d,0x7a,0xbe,0xf0,0x0, 0x58,0x5, 0x6e, +0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58,0x7, 0xbe,0xf0,0x2, 0x58,0x2, 0x81,0xc5, +0xbe,0x60,0x0, 0x18,0x2, 0x81,0xad,0xbe,0x70,0xec,0x28,0x2, 0x81,0xd1,0xbe,0x80, +0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61,0xa, 0xa7,0xb, 0xa4,0x7d,0x6a,0x7c,0x7d, +0xa, 0xa5,0x2d,0xab,0x12,0xa5,0x15,0x19,0xba,0x64,0x48,0xa, 0xd9,0xa, 0xa4,0x2d, +0xad,0x12,0xa5,0x15,0x19,0xba,0x64,0xac,0x9, 0xba,0x64,0x48,0xa, 0xdb,0xa, 0xc5, +0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd,0xa, 0xc7,0x19,0xbc,0x64,0x47,0x9, 0xbc, +0x64,0xac,0xa, 0xcb,0xa, 0xa4,0x2d,0xac,0x12,0xa5,0x15,0x19,0xba,0x64,0xab,0x2d, +0xdb,0x12,0xa5,0xc, 0x19,0xbd,0x64,0x49,0xa, 0xd9,0x12,0xa5,0xa, 0x19,0xbd,0x64, +0xad,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80,0x24,0xbe,0x80,0x4, 0x58,0x5, 0xbe,0xf0, +0x4, 0x48,0x1a,0xe5,0x28,0xa, 0xcb,0xa, 0xd5,0x12,0xa5,0xa, 0x19,0xbd,0x64,0x48, +0xa, 0xc9,0xa, 0xd4,0x12,0xa5,0xa, 0x19,0xbd,0x64,0xac,0xb, 0x70,0xbe,0x70,0x64, +0x50,0x1f,0x7e,0x51,0x28,0x7c,0x49,0xe5,0x28,0xa, 0xd7,0x19,0xbd,0x64,0x48,0x19, +0x9d,0x64,0xac,0xb, 0x70,0xb, 0xa0,0x7e,0xb3,0x77,0x2c,0xbc,0xba,0x28,0x2, 0x61, +0xc5,0x7a,0x73,0x77,0x2c,0x7e,0xa0,0x1, 0x80,0x25,0xa, 0x3a,0x9, 0xb3,0x64,0x48, +0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f,0x60,0x2d,0xd3,0x1b,0x6a,0x20,0xa, 0x2a, +0x9, 0xb2,0x64,0xac,0xa, 0x4b,0x2d,0x3f,0x7d,0x2e,0x1b,0x1a,0x40,0xb, 0xa0,0x7e, +0xb3,0x77,0x2c,0xbc,0xba,0x38,0xd3,0xda,0x3b,0x22,0x2d,0xdc,0xe, 0xd4,0x7d,0x6d, +0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d,0x6a,0x7c,0xbd,0xa, 0xa7,0x22,0x7e,0x37, +0x27,0x60,0x9e,0x37,0x27,0x58,0x22,0x7e,0x17,0x27,0x5a,0xbd,0x13,0x28,0xa, 0x7a, +0x37,0x27,0x5a,0x7a,0x27,0x27,0x5c,0x80,0x10,0x7e,0x17,0x27,0x52,0xbd,0x13,0x50, +0x8, 0x7a,0x37,0x27,0x52,0x7a,0x27,0x27,0x54,0x7e,0x17,0x27,0x58,0xbd,0x12,0x28, +0xa, 0x7a,0x27,0x27,0x58,0x7a,0x37,0x27,0x56,0x80,0x10,0x7e,0x17,0x27,0x60,0xbd, +0x12,0x50,0x8, 0x7a,0x27,0x27,0x60,0x7a,0x37,0x27,0x5e,0x7e,0xb3,0x27,0x72,0xb4, +0xa, 0xf, 0x12,0xa5,0x93,0x7a,0x37,0x27,0x6a,0x12,0xa5,0x1e,0x7a,0x37,0x27,0x6c, +0x22,0xb4,0xf, 0xe, 0x12,0xa5,0x93,0x7a,0x37,0x27,0x6e,0x12,0xa5,0x1e,0x7a,0x37, +0x27,0x70,0x22,0x7e,0x37,0x27,0x52,0x9e,0x37,0x27,0x5a,0x22,0x7d,0x3c,0x7d,0x2d, +0x7d,0x42,0x7d,0x13,0x7d,0x24,0x12,0xde,0x1f,0x7d,0x31,0x12,0xa5,0x27,0x2, 0xa5, +0xb1,0x7e,0x3, 0x27,0x72,0xbe,0x0, 0x64,0x50,0x2, 0xc1,0x46,0x80,0x7d,0x6c,0x99, +0x7e,0xb3,0x27,0x49,0xbe,0xb0,0x20,0x50,0x5, 0x4, 0x7a,0xb3,0x27,0x49,0x7e,0x1f, +0x25,0xb9,0x7a,0x1f,0x62,0xb8,0x7e,0x80,0x1, 0x80,0x45,0x74,0x4, 0xac,0xb8,0x49, +0x35,0x25,0xb9,0x49,0x25,0x25,0xbb,0x7e,0x17,0x62,0xb8,0x7e,0x7, 0x62,0xba,0x12, +0xa7,0x8d,0x7c,0x1b,0x7e,0x3, 0x27,0x49,0xbc,0x1, 0x38,0x22,0xb, 0x90,0x7e,0x70, +0x4, 0xac,0x78,0x2e,0x34,0x25,0xb9,0x7e,0x14,0x62,0xb8,0x74,0x4, 0x12,0xa7,0xce, +0x7e,0x30,0x4, 0xac,0x39,0x2e,0x14,0x25,0xb9,0x74,0x4, 0x12,0x23,0x44,0xb, 0x80, +0x7e,0x3, 0x27,0x72,0xbc,0x8, 0x38,0xb3,0xa, 0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, +0x27,0x72,0x7e,0x3, 0x27,0x49,0xbe,0x0, 0x20,0x50,0xb, 0x7e,0x3, 0x27,0x72,0xbe, +0x0, 0xec,0x40,0x2, 0xa1,0xbe,0x22,0xca,0xf8,0x7e,0xa3,0x6e,0x7c,0x7e,0xb3,0x6e, +0x7d,0xc2,0x13,0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, 0x38,0x1c,0x7e,0x47,0x6c, +0xe0,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3,0x27,0x4a,0x4c,0xff,0x68, +0xf, 0x7e,0x47,0x25,0xb1,0x4d,0x44,0x78,0x7, 0xd2,0x13,0x12,0xa7,0xc7,0x80,0x35, +0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e,0x37,0x25,0xb1,0x7a,0x37,0x27,0x4c,0x7e, +0xb3,0x27,0x4a,0xb4,0x3, 0x1f,0x7e,0x37,0x25,0xb1,0xbe,0x34,0x0, 0x0, 0x28,0x15, +0x74,0x4, 0x7a,0xb3,0x27,0x4a,0x7e,0x37,0x27,0x62,0x7e,0x27,0x27,0x64,0x12,0xa5, +0xa0,0xe1,0x4b,0x80,0x0, 0x12,0xa7,0xe1,0xe1,0x4b,0x7e,0xc7,0x6d,0x6e,0x7e,0xd7, +0x6d,0x70,0x4c,0xff,0x78,0x19,0x70,0x57,0xbe,0xa0,0x1, 0x78,0x52,0x7d,0x3c,0x7d, +0x2d,0x12,0xde,0x44,0x12,0xa5,0x9c,0x74,0x1, 0x7a,0xb3,0x27,0x4a,0x80,0x40,0xbe, +0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x27,0x52,0x9e,0x27,0x27,0x5a,0x7e,0x14,0x22,0x69, +0x12,0x9f,0x30,0xbd,0x23,0x38,0x13,0x7e,0x27,0x27,0x60,0x9e,0x27,0x27,0x58,0x7e, +0x14,0x22,0x6b,0x12,0x9f,0x30,0xbd,0x23,0x28,0x15,0x74,0x3, 0x7a,0xb3,0x27,0x4a, +0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a,0xc7,0x27,0x62,0x7a,0xd7,0x27,0x64,0x7e, +0xb3,0x27,0x4a,0x60,0x26,0x7d,0x3c,0x7d,0x2d,0x7e,0x17,0x25,0xb5,0x7e,0x7, 0x25, +0xb7,0x12,0xa7,0x8d,0xa, 0x2b,0x7e,0x73,0x27,0x49,0xa, 0x37,0xbd,0x32,0x58,0xb, +0x12,0xa5,0x9c,0x7a,0xc7,0x25,0xb5,0x7a,0xd7,0x25,0xb7,0xda,0xf8,0x22,0x7e,0xb3, +0x76,0x5a,0x70,0x6, 0x12,0xa7,0x87,0x2, 0xa7,0xc1,0x12,0xa6,0x47,0x12,0xa7,0xd6, +0x50,0xa, 0x12,0xa2,0x8e,0x7c,0x3b,0x12,0xa7,0x87,0x80,0x5, 0x12,0xdc,0x73,0x7c, +0x3b,0x4c,0x33,0x68,0x11,0x7c,0xb3,0x12,0xdd,0xa3,0x60,0xa, 0x7a,0x33,0x76,0x5d, +0x74,0x1, 0x7a,0xb3,0x6e,0x82,0x22,0xe4,0x7a,0xb3,0x27,0x4a,0x22,0x7d,0x51,0x7d, +0x12,0x7d,0x23,0x9d,0x25,0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x7d,0x52,0x80,0x4, 0x6d, +0x55,0x9d,0x52,0x7c,0xab,0x7d,0x21,0x9d,0x20,0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x7d, +0x32,0x80,0x4, 0x6d,0x33,0x9d,0x32,0x7c,0xb7,0xbc,0xba,0x50,0x3, 0x7c,0xba,0x22, +0x22,0xe4,0x7a,0xb3,0x77,0xfb,0x22,0x74,0x1, 0x7a,0xb3,0x76,0x2f,0x22,0x12,0x23, +0x44,0x7e,0x34,0x62,0xb8,0x22,0x7e,0xb3,0x27,0x4a,0xb4,0x4, 0x2, 0xd3,0x22,0xc3, +0x22,0x74,0xfe,0x7a,0xb3,0x76,0x5d,0xe4,0x7a,0xb3,0x27,0x4a,0x22,0xca,0x3b,0x6d, +0x33,0x7a,0x35,0x27,0x7a,0x35,0x29,0x7e,0x53,0x6e,0x7c,0x7a,0x51,0x40,0xbe,0x50, +0x0, 0x28,0x1a,0x7e,0x27,0x62,0x7a,0xb, 0x24,0x7a,0x27,0x62,0x7a,0xbe,0x24,0x0, +0x64,0x28,0xe, 0x7e,0x24,0x0, 0x64,0x7a,0x27,0x62,0x7a,0x80,0x4, 0x7a,0x37,0x62, +0x7a,0x7e,0xb3,0x76,0x2f,0xb4,0x1, 0x4, 0x74,0x3, 0x80,0x7, 0x7e,0xb3,0x62,0x29, +0x60,0x5, 0x14,0x7a,0xb3,0x62,0x29,0x7e,0xb3,0x6e,0x83,0x60,0x3, 0x2, 0xb0,0x9c, +0x7e,0x37,0x5a,0x42,0xbe,0x37,0x77,0xe2,0x28,0x12,0x7e,0x54,0xff,0xff,0x9e,0x57, +0x5a,0x42,0x2e,0x57,0x77,0xe2,0xb, 0x54,0xf5,0x3f,0x80,0xa, 0x7e,0x57,0x77,0xe2, +0x9e,0x57,0x5a,0x42,0xf5,0x3f,0x7e,0x37,0x77,0xe2,0x7a,0x37,0x5a,0x42,0xc2,0x26, +0x7e,0x34,0x6d,0x14,0x7a,0x35,0x2b,0xe5,0x40,0x60,0x6, 0x7e,0xb3,0x6e,0x7d,0x70, +0x39,0x6c,0xff,0x6c,0xaa,0x80,0x2e,0xa, 0x4f,0x19,0xa4,0x62,0x15,0xe4,0x19,0xb4, +0x62,0x1f,0x6d,0x33,0x7e,0x50,0x2, 0xac,0x5f,0x59,0x32,0x62,0x52,0x59,0x32,0x62, +0x66,0x7e,0x70,0xff,0x7e,0x50,0x9, 0xac,0x5f,0x19,0x72,0x5c,0xe7,0x74,0x1, 0x19, +0xb4,0x62,0x7c,0xb, 0xf0,0x12,0x9f,0x71,0x38,0xcd,0xc2,0x25,0x7e,0xb3,0x5c,0xc3, +0x60,0x6, 0x7e,0xb3,0x6e,0xa2,0x60,0x7, 0x12,0xb7,0xdb,0x50,0x2, 0xd2,0x25,0x6c, +0xff,0xe1,0x7c,0x7e,0x70,0x9, 0xac,0x7f,0x9, 0xe3,0x6d,0x18,0x5e,0xe0,0xf, 0x12, +0xb2,0x9d,0x38,0x2, 0xe1,0x7a,0x7e,0x90,0x9, 0xac,0x9e,0x9, 0xa4,0x6e,0x22,0xbe, +0xa0,0x1, 0x78,0x2, 0xe1,0x57,0x7e,0x50,0x2, 0xac,0x5e,0x7d,0x2, 0x2e,0x4, 0x62, +0x52,0xb, 0x8, 0x10,0xb, 0x14,0x1b,0x8, 0x10,0x4c,0xaa,0x78,0x1a,0x49,0x43,0x6d, +0x14,0x74,0x4, 0xac,0xbe,0x59,0x45,0x62,0x2a,0x49,0x33,0x6d,0x16,0x59,0x35,0x62, +0x2c,0x6d,0x33,0x59,0x32,0x62,0x66,0x6c,0xdd,0xe1,0x4e,0x7e,0x10,0x9, 0xac,0x1d, +0x9, 0xc0,0x5c,0xe7,0xbc,0xce,0x68,0x2, 0xe1,0x4c,0x7e,0x70,0x73,0xac,0x7c,0x2e, +0x34,0x5d,0x97,0x6d,0x22,0x7a,0x1d,0x33,0x12,0xe5,0x49,0x49,0x10,0x5c,0xe3,0x49, +0x0, 0x5c,0xe5,0x12,0xb8,0x77,0x7a,0x35,0x27,0x12,0xe5,0x49,0x74,0x4, 0xac,0xbc, +0x49,0x15,0x62,0x2a,0x49,0x5, 0x62,0x2c,0x12,0xb8,0x77,0x7a,0x35,0x31,0x74,0x2, +0xac,0xbc,0x7d,0x35,0x2e,0x34,0x62,0x66,0xb, 0x38,0x40,0x2e,0x45,0x27,0x1b,0x38, +0x40,0x49,0x45,0x62,0x66,0xbe,0x44,0xf, 0xa0,0x28,0x8, 0x7e,0x34,0xf, 0xa0,0x59, +0x35,0x62,0x66,0xe5,0x3f,0x7a,0xb3,0x63,0x1b,0x12,0xe5,0x6b,0x9, 0x73,0x0, 0x6, +0x7a,0x73,0x63,0x1d,0x7e,0x35,0x27,0x7a,0x37,0x63,0x24,0x7e,0x35,0x31,0x7a,0x37, +0x63,0x26,0x12,0xe5,0x6b,0xb, 0x38,0x30,0x7a,0x37,0x63,0x28,0x12,0xe5,0x6b,0x49, +0x33,0x0, 0x2, 0x7a,0x37,0x63,0x2a,0x74,0x2, 0xac,0xbc,0x49,0x35,0x62,0x52,0x7a, +0x37,0x63,0x2c,0x74,0x2, 0xac,0xbc,0x49,0x35,0x62,0x66,0x7a,0x37,0x63,0x30,0x74, +0x9, 0xac,0xbd,0x49,0x25,0x5c,0xe3,0x7e,0x37,0x63,0x28,0x9d,0x32,0x7a,0x37,0x63, +0x20,0x74,0x9, 0xac,0xbd,0x49,0x25,0x5c,0xe5,0x7e,0x37,0x63,0x2a,0x9d,0x32,0x7a, +0x37,0x63,0x22,0x12,0xe6,0x23,0xbe,0xa0,0x0, 0x28,0x1c,0x7e,0x34,0x0, 0x17,0xca, +0x39,0x12,0xe5,0x62,0x2e,0x34,0xff,0xe9,0x7e,0x8, 0x63,0x32,0x12,0x24,0xf, 0x1b, +0xfd,0x7e,0x37,0x63,0x3b,0x80,0x9, 0x7e,0x8, 0x63,0x32,0x12,0xe6,0x70,0x6d,0x33, +0x7a,0x35,0x29,0x12,0xe6,0x23,0xbe,0xa0,0x2, 0x40,0x18,0x7e,0x34,0x0, 0x17,0xca, +0x39,0x12,0xe5,0x62,0x2e,0x34,0xff,0xd2,0x7e,0x8, 0x63,0x49,0x12,0x24,0xf, 0x1b, +0xfd,0x80,0x7, 0x7e,0x8, 0x63,0x49,0x12,0xe6,0x70,0x6d,0x33,0x7a,0x35,0x2d,0x75, +0x26,0x0, 0x80,0x12,0x7e,0xa1,0x26,0x12,0xe5,0x62,0x69,0x31,0x0, 0x9, 0x2e,0x35, +0x2d,0x7a,0x35,0x2d,0x5, 0x26,0xa, 0x3c,0x9, 0x73,0x62,0x15,0xbe,0x71,0x26,0x38, +0xe3,0xbe,0x70,0x0, 0x28,0xa, 0xa, 0x27,0x7e,0x35,0x2d,0x8d,0x32,0x7a,0x35,0x2d, +0x7e,0x35,0x2d,0x7a,0x37,0x63,0x2e,0xc2,0x0, 0xc2,0x1, 0x12,0x5f,0xa8,0xa, 0x3c, +0x9, 0xb3,0x62,0x7c,0x60,0x2, 0x61,0xd8,0x7e,0x71,0x3f,0x74,0x8, 0xac,0x7b,0x2e, +0x34,0x0, 0x14,0xbe,0x35,0x29,0x50,0x7, 0xbe,0x35,0x27,0x50,0x2, 0xd2,0x26,0x7e, +0xa3,0x63,0x32,0x74,0x5, 0xa4,0xbe,0x57,0x63,0x3b,0x50,0x19,0x7e,0xa3,0x63,0x49, +0x74,0x5, 0xa4,0xbe,0x57,0x63,0x52,0x50,0xc, 0x7e,0x37,0x63,0x45,0xbe,0x34,0x0, +0x14,0x28,0x2, 0xd2,0x1, 0xa2,0x1, 0xe4,0x33,0x7a,0xb3,0x63,0x1e,0x7e,0x71,0x3f, +0x74,0x1e,0xac,0x7b,0x2e,0x35,0x29,0xbe,0x35,0x27,0x50,0x4, 0xd2,0x3, 0x80,0xe, +0x7e,0x35,0x29,0x2e,0x34,0x0, 0x40,0xbe,0x35,0x27,0x50,0x2, 0xd2,0x4, 0x30,0x3, +0x6, 0xd2,0x2, 0x74,0x64,0x80,0x14,0x30,0x4, 0xf, 0x30,0x1, 0x6, 0xc2,0x2, 0x74, +0xa, 0x80,0x8, 0xd2,0x2, 0x74,0xc8,0x80,0x2, 0x74,0x14,0x7a,0xb3,0x63,0x1c,0x20, +0x2, 0x2, 0x61,0xc4,0x7e,0x37,0x63,0x2e,0xbe,0x34,0x0, 0xa, 0x38,0x2, 0x61,0xc4, +0x7e,0x37,0x63,0x45,0xbe,0x34,0x0, 0xa, 0x28,0x7a,0x7e,0x37,0x63,0x5c,0xbe,0x34, +0x0, 0xa, 0x28,0x70,0x7e,0x37,0x63,0x37,0x2e,0x37,0x63,0x3f,0x7a,0x35,0x39,0xbe, +0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x7a,0x35,0x39,0x7e,0x37,0x63,0x39,0x2e,0x37, +0x63,0x41,0x12,0xe6,0xae,0x58,0x5, 0x6d,0x33,0x7a,0x35,0x3b,0x12,0xe5,0x59,0x7e, +0x15,0x39,0x7e,0x5, 0x3b,0x12,0xb8,0x77,0x7a,0x35,0x39,0x7e,0x37,0x63,0x47,0xbe, +0x34,0xf, 0xa0,0x40,0xa, 0x7e,0x27,0x63,0x45,0x7e,0x34,0x0, 0xf, 0x80,0x13,0x12, +0xe6,0xb6,0x7e,0x27,0x63,0x45,0x28,0x6, 0x7e,0x34,0x0, 0x9, 0x80,0x4, 0x7e,0x34, +0x0, 0x6, 0xad,0x32,0x7a,0x35,0x2f,0xbe,0x35,0x39,0x28,0x8, 0xc2,0x2, 0x74,0x28, +0x7a,0xb3,0x63,0x1c,0x30,0x25,0xc, 0xc2,0x2, 0xe4,0x12,0xe4,0xe5,0x74,0x6e,0x7a, +0xb3,0x63,0x1c,0x12,0xe6,0xbe,0x80,0x19,0xa, 0x3c,0x2e,0x34,0x62,0x7c,0x12,0xe6, +0xc6,0x12,0xe6,0xbe,0x74,0x78,0x7a,0xb3,0x63,0x1c,0xd2,0x2, 0xe4,0x7a,0xb3,0x63, +0x1e,0xa2,0x2, 0xe4,0x33,0x7a,0xb3,0x63,0x1f,0xa, 0x3c,0x9, 0xa3,0x62,0x1f,0x4c, +0xaa,0x78,0x19,0x7e,0x35,0x3d,0xbe,0x35,0x27,0x40,0x2, 0xc1,0x33,0x20,0x2, 0x2, +0xc1,0x33,0x74,0x1, 0xa, 0x4c,0x19,0xb4,0x62,0x1f,0xc1,0x33,0xbe,0xa0,0x1, 0x68, +0x2, 0xc1,0x15,0x7e,0x7, 0x63,0x5c,0xbe,0x4, 0x0, 0x3, 0x50,0x30,0x7e,0x17,0x63, +0x3b,0xbe,0x14,0x0, 0x50,0x50,0x26,0x7e,0x17,0x63,0x2c,0xbe,0x14,0x0, 0x14,0x50, +0x1c,0x7e,0x17,0x63,0x54,0xbe,0x14,0x0, 0x1e,0x50,0x12,0x7e,0x17,0x63,0x3d,0xbe, +0x14,0x0, 0x50,0x50,0x8, 0x7e,0x15,0x29,0x7a,0x15,0x2f,0xa1,0x46,0x7e,0x17,0x63, +0x2c,0xbe,0x14,0x0, 0xa, 0x50,0x13,0x7e,0x17,0x63,0x45,0xbe,0x14,0x0, 0x8, 0x28, +0x9, 0x7e,0x73,0x63,0x1d,0xbe,0x70,0xf, 0x40,0x15,0x7e,0x17,0x63,0x45,0xbe,0x14, +0x0, 0xf, 0x28,0x42,0xbe,0x4, 0x0, 0xf, 0x28,0x3c,0x12,0xe6,0xb6,0x50,0x37,0x7e, +0xa3,0x63,0x32,0xa, 0x2a,0x7e,0x35,0x29,0x8d,0x32,0x7d,0x23,0x1e,0x24,0x12,0xe4, +0xd7,0xbe,0x34,0x0, 0x78,0x28,0x7, 0x7e,0x4, 0x0, 0x78,0x7a,0x5, 0x2f,0xbe,0xa0, +0xa, 0x38,0x2, 0xa1,0x46,0x7e,0x5, 0x2f,0xbe,0x4, 0x0, 0x50,0x40,0x2, 0xa1,0x46, +0x7e,0x4, 0x0, 0x50,0x80,0x8, 0x7e,0xb3,0x63,0x4c,0x60,0x7, 0x6d,0x0, 0x7a,0x5, +0x2f,0x80,0x73,0x7e,0x73,0x63,0x32,0xa, 0x27,0x7e,0x37,0x63,0x3b,0x12,0xe4,0xd3, +0x7e,0xa3,0x63,0x34,0x74,0x2, 0xa4,0x7e,0x73,0x63,0x1d,0xa, 0x27,0xbd,0x25,0x8, +0x31,0xbe,0x14,0x0, 0x1e,0x50,0x2b,0x7e,0x63,0x63,0x4b,0xa, 0x6, 0x12,0xcf,0x1f, +0x8, 0x4, 0x9d,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0xbe,0x24,0x0, 0x5, 0x8, 0x12, +0x7e,0x25,0x2f,0xbe,0x24,0x0, 0xc8,0x50,0x2d,0x7e,0x24,0x0, 0xc8,0x7a,0x25,0x2f, +0x80,0x24,0xbe,0x70,0xf, 0x28,0xf, 0x7e,0x35,0x2f,0xbe,0x34,0x0, 0xc8,0x28,0x16, +0x7e,0x34,0x0, 0xc8,0x80,0xd, 0x7e,0x35,0x2f,0xbe,0x34,0x0, 0x78,0x28,0x7, 0x7e, +0x34,0x0, 0x78,0x7a,0x35,0x2f,0x7e,0x35,0x2f,0xbe,0x35,0x27,0x28,0x42,0xd2,0x0, +0x7e,0x37,0x63,0x2c,0xbe,0x34,0x0, 0x8, 0x50,0x11,0x12,0xe6,0x67,0x28,0xc, 0x74, +0x2, 0xa, 0x2c,0x19,0xb2,0x62,0x1f,0xc2,0x0, 0x80,0x7b,0x7e,0x27,0x63,0x54,0xbe, +0x24,0x0, 0x64,0x28,0x71,0x12,0xe6,0x67,0x28,0x6c,0xbe,0x34,0x0, 0x14,0x50,0x66, +0x7e,0x73,0x63,0x1d,0xbe,0x70,0x14,0x50,0x5d,0x12,0xe4,0xe3,0xc2,0x0, 0x80,0x56, +0x7e,0x35,0x3d,0xbe,0x35,0x27,0x50,0x8, 0x30,0x2, 0x5, 0x74,0x3, 0x12,0xe4,0xe5, +0x7e,0x37,0x63,0x2c,0xbe,0x34,0x0, 0x1e,0x50,0x3c,0x7e,0x73,0x5a,0x5b,0xbe,0x70, +0x2, 0x28,0x18,0x7e,0xb3,0x63,0x35,0x70,0x12,0x12,0xe6,0x5e,0x50,0xd, 0x12,0xe5, +0x59,0x12,0xb9,0x31,0x50,0x20,0x12,0xe4,0xe3,0x80,0x1b,0x12,0xe6,0x5e,0x50,0x16, +0x7e,0x37,0x63,0x26,0xbe,0x34,0x0, 0x1e,0x50,0xc, 0x7e,0x37,0x62,0x7a,0xbe,0x34, +0x0, 0x78,0x50,0x2, 0xd2,0x0, 0x12,0xe6,0x2a,0xb4,0x1, 0x1f,0x12,0xe5,0x59,0x7e, +0x17,0x63,0x56,0x7e,0x7, 0x63,0x58,0x12,0xb8,0x77,0xbe,0x34,0x0, 0x3c,0x50,0x2f, +0xc2,0x0, 0xe4,0xa, 0x3c,0x19,0xb3,0x62,0x15,0x80,0x24,0x12,0xe6,0x2a,0xb4,0x3, +0x22,0x74,0x1, 0x80,0x1b,0x12,0xe6,0x2a,0xb4,0x2, 0x18,0x7e,0x73,0x63,0x49,0xa, +0x27,0x7e,0x37,0x63,0x52,0x12,0xe4,0xd3,0xbe,0x35,0x27,0x28,0x2, 0xd2,0x0, 0xe4, +0x12,0xe4,0xe5,0x7e,0xa1,0x3f,0x74,0x64,0xa4,0x7a,0x55,0x37,0xbe,0x54,0x2, 0x80, +0x28,0xd, 0x7e,0xb3,0x62,0x29,0x70,0x7, 0x7e,0x34,0x2, 0x80,0x7a,0x35,0x37,0x7e, +0x35,0x37,0xbe,0x35,0x27,0x50,0xc, 0x7e,0x37,0x63,0x2c,0xbe,0x34,0x0, 0x2, 0x28, +0x2, 0xd2,0x0, 0x20,0x0, 0x2, 0xc1,0xe6,0xe4,0x12,0xe4,0xe5,0x12,0xb2,0xa5,0x70, +0x8, 0x74,0x3, 0x19,0xb3,0x6e,0x22,0x80,0x25,0x74,0x1, 0x19,0xb3,0x6e,0x22,0x75, +0x26,0x0, 0x80,0x15,0x12,0x85,0x95,0x9, 0x53,0x6d,0xcc,0xbc,0x5e,0x78,0x8, 0x74, +0xff,0x19,0xb3,0x6d,0xcc,0x80,0x7, 0x5, 0x26,0x12,0x81,0xc1,0x38,0xe6,0x7e,0xa0, +0x3, 0x7e,0x70,0x9, 0xac,0x7c,0x19,0xa3,0x6e,0x23,0xe5,0x40,0xbe,0xb0,0x0, 0x28, +0x35,0x15,0x40,0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x6d,0x14,0x7e,0x14,0x62,0xb8, +0x74,0x9, 0x12,0x23,0x44,0x7e,0x71,0x40,0x74,0x9, 0xac,0x7b,0x2e,0x34,0x6d,0x14, +0x12,0x9d,0x7, 0x12,0xa7,0xce,0x7e,0x31,0x40,0x74,0x9, 0xac,0x3b,0x2e,0x14,0x6d, +0x14,0x12,0x23,0x44,0x1b,0xf0,0xa, 0x3c,0x9, 0xb3,0x62,0x15,0xb4,0x5, 0x3d,0x75, +0x26,0x0, 0x80,0x19,0x7e,0x34,0x0, 0x17,0xca,0x39,0x7e,0xa1,0x26,0x12,0xe6,0x55, +0x7f,0x10,0x2e,0x34,0x0, 0x17,0x12,0x24,0xf, 0x1b,0xfd,0x5, 0x26,0xe5,0x26,0xbe, +0xb0,0x4, 0x40,0xe0,0x7e,0x34,0x0, 0x17,0xca,0x39,0x7e,0x18,0x63,0x1b,0x7e,0xd, +0x33,0x2e,0x14,0x0, 0x5c,0x12,0x24,0xf, 0x1b,0xfd,0x80,0x4e,0x7e,0x34,0x0, 0x17, +0xca,0x39,0x12,0xe6,0x23,0x12,0xe6,0x55,0x7e,0x18,0x63,0x1b,0x12,0x24,0xf, 0x1b, +0xfd,0xa, 0x3c,0x2e,0x34,0x62,0x15,0x12,0xc1,0x9a,0x80,0x2e,0xb, 0xd0,0x12,0xb0, +0x9f,0x28,0x2, 0x21,0x2b,0x80,0x23,0x12,0xb2,0xaf,0x6d,0x22,0x74,0x2, 0xac,0xbe, +0x59,0x25,0x62,0x52,0x59,0x25,0x62,0x66,0x7e,0xa0,0xff,0x7e,0x50,0x9, 0xac,0x5e, +0x19,0xa2,0x5c,0xe7,0x74,0x1, 0x19,0xb3,0x62,0x7c,0xb, 0xf0,0xe5,0x40,0xbc,0xbf, +0x28,0x2, 0x1, 0xd3,0x12,0x87,0x98,0xca,0x59,0x7e,0x18,0x6d,0x14,0x7e,0x8, 0x62, +0xc1,0x12,0x24,0xf, 0x1b,0xfd,0x6c,0xff,0x2, 0xb0,0x23,0x74,0x9, 0xac,0xbf,0x9, +0xe5,0x6d,0x18,0xa, 0x3e,0x9, 0x73,0x62,0x1f,0xbe,0x70,0x0, 0x28,0x73,0x6c,0xdd, +0x80,0x6a,0xa, 0x4e,0x9, 0xa4,0x62,0x1f,0xbe,0xa0,0x1, 0x78,0x2e,0x7e,0x70,0x9, +0xac,0x7d,0x9, 0xb3,0x5c,0xe7,0xbc,0xbe,0x78,0x50,0x49,0x33,0x5c,0xe3,0x7e,0x50, +0x9, 0xac,0x5f,0x59,0x32,0x6d,0x14,0x7e,0x70,0x9, 0xac,0x7d,0x49,0x33,0x5c,0xe5, +0x7e,0x50,0x9, 0xac,0x5f,0x59,0x32,0x6d,0x16,0x80,0x36,0xbe,0xa0,0x2, 0x78,0x2a, +0x74,0x9, 0xac,0xbd,0x9, 0x75,0x5d,0x41,0xbc,0x7e,0x78,0x1e,0x49,0x35,0x5d,0x3d, +0x74,0x9, 0xac,0xbf,0x59,0x35,0x6d,0x14,0x74,0x9, 0xac,0xbd,0x49,0x35,0x5d,0x3f, +0x74,0x9, 0xac,0xbf,0x59,0x35,0x6d,0x16,0x80,0x7, 0xb, 0xd0,0x12,0xb0,0x9f,0x38, +0x91,0xb, 0xf0,0xe5,0x40,0xbc,0xbf,0x28,0x3, 0x2, 0xaf,0x9b,0x12,0x87,0x98,0xca, +0x59,0x7e,0x18,0x5c,0xe3,0x7e,0x8, 0x5d,0x3d,0x12,0x24,0xf, 0x1b,0xfd,0x12,0x87, +0x98,0xca,0x59,0x7e,0x18,0x62,0xc1,0x7e,0x8, 0x5c,0xe3,0x12,0x24,0xf, 0x1b,0xfd, +0x6c,0xff,0x80,0x38,0x7e,0x50,0x9, 0xac,0x5f,0x9, 0xe2,0x5c,0xe7,0x12,0xb2,0x9d, +0x28,0x28,0x12,0xb2,0xa5,0xbe,0xb0,0x1, 0x68,0x3, 0xb4,0x3, 0x1d,0x12,0xb2,0xaf, +0x6d,0x11,0x74,0x2, 0xac,0xbe,0x59,0x15,0x62,0x52,0x59,0x15,0x62,0x66,0x74,0xff, +0x19,0xb2,0x5c,0xe7,0x74,0x1, 0x19,0xb3,0x62,0x7c,0xb, 0xf0,0x12,0x9f,0x71,0x38, +0xc3,0xe5,0x40,0x7a,0xb3,0x6e,0x7c,0xe4,0x7a,0xb3,0x5c,0xc4,0xda,0x3b,0x22,0x90, +0x21,0x51,0xe4,0x93,0xbc,0xbd,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x21,0x41,0x6c, +0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x6d,0xcc,0x74,0x9, 0xac,0xbe,0x9, +0x75,0x6d,0x18,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0xb0,0x9f,0x38,0xe5,0x12,0xb0, +0x9f,0x28,0x74,0x7e,0x50,0x9, 0xac,0x5d,0x9, 0xc2,0x6d,0xcc,0x49,0x42,0x6d,0xca, +0x74,0x9, 0xac,0xbe,0x49,0xa5,0x6d,0x16,0x7d,0x3a,0x9d,0x34,0xbe,0x34,0x0, 0x0, +0x8, 0x4, 0x9d,0xa4,0x80,0x4, 0x6d,0xaa,0x9d,0xa3,0x49,0x42,0x6d,0xc8,0x49,0xb5, +0x6d,0x14,0x7d,0x3b,0x9d,0x34,0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0x9d,0xb4,0x80,0x4, +0x6d,0xbb,0x9d,0xb3,0x2d,0xba,0x74,0x9, 0xac,0xbc,0x9, 0xb5,0x6e,0x22,0xb4,0x1, +0xe, 0x6d,0xaa,0x74,0x2, 0xac,0xbc,0x59,0xa5,0x5a,0x44,0x59,0xa5,0x5c,0xc5,0x7d, +0x3b,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12,0xb3,0xbc,0x7c,0xbd,0x12,0xb1,0x4a,0xb, +0xe0,0xbc,0xfe,0x28,0x2, 0x1, 0xaf,0xda,0x3b,0x22,0x2, 0xb1,0x4d,0xca,0x3b,0x7c, +0xd4,0x7c,0xe5,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x6e,0x9b,0xbd,0x13,0x38,0x6, 0x7e, +0xd4,0x1, 0x0, 0x80,0x17,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x22,0xbd, +0x7d,0xd3,0xbe,0xd4,0x0, 0x10,0x50,0x4, 0x7e,0xd4,0x0, 0x10,0x74,0x2, 0xac,0xbd, +0x49,0x45,0x5c,0xc5,0xbd,0x4f,0x28,0x6, 0x49,0xd5,0x5a,0x44,0x80,0x4, 0x59,0xd5, +0x5a,0x44,0x59,0xf5,0x5c,0xc5,0xbe,0xd4,0x1, 0x0, 0x28,0x4, 0x7e,0xd4,0x1, 0x0, +0x7e,0xb3,0x6e,0xa2,0x60,0xb, 0x7e,0x73,0x6e,0x7c,0xbe,0x70,0x2, 0x40,0x2, 0x1e, +0xd4,0x7e,0x73,0x6e,0x7c,0xbe,0x70,0x5, 0x28,0x2, 0x1e,0xd4,0xbe,0xd4,0x0, 0x20, +0x50,0x11,0x7e,0x70,0x9, 0xac,0x7d,0x9, 0xb3,0x59,0xe6,0xb4,0x1, 0x5, 0xe4,0x19, +0xb3,0x59,0xe6,0xbe,0xd4,0x0, 0x40,0x28,0xc, 0x7e,0xa0,0x1, 0x7e,0x70,0x9, 0xac, +0x7d,0x19,0xa3,0x59,0xe6,0x7c,0xbe,0x7c,0x7d,0x12,0xb2,0xbb,0x7d,0x13,0x7e,0xb3, +0x6e,0xa2,0x60,0x2, 0x1e,0xd4,0x7e,0x70,0x9, 0xac,0x7f,0x49,0x3, 0x6d,0xc8,0x7e, +0xd0,0x9, 0xac,0xde,0x49,0x26,0x6d,0x14,0x7d,0xe2,0x9d,0xe0,0xbe,0xe4,0x0, 0x0, +0x8, 0x6, 0x7d,0xf2,0x9d,0xf0,0x80,0x4, 0x6d,0xff,0x9d,0xfe,0x12,0xb2,0x8e,0xbd, +0x20,0x28,0xf, 0x7d,0xe3,0x2e,0xe4,0x6d,0xc8,0x7d,0xc0,0x2d,0xcf,0x1b,0xe8,0xc0, +0x80,0xf, 0x74,0x9, 0xac,0xbf,0x7d,0xe5,0x2e,0xe4,0x6d,0xc8,0x9d,0xf, 0x1b,0xe8, +0x0, 0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x6d,0xca,0x7e,0xd0,0x9, 0xac,0xde,0x49, +0xe6,0x6d,0x16,0x7d,0xe, 0x9d,0x3, 0xbe,0x4, 0x0, 0x0, 0x8, 0x6, 0x7d,0xfe,0x9d, +0xf3,0x80,0x4, 0x6d,0xff,0x9d,0xf0,0x12,0xb2,0x8e,0xbd,0xe3,0x28,0xf, 0x7d,0xe2, +0x2e,0xe4,0x6d,0xca,0x7d,0x23,0x2d,0x2f,0x1b,0xe8,0x20,0x80,0xe, 0x7e,0x50,0x9, +0xac,0x5f,0x2e,0x24,0x6d,0xca,0x9d,0x3f,0x1b,0x28,0x30,0xda,0x3b,0x22,0x7d,0x5d, +0xad,0x5f,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0x7d,0xf5,0x5d,0xf1,0x22,0x90,0x21,0x51, +0xe4,0x93,0xbc,0xbe,0x22,0x7e,0x70,0x9, 0xac,0x7e,0x9, 0xb3,0x6e,0x22,0x22,0xe4, +0xa, 0x3e,0x19,0xb3,0x62,0x15,0x19,0xb3,0x62,0x1f,0x22,0x7c,0x17,0x7c,0xab,0x7e, +0x14,0xff,0xfc,0x7e,0x3, 0x6e,0x7c,0x7e,0x90,0x9, 0xac,0x91,0x9, 0xb4,0x59,0xe1, +0xb4,0x1, 0x49,0xa5,0xb8,0x1, 0xc, 0xbe,0x14,0xff,0x0, 0x28,0x10,0x7e,0x14,0xff, +0x0, 0x80,0xa, 0xbe,0x14,0xff,0xe0,0x28,0x4, 0x7e,0x14,0xff,0xe0,0x49,0x34,0x59, +0xe2,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x22,0x6d,0x14,0x12,0xb3,0xa6,0x8, 0x3, 0x12, +0xb3,0xb0,0x7e,0x70,0x9, 0xac,0x71,0x49,0x33,0x59,0xe4,0x7e,0x50,0x9, 0xac,0x5a, +0x49,0x22,0x6d,0x16,0x12,0xb3,0xa6,0x8, 0x3, 0x12,0xb3,0xb0,0x7e,0x70,0x9, 0xac, +0x71,0x49,0x23,0x59,0xe2,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x33,0x6d,0x14,0x12,0xb3, +0x9c,0x18,0x16,0x74,0x9, 0xac,0x1b,0x49,0x20,0x59,0xe4,0x7e,0x70,0x9, 0xac,0x7a, +0x49,0x33,0x6d,0x16,0x12,0xb3,0x9c,0x8, 0x4, 0x7e,0x14,0xff,0xfc,0x7e,0x50,0x9, +0xac,0x5a,0x49,0x2, 0x6d,0x14,0xbe,0x4, 0x6, 0x50,0x40,0x39,0x7e,0x63,0x6e,0xb1, +0x7e,0x70,0x40,0xac,0x67,0x9e,0x34,0x0, 0x65,0x12,0x33,0xd2,0x3e,0x34,0xbd,0x3, +0x38,0x23,0x49,0x32,0x6d,0x16,0xbe,0x34,0x6, 0x50,0x40,0x19,0x7e,0x3, 0x6e,0xb2, +0x7e,0x10,0x40,0xac,0x1, 0x9e,0x4, 0x0, 0x65,0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0xbd,0x30,0x28,0x4, 0x7e,0x14,0xff,0xff,0x7d,0x31,0x22,0x9d,0x32,0x12,0x24, +0x56,0xbe,0x34,0x4, 0x0, 0x22,0x9d,0x32,0x12,0x24,0x56,0xbe,0x34,0x1, 0x0, 0x22, +0x6c,0x0, 0x7e,0x70,0x9, 0xac,0x71,0x19,0x3, 0x59,0xe1,0x22,0xca,0x3b,0x7c,0xab, +0x7d,0x3, 0x7e,0x20,0x10,0x7d,0x30,0x7e,0x90,0x9, 0xac,0x95,0x9, 0x34,0x6d,0x1a, +0xbe,0x30,0x10,0x28,0x2, 0x7c,0x23,0xbe,0x20,0x20,0x28,0x3, 0x7e,0x20,0x20,0x49, +0xe4,0x6d,0x14,0xbe,0xe4,0x6, 0x50,0x40,0x20,0x7e,0x33,0x6e,0xb1,0x12,0xb4,0xbe, +0xbd,0xef,0x38,0x15,0x49,0xe4,0x6d,0x16,0xbe,0xe4,0x6, 0x50,0x40,0xb, 0x7e,0x33, +0x6e,0xb2,0x12,0xb4,0xbe,0xbd,0xef,0x28,0x3, 0x7e,0x20,0x8, 0x7e,0xf0,0x10,0xac, +0xf2,0xbd,0x70,0x40,0x63,0x7e,0xf0,0x9, 0xac,0xf4,0x9, 0xb7,0x59,0xe6,0x70,0x58, +0x7e,0xd0,0x8, 0xac,0xd2,0xbd,0x60,0x50,0x3c,0x9, 0xb7,0x59,0xdf,0x70,0x1f,0x9, +0xb7,0x59,0xe0,0xbe,0xb0,0x0, 0x28,0xc, 0x7d,0x37,0x2e,0x34,0x59,0xe0,0x14,0x7a, +0x39,0xb0,0x80,0x6, 0x74,0x1, 0x19,0xb7,0x59,0xdf,0x6d,0x33,0x80,0x3a,0x9, 0xb7, +0x59,0xe0,0xbe,0xb0,0x14,0x50,0x31,0x7d,0x37,0x2e,0x34,0x59,0xe0,0x4, 0x7a,0x39, +0xb0,0x6d,0x33,0x80,0x23,0xe4,0x19,0xb7,0x59,0xe0,0x19,0xb7,0x59,0xdf,0x6d,0x33, +0x74,0x1, 0x7a,0xb3,0x5c,0xd9,0x80,0x10,0x6c,0x33,0x7e,0xf0,0x9, 0xac,0xf4,0x19, +0x37,0x59,0xe0,0xe4,0x19,0xb7,0x59,0xdf,0x7e,0x30,0x8, 0xac,0x23,0xbd,0x10,0x40, +0x2a,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x33,0x6d,0xc8,0x59,0x34,0x6d,0x14,0x74,0x9, +0xa4,0x49,0x35,0x6d,0xca,0x74,0x9, 0xac,0xb5,0x59,0x35,0x6d,0x16,0x7e,0xa0,0x1, +0x7e,0x70,0x9, 0xac,0x74,0x19,0xa3,0x59,0xde,0x6d,0x33,0xda,0x3b,0x22,0x7e,0xf0, +0x40,0xac,0xf3,0x7d,0xf7,0x9e,0xf4,0x0, 0x65,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e, +0xf4,0x22,0x7e,0x8, 0x59,0xd4,0x7e,0x34,0x0, 0xa, 0x74,0x3, 0x12,0x24,0x34,0x7e, +0x8, 0x5a,0x38,0x7e,0x34,0x0, 0xa, 0xe4,0x2, 0x24,0x34,0xca,0x79,0x7e,0xb3,0x6e, +0x7c,0x7e,0x18,0x6e,0x22,0x70,0x11,0x12,0xb4,0xd2,0x7e,0x8, 0x62,0xae,0x7e,0x34, +0x0, 0xa, 0xe4,0x12,0x24,0x34,0xc1,0xec,0x6c,0xaa,0xc1,0xe5,0x7e,0xf0,0x9, 0xac, +0xfa,0x9, 0x37,0x6d,0x72,0xc2,0x0, 0xc2,0x1, 0x49,0xe7,0x6d,0x6e,0x4d,0xee,0x68, +0x11,0x7e,0xd4,0x21,0xde,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0xf0,0x1b,0xf4,0xbd,0xef, +0x78,0x2, 0xd2,0x0, 0x49,0xf7,0x6d,0x70,0x4d,0xff,0x68,0xd, 0x7e,0xd4,0x21,0xec, +0x12,0xb7,0x3, 0x1b,0x4, 0xbd,0xf0,0x78,0x2, 0xd2,0x1, 0xbe,0x30,0xff,0x78,0x2, +0xc1,0xe3,0x7e,0x10,0x9, 0xac,0x13,0x7f,0x61,0x2d,0xd0,0x7e,0x6b,0xb0,0xb4,0x2, +0x2, 0x80,0x2, 0xc1,0xb6,0x7e,0x10,0x4, 0xac,0x13,0x49,0xd0,0x62,0x86,0x7d,0xce, +0x9d,0xcd,0xbe,0xc4,0x0, 0x0, 0x8, 0x6, 0x7d,0x4e,0x9d,0x4d,0x80,0x4, 0x6d,0x44, +0x9d,0x4c,0x49,0xb0,0x62,0x88,0x7d,0xcf,0x9d,0xcb,0xbe,0xc4,0x0, 0x0, 0x8, 0x6, +0x7d,0xf, 0x9d,0xb, 0x80,0x4, 0x6d,0x0, 0x9d,0xc, 0x7e,0x23,0x6e,0x7c,0xbe,0x20, +0x8, 0x40,0x8, 0x74,0xf, 0xa, 0xca,0x19,0xbc,0x59,0xd4,0xa, 0xca,0x9, 0xbc,0x62, +0xae,0x70,0xe, 0x7d,0xc0,0x2d,0xc4,0xbe,0xc4,0x0, 0x4, 0x50,0x4, 0x6d,0x0, 0x7d, +0x40,0xa, 0xca,0x9, 0x2c,0x59,0xd4,0xa, 0xc2,0xbd,0xc4,0x28,0x52,0xbd,0xc0,0x28, +0x4e,0x20,0x0, 0x3, 0x12,0xb6,0xf9,0x20,0x1, 0x12,0x7e,0xf0,0x4, 0xac,0xf3,0x49, +0xb7,0x62,0x88,0x7e,0xf0,0x9, 0xac,0xfa,0x59,0xb7,0x6d,0x70,0xa, 0xba,0x2e,0xb4, +0x5a,0x38,0x7e,0xb9,0xb0,0x4, 0x7a,0xb9,0xb0,0xa, 0xba,0x9, 0xbb,0x5a,0x38,0xbe, +0xb0,0x32,0x50,0x2, 0xc1,0xe3,0xa, 0xba,0x9, 0xbb,0x59,0xd4,0xbe,0xb0,0x8, 0x40, +0x2, 0xc1,0xe3,0xa, 0xba,0x2e,0xb4,0x59,0xd4,0x4, 0x7a,0xb9,0xb0,0xc1,0xe3,0xbd, +0xc4,0x28,0x56,0xbd,0xc0,0x28,0x52,0x20,0x0, 0x4f,0x20,0x1, 0x4c,0x7e,0xb3,0x78, +0x13,0x70,0x46,0x12,0xb6,0xf9,0x7e,0xf0,0x4, 0xac,0xf3,0x49,0xd7,0x62,0x88,0x7e, +0xf0,0x9, 0xac,0xfa,0x59,0xd7,0x6d,0x70,0xa, 0xda,0x2e,0xd4,0x5a,0x38,0x7e,0xd9, +0xb0,0x4, 0x7a,0xd9,0xb0,0xa, 0xda,0x9, 0xbd,0x5a,0x38,0xbe,0xb0,0x32,0x50,0x2, +0xc1,0xe3,0xa, 0xda,0x9, 0xbd,0x59,0xd4,0xbe,0xb0,0x8, 0x50,0x76,0xa, 0xda,0x2e, +0xd4,0x59,0xd4,0x4, 0x7a,0xd9,0xb0,0x80,0x6a,0x74,0x1, 0xa, 0xda,0x19,0xbd,0x62, +0xae,0x12,0xb6,0xef,0x7e,0xf0,0x4, 0xac,0xf3,0x59,0xf7,0x62,0x88,0xbe,0x20,0x8, +0x40,0xa, 0x74,0x1, 0xa, 0xda,0x19,0xbd,0x59,0xd4,0x80,0x11,0xbe,0x20,0x1, 0x28, +0xc, 0xa, 0xda,0x2e,0xd4,0x59,0xd4,0x7c,0xb2,0x14,0x7a,0xd9,0xb0,0xe4,0xa, 0xda, +0x19,0xbd,0x5a,0x38,0x80,0x2d,0x7e,0xf0,0x9, 0xac,0xf3,0x7f,0x61,0x2d,0xd7,0x7e, +0x6b,0xb0,0x70,0x9, 0x12,0xb6,0xef,0x59,0xf7,0x62,0x88,0x80,0x16,0x7e,0xf0,0x9, +0xac,0xf3,0x7f,0x71,0x2d,0xf7,0x7e,0x7b,0xb0,0xb4,0x1, 0x7, 0xe4,0xa, 0xfa,0x19, +0xbf,0x62,0xae,0xb, 0xa0,0x12,0x4c,0xf7,0x28,0x2, 0xa1,0xc, 0xda,0x79,0x22,0x7e, +0xf0,0x4, 0xac,0xf3,0x59,0xe7,0x62,0x86,0x22,0x7e,0xf0,0x9, 0xac,0xfa,0x59,0xd7, +0x6d,0x6e,0x22,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x0, 0x22,0x6c,0x77,0x7e,0xa0,0xff, +0x7e,0x78,0xff,0xff,0x6d,0x44,0x6c,0x66,0x7e,0x14,0x0, 0x1, 0x7c,0xb6,0x60,0x5, +0x3e,0x14,0x14,0x78,0xfb,0x7e,0xb3,0x74,0x7b,0xa, 0x2b,0x5d,0x21,0xbe,0x24,0x0, +0x0, 0x8, 0xd, 0x7e,0x24,0xff,0xff,0x7e,0x30,0x26,0xac,0x36,0x59,0x21,0x74,0x84, +0x12,0xb7,0xa4,0x6d,0x0, 0xbf,0x7, 0x50,0x8, 0x7f,0x70,0x49,0x42,0x74,0x86,0x7c, +0x76,0xb, 0x60,0xa5,0xbe,0x3, 0xc1,0x7e,0x63,0x74,0x7e,0xbc,0x67,0x68,0x42,0x12, +0xb7,0xa4,0x7d,0xc1,0x1e,0xc4,0x1e,0xc4,0x7e,0xd4,0x0, 0x3, 0xad,0xdc,0x6d,0xcc, +0xbf,0x76,0x50,0xb, 0x7e,0xd4,0x22,0x2c,0x12,0xb7,0x3, 0xbd,0x4, 0x38,0x20,0x1e, +0x14,0x6d,0x0, 0xbf,0x70,0x50,0x1a,0x7e,0x50,0x26,0xac,0x56,0x49,0x12,0x74,0x86, +0x7e,0xf4,0x22,0x2c,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x12,0x28,0x2, 0x7c, +0xa7,0x7c,0xba,0x22,0x7e,0x50,0x26,0xac,0x56,0x49,0x12,0x74,0x84,0x22,0x7e,0xa3, +0x6e,0x7d,0xbe,0xa0,0x0, 0x38,0x23,0xbe,0xa3,0x6e,0x7c,0x50,0x18,0x7e,0xb3,0x6e, +0x86,0xbe,0xb3,0x5c,0xdb,0x28,0x13,0x7e,0xb3,0x5c,0xdb,0x4, 0x7a,0xb3,0x5c,0xdb, +0x7a,0xa3,0x6e,0x7c,0x22,0xe4,0x7a,0xb3,0x5c,0xdb,0x22,0x7e,0x73,0x6e,0x7d,0xbe, +0x73,0x6e,0x7c,0x78,0x7d,0x7e,0xb3,0x6e,0x7c,0xb4,0x1, 0x76,0x7e,0xb3,0x5c,0xdc, +0xbe,0xb0,0x2, 0x38,0x13,0x4, 0x7a,0xb3,0x5c,0xdc,0x7e,0x37,0x6d,0x14,0x7a,0x37, +0x5c,0xdf,0x7e,0x37,0x6d,0x16,0x80,0x69,0x7e,0x37,0x5c,0xdd,0xbe,0x34,0x6, 0xa4, +0x50,0x4e,0x7e,0x27,0x6d,0x14,0x7d,0x12,0x9e,0x17,0x5c,0xdf,0xbe,0x14,0x0, 0x0, +0x8, 0x8, 0x7d,0x32,0x9e,0x37,0x5c,0xdf,0x80,0x4, 0x6d,0x33,0x9d,0x31,0x2e,0x37, +0x5c,0xdd,0x7a,0x37,0x5c,0xdd,0x7e,0x37,0x6d,0x16,0x7d,0x3, 0x9e,0x7, 0x5c,0xe1, +0xbe,0x4, 0x0, 0x0, 0x8, 0x8, 0x7d,0x13,0x9e,0x17,0x5c,0xe1,0x80,0x4, 0x6d,0x11, +0x9d,0x10,0x2e,0x17,0x5c,0xdd,0x7a,0x17,0x5c,0xdd,0x7a,0x27,0x5c,0xdf,0x80,0x11, +0xd3,0x22,0xe4,0x7a,0xb3,0x5c,0xdc,0x6d,0x33,0x7a,0x37,0x5c,0xdd,0x7a,0x37,0x5c, +0xdf,0x7a,0x37,0x5c,0xe1,0xc3,0x22,0xca,0x3b,0xbd,0x13,0x50,0x8, 0x7d,0x73,0x9d, +0x71,0x6d,0x66,0x80,0x6, 0x7d,0x71,0x9d,0x73,0x6d,0x66,0xbd,0x2, 0x50,0x8, 0x7d, +0x92,0x9d,0x90,0x6d,0x88,0x80,0x6, 0x7d,0x90,0x9d,0x92,0x6d,0x88,0x7f,0x13,0x7f, +0x3, 0x12,0x22,0xa3,0x7f,0x31,0x7f,0x14,0x7f,0x4, 0x12,0x22,0xa3,0x7f,0x41,0x7f, +0x13,0x2f,0x14,0x12,0xb8,0xb9,0xda,0x3b,0x22,0x7f,0x61,0xbe,0x68,0x0, 0x6, 0x50, +0x15,0xbe,0x68,0x0, 0x2, 0x50,0x3, 0x7f,0x16,0x22,0x7f,0x16,0x1e,0x34,0x1e,0x24, +0x50,0x3, 0x4e,0x60,0x80,0x22,0x7f,0x76,0xe4,0x80,0xe, 0x7f,0x17,0x1e,0x34,0xe, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x4, 0xbe,0x78,0x0, 0x1, 0x18,0xec,0x1e, +0xb0,0x60,0x5, 0x2f,0x77,0x14,0x78,0xfb,0x7f,0x17,0x2f,0x17,0x2f,0x17,0x1e,0x34, +0xe, 0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x7f,0x57,0x7f,0x16,0x7f,0x7, 0x12, +0x22,0xbf,0x2f,0x17,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x7d, +0x2b,0x7d,0x3f,0x9d,0x32,0x12,0x24,0x56,0xbe,0x34,0x0, 0x1, 0x18,0xdb,0x7f,0x17, +0x22,0x6c,0xaa,0x6c,0x33,0x80,0x4e,0x7e,0x90,0x4, 0xac,0x93,0x7e,0x10,0x28,0xac, +0x1a,0x7d,0xe0,0x2d,0xe4,0x49,0xe, 0x5a,0x6b,0x7d,0xf3,0x9d,0xf0,0xbe,0xf4,0x0, +0x0, 0x8, 0x6, 0x7d,0x43,0x9d,0x40,0x80,0x4, 0x6d,0x44,0x9d,0x4f,0x49,0xde,0x5a, +0x6d,0x7d,0xf2,0x9d,0xfd,0xbe,0xf4,0x0, 0x0, 0x8, 0x6, 0x7d,0x2, 0x9d,0xd, 0x80, +0x4, 0x6d,0x0, 0x9d,0xf, 0xbe,0x44,0x0, 0x50,0x50,0x8, 0xbe,0x4, 0x0, 0x50,0x50, +0x2, 0xd3,0x22,0xb, 0x30,0xa, 0xfa,0x9, 0x2f,0x5a,0x5c,0xbc,0x23,0x38,0xa8,0xb, +0xa0,0xbe,0xa0,0xf, 0x40,0x9d,0xc3,0x22,0x12,0x54,0xc8,0x74,0x2, 0xac,0x7b,0x7e, +0x8, 0x5c,0xc5,0xe4,0x12,0x24,0x34,0x90,0x21,0x51,0x93,0x7c,0x7b,0x74,0x2, 0xac, +0x7b,0x7e,0x8, 0x5a,0x44,0xe4,0x2, 0x24,0x34,0x7e,0xb3,0x5c,0xc4,0xbe,0xb0,0xfa, +0x50,0x5, 0x4, 0x7a,0xb3,0x5c,0xc4,0x22,0x6c,0xaa,0x80,0x63,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x6d,0xc8,0x12,0x2f,0xb0,0x59,0x32,0x6d,0x14,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x6d,0xca,0x12,0x2f,0xb0,0x59,0x32,0x6d,0x16,0x7e,0x90,0x9, 0xac, +0x9a,0x9, 0xb4,0x6d,0xcc,0x19,0xb4,0x6d,0x18,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4, +0x6d,0xcd,0x19,0xb4,0x6d,0x19,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6d,0xce,0x19, +0xb4,0x6d,0x1a,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6d,0xcf,0x19,0xb4,0x6d,0x1b, +0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6d,0xd0,0x19,0xb4,0x6d,0x1c,0xb, 0xa0,0x12, +0x4c,0xf7,0x38,0x98,0x22,0x12,0xbb,0x9b,0x12,0xbb,0xa5,0x12,0xba,0x48,0x2, 0xba, +0x41,0x74,0x1, 0x7a,0xb3,0x78,0x44,0x22,0xca,0x3b,0x7e,0xf3,0x6e,0xb0,0x7e,0xe3, +0x6e,0xb1,0x7e,0xd3,0x6e,0xb2,0x6d,0x88,0x6c,0xcc,0x80,0x15,0x7d,0x18,0x3e,0x14, +0x2e,0x14,0x4, 0x0, 0x6d,0x0, 0x7c,0xbd,0x12,0xba,0x78,0xa, 0x9f,0x2d,0x89,0xb, +0xc0,0xbc,0xec,0x38,0xe7,0xda,0x3b,0x22,0xca,0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x0, +0x75,0x26,0x0, 0x9f,0x55,0x6d,0x11,0x7d,0xd1,0x7d,0xc1,0x7d,0x91,0x7e,0x4, 0x7f, +0xff,0x6c,0xee,0x80,0x26,0x74,0x2, 0xac,0xbe,0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30, +0x12,0x24,0x56,0x7d,0xc3,0xbd,0xdc,0x58,0x2, 0x7d,0xdc,0xbd,0xc, 0x8, 0x2, 0x7d, +0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x2f,0x51,0xb, 0xe0,0xbc,0xfe,0x38,0xd6,0xbe, +0xd4,0x0, 0x1e,0x58,0xa, 0x7e,0xb3,0x6c,0xf4,0x70,0x4, 0x6d,0x33,0x61,0x8e,0xbe, +0xd4,0x4, 0xb0,0x8, 0x2, 0xd2,0x0, 0xbe,0xd4,0x4, 0xb0,0x8, 0x11,0x7e,0xd4,0x0, +0xa0,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x38,0x7e,0xd4,0x2, 0x58,0x80,0x32,0xbe,0xd4, +0x3, 0x20,0x8, 0x11,0x7e,0xd4,0x0, 0x96,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x21,0x7e, +0xd4,0x2, 0x26,0x80,0x1b,0xbe,0xd4,0x0, 0x0, 0x8, 0x11,0x7e,0xd4,0x0, 0x8c,0x7e, +0xb3,0x76,0x5a,0xb4,0x1, 0xa, 0x7e,0xd4,0x1, 0xc2,0x80,0x4, 0x6d,0x33,0x80,0x6e, +0xbd,0xd, 0x8, 0x5, 0x30,0x0, 0x2, 0x7d,0xd0,0xa, 0x1f,0x12,0xbb,0x91,0x9f,0x55, +0x7f,0x27,0x6c,0xee,0x80,0x1c,0xb, 0x2a,0x90,0xb, 0x55,0x7d,0x39,0x12,0x24,0x56, +0x7d,0xc3,0xbd,0x1c,0x8, 0xa, 0x7d,0x39,0x1a,0x26,0x1a,0x24,0x2f,0x51,0x5, 0x26, +0xb, 0xe0,0xbc,0xfe,0x38,0xe0,0x6d,0x11,0xe5,0x26,0xbe,0xb0,0x0, 0x28,0x7, 0xe5, +0x26,0xa, 0x1b,0x12,0xbb,0x91,0xbd,0x1d,0x8, 0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, +0x9d,0xd, 0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c,0xee,0x80,0xc, 0xb, 0x7a,0x0, 0x9d, +0x1, 0x1b,0x7a,0x0, 0xb, 0xf5,0xb, 0xe0,0xbc,0xfe,0x38,0xf0,0x7d,0x31,0xda,0x79, +0x22,0x6d,0x0, 0x7f,0x15,0x12,0x23,0x10,0x7d,0x13,0x22,0xe4,0x7a,0xb3,0x6d,0xb, +0x7a,0xb3,0x6d,0xc, 0x22,0x7e,0x8, 0x8, 0xc, 0x7e,0x1f,0x24,0x68,0x12,0x77,0x75, +0x7e,0x37,0x73,0x21,0x7e,0x50,0x4, 0x7d,0x3, 0x3e,0x4, 0x7e,0x2f,0x24,0x68,0x2d, +0x50,0xb, 0x2a,0x10,0x59,0x10,0x8, 0xc, 0xb, 0x34,0x1b,0x50,0x78,0xe9,0x22,0xca, +0x79,0x7e,0x73,0x6e,0x7c,0x4c,0x77,0x68,0x5, 0xbe,0x70,0x1, 0x28,0xb, 0x12,0xbd, +0xe0,0x74,0x1e,0x7a,0xb3,0x77,0xcf,0xa1,0xd5,0x7e,0xb3,0x77,0xb3,0x70,0x4a,0x7e, +0xb3,0x6e,0x7d,0x70,0x44,0xa5,0xbf,0x1, 0x40,0x7e,0x57,0x6d,0x70,0xbe,0x54,0x5, +0x50,0x28,0x36,0xbe,0x54,0x5, 0xa0,0x50,0x30,0x7e,0xc7,0x6d,0x6e,0xbe,0xc4,0x0, +0x50,0x28,0x26,0xbe,0xc4,0x2, 0x76,0x50,0x20,0x7a,0xc7,0x77,0xc6,0x7a,0x57,0x77, +0xc8,0x7e,0xc7,0x77,0xc6,0x7a,0xc7,0x77,0xb4,0x7a,0x57,0x77,0xb6,0x74,0x1, 0x7a, +0xb3,0x77,0xb3,0x74,0x1e,0x7a,0xb3,0x77,0xcf,0x7e,0xa3,0x77,0xb3,0xbe,0xa0,0x1, +0x68,0x2, 0x81,0xd3,0x7e,0xb3,0x6e,0x7d,0xb4,0x1, 0x2, 0x80,0x2, 0x81,0xd3,0xa5, +0xbf,0x1, 0x2, 0x80,0x2, 0x81,0xd3,0x12,0xbd,0xe9,0x28,0x77,0xbe,0xc4,0x5, 0xa0, +0x50,0x71,0x7e,0xf7,0x6d,0x6e,0x7a,0xf7,0x77,0xc6,0x7a,0xc7,0x77,0xc8,0x7e,0xf7, +0x77,0xc6,0x9e,0xf7,0x77,0xb4,0x7d,0x4c,0x9e,0x47,0x77,0xb6,0xbe,0xf4,0x0, 0x0, +0x8, 0x6, 0x7d,0xcf,0x7d,0xdc,0x80,0x4, 0x6d,0xdd,0x9d,0xdf,0xbe,0x44,0x0, 0x0, +0x8, 0x6, 0x7d,0xc4,0x7d,0xec,0x80,0x4, 0x6d,0xee,0x9d,0xe4,0xbe,0xd4,0x0, 0x64, +0x58,0x2e,0xbe,0xe4,0x0, 0x64,0x58,0x28,0x7d,0xce,0x2d,0xcd,0xbe,0xc4,0x0, 0x96, +0x58,0x1e,0x7d,0xcf,0xe, 0xc4,0xe, 0xc4,0x2e,0xc7,0x77,0xb4,0x7a,0xc7,0x6d,0x6e, +0x7d,0xc4,0xe, 0xc4,0xe, 0xc4,0x2e,0xc7,0x77,0xb6,0x7a,0xc7,0x6d,0x70,0x80,0x3, +0x75,0x6b,0x1, 0xe5,0x6b,0xbe,0xb0,0x1, 0x68,0xe, 0x12,0xbd,0xe9,0x28,0x2, 0xa1, +0xc5,0xbe,0xa0,0x1, 0x68,0x2, 0xa1,0xc5,0x75,0x6b,0x1, 0xbe,0xa0,0x1, 0x78,0x6, +0x74,0x1d,0x7a,0xb3,0x77,0xcf,0xe4,0x7a,0xb3,0x77,0xb3,0x7e,0x37,0x6d,0x6e,0x7d, +0xf3,0x9e,0xf7,0x77,0xbd,0x7e,0x47,0x6d,0x70,0x9e,0x47,0x77,0xbf,0xbe,0xf4,0x0, +0x0, 0x8, 0x6, 0x7d,0x2f,0x7d,0xd2,0x80,0x4, 0x6d,0xdd,0x9d,0xdf,0xbe,0x44,0x0, +0x0, 0x8, 0x6, 0x7d,0x24,0x7d,0xe2,0x80,0x4, 0x6d,0xee,0x9d,0xe4,0x7e,0xf3,0x77, +0xcf,0x7c,0x1f,0x2e,0x10,0x4d,0xa5,0xe7,0x7c,0xeb,0xa, 0x9e,0x6d,0x88,0x7e,0x8, +0x0, 0x40,0x9f,0x4, 0x6d,0x22,0x12,0x22,0xa3,0x7f,0x51,0x7e,0x37,0x77,0xbd,0x6d, +0x22,0x7f,0x4, 0x12,0xbd,0xd8,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14, +0x78,0xf4,0x7d,0x53,0x7a,0x57,0x6d,0x6e,0xa, 0x3e,0x6d,0x22,0x7e,0x8, 0x0, 0x40, +0x9f,0x1, 0x7e,0x37,0x6d,0x70,0x12,0x22,0xa3,0x7f,0x51,0xa, 0x1e,0x6d,0x0, 0x7e, +0x37,0x77,0xbf,0x6d,0x22,0x12,0xbd,0xd8,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60, +0x80,0x14,0x78,0xf4,0x7d,0x53,0x7a,0x57,0x6d,0x70,0xbe,0xf0,0x0, 0x28,0x1f,0xbe, +0xd4,0x0, 0x2, 0x18,0x10,0xbe,0xe4,0x0, 0x2, 0x18,0xa, 0x7d,0x5e,0x2d,0x5d,0xbe, +0x54,0x0, 0x4, 0x8, 0x9, 0x7c,0xbf,0x14,0x7a,0xb3,0x77,0xcf,0x80,0x7, 0x4c,0xff, +0x78,0x3, 0x12,0xbd,0xe0,0x7e,0x57,0x6d,0x6e,0x7a,0x57,0x77,0xbd,0x7e,0x57,0x6d, +0x70,0x7a,0x57,0x77,0xbf,0xda,0x79,0x22,0x12,0x22,0xa3,0x2f,0x15,0x74,0x6, 0x22, +0xe4,0x7a,0xb3,0x77,0xb3,0x75,0x6b,0x0, 0x22,0x7e,0xc7,0x6d,0x70,0xbe,0xc4,0x5, +0x50,0x22,0x12,0xbe,0x39,0x28,0x3a,0x7e,0xb3,0x6e,0x7d,0x70,0x34,0x7e,0x37,0x6c, +0xe0,0xbe,0x34,0x0, 0x26,0x28,0x2f,0x7e,0xb3,0x78,0x27,0xbe,0xb0,0x2, 0x50,0x26, +0x4, 0x7a,0xb3,0x78,0x27,0x6c,0x33,0x80,0x9, 0xc2,0x2, 0x7c,0xb3,0x12,0x57,0x49, +0xb, 0x30,0x7e,0x23,0x6c,0xde,0xbc,0x23,0x38,0xef,0xe4,0x7a,0xb3,0x6c,0xde,0x80, +0x5, 0xe4,0x7a,0xb3,0x78,0x27,0x2, 0x2f,0x20,0x7e,0x73,0x6c,0xde,0xbe,0x70,0x0, +0x22,0x7e,0x63,0x6e,0xb0,0x7e,0x73,0x6e,0xaf,0xac,0x76,0x7d,0x13,0x1e,0x14,0x7e, +0x27,0x6c,0xe2,0x2e,0x27,0x6c,0xe0,0xbd,0x21,0x38,0x16,0x1e,0x34,0x1e,0x34,0x7d, +0x23,0x2e,0x24,0x0, 0x14,0xbe,0x27,0x6c,0xe0,0x40,0x6, 0xbe,0x37,0x6c,0xe2,0x50, +0x2, 0xd3,0x22,0xc3,0x22,0x7e,0x37,0x6c,0xe2,0x2e,0x37,0x6c,0xe0,0xbe,0x37,0x6c, +0xf9,0x28,0x2, 0xd3,0x22,0xc3,0x22,0xe4,0x7a,0xb3,0x6c,0xff,0x75,0x26,0x0, 0x75, +0x27,0x0, 0x7e,0xb3,0x6e,0xaf,0xf5,0x28,0x7e,0xb3,0x6e,0xb0,0xf5,0x29,0x7e,0x8, +0x0, 0x26,0x7e,0x37,0x6e,0x8d,0x12,0x57,0x71,0xe4,0x33,0x7a,0xb3,0x6c,0xff,0xe4, +0x7a,0xb3,0x6d,0x8, 0x12,0xbe,0x75,0x33,0x7a,0xb3,0x6d,0x8, 0x74,0x1, 0x7a,0xb3, +0x6d,0x9, 0x12,0xbe,0xcc,0xe4,0x33,0x7a,0xb3,0x6d,0x9, 0x22,0xd2,0x0, 0x6c,0x99, +0x80,0x31,0x74,0x2, 0xac,0xb9,0x9, 0x5, 0x75,0xc9,0x9, 0x15,0x75,0xca,0x12,0xbf, +0x49,0x49,0x25,0x75,0x8c,0x7d,0xf3,0x9d,0xf2,0xbe,0xf4,0x0, 0x0, 0x8, 0x4, 0x7d, +0x1f,0x80,0x4, 0x6d,0x11,0x9d,0x1f,0xbe,0x17,0x6c,0xf7,0x28,0x4, 0xc2,0x0, 0x80, +0xa, 0xb, 0x90,0x7e,0x83,0x75,0xc8,0xbc,0x89,0x38,0xc7,0x20,0x0, 0x2d,0x6c,0x99, +0x80,0x1d,0x74,0x2, 0xac,0xb9,0x9, 0x5, 0x6b,0x54,0x9, 0x15,0x6b,0x55,0x12,0xbf, +0x49,0x59,0x35,0x75,0x8c,0x19,0x5, 0x75,0xc9,0x19,0x15,0x75,0xca,0xb, 0x90,0x7e, +0x73,0x6c,0xde,0xbc,0x79,0x38,0xdb,0x7a,0x73,0x75,0xc8,0x7e,0xb3,0x6c,0xde,0x70, +0x5, 0xe4,0x7a,0xb3,0x75,0xc8,0xa2,0x0, 0x22,0x7c,0xb0,0x7c,0x71,0x12,0x57,0x9, +0x74,0x2, 0xac,0xb9,0x22,0xe4,0x7a,0xb3,0x6d,0x7, 0x7a,0xb3,0x6d,0x7, 0x22,0x7c, +0x67,0x7e,0xb, 0x70,0xbc,0x7b,0x38,0x1a,0x29,0x70,0x0, 0x2, 0xbc,0x7b,0x28,0x12, +0x29,0x70,0x0, 0x1, 0xbc,0x76,0x38,0xa, 0x29,0x70,0x0, 0x3, 0xbc,0x76,0x28,0x2, +0xd3,0x22,0xc3,0x22,0x6c,0x44,0xc2,0x1, 0x7e,0x47,0x75,0x0, 0x7e,0x7, 0x75,0x2, +0x12,0x8f,0x4b,0x40,0x4, 0xd2,0x1, 0x80,0x6, 0xa5,0xbf,0x1, 0x2, 0xd2,0x1, 0x7e, +0xb3,0x74,0x81,0x60,0x3, 0x2, 0xc0,0x34,0x7e,0xb3,0x75,0x9, 0x4, 0x7a,0xb3,0x75, +0x9, 0x7d,0x34,0x12,0xc0,0x80,0xbe,0xb0,0x1, 0x40,0x8, 0x4e,0x40,0x4, 0xe4,0x7a, +0xb3,0x75,0x9, 0xbe,0x44,0x0, 0x0, 0x28,0x10,0x7e,0x17,0x74,0x7c,0xbd,0x10,0x50, +0x8, 0x4e,0x40,0x2, 0xe4,0x7a,0xb3,0x75,0x9, 0x7e,0x17,0x74,0x7c,0xbd,0x10,0x50, +0x17,0x7e,0xb3,0x75,0x8, 0x4, 0x7a,0xb3,0x75,0x8, 0xbe,0x4, 0xb, 0xb8,0x28,0x16, +0x7e,0xb3,0x75,0x8, 0xb, 0xb2,0x80,0xa, 0x7e,0xb3,0x75,0x8, 0xbe,0xb0,0x0, 0x28, +0x5, 0x14,0x7a,0xb3,0x75,0x8, 0x7e,0x53,0x75,0x8, 0xbe,0x50,0xa, 0x40,0x11,0xe4, +0x7a,0xb3,0x75,0x8, 0x7a,0x43,0x74,0xf4,0x74,0x1, 0x7a,0xb3,0x74,0x81,0x80,0x14, +0x7e,0x73,0x75,0x9, 0xbe,0x70,0x20,0x40,0xb, 0x74,0x20,0x7a,0xb3,0x75,0x9, 0xe4, +0x7a,0xb3,0x74,0xf4,0x7d,0x34,0x7d,0x20,0x2, 0xc0,0x3b,0x7d,0x2, 0x12,0xc0,0x80, +0x7c,0x7b,0xbe,0x70,0x1, 0x40,0x1d,0x7e,0x34,0x22,0x32,0x7e,0x24,0x0, 0xff,0xb, +0x1a,0x20,0x7e,0x34,0x0, 0xa, 0xad,0x32,0x1e,0x34,0xbd,0x30,0x38,0x6, 0x74,0x1, +0x7a,0xb3,0x75,0x7, 0x7e,0xb3,0x75,0x7, 0xbe,0xb0,0x0, 0x28,0xa, 0x14,0x7a,0xb3, +0x75,0x7, 0xe4,0x7a,0xb3,0x25,0xae,0x30,0x17,0x3, 0xd2,0x19,0x22,0xc2,0x19,0x22, +0x6c,0xaa,0x6c,0x55,0x7e,0x14,0x0, 0x1, 0x7c,0xb5,0x60,0x5, 0x3e,0x14,0x14,0x78, +0xfb,0x5d,0x13,0x68,0x2, 0xb, 0xa0,0xb, 0x50,0xbe,0x50,0x10,0x40,0xe6,0x7c,0xba, +0x22,0x7c,0xa7,0x7c,0x3b,0x7e,0xb3,0x76,0x5a,0xbe,0xb0,0x1, 0x78,0x2, 0x21,0x99, +0xe5,0x1e,0x70,0x2, 0x21,0x99,0x7e,0xb3,0x73,0x1e,0x70,0x2, 0x21,0x99,0x12,0xc1, +0xac,0x7c,0xb3,0x7c,0x7a,0x12,0xbf,0x84,0x12,0xc1,0xe3,0x7e,0xb3,0x74,0x81,0x1b, +0xb1,0x68,0x20,0x4, 0x68,0x2, 0x21,0x99,0x7e,0x73,0x74,0x7e,0x7a,0x73,0x74,0x7f, +0xe4,0x7a,0xb3,0x74,0x80,0x6c,0xaa,0x12,0xc1,0xc0,0xbe,0xa0,0x3, 0x78,0xf8,0x74, +0x2, 0x21,0x95,0x7e,0x43,0x74,0x7f,0x7e,0x50,0x26,0xac,0x45,0x7d,0x32,0x2e,0x34, +0x74,0x83,0x12,0xc1,0x9a,0x9, 0x72,0x74,0x83,0xbe,0x70,0x2, 0x50,0x2, 0x21,0x99, +0xe4,0x19,0xb2,0x74,0x83,0x49,0x12,0x74,0x84,0x2e,0x17,0x74,0xfc,0xbe,0x14,0x7f, +0xff,0x50,0xb, 0x7d,0x32,0x2e,0x34,0x74,0x84,0x1b,0x38,0x10,0x80,0x8, 0x7e,0x34, +0x7f,0xff,0x59,0x32,0x74,0x84,0x49,0x32,0x74,0x86,0xbe,0x37,0x74,0xfc,0x50,0x8, +0x7e,0x37,0x74,0xfc,0x59,0x32,0x74,0x86,0x7e,0x37,0x75,0x0, 0x12,0xc0,0x80,0xa, +0x4b,0x7e,0xa3,0x74,0x7f,0x7e,0x50,0x26,0xac,0x5a,0x2e,0x24,0x74,0x88,0xb, 0x28, +0x30,0x2d,0x34,0x1b,0x28,0x30,0xbe,0xa0,0x2, 0x50,0x5, 0x7c,0xba,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x74,0x7f,0x12,0xc1,0xa2,0x38,0x1f,0x12,0xb7,0xb, 0xbe,0xb0,0xff, +0x68,0x12,0x30,0x18,0xf, 0x7e,0x73,0x74,0x7e,0x12,0x36,0x9c,0x12,0x37,0x94,0xe4, +0x7a,0xb3,0x74,0xf4,0xe4,0x7a,0xb3,0x74,0x81,0x22,0x7e,0x39,0xb0,0x4, 0x7a,0x39, +0xb0,0x22,0x90,0x22,0x34,0xe4,0x93,0xbe,0xb3,0x74,0x80,0x22,0x7e,0x34,0x22,0x32, +0x12,0x29,0xdb,0x7a,0x37,0x74,0x7c,0x7e,0x34,0x5, 0xdc,0x7a,0x37,0x74,0xf8,0x22, +0x6d,0x33,0x7e,0x90,0x26,0xac,0x9a,0x59,0x34,0x74,0x84,0x59,0x34,0x74,0x86,0x59, +0x34,0x74,0x88,0x59,0x34,0x74,0x8a,0x59,0x34,0x74,0x8c,0xe4,0x19,0xb4,0x74,0x83, +0xb, 0xa0,0x22,0xc2,0x16,0xd2,0x18,0x7e,0x37,0x74,0xf8,0xbe,0x37,0x75,0x2, 0x50, +0x2, 0xd2,0x16,0x30,0x26,0x4, 0x74,0x64,0x80,0x7, 0x7e,0xb3,0x74,0xfa,0x60,0x5, +0x14,0x7a,0xb3,0x74,0xfa,0x30,0x16,0x5, 0xe4,0x7a,0xb3,0x74,0xfa,0x7e,0xb3,0x74, +0xfa,0x60,0x2, 0xc2,0x18,0x22,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x80,0x78, +0x17,0x7e,0xe0,0xff,0x6c,0xff,0x12,0xc2,0x6e,0x38,0x4, 0x7c,0xe7,0x7c,0xdf,0xb, +0xf0,0xbe,0xf0,0x3, 0x78,0xf0,0x80,0x19,0xbe,0xd0,0x81,0x78,0x14,0x6c,0xee,0x6c, +0xff,0x12,0xc2,0x6e,0x40,0x4, 0x7c,0xe7,0x7c,0xdf,0xb, 0xf0,0xbe,0xf0,0x3, 0x78, +0xf0,0xbe,0xd0,0x3, 0x40,0x2, 0x6c,0xdd,0x7e,0x73,0x74,0x7e,0xbc,0x7d,0x68,0x5, +0x7c,0xbd,0x12,0x36,0x9c,0x7a,0xd3,0x76,0x86,0xda,0x79,0xda,0xd8,0x22,0x74,0x26, +0xac,0xbf,0x9, 0x75,0x74,0x82,0xbc,0x7e,0x22,0x7c,0x37,0x7c,0x2b,0x7e,0xb3,0x73, +0x1e,0x70,0x2, 0x61,0x1f,0x12,0xc3,0x20,0x7e,0xb3,0x75,0x6, 0xbc,0xba,0x78,0x2, +0x61,0x1f,0xa5,0xba,0x0, 0x1b,0x7e,0x90,0x26,0xac,0x9a,0x49,0xf4,0x74,0x9e,0x49, +0xe4,0x74,0x9c,0xa5,0xbb,0x3, 0x15,0x49,0xf4,0x74,0xa6,0x49,0xe4,0x74,0xa4,0x80, +0xb, 0x74,0x26,0xa4,0x49,0xf5,0x74,0xa2,0x49,0xe5,0x74,0xa0,0x7e,0x73,0x6e,0xb0, +0x7a,0x73,0x62,0xb9,0x7e,0x73,0x6e,0xaf,0x7a,0x73,0x62,0xb8,0xe4,0x7a,0xb3,0x62, +0xba,0x7a,0xb3,0x62,0xbb,0x6d,0x33,0x7a,0x37,0x62,0xc2,0x7e,0x1f,0x24,0x68,0x7a, +0x37,0x62,0xbc,0x7d,0x3f,0x7a,0x37,0x62,0xbe,0x7e,0x1f,0x24,0x68,0x7a,0x37,0x62, +0xc0,0x7e,0x8, 0x62,0xb8,0x12,0x8, 0xe5,0x7e,0x37,0x73,0x21,0x6c,0x55,0xa, 0x15, +0x2d,0x13,0x3e,0x14,0x7f,0x27,0x2d,0x51,0xb, 0x2a,0x0, 0x7e,0x2f,0x24,0x68,0x2d, +0x51,0xb, 0x2a,0x10,0x9d,0x10,0x1b,0x2a,0x10,0xb, 0x50,0xa5,0xbd,0x4, 0xdf,0x22, +0x7e,0xb3,0x74,0xfb,0x12,0xc3,0x2a,0x7c,0xab,0x22,0x7c,0x7b,0x6c,0xaa,0x6c,0x66, +0xa, 0x26,0x12,0xc5,0xf, 0xbc,0xb7,0x78,0x4, 0x7c,0xa6,0x80,0x7, 0xb, 0x60,0xbe, +0x60,0x3, 0x40,0xec,0x7c,0xba,0x22,0xca,0x3b,0x7c,0x67,0x7c,0x7b,0x6d,0x22,0x7a, +0x25,0x28,0x7e,0x27,0x73,0x21,0xb, 0x26,0x7a,0x25,0x2a,0x7c,0xb6,0x12,0x8f,0x4b, +0x92,0x1, 0x30,0x1, 0x6, 0x4c,0x77,0x78,0x2, 0x81,0xdb,0x12,0xc3,0x20,0x7a,0xa1, +0x32,0x74,0x26,0xa4,0x49,0xb5,0x74,0x9e,0x49,0xa5,0x74,0x9c,0x49,0x95,0x74,0xa2, +0x49,0x85,0x74,0xa0,0x7e,0x34,0x62,0xba,0x1e,0x34,0x3e,0x34,0x7d,0x73,0x6d,0x66, +0x7e,0x34,0x66,0xc8,0x1e,0x34,0x3e,0x34,0x6d,0x22,0x7a,0x1d,0x2c,0x7e,0x18,0xc, +0x18,0x7a,0x1d,0x33,0x7f,0x3, 0x7e,0x18,0x10,0x24,0x74,0x1, 0x12,0x77,0xa4,0x12, +0xc4,0xde,0x6d,0x33,0x7a,0x35,0x26,0x7e,0x35,0x30,0x7d,0x13,0x3e,0x14,0x49,0x1, +0xc, 0x18,0x49,0x21,0x10,0x24,0x9d,0x20,0x2d,0x17,0x7d,0x6, 0x12,0xc4,0xe6,0x78, +0xe6,0x20,0x1, 0x2, 0x81,0x54,0x7e,0x73,0x75,0x6, 0xbe,0x71,0x32,0x68,0x3a,0x6d, +0x33,0x80,0x29,0x7e,0x35,0x26,0x7d,0x23,0x3e,0x24,0x7f,0x4, 0x2d,0x12,0xb, 0xa, +0x50,0x49,0x42,0x18,0x3c,0x2d,0x45,0x7f,0x5, 0x2d,0x12,0xb, 0xa, 0x10,0x49,0x52, +0x14,0x30,0x2d,0x51,0x12,0xc5,0x3, 0x1b,0xa, 0x20,0xb, 0x34,0x7a,0x35,0x26,0x7e, +0x35,0x2a,0xbe,0x35,0x26,0x38,0xcc,0x80,0x3b,0x7e,0x18,0x18,0x3c,0x7a,0x1d,0x33, +0x7e,0xd, 0x2c,0x7e,0x18,0x14,0x30,0x74,0x1, 0x12,0x77,0xa4,0x7e,0x1d,0x2c,0x7a, +0x1d,0x33,0x7f,0x3, 0x7f,0x13,0x12,0x76,0xb1,0x12,0xc4,0xde,0x6d,0x33,0x7a,0x35, +0x26,0x12,0xc4,0xfb,0x49,0x42,0x18,0x3c,0x49,0x52,0x14,0x30,0x12,0xc5,0x3, 0x12, +0xc4,0xe6,0x78,0xed,0x7f,0x3, 0x12,0xc5,0x1c,0x7a,0x35,0x28,0x12,0xc4,0xde,0x6d, +0x33,0x7a,0x35,0x26,0x12,0xc4,0xfb,0x7f,0x23,0x2d,0x52,0xb, 0x2a,0x10,0xbe,0x14, +0x0, 0x0, 0x8, 0x5, 0xb, 0x2a,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0xbe,0x25,0x28, +0x28,0x12,0xbe,0x14,0x0, 0x0, 0x8, 0x5, 0xb, 0x2a,0x20,0x80,0x4, 0x6d,0x22,0x9d, +0x21,0x7a,0x25,0x28,0x12,0xc4,0xe9,0x78,0xcb,0x7e,0x35,0x28,0xbe,0x34,0x7f,0xff, +0x28,0x7, 0x7e,0x34,0x7f,0xff,0x7a,0x35,0x28,0x7e,0x35,0x28,0x7a,0x37,0x74,0xfc, +0x20,0x1, 0x28,0x7e,0x8, 0x10,0x24,0x7e,0x18,0xc, 0x18,0x12,0x77,0x75,0x12,0xc4, +0xde,0x6d,0x33,0x7a,0x35,0x26,0x7e,0x25,0x30,0x3e,0x24,0x49,0x32,0xc, 0x18,0x59, +0x32,0x10,0x24,0x7e,0x35,0x30,0x12,0xc4,0xe9,0x78,0xeb,0xda,0x3b,0x22,0x7e,0x37, +0x73,0x21,0x7a,0x35,0x30,0x22,0x1b,0xa, 0x20,0xb, 0x34,0x7a,0x35,0x30,0x7e,0x35, +0x26,0xb, 0x34,0x7a,0x35,0x26,0xbe,0x34,0x0, 0x4, 0x22,0x7e,0x35,0x30,0x7d,0x23, +0x3e,0x24,0x22,0x9d,0x54,0x7f,0x3, 0x2d,0x12,0xb, 0xa, 0x20,0x2d,0x25,0x22,0x2e, +0x24,0x22,0x29,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0x7e,0x34,0x6a,0xd6, +0x1e,0x34,0x3e,0x34,0x7a,0x17,0x6b,0x16,0x7a,0x37,0x6b,0x1a,0x7e,0x34,0x24,0xbc, +0x7a,0x37,0x6b,0x18,0x7e,0x73,0x6e,0xaf,0x7a,0x73,0x6b,0x13,0x7e,0x73,0x6e,0xb0, +0x7a,0x73,0x6b,0x12,0x7e,0x37,0x6e,0x8d,0x7a,0x37,0x6b,0x1c,0x7e,0x37,0x6e,0x8f, +0x7a,0x37,0x6b,0x1e,0x7e,0x37,0x6e,0x97,0x7a,0x37,0x6b,0x20,0x7e,0x37,0x6e,0x99, +0x7a,0x37,0x6b,0x22,0x74,0x1, 0x7a,0xb3,0x6b,0x14,0x7a,0xb3,0x6b,0x15,0x7e,0x8, +0x6b,0x12,0x7e,0x18,0x6b,0x24,0x12,0x3, 0x1d,0x7e,0x37,0x6b,0x30,0x7a,0x37,0x6e, +0xab,0x7e,0x27,0x6b,0x2a,0xbe,0x24,0x0, 0x0, 0x8, 0x6, 0x7e,0x7, 0x6b,0x2a,0x80, +0x6, 0x6d,0x0, 0x9e,0x7, 0x6b,0x2a,0x7e,0x37,0x6b,0x2e,0xbe,0x34,0x0, 0x0, 0x8, +0x6, 0x7e,0x17,0x6b,0x2e,0x80,0x6, 0x6d,0x11,0x9e,0x17,0x6b,0x2e,0xbd,0x10,0x8, +0x12,0xbe,0x34,0x0, 0x0, 0x8, 0x5, 0x7e,0x37,0x6b,0x2e,0x22,0x6d,0x33,0x9e,0x37, +0x6b,0x2e,0x22,0xbe,0x24,0x0, 0x0, 0x8, 0x6, 0x7e,0x37,0x6b,0x2a,0x80,0x6, 0x6d, +0x33,0x9e,0x37,0x6b,0x2a,0x22,0x7c,0xab,0x7e,0x50,0xa, 0xac,0x57,0x9, 0x62,0x29, +0x8b,0x7e,0x50,0x27,0xac,0x57,0x49,0x2, 0x28,0xed,0xb, 0x4, 0x7e,0x50,0x8, 0xac, +0x5a,0x49,0x22,0x0, 0xe6,0x7a,0x27,0x75,0x0, 0x7e,0x50,0x8, 0xac,0x5a,0x49,0x22, +0x0, 0xe4,0x7a,0x27,0x74,0xfe,0x7e,0x50,0x8, 0xac,0x5a,0x9, 0xb2,0x0, 0xea,0x7a, +0xb3,0x75,0x4, 0x7e,0x50,0x8, 0xac,0x5a,0x9, 0xb2,0x0, 0xeb,0x7a,0xb3,0x75,0x5, +0x74,0x8, 0xa4,0x49,0x15,0x0, 0xe8,0x7c,0xb6,0x60,0x5, 0x1e,0x4, 0x14,0x78,0xfb, +0x8d,0x10,0x7a,0x17,0x75,0x2, 0x74,0x27,0xac,0xb7,0x9, 0x75,0x28,0xe7,0x7a,0x73, +0x74,0xfb,0x22,0x7e,0xb3,0x74,0xf4,0x22,0x7c,0xab,0x6c,0x77,0x7e,0x50,0x26,0xac, +0x57,0x9, 0x62,0x74,0x82,0xbc,0x6a,0x68,0x7, 0xb, 0x70,0xbe,0x70,0x3, 0x40,0xec, +0xa5,0xbf,0x3, 0x6, 0x7a,0xa3,0x74,0x82,0xd3,0x22,0xc3,0x22,0xca,0x79,0x7e,0x68, +0x14,0x30,0x7e,0xb3,0x77,0xe1,0xb4,0x3, 0x4, 0x7e,0x68,0x1c,0x48,0x7e,0x73,0x6e, +0xb0,0x7a,0x73,0x62,0xe3,0x7e,0x73,0x6e,0xaf,0x7a,0x73,0x62,0xe2,0xe4,0x7a,0xb3, +0x62,0xe4,0x7a,0xb3,0x62,0xe5,0x6d,0x33,0x7a,0x37,0x62,0xec,0x6c,0xff,0x7e,0x70, +0x26,0xac,0x7f,0x9, 0xb3,0x74,0x8f,0x70,0x2, 0xe1,0x38,0x7e,0xb3,0x77,0xe1,0xb4, +0x3, 0xa, 0x49,0xf3,0x74,0xa6,0x49,0xe3,0x74,0xa4,0x80,0x8, 0x49,0xf3,0x74,0x9e, +0x49,0xe3,0x74,0x9c,0x7d,0x3f,0x7a,0x37,0x62,0xe6,0x7d,0x3d,0x7a,0x37,0x62,0xe8, +0x7d,0x3f,0x7a,0x37,0x62,0xea,0x12,0xc7,0x4d,0x7e,0xb7,0x73,0x21,0x6c,0xee,0xa, +0xe, 0x2d,0xb, 0x3e,0x4, 0x7f,0x16,0x2d,0x30,0xb, 0x1a,0x10,0x7f,0x17,0x12,0xc7, +0x54,0x78,0xec,0x12,0x8f,0x47,0x50,0x35,0x12,0xc7,0x44,0x7d,0xa3,0x7a,0xa7,0x62, +0xe6,0x7e,0xa4,0x18,0x3c,0x7a,0xa7,0x62,0xe8,0x12,0xc7,0x44,0x7d,0xa3,0x7a,0xa7, +0x62,0xea,0x12,0xc7,0x4d,0x6c,0xee,0xa, 0xe, 0x2d,0xb, 0x3e,0x4, 0x49,0x10,0x18, +0x3c,0x12,0xc7,0x44,0x49,0x25,0x74,0xa0,0x12,0xc7,0x54,0x78,0xea,0x6c,0xaa,0x7e, +0x70,0x26,0xac,0x7f,0x19,0xa3,0x74,0x8f,0xb, 0xf0,0xbe,0xf0,0x3, 0x50,0x2, 0xc1, +0x9e,0xda,0x79,0x22,0x74,0x26,0xac,0xbf,0x49,0x35,0x74,0xa2,0x22,0x7e,0x8, 0x62, +0xe2,0x2, 0x8, 0xe5,0x2d,0x30,0xb, 0x1a,0xa0,0x9d,0xa1,0x1b,0x1a,0xa0,0xb, 0xe0, +0xbe,0xe0,0x4, 0x22,0x7c,0xab,0x6c,0x77,0x7e,0x63,0x75,0x6, 0xbc,0x67,0x78,0x4, +0x6c,0x66,0x80,0x27,0x12,0xc7,0xb0,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x63, +0x73,0x1f,0xa, 0x26,0x5d,0x24,0x68,0x6, 0x7e,0x60,0x1, 0x12,0xc7,0xa6,0x7e,0x63, +0x73,0x20,0xa, 0x26,0x5d,0x24,0x68,0x6, 0x7e,0x60,0x1, 0x12,0xc7,0xa6,0xb, 0x70, +0xbe,0x70,0x3, 0x40,0xc3,0x22,0x7e,0x50,0x26,0xac,0x57,0x19,0x62,0x74,0x8f,0x22, +0x7e,0x44,0x0, 0x1, 0x7c,0xba,0x22,0x7e,0x27,0x75,0x2, 0x7e,0x37,0x74,0x7c,0xbd, +0x32,0x50,0x20,0x7e,0xa3,0x74,0x7f,0x12,0xc7,0xb0,0x60,0x5, 0x3e,0x44,0x14,0x78, +0xfb,0x7c,0xb9,0x4e,0xb3,0x74,0x7b,0x7a,0xb3,0x74,0x7b,0x74,0x5, 0xa, 0x3a,0x19, +0xb3,0x74,0xf5,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x74,0xf5,0xbe,0xb0,0x0, 0x28,0xa, +0xa, 0x4a,0x2e,0x44,0x74,0xf5,0x14,0x7a,0x49,0xb0,0xa, 0x3a,0x9, 0xb3,0x74,0xf5, +0x70,0x16,0x12,0xc7,0xb0,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xb9,0x64,0xff, +0x5e,0xb3,0x74,0x7b,0x7a,0xb3,0x74,0x7b,0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xc6,0x22, +0x7e,0xb3,0x77,0xfa,0xb4,0x1, 0x3, 0x2, 0xc8,0x2b,0x22,0xca,0x3b,0x7e,0xb3,0x6c, +0xde,0xf5,0x26,0x6c,0xcc,0x1, 0xeb,0x74,0x2, 0xac,0xbc,0x9, 0xf5,0x6b,0x54,0x9, +0xe5,0x6b,0x55,0x7e,0x73,0x6e,0xaf,0xbc,0x7f,0x78,0x2, 0x1, 0xe9,0x12,0xc9,0xab, +0x7d,0xd3,0x12,0xc9,0xcb,0x78,0x2, 0x6d,0xee,0x12,0xc9,0x95,0x78,0x2, 0x6d,0xff, +0x4c,0xee,0x78,0x2, 0x6d,0x0, 0x12,0xc9,0x8d,0x78,0x2, 0x6d,0x11,0xbe,0xe4,0x0, +0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0xf4,0x0, 0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0x4, 0x0, +0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0x14,0x0, 0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0xd0,0x2, +0x40,0x4, 0xd2,0x0, 0x80,0x2e,0x4c,0xff,0x68,0x16,0x7e,0xb3,0x6e,0xb1,0x14,0xbc, +0xbf,0x68,0xd, 0x4c,0xee,0x68,0x9, 0x7e,0xb3,0x6e,0xb2,0x14,0xbc,0xbe,0x78,0x14, +0xbe,0xd4,0x1, 0x2c,0x8, 0xe, 0xbe,0xd0,0x0, 0x28,0x9, 0x7e,0xb3,0x77,0xfa,0xb4, +0x1, 0x2, 0xd2,0x0, 0x20,0x0, 0x22,0x7d,0xc3,0x7e,0xb3,0x77,0xfa,0xb4,0x3, 0x4, +0x7d,0x5c,0x80,0xb, 0x7e,0xb3,0x77,0xfa,0xb4,0x1, 0xb, 0x7d,0x5c,0xe, 0x54,0xe, +0x54,0xe, 0x54,0x12,0xc9,0x9d,0x12,0xc9,0x86,0xb, 0xc0,0xe5,0x26,0xbc,0xbc,0x28, +0x2, 0x1, 0x37,0x7e,0xb3,0x77,0xfa,0xb4,0x3, 0x2, 0x80,0x2, 0x21,0x83,0x7e,0xb3, +0x6c,0xdf,0xf5,0x26,0x6c,0xcc,0x80,0x75,0x74,0x2, 0xac,0xbc,0x9, 0xf5,0x6b,0x90, +0x9, 0xe5,0x6b,0x91,0x7e,0x73,0x6e,0xaf,0xbc,0x7f,0x68,0x5f,0x12,0xc9,0xab,0x12, +0xc9,0xcb,0x78,0x2, 0x6d,0xee,0x12,0xc9,0x95,0x78,0x2, 0x6d,0xff,0x4c,0xee,0x78, +0x2, 0x6d,0x0, 0x12,0xc9,0x8d,0x78,0x2, 0x6d,0x11,0xbe,0xe4,0xff,0xba,0x58,0x2, +0xb, 0xd0,0xbe,0xf4,0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe,0x4, 0xff,0xba,0x58,0x2, +0xb, 0xd0,0xbe,0x14,0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe,0xd0,0x2, 0x40,0x2, 0xd2, +0x0, 0x20,0x0, 0x17,0x12,0x24,0x56,0x7d,0xc3,0x7d,0x5c,0xe, 0x54,0xe, 0x54,0x6e, +0x54,0xff,0xff,0xb, 0x54,0x12,0xc9,0x9d,0x12,0xc9,0x86,0xb, 0xc0,0xe5,0x26,0xbc, +0xbc,0x38,0x85,0xda,0x3b,0x22,0xc2,0x2, 0x7c,0xbc,0x2, 0x57,0x49,0x7e,0xb3,0x6e, +0xb0,0x14,0xbc,0xbe,0x22,0x7e,0xb3,0x6e,0xaf,0x14,0xbc,0xbf,0x22,0x7d,0xb4,0x3e, +0xb4,0x7e,0x1f,0x24,0x68,0x2d,0x3b,0x1b,0x1a,0x50,0x22,0x6c,0xdd,0xc2,0x0, 0x7e, +0x33,0x6e,0xb0,0x7c,0x9f,0xac,0x93,0xa, 0x5e,0x2d,0x45,0x7d,0x24,0x3e,0x24,0x7e, +0x5f,0x24,0x68,0x7f,0x75,0x2d,0xf2,0xb, 0x7a,0x30,0x22,0xa, 0x53,0x7d,0x14,0x9d, +0x15,0x3e,0x14,0x2d,0x1b,0x7d,0xa, 0xb, 0xa, 0xe0,0x2d,0x54,0x3e,0x54,0x7f,0x5, +0x2d,0x15,0xb, 0xa, 0xf0,0x7d,0x54,0x1b,0x54,0x3e,0x54,0x7f,0x5, 0x2d,0x15,0xb, +0xa, 0x0, 0x2d,0xb2,0x69,0x15,0x0, 0x2, 0x4c,0xff,0x22,0x7e,0xb3,0x77,0xfa,0xb4, +0x3, 0x3, 0x2, 0xc8,0x2b,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x78,0x3c,0x12,0x2f,0x7d, +0x7e,0x34,0x0, 0x96,0x7a,0x37,0x6e,0x8b,0x12,0x6f,0xc4,0x7e,0x34,0xff,0x38,0x7a, +0x37,0x6e,0x8f,0x7e,0x34,0x1, 0x2c,0x7a,0x37,0x6e,0x97,0x7e,0x34,0xfe,0xd4,0x7a, +0x37,0x6e,0x99,0x12,0xca,0x84,0x68,0x42,0x7e,0x34,0x2, 0x58,0x7a,0x37,0x6e,0x91, +0x7e,0x34,0x2, 0x26,0x7a,0x37,0x6e,0x93,0x22,0xbe,0xa0,0x2, 0x78,0x2c,0x7e,0xb3, +0x77,0xfa,0xb4,0x3, 0x13,0x74,0x5c,0x7a,0xb3,0x6e,0x8a,0x7e,0x34,0x0, 0x5c,0x12, +0xca,0x7b,0x7e,0x34,0xff,0xa4,0x80,0xe, 0x12,0x2f,0x7d,0x7e,0x34,0x1, 0x2c,0x12, +0xca,0x7b,0x7e,0x34,0xfe,0xd4,0x7a,0x37,0x6e,0x8f,0x22,0x7a,0x37,0x6e,0x8b,0x7a, +0x37,0x6e,0x8d,0x22,0x7e,0xb3,0x76,0xe, 0xbe,0xb0,0xaa,0x22,0x9, 0xb3,0x6d,0x75, +0x9, 0x73,0x6d,0x76,0x7c,0x6f,0xca,0x3b,0x7c,0x96,0x7c,0x6b,0x7e,0xd0,0xff,0x75, +0x3d,0xff,0x12,0x5f,0xa8,0xc2,0x5, 0x7e,0x24,0x1, 0xf4,0x7e,0xb3,0x6d,0x7, 0xb4, +0x1, 0x6, 0x12,0xcc,0x31,0xc3,0x61,0xed,0xbe,0x90,0xa, 0x28,0x3, 0xc3,0x61,0xed, +0x7e,0x10,0x3, 0x74,0x4, 0xac,0xb9,0x19,0x15,0x28,0xb9,0x7d,0xf2,0x7c,0xf6,0x7c, +0xe7,0xc2,0x3, 0xc2,0x4, 0x7c,0x1f,0x7a,0xf1,0x39,0x80,0x8, 0x12,0xcc,0xc, 0x8, +0x8, 0x7a,0x11,0x39,0x12,0xcb,0xfa,0x58,0xf3,0x7c,0x1f,0x7a,0xf1,0x3a,0x80,0x8, +0x12,0xcc,0xc, 0x8, 0x8, 0x7a,0x11,0x3a,0x12,0xcc,0x21,0x48,0xf3,0x75,0x3c,0x0, +0x7e,0xa3,0x6e,0xb1,0x7c,0xba,0x14,0xbe,0xb1,0x3a,0x78,0x8, 0xd2,0x4, 0xa, 0x6a, +0x1b,0x64,0x80,0x8, 0xe5,0x39,0x70,0x4, 0xd2,0x3, 0x6c,0xdd,0x7c,0xe, 0x7a,0xe1, +0x3b,0x20,0x4, 0xd, 0x30,0x3, 0x37,0x80,0x8, 0x12,0xcb,0xf0,0x8, 0x8, 0x7a,0x1, +0x3b,0x12,0xcc,0x3, 0x58,0xf3,0x7c,0xe, 0x7c,0x8e,0x80,0x7, 0x12,0xcb,0xf0,0x8, +0x13,0x7c,0x80,0x7c,0xb0,0x4, 0x7c,0xb, 0x1a,0x5b,0x7e,0x73,0x6e,0xb0,0x1a,0x17, +0xbd,0x51,0x48,0xe8,0xe5,0x3b,0xa, 0xeb,0xa, 0x58,0x9d,0x5e,0xf5,0x3c,0xc2,0x2, +0x7c,0xe, 0x7a,0xe1,0x3b,0x80,0xa, 0x7c,0xbf,0x12,0xcb,0xf2,0x8, 0x8, 0x7a,0x1, +0x3b,0x12,0xcc,0x3, 0x58,0xf1,0x75,0x3e,0x0, 0xe5,0x3b,0x70,0x4, 0xd2,0x2, 0xf5, +0x3d,0x7c,0x1f,0x7a,0xf1,0x39,0x30,0x2, 0x2f,0x80,0x8, 0x12,0xcc,0x16,0x8, 0x8, +0x7a,0x11,0x39,0x12,0xcb,0xfa,0x58,0xf3,0x7c,0x1f,0x7a,0xf1,0x3a,0x80,0x8, 0x12, +0xcc,0x16,0x8, 0x8, 0x7a,0x11,0x3a,0x12,0xcc,0x21,0x48,0xf3,0xe5,0x39,0xa, 0x1b, +0xe5,0x3a,0xa, 0x5b,0x9d,0x51,0xf5,0x3e,0x7e,0x30,0x4, 0xac,0x39,0x9, 0x81,0x28, +0xb9,0xbe,0x81,0x3c,0x40,0x16,0xbe,0x81,0x3e,0x50,0x2, 0x80,0xf, 0x9, 0xb1,0x28, +0xb8,0x60,0x13,0x20,0x4, 0x6, 0x20,0x3, 0x3, 0x30,0x2, 0xa, 0x74,0x1, 0x19,0xb1, +0x28,0xb8,0xd2,0x5, 0x80,0x5, 0xe4,0x19,0xb1,0x28,0xb8,0xa2,0x5, 0xda,0x3b,0x22, +0x7c,0xbd,0x7c,0x70,0x12,0x57,0x9, 0xbd,0x3f,0x22,0x7c,0xb1,0x14,0x7c,0x1b,0xbe, +0xb0,0x0, 0x22,0x7c,0xb0,0x14,0x7c,0xb, 0xbe,0xb0,0x0, 0x22,0x7c,0xb1,0x7c,0x7e, +0x12,0x57,0x9, 0xbd,0x3f,0x22,0x7c,0xb1,0x7e,0x71,0x3d,0x12,0x57,0x9, 0xbd,0x3f, +0x22,0x7c,0xb1,0x4, 0x7c,0x1b,0x1a,0xeb,0x7e,0x83,0x6e,0xb1,0x1a,0x18,0xbd,0xe1, +0x22,0x7e,0xb3,0x6c,0xde,0x70,0x2b,0x7e,0xb3,0x6e,0x7c,0x70,0x25,0x6c,0xaa,0x7e, +0x70,0xff,0x7e,0x90,0x4, 0xac,0x9a,0x19,0x74,0x28,0xb7,0xe4,0x19,0xb4,0x28,0xb8, +0x74,0x3, 0x19,0xb4,0x28,0xb9,0xe4,0x19,0xb4,0x28,0xba,0xb, 0xa0,0xbe,0xa0,0xa, +0x78,0xdd,0x22,0xca,0x79,0x7f,0x70,0x7e,0x3, 0x6e,0xb0,0x7e,0x93,0x6c,0xde,0x7e, +0x6f,0x24,0x68,0x6c,0x11,0x6c,0x88,0x6c,0xff,0x80,0xd, 0xa, 0x1f,0x12,0xcd,0x27, +0xbc,0x78,0x40,0x2, 0x7c,0x87,0xb, 0xf0,0xbc,0x9f,0x38,0xef,0x7e,0xf0,0x1, 0xa1, +0x14,0x75,0x28,0x0, 0x6d,0xbb,0x6d,0x99,0x7d,0xa9,0x6c,0xee,0x80,0x3a,0x7e,0x30, +0x2, 0xac,0x3e,0x9, 0xb1,0x6b,0x54,0xf5,0x26,0x9, 0xb1,0x6b,0x55,0xf5,0x27,0xa, +0x1e,0x12,0xcd,0x27,0xbc,0x7f,0x78,0x1e,0x5, 0x28,0xe5,0x26,0xa, 0x1b,0x2d,0xa1, +0xe5,0x27,0xa, 0x1b,0x2d,0x91,0xe5,0x26,0x7e,0x71,0x27,0x12,0x57,0x9, 0x7d,0x83, +0xbd,0xb8,0x58,0x2, 0x7d,0xb8,0xb, 0xe0,0xbc,0x9e,0x38,0xc2,0xe5,0x28,0xbe,0xb0, +0x0, 0x28,0x2f,0xe5,0x28,0xa, 0x8b,0x7d,0x3a,0x8d,0x38,0x7d,0xa3,0x8d,0x98,0x12, +0xcd,0x1f,0x19,0xa1,0x75,0xd, 0x7d,0x39,0x12,0xcd,0x1f,0x19,0xa1,0x75,0xe, 0xa, +0x30,0xad,0x3a,0x7d,0x13,0x2d,0x19,0x3e,0x14,0x7f,0x16,0x2d,0x31,0x1b,0x1a,0xb0, +0xb, 0x10,0xb, 0xf0,0xbc,0x8f,0x40,0x2, 0x81,0x91,0x7c,0xb1,0xda,0x79,0x22,0x7c, +0xa7,0x7e,0x30,0x2, 0xac,0x31,0x22,0x7f,0x17,0x2d,0x31,0x7e,0x1b,0x70,0x22,0x7c, +0x9b,0x7f,0x71,0x7f,0x60,0x7e,0x34,0x28,0x3c,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x62, +0xb8,0x74,0x30,0x12,0x23,0x65,0x7e,0x58,0x62,0xb8,0x7c,0xb9,0x7e,0x71,0x43,0x12, +0x57,0x9, 0x7d,0x3, 0xe5,0x44,0x7e,0x71,0x45,0x12,0x57,0x9, 0x2d,0x30,0xe, 0x34, +0x7f,0x5, 0x7e,0x50,0x8, 0xb, 0xa, 0x50,0xbd,0x53,0x58,0xf, 0x69,0x30,0x0, 0x2, +0x1b,0x6a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x7a,0x30,0x22,0x2e,0x14,0x0, 0x6, 0x1b, +0x50,0x78,0xe2,0x22,0xca,0x79,0x7f,0x60,0x7c,0xf5,0x7c,0xe6,0x12,0xcd,0xeb,0x7d, +0xb3,0x7c,0xbe,0x7c,0x7f,0x12,0xcd,0xeb,0x2d,0x3b,0x12,0x5f,0x9a,0x7d,0xa3,0x7e, +0x25,0x43,0x7d,0x12,0x9d,0x1a,0xbe,0x14,0x0, 0x0, 0x8, 0x6, 0x7d,0x32,0x9d,0x3a, +0x80,0x4, 0x6d,0x33,0x9d,0x31,0x7d,0x12,0x1a,0x2, 0x1a,0x0, 0x9f,0x6, 0xbe,0x14, +0x0, 0x0, 0x8, 0x6, 0x7d,0xd, 0x9d,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0x7e,0x14, +0x0, 0x3, 0xad,0x13,0xbd,0x12,0x58,0xf, 0xbe,0x24,0x0, 0x64,0x8, 0x9, 0xbe,0x34, +0x0, 0x46,0x8, 0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x79,0x22,0xca,0x79,0x7c,0x8b,0x7e, +0xb3,0x6e,0xb1,0xf5,0x48,0x7e,0x93,0x6e,0xb2,0x7e,0x4, 0x80,0x1, 0x7c,0xf7,0x1a, +0x18,0x1b,0x14,0x7c,0xe3,0xc1,0x8a,0x7a,0xe1,0x46,0xbe,0xe0,0x0, 0x58,0xc, 0x1a, +0x5e,0x1a,0x18,0x9d,0x15,0x1a,0x58,0x2d,0x51,0xf5,0x46,0xe5,0x48,0xbc,0xbe,0x18, +0xc, 0x1a,0x58,0x1a,0x1e,0x9d,0x15,0x1a,0x58,0x9d,0x51,0xf5,0x46,0x1a,0x5f,0x1b, +0x54,0xf5,0x45,0x80,0x47,0x85,0x45,0x47,0xe5,0x45,0xbe,0xb0,0x0, 0x58,0xe, 0xe5, +0x45,0x1a,0x5b,0x1a,0x1f,0x9d,0x15,0x1a,0x5f,0x2d,0x51,0xf5,0x47,0xbe,0x91,0x45, +0x18,0xe, 0x1a,0x3f,0xe5,0x45,0x1a,0x1b,0x9d,0x13,0x1a,0x5f,0x9d,0x51,0xf5,0x47, +0xbe,0x81,0x46,0x78,0x5, 0xbe,0xf1,0x47,0x68,0x10,0xe5,0x46,0x7e,0x71,0x47,0x12, +0x57,0x9, 0x7d,0xf3,0xbd,0xf0,0x8, 0x2, 0x7d,0xf, 0x5, 0x45,0x1a,0xef,0xb, 0xe4, +0xe5,0x45,0x1a,0x1b,0xbd,0x1e,0x8, 0xad,0xb, 0xe0,0x1a,0x58,0xb, 0x54,0x1a,0x1e, +0xbd,0x15,0x18,0x2, 0xc1,0x7, 0x7d,0x30,0xda,0x79,0x22,0xca,0x3b,0x7e,0xa0,0x64, +0x6c,0x77,0x80,0x67,0xa, 0x27,0xb, 0x24,0x7c,0x65,0x80,0x55,0x7e,0xf0,0x2, 0xac, +0xf6,0x9, 0xb7,0x6b,0x54,0xa, 0xb, 0x7e,0xd0,0x2, 0xac,0xd7,0x9, 0xb6,0x6b,0x54, +0xa, 0x2b,0x12,0xcf,0x1f,0x8, 0x4, 0x9d,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0x9, +0x47,0x6b,0x55,0xa, 0x44,0x9, 0x46,0x6b,0x55,0xa, 0x14,0x7d,0x1, 0x9d,0x4, 0xbe, +0x4, 0x0, 0x0, 0x8, 0x4, 0x9d,0x14,0x80,0x4, 0x6d,0x11,0x9d,0x10,0x7c,0x43,0xbc, +0x45,0x50,0x4, 0x7c,0x35,0x80,0x2, 0x7c,0x34,0xbc,0xa3,0x28,0x2, 0x7c,0xa3,0xb, +0x60,0x7e,0x23,0x6c,0xde,0xbc,0x26,0x38,0xa3,0xb, 0x70,0x7e,0xb3,0x6c,0xde,0xbc, +0xb7,0x38,0x91,0xbe,0xa0,0x64,0x78,0x2, 0x6c,0xaa,0x7c,0xba,0xda,0x3b,0x22,0x7d, +0x12,0x9d,0x10,0xbe,0x14,0x0, 0x0, 0x22,0xca,0x3b,0x7c,0x45,0x7c,0x57,0x7c,0x7b, +0x75,0x43,0x0, 0x7e,0xe0,0xff,0xc2,0x5, 0x7e,0xf4,0x7f,0xff,0xbc,0x67,0x28,0x4, +0x7c,0xd7,0x80,0x2, 0x7c,0xd6,0xbc,0x67,0x50,0x4, 0x7c,0xa7,0x80,0x2, 0x7c,0xa6, +0xbc,0x45,0x28,0x4, 0x7c,0xc5,0x80,0x2, 0x7c,0xc4,0xbc,0x45,0x50,0x4, 0x7c,0xb5, +0x80,0x2, 0x7c,0xb4,0xf5,0x44,0x7a,0xd1,0x45,0x7a,0xc1,0x46,0x7a,0xa1,0x47,0x85, +0x44,0x48,0xd2,0x5, 0xbe,0x51,0x46,0x78,0xa, 0xe5,0x45,0xbc,0xb7,0x50,0xc, 0xc2, +0x5, 0x80,0x8, 0xe5,0x45,0xbc,0xb6,0x50,0x2, 0xc2,0x5, 0x30,0x5, 0x3, 0x2, 0xd0, +0x8d,0x7c,0xda,0x2, 0xd0,0x8d,0x7e,0x8, 0x62,0xb8,0x7e,0x34,0x0, 0xc, 0x74,0xff, +0x12,0x24,0x34,0x30,0x5, 0x6c,0x12,0xd0,0xdc,0x18,0x3, 0x12,0xd1,0xe, 0xa, 0xd, +0xb, 0x4, 0xe5,0x47,0xa, 0x1b,0xbd,0x1, 0x18,0x7, 0xa, 0x5d,0xb, 0x54,0x12,0xd0, +0xd3,0xbd,0x1, 0x18,0xb, 0xbd,0x23,0x18,0x7, 0xa, 0x3d,0xb, 0x34,0x12,0xd1,0x1, +0x7e,0xe4,0x80,0x1, 0x6c,0xff,0x12,0xd0,0xf4,0x68,0xe, 0x12,0xd0,0xc3,0x68,0x9, +0x12,0xd1,0x1b,0x8, 0x4, 0x7d,0xe3,0x7c,0xef,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xe6, +0x12,0xd0,0xe7,0x78,0x8, 0x12,0xd0,0xcb,0x78,0x3, 0x2, 0xd0,0x9c,0xe5,0x48,0xbe, +0xb1,0x46,0x78,0x7, 0x12,0xd0,0xcb,0x78,0x2, 0x1, 0x9c,0xbe,0xe0,0xff,0x68,0x7d, +0x80,0x65,0x12,0xd0,0xdc,0x18,0x3, 0x12,0xd1,0xe, 0xa, 0xd, 0x1b,0x4, 0xe5,0x45, +0xa, 0x1b,0xbd,0x1, 0x48,0x7, 0xa, 0x5d,0x1b,0x54,0x12,0xd0,0xd3,0xbd,0x1, 0x48, +0xb, 0xbd,0x23,0x18,0x7, 0xa, 0x3d,0x1b,0x34,0x12,0xd1,0x1, 0x7e,0xe4,0x80,0x1, +0x6c,0xff,0x12,0xd0,0xf4,0x68,0xe, 0x12,0xd0,0xc3,0x68,0x9, 0x12,0xd1,0x1b,0x8, +0x4, 0x7d,0xe3,0x7c,0xef,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xe6,0x12,0xd0,0xe7,0x78, +0x5, 0x12,0xd0,0xbb,0x68,0x36,0xe5,0x48,0xbe,0xb1,0x46,0x78,0x5, 0x12,0xd0,0xbb, +0x68,0x2a,0xbe,0xe0,0xff,0x68,0x16,0x7e,0x71,0x43,0x74,0x2, 0xac,0x7b,0x59,0xe3, +0x75,0x6a,0x9, 0xd4,0x62,0xb8,0x7c,0xca,0x5, 0x43,0x7e,0xe0,0xff,0xe5,0x44,0xa, +0x2b,0xb, 0x24,0xa, 0x3c,0xbd,0x32,0x68,0x3, 0x2, 0xcf,0x96,0x6c,0xff,0x80,0x10, +0x74,0x2, 0xac,0xbf,0x49,0xe5,0x75,0x6a,0xbd,0xef,0x58,0x2, 0x7d,0xfe,0xb, 0xf0, +0xe5,0x43,0xbc,0xbf,0x38,0xea,0x7d,0x3f,0xda,0x3b,0x22,0x9, 0xb4,0x62,0xb8,0xbe, +0xb1,0x45,0x22,0x9, 0x72,0x62,0xb9,0xbe,0x70,0xff,0x22,0x9, 0xb4,0x62,0xb8,0xbe, +0xb1,0x47,0x22,0x7a,0xb3,0x62,0xbc,0x7a,0xc3,0x62,0xbd,0x22,0xa, 0x2c,0xb, 0x24, +0xe5,0x48,0xa, 0x3b,0xbd,0x23,0x22,0x7e,0x90,0x4, 0xac,0x9e,0x9, 0xa4,0x62,0xb9, +0xbe,0xa1,0x48,0x22,0x7e,0x50,0x4, 0xac,0x5f,0x9, 0xb2,0x62,0xb8,0xbe,0xb0,0xff, +0x22,0x7a,0x73,0x62,0xc0,0xa, 0x3c,0xb, 0x34,0x7a,0x73,0x62,0xc1,0x22,0x7a,0xd3, +0x62,0xb8,0xa, 0x1c,0xb, 0x14,0x7a,0x33,0x62,0xb9,0x22,0x12,0x57,0x9, 0x74,0x4, +0xac,0xbf,0x59,0x35,0x62,0xba,0xbd,0x3e,0x22,0xca,0x3b,0x75,0x28,0xff,0x6c,0xff, +0x7e,0xc0,0xff,0x6c,0xee,0x6c,0x99,0x6c,0x88,0x7e,0xf4,0x7f,0xff,0x6c,0xdd,0x80, +0x68,0x7e,0x70,0x2, 0xac,0x7d,0x9, 0xb3,0x6b,0x54,0xf5,0x26,0x9, 0x73,0x6b,0x55, +0x7a,0x71,0x27,0x12,0x57,0x9, 0x7d,0x3, 0xbd,0xf, 0x58,0x2, 0x7d,0xf0,0xe5,0x26, +0xbe,0xb1,0x28,0x50,0x3, 0x85,0x26,0x28,0xe5,0x26,0xbc,0xbf,0x28,0x3, 0x7e,0xf1, +0x26,0xe5,0x27,0xbc,0xbc,0x50,0x3, 0x7e,0xc1,0x27,0xe5,0x27,0xbc,0xbe,0x28,0x3, +0x7e,0xe1,0x27,0xe5,0x28,0xa, 0x5b,0xa, 0x1f,0x9d,0x15,0xbe,0x14,0x0, 0x7, 0x18, +0xc, 0xa, 0x5c,0xa, 0x1e,0x9d,0x15,0xbe,0x14,0x0, 0x7, 0x8, 0xa, 0x7e,0x14,0x1, +0xf4,0x7a,0x17,0x75,0x88,0x41,0x4a,0xb, 0xd0,0x7e,0x73,0x6c,0xde,0xbc,0x7d,0x38, +0x90,0x7d,0x3f,0x3e,0x34,0x12,0x97,0x87,0x7d,0x3, 0x7c,0xdc,0x80,0x1c,0x7e,0xc1, +0x28,0x80,0x11,0x7c,0xbc,0x7c,0x7d,0x12,0x57,0x9, 0xbd,0x30,0x8, 0x2, 0xb, 0x90, +0xb, 0x80,0xb, 0xc0,0xbc,0xfc,0x50,0xeb,0xb, 0xd0,0xbc,0xed,0x50,0xe0,0x7e,0x73, +0x6e,0x7d,0xbe,0x70,0x3, 0x40,0xd, 0x12,0xd2,0x4d,0x50,0x28,0xb, 0x14,0x7a,0x17, +0x75,0x88,0x80,0x20,0xbe,0x70,0x1, 0x38,0x1b,0x7e,0x17,0x75,0x88,0xbe,0x14,0x0, +0x2, 0x28,0x6, 0x1b,0x15,0x7a,0x17,0x75,0x88,0x12,0xd2,0x56,0x50,0x6, 0xb, 0x14, +0x7a,0x17,0x75,0xa, 0x7e,0x73,0x6c,0xde,0xbe,0x70,0x1, 0x40,0x2d,0x7e,0x30,0x2, +0xac,0x38,0x74,0x3, 0xac,0xb9,0xbd,0x51,0x8, 0xf, 0x6d,0x11,0x7a,0x17,0x75,0x88, +0x12,0xd2,0x56,0x50,0x15,0xb, 0x14,0x80,0xd, 0x12,0xd2,0x4d,0x50,0x6, 0xb, 0x15, +0x7a,0x17,0x75,0x88,0x6d,0x11,0x7a,0x17,0x75,0xa, 0xda,0x3b,0x22,0x7e,0x17,0x75, +0x88,0xbe,0x14,0x3, 0xe8,0x22,0x7e,0x17,0x75,0xa, 0xbe,0x14,0x1, 0xf4,0x22,0xa9, +0x31,0xcd,0xf, 0xa9,0x31,0xe5,0xb, 0xa9,0xd5,0xea,0xa9,0xc5,0xea,0xc2,0x95,0xa9, +0xc1,0xcd,0xa9,0x30,0xcd,0x7, 0xa9,0x30,0xe5,0x3, 0xa9,0xc0,0xcd,0xa9,0x32,0xcd, +0x7, 0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x35,0xcd,0x7, 0xa9,0x35,0xe5,0x3, +0xa9,0xc5,0xcd,0xa9,0x36,0xcd,0x7, 0xa9,0x36,0xe5,0x3, 0xa9,0xc6,0xcd,0xa9,0x37, +0xcd,0x7, 0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0x32,0x7e,0x14,0xf7,0xf0,0x7e,0x4, +0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50,0x79,0x30,0x0, 0x2, 0x1b,0xa, +0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79,0x30,0x0, 0x6, 0x79,0x20,0x0, +0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79,0x30,0x0, 0xa, 0x79,0x20,0x0, +0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79,0x30,0x0, 0xe, 0x79,0x20,0x0, +0xc, 0x22,0x7e,0xb3,0x77,0xe6,0xbe,0xb0,0xc8,0x50,0x5, 0x4, 0x7a,0xb3,0x77,0xe6, +0x22,0x7c,0xab,0x80,0xf, 0x7e,0x70,0x2, 0x80,0x1, 0x0, 0x7c,0x67,0x1b,0x70,0xa5, +0xbe,0x0, 0xf7,0x0, 0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xe9,0x22,0xa2,0xac,0x92, +0x2, 0xc2,0xac,0x7e,0xf, 0x78,0x39,0x30,0x1, 0xa, 0xb, 0x16,0xb, 0xa, 0x30,0x4e, +0x70,0xc, 0x80,0x8, 0xb, 0x16,0xb, 0xa, 0x30,0x5e,0x70,0xf3,0x1b,0xa, 0x30,0xa2, +0x2, 0x92,0xac,0x22,0xa, 0x7, 0xa, 0x1b,0x2d,0x10,0x12,0x4f,0xef,0x6d,0x0, 0x7e, +0x18,0xbb,0x80,0x2, 0x23,0x10,0x6c,0xaa,0x7e,0x30,0x2c,0xac,0x3a,0x12,0x33,0xde, +0x7e,0x34,0x0, 0x2c,0xe4,0x12,0x24,0x34,0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe9,0x22, +0x7e,0xb3,0x76,0xff,0xb4,0x1, 0x37,0x7e,0xa3,0x76,0xfd,0x7a,0xa3,0x76,0xfe,0x7e, +0xb3,0x77,0x5, 0x4, 0x7a,0xb3,0x77,0x5, 0x7e,0xb3,0x77,0x4, 0x4, 0x7a,0xb3,0x77, +0x4, 0x12,0xd6,0xc9,0xbe,0xb3,0x77,0x4, 0x38,0x14,0xe4,0x7a,0xb3,0x77,0x4, 0x7c, +0xba,0x4, 0x7a,0xb3,0x76,0xfd,0x12,0xd3,0xb6,0x28,0x3, 0x12,0xd3,0xaf,0x22,0x74, +0x3, 0x7a,0xb3,0x76,0xff,0x22,0x7e,0x73,0x76,0xfc,0xbe,0x73,0x76,0xfd,0x22,0x12, +0xd3,0xb6,0x38,0x2, 0xe4,0x22,0x7e,0xa3,0x76,0xfd,0x74,0x7, 0xa4,0x49,0x55,0x77, +0x8, 0x12,0xd3,0xd7,0xe4,0x33,0x22,0x7c,0x3b,0xd2,0x4, 0x12,0xd6,0xf0,0x12,0xd6, +0xd3,0x1b,0x30,0x68,0x1d,0x1b,0x30,0x68,0x23,0x1b,0x30,0x68,0x29,0x1b,0x30,0x68, +0x2f,0xb, 0x32,0x78,0x73,0x12,0x3f,0x9b,0x7e,0x1f,0x76,0xe0,0x7e,0xf, 0x76,0xdc, +0x80,0x52,0x7e,0x1f,0x76,0xe8,0x7e,0xf, 0x76,0xe4,0x80,0x48,0x7e,0x1f,0x76,0xf0, +0x7e,0xf, 0x76,0xec,0x80,0x3e,0x7e,0x1f,0x76,0xf8,0x7e,0xf, 0x76,0xf4,0x80,0x34, +0x7e,0x34,0x0, 0x8, 0xca,0x39,0x7e,0x71,0x1e,0x74,0x8, 0xac,0x7b,0x2e,0x34,0x76, +0xdc,0x6d,0x22,0x7e,0x8, 0x67,0x1e,0x12,0x24,0xf, 0x1b,0xfd,0x7e,0x34,0x0, 0x1, +0x7a,0x37,0x67,0x1e,0x7e,0x73,0x78,0x34,0x7a,0x73,0x67,0x20,0x7e,0x1f,0x67,0x22, +0x7e,0xf, 0x67,0x1e,0x7a,0x1d,0x39,0x7a,0xd, 0x35,0x12,0x2, 0x3d,0x74,0x1, 0x7a, +0xb3,0x76,0xff,0x12,0xd, 0xbd,0x80,0x2, 0xc2,0x4, 0xa2,0x4, 0x22,0x7e,0xb3,0x76, +0xff,0xb4,0x1, 0x2, 0x80,0x2, 0xa1,0xe, 0x7e,0x73,0x76,0xfc,0xbe,0x73,0x76,0xfe, +0x28,0x74,0x7e,0x63,0x76,0xfe,0x7e,0x70,0x7, 0xac,0x67,0x49,0x53,0x77,0x8, 0x7c, +0xab,0x7e,0x43,0x77,0x5, 0x7e,0x50,0x2, 0xac,0x45,0x2d,0x32,0x49,0x33,0x77,0xa, +0x7a,0x35,0x1c,0x4d,0x33,0x68,0x4f,0xd2,0x2d,0x1b,0xa0,0x68,0x10,0x1b,0xa0,0x68, +0xc, 0x1b,0xa0,0x68,0x8, 0x1b,0xa0,0x68,0x4, 0xb, 0xa2,0x78,0x39,0x12,0xd5,0xf, +0x30,0x12,0x4, 0x74,0x2, 0x80,0x2, 0x74,0x1, 0x7e,0xa3,0x77,0x5, 0xa, 0x3a,0x19, +0xb3,0x77,0x0, 0x7e,0xb3,0x77,0x5, 0x70,0xe, 0x7e,0x73,0x77,0x7, 0xbe,0x70,0x1, +0x28,0x5, 0x12,0xb, 0xe5,0x80,0xf, 0x7e,0xf, 0x78,0x39,0xb, 0x16,0xb, 0xa, 0x30, +0x5e,0x60,0xef,0x1b,0xa, 0x30,0x12,0xd3,0xb6,0x38,0x13,0x74,0x2, 0x7a,0xb3,0x76, +0xff,0x12,0x3c,0xf1,0x12,0x37,0xe1,0xe5,0x1e,0x70,0x3, 0x2, 0x3f,0x52,0x22,0xca, +0x3b,0x7e,0x95,0x1c,0x6d,0x88,0x7e,0xb3,0x77,0x5, 0xf5,0x4b,0x7e,0xb3,0x6e,0xc1, +0x60,0xa, 0x7e,0xc7,0x6e,0xb5,0x7e,0xd7,0x6e,0xb7,0x80,0x8, 0x7e,0xd7,0x6e,0xb5, +0x7e,0xc7,0x6e,0xb7,0x20,0x2d,0x2, 0xc1,0x80,0x7e,0xe7,0x73,0x21,0x7e,0xf4,0x0, +0xa, 0xa9,0xd7,0xea,0x7e,0x5f,0x1, 0x78,0x69,0x55,0x2, 0x64,0x69,0x75,0x0, 0xc, +0x4d,0x75,0x12,0xd6,0xa0,0x59,0x75,0x0, 0xe4,0x69,0x55,0x2, 0x5c,0x7e,0x5f,0x1, +0x78,0x69,0xb5,0x0, 0x4, 0x4d,0xb5,0x12,0xd6,0xa0,0x59,0xb5,0x0, 0xe6,0x7e,0x5f, +0x1, 0x78,0x69,0xb5,0x2, 0x5a,0x7e,0x3f,0x1, 0x78,0x69,0x53,0x0, 0x2, 0xbd,0x5b, +0x28,0xc, 0x7e,0x5f,0x1, 0x78,0x69,0x55,0x0, 0x2, 0x7d,0x45,0x80,0x8, 0x7e,0x2f, +0x1, 0x78,0x69,0x42,0x2, 0x5a,0x12,0xd6,0xa0,0x59,0x45,0x0, 0xe8,0x7e,0x2f,0x1, +0x78,0xb, 0x2a,0x50,0x12,0xd6,0xa7,0x19,0xa4,0x0, 0xea,0x7e,0x2f,0x1, 0x78,0x69, +0x52,0x2, 0x58,0x12,0xd6,0xa7,0x19,0xa4,0x0, 0xeb,0x6d,0xbb,0x7d,0x4b,0xbe,0x44, +0x0, 0x1, 0x78,0x4, 0xb, 0xf4,0x80,0x23,0x7c,0xb9,0x7e,0xa4,0x0, 0x1, 0x60,0x5, +0x3e,0xa4,0x14,0x78,0xfb,0x7e,0xb3,0x6e,0xb3,0xa, 0x5b,0x5d,0x5a,0x68,0x5, 0x12, +0xd6,0x83,0x80,0x7, 0x6d,0x55,0x12,0xd6,0x92,0xb, 0xf4,0xb, 0x44,0xbe,0x44,0x0, +0x3, 0x78,0xcb,0x7e,0xb3,0x6e,0xc1,0x60,0x5, 0x7a,0xc5,0x49,0x80,0x3, 0x7a,0xb5, +0x49,0x12,0xd6,0xb5,0x7d,0x4b,0x80,0xc, 0xb, 0xa, 0x50,0x1b,0x1a,0x50,0xb, 0x15, +0xb, 0x35,0xb, 0x44,0xbd,0xd4,0x38,0xf0,0x7d,0xfd,0x2e,0xf5,0x49,0x7a,0xf5,0x49, +0x7e,0xf4,0x1, 0x36,0x7d,0x4b,0xbe,0x44,0x0, 0x1, 0x78,0x4, 0xb, 0xf4,0x80,0x23, +0x7c,0xb9,0x7e,0xa4,0x0, 0x1, 0x60,0x5, 0x3e,0xa4,0x14,0x78,0xfb,0x7e,0xb3,0x6e, +0xb4,0xa, 0x5b,0x5d,0x5a,0x68,0x5, 0x12,0xd6,0x83,0x80,0x7, 0x6d,0x55,0x12,0xd6, +0x92,0xb, 0xf4,0xb, 0x44,0xbe,0x44,0x0, 0x3, 0x78,0xcb,0x7e,0xb3,0x6e,0xc1,0x60, +0x3, 0x7a,0xb5,0x49,0x12,0xd6,0xb5,0x7d,0x4b,0x80,0xc, 0xb, 0xa, 0x50,0x1b,0x1a, +0x50,0xb, 0x35,0xb, 0x15,0xb, 0x44,0xbd,0xc4,0x38,0xf0,0xa9,0xc7,0xea,0xc2,0x2d, +0xda,0x3b,0x22,0x7d,0x5f,0xb, 0xf4,0x3e,0x54,0x7e,0x3f,0x1, 0x78,0x2d,0x75,0xb, +0x3a,0x50,0x7d,0xae,0xb, 0xe4,0x3e,0xa4,0x7f,0x34,0x2d,0x7a,0x1b,0x3a,0x50,0x22, +0x7e,0xa1,0x4b,0x74,0x8, 0xa4,0x22,0x5e,0x54,0x0, 0x7f,0x7c,0xab,0x7e,0x91,0x4b, +0x74,0x8, 0xac,0x9b,0x22,0x7d,0xaf,0x3e,0xa4,0x7e,0xf, 0x1, 0x78,0x2d,0x1a,0x7e, +0xa5,0x49,0x3e,0xa4,0x7f,0x14,0x2d,0x3a,0x22,0x7e,0x70,0x7, 0xac,0x7a,0x9, 0xb3, +0x77,0xe, 0x22,0x6c,0xaa,0x7e,0xb3,0x77,0xd8,0xa, 0x3b,0x1e,0x34,0xb, 0x34,0x7e, +0x50,0x8, 0xac,0x5a,0x19,0x72,0x76,0xe1,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0xe6,0x22, +0xe5,0x1e,0x70,0x21,0x7e,0x37,0x77,0xde,0x4d,0x33,0x78,0xf8,0x12,0x8b,0xd2,0x7e, +0x34,0x0, 0x5, 0x7a,0x37,0x77,0xde,0xbe,0x34,0x0, 0x21,0x28,0x8, 0x7e,0x34,0x0, +0x21,0x7a,0x37,0x77,0xde,0x22,0x30,0x24,0x24,0xc2,0x24,0x7e,0x73,0x76,0x7, 0x7a, +0x73,0x76,0x2f,0x74,0xff,0x7a,0xb3,0x76,0x7, 0x7e,0xa3,0x76,0x2f,0x4c,0xaa,0x78, +0x5, 0x12,0xd7,0xcc,0x80,0x7, 0xbe,0xa0,0x1, 0x78,0x2, 0xd2,0x1b,0x30,0x1b,0x3, +0x12,0xd8,0x4, 0x7e,0xb3,0x76,0x2f,0x14,0x68,0x5b,0x1b,0xb1,0x68,0x5f,0x24,0x3, +0x78,0x6e,0x12,0xd7,0xc4,0x38,0x7, 0x7e,0xb3,0x78,0x20,0xb4,0x1, 0x16,0x12,0x47, +0xe6,0x7e,0xb3,0x76,0x10,0x30,0xe0,0x5b,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x54,0x30, +0x13,0x51,0x80,0x2e,0x7e,0xb3,0x76,0x10,0x30,0xe0,0x48,0x7e,0x37,0x29,0xfd,0x7e, +0x44,0x3, 0xe8,0x7d,0x53,0x8d,0x54,0x7e,0x53,0x76,0x11,0xa, 0x15,0xbd,0x51,0x50, +0x11,0x7e,0xb3,0x76,0x5a,0xb4,0x1, 0x2b,0x7e,0x24,0x0, 0xc8,0x8d,0x32,0xbd,0x31, +0x40,0x21,0x2, 0xd8,0x4, 0x12,0xd7,0xc4,0x28,0x19,0x2, 0xd7,0xe7,0x7e,0x34,0x21, +0x59,0x12,0x29,0xdb,0x12,0x2c,0x73,0x12,0x4d,0x3a,0x12,0x2f,0x87,0x2, 0xd7,0xcc, +0x12,0xa7,0xc7,0x22,0x7e,0x73,0x6e,0x7c,0xbe,0x70,0x0, 0x22,0xe4,0x7a,0xb3,0x76, +0x2f,0xd2,0x14,0x12,0x47,0xe6,0x2, 0xd7,0xd9,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x1, +0x68,0x4, 0xd2,0x1d,0xc2,0x1a,0x22,0x7e,0xb3,0x76,0x5a,0x60,0x5, 0x20,0x13,0x5, +0x80,0x0, 0x2, 0xd7,0xcc,0x22,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x1, 0x68,0x4, 0xd2, +0x1a,0xc2,0x1d,0x22,0xe5,0x1e,0xb4,0x1, 0xc, 0x7e,0xb3,0x25,0xaf,0x60,0x6, 0xe4, +0x7a,0xb3,0x76,0x2f,0x22,0xc2,0x1b,0x12,0xa7,0xc7,0x12,0x47,0xe6,0xe4,0x7a,0xb3, +0x29,0xff,0x7a,0xb3,0x29,0xfc,0x12,0x3b,0x69,0x5e,0x34,0x0, 0x2, 0x68,0xa, 0x7e, +0xb3,0x73,0x20,0x44,0x8, 0x7a,0xb3,0x73,0x20,0x22,0x30,0x1c,0x8, 0xe5,0x1e,0xb4, +0x1, 0x3, 0x2, 0x37,0x94,0x22,0x7c,0xab,0x7e,0x8, 0x0, 0x86,0x7e,0x70,0xa, 0xac, +0x7a,0x9, 0xb3,0x29,0x8b,0x12,0xc, 0x3e,0x7e,0x8, 0x0, 0xc2,0x74,0xa, 0xa4,0x9, +0xb5,0x29,0x8b,0x12,0xc, 0x3e,0x7e,0x34,0x0, 0xd, 0x7e,0x8, 0x0, 0x86,0x7e,0x24, +0x0, 0x1, 0x2, 0xc, 0xcc,0x7c,0xab,0x74,0x27,0xa4,0x49,0x25,0x28,0xed,0xb, 0x24, +0x7e,0x37,0x76,0xd6,0xad,0x32,0x7e,0x8, 0x0, 0x82,0x12,0xd8,0x90,0x2, 0xc, 0xcc, +0x6d,0x22,0x12,0xd, 0x3e,0x7e,0x8, 0x0, 0xbe,0x6d,0x22,0x12,0xd, 0x3e,0x7e,0x34, +0x0, 0xb, 0x7e,0x8, 0x0, 0x82,0x7e,0x24,0x0, 0x2, 0x22,0x7c,0xab,0x6d,0x33,0xbe, +0xa0,0x4, 0x50,0x27,0x6c,0x55,0x80,0x16,0x7e,0x10,0x2, 0xac,0x15,0x7e,0x30,0x27, +0xac,0x3a,0x2d,0x10,0x49,0x11,0x28,0xed,0xb, 0x14,0x2d,0x31,0xb, 0x50,0x7e,0x30, +0x27,0xac,0x3a,0x9, 0x41,0x28,0xe8,0xbc,0x45,0x50,0xdd,0x4d,0x33,0x78,0x2, 0xb, +0x34,0x22,0x7c,0xab,0x7e,0x73,0x73,0x25,0xc2,0x2, 0x6d,0x22,0x7d,0x42,0x80,0x13, +0xa, 0xa, 0x12,0x41,0x5f,0x2d,0x14,0x9, 0xb1,0x4e,0xa8,0x70,0x4, 0xd2,0x2, 0x80, +0xa, 0xb, 0x44,0x7e,0x17,0x73,0x21,0xbd,0x14,0x38,0xe5,0x7d,0x42,0x7c,0xb7,0x54, +0x1, 0xb4,0x1, 0x17,0xa, 0xa, 0x12,0x41,0x5f,0x7e,0x27,0x73,0x21,0x2d,0x24,0x2d, +0x21,0x9, 0xb2,0x4e,0xa8,0x70,0x4, 0xd2,0x2, 0x80,0xa, 0x1e,0x70,0xb, 0x44,0xbe, +0x44,0x0, 0x4, 0x40,0xd8,0x30,0x2, 0x10,0x7e,0xb3,0x78,0x33,0xbe,0xb0,0x0, 0x28, +0xd, 0x14,0x7a,0xb3,0x78,0x33,0xc3,0x22,0x74,0x5, 0x7a,0xb3,0x78,0x33,0xd3,0x22, +0xca,0x3b,0x7c,0xcb,0x7e,0x8, 0x62,0xb8,0x12,0xda,0x40,0x7e,0x8, 0x62,0xc4,0x7e, +0x34,0x0, 0x5, 0x12,0x24,0x34,0x12,0xda,0x48,0x7e,0xb7,0x73,0x21,0x7e,0x97,0x6c, +0xfb,0x7d,0xa9,0x3e,0xa4,0x3e,0xa4,0x4c,0xcc,0x78,0x6c,0x7a,0xd3,0x62,0xb9,0x7a, +0xe3,0x62,0xb8,0x7e,0x84,0x8, 0xc, 0x7a,0x87,0x62,0xbc,0x7e,0x1f,0x24,0x64,0x7d, +0x83,0x7a,0x87,0x62,0xbe,0x7e,0x1f,0x24,0x64,0x7d,0x83,0x7a,0x87,0x62,0xc0,0x7d, +0x39,0x7c,0xb7,0xf5,0x26,0x7e,0x8, 0x62,0xb8,0x7e,0x18,0x62,0xc4,0x7d,0x59,0x12, +0x0, 0x46,0x6c,0xff,0x7d,0x3b,0x3e,0x34,0x49,0x83,0x8, 0xc, 0xbd,0xa8,0x58,0x10, +0x7e,0xf, 0x24,0x64,0x2d,0x13,0xb, 0xa, 0x20,0x2d,0x2a,0x1b,0xa, 0x20,0x80,0x10, +0x6d,0x22,0x9d,0x2a,0xbd,0x28,0x8, 0x8, 0x12,0xda,0x36,0x9d,0x3a,0x1b,0xa, 0x30, +0x12,0xda,0x2e,0x78,0xcf,0x80,0x44,0xbe,0xc0,0x1, 0x78,0x3f,0x6c,0xff,0x80,0x24, +0x6c,0x77,0x80,0x1a,0x7c,0xbf,0xac,0xbd,0xa, 0x87,0x2d,0x85,0x3e,0x84,0x7e,0xf, +0x24,0x64,0x2d,0x18,0xb, 0xa, 0x80,0x2d,0x89,0x1b,0xa, 0x80,0xb, 0x70,0xbc,0xd7, +0x38,0xe2,0xb, 0xf0,0xbc,0xef,0x38,0xd8,0x6c,0xff,0x7d,0x3b,0x3e,0x34,0x12,0xda, +0x36,0x2d,0x3a,0x1b,0xa, 0x30,0x12,0xda,0x2e,0x78,0xef,0xda,0x3b,0x22,0xb, 0xb4, +0xb, 0xf0,0xbe,0xf0,0x4, 0x22,0x7e,0xf, 0x24,0x64,0x2d,0x13,0xb, 0xa, 0x30,0x22, +0x7e,0x34,0x0, 0xc, 0xe4,0x2, 0x24,0x34,0x7e,0xe3,0x6e,0xaf,0x7e,0xd3,0x6e,0xb0, +0x22,0x7e,0x37,0x73,0x21,0x6c,0xaa,0x90,0x1c,0x49,0xe4,0x93,0x20,0xe0,0x4, 0x4c, +0xaa,0x68,0x25,0x1e,0xb0,0x1e,0xb0,0x20,0xe0,0x5, 0xbe,0xa0,0x1, 0x68,0x19,0x90, +0x1c,0x4a,0xe4,0x93,0x20,0xe0,0x5, 0xbe,0xa0,0x2, 0x68,0xc, 0x1e,0xb0,0x1e,0xb0, +0x20,0xe0,0x9, 0xbe,0xa0,0x3, 0x78,0x4, 0xb, 0x34,0x80,0x25,0x7d,0x23,0x3e,0x24, +0x49,0x42,0x8, 0xc, 0x12,0xda,0xb9,0x2d,0x24,0x1b,0xa, 0x20,0x7d,0x23,0x3e,0x24, +0x12,0xda,0xb9,0xbe,0x24,0xf, 0xa0,0x50,0x6, 0x74,0x1f,0x7a,0xb3,0x73,0x1f,0xb, +0x34,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0x9f,0x22,0x7e,0xf, 0x24,0x64,0x2d,0x12,0xb, +0xa, 0x20,0x22,0xe4,0x7a,0xb3,0x6c,0xf3,0x12,0xda,0xdf,0xe4,0x12,0x0, 0x19,0x7e, +0xb3,0x25,0xae,0xb4,0x1, 0x8, 0x7e,0x73,0x6c,0xde,0x7a,0x73,0x6c,0xf2,0x22,0x6c, +0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x6b,0xcc,0xb, 0x30,0x90,0x21,0x52,0xe4, +0x93,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0xb, 0x24,0xa, 0x33,0xbd,0x32,0x48,0xe4,0x12, +0xdc,0x23,0x6d,0x33,0x7a,0x37,0x6c,0xe0,0x7a,0x37,0x6c,0xe2,0x7a,0x37,0x6c,0xe4, +0x7a,0x37,0x6c,0xe8,0x7e,0xd4,0x62,0xba,0x1e,0xd4,0x3e,0xd4,0x6d,0xcc,0x7e,0x1f, +0x24,0x68,0x7a,0x37,0x62,0xfa,0x7d,0x3d,0x7a,0x37,0x62,0xfe,0x7e,0x34,0x24,0xbc, +0x7a,0x37,0x62,0xfc,0x7e,0x73,0x6e,0xaf,0x7a,0x73,0x62,0xf7,0x7e,0x73,0x6e,0xb0, +0x7a,0x73,0x62,0xf6,0x7e,0x37,0x6e,0x8d,0x7a,0x37,0x63,0x0, 0x7e,0x37,0x6e,0x8f, +0x7a,0x37,0x63,0x2, 0x7e,0x37,0x6e,0x97,0x7a,0x37,0x63,0x4, 0x7e,0x37,0x6e,0x99, +0x7a,0x37,0x63,0x6, 0x12,0x5f,0x7c,0x1b,0x34,0x7a,0x73,0x62,0xf8,0x7e,0x73,0x78, +0x44,0x7a,0x73,0x62,0xf9,0x7e,0x8, 0x62,0xf6,0x7e,0x18,0x63,0x8, 0x12,0x3, 0x1d, +0x7e,0x73,0x63,0x8, 0x7a,0x73,0x6c,0xde,0x7e,0x73,0x63,0x9, 0x7a,0x73,0x6c,0xdf, +0x7e,0x37,0x63,0xa, 0x7a,0x37,0x6c,0xe0,0x7e,0x37,0x63,0xc, 0x7a,0x37,0x6c,0xe2, +0x7e,0x37,0x63,0x12,0x7a,0x37,0x6c,0xe4,0x7e,0x37,0x63,0x14,0x7d,0x23,0x7a,0x53, +0x6c,0xe6,0xa, 0x36,0x7a,0x73,0x6c,0xe7,0x7e,0x37,0x63,0xe, 0x7a,0x37,0x6c,0xe8, +0x7e,0x37,0x63,0x10,0x7d,0x23,0x7a,0x53,0x6c,0xea,0xa, 0x36,0x7a,0x73,0x6c,0xeb, +0x6c,0x33,0x80,0x1f,0xd2,0x2, 0x7c,0xb3,0x12,0x57,0x49,0x74,0x2, 0xac,0xb3,0x49, +0x45,0x24,0xbc,0xa, 0x38,0x7c,0x27,0x19,0x25,0x6b,0x54,0x7c,0x29,0x19,0x25,0x6b, +0x55,0xb, 0x30,0x7e,0x23,0x6c,0xde,0xbc,0x23,0x38,0xd9,0x6c,0x33,0x80,0x1b,0x74, +0x2, 0xac,0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40,0xa, 0x38,0x7c,0x27,0x19,0x25, +0x6b,0x90,0x7c,0x29,0x19,0x25,0x6b,0x91,0xb, 0x30,0x7e,0x23,0x6c,0xdf,0xbc,0x23, +0x38,0xdd,0x22,0xe4,0x7a,0xb3,0x6c,0xde,0x7a,0xb3,0x6c,0xdf,0x22,0x7d,0x23,0x12, +0x4c,0x18,0x7e,0x37,0x78,0x0, 0x7d,0x13,0x9e,0x17,0x77,0xfc,0xbe,0x14,0x0, 0x0, +0x8, 0x6, 0x9e,0x37,0x77,0xfc,0x80,0x4, 0x6d,0x33,0x9d,0x31,0xbd,0x32,0x38,0x21, +0x7e,0x37,0x78,0x2, 0x7d,0x13,0x9e,0x17,0x77,0xfe,0xbe,0x14,0x0, 0x0, 0x8, 0x6, +0x9e,0x37,0x77,0xfe,0x80,0x4, 0x6d,0x33,0x9d,0x31,0xbd,0x32,0x38,0x3, 0x74,0x1, +0x22,0xe4,0x22,0xca,0xd8,0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd,0x7e, +0xd3,0x6e,0x7c,0x7e,0xe3,0x6e,0x7d,0x7e,0xb3,0x77,0xfb,0x60,0x11,0x7e,0xc7,0x78, +0x4, 0x4d,0xcc,0x78,0x2, 0xa1,0x63,0xbe,0xd0,0x1, 0x28,0x2, 0xa1,0x63,0xbe,0xd0, +0x1, 0x78,0x1d,0xbe,0xb0,0x4, 0x78,0x2, 0xa1,0x63,0x7e,0xe7,0x6d,0x6e,0x7e,0xf7, +0x6d,0x70,0x7d,0x3e,0x7d,0x2f,0x12,0x9f,0x38,0xbe,0xb0,0x1, 0x78,0x2, 0xa1,0x63, +0x7e,0xa3,0x77,0xfb,0x7c,0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23,0x14, +0x78,0x2, 0xa1,0x60,0xb, 0xb2,0x68,0x2, 0xa1,0x63,0xbe,0xd0,0x1, 0x68,0x2, 0xa1, +0x72,0x4c,0xee,0x68,0x2, 0xa1,0x72,0x74,0x1, 0x7a,0xb3,0x77,0xfb,0x12,0xdd,0x85, +0x80,0x61,0x4c,0xdd,0x78,0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3,0x77, +0xfb,0x7e,0x34,0x22,0x43,0x80,0x50,0x74,0x4, 0x7a,0xb3,0x77,0xfb,0x7e,0x34,0x22, +0x47,0x80,0x44,0x12,0xdd,0x8e,0x90,0x22,0x36,0x12,0xdd,0x79,0x68,0x45,0x80,0x52, +0xbe,0xd0,0x1, 0x78,0x4d,0x4c,0xee,0x78,0x49,0x12,0xdd,0x8e,0x7e,0x34,0x22,0x3f, +0x12,0x29,0xdb,0x7e,0x14,0x22,0x43,0x12,0xdd,0x9b,0x9d,0xc3,0xbe,0xc7,0x78,0x4, +0x40,0x21,0x90,0x22,0x35,0x12,0xdd,0x79,0x68,0x19,0x12,0xdd,0x85,0x74,0x3, 0x7a, +0xb3,0x77,0xfb,0x7e,0x34,0x22,0x43,0x12,0x29,0xdb,0x7a,0x37,0x78,0x4, 0x80,0x12, +0x7e,0xf0,0x24,0xe4,0x7a,0xb3,0x77,0xfb,0x6d,0x33,0x7a,0x37,0x78,0x4, 0x7c,0xbf, +0x80,0x2, 0x7c,0xbf,0xda,0x79,0xda,0xd8,0x22,0xe4,0x93,0xa, 0x3b,0x12,0xdc,0x2d, +0xa, 0xdb,0x4d,0xdd,0x22,0x7a,0xe7,0x77,0xfc,0x7a,0xf7,0x77,0xfe,0x22,0x7a,0xe7, +0x78,0x0, 0x7a,0xf7,0x78,0x2, 0x22,0x7e,0x14,0x21,0xec,0x7e,0x4, 0x0, 0xff,0xb, +0xa, 0xc0,0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, 0x20,0xe, 0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0,0xa5,0xbe,0x20,0x1d,0x7c,0xb7, +0x54,0xf, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x78, +0x28,0xa, 0x47,0x5d,0x42,0x7e,0x73,0x76,0x5b,0x80,0x36,0xa5,0xbe,0x30,0x18,0x12, +0xde,0x16,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e,0x53,0x78,0x29,0xa, 0x45,0x5d, +0x43,0x7e,0x73,0x76,0x5c,0x80,0x1a,0x12,0xde,0x16,0x60,0x5, 0x3e,0x34,0x14,0x78, +0xfb,0xa, 0x2a,0x9, 0xb2,0x78,0x28,0xa, 0x4b,0x5d,0x43,0xa, 0x5a,0x9, 0x75,0x76, +0x5d,0xa, 0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, 0x7e,0x34,0x0, 0x1, 0x22,0x7e, +0xa3,0x27,0x72,0xbe,0xa0,0x64,0x50,0x1b,0x74,0x4, 0xa4,0x59,0x35,0x25,0xb9,0x7e, +0xa3,0x27,0x72,0x74,0x4, 0xa4,0x59,0x25,0x25,0xbb,0x7e,0xb3,0x27,0x72,0x4, 0x7a, +0xb3,0x27,0x72,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x27,0x4a,0x7e,0x34,0x0, 0x28, +0xe4,0x12,0x24,0x34,0x7e,0x8, 0x25,0xb9,0x7e,0x34,0x1, 0x90,0x12,0x24,0x34,0x7a, +0xb3,0x76,0x5d,0x7e,0x34,0x22,0x6d,0x12,0x29,0xdb,0x7a,0x37,0x25,0xb1,0x7a,0xe7, +0x27,0x4e,0x7a,0xf7,0x27,0x50,0x7a,0xe7,0x27,0x52,0x7a,0xe7,0x27,0x56,0x7a,0xe7, +0x27,0x5a,0x7a,0xe7,0x27,0x5e,0x7a,0xf7,0x27,0x54,0x7a,0xf7,0x27,0x58,0x7a,0xf7, +0x27,0x5c,0x7a,0xf7,0x27,0x60,0x7a,0xe7,0x25,0xb5,0x7a,0xf7,0x25,0xb7,0x7a,0xb3, +0x27,0x72,0x74,0x2, 0x7a,0xb3,0x27,0x49,0x22,0xca,0x3b,0xf5,0x2c,0x7f,0x31,0x7a, +0xd, 0x28,0x75,0x34,0x0, 0x75,0x35,0x0, 0x75,0x36,0x0, 0x7e,0x34,0x3, 0xe8,0x7a, +0x35,0x3f,0x75,0x32,0x3c,0x75,0x33,0x46,0x75,0x2d,0x0, 0x2, 0xe0,0xcb,0x12,0xe2, +0x6e,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39,0x7e,0x71,0x2d,0x74,0x44,0xac,0x7b, +0x2e,0x34,0xe, 0x6, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x64,0x52,0x12,0x24,0xf, 0x1b, +0xfd,0x6d,0x33,0x7a,0x37,0x64,0x48,0x7a,0x37,0x64,0x4a,0x7a,0x37,0x64,0x4c,0x7a, +0x37,0x64,0x4e,0x7a,0x37,0x64,0x50,0x7e,0x18,0x64,0x52,0x7a,0x1d,0x37,0x7e,0x18, +0x64,0x72,0x7a,0x1d,0x3b,0x75,0x2e,0x0, 0xe1,0xae,0xe5,0x2e,0xa, 0x5b,0x7e,0x1d, +0x28,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x26,0x7e,0xd, 0x37,0x2d,0x15,0x7e,0xb, 0x70, +0xa, 0xd7,0x7d,0xcd,0x9d,0xc2,0xbe,0xc4,0x0, 0x0, 0x8, 0x4, 0x9d,0xd2,0x80,0xa, +0xa, 0x26,0xa, 0x37,0x9d,0x32,0x6d,0xdd,0x9d,0xd3,0x7e,0xc7,0x64,0x4c,0xbd,0xcd, +0x58,0x4, 0x7a,0xd7,0x64,0x4c,0xe5,0x2e,0xa, 0xcb,0x7f,0x13,0x2d,0x3c,0x7e,0x1b, +0x70,0xa, 0x27,0xe5,0x2e,0xa, 0x3b,0x7e,0xd, 0x3b,0x2d,0x13,0x7e,0xb, 0x70,0xa, +0xc7,0x12,0x5f,0x87,0x8, 0x4, 0x9d,0xc2,0x80,0x4, 0x6d,0xcc,0x9d,0xc3,0x7e,0x37, +0x64,0x4e,0xbd,0x3c,0x58,0x4, 0x7a,0xc7,0x64,0x4e,0x7e,0x37,0x64,0x48,0x2d,0x3d, +0x7a,0x37,0x64,0x48,0x7e,0x37,0x64,0x4a,0x2d,0x3c,0x7a,0x37,0x64,0x4a,0x2d,0xcd, +0x7e,0x37,0x64,0x50,0xbd,0x3c,0x58,0x4, 0x7a,0xc7,0x64,0x50,0x5, 0x2e,0xe5,0x2c, +0xbe,0xb1,0x2e,0x28,0x2, 0xe1,0x1a,0xe5,0x2c,0xb4,0xa, 0x2f,0x7e,0x37,0x64,0x4c, +0xbe,0x34,0x0, 0x40,0x48,0xd, 0x7e,0x27,0x64,0x4e,0xbe,0x24,0x0, 0x40,0x48,0x3, +0x2, 0xe0,0xc9,0xbe,0x34,0x0, 0x60,0x8, 0x3, 0x2, 0xe0,0xc9,0x7e,0x37,0x64,0x4e, +0xbe,0x34,0x0, 0x60,0x8, 0x3, 0x2, 0xe0,0xc9,0x80,0x2a,0x7e,0x37,0x64,0x4c,0xbe, +0x34,0x0, 0x20,0x8, 0xc, 0x7e,0x27,0x64,0x4e,0xbe,0x24,0x0, 0x20,0x8, 0x2, 0x1, +0xc9,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0x1, 0xc9,0x7e,0x37,0x64,0x4e,0xbe,0x34,0x0, +0x30,0x8, 0x2, 0x1, 0xc9,0x7e,0xa3,0x77,0x2e,0x74,0xc, 0xa4,0xbe,0x57,0x64,0x48, +0x58,0x2, 0x1, 0xc9,0x7e,0xa3,0x77,0x2f,0x74,0xc, 0xa4,0xbe,0x57,0x64,0x4a,0x58, +0x2, 0x1, 0xc9,0x7e,0xd, 0x37,0x7e,0x1d,0x28,0xe5,0x2c,0x12,0xe1,0x5, 0xf5,0x2f, +0x7e,0xd, 0x3b,0x7f,0x13,0xe5,0x2c,0x12,0xe1,0x5, 0xf5,0x30,0xe5,0x32,0xbe,0xb1, +0x2f,0x38,0x76,0xe5,0x32,0xbe,0xb1,0x30,0x38,0x6f,0xe5,0x30,0x7e,0x31,0x30,0xac, +0x3b,0x1a,0x2, 0x1a,0x0, 0xe5,0x2f,0x7e,0x71,0x2f,0xac,0x7b,0x1a,0x26,0x1a,0x24, +0x2f,0x10,0xe5,0x30,0xa, 0xfb,0x6d,0xee,0xe5,0x2f,0xa, 0x1b,0x6d,0x0, 0x2f,0x7, +0x12,0x22,0xbf,0x7c,0xb7,0xf5,0x31,0xe5,0x33,0xbe,0xb1,0x31,0x38,0x3b,0x7e,0x37, +0x64,0x4e,0x2e,0x37,0x64,0x4c,0x2e,0x37,0x64,0x50,0x7a,0x35,0x41,0xe5,0x31,0xa, +0x2b,0x7e,0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x41,0x7a,0x35,0x41,0x7e, +0x35,0x3f,0xbe,0x35,0x41,0x8, 0x12,0x7e,0x35,0x41,0x7a,0x35,0x3f,0x85,0x31,0x35, +0x7e,0xb3,0x64,0x94,0xf5,0x36,0x85,0x2d,0x34,0x5, 0x2d,0x12,0xe2,0x6e,0x28,0x3, +0x2, 0xde,0xce,0xe5,0x33,0xbe,0xb1,0x35,0x38,0x20,0xe5,0x36,0xbe,0xb0,0x0, 0x28, +0x19,0xe5,0x36,0xbe,0xb0,0xff,0x50,0x12,0xe5,0x34,0xa, 0x3b,0xb, 0x34,0x7a,0x73, +0x77,0x2b,0xe5,0x36,0x7a,0xb3,0x77,0x2d,0x80,0x6, 0x74,0x7c,0x7a,0xb3,0x77,0x2b, +0xe5,0x35,0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7f,0x61,0x7f,0x40,0x9f,0x11,0x7f, +0x51,0x7f,0x71,0x7a,0x1f,0x64,0x96,0x7a,0x1f,0x64,0x9a,0x7a,0x1f,0x64,0x9e,0xbe, +0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, 0x7e,0x54,0x2, 0x35,0x7a,0x55, +0x47,0x6c,0xee,0x80,0x66,0xa, 0x5e,0x7f,0x14,0x12,0xe2,0x66,0x7a,0x55,0x45,0xa, +0x5e,0x7f,0x16,0x12,0xe2,0x66,0x7a,0x55,0x43,0x7e,0x35,0x43,0x12,0x5f,0xa1,0x2f, +0x50,0x7e,0x65,0x45,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x2f,0x70,0x12,0x5f,0xa1,0x12, +0xe2,0x5c,0x7e,0x1f,0x64,0x96,0x2f,0x10,0x7a,0x1f,0x64,0x96,0x7d,0x16,0x1a,0x2, +0x1a,0x0, 0x7e,0x35,0x45,0x12,0xe2,0x5c,0x7e,0x1f,0x64,0x9a,0x2f,0x10,0x7a,0x1f, +0x64,0x9a,0x7e,0x15,0x45,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x43,0x12,0xe2,0x5c,0x7e, +0x1f,0x64,0x9e,0x2f,0x10,0x7a,0x1f,0x64,0x9e,0xb, 0xe0,0xbc,0xfe,0x38,0x96,0xa, +0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x23,0x10,0x7f,0x51,0x7f,0x17,0x7f,0x6, +0x12,0x23,0x10,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e,0x1f,0x64,0x96,0x7d,0x19,0x12, +0x22,0xb4,0x7e,0x85,0x47,0x7d,0x18,0x7d,0xd8,0x1a,0x12,0x1a,0xc2,0x7f,0x6, 0x12, +0x23,0x10,0x7a,0x1f,0x64,0x96,0x7e,0x1f,0x64,0x9a,0x7d,0x19,0x12,0x22,0xb4,0x7f, +0x6, 0x12,0x23,0x10,0x7a,0x1f,0x64,0x9a,0x7e,0x1f,0x64,0x9e,0x7d,0x19,0x12,0x22, +0xb4,0x7d,0x18,0x1a,0x2, 0x1a,0x0, 0x12,0x23,0x10,0x7a,0x1f,0x64,0x9e,0x7f,0x15, +0x7f,0x7, 0x12,0x22,0xa3,0x7e,0x6f,0x64,0x9e,0x9f,0x61,0x7f,0x15,0x7f,0x5, 0x12, +0x22,0xa3,0x7e,0x5f,0x64,0x96,0x9f,0x51,0x7f,0x17,0x7f,0x7, 0x12,0x22,0xa3,0x7e, +0x7f,0x64,0x9a,0x9f,0x71,0xbe,0x58,0x0, 0x0, 0x68,0x6, 0xbe,0x78,0x0, 0x0, 0x78, +0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18,0x7f,0x16,0x7d,0x19,0x12,0x22,0xb4,0x7f,0x5, +0x12,0x23,0x10,0x7f,0x6, 0x12,0x22,0xa3,0x7f,0x7, 0x12,0x23,0x10,0x7d,0x43,0xbe, +0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44,0x7c,0xb9,0xda,0x3b,0x22,0x1a,0x26,0x1a,0x24, +0x12,0x22,0xa3,0x7f,0x1, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0x7e,0x73, +0x78,0x2e,0xbe,0x71,0x2d,0x22,0xca,0xf8,0x7f,0x51,0x7f,0x40,0x7e,0x37,0x27,0x5a, +0x7a,0x37,0x64,0x4c,0x7e,0x37,0x27,0x58,0x7a,0x37,0x64,0x4e,0x7e,0x37,0x27,0x66, +0x7a,0x37,0x64,0x48,0x7e,0x37,0x27,0x68,0x7a,0x37,0x64,0x4a,0x6c,0xff,0x80,0x1e, +0x7e,0x34,0x64,0x48,0x7e,0x14,0x0, 0x28,0x74,0x9, 0x12,0x23,0x44,0x74,0x2, 0xac, +0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0xe2,0xc9,0xb, 0xf0,0x7e,0x73, +0x77,0x2c,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e,0x35,0x28, +0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x28,0x7e,0x35,0x2a, +0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2a,0xb, 0x6a,0x30, +0x9e,0x35,0x2c,0x6d,0x22,0x7e,0x33,0x77,0x2e,0x12,0xe3,0x1e,0x7e,0x15,0x28,0x12, +0x22,0xbd,0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x2e,0x6d,0x22,0x7e,0x33,0x77, +0x2f,0x12,0xe3,0x1e,0x7e,0x15,0x2a,0x12,0x22,0xbd,0x1b,0x7a,0x30,0x22,0xa, 0x13, +0x6d,0x0, 0x2, 0x22,0xa3,0xca,0x79,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70, +0x2d,0xf4,0xb, 0x7a,0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf,0x77,0x30,0x7f, +0x71,0x2d,0xf4,0xb, 0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x77,0x50,0xb, 0xa0, +0xbe,0xa0,0x20,0x40,0xd4,0x7e,0x8, 0x77,0x30,0x7e,0x18,0x77,0x50,0x74,0x20,0x12, +0xde,0xa9,0xda,0x79,0x22,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x77,0x2c,0xbe, +0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22,0x74,0x5, 0x2f, +0x11,0x14,0x78,0xfb,0x7e,0x33,0x77,0x2c,0xa, 0x13,0x6d,0x0, 0x12,0x22,0xbf,0x7c, +0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64,0xa, 0x3e,0x1b, +0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0xe3,0xcf,0x7f,0x6, 0x7c,0xbd,0x7c,0x7c, +0x12,0xe3,0xcf,0xb, 0xf0,0x7e,0x73,0x77,0x2c,0xbc,0x7f,0x50,0xbc,0x7f,0x5, 0x7f, +0x16,0x12,0xe3,0x25,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x77,0x2b,0xda,0x3b,0x22,0x7c, +0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d,0x2, 0xb, 0xa, +0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, 0x7c,0x21,0xa5, +0xba,0x0, 0x14,0xa, 0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d,0x44,0x74,0x2, +0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0xa, 0x2, 0xa, 0x13,0x2d, +0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x10, +0x22,0x74,0x9, 0xac,0xbe,0x49,0x35,0x6d,0x70,0x74,0x9, 0xac,0xbf,0x49,0x25,0x27, +0x75,0x9d,0x32,0x12,0x24,0x56,0x7d,0xc3,0x74,0x9, 0xac,0xbe,0x49,0x35,0x6d,0x6e, +0x74,0x9, 0xac,0xbf,0x49,0x25,0x27,0x73,0x9d,0x32,0x2, 0x24,0x56,0x7e,0xa0,0x5, +0x7e,0x70,0x4, 0xac,0x7f,0x19,0xa3,0x28,0xba,0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34, +0x27,0x73,0x7e,0x30,0x9, 0xac,0x3e,0x2e,0x14,0x6d,0x6e,0x74,0x9, 0x2, 0x23,0x44, +0x7e,0xa0,0x3, 0x7e,0x30,0x9, 0xac,0x3f,0x7e,0x1d,0x35,0x2d,0x31,0x7a,0x1b,0xa0, +0x7e,0x30,0x9, 0xac,0x3f,0x7e,0x1d,0x35,0x2d,0x31,0x22,0x74,0x9, 0xac,0xbf,0x7e, +0x1d,0x35,0x22,0x75,0x1e,0x2, 0x74,0x2, 0x7a,0xb3,0x77,0xe1,0x74,0x1, 0x2, 0x5, +0xbc,0x74,0x9, 0xac,0xbe,0x49,0xc5,0x6d,0x6e,0x7e,0x34,0x21,0xde,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0x40,0x9e,0x44,0x0, 0x14,0xbd,0xc4,0x22,0x7a,0xb3,0x77,0x0, 0x7a, +0xb3,0x77,0x1, 0x7a,0xb3,0x77,0x4, 0x74,0xff,0x7a,0xb3,0x77,0x5, 0xe4,0x7a,0xb3, +0x77,0x6, 0x22,0x8d,0x32,0x7d,0x23,0x1e,0x24,0xe5,0x3f,0xa, 0x3b,0xad,0x32,0x7a, +0x35,0x2f,0x22,0x74,0x2, 0xa, 0x3c,0x19,0xb3,0x62,0x1f,0x22,0x7e,0x70,0x9, 0xac, +0x7e,0x9, 0xb3,0x6d,0x75,0x9, 0x73,0x6d,0x76,0x2, 0x57,0x9, 0x6d,0x22,0xa, 0xd, +0x7e,0x14,0x0, 0x40,0x9d,0x10,0x1a,0x2, 0x1a,0x0, 0x12,0x22,0xa3,0x7f,0x71,0x22, +0x7e,0x11,0x12,0x2e,0x10,0x8, 0xa5,0xe7,0xbe,0xb0,0x0, 0x22,0x49,0x35,0x6d,0x70, +0xbe,0x34,0x0, 0x14,0x22,0x2d,0x35,0x29,0xb1,0x0, 0x8, 0xbe,0xb0,0x2d,0x22,0x5e, +0x70,0x3, 0x7e,0x8, 0x0, 0x70,0x7c,0xb7,0x22,0x7e,0x70,0x27,0xac,0x67,0x2e,0x34, +0x28,0xe6,0x6d,0x22,0x7e,0x8, 0x76,0xad,0x22,0x7e,0x50,0x9, 0xac,0x5f,0x2e,0x25, +0x2b,0xb, 0x28,0x30,0x49,0x22,0x0, 0x2, 0x22,0x7e,0x37,0x63,0x28,0x7e,0x27,0x63, +0x2a,0x22,0x74,0x17,0xa4,0x7e,0x1d,0x33,0x2d,0x35,0x22,0x7e,0x70,0x9, 0xac,0x7f, +0x2e,0x35,0x2b,0x22,0x49,0x35,0x6d,0x70,0xbe,0x34,0x0, 0x0, 0x22,0x2e,0x34,0x0, +0x8, 0x4, 0x7a,0x1b,0xb0,0x22,0x74,0x9, 0xac,0xbe,0x9, 0xb5,0x6d,0x75,0x7e,0x70, +0x9, 0xac,0x7e,0x22,0x6d,0x22,0xa, 0x1d,0x6d,0x0, 0x12,0x22,0xa3,0x2f,0x17,0x74, +0x6, 0x22,0x7e,0x71,0x12,0x74,0x9, 0xac,0x7b,0x2e,0x34,0x27,0x73,0x6d,0x22,0x22, +0x49,0x35,0x29,0x92,0x49,0x25,0x29,0x90,0x2, 0x9, 0xad,0x6c,0xaa,0x7e,0x70,0x4, +0xac,0x7f,0x19,0xa3,0x28,0xba,0x22,0x2e,0x34,0x28,0xed,0x6d,0x22,0x74,0x10,0x2, +0xb, 0x8, 0x7a,0xb3,0x76,0xfd,0x74,0xff,0x7a,0xb3,0x76,0xfe,0xe4,0x22,0x7c,0x1f, +0x2e,0x10,0x8, 0xa5,0xe7,0x22,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x20,0x7a,0x27,0x4a, +0x6d,0x22,0x74,0x1, 0x7a,0xb3,0x76,0x31,0x7a,0xb3,0x77,0xfa,0x22,0x74,0x9, 0xac, +0xbf,0x49,0x25,0x27,0x73,0x4d,0x22,0x22,0x9e,0xc4,0x0, 0x14,0xbd,0x3c,0x22,0x7e, +0x37,0x73,0x21,0xb, 0x36,0xbe,0x35,0x2b,0x22,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3, +0x6b,0x54,0x22,0xa, 0x3c,0x9, 0xa3,0x62,0x15,0x22,0xa, 0x3c,0x9, 0xb3,0x62,0x1f, +0x22,0x7a,0x37,0x6e,0x91,0x7e,0x34,0x21,0x63,0x22,0xb, 0xf5,0xb, 0x55,0xb, 0x15, +0x1b,0x34,0x22,0x74,0x27,0xac,0xbe,0x9, 0xf5,0x28,0xea,0x22,0x49,0x13,0x74,0x96, +0x49,0x3, 0x74,0x94,0x22,0x74,0x17,0xa4,0x7e,0xd, 0x33,0x2d,0x15,0x22,0x7e,0x37, +0x63,0x54,0xbe,0x34,0x0, 0x1e,0x22,0x7e,0x27,0x63,0x24,0xbe,0x24,0x0, 0x14,0x22, +0x7e,0x34,0x0, 0x17,0xe4,0x2, 0x24,0x34,0x74,0x2, 0xac,0xbf,0x9, 0x5, 0x62,0xb8, +0x22,0x7e,0x3f,0x78,0x39,0x69,0x33,0x0, 0x6, 0x22,0x75,0x1e,0x0, 0xe4,0x7a,0xb3, +0x77,0xe1,0x22,0x74,0x9, 0xac,0xbe,0x49,0x45,0x6d,0x6e,0x22,0x49,0x45,0x6d,0x70, +0xbe,0x44,0x0, 0x14,0x22,0x7e,0x1f,0x24,0x68,0x7a,0x37,0x4e,0x7f,0x22,0x7a,0x35, +0x3b,0xbe,0x34,0x0, 0x0, 0x22,0x7e,0x73,0x63,0x1d,0xbe,0x70,0xa, 0x22,0x7e,0x34, +0x0, 0x64,0x7a,0x35,0x3d,0x22,0x7e,0x39,0xb0,0x14,0x7a,0x39,0xb0,0x22,0x9d,0x32, +0x12,0x24,0x56,0x7d,0x13,0x22, \ No newline at end of file diff --git a/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_ebbg_sample.i b/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_ebbg_sample.i new file mode 100644 index 0000000000000..f66153565f32d --- /dev/null +++ b/drivers/input/touchscreen/FT8716/include/firmware/FT8716_app_ebbg_sample.i @@ -0,0 +1,3700 @@ +0x2, 0x23,0x8a,0x2, 0xd7,0xf5,0x1b,0xa, 0x30,0x22,0x22,0x2, 0x0, 0x1a,0x0, 0x1, +0x1, 0x0, 0x22,0x2, 0x77,0xf8,0xeb,0xaa,0x8, 0x22,0x32,0x2, 0x71,0x13,0x0, 0x0, +0x0, 0xff,0xff,0x2, 0x49,0xfa,0x2, 0x37,0x9e,0xff,0xff,0x2, 0x78,0xdc,0xca,0x3b, +0x7d,0x72,0x7d,0x63,0x7d,0x27,0x12,0x6, 0x48,0x7d,0x36,0x7d,0x27,0x12,0x6, 0xc5, +0xda,0x3b,0x22,0x2, 0x78,0xf4,0x7f,0x71,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e, +0x6f,0x78,0xee,0x79,0x36,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x6f,0x78,0xee,0x79, +0x36,0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x6f,0x78,0xee,0x79,0x36,0x0, 0x8, 0x7e, +0x7b,0xa0,0x7c,0x6a,0x6c,0x77,0x7e,0x6f,0x78,0xee,0x79,0x36,0x0, 0xe, 0x7c,0x4b, +0x6c,0x55,0xe5,0x27,0xa, 0x3b,0x4d,0x32,0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0x10, +0x29,0x77,0x0, 0x2, 0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x29,0x57, +0x0, 0x4, 0x7c,0x46,0x4c,0x57,0x7e,0x2f,0x78,0xee,0x2e,0x54,0x0, 0xe, 0xb, 0x2a, +0x30,0x4d,0x32,0x1b,0x2a,0x30,0x29,0x77,0x0, 0x1, 0x7c,0x47,0x6c,0x55,0x29,0x77, +0x0, 0x3, 0x7c,0x64,0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0xa, 0x7e,0xb, 0x70,0x7c, +0x47,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, +0xc, 0x6d,0x11,0x7e,0x1f,0x78,0xee,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x30,0x12,0xa, +0x5e,0xa9,0xc6,0xcb,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80,0xb2,0x86,0x22, +0xe7,0x40,0x18,0xbf,0x4a,0xda,0xb5,0x25,0x7f,0x1d,0x80,0xe2,0xd0,0x2f,0x9, 0xf6, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x87,0xa6, +0xca,0x3b,0x7f,0x30,0x7e,0x3b,0xb0,0xf5,0x2a,0x29,0xb3,0x0, 0x1, 0xbe,0xb1,0x2a, +0x28,0x2, 0xf5,0x2a,0x69,0x13,0x0, 0x6, 0x6d,0x0, 0x7e,0x34,0x0, 0xf2,0x74,0xff, +0x12,0x24,0x38,0x7f,0x3, 0x12,0xa, 0x6, 0xa9,0xd6,0xcb,0x75,0x28,0x0, 0x80,0x33, +0x75,0x29,0x0, 0x80,0x23,0x7e,0x11,0x28,0x74,0xb, 0xac,0x1b,0xe5,0x29,0xa, 0x1b, +0x2d,0x1, 0x3e,0x4, 0x69,0x13,0x0, 0x6, 0x2d,0x10,0x6d,0x0, 0xb, 0xa, 0x30,0x6e, +0x34,0xff,0xff,0x1b,0xa, 0x30,0x5, 0x29,0x29,0x73,0x0, 0x1, 0xbe,0x71,0x29,0x38, +0xd4,0x5, 0x28,0x7e,0x3b,0x70,0xbe,0x71,0x28,0x38,0xc5,0x69,0x33,0x0, 0x6, 0x7e, +0xf, 0x78,0xee,0x79,0x30,0x0, 0x4, 0xe5,0x2a,0xa, 0x2b,0x7d,0x32,0x7c,0x67,0x6c, +0x77,0x2d,0x32,0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x78, +0xee,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xd0,0x12,0xa, 0x5e,0x75,0x28,0x0, 0xe5,0x28, +0xbe,0xb0,0x4, 0x50,0x17,0x7e,0xa1,0x28,0x74,0x4, 0xa4,0x7e,0x1f,0x78,0xee,0x69, +0x11,0x0, 0x26,0x60,0x44,0x1e,0x14,0x14,0x78,0xfb,0x80,0x3d,0xe5,0x28,0xbe,0xb0, +0x8, 0x50,0x1b,0xe5,0x28,0xa, 0x5b,0x1b,0x56,0x3e,0x54,0x3e,0x54,0x7e,0x1f,0x78, +0xee,0x69,0x11,0x0, 0x28,0x60,0x22,0x1e,0x14,0x14,0x78,0xfb,0x80,0x1b,0xe5,0x28, +0xa, 0x5b,0x9e,0x54,0x0, 0x8, 0x3e,0x54,0x3e,0x54,0x7e,0x1f,0x78,0xee,0x69,0x11, +0x0, 0x2a,0x60,0x5, 0x1e,0x14,0x14,0x78,0xfb,0x5e,0x14,0x0, 0xf, 0x7e,0xa1,0x28, +0x74,0x2, 0xa4,0x69,0x33,0x0, 0x6, 0x2d,0x35,0x6d,0x22,0x1b,0x1a,0x10,0x5, 0x28, +0xe5,0x28,0xbe,0xb0,0xb, 0x40,0x87,0xa9,0xc6,0xcb,0xda,0x3b,0x22,0x6d,0x33,0x7e, +0xf, 0x78,0xf2,0x79,0x30,0x0, 0x12,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x14,0xb, +0xa, 0x30,0x5e,0x60,0x7f,0x1b,0xa, 0x30,0xe5,0x38,0x54,0x1f,0xa, 0x2b,0x7e,0xf, +0x78,0xf2,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0xe5,0x39, +0x54,0x1, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7e,0xf, +0x78,0xf2,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0xe5,0x3a, +0x54,0x3, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24, +0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30, +0x7e,0x35,0x36,0xbe,0x34,0x0, 0x2, 0x78,0x63,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, +0x14,0xb, 0xa, 0x30,0x4e,0x60,0x80,0x1b,0xa, 0x30,0xe5,0x3b,0x54,0x1f,0x7c,0x4b, +0x6c,0x55,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0xe5,0x3c,0x54,0x1, 0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0x7e, +0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0xe5, +0x3d,0x54,0x3, 0xa, 0x5b,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4,0x7e,0xf, 0x78,0xf2, +0x2e,0x14,0x0, 0x12,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0x7f,0x21,0xa9, +0xd6,0xcb,0x69,0x30,0x0, 0x4, 0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0x4, 0x69,0x30, +0x0, 0x8, 0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0x6, 0x69,0x30,0x0, 0x6, 0x7e,0x7f, +0x78,0xee,0x79,0x37,0x0, 0x8, 0x29,0x70,0x0, 0x1, 0x7c,0x47,0x6c,0x55,0x7e,0xb, +0x70,0xa, 0x37,0x2d,0x32,0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0xc, 0x29,0x70,0x0, +0x2, 0xa, 0x37,0x1b,0x34,0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0xa, 0x69,0x30,0x0, +0xa, 0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0xe, 0x69,0x30,0x0, 0xc, 0x7e,0x7f,0x78, +0xee,0x79,0x37,0x0, 0x10,0x69,0x30,0x0, 0xe, 0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, +0x12,0x69,0x30,0x0, 0x10,0x7e,0x7f,0x78,0xee,0x79,0x37,0x0, 0x30,0x29,0x70,0x0, +0x3, 0x7c,0x27,0x6c,0x33,0x7e,0x1f,0x78,0xee,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xa0, +0x12,0xa, 0x5e,0x7e,0x1f,0x78,0xee,0x69,0x11,0x0, 0x1a,0x7a,0x2b,0x30,0x69,0x11, +0x0, 0x1c,0x39,0x32,0x0, 0x1, 0x69,0x11,0x0, 0x16,0x79,0x12,0x0, 0x2, 0x69,0x11, +0x0, 0x18,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, 0x22,0x79,0x12,0x0, 0x6, 0x69,0x11, +0x0, 0x24,0x79,0x12,0x0, 0x8, 0x69,0x11,0x0, 0x1e,0x79,0x12,0x0, 0xa, 0x69,0x31, +0x0, 0x20,0x79,0x32,0x0, 0xc, 0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x7a,0x25,0x4c,0x7f, +0x30,0x7a,0x35,0x4a,0xa2,0xac,0x92,0x9, 0xc2,0xac,0x7e,0x1f,0x78,0xf2,0x69,0x31, +0x0, 0x4, 0x5e,0x34,0x10,0x0, 0x7a,0x37,0x6b,0xe7,0xc2,0xa, 0x12,0xc, 0x17,0xa2, +0x9, 0x92,0xac,0xa9,0xd3,0xcb,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, +0xf2,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x3, 0xf2,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78, +0xf4,0x7e,0x35,0x4a,0x2e,0x34,0x80,0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf2,0x69, +0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x80,0x20,0x7d,0x23,0x3e,0x24,0x7f, +0x3, 0x2d,0x12,0xb, 0xa, 0x20,0x7e,0xf, 0x3, 0xf2,0x1b,0xa, 0x20,0x7e,0xf, 0x3, +0xf2,0x69,0x20,0x0, 0x8, 0x4d,0x22,0x68,0xf4,0xb, 0x34,0xbe,0x35,0x4c,0x40,0xdb, +0xa9,0xc5,0xcb,0xa9,0xc3,0xcb,0x7e,0x37,0x6b,0xe7,0x2e,0x34,0xff,0xff,0x92,0xa, +0x12,0xc, 0x17,0xda,0x3b,0x22,0xca,0x3b,0x7a,0x25,0x4c,0x7f,0x30,0x7a,0x35,0x4a, +0xa2,0xac,0x92,0x9, 0xc2,0xac,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x4, 0x5e,0x34, +0x10,0x0, 0x7a,0x37,0x6b,0xe7,0xc2,0xa, 0x12,0xc, 0x17,0xa2,0x9, 0x92,0xac,0xd2, +0xcd,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf6,0x79,0x30,0x0, 0x6, +0x7e,0xf, 0x3, 0xf6,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7e,0x35,0x4a,0x2e, +0x34,0x80,0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf6,0x69,0x31,0x0, 0x8, 0x4d,0x33, +0x68,0xf4,0x6d,0x33,0x80,0x20,0x7d,0x23,0x3e,0x24,0x7f,0x3, 0x2d,0x12,0xb, 0xa, +0x20,0x7e,0xf, 0x3, 0xf6,0x1b,0xa, 0x20,0x7e,0xf, 0x3, 0xf6,0x69,0x20,0x0, 0x8, +0x4d,0x22,0x68,0xf4,0xb, 0x34,0xbe,0x35,0x4c,0x40,0xdb,0xa9,0xc5,0xcb,0xc2,0xcd, +0x7e,0x37,0x6b,0xe7,0x2e,0x34,0xff,0xff,0x92,0xa, 0x12,0xc, 0x17,0xda,0x3b,0x22, +0xca,0x79,0x7c,0xab,0x6d,0x77,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x6, 0x5e,0x34, +0x0, 0x2, 0x68,0x18,0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b,0xa, +0x30,0x74,0x3, 0x7a,0xb3,0x78,0x97,0x75,0x1e,0x3, 0x80,0x3, 0xe4,0x80,0x5a,0x4c, +0xaa,0x68,0x54,0x80,0x44,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x6, 0x5e,0x34,0x0, +0x1, 0x78,0xa, 0xe4,0x7a,0xb3,0x78,0x97,0x75,0x1e,0x0, 0x80,0x3c,0x7e,0x34,0x0, +0x1, 0x12,0x6a,0xa6,0xb, 0x74,0xbe,0x74,0x3, 0xe8,0x28,0x1d,0x7e,0xf, 0x78,0xf2, +0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x74,0x2, 0x7a, +0xb3,0x78,0x97,0x75,0x1e,0x2, 0xe4,0x80,0x10,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, +0xe, 0x5e,0x34,0x0, 0x3, 0x78,0xae,0x74,0x1, 0xda,0x79,0x22,0xca,0x79,0x7c,0xab, +0x6d,0x77,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x6, 0x5e,0x34,0x0, 0x2, 0x68,0x18, +0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x74,0x2, 0x7a, +0xb3,0x78,0x97,0x75,0x1e,0x2, 0x80,0x3, 0xe4,0x80,0x5a,0x4c,0xaa,0x68,0x54,0x80, +0x44,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x6, 0x5e,0x34,0x0, 0x1, 0x78,0xa, 0xe4, +0x7a,0xb3,0x78,0x97,0x75,0x1e,0x0, 0x80,0x3c,0x7e,0x34,0x0, 0x1, 0x12,0x6a,0xa6, +0xb, 0x74,0xbe,0x74,0x3, 0xe8,0x28,0x1d,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0xe, +0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b,0xa, 0x30,0x74,0x3, 0x7a,0xb3,0x78,0x97,0x75, +0x1e,0x3, 0xe4,0x80,0x10,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0xe, 0x5e,0x34,0x0, +0x8, 0x68,0xae,0x74,0x1, 0xda,0x79,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xa2,0xac, +0x92,0x3, 0xc2,0xac,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x4, 0x5e,0x34,0x10,0x0, +0x7a,0x37,0x67,0xd3,0xc2,0xa, 0x12,0xc, 0x17,0xa2,0x3, 0x92,0xac,0xa9,0xd3,0xcb, +0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf2,0x79,0x30,0x0, 0x6, 0x7e, +0xf, 0x3, 0xf2,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7d,0x36,0x2e,0x34,0x80, +0x0, 0x1b,0xa, 0x30,0x7e,0x1f,0x3, 0xf2,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4, +0x1b,0x1a,0x70,0x7e,0x1f,0x3, 0xf2,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0xa9, +0xc5,0xcb,0xa9,0xc3,0xcb,0x7e,0x37,0x67,0xd3,0x2e,0x34,0xff,0xff,0x92,0xa, 0x12, +0xc, 0x17,0xda,0x3b,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xa2,0xac,0x92,0x3, 0xc2, +0xac,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x4, 0x5e,0x34,0x10,0x0, 0x7a,0x37,0x67, +0xd3,0xc2,0xa, 0x12,0xc, 0x17,0xa2,0x3, 0x92,0xac,0xd2,0xcd,0xa9,0xd5,0xcb,0x7e, +0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf6,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x3, 0xf6,0x69, +0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7d,0x36,0x2e,0x34,0x80,0x0, 0x1b,0xa, 0x30, +0x7e,0x1f,0x3, 0xf6,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x1b,0x1a,0x70,0x7e, +0x1f,0x3, 0xf6,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0xa9,0xc5,0xcb,0xc2,0xcd, +0x7e,0x37,0x67,0xd3,0x2e,0x34,0xff,0xff,0x92,0xa, 0x12,0xc, 0x17,0xda,0x3b,0x22, +0xca,0x3b,0x7d,0x73,0xa2,0xac,0x92,0x0, 0xc2,0xac,0x7e,0x1f,0x78,0xf2,0x69,0x61, +0x0, 0x4, 0x5e,0x64,0x10,0x0, 0xc2,0xa, 0x12,0xc, 0x17,0xa2,0x0, 0x92,0xac,0xa9, +0xd3,0xcb,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf2,0x79,0x30,0x0, +0x6, 0x7e,0x1f,0x3, 0xf2,0x69,0x11,0x0, 0x6, 0x4d,0x11,0x78,0xf4,0x1b,0x1a,0x70, +0x7e,0xf, 0x3, 0xf2,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, +0x30,0x7e,0x1f,0x3, 0xf2,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x71,0x0, +0x2, 0xa9,0xc5,0xcb,0xa9,0xc3,0xcb,0x2e,0x64,0xff,0xff,0x92,0xa, 0x12,0xc, 0x17, +0x7d,0x37,0xda,0x3b,0x22,0x7e,0x8, 0x1, 0x7d,0x7e,0x34,0x0, 0x18,0xe4,0x12,0x24, +0x38,0xa9,0xd1,0xcb,0xd2,0xcc,0x7e,0x34,0x0, 0x4, 0x7e,0x8, 0x1, 0x7d,0x74,0xc, +0x12,0xa, 0xb5,0xa9,0xd1,0xcb,0xc2,0xcc,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x7e, +0x8, 0x1, 0x7d,0x2d,0x13,0xb, 0xa, 0x20,0x7c,0x45,0x6c,0x55,0xb, 0xa, 0x30,0xa, +0x36,0x4d,0x32,0x1b,0xa, 0x30,0xb, 0xa0,0xbe,0xa0,0xc, 0x40,0xdd,0x22,0xff,0xff, +0xca,0x3b,0x7d,0x73,0xa2,0xac,0x92,0x0, 0xc2,0xac,0x7e,0x1f,0x78,0xf2,0x69,0x61, +0x0, 0x4, 0x5e,0x64,0x10,0x0, 0xc2,0xa, 0x12,0xc, 0x17,0xa2,0x0, 0x92,0xac,0xd2, +0xcd,0xa9,0xd5,0xcb,0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x3, 0xf6,0x79,0x30,0x0, 0x6, +0x7e,0x1f,0x3, 0xf6,0x69,0x11,0x0, 0x6, 0x4d,0x11,0x78,0xf4,0x1b,0x1a,0x70,0x7e, +0xf, 0x3, 0xf6,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, 0x30, +0x7e,0x1f,0x3, 0xf6,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x71,0x0, 0x2, +0xa9,0xc5,0xcb,0xc2,0xcd,0x2e,0x64,0xff,0xff,0x92,0xa, 0x12,0xc, 0x17,0x7d,0x37, +0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x78,0xee,0x79,0x32, +0x0, 0x4, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0x8, 0x29,0x70, +0x0, 0x2, 0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x3, 0xa, 0x37,0x2d,0x32,0x7e,0x2f, +0x78,0xee,0x79,0x32,0x0, 0xc, 0x7e,0xb, 0x70,0x7c,0x47,0x29,0x70,0x0, 0x1, 0xa, +0x37,0x2d,0x32,0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0xa, 0x29,0x70,0x0, 0x4, 0xa, +0x37,0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x5, 0x54,0x1, 0x7c, +0x2b,0x6c,0x33,0x7e,0x1f,0x78,0xee,0x1b,0x1a,0x10,0x7e,0x34,0x0, 0xc0,0x12,0xa, +0x5e,0xa9,0xc6,0xcb,0x22,0xa9,0xd6,0xcb,0xc2,0x32,0x69,0x30,0x0, 0x4, 0x7e,0x2f, +0x78,0xee,0x79,0x32,0x0, 0x4, 0x69,0x30,0x0, 0x6, 0x7e,0x2f,0x78,0xee,0x79,0x32, +0x0, 0x6, 0x69,0x30,0x0, 0x8, 0x7e,0x2f,0x78,0xee,0x79,0x32,0x0, 0x8, 0x7e,0xb, +0x70,0x7c,0x47,0x6c,0x55,0x29,0x70,0x0, 0x1, 0xa, 0x37,0x2d,0x32,0x7e,0x2f,0x78, +0xee,0x79,0x32,0x0, 0xc, 0x29,0x70,0x0, 0x2, 0xa, 0x37,0x7e,0x2f,0x78,0xee,0x79, +0x32,0x0, 0xe, 0x29,0xb0,0x0, 0x3, 0x54,0x1, 0xa, 0x5b,0x7c,0xab,0xe4,0x7e,0x1f, +0x78,0xee,0x1b,0x1a,0x50,0x69,0x30,0x0, 0xa, 0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22, +0xa9,0xd6,0xcb,0x69,0x20,0x0, 0x4, 0x7e,0x2f,0x78,0xee,0x79,0x22,0x0, 0x4, 0x69, +0x20,0x0, 0x8, 0x7e,0x2f,0x78,0xee,0x79,0x22,0x0, 0x8, 0x7e,0xb, 0x50,0xa, 0x55, +0x7c,0xab,0xe4,0x29,0x50,0x0, 0x1, 0xa, 0x25,0x2d,0x25,0x7e,0x2f,0x78,0xee,0x79, +0x22,0x0, 0xc, 0x29,0x50,0x0, 0x2, 0xa, 0x25,0x7e,0xf, 0x78,0xee,0x79,0x20,0x0, +0xe, 0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, 0xa, 0x6d,0x11,0x7e,0x1f,0x78,0xee,0x1b, +0x1a,0x10,0x7e,0x34,0x0, 0x40,0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c, +0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0xb, 0x7a,0x40,0x5e,0x80,0x3, +0x1b,0x7a,0x40,0x7e,0x90,0x6, 0xac,0x9a,0x7c,0xb9,0x7f,0x71,0x60,0xd, 0x1e,0xf4, +0x1e,0xe4,0x50,0x4, 0x4e,0xf4,0x80,0x0, 0x14,0x78,0xf3,0x7d,0x4f,0x5e,0x44,0x0, +0x3f,0x7d,0x74,0x7c,0xef,0x6c,0xff,0x3e,0x74,0x3e,0x74,0x7e,0xd0,0x2, 0xac,0xda, +0x7f,0x60,0x2d,0xd6,0xb, 0x6a,0xf0,0x4d,0xf7,0x1b,0x6a,0xf0,0xb, 0xa0,0xbe,0xa0, +0x4, 0x40,0xae,0xda,0x3b,0x22,0x7f,0x10,0xa9,0xd6,0xcb,0x69,0x11,0x0, 0x2, 0x7e, +0x2f,0x78,0xee,0x79,0x12,0x0, 0x4, 0x69,0x11,0x0, 0x4, 0x7e,0x2f,0x78,0xee,0x79, +0x12,0x0, 0x6, 0x69,0x11,0x0, 0x6, 0x7e,0x2f,0x78,0xee,0x79,0x12,0x0, 0x8, 0x7e, +0x1b,0x30,0xa, 0x3, 0x7e,0x14,0x1, 0x0, 0xad,0x10,0x29,0x71,0x0, 0x1, 0xa, 0x37, +0x2d,0x31,0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, 0xc, 0x6d,0x11,0x7e,0x1f,0x78,0xee, +0x1b,0x1a,0x10,0x7e,0x34,0x0, 0x60,0x12,0xa, 0x5e,0xa9,0xc6,0xcb,0x22,0xa9,0xd7, +0xcb,0x7d,0x23,0x4e,0x50,0x1, 0x7e,0xf, 0x78,0xee,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0x80,0x1e,0x7e,0xf, 0x78,0xee,0xb, 0xa, 0x30,0x7d,0x23,0x5e,0x24,0x0, +0x8, 0xbe,0x24,0x0, 0x8, 0x78,0xb, 0xa9,0xd7,0xcb,0x4e,0x70,0x4, 0x1b,0xa, 0x30, +0xd2,0x32,0x7e,0xf, 0x78,0xee,0xb, 0xa, 0x30,0x7d,0x23,0x5e,0x24,0x80,0x0, 0xbe, +0x24,0x80,0x0, 0x78,0xcf,0x4e,0x60,0x40,0x1b,0xa, 0x30,0x6d,0x11,0x7e,0x1f,0x78, +0xee,0x1b,0x1a,0x10,0x22,0x7e,0x24,0x0, 0x1, 0x7e,0x7f,0x3, 0xfa,0x79,0x27,0x0, +0x6, 0x7e,0x7f,0x3, 0xfa,0x69,0x27,0x0, 0x6, 0x4d,0x22,0x78,0xf4,0x5e,0x60,0x7f, +0x1b,0x7a,0x30,0x7e,0x1f,0x3, 0xfa,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6c, +0xaa,0x80,0x20,0x6d,0x44,0x7e,0x1f,0x3, 0xfa,0x1b,0x1a,0x40,0x7e,0x1f,0x3, 0xfa, +0x69,0x41,0x0, 0x8, 0x4d,0x44,0x68,0xf4,0x69,0x41,0x0, 0x2, 0x1b,0xa, 0x40,0xb, +0x15,0xb, 0xa0,0xbc,0xba,0x38,0xdc,0x22,0xca,0x79,0x7c,0xab,0x6c,0x99,0x80,0x2d, +0x7e,0xf0,0x2, 0xac,0xf9,0x7f,0x60,0x2d,0xd7,0xb, 0x6a,0xf0,0x5e,0xf4,0xfc,0x0, +0x1b,0x6a,0xf0,0x7f,0x71,0x2d,0xf7,0xb, 0x7a,0xe0,0x7e,0xf0,0x2, 0xac,0xf9,0x7f, +0x60,0x2d,0xd7,0xb, 0x6a,0xf0,0x4d,0xfe,0x1b,0x6a,0xf0,0xb, 0x90,0xbc,0xa9,0x38, +0xcf,0xda,0x79,0x22,0xb, 0x38,0x20,0x5e,0x50,0xc0,0x1b,0x38,0x20,0xb, 0xa, 0x20, +0x5e,0x40,0x7, 0x1b,0xa, 0x20,0xe5,0x2a,0xa, 0x5b,0xb, 0x38,0x20,0x4d,0x25,0x1b, +0x38,0x20,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xa9,0xd6,0xcb,0x54,0x3f, +0x5e,0x70,0x1f,0x7e,0x14,0x0, 0x1, 0x7e,0x7f,0x78,0xee,0x79,0x17,0x0, 0x2, 0x7c, +0x2b,0x6c,0x33,0xa, 0x37,0x2d,0x31,0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, 0x32,0x7e, +0xf, 0x78,0xee,0x79,0x20,0x0, 0x14,0xa9,0xc6,0xcb,0x12,0x7, 0xb5,0x2, 0xd, 0x59, +0x30,0x2a,0x31,0xa9,0xd2,0xea,0xa9,0xc2,0xea,0x6d,0x33,0x7e,0xf, 0x78,0xf2,0x79, +0x30,0x0, 0x16,0x7e,0x34,0x1, 0x2c,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x18,0xc2, +0x2a,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x5e,0x70,0xfb,0x1b, +0xa, 0x30,0xc2,0x29,0x22,0xa2,0xac,0x92,0x9, 0x7e,0xf, 0x78,0xf2,0xb, 0xa, 0x30, +0x5e,0x34,0x10,0x0, 0x68,0xb, 0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x1b,0xa, +0x30,0xc2,0xac,0x7e,0xf, 0x78,0xf2,0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x1b, +0xa, 0x30,0xa2,0x9, 0x92,0xac,0x22,0xa2,0xac,0x92,0xb, 0xc2,0xac,0x7e,0xf, 0x78, +0xf2,0x30,0xa, 0xa, 0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x60,0x10,0x80,0x8, 0xb, 0x16, +0xb, 0xa, 0x30,0x5e,0x60,0xef,0x1b,0xa, 0x30,0xa2,0xb, 0x92,0xac,0x22,0xb, 0xa, +0x30,0x5e,0x34,0xfc,0x7f,0x1b,0xa, 0x30,0xa, 0x2b,0x5e,0x24,0x0, 0x7, 0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0xa9,0xd7,0xca,0x7e,0x24,0x0, 0x1, 0x7e,0xf, 0x78,0xf6, +0x1b,0xa, 0x20,0x7e,0x24,0x9, 0x60,0x7e,0xf, 0x78,0xf6,0x79,0x20,0x0, 0x2, 0x7e, +0xf, 0x78,0xf6,0x79,0x30,0x0, 0x4, 0x22,0xb, 0xa, 0x20,0x5e,0x24,0x80,0x1f,0x1b, +0xa, 0x20,0x7d,0x23,0x5e,0x40,0x3, 0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x60,0xc7, +0x1b,0xa, 0x30,0x54,0x7, 0xa, 0x3b,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xca,0x3b,0x7d,0x72, +0x7a,0xd, 0x29,0x7d,0x63,0x7e,0xd, 0x29,0x7d,0x27,0x12,0x3, 0xfa,0x7d,0x36,0x7e, +0xd, 0x29,0x7d,0x27,0x12,0x4, 0x96,0xda,0x3b,0x22,0xb, 0xa, 0x30,0x5e,0x60,0x9f, +0x1b,0xa, 0x30,0x54,0x3, 0xa, 0x5b,0xc4,0x23,0x54,0xe0,0x7c,0xab,0xe4,0xb, 0xa, +0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x70,0xe7,0x1b,0xa, 0x30, +0x54,0x3, 0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x3e,0x24,0xb, 0xa, 0x30,0x4d,0x32,0x1b, +0xa, 0x30,0x22,0x7c,0xa7,0xb, 0xa, 0x30,0x5e,0x60,0x40,0x60,0x3, 0x4e,0x60,0x80, +0x7c,0xba,0x54,0x3f,0x7c,0x4b,0x6c,0x55,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, +0x50,0x54,0xe0,0x1b,0xa, 0x50,0x7d,0x52,0x5e,0x54,0x0, 0x1f,0xb, 0xa, 0x20,0x4d, +0x25,0x1b,0xa, 0x20,0x79,0x30,0x0, 0x2, 0x22,0x7e,0xb3,0x1, 0x8d,0xb4,0xe7,0x12, +0x7e,0xb3,0x1, 0x8e,0xb4,0x16,0xb, 0x7e,0xb3,0x1, 0x8a,0x54,0x1, 0xb4,0x1, 0x2, +0x80,0xfe,0x22,0xb, 0xa, 0x30,0x5e,0x60,0xf, 0x1b,0xa, 0x30,0xa, 0x5b,0xc4,0x54, +0xf0,0x7c,0xab,0xe4,0xb, 0xa, 0x30,0x4d,0x35,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30, +0x5e,0x60,0xfc,0x1b,0xa, 0x30,0x54,0x3, 0x7c,0x4b,0x6c,0x55,0xb, 0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x20,0x5e,0x50,0xfc,0x1b,0xa, 0x20,0x7d,0x23, +0x5e,0x24,0x0, 0x3, 0xb, 0xa, 0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xd2,0x2a,0xd2, +0x29,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x4e,0x70,0x2, 0x1b, +0xa, 0x30,0x22,0x7d,0x23,0xb, 0xa, 0x30,0x5e,0x34,0xf8,0x0, 0x1b,0xa, 0x30,0x4d, +0x32,0x1b,0xa, 0x30,0x22,0x7d,0x23,0xb, 0xa, 0x30,0x5e,0x34,0xf8,0x0, 0x1b,0xa, +0x30,0x4d,0x32,0x1b,0xa, 0x30,0x22,0xb, 0xa, 0x30,0x5e,0x70,0x3, 0x70,0x3, 0x4e, +0x70,0xc, 0x1b,0xa, 0x30,0x22,0x2, 0xd, 0x14,0x1b,0x21,0x25,0x2b,0x31,0x37,0x36, +0x33,0x2d,0x28,0x20,0x19,0x14,0xd, 0x8, 0x1, 0x2, 0x5, 0xb, 0x10,0x18,0x1e,0x23, +0x2a,0x30,0x35,0x3a,0x3e,0x3f,0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, +0x9, 0xf, 0x15,0x1d,0x24,0x2a,0x30,0x35,0x3b,0x3e,0x3f,0x40,0x3f,0x3e,0x3d,0x3d, +0x3c,0x3c,0x3b,0x3b,0x39,0x37,0x1a,0x2d,0x65,0x55,0x1b,0x29,0x27,0x1e,0x14,0x11, +0x1a,0x26,0x2e,0x37,0x3d,0x3f,0x3d,0x37,0x2e,0x21,0x16,0xc, 0x5, 0x1, 0x0, 0x0, +0x1, 0x3, 0xa, 0x13,0x1d,0x26,0x2e,0x33,0x38,0x3a,0x16,0x21,0x2b,0x32,0x30,0x2a, +0x27,0x2a,0x2f,0x2d,0x24,0x1a,0x10,0x7, 0x1, 0x0, 0x2, 0x7, 0x10,0x19,0x23,0x2d, +0x36,0x41,0x49,0x4c,0x4a,0x45,0x3c,0x34,0x2a,0x27,0x51,0x71,0x50,0x55,0x28,0x12, +0x11,0x18,0x23,0x29,0x2b,0x2a,0x2e,0x35,0x3c,0x3e,0x3f,0x39,0x31,0x28,0x1e,0x15, +0xe, 0x6, 0x3, 0x1, 0x0, 0x0, 0x3, 0xc, 0x16,0x20,0x2b,0x32,0x37,0x39,0x20,0x29, +0x32,0x37,0x31,0x28,0x21,0x2a,0x31,0x2d,0x23,0x1b,0x13,0x8, 0x1, 0x0, 0x1, 0x5, +0xc, 0x18,0x20,0x29,0x34,0x3e,0x47,0x4f,0x50,0x4d,0x45,0x3c,0x34,0x31,0x26,0xcb, +0x50,0x55,0x1d,0x2f,0x2c,0x25,0x1a,0x1b,0x20,0x29,0x31,0x31,0x2e,0x2d,0x35,0x3d, +0x3f,0x3d,0x38,0x2c,0x22,0x15,0xd, 0x6, 0x1, 0x0, 0x1, 0x6, 0x10,0x1b,0x24,0x2f, +0x38,0x3d,0xd, 0x1b,0x27,0x31,0x32,0x28,0x1e,0x14,0x15,0x1d,0x28,0x31,0x34,0x2a, +0x1f,0x14,0x9, 0x1, 0x0, 0x4, 0xd, 0x17,0x21,0x2c,0x35,0x40,0x47,0x47,0x44,0x3c, +0x34,0x30,0x1b,0x82,0x50,0x55,0x19,0x2e,0x2a,0x1f,0x18,0x1b,0x22,0x2d,0x30,0x2e, +0x2e,0x35,0x3d,0x3f,0x3d,0x3a,0x2f,0x24,0x18,0xf, 0x7, 0x1, 0x0, 0x0, 0x3, 0xb, +0x16,0x1e,0x29,0x32,0x3a,0x3d,0x11,0x1f,0x28,0x32,0x30,0x26,0x1b,0x14,0x1c,0x25, +0x2e,0x35,0x2e,0x23,0x19,0x11,0x4, 0x0, 0x1, 0x8, 0x10,0x1c,0x25,0x30,0x38,0x40, +0x42,0x3f,0x39,0x32,0x2c,0x27,0xc0,0xd1,0x50,0x55,0x18,0x2c,0x29,0x1e,0x14,0x13, +0x16,0x1e,0x29,0x30,0x2e,0x2c,0x2b,0x37,0x3d,0x3f,0x3e,0x39,0x30,0x25,0x1b,0x10, +0x8, 0x1, 0x0, 0x2, 0x9, 0x13,0x1f,0x2d,0x38,0x3c,0x11,0x1a,0x23,0x2f,0x33,0x29, +0x20,0x16,0xe, 0x13,0x1d,0x28,0x32,0x31,0x28,0x1e,0x16,0xb, 0x2, 0x0, 0x1, 0x8, +0x12,0x1e,0x29,0x33,0x3b,0x3f,0x3c,0x32,0x29,0x26,0x30,0x6e,0x50,0x55,0x16,0x2b, +0x24,0x17,0xd, 0xa, 0xe, 0x15,0x24,0x28,0x25,0x23,0x2b,0x36,0x3b,0x3d,0x3b,0x37, +0x2b,0x20,0x15,0xb, 0x4, 0x0, 0x0, 0x3, 0xe, 0x19,0x27,0x33,0x3d,0x3f,0x13,0x21, +0x2e,0x37,0x3a,0x31,0x27,0x1c,0x13,0x1c,0x28,0x34,0x3e,0x37,0x2d,0x22,0x18,0xc, +0x1, 0x0, 0x3, 0xd, 0x18,0x25,0x31,0x3c,0x47,0x48,0x42,0x38,0x2e,0x2a,0x31,0x62, +0x50,0x55,0x35,0x2e,0x27,0x22,0x1f,0x1b,0x16,0x10,0xc, 0x8, 0x6, 0x4, 0x2, 0x0, +0x0, 0x0, 0x1, 0x3, 0x6, 0xb, 0xe, 0x12,0x17,0x1d,0x22,0x26,0x2a,0x30,0x35,0x39, +0x3d,0x3f,0x0, 0x0, 0x1, 0x4, 0x6, 0x8, 0xb, 0x10,0x16,0x1b,0x1f,0x23,0x28,0x2d, +0x32,0x36,0x3b,0x40,0x44,0x48,0x4a,0x4b,0x4c,0x4b,0x4a,0x48,0x46,0x43,0x40,0x3e, +0x3c,0x3a,0x3c,0x9c,0x34,0x55,0x2d,0x28,0x24,0x22,0x1f,0x1c,0x19,0x16,0x13,0x10, +0xc, 0x8, 0x5, 0x2, 0x0, 0x3, 0x7, 0xa, 0xe, 0x11,0x16,0x19,0x1e,0x22,0x27,0x2c, +0x30,0x33,0x36,0x39,0x3d,0x40,0x0, 0x2, 0x6, 0x9, 0xb, 0xe, 0x11,0x14,0x16,0x18, +0x1b,0x1f,0x22,0x25,0x28,0x29,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x32,0x33,0x35,0x36, +0x38,0x39,0x3b,0x3c,0x3e,0x40,0xac,0x6a,0x34,0x55,0x25,0x1e,0x1a,0x17,0x15,0x11, +0xe, 0xb, 0x9, 0x7, 0x4, 0x2, 0x1, 0x2, 0x5, 0x9, 0xd, 0x10,0x13,0x17,0x1b,0x1e, +0x21,0x25,0x29,0x2d,0x30,0x33,0x37,0x3b,0x3e,0x40,0x0, 0x6, 0xc, 0x10,0x13,0x19, +0x1f,0x23,0x27,0x2b,0x2f,0x33,0x36,0x38,0x3a,0x3a,0x3a,0x3b,0x3b,0x3b,0x3c,0x3c, +0x3c,0x3c,0x3c,0x3d,0x3d,0x3d,0x3e,0x3e,0x3f,0x40,0xca,0xd8,0x34,0x55,0x9, 0x17, +0x1d,0x26,0x2e,0x37,0x3c,0x3f,0x3b,0x33,0x2b,0x22,0x1a,0x11,0xb, 0x5, 0x3, 0x1, +0x1, 0x0, 0x0, 0x0, 0x1, 0x6, 0xa, 0x11,0x19,0x22,0x2a,0x32,0x39,0x3d,0x30,0x30, +0x2f,0x2c,0x26,0x1e,0x17,0xd, 0x5, 0x0, 0x0, 0x1, 0x6, 0xe, 0x15,0x1e,0x26,0x2c, +0x32,0x3a,0x41,0x48,0x50,0x5b,0x61,0x64,0x64,0x60,0x5b,0x56,0x51,0x4f,0xd8,0x2c, +0x33,0x55,0x6, 0x11,0x18,0x1e,0x22,0x27,0x2a,0x2c,0x29,0x25,0x1f,0x18,0x11,0xb, +0x5, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, 0xa, 0x11,0x18,0x20,0x26,0x2c,0x32,0x36,0x3b, +0x3d,0x3f,0x48,0x37,0x2e,0x24,0x1a,0x11,0xa, 0x4, 0x0, 0x0, 0x1, 0x5, 0xb, 0x12, +0x1b,0x21,0x28,0x30,0x37,0x41,0x47,0x4e,0x54,0x53,0x4e,0x48,0x41,0x3b,0x33,0x2c, +0x28,0x25,0xb, 0x67,0x33,0x55,0x6, 0xc, 0x15,0x19,0x22,0x2b,0x2f,0x36,0x3c,0x3e, +0x3f,0x39,0x34,0x29,0x25,0x1d,0x14,0xf, 0x7, 0x2, 0x0, 0x0, 0x0, 0x2, 0xc, 0x10, +0x10,0x10,0x10,0x10,0x10,0x10,0x36,0x35,0x32,0x31,0x2d,0x28,0x25,0x1f,0x18,0x13, +0xa, 0x2, 0x0, 0x0, 0x0, 0x3, 0x8, 0xc, 0x17,0x21,0x26,0x31,0x3b,0x3f,0x45,0x46, +0x46,0x46,0x46,0x46,0x46,0x46,0xf0,0x59,0x33,0x55,0x0, 0x6, 0xf, 0x19,0x21,0x2a, +0x2e,0x32,0x2a,0x21,0x18,0x14,0xc, 0x6, 0x2, 0x0, 0x1, 0xb, 0x13,0x1d,0x25,0x2a, +0x32,0x3a,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x23,0x1f,0x1b,0x17,0x13,0xc, +0x9, 0x1, 0x1, 0x6, 0xe, 0x12,0x1b,0x24,0x2d,0x37,0x3b,0x3f,0x3f,0x3d,0x39,0x36, +0x2e,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xf4,0x7b,0x33,0x55,0x5, 0xd, +0x19,0x23,0x2d,0x31,0x34,0x2c,0x22,0x1e,0x15,0xd, 0x8, 0x4, 0x2, 0x0, 0x2, 0xc, +0x10,0x19,0x21,0x2a,0x2e,0x37,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x1c,0x1b, +0x18,0x16,0x10,0xd, 0x4, 0x0, 0x3, 0x5, 0xc, 0x16,0x1e,0x26,0x2a,0x35,0x3d,0x3f, +0x3e,0x3c,0x3b,0x3a,0x39,0x38,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x36,0x8d,0x3a, +0x33,0x55,0x5, 0xd, 0x13,0x19,0x20,0x26,0x2e,0x35,0x3c,0x3d,0x37,0x2f,0x20,0x19, +0x11,0xb, 0x5, 0x2, 0x0, 0x0, 0x1, 0x6, 0xc, 0x17,0x1d,0x23,0x29,0x30,0x36,0x3b, +0x3e,0x3e,0x28,0x25,0x22,0x20,0x1d,0x18,0x14,0xf, 0x8, 0x2, 0x0, 0x0, 0x4, 0x7, +0xc, 0x11,0x18,0x1e,0x24,0x2c,0x33,0x3a,0x3e,0x3f,0x3e,0x3c,0x38,0x31,0x2a,0x21, +0x1a,0x1a,0x6, 0x33,0x33,0x55,0x26,0x1c,0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18, +0x17,0x17,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x12,0x18, +0x1f,0x28,0x31,0x37,0x3c,0x40,0x1, 0x7, 0xe, 0x14,0x1c,0x23,0x2c,0x34,0x3e,0x44, +0x4c,0x54,0x5b,0x60,0x5d,0x55,0x4f,0x49,0x43,0x3d,0x38,0x32,0x2b,0x26,0x22,0x1f, +0x1e,0x1c,0x1c,0x1c,0x1c,0x1d,0x66,0x54,0x74,0x55,0x3e,0x2c,0x21,0x1d,0x1d,0x1d, +0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1e,0x1e,0x1d,0x1a,0x11,0xc, 0x7, 0x2, +0x0, 0x0, 0x3, 0xa, 0x12,0x1c,0x23,0x2c,0x38,0x40,0xc, 0x0, 0x6, 0xf, 0x17,0x22, +0x29,0x32,0x3b,0x41,0x47,0x4f,0x55,0x5c,0x66,0x71,0x79,0x3e,0x76,0x6d,0x64,0x5a, +0x52,0x4b,0x42,0x39,0x35,0x33,0x32,0x32,0x31,0x31,0xf3,0xdb,0x74,0x55,0x9, 0x7, +0x6, 0x6, 0x5, 0x5, 0x4, 0x4, 0x4, 0x4, 0x3, 0x2, 0x2, 0x2, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x3, 0xa, 0x10,0x14,0x1b,0x22,0x28,0x2e,0x34,0x39,0x3d,0x40,0x0, 0xb, +0x11,0x16,0x1b,0x22,0x28,0x2c,0x33,0x39,0x40,0x46,0x4d,0x52,0x56,0x5c,0x61,0x68, +0x6d,0x73,0x73,0x71,0x71,0x71,0x70,0x70,0x6f,0x6f,0x6f,0x6f,0x6d,0x6e,0x79,0x80, +0x44,0x55,0x17,0x13,0x12,0x12,0x11,0x10,0xf, 0xd, 0xc, 0xb, 0x9, 0x8, 0x7, 0x4, +0x3, 0x2, 0x1, 0x0, 0x0, 0x0, 0x1, 0x4, 0xb, 0x10,0x16,0x1d,0x24,0x29,0x31,0x39, +0x3d,0x40,0x0, 0xe, 0x16,0x1a,0x1f,0x24,0x29,0x2e,0x33,0x38,0x3e,0x43,0x47,0x50, +0x55,0x59,0x62,0x69,0x6e,0x75,0x7c,0xff,0x7d,0x7c,0x79,0x73,0x6d,0x68,0x60,0x5a, +0x57,0x56,0x5d,0x8, 0x44,0x55,0x0, 0x7, 0xb, 0xd, 0x10,0x12,0x16,0x17,0x17,0x18, +0x18,0x19,0x19,0x19,0x1c,0x1e,0x20,0x22,0x23,0x25,0x27,0x29,0x2b,0x30,0x32,0x33, +0x35,0x38,0x39,0x3b,0x3d,0x3f,0x3e,0x29,0x1f,0x18,0xf, 0x7, 0x6, 0xc, 0x12,0x1d, +0x25,0x2d,0x36,0x3e,0x3b,0x35,0x2c,0x26,0x20,0x19,0x11,0xa, 0x3, 0x3, 0x9, 0x10, +0x18,0x24,0x2c,0x33,0x3a,0x3e,0x60,0x9b,0x32,0x55,0x0, 0x5, 0x5, 0x5, 0x4, 0x3, +0x2, 0x3, 0x5, 0x7, 0xa, 0xe, 0x11,0x19,0x1b,0x1c,0x1d,0x1c,0x1c,0x1d,0x1f,0x22, +0x25,0x2a,0x31,0x33,0x35,0x37,0x38,0x39,0x3c,0x40,0x0, 0x12,0x1c,0x24,0x2b,0x34, +0x3c,0x39,0x2f,0x29,0x21,0x16,0xf, 0xd, 0x14,0x1e,0x2a,0x33,0x31,0x27,0x20,0x18, +0x10,0x7, 0xa, 0x10,0x1a,0x26,0x2f,0x37,0x3d,0x3f,0xfb,0x8f,0x32,0x55,0x0, 0x0, +0x1, 0x3, 0x8, 0xb, 0x12,0x18,0x1b,0x20,0x22,0x22,0x23,0x24,0x26,0x27,0x29,0x2b, +0x30,0x31,0x31,0x32,0x32,0x34,0x35,0x37,0x3b,0x3e,0x3f,0x3f,0x3f,0x3f,0x7b,0x6d, +0x5f,0x53,0x40,0x36,0x23,0x14,0xb, 0x3, 0xe, 0x1e,0x29,0x35,0x29,0x20,0x11,0x7, +0x6, 0x16,0x1f,0x2d,0x35,0x43,0x4c,0x59,0x68,0x72,0x74,0x74,0x74,0x74,0x90,0x27, +0x32,0x55,0x2c,0x23,0x1f,0x19,0x13,0xc, 0x7, 0x3, 0x0, 0x0, 0x0, 0x1, 0x5, 0xa, +0xf, 0x16,0x1d,0x23,0x2a,0x30,0x36,0x3b,0x3e,0x40,0x3f,0x3e,0x3b,0x38,0x33,0x2f, +0x2b,0x28,0x9, 0x1, 0x0, 0x1, 0x3, 0x9, 0xe, 0x14,0x1b,0x21,0x27,0x2e,0x36,0x3b, +0x3e,0x41,0x41,0x40,0x3d,0x3a,0x36,0x2f,0x2b,0x26,0x20,0x1c,0x16,0x10,0xc, 0xa, +0x9, 0xb, 0x36,0xdc,0x30,0x55,0x1a,0x9, 0x5, 0x1, 0x0, 0x0, 0x0, 0x2, 0x5, 0x9, +0xf, 0x16,0x1c,0x22,0x2a,0x31,0x36,0x39,0x3c,0x3e,0x3f,0x3f,0x3d,0x38,0x30,0x27, +0x1f,0x18,0x12,0xb, 0x6, 0x5, 0x7, 0x12,0x19,0x22,0x2c,0x36,0x3f,0x49,0x53,0x5c, +0x63,0x66,0x64,0x5f,0x58,0x4c,0x43,0x3d,0x34,0x2b,0x22,0x1b,0x15,0xb, 0x4, 0x0, +0x0, 0x1, 0x4, 0xb, 0x13,0x18,0xf1,0xc, 0x30,0x55,0x18,0x2c,0x34,0x39,0x3c,0x3d, +0x3f,0x3f,0x3f,0x3d,0x3b,0x36,0x30,0x2a,0x24,0x1c,0x16,0xd, 0x6, 0x1, 0x0, 0x0, +0x0, 0x1, 0x1, 0x3, 0x5, 0x9, 0xf, 0x17,0x1e,0x24,0x1, 0x2, 0x8, 0xe, 0x14,0x1a, +0x21,0x28,0x30,0x37,0x40,0x49,0x50,0x55,0x59,0x5c,0x5c,0x58,0x51,0x48,0x3f,0x38, +0x31,0x2b,0x25,0x1d,0x17,0x11,0xa, 0x4, 0x1, 0x1, 0x9d,0xbf,0x30,0x55,0x16,0x7, +0x2, 0x0, 0x0, 0x0, 0x0, 0x1, 0x4, 0x8, 0xe, 0x16,0x1f,0x28,0x30,0x38,0x3c,0x3e, +0x3f,0x40,0x3f,0x3f,0x3d,0x3b,0x37,0x32,0x2c,0x25,0x1d,0x16,0xf, 0xc, 0x53,0x46, +0x3e,0x35,0x2e,0x27,0x20,0x1a,0x14,0xd, 0x6, 0x1, 0x0, 0x0, 0x3, 0xa, 0x13,0x1a, +0x20,0x27,0x2d,0x33,0x3a,0x40,0x48,0x4f,0x54,0x58,0x5a,0x5a,0x58,0x57,0xc6,0x55, +0x30,0x55,0x7, 0x1, 0x4, 0xa, 0x10,0x18,0x20,0x2a,0x32,0x38,0x3c,0x3e,0x3f,0x3e, +0x3d,0x3b,0x39,0x35,0x30,0x27,0x21,0x19,0x12,0xb, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, +0x0, 0x0, 0x32,0x1d,0x12,0x9, 0x5, 0x1, 0x0, 0x0, 0x1, 0x5, 0xd, 0x17,0x20,0x2a, +0x32,0x3b,0x45,0x4e,0x58,0x63,0x69,0x6b,0x6a,0x64,0x5d,0x57,0x4f,0x47,0x40,0x38, +0x32,0x2f,0x1a,0xb5,0x30,0x55,0x21,0x13,0xc, 0x8, 0x5, 0x2, 0x1, 0x0, 0x0, 0x1, +0x3, 0x8, 0xf, 0x17,0x1e,0x24,0x2b,0x32,0x39,0x3d,0x3e,0x3f,0x3f,0x3d,0x3a,0x36, +0x30,0x29,0x21,0x1a,0x16,0x13,0x5, 0x9, 0xe, 0x14,0x1a,0x22,0x29,0x30,0x38,0x3f, +0x47,0x4d,0x51,0x51,0x4f,0x4d,0x49,0x42,0x39,0x31,0x2b,0x25,0x1e,0x17,0x10,0x8, +0x3, 0x0, 0x0, 0x1, 0x3, 0x5, 0xaf,0x13,0x30,0x55,0x38,0x3f,0x3d,0x3a,0x36,0x2e, +0x26,0x1f,0x14,0xb, 0x6, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0x9, 0xe, 0x14,0x1c, +0x23,0x2a,0x34,0x38,0x3a,0x3b,0x3d,0x3d,0x3d,0x3d,0x29,0x1a,0x10,0x9, 0x4, 0x0, +0x0, 0x1, 0x4, 0xc, 0x14,0x1c,0x22,0x28,0x2f,0x37,0x3f,0x47,0x4f,0x56,0x5a,0x5b, +0x59,0x56,0x4e,0x47,0x40,0x37,0x30,0x28,0x22,0x1f,0x2a,0xa9,0x30,0x55,0x3e,0x3b, +0x38,0x33,0x2b,0x24,0x1d,0x16,0x10,0x7, 0x3, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, +0x6, 0xc, 0x15,0x1c,0x23,0x29,0x2f,0x35,0x38,0x3b,0x3c,0x3e,0x3f,0x3f,0x1f,0x10, +0xa, 0x6, 0x0, 0x0, 0x0, 0x2, 0x4, 0xc, 0x12,0x18,0x1e,0x25,0x2c,0x35,0x3c,0x42, +0x4a,0x51,0x56,0x56,0x53,0x4e,0x49,0x40,0x3a,0x33,0x2c,0x25,0x1f,0x1c,0xf9,0xa2, +0x30,0x55,0x1f,0x2b,0x31,0x35,0x38,0x3b,0x3e,0x3f,0x3f,0x3d,0x3a,0x34,0x2d,0x27, +0x23,0x1d,0x17,0x10,0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x3, 0x6, 0xa, 0xf, 0x15,0x1b, +0x20,0x23,0x45,0x42,0x3e,0x38,0x34,0x2d,0x24,0x1c,0x15,0x11,0xb, 0x6, 0x2, 0x0, +0x0, 0x0, 0x1, 0x3, 0x7, 0xd, 0x12,0x18,0x20,0x28,0x30,0x36,0x3c,0x42,0x47,0x48, +0x49,0x4a,0x65,0x9d,0x30,0x55,0x1c,0x2a,0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x3e,0x3d, +0x3a,0x35,0x2e,0x28,0x23,0x1c,0x15,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x1, 0x1, 0x4, +0x8, 0xd, 0x13,0x19,0x1e,0x22,0x40,0x3e,0x3a,0x33,0x2f,0x29,0x22,0x1b,0x15,0x10, +0xa, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x11,0x17,0x1c,0x24,0x2a,0x30,0x35, +0x3b,0x40,0x43,0x44,0x45,0x45,0xcb,0xc6,0x30,0x55,0x5, 0x3, 0x4, 0x7, 0xa, 0x10, +0x17,0x21,0x28,0x2e,0x33,0x38,0x3c,0x3e,0x3f,0x3f,0x3e,0x3b,0x38,0x31,0x29,0x21, +0x18,0xf, 0x9, 0x4, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x26,0x35,0x3d,0x45,0x4b,0x51, +0x53,0x52,0x4f,0x4c,0x46,0x41,0x3b,0x34,0x2e,0x25,0x1e,0x17,0x11,0x9, 0x3, 0x0, +0x0, 0x2, 0x6, 0xc, 0x12,0x18,0x1e,0x24,0x2c,0x31,0xf4,0xb6,0x30,0x55,0xa, 0x5, +0x5, 0x5, 0x8, 0xf, 0x16,0x20,0x29,0x31,0x36,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3c, +0x3a,0x33,0x2d,0x24,0x1c,0x14,0xf, 0x8, 0x4, 0x0, 0x0, 0x0, 0x1, 0x2, 0x35,0x46, +0x4e,0x56,0x5d,0x65,0x68,0x66,0x60,0x57,0x4f,0x47,0x3f,0x37,0x2e,0x25,0x1e,0x16, +0x10,0x6, 0x2, 0x0, 0x1, 0x5, 0xb, 0x15,0x1d,0x28,0x2f,0x39,0x41,0x45,0xf0,0xbc, +0x30,0x55,0x7, 0x3, 0x3, 0x3, 0x4, 0x7, 0xf, 0x17,0x20,0x28,0x30,0x36,0x3b,0x3d, +0x3f,0x3f,0x3d,0x39,0x36,0x2d,0x25,0x1d,0x16,0xd, 0x8, 0x2, 0x0, 0x0, 0x1, 0x2, +0x3, 0x5, 0x2e,0x3f,0x48,0x50,0x59,0x5f,0x67,0x68,0x63,0x5d,0x52,0x4a,0x3e,0x35, +0x2b,0x20,0x18,0x10,0xa, 0x3, 0x0, 0x0, 0x1, 0x7, 0xe, 0x19,0x22,0x2b,0x31,0x3a, +0x42,0x47,0xef,0xc9,0x30,0x55,0x3b,0x3c,0x3c,0x3b,0x39,0x36,0x2f,0x27,0x21,0x19, +0x11,0xb, 0x5, 0x1, 0x0, 0x0, 0x1, 0x2, 0x4, 0x6, 0xa, 0x10,0x16,0x1f,0x26,0x2d, +0x33,0x39,0x3c,0x3e,0x3f,0x3f,0x22,0x31,0x3b,0x41,0x47,0x4d,0x56,0x59,0x5a,0x58, +0x55,0x51,0x4b,0x43,0x3d,0x35,0x29,0x20,0x18,0x11,0x9, 0x3, 0x0, 0x0, 0x1, 0x3, +0x7, 0xf, 0x15,0x1b,0x21,0x26,0x2b,0xa0,0x30,0x55,0x37,0x38,0x37,0x34,0x2d,0x26, +0x1c,0x16,0xe, 0x9, 0x4, 0x2, 0x0, 0x0, 0x0, 0x1, 0x2, 0x5, 0xa, 0x10,0x17,0x20, +0x26,0x2e,0x35,0x3a,0x3c,0x3e,0x3f,0x3f,0x3e,0x3e,0x30,0x40,0x49,0x50,0x59,0x5e, +0x60,0x5d,0x56,0x50,0x47,0x41,0x39,0x33,0x2a,0x20,0x1a,0x10,0xa, 0x5, 0x1, 0x0, +0x0, 0x3, 0x8, 0x10,0x17,0x1f,0x25,0x2f,0x38,0x3c,0x37,0xc3,0x30,0x55,0x3b,0x3d, +0x3d,0x3b,0x38,0x32,0x27,0x1c,0x13,0xe, 0x8, 0x3, 0x0, 0x0, 0x0, 0x1, 0x3, 0x7, +0xb, 0x12,0x18,0x20,0x28,0x31,0x39,0x3d,0x3f,0x40,0x3f,0x3f,0x3e,0x3e,0x33,0x45, +0x4e,0x57,0x5d,0x65,0x6c,0x6a,0x66,0x63,0x5c,0x53,0x4a,0x40,0x38,0x2e,0x25,0x1a, +0x11,0x8, 0x4, 0x0, 0x0, 0x2, 0x9, 0x10,0x19,0x21,0x2a,0x32,0x39,0x3e,0x7, 0x90, +0x30,0x55,0x8, 0x2, 0x0, 0x0, 0x0, 0x2, 0x5, 0x7, 0xc, 0x12,0x19,0x1f,0x2b,0x32, +0x37,0x3b,0x3d,0x3f,0x3f,0x3e,0x3d,0x3a,0x37,0x2f,0x29,0x23,0x1d,0x16,0xf, 0x9, +0x6, 0x6, 0x47,0x3d,0x36,0x2f,0x27,0x1e,0x16,0x10,0x9, 0x3, 0x0, 0x0, 0x1, 0x4, +0x7, 0xd, 0x14,0x1d,0x26,0x2d,0x33,0x3a,0x42,0x4e,0x53,0x55,0x56,0x54,0x4f,0x48, +0x42,0x42,0x43,0x9e,0x30,0x55,0x2, 0x0, 0x0, 0x1, 0x3, 0x7, 0xc, 0x13,0x1c,0x24, +0x2d,0x37,0x3f,0x3d,0x3b,0x39,0x36,0x34,0x31,0x2e,0x2b,0x27,0x20,0x16,0xe, 0x8, +0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x5d,0x50,0x46,0x3e,0x36,0x2c,0x20,0x16,0xd, 0x6, +0x2, 0x0, 0xb, 0x16,0x22,0x2a,0x33,0x3c,0x44,0x4c,0x55,0x5d,0x69,0x79,0x7d,0x76, +0x6d,0x63,0x59,0x50,0x48,0x47,0x12,0x3e,0x30,0x55,0x3, 0x1, 0x2, 0x6, 0xa, 0x16, +0x20,0x25,0x30,0x39,0x3e,0x3f,0x3f,0x3c,0x3a,0x32,0x28,0x22,0x19,0xe, 0x5, 0x2, +0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x29,0x23,0x18,0xf, 0xb, 0x3, +0x0, 0x0, 0x1, 0x8, 0x11,0x17,0x21,0x2a,0x2f,0x3a,0x42,0x43,0x42,0x3e,0x38,0x34, +0x2c,0x24,0x1f,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x7f,0xd2,0x30,0x55,0x39,0x2b, +0x24,0x1c,0x15,0xe, 0x9, 0x6, 0x5, 0x6, 0x9, 0x10,0x19,0x22,0x27,0x2e,0x35,0x3b, +0x3e,0x3f,0x3d,0x38,0x32,0x2c,0x26,0x1f,0x19,0x13,0xb, 0x5, 0x1, 0x0, 0x6, 0x0, +0x1, 0x2, 0x6, 0xb, 0x11,0x17,0x1d,0x24,0x2a,0x2f,0x32,0x34,0x35,0x36,0x37,0x3b, +0x41,0x47,0x4e,0x56,0x5d,0x61,0x64,0x65,0x65,0x63,0x60,0x5c,0x57,0x54,0xd1,0x4a, +0x46,0x55,0x3c,0x37,0x33,0x2f,0x25,0x20,0x1b,0x10,0xc, 0x8, 0x2, 0x0, 0x0, 0x3, +0x7, 0xc, 0x16,0x1b,0x1f,0x2a,0x2f,0x33,0x3d,0x3d,0x39,0x2f,0x2b,0x28,0x28,0x28, +0x28,0x28,0x2, 0x0, 0x0, 0x0, 0x2, 0x4, 0x7, 0xc, 0xf, 0x13,0x1c,0x20,0x24,0x2d, +0x30,0x32,0x35,0x36,0x36,0x36,0x36,0x36,0x39,0x3d,0x42,0x48,0x4a,0x4b,0x4b,0x4b, +0x4b,0x4b,0x10,0xa2,0x46,0x55,0x32,0x2c,0x27,0x1c,0x16,0xc, 0x7, 0x3, 0x0, 0x0, +0x0, 0x2, 0x4, 0xd, 0x11,0x1a,0x1f,0x25,0x2f,0x33,0x3c,0x3d,0x34,0x2f,0x2a,0x21, +0x1d,0x1c,0x1c,0x1c,0x1c,0x1c,0x1, 0x0, 0x0, 0x0, 0x2, 0x6, 0xa, 0xe, 0x16,0x1a, +0x22,0x26,0x2b,0x31,0x32,0x35,0x36,0x38,0x3a,0x3b,0x3e,0x41,0x4a,0x4c,0x4d,0x4e, +0x4e,0x4e,0x4e,0x4e,0x4e,0x4e,0x43,0x33,0x46,0x55,0x1a,0x13,0x10,0xd, 0xb, 0xa, +0xc, 0x11,0x16,0x20,0x25,0x29,0x2e,0x32,0x37,0x3c,0x3f,0x3c,0x38,0x33,0x2e,0x29, +0x24,0x1e,0x19,0xf, 0xb, 0x7, 0x2, 0x0, 0x0, 0x0, 0x0, 0x6, 0xb, 0x10,0x15,0x19, +0x1d,0x1e,0x1f,0x1e,0x1f,0x1f,0x20,0x21,0x24,0x29,0x2f,0x39,0x3e,0x41,0x44,0x47, +0x49,0x4b,0x4c,0x4e,0x4e,0x4f,0x4e,0x4d,0x4d,0x4d,0xa, 0x24,0x46,0x55,0x0, 0x1, +0x3, 0x5, 0x7, 0x8, 0xa, 0xb, 0xc, 0xe, 0xf, 0x11,0x12,0x14,0x16,0x1a,0x1e,0x22, +0x24,0x27,0x2a,0x2c,0x2e,0x31,0x33,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x3f,0x1, 0xe, +0x14,0x1b,0x23,0x28,0x2e,0x35,0x3a,0x40,0x48,0x4f,0x56,0x5d,0x62,0x61,0x5a,0x53, +0x4e,0x47,0x40,0x3b,0x35,0x2d,0x29,0x22,0x1b,0x17,0x10,0x9, 0x5, 0x1, 0x6d,0x7d, +0x54,0x55,0x40,0x39,0x38,0x36,0x35,0x33,0x31,0x2e,0x2c,0x2b,0x29,0x27,0x25,0x24, +0x22,0x1f,0x1d,0x1a,0x18,0x15,0x14,0x12,0xf, 0xc, 0x9, 0x7, 0x4, 0x2, 0x1, 0x0, +0x0, 0x0, 0x0, 0xd, 0x15,0x1d,0x23,0x2a,0x32,0x3b,0x43,0x48,0x50,0x57,0x5d,0x63, +0x68,0x65,0x5e,0x58,0x51,0x4a,0x45,0x3f,0x38,0x32,0x2b,0x26,0x1f,0x16,0x10,0x8, +0x4, 0x1, 0x6a,0xec,0x54,0x55,0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x1, 0x2, 0x4, 0x5, 0x7, 0x9, 0xd, 0x10,0x13,0x18,0x1f,0x24,0x27,0x2b,0x2e,0x31, +0x34,0x36,0x39,0x3c,0x3e,0x40,0x0, 0x7, 0xf, 0x13,0x16,0x1a,0x1e,0x22,0x25,0x28, +0x2f,0x36,0x3b,0x3f,0x43,0x47,0x4b,0x4c,0x4c,0x4c,0x49,0x46,0x43,0x3f,0x3a,0x35, +0x32,0x2d,0x27,0x21,0x1d,0x1a,0xb5,0xd0,0x54,0x55,0x0, 0x1, 0x1, 0x1, 0x2, 0x3, +0x3, 0x4, 0x5, 0x9, 0xf, 0x16,0x1d,0x22,0x28,0x2d,0x30,0x32,0x34,0x37,0x39,0x3a, +0x3c,0x3d,0x3e,0x3e,0x3f,0x3f,0x3e,0x3e,0x3c,0x3a,0x22,0x2e,0x36,0x3f,0x46,0x4c, +0x51,0x56,0x5b,0x5e,0x60,0x5e,0x5c,0x58,0x53,0x4d,0x49,0x45,0x41,0x3a,0x35,0x31, +0x2d,0x27,0x23,0x1f,0x19,0x11,0xd, 0x8, 0x3, 0x0, 0x3b,0x38,0x54,0x55,0x0, 0x2, +0x3, 0x5, 0x6, 0x8, 0xb, 0x10,0x13,0x16,0x17,0x19,0x1b,0x1d,0x1f,0x21,0x22,0x22, +0x22,0x22,0x23,0x25,0x28,0x2e,0x31,0x34,0x36,0x38,0x3a,0x3c,0x3e,0x3f,0x6, 0x17, +0x20,0x27,0x30,0x38,0x3e,0x39,0x32,0x2b,0x25,0x1e,0x18,0x10,0x9, 0x9, 0x10,0x18, +0x1f,0x26,0x2f,0x36,0x3c,0x38,0x2f,0x27,0x1f,0x18,0xf, 0x8, 0x1, 0x2, 0xc7,0x75, +0x31,0x55,0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x3, 0x8, 0xd, 0x12,0x15,0x17,0x18,0x1a, +0x1b,0x1c,0x1d,0x1d,0x1e,0x1f,0x22,0x27,0x2e,0x35,0x38,0x3b,0x3d,0x3e,0x3f,0x40, +0x3f,0x3e,0x6, 0x15,0x1b,0x23,0x29,0x2f,0x37,0x3c,0x37,0x2e,0x27,0x20,0x1a,0x13, +0xe, 0x14,0x1a,0x21,0x27,0x2f,0x38,0x3f,0x3d,0x35,0x2e,0x26,0x20,0x18,0x11,0xb, +0x3, 0x0, 0x67,0x3f,0x31,0x55,0xd, 0xd0,0x70,0x8f,0x0, 0xff,0xd0,0x2f,0x4, 0xa7, +0x24,0x87,0x2, 0xa9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x41,0x37,0x31,0x1, 0xd1,0x0, 0x32,0x0, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8, 0x30,0x30,0x31,0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, +0x1, 0x0, 0x1, 0x8, 0x8, 0x10,0x20,0x10,0x20,0x0, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, +0x3, 0x0, 0x3, 0x1, 0x0, 0x1, 0x0, 0x1, 0x0, 0x3, 0x0, 0x4, 0x0, 0x5, 0x0, 0x6, +0x0, 0x7, 0x0, 0x8, 0x0, 0x9, 0x0, 0xa, 0x0, 0xb, 0x0, 0xc, 0x0, 0xd, 0x0, 0xe, +0x0, 0xf, 0x0, 0x10,0x0, 0x11,0x0, 0x12,0x0, 0x13,0x0, 0x14,0x0, 0x15,0x0, 0x16, +0x0, 0x17,0x0, 0x18,0x0, 0x19,0x0, 0x1a,0x0, 0x1b,0x0, 0x1c,0x0, 0x1d,0x0, 0x1e, +0x0, 0x1f,0x0, 0x20,0x0, 0x21,0x0, 0x22,0x0, 0x23,0x0, 0x24,0x0, 0x25,0x0, 0x26, +0x0, 0x27,0x0, 0x28,0x0, 0x29,0x0, 0x2a,0x0, 0x2b,0x0, 0x2c,0x0, 0x2d,0x0, 0x2e, +0x0, 0x2f,0x0, 0x30,0x0, 0x31,0x0, 0x32,0x0, 0x33,0x0, 0x34,0x0, 0x35,0x0, 0x36, +0x0, 0x37,0x0, 0x38,0x0, 0x39,0x0, 0x3a,0x0, 0x3b,0x0, 0x3c,0x0, 0x3d,0x0, 0x3e, +0x0, 0x3f,0x0, 0x40,0x0, 0x41,0x0, 0x42,0x0, 0x43,0x0, 0x44,0x0, 0x45,0x0, 0x46, +0x0, 0x47,0x0, 0x48,0x0, 0x49,0x0, 0x4a,0x0, 0x4b,0x0, 0x4c,0x0, 0x4d,0x0, 0x4e, +0x0, 0x4f,0x0, 0x50,0x0, 0x51,0x0, 0x52,0x0, 0x53,0x0, 0x54,0x0, 0x55,0x0, 0x56, +0x0, 0x57,0x0, 0x58,0x0, 0x59,0x0, 0x5a,0x0, 0x5b,0x0, 0x5c,0x0, 0x5d,0x0, 0x5e, +0x0, 0x5f,0x0, 0x60,0x0, 0x61,0x0, 0x62,0x0, 0x63,0x0, 0x64,0x0, 0x65,0x0, 0x66, +0x0, 0x67,0x0, 0x68,0x0, 0x69,0x0, 0x6a,0x0, 0x6b,0x0, 0x6c,0x0, 0x6d,0x0, 0x6e, +0x0, 0x6f,0x0, 0x70,0x0, 0x71,0x0, 0x72,0x0, 0x73,0x0, 0x74,0x0, 0x75,0x0, 0x76, +0x0, 0x77,0x0, 0x78,0x0, 0x79,0x0, 0x7a,0x0, 0x7b,0x0, 0x7c,0x0, 0x7d,0x0, 0x7e, +0x0, 0x7f,0x0, 0x80,0x0, 0x81,0x0, 0x82,0x0, 0x83,0x0, 0x84,0x0, 0x85,0x0, 0x86, +0x0, 0x87,0x0, 0x88,0x0, 0x89,0x0, 0x8a,0x0, 0x8b,0x0, 0x8c,0x0, 0x8d,0x0, 0x8e, +0x0, 0x8f,0x0, 0x90,0x0, 0x91,0x0, 0x92,0x0, 0x93,0x0, 0x94,0x0, 0x95,0x0, 0x96, +0x0, 0x97,0x0, 0x98,0x0, 0x99,0x0, 0x9a,0x0, 0x9b,0x0, 0x9c,0x0, 0x9d,0x0, 0x9e, +0x0, 0x9f,0x0, 0xa0,0x0, 0xa1,0x0, 0xa2,0x0, 0xa3,0x0, 0xa4,0x0, 0xa5,0x0, 0xa6, +0x0, 0xa7,0x0, 0xa8,0x0, 0xa9,0x0, 0xaa,0x0, 0xab,0x0, 0xac,0x0, 0xad,0x0, 0xae, +0x0, 0xaf,0x0, 0xb0,0x0, 0xb1,0x0, 0xb2,0x0, 0xb3,0x0, 0xb4,0x0, 0xb5,0x0, 0xb6, +0x0, 0xb7,0x0, 0xb8,0x0, 0xb9,0x0, 0xba,0x0, 0xbb,0x0, 0xbc,0x0, 0xbd,0x0, 0xbe, +0x0, 0xbf,0x0, 0xc0,0x0, 0xc1,0x0, 0xc2,0x0, 0xc3,0x0, 0xc4,0x0, 0xc5,0x0, 0xc6, +0x0, 0xc7,0x0, 0xc8,0x0, 0xc9,0x0, 0xca,0x0, 0xcb,0x0, 0xcc,0x0, 0xcd,0x0, 0xce, +0x0, 0xcf,0x0, 0xd0,0x0, 0xd1,0x0, 0xd2,0x0, 0xd3,0x0, 0xd4,0x0, 0xd5,0x0, 0xd6, +0x0, 0xd7,0x0, 0xd8,0x0, 0xd9,0x0, 0xda,0x0, 0xdb,0x0, 0xdc,0x0, 0xdd,0x0, 0xde, +0x0, 0xdf,0x0, 0xe0,0x0, 0xe1,0x0, 0xe2,0x0, 0xe3,0x0, 0xe4,0x0, 0xe5,0x0, 0xe6, +0x0, 0xe7,0x0, 0xe8,0x0, 0xe9,0x0, 0xea,0x0, 0xeb,0x0, 0xec,0x0, 0xed,0x0, 0xee, +0x0, 0xef,0x0, 0xf0,0x0, 0xf1,0x0, 0xf2,0x0, 0xf3,0x0, 0xf4,0x0, 0xf5,0x0, 0xf6, +0x0, 0xf7,0x0, 0xf8,0x0, 0xf9,0x0, 0xfa,0x0, 0xfb,0x0, 0xfc,0x0, 0xfd,0x0, 0xfe, +0x0, 0xff,0x1, 0x0, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0xff, +0x0, 0xfe,0x0, 0xfd,0x0, 0xfc,0x0, 0xfb,0x0, 0xfa,0x0, 0xf9,0x0, 0xf8,0x0, 0xf7, +0x0, 0xf6,0x0, 0xf5,0x0, 0xf4,0x0, 0xf3,0x0, 0xf2,0x0, 0xf1,0x0, 0xf0,0x0, 0xef, +0x0, 0xee,0x0, 0xed,0x0, 0xec,0x0, 0xeb,0x0, 0xea,0x0, 0xe9,0x0, 0xe8,0x0, 0xe7, +0x0, 0xe6,0x0, 0xe5,0x0, 0xe4,0x0, 0xe3,0x0, 0xe2,0x0, 0xe1,0x0, 0xe0,0x0, 0xdf, +0x0, 0xde,0x0, 0xdd,0x0, 0xdc,0x0, 0xdb,0x0, 0xda,0x0, 0xd9,0x0, 0xd8,0x0, 0xd7, +0x0, 0xd6,0x0, 0xd5,0x0, 0xd4,0x0, 0xd3,0x0, 0xd2,0x0, 0xd1,0x0, 0xd0,0x0, 0xcf, +0x0, 0xce,0x0, 0xcd,0x0, 0xcc,0x0, 0xcb,0x0, 0xca,0x0, 0xc9,0x0, 0xc8,0x0, 0xc7, +0x0, 0xc6,0x0, 0xc5,0x0, 0xc4,0x0, 0xc3,0x0, 0xc2,0x0, 0xc1,0x0, 0xc0,0x0, 0xbf, +0x0, 0xbe,0x0, 0xbd,0x0, 0xbc,0x0, 0xbb,0x0, 0xba,0x0, 0xb9,0x0, 0xb8,0x0, 0xb7, +0x0, 0xb6,0x0, 0xb5,0x0, 0xb4,0x0, 0xb3,0x0, 0xb2,0x0, 0xb1,0x0, 0xb0,0x0, 0xaf, +0x0, 0xae,0x0, 0xad,0x0, 0xac,0x0, 0xab,0x0, 0xaa,0x0, 0xa9,0x0, 0xa8,0x0, 0xa7, +0x0, 0xa6,0x0, 0xa5,0x0, 0xa4,0x0, 0xa3,0x0, 0xa2,0x0, 0xa1,0x0, 0xa0,0x0, 0x9f, +0x0, 0x9e,0x0, 0x9d,0x0, 0x9c,0x0, 0x9b,0x0, 0x9a,0x0, 0x99,0x0, 0x98,0x0, 0x97, +0x0, 0x96,0x0, 0x95,0x0, 0x94,0x0, 0x93,0x0, 0x92,0x0, 0x91,0x0, 0x90,0x0, 0x8f, +0x0, 0x8e,0x0, 0x8d,0x0, 0x8c,0x0, 0x8b,0x0, 0x8a,0x0, 0x89,0x0, 0x88,0x0, 0x87, +0x0, 0x86,0x0, 0x85,0x0, 0x84,0x0, 0x83,0x0, 0x82,0x0, 0x81,0x0, 0x80,0x0, 0x7f, +0x0, 0x7e,0x0, 0x7d,0x0, 0x7c,0x0, 0x7b,0x0, 0x7a,0x0, 0x79,0x0, 0x78,0x0, 0x77, +0x0, 0x76,0x0, 0x75,0x0, 0x74,0x0, 0x73,0x0, 0x72,0x0, 0x71,0x0, 0x70,0x0, 0x6f, +0x0, 0x6e,0x0, 0x6d,0x0, 0x6c,0x0, 0x6b,0x0, 0x6a,0x0, 0x69,0x0, 0x68,0x0, 0x67, +0x0, 0x66,0x0, 0x65,0x0, 0x64,0x0, 0x63,0x0, 0x62,0x0, 0x61,0x0, 0x60,0x0, 0x5f, +0x0, 0x5e,0x0, 0x5d,0x0, 0x5c,0x0, 0x5b,0x0, 0x5a,0x0, 0x59,0x0, 0x58,0x0, 0x57, +0x0, 0x56,0x0, 0x55,0x0, 0x54,0x0, 0x53,0x0, 0x52,0x0, 0x51,0x0, 0x50,0x0, 0x4f, +0x0, 0x4e,0x0, 0x4d,0x0, 0x4c,0x0, 0x4b,0x0, 0x4a,0x0, 0x49,0x0, 0x48,0x0, 0x47, +0x0, 0x46,0x0, 0x45,0x0, 0x44,0x0, 0x43,0x0, 0x42,0x0, 0x41,0x0, 0x40,0x0, 0x3f, +0x0, 0x3e,0x0, 0x3d,0x0, 0x3c,0x0, 0x3b,0x0, 0x3a,0x0, 0x39,0x0, 0x38,0x0, 0x37, +0x0, 0x36,0x0, 0x35,0x0, 0x34,0x0, 0x33,0x0, 0x32,0x0, 0x31,0x0, 0x30,0x0, 0x2f, +0x0, 0x2e,0x0, 0x2d,0x0, 0x2c,0x0, 0x2b,0x0, 0x2a,0x0, 0x29,0x0, 0x28,0x0, 0x27, +0x0, 0x26,0x0, 0x25,0x0, 0x24,0x0, 0x23,0x0, 0x22,0x0, 0x21,0x0, 0x20,0x0, 0x1f, +0x0, 0x1e,0x0, 0x1d,0x0, 0x1c,0x0, 0x1b,0x0, 0x1a,0x0, 0x19,0x0, 0x18,0x0, 0x17, +0x0, 0x16,0x0, 0x15,0x0, 0x14,0x0, 0x13,0x0, 0x12,0x0, 0x11,0x0, 0x10,0x0, 0xf, +0x0, 0xe, 0x0, 0xd, 0x0, 0xc, 0x0, 0xb, 0x0, 0xa, 0x0, 0x9, 0x0, 0x8, 0x0, 0x7, +0x0, 0x6, 0x0, 0x5, 0x0, 0x4, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x18,0x12,0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x6, 0x0, +0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, +0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x0, 0x6, 0x18,0x12,0x2, 0x5, 0x0, +0x0, 0x0, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x18,0x12,0x2, 0x5, 0x1, 0x0, 0x0, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, +0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, +0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x18,0x12,0x2, 0x5, 0x2, 0x0, 0x0, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, 0x0, 0x5, +0x1, 0xa, 0x1e,0x40,0x8, 0x0, 0x64,0xd, 0xac,0x0, 0xc8,0x1, 0x9a,0x1, 0x36,0x1, +0x36,0x5, 0xdc,0x5, 0xdc,0x5, 0xdc,0x1, 0x90,0x1, 0x90,0xa, 0x0, 0x2, 0x0, 0x1, +0xa, 0x6, 0x21,0x3c,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x16,0x1, 0x0, 0x1, 0x87,0x1, 0x0, 0x9, +0x1, 0xd0,0x0, 0x1, 0x0, 0x15,0x1, 0x1, 0x4, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d,0x0, 0x0, 0x0, 0x0, 0x0, 0xff,0x0, +0x64,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xd0,0x1, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x2, 0x0, 0x4, 0x0, 0x2, 0xd6, +0x1, 0x68,0x2d,0x2d,0x1, 0x68,0x1, 0x90,0x0, 0xb4,0x0, 0xb7,0x5, 0xa0,0x2, 0xd0, +0x2d,0x2d,0x1, 0x68,0x1, 0x68,0x0, 0xb4,0x0, 0xb4,0x10,0x0, 0xc8,0x2, 0x58,0x3, +0x20,0x2, 0xd0,0x7, 0xd0,0x1, 0x2c,0x0, 0x40,0x0, 0x4, 0x1, 0x5, 0x2, 0x2, 0x4, +0x4, 0x6, 0x80,0x0, 0xc8,0x13,0x88,0x10,0x3, 0x6, 0x1, 0x2c,0x2, 0x58,0x3, 0x20, +0x1f,0x40,0x28,0x1, 0x5e,0x2, 0xbc,0x0, 0x14,0x12,0x5, 0xf, 0x3, 0x34,0x1, 0x9a, +0x6, 0x68,0x0, 0x64,0x4, 0xa, 0x5, 0x0, 0x64,0x2, 0x72,0x0, 0x64,0x5, 0x3c,0x0, +0x32,0x1, 0xf4,0x1, 0xf4,0x3, 0x20,0x0, 0xc8,0x0, 0x48,0x0, 0x1e,0x0, 0x80,0x1, +0x6b,0x1, 0x68,0x0, 0x64,0x7, 0xd0,0x1, 0x68,0x1, 0x6b,0x0, 0x64,0x7, 0xd0,0x0, +0x0, 0x2, 0xd6,0x0, 0x0, 0x5, 0xa0,0x0, 0x64,0x0, 0xa0,0x0, 0xa0,0x9, 0xc4,0x1, +0x2c,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, 0x24, +0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32,0x6e, +0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff,0xff, +0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12,0xad, +0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, 0x74, +0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22,0x22, +0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf,0x10, +0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34,0x22, +0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40,0x4, +0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, 0x22, +0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x7c, +0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x22,0xbf,0x9f, +0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x22,0xbf,0x30,0xd5,0x6, 0x9f,0x22,0x9f, +0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, 0x38, +0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e,0x39, +0x40,0x7a,0x19,0x40,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1e,0x1e,0x54,0x50,0xc, 0x7e, +0x1b,0x0, 0x7a,0x19,0x0, 0x68,0x12,0xb, 0x1c,0xb, 0x14,0xb, 0x1a,0x0, 0x1b,0x18, +0x0, 0xb, 0x1d,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x22,0x75,0x84,0x1, 0x7e,0x44,0x7f, +0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8,0x78,0xfc,0xc2,0x26,0xc2, +0x27,0xc2,0x28,0xc2,0x1f,0xc2,0x20,0x75,0x12,0x0, 0xc2,0x2b,0xc2,0x2c,0xc2,0x2d, +0xc2,0x22,0xc2,0x23,0xc2,0x24,0x75,0x6c,0x0, 0xc2,0x2e,0xc2,0x16,0xc2,0x17,0xc2, +0x18,0xd2,0x19,0xd2,0x1a,0xc2,0xc, 0xc2,0xd, 0xc2,0xe, 0xc2,0xf, 0xc2,0x10,0xc2, +0x11,0xc2,0x12,0xc2,0x13,0xc2,0x14,0xc2,0x15,0xc2,0x2f,0xc2,0x30,0xd2,0x29,0xc2, +0x2a,0x75,0x1e,0x0, 0x75,0x1f,0x1, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x24,0x6a,0xb, +0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, +0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf, +0x2, 0x2f,0xf9,0xca,0xf8,0x7f,0x20,0x80,0xa, 0x7e,0x1b,0xf0,0x7a,0x2b,0xf0,0xb, +0x34,0xb, 0x54,0x69,0xff,0xff,0xfc,0x7d,0xef,0x1b,0xe4,0x79,0xef,0xff,0xfc,0x4d, +0xff,0x78,0xe6,0x7f,0x10,0xda,0xf8,0x22,0x7d,0x43,0x7f,0x10,0x80,0x7, 0x1b,0x44, +0x7a,0xb, 0xb0,0xb, 0x14,0x4d,0x44,0x78,0xf5,0x22,0xff,0x0, 0x1, 0x2, 0x0, 0xff, +0x1, 0x2, 0x0, 0x1, 0xff,0x2, 0x0, 0x1, 0x2, 0xff,0x7d,0x23,0xbe,0x24,0x0, 0x0, +0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22,0x0, 0x1, 0x4a,0x60,0x1, 0x0, +0x1, 0x4a,0x66,0x1, 0x0, 0x1, 0x4a,0x68,0x5, 0x0, 0x3, 0x4e,0x97,0x0, 0x0, 0x0, +0x0, 0x6, 0x4e,0x9a,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x4e,0xa0,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x29,0xfe,0x1, 0x0, 0x1, 0x78,0xbe,0x0, 0x0, 0x1, +0x78,0xbf,0x0, 0x0, 0x2, 0x77,0x8f,0x0, 0x0, 0x0, 0x1, 0x76,0xbc,0xff,0x0, 0xa, +0x0, 0x8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x28,0xe6, +0x0, 0x0, 0x8, 0x29,0x83,0x5, 0x0, 0x0, 0x2, 0x0, 0x2, 0x0, 0x2, 0x0, 0xc, 0x29, +0xb3,0x1, 0x3, 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x29, +0xff,0x0, 0x0, 0x1, 0x78,0x25,0x0, 0x0, 0x1, 0x78,0x26,0x0, 0x0, 0x1, 0x78,0x28, +0x0, 0x0, 0x2, 0x3, 0xfe,0x0, 0x0, 0x0, 0x1, 0x3, 0xc9,0x0, 0x0, 0x1, 0x78,0xc9, +0x0, 0x0, 0x1, 0x5c,0xc3,0xff,0x0, 0x1, 0x5c,0xdc,0x0, 0x0, 0x3c,0x5c,0xdd,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x78,0x5d,0x19,0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x5d,0x91,0x0, 0x0, 0x2, 0x5d,0x92, +0x0, 0x0, 0x0, 0x4, 0x5d,0x94,0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x62,0xde,0x0, 0x0, +0x2, 0x63,0x2f,0x0, 0x0, 0x0, 0x1, 0x78,0xd4,0x1, 0x0, 0x1, 0x78,0xd5,0x0, 0x0, +0x1e,0x0, 0x4e,0x2, 0x4, 0x6, 0x8, 0xa, 0xc, 0xe, 0x10,0x12,0x14,0x16,0x18,0x1a, +0x1c,0x1e,0x20,0x22,0x24,0x26,0x28,0x2a,0x2c,0x2e,0x30,0x32,0x34,0x36,0x38,0x3a, +0x3c,0x0, 0x1, 0x78,0x69,0x0, 0x0, 0x1, 0x78,0x85,0x1e,0x0, 0x1, 0x78,0xdd,0x0, +0x0, 0x2, 0x76,0xba,0x0, 0x0, 0x0, 0x6, 0x78,0xde,0x30,0x1f,0x50,0x11,0x20,0x10, +0x0, 0x1, 0x78,0xe4,0x34,0x0, 0x1, 0x76,0x3f,0x64,0x0, 0x1, 0x78,0xfb,0x0, 0x0, +0x1, 0x78,0x8d,0x0, 0x0, 0x1, 0x78,0x92,0x5, 0x0, 0x1, 0x78,0x96,0x4, 0x0, 0x1, +0x78,0x97,0x1, 0x0, 0x1, 0x78,0x9b,0x0, 0x0, 0x1, 0x78,0xe9,0x1, 0x0, 0x1, 0x78, +0xfc,0x1, 0x0, 0x1, 0x78,0xb1,0x0, 0x0, 0x2, 0x25,0xb3,0x25,0xb9,0x0, 0x1, 0x27, +0x49,0x2, 0x0, 0x1, 0x27,0x72,0x0, 0x0, 0x1, 0x77,0xe0,0xff,0x0, 0x1, 0x77,0xe1, +0x0, 0x0, 0x1, 0x77,0xe2,0x0, 0x0, 0x1, 0x77,0xe3,0x40,0x0, 0x1, 0x77,0xe4,0x40, +0x0, 0x4, 0x78,0xee,0x0, 0x0, 0x90,0x0, 0x0, 0x4, 0x3, 0xf2,0x0, 0x0, 0x94,0x0, +0x0, 0x4, 0x3, 0xf6,0x0, 0x0, 0x98,0x0, 0x0, 0x4, 0x3, 0xfa,0x0, 0x0, 0x9c,0x0, +0x0, 0x4, 0x1, 0x79,0x0, 0x0, 0x80,0x0, 0x0, 0x4, 0x78,0xf2,0x0, 0x0, 0x91,0x0, +0x0, 0x4, 0x78,0xf6,0x0, 0x0, 0x92,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xe8,0x0, 0x51,0x0, 0x3, 0x3, 0x20,0x0, 0x50, +0x0, 0x3, 0x2, 0x58,0x0, 0x4e,0x0, 0x4, 0x1, 0xc2,0x0, 0x4b,0x0, 0x4, 0x1, 0x40, +0x0, 0x47,0x0, 0x4, 0x0, 0xc8,0x0, 0x44,0x0, 0x4, 0x0, 0x78,0x0, 0x3e,0x0, 0x5, +0x0, 0x64,0x0, 0x3c,0x0, 0x5, 0x12,0x6f,0xa2,0x7a,0xb3,0x78,0xb0,0xe4,0x7a,0xb3, +0x77,0x31,0x2, 0x29,0x4a,0xd2,0x1, 0x12,0x29,0x5a,0x74,0x1f,0x7a,0xb3,0x73,0xd4, +0x7a,0xb3,0x73,0xd5,0x22,0x12,0x3d,0xdb,0xd2,0x1, 0xe4,0x7a,0xb3,0x75,0x34,0x7a, +0xb3,0x75,0x35,0x6c,0xaa,0x12,0xc7,0x3, 0xbe,0xa0,0x3, 0x78,0xf8,0xe4,0x7a,0xb3, +0x75,0xa9,0x7a,0xb3,0x75,0x36,0x30,0x1, 0x3, 0x12,0x29,0x4a,0x22,0xca,0x3b,0xc2, +0x4, 0x12,0x3c,0x2, 0xc2,0xd, 0x30,0xc, 0x18,0xc2,0xc, 0x30,0xe, 0x4, 0xc2,0xe, +0x80,0x3, 0x12,0xd9,0xba,0x12,0x49,0x61,0x12,0x3d,0xf1,0x12,0x54,0x92,0x12,0x29, +0x45,0xd2,0x4, 0x12,0x3c,0x2, 0xc2,0x1, 0x12,0xd8,0xd7,0x30,0xf, 0x3c,0xc2,0xf, +0x12,0xe6,0xe5,0x7d,0x23,0x5e,0x24,0x0, 0x1, 0x68,0x2f,0x5e,0x34,0x0, 0x2, 0x68, +0x5, 0x12,0x4f,0xe2,0x80,0x11,0x75,0x1e,0x1, 0x74,0x1, 0x7a,0xb3,0x78,0x97,0x7f, +0x3, 0x12,0x37,0xe2,0x12,0x37,0xf5,0x12,0x3d,0xf1,0xc2,0x1, 0x12,0x29,0x5a,0xe5, +0x1e,0x12,0x3c,0x29,0x74,0x1f,0x7a,0xb3,0x73,0xd5,0xd2,0x1, 0x12,0xd8,0xd7,0xda, +0x3b,0x22,0x74,0x5, 0x7a,0xb3,0x78,0xe8,0x12,0x29,0x7d,0x7e,0xb3,0x73,0xd4,0x60, +0xd, 0x80,0x6, 0x12,0x2d,0x3d,0x12,0x29,0x7d,0x12,0x52,0x8c,0x50,0xf5,0x7e,0xb3, +0x73,0xd5,0x60,0xd, 0x80,0x6, 0x12,0x2d,0x3d,0x12,0x29,0x7d,0x12,0x52,0xf5,0x50, +0xf5,0x2, 0x2a,0x24,0x7e,0x63,0x78,0x97,0x7e,0x73,0x75,0x33,0x74,0x26,0xa5,0xbe, +0x3, 0x8, 0xac,0xb7,0x49,0x15,0x75,0x4b,0x80,0x6, 0xac,0xb7,0x49,0x15,0x75,0x47, +0x7d,0x21,0x7a,0x27,0x4a,0x6f,0x30,0x16,0x10,0x7e,0x24,0x0, 0x27,0xca,0x29,0x12, +0xe6,0x5, 0x12,0x24,0x13,0x1b,0xfd,0xc2,0x16,0x22,0x7e,0xa3,0x77,0x35,0xbe,0xa0, +0x5, 0x78,0x8, 0x74,0x1, 0x7a,0xb3,0x77,0x35,0x80,0x1b,0xbe,0xa0,0x4, 0x78,0x1c, +0x74,0x1, 0x7a,0xb3,0x77,0x35,0x7e,0x34,0x21,0x57,0x12,0x2a,0xa9,0x12,0x2d,0x41, +0x12,0x29,0x45,0x12,0x29,0xf2,0x74,0x2, 0x7a,0xb3,0x77,0x35,0x22,0x7a,0x37,0x6f, +0x42,0xe4,0x7a,0xb3,0x78,0xfa,0x7e,0x34,0x21,0x67,0x7e,0x24,0x0, 0xff,0xb, 0x1a, +0x30,0x7a,0x37,0x6f,0x4c,0x7e,0x34,0x21,0x69,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30, +0x22,0x90,0x21,0x51,0xe4,0x93,0x7a,0xb3,0x6f,0x3e,0x12,0x4e,0xb7,0x7e,0x34,0x21, +0x5b,0x12,0x2a,0xa9,0x7a,0x37,0x6f,0x40,0x7e,0x34,0x21,0x5d,0x12,0x2a,0xa9,0x7a, +0x37,0x6f,0x42,0x7e,0x34,0x21,0x5f,0x12,0x2a,0xa9,0x12,0x2c,0x17,0x7a,0x37,0x6f, +0x44,0x7e,0x34,0x21,0x61,0x12,0x2a,0xa9,0x12,0xe6,0xc1,0x12,0x2a,0xa9,0x7a,0x37, +0x6f,0x48,0x7e,0x34,0x21,0x65,0x12,0x2a,0xa9,0x12,0x2c,0x17,0x7a,0x37,0x6f,0x4a, +0x12,0x2a,0x96,0x12,0x2c,0x17,0x7a,0x37,0x6f,0x4e,0x90,0x21,0x9b,0xe4,0x93,0x7a, +0xb3,0x6f,0x52,0x90,0x21,0x54,0xe4,0x93,0x7a,0xb3,0x6f,0x53,0x7e,0x34,0x21,0x55, +0x12,0x2a,0xa9,0x7a,0x37,0x6f,0x54,0x7e,0x34,0x21,0x6b,0x12,0x2a,0xa9,0x7a,0x37, +0x6f,0x50,0xe4,0x7a,0xb3,0x6f,0x56,0x7a,0xb3,0x6f,0x57,0x7a,0xb3,0x6f,0x58,0x7a, +0xb3,0x6f,0x59,0x7a,0xb3,0x6f,0x5a,0x7a,0xb3,0x6f,0x5b,0x7a,0xb3,0x6f,0x5c,0x7a, +0xb3,0x6f,0x5d,0x7a,0xb3,0x6f,0x5e,0x7a,0xb3,0x6f,0x5f,0x22,0x7e,0x34,0x21,0x5b, +0x12,0x2a,0xa9,0x12,0x4c,0x5b,0x7a,0x73,0x76,0xbf,0x7e,0x34,0x21,0x5d,0x12,0x2a, +0xa9,0x12,0x2c,0x45,0x7a,0x73,0x76,0xc0,0x7e,0x34,0x21,0x63,0x12,0x2a,0xa9,0x12, +0x2c,0x45,0x7a,0x73,0x76,0xc1,0x7e,0x34,0x21,0x63,0x12,0x2a,0xa9,0x12,0x2c,0x45, +0x7a,0x73,0x76,0xc2,0x7e,0x34,0x21,0x6b,0x12,0x2a,0xa9,0x12,0x4c,0x5b,0x7a,0x73, +0x76,0xc4,0x7e,0x34,0x0, 0x6a,0xca,0x39,0x7e,0x34,0x21,0x6f,0x7e,0x24,0x0, 0xff, +0x7e,0x8, 0x76,0xc5,0x12,0x24,0x13,0x1b,0xfd,0x22,0x7e,0xb3,0x77,0xf, 0xb4,0x1, +0x5, 0x12,0x2c,0x1e,0x80,0xf, 0x7e,0xb3,0x6f,0x58,0xb4,0x1, 0x5, 0x12,0x4e,0x9a, +0x80,0x3, 0x12,0x6d,0xff,0x7e,0xb3,0x78,0xfa,0x70,0x17,0x7e,0xb3,0x6f,0x31,0x70, +0x11,0x7e,0xb3,0x6f,0x58,0x70,0xb, 0x7e,0x34,0x21,0x6d,0x12,0x2a,0xa9,0x7a,0x37, +0x6f,0x40,0x12,0xe7,0x20,0x68,0x11,0x7e,0x34,0x21,0x61,0x12,0x2a,0xa9,0x12,0xe6, +0xc1,0x12,0x2a,0xa9,0x7a,0x37,0x6f,0x48,0x7e,0x34,0x21,0x5f,0x12,0x2a,0xa9,0x12, +0x2c,0x17,0x7a,0x37,0x6f,0x44,0x22,0x6e,0x34,0xff,0xff,0xb, 0x34,0x22,0x7e,0x34, +0x21,0x5b,0x12,0x2a,0xa9,0x12,0x4e,0xb3,0x7e,0x34,0x21,0x5d,0x12,0x2a,0xa9,0x12, +0x2a,0x8d,0x12,0x4c,0x4d,0x12,0x2c,0x3d,0x7a,0x73,0x76,0xc0,0x22,0x7a,0x73,0x76, +0xbf,0x7e,0x37,0x6f,0x42,0xe, 0x34,0xe, 0x34,0xe, 0x34,0xe, 0x34,0xe, 0x34,0x22, +0x30,0x2b,0xf, 0x7e,0xb3,0x77,0x2d,0xb4,0x1, 0x8, 0x74,0x1, 0x7a,0xb3,0x73,0xd3, +0x80,0x3, 0x12,0x48,0x8c,0xc2,0x2b,0x7e,0xb3,0x78,0xb0,0xb4,0x1, 0x2, 0x80,0x2, +0xa1,0x4, 0x12,0x70,0xdc,0x12,0x51,0xc7,0x12,0x44,0x47,0x12,0x29,0xf2,0x7e,0x34, +0x21,0x59,0x12,0x2a,0xa9,0x12,0x2d,0x41,0x12,0x5b,0x38,0x7e,0xb3,0x25,0xae,0x70, +0x2, 0x80,0x58,0x12,0xc8,0xdc,0x7e,0xb3,0x76,0xe3,0xb4,0x1, 0x2, 0xd2,0x86,0x7e, +0xb3,0x6f,0x57,0x70,0x6, 0x12,0x2b,0xba,0x12,0xe1,0xd9,0x12,0x5d,0x5c,0x7e,0xb3, +0x25,0xae,0x70,0x2, 0x80,0x35,0x74,0x1, 0x12,0x2d,0x19,0x12,0x2d,0xe7,0x12,0xa9, +0x6d,0x12,0xa7,0xc3,0x74,0x2, 0x12,0x2d,0x19,0x12,0xaf,0xd8,0x74,0x3, 0x12,0x2d, +0x19,0x12,0x7a,0x15,0x74,0x4, 0x12,0x2d,0x19,0x12,0x6f,0xf2,0x12,0xca,0x76,0x12, +0x7f,0xc, 0x12,0x79,0x6c,0x7e,0xb3,0x25,0xae,0x70,0xb, 0x12,0xc8,0x59,0x12,0x68, +0xb2,0x12,0xdd,0xf1,0x81,0x67,0x12,0x88,0x65,0x12,0x70,0xb6,0x12,0x77,0x18,0x12, +0x68,0xbb,0x81,0x67,0xd2,0x4, 0x12,0x3c,0x96,0x2, 0x2d,0xc, 0x12,0x4f,0xf0,0x7e, +0xb3,0x76,0xe3,0xb4,0x1, 0x2, 0xd2,0x86,0x22,0x1b,0xb1,0x68,0x10,0x14,0x68,0x13, +0x14,0x68,0x16,0x24,0x3, 0x78,0x15,0xe4,0x7a,0xb3,0x6f,0x3b,0x22,0x12,0x0, 0xa, +0x2, 0xc0,0x15,0x12,0xb6,0x58,0x2, 0x90,0xd4,0x2, 0xc0,0xde,0x22,0x7e,0x34,0x9, +0xc4,0x6d,0x22,0x7a,0x27,0x78,0x9f,0x7a,0x37,0x78,0xa1,0x22,0x12,0x48,0x4e,0x7e, +0xb3,0x78,0xb0,0xb4,0x3, 0x7b,0x12,0x3d,0x44,0x12,0x29,0xf2,0x12,0x2d,0x3d,0x7e, +0xb3,0x77,0x31,0x30,0xe7,0x66,0x7e,0xb3,0x77,0x42,0x70,0x5, 0xc2,0x4, 0x12,0x3c, +0x96,0x12,0x29,0x7d,0x30,0x11,0x8, 0xc2,0x11,0x12,0x29,0x55,0x12,0x3b,0xdc,0x7e, +0xb3,0x77,0x42,0x70,0x5, 0x12,0x99,0x6, 0x80,0x6, 0x12,0x5b,0x38,0x12,0x99,0x1d, +0x7e,0xb3,0x25,0xae,0x70,0x5, 0x12,0x68,0xb2,0x80,0xb4,0x7e,0xb3,0x73,0xd3,0xb4, +0x1, 0x17,0x12,0xc8,0xdc,0x74,0x2, 0x12,0x4e,0xc1,0x12,0xe1,0xd9,0x12,0x46,0xeb, +0x12,0xd3,0x89,0x12,0x5d,0x5c,0x12,0x2d,0xe7,0x12,0x69,0x3a,0x7e,0xb3,0x77,0x42, +0x70,0xa, 0x7e,0xb3,0x77,0x31,0x54,0x7f,0x7a,0xb3,0x77,0x31,0x12,0x68,0x98,0xa1, +0x4f,0xd2,0x2b,0xd2,0x4, 0x12,0x3c,0x96,0x2, 0x2d,0xdb,0xe4,0x7a,0xb3,0x78,0xe5, +0x6d,0x33,0x7a,0x37,0x78,0xe6,0x22,0xc2,0x2d,0x7e,0xb3,0x6f,0x56,0x70,0x3, 0x12, +0xd1,0xb5,0x12,0x6e,0x17,0x12,0x6f,0x32,0x12,0x6e,0x17,0x12,0x6e,0x8d,0x12,0x6e, +0x17,0x12,0xac,0x5f,0x12,0x6e,0x17,0x12,0x99,0x56,0x12,0x6e,0x17,0x2, 0x2e,0x10, +0xca,0x3b,0xc2,0x0, 0x7e,0xd3,0x6d,0x93,0xa, 0x3d,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x6c,0x9, 0x7e,0x8, 0x63,0x6d,0x12,0x24,0x13,0x1b,0xfd,0x6c,0x11,0x75,0x27,0x0, +0x6c,0xcc,0xc1,0xea,0x7e,0x44,0x3, 0xff,0x7e,0xe0,0xff,0x6c,0xff,0x80,0x5a,0x7c, +0xbf,0x12,0x6e,0x5, 0x60,0x51,0x12,0xe6,0xdc,0xbe,0x0, 0xff,0x68,0x49,0x9, 0x5, +0x63,0x6e,0xa, 0x10,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0x3, 0x78,0x2d,0xa, 0x30,0x12, +0xa3,0x30,0x8, 0x4, 0x9d,0x31,0x80,0x4, 0x6d,0x33,0x9d,0x32,0x12,0xe6,0xdc,0xa, +0xf0,0x74,0x2, 0xac,0xbc,0x9, 0x5, 0x78,0x2c,0xa, 0x10,0x7d,0x21,0x9d,0x2f,0xbe, +0x24,0x0, 0x0, 0x8, 0x4, 0x9d,0x1f,0x80,0x4, 0x6d,0x11,0x9d,0x12,0x2d,0x13,0xbd, +0x41,0x28,0x4, 0x7d,0x41,0x7c,0xef,0xb, 0xf0,0xbc,0xdf,0x38,0xa2,0xbe,0xe0,0xff, +0x68,0x46,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x63,0x6d,0x9, 0x73,0x63,0x6e,0x12, +0x9b,0x6a,0x7d,0x13,0x74,0x2, 0xac,0xbe,0x9, 0xb5,0x63,0x6d,0x12,0xa7,0xe9,0xbd, +0x13,0x48,0x25,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0x3, 0x63,0x6d,0x7e,0xa1,0x27,0x74, +0x2, 0xa4,0x19,0x5, 0x63,0xa9,0x9, 0x3, 0x63,0x6e,0x19,0x5, 0x63,0xaa,0x74,0xff, +0x19,0xb3,0x63,0x6d,0xb, 0x10,0x5, 0x27,0xb, 0xc0,0x7e,0x3, 0x78,0x68,0xbc,0xc, +0x28,0x2, 0xc1,0x34,0x7c,0xc1,0x80,0x76,0x6d,0x0, 0x7e,0xe0,0xff,0x6c,0xff,0x80, +0x40,0x7c,0xbf,0x12,0x6e,0x5, 0x60,0x37,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xb1,0x63, +0x6d,0xbe,0xb0,0xff,0x68,0x29,0x9, 0x71,0x63,0x6e,0x12,0x9b,0x6a,0x7d,0x43,0xc2, +0x0, 0xbd,0x4, 0x58,0x2, 0xd2,0x0, 0x30,0x0, 0x15,0x7e,0x70,0x2, 0xac,0x7f,0x9, +0xb3,0x63,0x6d,0xf5,0x28,0x9, 0xb3,0x63,0x6e,0xf5,0x29,0x7d,0x4, 0x7c,0xef,0xb, +0xf0,0xbc,0xdf,0x38,0xbc,0xbe,0xe0,0xff,0x68,0x22,0x7e,0xa1,0x28,0x7e,0x31,0x27, +0x74,0x2, 0xac,0x3b,0x19,0xa1,0x63,0xa9,0xe5,0x29,0x19,0xb1,0x63,0xaa,0x7e,0xa0, +0xff,0x7e,0x30,0x2, 0xac,0x3e,0x19,0xa1,0x63,0x6d,0x5, 0x27,0xb, 0xc0,0x90,0x21, +0x51,0xe4,0x93,0xbc,0xbc,0x38,0x81,0x90,0x21,0x52,0xe4,0x93,0x7c,0xab,0x74,0x2, +0xa4,0xca,0x59,0x7e,0x18,0x63,0xa9,0x7e,0x8, 0x63,0x6d,0x12,0x24,0x13,0x1b,0xfd, +0x7e,0xd1,0x27,0x12,0x73,0x78,0x74,0x2, 0xac,0x7b,0x7e,0x8, 0x78,0x2c,0x74,0xff, +0x12,0x24,0x38,0xbe,0xd0,0x0, 0x28,0x37,0xa, 0x3d,0x3e,0x34,0xca,0x39,0x7e,0x18, +0x63,0x6d,0x7e,0x8, 0x6c,0x9, 0x12,0x24,0x13,0x1b,0xfd,0xa, 0x3d,0x3e,0x34,0xca, +0x39,0x7e,0x18,0x63,0x6d,0x7e,0x8, 0x78,0x2c,0x12,0x24,0x13,0x1b,0xfd,0x6c,0xcc, +0x80,0x9, 0xd2,0x2, 0x7c,0xbc,0x12,0x6e,0x5b,0xb, 0xc0,0xbc,0xdc,0x38,0xf3,0x7a, +0xd3,0x78,0x68,0x7a,0xd3,0x6d,0x93,0x90,0x21,0x51,0xe4,0x93,0xbe,0xb3,0x6d,0x93, +0x50,0x4, 0x7a,0xb3,0x6d,0x93,0xda,0x3b,0x22,0x12,0x71,0x41,0x12,0x2b,0x5c,0x12, +0x72,0xcc,0x12,0x30,0x1e,0x12,0x29,0x36,0x7e,0xb3,0x76,0xe6,0x24,0xfd,0x68,0x9, +0xb, 0xb1,0x78,0xf4,0x12,0x2c,0x50,0x80,0xef,0x12,0x2d,0x4c,0x80,0xea,0x12,0x3e, +0xc0,0x12,0xd9,0xba,0x12,0x0, 0x26,0x2, 0x30,0x2a,0xca,0xf8,0x12,0xda,0xb6,0x7e, +0xf0,0x1, 0x7c,0xbf,0x12,0x30,0x49,0xb, 0xf0,0xbe,0xf0,0x4, 0x78,0xf4,0xe5,0x1e, +0x70,0x4, 0xe4,0x12,0x30,0x49,0xda,0xf8,0x22,0xca,0x79,0x7c,0xeb,0xbe,0xe0,0x4, +0x40,0x2, 0x21,0x1f,0x12,0x67,0xf1,0xbe,0xf0,0x3, 0x40,0x2, 0x21,0x1f,0x74,0x2, +0xac,0xbe,0x9, 0xb5,0x29,0x84,0x54,0x3f,0xa, 0x3b,0x74,0x2c,0xac,0xbf,0x59,0x35, +0x0, 0xf5,0x74,0x2, 0xac,0xbe,0x9, 0xb5,0x29,0x83,0x54,0x1f,0x7c,0x6b,0x6c,0x77, +0x12,0x31,0x24,0x74,0x2c,0xac,0xbf,0x59,0x35,0x0, 0xf7,0x12,0x33,0xdf,0x74,0x1, +0x7e,0x70,0x27,0xac,0x7e,0x12,0x37,0xdb,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x31,0x50, +0x7e,0x70,0x27,0xac,0x7e,0x12,0x37,0xfc,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x38,0x79, +0x74,0x27,0xac,0xbe,0x9, 0x75,0x28,0xe7,0x12,0x31,0x22,0x12,0xd, 0xd3,0x7e,0x30, +0x2c,0xac,0x3f,0x12,0x35,0xad,0x74,0x27,0xac,0xbe,0x9, 0x75,0x28,0xe8,0x12,0x31, +0x22,0x12,0xd, 0xe5,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x35,0xad,0x74,0xa, 0xac,0xbe, +0x12,0x33,0xfa,0x7e,0x30,0x2c,0xac,0x3f,0x12,0x31,0x50,0x74,0xa, 0xac,0xbe,0x12, +0x37,0xea,0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14,0x1, 0x9, 0x6d,0x0, 0x74,0x27,0xac, +0xbe,0x9, 0xb5,0x28,0xea,0x12,0xc, 0xaa,0xe4,0x12,0x67,0x91,0x7e,0x70,0xb5,0xac, +0x7f,0x2e,0x34,0x1, 0x0, 0x12,0x33,0xdf,0x7e,0x24,0x0, 0x16,0x12,0xc, 0xcc,0xda, +0x79,0x22,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x22,0x7e,0x30,0x2c,0xac,0x3e, +0x2e,0x14,0x1, 0x1, 0x6d,0x0, 0x74,0xa, 0xac,0xbf,0x49,0x35,0x29,0x93,0x49,0x25, +0x29,0x91,0x12,0x9, 0xad,0x7d,0x36,0x2e,0x34,0x0, 0x6, 0x7e,0x30,0x2c,0xac,0x3e, +0x2e,0x14,0x1, 0x1, 0x6d,0x0, 0x22,0x7e,0xb3,0x77,0x63,0x12,0x34,0x9, 0x7e,0x37, +0x4a,0x6d,0x4e,0x60,0x1, 0x7a,0x37,0x4a,0x6d,0x4e,0x70,0x20,0x7a,0x37,0x4a,0x6d, +0xca,0x3b,0x7e,0xf3,0x78,0x97,0x7e,0x30,0x27,0xac,0x3f,0x9, 0xb1,0x28,0xe7,0xf5, +0x27,0x9, 0xb1,0x28,0xe8,0xf5,0x28,0x7e,0x4, 0x0, 0x27,0xca,0x9, 0x2e,0x14,0x28, +0xe7,0x6d,0x0, 0x7e,0x18,0x77,0x62,0x12,0x24,0x13,0x1b,0xfd,0x74,0x27,0xac,0xbf, +0x9, 0xe5,0x28,0xeb,0x7e,0xd0,0xb5,0xac,0xde,0x2e,0x64,0x1, 0x0, 0xe4,0x12,0x67, +0x91,0x12,0x33,0x92,0x5e,0x24,0x1, 0x0, 0x68,0xc, 0x5e,0x60,0xfe,0x7a,0x37,0x4a, +0x6d,0x7c,0xbf,0x12,0x38,0x1f,0x12,0x33,0x92,0x5e,0x24,0x0, 0x1, 0x68,0x2e,0x5e, +0x70,0xfe,0x7a,0x37,0x4a,0x6d,0x7e,0xb3,0x77,0x62,0x12,0x38,0x7, 0x50,0xc, 0x7e, +0xb3,0x77,0x62,0x12,0x38,0x80,0x12,0x35,0xc3,0x80,0x12,0x7e,0xa1,0x27,0x7e,0x70, +0x27,0xac,0x7f,0x19,0xa3,0x28,0xe7,0xe5,0x27,0x7a,0xb3,0x77,0x62,0x12,0x33,0x92, +0x5e,0x24,0x0, 0x2, 0x68,0x37,0x5e,0x70,0xfd,0x7a,0x37,0x4a,0x6d,0x7e,0xb3,0x77, +0x63,0x12,0xcf,0xd6,0x50,0x15,0x7e,0xb3,0x77,0x63,0x12,0x39,0x13,0x50,0xc, 0x7e, +0xb3,0x77,0x63,0x12,0x34,0x9, 0x12,0x35,0xc3,0x80,0x12,0x7e,0xa1,0x28,0x7e,0x70, +0x27,0xac,0x7f,0x19,0xa3,0x28,0xe8,0xe5,0x28,0x7a,0xb3,0x77,0x63,0x12,0x33,0x92, +0x5e,0x24,0x0, 0x4, 0x68,0x2a,0x5e,0x70,0xfb,0x12,0x33,0x99,0x7e,0x30,0x2c,0xac, +0x3e,0x12,0x33,0xe4,0x74,0x1, 0x7e,0x70,0x27,0xac,0x7f,0x12,0x37,0xdb,0x12,0x33, +0xeb,0x12,0x31,0x2b,0x12,0x36,0xa5,0x12,0x35,0xb4,0x12,0x37,0xd4,0x12,0x68,0x42, +0x12,0x33,0x92,0x5e,0x24,0x0, 0x8, 0x68,0xe, 0x5e,0x70,0xf7,0x7a,0x37,0x4a,0x6d, +0x7e,0xb3,0x77,0x65,0x12,0x38,0xcc,0x12,0x33,0x92,0x5e,0x24,0x0, 0x10,0x68,0xc, +0x5e,0x70,0xef,0x12,0x33,0xa0,0x12,0x31,0x2b,0x12,0x36,0xa5,0x12,0x33,0x92,0x5e, +0x24,0x0, 0x20,0x68,0x37,0x5e,0x70,0xdf,0x7a,0x37,0x4a,0x6d,0x4e,0x60,0x2, 0x12, +0x33,0x99,0x12,0x33,0xeb,0x12,0x31,0x4b,0x74,0xa, 0xac,0xbf,0x12,0x37,0xea,0x12, +0x31,0x4b,0x7e,0x70,0x27,0xac,0x7f,0x12,0x37,0xfc,0x7c,0xbf,0x12,0xdd,0xfd,0x12, +0x35,0xb4,0x12,0x31,0x45,0x7e,0x24,0x0, 0x10,0x12,0xc, 0xcc,0x12,0x33,0x92,0x5e, +0x24,0x0, 0x40,0x68,0x17,0x5e,0x70,0xbf,0x7a,0x37,0x4a,0x6d,0x12,0x3e,0xb3,0x78, +0x5, 0x12,0x37,0x6b,0x80,0x3, 0x12,0x37,0x60,0x12,0x4c,0x66,0x12,0x33,0x92,0x5e, +0x24,0x0, 0x80,0x68,0xa, 0x5e,0x70,0x7f,0x7a,0x37,0x4a,0x6d,0x12,0x37,0x9e,0x12, +0x33,0x92,0x5e,0x24,0x2, 0x0, 0x68,0x3b,0x5e,0x60,0xfd,0x7a,0x37,0x4a,0x6d,0x74, +0x27,0xac,0xbf,0x49,0xe5,0x28,0xee,0xb, 0xe4,0x7e,0xf7,0x77,0x8b,0xad,0xef,0xbe, +0x78,0x7f,0xff,0x28,0x4, 0x7e,0x78,0x7f,0xff,0x7e,0x8, 0x0, 0x83,0x12,0x36,0xac, +0x7e,0x8, 0x0, 0xbf,0x12,0x36,0xac,0x7e,0x8, 0x0, 0x83,0x7d,0x3f,0x12,0xde,0xb9, +0x12,0xc, 0xcc,0x12,0x33,0x92,0x5e,0x24,0x4, 0x0, 0x68,0xe, 0x5e,0x60,0xfb,0x7a, +0x37,0x4a,0x6d,0x7e,0xb3,0x77,0x3b,0x12,0xce,0xff,0x12,0x33,0x92,0x5e,0x24,0x10, +0x0, 0x68,0x7, 0x5e,0x60,0xef,0x7a,0x37,0x4a,0x6d,0x12,0x33,0x92,0x5e,0x24,0x20, +0x0, 0x68,0xc, 0x5e,0x60,0xdf,0x7a,0x37,0x4a,0x6d,0x7c,0xbf,0x12,0x4f,0xfa,0xda, +0x3b,0x22,0x7e,0x37,0x4a,0x6d,0x7d,0x23,0x22,0x7a,0x37,0x4a,0x6d,0x4e,0x60,0x10, +0x7a,0x37,0x4a,0x6d,0x7c,0xbf,0xca,0xf8,0x7c,0xfb,0x12,0x35,0xc3,0x7e,0xa3,0x77, +0x64,0x7e,0x70,0x27,0xac,0x7f,0x19,0xa3,0x28,0xe9,0x6c,0xaa,0x7e,0x50,0x2, 0xac, +0x5a,0x49,0x42,0x77,0x69,0x7e,0x70,0x27,0xac,0x7f,0x2d,0x32,0x59,0x43,0x28,0xee, +0xb, 0xa0,0xbe,0xa0,0x10,0x40,0xe5,0x7c,0xbf,0x12,0x66,0xf8,0xda,0xf8,0x22,0x7e, +0x30,0x2c,0xac,0x3f,0x2e,0x14,0x0, 0xf5,0x6d,0x0, 0x22,0x7e,0x30,0x2c,0xac,0x3e, +0x2e,0x14,0x0, 0xf9,0x6d,0x0, 0x74,0xa, 0xac,0xbf,0x9, 0xb5,0x29,0x8b,0x2, 0xd, +0x73,0x74,0x26,0xac,0xbf,0x9, 0xb5,0x75,0x37,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x74, +0x27,0xac,0xbe,0x19,0xf5,0x28,0xe8,0xb, 0xe0,0xbe,0xe0,0x4, 0x78,0xf1,0x7e,0x64, +0x1, 0x0, 0x6c,0xee,0x7e,0x30,0x2c,0xac,0x3e,0x12,0x35,0xad,0xa, 0x3f,0x12,0x31, +0x24,0x12,0xd, 0xe5,0x12,0x35,0xb4,0x12,0x38,0xc2,0x40,0xe8,0xda,0x3b,0x22,0xca, +0x3b,0x7e,0x73,0x6f,0x68,0x7a,0x73,0x63,0x6d,0x7e,0x73,0x6f,0x69,0x7a,0x73,0x63, +0x6e,0x7e,0xd3,0x77,0x63,0x7e,0xe3,0x77,0x5a,0x7e,0xf3,0x77,0x5b,0x7e,0x8, 0x63, +0x6f,0x7e,0x34,0x0, 0x8, 0xe4,0x12,0x24,0x38,0x7e,0x34,0x0, 0x20,0xca,0x39,0x7e, +0x18,0x77,0x69,0x7e,0x8, 0x63,0x77,0x12,0x24,0x13,0x1b,0xfd,0x74,0x5, 0x7a,0xb3, +0x77,0x63,0xe4,0x7a,0xb3,0x77,0x5a,0x74,0x2, 0x7a,0xb3,0x77,0x5b,0x6c,0xcc,0x7e, +0x34,0x0, 0x2, 0x74,0x2, 0xac,0xbc,0x59,0x35,0x77,0x69,0xb, 0xc0,0xbe,0xc0,0x10, +0x78,0xf1,0x12,0x31,0x57,0x6c,0xcc,0x4c,0xcc,0x78,0xd, 0x7e,0xb3,0x73,0xda,0x54, +0x1, 0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x12,0xbe,0xc0,0x1, 0x78,0x14,0x7e,0xb3,0x73, +0xda,0x54,0x2, 0x1e,0xb0,0xb4,0x1, 0x9, 0x74,0x4, 0x7a,0xb3,0x6f,0x68,0xe4,0x80, +0x34,0xbe,0xc0,0x2, 0x78,0x16,0x7e,0xb3,0x73,0xda,0x54,0x4, 0x1e,0xb0,0x1e,0xb0, +0xb4,0x1, 0x9, 0xe4,0x7a,0xb3,0x6f,0x68,0x74,0x1, 0x80,0x19,0xbe,0xc0,0x3, 0x78, +0x46,0x7e,0xb3,0x73,0xda,0x54,0x8, 0xc4,0x23,0x54,0x1f,0xb4,0x1, 0x39,0xe4,0x7a, +0xb3,0x6f,0x68,0x74,0x4, 0x7a,0xb3,0x6f,0x69,0x7e,0x34,0x21,0x57,0x12,0x2a,0xa9, +0x12,0x2d,0x41,0x74,0x1f,0x7a,0xb3,0x73,0xd4,0x12,0x29,0xf2,0x7e,0x73,0x78,0x97, +0xa, 0x7, 0x12,0x35,0xa6,0xa, 0x3c,0x2e,0x37,0x73,0xd6,0x2d,0x31,0x9, 0x73,0x4e, +0xa8,0xa, 0x2c,0x19,0x72,0x63,0x6f,0xb, 0xc0,0xbe,0xc0,0x4, 0x68,0x2, 0x81,0xa7, +0x6c,0xcc,0xa, 0x3c,0x9, 0x73,0x63,0x6f,0x12,0x77,0x99,0x12,0x35,0xa6,0xa, 0x2c, +0x2e,0x27,0x73,0xd6,0x2d,0x21,0x19,0x72,0x4e,0xa8,0xb, 0xc0,0xbe,0xc0,0x4, 0x40, +0xe1,0x7e,0x73,0x63,0x6d,0x7a,0x73,0x6f,0x68,0x7e,0x73,0x63,0x6e,0x7a,0x73,0x6f, +0x69,0x7a,0xd3,0x77,0x63,0x7a,0xe3,0x77,0x5a,0x7a,0xf3,0x77,0x5b,0x7e,0x34,0x0, +0x20,0xca,0x39,0x7e,0x18,0x63,0x77,0x7e,0x8, 0x77,0x69,0x12,0x24,0x13,0x1b,0xfd, +0x12,0x31,0x57,0xe4,0x7a,0xb3,0x77,0x60,0x7a,0xb3,0x77,0x5f,0xda,0x3b,0x22,0x7e, +0x35,0x29,0x7c,0x67,0xa, 0xf, 0x7e,0x14,0x2, 0x3c,0xad,0x10,0x22,0x2e,0x14,0x0, +0xf9,0x6d,0x0, 0x22,0x7d,0x36,0xb, 0x35,0x74,0x2c,0xac,0xbe,0x49,0x25,0x0, 0xf9, +0x2, 0x0, 0x2e,0x12,0xe7,0x18,0x68,0x3a,0xe5,0x1e,0x60,0x36,0x7e,0xb3,0x77,0x62, +0x7e,0x73,0x77,0x63,0x12,0xd8,0xfe,0x7d,0x23,0x7e,0x34,0x0, 0x3, 0xad,0x32,0x7e, +0x24,0x0, 0xa, 0x8d,0x32,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x77,0x69, +0xbd,0x13,0x28,0x7, 0x59,0x32,0x77,0x69,0x12,0xe6,0xae,0xb, 0xa0,0xbe,0xa0,0x10, +0x78,0xe5,0x22,0x12,0x36,0x9c,0x7d,0x1, 0x5e,0x4, 0x0, 0x1, 0x78,0xa, 0xe4,0x7a, +0xb3,0x78,0x97,0x75,0x1e,0x0, 0x80,0x2f,0x5e,0x14,0x0, 0x2, 0x78,0x5, 0x12,0x36, +0xb3,0x80,0x24,0x7e,0xb3,0x78,0x97,0xbe,0xb0,0x1, 0x68,0x2, 0x70,0x19,0x12,0x36, +0x93,0x68,0xb, 0x74,0x2, 0x7a,0xb3,0x78,0x97,0x75,0x1e,0x2, 0x80,0x9, 0x74,0x3, +0x7a,0xb3,0x78,0x97,0x75,0x1e,0x3, 0x74,0x1, 0x12,0x30,0x49,0x7e,0xb3,0x78,0x97, +0x24,0x0, 0x68,0x2d,0x24,0xfd,0x68,0x16,0x4, 0x78,0x2a,0x12,0x36,0x9c,0x5e,0x14, +0x0, 0x2, 0x68,0x2e,0x12,0x36,0x93,0x78,0x29,0x74,0x1, 0x2, 0x5, 0xbc,0x12,0x36, +0x9c,0x5e,0x14,0x0, 0x2, 0x68,0x1b,0x12,0x36,0x93,0x68,0x16,0x74,0x1, 0x2, 0x5, +0x30,0xe4,0x2, 0x30,0x49,0x7e,0xf, 0x78,0xf2,0x12,0x37,0xe2,0x12,0x37,0xf5,0x12, +0x36,0xb3,0x22,0x69,0x31,0x0, 0xe, 0x5e,0x34,0x0, 0x8, 0x22,0x7e,0x1f,0x78,0xf2, +0x69,0x11,0x0, 0x6, 0x22,0x7e,0x24,0x0, 0x4, 0x2, 0xc, 0xcc,0x7e,0x37,0x77,0x89, +0x2, 0xc, 0x88,0x74,0x1, 0x7a,0xb3,0x78,0x97,0x75,0x1e,0x1, 0x22,0x7c,0xbf,0x7e, +0x73,0x75,0x33,0xca,0x79,0x7c,0xf7,0x7c,0xeb,0xd2,0x18,0x12,0x34,0x1, 0xbe,0xe0, +0x3, 0x7c,0xbe,0x7e,0x70,0x26,0x78,0x7, 0xac,0x7f,0x12,0x37,0x6d,0x80,0x5, 0xac, +0x7f,0x12,0x37,0x62,0x12,0x4c,0x66,0xda,0x79,0x22,0xca,0x79,0x7c,0xfb,0xc2,0x2, +0x7c,0xbf,0x12,0xc6,0xa3,0xe5,0x1e,0x60,0x5d,0x6c,0xee,0x74,0x26,0xac,0xbe,0x9, +0xb5,0x75,0x44,0x60,0x38,0x12,0xe7,0x10,0x7c,0x7e,0x12,0x36,0xc3,0xd2,0x2, 0xbe, +0xf0,0x3, 0xa2,0x1, 0x92,0x3, 0x74,0x26,0x78,0xc, 0xac,0xbe,0x49,0x15,0x75,0x5b, +0x49,0x5, 0x75,0x59,0x80,0xa, 0xac,0xbe,0x49,0x15,0x75,0x53,0x49,0x5, 0x75,0x51, +0x49,0x35,0x75,0x57,0x49,0x25,0x75,0x55,0x7c,0xbf,0x12,0x65,0x99,0x20,0xc, 0x6, +0x20,0xd, 0x3, 0x30,0xf, 0x9, 0x30,0x2, 0x3, 0x12,0x36,0xbd,0xc3,0x80,0xe, 0xb, +0xe0,0xbe,0xe0,0x3, 0x40,0xa5,0x30,0x2, 0x3, 0x12,0x36,0xbd,0xd3,0xda,0x79,0x22, +0xac,0x67,0x49,0x13,0x75,0x47,0x49,0x3, 0x75,0x45,0x22,0xac,0x67,0x49,0x13,0x75, +0x4b,0x49,0x3, 0x75,0x49,0x22,0xca,0xf8,0x7c,0xfb,0xbe,0xf0,0x3, 0x50,0x1c,0xbe, +0x70,0x3, 0x50,0x17,0xd2,0x4, 0x12,0x3c,0x96,0x12,0x34,0x1, 0x7e,0xb3,0x78,0x97, +0x7c,0x7f,0x12,0x36,0xc3,0x7a,0xf3,0x75,0x33,0xd2,0x16,0xda,0xf8,0x22,0xca,0x3b, +0x7e,0x67,0x6f,0x6a,0x7e,0x77,0x6f,0x6c,0x74,0x1, 0x12,0x67,0x91,0x7e,0xb3,0x6f, +0x76,0x7e,0x34,0x1, 0x0, 0x7e,0x8, 0x6f,0x77,0x7d,0x26,0x60,0xb, 0x12,0x4, 0x96, +0x12,0xe5,0xea,0x12,0x3, 0xfa,0x80,0x9, 0x12,0x3, 0xfa,0x12,0xe5,0xea,0x12,0x4, +0x96,0xda,0x3b,0x22,0x7d,0x36,0x74,0x2c,0xac,0xbe,0x22,0x9, 0x73,0x28,0xe9,0x2, +0xd, 0x23,0x2e,0x14,0x0, 0xe, 0xb, 0xa, 0x30,0x22,0x49,0x35,0x29,0x93,0x49,0x25, +0x29,0x91,0x2, 0x9, 0xad,0x5e,0x70,0xfb,0x1b,0xa, 0x30,0x22,0x2e,0x34,0x28,0xee, +0x6d,0x22,0x74,0x10,0x2, 0xb, 0x8, 0x7c,0x7b,0x74,0x8, 0xac,0x7b,0xbe,0x34,0x0, +0x4e,0x38,0x2, 0xc3,0x22,0xbe,0x34,0x0, 0x1e,0x50,0x2, 0xc3,0x22,0xd3,0x22,0x7c, +0x7b,0x74,0x27,0xac,0xb7,0x9, 0x95,0x28,0xeb,0x7e,0x63,0x77,0x5a,0x74,0x2, 0xac, +0xb7,0x19,0x65,0x29,0x83,0x7e,0x63,0x77,0x5b,0x74,0x2, 0xac,0xb7,0x19,0x65,0x29, +0x84,0x74,0x2, 0xac,0x7b,0x2e,0x34,0x29,0x83,0x7e,0x14,0x0, 0x29,0x12,0x23,0x44, +0x7e,0x30,0x2c,0xac,0x39,0x7d,0x31,0x2e,0x34,0x0, 0xf5,0x12,0x38,0x79,0x12,0xb, +0x44,0x7e,0x70,0xb5,0xac,0x79,0x2e,0x34,0x1, 0x0, 0x7e,0x30,0x2c,0xac,0x39,0x12, +0x33,0xe4,0x7e,0x24,0x0, 0x2, 0x2, 0xc, 0xcc,0x2e,0x14,0x0, 0xf7,0x6d,0x0, 0x22, +0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x74,0x27,0xac,0xbe,0x19,0xf5,0x28,0xe7,0xb, 0xe0, +0xbe,0xe0,0x4, 0x78,0xf1,0x7e,0x64,0x1, 0x0, 0x6c,0xee,0x7e,0x30,0x2c,0xac,0x3e, +0x12,0x38,0x79,0xa, 0x3f,0x12,0x31,0x24,0x12,0xd, 0xd3,0x7d,0x36,0xb, 0x34,0x74, +0x2c,0xac,0xbe,0x49,0x25,0x0, 0xf7,0x12,0x0, 0x2e,0x12,0x38,0xc2,0x40,0xdc,0xda, +0x3b,0x22,0x2e,0x64,0x0, 0xb5,0xb, 0xe0,0xbe,0xe0,0x3, 0x22,0xca,0x3b,0x7c,0xfb, +0x6c,0xee,0x74,0x27,0xac,0xbe,0x19,0xf5,0x28,0xea,0xb, 0xe0,0xbe,0xe0,0x4, 0x78, +0xf1,0x7e,0x64,0x1, 0xa, 0x6c,0xee,0x7e,0x30,0x2c,0xac,0x3e,0x2e,0x14,0x1, 0x9, +0x6d,0x0, 0x7c,0xbf,0x12,0xc, 0xaa,0x12,0x37,0xd4,0x49,0x25,0x1, 0x9, 0x12,0x6, +0x48,0x12,0x37,0xd4,0x49,0x25,0x1, 0x9, 0x12,0x6, 0xc5,0x12,0x38,0xc2,0x40,0xd7, +0xda,0x3b,0x22,0x7c,0x7b,0x74,0x8, 0xac,0x7b,0xbe,0x34,0x0, 0x12,0x50,0x2, 0xc3, +0x22,0xd3,0x22,0x7c,0x2b,0xa5,0xba,0xfa,0x5, 0x7e,0xb3,0x4a,0x66,0x22,0xa5,0xba, +0xfc,0x3, 0x74,0x1, 0x22,0xbe,0x20,0x5b,0x38,0x7, 0xa, 0x32,0x9, 0xb3,0x77,0x31, +0x22,0xbe,0x20,0x6a,0x68,0x4, 0xa5,0xba,0x6b,0x1d,0x7e,0x37,0x4a,0x63,0x7d,0x23, +0xb, 0x24,0x7a,0x27,0x4a,0x63,0x2e,0x37,0x4e,0x7f,0x7e,0x39,0x30,0xa5,0xba,0x6b, +0x3, 0x75,0x1a,0x6a,0x7c,0xb3,0x22,0xbe,0x20,0x6e,0x68,0x4, 0xa5,0xba,0x6f,0x1d, +0x7e,0x37,0x4a,0x61,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x4a,0x61,0x2e,0x37,0x4a,0x6f, +0x7e,0x39,0x30,0xa5,0xba,0x6f,0x3, 0x75,0x1a,0x6e,0x7c,0xb3,0x22,0xbe,0x20,0x6c, +0x68,0x4, 0xa5,0xba,0x6d,0x1d,0x7e,0x37,0x4e,0x7d,0x7d,0x23,0xb, 0x24,0x7a,0x27, +0x4e,0x7d,0x2e,0x37,0x4a,0x6b,0x7e,0x39,0x30,0xa5,0xba,0x6d,0x3, 0x75,0x1a,0x6c, +0x7c,0xb3,0x22,0xbe,0x20,0x89,0x68,0x4, 0xa5,0xba,0x8a,0x1d,0x7e,0x37,0x4e,0x83, +0x7d,0x23,0xb, 0x24,0x7a,0x27,0x4e,0x83,0x2e,0x37,0x4e,0x81,0x7e,0x39,0x30,0xa5, +0xba,0x8a,0x3, 0x75,0x1a,0x89,0x7c,0xb3,0x22,0xbe,0x20,0x70,0x40,0xa, 0xbe,0x20, +0x7f,0x38,0x5, 0x7c,0xb2,0x2, 0x3a,0xa0,0xbe,0x20,0x81,0x68,0x4, 0xa5,0xba,0x82, +0x2a,0x7e,0xb3,0x77,0x48,0x7c,0xab,0xbe,0xa0,0x20,0x40,0xd, 0xbe,0xa0,0x40,0x50, +0x8, 0xa, 0x3a,0x9, 0x33,0x6b,0xc9,0x80,0x3, 0x12,0xe5,0xd8,0x4, 0x7a,0xb3,0x77, +0x48,0xa5,0xba,0x82,0x3, 0x75,0x1a,0x81,0x7c,0xb3,0x22,0xa5,0xba,0x86,0x5, 0x7e, +0xb3,0x4a,0x68,0x22,0xa5,0xba,0x87,0x5, 0x7e,0xb3,0x4a,0x60,0x22,0xa5,0xba,0x88, +0x19,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x10,0x5e,0x34,0x38,0x0, 0xa, 0x56,0x1e, +0x54,0x1e,0x54,0x1e,0x54,0x5e,0x54,0x0, 0x7, 0x22,0xbe,0x20,0x90,0x40,0xa, 0xbe, +0x20,0x94,0x38,0x5, 0x7c,0xb2,0x2, 0x6a,0x2f,0xbe,0x20,0x99,0x68,0x4, 0xa5,0xba, +0x9a,0x1b,0x7e,0x33,0x4a,0x65,0x7c,0xb3,0x4, 0x7a,0xb3,0x4a,0x65,0xa, 0x33,0x9, +0x33,0x4e,0x85,0xa5,0xba,0x9a,0x3, 0x75,0x1a,0x99,0x7c,0xb3,0x22,0xa5,0xba,0x9b, +0x5, 0x7e,0xb3,0x4a,0x67,0x22,0xa5,0xba,0xf6,0x5, 0x7e,0xb3,0x78,0xe5,0x22,0xa5, +0xba,0xf7,0xb, 0x7e,0x57,0x78,0xe6,0x7e,0x44,0x0, 0x64,0x8d,0x54,0x22,0xe4,0x22, +0x7c,0x6b,0x7e,0x70,0xff,0x7c,0xb6,0x24,0x8c,0xbe,0xb0,0xa, 0x40,0x2, 0x61,0x4c, +0x7e,0xa0,0x3, 0xa4,0x90,0x3a,0xb8,0x73,0x2, 0x3a,0xf6,0x2, 0x3b,0x4c,0x2, 0x3a, +0xd6,0x2, 0x3a,0xe4,0x2, 0x3a,0xed,0x2, 0x3a,0xff,0x2, 0x3b,0x1b,0x2, 0x3b,0xa, +0x2, 0x3b,0x20,0x2, 0x3b,0x20,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0xe, 0x5e,0x34, +0x0, 0x4, 0x80,0x68,0x7e,0x1f,0x78,0xf2,0x12,0x36,0x93,0x80,0x5f,0x12,0x3b,0x65, +0x5e,0x34,0x0, 0x2, 0x80,0x56,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x1, 0x80,0x4d,0x12, +0x3b,0x65,0x5e,0x34,0x4, 0x0, 0xa, 0x36,0x80,0xb, 0x12,0x3b,0x65,0x5e,0x34,0x8, +0x0, 0xa, 0x36,0x1e,0x34,0x1e,0x34,0x1e,0x34,0x80,0x31,0x7e,0x71,0xef,0x80,0x2c, +0x7e,0x73,0x78,0x8c,0x7c,0xb7,0x4, 0x7a,0xb3,0x78,0x8c,0xa, 0x27,0x9, 0x72,0x1, +0x7d,0x7e,0xb3,0x77,0x55,0x4, 0x7a,0xb3,0x77,0x55,0x70,0x9, 0x7e,0xb3,0x77,0x54, +0x4, 0x7a,0xb3,0x77,0x54,0xa5,0xbe,0x7d,0x3, 0x75,0x1a,0x7c,0x7c,0xb7,0x22,0x2e, +0x14,0x0, 0x14,0xb, 0xa, 0x30,0x4e,0x70,0x1, 0x1b,0xa, 0x30,0x75,0x1e,0x1, 0x74, +0x1, 0x7a,0xb3,0x78,0x97,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0x6, 0x22,0x30,0x1b, +0x2a,0xc2,0x1b,0xd2,0x1d,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x2, 0x74,0x1, 0x68,0x5, +0x12,0x5, 0x30,0x80,0x3, 0x12,0x36,0xb5,0x7e,0x34,0x0, 0x1, 0x7e,0xa1,0x1e,0x74, +0x8, 0xa4,0x59,0x35,0x77,0x91,0xe5,0x1e,0x2, 0x3c,0x29,0x30,0x1e,0x33,0xc2,0x1e, +0xc2,0x1d,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x2, 0x74,0x1, 0x68,0x5, 0x12,0x5, 0xbc, +0x80,0x3, 0x12,0x36,0xb5,0x7e,0xb3,0x78,0x8f,0xb4,0x1, 0xe, 0x7e,0x34,0x0, 0x2, +0x7e,0xa1,0x1e,0x74,0x8, 0xa4,0x59,0x35,0x77,0x91,0xe5,0x1e,0x12,0x3c,0x29,0x80, +0x7, 0x30,0x1d,0x4, 0xe5,0x1e,0x70,0x3, 0x2, 0x3b,0xdc,0x22,0xe4,0x7a,0xb3,0x77, +0xb4,0x12,0xe6,0x8e,0x12,0xe5,0x70,0x12,0x3f,0xbd,0x12,0x37,0xf5,0xc2,0x4, 0x12, +0x3c,0x2, 0x12,0x51,0x89,0xbe,0xb0,0x1, 0x68,0x3, 0x12,0x4f,0xf3,0xd2,0x4, 0x2, +0x3c,0x2, 0xa2,0xac,0x92,0x5, 0xc2,0xac,0x7e,0xf, 0x78,0xf2,0x30,0x4, 0xa, 0xb, +0x16,0xb, 0xa, 0x30,0x4e,0x70,0x3, 0x80,0x8, 0xb, 0x16,0xb, 0xa, 0x30,0x5e,0x70, +0xfc,0x1b,0xa, 0x30,0xa2,0x5, 0x92,0xac,0x22,0x7c,0xab,0x12,0x67,0x7d,0x1b,0xa0, +0x68,0x12,0x1b,0xa0,0x68,0x13,0x1b,0xa0,0x68,0x14,0x2e,0xa0,0x3, 0x78,0x12,0x12, +0x3f,0xc9,0x80,0xd, 0x12,0xdd,0xb4,0x80,0x8, 0x12,0x3f,0xe2,0x80,0x3, 0x12,0xdd, +0xc7,0x2, 0x3c,0x54,0xe4,0x7a,0xb3,0x77,0xbc,0x6c,0xaa,0x80,0xd, 0x12,0xdd,0x8d, +0x2e,0xb3,0x77,0xbc,0x7a,0xb3,0x77,0xbc,0xb, 0xa0,0x7e,0xb3,0x77,0xb1,0xbc,0xba, +0x38,0xeb,0x22,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x63,0x6d,0x7e,0x24,0x0, 0x12,0x12, +0x3, 0xfa,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x63,0x91,0x7e,0x24,0x0, 0x12,0x12,0x4, +0x96,0x12,0x3b,0xdc,0xd2,0x4, 0x80,0x6, 0x30,0xc, 0x3, 0x12,0x4b,0xe2,0x7e,0xb3, +0x77,0xb4,0xbe,0xb0,0x1, 0x68,0xf1,0x30,0x4, 0x3, 0x12,0xb, 0xe5,0xc2,0x5, 0x2, +0x3c,0xb2,0xca,0xf8,0x7e,0x70,0x78,0x7e,0xb3,0x78,0x97,0x60,0x5b,0x30,0x5, 0x58, +0x7e,0xa3,0x78,0xb0,0xbe,0xa0,0x3, 0x68,0x4f,0x7e,0xb3,0x75,0x36,0x70,0x49,0x7e, +0xb3,0x28,0xe6,0x4, 0x7a,0xb3,0x28,0xe6,0xbc,0xb7,0x50,0x3, 0x30,0x2c,0x27,0xbe, +0xa0,0x1, 0x78,0x22,0x20,0x23,0x1f,0xc2,0x2c,0xd2,0x2f,0xe4,0x7a,0xb3,0x28,0xe6, +0x6c,0x77,0x12,0x3f,0xa8,0x7e,0x8, 0x57,0x98,0x12,0x4c,0x66,0x7e,0x73,0x78,0x97, +0x7a,0x73,0x29,0xbf,0x80,0x2c,0x30,0x2f,0x29,0x12,0x3e,0x9e,0x78,0x5, 0x12,0x37, +0x6b,0x80,0x1a,0x12,0x37,0x60,0x80,0x15,0xe4,0x7a,0xb3,0x28,0xe6,0x30,0x2f,0x12, +0x12,0x3e,0x9e,0x78,0x5, 0x12,0x37,0x6b,0x80,0x3, 0x12,0x37,0x60,0x12,0x4c,0x66, +0xc2,0x2f,0xda,0xf8,0x22,0x70,0xc, 0x12,0x50,0xe9,0x12,0xc, 0xea,0x12,0x50,0x87, +0x2, 0x4, 0x96,0x22,0x30,0x26,0x76,0xc2,0x26,0x12,0x2a,0x5a,0xd2,0x4, 0x12,0x3c, +0x96,0x7e,0x73,0x77,0x61,0xbe,0x73,0x78,0x97,0x68,0x7, 0x7a,0x73,0x78,0x97,0x12, +0x29,0x55,0x7e,0xb3,0x77,0x4f,0xbe,0xb3,0x6f,0x68,0x68,0x14,0x54,0x5, 0x7a,0xb3, +0x77,0x4f,0x7e,0x73,0x77,0x4f,0x7a,0x73,0x6f,0x68,0x12,0x3f,0x3f,0x12,0xde,0x2c, +0x7e,0xb3,0x77,0x50,0xbe,0xb3,0x6f,0x69,0x68,0x14,0x54,0x5, 0x7a,0xb3,0x77,0x50, +0x7e,0x73,0x77,0x50,0x7a,0x73,0x6f,0x69,0x12,0x3f,0x3f,0x12,0xde,0x2c,0x7e,0xb3, +0x77,0x3f,0x54,0xfe,0x7a,0xb3,0x77,0x3f,0x7e,0xb3,0x77,0x40,0x60,0x3, 0x12,0x60, +0x6c,0x7e,0xb3,0x77,0x5f,0x60,0x3, 0x12,0x34,0x3f,0x12,0x3b,0xdc,0x7e,0x37,0x4a, +0x6d,0x4d,0x33,0x68,0x15,0xd2,0x4, 0x12,0x3c,0x96,0x12,0x31,0x70,0x7e,0xb3,0x77, +0x3f,0x54,0xfd,0x7a,0xb3,0x77,0x3f,0x2, 0x3b,0xdc,0x22,0x6d,0x33,0x7a,0x37,0x4a, +0x63,0xd2,0x4, 0x12,0x3c,0x96,0x12,0x36,0x3, 0xe5,0x1e,0x12,0x3c,0x29,0x2, 0x3d, +0xf1,0x12,0xe7,0x0, 0x12,0x77,0x99,0x12,0x35,0xa6,0x7d,0x21,0x2e,0x24,0x4e,0xa8, +0x7a,0x27,0x4a,0x6f,0x6d,0x22,0x7a,0x27,0x4a,0x61,0x7e,0x24,0x6f,0x77,0x7a,0x27, +0x4a,0x6b,0x7e,0x24,0x0, 0x27,0xca,0x29,0x12,0xe6,0x5, 0x12,0x24,0x13,0x1b,0xfd, +0x7e,0x34,0x0, 0x2, 0xca,0x39,0x7e,0x63,0x78,0x97,0xac,0x67,0x2e,0x34,0x29,0x83, +0x6d,0x22,0x7e,0x8, 0x77,0x5a,0x12,0x24,0x13,0x1b,0xfd,0x7e,0xa3,0x78,0x97,0x74, +0xa, 0xa4,0x49,0x35,0x29,0x8f,0x7a,0x37,0x77,0x67,0x7e,0xb3,0x78,0x97,0x12,0xde, +0x9e,0x7e,0xb3,0x78,0x97,0x12,0xdd,0xfd,0x7e,0xb3,0x78,0x97,0x12,0x50,0x66,0x12, +0x3e,0x96,0x9, 0x75,0x29,0xb3,0x7a,0x73,0x77,0x51,0x12,0x3e,0x96,0x9, 0x75,0x29, +0xb4,0x7a,0x73,0x77,0x52,0x12,0x3e,0x96,0x9, 0x75,0x29,0xb5,0x7a,0x73,0x77,0x53, +0x7e,0x73,0x78,0x97,0x7a,0x73,0x77,0x61,0x2, 0x3e,0x8b,0xe5,0x1e,0x7a,0xb3,0x77, +0x3d,0x22,0x7e,0x8, 0x0, 0x71,0x7e,0xa3,0x78,0x97,0x74,0x3, 0xa4,0x22,0xe4,0x7e, +0x63,0x29,0xbf,0x7e,0x70,0x3, 0xac,0x67,0x9, 0x73,0x29,0xb3,0x12,0x3d,0x35,0x7e, +0xf3,0x29,0xbf,0xbe,0xf0,0x3, 0x7c,0xbf,0x7e,0x63,0x75,0x33,0x7e,0x70,0x26,0x22, +0x12,0x3f,0xbd,0x12,0x37,0xf5,0x12,0xd9,0x19,0x7e,0xb3,0x6f,0x76,0x7e,0x37,0x6f, +0x72,0x60,0xe, 0x7a,0x37,0x0, 0xbb,0x7e,0x37,0x6f,0x74,0x7a,0x37,0x0, 0x7f,0x80, +0xc, 0x7a,0x37,0x0, 0x7f,0x7e,0x37,0x6f,0x74,0x7a,0x37,0x0, 0xbb,0x7e,0x37,0x0, +0x7d,0x4e,0x70,0x2, 0x7a,0x37,0x0, 0x7d,0x7e,0x37,0x0, 0xb9,0x4e,0x70,0x2, 0x7a, +0x37,0x0, 0xb9,0x12,0x3e,0x92,0x9, 0xb5,0x29,0xb3,0x12,0xc, 0xea,0x12,0x3e,0x92, +0x9, 0xb5,0x29,0xb4,0x12,0xd, 0x8d,0x12,0x3e,0x92,0x12,0xe7,0x9, 0x7e,0x37,0x0, +0x71,0x7a,0x37,0x0, 0xad,0x6d,0x33,0x7e,0x8, 0x0, 0x6d,0x7e,0x24,0x0, 0x1e,0x12, +0x3, 0xfa,0x6d,0x33,0x7e,0x8, 0x0, 0xa9,0x7e,0x24,0x0, 0x1e,0x2, 0x4, 0x96,0x7e, +0xb3,0x6f,0x68,0x7e,0x73,0x6f,0x69,0x12,0x3f,0x53,0x7e,0xb3,0x6f,0x68,0x7e,0x73, +0x6f,0x69,0x22,0x7c,0x6b,0x7c,0x56,0x5e,0x50,0x4, 0x1e,0x50,0xa, 0x45,0x7c,0xb6, +0x54,0x1, 0xa, 0x5b,0x2d,0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0x4, 0x1e,0x60,0xa, +0x26,0x7c,0xb7,0x54,0x1, 0xa, 0x3b,0x2d,0x32,0x7c,0xb7,0xa, 0x4b,0x3e,0x44,0x3e, +0x44,0xa, 0x5a,0x2d,0x54,0x7c,0xab,0x7a,0xa3,0x73,0xda,0xe4,0x7a,0xb3,0x73,0xdb, +0x7e,0x70,0x4, 0x7c,0xba,0x30,0xe0,0x9, 0x7e,0xb3,0x73,0xdb,0x4, 0x7a,0xb3,0x73, +0xdb,0x1e,0xa0,0x1b,0x70,0x78,0xec,0x22,0x12,0x3d,0x35,0x7e,0xb3,0x78,0x97,0x22, +0xd2,0x4, 0x12,0x3c,0x96,0x12,0x46,0xaa,0x70,0xfb,0x22,0xc2,0x2a,0x7e,0xf, 0x78, +0xf2,0x2e,0x14,0x0, 0x14,0xb, 0xa, 0x30,0x22,0x6d,0x33,0x12,0x3f,0xf5,0x7e,0x57, +0x77,0x91,0x12,0x3f,0xfe,0xe4,0x2, 0x3f,0xd9,0x7a,0xb3,0x77,0xb7,0x7a,0xb3,0x77, +0xb8,0x22,0x7e,0x34,0x0, 0x2, 0x12,0x3f,0xf5,0x7e,0x57,0x77,0xa1,0x12,0x3f,0xfe, +0x74,0x2, 0x2, 0x3f,0xd9,0x7e,0x24,0xc, 0x18,0x7e,0x14,0x10,0x24,0x22,0x7c,0x1b, +0x7d,0x43,0x7e,0xa3,0x77,0xb1,0xbe,0xa0,0x5, 0x50,0x1e,0x7e,0x70,0x7, 0xac,0x7a, +0x59,0x43,0x77,0xbd,0x59,0x23,0x77,0xbf,0x59,0x13,0x77,0xc1,0x19,0x13,0x77,0xc3, +0x7c,0xba,0x4, 0x7a,0xb3,0x77,0xb1,0xc3,0x22,0xd3,0x22,0x7c,0x6b,0xa5,0xbe,0xfa, +0x4, 0x7a,0x73,0x4a,0x66,0xa5,0xbe,0x0, 0x7, 0x7c,0xb7,0x12,0x6b,0x5a,0x81,0x12, +0xa5,0xbe,0xf, 0xd, 0x74,0x1, 0x7a,0xb3,0x77,0x40,0x7a,0xb3,0x77,0x41,0xd2,0x26, +0x22,0xa5,0xbe,0x2e,0xd, 0x74,0x1, 0x7a,0xb3,0x77,0x5f,0x7a,0xb3,0x77,0x60,0xd2, +0x26,0x22,0xa5,0xbe,0x12,0x5, 0x7a,0x73,0x77,0x43,0x22,0xa5,0xbe,0x11,0x2d,0xa5, +0xbf,0x1, 0x1e,0x7e,0xb3,0x77,0x42,0x60,0x2, 0x81,0x31,0x74,0x1, 0x7a,0xb3,0x77, +0x42,0xe4,0x7a,0xb3,0x77,0x44,0x7e,0xb3,0x77,0x31,0x44,0x80,0x7a,0xb3,0x77,0x31, +0x22,0xa5,0xbf,0x0, 0x2, 0x80,0x2, 0x81,0x31,0x2, 0xe7,0x0, 0xbe,0x60,0x99,0x68, +0x4, 0xa5,0xbe,0x9a,0x1d,0x7e,0xa3,0x4a,0x67,0x7c,0xba,0x4, 0x7a,0xb3,0x4a,0x67, +0xa, 0x2a,0x19,0x72,0x4e,0x85,0xa5,0xbe,0x9a,0x2, 0x80,0x2, 0x81,0x31,0x75,0x1a, +0x99,0x22,0xa5,0xbe,0x9b,0x9, 0x7a,0x73,0x4a,0x67,0x7a,0x73,0x4a,0x65,0x22,0xa5, +0xbe,0x1, 0x11,0x6d,0x22,0x7a,0x27,0x4a,0x63,0x7a,0x73,0x77,0x32,0x7c,0xb7,0x12, +0x68,0x67,0x81,0x12,0xbe,0x60,0x5b,0x28,0x2, 0x61,0x18,0xa5,0xbe,0x30,0x11,0x7e, +0x53,0x77,0x61,0xbc,0x57,0x78,0x2, 0x81,0x31,0xbe,0x70,0x4, 0x40,0x2, 0x81,0x31, +0xbe,0x60,0x20,0x40,0xc, 0xbe,0x60,0x22,0x38,0x7, 0xbe,0x70,0x3, 0x28,0x2, 0x81, +0x31,0x7c,0xb6,0x24,0xf9,0xbe,0xb0,0x29,0x40,0x2, 0x21,0x9f,0x7e,0xa0,0x3, 0xa4, +0x90,0x41,0x24,0x73,0x2, 0x44,0x31,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f, +0x2, 0x44,0x31,0x2, 0x44,0x31,0x2, 0x44,0x31,0x2, 0x44,0x31,0x2, 0x41,0x9f,0x2, +0x44,0x31,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41, +0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f, +0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, +0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41, +0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f,0x2, 0x41,0x9f, +0x2, 0x44,0x31,0x2, 0x44,0x31,0x2, 0x44,0x31,0x2, 0x41,0x9f,0x2, 0x44,0x31,0xa, +0x26,0x19,0x72,0x77,0x31,0x7c,0xb6,0x1b,0xb2,0xbe,0xb0,0x34,0x40,0x2, 0x41,0xda, +0x7e,0xa0,0x3, 0xa4,0x90,0x41,0xb8,0x73,0x2, 0x42,0x54,0x2, 0x42,0xda,0x2, 0x42, +0x54,0x2, 0x42,0xda,0x2, 0x42,0x58,0x2, 0x42,0x54,0x2, 0x42,0xda,0x2, 0x42,0xda, +0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, +0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42, +0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xa0,0x2, 0x42,0xda,0x2, 0x42,0xad, +0x2, 0x42,0xda,0x2, 0x42,0xc0,0x2, 0x42,0x54,0x2, 0x42,0x54,0x2, 0x42,0x5d,0x2, +0x42,0x5d,0x2, 0x42,0x5d,0x2, 0x42,0xda,0x2, 0x42,0xcf,0x2, 0x42,0xda,0x2, 0x42, +0xda,0x2, 0x42,0xda,0x2, 0x42,0x66,0x2, 0x42,0x66,0x2, 0x42,0x66,0x2, 0x42,0xda, +0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0xda,0x2, 0x42,0x54,0x2, +0x42,0x6f,0x2, 0x42,0x78,0x2, 0x42,0x81,0x2, 0x42,0x8a,0x2, 0x42,0xda,0x2, 0x42, +0xda,0x2, 0x42,0x93,0xd2,0x26,0x41,0xda,0x12,0x0, 0xfd,0x80,0x7d,0x7e,0x27,0x4a, +0x6d,0x4e,0x40,0x20,0x80,0x34,0x7e,0x27,0x4a,0x6d,0x4e,0x40,0x1, 0x80,0x2b,0x7e, +0x27,0x4a,0x6d,0x4e,0x50,0x1, 0x80,0x22,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x2, 0x80, +0x19,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x4, 0x80,0x10,0x7e,0x27,0x4a,0x6d,0x4e,0x50, +0x8, 0x80,0x7, 0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x10,0x7a,0x27,0x4a,0x6d,0x80,0x3a, +0x7e,0x53,0x77,0x49,0x12,0x44,0x32,0x7a,0x27,0x4a,0x61,0x80,0x2d,0x7e,0x53,0x77, +0x4b,0x12,0x44,0x32,0x3e,0x24,0x7a,0x27,0x4e,0x7d,0x7a,0x27,0x4a,0x69,0x80,0x1a, +0x7e,0x53,0x77,0x4d,0x12,0x44,0x32,0x3e,0x24,0x7a,0x27,0x4a,0x63,0x80,0xb, 0x7e, +0x53,0x77,0x54,0x12,0x44,0x32,0x7a,0x53,0x78,0x8c,0xbe,0x60,0x38,0x40,0x14,0xbe, +0x60,0x56,0x38,0xf, 0xa, 0x26,0x5e,0x24,0x0, 0x1, 0xbe,0x24,0x0, 0x1, 0x78,0x3, +0x12,0xe6,0xae,0xbe,0x60,0x58,0x40,0xb, 0x7e,0x27,0x4a,0x6d,0x4e,0x40,0x2, 0x7a, +0x27,0x4a,0x6d,0xa5,0xbe,0xa, 0x2, 0x80,0x2, 0x81,0x12,0x7e,0x37,0x4a,0x6d,0x4e, +0x60,0x4, 0x7a,0x37,0x4a,0x6d,0x81,0x12,0xbe,0x60,0x6c,0x68,0x4, 0xa5,0xbe,0x6d, +0x2b,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x80,0x7a,0x27,0x4a,0x6d,0x7e,0x27,0x4a,0x69, +0x7d,0x12,0xb, 0x14,0x7a,0x17,0x4a,0x69,0x2e,0x27,0x4a,0x6b,0x7a,0x29,0x70,0xa5, +0xbe,0x6d,0x2, 0x80,0x2, 0x81,0x12,0x75,0x1a,0x6c,0x81,0x12,0xbe,0x60,0x6e,0x68, +0x4, 0xa5,0xbe,0x6f,0x43,0x7e,0x27,0x4a,0x6d,0x4e,0x50,0x40,0x7a,0x27,0x4a,0x6d, +0x7e,0x43,0x77,0x49,0x6c,0x55,0x7e,0xb3,0x77,0x4a,0xa, 0x1b,0x2d,0x12,0x4, 0x7a, +0xb3,0x77,0x4a,0x70,0x9, 0x7e,0xb3,0x77,0x49,0x4, 0x7a,0xb3,0x77,0x49,0x7a,0x17, +0x4a,0x61,0x7e,0x27,0x4a,0x6f,0x2d,0x21,0x7a,0x29,0x70,0xa5,0xbe,0x6f,0x2, 0x80, +0x2, 0x81,0x12,0x75,0x1a,0x6e,0x80,0x7a,0xbe,0x60,0x70,0x40,0xc, 0xbe,0x60,0x7f, +0x38,0x7, 0x7c,0xb6,0x12,0x68,0x49,0x80,0x69,0xa5,0xbe,0x86,0xf, 0x7c,0xb7,0x54, +0x7, 0x7a,0xb3,0x4a,0x68,0x53,0xc3,0xf8,0x42,0xc3,0x80,0x56,0xa5,0xbe,0x87,0xf, +0x7c,0xb7,0x54,0x3, 0x7a,0xb3,0x4a,0x60,0x53,0xc2,0xfc,0x42,0xc2,0x80,0x43,0xa5, +0xbe,0x88,0x29,0x5e,0x70,0x7, 0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x10,0xb, 0xa, +0x20,0x5e,0x40,0xc7,0x1b,0xa, 0x20,0xa, 0x37,0x7d,0x23,0x7c,0x45,0x6c,0x55,0x12, +0x44,0x40,0x12,0x45,0x27,0x4d,0x32,0x1b,0xa, 0x30,0x80,0x16,0xa5,0xbe,0xf6,0x6, +0x7a,0x73,0x78,0xe5,0x80,0xc, 0xa5,0xbe,0xf7,0x8, 0x74,0x64,0xac,0xb7,0x7a,0x57, +0x78,0xe6,0x30,0x26,0xa, 0x7e,0xb3,0x77,0x3f,0x44,0x1, 0x7a,0xb3,0x77,0x3f,0x7e, +0x37,0x4a,0x6d,0x4d,0x33,0x68,0xa, 0x7e,0xb3,0x77,0x3f,0x44,0x2, 0x7a,0xb3,0x77, +0x3f,0x22,0x7c,0x25,0x6c,0x33,0xa, 0x27,0x2d,0x21,0x22,0xb, 0x18,0x20,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x22,0x7e,0x34,0x76,0xbf,0x30,0x27,0x60,0xc2,0x27, +0x7e,0x39,0x50,0xa, 0x25,0x12,0x44,0x3e,0x3e,0x24,0x7a,0x27,0x6f,0x40,0x9, 0x53, +0x0, 0x1, 0xa, 0x25,0x12,0x44,0x3e,0x3e,0x24,0x7a,0x27,0x6f,0x42,0x7e,0xb3,0x76, +0xbd,0xb4,0x3, 0x15,0x9, 0xa3,0x0, 0x3, 0xa, 0x2a,0x12,0x44,0x3e,0x3e,0x24,0x7a, +0x27,0x6f,0x48,0x19,0xa3,0x0, 0x2, 0x80,0x16,0xb4,0x2, 0x13,0x9, 0x53,0x0, 0x2, +0xa, 0x15,0x12,0xd9,0x10,0x3e,0x14,0x7a,0x17,0x6f,0x48,0x19,0x53,0x0, 0x3, 0x9, +0x73,0x0, 0x5, 0x12,0x31,0x22,0x3e,0x34,0x3e,0x34,0x7a,0x37,0x6f,0x50,0x7e,0x37, +0x6f,0x40,0x7a,0x37,0x77,0x2f,0x4d,0x33,0x78,0xb, 0x7e,0x34,0x21,0x5b,0x12,0x2a, +0xa9,0x7a,0x37,0x77,0x2f,0x22,0x7c,0x67,0x7c,0x7b,0xa5,0xbf,0x0, 0xd, 0xbe,0x60, +0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0x6f,0x38,0x2, 0xc8,0x38,0xa5,0xbe,0x0, 0x17,0x6c, +0xaa,0x80,0xe, 0x7e,0x60,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x62,0x6e,0x81,0xb, +0xa0,0x12,0x45,0x1f,0x38,0xed,0x6c,0xaa,0x80,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e, +0x14,0x6d,0xc9,0x12,0x44,0x3b,0x1b,0x18,0x20,0x7e,0x30,0x9, 0xac,0x3a,0x2e,0x14, +0x6d,0xcb,0x12,0x44,0x3b,0x1b,0x18,0x20,0xb, 0xa0,0xbc,0x7a,0x38,0xdc,0x22,0x90, +0x21,0x51,0xe4,0x93,0xbc,0xba,0x22,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0x10,0xb, +0xa, 0x30,0x22,0x30,0x0, 0x5, 0x43,0xc3,0x80,0x80,0x3, 0x53,0xc3,0x7f,0x30,0x0, +0x5, 0x43,0xc2,0x80,0x80,0x3, 0x53,0xc2,0x7f,0x7e,0xf, 0x78,0xf2,0x30,0x0, 0x8, +0x12,0x45,0x2b,0x4e,0x60,0xc4,0x80,0x6, 0x12,0x45,0x2b,0x5e,0x60,0x3b,0x1b,0xa, +0x30,0x22,0x12,0x46,0x7f,0x12,0x3f,0xb0,0x12,0x45,0xcd,0x12,0x45,0x86,0xa9,0xd6, +0xeb,0x74,0x1, 0x7e,0x70,0x82,0x12,0x45,0xe9,0xa9,0xc6,0xeb,0xd2,0x0, 0x12,0x45, +0x86,0xd2,0x0, 0x2, 0x45,0x33,0xa9,0xd0,0xce,0x30,0x0, 0x4, 0xa9,0xd5,0xc9,0x22, +0xa9,0xc5,0xc9,0x22,0x12,0x46,0xaf,0x40,0x6, 0x12,0x46,0xc5,0x12,0x0, 0x12,0x12, +0x45,0xcd,0x12,0x45,0xd5,0x80,0xb, 0x7e,0xb3,0x77,0xf, 0x60,0x2, 0x80,0x0, 0x12, +0x46,0x60,0x30,0x15,0xf2,0x7e,0xb3,0x78,0x93,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a, +0xb3,0x78,0x93,0xd2,0x0, 0x12,0x45,0xd5,0xd2,0x0, 0x2, 0x45,0x33,0xc2,0x0, 0x12, +0x45,0x33,0xc2,0x0, 0x22,0xa2,0x0, 0xa9,0x92,0xcb,0xa2,0x0, 0xa9,0x92,0xca,0xa2, +0x0, 0xa9,0x91,0xcb,0x22,0xe4,0x7e,0x70,0xff,0x7c,0x6b,0x7e,0xb3,0x78,0x8d,0xb4, +0x81,0x68,0xa5,0xbe,0x0, 0x2, 0x80,0x5c,0xa5,0xbe,0x1, 0x22,0xc2,0xaf,0xa, 0x27, +0x5e,0x24,0x0, 0x2, 0x68,0x2, 0xd2,0x95,0x7a,0x71,0xcd,0xa9,0xd0,0xce,0xa9,0xc6, +0xc9,0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x36,0xa5,0xbe, +0x2, 0x18,0x12,0x46,0xa5,0x70,0xf, 0xa9,0xd0,0xce,0xa9,0xc7,0xc9,0xa9,0xd0,0xce, +0xa9,0xd6,0xc9,0xa9,0xd1,0x87,0xd2,0xaf,0x80,0x1a,0xa5,0xbe,0x3, 0x1c,0x12,0x46, +0xa5,0x70,0xf, 0xa9,0xd0,0xce,0xa9,0xd7,0xc9,0xa9,0xd0,0xce,0xa9,0xc6,0xc9,0xa9, +0xd1,0x87,0xd2,0xaf,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x78,0x8d,0x22, +0x80,0xe, 0x12,0x46,0x7f,0x12,0x46,0xaf,0x40,0x14,0x20,0x15,0x11,0x12,0x45,0xe5, +0x12,0x46,0xaa,0x70,0xed,0x12,0x46,0x7f,0x12,0xe6,0x76,0x2, 0x45,0xe9,0x22,0x74, +0x81,0x7a,0xb3,0x78,0x8d,0x22,0x80,0xe, 0x12,0x46,0x7f,0x12,0x46,0xaf,0x40,0x14, +0x20,0x15,0x11,0x12,0x45,0xe5,0x12,0x46,0xaa,0x70,0xed,0x12,0x46,0x7f,0x12,0xe6, +0x76,0x2, 0x45,0xe9,0x22,0xc2,0xaf,0x7a,0x71,0xcd,0xa2,0x93,0xe4,0x33,0x22,0x30, +0xc, 0x3, 0x12,0x4b,0xe2,0x7e,0xb3,0x77,0xb5,0x70,0x6, 0x7e,0xb3,0x77,0xb6,0x60, +0x2, 0xd3,0x22,0xc3,0x22,0x80,0x3, 0x12,0x46,0x86,0x12,0x46,0xaf,0x50,0xf8,0x22, +0x20,0x15,0x6, 0x12,0xdd,0xda,0x12,0x0, 0x12,0x30,0x1d,0x3, 0x12,0x3b,0xdc,0x12, +0x46,0xaf,0x40,0x6, 0x12,0x46,0xc5,0x2, 0x0, 0x12,0x22,0xca,0xf8,0x7e,0x14,0x0, +0x1e,0x7e,0x4, 0x0, 0xff,0x69,0x30,0x0, 0x1, 0x7e,0xb, 0x50,0x7a,0x37,0x63,0x6e, +0x7a,0x53,0x63,0x6d,0xc2,0x0, 0x6d,0xcc,0x7e,0xb4,0xff,0xff,0x20,0x25,0x3, 0x2, +0x48,0x2a,0x7e,0xd4,0x4, 0xc, 0xca,0xd9,0x12,0x69,0x31,0x12,0x24,0x13,0x1b,0xfd, +0x6d,0xaa,0x7d,0xda,0x80,0x26,0x7d,0x2d,0x3e,0x24,0x49,0x12,0x46,0x54,0xbe,0x14, +0x0, 0x0, 0x8, 0x6, 0x49,0x32,0x46,0x54,0x80,0x4, 0x6d,0x33,0x9d,0x31,0x59,0x32, +0x46,0x54,0xbd,0x3c,0x28,0x4, 0x7d,0xc3,0x7d,0xbd,0xb, 0xd4,0x7e,0x37,0x73,0xd6, +0xbd,0x3d,0x38,0xd2,0x7e,0x37,0x4e,0x95,0xbd,0x3c,0x50,0x4, 0x7a,0xc7,0x4e,0x95, +0x7e,0x37,0x4e,0x8b,0xbd,0x3c,0x50,0x10,0xbe,0xb4,0xff,0xff,0x68,0xa, 0x7e,0x37, +0x4e,0x93,0xb, 0x34,0x7a,0x37,0x4e,0x93,0x7e,0x73,0x6f,0x65,0xa, 0x27,0x7d,0x3b, +0x8d,0x32,0x7c,0xf5,0xbe,0xf0,0x0, 0x40,0x7, 0xbe,0xf0,0x1d,0x38,0x2, 0xd2,0x0, +0x7d,0xda,0x7d,0x3d,0x3e,0x34,0x49,0x23,0x4e,0x85,0xbd,0x2c,0x50,0x51,0xbe,0xb4, +0xff,0xff,0x68,0x4b,0x9, 0xbd,0x4e,0x97,0xb4,0x1, 0x25,0x49,0x23,0x4e,0xa0,0xbd, +0x2b,0x78,0x10,0x7d,0xa3,0x2e,0xa4,0x4e,0x9a,0xb, 0xa8,0x20,0xb, 0x24,0x1b,0xa8, +0x20,0x80,0x32,0x4d,0xdd,0x78,0x14,0x30,0x0, 0x25,0x80,0xf, 0x80,0x21,0x80,0xb, +0x4d,0xdd,0x78,0x7, 0x30,0x0, 0x18,0x80,0x2, 0x80,0x14,0x59,0xb3,0x4e,0xa0,0x7e, +0x24,0x0, 0x1, 0x59,0x23,0x4e,0x9a,0x74,0x1, 0x19,0xbd,0x4e,0x97,0x80,0x6, 0x74, +0x1, 0x19,0xbd,0x63,0x6d,0x49,0xa3,0x4e,0x8d,0x49,0x23,0x4e,0x9a,0xbd,0x2a,0x28, +0x4, 0x59,0x23,0x4e,0x8d,0x9, 0xbd,0x63,0x6d,0xb4,0x1, 0x11,0x6d,0x22,0x59,0x23, +0x4e,0xa0,0x6d,0xaa,0x59,0xa3,0x4e,0x9a,0xe4,0x19,0xbd,0x4e,0x97,0xb, 0xd4,0xbe, +0xd4,0x0, 0x3, 0x68,0x3, 0x2, 0x47,0x92,0x80,0x1a,0x7e,0x8, 0x4e,0x97,0x7e,0x34, +0x0, 0x3, 0xe4,0x12,0x24,0x38,0x7e,0x8, 0x4e,0x9a,0x12,0x48,0x47,0x7e,0x8, 0x4e, +0xa0,0x12,0x48,0x47,0xda,0xf8,0x22,0x7e,0x34,0x0, 0x6, 0x2, 0x24,0x38,0xe4,0x7a, +0xb3,0x76,0xe4,0x6d,0x33,0x7a,0x37,0x4e,0x7d,0x12,0x68,0xe7,0x12,0x48,0xb3,0x12, +0x3d,0xdb,0xc2,0x1, 0x12,0x29,0x5a,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x7e,0x1f,0x24, +0x64,0x7e,0xf, 0x24,0x68,0x12,0x24,0x13,0x1b,0xfd,0x12,0x3b,0xdc,0x2, 0x48,0x80, +0x7e,0x8, 0x75,0xb1,0x7e,0x34,0x0, 0xa, 0xe4,0x2, 0x24,0x38,0xe4,0x7a,0xb3,0x76, +0xe4,0x74,0x1, 0x7a,0xb3,0x78,0x97,0x7a,0xb3,0x73,0xd3,0x12,0x74,0xba,0x12,0x48, +0xb3,0x12,0x49,0x61,0x12,0x3d,0xf1,0x12,0x77,0xa0,0x12,0xbf,0xfc,0x12,0x48,0x80, +0x2, 0x29,0x45,0x7e,0x8, 0x77,0x91,0x7e,0x34,0x0, 0x20,0xe4,0x12,0x24,0x38,0x7e, +0x34,0x0, 0x1, 0x7a,0x37,0x77,0x91,0x7a,0xb3,0x77,0x93,0x74,0x1, 0x7a,0xb3,0x77, +0x94,0xe4,0x7a,0xb3,0x77,0x95,0x7e,0xb3,0x78,0x8f,0xb4,0x1, 0x31,0x7e,0x34,0x0, +0x2, 0x12,0x49,0x4d,0x12,0x49,0x31,0x7a,0x73,0x77,0x9e,0x74,0x1, 0x7a,0xb3,0x77, +0x9f,0xe4,0x7a,0xb3,0x77,0xa0,0x7e,0x34,0x0, 0x2, 0x12,0x49,0x3a,0x12,0x49,0x31, +0x7a,0x73,0x77,0xa6,0x7a,0xb3,0x77,0xa7,0x7a,0xb3,0x77,0xa8,0x80,0xa, 0x7e,0x34, +0x0, 0x1, 0x12,0x49,0x4d,0x12,0x49,0x3a,0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x77,0xa9, +0x74,0x1, 0x7a,0xb3,0x77,0xab,0x7a,0xb3,0x77,0xac,0x74,0x2, 0x7a,0xb3,0x77,0xad, +0x22,0x7e,0x73,0x78,0x8e,0x1e,0x34,0xb, 0x34,0x22,0x7a,0x37,0x77,0xa1,0x74,0x1, +0x7a,0xb3,0x77,0xa3,0x7a,0xb3,0x77,0xa4,0x7a,0xb3,0x77,0xa5,0x22,0x7a,0x37,0x77, +0x99,0x74,0x1, 0x7a,0xb3,0x77,0x9b,0x7a,0xb3,0x77,0x9c,0xe4,0x7a,0xb3,0x77,0x9d, +0x22,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x6, 0x5e,0x34,0x0, 0x1, 0x68,0x18,0x12, +0x3b,0x4f,0x5e,0x34,0x0, 0x2, 0x68,0x3, 0x12,0x4f,0xe2,0x74,0x3, 0x12,0x49,0xba, +0x74,0x1, 0x12,0x30,0x49,0x80,0x2e,0x12,0x4f,0xf0,0x12,0x4f,0xd9,0x74,0x1, 0x12, +0x49,0xba,0xe4,0x12,0x30,0x49,0x7e,0xf, 0x78,0xf2,0x2e,0x14,0x0, 0xa, 0xb, 0xa, +0x30,0x4e,0x60,0x10,0x1b,0xa, 0x30,0xe4,0x7a,0xb3,0x78,0x8e,0x12,0x3f,0xbd,0x12, +0x49,0xf3,0x12,0x4f,0x8a,0xe5,0x1e,0x2, 0x3c,0x29,0xbe,0xb0,0x4, 0x50,0x33,0x7e, +0x37,0x0, 0x9f,0x5e,0x70,0xf0,0x7a,0x37,0x0, 0x9f,0xa, 0x3b,0x4e,0x37,0x0, 0x9f, +0x7a,0x37,0x0, 0x9f,0x7a,0x37,0x0, 0xdb,0x7e,0x34,0x0, 0x19,0x7e,0x8, 0x0, 0x9f, +0x12,0x67,0xea,0x7e,0x34,0x0, 0x19,0x7e,0x8, 0x0, 0xdb,0x7e,0x24,0x0, 0x1, 0x2, +0x4, 0x96,0x22,0x5e,0x70,0xfe,0x1b,0xa, 0x30,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b, +0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x7e,0xf, +0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x80,0x0, 0x68,0x2c,0xb, 0xa, 0x30,0x5e, +0x34,0x80,0x0, 0x68,0x23,0x12,0x37,0xe2,0x6e,0x70,0x40,0x1b,0xa, 0x30,0x7e,0xf, +0x78,0xf2,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x80,0x1b,0xa, 0x30,0x12,0x4b,0xd1, +0xd2,0xe, 0x12,0x3f,0xbd,0x12,0x49,0xf3,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, +0x5e,0x34,0x0, 0x2, 0x68,0x1d,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x2, 0x68,0x14,0xb, +0x15,0xb, 0xa, 0x30,0x4e,0x70,0x2, 0x1b,0xa, 0x30,0x12,0x4b,0xd1,0x12,0x3f,0xbd, +0x12,0x49,0xf3,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x0, 0x1, 0x68, +0x20,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x1, 0x68,0x17,0xb, 0x15,0xb, 0xa, 0x30,0x4e, +0x70,0x1, 0x1b,0xa, 0x30,0x12,0x4c,0x37,0x12,0x3f,0xbd,0x4e,0x70,0x1, 0x1b,0xa, +0x30,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x0, 0x8, 0x68,0x17,0xb, +0xa, 0x30,0x5e,0x34,0x0, 0x8, 0x68,0xe, 0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x70,0x8, +0x1b,0xa, 0x30,0x12,0x4c,0x26,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34, +0x0, 0x4, 0x68,0x17,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x4, 0x68,0xe, 0xb, 0x15,0xb, +0xa, 0x30,0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x12,0x4c,0x15,0x7e,0xf, 0x78,0xf2,0x69, +0x30,0x0, 0x4, 0x5e,0x34,0x40,0x0, 0x68,0x31,0xb, 0xa, 0x30,0x5e,0x34,0x40,0x0, +0x68,0x28,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x40,0x1b,0xa, 0x30,0xd2,0xd, 0x7e, +0xb3,0x78,0x8b,0xbe,0xb0,0xc8,0x50,0x5, 0x4, 0x7a,0xb3,0x78,0x8b,0x7e,0xb3,0x78, +0x8b,0xb4,0x1, 0x6, 0x12,0x29,0x4a,0x12,0x4b,0xe2,0x7e,0xf, 0x78,0xf2,0x69,0x30, +0x0, 0x4, 0x5e,0x34,0x20,0x0, 0x68,0x19,0xb, 0xa, 0x30,0x5e,0x34,0x20,0x0, 0x68, +0x10,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x20,0x1b,0xa, 0x30,0xd2,0xd, 0x12,0x4b, +0xe2,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x10,0x0, 0x68,0x26,0xb, +0xa, 0x30,0x7d,0x23,0x5e,0x24,0x10,0x0, 0x68,0x1b,0x5e,0x34,0x8, 0x0, 0x2e,0x34, +0xff,0xff,0x92,0x13,0xb, 0x15,0xb, 0xa, 0x30,0x4e,0x60,0x8, 0x1b,0xa, 0x30,0x12, +0xda,0xe9,0x12,0xdb,0x31,0x7e,0xf, 0x78,0xf2,0x69,0x30,0x0, 0x4, 0x5e,0x34,0x0, +0x40,0x68,0x29,0xb, 0xa, 0x30,0x5e,0x34,0x0, 0x40,0x68,0x20,0xb, 0x15,0xb, 0xa, +0x30,0x4e,0x70,0x40,0x1b,0xa, 0x30,0x7e,0x1f,0x78,0xf2,0x69,0x31,0x0, 0xa, 0x5e, +0x34,0xf, 0xc0,0x12,0x4c,0x5b,0x1e,0x34,0x7a,0x73,0x78,0x8e,0xd0,0x82,0xd0,0x83, +0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b, +0x32,0xd2,0xc, 0xd2,0x11,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x1, 0x78,0x3, 0x2, 0x4b, +0xfa,0x22,0x30,0x2a,0x14,0xa9,0xd2,0xea,0xa9,0xc2,0xea,0x12,0xe5,0x88,0x12,0x3f, +0xbb,0x12,0x37,0xf5,0xc2,0x29,0x2, 0x4c,0x4, 0x22,0x12,0xb, 0xb0,0x20,0x29,0x3, +0x2, 0x4c,0x4, 0x22,0x12,0xb, 0xe5,0x12,0x4f,0xf3,0x74,0x2, 0x7a,0xb3,0x77,0xb5, +0x7a,0xb3,0x77,0xb6,0x22,0xd2,0xf, 0xd2,0x11,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x2, +0x68,0x3, 0x2, 0x4b,0xfa,0x22,0xd2,0xf, 0xd2,0x11,0x12,0x3b,0x65,0x5e,0x34,0x0, +0x2, 0x78,0x3, 0x2, 0x4b,0xfa,0x22,0xd2,0xc, 0xd2,0x11,0x12,0x3b,0x65,0x5e,0x34, +0x0, 0x1, 0x68,0x8, 0xe4,0x7a,0xb3,0x78,0x8b,0x2, 0x4b,0xfa,0x22,0x6e,0x34,0xff, +0xff,0xb, 0x34,0x7a,0x37,0x6f,0x4e,0x7e,0x37,0x6f,0x40,0x1e,0x34,0x1e,0x34,0x1e, +0x34,0x1e,0x34,0x1e,0x34,0x22,0xca,0x3b,0x7f,0x30,0x7c,0xab,0xbe,0xa0,0x4, 0x40, +0x2, 0xc1,0x1e,0x74,0x27,0xa4,0x9, 0xb5,0x28,0xeb,0xf5,0x3c,0xe4,0x12,0x67,0x91, +0x7e,0xf7,0x6f,0x6a,0x7e,0xe7,0x6f,0x6c,0x2d,0xef,0x7a,0xe5,0x3a,0x7e,0x8, 0x67, +0xd3,0x12,0x64,0xf8,0x7e,0xb3,0x6f,0x76,0x60,0x62,0x6d,0xee,0x80,0x2e,0x7e,0xe5, +0x36,0x3e,0xe4,0x49,0x3e,0x6f,0x77,0x7a,0x35,0x38,0x7f,0x3, 0x2e,0x15,0x36,0x7e, +0xb, 0x50,0x19,0x53,0x2, 0xaf,0x12,0x4e,0x47,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb, +0x12,0x4c,0x5d,0x3e,0x34,0x2e,0x34,0x67,0xf7,0x12,0x4e,0x21,0x7a,0xe5,0x36,0xbe, +0xf5,0x36,0x38,0xca,0x7a,0xf5,0x36,0x80,0x19,0x12,0x4e,0x2f,0x60,0x5, 0x3e,0x24, +0x14,0x78,0xfb,0x12,0x4c,0x5d,0x3e,0x34,0x2e,0x34,0x67,0xd3,0x12,0x4e,0x21,0x7a, +0xe5,0x36,0x7e,0xe5,0x3a,0xbe,0xe5,0x36,0x38,0xdf,0x80,0x67,0x6d,0xee,0x80,0x16, +0x12,0x4e,0x2f,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x12,0x4c,0x5d,0x3e,0x34,0x2e, +0x34,0x67,0xd3,0x12,0x4e,0x21,0x7a,0xe5,0x36,0xbe,0xf5,0x36,0x38,0xe2,0x7a,0xf5, +0x36,0x80,0x38,0x7e,0x35,0x36,0x3e,0x34,0x49,0x23,0x6f,0x77,0x7a,0x25,0x38,0x7f, +0x3, 0x2e,0x15,0x36,0x7e,0xb, 0x70,0x19,0x72,0x2, 0xaf,0x7d,0x52,0x12,0x64,0xaf, +0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xba,0x3e,0x24,0x2e,0x24,0x67,0xf7, +0x12,0x64,0xd8,0x7e,0x35,0x36,0xb, 0x34,0x7a,0x35,0x36,0x7e,0x35,0x3a,0xbe,0x35, +0x36,0x38,0xc0,0x7e,0x45,0x3a,0x12,0x4e,0x66,0x7a,0x73,0x1, 0x95,0x12,0x4e,0x72, +0x7a,0xb3,0x1, 0x96,0x12,0x4e,0x52,0x7a,0xb3,0x1, 0x97,0xb, 0x44,0x12,0x4e,0x66, +0x7a,0x73,0x2, 0xaf,0x12,0x4e,0x72,0x7a,0xb3,0x2, 0xb0,0x12,0x4e,0x52,0x7a,0xb3, +0x2, 0xb1,0x7e,0xb3,0x6f,0x68,0x54,0x5, 0xa, 0x3b,0x4e,0x37,0x67,0xd3,0x7a,0x37, +0x67,0xd3,0x7e,0xb3,0x6f,0x69,0x54,0x5, 0xa, 0x3b,0x4e,0x37,0x67,0xf7,0x7a,0x37, +0x67,0xf7,0x12,0x4e,0x5a,0x2e,0x74,0x0, 0x16,0x7d,0x37,0x7e,0x8, 0x67,0xd3,0x12, +0x67,0xdc,0x7d,0x37,0x7e,0x8, 0x67,0xf7,0x12,0x67,0xe3,0x12,0x4e,0x5a,0x2e,0x74, +0x0, 0x28,0x6d,0x33,0x7a,0x35,0x36,0x7e,0x35,0x36,0x9, 0x53,0x1, 0x96,0x7c,0x25, +0x6c,0x33,0x9, 0x53,0x1, 0x95,0x12,0x4e,0x82,0x40,0xec,0x7d,0x37,0x7e,0x8, 0x68, +0x1b,0x7e,0x24,0x0, 0x8d,0x12,0x3, 0xfa,0x6d,0x33,0x7a,0x35,0x36,0x7e,0x35,0x36, +0x9, 0x53,0x2, 0xb0,0x7c,0x25,0x6c,0x33,0x9, 0x53,0x2, 0xaf,0x12,0x4e,0x82,0x40, +0xec,0x7d,0x37,0x7e,0x8, 0x68,0x1b,0x7e,0x24,0x0, 0x8d,0x12,0x4, 0x96,0xda,0x3b, +0x22,0xb, 0x38,0xe0,0x4d,0xe2,0x1b,0x38,0xe0,0x7e,0xe5,0x36,0xb, 0xe4,0x22,0x7e, +0xe5,0x36,0x3e,0xe4,0x49,0x3e,0x6f,0x77,0x7a,0x35,0x38,0x7f,0x3, 0x2e,0x15,0x36, +0x7e,0xb, 0x50,0x19,0x53,0x1, 0x95,0x7d,0x53,0x5e,0x54,0x0, 0xf, 0x7e,0x24,0x0, +0x1, 0x22,0x7c,0xba,0x54,0xf0,0xc4,0x54,0xf, 0x22,0x7e,0xf1,0x3c,0x74,0xb5,0xac, +0xfb,0x2e,0x74,0x1, 0x0, 0x22,0x7d,0x54,0xb, 0x44,0x7f,0x13,0x2d,0x35,0x7e,0x1b, +0x70,0x22,0x7f,0x13,0x2d,0x34,0x7e,0x1b,0xa0,0x7c,0xba,0x54,0xf, 0x3e,0xb0,0x3e, +0xb0,0x22,0xa, 0x25,0x2d,0x21,0x7d,0x13,0x1e,0x14,0x3e,0x14,0x59,0x21,0x68,0x1b, +0xb, 0x35,0x7a,0x35,0x36,0xbe,0x34,0x1, 0x1a,0x22,0x7e,0x34,0x0, 0xaa,0x12,0x4e, +0xb3,0x7e,0x34,0x0, 0x64,0x12,0x2a,0x8d,0x12,0x4c,0x4d,0x12,0x2c,0x3d,0x7a,0x73, +0x76,0xc0,0x22,0x7a,0x37,0x6f,0x40,0x90,0x21,0x53,0xe4,0x93,0x7a,0xb3,0x6f,0x3f, +0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x78,0x3c,0x12,0x4e,0xb7,0x7e,0x34,0x0, 0x96,0x7a, +0x37,0x6f,0x40,0x12,0x6f,0xc7,0x7e,0x34,0xff,0x38,0x7a,0x37,0x6f,0x44,0x7e,0x34, +0x1, 0x2c,0x7a,0x37,0x6f,0x4c,0x7e,0x34,0xfe,0xd4,0x7a,0x37,0x6f,0x4e,0x12,0xe7, +0x20,0x68,0x42,0x7e,0x34,0x2, 0x58,0x7a,0x37,0x6f,0x46,0x7e,0x34,0x2, 0x26,0x7a, +0x37,0x6f,0x48,0x22,0xbe,0xa0,0x2, 0x78,0x2c,0x7e,0xb3,0x78,0xb0,0xb4,0x3, 0x13, +0x74,0x5c,0x7a,0xb3,0x6f,0x3f,0x7e,0x34,0x0, 0x5c,0x12,0x4f,0x36,0x7e,0x34,0xff, +0xa4,0x80,0xe, 0x12,0x4e,0xb7,0x7e,0x34,0x1, 0x2c,0x12,0x4f,0x36,0x7e,0x34,0xfe, +0xd4,0x7a,0x37,0x6f,0x44,0x22,0x7a,0x37,0x6f,0x40,0x7a,0x37,0x6f,0x42,0x22,0x7a, +0x73,0x6f,0x3f,0x7a,0x27,0x6f,0x40,0x7a,0x17,0x6f,0x42,0x7a,0x7, 0x6f,0x4c,0x6d, +0x33,0x9d,0x30,0x12,0x4c,0x53,0x12,0x2c,0x3d,0x7a,0x73,0x76,0xc0,0x22,0xca,0x3b, +0x12,0xe6,0xe5,0x5e,0x34,0x0, 0x1, 0x68,0x10,0x7f,0x3, 0x12,0x3b,0x4f,0x5e,0x34, +0x0, 0x2, 0x68,0x13,0x12,0x4f,0xe2,0x80,0xe, 0x12,0x4f,0xd9,0x7f,0x3, 0x12,0x3f, +0xc1,0x12,0x49,0xf3,0x12,0x4f,0x8a,0xda,0x3b,0x22,0x7e,0xf, 0x78,0xf2,0x12,0x37, +0xe2,0x12,0x4f,0xce,0x7e,0x70,0x1, 0x12,0x50,0xe1,0x7e,0x70,0x1, 0x12,0x50,0xab, +0x7e,0xb3,0x78,0x97,0x7e,0x70,0x2, 0x12,0x3d,0x35,0x74,0x8c,0x12,0x6a,0xe5,0x7e, +0xf, 0x78,0xf2,0x12,0x37,0xe2,0x5e,0x70,0xef,0x1b,0xa, 0x30,0x12,0x6a,0xe5,0x12, +0x45,0x27,0x5e,0x70,0xef,0x12,0x4f,0xd1,0x7e,0x70,0x1, 0x2, 0x3d,0x35,0x4e,0x70, +0x10,0x1b,0xa, 0x30,0x7e,0xb3,0x78,0x97,0x22,0x75,0x1e,0x0, 0xe4,0x7a,0xb3,0x78, +0x97,0x22,0x75,0x1e,0x2, 0x74,0x2, 0x7a,0xb3,0x78,0x97,0x74,0x1, 0x2, 0x5, 0xbc, +0xc2,0x1d,0x22,0x74,0x3, 0x7a,0xb3,0x77,0xb4,0x22,0x7c,0x9b,0x74,0x3, 0xac,0xb9, +0x9, 0x85,0x29,0xb3,0xbe,0x83,0x77,0x51,0x68,0x8, 0x7e,0x83,0x77,0x51,0x19,0x85, +0x29,0xb3,0x9, 0x85,0x29,0xb4,0xbe,0x83,0x77,0x52,0x68,0x8, 0x7e,0x83,0x77,0x52, +0x19,0x85,0x29,0xb4,0x9, 0x85,0x29,0xb5,0xbe,0x83,0x77,0x53,0x68,0x8, 0x7e,0x83, +0x77,0x53,0x19,0x85,0x29,0xb5,0x7e,0x8, 0x0, 0x71,0x12,0x50,0x47,0x9, 0xb5,0x29, +0xb5,0x12,0x50,0x84,0x2, 0x4, 0x96,0x9, 0xb5,0x29,0xb3,0x12,0xc, 0xea,0x7e,0x8, +0x0, 0x71,0x74,0x3, 0xac,0xb9,0x9, 0xb5,0x29,0xb4,0x12,0xd, 0x8d,0x7e,0x8, 0x0, +0x71,0x74,0x3, 0xac,0xb9,0x22,0x7c,0x9b,0x12,0x50,0x5d,0x12,0x50,0x47,0x12,0xe7, +0x9, 0x4c,0x99,0x78,0x9, 0x7e,0x8, 0x0, 0x71,0x74,0x1, 0x12,0xc, 0xea,0x12,0x50, +0x87,0x2, 0x4, 0x96,0x12,0xd, 0x7, 0x7e,0x37,0x0, 0x71,0x7a,0x37,0x0, 0xad,0x7e, +0x34,0x0, 0x2, 0x7e,0x8, 0x0, 0x71,0x7e,0x24,0x0, 0x1, 0x12,0x3, 0xfa,0x7e,0x34, +0x0, 0x2, 0x7e,0x8, 0x0, 0xad,0x7e,0x24,0x0, 0x1, 0x22,0x70,0x9, 0x12,0x50,0xe9, +0x12,0x50,0x84,0x2, 0x4, 0x96,0x22,0x70,0xc, 0x12,0x50,0xe9,0x12,0xd, 0x8d,0x12, +0x50,0x87,0x2, 0x4, 0x96,0x22,0x12,0x45,0x27,0x12,0x4f,0xce,0x7e,0x73,0x29,0xb3, +0x12,0x3f,0xa8,0x7e,0x73,0x29,0xb4,0x12,0x50,0xe1,0x7e,0x73,0x29,0xb5,0x2, 0x50, +0xab,0x12,0x50,0xb7,0x7e,0xb3,0x78,0x97,0x22,0x5e,0x70,0x3, 0x7e,0x8, 0x0, 0x71, +0x7c,0xb7,0x22,0x7c,0x3b,0xd2,0x4, 0x12,0x51,0xa1,0x12,0xdd,0x97,0x1b,0x30,0x68, +0x1d,0x1b,0x30,0x68,0x23,0x1b,0x30,0x68,0x29,0x1b,0x30,0x68,0x2f,0xb, 0x32,0x78, +0x73,0x12,0x50,0xc6,0x7e,0x1f,0x77,0x95,0x7e,0xf, 0x77,0x91,0x80,0x52,0x7e,0x1f, +0x77,0x9d,0x7e,0xf, 0x77,0x99,0x80,0x48,0x7e,0x1f,0x77,0xa5,0x7e,0xf, 0x77,0xa1, +0x80,0x3e,0x7e,0x1f,0x77,0xad,0x7e,0xf, 0x77,0xa9,0x80,0x34,0x7e,0x34,0x0, 0x8, +0xca,0x39,0x7e,0x71,0x1e,0x74,0x8, 0xac,0x7b,0x2e,0x34,0x77,0x91,0x6d,0x22,0x7e, +0x8, 0x67,0xd3,0x12,0x24,0x13,0x1b,0xfd,0x7e,0x34,0x0, 0x1, 0x7a,0x37,0x67,0xd3, +0x7e,0x73,0x78,0xe9,0x7a,0x73,0x67,0xd5,0x7e,0x1f,0x67,0xd7,0x7e,0xf, 0x67,0xd3, +0x7a,0x1d,0x3a,0x7a,0xd, 0x36,0x12,0x2, 0x3d,0x74,0x1, 0x7a,0xb3,0x77,0xb4,0x12, +0xd, 0xbd,0x80,0x2, 0xc2,0x4, 0xa2,0x4, 0x22,0x12,0xdb,0x28,0x38,0x2, 0xe4,0x22, +0x7e,0xa3,0x77,0xb2,0x74,0x7, 0xa4,0x49,0x55,0x77,0xbd,0x12,0x50,0xf3,0xe4,0x33, +0x22,0xe5,0x1e,0x70,0x21,0x7e,0x37,0x78,0x94,0x4d,0x33,0x78,0xf8,0x12,0x51,0xc7, +0x7e,0x34,0x0, 0x5, 0x7a,0x37,0x78,0x94,0xbe,0x34,0x0, 0x21,0x28,0x8, 0x7e,0x34, +0x0, 0x21,0x7a,0x37,0x78,0x94,0x22,0x7e,0x73,0x76,0xc9,0x7e,0xb3,0x76,0xe4,0x70, +0x3a,0xe5,0x1e,0x70,0x1d,0x7e,0x63,0x76,0xc7,0xbe,0x60,0x14,0x28,0x5, 0x7e,0x60, +0x14,0x80,0x7, 0xa5,0xbe,0x0, 0x3, 0x7e,0x60,0x1, 0xa, 0x26,0x7e,0x34,0x0, 0x64, +0x80,0x74,0xe5,0x1e,0xb4,0x3, 0x2, 0x80,0x44,0x12,0x52,0x85,0xb4,0x1, 0x6, 0x7e, +0x34,0x1, 0xf4,0x80,0x61,0x7e,0x34,0x3, 0xe8,0x80,0x5b,0xe5,0x1e,0x70,0xe, 0x7e, +0x63,0x76,0xc8,0xbe,0x60,0x7f,0x28,0x53,0x7e,0x60,0x7f,0x80,0x4e,0x7e,0x63,0x78, +0xea,0xbe,0x60,0x3b,0x40,0x12,0x12,0x52,0x85,0xb4,0x1, 0x6, 0x7e,0x34,0x1, 0xf4, +0x80,0x26,0x7e,0x34,0x3, 0xe8,0x80,0x20,0xe5,0x1e,0xb4,0x3, 0x8, 0x7e,0x73,0x76, +0xfe,0xa, 0x37,0x80,0x15,0x30,0x1b,0x18,0x12,0x52,0x85,0xb4,0x1, 0x6, 0x7e,0x34, +0x1, 0xf4,0x80,0x4, 0x7e,0x34,0x3, 0xe8,0x8d,0x32,0x1b,0x34,0x7c,0x67,0x80,0xb, +0xa, 0x27,0x7e,0x34,0x3, 0xe8,0x12,0x22,0x71,0x7c,0x67,0x7e,0x73,0x76,0xeb,0xac, +0x67,0x7e,0x24,0x0, 0x18,0x12,0x22,0x71,0x7a,0x73,0x78,0x8a,0xc2,0x15,0x6d,0x33, +0x7a,0x37,0x78,0x86,0x22,0x7e,0xb3,0x78,0x8f,0xa, 0x27,0x22,0xca,0xf8,0x7e,0xf3, +0x78,0x97,0x20,0xc, 0x6, 0x20,0xd, 0x3, 0x30,0xf, 0x3, 0xc3,0x80,0x4d,0x12,0x52, +0xee,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x12,0x57,0xd8,0x4d,0x22,0x68,0x3b,0x7e, +0xb3,0x77,0x5f,0x70,0x3, 0x12,0x57,0xcf,0x12,0xe7,0x10,0x12,0xdf,0xb, 0x40,0x3, +0xc3,0x80,0x28,0x20,0xc, 0x6, 0x20,0xd, 0x3, 0x30,0xf, 0x3, 0xc3,0x80,0x1c,0x12, +0x52,0xee,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x6e,0x70,0xff,0x5e,0x73,0x73,0xd4, +0x7a,0x73,0x73,0xd4,0x12,0x51,0xc7,0xd3,0x80,0x1, 0xd3,0xda,0xf8,0x22,0x7e,0x34, +0x0, 0x1, 0x7c,0xbf,0x22,0xca,0xf8,0xc2,0x0, 0x7e,0xf3,0x78,0x97,0x20,0xc, 0x6, +0x20,0xd, 0x3, 0x30,0xf, 0x3, 0xc3,0x61,0x97,0x7e,0x24,0x0, 0x1, 0x7c,0xbf,0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x73,0x73,0xd5,0x6c,0x66,0x5c,0x75,0x4d,0x33, +0x68,0x74,0x7c,0xbf,0x12,0x58,0x1, 0x50,0x2, 0xd2,0x0, 0xd2,0x4, 0x12,0x3c,0x96, +0xa2,0x0, 0x92,0x1, 0x7c,0xbf,0x12,0x36,0xea,0x40,0x3, 0xc3,0x80,0x59,0x7c,0xbf, +0x7e,0x73,0x75,0xbb,0x12,0x36,0xc3,0xe4,0x7c,0x7f,0x12,0x99,0x25,0xa2,0x0, 0x92, +0x3, 0x7e,0xf, 0x24,0x64,0x7e,0x18,0x18,0x3c,0x7c,0xbf,0x12,0x65,0x99,0x12,0x36, +0xbd,0x20,0xc, 0x6, 0x20,0xd, 0x3, 0x30,0xf, 0x3, 0xc3,0x80,0x2a,0x12,0x3b,0xdc, +0x12,0x53,0x9a,0xc2,0x1, 0x12,0x29,0x5a,0x12,0x52,0xee,0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0x6e,0x70,0xff,0x5e,0x73,0x73,0xd5,0x7a,0x73,0x73,0xd5,0x12,0x54,0x92, +0x12,0x51,0xc7,0xd3,0x80,0x1, 0xd3,0xda,0xf8,0x22,0xca,0x79,0x7e,0x68,0x14,0x30, +0x7e,0xb3,0x78,0x97,0xb4,0x3, 0x4, 0x7e,0x68,0x1c,0x48,0x7e,0x73,0x6f,0x65,0x7a, +0x73,0x63,0x98,0x7e,0x73,0x6f,0x64,0x7a,0x73,0x63,0x97,0xe4,0x7a,0xb3,0x63,0x99, +0x7a,0xb3,0x63,0x9a,0x6d,0x33,0x7a,0x37,0x63,0xa1,0x6c,0xff,0x7e,0x70,0x26,0xac, +0x7f,0x9, 0xb3,0x75,0x44,0x70,0x2, 0x81,0x66,0x7e,0xb3,0x78,0x97,0xb4,0x3, 0xa, +0x49,0xf3,0x75,0x5b,0x49,0xe3,0x75,0x59,0x80,0x8, 0x49,0xf3,0x75,0x53,0x49,0xe3, +0x75,0x51,0x7d,0x3f,0x7a,0x37,0x63,0x9b,0x7d,0x3d,0x7a,0x37,0x63,0x9d,0x7d,0x3f, +0x7a,0x37,0x63,0x9f,0x12,0x54,0x7b,0x7e,0xb7,0x73,0xd6,0x6c,0xee,0xa, 0xe, 0x2d, +0xb, 0x3e,0x4, 0x7f,0x16,0x2d,0x30,0xb, 0x1a,0x10,0x7f,0x17,0x12,0x54,0x82,0x78, +0xec,0x12,0x57,0xfd,0x50,0x35,0x12,0x54,0x72,0x7d,0xa3,0x7a,0xa7,0x63,0x9b,0x7e, +0xa4,0x18,0x3c,0x7a,0xa7,0x63,0x9d,0x12,0x54,0x72,0x7d,0xa3,0x7a,0xa7,0x63,0x9f, +0x12,0x54,0x7b,0x6c,0xee,0xa, 0xe, 0x2d,0xb, 0x3e,0x4, 0x49,0x10,0x18,0x3c,0x12, +0x54,0x72,0x49,0x25,0x75,0x55,0x12,0x54,0x82,0x78,0xea,0x6c,0xaa,0x7e,0x70,0x26, +0xac,0x7f,0x19,0xa3,0x75,0x44,0xb, 0xf0,0xbe,0xf0,0x3, 0x50,0x2, 0x61,0xcc,0xda, +0x79,0x22,0x74,0x26,0xac,0xbf,0x49,0x35,0x75,0x57,0x22,0x7e,0x8, 0x63,0x97,0x2, +0x8, 0xe5,0x2d,0x30,0xb, 0x1a,0xa0,0x9d,0xa1,0x1b,0x1a,0xa0,0xb, 0xe0,0xbe,0xe0, +0x4, 0x22,0xe4,0x7a,0xb3,0x78,0x9c,0x2, 0x54,0x9a,0x6d,0x33,0x7a,0x37,0x78,0xeb, +0x22,0xca,0x3b,0x7c,0xf7,0x7c,0xeb,0x75,0x28,0x7, 0x7e,0x34,0x1, 0x77,0x7a,0x35, +0x2b,0x75,0x2d,0x0, 0x7e,0x34,0x26,0xca,0x7e,0x24,0x0, 0xff,0x7e,0x14,0x63,0x97, +0x7e,0x54,0x2, 0x3c,0x12,0x23,0x67,0x6d,0x66,0x80,0xe, 0x7e,0x34,0x7f,0xff,0x7d, +0x26,0x3e,0x24,0x59,0x32,0x10,0x24,0xb, 0x64,0x7e,0x37,0x73,0xd6,0x7d,0x23,0xb, +0x26,0xbd,0x26,0x38,0xe6,0x2e,0x34,0x0, 0x8, 0x12,0x35,0xa4,0x12,0x57,0x1f,0xe4, +0x12,0x24,0x38,0x7e,0xb3,0x78,0xe5,0xb4,0x1, 0xa, 0x7e,0x37,0x78,0xe6,0x12,0x4c, +0x5d,0x7a,0x35,0x2b,0x74,0xa, 0xac,0xbe,0x49,0x25,0x29,0x8d,0x7e,0x35,0x2b,0xad, +0x32,0x9, 0xb5,0x29,0x8b,0x60,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80, +0x14,0x78,0xf4,0x7a,0x35,0x2b,0xe5,0x28,0xa, 0x5b,0x1b,0x54,0xf5,0x27,0xc1,0x87, +0xe5,0x27,0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7a,0x35,0x29, +0x12,0x2d,0x3d,0xe5,0x27,0xbe,0xb0,0x7, 0x58,0x13,0x6d,0x66,0x80,0xa, 0x12,0x35, +0x9f,0x7d,0x21,0x2d,0x26,0x12,0x57,0xee,0x12,0x57,0x26,0x38,0xf1,0x6d,0x66,0x12, +0x35,0x9f,0x7e,0x27,0x73,0xd6,0x2d,0x26,0x2d,0x21,0x12,0x57,0xee,0xbe,0x64,0x0, +0x4, 0x78,0xec,0x7c,0xbe,0x12,0x35,0xa4,0x12,0x57,0x1f,0x12,0x4c,0x66,0x5, 0x2d, +0xe5,0x2d,0x54,0x1, 0xb4,0x1, 0x8, 0x74,0x1, 0x7a,0xb3,0x78,0xe9,0x80,0xe, 0x7e, +0x73,0x78,0x8e,0xa, 0x37,0x1e,0x34,0xb, 0x34,0x7a,0x73,0x78,0xe9,0x12,0x3c,0x91, +0xe5,0x27,0xbe,0xb0,0x7, 0x58,0x66,0x6d,0x66,0x80,0x5d,0x7d,0x56,0x3e,0x54,0x49, +0x35,0xc, 0x18,0x7d,0x43,0x12,0x57,0xc7,0x8, 0x7, 0x7d,0x23,0x9e,0x25,0x2b,0x80, +0x4, 0x6d,0x22,0x9d,0x24,0x7a,0x25,0x2e,0x49,0x25,0x10,0x24,0x7d,0x42,0x12,0x57, +0xc7,0x8, 0x5, 0x9e,0x25,0x2b,0x80,0x4, 0x6d,0x22,0x9d,0x24,0x7a,0x25,0x30,0xbe, +0x25,0x2e,0x40,0x13,0x59,0x35,0x10,0x24,0x12,0x35,0xa4,0x7d,0x21,0x2d,0x26,0x9, +0x52,0x4e,0xa8,0x19,0x56,0x63,0x97,0xbe,0x35,0x2b,0x50,0xa, 0x12,0x57,0x2d,0x7d, +0x23,0x2d,0x26,0x12,0x57,0xe1,0xb, 0x64,0x12,0x57,0x26,0x38,0x9e,0x6d,0x66,0x7e, +0x17,0x73,0xd6,0x2d,0x16,0x7d,0x51,0x3e,0x54,0x49,0x5, 0xc, 0x18,0x7d,0x30,0x12, +0x57,0xbf,0x8, 0x7, 0x7d,0x40,0x9e,0x45,0x2b,0x80,0x4, 0x6d,0x44,0x9d,0x43,0x7a, +0x45,0x2e,0x49,0x45,0x10,0x24,0x7d,0x34,0x12,0x57,0xbf,0x8, 0x5, 0x9e,0x45,0x2b, +0x80,0x4, 0x6d,0x44,0x9d,0x43,0x7a,0x45,0x30,0xbe,0x45,0x2e,0x40,0x11,0x59,0x5, +0x10,0x24,0x12,0x57,0x32,0x2d,0x31,0x9, 0x73,0x4e,0xa8,0x19,0x71,0x63,0x97,0xbe, +0x5, 0x2b,0x50,0xa, 0x12,0x57,0x2d,0x7d,0x23,0x2d,0x21,0x12,0x57,0xe1,0xb, 0x64, +0xbe,0x64,0x0, 0x4, 0x78,0x99,0x30,0xc, 0x2, 0xe1,0x1c,0x30,0xd, 0x2, 0xe1,0x1c, +0x30,0xf, 0x2, 0xe1,0x1c,0x15,0x27,0xe5,0x27,0xbe,0xb0,0x1, 0x48,0x2, 0xa1,0x30, +0x7e,0xb3,0x77,0x51,0xbe,0xb0,0x2, 0x68,0x6f,0x12,0xe7,0x18,0x68,0x6a,0x7e,0x8, +0x10,0x24,0x74,0xa, 0xac,0xbe,0x12,0x66,0x46,0x6d,0x66,0x80,0x25,0x7d,0x26,0x3e, +0x24,0x49,0x32,0x10,0x24,0xbe,0x34,0x3, 0xe8,0x28,0x15,0xbe,0x34,0x3e,0x80,0x50, +0xf, 0x9, 0x76,0x63,0x97,0x12,0x35,0xa4,0x7d,0x21,0x2d,0x26,0x19,0x72,0x4e,0xa8, +0xb, 0x64,0x12,0x57,0x26,0x38,0xd6,0x6d,0x66,0x7e,0x27,0x73,0xd6,0x2d,0x26,0x7d, +0x12,0x3e,0x14,0x49,0x31,0x10,0x24,0xbe,0x34,0x3, 0xe8,0x28,0x13,0xbe,0x34,0x3e, +0x80,0x50,0xd, 0x9, 0x72,0x63,0x97,0x12,0x35,0xa4,0x2d,0x21,0x19,0x72,0x4e,0xa8, +0xb, 0x64,0xbe,0x64,0x0, 0x4, 0x78,0xd1,0x74,0x1, 0x7a,0xb3,0x78,0xe9,0x7c,0xbe, +0x12,0x35,0xa4,0x12,0x57,0x1f,0x12,0x4c,0x66,0x12,0x54,0x92,0xda,0x3b,0x22,0x2e, +0x14,0x4e,0xa8,0x6d,0x0, 0x22,0x7e,0x37,0x73,0xd6,0xbd,0x36,0x22,0x7e,0x55,0x29, +0x64,0xff,0xa, 0x2f,0x7e,0x34,0x2, 0x3c,0xad,0x32,0x22,0xca,0x3b,0x7c,0xeb,0x7e, +0xd0,0x4, 0x7e,0xb3,0x76,0xe6,0xb4,0x1, 0x5, 0x7e,0xf0,0x2, 0x80,0x3, 0x7e,0xf0, +0x1, 0x4c,0xee,0x68,0x5f,0x6c,0xcc,0x80,0x4b,0x4c,0xcc,0x78,0xc, 0x7e,0xb3,0x76, +0xe6,0xb4,0x1, 0x5, 0xe4,0x6c,0x77,0x80,0xc, 0x7c,0xde,0xe4,0x7e,0x70,0x3, 0xac, +0x7e,0x9, 0x73,0x29,0xb3,0x12,0x3d,0x35,0x7e,0x34,0x0, 0x1, 0x7c,0xbd,0x60,0x5, +0x3e,0x34,0x14,0x78,0xfb,0x12,0x57,0xd8,0x4d,0x22,0x68,0xa, 0x12,0x57,0xcf,0x7c, +0xbe,0x7c,0x7d,0x12,0x54,0xa1,0x20,0xc, 0x6, 0x20,0xd, 0x3, 0x30,0xf, 0x3, 0xc3, +0x80,0x1a,0xb, 0xc0,0xbc,0xfc,0x38,0xb1,0x7e,0xb3,0x73,0xd4,0x54,0xef,0x7a,0xb3, +0x73,0xd4,0x80,0x7, 0x7c,0xbe,0x7c,0x7e,0x12,0x54,0xa1,0xd3,0xda,0x3b,0x22,0x9e, +0x35,0x2b,0xbe,0x34,0x0, 0x0, 0x22,0x9e,0x45,0x2b,0xbe,0x44,0x0, 0x0, 0x22,0x4e, +0x73,0x73,0xd5,0x7a,0x73,0x73,0xd5,0x22,0x7e,0x53,0x73,0xd4,0x6c,0x44,0x5c,0x57, +0x22,0x2e,0x24,0x4e,0xa8,0x7e,0x29,0x70,0x5c,0x7b,0x7a,0x29,0x70,0x22,0x2e,0x24, +0x4e,0xa8,0x7e,0x29,0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0x64,0x22,0x7e,0xb3,0x78, +0x97,0x7c,0xab,0xd2,0x2, 0x7e,0xb3,0x78,0x8f,0x70,0x4, 0xc2,0x2, 0x80,0xb, 0x4c, +0xaa,0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x2, 0xc2,0x2, 0xa2,0x2, 0x22,0xca,0x3b,0x7c, +0x67,0x7c,0x7b,0x6d,0x22,0x7a,0x25,0x29,0x7e,0x27,0x73,0xd6,0xb, 0x26,0x7a,0x25, +0x2b,0x7c,0xb6,0x12,0x58,0x1, 0x92,0x1, 0x30,0x1, 0x6, 0x4c,0x77,0x78,0x2, 0x21, +0xb1,0x12,0x5a,0x15,0x7a,0xa1,0x33,0x74,0x26,0xa4,0x49,0xb5,0x75,0x53,0x49,0xa5, +0x75,0x51,0x49,0x95,0x75,0x57,0x49,0x85,0x75,0x55,0x7e,0x34,0x63,0x6f,0x1e,0x34, +0x3e,0x34,0x7d,0x73,0x6d,0x66,0x7e,0x34,0x67,0x7d,0x1e,0x34,0x3e,0x34,0x6d,0x22, +0x7a,0x1d,0x2d,0x7e,0x18,0xc, 0x18,0x7a,0x1d,0x34,0x7f,0x3, 0x7e,0x18,0x10,0x24, +0x74,0x1, 0x12,0x59,0xe5,0x12,0x59,0xb4,0x6d,0x33,0x7a,0x35,0x27,0x7e,0x35,0x31, +0x7d,0x13,0x3e,0x14,0x49,0x1, 0xc, 0x18,0x49,0x21,0x10,0x24,0x9d,0x20,0x2d,0x17, +0x7d,0x6, 0x12,0x59,0xbc,0x78,0xe6,0x20,0x1, 0x2, 0x21,0x2a,0x7e,0x73,0x75,0xbb, +0xbe,0x71,0x33,0x68,0x3a,0x6d,0x33,0x80,0x29,0x7e,0x35,0x27,0x7d,0x23,0x3e,0x24, +0x7f,0x4, 0x2d,0x12,0xb, 0xa, 0x50,0x49,0x42,0x18,0x3c,0x2d,0x45,0x7f,0x5, 0x2d, +0x12,0xb, 0xa, 0x10,0x49,0x52,0x14,0x30,0x2d,0x51,0x12,0x59,0xd9,0x1b,0xa, 0x20, +0xb, 0x34,0x7a,0x35,0x27,0x7e,0x35,0x2b,0xbe,0x35,0x27,0x38,0xcc,0x80,0x3b,0x7e, +0x18,0x18,0x3c,0x7a,0x1d,0x34,0x7e,0xd, 0x2d,0x7e,0x18,0x14,0x30,0x74,0x1, 0x12, +0x59,0xe5,0x7e,0x1d,0x2d,0x7a,0x1d,0x34,0x7f,0x3, 0x7f,0x13,0x12,0x5a,0x3c,0x12, +0x59,0xb4,0x6d,0x33,0x7a,0x35,0x27,0x12,0x59,0xd1,0x49,0x42,0x18,0x3c,0x49,0x52, +0x14,0x30,0x12,0x59,0xd9,0x12,0x59,0xbc,0x78,0xed,0x7f,0x3, 0x12,0xd0,0x2d,0x7a, +0x35,0x29,0x12,0x59,0xb4,0x6d,0x33,0x7a,0x35,0x27,0x12,0x59,0xd1,0x7f,0x23,0x2d, +0x52,0xb, 0x2a,0x10,0xbe,0x14,0x0, 0x0, 0x8, 0x5, 0xb, 0x2a,0x20,0x80,0x4, 0x6d, +0x22,0x9d,0x21,0xbe,0x25,0x29,0x28,0x12,0xbe,0x14,0x0, 0x0, 0x8, 0x5, 0xb, 0x2a, +0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0x7a,0x25,0x29,0x12,0x59,0xbf,0x78,0xcb,0x7e, +0x35,0x29,0xbe,0x34,0x7f,0xff,0x28,0x7, 0x7e,0x34,0x7f,0xff,0x7a,0x35,0x29,0x7e, +0x35,0x29,0x7a,0x37,0x75,0xb1,0x20,0x1, 0x28,0x7e,0x8, 0x10,0x24,0x7e,0x18,0xc, +0x18,0x12,0x5a,0x55,0x12,0x59,0xb4,0x6d,0x33,0x7a,0x35,0x27,0x7e,0x25,0x31,0x3e, +0x24,0x49,0x32,0xc, 0x18,0x59,0x32,0x10,0x24,0x7e,0x35,0x31,0x12,0x59,0xbf,0x78, +0xeb,0xda,0x3b,0x22,0x7e,0x37,0x73,0xd6,0x7a,0x35,0x31,0x22,0x1b,0xa, 0x20,0xb, +0x34,0x7a,0x35,0x31,0x7e,0x35,0x27,0xb, 0x34,0x7a,0x35,0x27,0xbe,0x34,0x0, 0x4, +0x22,0x7e,0x35,0x31,0x7d,0x23,0x3e,0x24,0x22,0x9d,0x54,0x7f,0x3, 0x2d,0x12,0xb, +0xa, 0x20,0x2d,0x25,0x22,0x7c,0xab,0x7f,0x61,0x7f,0x70,0x7e,0x8, 0x6b,0x89,0x12, +0x5f,0xef,0x7e,0xb3,0x6f,0x65,0x7a,0xb3,0x6b,0x8a,0x7e,0xb3,0x6f,0x64,0x7a,0xb3, +0x6b,0x89,0xe4,0x12,0x5a,0x9b,0x12,0x5a,0x69,0x7a,0xa3,0x6b,0x8c,0x6d,0x33,0x12, +0x5a,0x4c,0x2, 0x8, 0xe5,0x7e,0xb3,0x75,0xb0,0x12,0x5a,0x1f,0x7c,0xab,0x22,0x7c, +0x7b,0x6c,0xaa,0x6c,0x66,0xa, 0x26,0x12,0x5d,0x3d,0xbc,0xb7,0x78,0x4, 0x7c,0xa6, +0x80,0x7, 0xb, 0x60,0xbe,0x60,0x3, 0x40,0xec,0x7c,0xba,0x22,0x12,0x5a,0x7b,0x12, +0x5a,0x69,0x7e,0x34,0x0, 0x10,0x12,0x5a,0x4c,0x2, 0x8, 0xe5,0x7a,0x37,0x6b,0x93, +0x7e,0x8, 0x6b,0x89,0x22,0x12,0x5a,0x7b,0x7a,0x37,0x6b,0x8d,0x12,0x5a,0x74,0x7e, +0x34,0x0, 0x20,0x12,0x5a,0x4c,0x2, 0x8, 0xe5,0x7a,0x37,0x6b,0x8d,0x7e,0x1d,0x34, +0x7a,0x37,0x6b,0x8f,0x7d,0x3f,0x7a,0x37,0x6b,0x91,0x22,0x7f,0x61,0x7f,0x70,0x7e, +0x8, 0x6b,0x89,0x7e,0x34,0x0, 0xc, 0xe4,0x12,0x24,0x38,0x7e,0x73,0x6f,0x65,0x7a, +0x73,0x6b,0x8a,0x7e,0x73,0x6f,0x64,0x7a,0x73,0x6b,0x89,0x7a,0xb3,0x6b,0x8b,0x7d, +0x3d,0x22,0xca,0xf8,0x7e,0xb3,0x73,0xd3,0x70,0x8, 0x12,0x5b,0x2f,0x12,0x5a,0x55, +0x80,0xf, 0x7e,0x1f,0x24,0x64,0x7a,0x1d,0x34,0x12,0x5b,0x2f,0x74,0x1, 0x12,0x59, +0xe5,0x7e,0x37,0x73,0xd6,0x90,0x1c,0x2b,0xe4,0x93,0x70,0x13,0x6c,0xff,0x6d,0x22, +0x7d,0x53,0x12,0x5b,0x26,0x1b,0xa, 0x20,0x12,0x5b,0x15,0x78,0xf1,0x80,0x33,0x6c, +0xff,0x7e,0xb3,0x73,0xd3,0xb4,0x1, 0x17,0x7d,0x53,0x3e,0x54,0x7e,0xf, 0x24,0x64, +0x2d,0x15,0xb, 0xa, 0x40,0x12,0x5b,0x1f,0xb, 0xa, 0x20,0x9d,0x24,0x80,0x8, 0x7d, +0x53,0x12,0x5b,0x1d,0xb, 0xa, 0x20,0x12,0x5b,0x28,0x1b,0xa, 0x20,0x12,0x5b,0x15, +0x78,0xcf,0xda,0xf8,0x22,0xb, 0x34,0xb, 0xf0,0xbe,0xf0,0x4, 0x22,0x3e,0x54,0x7e, +0xf, 0x24,0x60,0x2d,0x15,0x22,0x3e,0x54,0x7e,0xf, 0x24,0x68,0x2d,0x15,0x22,0x7e, +0xf, 0x24,0x68,0x7e,0x1f,0x24,0x60,0x22,0xca,0x3b,0xd2,0x0, 0x12,0x46,0xaf,0x50, +0xfb,0xa2,0x2f,0xe4,0x33,0x7c,0xcb,0x7e,0xe3,0x77,0xbb,0x7a,0xe3,0x25,0xaf,0x7e, +0xd3,0x77,0xbc,0xa, 0x3e,0x9, 0xb3,0x77,0xb5,0x60,0x38,0xa, 0x3b,0x1b,0x34,0x7c, +0xa7,0x7a,0xa3,0x77,0x5c,0xb4,0x1, 0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x7a,0xb3,0x25, +0xae,0xe4,0xa, 0x3e,0x19,0xb3,0x77,0xb5,0x9, 0xf3,0x77,0xb7,0x7c,0xbe,0x7c,0x7f, +0x12,0x99,0x25,0x7c,0xbe,0x7c,0x7f,0x12,0xcf,0x64,0x7e,0xb3,0x77,0xbb,0x4, 0x7a, +0xb3,0x77,0xbb,0x7e,0x73,0x77,0xbc,0xbe,0x73,0x77,0xbb,0x38,0x15,0x12,0x29,0x7d, +0x12,0xc5,0xc0,0x7e,0x73,0x77,0x2e,0x2e,0x70,0xff,0x92,0x5, 0x12,0x3c,0xb2,0x12, +0x3b,0x6e,0x7e,0xb3,0x25,0xae,0xbe,0xb0,0x1, 0x68,0x7, 0x7e,0xb3,0x78,0xb0,0xb4, +0x3, 0x46,0x74,0xa, 0xac,0xbf,0x49,0x35,0x29,0x8d,0x7e,0xf, 0x24,0x60,0x12,0x66, +0x4a,0x7c,0xbe,0x7c,0x7f,0x12,0x5c,0x3a,0x92,0x0, 0x7e,0xb3,0x78,0x8f,0x70,0xc, +0xbe,0xe0,0x1, 0x40,0x7, 0xe4,0x7a,0xb3,0x25,0xae,0xc2,0x0, 0x7c,0xbe,0x7c,0x7f, +0x12,0x58,0x1d,0x30,0x0, 0x12,0x12,0x5a,0xa2,0x7c,0xbe,0x7c,0x7f,0x12,0x5c,0x96, +0x7a,0xe3,0x77,0x5d,0x7a,0xf3,0x78,0x9b,0x7e,0xb3,0x78,0xb0,0xb4,0x1, 0x3, 0x12, +0x9f,0xf7,0x4c,0xcc,0x68,0x8, 0x12,0x5f,0xf7,0xe4,0x7a,0xb3,0x25,0xae,0x7c,0xbd, +0x14,0xbc,0xbe,0x78,0x3, 0x12,0xb, 0xe5,0x12,0xd8,0x88,0x12,0x5d,0x4a,0x50,0x7, +0x7c,0xbf,0x7c,0x7e,0x12,0xc3,0xa1,0xda,0x3b,0x22,0x7c,0x67,0x7c,0x7b,0xd2,0x1, +0x7e,0xb3,0x78,0xb0,0xb4,0x3, 0x4c,0x7c,0xb6,0x12,0x58,0x1, 0x50,0x45,0x7e,0xa3, +0x77,0x3a,0xbe,0xa0,0x2, 0x40,0x32,0x7e,0xb3,0x77,0x42,0x70,0x28,0x7e,0x63,0x29, +0xff,0xa, 0x26,0x2e,0x24,0x0, 0xe, 0x12,0x5d,0x41,0x24,0xff,0x92,0x1, 0x7c,0xb6, +0x4, 0x7a,0xb3,0x29,0xff,0x7e,0x63,0x29,0xff,0xbe,0x60,0x4, 0x40,0x15,0xe4,0x7a, +0xb3,0x29,0xff,0x80,0xe, 0xd2,0x1, 0x80,0xa, 0xbc,0xa7,0x78,0x4, 0xd2,0x1, 0x80, +0x2, 0xc2,0x1, 0xa2,0x1, 0x22,0x7c,0x37,0x7c,0x2b,0x7e,0xb3,0x73,0xd3,0x70,0x2, +0xa1,0x3c,0x12,0x5a,0x15,0x7e,0xb3,0x75,0xbb,0xbc,0xba,0x78,0x2, 0xa1,0x3c,0xa5, +0xba,0x0, 0x1b,0x7e,0x90,0x26,0xac,0x9a,0x49,0xf4,0x75,0x53,0x49,0xe4,0x75,0x51, +0xa5,0xbb,0x3, 0x15,0x49,0xf4,0x75,0x5b,0x49,0xe4,0x75,0x59,0x80,0xb, 0x74,0x26, +0xa4,0x49,0xf5,0x75,0x57,0x49,0xe5,0x75,0x55,0x7e,0x73,0x6f,0x65,0x7a,0x73,0x63, +0x6e,0x7e,0x73,0x6f,0x64,0x7a,0x73,0x63,0x6d,0xe4,0x7a,0xb3,0x63,0x6f,0x7a,0xb3, +0x63,0x70,0x6d,0x33,0x7a,0x37,0x63,0x77,0x7e,0x1f,0x24,0x68,0x7a,0x37,0x63,0x71, +0x7d,0x3f,0x7a,0x37,0x63,0x73,0x7e,0x1f,0x24,0x68,0x7a,0x37,0x63,0x75,0x7e,0x8, +0x63,0x6d,0x12,0x8, 0xe5,0x7e,0x37,0x73,0xd6,0x6c,0x55,0xa, 0x15,0x2d,0x13,0x3e, +0x14,0x7f,0x27,0x2d,0x51,0xb, 0x2a,0x0, 0x7e,0x2f,0x24,0x68,0x2d,0x51,0xb, 0x2a, +0x10,0x9d,0x10,0x1b,0x2a,0x10,0xb, 0x50,0xa5,0xbd,0x4, 0xdf,0x22,0x2e,0x24,0x22, +0x29,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0x22,0xe5,0x1e,0x70,0xc, 0x7e,0x73, +0x78,0x96,0xbe,0x73,0x78,0x9c,0x40,0x2, 0xc3,0x22,0xd3,0x22,0xca,0xf8,0x12,0xce, +0x27,0x12,0x5d,0xcf,0x12,0x5d,0x4a,0x40,0x5, 0xe4,0x7a,0xb3,0x6d,0xc2,0x7e,0xb3, +0x6d,0xc2,0x60,0xb, 0xe4,0x7a,0xb3,0x78,0xce,0x74,0x1f,0x7a,0xb3,0x73,0xd5,0x12, +0x5d,0x4a,0x40,0x6, 0x12,0x5f,0xdf,0x12,0xe3,0x39,0x7e,0xb3,0x6d,0xc5,0x60,0x6, +0x74,0x2, 0x7a,0xb3,0x78,0xd5,0x7e,0xf3,0x78,0xd5,0xbe,0xf0,0x0, 0x28,0x23,0xe5, +0x1e,0xb4,0x1, 0x14,0x7e,0xb3,0x76,0xe4,0xb4,0x1, 0xd, 0x7e,0xb3,0x78,0xea,0xbe, +0xb0,0x3c,0x68,0x4, 0x70,0xc, 0x80,0x0, 0x7c,0xbf,0x14,0x7a,0xb3,0x78,0xd5,0x12, +0xe1,0x67,0x7e,0xb3,0x6d,0xc8,0x60,0x4, 0xe4,0x12,0xe0,0x77,0xda,0xf8,0x22,0x12, +0xc8,0x68,0x12,0x5f,0x4, 0x12,0x7e,0x27,0x2, 0x5d,0xdb,0x7e,0xb3,0x6d,0xc2,0xb4, +0x1, 0x18,0x12,0x5f,0xd5,0xbe,0x73,0x78,0xce,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0xc2, +0x7e,0xb3,0x78,0xce,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x78,0xce,0x7e, +0xb3,0x6d,0xc2,0x70,0x53,0x12,0x5e,0xfd,0x78,0x15,0x7e,0xb3,0x6d,0xc3,0xb4,0x1, +0x7, 0x7e,0xb3,0x78,0xd0,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x78,0xd0,0x80,0x18,0xbe, +0xa0,0x1, 0x78,0x13,0x7e,0xb3,0x6d,0xc4,0xb4,0x1, 0x7, 0x7e,0xb3,0x78,0xd1,0x4, +0x80,0x1, 0xe4,0x7a,0xb3,0x78,0xd1,0x7e,0x73,0x78,0xd0,0xbe,0x70,0x3, 0x50,0x9, +0x7e,0x73,0x78,0xd1,0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x6d,0xc2,0xe4, +0x7a,0xb3,0x78,0xd0,0x7a,0xb3,0x78,0xd1,0x7e,0xb3,0x6d,0xc5,0xb4,0x1, 0x18,0x12, +0x5f,0xd5,0xbe,0x73,0x78,0xcf,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0xc5,0x7e,0xb3,0x78, +0xcf,0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x78,0xcf,0x7e,0xb3,0x6d,0xc5, +0x70,0x53,0x12,0x5e,0xfd,0x78,0x15,0x7e,0xb3,0x6d,0xc6,0xb4,0x1, 0x7, 0x7e,0xb3, +0x78,0xd2,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x78,0xd2,0x80,0x18,0xbe,0xa0,0x1, 0x78, +0x13,0x7e,0xb3,0x6d,0xc7,0xb4,0x1, 0x7, 0x7e,0xb3,0x78,0xd3,0x4, 0x80,0x1, 0xe4, +0x7a,0xb3,0x78,0xd3,0x7e,0x73,0x78,0xd2,0xbe,0x70,0x3, 0x50,0x9, 0x7e,0x73,0x78, +0xd3,0xbe,0x70,0x3, 0x40,0xf, 0x74,0x1, 0x7a,0xb3,0x6d,0xc5,0xe4,0x7a,0xb3,0x78, +0xd2,0x7a,0xb3,0x78,0xd3,0x7e,0xb3,0x6d,0xc8,0xb4,0x1, 0x1a,0x7e,0x73,0x6d,0xb2, +0xbe,0x73,0x78,0xd4,0x28,0xc, 0xe4,0x7a,0xb3,0x6d,0xc8,0x7e,0xb3,0x78,0xd4,0x4, +0x80,0x6, 0x74,0x1, 0x80,0x2, 0x74,0x1, 0x7a,0xb3,0x78,0xd4,0x22,0x7e,0xa3,0x25, +0xaf,0x4c,0xaa,0x22,0xd2,0x0, 0xe4,0x7a,0xb3,0x6d,0xc2,0x7a,0xb3,0x6d,0xc5,0x7e, +0xb3,0x6d,0xb5,0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xc2,0x12,0x5e,0xfd,0x78, +0x14,0xe4,0x7a,0xb3,0x6d,0xc3,0x7e,0xb3,0x6d,0xb6,0xb4,0x1, 0x1f,0x74,0x1, 0x7a, +0xb3,0x6d,0xc3,0x80,0x17,0xbe,0xa0,0x1, 0x78,0x12,0xe4,0x7a,0xb3,0x6d,0xc4,0x7e, +0xb3,0x6d,0xb7,0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xc4,0x7e,0xb3,0x6d,0xb8, +0xb4,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xc5,0x4c,0xaa,0x78,0x14,0xe4,0x7a,0xb3, +0x6d,0xc6,0x7e,0xb3,0x6d,0xb9,0xb4,0x1, 0x1f,0x74,0x1, 0x7a,0xb3,0x6d,0xc6,0x80, +0x17,0xbe,0xa0,0x1, 0x78,0x12,0xe4,0x7a,0xb3,0x6d,0xc7,0x7e,0xb3,0x6d,0xba,0xb4, +0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xc7,0x7e,0xb3,0x6d,0xbe,0x70,0x3, 0x12,0x5f, +0xc9,0x7e,0xb3,0x25,0xae,0x70,0x3, 0x12,0x5f,0xc9,0x7e,0xb3,0x6d,0xc0,0xb4,0x1, +0x3, 0x12,0x5f,0xc9,0x7e,0x34,0x22,0x32,0x12,0x2a,0xa9,0xbe,0x37,0x75,0xb7,0x50, +0x3, 0x12,0x5f,0xc9,0x20,0x0, 0x11,0xe4,0x7a,0xb3,0x6d,0xc3,0x7a,0xb3,0x6d,0xc4, +0x7a,0xb3,0x6d,0xc6,0x7a,0xb3,0x6d,0xc7,0x22,0xe4,0x7a,0xb3,0x6d,0xc2,0x7a,0xb3, +0x6d,0xc5,0xc2,0x0, 0x22,0xe4,0x7a,0xb3,0x6d,0xc8,0x7e,0x73,0x6d,0xb3,0x22,0x7e, +0x18,0x8, 0xc, 0x7a,0x1d,0x34,0x7e,0x1f,0x24,0x64,0x7f,0x1, 0x2, 0x5a,0x3c,0x7e, +0x34,0x0, 0xc, 0xe4,0x2, 0x24,0x38,0x6d,0x22,0x7d,0x32,0x80,0x12,0x7d,0x52,0x12, +0x5b,0x1d,0xb, 0xa, 0x10,0xbe,0x14,0x27,0x10,0x40,0x2, 0xb, 0x34,0xb, 0x24,0x7e, +0x17,0x73,0xd6,0xbd,0x12,0x38,0xe6,0xbe,0x34,0x0, 0x6c,0x28,0x7, 0x7e,0xb3,0x78, +0x26,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x78,0x26,0x7e,0x73,0x78,0x26,0xbe,0x70,0x2, +0x40,0x6, 0x74,0xaa,0x7a,0xb3,0x77,0x2c,0x22,0x6d,0x55,0x80,0x29,0x7d,0xf5,0x3e, +0xf4,0x7f,0x61,0x2d,0xdf,0xb, 0x6a,0x40,0xbe,0x44,0x0, 0x64,0x28,0x16,0x2d,0xf1, +0x7d,0xe0,0xb, 0x7a,0xd0,0xbe,0xd4,0x0, 0x64,0x50,0x2, 0x80,0x4, 0xbd,0xd4,0x28, +0x3, 0x1b,0x7a,0x40,0xb, 0x54,0xbe,0x55,0x29,0x40,0xd2,0x22,0xca,0x3b,0x6d,0x33, +0x7a,0x37,0x4e,0x83,0x7e,0x8, 0x4a,0x71,0x12,0x65,0x91,0x12,0x67,0x91,0x7e,0x34, +0x1, 0x0, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xbf,0x7e,0x34,0x1, 0x1, 0x12,0x7, 0x40, +0x7a,0x37,0x63,0xc3,0x7e,0x34,0x1, 0x2, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xc5,0x7e, +0x34,0x1, 0x6, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xc1,0x7e,0x34,0x1, 0x0, 0x6d,0x22, +0x12,0x6, 0x48,0x7e,0x34,0x1, 0x0, 0x6d,0x22,0x12,0x6, 0xc5,0x12,0x65,0x46,0x12, +0x6, 0x48,0x12,0x65,0x46,0x12,0x6, 0xc5,0x12,0x65,0x3d,0x12,0x6, 0x48,0x12,0x65, +0x3d,0x12,0x6, 0xc5,0x12,0x65,0x75,0x12,0x6, 0x48,0x12,0x65,0x75,0x12,0x6, 0xc5, +0x6d,0x33,0x12,0x7, 0x40,0x7a,0x37,0x63,0xb5,0x7e,0x34,0x0, 0x1, 0x12,0x7, 0x40, +0x7a,0x37,0x63,0xb7,0x7e,0x34,0x0, 0x2, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xb9,0x7e, +0x34,0x0, 0x8, 0x12,0x7, 0x40,0x7a,0x37,0x63,0xbb,0x7e,0x34,0x0, 0x17,0x12,0x7, +0x40,0x7a,0x37,0x63,0xbd,0x12,0x64,0xed,0x5e,0x50,0xe0,0x4e,0x50,0xa, 0x12,0x64, +0xea,0x5e,0x50,0xe0,0x4e,0x50,0xa, 0x12,0x6, 0xc5,0x12,0x65,0x68,0x12,0x6, 0x48, +0x12,0x65,0x68,0x12,0x6, 0xc5,0x12,0x65,0x82,0x12,0x6, 0x48,0x12,0x65,0x82,0x12, +0x6, 0xc5,0x12,0x65,0x4f,0x12,0x6, 0x48,0x12,0x65,0x4f,0x12,0x6, 0xc5,0x12,0x65, +0x5b,0x12,0x6, 0x48,0x12,0x65,0x5b,0x12,0x6, 0xc5,0x12,0x64,0xf4,0x6d,0x66,0x80, +0x30,0x12,0x64,0xe1,0x7e,0xb3,0x6f,0x76,0x70,0x12,0x12,0x64,0xad,0x60,0x5, 0x3e, +0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xc3,0x80,0x10,0x12,0x64,0xad,0x60, +0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xca,0x12,0x64,0xd8,0xb, +0x64,0x12,0x64,0xd1,0xbd,0x36,0x38,0xc9,0x7e,0xb3,0x6f,0x68,0x54,0x1, 0xb4,0x1, +0xb, 0x7e,0x37,0x63,0x6d,0x4e,0x70,0x1, 0x7a,0x37,0x63,0x6d,0x12,0x3c,0x73,0x7e, +0x34,0x4, 0xc, 0xca,0x39,0x7e,0x18,0xc, 0x18,0x7e,0x8, 0x4a,0x71,0x12,0x24,0x13, +0x1b,0xfd,0x7e,0x34,0x0, 0x1, 0x41,0x6c,0x12,0x64,0xf4,0x7e,0x73,0x6f,0x65,0xa, +0x27,0x7e,0x35,0x27,0xad,0x32,0x7d,0x63,0x80,0x59,0x12,0x64,0xe1,0x7e,0x73,0x6f, +0x62,0xa, 0x37,0xbe,0x35,0x27,0x28,0x1e,0x7e,0xb3,0x6f,0x76,0x70,0xc, 0x12,0x64, +0xad,0x60,0x35,0x3e,0x14,0x14,0x78,0xfb,0x80,0x2e,0x12,0x64,0xad,0x60,0x17,0x3e, +0x14,0x14,0x78,0xfb,0x80,0x10,0x7e,0xb3,0x6f,0x76,0x70,0x12,0x12,0x64,0xad,0x60, +0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xca,0x80,0x10,0x12,0x64, +0xad,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xc3,0x12,0x64, +0xd8,0xb, 0x64,0x7e,0x25,0x27,0xb, 0x24,0x12,0x64,0xd1,0xad,0x32,0xbd,0x36,0x38, +0x99,0x7e,0xb3,0x6f,0x68,0x54,0x4, 0xb4,0x4, 0xb, 0x7e,0x37,0x63,0x6d,0x4e,0x70, +0x4, 0x7a,0x37,0x63,0x6d,0x12,0x3c,0x73,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x65, +0x0, 0x12,0x24,0x13,0x1b,0xfd,0x12,0x65,0x12,0x12,0x65,0x9, 0x7a,0x35,0x27,0x7e, +0x73,0x6f,0x64,0xa, 0x37,0xbe,0x35,0x27,0x28,0x2, 0x21,0xc8,0x6d,0x33,0x61,0x19, +0x12,0x64,0xf4,0x7e,0x65,0x27,0x80,0x59,0x12,0x64,0xe1,0x7e,0x37,0x6f,0x6a,0xbd, +0x36,0x28,0x1e,0x7e,0xb3,0x6f,0x76,0x70,0xc, 0x12,0x64,0xad,0x60,0x35,0x3e,0x14, +0x14,0x78,0xfb,0x80,0x2e,0x12,0x64,0xad,0x60,0x17,0x3e,0x14,0x14,0x78,0xfb,0x80, +0x10,0x7e,0xb3,0x6f,0x76,0x70,0x12,0x12,0x64,0xad,0x60,0x5, 0x3e,0x14,0x14,0x78, +0xfb,0x12,0x64,0xb8,0x12,0x64,0xca,0x80,0x10,0x12,0x64,0xad,0x60,0x5, 0x3e,0x14, +0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xc3,0x12,0x64,0xd8,0x12,0x64,0xd1,0x2d, +0x63,0x7e,0xa3,0x6f,0x65,0x7e,0xb3,0x6f,0x64,0xa4,0xbd,0x56,0x38,0x9a,0x7e,0xb3, +0x6f,0x69,0x54,0x1, 0xb4,0x1, 0xb, 0x7e,0x37,0x63,0x91,0x4e,0x70,0x1, 0x7a,0x37, +0x63,0x91,0x12,0x3c,0x73,0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x65,0x0, 0x12,0x24, +0x13,0x1b,0xfd,0x12,0x65,0x12,0x12,0x65,0x9, 0x7a,0x35,0x27,0x12,0x64,0xd1,0xbe, +0x35,0x27,0x28,0x2, 0x41,0x80,0x12,0x64,0xf4,0x7e,0xb3,0x6f,0x69,0x54,0x4, 0xb4, +0x4, 0xb, 0x7e,0x37,0x63,0x91,0x4e,0x70,0x4, 0x7a,0x37,0x63,0x91,0x12,0x3c,0x73, +0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x65,0x0, 0x12,0x24,0x13,0x1b,0xfd,0x12,0x65, +0x12,0x12,0x60,0x39,0x6d,0x66,0x7d,0x26,0x3e,0x24,0x49,0x32,0x4a,0x71,0xbe,0x34, +0x2, 0x0, 0x28,0xf, 0x7d,0x12,0x2e,0x14,0x4a,0x71,0x9e,0x34,0x2, 0x0, 0x1b,0x18, +0x30,0x80,0x6, 0x6d,0x33,0x59,0x32,0x4a,0x71,0xb, 0x64,0xbe,0x64,0x2, 0x6, 0x78, +0xd5,0x7e,0x34,0x4a,0x71,0x7a,0x37,0x4e,0x81,0xe4,0x7a,0xb3,0x77,0x41,0x7a,0xb3, +0x77,0x40,0x12,0x64,0xed,0x12,0x64,0xea,0x12,0x6, 0xc5,0x7e,0x34,0x0, 0x1, 0x7e, +0x27,0x63,0xb7,0x12,0x6, 0x48,0x7e,0x34,0x0, 0x1, 0x7e,0x27,0x63,0xb7,0x12,0x6, +0xc5,0x7e,0x34,0x0, 0x2, 0x7e,0x27,0x63,0xb9,0x12,0x6, 0x48,0x7e,0x34,0x0, 0x2, +0x7e,0x27,0x63,0xb9,0x12,0x6, 0xc5,0x7e,0x34,0x0, 0x8, 0x7e,0x27,0x63,0xbb,0x12, +0x6, 0x48,0x7e,0x34,0x0, 0x8, 0x7e,0x27,0x63,0xbb,0x12,0x6, 0xc5,0x7e,0x34,0x0, +0x17,0x7e,0x27,0x63,0xbd,0x12,0x6, 0x48,0x7e,0x34,0x0, 0x17,0x7e,0x27,0x63,0xbd, +0x12,0x6, 0xc5,0x12,0x65,0x34,0x12,0x6, 0x48,0x12,0x65,0x34,0x12,0x6, 0xc5,0x12, +0x65,0x2b,0x12,0x6, 0x48,0x12,0x65,0x2b,0x12,0x6, 0xc5,0x12,0x65,0x22,0x12,0x6, +0x48,0x12,0x65,0x22,0x12,0x6, 0xc5,0x7e,0x34,0x1, 0x6, 0x7e,0x27,0x63,0xc1,0x12, +0x6, 0x48,0x7e,0x34,0x1, 0x6, 0x7e,0x27,0x63,0xc1,0x12,0x6, 0xc5,0x6d,0x66,0x80, +0x56,0x12,0x64,0xe1,0x7e,0x37,0x6f,0x6a,0xbd,0x36,0x28,0x1e,0x7e,0xb3,0x6f,0x76, +0x70,0xc, 0x12,0x64,0xad,0x60,0x35,0x3e,0x14,0x14,0x78,0xfb,0x80,0x2e,0x12,0x64, +0xad,0x60,0x17,0x3e,0x14,0x14,0x78,0xfb,0x80,0x10,0x7e,0xb3,0x6f,0x76,0x70,0x12, +0x12,0x64,0xad,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12,0x64,0xca, +0x80,0x10,0x12,0x64,0xad,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x12,0x64,0xb8,0x12, +0x64,0xc3,0x12,0x64,0xd8,0xb, 0x64,0x12,0x77,0xb0,0xbd,0x36,0x38,0xa3,0x7e,0x34, +0x1, 0x16,0x7e,0x8, 0x63,0x6d,0x12,0x67,0xdc,0x7e,0x34,0x1, 0x16,0x7e,0x8, 0x63, +0x91,0x12,0x67,0xe3,0x12,0x3f,0x4a,0x12,0xde,0x2c,0xda,0x3b,0x22,0x7d,0x57,0x5e, +0x54,0x0, 0xf, 0x7e,0x14,0x0, 0x1, 0x22,0x7d,0x27,0x1e,0x24,0x1e,0x24,0x1e,0x24, +0x1e,0x24,0x22,0x3e,0x24,0x2e,0x24,0x63,0x6d,0x22,0x3e,0x24,0x2e,0x24,0x63,0x91, +0x22,0x7e,0x73,0x6f,0x65,0xa, 0x37,0x22,0xb, 0x28,0x30,0x4d,0x31,0x1b,0x28,0x30, +0x22,0x7d,0x36,0x3e,0x34,0x49,0x73,0x6f,0x77,0x22,0x12,0x6, 0x48,0x6d,0x33,0x7e, +0x27,0x63,0xb5,0x22,0x7e,0x8, 0x63,0x6d,0x7e,0x34,0x0, 0x48,0xe4,0x2, 0x24,0x38, +0x7e,0x18,0xc, 0x18,0x7e,0x8, 0x63,0xc7,0x22,0x12,0x60,0x39,0x7e,0x35,0x27,0xb, +0x34,0x22,0x7e,0x34,0x2, 0x6, 0x7a,0x35,0x29,0x7e,0x8, 0x4a,0x71,0x7e,0x18,0x63, +0xc7,0x22,0x7e,0x34,0x1, 0x2, 0x7e,0x27,0x63,0xc5,0x22,0x7e,0x34,0x1, 0x1, 0x7e, +0x27,0x63,0xc3,0x22,0x7e,0x34,0x1, 0x0, 0x7e,0x27,0x63,0xbf,0x22,0x7e,0x34,0x1, +0x2, 0x7e,0x24,0x6, 0xe9,0x22,0x7e,0x34,0x1, 0x1, 0x7e,0x24,0x7, 0x8, 0x22,0x7e, +0x34,0x0, 0x8, 0x7e,0x27,0x63,0xbb,0x4e,0x40,0x40,0x22,0x7e,0x34,0x0, 0x17,0x7e, +0x27,0x63,0xbd,0x5e,0x24,0xe0,0x3f,0x22,0x7e,0x34,0x0, 0x1, 0x7e,0x27,0x63,0xb7, +0x5e,0x24,0x80,0x0, 0x22,0x7e,0x34,0x1, 0x6, 0x7e,0x27,0x63,0xc1,0x5e,0x24,0xfc, +0x0, 0x22,0x7e,0x34,0x0, 0x2, 0x7e,0x27,0x63,0xb9,0x5e,0x40,0x9c,0x4e,0x40,0x21, +0x22,0x7e,0x34,0x4, 0xc, 0xe4,0x2, 0x24,0x38,0xca,0x3b,0xf5,0x2b,0x7f,0x31,0x7a, +0xd, 0x27,0x7e,0x18,0xc, 0x18,0x7a,0x1d,0x2e,0x12,0x3b,0xdc,0x7e,0xd, 0x27,0x12, +0x65,0x91,0x30,0x3, 0xc, 0x7e,0x18,0x10,0x24,0x7a,0x1d,0x32,0x7f,0x3, 0x12,0x65, +0x91,0xe4,0x68,0x3, 0x12,0x3b,0xdc,0xd2,0x4, 0x12,0x3c,0x96,0x30,0x3, 0x23,0x6d, +0x33,0x80,0x17,0x12,0x66,0x2e,0x7e,0xd, 0x32,0x2d,0x12,0xb, 0xa, 0x50,0x7d,0x23, +0x3e,0x24,0x12,0x59,0xdb,0x1b,0xa, 0x20,0xb, 0x34,0x7a,0x35,0x2c,0x12,0x66,0x36, +0x38,0xe1,0x6d,0x33,0x80,0x1f,0x12,0x66,0x2e,0x7e,0xd, 0x2e,0x2d,0x12,0xb, 0xa, +0x20,0x3e,0x34,0x7e,0xd, 0x27,0x2d,0x13,0xb, 0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30, +0x7e,0x35,0x2c,0xb, 0x34,0x7a,0x35,0x2c,0x12,0x66,0x36,0x38,0xd9,0x7e,0xd, 0x27, +0x12,0x66,0x40,0x30,0x3, 0x5, 0x7f,0x3, 0x12,0x66,0x40,0xda,0x3b,0x22,0x7e,0x35, +0x2c,0x7d,0x23,0x3e,0x24,0x22,0x7e,0x37,0x73,0xd6,0xb, 0x36,0xbe,0x35,0x2c,0x22, +0x7e,0xa1,0x2b,0x74,0xa, 0xa4,0x49,0x35,0x29,0x8d,0x7d,0xb3,0x7f,0x70,0x7d,0x3b, +0x12,0x66,0xe9,0x7c,0x7b,0xa, 0x57,0x2e,0x54,0x0, 0xb, 0x7e,0x18,0x0, 0x1, 0x60, +0x5, 0x2f,0x11,0x14,0x78,0xfb,0x74,0x4, 0x2f,0x11,0x14,0x78,0xfb,0x7d,0x1b,0x12, +0x22,0xbd,0x7f,0x61,0xbe,0xb4,0x0, 0x10,0x68,0x6e,0x7e,0x73,0x6f,0x64,0x7a,0x73, +0x65,0xd3,0x7e,0x73,0x6f,0x65,0x7a,0x73,0x65,0xd4,0x74,0xb, 0x7a,0xb3,0x65,0xd5, +0x7d,0xaf,0x7a,0xa7,0x65,0xd7,0x7a,0xa7,0x65,0xdb,0xbe,0xb4,0x0, 0x2, 0x38,0xd, +0xe4,0x7a,0xb3,0x65,0xd5,0x7e,0xd4,0x0, 0x10,0x8d,0xdb,0x6d,0xcc,0x7e,0x8, 0x65, +0xd3,0x7d,0x3d,0x12,0x9, 0x50,0x7e,0x47,0x73,0xd6,0x7e,0xa0,0x4, 0x7d,0x34,0x3e, +0x34,0x7f,0x57,0x2d,0xb3,0xb, 0x5a,0x10,0x7f,0x16,0x12,0x22,0xb4,0x7e,0xb3,0x65, +0xd5,0x60,0xc, 0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x1b, +0x5a,0x30,0xb, 0x44,0x1b,0xa0,0x78,0xd5,0x22,0xe4,0x80,0x5, 0xb, 0x34,0x1e,0x34, +0x4, 0xbe,0x34,0x0, 0x10,0x38,0xf5,0x22,0x7c,0x9b,0x12,0xde,0xd4,0x7e,0x50,0xa, +0xac,0x59,0x59,0x32,0x29,0x8d,0x74,0x27,0xac,0xb9,0x49,0x5, 0x28,0xec,0x59,0x2, +0x29,0x8f,0x49,0x15,0x28,0xee,0xb, 0x14,0xad,0x10,0x6d,0x0, 0x59,0x12,0x29,0x93, +0x59,0x2, 0x29,0x91,0x12,0x67,0x41,0xac,0x79,0x19,0xa3,0x29,0x8b,0x74,0x27,0xac, +0xb9,0x49,0x35,0x28,0xee,0xb, 0x34,0x12,0x67,0x41,0xac,0x79,0x19,0xa3,0x29,0x8c, +0x22,0x12,0x66,0xe9,0x7c,0xab,0x7e,0x70,0xa, 0x22,0xca,0x3b,0x7c,0xeb,0xc2,0x2, +0x7e,0x70,0x27,0xac,0x7e,0x9, 0xf3,0x28,0xeb,0x12,0x67,0xd2,0x4c,0xee,0x68,0x18, +0xd2,0x2, 0xe4,0x19,0xb3,0x28,0xe9,0x7c,0xbe,0x12,0x66,0xf8,0x12,0x67,0x7d,0x12, +0xda,0xd0,0x12,0x3c,0x54,0x12,0x67,0xfa,0xa2,0x2, 0xda,0x3b,0x22,0xe4,0x7a,0xb3, +0x77,0xb1,0x12,0xe6,0x8e,0x7a,0xb3,0x77,0xb4,0x12,0xe5,0x70,0x7a,0xb3,0x77,0xbc, +0x22,0x7c,0xab,0x7e,0x8, 0x0, 0x7d,0x7c,0xba,0x12,0xd, 0xf7,0x7e,0x8, 0x0, 0xb9, +0x12,0xd, 0xf7,0x7e,0x34,0x0, 0x8, 0x7e,0x8, 0x0, 0x7d,0x12,0x67,0xea,0x7e,0x34, +0x0, 0x8, 0x7e,0x8, 0x0, 0xb9,0x7e,0x24,0x0, 0x1, 0x2, 0x4, 0x96,0xca,0x3b,0x7c, +0xeb,0x12,0x67,0xf1,0x12,0x67,0xd2,0xe5,0x1e,0x12,0x3c,0x29,0x12,0x67,0xfa,0xda, +0x3b,0x22,0x7e,0xd0,0xb5,0xac,0xdf,0x2e,0x64,0x1, 0x0, 0x22,0x7e,0x24,0x0, 0x12, +0x2, 0x3, 0xfa,0x7e,0x24,0x0, 0x12,0x2, 0x4, 0x96,0x7e,0x24,0x0, 0x1, 0x2, 0x3, +0xfa,0x74,0x27,0xac,0xbe,0x9, 0xf5,0x28,0xeb,0x22,0xe4,0x12,0x67,0x91,0x7e,0x30, +0x2c,0xac,0x3f,0x2e,0x14,0x0, 0xf5,0x6d,0x0, 0x74,0x1, 0x7e,0x70,0x27,0xac,0x7e, +0x9, 0x73,0x28,0xe9,0x12,0xd, 0x23,0x7e,0x30,0x2c,0xac,0x3f,0x2e,0x14,0x0, 0xf9, +0x6d,0x0, 0x74,0xa, 0xac,0xbe,0x9, 0xb5,0x29,0x8b,0x12,0xd, 0x73,0x7d,0x36,0xb, +0x35,0x74,0x2c,0xac,0xbf,0x49,0x25,0x0, 0xf9,0x12,0x0, 0x2e,0x7d,0x36,0x74,0x2c, +0xac,0xbf,0x49,0x25,0x0, 0xf5,0x2, 0x0, 0x2e,0x24,0x8a,0x78,0x19,0x7e,0xf, 0x78, +0xf2,0xa5,0xbf,0x0, 0x8, 0x12,0x37,0xe2,0x5e,0x70,0xfb,0x80,0x6, 0x12,0x37,0xe2, +0x4e,0x70,0x4, 0x1b,0xa, 0x30,0x22,0x24,0x52,0x68,0xa, 0x4, 0x78,0x29,0x6d,0x33, +0x7a,0x37,0x4a,0x63,0x22,0x7e,0x63,0x6f,0x64,0x7e,0x73,0x6f,0x65,0xac,0x76,0x3e, +0x34,0x7a,0x37,0x4a,0x63,0x1e,0x34,0xa, 0x36,0x7a,0x73,0x77,0x4d,0x7e,0x37,0x4a, +0x63,0x1e,0x34,0x7a,0x73,0x77,0x4e,0x22,0x12,0x3e,0x8b,0x7e,0x73,0x78,0x8e,0x7a, +0x73,0x77,0x38,0x12,0x68,0xe7,0xe4,0x7a,0xb3,0x6f,0x32,0x7a,0xb3,0x6f,0x31,0x2, +0x68,0xb2,0x7e,0x73,0x76,0xe6,0x7a,0x73,0x78,0xb0,0x22,0x12,0x68,0xe0,0x12,0x68, +0xc4,0x2, 0x68,0xb2,0x7e,0x8, 0x78,0xba,0x2, 0x68,0xcb,0xb, 0xa, 0x30,0xbe,0x37, +0x78,0x86,0x28,0x6, 0x9e,0x37,0x78,0x86,0x80,0x2, 0x6d,0x33,0x1b,0xa, 0x30,0x22, +0x7e,0x8, 0x25,0xb1,0x2, 0x68,0xcb,0x7e,0x73,0x77,0x37,0x7a,0x73,0x73,0xd3,0x22, +0x7e,0x34,0x4, 0xc, 0xca,0x39,0x12,0x69,0x31,0x12,0x24,0x13,0x1b,0xfd,0x6d,0x33, +0x7d,0x13,0x3e,0x14,0x49,0x1, 0x46,0x54,0xbe,0x4, 0x0, 0x0, 0x8, 0x6, 0x49,0x21, +0x46,0x54,0x80,0x4, 0x6d,0x22,0x9d,0x20,0x59,0x21,0x46,0x54,0x49,0x1, 0x42,0x48, +0xbd,0x20,0x28,0x4, 0x59,0x21,0x42,0x48,0xb, 0x34,0xbe,0x34,0x2, 0x6, 0x40,0xd0, +0x22,0x7e,0x1f,0x24,0x68,0x7e,0x8, 0x46,0x54,0x22,0x7e,0x37,0x4e,0xa6,0x7a,0x73, +0x77,0x45,0x7e,0xb3,0x77,0x42,0xb4,0x1, 0x2, 0x80,0x2, 0x41,0x1c,0x7e,0xb3,0x77, +0x31,0x44,0x80,0x7a,0xb3,0x77,0x31,0x7e,0xa7,0x4e,0xa6,0xbe,0xa4,0x0, 0x5, 0x38, +0x30,0x6d,0xdd,0x7a,0xd7,0x4e,0x95,0x7a,0xd7,0x4e,0x93,0x7e,0x8, 0x4e,0x8d,0x7e, +0x34,0x0, 0x6, 0xe4,0x12,0x24,0x38,0x7e,0x34,0x4, 0xc, 0x7d,0x1d,0xad,0x13,0x2e, +0x14,0x42,0x48,0x6d,0x0, 0xe4,0x12,0x24,0x38,0xb, 0xd4,0xbe,0xd4,0x0, 0x2, 0x78, +0xe6,0x7e,0xa7,0x4e,0xa6,0xb, 0xa4,0x7a,0xa7,0x4e,0xa6,0xbe,0xa4,0x0, 0x5, 0x28, +0x5, 0xd2,0x25,0x12,0x68,0xf0,0x7e,0x73,0x77,0x43,0xa, 0xa7,0x3e,0xa4,0x3e,0xa4, +0x2e,0xa4,0x0, 0x5, 0xbe,0xa7,0x4e,0xa6,0x78,0x74,0x6d,0xdd,0x4d,0xdd,0x78,0x4, +0x6d,0xbb,0x80,0xa, 0x7d,0x3d,0x1b,0x34,0x3e,0x34,0x49,0xb3,0x42,0x48,0xbe,0xd4, +0x2, 0x6, 0x78,0x4, 0x6d,0xcc,0x80,0x8, 0x7d,0xcd,0x3e,0xc4,0x49,0xcc,0x42,0x4a, +0x7d,0x3b,0x2d,0x3c,0x7e,0x24,0x0, 0xa, 0x8d,0x32,0x7d,0x3d,0x3e,0x34,0x2e,0x34, +0x42,0x48,0xb, 0x38,0xa0,0x2d,0xa2,0x1b,0x38,0xa0,0xb, 0xd4,0xbe,0xd4,0x2, 0x6, +0x78,0xba,0xc2,0x25,0xe4,0x7a,0xb3,0x77,0x42,0x6d,0xaa,0x7a,0xa7,0x4a,0x63,0x7e, +0x34,0x42,0x48,0x7a,0x37,0x4e,0x7f,0x7a,0xa7,0x4e,0xa6,0x22,0xc2,0x25,0x7e,0xa7, +0x4e,0xa6,0x4d,0xaa,0x68,0x8, 0x6d,0xaa,0x7a,0xa7,0x4e,0xa6,0xd2,0x11,0x22,0x24, +0x6f,0x68,0x12,0x14,0x68,0x14,0x14,0x68,0x16,0x14,0x68,0x18,0xb, 0xb2,0x78,0x19, +0x7e,0xb3,0x1, 0x90,0x22,0x7e,0xb3,0x1, 0x91,0x22,0x7e,0xb3,0x1, 0x92,0x22,0x7e, +0xb3,0x1, 0x93,0x22,0x7e,0xb3,0x1, 0x94,0x22,0x74,0xfe,0x22,0x24,0xab,0x68,0x10, +0x24,0xef,0x68,0x1c,0x24,0xde,0x68,0x26,0x24,0xde,0x78,0x2f,0x74,0x5, 0x80,0x2d, +0x7e,0xb3,0x29,0xfe,0xb4,0x5, 0x2a,0x12,0x6a,0xa2,0x12,0xd8,0x40,0x2, 0x6a,0xe2, +0x7e,0xb3,0x29,0xfe,0xb4,0x5, 0x1a,0x12,0x6a,0xa2,0x75,0xe9,0xff,0x22,0x7e,0xb3, +0x29,0xfe,0xb4,0x5, 0xc, 0x12,0x6a,0xa2,0x2, 0x6a,0xc5,0x74,0x1, 0x7a,0xb3,0x29, +0xfe,0x22,0x7e,0x34,0x0, 0x1, 0x7d,0x23,0x80,0x12,0x7e,0x30,0x4, 0x80,0x5, 0x74, +0xfa,0x12,0x6a,0xe5,0x7c,0x23,0x1b,0x30,0xa5,0xba,0x0, 0xf3,0x7d,0x32,0x1b,0x24, +0x4d,0x33,0x78,0xe6,0x22,0x2, 0x6a,0xc8,0x75,0xe7,0x6b,0xe4,0x7e,0x34,0x1, 0x4, +0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x5, 0x7a,0x1b,0xb0,0x75,0xe9, +0xff,0x22,0x2, 0x6a,0xc8,0x7c,0xab,0x80,0xf, 0x7e,0x70,0x2, 0x80,0x1, 0x0, 0x7c, +0x67,0x1b,0x70,0xa5,0xbe,0x0, 0xf7,0x0, 0x7c,0x6a,0x1b,0xa0,0xa5,0xbe,0x0, 0xe9, +0x22,0x7c,0xa7,0x7c,0x3b,0xa5,0xbb,0x0, 0x7, 0x7c,0xba,0x12,0x6b,0x5a,0x80,0x25, +0xbe,0x30,0xeb,0x68,0x4, 0xa5,0xbb,0xec,0x9, 0x7c,0xb3,0x7c,0x7a,0x12,0x78,0xff, +0x80,0x13,0xbe,0x30,0x80,0x40,0xe, 0xbe,0x30,0xef,0x38,0x9, 0x7c,0xb3,0x24,0x80, +0x7c,0x7a,0x12,0x79,0x3b,0xa5,0xbb,0xfc,0x5, 0x7c,0xba,0x2, 0x6a,0x5c,0x74,0x1, +0x7a,0xb3,0x29,0xfe,0x22,0x7c,0x6b,0x12,0x6b,0xcc,0x78,0x5, 0x7c,0xb6,0x2, 0x6b, +0x1, 0xb4,0x4, 0x5, 0x7c,0xb6,0x2, 0x40,0x2b,0x22,0x7a,0xb3,0x77,0x31,0xc4,0x54, +0x7, 0xbe,0xb0,0x4, 0x68,0x3, 0xb4,0x2, 0x4, 0x74,0x3, 0x80,0x7, 0x60,0x3, 0xb4, +0x1, 0x7, 0x74,0x1, 0x7a,0xb3,0x76,0xe6,0x22,0x12,0x6f,0xa2,0xe4,0x7a,0xb3,0x77, +0x31,0x22,0x30,0x90,0x19,0xc2,0x90,0xe5,0x13,0x70,0x9, 0x75,0x13,0x1, 0xe5,0x91, +0xf5,0x1a,0x80,0x11,0x7e,0x71,0x91,0xe5,0x1a,0x12,0x6b,0x45,0x5, 0x1a,0x30,0x91, +0xb, 0xc2,0x91,0x5, 0x1a,0xe5,0x1a,0x12,0x6b,0xad,0xf5,0x91,0x22,0x7c,0x7b,0x6c, +0xaa,0x12,0x6b,0xcc,0x78,0x9, 0x7c,0xb7,0x12,0x6b,0xd4,0x7c,0xab,0x80,0xa, 0xb4, +0x4, 0x7, 0x7c,0xb7,0x12,0x39,0x23,0x7c,0xab,0x7c,0xba,0x22,0x7e,0xb3,0x77,0x31, +0xc4,0x54,0x7, 0x22,0x7c,0x2b,0xa5,0xba,0xfa,0x5, 0x7e,0xb3,0x4a,0x66,0x22,0xa5, +0xba,0x0, 0x5, 0x7e,0xb3,0x77,0x31,0x22,0xbe,0x20,0x3, 0x38,0x13,0x30,0x21,0x6, +0x7e,0x18,0x28,0x3b,0x80,0x4, 0x7e,0x18,0x28,0x79,0x7a,0x1f,0x28,0xe0,0x80,0x5, +0xbe,0x20,0x6e,0x38,0xe, 0xa, 0x2, 0x7e,0x1f,0x28,0xe0,0x2d,0x30,0x1b,0x34,0x7e, +0x1b,0xb0,0x22,0xbe,0x20,0xd3,0x68,0x4, 0xa5,0xba,0xd4,0x11,0xa5,0xba,0xd3,0x8, +0x6d,0x33,0x7a,0x37,0x77,0x8d,0x80,0x2, 0x15,0x1a,0x2, 0x78,0x8f,0xa5,0xba,0xf6, +0xc, 0x7e,0x34,0x1b,0xd6,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x50,0x22,0xa5,0xba,0xf7, +0xa, 0x7e,0x34,0x1b,0xd6,0x12,0x2a,0xa9,0xa, 0x56,0x22,0xbe,0x20,0xf8,0x68,0x4, +0xa5,0xba,0xf9,0x1d,0xa5,0xba,0xf8,0x8, 0x6d,0x33,0x7a,0x37,0x77,0x8d,0x80,0x2, +0x15,0x1a,0x7e,0x37,0x77,0x8d,0x7d,0x23,0xb, 0x24,0x7a,0x27,0x77,0x8d,0x2, 0x6c, +0xe0,0xbe,0x20,0xeb,0x68,0x4, 0xa5,0xba,0xec,0x5, 0x7c,0xb2,0x2, 0x6f,0x79,0xbe, +0x20,0x99,0x68,0x4, 0xa5,0xba,0x9a,0x2a,0x7e,0xb3,0x76,0xcf,0x7c,0xab,0xbe,0xa0, +0x20,0x40,0xd, 0xbe,0xa0,0x40,0x50,0x8, 0xa, 0x3a,0x9, 0x33,0x6b,0xc9,0x80,0x3, +0x12,0xe5,0xd8,0x4, 0x7a,0xb3,0x76,0xcf,0xa5,0xba,0x9a,0x3, 0x75,0x1a,0x99,0x7c, +0xb3,0x22,0xbe,0x20,0x80,0x40,0xc, 0xbe,0x20,0xef,0x38,0x7, 0xa, 0x32,0x9, 0xb3, +0x76,0x3f,0x22,0xa5,0xba,0xfc,0x5, 0x7e,0xb3,0x76,0xe6,0x22,0xa5,0xba,0xfe,0xd, +0x7e,0x23,0x78,0x97,0x74,0x27,0xac,0xb2,0x9, 0xb5,0x28,0xe8,0x22,0x74,0xff,0x22, +0x7e,0x24,0xe, 0x6, 0x2d,0x32,0x2, 0x6c,0xf3,0x7c,0xb7,0x54,0x7, 0xa, 0x3b,0x2e, +0x34,0x0, 0xf5,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x22,0x74,0x1, 0x7a,0xb3, +0x78,0xfa,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0x6, 0xe4,0x7a,0xb3,0x78,0xfa,0x22,0x7e, +0xb4,0x21,0x53,0x7d,0x3b,0x12,0x6c,0xf3,0x7c,0x7b,0x1e,0x70,0x7a,0x73,0x6f,0x3f, +0x7e,0xa4,0x0, 0x96,0x7a,0xa7,0x6f,0x40,0x12,0x6f,0xc7,0x12,0xe1,0xf5,0x7e,0xa3, +0x6d,0x93,0xbe,0xa0,0x0, 0x38,0x2, 0xa1,0xca,0xbe,0xa0,0x8, 0x28,0x1f,0x7e,0x37, +0x6d,0x99,0xbe,0x34,0x1, 0x90,0x58,0x15,0x7d,0x3b,0x12,0x6c,0xf3,0x1e,0xb0,0xa, +0x3b,0x7d,0x2a,0x7e,0x14,0x0, 0x8c,0x7e,0x4, 0x0, 0x82,0x80,0x66,0xbe,0xa0,0x6, +0x28,0x1b,0x7e,0x37,0x6d,0x99,0xbe,0x34,0x1, 0xf4,0x58,0x11,0x7d,0x3b,0x12,0x6c, +0xf3,0xa, 0x3b,0x7e,0x24,0x0, 0xa0,0x7d,0x1a,0x7d,0xa, 0x80,0x46,0xbe,0xa0,0x4, +0x28,0x1f,0x7e,0xa7,0x6d,0x99,0xbe,0xa4,0x2, 0x58,0x58,0x15,0x7d,0x3b,0x12,0x6c, +0xf3,0xa, 0x3b,0x7e,0x24,0x0, 0xb4,0x7e,0x14,0x0, 0xaa,0x7e,0x4, 0x0, 0xc8,0x80, +0x22,0xbe,0xa0,0x2, 0x28,0x24,0x7e,0xa7,0x6d,0x99,0xbe,0xa4,0x3, 0x20,0x58,0x1a, +0x7d,0x3b,0x12,0x6c,0xf3,0xa, 0x3b,0x7e,0x24,0x0, 0xdc,0x7e,0x14,0x0, 0xd2,0x7e, +0x4, 0x0, 0xe6,0x12,0x4f,0x3f,0x80,0x7, 0x80,0x0, 0xe4,0x7a,0xb3,0x78,0xfa,0x7e, +0xb3,0x78,0xfa,0x70,0x27,0x90,0x21,0x53,0xe4,0x93,0xa, 0x3b,0x7e,0x14,0x21,0x5b, +0x12,0x6f,0xdd,0x7e,0x14,0x21,0x5d,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x10,0x7e,0x54, +0x21,0x67,0x7e,0x44,0x0, 0xff,0xb, 0x2a,0x0, 0x2, 0x4f,0x3f,0xd2,0x27,0x22,0x12, +0x6f,0xe5,0x2, 0x6c,0xfc,0x7c,0x7b,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x9, 0xa2,0x6c, +0x81,0x12,0x6c,0xe9,0x5c,0xba,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x2c,0x7c, +0xbe,0x12,0x6e,0x5, 0x60,0x23,0x7e,0x34,0x0, 0x2, 0xca,0x39,0xac,0x7e,0x2e,0x34, +0x6c,0x9, 0x6d,0x22,0x7e,0x30,0x2, 0xac,0x3f,0x2e,0x14,0x6c,0x9, 0x6d,0x0, 0x12, +0x24,0x13,0x1b,0xfd,0xd2,0x2, 0x12,0x6e,0x85,0xb, 0xe0,0x12,0x6f,0xa9,0x38,0xcf, +0x7a,0xf3,0x6d,0x93,0xda,0x79,0x22,0xc2,0x2, 0x7c,0xb1,0x7c,0x7b,0xc4,0x23,0x54, +0x1f,0x7c,0xab,0x12,0x6c,0xe9,0x30,0x2, 0xf, 0xa, 0x3a,0x2e,0x34,0x6c,0x81,0x7e, +0x39,0xa0,0x4c,0xba,0x7a,0x39,0xb0,0x22,0x64,0xff,0xa, 0x2a,0x2e,0x24,0x6c,0x81, +0x2, 0x57,0xe5,0xc2,0x2, 0x7c,0xbf,0x12,0x6e,0x5b,0xb, 0xf0,0x22,0xca,0xf8,0xc2, +0x0, 0xc2,0x1, 0x12,0x6f,0xbf,0x68,0x76,0x7e,0xb3,0x77,0xf, 0x70,0x70,0x7e,0xb3, +0x6d,0x93,0x70,0x5, 0x12,0x6f,0x18,0x80,0x65,0x12,0x9b,0x71,0x92,0x1, 0x12,0xcc, +0xaf,0x92,0x0, 0x30,0x0, 0x13,0x7e,0x34,0x22,0x27,0x12,0x2a,0xa9,0x7a,0x37,0x78, +0xdb,0x74,0x1, 0x7a,0xb3,0x78,0xd7,0x80,0x14,0x30,0x1, 0x19,0x7e,0x34,0x22,0x27, +0x12,0x2a,0xa9,0x7a,0x37,0x78,0xdb,0x74,0x1, 0x7a,0xb3,0x78,0xd8,0x74,0x1, 0x7a, +0xb3,0x78,0xd6,0x80,0x3, 0x12,0x6f,0x18,0x7e,0xb3,0x78,0xd7,0x60,0xe, 0x6c,0xff, +0x80,0x3, 0x12,0x6e,0x83,0x12,0x6f,0x11,0x38,0xf8,0x80,0x12,0x7e,0xb3,0x78,0xd8, +0x60,0xc, 0x6c,0xff,0x80,0x3, 0x12,0x6e,0x83,0x12,0x6f,0x11,0x38,0xf8,0xda,0xf8, +0x22,0x7e,0x73,0x6d,0x93,0xbc,0x7f,0x22,0x7e,0x37,0x78,0xdb,0xbe,0x34,0x0, 0x0, +0x28,0x7, 0x1b,0x34,0x7a,0x37,0x78,0xdb,0x22,0xe4,0x12,0x6f,0xd0,0x7a,0xb3,0x78, +0xd6,0x22,0x12,0x6f,0xb7,0x28,0x3a,0x7e,0xb3,0x6f,0x32,0x70,0x34,0x7e,0x37,0x6d, +0x95,0xbe,0x34,0x0, 0x26,0x28,0x2f,0x7e,0xb3,0x78,0xdd,0xbe,0xb0,0x2, 0x50,0x26, +0x4, 0x7a,0xb3,0x78,0xdd,0x6c,0x33,0x80,0x9, 0xc2,0x2, 0x7c,0xb3,0x12,0x6e,0x5b, +0xb, 0x30,0x7e,0x23,0x6d,0x93,0xbc,0x23,0x38,0xef,0xe4,0x7a,0xb3,0x6d,0x93,0x80, +0x5, 0xe4,0x7a,0xb3,0x78,0xdd,0x2, 0x6e,0x17,0xb4,0xeb,0x3, 0x75,0x1b,0x0, 0xe5, +0x1b,0xa, 0x3b,0x2e,0x34,0x0, 0x16,0x12,0x6c,0xf3,0x7c,0xab,0x5, 0x1b,0xe5,0x1b, +0xb4,0x3, 0x9, 0x75,0x1b,0x0, 0x6d,0x33,0x7a,0x37,0x77,0x8f,0x75,0x1a,0xeb,0x7c, +0xba,0x22,0x74,0x1, 0x7a,0xb3,0x76,0xe6,0x22,0x7e,0x73,0x6d,0x93,0xbc,0x7e,0x22, +0xc2,0x2, 0x7c,0xbc,0x2, 0x6e,0x5b,0x7e,0x73,0x6d,0x93,0xbe,0x70,0x0, 0x22,0x7e, +0xb3,0x6f,0x58,0xbe,0xb0,0x1, 0x22,0x7e,0x34,0x0, 0x8c,0x7a,0x37,0x6f,0x42,0x22, +0x7a,0xb3,0x78,0xd7,0x7a,0xb3,0x78,0xd8,0x22,0x7e,0x14,0x21,0xec,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0x20,0x22,0x7e,0x8, 0x78,0xfa,0x7e,0x34,0x0, 0x1, 0x74,0xff,0x2, +0x24,0x38,0x7e,0xa3,0x6f,0x31,0xbe,0xa0,0x0, 0x38,0x3, 0x2, 0x70,0xa8,0x7e,0xb3, +0x78,0xbf,0xbe,0xb0,0x32,0x40,0x2, 0x1, 0x8a,0x4, 0x7a,0xb3,0x78,0xbf,0xbe,0xa0, +0x2, 0x28,0xe, 0x7e,0xb3,0x78,0xbf,0x4, 0x7a,0xb3,0x78,0xbf,0x4, 0x7a,0xb3,0x78, +0xbf,0x7e,0xb3,0x78,0xbe,0x70,0x25,0x7e,0x37,0x6e,0x23,0x7a,0x37,0x78,0xc0,0x7e, +0x37,0x6e,0x25,0x7a,0x37,0x78,0xc2,0x74,0x1, 0x7a,0xb3,0x78,0xbe,0xe4,0x7a,0xb3, +0x78,0xbd,0x7e,0xb3,0x6e,0x27,0x7a,0xb3,0x78,0xc4,0x80,0x44,0x7e,0x27,0x6e,0x25, +0x7d,0x32,0x9e,0x37,0x78,0xc2,0xbe,0x34,0x0, 0x0, 0x8, 0x6, 0x9e,0x27,0x78,0xc2, +0x80,0x4, 0x6d,0x22,0x9d,0x23,0x7e,0x37,0x6e,0x23,0x7d,0x13,0x9e,0x17,0x78,0xc0, +0xbe,0x14,0x0, 0x0, 0x8, 0x6, 0x9e,0x37,0x78,0xc0,0x80,0x4, 0x6d,0x33,0x9d,0x31, +0x2d,0x32,0xbe,0x34,0x0, 0x32,0x28,0x8, 0x80,0x0, 0x74,0x1, 0x7a,0xb3,0x78,0xbd, +0x7e,0xb3,0x78,0xbd,0xb4,0x1, 0x1e,0xbe,0xa0,0x1, 0x78,0x19,0x7e,0x73,0x6e,0x27, +0xbe,0x73,0x78,0xc4,0x68,0xf, 0x80,0x0, 0xe4,0x7a,0xb3,0x78,0xbe,0x7a,0xb3,0x78, +0xbd,0x7a,0xb3,0x78,0xbf,0x22,0x7e,0x73,0x6d,0xa8,0x7a,0x73,0x6d,0xa9,0x7e,0x73, +0x6f,0x31,0x7a,0x73,0x6f,0x32,0xe4,0x7a,0xb3,0x6f,0x35,0x7e,0x73,0x78,0x8e,0x7a, +0x73,0x76,0xea,0x7e,0x73,0x6f,0x57,0x7a,0x73,0x5c,0xc3,0x22,0x7e,0xb3,0x78,0xbc, +0x4, 0x7a,0xb3,0x78,0xbc,0x7e,0x73,0x78,0xbc,0x7a,0x73,0x76,0xd0,0x22,0x7e,0x37, +0x78,0x9f,0xb, 0x34,0x7a,0x37,0x78,0x9f,0x7e,0x37,0x78,0xa1,0xbe,0x37,0x78,0x9f, +0x28,0x3, 0x2, 0x71,0x9, 0x22,0x2, 0x70,0xee,0xe5,0x9a,0x60,0x5, 0xd2,0x9c,0xa9, +0xd6,0xdf,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0xc2,0x8f,0x12,0x71,0x6, 0xd0,0x82,0xd0,0x83, +0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b, +0x32,0xe4,0x12,0x77,0xea,0x12,0x77,0xd0,0x12,0x71,0xf2,0x12,0x71,0xe7,0x12,0x77, +0xb9,0x7e,0x34,0x0, 0x1c,0x12,0xc, 0x65,0x12,0x2d,0x3d,0x12,0x77,0x92,0x12,0x77, +0x81,0x12,0x77,0x8c,0x12,0x77,0x86,0x12,0x77,0xc4,0x12,0xd8,0x97,0x12,0x73,0x80, +0x12,0xd8,0xa7,0x12,0x71,0xc2,0x12,0x74,0x4b,0xd2,0xaf,0x12,0x72,0x2c,0x12,0x72, +0x8, 0x90,0x1c,0x45,0xe4,0x93,0xca,0xb8,0x90,0x1c,0x46,0xe4,0x93,0x7c,0x7b,0x7e, +0x24,0x1, 0x33,0xda,0xb8,0x2, 0x71,0x98,0xca,0x79,0x7c,0xf7,0x7c,0xeb,0x7c,0x7f, +0x12,0xb, 0x7b,0xa9,0xd6,0xcb,0x5e,0xe0,0x3f,0x5e,0xf0,0x3f,0x7c,0x4e,0x6c,0x55, +0xa, 0x3f,0x2d,0x32,0x7e,0xf, 0x78,0xee,0x79,0x30,0x0, 0x32,0xa9,0xc6,0xcb,0xda, +0x79,0x22,0x2, 0x71,0xc5,0xd2,0x0, 0x12,0x45,0x86,0xa9,0xd0,0xcb,0xa9,0xc6,0xca, +0x12,0x77,0xdd,0xa9,0xd3,0x9e,0xa9,0xc3,0xb9,0xc2,0x8a,0xd2,0xaa,0x2, 0x71,0xe0, +0xa9,0xd0,0x9e,0xa9,0xd7,0x9e,0x22,0xc2,0x8d,0xc2,0x8f,0x12,0x73,0xcd,0xa9,0xc0, +0x93,0x22,0x75,0xec,0xff,0x75,0xee,0xff,0x75,0xeb,0x23,0x75,0xac,0xc0,0x12,0xd7, +0xe5,0xa9,0xd5,0xad,0xa9,0xc5,0xed,0x22,0x7e,0x8, 0x6b,0xe9,0x12,0x72,0x61,0x7e, +0x34,0x0, 0x20,0x7a,0x35,0x27,0x7e,0x18,0x0, 0x20,0x12,0x72,0x6b,0x2, 0x72,0x20, +0xa9,0xc5,0xca,0xa9,0xc7,0x94,0xe4,0x7a,0xb3,0x78,0xfb,0x22,0x6c,0x77,0xa9,0xc7, +0xb3,0xa9,0xc6,0xb3,0xd2,0xc8,0x43,0xed,0xf, 0xc2,0xea,0xb, 0x70,0xbe,0x70,0x3, +0x28,0x3, 0x7e,0x70,0x3, 0xa, 0x57,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2e, +0x54,0x0, 0x3, 0xf5,0xb3,0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x12,0x72,0x61,0x2, 0x72, +0x20,0xa9,0xd7,0x94,0x74,0xa5,0x7a,0xb3,0x78,0xfb,0x22,0x12,0x72,0x79,0x7e,0x35, +0x27,0x12,0xd7,0xc9,0xa9,0xd2,0xb4,0xd3,0x22,0x7d,0x52,0xf5,0x2b,0x7c,0xb6,0x7c, +0xa5,0xa, 0x44,0xf5,0x2a,0x7f,0x21,0xf5,0x29,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0x72, +0xa4,0xe5,0x2b,0x12,0x72,0xa4,0xe5,0x2a,0x12,0x72,0xa4,0xe5,0x29,0x12,0x72,0xa4, +0xe4,0x2, 0x72,0xa4,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xd3,0x22,0x7e, +0x34,0x21,0x57,0x12,0x2a,0xa9,0x12,0x2d,0x41,0x12,0x71,0x41,0x12,0x72,0xcc,0x12, +0x6f,0xa2,0x7a,0xb3,0x78,0xb0,0x12,0x77,0xa0,0x2, 0x29,0x4a,0x12,0x97,0xcc,0x12, +0x74,0x8, 0x12,0x98,0x53,0x12,0x98,0x99,0x12,0x73,0xd5,0x12,0x2a,0xb1,0x12,0x98, +0x7a,0x12,0x73,0x3a,0x12,0xcc,0x99,0x12,0x4f,0x5e,0x2, 0x72,0xed,0xd2,0x1, 0x12, +0x29,0x5a,0x6c,0xaa,0x7e,0x63,0x78,0x97,0x7e,0x70,0x27,0xac,0x67,0x9, 0x63,0x28, +0xe8,0xa, 0x2a,0x12,0x5d,0x3d,0x7c,0x7b,0xbc,0x67,0x78,0x4, 0x7a,0xa3,0x75,0x33, +0x7e,0x50,0x26,0xac,0x5a,0x19,0x72,0x75,0x37,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xd4, +0x7e,0x73,0x75,0x33,0xbe,0x70,0x3, 0x40,0x5, 0xe4,0x7a,0xb3,0x75,0x33,0x12,0x74, +0xcd,0x7e,0x73,0x75,0x33,0x7a,0x73,0x75,0xbb,0x22,0x12,0x73,0x78,0x74,0x9, 0xac, +0x7b,0x7e,0x8, 0x6d,0xc9,0x12,0x73,0x73,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x6e,0x7d, +0x12,0x73,0x73,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x6e,0x23,0x74,0xff,0x12,0x24,0x38, +0x7e,0x8, 0x6e,0xd7,0x12,0x90,0x7b,0x7e,0x8, 0x6f,0x31,0x7e,0x34,0x0, 0xd, 0xe4, +0x2, 0x24,0x38,0x74,0xff,0x12,0x24,0x38,0x90,0x21,0x51,0xe4,0x93,0x7c,0x7b,0x22, +0xe4,0x7a,0xb3,0x77,0x31,0x7e,0x8, 0x28,0x3b,0x12,0x77,0xa7,0x7e,0x8, 0x28,0x79, +0x7e,0x34,0x0, 0x3e,0x12,0x24,0x38,0x7e,0x18,0x28,0x3b,0x7a,0x1f,0x28,0xe0,0x12, +0x73,0xb2,0x2, 0x73,0xa5,0x75,0x13,0x0, 0x75,0x1a,0x0, 0x7e,0xb3,0x77,0x31,0xf5, +0x91,0x22,0x2, 0x73,0xb5,0xc2,0x92,0x12,0x73,0xcd,0x90,0x1b,0xd8,0xe4,0x93,0x54, +0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xa9,0xd4,0x95,0xd2,0xad,0x22,0x75,0x91,0x0, +0xc2,0x90,0xc2,0x91,0x22,0x7e,0x34,0x22,0x5, 0x12,0x2a,0xa9,0x7a,0x37,0x6d,0xac, +0x7e,0x34,0x22,0x7, 0x12,0x2a,0xa9,0x7a,0x37,0x6d,0xae,0x7e,0x34,0x22,0x9, 0x12, +0x2a,0xa9,0x12,0xe6,0x25,0x90,0x22,0xc, 0xe4,0x93,0x7a,0xb3,0x6d,0xb3,0xe4,0x7a, +0xb3,0x6d,0xbc,0x7a,0xb3,0x6d,0xbd,0x22,0x7e,0x34,0x4, 0x71,0xca,0x39,0x7e,0x34, +0x1c,0x43,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x6f,0x62,0x12,0x24,0x13,0x1b,0xfd,0x12, +0x77,0xb0,0x7a,0x37,0x73,0xd6,0xe4,0x7a,0xb3,0x6f,0x68,0x7a,0xb3,0x6f,0x69,0x90, +0x21,0xd9,0x93,0x70,0x6, 0x7e,0x63,0x6f,0x65,0x80,0x4, 0x7e,0x63,0x6f,0x64,0x7e, +0x70,0x40,0xac,0x67,0x1b,0x34,0x7a,0x37,0x73,0xd8,0x22,0xa9,0xd2,0xea,0xa9,0xc2, +0xea,0x6d,0x33,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x10,0x12,0x45,0x27,0x4e,0x34, +0xdc,0xe, 0x1b,0xa, 0x30,0x7e,0x34,0x1, 0xc2,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, +0x1e,0x7e,0xf, 0x78,0xf2,0x12,0x37,0xe2,0x4e,0x70,0x10,0x1b,0xa, 0x30,0x12,0xe5, +0x88,0x12,0xb, 0xe5,0x7e,0x34,0xff,0xff,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x2, +0x6d,0x33,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x14,0x12,0x74,0xc4,0x7e,0x34,0xf0, +0x4f,0x12,0x74,0xc4,0xd2,0x4, 0x12,0x3c,0x2, 0x53,0xc3,0xf8,0x75,0xc3,0x85,0x53, +0xc2,0xfc,0x43,0xc2,0x81,0xd2,0xac,0x2, 0x74,0xba,0x90,0x21,0x50,0xe4,0x93,0x7a, +0xb3,0x78,0x8f,0x22,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x4, 0x22,0x7e,0xb3,0x75, +0x33,0x7c,0xab,0x6c,0x77,0xbc,0xa7,0x78,0x2b,0x12,0x77,0x99,0x12,0x35,0xa6,0x12, +0x75,0x64,0x59,0x2, 0x75,0x49,0x7e,0x8, 0x14,0x30,0x59,0x12,0x75,0x53,0x59,0x2, +0x75,0x51,0x7e,0x8, 0x18,0x3c,0x59,0x12,0x75,0x57,0x59,0x2, 0x75,0x55,0x7e,0x8, +0x1c,0x48,0x80,0x4e,0x7e,0x50,0x4, 0xac,0x5a,0xa, 0x17,0x2d,0x21,0x2e,0x24,0x24, +0x4a,0x12,0x5d,0x41,0x7c,0x6b,0x7e,0xb3,0x78,0x97,0xa, 0xb, 0x12,0x35,0xa6,0x12, +0x75,0x64,0x59,0x2, 0x75,0x49,0xa, 0x6, 0x7e,0x14,0xc, 0x24,0xad,0x10,0x7d,0xf1, +0x2e,0xf4,0x2a,0x0, 0x6d,0xee,0x59,0xf2,0x75,0x53,0x59,0xe2,0x75,0x51,0x7d,0xf1, +0x2e,0xf4,0x2e,0xc, 0x59,0xf2,0x75,0x57,0x59,0xe2,0x75,0x55,0x2e,0x14,0x32,0x18, +0x6d,0x0, 0x59,0x12,0x75,0x5b,0x59,0x2, 0x75,0x59,0xb, 0x70,0xbe,0x70,0x3, 0x50, +0x2, 0x81,0xd5,0x22,0x2e,0x14,0x4e,0xa8,0x6d,0x0, 0x7e,0x50,0x26,0xac,0x57,0x59, +0x12,0x75,0x47,0x59,0x2, 0x75,0x45,0x7e,0x8, 0x57,0x98,0x59,0x12,0x75,0x4f,0x59, +0x2, 0x75,0x4d,0x7e,0x8, 0x55,0x5c,0x59,0x12,0x75,0x4b,0x22,0x7c,0x9b,0x7e,0x24, +0x0, 0x1, 0x7c,0xb9,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e,0x83,0x73,0xd4,0xa, +0x38,0x5d,0x32,0x68,0xb, 0x12,0x74,0xcd,0x7e,0x83,0x75,0x33,0x7a,0x83,0x75,0xbb, +0x6c,0xaa,0x7e,0xb3,0x75,0xbb,0xbc,0xba,0x78,0x8, 0x6c,0x88,0x12,0x75,0xed,0xe4, +0x80,0x1f,0x7e,0x24,0x0, 0x1, 0x7c,0xb9,0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7e, +0xb3,0x73,0xd4,0xa, 0x3b,0x5d,0x32,0x68,0xc, 0x7e,0x80,0x1, 0x12,0x75,0xed,0x74, +0x1, 0x19,0xb3,0x75,0x44,0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xc6,0x22,0x7e,0x70,0x26, +0xac,0x7a,0x19,0x83,0x75,0x43,0x22,0x30,0x28,0x24,0xc2,0x28,0x7e,0x73,0x76,0xbc, +0x7a,0x73,0x76,0xe4,0x74,0xff,0x7a,0xb3,0x76,0xbc,0x7e,0xa3,0x76,0xe4,0x4c,0xaa, +0x78,0x5, 0x12,0x76,0xad,0x80,0x7, 0xbe,0xa0,0x1, 0x78,0x2, 0xd2,0x1c,0x30,0x1c, +0x3, 0x12,0x76,0xc8,0x7e,0xb3,0x76,0xe4,0x14,0x68,0x5b,0x1b,0xb1,0x68,0x5f,0x24, +0x3, 0x78,0x6e,0x12,0x76,0xa5,0x38,0x7, 0x7e,0xb3,0x78,0xd6,0xb4,0x1, 0x16,0x12, +0x54,0x9a,0x7e,0xb3,0x76,0xc5,0x30,0xe0,0x5b,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0x54, +0x30,0x14,0x51,0x80,0x2e,0x7e,0xb3,0x76,0xc5,0x30,0xe0,0x48,0x7e,0x37,0x78,0xeb, +0x7e,0x44,0x3, 0xe8,0x7d,0x53,0x8d,0x54,0x7e,0x53,0x76,0xc6,0xa, 0x15,0xbd,0x51, +0x50,0x11,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0x2b,0x7e,0x24,0x0, 0xc8,0x8d,0x32,0xbd, +0x31,0x40,0x21,0x2, 0x76,0xc8,0x12,0x76,0xa5,0x28,0x19,0x2, 0x77,0x9, 0x7e,0x34, +0x21,0x59,0x12,0x2a,0xa9,0x12,0x2d,0x41,0x12,0x45,0x62,0x12,0x72,0xaf,0x2, 0x76, +0xad,0x12,0x77,0x2, 0x22,0x7e,0x73,0x6f,0x31,0xbe,0x70,0x0, 0x22,0xe4,0x7a,0xb3, +0x76,0xe4,0xd2,0x15,0x12,0x54,0x9a,0x2, 0x76,0xba,0x12,0x3b,0x65,0x5e,0x34,0x0, +0x1, 0x68,0x4, 0xd2,0x1e,0xc2,0x1b,0x22,0xe5,0x1e,0xb4,0x1, 0xc, 0x7e,0xb3,0x25, +0xaf,0x60,0x6, 0xe4,0x7a,0xb3,0x76,0xe4,0x22,0xc2,0x1c,0x12,0x77,0x2, 0xe4,0x7a, +0xb3,0x28,0xe6,0x12,0x54,0x9a,0x7a,0xb3,0x78,0xed,0x7a,0xb3,0x78,0xea,0x12,0x3b, +0x65,0x5e,0x34,0x0, 0x2, 0x68,0xa, 0x7e,0xb3,0x73,0xd5,0x44,0x8, 0x7a,0xb3,0x73, +0xd5,0x22,0x74,0x1, 0x7a,0xb3,0x76,0xe4,0x22,0x7e,0xb3,0x77,0xf, 0x60,0x5, 0x20, +0x14,0x5, 0x80,0x0, 0x2, 0x76,0xad,0x22,0x12,0x75,0xf7,0xe5,0x1e,0x70,0x5, 0x12, +0x45,0x94,0x80,0x3, 0x12,0x46,0xd0,0x2, 0x77,0x2a,0x6c,0x77,0x7e,0x30,0x3b,0x7e, +0xa0,0x3c,0x7e,0xb3,0x76,0xe4,0xb4,0x1, 0xf, 0xe5,0x1e,0x60,0xb, 0x7e,0x23,0x78, +0xed,0xbc,0x27,0x78,0x3, 0x12,0xdd,0xe3,0x7e,0xb3,0x76,0xe4,0xb4,0x1, 0x31,0xe5, +0x1e,0x60,0x2d,0x7e,0xb3,0x78,0xed,0xbc,0xb3,0x78,0xb, 0x7e,0xb3,0x77,0x2e,0x60, +0x2, 0xd2,0x2c,0x12,0x76,0xba,0x7e,0xb3,0x78,0xed,0x7a,0xb3,0x78,0xea,0x4, 0x7a, +0xb3,0x78,0xed,0x7e,0x73,0x78,0xed,0xbc,0x7a,0x28,0x5, 0xe4,0x7a,0xb3,0x78,0xed, +0x22,0xc2,0x88,0xd2,0xa8,0x22,0xa9,0xd5,0xcd,0xd2,0x99,0x22,0xa9,0xd6,0xcd,0xd2, +0x98,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0x7e,0x63,0x78,0x97,0xa, 0x6, 0x22, +0x7e,0x34,0xd, 0xac,0x2, 0x2d,0x41,0x7e,0x34,0x0, 0x3e,0x74,0xff,0x2, 0x24,0x38, +0x7e,0x37,0x6f,0x6c,0x2e,0x37,0x6f,0x6a,0x22,0xa9,0xc3,0xcb,0xc2,0xcd,0xc2,0xcc, +0xa9,0xd6,0xea,0x22,0x75,0x9a,0x2f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x22, +0xa9,0xc5,0xcb,0xa9,0xd1,0xcb,0xa9,0xd2,0xca,0xa9,0xd2,0xcb,0x22,0xa9,0xd0,0x9e, +0xa9,0xd4,0x9e,0x75,0x9d,0x0, 0x75,0x9c,0x20,0x22,0xa9,0xc5,0xca,0xbe,0xb0,0x8, +0x50,0x2, 0xf5,0xcc,0x75,0xe6,0x0, 0x22,0xca,0xb8,0xca,0x39,0x12,0x77,0xdd,0x12, +0x71,0xe0,0x7e,0x37,0x78,0x86,0xb, 0x34,0x7a,0x37,0x78,0x86,0x7e,0x37,0x78,0x98, +0xb, 0x34,0x7a,0x37,0x78,0x98,0x7e,0xb3,0x76,0xe6,0xb4,0x1, 0x40,0x7e,0xb3,0x78, +0x9a,0x4, 0x7a,0xb3,0x78,0x9a,0x7e,0x73,0x78,0x9a,0xbe,0x70,0xa, 0x28,0x2e,0xe4, +0x7a,0xb3,0x78,0x9a,0x7e,0x73,0x78,0x91,0xbe,0x73,0x78,0xbc,0x78,0x8, 0x7e,0x37, +0x78,0x88,0xb, 0x34,0x80,0xa, 0x7e,0x73,0x78,0xbc,0x7a,0x73,0x78,0x91,0x6d,0x33, +0x7a,0x37,0x78,0x88,0xbe,0x34,0x0, 0xfa,0x28,0x3, 0x75,0xe9,0xff,0x7e,0xb3,0x78, +0x8a,0x60,0x5, 0x14,0x7a,0xb3,0x78,0x8a,0x7e,0xb3,0x78,0x8a,0x70,0x2, 0xd2,0x15, +0x7e,0x37,0x78,0xeb,0xb, 0x34,0x7a,0x37,0x78,0xeb,0x7e,0x37,0x78,0x94,0xbe,0x34, +0x0, 0x0, 0x28,0x6, 0x1b,0x34,0x7a,0x37,0x78,0x94,0xda,0x39,0xda,0xb8,0x32,0x7e, +0xa3,0x27,0x72,0x7e,0x70,0x4, 0xac,0x7a,0xb, 0x34,0xbe,0x37,0x77,0x8d,0x40,0x39, +0x7e,0x37,0x77,0x8d,0xb, 0x34,0x7a,0x37,0x77,0x8d,0xbe,0x34,0x0, 0x1, 0x78,0x5, +0x7e,0xb3,0x77,0x12,0x22,0xbe,0x34,0x0, 0x2, 0x78,0x3, 0x7c,0xba,0x22,0xbe,0x34, +0x0, 0x2, 0x50,0x9, 0x7d,0x23,0x1b,0x25,0x9, 0xb2,0x78,0xde,0x22,0x9e,0x34,0x0, +0x3, 0x2e,0x37,0x25,0xb3,0x7e,0x39,0xb0,0x22,0x74,0xff,0x22,0xca,0x2b,0xca,0x1b, +0xca,0xb, 0xc0,0x83,0xc0,0x82,0x12,0x6b,0x82,0xd0,0x82,0xd0,0x83,0xda,0xb, 0xda, +0x1b,0xda,0x2b,0x32,0x12,0x78,0xfb,0x75,0x13,0x0, 0x32,0xa9,0xc0,0x93,0x22,0xbe, +0xb0,0xeb,0x68,0x3, 0xb4,0xec,0x33,0x7e,0x27,0x77,0x8f,0x4d,0x22,0x78,0xe, 0xa5, +0xbf,0xaa,0xa, 0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x77,0x8f,0x15,0x1a,0x7e,0x27,0x77, +0x8f,0xbe,0x24,0x0, 0x1, 0x78,0x10,0xa5,0xbf,0x9, 0x6, 0x7e,0x34,0x0, 0x2, 0x80, +0x2, 0x6d,0x33,0x7a,0x37,0x77,0x8f,0x75,0x1a,0xea,0x22,0x7c,0x6b,0x2e,0x60,0xdd, +0x68,0x29,0x2e,0x60,0xfd,0x68,0x24,0x1b,0x61,0x68,0x20,0x2e,0x60,0xfa,0x68,0x1b, +0x1b,0x60,0x68,0x17,0x80,0x0, 0xa, 0x2b,0x19,0x72,0x76,0xbf,0xd2,0x27,0x7a,0xb3, +0x76,0xbd,0xb4,0x25,0x6, 0xd2,0x28,0x7a,0x73,0x76,0xbc,0x22,0x7e,0x18,0x6e,0xd7, +0x6c,0x33,0x80,0x7e,0x7e,0x10,0x9, 0xac,0x13,0x9, 0x20,0x6e,0x27,0x90,0x21,0x51, +0xe4,0x93,0xbc,0xb2,0x28,0x6a,0x7c,0xa2,0x5e,0xa0,0xf, 0x74,0x9, 0xa4,0x2d,0x53, +0x7d,0x42,0x7e,0x2b,0xa0,0x49,0x40,0x6e,0x25,0xbe,0x44,0x0, 0x40,0x38,0x4c,0x49, +0x40,0x6e,0x23,0xbe,0x44,0x0, 0x0, 0x40,0x42,0x7e,0xf4,0x21,0xde,0x12,0x7e,0xd0, +0xbd,0x40,0x38,0x37,0x4c,0xaa,0x78,0x38,0x7e,0xb3,0x28,0xdf,0x70,0x32,0x7e,0xb3, +0x6f,0x31,0xb4,0x1, 0x2b,0x74,0x1, 0x7a,0xb3,0x28,0xdf,0x7e,0x90,0x3, 0x7e,0x10, +0x9, 0xac,0x12,0x7f,0x71,0x2d,0xf0,0x7a,0x7b,0x90,0x74,0x3, 0x7f,0x71,0x2d,0xf0, +0x39,0xb7,0x0, 0x1, 0xe4,0x7a,0xb3,0x25,0xae,0x80,0x5, 0xe4,0x7a,0xb3,0x28,0xdf, +0xb, 0x30,0x7e,0xb3,0x6f,0x3e,0xbc,0xb3,0x28,0x2, 0x21,0x74,0x7e,0xb3,0x6f,0x31, +0x70,0xa, 0x12,0x7a,0xd, 0x28,0x5, 0xe4,0x7a,0xb3,0x28,0xdf,0x22,0x7e,0x73,0x6f, +0x32,0xbe,0x70,0x0, 0x22,0xca,0xf8,0x7e,0xb3,0x6f,0x31,0x70,0x17,0xe4,0x7a,0xb3, +0x6f,0x3a,0x12,0x7a,0xd, 0x28,0x1f,0x74,0x1, 0x7a,0xb3,0x6f,0x36,0xe4,0x7a,0xb3, +0x6f,0x39,0x80,0x12,0x74,0x1, 0x7a,0xb3,0x6f,0x3a,0x7e,0xb3,0x6f,0x32,0x70,0x6, +0x74,0x1, 0x7a,0xb3,0x6f,0x35,0x12,0x90,0xc9,0xca,0x59,0x7e,0x18,0x6d,0xc9,0x7e, +0x8, 0x6e,0x23,0x12,0x24,0x13,0x1b,0xfd,0x90,0x1c,0x2c,0xe4,0x93,0xbe,0xb0,0x0, +0x38,0x2, 0x61,0x1e,0x6c,0xff,0x80,0x24,0x74,0x9, 0xac,0xbf,0x49,0x35,0x6d,0xc9, +0x12,0xb3,0xbd,0x74,0x9, 0xac,0xbf,0x59,0x35,0x6e,0x23,0x49,0x35,0x6d,0xcb,0x12, +0x7b,0x21,0x74,0x9, 0xac,0xbf,0x59,0x35,0x6e,0x25,0xb, 0xf0,0x12,0xbf,0xdc,0x38, +0xd7,0x7e,0xa3,0x6f,0x31,0xbe,0xa0,0x1, 0x78,0x9, 0x7e,0xb3,0x6f,0x32,0xb4,0x1, +0x2, 0x80,0xb, 0xbe,0xa0,0x1, 0x78,0x16,0x7e,0xb3,0x6f,0x32,0x70,0x10,0x7e,0x37, +0x6e,0x23,0x7a,0x37,0x78,0xca,0x7e,0x37,0x6e,0x25,0x7a,0x37,0x78,0xcc,0xbe,0xa0, +0x1, 0x78,0x18,0x7e,0xb3,0x6f,0x32,0x70,0x12,0x7e,0x37,0x6e,0x23,0x7a,0x37,0x78, +0xc5,0x7e,0x37,0x6e,0x25,0x7a,0x37,0x78,0xc7,0x80,0x43,0xbe,0xa0,0x1, 0x78,0x2b, +0x7e,0xb3,0x6f,0x32,0xb4,0x1, 0x24,0x7e,0x37,0x6e,0x25,0x9e,0x37,0x78,0xc7,0x12, +0x24,0x5a,0x7d,0x13,0x7e,0x37,0x6e,0x23,0x9e,0x37,0x78,0xc5,0x12,0x24,0x5a,0x2d, +0x31,0xbe,0x34,0x0, 0x96,0x8, 0x17,0x74,0x1, 0x80,0xf, 0x4c,0xaa,0x78,0xf, 0x6d, +0x33,0x7a,0x37,0x78,0xc5,0x7a,0x37,0x78,0xc7,0xe4,0x7a,0xb3,0x78,0xc9,0xda,0xf8, +0x22,0x7d,0x13,0x9f,0x11,0x7e,0xf4,0x21,0xdc,0x12,0x7e,0xd0,0x12,0xe6,0xd3,0xb, +0x7a,0xf0,0x7e,0xd4,0x21,0xee,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0xe0,0x90,0x1c,0x2c, +0xe4,0x93,0x70,0x3, 0x7d,0x31,0x22,0x90,0x21,0xd9,0xe4,0x93,0xb4,0x1, 0x6, 0x7e, +0x83,0x6f,0x66,0x80,0x4, 0x7e,0x83,0x6f,0x67,0x12,0xb4,0xda,0xbe,0x14,0x0, 0x3f, +0x38,0x21,0x7e,0x24,0x0, 0x3f,0x9d,0x21,0x7e,0x14,0x21,0xf2,0x12,0x7c,0x34,0xad, +0x32,0x6d,0x22,0x12,0x7c,0x18,0x12,0x7c,0x1f,0x48,0x2, 0x7f,0x10,0x9f,0x1, 0x7f, +0x10,0x81,0xd, 0x7d,0x54,0x9e,0x54,0x0, 0x3f,0xbd,0x51,0x38,0x35,0x7d,0x54,0x9e, +0x54,0x0, 0x1f,0xbd,0x51,0x40,0x76,0x7d,0x34,0x9e,0x34,0x0, 0x40,0x7d,0x21,0x9d, +0x23,0x7e,0x14,0x21,0xf4,0x12,0x7c,0x34,0xad,0x32,0x6d,0x22,0x12,0x7c,0x18,0x90, +0x21,0xf1,0x12,0x7c,0x22,0x48,0x4, 0x7f,0x10,0x1b,0x1c,0x12,0x7c,0x2b,0x2f,0x10, +0x80,0x4b,0x7d,0x50,0x1b,0x54,0xbd,0x51,0x40,0x19,0x7d,0x30,0x9d,0x31,0x6d,0x22, +0x7e,0x14,0x21,0xf6,0x12,0x7c,0xe, 0x7d,0x1e,0x1b,0x14,0x6d,0x0, 0x9f,0x1, 0x7f, +0x10,0x80,0x13,0x7d,0x31,0x9d,0x30,0x6d,0x22,0x7e,0x14,0x21,0xf8,0x12,0x7c,0xe, +0x7d,0x1e,0x6d,0x0, 0x2f,0x10,0x12,0x7c,0x1f,0x58,0x4, 0x7f,0x10,0x80,0xe, 0x90, +0x21,0xf1,0xe4,0x93,0x12,0x7c,0x2b,0xbf,0x10,0x8, 0x2, 0x7f,0x10,0x22,0x7e,0x4, +0x0, 0xff,0xb, 0xa, 0x10,0x12,0x22,0xb4,0x7c,0x76,0x7c,0x65,0x1a,0x24,0x22,0x90, +0x21,0xf0,0xe4,0x93,0xa, 0x1b,0x6d,0x0, 0xbf,0x10,0x22,0xa, 0xb, 0x7d,0x1f,0x9d, +0x10,0x6d,0x0, 0x22,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x22,0xca,0xf8,0x7e,0xa3, +0x6f,0x31,0x7e,0xb3,0x6f,0x32,0xc2,0x14,0xbe,0xa0,0x1, 0x38,0x21,0xbe,0xb0,0x1, +0x38,0x1c,0x7e,0x47,0x6d,0x95,0xbe,0x44,0x0, 0x1e,0x28,0x2, 0x80,0x10,0x7e,0xf3, +0x27,0x4a,0x4c,0xff,0x68,0xf, 0x7e,0x47,0x25,0xb1,0x4d,0x44,0x78,0x7, 0xd2,0x14, +0x12,0x77,0x2, 0x80,0x35,0x4c,0xaa,0x78,0x36,0xb4,0x1, 0x33,0x7e,0x37,0x25,0xb1, +0x7a,0x37,0x27,0x4c,0x7e,0xb3,0x27,0x4a,0xb4,0x3, 0x1f,0x7e,0x37,0x25,0xb1,0xbe, +0x34,0x0, 0x0, 0x28,0x15,0x74,0x4, 0x7a,0xb3,0x27,0x4a,0x7e,0x37,0x27,0x62,0x7e, +0x27,0x27,0x64,0x12,0x7d,0x47,0xa1,0x40,0x80,0x0, 0x12,0xe4,0xd8,0xa1,0x40,0x7e, +0xc7,0x6e,0x23,0x7e,0xd7,0x6e,0x25,0x4c,0xff,0x78,0x19,0x70,0x57,0xbe,0xa0,0x1, +0x78,0x52,0x7d,0x3c,0x7d,0x2d,0x12,0xe4,0x73,0x12,0x7d,0x43,0x74,0x1, 0x7a,0xb3, +0x27,0x4a,0x80,0x40,0xbe,0xf0,0x1, 0x78,0x2e,0x7e,0x27,0x27,0x52,0x9e,0x27,0x27, +0x5a,0x7e,0x14,0x22,0x69,0x12,0x7c,0x34,0xbd,0x23,0x38,0x13,0x7e,0x27,0x27,0x60, +0x9e,0x27,0x27,0x58,0x7e,0x14,0x22,0x6b,0x12,0x7c,0x34,0xbd,0x23,0x28,0x15,0x74, +0x3, 0x7a,0xb3,0x27,0x4a,0x80,0x5, 0xbe,0xf0,0x3, 0x78,0x8, 0x7a,0xc7,0x27,0x62, +0x7a,0xd7,0x27,0x64,0x7e,0xb3,0x27,0x4a,0x60,0x26,0x7d,0x3c,0x7d,0x2d,0x7e,0x17, +0x25,0xb5,0x7e,0x7, 0x25,0xb7,0x12,0x7e,0xd8,0xa, 0x2b,0x7e,0x73,0x27,0x49,0xa, +0x37,0xbd,0x32,0x58,0xb, 0x12,0x7d,0x43,0x7a,0xc7,0x25,0xb5,0x7a,0xd7,0x25,0xb7, +0xda,0xf8,0x22,0x7d,0x3c,0x7d,0x2d,0x7d,0x42,0x7d,0x13,0x7d,0x24,0x12,0xe4,0x4e, +0x7d,0x31,0x12,0xe3,0xc5,0x2, 0x7d,0x58,0x7e,0x3, 0x27,0x72,0xbe,0x0, 0x64,0x50, +0x2, 0xa1,0xed,0x80,0x7d,0x6c,0x99,0x7e,0xb3,0x27,0x49,0xbe,0xb0,0x20,0x50,0x5, +0x4, 0x7a,0xb3,0x27,0x49,0x7e,0x1f,0x25,0xb9,0x7a,0x1f,0x63,0x6d,0x7e,0x80,0x1, +0x80,0x45,0x74,0x4, 0xac,0xb8,0x49,0x35,0x25,0xb9,0x49,0x25,0x25,0xbb,0x7e,0x17, +0x63,0x6d,0x7e,0x7, 0x63,0x6f,0x12,0x7e,0xd8,0x7c,0x1b,0x7e,0x3, 0x27,0x49,0xbc, +0x1, 0x38,0x22,0xb, 0x90,0x7e,0x70,0x4, 0xac,0x78,0x2e,0x34,0x25,0xb9,0x7e,0x14, +0x63,0x6d,0x74,0x4, 0x12,0xbf,0xe4,0x7e,0x30,0x4, 0xac,0x39,0x2e,0x14,0x25,0xb9, +0x74,0x4, 0x12,0x23,0x44,0xb, 0x80,0x7e,0x3, 0x27,0x72,0xbc,0x8, 0x38,0xb3,0xa, +0x59,0xb, 0x54,0x7c,0xb, 0x7a,0x3, 0x27,0x72,0x7e,0x3, 0x27,0x49,0xbe,0x0, 0x20, +0x50,0xb, 0x7e,0x3, 0x27,0x72,0xbe,0x0, 0xec,0x40,0x2, 0xa1,0x65,0x22,0x7d,0x13, +0x7e,0x54,0x22,0x37,0x12,0x7e,0x1d,0x50,0x21,0x7e,0x54,0x22,0x39,0x12,0x7e,0x1d, +0x28,0x18,0x7e,0x14,0x22,0x3b,0x12,0x7c,0x34,0xbd,0x32,0x50,0xd, 0x7e,0x14,0x22, +0x3d,0x12,0x7c,0x34,0xbd,0x32,0x28,0x2, 0xe4,0x22,0x74,0x1, 0x22,0x7e,0x44,0x0, +0xff,0xb, 0x2a,0x30,0xbd,0x31,0x22,0x7e,0x47,0x6d,0x9d,0x7e,0x7, 0x6f,0x44,0x7e, +0x34,0x0, 0x6, 0xad,0x30,0x7e,0x14,0x0, 0x4, 0x12,0x7e,0xc8,0x8, 0x5, 0x7e,0xa0, +0x4, 0x80,0x1d,0x7d,0x30,0x3e,0x34,0x12,0x7e,0xc6,0x8, 0x5, 0x7e,0xa0,0x3, 0x80, +0xf, 0x7d,0x30,0x12,0x7e,0xc6,0x8, 0x5, 0x7e,0xa0,0x2, 0x80,0x3, 0x7e,0xa0,0x1, +0x7e,0xb3,0x6d,0xbf,0x60,0x3, 0x7e,0xa0,0x4, 0x12,0xcf,0xd1,0x60,0x3, 0x7e,0xa0, +0x1, 0xa, 0x2a,0x7e,0x14,0x22,0x9, 0x12,0x7c,0x34,0xad,0x32,0x12,0xe6,0x25,0x7e, +0xb3,0x6d,0x93,0xbe,0xb0,0x0, 0x28,0x28,0x7e,0xb3,0x6d,0xb4,0x70,0x22,0x7e,0x37, +0x6d,0xb0,0xbe,0x34,0x0, 0x2, 0x48,0x9, 0x12,0xae,0x4f,0x7a,0x37,0x6d,0xb0,0x80, +0xf, 0x7e,0x63,0x6d,0xb2,0x7e,0x70,0x2, 0xac,0x67,0x7c,0xb7,0x7a,0xb3,0x6d,0xb2, +0x7e,0xb3,0x76,0xe4,0xb4,0x1, 0xe, 0x7e,0x27,0x6d,0xb0,0x7e,0x34,0x0, 0x5, 0xad, +0x32,0x7a,0x37,0x6d,0xb0,0x22,0x3e,0x34,0x7d,0x21,0x12,0x22,0x71,0xbd,0x34,0x22, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0x22,0x7d,0x51,0x7d,0x12,0x7d,0x23,0x9d,0x25, +0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x7d,0x52,0x80,0x4, 0x6d,0x55,0x9d,0x52,0x7c,0xab, +0x7d,0x21,0x9d,0x20,0xbe,0x24,0x0, 0x0, 0x8, 0x4, 0x7d,0x32,0x80,0x4, 0x6d,0x33, +0x9d,0x32,0x7c,0xb7,0xbc,0xba,0x50,0x3, 0x7c,0xba,0x22,0x22,0x7e,0xb3,0x77,0xf, +0x70,0x6, 0x12,0x7f,0x45,0x2, 0xe3,0x43,0x12,0x7c,0x3c,0x12,0xe4,0x43,0x50,0xa, +0x12,0x7f,0x4b,0x7c,0x3b,0x12,0x7f,0x45,0x80,0x5, 0x12,0xb4,0xee,0x7c,0x3b,0x4c, +0x33,0x68,0x11,0x7c,0xb3,0x12,0xe3,0x49,0x60,0xa, 0x7a,0x33,0x77,0x12,0x74,0x1, +0x7a,0xb3,0x6f,0x37,0x22,0xe4,0x7a,0xb3,0x27,0x4a,0x22,0x12,0xe4,0x3a,0x7a,0x37, +0x27,0x66,0x12,0xe4,0x31,0x7a,0x37,0x27,0x68,0x7e,0x73,0x27,0x72,0xa, 0x37,0x7a, +0x35,0x27,0x7e,0x8, 0x25,0xb9,0x7e,0x18,0x27,0x4a,0x2, 0x7f,0x6d,0xca,0xf8,0x7e, +0x45,0x27,0x7c,0xb9,0x7a,0xb3,0x77,0xe1,0x74,0xff,0x7a,0xb3,0x77,0xe0,0x6d,0x55, +0x80,0x1f,0x7d,0xf5,0x3e,0xf4,0x3e,0xf4,0x7f,0x60,0x2d,0xdf,0xb, 0x6a,0xf0,0x7d, +0xe5,0x3e,0xe4,0x59,0xfe,0x63,0x6d,0x69,0xf6,0x0, 0x2, 0x59,0xfe,0x64,0x35,0xb, +0x54,0xbd,0x45,0x38,0xdd,0x7e,0x33,0x77,0xe1,0xbe,0x30,0x4, 0x38,0x3, 0x2, 0x80, +0x36,0x69,0xf1,0x0, 0x1c,0x69,0x11,0x0, 0x1e,0xbd,0x1f,0x18,0x19,0x4d,0x11,0x78, +0x4, 0x7e,0x14,0x0, 0x1, 0x7d,0x3f,0x7d,0x21,0x12,0x22,0x71,0x7c,0xf7,0x74,0x40, +0x7a,0xb3,0x77,0xe4,0x80,0x43,0x4d,0xff,0x78,0x4, 0x7e,0xf4,0x0, 0x1, 0x7d,0x31, +0x7d,0x2f,0x12,0x22,0x71,0x7c,0xf7,0x74,0x80,0x7a,0xb3,0x77,0xe4,0x7d,0xf, 0x2d, +0xf, 0xbd,0x1, 0x8, 0x24,0x1a,0x2, 0x1a,0x0, 0x7e,0x73,0x77,0xe4,0xa, 0x37,0x6d, +0x22,0x12,0x22,0xa3,0x7d,0x5f,0x1a,0x4a,0x1a,0x48,0x7d,0x1f,0x1a,0x2, 0x1a,0x0, +0x2f,0x2, 0x12,0x22,0xbf,0x7a,0x73,0x77,0xe4,0xbe,0xf0,0x5, 0x58,0x14,0x12,0x80, +0x55,0x12,0x81,0xd6,0x12,0x80,0x55,0x12,0x80,0x5e,0x12,0x80,0x55,0x12,0x82,0x85, +0x80,0xa, 0x74,0x7d,0x80,0x2, 0x74,0x7f,0x7a,0xb3,0x77,0xe0,0xe4,0x7a,0xb3,0x77, +0xe1,0x7e,0x73,0x78,0xe4,0xbe,0x73,0x77,0xe0,0x48,0x6, 0x7e,0xb3,0x77,0xe2,0x80, +0x1, 0xe4,0xda,0xf8,0x22,0x7e,0x8, 0x63,0x6d,0x7e,0x18,0x64,0x35,0x22,0xca,0x3b, +0x7f,0x71,0x7e,0x60,0x1, 0xb, 0xa, 0x20,0xb, 0x7a,0x50,0x7c,0x4b,0x7a,0x53,0x64, +0xfd,0x7a,0x43,0x65,0x61,0x7e,0x70,0x1, 0x7e,0xa0,0x1, 0x21,0x7f,0x7e,0x90,0x2, +0xac,0x9a,0x7f,0x60,0x2d,0xd4,0xb, 0x6a,0xd0,0x7d,0x7d,0x7c,0xbf,0xf5,0x29,0x7f, +0x67,0x2d,0xd4,0xb, 0x6a,0x40,0xa, 0xd5,0xa, 0xbb,0x7d,0xab,0x9d,0xad,0x7d,0x7a, +0x7c,0x8f,0xbe,0x80,0x0, 0x58,0x5, 0x6e,0x80,0xff,0xb, 0x80,0xa, 0xa4,0xa, 0x79, +0x9d,0x7a,0xbe,0xf0,0x0, 0x58,0x5, 0x6e,0xf0,0xff,0xb, 0xf0,0xbe,0x80,0x2, 0x58, +0x7, 0xbe,0xf0,0x2, 0x58,0x2, 0x21,0x7d,0xbe,0x60,0x0, 0x18,0x2, 0x21,0x65,0xbe, +0x70,0xec,0x28,0x2, 0x21,0x89,0xbe,0x80,0x8, 0x58,0x5, 0xbe,0xf0,0x8, 0x48,0x61, +0xa, 0xa7,0xb, 0xa4,0x7d,0x6a,0x7c,0x7d,0xa, 0xa5,0x2d,0xab,0x12,0x81,0xcd,0x19, +0xba,0x64,0xfd,0xa, 0xd9,0xa, 0xa4,0x2d,0xad,0x12,0x81,0xcd,0x19,0xba,0x65,0x61, +0x9, 0xba,0x64,0xfd,0xa, 0xdb,0xa, 0xc5,0x2d,0xcd,0xe, 0xc4,0x7d,0x6c,0x7c,0xbd, +0xa, 0xc7,0x19,0xbc,0x64,0xfc,0x9, 0xbc,0x65,0x61,0xa, 0xcb,0xa, 0xa4,0x2d,0xac, +0x12,0x81,0xcd,0x19,0xba,0x65,0x60,0x2d,0xdb,0x12,0x81,0xc4,0x19,0xbd,0x64,0xfe, +0xa, 0xd9,0x12,0x81,0xc2,0x19,0xbd,0x65,0x62,0xb, 0xd5,0x7d,0x6d,0x7c,0x7d,0x80, +0x24,0xbe,0x80,0x4, 0x58,0x5, 0xbe,0xf0,0x4, 0x48,0x1a,0xe5,0x29,0xa, 0xcb,0xa, +0xd5,0x12,0x81,0xc2,0x19,0xbd,0x64,0xfd,0xa, 0xc9,0xa, 0xd4,0x12,0x81,0xc2,0x19, +0xbd,0x65,0x61,0xb, 0x70,0xbe,0x70,0x64,0x50,0x1f,0x7e,0x51,0x29,0x7c,0x49,0xe5, +0x29,0xa, 0xd7,0x19,0xbd,0x64,0xfd,0x19,0x9d,0x65,0x61,0xb, 0x70,0xb, 0xa0,0x7e, +0xb3,0x77,0xe1,0xbc,0xba,0x28,0x2, 0x1, 0x7d,0x7a,0x73,0x77,0xe1,0x7e,0xa0,0x1, +0x80,0x25,0xa, 0x3a,0x9, 0xb3,0x64,0xfd,0xa, 0x2b,0x7e,0x70,0x2, 0xac,0x7a,0x7f, +0x60,0x2d,0xd3,0x1b,0x6a,0x20,0xa, 0x2a,0x9, 0xb2,0x65,0x61,0xa, 0x4b,0x2d,0x3f, +0x7d,0x2e,0x1b,0x1a,0x40,0xb, 0xa0,0x7e,0xb3,0x77,0xe1,0xbc,0xba,0x38,0xd3,0xda, +0x3b,0x22,0x2d,0xdc,0xe, 0xd4,0x7d,0x6d,0x7c,0xbd,0xa, 0xd7,0x22,0xe, 0xa4,0x7d, +0x6a,0x7c,0xbd,0xa, 0xa7,0x22,0xca,0xf8,0x7f,0x51,0x7f,0x40,0x7e,0x37,0x27,0x5a, +0x7a,0x37,0x65,0x1, 0x7e,0x37,0x27,0x58,0x7a,0x37,0x65,0x3, 0x7e,0x37,0x27,0x66, +0x7a,0x37,0x64,0xfd,0x7e,0x37,0x27,0x68,0x7a,0x37,0x64,0xff,0x6c,0xff,0x80,0x1e, +0x7e,0x34,0x64,0xfd,0x7e,0x14,0x0, 0x29,0x74,0x9, 0x12,0x23,0x44,0x74,0x2, 0xac, +0xbf,0x7f,0x4, 0x2d,0x15,0x7f,0x15,0x2d,0x35,0x12,0x82,0x29,0xb, 0xf0,0x7e,0x73, +0x77,0xe1,0xbc,0x7f,0x38,0xda,0xda,0xf8,0x22,0x7f,0x71,0x7f,0x60,0x7e,0x35,0x29, +0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x29,0x7e,0x35,0x2b, +0xbe,0x34,0x0, 0x0, 0x38,0x7, 0x7e,0x34,0x0, 0x1, 0x7a,0x35,0x2b,0xb, 0x6a,0x30, +0x9e,0x35,0x2d,0x6d,0x22,0x7e,0x33,0x77,0xe3,0x12,0x82,0x7e,0x7e,0x15,0x29,0x12, +0x22,0xbd,0x1b,0x6a,0x30,0xb, 0x7a,0x30,0x9e,0x35,0x2f,0x6d,0x22,0x7e,0x33,0x77, +0xe4,0x12,0x82,0x7e,0x7e,0x15,0x2b,0x12,0x22,0xbd,0x1b,0x7a,0x30,0x22,0xa, 0x13, +0x6d,0x0, 0x2, 0x22,0xa3,0xca,0x3b,0x7f,0x61,0x7f,0x50,0x7e,0x73,0x77,0xe1,0xbe, +0x70,0x20,0x40,0x52,0x7e,0xf0,0x2, 0x80,0x3c,0xa, 0x3f,0x6d,0x22,0x74,0x5, 0x2f, +0x11,0x14,0x78,0xfb,0x7e,0x33,0x77,0xe1,0xa, 0x13,0x6d,0x0, 0x12,0x22,0xbf,0x7c, +0xe7,0xbe,0xe0,0x2, 0x50,0x3, 0x7e,0xe0,0x2, 0xa, 0x6f,0x1b,0x64,0xa, 0x3e,0x1b, +0x34,0x7c,0xc7,0x7f,0x5, 0x7c,0xbd,0x12,0x82,0xef,0x7f,0x6, 0x7c,0xbd,0x7c,0x7c, +0x12,0x82,0xef,0xb, 0xf0,0x7e,0x73,0x77,0xe1,0xbc,0x7f,0x50,0xbc,0x7f,0x5, 0x7f, +0x16,0x12,0x83,0x41,0x80,0x6, 0x74,0x7e,0x7a,0xb3,0x77,0xe0,0xda,0x3b,0x22,0x7c, +0x97,0x7c,0xab,0x7f,0x10,0x7e,0x30,0x2, 0xac,0x3a,0x2d,0x13,0x7d,0x2, 0xb, 0xa, +0x10,0x7e,0x10,0x2, 0xac,0x19,0x7f,0x71,0x2d,0xf0,0xb, 0x7a,0x0, 0x7c,0x21,0xa5, +0xba,0x0, 0x14,0xa, 0x3, 0x1b,0x7a,0x0, 0xbc,0x9a,0x68,0x24,0x6d,0x44,0x74,0x2, +0xa4,0x2d,0x35,0x1b,0x1a,0x40,0x22,0xbc,0x9a,0x68,0x15,0xa, 0x2, 0xa, 0x13,0x2d, +0x10,0xe, 0x14,0x1b,0x7a,0x10,0x6d,0x11,0x74,0x2, 0xa4,0x2d,0x35,0x1b,0x1a,0x10, +0x22,0xca,0x79,0x6c,0xaa,0x7e,0x90,0x2, 0xac,0x9a,0x7f,0x70,0x2d,0xf4,0xb, 0x7a, +0xf0,0x7d,0x7f,0x7c,0xbf,0xa, 0xfa,0x19,0xbf,0x77,0xe5,0x7f,0x71,0x2d,0xf4,0xb, +0x7a,0x40,0x7c,0xb9,0xa, 0x4a,0x19,0xb4,0x78,0x5, 0xb, 0xa0,0xbe,0xa0,0x20,0x40, +0xd4,0x7e,0x8, 0x77,0xe5,0x7e,0x18,0x78,0x5, 0x74,0x20,0x12,0x83,0x81,0xda,0x79, +0x22,0xca,0x3b,0xf5,0x2d,0x7f,0x31,0x7a,0xd, 0x29,0x75,0x35,0x0, 0x75,0x36,0x0, +0x75,0x37,0x0, 0x7e,0x34,0x3, 0xe8,0x7a,0x35,0x40,0x75,0x33,0x3c,0x75,0x34,0x46, +0x75,0x2e,0x0, 0xa1,0x9f,0x12,0x85,0xd8,0x28,0x1e,0x7e,0x34,0x0, 0x44,0xca,0x39, +0x7e,0x71,0x2e,0x74,0x44,0xac,0x7b,0x2e,0x34,0xe, 0x6, 0x7e,0x24,0x0, 0xff,0x7e, +0x8, 0x65,0x7, 0x12,0x24,0x13,0x1b,0xfd,0x6d,0x33,0x7a,0x37,0x64,0xfd,0x7a,0x37, +0x64,0xff,0x7a,0x37,0x65,0x1, 0x7a,0x37,0x65,0x3, 0x7a,0x37,0x65,0x5, 0x7e,0x18, +0x65,0x7, 0x7a,0x1d,0x38,0x7e,0x18,0x65,0x27,0x7a,0x1d,0x3c,0x75,0x2f,0x0, 0x81, +0x85,0xe5,0x2f,0xa, 0x5b,0x7e,0x1d,0x29,0x2d,0x35,0x7e,0x1b,0x60,0xa, 0x26,0x7e, +0xd, 0x38,0x2d,0x15,0x7e,0xb, 0x70,0xa, 0xd7,0x7d,0xcd,0x9d,0xc2,0xbe,0xc4,0x0, +0x0, 0x8, 0x4, 0x9d,0xd2,0x80,0xa, 0xa, 0x26,0xa, 0x37,0x9d,0x32,0x6d,0xdd,0x9d, +0xd3,0x7e,0xc7,0x65,0x1, 0xbd,0xcd,0x58,0x4, 0x7a,0xd7,0x65,0x1, 0xe5,0x2f,0xa, +0xcb,0x7f,0x13,0x2d,0x3c,0x7e,0x1b,0x70,0xa, 0x27,0xe5,0x2f,0xa, 0x3b,0x7e,0xd, +0x3c,0x2d,0x13,0x7e,0xb, 0x70,0xa, 0xc7,0x12,0x85,0xe4,0x8, 0x4, 0x9d,0xc2,0x80, +0x4, 0x6d,0xcc,0x9d,0xc3,0x7e,0x37,0x65,0x3, 0xbd,0x3c,0x58,0x4, 0x7a,0xc7,0x65, +0x3, 0x7e,0x37,0x64,0xfd,0x2d,0x3d,0x7a,0x37,0x64,0xfd,0x7e,0x37,0x64,0xff,0x2d, +0x3c,0x7a,0x37,0x64,0xff,0x2d,0xcd,0x7e,0x37,0x65,0x5, 0xbd,0x3c,0x58,0x4, 0x7a, +0xc7,0x65,0x5, 0x5, 0x2f,0xe5,0x2d,0xbe,0xb1,0x2f,0x28,0x2, 0x61,0xf1,0xe5,0x2d, +0xb4,0xa, 0x2c,0x7e,0x37,0x65,0x1, 0xbe,0x34,0x0, 0x40,0x48,0xc, 0x7e,0x27,0x65, +0x3, 0xbe,0x24,0x0, 0x40,0x48,0x2, 0xa1,0x9d,0xbe,0x34,0x0, 0x60,0x8, 0x2, 0xa1, +0x9d,0x7e,0x37,0x65,0x3, 0xbe,0x34,0x0, 0x60,0x8, 0x2, 0xa1,0x9d,0x80,0x2a,0x7e, +0x37,0x65,0x1, 0xbe,0x34,0x0, 0x20,0x8, 0xc, 0x7e,0x27,0x65,0x3, 0xbe,0x24,0x0, +0x20,0x8, 0x2, 0xa1,0x9d,0xbe,0x34,0x0, 0x30,0x8, 0x2, 0xa1,0x9d,0x7e,0x37,0x65, +0x3, 0xbe,0x34,0x0, 0x30,0x8, 0x2, 0xa1,0x9d,0x7e,0xa3,0x77,0xe3,0x74,0xc, 0xa4, +0xbe,0x57,0x64,0xfd,0x58,0x2, 0xa1,0x9d,0x7e,0xa3,0x77,0xe4,0x74,0xc, 0xa4,0xbe, +0x57,0x64,0xff,0x58,0x2, 0xa1,0x9d,0x7e,0xd, 0x38,0x7e,0x1d,0x29,0xe5,0x2d,0x12, +0x85,0xeb,0xf5,0x30,0x7e,0xd, 0x3c,0x7f,0x13,0xe5,0x2d,0x12,0x85,0xeb,0xf5,0x31, +0xe5,0x33,0xbe,0xb1,0x30,0x38,0x76,0xe5,0x33,0xbe,0xb1,0x31,0x38,0x6f,0xe5,0x31, +0x7e,0x31,0x31,0xac,0x3b,0x1a,0x2, 0x1a,0x0, 0xe5,0x30,0x7e,0x71,0x30,0xac,0x7b, +0x1a,0x26,0x1a,0x24,0x2f,0x10,0xe5,0x31,0xa, 0xfb,0x6d,0xee,0xe5,0x30,0xa, 0x1b, +0x6d,0x0, 0x2f,0x7, 0x12,0x22,0xbf,0x7c,0xb7,0xf5,0x32,0xe5,0x34,0xbe,0xb1,0x32, +0x38,0x3b,0x7e,0x37,0x65,0x3, 0x2e,0x37,0x65,0x1, 0x2e,0x37,0x65,0x5, 0x7a,0x35, +0x42,0xe5,0x32,0xa, 0x2b,0x7e,0x34,0x0, 0x64,0x9d,0x32,0x3e,0x34,0x2e,0x35,0x42, +0x7a,0x35,0x42,0x7e,0x35,0x40,0xbe,0x35,0x42,0x8, 0x12,0x7e,0x35,0x42,0x7a,0x35, +0x40,0x85,0x32,0x36,0x7e,0xb3,0x65,0x49,0xf5,0x37,0x85,0x2e,0x35,0x5, 0x2e,0x12, +0x85,0xd8,0x28,0x2, 0x61,0xa5,0xe5,0x34,0xbe,0xb1,0x36,0x38,0x20,0xe5,0x37,0xbe, +0xb0,0x0, 0x28,0x19,0xe5,0x37,0xbe,0xb0,0xff,0x50,0x12,0xe5,0x35,0xa, 0x3b,0xb, +0x34,0x7a,0x73,0x77,0xe0,0xe5,0x37,0x7a,0xb3,0x77,0xe2,0x80,0x6, 0x74,0x7c,0x7a, +0xb3,0x77,0xe0,0xe5,0x36,0xda,0x3b,0x22,0x7e,0x73,0x78,0xe4,0xbe,0x71,0x2e,0x22, +0xa, 0xb, 0x7d,0x30,0x9d,0x32,0xbe,0x34,0x0, 0x0, 0x22,0xca,0x3b,0x7c,0xfb,0x7f, +0x61,0x7f,0x40,0x9f,0x11,0x7f,0x51,0x7f,0x71,0x7a,0x1f,0x65,0x4b,0x7a,0x1f,0x65, +0x4f,0x7a,0x1f,0x65,0x53,0xbe,0xf0,0xa, 0x78,0x6, 0x7e,0x54,0x1, 0x3c,0x80,0x4, +0x7e,0x54,0x2, 0x35,0x7a,0x55,0x48,0x6c,0xee,0x80,0x66,0xa, 0x5e,0x7f,0x14,0x12, +0x87,0x53,0x7a,0x55,0x46,0xa, 0x5e,0x7f,0x16,0x12,0x87,0x53,0x7a,0x55,0x44,0x7e, +0x35,0x44,0x12,0x87,0x4c,0x2f,0x50,0x7e,0x65,0x46,0x7d,0x16,0x1a,0x2, 0x1a,0x0, +0x2f,0x70,0x12,0x87,0x4c,0x12,0x87,0x42,0x7e,0x1f,0x65,0x4b,0x2f,0x10,0x7a,0x1f, +0x65,0x4b,0x7d,0x16,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x46,0x12,0x87,0x42,0x7e,0x1f, +0x65,0x4f,0x2f,0x10,0x7a,0x1f,0x65,0x4f,0x7e,0x15,0x46,0x1a,0x2, 0x1a,0x0, 0x7e, +0x35,0x44,0x12,0x87,0x42,0x7e,0x1f,0x65,0x53,0x2f,0x10,0x7a,0x1f,0x65,0x53,0xb, +0xe0,0xbc,0xfe,0x38,0x96,0xa, 0xdf,0x6d,0xcc,0x7f,0x15,0x7f,0x6, 0x12,0x23,0x10, +0x7f,0x51,0x7f,0x17,0x7f,0x6, 0x12,0x23,0x10,0x7f,0x71,0x7e,0x94,0x0, 0x64,0x7e, +0x1f,0x65,0x4b,0x7d,0x19,0x12,0x22,0xb4,0x7e,0x85,0x48,0x7d,0x18,0x7d,0xd8,0x1a, +0x12,0x1a,0xc2,0x7f,0x6, 0x12,0x23,0x10,0x7a,0x1f,0x65,0x4b,0x7e,0x1f,0x65,0x4f, +0x7d,0x19,0x12,0x22,0xb4,0x7f,0x6, 0x12,0x23,0x10,0x7a,0x1f,0x65,0x4f,0x7e,0x1f, +0x65,0x53,0x7d,0x19,0x12,0x22,0xb4,0x7d,0x18,0x1a,0x2, 0x1a,0x0, 0x12,0x23,0x10, +0x7a,0x1f,0x65,0x53,0x7f,0x15,0x7f,0x7, 0x12,0x22,0xa3,0x7e,0x6f,0x65,0x53,0x9f, +0x61,0x7f,0x15,0x7f,0x5, 0x12,0x22,0xa3,0x7e,0x5f,0x65,0x4b,0x9f,0x51,0x7f,0x17, +0x7f,0x7, 0x12,0x22,0xa3,0x7e,0x7f,0x65,0x4f,0x9f,0x71,0xbe,0x58,0x0, 0x0, 0x68, +0x6, 0xbe,0x78,0x0, 0x0, 0x78,0x6, 0x7e,0x44,0x0, 0x64,0x80,0x18,0x7f,0x16,0x7d, +0x19,0x12,0x22,0xb4,0x7f,0x5, 0x12,0x23,0x10,0x7f,0x6, 0x12,0x22,0xa3,0x7f,0x7, +0x12,0x23,0x10,0x7d,0x43,0xbe,0x44,0x0, 0x0, 0x18,0x2, 0x6d,0x44,0x7c,0xb9,0xda, +0x3b,0x22,0x1a,0x26,0x1a,0x24,0x12,0x22,0xa3,0x7f,0x1, 0x22,0x7d,0x13,0x1a,0x2, +0x1a,0x0, 0x22,0x2d,0x35,0x7e,0x1b,0x70,0xa, 0x57,0x22,0xca,0x79,0x7c,0xfb,0x7f, +0x51,0x7f,0x40,0x74,0x9, 0xac,0xbf,0x9, 0xb5,0x6e,0x28,0xf5,0x3b,0x74,0x9, 0xac, +0xbf,0x9, 0xb5,0x6e,0x29,0xc4,0x54,0xf0,0xf5,0x3c,0x74,0x9, 0xac,0xbf,0x9, 0xe5, +0x6e,0x27,0x12,0xe6,0x6f,0x28,0x58,0x7e,0xb3,0x6f,0x38,0x70,0x28,0x75,0x3d,0xf, +0x7e,0x8, 0x0, 0x3b,0xa, 0x3e,0x2e,0x34,0x28,0x27,0x6d,0x22,0x74,0x1, 0x12,0x97, +0x85,0x75,0x3d,0x20,0x7e,0x8, 0x0, 0x3c,0xa, 0x3e,0x2e,0x34,0x28,0x31,0x74,0x10, +0x12,0x97,0x85,0x80,0xe, 0xa, 0x3e,0x9, 0xb3,0x28,0x27,0xf5,0x3b,0x9, 0xb3,0x28, +0x31,0xf5,0x3c,0x74,0x9, 0xac,0xbe,0x9, 0xb5,0x6e,0xd7,0xb4,0x1, 0x11,0xe4,0xa, +0x3e,0x19,0xb3,0x28,0x27,0x19,0xb3,0x28,0x31,0x75,0x3b,0x0, 0x75,0x3c,0x0, 0x7e, +0xb3,0x6f,0x52,0xb4,0xff,0x16,0x85,0x3a,0x3b,0x75,0x3b,0x0, 0x74,0x9, 0xac,0xbf, +0x9, 0xb5,0x6e,0x27,0xbe,0xb0,0xff,0x68,0x3, 0x75,0x3b,0x1, 0xe5,0x3b,0x7a,0x4b, +0xb0,0xe5,0x3c,0x7a,0x5b,0xb0,0xda,0x79,0x22,0x7e,0x68,0x6e,0xd7,0x7e,0xb3,0x6f, +0x32,0xb4,0x1, 0x1a,0x7e,0xb3,0x6f,0x31,0x70,0x14,0x29,0x76,0x0, 0x8, 0xbe,0x70, +0x2d,0x50,0xb, 0xbe,0x70,0x0, 0x28,0x6, 0x74,0x3, 0x7a,0xb3,0x6f,0x3d,0x7e,0x73, +0x6f,0x3d,0xbe,0x70,0x0, 0x28,0x2d,0x7e,0x34,0x0, 0x9, 0xca,0x39,0x7e,0x18,0x27, +0x73,0x7e,0x8, 0x6e,0x23,0x12,0x24,0x13,0x1b,0xfd,0x7e,0xa3,0x6f,0x3d,0xbe,0xa0, +0x3, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xa0,0x1, 0x78,0x4, 0x74,0x1, 0x80,0x2, 0x74, +0x2, 0x7a,0x6b,0xb0,0x22,0xca,0x3b,0x75,0x28,0x0, 0x75,0x29,0x0, 0x75,0x2a,0x0, +0x75,0x2b,0x0, 0x75,0x2d,0x0, 0xc2,0x0, 0xc2,0x1, 0x7e,0x18,0x28,0x3b,0x7a,0x1d, +0x32,0x7e,0x18,0x6e,0xd7,0x7a,0x1d,0x36,0xe4,0x7e,0x34,0x28,0x3c,0x7e,0x24,0x0, +0x0, 0x7a,0x1b,0xb0,0x12,0xd3,0x94,0x12,0x88,0x9, 0x6c,0xee,0x80,0x39,0x74,0x9, +0xac,0xbe,0x9, 0xf5,0x6e,0x27,0x12,0xbf,0xdc,0x28,0x2a,0x12,0xe5,0x4e,0x2d,0x35, +0x7e,0x1b,0xb0,0xb4,0x1, 0x1f,0x12,0xe6,0xa6,0x70,0x1a,0x29,0x1, 0x0, 0x8, 0xbe, +0x0, 0x2d,0x50,0x11,0xbe,0x0, 0x0, 0x28,0xc, 0x7a,0xe1,0x2c,0x74,0x3, 0xa5,0xf7, +0x7a,0xf1,0x12,0x80,0x7, 0xb, 0xe0,0x12,0xe6,0x6f,0x38,0xc2,0x12,0xe5,0xc3,0x38, +0x2, 0x21,0x61,0xb4,0x3, 0x10,0x7e,0x34,0x0, 0x9, 0xca,0x39,0x12,0xe6,0x61,0x7e, +0x31,0x2c,0xac,0x3b,0x80,0x19,0x6c,0xee,0x80,0x24,0x7e,0x30,0x9, 0xac,0x3e,0x9, +0xb1,0x6e,0x27,0xb4,0xff,0x16,0x7e,0x4, 0x0, 0x9, 0xca,0x9, 0x12,0xe6,0x61,0x2e, +0x14,0x6e,0x23,0x6d,0x0, 0x12,0x24,0x13,0x1b,0xfd,0x80,0x7, 0xb, 0xe0,0x12,0xe6, +0x6f,0x38,0xd7,0x7e,0x11,0x12,0x2e,0x10,0x8, 0xa5,0xe7,0x7c,0xab,0xbe,0xa0,0x3, +0x78,0x13,0x6c,0x33,0x7e,0x11,0x12,0x74,0x9, 0xac,0x1b,0x7e,0x1d,0x36,0x2d,0x30, +0x7a,0x1b,0x30,0x80,0x1c,0xbe,0xa0,0x1, 0x78,0x5, 0x7e,0xa0,0x1, 0x80,0x3, 0x7e, +0xa0,0x2, 0x7e,0x31,0x12,0x74,0x9, 0xac,0x3b,0x7e,0x1d,0x36,0x2d,0x31,0x7a,0x1b, +0xa0,0x7e,0xb3,0x6f,0x3a,0x70,0x1a,0x7e,0xb3,0x6f,0x36,0x70,0x14,0x7e,0xb3,0x6f, +0x37,0x70,0xe, 0x12,0xe5,0xc3,0x38,0x9, 0x7e,0xb3,0x6f,0x3d,0x70,0x3, 0x2, 0x90, +0x31,0x12,0xe5,0xc3,0x28,0x3, 0x14,0xa5,0xf7,0x7e,0xb3,0x6f,0x3d,0x60,0x5, 0x14, +0x7a,0xb3,0x6f,0x3d,0x30,0x21,0x6, 0x7e,0x18,0x28,0x79,0x80,0x4, 0x7e,0x18,0x28, +0x3b,0x7a,0x1d,0x32,0x7e,0xd, 0x32,0x12,0x77,0xa7,0x6c,0xee,0xe1,0xcc,0x7e,0x70, +0x9, 0xac,0x7e,0x9, 0xf3,0x6e,0x27,0x12,0xbf,0xdc,0x38,0x2, 0xe1,0xca,0x7c,0xaf, +0x5e,0xa0,0xf, 0x74,0x9, 0xa4,0x7e,0xd, 0x36,0x2d,0x15,0x7e,0xb, 0xc0,0x7e,0x90, +0x4, 0xac,0x9f,0x9, 0xa4,0x28,0xba,0x4c,0xaa,0x78,0x2, 0x41,0x94,0x49,0x23,0x6e, +0x23,0x4d,0x22,0x78,0xa, 0x49,0x33,0x6e,0x25,0x4d,0x33,0x78,0x2, 0x41,0x94,0xbe, +0xa0,0x4, 0x28,0x5, 0x7e,0xd0,0x38,0x80,0x21,0xbe,0xa0,0x4, 0x78,0x5, 0x7e,0xd0, +0x30,0x80,0x17,0xbe,0xa0,0x3, 0x78,0x5, 0x7e,0xd0,0x20,0x80,0xd, 0xbe,0xa0,0x2, +0x78,0x5, 0x7e,0xd0,0x18,0x80,0x3, 0x7e,0xd0,0x10,0x75,0x27,0x0, 0x80,0x64,0x7e, +0x91,0x27,0x74,0x9, 0xac,0x9b,0x9, 0xb4,0x27,0xd1,0x54,0xf, 0xbc,0xbf,0x78,0x51, +0x74,0x9, 0xac,0xbe,0x49,0x35,0x6e,0x23,0x12,0xe5,0xaf,0x49,0x34,0x27,0xcd,0x12, +0xe6,0x53,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x74,0x9, +0xac,0xbe,0x59,0x35,0x6e,0x23,0x7e,0x90,0x9, 0xac,0x9e,0x49,0x34,0x6e,0x25,0x12, +0xe5,0xaf,0x7e,0xa1,0x27,0x74,0x9, 0xa4,0x49,0x35,0x27,0xcf,0x12,0xe6,0x53,0x1e, +0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x59,0x34,0x6e,0x25,0x80, +0x7, 0x5, 0x27,0x12,0xb3,0x6e,0x38,0x97,0x7e,0x70,0x4, 0xac,0x7f,0x2e,0x34,0x28, +0xba,0x12,0xe7,0x28,0x12,0xe5,0x4e,0x2d,0x35,0x7e,0x1b,0xb0,0xb4,0x1, 0x17,0x12, +0xe6,0xa6,0x70,0x12,0x7e,0xb3,0x6f,0x3d,0x70,0xc, 0xe4,0x39,0xb1,0x0, 0x8, 0x12, +0xe6,0x82,0x7a,0xb3,0x28,0xe5,0x4c,0xcc,0x68,0x2, 0xc1,0xe4,0x12,0xe6,0xa6,0x60, +0x2, 0xc1,0xe4,0x7e,0xb3,0x6f,0x3d,0x60,0x2, 0xc1,0xe4,0x74,0x9, 0xac,0xbe,0x49, +0x35,0x6e,0x23,0xbe,0x34,0x0, 0x14,0x38,0x10,0x12,0xe6,0xf7,0x40,0xb, 0x12,0x6f, +0xd9,0x9e,0x24,0x0, 0x14,0xbd,0x42,0x28,0x3b,0x7e,0x14,0x21,0xde,0x12,0xb4,0xe6, +0x7d,0x2c,0x9e,0x24,0x0, 0x14,0xbd,0x32,0x40,0x10,0x12,0xe6,0xf7,0x40,0xb, 0x12, +0x6f,0xd9,0x9e,0x24,0x0, 0x14,0xbd,0x42,0x28,0x1a,0x49,0xd5,0x6e,0x25,0xbe,0xd4, +0x0, 0x0, 0x28,0x2, 0xa1,0x9c,0xbe,0x34,0x0, 0x0, 0x50,0x2, 0xa1,0x9c,0xbd,0x3c, +0x28,0x2, 0xa1,0x9c,0x12,0xe6,0x45,0x12,0xe5,0xa8,0xbe,0x34,0x0, 0xc8,0x58,0x18, +0x12,0xe6,0xee,0xbe,0x44,0x0, 0x14,0x38,0xf, 0x12,0xe5,0xcf,0x40,0xa, 0x12,0xb4, +0xe2,0x12,0xe6,0xba,0x38,0x2, 0x81,0x9c,0x12,0xe5,0x9f,0xbe,0x34,0x0, 0xc8,0x58, +0x14,0x12,0xe5,0x56,0x40,0xf, 0x12,0xe5,0xcf,0x40,0xa, 0x12,0xb4,0xe2,0x12,0xe6, +0xba,0x38,0x2, 0x81,0x9c,0x12,0xe5,0x9f,0xbe,0x34,0x0, 0x0, 0x58,0x25,0x74,0x9, +0xac,0xbe,0x49,0x45,0x6e,0x25,0xbe,0x44,0x0, 0x0, 0x38,0x17,0x49,0x35,0x6e,0x23, +0xbe,0x34,0x0, 0x0, 0x40,0xd, 0x7e,0x14,0x21,0xde,0x12,0xb4,0xe6,0xbd,0x3c,0x38, +0x2, 0x81,0x9c,0x12,0xe5,0x43,0x29,0xb1,0x0, 0x8, 0x70,0x2e,0x7e,0x4, 0x0, 0x9, +0xca,0x9, 0x7e,0x70,0x9, 0xac,0x7e,0x2e,0x34,0x6e,0x23,0x6d,0x22,0x2e,0x14,0x27, +0x73,0x6d,0x0, 0x12,0x24,0x13,0x1b,0xfd,0x12,0xe5,0x4e,0x2d,0x35,0x2e,0x34,0x0, +0x8, 0x7e,0x1b,0xb0,0x4, 0x7a,0x1b,0xb0,0x81,0x9c,0x12,0xe4,0xe4,0x2d,0xc3,0xbe, +0xc4,0x0, 0x32,0x58,0x42,0x7e,0x70,0x9, 0xac,0x7e,0x49,0x23,0x6e,0x23,0xbe,0x24, +0x0, 0x14,0x38,0x33,0x49,0xc3,0x6e,0x25,0xbe,0xc4,0x0, 0x14,0x40,0x29,0x12,0x6f, +0xd9,0x9e,0x24,0x0, 0x14,0xbd,0xc2,0x38,0x1e,0x12,0x9c,0xfb,0x50,0xa, 0x7e,0xa0, +0x2d,0x12,0xe5,0x43,0x39,0xa1,0x0, 0x8, 0x12,0xe5,0x4e,0x12,0xe5,0xfb,0x40,0x2, +0x81,0x9c,0x12,0xe6,0x3c,0x81,0x9c,0x12,0xe4,0xe4,0x2d,0xc3,0xbe,0xc4,0x0, 0x32, +0x58,0x31,0x12,0xe5,0x56,0x40,0x2c,0x12,0xe5,0xcf,0x40,0x27,0x12,0xb4,0xe2,0x12, +0xe6,0xba,0x38,0x1f,0x12,0xe6,0x45,0x12,0x9c,0xff,0x50,0xa, 0x7e,0xa0,0x2d,0x12, +0xe5,0x43,0x39,0xa1,0x0, 0x8, 0x12,0xe5,0x4e,0x12,0xe5,0xfb,0x50,0x4e,0x12,0xe6, +0x3c,0x80,0x49,0x12,0xe4,0xe4,0x2d,0xc3,0xbe,0xc4,0x0, 0x0, 0x58,0x4a,0x7e,0x70, +0x9, 0xac,0x7e,0x49,0x23,0x6e,0x25,0xbe,0x24,0x0, 0x0, 0x38,0x3b,0x49,0xc3,0x6e, +0x23,0xbe,0xc4,0x0, 0x0, 0x40,0x31,0x7e,0x14,0x21,0xde,0x12,0x6f,0xdd,0xbd,0xc2, +0x38,0x26,0x12,0x9c,0xfb,0x50,0xa, 0x7e,0xa0,0x2d,0x12,0xe5,0x43,0x39,0xa1,0x0, +0x8, 0x12,0xe5,0x4e,0x12,0xe5,0xfb,0x50,0x3, 0x12,0xe6,0x3c,0x7e,0xc0,0x3, 0x12, +0xe5,0x33,0x39,0xa1,0x0, 0x1, 0xa1,0xe6,0x7e,0x50,0x9, 0xac,0x5e,0x49,0x42,0x6e, +0x23,0xbe,0x44,0x0, 0x14,0x38,0x47,0x49,0x32,0x6e,0x25,0xbe,0x34,0x0, 0x14,0x40, +0x3d,0x7e,0x14,0x21,0xec,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x50,0x9e,0x54,0x0, 0x14, +0xbd,0x35,0x38,0x2a,0x74,0x9, 0xac,0xbf,0x49,0xc5,0x27,0x73,0x4d,0xcc,0x78,0xa, +0x49,0xc5,0x27,0x75,0x4d,0xcc,0x78,0x2, 0xa1,0xdc,0x12,0xe4,0xf0,0x7d,0x53,0x2d, +0x5c,0xbe,0x54,0x1, 0x2c,0x8, 0x2, 0xa1,0xdc,0x12,0xe5,0x10,0xa1,0xdc,0x7e,0x34, +0x21,0xde,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x0, 0x7d,0x10,0x9e,0x14,0x0, 0x14,0xbd, +0x41,0x40,0x52,0x74,0x9, 0xac,0xbe,0x12,0xe5,0xcf,0x40,0x49,0x12,0xe6,0xd3,0xb, +0x7a,0x20,0x9e,0x24,0x0, 0x14,0xbd,0x32,0x38,0x3b,0x74,0x9, 0xac,0xbf,0x49,0x25, +0x27,0x73,0x4d,0x22,0x78,0xa, 0x49,0x25,0x27,0x75,0x4d,0x22,0x78,0x2, 0xa1,0xdc, +0x49,0x25,0x27,0x75,0x12,0xe7,0x38,0x12,0xe4,0xfb,0x2d,0x13,0xbe,0x14,0x1, 0x2c, +0x8, 0x2, 0xa1,0xdc,0x7e,0xa0,0x5, 0x7e,0x30,0x4, 0xac,0x3f,0x19,0xa1,0x28,0xba, +0x12,0xe5,0x1c,0x80,0x77,0x74,0x9, 0xac,0xbe,0x12,0xe6,0x33,0x38,0x78,0xbe,0x44, +0x0, 0x0, 0x40,0x72,0xbd,0x40,0x38,0x6e,0x74,0x9, 0xac,0xbf,0x49,0x25,0x27,0x73, +0x4d,0x22,0x78,0x8, 0x49,0x25,0x27,0x75,0x4d,0x22,0x68,0x50,0x12,0xe4,0xf0,0x2d, +0xc3,0xbe,0xc4,0x1, 0x2c,0x18,0x45,0x12,0xe5,0x10,0x80,0x40,0x7e,0x70,0x9, 0xac, +0x7f,0x7e,0xd, 0x36,0x2d,0x13,0x29,0x50,0x0, 0x8, 0xbe,0x50,0x0, 0x28,0x37,0x7e, +0xb3,0x28,0xe5,0x70,0x31,0x49,0x23,0x27,0x73,0x4d,0x22,0x78,0x8, 0x49,0x23,0x27, +0x75,0x4d,0x22,0x68,0x17,0x49,0x23,0x27,0x75,0x7d,0x3d,0x12,0xe7,0x38,0x12,0xe4, +0xfb,0x2d,0x31,0xbe,0x34,0x1, 0x2c,0x18,0x3, 0x12,0xe5,0x10,0x7e,0xa0,0x2d,0x12, +0xe5,0x43,0x39,0xa1,0x0, 0x8, 0x4c,0xcc,0x68,0x2, 0xc1,0xe4,0x7e,0x70,0x9, 0xac, +0x7e,0x12,0x9c,0xfb,0x92,0x1f,0x30,0x1f,0x3c,0x12,0xe6,0x82,0x12,0xe5,0x4e,0x2d, +0x35,0x29,0xb1,0x0, 0x6, 0x70,0x6, 0x74,0x1, 0x39,0xb1,0x0, 0x6, 0x12,0xe5,0x4e, +0x2d,0x35,0x29,0x31,0x0, 0x6, 0xbe,0x30,0x1, 0x28,0x2, 0xc1,0xe4,0x4c,0xcc,0x78, +0x3, 0x7e,0xc0,0x3, 0x74,0x2d,0x39,0xb1,0x0, 0x8, 0xd2,0x20,0x12,0xe5,0x33,0x39, +0xa1,0x0, 0x1, 0xc1,0xe4,0x74,0x9, 0xac,0xbe,0x49,0x25,0x6e,0x23,0xbe,0x24,0x0, +0x14,0x28,0x14,0x7e,0x14,0x21,0xde,0x12,0x7c,0x34,0x9e,0x34,0x0, 0x14,0xbd,0x23, +0x50,0x5, 0x12,0xe6,0x33,0x38,0x7c,0xbe,0x24,0x0, 0x14,0x38,0xb, 0x12,0xe6,0x33, +0x40,0x6, 0xbe,0x34,0x0, 0x14,0x28,0x6b,0x7e,0x14,0x21,0xde,0x12,0x7c,0x34,0x9e, +0x34,0x0, 0x14,0xbd,0x23,0x40,0x14,0x74,0x9, 0xac,0xbe,0x49,0x15,0x6e,0x25,0xbe, +0x14,0x0, 0x0, 0x40,0x6, 0xbe,0x14,0x0, 0x14,0x28,0x48,0xbe,0x24,0x0, 0x14,0x38, +0x21,0x74,0x9, 0xac,0xbe,0x49,0x5, 0x6e,0x25,0x7e,0x54,0x21,0xec,0x7e,0x44,0x0, +0xff,0xb, 0x2a,0x10,0x7d,0x51,0x9e,0x54,0x0, 0x14,0xbd,0x5, 0x40,0x4, 0xbd,0x1, +0x28,0x21,0xbd,0x23,0x40,0x2e,0x74,0x9, 0xac,0xbe,0x49,0x25,0x6e,0x25,0x7e,0x14, +0x21,0xec,0x12,0x7c,0x34,0x7d,0x13,0x9e,0x14,0x0, 0x14,0xbd,0x21,0x40,0x15,0xbd, +0x23,0x38,0x11,0x12,0xe5,0x4e,0x2d,0x35,0x29,0xb1,0x0, 0x6, 0x70,0x6, 0x74,0x2, +0x39,0xb1,0x0, 0x6, 0xbe,0xc0,0x3, 0x78,0x2, 0xe1,0xca,0x12,0xe6,0xee,0x7a,0x45, +0x2e,0x49,0x35,0x6e,0x25,0x7a,0x35,0x30,0xbe,0xc0,0x1, 0x78,0x3b,0x6c,0xaa,0x7e, +0x70,0x4, 0xac,0x7f,0x19,0xa3,0x28,0xb8,0x12,0xe5,0x43,0x39,0xa1,0x0, 0x6, 0x75, +0x27,0x0, 0x80,0x1f,0x12,0xb3,0xa1,0x9, 0xb3,0x27,0xd1,0x54,0xf, 0xbc,0xbf,0x78, +0x10,0x49,0x23,0x27,0xcd,0x7a,0x25,0x2e,0x49,0x33,0x27,0xcf,0x7a,0x35,0x30,0x80, +0x7, 0x5, 0x27,0x12,0xb3,0x6e,0x38,0xdc,0x85,0x28,0x3a,0x7e,0x8, 0x0, 0x2a,0x7e, +0x18,0x0, 0x2b,0x7c,0xbe,0x12,0x87,0x5b,0x7e,0x35,0x2e,0x5e,0x60,0xf, 0x7a,0x35, +0x2e,0x7e,0x35,0x30,0x5e,0x60,0xf, 0x7a,0x35,0x30,0x7e,0x90,0x9, 0xac,0x9e,0x9, +0x74,0x6e,0x27,0xa, 0x57,0xc4,0x54,0xf0,0x7c,0xab,0xe4,0x7d,0x25,0x2e,0x25,0x30, +0x7a,0x25,0x30,0xbe,0x70,0xff,0x68,0x19,0xbe,0xc0,0x1, 0x68,0x2, 0x5, 0x28,0x5, +0x2d,0xa, 0x5c,0x3, 0x3, 0x54,0xc0,0x7c,0xab,0xe4,0x7d,0x35,0x2e,0x35,0x2e,0x80, +0x7, 0x7e,0x35,0x2e,0x2e,0x34,0xc0,0x0, 0x7a,0x35,0x2e,0x12,0xe6,0x9a,0x79,0x30, +0x0, 0x2, 0x7e,0x35,0x30,0x12,0xe6,0x9a,0x79,0x30,0x0, 0x4, 0x7e,0xa1,0x2a,0x7e, +0x31,0x29,0x74,0x6, 0x12,0xe7,0x30,0x39,0xa1,0x0, 0x6, 0x7e,0xa1,0x2b,0x7e,0x31, +0x29,0x12,0xe7,0x30,0x39,0xa1,0x0, 0x7, 0x5, 0x29,0xb, 0xe0,0x12,0xe6,0x6f,0x28, +0x2, 0x21,0xae,0xe5,0x28,0x7e,0x1d,0x32,0x39,0xb1,0x0, 0x1, 0x7e,0x33,0x6f,0x33, +0x7e,0x1d,0x32,0x7a,0x1b,0x30,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0xf, 0x7e,0xb3,0x6f, +0x37,0xb4,0x1, 0x1c,0x74,0x5, 0x7a,0xb3,0x78,0x93,0x80,0xf, 0xe5,0x2d,0xbe,0xb0, +0x0, 0x38,0x6, 0x7e,0xb3,0x6f,0x37,0x60,0x7, 0xb2,0x21,0xc2,0x86,0x12,0x96,0xe4, +0x7e,0xb3,0x6f,0x36,0x60,0xc, 0x7e,0xb3,0x6f,0x3d,0x70,0x6, 0x7e,0xd, 0x36,0x12, +0x90,0x7b,0xe4,0x7a,0xb3,0x6f,0x3a,0x7a,0xb3,0x6f,0x36,0x7a,0xb3,0x6f,0x37,0x80, +0x1e,0x7e,0xd, 0x36,0x12,0x90,0x7b,0x6c,0xee,0x6c,0xaa,0x80,0xb, 0x7c,0x1e,0x2e, +0x10,0x8, 0x7c,0xba,0xa5,0xf7,0xb, 0xe0,0xbe,0xe0,0xa, 0x40,0xf0,0xd2,0x86,0x12, +0x90,0xc9,0xca,0x59,0x7e,0x18,0x6e,0x23,0x7e,0x8, 0x27,0xcd,0x12,0x24,0x13,0x1b, +0xfd,0xe5,0x2d,0x70,0x10,0x12,0x73,0x78,0x74,0x9, 0xac,0x7b,0x7e,0x8, 0x27,0xcd, +0x74,0xff,0x12,0x24,0x38,0x12,0x96,0xf6,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xaa,0x80, +0x40,0x7e,0xf0,0x3, 0x7e,0x90,0x9, 0xac,0x9a,0x7f,0x10,0x2d,0x34,0x7a,0x1b,0xf0, +0x74,0x3, 0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0x1, 0x7e,0x34,0x7f,0xff,0x7f,0x70, +0x2d,0xf4,0x79,0x37,0x0, 0x2, 0x7f,0x70,0x2d,0xf4,0x79,0x37,0x0, 0x4, 0xe4,0x7f, +0x10,0x2d,0x34,0x39,0xb1,0x0, 0x6, 0x7f,0x10,0x2d,0x34,0x39,0xb1,0x0, 0x8, 0xb, +0xa0,0x12,0x45,0x1f,0x38,0xbb,0xda,0xf8,0x22,0x90,0x21,0x51,0xe4,0x93,0x7c,0xab, +0x74,0x9, 0xa4,0x22,0xca,0x79,0x7e,0xf3,0x6f,0x31,0x7e,0xe3,0x6f,0x32,0x7c,0xbf, +0x7c,0x7e,0x12,0x44,0xc6,0x7c,0xbf,0x12,0x91,0x65,0x4c,0xee,0x78,0x17,0x12,0x90, +0xc9,0xca,0x59,0x7e,0x18,0x6d,0xc9,0x7e,0x8, 0x6e,0x7d,0x12,0x24,0x13,0x1b,0xfd, +0x12,0x91,0x1b,0x80,0xe, 0x7e,0xb3,0x6f,0x38,0x70,0x8, 0x12,0x91,0x1b,0x7c,0xbf, +0x12,0x92,0xc7,0x7c,0xbf,0x12,0x97,0x18,0xda,0x79,0x22,0x7e,0xa3,0x6f,0x31,0x6c, +0x77,0x80,0x3d,0x7e,0x90,0x9, 0xac,0x97,0x9, 0x64,0x6e,0x81,0x7e,0x50,0x9, 0xac, +0x56,0x9, 0xb2,0x6e,0xd7,0x70,0x27,0x74,0x1, 0x19,0xb2,0x59,0xe1,0x49,0x14,0x6d, +0xc9,0x59,0x12,0x59,0xe2,0x49,0x14,0x6d,0xcb,0x59,0x12,0x59,0xe4,0xe4,0x19,0xb2, +0x59,0xe6,0x19,0xb2,0x59,0xde,0x19,0xb2,0x59,0xdf,0x19,0xb2,0x59,0xe0,0xb, 0x70, +0xbc,0xa7,0x38,0xbf,0x22,0xca,0x79,0x7c,0xeb,0x90,0x21,0x51,0xe4,0x93,0x7c,0xfb, +0x7e,0x70,0x9, 0xac,0x7f,0x7e,0x8, 0x63,0x6d,0x74,0xff,0x12,0x24,0x38,0xe4,0x6c, +0x77,0x7c,0x6e,0x12,0x91,0xeb,0x7c,0x7e,0x7c,0x6f,0x12,0x91,0xeb,0x7c,0x1b,0x6c, +0x0, 0x80,0x3e,0x6c,0x99,0x80,0x17,0x74,0x9, 0xac,0xb9,0x9, 0xa5,0x63,0x71,0x7e, +0x30,0x9, 0xac,0x30,0x9, 0x81,0x6d,0xcd,0xbc,0x8a,0x68,0x6, 0xb, 0x90,0xbc,0x19, +0x38,0xe5,0xbc,0x19,0x78,0x19,0x7e,0x70,0x9, 0xac,0x70,0x2e,0x34,0x6d,0xc9,0x7e, +0x30,0x9, 0xac,0x31,0x2e,0x14,0x63,0x6d,0x74,0x9, 0x12,0x23,0x44,0xb, 0x10,0xb, +0x0, 0xbc,0xf0,0x38,0xbe,0x74,0x9, 0xac,0xbf,0xca,0x59,0x7e,0x18,0x63,0x6d,0x7e, +0x8, 0x6e,0x7d,0x12,0x24,0x13,0x1b,0xfd,0xda,0x79,0x22,0x7e,0x8, 0x63,0x6d,0xca, +0x69,0xca,0xf8,0x7f,0x70,0x7c,0x86,0x7c,0xf7,0x7c,0xab,0x6c,0x99,0x41,0xaf,0x7c, +0x3f,0x41,0xa7,0x7e,0x10,0x9, 0xac,0x19,0x9, 0x20,0x6e,0x81,0x7e,0x10,0x9, 0xac, +0x13,0x9, 0xb0,0x6d,0xcd,0xbc,0xb2,0x68,0x2, 0x41,0xa5,0xbe,0x20,0xff,0x78,0x2, +0x41,0xa5,0x7e,0xd0,0x9, 0xac,0xd2,0x9, 0xb6,0x6e,0xd7,0x70,0xa, 0x7d,0x30,0x2e, +0x34,0x6d,0xc9,0x6d,0x22,0x80,0xb, 0x7e,0x70,0x9, 0xac,0x79,0x2e,0x34,0x6e,0x7d, +0x6d,0x22,0x29,0x11,0x0, 0x4, 0x12,0x92,0xbd,0x39,0x16,0x0, 0x4, 0xb, 0x1a,0x0, +0x12,0x92,0xbd,0x1b,0x6a,0x0, 0x69,0x1, 0x0, 0x2, 0x12,0x92,0xbd,0x79,0x6, 0x0, +0x2, 0x7e,0x10,0x9, 0xac,0x13,0x9, 0x10,0x6d,0xce,0x12,0x92,0xbd,0x39,0x16,0x0, +0x5, 0x7e,0x10,0x9, 0xac,0x13,0x9, 0x10,0x6d,0xcf,0x12,0x92,0xbd,0x39,0x16,0x0, +0x6, 0x7e,0x10,0x9, 0xac,0x13,0x9, 0x10,0x6d,0xd0,0x12,0x92,0xbd,0x39,0x16,0x0, +0x7, 0x7e,0x10,0x9, 0xac,0x13,0x9, 0x10,0x6d,0xd1,0x12,0x92,0xbd,0x39,0x16,0x0, +0x8, 0xb, 0xa0,0x80,0x8, 0xb, 0x30,0xbc,0x83,0x28,0x2, 0x41,0x3, 0xb, 0x90,0x12, +0x96,0xdc,0x28,0x2, 0x21,0xff,0x7c,0xba,0xda,0xf8,0xda,0x69,0x22,0x7e,0xd0,0x9, +0xac,0xda,0x7f,0x67,0x2d,0xd6,0x22,0xca,0x3b,0x7c,0xfb,0x6c,0xee,0x61,0x61,0x6c, +0xdd,0x80,0x16,0x74,0x9, 0xac,0xbd,0x9, 0x65,0x6e,0x81,0x74,0x9, 0xac,0xbe,0x9, +0x75,0x6d,0xcd,0xbc,0x67,0x68,0x7, 0xb, 0xd0,0x12,0x94,0xbd,0x38,0xe5,0x12,0x94, +0xbd,0x28,0x74,0x7e,0x50,0x9, 0xac,0x5d,0x9, 0xc2,0x6e,0x81,0x49,0x42,0x6e,0x7f, +0x74,0x9, 0xac,0xbe,0x49,0xa5,0x6d,0xcb,0x7d,0x3a,0x9d,0x34,0xbe,0x34,0x0, 0x0, +0x8, 0x4, 0x9d,0xa4,0x80,0x4, 0x6d,0xaa,0x9d,0xa3,0x49,0x42,0x6e,0x7d,0x49,0xb5, +0x6d,0xc9,0x7d,0x3b,0x9d,0x34,0xbe,0x34,0x0, 0x0, 0x8, 0x4, 0x9d,0xb4,0x80,0x4, +0x6d,0xbb,0x9d,0xb3,0x2d,0xba,0x74,0x9, 0xac,0xbc,0x9, 0xb5,0x6e,0xd7,0xb4,0x1, +0xe, 0x6d,0xaa,0x74,0x2, 0xac,0xbc,0x59,0xa5,0x5a,0x44,0x59,0xa5,0x5c,0xc5,0x7d, +0x3b,0x7c,0xbd,0x7c,0x5e,0x7c,0x4c,0x12,0x95,0xc6,0x7c,0xbd,0x12,0x93,0x6a,0xb, +0xe0,0xbc,0xfe,0x28,0x2, 0x41,0xcf,0xda,0x3b,0x22,0x2, 0x93,0x6d,0xca,0x3b,0x7c, +0xd4,0x7c,0xe5,0x7c,0xfb,0x7d,0xf3,0x7e,0x17,0x6f,0x50,0xbd,0x13,0x38,0x6, 0x7e, +0xd4,0x1, 0x0, 0x80,0x17,0x6d,0x22,0x7c,0x56,0x7c,0x67,0x6c,0x77,0x12,0x22,0xbd, +0x7d,0xd3,0xbe,0xd4,0x0, 0x10,0x50,0x4, 0x7e,0xd4,0x0, 0x10,0x74,0x2, 0xac,0xbd, +0x49,0x45,0x5c,0xc5,0xbd,0x4f,0x28,0x6, 0x49,0xd5,0x5a,0x44,0x80,0x4, 0x59,0xd5, +0x5a,0x44,0x59,0xf5,0x5c,0xc5,0xbe,0xd4,0x1, 0x0, 0x28,0x4, 0x7e,0xd4,0x1, 0x0, +0x7e,0xb3,0x6f,0x57,0x60,0xb, 0x7e,0x73,0x6f,0x31,0xbe,0x70,0x2, 0x40,0x2, 0x1e, +0xd4,0x7e,0x73,0x6f,0x31,0xbe,0x70,0x5, 0x28,0x2, 0x1e,0xd4,0xbe,0xd4,0x0, 0x20, +0x50,0x11,0x7e,0x70,0x9, 0xac,0x7d,0x9, 0xb3,0x59,0xe6,0xb4,0x1, 0x5, 0xe4,0x19, +0xb3,0x59,0xe6,0xbe,0xd4,0x0, 0x40,0x28,0xc, 0x7e,0xa0,0x1, 0x7e,0x70,0x9, 0xac, +0x7d,0x19,0xa3,0x59,0xe6,0x7c,0xbe,0x7c,0x7d,0x12,0x94,0xc5,0x7d,0x13,0x7e,0xb3, +0x6f,0x57,0x60,0x2, 0x1e,0xd4,0x7e,0x70,0x9, 0xac,0x7f,0x49,0x3, 0x6e,0x7d,0x7e, +0xd0,0x9, 0xac,0xde,0x49,0x26,0x6d,0xc9,0x7d,0xe2,0x9d,0xe0,0xbe,0xe4,0x0, 0x0, +0x8, 0x6, 0x7d,0xf2,0x9d,0xf0,0x80,0x4, 0x6d,0xff,0x9d,0xfe,0x12,0x94,0xae,0xbd, +0x20,0x28,0xf, 0x7d,0xe3,0x2e,0xe4,0x6e,0x7d,0x7d,0xc0,0x2d,0xcf,0x1b,0xe8,0xc0, +0x80,0xf, 0x74,0x9, 0xac,0xbf,0x7d,0xe5,0x2e,0xe4,0x6e,0x7d,0x9d,0xf, 0x1b,0xe8, +0x0, 0x7e,0x50,0x9, 0xac,0x5f,0x49,0x32,0x6e,0x7f,0x7e,0xd0,0x9, 0xac,0xde,0x49, +0xe6,0x6d,0xcb,0x7d,0xe, 0x9d,0x3, 0xbe,0x4, 0x0, 0x0, 0x8, 0x6, 0x7d,0xfe,0x9d, +0xf3,0x80,0x4, 0x6d,0xff,0x9d,0xf0,0x12,0x94,0xae,0xbd,0xe3,0x28,0xf, 0x7d,0xe2, +0x2e,0xe4,0x6e,0x7f,0x7d,0x23,0x2d,0x2f,0x1b,0xe8,0x20,0x80,0xe, 0x7e,0x50,0x9, +0xac,0x5f,0x2e,0x24,0x6e,0x7f,0x9d,0x3f,0x1b,0x28,0x30,0xda,0x3b,0x22,0x7d,0x5d, +0xad,0x5f,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0x7d,0xf5,0x5d,0xf1,0x22,0x90,0x21,0x51, +0xe4,0x93,0xbc,0xbd,0x22,0x7c,0x17,0x7c,0xab,0x7e,0x14,0xff,0xfc,0x7e,0x3, 0x6f, +0x31,0x7e,0x90,0x9, 0xac,0x91,0x9, 0xb4,0x59,0xe1,0xb4,0x1, 0x49,0xa5,0xb8,0x1, +0xc, 0xbe,0x14,0xff,0x0, 0x28,0x10,0x7e,0x14,0xff,0x0, 0x80,0xa, 0xbe,0x14,0xff, +0xe0,0x28,0x4, 0x7e,0x14,0xff,0xe0,0x49,0x34,0x59,0xe2,0x7e,0x50,0x9, 0xac,0x5a, +0x49,0x22,0x6d,0xc9,0x12,0x95,0xb0,0x8, 0x3, 0x12,0x95,0xba,0x7e,0x70,0x9, 0xac, +0x71,0x49,0x33,0x59,0xe4,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x22,0x6d,0xcb,0x12,0x95, +0xb0,0x8, 0x3, 0x12,0x95,0xba,0x7e,0x70,0x9, 0xac,0x71,0x49,0x23,0x59,0xe2,0x7e, +0x70,0x9, 0xac,0x7a,0x49,0x33,0x6d,0xc9,0x12,0x95,0xa6,0x18,0x16,0x74,0x9, 0xac, +0x1b,0x49,0x20,0x59,0xe4,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x33,0x6d,0xcb,0x12,0x95, +0xa6,0x8, 0x4, 0x7e,0x14,0xff,0xfc,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x2, 0x6d,0xc9, +0xbe,0x4, 0x6, 0x50,0x40,0x39,0x7e,0x63,0x6f,0x66,0x7e,0x70,0x40,0xac,0x67,0x9e, +0x34,0x0, 0x65,0x12,0x31,0x24,0x3e,0x34,0xbd,0x3, 0x38,0x23,0x49,0x32,0x6d,0xcb, +0xbe,0x34,0x6, 0x50,0x40,0x19,0x7e,0x3, 0x6f,0x67,0x7e,0x10,0x40,0xac,0x1, 0x9e, +0x4, 0x0, 0x65,0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0xbd,0x30,0x28,0x4, 0x7e, +0x14,0xff,0xff,0x7d,0x31,0x22,0x9d,0x32,0x12,0x24,0x5a,0xbe,0x34,0x4, 0x0, 0x22, +0x9d,0x32,0x12,0x24,0x5a,0xbe,0x34,0x1, 0x0, 0x22,0x6c,0x0, 0x7e,0x70,0x9, 0xac, +0x71,0x19,0x3, 0x59,0xe1,0x22,0xca,0x3b,0x7c,0xab,0x7d,0x3, 0x7e,0x20,0x10,0x7d, +0x30,0x7e,0x90,0x9, 0xac,0x95,0x9, 0x34,0x6d,0xcf,0xbe,0x30,0x10,0x28,0x2, 0x7c, +0x23,0xbe,0x20,0x20,0x28,0x3, 0x7e,0x20,0x20,0x49,0xe4,0x6d,0xc9,0xbe,0xe4,0x6, +0x50,0x40,0x20,0x7e,0x33,0x6f,0x66,0x12,0x96,0xc8,0xbd,0xef,0x38,0x15,0x49,0xe4, +0x6d,0xcb,0xbe,0xe4,0x6, 0x50,0x40,0xb, 0x7e,0x33,0x6f,0x67,0x12,0x96,0xc8,0xbd, +0xef,0x28,0x3, 0x7e,0x20,0x8, 0x7e,0xf0,0x10,0xac,0xf2,0xbd,0x70,0x40,0x63,0x7e, +0xf0,0x9, 0xac,0xf4,0x9, 0xb7,0x59,0xe6,0x70,0x58,0x7e,0xd0,0x8, 0xac,0xd2,0xbd, +0x60,0x50,0x3c,0x9, 0xb7,0x59,0xdf,0x70,0x1f,0x9, 0xb7,0x59,0xe0,0xbe,0xb0,0x0, +0x28,0xc, 0x7d,0x37,0x2e,0x34,0x59,0xe0,0x14,0x7a,0x39,0xb0,0x80,0x6, 0x74,0x1, +0x19,0xb7,0x59,0xdf,0x6d,0x33,0x80,0x3a,0x9, 0xb7,0x59,0xe0,0xbe,0xb0,0x14,0x50, +0x31,0x7d,0x37,0x2e,0x34,0x59,0xe0,0x4, 0x7a,0x39,0xb0,0x6d,0x33,0x80,0x23,0xe4, +0x19,0xb7,0x59,0xe0,0x19,0xb7,0x59,0xdf,0x6d,0x33,0x74,0x1, 0x7a,0xb3,0x5c,0xd9, +0x80,0x10,0x6c,0x33,0x7e,0xf0,0x9, 0xac,0xf4,0x19,0x37,0x59,0xe0,0xe4,0x19,0xb7, +0x59,0xdf,0x7e,0x30,0x8, 0xac,0x23,0xbd,0x10,0x40,0x2a,0x7e,0x70,0x9, 0xac,0x7a, +0x49,0x33,0x6e,0x7d,0x59,0x34,0x6d,0xc9,0x74,0x9, 0xa4,0x49,0x35,0x6e,0x7f,0x74, +0x9, 0xac,0xb5,0x59,0x35,0x6d,0xcb,0x7e,0xa0,0x1, 0x7e,0x70,0x9, 0xac,0x74,0x19, +0xa3,0x59,0xde,0x6d,0x33,0xda,0x3b,0x22,0x7e,0xf0,0x40,0xac,0xf3,0x7d,0xf7,0x9e, +0xf4,0x0, 0x65,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x22,0x90,0x21,0x51,0xe4, +0x93,0xbc,0xb9,0x22,0x7e,0xb3,0x28,0xe4,0x4, 0x7a,0xb3,0x28,0xe4,0x7e,0x73,0x28, +0xe4,0x7a,0x73,0x76,0xce,0x22,0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7a,0x9, 0xb3,0x28, +0xb8,0x60,0x8, 0x74,0x1, 0x7a,0xb3,0x6f,0x3c,0x80,0x7, 0xb, 0xa0,0xbe,0xa0,0xa, +0x40,0xe6,0xe4,0x7a,0xb3,0x6f,0x3c,0x22,0x6c,0xaa,0x80,0x63,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x6e,0x7d,0x12,0x4c,0x5d,0x59,0x32,0x6d,0xc9,0x7e,0x50,0x9, 0xac, +0x5a,0x49,0x32,0x6e,0x7f,0x12,0x4c,0x5d,0x59,0x32,0x6d,0xcb,0x7e,0x90,0x9, 0xac, +0x9a,0x9, 0xb4,0x6e,0x81,0x19,0xb4,0x6d,0xcd,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4, +0x6e,0x82,0x19,0xb4,0x6d,0xce,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6e,0x83,0x19, +0xb4,0x6d,0xcf,0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6e,0x84,0x19,0xb4,0x6d,0xd0, +0x7e,0x90,0x9, 0xac,0x9a,0x9, 0xb4,0x6e,0x85,0x19,0xb4,0x6d,0xd1,0xb, 0xa0,0x12, +0x45,0x1f,0x38,0x98,0x22,0x7c,0x9b,0x7e,0x1b,0xa0,0x4c,0xaa,0x78,0x7, 0x7e,0xb, +0xb0,0x7a,0x1b,0xb0,0x22,0xa, 0xda,0x7e,0xb, 0x80,0xa, 0xe8,0x7d,0xfe,0x9d,0xfd, +0xbe,0xf4,0x0, 0x0, 0x8, 0x4, 0x9d,0xed,0x80,0x4, 0x6d,0xee,0x9d,0xef,0xe5,0x3d, +0xa, 0xfb,0xbd,0xef,0x8, 0xf, 0xbc,0x8a,0x7c,0xba,0x28,0x4, 0x2c,0xb9,0x80,0x2, +0x9c,0xb9,0x7a,0x1b,0xb0,0x7e,0x1b,0x70,0x7a,0xb, 0x70,0x22,0xe4,0x7a,0xb3,0x77, +0x31,0x90,0x1c,0x45,0x93,0x7a,0xb3,0x77,0x33,0x90,0x1c,0x46,0xe4,0x93,0x7a,0xb3, +0x77,0x34,0x90,0x21,0x51,0xe4,0x93,0x7a,0xb3,0x77,0x36,0xe4,0x7a,0xb3,0x77,0x37, +0x7a,0xb3,0x77,0x3c,0x12,0x3e,0x8b,0xe4,0x7a,0xb3,0x77,0x3f,0x7e,0x73,0x29,0xb6, +0x7a,0x73,0x77,0x51,0x7e,0x73,0x29,0xb7,0x7a,0x73,0x77,0x52,0x7e,0x73,0x29,0xb8, +0x7a,0x73,0x77,0x53,0x7e,0x73,0x29,0x85,0x7a,0x73,0x77,0x5a,0x7e,0x73,0x29,0x86, +0x7a,0x73,0x77,0x5b,0x90,0x1c,0x49,0x93,0x7a,0xb3,0x77,0x4f,0x90,0x1c,0x4a,0xe4, +0x93,0x7a,0xb3,0x77,0x50,0x74,0x1, 0x7a,0xb3,0x77,0x61,0x7e,0x34,0x22,0x32,0x12, +0x2a,0xa9,0x7a,0x37,0x77,0x8b,0x74,0x2, 0x7a,0xb3,0x77,0x3a,0x74,0x17,0x7a,0xb3, +0x77,0x5e,0x22,0x7e,0x18,0x14,0x30,0x7a,0x1f,0x24,0x64,0x7e,0x18,0x4, 0x0, 0x7a, +0x1f,0x24,0x68,0x7e,0xf, 0x24,0x64,0x12,0x65,0x91,0x7e,0xf, 0x24,0x68,0x7e,0x34, +0x4, 0xc, 0x12,0x24,0x38,0x7a,0xb3,0x25,0xae,0x22,0x7e,0x8, 0x6c,0x9, 0x7e,0x34, +0x1, 0xa1,0xe4,0x12,0x24,0x38,0x90,0x21,0x52,0x93,0x7c,0x7b,0x74,0x9, 0xac,0x7b, +0x7e,0x8, 0x6c,0x85,0x74,0xff,0x2, 0x24,0x38,0x7e,0x34,0x0, 0x27,0xca,0x39,0x7e, +0x34,0x20,0xb4,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x28,0xe7,0x12,0x24,0x13,0x1b,0xfd, +0x7e,0x34,0x0, 0x27,0xca,0x39,0x7e,0x34,0x20,0xdb,0x7e,0x24,0x0, 0xff,0x7e,0x8, +0x29,0xe, 0x12,0x24,0x13,0x1b,0xfd,0x7e,0x34,0x0, 0x27,0xca,0x39,0x7e,0x34,0x21, +0x2, 0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x29,0x35,0x12,0x24,0x13,0x1b,0xfd,0x7e,0x34, +0x0, 0x27,0xca,0x39,0x7e,0x34,0x21,0x29,0x7e,0x24,0x0, 0xff,0x7e,0x8, 0x29,0x5c, +0x12,0x24,0x13,0x1b,0xfd,0x6c,0x88,0x7c,0xb8,0x12,0x66,0xf8,0xb, 0x80,0xbe,0x80, +0x4, 0x40,0xf4,0x2, 0x48,0xb3,0xca,0xf8,0x6c,0xff,0x12,0x5b,0x38,0xb, 0xf0,0x7e, +0x73,0x77,0xbc,0xbc,0x7f,0x38,0xf3,0x12,0x99,0x1d,0xda,0xf8,0x22,0x7e,0xb3,0x77, +0x5d,0x7e,0x73,0x78,0x9b,0x14,0x68,0x1d,0x4, 0x78,0x1a,0x7e,0x8, 0xc, 0x18,0x7a, +0xf, 0x24,0x60,0x7e,0x8, 0x14,0x30,0x7a,0xf, 0x24,0x64,0xa5,0xbf,0x3, 0x16,0x7e, +0x18,0x1c,0x48,0x80,0xc, 0x7e,0x18,0x10,0x24,0x7a,0x1f,0x24,0x60,0x7e,0x18,0x18, +0x3c,0x7a,0x1f,0x24,0x64,0x22,0x7e,0xb3,0x6f,0x57,0x60,0x2, 0x61,0x5d,0x12,0x6f, +0xbf,0x78,0x2, 0x61,0x5d,0x7e,0xa3,0x6d,0x93,0xbe,0xa0,0x1, 0x78,0x1b,0x7e,0xb3, +0x6d,0xa9,0x70,0x15,0x7e,0xb3,0x6c,0x9, 0x7a,0xb3,0x78,0x29,0x7e,0xb3,0x6c,0xa, +0x7a,0xb3,0x78,0x2a,0xe4,0x7a,0xb3,0x78,0x2b,0xbe,0xa0,0x0, 0x28,0x3e,0xc2,0x0, +0x6c,0x11,0x80,0x21,0x12,0x9e,0xd9,0x7e,0x73,0x78,0x29,0xa, 0x27,0x1a,0x39,0x12, +0x9e,0xc3,0x58,0xf, 0x7e,0x73,0x78,0x2a,0xa, 0x27,0x1a,0x30,0x12,0x9e,0xc3,0x58, +0x2, 0xd2,0x0, 0xb, 0x10,0x12,0x9e,0x6d,0x38,0xda,0x30,0x0, 0xc, 0x7e,0xb3,0x78, +0x2b,0xbe,0xb0,0xc8,0x50,0xb, 0x4, 0x80,0x4, 0xe4,0x80,0x1, 0xe4,0x7a,0xb3,0x78, +0x2b,0x7e,0x73,0x6d,0x93,0xbe,0x70,0x2, 0x50,0x2, 0x61,0x5d,0x7e,0xb3,0x6f,0x32, +0xb4,0x1, 0x2, 0x80,0x2, 0x61,0x5d,0x6d,0xee,0x6c,0x11,0x80,0x1a,0x12,0x9e,0xd9, +0x12,0x9b,0x5e,0x7d,0xd3,0xbd,0xde,0x8, 0xc, 0x7d,0xed,0x7a,0x93,0x6d,0x9b,0x7a, +0x3, 0x6d,0x9c,0x7c,0x81,0xb, 0x10,0x12,0x9e,0x6d,0x38,0xe1,0x6c,0x11,0x61,0x56, +0xbc,0x81,0x78,0x2, 0x61,0x54,0x7e,0x30,0x2, 0xac,0x31,0x9, 0xb1,0x6c,0x9, 0xf5, +0x2b,0x9, 0xb1,0x6c,0xa, 0xf5,0x2c,0x7e,0xa3,0x6d,0x9b,0x7a,0xa1,0x2d,0x7e,0xb3, +0x6d,0x9c,0xf5,0x2e,0xbe,0xa1,0x2b,0x28,0x4, 0xe5,0x2b,0x80,0x2, 0xe5,0x2d,0xf5, +0x27,0xe5,0x2d,0xbe,0xb1,0x2b,0x50,0x4, 0xe5,0x2b,0x80,0x2, 0xe5,0x2d,0xf5,0x29, +0xe5,0x2e,0xbe,0xb1,0x2c,0x28,0x4, 0xe5,0x2c,0x80,0x2, 0xe5,0x2e,0xf5,0x28,0xe5, +0x2e,0xbe,0xb1,0x2c,0x50,0x5, 0x7e,0xa1,0x2c,0x80,0x3, 0x7e,0xa1,0x2e,0x7a,0xa1, +0x2a,0xe5,0x27,0x1a,0xfb,0xe5,0x29,0x1a,0x1b,0x9d,0x1f,0xb, 0x14,0x7c,0xb3,0xf5, +0x2f,0xe5,0x28,0x1a,0x1b,0x1a,0x5a,0x9d,0x51,0xb, 0x54,0xf5,0x30,0x12,0x9b,0x65, +0x7d,0xf3,0xe5,0x30,0xbe,0xb1,0x2f,0x50,0x50,0xe5,0x28,0xbe,0xb0,0x0, 0x8, 0x2, +0x15,0x28,0x7e,0x73,0x6f,0x67,0xa, 0xc7,0x1b,0xc4,0xe5,0x2a,0x1a,0x1b,0xbd,0x1c, +0x58,0x2, 0x5, 0x2a,0x7e,0x91,0x29,0x12,0x9b,0x65,0x7d,0xe3,0x80,0x23,0x1b,0x90, +0x6d,0xdd,0x7e,0x1, 0x2a,0x80,0xe, 0x12,0x9b,0x5e,0xbd,0x3d,0x8, 0x5, 0x12,0x9b, +0x5e,0x7d,0xd3,0x1b,0x0, 0xe5,0x28,0xbc,0xb0,0x8, 0xec,0xbd,0xde,0x58,0x2, 0x7d, +0xed,0xe5,0x27,0xbc,0xb9,0x48,0xd7,0x80,0x4e,0xe5,0x27,0xbe,0xb0,0x0, 0x8, 0x2, +0x15,0x27,0x7e,0x73,0x6f,0x66,0xa, 0xc7,0x1b,0xc4,0xe5,0x29,0x1a,0x1b,0xbd,0x1c, +0x58,0x2, 0x5, 0x29,0x7e,0x1, 0x2a,0x12,0x9b,0x65,0x7d,0xe3,0x80,0x23,0x1b,0x0, +0x6d,0xdd,0x7e,0x91,0x29,0x80,0xe, 0x12,0x9b,0x5e,0xbd,0x3d,0x8, 0x5, 0x12,0x9b, +0x5e,0x7d,0xd3,0x1b,0x90,0xe5,0x27,0xbc,0xb9,0x8, 0xec,0xbd,0xde,0x58,0x2, 0x7d, +0xed,0xe5,0x28,0xbc,0xb0,0x48,0xd7,0x7d,0x3f,0x3e,0x34,0x3e,0x34,0x7e,0x24,0x0, +0xa, 0x12,0x22,0x71,0xbd,0x3e,0x58,0xc, 0x7e,0x73,0x78,0x2b,0xbe,0x70,0x28,0x50, +0x3, 0x12,0x6e,0x57,0xb, 0x10,0x12,0x9e,0x6d,0x28,0x2, 0x41,0x10,0x22,0x7c,0xb9, +0x7c,0x70,0x2, 0x9b,0x6a,0xe5,0x2b,0x7e,0x71,0x2c,0x12,0x9f,0x7f,0xb, 0x1a,0x30, +0x22,0xca,0x3b,0x12,0x9f,0xee,0xc2,0x2, 0x7e,0x34,0x22,0x23,0x7e,0x24,0x0, 0xff, +0xb, 0x1a,0xd0,0x7e,0x17,0x6d,0x99,0xbd,0x1d,0x58,0x4, 0x7d,0xd1,0xe, 0xd4,0x6c, +0xcc,0x81,0xe1,0x7e,0x30,0x2, 0xac,0x3c,0x9, 0xb1,0x6c,0x9, 0xf5,0x27,0x9, 0x71, +0x6c,0xa, 0x7a,0x71,0x28,0x12,0x9b,0x6a,0x7d,0xc3,0xbd,0xdc,0x8, 0x2, 0x81,0xdf, +0xbe,0xe1,0x27,0x38,0x2, 0x81,0xdf,0xbe,0xd1,0x28,0x38,0x2, 0x81,0xdf,0x7d,0x1c, +0xe, 0x14,0x7d,0xec,0xe, 0xe4,0xe, 0xe4,0x2d,0xe1,0x6d,0xff,0x12,0x9e,0xcd,0x85, +0x28,0x2c,0x80,0x2d,0x6c,0x99,0x7e,0xf1,0x27,0x80,0x1b,0x7c,0xbf,0x7e,0x71,0x2c, +0x12,0x9c,0xf3,0x18,0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x9e,0x8e,0x80,0x6, 0xe5,0x2b, +0xbc,0xbf,0x58,0x7, 0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe0,0x4c,0x99,0x68,0x9, 0x15, +0x2c,0xe5,0x2c,0xbe,0xb0,0x0, 0x58,0xcc,0x12,0x9e,0xba,0xbd,0x13,0x58,0x38,0x85, +0x28,0x2c,0x80,0x2c,0x12,0x9e,0xa8,0x7c,0x83,0x80,0x1b,0x7c,0xb8,0x7e,0x71,0x2c, +0x12,0x9c,0xf3,0x18,0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x9e,0x86,0x80,0x6, 0xe5,0x2a, +0xbc,0xb8,0x28,0x6, 0xb, 0x80,0xbc,0xe8,0x38,0xe1,0x4c,0x99,0x68,0x9, 0x15,0x2c, +0xe5,0x2c,0xbe,0xb0,0x0, 0x58,0xcd,0x12,0x9e,0xcd,0xa, 0x3d,0x1b,0x34,0xe5,0x28, +0xa, 0x1b,0xbd,0x13,0x58,0x6e,0x12,0x9e,0xb1,0x80,0x2a,0x6c,0x99,0x7e,0xf1,0x27, +0x80,0x18,0x7c,0xbf,0x12,0x9c,0xf0,0x18,0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x9e,0x8e, +0x80,0x6, 0xe5,0x2b,0xbc,0xbf,0x58,0x7, 0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe3,0x4c, +0x99,0x68,0x7, 0x5, 0x29,0xbe,0xd1,0x29,0x38,0xd1,0x12,0x9e,0xba,0xbd,0x13,0x58, +0x33,0x12,0x9e,0xb1,0x80,0x29,0x12,0x9e,0xa8,0x7c,0x83,0x80,0x18,0x7c,0xb8,0x12, +0x9c,0xf0,0x18,0x9, 0xbd,0xc0,0x48,0x5, 0x12,0x9e,0x86,0x80,0x6, 0xe5,0x2a,0xbc, +0xb8,0x28,0x6, 0xb, 0x80,0xbc,0xe8,0x38,0xe4,0x4c,0x99,0x68,0x7, 0x5, 0x29,0xbe, +0xd1,0x29,0x38,0xd2,0x90,0x22,0x22,0xe4,0x93,0xa, 0x1b,0xbd,0x1f,0x38,0x10,0xd2, +0x2, 0xe5,0x27,0x7a,0xb3,0x78,0xd9,0xe5,0x28,0x7a,0xb3,0x78,0xda,0x80,0xc, 0xb, +0xc0,0x7e,0x73,0x6d,0x93,0xbc,0x7c,0x28,0x2, 0x61,0x93,0xa2,0x2, 0xda,0x3b,0x22, +0x7e,0x71,0x29,0x12,0x9b,0x6a,0x7d,0x3, 0xbd,0xe0,0x22,0x9, 0xb3,0x6e,0x2a,0x9, +0x73,0x6e,0x2b,0x7c,0x6f,0xca,0x3b,0x7c,0x96,0x7c,0x6b,0x7e,0xd0,0xff,0x75,0x3e, +0xff,0x12,0x9f,0xdf,0xc2,0x5, 0x7e,0x24,0x1, 0xf4,0x7e,0xb3,0x6d,0xbc,0xb4,0x1, +0x6, 0x12,0xd3,0x94,0xc3,0xc1,0x60,0xbe,0x90,0xa, 0x28,0x3, 0xc3,0xc1,0x60,0x7e, +0x10,0x3, 0x74,0x4, 0xac,0xb9,0x19,0x15,0x28,0xb9,0x7d,0xf2,0x7c,0xf6,0x7c,0xe7, +0xc2,0x3, 0xc2,0x4, 0x7c,0x1f,0x7a,0xf1,0x3a,0x80,0x8, 0x12,0x9e,0x7c,0x8, 0x8, +0x7a,0x11,0x3a,0x12,0x9e,0x96,0x58,0xf3,0x7c,0x1f,0x7a,0xf1,0x3b,0x80,0x8, 0x12, +0x9e,0x7c,0x8, 0x8, 0x7a,0x11,0x3b,0x12,0x9e,0xe6,0x48,0xf3,0x75,0x3d,0x0, 0x7e, +0xa3,0x6f,0x66,0x7c,0xba,0x14,0xbe,0xb1,0x3b,0x78,0x8, 0xd2,0x4, 0xa, 0x6a,0x1b, +0x64,0x80,0x8, 0xe5,0x3a,0x70,0x4, 0xd2,0x3, 0x6c,0xdd,0x7c,0xe, 0x7a,0xe1,0x3c, +0x20,0x4, 0xd, 0x30,0x3, 0x37,0x80,0x8, 0x12,0x9e,0x63,0x8, 0x8, 0x7a,0x1, 0x3c, +0x12,0x9e,0x9f,0x58,0xf3,0x7c,0xe, 0x7c,0x8e,0x80,0x7, 0x12,0x9e,0x63,0x8, 0x13, +0x7c,0x80,0x7c,0xb0,0x4, 0x7c,0xb, 0x1a,0x5b,0x7e,0x73,0x6f,0x65,0x1a,0x17,0xbd, +0x51,0x48,0xe8,0xe5,0x3c,0xa, 0xeb,0xa, 0x58,0x9d,0x5e,0xf5,0x3d,0xc2,0x2, 0x7c, +0xe, 0x7a,0xe1,0x3c,0x80,0xa, 0x7c,0xbf,0x12,0x9e,0x65,0x8, 0x8, 0x7a,0x1, 0x3c, +0x12,0x9e,0x9f,0x58,0xf1,0x75,0x3f,0x0, 0xe5,0x3c,0x70,0x4, 0xd2,0x2, 0xf5,0x3e, +0x7c,0x1f,0x7a,0xf1,0x3a,0x30,0x2, 0x33,0x80,0xa, 0x12,0x9e,0x74,0xbd,0x3f,0x8, +0x8, 0x7a,0x11,0x3a,0x12,0x9e,0x96,0x58,0xf1,0x7c,0x1f,0x7a,0xf1,0x3b,0x80,0xa, +0x12,0x9e,0x74,0xbd,0x3f,0x8, 0x8, 0x7a,0x11,0x3b,0x12,0x9e,0xe6,0x48,0xf1,0xe5, +0x3a,0xa, 0x1b,0xe5,0x3b,0xa, 0x5b,0x9d,0x51,0xf5,0x3f,0x7e,0x30,0x4, 0xac,0x39, +0x9, 0x81,0x28,0xb9,0xbe,0x81,0x3d,0x40,0x16,0xbe,0x81,0x3f,0x50,0x2, 0x80,0xf, +0x9, 0xb1,0x28,0xb8,0x60,0x13,0x20,0x4, 0x6, 0x20,0x3, 0x3, 0x30,0x2, 0xa, 0x74, +0x1, 0x19,0xb1,0x28,0xb8,0xd2,0x5, 0x80,0x5, 0xe4,0x19,0xb1,0x28,0xb8,0xa2,0x5, +0xda,0x3b,0x22,0x7c,0xbd,0x7c,0x70,0x12,0x9b,0x6a,0xbd,0x3f,0x22,0x7e,0x73,0x6d, +0x93,0xbc,0x71,0x22,0x7c,0xb1,0x7e,0x71,0x3e,0x2, 0x9b,0x6a,0x7c,0xb1,0x7c,0x7e, +0x12,0x9b,0x6a,0xbd,0x3f,0x22,0xb, 0xf4,0xb, 0x90,0x7a,0x81,0x2a,0x22,0xb, 0xf4, +0xb, 0x90,0x7a,0xf1,0x2b,0x22,0x7c,0xb1,0x14,0x7c,0x1b,0xbe,0xb0,0x0, 0x22,0x7c, +0xb0,0x14,0x7c,0xb, 0xbe,0xb0,0x0, 0x22,0x6c,0x99,0xe5,0x27,0xa, 0x1b,0xb, 0x14, +0x22,0xe5,0x28,0xa, 0x5b,0xb, 0x54,0xf5,0x29,0x22,0xa, 0x3e,0x1b,0x34,0xe5,0x27, +0xa, 0x1b,0x22,0x9d,0x32,0x12,0x24,0x5a,0xbe,0x34,0x0, 0x2, 0x22,0xe5,0x27,0xa, +0x5b,0xb, 0x54,0xf5,0x2a,0x85,0x27,0x2b,0x22,0x74,0x2, 0xac,0xb1,0x9, 0x95,0x6c, +0x9, 0x9, 0x5, 0x6c,0xa, 0x22,0x7c,0xb1,0x4, 0x7c,0x1b,0x1a,0xeb,0x7e,0x83,0x6f, +0x66,0x1a,0x18,0xbd,0xe1,0x22,0xd2,0x0, 0x6c,0x99,0x80,0x31,0x74,0x2, 0xac,0xb9, +0x9, 0x5, 0x76,0x7e,0x9, 0x15,0x76,0x7f,0x12,0x9f,0x73,0x49,0x25,0x76,0x41,0x7d, +0xf3,0x9d,0xf2,0xbe,0xf4,0x0, 0x0, 0x8, 0x4, 0x7d,0x1f,0x80,0x4, 0x6d,0x11,0x9d, +0x1f,0xbe,0x17,0x6d,0xac,0x28,0x4, 0xc2,0x0, 0x80,0xa, 0xb, 0x90,0x7e,0x83,0x76, +0x7d,0xbc,0x89,0x38,0xc7,0x20,0x0, 0x2d,0x6c,0x99,0x80,0x1d,0x74,0x2, 0xac,0xb9, +0x9, 0x5, 0x6c,0x9, 0x9, 0x15,0x6c,0xa, 0x12,0x9f,0x73,0x59,0x35,0x76,0x41,0x19, +0x5, 0x76,0x7e,0x19,0x15,0x76,0x7f,0xb, 0x90,0x7e,0x73,0x6d,0x93,0xbc,0x79,0x38, +0xdb,0x7a,0x73,0x76,0x7d,0x7e,0xb3,0x6d,0x93,0x70,0x5, 0xe4,0x7a,0xb3,0x76,0x7d, +0xa2,0x0, 0x22,0x7c,0xb0,0x7c,0x71,0x12,0x9b,0x6a,0x74,0x2, 0xac,0xb9,0x22,0x12, +0x9f,0x8d,0x7d,0x13,0x3e,0x14,0x7e,0x1f,0x24,0x68,0x2d,0x31,0x22,0x7c,0xa7,0x7e, +0x73,0x6f,0x65,0xac,0x7b,0xa, 0x2a,0x2d,0x32,0x22,0xe4,0x7a,0xb3,0x6d,0xb4,0x75, +0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0x6f,0x64,0xf5,0x29,0x7e,0xb3,0x6f,0x65,0xf5, +0x2a,0x7e,0x8, 0x0, 0x27,0x7e,0x37,0x6f,0x42,0x12,0xce,0x94,0xe4,0x33,0x7a,0xb3, +0x6d,0xb4,0xe4,0x7a,0xb3,0x6d,0xbd,0x12,0xce,0x82,0x33,0x7a,0xb3,0x6d,0xbd,0x74, +0x1, 0x7a,0xb3,0x6d,0xbe,0x12,0x9e,0xf6,0xe4,0x33,0x7a,0xb3,0x6d,0xbe,0x22,0xc2, +0x2, 0xc2,0x3, 0xc2,0x4, 0x22,0xe5,0x29,0x7e,0x71,0x2a,0x2, 0x9b,0x6a,0x7e,0xe3, +0x6f,0x64,0x7e,0xd3,0x6f,0x65,0x22,0x6d,0x11,0x7d,0x21,0x7d,0x31,0x80,0x1f,0x7d, +0x1, 0x3e,0x4, 0x7e,0x2f,0x24,0x60,0x2d,0x50,0xb, 0x2a,0x0, 0xbe,0x4, 0x27,0x10, +0x28,0x2, 0xb, 0x24,0xbe,0x4, 0xb, 0xb8,0x50,0x2, 0xb, 0x34,0xb, 0x14,0x7e,0x7, +0x73,0xd6,0xbd,0x1, 0x38,0xd9,0xbe,0x24,0x0, 0xb4,0x28,0x7, 0x7e,0xb3,0x78,0x25, +0x4, 0x80,0x12,0xbe,0x34,0x0, 0x32,0x28,0xb, 0x7e,0xb3,0x78,0x28,0x4, 0x7a,0xb3, +0x78,0x28,0x80,0x5, 0xe4,0x7a,0xb3,0x78,0x25,0x7e,0x73,0x78,0x25,0xbe,0x70,0x2, +0x40,0x7, 0x74,0xaa,0x7a,0xb3,0x77,0x2c,0x22,0x7e,0x73,0x78,0x28,0xbe,0x70,0x4, +0x40,0x3, 0x75,0xe9,0xff,0x22,0x7c,0xab,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0xb3,0x6c, +0x9, 0x9, 0x73,0x6c,0xa, 0x2, 0x9b,0x6a,0xca,0x3b,0x7c,0xf4,0x7a,0x51,0x2c,0x7c, +0xe6,0x7c,0xd7,0x7c,0xcb,0x75,0x36,0x0, 0x75,0x37,0x0, 0x75,0x38,0x0, 0x75,0x39, +0x0, 0x75,0x3a,0x0, 0x75,0x3b,0x0, 0x75,0x40,0x0, 0x7e,0x37,0x6f,0x54,0x7a,0x35, +0x41,0x6c,0xaa,0x7e,0x71,0x2c,0x74,0x9, 0xac,0x7b,0x19,0xa3,0x6c,0x8a,0xe4,0x19, +0xb3,0x6c,0x8b,0x7e,0x13,0x6f,0x64,0x7e,0xb3,0x6f,0x65,0xf5,0x35,0x12,0xa7,0xd5, +0xf5,0x33,0x9, 0xb3,0x6c,0xa, 0xf5,0x34,0x7c,0xbe,0x12,0xa0,0x66,0x12,0xa7,0xc6, +0x7a,0x35,0x41,0x7e,0x37,0x6f,0x54,0xbe,0x35,0x41,0x8, 0x3, 0x7a,0x35,0x41,0xe5, +0x33,0x7c,0x71,0x7c,0x6c,0x7e,0x8, 0x0, 0x38,0x12,0xa3,0x39,0xf5,0x36,0xe5,0x34, +0x7e,0x71,0x35,0x7c,0x6d,0x7e,0x8, 0x0, 0x39,0x12,0xa3,0x39,0xf5,0x37,0xbe,0xf0, +0x1, 0xe5,0x38,0x7e,0x71,0x39,0x78,0xb, 0x12,0x9f,0x8d,0x3e,0x34,0x2e,0x34,0x20, +0x54,0x80,0x3, 0x12,0x9f,0x7f,0x7a,0x35,0x3e,0x7a,0x37,0x63,0x73,0x7e,0x34,0x24, +0xbc,0x7a,0x37,0x63,0x75,0xe5,0x38,0x7a,0xb3,0x63,0x6d,0xe5,0x39,0x7a,0xb3,0x63, +0x6e,0xe5,0x36,0x7a,0xb3,0x63,0x6f,0xe5,0x37,0x7a,0xb3,0x63,0x70,0x7e,0x73,0x6f, +0x3f,0x7a,0x73,0x63,0x71,0xe4,0x7a,0xb3,0x63,0x72,0x7e,0x8, 0x63,0x6d,0x12,0x8, +0x73,0x7e,0x37,0x24,0xbc,0x7d,0x23,0x6d,0x33,0x7e,0xb7,0x24,0xbe,0x6d,0xaa,0x2f, +0x51,0x7e,0x37,0x24,0xc0,0x6d,0x22,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x24,0xc2,0x2f, +0x10,0x7a,0x1d,0x2d,0x7e,0x37,0x24,0xc4,0x7d,0x23,0x6d,0x33,0x7e,0x97,0x24,0xc6, +0x6d,0x88,0x2f,0x41,0x7f,0x65,0xe5,0x36,0xa, 0x4b,0xe5,0x38,0xa, 0x5b,0x2d,0x54, +0xf5,0x3a,0xe5,0x37,0xa, 0x4b,0xe5,0x39,0xa, 0x5b,0x2d,0x54,0xf5,0x3b,0x85,0x38, +0x31,0x41,0x89,0x85,0x39,0x32,0x41,0x7e,0xbe,0xf0,0x1, 0x78,0x15,0xe5,0x35,0x7e, +0x71,0x31,0xac,0x7b,0xe5,0x32,0xa, 0x2b,0x2d,0x32,0x3e,0x34,0x49,0x33,0x20,0x54, +0x80,0x8, 0xe5,0x31,0x7e,0x71,0x32,0x12,0x9b,0x6a,0x7e,0x53,0x6f,0x3f,0xa, 0x25, +0x9d,0x32,0x12,0xa7,0xcd,0x18,0x2, 0x41,0x7c,0x7e,0x35,0x41,0xbe,0x35,0x3c,0x18, +0x2, 0x5, 0x40,0xe5,0x33,0xa, 0x1b,0xe5,0x31,0x12,0xa3,0x2e,0x8, 0x4, 0x9d,0x31, +0x80,0x4, 0x6d,0x33,0x9d,0x32,0xbe,0x34,0x0, 0x1, 0x18,0x19,0xe5,0x34,0xa, 0x1b, +0xe5,0x32,0x12,0xa3,0x2e,0x8, 0x4, 0x9d,0x31,0x80,0x4, 0x6d,0x33,0x9d,0x32,0xbe, +0x34,0x0, 0x1, 0x8, 0x67,0xbe,0xc0,0x3, 0x40,0x9, 0xbe,0xd0,0x3, 0x40,0x4, 0xd2, +0x0, 0x80,0x2, 0xc2,0x0, 0xe5,0x31,0x7e,0x71,0x32,0x7c,0x6e,0x12,0xdf,0xd1,0x7c, +0x9b,0xbe,0x90,0x2, 0x68,0x5, 0xbe,0x90,0x3, 0x78,0x8, 0x7e,0x35,0x3c,0xe, 0x34, +0x7a,0x35,0x3c,0xbe,0x90,0x2, 0x68,0xa, 0xbe,0x90,0x1, 0x68,0x5, 0xbe,0x90,0x3, +0x78,0x2a,0x7e,0xf5,0x3c,0x12,0xa3,0x18,0xe5,0x31,0x12,0xa3,0x1f,0x7f,0x1, 0x7e, +0x1d,0x2d,0x9f,0x10,0x7a,0x1d,0x2d,0x12,0xa3,0x18,0xe5,0x32,0x12,0xa3,0x1f,0x9f, +0x41,0x12,0xa3,0x18,0x9f,0x51,0x1a,0x26,0x1a,0x24,0x9f,0x61,0x5, 0x32,0xe5,0x3b, +0xbe,0xb1,0x32,0x28,0x2, 0x21,0xa8,0x5, 0x31,0xe5,0x3a,0xbe,0xb1,0x31,0x28,0x2, +0x21,0xa3,0xbe,0x58,0x0, 0x0, 0x78,0x2, 0xb, 0x5c,0xbe,0x68,0x0, 0x0, 0x78,0x2, +0xb, 0x6c,0x74,0x6, 0x7e,0x1d,0x2d,0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x2d,0x7f, +0x5, 0x12,0xa3,0x26,0x7e,0xf1,0x2c,0x74,0x9, 0xac,0xfb,0x59,0x37,0x6c,0x85,0x74, +0x6, 0x2f,0x44,0x14,0x78,0xfb,0x7f,0x14,0x7f,0x6, 0x12,0xa3,0x26,0x59,0x37,0x6c, +0x87,0x7e,0xb3,0x6f,0x53,0x60,0xd, 0x1e,0xd4,0x1e,0xc4,0x50,0x4, 0x4e,0xd4,0x80, +0x0, 0x14,0x78,0xf3,0xbe,0x68,0x0, 0x7f,0x28,0x4, 0x7e,0x68,0x0, 0x7f,0x7d,0x3d, +0x19,0x77,0x6c,0x8a,0xe5,0x40,0x19,0xb7,0x6c,0x8b,0x9, 0x77,0x6c,0x8b,0xbe,0x70, +0x2d,0x28,0x6, 0x74,0x2d,0x19,0xb7,0x6c,0x8b,0xe5,0x33,0x19,0xb7,0x6c,0x8c,0xe5, +0x34,0x19,0xb7,0x6c,0x8d,0xda,0x3b,0x22,0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x22,0xa, +0x1b,0x6d,0x0, 0x2, 0x22,0xa3,0x12,0x22,0xbf,0x2e,0x18,0x0, 0x20,0x22,0xa, 0x3b, +0x7d,0x23,0x9d,0x21,0xbe,0x24,0x0, 0x0, 0x22,0xca,0xf8,0x7c,0xf6,0x7c,0x87,0x7c, +0x9b,0xa, 0x2f,0x7d,0x32,0x3e,0x34,0xb, 0x34,0x7c,0xb7,0xbc,0xf9,0x38,0x14,0xa, +0xf8,0x1b,0xf4,0xa, 0x3f,0x9d,0xf3,0xa, 0x39,0xbd,0x3f,0x18,0x6, 0x7c,0xab,0xa, +0x39,0x80,0x1d,0xbc,0xf9,0x28,0xd, 0xa, 0x39,0xa, 0x5f,0x2d,0x53,0xb, 0x54,0x7c, +0xab,0xe4,0x80,0x10,0xa, 0x3f,0xa, 0x58,0x2d,0x53,0xa, 0x39,0x9d,0x53,0x7c,0xab, +0x9d,0x32,0x7c,0xb7,0x7a,0xb, 0xb0,0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x7c,0xf5, +0x7c,0xe6,0x7c,0x6b,0x74,0x2, 0xac,0xbe,0x9, 0xc5,0x6c,0x9, 0x9, 0xd5,0x6c,0xa, +0x7e,0xb3,0x78,0xbd,0xb4,0x1, 0x18,0x7e,0x53,0x6d,0x93,0xbe,0x50,0x1, 0x68,0x5, +0xbe,0x50,0x2, 0x28,0xa, 0x7c,0xb6,0x7c,0x6e,0x7c,0x5f,0x6c,0x44,0x80,0x1d,0x7c, +0xbc,0x7c,0x7d,0x12,0xa6,0x10,0x12,0xa3,0xe2,0x7c,0xbc,0x7c,0x7d,0x12,0xa6,0x81, +0x74,0x6, 0x7e,0x70,0x6, 0x7c,0x6e,0x7c,0x5f,0x7e,0x40,0x1, 0x12,0xa0,0x78,0xda, +0x3b,0x22,0xca,0x79,0xc2,0x0, 0x7e,0x7, 0x74,0x84,0xb, 0x4, 0x7d,0x40,0xe, 0x44, +0xe, 0x44,0x9f,0x11,0x6d,0xff,0x6d,0x11,0x6c,0xee,0x6c,0xff,0x1a,0x5f,0x3e,0x54, +0x1a,0xce,0x7e,0xd4,0x0, 0x1a,0xad,0xdc,0x2d,0x5d,0x49,0xe5,0x73,0xdc,0xbd,0x4e, +0x58,0x10,0xbd,0xe, 0x8, 0xc, 0x7d,0x5e,0x7d,0xde,0x1a,0x5a,0x1a,0xca,0x2f,0x16, +0xb, 0x14,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xd3,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xca, +0xbe,0x14,0x0, 0x0, 0x28,0x5, 0x12,0x22,0xbd,0x7d,0xf3,0x7e,0x8, 0x63,0x6d,0x12, +0xa6,0x70,0x6c,0xee,0x6c,0xff,0x1a,0xef,0x3e,0xe4,0x1a,0x2e,0x7e,0x34,0x0, 0x1a, +0xad,0x32,0x7d,0x23,0x2d,0x2e,0x49,0xe2,0x73,0xdc,0xbe,0xe4,0x0, 0x0, 0x8, 0x10, +0x7d,0x3e,0x9d,0x3f,0xbe,0x34,0x0, 0x0, 0x58,0x2, 0x6d,0x33,0x59,0x32,0x63,0x6d, +0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xcf,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xc6,0x7e,0x8, +0x64,0xbf,0x7e,0x34,0x0, 0xa9,0xe4,0x12,0x24,0x38,0x74,0x1, 0x7a,0xb3,0x65,0x13, +0x7e,0xf0,0x6, 0x7e,0xe0,0x6, 0x12,0xa5,0xe6,0xb4,0x1, 0x3, 0x12,0xa5,0x38,0x1b, +0xe0,0xbe,0xe0,0x0, 0x58,0xf0,0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe6,0x7e,0xf0,0x6, +0x7e,0xe0,0x7, 0x12,0xa5,0xe6,0xb4,0x1, 0x3, 0x12,0xa5,0x38,0xb, 0xe0,0xbe,0xe0, +0xd, 0x78,0xf0,0x1b,0xf0,0xbe,0xf0,0x0, 0x58,0xe6,0x7e,0xf0,0x7, 0x7e,0xe0,0x6, +0x12,0xa5,0xe6,0xb4,0x1, 0x3, 0x12,0xa5,0x38,0x1b,0xe0,0xbe,0xe0,0x0, 0x58,0xf0, +0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xe6,0x7e,0xf0,0x7, 0x7e,0xe0,0x7, 0x12,0xa5,0xe6, +0xb4,0x1, 0x3, 0x12,0xa5,0x38,0xb, 0xe0,0xbe,0xe0,0xd, 0x78,0xf0,0xb, 0xf0,0xbe, +0xf0,0xd, 0x78,0xe6,0x6c,0xee,0x6c,0xff,0x1a,0x2e,0x7e,0x34,0x0, 0xd, 0xad,0x32, +0x1a,0x2f,0x2d,0x32,0x9, 0xb3,0x64,0xbf,0x70,0xd, 0x6d,0x33,0x3e,0x24,0x1a,0xe, +0x12,0xa6,0x78,0x59,0x32,0x73,0xdc,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xda,0xb, 0xe0, +0xbe,0xe0,0xd, 0x48,0xd1,0xda,0x79,0x22,0x7e,0x18,0x63,0x6d,0x7a,0x1d,0x2c,0x7c, +0xbe,0x7c,0x7f,0x7e,0x8, 0x64,0xbf,0x7c,0xa7,0x7c,0x5b,0xbe,0x50,0x0, 0x28,0x1f, +0x12,0xa5,0xf7,0x2d,0xf3,0x2e,0xf4,0xff,0xe6,0x12,0xa6,0x8, 0x8, 0x4, 0x74,0x1, +0x80,0x2, 0x74,0x2, 0x7f,0x70,0x2d,0xf4,0x2e,0xf4,0xff,0xf3,0x7a,0x7b,0xb0,0xbe, +0xa0,0x0, 0x28,0x1b,0x12,0xa5,0xf7,0x2d,0xf3,0x1b,0xf5,0x12,0xa6,0x8, 0x8, 0x4, +0x74,0x1, 0x80,0x2, 0x74,0x2, 0x7f,0x70,0x2d,0xf4,0x1b,0xf4,0x7a,0x7b,0xb0,0xbe, +0x50,0xc, 0x50,0x1d,0x12,0xa5,0xf7,0x2d,0xf3,0x69,0x37,0x0, 0x1a,0xbe,0x34,0x0, +0x0, 0x8, 0x4, 0x74,0x1, 0x80,0x2, 0x74,0x2, 0x7f,0x70,0x2d,0xf4,0x39,0xb7,0x0, +0xd, 0xbe,0xa0,0xc, 0x50,0x2f,0x7e,0x70,0xd, 0xac,0x75,0xa, 0x4a,0x2d,0x34,0x7d, +0x43,0x3e,0x44,0x7e,0x7d,0x2c,0x2d,0xf4,0x69,0x47,0x0, 0x2, 0xbe,0x44,0x0, 0x0, +0x8, 0x9, 0x74,0x1, 0x2d,0x13,0x39,0xb0,0x0, 0x1, 0x22,0x74,0x2, 0x2d,0x31,0x7d, +0x20,0x39,0xb1,0x0, 0x1, 0x22,0x1a,0xe, 0x7e,0x14,0x0, 0xd, 0xad,0x10,0x1a,0x3f, +0x2d,0x31,0x9, 0xb3,0x64,0xbf,0x22,0x7e,0x90,0xd, 0xac,0x95,0xa, 0x3a,0x2d,0x43, +0x7d,0x34,0x3e,0x34,0x7e,0x7d,0x2c,0x22,0xb, 0x7a,0x30,0xbe,0x34,0x0, 0x0, 0x22, +0xca,0xf8,0x7c,0xa7,0x7c,0xfb,0x7e,0x8, 0x73,0xdc,0x12,0xa6,0x70,0x74,0xfa,0x7e, +0x70,0xfa,0x1a,0x1b,0xa, 0xf, 0x2d,0x1, 0xbe,0x4, 0x0, 0x0, 0x48,0x32,0x12,0xa6, +0xe6,0x58,0x2d,0x1a,0x17,0xa, 0x4a,0x2d,0x41,0xbe,0x44,0x0, 0x0, 0x48,0x21,0x7e, +0x63,0x6f,0x65,0xa, 0x16,0xbd,0x41,0x58,0x17,0xad,0x10,0x2d,0x41,0x3e,0x44,0x49, +0x44,0x4, 0x0, 0x1a,0x27,0x3e,0x24,0x1a,0xb, 0x12,0xa6,0x78,0x59,0x42,0x74,0x84, +0xb, 0x70,0xbe,0x70,0x6, 0x8, 0xbb,0x4, 0xbe,0xb0,0x6, 0x8, 0xb2,0xda,0xf8,0x22, +0x7e,0x34,0x1, 0x52,0xe4,0x2, 0x24,0x38,0x7e,0x14,0x0, 0x1a,0xad,0x10,0x2d,0x21, +0x22,0xca,0xf8,0x7c,0xa7,0x7c,0xfb,0x7e,0x8, 0x20,0x54,0x12,0x65,0x91,0x74,0xfa, +0x7e,0x70,0xfa,0x1a,0x1b,0xa, 0xf, 0x2d,0x1, 0xbe,0x4, 0x0, 0x0, 0x48,0x37,0x12, +0xa6,0xe6,0x58,0x32,0x1a,0x17,0xa, 0x2a,0x2d,0x21,0xbe,0x24,0x0, 0x0, 0x48,0x26, +0x7e,0x63,0x6f,0x65,0xa, 0x16,0xbd,0x21,0x58,0x1c,0x1a,0x47,0x3e,0x44,0x1a,0xeb, +0x7e,0xf4,0x0, 0x1a,0xad,0xfe,0x2d,0x4f,0x49,0x44,0x74,0x84,0xad,0x10,0x2d,0x21, +0x3e,0x24,0x59,0x42,0x20,0x54,0xb, 0x70,0xbe,0x70,0x6, 0x8, 0xb6,0x4, 0xbe,0xb0, +0x6, 0x8, 0xad,0xda,0xf8,0x22,0x7e,0x63,0x6f,0x64,0xa, 0x16,0xbd,0x1, 0x22,0xca, +0x3b,0x6c,0xff,0xc2,0x0, 0x7e,0xb3,0x6f,0x57,0x60,0x6, 0x7e,0xd4,0x1, 0xc2,0x80, +0x4, 0x7e,0xd4,0x3, 0xe8,0x7e,0xb3,0x6f,0x58,0xb4,0x1, 0x4, 0x7e,0xd4,0x0, 0xf0, +0x7e,0xc7,0x6d,0x99,0x6c,0xee,0xe1,0xad,0xc2,0x0, 0x7c,0xbe,0x12,0xa0,0x66,0x7d, +0xb3,0x7e,0x90,0x2, 0xac,0x9e,0x9, 0xa4,0x6c,0x9, 0x7c,0xda,0x9, 0xc4,0x6c,0xa, +0x7d,0xad,0x4c,0xdd,0x68,0x16,0x7e,0xb3,0x6f,0x66,0x14,0xbc,0xbd,0x68,0xd, 0x4c, +0xcc,0x68,0x9, 0x7e,0xb3,0x6f,0x67,0x14,0xbc,0xbc,0x78,0x8, 0x7d,0xad,0x1e,0xa4, +0x2e,0xa4,0x0, 0x64,0x7c,0xba,0x12,0xa7,0xe9,0xbd,0x3b,0x58,0x4, 0xd2,0x0, 0x80, +0x26,0x7e,0x73,0x6f,0x32,0xbe,0x73,0x6d,0x93,0x78,0x1c,0x7e,0x37,0x3, 0xfe,0xe, +0x34,0xbd,0x3c,0x58,0x12,0x7c,0xbe,0x7e,0x70,0x1, 0x12,0xd1,0x93,0x7d,0x1a,0x6d, +0x0, 0xbf,0x10,0x8, 0x2, 0xd2,0x0, 0x30,0x0, 0x21,0x7c,0xbe,0x12,0x6e,0x5, 0x60, +0x1a,0x7e,0x34,0x0, 0x9, 0xca,0x39,0xac,0x7e,0x2e,0x34,0x6c,0x85,0x6d,0x22,0x12, +0xa7,0xdf,0x6d,0x0, 0x12,0x24,0x13,0x1b,0xfd,0xb, 0xf0,0xb, 0xe0,0x12,0x6f,0xa9, +0x28,0x2, 0xe1,0x18,0x7a,0x73,0x6d,0xa8,0x7a,0xf3,0x6f,0x31,0x7a,0xc7,0x3, 0xfe, +0xda,0x3b,0x22,0x2, 0xa6,0xef,0x7e,0x24,0x0, 0x3, 0x2, 0x22,0x71,0x7a,0x35,0x3c, +0xbe,0x34,0x0, 0x0, 0x22,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x6c,0x9, 0x22,0x7e, +0x30,0x9, 0xac,0x3f,0x2e,0x14,0x6d,0xc9,0x22,0x7e,0x37,0x6f,0x40,0x7e,0x53,0x6f, +0x66,0xbc,0x5b,0x38,0x4, 0x7e,0x37,0x6f,0x46,0x22,0x7f,0x20,0xb, 0x2a,0x10,0xb, +0x1a,0x0, 0x1b,0x2a,0x0, 0x1b,0x1a,0x10,0x22,0x7c,0xab,0x7e,0xb3,0x6d,0xa9,0x7e, +0x93,0x6d,0x93,0x60,0x4a,0xb4,0x1, 0x5, 0xbe,0x90,0x2, 0x68,0x42,0x74,0x9, 0xa4, +0x9, 0xa5,0x6c,0x8b,0xbe,0x90,0x1, 0x78,0x24,0xbe,0xa0,0x19,0x28,0x7, 0x74,0x6, +0x7a,0xb, 0xb0,0x80,0x27,0xbe,0xa0,0x14,0x28,0x7, 0x74,0x5, 0x7a,0xb, 0xb0,0x80, +0x1b,0xbe,0xa0,0xa, 0x28,0x19,0x74,0x4, 0x7a,0xb, 0xb0,0x80,0xf, 0xbe,0x90,0x2, +0x78,0xd, 0xbe,0xa0,0x14,0x28,0x8, 0x74,0x4, 0x7a,0xb, 0xb0,0x7a,0x1b,0xb0,0x22, +0xca,0x3b,0x6c,0xff,0x6c,0xee,0x7e,0xb3,0x6f,0x66,0xf5,0x2b,0x7e,0xd3,0x6f,0x67, +0xe4,0x7a,0xb3,0x75,0x2f,0x7e,0xb3,0x25,0xae,0xb4,0x1, 0x2, 0x80,0x2, 0x21,0x6a, +0x6c,0xcc,0x21,0x58,0x7e,0x70,0x2, 0xac,0x7c,0x12,0xa9,0x70,0x75,0x27,0x3, 0x75, +0x28,0x3, 0x12,0x9f,0xe6,0xbe,0x37,0x6f,0x42,0x58,0x2, 0x21,0x56,0x7e,0x73,0x6d, +0x93,0xbe,0x70,0x5, 0x28,0x6, 0x75,0x27,0x2, 0x75,0x28,0x2, 0xe5,0x29,0xbe,0xb0, +0x1, 0x68,0x9, 0xe5,0x2b,0x24,0xfe,0xbe,0xb1,0x29,0x78,0x3, 0x75,0x27,0x2, 0xe5, +0x2a,0xbe,0xb0,0x1, 0x68,0x9, 0x7c,0xbd,0x24,0xfe,0xbe,0xb1,0x2a,0x78,0x3, 0x75, +0x28,0x2, 0xe5,0x29,0x60,0x8, 0xe5,0x2b,0x14,0xbe,0xb1,0x29,0x78,0x3, 0x75,0x27, +0x2, 0xe5,0x2a,0x60,0x8, 0x7c,0xbd,0x14,0xbe,0xb1,0x2a,0x78,0x3, 0x75,0x28,0x2, +0xc2,0x0, 0xe5,0x29,0x7e,0x71,0x2a,0x7c,0x6c,0x12,0xdf,0xd1,0xbe,0xb0,0xff,0x68, +0x6, 0x75,0x27,0x2, 0x75,0x28,0x2, 0x7c,0xbc,0x7e,0x8, 0x0, 0x27,0x7e,0x18,0x0, +0x28,0x12,0xa8,0x9, 0x7e,0xb3,0x6f,0x57,0x60,0x6, 0x75,0x27,0x4, 0x75,0x28,0x4, +0xe5,0x27,0x7e,0x71,0x28,0x7c,0x6c,0x7c,0x5e,0x12,0xa3,0x8c,0x7e,0x70,0x9, 0xac, +0x7e,0x9, 0x53,0x6c,0x8b,0xbc,0x5f,0x28,0x2, 0x7c,0xf5,0x90,0x21,0xd9,0xe4,0x93, +0xb4,0x1, 0x11,0x7d,0x13,0x2e,0x14,0x6c,0x85,0x6d,0x0, 0x2e,0x34,0x6c,0x87,0x6d, +0x22,0x12,0xa7,0xfa,0xb, 0xe0,0xb, 0xc0,0x7e,0x73,0x6d,0x93,0xbc,0x7c,0x28,0x2, +0x1, 0x84,0x7a,0xe3,0x6d,0x93,0x7a,0xf3,0x75,0x2f,0xda,0x3b,0x22,0x2, 0xa8,0x60, +0x9, 0xb3,0x6c,0x9, 0xf5,0x29,0x9, 0xb3,0x6c,0xa, 0xf5,0x2a,0x22,0xca,0x3b,0x7c, +0xfb,0x12,0x9f,0xdf,0x7e,0x94,0x0, 0x51,0x7e,0xe3,0x6d,0x93,0xe4,0x7a,0xb3,0x75, +0xff,0x7a,0xb3,0x76,0x0, 0x7a,0xb3,0x75,0xc1,0x7e,0x8, 0x76,0x1, 0x12,0xac,0x4c, +0xe4,0x12,0x24,0x38,0x12,0xac,0x4c,0x3e,0x34,0x7e,0x8, 0x75,0xc2,0xe4,0x12,0x24, +0x38,0xbe,0xe0,0x2, 0x50,0x2, 0x81,0x33,0x6c,0xdd,0x81,0x2d,0x74,0x2, 0x7c,0x7d, +0xac,0x7b,0x12,0xa9,0x70,0x4c,0xdd,0x68,0x8, 0xa, 0x8d,0x9, 0xb8,0x76,0x1, 0x70, +0xa, 0xa, 0x3d,0xb, 0x34,0xa, 0x8d,0x19,0x78,0x76,0x1, 0xa, 0x5d,0xb, 0x54,0xf5, +0x27,0x81,0x24,0x7e,0xa1,0x27,0x74,0x2, 0x7c,0x7a,0xac,0x7b,0x9, 0xa3,0x6c,0x9, +0x7a,0xa1,0x2b,0x9, 0xb3,0x6c,0xa, 0xf5,0x2c,0xa, 0x2a,0xe5,0x29,0x12,0x85,0xe0, +0x8, 0x6, 0x7d,0x50,0x9d,0x52,0x80,0x4, 0x6d,0x55,0x9d,0x53,0xf5,0x2d,0xe5,0x2c, +0xa, 0x2b,0xe5,0x2a,0x12,0x85,0xe0,0x8, 0x6, 0x7d,0x80,0x9d,0x82,0x80,0x4, 0x6d, +0x88,0x9d,0x83,0x7d,0x38,0x7c,0xc7,0xe5,0x2d,0xbe,0xb0,0x6, 0x40,0x2, 0x81,0x22, +0xbe,0xc0,0x6, 0x40,0x2, 0x81,0x22,0x12,0x9f,0xe6,0x7a,0x35,0x2f,0x12,0x9b,0x65, +0x7d,0x83,0x7e,0x25,0x2f,0xbd,0x28,0x8, 0x4, 0x7d,0x38,0x80,0x3, 0x7e,0x35,0x2f, +0x7a,0x35,0x31,0xbd,0x28,0x58,0x4, 0x7d,0x38,0x80,0x3, 0x7e,0x35,0x2f,0x7a,0x35, +0x33,0x75,0x2e,0x0, 0xe5,0x2d,0xbe,0xb0,0x1, 0x38,0x21,0xbe,0xc0,0x1, 0x38,0x1c, +0x7c,0xbf,0x30,0xe0,0x17,0x7e,0xb3,0x75,0xc1,0x4, 0x7a,0xb3,0x75,0xc1,0x75,0x2e, +0x1, 0x7e,0xb3,0x75,0xff,0x4, 0x7a,0xb3,0x75,0xff,0x61,0xc6,0xe5,0x2d,0xbe,0xb0, +0x1, 0x38,0x7, 0xbe,0xc0,0x1, 0x38,0x2, 0x61,0xc6,0xe5,0x2d,0xbe,0xb0,0x6, 0x40, +0x2, 0x61,0xc6,0xbe,0xc0,0x6, 0x40,0x2, 0x61,0xc6,0x7c,0xbf,0x20,0xe1,0x2, 0x61, +0xc6,0xc2,0x3, 0xe5,0x2d,0xbe,0xb0,0x2, 0x28,0x5, 0xbe,0xc0,0x2, 0x38,0x2, 0xd2, +0x3, 0x12,0xac,0x53,0x12,0xd4,0x92,0x12,0x87,0x4c,0x7a,0xd, 0x3b,0x7d,0x38,0x2e, +0x35,0x2f,0x12,0xae,0x4f,0x7a,0x35,0x35,0xc2,0x2, 0xbe,0x8, 0x7f,0xff,0x78,0x5, +0x9f,0x11,0x7a,0x1d,0x3b,0x7e,0x35,0x35,0x7a,0x35,0x44,0x12,0xac,0x53,0x7e,0xd, +0x3b,0x12,0xad,0x38,0x92,0x4, 0x12,0xaf,0x58,0x92,0x1, 0x7e,0x35,0x33,0x12,0xac, +0x39,0x20,0x1, 0x1a,0xe5,0x2d,0xbe,0xb0,0x4, 0x38,0x13,0xbe,0xc0,0x4, 0x38,0xe, +0xa, 0x2c,0xe5,0x2d,0xa, 0x3b,0x12,0xac,0x45,0x18,0x3, 0x12,0xac,0x36,0x85,0x2a, +0x44,0x85,0x2b,0x45,0x85,0x2c,0x46,0x7e,0x8, 0x0, 0x3f,0x7e,0x18,0x0, 0x41,0xe5, +0x29,0x12,0xaf,0x3, 0xe5,0x2d,0xa, 0x4b,0xbe,0x45,0x41,0x8, 0x7, 0xa, 0x3c,0xbe, +0x35,0x41,0x18,0x8, 0x12,0xac,0x41,0x18,0x3, 0x7e,0x95,0x3f,0x7e,0x5, 0x41,0xbe, +0x4, 0x0, 0x3, 0x78,0x5, 0x7e,0x35,0x33,0x80,0x14,0xbe,0x4, 0x0, 0x4, 0x78,0x5, +0x7e,0x35,0x35,0x80,0x9, 0xbe,0x4, 0x0, 0x5, 0x78,0x6, 0x7e,0x35,0x31,0x12,0xac, +0x39,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0x4, 0x7e,0x94,0x0, 0x3c,0x7e,0xb3,0x6f,0x57, +0x60,0x18,0x12,0xac,0x36,0xe5,0x2d,0xbe,0xb0,0x2, 0x38,0xe, 0xbe,0xc0,0x2, 0x38, +0x9, 0x12,0xac,0x41,0x18,0x4, 0x7e,0x94,0x0, 0x32,0x7d,0x19,0x1a,0x2, 0x1a,0x0, +0x7e,0x1d,0x37,0x12,0x22,0xa3,0x7e,0x8, 0x0, 0x64,0x12,0x23,0x10,0x7f,0x1, 0x7e, +0x1d,0x3b,0xbf,0x10,0x8, 0x2, 0xd2,0x2, 0x30,0x4, 0x5, 0x20,0x3, 0x2, 0xc2,0x2, +0x30,0x2, 0x3, 0x75,0x2e,0x2, 0xe5,0x2e,0xbe,0xb0,0x0, 0x28,0x55,0xe5,0x27,0xa, +0x4b,0x9, 0x14,0x76,0x1, 0xa5,0xb9,0x0, 0xc, 0xa, 0x3d,0x9, 0xa3,0x76,0x1, 0x19, +0xa4,0x76,0x1, 0x80,0x3d,0xa, 0x3d,0x9, 0x53,0x76,0x1, 0x7a,0x51,0x43,0xbc,0x51, +0x28,0x3, 0x7a,0x11,0x43,0x75,0x28,0x0, 0x80,0x23,0x9, 0x64,0x76,0x1, 0xe5,0x28, +0xa, 0xb, 0x9, 0x30,0x76,0x1, 0xbc,0x36,0x68,0xa, 0xa, 0x3d,0x9, 0x63,0x76,0x1, +0xbc,0x36,0x78,0x7, 0x7e,0xa1,0x43,0x19,0xa0,0x76,0x1, 0x5, 0x28,0xbe,0xe1,0x28, +0x38,0xd8,0x5, 0x27,0xbe,0xe1,0x27,0x28,0x2, 0x21,0xe3,0xb, 0xd0,0xbc,0xed,0x28, +0x2, 0x21,0xbc,0xda,0x3b,0x22,0x7e,0x35,0x31,0x1a,0x26,0x1a,0x24,0x7a,0x1d,0x37, +0x22,0xa, 0x2c,0x7d,0x34,0x2d,0x32,0xbe,0x34,0x0, 0x6, 0x22,0x90,0x21,0x52,0x93, +0xa, 0x3b,0x22,0xe5,0x29,0x7e,0x71,0x2a,0x7e,0x61,0x2b,0x7e,0x51,0x2c,0x22,0xca, +0xd8,0xca,0x79,0xc2,0x0, 0x7e,0xe0,0x3, 0xe4,0x7a,0xb3,0x75,0xfe,0x7e,0xd3,0x6f, +0x32,0x12,0xd6,0x93,0x7e,0xf3,0x6d,0x93,0xbe,0xf0,0x1, 0x38,0x2, 0xa1,0x29,0x7c, +0xbe,0x12,0xa9,0x7d,0x4c,0xdd,0x78,0x4, 0xc2,0x0, 0x80,0x5f,0xbe,0xd0,0x1, 0x28, +0xd, 0x7e,0x73,0x76,0x3f,0xbe,0x70,0x6, 0x28,0x4, 0xc2,0x0, 0x80,0x4d,0xc2,0x0, +0x7e,0x53,0x6d,0x93,0xbc,0x5d,0x78,0x11,0x12,0xae,0xe3,0x50,0x5, 0x7e,0xe0,0x3, +0x80,0x3, 0x7e,0xe0,0x1, 0xd2,0x0, 0x80,0x32,0x7e,0x43,0x75,0xff,0xa, 0x34,0xa, +0x25,0x7d,0x12,0x9d,0x13,0xb, 0x14,0xa, 0x3d,0xbd,0x31,0x78,0x7, 0x7e,0xe0,0x1, +0xd2,0x0, 0x80,0x17,0x7e,0x73,0x75,0xc1,0xa, 0x37,0x9d,0x23,0xb, 0x24,0x7e,0x73, +0x76,0x40,0xbd,0x32,0x78,0x5, 0x7e,0xe0,0x41,0xd2,0x0, 0x30,0x0, 0x5, 0x7c,0xbe, +0x12,0xa9,0x7d,0x7e,0x8, 0x76,0x1, 0x12,0xd3,0xc6,0x7a,0xb3,0x75,0xfe,0x7e,0xa3, +0x75,0xfe,0x7a,0xa3,0x6d,0x93,0x74,0x2, 0xa4,0xca,0x59,0x7e,0x18,0x75,0xc2,0x7e, +0x8, 0x6c,0x9, 0x12,0x24,0x13,0x1b,0xfd,0x7e,0x73,0x6d,0x93,0x7a,0x73,0x76,0x40, +0x12,0xae,0x56,0x7a,0xb3,0x76,0x3f,0x80,0xa, 0x74,0x64,0x7a,0xb3,0x76,0x3f,0x7a, +0xf3,0x76,0x40,0xda,0x79,0xda,0xd8,0x22,0xca,0x79,0x7f,0x60,0x7c,0xf5,0x7c,0xe6, +0x12,0xad,0x9f,0x7d,0xb3,0x7c,0xbe,0x7c,0x7f,0x12,0xad,0x9f,0x2d,0x3b,0x12,0xae, +0x4f,0x7d,0xa3,0x7e,0x25,0x44,0x7d,0x12,0x9d,0x1a,0xbe,0x14,0x0, 0x0, 0x8, 0x6, +0x7d,0x32,0x9d,0x3a,0x80,0x4, 0x6d,0x33,0x9d,0x31,0x7d,0x12,0x1a,0x2, 0x1a,0x0, +0x9f,0x6, 0xbe,0x14,0x0, 0x0, 0x8, 0x6, 0x7d,0xd, 0x9d,0x20,0x80,0x4, 0x6d,0x22, +0x9d,0x21,0x7e,0x14,0x0, 0x3, 0xad,0x13,0xbd,0x12,0x58,0xf, 0xbe,0x24,0x0, 0x64, +0x8, 0x9, 0xbe,0x34,0x0, 0x46,0x8, 0x3, 0xd3,0x80,0x1, 0xc3,0xda,0x79,0x22,0xca, +0x79,0x7c,0x8b,0x7e,0xb3,0x6f,0x66,0xf5,0x49,0x7e,0x93,0x6f,0x67,0x7e,0x4, 0x80, +0x1, 0x7c,0xf7,0x1a,0x18,0x1b,0x14,0x7c,0xe3,0xc1,0x3e,0x7a,0xe1,0x47,0xbe,0xe0, +0x0, 0x58,0xc, 0x1a,0x5e,0x1a,0x18,0x9d,0x15,0x1a,0x58,0x2d,0x51,0xf5,0x47,0xe5, +0x49,0xbc,0xbe,0x18,0xc, 0x1a,0x58,0x1a,0x1e,0x9d,0x15,0x1a,0x58,0x9d,0x51,0xf5, +0x47,0x1a,0x5f,0x1b,0x54,0xf5,0x46,0x80,0x47,0x85,0x46,0x48,0xe5,0x46,0xbe,0xb0, +0x0, 0x58,0xe, 0xe5,0x46,0x1a,0x5b,0x1a,0x1f,0x9d,0x15,0x1a,0x5f,0x2d,0x51,0xf5, +0x48,0xbe,0x91,0x46,0x18,0xe, 0x1a,0x3f,0xe5,0x46,0x1a,0x1b,0x9d,0x13,0x1a,0x5f, +0x9d,0x51,0xf5,0x48,0xbe,0x81,0x47,0x78,0x5, 0xbe,0xf1,0x48,0x68,0x10,0xe5,0x47, +0x7e,0x71,0x48,0x12,0x9b,0x6a,0x7d,0xf3,0xbd,0xf0,0x8, 0x2, 0x7d,0xf, 0x5, 0x46, +0x1a,0xef,0xb, 0xe4,0xe5,0x46,0x1a,0x1b,0xbd,0x1e,0x8, 0xad,0xb, 0xe0,0x1a,0x58, +0xb, 0x54,0x1a,0x1e,0xbd,0x15,0x18,0x2, 0xa1,0xbb,0x7d,0x30,0xda,0x79,0x22,0x7e, +0x24,0x0, 0x2, 0x2, 0x22,0x71,0xca,0x3b,0x7e,0xa0,0x64,0x6c,0x77,0x80,0x67,0xa, +0x27,0xb, 0x24,0x7c,0x65,0x80,0x55,0x7e,0xf0,0x2, 0xac,0xf6,0x9, 0xb7,0x6c,0x9, +0xa, 0xb, 0x7e,0xd0,0x2, 0xac,0xd7,0x9, 0xb6,0x6c,0x9, 0xa, 0x2b,0x12,0xae,0xda, +0x8, 0x4, 0x9d,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0x9, 0x47,0x6c,0xa, 0xa, 0x44, +0x9, 0x46,0x6c,0xa, 0xa, 0x14,0x7d,0x1, 0x9d,0x4, 0xbe,0x4, 0x0, 0x0, 0x8, 0x4, +0x9d,0x14,0x80,0x4, 0x6d,0x11,0x9d,0x10,0x7c,0x43,0xbc,0x45,0x50,0x4, 0x7c,0x35, +0x80,0x2, 0x7c,0x34,0xbc,0xa3,0x28,0x2, 0x7c,0xa3,0xb, 0x60,0x7e,0x23,0x6d,0x93, +0xbc,0x26,0x38,0xa3,0xb, 0x70,0x7e,0xb3,0x6d,0x93,0xbc,0xb7,0x38,0x91,0xbe,0xa0, +0x64,0x78,0x2, 0x6c,0xaa,0x7c,0xba,0xda,0x3b,0x22,0x7d,0x12,0x9d,0x10,0xbe,0x14, +0x0, 0x0, 0x22,0x6c,0xaa,0x80,0x12,0x7e,0x70,0x9, 0xac,0x7a,0x9, 0xb3,0x6c,0x8b, +0xbe,0xb0,0x10,0x28,0x2, 0xd3,0x22,0xb, 0xa0,0x7e,0xb3,0x6d,0xa9,0xbc,0xba,0x38, +0xe6,0xc3,0x22,0x7c,0x9b,0x7f,0x71,0x7f,0x60,0x7e,0x34,0x29,0x6, 0x7e,0x24,0x0, +0xff,0x7e,0x14,0x63,0x6d,0x74,0x30,0x12,0x23,0x65,0x7e,0x58,0x63,0x6d,0x7c,0xb9, +0x7e,0x71,0x44,0x12,0x9b,0x6a,0x7d,0x3, 0xe5,0x45,0x7e,0x71,0x46,0x12,0x9b,0x6a, +0x2d,0x30,0xe, 0x34,0x7f,0x5, 0x7e,0x50,0x8, 0xb, 0xa, 0x50,0xbd,0x53,0x58,0xf, +0x69,0x30,0x0, 0x2, 0x1b,0x6a,0x30,0x69,0x30,0x0, 0x4, 0x1b,0x7a,0x30,0x22,0x2e, +0x14,0x0, 0x6, 0x1b,0x50,0x78,0xe2,0x22,0xd2,0x5, 0x7e,0x73,0x6d,0x93,0xbe,0x70, +0x3, 0x50,0x2, 0xc3,0x22,0x7e,0x8, 0x63,0x6d,0x12,0xaf,0xd0,0x6c,0xaa,0x80,0x17, +0x7e,0x90,0x2, 0xac,0x9a,0x9, 0xb4,0x6c,0x9, 0x19,0xb4,0x63,0x6d,0x9, 0xb4,0x6c, +0xa, 0x19,0xb4,0x63,0x6e,0xb, 0xa0,0x7e,0x73,0x6d,0x93,0xbc,0x7a,0x38,0xe1,0x6c, +0xaa,0x80,0x36,0xa, 0x2a,0xb, 0x24,0x7c,0x65,0x80,0x28,0x7e,0x50,0x2, 0xac,0x56, +0x9, 0x12,0x63,0x6d,0x7e,0x30,0x2, 0xac,0x3a,0x9, 0xb1,0x63,0x6d,0xbc,0xb1,0x78, +0x2, 0xc2,0x5, 0x9, 0x52,0x63,0x6e,0x9, 0xb1,0x63,0x6e,0xbc,0xb5,0x78,0x2, 0xc2, +0x5, 0xb, 0x60,0xbc,0x76,0x38,0xd4,0xb, 0xa0,0xbc,0x7a,0x38,0xc6,0xa2,0x5, 0x22, +0x7e,0x34,0x0, 0x3c,0xe4,0x2, 0x24,0x38,0xca,0x3b,0xc2,0x0, 0x7e,0x38,0x6e,0xd7, +0x6c,0xaa,0x80,0x19,0x7e,0x70,0xff,0x12,0xb3,0x97,0x74,0xff,0xa, 0x4a,0x19,0xb4, +0x63,0x81,0xe4,0x19,0xb4,0x63,0x6d,0x19,0xb4,0x63,0x77,0xb, 0xa0,0x12,0x45,0x1f, +0x38,0xe2,0x7e,0x73,0x6f,0x31,0xa5,0xbf,0x0, 0x2e,0x7e,0xb3,0x3, 0xc9,0x70,0x2, +0x41,0xb8,0x6c,0xaa,0x80,0x1b,0x7e,0x44,0x7f,0xff,0x7e,0x50,0x9, 0xac,0x5a,0x7f, +0x3, 0x2d,0x12,0x79,0x40,0x0, 0x2, 0x7f,0x3, 0x2d,0x12,0x79,0x40,0x0, 0x4, 0xb, +0xa0,0x12,0x45,0x1f,0x38,0xe0,0x41,0xb8,0x7e,0xb3,0x3, 0xc9,0x70,0x3b,0xbe,0x70, +0x0, 0x28,0x36,0x6c,0xaa,0x80,0x2b,0x7e,0x90,0x9, 0xac,0x9a,0x49,0x34,0x6d,0xc9, +0x7f,0x3, 0x2d,0x14,0x79,0x30,0x0, 0x2, 0x49,0x34,0x6d,0xcb,0x7f,0x3, 0x2d,0x14, +0x79,0x30,0x0, 0x4, 0x74,0x1, 0xa, 0x3a,0x19,0xb3,0x63,0x6d,0x19,0xa4,0x6d,0xcd, +0xb, 0xa0,0x12,0xb3,0x5f,0x38,0xd0,0x41,0xb8,0x6c,0xaa,0x80,0x1d,0x7e,0x44,0x7f, +0xff,0x7e,0x70,0x2, 0xac,0x7a,0x3e,0x34,0x59,0x43,0x24,0x6c,0x59,0x43,0x24,0x6e, +0x59,0x43,0x24,0x94,0x59,0x43,0x24,0x96,0xb, 0xa0,0x12,0x45,0x1f,0x38,0xde,0x7e, +0xb3,0x3, 0xc9,0xbe,0xb3,0x6f,0x31,0x28,0x9, 0xbe,0xb0,0x2, 0x40,0x4, 0xd2,0x0, +0x80,0x2, 0xc2,0x0, 0x6c,0xaa,0x21,0x75,0x75,0x27,0x0, 0x21,0x6c,0x12,0xb3,0xa1, +0x7f,0x73,0x2d,0xf3,0x69,0x17,0x0, 0x2, 0xbe,0x14,0x7f,0xff,0x78,0x2, 0x21,0x6a, +0xe5,0x27,0xa, 0x2b,0x9, 0xb2,0x63,0x77,0x60,0x2, 0x21,0x6a,0x30,0x0, 0x6c,0x7e, +0x71,0x27,0x74,0x2, 0xac,0x7b,0x49,0x3, 0x3, 0xde,0xbe,0x4, 0x7f,0xff,0x68,0x5b, +0x49,0xd3,0x3, 0xde,0x69,0x7, 0x0, 0x2, 0x7d,0x40,0x9d,0x4d,0x2d,0x40,0x49,0xd3, +0x3, 0xca,0x69,0x7, 0x0, 0x4, 0x7d,0x30,0x9d,0x3d,0x2d,0x30,0xbe,0x44,0x0, 0x0, +0x58,0x2, 0x6d,0x44,0xbe,0x34,0x0, 0x0, 0x58,0x2, 0x6d,0x33,0x7e,0x3, 0x6f,0x66, +0x12,0xb3,0x8b,0xbd,0xd4,0x18,0x6, 0x7d,0x40,0x9e,0x44,0x0, 0x21,0x7e,0x3, 0x6f, +0x67,0x12,0xb3,0x8b,0xbd,0xd3,0x18,0x6, 0x7d,0x30,0x9e,0x34,0x0, 0x21,0x12,0xb3, +0x66,0x59,0x40,0x24,0x6c,0x59,0x30,0x24,0x6e,0x80,0xf, 0x12,0xb3,0x66,0x59,0x10, +0x24,0x6c,0x69,0x17,0x0, 0x4, 0x59,0x10,0x24,0x6e,0xe5,0x27,0xa, 0x1a,0x19,0xb1, +0x63,0x81,0x74,0x1, 0x19,0xb2,0x63,0x77,0x80,0x9, 0x5, 0x27,0x12,0xb3,0x6e,0x28, +0x2, 0x1, 0xbd,0xb, 0xa0,0x7e,0xb3,0x3, 0xc9,0xbc,0xba,0x28,0x2, 0x1, 0xb8,0x6c, +0xaa,0x80,0x1a,0x12,0xb3,0x77,0x69,0x30,0x0, 0x2, 0x7e,0x50,0x2, 0xac,0x5a,0x59, +0x32,0x3, 0xde,0x69,0x30,0x0, 0x4, 0x59,0x32,0x3, 0xca,0xb, 0xa0,0x12,0x73,0x78, +0xbc,0x7a,0x38,0xdf,0x6c,0xaa,0x80,0x31,0xa, 0x2a,0x9, 0xb2,0x63,0x81,0xb4,0xff, +0x26,0x75,0x27,0x0, 0x80,0x1c,0xe5,0x27,0xa, 0x4b,0x9, 0xb4,0x63,0x77,0x70,0x10, +0xe5,0x27,0xa, 0x2a,0x19,0xb2,0x63,0x81,0x74,0x1, 0x19,0xb4,0x63,0x77,0x80,0x7, +0x5, 0x27,0xbe,0x71,0x27,0x38,0xdf,0xb, 0xa0,0xbc,0x7a,0x38,0xcb,0x6c,0xaa,0x80, +0x18,0x12,0xb3,0xb3,0x7e,0x50,0x2, 0xac,0x5a,0x3e,0x24,0x59,0x42,0x24,0x94,0x49, +0x33,0x6d,0xcb,0x59,0x32,0x24,0x96,0xb, 0xa0,0x12,0xb3,0x5f,0x38,0xe3,0x7e,0x34, +0x24,0x6c,0x7a,0x37,0x63,0x8d,0x7e,0x34,0x24,0x94,0x7a,0x37,0x63,0x8f,0x7e,0x34, +0x24,0xbc,0x7a,0x37,0x63,0x91,0x7e,0x73,0x3, 0xc9,0x7a,0x73,0x63,0x8b,0x7e,0x73, +0x6f,0x31,0x7a,0x73,0x63,0x8c,0x7e,0x8, 0x63,0x8b,0x12,0x1, 0x20,0x6c,0xaa,0x80, +0x56,0x7e,0x70,0xff,0x75,0x27,0x0, 0x80,0x1d,0x7e,0x51,0x27,0x74,0x2, 0xac,0x5b, +0x49,0x12,0x24,0xbc,0xa, 0x2a,0xbd,0x21,0x78,0xa, 0xe5,0x27,0xa, 0x3b,0x9, 0x73, +0x63,0x81,0x80,0x7, 0x5, 0x27,0x12,0xb3,0x6e,0x38,0xde,0xbe,0x70,0xff,0x68,0x25, +0x12,0xb3,0x97,0x74,0x1, 0xa, 0x47,0x19,0xb4,0x63,0x6d,0x7e,0x50,0x9, 0xac,0x5a, +0x49,0x42,0x6d,0xc9,0x12,0xb3,0x81,0x79,0x40,0x0, 0x2, 0x12,0xb3,0xa9,0x12,0xb3, +0x81,0x79,0x40,0x0, 0x4, 0xb, 0xa0,0x7e,0x63,0x6f,0x31,0xbc,0x6a,0x38,0xa2,0x6c, +0xaa,0x80,0x20,0xa, 0x3a,0x9, 0xb3,0x63,0x6d,0xbe,0xb0,0x1, 0x68,0x13,0x7e,0x44, +0x7f,0xff,0x12,0xb3,0x77,0x79,0x40,0x0, 0x2, 0x2d,0x37,0x7d,0x26,0x79,0x41,0x0, +0x4, 0xb, 0xa0,0x12,0x45,0x1f,0x38,0xdb,0x7e,0x73,0x6f,0x31,0x7a,0x73,0x3, 0xc9, +0x7f,0x3, 0x7e,0x18,0x63,0x6d,0x12,0xb2,0xcc,0xda,0x3b,0x22,0xca,0x79,0x7e,0xa3, +0x6f,0x31,0x6c,0x99,0x80,0x77,0xa, 0xf9,0x2d,0xf3,0x7d,0xe2,0x7e,0x7b,0xb0,0xb4, +0x1, 0x27,0x12,0xb3,0x55,0x29,0xb7,0x0, 0x1, 0xb4,0x1, 0x6, 0x74,0x3, 0x39,0xb7, +0x0, 0x1, 0x12,0xb3,0x55,0x29,0x87,0x0, 0x1, 0xbe,0x80,0x3, 0x78,0x3, 0xe4,0x80, +0x32,0x4c,0x88,0x78,0x31,0x74,0x2, 0x80,0x2a,0x12,0xb3,0x55,0x29,0xb7,0x0, 0x1, +0xbe,0xb0,0x2, 0x68,0x8, 0x60,0x6, 0x29,0xb7,0x0, 0x7, 0x70,0x14,0x74,0x1, 0x7a, +0x7b,0xb0,0x7c,0x8a,0xb, 0xa0,0x7e,0xf0,0x9, 0xac,0xf8,0x19,0x97,0x6d,0xcd,0x80, +0x5, 0x74,0x3, 0x7a,0x7b,0xb0,0x12,0xb3,0x55,0x7e,0x7b,0xb0,0x39,0xb7,0x0, 0x1, +0x12,0xb3,0x55,0x29,0xb7,0x0, 0x1, 0x39,0xb7,0x0, 0x7, 0xb, 0x90,0x12,0x96,0xdc, +0x38,0x84,0xda,0x79,0x22,0x7e,0xf0,0x9, 0xac,0xf9,0x7f,0x70,0x2d,0xf7,0x22,0x7e, +0xb3,0x6f,0x31,0xbc,0xba,0x22,0x7e,0x10,0x2, 0xac,0x1a,0x3e,0x4, 0x22,0x90,0x21, +0x51,0xe4,0x93,0xbe,0xb1,0x27,0x22,0x7e,0x70,0x9, 0xac,0x7a,0x7f,0x3, 0x2d,0x13, +0x22,0x7e,0x50,0x9, 0xac,0x57,0x7f,0x3, 0x2d,0x12,0x22,0x7e,0x10,0x40,0xac,0x1, +0x7d,0xd0,0x9e,0xd4,0x0, 0x20,0x22,0x7e,0x50,0x9, 0xac,0x5a,0x19,0x72,0x6d,0xcd, +0x22,0x7e,0x71,0x27,0x74,0x9, 0xac,0x7b,0x22,0x7e,0x50,0x9, 0xac,0x5a,0x49,0x42, +0x6d,0xcb,0x22,0x7e,0x70,0x9, 0xac,0x7a,0x49,0x43,0x6d,0xc9,0x22,0x7e,0x14,0x21, +0xda,0x12,0x6f,0xdd,0x7e,0x14,0x21,0xde,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xd0,0x7e, +0x14,0x21,0xe0,0x12,0xb4,0xe6,0x90,0x1c,0x2c,0xe4,0x93,0x70,0x1, 0x22,0x90,0x21, +0xd9,0xe4,0x93,0xb4,0x1, 0x6, 0x7e,0x83,0x6f,0x67,0x80,0x4, 0x7e,0x83,0x6f,0x66, +0x12,0xb4,0xda,0xbe,0x34,0x0, 0x3f,0x38,0x1e,0x7e,0xe4,0x0, 0x3f,0x9d,0xe3,0x7e, +0x34,0x21,0xe4,0x12,0xb4,0xad,0x7f,0x71,0x12,0xb4,0x9c,0xbf,0x71,0x40,0x2, 0x7f, +0x71,0x9f,0x17,0x7f,0x71,0x80,0x78,0x7d,0x54,0x9e,0x54,0x0, 0x3f,0xbd,0x53,0x38, +0x23,0x7d,0xe3,0x9d,0xe5,0x7e,0x34,0x21,0xe6,0x12,0xb4,0xad,0x7f,0x71,0x90,0x21, +0xe3,0xe4,0x93,0xa, 0x3b,0xbf,0x71,0x40,0x4, 0x7f,0x71,0x1b,0x7c,0x12,0xb4,0xa4, +0x2f,0x71,0x80,0x4b,0x7d,0x52,0x1b,0x54,0xbd,0x53,0x40,0x17,0x7d,0xf5,0x9d,0xf3, +0x6d,0xee,0x7e,0x34,0x21,0xe8,0x12,0xb4,0xc1,0x1b,0x34,0x6d,0x22,0x9f,0x17,0x7f, +0x71,0x80,0x11,0x7d,0xf3,0x9d,0xf2,0x6d,0xee,0x7e,0x34,0x21,0xea,0x12,0xb4,0xc1, +0x6d,0x22,0x2f,0x71,0x12,0xb4,0x9c,0x6d,0x22,0xbf,0x71,0x50,0x4, 0x7f,0x71,0x80, +0xe, 0x90,0x21,0xe3,0xe4,0x93,0x12,0xb4,0xa4,0xbf,0x71,0x28,0x2, 0x7f,0x71,0xbe, +0x78,0x2, 0xcf,0x28,0x4, 0x7e,0x78,0x2, 0xcf,0x7d,0x3f,0x22,0x90,0x21,0xe2,0xe4, +0x93,0xa, 0x3b,0x22,0xa, 0x2b,0x7d,0x3d,0x9d,0x32,0x6d,0x22,0x22,0x7e,0x24,0x0, +0xff,0xb, 0x1a,0xf0,0xad,0xfe,0x6d,0xee,0x7d,0x3f,0x7d,0x2e,0x7c,0x76,0x7c,0x65, +0x22,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x10,0x7f,0x17,0x12,0x22,0xb4,0x7f,0x71,0x7c, +0x76,0x7c,0x65,0xa, 0x24,0x7f,0x71,0x7d,0x3c,0x22,0x7e,0x90,0x40,0xac,0x89,0x1b, +0x44,0x22,0x7e,0x14,0x21,0xec,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0xc0,0x22,0xca,0xd8, +0xca,0x79,0x6c,0xff,0x6d,0xdd,0x7d,0xed,0x7d,0xfd,0x7e,0xd3,0x6f,0x31,0x7e,0xe3, +0x6f,0x32,0x7e,0xb3,0x78,0xb1,0x60,0x11,0x7e,0xc7,0x78,0xba,0x4d,0xcc,0x78,0x2, +0xa1,0xde,0xbe,0xd0,0x1, 0x28,0x2, 0xa1,0xde,0xbe,0xd0,0x1, 0x78,0x1d,0xbe,0xb0, +0x4, 0x78,0x2, 0xa1,0xde,0x7e,0xe7,0x6e,0x23,0x7e,0xf7,0x6e,0x25,0x7d,0x3e,0x7d, +0x2f,0x12,0x7d,0xee,0xbe,0xb0,0x1, 0x78,0x2, 0xa1,0xde,0x7e,0xa3,0x78,0xb1,0x7c, +0xba,0x14,0x68,0x29,0x14,0x68,0x54,0x14,0x68,0x23,0x14,0x78,0x2, 0xa1,0xdb,0xb, +0xb2,0x68,0x2, 0xa1,0xde,0xbe,0xd0,0x1, 0x68,0x2, 0xa1,0xed,0x4c,0xee,0x68,0x2, +0xa1,0xed,0x74,0x1, 0x7a,0xb3,0x78,0xb1,0x12,0xb5,0xf4,0x80,0x61,0x4c,0xdd,0x78, +0x1d,0xbe,0xa0,0x1, 0x78,0xc, 0x74,0x2, 0x7a,0xb3,0x78,0xb1,0x7e,0x34,0x22,0x43, +0x80,0x50,0x74,0x4, 0x7a,0xb3,0x78,0xb1,0x7e,0x34,0x22,0x47,0x80,0x44,0x12,0xb5, +0xfd,0x90,0x22,0x36,0x12,0xb6,0x6, 0x68,0x45,0x80,0x52,0xbe,0xd0,0x1, 0x78,0x4d, +0x4c,0xee,0x78,0x49,0x12,0xb5,0xfd,0x7e,0x34,0x22,0x3f,0x12,0x2a,0xa9,0x7e,0x14, +0x22,0x43,0x12,0xb4,0xe6,0x9d,0xc3,0xbe,0xc7,0x78,0xba,0x40,0x21,0x90,0x22,0x35, +0x12,0xb6,0x6, 0x68,0x19,0x12,0xb5,0xf4,0x74,0x3, 0x7a,0xb3,0x78,0xb1,0x7e,0x34, +0x22,0x43,0x12,0x2a,0xa9,0x7a,0x37,0x78,0xba,0x80,0x12,0x7e,0xf0,0x24,0xe4,0x7a, +0xb3,0x78,0xb1,0x6d,0x33,0x7a,0x37,0x78,0xba,0x7c,0xbf,0x80,0x2, 0x7c,0xbf,0xda, +0x79,0xda,0xd8,0x22,0x7a,0xe7,0x78,0xb2,0x7a,0xf7,0x78,0xb4,0x22,0x7a,0xe7,0x78, +0xb6,0x7a,0xf7,0x78,0xb8,0x22,0xe4,0x93,0xa, 0x3b,0x12,0xb6,0x12,0xa, 0xdb,0x4d, +0xdd,0x22,0x7d,0x23,0x12,0x44,0x40,0x7e,0x37,0x78,0xb6,0x7d,0x13,0x9e,0x17,0x78, +0xb2,0xbe,0x14,0x0, 0x0, 0x8, 0x6, 0x9e,0x37,0x78,0xb2,0x80,0x4, 0x6d,0x33,0x9d, +0x31,0xbd,0x32,0x38,0x21,0x7e,0x37,0x78,0xb8,0x7d,0x13,0x9e,0x17,0x78,0xb4,0xbe, +0x14,0x0, 0x0, 0x8, 0x6, 0x9e,0x37,0x78,0xb4,0x80,0x4, 0x6d,0x33,0x9d,0x31,0xbd, +0x32,0x38,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x28,0x7a, +0x35,0x2a,0x7e,0x53,0x6f,0x31,0x7a,0x51,0x41,0xbe,0x50,0x0, 0x28,0x1a,0x7e,0x27, +0x63,0x2f,0xb, 0x24,0x7a,0x27,0x63,0x2f,0xbe,0x24,0x0, 0x64,0x28,0xe, 0x7e,0x24, +0x0, 0x64,0x7a,0x27,0x63,0x2f,0x80,0x4, 0x7a,0x37,0x63,0x2f,0x7e,0xb3,0x76,0xe4, +0xb4,0x1, 0x4, 0x74,0x3, 0x80,0x7, 0x7e,0xb3,0x62,0xde,0x60,0x5, 0x14,0x7a,0xb3, +0x62,0xde,0x7e,0xb3,0x6f,0x38,0x60,0x3, 0x2, 0xbf,0xc, 0x7e,0x37,0x5a,0x42,0xbe, +0x37,0x78,0x98,0x28,0x12,0x7e,0x54,0xff,0xff,0x9e,0x57,0x5a,0x42,0x2e,0x57,0x78, +0x98,0xb, 0x54,0xf5,0x40,0x80,0xa, 0x7e,0x57,0x78,0x98,0x9e,0x57,0x5a,0x42,0xf5, +0x40,0x7e,0x37,0x78,0x98,0x7a,0x37,0x5a,0x42,0xc2,0x24,0x7e,0x34,0x6d,0xc9,0x7a, +0x35,0x2c,0xe5,0x41,0x60,0x6, 0x7e,0xb3,0x6f,0x32,0x70,0x39,0x6c,0xff,0x6c,0xaa, +0x80,0x2e,0xa, 0x4f,0x19,0xa4,0x62,0xca,0xe4,0x19,0xb4,0x62,0xd4,0x6d,0x33,0x7e, +0x50,0x2, 0xac,0x5f,0x59,0x32,0x63,0x7, 0x59,0x32,0x63,0x1b,0x7e,0x70,0xff,0x7e, +0x50,0x9, 0xac,0x5f,0x19,0x72,0x5d,0x9c,0x74,0x1, 0x19,0xb4,0x63,0x31,0xb, 0xf0, +0x12,0xbf,0xdc,0x38,0xcd,0xc2,0x22,0x7e,0xb3,0x5c,0xc3,0x60,0x6, 0x7e,0xb3,0x6f, +0x57,0x60,0x7, 0x12,0xc0,0x42,0x50,0x2, 0xd2,0x22,0x6c,0xff,0x2, 0xbd,0xed,0x7e, +0x70,0x9, 0xac,0x7f,0x9, 0xe3,0x6d,0xcd,0x5e,0xe0,0xf, 0x12,0xbf,0xf4,0x38,0x3, +0x2, 0xbd,0xeb,0x7e,0x90,0x9, 0xac,0x9e,0x9, 0xa4,0x6e,0xd7,0xbe,0xa0,0x1, 0x78, +0x3, 0x2, 0xbd,0xc8,0x7e,0x50,0x2, 0xac,0x5e,0x7d,0x2, 0x2e,0x4, 0x63,0x7, 0xb, +0x8, 0x10,0xb, 0x14,0x1b,0x8, 0x10,0x4c,0xaa,0x78,0x1a,0x49,0x43,0x6d,0xc9,0x74, +0x4, 0xac,0xbe,0x59,0x45,0x62,0xdf,0x49,0x33,0x6d,0xcb,0x59,0x35,0x62,0xe1,0x6d, +0x33,0x59,0x32,0x63,0x1b,0x6c,0xdd,0x2, 0xbd,0xbe,0x7e,0x10,0x9, 0xac,0x1d,0x9, +0xc0,0x5d,0x9c,0xbc,0xce,0x68,0x3, 0x2, 0xbd,0xbc,0x7e,0x70,0x73,0xac,0x7c,0x2e, +0x34,0x5e,0x4c,0x6d,0x22,0x7a,0x1d,0x34,0x12,0xe6,0x15,0x49,0x10,0x5d,0x98,0x49, +0x0, 0x5d,0x9a,0x12,0xbf,0x9a,0x7a,0x35,0x28,0x12,0xe6,0x15,0x74,0x4, 0xac,0xbc, +0x49,0x15,0x62,0xdf,0x49,0x5, 0x62,0xe1,0x12,0xbf,0x9a,0x7a,0x35,0x32,0x74,0x2, +0xac,0xbc,0x7d,0x35,0x2e,0x34,0x63,0x1b,0xb, 0x38,0x40,0x2e,0x45,0x28,0x1b,0x38, +0x40,0x49,0x45,0x63,0x1b,0xbe,0x44,0xf, 0xa0,0x28,0x8, 0x7e,0x34,0xf, 0xa0,0x59, +0x35,0x63,0x1b,0xe5,0x40,0x7a,0xb3,0x63,0xd0,0x12,0xbf,0x38,0x9, 0x73,0x0, 0x6, +0x7a,0x73,0x63,0xd2,0x7e,0x35,0x28,0x7a,0x37,0x63,0xd9,0x7e,0x35,0x32,0x7a,0x37, +0x63,0xdb,0x12,0xbf,0x38,0xb, 0x38,0x30,0x7a,0x37,0x63,0xdd,0x12,0xbf,0x38,0x49, +0x33,0x0, 0x2, 0x7a,0x37,0x63,0xdf,0x74,0x2, 0xac,0xbc,0x49,0x35,0x63,0x7, 0x7a, +0x37,0x63,0xe1,0x74,0x2, 0xac,0xbc,0x49,0x35,0x63,0x1b,0x7a,0x37,0x63,0xe5,0x74, +0x9, 0xac,0xbd,0x49,0x25,0x5d,0x98,0x7e,0x37,0x63,0xdd,0x9d,0x32,0x7a,0x37,0x63, +0xd5,0x74,0x9, 0xac,0xbd,0x49,0x25,0x5d,0x9a,0x7e,0x37,0x63,0xdf,0x9d,0x32,0x7a, +0x37,0x63,0xd7,0x12,0xbf,0x18,0xbe,0xa0,0x0, 0x28,0x1c,0x7e,0x34,0x0, 0x17,0xca, +0x39,0x12,0xbf,0x2f,0x2e,0x34,0xff,0xe9,0x7e,0x8, 0x63,0xe7,0x12,0x24,0x13,0x1b, +0xfd,0x7e,0x37,0x63,0xf0,0x80,0x9, 0x7e,0x8, 0x63,0xe7,0x12,0xbf,0x51,0x6d,0x33, +0x7a,0x35,0x2a,0x12,0xbf,0x18,0xbe,0xa0,0x2, 0x40,0x18,0x7e,0x34,0x0, 0x17,0xca, +0x39,0x12,0xbf,0x2f,0x2e,0x34,0xff,0xd2,0x7e,0x8, 0x63,0xfe,0x12,0x24,0x13,0x1b, +0xfd,0x80,0x7, 0x7e,0x8, 0x63,0xfe,0x12,0xbf,0x51,0x6d,0x33,0x7a,0x35,0x2e,0x75, +0x27,0x0, 0x80,0x12,0x7e,0xa1,0x27,0x12,0xbf,0x2f,0x69,0x31,0x0, 0x9, 0x2e,0x35, +0x2e,0x7a,0x35,0x2e,0x5, 0x27,0xa, 0x3c,0x9, 0x73,0x62,0xca,0xbe,0x71,0x27,0x38, +0xe3,0xbe,0x70,0x0, 0x28,0xa, 0xa, 0x27,0x7e,0x35,0x2e,0x8d,0x32,0x7a,0x35,0x2e, +0x7e,0x35,0x2e,0x7a,0x37,0x63,0xe3,0xc2,0x0, 0xc2,0x1, 0x12,0x9f,0xdf,0xa, 0x3c, +0x9, 0xb3,0x63,0x31,0x60,0x2, 0x41,0x48,0x7e,0x71,0x40,0x74,0x8, 0xac,0x7b,0x2e, +0x34,0x0, 0x14,0xbe,0x35,0x2a,0x50,0x7, 0xbe,0x35,0x28,0x50,0x2, 0xd2,0x24,0x7e, +0xa3,0x63,0xe7,0x74,0x5, 0xa4,0xbe,0x57,0x63,0xf0,0x50,0x19,0x7e,0xa3,0x63,0xfe, +0x74,0x5, 0xa4,0xbe,0x57,0x64,0x7, 0x50,0xc, 0x7e,0x37,0x63,0xfa,0xbe,0x34,0x0, +0x14,0x28,0x2, 0xd2,0x1, 0xa2,0x1, 0xe4,0x33,0x7a,0xb3,0x63,0xd3,0x7e,0x71,0x40, +0x74,0x1e,0xac,0x7b,0x2e,0x35,0x2a,0xbe,0x35,0x28,0x50,0x4, 0xd2,0x3, 0x80,0xe, +0x7e,0x35,0x2a,0x2e,0x34,0x0, 0x40,0xbe,0x35,0x28,0x50,0x2, 0xd2,0x4, 0x30,0x3, +0x6, 0xd2,0x2, 0x74,0x64,0x80,0x14,0x30,0x4, 0xf, 0x30,0x1, 0x6, 0xc2,0x2, 0x74, +0xa, 0x80,0x8, 0xd2,0x2, 0x74,0xc8,0x80,0x2, 0x74,0x14,0x7a,0xb3,0x63,0xd1,0x20, +0x2, 0x2, 0x41,0x34,0x7e,0x37,0x63,0xe3,0xbe,0x34,0x0, 0xa, 0x38,0x2, 0x41,0x34, +0x7e,0x37,0x63,0xfa,0xbe,0x34,0x0, 0xa, 0x28,0x7a,0x7e,0x37,0x64,0x11,0xbe,0x34, +0x0, 0xa, 0x28,0x70,0x7e,0x37,0x63,0xec,0x2e,0x37,0x63,0xf4,0x7a,0x35,0x3a,0xbe, +0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x7a,0x35,0x3a,0x7e,0x37,0x63,0xee,0x2e,0x37, +0x63,0xf6,0x12,0xa7,0xcd,0x58,0x5, 0x6d,0x33,0x7a,0x35,0x3c,0x12,0xbf,0x26,0x7e, +0x15,0x3a,0x7e,0x5, 0x3c,0x12,0xbf,0x9a,0x7a,0x35,0x3a,0x7e,0x37,0x63,0xfc,0xbe, +0x34,0xf, 0xa0,0x40,0xa, 0x7e,0x27,0x63,0xfa,0x7e,0x34,0x0, 0xf, 0x80,0x13,0x12, +0xbf,0x59,0x7e,0x27,0x63,0xfa,0x28,0x6, 0x7e,0x34,0x0, 0x9, 0x80,0x4, 0x7e,0x34, +0x0, 0x6, 0xad,0x32,0x7a,0x35,0x30,0xbe,0x35,0x3a,0x28,0x8, 0xc2,0x2, 0x74,0x28, +0x7a,0xb3,0x63,0xd1,0x30,0x22,0xc, 0xc2,0x2, 0xe4,0x12,0xbf,0x11,0x74,0x6e,0x7a, +0xb3,0x63,0xd1,0x12,0xbf,0x61,0x80,0x19,0xa, 0x3c,0x2e,0x34,0x63,0x31,0x12,0xe7, +0x28,0x12,0xbf,0x61,0x74,0x78,0x7a,0xb3,0x63,0xd1,0xd2,0x2, 0xe4,0x7a,0xb3,0x63, +0xd3,0xa2,0x2, 0xe4,0x33,0x7a,0xb3,0x63,0xd4,0xa, 0x3c,0x9, 0xa3,0x62,0xd4,0x4c, +0xaa,0x78,0x19,0x7e,0x35,0x3e,0xbe,0x35,0x28,0x40,0x2, 0x81,0xa3,0x20,0x2, 0x2, +0x81,0xa3,0x74,0x1, 0xa, 0x4c,0x19,0xb4,0x62,0xd4,0x81,0xa3,0xbe,0xa0,0x1, 0x68, +0x2, 0x81,0x85,0x7e,0x7, 0x64,0x11,0xbe,0x4, 0x0, 0x3, 0x50,0x30,0x7e,0x17,0x63, +0xf0,0xbe,0x14,0x0, 0x50,0x50,0x26,0x7e,0x17,0x63,0xe1,0xbe,0x14,0x0, 0x14,0x50, +0x1c,0x7e,0x17,0x64,0x9, 0xbe,0x14,0x0, 0x1e,0x50,0x12,0x7e,0x17,0x63,0xf2,0xbe, +0x14,0x0, 0x50,0x50,0x8, 0x7e,0x15,0x2a,0x7a,0x15,0x30,0x61,0xb6,0x7e,0x17,0x63, +0xe1,0xbe,0x14,0x0, 0xa, 0x50,0x13,0x7e,0x17,0x63,0xfa,0xbe,0x14,0x0, 0x8, 0x28, +0x9, 0x7e,0x73,0x63,0xd2,0xbe,0x70,0xf, 0x40,0x15,0x7e,0x17,0x63,0xfa,0xbe,0x14, +0x0, 0xf, 0x28,0x42,0xbe,0x4, 0x0, 0xf, 0x28,0x3c,0x12,0xbf,0x59,0x50,0x37,0x7e, +0xa3,0x63,0xe7,0xa, 0x2a,0x7e,0x35,0x2a,0x8d,0x32,0x7d,0x23,0x1e,0x24,0x12,0xbf, +0x45,0xbe,0x34,0x0, 0x78,0x28,0x7, 0x7e,0x4, 0x0, 0x78,0x7a,0x5, 0x30,0xbe,0xa0, +0xa, 0x38,0x2, 0x61,0xb6,0x7e,0x5, 0x30,0xbe,0x4, 0x0, 0x50,0x40,0x2, 0x61,0xb6, +0x7e,0x4, 0x0, 0x50,0x80,0x8, 0x7e,0xb3,0x64,0x1, 0x60,0x7, 0x6d,0x0, 0x7a,0x5, +0x30,0x80,0x73,0x7e,0x73,0x63,0xe7,0xa, 0x27,0x7e,0x37,0x63,0xf0,0x12,0xbf,0x41, +0x7e,0xa3,0x63,0xe9,0x74,0x2, 0xa4,0x7e,0x73,0x63,0xd2,0xa, 0x27,0xbd,0x25,0x8, +0x31,0xbe,0x14,0x0, 0x1e,0x50,0x2b,0x7e,0x63,0x64,0x0, 0xa, 0x6, 0x12,0xae,0xda, +0x8, 0x4, 0x9d,0x20,0x80,0x4, 0x6d,0x22,0x9d,0x21,0xbe,0x24,0x0, 0x5, 0x8, 0x12, +0x7e,0x25,0x30,0xbe,0x24,0x0, 0xc8,0x50,0x2d,0x7e,0x24,0x0, 0xc8,0x7a,0x25,0x30, +0x80,0x24,0xbe,0x70,0xf, 0x28,0xf, 0x7e,0x35,0x30,0xbe,0x34,0x0, 0xc8,0x28,0x16, +0x7e,0x34,0x0, 0xc8,0x80,0xd, 0x7e,0x35,0x30,0xbe,0x34,0x0, 0x78,0x28,0x7, 0x7e, +0x34,0x0, 0x78,0x7a,0x35,0x30,0x7e,0x35,0x30,0xbe,0x35,0x28,0x28,0x42,0xd2,0x0, +0x7e,0x37,0x63,0xe1,0xbe,0x34,0x0, 0x8, 0x50,0x11,0x12,0xbf,0x7b,0x28,0xc, 0x74, +0x2, 0xa, 0x2c,0x19,0xb2,0x62,0xd4,0xc2,0x0, 0x80,0x7b,0x7e,0x27,0x64,0x9, 0xbe, +0x24,0x0, 0x64,0x28,0x71,0x12,0xbf,0x7b,0x28,0x6c,0xbe,0x34,0x0, 0x14,0x50,0x66, +0x7e,0x73,0x63,0xd2,0xbe,0x70,0x14,0x50,0x5d,0x12,0xbf,0xf, 0xc2,0x0, 0x80,0x56, +0x7e,0x35,0x3e,0xbe,0x35,0x28,0x50,0x8, 0x30,0x2, 0x5, 0x74,0x3, 0x12,0xbf,0x11, +0x7e,0x37,0x63,0xe1,0xbe,0x34,0x0, 0x1e,0x50,0x3c,0x7e,0x73,0x5a,0x5b,0xbe,0x70, +0x2, 0x28,0x18,0x7e,0xb3,0x63,0xea,0x70,0x12,0x12,0xbf,0x72,0x50,0xd, 0x12,0xbf, +0x26,0x12,0xc7,0xd1,0x50,0x20,0x12,0xbf,0xf, 0x80,0x1b,0x12,0xbf,0x72,0x50,0x16, +0x7e,0x37,0x63,0xdb,0xbe,0x34,0x0, 0x1e,0x50,0xc, 0x7e,0x37,0x63,0x2f,0xbe,0x34, +0x0, 0x78,0x50,0x2, 0xd2,0x0, 0x12,0xbf,0x1f,0xb4,0x1, 0x1f,0x12,0xbf,0x26,0x7e, +0x17,0x64,0xb, 0x7e,0x7, 0x64,0xd, 0x12,0xbf,0x9a,0xbe,0x34,0x0, 0x3c,0x50,0x2f, +0xc2,0x0, 0xe4,0xa, 0x3c,0x19,0xb3,0x62,0xca,0x80,0x24,0x12,0xbf,0x1f,0xb4,0x3, +0x22,0x74,0x1, 0x80,0x1b,0x12,0xbf,0x1f,0xb4,0x2, 0x18,0x7e,0x73,0x63,0xfe,0xa, +0x27,0x7e,0x37,0x64,0x7, 0x12,0xbf,0x41,0xbe,0x35,0x28,0x28,0x2, 0xd2,0x0, 0xe4, +0x12,0xbf,0x11,0x7e,0xa1,0x40,0x74,0x64,0xa4,0x7a,0x55,0x38,0xbe,0x54,0x2, 0x80, +0x28,0xd, 0x7e,0xb3,0x62,0xde,0x70,0x7, 0x7e,0x34,0x2, 0x80,0x7a,0x35,0x38,0x7e, +0x35,0x38,0xbe,0x35,0x28,0x50,0xc, 0x7e,0x37,0x63,0xe1,0xbe,0x34,0x0, 0x2, 0x28, +0x2, 0xd2,0x0, 0x20,0x0, 0x2, 0xa1,0x56,0xe4,0x12,0xbf,0x11,0x12,0xbf,0x84,0x70, +0x8, 0x74,0x3, 0x19,0xb3,0x6e,0xd7,0x80,0x25,0x74,0x1, 0x19,0xb3,0x6e,0xd7,0x75, +0x27,0x0, 0x80,0x15,0x12,0xb3,0xa1,0x9, 0x53,0x6e,0x81,0xbc,0x5e,0x78,0x8, 0x74, +0xff,0x19,0xb3,0x6e,0x81,0x80,0x7, 0x5, 0x27,0x12,0xb3,0x6e,0x38,0xe6,0x7e,0xa0, +0x3, 0x7e,0x70,0x9, 0xac,0x7c,0x19,0xa3,0x6e,0xd8,0xe5,0x41,0xbe,0xb0,0x0, 0x28, +0x35,0x15,0x41,0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x34,0x6d,0xc9,0x7e,0x14,0x63,0x6d, +0x74,0x9, 0x12,0x23,0x44,0x7e,0x71,0x41,0x74,0x9, 0xac,0x7b,0x2e,0x34,0x6d,0xc9, +0x12,0xa7,0xdf,0x12,0xbf,0xe4,0x7e,0x31,0x41,0x74,0x9, 0xac,0x3b,0x2e,0x14,0x6d, +0xc9,0x12,0x23,0x44,0x1b,0xf0,0xa, 0x3c,0x9, 0xb3,0x62,0xca,0xb4,0x5, 0x3d,0x75, +0x27,0x0, 0x80,0x19,0x7e,0x34,0x0, 0x17,0xca,0x39,0x7e,0xa1,0x27,0x12,0xbf,0x69, +0x7f,0x10,0x2e,0x34,0x0, 0x17,0x12,0x24,0x13,0x1b,0xfd,0x5, 0x27,0xe5,0x27,0xbe, +0xb0,0x4, 0x40,0xe0,0x7e,0x34,0x0, 0x17,0xca,0x39,0x7e,0x18,0x63,0xd0,0x7e,0xd, +0x34,0x2e,0x14,0x0, 0x5c,0x12,0x24,0x13,0x1b,0xfd,0x80,0x4f,0x7e,0x34,0x0, 0x17, +0xca,0x39,0x12,0xbf,0x18,0x12,0xbf,0x69,0x7e,0x18,0x63,0xd0,0x12,0x24,0x13,0x1b, +0xfd,0xa, 0x3c,0x2e,0x34,0x62,0xca,0x12,0xbf,0xec,0x80,0x2f,0xb, 0xd0,0x12,0x94, +0xbd,0x28,0x3, 0x2, 0xb7,0x9a,0x80,0x23,0x12,0xbf,0x8e,0x6d,0x22,0x74,0x2, 0xac, +0xbe,0x59,0x25,0x63,0x7, 0x59,0x25,0x63,0x1b,0x7e,0xa0,0xff,0x7e,0x50,0x9, 0xac, +0x5e,0x19,0xa2,0x5d,0x9c,0x74,0x1, 0x19,0xb3,0x63,0x31,0xb, 0xf0,0xe5,0x41,0xbc, +0xbf,0x28,0x3, 0x2, 0xb7,0x3f,0x12,0x90,0xc9,0xca,0x59,0x7e,0x18,0x6d,0xc9,0x7e, +0x8, 0x63,0x76,0x12,0x24,0x13,0x1b,0xfd,0x6c,0xff,0xc1,0x94,0x74,0x9, 0xac,0xbf, +0x9, 0xe5,0x6d,0xcd,0xa, 0x3e,0x9, 0x73,0x62,0xd4,0xbe,0x70,0x0, 0x28,0x73,0x6c, +0xdd,0x80,0x6a,0xa, 0x4e,0x9, 0xa4,0x62,0xd4,0xbe,0xa0,0x1, 0x78,0x2e,0x7e,0x70, +0x9, 0xac,0x7d,0x9, 0xb3,0x5d,0x9c,0xbc,0xbe,0x78,0x50,0x49,0x33,0x5d,0x98,0x7e, +0x50,0x9, 0xac,0x5f,0x59,0x32,0x6d,0xc9,0x7e,0x70,0x9, 0xac,0x7d,0x49,0x33,0x5d, +0x9a,0x7e,0x50,0x9, 0xac,0x5f,0x59,0x32,0x6d,0xcb,0x80,0x36,0xbe,0xa0,0x2, 0x78, +0x2a,0x74,0x9, 0xac,0xbd,0x9, 0x75,0x5d,0xf6,0xbc,0x7e,0x78,0x1e,0x49,0x35,0x5d, +0xf2,0x74,0x9, 0xac,0xbf,0x59,0x35,0x6d,0xc9,0x74,0x9, 0xac,0xbd,0x49,0x35,0x5d, +0xf4,0x74,0x9, 0xac,0xbf,0x59,0x35,0x6d,0xcb,0x80,0x7, 0xb, 0xd0,0x12,0x94,0xbd, +0x38,0x91,0xb, 0xf0,0xe5,0x41,0xbc,0xbf,0x28,0x2, 0xc1,0xc, 0x12,0x90,0xc9,0xca, +0x59,0x7e,0x18,0x5d,0x98,0x7e,0x8, 0x5d,0xf2,0x12,0x24,0x13,0x1b,0xfd,0x12,0x90, +0xc9,0xca,0x59,0x7e,0x18,0x63,0x76,0x7e,0x8, 0x5d,0x98,0x12,0x24,0x13,0x1b,0xfd, +0x6c,0xff,0x80,0x38,0x7e,0x50,0x9, 0xac,0x5f,0x9, 0xe2,0x5d,0x9c,0x12,0xbf,0xf4, +0x28,0x28,0x12,0xbf,0x84,0xbe,0xb0,0x1, 0x68,0x3, 0xb4,0x3, 0x1d,0x12,0xbf,0x8e, +0x6d,0x11,0x74,0x2, 0xac,0xbe,0x59,0x15,0x63,0x7, 0x59,0x15,0x63,0x1b,0x74,0xff, +0x19,0xb2,0x5d,0x9c,0x74,0x1, 0x19,0xb3,0x63,0x31,0xb, 0xf0,0x12,0xbf,0xdc,0x38, +0xc3,0xe5,0x41,0x7a,0xb3,0x6f,0x31,0xe4,0x7a,0xb3,0x5c,0xc4,0xda,0x3b,0x22,0x74, +0x2, 0xa, 0x3c,0x19,0xb3,0x62,0xd4,0x22,0xa, 0x3c,0x9, 0xa3,0x62,0xca,0x22,0xa, +0x3c,0x9, 0xb3,0x62,0xd4,0x22,0x7e,0x37,0x63,0xdd,0x7e,0x27,0x63,0xdf,0x22,0x74, +0x17,0xa4,0x7e,0x1d,0x34,0x2d,0x35,0x22,0x7e,0x70,0x9, 0xac,0x7f,0x2e,0x35,0x2c, +0x22,0x8d,0x32,0x7d,0x23,0x1e,0x24,0xe5,0x40,0xa, 0x3b,0xad,0x32,0x7a,0x35,0x30, +0x22,0x7e,0x34,0x0, 0x17,0xe4,0x2, 0x24,0x38,0x7e,0x73,0x63,0xd2,0xbe,0x70,0xa, +0x22,0x7e,0x34,0x0, 0x64,0x7a,0x35,0x3e,0x22,0x74,0x17,0xa4,0x7e,0xd, 0x34,0x2d, +0x15,0x22,0x7e,0x37,0x64,0x9, 0xbe,0x34,0x0, 0x1e,0x22,0x7e,0x27,0x63,0xd9,0xbe, +0x24,0x0, 0x14,0x22,0x7e,0x70,0x9, 0xac,0x7e,0x9, 0xb3,0x6e,0xd7,0x22,0xe4,0xa, +0x3e,0x19,0xb3,0x62,0xca,0x19,0xb3,0x62,0xd4,0x22,0xca,0x3b,0xbd,0x13,0x50,0x8, +0x7d,0x73,0x9d,0x71,0x6d,0x66,0x80,0x6, 0x7d,0x71,0x9d,0x73,0x6d,0x66,0xbd,0x2, +0x50,0x8, 0x7d,0x92,0x9d,0x90,0x6d,0x88,0x80,0x6, 0x7d,0x90,0x9d,0x92,0x6d,0x88, +0x7f,0x13,0x7f,0x3, 0x12,0x22,0xa3,0x7f,0x31,0x7f,0x14,0x7f,0x4, 0x12,0x22,0xa3, +0x7f,0x41,0x7f,0x13,0x2f,0x14,0x12,0xc7,0x59,0xda,0x3b,0x22,0x90,0x21,0x51,0xe4, +0x93,0xbc,0xbf,0x22,0x12,0x23,0x44,0x7e,0x34,0x63,0x6d,0x22,0x7e,0x39,0xb0,0x4, +0x7a,0x39,0xb0,0x22,0x90,0x21,0x51,0xe4,0x93,0xbc,0xbe,0x22,0x7e,0x8, 0x59,0xd4, +0x7e,0x34,0x0, 0xa, 0x74,0x3, 0x12,0x24,0x38,0x7e,0x8, 0x5a,0x38,0x7e,0x34,0x0, +0xa, 0xe4,0x2, 0x24,0x38,0x7e,0xa3,0x6f,0x32,0xbe,0xa0,0x0, 0x38,0x23,0xbe,0xa3, +0x6f,0x31,0x50,0x18,0x7e,0xb3,0x6f,0x3b,0xbe,0xb3,0x5c,0xdb,0x28,0x13,0x7e,0xb3, +0x5c,0xdb,0x4, 0x7a,0xb3,0x5c,0xdb,0x7a,0xa3,0x6f,0x31,0x22,0xe4,0x7a,0xb3,0x5c, +0xdb,0x22,0x7e,0x73,0x6f,0x32,0xbe,0x73,0x6f,0x31,0x78,0x7d,0x7e,0xb3,0x6f,0x31, +0xb4,0x1, 0x76,0x7e,0xb3,0x5d,0x91,0xbe,0xb0,0x2, 0x38,0x13,0x4, 0x7a,0xb3,0x5d, +0x91,0x7e,0x37,0x6d,0xc9,0x7a,0x37,0x5d,0x94,0x7e,0x37,0x6d,0xcb,0x80,0x69,0x7e, +0x37,0x5d,0x92,0xbe,0x34,0x6, 0xa4,0x50,0x4e,0x7e,0x27,0x6d,0xc9,0x7d,0x12,0x9e, +0x17,0x5d,0x94,0xbe,0x14,0x0, 0x0, 0x8, 0x8, 0x7d,0x32,0x9e,0x37,0x5d,0x94,0x80, +0x4, 0x6d,0x33,0x9d,0x31,0x2e,0x37,0x5d,0x92,0x7a,0x37,0x5d,0x92,0x7e,0x37,0x6d, +0xcb,0x7d,0x3, 0x9e,0x7, 0x5d,0x96,0xbe,0x4, 0x0, 0x0, 0x8, 0x8, 0x7d,0x13,0x9e, +0x17,0x5d,0x96,0x80,0x4, 0x6d,0x11,0x9d,0x10,0x2e,0x17,0x5d,0x92,0x7a,0x17,0x5d, +0x92,0x7a,0x27,0x5d,0x94,0x80,0x11,0xd3,0x22,0xe4,0x7a,0xb3,0x5d,0x91,0x6d,0x33, +0x7a,0x37,0x5d,0x92,0x7a,0x37,0x5d,0x94,0x7a,0x37,0x5d,0x96,0xc3,0x22,0xca,0x79, +0x7e,0xb3,0x6f,0x31,0x7e,0x18,0x6e,0xd7,0x70,0x11,0x12,0xbf,0xfc,0x7e,0x8, 0x63, +0x63,0x7e,0x34,0x0, 0xa, 0xe4,0x12,0x24,0x38,0x41,0xdf,0x6c,0xaa,0x41,0xd8,0x7e, +0xf0,0x9, 0xac,0xfa,0x9, 0x37,0x6e,0x27,0xc2,0x0, 0xc2,0x1, 0x49,0xe7,0x6e,0x23, +0x4d,0xee,0x68,0x11,0x7e,0xd4,0x21,0xde,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0xf0,0x1b, +0xf4,0xbd,0xef,0x78,0x2, 0xd2,0x0, 0x49,0xf7,0x6e,0x25,0x4d,0xff,0x68,0xd, 0x7e, +0xd4,0x21,0xec,0x12,0xc2,0xf6,0x1b,0x4, 0xbd,0xf0,0x78,0x2, 0xd2,0x1, 0xbe,0x30, +0xff,0x78,0x2, 0x41,0xd6,0x7e,0x10,0x9, 0xac,0x13,0x7f,0x61,0x2d,0xd0,0x7e,0x6b, +0xb0,0xb4,0x2, 0x2, 0x80,0x2, 0x41,0xa9,0x7e,0x10,0x4, 0xac,0x13,0x49,0xd0,0x63, +0x3b,0x7d,0xce,0x9d,0xcd,0xbe,0xc4,0x0, 0x0, 0x8, 0x6, 0x7d,0x4e,0x9d,0x4d,0x80, +0x4, 0x6d,0x44,0x9d,0x4c,0x49,0xb0,0x63,0x3d,0x7d,0xcf,0x9d,0xcb,0xbe,0xc4,0x0, +0x0, 0x8, 0x6, 0x7d,0xf, 0x9d,0xb, 0x80,0x4, 0x6d,0x0, 0x9d,0xc, 0x7e,0x23,0x6f, +0x31,0xbe,0x20,0x8, 0x40,0x8, 0x74,0xf, 0xa, 0xca,0x19,0xbc,0x59,0xd4,0xa, 0xca, +0x9, 0xbc,0x63,0x63,0x70,0xe, 0x7d,0xc0,0x2d,0xc4,0xbe,0xc4,0x0, 0x4, 0x50,0x4, +0x6d,0x0, 0x7d,0x40,0xa, 0xca,0x9, 0x2c,0x59,0xd4,0xa, 0xc2,0xbd,0xc4,0x28,0x52, +0xbd,0xc0,0x28,0x4e,0x20,0x0, 0x3, 0x12,0xc2,0xec,0x20,0x1, 0x12,0x7e,0xf0,0x4, +0xac,0xf3,0x49,0xb7,0x63,0x3d,0x7e,0xf0,0x9, 0xac,0xfa,0x59,0xb7,0x6e,0x25,0xa, +0xba,0x2e,0xb4,0x5a,0x38,0x7e,0xb9,0xb0,0x4, 0x7a,0xb9,0xb0,0xa, 0xba,0x9, 0xbb, +0x5a,0x38,0xbe,0xb0,0x32,0x50,0x2, 0x41,0xd6,0xa, 0xba,0x9, 0xbb,0x59,0xd4,0xbe, +0xb0,0x8, 0x40,0x2, 0x41,0xd6,0xa, 0xba,0x2e,0xb4,0x59,0xd4,0x4, 0x7a,0xb9,0xb0, +0x41,0xd6,0xbd,0xc4,0x28,0x56,0xbd,0xc0,0x28,0x52,0x20,0x0, 0x4f,0x20,0x1, 0x4c, +0x7e,0xb3,0x78,0xc9,0x70,0x46,0x12,0xc2,0xec,0x7e,0xf0,0x4, 0xac,0xf3,0x49,0xd7, +0x63,0x3d,0x7e,0xf0,0x9, 0xac,0xfa,0x59,0xd7,0x6e,0x25,0xa, 0xda,0x2e,0xd4,0x5a, +0x38,0x7e,0xd9,0xb0,0x4, 0x7a,0xd9,0xb0,0xa, 0xda,0x9, 0xbd,0x5a,0x38,0xbe,0xb0, +0x32,0x50,0x2, 0x41,0xd6,0xa, 0xda,0x9, 0xbd,0x59,0xd4,0xbe,0xb0,0x8, 0x50,0x76, +0xa, 0xda,0x2e,0xd4,0x59,0xd4,0x4, 0x7a,0xd9,0xb0,0x80,0x6a,0x74,0x1, 0xa, 0xda, +0x19,0xbd,0x63,0x63,0x12,0xc2,0xe2,0x7e,0xf0,0x4, 0xac,0xf3,0x59,0xf7,0x63,0x3d, +0xbe,0x20,0x8, 0x40,0xa, 0x74,0x1, 0xa, 0xda,0x19,0xbd,0x59,0xd4,0x80,0x11,0xbe, +0x20,0x1, 0x28,0xc, 0xa, 0xda,0x2e,0xd4,0x59,0xd4,0x7c,0xb2,0x14,0x7a,0xd9,0xb0, +0xe4,0xa, 0xda,0x19,0xbd,0x5a,0x38,0x80,0x2d,0x7e,0xf0,0x9, 0xac,0xf3,0x7f,0x61, +0x2d,0xd7,0x7e,0x6b,0xb0,0x70,0x9, 0x12,0xc2,0xe2,0x59,0xf7,0x63,0x3d,0x80,0x16, +0x7e,0xf0,0x9, 0xac,0xf3,0x7f,0x71,0x2d,0xf7,0x7e,0x7b,0xb0,0xb4,0x1, 0x7, 0xe4, +0xa, 0xfa,0x19,0xbf,0x63,0x63,0xb, 0xa0,0x12,0x45,0x1f,0x28,0x2, 0x1, 0xff,0xda, +0x79,0x22,0x7e,0xf0,0x4, 0xac,0xf3,0x59,0xe7,0x63,0x3b,0x22,0x7e,0xf0,0x9, 0xac, +0xfa,0x59,0xd7,0x6e,0x23,0x22,0x7e,0xc4,0x0, 0xff,0xb, 0x6a,0x0, 0x22,0x6c,0x77, +0x7e,0xa0,0xff,0x7e,0x78,0xff,0xff,0x6d,0x44,0x6c,0x66,0x7e,0x14,0x0, 0x1, 0x7c, +0xb6,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x7e,0xb3,0x75,0x30,0xa, 0x2b,0x5d,0x21, +0xbe,0x24,0x0, 0x0, 0x8, 0xd, 0x7e,0x24,0xff,0xff,0x7e,0x30,0x26,0xac,0x36,0x59, +0x21,0x75,0x39,0x12,0xc3,0x97,0x6d,0x0, 0xbf,0x7, 0x50,0x8, 0x7f,0x70,0x49,0x42, +0x75,0x3b,0x7c,0x76,0xb, 0x60,0xa5,0xbe,0x3, 0xc1,0x7e,0x63,0x75,0x33,0xbc,0x67, +0x68,0x42,0x12,0xc3,0x97,0x7d,0xc1,0x1e,0xc4,0x1e,0xc4,0x7e,0xd4,0x0, 0x3, 0xad, +0xdc,0x6d,0xcc,0xbf,0x76,0x50,0xb, 0x7e,0xd4,0x22,0x2c,0x12,0xc2,0xf6,0xbd,0x4, +0x38,0x20,0x1e,0x14,0x6d,0x0, 0xbf,0x70,0x50,0x1a,0x7e,0x50,0x26,0xac,0x56,0x49, +0x12,0x75,0x3b,0x7e,0xf4,0x22,0x2c,0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x20,0xbd,0x12, +0x28,0x2, 0x7c,0xa7,0x7c,0xba,0x22,0x7e,0x50,0x26,0xac,0x56,0x49,0x12,0x75,0x39, +0x22,0x7c,0xa7,0x7c,0x3b,0x7e,0xb3,0x77,0xf, 0xbe,0xb0,0x1, 0x78,0x2, 0x81,0x99, +0xe5,0x1e,0x70,0x2, 0x81,0x99,0x7e,0xb3,0x73,0xd3,0x70,0x2, 0x81,0x99,0x12,0xc6, +0xef,0x7c,0xb3,0x7c,0x7a,0x12,0xc4,0x9a,0x12,0xc7,0x26,0x7e,0xb3,0x75,0x36,0x1b, +0xb1,0x68,0x20,0x4, 0x68,0x2, 0x81,0x99,0x7e,0x73,0x75,0x33,0x7a,0x73,0x75,0x34, +0xe4,0x7a,0xb3,0x75,0x35,0x6c,0xaa,0x12,0xc7,0x3, 0xbe,0xa0,0x3, 0x78,0xf8,0x74, +0x2, 0x81,0x95,0x7e,0x43,0x75,0x34,0x7e,0x50,0x26,0xac,0x45,0x7d,0x32,0x2e,0x34, +0x75,0x38,0x12,0xbf,0xec,0x9, 0x72,0x75,0x38,0xbe,0x70,0x2, 0x50,0x2, 0x81,0x99, +0xe4,0x19,0xb2,0x75,0x38,0x49,0x12,0x75,0x39,0x2e,0x17,0x75,0xb1,0xbe,0x14,0x7f, +0xff,0x50,0xb, 0x7d,0x32,0x2e,0x34,0x75,0x39,0x1b,0x38,0x10,0x80,0x8, 0x7e,0x34, +0x7f,0xff,0x59,0x32,0x75,0x39,0x49,0x32,0x75,0x3b,0xbe,0x37,0x75,0xb1,0x50,0x8, +0x7e,0x37,0x75,0xb1,0x59,0x32,0x75,0x3b,0x7e,0x37,0x75,0xb5,0x12,0xc5,0x95,0xa, +0x4b,0x7e,0xa3,0x75,0x34,0x7e,0x50,0x26,0xac,0x5a,0x2e,0x24,0x75,0x3d,0xb, 0x28, +0x30,0x2d,0x34,0x1b,0x28,0x30,0xbe,0xa0,0x2, 0x50,0x5, 0x7c,0xba,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x75,0x34,0x12,0xc5,0xb6,0x38,0x1f,0x12,0xc2,0xfe,0xbe,0xb0,0xff, +0x68,0x12,0x30,0x19,0xf, 0x7e,0x73,0x75,0x33,0x12,0x37,0x76,0x12,0x3b,0xdc,0xe4, +0x7a,0xb3,0x75,0xa9,0xe4,0x7a,0xb3,0x75,0x36,0x22,0x6c,0x44,0xc2,0x1, 0x7e,0x47, +0x75,0xb5,0x7e,0x7, 0x75,0xb7,0x12,0x58,0x1, 0x40,0x4, 0xd2,0x1, 0x80,0x6, 0xa5, +0xbf,0x1, 0x2, 0xd2,0x1, 0x7e,0xb3,0x75,0x36,0x60,0x2, 0xa1,0x49,0x7e,0xb3,0x75, +0xbe,0x4, 0x7a,0xb3,0x75,0xbe,0x7d,0x34,0x12,0xc5,0x95,0xbe,0xb0,0x1, 0x40,0x8, +0x4e,0x40,0x4, 0xe4,0x7a,0xb3,0x75,0xbe,0xbe,0x44,0x0, 0x0, 0x28,0x10,0x7e,0x17, +0x75,0x31,0xbd,0x10,0x50,0x8, 0x4e,0x40,0x2, 0xe4,0x7a,0xb3,0x75,0xbe,0x7e,0x17, +0x75,0x31,0xbd,0x10,0x50,0x17,0x7e,0xb3,0x75,0xbd,0x4, 0x7a,0xb3,0x75,0xbd,0xbe, +0x4, 0xb, 0xb8,0x28,0x16,0x7e,0xb3,0x75,0xbd,0xb, 0xb2,0x80,0xa, 0x7e,0xb3,0x75, +0xbd,0xbe,0xb0,0x0, 0x28,0x5, 0x14,0x7a,0xb3,0x75,0xbd,0x7e,0x53,0x75,0xbd,0xbe, +0x50,0xa, 0x40,0x11,0xe4,0x7a,0xb3,0x75,0xbd,0x7a,0x43,0x75,0xa9,0x74,0x1, 0x7a, +0xb3,0x75,0x36,0x80,0x14,0x7e,0x73,0x75,0xbe,0xbe,0x70,0x20,0x40,0xb, 0x74,0x20, +0x7a,0xb3,0x75,0xbe,0xe4,0x7a,0xb3,0x75,0xa9,0x7d,0x34,0x7d,0x20,0x2, 0xc5,0x50, +0x7d,0x2, 0x12,0xc5,0x95,0x7c,0x7b,0xbe,0x70,0x1, 0x40,0x1d,0x7e,0x34,0x22,0x32, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x0, 0xa, 0xad,0x32,0x1e,0x34,0xbd, +0x30,0x38,0x6, 0x74,0x1, 0x7a,0xb3,0x75,0xbc,0x7e,0xb3,0x75,0xbc,0xbe,0xb0,0x0, +0x28,0xa, 0x14,0x7a,0xb3,0x75,0xbc,0xe4,0x7a,0xb3,0x25,0xae,0x30,0x18,0x3, 0xd2, +0x1a,0x22,0xc2,0x1a,0x22,0x6c,0xaa,0x6c,0x55,0x7e,0x14,0x0, 0x1, 0x7c,0xb5,0x60, +0x5, 0x3e,0x14,0x14,0x78,0xfb,0x5d,0x13,0x68,0x2, 0xb, 0xa0,0xb, 0x50,0xbe,0x50, +0x10,0x40,0xe6,0x7c,0xba,0x22,0x90,0x22,0x34,0xe4,0x93,0xbe,0xb3,0x75,0x35,0x22, +0x12,0xc6,0x33,0xc2,0x18,0x7e,0xb3,0x75,0x36,0x60,0x67,0x12,0x57,0xfd,0x40,0x10, +0x7e,0xa3,0x75,0x34,0x74,0x26,0xa4,0x9, 0x75,0x75,0x38,0xbe,0x70,0x1, 0x40,0x52, +0x7e,0x73,0x75,0x34,0xb, 0x70,0xbe,0x70,0x3, 0x40,0x2, 0x6c,0x77,0x7e,0x14,0x0, +0x1, 0x7c,0xb7,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x7e,0x63,0x75,0x30,0xa, 0x26, +0x5d,0x21,0xbe,0x24,0x0, 0x0, 0x8, 0x9, 0xb, 0x70,0xbe,0x70,0x3, 0x40,0x2, 0x6c, +0x77,0x7e,0x63,0x75,0x33,0xbc,0x67,0x78,0x9, 0x7e,0xb3,0x75,0x35,0x4, 0x7a,0xb3, +0x75,0x35,0x12,0xc5,0xb6,0x7e,0xb3,0x78,0x97,0x38,0x4, 0x7c,0x76,0x80,0x0, 0x2, +0x36,0xc3,0x22,0x7e,0x27,0x75,0xb7,0x7e,0x37,0x75,0x31,0xbd,0x32,0x50,0x20,0x7e, +0xa3,0x75,0x34,0x12,0xc6,0x9c,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xb9,0x4e, +0xb3,0x75,0x30,0x7a,0xb3,0x75,0x30,0x74,0x5, 0xa, 0x3a,0x19,0xb3,0x75,0xaa,0x6c, +0xaa,0xa, 0x3a,0x9, 0xb3,0x75,0xaa,0xbe,0xb0,0x0, 0x28,0xa, 0xa, 0x4a,0x2e,0x44, +0x75,0xaa,0x14,0x7a,0x49,0xb0,0xa, 0x3a,0x9, 0xb3,0x75,0xaa,0x70,0x16,0x12,0xc6, +0x9c,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xb9,0x64,0xff,0x5e,0xb3,0x75,0x30, +0x7a,0xb3,0x75,0x30,0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xc6,0x22,0x7e,0x44,0x0, 0x1, +0x7c,0xba,0x22,0x7c,0xab,0x6c,0x77,0x7e,0x63,0x75,0xbb,0xbc,0x67,0x78,0x4, 0x6c, +0x66,0x80,0x27,0x12,0xc6,0x9c,0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7e,0x63,0x73, +0xd4,0xa, 0x26,0x5d,0x24,0x68,0x6, 0x7e,0x60,0x1, 0x12,0xc6,0xe5,0x7e,0x63,0x73, +0xd5,0xa, 0x26,0x5d,0x24,0x68,0x6, 0x7e,0x60,0x1, 0x12,0xc6,0xe5,0xb, 0x70,0xbe, +0x70,0x3, 0x40,0xc3,0x22,0x7e,0x50,0x26,0xac,0x57,0x19,0x62,0x75,0x44,0x22,0x7e, +0x34,0x22,0x32,0x12,0x2a,0xa9,0x7a,0x37,0x75,0x31,0x7e,0x34,0x5, 0xdc,0x7a,0x37, +0x75,0xad,0x22,0x6d,0x33,0x7e,0x90,0x26,0xac,0x9a,0x59,0x34,0x75,0x39,0x59,0x34, +0x75,0x3b,0x59,0x34,0x75,0x3d,0x59,0x34,0x75,0x3f,0x59,0x34,0x75,0x41,0xe4,0x19, +0xb4,0x75,0x38,0xb, 0xa0,0x22,0xc2,0x17,0xd2,0x19,0x7e,0x37,0x75,0xad,0xbe,0x37, +0x75,0xb7,0x50,0x2, 0xd2,0x17,0x30,0x24,0x4, 0x74,0x64,0x80,0x7, 0x7e,0xb3,0x75, +0xaf,0x60,0x5, 0x14,0x7a,0xb3,0x75,0xaf,0x30,0x17,0x5, 0xe4,0x7a,0xb3,0x75,0xaf, +0x7e,0xb3,0x75,0xaf,0x60,0x2, 0xc2,0x19,0x22,0x7f,0x61,0xbe,0x68,0x0, 0x6, 0x50, +0x15,0xbe,0x68,0x0, 0x2, 0x50,0x3, 0x7f,0x16,0x22,0x7f,0x16,0x1e,0x34,0x1e,0x24, +0x50,0x3, 0x4e,0x60,0x80,0x22,0x7f,0x76,0xe4,0x80,0xe, 0x7f,0x17,0x1e,0x34,0xe, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x4, 0xbe,0x78,0x0, 0x1, 0x18,0xec,0x1e, +0xb0,0x60,0x5, 0x2f,0x77,0x14,0x78,0xfb,0x7f,0x17,0x2f,0x17,0x2f,0x17,0x1e,0x34, +0xe, 0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x7f,0x57,0x7f,0x16,0x7f,0x7, 0x12, +0x22,0xbf,0x2f,0x17,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x7f,0x71,0x7d, +0x2b,0x7d,0x3f,0x9d,0x32,0x12,0x24,0x5a,0xbe,0x34,0x0, 0x1, 0x18,0xdb,0x7f,0x17, +0x22,0x6c,0xaa,0x6c,0x33,0x80,0x4e,0x7e,0x90,0x4, 0xac,0x93,0x7e,0x10,0x28,0xac, +0x1a,0x7d,0xe0,0x2d,0xe4,0x49,0xe, 0x5a,0x6b,0x7d,0xf3,0x9d,0xf0,0xbe,0xf4,0x0, +0x0, 0x8, 0x6, 0x7d,0x43,0x9d,0x40,0x80,0x4, 0x6d,0x44,0x9d,0x4f,0x49,0xde,0x5a, +0x6d,0x7d,0xf2,0x9d,0xfd,0xbe,0xf4,0x0, 0x0, 0x8, 0x6, 0x7d,0x2, 0x9d,0xd, 0x80, +0x4, 0x6d,0x0, 0x9d,0xf, 0xbe,0x44,0x0, 0x50,0x50,0x8, 0xbe,0x4, 0x0, 0x50,0x50, +0x2, 0xd3,0x22,0xb, 0x30,0xa, 0xfa,0x9, 0x2f,0x5a,0x5c,0xbc,0x23,0x38,0xa8,0xb, +0xa0,0xbe,0xa0,0xf, 0x40,0x9d,0xc3,0x22,0x12,0x73,0x78,0x74,0x2, 0xac,0x7b,0x7e, +0x8, 0x5c,0xc5,0xe4,0x12,0x24,0x38,0x90,0x21,0x51,0x93,0x7c,0x7b,0x74,0x2, 0xac, +0x7b,0x7e,0x8, 0x5a,0x44,0xe4,0x2, 0x24,0x38,0x7e,0xb3,0x5c,0xc4,0xbe,0xb0,0xfa, +0x50,0x5, 0x4, 0x7a,0xb3,0x5c,0xc4,0x22,0x74,0x1, 0x7a,0xb3,0x6d,0xc8,0x7e,0xb3, +0x6d,0xb4,0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x12,0x7a,0xd, 0x28,0x5, 0xe4, +0x7a,0xb3,0x6d,0xc8,0x7e,0xb3,0x25,0xae,0x70,0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x7e, +0xb3,0x78,0xd6,0xb4,0x1, 0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x7e,0x34,0x22,0x32,0x12, +0x2a,0xa9,0xbe,0x37,0x75,0xb7,0x50,0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x7e,0xb3,0x77, +0xf, 0x70,0xa, 0x12,0x6f,0xb7,0x28,0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x7e,0xb3,0x76, +0xe4,0xb4,0x1, 0x17,0x7e,0x73,0x78,0xea,0xbe,0x70,0x3c,0x50,0xe, 0xbe,0x70,0x0, +0x28,0x9, 0xe5,0x1e,0x60,0x5, 0xe4,0x7a,0xb3,0x6d,0xc8,0x22,0x12,0xca,0x42,0x12, +0xca,0x4c,0x12,0xc8,0xef,0x2, 0xc8,0xe8,0x74,0x1, 0x7a,0xb3,0x78,0xfc,0x22,0xca, +0x3b,0x7e,0xf3,0x6f,0x65,0x7e,0xe3,0x6f,0x66,0x7e,0xd3,0x6f,0x67,0x6d,0x88,0x6c, +0xcc,0x80,0x15,0x7d,0x18,0x3e,0x14,0x2e,0x14,0x4, 0x0, 0x6d,0x0, 0x7c,0xbd,0x12, +0xc9,0x1f,0xa, 0x9f,0x2d,0x89,0xb, 0xc0,0xbc,0xec,0x38,0xe7,0xda,0x3b,0x22,0xca, +0x79,0x7c,0xfb,0x7f,0x70,0xc2,0x0, 0x75,0x27,0x0, 0x9f,0x55,0x6d,0x11,0x7d,0xd1, +0x7d,0xc1,0x7d,0x91,0x7e,0x4, 0x7f,0xff,0x6c,0xee,0x80,0x26,0x74,0x2, 0xac,0xbe, +0x7f,0x17,0x2d,0x35,0xb, 0x1a,0x30,0x12,0x24,0x5a,0x7d,0xc3,0xbd,0xdc,0x58,0x2, +0x7d,0xdc,0xbd,0xc, 0x8, 0x2, 0x7d,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x2f,0x51, +0xb, 0xe0,0xbc,0xfe,0x38,0xd6,0xbe,0xd4,0x0, 0x1e,0x58,0xa, 0x7e,0xb3,0x6d,0xa9, +0x70,0x4, 0x6d,0x33,0x41,0x35,0xbe,0xd4,0x4, 0xb0,0x8, 0x2, 0xd2,0x0, 0xbe,0xd4, +0x4, 0xb0,0x8, 0x11,0x7e,0xd4,0x0, 0xa0,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0x38,0x7e, +0xd4,0x2, 0x58,0x80,0x32,0xbe,0xd4,0x3, 0x20,0x8, 0x11,0x7e,0xd4,0x0, 0x96,0x7e, +0xb3,0x77,0xf, 0xb4,0x1, 0x21,0x7e,0xd4,0x2, 0x26,0x80,0x1b,0xbe,0xd4,0x0, 0x0, +0x8, 0x11,0x7e,0xd4,0x0, 0x8c,0x7e,0xb3,0x77,0xf, 0xb4,0x1, 0xa, 0x7e,0xd4,0x1, +0xc2,0x80,0x4, 0x6d,0x33,0x80,0x6e,0xbd,0xd, 0x8, 0x5, 0x30,0x0, 0x2, 0x7d,0xd0, +0xa, 0x1f,0x12,0xca,0x38,0x9f,0x55,0x7f,0x27,0x6c,0xee,0x80,0x1c,0xb, 0x2a,0x90, +0xb, 0x55,0x7d,0x39,0x12,0x24,0x5a,0x7d,0xc3,0xbd,0x1c,0x8, 0xa, 0x7d,0x39,0x1a, +0x26,0x1a,0x24,0x2f,0x51,0x5, 0x27,0xb, 0xe0,0xbc,0xfe,0x38,0xe0,0x6d,0x11,0xe5, +0x27,0xbe,0xb0,0x0, 0x28,0x7, 0xe5,0x27,0xa, 0x1b,0x12,0xca,0x38,0xbd,0x1d,0x8, +0x4, 0x7d,0x1d,0x80,0xa, 0x6d,0x0, 0x9d,0xd, 0xbd,0x1, 0x8, 0x2, 0x7d,0x10,0x6c, +0xee,0x80,0xc, 0xb, 0x7a,0x0, 0x9d,0x1, 0x1b,0x7a,0x0, 0xb, 0xf5,0xb, 0xe0,0xbc, +0xfe,0x38,0xf0,0x7d,0x31,0xda,0x79,0x22,0x6d,0x0, 0x7f,0x15,0x12,0x23,0x10,0x7d, +0x13,0x22,0xe4,0x7a,0xb3,0x6d,0xc0,0x7a,0xb3,0x6d,0xc1,0x22,0x7e,0x8, 0x8, 0xc, +0x7e,0x1f,0x24,0x68,0x12,0x5a,0x55,0x7e,0x37,0x73,0xd6,0x7e,0x50,0x4, 0x7d,0x3, +0x3e,0x4, 0x7e,0x2f,0x24,0x68,0x2d,0x50,0xb, 0x2a,0x10,0x59,0x10,0x8, 0xc, 0xb, +0x34,0x1b,0x50,0x78,0xe9,0x22,0xca,0x79,0x7e,0x73,0x6f,0x31,0x4c,0x77,0x68,0x5, +0xbe,0x70,0x1, 0x28,0xb, 0x12,0xcc,0x87,0x74,0x1e,0x7a,0xb3,0x78,0x85,0x81,0x7c, +0x7e,0xb3,0x78,0x69,0x70,0x4a,0x7e,0xb3,0x6f,0x32,0x70,0x44,0xa5,0xbf,0x1, 0x40, +0x7e,0x57,0x6e,0x25,0xbe,0x54,0x5, 0x50,0x28,0x36,0xbe,0x54,0x5, 0xa0,0x50,0x30, +0x7e,0xc7,0x6e,0x23,0xbe,0xc4,0x0, 0x50,0x28,0x26,0xbe,0xc4,0x2, 0x76,0x50,0x20, +0x7a,0xc7,0x78,0x7c,0x7a,0x57,0x78,0x7e,0x7e,0xc7,0x78,0x7c,0x7a,0xc7,0x78,0x6a, +0x7a,0x57,0x78,0x6c,0x74,0x1, 0x7a,0xb3,0x78,0x69,0x74,0x1e,0x7a,0xb3,0x78,0x85, +0x7e,0xa3,0x78,0x69,0xbe,0xa0,0x1, 0x68,0x2, 0x61,0x7a,0x7e,0xb3,0x6f,0x32,0xb4, +0x1, 0x2, 0x80,0x2, 0x61,0x7a,0xa5,0xbf,0x1, 0x2, 0x80,0x2, 0x61,0x7a,0x12,0xcc, +0x90,0x28,0x77,0xbe,0xc4,0x5, 0xa0,0x50,0x71,0x7e,0xf7,0x6e,0x23,0x7a,0xf7,0x78, +0x7c,0x7a,0xc7,0x78,0x7e,0x7e,0xf7,0x78,0x7c,0x9e,0xf7,0x78,0x6a,0x7d,0x4c,0x9e, +0x47,0x78,0x6c,0xbe,0xf4,0x0, 0x0, 0x8, 0x6, 0x7d,0xcf,0x7d,0xdc,0x80,0x4, 0x6d, +0xdd,0x9d,0xdf,0xbe,0x44,0x0, 0x0, 0x8, 0x6, 0x7d,0xc4,0x7d,0xec,0x80,0x4, 0x6d, +0xee,0x9d,0xe4,0xbe,0xd4,0x0, 0x64,0x58,0x2e,0xbe,0xe4,0x0, 0x64,0x58,0x28,0x7d, +0xce,0x2d,0xcd,0xbe,0xc4,0x0, 0x96,0x58,0x1e,0x7d,0xcf,0xe, 0xc4,0xe, 0xc4,0x2e, +0xc7,0x78,0x6a,0x7a,0xc7,0x6e,0x23,0x7d,0xc4,0xe, 0xc4,0xe, 0xc4,0x2e,0xc7,0x78, +0x6c,0x7a,0xc7,0x6e,0x25,0x80,0x3, 0x75,0x6c,0x1, 0xe5,0x6c,0xbe,0xb0,0x1, 0x68, +0xe, 0x12,0xcc,0x90,0x28,0x2, 0x81,0x6c,0xbe,0xa0,0x1, 0x68,0x2, 0x81,0x6c,0x75, +0x6c,0x1, 0xbe,0xa0,0x1, 0x78,0x6, 0x74,0x1d,0x7a,0xb3,0x78,0x85,0xe4,0x7a,0xb3, +0x78,0x69,0x7e,0x37,0x6e,0x23,0x7d,0xf3,0x9e,0xf7,0x78,0x73,0x7e,0x47,0x6e,0x25, +0x9e,0x47,0x78,0x75,0xbe,0xf4,0x0, 0x0, 0x8, 0x6, 0x7d,0x2f,0x7d,0xd2,0x80,0x4, +0x6d,0xdd,0x9d,0xdf,0xbe,0x44,0x0, 0x0, 0x8, 0x6, 0x7d,0x24,0x7d,0xe2,0x80,0x4, +0x6d,0xee,0x9d,0xe4,0x7e,0xf3,0x78,0x85,0x7c,0x1f,0x2e,0x10,0x4e,0xa5,0xe7,0x7c, +0xeb,0xa, 0x9e,0x6d,0x88,0x7e,0x8, 0x0, 0x40,0x9f,0x4, 0x6d,0x22,0x12,0x22,0xa3, +0x7f,0x51,0x7e,0x37,0x78,0x73,0x6d,0x22,0x7f,0x4, 0x12,0xcc,0x7f,0x1e,0x34,0x1e, +0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x53,0x7a,0x57,0x6e,0x23,0xa, +0x3e,0x6d,0x22,0x7e,0x8, 0x0, 0x40,0x9f,0x1, 0x7e,0x37,0x6e,0x25,0x12,0x22,0xa3, +0x7f,0x51,0xa, 0x1e,0x6d,0x0, 0x7e,0x37,0x78,0x75,0x6d,0x22,0x12,0xcc,0x7f,0x1e, +0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78,0xf4,0x7d,0x53,0x7a,0x57,0x6e, +0x25,0xbe,0xf0,0x0, 0x28,0x1f,0xbe,0xd4,0x0, 0x2, 0x18,0x10,0xbe,0xe4,0x0, 0x2, +0x18,0xa, 0x7d,0x5e,0x2d,0x5d,0xbe,0x54,0x0, 0x4, 0x8, 0x9, 0x7c,0xbf,0x14,0x7a, +0xb3,0x78,0x85,0x80,0x7, 0x4c,0xff,0x78,0x3, 0x12,0xcc,0x87,0x7e,0x57,0x6e,0x23, +0x7a,0x57,0x78,0x73,0x7e,0x57,0x6e,0x25,0x7a,0x57,0x78,0x75,0xda,0x79,0x22,0x12, +0x22,0xa3,0x2f,0x15,0x74,0x6, 0x22,0xe4,0x7a,0xb3,0x78,0x69,0x75,0x6c,0x0, 0x22, +0x7e,0xc7,0x6e,0x25,0xbe,0xc4,0x5, 0x50,0x22,0x6d,0x33,0x7a,0x37,0x78,0xdb,0xe4, +0x7a,0xb3,0x78,0xd9,0x7a,0xb3,0x78,0xda,0x7a,0xb3,0x78,0xd6,0x2, 0x6f,0xd0,0x7e, +0x63,0x6f,0x65,0x7e,0x73,0x6f,0x64,0xac,0x76,0x7d,0x13,0x1e,0x14,0x7e,0x27,0x6d, +0x97,0x2e,0x27,0x6d,0x95,0xbd,0x21,0x38,0x16,0x1e,0x34,0x1e,0x34,0x7d,0x23,0x2e, +0x24,0x0, 0x14,0xbe,0x27,0x6d,0x95,0x40,0x6, 0xbe,0x37,0x6d,0x97,0x50,0x2, 0xd3, +0x22,0xc3,0x22,0xe4,0x7a,0xb3,0x6d,0xb5,0x7a,0xb3,0x6d,0xb8,0x12,0xce,0x6, 0x7a, +0xb3,0x6d,0xb9,0x7a,0xb3,0x6d,0xba,0x7e,0x73,0x6d,0x94,0xbe,0x70,0x0, 0x28,0x2e, +0x12,0xce,0xf, 0x8, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xb5,0x7e,0x7, 0x6f,0x4a,0x7d, +0x30,0x12,0xcd,0xfa,0x8, 0x3, 0x12,0xcd,0xf3,0x7d,0x30,0x3e,0x34,0x3e,0x34,0x7d, +0x21,0x12,0xcd,0xfe,0x8, 0x8, 0xd2,0x2e,0x6d,0x33,0x7a,0x37,0x76,0xba,0x7e,0x37, +0x6d,0xa3,0xbe,0x34,0x1, 0xf4,0x8, 0x2d,0x30,0x2d,0x2a,0x30,0x2e,0x1b,0x12,0xcd, +0xf3,0x7e,0x37,0x76,0xba,0xb, 0x34,0x7a,0x37,0x76,0xba,0xbe,0x34,0x0, 0x5, 0x28, +0x8, 0xc2,0x2e,0x6d,0x33,0x7a,0x37,0x76,0xba,0x12,0xce,0x61,0xbe,0x34,0x0, 0x64, +0x28,0x3, 0x12,0xcd,0xf3,0x7e,0xa3,0x6d,0x94,0xbe,0xa0,0x0, 0x28,0x42,0x12,0xce, +0xf, 0x8, 0x1a,0x7e,0x73,0x25,0xaf,0xa5,0xbf,0x0, 0x8, 0x74,0x1, 0x7a,0xb3,0x6d, +0xb6,0x80,0xa, 0xa5,0xbf,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xb7,0x7e,0x37,0x6f, +0x4a,0x12,0xcd,0xfa,0x8, 0x1a,0x7e,0x73,0x25,0xaf,0xa5,0xbf,0x0, 0x8, 0x74,0x1, +0x7a,0xb3,0x6d,0xb9,0x80,0xa, 0xa5,0xbf,0x1, 0x6, 0x74,0x1, 0x7a,0xb3,0x6d,0xba, +0x7e,0xb3,0x6d,0xb5,0xbe,0xb0,0x1, 0x68,0x10,0x7e,0xb3,0x6d,0xb6,0xbe,0xb0,0x1, +0x68,0x7, 0x7e,0xb3,0x6d,0xb7,0xb4,0x1, 0x24,0xbe,0xa0,0x0, 0x28,0x1f,0xbe,0xa0, +0x3, 0x50,0x1a,0x7e,0xb3,0x6d,0x93,0xb4,0x1, 0x13,0x90,0x21,0xfa,0xe4,0x93,0xbe, +0xb3,0x6c,0x9, 0x68,0x8, 0xe4,0x7a,0xb3,0x6d,0xb5,0x12,0xce,0x6, 0xe4,0x7a,0xb3, +0x6d,0xbb,0x22,0x74,0x1, 0x7a,0xb3,0x6d,0xb8,0x22,0xad,0x31,0x7d,0x24,0x12,0x22, +0x71,0xbe,0x37,0x6d,0xa3,0x22,0x7a,0xb3,0x6d,0xb6,0x7a,0xb3,0x6d,0xb7,0x22,0x7e, +0x37,0x6f,0x44,0x7e,0x14,0x0, 0x6, 0xad,0x31,0x7e,0x44,0x0, 0x4, 0x7d,0x24,0x12, +0x22,0x71,0xbe,0x37,0x6d,0x9d,0x22,0x12,0x9f,0x9a,0x12,0xcc,0xe3,0x12,0xce,0x57, +0x2, 0xce,0x33,0x7e,0x27,0x73,0xd6,0x1e,0x24,0x1e,0x24,0xe4,0x7a,0xb3,0x6d,0xbf, +0x7e,0x37,0x6d,0x95,0xbd,0x32,0x38,0x8, 0x7e,0x37,0x6d,0x97,0xbd,0x32,0x28,0x6, +0x74,0x1, 0x7a,0xb3,0x6d,0xbf,0x22,0xe4,0x7a,0xb3,0x6d,0xbc,0x7a,0xb3,0x6d,0xbc, +0x22,0x6d,0x22,0x7d,0x32,0x80,0x12,0x7d,0x52,0x12,0x5b,0x26,0xb, 0xa, 0x10,0xbe, +0x14,0xff,0xb0,0x58,0x2, 0xb, 0x34,0xb, 0x24,0x7e,0x17,0x73,0xd6,0xbd,0x12,0x38, +0xe6,0x22,0x7e,0x37,0x6d,0x97,0x2e,0x37,0x6d,0x95,0xbe,0x37,0x6d,0xae,0x28,0x2, +0xd3,0x22,0xc3,0x22,0xca,0xd8,0xca,0x79,0x7d,0x43,0x7f,0x70,0x12,0x6f,0xb7,0x28, +0x33,0x6c,0xff,0x80,0x2a,0x74,0x2, 0xac,0xbf,0x9, 0xe5,0x6c,0x9, 0x9, 0xd5,0x6c, +0xa, 0x7c,0xbe,0x7c,0x7d,0x12,0x9b,0x6a,0x7d,0xd3,0x7f,0x7, 0x7c,0x7d,0x12,0xce, +0xda,0x50,0x7, 0xbd,0x4d,0x58,0x6, 0xd3,0x80,0xb, 0xd3,0x80,0x8, 0xb, 0xf0,0x12, +0x6f,0x11,0x38,0xd1,0xc3,0xda,0x79,0xda,0xd8,0x22,0x7c,0x67,0x7e,0xb, 0x70,0xbc, +0x7b,0x38,0x1a,0x29,0x70,0x0, 0x2, 0xbc,0x7b,0x28,0x12,0x29,0x70,0x0, 0x1, 0xbc, +0x76,0x38,0xa, 0x29,0x70,0x0, 0x3, 0xbc,0x76,0x28,0x2, 0xd3,0x22,0xc3,0x22,0xca, +0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x80,0x78,0x19,0x7e,0xe0,0xff,0x6c,0xff,0x12, +0xcf,0x5b,0xbc,0x7e,0x38,0x4, 0x7c,0xe7,0x7c,0xdf,0xb, 0xf0,0xbe,0xf0,0x3, 0x78, +0xee,0x80,0x1b,0xbe,0xd0,0x81,0x78,0x16,0x6c,0xee,0x6c,0xff,0x12,0xcf,0x5b,0xbc, +0x7e,0x40,0x4, 0x7c,0xe7,0x7c,0xdf,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xee,0xbe,0xd0, +0x3, 0x40,0x2, 0x6c,0xdd,0x7e,0x73,0x75,0x33,0xbc,0x7d,0x68,0x5, 0x7c,0xbd,0x12, +0x37,0x76,0x7a,0xd3,0x77,0x3b,0xda,0x79,0xda,0xd8,0x22,0x74,0x26,0xac,0xbf,0x9, +0x75,0x75,0x37,0x22,0x7c,0xab,0x7e,0x50,0xa, 0xac,0x57,0x9, 0x62,0x29,0x8c,0x7e, +0x50,0x27,0xac,0x57,0x49,0x2, 0x28,0xee,0xb, 0x4, 0x7e,0x50,0x8, 0xac,0x5a,0x49, +0x22,0x0, 0xe7,0x7a,0x27,0x75,0xb5,0x7e,0x50,0x8, 0xac,0x5a,0x49,0x22,0x0, 0xe5, +0x7a,0x27,0x75,0xb3,0x7e,0x50,0x8, 0xac,0x5a,0x9, 0xb2,0x0, 0xeb,0x7a,0xb3,0x75, +0xb9,0x7e,0x50,0x8, 0xac,0x5a,0x9, 0xb2,0x0, 0xec,0x7a,0xb3,0x75,0xba,0x74,0x8, +0xa4,0x49,0x15,0x0, 0xe9,0x7c,0xb6,0x60,0x5, 0x1e,0x4, 0x14,0x78,0xfb,0x8d,0x10, +0x7a,0x17,0x75,0xb7,0x74,0x27,0xac,0xb7,0x9, 0x75,0x28,0xe8,0x7a,0x73,0x75,0xb0, +0x22,0x7e,0xb3,0x75,0xa9,0x22,0x7c,0xab,0x6c,0x77,0x7e,0x50,0x26,0xac,0x57,0x9, +0x62,0x75,0x37,0xbc,0x6a,0x68,0x7, 0xb, 0x70,0xbe,0x70,0x3, 0x40,0xec,0xa5,0xbf, +0x3, 0x6, 0x7a,0xa3,0x75,0x37,0xd3,0x22,0xc3,0x22,0xca,0xf8,0x7c,0xab,0xc2,0x2, +0x12,0x3e,0xb8,0xac,0x67,0x9, 0xf3,0x75,0x37,0x7c,0xba,0x12,0x75,0x8c,0x6c,0xaa, +0x6c,0x77,0x7e,0x50,0x26,0xac,0x57,0x19,0xa2,0x75,0x43,0xb, 0x70,0xa5,0xbf,0x3, +0xf1,0x30,0x2, 0x5, 0x7c,0xbf,0x12,0x34,0x9, 0xd3,0xda,0xf8,0x22,0x7e,0x34,0x6b, +0x8b,0x1e,0x34,0x3e,0x34,0x7a,0x17,0x6b,0xcb,0x7a,0x37,0x6b,0xcf,0x7e,0x34,0x24, +0xbc,0x7a,0x37,0x6b,0xcd,0x7e,0x73,0x6f,0x64,0x7a,0x73,0x6b,0xc8,0x7e,0x73,0x6f, +0x65,0x7a,0x73,0x6b,0xc7,0x7e,0x37,0x6f,0x42,0x7a,0x37,0x6b,0xd1,0x7e,0x37,0x6f, +0x44,0x7a,0x37,0x6b,0xd3,0x7e,0x37,0x6f,0x4c,0x7a,0x37,0x6b,0xd5,0x7e,0x37,0x6f, +0x4e,0x7a,0x37,0x6b,0xd7,0x74,0x1, 0x7a,0xb3,0x6b,0xc9,0x7a,0xb3,0x6b,0xca,0x7e, +0x8, 0x6b,0xc7,0x7e,0x18,0x6b,0xd9,0x12,0x3, 0x1d,0x7e,0x37,0x6b,0xe5,0x7a,0x37, +0x6f,0x60,0x7e,0x27,0x6b,0xdf,0xbe,0x24,0x0, 0x0, 0x8, 0x6, 0x7e,0x7, 0x6b,0xdf, +0x80,0x6, 0x6d,0x0, 0x9e,0x7, 0x6b,0xdf,0x7e,0x37,0x6b,0xe3,0xbe,0x34,0x0, 0x0, +0x8, 0x6, 0x7e,0x17,0x6b,0xe3,0x80,0x6, 0x6d,0x11,0x9e,0x17,0x6b,0xe3,0xbd,0x10, +0x8, 0x12,0xbe,0x34,0x0, 0x0, 0x8, 0x5, 0x7e,0x37,0x6b,0xe3,0x22,0x6d,0x33,0x9e, +0x37,0x6b,0xe3,0x22,0xbe,0x24,0x0, 0x0, 0x8, 0x6, 0x7e,0x37,0x6b,0xdf,0x80,0x6, +0x6d,0x33,0x9e,0x37,0x6b,0xdf,0x22,0x7c,0x16,0x7c,0x7, 0x7c,0x9b,0x7e,0xb3,0x6f, +0x66,0xf5,0x2a,0x7e,0xb3,0x6f,0x67,0xf5,0x2b,0x9f,0x77,0xa, 0x31,0xa, 0x19,0x9d, +0x13,0x7c,0x83,0x80,0x7d,0x7a,0x81,0x28,0xbe,0x80,0x0, 0x58,0xc, 0x1a,0x58,0x1a, +0x19,0x9d,0x15,0xa, 0x59,0x2d,0x51,0xf5,0x28,0xe5,0x2a,0xbc,0xb8,0x18,0xc, 0x1a, +0x59,0x1a,0x18,0x9d,0x15,0xa, 0x59,0x9d,0x51,0xf5,0x28,0xa, 0x11,0xa, 0x50,0x9d, +0x51,0xf5,0x27,0x80,0x3d,0x85,0x27,0x29,0xe5,0x27,0xbe,0xb0,0x0, 0x58,0xe, 0xe5, +0x27,0x1a,0x5b,0x1a,0x10,0x9d,0x15,0xa, 0x50,0x2d,0x51,0xf5,0x29,0xe5,0x2b,0xbe, +0xb1,0x27,0x18,0xe, 0x1a,0x30,0xe5,0x27,0x1a,0x1b,0x9d,0x13,0xa, 0x50,0x9d,0x51, +0xf5,0x29,0xe5,0x28,0x7e,0x71,0x29,0x12,0x9b,0x6a,0x1a,0x26,0x1a,0x24,0x2f,0x71, +0x5, 0x27,0xa, 0x21,0xa, 0x30,0x2d,0x32,0xe5,0x27,0x1a,0x1b,0xbd,0x13,0x8, 0xb5, +0xb, 0x80,0xa, 0x11,0xa, 0x59,0x2d,0x51,0x1a,0x18,0xbd,0x15,0x18,0x2, 0x21,0x5, +0x7f,0x17,0x22,0x7c,0x67,0x7c,0x7b,0x7e,0x50,0x2, 0xac,0x57,0x9, 0xa2,0x6c,0x9, +0x9, 0x72,0x6c,0xa, 0x90,0x21,0xfa,0xe4,0x93,0xbc,0xba,0x78,0x3, 0x9f,0x11,0x22, +0x7c,0xba,0x2, 0xd0,0xe7,0x7e,0xb3,0x78,0xb0,0xb4,0x1, 0x3, 0x2, 0xd1,0xc0,0x22, +0xca,0x3b,0x7e,0xb3,0x6d,0x93,0xf5,0x27,0x6c,0xcc,0x41,0x80,0x74,0x2, 0xac,0xbc, +0x9, 0xf5,0x6c,0x9, 0x9, 0xe5,0x6c,0xa, 0x7e,0x73,0x6f,0x64,0xbc,0x7f,0x78,0x2, +0x41,0x7e,0x12,0xd3,0x39,0x7d,0xd3,0x12,0xd3,0x59,0x78,0x2, 0x6d,0xee,0x12,0xd3, +0x23,0x78,0x2, 0x6d,0xff,0x4c,0xee,0x78,0x2, 0x6d,0x0, 0x12,0xd3,0x1b,0x78,0x2, +0x6d,0x11,0xbe,0xe4,0x0, 0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0xf4,0x0, 0x46,0x8, 0x2, +0xb, 0xd0,0xbe,0x4, 0x0, 0x46,0x8, 0x2, 0xb, 0xd0,0xbe,0x14,0x0, 0x46,0x8, 0x2, +0xb, 0xd0,0xbe,0xd0,0x2, 0x40,0x4, 0xd2,0x0, 0x80,0x2e,0x4c,0xff,0x68,0x16,0x7e, +0xb3,0x6f,0x66,0x14,0xbc,0xbf,0x68,0xd, 0x4c,0xee,0x68,0x9, 0x7e,0xb3,0x6f,0x67, +0x14,0xbc,0xbe,0x78,0x14,0xbe,0xd4,0x1, 0x2c,0x8, 0xe, 0xbe,0xd0,0x0, 0x28,0x9, +0x7e,0xb3,0x78,0xb0,0xb4,0x1, 0x2, 0xd2,0x0, 0x20,0x0, 0x22,0x7d,0xc3,0x7e,0xb3, +0x78,0xb0,0xb4,0x3, 0x4, 0x7d,0x5c,0x80,0xb, 0x7e,0xb3,0x78,0xb0,0xb4,0x1, 0xb, +0x7d,0x5c,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x12,0xd3,0x2b,0x12,0x6f,0xb0,0xb, 0xc0, +0xe5,0x27,0xbc,0xbc,0x28,0x2, 0x21,0xcc,0x7e,0xb3,0x78,0xb0,0xb4,0x3, 0x2, 0x80, +0x2, 0x61,0x18,0x7e,0xb3,0x6d,0x94,0xf5,0x27,0x6c,0xcc,0x80,0x75,0x74,0x2, 0xac, +0xbc,0x9, 0xf5,0x6c,0x45,0x9, 0xe5,0x6c,0x46,0x7e,0x73,0x6f,0x64,0xbc,0x7f,0x68, +0x5f,0x12,0xd3,0x39,0x12,0xd3,0x59,0x78,0x2, 0x6d,0xee,0x12,0xd3,0x23,0x78,0x2, +0x6d,0xff,0x4c,0xee,0x78,0x2, 0x6d,0x0, 0x12,0xd3,0x1b,0x78,0x2, 0x6d,0x11,0xbe, +0xe4,0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe,0xf4,0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe, +0x4, 0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe,0x14,0xff,0xba,0x58,0x2, 0xb, 0xd0,0xbe, +0xd0,0x2, 0x40,0x2, 0xd2,0x0, 0x20,0x0, 0x17,0x12,0x24,0x5a,0x7d,0xc3,0x7d,0x5c, +0xe, 0x54,0xe, 0x54,0x6e,0x54,0xff,0xff,0xb, 0x54,0x12,0xd3,0x2b,0x12,0x6f,0xb0, +0xb, 0xc0,0xe5,0x27,0xbc,0xbc,0x38,0x85,0xda,0x3b,0x22,0x7e,0xb3,0x6f,0x65,0x14, +0xbc,0xbe,0x22,0x7e,0xb3,0x6f,0x64,0x14,0xbc,0xbf,0x22,0x7d,0xb4,0x3e,0xb4,0x7e, +0x1f,0x24,0x68,0x2d,0x3b,0x1b,0x1a,0x50,0x22,0x6c,0xdd,0xc2,0x0, 0x7e,0x33,0x6f, +0x65,0x7c,0x9f,0xac,0x93,0xa, 0x5e,0x2d,0x45,0x7d,0x24,0x3e,0x24,0x7e,0x5f,0x24, +0x68,0x7f,0x75,0x2d,0xf2,0xb, 0x7a,0x30,0x22,0xa, 0x53,0x7d,0x14,0x9d,0x15,0x3e, +0x14,0x2d,0x1b,0x7d,0xa, 0xb, 0xa, 0xe0,0x2d,0x54,0x3e,0x54,0x7f,0x5, 0x2d,0x15, +0xb, 0xa, 0xf0,0x7d,0x54,0x1b,0x54,0x3e,0x54,0x7f,0x5, 0x2d,0x15,0xb, 0xa, 0x0, +0x2d,0xb2,0x69,0x15,0x0, 0x2, 0x4c,0xff,0x22,0x7e,0xb3,0x78,0xb0,0xb4,0x3, 0x3, +0x2, 0xd1,0xc0,0x22,0x7e,0xb3,0x6d,0x93,0x70,0x2b,0x7e,0xb3,0x6f,0x31,0x70,0x25, +0x6c,0xaa,0x7e,0x70,0xff,0x7e,0x90,0x4, 0xac,0x9a,0x19,0x74,0x28,0xb7,0xe4,0x19, +0xb4,0x28,0xb8,0x74,0x3, 0x19,0xb4,0x28,0xb9,0xe4,0x19,0xb4,0x28,0xba,0xb, 0xa0, +0xbe,0xa0,0xa, 0x78,0xdd,0x22,0xca,0x79,0x7f,0x70,0x7e,0x3, 0x6f,0x65,0x7e,0x93, +0x6d,0x93,0x7e,0x6f,0x24,0x68,0x6c,0x11,0x6c,0x88,0x6c,0xff,0x80,0xd, 0xa, 0x1f, +0x12,0xd4,0x8a,0xbc,0x78,0x40,0x2, 0x7c,0x87,0xb, 0xf0,0xbc,0x9f,0x38,0xef,0x7e, +0xf0,0x1, 0x81,0x77,0x75,0x29,0x0, 0x6d,0xbb,0x6d,0x99,0x7d,0xa9,0x6c,0xee,0x80, +0x3a,0x7e,0x30,0x2, 0xac,0x3e,0x9, 0xb1,0x6c,0x9, 0xf5,0x27,0x9, 0xb1,0x6c,0xa, +0xf5,0x28,0xa, 0x1e,0x12,0xd4,0x8a,0xbc,0x7f,0x78,0x1e,0x5, 0x29,0xe5,0x27,0xa, +0x1b,0x2d,0xa1,0xe5,0x28,0xa, 0x1b,0x2d,0x91,0xe5,0x27,0x7e,0x71,0x28,0x12,0x9b, +0x6a,0x7d,0x83,0xbd,0xb8,0x58,0x2, 0x7d,0xb8,0xb, 0xe0,0xbc,0x9e,0x38,0xc2,0xe5, +0x29,0xbe,0xb0,0x0, 0x28,0x2f,0xe5,0x29,0xa, 0x8b,0x7d,0x3a,0x8d,0x38,0x7d,0xa3, +0x8d,0x98,0x12,0xd4,0x82,0x19,0xa1,0x75,0xc2,0x7d,0x39,0x12,0xd4,0x82,0x19,0xa1, +0x75,0xc3,0xa, 0x30,0xad,0x3a,0x7d,0x13,0x2d,0x19,0x3e,0x14,0x7f,0x16,0x2d,0x31, +0x1b,0x1a,0xb0,0xb, 0x10,0xb, 0xf0,0xbc,0x8f,0x40,0x2, 0x61,0xf4,0x7c,0xb1,0xda, +0x79,0x22,0x7c,0xa7,0x7e,0x30,0x2, 0xac,0x31,0x22,0x7f,0x17,0x2d,0x31,0x7e,0x1b, +0x70,0x22,0xca,0x3b,0x7c,0x45,0x7c,0x57,0x7c,0x7b,0x75,0x44,0x0, 0x7e,0xe0,0xff, +0xc2,0x5, 0x7e,0xf4,0x7f,0xff,0xbc,0x67,0x28,0x4, 0x7c,0xd7,0x80,0x2, 0x7c,0xd6, +0xbc,0x67,0x50,0x4, 0x7c,0xa7,0x80,0x2, 0x7c,0xa6,0xbc,0x45,0x28,0x4, 0x7c,0xc5, +0x80,0x2, 0x7c,0xc4,0xbc,0x45,0x50,0x4, 0x7c,0xb5,0x80,0x2, 0x7c,0xb4,0xf5,0x45, +0x7a,0xd1,0x46,0x7a,0xc1,0x47,0x7a,0xa1,0x48,0x85,0x45,0x49,0xd2,0x5, 0xbe,0x51, +0x47,0x78,0xa, 0xe5,0x46,0xbc,0xb7,0x50,0xc, 0xc2,0x5, 0x80,0x8, 0xe5,0x46,0xbc, +0xb6,0x50,0x2, 0xc2,0x5, 0x30,0x5, 0x2, 0xa1,0xfa,0x7c,0xda,0xa1,0xfa,0x7e,0x8, +0x63,0x6d,0x7e,0x34,0x0, 0xc, 0x74,0xff,0x12,0x24,0x38,0x30,0x5, 0x6f,0x12,0xd6, +0x48,0xbd,0x23,0x18,0x3, 0x12,0xd6,0x78,0xa, 0xd, 0xb, 0x4, 0xe5,0x48,0xa, 0x1b, +0xbd,0x1, 0x18,0x7, 0xa, 0x5d,0xb, 0x54,0x12,0xd6,0x3f,0xbd,0x1, 0x18,0xb, 0xbd, +0x23,0x18,0x7, 0xa, 0x3d,0xb, 0x34,0x12,0xd6,0x6b,0x7e,0xe4,0x80,0x1, 0x6c,0xff, +0x12,0xd6,0x5e,0x68,0xe, 0x12,0xd6,0x2f,0x68,0x9, 0x12,0xd6,0x85,0x8, 0x4, 0x7d, +0xe3,0x7c,0xef,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xe6,0x12,0xd6,0x51,0x78,0x7, 0x12, +0xd6,0x37,0x78,0x2, 0xc1,0x8, 0xe5,0x49,0xbe,0xb1,0x47,0x78,0x7, 0x12,0xd6,0x37, +0x78,0x2, 0xc1,0x8, 0xbe,0xe0,0xff,0x78,0x2, 0xa1,0xfa,0x80,0x67,0x12,0xd6,0x48, +0xbd,0x23,0x18,0x3, 0x12,0xd6,0x78,0xa, 0xd, 0x1b,0x4, 0xe5,0x46,0xa, 0x1b,0xbd, +0x1, 0x48,0x7, 0xa, 0x5d,0x1b,0x54,0x12,0xd6,0x3f,0xbd,0x1, 0x48,0xb, 0xbd,0x23, +0x18,0x7, 0xa, 0x3d,0x1b,0x34,0x12,0xd6,0x6b,0x7e,0xe4,0x80,0x1, 0x6c,0xff,0x12, +0xd6,0x5e,0x68,0xe, 0x12,0xd6,0x2f,0x68,0x9, 0x12,0xd6,0x85,0x8, 0x4, 0x7d,0xe3, +0x7c,0xef,0xb, 0xf0,0xbe,0xf0,0x3, 0x78,0xe6,0x12,0xd6,0x51,0x78,0x5, 0x12,0xd6, +0x27,0x68,0x35,0xe5,0x49,0xbe,0xb1,0x47,0x78,0x5, 0x12,0xd6,0x27,0x68,0x29,0xbe, +0xe0,0xff,0x68,0x16,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x59,0xe3,0x76,0x1f,0x9, +0xd4,0x63,0x6d,0x7c,0xca,0x5, 0x44,0x7e,0xe0,0xff,0xe5,0x45,0xa, 0x2b,0xb, 0x24, +0xa, 0x3c,0xbd,0x32,0x68,0x2, 0x81,0xfe,0x6c,0xff,0x80,0x10,0x74,0x2, 0xac,0xbf, +0x49,0xe5,0x76,0x1f,0xbd,0xef,0x58,0x2, 0x7d,0xfe,0xb, 0xf0,0xe5,0x44,0xbc,0xbf, +0x38,0xea,0x7d,0x3f,0xda,0x3b,0x22,0x9, 0xb4,0x63,0x6d,0xbe,0xb1,0x46,0x22,0x9, +0x72,0x63,0x6e,0xbe,0x70,0xff,0x22,0x9, 0xb4,0x63,0x6d,0xbe,0xb1,0x48,0x22,0x7a, +0xb3,0x63,0x71,0x7a,0xc3,0x63,0x72,0x22,0xa, 0x2c,0xb, 0x24,0xe5,0x49,0xa, 0x3b, +0x22,0x7e,0x90,0x4, 0xac,0x9e,0x9, 0xa4,0x63,0x6e,0xbe,0xa1,0x49,0x22,0x7e,0x50, +0x4, 0xac,0x5f,0x9, 0xb2,0x63,0x6d,0xbe,0xb0,0xff,0x22,0x7a,0x73,0x63,0x75,0xa, +0x3c,0xb, 0x34,0x7a,0x73,0x63,0x76,0x22,0x7a,0xd3,0x63,0x6d,0xa, 0x1c,0xb, 0x14, +0x7a,0x33,0x63,0x6e,0x22,0x12,0x9b,0x6a,0x74,0x4, 0xac,0xbf,0x59,0x35,0x63,0x6f, +0xbd,0x3e,0x22,0xca,0x3b,0x75,0x29,0xff,0x6c,0xff,0x7e,0xc0,0xff,0x6c,0xee,0x6c, +0x99,0x6c,0x88,0x7e,0xf4,0x7f,0xff,0x6c,0xdd,0x80,0x68,0x7e,0x70,0x2, 0xac,0x7d, +0x9, 0xb3,0x6c,0x9, 0xf5,0x27,0x9, 0x73,0x6c,0xa, 0x7a,0x71,0x28,0x12,0x9b,0x6a, +0x7d,0x3, 0xbd,0xf, 0x58,0x2, 0x7d,0xf0,0xe5,0x27,0xbe,0xb1,0x29,0x50,0x3, 0x85, +0x27,0x29,0xe5,0x27,0xbc,0xbf,0x28,0x3, 0x7e,0xf1,0x27,0xe5,0x28,0xbc,0xbc,0x50, +0x3, 0x7e,0xc1,0x28,0xe5,0x28,0xbc,0xbe,0x28,0x3, 0x7e,0xe1,0x28,0xe5,0x29,0xa, +0x5b,0xa, 0x1f,0x9d,0x15,0xbe,0x14,0x0, 0x7, 0x18,0xc, 0xa, 0x5c,0xa, 0x1e,0x9d, +0x15,0xbe,0x14,0x0, 0x7, 0x8, 0xa, 0x7e,0x14,0x1, 0xf4,0x7a,0x17,0x76,0x3d,0xe1, +0xb4,0xb, 0xd0,0x7e,0x73,0x6d,0x93,0xbc,0x7d,0x38,0x90,0x7d,0x3f,0x3e,0x34,0x12, +0xa7,0xc6,0x7d,0x3, 0x7c,0xdc,0x80,0x1c,0x7e,0xc1,0x29,0x80,0x11,0x7c,0xbc,0x7c, +0x7d,0x12,0x9b,0x6a,0xbd,0x30,0x8, 0x2, 0xb, 0x90,0xb, 0x80,0xb, 0xc0,0xbc,0xfc, +0x50,0xeb,0xb, 0xd0,0xbc,0xed,0x50,0xe0,0x7e,0x73,0x6f,0x32,0xbe,0x70,0x3, 0x40, +0xd, 0x12,0xd7,0xb7,0x50,0x28,0xb, 0x14,0x7a,0x17,0x76,0x3d,0x80,0x20,0xbe,0x70, +0x1, 0x38,0x1b,0x7e,0x17,0x76,0x3d,0xbe,0x14,0x0, 0x2, 0x28,0x6, 0x1b,0x15,0x7a, +0x17,0x76,0x3d,0x12,0xd7,0xc0,0x50,0x6, 0xb, 0x14,0x7a,0x17,0x75,0xbf,0x7e,0x73, +0x6d,0x93,0xbe,0x70,0x1, 0x40,0x2d,0x7e,0x30,0x2, 0xac,0x38,0x74,0x3, 0xac,0xb9, +0xbd,0x51,0x8, 0xf, 0x6d,0x11,0x7a,0x17,0x76,0x3d,0x12,0xd7,0xc0,0x50,0x15,0xb, +0x14,0x80,0xd, 0x12,0xd7,0xb7,0x50,0x6, 0xb, 0x15,0x7a,0x17,0x76,0x3d,0x6d,0x11, +0x7a,0x17,0x75,0xbf,0xda,0x3b,0x22,0x7e,0x17,0x76,0x3d,0xbe,0x14,0x3, 0xe8,0x22, +0x7e,0x17,0x75,0xbf,0xbe,0x14,0x1, 0xf4,0x22,0x6d,0x22,0x80,0x13,0x75,0xb5,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, 0xb0,0xb, 0x14,0xb, 0x24, +0xbd,0x32,0x38,0xe9,0x22,0xa9,0xc5,0xca,0x75,0xed,0x8f,0x75,0xad,0xb0,0xa9,0xc7, +0x94,0xa9,0xd4,0x94,0x22,0xa9,0x31,0xcd,0xf, 0xa9,0x31,0xe5,0xb, 0xa9,0xd5,0xea, +0xa9,0xc5,0xea,0xc2,0x95,0xa9,0xc1,0xcd,0xa9,0x30,0xcd,0x7, 0xa9,0x30,0xe5,0x3, +0xa9,0xc0,0xcd,0xa9,0x32,0xcd,0x7, 0xa9,0x32,0xe5,0x3, 0xa9,0xc2,0xcd,0xa9,0x35, +0xcd,0x7, 0xa9,0x35,0xe5,0x3, 0xa9,0xc5,0xcd,0xa9,0x36,0xcd,0x7, 0xa9,0x36,0xe5, +0x3, 0xa9,0xc6,0xcd,0xa9,0x37,0xcd,0x7, 0xa9,0x37,0xe5,0x3, 0xa9,0xc7,0xcd,0x32, +0x7e,0x14,0xf7,0xf0,0x7e,0x4, 0x0, 0xff,0x7e,0x34,0x47,0x52,0x7e,0x24,0x55,0x50, +0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x34,0x45,0x20,0x7e,0x24,0x41,0x44,0x79, +0x30,0x0, 0x6, 0x79,0x20,0x0, 0x4, 0x7e,0x34,0x99,0x33,0x7e,0x24,0x66,0xcc,0x79, +0x30,0x0, 0xa, 0x79,0x20,0x0, 0x8, 0x7e,0x34,0x41,0x47,0x7e,0x24,0x46,0x4c,0x79, +0x30,0x0, 0xe, 0x79,0x20,0x0, 0xc, 0x22,0x7e,0xb3,0x78,0x9c,0xbe,0xb0,0xc8,0x50, +0x5, 0x4, 0x7a,0xb3,0x78,0x9c,0x22,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x1, 0x75, +0x8b,0x0, 0xd2,0x8e,0xd2,0xab,0x22,0x75,0xb7,0x0, 0x75,0xb8,0x0, 0x75,0xf7,0x0, +0x75,0xf8,0x0, 0xa9,0xd0,0xb7,0xd2,0xb8,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7, +0xd2,0xf8,0xa9,0xd4,0xb7,0xc2,0xbc,0xa9,0xc2,0xb7,0xc2,0xba,0xa9,0xc1,0xb7,0xc2, +0xb9,0xa9,0xc3,0xb7,0xc2,0xbb,0x22,0xa2,0xac,0x92,0x2, 0xc2,0xac,0x7e,0xf, 0x78, +0xf2,0x30,0x1, 0xa, 0xb, 0x16,0xb, 0xa, 0x30,0x4e,0x70,0xc, 0x80,0x8, 0xb, 0x16, +0xb, 0xa, 0x30,0x5e,0x70,0xf3,0x1b,0xa, 0x30,0xa2,0x2, 0x92,0xac,0x22,0xa, 0x7, +0xa, 0x1b,0x2d,0x10,0x12,0xd9,0x10,0x6d,0x0, 0x7e,0x18,0xbb,0x80,0x2, 0x23,0x10, +0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x22,0x7e,0x8, 0x0, 0x6d,0x12,0xaf,0xd0, +0x7e,0x34,0x1, 0x5, 0x7a,0x37,0x0, 0x6d,0x7e,0x34,0x20,0x0, 0x7a,0x37,0x0, 0x6f, +0x6d,0x33,0x7a,0x37,0x0, 0x71,0x7e,0x34,0x1, 0x80,0x7a,0x37,0x0, 0x73,0x7e,0x34, +0x28,0x30,0x7a,0x37,0x0, 0x75,0x7e,0x34,0x18,0x1e,0x7a,0x37,0x0, 0x77,0x7e,0x34, +0x66,0x6, 0x7a,0x37,0x0, 0x79,0x7e,0x34,0x73,0x0, 0x7a,0x37,0x0, 0x7b,0x7e,0x34, +0x14,0x2, 0x7a,0x37,0x0, 0x7d,0x6d,0x33,0x7a,0x37,0x0, 0x81,0x7a,0x37,0x0, 0x83, +0x7a,0x37,0x0, 0x85,0x7a,0x37,0x0, 0x87,0x7a,0x37,0x0, 0x99,0x7e,0x34,0x38,0x1, +0x7a,0x37,0x0, 0x9b,0x7e,0x34,0x4, 0x1, 0x7a,0x37,0x0, 0x9d,0x7e,0x34,0x6, 0x3, +0x7a,0x37,0x0, 0x9f,0x6d,0x33,0x7a,0x37,0x0, 0xa1,0x7a,0x37,0x0, 0xa3,0x7a,0x37, +0x0, 0xa5,0x7a,0x37,0x0, 0xa7,0x7e,0x34,0x0, 0x3c,0xca,0x39,0x7e,0x18,0x0, 0x6d, +0x7e,0x8, 0x0, 0xa9,0x12,0x24,0x13,0x1b,0xfd,0x22,0xca,0x3b,0x7e,0x38,0x1, 0x7d, +0x12,0x7, 0xb5,0x7e,0xa3,0x1, 0x8d,0xbe,0xa0,0xff,0x68,0x2a,0x7e,0x63,0x1, 0x8e, +0xbe,0x60,0xff,0x68,0x21,0x7e,0x73,0x1, 0x8f,0xbe,0x70,0xff,0x68,0x18,0x4c,0xaa, +0x68,0x14,0x4c,0x66,0x68,0x10,0x4c,0x77,0x68,0xc, 0x7a,0xa3,0x76,0xe2,0x7a,0x63, +0x76,0xde,0x7a,0x73,0x76,0xdf,0xc2,0x10,0x7e,0xb3,0x1, 0x8f,0xbe,0xb0,0x3, 0x28, +0xf, 0x74,0x4, 0x7a,0xb3,0x78,0x92,0x7a,0xb3,0x4a,0x68,0x75,0xc3,0x84,0xd2,0x10, +0xc2,0x12,0x7c,0xba,0x54,0xf0,0xb4,0xe0,0x2, 0xd2,0x12,0x7e,0x8, 0x0, 0xa1,0x69, +0x33,0x0, 0x4, 0x12,0xda,0xab,0x12,0x0, 0x6, 0x7e,0x8, 0x0, 0xa3,0x29,0xb3,0x0, +0x6, 0x12,0xda,0xa0,0x7e,0x8, 0x0, 0xdd,0x69,0x33,0x0, 0x1, 0x12,0xda,0xab,0x12, +0x0, 0x6, 0x7e,0x8, 0x0, 0xdf,0x29,0xb3,0x0, 0x3, 0x12,0xda,0xa0,0x7e,0x8, 0x0, +0xa5,0x69,0x33,0x0, 0xa, 0x12,0xda,0xab,0x12,0x0, 0x6, 0x7e,0x8, 0x0, 0xa7,0x29, +0xb3,0x0, 0xc, 0x12,0xda,0xa0,0x7e,0x8, 0x0, 0xe1,0x69,0x33,0x0, 0x7, 0x12,0xda, +0xab,0x12,0x0, 0x6, 0x7e,0x8, 0x0, 0xe3,0x29,0xb3,0x0, 0x9, 0x12,0xda,0xa0,0x7e, +0x34,0x0, 0x1a,0x7e,0x8, 0x0, 0xa1,0x7e,0x24,0x0, 0x4, 0x12,0x3, 0xfa,0x7e,0x34, +0x0, 0x1a,0x7e,0x8, 0x0, 0xdd,0x7e,0x24,0x0, 0x4, 0x12,0x4, 0x96,0xda,0x3b,0x22, +0x54,0xc0,0x23,0x23,0x54,0x3, 0xa, 0x3b,0x2, 0xd, 0xa5,0x7d,0x23,0x7c,0x45,0x6c, +0x55,0xa, 0x36,0x4d,0x32,0x22,0x6c,0xaa,0x7e,0x30,0x2c,0xac,0x3a,0x12,0x33,0xe4, +0x7e,0x34,0x0, 0x2c,0xe4,0x12,0x24,0x38,0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe9,0x22, +0x7e,0x34,0x0, 0x4, 0x12,0x3f,0xf5,0x74,0x1, 0x12,0x3f,0xfe,0x7e,0x73,0x78,0x97, +0x7a,0x73,0x77,0xb7,0x7a,0x73,0x77,0xb8,0x22,0x7e,0xb3,0x77,0xb4,0xb4,0x1, 0x37, +0x7e,0xa3,0x77,0xb2,0x7a,0xa3,0x77,0xb3,0x7e,0xb3,0x77,0xba,0x4, 0x7a,0xb3,0x77, +0xba,0x7e,0xb3,0x77,0xb9,0x4, 0x7a,0xb3,0x77,0xb9,0x12,0xdd,0x8d,0xbe,0xb3,0x77, +0xb9,0x38,0x14,0xe4,0x7a,0xb3,0x77,0xb9,0x7c,0xba,0x4, 0x7a,0xb3,0x77,0xb2,0x12, +0xdb,0x28,0x28,0x3, 0x12,0x4f,0xf3,0x22,0x7e,0x73,0x77,0xb1,0xbe,0x73,0x77,0xb2, +0x22,0x7e,0xb3,0x77,0xb4,0xb4,0x1, 0x2, 0x80,0x2, 0x61,0xd2,0x7e,0x73,0x77,0xb1, +0xbe,0x73,0x77,0xb3,0x28,0x74,0x7e,0x63,0x77,0xb3,0x7e,0x70,0x7, 0xac,0x67,0x49, +0x53,0x77,0xbd,0x7c,0xab,0x7e,0x43,0x77,0xba,0x7e,0x50,0x2, 0xac,0x45,0x2d,0x32, +0x49,0x33,0x77,0xbf,0x7a,0x35,0x1c,0x4d,0x33,0x68,0x4f,0xd2,0x30,0x1b,0xa0,0x68, +0x10,0x1b,0xa0,0x68,0xc, 0x1b,0xa0,0x68,0x8, 0x1b,0xa0,0x68,0x4, 0xb, 0xa2,0x78, +0x39,0x12,0xdb,0xd3,0x30,0x13,0x4, 0x74,0x2, 0x80,0x2, 0x74,0x1, 0x7e,0xa3,0x77, +0xba,0xa, 0x3a,0x19,0xb3,0x77,0xb5,0x7e,0xb3,0x77,0xba,0x70,0xe, 0x7e,0x73,0x77, +0xbc,0xbe,0x70,0x1, 0x28,0x5, 0x12,0xb, 0xe5,0x80,0xf, 0x7e,0xf, 0x78,0xf2,0xb, +0x16,0xb, 0xa, 0x30,0x5e,0x60,0xef,0x1b,0xa, 0x30,0x12,0xdb,0x28,0x38,0x13,0x74, +0x2, 0x7a,0xb3,0x77,0xb4,0x12,0x3f,0xbb,0x12,0x37,0xf5,0xe5,0x1e,0x70,0x3, 0x2, +0x4f,0x8a,0x22,0xca,0x3b,0x7e,0x95,0x1c,0x6d,0x88,0x7e,0xb3,0x77,0xba,0xf5,0x4c, +0x7e,0xb3,0x6f,0x76,0x60,0xa, 0x7e,0xc7,0x6f,0x6a,0x7e,0xd7,0x6f,0x6c,0x80,0x8, +0x7e,0xd7,0x6f,0x6a,0x7e,0xc7,0x6f,0x6c,0x20,0x30,0x2, 0xa1,0x44,0x7e,0xe7,0x73, +0xd6,0x7e,0xf4,0x0, 0xa, 0xa9,0xd7,0xea,0x7e,0x5f,0x1, 0x79,0x69,0x55,0x2, 0x64, +0x69,0x75,0x0, 0xc, 0x4d,0x75,0x12,0xdd,0x64,0x59,0x75,0x0, 0xe5,0x69,0x55,0x2, +0x5c,0x7e,0x5f,0x1, 0x79,0x69,0xb5,0x0, 0x4, 0x4d,0xb5,0x12,0xdd,0x64,0x59,0xb5, +0x0, 0xe7,0x7e,0x5f,0x1, 0x79,0x69,0xb5,0x2, 0x5a,0x7e,0x3f,0x1, 0x79,0x69,0x53, +0x0, 0x2, 0xbd,0x5b,0x28,0xc, 0x7e,0x5f,0x1, 0x79,0x69,0x55,0x0, 0x2, 0x7d,0x45, +0x80,0x8, 0x7e,0x2f,0x1, 0x79,0x69,0x42,0x2, 0x5a,0x12,0xdd,0x64,0x59,0x45,0x0, +0xe9,0x7e,0x2f,0x1, 0x79,0xb, 0x2a,0x50,0x12,0xdd,0x6b,0x19,0xa4,0x0, 0xeb,0x7e, +0x2f,0x1, 0x79,0x69,0x52,0x2, 0x58,0x12,0xdd,0x6b,0x19,0xa4,0x0, 0xec,0x6d,0xbb, +0x7d,0x4b,0xbe,0x44,0x0, 0x1, 0x78,0x4, 0xb, 0xf4,0x80,0x23,0x7c,0xb9,0x7e,0xa4, +0x0, 0x1, 0x60,0x5, 0x3e,0xa4,0x14,0x78,0xfb,0x7e,0xb3,0x6f,0x68,0xa, 0x5b,0x5d, +0x5a,0x68,0x5, 0x12,0xdd,0x47,0x80,0x7, 0x6d,0x55,0x12,0xdd,0x56,0xb, 0xf4,0xb, +0x44,0xbe,0x44,0x0, 0x3, 0x78,0xcb,0x7e,0xb3,0x6f,0x76,0x60,0x5, 0x7a,0xc5,0x4a, +0x80,0x3, 0x7a,0xb5,0x4a,0x12,0xdd,0x79,0x7d,0x4b,0x80,0xc, 0xb, 0xa, 0x50,0x1b, +0x1a,0x50,0xb, 0x15,0xb, 0x35,0xb, 0x44,0xbd,0xd4,0x38,0xf0,0x7d,0xfd,0x2e,0xf5, +0x4a,0x7a,0xf5,0x4a,0x7e,0xf4,0x1, 0x36,0x7d,0x4b,0xbe,0x44,0x0, 0x1, 0x78,0x4, +0xb, 0xf4,0x80,0x23,0x7c,0xb9,0x7e,0xa4,0x0, 0x1, 0x60,0x5, 0x3e,0xa4,0x14,0x78, +0xfb,0x7e,0xb3,0x6f,0x69,0xa, 0x5b,0x5d,0x5a,0x68,0x5, 0x12,0xdd,0x47,0x80,0x7, +0x6d,0x55,0x12,0xdd,0x56,0xb, 0xf4,0xb, 0x44,0xbe,0x44,0x0, 0x3, 0x78,0xcb,0x7e, +0xb3,0x6f,0x76,0x60,0x3, 0x7a,0xb5,0x4a,0x12,0xdd,0x79,0x7d,0x4b,0x80,0xc, 0xb, +0xa, 0x50,0x1b,0x1a,0x50,0xb, 0x35,0xb, 0x15,0xb, 0x44,0xbd,0xc4,0x38,0xf0,0xa9, +0xc7,0xea,0xc2,0x30,0xda,0x3b,0x22,0x7d,0x5f,0xb, 0xf4,0x3e,0x54,0x7e,0x3f,0x1, +0x79,0x2d,0x75,0xb, 0x3a,0x50,0x7d,0xae,0xb, 0xe4,0x3e,0xa4,0x7f,0x34,0x2d,0x7a, +0x1b,0x3a,0x50,0x22,0x7e,0xa1,0x4c,0x74,0x8, 0xa4,0x22,0x5e,0x54,0x0, 0x7f,0x7c, +0xab,0x7e,0x91,0x4c,0x74,0x8, 0xac,0x9b,0x22,0x7d,0xaf,0x3e,0xa4,0x7e,0xf, 0x1, +0x79,0x2d,0x1a,0x7e,0xa5,0x4a,0x3e,0xa4,0x7f,0x14,0x2d,0x3a,0x22,0x7e,0x70,0x7, +0xac,0x7a,0x9, 0xb3,0x77,0xc3,0x22,0x6c,0xaa,0x7e,0xb3,0x78,0x8e,0xa, 0x3b,0x1e, +0x34,0xb, 0x34,0x7e,0x50,0x8, 0xac,0x5a,0x19,0x72,0x77,0x96,0xb, 0xa0,0xbe,0xa0, +0x4, 0x40,0xe6,0x22,0x7e,0x34,0x0, 0x1, 0x12,0x3f,0xf5,0x7e,0x57,0x77,0x99,0x12, +0x3f,0xfe,0x74,0x1, 0x2, 0x3f,0xd9,0x7e,0x34,0x0, 0x3, 0x12,0x3f,0xf5,0x7e,0x57, +0x77,0xa9,0x12,0x3f,0xfe,0x74,0x3, 0x2, 0x3f,0xd9,0x80,0x3, 0x12,0x46,0x86,0x30, +0x15,0xfa,0x22,0x12,0x3b,0x65,0x5e,0x34,0x0, 0x1, 0x68,0x4, 0xd2,0x1b,0xc2,0x1e, +0x22,0x30,0x1d,0x8, 0xe5,0x1e,0xb4,0x1, 0x3, 0x2, 0x3b,0xdc,0x22,0x7c,0xab,0x7e, +0x8, 0x0, 0x87,0x7e,0x70,0xa, 0xac,0x7a,0x9, 0xb3,0x29,0x8c,0x12,0xc, 0x3e,0x7e, +0x8, 0x0, 0xc3,0x74,0xa, 0xa4,0x9, 0xb5,0x29,0x8c,0x12,0xc, 0x3e,0x7e,0x34,0x0, +0xd, 0x7e,0x8, 0x0, 0x87,0x7e,0x24,0x0, 0x1, 0x2, 0xc, 0xcc,0xca,0xd8,0xca,0x79, +0x7c,0xf7,0x7c,0xeb,0xe4,0x12,0x67,0x91,0x6c,0xdd,0x7e,0x70,0xb5,0xac,0x7d,0x2e, +0x34,0x1, 0x0, 0x2e,0x34,0x0, 0x16,0x7a,0x35,0x29,0x12,0x7, 0x40,0x7a,0x35,0x2b, +0x7e,0x35,0x29,0x12,0x8, 0x0, 0x7a,0x35,0x2d,0x7e,0x25,0x2b,0x5e,0x50,0xf8,0x7a, +0x25,0x2b,0x5e,0x70,0xf8,0x7a,0x35,0x2d,0x7c,0xbe,0x54,0x5, 0xa, 0x3b,0x4e,0x35, +0x2b,0x7a,0x35,0x2b,0x7c,0xbf,0x54,0x5, 0xa, 0x3b,0x4e,0x35,0x2d,0x7a,0x35,0x2d, +0x7e,0x35,0x29,0x7e,0x25,0x2b,0x12,0x6, 0x48,0x7e,0x35,0x29,0x7e,0x25,0x2d,0x12, +0x6, 0xc5,0xb, 0xd0,0xbe,0xd0,0x3, 0x40,0xa1,0xda,0x79,0xda,0xd8,0x22,0x7c,0xab, +0x74,0x27,0xa4,0x49,0x25,0x28,0xee,0xb, 0x24,0x7e,0x37,0x77,0x8b,0xad,0x32,0x7e, +0x8, 0x0, 0x83,0x12,0xde,0xb9,0x2, 0xc, 0xcc,0x6d,0x22,0x12,0xd, 0x3e,0x7e,0x8, +0x0, 0xbf,0x6d,0x22,0x12,0xd, 0x3e,0x7e,0x34,0x0, 0xb, 0x7e,0x8, 0x0, 0x83,0x7e, +0x24,0x0, 0x2, 0x22,0x7c,0xab,0x6d,0x33,0xbe,0xa0,0x4, 0x50,0x27,0x6c,0x55,0x80, +0x16,0x7e,0x10,0x2, 0xac,0x15,0x7e,0x30,0x27,0xac,0x3a,0x2d,0x10,0x49,0x11,0x28, +0xee,0xb, 0x14,0x2d,0x31,0xb, 0x50,0x7e,0x30,0x27,0xac,0x3a,0x9, 0x41,0x28,0xe9, +0xbc,0x45,0x50,0xdd,0x4d,0x33,0x78,0x2, 0xb, 0x34,0x22,0xca,0x79,0x7c,0xfb,0xd2, +0x0, 0xc2,0x1, 0x6d,0x33,0x7a,0x37,0x78,0x86,0x74,0x27,0xac,0xbf,0x9, 0xe5,0x28, +0xe9,0x7c,0xbf,0x12,0x67,0x4a,0x92,0x1, 0x7c,0xbf,0x12,0xcf,0xfa,0x92,0x0, 0x30, +0x0, 0x5, 0x7c,0xbf,0x12,0x57,0x3b,0x7e,0xb3,0x77,0x5f,0x70,0xc, 0x7c,0xbf,0x12, +0xdf,0x63,0x92,0x31,0x20,0x31,0x2, 0xc2,0x0, 0x30,0x1, 0x12,0x74,0x27,0xac,0xbf, +0x19,0xe5,0x28,0xe9,0x7c,0xbf,0x12,0x66,0xf8,0x7c,0xbf,0x12,0x67,0xbd,0xa2,0x0, +0xda,0x79,0x22,0x7c,0xab,0x7e,0x73,0x73,0xda,0xc2,0x2, 0x6d,0x22,0x7d,0x42,0x80, +0x13,0xa, 0xa, 0x12,0x35,0xa6,0x2d,0x14,0x9, 0xb1,0x4e,0xa8,0x70,0x4, 0xd2,0x2, +0x80,0xa, 0xb, 0x44,0x7e,0x17,0x73,0xd6,0xbd,0x14,0x38,0xe5,0x7d,0x42,0x7c,0xb7, +0x54,0x1, 0xb4,0x1, 0x17,0xa, 0xa, 0x12,0x35,0xa6,0x7e,0x27,0x73,0xd6,0x2d,0x24, +0x2d,0x21,0x9, 0xb2,0x4e,0xa8,0x70,0x4, 0xd2,0x2, 0x80,0xa, 0x1e,0x70,0xb, 0x44, +0xbe,0x44,0x0, 0x4, 0x40,0xd8,0x30,0x2, 0x10,0x7e,0xb3,0x78,0xe8,0xbe,0xb0,0x0, +0x28,0xd, 0x14,0x7a,0xb3,0x78,0xe8,0xc3,0x22,0x74,0x5, 0x7a,0xb3,0x78,0xe8,0xd3, +0x22,0xca,0x79,0x7c,0x5b,0x7e,0x40,0xff,0x7e,0xa0,0xff,0x6c,0x33,0x2, 0xe0,0x67, +0xbc,0x63,0x78,0x3, 0x2, 0xe0,0x65,0x7e,0x90,0x2, 0xac,0x93,0x9, 0x24,0x6c,0x9, +0xa, 0xf2,0xa, 0x5, 0x9d,0xf, 0xbe,0x4, 0x0, 0x0, 0x8, 0xc, 0xa, 0xe2,0xa, 0xf5, +0x9d,0xfe,0x7d,0x7f,0x7c,0x2f,0x80,0x8, 0x6e,0x4, 0xff,0xff,0xb, 0x4, 0x7c,0x21, +0x7e,0x10,0x2, 0xac,0x13,0x9, 0xb0,0x6c,0xa, 0xa, 0xb, 0xa, 0x47,0x9d,0x40,0xbe, +0x44,0x0, 0x0, 0x8, 0x8, 0xa, 0xfb,0xa, 0x7, 0x9d,0xf, 0x80,0x4, 0x6d,0x0, 0x9d, +0x4, 0xbe,0x20,0x1, 0x38,0xa, 0xbe,0x10,0x1, 0x38,0x5, 0x7e,0xa0,0x1, 0x80,0x32, +0xbe,0x20,0x2, 0x38,0xa, 0xbe,0x10,0x2, 0x38,0x5, 0x7e,0x40,0x2, 0x80,0x10,0x30, +0x0, 0xd, 0xbe,0x20,0x3, 0x38,0x8, 0xbe,0x10,0x3, 0x38,0x3, 0x7e,0x40,0x3, 0xbc, +0x4a,0x50,0x2, 0x7c,0xa4,0xb, 0x30,0x7e,0x3, 0x6d,0x93,0xbc,0x3, 0x28,0x3, 0x2, +0xdf,0xe0,0x7c,0xba,0xda,0x79,0x22,0xca,0x3b,0x7c,0xcb,0x7e,0x8, 0x63,0x6d,0x12, +0x5f,0xef,0x7e,0x8, 0x63,0x79,0x7e,0x34,0x0, 0x5, 0x12,0x24,0x38,0x12,0x9f,0xee, +0x7e,0xb7,0x73,0xd6,0x7e,0x97,0x6d,0xb0,0x7d,0xa9,0x3e,0xa4,0x3e,0xa4,0x4c,0xcc, +0x78,0x6c,0x7a,0xd3,0x63,0x6e,0x7a,0xe3,0x63,0x6d,0x7e,0x84,0x8, 0xc, 0x7a,0x87, +0x63,0x71,0x7e,0x1f,0x24,0x64,0x7d,0x83,0x7a,0x87,0x63,0x73,0x7e,0x1f,0x24,0x64, +0x7d,0x83,0x7a,0x87,0x63,0x75,0x7d,0x39,0x7c,0xb7,0xf5,0x27,0x7e,0x8, 0x63,0x6d, +0x7e,0x18,0x63,0x79,0x7d,0x59,0x12,0x0, 0x46,0x6c,0xff,0x7d,0x3b,0x3e,0x34,0x49, +0x83,0x8, 0xc, 0xbd,0xa8,0x58,0x10,0x7e,0xf, 0x24,0x64,0x2d,0x13,0xb, 0xa, 0x20, +0x2d,0x2a,0x1b,0xa, 0x20,0x80,0x10,0x6d,0x22,0x9d,0x2a,0xbd,0x28,0x8, 0x8, 0x12, +0xe1,0x5d,0x9d,0x3a,0x1b,0xa, 0x30,0x12,0xe1,0x55,0x78,0xcf,0x80,0x44,0xbe,0xc0, +0x1, 0x78,0x3f,0x6c,0xff,0x80,0x24,0x6c,0x77,0x80,0x1a,0x7c,0xbf,0xac,0xbd,0xa, +0x87,0x2d,0x85,0x3e,0x84,0x7e,0xf, 0x24,0x64,0x2d,0x18,0xb, 0xa, 0x80,0x2d,0x89, +0x1b,0xa, 0x80,0xb, 0x70,0xbc,0xd7,0x38,0xe2,0xb, 0xf0,0xbc,0xef,0x38,0xd8,0x6c, +0xff,0x7d,0x3b,0x3e,0x34,0x12,0xe1,0x5d,0x2d,0x3a,0x1b,0xa, 0x30,0x12,0xe1,0x55, +0x78,0xef,0xda,0x3b,0x22,0xb, 0xb4,0xb, 0xf0,0xbe,0xf0,0x4, 0x22,0x7e,0xf, 0x24, +0x64,0x2d,0x13,0xb, 0xa, 0x30,0x22,0x7e,0x37,0x73,0xd6,0x6c,0xaa,0x90,0x1c,0x49, +0xe4,0x93,0x20,0xe0,0x4, 0x4c,0xaa,0x68,0x25,0x1e,0xb0,0x1e,0xb0,0x20,0xe0,0x5, +0xbe,0xa0,0x1, 0x68,0x19,0x90,0x1c,0x4a,0xe4,0x93,0x20,0xe0,0x5, 0xbe,0xa0,0x2, +0x68,0xc, 0x1e,0xb0,0x1e,0xb0,0x20,0xe0,0x9, 0xbe,0xa0,0x3, 0x78,0x4, 0xb, 0x34, +0x80,0x25,0x7d,0x23,0x3e,0x24,0x49,0x42,0x8, 0xc, 0x12,0xe1,0xcf,0x2d,0x24,0x1b, +0xa, 0x20,0x7d,0x23,0x3e,0x24,0x12,0xe1,0xcf,0xbe,0x24,0xf, 0xa0,0x50,0x6, 0x74, +0x1f,0x7a,0xb3,0x73,0xd4,0xb, 0x34,0xb, 0xa0,0xbe,0xa0,0x4, 0x40,0x9f,0x22,0x7e, +0xf, 0x24,0x64,0x2d,0x12,0xb, 0xa, 0x20,0x22,0xe4,0x7a,0xb3,0x6d,0xa8,0x12,0xe1, +0xf5,0xe4,0x12,0x0, 0x19,0x7e,0xb3,0x25,0xae,0xb4,0x1, 0x8, 0x7e,0x73,0x6d,0x93, +0x7a,0x73,0x6d,0xa7,0x22,0x6c,0x33,0x80,0x9, 0xe4,0xa, 0x33,0x19,0xb3,0x6c,0x81, +0xb, 0x30,0x90,0x21,0x52,0xe4,0x93,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0xb, 0x24,0xa, +0x33,0xbd,0x32,0x48,0xe4,0x12,0xe3,0x39,0x6d,0x33,0x7a,0x37,0x6d,0x95,0x7a,0x37, +0x6d,0x97,0x7a,0x37,0x6d,0x99,0x7a,0x37,0x6d,0x9d,0x7e,0xd4,0x63,0x6f,0x1e,0xd4, +0x3e,0xd4,0x6d,0xcc,0x7e,0x1f,0x24,0x68,0x7a,0x37,0x63,0xaf,0x7d,0x3d,0x7a,0x37, +0x63,0xb3,0x7e,0x34,0x24,0xbc,0x7a,0x37,0x63,0xb1,0x7e,0x73,0x6f,0x64,0x7a,0x73, +0x63,0xac,0x7e,0x73,0x6f,0x65,0x7a,0x73,0x63,0xab,0x7e,0x37,0x6f,0x42,0x7a,0x37, +0x63,0xb5,0x7e,0x37,0x6f,0x44,0x7a,0x37,0x63,0xb7,0x7e,0x37,0x6f,0x4c,0x7a,0x37, +0x63,0xb9,0x7e,0x37,0x6f,0x4e,0x7a,0x37,0x63,0xbb,0x12,0xac,0x4c,0x1b,0x34,0x7a, +0x73,0x63,0xad,0x7e,0x73,0x78,0xfc,0x7a,0x73,0x63,0xae,0x7e,0x8, 0x63,0xab,0x7e, +0x18,0x63,0xbd,0x12,0x3, 0x1d,0x7e,0x73,0x63,0xbd,0x7a,0x73,0x6d,0x93,0x7e,0x73, +0x63,0xbe,0x7a,0x73,0x6d,0x94,0x7e,0x37,0x63,0xbf,0x7a,0x37,0x6d,0x95,0x7e,0x37, +0x63,0xc1,0x7a,0x37,0x6d,0x97,0x7e,0x37,0x63,0xc7,0x7a,0x37,0x6d,0x99,0x7e,0x37, +0x63,0xc9,0x7d,0x23,0x7a,0x53,0x6d,0x9b,0xa, 0x36,0x7a,0x73,0x6d,0x9c,0x7e,0x37, +0x63,0xc3,0x7a,0x37,0x6d,0x9d,0x7e,0x37,0x63,0xc5,0x7d,0x23,0x7a,0x53,0x6d,0x9f, +0xa, 0x36,0x7a,0x73,0x6d,0xa0,0x6c,0x33,0x80,0x1f,0xd2,0x2, 0x7c,0xb3,0x12,0x6e, +0x5b,0x74,0x2, 0xac,0xb3,0x49,0x45,0x24,0xbc,0xa, 0x38,0x7c,0x27,0x19,0x25,0x6c, +0x9, 0x7c,0x29,0x19,0x25,0x6c,0xa, 0xb, 0x30,0x7e,0x23,0x6d,0x93,0xbc,0x23,0x38, +0xd9,0x6c,0x33,0x80,0x1b,0x74,0x2, 0xac,0xb3,0x7f,0x16,0x2d,0x35,0xb, 0x1a,0x40, +0xa, 0x38,0x7c,0x27,0x19,0x25,0x6c,0x45,0x7c,0x29,0x19,0x25,0x6c,0x46,0xb, 0x30, +0x7e,0x23,0x6d,0x94,0xbc,0x23,0x38,0xdd,0x22,0xe4,0x7a,0xb3,0x6d,0x93,0x7a,0xb3, +0x6d,0x94,0x22,0xe4,0x7a,0xb3,0x78,0xb1,0x22,0x7c,0x7b,0xa, 0x57,0x9e,0x54,0x0, +0x20,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7c,0x67,0x5e,0x60,0xf0, +0xa5,0xbe,0x20,0x1d,0x7c,0xb7,0x54,0xf, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24, +0x14,0x78,0xfb,0x7e,0x73,0x78,0xde,0xa, 0x47,0x5d,0x42,0x7e,0x73,0x77,0x10,0x80, +0x36,0xa5,0xbe,0x30,0x18,0x12,0xe3,0xbc,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x7e, +0x53,0x78,0xdf,0xa, 0x45,0x5d,0x43,0x7e,0x73,0x77,0x11,0x80,0x1a,0x12,0xe3,0xbc, +0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x2a,0x9, 0xb2,0x78,0xde,0xa, 0x4b,0x5d, +0x43,0xa, 0x5a,0x9, 0x75,0x77,0x12,0xa, 0x57,0x5d,0x54,0x22,0x7c,0xb7,0x54,0xf, +0x7e,0x34,0x0, 0x1, 0x22,0x7e,0x17,0x27,0x5a,0xbd,0x13,0x28,0xa, 0x7a,0x37,0x27, +0x5a,0x7a,0x27,0x27,0x5c,0x80,0x10,0x7e,0x17,0x27,0x52,0xbd,0x13,0x50,0x8, 0x7a, +0x37,0x27,0x52,0x7a,0x27,0x27,0x54,0x7e,0x17,0x27,0x58,0xbd,0x12,0x28,0xa, 0x7a, +0x27,0x27,0x58,0x7a,0x37,0x27,0x56,0x80,0x10,0x7e,0x17,0x27,0x60,0xbd,0x12,0x50, +0x8, 0x7a,0x27,0x27,0x60,0x7a,0x37,0x27,0x5e,0x7e,0xb3,0x27,0x72,0xb4,0xa, 0xf, +0x12,0xe4,0x3a,0x7a,0x37,0x27,0x6a,0x12,0xe4,0x31,0x7a,0x37,0x27,0x6c,0x22,0xb4, +0xf, 0xe, 0x12,0xe4,0x3a,0x7a,0x37,0x27,0x6e,0x12,0xe4,0x31,0x7a,0x37,0x27,0x70, +0x22,0x7e,0x37,0x27,0x60,0x9e,0x37,0x27,0x58,0x22,0x7e,0x37,0x27,0x52,0x9e,0x37, +0x27,0x5a,0x22,0x7e,0xb3,0x27,0x4a,0xb4,0x4, 0x2, 0xd3,0x22,0xc3,0x22,0x7e,0xa3, +0x27,0x72,0xbe,0xa0,0x64,0x50,0x1b,0x74,0x4, 0xa4,0x59,0x35,0x25,0xb9,0x7e,0xa3, +0x27,0x72,0x74,0x4, 0xa4,0x59,0x25,0x25,0xbb,0x7e,0xb3,0x27,0x72,0x4, 0x7a,0xb3, +0x27,0x72,0x22,0x7d,0xf2,0x7d,0xe3,0x7e,0x8, 0x27,0x4a,0x7e,0x34,0x0, 0x28,0xe4, +0x12,0x24,0x38,0x7e,0x8, 0x25,0xb9,0x7e,0x34,0x1, 0x90,0x12,0x24,0x38,0x7a,0xb3, +0x77,0x12,0x7e,0x34,0x22,0x6d,0x12,0x2a,0xa9,0x7a,0x37,0x25,0xb1,0x7a,0xe7,0x27, +0x4e,0x7a,0xf7,0x27,0x50,0x7a,0xe7,0x27,0x52,0x7a,0xe7,0x27,0x56,0x7a,0xe7,0x27, +0x5a,0x7a,0xe7,0x27,0x5e,0x7a,0xf7,0x27,0x54,0x7a,0xf7,0x27,0x58,0x7a,0xf7,0x27, +0x5c,0x7a,0xf7,0x27,0x60,0x7a,0xe7,0x25,0xb5,0x7a,0xf7,0x25,0xb7,0x7a,0xb3,0x27, +0x72,0x74,0x2, 0x7a,0xb3,0x27,0x49,0x22,0x74,0xfe,0x7a,0xb3,0x77,0x12,0xe4,0x7a, +0xb3,0x27,0x4a,0x22,0x74,0x9, 0xac,0xbe,0x49,0x35,0x6e,0x25,0x74,0x9, 0xac,0xbf, +0x49,0x25,0x27,0x75,0x9d,0x32,0x12,0x24,0x5a,0x7d,0xc3,0x74,0x9, 0xac,0xbe,0x49, +0x35,0x6e,0x23,0x74,0x9, 0xac,0xbf,0x49,0x25,0x27,0x73,0x9d,0x32,0x2, 0x24,0x5a, +0x7e,0xa0,0x5, 0x7e,0x70,0x4, 0xac,0x7f,0x19,0xa3,0x28,0xba,0x7e,0x70,0x9, 0xac, +0x7f,0x2e,0x34,0x27,0x73,0x7e,0x30,0x9, 0xac,0x3e,0x2e,0x14,0x6e,0x23,0x74,0x9, +0x2, 0x23,0x44,0x7e,0xa0,0x3, 0x7e,0x30,0x9, 0xac,0x3f,0x7e,0x1d,0x36,0x2d,0x31, +0x7a,0x1b,0xa0,0x7e,0x30,0x9, 0xac,0x3f,0x7e,0x1d,0x36,0x2d,0x31,0x22,0x74,0x9, +0xac,0xbf,0x7e,0x1d,0x36,0x22,0x74,0x9, 0xac,0xbe,0x49,0xc5,0x6e,0x23,0x7e,0x34, +0x21,0xde,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x40,0x9e,0x44,0x0, 0x14,0xbd,0xc4,0x22, +0x7a,0xb3,0x77,0xb5,0x7a,0xb3,0x77,0xb6,0x7a,0xb3,0x77,0xb9,0x74,0xff,0x7a,0xb3, +0x77,0xba,0xe4,0x7a,0xb3,0x77,0xbb,0x22,0x6d,0x33,0x7e,0xf, 0x78,0xf2,0x79,0x30, +0x0, 0x16,0x7e,0x34,0x1, 0x2c,0x7e,0xf, 0x78,0xf2,0x79,0x30,0x0, 0x18,0x22,0x7e, +0x70,0x9, 0xac,0x7e,0x9, 0xb3,0x6e,0x2a,0x9, 0x73,0x6e,0x2b,0x2, 0x9b,0x6a,0x6d, +0x22,0xa, 0xd, 0x7e,0x14,0x0, 0x40,0x9d,0x10,0x1a,0x2, 0x1a,0x0, 0x12,0x22,0xa3, +0x7f,0x71,0x22,0x7e,0x11,0x12,0x2e,0x10,0x8, 0xa5,0xe7,0xbe,0xb0,0x0, 0x22,0x49, +0x35,0x6e,0x25,0xbe,0x34,0x0, 0x14,0x22,0x7e,0x24,0x1b,0xd8,0xa, 0x3b,0x2d,0x32, +0x6d,0x22,0x2e,0x24,0x0, 0xff,0x7e,0x1b,0x30,0x22,0x7e,0x34,0x1, 0x0, 0x7d,0x16, +0x3e,0x14,0x2e,0x14,0x6f,0x77,0x6d,0x0, 0x7d,0x27,0x22,0x2d,0x35,0x29,0xb1,0x0, +0x8, 0xbe,0xb0,0x2d,0x22,0x7e,0x70,0x27,0xac,0x67,0x2e,0x34,0x28,0xe7,0x6d,0x22, +0x7e,0x8, 0x77,0x62,0x22,0x7e,0x50,0x9, 0xac,0x5f,0x2e,0x25,0x2c,0xb, 0x28,0x30, +0x49,0x22,0x0, 0x2, 0x22,0x7a,0x37,0x6d,0xb0,0x90,0x22,0xb, 0xe4,0x93,0x7a,0xb3, +0x6d,0xb2,0x22,0x49,0x35,0x6e,0x25,0xbe,0x34,0x0, 0x0, 0x22,0x2e,0x34,0x0, 0x8, +0x4, 0x7a,0x1b,0xb0,0x22,0x74,0x9, 0xac,0xbe,0x9, 0xb5,0x6e,0x2a,0x7e,0x70,0x9, +0xac,0x7e,0x22,0x6d,0x22,0xa, 0x1d,0x6d,0x0, 0x12,0x22,0xa3,0x2f,0x17,0x74,0x6, +0x22,0x7e,0x71,0x12,0x74,0x9, 0xac,0x7b,0x2e,0x34,0x27,0x73,0x6d,0x22,0x22,0x7e, +0x73,0x6f,0x3e,0xbc,0x7e,0x22,0xa9,0xd5,0xea,0xa9,0xc5,0xea,0x74,0x2, 0x7e,0x70, +0x7, 0x22,0x6c,0xaa,0x7e,0x70,0x4, 0xac,0x7f,0x19,0xa3,0x28,0xba,0x22,0x7a,0xb3, +0x77,0xb2,0x74,0xff,0x7a,0xb3,0x77,0xb3,0xe4,0x22,0x7e,0xa1,0x29,0x74,0x6, 0xa4, +0x7e,0xd, 0x32,0x2d,0x15,0x22,0x7c,0x1f,0x2e,0x10,0x8, 0xa5,0xe7,0x22,0x7e,0x27, +0x4a,0x6d,0x4e,0x50,0x20,0x7a,0x27,0x4a,0x6d,0x22,0x9e,0xc4,0x0, 0x14,0xbd,0x3c, +0x22,0x7a,0x37,0x6f,0x46,0x7e,0x34,0x21,0x63,0x22,0xb, 0xf5,0xb, 0x55,0xb, 0x15, +0x1b,0x34,0x22,0x7e,0xf4,0x21,0xec,0x7e,0xe4,0x0, 0xff,0x22,0x74,0x2, 0xac,0xbf, +0x9, 0x5, 0x63,0x6d,0x22,0x7e,0x3f,0x78,0xf2,0x69,0x33,0x0, 0x6, 0x22,0x74,0x9, +0xac,0xbe,0x49,0x45,0x6e,0x23,0x22,0x49,0x45,0x6e,0x25,0xbe,0x44,0x0, 0x14,0x22, +0x7e,0x1f,0x24,0x68,0x7a,0x37,0x4e,0x7f,0x22,0x9, 0xb5,0x29,0xb5,0x2, 0xd, 0x7, +0xd2,0x4, 0x12,0x3c,0x96,0x7c,0xbf,0x22,0x7e,0xb3,0x77,0x5f,0xbe,0xb0,0x1, 0x22, +0x7e,0xb3,0x76,0xc3,0xbe,0xb0,0xaa,0x22,0x7e,0x39,0xb0,0x14,0x7a,0x39,0xb0,0x22, +0xac,0x3b,0x7e,0x1d,0x32,0x2d,0x31,0x22,0x9d,0x32,0x12,0x24,0x5a,0x7d,0x13,0x22, diff --git a/drivers/input/touchscreen/FT8716/include/pramboot/FT8716_Pramboot_V0.5_20160723.i b/drivers/input/touchscreen/FT8716/include/pramboot/FT8716_Pramboot_V0.5_20160723.i new file mode 100755 index 0000000000000..8c27370a9170b --- /dev/null +++ b/drivers/input/touchscreen/FT8716/include/pramboot/FT8716_Pramboot_V0.5_20160723.i @@ -0,0 +1,246 @@ +0x2, 0x3, 0x83,0xca,0x39,0x12,0xf, 0x3c,0xda,0x39,0x32,0x2, 0x0, 0x3, 0x6d,0x22, +0x80,0x13,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x7a,0xb, +0xb0,0xb, 0x14,0xb, 0x24,0xbd,0x32,0x38,0xe9,0x22,0xff,0x2, 0xd, 0xf, 0xe5,0x33, +0xb4,0xc, 0xf, 0xc2,0x86,0xc2,0x87,0x7e,0x34,0x0, 0x64,0x12,0xe, 0x86,0xd2,0x86, +0xd2,0x87,0x22,0x2, 0x0, 0xf9,0xca,0x3b,0x7a,0xd, 0x10,0x7f,0x31,0xe5,0x24,0xb4, +0x80,0x2, 0x80,0x3, 0x2, 0x0, 0xdc,0x7f,0x13,0x5e,0x34,0x0, 0x7f,0x7d,0x23,0x7e, +0x34,0x0, 0x80,0x9d,0x32,0x7a,0x35,0x16,0x7e,0x35,0x14,0xbe,0x35,0x16,0x38,0x2, +0x80,0x5d,0x7e,0x35,0x16,0x7a,0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6, +0x7e,0x35,0x14,0x9e,0x35,0x16,0x7a,0x35,0x14,0x7e,0x35,0x16,0x6d,0x22,0x2f,0x31, +0x7e,0x1d,0x10,0x2e,0x35,0x16,0x7a,0x1d,0x10,0x80,0x27,0x7e,0x34,0x0, 0x80,0x7a, +0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6,0x7e,0x35,0x14,0x9e,0x34,0x0, +0x80,0x7a,0x35,0x14,0x7e,0x1d,0x10,0x2e,0x34,0x0, 0x80,0x7a,0x1d,0x10,0x2e,0x38, +0x0, 0x80,0x7e,0x35,0x14,0xbe,0x34,0x0, 0x80,0x50,0xd0,0x4d,0x33,0x68,0x26,0x7a, +0x35,0x18,0x7f,0x13,0x7e,0xd, 0x10,0x12,0xa, 0xe6,0x80,0x19,0x74,0x2, 0x12,0xa, +0x89,0x5e,0x70,0xf4,0x12,0xc, 0x86,0x7e,0x35,0x14,0x7a,0x35,0x18,0x7f,0x13,0x7e, +0xd, 0x10,0x12,0x8, 0xe, 0xd3,0xda,0x3b,0x22,0xa9,0xc0,0x93,0x75,0x39,0x0, 0x32, +0xf, 0x60,0xf0,0x9f,0x4c,0xf1,0xb3,0xe, 0xce,0xb9,0x31,0x46,0xff,0x0, 0xff,0x0, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x7c,0x6b,0xc2,0x2, 0xe5,0x22,0x14,0x78,0x3, 0x2, 0x2, 0xda,0x1b,0xb1,0x78,0x3, +0x2, 0x2, 0x3d,0x1b,0xb1,0x78,0x3, 0x2, 0x2, 0x89,0x1b,0xb1,0x78,0x3, 0x2, 0x2, +0x9a,0x1b,0xb1,0x78,0x3, 0x2, 0x2, 0xc1,0x24,0xf9,0x78,0x3, 0x2, 0x2, 0xd6,0x24, +0xaf,0x78,0x3, 0x2, 0x3, 0x3b,0x24,0xfd,0x68,0x3a,0x14,0x78,0x3, 0x2, 0x2, 0xdd, +0x14,0x78,0x3, 0x2, 0x2, 0xda,0x1b,0xb2,0x78,0x3, 0x2, 0x2, 0xda,0x24,0xda,0x68, +0x26,0x24,0xe6,0x68,0x1f,0x24,0xeb,0x68,0x3b,0x24,0xf3,0x78,0x3, 0x2, 0x2, 0xda, +0x24,0xe4,0x78,0x3, 0x2, 0x3, 0x46,0x14,0x78,0x3, 0x2, 0x2, 0xda,0x24,0x94,0x68, +0x3, 0x2, 0x3, 0x82,0x2, 0x3, 0x42,0xbe,0x60,0x4, 0x50,0xc, 0x75,0x3f,0x0, 0x7c, +0x16,0x2e,0x10,0x25,0x7c,0xb7,0xa5,0xf7,0xa5,0xbe,0x0, 0x2, 0x80,0x3, 0x2, 0x3, +0x82,0xd2,0x2, 0x22,0x7c,0xb6,0x24,0x0, 0x78,0x3, 0x2, 0x3, 0x82,0x1b,0xb1,0x68, +0x1e,0x14,0x68,0x1e,0x14,0x68,0x1e,0x14,0x68,0x1e,0xb, 0xb2,0x78,0x33,0x30,0x1, +0x7, 0x7e,0x8, 0x0, 0x44,0x2, 0x2, 0x5a,0x7e,0x8, 0x1, 0x50,0x2, 0x2, 0x5a,0x2, +0x2, 0xfb,0x2, 0x3, 0x2, 0x2, 0x3, 0x1a,0xa, 0x27,0x7e,0xd, 0x3a,0xb, 0x16,0xb, +0xa, 0x30,0x2d,0x32,0x1b,0xa, 0x30,0x6d,0x33,0x7e,0xd, 0x3a,0x79,0x30,0x0, 0x6, +0x22,0x7c,0xb7,0x62,0x3f,0x7e,0x2d,0x3a,0x2e,0x54,0x0, 0x6, 0xb, 0x2a,0x20,0x7d, +0x12,0xb, 0x14,0x1b,0x2a,0x10,0x7e,0xd, 0x3a,0x2d,0x12,0x39,0x70,0x0, 0x8, 0x7e, +0xd, 0x3a,0x69,0x50,0x0, 0x4, 0x69,0x20,0x0, 0x6, 0xbd,0x25,0x50,0x3, 0x2, 0x3, +0x82,0xb2,0x1, 0x7a,0xd, 0x34,0x7e,0x34,0x0, 0x2, 0x2, 0x3, 0x7f,0x7c,0xb6,0x1b, +0xb1,0x68,0x1d,0x14,0x68,0x1d,0xb, 0xb1,0x68,0x3, 0x2, 0x3, 0x82,0x30,0x1, 0x6, +0x7e,0x8, 0x0, 0x44,0x80,0x4, 0x7e,0x8, 0x1, 0x50,0x7a,0xd, 0x3a,0x2, 0x2, 0xf3, +0x2, 0x2, 0xfb,0xa, 0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, +0x20,0x2f,0x12,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x7e,0x1d,0x3a,0x7a,0x1d,0x34, +0xd2,0x2, 0x7e,0x34,0x0, 0x1, 0x2, 0x3, 0x7f,0xbe,0x60,0x1, 0x68,0x9, 0xa5,0xbe, +0x2, 0x5, 0x7a,0x71,0x3e,0xd2,0x3, 0xd2,0x2, 0x22,0x75,0xe6,0x0, 0xe4,0x7e,0x34, +0x1, 0x4, 0x7e,0x24,0x0, 0xff,0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x5, 0x7a,0x1b,0xb0, +0x7e,0x34,0x1, 0x8, 0x7a,0x1b,0xb0,0x7e,0x34,0x1, 0x9, 0x7a,0x1b,0xb0,0xd2,0x4, +0x22,0xa5,0xbe,0x1, 0x4, 0x7a,0x71,0x38,0x22,0xa5,0xbe,0x2, 0x2, 0x80,0x3, 0x2, +0x3, 0x82,0x7a,0x71,0x23,0x22,0x7a,0x71,0x33,0x22,0xd2,0x2, 0x22,0x7c,0xb6,0x1b, +0xb1,0x68,0x18,0x14,0x68,0x1c,0x14,0x68,0x31,0x14,0x68,0x3a,0xb, 0xb2,0x68,0x3, +0x2, 0x3, 0x82,0xa, 0x37,0x7d,0x3, 0x6d,0x11,0x80,0x59,0xa, 0x57,0x7c,0xab,0xe4, +0x80,0x2, 0xa, 0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20, +0x2f,0x12,0x79,0x30,0x0, 0x2, 0x1b,0xa, 0x20,0x22,0x7c,0x67,0x6c,0x77,0x7e,0xd, +0x3a,0x79,0x30,0x0, 0x4, 0x22,0xa, 0x27,0x7e,0xd, 0x3a,0xb, 0x16,0xb, 0xa, 0x30, +0x2d,0x32,0x1b,0xa, 0x30,0x7e,0x34,0x0, 0x3, 0x80,0x44,0x7e,0x34,0x0, 0x4, 0x7a, +0x35,0x2f,0x75,0x3f,0x0, 0x22,0x1b,0x61,0x68,0x15,0xb, 0x60,0x78,0x34,0x7c,0x27, +0x6c,0x33,0x6d,0x0, 0x7e,0x1d,0x3a,0x79,0x11,0x0, 0x2, 0x1b,0x1a,0x0, 0x22,0xa, +0x57,0x6d,0x44,0x7e,0xd, 0x3a,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x2f,0x12,0x79, +0x30,0x0, 0x2, 0x1b,0xa, 0x20,0xe4,0x7a,0xb3,0x2, 0xe4,0x7e,0x34,0x0, 0x5, 0x7a, +0x35,0x2f,0x22,0x75,0x84,0x1, 0x7e,0x44,0x1f,0xff,0xe4,0x7a,0x49,0xb0,0x1b,0x44, +0x78,0xf9,0x7e,0xf8,0x2, 0xe8,0xd2,0x7, 0xc2,0x8, 0x75,0x3f,0x0, 0x75,0x40,0x87, +0x75,0x41,0xa6,0x75,0x42,0x0, 0x75,0x43,0x0, 0xd2,0x0, 0xc2,0x2, 0xc2,0x3, 0xc2, +0x4, 0x75,0x22,0x0, 0x75,0x23,0x0, 0x75,0x24,0x80,0x75,0x2f,0x0, 0x75,0x30,0x0, +0x75,0x31,0x0, 0x75,0x32,0x0, 0x75,0x33,0x0, 0x75,0x38,0xb, 0x75,0x39,0x0, 0x75, +0x3e,0x1, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0xf, 0x50,0xb, 0xa, 0x40,0x5d,0x44,0x68, +0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29, +0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x4, 0x20,0xff,0xff, +0x56,0x30,0x2e,0x35,0x4a,0x75,0x6c,0x20,0x32,0x33,0x20,0x32,0x30,0x31,0x36,0x0, +0x46,0x54,0x53,0x38,0x37,0x31,0x36,0x5f,0x70,0x72,0x61,0x6d,0x62,0x6f,0x6f,0x74, +0x12,0xe, 0x63,0x2, 0x5, 0xbc,0x7e,0x35,0x2f,0x1b,0x34,0x68,0x60,0x1b,0x35,0x78, +0x3, 0x2, 0x4, 0xbc,0x1b,0x34,0x78,0x3, 0x2, 0x4, 0xe6,0x1b,0x34,0x78,0x3, 0x2, +0x5, 0x96,0x2e,0x34,0x0, 0x3, 0x68,0x3, 0x2, 0x5, 0xa8,0x6d,0x33,0x7a,0x35,0x2f, +0x7a,0x35,0x31,0x30,0x7, 0x5, 0x12,0x0, 0x2e,0xc2,0x7, 0x7e,0xd, 0x34,0x69,0x30, +0x0, 0x4, 0x7a,0x35,0x14,0x69,0x30,0x0, 0x2, 0xb, 0xa, 0x20,0x2e,0x14,0x0, 0x8, +0x12,0x0, 0x46,0xd2,0x7, 0x7e,0x2d,0x34,0x69,0x12,0x0, 0x4, 0x69,0x32,0x0, 0x2, +0xb, 0x2a,0x20,0x12,0xb, 0xe2,0x2e,0x34,0x10,0x0, 0x2, 0x5, 0x91,0x6d,0x33,0x7a, +0x35,0x2f,0x7e,0x34,0x1, 0x0, 0x7a,0x35,0x15,0x7e,0xd, 0x34,0x69,0x30,0x0, 0x2, +0xb, 0xa, 0x20,0x2e,0x14,0x0, 0x8, 0x12,0xe, 0xf2,0x20,0x0, 0x3, 0x2, 0x5, 0xa8, +0x7e,0x1d,0x34,0x29,0xb1,0x0, 0x8, 0xf5,0x91,0x2, 0x5, 0xa8,0x6d,0x33,0x7a,0x35, +0x2f,0x7a,0x35,0x31,0x7e,0x18,0x0, 0x3f,0x7a,0x1d,0xe, 0x7e,0xd, 0x34,0x69,0x30, +0x0, 0x2, 0xb, 0xa, 0x20,0x69,0x10,0x0, 0x4, 0x12,0x7, 0x62,0x12,0x0, 0x2e,0x7e, +0x34,0xf0,0x55,0x2, 0x5, 0x91,0x7e,0x18,0x10,0x0, 0x7a,0x1d,0x8, 0xd2,0x5, 0x6d, +0x33,0x7a,0x35,0x2f,0x7a,0x35,0x31,0xe5,0x38,0xb4,0xa, 0x17,0xe5,0x24,0xb4,0x80, +0xc, 0xe4,0x12,0xc, 0xd1,0x74,0x1, 0x12,0xc, 0xd1,0x2, 0x5, 0x7f,0x12,0x8, 0xa4, +0x2, 0x5, 0x7f,0xe5,0x38,0xb4,0xb, 0x27,0xe5,0x24,0xb4,0x80,0x11,0x7e,0xf0,0x1, +0x7c,0xbf,0x12,0x5, 0xc3,0xb, 0xf0,0xbe,0xf0,0x11,0x78,0xf4,0x80,0x51,0x7e,0xf0, +0x4, 0x7c,0xbf,0x12,0x5, 0xc3,0xb, 0xf0,0xbe,0xf0,0x40,0x78,0xf4,0x80,0x40,0xe5, +0x38,0xa, 0x3b,0x9e,0x34,0x0, 0x80,0x7c,0xe7,0xe5,0x24,0xb4,0x80,0x10,0xa, 0x3e, +0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x8, 0x80,0xe, 0xa, 0x3e, +0x6d,0x22,0x74,0xa, 0x2f,0x11,0x14,0x78,0xfb,0x7a,0x1d,0x8, 0x6c,0xdd,0x80,0x9, +0x7c,0xbe,0x12,0x5, 0xc3,0xb, 0xe0,0xb, 0xd0,0xe5,0x23,0xbc,0xbd,0x38,0xf1,0x7e, +0x1d,0x8, 0x12,0xe, 0xd, 0x92,0x5, 0x12,0x0, 0x2e,0x30,0x5, 0x1b,0x7e,0x34,0xf0, +0xaa,0x7a,0x35,0x31,0x80,0x12,0x6d,0x33,0x7a,0x35,0x2f,0x7a,0x35,0x31,0x7e,0xd, +0x34,0x69,0x30,0x0, 0x2, 0x12,0x6, 0x98,0x30,0x4, 0x11,0x7e,0x34,0x13,0x88,0x12, +0xe, 0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0x75,0xe9,0xff,0x30,0x8, 0x3, 0x2, +0x4, 0x26,0x22,0xca,0xf8,0x7c,0xfb,0xe5,0x24,0xb4,0x80,0x4a,0xd2,0x6, 0x12,0xe, +0xdf,0x74,0x20,0xca,0xb8,0xa, 0x3f,0x6d,0x22,0x74,0xc, 0x2f,0x11,0x14,0x78,0xfb, +0xda,0xb8,0x12,0xd, 0xb3,0xa9,0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, +0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4, +0x38,0x6, 0x12,0xf, 0x4d,0x2, 0x6, 0x95,0xc2,0x86,0x7e,0x34,0x13,0x88,0x12,0xe, +0x86,0xd2,0x86,0x2, 0x6, 0x95,0x74,0x1, 0x12,0xa, 0x21,0x74,0x1, 0x6d,0x33,0x12, +0xc, 0x86,0xe4,0x12,0xa, 0x89,0x5e,0x34,0x80,0x0, 0x7c,0x4f,0x6c,0x55,0x3e,0x24, +0x4d,0x32,0x12,0xc, 0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, 0x86,0x7e,0x34,0x0, 0x50, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x51, +0x12,0xc, 0x86,0x7e,0x34,0xa2,0x1c,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x11, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x10, +0x12,0xc, 0x86,0x7e,0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, +0x86,0x7e,0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, 0x21,0x74,0x4, 0x7e,0x34, +0xff,0xf7,0x12,0xc, 0x86,0xda,0xf8,0x22,0xca,0xf8,0xe4,0x7a,0xb3,0x2, 0xe4,0xe5, +0x24,0xbe,0xb0,0x80,0x68,0x9, 0x74,0x1, 0x7a,0xb3,0x2, 0xe4,0x2, 0x7, 0x5f,0xbe, +0x34,0xff,0xff,0x68,0x6, 0xbe,0x34,0x0, 0x12,0x50,0x4, 0x7e,0x34,0x0, 0x12,0x7d, +0x13,0x6d,0x0, 0x74,0xc, 0x2f,0x0, 0x14,0x78,0xfb,0x7a,0xd, 0xc, 0x7c,0xb7,0x12, +0x5, 0xc3,0x7e,0x1d,0xc, 0x12,0xe, 0xd, 0xe4,0x33,0x7c,0xfb,0xbe,0xf0,0x1, 0x78, +0xa, 0x7e,0xb3,0x2, 0xe4,0x44,0x2, 0x7a,0xb3,0x2, 0xe4,0x6c,0xaa,0xa, 0x3a,0x19, +0xa3,0x2, 0xdc,0xb, 0xa0,0xbe,0xa0,0x8, 0x78,0xf3,0x7e,0x34,0x0, 0x8, 0x7a,0x35, +0x14,0x7e,0x1d,0xc, 0x7e,0x8, 0x2, 0xdc,0x12,0x0, 0x46,0x6c,0xaa,0xe4,0xa, 0x4a, +0x19,0xb4,0x2, 0xdc,0xb, 0xa0,0xbe,0xa0,0x8, 0x78,0xf3,0x7e,0x34,0x0, 0x8, 0x7a, +0x35,0x15,0x7e,0x1d,0xc, 0x7e,0x8, 0x2, 0xdc,0x12,0xe, 0xf2,0x7e,0xf0,0x1, 0x6c, +0xaa,0xa, 0x3a,0x9, 0xb3,0x2, 0xdc,0xbc,0xba,0x68,0x4, 0x6c,0xff,0x80,0x7, 0xb, +0xa0,0xbe,0xa0,0x8, 0x40,0xeb,0xbe,0xf0,0x1, 0x78,0xa, 0x7e,0xb3,0x2, 0xe4,0x44, +0x4, 0x7a,0xb3,0x2, 0xe4,0x7e,0xb3,0x2, 0xe4,0x44,0x1, 0x7a,0xb3,0x2, 0xe4,0xda, +0xf8,0x22,0xca,0x3b,0x7a,0x15,0xc, 0x7f,0x31,0x75,0x12,0x0, 0x7e,0x35,0xc, 0xbe, +0x34,0x0, 0x0, 0x38,0x4f,0x7e,0x34,0xff,0xff,0x7a,0x35,0xc, 0x75,0x12,0x1, 0x80, +0x43,0x7e,0x34,0x0, 0x80,0x7a,0x35,0x15,0x7f,0x13,0x7e,0x8, 0x2, 0x5c,0x12,0xe, +0xf2,0x7e,0x35,0xc, 0x9e,0x34,0x0, 0x80,0x7a,0x35,0xc, 0x2e,0x38,0x0, 0x80,0x6d, +0x33,0x7a,0x35,0x13,0x7e,0x35,0x13,0x9, 0x63,0x2, 0x5c,0x7e,0xd, 0xe, 0x7e,0xb, +0x70,0x6c,0x76,0x7a,0xb, 0x70,0x7e,0x35,0x13,0xb, 0x34,0x7a,0x35,0x13,0xbe,0x34, +0x0, 0x80,0x78,0xe0,0x7e,0x35,0xc, 0xbe,0x34,0x0, 0x80,0x38,0xb4,0xe5,0x12,0x60, +0x5, 0xb, 0x34,0x7a,0x35,0xc, 0x7e,0x35,0xc, 0x7a,0x35,0x15,0x7f,0x13,0x7e,0x8, +0x2, 0x5c,0x12,0xe, 0xf2,0x6d,0x33,0x80,0x17,0x7e,0x35,0x13,0x9, 0x63,0x2, 0x5c, +0x7e,0xd, 0xe, 0x7e,0xb, 0x70,0x6c,0x76,0x7a,0xb, 0x70,0x7e,0x35,0x13,0xb, 0x34, +0x7a,0x35,0x13,0x7e,0x35,0xc, 0xbe,0x35,0x13,0x38,0xde,0xda,0x3b,0x22,0xca,0x3b, +0x7f,0x30,0x7c,0xb6,0xf5,0x1a,0x7c,0xb7,0xf5,0x1b,0x74,0x1, 0x7e,0x35,0x18,0x1e, +0x34,0x1b,0x34,0x4e,0x60,0x80,0x12,0xc, 0x86,0x12,0xa, 0x21,0xa9,0xc2,0xb4,0xa9, +0xc6,0xb3,0x75,0xb5,0x2, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x85,0x1a,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x85,0x1b,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x6d,0x33,0x80,0x2a,0x7f,0x13, +0x2e,0x35,0x1c,0x7e,0x1b,0xb0,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e, +0x35,0x1c,0x5e,0x34,0x0, 0x1, 0xbe,0x34,0x0, 0x1, 0x78,0x7, 0x7e,0x34,0x0, 0x78, +0x12,0xe, 0x86,0x7e,0x35,0x1c,0xb, 0x34,0x7a,0x35,0x1c,0x7e,0x35,0x18,0xbe,0x35, +0x1c,0x38,0xcb,0xa9,0xd2,0xb4,0x7e,0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, +0x21,0xda,0x3b,0x22,0xe5,0x24,0xb4,0x80,0x16,0xd2,0x6, 0x12,0xe, 0xdf,0xa9,0xc2, +0xb4,0x74,0x60,0x12,0xf, 0x27,0xa9,0xd2,0xb4,0x12,0xe, 0xca,0x40,0xfb,0x22,0x74, +0x1, 0x12,0xa, 0x21,0xe4,0x6d,0x33,0x12,0xc, 0x86,0x74,0x1, 0x6d,0x33,0x12,0xc, +0x86,0x74,0x4, 0x6d,0x33,0x12,0xc, 0x86,0x7e,0x34,0x0, 0x54,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x55,0x12,0xc, 0x86,0x7e, +0x34,0xa2,0x1c,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x15,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0xa0,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x14,0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x19,0x12,0xe, 0x86,0x74,0x4, 0x7e,0x34,0x0, 0x4, 0x12,0xc, 0x86,0x7e, +0x34,0x0, 0x5, 0x12,0xe, 0x86,0xe4,0x12,0xa, 0x21,0x74,0x4, 0x7e,0x34,0xff,0xf7, +0x2, 0xc, 0x86,0x7c,0x7b,0x7e,0xa0,0xef,0xe5,0x22,0x24,0xfd,0x68,0x3c,0x1b,0xb1, +0x68,0x26,0x24,0x9f,0x68,0x41,0x1b,0xb2,0x68,0x42,0x24,0x9e,0x68,0x39,0x24,0xe3, +0x68,0x52,0x24,0x59,0x78,0x52,0xa5,0xbf,0x0, 0x5, 0x7e,0xa1,0x40,0x80,0x49,0xa5, +0xbf,0x1, 0x45,0x7e,0xa1,0x41,0x80,0x40,0xa5,0xbf,0x0, 0x5, 0x7e,0xa1,0x24,0x80, +0x37,0xa5,0xbf,0x1, 0x33,0x7e,0xa1,0x3e,0x80,0x2e,0xa, 0x17,0x7e,0x1d,0x3a,0x2d, +0x31,0x29,0xa1,0x0, 0x8, 0x80,0x21,0x7e,0xa1,0x3f,0x80,0x1c,0xa5,0xbf,0x0, 0x9, +0x7e,0x35,0x31,0xa, 0x56,0x7c,0xab,0x80,0xf, 0xa5,0xbf,0x1, 0xb, 0x7e,0x55,0x31, +0x7c,0xab,0x80,0x4, 0x7e,0xa3,0x2, 0xe4,0x7c,0xba,0x22,0xca,0x79,0x6c,0xee,0x7e, +0xf0,0x70,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x30,0x8, 0x31,0x7e,0x34,0x0, 0x2, +0x7a,0x35,0x15,0x9f,0x11,0x7e,0x8, 0x0, 0xc, 0x12,0xe, 0xf2,0xe5,0xc, 0xbe,0xb0, +0xff,0x68,0x1a,0xe5,0xc, 0x60,0x16,0xe5,0xd, 0xa, 0x2b,0xe5,0xc, 0xa, 0x3b,0x2d, +0x32,0xbe,0x34,0x0, 0xff,0x78,0x6, 0x7e,0xf1,0xc, 0x7e,0xe0,0x1, 0x4c,0xee,0x78, +0x1c,0xa9,0xd1,0xcb,0xd2,0xcc,0x12,0xc, 0x35,0x7c,0xfb,0xc2,0xcc,0xa9,0xc1,0xcb, +0xbe,0xf0,0x2, 0x40,0x5, 0xbe,0xf0,0xfd,0x28,0x3, 0x7e,0xf0,0x70,0x7c,0xbf,0x54, +0xfe,0xf5,0x92,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xd2,0xad,0xda,0x79, +0x22,0xca,0x79,0xbe,0xb0,0x0, 0x28,0x2e,0x74,0x6, 0x12,0xa, 0x89,0x7d,0x73,0x6c, +0xff,0x7e,0xf0,0xa5,0x7d,0x37,0x12,0xc, 0x86,0x6c,0xff,0x7e,0xf0,0xf, 0x7d,0x37, +0x12,0xc, 0x86,0x6c,0xff,0x7e,0xf0,0x6a,0x7d,0x37,0x12,0xc, 0x86,0x7e,0x34,0x0, +0x5, 0x12,0xe, 0x86,0x80,0x30,0x74,0x1, 0x7e,0x34,0xdf,0xff,0x12,0xc, 0x86,0x74, +0x6, 0x12,0xa, 0x89,0x7d,0x73,0x6c,0xff,0x7d,0x37,0x12,0xc, 0x86,0x7d,0x37,0x12, +0xc, 0x86,0x7d,0x37,0x12,0xc, 0x86,0x74,0x2, 0x12,0xa, 0x89,0x7d,0x73,0x4e,0xf0, +0x1, 0x7d,0x37,0x12,0xc, 0x86,0xda,0x79,0x22,0xa9,0xc2,0xb4,0xa9,0xc6,0xb3,0x75, +0xb5,0x5, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0x71,0xb5,0x75,0xb5,0x0, +0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7e,0xa1,0xb5,0xa9,0xd2,0xb4,0x7c,0x47,0x6c, +0x55,0xa, 0x3a,0x4d,0x32,0x22,0x7f,0x70,0xd2,0x6, 0x12,0xe, 0xdf,0x74,0x2, 0x12, +0xd, 0xb3,0x6d,0x33,0x80,0x12,0x7f,0x7, 0x2d,0x13,0x7e,0xb, 0xb0,0xf5,0xb5,0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xb, 0x34,0x7e,0x25,0x18,0xbd,0x23,0x38,0xe7,0xa9, +0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, 0x7e,0x35,0x42,0xbe,0x34,0x1, +0xf4,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x1, 0xf4,0x38,0x3, 0x2, 0xf, 0x4d,0xc2, +0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0xd2,0x86,0x22,0xa9,0xd1,0xcb,0xd2,0xcc, +0x7e,0x34,0x0, 0x4, 0x7e,0x8, 0x2, 0x5c,0x74,0xc, 0x12,0xb, 0x8f,0xa9,0xd1,0xcb, +0xc2,0xcc,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x7e,0x8, 0x2, 0x5c,0x2d,0x13,0xb, +0xa, 0x30,0x7d,0x23,0x7c,0x45,0x6c,0x55,0xa, 0x36,0x4d,0x32,0x1b,0xa, 0x30,0xb, +0xa0,0xbe,0xa0,0xc, 0x78,0xde,0x7e,0x37,0x2, 0x6c,0x7d,0x23,0xa, 0x54,0x7c,0xa7, +0xb4,0xe7,0xb, 0xbe,0xa0,0x16,0x78,0x6, 0x75,0x40,0xe7,0x75,0x41,0xa6,0x22,0x7e, +0x24,0x0, 0x1, 0x7e,0x7f,0x2, 0xe5,0x79,0x27,0x0, 0x6, 0x7e,0x7f,0x2, 0xe5,0x69, +0x27,0x0, 0x6, 0x4d,0x22,0x78,0xf4,0x5e,0x60,0x7f,0x1b,0x7a,0x30,0x7e,0x1f,0x2, +0xe5,0x69,0x31,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6c,0xaa,0x80,0x20,0x6d,0x44,0x7e, +0x1f,0x2, 0xe5,0x1b,0x1a,0x40,0x7e,0x1f,0x2, 0xe5,0x69,0x41,0x0, 0x8, 0x4d,0x44, +0x68,0xf4,0x69,0x41,0x0, 0x2, 0x1b,0xa, 0x40,0xb, 0x15,0xb, 0xa0,0xbc,0xba,0x38, +0xdc,0x22,0x6d,0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31, +0x7d,0x12,0x6d,0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50, +0x2, 0xa5,0xf, 0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, +0x6d,0x22,0x7d,0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40, +0x4, 0xbd,0x4, 0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31, +0x7d,0x10,0x6d,0x0, 0x22,0x7e,0x34,0x0, 0x2, 0x7e,0xf, 0x2, 0xe5,0x79,0x30,0x0, +0x4, 0x7e,0x34,0x0, 0x1, 0x7e,0xf, 0x2, 0xe5,0x79,0x30,0x0, 0x6, 0x7e,0xf, 0x2, +0xe5,0x69,0x30,0x0, 0x6, 0x4d,0x33,0x78,0xf4,0x7e,0x34,0x0, 0x4, 0x1b,0xa, 0x30, +0x7e,0xf, 0x2, 0xe5,0x69,0x30,0x0, 0x8, 0x4d,0x33,0x68,0xf4,0x6d,0x33,0x1b,0xa, +0x30,0x7e,0x1f,0x2, 0xe5,0x69,0x11,0x0, 0x8, 0x4d,0x11,0x68,0xf4,0x69,0x51,0x0, +0x2, 0x5e,0x54,0x0, 0xfe,0x22,0x7d,0x23,0xa, 0x36,0x7c,0xa5,0xa9,0xc2,0xb4,0xa9, +0xc6,0xb3,0x75,0xb5,0x1, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9, +0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x75,0xb5,0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0x7a,0x71,0xb5,0xa9,0x36,0xb3,0xfc, +0xa9,0xc6,0xb3,0x7a,0xa1,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xa9,0xd2,0xb4, +0x22,0x7c,0xab,0xd2,0x6, 0x12,0xe, 0xdf,0x74,0xd8,0xa, 0x3a,0x7d,0x23,0x6d,0x33, +0x12,0xd, 0xb3,0xa9,0xd2,0xb4,0x12,0xf, 0x32,0x12,0xe, 0xca,0x50,0x9, 0x7e,0x35, +0x42,0xbe,0x34,0x5, 0xdc,0x28,0xf2,0x7e,0x35,0x42,0xbe,0x34,0x5, 0xdc,0x38,0x3, +0x2, 0xf, 0x4d,0xc2,0x86,0x7e,0x34,0x13,0x88,0x12,0xe, 0x86,0xd2,0x86,0x22,0xca, +0x2b,0xca,0x1b,0xca,0xb, 0xd2,0x0, 0x30,0x90,0x1c,0xc2,0x90,0x7e,0x71,0x91,0xe5, +0x39,0x70,0x3, 0x7a,0x71,0x22,0xe5,0x39,0x12,0x1, 0x20,0x5, 0x39,0x30,0x2, 0x6, +0xe4,0x12,0x9, 0x33,0xf5,0x91,0x30,0x91,0xb, 0xc2,0x91,0x5, 0x39,0xe5,0x39,0x12, +0x9, 0x33,0xf5,0x91,0xda,0xb, 0xda,0x1b,0xda,0x2b,0x32,0xd2,0x6, 0x12,0xe, 0xdf, +0xa9,0xc2,0xb4,0x74,0x9f,0x12,0xf, 0x27,0x12,0xf, 0xe, 0xa9,0xd2,0xb4,0x60,0x3, +0xb4,0xff,0x1a,0x75,0x24,0x81,0xa9,0xd5,0xca,0xa9,0xd0,0xca,0x75,0xed,0x9f,0x75, +0xad,0x20,0xa9,0xd1,0xea,0xa9,0xc1,0xea,0x74,0x1, 0x2, 0xd, 0xe0,0x2, 0xd, 0x80, +0xd2,0x6, 0x12,0xe, 0xdf,0xa9,0xc2,0xb4,0x74,0x5, 0x12,0xf, 0x27,0x12,0xf, 0xe, +0x7c,0xab,0xa9,0xd2,0xb4,0xd2,0x6, 0x12,0xe, 0xdf,0x5e,0xa0,0xe3,0xa9,0xc2,0xb4, +0x74,0x1, 0x12,0xf, 0x27,0x7c,0xba,0x12,0xf, 0x27,0xa9,0xd2,0xb4,0x12,0xe, 0xca, +0x40,0xfb,0x22,0x7c,0xab,0x7d,0x12,0x7c,0xb3,0xf5,0x1c,0x7c,0x36,0x7c,0x25,0xa, +0x4, 0x7c,0xb3,0xf5,0x1b,0x7c,0xb7,0xf5,0x1a,0xa9,0xc2,0xb4,0x7c,0xba,0x12,0xf, +0x27,0xe5,0x1c,0x12,0xf, 0x27,0xe5,0x1b,0x12,0xf, 0x27,0xe5,0x1a,0x2, 0xf, 0x27, +0xca,0xf8,0x7c,0xfb,0xe5,0x24,0xb4,0x81,0x21,0x74,0x2, 0x12,0xa, 0x89,0x4c,0xff, +0x78,0x8, 0xa9,0xc0,0xca,0x5e,0x70,0xdf,0x80,0x6, 0xa9,0xd0,0xca,0x4e,0x70,0x20, +0x74,0x2, 0x12,0xc, 0x86,0x74,0x2, 0x12,0xa, 0x89,0xda,0xf8,0x22,0xd2,0x6, 0x7e, +0x14,0x0, 0x8, 0x7a,0x15,0x15,0x7e,0x8, 0x2, 0xdc,0x12,0xe, 0xf2,0x6c,0xaa,0xa, +0x3a,0x9, 0xb3,0x2, 0xdc,0xbe,0xb0,0xff,0x68,0x4, 0xc2,0x6, 0x80,0x7, 0xb, 0xa0, +0xbe,0xa0,0x8, 0x40,0xea,0xa2,0x6, 0x22,0x7d,0x52,0xf5,0x19,0x7c,0xb6,0x7c,0xa5, +0xa, 0x44,0xf5,0x18,0x7f,0x21,0xf5,0x17,0xa9,0xc2,0xb4,0x74,0xb, 0x12,0xf, 0x27, +0xe5,0x19,0x12,0xf, 0x27,0xe5,0x18,0x12,0xf, 0x27,0xe5,0x17,0x12,0xf, 0x27,0xe4, +0x2, 0xf, 0x27,0x12,0xe, 0xa9,0x12,0xb, 0x3b,0xa9,0xa6,0x94,0xb3,0x92,0x8, 0x30, +0x8, 0x6, 0x12,0xf, 0x1b,0x12,0xd, 0x4b,0x12,0x9, 0xab,0x12,0xf, 0x0, 0xd2,0xaf, +0x30,0x3, 0xfd,0x2, 0xf, 0x45,0x80,0x18,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe5,0x3e,0x70,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xe0,0x22,0xd2,0xcf,0x85,0x3e,0xcc,0x75,0xec, +0xff,0x75,0xee,0xff,0x75,0xeb,0x3, 0x75,0xac,0xc0,0xa9,0xc5,0xca,0x75,0xed,0xf, +0x75,0xad,0xb0,0xa9,0xd7,0x94,0xa9,0xd4,0x94,0x22,0xa9,0xc2,0xb4,0x74,0x5, 0x12, +0xf, 0x27,0x12,0xf, 0xe, 0xa9,0xd2,0xb4,0x30,0xe0,0x2, 0xd3,0x22,0xc3,0x22,0xa9, +0xc2,0xb4,0x30,0x6, 0x4, 0x74,0x6, 0x80,0x2, 0x74,0x4, 0x12,0xf, 0x27,0xa9,0xd2, +0xb4,0x22,0x12,0xe, 0x38,0x7e,0x35,0x15,0x12,0x0, 0xe, 0xa9,0xd2,0xb4,0xd3,0x22, +0xc2,0x8c,0x43,0x89,0x2, 0x75,0x8c,0x1, 0x75,0x8a,0x0, 0xd2,0xa9,0x22,0x75,0xb5, +0x0, 0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3,0xe5,0xb5,0x22,0xd2,0xc8,0x75,0xb3,0x13, +0xa9,0xd1,0xb4,0xa9,0xc0,0xb4,0x22,0xf5,0xb5,0xa9,0x36,0xb3,0xfc,0xa9,0xc6,0xb3, +0xd3,0x22,0xc2,0x8c,0x6d,0x33,0x7a,0x35,0x42,0xd2,0x8c,0x22,0x7e,0x35,0x42,0xb, +0x34,0x7a,0x35,0x42,0x22,0x85,0x3e,0xcc,0xe5,0x3e,0x2, 0xd, 0xe0,0x2, 0xf, 0x3c, +0x0, 0x1, 0x2, 0xe4,0x0, 0x0, 0x4, 0x2, 0xe5,0x0, 0x0, 0x9c,0x0, 0x0, 0x0, 0xff, diff --git a/drivers/input/touchscreen/GT915L/FW_BIEL.txt b/drivers/input/touchscreen/GT915L/FW_BIEL.txt new file mode 100644 index 0000000000000..17543129fde2c --- /dev/null +++ b/drivers/input/touchscreen/GT915L/FW_BIEL.txt @@ -0,0 +1,11265 @@ + 0x00,0x01,0x60,0x00,0x39,0x31,0x35,0x4C,0x00,0x00,0x00,0x00,0x80,0x02,0x80,0x00, + + 0x55,0x40,0xBD,0xDA,0xFD,0x24,0x34,0xDF,0x44,0x40,0xAF,0xF7,0x3A,0x7D,0xC8,0xB4, + + 0x25,0x41,0x8C,0x90,0x10,0xFB,0x22,0xB7,0xED,0x5E,0x08,0xB0,0x59,0x95,0x01,0x88, + + 0x86,0x02,0x72,0xFC,0x81,0xD9,0x39,0x25,0xC8,0xE2,0x39,0x87,0x57,0x45,0x09,0x05, + + 0x87,0x03,0xE9,0xD5,0x5F,0x2E,0x23,0xB6,0x6D,0x4B,0x36,0x4B,0x0C,0x9E,0x77,0xA2, + + 0x69,0x0B,0xB8,0x76,0xC3,0x50,0x10,0x13,0xC6,0x75,0xEA,0x3F,0xE5,0xE9,0x77,0xF5, + + 0xF8,0x0D,0xF5,0x4A,0xB0,0xA0,0x89,0x83,0xCF,0x48,0x48,0xDE,0x53,0x49,0x40,0x3E, + + 0xFE,0xF9,0xB9,0x77,0xE2,0xB9,0x2F,0x67,0x2B,0x22,0xFA,0x8E,0x62,0x22,0xCF,0xDB, + + 0x80,0xC7,0xDA,0xAF,0x07,0x28,0x27,0x93,0x6F,0x4A,0xAC,0x75,0xC8,0x30,0xC0,0xAC, + + 0x2C,0x48,0x98,0x22,0x39,0xB8,0x96,0xDE,0xC8,0x68,0x4D,0x24,0x76,0x2E,0x9A,0xBC, + + 0x2F,0x49,0xC2,0x8F,0xF8,0x26,0x3A,0x11,0xA8,0x2F,0xEA,0xE3,0xB6,0x28,0x4F,0x43, + + 0xC0,0xD3,0x43,0x5C,0x7B,0x2C,0xEB,0x21,0x17,0xC5,0x61,0xEB,0x7A,0x26,0xC8,0xD8, + + 0x2A,0x6E,0xEB,0xDD,0x5B,0x24,0xAF,0xD3,0x8A,0xAB,0x6E,0x3C,0x9D,0x5F,0x2C,0xAA, + + 0xAD,0x4D,0xFD,0x7E,0x6A,0xB3,0xC2,0xA8,0x52,0x71,0xD2,0x55,0xAB,0x18,0x24,0xBA, + + 0xBE,0x4C,0xE5,0x76,0xB8,0x59,0x22,0x70,0xAE,0x0C,0xF5,0x86,0xB2,0x62,0xEF,0xC3, + + 0x71,0xFE,0x7A,0x53,0x39,0xAB,0x45,0x6F,0x79,0x8A,0xAB,0x7F,0x07,0xB2,0xE3,0x8A, + + 0x7A,0x0C,0xB3,0x6F,0xE3,0xB3,0xAE,0x87,0xDF,0x72,0x76,0x96,0xE8,0x7D,0x04,0x80, + + 0x78,0xF8,0x25,0x21,0xAC,0xB3,0x74,0x61,0x40,0xDD,0x3F,0xBF,0xD3,0xF5,0xDE,0xB0, + + 0x26,0xE9,0xFA,0xD2,0x97,0x7D,0x6F,0x97,0x9E,0xDB,0x9C,0xB9,0x87,0x71,0x4F,0x28, + + 0x82,0x11,0x2E,0xFA,0x65,0x7C,0xCE,0xA0,0x6E,0x5B,0x06,0x5B,0xD4,0xE5,0x02,0x1D, + + 0x24,0xE6,0xF9,0x68,0x8F,0x71,0xCA,0x11,0x08,0x63,0x88,0xCA,0x29,0x7C,0x27,0x3A, + + 0xA2,0x74,0x97,0x3E,0x87,0xB1,0xF0,0x4C,0x89,0x30,0x95,0x9B,0x0E,0x8B,0x22,0xC5, + + 0xAE,0x98,0xB3,0xA6,0x41,0xAA,0xE8,0x12,0x47,0x5F,0x08,0x0F,0x82,0x16,0x85,0xC0, + + 0x6F,0x15,0xD2,0x9B,0xD8,0x39,0x6C,0x03,0x0B,0x59,0x6E,0x40,0x05,0xCB,0xAA,0x2E, + + 0x42,0xC1,0x5D,0x24,0x10,0x27,0x58,0x9A,0x8B,0x13,0xA6,0xBE,0xDD,0x4B,0xC6,0x58, + + 0xD1,0x03,0x82,0x87,0xC4,0x1B,0x5C,0x35,0x9F,0xD5,0xB4,0x53,0x80,0x77,0x71,0x1A, + + 0xA1,0x11,0x5E,0x18,0x31,0xCD,0x9D,0xE7,0x2A,0x55,0xC0,0x5E,0x69,0x84,0xF8,0xFB, + + 0x4F,0x04,0x47,0x8C,0x64,0xCF,0xF3,0x8E,0xC9,0x7A,0x07,0xDF,0x29,0x65,0xD0,0xDB, + + 0xDE,0xE3,0x50,0x95,0x3E,0x3C,0x09,0xDB,0xC8,0x4E,0x08,0x42,0x0C,0x18,0xBD,0xEC, + + 0xE3,0x13,0x98,0xCA,0x3A,0xC1,0x7F,0x1E,0x7A,0x99,0x96,0x3B,0x32,0x0A,0x36,0x8B, + + 0x88,0x02,0x35,0x87,0x15,0x81,0x5B,0x93,0x03,0x19,0xE5,0x73,0x88,0x40,0x3E,0xEE, + + 0x0B,0x0F,0x50,0x32,0x4F,0x5D,0x2F,0xCD,0x54,0x81,0xEA,0x63,0xFB,0x9E,0x71,0xDF, + + 0xE1,0x5B,0xE4,0x78,0x6A,0x93,0x76,0x1F,0x02,0x50,0x3E,0x16,0xA7,0x61,0xB0,0xA6, + + 0x04,0xC0,0x08,0x38,0x91,0x20,0x22,0x3A,0xD5,0xAC,0x10,0x28,0xD8,0xED,0x28,0x12, + + 0x05,0xC1,0x68,0xD2,0x91,0xA7,0x32,0x12,0xD4,0xA5,0x28,0x99,0xA2,0xA1,0x21,0x1F, + + 0x84,0x82,0x7E,0x77,0xE3,0xA2,0xE5,0x71,0x87,0x32,0x21,0xE7,0xD0,0x0F,0x29,0x9F, + + 0x85,0x83,0xA1,0xB8,0xF6,0x83,0x31,0x23,0x26,0x09,0x05,0x13,0x4D,0xA7,0xDE,0x4B, + + 0xA0,0x2A,0xB1,0x77,0xB5,0x1B,0x66,0x64,0xF5,0x89,0x4F,0x5B,0xA9,0x39,0x52,0xC8, + + 0xF4,0x58,0xFB,0x0D,0x7D,0xAA,0xE8,0x01,0xCB,0x94,0x87,0x0C,0x79,0x7A,0x5B,0x04, + + 0x5C,0x39,0xDC,0x58,0x35,0x23,0x0F,0x81,0xD6,0x8B,0x25,0x99,0x2F,0x85,0x39,0x24, + + 0xCD,0xC0,0x92,0x38,0x43,0xA8,0x07,0x74,0x7E,0xA1,0x44,0xD2,0x68,0xE5,0x22,0x0A, + + 0x0C,0xC8,0xDA,0xC8,0xA8,0xE6,0x12,0x2B,0x09,0x07,0x13,0x29,0xBD,0x8E,0x2A,0x1A, + + 0x0D,0xC9,0xA3,0x1A,0x60,0x19,0x3E,0x3E,0x0D,0xD9,0x88,0x14,0xFE,0x15,0x23,0x2A, + + 0x8C,0x8A,0x14,0xE7,0x54,0x61,0xDC,0x59,0x4C,0xBA,0x23,0x50,0x04,0xE5,0x24,0x0D, + + 0x8D,0x8B,0x88,0xBE,0x45,0xE8,0x7B,0x1B,0xCC,0xCF,0x98,0xDD,0x3D,0xFA,0x0C,0x38, + + 0x83,0x7A,0xD0,0xB0,0xA6,0xA3,0x0C,0x88,0xE2,0xF1,0x1C,0x6B,0xC4,0xE4,0xAA,0x5B, + + 0xC2,0xE1,0x45,0x0D,0xBC,0x7C,0x7E,0xFB,0xA6,0x89,0x7D,0xB4,0xB6,0x60,0x9C,0x39, + + 0x58,0x51,0x5E,0x50,0x3D,0x2B,0x97,0x4F,0x7D,0xB9,0xF1,0x00,0x44,0x91,0x51,0xC0, + + 0x74,0x02,0xC4,0xF6,0x68,0x22,0x6E,0x88,0x4B,0x62,0x86,0x91,0xFB,0xF4,0x1E,0x60, + + 0x88,0x6E,0x0C,0x24,0xEB,0xEF,0x3C,0x08,0x85,0xB6,0x4F,0xDC,0x5A,0x6F,0x2C,0x6F, + + 0x25,0x1C,0x0C,0x85,0x1B,0xD5,0x88,0x58,0x84,0xB7,0xB4,0xA7,0x86,0x2C,0x5E,0x5D, + + 0x13,0x89,0x0D,0x34,0x7C,0x31,0x81,0x4D,0x05,0xB4,0x0E,0x3C,0x05,0xE4,0xD5,0x9B, + + 0x7A,0x0C,0x76,0x95,0xCA,0x33,0x89,0xF9,0x2C,0x97,0xDA,0x49,0xA9,0x5D,0x3C,0xC6, + + 0x6C,0xF0,0x44,0x63,0xFF,0xF0,0x75,0x04,0x42,0x29,0xCC,0x94,0xEF,0xAB,0xD8,0x38, + + 0x86,0x39,0x89,0xA5,0xB3,0xA3,0x87,0x89,0x5D,0x6A,0xA2,0x14,0x75,0x08,0x5D,0x6B, + + 0x05,0xD7,0x00,0xBC,0x20,0x2B,0xE0,0x1C,0x13,0x85,0xCF,0xBD,0x49,0xB7,0x15,0xE2, + + 0x04,0x98,0xE5,0xCF,0x5C,0xF3,0x46,0x5B,0x14,0x96,0x6A,0x08,0x02,0x94,0x78,0xA8, + + 0xF9,0x33,0x4E,0x2C,0x98,0x3F,0x1F,0xE4,0xA5,0xBC,0xCE,0xC5,0x9D,0x24,0x1E,0x6B, + + 0x14,0x89,0x06,0x3C,0xE2,0x36,0x10,0xBC,0xFC,0x85,0xC0,0x5C,0x88,0x7D,0x26,0xD0, + + 0xC7,0xAA,0x73,0xA9,0x52,0xD9,0x9E,0x49,0x40,0xC6,0xC8,0x8B,0x05,0xE5,0x71,0x90, + + 0xAD,0x30,0x6F,0x9F,0xEB,0x65,0x11,0xBC,0x78,0x25,0xAF,0x79,0xAF,0x24,0x58,0xCC, + + 0x64,0xD8,0x5D,0x41,0xC9,0x01,0xDA,0x95,0xF0,0x23,0x0D,0x95,0x50,0x43,0x56,0x90, + + 0x1D,0x92,0x95,0xC3,0xF4,0xB2,0x1B,0x01,0x9E,0xCB,0x2A,0xB4,0x7D,0x13,0x3F,0xCF, + + 0xE4,0xFA,0x06,0x34,0x4F,0x88,0xCC,0x65,0x19,0x63,0xDC,0x4A,0x2F,0xE2,0x56,0xFF, + + 0x11,0xBF,0x05,0xAD,0x6A,0xC0,0x04,0xDF,0x5E,0x2B,0x79,0x70,0x0E,0xA9,0x39,0x8B, + + 0x01,0x50,0xAE,0x03,0xD9,0x2F,0x80,0x42,0xB3,0x25,0xE8,0x35,0xB0,0xE1,0xE9,0xEA, + + 0xB0,0x37,0x28,0x5E,0xB2,0x44,0xE3,0x17,0xE0,0xBE,0x20,0xCE,0xDE,0xD7,0x3E,0x8E, + + 0x7B,0x9F,0xAF,0x02,0x01,0x8E,0x29,0xDA,0x6C,0x4F,0x97,0xDE,0xE3,0x48,0x70,0x0C, + + 0x4A,0x0C,0xA7,0x12,0x58,0x2C,0x89,0x57,0x32,0x53,0x91,0x2D,0xE2,0x55,0x50,0xB4, + + 0x04,0xCF,0x7A,0x03,0x1C,0x9B,0x6C,0xE4,0x44,0xCC,0xD8,0x6D,0x54,0xEC,0x70,0xF0, + + 0xEE,0x45,0xE8,0xBE,0x66,0x33,0xBF,0x06,0x4D,0x27,0x08,0x76,0x3B,0x0B,0xAE,0xC3, + + 0x02,0xDF,0x6D,0x3A,0x48,0xAD,0xC8,0xA1,0xA1,0x5D,0x77,0x8D,0x4C,0xAD,0xE1,0x71, + + 0x6A,0x9D,0x81,0x45,0xA0,0x51,0x13,0xCC,0x3C,0xF8,0xE6,0xE6,0xE3,0xEC,0xEB,0x7A, + + 0xD1,0x77,0xAC,0x0B,0x89,0x84,0xAA,0xD3,0x58,0x05,0x28,0xEB,0x9A,0x48,0x23,0xF3, + + 0x2D,0xF4,0x2E,0xDE,0x9D,0xA4,0x8A,0x4A,0xC7,0xD6,0xBA,0xA8,0xA8,0xC2,0x39,0x53, + + 0x3F,0x87,0x23,0x47,0xBC,0x24,0xE8,0x21,0x6D,0xB5,0xDB,0x0C,0xBF,0x4A,0x86,0xE6, + + 0x7C,0x53,0x6F,0xFB,0x89,0xA0,0x41,0x38,0x47,0xF4,0xE3,0x2C,0x39,0xEA,0x1A,0x18, + + 0x39,0x67,0x18,0xE8,0x38,0x2D,0xBE,0x1B,0x55,0xFA,0xF2,0x86,0x2B,0x7A,0xB5,0x26, + + 0x29,0xE0,0xF6,0x3E,0x96,0x36,0xDF,0x3F,0xAA,0xBB,0x7C,0x7E,0x51,0x76,0xFB,0xB7, + + 0x9A,0x43,0xC5,0x6D,0xB6,0x6E,0x93,0x39,0xB7,0x44,0xDB,0x7C,0xDC,0xE6,0xCD,0x1E, + + 0x6A,0xF9,0x2E,0x2B,0x51,0xCE,0x9B,0x29,0xC6,0x47,0xE5,0xF9,0x9A,0x15,0x7A,0x62, + + 0x95,0xC6,0xBA,0xF0,0xBD,0x52,0x6D,0x84,0x91,0x9F,0xF5,0xD2,0x87,0x1E,0x84,0x72, + + 0x90,0x87,0x94,0x85,0x5A,0xD0,0xA7,0x46,0x71,0xAC,0x7B,0x42,0xF1,0xF1,0x8D,0x63, + + 0x19,0xA4,0xFB,0xAD,0x59,0x2B,0x14,0xDA,0x07,0x42,0x72,0xE5,0xB8,0xAF,0x03,0x73, + + 0x85,0x0E,0x89,0x68,0xB5,0x30,0xE7,0x95,0x10,0x5C,0xA7,0x5D,0x63,0xBC,0x54,0xD9, + + 0x24,0x4F,0x8C,0xCD,0x01,0x42,0xEF,0x7A,0x95,0xE1,0x4B,0x24,0x68,0x18,0x15,0xA7, + + 0x84,0x05,0xAA,0xE1,0xD4,0x2E,0xE3,0x6B,0x00,0x51,0xD6,0xB1,0x70,0x77,0x25,0x01, + + 0xB2,0x9B,0x7F,0xA5,0xF2,0x5A,0x44,0x19,0xE2,0x38,0xEF,0x76,0x97,0x34,0xB5,0xD3, + + 0x8F,0x0C,0x28,0xA3,0x90,0x77,0x24,0x8D,0x71,0x5F,0x84,0x6F,0x1A,0x96,0x1E,0x95, + + 0xD9,0x74,0x90,0x89,0x1A,0x79,0xA2,0xD3,0xCB,0x3D,0xCF,0x26,0x9D,0x16,0x71,0xE6, + + 0x27,0xC6,0x22,0x74,0xFF,0xF4,0x66,0x9C,0x98,0x16,0x76,0x89,0x98,0xB6,0xC3,0x73, + + 0x51,0x78,0x04,0xFE,0xD4,0x85,0xAC,0x4B,0x44,0xA7,0xF5,0xA1,0xF9,0xFA,0xB0,0x1C, + + 0x56,0x05,0xE8,0x6B,0xAB,0xF6,0x1E,0xC2,0x4E,0x4B,0xCF,0x88,0xEF,0x60,0xBE,0x38, + + 0x2E,0x53,0x2E,0xE5,0x18,0x0D,0xD7,0x00,0x8F,0x11,0x44,0x1A,0x9F,0x10,0xF0,0x3E, + + 0x3B,0x52,0xC6,0x34,0xE3,0xF0,0x0D,0xFA,0x29,0x31,0x80,0xE5,0x77,0x3C,0x67,0xED, + + 0x4B,0x05,0xDD,0xBE,0xE9,0x35,0x40,0x0F,0xF8,0x13,0xB5,0xFC,0xFB,0x6E,0x16,0x3F, + + 0x0E,0xBE,0x97,0x70,0xBD,0xB7,0x65,0x6A,0xDB,0x1D,0xE5,0x15,0x29,0xB0,0xDB,0x79, + + 0x1D,0x3F,0xA4,0x81,0xB3,0xB0,0x6A,0x26,0xCA,0x1F,0xB6,0xDD,0xA1,0x8E,0x95,0x8D, + + 0xEE,0x8E,0xA9,0xE6,0x19,0xC7,0xA8,0x50,0xF6,0xA4,0xDD,0x40,0x34,0xC1,0x1A,0x4B, + + 0x77,0xC3,0xFB,0x03,0x1A,0xED,0x6B,0x26,0x4A,0x3D,0xD6,0x67,0xC6,0xF9,0x90,0x8D, + + 0x80,0x8C,0x51,0xE7,0xD5,0xC8,0x01,0xD8,0x69,0xCE,0xA1,0x3E,0xB2,0xA3,0x9F,0x30, + + 0xD0,0x5B,0x1A,0x79,0x73,0x7F,0xF4,0x42,0x22,0x2E,0x5C,0x14,0x9C,0x2D,0x56,0x9E, + + 0x01,0x0D,0x0F,0xD2,0x56,0x5C,0x1E,0x47,0xA0,0xCE,0x7E,0xF2,0x16,0x01,0xCD,0x3C, + + 0x4C,0xFC,0xE1,0x80,0x7F,0xDC,0xDD,0x8B,0x58,0x0B,0x31,0x37,0xB1,0xEC,0xB6,0x93, + + 0xC7,0x52,0xA1,0xC7,0x1A,0x2A,0xF9,0xB5,0xFF,0xC4,0xA0,0xF8,0xB0,0xB7,0x1F,0x91, + + 0x09,0x87,0x90,0x3F,0x98,0x07,0xCB,0x0D,0xED,0xB7,0xF3,0x5D,0x30,0x29,0x30,0x18, + + 0x9F,0x21,0x0E,0xED,0x91,0xE8,0x82,0xD1,0x5D,0x84,0xE3,0xB5,0xBA,0xFB,0x18,0x7B, + + 0x0C,0x96,0x03,0x7C,0x3F,0x09,0xA3,0x4D,0x73,0xDA,0x49,0x2D,0xC6,0x67,0x53,0x3F, + + 0x30,0x7D,0x91,0xEC,0xF1,0x54,0xC2,0x33,0x68,0xB7,0x41,0x3D,0xD7,0xF0,0xAB,0x75, + + 0x11,0x97,0x84,0x3A,0xE5,0x21,0x67,0x0A,0x48,0x44,0xAB,0xE1,0xBB,0xE7,0x22,0xCB, + + 0xFA,0xC2,0xB3,0xAE,0xBA,0x1B,0x01,0x72,0xEA,0x72,0x6A,0x39,0xB6,0x97,0x5A,0xCF, + + 0xCF,0xD6,0x81,0x4F,0x6D,0xC2,0x3E,0x83,0x27,0x83,0xF1,0x9E,0x86,0xAE,0x6A,0x24, + + 0x28,0x8C,0xD0,0xDB,0xDE,0x77,0xD7,0x04,0x15,0x30,0x9D,0x0B,0xD9,0x67,0x58,0xA6, + + 0x95,0x99,0xC6,0x86,0xD3,0xAB,0x8F,0x44,0x74,0x2D,0xD5,0xD5,0x18,0x31,0xD3,0xEC, + + 0x0B,0x4E,0x12,0x8A,0x17,0x10,0x1A,0xB5,0xC6,0xDF,0x3C,0xC4,0x92,0xEA,0xA2,0xFC, + + 0x29,0xF1,0xC3,0xF1,0xA4,0xB1,0xCD,0x87,0x54,0x96,0x4F,0xD4,0xA7,0xFB,0x12,0x36, + + 0x5E,0x0E,0x2D,0x51,0xD5,0xFD,0x99,0x71,0x61,0x91,0xDC,0xC1,0x7A,0x75,0xF2,0x24, + + 0x83,0xFA,0x7D,0x86,0x32,0xB0,0x7E,0x16,0x65,0xD6,0x64,0x64,0xFE,0x2C,0x56,0x34, + + 0x05,0x94,0x97,0xDE,0x92,0x0A,0x1A,0xDA,0xC0,0xC7,0x3C,0x26,0x63,0xF3,0x07,0xC2, + + 0xA7,0x94,0x6B,0x2F,0x5F,0xFB,0xD9,0x0B,0x03,0x9B,0xCD,0xB7,0x76,0xF9,0xE8,0x57, + + 0x90,0x91,0x41,0xA4,0xA8,0x01,0xC5,0x61,0xE7,0x98,0xD9,0xAB,0x56,0xFE,0xF2,0x70, + + 0xBF,0xB7,0xB0,0x66,0xF6,0x73,0x34,0x51,0x6A,0x58,0xB7,0xEE,0x38,0x75,0x94,0x61, + + 0x3D,0x54,0xBE,0xAB,0x76,0xA2,0xFE,0xAA,0x96,0x54,0x2E,0x9E,0x51,0x39,0xB7,0xFD, + + 0x5F,0x8A,0xA3,0x87,0xDB,0x2B,0x48,0x2F,0xAC,0x65,0x4D,0x5E,0xA4,0xDA,0xD4,0x93, + + 0x48,0x64,0xA3,0xF9,0x4A,0x10,0xE3,0xC9,0x63,0xBE,0xAF,0x97,0xF1,0xFA,0x2E,0xDE, + + 0x45,0x2C,0x99,0xBD,0x29,0x2A,0x2F,0x65,0x09,0x8C,0xF5,0x9D,0x0B,0x92,0x7E,0xFA, + + 0x2B,0xB0,0x55,0xAE,0xBF,0xA2,0x3B,0x99,0x85,0x9F,0x3E,0x2F,0x75,0xF9,0x65,0x8D, + + 0xDE,0xDF,0x9C,0x08,0x47,0x48,0x2E,0x64,0x0B,0xD5,0x95,0x9F,0xFD,0x5E,0xAF,0x7B, + + 0x83,0xDF,0xD4,0xAF,0x3F,0xA9,0x75,0x32,0xDC,0x29,0x44,0xFB,0xF8,0x92,0x5E,0xA5, + + 0xBE,0xAB,0x40,0xC4,0x8C,0x5B,0xBD,0xA6,0xE1,0xE6,0x12,0x7A,0xF4,0x8D,0x9E,0x63, + + 0x6D,0x6D,0xF7,0xE9,0x40,0xFA,0x20,0xA3,0x3D,0x4B,0xE1,0xCB,0xDC,0xE7,0x53,0x81, + + 0x61,0xAD,0x09,0xE9,0x90,0xAF,0x41,0xA3,0x5D,0x64,0x55,0x7B,0xDE,0x7C,0x6F,0x75, + + 0x80,0x43,0x3C,0x91,0xC4,0x49,0x9F,0x42,0xBD,0x4C,0x91,0x75,0xD5,0x98,0x60,0x54, + + 0xCA,0xF5,0xC8,0x41,0x14,0x67,0xD0,0xA4,0xEF,0x06,0xC9,0xE0,0x7A,0x1A,0x16,0xE8, + + 0x03,0xA1,0x08,0x91,0x69,0x26,0x56,0x83,0x06,0x9E,0xFC,0x12,0x8D,0x77,0x15,0x52, + + 0xA0,0x45,0x54,0xC1,0xA1,0x26,0xC1,0xAA,0x0A,0x49,0x11,0x41,0xA0,0x7D,0xD5,0xE8, + + 0x7B,0x44,0xDE,0x50,0x95,0x24,0x7D,0x8C,0x42,0x1C,0x61,0xEB,0xD2,0xC7,0x0E,0x24, + + 0xE1,0x61,0xB8,0xFF,0x28,0x85,0xA6,0x5B,0x6A,0x47,0x45,0x5E,0xAF,0xC3,0x9F,0xE9, + + 0x48,0xB8,0xC2,0x00,0x1F,0x21,0x64,0x3E,0xA8,0xCA,0x98,0xCF,0x69,0xC4,0x7C,0xF1, + + 0x88,0x71,0x92,0x4A,0x52,0x43,0x49,0xAF,0xA0,0xAB,0x02,0xD2,0x84,0xD7,0xBC,0xA9, + + 0x7D,0x68,0xFE,0x2D,0xC0,0x69,0xAA,0xCA,0x45,0x46,0x8A,0xFA,0x07,0x61,0x71,0xE9, + + 0x0C,0x5C,0xC2,0xC8,0x15,0x33,0xA7,0x85,0x48,0xF7,0xE8,0xEE,0xC3,0xC6,0x32,0x5C, + + 0xEB,0xD8,0x7F,0x2D,0xAF,0xA4,0xD7,0xE9,0x34,0x6D,0x1A,0x35,0x05,0x2F,0x88,0x3A, + + 0xA7,0xA5,0x18,0xF2,0xE5,0xB1,0x32,0x91,0x56,0x0C,0xAB,0xE9,0xBD,0x69,0x33,0x68, + + 0xE9,0xA0,0xF1,0xA6,0x9D,0xF7,0x9B,0x41,0x2F,0xB4,0xC1,0xA1,0xFB,0x3D,0x22,0x21, + + 0x5C,0xB4,0x92,0x20,0xDB,0xA1,0x16,0x53,0x58,0x3C,0x05,0xB5,0x40,0x74,0x5C,0xE7, + + 0x3D,0x7D,0x19,0xD3,0xD8,0x72,0x42,0x99,0x21,0xDC,0xE2,0x10,0x9A,0x40,0xD5,0x21, + + 0x49,0xE3,0xBB,0x24,0xC6,0x9D,0x77,0xB1,0xE3,0x32,0x7F,0xD7,0x1B,0x51,0x37,0x02, + + 0x83,0xBC,0x6A,0x66,0xC5,0x9E,0x63,0x9D,0x29,0x62,0xE3,0x9D,0x18,0x62,0x7C,0xFD, + + 0xDD,0x12,0xE0,0x84,0x3E,0x35,0x51,0x92,0x99,0x16,0x57,0xE0,0xFA,0x41,0xE0,0x55, + + 0xD4,0xE8,0xBE,0xD0,0x7D,0x2E,0x7C,0xE9,0x1C,0x35,0x05,0x5B,0x4C,0x77,0xE8,0xDE, + + 0x03,0xC5,0xD2,0x5D,0x5B,0x2C,0xDE,0x24,0xA8,0xE6,0x8C,0xFF,0x16,0xCC,0x89,0x2E, + + 0x21,0x6B,0x17,0xB3,0xDB,0x2E,0x9D,0xC9,0x07,0x15,0x72,0x9A,0x2E,0xAB,0x56,0xFA, + + 0xE2,0xE9,0xD2,0x12,0xD3,0x89,0x07,0xDB,0x58,0x36,0x3A,0x3F,0x55,0x72,0xA3,0x1A, + + 0x88,0xBF,0xF0,0xA5,0xD2,0xE8,0x20,0x90,0x67,0xF6,0x61,0xFB,0xB3,0x28,0x79,0xB4, + + 0x25,0x1C,0xD7,0xFA,0xF0,0xB7,0x75,0xA9,0xE9,0x6A,0x50,0x29,0xF9,0x4D,0x5F,0x1B, + + 0x34,0xEF,0xB1,0xB0,0x9B,0xD6,0x0E,0xA8,0xDD,0x5F,0x97,0x39,0x10,0x2A,0x22,0xB6, + + 0x89,0x79,0x06,0xED,0xA5,0x7E,0x0C,0xC6,0x15,0x1C,0x6F,0xB2,0xF8,0x78,0xE3,0xC7, + + 0x88,0x78,0x76,0x43,0x29,0x70,0xDD,0xFD,0x6D,0x17,0xA1,0x04,0x7B,0xD9,0xF8,0x2B, + + 0x4B,0x18,0x57,0x75,0x89,0xF5,0x97,0xD1,0x0E,0x5D,0x1F,0x8F,0xB9,0x8E,0x37,0xFD, + + 0x17,0x9C,0x2C,0x9D,0xB7,0xB2,0xE3,0x7B,0x6B,0xC7,0xC5,0x45,0x33,0xD6,0xE0,0x5A, + + 0x4F,0x0D,0xA8,0xBD,0x54,0xAF,0x68,0x36,0xC6,0xBC,0xA2,0xD6,0x05,0xA2,0x56,0x3A, + + 0xEC,0x90,0x04,0x64,0xDF,0x70,0x66,0x8A,0x45,0x65,0x35,0xB2,0x54,0x96,0x5F,0xA2, + + 0x6F,0xC1,0xA7,0x2F,0x14,0xDF,0x92,0x41,0x84,0xCD,0xB9,0x88,0x2F,0x69,0x85,0x80, + + 0xA8,0x89,0xD7,0xB3,0x74,0x05,0xA5,0x8A,0x3D,0x12,0xAE,0xCC,0xB6,0x5B,0x32,0x3C, + + 0x6C,0xE7,0x2C,0xC2,0x61,0x40,0xF0,0xE6,0x36,0x01,0xF5,0xE4,0xCF,0x9F,0x6C,0x5B, + + 0x85,0xF9,0xF0,0x3B,0xFE,0x6C,0x27,0x71,0x65,0xE4,0x3E,0xAA,0xD5,0xE1,0x1F,0xE6, + + 0xCE,0x67,0x81,0x45,0xEB,0xAB,0xB1,0x9E,0x88,0x84,0xC9,0x07,0xDA,0xA4,0xCA,0x31, + + 0x08,0x01,0x14,0xBB,0x97,0xCB,0xE8,0xF7,0x8F,0x54,0x72,0x15,0x28,0x85,0xA3,0x8E, + + 0x0D,0x44,0xB5,0xFD,0x36,0x07,0x01,0x13,0x4A,0x98,0x72,0x6E,0xE2,0x59,0x3B,0x18, + + 0xF0,0x3C,0xCA,0x51,0x97,0xA4,0x61,0x3A,0x36,0xC1,0xB2,0x2B,0xA9,0xD8,0xE3,0x4B, + + 0x77,0x2A,0x34,0x1C,0xBA,0xA9,0xF8,0xAF,0xCD,0x27,0xCD,0x06,0x53,0x3C,0xB7,0x9F, + + 0x8C,0xB5,0x50,0x38,0x3C,0x54,0xFB,0x3F,0x9F,0x36,0x85,0x17,0x9F,0x44,0x4B,0x0A, + + 0x3A,0x01,0xDC,0x83,0x80,0x27,0x4C,0x73,0x6F,0xAD,0x36,0xEB,0x1D,0x1E,0x52,0xA4, + + 0xA3,0x80,0x8B,0x9E,0x73,0xEF,0x3E,0x86,0xF1,0x36,0xA2,0xE6,0x6C,0x25,0x1B,0xC9, + + 0x13,0xA8,0xC3,0xA5,0xF7,0xF4,0x9F,0xF9,0x82,0xC6,0xE3,0x0D,0xD4,0xAC,0x94,0xD9, + + 0x12,0x89,0x7B,0x51,0x99,0x8E,0x3B,0x96,0x5C,0x94,0x43,0x1F,0x97,0xEC,0x1C,0x11, + + 0x58,0x9A,0xA2,0xF4,0xDF,0xC1,0x4C,0x26,0x6D,0x30,0xA6,0xA2,0x83,0x0D,0x12,0xE6, + + 0xA8,0xF3,0x1F,0xAF,0x85,0xE0,0xFC,0xEF,0xD0,0x7C,0x7C,0xF6,0xB0,0xB3,0xB2,0x07, + + 0xA5,0x7F,0xDB,0xBF,0x5D,0x63,0x82,0x13,0x10,0xB1,0x59,0x39,0xF7,0xE2,0x52,0xD4, + + 0x58,0x25,0xAC,0x95,0xF1,0x6F,0xA1,0x5C,0xD2,0xD3,0xB5,0x4C,0xBD,0xC2,0xD5,0x67, + + 0xDA,0x17,0x9A,0x0E,0xBB,0x19,0x4C,0xC2,0x87,0xF5,0xA3,0x62,0x63,0x33,0x9E,0xF6, + + 0x07,0xF5,0xF8,0x55,0x34,0x84,0xD0,0x60,0x6B,0xDF,0x49,0x87,0xC3,0x7C,0xD6,0x66, + + 0xA0,0xCE,0x28,0x48,0x03,0xF4,0x15,0xA8,0x58,0xDB,0x2E,0x48,0x89,0xF4,0xE9,0x57, + + 0xB6,0x97,0x2D,0xF3,0x23,0xF5,0x3C,0x71,0x76,0x88,0xA2,0x77,0x84,0x80,0x7C,0x88, + + 0x9F,0x41,0x16,0xF9,0x32,0x64,0x01,0x86,0x13,0xDA,0xB0,0x86,0xFC,0xA6,0xB9,0x78, + + 0x81,0x34,0x90,0xA6,0xC9,0xC8,0xE6,0x3E,0x64,0x39,0xBE,0xFE,0x31,0x4C,0x46,0x4B, + + 0xF6,0x37,0x63,0x45,0x0F,0x05,0xEC,0x84,0xEA,0xA2,0x89,0x86,0x73,0x7C,0x7F,0x79, + + 0x20,0x9D,0x9E,0xB3,0xAD,0xBF,0xE0,0x3B,0x9A,0xAE,0xAA,0x3B,0xFC,0xC5,0xCE,0xCF, + + 0x28,0x84,0xF2,0xCD,0x3F,0xDC,0x4C,0x1B,0xCD,0xFC,0x36,0x2F,0x8E,0x71,0xB1,0xDF, + + 0x29,0x0C,0xA7,0x6C,0x37,0x8F,0xD2,0x89,0xCC,0x5B,0x6D,0x7A,0x19,0x5F,0x5A,0xEB, + + 0x86,0xEE,0xF7,0xF6,0xE8,0x13,0xB7,0xEF,0xDF,0x01,0x89,0x26,0xF8,0x0D,0xDD,0x5F, + + 0xCC,0xEB,0xB6,0xDC,0x1A,0x1E,0x80,0x85,0x2D,0xDF,0xAF,0x7E,0xBA,0xF9,0xAD,0x02, + + 0xA1,0xFF,0x9A,0x06,0xDA,0x2F,0x30,0xD9,0xE1,0xCA,0xC2,0x72,0xBB,0x04,0xB2,0xEE, + + 0x20,0x42,0x64,0x8F,0xE0,0xA8,0x07,0x14,0x47,0xDA,0xE0,0x20,0xB1,0xE0,0x19,0xA9, + + 0xB3,0x84,0x11,0xFB,0x3C,0x2F,0x96,0x41,0xCC,0x00,0x01,0x56,0xBC,0xC9,0x96,0x71, + + 0x9D,0x05,0xA9,0xFF,0x64,0xAA,0xF2,0xB5,0xC6,0xC0,0xB4,0xC6,0x55,0xEE,0x77,0x25, + + 0x71,0x04,0xE0,0xCE,0x11,0x64,0x28,0x47,0xBF,0x4B,0xEA,0x97,0x62,0xC9,0x59,0xB2, + + 0xAF,0xA8,0xDE,0x61,0xF8,0x61,0x49,0x92,0xEF,0xE8,0x90,0x1D,0x55,0x6D,0xC1,0x40, + + 0x68,0xAB,0xFD,0xA2,0xF1,0x60,0x6F,0x54,0xE6,0xEB,0xC0,0x22,0x18,0x0F,0x5C,0xB3, + + 0xA7,0x8C,0xF3,0xE5,0x27,0x88,0x4C,0x93,0xE7,0xEA,0x25,0x85,0x41,0x96,0xAF,0xF1, + + 0xA9,0x66,0xA2,0x86,0x3C,0x87,0x42,0xA0,0x10,0x53,0xC0,0x62,0x7C,0xC5,0x30,0xFA, + + 0x8B,0x75,0x58,0xDB,0xD3,0xD8,0xA2,0xD8,0x01,0x05,0xA8,0x0C,0x75,0xC6,0x61,0x19, + + 0x89,0x4A,0xD5,0x2A,0x39,0x85,0x4C,0x4F,0x8A,0x05,0x05,0xDC,0x7B,0xAA,0x2B,0x7B, + + 0xBA,0x8D,0xB5,0x21,0xF8,0x2F,0x5A,0xBD,0x88,0x6D,0x3B,0x4F,0xBB,0x17,0x96,0x79, + + 0x66,0xA3,0x66,0xBC,0x12,0x23,0xC3,0x8A,0xE6,0xE1,0xAC,0x6A,0x39,0xE8,0x34,0x5F, + + 0x2F,0xA9,0xAA,0x73,0x4F,0x6F,0xFA,0x0A,0x29,0x11,0xA1,0x5B,0xFA,0xD2,0xE3,0x3B, + + 0xE8,0xC2,0xFD,0x78,0xBB,0xFC,0xC6,0x8B,0xEE,0xE1,0x00,0x9E,0x56,0x63,0x1B,0x5F, + + 0x43,0xFE,0xC3,0x03,0x14,0xA9,0x25,0x7E,0xCF,0xCF,0x81,0x3F,0xA7,0xC0,0xBE,0x02, + + 0xBD,0x14,0x7F,0xC3,0xD9,0xA3,0x84,0xD3,0x0C,0x56,0x15,0x96,0x8F,0x1E,0xA4,0x0C, + + 0xC8,0x0B,0x59,0x0A,0xDA,0x42,0x9C,0xB4,0x29,0x52,0xE4,0xC4,0xF1,0x6E,0x7D,0x05, + + 0xA2,0x12,0x62,0x76,0xC2,0x9F,0x77,0x81,0x8B,0x5D,0xAB,0x68,0x2E,0xDF,0x55,0x80, + + 0x81,0xD1,0x1D,0xAA,0x9C,0xE8,0x23,0x84,0x63,0xD5,0xA3,0x79,0x90,0x77,0x56,0x38, + + 0xC9,0x50,0x9A,0x26,0x36,0x99,0xEF,0xC4,0x11,0x54,0x28,0x14,0x70,0x85,0xE8,0xF4, + + 0x40,0x8A,0x0C,0x94,0xB8,0x5B,0xCC,0x01,0xC0,0x15,0x0F,0x07,0xFF,0x79,0x7F,0x71, + + 0x3B,0xB9,0x53,0x47,0x0E,0x74,0x95,0xE0,0x2F,0xAB,0xAB,0xE3,0x91,0x01,0x5B,0xFC, + + 0x48,0x53,0xAF,0xDD,0x46,0xBE,0x63,0xC4,0xE5,0xF7,0x79,0xB7,0x77,0x1B,0x86,0x7B, + + 0x7B,0x03,0x86,0xF3,0x50,0xAB,0xC5,0x59,0xCB,0x18,0xF7,0x88,0x7E,0x38,0x16,0x91, + + 0x8C,0x98,0x5B,0x6F,0x07,0x78,0x1C,0xE6,0x9D,0x62,0x09,0x82,0x43,0x8C,0xDE,0xEF, + + 0xEB,0x15,0xF9,0x35,0x4D,0x99,0x97,0xB8,0xCA,0x18,0xD4,0xB3,0x8C,0x8E,0x77,0x7F, + + 0x0C,0x91,0xB1,0x25,0xD9,0xC4,0xA8,0x55,0x74,0xA6,0x4E,0x45,0xF9,0x3A,0x1C,0x77, + + 0x40,0x4D,0xE6,0x5E,0xBA,0x34,0x06,0x8A,0x4E,0x87,0x62,0x8E,0xA0,0x83,0xCE,0x26, + + 0xCA,0x66,0x58,0x2F,0xBF,0xB0,0xC6,0x17,0x5C,0x5D,0x5E,0x6D,0xF7,0xDF,0x39,0xCE, + + 0x8E,0x5C,0x44,0x3D,0x34,0x9F,0xE6,0x14,0x6C,0xF3,0xD1,0xEB,0x31,0x3A,0x0F,0x37, + + 0x10,0x00,0x9D,0xF3,0x50,0x5B,0x65,0x02,0xED,0x87,0x7F,0x9F,0x29,0x71,0xBA,0xE2, + + 0x40,0x86,0xD9,0x75,0x7E,0x29,0xF0,0xE2,0xD5,0xDB,0x20,0x55,0x38,0x41,0x50,0x90, + + 0x98,0x3A,0x3E,0xE7,0xB6,0xE1,0xC0,0x16,0xBA,0x5C,0x18,0x44,0x37,0xDD,0x8C,0xFA, + + 0xE7,0x02,0x81,0x8D,0xB0,0x0F,0x32,0x45,0x85,0xE2,0x89,0x17,0x9A,0x4D,0x11,0x54, + + 0x47,0x03,0xC9,0x85,0xA2,0xE3,0xEA,0xCD,0x38,0x62,0xC7,0x30,0xF1,0x4E,0xC4,0x66, + + 0x6D,0x8B,0xE1,0x38,0x77,0xA0,0xDB,0x92,0x57,0x35,0x50,0x96,0xDE,0x37,0x6E,0xF2, + + 0x34,0x21,0xB2,0xD5,0x7F,0x44,0xAB,0x81,0xCB,0x84,0x4C,0x14,0xDA,0x53,0xE1,0x30, + + 0xA8,0xC6,0x83,0x45,0x97,0x76,0x0F,0x65,0xA5,0xE0,0x8F,0x60,0x77,0x39,0xD1,0x63, + + 0x87,0x78,0x97,0x51,0x76,0x24,0xCA,0x9A,0x3B,0x9C,0x06,0x09,0x05,0x5B,0x6A,0x1E, + + 0xAD,0x08,0xA4,0xAE,0x7F,0x37,0x0A,0xD5,0xB9,0xAB,0x24,0x1F,0xFD,0x69,0x4A,0x55, + + 0x76,0x84,0xF0,0xA1,0x77,0xDA,0x44,0x3C,0x2E,0xBE,0xE8,0x75,0xB6,0x8D,0x5B,0x2B, + + 0xD8,0xA1,0xB5,0xB7,0x77,0xEE,0xC8,0xDB,0xCE,0x3B,0xE5,0xDC,0x58,0x67,0x29,0xF9, + + 0xBE,0x0D,0xD5,0x18,0xB9,0xC8,0xE8,0xC8,0x41,0xC6,0x2B,0x5D,0xB6,0xE4,0x23,0x2C, + + 0x2A,0x21,0x53,0xBD,0x92,0x27,0x48,0x90,0xB5,0xCA,0x4D,0x35,0xAD,0x82,0xBC,0x1D, + + 0xD1,0xCC,0xA8,0xA1,0xF6,0x4C,0xAF,0x45,0x3D,0x52,0xE0,0x7C,0x9D,0xE9,0xFF,0xDB, + + 0x71,0x23,0xE7,0xAD,0x77,0xE7,0x5A,0xDD,0xEA,0x1B,0xCC,0xFD,0xDE,0x73,0x55,0x82, + + 0xE7,0x82,0x47,0xC0,0x9C,0xCE,0x04,0xFF,0xCB,0x10,0xF3,0x56,0xD9,0xE7,0xA3,0x71, + + 0x49,0x3D,0xDA,0x3A,0xDD,0xC3,0x99,0xEC,0x91,0x8C,0xEE,0x63,0x1C,0x11,0xB2,0xF2, + + 0x39,0x3C,0x3C,0xE5,0x59,0x10,0x02,0x87,0x0E,0xDE,0x70,0x87,0x19,0xEE,0x6E,0x63, + + 0xE4,0x3F,0xF7,0x78,0x5F,0x01,0x0F,0x48,0x57,0x93,0xCC,0xD8,0x53,0x79,0x64,0x21, + + 0xA1,0x53,0x95,0xA7,0xA0,0x1C,0xBD,0x31,0x27,0x49,0x05,0x93,0x02,0xFE,0xE4,0xC7, + + 0xBE,0x39,0xBE,0xC7,0x95,0x3F,0xB8,0x90,0x8D,0x35,0x54,0x24,0xFA,0xFB,0x52,0x7F, + + 0x03,0x38,0x4C,0xA4,0x55,0xA9,0xE4,0xB2,0x63,0xF8,0xED,0xE7,0x43,0x58,0x36,0xF2, + + 0x07,0x69,0x9E,0xF6,0xDA,0x19,0x4B,0xD6,0x6B,0x70,0x41,0x98,0x55,0x56,0x3E,0xE3, + + 0xAF,0x38,0x93,0xD0,0x16,0x3E,0x83,0x02,0x44,0x97,0x6C,0x17,0xF3,0x57,0x1C,0x62, + + 0x47,0xD7,0x06,0xFC,0x5E,0x74,0xB6,0xBB,0x4E,0xC3,0xC9,0x56,0x7C,0xBA,0x35,0x1E, + + 0x10,0x2B,0x38,0xAF,0x9C,0x38,0x00,0x0B,0x0C,0xDD,0x1C,0xDC,0x86,0xB8,0x26,0x6D, + + 0xAA,0xA3,0xD9,0x88,0x98,0x17,0x93,0xCD,0x26,0x19,0xB3,0x1C,0x7E,0x36,0xEF,0xA7, + + 0xBE,0x9D,0xB6,0x6C,0x39,0x36,0x41,0x59,0xFF,0x96,0x08,0x5B,0x8A,0xFB,0xB5,0xB8, + + 0x0A,0xF9,0x62,0xAE,0x3A,0x91,0x48,0xDF,0xEC,0xA9,0xE3,0xEC,0xFC,0x5C,0x21,0x30, + + 0x4C,0x62,0x78,0x3C,0xDF,0x19,0x92,0x69,0x0A,0x56,0x56,0x5D,0x00,0x3D,0x1F,0x3B, + + 0x3E,0x3F,0x1B,0xBC,0x93,0x1A,0x37,0x6F,0xEF,0xF0,0x61,0xAC,0x1F,0xBF,0x97,0x9C, + + 0x8B,0x42,0x97,0xF6,0x54,0xEE,0x5F,0x11,0x1A,0x56,0x3F,0x3A,0x6B,0xBE,0x59,0x8B, + + 0xA5,0xAF,0xF9,0x66,0xD2,0x20,0x90,0x52,0xC2,0x5C,0xF0,0x6E,0xE6,0x6F,0x19,0x63, + + 0x12,0x88,0x08,0xFC,0x9F,0xEA,0x6A,0x34,0x51,0x03,0x99,0xB0,0x79,0x2A,0x97,0x09, + + 0x25,0xAD,0x89,0x0D,0xFB,0x38,0xE0,0xC3,0x29,0xA8,0xAF,0xF0,0x32,0x63,0x0D,0x71, + + 0xC1,0x8E,0x76,0x31,0x97,0x62,0x0D,0x3F,0xC0,0x23,0x91,0x30,0xBA,0x89,0x7A,0xA2, + + 0x26,0xA9,0xF8,0xBF,0x9F,0xD9,0x90,0x54,0xD2,0x90,0xD4,0x86,0xB3,0x7F,0xD6,0xB0, + + 0x4B,0xAA,0xC0,0xDC,0x20,0x71,0xC8,0xB6,0x60,0x05,0x57,0x96,0xD3,0xC5,0x0A,0xA1, + + 0x9A,0xAB,0xA6,0x3B,0x50,0x26,0x42,0x7E,0xBA,0x04,0x70,0x93,0x50,0x42,0x87,0xB9, + + 0xB4,0x48,0x13,0x54,0x95,0x66,0x45,0x55,0x8B,0x76,0xE3,0xF7,0x4A,0xCC,0x7C,0xDD, + + 0x2C,0x13,0xC5,0xCC,0x1C,0x00,0x4C,0xFD,0x44,0xE5,0xC2,0x5F,0x17,0xEF,0x68,0x19, + + 0x0A,0xD8,0x31,0xDB,0xC7,0x21,0xDA,0x19,0xDD,0x43,0x42,0xFC,0x49,0xC2,0x61,0x7F, + + 0x77,0x64,0x07,0x2A,0x39,0xD5,0xDD,0x9B,0xC4,0xFA,0xC3,0x34,0xDE,0x4B,0x52,0xD7, + + 0x2C,0x82,0x0B,0x5C,0x95,0x3B,0x1A,0xC8,0x86,0xCB,0x55,0x7D,0x38,0x6D,0x78,0xBB, + + 0x59,0xA3,0xC9,0x3F,0x2E,0x23,0x08,0x28,0x22,0x5D,0xAA,0x13,0x79,0x5E,0xC1,0x3A, + + 0x2A,0x4D,0x0A,0x78,0x0C,0x80,0xCC,0x9A,0xA2,0x57,0xC2,0xF9,0xF7,0x60,0xDD,0x6D, + + 0x08,0x2A,0x77,0x3E,0xA6,0x21,0x93,0x48,0x6E,0xE3,0xB3,0x26,0xB1,0x63,0x57,0x83, + + 0x6A,0x14,0xD8,0xBF,0x37,0x82,0x29,0x7D,0xD7,0xC4,0xD9,0x9F,0x7A,0x01,0x1C,0x84, + + 0x08,0x18,0xDD,0x68,0x95,0x3B,0x11,0x22,0xF1,0x07,0xBD,0x0A,0xD1,0x1E,0x14,0x94, + + 0x09,0x0D,0x42,0x44,0x6D,0x38,0x14,0xB4,0x49,0x4D,0x1C,0xED,0x39,0xDC,0x3B,0x54, + + 0xE3,0x1D,0x05,0xC4,0xBC,0x9F,0x2D,0x66,0x22,0xF2,0xF7,0xB4,0xF1,0x12,0x33,0x44, + + 0x82,0x63,0x0D,0xB4,0x20,0x9E,0x23,0x64,0x80,0x73,0x53,0xC5,0xF3,0x7A,0x64,0xD1, + + 0x11,0xC6,0x40,0x84,0x3E,0xB9,0x47,0x64,0x4A,0x02,0xD0,0x66,0xEB,0xB6,0x5D,0xCD, + + 0xC2,0xBA,0xC6,0xD6,0xD8,0xD4,0xB4,0x74,0x4B,0x03,0x5A,0x87,0x1E,0x7A,0x1F,0xC4, + + 0x05,0xBD,0xBB,0xEC,0x5B,0x07,0xEA,0x03,0xE4,0x17,0xED,0x94,0x9F,0x7F,0x58,0xA2, + + 0xB0,0x9E,0xF3,0xA0,0x92,0x57,0xE2,0x13,0xAB,0x46,0x84,0xFB,0x94,0x57,0xC6,0xA9, + + 0xBC,0x10,0x48,0x6C,0x24,0x7A,0x0E,0xBC,0x81,0xB2,0x90,0xDF,0x37,0xFF,0xCE,0xBC, + + 0x81,0x94,0xD0,0x49,0x3B,0x7B,0x47,0x3F,0x2D,0x5F,0x1C,0x38,0x5D,0xCB,0x85,0x78, + + 0xE7,0x3A,0x93,0x69,0xB9,0xFA,0x0D,0xAC,0xCB,0x99,0xC7,0xA8,0xCB,0x1C,0x56,0x9B, + + 0x0E,0x0B,0x1F,0xBE,0x58,0x20,0x3F,0x59,0x48,0xA4,0x97,0x8C,0x55,0x76,0x42,0x28, + + 0x2E,0x35,0x4A,0xF9,0x38,0x27,0x50,0xC0,0x6C,0x1D,0x8F,0xE2,0x9F,0xFB,0xCE,0xB9, + + 0x4F,0x90,0xCA,0xBC,0x6F,0x3B,0x66,0x03,0x97,0x2C,0x55,0x8F,0x17,0x72,0xD5,0xBA, + + 0xF9,0x15,0xE0,0xBB,0x45,0xB7,0x5C,0x8B,0x19,0x3B,0xD3,0xF9,0x78,0x5A,0x31,0xEC, + + 0x98,0x78,0xE2,0x2C,0x1A,0x36,0xEC,0xD5,0xED,0x55,0x8F,0xE1,0xE3,0x64,0x26,0x62, + + 0x68,0x2D,0x1A,0x66,0x10,0x88,0x0A,0xA0,0xD5,0x97,0x99,0x88,0xF7,0x4D,0x3C,0x61, + + 0x56,0x8A,0xA4,0x13,0x13,0xE0,0xBF,0xCD,0x24,0x81,0xA2,0x16,0x74,0x81,0x6A,0x91, + + 0x8C,0x88,0x25,0x27,0xC2,0xE2,0x49,0x50,0x8B,0x48,0x7F,0xF7,0x88,0x1D,0xAD,0x6C, + + 0xA4,0x23,0x9A,0xD7,0x91,0x8B,0x21,0x36,0x3B,0x43,0x4E,0x77,0x91,0xE5,0xC1,0xB4, + + 0xEF,0x1E,0xF7,0xA4,0x5E,0x45,0x78,0x53,0x76,0x86,0x92,0x77,0x57,0x34,0x30,0xDA, + + 0x34,0x31,0xEE,0x7E,0x74,0xAD,0x58,0x90,0x0F,0xD4,0x80,0x51,0xF4,0xE1,0x39,0xDB, + + 0x6F,0x6F,0xED,0x9B,0x6A,0xB7,0x65,0x45,0x67,0x4E,0xCB,0xE5,0x4F,0x4D,0xD3,0xB3, + + 0x89,0x9C,0x7E,0xD3,0xBF,0xE2,0xB9,0x52,0x59,0x6A,0xFF,0x05,0x55,0xDB,0x72,0x92, + + 0x08,0xA9,0x26,0xFF,0x0F,0xE8,0xB0,0xA8,0xDD,0x9F,0x9B,0x80,0xFD,0x68,0xAE,0xF2, + + 0x3A,0xC6,0x52,0xF6,0x93,0x62,0xF4,0x88,0x0D,0x69,0xB2,0x2F,0x5B,0xC8,0x0A,0x78, + + 0xE1,0x83,0xFA,0x6B,0xFF,0x0A,0x0B,0x3B,0x6F,0x67,0xCB,0x5C,0x93,0x6D,0x15,0xC3, + + 0xEC,0xAB,0x54,0x6D,0x3E,0xEA,0xFB,0x1A,0x59,0xC1,0x1A,0xFF,0xC5,0xED,0xA1,0x2C, + + 0x2D,0xEC,0xDC,0x3B,0xBD,0xAA,0xE7,0x88,0xA7,0x9D,0x28,0x8C,0xDC,0xF0,0xCB,0xAE, + + 0x07,0x96,0xD0,0x46,0x9D,0x91,0x02,0xFE,0x67,0xBB,0xE2,0x6B,0xB6,0x0C,0xE3,0x8F, + + 0xDB,0x95,0xC3,0x17,0x3F,0xAF,0xB3,0x4A,0x58,0x33,0x06,0x0D,0xB7,0x0F,0xA8,0x3D, + + 0xCD,0xC0,0x27,0x3D,0x12,0x29,0x45,0x42,0x6C,0x62,0x83,0x97,0x4B,0x24,0xDC,0x00, + + 0xA4,0x9B,0x84,0x60,0x24,0xFF,0x8E,0x65,0xBA,0xDA,0x4B,0xD8,0xFB,0x06,0xA9,0x10, + + 0xA5,0xFA,0x53,0x7E,0xBB,0x7C,0x35,0x11,0xE7,0xCD,0xE4,0x3F,0x46,0xAA,0xE5,0xA7, + + 0x84,0x9A,0xC5,0x85,0x9B,0xBF,0x20,0xD1,0x1B,0x90,0xFD,0x3E,0x1D,0x1B,0x15,0x6C, + + 0x50,0x65,0x01,0x08,0xB4,0xF3,0x44,0xCD,0x39,0xDC,0x05,0x48,0xD4,0x91,0xDC,0x3D, + + 0xCF,0x75,0x71,0xB5,0x6D,0xBF,0x4B,0x60,0xE6,0x3E,0x55,0x90,0x94,0xD4,0x70,0xE6, + + 0x21,0xD4,0x78,0x93,0x5B,0xBD,0x1B,0x8C,0xA5,0xD5,0x6C,0xB0,0x0B,0xB7,0xC9,0x5C, + + 0xA7,0xD6,0xE7,0xB4,0x8E,0xBF,0x4D,0x18,0x6B,0x2B,0x71,0x63,0xB5,0xA6,0x85,0x33, + + 0xA3,0xBE,0x8D,0xD5,0xE2,0xBA,0x35,0x6B,0xE1,0x96,0x74,0x81,0xC4,0x55,0x2E,0x8E, + + 0x25,0xF8,0xAA,0x8B,0xD5,0x52,0xF6,0xAE,0x6B,0xDE,0x76,0x8A,0x8C,0xF0,0x29,0x1E, + + 0x05,0xCD,0xBA,0x7A,0x3E,0xA9,0x92,0x38,0xFC,0xE6,0x01,0xEE,0x7E,0xB6,0x19,0x5E, + + 0x4E,0xBA,0xD5,0x0F,0xE4,0xF8,0x17,0x4A,0x4D,0x25,0x34,0x5E,0xEF,0xBA,0x67,0x93, + + 0xC6,0x71,0xF1,0x4A,0x9D,0x36,0x07,0x24,0x6F,0xC7,0xE6,0x38,0x9A,0x24,0xF6,0xB8, + + 0xD5,0x69,0x1D,0x9C,0x30,0xDE,0xBF,0x88,0x9D,0xB9,0x4E,0xD3,0xD9,0xEE,0xCD,0xF6, + + 0xF3,0xEC,0xAF,0x1B,0x53,0xB2,0xCD,0xC2,0x69,0xD7,0x69,0x7A,0x6A,0x30,0xF1,0x4F, + + 0xCA,0x8A,0xAD,0xCA,0x9C,0xB3,0x4F,0x10,0x12,0x6F,0x4F,0x53,0x59,0xB0,0x30,0xDA, + + 0x53,0x7E,0x8F,0x94,0xD4,0x34,0x40,0x79,0x6F,0xC5,0xA6,0x6A,0x5A,0x0E,0xF8,0x88, + + 0xA5,0xD3,0xAE,0xBF,0xF9,0x31,0xAB,0xD3,0x74,0x5B,0x2A,0xC4,0x56,0x22,0x30,0x00, + + 0xA2,0x07,0xAA,0xE7,0x7D,0x3A,0x0D,0x77,0x9F,0x4B,0xC1,0xCD,0xB4,0xC8,0xF9,0x83, + + 0x49,0xDD,0xF9,0xF4,0x33,0xD2,0xD1,0x47,0x3F,0xEF,0x1C,0xCA,0x0C,0x83,0x27,0xAB, + + 0x20,0x0A,0xA9,0x61,0xB0,0x41,0x99,0x2E,0xF9,0xEE,0x0F,0x55,0x95,0xA6,0xF8,0x04, + + 0x3A,0x00,0xBA,0xA4,0x55,0x89,0xDB,0x02,0x61,0xE7,0xEA,0x9F,0xA2,0x6D,0x72,0xAF, + + 0x83,0x67,0x93,0xA7,0x97,0xA8,0x48,0x60,0xE2,0xC7,0x90,0xC0,0xA2,0xC1,0x80,0xB0, + + 0xBA,0x26,0x57,0x74,0x33,0xA7,0x0B,0x5D,0xFA,0x04,0xEA,0xA2,0x18,0x4F,0x77,0x78, + + 0xC0,0x08,0x9B,0x1E,0x95,0x06,0x21,0x81,0xB7,0xE6,0x45,0x97,0x33,0xB2,0x50,0x8A, + + 0xC1,0xD7,0xBC,0x39,0x2B,0x93,0x83,0xAD,0x46,0xC2,0x04,0x5E,0x6B,0x08,0x53,0x88, + + 0xAC,0xD6,0xD1,0xE8,0x11,0x32,0x12,0x15,0xA0,0xF0,0x18,0xD4,0x55,0x24,0x3B,0xBB, + + 0xC8,0xBB,0x19,0x6D,0xC8,0x31,0xC4,0x6E,0x02,0x7B,0x6B,0x5E,0x8B,0x63,0x0A,0x7F, + + 0x76,0x49,0xD4,0x2B,0xF5,0xA6,0x7D,0x41,0x44,0x50,0x8D,0x55,0x7E,0x6D,0x5A,0x51, + + 0xEB,0xA3,0x5F,0x8B,0xD0,0x5D,0x43,0xEC,0x6A,0xCC,0xAA,0x80,0x5A,0xCD,0x5C,0x6D, + + 0x0D,0x0C,0xC2,0x2E,0xF0,0x3C,0xCC,0x47,0x7B,0x0F,0x09,0x8F,0x37,0x98,0x56,0xB6, + + 0xE9,0x19,0x78,0xDE,0xAE,0x26,0x6B,0x79,0x69,0xFB,0x18,0x9E,0xEA,0x33,0x83,0x2B, + + 0x28,0x84,0x0B,0x7D,0xCE,0x22,0x56,0x76,0xCD,0x4E,0x10,0x02,0x54,0xC9,0x5D,0x14, + + 0x87,0x00,0xDF,0x90,0xD5,0x5C,0x4D,0x2D,0xC7,0x54,0x95,0xC2,0x9B,0x01,0xCC,0x38, + + 0x96,0xBA,0xEC,0x96,0x4A,0x3C,0xE4,0x58,0x41,0x1C,0xED,0x85,0x1D,0x33,0xFD,0x03, + + 0x7D,0x9F,0xE7,0x95,0xB1,0x53,0x17,0xD3,0xD3,0x12,0xAF,0x56,0x9C,0xF9,0x18,0x6E, + + 0x92,0xA8,0xC7,0x35,0x4E,0xC4,0xE2,0x59,0xFF,0x1E,0x8D,0x71,0x50,0x7A,0x4C,0xC4, + + 0x8B,0xAE,0x7C,0x3B,0x01,0x4C,0xAB,0x93,0x52,0x38,0xB4,0xE6,0xA3,0x79,0x35,0xB6, + + 0x00,0x55,0x33,0x16,0x92,0x2A,0x11,0x83,0x5B,0xDF,0xD4,0xE4,0x40,0xC1,0x1F,0xCB, + + 0xCA,0xF7,0x7D,0x3B,0x4F,0xEE,0xB2,0x21,0xE6,0x7B,0x2A,0x9E,0x7D,0x80,0x71,0x18, + + 0xC0,0x6D,0x72,0x33,0x33,0x07,0xDA,0x91,0xEF,0x3D,0x07,0xF4,0x0A,0xD6,0xBC,0x77, + + 0x17,0x29,0xC6,0x95,0xD1,0xA2,0x14,0x4E,0xE7,0xAE,0x59,0x5C,0x0C,0xD9,0xB6,0x87, + + 0x19,0x02,0x96,0x8D,0x0A,0xA2,0x24,0x5E,0x6F,0x31,0xA6,0x5C,0x32,0xF2,0x58,0x08, + + 0xAE,0x4B,0xDF,0x9D,0x51,0xD3,0x5F,0xAD,0x40,0x61,0x01,0x29,0xD8,0xFA,0x2F,0xEF, + + 0x56,0x60,0x4D,0x9F,0xE9,0xB6,0x61,0xA6,0xD1,0x8F,0x07,0x8C,0x95,0x64,0x50,0xFD, + + 0x2C,0x1D,0xC0,0xE4,0xD3,0x2D,0x43,0x0A,0xB7,0x61,0x43,0x1F,0x46,0xF1,0x16,0xDC, + + 0xA2,0x02,0x62,0xCD,0x57,0x11,0x71,0x93,0xB2,0xA8,0xD8,0xD5,0xFB,0x7B,0x45,0xAB, + + 0x11,0x91,0x6B,0x5F,0xE6,0x36,0xF8,0x6D,0xE9,0xCE,0x81,0xC1,0x11,0x2F,0x15,0xBD, + + 0x93,0x00,0x1A,0xF9,0x52,0x85,0xC9,0x7D,0xEE,0x38,0xBF,0xFF,0x22,0x72,0xAA,0xBD, + + 0x37,0x42,0xF9,0x03,0xB3,0xBB,0x92,0xB4,0xAF,0x21,0x9E,0xC0,0xF5,0x1F,0xD7,0x96, + + 0x40,0x76,0x57,0x51,0xDF,0x90,0xAE,0xF2,0x13,0xDA,0x5F,0x76,0x1D,0x6C,0x99,0xFD, + + 0x94,0xCF,0x66,0x61,0xFC,0x93,0x0F,0x0B,0x49,0x64,0xE8,0x22,0x71,0x8E,0x70,0xEF, + + 0x60,0xEF,0xE1,0x13,0xEA,0x5C,0xB9,0x55,0x85,0x8C,0x41,0xB3,0xDA,0xCD,0xF8,0x73, + + 0x6A,0x9B,0xB8,0x7A,0x10,0xA5,0xA5,0x1D,0xE5,0x4F,0x3F,0xA6,0x40,0x6F,0x43,0x63, + + 0x6B,0xC7,0x7B,0x67,0x27,0xE7,0xB0,0x00,0xE4,0x65,0x58,0x86,0xA9,0x46,0x5F,0x6A, + + 0x21,0x0D,0x34,0x38,0x35,0x2D,0x00,0x4A,0xC0,0xC7,0x8A,0x56,0xE6,0x49,0x79,0xE4, + + 0x7A,0x88,0xF9,0x47,0xF4,0x87,0x32,0x83,0xD8,0x66,0x6F,0x84,0x5B,0xEA,0x44,0x73, + + 0x0D,0xC8,0x9C,0x22,0x93,0x5E,0x50,0x2B,0x4D,0x6A,0x22,0xDF,0x68,0xE8,0x04,0xE4, + + 0xAE,0x92,0x10,0xFE,0x5D,0x69,0xC5,0xBE,0x73,0x88,0xF3,0xDE,0x45,0xF2,0x91,0x73, + + 0x6D,0x8C,0xAB,0xBE,0xAF,0x31,0x0D,0x03,0xA4,0x53,0x95,0xFB,0xE0,0x47,0x69,0xFD, + + 0x9D,0xC4,0xF2,0x1A,0x3A,0xB0,0xFB,0xFE,0x46,0x46,0xB1,0x59,0x36,0xBA,0x64,0x7F, + + 0xE7,0x6D,0x9A,0x75,0x72,0x59,0xE4,0xEE,0x6E,0x4C,0xE5,0x95,0x16,0xFD,0x50,0xA9, + + 0x63,0x20,0xB0,0x3A,0x77,0xBC,0x78,0x6B,0x7F,0xC9,0xFC,0x4B,0x03,0xE9,0x79,0x56, + + 0xAD,0x7A,0xF2,0xCB,0x8B,0x6A,0x29,0x94,0x6D,0xCA,0xCD,0x47,0xFD,0xAE,0xFD,0x1C, + + 0x45,0xB5,0x92,0x35,0x1E,0xA2,0x8D,0x93,0x61,0x82,0xC3,0x67,0x5F,0x63,0x31,0xF0, + + 0xDF,0xD2,0xFD,0x7E,0xD3,0x1D,0x25,0xD0,0x9B,0xCB,0x0C,0x55,0x4C,0x7B,0x12,0xA7, + + 0xC6,0x98,0x6C,0x3B,0x11,0xB7,0x5C,0xE1,0x9F,0xDC,0xAC,0x01,0xD4,0x0E,0xB4,0xE5, + + 0x78,0x73,0xB4,0xB6,0xC5,0x4D,0x6E,0xD5,0xC5,0xC2,0x9E,0x96,0x98,0xB0,0xA9,0x80, + + 0xC9,0x82,0x83,0x38,0x14,0x4C,0x91,0x20,0xD5,0x2C,0x83,0x9E,0xD6,0x61,0xDC,0x31, + + 0x1E,0x8F,0xBA,0x24,0x32,0x31,0x2E,0xE8,0x0E,0x35,0x0B,0x21,0x9F,0x85,0xC0,0x4D, + + 0x26,0x2F,0x79,0xA4,0xDC,0x84,0x0D,0xDB,0x61,0xD4,0xFC,0xB6,0x37,0xEE,0x91,0xA5, + + 0x59,0xAB,0xC3,0x25,0x82,0x19,0x0C,0x85,0x19,0x5D,0x12,0x94,0xC2,0x70,0x53,0xFA, + + 0xE4,0x98,0xD3,0xFE,0x3A,0x11,0xB5,0x8C,0x44,0x5C,0xDA,0x03,0xFF,0xB6,0x7F,0x88, + + 0xC9,0x33,0x98,0xA7,0xB3,0x4E,0x89,0x6D,0xAE,0x98,0x5E,0x32,0x4F,0xEF,0x77,0x1F, + + 0x88,0x68,0x9E,0x76,0x39,0xF4,0xC5,0x7A,0x2D,0x54,0x06,0xDE,0x71,0x04,0x5F,0x96, + + 0x4C,0x65,0xAF,0x8A,0xBA,0x62,0x3F,0xA2,0x11,0x5C,0x0F,0x4F,0xF8,0xE8,0xD0,0x1F, + + 0xF4,0x9C,0xF7,0x0A,0x8E,0x20,0x66,0x43,0x0A,0xDD,0xA7,0xAA,0xCE,0x5C,0x3E,0x1F, + + 0xC5,0x8D,0xA9,0x0E,0x07,0x37,0xEE,0xC3,0xDD,0x71,0x96,0xAA,0x21,0x77,0x50,0xF2, + + 0xA2,0x6B,0x56,0xBE,0x64,0x48,0x24,0x37,0x07,0x3C,0xF2,0x7C,0x7A,0x99,0x3E,0x6C, + + 0x0B,0x61,0xC6,0xFE,0x86,0xA1,0x62,0x0D,0x47,0xE4,0x73,0x0D,0xF8,0x16,0x27,0x66, + + 0xA9,0x9E,0xFA,0x5B,0xFC,0x53,0xBF,0xDB,0xAF,0xD2,0xA5,0xEF,0x5C,0xBE,0xA7,0x2D, + + 0x87,0xF1,0x7F,0x7E,0x3E,0xFF,0x72,0x31,0x43,0xA0,0xE8,0x35,0x20,0x64,0xB0,0xC0, + + 0xA2,0x6F,0x6B,0x54,0x01,0x8C,0x1E,0x70,0x15,0x2F,0xD6,0xB9,0x32,0x41,0x5B,0x65, + + 0xFC,0x1D,0x6D,0x6A,0x4E,0x7F,0xD1,0x00,0xA0,0xC4,0xFD,0x1A,0xA4,0x20,0x6B,0x91, + + 0x80,0x43,0xD9,0x44,0xED,0x28,0x40,0x7D,0x64,0x35,0x42,0x35,0x61,0x12,0xC2,0xC4, + + 0x7C,0x0B,0x64,0xC0,0x52,0xF8,0x8A,0x7D,0x71,0xC0,0xEE,0xC0,0x98,0xB7,0x2E,0x28, + + 0x00,0x85,0xE8,0x12,0x5B,0x94,0xFF,0x92,0x83,0xEA,0xA1,0x07,0x79,0xEC,0x18,0xBC, + + 0x67,0x68,0xC7,0xE5,0xDA,0xF7,0xEB,0x9E,0x2B,0x2F,0xEF,0xDC,0xB3,0x62,0x77,0x29, + + 0xC3,0xC8,0xE9,0xDA,0x11,0xEB,0xCE,0x02,0xEE,0xB3,0xF9,0xFF,0xF7,0x3B,0x16,0x93, + + 0xF4,0x79,0x02,0x2D,0xC2,0x95,0x53,0x4E,0xDE,0x40,0x93,0x2E,0x10,0x04,0x0E,0xE4, + + 0x09,0x1C,0x0A,0x5B,0x37,0xF5,0x19,0xFF,0x7A,0x43,0xF3,0xD7,0x5F,0x68,0xC3,0x58, + + 0xE8,0x81,0x28,0x77,0x4D,0x31,0x53,0x6F,0xB4,0x4E,0x47,0x73,0xF6,0xB6,0x9E,0x11, + + 0x09,0xAB,0x5F,0x43,0x0A,0x14,0xA3,0xB6,0xDB,0x06,0xA3,0x19,0x38,0x70,0xEE,0x3B, + + 0x73,0x17,0x78,0x3F,0x6B,0x23,0x2A,0x7A,0xA3,0x43,0x69,0x22,0xC7,0x91,0xB1,0xB0, + + 0x74,0xC0,0x97,0x40,0xB6,0x48,0x64,0x1D,0x23,0xBC,0x81,0x7C,0xFA,0xB2,0xE1,0xDF, + + 0x75,0x8C,0x77,0x3E,0xE3,0x21,0x4B,0x6D,0x82,0xBF,0x7E,0x1E,0xB6,0xD1,0xE7,0xC7, + + 0x8A,0x8F,0xB3,0xB5,0xC7,0x62,0x19,0x6A,0xB7,0x40,0x6F,0x1F,0x24,0x2F,0x3A,0x21, + + 0x62,0xEF,0x13,0x76,0xC7,0x2B,0xEF,0xA9,0x8D,0x4B,0x2E,0x63,0xB2,0x20,0x04,0x94, + + 0x09,0x02,0x8D,0xF2,0x6E,0x7E,0xC8,0xEE,0xF2,0x6E,0xC5,0xB4,0x12,0x81,0x3B,0xB9, + + 0x2D,0xE4,0x73,0xE3,0xE7,0x7D,0x95,0xE6,0xCE,0x8E,0x9D,0xB0,0x97,0x22,0x33,0xA9, + + 0xE1,0xBC,0x1D,0x17,0x0D,0x31,0xE2,0x49,0xE1,0xE8,0x65,0x31,0xCB,0xB3,0xBE,0x28, + + 0xAA,0xD9,0x3F,0xBB,0x5A,0x39,0xAB,0x93,0x40,0x3A,0x42,0x66,0x82,0x36,0x15,0xD6, + + 0xC6,0x13,0x96,0x54,0x4F,0x9A,0x0C,0x82,0x88,0x84,0xDA,0x54,0xD2,0x34,0x25,0x61, + + 0xBA,0x19,0x3A,0xBB,0x9C,0xE9,0xB2,0xA1,0xE6,0xA2,0x8B,0x07,0xF6,0x34,0x1D,0xCC, + + 0x00,0x7B,0x6D,0x25,0x0D,0xE4,0x63,0xCD,0x6E,0xF1,0x87,0x4E,0x8F,0xD8,0x11,0xFB, + + 0x50,0x74,0xBE,0x7F,0x4C,0x93,0x92,0x2C,0x60,0xB4,0xF6,0x0C,0x60,0x75,0x1A,0x28, + + 0x4A,0x1B,0x22,0x0F,0x13,0x33,0xFD,0xF8,0x22,0xF4,0x1C,0xCE,0x4A,0xBD,0x61,0x28, + + 0xA9,0x5A,0x94,0x8C,0x51,0xAB,0xFB,0xC6,0x36,0x07,0xCE,0x50,0x1F,0x36,0x19,0xA1, + + 0xAF,0x1A,0x9E,0x6D,0xBB,0x9A,0x4F,0xE8,0x95,0x50,0x65,0x55,0xFD,0x34,0x1F,0x35, + + 0xCF,0xBA,0xB8,0xCB,0x1E,0x27,0xC1,0x28,0x04,0x1E,0x76,0x9E,0x18,0x40,0x6E,0x5C, + + 0x19,0xC1,0x03,0xAF,0x2C,0xB4,0x76,0xFE,0x6D,0xDD,0xA0,0x49,0xD7,0x70,0x5C,0x3A, + + 0xD2,0x05,0x37,0x0A,0x1F,0x98,0x06,0xDF,0x6B,0x3A,0xA9,0xEA,0xDE,0x73,0x16,0x5C, + + 0x42,0x10,0xEF,0x2E,0x18,0x2D,0x6A,0x93,0x6A,0x52,0xA1,0x55,0x74,0xD9,0x8C,0xA7, + + 0xD1,0xE3,0x5F,0xC1,0xA9,0x56,0xD1,0x62,0x40,0x8C,0x16,0xD0,0xD9,0x4D,0x71,0xA5, + + 0xA0,0x5B,0x96,0xDF,0x9A,0xBA,0xB8,0xD2,0x14,0x34,0xAF,0xDE,0xD9,0xA3,0x8A,0xC9, + + 0x3F,0x7D,0x18,0x99,0x95,0xB2,0xA6,0x50,0xEE,0x4B,0xAE,0xB4,0xA5,0x4D,0x57,0x2E, + + 0x95,0xCE,0xCB,0x81,0x96,0x1A,0xAA,0xB7,0xCE,0x48,0xE8,0x69,0x1D,0xEC,0xDF,0x72, + + 0xF1,0x4B,0x54,0xA4,0xBA,0x2F,0x52,0x8A,0x86,0x0B,0xF4,0x31,0xD4,0x71,0x31,0x51, + + 0xE0,0x78,0x8D,0x34,0xE8,0xBE,0x6F,0x01,0x3F,0xA9,0x38,0x67,0x75,0xE8,0x38,0xBE, + + 0x63,0x79,0xE5,0xA5,0x90,0xB5,0x4B,0x90,0xE4,0x69,0x72,0x96,0x75,0xA6,0x30,0x45, + + 0xE3,0xBC,0x2D,0x31,0x60,0x5A,0x20,0x61,0x01,0xCD,0x69,0x04,0xBB,0x46,0xED,0xF9, + + 0x2E,0x03,0xA4,0x37,0x14,0x82,0x8D,0x6D,0x8E,0x48,0x25,0xC6,0x5C,0x63,0x3A,0x0A, + + 0xAC,0x26,0xFA,0x23,0x1B,0x04,0x28,0xA8,0x0D,0xC1,0xA2,0x2E,0xFA,0xF2,0xB0,0x3A, + + 0xB0,0xC8,0xA5,0x37,0x94,0xA2,0x3B,0x13,0xCA,0xEB,0x34,0xC9,0x35,0x1B,0x7F,0x69, + + 0x66,0x1A,0xFB,0xED,0x62,0x06,0x2D,0xD2,0x11,0x26,0x1F,0x2B,0xEE,0x8F,0xC2,0xBD, + + 0x2C,0x4C,0x71,0xCC,0xDB,0xD1,0x3D,0xEE,0x7C,0x09,0xCA,0x5E,0x34,0x43,0x33,0x59, + + 0xE8,0x96,0xD4,0xEF,0x77,0x5C,0x7A,0x7A,0x4F,0xA1,0x84,0x79,0xFE,0x32,0x60,0xA3, + + 0x0A,0x43,0x9B,0x6B,0xE9,0xAE,0xB3,0x7B,0x2B,0xCE,0x53,0x1D,0xBC,0xD2,0xB4,0x2D, + + 0xBC,0xCB,0x14,0x21,0xF5,0x2C,0x45,0x1E,0x05,0x3E,0x4F,0x1D,0xFB,0x42,0x26,0xE0, + + 0xDB,0x1B,0xB7,0x02,0x14,0x30,0xBB,0x86,0x57,0x24,0xED,0x2B,0xD3,0xF3,0x3C,0x82, + + 0x84,0x2E,0x1B,0xAA,0x33,0x99,0xC3,0x75,0xD8,0x27,0x3B,0xD4,0xF8,0xEA,0x65,0xB2, + + 0xDC,0xD0,0x9D,0x74,0xCC,0x0D,0x8F,0x5D,0xF4,0x1F,0xB2,0x2A,0x76,0xF1,0xED,0x2E, + + 0x79,0xEF,0x33,0x67,0xAA,0x12,0x84,0x2D,0xE4,0xDB,0x62,0x21,0xCE,0x37,0x9C,0x46, + + 0x3B,0xEB,0x5C,0xB6,0xB6,0x12,0x49,0xA0,0xC7,0x59,0x24,0x95,0x5C,0x7D,0x56,0x3A, + + 0x3D,0xDA,0xB2,0x34,0x33,0xB3,0x07,0x02,0x4F,0x74,0xE6,0xF4,0xE5,0xB4,0x3C,0x3A, + + 0x5B,0x59,0x9D,0xE3,0x5F,0x57,0xAA,0xE2,0x11,0x69,0xD5,0x0D,0x1F,0x15,0x0D,0xD1, + + 0x23,0x9A,0xDE,0x57,0xB3,0x17,0x2D,0x19,0x42,0xE8,0xA4,0xAA,0x56,0x08,0x99,0xC5, + + 0xB9,0x45,0xB1,0x0A,0x1C,0x38,0x08,0x0A,0x25,0x29,0x48,0x46,0xB8,0x35,0x16,0xAB, + + 0x8C,0x36,0x3D,0xAF,0x01,0xFB,0x99,0xCC,0x9E,0xC9,0xC4,0xAE,0x9A,0xF4,0x8E,0xF8, + + 0x90,0x3B,0xFD,0x70,0x1F,0x31,0x6F,0x07,0xC8,0xC1,0x48,0x0F,0x11,0xCA,0xBC,0x1F, + + 0x85,0x8A,0xBF,0x8F,0x1C,0x39,0x85,0x40,0x85,0xD6,0xE6,0x42,0x1A,0xB5,0x3F,0xD8, + + 0xC9,0x51,0xB6,0xBD,0x0E,0x1D,0x0F,0x6E,0x2E,0x95,0x42,0x8C,0xA3,0xB3,0x37,0xC8, + + 0xCA,0xF3,0x4E,0xAC,0x5D,0x81,0x46,0x10,0x69,0x5D,0x12,0x8D,0x49,0x5B,0x3F,0xCF, + + 0xC9,0xBE,0xDF,0xFF,0xCD,0x11,0x1F,0x89,0x55,0xD0,0xF6,0x90,0x59,0xBF,0x0D,0xC6, + + 0xAE,0xDF,0x91,0xD8,0x9B,0xD1,0xBA,0x39,0x6B,0xD1,0xAC,0x8C,0xC1,0x76,0x20,0xEA, + + 0xE9,0x33,0xE6,0x29,0xE5,0x86,0x28,0xDF,0xEC,0x4D,0x6F,0x00,0x63,0xBC,0x1E,0x72, + + 0x61,0xA6,0x61,0x72,0x32,0x81,0x19,0x4F,0xA6,0x00,0xA2,0xCF,0x57,0x02,0x1B,0x03, + + 0x12,0x43,0x10,0xC5,0x84,0x39,0x48,0x3E,0x1D,0x8D,0x29,0xDA,0xEF,0x9D,0x77,0x17, + + 0x60,0x80,0x21,0x29,0xEE,0xDC,0x21,0xC2,0xB9,0x26,0xBA,0x2A,0xBD,0x78,0xF9,0x50, + + 0xB9,0xFB,0x71,0xA5,0xFB,0xDD,0xD0,0xA4,0x71,0xA0,0x0A,0x64,0x61,0xF6,0x7F,0x79, + + 0x05,0x25,0x91,0x44,0xB6,0xA4,0x3E,0x03,0x76,0xCC,0x5D,0xCC,0x60,0x81,0x9A,0x41, + + 0x72,0x17,0x99,0x41,0x26,0x2D,0xEB,0x01,0xC6,0x6B,0x69,0x75,0x75,0x65,0x3F,0x23, + + 0x70,0xB8,0x36,0xAA,0x72,0xA4,0x5D,0x11,0xC7,0x6A,0x03,0x74,0x56,0xE7,0xA8,0x2C, + + 0xF7,0x85,0x12,0x2C,0x24,0xF1,0x2A,0xDB,0x3C,0x09,0x39,0x4A,0xA7,0x13,0x9F,0x87, + + 0xFC,0x80,0x0D,0xE3,0x6E,0x29,0x0C,0x5A,0x21,0x44,0x4E,0x26,0xC4,0x94,0xD7,0xF7, + + 0x07,0xA7,0xDA,0x56,0x3D,0xA0,0x48,0x67,0xB3,0x21,0x97,0xD4,0x80,0x28,0x2B,0xF3, + + 0xEA,0x0F,0xD2,0xDF,0x3C,0xB4,0xE6,0x1D,0x20,0x08,0x36,0x7A,0x64,0xCD,0x7C,0x75, + + 0x76,0xA3,0x3D,0xB2,0xE2,0x55,0xDA,0x1B,0x37,0x47,0x12,0xA9,0x55,0x68,0x34,0x64, + + 0xF2,0xAE,0xBC,0x23,0x2F,0x92,0x10,0x67,0x78,0xED,0x83,0xF0,0xFE,0x92,0xD4,0x3A, + + 0xFE,0xDD,0x98,0x4D,0x9C,0x0E,0x11,0x56,0xE9,0x0C,0x87,0xE9,0xD5,0x04,0x5C,0xAA, + + 0xF3,0x92,0xF0,0xE1,0x68,0x52,0xE4,0x9F,0x37,0x64,0x82,0x6A,0x3E,0x03,0x3C,0x7B, + + 0xAD,0x51,0xE2,0xAC,0x33,0x00,0x54,0xA4,0x28,0x53,0x93,0xCA,0xFF,0x06,0x4D,0xF6, + + 0x43,0xAE,0x37,0x07,0x05,0x39,0x62,0xB6,0x80,0xD2,0x3B,0x30,0x03,0xE6,0xBD,0xB1, + + 0xA0,0x6D,0x29,0xFA,0x7A,0x43,0x03,0xC3,0x80,0xB0,0x9D,0xB9,0xF6,0xE1,0xF4,0x56, + + 0x58,0x65,0x09,0x68,0x46,0x72,0x30,0x95,0x63,0x2F,0x95,0xB0,0x8E,0xAC,0xE9,0xBF, + + 0xBF,0x48,0xE4,0xD8,0xDB,0x6D,0x6E,0x45,0x9D,0x4F,0x0F,0x92,0x8D,0x36,0x35,0xEF, + + 0x5F,0xC0,0x92,0x9D,0x3F,0x31,0x62,0x8D,0xA2,0x36,0xB4,0xF2,0xF0,0x11,0xFE,0x8F, + + 0x43,0x29,0xDB,0xA8,0x91,0x96,0xDE,0x87,0xBF,0xA9,0x5C,0xD4,0x71,0x78,0xDE,0x55, + + 0xAF,0x23,0x49,0x24,0xAA,0x17,0x89,0x21,0x62,0xAF,0xB5,0x17,0x70,0x7A,0x3D,0x06, + + 0x0C,0xB5,0xDF,0x4A,0x9D,0xE7,0xB2,0xCA,0x03,0x09,0x06,0x20,0xF8,0xC5,0x30,0x28, + + 0x07,0xC6,0xE8,0xB1,0xCC,0x9F,0x4D,0x4B,0xD6,0x05,0x0B,0x4F,0x05,0xD6,0x51,0xB8, + + 0x09,0xE5,0x86,0xEB,0x47,0x54,0x17,0x5A,0xD4,0x18,0xAD,0x5E,0xCC,0xD5,0xB0,0xA9, + + 0xAB,0x5A,0x1E,0x5D,0xA1,0xC6,0xA4,0xF7,0x00,0x41,0x0C,0x4E,0x81,0xD4,0xD6,0x8A, + + 0x8B,0x10,0xF8,0xA0,0x78,0xC3,0x5C,0x48,0xD5,0xE9,0x06,0x6E,0x58,0x8E,0xEE,0x9A, + + 0xA8,0xB6,0xC3,0x58,0x26,0xB5,0x14,0x13,0x58,0xFD,0xBE,0x5C,0x21,0xF6,0x3F,0x8B, + + 0x26,0x12,0x07,0x0C,0xC8,0x8B,0xCB,0xD6,0xD7,0x1C,0xEF,0xBD,0xFE,0x71,0x27,0x59, + + 0x89,0x0F,0x0F,0x1D,0x0F,0x92,0xE7,0x06,0xD8,0xBF,0xDB,0x1F,0x79,0x7C,0x41,0x26, + + 0x67,0x45,0xA1,0x60,0xEF,0xE2,0x26,0x40,0xBB,0x6D,0x26,0xE1,0x96,0x80,0x7A,0x44, + + 0xEE,0xE5,0xCE,0x74,0xEE,0x3E,0x58,0x65,0xE6,0x81,0x28,0x44,0xE2,0xBC,0x36,0xF0, + + 0x00,0x0F,0xA5,0xB4,0x61,0xC1,0x65,0x86,0x33,0x83,0xB9,0x22,0xAB,0x3D,0xB9,0x97, + + 0x81,0x8C,0xF0,0x07,0x93,0x23,0x3B,0x18,0x5C,0x7E,0x15,0xA4,0xB9,0xE9,0x36,0x7A, + + 0xED,0x15,0xF6,0x24,0xDE,0xDD,0xB0,0xB2,0x3E,0xDF,0x17,0xA6,0x4A,0xA6,0xFF,0x6C, + + 0x73,0x30,0xD7,0xC9,0xE8,0x38,0xB8,0x4D,0x6C,0x87,0xE0,0x9E,0x9B,0x25,0xE0,0x41, + + 0x74,0x73,0x99,0x75,0x69,0xCA,0xF7,0x1C,0x61,0xC2,0xBB,0xFC,0xD0,0x35,0x7E,0x69, + + 0xF7,0x9C,0x8F,0xB5,0x60,0x12,0x33,0x6C,0xF4,0x27,0xD9,0x7E,0xE4,0x03,0x18,0xE7, + + 0x7C,0xD3,0x2D,0x10,0x2C,0x5C,0x1F,0x64,0xB9,0x94,0x31,0xAA,0x2E,0x1C,0xAA,0x0A, + + 0x7B,0x26,0x51,0x16,0xB8,0x56,0x5A,0x6D,0xEE,0x89,0x3E,0xC3,0xAA,0xA8,0x27,0xE0, + + 0x3F,0xE4,0xB6,0xE7,0x5F,0xE7,0x9E,0x54,0x51,0x8B,0x73,0x97,0x2E,0xE2,0x8F,0x79, + + 0x7E,0xEE,0x47,0x8C,0xA5,0x76,0x39,0x38,0x4F,0xBE,0x3A,0x3D,0x2C,0xB0,0xE6,0xCE, + + 0x4E,0xC5,0x7E,0xB6,0x1E,0xEE,0xCD,0x8C,0xB2,0xC7,0x28,0x6E,0xD9,0x6C,0x4D,0x63, + + 0xDF,0x1C,0x51,0xB8,0x0F,0x50,0x7C,0x05,0xE8,0x8F,0x2C,0x42,0x6C,0x09,0xC4,0x76, + + 0x5A,0x5F,0xE7,0xFC,0xAD,0xFE,0xB3,0xBB,0xB6,0xD5,0x33,0x33,0x2F,0xAC,0xD8,0x77, + + 0x73,0xFE,0x13,0xAE,0x86,0xAF,0x76,0xC4,0x6B,0x8D,0x41,0x9F,0x93,0xF4,0x5A,0x84, + + 0xC5,0x13,0x41,0xF8,0xA2,0xB8,0x6C,0x22,0x57,0x48,0xA7,0x88,0x18,0xAD,0x76,0x98, + + 0x4D,0x70,0xF5,0xC9,0x90,0x31,0x84,0x41,0x59,0xCA,0x7C,0x0E,0xA9,0xAC,0x8F,0x70, + + 0x28,0xD3,0xE1,0x27,0xC0,0x62,0x8D,0x50,0xD0,0xC2,0x59,0x28,0xF7,0x01,0x53,0x95, + + 0x44,0x10,0xF3,0x75,0xA5,0x36,0xCC,0xD5,0x52,0xC3,0x7D,0xA6,0xD7,0xFE,0x24,0x04, + + 0x6E,0xD6,0x7D,0x01,0xFC,0xCD,0xCC,0x19,0x0D,0x0C,0x33,0x84,0x37,0xD4,0x56,0x2D, + + 0x21,0xED,0x2C,0x13,0xDE,0x1E,0x32,0xE3,0x54,0xAE,0xC6,0x14,0xF5,0xBD,0x29,0x7B, + + 0xDD,0x92,0xED,0xA7,0x57,0x49,0x75,0xCC,0xCB,0x94,0x8D,0x65,0xD4,0x24,0x67,0x15, + + 0xE7,0xBA,0x74,0xD7,0x30,0xB5,0xC7,0x1C,0x0E,0xAE,0x37,0x07,0xFB,0xF8,0x8C,0x79, + + 0xA0,0xD9,0xC6,0xC1,0xB4,0xB7,0x8E,0x45,0x5F,0xD6,0xC8,0x86,0xD0,0xF5,0xD1,0x5D, + + 0xE7,0xDA,0xF7,0xC0,0x98,0x39,0xC1,0xFD,0xF3,0x04,0xC0,0x93,0x94,0xE8,0x1F,0x75, + + 0x00,0x97,0x87,0x8B,0x39,0x6B,0x8F,0x55,0xFC,0x97,0xC9,0x86,0x94,0x8B,0x94,0x08, + + 0x87,0xDA,0xF1,0x7D,0xAD,0x3E,0xDE,0xFB,0xB5,0x26,0xE9,0x93,0x16,0xAA,0xCC,0x48, + + 0x0C,0xD8,0x0E,0xDE,0x0D,0xC7,0xD3,0x08,0x8E,0x78,0xCC,0x11,0x78,0x96,0x91,0x58, + + 0xE2,0x11,0x11,0x36,0x00,0x70,0x27,0xF2,0x86,0xD2,0xE1,0x13,0x3E,0x70,0x5F,0x35, + + 0x02,0x93,0x65,0x27,0xFE,0xF3,0xEB,0x09,0x0E,0x21,0xC9,0x13,0x37,0x05,0xD4,0xC4, + + 0x0C,0xDD,0x43,0x40,0xBE,0x77,0x87,0xF3,0x12,0x90,0x80,0xFB,0xBC,0xC8,0x5A,0x3C, + + 0x68,0xE1,0x40,0xC4,0xE9,0x4E,0x40,0x53,0x67,0xEB,0xB0,0xD7,0xF3,0x72,0xBD,0xE3, + + 0x8D,0x40,0xEA,0x15,0x35,0xAA,0xB5,0xC3,0xC5,0xCC,0xE0,0x10,0xDE,0xCC,0x7F,0x07, + + 0x61,0x81,0x3E,0x97,0x90,0xFF,0x69,0x35,0x20,0xC3,0x29,0x55,0x50,0xC4,0x77,0x16, + + 0x34,0x0C,0xFE,0x24,0xFD,0x3C,0x4B,0x7F,0xE5,0xEE,0x54,0xA6,0xE1,0xCE,0x1A,0x42, + + 0x90,0x45,0x75,0xC0,0x47,0xB5,0x2E,0x66,0xA3,0xC7,0xEE,0x4D,0x90,0x54,0xFC,0x77, + + 0xA2,0x9A,0x5E,0x13,0xD9,0x1F,0x5A,0x73,0x70,0xD9,0x74,0x0B,0x91,0x60,0xE4,0x47, + + 0x16,0x62,0xFB,0xB6,0xFE,0x8B,0xF8,0x92,0x4E,0x06,0xD9,0x61,0x52,0x7E,0xFD,0x33, + + 0xA7,0x5C,0xC1,0x51,0x1B,0xB5,0xE1,0x8E,0x4E,0x5C,0x62,0xE7,0xD3,0x6D,0xB6,0x67, + + 0xAB,0xB5,0x3A,0xF3,0x7B,0x42,0xCA,0xD9,0xEB,0x88,0x04,0x5C,0xD8,0x77,0xBF,0x8F, + + 0x0F,0xA9,0x72,0x38,0xB8,0x96,0xBA,0x4A,0x2B,0x35,0xFB,0x18,0xA6,0xBC,0x5D,0xEB, + + 0x8C,0x0C,0x95,0x38,0x2B,0xD7,0x21,0x19,0xA0,0xE5,0xAD,0xE1,0xB9,0x6E,0x5B,0x7B, + + 0xAD,0x97,0x4B,0xCD,0x25,0xD6,0x8B,0xC9,0x8E,0x3A,0x8A,0x2C,0xE9,0xE0,0xF7,0xA5, + + 0x08,0xA7,0x98,0x81,0x72,0xCD,0x3E,0x0E,0x94,0xC7,0xD1,0x1F,0x6E,0xEA,0x11,0x5A, + + 0x74,0x2D,0xB4,0x74,0xF8,0x26,0xC9,0x8B,0xCF,0xC0,0x5E,0x3C,0x5F,0x69,0x15,0x48, + + 0xF1,0x0E,0x03,0x6D,0xDA,0x23,0x73,0x4D,0xA9,0xCB,0xFB,0x1E,0xE2,0xE8,0xDB,0xDB, + + 0x0B,0x44,0x4B,0x5E,0x89,0xA4,0x09,0x33,0x20,0x2B,0x0F,0xBA,0x32,0x3E,0x8C,0x27, + + 0xDC,0x01,0xBC,0x7F,0xCD,0x71,0x82,0x51,0xC3,0x10,0x04,0xCB,0x8F,0xAB,0x2D,0xA1, + + 0x4D,0x0E,0xA1,0x67,0xBD,0x70,0x1A,0x10,0x02,0x3A,0x24,0x4F,0x77,0x51,0xC5,0x41, + + 0xF0,0x99,0xFB,0x83,0x51,0xB1,0x75,0x33,0x06,0x12,0x95,0xC3,0x03,0x62,0xB5,0x6E, + + 0xC2,0x04,0xF3,0x93,0x50,0xB0,0x8A,0x42,0x65,0xDE,0xEB,0xCB,0x0E,0x32,0xBB,0x3C, + + 0x22,0x8F,0x8C,0xC0,0x1B,0xF9,0x6C,0x13,0x44,0x31,0xEA,0xC9,0xFD,0xF2,0x48,0x63, + + 0xAC,0x54,0xB8,0x13,0xDA,0x64,0xF1,0x8F,0xFE,0x09,0x5A,0x87,0x4F,0x1B,0x45,0x38, + + 0xB6,0x54,0x72,0xED,0xB4,0x2E,0x6D,0x12,0xCC,0x17,0xC7,0xA5,0xAC,0x72,0x73,0xE4, + + 0xCB,0x1A,0xAF,0x37,0x5A,0x06,0xE6,0xBF,0x02,0x68,0xBF,0x77,0xF2,0xB5,0x10,0xA0, + + 0xC3,0x5C,0xAB,0x7F,0xB4,0x79,0x44,0xE6,0x83,0x3C,0xA8,0x85,0x18,0x58,0xAA,0xBC, + + 0xC0,0xF8,0xBC,0xA5,0xC6,0x94,0x60,0xBE,0x88,0xDA,0x0E,0xDA,0x05,0x36,0x3D,0x39, + + 0x3D,0xB5,0xB4,0x6F,0x53,0x35,0x87,0x59,0x2B,0x6B,0x68,0xDF,0xD6,0xA5,0x19,0xFB, + + 0xC9,0xB8,0xF7,0x25,0x4E,0x7A,0xB5,0x4A,0x65,0x1A,0xDE,0xDB,0x9B,0x7B,0x54,0x7C, + + 0xC1,0x58,0xA4,0xCC,0x39,0x2C,0x2F,0xCC,0x09,0x36,0x8C,0xD0,0x12,0x6D,0xEA,0xFC, + + 0xC2,0xFC,0xAC,0xDC,0x3A,0x7D,0xCE,0x10,0x79,0x10,0x9C,0x1E,0x18,0x07,0x7D,0x79, + + 0x3F,0xB1,0x78,0x5F,0x19,0xE3,0x41,0xDC,0x59,0x13,0x17,0xCD,0xBA,0x73,0x59,0xBB, + + 0xCB,0x95,0x27,0x54,0x02,0xB5,0xA0,0x8A,0xC6,0xAB,0xC9,0xC8,0xFD,0x7E,0x1F,0x58, + + 0x99,0x7D,0xDE,0xE4,0xF4,0xE1,0x4E,0x24,0xA5,0x43,0xB8,0x1A,0xBF,0xA4,0xA8,0x90, + + 0xB9,0xBA,0x57,0x92,0x1E,0x2A,0x62,0x43,0x79,0x6E,0x1C,0x12,0xA2,0x1C,0x8C,0x6C, + + 0xEF,0x8D,0x9F,0x3B,0xF4,0xE2,0x1C,0xD0,0x48,0x83,0x8B,0x97,0x5C,0x4D,0xE9,0x02, + + 0xA7,0x8E,0x16,0x50,0xB1,0x08,0x99,0x41,0xA7,0xFF,0xAF,0x55,0x2A,0x3E,0x58,0xBD, + + 0x35,0xE2,0x78,0x77,0x26,0xBB,0xE0,0x10,0x75,0xA2,0x17,0x15,0x6E,0x32,0xF8,0x30, + + 0x70,0x85,0x1C,0x34,0xFC,0x34,0x00,0x55,0xE4,0x84,0xD7,0x2C,0xA2,0x79,0xDB,0xBD, + + 0x0B,0x70,0x59,0xAC,0x90,0xA7,0x8B,0xE1,0x57,0xD9,0xF9,0x7F,0x0F,0x1B,0x40,0x28, + + 0x16,0x97,0xDE,0x7F,0x6B,0x46,0x19,0x38,0x8C,0xCA,0x4E,0x5B,0x23,0xD6,0xB2,0x75, + + 0x67,0x87,0xDA,0x0A,0xF5,0xB9,0x4C,0x2D,0x68,0x43,0x66,0xD0,0x3F,0xE4,0xAA,0x0B, + + 0x2F,0x3C,0xD2,0x39,0xE0,0xA6,0x9A,0x48,0x2F,0xF5,0x9E,0x82,0xB6,0x8D,0xA3,0x89, + + 0x30,0x39,0x63,0x1E,0xBE,0x77,0x18,0x1A,0xFC,0x65,0x24,0xDC,0x58,0x61,0x3A,0x24, + + 0xE1,0xC9,0x3B,0x7D,0x6E,0xCE,0x45,0x3C,0xE9,0x66,0x83,0xC1,0x71,0xE6,0xF2,0xB3, + + 0xB4,0x57,0x22,0x1B,0x1E,0x78,0x70,0x88,0xEF,0xA0,0xD2,0x7E,0xA6,0xBD,0xE5,0x0D, + + 0xF2,0xCC,0xD4,0x72,0xDD,0xA5,0x82,0x72,0xA6,0x04,0x9A,0x61,0x63,0x40,0x43,0xB6, + + 0xC3,0xCC,0xF6,0x50,0xAA,0xC2,0x11,0x6F,0xEA,0x43,0xC0,0x46,0xD8,0xC4,0x0B,0x59, + + 0xF2,0x82,0xD5,0x76,0x5D,0xAF,0x83,0x5F,0x24,0xAB,0xE8,0x5F,0x72,0xDF,0x5A,0x84, + + 0xC5,0x13,0x64,0x56,0x15,0xDE,0xCB,0x4A,0x8A,0x9D,0x4C,0x82,0xE8,0xFF,0x12,0xA7, + + 0x4D,0x9C,0xCE,0x92,0x11,0x1E,0xB3,0x54,0x41,0x93,0x2F,0x45,0x01,0x7C,0x08,0x70, + + 0x28,0xD3,0x1A,0x15,0xB4,0x6F,0xBE,0x45,0xF4,0x9F,0x87,0xD4,0x57,0x53,0x3F,0x06, + + 0x4E,0xD7,0x09,0xF5,0x42,0xD6,0xEA,0xAC,0xD6,0x27,0xEB,0x8E,0x1E,0x42,0x1A,0xC4, + + 0xC7,0x17,0x9C,0x3D,0x17,0x56,0x0C,0xD0,0x42,0xD7,0xF6,0x16,0x89,0xFB,0x93,0x2A, + + 0x27,0x2E,0xD4,0x2C,0xCE,0xD9,0xC4,0x35,0xA5,0xE5,0xEC,0x91,0x0F,0x78,0xCC,0x30, + + 0x2A,0xD7,0xBC,0x8A,0x13,0x37,0xB4,0x62,0xD5,0x2D,0xD5,0x43,0x1F,0x67,0xE9,0x57, + + 0xAF,0x30,0x8E,0x97,0xE7,0x4A,0x75,0xFA,0x65,0xD3,0x00,0xCC,0xC7,0x02,0x1C,0x3A, + + 0xB5,0x37,0x9E,0xAA,0x0F,0x0E,0x8C,0x50,0x7C,0x15,0x5A,0xDD,0x08,0x7E,0x70,0x78, + + 0x29,0x9F,0xF7,0x5D,0xC2,0xD7,0x85,0x20,0x49,0xD4,0xBE,0x9A,0xF2,0x0F,0x83,0xAF, + + 0x45,0x7B,0x1F,0x71,0xAC,0xF7,0x48,0xEC,0x11,0x6C,0x48,0xDC,0x84,0x7C,0x4D,0x11, + + 0xA9,0x3B,0x17,0x00,0x48,0x32,0x44,0x9C,0x4C,0x64,0x04,0xCF,0x7D,0xE4,0x39,0xDB, + + 0x2A,0xBC,0x84,0x56,0xCB,0x3A,0x7D,0x88,0x4E,0x11,0x60,0x6A,0x0C,0x1E,0xCA,0xB8, + + 0xD8,0xF8,0xEE,0x23,0x6D,0xD3,0xF9,0x03,0x1B,0x46,0xEF,0xC1,0x13,0xBF,0xC9,0xC4, + + 0x2A,0xCA,0xE7,0x0F,0xFE,0x65,0xF7,0xE8,0xBB,0xA5,0xFF,0xE3,0xE2,0x4B,0x57,0xFF, + + 0xCF,0xF4,0xD1,0xF3,0x7D,0xB6,0xCA,0x06,0x2E,0x04,0xAC,0x6A,0xFC,0x0F,0x3E,0x38, + + 0x20,0xED,0x88,0x15,0xE5,0x6F,0x4A,0x42,0xBB,0x46,0xE8,0x28,0xB0,0xE1,0x28,0x18, + + 0x0C,0x90,0x90,0xCD,0x7A,0x90,0xD8,0xB4,0x65,0x70,0xE0,0xCA,0xF4,0x0D,0x07,0x44, + + 0xF0,0x06,0x80,0x7A,0x37,0x5F,0x31,0x86,0x61,0x4B,0x10,0xDA,0x31,0xC1,0x08,0x13, + + 0x8D,0x69,0x89,0x06,0xF4,0xF2,0x39,0x20,0x4C,0x20,0x7E,0x4B,0xB0,0x67,0x20,0x0F, + + 0x86,0x09,0xBE,0xF4,0xFB,0x47,0x6D,0x00,0x46,0x0A,0xE8,0x1B,0xD3,0x69,0x00,0x49, + + 0x60,0x25,0x9E,0xF0,0xE4,0x49,0x73,0x0F,0x92,0xF8,0x18,0x50,0xC2,0x6B,0xBA,0x2E, + + 0x0D,0xD0,0xD3,0x0F,0x6D,0xAB,0xC2,0x27,0xF6,0x07,0x62,0xD5,0x2E,0xC5,0x60,0x2E, + + 0x12,0x17,0x76,0xC6,0xEF,0xFA,0x41,0x6D,0xF0,0x0F,0xE1,0x8A,0x50,0x6A,0x11,0xF5, + + 0x0E,0x09,0xBC,0x78,0x1E,0x09,0xB9,0x8D,0x9D,0x56,0xEB,0xDC,0xD8,0x7E,0x0C,0x2D, + + 0x20,0xE9,0x9D,0x1C,0x72,0xF8,0xA1,0xB1,0xE6,0x4F,0xF3,0xDA,0x49,0x26,0xF7,0x7A, + + 0xF8,0x05,0x3B,0x4D,0xDC,0x81,0x6E,0xC0,0x81,0x25,0x9B,0x21,0x39,0x71,0x31,0xEA, + + 0xE5,0x80,0x74,0x0E,0xED,0xE2,0x3B,0x9F,0x68,0x42,0x9A,0xDB,0x5C,0xFA,0x62,0x4C, + + 0x87,0x6F,0xA4,0x70,0x1B,0x6E,0xEA,0x9B,0x2C,0x5C,0x29,0xE8,0x56,0x58,0xF5,0x28, + + 0x4B,0x06,0x35,0x2E,0x71,0xAE,0x7A,0xB5,0xCB,0xDD,0xE4,0xD4,0x5D,0x6C,0x2A,0xB3, + + 0x31,0xFE,0xFD,0xFC,0xFA,0x32,0xEB,0x9A,0xA4,0x48,0x43,0x9C,0x79,0x2E,0x2A,0xDD, + + 0xF9,0x52,0x30,0x9A,0x72,0x4C,0x02,0xC4,0x6E,0xE0,0x8D,0x1F,0x68,0x0A,0x92,0x04, + + 0x00,0x0E,0xDD,0xD4,0x36,0x11,0x4D,0x2B,0x66,0x11,0x6F,0xC4,0x33,0x1C,0x9A,0xE3, + + 0x4D,0x96,0x98,0x5F,0x8C,0xCE,0x24,0xD0,0x67,0x13,0x70,0x2E,0x70,0x11,0x5F,0x80, + + 0x03,0xB2,0xA9,0x6D,0xF9,0x70,0xE3,0x23,0x60,0xF5,0xAE,0x3B,0x4F,0xAF,0x8A,0x52, + + 0x85,0x6F,0x56,0x95,0x82,0x05,0x8D,0x98,0x61,0xF3,0x26,0x2F,0x4E,0x75,0x7E,0x48, + + 0x85,0x58,0x3B,0x37,0x14,0x58,0x2A,0x41,0xE0,0x50,0x70,0x23,0xB0,0x78,0x4E,0x38, + + 0xB4,0xA8,0xF2,0x70,0xF9,0xE4,0x98,0x20,0x6B,0xEC,0x94,0x7C,0x10,0x0F,0xD4,0xE5, + + 0x5F,0x1D,0xFB,0x60,0x78,0xC7,0x5A,0x83,0xEC,0x34,0xEB,0xE2,0x30,0x76,0xB5,0x39, + + 0x34,0x5A,0x85,0xC1,0x7B,0xE6,0x45,0x70,0x12,0xF6,0xCB,0x5D,0xF5,0x76,0xB9,0xC7, + + 0xAA,0x1C,0x46,0xAD,0xF1,0x23,0xBA,0x0D,0xBD,0x3B,0x3B,0xAA,0xD9,0x27,0x6E,0x9A, + + 0x26,0x14,0x21,0xF3,0xE4,0xE2,0x7D,0x5F,0x9C,0x6B,0x5E,0x4C,0x71,0x65,0x4D,0xEB, + + 0x43,0xD3,0x66,0x09,0x90,0x04,0xBC,0x63,0x53,0x61,0x2A,0x6A,0x6E,0x70,0x71,0x4D, + + 0x2B,0x1F,0x8F,0x75,0x27,0x79,0xE3,0x3B,0x69,0xDC,0x20,0xF7,0xE9,0x7F,0x59,0xA8, + + 0x64,0x91,0x16,0xDF,0x46,0x5F,0x6E,0xD8,0x00,0xF3,0xD4,0x1C,0x85,0x73,0xB1,0x1F, + + 0xE9,0x1D,0x59,0x2F,0x15,0x90,0x9E,0xDC,0x9D,0x46,0x8F,0x78,0x5B,0xDE,0x06,0x2F, + + 0xBA,0x53,0x6B,0xBE,0x94,0x98,0xF7,0x9B,0x88,0x62,0x89,0x0F,0xFE,0xD3,0x47,0xCC, + + 0x56,0x99,0x1F,0x4E,0xCF,0x90,0xFD,0xFB,0xB7,0xC2,0x85,0x02,0x58,0x1A,0x0A,0x33, + + 0x68,0xC2,0xFE,0x3F,0x14,0x04,0xF0,0xA6,0x60,0xF1,0xC3,0xD9,0x18,0x6D,0xEB,0xE2, + + 0x71,0x20,0x68,0x37,0xB0,0xA9,0x93,0x97,0x90,0xDF,0x98,0xD3,0xA7,0x3E,0x31,0x13, + + 0x25,0x8B,0x6B,0x3B,0x7D,0x68,0x11,0x32,0x49,0xA1,0xCE,0xCF,0x47,0xAD,0xBF,0x97, + + 0xA5,0x03,0x2B,0xE6,0xED,0xA3,0x44,0xDA,0x63,0xAC,0xBB,0xCE,0x8D,0xE7,0x70,0x20, + + 0x02,0x09,0x07,0x35,0x30,0x72,0xA2,0x6A,0xE3,0x6B,0xC8,0x95,0xD2,0xF0,0x70,0x43, + + 0x88,0x03,0xFB,0xBC,0xF6,0xEA,0x40,0x99,0x86,0x4F,0xC6,0x71,0x95,0xE5,0x1C,0x28, + + 0xFE,0x39,0xE9,0x53,0xF5,0xCC,0xA7,0xE1,0x46,0x5C,0x55,0x20,0x14,0xE0,0x6A,0x13, + + 0x97,0x0A,0x45,0x24,0xB9,0x01,0xFE,0x82,0x64,0xC6,0xF1,0xC7,0x2E,0x61,0x1A,0xEA, + + 0x4E,0x03,0xFC,0x32,0xE3,0x0C,0x89,0xA3,0xE3,0xD3,0xA9,0xD7,0x08,0x65,0x92,0xCA, + + 0xAE,0x82,0x6A,0x3F,0x94,0xB2,0x82,0xD2,0xD3,0x35,0xC4,0x38,0xBC,0x6A,0xBB,0x3A, + + 0xE0,0x95,0x30,0xDB,0xAF,0x8D,0x47,0x4D,0x33,0xDA,0x4C,0xDF,0x4C,0x1B,0xAA,0xEB, + + 0x4E,0x2A,0x5B,0x9B,0xB5,0x95,0xC3,0x33,0x30,0x84,0x16,0xCC,0x51,0xE6,0x3B,0x81, + + 0xA9,0x9C,0xB4,0x3D,0x38,0x0A,0x40,0x79,0xED,0x1D,0x92,0x14,0x9C,0xEC,0x83,0x3C, + + 0xF0,0xE3,0xBC,0x6E,0xE0,0x02,0xFD,0x8B,0xEC,0xCC,0xAE,0x1C,0xEC,0x88,0x5C,0x49, + + 0x92,0x95,0xB1,0x0F,0xCE,0x03,0x0D,0x56,0x77,0x44,0xFB,0x57,0xD8,0xEF,0x09,0x43, + + 0x8E,0x4F,0x3F,0x2C,0xFD,0x2C,0x49,0x68,0x6C,0xCC,0xC3,0x8C,0x5B,0xFB,0x14,0xE0, + + 0x67,0x60,0xB0,0xD5,0x07,0x26,0x0C,0xC2,0x62,0x92,0x34,0xE1,0x5A,0xEE,0x14,0x55, + + 0xE7,0x51,0xF5,0x12,0x11,0x56,0x90,0x17,0xB0,0xB2,0x2F,0xB4,0x53,0xF0,0x45,0xC8, + + 0xC7,0x9D,0x65,0xA6,0x2F,0xA9,0xA5,0x8A,0x64,0x72,0xCE,0x5C,0xD6,0x83,0x25,0x96, + + 0xC6,0x53,0x3D,0xCD,0x48,0x2F,0x96,0x79,0x5E,0xE8,0x28,0x9E,0x77,0x8F,0x63,0x02, + + 0x22,0xDA,0x34,0x81,0xDF,0x17,0x62,0x80,0x06,0x36,0x8C,0xC2,0x15,0x8E,0x94,0xF6, + + 0x14,0xAB,0xD2,0x66,0xFD,0x64,0x51,0x76,0x43,0x02,0x41,0x14,0x17,0x24,0xF4,0x2B, + + 0x31,0x2B,0x83,0xFA,0x5D,0x15,0x0B,0xE5,0x07,0x55,0x62,0x63,0xD6,0x76,0xD5,0xF3, + + 0x4A,0xF7,0x93,0x67,0x43,0xF4,0x24,0xE1,0x42,0x78,0x3D,0xD7,0xB7,0x7C,0x5E,0x62, + + 0x86,0xDA,0x9C,0x65,0x0F,0xA6,0xD7,0x4D,0x99,0xEA,0x92,0xCC,0xCB,0x94,0x14,0x7C, + + 0x3D,0x34,0xCE,0x9C,0xF3,0xB4,0xC5,0xB2,0xC8,0xC2,0x5F,0xFE,0x35,0xF4,0xB7,0x3C, + + 0x9F,0x12,0x1F,0xBE,0x8D,0xF5,0xCB,0x43,0xAD,0x97,0x54,0x40,0x09,0x94,0xE5,0x7D, + + 0x2F,0xA7,0x85,0x4F,0xE1,0x10,0x5C,0x3F,0xC5,0x80,0x42,0xC1,0x63,0x84,0xDE,0xDA, + + 0x89,0x87,0x51,0x6B,0x38,0xFD,0x24,0xE2,0xCB,0x73,0xF2,0x0C,0x78,0xFD,0x0C,0xDE, + + 0x2E,0xED,0x38,0x24,0xC4,0xFF,0x18,0x5B,0x84,0x7E,0xC1,0x1C,0x5B,0xFD,0x0A,0xAD, + + 0x51,0xF0,0xCE,0xF1,0xD8,0x4B,0x21,0xAC,0x07,0x7D,0xA3,0x95,0x5D,0x9B,0xD0,0x8B, + + 0x2F,0xD0,0x6F,0x21,0x4A,0xB3,0x41,0x4B,0x25,0xDC,0xFF,0xFF,0xFF,0xFF,0x59,0x0A, + + 0xE5,0xAF,0xD0,0x76,0xFB,0x83,0x10,0xD8,0x61,0xBB,0x40,0x5E,0x26,0xCF,0x30,0xEF, + + 0x8E,0x87,0x10,0x54,0x15,0x00,0x38,0x54,0xC6,0x63,0xFE,0x40,0x32,0x65,0x10,0x83, + + 0x00,0x0A,0xBF,0xB4,0x1D,0x84,0x15,0xA5,0xE9,0x4C,0xC5,0xE2,0x39,0x21,0x8F,0x51, + + 0x9D,0x05,0xF1,0x66,0xBC,0x9C,0xF1,0x24,0x43,0x47,0x87,0x94,0x43,0x6B,0xD5,0x33, + + 0x2F,0xAF,0xC6,0xAC,0x12,0x69,0x56,0xF5,0x42,0x44,0x00,0x86,0xBB,0x95,0x37,0x23, + + 0xA0,0x56,0xD7,0xC7,0x62,0x49,0x4D,0x03,0x7B,0x29,0x8E,0xB4,0x5D,0x90,0x39,0x45, + + 0x62,0x77,0xBF,0xE5,0x1F,0x8B,0x51,0x61,0x23,0xE9,0xC9,0xED,0x5F,0xC0,0x32,0x22, + + 0xBF,0xA3,0x90,0x43,0x55,0xA5,0x3F,0x5D,0xC0,0x6D,0x4E,0xF1,0x8A,0x60,0x22,0x5C, + + 0xA9,0xD7,0xD9,0x0C,0x27,0x4B,0x81,0x4A,0x09,0x68,0x90,0xC4,0x53,0x6C,0x0E,0xE2, + + 0xE8,0x0F,0xD9,0x18,0xE5,0x2A,0x62,0x5A,0xAA,0x4F,0x00,0xC3,0xB8,0xEF,0xBC,0x75, + + 0xA9,0x4A,0xDD,0xA0,0xB2,0x81,0x6B,0x4B,0x89,0x0A,0x52,0x6A,0x39,0xCC,0x2B,0x4D, + + 0x2A,0xF6,0x38,0x20,0x9F,0xF8,0x3B,0x04,0x6A,0x4D,0x9B,0xC3,0x54,0xC6,0xDE,0xAA, + + 0xEA,0xA8,0xBC,0xFD,0x71,0xAF,0x0B,0x0B,0x4C,0xCC,0x69,0x9F,0x7C,0x00,0xE5,0x37, + + 0xD6,0xD1,0xF0,0xAF,0x6F,0x80,0x67,0x3A,0xEA,0x10,0xFC,0xD8,0x39,0xC9,0x3B,0x18, + + 0x61,0xC6,0x3C,0xBC,0xB0,0xD1,0x25,0x03,0x4B,0x43,0xB5,0xDD,0xD9,0xAE,0xF2,0x07, + + 0xB4,0x0D,0x58,0x1A,0x51,0x2C,0x73,0x1B,0x76,0x43,0x4C,0xDC,0x93,0xBE,0x2C,0x81, + + 0xFD,0x30,0x8C,0x90,0xF8,0x13,0xD4,0xFC,0x6C,0x56,0xF5,0xE4,0x34,0xD4,0x37,0xD6, + + 0x75,0x31,0x20,0xE7,0x53,0x97,0x64,0x32,0xE1,0x59,0x51,0x45,0xD2,0x31,0x6B,0x47, + + 0xF4,0x32,0x51,0x96,0x96,0xB1,0x35,0xF5,0x83,0xAD,0x41,0x69,0x38,0xF1,0x36,0x60, + + 0xF9,0xF3,0x47,0x65,0x31,0x2C,0x65,0xB3,0xBB,0x48,0xA3,0x04,0x73,0x06,0x3F,0x31, + + 0x6B,0x14,0x39,0xB6,0x04,0x6B,0xA9,0x22,0xC3,0x0B,0x2B,0xC0,0x96,0xF7,0x5B,0xFE, + + 0x53,0xE0,0x0C,0x89,0x4C,0xC1,0x64,0x1A,0x65,0x15,0x4B,0x87,0x06,0x7E,0x63,0xED, + + 0xE7,0x63,0x72,0x60,0xFA,0x55,0x3D,0x83,0x59,0x58,0x62,0x44,0xD6,0x3A,0xDA,0xEF, + + 0xD7,0x55,0x1D,0xA7,0x08,0x28,0xE1,0x19,0x4A,0x15,0x12,0x1D,0xF9,0x3A,0xAE,0xB0, + + 0x20,0x85,0x98,0x29,0xAA,0x32,0x37,0x5C,0xF8,0x5C,0xD6,0x28,0x30,0x7B,0xBC,0x1C, + + 0x02,0x58,0x71,0x63,0xD8,0xBA,0x3B,0xBA,0x63,0xA2,0xA0,0x0C,0xDA,0xD4,0xD8,0x8C, + + 0xAE,0x8B,0xC8,0xFE,0x95,0xBB,0xD1,0x41,0x78,0x91,0xA9,0x08,0x5B,0x1F,0xD0,0x9D, + + 0xAF,0x8A,0x70,0x63,0x44,0x9A,0x9B,0x3D,0x99,0x9E,0x03,0x4C,0x5A,0x3B,0xCB,0x59, + + 0xC3,0x4D,0xBD,0x37,0xCD,0x7E,0x54,0x26,0x83,0x2D,0xCE,0x3D,0x58,0x3C,0xFD,0x3A, + + 0x43,0xAC,0x0E,0xCC,0x66,0x61,0x64,0x49,0x49,0xF2,0x36,0xC1,0x7D,0x65,0x19,0x2B, + + 0xAE,0x9B,0x47,0x33,0x89,0xDE,0x41,0x48,0x01,0x7D,0x1F,0xCD,0x86,0x86,0x31,0xE0, + + 0x5E,0xBC,0x74,0x93,0x26,0xC2,0x0F,0xE8,0xD3,0x5B,0xDF,0x3B,0xF7,0x64,0x52,0x1A, + + 0x04,0x88,0x8B,0x75,0x3E,0xA3,0x10,0xCA,0xE5,0x3F,0x60,0xB9,0xA1,0x69,0x39,0x2B, + + 0x6D,0x8C,0xCE,0xB2,0xFE,0xE2,0x58,0x30,0x31,0xCC,0xA2,0x34,0xC7,0xEB,0xA1,0x02, + + 0x75,0x84,0x1F,0x23,0x19,0x2F,0x11,0xB2,0x41,0xE0,0x91,0xCD,0x3D,0xC1,0xF5,0x12, + + 0xCC,0xA3,0x93,0x84,0xBF,0x0C,0x73,0xCD,0x66,0xCE,0xBF,0xDF,0xDC,0xAE,0xB9,0x6D, + + 0x00,0xFC,0xE8,0x42,0x3F,0x21,0x48,0x11,0x6C,0x65,0xF6,0x5B,0x7F,0x96,0x36,0x6B, + + 0x05,0x2E,0x13,0x71,0xB6,0xDA,0xAC,0x8C,0xBA,0x44,0x07,0x05,0x35,0x8B,0x27,0xB2, + + 0xF6,0xF3,0x21,0xEF,0x0E,0xAB,0x49,0x9C,0x2F,0xC5,0x31,0xCF,0x30,0xEB,0xFA,0x7C, + + 0xEC,0x76,0x40,0x29,0x02,0xBC,0x39,0x8C,0x32,0x44,0x1E,0x37,0x93,0xA5,0x2F,0x0B, + + 0x15,0xA8,0xF6,0xC9,0xF5,0xEB,0x78,0xD1,0xEF,0xC5,0xB0,0xC8,0xD3,0x45,0xB6,0x1B, + + 0x99,0xA9,0xB0,0x1C,0xAE,0x04,0x42,0x48,0xB2,0x8B,0x73,0x4E,0xDD,0xF6,0x2C,0x0A, + + 0xCF,0xAA,0xC5,0xBF,0x75,0xC9,0x49,0xA9,0x4C,0x3B,0xE1,0xBC,0xC3,0x47,0x99,0x1A, + + 0x12,0xAB,0xFF,0x6F,0x1D,0xBD,0x29,0x66,0x4D,0x5A,0x85,0x9A,0xBC,0xEF,0x22,0x59, + + 0x32,0xBD,0xA5,0x28,0xE1,0x01,0xC7,0x94,0xA7,0xBD,0xA3,0xD8,0xB7,0x6F,0x54,0x67, + + 0x6F,0xCD,0x6F,0x7E,0x15,0xBD,0x43,0x82,0xAD,0x8F,0x05,0x0D,0x3D,0x83,0x5D,0x62, + + 0xAF,0x86,0x74,0x08,0x40,0xA6,0x8E,0x87,0xCE,0x75,0x8B,0x45,0xA6,0x23,0x14,0x29, + + 0xE5,0x5E,0xB2,0xC2,0x3A,0xDE,0xAA,0xE3,0x4C,0xC2,0x1C,0x3F,0xD3,0x14,0x96,0x83, + + 0xD5,0x96,0x9C,0x79,0xC1,0xD3,0xF4,0x53,0x31,0xD6,0x86,0x98,0xD7,0x51,0xAF,0xE1, + + 0x36,0x16,0xD2,0x90,0xDC,0x40,0x44,0x36,0x06,0xCC,0xEA,0x8B,0x9E,0x00,0x05,0xFE, + + 0x05,0x99,0x5E,0xF4,0x96,0x43,0x7D,0x34,0x87,0xC2,0xE5,0x54,0xD6,0x2F,0xAD,0x9A, + + 0x27,0x97,0x7E,0x64,0x39,0xBE,0x64,0xB9,0x00,0x2C,0xBB,0x06,0xDD,0x73,0x77,0x31, + + 0x56,0x39,0x49,0x42,0x04,0x80,0x45,0xC6,0xBA,0xA5,0xB5,0x80,0x89,0x59,0x5E,0xEC, + + 0x84,0x34,0x94,0x25,0x11,0x68,0x26,0x51,0x1B,0x97,0xDA,0x14,0x3E,0x5A,0xF9,0x32, + + 0x05,0xD6,0x5C,0x25,0x1A,0xCB,0x52,0xDB,0x7A,0x67,0x69,0xF8,0x55,0x73,0xFA,0x20, + + 0xDB,0x4A,0xF5,0xD2,0xDC,0xF4,0x2C,0x6D,0x46,0x78,0x77,0x0B,0x7F,0x0C,0x35,0x7A, + + 0xE0,0x97,0x5D,0xA9,0x9D,0x47,0x28,0x82,0x4D,0xC8,0x26,0xE1,0x81,0x84,0xA2,0x8A, + + 0xCC,0x66,0x39,0x99,0x9C,0x26,0x46,0x48,0xC1,0xD6,0x22,0x2E,0x96,0xA8,0x5D,0xAC, + + 0x0F,0xD8,0x81,0x2F,0x38,0x1E,0x57,0xA9,0x9C,0x27,0x1E,0xD1,0x69,0x57,0xEF,0xA3, + + 0x49,0x20,0x1B,0xFD,0xC1,0x14,0xAF,0xA5,0x91,0x2F,0x81,0xDB,0xBF,0x54,0x30,0xF6, + + 0xC5,0x4D,0x19,0x4A,0x0C,0xF0,0xA2,0xAD,0xA4,0x45,0xDE,0x02,0xC0,0x87,0x54,0x29, + + 0x0D,0x32,0x02,0x41,0x3E,0x7D,0xF9,0x12,0xE3,0x10,0x5B,0x7A,0x62,0x5F,0x21,0xE2, + + 0x2E,0x09,0xDF,0x30,0x57,0xFD,0x09,0xD6,0x85,0xDD,0xB7,0x16,0x6C,0x65,0x3B,0x33, + + 0x06,0xDD,0x2F,0x77,0x3A,0x12,0x3D,0x8A,0xD3,0xD4,0x24,0x50,0x80,0xFD,0xC0,0x28, + + 0xFB,0x42,0x3A,0xFF,0x6F,0x00,0x30,0xF1,0xE1,0xCA,0x00,0x3B,0x6C,0x22,0x58,0x29, + + 0x53,0x43,0xF6,0x39,0x93,0x29,0x2A,0xCF,0x72,0x61,0xD8,0x56,0xBA,0xF0,0x4B,0x62, + + 0x83,0x83,0x41,0x45,0xC7,0xAF,0x96,0xD0,0x63,0x12,0x9F,0x15,0x52,0x17,0x59,0x11, + + 0xB2,0x9F,0x80,0x67,0x32,0x61,0xA1,0xF6,0x1F,0xEE,0x2D,0x57,0x3A,0xD2,0x90,0xD2, + + 0x0A,0x0E,0x74,0x26,0xED,0x80,0x2E,0x66,0xA3,0xC7,0x6F,0xF7,0x66,0xEF,0x76,0x69, + + 0x05,0x04,0x6C,0xD0,0x3B,0xD4,0xCD,0x6F,0x33,0x43,0xD0,0x01,0xBA,0xBF,0x89,0xB0, + + 0x21,0x46,0xD2,0x43,0x5A,0x57,0xFC,0x5E,0x46,0xE9,0xF1,0x8F,0xA7,0x70,0x1F,0x33, + + 0x74,0x62,0xCF,0x7D,0x7A,0x36,0x79,0xB5,0x62,0xCB,0x19,0x54,0x54,0x09,0xBA,0xF7, + + 0x87,0x13,0x89,0x24,0x73,0x8B,0x6A,0x58,0xC8,0x57,0xC8,0xD3,0xB3,0x6B,0x2A,0xEB, + + 0xAA,0x1B,0xF5,0xE4,0xCB,0xD6,0x1C,0xC5,0x41,0x0B,0xE4,0x99,0xB8,0x56,0x6F,0x6F, + + 0x56,0x81,0x82,0xE2,0xAF,0x26,0x49,0x2B,0x5A,0x42,0xED,0x8C,0x33,0x29,0xB3,0x69, + + 0x09,0xAD,0x4B,0x1C,0xEB,0x90,0x96,0x67,0xE9,0x9B,0xC1,0x97,0xE1,0x29,0x7A,0x79, + + 0x20,0xF3,0xB0,0x49,0xD5,0x8C,0x18,0x75,0xA1,0x5D,0x6D,0xFF,0x6A,0xE7,0x14,0xBA, + + 0x0F,0xA0,0xA8,0x41,0x18,0x6D,0xCB,0x42,0x73,0x0F,0xD2,0x6D,0xB2,0x7C,0x7D,0xE9, + + 0xFC,0xD1,0x55,0x3E,0xF6,0x42,0x93,0x49,0xFB,0xFB,0xF3,0x87,0xAF,0x78,0x58,0xDD, + + 0xAB,0xAC,0xE7,0x90,0xBF,0x22,0xCC,0xE4,0xCD,0x4E,0x99,0x8E,0x8C,0x2D,0x1F,0x62, + + 0x13,0xD0,0xCC,0x16,0xD9,0x01,0x74,0xE1,0xEC,0x5D,0x2F,0x37,0x52,0x7A,0x72,0xEC, + + 0x84,0x7F,0xB6,0x76,0xB3,0x39,0x54,0x23,0xC0,0xFE,0xC8,0xBF,0x05,0xCD,0xBD,0xBC, + + 0x07,0x9F,0xFD,0x07,0xB1,0xD5,0x1F,0xA0,0x43,0x54,0x17,0xBB,0xD2,0x86,0x6F,0xE1, + + 0xA0,0xC3,0x78,0x77,0x33,0x3B,0x8C,0xC2,0xD9,0x3F,0xA0,0xEE,0x0D,0xC2,0x57,0x68, + + 0x9E,0xE5,0xD2,0xA6,0x5A,0x39,0x0C,0x21,0x64,0x55,0x45,0x74,0x99,0x7D,0xFB,0xE9, + + 0x25,0xF4,0x6B,0xF9,0xE7,0x64,0x64,0x0F,0x65,0x54,0x34,0xB3,0x9A,0x5C,0x72,0x64, + + 0x52,0x55,0x3A,0x41,0x96,0xED,0x4C,0x83,0x15,0x33,0xEB,0xC8,0xF4,0x57,0x2B,0x21, + + 0xD7,0xB6,0xEA,0xFC,0x63,0x26,0x87,0x75,0xC3,0x28,0x1D,0xD4,0x4C,0x7D,0xBE,0xB8, + + 0xFA,0x57,0x42,0xEE,0x7B,0xC6,0xD2,0xC8,0x66,0xF5,0x56,0x15,0x3C,0x14,0x0A,0xFE, + + 0x69,0x56,0xF6,0x1E,0x30,0x5D,0x1A,0x4B,0x55,0xF4,0xF8,0x18,0x7A,0xB9,0x59,0xE1, + + 0xA0,0x01,0xFF,0xEF,0xFB,0xCD,0x86,0xD8,0xD0,0xD0,0x28,0x3E,0xD6,0xA7,0x2F,0x9C, + + 0x48,0xB4,0xB7,0x4D,0x56,0x34,0x0A,0x69,0xE1,0xA4,0x3C,0x19,0x25,0x18,0xD3,0x4C, + + 0x0A,0x9C,0x06,0xED,0xB9,0x91,0x1E,0x68,0x6C,0x5D,0xD0,0x9F,0x46,0xFC,0x74,0x2B, + + 0x47,0x96,0xC6,0xD8,0x92,0x12,0x66,0x07,0x6D,0x5C,0x8E,0x8B,0x77,0xF0,0x1D,0xC8, + + 0x09,0x5F,0x0C,0x49,0x92,0x61,0x9E,0x8B,0x1D,0x3B,0xA9,0x8C,0x13,0xA4,0x83,0xE8, + + 0xC7,0x00,0xF1,0x00,0xBD,0x1E,0xA8,0x7D,0xCB,0x20,0xA1,0x21,0x12,0x76,0x58,0x42, + + 0x44,0xCE,0xA1,0xFE,0x14,0x5B,0x32,0x50,0x77,0xE0,0xA0,0xE2,0xF5,0xE9,0x62,0x8A, + + 0x85,0x37,0x20,0x0B,0xE8,0x79,0x58,0xF2,0x8B,0xCC,0x80,0xD6,0x3B,0x6A,0x62,0x01, + + 0xCC,0xC0,0xA1,0xFB,0x15,0xE0,0xC9,0x07,0x18,0xF3,0xE6,0xA3,0xF4,0x4C,0xF6,0x3B, + + 0xB6,0xA1,0xB1,0x96,0xDD,0xD2,0x4B,0x1D,0xD1,0xC5,0x2A,0x1E,0xD3,0xE2,0x58,0xB8, + + 0xAA,0x89,0x1B,0x61,0xB7,0x5B,0x69,0x1C,0xE5,0xA1,0xE4,0xA4,0xDB,0x49,0xB8,0xEA, + + 0xF4,0xEB,0xA1,0x72,0x8A,0x58,0xB1,0x49,0x37,0x50,0xB0,0x67,0xBE,0xD4,0x77,0xE6, + + 0x7D,0x2B,0x54,0x6F,0x90,0x5F,0xCE,0x81,0xC0,0xC7,0x3E,0xE3,0xFE,0x99,0x56,0xCC, + + 0x76,0x51,0x44,0x38,0x1A,0x01,0xEC,0xF7,0xBB,0x35,0xFB,0x84,0x88,0x4A,0x9A,0xEA, + + 0x44,0x8E,0x9C,0x23,0x91,0x2E,0x7A,0xB8,0xED,0x37,0xB0,0x4C,0x7F,0x39,0x14,0x66, + + 0xD1,0x86,0xA6,0x69,0x7E,0x36,0xB9,0xB8,0x44,0xAF,0xA9,0xBA,0x27,0x29,0x0D,0xF0, + + 0x2D,0x75,0x27,0x4F,0x13,0xAC,0x87,0x49,0xB1,0xC3,0x9C,0x44,0x05,0x1F,0x19,0xE4, + + 0x0F,0x27,0xD3,0x1D,0x6A,0xAD,0x03,0xEB,0x36,0xC4,0x17,0x40,0x17,0xC8,0x6A,0x53, + + 0xC6,0x3D,0xAD,0x0E,0x1A,0x81,0xB2,0x4A,0x59,0x11,0xEA,0xEA,0x76,0xA2,0x3E,0x60, + + 0x2D,0x78,0x93,0x38,0x3C,0xCD,0x20,0x1E,0x27,0x2C,0xA0,0x7C,0xEC,0x34,0x32,0x64, + + 0xFA,0x3B,0x99,0xBF,0x0E,0xDF,0x0B,0x4C,0x33,0xC1,0x1F,0x10,0x14,0xBF,0x78,0x59, + + 0x93,0x2B,0x6E,0x5D,0x6A,0xD2,0x02,0x1D,0xAE,0xEF,0x9A,0x3F,0x97,0x42,0x3D,0x06, + + 0x67,0xBD,0x9E,0x79,0x5F,0x54,0x0A,0x8E,0x27,0x0F,0x91,0x9B,0x6C,0xC7,0x68,0xE0, + + 0x16,0xB1,0xCE,0xF4,0xD7,0x4E,0x2A,0xD0,0x9A,0x78,0xC6,0x56,0x79,0x5C,0x6D,0x86, + + 0x86,0x00,0xA1,0x9A,0x36,0xB8,0x15,0xBE,0x0D,0xE3,0x32,0x11,0x1D,0xD1,0xD5,0x7B, + + 0x6D,0x5E,0xD3,0x13,0xFC,0x3C,0xAC,0x63,0xE1,0x7C,0xED,0x45,0xD4,0x1A,0xDC,0x22, + + 0x22,0xB9,0x0C,0x81,0xCB,0x12,0x7C,0x43,0x9A,0x35,0xA4,0x91,0x7A,0x79,0x14,0xC6, + + 0xC7,0x14,0x77,0x5C,0x34,0xF5,0x02,0xDA,0x61,0xD4,0x69,0x1C,0x96,0xBA,0xA1,0xB0, + + 0xCA,0x3D,0xF4,0x37,0x36,0xA9,0xB5,0xBE,0xEC,0x5B,0x8B,0x87,0x95,0xE2,0x40,0x20, + + 0x23,0x1A,0xD1,0x34,0x5E,0xC6,0xA7,0x91,0x10,0xB2,0x00,0xE6,0xEC,0xDA,0x59,0x77, + + 0x24,0xDA,0xC6,0x4E,0xF6,0x15,0xA3,0xD9,0x58,0x52,0x5A,0xDD,0x56,0x7E,0x0E,0xBB, + + 0x1E,0xBB,0xCC,0x7C,0xBF,0xB1,0x00,0x97,0x4E,0x99,0xBA,0x7E,0x2E,0x54,0x2F,0x57, + + 0x4D,0x65,0x36,0x6D,0x3E,0xB0,0x33,0xF6,0x07,0x8B,0xA7,0xDC,0xDE,0x7C,0x97,0x7B, + + 0xF3,0x9D,0xA6,0x6F,0xB5,0xB4,0x0B,0xB9,0xDE,0x7F,0x6B,0x2D,0xDD,0x56,0x34,0x84, + + 0xD2,0xD8,0x26,0xEF,0xB9,0x11,0x4E,0x15,0xA6,0x8D,0xE1,0xE3,0xD7,0x4D,0x50,0xEF, + + 0x44,0x92,0xA6,0x2B,0xD6,0x94,0xBE,0xDB,0x13,0x9F,0x04,0x16,0x7B,0xB2,0x19,0xE2, + + 0x72,0xCF,0xFF,0x4B,0x96,0xE1,0xD7,0xF8,0xD6,0xBA,0x67,0x9D,0xCD,0x65,0xED,0xE9, + + 0xCF,0xFE,0x2F,0xFE,0x38,0xD3,0x6F,0x44,0x4E,0x00,0xA6,0x72,0x58,0xBE,0x3A,0xF3, + + 0x38,0xAF,0x9E,0x77,0x20,0xAA,0x5A,0x3D,0x51,0xEF,0x52,0x84,0x18,0x02,0x1B,0xFF, + + 0xDC,0x7C,0x1E,0x90,0x58,0xA0,0x7E,0x1C,0xA8,0x70,0xEA,0x31,0x5D,0x0F,0x90,0xF2, + + 0xBC,0xAD,0xF9,0x65,0xC7,0xD7,0x00,0xE6,0x29,0x53,0xF1,0x7A,0x73,0x6F,0xA6,0x95, + + 0xC8,0x7A,0xA4,0x6A,0x08,0xA8,0x03,0x33,0x72,0xEE,0xB9,0x34,0x5C,0x6B,0x38,0xC2, + + 0x07,0x20,0xFB,0x0E,0x02,0x65,0xAF,0x13,0x72,0x06,0xA6,0x1B,0x61,0x24,0x28,0x14, + + 0x83,0x08,0x67,0xB6,0xBF,0xD8,0x41,0x2A,0xB6,0xD9,0x6C,0x0B,0xF0,0x24,0x79,0x11, + + 0x8A,0x09,0x79,0xBA,0x82,0x6B,0x45,0xC3,0xC4,0x07,0x41,0x9A,0x27,0x69,0x43,0x53, + + 0x20,0x1C,0xB1,0x71,0xF0,0xEB,0x76,0x0E,0x1A,0x9C,0xF4,0x0E,0x4A,0x1A,0xBD,0xCF, + + 0xCA,0x68,0x4F,0x25,0x1E,0x29,0x84,0x58,0xC8,0x5E,0x12,0x6D,0x6C,0x24,0x9C,0xEB, + + 0x39,0x29,0xD0,0xFE,0x71,0x38,0x0F,0x2B,0x79,0x18,0x3C,0x4A,0x78,0x29,0x0B,0x1C, + + 0x69,0xA5,0x81,0xFD,0x67,0x25,0x1B,0x3D,0x00,0xAB,0x92,0x6B,0x90,0x71,0x68,0x9D, + + 0xFB,0xFF,0xF5,0x35,0xDA,0x24,0xDB,0x81,0x15,0x36,0x97,0x11,0xFB,0x69,0x06,0x2E, + + 0xE8,0x2C,0xD4,0xED,0xF1,0x68,0x52,0x1B,0x72,0xED,0x06,0xEA,0x26,0xD0,0x8A,0x18, + + 0x5C,0x41,0x6E,0x3E,0xE4,0x6C,0x4B,0xFC,0x63,0x18,0x82,0x78,0xD3,0xCE,0xC1,0x3B, + + 0x71,0xF1,0xF9,0xFD,0x57,0x81,0xCF,0x96,0x3F,0xED,0x6C,0x36,0x23,0x57,0x8F,0x7D, + + 0x62,0x56,0x12,0x72,0xA4,0x2D,0xB7,0xE2,0x3E,0xD9,0x1B,0xC5,0x07,0xD2,0x3A,0xB5, + + 0x02,0xFD,0x94,0x07,0x36,0x11,0x15,0xD3,0x10,0x1F,0xEC,0x4C,0xF4,0xBD,0x72,0xB8, + + 0xAE,0xBC,0x4C,0xB4,0x62,0xEC,0x46,0xD4,0x09,0xB0,0x74,0xB0,0xF4,0xF1,0x03,0xF3, + + 0x4B,0xF3,0x18,0x7A,0x59,0xD3,0x85,0xD3,0x0B,0xB3,0xF5,0x05,0xAC,0x7D,0x1C,0x03, + + 0x5E,0xBE,0xF5,0xB2,0x4C,0x3C,0x64,0xD7,0x0A,0x42,0xFD,0xF1,0xB6,0xF8,0x56,0x3E, + + 0xDD,0x99,0xBA,0xC3,0x93,0x75,0x32,0xC9,0x83,0xF2,0xEA,0x44,0xB8,0x37,0xD0,0x28, + + 0x23,0x57,0xAC,0x95,0xB7,0x38,0xE1,0x63,0x5B,0xD8,0x6F,0x50,0x40,0x35,0x17,0x3E, + + 0x55,0xA3,0xA5,0x85,0x9C,0x39,0x44,0x21,0xFA,0x3A,0xAB,0x41,0x1B,0x15,0x49,0x62, + + 0x77,0x06,0x5D,0xAA,0xCB,0x98,0x3B,0xD9,0xE2,0x97,0x76,0xB2,0xFD,0xAB,0x90,0xF8, + + 0xA8,0x9E,0x46,0xAD,0x24,0xCD,0x5C,0xB5,0x49,0xE9,0x12,0x4E,0xFA,0x30,0x98,0x85, + + 0x42,0x08,0x88,0x44,0xB9,0x09,0x54,0xA5,0x48,0x7B,0x86,0x4C,0x06,0x76,0xA0,0xC9, + + 0xEC,0xB1,0x11,0x09,0xBB,0xA3,0x51,0x81,0x01,0x4B,0x5E,0x4F,0x7A,0x32,0xF0,0xB9, + + 0x95,0xBA,0xD5,0x50,0x81,0x79,0x4F,0x35,0xED,0x7A,0x2B,0x4D,0x06,0x74,0xE1,0xE1, + + 0xCB,0x43,0x66,0xBE,0x4C,0x93,0x36,0xA3,0x65,0x51,0x12,0x26,0xC1,0xD3,0x06,0x08, + + 0x9E,0xBC,0x5E,0x23,0xDA,0x72,0xAB,0x9A,0x2B,0x52,0x8D,0xB3,0x7D,0xEE,0xFE,0x8E, + + 0x60,0x77,0x63,0xBF,0x34,0xA1,0x55,0x0B,0x68,0x62,0x81,0xF3,0x98,0x3C,0xD3,0x26, + + 0x4A,0x7C,0xCE,0xA2,0x1C,0x7E,0xCF,0x1B,0x69,0x17,0xEE,0x0E,0xD9,0x1A,0x9D,0x86, + + 0x4C,0x83,0xF8,0x43,0xDC,0x41,0xF0,0x33,0x66,0x6D,0x37,0xA4,0x89,0xEF,0x10,0xE1, + + 0x35,0xED,0xE0,0xB2,0xFC,0x40,0x29,0xD0,0x59,0xBC,0x54,0x34,0x5D,0x8D,0x19,0xF0, + + 0xE8,0xE7,0x79,0x83,0xA2,0x87,0xA7,0xC1,0x68,0x6F,0x89,0x95,0xD8,0x82,0x4F,0x2B, + + 0x6C,0xF2,0x69,0x37,0x19,0xE1,0x23,0x2F,0xE4,0x83,0xF1,0xCF,0x50,0xE1,0x38,0x47, + + 0x00,0x66,0xBE,0xF7,0x12,0x1F,0x38,0x63,0x5A,0x64,0x30,0x77,0x74,0xE9,0xC0,0x42, + + 0x23,0x84,0x17,0x72,0xE3,0xE6,0xF8,0x63,0x77,0x95,0x86,0xD7,0xA3,0xE6,0x19,0xC7, + + 0x85,0xD3,0xE1,0xBF,0x37,0x2B,0x64,0x10,0xFE,0xCD,0x8F,0xC7,0x7A,0xEB,0x7D,0x57, + + 0x8E,0x19,0xEF,0xF3,0xF4,0x70,0x75,0xA3,0x2E,0xAE,0xA0,0x72,0x02,0x8B,0x38,0x08, + + 0xBF,0x25,0xB6,0x63,0xE3,0x05,0x36,0x26,0x7F,0xC6,0xEB,0xB6,0xF9,0xE1,0x62,0x0E, + + 0xC5,0x68,0x11,0xFC,0xB1,0x54,0x04,0x16,0xEA,0xD2,0x52,0x26,0x6E,0xCD,0xB5,0x7B, + + 0x0C,0x9C,0x35,0x8B,0xBC,0xF3,0x0D,0x02,0x6B,0xDA,0xAE,0x8F,0xC0,0xE8,0xBE,0x08, + + 0xBD,0x1A,0xD3,0x6C,0xF1,0xE9,0xDD,0x48,0xF1,0x84,0x01,0xBD,0xFF,0xDB,0x72,0x6A, + + 0x0A,0xA4,0x71,0xBD,0x9A,0x21,0x64,0x08,0x26,0xC1,0x36,0x30,0x50,0xF2,0x66,0x80, + + 0xEE,0x22,0x93,0x6F,0x2B,0x02,0x24,0x52,0x4F,0x62,0x2A,0x39,0xB6,0xCE,0x08,0xEB, + + 0xA2,0xCE,0xB1,0x1C,0xBA,0x25,0x2D,0x89,0x86,0x4A,0x8E,0x9C,0xF0,0x3A,0xFD,0xB4, + + 0x66,0xC6,0x4B,0x2D,0xFD,0x43,0x6E,0x3C,0x26,0x2E,0x9D,0xDA,0x34,0x8C,0x7E,0x90, + + 0x58,0x3F,0xB4,0x96,0xDD,0x51,0x2A,0x9D,0x08,0x92,0xD4,0xE2,0x7B,0xFD,0x52,0x95, + + 0x84,0x2E,0x3A,0x7C,0xDC,0xA0,0xB9,0xA3,0x36,0xF0,0xB0,0xB1,0xD4,0x79,0x85,0xF1, + + 0xC6,0xEE,0xDD,0x77,0x91,0x13,0xBA,0x22,0xE2,0xF3,0xBF,0xA6,0x57,0xF4,0x9E,0xA6, + + 0x59,0x82,0x55,0x86,0xD9,0x1E,0x23,0x43,0x57,0x72,0xFD,0x55,0x77,0xFB,0xA4,0xE3, + + 0x92,0xD6,0x9C,0x44,0x14,0xC1,0xB8,0x80,0x25,0x0B,0xCC,0x15,0x5C,0x98,0xEC,0xBC, + + 0xA5,0xB1,0xD4,0xF2,0xDC,0xF1,0x04,0xD6,0xC6,0x5F,0x9A,0x52,0x74,0x7D,0xF5,0xAB, + + 0xCD,0x99,0xDD,0x97,0xF6,0xB9,0x0D,0x81,0xA5,0x69,0x93,0x42,0x1F,0xF5,0x45,0x57, + + 0xEF,0x94,0xD7,0x67,0x03,0x18,0x02,0x11,0x46,0x5F,0xAD,0xCA,0xB3,0x4A,0x7D,0x8A, + + 0x2A,0xB8,0x30,0xC9,0xFE,0x48,0xA0,0x2E,0x4C,0x92,0x72,0xCC,0x3D,0xB8,0x64,0x78, + + 0xBC,0x80,0x3E,0xBE,0x7D,0xF9,0x28,0x8F,0x6B,0xD8,0xC6,0xDC,0x3C,0xF8,0x51,0xF5, + + 0x6D,0x85,0xEF,0x8B,0xB4,0xA6,0x0D,0x49,0x8F,0x46,0xCF,0xCD,0xBD,0x7A,0x51,0xAE, + + 0x50,0x17,0xA3,0xB3,0x9F,0xAB,0xC9,0xC9,0x4E,0xFA,0xC7,0xDD,0xBC,0xF3,0x5E,0x30, + + 0x82,0x91,0x42,0xB4,0x9D,0xFD,0x72,0x08,0x4A,0xD1,0x5A,0x7C,0x7A,0xF6,0x26,0xDE, + + 0x67,0x7C,0xC0,0x2D,0xB3,0xC0,0x74,0xFE,0xCC,0x9C,0xC1,0x39,0xBD,0x8D,0x8B,0x54, + + 0x5F,0x48,0x99,0xC9,0x5F,0x3D,0x3D,0x15,0x4D,0xD3,0xF2,0xCF,0x82,0x2F,0x51,0xF2, + + 0xC7,0x92,0x97,0xFB,0xB9,0x9F,0x47,0x07,0xEF,0xC3,0xB7,0xD7,0xF9,0x6C,0x7B,0x40, + + 0x26,0x42,0x90,0x07,0xE8,0x64,0xB7,0xB7,0x2B,0xE6,0x24,0x57,0x36,0x6F,0x76,0x16, + + 0x2F,0xA7,0xD1,0x02,0xB4,0x8E,0x22,0xC3,0xA5,0xEE,0x71,0x52,0x70,0x21,0x52,0x4E, + + 0x77,0x7F,0xFA,0xA5,0xEC,0xD2,0x91,0xD0,0x02,0x02,0x01,0x62,0xF4,0x79,0x31,0xE2, + + 0x0D,0xFE,0xDF,0x1D,0x34,0x8C,0xAF,0xC0,0x29,0x13,0xB5,0xA5,0x38,0xF9,0x3B,0x07, + + 0xFB,0xF2,0x55,0x34,0x92,0x8B,0x08,0x68,0x21,0xCA,0xEA,0xD4,0xEA,0x26,0x73,0x20, + + 0x83,0x13,0xE8,0xC7,0xB0,0x2D,0x62,0x92,0x1F,0xB2,0x01,0x27,0x68,0x91,0xFA,0x31, + + 0x02,0x19,0xB9,0xCD,0x37,0xAF,0xC6,0xE5,0xE2,0x58,0x07,0x5B,0xED,0x46,0x01,0x45, + + 0x62,0x1C,0x48,0x26,0xAF,0x68,0xDE,0x1E,0xC5,0xE5,0x19,0xDD,0x36,0x25,0x14,0x0E, + + 0xF7,0xD5,0x50,0x88,0x38,0xDC,0x6C,0x1A,0xCD,0x5E,0x8A,0x28,0xD1,0xEA,0x3B,0xE6, + + 0xA5,0x04,0xAA,0xDE,0xB8,0x82,0x44,0x37,0x5B,0x07,0x47,0xB8,0x2B,0xC6,0x55,0x0E, + + 0x8E,0x99,0xF8,0x36,0x1C,0x2C,0x30,0x33,0x10,0xFE,0xCA,0x36,0x3D,0x61,0xA7,0x8A, + + 0xA3,0xD6,0xF3,0x9D,0x79,0xD4,0x7A,0x1D,0x1D,0x8D,0x64,0xD5,0x4B,0x26,0xAF,0xAE, + + 0x1A,0x43,0xC3,0x3F,0x6A,0x63,0x26,0xEC,0x7D,0x1C,0x52,0x90,0xA1,0x02,0x2C,0x91, + + 0x89,0xC1,0x5C,0x5E,0x95,0x41,0xD5,0xCC,0xC9,0x81,0xA2,0x3C,0x43,0x2F,0xD3,0x0E, + + 0x63,0xB4,0xE5,0x78,0xAA,0x8E,0x93,0xC9,0x03,0x0C,0x6C,0xF6,0x2F,0xC8,0xA7,0xBB, + + 0x43,0xB5,0xF5,0x90,0x51,0xE6,0xB7,0x1B,0xF8,0xC9,0x8A,0x0B,0x2E,0x9B,0x7A,0x13, + + 0x4B,0x96,0xBA,0x25,0x51,0x34,0xB7,0x96,0xBC,0xB5,0xD7,0x63,0x43,0x5E,0xA8,0x8E, + + 0xF7,0xE5,0x2C,0x8E,0xBD,0xBC,0x2E,0xB1,0x45,0x85,0xCF,0x2F,0x72,0x53,0x85,0xBE, + + 0x24,0xC7,0xE4,0xC5,0xA4,0x86,0x4B,0x92,0xEC,0xF9,0x2D,0x3A,0x05,0x30,0xEA,0x60, + + 0x7B,0x53,0xF5,0xB2,0x12,0x5D,0xFF,0xAE,0x2F,0xF8,0xC4,0x22,0x54,0x2C,0x7E,0x33, + + 0x71,0x6F,0xFC,0xF4,0x12,0x9B,0x14,0x1F,0x97,0xD7,0x8D,0x09,0x97,0x70,0x97,0xFF, + + 0x25,0x9F,0x0C,0x7C,0xA4,0xB4,0x07,0xF0,0x5C,0x64,0x70,0x1C,0x4C,0xB3,0xC2,0x3A, + + 0xDD,0xC7,0x65,0xB7,0xD0,0x03,0xA0,0x1F,0x1A,0x3F,0xD4,0x0D,0xB2,0x3B,0x38,0xA2, + + 0xB8,0x1E,0xC5,0x26,0x37,0xBA,0x03,0xA1,0xDF,0x15,0x9F,0xE6,0xCE,0x78,0x58,0x12, + + 0x2C,0xCC,0x16,0xFF,0x1A,0xC9,0x70,0xAC,0x03,0xDE,0x97,0xCA,0xC7,0x89,0x38,0x9C, + + 0x42,0x9C,0x75,0x5B,0xC4,0x9F,0xFC,0x4B,0xA7,0xF2,0xBE,0x2E,0xF9,0x73,0xB5,0x96, + + 0x44,0xB1,0x78,0xFE,0xC4,0xE9,0x97,0x8D,0x09,0xF5,0x2E,0x11,0x75,0xF3,0x8F,0xDF, + + 0x3B,0x4F,0x5D,0xE3,0x73,0x98,0x79,0xB1,0x02,0xDD,0x18,0x55,0x2A,0x36,0xD4,0x25, + + 0x76,0x91,0x94,0xE7,0x3C,0xDF,0x5D,0x39,0x83,0x35,0xE4,0x16,0x8E,0x25,0xFB,0x5C, + + 0x68,0x2A,0x9F,0xC7,0x9A,0xA2,0x64,0x49,0x13,0xF2,0x4C,0x8F,0x2A,0xEC,0x38,0x34, + + 0x40,0xC5,0x74,0xBE,0xAF,0x7C,0x41,0xD5,0x01,0x8F,0xE2,0x80,0x43,0x77,0x8F,0xB1, + + 0xAB,0x5D,0x7B,0xBF,0x36,0xC9,0x48,0x3E,0x02,0x0E,0xA1,0xFB,0x1A,0xDC,0x46,0xA2, + + 0x07,0xA2,0x13,0xE4,0x41,0xAB,0x97,0xB5,0xA5,0x6F,0x27,0xAE,0xF1,0x33,0x53,0x52, + + 0x11,0xFC,0x04,0x65,0x37,0x57,0xA8,0xC1,0x97,0x1D,0x98,0xF6,0x09,0xFA,0x01,0x12, + + 0x82,0x11,0x25,0xFB,0x98,0x5D,0x57,0xD2,0x06,0x82,0x1D,0x57,0x54,0x64,0x3E,0xE8, + + 0x05,0x23,0x12,0x67,0x15,0xBC,0x80,0x6D,0x18,0xBE,0x54,0x51,0xBD,0xFA,0x2D,0xBE, + + 0xD3,0x7F,0xBA,0x44,0xA5,0x0D,0x8A,0x46,0xA7,0x6B,0x88,0xE2,0x52,0x23,0x17,0xD6, + + 0x44,0xB2,0xB1,0xF4,0xFE,0xB4,0xB1,0x70,0xAC,0xBF,0x54,0xE4,0x0B,0xED,0xAD,0xAE, + + 0xDA,0x0B,0x28,0xCD,0x95,0x06,0x66,0x90,0xB2,0x6D,0xF7,0x2B,0x3F,0xBE,0x57,0x9A, + + 0xA4,0x85,0x11,0x73,0x76,0x08,0x07,0x46,0x2E,0x26,0xDB,0x53,0x3C,0x83,0x9F,0x33, + + 0xF7,0xA1,0x9C,0x33,0x7D,0xAC,0x9D,0x34,0xA8,0x3C,0x4A,0x48,0xD3,0x6E,0xBA,0x09, + + 0x67,0x4F,0x7A,0x8D,0x7F,0x04,0x9D,0xA5,0xA6,0x7F,0xA9,0x1A,0x2E,0xE9,0xC1,0x54, + + 0x75,0x76,0xC2,0xCF,0x8A,0x07,0x85,0x0F,0x18,0x1C,0xB5,0x6F,0x87,0xA6,0x0D,0xAF, + + 0x43,0x06,0x7F,0x6F,0x1D,0xB4,0x65,0xA1,0xC9,0x8A,0xE4,0x2F,0xDB,0xAB,0x5C,0x92, + + 0x2D,0x1C,0x6B,0x5D,0x0B,0xD4,0xDE,0xF9,0x6B,0xC6,0xCA,0x94,0xF2,0xE1,0xEC,0xB2, + + 0xE1,0xC2,0xE2,0x6F,0x02,0x02,0x42,0x85,0xA6,0x7C,0x6A,0x60,0x42,0x19,0x3A,0xD9, + + 0x6B,0x85,0xB3,0x43,0xDA,0x25,0xE9,0x18,0xBA,0x6F,0x8C,0xEB,0xD3,0x44,0x6A,0xBD, + + 0x0A,0xFD,0x66,0x2C,0x82,0x0E,0xAF,0x85,0x32,0x4E,0xF0,0x5F,0xF5,0x4F,0x07,0x8D, + + 0xFC,0xD1,0xAC,0xA3,0xD5,0x16,0xA4,0xBC,0x18,0x24,0xA2,0xCE,0xD3,0xBD,0x16,0x61, + + 0xEF,0x3A,0x78,0x68,0xB8,0x1C,0xEC,0x30,0xE5,0xFF,0x29,0xF0,0x05,0xB0,0x86,0x15, + + 0x78,0x74,0xF7,0x78,0x55,0x14,0x65,0xB9,0xCE,0x66,0x59,0x35,0xA2,0xFA,0x4F,0x97, + + 0x4E,0x45,0x7D,0x08,0x40,0x3A,0x05,0x42,0x46,0xC3,0x7D,0x0F,0x1E,0x0C,0xB1,0x5C, + + 0x20,0x87,0xDF,0x58,0x35,0xE4,0x12,0x2F,0x8F,0x8E,0x79,0x15,0xFA,0xF9,0xAC,0xF6, + + 0x8A,0xD7,0xCB,0xA8,0x94,0xD0,0x69,0x82,0xE7,0xC3,0x53,0x99,0xAA,0x7E,0x65,0x47, + + 0xFF,0x95,0xDB,0x8B,0xB0,0xA5,0x6F,0xE1,0x55,0x7B,0x08,0x15,0xD7,0x14,0x25,0x8A, + + 0xA1,0x24,0x52,0x35,0x5E,0xCF,0x75,0xFE,0x2F,0xE6,0x02,0xCB,0x1C,0xB3,0x58,0x15, + + 0x47,0x2E,0x86,0x64,0xD5,0x9B,0x04,0x59,0x0E,0x7C,0xED,0xAE,0x07,0xB8,0x15,0xC4, + + 0xF0,0x24,0xAD,0x85,0xB9,0x2D,0x86,0x49,0x07,0xC9,0xE7,0x7D,0xD8,0x8F,0x26,0x78, + + 0x7E,0x46,0xBD,0x8D,0x2E,0xB0,0x4F,0x0E,0xDF,0x5E,0x77,0xAB,0xAE,0x96,0x80,0xBF, + + 0x79,0x5D,0x0B,0xEC,0xD7,0xB4,0x87,0x48,0x8B,0x99,0xC0,0x37,0x58,0xAD,0xDD,0xEA, + + 0x38,0xFC,0xF0,0xAC,0x5E,0xB5,0xBF,0xF9,0x5A,0xA6,0xCC,0x5E,0xB7,0x53,0x91,0x2A, + + 0x9D,0x6C,0xDB,0x5A,0x0D,0xE3,0x86,0x3D,0x5C,0x56,0xB4,0xA3,0x65,0x6D,0xA7,0x3A, + + 0xB0,0x13,0x99,0xC9,0x5F,0x3D,0x2E,0x49,0x07,0x3F,0x53,0x8D,0x05,0xBC,0xAF,0xFB, + + 0xA8,0x92,0xFD,0xDD,0x54,0xFB,0xC7,0x68,0x9F,0x72,0x7C,0xFD,0x30,0xBE,0x3A,0xF3, + + 0x6C,0x42,0x2F,0xE6,0xBC,0xDD,0x86,0x67,0x82,0xB0,0xED,0xA0,0x70,0x6D,0x6A,0x11, + + 0x00,0x2A,0x89,0xE4,0x19,0x2E,0x88,0x43,0x31,0xE0,0x58,0x14,0x11,0x6C,0x11,0x01, + + 0x21,0x6C,0xF9,0x21,0x12,0x21,0x59,0x25,0xC8,0x22,0xCB,0x19,0xB8,0x13,0xBE,0x24, + + 0x87,0xAB,0xE9,0xB5,0xC5,0x2C,0x8A,0x00,0x60,0xC2,0xDB,0xD7,0x99,0xB2,0x41,0x3B, + + 0xA5,0xF4,0x53,0x7A,0x6A,0x66,0xA7,0x93,0x74,0xE9,0x57,0xE6,0xCB,0x5B,0x2D,0xD4, + + 0x71,0x58,0x24,0x70,0xEF,0x74,0x0D,0x03,0x71,0xE6,0xDF,0x32,0x23,0x7E,0xFE,0x31, + + 0xD6,0x0D,0x93,0x26,0x91,0x66,0x04,0xD0,0x34,0xE9,0x8B,0x6C,0x71,0xC9,0x59,0x33, + + 0xD3,0x1C,0x7A,0x7C,0x95,0x06,0x2E,0x82,0xF1,0xEA,0x37,0x85,0x97,0x28,0x10,0x17, + + 0x38,0x4A,0x12,0x13,0x24,0x9C,0x0D,0xDB,0xCC,0xC5,0xB2,0x0F,0x10,0xD9,0x1F,0x3F, + + 0xA8,0xA6,0xB4,0xD5,0x5B,0xD6,0x8A,0xD0,0xC9,0x84,0xC3,0x62,0x5F,0xFA,0x13,0xA8, + + 0x29,0xA5,0x90,0x7F,0x73,0x9B,0x41,0x7A,0x23,0x2E,0x87,0xA5,0xFC,0xE7,0x9A,0x22, + + 0xB9,0xFE,0xB5,0x24,0x14,0xDD,0x09,0x9A,0x22,0x0F,0x75,0x35,0xDF,0xF8,0xAA,0x2E, + + 0xF5,0x1C,0xDA,0x8C,0x06,0xD0,0x84,0xD9,0xB8,0xE3,0x12,0x51,0xB1,0xB7,0x4B,0x27, + + 0xAC,0x4C,0x61,0xD8,0x33,0x24,0x0F,0x43,0x79,0xD2,0x42,0x0E,0xA0,0x2D,0xFB,0x41, + + 0x57,0x41,0x7E,0x12,0x4F,0x73,0x85,0x56,0xFC,0x9B,0xFA,0x90,0x29,0x1B,0xA7,0xD9, + + 0x77,0x2F,0xC3,0x59,0x14,0x6E,0x33,0xBB,0x4D,0xBA,0x91,0xD6,0xE4,0x9F,0x8D,0xE6, + + 0x48,0x41,0x86,0xE6,0x59,0x41,0xB0,0x84,0x03,0xCD,0x3F,0xC2,0x60,0x3F,0x19,0x7E, + + 0xAE,0xAC,0x3B,0xAD,0x37,0x30,0x26,0x00,0xA4,0xFE,0xA3,0x52,0x42,0xAD,0xF8,0x09, + + 0x05,0xB1,0xDD,0xCD,0x48,0xE3,0x03,0x9C,0x0B,0x16,0x94,0xDF,0x57,0x62,0xE8,0xEB, + + 0x37,0x1B,0x30,0x55,0xCF,0x86,0xB9,0x95,0x8A,0x5C,0x22,0x53,0x71,0x10,0x84,0x70, + + 0x18,0xBF,0xD7,0x2C,0xBA,0xF1,0x2F,0xC7,0xC3,0x38,0x45,0x17,0x42,0xF9,0x1C,0x4E, + + 0xD8,0x57,0xF2,0xF9,0x90,0x2E,0x67,0x63,0x5F,0xFA,0x1C,0xD4,0x74,0x78,0xE0,0x54, + + 0x25,0x00,0x50,0x47,0x90,0x06,0x33,0xD9,0x09,0x07,0xA8,0x15,0x40,0x47,0x1F,0x07, + + 0x5F,0x53,0x6D,0xE3,0xC3,0x31,0x48,0x00,0x40,0x17,0xC5,0x6C,0xF5,0x76,0x81,0x78, + + 0x37,0xE9,0x15,0xB3,0x40,0x7A,0x91,0xBA,0x8F,0xF5,0xCF,0x6A,0xDD,0x27,0xF1,0x7A, + + 0x2F,0x18,0x98,0xA0,0x3F,0x38,0x3C,0x9C,0x82,0x3D,0xF9,0xC6,0x18,0x7D,0xC7,0xA9, + + 0xE8,0x91,0x8B,0xF8,0xDB,0x40,0x00,0x58,0x4B,0xAA,0x96,0xCB,0x47,0x16,0x0F,0xFB, + + 0xEB,0x14,0x8D,0x6D,0x46,0x34,0x27,0x47,0x45,0x56,0xE6,0xD3,0x98,0x7F,0xF5,0xCF, + + 0x2C,0x9F,0x96,0xD1,0xD3,0xAD,0xE9,0x6C,0x4A,0xBE,0xB8,0x8E,0x59,0x9E,0xF8,0x2B, + + 0xC3,0x5F,0x35,0xD4,0x9E,0xC2,0x38,0xC4,0x94,0x80,0x48,0x78,0x01,0xBD,0xB5,0xD7, + + 0x4E,0xEA,0xBF,0x25,0xEE,0x73,0xAC,0xCE,0x4B,0x32,0xF8,0x86,0x23,0x8B,0x1D,0x15, + + 0xC0,0x6B,0x0F,0x1D,0xC3,0x7D,0x39,0xC0,0x76,0xA2,0x73,0x82,0x31,0x2E,0xB6,0x86, + + 0x3E,0xA2,0xE8,0xF6,0x77,0xDA,0x0A,0x92,0x8D,0x6F,0x5E,0xD9,0x52,0x73,0x4E,0xDB, + + 0x06,0x62,0xAA,0x74,0x7C,0xD0,0x2E,0x50,0x2D,0xCC,0xE8,0x54,0xA6,0x84,0x1B,0xFC, + + 0x79,0xEE,0xB7,0x3E,0x92,0xA3,0x95,0x07,0x2D,0x73,0x16,0x58,0xD2,0x42,0x73,0xDE, + + 0xF9,0xC1,0xF1,0x67,0x7C,0x12,0x2B,0x93,0x2E,0x87,0x81,0xCC,0xE6,0xCD,0xCC,0x00, + + 0x85,0x50,0x4C,0x62,0xCA,0xD5,0xE0,0xE6,0x66,0xE0,0xAF,0x99,0x29,0x9E,0xC8,0x48, + + 0x8B,0xC7,0xEF,0x29,0xB0,0x01,0xED,0x55,0xE6,0x6A,0x8D,0x04,0xBC,0x04,0x37,0x5C, + + 0xE0,0x32,0x21,0x1A,0xE9,0xBD,0x0F,0x64,0x67,0x69,0x2A,0x48,0xD0,0x6C,0x3B,0x85, + + 0x81,0x04,0x7C,0x6F,0xB5,0x17,0x6A,0xF7,0xE7,0x33,0xC7,0x42,0x5A,0x41,0x32,0x1A, + + 0xAD,0x21,0xA0,0xFD,0x68,0x05,0x08,0x9A,0x85,0x67,0x72,0x96,0xC6,0xE2,0x3A,0xBB, + + 0xAC,0x16,0xE2,0xD6,0x7E,0xD3,0x2C,0x17,0xA6,0x8D,0xE9,0xE1,0x6E,0xE7,0xB5,0xEB, + + 0xB4,0xC8,0x30,0x48,0x56,0x90,0x97,0x0F,0xAF,0xA5,0x76,0xC7,0x5B,0xA8,0x9F,0x79, + + 0x76,0x90,0xBD,0x23,0x9B,0xAA,0x01,0x8B,0x04,0x64,0x7B,0x87,0x02,0xF0,0x90,0x75, + + 0x8A,0x59,0xA2,0x3D,0x22,0xB7,0x0C,0x6D,0xEF,0x63,0xBF,0xAE,0x73,0x67,0x34,0x55, + + 0x05,0xC3,0xBA,0x4A,0x5B,0x58,0xE9,0x8B,0xEC,0x8D,0x42,0x1E,0x10,0x66,0xC7,0xCF, + + 0xEC,0xE4,0x41,0x7B,0x75,0x3F,0x64,0x4C,0x6F,0x61,0xD2,0x5E,0xB2,0xF1,0x0A,0xFB, + + 0x59,0x30,0x7E,0xAC,0xA3,0x5B,0xC4,0xFF,0xEF,0xFE,0x04,0x8C,0xE7,0x40,0xA3,0x80, + + 0xA9,0xD2,0x13,0xBF,0x32,0x1A,0xCB,0xD1,0x79,0x71,0xD5,0x66,0x36,0xEB,0x4E,0x93, + + 0x24,0x31,0xBF,0xF6,0x71,0x1C,0xBC,0xC1,0x70,0x54,0x01,0x50,0x46,0xBF,0x35,0x83, + + 0x05,0xFC,0x60,0xF4,0xCC,0x1B,0x0D,0x87,0x8F,0xDD,0xDF,0xC9,0x53,0xE2,0x9A,0xA6, + + 0xA3,0x81,0x3E,0xE6,0xC5,0xB8,0x43,0xB5,0x2D,0xDC,0x86,0x51,0xE5,0x4E,0xE0,0x04, + + 0xB4,0x97,0xA1,0x58,0xB4,0xB0,0xD9,0x0C,0xE4,0xD0,0x4F,0x75,0x4E,0xFE,0xBD,0xC1, + + 0xD1,0xA6,0x58,0xA5,0x0B,0xBA,0xD4,0xCF,0x9F,0x84,0x6D,0xFD,0x47,0xC5,0x86,0x38, + + 0x6E,0x61,0xB5,0x43,0x84,0xE9,0x19,0x81,0xC7,0x97,0x77,0xF9,0xCE,0x02,0x4B,0x68, + + 0x95,0x33,0x59,0xA4,0xC7,0xB8,0x4E,0xDA,0x1B,0x46,0x88,0xEA,0x30,0x5A,0x26,0x0E, + + 0x0C,0x98,0x62,0x7E,0x34,0x63,0x92,0x8E,0x87,0x9C,0x4E,0x46,0xA1,0x05,0x99,0xAF, + + 0x2B,0x28,0x8E,0x8F,0xB0,0xDA,0x9A,0x9E,0x5E,0x09,0xD0,0x3A,0x0F,0xCF,0x1F,0x39, + + 0xA8,0x3A,0xA7,0xA5,0x80,0xAA,0x0D,0x1B,0x7D,0x75,0x4F,0xAD,0xAC,0xE1,0x0B,0x8A, + + 0xC1,0x36,0x04,0x3A,0x68,0xA5,0x87,0x44,0xFD,0x96,0xF7,0xAE,0x0C,0xB4,0x15,0x7F, + + 0x28,0x1F,0x26,0x97,0x21,0xFE,0xC5,0xC7,0x68,0x5F,0xE7,0x1C,0x5F,0xBD,0x86,0x50, + + 0x0D,0x4B,0x46,0xEA,0xBD,0xB9,0xC3,0xA1,0xBE,0x80,0x3E,0xDE,0x3F,0x50,0x32,0x3A, + + 0x32,0x5C,0x2B,0x49,0xBD,0xFE,0x4B,0xAB,0xE4,0x62,0xAD,0x22,0x96,0x1F,0x10,0xA8, + + 0x99,0x3E,0xB0,0xBD,0x9F,0x12,0x54,0x3D,0x93,0x2A,0xEE,0x1D,0x9F,0x2E,0xC0,0x20, + + 0x40,0x0D,0xD6,0x77,0x32,0x86,0xEB,0x5A,0xCF,0x96,0xAF,0x6B,0xC5,0xFD,0xC8,0x30, + + 0x27,0xAC,0x25,0x5A,0xEC,0x7D,0xFF,0x70,0x45,0x2F,0x67,0xF3,0x9B,0xD0,0x03,0xE3, + + 0x69,0xE3,0xD3,0x21,0x0D,0x9F,0x19,0x34,0x75,0x2C,0x38,0xA1,0xF4,0xC9,0x1C,0xF3, + + 0x2D,0xAE,0x30,0x91,0xB1,0xE2,0x89,0x76,0xE5,0xE7,0x22,0xA6,0xA1,0x6B,0x1A,0x8D, + + 0x6A,0xE5,0xF2,0x02,0x80,0x48,0xD0,0x9D,0x4E,0xB4,0xCE,0x86,0xC0,0x6C,0x32,0xB0, + + 0x00,0xAA,0xB6,0x4F,0xFA,0x36,0xE7,0x92,0x70,0x77,0x4F,0x58,0x1B,0x84,0x81,0x61, + + 0xC2,0x0B,0xFF,0xEC,0x58,0xB5,0xD6,0xE3,0xE0,0x34,0xD7,0x5A,0xBE,0x24,0x58,0x22, + + 0xB3,0x6B,0xAB,0x55,0x78,0xB3,0xE1,0x61,0x64,0x5C,0xF9,0xC6,0xF7,0x25,0x93,0xEA, + + 0x40,0xE9,0x79,0x2B,0xB9,0x33,0x11,0x2E,0x80,0x38,0x17,0xA8,0x7C,0xE8,0x1D,0x77, + + 0x2A,0xC8,0x21,0x99,0x8A,0x16,0x8A,0x7F,0xEC,0xFF,0x21,0xA6,0x5A,0x8B,0x1F,0x33, + + 0xAC,0xFE,0x05,0x53,0x15,0x48,0xB7,0xD8,0x6B,0x0A,0xEC,0xEA,0x25,0xDC,0x55,0xFB, + + 0x8D,0xF6,0x74,0xED,0x4B,0x5A,0x20,0x49,0x49,0xE4,0x5B,0x19,0xB2,0x94,0x24,0x81, + + 0x09,0xE4,0x9C,0x43,0x16,0x62,0x12,0x0E,0xBD,0xC3,0xC2,0xF1,0xAD,0x09,0x52,0xE1, + + 0x68,0x19,0xE3,0x33,0x8A,0xE8,0xE0,0x83,0xA2,0x24,0x76,0xF9,0x8E,0x0F,0x7D,0x7C, + + 0xE3,0x1F,0xA2,0xED,0x4C,0x91,0x4B,0xE4,0xF9,0xCA,0xEB,0x85,0x96,0xB2,0x5D,0x71, + + 0x38,0x42,0xB9,0x55,0x7F,0x88,0x7C,0x9B,0x0B,0xB0,0xB2,0x96,0x6C,0xC4,0x24,0xB1, + + 0x4B,0x1F,0x40,0xDA,0x3E,0x2E,0x2C,0x5E,0xCC,0x5D,0xAA,0x9C,0x06,0x1C,0x1C,0x05, + + 0xD6,0x74,0x19,0x10,0x19,0xA9,0x7A,0x9C,0x45,0x2C,0x63,0xB6,0x6B,0x33,0x85,0xF2, + + 0xD8,0x50,0xF8,0x7A,0xD3,0x47,0xB9,0x32,0xDC,0x8F,0x51,0x5B,0x0D,0x10,0x35,0x79, + + 0xED,0xCF,0xB5,0x6D,0xB1,0xC2,0xE2,0x14,0x2B,0x5E,0x0D,0x44,0x99,0xC2,0x3E,0xA0, + + 0x60,0x9F,0xFE,0x37,0x5E,0x99,0x94,0xF0,0xEA,0x52,0x14,0xC4,0x3C,0xAB,0xF3,0x9A, + + 0x33,0x11,0x84,0x84,0x50,0x21,0xF7,0xF4,0x20,0x7E,0x77,0xB3,0x7D,0xA9,0x41,0x3D, + + 0xA2,0x0A,0x53,0x82,0x78,0x8C,0x85,0xB1,0xE4,0xD6,0x61,0x87,0xC1,0x96,0x4B,0x96, + + 0x8D,0xCB,0xDB,0xE0,0x00,0x7A,0xB1,0x71,0x1F,0x77,0x19,0x3F,0x48,0x08,0xAA,0x0D, + + 0xFD,0x7A,0x79,0xF6,0x4E,0xE7,0xED,0xD3,0x14,0xA7,0x69,0xDF,0x08,0xAB,0x10,0xA1, + + 0x2F,0x18,0xC6,0xEA,0xE0,0xC4,0x1F,0x5E,0x79,0x16,0x09,0x43,0x88,0xAA,0x6E,0x62, + + 0x13,0x91,0x47,0xAD,0x08,0x78,0x2D,0x15,0xCC,0x15,0x6C,0x29,0xDC,0xFA,0xBA,0xFB, + + 0x5A,0x90,0xA0,0xC7,0x4C,0xA7,0x1E,0x5F,0xCD,0x16,0x64,0x45,0xF9,0xC0,0x92,0x96, + + 0xB9,0x23,0xDE,0x64,0xC6,0xDD,0xFA,0xAA,0xE9,0x88,0x88,0x0E,0x7E,0xE1,0x5F,0xDA, + + 0x8D,0xBD,0xF0,0x01,0xF1,0xE7,0x0F,0xE3,0x51,0xF0,0x6A,0x9E,0x48,0x9D,0x87,0xE9, + + 0x0B,0xBE,0x07,0x1D,0x77,0x52,0x85,0xF6,0x84,0xCA,0x17,0xCD,0xB4,0xA1,0xD9,0xFA, + + 0x00,0x5E,0xCD,0x22,0x36,0x92,0x0C,0x08,0x48,0x1F,0x74,0xBA,0xF5,0xA3,0xE0,0x22, + + 0x3C,0x5F,0x60,0x27,0x55,0xAD,0x48,0xAA,0xE1,0x49,0x1C,0xB5,0x2C,0x3D,0x83,0x55, + + 0x0B,0x5D,0x93,0xAA,0xE2,0xE3,0xC3,0x4D,0x2D,0xCC,0x78,0x12,0x15,0x5E,0x95,0x61, + + 0xB7,0x62,0xFA,0x07,0xE8,0x5D,0x11,0xB0,0x67,0x83,0xD7,0x1F,0xD7,0x83,0xED,0xD9, + + 0x3E,0xBC,0xB9,0x8C,0x93,0xA9,0xC6,0x4D,0xEB,0x1C,0x15,0x48,0x0F,0x3E,0x78,0xF3, + + 0xFE,0x95,0xD1,0xEB,0xF2,0x31,0x4E,0x07,0x9E,0xCB,0x88,0x62,0xA7,0xA6,0xD5,0x92, + + 0x77,0x30,0xE8,0x94,0x94,0xE3,0x7C,0x6F,0xB2,0x31,0xC0,0x9E,0x1B,0x39,0xD6,0x76, + + 0x80,0x87,0xE0,0x71,0x6E,0x5D,0x53,0x10,0x65,0xCF,0xE1,0x4E,0x21,0x83,0xFF,0x6C, + + 0xB7,0xC5,0x5E,0x73,0xA4,0x30,0x01,0x61,0xF4,0xF5,0x55,0xF2,0x02,0x85,0x78,0xDE, + + 0x74,0xCA,0x18,0x10,0x7E,0x5C,0x0C,0x32,0x30,0x67,0xD1,0xEE,0x4E,0x9C,0x70,0x80, + + 0x75,0x26,0xE8,0xE0,0xB1,0xA4,0x44,0x3D,0xEC,0x88,0x0E,0x5C,0xAA,0x8C,0x33,0x29, + + 0x2D,0x15,0xF5,0x61,0x9A,0xAB,0x93,0x58,0xD0,0x19,0x13,0x21,0x50,0x8F,0x8B,0x69, + + 0xEF,0xB7,0xF2,0x0A,0x48,0xC7,0x82,0xBF,0x85,0xC8,0x83,0x0E,0xA5,0x14,0x6E,0x3F, + + 0xF2,0x9D,0x5A,0x2E,0x0E,0xE1,0x8A,0x82,0x8E,0x01,0x9B,0x85,0xA5,0x10,0xA7,0x6B, + + 0x3F,0xCF,0xB2,0x5F,0xB8,0xB6,0xDD,0x98,0x8F,0x60,0x4F,0x35,0xA2,0xD1,0xA3,0x9A, + + 0x90,0x05,0xA1,0xA9,0x77,0x14,0x8C,0x83,0xD4,0x83,0x4A,0x30,0xD8,0x64,0x7B,0x4B, + + 0x2E,0x70,0xCC,0x29,0xBE,0x77,0x03,0xFF,0xFD,0xDA,0xA5,0x9D,0xDB,0x92,0x91,0xBB, + + 0xCF,0xD4,0x64,0x87,0xDE,0xEC,0xC9,0xAA,0xC1,0xC0,0x30,0x22,0x7C,0x1C,0x88,0xF0, + + 0x92,0x0C,0x01,0xAC,0x57,0x04,0xC4,0x96,0xE7,0xD5,0x07,0x54,0xD9,0x0C,0x1F,0x33, + + 0x3D,0x3D,0x1E,0xC9,0x29,0x4F,0x98,0x45,0xF4,0xAF,0x10,0xA1,0x60,0x96,0x3F,0x96, + + 0x5A,0xAE,0xFB,0xA9,0xD7,0x46,0xB6,0xD1,0x24,0xB1,0xC5,0x93,0x14,0x5C,0xA4,0x6B, + + 0x62,0xD6,0xF8,0x55,0x17,0x34,0x46,0xD3,0x08,0x2B,0x30,0x2C,0xCD,0x4B,0x3C,0xDB, + + 0x84,0x8E,0xED,0x16,0x21,0x68,0x02,0x64,0x61,0x56,0xE8,0x6E,0x8C,0xC8,0x34,0x48, + + 0x07,0x90,0x1E,0xB8,0x3B,0x30,0x4B,0x01,0x8C,0x15,0x5A,0x88,0x2B,0xB4,0x32,0x57, + + 0x95,0xE1,0x41,0x45,0xA7,0xBD,0x4D,0xE0,0x81,0x01,0x3D,0xD6,0xB4,0xB6,0xCA,0x15, + + 0x2D,0xA8,0xF0,0x0A,0x34,0x1F,0xF2,0x2F,0x2F,0xF8,0x20,0xDD,0x10,0x94,0x15,0x5D, + + 0xFB,0x93,0x7F,0x60,0x19,0x6D,0xC5,0xB2,0xC8,0x98,0xE4,0xB4,0x15,0x18,0x9E,0xBB, + + 0xA0,0x45,0x18,0xA2,0x43,0x67,0xA7,0x43,0xD3,0x97,0xD1,0x66,0xFF,0x13,0xAC,0xF0, + + 0xCD,0xFB,0xBC,0x80,0xC5,0xC7,0xD3,0xC8,0xC7,0x7D,0xC6,0xD9,0xDC,0x81,0x5E,0x48, + + 0x0C,0x6C,0xA4,0xB1,0xEA,0xB3,0x50,0x5F,0xB0,0x73,0xCC,0x1D,0x4B,0xE7,0x56,0x0A, + + 0x73,0x62,0x56,0x25,0xB2,0x40,0x00,0xCC,0x84,0x38,0x0B,0x1C,0x3F,0xF2,0x1F,0x49, + + 0x2E,0x27,0xD5,0x30,0x8D,0x65,0x10,0x1A,0x3C,0x9E,0x2A,0x19,0x7C,0xF6,0x83,0x49, + + 0xA3,0x97,0x88,0x2F,0x3F,0xA0,0x21,0xC8,0xFF,0x70,0x17,0xD1,0xDB,0xFF,0xC0,0x7D, + + 0x61,0x8D,0x50,0x7A,0x7A,0x03,0x98,0xC5,0x23,0x60,0x2B,0xC2,0x33,0x74,0x68,0x5B, + + 0xBA,0x8A,0x14,0xFB,0x26,0x21,0x22,0xD2,0xC3,0x09,0x27,0x05,0xF0,0xC0,0x61,0x4A, + + 0xC3,0x0D,0xFF,0xA4,0xB4,0x8F,0x69,0xA3,0xC5,0xDB,0x86,0xCF,0x31,0x2D,0xF6,0xF3, + + 0x87,0x49,0xD6,0x95,0xE2,0x56,0x04,0xD3,0x6D,0x4C,0xA1,0xCA,0x28,0xC2,0x10,0xB9, + + 0x42,0x9B,0x64,0x40,0x52,0xF8,0x52,0x02,0xB5,0xFD,0x2B,0x61,0x39,0x1B,0xC3,0x30, + + 0x07,0x69,0x0C,0xBC,0x19,0x68,0xCB,0xF4,0x63,0xC5,0x86,0x9B,0x19,0xCE,0x81,0x85, + + 0xB3,0xFB,0xD1,0xC0,0xCB,0x68,0x49,0xE4,0xA1,0x3C,0xD3,0x94,0x6D,0x24,0xD9,0x96, + + 0xA7,0x69,0xBB,0x54,0x8B,0x3C,0x03,0x8E,0x60,0xCC,0x24,0x69,0xF1,0x78,0xBE,0x8C, + + 0x43,0x2A,0x12,0x47,0xE5,0x14,0x72,0x6C,0x47,0x45,0xAA,0x1D,0xF9,0xD7,0x1A,0x1C, + + 0x1D,0x4B,0x37,0xE3,0xE8,0xAA,0x50,0xC3,0xEA,0xB5,0x8D,0xB8,0x79,0xD5,0x39,0xE1, + + 0xD8,0x45,0xBE,0xF5,0x98,0xAB,0x59,0xD7,0x6B,0x47,0x48,0x3D,0xBB,0x01,0x41,0x81, + + 0x60,0xD2,0x21,0xE3,0x45,0x6F,0xA0,0x66,0xCF,0xE3,0xA3,0xC7,0xDF,0x6A,0x02,0x77, + + 0x02,0x60,0xE4,0x3A,0xE1,0xD7,0xC1,0x59,0x7A,0x0E,0xAD,0x9D,0xE5,0xFE,0xE7,0x2A, + + 0xE0,0xDB,0xAA,0x18,0x14,0x20,0x22,0x65,0xCB,0x73,0x27,0xDC,0x79,0x72,0x6B,0x8B, + + 0x8C,0x8D,0xC7,0xC9,0x9B,0xF4,0x43,0x79,0x6B,0xCC,0x8D,0x82,0xD6,0xC5,0x35,0xC6, + + 0xE0,0xB9,0x81,0xA3,0x38,0x29,0x01,0x1D,0xA3,0x5E,0xA4,0x43,0x2C,0x9A,0x8B,0x20, + + 0x70,0xB0,0xDE,0x98,0x08,0x72,0x46,0x8F,0x8B,0x34,0xC4,0xD7,0x24,0x76,0x0F,0x14, + + 0x35,0x48,0xB4,0x7B,0xC4,0x52,0xBC,0xA3,0x4F,0x35,0xFC,0xB6,0x57,0x7C,0xC5,0x04, + + 0x19,0x5E,0xD4,0x63,0x11,0x93,0x2D,0x85,0x28,0xD1,0xB5,0x00,0x51,0x8D,0xCD,0xBC, + + 0x6C,0x08,0x74,0xEE,0x64,0xAE,0x23,0x99,0x8A,0x5C,0x02,0x55,0xF5,0x1F,0xE1,0xC4, + + 0xA5,0x02,0xBC,0xA6,0x71,0xCA,0xAF,0xC7,0xC3,0x4F,0xEA,0x99,0x13,0x54,0x3A,0x81, + + 0xC1,0x1E,0xB4,0xB6,0x70,0x8A,0xF7,0x75,0xF0,0x6A,0x5C,0x41,0xC9,0xD8,0x15,0x5F, + + 0x59,0xBB,0xBD,0xA7,0xF1,0x49,0xD3,0xBF,0x6F,0x34,0xC7,0x1A,0x74,0x55,0xCF,0x21, + + 0x72,0x48,0xB5,0x57,0xBA,0x53,0xA2,0x75,0xC3,0xE1,0x44,0xB2,0x39,0x7C,0x05,0xEE, + + 0xCA,0x38,0x2D,0x64,0x3C,0xE4,0x96,0x2C,0x20,0x5B,0x06,0x2E,0xF8,0xFB,0x34,0x70, + + 0x79,0x56,0xE7,0x77,0x05,0x86,0x8E,0x86,0x43,0xAC,0x1E,0xFB,0x5D,0x82,0xAB,0x0D, + + 0xE3,0x38,0x2B,0x08,0x6D,0x58,0x2F,0x57,0x44,0x57,0xAF,0xDD,0x4C,0x73,0x2F,0x37, + + 0x7C,0xA6,0x34,0x31,0x98,0x5B,0xCF,0x41,0xE9,0x19,0x9E,0x20,0x9A,0x68,0xBB,0xCA, + + 0x6A,0x49,0xFE,0x1C,0xC7,0x33,0xE9,0x6C,0x4A,0x1E,0x9E,0xE5,0x0D,0xD0,0xF3,0x87, + + 0xFE,0x40,0xCA,0x9B,0xBA,0x33,0xD8,0xA6,0xE6,0x3F,0x14,0xFE,0x6B,0x7E,0xB4,0xE6, + + 0x54,0xE2,0x57,0x0A,0xB8,0xCB,0xAC,0xCE,0x4B,0x45,0x08,0x53,0xFC,0x26,0xE4,0x1B, + + 0x28,0x59,0x6C,0x23,0x67,0xC0,0xF4,0x7C,0x78,0x60,0xDE,0xEC,0x1A,0x80,0x8C,0x90, + + 0x10,0x88,0xDE,0x01,0xB5,0xCC,0x40,0xA0,0x45,0xA3,0x19,0x44,0xDB,0x76,0x48,0x10, + + 0x04,0x8C,0xBF,0xED,0xE4,0xC2,0x30,0x15,0xA4,0xCE,0x98,0x32,0x6A,0xE1,0xDD,0x87, + + 0xD5,0xDC,0x65,0xFC,0x38,0xAF,0x6B,0x22,0x67,0xC4,0xB9,0x37,0xEB,0xC2,0x5B,0x3D, + + 0x89,0x08,0xD2,0x08,0x11,0x77,0x59,0x73,0x68,0x48,0x02,0xE7,0xDD,0x9A,0x61,0xB1, + + 0xD4,0x2B,0x68,0x26,0xF7,0xAB,0x09,0x04,0x05,0xCB,0x0F,0xA4,0xD5,0xA2,0x5E,0x5E, + + 0xEC,0x00,0x21,0xB4,0x95,0xED,0x6A,0x90,0x3A,0xCE,0x68,0x56,0x47,0x17,0xD3,0xB0, + + 0x6A,0x2D,0x55,0xA5,0x14,0xEE,0x8E,0x8B,0xDB,0x8B,0x46,0x43,0xF4,0xA4,0xC1,0xD9, + + 0x7E,0x5B,0x23,0xB5,0x15,0xEF,0x7F,0x4C,0xF7,0x85,0x22,0x24,0xA8,0x30,0xDD,0xE8, + + 0x2E,0xAA,0x06,0x29,0xB0,0xA5,0xE7,0xC8,0xCE,0xC0,0xAA,0x3F,0x5A,0xE9,0x12,0xE5, + + 0x8D,0xC9,0xBD,0xE1,0xE8,0x3A,0xAA,0xCA,0x4F,0x68,0xBD,0xE0,0xC2,0xA8,0xA5,0x89, + + 0x0C,0x91,0x0F,0x8A,0xEB,0xAA,0x87,0xDB,0xC4,0xC5,0x1A,0x55,0x7F,0x1A,0x11,0xE4, + + 0x8B,0x0A,0x84,0x60,0x44,0x34,0x2A,0xC8,0x49,0x46,0xDB,0x3D,0xF0,0xE6,0x59,0x14, + + 0x3D,0x4C,0xC2,0x2C,0x5D,0x57,0xFB,0x7C,0x6A,0xB0,0xCC,0x13,0x3E,0x13,0xC1,0x90, + + 0xB4,0x22,0x11,0xBC,0x9D,0xA5,0x55,0x8B,0xEC,0x8D,0x8F,0xDE,0x07,0xFE,0xCF,0xEE, + + 0x5B,0xED,0x9B,0x68,0x3F,0x24,0x4C,0x24,0x17,0x33,0x13,0xCE,0xD8,0x0D,0x4C,0x45, + + 0x5F,0x24,0x2F,0x3D,0xDC,0x58,0x44,0xFF,0xEF,0xFE,0x20,0x2C,0xA0,0x61,0x8F,0xFD, + + 0x66,0x99,0x7B,0x79,0x10,0x4C,0xB4,0x3A,0xB0,0xF3,0x23,0x55,0xF0,0x7D,0x4C,0xD2, + + 0x0B,0x1C,0x06,0x51,0x94,0x33,0x02,0x8A,0xAF,0x00,0x84,0x48,0x16,0xF2,0xE1,0x93, + + 0x87,0x98,0x9A,0xD8,0x90,0xB4,0x92,0x07,0xC0,0xBE,0xE7,0xA5,0x1F,0x96,0x55,0x11, + + 0xA4,0xF6,0xD5,0x67,0x25,0x02,0xC2,0xC0,0xD9,0x75,0x2A,0x44,0x71,0x7E,0xD3,0xE6, + + 0xFA,0x85,0xBA,0x29,0x0C,0xB7,0x8B,0x66,0x46,0xC1,0x34,0x23,0x9F,0xF7,0x7C,0xC2, + + 0x86,0x3A,0xEE,0x27,0x88,0xF7,0x44,0xC3,0xC6,0x54,0x50,0x65,0x5C,0xFF,0x3F,0xFF, + + 0xDA,0xD4,0x1E,0xC2,0xDD,0xC9,0xCA,0x01,0x1F,0x77,0xF2,0xFB,0x1F,0xAF,0x78,0x57, + + 0xEE,0x16,0xB3,0x38,0xFD,0x1C,0xA1,0x77,0xC7,0x6B,0x7B,0x0B,0x3E,0x0C,0x5E,0x08, + + 0x2D,0xF5,0xDF,0xE8,0xCB,0x33,0x21,0x54,0x48,0x75,0xE4,0xAC,0x97,0x9C,0x4E,0xDE, + + 0x22,0x94,0x02,0x00,0x3E,0x79,0x00,0x93,0x43,0x06,0x12,0x9A,0x80,0xF2,0x7D,0x97, + + 0x2C,0xA9,0x86,0xB2,0x0F,0xF7,0xA6,0x9A,0x4D,0x25,0x8F,0xD3,0xDD,0xBA,0x65,0x44, + + 0x0E,0x9D,0xF5,0x95,0xC1,0xA4,0xAF,0x8A,0xCB,0x74,0x87,0x43,0x7D,0x00,0x49,0xB5, + + 0xF7,0x11,0x1B,0xD6,0x1C,0xA3,0xB6,0xFA,0xE6,0xA1,0x9C,0x6A,0x6B,0x36,0x7B,0x1A, + + 0x07,0x16,0xCD,0x20,0xE7,0x42,0x6C,0x14,0x84,0x99,0xA4,0x01,0x94,0x2C,0x98,0xB4, + + 0x23,0x38,0x98,0x3E,0x01,0xEC,0x61,0x89,0x86,0xD3,0x67,0x1E,0x86,0xDE,0x2F,0xE6, + + 0xA9,0x9E,0xB1,0x30,0x85,0xBC,0x45,0x4B,0x76,0x70,0x81,0xC2,0xCC,0x9B,0xBA,0xF1, + + 0xA3,0xF0,0x84,0x04,0xEF,0xDF,0x30,0xCA,0xB5,0xC9,0xCB,0x24,0xD0,0xE0,0xB0,0x2D, + + 0x61,0x0E,0x88,0xEB,0x11,0x21,0x26,0x43,0x56,0x0E,0xA3,0xB1,0x5F,0x03,0x33,0xFE, + + 0xB3,0x02,0x7E,0x05,0x6F,0xDD,0x31,0xAB,0xE4,0x59,0xAE,0x15,0x23,0xFD,0x77,0x29, + + 0xA3,0xB3,0x83,0x6E,0xD0,0x0C,0x18,0x42,0xDE,0x0C,0xD3,0xA8,0x2A,0x60,0x3F,0xB8, + + 0x82,0xFB,0x00,0x64,0x4C,0xFB,0xEB,0x2E,0xAB,0x2D,0xFC,0x7E,0x68,0xD0,0x58,0xA8, + + 0x03,0xFE,0x63,0x13,0x1D,0xF9,0x5C,0x27,0xBE,0x2B,0x71,0x0A,0xC6,0x63,0x81,0x40, + + 0xF0,0xBD,0x75,0x27,0xA1,0xC6,0x2E,0x99,0xC2,0x04,0x00,0x2A,0x2F,0x1A,0x49,0xAD, + + 0x02,0x45,0x0D,0x9F,0x28,0xD8,0x3F,0x10,0xC2,0xC7,0x70,0xC2,0x72,0x0B,0x80,0x4F, + + 0x3B,0xCC,0x88,0xE6,0x51,0x08,0x82,0xD1,0xFA,0x0A,0x07,0xA8,0x18,0xF7,0x9F,0x19, + + 0xE0,0x78,0x8A,0x1C,0x19,0xB8,0x7A,0x3A,0xB6,0x46,0x25,0x7B,0x83,0x61,0xE1,0xFA, + + 0xF8,0xA1,0x83,0x0D,0x98,0xCA,0x83,0x8C,0x2B,0xCA,0xAC,0x4D,0xD0,0xD8,0xA7,0x8A, + + 0xF9,0x01,0x8B,0x1D,0x91,0x32,0x7B,0x3B,0xBC,0x46,0x1E,0x42,0x56,0xFD,0xCA,0x55, + + 0xF7,0xD4,0x98,0x98,0x6A,0x6E,0xF5,0x09,0xCA,0x5C,0x16,0x97,0x2D,0x6C,0x74,0x60, + + 0x86,0x8B,0x0A,0x8C,0xA7,0x71,0x12,0x7C,0x97,0x44,0x8C,0xD5,0xAC,0x03,0x5B,0xC8, + + 0xC2,0x9F,0xD3,0x6F,0x3B,0x91,0xEC,0x2E,0x00,0x47,0xC5,0xC1,0x25,0xB3,0xCF,0x19, + + 0x18,0x09,0x74,0x13,0xF0,0x20,0x65,0x1C,0x30,0xD4,0x66,0xE2,0x6E,0xB9,0x3F,0x7E, + + 0x04,0xEF,0x10,0xAB,0x52,0x90,0x07,0x59,0x60,0xCB,0x20,0xC6,0x33,0x8C,0x55,0x60, + + 0xAC,0x5C,0x4C,0xB4,0x71,0xAC,0x50,0x78,0x12,0x24,0x67,0xDB,0x2C,0x8E,0x3F,0x13, + + 0xA0,0xCD,0xD7,0x75,0xB2,0x43,0x2D,0xD3,0x1F,0x10,0x68,0xCB,0xB9,0x7D,0xEA,0xEF, + + 0xC0,0x17,0xF5,0x11,0x91,0x70,0x42,0x31,0x8A,0xB0,0xFD,0xF1,0x71,0xAE,0x7E,0x87, + + 0xBC,0x6B,0x54,0x46,0xB2,0x8D,0xC1,0xFF,0x12,0x38,0x44,0xFB,0xF6,0xA0,0x29,0x3B, + + 0xC2,0x03,0x9C,0x59,0x90,0x2E,0x47,0x1F,0x03,0x85,0x18,0x71,0x30,0x15,0x7F,0x4F, + + 0x15,0x9B,0xFD,0x15,0xEE,0x30,0x0C,0x1D,0x07,0xF0,0x71,0x87,0x4D,0x14,0x34,0xAB, + + 0x81,0xFA,0x4E,0xB3,0x44,0x27,0x9D,0x59,0x44,0x5A,0xBD,0xB1,0xEC,0x78,0x78,0x6A, + + 0x3A,0x55,0xBE,0x62,0x94,0x35,0xE7,0x45,0x68,0x03,0xEE,0x8B,0x85,0x77,0x9E,0x70, + + 0x06,0x54,0x6D,0x5C,0x21,0xE5,0x13,0x5E,0x4D,0xB1,0x49,0x3E,0x7C,0x00,0x1D,0x8B, + + 0x62,0x15,0x7A,0xCA,0x66,0x67,0x2F,0xDB,0x17,0x18,0xA8,0x28,0xF6,0xF0,0xF4,0x91, + + 0x0C,0xE4,0x36,0xC3,0x64,0x46,0x90,0xE4,0xA8,0x63,0xE7,0x3F,0x79,0xDF,0x80,0x6E, + + 0xE1,0x5E,0x7E,0x33,0x3C,0x36,0xAF,0x6A,0xA3,0xCB,0x6B,0x3C,0x36,0x7A,0x6B,0xAA, + + 0xA6,0x6B,0x31,0x5E,0x19,0x0D,0x6C,0x03,0x9B,0x52,0x56,0x3D,0x18,0x1D,0xCD,0xB5, + + 0xAC,0x7E,0xD0,0x25,0x32,0xF3,0x6F,0x18,0x49,0xDE,0x87,0x75,0x59,0x78,0xB2,0xAB, + + 0x3D,0x40,0xB7,0x35,0x3F,0x3C,0x9F,0xF8,0x26,0x02,0xA7,0xE6,0x7F,0xEB,0x65,0x3D, + + 0x38,0xC2,0xA0,0x06,0x50,0x86,0x60,0x55,0x4E,0x7B,0xF8,0x32,0xD4,0xF0,0x4E,0x2F, + + 0xF0,0x27,0x57,0xE9,0xE2,0x14,0x31,0xCE,0xC5,0x83,0x3B,0x88,0x15,0xCD,0x2E,0xA1, + + 0x09,0x7F,0x8C,0x78,0x0D,0x29,0x7A,0xDB,0xC4,0x39,0x0E,0x5E,0xF5,0x62,0xBA,0xD3, + + 0xC9,0x57,0xE4,0x65,0x66,0x0C,0xF1,0x5B,0x47,0xE7,0x16,0x49,0x08,0xA2,0x6C,0x35, + + 0x65,0x1B,0x60,0x29,0x10,0xA5,0x70,0x3C,0xF3,0x18,0xF8,0x6A,0xAF,0x1B,0x22,0x29, + + 0x85,0xAD,0xB1,0x43,0xC2,0xC9,0x7C,0x25,0x9A,0x78,0x9A,0x76,0xA0,0xA4,0x19,0x41, + + 0x71,0xC4,0x27,0xB9,0x3A,0xAB,0xDE,0x0C,0x1B,0x84,0x4C,0xF8,0x29,0xBB,0xCD,0x31, + + 0xC4,0x68,0x2D,0x09,0x99,0xB9,0xD6,0x0C,0x48,0x61,0xC6,0x5A,0x28,0x6A,0xB1,0x15, + + 0x70,0x2C,0xF0,0x74,0x91,0x0E,0xB2,0x2E,0x0C,0x14,0x9D,0x51,0x85,0x55,0x0A,0x78, + + 0xE4,0x38,0x67,0x26,0x1B,0xA8,0x61,0x38,0x36,0x21,0xFA,0x0C,0xA2,0xEF,0xB6,0x32, + + 0xC4,0xFB,0xEE,0xCF,0xBE,0x21,0xE8,0x04,0xB3,0xC8,0xF9,0x2A,0xB7,0xE5,0x50,0x68, + + 0xF9,0x74,0xA9,0x7D,0xA4,0xA0,0xE6,0x90,0xCB,0x13,0x33,0x3D,0x7C,0xB4,0x1A,0xC8, + + 0x0D,0x6A,0x9F,0xB1,0x7D,0x05,0xBD,0x2A,0x42,0x38,0x23,0x90,0xD3,0x11,0xC2,0x89, + + 0xBE,0x8E,0x2A,0x7F,0x09,0x12,0x1C,0xA6,0x4C,0x8D,0xAF,0xBE,0x57,0xAC,0x39,0x65, + + 0x2D,0xCF,0xF0,0xCB,0xBE,0xDB,0xBC,0x4F,0x33,0xA2,0x95,0xC3,0x2B,0x48,0xD5,0x46, + + 0x29,0x21,0x52,0xDB,0xB7,0x25,0xDC,0xA7,0xEB,0x1B,0x48,0xD6,0x23,0xBC,0x88,0xF1, + + 0x3B,0x66,0x0B,0xDD,0xC5,0x0C,0x7D,0x7F,0x29,0x5A,0x8C,0x59,0xF9,0x76,0xD7,0xB6, + + 0xA8,0x3C,0x93,0xC9,0x11,0x3C,0x6D,0x12,0x47,0x92,0x50,0x24,0xC6,0xF9,0xDA,0xF0, + + 0xB3,0x44,0xA6,0x85,0x21,0x4E,0x60,0x03,0xC6,0x28,0xB0,0xE7,0xB0,0x0F,0xE0,0x00, + + 0xE2,0x18,0x56,0x67,0x25,0x62,0x3D,0xB2,0xED,0xF3,0x3F,0x35,0xF0,0x8A,0x5E,0x49, + + 0x9D,0x19,0xE3,0xDE,0xD3,0xB2,0xE3,0x1D,0x87,0x07,0x50,0x84,0x89,0x78,0xAC,0xD7, + + 0xBF,0x96,0xBC,0xCF,0xD6,0xBA,0xB8,0x0D,0x92,0xDC,0xF8,0x74,0x72,0x6F,0x04,0x29, + + 0x26,0xF6,0xB5,0xDA,0x15,0xB0,0xD9,0x66,0x11,0x2B,0x31,0x62,0xF8,0x7C,0x03,0xCA, + + 0x46,0xFB,0xCD,0xDF,0x4A,0x78,0x7F,0x1F,0x18,0xD3,0x85,0x88,0x36,0x95,0x06,0x60, + + 0x45,0xC2,0xD8,0x88,0xDD,0x3B,0xC9,0x55,0x93,0xD8,0x8E,0x93,0xDF,0xB9,0x4C,0x9A, + + 0xDE,0xF5,0xD1,0xFE,0x45,0xD5,0xC1,0x44,0x92,0xF9,0xB5,0x96,0x16,0x5A,0x46,0xAF, + + 0x57,0x17,0x0A,0x7C,0x30,0xB7,0x37,0x54,0xEC,0x25,0x8D,0x5C,0x8C,0xB8,0x90,0x00, + + 0x5C,0x12,0xCD,0x8F,0xBE,0x3B,0x3F,0x44,0x12,0xDB,0xAF,0x50,0xCA,0xF7,0x81,0x35, + + 0xCF,0x4A,0x86,0x6E,0x66,0x37,0xF2,0xA4,0x93,0x80,0xBC,0xEB,0xD2,0xF3,0x54,0x40, + + 0xDC,0xDC,0x31,0xB3,0x4C,0xB9,0x2F,0x1C,0xDA,0xD2,0xC6,0x2E,0x33,0xFB,0x9C,0xB9, + + 0x74,0x21,0xE3,0x2D,0xC9,0xBA,0x2D,0xF7,0xD2,0x9C,0xD0,0xE9,0x2E,0x9A,0xC2,0xA4, + + 0x32,0xC3,0xB0,0xA7,0xBB,0x57,0x26,0x07,0xAB,0x9E,0x77,0x9B,0x5C,0xBE,0x50,0x0D, + + 0x36,0x1B,0x37,0x02,0xE7,0x9D,0x0C,0xE0,0x38,0xDD,0xF1,0x84,0x86,0xDF,0x5A,0x94, + + 0x25,0x3F,0xDA,0x1B,0xE2,0x5A,0xC1,0x30,0x29,0x9B,0x78,0x0B,0x75,0xCA,0x06,0x67, + + 0x7B,0x0B,0x93,0x8F,0x6B,0xBF,0x37,0x44,0x63,0xC7,0x4E,0x25,0x53,0x6C,0x2F,0xF3, + + 0xED,0xAC,0xCA,0x91,0xC4,0xB2,0xE6,0x5F,0xAB,0x4C,0xE1,0x31,0x28,0x21,0x44,0x4B, + + 0xFE,0xA7,0x6D,0x5D,0x71,0x24,0xAF,0x99,0x46,0x04,0xF6,0x62,0x9C,0xD9,0x9A,0xD4, + + 0x0B,0xF1,0x9A,0x1E,0xF8,0x41,0xD8,0x0B,0x45,0x44,0x58,0x87,0x99,0xCE,0x81,0x40, + + 0x5E,0xF3,0x54,0xB6,0x16,0xAB,0x1B,0x3C,0xA9,0x49,0xFB,0xB5,0x71,0xEE,0x6F,0xE1, + + 0x07,0xA3,0xF1,0x68,0x6C,0xAA,0x4C,0x9F,0x6F,0x4A,0xBB,0x71,0xD5,0xE4,0x13,0xE4, + + 0xB4,0x73,0xDB,0xDB,0xBD,0xAF,0xE9,0x07,0x1F,0x35,0x82,0x05,0xEF,0x0D,0x74,0x25, + + 0x76,0x1F,0x1A,0xF4,0xD6,0x64,0x58,0xC8,0xBA,0xB8,0xA2,0x0C,0x17,0xC6,0x43,0x1A, + + 0xE4,0xDB,0x82,0x08,0x1F,0xBB,0xFF,0xBA,0x97,0x40,0xAB,0xC2,0x25,0xCB,0xD0,0x16, + + 0x8F,0x33,0x89,0xFB,0xBD,0x28,0x65,0x3F,0xAA,0xBC,0x3B,0x4F,0xBB,0x57,0x96,0x4F, + + 0xAB,0x69,0x11,0xB2,0x9A,0x81,0xAF,0x17,0x4C,0x4D,0x1E,0x9D,0xC6,0x7E,0x24,0xED, + + 0xE4,0x41,0xCE,0x1B,0x9A,0x23,0xA3,0x5F,0xEA,0x32,0xA5,0x81,0x5B,0x63,0xBC,0xCD, + + 0x82,0xFA,0x53,0x8A,0x98,0xDB,0xF7,0xED,0xEA,0xDE,0x3B,0xE7,0xF8,0xB8,0x3B,0x9F, + + 0x21,0x4D,0x0B,0xED,0x4D,0x6D,0xE4,0xFD,0xEB,0x69,0xB3,0xFB,0x27,0x2E,0x83,0x04, + + 0x28,0x83,0x3C,0x7B,0x50,0xCF,0x04,0x82,0xC1,0xEF,0x80,0xC2,0xFD,0x12,0x4C,0xAC, + + 0xCA,0x55,0x32,0x98,0x02,0x85,0xA3,0xEA,0x02,0x24,0x43,0xB5,0x8C,0x1D,0x3F,0x7E, + + 0x57,0x99,0x65,0x1D,0x4D,0x31,0xD5,0x71,0x5C,0xCE,0xF5,0x8B,0x93,0x7D,0x37,0x21, + + 0x1D,0xBC,0x37,0x75,0xF9,0x28,0x8E,0x35,0xC9,0xCB,0xFB,0xD0,0xF2,0x52,0xD8,0xFB, + + 0x1F,0xE1,0xAC,0x42,0xCE,0x75,0x77,0x7E,0xBA,0xA2,0x71,0x7C,0xF5,0x62,0x2C,0x70, + + 0x3B,0xB8,0xC8,0x36,0xB1,0xC9,0x0E,0xDB,0x88,0xF0,0xDC,0x36,0xF0,0x33,0xD8,0x45, + + 0xE9,0xB6,0xA5,0x9A,0x11,0xBD,0x0B,0x7A,0xF2,0x14,0x85,0x7B,0x09,0x8D,0xC4,0x33, + + 0xE3,0x11,0xB7,0x25,0x60,0x38,0x03,0xC3,0xE7,0x1B,0x6A,0xD1,0x2F,0x96,0xA2,0xEA, + + 0xD3,0x5A,0x6F,0xEA,0xD3,0xD1,0x2E,0x57,0x0B,0xF1,0xCC,0x8C,0x04,0x67,0xCE,0xBC, + + 0xEF,0x14,0x8A,0xDB,0xB8,0x37,0xDE,0x99,0x7F,0x26,0x09,0x56,0xDC,0x15,0x97,0x1F, + + 0x51,0x15,0x17,0x4A,0xBA,0xCF,0x84,0x2D,0xC8,0x2F,0x2F,0x53,0x9B,0x5B,0x98,0x66, + + 0xFD,0xCC,0x4F,0x2D,0x24,0xC7,0xAE,0x5B,0x18,0xF4,0x7C,0x43,0x5D,0x96,0x16,0xD5, + + 0x89,0x5C,0xA6,0x93,0xDD,0x91,0x37,0xFB,0x18,0xC8,0x8F,0x6D,0xDF,0xD5,0xE3,0x96, + + 0xDE,0x41,0x82,0x3E,0x86,0xB1,0xFB,0xFD,0xEC,0x4B,0x48,0x1C,0x23,0x7B,0x0F,0xE7, + + 0x37,0xE3,0x8F,0x2F,0x16,0x93,0x71,0x50,0x32,0xF5,0x41,0x8D,0xD6,0xD3,0x71,0xB5, + + 0x8A,0xDD,0x1B,0x78,0xF8,0x33,0x0F,0x67,0x10,0xA4,0xF1,0x06,0x5A,0xD4,0x6E,0xFE, + + 0xB8,0x7B,0xB7,0xA2,0x12,0x03,0xE3,0xD1,0xC8,0x7D,0x70,0x06,0x04,0xBF,0xBE,0xEB, + + 0x49,0xC3,0x92,0x94,0x88,0x85,0x38,0x33,0x11,0xC5,0x78,0x16,0x06,0xBC,0x61,0x2C, + + 0xB4,0xD7,0x07,0x83,0xAE,0x44,0x49,0x2E,0x98,0x35,0x05,0x45,0x6B,0x1F,0xA4,0x31, + + 0xF2,0xF6,0xD1,0x93,0xC7,0x7F,0x83,0x2B,0x45,0x7F,0xC1,0x10,0x68,0xEC,0xA8,0xCB, + + 0x02,0x2E,0xB2,0xB3,0x10,0x27,0x0E,0x65,0xF3,0xCB,0x1C,0xE6,0xAA,0xC4,0x69,0x14, + + 0x47,0x28,0x96,0x65,0x7C,0x20,0x0E,0x4B,0x41,0xC4,0xD2,0xA6,0xF4,0x6D,0x77,0x5C, + + 0x93,0xC8,0x13,0xC3,0xF4,0xD3,0xC5,0x0C,0x65,0x4D,0x5D,0x25,0x55,0x5B,0xF6,0x01, + + 0xA9,0xE4,0x69,0x11,0x05,0x03,0x7B,0x11,0x30,0x4C,0xF8,0x84,0x1D,0x4C,0xFD,0x8A, + + 0xB0,0x99,0x62,0x3F,0x65,0xAB,0xA2,0x74,0xB1,0x14,0xE8,0x9D,0x24,0xAA,0x71,0x15, + + 0x0B,0x11,0x10,0x7E,0x11,0x24,0x2E,0x6A,0xEC,0x36,0xE0,0xFB,0x21,0xF6,0x92,0x3E, + + 0xF7,0x9C,0x32,0x1E,0xAF,0x1E,0x69,0xB1,0xB8,0x88,0xA3,0x3F,0x7D,0x35,0x98,0x3F, + + 0x8B,0xCA,0xD5,0x6A,0xAE,0x95,0x61,0xEF,0xB9,0x89,0x00,0xD9,0xF9,0xF0,0x28,0x08, + + 0x4F,0x8B,0xEC,0x54,0xD6,0x64,0x05,0x57,0xFD,0x11,0x95,0x66,0x8A,0x29,0xF7,0xDE, + + 0x4C,0xB2,0x02,0xD4,0x3D,0x7B,0xCD,0x7B,0xC2,0xC1,0x5A,0x8F,0xBF,0x6D,0x9E,0x70, + + 0xA3,0x7B,0xC4,0xBE,0x02,0xCE,0x8B,0x4F,0x41,0xCC,0x54,0x58,0xB5,0x4B,0x51,0xA8, + + 0xDA,0xFA,0x94,0xA2,0x9F,0xA1,0x13,0xFF,0xAD,0x19,0x3B,0xCF,0x84,0x44,0xE4,0xF1, + + 0xA6,0x8C,0x9B,0xD9,0x5F,0x66,0x4C,0x90,0x58,0x2F,0x70,0x5D,0x17,0x7B,0xA8,0xED, + + 0x04,0xE1,0xCB,0x9B,0xD4,0xF3,0xAC,0x12,0x1D,0x92,0xEE,0x98,0x9E,0x95,0x57,0xE1, + + 0x46,0xC7,0xA5,0x98,0x6A,0x19,0x0B,0x41,0xD2,0x0D,0x22,0x54,0x70,0x7F,0xF6,0xD9, + + 0xDA,0x16,0xFF,0xBC,0xDE,0x16,0x2D,0x8B,0x99,0x7E,0x82,0x55,0xA9,0xF7,0x76,0x3D, + + 0xD9,0x19,0xEB,0x38,0xDF,0x0C,0x74,0x20,0xE5,0x92,0x8C,0x5B,0x96,0x0B,0xFB,0x21, + + 0xA3,0xC8,0x67,0x2D,0xFF,0x4D,0x87,0x09,0x45,0x24,0x23,0x3C,0x00,0xC5,0x37,0x3C, + + 0x51,0xEB,0xCF,0x62,0xF5,0xBB,0xC2,0xC7,0x07,0x29,0x46,0x05,0x76,0x76,0xBE,0x20, + + 0x2B,0x9A,0xA3,0xF8,0xE2,0xF7,0xFF,0x71,0x2E,0x40,0x3D,0x36,0x00,0xF1,0xFB,0x0E, + + 0x57,0x67,0x86,0x7F,0xDC,0x38,0x28,0x9B,0xCD,0x67,0xDB,0x8A,0xAC,0x9B,0x01,0xE5, + + 0xF4,0x0C,0x8D,0x8D,0x41,0x0D,0x64,0xF8,0x15,0x76,0x1B,0x0A,0x7B,0x93,0xE7,0x5B, + + 0x16,0xDB,0x0F,0x05,0x74,0x6B,0x09,0xDB,0xC2,0x45,0x90,0x1F,0x68,0x59,0x37,0xE1, + + 0x22,0x3D,0xF1,0x90,0xF9,0xF5,0x9F,0x4B,0x65,0x48,0xE0,0x42,0xF9,0xB9,0x99,0xB8, + + 0xD5,0xDE,0x6D,0x22,0xB1,0xBE,0x4E,0xD3,0x95,0xDA,0xFE,0x59,0x1D,0xDC,0xF7,0x29, + + 0xAB,0x10,0x86,0xC1,0xBB,0x69,0x05,0x81,0xE2,0x4B,0x68,0x18,0x5B,0x06,0x2D,0x96, + + 0x13,0x3F,0x50,0xCE,0x33,0xB2,0x59,0x51,0x4F,0x6F,0x8F,0x07,0xF4,0x53,0xBE,0x28, + + 0x23,0x92,0x4B,0xCC,0x33,0x79,0x37,0x6F,0x72,0x62,0x00,0x8D,0x08,0x40,0x59,0x07, + + 0xE5,0x9F,0x32,0x80,0x65,0xB4,0xA7,0x04,0xCF,0x42,0xC0,0xC9,0x40,0x20,0xCD,0xF8, + + 0x81,0xCC,0xE8,0x5E,0xA7,0x2E,0x70,0x3F,0xC5,0x15,0xB0,0xD6,0xD0,0x05,0x3E,0x46, + + 0x52,0x08,0x11,0x77,0x7B,0x38,0xA6,0x20,0x4D,0x4E,0x1A,0x1D,0x51,0x6F,0x16,0x71, + + 0x87,0x88,0xF7,0xCD,0x7A,0xCA,0xBD,0xB5,0xA3,0x98,0xB1,0x33,0x50,0x6D,0xC0,0x1C, + + 0x0D,0x46,0x90,0xDD,0xF3,0x2B,0xFF,0x8E,0xBB,0x4B,0xD4,0x94,0xEF,0xB5,0x01,0xA8, + + 0x92,0xBE,0x82,0x49,0x91,0x26,0x20,0xF2,0x9E,0x5A,0xF6,0x87,0xDF,0x68,0xD1,0xD5, + + 0x84,0x2C,0xA1,0x47,0xEB,0x2B,0x31,0x3E,0x79,0x3B,0xAF,0x63,0x33,0xE5,0x7B,0xA0, + + 0xED,0x45,0x0C,0xB7,0x97,0xAD,0x67,0xA0,0x60,0x41,0xA6,0x0A,0x5E,0xD1,0xFE,0x31, + + 0x0E,0x1B,0x59,0x52,0x67,0x42,0x42,0xB6,0xB3,0xE5,0xCC,0xEE,0x4A,0x2A,0xED,0xD8, + + 0x4D,0xF5,0xC0,0xB7,0x6E,0x75,0x6C,0xDA,0x81,0x4A,0xDE,0xBE,0x58,0x0E,0xF2,0x6B, + + 0x7B,0x66,0x5E,0x10,0x63,0x68,0x61,0xCB,0x64,0xE7,0x93,0x21,0xDE,0xC0,0x30,0x46, + + 0x5C,0xB6,0x54,0xB7,0xA6,0xDB,0xBB,0x2A,0xB5,0x2F,0xA1,0xDF,0x5B,0x43,0x9F,0x48, + + 0x3D,0x08,0x11,0xBD,0xB9,0x6C,0x5A,0x07,0x29,0x6C,0xDA,0x7C,0x0E,0xBB,0xB2,0xDC, + + 0x2F,0xFD,0x0A,0x7D,0x61,0x6F,0x3A,0x38,0xB4,0x40,0x49,0x8F,0xDF,0xE0,0x9C,0x48, + + 0x8C,0x36,0x7C,0xC9,0xBA,0x55,0x2B,0xC9,0x35,0xF1,0x51,0x02,0xB9,0x5F,0x8B,0x58, + + 0xF9,0xD4,0xDB,0x31,0x6A,0x20,0x4B,0x1B,0x70,0x0E,0x89,0x2B,0x30,0x0B,0x97,0xF2, + + 0x83,0x51,0xC1,0x74,0xA0,0x91,0x94,0x51,0xA2,0xD0,0xCD,0xB2,0x14,0x8F,0x46,0x95, + + 0xDE,0x50,0x8B,0xAB,0x5D,0x73,0xDC,0x00,0x6E,0xFA,0x23,0xEF,0x88,0xAE,0x65,0x83, + + 0xF9,0x1F,0x13,0x6F,0x15,0x3B,0x2F,0x25,0x82,0x8B,0x55,0xE4,0xFA,0xCE,0x53,0x73, + + 0xA5,0x15,0xC7,0xC2,0xB7,0x08,0xB8,0xB5,0x66,0x45,0xA3,0x00,0x4E,0x0E,0x3A,0xC7, + + 0x83,0xEB,0xD1,0x40,0x12,0xB4,0x2C,0xF9,0x98,0x92,0x68,0x9A,0xD1,0x11,0xEC,0xA2, + + 0x49,0xE6,0x4F,0x8B,0xC2,0xC9,0xB9,0x8A,0xF5,0x5D,0xE3,0xBF,0x92,0xCA,0x7B,0x81, + + 0x9E,0xB9,0xFD,0x3F,0x51,0x3F,0x3A,0xC5,0x6F,0xEB,0x6A,0x07,0xD6,0x4A,0x33,0xD6, + + 0x5E,0x18,0xE2,0xBE,0x6A,0x75,0x58,0x82,0xA2,0xA6,0xA6,0x7C,0x0E,0x46,0xF7,0xA0, + + 0x2C,0xB8,0xB8,0xB3,0x54,0x78,0x46,0x36,0x93,0xA3,0x69,0x6B,0xA2,0x70,0x0A,0xDF, + + 0xA8,0x17,0xAE,0xFE,0x1D,0x3F,0xA9,0x9C,0xEB,0x5D,0x61,0x98,0x85,0xE0,0x57,0x4E, + + 0xAA,0xEF,0x19,0xC2,0xF0,0xDB,0x17,0x6B,0x6B,0x1C,0x95,0xC2,0x0F,0xC7,0xCF,0x29, + + 0x7F,0xB4,0xAF,0x2D,0xDA,0x6E,0x17,0xDB,0x0A,0x52,0xA5,0x43,0x9A,0x5C,0x66,0xAE, + + 0x0E,0x72,0xCB,0xC3,0x3C,0x36,0xA9,0x9B,0x67,0x8F,0xA8,0xEA,0x9B,0xAF,0x66,0x1A, + + 0x40,0xDB,0xEE,0x02,0x1F,0x90,0x54,0x67,0x82,0x35,0xA1,0x8E,0x09,0xE2,0x07,0xF6, + + 0xA2,0x72,0xDC,0xDC,0xE9,0x0E,0xAC,0xCD,0x65,0xF3,0xA9,0xEA,0x5B,0xCF,0x4F,0xC2, + + 0x65,0xB4,0x52,0x32,0x42,0x4E,0xBC,0xB9,0xF3,0xF2,0xE2,0x1D,0x0E,0xC2,0x8B,0x1B, + + 0x84,0x1E,0x9A,0xFD,0x12,0x2A,0x0E,0x18,0xE7,0xA5,0x14,0x44,0x15,0xC0,0x48,0x53, + + 0x89,0x8C,0x30,0xFB,0x49,0x2C,0x38,0xF0,0xC6,0x87,0x18,0xF4,0xD9,0xEF,0x8E,0x7D, + + 0x59,0xC3,0xD4,0xFB,0x41,0x59,0x0F,0x18,0x67,0x39,0xC9,0xE5,0x57,0xEC,0x23,0x1B, + + 0x26,0x85,0xD6,0x13,0xD6,0x94,0x8E,0x17,0x4A,0xC1,0xC1,0xF5,0x74,0xA0,0x49,0xBF, + + 0xE6,0xFF,0x54,0x3D,0xB5,0x0F,0x4A,0x99,0x25,0x59,0xC8,0x99,0x72,0xA6,0xDD,0x56, + + 0x52,0x14,0xF8,0x04,0x11,0x84,0x40,0x83,0xE4,0x25,0x44,0x14,0xA4,0x80,0xA1,0xBA, + + 0x84,0x1D,0x99,0x43,0x6B,0xE4,0x66,0xE7,0xF4,0x0A,0x3D,0x0F,0x54,0x2A,0xCA,0xEE, + + 0x5B,0x8F,0xBE,0xD3,0xB7,0x3D,0x4B,0x4D,0x64,0xDC,0xC1,0x8C,0x5A,0x1A,0x2A,0x47, + + 0x6F,0xC8,0xC2,0x58,0x93,0xA5,0x85,0x2B,0xC1,0xC4,0x15,0x9A,0x5A,0xC0,0x68,0xF8, + + 0x8F,0xC1,0xD4,0x2B,0xF4,0x48,0x44,0xAD,0xAC,0x1A,0x65,0x3E,0xAA,0xEA,0x5B,0x89, + + 0x8D,0xD2,0xB9,0x0E,0xBF,0xEB,0x5B,0x54,0xAC,0x8A,0xF7,0x30,0xB2,0x17,0xBC,0xF9, + + 0x0F,0xC3,0x07,0x8C,0x86,0xA1,0x45,0xAD,0xA6,0x6D,0xBC,0xB2,0x34,0x28,0x41,0x0B, + + 0xD6,0xC4,0xD9,0xAC,0xB2,0x11,0xF6,0x34,0xC3,0xAE,0x95,0x95,0xAB,0x7A,0x54,0x1E, + + 0x33,0x22,0xD7,0x19,0xD5,0x97,0x85,0x8A,0xBE,0x7C,0x12,0x04,0x9D,0xED,0xDE,0x2B, + + 0x90,0xFC,0x9B,0x6B,0x7F,0x91,0xD8,0xEE,0x5D,0xF1,0x88,0x28,0x27,0x68,0xCB,0x29, + + 0xE5,0xA7,0xA3,0xC7,0xFC,0xD5,0xBB,0xD3,0x0A,0x32,0xF3,0x0C,0x5D,0x23,0x96,0x71, + + 0xC8,0x3B,0xDC,0x7A,0xB4,0x4B,0xB7,0x26,0x54,0xD0,0x27,0x22,0x46,0x26,0x4C,0x32, + + 0xF3,0x2E,0xAC,0x12,0x32,0xA8,0x26,0x9C,0x44,0xB1,0x2F,0x32,0x47,0xA6,0x13,0x8B, + + 0xA2,0x11,0xF5,0x7E,0xB8,0x29,0x55,0xA1,0xE5,0xDF,0x0A,0x45,0x97,0x9D,0x04,0xFC, + + 0x34,0x56,0x01,0xE5,0x6B,0x4C,0x67,0x4C,0x46,0xD5,0x87,0x55,0x96,0x03,0x02,0xCF, + + 0xC7,0x3B,0x19,0xB4,0x18,0xEB,0x7E,0x7D,0x99,0x79,0xFF,0x06,0x7A,0x0F,0xAC,0x62, + + 0x7C,0x3E,0xF6,0xD4,0x84,0x3E,0x46,0x0C,0x98,0x94,0x53,0xD2,0xF8,0xF7,0x07,0x47, + + 0xC4,0x9A,0x5A,0x80,0x28,0xEB,0xF9,0x7D,0x11,0x97,0x44,0xC3,0x2B,0x4B,0xC8,0x5B, + + 0x20,0x81,0xCD,0x5D,0xB6,0xD7,0x1D,0x53,0xB9,0xDA,0x4A,0xF6,0x7A,0xFB,0x54,0x82, + + 0xC8,0x3F,0x9C,0x10,0xBE,0xBC,0x12,0xAA,0xCD,0x5F,0x21,0x51,0x28,0x2F,0x2F,0xAC, + + 0xD5,0x62,0xD6,0x62,0xBD,0x42,0xFE,0x9E,0x47,0xD2,0x61,0xC4,0x42,0x3F,0x16,0xDB, + + 0x48,0x0F,0x75,0x6D,0x10,0x47,0x33,0xB7,0x0D,0xD5,0x36,0xC5,0x8B,0x36,0x2F,0x59, + + 0x2E,0xDD,0xFE,0x67,0x3D,0x00,0xB9,0x44,0xEB,0x4A,0x66,0xBF,0x1C,0x44,0x36,0x54, + + 0xD5,0x67,0x51,0xA3,0x1A,0x41,0x3C,0x14,0xCD,0xDA,0x9E,0x6A,0x1C,0x75,0xD9,0xFE, + + 0xAD,0x61,0x51,0x45,0xC0,0xFC,0x1E,0x5A,0x31,0xD0,0x80,0xCD,0x79,0x7E,0x67,0x09, + + 0x2D,0xD8,0x4B,0x54,0xBF,0x3E,0xFF,0x3F,0x0F,0xD1,0x54,0xD9,0x22,0x1B,0x92,0xA4, + + 0x0C,0x99,0x30,0xDF,0x9B,0x64,0x35,0x00,0x4C,0xD9,0x36,0x0E,0x63,0xBF,0xE8,0x8A, + + 0x22,0xD6,0x63,0xFA,0x34,0x5C,0x04,0x99,0x46,0x41,0xCA,0xCB,0x2C,0xCF,0x60,0x96, + + 0xFD,0x40,0x21,0xE5,0x29,0x05,0x27,0xD2,0x65,0x2F,0xE6,0x33,0xF0,0x0D,0x7E,0xFC, + + 0x80,0x0C,0x3E,0x4A,0x05,0xFF,0x3D,0x5B,0x63,0x27,0x31,0x57,0xB2,0x5E,0x53,0xC5, + + 0xFD,0x41,0xD7,0x39,0x10,0x98,0x59,0x0E,0xC9,0x2F,0x7A,0x25,0x2E,0x22,0xB6,0x32, + + 0xA1,0x02,0x99,0xA1,0x71,0xDF,0xE7,0x44,0xC0,0x4C,0x38,0xD7,0xD7,0x23,0xB3,0xB2, + + 0xA2,0x8F,0x30,0x26,0x20,0x0F,0x50,0xDE,0xE2,0xCF,0xAC,0x50,0x55,0x45,0x49,0xF7, + + 0x23,0x8C,0x39,0x4D,0xF1,0xD9,0xA4,0x13,0x61,0x40,0x11,0x78,0x61,0x2A,0xCE,0x01, + + 0x82,0x08,0x31,0xBD,0x9A,0x68,0xA2,0x93,0x62,0xCD,0x7E,0x33,0x71,0x29,0x12,0x2A, + + 0xA9,0xD7,0xC2,0xF4,0xA6,0x8C,0x3A,0xEA,0x4E,0xCB,0x2D,0x70,0x7B,0xC8,0x1E,0x48, + + 0xFC,0x06,0x00,0x23,0x2D,0xFC,0xDA,0x88,0x12,0xE2,0x19,0x47,0x08,0x62,0x59,0x93, + + 0xF4,0x48,0x99,0x5C,0x50,0x83,0x09,0xAD,0xAA,0x46,0x14,0x92,0xD8,0x4A,0x51,0x68, + + 0xF5,0x49,0x9E,0x19,0x84,0x89,0xBE,0x3D,0x4E,0x5D,0x9D,0x24,0x23,0x6B,0x22,0x08, + + 0xE8,0xD1,0x52,0xCE,0x38,0x3E,0xD5,0x8A,0xC8,0x44,0xA6,0x48,0x7A,0xCD,0xDA,0x1E, + + 0xA1,0xF6,0xFF,0xBE,0xB7,0xA6,0xE5,0x9A,0x6F,0xC0,0x60,0xEE,0x2B,0x7F,0x3B,0x6E, + + 0x77,0x01,0x93,0x41,0x8A,0xA5,0x22,0x17,0x69,0x2B,0x93,0xAA,0xE9,0xA8,0x4D,0xDD, + + 0x83,0xFB,0xFB,0xBF,0xBF,0xA4,0xA0,0x07,0xAB,0xDE,0x61,0x0D,0x5B,0xE9,0x04,0x04, + + 0x65,0x03,0x50,0x6B,0x5B,0x88,0xE4,0xAC,0x40,0x40,0xEB,0x59,0x70,0x7E,0x74,0xB7, + + 0xDC,0x1E,0xF2,0xC8,0x21,0x7C,0xDC,0x94,0x4B,0x58,0xB4,0xD6,0xF0,0x7E,0x65,0x21, + + 0xE6,0x9F,0x85,0x6D,0xA0,0x7F,0x95,0xB0,0xD5,0x13,0xFD,0x23,0x0C,0x33,0x9D,0xE3, + + 0x4A,0xF2,0xF3,0xC8,0x82,0x63,0x5F,0x59,0x5B,0x1E,0xB5,0xB2,0x70,0x37,0x1D,0xC0, + + 0x24,0xDF,0x1B,0x44,0x45,0x43,0x0E,0xFD,0xC1,0x52,0xB6,0x78,0x71,0xE4,0x5F,0xE6, + + 0x25,0xF5,0x4F,0x13,0x11,0x97,0xDC,0x12,0x47,0xD8,0x1C,0xAC,0x22,0xA8,0x4D,0x3C, + + 0xA6,0x54,0x05,0xED,0x49,0x74,0x59,0x9F,0x43,0xDE,0x8C,0x63,0x17,0xB6,0x71,0xF5, + + 0xA5,0x7D,0x49,0x51,0xA3,0x37,0x23,0xE8,0xD0,0x41,0xA5,0xD2,0x0E,0x78,0x5C,0xB4, + + 0x40,0xF9,0x3E,0x7F,0x3B,0x28,0x00,0xC0,0xCF,0x15,0xBE,0x6E,0x13,0x76,0xE2,0x0A, + + 0x21,0x11,0xAD,0x38,0xE1,0x5A,0x1D,0x3A,0x60,0x3D,0xF6,0x7E,0xFA,0x3D,0xC7,0xA9, + + 0xE8,0x17,0x3F,0x7E,0xB3,0x7B,0xFB,0x3B,0xAA,0x52,0xD7,0x29,0xD2,0x41,0x09,0xA6, + + 0xC5,0x59,0x4F,0x58,0xC2,0xC0,0x27,0xE9,0xE1,0x54,0xF7,0xBA,0x7A,0x74,0x5F,0x4A, + + 0xEF,0x71,0x46,0x78,0x9E,0x7E,0xAC,0xAE,0x06,0x4C,0x46,0x9E,0x85,0xF7,0x36,0x5C, + + 0x7A,0x95,0xF0,0xB0,0x18,0x4D,0x5F,0x1E,0x58,0xCB,0x2F,0x9E,0x8C,0x11,0xFC,0x2B, + + 0x06,0xE3,0x0B,0x4C,0x1C,0x6E,0xAD,0x01,0x03,0x11,0x2B,0xD0,0xFC,0x6D,0x57,0xDC, + + 0x55,0x7F,0x89,0xB1,0xBD,0xCD,0xA5,0xBF,0xD3,0x4D,0x1B,0x1F,0xA7,0x88,0x30,0x2D, + + 0xA5,0x5F,0x8C,0x0A,0x9D,0x90,0x60,0xBC,0xBF,0x3B,0xB4,0x3E,0x52,0xC0,0x3C,0x4A, + + 0xF0,0x8E,0xA8,0x55,0x07,0xE9,0x8F,0x16,0xAC,0x98,0x67,0xC9,0x71,0xA0,0x7B,0x2C, + + 0xF8,0xC0,0x8D,0x17,0x9C,0x16,0x31,0xE1,0x47,0x84,0x1F,0x59,0xF5,0x82,0xB9,0x61, + + 0x76,0x3C,0x04,0x94,0x95,0xA3,0x95,0xA0,0xF8,0xCB,0x55,0xB7,0x29,0xC3,0xBF,0x57, + + 0x81,0x83,0xD5,0xA4,0xBA,0x2F,0x0F,0x10,0x24,0x87,0xD4,0x26,0x52,0x8A,0x80,0xF0, + + 0xA3,0x02,0xE0,0x61,0xB6,0x7A,0x06,0x74,0x97,0xA1,0x83,0xEF,0xAA,0x54,0xC9,0xE1, + + 0x59,0xD9,0xF1,0xA5,0xB2,0xA0,0x0A,0x18,0xA7,0xA6,0x61,0x20,0xF2,0x6B,0x89,0x6E, + + 0x02,0x80,0x89,0x17,0x7B,0xAA,0xC6,0x91,0x93,0x10,0x87,0x71,0x36,0x34,0xFF,0x8A, + + 0x3B,0x69,0x2A,0x41,0xC0,0xA8,0xB6,0x8A,0x5C,0x18,0x1E,0x6C,0xDF,0xAA,0xD1,0xF7, + + 0x75,0xD2,0xAA,0x5D,0x3B,0xA9,0x70,0xA1,0x4B,0xA1,0x76,0xCF,0xC1,0xA9,0x5E,0xE1, + + 0x8A,0xCA,0xA3,0x4E,0x01,0x7E,0xF3,0xEE,0xC6,0x88,0xE1,0x5F,0xDA,0x69,0xDE,0xF2, + + 0x9D,0x90,0x1B,0x13,0x33,0x26,0x89,0xBF,0x8E,0xE0,0x53,0xB5,0xFF,0x3D,0x72,0x77, + + 0xEB,0xCD,0x4E,0xD0,0x93,0x5A,0x32,0x05,0x6A,0xCA,0x8C,0x69,0xFF,0x7D,0xE9,0xDF, + + 0x70,0xED,0xEE,0x19,0x1C,0xA2,0x81,0x98,0xE3,0xC0,0x55,0x04,0x82,0xAC,0xA3,0xCF, + + 0xC8,0x8F,0xEB,0x4A,0x11,0xAA,0x7F,0x10,0x6F,0x44,0x88,0x14,0xFD,0xC1,0xAB,0x63, + + 0x6B,0xCD,0x7B,0xDB,0x98,0xF0,0x31,0x85,0x6C,0xAA,0xA2,0xF9,0x3A,0x83,0xAC,0xE6, + + 0x6C,0x71,0xB4,0x02,0x3C,0x84,0xA4,0xD0,0x57,0xE7,0xDC,0xC4,0x52,0xF6,0xAB,0xD2, + + 0xCC,0xD0,0x0B,0xA9,0x1B,0xF3,0x04,0x49,0x84,0xB2,0xDC,0xF6,0xD3,0xFC,0x1B,0xB6, + + 0x29,0x14,0x12,0x23,0xB2,0x92,0xCD,0x87,0x45,0x73,0xBD,0x00,0x15,0xFD,0x92,0x17, + + 0x85,0xCA,0x61,0x99,0xB3,0xF9,0x46,0x74,0x18,0x65,0xB7,0xB6,0x56,0xFE,0xE0,0xC6, + + 0x21,0xF3,0x88,0x42,0x75,0x02,0xAE,0x46,0x42,0x96,0x75,0x05,0x72,0x2C,0x80,0x52, + + 0xDB,0xB5,0x00,0x56,0xCB,0x95,0x46,0x1A,0x58,0x1A,0xC6,0x0C,0xAA,0x68,0xA5,0x13, + + 0x26,0xD7,0x25,0x7B,0x97,0xF7,0xF9,0xF3,0x63,0x86,0xC5,0xB9,0x0B,0x2A,0xC1,0x91, + + 0x24,0xD5,0x41,0x55,0xB6,0x72,0xD5,0x73,0x62,0xC7,0x52,0xAC,0x02,0x4B,0xE6,0xAB, + + 0x56,0xDA,0xE3,0x8A,0x77,0x19,0x8D,0x30,0x6D,0x38,0xFC,0xB3,0x3D,0xFD,0x9A,0xE1, + + 0x8E,0x64,0x0E,0xEC,0x5F,0x85,0x5D,0x44,0x49,0xB5,0x05,0x5C,0xD1,0x04,0x37,0x63, + + 0x5D,0x95,0xFD,0x61,0xC0,0x15,0x88,0x30,0x13,0x07,0xCF,0x2D,0xFD,0xFD,0xEF,0xBB, + + 0xFE,0xD9,0xD1,0x98,0x1C,0x64,0x00,0x24,0x12,0x46,0xC7,0x9B,0x7F,0xF3,0x34,0x36, + + 0x0C,0x4A,0xDE,0x3D,0x4A,0x18,0x08,0x86,0x5D,0x4E,0x36,0x3E,0x23,0x6C,0x9D,0xE1, + + 0xD5,0x08,0x5D,0xE2,0xC3,0x4C,0x7C,0xDE,0x04,0x87,0x3E,0xA3,0xD3,0xBF,0x18,0xF4, + + 0x50,0x4B,0x08,0xF2,0x38,0x4B,0x8F,0xAD,0xEA,0x90,0x84,0xC2,0x51,0xBF,0x1C,0x19, + + 0x2C,0xD9,0x7F,0x81,0x42,0x63,0x5F,0x0A,0xF0,0xDF,0xF4,0xAF,0xDC,0x9F,0x80,0xC4, + + 0xAE,0xF7,0x5D,0x05,0x14,0xF8,0x70,0x61,0xB5,0x4D,0x90,0x24,0x50,0x60,0x28,0x34, + + 0x07,0xF9,0xD2,0x15,0xB2,0x85,0x14,0x4B,0xE0,0xC9,0x98,0x34,0x51,0x61,0x05,0x04, + + 0x86,0x88,0x58,0x87,0x4D,0xAD,0x5B,0xDA,0x63,0x44,0x91,0x25,0xD0,0x62,0xBD,0x95, + + 0xD0,0x8B,0x02,0xC4,0x95,0xFB,0x1D,0xD3,0xE5,0x58,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x1A,0x0D, + + 0xF6,0x68,0x5B,0x8E,0x19,0x4F,0xCF,0x5E,0xBF,0xE5,0x92,0x2C,0x58,0x68,0xCA,0xDC, + + 0xA7,0x48,0x35,0xFE,0x3D,0xDD,0x65,0xBC,0x14,0x33,0x9A,0x3C,0x59,0x69,0x87,0x0D, + + 0xCB,0x0E,0xBB,0xF2,0x79,0x25,0x8E,0x37,0x6B,0xCF,0x93,0x2D,0xD8,0x6A,0xE7,0x99, + + 0x75,0x2B,0x5B,0x99,0xDA,0xC7,0x8B,0xBB,0xCC,0x0F,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x5B,0x70, + + 0x24,0x1F,0x84,0x84,0x30,0x30,0xD1,0xDB,0xC3,0x35,0x94,0xA4,0x70,0x70,0x0E,0xE6, + + 0x6B,0xBB,0x8C,0x94,0x31,0x31,0x0A,0xD2,0x09,0x5C,0x9C,0xB4,0x71,0x71,0x65,0x25, + + 0xE1,0x50,0x85,0x85,0xB0,0x32,0x35,0x56,0xC4,0xAF,0x95,0xA5,0xF0,0x72,0x43,0x40, + + 0x85,0xEF,0x8D,0x95,0xB1,0x33,0xDD,0x95,0x96,0x48,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x1C,0x8D, + + 0xF5,0x95,0x86,0x8C,0x38,0x38,0xDD,0xAC,0x28,0x14,0x96,0xAC,0x78,0x78,0xDE,0x87, + + 0xAD,0xB6,0x8E,0x9C,0x39,0x39,0xDE,0xE0,0x38,0x54,0x9E,0xBC,0x79,0x79,0x90,0x76, + + 0x49,0x99,0x87,0x8D,0xB8,0x3A,0x4E,0x2F,0xAE,0x97,0x97,0xAD,0xF8,0x7A,0xAB,0xE2, + + 0x0A,0x5A,0x8F,0x9D,0xB9,0x3B,0xE4,0x9E,0x48,0xA4,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x8C,0x40, + + 0x87,0x80,0x17,0xA2,0x10,0x49,0x0A,0xC0,0xC6,0x83,0xB0,0x26,0x54,0xE0,0x40,0xD0, + + 0x83,0x74,0xAA,0x92,0x1A,0xF5,0xB8,0xE2,0x33,0x3C,0xB8,0x36,0x55,0xE1,0x7F,0x14, + + 0x8C,0x82,0x0C,0x41,0x3E,0x59,0xB9,0xC1,0x68,0xCD,0xB1,0x27,0xD4,0xE2,0xB9,0xFB, + + 0xC5,0xCE,0x39,0x17,0x95,0xA3,0xD5,0xA8,0xC4,0x43,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x8E,0xE2, + + 0x33,0x4E,0xA2,0x0E,0x1C,0xA8,0x8D,0xB1,0xB3,0x89,0xB2,0x2E,0x5C,0xE8,0x18,0xE1, + + 0x0B,0x71,0xAA,0x1E,0x1D,0xA9,0xAA,0x25,0xC9,0x1D,0xBA,0x3E,0x5D,0xE9,0x61,0x18, + + 0xB1,0x85,0xA3,0x0F,0x9C,0xAA,0x9F,0x50,0x12,0x35,0xB3,0x2F,0xDC,0xEA,0xE6,0x3F, + + 0x0F,0xC3,0xAB,0x1F,0x9D,0xAB,0x9F,0x54,0xEC,0x0B,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x88,0xFC, + + 0x45,0x94,0xA4,0x86,0x34,0xB0,0xA4,0x65,0x8D,0xAA,0xB4,0xA6,0x74,0xF0,0x80,0xE0, + + 0xFB,0x6E,0xAC,0x96,0x35,0xB1,0x45,0xC3,0x72,0xC7,0xBC,0xB6,0x75,0xF1,0x47,0x81, + + 0xA7,0x82,0xA5,0x87,0xB4,0xB2,0x53,0xD7,0x87,0xD6,0xB5,0xA7,0xF4,0xF2,0x17,0x0D, + + 0x52,0xD2,0xAD,0x97,0xB5,0xB3,0xAD,0x31,0xE4,0xAB,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0xB6,0x08, + + 0x0E,0xF8,0xA6,0x8E,0x3C,0xB8,0x6C,0xAF,0xCF,0xDE,0xB6,0xAE,0x7C,0xF8,0x51,0x18, + + 0x0F,0xF9,0xAE,0x9E,0x3D,0xB9,0xAE,0x38,0xB0,0x56,0xBE,0xBE,0x7D,0xF9,0x1D,0x69, + + 0x8E,0x65,0xA7,0x8F,0xBC,0xBA,0x3F,0xE7,0x0D,0xD5,0xB7,0xAF,0xFC,0xFA,0x75,0x9A, + + 0x0E,0xDA,0xAF,0x9F,0xBD,0xBB,0x05,0x59,0x71,0x71,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x83,0x1F,0xA8,0x21, + + 0x85,0xC1,0x2C,0xA1,0xC5,0x43,0x3B,0xC6,0xE5,0xFF,0xCB,0x24,0x6F,0x40,0x32,0xF8, + + 0xEC,0x4E,0x6B,0xF3,0xE4,0x13,0x55,0xB2,0xDC,0x25,0xCA,0x36,0xE6,0x23,0xA9,0x30, + + 0x05,0x83,0x2A,0xCF,0x2B,0x19,0x48,0x8F,0xC6,0x21,0x83,0xA2,0x6B,0xFF,0x08,0xF7, + + 0xB2,0xAC,0x75,0xFD,0xC0,0x6E,0x21,0xD9,0x90,0x01,0x9D,0xAF,0x22,0xE9,0x80,0xE4, + + 0xAB,0x02,0x3B,0xA6,0xBE,0x29,0x30,0x24,0x55,0x4B,0xD6,0xE0,0x74,0x0B,0x74,0xD2, + + 0x0A,0x41,0x82,0xAF,0xB0,0x23,0x87,0x92,0xEF,0xCE,0x08,0x93,0xD1,0x2D,0x4D,0xBA, + + 0x84,0x45,0x8B,0xAA,0x31,0x2B,0x31,0x25,0xE3,0xCD,0xB1,0x21,0xCA,0x24,0x71,0x01, + + 0x87,0x08,0x41,0x65,0x72,0x28,0xA6,0x93,0x41,0x44,0xDE,0xF1,0xF5,0x08,0xFA,0xE0, + + 0xC2,0xC3,0x79,0x04,0xBD,0xD7,0xC6,0xE1,0xCA,0x74,0x14,0x4C,0x1C,0xF5,0x53,0x8F, + + 0xEE,0x12,0x6D,0x62,0x78,0x2D,0x3A,0x1E,0xE8,0x40,0x0F,0xCC,0xC9,0x98,0x83,0x01, + + 0xEF,0x10,0x6F,0xE5,0x38,0x67,0x49,0x4B,0x3B,0x4C,0xE9,0x4D,0xDC,0x24,0xEC,0x2F, + + 0xEC,0xA6,0xF5,0xFF,0x8B,0x66,0xDB,0xBD,0xEF,0xD4,0xE5,0x3B,0x38,0xE8,0x78,0xCC, + + 0x24,0x84,0x76,0xAE,0x98,0x24,0xE7,0x0A,0x09,0xBB,0x0D,0x1C,0x5C,0x06,0xC2,0x34, + + 0x68,0x2D,0x42,0x30,0xFA,0x22,0x62,0x28,0x4F,0x42,0xE2,0x83,0x9A,0x0F,0x09,0xB2, + + 0x29,0x08,0x77,0x5D,0x39,0x28,0x2B,0xEB,0xCF,0x24,0x45,0xEF,0xDF,0x8C,0x33,0xDB, + + 0x8A,0x6D,0xAB,0x1C,0x1F,0x22,0x63,0x29,0xC3,0x40,0x1F,0xAD,0xD7,0x6C,0x05,0xFF, + + 0x87,0x51,0xDC,0x94,0xCD,0xB8,0x69,0x49,0xDE,0x3F,0xAC,0x5B,0x85,0x13,0xD1,0x8D, + + 0xC0,0xAE,0x34,0xC6,0x72,0xC1,0xED,0xD6,0x9E,0x41,0xE2,0xAC,0x84,0xF2,0xDE,0xDF, + + 0xDF,0xCE,0x9D,0x63,0x83,0x8E,0xAE,0x28,0x4F,0x49,0x6E,0xDA,0x90,0x70,0xCD,0x41, + + 0x1B,0x9E,0xD4,0x43,0x16,0x35,0xA5,0x59,0x3F,0xAF,0x68,0x46,0xED,0x32,0x4E,0xD0, + + 0x81,0x12,0x94,0x6D,0x91,0x32,0x2C,0x62,0x40,0x21,0xB4,0xA0,0x6A,0x36,0x34,0x52, + + 0x22,0x78,0x9C,0xD9,0x90,0x33,0x3C,0xB4,0x42,0xDE,0x18,0x54,0xD2,0xB5,0xCD,0xF1, + + 0xC1,0x36,0x95,0x5C,0x11,0x30,0x6D,0x31,0x1C,0x59,0x05,0x8B,0x0F,0x1A,0x35,0x53, + + 0xA2,0x72,0x9D,0xE0,0x10,0x31,0x55,0x13,0x4F,0xDC,0xBD,0xB1,0xAB,0x35,0x66,0xC3, + + 0x6E,0x17,0xA6,0x02,0x99,0xB4,0xEE,0xA0,0x95,0x17,0xF6,0xE8,0xB4,0xF5,0x6E,0xD7, + + 0xF9,0x16,0x23,0x8E,0x9A,0x3F,0x24,0x5E,0x79,0xA4,0xA6,0x6C,0x82,0x76,0xAF,0xB1, + + 0x2D,0x6B,0xCD,0x90,0xF8,0x3C,0x28,0x56,0xDB,0xEC,0xEF,0x2F,0xF1,0xA7,0x6F,0x9B, + + 0xF2,0x16,0xAF,0x13,0x18,0xB1,0xE7,0x3B,0x69,0xDE,0xFF,0xFC,0x5E,0x76,0x7C,0x2A, + + 0xA8,0x14,0xCA,0xA2,0x9B,0xB6,0xD2,0x0A,0xE8,0x14,0x06,0x82,0x5E,0xD1,0xBE,0xBA, + + 0x68,0xED,0xF3,0x58,0x1D,0x10,0xD6,0x2C,0xC8,0x5B,0x96,0xF9,0x9A,0x79,0xB3,0x2B, + + 0x28,0x16,0xB8,0x2F,0x38,0x16,0x9E,0x9B,0x49,0x58,0x4A,0xAA,0x38,0xDE,0x45,0xF9, + + 0x08,0x19,0xAF,0x99,0xBF,0x32,0xD7,0xFB,0x4A,0xD5,0x5D,0x8E,0xC6,0xFE,0xBA,0x45, + + 0xC6,0xC3,0xBA,0x04,0xDE,0xAF,0x10,0x33,0xC9,0xA3,0x1D,0xD5,0xD8,0x7D,0xE8,0xD6, + + 0x98,0x0C,0xA9,0x69,0xB2,0xA7,0x45,0xDB,0x1C,0xAE,0x52,0x16,0x69,0x41,0x69,0x07, + + 0xE3,0xC1,0xA9,0x16,0x61,0xED,0x9A,0x86,0x11,0xDC,0xC9,0x3A,0x2A,0x62,0x49,0x58, + + 0x77,0x8C,0x89,0x80,0x34,0x29,0x82,0xBA,0x6A,0xC5,0x83,0xB5,0x48,0xA7,0x58,0x12, + + 0x02,0x8B,0xEA,0x42,0xB5,0x2F,0x10,0x26,0x7F,0x4F,0xC8,0x72,0xD4,0xAC,0x08,0x12, + + 0x01,0x88,0xA2,0xAD,0x11,0xC6,0x63,0x90,0xC5,0x8D,0x47,0x24,0x59,0x87,0x59,0x13, + + 0xC6,0x89,0xE5,0xC3,0xB8,0x2E,0x75,0x81,0x44,0x8E,0xF5,0xE3,0xF0,0xBB,0x63,0x52, + + 0x24,0xE2,0xF1,0x07,0x96,0xA8,0xEC,0x91,0xE3,0xC1,0x3D,0xA7,0xDF,0xE4,0x1C,0x6F, + + 0x6C,0x57,0x25,0x8C,0x81,0xEC,0x12,0x09,0xED,0xC1,0xCA,0xBF,0x79,0x1D,0x52,0x28, + + 0xF2,0x92,0x92,0xF6,0xC4,0xE6,0x1A,0x2B,0xC0,0xAA,0x26,0xC6,0x5D,0xAB,0xDC,0x78, + + 0xA9,0x7E,0xDB,0x8D,0x1C,0x3C,0xF3,0xAF,0xEA,0x55,0x2B,0xD3,0xDC,0x5F,0xD7,0x68, + + 0x2E,0xC4,0x13,0xE0,0xDE,0xA4,0x90,0x9E,0x18,0xD5,0xBF,0x8C,0x20,0x4A,0x5A,0x1A, + + 0x2E,0x83,0xDA,0x9E,0xA1,0xA3,0xFA,0x12,0xAF,0xC3,0xCA,0x7A,0xDC,0xA4,0x0A,0x1A, + + 0x09,0x80,0xEE,0xBC,0x9D,0xAE,0xAA,0xA1,0xCD,0x85,0x9A,0x3A,0x19,0xE0,0x5B,0x1B, + + 0x8F,0x81,0x83,0x0B,0x52,0x25,0x13,0x2F,0xF7,0x8C,0xF5,0xEB,0xF8,0xB3,0x61,0x5F, + + 0x2C,0x82,0xED,0x2D,0x3C,0xA9,0x5F,0x19,0x8C,0x70,0x04,0xDF,0x7E,0x2F,0x0E,0x52, + + 0x78,0x96,0x23,0x96,0xB6,0xCC,0x0C,0xC2,0x62,0x92,0xFE,0x5D,0xD7,0xF6,0x0C,0xCE, + + 0x84,0xF3,0x49,0xF4,0xF4,0x3B,0x90,0x17,0xB0,0xB2,0xC3,0x54,0xF7,0xD9,0x88,0x98, + + 0x07,0x94,0x83,0x65,0x36,0xB6,0xE5,0x59,0x64,0x72,0xB9,0x51,0x55,0x78,0xCD,0xAA, + + 0x85,0x22,0x2A,0x87,0x37,0xCF,0x96,0x79,0x5E,0xE8,0x46,0xD5,0xB6,0x4C,0x6C,0x60, + + 0xD7,0x9B,0xAE,0x3D,0x95,0xB2,0xAB,0x00,0xCA,0xD9,0x09,0xA1,0x78,0x0B,0x64,0x47, + + 0xDA,0x9A,0x93,0x34,0xB5,0xFD,0x74,0x76,0xC6,0x5F,0x43,0xC7,0xD6,0x74,0xD1,0xB8, + + 0x05,0x90,0x6D,0xD3,0x17,0x3C,0x3F,0x1D,0x45,0xD0,0x65,0x63,0xDB,0x98,0x0D,0x97, + + 0x2F,0x9A,0x6C,0xB5,0xF4,0x08,0x80,0x11,0x46,0x5D,0xFE,0x04,0x73,0x7A,0xA6,0xAB, + + 0xF1,0x9E,0x04,0x6C,0xBE,0xBC,0x06,0x4D,0x99,0xEA,0xCE,0x2C,0x75,0x45,0x83,0x9D, + + 0x8E,0x9F,0xAC,0x1C,0xA0,0x5D,0x06,0xDA,0x6B,0x9B,0xB2,0x5D,0x7B,0xBA,0x07,0x01, + + 0x0D,0x9C,0x42,0xED,0xFF,0x4A,0xCB,0x29,0x6C,0xBF,0x77,0x0B,0x53,0xFC,0x0F,0x10, + + 0x0C,0x80,0xD7,0xED,0x42,0x46,0xEF,0x41,0x6D,0x7B,0x83,0x3D,0xF4,0x54,0x6C,0xCB, + + 0x8D,0x9A,0x9E,0x4C,0x3B,0x6C,0x09,0x08,0xC2,0xD1,0xA4,0xBF,0x95,0x98,0x4E,0x38, + + 0xAD,0xD5,0x8E,0x9A,0x37,0xFF,0x34,0x25,0xCC,0xDB,0xFA,0x79,0x80,0x70,0xEF,0xC9, + + 0x0F,0x16,0xDF,0x1F,0x45,0xB1,0x3D,0x54,0x4D,0xD3,0xCD,0x68,0x09,0x75,0xA5,0x2B, + + 0xA3,0x90,0x3F,0x38,0x3D,0xF7,0x77,0x7F,0x4E,0x55,0x80,0x84,0x72,0x59,0x9D,0xC0, + + 0x4E,0x42,0xE0,0xA4,0xA4,0x2D,0x83,0x3A,0x38,0xE0,0xE8,0xA6,0x55,0x9B,0x1F,0x94, + + 0x2F,0x58,0xF0,0x96,0x33,0x83,0x66,0x94,0xAA,0x22,0x43,0x24,0xF2,0x67,0xD5,0x58, + + 0xE3,0x03,0xCB,0xE7,0xD1,0xC2,0x45,0x23,0x51,0xCF,0xAB,0xC7,0x52,0x2A,0xC9,0xB4, + + 0xD8,0xAE,0xD3,0x14,0x32,0x25,0xC2,0x62,0xBE,0x94,0x11,0x37,0x70,0xE9,0x1A,0x2E, + + 0x7A,0xAB,0x56,0x48,0x14,0xCD,0x2F,0x9D,0x4A,0x06,0xC8,0x71,0xD0,0x4C,0x36,0x57, + + 0xA2,0x7A,0xCE,0x7C,0xEE,0xA9,0x99,0x12,0xA1,0x76,0xA0,0xCB,0xAC,0x05,0xE1,0x33, + + 0xE0,0xAA,0x25,0x65,0x33,0x66,0x59,0xBD,0x40,0x33,0xAE,0x07,0x93,0x26,0xE5,0x2B, + + 0x1D,0x98,0x0D,0x85,0xDF,0x26,0x19,0x56,0x62,0xC0,0x06,0x8A,0xF7,0xBA,0x9F,0x31, + + 0x68,0x09,0xD2,0x89,0x7B,0xC8,0xCF,0x10,0x33,0xB7,0x7D,0xCE,0xDA,0x8B,0x2A,0x7F, + + 0x2D,0x84,0xD0,0x19,0xBA,0x2F,0x1D,0x88,0xA8,0xE6,0xE2,0x5E,0x18,0x49,0xC3,0xAC, + + 0xBD,0xBA,0xFB,0x8F,0xBA,0xBA,0xD3,0xF9,0x72,0x49,0x47,0x4F,0x9B,0x15,0x75,0x64, + + 0xAB,0xBB,0x03,0xC0,0x38,0xA3,0x4F,0xD1,0xDB,0x06,0xE3,0x5F,0x98,0x2B,0x18,0x27, + + 0x72,0xA3,0xFA,0x48,0x52,0x1D,0x06,0x65,0xE6,0x41,0x45,0x93,0x7E,0x97,0x34,0x5F, + + 0xFA,0x02,0xC6,0xB7,0x1D,0x6E,0x62,0x08,0x1A,0x44,0xBA,0x38,0x15,0x60,0xE3,0x3B, + + 0xE8,0xA2,0xAD,0x78,0x27,0x28,0x21,0xD8,0x8E,0x2B,0xC9,0xE9,0xD5,0x8F,0x4C,0xA9, + + 0x87,0xFE,0x72,0xDF,0x92,0x90,0xDB,0x7B,0x3C,0x0E,0x24,0x2F,0x98,0x9F,0xA0,0x04, + + 0x60,0x26,0x44,0x20,0xEB,0x36,0x87,0x53,0xE4,0xDD,0xEC,0xD6,0x8F,0x32,0x2B,0xAC, + + 0xF1,0xA0,0xEC,0xD0,0x26,0x3E,0xA3,0x52,0x29,0x72,0x1C,0x70,0xEF,0xAA,0xA2,0x21, + + 0x74,0xE3,0x0D,0x51,0x51,0x3D,0x47,0xF2,0x0B,0x36,0x59,0xD6,0x11,0x8D,0x37,0x62, + + 0x8B,0xBE,0xED,0xD1,0xDE,0xB8,0x3D,0xEE,0x00,0xFC,0xBD,0x48,0x75,0x75,0x44,0x38, + + 0xA1,0x99,0x3F,0x26,0xB0,0x1C,0xB9,0x67,0x95,0xDF,0x6B,0x84,0x34,0x75,0x15,0xC3, + + 0x44,0x0D,0xB4,0x29,0xCC,0x98,0x66,0x40,0xE3,0xFA,0x98,0x87,0x1F,0x19,0xBA,0x45, + + 0xAA,0x85,0xBA,0xA7,0xF1,0xE9,0x55,0xDC,0x09,0x12,0xD0,0xC0,0xF4,0xDC,0x2D,0xFE, + + 0xA1,0x1A,0xDC,0x05,0x00,0x3E,0xF9,0x8F,0x40,0xAA,0xBF,0xF1,0xF0,0xF7,0x52,0xCF, + + 0xE2,0x61,0x13,0x6E,0xBA,0x31,0x42,0x40,0x7A,0x15,0x3C,0x85,0x1B,0x7C,0x44,0x99, + + 0xD6,0xE4,0x84,0x94,0x9A,0x34,0xF9,0x78,0x3D,0x1B,0xA0,0xC4,0xDA,0xC2,0x4F,0x28, + + 0x41,0x19,0x10,0xEF,0xFB,0xD6,0xE8,0xDA,0xC2,0x36,0xEF,0x2F,0x31,0x07,0x0D,0x76, + + 0xCA,0xE4,0xC5,0x77,0x1A,0x3D,0xCB,0xA5,0xEF,0x38,0x9B,0xC6,0x74,0xFD,0xB9,0xB8, + + 0x6F,0x17,0xC2,0xD1,0xD3,0x6D,0x0E,0x86,0x4E,0xD1,0xD0,0xD9,0xFA,0x02,0x76,0x26, + + 0xD6,0xC4,0x49,0xC1,0xD2,0x0C,0x20,0xD4,0x80,0x2C,0x67,0x00,0xFB,0x86,0xCE,0x4B, + + 0x16,0x5C,0x8D,0x27,0x9B,0x7E,0x29,0xC1,0x01,0x6F,0x17,0xB5,0x6D,0x7A,0xB0,0x5B, + + 0x17,0x9D,0x85,0x37,0x9A,0xAF,0x3F,0xBD,0xE6,0x52,0x51,0x05,0x47,0xC4,0x23,0x80, + + 0xC9,0x4C,0xA4,0xE4,0x96,0xA3,0xCF,0x51,0x6E,0xAC,0xC8,0xDB,0xE3,0xA2,0x20,0x17, + + 0x6E,0x78,0xD0,0x94,0x37,0x01,0xEC,0x2E,0xC8,0x47,0xAA,0x44,0xF6,0x84,0x19,0x44, + + 0x46,0x20,0x14,0x65,0xD5,0xAA,0xD6,0xE3,0xC1,0x80,0x7D,0x12,0x56,0x01,0x2D,0xB3, + + 0x83,0x69,0x91,0x47,0x85,0xAC,0x7F,0xF3,0x8D,0x81,0xE3,0xC8,0x76,0x86,0x9F,0x30, + + 0x70,0x5B,0x20,0xE2,0xA3,0x0F,0x10,0x61,0x47,0x4F,0x60,0x14,0xBD,0x05,0x14,0x21, + + 0x7E,0x8A,0x0C,0xF6,0xB6,0xE5,0x2C,0x90,0xEB,0x4E,0x07,0x94,0xB6,0xE3,0x41,0xF4, + + 0x04,0x2A,0x77,0x4B,0x90,0x4F,0x24,0x81,0x6A,0x4D,0x91,0x65,0xD7,0x6D,0x30,0xAE, + + 0x62,0x78,0xEF,0x7B,0x6A,0x2B,0x2F,0x91,0x6B,0x4C,0xD9,0x22,0x74,0xA5,0xE2,0x6F, + + 0x83,0x75,0x16,0xFE,0x40,0xA7,0xE6,0x06,0xCC,0x8A,0xE8,0x3B,0xFF,0x8D,0x38,0x8A, + + 0xE6,0xCD,0xE0,0xFC,0xBE,0xAF,0x72,0xBA,0xB9,0xAA,0xEA,0x1A,0xBC,0xE6,0x35,0x69, + + 0xE4,0x87,0xC3,0xAF,0x80,0xA7,0x8C,0x6C,0x0E,0xBB,0xE9,0xD0,0x7F,0xEC,0x11,0xAB, + + 0xC4,0x24,0xFB,0x9E,0xFE,0x19,0x3D,0x9E,0xAE,0x45,0xDB,0x7F,0xCC,0x6B,0xA2,0x17, + + 0x71,0x97,0x26,0x9E,0x52,0xAF,0x79,0x88,0xE2,0x47,0x26,0xF6,0x58,0xCC,0xB3,0x75, + + 0x30,0x8F,0x84,0x6B,0xA2,0xAB,0x5A,0x98,0x30,0x8F,0x4F,0x83,0x5D,0x56,0x64,0x34, + + 0x29,0xCF,0xDB,0x4B,0xD6,0xDF,0xF3,0x89,0x62,0x45,0xA0,0x29,0xC6,0x35,0x35,0xEA, + + 0x87,0x34,0xE7,0xB4,0x3E,0x25,0xBC,0x04,0x4D,0x47,0x8E,0xFB,0x82,0x03,0x32,0x23, + + 0x22,0xF3,0x72,0x23,0x95,0x3A,0xA5,0x51,0xE8,0x2D,0x32,0x66,0x79,0x04,0xB1,0xA2, + + 0xDA,0xD3,0xB4,0xE4,0x96,0xD4,0x05,0x96,0xE7,0xD9,0x84,0x4C,0x16,0xC0,0x7F,0xF0, + + 0x8E,0x33,0x4A,0x65,0x36,0xFA,0x4D,0xB2,0xCE,0xD6,0x15,0xB9,0x78,0x97,0xF9,0x63, + + 0x59,0x90,0xD5,0x15,0xB0,0x69,0xF9,0xD1,0xA6,0x6C,0xAA,0x44,0x71,0x7E,0x5C,0xBF, + + 0x05,0xE7,0xDE,0x38,0xDF,0xC5,0x3E,0x1C,0xC5,0xD2,0xB4,0x0B,0xCC,0xB6,0x93,0xA2, + + 0x2A,0x9E,0x37,0xD3,0xB7,0xD5,0x03,0x10,0xE5,0xFD,0xFC,0xD2,0x71,0x7C,0x05,0xEC, + + 0xAC,0x9B,0xAF,0x2D,0x97,0x56,0x79,0x0D,0x47,0x5C,0x7E,0xDF,0xF0,0xEF,0xBD,0x51, + + 0x1B,0xF5,0x32,0x28,0x93,0x4A,0x00,0x91,0xA6,0x97,0x44,0x0A,0x90,0x2C,0x95,0xB7, + + 0xD4,0x49,0xA4,0x6C,0x90,0xB5,0x4E,0xC8,0x2F,0xA7,0xE4,0xF8,0x97,0x9C,0xEE,0x8A, + + 0x70,0x6D,0x26,0x72,0x5E,0x99,0xC3,0x58,0xEF,0xDA,0x1D,0xB9,0xD1,0x9C,0x14,0xB2, + + 0x9F,0xBA,0xAD,0x8B,0x1F,0xBC,0xF7,0x0E,0xCD,0x50,0x8C,0x4D,0x20,0xBE,0x7F,0x85, + + 0xD1,0x2F,0xD7,0x1D,0xB8,0x80,0x7F,0x4B,0xB1,0xD4,0x87,0x8E,0x5C,0x64,0x5E,0x34, + + 0xD3,0x45,0xFC,0xCA,0x1F,0xDC,0x0E,0x68,0x67,0x03,0x76,0xEA,0x79,0xB8,0x56,0xA7, + + 0x0C,0xFC,0xE2,0x35,0x9E,0x35,0x1E,0xBB,0x94,0xD0,0xFE,0xFE,0x7F,0xFD,0x98,0x49, + + 0x12,0x3C,0x58,0x2F,0xF2,0xB8,0x4F,0x3B,0x15,0xD1,0xF7,0xEF,0xFE,0xFE,0x36,0xC8, + + 0x5A,0x50,0x6F,0x3D,0x4A,0x30,0x75,0xFF,0x4C,0x74,0xFF,0xFF,0xFF,0xFF,0xA8,0x3D, + + 0xE1,0x06,0x96,0x66,0x78,0x2D,0xF0,0xB9,0x37,0x1C,0x77,0x46,0x13,0x90,0x26,0x7E, + + 0xA2,0x07,0xE8,0x16,0x12,0x2C,0x47,0xCF,0x47,0xCB,0x1F,0xC5,0xF2,0x60,0x2C,0xAF, + + 0x23,0x04,0xE1,0x4B,0x7E,0x2D,0xCE,0xC4,0xFF,0xD1,0x89,0x39,0x71,0xE8,0x24,0xE0, + + 0x22,0xD8,0xC3,0x57,0x50,0x41,0x6C,0xCD,0x58,0xB8,0xAB,0xDC,0xD2,0x0C,0x20,0x42, + + 0xA2,0x09,0x35,0xA6,0x90,0x18,0x68,0xB0,0x1C,0xEB,0xA9,0x16,0x69,0x80,0x36,0x68, + + 0x63,0x85,0x31,0xB6,0xBF,0x2A,0x98,0x57,0xE2,0xCF,0x9D,0x93,0xD1,0x61,0xBE,0x13, + + 0xC1,0xF6,0x0D,0xA7,0x10,0x3A,0x09,0x03,0xEC,0x00,0x2D,0x0F,0xBA,0x6B,0xB4,0x23, + + 0xAD,0x58,0xA9,0x57,0xE6,0x2A,0x9E,0x82,0xE8,0x4A,0xD4,0x17,0x24,0x61,0xAB,0xF5, + + 0x91,0x73,0x46,0xDC,0x14,0x33,0xEB,0xC5,0x3A,0xF3,0xAC,0xCE,0x42,0x07,0x40,0xB3, + + 0xE8,0xA6,0x92,0x00,0x5B,0x20,0xC1,0x76,0x36,0x5E,0x9B,0xCC,0xD8,0x26,0xCA,0xF0, + + 0x77,0x48,0x71,0xEB,0x3D,0xA8,0xEC,0xAD,0x8B,0x7D,0xCA,0x64,0x39,0x25,0x95,0x5F, + + 0xDB,0x45,0x4B,0x2D,0x9D,0x20,0xC6,0x24,0x28,0xF4,0xFB,0x3F,0x07,0x66,0xED,0x27, + + 0xD7,0xD3,0xD2,0x3B,0x78,0x37,0xE2,0x1B,0xCC,0xFC,0xF2,0x24,0xFB,0xD3,0xE6,0xDD, + + 0xDE,0x6F,0xA8,0x44,0x18,0x5C,0x24,0x1D,0x78,0x95,0xE5,0x74,0xFC,0x6B,0x83,0xEC, + + 0xFD,0xD2,0x82,0x2B,0x65,0x40,0xE7,0x0B,0x89,0xBE,0x68,0x85,0xA4,0x21,0x22,0xB2, + + 0x09,0x53,0x74,0x1A,0x51,0x46,0x01,0x7B,0x6C,0xE2,0xFB,0x30,0x7A,0xB0,0x5D,0x1C, + + 0x43,0x70,0xBC,0x54,0x6C,0x36,0x76,0xB4,0x61,0x30,0xDC,0xAD,0x8D,0xF1,0x86,0x68, + + 0xA1,0xAA,0xD4,0x91,0x52,0xB1,0x0F,0xA0,0x9E,0xDD,0x4F,0x3C,0xD6,0x6A,0xFD,0x7D, + + 0x28,0xE9,0x28,0x79,0x13,0x3F,0x4B,0x99,0xA4,0xFF,0xD5,0xAD,0x57,0xFF,0x04,0x7C, + + 0xE1,0x51,0xF5,0x17,0x31,0x19,0x57,0x53,0xD2,0x2B,0x12,0xD3,0x06,0x63,0x62,0xB3, + + 0x52,0x95,0xDD,0x46,0xBA,0x74,0xD3,0xF3,0x49,0x2D,0xB4,0xB2,0x54,0x7B,0xB7,0x38, + + 0x3A,0x58,0xEC,0xA8,0x92,0x56,0x00,0xB0,0x3F,0xF1,0xBC,0xA2,0xB7,0x7A,0x47,0x3E, + + 0x43,0x75,0x05,0xD5,0x67,0x30,0x6B,0x01,0x6D,0xF0,0xB5,0xE7,0xDB,0x7B,0x36,0xD9, + + 0x06,0xA8,0x2D,0xD5,0x5A,0x7E,0x05,0x9C,0x63,0x07,0x75,0xCA,0x76,0x15,0x8D,0xB0, + + 0x5F,0x3C,0xBE,0x64,0x4F,0x77,0xEE,0x2A,0xE8,0xA0,0x2E,0x53,0xF5,0x63,0x34,0x63, + + 0x2F,0x93,0x01,0x74,0xE5,0xF2,0x1C,0x50,0x83,0x16,0x26,0x22,0x7A,0xD9,0xD8,0xD1, + + 0x97,0x91,0xBD,0x72,0xBE,0xBB,0x2F,0xFB,0xAB,0xAA,0x1E,0xCB,0x26,0x68,0x7A,0x1D, + + 0xCC,0x08,0x8F,0x95,0xDE,0x33,0xA7,0x47,0x88,0x7B,0x24,0x5B,0xE9,0x86,0x86,0x6D, + + 0x5D,0xC0,0xE0,0xA9,0x99,0xB9,0x68,0x85,0xE5,0xDA,0x16,0xA9,0x3A,0xF1,0x27,0x33, + + 0xD4,0x1B,0xD0,0x8D,0x5A,0x34,0xC3,0xF5,0x82,0x56,0x26,0x0F,0x4A,0x7B,0xEB,0x4C, + + 0x7F,0x7C,0xE1,0x2F,0xDB,0x91,0xD2,0xA9,0xE6,0xF5,0xA9,0x91,0xC9,0xBE,0x62,0x30, + + 0x5E,0x10,0x4A,0x1A,0x52,0x96,0xF3,0x6A,0xC0,0x57,0xFF,0x29,0x5A,0xF5,0xA3,0xC4, + + 0x1C,0x9B,0xE6,0xEE,0xF2,0x2B,0xF0,0xF2,0xFE,0x1B,0x9A,0xF6,0x08,0xE9,0xD0,0x1A, + + 0xA2,0x2E,0xF1,0xA0,0x76,0xFB,0xBF,0x40,0xBE,0x83,0xAE,0x54,0x6E,0xB9,0x54,0xE5, + + 0xB7,0x65,0x7A,0xE1,0x14,0x00,0x9A,0xDE,0xE1,0xB9,0xB2,0x45,0x97,0xED,0x64,0xFB, + + 0x47,0x4C,0x51,0x15,0xC1,0xB8,0x73,0x98,0x47,0xC7,0x45,0x45,0xFB,0xD1,0x94,0xC6, + + 0x28,0x20,0xA8,0x77,0xB7,0x2C,0x28,0x53,0x6D,0x6B,0x90,0x64,0x43,0xE9,0x69,0x34, + + 0xFC,0x79,0x37,0x03,0x6C,0xB2,0x68,0x6B,0x57,0x6A,0x00,0x0D,0x47,0xAA,0x38,0x1E, + + 0x23,0x19,0xC1,0xA5,0xE1,0xA2,0xE9,0x8B,0xD4,0x89,0x8E,0x19,0xE5,0xAE,0xD4,0x0C, + + 0x52,0xDA,0x29,0x0A,0x5A,0x5A,0x21,0x01,0x2C,0xEC,0x99,0x75,0x80,0xEA,0x5C,0xD2, + + 0x89,0x4A,0x50,0xFE,0x7A,0xE7,0xBD,0x48,0x0F,0x38,0x4E,0xC6,0x80,0x25,0x6E,0x5C, + + 0x41,0xC5,0x5C,0x7C,0x2E,0x6E,0x64,0x02,0x45,0xCD,0x56,0xD6,0x5E,0xA4,0x7A,0xB1, + + 0x2B,0xC6,0x83,0x1A,0x1E,0xF6,0x4D,0x13,0xEF,0x6A,0x48,0x27,0x39,0x15,0xAF,0xF3, + + 0x85,0xC4,0x53,0x9D,0x1D,0x11,0xBA,0x48,0xBD,0xA5,0x5C,0xB7,0x78,0x3D,0xC9,0xCE, + + 0x20,0x57,0x98,0x5E,0x9C,0xA8,0x2B,0x36,0xE9,0xCA,0x92,0x38,0x7C,0xE3,0xAE,0x90, + + 0xB4,0x8B,0xB1,0x5E,0x60,0xB5,0xBE,0xFF,0x0C,0x3F,0x9A,0x28,0x75,0xE2,0xC8,0x0C, + + 0x80,0x52,0x1C,0xAD,0xE5,0x34,0x53,0x17,0x6F,0x31,0x93,0x6D,0x81,0xE3,0x46,0xD5, + + 0x89,0xEC,0x30,0x5D,0x99,0xE5,0x05,0x16,0xEF,0x8D,0x9B,0x7D,0xFE,0xE2,0xE4,0x46, + + 0x71,0x96,0xC4,0x84,0xE2,0xBD,0x2C,0x32,0x8D,0x41,0x4C,0x4E,0xA8,0x3D,0xE8,0x42, + + 0x5B,0xF3,0x94,0x46,0x69,0x1A,0xE8,0x48,0x90,0xBF,0xDC,0xFD,0x1A,0x6C,0x05,0xDA, + + 0x05,0xF0,0xEF,0x9A,0x95,0x62,0x27,0xA2,0x1F,0x5F,0xCE,0xAF,0x11,0x4D,0xCD,0x02, + + 0x27,0x97,0xD5,0xB7,0x55,0x88,0x5A,0xC9,0x84,0xD7,0xC5,0x90,0x0C,0xFC,0xD0,0xBD, + + 0x85,0x4F,0x86,0xBC,0xDF,0x3D,0x72,0xF1,0x45,0x45,0x73,0xD6,0x3E,0xF2,0x4C,0x2B, + + 0xEC,0xEE,0x8C,0xD5,0x37,0xB8,0x6F,0x81,0x17,0x74,0x03,0x74,0xBE,0x6C,0xCB,0x3E, + + 0x63,0x0D,0x87,0xD7,0xB7,0xE6,0x55,0xE6,0x2E,0xFD,0xDB,0x1C,0x55,0xFB,0xFC,0x57, + + 0xF2,0x06,0xF5,0xD3,0xBF,0x1F,0xE0,0x63,0x0C,0x46,0x85,0x85,0xC4,0xD5,0x2D,0xE8, + + 0x6F,0x68,0xC6,0x79,0xD5,0xB7,0x4F,0x5A,0xEC,0xCE,0xEF,0xF3,0xFE,0xA4,0x0E,0xC6, + + 0x8C,0xFB,0x94,0x78,0x2D,0x32,0x81,0x5C,0xEF,0xDD,0xE7,0xF7,0xFF,0xA5,0x7E,0x2C, + + 0x0B,0x9C,0xE2,0x78,0x8F,0x42,0x3F,0xBB,0xDF,0x7D,0x19,0x2B,0xD2,0x7A,0xEB,0x4B, + + 0xD3,0xF9,0xF7,0x79,0x3F,0xBF,0x77,0xD9,0xAE,0x2B,0xC9,0x3B,0xD3,0x7B,0xBD,0x94, + + 0x51,0xBD,0xC6,0x38,0xD7,0xD5,0x50,0x87,0xCD,0x58,0x0E,0x91,0x15,0xF3,0xB3,0x46, + + 0x29,0x45,0x12,0xB4,0x57,0xB0,0x66,0xAA,0x69,0xD4,0x86,0x7A,0x74,0x22,0x3C,0xC9, + + 0xD5,0x79,0x9E,0xBD,0x85,0x1A,0x2E,0xFB,0x49,0x9C,0x20,0xDD,0x01,0x2B,0x7C,0x59, + + 0x2F,0xD6,0xAA,0x38,0x56,0xF6,0x7F,0x89,0x6D,0xE3,0x9F,0xBF,0x11,0x74,0x04,0xE2, + + 0x82,0x08,0xF8,0x86,0x90,0xFB,0xA4,0x42,0xAB,0x31,0xB3,0xD2,0x63,0x46,0xB9,0x92, + + 0x23,0x61,0x0F,0xFC,0x17,0x6E,0xC3,0x30,0x47,0x0B,0x59,0xB6,0xD1,0xAA,0xF4,0x73, + + 0x23,0x4E,0xB9,0xFA,0x51,0xA8,0xB9,0x3C,0xBF,0xCB,0x6B,0x63,0x9E,0x2E,0x71,0x93, + + 0x01,0xB8,0x31,0x52,0x53,0x83,0xB9,0xD9,0x95,0xEE,0xA1,0xDD,0x05,0xAC,0x48,0x50, + + 0xEB,0xBD,0x9F,0xB4,0x1E,0x6B,0xD1,0x47,0xE3,0x4D,0x00,0xE0,0x5D,0x85,0x66,0xAE, + + 0xA0,0x1E,0xB0,0xD0,0x22,0x25,0x02,0x71,0xE0,0x04,0x50,0xE1,0xF2,0x9A,0x03,0xB7, + + 0x63,0x00,0xFB,0xC7,0x12,0xF7,0xD3,0xE3,0x5B,0x3D,0x11,0xB4,0xD8,0x60,0x0B,0xB7, + + 0x93,0x48,0x59,0x27,0x11,0x03,0x39,0x73,0xB6,0x4A,0x75,0xF0,0xF3,0x6A,0x3A,0xAD, + + 0x8E,0x78,0xCA,0x09,0x7B,0x88,0x03,0xCE,0x58,0xE5,0x28,0x6B,0x9A,0x78,0x2A,0x25, + + 0xA8,0x86,0xB2,0xCC,0x45,0x88,0xA8,0x14,0x7A,0x0D,0xFA,0x3E,0x36,0x64,0x53,0x04, + + 0x9D,0x0C,0x7B,0x8F,0x18,0xF1,0x06,0xCF,0xFB,0x6E,0xDB,0x29,0xBF,0x6B,0xF4,0x9B, + + 0x09,0xDA,0xB3,0x2C,0x38,0x30,0xA9,0x14,0xCF,0xA3,0xFB,0x73,0xFE,0x64,0x1B,0xDC, + + 0xAD,0x1C,0xC2,0xAE,0x98,0x08,0x42,0x1F,0x15,0x0E,0xEA,0xEE,0x53,0xD1,0x32,0xA4, + + 0x9A,0xF6,0x0A,0x28,0xBB,0x6F,0x09,0x81,0xF1,0xB6,0x1A,0x08,0xD4,0x90,0xBB,0xCB, + + 0x43,0x99,0x4A,0xBD,0x65,0x21,0x87,0xF1,0xCC,0x6E,0xEB,0xBD,0x21,0x61,0xC8,0xB1, + + 0xD5,0x42,0x53,0x62,0x1E,0xDA,0x1B,0x85,0x77,0x0D,0xA1,0x1D,0x60,0x69,0x1F,0xA7, + + 0x81,0xBF,0x44,0x0D,0xE6,0x72,0x88,0x9F,0x5D,0x12,0x6E,0x4C,0xE0,0xBB,0x6A,0xE8, + + 0x20,0x73,0x21,0x16,0xF8,0x3E,0x1B,0xA5,0x8A,0x89,0xE2,0x61,0xF3,0x75,0x1A,0xF2, + + 0x94,0x7E,0x12,0x76,0xB6,0x9B,0x5F,0x4A,0x01,0x53,0xB0,0xD7,0x1B,0x68,0x33,0xBC, + + 0x6B,0x8A,0xB5,0xD2,0x7B,0xAA,0xA8,0xD4,0x1A,0x57,0x8E,0xD7,0x0E,0xFC,0xFC,0x87, + + 0x2C,0xBB,0xF5,0x46,0x33,0x7B,0x14,0xDD,0x89,0x10,0xD6,0x22,0x2E,0x70,0x44,0xC4, + + 0x40,0x2A,0x7F,0x12,0x8F,0x7B,0xF8,0x92,0x94,0xDE,0xDC,0x09,0x62,0xAE,0xD4,0x86, + + 0x60,0xF6,0x9F,0xC4,0x11,0x7A,0x6F,0x51,0x5E,0xF9,0xC3,0x1C,0xA1,0xED,0x5B,0xFD, + + 0x48,0x46,0xFE,0x57,0xBA,0xD7,0xD3,0xCC,0x08,0x13,0xFD,0x71,0xF4,0x6E,0x0E,0x91, + + 0xC1,0x49,0xDF,0x15,0x9F,0x3E,0x94,0x5B,0x3D,0x2D,0x6D,0x8B,0xD9,0xA1,0x8C,0xEB, + + 0x15,0xBF,0xF6,0xBB,0xD0,0x08,0x83,0x3C,0x22,0xF9,0xBF,0xBD,0x9E,0x7F,0xEB,0x1A, + + 0xD1,0x10,0xA7,0x2D,0x51,0x2B,0x8B,0x92,0xD5,0xAF,0xCF,0x3C,0x05,0xFD,0x10,0xD9, + + 0xAD,0x57,0xF7,0xBA,0x50,0x6A,0xDF,0x04,0x4A,0x58,0xBF,0x85,0x58,0xFC,0x86,0x6D, + + 0x44,0x9E,0x9C,0xD8,0x99,0x3A,0x6C,0x58,0xEA,0xF3,0xB6,0xEF,0x3E,0x3E,0x16,0xCC, + + 0xA9,0xB1,0xC2,0xCD,0x58,0xCD,0x5C,0xE5,0x95,0x4A,0x5E,0x78,0x3B,0x59,0x3F,0x4D, + + 0x84,0xFD,0xCB,0xD9,0x19,0x38,0xF3,0x8B,0x9F,0x55,0xD5,0xB3,0x78,0x5A,0x3C,0xBB, + + 0xEB,0x10,0xB7,0x5F,0xB2,0xBF,0xE7,0x46,0x59,0x2D,0xBF,0xFE,0xBF,0x3D,0x18,0x7F, + + 0x27,0x30,0x67,0xE0,0x96,0xA4,0x3C,0xA6,0x25,0xB2,0x88,0x61,0x96,0xB0,0x78,0x93, + + 0x41,0x8C,0x5D,0xF4,0xB4,0xCD,0xA4,0x41,0xE1,0x83,0xC0,0xCA,0xC4,0x1A,0x19,0x86, + + 0x02,0xA0,0x81,0x65,0x16,0x0E,0xF1,0x6A,0x3A,0x80,0xF9,0x22,0xB7,0x6B,0x85,0x96, + + 0x8B,0xC5,0xCB,0x1B,0x96,0xC3,0x03,0x96,0x3A,0xD8,0xC2,0x18,0xF0,0x6E,0x1F,0xAF, + + 0xC0,0xC6,0x80,0x07,0xBB,0xA9,0xFF,0x35,0xBB,0xCF,0xD4,0x2A,0xAB,0xEB,0xB7,0xB8, + + 0x38,0x95,0xA0,0x41,0x74,0x25,0x40,0x92,0x0F,0x4E,0xF4,0xCC,0xD1,0xC5,0x2B,0xE8, + + 0xF1,0x6A,0xEB,0x43,0x35,0xA0,0xBB,0xE1,0x46,0x2E,0x31,0x2F,0xA0,0xA4,0x36,0x57, + + 0x81,0x0D,0x91,0xD5,0x94,0x63,0x75,0x91,0x47,0x77,0x51,0x6A,0x55,0xE3,0xA4,0x88, + + 0x8C,0xCB,0xF8,0xF1,0xBF,0x05,0xB9,0x4C,0x11,0x37,0xCD,0xAA,0x1F,0xDF,0x12,0xE9, + + 0x31,0x8F,0xA2,0x1B,0x76,0x10,0xEE,0xEA,0xCC,0x31,0xE3,0x35,0xBA,0x24,0x1B,0xF8, + + 0xB8,0xEF,0xBC,0x48,0x5E,0x55,0x0D,0x56,0x0D,0xA9,0xD3,0x2D,0x1F,0xE7,0x0B,0xF7, + + 0x2C,0x24,0x50,0x9B,0xC4,0xF5,0x31,0x9B,0x72,0x7E,0xC9,0xC0,0xD9,0x66,0x17,0x38, + + 0xE5,0x1D,0x9A,0xCC,0x1B,0xFF,0x12,0x45,0x4C,0xC1,0x69,0x0C,0x7C,0x01,0xF6,0x9A, + + 0x37,0x06,0x92,0xDA,0x72,0xF0,0x42,0x3D,0x91,0xC5,0x74,0x87,0xE5,0xAF,0x5D,0x73, + + 0x03,0x28,0xD9,0xAD,0x32,0x2E,0x8C,0xE9,0x4E,0x26,0xF9,0x93,0x5E,0x15,0x7F,0x6A, + + 0xFF,0x90,0xB5,0xF5,0xCF,0xE1,0xEF,0x09,0x30,0x44,0x74,0x28,0x22,0xE6,0x20,0x00, + + 0xA4,0x89,0xDC,0xA1,0xDD,0xC1,0xB1,0x43,0xE6,0xD4,0x12,0xAF,0x1F,0xEA,0xB2,0xF0, + + 0xDE,0x4C,0x92,0xBA,0x96,0xF3,0xF8,0x62,0x69,0xCA,0xC6,0x91,0xD6,0xEA,0x1D,0x7D, + + 0x26,0x96,0xDD,0xA7,0xEC,0xD2,0x6E,0xC1,0x25,0xB0,0x35,0x57,0x6C,0xFD,0x53,0xBB, + + 0x5C,0x3C,0xA2,0x5A,0x54,0x4C,0xFC,0x55,0x44,0x59,0x99,0xC1,0xC6,0x28,0x62,0xFA, + + 0xA6,0x9A,0x9C,0xC2,0x37,0xB4,0xAF,0xE0,0x19,0x3C,0xF6,0xCD,0xFB,0xB6,0x6D,0xB4, + + 0xA5,0x69,0x2C,0x17,0x9A,0xB3,0x27,0xDD,0x61,0x0D,0x14,0xEB,0x55,0xD5,0x3C,0xDF, + + 0x03,0x69,0x3A,0xC7,0xC1,0x36,0xA8,0x48,0x9D,0xD4,0xF7,0x5B,0xD7,0xB6,0x57,0x8C, + + 0x04,0xF2,0xE5,0x70,0xD4,0x97,0x6E,0x53,0xE7,0x45,0xFE,0xD7,0xAB,0xC7,0x33,0x2A, + + 0x30,0x58,0x66,0x4B,0xD5,0x35,0xE1,0x42,0x4C,0x97,0x4C,0xE9,0xB6,0x61,0xA9,0x82, + + 0xAF,0x9D,0xF2,0x78,0x2D,0xF6,0x0C,0x4B,0xCE,0x79,0x9E,0xA6,0x4E,0x22,0x77,0x8A, + + 0xA0,0x99,0xFE,0x3D,0x1B,0xA1,0x8F,0x5A,0x4F,0xBA,0xFF,0xBF,0x18,0x63,0x31,0xF9, + + 0x46,0xCA,0xF6,0x90,0x5A,0xA0,0x1D,0x39,0x24,0x94,0x05,0xF8,0x37,0x42,0xD9,0x28, + + 0xAB,0x1C,0x9E,0x4C,0x37,0x61,0x56,0xE7,0xEC,0xD8,0x96,0xEC,0x7F,0x77,0x43,0x37, + + 0x8C,0x9B,0x8E,0x9F,0xC6,0xB0,0x24,0xBB,0xCC,0x93,0xFE,0x7A,0x12,0xD8,0x8F,0xF4, + + 0x4F,0x98,0xDF,0x1F,0x45,0xB1,0xF9,0x89,0xCD,0xBE,0x08,0x0D,0xFA,0xE7,0x4F,0x81, + + 0x0E,0x96,0xE5,0xDB,0x1C,0x44,0x3E,0xBD,0xE7,0xC4,0x6F,0xFF,0x80,0x80,0xAD,0x7F, + + 0x9D,0x1B,0x11,0x77,0x24,0x4E,0x72,0xDD,0x42,0x9B,0x50,0xA9,0x4F,0x6A,0xB5,0x21, + + 0xA0,0xA0,0xB6,0x28,0x79,0x2C,0xC3,0x7B,0x3E,0x3F,0x20,0xA7,0x77,0xCC,0xCA,0x85, + + 0xC0,0xA9,0xE7,0xD8,0x93,0xFA,0xA4,0xA5,0x95,0xD3,0xC5,0x62,0xE3,0x7A,0x31,0x21, + + 0xAE,0xAC,0x76,0x66,0xE9,0x61,0x42,0x7A,0xBA,0xD8,0xCD,0xB1,0xCF,0x19,0xD1,0x87, + + 0xC8,0xFE,0xB8,0x63,0xFB,0x27,0x44,0x9F,0x0A,0x75,0x84,0x86,0xFE,0xC9,0x5E,0x6C, + + 0xE8,0x41,0xF6,0x7D,0xB0,0x0C,0xD8,0x11,0x1B,0xC8,0x18,0x94,0x53,0xC5,0x09,0xB9, + + 0xE1,0x99,0xB9,0xC1,0xC0,0x3F,0x45,0xBE,0x3B,0x4D,0x01,0x87,0x2E,0xB6,0x13,0xEE, + + 0xE9,0xB6,0x6C,0x26,0xE5,0x86,0x27,0x49,0x99,0x05,0xC8,0x54,0x29,0x0B,0xA2,0x7A, + + 0x6A,0x54,0x47,0x58,0x1E,0x5A,0xD2,0xD9,0x4E,0xC5,0xDA,0x39,0xB1,0x4B,0xA1,0x09, + + 0x5D,0x48,0x5C,0xBD,0xD1,0x3A,0xA2,0xC7,0xA0,0x58,0x62,0x4F,0x29,0x07,0x7D,0x0E, + + 0x8E,0x8A,0x6D,0x4D,0xDC,0x8E,0x6D,0x01,0xFB,0xCD,0x6B,0x25,0x31,0x29,0x55,0xB4, + + 0x89,0xAF,0x5B,0xED,0xC8,0xDA,0xB7,0xA6,0xC8,0x0B,0xF9,0x34,0xD8,0xDB,0x3C,0x4F, + + 0xAB,0xA3,0xFA,0xB3,0xF3,0x9F,0x11,0x4C,0xEB,0xB3,0xEC,0xB5,0x90,0xBC,0x05,0x2B, + + 0x67,0x82,0x1A,0xC3,0xEE,0x6F,0x58,0x67,0x3B,0xF9,0x62,0x82,0x4B,0x20,0xD5,0x39, + + 0xD6,0x07,0x17,0xB3,0x15,0x83,0xBF,0xFA,0xBA,0x46,0xAD,0x40,0xE9,0x05,0x53,0xF5, + + 0x6A,0xA0,0x0E,0x4B,0x9A,0x8F,0xCD,0x02,0xE8,0x92,0x24,0x3A,0x3A,0x99,0xDD,0xAF, + + 0x5B,0x1B,0xD3,0x77,0x52,0x9D,0x02,0xC2,0x00,0xC7,0xF2,0x7D,0x71,0x30,0xD7,0x3F, + + 0x27,0x69,0x8A,0xAC,0x79,0x60,0x35,0x43,0xED,0x13,0x9E,0xC7,0x41,0x33,0x5E,0x96, + + 0xDF,0x10,0x51,0x3D,0x5B,0x51,0x6B,0xA7,0x01,0xD1,0x89,0xBA,0x9B,0x7D,0x4B,0x6D, + + 0x5F,0xE8,0x8B,0xA9,0x58,0xE2,0x1F,0xB2,0xD2,0x89,0xDE,0x0B,0xF7,0xF3,0x57,0xC2, + + 0xF5,0xB9,0xBF,0xE3,0x93,0x5A,0xAB,0xA7,0xA8,0x57,0x57,0xD4,0x7A,0x36,0x16,0x47, + + 0x5B,0x57,0x44,0xA6,0x00,0x41,0xDC,0x91,0xFF,0xF1,0x85,0xFF,0x96,0x7E,0x56,0xB8, + + 0x81,0x14,0x22,0xBF,0x64,0x3E,0xEE,0x72,0x9E,0x5E,0x96,0x61,0xF3,0xC4,0x0E,0xB1, + + 0x4A,0xF6,0x37,0x51,0xE1,0xE1,0xDE,0xD8,0x1E,0x8F,0x9C,0x77,0x6E,0x8C,0x7D,0xA7, + + 0x41,0x4D,0xDE,0xB3,0x70,0x89,0xD6,0xB8,0xED,0xF5,0xB2,0x44,0x2F,0x3A,0x85,0x5D, + + 0x16,0x2A,0x8A,0xEF,0x3F,0x4B,0x1B,0xCB,0x48,0xF0,0xCA,0x4F,0x5F,0xC6,0x1D,0x70, + + 0x57,0x58,0xA7,0xA2,0xF0,0x0B,0xDC,0xD8,0xB7,0x51,0x95,0xEB,0x19,0xD5,0x51,0xC9, + + 0x83,0xAE,0x50,0xDD,0xBE,0xB6,0x03,0x59,0xE5,0x19,0xB9,0xDD,0xC1,0xD6,0x3E,0x4C, + + 0x78,0x5D,0x6A,0xB3,0xF0,0x6F,0x4E,0xE0,0x6C,0xCE,0xEE,0xFC,0xD9,0x12,0x70,0xE4, + + 0x43,0x10,0xB7,0xA2,0x5A,0x39,0x18,0xE4,0x6D,0x2F,0x87,0x1D,0x18,0x0D,0x1D,0xC8, + + 0x09,0xAE,0xF9,0x64,0xDB,0x3A,0x4E,0x8B,0x01,0x6F,0xB5,0xE8,0xFB,0x3C,0xB0,0xAA, + + 0xD3,0x7C,0xAE,0x1D,0xE7,0x53,0x03,0x7D,0xB9,0xD4,0x27,0xF5,0x98,0x68,0xEA,0xBA, + + 0xED,0x9A,0xDE,0x00,0x77,0xD5,0x24,0x8C,0xA5,0x6F,0xE9,0x94,0xF1,0x66,0x90,0xE1, + + 0x3B,0x91,0xBE,0xBE,0xEA,0x0C,0xEA,0xC1,0x2F,0x6E,0x79,0x33,0x53,0xDA,0x79,0x0A, + + 0xB7,0x0A,0x72,0x83,0x8A,0xB5,0x65,0xD0,0xE2,0x6D,0x31,0xE7,0x90,0xE1,0x91,0xE0, + + 0xF7,0x98,0x7F,0xAB,0x62,0xC0,0x6B,0xC0,0xEB,0x6C,0x87,0x08,0xE5,0xE7,0x73,0x31, + + 0x76,0xE8,0xB9,0x4D,0xF3,0xAF,0x0E,0x5F,0x8E,0x55,0x0F,0x14,0x80,0x3B,0x8E,0x63, + + 0x77,0xC7,0xE0,0x47,0x24,0x91,0x70,0x66,0x8F,0xE6,0xC6,0xCF,0x36,0xE1,0x06,0x83, + + 0xD4,0x0D,0xF3,0xC3,0x88,0x5D,0x21,0xE7,0xD8,0x3D,0x1D,0x18,0x1C,0x35,0x2A,0x33, + + 0x26,0x2E,0x53,0x37,0x81,0xA6,0xEE,0x60,0xE1,0xC4,0x80,0x09,0xB6,0xE3,0x7B,0x6C, + + 0xE7,0x3B,0xC4,0x6C,0xE7,0x37,0x21,0x59,0x7C,0x8A,0x32,0xD3,0x00,0xAA,0x0C,0x6A, + + 0x44,0x2D,0x78,0x6D,0x77,0x7A,0x00,0xD8,0xE1,0xC6,0xBE,0xA8,0xBC,0x46,0x22,0x6D, + + 0x67,0x59,0x9D,0xBB,0xE0,0x05,0x70,0x23,0x27,0xAE,0xBA,0xC7,0x94,0xFB,0x35,0x4F, + + 0xB2,0x13,0xD5,0xAE,0x74,0x28,0x05,0x13,0xA5,0xC6,0xAA,0x4C,0xED,0x87,0xF4,0xAA, + + 0x5E,0x07,0x23,0x87,0xF7,0x3F,0x28,0xFD,0x26,0x2D,0x93,0x2E,0x78,0x41,0x29,0x6B, + + 0xAE,0x0D,0x3F,0xEF,0x65,0x72,0x04,0x4F,0x49,0x5F,0xF2,0x6F,0x6C,0xD9,0xD1,0x7A, + + 0xFE,0xCC,0xF5,0xF3,0x61,0x03,0xB3,0xF3,0xEF,0xC3,0x66,0xA8,0x14,0x3E,0x13,0x59, + + 0xCF,0x2F,0x2B,0xD2,0xB4,0xA2,0x7A,0xFF,0xD1,0xD8,0x41,0x9F,0x8B,0x42,0x3A,0xB8, + + 0x45,0x6B,0x5B,0x78,0xCF,0x2F,0x69,0xD1,0xAC,0xD9,0xA1,0x61,0xBE,0xD9,0x27,0x43, + + 0x23,0xE3,0x99,0x26,0x85,0xD2,0x5A,0xD3,0x66,0x08,0x82,0x9F,0xBD,0x98,0x2E,0x7F, + + 0x18,0xD0,0x10,0x33,0x00,0x11,0x20,0xD0,0xDC,0xBC,0xBD,0xA3,0xFD,0x36,0x54,0xD3, + + 0xE1,0x88,0x41,0x13,0xF5,0xA2,0x03,0x9A,0x2D,0xBA,0xC5,0x85,0x0A,0x26,0x9F,0x32, + + 0x77,0x65,0xDA,0x62,0xFC,0x27,0x7C,0xF2,0xB2,0xF7,0x0C,0x20,0x60,0xF0,0xBF,0x21, + + 0xAB,0xD7,0x4E,0x16,0x3B,0xB4,0xBC,0x7F,0x48,0x78,0x23,0x14,0x57,0xA7,0x1B,0xC5, + + 0xC5,0xE3,0xDB,0x6A,0xB0,0xC4,0xD2,0x47,0x0F,0xE7,0xF3,0x95,0x74,0x8A,0xA8,0x04, + + 0xA6,0x57,0x2C,0x4E,0xB1,0xC5,0x29,0x11,0x4B,0x7A,0x3C,0x0B,0x62,0x0C,0x85,0xFC, + + 0x1F,0xBE,0xAE,0x33,0x0F,0xF2,0x4E,0x98,0x98,0xD7,0xCE,0xDD,0x2B,0xA3,0x10,0x43, + + 0x0E,0xD9,0xED,0x00,0xB2,0xA2,0x40,0x86,0x9C,0x0A,0x07,0x02,0x96,0x48,0xDD,0xF9, + + 0x47,0x4A,0x1F,0xEF,0xE8,0xF8,0x6C,0xAB,0x84,0x00,0xB7,0x92,0x17,0x2B,0x33,0x84, + + 0xAB,0x09,0xA6,0xF9,0x63,0x66,0x41,0x82,0x25,0x01,0x99,0x63,0xC9,0x56,0x40,0x7F, + + 0x04,0x38,0xBA,0x4A,0x6C,0x37,0xA6,0x08,0x92,0xED,0x2A,0x03,0x0C,0x47,0x68,0xE6, + + 0xC6,0x4C,0x49,0x7A,0xD6,0x6D,0xE8,0x7E,0x3D,0xCD,0x75,0xC6,0x08,0xC1,0x36,0x6F, + + 0xE6,0xCF,0xEF,0xDF,0x6A,0x9D,0xB7,0x0B,0xEE,0x73,0xB7,0x17,0x42,0xBC,0x37,0xDF, + + 0xE7,0x2E,0x2F,0x52,0x90,0x12,0x01,0xFC,0x06,0x2E,0x20,0x07,0x8C,0xC3,0x5F,0xCF, + + 0x06,0xAB,0x7A,0xF5,0x48,0xC0,0x2E,0x3C,0x63,0xE0,0xCE,0xC6,0x5C,0xE4,0xC0,0x76, + + 0x20,0xA1,0x0A,0xFC,0x6E,0x6C,0x1A,0x42,0x72,0x35,0x90,0xA0,0x6A,0x41,0xC1,0x02, + + 0x36,0x19,0xA1,0x00,0xA3,0x04,0x48,0x2E,0x84,0x46,0x6E,0x5F,0x5D,0x94,0xB1,0x81, + + 0x26,0x07,0x91,0x10,0x34,0xA1,0xE3,0xB5,0xDF,0x5C,0xB9,0xB1,0x28,0x0F,0xC0,0x0A, + + 0xFF,0x18,0xB6,0xC0,0x16,0x49,0x77,0x82,0xA2,0xE5,0xD0,0x64,0x52,0x64,0x9C,0x0E, + + 0x2D,0xD9,0xCA,0x0A,0x91,0xC9,0x8C,0x8E,0xBE,0xC4,0xD8,0x74,0x53,0x65,0x40,0x43, + + 0xCA,0x6A,0xA1,0x12,0x71,0x66,0x69,0x9E,0x2B,0x49,0xD1,0x65,0xD2,0x66,0x20,0xBA, + + 0x68,0x56,0xB3,0xD1,0xD3,0x03,0x19,0x82,0xED,0x9A,0xD9,0x75,0xD3,0x67,0x80,0x7A, + + 0x3B,0xE0,0x7A,0x28,0xF1,0x92,0x1A,0xA8,0xA1,0x98,0xF0,0x29,0x5B,0xF8,0x2A,0x40, + + 0xA8,0x08,0x01,0x24,0x3D,0xA4,0xDA,0x78,0x05,0x07,0x65,0x46,0xD4,0x9F,0xFB,0x01, + + 0x2F,0x0C,0x95,0x6F,0x27,0x68,0x01,0x2D,0xCE,0xD8,0xAD,0x49,0x55,0x08,0xB5,0x11, + + 0x68,0x10,0xF5,0x28,0x70,0xCA,0xDD,0xD1,0xCE,0xC0,0x93,0x39,0xE2,0x4B,0xE1,0x61, + + 0x39,0xB2,0x9B,0x5C,0x1C,0xAC,0x00,0xC7,0xA1,0x0F,0xD2,0x6C,0x5A,0x6C,0x09,0x72, + + 0x86,0x4F,0x0A,0x4C,0xCE,0x2B,0xFA,0x88,0xC3,0x9E,0xDA,0x7C,0x5B,0x6D,0x83,0x59, + + 0x52,0x4C,0x4C,0xCF,0x57,0x21,0x09,0x2B,0xB6,0xE1,0xD3,0x6D,0xDA,0x6E,0x49,0xE5, + + 0x88,0x3E,0x65,0xAF,0x9D,0xAF,0xEC,0x7F,0x3C,0xE4,0xDB,0x7D,0xDB,0x6F,0x16,0x7F, + + 0x87,0x02,0xE2,0xE4,0x70,0xAF,0xAE,0x5F,0xED,0x4B,0x3B,0xDF,0xAD,0xAB,0x0D,0xF6, + + 0x02,0x51,0x94,0xF8,0xD0,0x0E,0xA3,0xF7,0xA3,0x41,0xC7,0xB4,0x77,0x51,0xBD,0x31, + + 0x5F,0x5D,0xE5,0x87,0x3F,0x3F,0xB6,0x37,0xE3,0x62,0x95,0xFE,0x01,0xCE,0x4C,0xF7, + + 0x82,0x10,0xB5,0x64,0x12,0x63,0x15,0x19,0xC3,0xB1,0xEB,0x5D,0x86,0x3E,0x46,0x7C, + + 0x23,0xB4,0x9A,0xBA,0x31,0x36,0xFD,0xB7,0x64,0x26,0xD4,0xE4,0x72,0x74,0xDC,0x54, + + 0x71,0x00,0x34,0xB2,0xF1,0x15,0x7C,0xED,0xE1,0x09,0xDC,0xF4,0x73,0x75,0x55,0x4D, + + 0xA6,0x78,0x9C,0x26,0x17,0xB6,0x6E,0x63,0x77,0xF1,0xD5,0xE5,0xF2,0x76,0x74,0x93, + + 0x02,0x0C,0xC5,0xD9,0xD8,0x87,0xA9,0x75,0xB1,0x53,0xDD,0xF5,0xF3,0x77,0x66,0x8A, + + 0x71,0x15,0xB4,0x73,0xB5,0x95,0x40,0x40,0x8A,0xF5,0xE9,0xEB,0x85,0xCE,0xCA,0x1E, + + 0x63,0x7C,0x94,0x9E,0x8A,0x94,0xC1,0x02,0x6F,0xCB,0xC7,0xA7,0x1E,0x59,0xC3,0x0C, + + 0xEB,0xE9,0x4A,0x12,0x51,0x35,0x94,0x4F,0x9F,0x46,0x2C,0x37,0xF9,0x58,0x37,0x1C, + + 0xA7,0x91,0x46,0xED,0x39,0x2D,0x7D,0x3D,0xBC,0xCA,0xC5,0x0E,0x91,0x9A,0xFB,0x4C, + + 0x6A,0xA8,0x44,0x8A,0x4A,0x7D,0x36,0xA3,0xFC,0x1E,0xD6,0xEC,0x7A,0x7C,0x0D,0xE1, + + 0x28,0xAD,0x5E,0xDC,0x3B,0x3D,0x03,0x10,0x72,0x1F,0xDE,0xFC,0x7B,0x7D,0x2F,0xAB, + + 0x19,0x5C,0xFD,0x25,0x11,0x71,0x92,0x93,0x68,0x62,0xD7,0xED,0xFA,0x7E,0x16,0xB6, + + 0xAD,0x9F,0xCF,0xDD,0xBB,0x3F,0x9A,0x87,0xCF,0xA4,0xDF,0xFD,0xFB,0x7F,0x07,0xF4, + + 0x86,0xBC,0x0C,0x95,0x0F,0xA8,0x72,0xC4,0x8C,0x10,0x8D,0x46,0x5E,0xE6,0xA3,0x70, + + 0xFA,0x0D,0x89,0x27,0x79,0xBE,0x20,0xB2,0x2C,0x7B,0xC0,0x54,0xD8,0x67,0x7F,0xE1, + + 0x06,0x86,0x21,0x24,0x6D,0x29,0x7E,0xCB,0x14,0x0F,0x9C,0x9D,0x75,0x62,0x63,0x0E, + + 0xA5,0x8E,0x11,0xF7,0x91,0x86,0x21,0x2B,0xF6,0x0B,0xFB,0x77,0x9D,0x48,0xA0,0xDA, + + 0xB6,0x99,0x5A,0x46,0x16,0xA4,0x7E,0x62,0x8E,0xAD,0xF0,0x66,0x56,0xE4,0xA8,0x42, + + 0xDF,0x8B,0x12,0xD2,0x45,0xB2,0x28,0x49,0x69,0x50,0xF8,0x76,0x57,0xE5,0x49,0x21, + + 0xB5,0x38,0xE1,0x35,0xA5,0xF0,0xFB,0x4C,0xEC,0x93,0xF1,0x67,0xD6,0xE6,0x51,0xB9, + + 0x81,0xC7,0xB0,0x38,0x91,0x27,0xA9,0x77,0xDA,0x65,0xF9,0x77,0xD7,0xE7,0xA2,0x4C, + + 0x46,0x75,0x9F,0x31,0x70,0xEA,0x8A,0x6D,0x8E,0xA8,0xB5,0x3B,0xBD,0xE7,0x3A,0x78, + + 0x09,0xC5,0x65,0x8D,0x4A,0x29,0xC2,0x1E,0xAC,0xD2,0xF2,0xA2,0xAC,0x85,0x09,0x8E, + + 0xCF,0x6A,0xE9,0x58,0x11,0x07,0x7B,0x3B,0x69,0x4A,0x8C,0x68,0x1E,0xFA,0x6C,0xF3, + + 0xAA,0xC6,0xD4,0x58,0x74,0x82,0xB1,0xDD,0xFE,0xED,0xD9,0x37,0xDE,0xF9,0x1A,0x00, + + 0xFF,0x90,0x94,0x89,0x18,0x2C,0x4C,0xA2,0x6D,0x0E,0xF2,0x6E,0x5E,0xEC,0x7F,0x65, + + 0x3B,0x00,0xA9,0xF4,0x2C,0xD0,0x3E,0xF8,0xD6,0x26,0xFA,0x7E,0x5F,0xED,0xA3,0xD3, + + 0x7A,0x5B,0x30,0x0F,0x8E,0xEC,0xB3,0xE6,0xC1,0xC4,0xF3,0x6F,0xDE,0xEE,0x10,0xA0, + + 0x00,0xCD,0x2B,0x4F,0x08,0xED,0xBB,0xE3,0x4F,0xC9,0xFB,0x7F,0xDF,0xEF,0xF3,0x07, + + 0xA2,0x22,0xAC,0x3A,0xDD,0x6A,0x81,0xD3,0xD0,0x59,0xCA,0xA0,0x95,0x73,0x12,0x8E, + + 0x06,0x13,0xBA,0xE5,0x18,0x33,0xE3,0x32,0x12,0xA6,0xC4,0xA7,0x19,0xD4,0x8D,0x0F, + + 0x21,0x70,0x49,0x15,0xB4,0xBA,0x6A,0x43,0x97,0x36,0x00,0x54,0x78,0x7F,0xC1,0xE0, + + 0xBA,0x35,0x52,0xE4,0xEA,0x45,0xFD,0xEE,0x50,0x5E,0x7E,0x93,0x9E,0xC2,0x12,0x46, + + 0x74,0x83,0xE4,0xC6,0x36,0xB4,0x34,0x1E,0xDA,0x96,0xF4,0xE6,0x76,0xF4,0xEB,0xA1, + + 0x74,0xFB,0xEC,0xD6,0x37,0xB5,0xA7,0xDD,0x61,0xE4,0xFC,0xF6,0x77,0xF5,0xA5,0x5B, + + 0xDE,0x9E,0xE5,0xC7,0xB6,0xB6,0x39,0xE6,0x99,0xD4,0xF5,0xE7,0xF6,0xF6,0x0F,0xD2, + + 0xA4,0x57,0xED,0xD7,0xB7,0xB7,0x01,0x1B,0x71,0x1A,0xFD,0xF7,0xF7,0xF7,0xF5,0xF9, + + 0x56,0x11,0xEE,0x16,0xC6,0x98,0x6F,0x29,0x8B,0xDE,0x36,0x5F,0x48,0xE2,0x34,0x98, + + 0xBF,0x91,0xAC,0x5E,0x61,0x0E,0x67,0xB5,0x88,0xB7,0xDE,0xF5,0x1E,0xF4,0x07,0x61, + + 0x45,0xC0,0x25,0xF5,0x31,0x3C,0x9E,0x4F,0x4D,0x25,0x89,0x67,0xDF,0xA8,0xAB,0x6A, + + 0xF5,0x7B,0x2F,0xBB,0x54,0xF2,0xD8,0xFB,0xF9,0x56,0x40,0x4F,0xEE,0x20,0x3F,0xD1, + + 0xCB,0x1B,0xE6,0xCE,0x3E,0xBC,0xDA,0x78,0x6C,0xD6,0xF6,0xEE,0x7E,0xFC,0xC2,0xFE, + + 0xFB,0x9E,0xEE,0xDE,0x3F,0xBD,0x04,0x7E,0x2F,0xF9,0xFE,0xFE,0x7F,0xFD,0x63,0xCF, + + 0x21,0xDF,0xE7,0xCF,0xBE,0xBE,0x31,0xFF,0x6C,0x32,0xF7,0xEF,0xFE,0xFE,0xC8,0x7A, + + 0x46,0xF6,0xEF,0xDF,0xBF,0xBF,0x26,0x98,0xE9,0x5F,0xFF,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x30,0xAF,0xBE,0x60,0x70,0xFF,0x86,0xC0,0x44,0xB4,0x03,0x5A,0x9A,0xD1,0x4F,0x14, + + 0x29,0x76,0xF3,0x90,0x15,0xB3,0x1E,0x05,0xC1,0x56,0x0F,0xCB,0xB8,0xD0,0x94,0xF2, + + 0xF0,0x03,0xFE,0x77,0xF2,0xDD,0x00,0x3C,0x40,0xAE,0xD9,0xA5,0x39,0xB3,0x33,0xE2, + + 0x96,0xAC,0xB3,0xE6,0xE9,0x8C,0x27,0xE5,0x7E,0x18,0x4A,0x72,0xDF,0x58,0xBF,0x33, + + 0x2B,0x68,0xEA,0xAA,0xBE,0x29,0x6E,0x82,0x20,0x4B,0x94,0x8C,0x89,0x26,0x54,0x74, + + 0xEA,0x1F,0xB6,0x6D,0xE6,0x73,0x06,0xC1,0x4B,0xC8,0x18,0x64,0xB9,0x0B,0xA6,0x81, + + 0x86,0xA6,0x3C,0x02,0x6F,0x50,0x7E,0x1E,0x1B,0xD9,0xD3,0x7E,0xE1,0x4B,0x11,0x8D, + + 0xA3,0xC5,0xB7,0x6D,0xB1,0xCA,0xA6,0x75,0xCB,0xD4,0x19,0x65,0xA5,0x6F,0xCF,0xF5, + + 0x0A,0xD3,0x11,0xFD,0x74,0x08,0x12,0x19,0x2D,0xE7,0x68,0xCB,0xA5,0x0A,0x34,0x7C, + + 0x61,0x04,0xB4,0x29,0x94,0x9F,0x0D,0x4B,0x52,0x42,0xE9,0x4F,0x35,0x60,0xF6,0x8D, + + 0xB8,0xB5,0xBD,0x69,0xDA,0x95,0x80,0x47,0xE6,0xE5,0x96,0xCA,0xDE,0x51,0xF6,0xE0, + + 0x8B,0x90,0xC3,0xD4,0x70,0xCA,0xDB,0x4A,0x9A,0x40,0x9E,0xAC,0xB5,0x9E,0x8F,0x3A, + + 0xF5,0xF1,0x47,0x0B,0xFB,0x8A,0xFA,0x55,0x79,0x4B,0xD6,0x48,0xD5,0x2D,0x86,0xA8, + + 0x9B,0xFC,0xAC,0x64,0xF0,0xBC,0xA5,0x9E,0xA2,0x7C,0xF5,0x0E,0xB0,0x2E,0xEF,0xDA, + + 0x91,0x04,0xD4,0xBE,0xE2,0xA3,0xEB,0x9A,0xF2,0xC5,0x7F,0x49,0x03,0x93,0x32,0x3F, + + 0xAA,0x37,0xF5,0x64,0xF3,0x5E,0xF7,0xEA,0xEE,0x47,0xA5,0xD8,0x22,0xCB,0xFC,0xF2, + + 0xCB,0xF1,0xFA,0xBC,0xC1,0x66,0xAF,0x0C,0x97,0xDD,0xAA,0xC1,0xCF,0x2B,0x94,0x50, + + 0x28,0xBC,0x1D,0x0B,0xD8,0x00,0xDC,0xA0,0xD9,0x3D,0x5C,0xB5,0x9B,0x8C,0x3B,0xB4, + + 0x2D,0xB4,0xFB,0xA8,0x3D,0x9F,0x6A,0x23,0x71,0x95,0x95,0x5E,0x83,0x72,0x9B,0x81, + + 0x5E,0xEE,0x6E,0x55,0xD1,0x5F,0xDD,0xA1,0x97,0x59,0x8B,0xD7,0x0E,0xAE,0xA5,0x80, + + 0x62,0x5A,0x3F,0xBF,0x3C,0xCB,0x2B,0x93,0x4F,0xD5,0x29,0x08,0x72,0xCF,0x36,0xB0, + + 0x75,0x9E,0xF2,0xF8,0xE5,0x3F,0xBB,0x30,0x42,0xE8,0x53,0x9A,0x92,0xDA,0x87,0xC3, + + 0x86,0xCB,0x69,0xB6,0x8E,0xC0,0xAE,0x1E,0x1B,0x3A,0x95,0x1D,0x06,0x34,0x3C,0xED, + + 0x48,0x53,0x4D,0x13,0xCF,0xBC,0x4F,0xF5,0x1C,0xDA,0x4A,0x86,0x8F,0x1B,0xAA,0x1B, + + 0x0D,0x12,0xB8,0xB4,0xE6,0x95,0x56,0x40,0xB0,0x95,0x42,0x52,0x85,0xF9,0xCE,0x00, + + 0xF9,0xE4,0x4E,0x11,0x5C,0x7B,0xEC,0x3C,0x29,0x94,0x6B,0x42,0x02,0x7B,0xD3,0x0D, + + 0xB6,0xD3,0x12,0x13,0xB9,0x48,0x4F,0xA4,0x6A,0x46,0xD7,0x52,0x0D,0xF9,0xCF,0x14, + + 0x98,0x59,0xCC,0x87,0x34,0x86,0x1F,0xB9,0xE9,0x5B,0xC4,0x86,0xFF,0x83,0x7C,0x78, + + 0xBF,0xB3,0xBD,0xFD,0x02,0x93,0x82,0x16,0x97,0xFD,0xB0,0x89,0x7B,0x3C,0x65,0xE4, + + 0xC0,0x59,0xB0,0xDB,0x9A,0xBA,0xA5,0x8B,0x17,0xAC,0x0C,0x9E,0x8C,0x18,0xE3,0xBB, + + 0x09,0x95,0x67,0xBF,0xD8,0x22,0x6F,0x16,0x1F,0x3D,0xF3,0x67,0xFC,0x0C,0x75,0x69, + + 0x32,0xB0,0x4B,0xD8,0x1F,0xCE,0x21,0xFF,0x02,0x8E,0xE7,0x02,0x0E,0x1C,0x95,0xFF, + + 0x06,0x5B,0x60,0x8B,0xB0,0x3F,0xB3,0xCA,0x86,0x0D,0x26,0xA2,0x6B,0x26,0x84,0x61, + + 0x1A,0x27,0x6D,0x62,0xB4,0xFE,0x82,0xD2,0x05,0x8D,0xCB,0x45,0x39,0x8D,0x12,0x87, + + 0xD1,0x13,0x15,0x65,0x6F,0xE0,0x69,0x2A,0xF7,0x76,0x91,0xC0,0xD2,0xD9,0xB3,0xE3, + + 0x05,0x9C,0x1D,0x75,0x2A,0xCF,0xE9,0x31,0xA9,0xC2,0xDF,0x53,0xD6,0xD3,0x3A,0x8F, + + 0x7A,0x2B,0x9E,0x6B,0xFF,0x35,0x74,0x46,0xA7,0x6B,0x6C,0x84,0xB6,0x40,0x16,0x55, + + 0xA6,0x5A,0xEF,0x54,0xD1,0x08,0xEB,0x48,0x2C,0x34,0xA6,0x94,0x53,0x58,0xC1,0x31, + + 0xE4,0xF3,0xB7,0x6B,0x7D,0xF7,0xE0,0x90,0xFA,0x6D,0x89,0xD7,0x3D,0x45,0xD6,0xD7, + + 0x99,0xEC,0xFC,0x66,0x36,0x26,0x39,0x8A,0xC5,0x5C,0x39,0xEF,0x21,0xEA,0x3C,0xC6, + + 0x9E,0x82,0xC5,0xFD,0x28,0xF5,0xE2,0x17,0xB8,0x79,0x05,0x1B,0x5A,0x93,0xEE,0xE5, + + 0x3E,0x46,0x6F,0xA1,0xEE,0xCC,0x65,0x2B,0x4B,0xE9,0xC2,0xF8,0x7B,0xA8,0x20,0x78, + + 0xE9,0xE6,0xC0,0xFC,0xA4,0xE8,0x84,0x17,0xBF,0xCA,0x51,0x3E,0xB0,0xEE,0x11,0xFD, + + 0x9D,0x76,0x93,0xE4,0x10,0xDD,0x4D,0x44,0xF1,0x34,0x0C,0x17,0xAA,0xEB,0x5A,0xB0, + + 0xA2,0x81,0x91,0xBD,0x9A,0x21,0xC7,0x55,0x76,0x8E,0x8C,0xCE,0xF2,0xE1,0x93,0x52, + + 0xAA,0xF2,0xD2,0xA4,0xB3,0xA0,0xCD,0x47,0xBB,0x1C,0x36,0x81,0xAA,0x6E,0x1C,0xA3, + + 0xCF,0xC3,0xB1,0x61,0x75,0xCA,0xAA,0x12,0x36,0xFF,0x8D,0xCE,0xD8,0x7C,0x87,0x20, + + 0x11,0x12,0x94,0x25,0x12,0xCD,0xBB,0x8F,0xF8,0x42,0x0E,0x81,0x36,0x86,0x67,0x3B, + + 0xEE,0x41,0xC2,0xF2,0x57,0xB4,0xA4,0x20,0xF5,0x17,0x0D,0xB5,0x44,0x11,0x6F,0x16, + + 0x3B,0x58,0xCD,0x56,0x65,0xF3,0x3C,0xB2,0x65,0x7C,0x3C,0x27,0x22,0x5C,0x1E,0x10, + + 0xDC,0x98,0xDC,0xFD,0xD5,0xB6,0xF5,0xB3,0x01,0xD2,0x25,0xD4,0xA3,0xFB,0x16,0x71, + + 0x09,0x2E,0x68,0x28,0xB3,0x21,0xA5,0x37,0xFB,0x96,0x21,0x27,0x0A,0x5E,0xC0,0xB0, + + 0x85,0x1F,0x74,0x81,0xCF,0x12,0xA7,0x66,0x78,0xC3,0x92,0x84,0x8D,0x6B,0x94,0xCF, + + 0xA7,0x70,0x8A,0xFA,0xDC,0x24,0x5A,0xCE,0xEB,0x68,0xBF,0xC8,0x44,0x3A,0xFD,0xFF, + + 0x15,0x1B,0x70,0x34,0xCE,0x2B,0x8A,0xF0,0x9A,0x92,0xCE,0xA5,0x57,0xB4,0xFD,0x9C, + + 0x5E,0xEB,0x01,0xA4,0xCF,0x11,0xBD,0x7E,0x0F,0x88,0x45,0x09,0xE7,0xBA,0x5E,0x7B, + + 0x8F,0xD8,0x81,0x8C,0x7C,0x18,0xCD,0x8D,0xCD,0x27,0x79,0xE9,0xA2,0xF2,0x10,0xA3, + + 0x8E,0xFC,0x54,0xF8,0xCA,0xA9,0x7D,0x03,0x90,0x6F,0xA6,0xDE,0x79,0x5B,0x98,0x0F, + + 0xB2,0xE3,0x31,0xAE,0xFE,0xA1,0x57,0x91,0xEE,0x98,0x37,0xBE,0xA3,0x57,0x11,0xA7, + + 0x0E,0x36,0x17,0x60,0x30,0x1D,0xC0,0xC5,0x3F,0x04,0xA7,0xCC,0xD8,0x79,0xCF,0xB0, + + 0xBB,0x31,0x7C,0x3E,0xBE,0xA3,0xC2,0x88,0xD1,0xB0,0x09,0x90,0x50,0x5A,0x56,0x24, + + 0xF3,0x92,0x6E,0x18,0x43,0xBE,0x9F,0x04,0x96,0xDB,0xC6,0x14,0x79,0xBD,0xFB,0xFB, + + 0x59,0x3F,0xF9,0xF7,0x2C,0xB6,0xC8,0x64,0x11,0x03,0xCF,0x14,0x0D,0xF0,0x5D,0xEB, + + 0xAF,0x60,0x78,0x4B,0x9F,0x7E,0xCA,0x7B,0xE9,0xAD,0x04,0x81,0x7E,0xF2,0xBF,0x42, + + 0xA1,0xD5,0xA0,0xF4,0x80,0xD1,0xDA,0xD0,0xC0,0x5F,0x00,0xA6,0xD0,0xDA,0xB7,0x5F, + + 0x94,0xDC,0x44,0x29,0xA2,0x6C,0x50,0x3C,0xBC,0xE0,0xD2,0x29,0xBA,0x70,0x51,0x3E, + + 0xAA,0x7E,0xF8,0x63,0x67,0xA9,0xAA,0x51,0x40,0x54,0xA9,0xF5,0x73,0xEE,0xA0,0x7F, + + 0xAF,0xA5,0x91,0x65,0xF2,0x06,0xCD,0xC2,0xEF,0x9E,0x89,0x0C,0xD5,0x4F,0xEB,0xC5, + + 0x91,0x3B,0x89,0x45,0x90,0x18,0x1A,0x4F,0xBF,0x28,0x77,0xA3,0xAF,0x12,0xDE,0xA3, + + 0x87,0x88,0x30,0x5C,0xB4,0x67,0x3B,0xF4,0x5D,0xEF,0xE6,0x5C,0xA8,0xFE,0xBE,0xB1, + + 0xC5,0xA7,0x8F,0xA7,0xA1,0x8D,0x33,0x65,0xE6,0x5D,0x6A,0xEB,0xD1,0x87,0x1B,0x1A, + + 0x85,0xDC,0x0C,0x90,0x92,0xE7,0x51,0xFD,0xF0,0xB1,0xD9,0xF7,0x46,0x92,0x3A,0xE3, + + 0xBB,0x06,0x15,0xE6,0xBD,0x97,0x44,0x8C,0xA3,0x0B,0x4B,0x5F,0x35,0x61,0xF1,0x9C, + + 0x4C,0x1A,0xB5,0x82,0x96,0x32,0xB6,0xD0,0xA6,0x04,0xD1,0xDC,0x45,0x72,0x3B,0xF6, + + 0x0B,0x07,0x6F,0x93,0x99,0x40,0x15,0x14,0xE1,0xF6,0x13,0x6E,0xEF,0xC7,0x24,0x66, + + 0x50,0x97,0xAE,0x8B,0x98,0x53,0x7D,0x98,0x20,0x48,0xBC,0x4B,0xFA,0xAB,0x9F,0x88, + + 0x14,0x4E,0xFC,0x94,0x39,0x6C,0xEA,0x96,0x5A,0x01,0x12,0xE1,0xCC,0x6A,0xE1,0x1F, + + 0x05,0xD1,0xEA,0x0F,0xBA,0xA1,0xBD,0x06,0x4D,0x3F,0x7D,0xBB,0xA6,0x1B,0x86,0x72, + + 0xB9,0xEE,0x6B,0xD9,0xBE,0x28,0xAC,0x81,0x41,0x03,0x7E,0xFE,0xDC,0x1C,0x8F,0x93, + + 0x30,0xF0,0x81,0x40,0x70,0xCE,0x96,0x39,0xC7,0x4E,0x60,0xF3,0xDA,0x8D,0xB0,0xE2, + + 0x9F,0xBB,0xBF,0x16,0x3C,0x38,0xB7,0x04,0xBC,0x33,0xAA,0x6C,0x11,0x50,0x6C,0xAB, + + 0x23,0x53,0xCF,0xC4,0x30,0xA1,0xA7,0x00,0xDF,0x0E,0x0A,0x5C,0xDF,0x3C,0x7D,0x85, + + 0x49,0xE3,0x03,0x6D,0x7C,0x70,0xD5,0x39,0xEF,0x2D,0x8D,0x40,0x11,0xDD,0x0B,0x31, + + 0x00,0xCC,0x4D,0x18,0x60,0x3E,0xB2,0xDE,0x3C,0x8C,0x62,0xC6,0x9D,0x1F,0x7C,0x87, + + 0xE8,0x05,0xDE,0x39,0xA0,0xEF,0xFB,0x06,0x72,0xA9,0xF9,0x34,0xD3,0x1A,0x55,0x32, + + 0xC2,0x0E,0xAC,0x9B,0xBD,0x38,0x17,0x10,0x62,0xA0,0xBC,0xAE,0x73,0x78,0x0D,0x49, + + 0x03,0xB7,0x60,0x41,0xE3,0x72,0xAD,0xE3,0xA3,0xFB,0xB7,0xE9,0xF3,0xC6,0x20,0x37, + + 0xB3,0x5A,0x36,0xF2,0x12,0x31,0xC7,0x19,0xD0,0x18,0xDF,0x17,0x71,0x5F,0xB2,0xEA, + + 0x50,0xE7,0x84,0x6E,0xBA,0x04,0x48,0x10,0x68,0xFC,0x71,0x6C,0x1D,0xF3,0x0E,0x61, + + 0x2D,0x5B,0x4E,0x11,0xE8,0x34,0x2D,0x1C,0x6F,0x01,0x26,0xDC,0x6E,0xD4,0xBC,0x31, + + 0x5F,0x81,0x76,0x7D,0xA8,0x35,0x8B,0x10,0x10,0x39,0x5B,0x9C,0x94,0x65,0x8F,0x01, + + 0x24,0x66,0x63,0x0F,0xFB,0x33,0xED,0x9D,0xDA,0x6F,0xD4,0xDD,0xBE,0x39,0x5E,0xD0, + + 0xC3,0x06,0x6F,0x6F,0x3C,0xC7,0x57,0x97,0xCD,0x47,0x72,0x8E,0x3B,0x5C,0x2E,0x97, + + 0xFB,0x96,0x75,0x3E,0x97,0xC0,0x5E,0x10,0x54,0xC0,0xA5,0xDB,0xDA,0xC2,0x5D,0xC8, + + 0x8B,0xDE,0x2D,0x4F,0x27,0x58,0x7C,0x8F,0x11,0xC5,0xAF,0xC9,0x05,0x73,0x4B,0x3B, + + 0x98,0x41,0xB7,0xFA,0x1A,0xE0,0xA7,0xF1,0x12,0x10,0x1F,0x3D,0x02,0x3E,0x9B,0x58, + + 0x89,0x9B,0x1F,0x82,0x46,0x2C,0xF0,0xAF,0x5B,0xC8,0xD0,0x69,0x84,0xED,0x16,0xB2, + + 0x03,0xF3,0xCA,0x13,0x14,0xA0,0xE1,0x32,0x3E,0xC3,0x52,0xD0,0x66,0x5D,0xDF,0x65, + + 0x4E,0xA1,0x61,0x9F,0xAA,0x3F,0x71,0x50,0xE9,0xBD,0xA9,0x37,0x35,0xF9,0xE4,0x53, + + 0x95,0xC1,0xF0,0x04,0x93,0x31,0x62,0x08,0xBA,0xC1,0x01,0x65,0x96,0x13,0x3A,0x33, + + 0x6E,0x65,0xD8,0x96,0x4A,0x0B,0x67,0x76,0x75,0xD0,0x1C,0xE4,0xC3,0xE3,0x45,0xD6, + + 0x70,0xFE,0xEA,0x25,0x27,0xAE,0x42,0x81,0x54,0xDE,0x51,0x49,0xF6,0x63,0x1F,0x45, + + 0x67,0x05,0xF0,0x34,0xFA,0xAF,0xCB,0xD1,0x56,0x34,0xC9,0xF5,0x47,0xE0,0x61,0x46, + + 0x66,0x81,0x6B,0xA6,0xFB,0x87,0x0D,0x15,0x38,0xD7,0xF9,0x37,0xC7,0xE1,0xE7,0xBE, + + 0xAD,0x17,0xA8,0xCE,0x06,0x55,0xE9,0x14,0x48,0x30,0x4D,0xC6,0x9B,0xA5,0xEF,0xAE, + + 0x8C,0xED,0xD4,0x18,0xFC,0x2A,0xEE,0x01,0x60,0x52,0x02,0x0F,0x6C,0xA6,0x97,0x69, + + 0x77,0xC8,0xB5,0x6D,0xFC,0x09,0x8A,0x15,0xEA,0x3F,0x1F,0xB0,0xDF,0xFA,0x03,0x1D, + + 0x2C,0xD4,0x86,0x9B,0xCF,0xD8,0x3B,0xBF,0xC9,0x59,0x81,0xD7,0x46,0xA4,0xCF,0x51, + + 0xAD,0x88,0xBC,0x66,0x5E,0xF7,0xCA,0x82,0x7D,0x30,0xDF,0xBE,0xFF,0x6C,0x47,0x29, + + 0x5C,0x86,0x7D,0x11,0x74,0xAE,0x23,0xD4,0xEA,0x32,0xD7,0xAE,0xFE,0xE4,0x61,0x5A, + + 0xE2,0xAB,0x4E,0xA2,0x10,0x05,0x8B,0x63,0x33,0x81,0x8B,0x6D,0xCE,0xE8,0x7F,0xD9, + + 0x12,0x3B,0x8D,0x64,0xF6,0x3A,0x7A,0x1D,0xFC,0xB4,0x7B,0xEF,0x7C,0xE9,0xC3,0x7D, + + 0x91,0x46,0xE7,0x02,0x2A,0x2C,0x8E,0x42,0x60,0xF5,0x71,0x9D,0x14,0xF0,0x54,0xB5, + + 0xD8,0x9E,0x2A,0x94,0x33,0x3A,0x04,0xA2,0xC6,0xDC,0x47,0x71,0x46,0x15,0x4D,0x85, + + 0x27,0xF6,0x9F,0x65,0xDF,0x02,0x15,0x21,0x7D,0x85,0x4A,0xD9,0x96,0x92,0xED,0x1E, + + 0xC3,0x9E,0x99,0xAA,0x06,0x6E,0xD1,0x21,0xF5,0xD9,0x05,0x28,0xE7,0xBE,0xDC,0x22, + + 0x68,0x92,0x50,0xA4,0xB4,0xE8,0xD8,0x91,0x79,0x22,0xF4,0xE6,0x76,0xF4,0x28,0xA0, + + 0x84,0x8E,0x8C,0x99,0xFD,0x68,0xB5,0x78,0x64,0x27,0xFC,0xF6,0x77,0xF5,0xC8,0xD9, + + 0x07,0x9F,0x52,0x43,0xC9,0x78,0x2F,0xE1,0x55,0x7F,0xF5,0xE7,0xF6,0xF6,0x42,0xB5, + + 0x66,0x1D,0x95,0xF0,0x4A,0xB8,0xD1,0x1B,0x6C,0x9A,0xFD,0xF7,0xF7,0xF7,0xDD,0xAD, + + 0x8D,0x67,0x86,0x9F,0x5F,0x9D,0xB6,0x89,0xEC,0x55,0x55,0x6E,0x79,0x55,0x34,0x98, + + 0xEF,0x9D,0x6E,0x13,0xEC,0x34,0x86,0x44,0x90,0xB5,0x7E,0x33,0xCF,0xE2,0xCB,0x19, + + 0xAC,0x47,0x30,0x65,0x5D,0xF5,0x4F,0x54,0xDF,0xBD,0x21,0x2B,0xAE,0x76,0x27,0x0F, + + 0x50,0x3D,0xD7,0x82,0x35,0x74,0xDC,0xFB,0xE9,0xFE,0x39,0xE1,0x70,0x99,0xE1,0x22, + + 0xE9,0xD3,0xD8,0xE6,0xC5,0x27,0x11,0x1A,0xEE,0x9E,0xF6,0xEE,0x7E,0xFC,0x7F,0x38, + + 0x0B,0x32,0x2E,0x53,0xA9,0xBB,0x6E,0xC3,0x6D,0x70,0xFE,0xFE,0x7F,0xFD,0x07,0x84, + + 0x76,0x33,0xE7,0x4D,0x2B,0x99,0xB2,0x32,0xEF,0xBE,0xF7,0xEF,0xFE,0xFE,0xCB,0xB9, + + 0x54,0xDD,0x42,0x58,0xB9,0xCD,0x36,0x1B,0xBF,0x74,0xFF,0xFF,0x32,0x61,0x80,0x19, + + 0x40,0x40,0x30,0x08,0xF1,0x43,0x16,0x7E,0xCD,0x22,0xA7,0x70,0x23,0x60,0xA7,0xE1, + + 0xED,0x0C,0x9A,0x10,0xF8,0xA0,0x0E,0x9D,0xAA,0x32,0x8E,0x56,0xAE,0xBC,0x00,0xDF, + + 0xEB,0xC7,0x83,0xF6,0xF4,0x89,0xBA,0xA4,0x53,0x7D,0x51,0x3D,0x83,0x9F,0x57,0x22, + + 0x01,0xA8,0x65,0x86,0xF9,0x29,0xA2,0x80,0xF7,0xEC,0x4D,0xCB,0x2C,0xE2,0x12,0x4F, + + 0xE9,0x95,0xB9,0x32,0xE1,0x34,0x46,0x48,0xA9,0x55,0x01,0x7B,0x6C,0x0A,0x5E,0x91, + + 0xFC,0x88,0x7B,0x69,0x15,0xF5,0xCE,0x0F,0x2B,0x34,0xE6,0xD8,0x91,0x65,0x61,0x61, + + 0x6B,0x47,0x7B,0xBE,0x6E,0x25,0xEA,0xD0,0xAE,0xE9,0xEF,0xC8,0x10,0x99,0x9D,0xAF, + + 0x7B,0xCF,0xD3,0x0F,0x66,0xBB,0x27,0x5C,0x36,0xE4,0xD1,0x61,0xB8,0x34,0x30,0x18, + + 0x8D,0x1E,0x06,0x08,0x58,0x9B,0xC3,0x7A,0xFB,0xC2,0xF3,0xDF,0x20,0xB5,0x2D,0x19, + + 0x62,0x7D,0xF4,0x20,0xF0,0xA8,0xCF,0x6A,0x0A,0xB9,0x2D,0x00,0xA4,0x0A,0x5D,0x13, + + 0x88,0xA1,0xBD,0xDD,0xDB,0x0A,0x6B,0x63,0xF9,0xE7,0xC1,0x22,0x33,0xFB,0x89,0xDF, + + 0x1B,0x08,0x91,0x19,0xB8,0x4B,0x12,0xCA,0xF3,0xE6,0xFD,0x5F,0x2E,0x96,0x19,0x48, + + 0x0C,0x9C,0xED,0x33,0xC3,0x22,0xC3,0x9B,0x7E,0x4D,0xD2,0x9D,0x64,0x93,0xB5,0x26, + + 0x25,0xD2,0x31,0x1B,0xE2,0xDB,0x76,0x0A,0xA0,0x2C,0xE9,0xC9,0x78,0x2D,0x08,0x36, + + 0xE2,0x03,0xFB,0xB2,0x19,0x23,0x54,0x6C,0xCE,0x2E,0xD5,0xC5,0x33,0x7D,0xF4,0x69, + + 0x19,0xA0,0xB5,0xED,0x6A,0xF9,0x65,0x5C,0x46,0xC9,0xDD,0xC8,0x99,0xC0,0x90,0x73, + + 0xA4,0x9D,0xA4,0x99,0x5B,0xD1,0x91,0xDD,0x89,0x31,0xAC,0x25,0x1B,0x91,0x36,0x72, + + 0x69,0x70,0xD2,0xBD,0x39,0x9A,0x65,0xE6,0x94,0x9D,0xC2,0x9D,0x79,0xDA,0x57,0xCB, + + 0x4B,0x76,0xB0,0x74,0x80,0x33,0x03,0xC3,0x80,0x28,0xA0,0x54,0xC0,0x7F,0x33,0xB4, + + 0x43,0xC3,0x1C,0xBE,0xDA,0x42,0x1C,0xE7,0x1C,0x9F,0x0C,0x9B,0x9A,0x02,0x8C,0xE6, + + 0x72,0x99,0xC8,0x2E,0xD7,0xAB,0x2A,0xE7,0xC3,0xFB,0xB7,0xF7,0x23,0x15,0x06,0xD1, + + 0x5E,0x1C,0x9C,0xEA,0x4F,0x77,0x0C,0xDF,0x5B,0x00,0xDC,0xB4,0x0A,0xD1,0x91,0x3E, + + 0x4B,0x9C,0xC4,0xB3,0x49,0xC3,0xC2,0xC6,0x43,0xF9,0xEB,0xC0,0x7D,0xF0,0x0F,0xA2, + + 0xFA,0x96,0x4E,0xA5,0x30,0x3A,0xCC,0xDA,0xDF,0x51,0xCC,0xF3,0x3B,0x96,0x39,0xFA, + + 0xC3,0x79,0x8E,0x2C,0x60,0x58,0xCD,0xA4,0x17,0xA1,0x96,0xAE,0x24,0xD3,0x8E,0xAA, + + 0x49,0x49,0x0B,0xB8,0xD0,0x78,0xDE,0xB5,0x14,0xF4,0x86,0x4D,0x41,0x59,0x39,0xAC, + + 0xC3,0x15,0x07,0x89,0xCE,0x39,0xA2,0x9D,0x10,0x69,0x01,0x86,0x93,0x6B,0xF0,0xEA, + + 0x0A,0x98,0x99,0x59,0x46,0xB6,0x8B,0x88,0x48,0xDA,0xC1,0x91,0x41,0xD0,0x1C,0x37, + + 0xCB,0x9F,0x51,0x3F,0x5C,0x32,0x56,0xF4,0x6C,0xCC,0x72,0x8E,0x8D,0x19,0x10,0x60, + + 0x23,0xB2,0xE8,0xF4,0xBF,0x99,0x26,0x59,0xE6,0xD6,0x6F,0xD0,0xC3,0x0C,0xF6,0x82, + + 0x57,0x22,0xFF,0x71,0x51,0x9D,0xE0,0x1A,0xCC,0xFA,0xEF,0x12,0x46,0x4F,0x18,0xD2, + + 0xDD,0x1B,0x59,0xDA,0x1A,0xE0,0xDF,0x6A,0x8B,0xF0,0x1F,0xE5,0x3B,0xC0,0xC3,0xF9, + + 0x20,0xC0,0x20,0x07,0xBA,0x0D,0xE5,0xF2,0x18,0x6F,0xA6,0x44,0xAB,0x3D,0x9F,0x13, + + 0x88,0x8D,0x2C,0x12,0x55,0xB2,0x5A,0x8F,0x44,0xB1,0xAF,0xC5,0x2D,0x3C,0xA6,0xAD, + + 0x0B,0x80,0x31,0x94,0x9F,0xAA,0xA3,0x50,0xFE,0xAC,0x65,0xD9,0x29,0x43,0x41,0x0C, + + 0xA1,0x82,0x97,0xD2,0xB7,0xAE,0x60,0x58,0xA6,0x3C,0xEF,0x0F,0x3E,0x72,0x77,0x3C, + + 0x64,0xF0,0x9E,0xE3,0xFF,0x97,0xF6,0x22,0x4A,0x84,0x50,0x7C,0xDA,0x49,0xD7,0xF7, + + 0xCD,0x88,0x91,0x20,0xE4,0xB5,0x6E,0x57,0xAC,0x81,0xA2,0x72,0x3F,0xF4,0x1F,0x7B, + + 0x7A,0x57,0xF7,0x25,0xF6,0xDC,0x73,0xCB,0xA5,0xD9,0x24,0x85,0x9E,0x87,0x92,0x2C, + + 0xEF,0x8A,0x53,0xAC,0x6B,0xE4,0x43,0xC3,0x0A,0x68,0x87,0x5F,0x36,0x44,0x25,0x0F, + + 0x08,0x88,0xE6,0xFF,0x70,0x9D,0xCA,0xC2,0xA9,0x87,0x32,0x2A,0x2A,0x45,0x74,0xB2, + + 0x0D,0x04,0xBF,0x1F,0x76,0xF8,0xBB,0xC7,0xB0,0xBC,0xB2,0x3B,0x59,0x69,0x5D,0xFA, + + 0xE2,0x96,0xFD,0x27,0x3C,0x01,0xB3,0x3B,0xB6,0x11,0x23,0x68,0x16,0xA0,0x55,0x3E, + + 0x6C,0x2A,0x9E,0xEE,0xA1,0xA7,0xA9,0x00,0xF7,0x89,0xEC,0x4C,0xD2,0xE8,0x9D,0x34, + + 0x20,0x53,0x51,0xEF,0x18,0x7C,0xD6,0x08,0x6F,0xAC,0x64,0x9D,0x32,0x67,0x7D,0x24, + + 0x65,0x1C,0x55,0x1C,0xBE,0x00,0x6B,0x4A,0x1B,0x62,0x6F,0x0C,0x35,0xBC,0xDC,0x7A, + + 0xF6,0x21,0xF9,0x31,0x1F,0xA3,0xF3,0x6E,0x2A,0x63,0x73,0x5E,0xE2,0x41,0x15,0x63, + + 0xAF,0x3F,0xBE,0x6E,0x3E,0x2E,0xDB,0x09,0xA5,0x2E,0x85,0x53,0xDB,0xAF,0x74,0x7C, + + 0xD9,0x19,0x70,0x78,0xCC,0x78,0x38,0x48,0xA1,0x0D,0x21,0xA4,0x54,0x40,0x88,0xF0, + + 0xDE,0x0A,0xE7,0xE9,0x5D,0xBC,0x96,0xA3,0x49,0x7C,0x0B,0x92,0x02,0xF1,0xA1,0x70, + + 0x20,0x46,0xFE,0x87,0xB2,0x22,0x9F,0xAB,0x21,0x2F,0xF8,0x07,0xE8,0x20,0x2D,0x7B, + + 0x44,0xDE,0x52,0xE9,0x9B,0x6C,0xA9,0xF4,0x27,0x93,0x8A,0xE3,0x86,0xF3,0x61,0x33, + + 0x54,0xB4,0x50,0xA4,0xBB,0x12,0x21,0xD3,0xC7,0x55,0xC7,0x04,0x70,0x24,0xBF,0x22, + + 0x9B,0x06,0x38,0x28,0x8B,0x84,0x7D,0x84,0x9C,0xAE,0xDA,0xCE,0xFB,0x28,0x3B,0x7A, + + 0x12,0x3D,0xB7,0x38,0x43,0x10,0x79,0x09,0x03,0x49,0x80,0xF4,0x8E,0xB2,0xDC,0x6A, + + 0x1F,0x44,0x5C,0xFB,0x0F,0xC6,0x7E,0xCC,0xC1,0x02,0x85,0xD0,0x0A,0xF8,0xDD,0x82, + + 0x89,0x67,0x19,0xBE,0xAE,0x17,0x7E,0xAF,0x68,0xD8,0x76,0xB6,0x2F,0x05,0x34,0x84, + + 0x1B,0x6D,0xD0,0xA6,0xBD,0x2B,0xE1,0xBB,0xED,0x99,0x6A,0x40,0x80,0x78,0xFA,0x87, + + 0xAA,0x4A,0xB0,0xF1,0xDE,0xCE,0x7D,0x8B,0xFC,0x5A,0xA1,0xCD,0x03,0x27,0xFA,0xE8, + + 0x93,0x80,0x18,0xBB,0xCA,0xBB,0xE0,0xBB,0x31,0x7A,0xDE,0x4C,0x85,0x26,0xA6,0xD2, + + 0x23,0x63,0x26,0xD6,0xFE,0xD0,0x22,0x6E,0x3A,0x55,0xAC,0xEF,0x16,0x2F,0xD1,0xEB, + + 0x8E,0x62,0x96,0x4D,0x55,0x22,0x56,0x98,0x86,0xEE,0xA9,0x0D,0x05,0x88,0xB3,0x58, + + 0x0F,0x41,0x81,0x7B,0x45,0x13,0xCC,0xA9,0x4F,0x23,0x89,0x53,0x1F,0x5D,0xD4,0x7E, + + 0x58,0x62,0x2F,0xC3,0x05,0x6B,0x69,0x99,0x8F,0xA5,0xAC,0x11,0x47,0x2C,0xC0,0x18, + + 0x0D,0xFF,0x05,0xB5,0xF9,0xCA,0x77,0x28,0x2B,0x85,0x35,0xD5,0x34,0x76,0xB7,0x21, + + 0xA0,0xFE,0x3F,0x40,0xE6,0x94,0x46,0x03,0xC1,0xEA,0xC0,0xAC,0xAD,0xA9,0xD5,0x92, + + 0x21,0xDD,0x8F,0xD1,0xB3,0xB0,0x77,0xD0,0x2C,0x49,0xAF,0xF0,0x99,0xA8,0xB2,0xB4, + + 0x76,0xFE,0x41,0xEF,0x97,0xB3,0x2B,0x21,0x44,0x55,0x62,0x0E,0xDA,0xFC,0x1E,0xD2, + + 0x06,0xD0,0xFE,0x3A,0xB1,0x41,0xC0,0x91,0xE1,0x04,0x46,0x95,0x62,0xC2,0x2F,0xA1, + + 0xD1,0x45,0x48,0x44,0xB6,0x2B,0x4A,0x83,0x23,0x98,0x16,0xCF,0x57,0x14,0xA2,0x5E, + + 0x5C,0xA9,0xFF,0x3A,0x31,0x54,0x63,0x5F,0x61,0xE7,0x8F,0x4C,0xB1,0x62,0x37,0x67, + + 0x68,0xE2,0xA1,0xD3,0x6F,0x66,0x0F,0x54,0x28,0x26,0xE7,0xB0,0xF1,0x6A,0x14,0x20, + + 0xE3,0x19,0xC9,0x73,0x70,0x25,0x31,0x32,0x90,0xFC,0x52,0x34,0x0B,0x95,0x9C,0x67, + + 0x61,0x78,0x35,0x2D,0x7D,0x86,0x7B,0x98,0x9F,0xF6,0x4E,0xC2,0xA4,0xC8,0xB8,0xB8, + + 0xE4,0xA5,0x7C,0x73,0xB6,0xF5,0x4D,0x26,0x9A,0x04,0x85,0x4F,0x27,0xB7,0x75,0x34, + + 0x7C,0xA8,0x19,0x63,0xF3,0x8A,0x45,0xAF,0x03,0xE0,0x09,0xCE,0xBD,0xB6,0x1C,0x7B, + + 0x1A,0xA3,0x2E,0xCC,0xE6,0x0C,0xEB,0x19,0x07,0x47,0x50,0x90,0xE2,0x97,0x69,0xA9, + + 0xD3,0x4D,0x5A,0x47,0x37,0xD0,0x64,0x2C,0x20,0x42,0xEF,0x81,0x7A,0xB9,0x71,0x0F, + + 0x18,0xA1,0x6F,0x0F,0x19,0xDA,0x40,0x7A,0x9B,0x7F,0xEB,0x6F,0x9A,0xB5,0x15,0x56, + + 0xCF,0x41,0xD9,0x7D,0x70,0x5E,0xDB,0x4B,0x3F,0x40,0x49,0x62,0xB7,0xC2,0xB3,0xA4, + + 0xAF,0x12,0x3B,0xB5,0x54,0x9F,0x33,0xBB,0x0B,0x24,0x40,0x5A,0x8D,0xD1,0x64,0x61, + + 0x0D,0x65,0xF2,0xA5,0xDA,0x50,0xFF,0x4B,0x43,0x41,0xCA,0x85,0x9A,0xD0,0xB2,0x80, + + 0x2D,0x1E,0x17,0xFB,0xDA,0x93,0x95,0x67,0x72,0x51,0x07,0x56,0x94,0xAF,0x53,0xA1, + + 0x33,0xB8,0xAB,0xA1,0xD1,0x73,0x1F,0x4C,0xE1,0x57,0xE3,0x90,0x39,0xB2,0x1A,0x2F, + + 0x2E,0xBF,0xBA,0xFD,0x49,0xB4,0xC0,0x26,0x3E,0x57,0xF4,0xF4,0x05,0x41,0x12,0xCA, + + 0x23,0xBE,0x84,0xD1,0x37,0x25,0x23,0xE3,0x9D,0xA8,0x7B,0xC1,0x9A,0xA4,0xB8,0x61, + + 0x27,0x00,0xFA,0x02,0x78,0xA7,0xB6,0x1A,0xC0,0x49,0x0A,0xE7,0x26,0xB7,0x6A,0xD5, + + 0xC8,0x63,0xA0,0x6E,0xF3,0x45,0x7B,0x4F,0x16,0xF3,0x6E,0xCC,0xC0,0x37,0x10,0x87, + + 0x43,0xD9,0x80,0x4B,0xC4,0x00,0x96,0x55,0x60,0xAC,0x84,0xEA,0x24,0xD5,0x03,0x64, + + 0x29,0xAC,0xD5,0x9C,0x3F,0xA9,0xC1,0xBC,0xE9,0x19,0x18,0xA9,0x85,0xE8,0x66,0xCF, + + 0xF4,0xEF,0x5C,0x8D,0x40,0xD2,0x82,0x09,0xFC,0xDA,0x06,0x4D,0xF4,0x3A,0x81,0x61, + + 0xA9,0x59,0xC4,0xE2,0x8A,0x7B,0xC0,0xB8,0x35,0x1A,0x20,0x18,0x33,0x76,0xC4,0x0E, + + 0xB8,0x1F,0xF8,0x09,0x18,0x31,0x21,0x93,0xA2,0xCB,0x7A,0x49,0xAF,0x1F,0xA2,0x4A, + + 0x2B,0x15,0xFE,0xDE,0x7B,0xE6,0x9F,0xFC,0x2F,0x0E,0x84,0x0F,0x43,0xA0,0xC0,0xA4, + + 0x43,0x2F,0x45,0x31,0x02,0xC5,0x6C,0x18,0x55,0x4C,0x7C,0x27,0x41,0xFF,0x9B,0x79, + + 0xF3,0x1D,0xFA,0x20,0x9B,0xEB,0x1A,0xFD,0xAF,0x1C,0x8D,0x6E,0x10,0x6E,0xB1,0xF1, + + 0x30,0x2D,0xDE,0x37,0x94,0xC2,0xD6,0xC6,0xA5,0x6F,0xE6,0x17,0xBF,0x41,0x1A,0x2C, + + 0xA6,0x20,0x57,0x65,0x52,0xC2,0x46,0xAC,0xAE,0x37,0xAE,0x54,0xAA,0x4C,0xB3,0xF2, + + 0x27,0xC2,0x9F,0xD2,0xFC,0xAF,0x57,0xD2,0x06,0x42,0x91,0xA2,0x3D,0x08,0x3E,0xE0, + + 0xFD,0x5E,0x52,0x68,0xFD,0x62,0x67,0xA8,0xD5,0x6C,0x73,0x92,0x22,0x1E,0x01,0xE2, + + 0xD0,0x3B,0xDA,0xF6,0xA2,0x0B,0x66,0x56,0xAD,0x05,0x63,0x58,0x2E,0xFF,0x9B,0xAC, + + 0xCF,0x32,0xB8,0x5E,0x1B,0x28,0x6E,0x4D,0x37,0x38,0x2C,0x28,0xC4,0xDA,0x47,0xFC, + + 0x79,0x22,0x70,0xB6,0xE6,0xE6,0xCA,0xD2,0xAE,0x69,0x71,0x20,0xF8,0x3A,0x16,0x40, + + 0x75,0x18,0x97,0x6F,0x6B,0x9F,0xAD,0xE0,0x66,0x18,0xEB,0x97,0x3C,0xD6,0x74,0x32, + + 0xE7,0x19,0xDC,0x3A,0xE9,0x0B,0x51,0xDB,0xA8,0x6E,0xA4,0x1A,0xB7,0x29,0x6C,0x2A, + + 0x09,0xA9,0xE7,0x2F,0xBC,0x56,0x0C,0xCB,0xAD,0x89,0xAC,0x4D,0x46,0x48,0x65,0x2E, + + 0x0C,0x1E,0xB5,0xFC,0xF4,0x07,0x6D,0x1C,0xEF,0x65,0x08,0x9E,0xB4,0x45,0xAA,0xD9, + + 0x0E,0xCD,0x95,0xD7,0xB3,0x74,0x93,0xB1,0x1D,0x5F,0x83,0xC0,0x34,0xF1,0x57,0x66, + + 0xB7,0x87,0x39,0x4E,0xE6,0x44,0xCD,0x5B,0xEF,0x33,0x49,0xDE,0x94,0x43,0xDB,0x0F, + + 0xBA,0x86,0xA1,0x21,0x77,0xA0,0x6C,0x4E,0xA4,0x4C,0x36,0xDE,0xFE,0x2D,0xE7,0x4F, + + 0xCA,0x83,0xB8,0x4F,0x98,0x3E,0xC8,0xCE,0x39,0x33,0xE2,0x6D,0xE6,0x43,0xEF,0x5F, + + 0xCB,0x11,0x95,0x63,0x6A,0xCC,0xC0,0xCA,0xA7,0x60,0x20,0x51,0xA0,0xEF,0x27,0x5A, + + 0xD9,0x31,0x08,0x23,0xE1,0xD3,0xE9,0xA6,0xD9,0xBE,0x4F,0xD9,0x1C,0xFD,0x03,0xED, + + 0xFC,0x0E,0xBD,0x65,0x05,0x6C,0xBC,0xA7,0x79,0x7C,0x03,0x87,0x15,0x5E,0x1D,0x7C, + + 0x51,0xF1,0x0E,0x4D,0x0F,0x13,0x53,0x8E,0xE7,0xB2,0x4A,0xD9,0xDA,0x2D,0x7D,0x9B, + + 0xE9,0x2E,0xFB,0xA2,0x5E,0x52,0x77,0x63,0xED,0x7C,0xAF,0xC9,0x9F,0x92,0x42,0xF2, + + 0xA2,0x30,0x76,0xD9,0x5A,0x1F,0x4A,0xCB,0xE9,0x52,0x44,0xFE,0x97,0x97,0x4A,0xAD, + + 0x84,0xD7,0xB4,0xD4,0x5C,0x02,0x7B,0x72,0xAF,0x54,0xF8,0x8B,0x56,0x77,0xF1,0xC4, + + 0x4F,0x4B,0xF4,0x54,0xDD,0x87,0x75,0xA3,0xC6,0xD5,0x0A,0x94,0xB5,0x7C,0x6E,0xAF, + + 0x27,0x27,0x69,0x5A,0x5E,0xDD,0xDD,0xE0,0xCB,0xB3,0xC3,0xAE,0x97,0x7C,0x30,0xE8, + + 0xD7,0x05,0x80,0x4A,0x08,0xBB,0x25,0xC5,0x0D,0x98,0xC8,0x8B,0xB4,0x60,0x04,0x4A, + + 0x8E,0x11,0x0B,0x6F,0x59,0xAF,0x58,0x4B,0x5D,0xD2,0xAF,0xA0,0xBB,0x0D,0xF3,0x71, + + 0x45,0x62,0x22,0x87,0xD7,0x1B,0x6F,0x73,0x87,0x3B,0xA2,0x91,0x90,0x0F,0x2E,0x68, + + 0x67,0x30,0x8F,0x32,0xD6,0x1A,0x19,0x7A,0xD9,0xD8,0x59,0xCD,0x16,0x5D,0x40,0xFA, + + 0xAA,0x38,0xB6,0xAC,0x7A,0x67,0x48,0x94,0xA6,0x21,0x09,0x9C,0x1C,0xA9,0x16,0xFD, + + 0xC6,0x60,0xEC,0x22,0x87,0x46,0x5E,0xE3,0xA7,0x5C,0x69,0xFF,0x94,0xFE,0xF3,0xCC, + + 0x47,0x43,0xD2,0x32,0x3F,0xBA,0x0F,0x6F,0xBE,0x07,0xDA,0x90,0x67,0x55,0x17,0x4A, + + 0x97,0x32,0xE7,0xC1,0xDB,0x4B,0xDF,0xE8,0xC3,0xBB,0xDA,0x5E,0x7F,0xCF,0x5E,0x3D, + + 0x08,0xAB,0x04,0x00,0x04,0x58,0xB8,0xAA,0x2B,0xD4,0x69,0x03,0xF1,0x1F,0x52,0x3F, + + 0x7D,0x54,0x08,0x1D,0xB8,0xA0,0x46,0x3F,0x0D,0x0F,0xC0,0x24,0xBA,0x19,0x51,0x2F, + + 0xEB,0x21,0x93,0x31,0xB3,0x42,0x11,0x32,0xD9,0xF6,0x3D,0xA1,0x80,0x8F,0x59,0x3A, + + 0xAB,0x41,0xE2,0x75,0x9D,0x63,0x78,0xC1,0xC9,0xE2,0xB9,0x6C,0xAE,0x43,0xF8,0xBF, + + 0x20,0xA9,0xB1,0x59,0xFA,0xD4,0x52,0x9A,0xA6,0xDB,0x74,0x95,0xF1,0x24,0xC8,0xAC, + + 0x03,0xD1,0x07,0x49,0x1E,0xD5,0xFB,0x9F,0x65,0x1A,0xE2,0xF3,0xA4,0xEE,0x43,0xBD, + + 0x8A,0x02,0xA1,0x58,0xA1,0xD6,0x58,0x8E,0x7F,0x39,0xEE,0xE1,0x82,0x79,0x03,0x2E, + + 0xC0,0xF5,0xDF,0x48,0xDB,0xF7,0xB7,0x9F,0xB0,0x18,0xDD,0xF2,0x2C,0x27,0x01,0x4D, + + 0xF7,0x6B,0x03,0xC1,0x2B,0x57,0x46,0xDB,0x62,0xC5,0x49,0x38,0x23,0x6E,0x1C,0x7A, + + 0xF6,0xD4,0x32,0xEF,0x54,0x3B,0xAF,0x05,0xFE,0x7C,0x8A,0x5E,0xEA,0x0C,0x65,0x6B, + + 0x7F,0xF7,0x3B,0xFE,0x8D,0x38,0x45,0x89,0x23,0x49,0xC8,0x2D,0x5A,0x22,0xDF,0xE7, + + 0x74,0xAA,0x33,0xEE,0xC4,0x39,0x4F,0xBD,0x99,0x23,0xA3,0xD6,0x75,0x66,0x3C,0x84, + + 0x39,0x33,0x7E,0x50,0xE4,0xFC,0xC6,0x83,0xDF,0x73,0xD1,0xD0,0x92,0x64,0xF2,0xAB, + + 0x10,0x16,0xC4,0x40,0x01,0x9D,0x70,0x92,0x36,0x52,0x84,0x9E,0x5F,0xD0,0xFB,0xBA, + + 0x99,0x1C,0xA2,0x51,0xB9,0xFE,0x0F,0x82,0xDC,0x51,0x73,0x7E,0xA4,0x0A,0xB1,0x3F, + + 0x60,0xC5,0x76,0x44,0x2D,0x9F,0x9E,0x8E,0x5A,0xA0,0x1B,0x65,0x68,0xE2,0x95,0x16, + + 0xE8,0x61,0x68,0x86,0x38,0x5C,0x05,0xB3,0x0C,0x14,0xAA,0x65,0x18,0x3A,0x52,0x02, + + 0x29,0xB5,0x4F,0xD3,0x3F,0x9E,0x62,0x80,0xCD,0x5C,0x8A,0xE8,0x9A,0xB9,0xE3,0x70, + + 0x6A,0x32,0x65,0x8C,0x4D,0xB8,0x33,0x95,0x6C,0x5F,0xEB,0xED,0x19,0xCA,0x1F,0x0F, + + 0x69,0xB2,0x83,0x17,0x05,0xB8,0x63,0x80,0xC3,0x85,0xA3,0x74,0x7E,0xD5,0xC0,0xD3, + + 0x29,0x1E,0x9A,0xCD,0x5E,0x24,0x15,0x06,0xC3,0x1B,0xB7,0x60,0x72,0xB4,0x4C,0xD2, + + 0x21,0x2E,0x9A,0xC1,0x96,0xD5,0x56,0x16,0x21,0x7A,0xE6,0x51,0x84,0x88,0x63,0x98, + + 0xF3,0x58,0xAC,0xCD,0x7E,0x26,0xE4,0x07,0x85,0x19,0xEA,0xD5,0xFA,0x89,0xB7,0xD8, + + 0x0E,0x9E,0x6E,0xC0,0x89,0xF7,0x63,0x12,0x59,0x78,0xCB,0x97,0x0C,0xAA,0xE1,0x79, + + 0xF2,0x08,0xBE,0x2C,0xD5,0xB8,0x69,0x30,0x6C,0x48,0x5E,0xEC,0x38,0x8D,0x1F,0xAE, + + 0xE1,0x28,0x26,0x84,0xBB,0x6C,0x14,0x7A,0xEA,0x1F,0x56,0xA3,0x60,0x62,0x3D,0x7A, + + 0x7A,0xBE,0x6F,0x95,0x38,0x7A,0xC5,0x30,0xEC,0xBA,0xDB,0xAF,0xFC,0x8F,0xB9,0x68, + + 0x41,0x1F,0xD5,0xFF,0x9B,0xF6,0xA8,0x9D,0x68,0x56,0xE7,0xCF,0x5E,0x7F,0xB3,0x28, + + 0x6A,0x2E,0x7A,0xD8,0xA6,0xFC,0xF1,0x0B,0x0F,0x73,0x02,0x12,0x93,0x74,0xCE,0x1E, + + 0x2F,0x1B,0xEE,0xCD,0x5F,0xBD,0xA7,0x1A,0xFC,0x52,0x09,0x40,0x90,0x19,0xFB,0xB9, + + 0x1E,0x15,0x13,0xDC,0x2D,0x9E,0x5F,0x0A,0xB8,0x51,0x40,0x1E,0x7E,0xD3,0x47,0xB7, + + 0xC8,0x3F,0x62,0xCD,0xC6,0xBF,0x2C,0x1B,0x4B,0x50,0xE5,0x7A,0x10,0xB9,0xB6,0xF1, + + 0x68,0x5D,0x18,0xF9,0x1A,0xE6,0xCF,0x87,0x8E,0xCD,0x49,0x01,0xF5,0x9F,0x0E,0x27, + + 0x81,0x2E,0x2C,0xD1,0x95,0x81,0xC7,0x4C,0x6B,0x1E,0xE0,0x97,0x3E,0x99,0x77,0x37, + + 0x6F,0x43,0x22,0x78,0xB6,0x4F,0xCA,0x5C,0xAC,0xCF,0x1D,0xA3,0x84,0x0F,0x8D,0x71, + + 0x6E,0x02,0x05,0x91,0x85,0x5E,0x86,0x02,0xA9,0x6C,0xBD,0x35,0xA5,0xF8,0x61,0x24, + + 0xED,0x6E,0xC1,0x5F,0x55,0x14,0xAA,0x95,0x2E,0x0B,0x14,0x95,0x90,0x6F,0x22,0xF2, + + 0xA6,0x95,0xDB,0x4E,0x34,0x35,0xAD,0x81,0xE4,0x6A,0xA6,0xE5,0x47,0x68,0x31,0x4B, + + 0x90,0x2B,0x22,0x5F,0x73,0x36,0x9B,0x95,0x56,0x09,0xF5,0xE0,0x3D,0x00,0x4F,0x97, + + 0x84,0x84,0x3D,0x5A,0x74,0xD7,0xCB,0x80,0x9C,0x68,0x87,0xE5,0x6A,0x18,0x96,0x68, + + 0xE7,0x29,0xF2,0x78,0x10,0xC6,0xA4,0x54,0x26,0x09,0x4F,0x48,0xB7,0xC2,0x48,0x1A, + + 0x0E,0xE9,0x2F,0xF6,0xAE,0xE4,0x2C,0x13,0xA6,0xF8,0xFB,0x58,0xB6,0x51,0x10,0x5E, + + 0x7D,0xE4,0x83,0x0E,0x11,0xEC,0x4D,0x1F,0xAF,0xDA,0xF2,0x49,0x37,0xA0,0xAB,0x13, + + 0x46,0x2F,0x54,0xBF,0x74,0xCB,0x01,0x8A,0xFD,0x64,0xFA,0x59,0x36,0x33,0x61,0x42, + + 0x8E,0x8E,0x16,0x43,0x35,0xDC,0xB0,0x98,0xC5,0x43,0x5E,0x9E,0x5C,0x1A,0x69,0x4B, + + 0xC7,0x55,0xDA,0x52,0x0C,0xFD,0xFB,0x9D,0xD2,0xA2,0xFA,0x8D,0x89,0x46,0x45,0x8A, + + 0x8D,0x8D,0xF4,0x43,0x73,0xFE,0x54,0x99,0xDB,0x41,0x8D,0xF0,0x3F,0x68,0x60,0x59, + + 0x9F,0x8B,0x68,0x56,0x1A,0x9F,0xD8,0x9C,0xC8,0xA0,0x9C,0x77,0x3E,0x40,0x1A,0xD7, + + 0x4F,0x9F,0xA6,0x40,0x20,0xB4,0x1C,0x40,0xE5,0xB4,0x6D,0x4E,0xCB,0xBD,0x12,0xB6, + + 0x06,0x13,0x1D,0x66,0x94,0x3B,0x62,0x70,0x75,0xD7,0x43,0x16,0x98,0x91,0x24,0xB1, + + 0x4F,0x17,0x25,0xC1,0xA0,0xB4,0x1D,0xA5,0x65,0xDC,0xCB,0x76,0xE6,0xBF,0x13,0xB6, + + 0x85,0x9E,0x7A,0x75,0xCA,0xB3,0x35,0x4C,0x44,0xD2,0x51,0xB5,0xFD,0x9F,0x1C,0x62, + + 0xD9,0x2B,0x24,0xC3,0xDC,0xD4,0xD2,0x00,0x1B,0xDB,0xAE,0xE7,0xF8,0x5B,0x04,0xD5, + + 0xA4,0x9A,0x0D,0xD2,0x09,0x95,0xAA,0x10,0x57,0xDA,0xC6,0x05,0xB5,0x09,0x0D,0x01, + + 0x25,0xD2,0x2B,0xC3,0x0D,0xF6,0xBC,0x01,0xAB,0xD9,0x13,0x16,0x3C,0xE6,0x05,0xB1, + + 0x81,0x97,0x86,0xD6,0xC4,0xD9,0x3E,0x11,0xE1,0xD5,0x40,0xA8,0x1C,0x21,0xA1,0xCC, + + 0xBE,0x33,0x7D,0x9A,0x47,0xBE,0x0E,0xAF,0x68,0x88,0x56,0xB7,0x81,0xFB,0x09,0x6B, + + 0xB1,0x59,0xBE,0xFC,0x8E,0xDC,0x7C,0x5A,0x61,0x99,0x9E,0xBA,0x02,0xF9,0x04,0x8B, + + 0x64,0xA2,0xFC,0x8F,0x3E,0xF2,0x2D,0x43,0x0F,0x97,0x0D,0xBF,0x83,0xDA,0xC7,0x11, + + 0x2D,0x2B,0x97,0x74,0x11,0xB6,0x3A,0x84,0xAF,0xD0,0x18,0x7A,0xCE,0xA4,0x66,0x35, + + 0x8E,0x63,0xA6,0xF1,0x36,0xD0,0x76,0xF7,0x91,0x2C,0x51,0x71,0x15,0x4A,0x4E,0x24, + + 0x07,0x22,0x49,0x9E,0x82,0xB6,0xC5,0xE7,0x8E,0x2D,0x4C,0xA1,0x14,0x18,0x6F,0x35, + + 0x0F,0x41,0xCF,0x0D,0x6A,0x4D,0x8A,0xF6,0x09,0x2E,0xF6,0x1C,0x2C,0x55,0x43,0x20, + + 0x8A,0x20,0xA9,0xC0,0x3B,0x6B,0x91,0xE6,0x76,0x2F,0xC7,0x0E,0x17,0xFB,0x5E,0x32, + + 0x40,0x4C,0x24,0xF7,0x9C,0x61,0x28,0x88,0xE3,0x01,0xB9,0x77,0xD4,0x7C,0x2F,0x11, + + 0x6A,0x75,0xB2,0xE2,0x82,0x9E,0xB8,0x3E,0xCD,0x4C,0xE0,0x13,0xC0,0xCD,0x60,0xF2, + + 0x50,0xA9,0x29,0x3A,0xA3,0xDD,0xE4,0x20,0xD4,0x76,0x38,0x76,0x5C,0x3E,0x8F,0xD7, + + 0x13,0x00,0xD7,0x37,0x4C,0x88,0x67,0xD3,0x6D,0x4E,0x39,0x7F,0x44,0xCF,0x48,0xF7, + + 0x61,0x24,0x48,0x41,0x71,0xD4,0xD2,0x0F,0x63,0x85,0xC0,0x84,0x1A,0x64,0x30,0x74, + + 0x8C,0x07,0xF0,0x04,0x17,0x2A,0x59,0x83,0x89,0xEE,0xB0,0xB6,0xD5,0x90,0x39,0xC3, + + 0x83,0x71,0xB9,0xC7,0x97,0x66,0x7B,0xB1,0x61,0xCE,0x8F,0x72,0xDA,0x66,0xFE,0x50, + + 0x0E,0x0B,0xF1,0x85,0x64,0x28,0x3E,0x79,0xA8,0x82,0x49,0xF1,0x8F,0x7C,0xE1,0xF3, + + 0x63,0xAE,0xA7,0x0C,0x73,0x0C,0x82,0xE8,0x0C,0xAC,0x36,0x62,0x87,0x55,0x54,0x2E, + + 0xD4,0xA2,0x0A,0x00,0xBA,0xA4,0x8A,0x97,0xBE,0xA9,0xC4,0x18,0x59,0xC2,0x0A,0xF8, + + 0x52,0x1A,0x7C,0x09,0xC0,0x40,0x6B,0x20,0x25,0x78,0x78,0x5A,0x58,0xBD,0xBD,0x7B, + + 0xE2,0xAE,0x6F,0x3A,0x2A,0xA6,0xA7,0xCA,0x6A,0x7B,0x0F,0x99,0x5C,0x2B,0x2A,0x56, + + 0xCC,0xF8,0xA2,0x08,0x56,0xA7,0xFD,0x99,0xA6,0x41,0x92,0x6C,0x5E,0x68,0x14,0xCA, + + 0x0F,0x80,0x48,0x3E,0x5A,0x6D,0x68,0x68,0xCE,0x5B,0x9A,0x78,0x5F,0x69,0xA5,0xB8, + + 0x40,0x4E,0x44,0xAF,0x18,0x66,0x0D,0x5A,0x4A,0xE5,0x57,0xE9,0x86,0xCF,0x35,0xC7, + + 0x60,0xF9,0xB3,0x3F,0xD8,0xF0,0x05,0x63,0xCB,0xE4,0xA3,0xF9,0x83,0x79,0xE4,0xBF, + + 0x04,0x67,0x86,0x76,0x77,0x34,0x2C,0x84,0x63,0x60,0x1D,0xB4,0xD3,0xCB,0xAD,0x97, + + 0x80,0x50,0xB6,0x96,0x2D,0x11,0xBE,0x52,0x71,0x9C,0x9C,0x48,0xF0,0x33,0x01,0x95, + + 0x38,0x56,0x81,0xD1,0x57,0xCC,0x28,0x90,0x64,0x4D,0xB5,0x5D,0xF0,0x89,0x45,0x95, + + 0x4C,0x52,0x0D,0x85,0xA1,0x31,0x8D,0x1E,0x16,0x03,0x1E,0xB9,0x0C,0xD2,0x67,0x31, + + 0xBE,0x54,0x04,0xD4,0x37,0x30,0x94,0xFD,0xC6,0xFF,0xD4,0xE4,0x72,0x74,0x33,0xA3, + + 0xC9,0xBD,0xCC,0xE0,0x00,0x3A,0x23,0x01,0xDC,0x07,0xDC,0xF4,0x73,0x75,0xAD,0x4B, + + 0x80,0xC0,0xC3,0xFA,0xF9,0x74,0xA8,0xF9,0xC0,0x49,0xD5,0xE5,0xF2,0x76,0x3F,0x31, + + 0xE7,0x9C,0x97,0xD0,0x14,0x76,0xF2,0x8A,0x3E,0x8B,0xDD,0xF5,0xF3,0x77,0xF3,0x76, + + 0x2C,0x75,0x96,0xCC,0xB8,0x3E,0x2B,0x99,0xEC,0x47,0x02,0x5F,0x54,0xA5,0xAA,0xEA, + + 0xA7,0x58,0x8A,0x1B,0x18,0xAE,0xA6,0x9C,0x80,0x3D,0xFE,0xFC,0x64,0xF2,0x97,0x82, + + 0x2C,0x4E,0x00,0x3B,0x59,0xE1,0xAF,0x5A,0x4B,0x4A,0xC1,0x89,0x13,0x3B,0xB0,0x82, + + 0x0A,0x9E,0x3B,0x62,0xFA,0xC8,0x8E,0x4A,0x65,0x66,0x1B,0x5F,0x7B,0x73,0x6D,0x26, + + 0x95,0x18,0xA6,0xAC,0x70,0x31,0x6D,0xB6,0x6C,0xAC,0xD6,0xEC,0x7A,0x7C,0xB9,0x87, + + 0x96,0xE1,0x30,0x5E,0xE6,0x82,0x0E,0x12,0x90,0xF6,0xDE,0xFC,0x7B,0x7D,0x45,0xE7, + + 0x5C,0x6B,0x6B,0x5F,0xBB,0x34,0xE7,0x18,0x55,0x8E,0xD7,0xED,0xFA,0x7E,0xE4,0xB7, + + 0x7E,0x11,0xF7,0x23,0xDB,0x33,0xA2,0x61,0x80,0x20,0xDF,0xFD,0xFB,0x7F,0x00,0xF3, + + 0xE4,0x00,0x44,0x21,0x15,0xC0,0x8C,0xAB,0x60,0xF4,0x8E,0x03,0x1E,0x81,0x28,0xE3, + + 0xDD,0xA1,0xA9,0xC9,0xF6,0xA5,0xDC,0xC1,0xE6,0x4A,0x86,0x13,0x1C,0xA0,0x89,0x89, + + 0xEF,0x16,0x5B,0x05,0x9C,0xED,0x91,0x2D,0x48,0x4F,0xE9,0x23,0x9E,0xA3,0x77,0x1C, + + 0xD7,0xCD,0xBC,0x65,0x1B,0xC6,0x3D,0xB4,0xE1,0xB4,0xE1,0xD1,0x57,0xEB,0x3E,0xD9, + + 0x16,0x2B,0x98,0xC2,0x4A,0x10,0x57,0x63,0x2D,0xB0,0xD0,0x09,0x82,0x3B,0xDE,0xA3, + + 0xEF,0xD5,0xB8,0x4A,0x01,0x10,0x9B,0x89,0xC5,0x39,0xAD,0xD6,0xA0,0x85,0x02,0xB0, + + 0x62,0x29,0x71,0xE7,0x8E,0xE7,0x32,0xA5,0x54,0xC5,0x56,0x98,0xBD,0x99,0x17,0x61, + + 0x02,0x91,0x20,0x68,0xDC,0xE5,0x41,0x54,0x6B,0xCA,0xA7,0x98,0x97,0x4C,0x43,0xAA, + + 0xDA,0x37,0xDB,0xDE,0x50,0x29,0x36,0xAA,0xA5,0x8C,0x76,0x4C,0x1D,0xF8,0x9E,0x78, + + 0xFA,0xEC,0x80,0xCE,0x41,0x21,0x9E,0x96,0xA6,0xAD,0xC2,0xBC,0x5C,0x91,0x43,0x54, + + 0x2D,0xEF,0xA0,0x45,0x11,0xC9,0x26,0xD8,0x48,0x67,0xCB,0x4D,0x9D,0xE8,0x13,0xE4, + + 0x0E,0x85,0xBB,0x55,0x11,0xA3,0x03,0xC8,0x6E,0xAE,0x81,0xDD,0x5F,0xE3,0x5D,0x14, + + 0xFF,0x50,0x64,0xCE,0xF7,0xF4,0x89,0x4D,0xEF,0x33,0x0F,0xEA,0x35,0x93,0xC1,0xFF, + + 0xDA,0x93,0xAE,0x2D,0x08,0xC1,0xEA,0xBD,0x4D,0x38,0xFA,0x7E,0x79,0xED,0x3A,0x5F, + + 0x03,0xED,0xA1,0x3E,0xD5,0xA5,0x1B,0xA9,0x48,0x3B,0xB5,0x4B,0xD6,0xEF,0x16,0xA8, + + 0x57,0x5B,0x89,0x5B,0x9E,0xFF,0x7F,0x3C,0x4E,0xC1,0xFB,0x7F,0xDF,0xEF,0x15,0x60, + + 0xF9,0x04,0xF4,0xF5,0x2C,0x3A,0xD0,0x51,0xC7,0xB5,0x3D,0xD4,0xD7,0x5D,0x0B,0x70, + + 0xC5,0x40,0x18,0xF6,0x3D,0x61,0xDB,0x41,0xC6,0x8C,0x87,0x56,0x35,0x7A,0x5D,0xB1, + + 0x94,0x4E,0x62,0x79,0x55,0xD4,0x08,0x24,0xC0,0xAF,0x21,0xF6,0xD0,0xE9,0xD6,0xB7, + + 0x6C,0x9C,0x02,0x47,0x34,0x12,0xDE,0xF7,0x46,0xEE,0x08,0xB5,0xF1,0x78,0x0C,0x44, + + 0xDA,0xD5,0x9A,0xC0,0xD7,0x37,0xF0,0x13,0xD9,0xD7,0xF4,0xE6,0x76,0xF4,0xC0,0x90, + + 0xA4,0x41,0x94,0xA8,0x77,0x3F,0x87,0xCD,0x98,0xDB,0xFC,0xF6,0x77,0xF5,0x89,0x43, + + 0x5A,0xB6,0xCA,0x34,0x3A,0x4B,0x25,0x09,0x1D,0x03,0xF5,0xE7,0xF6,0xF6,0x8F,0xCC, + + 0x69,0x3C,0x3A,0x55,0x6A,0x08,0x15,0x75,0x1B,0x96,0xFD,0xF7,0xF7,0xF7,0x5F,0xAD, + + 0x8D,0x89,0x9E,0xEE,0x8C,0xB0,0x51,0xEE,0xCF,0xC5,0x54,0x48,0x6C,0xB7,0x10,0x9C, + + 0x67,0xDD,0x57,0xEC,0xB3,0xDC,0x0C,0x8B,0xE9,0x76,0xF4,0x49,0xDE,0xF4,0x5F,0xD8, + + 0x0F,0x85,0xD6,0xFD,0x32,0xDF,0x54,0xFA,0x4F,0x9B,0xD7,0xEF,0xF2,0xF7,0x77,0x9F, + + 0xE7,0xFF,0xD6,0xED,0x33,0xDE,0x9F,0xC8,0x4E,0x78,0xF5,0xC0,0x5E,0xFD,0x00,0xC2, + + 0xCF,0x33,0x9E,0x4C,0x1F,0xCE,0xDE,0xD5,0x05,0xCB,0xF6,0xEE,0x7E,0xFC,0x89,0x2B, + + 0xF5,0x8D,0x02,0x5E,0xC3,0x9D,0x24,0xFB,0xCC,0x93,0xFE,0xFE,0x7F,0xFD,0x05,0xD1, + + 0x78,0x2A,0xBD,0xCE,0x1D,0xFF,0x73,0x69,0xEF,0xB1,0xF7,0xEF,0xFE,0xFE,0x11,0x41, + + 0xA9,0x9F,0x43,0x9D,0x3C,0x12,0x4E,0x3D,0x13,0xD9,0xFF,0xFF,0xAF,0xB9,0x80,0x00, + + 0x0C,0x4C,0x04,0x00,0x18,0x2E,0x6F,0xD8,0xC1,0xBF,0x43,0xCC,0x56,0xBD,0x51,0xEF, + + 0xE0,0xCE,0x90,0x11,0x15,0x01,0x47,0x32,0x32,0x41,0x45,0x36,0x2A,0x61,0xB6,0x85, + + 0xC0,0xB8,0x35,0x67,0xF1,0x38,0xEA,0xA5,0xC4,0x54,0x6B,0x2D,0x2D,0xAD,0x60,0xEA, + + 0xEA,0x06,0xE1,0x97,0x90,0x5B,0xC6,0x31,0xB6,0x4F,0xC2,0xB7,0xAE,0x63,0x38,0xC2, + + 0x01,0xE2,0x00,0x44,0x62,0xD1,0x22,0x80,0x06,0xCF,0xA8,0xE6,0x57,0x5D,0x31,0xB8, + + 0x09,0xCE,0xEE,0x59,0x97,0x81,0x5A,0x5E,0xB5,0x30,0x50,0xB1,0xF2,0xEF,0x79,0x31, + + 0x9A,0x0F,0xC4,0xC1,0x92,0xB7,0x7A,0x8F,0x7D,0x42,0xA9,0x42,0x71,0x60,0x4D,0xB9, + + 0x89,0xCA,0x48,0x52,0xEC,0x23,0xAE,0x2E,0x7E,0xBB,0x22,0x97,0x72,0xED,0xA9,0xE0, + + 0x08,0xF3,0xD8,0x09,0xBB,0x53,0xD2,0x2C,0x3E,0x53,0x49,0x6C,0x5E,0x28,0xE5,0xE2, + + 0x62,0x99,0xEA,0xE1,0x19,0xF2,0xA5,0xCE,0xCB,0x43,0x9A,0xC1,0x59,0xB2,0x03,0x7B, + + 0x2F,0x1A,0xC3,0xF4,0x98,0xB1,0xD3,0x57,0x2F,0x5A,0xF2,0xD4,0x58,0xF1,0x24,0xE8, + + 0xD1,0x0E,0xEA,0x99,0x9D,0x3D,0xFD,0xC9,0x8D,0x44,0xFB,0xB9,0xDD,0xB8,0x1A,0xA7, + + 0x0C,0x0C,0x19,0x44,0x9D,0x2B,0xF9,0x06,0x9F,0x42,0xAD,0x8E,0x87,0xB1,0x58,0xDC, + + 0x4B,0xA5,0xBA,0x82,0xF4,0x6F,0xF9,0x70,0x97,0x7D,0xBA,0x3C,0x75,0xE6,0x16,0x29, + + 0xEE,0x05,0x73,0xFF,0xB4,0x62,0x3B,0xEF,0x36,0x0F,0x7C,0xE9,0xD6,0x98,0x71,0xB6, + + 0x70,0x90,0xCB,0xE4,0x44,0x20,0x78,0x75,0x13,0x3F,0xDF,0x9F,0xFF,0xD3,0x04,0x80, + + 0x78,0xF8,0x84,0x7C,0xB2,0xCB,0xAB,0x94,0x87,0x42,0xEC,0x83,0x13,0x58,0xDE,0xB0, + + 0x26,0xE9,0x0C,0x1E,0x4A,0x38,0xA6,0x38,0x24,0x58,0xE4,0x93,0x12,0x69,0x4F,0x28, + + 0x82,0x11,0x85,0x79,0x10,0x70,0xAE,0x15,0x07,0x42,0xED,0x82,0x93,0x18,0x02,0x1D, + + 0xDA,0x02,0xD6,0x95,0xCE,0x33,0x1C,0x33,0xE8,0xBE,0xE5,0x92,0x10,0x7C,0xF3,0xC1, + + 0xAF,0x18,0xC4,0xFC,0xCE,0x64,0xBB,0x0E,0xE7,0xF3,0x60,0x9B,0xD1,0xC9,0xAA,0x21, + + 0xE9,0x55,0x49,0x50,0x33,0xA4,0xDD,0xF7,0x14,0x51,0xBC,0xB0,0x4E,0x7A,0x2D,0xDF, + + 0x64,0xE2,0x05,0xC5,0xC2,0xC3,0x73,0xEC,0x66,0xF2,0x11,0x60,0xB1,0x85,0x13,0x43, + + 0xA7,0x9A,0xEB,0xDC,0x37,0x93,0x82,0xE1,0x64,0x50,0x4D,0xEB,0xE3,0x83,0xD9,0x89, + + 0x2E,0x78,0x5D,0x0E,0x3E,0x78,0x4C,0x47,0xCB,0x5C,0xF6,0xE8,0x0C,0xF5,0x6E,0x58, + + 0xE7,0x92,0x74,0x94,0xC4,0xF6,0x26,0xC8,0x24,0x50,0xE6,0x3E,0x7A,0x9F,0x19,0xFB, + + 0x43,0x18,0x54,0x65,0xBE,0xE7,0xEC,0x2B,0x68,0x9B,0xEF,0x2F,0xF9,0x22,0x0D,0x7B, + + 0x2B,0x33,0x04,0xFD,0xA9,0x3D,0x9B,0xBD,0xE1,0x55,0xA7,0xCD,0xB5,0x72,0x38,0x56, + + 0xC1,0xEA,0xC7,0xCB,0x9B,0x59,0xE6,0x5A,0x44,0x19,0xD3,0x2A,0x90,0x30,0x2D,0x2B, + + 0xCF,0xB2,0x23,0x36,0xBE,0x3A,0xB1,0x0A,0x6D,0x5D,0x76,0x5F,0x04,0x7C,0x19,0x52, + + 0xBA,0xB1,0x38,0x49,0xBA,0xAF,0xA1,0x4C,0x6F,0x59,0x27,0x69,0xBA,0xD6,0xF9,0x28, + + 0x43,0x4F,0x27,0x7E,0xBD,0x5F,0x08,0x27,0x12,0x21,0x1F,0xFD,0x8B,0xF2,0x7E,0x1F, + + 0x54,0x2B,0xFF,0x86,0x67,0xA0,0x50,0x62,0x59,0x4B,0xE9,0xA3,0xA9,0x21,0xD7,0x16, + + 0x05,0x59,0x68,0x12,0x63,0xBA,0x67,0x32,0x36,0xCD,0x42,0x3E,0xB0,0xF3,0x04,0x03, + + 0xEF,0xA6,0x7E,0x07,0xE3,0xA4,0x35,0xC1,0xFB,0xC6,0x4B,0xAF,0x21,0x21,0x96,0xEE, + + 0x95,0xE0,0x69,0x69,0x72,0xB3,0xE6,0x33,0xB2,0xCB,0x33,0x57,0xC5,0xE5,0x9F,0xBC, + + 0x00,0xC4,0x0D,0x3C,0x93,0xA3,0x98,0xD1,0xC3,0x83,0x4F,0x3D,0xAF,0x6E,0x13,0xAD, + + 0xF0,0xC7,0xE9,0x49,0x0F,0x31,0xB8,0x72,0x37,0x30,0xCA,0x89,0xD5,0xAD,0xDB,0x31, + + 0x39,0x39,0x09,0xE4,0xB2,0x72,0xD9,0xC0,0xB9,0xB5,0x75,0x96,0x75,0xE4,0xED,0x66, + + 0x66,0x78,0x68,0x4C,0x8B,0xE9,0x39,0xF7,0xC7,0x56,0xD9,0x15,0x60,0x82,0xC2,0xBC, + + 0x8B,0x8F,0x1D,0xF8,0x49,0xA1,0xF2,0x2E,0xDE,0x73,0xBE,0x59,0x3F,0x97,0xBA,0x1E, + + 0x10,0x0B,0xF0,0xF1,0xBE,0xAD,0x3A,0xC6,0xCC,0x8B,0x9A,0x0A,0x3E,0x21,0x8B,0xA9, + + 0x53,0x65,0xA2,0x8D,0x95,0x47,0x13,0xD3,0xCC,0x31,0xCB,0x2D,0x2B,0xEC,0xBB,0xF9, + + 0x21,0xCA,0x50,0xF2,0xBC,0x10,0xBB,0x87,0xFE,0xA9,0xC3,0x18,0xBE,0x73,0x99,0xCE, + + 0x02,0x30,0x94,0x08,0xB8,0xEE,0xC5,0x62,0x48,0xCC,0xCA,0xBE,0x83,0x93,0x68,0x63, + + 0x09,0x8D,0x35,0x5A,0x19,0xAD,0x7A,0x42,0x30,0xDD,0x47,0x23,0xA0,0xEB,0xA3,0x5B, + + 0xCC,0xCC,0xE1,0x1E,0x1B,0x89,0x60,0x54,0xD6,0x8C,0x4A,0x3E,0x7D,0x31,0x3C,0x7F, + + 0x00,0x8D,0xF8,0x2D,0x60,0xED,0x93,0xD9,0x4A,0xC8,0x73,0x7D,0x2A,0xE0,0x80,0xE0, + + 0x65,0x10,0xA8,0xF1,0x57,0xCF,0x80,0xC0,0x05,0x28,0xCD,0x24,0x7D,0x96,0x76,0x93, + + 0x86,0x97,0xEC,0x97,0x0A,0xB5,0x54,0x95,0xC4,0x58,0xDC,0xF7,0xB9,0x7A,0x5D,0x01, + + 0xA1,0x63,0xDD,0x85,0x43,0x19,0x2D,0xA6,0xE0,0xF2,0x8D,0xF7,0xF0,0xFD,0xA5,0xAF, + + 0x06,0x95,0xF2,0x97,0xC6,0xB5,0xB2,0xD3,0xE9,0x93,0xB9,0x55,0x77,0xF9,0x1A,0xF0, + + 0xA3,0x82,0x99,0x42,0x76,0x9E,0x49,0xA4,0xC4,0x9A,0x0B,0x62,0x76,0x65,0x35,0xC6, + + 0xAA,0xF6,0x53,0x46,0x16,0x85,0xDB,0xFB,0xB7,0x85,0xEF,0xC9,0x6F,0xB7,0x5A,0x9D, + + 0x57,0x4A,0x75,0x99,0x4F,0x6A,0x01,0xC7,0x32,0xC6,0x42,0xEF,0xF0,0xF6,0xC6,0x76, + + 0x72,0x89,0xEF,0x37,0xCB,0xB1,0x5A,0xFE,0x60,0x70,0xFD,0xCF,0x72,0xF0,0x6E,0x1D, + + 0x4F,0x38,0x9C,0x71,0xCB,0xFA,0x32,0x68,0xC0,0xD5,0x50,0xCC,0x1D,0xE8,0x74,0x9B, + + 0x8E,0xFC,0xF5,0x9E,0x42,0xB9,0xBE,0xBB,0xEE,0xBC,0x1A,0xDC,0x3E,0x86,0x5F,0x09, + + 0xAD,0xC2,0x27,0x05,0xC7,0xBE,0x2D,0xFB,0xCD,0xBA,0xAF,0x45,0x7E,0xD2,0x15,0x79, + + 0x92,0x9F,0x74,0x1D,0xBB,0xFB,0x07,0xCB,0xF4,0xD2,0xC7,0xDD,0xBC,0xEB,0x1B,0x39, + + 0xF6,0x48,0xEE,0x6B,0xDF,0xB3,0xDE,0x4C,0xEB,0xFB,0x1E,0x4D,0x78,0x9C,0x86,0x50, + + 0x0D,0x4B,0xD6,0x0E,0xE0,0xB2,0x6D,0x88,0x90,0x9F,0x6E,0xB8,0xD5,0x06,0x44,0x3A, + + 0x32,0xDE,0x77,0x4D,0xBB,0xD4,0xA8,0xEE,0xE8,0xDE,0x8A,0x6B,0xBE,0xD4,0x10,0xA8, + + 0x45,0x37,0x8F,0x9B,0xCE,0x32,0x7F,0xC3,0x13,0xCF,0xF9,0x7B,0xFF,0x6E,0xDF,0x15, + + 0x87,0x07,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0xE0,0xB2, + + 0xA5,0x86,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0xA9,0xA3, + + 0x5F,0x5D,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0xE9,0x11, + + 0x04,0x04,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x12,0x08, + + 0xED,0x49,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0xCA,0x08, + + 0x40,0x45,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0xEB,0xBA, + + 0x0D,0x4D,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x7F,0xE4, + + 0xA8,0x49,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x74,0x46, + + 0x8A,0xEF,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x8E,0x14, + + 0x21,0x80,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x95,0xC7, + + 0x0A,0xE9,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0xA5,0x33, + + 0x26,0x34,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x96,0xCE, + + 0x82,0xE3,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0xA6,0x3A, + + 0xAE,0x3E,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x05,0x0D, + + 0xA8,0x8B,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x9F,0xBD, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x3A, + + 0x81,0x87,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x55,0x96, + + 0x45,0xAB,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0xC9,0xA0, + + 0x82,0xE2,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0xB9,0x55, + + 0x2F,0x78,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x24,0x8E, + + 0x0C,0x19,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x9A,0xA8, + + 0x23,0xC5,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0xFC,0x03, + + 0x0B,0x8D,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x5B,0xC4, + + 0x62,0xC7,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x8F,0x95,0x80,0x00, + + 0x0C,0x4C,0xF9,0xE6,0x92,0x08,0x0A,0x28,0x63,0x78,0x15,0xE2,0xBA,0x2C,0x51,0xEF, + + 0xE0,0xCE,0xF0,0x76,0x50,0x31,0x30,0xCF,0xB6,0x03,0x4D,0xB0,0x55,0x90,0xB6,0x85, + + 0x80,0xD1,0x25,0x67,0xD3,0x5D,0xCC,0x23,0x3B,0xD9,0x61,0x63,0x7A,0x99,0x60,0xEA, + + 0x03,0x27,0xF1,0x97,0x92,0xC5,0x1D,0xD8,0xBA,0x47,0x46,0x34,0xD7,0x23,0xD0,0x1B, + + 0xFF,0xB8,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x30,0xD0, + + 0xE3,0xFA,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x7E,0x91, + + 0x8E,0xAD,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x29,0x15, + + 0x03,0x0A,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x0A,0xF5, + + 0x89,0xD3,0xD8,0xE7,0xBB,0x33,0x49,0x28,0x37,0x48,0x05,0x13,0x48,0x2A,0xE5,0xE2, + + 0xDE,0x56,0xCA,0x6A,0x3A,0x56,0xDD,0xD0,0x43,0x94,0x5A,0x38,0x25,0x92,0x8C,0x7B, + + 0x2B,0x6F,0xC3,0xF9,0x90,0x31,0xC8,0x6B,0xCE,0x6A,0x13,0x10,0x24,0x5A,0x55,0x3B, + + 0x5C,0x10,0x0B,0x1D,0xAF,0x45,0xE1,0x31,0x34,0x84,0x9A,0xFB,0x7B,0x27,0xBB,0x6F, + + 0xAB,0x86,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x32,0xA6, + + 0xB6,0xF5,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0xEC,0xA6, + + 0x3F,0xA6,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0xB4,0xDB, + + 0x8E,0x0B,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0x05,0x77,0xD0,0x7C,0x3C,0x24,0x68,0xA2,0x79,0xCF,0xF5,0x77,0xDE,0xB0, + + 0x26,0xE9,0x27,0x7C,0x75,0x5D,0xE6,0x38,0x94,0x92,0xA3,0xEA,0x8C,0xF3,0x4F,0x28, + + 0x82,0x11,0xE4,0xFE,0x65,0xAF,0x4C,0x25,0x1D,0x93,0x7D,0x06,0xD4,0xAE,0x02,0x1D, + + 0xDA,0x02,0x59,0xCB,0x9F,0xEF,0xE7,0x59,0xE7,0x9E,0x85,0xBC,0xB1,0x78,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xD9,0x89, + + 0x2E,0x38,0xEF,0x67,0xD3,0x8C,0x57,0xFC,0x49,0x48,0x01,0x2E,0x79,0x1B,0x36,0x70, + + 0x27,0xD6,0x0E,0x5A,0xAB,0x3A,0xE3,0x5A,0xE9,0x86,0x16,0x79,0xD8,0xF3,0xA9,0x0B, + + 0xAB,0xFC,0x24,0x97,0xD3,0x4E,0x77,0xE8,0x05,0xD1,0xAD,0x4F,0xDC,0x7C,0x55,0x6B, + + 0x0A,0x1D,0x6C,0x66,0x50,0x9C,0x25,0x51,0xE7,0x94,0x70,0x5F,0x7B,0x33,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0xFF, + + 0x04,0x0D,0xE0,0x39,0x1C,0xCC,0x50,0xE2,0x8A,0x4B,0xC0,0xF9,0xE3,0xAC,0x76,0x0A, + + 0xDC,0x2A,0x0F,0x81,0x7E,0x07,0xB5,0xC2,0x4D,0xCE,0x9E,0x3A,0xD9,0x3A,0xD9,0x0B, + + 0x5B,0x1D,0x89,0xC5,0x40,0x64,0xCB,0xC1,0x46,0xCA,0xC7,0x34,0xC8,0xA6,0x2E,0x31, + + 0xEE,0x73,0x29,0xE6,0x57,0xE3,0xE4,0x31,0xBE,0xC3,0x99,0xCA,0x95,0xAD,0xDB,0xA0, + + 0xAA,0x79,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x22,0xEF, + + 0x85,0xCD,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x19,0x38, + + 0x88,0xE4,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0xF4,0xB1, + + 0xA3,0x7A,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x21,0xFB, + + 0x94,0x88,0x98,0xFD,0xCA,0x07,0x69,0x68,0x33,0xC8,0xC2,0x08,0xBE,0x8B,0x2A,0x46, + + 0x09,0xF1,0xD4,0x84,0xF6,0x6C,0x67,0xC3,0xCD,0x52,0xCA,0xE1,0xBE,0xAB,0x7D,0x08, + + 0x73,0xCA,0x44,0xFE,0x46,0xBA,0xE8,0x6B,0xCA,0xEA,0x03,0x98,0xF2,0xA6,0x69,0x3F, + + 0xA9,0x8B,0xD5,0x28,0xF6,0x0E,0x3B,0xC6,0xCD,0x10,0x3B,0x87,0x0A,0x56,0xBD,0x42, + + 0x20,0xCA,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x1A,0x85, + + 0xE0,0xCC,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x91,0x8D, + + 0x2C,0xC2,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x13,0x7C, + + 0xAB,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x28,0x85, + + 0x85,0x18,0xAA,0x34,0x17,0x70,0x54,0x62,0xAA,0x5B,0xAF,0xD4,0xD7,0xF6,0xBB,0x62, + + 0x2D,0x9E,0x8C,0x86,0x81,0x66,0xAF,0xC0,0xC6,0xD7,0xC4,0x34,0x70,0x9B,0x27,0x61, + + 0x26,0xDA,0xFF,0xDD,0x03,0xCD,0xCB,0x41,0x66,0x9A,0x3D,0xCE,0x57,0x97,0x4D,0xD7, + + 0xD1,0x9C,0x18,0x28,0x68,0xCE,0x35,0xFF,0x46,0xD5,0x85,0x67,0x02,0xFC,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x46,0x4A, + + 0xE2,0x13,0x09,0xD0,0x89,0x64,0x3A,0x2D,0xCD,0x50,0x8E,0x7E,0x87,0xF7,0xA7,0x6A, + + 0x25,0x96,0x3E,0x80,0x2D,0x4D,0x98,0x4A,0x65,0xD6,0x3E,0xBF,0xFF,0xF1,0x59,0x69, + + 0x2E,0x92,0xCF,0x4D,0x3A,0x4F,0xB7,0x49,0x6E,0xF2,0x18,0xD1,0x21,0xB8,0x9B,0xE9, + + 0x0E,0x56,0xAA,0x85,0xA9,0x0F,0x5F,0x7B,0x23,0x50,0x6B,0x4F,0xF5,0xF4,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x46,0x75,0x80,0x00, + + 0x0C,0x4C,0x04,0x44,0xCA,0x26,0x11,0xD4,0x40,0xBD,0xA2,0x62,0xC2,0xDD,0x51,0xEF, + + 0xE0,0xCE,0xE8,0x54,0x0C,0xAA,0x41,0xB1,0xA0,0x80,0x1A,0x73,0x7F,0xBD,0xB6,0x85, + + 0x8C,0x80,0x09,0x39,0x71,0x2D,0xBD,0xA4,0xE1,0xC0,0x3A,0x5F,0x05,0x79,0x60,0xEA, + + 0xEA,0x06,0x0D,0xF7,0x13,0x2B,0xE3,0xB9,0xA2,0x41,0x4D,0x6B,0x42,0x5C,0xE8,0xE2, + + 0x85,0x23,0x00,0x44,0x62,0x68,0x90,0x65,0x52,0x05,0xD0,0x64,0x52,0x64,0x4D,0x4A, + + 0x17,0xB1,0x60,0xF7,0x6C,0xA5,0xB0,0xC3,0xC6,0x02,0xD8,0x74,0x53,0x65,0xD1,0x5F, + + 0x92,0xF2,0xB1,0x83,0x38,0x67,0xF2,0x69,0x1E,0x76,0xD1,0x65,0xD2,0x66,0xCC,0x97, + + 0x69,0x4B,0x09,0x55,0xE3,0x6B,0x99,0x75,0x30,0x0B,0xD9,0x75,0xD3,0x67,0xA9,0xE0, + + 0x08,0xF3,0x0B,0x7E,0xBB,0x2E,0xC0,0xDE,0x7B,0x2A,0xEC,0x37,0x8C,0xFC,0xE5,0xE2, + + 0x62,0x99,0xF2,0x9E,0x18,0x4B,0x40,0xB8,0x2F,0x86,0xFB,0x9C,0x8F,0xD6,0x03,0x7B, + + 0x2F,0x1A,0xCB,0x9F,0xFB,0xD5,0x29,0x1D,0x2F,0x58,0xCD,0x22,0xDC,0x24,0x24,0xE8, + + 0xD1,0x0E,0xB3,0xCD,0x76,0x24,0x21,0xD1,0x8F,0x84,0xA5,0x8E,0x90,0xEC,0xB2,0x0E, + + 0xA0,0xF7,0xB2,0x8A,0xB0,0x6D,0x26,0x95,0x6A,0x0E,0xD2,0x6C,0x5A,0x6C,0x70,0xA7, + + 0x0D,0x0D,0xCA,0x5C,0x1B,0x2D,0x9A,0x78,0x3B,0xB8,0xDA,0x7C,0x5B,0x6D,0xC7,0xCD, + + 0x8A,0x9F,0x53,0x4D,0x9A,0x2E,0x53,0x51,0x2B,0xB1,0xD3,0x6D,0xDA,0x6E,0x58,0x66, + + 0x9B,0x4D,0xCB,0x5D,0x9B,0x2F,0x5A,0xFD,0xCB,0xDE,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0x44,0x80,0x78,0xBD,0xC9,0x80,0x66,0x70,0xE2,0xE2,0xD6,0x3C,0xDE,0xB0, + + 0x26,0xE9,0x77,0x10,0x35,0xF9,0x26,0x52,0x1A,0x55,0x9C,0x8C,0x90,0x8E,0x4F,0x28, + + 0x82,0x11,0x78,0x7E,0x43,0xCD,0xE3,0x23,0xE1,0x2A,0xE1,0x58,0xCE,0x30,0x02,0x1D, + + 0x92,0xD1,0xB7,0x6A,0x46,0x71,0x66,0x4E,0x96,0x5F,0x5D,0xB5,0x81,0x86,0x7F,0x86, + + 0x80,0x5A,0xC4,0xC4,0x32,0x34,0x24,0xC6,0x80,0x12,0xD4,0xE4,0x72,0x74,0xEB,0xD9, + + 0xF3,0x45,0xCC,0xD4,0x33,0x35,0x5C,0x86,0x47,0x1B,0xDC,0xF4,0x73,0x75,0x31,0xE5, + + 0x76,0x06,0xC5,0xC5,0xB2,0x36,0x55,0xA7,0x40,0x57,0xD5,0xE5,0xF2,0x76,0x6A,0xDC, + + 0x24,0xB0,0xCD,0xD5,0xB3,0x37,0x2B,0xB7,0x45,0x15,0xDD,0xF5,0xF3,0x77,0xDC,0x84, + + 0x1B,0xDA,0x06,0x9E,0x3E,0x78,0xD6,0xA9,0x33,0x43,0x97,0x28,0x78,0xE9,0x6E,0xD8, + + 0x27,0x14,0x4E,0x9C,0x43,0x3D,0xA1,0x4E,0xEB,0x51,0x8D,0x41,0x69,0x37,0xC5,0xFF, + + 0x8B,0x45,0x2A,0x09,0xBC,0xB7,0x55,0xD7,0x0F,0x4A,0x20,0xA4,0xFE,0x7A,0x05,0x91, + + 0x0A,0x16,0xE3,0x5A,0xBB,0xCE,0x92,0x49,0xE1,0x54,0xEF,0xFB,0x5B,0x85,0xEE,0x6E, + + 0x2C,0x5C,0xC6,0xCC,0x3A,0x3C,0xD6,0x12,0xEF,0x7B,0xD6,0xEC,0x7A,0x7C,0xCE,0x5C, + + 0x2B,0x8C,0xCE,0xDC,0x3B,0x3D,0x4D,0xBE,0xC9,0x13,0xDE,0xFC,0x7B,0x7D,0x3C,0x8F, + + 0x00,0xE5,0xC7,0xCD,0xBA,0x3E,0x88,0x89,0xEC,0x5E,0xD7,0xED,0xFA,0x7E,0x75,0x26, + + 0xAD,0x1F,0xCF,0xDD,0xBB,0x3F,0x2B,0x7D,0xEF,0x58,0xDF,0xFD,0xFB,0x7F,0x7E,0x1F, + + 0x54,0x2B,0x98,0xD6,0xE9,0xAF,0x50,0x66,0x38,0x4B,0xE8,0x32,0x37,0x7C,0xD7,0x16, + + 0x05,0x59,0xAC,0xF4,0x97,0xA9,0xAB,0xD0,0xC7,0xC9,0x09,0x88,0xE9,0x16,0x04,0x03, + + 0xEF,0xA6,0xC1,0x47,0x7A,0x29,0x35,0xC1,0x46,0x8A,0x48,0xC8,0x54,0x62,0x96,0xEE, + + 0x95,0xE0,0x5C,0xF5,0x95,0x08,0xB4,0xD1,0x47,0xCB,0x16,0x58,0x08,0x3F,0x60,0x7A, + + 0xFA,0xB4,0xE0,0x46,0x16,0xA4,0xC7,0x6B,0x40,0xC4,0xF0,0x66,0x56,0xE4,0xED,0x54, + + 0xCF,0xD5,0xE8,0x56,0x17,0xA5,0x0C,0xF6,0x43,0xC2,0xF8,0x76,0x57,0xE5,0xA1,0x43, + + 0xF6,0x22,0xE1,0x47,0x96,0xA6,0x62,0x25,0x64,0x88,0xF1,0x67,0xD6,0xE6,0xCD,0xAE, + + 0x07,0x5C,0xE9,0x57,0x97,0xA7,0xB9,0x76,0xD7,0x86,0xF9,0x77,0xD7,0xE7,0xC2,0xBC, + + 0x8B,0x8F,0x04,0x0F,0x1C,0xA1,0xBB,0xC8,0x7F,0x8A,0x0B,0x70,0xDF,0xE6,0xBA,0x1E, + + 0x10,0x0B,0x2A,0xE4,0xFC,0xD6,0xC5,0xD2,0x4F,0x04,0xBB,0x21,0x45,0x7D,0x8B,0xA9, + + 0x53,0x65,0xDE,0xEF,0x73,0xE8,0x89,0xD5,0xDC,0x07,0x53,0x10,0xF8,0x3E,0xBB,0xF9, + + 0x21,0xCA,0xD4,0xE5,0x62,0x74,0x40,0x33,0x28,0x74,0x3A,0x24,0xC1,0xA5,0x63,0x8C, + + 0xAC,0xC9,0xE2,0x4E,0x1E,0xAC,0xDA,0xC9,0x31,0x6C,0xF2,0x6E,0x5E,0xEC,0x81,0xAD, + + 0x09,0x8D,0xEA,0x5E,0x1F,0xAD,0xFC,0xBC,0xED,0x81,0xFA,0x7E,0x5F,0xED,0x11,0xEE, + + 0x0B,0x89,0xE3,0x4F,0x9E,0xAE,0xB3,0x6B,0xBE,0x35,0xF3,0x6F,0xDE,0xEE,0x3C,0x84, + + 0x2C,0xF1,0xEB,0x5F,0x9F,0xAF,0x0B,0xA4,0x78,0x81,0xFB,0x7F,0xDF,0xEF,0x2E,0x02, + + 0x87,0x96,0xA0,0xC1,0xB5,0xBE,0x6B,0xA0,0x17,0xD0,0x4D,0xE0,0x9E,0x54,0xEA,0x64, + + 0x16,0x93,0xF2,0x05,0x31,0x1A,0xFC,0xB3,0x3E,0xCA,0x18,0x4A,0xF5,0x0A,0x6D,0x11, + + 0x05,0x89,0x06,0x11,0x68,0x54,0xEA,0xA3,0x93,0xDE,0x30,0xA1,0x3C,0xA2,0xF7,0xF1, + + 0xB5,0x58,0xCF,0x93,0x54,0x1C,0x7B,0xCC,0x81,0x1C,0xBF,0x71,0x57,0xB6,0x77,0xFD, + + 0x32,0xD6,0xE4,0xC6,0x36,0xB4,0xB4,0xE7,0x76,0x95,0xF4,0xE6,0x76,0xF4,0xAC,0xD2, + + 0x57,0x31,0xEC,0xD6,0x37,0xB5,0xBC,0xF2,0x17,0x2E,0xFC,0xF6,0x77,0xF5,0x65,0xFB, + + 0x5A,0xE6,0xE5,0xC7,0xB6,0xB6,0xDD,0x40,0x99,0x76,0xF5,0xE7,0xF6,0xF6,0x68,0xD5, + + 0x6F,0x87,0xED,0xD7,0xB7,0xB7,0x7C,0x35,0x45,0x92,0xFD,0xF7,0xF7,0xF7,0x26,0x62, + + 0x62,0x55,0x45,0x7D,0xE2,0x13,0x77,0xD4,0x0A,0x17,0xC4,0x0B,0xD8,0x1F,0x16,0x8A, + + 0x4A,0x9C,0xD0,0xA8,0xD6,0x5C,0x26,0xB3,0x5E,0x1B,0xC4,0x3A,0x7D,0x4A,0xD8,0x63, + + 0xAA,0x99,0xC0,0x87,0x57,0x2C,0x36,0xDD,0xFE,0x12,0x63,0xE9,0x5E,0x04,0x0F,0x9F, + + 0xCA,0x92,0xF1,0xAC,0xA9,0x14,0x85,0xAF,0x60,0x5D,0x54,0xC4,0x62,0xC6,0xC2,0xA8, + + 0x82,0x63,0xE6,0xCE,0x3E,0xBC,0x04,0x4F,0xEB,0xDB,0xF6,0xEE,0x7E,0xFC,0x17,0x9C, + + 0x8D,0xD3,0xEE,0xDE,0x3F,0xBD,0x96,0x59,0x90,0x9C,0xFE,0xFE,0x7F,0xFD,0xA7,0xCB, + + 0xDE,0xE0,0xE7,0xCF,0xBE,0xBE,0x98,0x1C,0x6B,0xD9,0xF7,0xEF,0xFE,0xFE,0x1B,0x5F, + + 0xAB,0x98,0xEF,0xDF,0xBF,0xBF,0xD7,0x58,0x90,0x1F,0xFF,0xFF,0x57,0x3D,0x59,0x86, + + 0xE5,0x0B,0xC8,0x90,0xF9,0x49,0x40,0x06,0xAD,0x22,0xEE,0x18,0x56,0xD0,0x42,0xC2, + + 0xD5,0x72,0x5E,0x53,0xCF,0x29,0xDC,0xC3,0x6B,0xEC,0x5B,0x47,0x74,0xE3,0x81,0x60, + + 0xB4,0x40,0x93,0xFB,0x6F,0x8F,0x6F,0x81,0x29,0x61,0x9E,0x56,0xBE,0x6B,0xAE,0xA9, + + 0x87,0xD3,0x09,0x54,0xFD,0x61,0x8E,0x0F,0xB5,0x58,0xE6,0x46,0xE3,0x0F,0xBF,0xF1, + + 0x3C,0xAB,0x99,0xB1,0xB7,0xA4,0x68,0x10,0x4A,0x4F,0x53,0xF3,0xEE,0x6D,0xC8,0x31, + + 0x67,0xA8,0x08,0x31,0x2F,0xD0,0x8B,0x41,0xE2,0xBA,0x90,0xA1,0xE7,0xBF,0x94,0x32, + + 0xEC,0x0D,0x39,0xC1,0xCA,0x65,0xD1,0x00,0xA6,0xEB,0x6C,0xA2,0x18,0x4F,0x18,0xB1, + + 0x87,0x2E,0x9A,0x6B,0xAD,0x65,0x67,0xC8,0xC5,0xD7,0x60,0xB2,0x19,0x9D,0x9E,0x8C, + + 0x58,0x6F,0x01,0x61,0x72,0x5B,0x92,0x76,0xEC,0xA5,0xF5,0xEC,0x1A,0x2A,0x74,0xB4, + + 0xE0,0x60,0x8C,0xAC,0xF0,0x40,0x63,0xCB,0x67,0x9D,0xE4,0x85,0xD4,0xC4,0x7D,0xA0, + + 0x24,0x07,0xFD,0xB4,0x91,0xCB,0xD7,0x77,0xC6,0x54,0x10,0x40,0xB2,0x19,0xF6,0xF5, + + 0x89,0xDE,0x99,0x1C,0x66,0xA6,0xCB,0x4B,0x22,0xC8,0xC8,0xA2,0x32,0x63,0xD0,0xCC, + + 0x5E,0x75,0x0E,0xF6,0x9A,0x6E,0xA6,0x9B,0x3A,0x29,0x9A,0x34,0xE7,0x93,0x91,0x58, + + 0xE2,0x9E,0x1E,0x2F,0x3D,0x6F,0x52,0x49,0xEA,0xB2,0x4D,0xF8,0x0B,0x38,0x15,0xE4, + + 0x61,0xBD,0x2F,0x3E,0xFC,0x88,0x6B,0x9A,0xB2,0xE3,0x13,0x74,0x2D,0x33,0x5D,0x3C, + + 0x60,0x07,0xCC,0xC1,0x9A,0xEF,0x65,0xC4,0xCD,0xDF,0xA5,0x41,0x77,0x62,0x66,0x84, + + 0x23,0x32,0x96,0x7B,0xCF,0xBD,0x10,0x46,0x48,0x02,0x73,0x64,0x76,0x32,0x8E,0x14, + + 0x29,0xB6,0x8B,0x55,0xD8,0xD2,0x08,0x9B,0x49,0xBF,0xCF,0x27,0x5C,0xDE,0xC5,0x98, + + 0x3B,0xA9,0xD7,0x7A,0x47,0x70,0x01,0x1D,0xC8,0xC8,0x92,0x7D,0x7D,0xDF,0x52,0x99, + + 0xA7,0xA3,0x95,0x8D,0x3E,0xB5,0x09,0x5A,0xE7,0xE3,0x95,0xC6,0xCF,0xF5,0xC2,0xB3, + + 0x48,0x5B,0x94,0x48,0x36,0x10,0x4E,0xE2,0xF0,0x5C,0x43,0x1B,0x87,0xD2,0x50,0xD0, + + 0xAC,0xB8,0x96,0x7E,0x5B,0x36,0x98,0x0A,0x9E,0x37,0x5A,0xB3,0x92,0x83,0x44,0xB2, + + 0xC4,0x59,0xD0,0xB7,0x59,0x35,0x49,0x9F,0x46,0xBB,0x46,0x1B,0xD0,0x9B,0x9F,0x42, + + 0x8D,0xBA,0xB3,0xD3,0x52,0xB4,0x22,0x82,0x93,0x12,0x22,0x87,0x25,0xA8,0xEE,0x71, + + 0x24,0x1C,0x82,0x4C,0x3C,0x10,0x19,0xDB,0x4D,0xDA,0x96,0x5F,0x06,0x50,0x51,0x8D, + + 0x2F,0x39,0x82,0xA9,0x71,0xBA,0x79,0x78,0x23,0xF4,0x02,0x47,0x0A,0x79,0x84,0x0D, + + 0xF0,0x24,0x11,0x09,0xE0,0xA0,0x68,0xDA,0xDA,0x36,0xC8,0xBC,0x9A,0xD7,0x79,0x80, + + 0xAF,0xAB,0xB1,0xA1,0x1D,0xD6,0x87,0x89,0x1E,0xE4,0x89,0xDF,0x06,0xE6,0x96,0x4C, + + 0x72,0xCE,0x6F,0x3F,0xB6,0x31,0xE8,0x6D,0x9D,0xF1,0x7A,0x93,0xB0,0x5F,0x70,0x64, + + 0xC8,0x16,0xF4,0x2F,0x4B,0x92,0x8C,0x86,0x19,0xF2,0xBF,0x3C,0x76,0x2D,0x0F,0xCD, + + 0x83,0xDF,0x9F,0xC9,0x32,0xEC,0x40,0x6C,0x92,0xF1,0x8D,0xEF,0x49,0xA7,0xCB,0xAA, + + 0xD1,0x90,0xD8,0xAE,0x99,0x9E,0x09,0x3E,0x02,0x9C,0xFF,0xC3,0xE7,0x7B,0xF5,0x3D, + + 0x76,0x3F,0x60,0x1F,0x6A,0x0D,0x0E,0x92,0xC9,0x46,0x8E,0x8B,0x82,0x4F,0x6B,0x0D, + + 0x37,0x54,0xCA,0x17,0x16,0xE1,0x38,0xC2,0xBA,0x6E,0xEA,0xC6,0x51,0x40,0x7A,0x03, + + 0x82,0xC2,0xF0,0x67,0xDE,0xCC,0x30,0x63,0xC0,0xE2,0x66,0x66,0xAF,0x42,0xFC,0x2C, + + 0xF7,0x3F,0xA5,0x22,0x7C,0x30,0x6E,0xC0,0xB3,0x6E,0xEA,0xC4,0xA7,0x6E,0xDB,0xF3, + + 0x38,0x2B,0x20,0x5F,0x30,0xE6,0x84,0x9C,0xEA,0xC9,0x8E,0x5B,0xD9,0x42,0x6F,0xF6, + + 0xA6,0x0C,0xEC,0x74,0x33,0x2E,0x1E,0x4B,0xAE,0x54,0xD8,0x9C,0xBE,0x34,0xB6,0x02, + + 0xFD,0xC4,0x7D,0x6A,0xDE,0x25,0x8E,0xA4,0x2F,0x95,0xE6,0x14,0xA6,0x6F,0x6D,0xB3, + + 0x83,0xAE,0xED,0xB5,0x6B,0x34,0x63,0x71,0x74,0x6A,0xE3,0x75,0x45,0xEF,0x9F,0x51, + + 0x7F,0x88,0xC4,0x6B,0xF7,0x7B,0x60,0x98,0x5C,0xC8,0xE4,0x83,0xB7,0x9B,0xFC,0xBA, + + 0x43,0xBB,0xD4,0xA7,0x14,0x48,0x5A,0x5A,0xBB,0x68,0xF9,0x4D,0x78,0x6B,0xE3,0x0F, + + 0xDE,0x3E,0x9D,0xA2,0x5E,0xAA,0x3B,0x2F,0xC5,0x2B,0x73,0x33,0xF2,0xE0,0x72,0xA9, + + 0x28,0xE7,0xAD,0xAF,0x74,0xC2,0x03,0xDE,0xC5,0x17,0x44,0x4C,0xEF,0x87,0xF0,0xCE, + + 0x5A,0xE5,0x51,0xE3,0x18,0x64,0x27,0x1A,0xCE,0xDA,0x70,0x7D,0x2A,0x7D,0x6D,0xDF, + + 0x0E,0x5D,0x8D,0x3C,0xF4,0x8E,0xAB,0xE5,0xBA,0x44,0x79,0x5D,0xFE,0x32,0xA3,0x53, + + 0x20,0xCC,0xB8,0x6B,0x1C,0xAA,0x7B,0x8B,0x41,0x63,0xD5,0x52,0xA6,0xAC,0xAB,0x43, + + 0x20,0x85,0xB3,0x5B,0x17,0x15,0x5B,0x91,0x26,0xFC,0x4F,0x1D,0x52,0x49,0xCC,0x7B, + + 0x6C,0xD2,0x60,0x75,0x12,0x1D,0x0A,0x0A,0xE9,0x66,0x74,0xBF,0x0A,0x5D,0xEC,0x96, + + 0x77,0x45,0x92,0xAB,0xC1,0x60,0x02,0x0A,0x19,0x7E,0x3F,0x13,0x76,0x81,0x21,0x30, + + 0xDF,0x82,0x32,0x02,0x5F,0xD1,0x3D,0xA7,0xED,0x33,0xE4,0xC7,0xF6,0xB0,0x7D,0x8C, + + 0x8F,0x88,0xF4,0x92,0x60,0xF6,0xEE,0xCD,0x65,0x92,0x7D,0xAE,0xA6,0x5E,0x7C,0x4B, + + 0xCF,0x47,0xDC,0xF7,0x97,0x35,0x12,0x43,0x8F,0xD7,0x40,0xA1,0x45,0xB3,0x3B,0x56, + + 0x77,0xF2,0xBE,0x9D,0xDC,0xD1,0x2B,0x76,0x33,0xBC,0xEF,0x72,0x27,0xAA,0x73,0xA1, + + 0x59,0x3B,0x1C,0x34,0x32,0x3B,0xB5,0xFA,0xB0,0xDE,0x4D,0x74,0x8E,0x5B,0x96,0xF4, + + 0x06,0xFB,0x2D,0xC7,0x3F,0x43,0xBD,0xEB,0x49,0x95,0xB5,0x57,0x94,0xBE,0x55,0xEC, + + 0x0F,0xE8,0x18,0x0B,0xE9,0xDA,0x30,0x1A,0x85,0xB1,0xE5,0x97,0x97,0xF0,0x77,0x6F, + + 0x88,0xF7,0x90,0xA3,0xE3,0x16,0x6C,0x45,0x6B,0x69,0xEC,0x4E,0x8A,0x58,0x7E,0x77, + + 0x09,0x65,0xCE,0x65,0x43,0xD6,0x25,0x54,0x13,0x57,0x8C,0xAD,0xC8,0x5A,0xC8,0xDB, + + 0xFD,0x36,0x38,0xEC,0xC9,0x6D,0x37,0x3F,0xB9,0xB8,0xEC,0x4C,0x8F,0x70,0x00,0x7E, + + 0xC7,0x3F,0xFA,0xD0,0x1F,0x08,0x71,0x6F,0x6F,0xDD,0xE0,0x4E,0xCD,0xB1,0xEE,0xBB, + + 0x4B,0xB4,0xA1,0xEF,0x9E,0x1C,0xF8,0x89,0x05,0x92,0x21,0xFF,0x79,0xE5,0xA7,0xD2, + + 0xB2,0x96,0x28,0xD5,0xE9,0x13,0xB7,0xF3,0x41,0xD4,0xBD,0xF2,0xDD,0x3F,0x7F,0x5F, + + 0xF7,0xDC,0xD7,0xEF,0x90,0xFD,0x7E,0x88,0x89,0x90,0xA6,0x7B,0xAB,0x6C,0x3E,0x38, + + 0xA3,0xAD,0x1C,0xFB,0xE5,0x83,0x76,0xED,0xA9,0x1A,0x7C,0xB6,0x10,0x68,0x36,0x29, + + 0xC3,0xFE,0x48,0x0D,0x59,0x29,0x98,0x73,0x32,0xCC,0xA0,0xD4,0x55,0x4D,0x16,0x85, + + 0xD4,0x69,0x10,0x81,0xC0,0x97,0xD1,0x39,0x77,0x4A,0x00,0xA7,0x50,0x0C,0x37,0x29, + + 0xE0,0x07,0x09,0x56,0xE0,0x8E,0x67,0x04,0x28,0xA2,0x82,0x95,0xC7,0x23,0xBB,0x33, + + 0x5D,0xFD,0x82,0xBB,0xFB,0xDE,0x90,0x70,0xA7,0x44,0x14,0xB4,0x5A,0x67,0xC9,0xD4, + + 0x5B,0xB2,0xEE,0x89,0x3C,0x5E,0xF2,0x24,0x45,0xC5,0x7E,0x12,0x99,0x7E,0x19,0x40, + + 0x77,0x0D,0x6D,0xDA,0x91,0xB6,0x51,0x61,0xC2,0x40,0xE9,0x79,0x5F,0x7D,0x41,0x40, + + 0xE8,0xB7,0xCD,0x27,0x68,0xDC,0xE3,0x71,0xC3,0x47,0xA7,0x9D,0xC1,0x2A,0x60,0x0A, + + 0x0B,0x18,0x93,0x6C,0x52,0x85,0xBE,0xBB,0x6D,0x40,0xBE,0x54,0xB1,0xB2,0x73,0x6B, + + 0x71,0x46,0xB4,0x30,0x37,0xF6,0xFA,0x09,0x25,0xE6,0x1A,0x7F,0x28,0xC4,0x59,0x03, + + 0xE0,0xB0,0x16,0x3C,0x39,0xD5,0x93,0x6A,0xBB,0xC1,0x7F,0xBF,0xD8,0x60,0x0D,0xC0, + + 0xC1,0x08,0xD1,0x01,0x9F,0xBB,0xBB,0x4B,0xAB,0x1E,0x07,0xAD,0x26,0xC6,0xC4,0x4A, + + 0x11,0x17,0xC6,0xC8,0x2B,0x7D,0x52,0x1A,0xA1,0x77,0xB4,0x99,0xB1,0x87,0x39,0xA8, + + 0x49,0x42,0xAA,0x0A,0x1E,0x6F,0x82,0x0B,0x6C,0x23,0xD8,0x57,0xD6,0x2F,0x64,0xBD, + + 0x82,0x15,0xC5,0xA9,0x13,0x18,0x2D,0x85,0x02,0x47,0x13,0x71,0x2A,0x2C,0x12,0xA4, + + 0x2E,0xF0,0xC9,0x5E,0xA8,0x1F,0x3D,0x18,0xC8,0x54,0xD9,0xC1,0xD8,0xAF,0x5C,0x10, + + 0xD9,0xB1,0x44,0x98,0x25,0xBB,0x9D,0xC2,0x41,0x10,0x8F,0xE3,0x99,0x59,0x0F,0x37, + + 0x96,0x74,0x47,0x87,0x01,0xCB,0x0A,0xD2,0x9E,0xFC,0xFE,0xB4,0xAC,0xF0,0x3D,0x7E, + + 0x51,0x50,0x81,0x67,0x78,0x23,0x39,0xD9,0x09,0x23,0xF3,0xC5,0x0F,0xFF,0x35,0x7E, + + 0xA7,0xC3,0xAB,0xA0,0x90,0x97,0x8C,0x35,0xB1,0x34,0x99,0x4E,0x10,0x80,0x5E,0xC2, + + 0xE0,0x10,0xE0,0x2C,0x2A,0x76,0x6A,0x80,0x43,0x84,0xD6,0x15,0x11,0x8B,0xF4,0x2F, + + 0x40,0x01,0x46,0x50,0x63,0xDB,0x26,0xE0,0x9C,0xD8,0xDA,0x04,0x57,0x81,0x0D,0xCC, + + 0x91,0x72,0xC7,0xA1,0x30,0xFA,0x2B,0x05,0x0B,0x3F,0x45,0xF6,0xC5,0xFD,0x5B,0x08, + + 0x10,0xEA,0xAD,0x83,0xF6,0x75,0xA0,0x08,0x1C,0x15,0x09,0x71,0x96,0xCC,0x32,0xE6, + + 0x8B,0x7D,0x10,0xED,0x0B,0xD3,0x6D,0x8F,0xC9,0xE7,0xED,0xEB,0x91,0x82,0x0E,0x99, + + 0x79,0x1D,0x76,0x94,0xC0,0x76,0x79,0xC2,0x6F,0xC9,0xFC,0xBC,0xA4,0xF8,0xBA,0x6B, + + 0xF0,0xAD,0x7F,0x65,0x3C,0xA7,0xFB,0x41,0xD3,0x17,0xF1,0x71,0x07,0xF7,0xA0,0xBD, + + 0x48,0x00,0xB5,0x75,0x3F,0xF4,0xE6,0xF9,0xED,0x77,0x9B,0xE2,0x9B,0x7B,0xBE,0x20, + + 0x7D,0x5E,0xC4,0xCF,0x3C,0x5C,0x4F,0xC4,0x83,0x15,0xB6,0xC3,0x41,0x3E,0x58,0xF1, + + 0x2D,0xCD,0x97,0xA2,0x59,0x1D,0xF2,0x67,0x68,0xCD,0xA6,0xDB,0x92,0xB6,0x45,0x38, + + 0xC9,0x75,0xE2,0xBF,0xC6,0x91,0x15,0x16,0x03,0x77,0x54,0xC9,0x13,0xD5,0xA9,0x29, + + 0xEB,0xBE,0xB1,0x28,0xBD,0x26,0x79,0x98,0xCC,0xD2,0xA7,0x7F,0x47,0x99,0x1E,0xA2, + + 0x89,0x06,0x56,0x82,0x4C,0x00,0x4E,0x25,0xE5,0xCB,0x7F,0xB9,0x55,0xA0,0x21,0x60, + + 0xFE,0x1E,0x96,0x23,0x34,0x23,0xAE,0x21,0x68,0xCE,0xCF,0xF6,0x51,0xCD,0xA6,0xC3, + + 0x80,0xAB,0xA9,0x03,0x1D,0x3B,0xB1,0x60,0xF7,0x6F,0x9D,0x5F,0xD2,0x52,0x85,0x68, + + 0x4F,0x2A,0x05,0x64,0xA9,0x05,0x0B,0x20,0x66,0x92,0xA2,0x35,0x8A,0x8F,0x39,0xB7, + + 0xA3,0x5B,0x20,0x56,0x33,0xA2,0x56,0xBE,0x69,0x69,0x30,0x7A,0xA6,0xA6,0x31,0xAF, + + 0xF2,0xCA,0x06,0xD4,0xD2,0xED,0x30,0x23,0x41,0x75,0xD2,0x9C,0x14,0xEA,0x8D,0xDC, + + 0x87,0x06,0x4B,0x03,0x90,0x36,0xAD,0xA4,0x0C,0x3C,0xF3,0x39,0x3F,0xDD,0x30,0x55, + + 0x22,0x58,0x29,0x47,0x1F,0xE5,0x02,0x0C,0xAF,0xAC,0xD0,0x1F,0x3C,0xDC,0x19,0x99, + + 0x6D,0x82,0x3E,0xF1,0xF5,0xF9,0x4C,0x07,0xAD,0x67,0x8C,0xF3,0x96,0x32,0x54,0x1C, + + 0x6E,0x7E,0x9D,0x9A,0x45,0x09,0x5C,0x5F,0x4C,0x89,0xBB,0x4D,0x74,0x40,0x32,0xFB, + + 0x7F,0x3B,0xC1,0x0F,0x9A,0x3A,0x22,0x58,0xFC,0xA6,0x5F,0xBD,0x9C,0xE2,0x78,0xE8, + + 0x01,0x86,0xA3,0x1B,0x14,0x32,0x17,0xD3,0xCB,0x1B,0xA3,0xDF,0xD9,0xC7,0x63,0x2C, + + 0xF1,0xCE,0x66,0x45,0xFF,0x5D,0xB2,0x72,0xFA,0x13,0xCC,0x82,0x9F,0x66,0xD5,0xDE, + + 0x5B,0xE6,0xEE,0xAD,0x74,0xAB,0x63,0x30,0xA6,0x86,0x56,0xEC,0xA8,0x40,0xE0,0xF3, + + 0x7B,0x81,0x9D,0xBB,0x6B,0x2D,0xC7,0x09,0x31,0x8C,0x74,0x27,0x35,0xB5,0xD4,0xC9, + + 0x70,0x52,0x41,0x0B,0x99,0x2F,0x65,0x1A,0xEC,0xBE,0xA6,0xED,0xDF,0xE7,0x03,0x74, + + 0xCF,0x2A,0x13,0xAB,0xC0,0xE1,0x2F,0xD1,0x49,0x52,0x4F,0x22,0x7C,0x57,0x63,0xA3, + + 0x84,0x30,0xB4,0x96,0x06,0xD5,0x66,0x36,0x63,0x41,0x10,0xC9,0xAF,0x2C,0xE5,0xE6, + + 0xC2,0x3F,0x65,0x42,0x46,0xF0,0x2B,0x8B,0xC5,0x42,0xEC,0x5B,0x51,0x4D,0x15,0x60, + + 0x9D,0x3E,0x15,0x77,0xB1,0xA1,0xCB,0x37,0xBD,0x73,0xDF,0xB7,0xF4,0x62,0x71,0x31, + + 0x1E,0x34,0xC6,0x44,0xB6,0x0C,0x89,0x1B,0x6E,0x21,0x34,0xFA,0x52,0x59,0x0E,0xCF, + + 0x24,0x97,0x28,0x06,0x3B,0xB6,0x5A,0x93,0x40,0x75,0xA5,0x14,0x14,0x52,0x2A,0xB0, + + 0xFD,0xFA,0xDD,0x38,0x77,0xD4,0xE9,0x67,0xD7,0x87,0x2B,0x05,0x5A,0x5B,0x6B,0xFB, + + 0xEF,0xE6,0xD5,0xCB,0x3A,0xAC,0xA1,0xF1,0x05,0x7A,0xEB,0x52,0x1C,0xB3,0x69,0xCD, + + 0xEE,0x68,0x1E,0x6E,0x38,0x94,0x3E,0xAE,0xE5,0x41,0xD6,0xAC,0xF3,0xF5,0x10,0x52, + + 0x0E,0x69,0x65,0x7E,0x5F,0xD5,0xA8,0xDA,0x2F,0x02,0x7F,0xCD,0x2A,0x78,0x2F,0x8F, + + 0x25,0x01,0xBC,0xFC,0xE3,0x13,0x09,0xCF,0xAE,0x73,0xAF,0x36,0xDC,0xA8,0xC3,0x73, + + 0x0B,0xD6,0x91,0xFE,0x77,0xB2,0x3F,0xC8,0xD1,0x7A,0xBB,0x40,0x1C,0x98,0x58,0xE7, + + 0x0D,0xDC,0xC0,0xA8,0xF4,0x77,0xBD,0x8A,0x72,0x73,0xCC,0x5E,0xC2,0x53,0x68,0xEF, + + 0xA7,0x49,0x88,0x2F,0xD4,0x16,0x01,0x07,0x90,0x9F,0x6E,0xFE,0x7F,0xFD,0x61,0xE7, + + 0x26,0x39,0x99,0x3B,0xAC,0xF3,0xAB,0x06,0x11,0x53,0x53,0x9C,0x9D,0xF1,0xFF,0x59, + + 0x6A,0xD7,0x50,0x8D,0xB1,0xDD,0x66,0xD7,0x06,0xB6,0xFF,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x6C,0xAD,0xA8,0x66,0xAD,0x2C,0xCC,0x24,0x71,0x5C,0x37,0x09,0x33,0x0A,0x40,0x91, + + 0x62,0x15,0x5E,0x90,0x41,0xFF,0x32,0xE0,0x4D,0xC8,0xC0,0x11,0x89,0x25,0x97,0x46, + + 0x4A,0xB8,0xB9,0x3B,0xF6,0xD7,0x71,0x23,0x99,0x4F,0x87,0x10,0x63,0x2F,0x1F,0x24, + + 0x32,0x4E,0x3E,0xF0,0x62,0x9C,0x9D,0x51,0x83,0x45,0xBA,0x32,0x70,0xBC,0x1A,0xE5, + + 0x6A,0xE5,0x7B,0xE8,0xA5,0xBF,0x01,0x12,0xB5,0xBB,0x47,0xB4,0xA5,0x6D,0x30,0x23, + + 0x6F,0x47,0x62,0xF4,0xB2,0xDA,0x0E,0xE3,0x79,0xE8,0x8A,0x8A,0xA4,0x0B,0x81,0x5D, + + 0x8C,0x8B,0xC5,0xBC,0x92,0x20,0x71,0xC4,0x4D,0xEB,0xC1,0xE1,0x86,0x37,0x4E,0x3C, + + 0x85,0xD7,0x12,0x55,0x95,0x97,0x0B,0xE2,0xF1,0x4F,0xE7,0x49,0x0D,0xCA,0x1A,0x19, + + 0xF4,0xE9,0x79,0x88,0x1C,0xF7,0xB8,0x88,0x2B,0xAA,0x26,0x4E,0xBB,0x63,0x9C,0x1A, + + 0xB8,0x12,0xB2,0xF2,0x9A,0x24,0x62,0x1F,0x2A,0xDB,0x1A,0x7D,0x54,0xDD,0xC3,0xD8, + + 0x96,0xAA,0xEB,0x6F,0x27,0x24,0x6B,0x0E,0xAB,0x78,0x13,0x53,0x3B,0x61,0x4B,0xE9, + + 0x76,0x44,0xF6,0xDF,0x38,0x34,0x63,0xBB,0x0C,0x8F,0x3B,0x27,0x55,0xE0,0x9D,0xCC, + + 0x52,0x37,0x3E,0xC8,0x4E,0x60,0x43,0x1B,0x20,0xEA,0xC5,0xF2,0x59,0x4E,0xDC,0xDC, + + 0x5B,0x61,0x31,0x03,0xA6,0xD1,0x3C,0xD0,0xBC,0x0F,0xC9,0xCC,0xAC,0xB2,0x83,0x55, + + 0xC6,0xA3,0x56,0xA2,0x6F,0x7D,0x06,0x96,0x23,0xCD,0x8A,0x7A,0xDC,0xBE,0x8B,0x45, + + 0xF4,0x4D,0x5B,0x2E,0xC8,0x26,0xC2,0xD7,0x22,0x7C,0x37,0x0E,0xF9,0x99,0x3C,0x7F, + + 0xD1,0x52,0x87,0x5A,0xCC,0x7B,0xD4,0xCC,0x3D,0x84,0xAC,0x57,0x48,0xC4,0xC8,0x6E, + + 0x8D,0x1C,0x0C,0x6A,0xB2,0x3C,0xBF,0x04,0xBD,0xB2,0x65,0x93,0xD0,0xFE,0x06,0x26, + + 0x04,0xFF,0xFE,0x7E,0x47,0x70,0xCB,0xBE,0xD3,0x13,0x35,0xBF,0x7C,0x7F,0xC9,0x7E, + + 0x34,0xCE,0x70,0x57,0x10,0x6C,0xF1,0x59,0x33,0x1E,0xC5,0xB1,0x44,0xFC,0x84,0x79, + + 0x1D,0xB4,0x01,0x46,0xA7,0xD3,0x6E,0x0F,0xD5,0x3A,0xF4,0x81,0xD3,0x75,0x2E,0xCD, + + 0x20,0x55,0xCB,0xBD,0x92,0x9A,0x3E,0xF4,0x62,0x67,0xCA,0xDC,0x98,0x64,0xD3,0xB2, + + 0xCE,0x7A,0xFD,0x36,0x82,0x74,0x6A,0x73,0xE2,0xCB,0x6F,0xF1,0x91,0xEF,0x59,0xAC, + + 0x87,0xC3,0x9B,0xF2,0x12,0x98,0x67,0xC8,0x1C,0xCA,0xBD,0xBB,0x1D,0x7A,0xAF,0xB7, + + 0x4A,0xE5,0xEE,0xEE,0x83,0x36,0x70,0x65,0x81,0x02,0xCE,0xC9,0x43,0x18,0xB1,0xA1, + + 0xD2,0xC4,0x32,0x1E,0xFC,0xF1,0xDF,0x3A,0xF0,0xD2,0x3A,0xD7,0x7F,0xE9,0xD3,0x1A, + + 0x09,0xC5,0xBF,0x67,0xBE,0x7A,0xD7,0xB1,0x5F,0x50,0xD2,0xB6,0x7C,0xEE,0x5C,0x63, + + 0x50,0xBA,0x4F,0x8D,0x6C,0x96,0x27,0x46,0xC8,0x39,0x35,0xC3,0x5A,0x1E,0x14,0xD7, + + 0x40,0x88,0x14,0x48,0x62,0xD7,0x04,0x16,0xE8,0x90,0x29,0x9F,0x4A,0x10,0x58,0x6D, + + 0xC0,0x2E,0xF6,0x2F,0x09,0x7F,0x9E,0xF9,0xA6,0x20,0xCF,0xC2,0x03,0x88,0x95,0xD2, + + 0xC4,0x93,0xFF,0x3E,0xD4,0x5B,0x87,0x6D,0xB2,0x83,0x30,0x2D,0xFE,0x8A,0x71,0x6D, + + 0xC9,0x80,0xC8,0xCE,0x50,0x5B,0xC8,0x16,0x5E,0x8C,0x4C,0xC6,0x9D,0xEA,0x1E,0xDB, + + 0x25,0x20,0x60,0x02,0xB9,0xA6,0x6A,0xB2,0xE7,0xDB,0x4F,0xC4,0xF8,0xEF,0xD0,0x36, + + 0xD9,0x02,0x03,0x94,0xD0,0x69,0x80,0xC9,0xB9,0x0A,0xC1,0x44,0xF2,0xC9,0x1F,0xF2, + + 0x09,0xE0,0x0B,0x43,0x92,0x22,0x13,0x45,0x37,0xD2,0xEB,0x9C,0xBC,0x03,0x0E,0xA2, + + 0x1C,0xFE,0x69,0x07,0x2D,0xBE,0x8A,0xC2,0xC3,0x9A,0x35,0x44,0xB9,0xA1,0x63,0x1C, + + 0x00,0x54,0x67,0xC4,0xD3,0x40,0xE7,0x9D,0xAF,0xD7,0xCE,0x5B,0x80,0xEC,0x6B,0x3C, + + 0x01,0x55,0xA0,0x5B,0xB6,0x24,0x1E,0xC7,0xB2,0x63,0x86,0x5E,0xD7,0xB5,0xE7,0x30, + + 0xEA,0xC4,0xD9,0x80,0x54,0xBD,0xA2,0x9D,0x4B,0x3B,0x77,0x8F,0x30,0xAB,0xB6,0xD7, + + 0xDF,0xB6,0x68,0xB5,0x17,0x07,0xAB,0x33,0xD3,0x6A,0x99,0x75,0xA8,0xEA,0x0F,0x8E, + + 0x54,0x17,0x8A,0x6C,0xA5,0xA4,0xBD,0x34,0x27,0x3C,0xB5,0x09,0xFD,0x37,0x11,0xA6, + + 0xD4,0x74,0x17,0x5C,0xBC,0x7C,0x41,0x32,0xE8,0x76,0x2C,0xBA,0x05,0xCE,0x9C,0x3A, + + 0xA3,0x75,0x9B,0x61,0x1D,0xA7,0xE9,0xC3,0x08,0x87,0x07,0x4D,0x23,0x47,0x04,0xE1, + + 0x74,0x2A,0x79,0x20,0xF3,0xE9,0x8C,0xD3,0x39,0x20,0x83,0xCC,0xED,0x8E,0xA2,0x56, + + 0x42,0x88,0xD8,0xCC,0xDB,0x48,0xA4,0x5A,0xB1,0x33,0xA2,0x18,0x52,0x47,0x5D,0x77, + + 0xFF,0xDC,0xAC,0x6B,0x19,0x1D,0x81,0x5E,0x96,0x30,0x5C,0x1C,0xD2,0x6B,0xE0,0xCF, + + 0xF4,0xF5,0x9B,0xBE,0xF2,0x5E,0x4D,0xDF,0xAC,0x31,0xE2,0xDB,0x5C,0x22,0xDC,0x72, + + 0x7B,0x9E,0x55,0xBF,0x9B,0x8A,0x54,0x21,0x3A,0x53,0xA2,0xBF,0x87,0xE9,0x1C,0x7D, + + 0xD5,0xD2,0x72,0xB7,0x03,0x1F,0x0A,0x17,0xF5,0x2D,0x0B,0x44,0xBC,0x81,0x14,0x6D, + + 0xAA,0xE7,0xF1,0x65,0x0E,0xF0,0x97,0xF5,0x6B,0x0D,0x81,0x32,0x25,0xDF,0x26,0x24, + + 0x53,0xF7,0x7C,0xF4,0xD2,0x11,0x1C,0xAB,0x64,0x72,0x15,0xB4,0xC0,0x96,0x96,0x1D, + + 0xA4,0x53,0x97,0x64,0xD9,0x1E,0xF9,0x79,0x5E,0x7C,0x7D,0xAB,0xB9,0xCE,0x1A,0x6A, + + 0xAB,0x39,0xDC,0x35,0x4E,0xD1,0x8D,0x1A,0x62,0x6F,0xA2,0x62,0x75,0x49,0x2B,0x95, + + 0xC6,0x33,0xEB,0x51,0xDC,0xD1,0x7C,0x88,0xA5,0xF5,0x4F,0xCB,0x8B,0xF6,0x37,0x51, + + 0xE6,0x9C,0xDD,0x34,0xC2,0xF4,0x75,0x24,0x1F,0x50,0x56,0x46,0x2A,0xB5,0x3B,0x2C, + + 0xC4,0x17,0xD5,0x24,0xCB,0xD2,0x75,0x7A,0x06,0x66,0xCA,0x5F,0x07,0x14,0x8D,0xE4, + + 0xF9,0x64,0x30,0x0A,0x64,0x5C,0xE0,0xB4,0x0A,0xDE,0xEE,0xC8,0x1F,0x92,0x38,0x7E, + + 0xC6,0xD2,0x38,0x1A,0x65,0x1F,0x0B,0xD0,0xEC,0xD4,0xC1,0x4E,0x87,0x58,0x9A,0xD4, + + 0x45,0x39,0x90,0x89,0x4F,0x17,0x9D,0xEF,0xEA,0x5A,0xA1,0x9A,0x4F,0xB7,0x12,0xAA, + + 0x82,0x34,0x18,0x99,0x56,0xEA,0x02,0xF9,0x4C,0x86,0x29,0x55,0x04,0xB4,0x00,0x7A, + + 0xD9,0xDE,0xDE,0x3D,0x1C,0xFE,0x89,0x90,0x0C,0x23,0x36,0x2E,0x87,0x28,0x89,0x25, + + 0x4C,0x1D,0xF6,0xAD,0x47,0x37,0x79,0x84,0x69,0xFD,0xAA,0xC1,0x59,0x68,0xFE,0x65, + + 0x23,0x13,0x64,0xD2,0x1F,0xB5,0x17,0xBD,0xC4,0x9C,0x23,0xF0,0x9C,0x2B,0x8C,0x25, + + 0x8D,0x72,0x14,0xBF,0xDB,0x12,0xD1,0x84,0xD3,0xA0,0x2B,0xC4,0x9D,0xBD,0x8C,0xD1, + + 0x9D,0xFD,0xB8,0xFB,0x67,0x20,0x36,0x85,0x6A,0xE4,0x50,0x38,0x8C,0xD5,0xE4,0x7F, + + 0xCB,0x10,0xF1,0x72,0xEA,0xBA,0xF4,0x43,0x63,0xE7,0x8D,0x0A,0x61,0x23,0xAC,0x4F, + + 0x75,0x5E,0xDB,0xBE,0xF8,0xC3,0x43,0x85,0x40,0xF6,0x86,0x1F,0xA0,0x97,0xB0,0x83, + + 0x81,0x09,0x89,0x91,0xDC,0x07,0x48,0x42,0xBD,0xE5,0xD1,0x4E,0x05,0x20,0xEB,0x8A, + + 0xB9,0x6A,0x00,0x18,0xD7,0xF0,0x7F,0xE4,0x16,0x08,0xAE,0x62,0xB3,0xC7,0x1A,0x90, + + 0x55,0x69,0xEA,0x32,0xE4,0x35,0xE3,0xC1,0x21,0xEA,0xA3,0x53,0xF2,0x94,0x27,0xF0, + + 0x77,0xA0,0x50,0x5A,0xAE,0x3D,0x47,0xD0,0x29,0xE5,0x75,0x96,0x5E,0x6B,0x77,0xE0, + + 0x59,0xAA,0x71,0xAA,0x1C,0x81,0x0B,0x73,0x86,0x92,0x26,0x0F,0xA5,0xB8,0x82,0x0B, + + 0xEE,0x46,0x42,0x15,0xB9,0xD7,0xC4,0x68,0x1C,0xE5,0x35,0x89,0xA0,0x99,0x32,0xE7, + + 0x86,0xA4,0xF3,0x63,0xBE,0x84,0x09,0x4B,0x27,0xEA,0x29,0x10,0x5F,0x63,0x94,0x8B, + + 0x15,0xD1,0xD9,0xB6,0xF0,0xCB,0x42,0x18,0xEE,0xE5,0xA0,0x11,0x24,0x1B,0xDB,0x86, + + 0x60,0x28,0x1D,0x7D,0x9D,0x02,0x4F,0xCA,0xF5,0x4F,0xA4,0x23,0xBB,0x9F,0x10,0xD2, + + 0x09,0x1E,0xD7,0x32,0xD0,0x3D,0x82,0x57,0x64,0x0E,0x89,0x6C,0x21,0x0C,0x13,0x5C, + + 0x86,0x6E,0x35,0xAF,0x23,0xF0,0xAC,0x3A,0xEA,0xB0,0x0A,0x63,0x75,0xC0,0x7D,0xF8, + + 0x7E,0x8D,0x8B,0x41,0x67,0xAF,0x50,0xB7,0xCC,0x9E,0x13,0x6C,0x17,0xBA,0xE0,0xFC, + + 0x5E,0x11,0x99,0xA2,0x70,0x3E,0x73,0x1B,0x3F,0x4C,0x8B,0x4D,0x9B,0xC0,0xFF,0xBA, + + 0x0A,0xA5,0x97,0xA3,0x91,0x9F,0x45,0x98,0x66,0xE0,0x46,0x3A,0x87,0x76,0x23,0xFF, + + 0xF8,0x8D,0xB4,0x67,0x45,0x54,0x09,0x52,0xCD,0xFC,0xB1,0x4E,0xDD,0x7C,0xD5,0x05, + + 0xA8,0xB5,0x92,0x01,0xE0,0xAE,0x33,0x52,0x6C,0xFF,0xF7,0x13,0xF6,0xA2,0xB4,0xCB, + + 0xA7,0x33,0xB5,0x66,0xCD,0x71,0x8C,0x53,0xE7,0xE3,0xE2,0xF2,0x18,0x40,0x51,0x5F, + + 0xCB,0x05,0xC3,0xF1,0x34,0xE4,0x6C,0xDE,0x40,0xA1,0x80,0x1B,0x93,0xF2,0xEA,0x54, + + 0x77,0x84,0x0C,0xC8,0xFF,0x77,0x34,0x92,0x9C,0x5B,0x25,0x86,0xC8,0x6A,0xA6,0x01, + + 0xA8,0x0D,0x62,0x41,0xEA,0x13,0x01,0x65,0xB2,0x88,0xD5,0xAA,0x0F,0x0A,0x1F,0x2B, + + 0x54,0x79,0xCA,0xEA,0xB5,0xE7,0x65,0x0F,0xE5,0x37,0x6E,0xCC,0x0F,0xA6,0xA8,0x96, + + 0x02,0xEC,0x81,0xAF,0x99,0x97,0xF2,0x5B,0xE4,0xF5,0xF1,0x57,0x91,0x6B,0xA6,0xA5, + + 0xA6,0xB4,0x9B,0x18,0x61,0xCC,0x0D,0x5A,0x6F,0xE9,0xD0,0xA2,0x47,0x8D,0xD7,0x29, + + 0xD4,0x19,0x96,0xAA,0x19,0x95,0x82,0x4B,0x44,0xF7,0xF4,0x57,0xFE,0x12,0x9C,0x0A, + + 0xCF,0xB6,0xB7,0x6E,0x8D,0x5E,0x02,0xCA,0xD1,0x54,0xCC,0xCE,0xD3,0xF1,0x78,0xE5, + + 0xF4,0xB1,0x61,0xBF,0x56,0x35,0x73,0xF6,0x08,0xA8,0xAD,0x17,0x7C,0xAC,0x10,0x74, + + 0xD4,0x71,0x6D,0xE5,0xE7,0xEC,0x78,0x4D,0x2A,0x28,0x61,0xBE,0xDA,0xA8,0xD6,0x57, + + 0xAB,0x7E,0x47,0xEE,0xD2,0x7F,0x01,0xFA,0x8C,0x36,0x19,0x93,0x7B,0x73,0x71,0x61, + + 0x61,0x3C,0xEC,0xE0,0x63,0x3C,0x48,0xD7,0x9B,0xEA,0x0F,0xC2,0xD5,0x3D,0x42,0x02, + + 0x07,0x60,0xF1,0x22,0x7F,0x41,0x37,0x65,0xAD,0xD3,0xE6,0x18,0x72,0x15,0xF8,0x10, + + 0x31,0x2C,0x88,0xEF,0xB4,0x2B,0x06,0x87,0x8F,0xE2,0xEE,0xB2,0x58,0x4B,0x1B,0xF0, + + 0xAE,0x2D,0x26,0x96,0xF8,0xA4,0x57,0x87,0x2F,0x53,0x65,0x1D,0xB6,0x57,0xF9,0xC3, + + 0x05,0x2B,0x2E,0x27,0xDF,0x0C,0x47,0x1E,0xC3,0x13,0x1A,0x97,0x09,0xC0,0x1D,0x85, + + 0xCC,0xE7,0xB9,0x50,0xB3,0x7B,0xC7,0xC3,0x40,0x54,0x50,0x14,0x3C,0x15,0xEC,0xA3, + + 0x31,0x7A,0x8E,0x7B,0xE2,0x03,0x10,0x10,0xB0,0x87,0x4C,0x19,0xF4,0xA7,0xDA,0xD0, + + 0xA0,0x8E,0xE0,0x21,0x69,0xC8,0x9A,0xA1,0x67,0x39,0x8F,0x60,0x63,0xE9,0x57,0x7B, + + 0xC4,0x18,0x78,0x97,0x83,0x5A,0xFD,0x78,0x13,0x84,0x7A,0xFA,0x76,0x18,0x76,0xEA, + + 0x28,0xD5,0x73,0xFE,0x13,0x09,0xB5,0xDA,0x44,0xC7,0xD2,0xBC,0xCE,0xAA,0x86,0x75, + + 0xC7,0x98,0x2A,0x7D,0x16,0xEB,0x2F,0x29,0x2B,0x98,0x82,0xC1,0xD0,0x44,0x69,0xF5, + + 0xAF,0x38,0x35,0xE5,0x39,0xA1,0x13,0x33,0x04,0x69,0x30,0x64,0x2B,0x8F,0xD4,0x75, + + 0x4F,0x8B,0xA8,0x5C,0x3C,0x04,0x1D,0x8E,0xF1,0x6F,0x6D,0xA0,0x22,0x46,0x7A,0x7E, + + 0xE7,0xDD,0xF0,0xB1,0xF5,0xDD,0xD5,0xCF,0xBA,0x4F,0x46,0x0C,0x58,0x3C,0xAA,0x46, + + 0x3B,0x0E,0x7B,0xDA,0x4F,0xB0,0x91,0xFE,0x1B,0x2A,0x82,0x59,0xA2,0xE2,0x29,0xB1, + + 0xAF,0x8F,0x58,0xFF,0x61,0x01,0xC4,0xDA,0xC8,0x5E,0x36,0x48,0x72,0x12,0x10,0xA5, + + 0x00,0x22,0x2B,0x43,0x53,0xED,0x53,0x19,0x32,0xC3,0x57,0x8F,0xDD,0x49,0x33,0x11, + + 0x4E,0x98,0x9C,0x75,0x08,0xF2,0x80,0xD1,0x50,0xDF,0x94,0xF7,0x56,0xF9,0xFC,0x61, + + 0x11,0x3C,0x7E,0xB1,0x94,0x1E,0xA9,0x50,0xC9,0x7C,0x82,0x1A,0x8E,0x6A,0xA6,0xF0, + + 0xC2,0x33,0xA6,0xED,0x15,0x1D,0xF5,0xBA,0x8B,0x7F,0x31,0x56,0xC2,0x0D,0x7B,0x22, + + 0x8F,0x3C,0x7B,0x13,0xED,0x52,0x2E,0x51,0x86,0x64,0xBD,0xF0,0x1C,0x90,0x5A,0x6F, + + 0xEC,0x97,0x41,0x67,0x30,0x64,0x61,0xD8,0x56,0x21,0xF7,0x38,0x8A,0xD7,0x91,0xEC, + + 0x01,0x60,0x15,0xF1,0x96,0xCA,0xF7,0xA4,0xB3,0xC4,0x7F,0x23,0xF4,0xF8,0x6D,0xEA, + + 0x4F,0xC5,0x20,0xE0,0x1A,0xBB,0xA1,0xDD,0xC0,0x94,0x8E,0x1C,0x01,0xB4,0xB9,0x28, + + 0xA1,0x47,0x2D,0xCB,0xA9,0xBA,0xDA,0xDA,0x2F,0xC4,0x6A,0x08,0x74,0xFA,0x33,0x88, + + 0x74,0xF4,0x9E,0x7D,0x0E,0xDD,0x20,0x9F,0xDF,0x95,0xD1,0xDD,0x5A,0x6E,0x50,0xB6, + + 0xC4,0x3A,0xAD,0xDD,0x3B,0x69,0x39,0xCD,0xE0,0xBB,0x0D,0x1A,0x4E,0xB9,0x19,0x3F, + + 0x66,0xD9,0x9F,0x7C,0x86,0xF8,0x9B,0x2E,0x13,0x98,0xFF,0x3E,0x15,0x99,0x49,0x3A, + + 0x46,0xAA,0x09,0x1B,0xED,0x27,0xA8,0x44,0xEB,0x6B,0x13,0x1A,0x28,0x98,0xCE,0xFB, + + 0x00,0x33,0x1D,0xE9,0x9F,0xCD,0xFA,0xF9,0x54,0x54,0x25,0x6A,0x2A,0x8E,0x10,0x7E, + + 0xDB,0x1E,0xC9,0xD8,0xEF,0xD9,0x49,0xD7,0x9F,0x8C,0x4D,0x5A,0x83,0x9E,0xB3,0xB5, + + 0xC4,0xDD,0x18,0xB1,0x88,0x61,0xC2,0xD6,0x5A,0x0F,0x8F,0xC8,0x03,0xF1,0xD8,0x6A, + + 0x76,0xE2,0xD1,0xD9,0xDF,0x3F,0xC8,0x4A,0x1B,0x5C,0x6F,0xFF,0x89,0xCB,0x59,0xE7, + + 0xA5,0x5F,0x40,0x49,0x5A,0x8D,0x2F,0xC2,0xBD,0xC1,0xA8,0xA1,0xEF,0xDD,0x48,0xE8, + + 0xBD,0xFA,0x9E,0x28,0xFA,0xF0,0x66,0x1D,0x3A,0x41,0x58,0xDD,0x38,0x3C,0x00,0x67, + + 0x3F,0xB9,0xD1,0x81,0xAB,0x97,0x95,0x5F,0xA2,0x62,0x87,0x47,0x2F,0xFF,0x30,0xED, + + 0x63,0x43,0x32,0xA4,0xE9,0x8C,0x42,0xD3,0x20,0xBC,0x3C,0xD7,0xD7,0x23,0x3E,0x11, + + 0x12,0x49,0x3C,0x22,0xF9,0x15,0x43,0x12,0x28,0x35,0xF0,0xF6,0xD2,0x6E,0x91,0xE2, + + 0x78,0x07,0xDE,0x36,0xEC,0x88,0xE2,0x37,0x4D,0x29,0x86,0x5C,0x75,0x27,0x3F,0x15, + + 0xBD,0x1B,0xC0,0x23,0x79,0x77,0x2F,0x4C,0xF1,0xB0,0x53,0x94,0xBE,0x66,0x12,0x7E, + + 0xFC,0x1A,0xDC,0xF0,0x64,0xDA,0x99,0x98,0x42,0x4D,0x01,0x8A,0xD5,0x6C,0x8D,0x66, + + 0x3B,0x67,0x95,0x88,0x23,0x5D,0xD2,0xE9,0x5B,0xE3,0x5A,0x57,0x09,0x63,0xB2,0xEB, + + 0x23,0x67,0x31,0xAD,0x25,0x86,0x5A,0xC9,0x3D,0x46,0x20,0xAE,0x11,0x7B,0xBB,0xFA, + + 0xAA,0x1A,0x95,0x35,0x73,0xBB,0x00,0x06,0xA3,0xFB,0x3C,0x6A,0xEB,0xBC,0x52,0x87, + + 0x6C,0x8D,0x1E,0x0C,0xE5,0x2F,0x45,0x04,0xC9,0xE6,0x21,0xAF,0xD9,0x63,0x99,0xFA, + + 0x0C,0x74,0xD0,0x4B,0xE5,0xA1,0x04,0xEC,0x71,0xCB,0xFD,0xE8,0x71,0x71,0xB1,0xAB, + + 0x3F,0x80,0x4C,0x02,0x96,0x4F,0x4F,0x6B,0x66,0x42,0x5E,0xBC,0x0B,0x6E,0x05,0x3A, + + 0xA7,0x8F,0x10,0xB3,0x67,0x35,0x09,0x68,0x69,0xE3,0xED,0x74,0x57,0xE8,0x35,0x70, + + 0x62,0x3E,0x60,0xD8,0x08,0x10,0x69,0x6A,0x68,0x2C,0xC9,0x74,0xFB,0xAE,0x00,0x94, + + 0x13,0xA6,0x2C,0xB4,0xB2,0x34,0x6A,0x9D,0x03,0x70,0x72,0xD2,0xFD,0xF6,0x73,0xE3, + + 0x0B,0xB0,0x0C,0xB5,0xA2,0x2A,0x5A,0x9D,0xE1,0x3F,0xBC,0xB9,0x77,0x4A,0xBF,0x7B, + + 0xB0,0xDF,0x1E,0xE7,0x92,0xDF,0x43,0x9D,0x0B,0x83,0x11,0x65,0xFC,0xB2,0x35,0x6E, + + 0x48,0x10,0x6E,0xE3,0xA3,0xFB,0x8D,0x40,0xDD,0x77,0x78,0x31,0xCA,0xF6,0xB7,0x44, + + 0x14,0x86,0x3E,0xCC,0xCF,0xFB,0xA9,0x64,0x37,0xC5,0x42,0x94,0xF2,0x6B,0x5E,0x6A, + + 0xC8,0x51,0xB3,0xA6,0x59,0x04,0xE6,0x37,0x65,0x6E,0xD4,0xE1,0x51,0x74,0x7B,0xE8, + + 0xCA,0x1B,0xFB,0xE9,0xD2,0x76,0x75,0x61,0xD1,0xA0,0x6C,0x95,0x72,0x60,0x77,0x61, + + 0x17,0xB8,0xB6,0x28,0xB1,0xEC,0x75,0xB1,0xAF,0x15,0x9C,0x33,0xDF,0x73,0xC6,0x61, + + 0x41,0x85,0xDE,0x84,0x3E,0x33,0x48,0x90,0xE9,0xF3,0xDE,0xA9,0x7E,0x43,0x30,0x39, + + 0x49,0x39,0x9A,0x4F,0x0A,0x56,0x27,0xCB,0x44,0xD8,0x0E,0x44,0xF1,0xC2,0x7F,0xAE, + + 0x51,0x15,0xA8,0x09,0x9B,0x3A,0x00,0x1B,0x83,0x8B,0x3A,0x29,0xDB,0x38,0x70,0xEB, + + 0xC3,0x18,0x37,0x63,0xA9,0x76,0xE4,0x4A,0xCB,0xD6,0xB7,0x92,0x90,0x2E,0xE2,0xB6, + + 0x89,0x79,0x73,0x48,0x3D,0x25,0x0B,0x5A,0xCB,0xD4,0x94,0x68,0x41,0xD8,0x31,0x20, + + 0x2B,0x66,0x0E,0x35,0xDB,0x35,0x52,0x64,0x1C,0x08,0xC4,0xFE,0xC8,0x20,0xF8,0x2B, + + 0x43,0x4F,0x78,0x91,0x99,0x2E,0xD7,0x0B,0xA2,0x6F,0x3B,0x82,0x24,0xA3,0x58,0x28, + + 0xEA,0x7C,0x4A,0x1B,0x9B,0x7E,0x80,0x43,0x13,0x16,0xC5,0xFF,0x69,0x77,0x30,0x8A, + + 0xE1,0x06,0x8C,0x22,0x12,0x9B,0xA5,0x42,0x7C,0x4D,0xE2,0xCE,0x8A,0x2D,0x03,0x90, + + 0xCC,0xDC,0xF5,0x59,0x90,0xC0,0x89,0x0E,0xBD,0x70,0x00,0xAD,0x36,0xE5,0xAA,0x43, + + 0x80,0xA2,0x93,0xC7,0x98,0xE0,0x4F,0x96,0x78,0x33,0x4E,0xDC,0xE7,0xED,0x11,0xD4, + + 0x47,0x63,0x01,0x33,0x93,0x98,0x0A,0x0B,0x3A,0x81,0x79,0xDE,0xB3,0xE9,0xCC,0xD1, + + 0x23,0x8C,0x9E,0xF7,0x29,0xA6,0x0E,0xD2,0x2E,0xC9,0x72,0x46,0x1A,0x84,0x7B,0x63, + + 0xA6,0x7A,0xB3,0xB4,0xF6,0x5A,0x03,0x09,0x27,0xD3,0xA1,0xE8,0xB2,0x63,0xE1,0x02, + + 0x11,0x2B,0x38,0x68,0xED,0xA6,0x0E,0x10,0xE8,0xA5,0x31,0x86,0xE0,0x88,0x57,0x7E, + + 0xA9,0x58,0x29,0x56,0xE5,0x0A,0x86,0x09,0xA5,0x43,0xFD,0xFF,0x32,0x61,0x2A,0x0E, + + 0x04,0x14,0x47,0x8A,0x3F,0x14,0x3F,0xCC,0xAD,0x69,0xA0,0x51,0xD1,0x8A,0x28,0xF8, + + 0x3E,0x5F,0xF2,0x9A,0x76,0x98,0x3E,0x8B,0x3D,0x66,0x02,0xA1,0x5B,0xD2,0x43,0x58, + + 0x39,0x87,0x63,0xEF,0x9C,0xEA,0x24,0xD8,0xB4,0x41,0x4C,0x68,0xEF,0xB7,0xA9,0x6D, + + 0x9F,0x80,0xD9,0xEE,0xA9,0xB6,0x28,0x49,0xA5,0x3A,0xEA,0xFF,0x9B,0xF0,0xDD,0x7A, + + 0xBF,0x73,0x73,0x7F,0xBF,0x53,0x89,0x9A,0xCF,0x7D,0xF2,0xAE,0x5A,0xC8,0x54,0x76, + + 0xB0,0xD6,0xF4,0x3C,0xE0,0xC8,0x29,0x41,0xCB,0x52,0x03,0x76,0xFA,0x92,0xD8,0xFB, + + 0x6C,0x51,0xDD,0x66,0x98,0x95,0x0D,0x6D,0xAD,0xEA,0xFF,0x87,0x23,0xA3,0x6B,0xA2, + + 0x0E,0x14,0xD3,0xB7,0x45,0x53,0x45,0x1E,0xA7,0xA6,0x17,0xEC,0xEF,0x42,0x5F,0x7F, + + 0x26,0x4B,0xDB,0xDC,0xC1,0x2C,0x4A,0x9F,0x8D,0x21,0xAE,0x5B,0xE6,0x2B,0x80,0xE0, + + 0xFB,0x2E,0xEF,0xED,0x5D,0xBC,0x6D,0xC1,0x15,0x50,0x86,0x45,0x49,0x5E,0x90,0x07, + + 0xA3,0x8B,0x9A,0x1E,0x97,0x92,0x99,0x30,0xC1,0xD8,0x10,0xA3,0xA9,0xAF,0x17,0x0D, + + 0x56,0x3E,0x52,0xED,0x9B,0x6C,0x3F,0x4C,0x04,0x70,0xAE,0x5F,0x08,0xBC,0xBB,0x80, + + 0x51,0x43,0xDE,0x2E,0xEC,0x7B,0x2F,0xE2,0x60,0x9E,0x74,0x20,0x46,0xBA,0x35,0x30, + + 0x82,0x33,0x7C,0x90,0x17,0xF9,0x28,0xE9,0x45,0x41,0x05,0xFE,0x92,0x99,0xA5,0x9B, + + 0xED,0xFA,0xE4,0x31,0x33,0xB7,0x6C,0xFC,0xC0,0x02,0xE5,0x0F,0x2C,0x3B,0xFE,0xA0, + + 0xDF,0xD5,0x79,0x91,0x93,0xFB,0xEA,0x77,0xDC,0xF6,0x9F,0xE6,0x42,0x71,0x72,0xBB, + + 0x8D,0x67,0x98,0xA2,0x40,0x17,0xA3,0x54,0x07,0x70,0xB7,0x48,0x0B,0xAD,0x74,0x1E, + + 0x2B,0xA2,0xD0,0x99,0x9C,0xFC,0x8B,0x86,0xD9,0x68,0x47,0x45,0x7B,0x21,0x19,0x2B, + + 0x82,0x45,0x07,0xFC,0x84,0x69,0x37,0xB8,0xCE,0x12,0x68,0x15,0xC3,0x70,0x32,0xE1, + + 0x0E,0xFE,0x11,0x1A,0x0A,0xDE,0x08,0x83,0x1D,0xAA,0x73,0x57,0x52,0xB6,0x3B,0x7A, + + 0x2D,0x7C,0xF7,0x26,0x94,0xF1,0xC1,0x4E,0x9A,0xFF,0xF6,0xAE,0x6B,0xFD,0x50,0xE6, + + 0x88,0x30,0x90,0xF6,0xB2,0x3B,0x43,0x84,0xC8,0xCD,0x6A,0xC0,0x13,0x08,0x59,0xF2, + + 0x09,0x8E,0x99,0xFA,0xAE,0xF3,0xB7,0xEE,0x76,0xC5,0x65,0xA2,0xDC,0x5F,0xFE,0xEA, + + 0xDF,0x30,0x3F,0xAC,0xD3,0x36,0xC0,0x1D,0xCB,0xC4,0xEE,0x07,0xFF,0x44,0x84,0x84, + + 0x08,0xA7,0x00,0xE6,0x92,0x28,0x10,0x20,0x40,0xCD,0xB7,0x08,0x80,0x51,0xE4,0x94, + + 0x3A,0xF0,0x00,0x29,0xB2,0x27,0x64,0xD6,0x65,0x5A,0x29,0xD6,0xFD,0xEA,0x46,0x85, + + 0x84,0x90,0x08,0x95,0x33,0x24,0x48,0xAF,0x27,0x59,0xF1,0x27,0xF0,0xE9,0x01,0x15, + + 0x01,0xB2,0x01,0x29,0x70,0x2C,0x67,0x57,0x81,0x0C,0xD7,0xD7,0x7D,0xBE,0x38,0x42, + + 0x18,0x89,0x44,0x4F,0xC6,0x47,0x51,0xE4,0x02,0x0D,0xD0,0x64,0x52,0x64,0x5E,0x11, + + 0xE8,0xB6,0x79,0xF1,0x68,0x05,0x7F,0x58,0x93,0xA4,0xD8,0x74,0x53,0x65,0x3A,0xBA, + + 0x6B,0xB5,0x66,0xF5,0x2E,0xA5,0xF6,0x4D,0x16,0x77,0xD1,0x65,0xD2,0x66,0x77,0xE9, + + 0xE9,0x0F,0x7E,0xE1,0x95,0x8C,0xEA,0x5C,0x3F,0xD6,0xD9,0x75,0xD3,0x67,0x5B,0x9F, + + 0xED,0x64,0xDC,0xBD,0x08,0x57,0xD2,0xC9,0xD3,0x0A,0xEA,0x0B,0xA5,0x67,0xD0,0x1C, + + 0x89,0xA8,0xEB,0xE3,0x1F,0x09,0xBA,0xD0,0xA2,0x04,0x25,0xDE,0x22,0xA9,0x61,0x0D, + + 0x8B,0x3B,0x5A,0x4F,0x63,0xB1,0x4E,0xCD,0xCE,0xD2,0x27,0x53,0x7B,0x0F,0xCB,0xF0, + + 0x41,0x67,0xD8,0xE4,0x89,0xB0,0xF7,0xAB,0xD9,0x43,0x44,0x1D,0xAE,0x6F,0x3C,0xF0, + + 0xF3,0xAF,0x77,0x5D,0x7C,0x28,0x92,0x81,0x22,0xB9,0xD2,0x6C,0x5A,0x6C,0x1C,0xF4, + + 0xE0,0x5E,0x91,0x5C,0x1D,0x67,0xF9,0x41,0x97,0x9C,0xDA,0x7C,0x5B,0x6D,0x96,0xBA, + + 0xB4,0x93,0x77,0x69,0x42,0x7D,0x05,0xED,0xF1,0x48,0xD3,0x6D,0xDA,0x6E,0x75,0x3C, + + 0xE3,0xFC,0xD2,0x42,0xED,0xFB,0x65,0x41,0xA3,0x9E,0xDB,0x7D,0xDB,0x6F,0x00,0x04, + + 0x1B,0x95,0x6B,0x66,0xB2,0x18,0x66,0xA9,0x78,0xDB,0xAA,0xE0,0xFD,0xD6,0xB6,0xF0, + + 0x25,0x5F,0xF4,0xF6,0x70,0xB1,0xC4,0x34,0x30,0x15,0x4B,0x85,0xD0,0x8E,0x0D,0x90, + + 0x93,0xF4,0x21,0xE7,0xF3,0xDD,0xEA,0x43,0xE6,0x69,0x0D,0x65,0x91,0xDF,0x9D,0x6D, + + 0x1F,0xE8,0xF5,0xB1,0x50,0x9C,0xDD,0x54,0xD8,0x11,0xA3,0x09,0xF7,0x48,0x24,0xC2, + + 0xFF,0x19,0xC4,0xC4,0x32,0x34,0x50,0x0C,0x62,0xD9,0xD4,0xE4,0x72,0x74,0x70,0x41, + + 0xDB,0xBC,0xCC,0xD4,0x33,0x35,0x02,0xDF,0xB7,0xE4,0xDC,0xF4,0x73,0x75,0x3B,0x70, + + 0x81,0x56,0xC5,0xC5,0xB2,0x36,0x2A,0xDE,0x84,0x14,0xD5,0xE5,0xF2,0x76,0x7E,0xA1, + + 0xDC,0x01,0xCD,0xD5,0xB3,0x37,0xFA,0xCD,0x6E,0xFA,0xDD,0xF5,0xF3,0x77,0x46,0xFB, + + 0x41,0xB9,0x95,0x7F,0x04,0x97,0xDE,0xE7,0x4A,0x59,0x18,0xCE,0x93,0x70,0xDA,0x76, + + 0xC8,0xA6,0xAA,0x61,0xB8,0x8C,0x4E,0x34,0x25,0x42,0xA0,0x09,0x58,0x98,0x3F,0x66, + + 0x41,0x93,0x16,0x7E,0x80,0xE1,0x57,0x89,0xC4,0xEA,0x23,0xCF,0x13,0x52,0x8F,0xC5, + + 0xA6,0xC0,0x91,0xA7,0xD8,0x79,0x43,0xCB,0x4E,0x4B,0x2C,0xFD,0x05,0x53,0x9D,0xC7, + + 0x2C,0x56,0xC6,0xCC,0x3A,0x3C,0xC5,0x7B,0x4C,0xF1,0xD6,0xEC,0x7A,0x7C,0x5B,0xC3, + + 0x1B,0x89,0xCE,0xDC,0x3B,0x3D,0xDC,0xC6,0x41,0xA8,0xDE,0xFC,0x7B,0x7D,0x5E,0xD6, + + 0x9E,0xCA,0xC7,0xCD,0xBA,0x3E,0x40,0x7A,0xC0,0x54,0xD7,0xED,0xFA,0x7E,0xD9,0x5D, + + 0x90,0x3E,0xCF,0xDD,0xBB,0x3F,0x8F,0xFB,0xA1,0x31,0xDF,0xFD,0xFB,0x7F,0xE0,0xEB, + + 0x78,0x8A,0xA0,0xFB,0x14,0x7B,0x31,0xA6,0x6B,0xF9,0x70,0xE3,0xB8,0x1D,0x75,0x05, + + 0x88,0x9A,0x17,0x4A,0x34,0xB1,0x2C,0x16,0x43,0xEA,0x2A,0xD4,0x71,0x55,0x62,0xFA, + + 0xC4,0xC0,0x89,0x83,0x91,0x52,0xF1,0xD3,0x9B,0x8C,0xCB,0x37,0x56,0xE6,0x90,0x97, + + 0xBE,0xA0,0xC9,0x56,0x78,0x28,0x54,0xCF,0x4D,0x38,0x6F,0x39,0xE7,0x97,0x1E,0xFF, + + 0xE7,0x27,0xB7,0x5D,0x64,0x30,0x0E,0xC2,0xAF,0xB5,0xF0,0x66,0x56,0xE4,0xE0,0x71, + + 0x86,0x70,0x57,0x19,0xF6,0xFA,0xD4,0x01,0x37,0x63,0xF8,0x76,0x57,0xE5,0xB2,0xB0, + + 0xF0,0x26,0x34,0x78,0xA0,0xDA,0x27,0x5A,0x2D,0x37,0xF1,0x67,0xD6,0xE6,0xF1,0x1C, + + 0x7A,0xFB,0x94,0xBD,0x6B,0x74,0xEA,0x80,0xE1,0x6A,0xF9,0x77,0xD7,0xE7,0x6A,0x17, + + 0x81,0xD5,0xD9,0xEC,0x9C,0x77,0x1A,0xAE,0x74,0xE7,0xE7,0x5C,0xB7,0x5B,0xEA,0xF3, + + 0x93,0x8D,0xA2,0x9B,0xBC,0x23,0x55,0xBE,0x0D,0x97,0xC4,0x92,0xB6,0x3A,0x41,0x0A, + + 0x8D,0xBA,0x63,0xDF,0x65,0xAC,0xF3,0xC2,0x83,0xD1,0xCD,0x97,0x37,0x99,0x29,0xF3, + + 0x43,0x40,0x5C,0xFD,0x3C,0x21,0x5B,0x70,0x76,0xC6,0x1C,0x82,0x36,0xA3,0x58,0xA4, + + 0xB5,0x93,0x22,0x4B,0x86,0xED,0xE7,0xF9,0x36,0x63,0xF2,0x6E,0x5E,0xEC,0x5D,0xF7, + + 0xFF,0xDE,0xEA,0x5E,0x1F,0xAD,0x44,0xCE,0xC2,0x6B,0xFA,0x7E,0x5F,0xED,0xD4,0xF2, + + 0x7A,0x1D,0xE3,0x4F,0x9E,0xAE,0x27,0x19,0x25,0x0D,0xF3,0x6F,0xDE,0xEE,0xAB,0x5E, + + 0x17,0xCE,0xEB,0x5F,0x9F,0xAF,0xE7,0xBB,0x88,0xB4,0xFB,0x7F,0xDF,0xEF,0x00,0x7F, + + 0xA5,0xD2,0x6C,0xEE,0xE8,0x21,0x36,0x44,0xE1,0x22,0x74,0x4F,0x1C,0x25,0xE2,0x7A, + + 0x98,0xD3,0x8F,0xBF,0xC0,0xBD,0x94,0x8D,0x84,0x0E,0xC3,0x32,0x4E,0x97,0x30,0x60, + + 0xA2,0xA9,0x06,0xAA,0x6C,0xE3,0xA5,0x65,0xBA,0x93,0xE4,0x98,0xCE,0x6D,0x70,0x43, + + 0x96,0x2D,0x95,0xE8,0x34,0xBE,0x5D,0xF2,0x69,0xDE,0x92,0xC8,0x2C,0x6F,0xD3,0xEE, + + 0xD2,0xA5,0xE4,0xC6,0x36,0xB4,0x4A,0xDE,0xAC,0xD7,0xF4,0xE6,0x76,0xF4,0xF9,0xCD, + + 0x57,0xF9,0xEC,0xD6,0x37,0xB5,0x74,0xE6,0x93,0x24,0xFC,0xF6,0x77,0xF5,0xA5,0xC6, + + 0x3E,0x42,0xE5,0xC7,0xB6,0xB6,0x4B,0xDA,0x2C,0x27,0xF5,0xE7,0xF6,0xF6,0x53,0xEB, + + 0x65,0x91,0xED,0xD7,0xB7,0xB7,0xCA,0x53,0x67,0x57,0xFD,0xF7,0xF7,0xF7,0xE6,0x63, + + 0x6F,0x9E,0x66,0x67,0x14,0xB6,0x3C,0xA2,0xCF,0xDE,0x0D,0xF4,0x95,0x0B,0x85,0x18, + + 0xE0,0x16,0x55,0x1A,0x31,0x8D,0x5E,0xFA,0xC3,0xD6,0x6D,0x3A,0x46,0x11,0x89,0x69, + + 0xAA,0x1A,0x9F,0x70,0x3F,0xB7,0x3F,0xE3,0x0D,0xD5,0xA1,0xCD,0x03,0x57,0xEF,0x8B, + + 0x48,0x9B,0x08,0xA7,0x69,0xCA,0x5F,0xFB,0xF0,0x50,0x84,0x5D,0x51,0x46,0x58,0xE7, + + 0xEC,0xBC,0xE6,0xCE,0x3E,0xBC,0xC5,0xD3,0x92,0x0D,0xF6,0xEE,0x7E,0xFC,0xDD,0xF7, + + 0xD3,0x0C,0xEE,0xDE,0x3F,0xBD,0xEF,0xC4,0x57,0x68,0xFE,0xFE,0x7F,0xFD,0x2F,0xCF, + + 0x07,0x3C,0xE7,0xCF,0xBE,0xBE,0xB7,0x02,0x86,0x2B,0xF7,0xEF,0xFE,0xFE,0x55,0x21, + + 0x54,0x84,0xEF,0xDF,0xBF,0xBF,0x6E,0xC1,0x83,0x9D,0xFF,0xFF,0xFF,0xFF,0x60,0x02, + + 0xD5,0x0D,0x40,0xED,0xDB,0x7D,0xBC,0xB3,0x65,0x48,0xA7,0x55,0xA0,0xE9,0x1C,0x30, + + 0xF9,0xA8,0xF0,0x33,0xE8,0x2E,0x84,0x0F,0x2F,0x94,0x0E,0x0B,0x61,0xFA,0x7F,0xB0, + + 0xA3,0x42,0x41,0xEC,0xEE,0xBF,0x91,0x00,0xE0,0xF7,0x01,0xDC,0xD4,0xB7,0x3A,0x61, + + 0xFE,0x15,0x8F,0xBC,0x11,0xD4,0xCB,0xB5,0xAE,0x81,0x99,0x31,0xD5,0xF1,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xD9,0x07, + + 0x0E,0x42,0x42,0xE5,0xA4,0x89,0xB1,0x11,0x94,0x99,0xE9,0xD7,0xAF,0x2A,0x1F,0x03, + + 0x39,0x9D,0xDC,0xA8,0xF2,0xEA,0xCA,0x4B,0x31,0xEF,0x1A,0x2C,0x04,0x27,0x1A,0x16, + + 0xBC,0xDE,0x55,0xFE,0xF6,0xF7,0xBF,0x5A,0xBC,0xEC,0x13,0xD3,0xEB,0x7A,0x9D,0x9D, + + 0xB2,0x2A,0x8D,0xB5,0x91,0xF0,0x4F,0xF9,0x8D,0x9E,0x8B,0xFB,0xBD,0xE6,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x05,0x04, + + 0x60,0x59,0xFC,0x7A,0xCD,0x91,0x01,0x9B,0x50,0xC5,0x6B,0xD7,0x04,0x86,0x2B,0xB8, + + 0xF1,0xF0,0x77,0x64,0xA3,0xC0,0xBF,0x15,0xBD,0xD2,0x8B,0x3E,0x55,0x61,0xA2,0xAD, + + 0x74,0x23,0xBD,0x7A,0x45,0x51,0x83,0x25,0xEC,0x66,0xCF,0xA7,0x43,0xDB,0xBE,0xBC, + + 0x5D,0x82,0xF3,0x93,0xD2,0x47,0x27,0x42,0xDB,0xFE,0xA7,0x81,0x16,0x61,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xC6,0x61, + + 0x40,0xED,0x55,0x7F,0xB4,0x79,0x43,0xEF,0xA2,0x31,0xCC,0xAD,0x1E,0xB7,0xAD,0xA1, + + 0xF5,0xC8,0xB2,0xFA,0xCA,0x29,0xDE,0x51,0xA2,0xC4,0xCF,0x5E,0x99,0xD8,0x51,0x0D, + + 0x93,0x1C,0x47,0x9D,0x2F,0x21,0x5F,0x05,0x9B,0x5A,0x07,0xDE,0xD5,0xDE,0x31,0xA1, + + 0xC1,0xCA,0x37,0x66,0xA9,0x76,0xDF,0x50,0x97,0x56,0xCA,0x42,0xDD,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x97,0x2E, + + 0xF0,0xB1,0x30,0x38,0x75,0x55,0x64,0x1D,0x62,0xC4,0xE9,0xB1,0xB3,0xA1,0xBD,0x0D, + + 0x75,0xED,0x01,0x68,0x80,0x2C,0x5E,0x92,0xAC,0x70,0xDA,0x37,0x71,0x4C,0xE1,0x06, + + 0x1C,0x56,0xBF,0x48,0x69,0xDE,0x77,0xE4,0x2D,0x13,0x1D,0xCF,0x0E,0x2F,0x17,0x2B, + + 0x47,0x85,0xD4,0xFD,0xB1,0xB8,0x5F,0x0E,0xC4,0x03,0x25,0xC6,0x76,0xA3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x1C,0x27, + + 0xCE,0xA8,0xDA,0x68,0xC2,0x75,0x81,0x17,0xB0,0xCB,0x80,0x10,0xFF,0xA9,0x99,0x37, + + 0xF1,0x18,0xEB,0x78,0x7C,0xAD,0x8D,0x06,0x4B,0xF2,0xC4,0x38,0xBC,0x6A,0x6B,0x0F, + + 0xA4,0x8B,0xB9,0x0D,0x77,0xA5,0x13,0x3B,0x38,0x7B,0xE9,0xD5,0xB4,0xDB,0x11,0xE1, + + 0x76,0x90,0xCD,0xFD,0xB9,0x08,0x2D,0x04,0xF9,0x1E,0x92,0xCC,0x51,0xAA,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x5A,0x22, + + 0xCD,0xE1,0x5F,0x8E,0x91,0x4F,0xCF,0x85,0xC5,0xAF,0xB4,0xA6,0x74,0xF0,0x80,0xE1, + + 0x55,0x37,0xEC,0xAB,0xDE,0xF5,0xE8,0x8D,0x07,0x6E,0xBC,0xB6,0x75,0xF1,0x73,0xBA, + + 0x4F,0x63,0x35,0x22,0x43,0x39,0xF5,0x4A,0xD4,0x07,0xB5,0xA7,0xF4,0xF2,0xBE,0x60, + + 0x83,0x3E,0xF7,0xB8,0xC3,0x1C,0xFD,0xB7,0x12,0x5E,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0xB3,0x19, + + 0x54,0x37,0x02,0xAA,0x4B,0x9C,0xCB,0x46,0x64,0xE7,0xB6,0xAE,0x7C,0xF8,0x70,0x2F, + + 0xBF,0x14,0x73,0x3D,0x56,0x48,0x11,0xC5,0xB4,0x45,0xBE,0xBE,0x7D,0xF9,0x73,0x7A, + + 0xCA,0xEE,0x78,0xCD,0x8B,0xE6,0x4E,0x2F,0xE0,0xEE,0xB7,0xAF,0xFC,0xFA,0x51,0x33, + + 0x44,0x88,0x06,0x6E,0x9F,0x4E,0x84,0xE1,0xDA,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x31,0x2B,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x07,0xFF,0x80,0x00, + + 0x55,0x40,0xF8,0x86,0x13,0xC6,0x69,0xF0,0x0C,0xC1,0xE1,0x3C,0xD7,0x75,0x88,0x99, + + 0x08,0x41,0xC0,0x96,0x18,0x45,0x32,0xE0,0x1D,0xC9,0x9C,0xD6,0xD4,0xB4,0x01,0x8D, + + 0x05,0x42,0xB9,0x75,0x24,0x2B,0x12,0x6B,0x4D,0x21,0xF1,0x65,0x77,0xE9,0x09,0x0D, + + 0x87,0x03,0xB1,0x45,0x81,0x2C,0x09,0x7B,0x4D,0x4B,0x71,0x1A,0x56,0xF6,0xAF,0xB7, + + 0x26,0x48,0xEA,0x94,0x4E,0xA4,0x70,0xF4,0xAB,0x5D,0x9A,0xF9,0xB9,0x0F,0x78,0xB2, + + 0x81,0xE9,0x37,0x24,0x1B,0x2C,0x07,0x16,0x02,0x67,0x6C,0x16,0x10,0x97,0x57,0x33, + + 0x00,0x1A,0x98,0xB8,0x35,0x6B,0x01,0x16,0x86,0x5D,0xE9,0xC0,0x54,0x44,0xF4,0xB3, + + 0x68,0xDD,0xCA,0x26,0xEF,0x65,0xA1,0x02,0xF2,0x44,0xA7,0x85,0x72,0x22,0x47,0xAC, + + 0x2C,0x48,0xE2,0x4C,0x05,0xA3,0x10,0xDA,0x0F,0x4C,0xF2,0x6D,0x14,0xE3,0x9A,0x3C, + + 0x2F,0x49,0x03,0x8C,0xBA,0x2F,0x20,0x3A,0x55,0x69,0x18,0xDE,0xDB,0x41,0x58,0x40, + + 0x2B,0x6F,0x03,0xEF,0x1A,0x22,0x17,0x7D,0x2F,0xB4,0x11,0xCF,0x5A,0x42,0xDF,0x23, + + 0xAF,0x48,0x03,0x20,0x3A,0x2D,0x9B,0x29,0xD9,0x49,0x9D,0xCD,0x85,0x64,0xEA,0x68, + + 0xE1,0x96,0x48,0x93,0x95,0xD1,0x6E,0x7C,0x79,0xF7,0xEC,0xEA,0x02,0x09,0x2A,0x12, + + 0xD5,0x02,0x48,0x2F,0x67,0xAD,0x64,0x01,0x2A,0x0D,0xC4,0x94,0x81,0xA6,0xEB,0xD5, + + 0x0F,0xFC,0x03,0x19,0x0F,0x26,0xEB,0x39,0xCC,0x01,0xEB,0xBD,0x86,0xC1,0x12,0x5B, + + 0x2C,0xA0,0x92,0xA0,0x3C,0x29,0x03,0x7D,0x43,0x73,0xFB,0x0E,0xF4,0xCE,0x04,0x80, + + 0x78,0xF8,0x3A,0x74,0xC3,0x3F,0x2C,0xC0,0xD0,0x58,0x23,0x00,0x76,0x50,0xDE,0xB0, + + 0x26,0xE9,0x8A,0x16,0x38,0x55,0xE5,0xC2,0xEF,0x34,0x98,0x42,0x0E,0x61,0x4F,0x28, + + 0x82,0x11,0xA5,0x7B,0xB6,0xC9,0x64,0xD3,0x6E,0x37,0x6F,0x9A,0xDE,0x30,0x02,0x1D, + + 0x24,0xE6,0xB5,0x45,0x5E,0x3C,0x64,0xC3,0x6F,0x36,0x75,0x17,0x74,0x74,0xFF,0x33, + + 0x13,0xA9,0x6F,0x41,0xA1,0x0B,0x8F,0xC6,0x15,0x48,0x8E,0x04,0x9B,0x1F,0x93,0xB2, + + 0x60,0x72,0xF6,0x32,0x23,0xBE,0x03,0x0F,0x65,0x8E,0x5B,0xE7,0x5C,0x7E,0x3B,0xA8, + + 0x20,0x12,0xBB,0xA9,0x81,0x6F,0x8A,0xEB,0xDD,0xD4,0x39,0x76,0x91,0x7E,0x14,0x89, + + 0x04,0xBA,0xC5,0x33,0x31,0x33,0xE4,0x0D,0x72,0xAC,0xFD,0xF9,0x1A,0x7C,0xC6,0x75, + + 0x60,0xB3,0xE6,0x4C,0xF6,0xB3,0x3F,0xFB,0xEC,0x44,0x79,0x42,0xFD,0xDF,0x21,0x69, + + 0x31,0x1C,0x91,0x18,0x38,0x39,0x66,0x9F,0xF8,0xF5,0xCC,0xBB,0x0E,0x7D,0x37,0xD7, + + 0xC3,0x0A,0x36,0x6F,0x59,0x95,0xBE,0xFA,0x64,0x06,0xB1,0x1C,0x7C,0xDE,0x51,0xE5, + + 0xB9,0xB0,0x27,0xA2,0xBF,0xC0,0xBF,0xF3,0x7C,0xF7,0x40,0xAD,0x7E,0x7C,0x5B,0x99, + + 0x1B,0x17,0x25,0xAE,0xFB,0xB6,0x62,0x05,0x22,0xD1,0x3A,0x7E,0x66,0x74,0x10,0xB0, + + 0x27,0xB6,0x0E,0x89,0x01,0x06,0x85,0xA6,0x14,0xD7,0xE0,0x19,0xF6,0xDB,0x42,0xAF, + + 0x89,0xDE,0x40,0xAD,0xA6,0x33,0x28,0x6D,0x9D,0x03,0x53,0x1C,0xD9,0x0E,0x52,0x26, + + 0x29,0x1B,0x52,0x3A,0x52,0x30,0x82,0xE8,0x0A,0xE0,0x85,0xBD,0xB3,0xDB,0x20,0x02, + + 0x04,0xC0,0x28,0x3A,0xF5,0xAF,0x20,0x62,0xC4,0xC6,0xD0,0x67,0x14,0xEF,0x28,0x12, + + 0x05,0xC1,0x80,0xE9,0x62,0xA5,0x3C,0xB5,0x64,0x56,0x1B,0x92,0x89,0x82,0xFA,0xD3, + + 0x84,0x82,0x7C,0x27,0x6F,0x39,0x6A,0x50,0x25,0x19,0x71,0xEA,0xB1,0xA3,0x29,0x8F, + + 0x85,0x83,0x69,0x16,0x25,0x18,0x8D,0xCC,0x86,0x30,0x9A,0x87,0x0D,0x40,0xA9,0xB1, + + 0x19,0x2B,0xC0,0x96,0xB7,0x0B,0xD8,0xE2,0xC3,0x64,0xAA,0x95,0x37,0xFF,0x08,0x50, + + 0x40,0x88,0xD0,0xBE,0xC5,0x6A,0x23,0x70,0x3C,0xDD,0xFD,0x65,0x36,0x8E,0xFC,0xB2, + + 0xF9,0x79,0x78,0xC5,0x16,0xCC,0xAA,0x60,0xB9,0x0E,0x54,0x91,0xF6,0x56,0x43,0x83, + + 0xDB,0x07,0x89,0x55,0x3D,0xAA,0xA4,0x63,0xC1,0x9C,0xC3,0x84,0xB4,0xFC,0x22,0x0A, + + 0x0C,0xC8,0xB2,0xF6,0x1C,0x53,0x62,0x59,0x54,0x42,0x5A,0x9D,0xD9,0xAF,0x2A,0x1A, + + 0x0D,0xC9,0xB5,0x92,0xE0,0x71,0x8E,0x5A,0x45,0x19,0x7A,0x3F,0xBA,0x64,0x23,0x96, + + 0x8C,0x8A,0xA3,0xF3,0x1D,0xE8,0xF4,0xD5,0x2D,0xAC,0x1B,0x8C,0xA3,0x99,0x76,0xAF, + + 0x8D,0x8B,0xB3,0x17,0x1F,0x83,0x94,0xEB,0x4C,0x6A,0x44,0xBB,0xD5,0x24,0x02,0x00, + + 0x61,0x83,0xFA,0xDE,0xBF,0x63,0x72,0x96,0xC6,0x37,0x95,0x98,0xDC,0xE8,0xD8,0x38, + + 0xF8,0x8B,0xD8,0x60,0xBC,0xB6,0x05,0xFE,0x38,0x90,0xB0,0xE3,0xB4,0xE6,0xCB,0x53, + + 0x0C,0x8A,0x59,0xBE,0x3D,0xCE,0x78,0x86,0xAD,0x43,0x68,0x0D,0xD0,0x8C,0x4B,0x68, + + 0x2E,0x30,0x6B,0x01,0x12,0xCD,0xBB,0x06,0xC2,0x8D,0xEB,0xFE,0x83,0x4B,0x01,0x82, + + 0x4F,0xB4,0xA2,0x04,0x31,0xD8,0x90,0xEC,0xBB,0xED,0x04,0x14,0x5A,0xB5,0xAC,0x92, + + 0x94,0x1C,0xCC,0xD7,0x98,0xBC,0x63,0xFA,0x1A,0xF1,0x53,0x44,0x73,0xF1,0xDA,0x87, + + 0xA4,0xF7,0x9D,0x57,0x43,0xBD,0xDE,0xD4,0x64,0x05,0x43,0x02,0x71,0xF5,0xC9,0xB4, + + 0x16,0x1E,0xA7,0x93,0x16,0xB5,0xFD,0xCF,0xB1,0xD5,0x7F,0x69,0x0C,0x8D,0xBB,0xA0, + + 0x04,0xF9,0xA1,0x21,0x41,0x78,0xB4,0x1E,0xD3,0xD2,0x28,0xDB,0xF6,0x94,0xD2,0xC7, + + 0x14,0x2E,0xB3,0x05,0x08,0xE4,0xFB,0x01,0x1B,0xDE,0x6B,0xC7,0x54,0x77,0x22,0xB0, + + 0x97,0x95,0x3A,0x74,0xC5,0xB2,0x55,0xBE,0x47,0x5C,0xD3,0x17,0x8A,0x5B,0x37,0xD2, + + 0x00,0x93,0x2D,0x3B,0xB7,0x6C,0x7B,0x02,0x9B,0xF7,0x83,0xCA,0x3F,0xFC,0xC2,0xAD, + + 0x2D,0xF8,0x2E,0x22,0xDD,0xB7,0x3A,0xD4,0xCD,0x52,0x8B,0xE8,0xDE,0xB6,0x2F,0x45, + + 0xCE,0x9D,0x71,0x23,0x42,0xCA,0xB9,0x58,0xEF,0xF1,0xBF,0x1B,0xFB,0x3E,0xDD,0x89, + + 0xA4,0xD5,0x13,0x9F,0x1F,0xF8,0xCC,0x49,0x40,0x51,0xC3,0x8B,0x01,0x01,0x3A,0xE9, + + 0x23,0xFE,0x6F,0xA2,0x0A,0x10,0x84,0xD9,0xAC,0x9B,0x57,0x1D,0x78,0xFC,0xF0,0xB9, + + 0x1F,0x87,0x4D,0x33,0x06,0x27,0x56,0xE6,0x87,0x2D,0x8E,0xFC,0x4D,0xD8,0x34,0xDE, + + 0x88,0x99,0x2D,0x5A,0x08,0xBD,0xFA,0x0B,0x13,0x1D,0xC6,0x2E,0x23,0xFB,0x38,0x6B, + + 0x07,0x3E,0xC7,0x36,0x50,0xC5,0x9B,0x79,0xAA,0xD6,0x0D,0x6D,0x7E,0xA4,0xAA,0x2B, + + 0xAD,0xD0,0x8F,0xDD,0x9A,0xB2,0x1F,0xF9,0xB2,0xD2,0x51,0xB0,0x5C,0xF2,0x5E,0xE2, + + 0x14,0x85,0x78,0x86,0x90,0x1B,0x0A,0x33,0x29,0x4F,0x68,0x42,0x63,0x20,0x30,0xEF, + + 0xC0,0x8B,0xC2,0x89,0x93,0xCD,0x66,0x45,0x72,0x35,0xAA,0xCB,0xA5,0x6E,0x79,0x83, + + 0x00,0x58,0xB9,0x80,0x9E,0x40,0x23,0x32,0x63,0x8B,0x69,0xD4,0x73,0x91,0x8E,0x93, + + 0x10,0x38,0xB1,0xF7,0x30,0x28,0xA3,0x22,0xA8,0x4C,0x59,0xCD,0xAE,0x21,0xC2,0xC2, + + 0x82,0xAD,0x78,0x03,0xD0,0x84,0x50,0xE4,0x49,0x43,0x80,0x6C,0x31,0x44,0x08,0xD6, + + 0x03,0x03,0x30,0xD6,0x93,0xFE,0x06,0x70,0xE7,0x67,0xA0,0x06,0x60,0xD1,0x79,0xB2, + + 0xF6,0x43,0x89,0x40,0xF1,0x86,0x91,0x95,0xC3,0x04,0xA9,0xE7,0xF0,0xB6,0x69,0x0D, + + 0x22,0x6B,0xF1,0x85,0xCF,0x86,0x63,0xD4,0xF0,0xF1,0x23,0x86,0xAE,0x2B,0x7A,0x8C, + + 0x05,0x62,0x06,0xFC,0x44,0x27,0x20,0xD7,0x7B,0x8C,0x1C,0xF0,0xDD,0x9D,0x40,0x05, + + 0x8B,0xE5,0xEA,0x56,0xFD,0x6B,0xA5,0xCE,0xA0,0xA0,0xE2,0x7A,0xED,0x6F,0x63,0x0B, + + 0x02,0x07,0xE3,0x0F,0xD3,0x27,0x2D,0xCB,0x2F,0x5A,0xF3,0x6D,0x66,0xE7,0xA2,0xFB, + + 0x0B,0x0F,0x01,0x6B,0x1B,0x2F,0x15,0x4D,0xE8,0x3B,0xCB,0x38,0x7A,0xC6,0x86,0x68, + + 0xAB,0x8C,0xFA,0x7D,0xBB,0x37,0xD8,0x97,0x79,0xB8,0x55,0xE8,0x2D,0x0A,0x95,0x28, + + 0x7C,0x0D,0xEA,0x3E,0x99,0x81,0x8E,0xA8,0xCA,0xB5,0xA4,0xC8,0xB0,0x8E,0xF3,0x45, + + 0x0C,0x0E,0x06,0xAB,0x18,0x2A,0xE9,0x97,0x0B,0x2D,0x3B,0x52,0xFE,0xE3,0x8B,0xA1, + + 0x25,0xA2,0x3E,0xBF,0x3A,0x43,0x51,0xD9,0x74,0xFA,0xA5,0xD5,0xB0,0xCC,0xFC,0x68, + + 0x7B,0x5D,0xA4,0x4D,0x91,0x3B,0x2E,0x49,0x47,0x3F,0xCC,0xBD,0xD1,0x12,0xF4,0x83, + + 0x48,0xE0,0x4C,0xC1,0x7E,0x37,0xE0,0x58,0x8D,0x1C,0x1E,0xD6,0xFC,0x13,0x5D,0x84, + + 0xC3,0x02,0x45,0x07,0x21,0xF7,0x2C,0x90,0x41,0x60,0x75,0x25,0xD2,0x70,0xCD,0xC4, + + 0xFB,0x99,0x23,0xC7,0xB7,0xDB,0xE2,0xE3,0xA2,0xA3,0x59,0x33,0xB9,0x70,0x1D,0xC6, + + 0xC5,0xA9,0xFC,0x3A,0x34,0xD6,0x50,0x02,0x64,0x8F,0x2A,0xD5,0x18,0x36,0xC6,0x30, + + 0x6B,0xDE,0xEC,0x39,0x35,0xFD,0xDC,0x10,0x67,0x78,0x3F,0xB4,0x33,0xD5,0x44,0x37, + + 0x47,0x04,0xB6,0xDA,0x99,0x30,0x7D,0x92,0x9B,0xDF,0x15,0xEB,0x09,0x18,0x89,0xD9, + + 0xC4,0x7C,0x53,0x51,0xF6,0xEA,0x82,0xD1,0xF7,0x17,0x0B,0xF7,0xBF,0xCA,0xC1,0x28, + + 0x89,0x78,0x48,0x0E,0xF5,0x24,0x4F,0x83,0xCF,0x5E,0x92,0x1D,0x58,0xA8,0x15,0x1C, + + 0x6C,0x7E,0xAE,0x82,0x98,0xB5,0x7E,0xBA,0x78,0x54,0xA6,0x4F,0x0D,0x1C,0x21,0xF9, + + 0xD4,0x01,0x47,0xD8,0xF7,0x3C,0x37,0xE0,0x49,0x85,0x47,0x2F,0x78,0x39,0x56,0xE1, + + 0x0E,0xBF,0xC5,0x80,0x3B,0x27,0x60,0xC7,0xDA,0xB3,0xA7,0x42,0x7B,0x7F,0x86,0x9C, + + 0x1F,0xE9,0xEE,0xAE,0xC7,0x30,0x6A,0x15,0x4A,0x5C,0x7A,0x72,0x79,0x3C,0x66,0xBA, + + 0xD6,0x11,0x33,0x58,0x7E,0x16,0x7E,0x00,0xCA,0xD1,0xBC,0xF9,0x7A,0x9D,0xD4,0x4D, + + 0xEF,0x11,0xFF,0x49,0xFF,0xB0,0xD7,0x8A,0x95,0x58,0xD1,0x45,0x07,0x10,0x77,0x5D, + + 0xEE,0x91,0xA7,0xBF,0x44,0x31,0x9B,0x7C,0xA8,0x3F,0x60,0x6F,0xA3,0x75,0x44,0x60, + + 0xC5,0x0A,0xED,0x64,0x96,0x4C,0xDC,0x51,0x29,0x46,0xAF,0x56,0x50,0xE9,0x50,0x90, + + 0x85,0xA5,0xC8,0x14,0x0E,0xAC,0x3A,0x72,0x01,0xC7,0x80,0x93,0xD3,0xB1,0xA6,0x81, + + 0x49,0x4E,0x8B,0x83,0xD1,0x6F,0x0A,0x50,0xA1,0x44,0x6D,0xA5,0x54,0x59,0x11,0x41, + + 0xC6,0x73,0xE3,0x0A,0x17,0x4F,0x1D,0x33,0x64,0xCA,0xD9,0x35,0xBC,0xEE,0x7F,0x32, + + 0x02,0x8D,0x82,0x4A,0x15,0xC4,0x6E,0x5D,0x65,0x86,0xF4,0x15,0x6D,0x65,0x50,0xAC, + + 0x85,0x81,0xC8,0xBA,0x11,0x6D,0x7F,0x67,0xAC,0xEF,0x54,0xE9,0x54,0xCF,0x2C,0xC1, + + 0x06,0x9F,0xBB,0xB8,0x35,0xA0,0xAE,0xE2,0x27,0xC7,0x8E,0x98,0x3F,0x45,0xF7,0x31, + + 0x7C,0x5A,0x77,0xD3,0xD2,0x7A,0xCC,0x02,0x3C,0xC3,0xA3,0x80,0xBF,0x44,0x7B,0x72, + + 0xAB,0x85,0x8B,0xEC,0xB0,0x25,0xCB,0x59,0x25,0xD7,0xCC,0x12,0x7E,0xB8,0xD2,0xF2, + + 0x7C,0xC4,0x92,0xFE,0x19,0xCC,0x03,0x0B,0xEC,0xFB,0x82,0xCC,0xA2,0xEF,0x69,0x16, + + 0xBF,0x30,0xDB,0x8D,0x0D,0x6F,0x09,0xC2,0xEF,0xA5,0x7B,0xAD,0x5C,0x1B,0x73,0x1E, + + 0xEE,0x2B,0x93,0xFF,0x8F,0xAD,0xC7,0x48,0xAC,0xD4,0x9B,0x03,0x7C,0x12,0x1C,0x72, + + 0xF7,0x23,0xCA,0x2C,0xE3,0xA0,0xF0,0x99,0x45,0xB9,0x32,0xEA,0xCA,0x13,0x52,0xA4, + + 0x8D,0x89,0x17,0xDA,0x5A,0x86,0x22,0xFE,0x30,0x7F,0x3A,0x82,0x8C,0xAF,0x74,0xC9, + + 0x0E,0xD7,0xDB,0xCB,0xDB,0x20,0x6D,0x50,0xED,0x3B,0x33,0xEA,0x66,0x51,0x76,0x39, + + 0x74,0x52,0x83,0x3D,0x60,0xA1,0x1B,0xDB,0xC3,0x44,0x3F,0x54,0x28,0x64,0x3E,0xBF, + + 0x22,0x78,0xC3,0x64,0x98,0x3D,0xCC,0xD9,0x74,0x9F,0x6D,0xC4,0x9F,0xDB,0x14,0x97, + + 0xED,0x38,0x94,0x76,0x31,0xD4,0xC7,0x30,0xE5,0x89,0x46,0xC5,0x01,0x9D,0x62,0x53, + + 0xFA,0x91,0xDD,0x05,0x25,0x04,0x55,0xA1,0xF9,0xDF,0x01,0xC5,0xC7,0x66,0xBA,0x7B, + + 0xFE,0xD1,0x95,0x77,0xAD,0xB5,0x05,0x48,0x10,0xC8,0xDB,0x56,0xF4,0xD1,0x99,0x46, + + 0x63,0xBF,0xDC,0x38,0x30,0x56,0x2D,0x67,0xC1,0xD9,0x74,0xF7,0x10,0x59,0x54,0x2C, + + 0x21,0x77,0x16,0x52,0x6B,0x5B,0x84,0x94,0x0C,0xDA,0xB4,0xEF,0x9E,0x16,0x0D,0xA1, + + 0x59,0x98,0x96,0x2F,0x66,0x4B,0x3F,0x5E,0xD5,0x44,0x27,0x20,0x34,0xF6,0x1E,0x3B, + + 0xA5,0x6A,0x2D,0xCB,0xD5,0xF5,0xF9,0xC1,0x8C,0xD8,0x9F,0xF3,0xF6,0xC7,0xAC,0x2D, + + 0x1F,0x22,0x8F,0x15,0x5F,0xD8,0xBF,0x4C,0x95,0xC8,0x09,0x3D,0x57,0xF0,0xD6,0x72, + + 0x63,0xD6,0xCE,0x9C,0x9F,0xB4,0x04,0x49,0x4A,0xC2,0x2D,0x79,0xAB,0xF3,0xDF,0xF9, + + 0x9F,0x9A,0xDF,0xA8,0x5D,0xB5,0xCF,0x2F,0xC3,0xEF,0xB4,0xD9,0x0B,0x57,0xEF,0xE6, + + 0x79,0x36,0xBD,0x8E,0x8E,0x79,0xBD,0x5D,0xDE,0x5E,0xBD,0xC0,0x2B,0xF3,0x9E,0x48, + + 0xAE,0x35,0x39,0x7E,0x38,0x36,0x70,0xF8,0xEC,0x70,0xC8,0x46,0xF1,0x7A,0xC2,0x44, + + 0x53,0x86,0xD6,0x99,0xF5,0x96,0xA5,0x98,0xAE,0x57,0x6E,0xEF,0x15,0xF9,0x5F,0x35, + + 0x02,0x93,0xA6,0x4D,0x77,0xB1,0x8F,0x09,0x6C,0xDA,0x77,0xAF,0xFA,0x90,0x2B,0x3D, + + 0xA9,0x86,0xB6,0x57,0x18,0xB9,0xF8,0x13,0xB3,0x90,0xCD,0xB8,0xDB,0xFF,0x3A,0xF3, + + 0x62,0xFD,0x80,0xC4,0x18,0x61,0x2A,0xD3,0x6E,0x46,0xF2,0x35,0xA5,0xE9,0xB7,0x60, + + 0x00,0x08,0x0F,0xFC,0x3D,0x6C,0x26,0x95,0xCC,0xB7,0x18,0xF3,0x75,0x23,0x1B,0x75, + + 0xA1,0x60,0xBF,0xE8,0x72,0x62,0xBB,0x95,0x61,0xBD,0xB1,0xB7,0x50,0x6A,0x8A,0xB1, + + 0xB9,0x63,0x49,0x95,0xC5,0x4F,0x11,0x35,0x48,0x52,0x1F,0xA2,0xD2,0x43,0x94,0xC4, + + 0x0C,0xC3,0x32,0x2A,0x14,0x26,0x1D,0xE4,0x40,0xA6,0x40,0x99,0x5A,0x26,0x00,0xC0, + + 0x05,0x07,0x64,0xCB,0xE2,0xF3,0x27,0xB7,0x9D,0xD8,0x18,0xF4,0x06,0x27,0xAD,0xC5, + + 0x80,0xFA,0x59,0xC1,0x90,0x25,0xAE,0xE5,0xC0,0x07,0xC8,0x10,0xD3,0xB6,0xF8,0xA2, + + 0x0F,0x62,0xC1,0x51,0x1A,0x36,0xBA,0x31,0xDF,0x29,0x99,0xD5,0x5C,0xE1,0xF5,0x75, + + 0x4C,0x09,0xE0,0x4C,0xED,0xAE,0x2C,0x8D,0x4E,0x4A,0x02,0xA8,0x67,0xB9,0x8A,0xDF, + + 0x2D,0xF4,0xB4,0xE0,0x78,0x69,0x22,0xC7,0x4F,0x4B,0x1A,0x7F,0x69,0x07,0x16,0x18, + + 0x76,0xF3,0x83,0xCD,0x90,0x6B,0xDF,0xDA,0x44,0x2F,0x2C,0x5D,0xD0,0x63,0xCB,0x90, + + 0x97,0x7B,0xD3,0xB5,0x1B,0xE7,0xAA,0xBD,0x9D,0x1A,0x0B,0x4E,0xE0,0x6A,0x7A,0xB7, + + 0xD3,0x71,0x52,0x3F,0x2B,0x2D,0x6D,0xFA,0x4B,0xD1,0xDA,0x16,0x98,0x6C,0xF5,0x1F, + + 0xC9,0x4E,0xF4,0xB0,0x94,0xAB,0xB6,0x5C,0xA2,0x96,0x1A,0xFC,0x25,0x2F,0x6C,0xCD, + + 0xFD,0x90,0x79,0x49,0x15,0x6F,0x31,0x69,0xCB,0x0E,0xDB,0x69,0x55,0x2F,0x03,0x5D, + + 0x04,0x4E,0x4B,0x9D,0xDF,0x82,0xF7,0xEB,0xC3,0x47,0x9B,0xDD,0x54,0x2D,0x81,0x01, + + 0x17,0x80,0xDD,0xB0,0x95,0x72,0x09,0x80,0xC5,0x10,0x2C,0x20,0x72,0xA0,0xAC,0x9D, + + 0x9B,0x75,0x38,0xF6,0xCA,0x73,0xF0,0x22,0x25,0x5B,0x5C,0x34,0x54,0x33,0x07,0x82, + + 0xBC,0x49,0xC5,0xE1,0x5B,0x56,0xF9,0x85,0x09,0x09,0x6A,0x4D,0xDC,0x3F,0x0E,0xDD, + + 0x61,0x13,0x56,0x4F,0x4C,0x5D,0x1A,0xC2,0x92,0xD5,0xDD,0x15,0x0A,0x31,0x54,0xB3, + + 0x26,0x7A,0x44,0x03,0x16,0x32,0x37,0x20,0x60,0x89,0x0B,0xE5,0x74,0x6D,0x2E,0xD5, + + 0x20,0xD5,0x82,0x2B,0xB1,0x29,0x1C,0x50,0xEC,0xD3,0x9C,0xA8,0x75,0x77,0xD5,0xB2, + + 0x95,0x78,0xEC,0xEE,0x13,0xB7,0x95,0x61,0xC7,0x14,0x4B,0xA5,0xA6,0x34,0x73,0x29, + + 0x61,0x97,0xFC,0xB7,0xD1,0x37,0x94,0x8B,0x21,0x57,0x8D,0xB2,0x31,0x7B,0x06,0x94, + + 0x18,0xB5,0xE4,0x71,0x39,0x78,0x94,0x68,0x24,0xF5,0x4B,0x03,0xF7,0x85,0xE2,0xBC, + + 0xC0,0x42,0x94,0x98,0x1A,0x79,0x56,0xBC,0xE6,0x18,0x9E,0xFC,0x7D,0x17,0x1A,0xA9, + + 0x01,0x5A,0x6B,0xA9,0x51,0xE1,0x4C,0xEE,0x2A,0x3A,0xF5,0x50,0x0D,0xFC,0x7D,0x9D, + + 0xFD,0xB6,0xA3,0xB5,0x36,0x7A,0x21,0x54,0xC8,0x8B,0x0F,0x55,0x9D,0x36,0x4E,0xCC, + + 0xA5,0x5D,0x3D,0x4E,0xFF,0x9F,0x1E,0xE9,0x4E,0xF1,0xED,0x7E,0x7A,0x76,0xA2,0x4A, + + 0x6B,0x17,0x0E,0x5C,0x19,0x51,0x07,0xCC,0x96,0x12,0x9E,0x41,0x7D,0x7F,0x27,0x9E, + + 0x45,0x13,0xFF,0x49,0xB8,0x54,0x8C,0x5B,0xE2,0xDE,0x57,0x2A,0xDE,0x3C,0xC9,0xFE, + + 0x0A,0x99,0x28,0xA7,0x6D,0x37,0x06,0x60,0x4E,0x20,0x8F,0xBA,0xFD,0x3D,0x55,0xBE, + + 0x5C,0x25,0x71,0x64,0xEB,0xBB,0x9C,0xB0,0x64,0xCA,0x8A,0x22,0xDB,0xA1,0x2B,0x90, + + 0x28,0x91,0xF0,0x0F,0x98,0xA7,0x78,0x56,0xAE,0xA5,0xE1,0x12,0xF0,0xA3,0x29,0x1B, + + 0x91,0x58,0x31,0x61,0x63,0x5B,0xF3,0x50,0xEA,0x80,0x8F,0xDB,0xF5,0x60,0xE5,0x62, + + 0xD5,0x2E,0x84,0x3C,0x34,0x25,0x8D,0x51,0x3A,0x81,0xF9,0x2B,0x5A,0x65,0x8C,0xC0, + + 0x9F,0xB1,0xBB,0xD4,0x56,0xAC,0xF2,0x11,0x79,0x42,0x30,0x08,0x57,0x04,0x2A,0xA3, + + 0x04,0x87,0x88,0x1D,0xAF,0xA8,0xE8,0x9A,0x63,0x88,0x78,0xB1,0x73,0xA7,0x59,0xD1, + + 0x17,0xC4,0x61,0x80,0xB2,0xC8,0x75,0xA3,0xC2,0xAA,0x31,0x07,0x52,0xEE,0xA9,0xD3, + + 0xF9,0xC5,0x8B,0x79,0x91,0x25,0xB9,0xF3,0xC0,0x85,0xB9,0xCA,0xD1,0xE5,0xB8,0x02, + + 0xF2,0x31,0x7D,0x8A,0x5E,0x03,0x72,0x97,0x4A,0x18,0x9B,0x50,0x9E,0xE8,0xF9,0xFF, + + 0x5D,0x09,0x6A,0x9E,0x38,0x06,0x72,0x3B,0x69,0x69,0xA0,0x3A,0x7C,0xA9,0x26,0x6B, + + 0xF1,0xDA,0xEB,0x0E,0xB8,0x77,0xA2,0x6C,0x0E,0xCB,0xFB,0x3B,0x35,0x91,0xF1,0x12, + + 0x57,0x60,0x0F,0x38,0x3C,0x54,0xEF,0x39,0x0C,0x66,0x57,0x1B,0xEE,0x59,0x22,0xDF, + + 0x81,0x0A,0xBC,0x8E,0x4A,0xEE,0x32,0xCA,0xB5,0xD7,0x34,0xEA,0x54,0xE4,0x22,0x5E, + + 0x86,0x9C,0x2C,0x19,0xDD,0x07,0x3A,0xBF,0x49,0x8F,0x6A,0x0D,0x6E,0xEC,0xBC,0x35, + + 0x4C,0x8E,0xA3,0xF2,0x98,0xAC,0x34,0x0D,0x39,0x8C,0xFB,0x6B,0x57,0xFF,0x87,0x7F, + + 0x66,0x96,0x50,0xCD,0x9F,0xA5,0x62,0x3C,0x15,0x92,0x47,0x7B,0x50,0xAE,0x7F,0x45, + + 0xE6,0xF0,0x9A,0xEF,0x14,0xDD,0xF4,0x22,0x1A,0x92,0xCA,0x03,0x72,0x72,0x80,0x00, + + 0x2D,0x9B,0x75,0x51,0xF7,0xD1,0x1C,0xCC,0xA7,0xD1,0xB4,0xBF,0x65,0xBC,0x6D,0x96, + + 0x4D,0x09,0x25,0x40,0x90,0x1F,0x75,0x36,0x69,0x54,0x33,0x59,0x7B,0x04,0xAD,0x54, + + 0x81,0xFD,0xE5,0x83,0x5C,0x28,0x75,0xB7,0x6A,0x92,0x42,0xC9,0x2B,0xF9,0x66,0x02, + + 0x2E,0xD5,0x22,0x44,0xF3,0x77,0x2D,0xD6,0xC3,0x8B,0x4D,0x26,0x3E,0xB6,0x80,0x50, + + 0xB6,0xE0,0x2C,0x56,0x79,0x34,0x50,0xDA,0x61,0xD7,0x3C,0x76,0x09,0xB7,0xA5,0x47, + + 0xFE,0x69,0xDD,0x43,0xB4,0xDC,0x99,0x6C,0xE5,0x96,0xED,0xE1,0xF5,0xA4,0x55,0x4C, + + 0x25,0x8B,0xA3,0x53,0xB5,0x65,0xC4,0x77,0xE9,0x30,0xBD,0x62,0x78,0xB5,0x46,0xC0, + + 0x94,0x95,0xC4,0x8B,0x3D,0xF8,0x08,0x47,0x8E,0xF8,0x36,0xB0,0x52,0x55,0x1F,0xF8, + + 0xEF,0x99,0xB8,0x66,0xC2,0x34,0xFE,0x3A,0x39,0xB5,0x7E,0x3A,0x4C,0x86,0x45,0xA9, + + 0x2E,0x86,0x4B,0xAB,0x55,0xE1,0xB0,0x43,0xB6,0x97,0x63,0x2B,0xFE,0x90,0x27,0x9F, + + 0x22,0xDA,0x7B,0x61,0x32,0x46,0x5D,0xFB,0x18,0x5D,0xA9,0xDD,0x02,0xA6,0xD7,0xA8, + + 0xF8,0x94,0x4A,0x51,0xCF,0x6A,0xCB,0x6E,0x6C,0x95,0xB2,0xAF,0x7D,0xBC,0xD5,0x48, + + 0x2F,0x97,0x02,0xFA,0xD6,0x84,0x81,0x80,0x19,0x9F,0xA8,0x9C,0x80,0xBF,0x62,0xB4, + + 0x6C,0x92,0xEF,0xCB,0x37,0xAF,0xB7,0x6B,0xCC,0x2F,0xDB,0xC7,0x7C,0x32,0x6B,0xFF, + + 0xA9,0xDD,0xFF,0xBD,0xBB,0xD1,0x3F,0xDD,0xE9,0xBD,0xE7,0xF9,0xFE,0xBF,0x2C,0x28, + + 0x8F,0x41,0x92,0x2C,0x16,0x22,0x3C,0x08,0xC2,0x8C,0x50,0xA5,0x54,0x22,0x88,0xD7, + + 0x25,0x8C,0x24,0x8B,0xE0,0xF7,0x00,0x36,0x42,0x01,0xC8,0xCF,0x57,0x1A,0x3F,0x69, + + 0xA0,0x4F,0x57,0x81,0x92,0x21,0xC0,0x43,0x3F,0x00,0xD1,0xE0,0xD6,0x60,0xF6,0x95, + + 0xB0,0xEA,0xC1,0x14,0xB5,0x25,0x35,0x19,0x4E,0x02,0x6C,0xCD,0xD1,0xD8,0xF8,0xB3, + + 0x2C,0x00,0xE0,0x42,0xB3,0x3F,0x0D,0xE9,0xED,0x5F,0xD4,0x9A,0xA9,0xFB,0xB2,0x61, + + 0x2D,0xAA,0x48,0xA0,0x1B,0x3E,0xE6,0x79,0xA0,0xC5,0xA1,0x12,0xE8,0x7A,0xC1,0x5F, + + 0xAC,0x8D,0xA1,0xB3,0x77,0x2D,0x14,0x07,0x3D,0x45,0x8B,0x4C,0xBA,0x05,0xE9,0x23, + + 0xE1,0xEB,0xA9,0x23,0x1C,0xA1,0xA1,0x13,0xF0,0x73,0x19,0xFD,0xF4,0x69,0x0A,0x14, + + 0x0E,0x0A,0xAB,0x22,0xB9,0xF7,0x2C,0x41,0x68,0x45,0x94,0xA8,0x12,0xB5,0xA6,0x8A, + + 0x88,0x94,0xCA,0x42,0x18,0x0B,0x1E,0xBC,0x78,0xA0,0xA2,0xC6,0xD6,0x94,0x4C,0x8D, + + 0x8A,0x09,0x37,0x6F,0x17,0x68,0x93,0xEE,0xEC,0xB1,0xFB,0x4F,0x23,0x64,0x69,0x19, + + 0x8A,0x4B,0x4B,0x99,0x82,0x69,0x53,0x38,0xED,0x4D,0xFC,0x43,0x0B,0x61,0x3C,0x4F, + + 0xAB,0x60,0x45,0x0C,0x1E,0xE7,0xA8,0xAE,0x0A,0x0E,0xEA,0x87,0xD9,0x61,0xDA,0xDC, + + 0x09,0x58,0x35,0x2F,0x72,0xD9,0xE0,0xBF,0x81,0x66,0x63,0x20,0xAC,0x50,0x21,0x41, + + 0x89,0x2E,0x44,0xA5,0x18,0xE3,0x88,0x2B,0xF9,0x7A,0xAA,0x02,0x87,0x91,0x8B,0xD9, + + 0xC5,0x63,0xB3,0x4F,0x70,0x6C,0x13,0x69,0x22,0x64,0xD4,0x86,0x6A,0xF7,0xFB,0x04, + + 0x01,0x54,0xDE,0x77,0x58,0x0B,0x3B,0x60,0x68,0x11,0x9C,0xA0,0xFF,0x31,0xE0,0xB4, + + 0xC8,0x08,0x22,0x67,0xBD,0x3C,0x19,0x34,0x23,0xB1,0x08,0xD2,0x8E,0xDC,0x0D,0x85, + + 0x29,0x03,0xFB,0x83,0x51,0xB1,0x2B,0x59,0x02,0x12,0xAF,0x56,0xDE,0x69,0x1D,0xE3, + + 0xA5,0x7D,0x72,0xD2,0x73,0xB3,0xF1,0x2E,0xE0,0x13,0x49,0xF2,0x2F,0x79,0x1D,0xDE, + + 0x24,0x5D,0xA4,0x52,0x31,0xED,0x0D,0x69,0xC7,0xA5,0x60,0x06,0x41,0x10,0x15,0xD2, + + 0x44,0xE5,0x8D,0x87,0x33,0x35,0x5E,0xFC,0xC6,0x4E,0x86,0xF5,0xD0,0x37,0xBE,0xD2, + + 0x01,0x55,0x05,0xA1,0x40,0x74,0x0C,0x60,0x45,0x55,0x6F,0xC2,0x51,0x13,0x73,0x75, + + 0x82,0x97,0xCD,0xD5,0x3E,0x9A,0x1D,0x17,0xD0,0x63,0x45,0xCA,0x52,0x6C,0x96,0xFA, + + 0xD7,0x5A,0x8E,0x84,0xC5,0x56,0xFA,0x8C,0xE5,0x1A,0x80,0xDF,0x56,0x3A,0xCE,0x18, + + 0x72,0x5B,0xA2,0xB4,0x3F,0x3B,0x32,0x90,0xB4,0x64,0x58,0x43,0x9A,0xA1,0x1E,0xFC, + + 0xA9,0xCA,0xE5,0x95,0xBB,0x7A,0xD7,0xC6,0xE9,0x1A,0xD7,0x68,0xFE,0x78,0x4F,0x39, + + 0x26,0x9D,0x58,0x19,0xBB,0xD9,0xB0,0x3D,0xC8,0x1F,0x87,0x39,0x04,0xA3,0xBC,0x20, + + 0xFE,0xDC,0xD8,0x5F,0x1C,0xC3,0xEC,0x00,0x60,0x13,0xF7,0xD8,0xF8,0xB0,0x2C,0xD4, + + 0x2A,0xDD,0xC6,0xD8,0xE7,0x5E,0x0E,0xF1,0xC8,0x46,0x82,0x8E,0x8C,0xF6,0x1E,0xD7, + + 0x4F,0x70,0xF9,0x68,0x35,0xC8,0x0E,0x69,0x4F,0x58,0x6A,0x0F,0xDE,0x8B,0x95,0xD5, + + 0x98,0x1B,0xF5,0x2E,0x91,0x92,0x1B,0x9F,0x69,0x5C,0xAB,0xC1,0xFD,0x36,0xCC,0x26, + + 0x02,0x82,0xE0,0x93,0xEB,0xE2,0x1D,0x09,0xE5,0x41,0x30,0x65,0x64,0x8E,0x20,0x03, + + 0x03,0x88,0x93,0x88,0x16,0x81,0xF8,0xB2,0x67,0x7E,0xA8,0x45,0x51,0x8F,0xB1,0x87, + + 0x8A,0x55,0xE1,0x23,0x19,0x54,0x39,0xA7,0xC6,0x21,0x21,0xCF,0x85,0xAF,0x89,0xD3, + + 0x9F,0xC1,0x39,0x93,0x8C,0x6C,0x95,0xAC,0x34,0x15,0x29,0x44,0xEA,0x6A,0x02,0x62, + + 0xF3,0x02,0xDE,0x37,0xCA,0xAB,0x72,0x94,0x75,0xF6,0x8B,0xA4,0xD2,0xEA,0xC4,0x76, + + 0xEC,0xE1,0x68,0x47,0x31,0x08,0x5B,0x04,0x99,0x3A,0xFE,0xD3,0x1F,0xC6,0x61,0x83, + + 0x8E,0xC7,0xC3,0x34,0x35,0xAF,0xC9,0x9C,0x4B,0xDD,0x55,0xE3,0xC4,0x53,0xDD,0x31, + + 0x7C,0xC5,0xF7,0x66,0xB1,0x25,0x3B,0x8D,0xF4,0xF3,0xD9,0xD4,0x9F,0xE4,0x62,0x24, + + 0x0A,0x8A,0x55,0x0F,0x18,0xC6,0x7A,0x2B,0x68,0xCE,0x36,0x4E,0x4C,0x45,0x22,0x1E, + + 0x84,0x98,0x55,0x9A,0x3C,0xED,0xFA,0xBA,0x42,0x8B,0x3A,0xF9,0x79,0x44,0xE5,0x8F, + + 0x8E,0x36,0x33,0x8B,0x96,0xCA,0x99,0x9A,0x6D,0xF5,0x6E,0x5F,0xD8,0xE3,0x4B,0x4D, + + 0xBB,0x86,0xE3,0x1B,0x14,0xBA,0x7B,0xAE,0xCB,0xC9,0x62,0xF8,0x1F,0x2B,0xB9,0x90, + + 0xF3,0xCD,0xC4,0xEA,0xBD,0x28,0xC8,0x2D,0x98,0xC4,0xCE,0xD6,0xDC,0x20,0xC6,0xB2, + + 0xDF,0x40,0x94,0xFB,0xF4,0xAE,0x80,0x92,0xD7,0x00,0xA3,0x64,0xBA,0x88,0x59,0xA3, + + 0x98,0xC1,0xBA,0xCD,0x79,0x23,0x71,0x14,0xAE,0x11,0x49,0x1C,0xF5,0xE1,0x0D,0xBA, + + 0x64,0x8C,0xD5,0xFF,0x12,0xB4,0x84,0x93,0xCD,0x80,0x83,0x96,0x5B,0x02,0x2C,0xF8, + + 0xE6,0x90,0x64,0x07,0x30,0xF2,0x3C,0xA6,0xED,0xC1,0xAC,0xBA,0x9D,0x93,0xEC,0x12, + + 0x01,0xD3,0xFC,0x6D,0x33,0xCA,0x2C,0xC0,0x61,0xBF,0xC6,0xEA,0x54,0x71,0x2D,0x87, + + 0x2B,0xD3,0xE5,0xE3,0xB2,0xB0,0xA5,0x4B,0xB5,0x9F,0x75,0x27,0xA0,0x0D,0xE9,0x2D, + + 0xA4,0x33,0x58,0x6F,0xB5,0x08,0xAD,0xC0,0xD2,0xBD,0x02,0xEB,0xD6,0xB3,0xBE,0xDF, + + 0xA4,0x97,0xB0,0x81,0xFC,0xF7,0xF3,0x00,0xEB,0xCF,0x86,0x99,0xD5,0x7F,0x96,0x94, + + 0x67,0x18,0x9F,0x94,0xBB,0xB9,0x02,0x52,0x54,0x81,0x94,0x84,0xD4,0x7E,0x60,0xA1, + + 0x95,0xA2,0xAD,0x8F,0xB0,0xFF,0x50,0x95,0x2C,0xFD,0x09,0xDB,0xF0,0xBF,0x34,0x5A, + + 0x00,0x8C,0x4D,0xB5,0x04,0xD2,0xBD,0x97,0x10,0xCC,0x7A,0xCA,0x08,0x27,0xE6,0xEA, + + 0xA8,0x90,0x22,0x0A,0x76,0x65,0x54,0xBB,0x6F,0x18,0x5A,0x8A,0x34,0x9B,0xEE,0x1A, + + 0x63,0xDB,0x86,0xFC,0x3B,0xBB,0x36,0xBE,0xE2,0x98,0x38,0x40,0xF0,0x0F,0x62,0x0F, + + 0xAE,0xCF,0x1C,0xCD,0x1D,0x47,0x09,0x53,0x2E,0x5A,0x97,0x6C,0xFA,0x78,0x6F,0xC0, + + 0xAC,0xDB,0x1E,0x1B,0xBF,0x59,0x5F,0xF0,0x55,0xD6,0xF7,0xAA,0xCE,0x3A,0x62,0x2C, + + 0x1D,0x3E,0xDE,0x25,0x92,0xB1,0x57,0x99,0xCD,0x13,0x05,0xE2,0xCF,0x27,0x0E,0x7A, + + 0x73,0x90,0xD7,0x9C,0x9E,0x80,0x58,0x85,0x88,0x50,0x1C,0x12,0x7F,0x70,0x9F,0x6B, + + 0xF6,0xEC,0x1E,0xE8,0x1F,0xC1,0xB7,0x03,0x96,0xC5,0x5D,0x12,0x0F,0x85,0xC3,0x33, + + 0x37,0x59,0xC7,0xBD,0x5E,0x44,0x26,0x7F,0x48,0xD9,0x80,0xFB,0x90,0xD9,0x7E,0x06, + + 0xE9,0x0F,0x35,0x20,0xEF,0xAB,0x3D,0x5B,0xD9,0x1C,0xA1,0x37,0x6B,0xA3,0xB3,0xF2, + + 0xAD,0xFC,0x28,0x66,0x73,0xED,0xB5,0x14,0x2A,0x4E,0xC5,0x1E,0x75,0x67,0x53,0x93, + + 0x6B,0x66,0xD3,0x34,0xA7,0x8D,0xAA,0x6F,0x5D,0xBF,0x4C,0x24,0xE7,0x7E,0x71,0x67, + + 0xE9,0x0E,0xF7,0x12,0x30,0x62,0x99,0x42,0xF3,0xC6,0x33,0x41,0x70,0xC2,0x7E,0x10, + + 0x7A,0xAB,0x3B,0x3F,0x28,0x9B,0xF0,0x13,0xE1,0xC7,0x2F,0x23,0x76,0xBF,0x36,0x57, + + 0xA2,0x44,0x58,0xAD,0x13,0x5E,0x4E,0xCC,0xA8,0x01,0xF5,0x8D,0xE3,0x24,0xE1,0x32, + + 0x8F,0x95,0xFA,0xED,0x61,0xFB,0x33,0x45,0xA1,0xA9,0xF8,0x98,0x62,0xFD,0x36,0xD3, + + 0x12,0x12,0x36,0xA9,0x93,0xDC,0x63,0xC1,0x0E,0xE8,0xA7,0x72,0x72,0x78,0x10,0x22, + + 0xE3,0x4C,0xD8,0x5C,0x70,0x2B,0x6C,0x2E,0x80,0x47,0xAA,0xD3,0xDA,0xA4,0xAE,0x7A, + + 0xFE,0x6C,0x20,0xEF,0x95,0x68,0x65,0x02,0xEA,0xE4,0x0A,0xA3,0xA6,0x64,0x39,0xB9, + + 0x11,0xA5,0xFD,0x0B,0x79,0xA9,0xB7,0xAD,0x8E,0xD6,0x8D,0x4F,0xF6,0xB5,0x33,0x3D, + + 0x76,0x86,0x1C,0xE2,0x68,0xF8,0x4A,0x09,0xC1,0xB4,0x78,0xC3,0x38,0xF4,0x7A,0xB6, + + 0xA6,0x01,0xC0,0x48,0x50,0x68,0xF6,0x0A,0x6E,0xB0,0x66,0x0E,0xA5,0xC1,0x72,0xA7, + + 0x86,0x86,0x8B,0x3A,0x79,0x92,0x3A,0x33,0xFB,0x40,0xE2,0x58,0xD4,0xC0,0xD3,0xCB, + + 0x47,0xC2,0x7B,0x7D,0x9A,0xD1,0x2B,0x4E,0x37,0x41,0x83,0x5C,0x7B,0xCF,0x0D,0xC6, + + 0x74,0x82,0x30,0x1A,0xA8,0x8E,0xA4,0x5E,0x6A,0x0E,0x8A,0x0D,0x5B,0xE9,0x59,0x71, + + 0x83,0x50,0x28,0x7B,0xB2,0x0C,0xB4,0xD3,0xC3,0xD3,0xC5,0x96,0x9B,0x34,0xAC,0xE3, + + 0x82,0x92,0xA1,0xBE,0x90,0xE7,0x64,0x97,0x9C,0x5E,0x5E,0xEE,0x8A,0xE4,0x37,0xB1, + + 0x44,0xBD,0xB0,0xE7,0x6E,0x34,0x77,0x52,0x6C,0x8F,0xB3,0x47,0x7C,0x30,0x20,0xB5, + + 0x23,0xDF,0x1D,0xDA,0x4C,0x4F,0x8D,0xF6,0x1E,0x55,0xE5,0x72,0x0C,0xC5,0x53,0x22, + + 0x8E,0xB9,0xD6,0xEA,0xD9,0x70,0xF8,0xE4,0x70,0x8C,0xB4,0xAE,0xCA,0x79,0xDB,0x32, + + 0x07,0xB1,0x33,0xB6,0xC0,0x50,0x62,0x12,0x01,0xA0,0xE4,0x6E,0x57,0xF4,0xD6,0x23, + + 0x0E,0xBB,0xFF,0x75,0x23,0x77,0x47,0xA3,0x09,0x12,0xB2,0x67,0x63,0x63,0x47,0xD7, + + 0x6B,0x7F,0xF5,0x2E,0x3C,0xC1,0xCD,0xC1,0x73,0xF8,0xA3,0x06,0x77,0xDA,0x50,0xEA, + + 0xD7,0xB9,0x2F,0xF2,0xAD,0xB5,0x3F,0x83,0xC9,0xAE,0x2D,0x36,0x5C,0xF3,0xAE,0xEA, + + 0x4B,0x05,0xDE,0x8D,0x1B,0xB2,0xFD,0x9C,0x02,0x56,0x3E,0xCE,0x1B,0xB5,0x3F,0xB9, + + 0x18,0xB5,0xFA,0x67,0x9C,0xCF,0x77,0xE3,0x58,0x57,0x09,0x9C,0xDA,0xD5,0x9F,0x1B, + + 0x6C,0x48,0x5E,0xA0,0x52,0x7F,0x9F,0xCA,0x92,0xDE,0xE1,0xBA,0xDD,0xD6,0xE2,0xBB, + + 0x54,0xB7,0xFD,0x52,0x1E,0x93,0xF6,0x9B,0xC9,0xDF,0x72,0x5C,0x24,0xD3,0xC9,0x29, + + 0x88,0x5D,0xF1,0x3E,0x1F,0x3B,0xDE,0x7C,0x2D,0xC1,0xE0,0x5C,0xF9,0x7C,0x3F,0xCD, + + 0xAE,0x2C,0x63,0xB7,0x19,0x5B,0x27,0xCD,0x68,0x5E,0x73,0x9F,0x74,0x3F,0x71,0x30, + + 0x4B,0x9E,0xE6,0xF7,0x1A,0xC0,0xA0,0xC7,0x48,0x1D,0xF4,0x7A,0xDF,0xE3,0xF3,0xFC, + + 0xED,0xBB,0x0C,0x83,0xE3,0x5D,0x0A,0x87,0xB3,0x3D,0xCF,0xCB,0x1C,0xBF,0x3A,0x24, + + 0xEE,0xC5,0xAA,0x65,0x3F,0x24,0xEC,0x16,0x2E,0xCE,0xEC,0xDB,0x15,0x6C,0x7F,0xE1, + + 0x80,0x07,0x65,0xF8,0xFF,0xAD,0x27,0x41,0x3B,0x1F,0xCC,0xCD,0xD2,0x00,0x17,0xF1, + + 0xE7,0x9F,0x39,0xE4,0x11,0x0E,0xB9,0x40,0xFE,0x46,0x40,0xDC,0x66,0xA3,0x02,0x42, + + 0xF1,0x09,0x58,0xD9,0x04,0xE9,0xC8,0x9D,0x56,0x89,0xD0,0x42,0xEA,0x87,0x3C,0x28, + + 0x23,0x88,0x5C,0x34,0xE8,0x0E,0x00,0x56,0xC5,0xE3,0x68,0x86,0xE4,0x44,0x1A,0xB8, + + 0x80,0x64,0x02,0x63,0x37,0x79,0xDE,0x81,0x6A,0x3B,0x40,0xD7,0x6E,0x45,0xC5,0xD6, + + 0x78,0xE9,0x91,0x53,0x7E,0x1C,0x70,0x11,0x30,0xA2,0xAF,0x84,0x53,0x6A,0x5C,0x0D, + + 0xAD,0x17,0xDA,0xBE,0xDE,0x07,0x20,0x1C,0xA7,0x8C,0x74,0x94,0x80,0xAC,0x4A,0x51, + + 0xBD,0x84,0xAB,0x7C,0xC0,0xE6,0xAA,0xCB,0xEE,0x49,0x91,0xC1,0xA9,0xE6,0x97,0x69, + + 0xA8,0x75,0x07,0x6D,0x63,0xCF,0x0D,0xC9,0xAE,0xD6,0xCD,0x28,0xDA,0x28,0x79,0x1B, + + 0x7A,0x26,0xAA,0x60,0x3A,0xEA,0x09,0x0B,0xE9,0x64,0xE5,0xDD,0xD9,0x46,0xDA,0xB1, + + 0xF3,0x3A,0xD0,0x6A,0xA7,0x0D,0x4A,0x95,0xEB,0x53,0xA0,0x39,0xB5,0x88,0x0A,0x0C, + + 0xF7,0x20,0x4A,0x2C,0x7D,0x91,0x42,0x84,0xE3,0xC0,0xFA,0x87,0x53,0xAD,0x59,0xD9, + + 0x8E,0xCF,0xDB,0x7F,0x2A,0x01,0x72,0x0D,0x35,0x8F,0xCB,0x4B,0x29,0x75,0x78,0xB9, + + 0x23,0x22,0x7B,0x34,0xF7,0xA2,0x84,0x09,0x3C,0x70,0x39,0x7F,0x24,0x81,0x1C,0x7D, + + 0x4C,0x9D,0x9E,0x36,0xF1,0x1F,0x26,0xF6,0x8F,0x94,0xBC,0x57,0xD7,0xB0,0x16,0x22, + + 0xBC,0xD0,0x2B,0xE5,0x13,0x34,0xAC,0x49,0xE7,0xED,0x1C,0xC5,0xD6,0x72,0x37,0xA9, + + 0x4F,0xD6,0x01,0xA3,0xDF,0xBD,0x0B,0x41,0x86,0xF4,0x87,0x97,0x54,0x5D,0x4D,0xC5, + + 0x0B,0x9E,0xBB,0x36,0x5E,0xF7,0x0C,0xD1,0x12,0xB6,0x8E,0x93,0x29,0x40,0x56,0x31, + + 0xA2,0x39,0x50,0xA4,0x12,0x40,0xB6,0xC1,0x9D,0xBA,0x4F,0xBC,0xAF,0x09,0x12,0xD5, + + 0x86,0xCA,0x2E,0x8C,0xDE,0x24,0x04,0xD6,0x9C,0xD3,0x9C,0xD6,0xA6,0x93,0x1D,0x73, + + 0x37,0xD7,0x45,0x34,0x3A,0xF6,0xCA,0x78,0x13,0x70,0xDA,0xC3,0x1F,0x0D,0xD9,0xB1, + + 0x83,0x68,0x15,0xDF,0x5E,0x06,0x50,0xD8,0x46,0x61,0x6D,0x84,0x99,0x7E,0xDD,0xAD, + + 0x8D,0x67,0x9C,0x3F,0x9F,0x17,0x0E,0x55,0x48,0x75,0x88,0x13,0x1C,0x07,0x53,0x70, + + 0x2B,0x7B,0xF0,0x3B,0x35,0x12,0x0C,0x8A,0x6F,0x76,0x45,0xC1,0x15,0xF4,0x1D,0x71, + + 0x57,0xC5,0x03,0xFC,0x38,0xFB,0xE4,0x5A,0x4F,0x9A,0x48,0xDD,0x9E,0x05,0x7B,0xD1, + + 0x5C,0x87,0xFD,0xD4,0xD6,0x18,0x9F,0xC8,0x4E,0x58,0xC0,0xC1,0xD3,0x64,0x06,0x81, + + 0x9E,0x91,0x1E,0xEA,0xD7,0x6D,0x16,0xA1,0xDE,0xD1,0xD6,0x7C,0xFE,0xBD,0xFE,0x2B, + + 0x8C,0xDD,0x16,0xFA,0x0C,0xBC,0x44,0x00,0x94,0xA0,0xC1,0xA1,0x5B,0x50,0x1C,0xEC, + + 0x0F,0x21,0x1F,0xC7,0x57,0x4F,0x14,0xCF,0xE0,0x21,0x5C,0x95,0x2B,0x02,0x5D,0xEB, + + 0x8F,0x30,0x57,0x21,0xAF,0xF2,0xE8,0x04,0x5A,0x0C,0xA9,0x04,0x72,0x72,0x67,0xFB, + + 0xE1,0x86,0xA0,0x5C,0x90,0x6E,0x68,0x24,0xA9,0x63,0xB0,0x7E,0xC0,0x6F,0x4F,0x76, + + 0xFE,0x1A,0xA8,0xC6,0x91,0x18,0xAC,0x52,0xFE,0xFC,0x13,0x54,0xDC,0x75,0x01,0xFB, + + 0xA4,0x19,0xA1,0xEB,0x10,0xEE,0x23,0x05,0x61,0x1D,0x2E,0x45,0xD8,0xB2,0x99,0x77, + + 0xA5,0x82,0xA9,0xF3,0x11,0x40,0xFC,0x4B,0x57,0x02,0xE1,0x4E,0xB1,0x23,0x33,0x40, + + 0x1E,0xD3,0x74,0x2F,0x9C,0x65,0x00,0xB3,0x0E,0x28,0x8E,0x86,0x42,0xCF,0x30,0x42, + + 0xFC,0xB0,0xF6,0x52,0x2B,0x8A,0xBB,0x8E,0x67,0xE9,0x27,0x0A,0x7D,0xBA,0x41,0x68, + + 0x7F,0xB2,0xB8,0xEA,0x9A,0x04,0x6B,0xFE,0x3D,0xCB,0x71,0x65,0x2F,0x97,0x31,0x75, + + 0x62,0x9B,0x69,0x26,0x1F,0x74,0x21,0x9B,0x6F,0x4A,0xF6,0xD0,0x0A,0xFB,0x8B,0xFB, + + 0x8C,0xA5,0xA2,0x8C,0x98,0xED,0x48,0x99,0x20,0x4B,0xE0,0x3C,0x58,0x62,0x74,0x1E, + + 0xE0,0x06,0xAA,0x36,0x99,0x77,0xA2,0x05,0xB6,0x5B,0x88,0x38,0xBB,0xE9,0x7B,0xB9, + + 0x0E,0x4B,0xA3,0x63,0x18,0x7C,0x6A,0x5F,0xEC,0xB5,0xE6,0xDE,0x5C,0x17,0x59,0xBA, + + 0x62,0x6F,0xAB,0x7B,0x19,0x77,0xA3,0x85,0x44,0x29,0x9B,0xFD,0x25,0x0A,0x3B,0xB9, + + 0xA9,0x1C,0xBC,0x4B,0xAB,0x23,0x43,0x8A,0x83,0x43,0x06,0x36,0x93,0x28,0x9E,0xA6, + + 0xFA,0x6E,0x5A,0x9C,0x03,0x10,0xFA,0x98,0x4F,0xEF,0xE5,0xF2,0xAA,0x5B,0xFC,0x74, + + 0x75,0xD3,0xFD,0xAF,0x36,0x21,0x2A,0x1A,0x4E,0xEC,0x07,0x3E,0x5E,0x18,0x30,0x27, + + 0x51,0x92,0xDD,0x5B,0x0A,0xE0,0xFF,0x1B,0xF9,0x40,0xE5,0x7B,0x49,0x67,0xDC,0x6C, + + 0x4B,0x1F,0x3A,0x86,0x68,0x04,0x34,0x1C,0xF0,0x14,0x04,0x0B,0x78,0xE0,0x9C,0xE3, + + 0x5B,0xB0,0x68,0xB3,0xD6,0x21,0x64,0x97,0xBE,0x0E,0x3C,0xC7,0xFD,0x22,0x85,0xF2, + + 0xDE,0x97,0x25,0x8B,0x3C,0xBF,0x36,0xA6,0x0D,0x62,0xAB,0xA3,0xC8,0xDD,0x35,0x6E, + + 0x48,0x80,0x62,0x7E,0x40,0x6C,0x3D,0x15,0x4C,0x63,0xE3,0xB2,0x50,0x32,0xBB,0xBB, + + 0x0C,0xAB,0xBF,0xCA,0x91,0x89,0x71,0xE6,0xF6,0x30,0xD4,0x2D,0xC4,0x74,0xCE,0x03, + + 0x80,0x5A,0x6F,0x36,0xD3,0x89,0x06,0xF1,0xED,0x14,0xFE,0xAB,0xA6,0xC9,0x4D,0xD4, + + 0x30,0x1C,0xF7,0xFD,0x41,0x6B,0x6F,0x66,0x09,0x59,0xC2,0x9F,0x6E,0x79,0xDD,0x96, + + 0x31,0xA8,0xFC,0x37,0x2F,0x38,0xA8,0xF0,0xE1,0xFA,0xA6,0x86,0x50,0x0B,0xD2,0x76, + + 0x0C,0xB7,0xB3,0x6E,0xC1,0x47,0xEC,0xA0,0xB7,0x07,0xDE,0xB8,0xC1,0xD9,0x36,0xBC, + + 0x95,0x1A,0x2A,0xE6,0x8E,0x34,0xE6,0xB0,0xB6,0x06,0x6B,0x42,0x3D,0x44,0xA3,0xEB, + + 0x57,0x7F,0x17,0x86,0x3C,0x6E,0x37,0x41,0x45,0x6A,0x37,0x47,0x1D,0x3B,0xBE,0x38, + + 0x11,0x58,0x3B,0xD7,0x70,0x7F,0x3F,0x59,0x79,0x1F,0x89,0xBB,0x4A,0x36,0xC1,0x1B, + + 0x89,0x41,0xF4,0xF5,0xEB,0x2F,0xF6,0xC1,0x81,0x18,0xAB,0x04,0x68,0x81,0x1E,0xAF, + + 0x33,0x5A,0x69,0x3E,0xDB,0xAC,0xFA,0x9A,0x80,0x52,0x25,0x87,0x55,0xC2,0xD7,0x8F, + + 0x61,0x83,0xD1,0x2F,0x41,0x03,0x69,0xEE,0xDC,0xF1,0x40,0x12,0x0F,0x1D,0x21,0xAB, + + 0x26,0xA9,0xE0,0x6C,0x18,0xA0,0xEB,0x9B,0xCF,0x55,0xE4,0x58,0x08,0x02,0x9F,0xE0, + + 0x20,0x8D,0x80,0xA3,0x8C,0xE4,0xA0,0x40,0xB3,0xA5,0x24,0x77,0xD0,0x81,0xC4,0x69, + + 0x9B,0x1C,0x92,0x91,0xB9,0xBD,0x80,0xCD,0x55,0x8C,0x4D,0x37,0x11,0xD5,0xD8,0x24, + + 0x25,0xFD,0x00,0x00,0x65,0xFD,0x09,0xDC,0x49,0x83,0xD1,0xB6,0xD0,0x89,0xC8,0x37, + + 0x20,0x75,0x87,0x11,0x04,0x3F,0x96,0xD1,0x69,0x3E,0x19,0x39,0x59,0xEE,0x01,0x02, + + 0x4E,0x1B,0xE1,0x70,0xB5,0xE5,0xE0,0xCD,0x4E,0x94,0xF3,0x95,0xD2,0x39,0x06,0xB0, + + 0xBE,0x08,0xFE,0x50,0x86,0xEA,0x40,0x81,0xE4,0xA0,0x87,0x0C,0xCD,0x7A,0xDA,0xD8, + + 0x71,0x76,0x14,0xB9,0x8E,0x9B,0x54,0x65,0x52,0xA2,0x14,0x99,0x2F,0xB0,0xC2,0xA8, + + 0xA3,0x3A,0xD7,0xB5,0x87,0xE8,0x41,0x57,0xC4,0x07,0x7E,0xA4,0x74,0x29,0xDD,0x82, + + 0xA9,0x5E,0x8C,0x09,0xCD,0xA7,0x4A,0x0E,0xA1,0xF8,0x22,0xEE,0x58,0x05,0xBA,0xE5, + + 0x8F,0xAE,0x83,0x44,0xD4,0xCD,0x1A,0x6E,0xA0,0xF9,0x06,0x1A,0xC5,0xAD,0x5B,0x2C, + + 0x71,0x85,0x17,0x45,0x55,0xEE,0xC9,0x23,0x13,0x95,0x23,0x80,0x2B,0xAA,0x63,0x79, + + 0x76,0xCB,0x80,0xC0,0x24,0x75,0xC3,0x33,0x12,0x94,0x1A,0x38,0x3C,0x8D,0x1B,0xB9, + + 0xAD,0x51,0x72,0x24,0xC2,0xA3,0xD4,0x88,0x56,0x21,0xC8,0x30,0xE1,0x61,0x91,0x61, + + 0xAC,0x26,0xD8,0x66,0xEC,0x90,0xFC,0x1D,0xA4,0xC2,0x87,0x54,0xDB,0xAC,0x41,0x6B, + + 0x09,0x1C,0xD1,0x15,0x02,0xA1,0x36,0x4F,0x70,0x11,0xDC,0x81,0x3F,0x72,0x13,0x53, + + 0x72,0x7E,0x48,0xBD,0x7F,0x3E,0x7E,0x1C,0xD5,0x8E,0x8A,0x7F,0x56,0xD8,0xB4,0x7A, + + 0x24,0x2B,0x8D,0xDC,0xFD,0xD4,0x17,0xA5,0xC9,0xE0,0x24,0xD5,0xF0,0xC1,0xC0,0xED, + + 0x01,0x97,0x82,0x90,0xA4,0x2D,0x1C,0xC2,0xFD,0x95,0x6D,0x45,0xF9,0x7C,0xA4,0x07, + + 0xEE,0x4F,0x8E,0x65,0x18,0xAE,0x4D,0x84,0x3B,0x8D,0xCB,0xA1,0x1D,0x96,0x83,0xDD, + + 0x04,0x12,0x83,0x90,0x64,0x4D,0x9C,0xB4,0x44,0xB6,0x59,0x93,0x08,0x47,0x1B,0xB0, + + 0xF4,0x0B,0x59,0xD8,0x95,0x31,0x71,0x89,0x0E,0x90,0x20,0x09,0x74,0x1A,0x9C,0x01, + + 0xC6,0xF9,0x4B,0x34,0xD7,0x49,0xC6,0xD6,0xD9,0x0A,0x41,0x7D,0xC8,0x05,0xDE,0x63, + + 0x4B,0x34,0x1E,0xEC,0x15,0xCB,0x0C,0xF5,0x45,0xC6,0x71,0x6C,0xF7,0x76,0x8A,0x2C, + + 0x46,0x41,0xC3,0x35,0xC3,0x0B,0xFC,0x98,0x8F,0x93,0x94,0x84,0x16,0xC8,0x24,0x75, + + 0xCD,0xFB,0x1F,0x50,0x8D,0xBC,0xCC,0xA2,0xB3,0x87,0xCE,0x9C,0xCC,0xF7,0x16,0x08, + + 0x2D,0xD8,0x0A,0xEC,0xB3,0xDC,0x9F,0xBD,0xCC,0xBC,0xAF,0xE0,0xA5,0xF6,0xB7,0x09, + + 0x35,0x8F,0x4A,0x84,0x38,0xEE,0x17,0x63,0x74,0x9E,0x18,0xB5,0x5F,0x7F,0x65,0x86, + + 0x52,0x30,0x57,0x97,0x62,0x84,0xC7,0xB3,0x32,0x84,0x8D,0x83,0x0A,0xBA,0x9D,0x4E, + + 0x68,0x9C,0xB3,0x30,0xDF,0x2F,0x0F,0x8C,0x85,0xD3,0x0F,0xCA,0x4D,0xEE,0x54,0x40, + + 0xDC,0x99,0x45,0x6F,0x9C,0x02,0xDA,0xD6,0x84,0xB9,0x2A,0x00,0x86,0x9E,0xCB,0xB9, + + 0x74,0x21,0x9C,0xA1,0x5E,0x0F,0x76,0x8D,0xCA,0x73,0x48,0xD2,0x01,0x23,0xEB,0x5F, + + 0xE9,0x9F,0xD5,0x67,0x4C,0xFE,0x42,0x7C,0x04,0xD0,0x80,0x85,0xD1,0x60,0x2D,0xA5, + + 0x99,0x02,0x64,0xE2,0x00,0xAB,0xC4,0xDA,0xD3,0x6F,0xC0,0xB4,0x14,0x22,0xE9,0x50, + + 0x4D,0x9C,0xD2,0x11,0x9F,0x6E,0xA2,0xCB,0x51,0x8C,0x8D,0xB0,0x26,0xEA,0xEF,0x10, + + 0x1E,0x3F,0x01,0x82,0x37,0x32,0x81,0x57,0x33,0x52,0x80,0x25,0xD6,0x29,0xEC,0xEB, + + 0x38,0x55,0xD3,0x05,0xBE,0xA6,0xE2,0x39,0x24,0xBC,0xC9,0x05,0xDD,0x21,0xC0,0xD1, + + 0x8E,0xA6,0xE9,0x56,0xB3,0xBB,0xD4,0x99,0x62,0x06,0x28,0x6C,0xB3,0x2B,0xE8,0x92, + + 0x8F,0x0A,0xDB,0x37,0x9B,0x71,0x78,0x0E,0xE0,0x20,0xFC,0x18,0xBA,0x1C,0xE1,0x23, + + 0x54,0x08,0x75,0x27,0x69,0x64,0x17,0x1F,0x40,0x5A,0xAF,0x08,0x57,0x67,0xFD,0x2E, + + 0x20,0xA7,0xF7,0x89,0x1C,0xA1,0xE6,0x93,0xF0,0x0C,0xC3,0x71,0xF2,0x27,0x7F,0x15, + + 0x9B,0x05,0x94,0x0A,0xF3,0x6C,0x82,0x5A,0xC6,0xD7,0x5B,0x7F,0x2F,0x9F,0x21,0xF7, + + 0x2D,0xA2,0xF4,0x1B,0x3D,0x27,0x40,0x3C,0xC7,0x96,0x2B,0x48,0xB8,0xD6,0x39,0x42, + + 0x3F,0x87,0xBD,0xEF,0xF2,0x4E,0x49,0x28,0x46,0xF5,0x4C,0xD7,0x64,0x83,0x73,0x99, + + 0x74,0xFA,0x2F,0xDF,0x1D,0x34,0x41,0x3C,0x47,0xB4,0x5B,0xC8,0x53,0x68,0xD4,0x3B, + + 0x66,0x07,0xC6,0x0C,0x42,0xA1,0xEA,0x58,0x4A,0x93,0xF6,0x00,0x69,0xD7,0xFE,0xDC, + + 0x61,0xDC,0xB4,0x31,0x99,0x31,0x3A,0x32,0x8B,0x42,0xFE,0x10,0x68,0x29,0xF5,0x58, + + 0xEE,0x0A,0xBD,0x91,0x71,0x95,0x12,0x0F,0xA8,0x0E,0x6B,0x4D,0x3B,0x2E,0x92,0xF6, + + 0xB4,0x0D,0x2C,0xBF,0x13,0xD4,0xEF,0x27,0x68,0x0D,0x81,0x27,0x7C,0x7F,0x83,0x53, + + 0x83,0x4E,0x6B,0x06,0xA1,0x6B,0xEC,0xA8,0x9D,0x1F,0x8E,0xD7,0x14,0xF6,0x27,0x7E, + + 0xC0,0x0D,0x22,0xF6,0x90,0xCE,0xB8,0x52,0xE2,0x35,0x82,0x48,0x71,0xE4,0x3F,0xDA, + + 0x1F,0x9F,0x45,0xD0,0xD8,0x34,0x85,0x8B,0x64,0xF6,0x95,0x65,0xF7,0x87,0x70,0xB5, + + 0x1C,0xE5,0xED,0xDF,0x86,0x3E,0x75,0xB7,0xE7,0x41,0x0F,0x8E,0x9D,0x31,0x1B,0x40, + + 0x51,0x63,0x44,0xA5,0x85,0x99,0x74,0xE5,0x6F,0x8E,0x6B,0x02,0x62,0xE9,0x32,0x1C, + + 0x25,0x3C,0x35,0x74,0x13,0xE6,0x5A,0x18,0xEB,0x18,0xE6,0xFC,0xD4,0x65,0x85,0x39, + + 0xDA,0x9B,0x0E,0xA5,0xB6,0x1F,0x54,0x92,0xFD,0x5D,0x2D,0xED,0x0B,0x39,0xA9,0x39, + + 0x2B,0x5A,0xF3,0xB8,0x51,0x17,0x45,0x4D,0xC1,0xE5,0x25,0xFD,0x54,0x67,0x78,0x6A, + + 0x9D,0xCE,0x6A,0x13,0x39,0x58,0x7D,0x2C,0x7A,0xC6,0xD0,0xD2,0x4B,0x63,0x86,0x7A, + + 0x98,0x8F,0x71,0x18,0x4C,0x0C,0x5F,0x62,0x88,0x32,0x61,0xC6,0x0F,0xA6,0x8F,0x6B, + + 0x11,0xAC,0xBD,0x7E,0x85,0xB7,0xD7,0x21,0x3B,0x18,0x2F,0x55,0xF8,0x8B,0x01,0x7B, + + 0x8D,0x06,0x9F,0x0D,0xB5,0x79,0x25,0x3E,0x45,0xF7,0x20,0x8C,0x58,0x84,0x1E,0xDC, + + 0xC3,0xE6,0x85,0x24,0x41,0x71,0xD2,0xAD,0x3D,0x58,0x2E,0x1F,0x21,0x7A,0x1E,0xF8, + + 0x69,0xB0,0xCA,0x59,0xD2,0xA7,0x26,0xDF,0xCA,0x56,0xC9,0xCC,0xF9,0x61,0x1F,0xCD, + + 0x2F,0xAC,0x8D,0xC8,0x45,0xC9,0x6D,0x6B,0x7B,0x05,0xFE,0x15,0xFC,0x96,0x80,0xB9, + + 0xA9,0x92,0xDD,0x9F,0x50,0xC4,0x5E,0x7B,0x7A,0x5A,0x27,0xF5,0x06,0x30,0xDF,0x7C, + + 0x2A,0x5F,0x9A,0x81,0x37,0xE2,0xA0,0x58,0xA3,0xD0,0x20,0xD3,0x67,0x45,0xFC,0x48, + + 0x94,0xE2,0xAF,0x31,0xB9,0xC7,0xC2,0x3A,0xB8,0x0E,0xE3,0x50,0x8B,0x6A,0x1E,0xA6, + + 0x7F,0x1E,0xFB,0x06,0x1A,0xA9,0x0E,0xD5,0xD4,0x1F,0x09,0xD8,0x59,0xF9,0x00,0x93, + + 0x4A,0x63,0xD0,0xE7,0x9D,0xC5,0xA9,0x49,0x66,0xA6,0x99,0xC4,0x76,0xF1,0xCF,0x2D, + + 0xDB,0x58,0xDE,0xAF,0x9B,0x22,0xED,0x82,0x40,0x2C,0xCA,0x80,0xD4,0xF8,0xA0,0x30, + + 0x44,0x75,0x37,0x25,0x2C,0xCB,0xF6,0x43,0xC5,0x29,0xC0,0x89,0x47,0x38,0xD8,0x1D, + + 0x04,0x82,0xE1,0x87,0x92,0x82,0x77,0xA3,0xCA,0x84,0xAA,0x05,0x21,0x83,0x16,0xAB, + + 0x87,0x23,0x8B,0x55,0x96,0xE7,0xD4,0x11,0x38,0xC1,0x01,0x7F,0x2A,0xA8,0xC7,0x70, + + 0x9A,0x95,0xDC,0x08,0x8C,0xCC,0x0D,0xC8,0xE0,0x15,0x0A,0x5E,0xDC,0x4E,0xCF,0xE1, + + 0xFC,0xDF,0x4E,0x76,0x3C,0x54,0xAA,0x40,0xEA,0xD9,0xC4,0x0A,0xB6,0x08,0x46,0x4B, + + 0x98,0x37,0x99,0xEA,0xFF,0xEA,0x4B,0x0C,0x31,0xC5,0xCB,0x6F,0xF9,0x67,0x50,0x71, + + 0x17,0x94,0x1F,0x38,0x31,0xAF,0x04,0xDD,0xDD,0x16,0x17,0x4C,0xB1,0x4D,0xF8,0xE2, + + 0xC6,0x65,0xC6,0xB3,0x3E,0xBD,0x5B,0x48,0xEF,0xA2,0x46,0x0C,0xAD,0x89,0xB1,0xF5, + + 0x70,0x8F,0xFB,0xDA,0x18,0x56,0x22,0x72,0xCD,0xD1,0x02,0x76,0xA6,0xA2,0x36,0xCF, + + 0xE1,0x0E,0x63,0x4C,0xE1,0xE2,0x94,0x2B,0xC2,0x33,0xCB,0x94,0xCE,0x73,0xDE,0x2E, + + 0x3B,0x46,0x54,0x2F,0x97,0xA6,0x4B,0xFF,0x82,0x6E,0xFA,0x01,0x78,0xFF,0x3C,0x9F, + + 0xD5,0xFC,0xFB,0xBE,0x32,0x1B,0x90,0xF1,0xC7,0x7C,0x0F,0x03,0x83,0x7B,0x53,0xEC, + + 0x2B,0x4E,0x84,0x7A,0x8B,0xCA,0x15,0x50,0xC9,0x7D,0xE6,0x19,0x03,0x5E,0xE1,0x79, + + 0x5D,0xF0,0x77,0x7B,0x3C,0x49,0x91,0xE9,0x2D,0x96,0xF5,0x9A,0x1F,0xB6,0x92,0x16, + + 0x5A,0x8D,0xED,0x7F,0x71,0x7E,0x99,0xE0,0x46,0x7F,0x19,0xF5,0x79,0xFF,0x3D,0xC1, + + 0x81,0xD8,0x9D,0xB4,0x0D,0xD0,0x0C,0x11,0x5D,0x98,0x40,0x62,0x3B,0x45,0x27,0x21, + + 0x1C,0x93,0xD6,0x25,0x0A,0xB1,0x1E,0xF3,0x66,0xA5,0xFD,0x89,0xD0,0x55,0x75,0x85, + + 0x96,0x39,0x19,0xAD,0xAC,0xD9,0x64,0x90,0xB1,0xB8,0xE7,0x61,0x67,0xB9,0x44,0x49, + + 0x04,0x3A,0xA8,0xA4,0x8A,0x30,0x47,0x00,0xDC,0x78,0xB2,0x84,0xAC,0x70,0x5A,0xAE, + + 0x9D,0x91,0xD8,0x36,0x2C,0x75,0x92,0xE0,0xA5,0x9C,0x16,0x46,0xAE,0x35,0xD1,0xE4, + + 0x03,0x46,0xF5,0x91,0x3B,0x52,0x56,0xBC,0x8C,0xBF,0x0A,0xDC,0xA3,0x06,0xA0,0xF4, + + 0x21,0xF9,0xD9,0x36,0xC7,0xAC,0x1E,0x8F,0x6F,0xBE,0x48,0x53,0xFC,0x96,0x10,0x3E, + + 0x56,0x06,0xFD,0x1B,0x82,0xB4,0xC7,0xB3,0x8E,0xFB,0xB9,0xB9,0x36,0xBF,0xA9,0x2A, + + 0x5E,0x87,0x66,0x5E,0x0D,0x07,0x29,0xAC,0x5E,0x73,0xF0,0x8D,0x15,0x07,0xFC,0x1C, + + 0x0F,0x32,0xE9,0x2F,0x40,0x21,0x57,0xF8,0xCE,0x02,0xDE,0x1E,0x96,0x27,0x43,0xAD, + + 0x51,0x97,0x5F,0x1F,0xB2,0xB7,0xEA,0xE8,0x7A,0xD8,0xDC,0x9D,0x15,0x87,0x24,0x27, + + 0xAF,0x04,0xB6,0xD9,0xDC,0x23,0xCB,0x99,0x10,0xD9,0xE5,0xFE,0xDC,0xDE,0x7E,0xDC, + + 0x06,0x48,0xC4,0xDB,0x16,0x22,0x6E,0xC9,0xC2,0x5C,0x07,0xDB,0xA5,0xF3,0x01,0xEE, + + 0xE8,0xFA,0xC8,0xE7,0x17,0x23,0x28,0xD2,0x63,0x43,0xA2,0xCB,0x57,0x4A,0x0D,0x41, + + 0x86,0x40,0xAF,0x76,0x91,0x60,0x72,0xC3,0x42,0x5E,0xB1,0xB1,0x28,0x91,0xF2,0xE9, + + 0x81,0x8E,0xA7,0x04,0x90,0x8E,0x9D,0x11,0xD5,0x2B,0x2D,0xB1,0x93,0x2B,0xC0,0x23, + + 0xD7,0x68,0xE6,0xF1,0x28,0x4A,0x56,0x20,0xAB,0x4C,0x0B,0x9B,0x2D,0x9B,0xB7,0x23, + + 0x75,0xA4,0xF6,0xF8,0xD9,0x36,0x18,0x97,0xA8,0x21,0xCE,0xCD,0xAC,0xC8,0x7F,0xFD, + + 0x48,0x4E,0xFF,0xE8,0x58,0x15,0x23,0x11,0x61,0x04,0xF1,0x69,0x3B,0x15,0xC1,0xA2, + + 0x8A,0xAA,0x81,0x51,0x3A,0xE0,0x61,0x8A,0x6F,0x4A,0x08,0xC4,0xA1,0xB8,0x14,0xFD, + + 0x3B,0x6C,0x8A,0xBE,0x79,0x65,0x2C,0xF4,0x6A,0xA5,0x80,0xB2,0x5E,0x4A,0xF2,0x6A, + + 0xE2,0xB2,0xEA,0x4B,0xF6,0x24,0xE5,0xBA,0x84,0x34,0x0D,0xC3,0xA8,0xBA,0xFB,0x73, + + 0xFE,0x18,0xBD,0xBC,0xBB,0xA8,0x10,0xC1,0x28,0x07,0x2D,0xA9,0xDA,0x69,0x2D,0xEC, + + 0xD2,0x0F,0x4B,0x8D,0xA3,0xD6,0x23,0x04,0x6A,0x4F,0x60,0x4E,0xA7,0x29,0xCA,0x78, + + 0x02,0xB3,0xFE,0xEE,0xE2,0xDF,0x32,0x52,0xEA,0xF0,0x71,0xC0,0x86,0x1F,0x99,0x1F, + + 0xD1,0x90,0x7E,0x42,0x69,0x6F,0x04,0x29,0xBB,0xE6,0x0C,0x0F,0x69,0xCB,0x79,0xEC, + + 0x79,0xA3,0x74,0xF1,0x9C,0x05,0x2B,0x4E,0x33,0x41,0x3F,0x1E,0xE0,0xC8,0x51,0x5B, + + 0x38,0x84,0x8F,0x23,0x70,0xEC,0xD1,0x5B,0xA0,0x27,0x09,0x3D,0x9F,0xCB,0x24,0x7D, + + 0x81,0x13,0x7B,0xA3,0x91,0x36,0x94,0x46,0x8B,0xE9,0xEC,0xA0,0x99,0xA3,0x76,0xF0, + + 0x2D,0xB5,0x38,0xEB,0x92,0x84,0x26,0x32,0xA8,0xC6,0xDC,0x5B,0x77,0x73,0xBD,0x89, + + 0x49,0xF9,0xB6,0xA7,0x6D,0x3D,0x75,0xF7,0x8C,0x5D,0xA7,0x95,0xA4,0x30,0xD3,0x48, + + 0x92,0x77,0xDF,0xAA,0x9F,0x71,0x65,0x4E,0x96,0x11,0xCD,0x88,0x0E,0xAE,0x7A,0x80, + + 0xC2,0x95,0x12,0xB7,0x77,0x85,0xE0,0x82,0xDD,0x16,0x85,0x06,0xDE,0xD9,0x34,0x60, + + 0xD7,0x57,0x9F,0x27,0xBF,0x38,0x22,0x45,0xD6,0x86,0xF0,0xC2,0x3B,0xA6,0x15,0x32, + + 0x26,0xBB,0xBB,0xC3,0x5B,0x9E,0x17,0xA8,0x5F,0xA7,0x80,0x07,0xBA,0x85,0x89,0x14, + + 0xEB,0x1F,0xB3,0x7D,0x1F,0x3A,0x23,0x45,0x0A,0x9F,0xE9,0x1B,0x1A,0xF4,0x3C,0x6E, + + 0x3A,0x55,0x5D,0x56,0xE4,0x70,0xD6,0xE5,0xF7,0x1A,0xC5,0xAE,0x62,0xF5,0x41,0x7E, + + 0xAB,0x05,0x06,0xDC,0x35,0x92,0x9A,0xCA,0x82,0xC3,0xC2,0x9B,0x12,0x76,0xFF,0x81, + + 0x0D,0xB2,0xDD,0x89,0x37,0x9C,0x48,0x27,0xC8,0x5B,0xE8,0x92,0x8E,0x38,0x52,0xFB, + + 0x56,0x1D,0x07,0x99,0xD2,0xC8,0x7F,0xF3,0xD6,0xF6,0x1F,0xCE,0x8F,0xFE,0x78,0x88, + + 0xC8,0x95,0xB8,0x65,0xD9,0x37,0x41,0x1B,0xEE,0xF1,0xA9,0x14,0x7A,0xFD,0x30,0xDF, + + 0x8A,0xA2,0x96,0xC8,0x4C,0xC2,0x98,0xC9,0x11,0xF2,0x21,0x78,0x79,0x38,0x79,0x4D, + + 0xA8,0x71,0x43,0xBE,0x88,0xB1,0x59,0x51,0xEC,0x5C,0x28,0x12,0x0B,0xFD,0xFB,0xBB, + + 0x29,0xCA,0x10,0x22,0x3B,0x6F,0x0A,0x8A,0x99,0x8C,0x24,0x8E,0xBE,0x8E,0x2D,0x86, + + 0x5F,0x9C,0xFE,0xE4,0x10,0x25,0x36,0x50,0xC6,0x2C,0xF4,0x45,0x52,0xE2,0xDE,0x60, + + 0xA6,0xC3,0x96,0xF4,0x95,0x31,0x28,0x55,0x15,0xC2,0xC9,0xC7,0x23,0xC1,0xC9,0x9F, + + 0x06,0x8A,0x5E,0x85,0x28,0xA0,0x8C,0xC1,0x2D,0x18,0x9F,0x36,0xAA,0xE6,0x78,0x13, + + 0x4D,0xB8,0x93,0xEC,0x6A,0xE1,0x87,0x02,0x47,0x2F,0x87,0x8B,0x58,0x45,0x40,0xC8, + + 0x05,0xC4,0x54,0x24,0xFD,0x47,0xC3,0x93,0x07,0xC7,0x22,0xCE,0x9E,0x07,0x84,0xC1, + + 0x65,0x8D,0x3A,0xA4,0x34,0x65,0x94,0xE1,0x4E,0xCD,0x9E,0xDF,0xBE,0xB6,0xBE,0x42, + + 0x6F,0xAE,0x9B,0xA7,0x9A,0x0B,0xD6,0xDE,0x2F,0x35,0xA4,0x20,0x3F,0x95,0x6F,0x20, + + 0xE5,0x05,0x32,0xA8,0xE8,0x58,0xF9,0x10,0x52,0x6A,0x9F,0xDF,0xD4,0x27,0x6D,0x8E, + + 0x41,0x52,0xFE,0x29,0x1A,0xAA,0x8F,0x48,0xC1,0x4E,0x3A,0xEE,0x1D,0x45,0x55,0xE5, + + 0x0B,0x50,0xD2,0x39,0xE0,0xA6,0x2B,0xFC,0x17,0x85,0x7A,0x28,0x5B,0x6B,0x73,0x96, + + 0xC8,0x07,0x17,0x8D,0x20,0xA8,0x35,0x6B,0x9E,0x86,0xE5,0xCF,0x8E,0xA8,0xA8,0x5D, + + 0xDB,0x8D,0xCB,0x30,0x9F,0xA6,0x3A,0xD3,0x95,0x40,0xEE,0xC3,0xDD,0x40,0x1C,0x0B, + + 0xE7,0x5F,0xC2,0x43,0x18,0x2E,0x24,0x8A,0x11,0x8E,0xD4,0xC2,0x6C,0x48,0x14,0x1A, + + 0x09,0xEF,0x15,0x2D,0x79,0x7E,0x61,0x8B,0x3D,0xCD,0x5A,0x6D,0x16,0x89,0x33,0x29, + + 0xF4,0x03,0xEE,0x3C,0xF0,0x5F,0xB3,0x7D,0xC8,0x85,0x26,0xC6,0x16,0x26,0x96,0xAA, + + 0x2C,0xCF,0x10,0x41,0xF9,0x5B,0xBB,0xFA,0x3A,0x90,0x3B,0xFB,0xD4,0x42,0x0D,0xA0, + + 0x85,0xFC,0xA0,0xF5,0x4A,0xDC,0xF9,0x40,0x57,0xF4,0xA6,0xBA,0x72,0xF2,0xF3,0x6D, + + 0x46,0x6E,0x92,0x27,0x16,0xE3,0x3E,0x50,0x61,0xEA,0x2B,0x49,0x84,0x22,0xC2,0x43, + + 0xA8,0x39,0xC3,0xC3,0xB7,0x9A,0x8D,0xC3,0xE8,0xDF,0x48,0x23,0xF6,0xF1,0x4D,0xC5, + + 0x5D,0x9C,0xCD,0xC0,0x5A,0xBE,0x9C,0xAC,0xCB,0x67,0x46,0x33,0xF7,0x9C,0x34,0x99, + + 0x85,0xF1,0xDA,0x6F,0x5E,0x07,0x0A,0x4A,0x60,0x96,0x8A,0xE0,0x9F,0x5C,0xDF,0x23, + + 0x62,0x96,0xBF,0x28,0xE3,0xA6,0x44,0xC3,0x1D,0x7A,0x03,0x85,0x59,0x44,0x5A,0x21, + + 0xCD,0x3E,0x1A,0xB4,0x84,0x15,0xF8,0x81,0x11,0xB3,0x26,0x63,0xF4,0x14,0x33,0x96, + + 0x57,0x3C,0x4A,0x7E,0xB1,0xF5,0xA8,0x80,0x95,0x04,0x82,0x85,0xD9,0x68,0x92,0x68, + + 0xAE,0x54,0x66,0x6A,0x4D,0x63,0x64,0xA5,0x06,0x55,0x76,0x2E,0xB5,0x58,0x10,0x43, + + 0x0E,0xF9,0xBC,0x00,0x3B,0x9B,0x58,0x0B,0x92,0x54,0x6D,0xBF,0x94,0x2A,0x90,0x69, + + 0x00,0x95,0xA7,0x0B,0xFE,0xF2,0x49,0xEB,0x61,0x57,0x64,0xAD,0x16,0x51,0x71,0x42, + + 0xA5,0x16,0x11,0x1B,0xBF,0xB8,0x5D,0xBB,0x1A,0x99,0x13,0x2C,0xD3,0xF3,0x6C,0xE8, + + 0xAE,0x9F,0x6B,0xAC,0xD5,0xEF,0x08,0x46,0xE3,0x71,0x36,0x7A,0x7E,0xBD,0xAA,0x35, + + 0x29,0xBF,0x94,0x3E,0x33,0x10,0x2F,0x69,0x09,0xD7,0x72,0x5A,0x7D,0x02,0x5D,0x38, + + 0xAF,0xDC,0x53,0xAD,0x55,0xCD,0x22,0x78,0x80,0x73,0xF7,0x65,0x99,0x57,0x80,0x5F, + + 0xA1,0xF5,0x3E,0x2D,0x9C,0x7F,0xFD,0xE8,0x89,0xCC,0x7C,0xFF,0x98,0x36,0x1E,0x50, + + 0x26,0xF0,0x30,0x7C,0x24,0xF0,0x10,0xF4,0x73,0x10,0x2F,0xDB,0xAF,0xDC,0x69,0x79, + + 0x85,0x43,0xFB,0x7F,0x11,0x71,0x18,0x04,0x2C,0xAA,0x5E,0x34,0x15,0x70,0xFA,0x7F, + + 0x80,0x14,0x81,0x08,0xA2,0x5B,0x92,0xD5,0xA1,0x42,0xE4,0xD5,0x87,0x53,0x99,0x35, + + 0x89,0x23,0xC8,0x21,0xCE,0x28,0x9F,0x25,0x3E,0xBC,0x17,0x2F,0x69,0x1D,0x4F,0xF9, + + 0x69,0x03,0x7E,0xC0,0x65,0x3B,0x50,0xD0,0x19,0xFF,0xCC,0xAE,0x7B,0xFB,0x4C,0xDC, + + 0x38,0xFB,0x08,0x88,0x50,0x8A,0xE3,0x2B,0xE5,0x63,0xFC,0xE7,0xDB,0x82,0xBE,0x86, + + 0x10,0x85,0x62,0xFD,0x4E,0x95,0xB6,0x26,0x67,0xB9,0xF5,0xE9,0x5A,0x8F,0x7D,0x1D, + + 0x99,0x3D,0x18,0x72,0x32,0x88,0xC6,0xB5,0xAD,0x47,0x19,0xA9,0x41,0xCA,0xFD,0xF6, + + 0x9F,0x1E,0xDF,0x0A,0x88,0x4E,0x6C,0x5C,0x0F,0xB8,0xEA,0xC3,0xE5,0xB6,0x0E,0x05, + + 0xF0,0x1E,0x75,0x11,0x15,0x09,0x65,0x12,0x0E,0xC3,0x84,0x70,0x6B,0x88,0xD9,0x78, + + 0xAA,0xFA,0x30,0xCE,0x7D,0x35,0xEC,0x34,0x37,0xB5,0xFB,0x83,0x70,0x1E,0xD1,0xC9, + + 0xAF,0xFB,0xCA,0xB8,0xB4,0xA0,0x15,0xD1,0xDD,0xB4,0xDE,0x24,0x91,0x6B,0xFA,0x8F, + + 0xD0,0x06,0x17,0x3F,0x73,0x53,0x29,0x9E,0xFB,0x32,0xC8,0xFC,0xA1,0xC1,0xA3,0x53, + + 0x6D,0x7F,0x7D,0xE5,0xE0,0xB6,0x42,0x34,0x21,0x1C,0x9C,0x0F,0x3A,0xEC,0x87,0x1D, + + 0xB5,0x62,0x1A,0x4D,0x6E,0xBD,0x24,0xF2,0x1E,0xF7,0x86,0x2A,0x00,0x64,0x03,0xDB, + + 0x18,0x28,0xCB,0xD9,0xDD,0x85,0x99,0x65,0xCB,0xA2,0x20,0x86,0x32,0x5C,0x6F,0x27, + + 0x06,0x8E,0x7B,0xE3,0xD6,0xC9,0xBF,0x5F,0x60,0xAF,0x85,0xB1,0x70,0x01,0xA1,0x32, + + 0x27,0x8F,0xB9,0xE6,0xD4,0x1D,0xBE,0xC1,0x47,0xA1,0xF6,0x3E,0x3E,0xE0,0x80,0x9C, + + 0xA6,0x33,0x09,0x85,0x8C,0x29,0x33,0x53,0x94,0x6E,0x5C,0x96,0x5B,0x8D,0x7E,0x9C, + + 0xAD,0x90,0x50,0xD8,0xBF,0x01,0x81,0xD4,0xCC,0xFA,0x9D,0xB5,0xB3,0x62,0x39,0xBE, + + 0x97,0xD9,0x0F,0x13,0x49,0x24,0xAA,0x3E,0x80,0xC0,0xEA,0x95,0x12,0xAB,0xEA,0x77, + + 0xBE,0x08,0x98,0xCB,0x15,0x98,0x96,0x58,0x75,0x75,0x3B,0xB4,0x77,0x51,0x7B,0x4C, + + 0xF0,0x4F,0x05,0x51,0xF9,0xE2,0x0B,0x67,0x40,0xDD,0x2A,0x96,0xC0,0x1A,0xB4,0xB2, + + 0x2E,0xF3,0x9D,0xEB,0xCF,0x2C,0x5D,0xE0,0xFF,0x55,0xE3,0x71,0xA4,0x8B,0x8B,0xD3, + + 0x4A,0x80,0x53,0x61,0x90,0x86,0x08,0xD9,0x07,0xB3,0x9E,0x71,0x5B,0x43,0x9E,0xA2, + + 0x7D,0x9A,0x1F,0x30,0x70,0x83,0x01,0xC1,0x10,0x32,0xF2,0xCA,0xCA,0x86,0xEF,0x2C, + + 0xA4,0x7A,0x78,0x94,0xEE,0xBB,0xC9,0x5C,0x91,0xE3,0x37,0x2B,0x1C,0x76,0x84,0xFB, + + 0x85,0x8B,0xEA,0xB2,0x5F,0x87,0xC3,0x55,0x8C,0x92,0x9F,0xB9,0xA1,0xBA,0xDC,0x9D, + + 0x34,0x1C,0x46,0x92,0x9E,0xD1,0x10,0x65,0x4A,0x9D,0x80,0x54,0x91,0xAF,0x5C,0x79, + + 0x32,0xF7,0xB7,0x2F,0x59,0xE9,0x53,0x39,0x7C,0xD4,0xE0,0x8D,0x1B,0x5D,0x47,0xDC, + + 0xF6,0x2C,0x03,0x93,0xB4,0x20,0x40,0x4C,0xDC,0x76,0xF3,0x9E,0xB2,0xDD,0x97,0xC7, + + 0x43,0xE8,0x1B,0xAF,0x50,0x9C,0x5F,0xF4,0xBB,0x8F,0x20,0x8F,0xFD,0xA5,0x62,0x03, + + 0xFB,0xDF,0xFE,0xEB,0xD4,0x96,0xCF,0xD9,0xF4,0x0A,0xF4,0x12,0x1F,0xAB,0x28,0x0F, + + 0x01,0xE2,0x28,0x0F,0x71,0xF9,0xC7,0xCD,0xF2,0xD4,0xC2,0xF0,0xB5,0x95,0x40,0xF7, + + 0x8B,0xA3,0x08,0xF5,0x6F,0x1D,0x7B,0x72,0xC9,0xA2,0xC1,0x45,0x21,0x1D,0xFD,0x49, + + 0x00,0xE0,0x31,0xF3,0xA2,0x47,0x73,0x63,0x8C,0x49,0xF7,0x8E,0x9F,0x1C,0x7A,0xCA, + + 0x18,0xBE,0x47,0xEF,0xE2,0x37,0xD8,0x49,0x25,0x2E,0x5C,0xFD,0x57,0xA4,0x68,0x4E, + + 0x6B,0x5D,0xC7,0xAE,0x17,0xE7,0x60,0x96,0xA7,0x89,0x6F,0x85,0x29,0x38,0x07,0x09, + + 0x79,0x06,0x56,0xFE,0x4F,0xDB,0x63,0xE7,0xC0,0x67,0xD5,0x14,0x3F,0x55,0x31,0xAE, + + 0x13,0xF1,0x2B,0x86,0x4F,0xB4,0x46,0x8C,0xC7,0x65,0xD9,0x53,0x9F,0x44,0x71,0x50, + + 0x5C,0x78,0x46,0xA1,0xB1,0x75,0xB0,0xD5,0xA0,0xE2,0xCE,0x49,0x91,0xBF,0xFE,0x26, + + 0xDE,0x19,0x9A,0xD7,0x37,0x5B,0xC5,0x3A,0xB2,0x94,0x70,0x66,0x7B,0xE8,0xF7,0xAF, + + 0x75,0x06,0xD9,0xE1,0x63,0xC4,0xA7,0x7F,0xFB,0x16,0x85,0xB5,0x10,0xB1,0xAB,0xCB, + + 0x80,0xA8,0x7C,0x76,0x67,0x76,0x65,0x6B,0xA4,0x90,0x3D,0x3F,0x57,0xD1,0x11,0x2C, + + 0xE5,0x73,0xBD,0x5B,0x18,0x76,0xA2,0x23,0x11,0xA5,0xCC,0x1F,0x3E,0x13,0x6B,0x5A, + + 0x37,0x15,0xA4,0x40,0x63,0x59,0x0E,0x21,0xA2,0xA2,0x3A,0xA2,0xC3,0xAF,0x9A,0xB9, + + 0xDC,0x7E,0x0D,0x56,0x98,0x6C,0xE9,0x06,0xBD,0x68,0x0C,0x1D,0xBC,0x11,0x49,0x61, + + 0x2E,0x70,0xBB,0xA6,0xD7,0xED,0x84,0xED,0x33,0x73,0x30,0x29,0xDC,0x2D,0xA0,0xA7, + + 0x56,0x0C,0x49,0xF0,0x8F,0x4F,0xAE,0xD6,0x01,0xD8,0xBD,0x7E,0xB8,0x97,0xA8,0x82, + + 0xD7,0x2D,0xDF,0xF4,0xC6,0x4E,0x18,0xB5,0xA5,0x28,0x44,0xD8,0xF6,0x28,0xE1,0x3B, + + 0x71,0xF1,0x61,0x3E,0xD1,0xD4,0xEF,0x1F,0xB3,0x96,0xDF,0xD5,0x4B,0x2D,0xE9,0x2B, + + 0x74,0x9E,0xD3,0xC8,0x4D,0xD7,0x17,0x89,0x86,0x9B,0x72,0x63,0x87,0x73,0x09,0xBD, + + 0xD9,0x08,0xDA,0x77,0xBB,0x32,0xF3,0x63,0x24,0x16,0x55,0x95,0x4C,0xFD,0xFC,0xD2, + + 0x4F,0x1D,0x13,0x25,0x41,0x1A,0xAB,0x2F,0x99,0x2A,0xB4,0xF2,0xFF,0x58,0x53,0xCD, + + 0xDF,0xBC,0xE4,0x07,0x38,0x3D,0xB4,0x7E,0x8E,0x27,0xB3,0x20,0x34,0xD6,0x77,0xD1, + + 0x79,0xBB,0x3A,0xA4,0xDD,0x30,0x7D,0xF3,0xE7,0xD7,0xC3,0x4E,0x3D,0x5E,0xB2,0x8F, + + 0x6C,0x04,0x29,0xAB,0x3C,0xE8,0x26,0x3E,0x60,0x58,0xB2,0x2F,0x0A,0x31,0xFA,0xBF, + + 0x7D,0x39,0x31,0x95,0xD9,0x1E,0xCD,0x68,0x92,0x51,0xC6,0x65,0x67,0x3F,0x0C,0x2E, + + 0xDE,0x06,0x60,0xA2,0x8A,0x02,0xF1,0x83,0xA3,0xCE,0x53,0xF1,0x17,0x05,0x89,0x6F, + + 0xA0,0x99,0x87,0xC5,0x7A,0x36,0xDD,0x6D,0x12,0xC7,0x90,0x48,0x68,0x6F,0x5E,0x35, + + 0xD1,0x83,0xE7,0xCE,0x3F,0xFC,0x89,0x15,0x91,0x23,0x88,0x53,0x97,0x6F,0x99,0x44, + + 0xBB,0x54,0xB5,0xEF,0x9E,0xD6,0x7E,0xFA,0x5C,0x0B,0xDA,0x8D,0x37,0x5E,0x9D,0xA0, + + 0x47,0xB0,0xC3,0xBC,0x3C,0xDF,0x88,0x14,0xEE,0xDE,0x95,0xEF,0x15,0x2D,0xA3,0xE3, + + 0xF1,0xAF,0xF3,0xC5,0x96,0xB8,0xC5,0x1B,0xEB,0xFA,0xC1,0x8E,0x9F,0x00,0xFF,0x72, + + 0x62,0xFF,0xBE,0xB1,0xB7,0x05,0xD0,0xA4,0x17,0xA5,0xB0,0xAE,0x51,0x9A,0x36,0xB8, + + 0x20,0x91,0xEE,0xA4,0xF8,0x42,0x06,0xC3,0x48,0xEC,0xE3,0x4B,0x5F,0xDE,0xFA,0x85, + + 0xD7,0x94,0xF2,0xC2,0x79,0xC1,0xBD,0x52,0xBA,0xE4,0x2A,0x03,0x3D,0x00,0xE5,0x83, + + 0x89,0x09,0x49,0xC9,0xF2,0x29,0x4A,0xA3,0xC1,0xEC,0xA7,0x0C,0x75,0x8E,0x20,0x0B, + + 0xB2,0x09,0x27,0x04,0x10,0xAF,0x57,0x7E,0x74,0xEB,0x10,0xE1,0x43,0x6C,0x9B,0xA3, + + 0x7D,0xD1,0x62,0x2A,0xD6,0xAE,0x0F,0x02,0xA8,0x56,0x18,0xE4,0x97,0x6D,0xBA,0x66, + + 0x23,0xD2,0x49,0x74,0xA8,0x39,0x84,0x7F,0xB0,0xE9,0xD0,0xE7,0x10,0xF7,0x41,0xA2, + + 0x8A,0x8C,0x41,0x64,0xA1,0x38,0x67,0xD9,0x4C,0xE1,0x91,0xF7,0x11,0xF6,0x82,0x0B, + + 0xE1,0x4A,0x02,0x2F,0xB5,0x85,0x1A,0x0B,0x3A,0xE8,0x56,0xD2,0xB1,0xB9,0x0C,0xA9, + + 0xE0,0xF8,0xB4,0xA0,0xFA,0x20,0x41,0x38,0x21,0x44,0x21,0x84,0xB2,0xAA,0xC8,0x3E, + + 0x00,0xA7,0x54,0xFF,0xBB,0x4A,0x45,0x5A,0xA1,0xF5,0x57,0x14,0x33,0x89,0xBB,0x6E, + + 0x87,0xA4,0xCC,0x6E,0xE7,0x8A,0xE4,0x43,0xCF,0x91,0x77,0x4E,0xB7,0xCD,0xBD,0xBB, + + 0x3C,0xA3,0x68,0x33,0xDF,0x8C,0x07,0xA8,0x41,0xE1,0x12,0xFC,0x76,0x64,0x34,0xF1, + + 0xE0,0x1E,0x9B,0x2F,0x29,0xAA,0x9A,0xF8,0x05,0xB2,0xE2,0x86,0xF7,0x60,0x96,0x3A, + + 0xB1,0x8C,0x96,0x4F,0x15,0x8E,0x02,0xED,0xC8,0x24,0xD0,0xEF,0x18,0x6D,0x75,0xB0, + + 0x06,0x6D,0xC9,0x16,0x9D,0x4D,0xF7,0xEA,0xF5,0x92,0x3C,0x07,0x0D,0x67,0xC4,0x5C, + + 0xB2,0xBD,0x9E,0x85,0x13,0x70,0x47,0x53,0x12,0xFD,0x96,0x46,0x76,0xAA,0x16,0x00, + + 0xDA,0xBC,0x9A,0xF6,0xCE,0x9C,0xA0,0xC3,0x5B,0x5A,0x2B,0x0D,0x85,0xE2,0x54,0xE1, + + 0xF6,0xBF,0xB1,0xE2,0x59,0xC1,0x44,0x41,0xE4,0x77,0xCA,0x21,0x98,0x6F,0x58,0xD6, + + 0x7B,0x19,0x5E,0x11,0xE6,0x49,0x9D,0x92,0x4C,0x11,0x5D,0x4C,0x0D,0x77,0xB1,0xBE, + + 0xA3,0x19,0xBC,0xD4,0xDB,0x27,0xAB,0xA7,0xA8,0xA7,0xB4,0x76,0x54,0x79,0x1D,0x54, + + 0x21,0xC5,0x8C,0xD4,0xCC,0x9E,0xDA,0xEE,0x15,0xA1,0xE7,0x6A,0x72,0x57,0xFA,0x83, + + 0x03,0xBB,0xF7,0xF5,0xD2,0x74,0xEE,0x72,0x94,0x5C,0xAE,0xC2,0x53,0x80,0x8D,0x55, + + 0xDE,0x55,0xB5,0xC5,0x5A,0x24,0x8A,0xE2,0xD1,0xDF,0x1D,0x70,0xEC,0x71,0x44,0x0C, + + 0x7F,0xE4,0xF8,0xB5,0x94,0x35,0xDD,0xF7,0x02,0xCB,0x56,0x6B,0x91,0x9B,0xA2,0xEB, + + 0x53,0xEF,0x98,0xFE,0xC6,0x94,0x20,0x01,0x01,0xF0,0x5E,0x60,0x1A,0x71,0x51,0x31, + + 0x43,0xC9,0xF9,0xB1,0x51,0x12,0x69,0x15,0x9F,0x5A,0xF1,0x1D,0x11,0x19,0x71,0xD8, + + 0x40,0x88,0x87,0x19,0xEE,0x41,0x61,0xF8,0x1C,0xF8,0x1D,0x39,0xAE,0xC0,0x9B,0x67, + + 0x2C,0x7E,0xF4,0xFC,0x5E,0x7E,0xBA,0x97,0xA0,0x74,0xB4,0x4C,0x7C,0x3E,0x26,0xBA, + + 0xDC,0x5F,0xF0,0x74,0xD9,0xBD,0xD8,0xE6,0x6A,0xA9,0x71,0x1E,0xD7,0x80,0xA8,0x0B, + + 0x0B,0xE1,0x87,0x72,0xF2,0x2D,0xEC,0x7A,0xEB,0x56,0x33,0x6F,0x38,0x3D,0x50,0xA0, + + 0x7F,0x8C,0xA1,0xAE,0xD5,0x34,0x53,0xEA,0xD9,0xF7,0xA7,0x79,0xF5,0x05,0xF4,0x71, + + 0x26,0xE2,0x98,0xF9,0xFD,0x73,0x91,0x51,0x7E,0xC9,0x60,0x55,0x7E,0xA2,0x9B,0x2F, + + 0x36,0xE1,0x1C,0x74,0x98,0x07,0x70,0x3F,0x43,0x1B,0x78,0xEA,0x16,0xA3,0x5F,0xB3, + + 0x6D,0x81,0x61,0xDB,0x8B,0x7D,0x71,0xA7,0x93,0x0E,0x7A,0xD7,0xD5,0x91,0x82,0x35, + + 0x68,0xE1,0x7F,0x64,0xF3,0x2A,0x8F,0x40,0xBF,0x72,0x72,0x5E,0xD4,0xC2,0x9F,0x31, + + 0x34,0xEA,0x2D,0xC4,0xD4,0xA5,0x16,0xCE,0x45,0x24,0xA3,0xE4,0x94,0xA5,0xBE,0x22, + + 0x0F,0x8E,0x8A,0x72,0xCA,0xAA,0x5E,0xDA,0x42,0xAB,0x98,0xE4,0x71,0xA7,0x86,0x03, + + 0xC9,0x2B,0x21,0xC3,0x18,0xA0,0xD2,0xCF,0x1A,0xB5,0xC9,0x99,0x7A,0xEB,0x25,0x20, + + 0xB5,0xC5,0x5D,0x28,0x34,0x2A,0xC6,0xE0,0xBD,0x1A,0x3D,0x3F,0xD6,0xF7,0x89,0x8F, + + 0x9F,0x97,0x82,0xE4,0xE9,0x21,0x4C,0x6B,0xBD,0xCC,0x72,0xF2,0xBE,0xE2,0xCD,0xE9, + + 0x2F,0x24,0x9E,0x79,0xB5,0x17,0xC1,0x0B,0x37,0x66,0xBB,0x4D,0x33,0xA6,0xDC,0x4C, + + 0x65,0x89,0x83,0x85,0x9D,0xEA,0xA2,0x3A,0xA6,0x41,0x35,0x5C,0xBA,0xA5,0xBC,0x85, + + 0x66,0x7A,0x6B,0xC3,0xE6,0xA6,0x6C,0xCB,0x32,0x68,0xDB,0x68,0x2C,0xE6,0x22,0x8F, + + 0x08,0x8E,0x9C,0xE6,0x7D,0xE4,0x14,0xD2,0x4F,0x2C,0x92,0xFC,0x2A,0xAE,0x5B,0x38, + + 0xFC,0xE8,0x2A,0xDE,0x10,0xEF,0x5C,0xD2,0x42,0x60,0x9A,0xEC,0x2B,0xAF,0xA5,0xB4, + + 0x0C,0x92,0xF5,0xE7,0x2D,0x63,0xD0,0xD3,0x12,0x7D,0xB1,0x79,0xDF,0x4F,0x53,0xA0, + + 0x89,0xF4,0xAB,0xCA,0x60,0x04,0x2A,0xFF,0xCD,0x1F,0xB9,0x5A,0xDE,0x7F,0xC7,0x71, + + 0x25,0xB5,0x5F,0xA1,0x95,0x4F,0x67,0x51,0x65,0xF5,0x74,0x97,0xC5,0x50,0xAC,0xA3, + + 0x5F,0x3E,0x3F,0xE5,0x4D,0x38,0x04,0xC2,0x6D,0xDA,0xE6,0xB7,0xD6,0x04,0x76,0x92, + + 0xCE,0x19,0x49,0xF4,0x8A,0x14,0x66,0x27,0xB3,0x69,0xE3,0xC6,0xD5,0xB3,0x7A,0xE1, + + 0xCF,0x00,0x8D,0x7D,0x5C,0xE0,0xBD,0x90,0x48,0x91,0xEA,0x89,0x87,0xB1,0xC3,0x7B, + + 0xA9,0x39,0xA2,0x42,0x34,0xE1,0x72,0x4A,0xE6,0xC1,0x94,0x74,0x14,0x08,0x3F,0x41, + + 0x11,0x9F,0x8E,0x66,0xEA,0xBA,0x2D,0x5B,0x8E,0xE6,0x9C,0xBD,0xC7,0xF8,0x32,0x50, + + 0x98,0x3B,0x25,0x57,0xB9,0xB0,0x4F,0x10,0xD4,0x72,0x8D,0xC0,0x0B,0xF9,0x6C,0xC0, + + 0xD5,0xC4,0x59,0xA8,0x14,0xF5,0xD1,0x61,0xA7,0xDD,0x02,0xD0,0x56,0xF1,0x58,0x32, + + 0x2A,0x42,0xBC,0x8C,0xAE,0xB0,0xFD,0x7A,0x6A,0x02,0xEA,0xD8,0x58,0x0C,0x34,0x0A, + + 0xD2,0x34,0x49,0xE0,0x5C,0xBD,0xF5,0x08,0x6E,0x39,0xBE,0x52,0x59,0xC2,0x8D,0x4B, + + 0xFE,0x37,0x3C,0x48,0x55,0xC9,0x2A,0xEB,0xB8,0x98,0x61,0x47,0xF9,0x61,0x7A,0xDC, + + 0x73,0x91,0xD6,0xEC,0x8B,0x32,0x01,0x0F,0x4A,0xCB,0x84,0x3B,0xF3,0xCB,0x40,0x73, + + 0x10,0x98,0xA6,0x73,0xD5,0xD8,0xE4,0x1A,0x6B,0x7D,0x94,0x5A,0xA3,0xF3,0x4E,0xCA, + + 0x65,0x8E,0xFE,0xBC,0xC8,0xD8,0x24,0xBE,0x07,0xCE,0x41,0xCE,0x33,0xE6,0x61,0xD8, + + 0x9C,0xAD,0xDB,0xA0,0x3C,0x38,0x22,0x01,0x0B,0x21,0x43,0x90,0x5D,0xBF,0x4F,0x45, + + 0xA9,0xDD,0xD7,0x5D,0x7D,0xBC,0x06,0x8D,0x18,0xB1,0x52,0x19,0xDB,0xFF,0x3A,0xF3, + + 0x30,0xFF,0x9A,0x06,0xA3,0xBD,0xAB,0xE7,0x9A,0x48,0xD5,0x5C,0xB9,0x90,0x76,0x39, + + 0x32,0x84,0x0A,0x4A,0xE0,0xFD,0x02,0x31,0x60,0x71,0x9E,0xB0,0x2D,0x5C,0x3F,0x6D, + + 0x0D,0x60,0x9B,0x07,0x02,0x2A,0x50,0xC9,0x02,0x8F,0x7D,0xB6,0xE0,0x6A,0xB1,0x71, + + 0xC9,0xA8,0x26,0x6E,0x4C,0x38,0xC3,0x35,0xD3,0xEE,0xB9,0x30,0x30,0xCC,0xC4,0xB1, + + 0x5E,0x47,0xC0,0x84,0x1E,0xDF,0xBC,0x1F,0x88,0x75,0xB2,0xF8,0x53,0xA4,0x8A,0x54, + + 0x0A,0xAA,0x64,0xC6,0x01,0x2F,0x39,0x30,0x1F,0x5E,0x44,0x7C,0x55,0x47,0x11,0xC4, + + 0xCA,0x07,0x7E,0x61,0x7B,0x25,0x0B,0x63,0x71,0x9F,0x11,0xE0,0x41,0xE1,0x77,0x4C, + + 0x0C,0xA1,0x42,0x27,0x78,0x04,0x92,0x17,0x3C,0x57,0x99,0x85,0xD0,0x68,0x13,0x09, + + 0x77,0x48,0x2A,0x88,0x6C,0xA5,0x03,0x1C,0xAF,0x4C,0x15,0x5F,0x04,0x63,0x78,0x19, + + 0x0B,0x84,0x8B,0x63,0xBE,0x2A,0xE0,0xB0,0xAE,0x4D,0xD9,0x50,0x5F,0x98,0x63,0x43, + + 0xBB,0x07,0xCB,0x89,0x6D,0x65,0x56,0x5B,0xFB,0xCC,0x13,0xEB,0x8A,0x69,0x52,0x9E, + + 0x6E,0xA0,0x4F,0x11,0x9F,0xF8,0x5F,0xD1,0x47,0x86,0xC6,0xD5,0x27,0x26,0x53,0x08, + + 0x42,0x4E,0xFC,0xEC,0xED,0x87,0xEA,0x80,0xB4,0xB0,0xF2,0xFC,0xB3,0x57,0x70,0xAB, + + 0x57,0x4F,0x57,0xD8,0x15,0x51,0x7A,0x4C,0x4D,0xBC,0x6B,0x1E,0x19,0xD2,0xD4,0x22, + + 0x0A,0x6E,0xBB,0x44,0x9C,0x0C,0xAB,0x61,0x37,0x01,0x91,0x92,0x58,0xA2,0xDC,0xEC, + + 0x04,0xA9,0xE1,0xD9,0xD9,0xB4,0x0B,0x3E,0x15,0xB0,0xE1,0x92,0xDD,0xFD,0x72,0xE6, + + 0x30,0x13,0x40,0x89,0x36,0xE3,0x05,0x94,0x87,0xFD,0xC7,0xA6,0x58,0x1C,0x8C,0x56, + + 0x6F,0x5F,0x21,0x64,0x71,0x7E,0xE6,0x58,0xEF,0x9C,0xA6,0x26,0x71,0xEE,0xBB,0x01, + + 0x82,0x00,0x60,0x45,0xF4,0x29,0xD8,0xC1,0xE4,0xDF,0xAF,0x36,0xC8,0xCD,0x4C,0x79, + + 0x4B,0x98,0x1D,0xB5,0xBF,0x73,0xF1,0x23,0xF1,0x5B,0x31,0xCA,0x2B,0xEE,0xAC,0x58, + + 0x02,0x86,0x9A,0x26,0x2A,0xB1,0x0A,0xFD,0x76,0xF9,0xB6,0x6C,0x71,0x34,0x81,0x30, + + 0x7A,0x0E,0xF6,0x64,0x6D,0x9A,0xF1,0x00,0x67,0x1A,0x30,0x66,0x25,0x7D,0xC5,0x80, + + 0x7B,0xBB,0xD7,0x3F,0x59,0x72,0xD2,0x01,0xA6,0x4D,0xF1,0xFA,0x1B,0x75,0x42,0xB7, + + 0x80,0x0F,0x69,0xA7,0x3D,0xBD,0xCD,0xB6,0xD0,0xAD,0x5D,0xF6,0x2F,0xDA,0x02,0x6E, + + 0x38,0x93,0x8A,0x9C,0x1A,0xFA,0x90,0xDA,0x8F,0x43,0x8C,0xAE,0xCB,0xA5,0x40,0x70, + + 0x30,0x54,0xED,0xEA,0x3F,0xC8,0x0E,0x2C,0x2D,0x58,0x19,0xFB,0x4A,0x75,0x14,0x6F, + + 0x88,0x48,0x07,0xCC,0xF8,0x21,0xBA,0xB9,0x4F,0x1B,0x8D,0xAF,0x6A,0x70,0xF4,0x68, + + 0x0A,0xBB,0x5D,0xDA,0x67,0x79,0xDA,0xBC,0xC9,0x39,0x27,0x2E,0xC1,0x34,0x1F,0x52, + + 0xCF,0xE3,0x41,0x4E,0x90,0xE6,0xEE,0x7B,0x5F,0xD7,0x86,0xAB,0xB8,0x6E,0x6E,0x32, + + 0x5A,0x0B,0x94,0x5C,0x98,0x3C,0x16,0x6D,0x6D,0x8C,0x80,0x1E,0x63,0xF8,0xEB,0xB2, + + 0x74,0x95,0xBF,0x4F,0x7F,0x6B,0x77,0x6D,0x9E,0x03,0xE9,0x4D,0xF9,0x1C,0x47,0xDD, + + 0x2B,0x16,0xDA,0xC4,0xBD,0x5D,0x32,0x39,0xED,0x44,0xCD,0x0F,0x10,0x3B,0xA7,0xA6, + + 0x37,0x46,0x45,0xC6,0x5C,0xE2,0xCB,0xE5,0x9A,0xC8,0xCB,0x2E,0xF1,0x5F,0xF7,0x84, + + 0xA6,0x82,0xF1,0x98,0x72,0xE1,0x18,0x22,0xA4,0xDA,0x03,0xAC,0xA2,0x54,0xDB,0xF2, + + 0xB4,0x44,0x36,0xCD,0x14,0x50,0x37,0x5D,0x1A,0x0D,0x1D,0x58,0x0E,0x1D,0x68,0x16, + + 0xA7,0x21,0x89,0x8A,0x93,0x52,0xDD,0xC5,0xF6,0xA5,0xAC,0xCF,0xD5,0x8D,0xF9,0xC6, + + 0x7A,0x13,0xF2,0x86,0x10,0x26,0x4B,0xFC,0xB1,0xA8,0xCF,0xE2,0x5C,0xE6,0x05,0x92, + + 0x0D,0x28,0x53,0xD2,0x1D,0xDC,0x42,0xE0,0x47,0x9A,0xB8,0x14,0xA8,0xE3,0x29,0x52, + + 0x80,0x57,0xA0,0xB6,0x35,0x96,0x4B,0xF0,0xF3,0xB9,0x4E,0x85,0xD0,0xC4,0xEE,0x33, + + 0xDF,0xE9,0x29,0xD2,0x0A,0xE5,0xD5,0x0C,0x59,0x9A,0x53,0x5C,0x76,0x38,0xA1,0x79, + + 0x3C,0x37,0xCB,0xE6,0x8A,0x05,0x88,0xED,0x8E,0x98,0x0D,0xB5,0x3F,0xEC,0x4D,0xFC, + + 0x1F,0xC4,0x46,0x8C,0x15,0xA1,0x00,0xCC,0x6F,0x9B,0x3B,0xD6,0xDC,0xA4,0x8F,0xE3, + + 0x6A,0xC7,0xB2,0x3B,0x7B,0x67,0x3B,0x3B,0x4B,0x98,0xCA,0x53,0x4E,0xE2,0x49,0x1B, + + 0x2A,0x90,0xEB,0x6D,0x7A,0xA8,0xFE,0xD3,0x43,0x66,0xAC,0xD9,0xCF,0xA6,0x04,0x62, + + 0x0F,0x2C,0xA0,0xB6,0x7E,0x86,0x68,0x68,0xFD,0x11,0x4D,0x29,0x88,0xE6,0xEE,0x28, + + 0xE4,0x7D,0xBE,0x2D,0x35,0x2A,0xFB,0x92,0xB1,0x50,0xAA,0xB9,0x9D,0xCF,0xA3,0x76, + + 0x37,0x8A,0x23,0xDF,0x8C,0x0E,0x69,0x69,0x5C,0xC4,0x73,0x6C,0x09,0x43,0x55,0x46, + + 0xAC,0xCF,0xEA,0x99,0x76,0xAC,0x83,0x73,0x36,0x80,0xF3,0xFE,0x36,0xEC,0x16,0xB2, + + 0x6C,0x2F,0x33,0x3C,0x35,0xF0,0x2F,0x26,0x05,0x66,0xF5,0xC0,0xB6,0xF0,0xC0,0x09, + + 0x24,0x01,0x16,0x13,0x3B,0x3B,0x65,0x7F,0xC0,0x0E,0x82,0xAB,0x56,0xE3,0x7C,0xDF, + + 0x01,0x0D,0xB1,0xF9,0x87,0x84,0x0B,0x6E,0xC7,0x1A,0x4D,0x56,0xA8,0xA2,0x74,0x01, + + 0x40,0xFD,0x7A,0x68,0x0A,0xDD,0x3C,0xD5,0x1A,0x0E,0xB1,0xE0,0xF3,0x02,0xA4,0xFF, + + 0x04,0xF8,0x8D,0x74,0x4B,0x54,0x96,0x91,0x56,0x15,0xCE,0x56,0x28,0x5B,0x97,0x15, + + 0xDA,0x33,0x94,0xD4,0x09,0xB6,0x7A,0xB2,0x73,0xCE,0x2C,0xF4,0x37,0x74,0x82,0x3C, + + 0x57,0x40,0x25,0x46,0xB4,0x3B,0x8F,0x95,0x6B,0x50,0x51,0x95,0x78,0x59,0xF4,0x23, + + 0x27,0x88,0xF8,0xDF,0xB1,0xD5,0xD0,0x03,0xEB,0x98,0x83,0x04,0xD1,0x7A,0x44,0x8B, + + 0x2F,0xB9,0x99,0x01,0x3A,0x49,0x66,0xDD,0x20,0xB4,0xEB,0x46,0xE6,0x35,0x15,0x6B, + + 0x8E,0x39,0x94,0x01,0x3B,0x68,0xDD,0x44,0x6B,0x28,0x01,0x25,0x1E,0xFD,0xFD,0x8A, + + 0x2C,0x58,0xD4,0x4F,0xA0,0xD6,0x0D,0x34,0x13,0x57,0x1B,0x2A,0x07,0x96,0x1D,0xAB, + + 0xE5,0x24,0xC0,0xDF,0xB1,0xBA,0xE9,0x7C,0x33,0x06,0xC6,0xC3,0x6F,0xF1,0xFD,0x40, + + 0x2F,0x0C,0x8F,0x7C,0x43,0xFC,0xE6,0x98,0x5D,0x1A,0x88,0x4F,0x78,0xDE,0x6F,0xA1, + + 0x88,0x36,0x42,0x4C,0x2D,0xB5,0xC1,0x78,0x4F,0x41,0x5E,0x8D,0xF3,0x7E,0x3E,0x74, + + 0x5F,0xD1,0xC7,0x5F,0x57,0xBD,0x8D,0xCF,0x32,0xDD,0x6D,0xDF,0x0F,0x51,0xE8,0x7F, + + 0x2F,0xF7,0x69,0xAC,0x9D,0xD1,0x9B,0x04,0xE9,0xCF,0xEF,0x0C,0x73,0x72,0xE4,0x84, + + 0x0A,0xA1,0x58,0xEC,0x7C,0x62,0xCD,0x21,0xBB,0xB5,0x81,0x3B,0x68,0x22,0xAC,0x62, + + 0xA2,0x64,0xD6,0xFD,0x19,0xFA,0xD8,0xB1,0xCE,0xBC,0xEB,0xB6,0xD1,0x2F,0xC1,0x85, + + 0x41,0xAD,0x45,0xE1,0x17,0x33,0x4C,0xA5,0x92,0xFF,0x51,0xC5,0xD6,0xB3,0xB6,0xF3, + + 0x87,0x21,0xA0,0xE8,0x25,0x58,0x61,0x33,0x89,0x01,0xA1,0xE5,0x8D,0xCC,0x48,0x09, + + 0x8D,0xA9,0xC1,0x22,0xA9,0x34,0x6E,0x4C,0x80,0x64,0x7C,0x8C,0x0D,0x29,0x18,0xC2, + + 0x03,0x0D,0x65,0xBE,0x37,0x88,0xF4,0xE2,0xC3,0x4D,0x3B,0x8A,0x77,0xB0,0x15,0xD3, + + 0x96,0xAB,0x79,0xAB,0x82,0x6B,0x59,0x49,0x2B,0x7D,0x36,0x9A,0xC0,0x2B,0xC2,0x96, + + 0x6A,0x64,0x5E,0x64,0x32,0xD8,0x5B,0x80,0xF8,0x03,0x43,0x4A,0xBE,0x1B,0x98,0x38, + + 0xDB,0xA7,0x79,0xF5,0xE7,0x6A,0x56,0xEF,0xA9,0x47,0xC0,0xCC,0x54,0xC3,0x1E,0xEB, + + 0x85,0x84,0x55,0x32,0x26,0xF6,0xE5,0x7F,0x8B,0xE3,0x43,0xD4,0x07,0x24,0xA3,0x7A, + + 0x04,0x89,0x58,0x63,0xEF,0x16,0xD3,0xA8,0xCA,0x47,0xC1,0x3D,0xDE,0x08,0xEF,0x9D, + + 0x83,0xAA,0xD4,0xE2,0x9F,0xF0,0x7B,0x6F,0x75,0x43,0x7C,0xCE,0xF3,0x79,0x20,0x44, + + 0xE3,0x4F,0xFC,0x70,0x34,0xF3,0xC2,0x1B,0x71,0x0E,0x6D,0x23,0xCF,0xB1,0x14,0xB0, + + 0x03,0xA0,0x6A,0xAC,0xA7,0xFE,0x64,0x40,0xE8,0x28,0x84,0x9E,0x5F,0xE8,0x21,0x49, + + 0x8B,0x66,0x99,0xCD,0xE6,0x81,0x13,0xAC,0x21,0x2A,0x7A,0x49,0x33,0xC7,0x16,0x69, + + 0x83,0xD0,0xB5,0x5A,0xBF,0x84,0x65,0x40,0x68,0xE2,0x68,0x9F,0xFF,0x69,0x40,0xB1, + + 0x26,0x52,0x3C,0x17,0x48,0x22,0x1C,0x25,0x89,0x53,0x54,0x31,0x5A,0x0B,0xCC,0x11, + + 0x73,0x90,0x08,0x10,0x3F,0x68,0x22,0x10,0xEE,0xD7,0x5C,0x34,0x0A,0xA4,0x2F,0x05, + + 0xA2,0x11,0x3D,0x16,0xC0,0x3A,0x77,0x29,0xE1,0xB2,0xD5,0x21,0xFA,0x07,0xA5,0x15, + + 0xA7,0xDF,0x21,0x7D,0xEF,0x7E,0xDE,0xF1,0xA5,0x11,0x8C,0x8A,0xC9,0x31,0x75,0x28, + + 0x4E,0x12,0x7D,0x61,0xF8,0x39,0x94,0x0D,0xDC,0x80,0xCE,0xE6,0xE0,0x35,0x7D,0xD2, + + 0x21,0xB8,0xAA,0xB6,0xC8,0xAA,0x9C,0x78,0xD9,0x4E,0xA2,0xF2,0x92,0xF6,0xEF,0x64, + + 0xA4,0x94,0xB8,0x2F,0x47,0x55,0xC4,0xFE,0xDE,0x17,0xC3,0x87,0x92,0xE1,0x14,0x63, + + 0xAF,0x67,0x0D,0x40,0x99,0xBA,0xA8,0x97,0x10,0x47,0x6C,0x06,0x7F,0x36,0xC6,0x08, + + 0xE1,0x5A,0xE0,0xB5,0x2A,0x75,0xD2,0x62,0x8A,0x31,0x56,0x17,0x79,0x93,0xCE,0x1C, + + 0xF4,0x5B,0x4E,0x19,0x0C,0x57,0x44,0xB9,0xCA,0xAC,0x5E,0x3D,0x20,0x8C,0x43,0xBD, + + 0xC8,0x8E,0xE1,0xB5,0xBB,0x5A,0x12,0x2B,0x2D,0xD3,0x24,0x09,0x04,0x19,0x4F,0x0C, + + 0xAF,0x39,0xD6,0xAC,0x1C,0x9D,0x4F,0x9D,0x96,0xA6,0xCD,0x47,0x02,0xA4,0x7C,0x3B, + + 0x19,0x1A,0x1B,0xCE,0x8D,0x03,0xEE,0x13,0x7A,0x11,0xEE,0x12,0xD6,0x71,0x14,0x27, + + 0x88,0x1B,0x2B,0x23,0xCE,0x6B,0xCE,0xBF,0x8A,0xFB,0xE4,0x14,0xF2,0x32,0xED,0xB8, + + 0x09,0x7B,0xBE,0xC9,0x91,0xC4,0xAC,0xE1,0x4F,0xA1,0x2A,0xA3,0x0F,0x3F,0xE5,0xE2, + + 0xAD,0xCE,0x12,0xE5,0x8C,0x1F,0xC6,0x06,0x0A,0xD9,0xDE,0x1B,0xDF,0x79,0xE0,0x86, + + 0xDD,0x2F,0x19,0xFA,0xD9,0x5B,0x36,0xD2,0x70,0xCF,0x08,0xB8,0xBF,0xE3,0x97,0xF0, + + 0x4D,0xA2,0x57,0x92,0x62,0xFC,0x40,0xB0,0x80,0xF4,0xE3,0xDE,0x65,0xAC,0x85,0x71, + + 0x27,0xE7,0x5F,0xEA,0x14,0x19,0x11,0x26,0xA7,0x03,0xE8,0x17,0xD2,0x80,0x17,0xB2, + + 0x67,0x73,0xC9,0x5D,0x25,0x0E,0x01,0xCD,0x38,0xAF,0x5E,0xC4,0xFB,0xF1,0x5A,0xE7, + + 0x84,0x48,0x98,0x42,0xFF,0xF5,0x2D,0xE6,0x44,0x8D,0x59,0x4C,0xF7,0xFB,0x10,0xBA, + + 0x27,0x83,0x48,0x25,0xB4,0x26,0xF4,0xF6,0x41,0xD6,0xC0,0x98,0xFB,0xE8,0x7F,0xA1, + + 0x2A,0x5A,0xD3,0x77,0x94,0x09,0x0F,0x64,0xC0,0x84,0x45,0x05,0x6D,0x83,0xC3,0x44, + + 0x81,0xC5,0x5C,0xA4,0x1B,0xE6,0x7F,0x9A,0xE3,0xCA,0x04,0x53,0xE4,0x5B,0x0E,0x78, + + 0xE7,0xAB,0xB1,0xEC,0xB0,0x05,0xD1,0x6A,0x70,0x8A,0x0A,0xB0,0xB7,0xAB,0x00,0x9E, + + 0x0B,0x45,0x9B,0x9A,0x1B,0xC1,0x5A,0x6C,0xF1,0xC4,0x7A,0xBF,0x04,0x1C,0xE3,0x8A, + + 0xE8,0x0B,0xB4,0xED,0x1E,0x96,0x77,0xEC,0x6D,0x35,0x00,0x8F,0x20,0xC9,0xEB,0x9B, + + 0xC3,0xC9,0x3B,0xD8,0xAE,0x8A,0xC0,0x44,0x42,0x1D,0xE9,0xC5,0x26,0x34,0x52,0xA2, + + 0x58,0x8A,0xBB,0xF1,0xBB,0x73,0x09,0x4D,0xEF,0x73,0x4A,0x9D,0x6C,0xFC,0x5A,0xB2, + + 0x6F,0x8B,0x21,0x38,0xEC,0xBD,0xBA,0x97,0xF1,0x8C,0xBA,0x92,0xE3,0xAC,0xC9,0x0F, + + 0x88,0xCC,0xE2,0x29,0x61,0xB5,0xC4,0x52,0x3A,0x5F,0x4B,0x9C,0xE4,0x95,0xC1,0xF8, + + 0x89,0x0D,0x53,0xA4,0xBB,0xF3,0xCC,0x46,0x3B,0x1E,0xA1,0x7D,0x6C,0x72,0x32,0x06, + + 0x22,0x2C,0x33,0x0E,0x91,0x16,0xA4,0xBC,0x14,0x24,0x74,0x33,0x5E,0x7D,0x68,0x0A, + + 0x45,0xC5,0x68,0x72,0xB8,0xAA,0xAB,0x36,0x48,0x90,0x8F,0x32,0x77,0x4A,0xE5,0x03, + + 0x86,0xD0,0x36,0xC7,0xB8,0xF0,0x22,0xB9,0x90,0x66,0x68,0x27,0xF2,0xD0,0xED,0x17, + + 0x78,0xD1,0xBC,0xF1,0x7F,0x42,0x2D,0x9B,0xB0,0x91,0x0E,0x9B,0x09,0x82,0xD3,0xDC, + + 0x16,0x60,0x1F,0xBD,0xAC,0x0B,0x74,0x1C,0x55,0x4E,0x5D,0xCC,0x70,0xE6,0x54,0x28, + + 0x8B,0x98,0x91,0x3C,0x13,0xB3,0x66,0xF0,0x8C,0xDA,0x6C,0x85,0x2B,0x53,0x70,0x41, + + 0x63,0x63,0xDE,0x4D,0x45,0x3B,0xD9,0x85,0x38,0x0B,0xC2,0x65,0x63,0xA1,0x12,0x57, + + 0xD3,0x00,0x44,0xFD,0x16,0x28,0x3C,0x95,0x86,0xD3,0xEC,0x04,0xAB,0xB6,0x66,0xD9, + + 0x64,0xBB,0xE7,0xE8,0xF6,0x69,0xF6,0x02,0x5F,0xD9,0x76,0x2A,0x86,0xF0,0x76,0x34, + + 0xAF,0x55,0x76,0x1C,0xAC,0xAC,0xFD,0x3E,0x63,0x80,0xBA,0xDE,0x7E,0x54,0x19,0x2A, + + 0xCD,0x4A,0xEF,0x8A,0xBA,0xD8,0xF7,0x2E,0xD9,0xC1,0x7D,0xDC,0xCF,0x73,0x9E,0x6B, + + 0xF7,0x94,0x6F,0xA3,0x41,0x6F,0x66,0x8B,0xEB,0xB9,0xE2,0x78,0x3F,0x9B,0xCA,0xB9, + + 0x16,0x1A,0x52,0xAC,0xC5,0xD9,0x10,0x08,0x4A,0xD1,0xC8,0x9F,0x1E,0x23,0x6A,0x1A, + + 0x33,0xF1,0x7E,0x36,0x20,0xF0,0xCA,0x98,0x98,0xB8,0x19,0xDA,0xFD,0xF5,0x1D,0xB8, + + 0x9E,0x18,0xDF,0x31,0x12,0xB3,0x0C,0xCC,0x4F,0x61,0x08,0x9C,0xCA,0x92,0x51,0xF6, + + 0x6D,0x10,0x14,0xD7,0x1A,0x40,0x47,0x04,0x4A,0xA0,0x43,0x80,0x5C,0xBE,0x59,0xA1, + + 0x73,0x00,0x51,0x35,0x32,0x62,0x2E,0xC9,0x02,0xFF,0x50,0xA4,0x72,0x0E,0xD1,0x34, + + 0x3A,0x0E,0xF2,0x74,0x51,0xD5,0xFF,0x70,0x55,0xEC,0x1C,0x27,0x73,0xC2,0x5E,0x01, + + 0xBF,0xFD,0xC5,0xD9,0x31,0xDD,0x6F,0x91,0x35,0x2C,0x76,0x5F,0x06,0x6A,0xD2,0x11, + + 0xFE,0xC3,0xDF,0x17,0xD9,0x8E,0x42,0x83,0xC9,0xE3,0x9F,0x95,0x51,0xBD,0x29,0xAB, + + 0xBD,0xBF,0x7F,0x1F,0xC3,0xF9,0x42,0x02,0xB5,0x21,0x9E,0x86,0xFE,0x6B,0x48,0xAC, + + 0xA0,0x47,0xF3,0xB6,0xBF,0x98,0xC8,0x12,0xB0,0x20,0x6C,0x07,0x71,0x6A,0x01,0xB9, + + 0x3E,0xFD,0xEA,0xC1,0xEE,0x56,0x69,0x9E,0x40,0x42,0x65,0x95,0x66,0x69,0x4D,0x7B, + + 0x85,0xF6,0xB1,0x44,0xEF,0x8A,0x61,0x0C,0xE0,0x07,0x6D,0x06,0xF9,0x68,0xC2,0x99, + + 0x8C,0xA3,0xDF,0x9C,0xF3,0x8B,0x72,0x7E,0x7E,0x4C,0xAC,0xC5,0x1A,0xC7,0x10,0x36, + + 0x28,0x2B,0xDE,0x9E,0xDC,0x7A,0x9A,0x2C,0xCB,0x85,0xBA,0x25,0x26,0x49,0xDD,0xF6, + + 0x61,0xF1,0xA3,0x99,0x79,0x85,0x12,0x5A,0xBB,0xCD,0x41,0xDC,0xB7,0xAA,0x35,0xE4, + + 0xE8,0x7C,0xB3,0xEE,0xBF,0x4E,0xCE,0x5B,0x22,0xC8,0xBB,0x39,0x38,0x94,0xC7,0x2A, + + 0xF5,0x69,0x55,0xAC,0x1E,0x8C,0x69,0x14,0x6B,0x0C,0x66,0x1F,0x78,0x63,0xB0,0x50, + + 0xF6,0xC2,0x5D,0x62,0x60,0x2D,0x85,0x58,0x3C,0x49,0x4A,0x0E,0xD9,0x31,0x7B,0xA1, + + 0x44,0xF2,0x50,0x4F,0x43,0x6C,0x4F,0xE2,0xB1,0xAE,0x67,0x1E,0xF0,0x61,0x75,0x64, + + 0xEB,0x4F,0x90,0x1F,0xE4,0x2D,0x9B,0x80,0x03,0xB2,0xE8,0x9F,0x77,0x60,0xC4,0x09, + + 0x3E,0x13,0x56,0xE6,0xCF,0x9D,0x53,0xC6,0x9F,0x56,0x6B,0x55,0xD3,0xF0,0x04,0x30, + + 0xD1,0xCB,0x49,0xE7,0x1F,0x73,0x83,0x50,0x2D,0x85,0x8C,0x30,0x73,0x71,0x37,0x3D, + + 0x8A,0xC4,0xD5,0xC2,0x6E,0x38,0xBF,0x0D,0x41,0x8D,0xAB,0x05,0x10,0xF3,0x5D,0xE0, + + 0x8C,0x30,0xCD,0x89,0x4E,0x9E,0x49,0x40,0xC3,0x73,0x62,0xC6,0xD3,0x31,0x73,0xB5, + + 0xD2,0xDD,0x7C,0x2B,0x49,0xD4,0x3C,0xAE,0x83,0x6B,0x1C,0xE4,0x19,0x1E,0x5B,0xCE, + + 0x53,0xA1,0x0C,0x21,0xCD,0x2E,0x34,0x92,0x94,0x17,0x82,0x25,0x73,0xF8,0x85,0x2D, + + 0x4B,0xE2,0x1A,0x4F,0xC5,0xB2,0x2C,0x23,0x43,0xA9,0xD5,0x14,0xB1,0x76,0xD8,0xCB, + + 0x97,0xCA,0xE2,0xB3,0x04,0x27,0x9B,0x4B,0x37,0x54,0x20,0x0E,0x0C,0x35,0x52,0xF9, + + 0x02,0xCE,0xD6,0x08,0x3A,0x71,0x36,0x25,0x5B,0x19,0xD6,0x07,0x30,0x7B,0x5A,0x16, + + 0x54,0x1A,0x69,0xE6,0xEF,0x33,0x20,0x44,0x8B,0x39,0x74,0x98,0x4A,0xC5,0x9D,0x29, + + 0x56,0xA3,0x47,0x0D,0x9A,0x56,0xAF,0xD5,0xCB,0x58,0xA9,0x0D,0x1A,0xBA,0x3C,0x6D, + + 0x83,0xD9,0x0B,0x8E,0x9B,0x58,0x9A,0x3B,0x2C,0x28,0x27,0x4E,0x8D,0x6B,0x6E,0xAA, + + 0xD7,0x10,0x7E,0x23,0x41,0x3E,0xF1,0x49,0xE5,0xF1,0x08,0x89,0xD2,0x1D,0x74,0x33, + + 0x98,0x13,0x15,0xCE,0x3D,0x26,0x0E,0x88,0xEB,0xDB,0x5E,0xFF,0x88,0xD0,0x7F,0x4D, + + 0xD6,0x6A,0x9C,0xE2,0xC5,0x28,0x03,0x7B,0x15,0xF3,0x8E,0x61,0x5F,0x77,0x77,0x26, + + 0x28,0x12,0xBD,0xAE,0x91,0xEA,0x7F,0xB9,0xD9,0xD2,0x40,0x8D,0xF3,0x76,0x38,0x0F, + + 0xED,0x7B,0x98,0xF5,0x3A,0xC5,0x17,0x93,0x6C,0x51,0x70,0x17,0xFB,0x4B,0x16,0xEF, + + 0xE7,0xD6,0xF5,0x86,0xFE,0x02,0x92,0x83,0xC5,0x01,0x66,0xC4,0x74,0x50,0x3B,0x2C, + + 0xA5,0x22,0x99,0xF4,0xF6,0x0F,0x0B,0xD0,0xEE,0xC4,0x6F,0x33,0xF0,0x4F,0x69,0x61, + + 0x6E,0xA0,0xF7,0xE2,0xDD,0x82,0x03,0xC0,0xEF,0xC5,0x83,0xC4,0xF7,0x68,0x1F,0x30, + + 0x6C,0x55,0x3B,0x69,0x10,0x4F,0x68,0x66,0x6F,0xF2,0x44,0x84,0xFA,0xEB,0xDD,0xD6, + + 0x30,0x28,0xC7,0x30,0xFC,0x46,0x07,0x88,0xFB,0x74,0x02,0x30,0x59,0xA4,0x1A,0xBE, + + 0x84,0x5D,0xE3,0x7C,0xBC,0xBD,0x4B,0x9E,0x46,0x19,0xA8,0xF0,0x31,0xF6,0xD6,0x0F, + + 0xA6,0xC7,0xE8,0x31,0x7C,0xB4,0xC8,0x4B,0x7F,0xB6,0xD1,0x15,0x56,0xE8,0x1C,0xE3, + + 0x4E,0x27,0x14,0x7C,0xF7,0x8B,0x98,0x86,0xED,0x67,0xE6,0x1F,0x7E,0xF7,0xEA,0xEE, + + 0x55,0xA8,0xD4,0xBA,0xF6,0xCA,0x44,0x9F,0x26,0x22,0xFF,0x41,0x5B,0xEB,0xF3,0xFA, + + 0xE3,0xCA,0xC3,0x59,0xF6,0xA7,0xE3,0x58,0xF7,0x48,0x09,0xD0,0x3F,0xE3,0x9D,0x9F, + + 0x83,0x46,0xD5,0xBF,0x1F,0x67,0xBF,0x1A,0x21,0xD0,0x77,0xBB,0xDF,0x09,0x7E,0xC1, + + 0x83,0x97,0x3F,0xC4,0x29,0x28,0x43,0x46,0x48,0x2E,0xDA,0x69,0xDF,0xA8,0x62,0x5E, + + 0x88,0xEF,0x2A,0xAF,0xBB,0xB6,0xC5,0x38,0xEE,0xCB,0xBA,0xDE,0x0F,0xFF,0x85,0x3D, + + 0x4C,0xAE,0x3C,0xCF,0xE9,0xDB,0x27,0x15,0x4F,0xC3,0xDB,0xAD,0xB5,0xE0,0xB0,0x58, + + 0xF0,0x83,0xC4,0x39,0x28,0xBF,0x5B,0x5F,0xC9,0x3E,0xA5,0xBE,0xDF,0x44,0xFA,0x82, + + 0x24,0xB3,0xA2,0x26,0xB4,0xEE,0x0C,0x51,0x4E,0x7B,0x0C,0x55,0x08,0x7D,0x52,0x36, + + 0xA7,0x5D,0xD2,0x26,0xDE,0x12,0x06,0x41,0x4F,0x7E,0x82,0x8B,0x1D,0xFC,0x93,0xF1, + + 0x4F,0xB1,0xC5,0xD1,0xD2,0xBF,0x65,0xA7,0x64,0x72,0xCB,0x07,0x1F,0xD1,0x7B,0xF1, + + 0x5A,0x95,0xD3,0x37,0x5C,0xB0,0x6D,0x37,0xEF,0x39,0x42,0xC4,0x81,0x90,0x9F,0x46, + + 0x68,0x03,0xB4,0x2E,0x7A,0xD8,0x0A,0xDE,0x8D,0x25,0x74,0xE5,0xB4,0xEF,0x4B,0xFF, + + 0xF7,0xC4,0x85,0x3D,0xCC,0x29,0x1A,0xCF,0x75,0x98,0x4B,0x13,0x71,0x0E,0xC2,0xFA, + + 0x72,0x07,0x31,0x99,0x98,0x6A,0x99,0x0B,0x33,0x9B,0x52,0x91,0xD5,0x74,0x0D,0xD1, + + 0x87,0x9A,0x56,0x8D,0xB1,0x46,0x1B,0xCF,0xE4,0x97,0xE8,0x1F,0xBF,0x0A,0x8C,0x26, + + 0x8D,0x47,0x0A,0x1D,0x07,0xB2,0x0E,0x59,0x4A,0x9A,0x4D,0xD1,0x1C,0x9C,0x10,0x62, + + 0x0C,0xD9,0xEE,0x82,0xC2,0x14,0xEA,0x3E,0x67,0x33,0x01,0x56,0x31,0x25,0x8B,0x14, + + 0xAF,0x5A,0x62,0xFC,0xD6,0xF8,0x73,0x7E,0x4D,0x75,0x48,0xDD,0x8A,0x25,0x8C,0x3F, + + 0x71,0xF8,0xFF,0x1B,0xBF,0xF2,0x07,0x48,0x8F,0x50,0x13,0x3A,0x28,0x99,0x9D,0xED, + + 0x8F,0x15,0x55,0x33,0x3C,0x67,0x6A,0x02,0x68,0x2D,0x0E,0xD1,0x1D,0xBE,0x74,0xF4, + + 0x0E,0xDD,0x8E,0x90,0xCF,0x36,0xCD,0x5A,0x93,0xFE,0x41,0x18,0xFF,0xBF,0x29,0x2B, + + 0xA2,0x43,0x52,0x4B,0xD1,0x3E,0xF2,0x6F,0x92,0xD0,0x2C,0xBF,0xCD,0x1E,0x73,0x50, + + 0x2D,0x9B,0x5E,0x3D,0x13,0x34,0xBF,0xC6,0x91,0x63,0x48,0x0F,0xF9,0x04,0x15,0xE8, + + 0x4C,0xFD,0x44,0x62,0xEF,0x3B,0xEB,0x1B,0x29,0xDB,0x09,0xD4,0xD0,0x7F,0xD3,0x40, + + 0x32,0xA1,0xC0,0x0D,0x17,0xFA,0x41,0x3C,0xB4,0x0E,0xD0,0x30,0xD8,0xB5,0xF9,0x3E, + + 0xAF,0x40,0x40,0x63,0x1D,0xD4,0x11,0xA5,0x8A,0x9F,0xAA,0x55,0x50,0x74,0xB6,0xF7, + + 0x87,0xC8,0x22,0x91,0xF4,0x63,0x18,0x4E,0x66,0xE8,0xA7,0x44,0x93,0xCA,0x38,0xA8, + + 0x7B,0x99,0xC4,0x04,0x58,0x89,0x52,0x51,0x76,0xEB,0x37,0x24,0x2E,0x7F,0x72,0xB8, + + 0xD5,0xCA,0x08,0x2C,0xDE,0x67,0x97,0x37,0x81,0xE5,0x5A,0x9C,0x5F,0x2A,0xB9,0x49, + + 0x7B,0x49,0x57,0x74,0xB9,0xD9,0xC0,0x70,0x9D,0xEB,0xF3,0x13,0xF1,0xE6,0xFE,0x69, + + 0x77,0x76,0x96,0x9E,0x72,0x3C,0x11,0xF5,0x8B,0x76,0x80,0x67,0x97,0xAA,0x0A,0x2E, + + 0x02,0x85,0xDB,0x80,0xBD,0xA8,0x1D,0x28,0xC8,0x98,0x87,0x4C,0x08,0xE3,0xF5,0xF0, + + 0xD5,0xC4,0x4B,0x6E,0xBE,0x67,0x42,0x29,0x22,0xF1,0x5A,0x59,0xB3,0x61,0xD7,0xE1, + + 0x52,0xC2,0x7B,0x0F,0x80,0x31,0x2D,0x54,0xA1,0x41,0x53,0xA9,0xF5,0x1F,0xF0,0x4B, + + 0xA7,0x68,0x0F,0x99,0xA2,0x15,0x9F,0x3B,0xC5,0xE0,0x1B,0x7E,0x0D,0xC6,0x82,0xB1, + + 0xF6,0x4E,0x84,0xAA,0x9A,0xAC,0x54,0x50,0xA3,0xDD,0x7E,0xFE,0x1A,0x64,0xF2,0xA6, + + 0x1B,0x40,0x93,0xC4,0xBE,0xD2,0x5C,0x55,0xE3,0xB7,0xE2,0xAC,0x79,0x92,0xD3,0xA7, + + 0xB9,0xB7,0xF9,0xA5,0x92,0x61,0x4B,0x6D,0x62,0xB4,0x94,0xEF,0x5A,0xD5,0xB4,0x05, + + 0xAA,0xD6,0x92,0xCC,0x3E,0xAF,0x5D,0x51,0x63,0x5C,0x2C,0xFD,0x97,0xC2,0x1F,0x62, + + 0xC0,0xB4,0xB4,0x74,0xB6,0x91,0x5A,0x9B,0x39,0x12,0x82,0xC6,0x8F,0xDD,0x55,0x98, + + 0xC8,0x1E,0xDE,0xBA,0xDA,0x55,0x90,0xC3,0x1C,0x3F,0x1F,0x30,0x5C,0x04,0x1B,0x63, + + 0x40,0xED,0x94,0x76,0x34,0xBF,0xCB,0xC4,0xE6,0xE9,0x00,0x00,0x07,0xF9,0xF5,0x99, + + 0x5C,0x5C,0xB5,0x75,0xB5,0x1F,0x7B,0x51,0xE0,0x39,0x5D,0xD0,0x1B,0x7B,0x1E,0x25, + + 0x4A,0xEE,0xA6,0xC0,0x33,0x04,0x2E,0x80,0x6E,0xF0,0x8D,0xE5,0xD7,0x7F,0xE0,0xAF, + + 0xE1,0xEA,0xCE,0xA6,0x00,0xB1,0xE6,0x01,0xC0,0xA5,0x84,0x70,0x75,0x6E,0x3C,0x31, + + 0x5D,0x59,0x7A,0x57,0x45,0x3C,0xC7,0xD4,0xD1,0x02,0x13,0x0D,0x32,0xBB,0xF6,0xA1, + + 0x23,0x91,0x37,0x3D,0xE7,0x9A,0x6F,0x19,0x73,0x96,0xCA,0xEA,0x97,0x6C,0xB3,0x78, + + 0x1B,0xEC,0xE5,0xFF,0x08,0x9C,0xD6,0x54,0xE6,0xF3,0x16,0xEF,0xAC,0xD5,0xD2,0x70, + + 0xA1,0xD4,0xF6,0xB1,0xD2,0xA8,0xF6,0xBD,0x21,0xC0,0xA0,0x84,0xB3,0xD0,0xBD,0x69, + + 0xAC,0x6F,0x99,0x6F,0x58,0x9E,0x88,0xA9,0x6F,0xAA,0x86,0xCD,0xBA,0x16,0x1D,0x66, + + 0x56,0x96,0xB5,0x6E,0x81,0x96,0x21,0xC1,0x64,0x40,0x60,0xCE,0xC5,0xFD,0x66,0x08, + + 0x36,0x07,0x50,0x2A,0x51,0x33,0xA9,0x6C,0x0D,0xD2,0xF0,0x9A,0x13,0xBD,0x92,0xE9, + + 0x74,0x02,0x97,0xD2,0x5E,0x34,0xD9,0x9E,0x94,0xF0,0xE4,0x14,0x77,0x32,0xDC,0xAF, + + 0x55,0x95,0x40,0xDF,0x51,0xFF,0xEC,0x1A,0xD2,0x45,0xCF,0xF9,0x1E,0xBF,0xF0,0x3F, + + 0x42,0xE5,0x0B,0xAE,0xDF,0x24,0x4E,0xBE,0x35,0x55,0xE1,0x30,0xDA,0x4F,0x6A,0x40, + + 0x59,0x08,0x60,0xDB,0x65,0xAE,0x3F,0x23,0xAD,0x39,0xAA,0xB6,0x3D,0xF1,0x9F,0xF2, + + 0x03,0x7A,0x0C,0xD4,0xB6,0xAF,0xCC,0x40,0x6B,0xBE,0x86,0x0E,0x3D,0x48,0x71,0xEC, + + 0x7C,0x2B,0xC9,0xC5,0x10,0xAC,0x73,0xDC,0x60,0x02,0xA9,0xB7,0xA3,0xE2,0x6D,0xFB, + + 0xCD,0xCE,0x91,0xB3,0x74,0x0C,0x67,0xF2,0xC5,0xD8,0x46,0x49,0xBF,0x92,0x5E,0x23, + + 0x6F,0x8D,0x18,0x81,0xC8,0xAE,0xE0,0x93,0x76,0x3B,0x3D,0x06,0x5A,0x26,0xF4,0xC1, + + 0x22,0xEB,0x10,0xD2,0x62,0x3F,0xA5,0x5A,0x3C,0xE7,0xDA,0x80,0xBE,0x04,0x39,0x4F, + + 0x0B,0x2B,0x61,0x24,0x17,0x2B,0x28,0x70,0x23,0x39,0xD1,0x7F,0x37,0xFD,0x0B,0x43, + + 0x84,0x5D,0x4E,0x7F,0x43,0x46,0xB9,0x2F,0x11,0x33,0xEF,0x96,0x28,0xA5,0xDD,0xE2, + + 0x40,0xC5,0x33,0xFD,0x43,0xB3,0x33,0x4C,0xA7,0x82,0x72,0x4B,0xF4,0xAA,0x9F,0x6B, + + 0x0B,0x72,0x94,0x36,0x90,0x0F,0x63,0x36,0xE8,0x66,0x96,0x20,0xB4,0xD8,0x5C,0xFA, + + 0x87,0x8A,0xAC,0xE9,0x77,0xBB,0x32,0x4D,0x27,0xA0,0x2F,0x9C,0xDD,0xAA,0x6C,0x68, + + 0xAE,0x2F,0xB1,0x5F,0x99,0x87,0x71,0x33,0x68,0x64,0xA3,0xAE,0x34,0x7A,0xCE,0x39, + + 0x27,0x2A,0xD8,0xB1,0x2D,0x28,0xE4,0x82,0xDA,0x01,0xE9,0x39,0xDC,0x40,0x62,0x4E, + + 0xE6,0xE4,0x69,0x38,0x92,0x0B,0x05,0xFE,0x1A,0x1B,0xEB,0xB9,0x81,0xE5,0x7B,0x8C, + + 0x4C,0x0E,0x59,0x2F,0xD2,0xB5,0x8C,0x86,0xFE,0x43,0x06,0x0D,0x21,0x43,0x75,0x3F, + + 0xAE,0x57,0x7D,0xA0,0x62,0xC1,0xDC,0x4F,0x26,0x0E,0x7F,0xFB,0xE8,0x64,0x76,0x7D, + + 0xD3,0x25,0xB1,0xC1,0xFE,0x19,0x10,0x34,0x65,0x23,0xB4,0x22,0x59,0xD5,0x6A,0xEC, + + 0xD8,0xE0,0x6C,0xE6,0x71,0xBC,0x1B,0xA6,0x47,0x81,0x3C,0xF5,0xA1,0xB3,0x7D,0x7B, + + 0xA4,0xD0,0xAD,0x83,0x3D,0x24,0x6B,0xDB,0xE4,0xC9,0x75,0xC2,0x1E,0xFA,0x52,0xE9, + + 0xD3,0x0C,0xB5,0x93,0x3C,0x67,0xEF,0x13,0xE5,0xB0,0xA7,0xA3,0x96,0xD3,0x72,0xA0, + + 0x46,0x9D,0xC2,0xB2,0x17,0x24,0xF4,0xFD,0x56,0x79,0xAD,0xD4,0xD3,0x0B,0x6D,0xA1, + + 0x57,0xDA,0xB5,0xC5,0xD3,0x74,0xAB,0xB5,0xAD,0xC4,0x04,0x74,0xBE,0xBA,0x1C,0xB0, + + 0x9A,0xD9,0xBC,0xD5,0xD1,0x96,0x60,0x66,0xE8,0x5C,0xAC,0xE2,0x53,0x07,0x34,0xB3, + + 0xA1,0x85,0xD7,0x3F,0xBB,0xF8,0x75,0xC7,0xE1,0x9E,0xC5,0x08,0xC4,0x97,0x18,0xF2, + + 0x44,0x95,0x98,0xB6,0x54,0xB5,0x6F,0x26,0x0F,0xF8,0xCE,0xBD,0x44,0xF1,0xD1,0xDD, + + 0xD4,0x6F,0x32,0xA9,0xCE,0xDC,0xE0,0xC1,0xED,0x38,0xAF,0xDA,0xB5,0xE8,0x01,0x6B, + + 0x0F,0x1F,0x58,0xFC,0x80,0xF8,0xCF,0xED,0xE0,0x98,0x91,0x86,0xD5,0x5E,0xD0,0xE1, + + 0x67,0x94,0x97,0x64,0x30,0x1D,0xFF,0x4E,0x14,0xC0,0x23,0x3D,0x30,0x66,0x40,0x3A, + + 0xBE,0x3D,0xBF,0x43,0x9B,0x1D,0x0E,0x19,0x0A,0x71,0x4E,0xA9,0xA0,0xF4,0x3C,0x90, + + 0xC4,0xF9,0xFF,0x1E,0x3B,0x46,0x36,0x66,0x5C,0xFD,0xA1,0x35,0x5B,0xFD,0xF6,0x38, + + 0x2A,0x13,0xF6,0x30,0x33,0x18,0xE1,0xAC,0x24,0x1F,0xF1,0x9D,0x59,0xBC,0xAF,0x53, + + 0x57,0x14,0x10,0xAC,0x87,0xD1,0xC7,0xEB,0x48,0x59,0xFF,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x3C,0xAF,0x2B,0xA1,0xC5,0x3E,0xEF,0xA2,0x85,0xC9,0xEE,0x95,0xB1,0xCF,0x36,0xF9, + + 0x8C,0x87,0xA3,0x24,0x31,0x8E,0x0D,0xC3,0x75,0xB4,0xFE,0x94,0x52,0xC9,0x16,0xF0, + + 0xFF,0xFD,0xFC,0xFE,0x41,0xFF,0x69,0xD2,0xFC,0xED,0xC5,0x56,0xFA,0x0E,0x8D,0xD1, + + 0x8D,0xF8,0x29,0xE5,0x53,0xB0,0x88,0xC1,0x59,0xB2,0xA7,0x94,0xD7,0x61,0xF7,0xE5, + + 0x71,0x04,0x6C,0xDB,0x13,0x64,0x36,0xC8,0xB5,0xC9,0x10,0xE4,0xCC,0x26,0x48,0x97, + + 0xEA,0xA6,0x01,0xD0,0x11,0x71,0x98,0xF0,0x2C,0xE8,0x28,0x34,0x13,0x9E,0x1E,0x55, + + 0x84,0xC4,0xE5,0x50,0x94,0xA4,0x2A,0x9A,0xFD,0xB9,0x15,0x43,0xD4,0x44,0xAE,0x22, + + 0xE1,0xD1,0x09,0xD0,0xBE,0xD8,0x0B,0x36,0xCD,0x98,0xDD,0x77,0xD7,0x9C,0x02,0x2C, + + 0x0E,0xB2,0x42,0x88,0x29,0x57,0x6C,0x2E,0xA9,0xCB,0x5E,0xA8,0x5A,0x8A,0x74,0x34, + + 0xF5,0x58,0x75,0x6F,0x21,0x4A,0x62,0xBC,0x7D,0x86,0x21,0xAF,0x3F,0x63,0x2A,0x7B, + + 0x63,0x3B,0xBD,0x21,0xF0,0x27,0xB9,0xDA,0x44,0xC7,0x6C,0x6A,0x12,0x89,0x51,0x49, + + 0xF5,0x49,0x70,0xED,0x29,0xDA,0xBC,0x11,0x4B,0x87,0x99,0x23,0xBF,0x9F,0x0A,0xC1, + + 0x87,0xA1,0x71,0xAE,0x1C,0x57,0x6C,0xD9,0x4C,0x0E,0xD2,0x73,0x64,0x2E,0x9A,0xCB, + + 0x69,0x07,0x9D,0xD8,0x15,0x68,0x72,0x1A,0xBF,0xCE,0x6A,0xF8,0x55,0x04,0x97,0xDA, + + 0xE0,0xA3,0x36,0x53,0xE8,0xDA,0xA9,0x2B,0x6B,0xB3,0x93,0xE2,0xDC,0x0C,0x4A,0x4A, + + 0xE9,0x4C,0x0B,0xDD,0x0F,0x6D,0xEC,0xC8,0xCD,0x6D,0xC4,0x9D,0xD7,0xC2,0x64,0xD6, + + 0x21,0x52,0x44,0x01,0x3F,0x90,0x07,0x24,0x6A,0xBE,0x78,0xDB,0xBA,0xD3,0xCC,0x15, + + 0x52,0x0A,0xBE,0x85,0x09,0x35,0x7B,0x70,0x65,0xA5,0x9E,0xAA,0x13,0x85,0x47,0xBD, + + 0x93,0x93,0x14,0xF6,0x84,0x39,0x2D,0x5A,0x15,0x3E,0x2E,0x36,0x92,0x7A,0x1C,0x13, + + 0x64,0x74,0xBD,0xE6,0x8D,0x5F,0x0E,0xC2,0xDD,0xD4,0xCB,0xA4,0xDB,0x77,0x22,0x75, + + 0xDD,0xC9,0x84,0x4B,0x34,0xB6,0x2A,0x0D,0x89,0x0F,0x0F,0x97,0x05,0xF3,0x37,0x2B, + + 0x1C,0xEA,0xD3,0x34,0x3F,0x98,0x9C,0x74,0xA4,0x5D,0xFC,0xD4,0x9A,0xAE,0x23,0x75, + + 0x55,0x9B,0x0C,0x41,0xBC,0x5F,0x2B,0x19,0x09,0x65,0xD1,0xF5,0xC1,0x37,0x8D,0x51, + + 0xCC,0xBA,0xB5,0xAD,0x90,0x57,0xD9,0x00,0xD9,0x77,0xAF,0xF1,0xA5,0x6C,0xC6,0x18, + + 0x5C,0x5A,0xE4,0x8D,0x39,0x08,0x12,0xAD,0xA0,0x09,0xE4,0xEB,0x91,0x1B,0x16,0x8C, + + 0x2F,0xA1,0x81,0x3B,0xC5,0x28,0x8F,0x58,0x6D,0xF9,0xA0,0x18,0xB3,0xBA,0x49,0xBA, + + 0x55,0x95,0xA1,0xB5,0xC7,0x78,0x04,0xB8,0xDC,0xF7,0xF1,0x18,0x13,0x19,0xFB,0x64, + + 0xA1,0x5A,0x1F,0x6C,0xDE,0xC4,0x0A,0xFE,0x2B,0x5A,0xE1,0x19,0x74,0xD6,0x96,0x8F, + + 0x24,0xC3,0xE0,0x65,0x04,0x91,0x6C,0x1B,0x5C,0x1E,0x44,0xEE,0x34,0xD1,0xB4,0x9A, + + 0x8A,0xE0,0x58,0xE2,0x49,0xC8,0xB4,0xB8,0x67,0xF6,0xD8,0x11,0x92,0x06,0x79,0x6C, + + 0xAC,0x5C,0x92,0xBC,0x84,0x37,0x93,0xCF,0xEC,0x1C,0x06,0x5F,0xF2,0xDC,0x67,0xBB, + + 0x5F,0x5C,0x98,0x59,0xF9,0x16,0x8E,0xF8,0x9C,0x93,0xAD,0xFC,0xBB,0x64,0x64,0x92, + + 0xE5,0x8F,0xDE,0x00,0x77,0xBC,0x2A,0x40,0x65,0xE3,0x66,0xE1,0xA9,0x46,0x6C,0xC5, + + 0x66,0x7E,0xD0,0x31,0xA8,0xAE,0x20,0x1F,0x0D,0xB0,0xB0,0x26,0x81,0xA2,0x7B,0x76, + + 0xF8,0xC0,0x72,0xF4,0x18,0xFF,0x0F,0x0B,0xA5,0x3F,0x65,0x59,0x1E,0xA1,0x51,0x02, + + 0xB1,0x2E,0xF3,0x33,0xED,0x0C,0x07,0x1E,0x4A,0x45,0x1E,0x92,0x3C,0xC0,0x46,0xF3, + + 0x28,0x80,0x24,0x23,0xE9,0x71,0x7F,0xA0,0xE7,0x3B,0x88,0x1E,0x75,0x84,0x4E,0xF7, + + 0x6D,0x08,0x4B,0xEA,0xCB,0x56,0xBE,0xC8,0xAE,0xE6,0x29,0x07,0x69,0xEC,0xE3,0x50, + + 0xA0,0x05,0x99,0xC3,0xA9,0xD1,0x19,0x01,0x31,0x84,0xD7,0xCB,0xE8,0x4B,0x17,0xF2, + + 0x6E,0xA4,0x29,0xD7,0x09,0xE5,0xB9,0xF3,0xE2,0x85,0x33,0x49,0xA1,0x12,0xB3,0xEA, + + 0x08,0x28,0x02,0xFE,0xDE,0x3B,0x36,0x6A,0x5A,0x3D,0x72,0xAE,0x08,0x17,0x3F,0xFA, + + 0xD2,0xCB,0xF0,0x34,0x61,0x06,0xFA,0xBB,0x82,0xC4,0xDC,0x96,0x5E,0x69,0x36,0x7B, + + 0xAC,0x22,0x63,0x8F,0xBE,0x15,0xA2,0xDB,0xA1,0x3B,0x1F,0xBC,0xE6,0x37,0xEF,0xF7, + + 0xBE,0x79,0x0B,0xEF,0x04,0x78,0xC0,0xCB,0xA0,0x6A,0x18,0x97,0x01,0xD8,0xCE,0xD9, + + 0x2C,0x84,0xA0,0x82,0x18,0x8E,0x32,0x39,0x06,0xEF,0x25,0xEA,0x1C,0xC5,0x3E,0xDE, + + 0x0D,0xE7,0xEE,0x5C,0x1B,0x56,0x2A,0x74,0x65,0xF9,0xA9,0x3E,0x4E,0x40,0xE3,0x0A, + + 0x68,0x23,0x13,0x0F,0xDE,0x55,0x7F,0x57,0xEA,0xBA,0x95,0xD6,0x2B,0x48,0xAB,0xDB, + + 0xC1,0xE3,0xEB,0x40,0xA1,0xED,0xAB,0x09,0x24,0x14,0x2A,0x9F,0x9D,0x4F,0xE4,0xEB, + + 0x58,0x9A,0xFA,0x7B,0xCB,0x4B,0x0A,0x8B,0xA6,0xD0,0xE2,0x35,0x4E,0x5F,0xEC,0x2B, + + 0x22,0x64,0x6C,0x12,0x6D,0x65,0x06,0x41,0x5D,0x7E,0xED,0x45,0x17,0x2E,0xA1,0x7E, + + 0x5B,0xD3,0x5A,0xA3,0x68,0xB1,0x3D,0x90,0x61,0xE3,0xE3,0xD4,0x96,0x54,0x70,0x17, + + 0x9F,0x5A,0x7D,0x64,0x9B,0x67,0xAC,0xF4,0x0C,0x82,0x0A,0x06,0x86,0xF3,0xD3,0x67, + + 0x20,0xB6,0x82,0x7B,0xC3,0x12,0xAB,0x4E,0x59,0x14,0xB3,0xE4,0x3A,0x59,0x04,0xB0, + + 0xD0,0xD7,0x39,0x7F,0xDE,0xEE,0xC5,0x0E,0xA2,0x2E,0xA5,0xD3,0x9E,0xE6,0x6A,0x01, + + 0x07,0x69,0x36,0x87,0xAC,0x12,0x2A,0x1C,0xE0,0x0D,0x28,0x55,0xF2,0x56,0xAB,0x69, + + 0x4E,0xB4,0x8F,0xC6,0xB4,0x67,0x2B,0x1E,0xAF,0x6C,0x05,0xE4,0xC9,0xA4,0xE6,0x0B, + + 0x1F,0xDA,0x74,0x7D,0x52,0xBE,0x50,0x43,0x85,0xE9,0xE9,0xBA,0x7A,0x3A,0x01,0xE8, + + 0xC6,0x48,0x1A,0xFC,0xE9,0xAA,0x00,0x96,0x99,0xE8,0x59,0xCD,0x5B,0x2F,0xF6,0x3C, + + 0xAA,0x83,0x8A,0xA5,0x1D,0x65,0x55,0xAB,0xEF,0x70,0xB7,0x68,0x15,0x99,0x51,0xA6, + + 0xC6,0x0A,0xD1,0x36,0x69,0x38,0x66,0xBF,0x60,0xB8,0xB7,0x2F,0x09,0xB8,0xA6,0x4A, + + 0x21,0xDE,0xBC,0x7F,0x56,0xE7,0x89,0x6E,0x19,0x81,0xF0,0x16,0x97,0x1F,0xAE,0x5A, + + 0x7B,0xF1,0x44,0x2D,0xB3,0x10,0x2F,0xFB,0x86,0x1E,0x7F,0xC1,0x11,0x5D,0x27,0x98, + + 0x47,0xBD,0x99,0xC9,0x5F,0x3D,0x4D,0x18,0x80,0x75,0x5B,0x7D,0xBA,0xF4,0x09,0x72, + + 0x50,0x42,0xBE,0x3D,0xF7,0xE4,0x3D,0x04,0x06,0xCC,0x29,0x7B,0xF5,0x85,0x3E,0xA8, + + 0xA3,0xA0,0x55,0x06,0x32,0x8D,0xD4,0xAE,0x41,0x10,0x65,0x5A,0xD1,0x6D,0xAB,0xB1, + + 0xDD,0x42,0x80,0x0C,0xF8,0xB2,0x1E,0x42,0xAA,0x12,0xD8,0x89,0x57,0x63,0x50,0x40, + + 0x37,0x43,0xD2,0xC2,0x52,0xA2,0xD1,0xA4,0x39,0x4A,0x2E,0x67,0x71,0x20,0x2A,0xB4, + + 0x59,0x80,0x65,0x87,0x85,0x29,0x39,0x0D,0x4C,0x01,0x5F,0xCA,0x24,0x6F,0xFF,0xDB, + + 0xF7,0x92,0x88,0xCD,0x14,0xD5,0x10,0xC0,0x44,0x46,0x43,0x97,0x26,0xC9,0x64,0x4A, + + 0x81,0xC9,0x7B,0x68,0xEF,0xD4,0x50,0x74,0xC6,0x74,0xCF,0x07,0x27,0xC6,0x49,0x51, + + 0x05,0x37,0x06,0xC1,0xEE,0x28,0x6C,0xE5,0xB4,0x40,0x46,0x54,0xAA,0xC9,0xEF,0xD5, + + 0xC1,0x22,0x09,0x68,0xED,0x65,0x07,0x99,0xCF,0x06,0xCA,0x86,0xA3,0xC7,0x38,0xFB, + + 0x32,0xA7,0x84,0xFD,0x26,0x08,0xD6,0xA7,0x49,0x38,0xAA,0x53,0xD9,0x65,0x32,0xE2, + + 0xA5,0x04,0x66,0x8E,0x0D,0x21,0x52,0x29,0x22,0x1A,0x28,0x01,0xB2,0x2D,0xD2,0x8B, + + 0x4D,0xBF,0xA3,0x94,0x71,0xB9,0xFF,0xAD,0xC6,0xF7,0x53,0xAC,0x44,0xE1,0x74,0x9D, + + 0xB6,0x7C,0x88,0x6E,0xEB,0x45,0x19,0x3B,0x93,0x27,0xC1,0x76,0xAF,0x29,0x22,0x1E, + + 0x07,0x01,0x55,0xD1,0xEF,0x23,0x92,0x85,0xF4,0x22,0x43,0x6E,0x98,0xC1,0x0E,0xD3, + + 0x0D,0x0F,0x5B,0x5E,0xBE,0x98,0x3C,0xD8,0x6F,0x01,0xE2,0x86,0xF7,0x60,0x23,0x1F, + + 0x8F,0x4C,0x77,0x32,0x39,0x8E,0xEC,0xFA,0xE0,0x93,0x46,0xE9,0xA6,0xE2,0x14,0xDB, + + 0x4E,0x07,0x5E,0x62,0xB1,0xFA,0x4D,0x91,0xBC,0x02,0xA4,0x07,0x56,0x0D,0xD4,0xFE, + + 0xEA,0x33,0x96,0x81,0xBD,0x96,0x4F,0xA0,0x1B,0xF0,0x31,0x54,0x94,0x81,0x08,0x92, + + 0x2B,0xEC,0x0E,0xE7,0x07,0x90,0xA1,0x2F,0xD4,0x87,0x4F,0x30,0x73,0x72,0x4D,0x90, + + 0xCB,0xF1,0x50,0x76,0x8A,0x36,0xD5,0x30,0x15,0x3E,0xEB,0xA3,0x93,0x6E,0x13,0x35, + + 0x82,0x73,0x58,0x66,0x8B,0xC6,0x55,0x85,0x34,0x0E,0x5D,0x31,0xA1,0x8C,0x7C,0x3F, + + 0xC3,0x8B,0xFA,0x64,0x44,0x9B,0x26,0xCE,0x38,0x52,0xF4,0x0E,0x1B,0xA5,0xC7,0x90, + + 0x27,0x5B,0xF4,0x2B,0xFB,0x16,0xE8,0x92,0x9C,0x53,0xCA,0x54,0x1B,0xD7,0x3A,0x06, + + 0xA4,0x04,0x61,0xA7,0x45,0x53,0xFC,0x47,0x43,0x89,0xB4,0xA5,0xF6,0x38,0x58,0x53, + + 0x66,0x70,0x6D,0xC6,0x91,0x53,0xF4,0x53,0x42,0xC8,0xCD,0x7C,0xF1,0x6C,0xBD,0xF9, + + 0x02,0x13,0xD3,0xA8,0xBD,0x09,0xBD,0xF7,0xD5,0xA4,0x56,0x41,0xC6,0xA5,0x8A,0x69, + + 0x47,0xE6,0x96,0x98,0xB0,0xAD,0xA5,0x3C,0x67,0xA7,0xA6,0x38,0x73,0x0D,0x05,0x7A, + + 0xC6,0x1E,0xB9,0x65,0xD9,0x1A,0x48,0xA5,0xEE,0xF8,0xBF,0xCF,0x05,0x76,0x6F,0xCF, + + 0x55,0x59,0x4F,0x1D,0x0D,0x79,0x21,0x08,0x64,0x39,0xC5,0x8B,0x85,0xD4,0x7E,0x36, + + 0x86,0x11,0x98,0x2E,0x3E,0x91,0xE2,0x8A,0x91,0xA5,0x20,0x68,0x0E,0xC0,0x1A,0x5A, + + 0xEE,0x15,0xF6,0x26,0x97,0x30,0x06,0xEC,0xBB,0x8C,0x32,0x78,0x69,0xA5,0xB8,0xD7, + + 0x88,0xB1,0x56,0x49,0xA0,0xCE,0x0F,0xED,0x1B,0x87,0xD6,0x69,0x8E,0xA1,0x8F,0x5C, + + 0xB2,0x17,0xB0,0x9A,0x46,0x89,0x78,0xC4,0x6B,0x9F,0xD7,0xFC,0xDF,0x11,0x83,0xB3, + + 0xD8,0x43,0xC2,0x8E,0x17,0x00,0xF0,0xA7,0xDA,0xCA,0xF0,0x86,0xAF,0xEE,0x53,0x35, + + 0xA4,0x3E,0x29,0x65,0x67,0xCF,0x70,0x23,0x2E,0x92,0x43,0xB2,0x6A,0x96,0x41,0x55, + + 0x78,0x8F,0xFF,0xAA,0x90,0xA6,0xB0,0xA7,0xCA,0x7F,0x89,0xD8,0x57,0xEF,0x9E,0xA3, + + 0x71,0xE0,0xCB,0x9F,0x94,0xC3,0x38,0x31,0x9D,0x81,0x79,0xB2,0x0A,0xED,0xA0,0xC6, + + 0xB4,0x8C,0xB0,0xC2,0x7D,0x3D,0x0E,0x4F,0x25,0x3B,0x0B,0x1D,0x58,0x1B,0x50,0xAC, + + 0xAB,0x88,0x7F,0xB4,0x14,0x4C,0x1E,0x02,0x46,0xE5,0xC6,0x4E,0x81,0xEF,0x70,0xC1, + + 0x43,0xA1,0xDB,0xB4,0xA2,0xE4,0x89,0x10,0xFA,0xAA,0x5D,0x14,0xAE,0x10,0x96,0xD1, + + 0x42,0x04,0xD7,0x7B,0xF7,0xE7,0xE9,0xF1,0x52,0x52,0x79,0xB1,0xBF,0x8B,0xE2,0xE7, + + 0xB2,0xF4,0xFC,0xA3,0x10,0x05,0xF6,0xA4,0x4F,0xD8,0x8A,0xD1,0xDF,0xE5,0x83,0x98, + + 0xC8,0x3C,0xAC,0x6D,0x2B,0x2E,0xBE,0xCB,0x7B,0x59,0x01,0x7C,0xFC,0x14,0x9C,0x44, + + 0x19,0x57,0x72,0x7F,0xDC,0xA3,0xF3,0xAE,0x35,0xC2,0x48,0xAB,0xA5,0x53,0xEB,0x8B, + + 0x25,0x2D,0xA8,0x12,0x74,0xF8,0x88,0x8A,0x31,0x08,0x93,0x5D,0xDB,0xC9,0x5A,0xC8, + + 0xCB,0xEF,0x1D,0x3C,0x30,0x73,0x4A,0xD8,0xFA,0x5D,0xCD,0xFD,0x26,0x43,0x2A,0xA3, + + 0x8D,0x41,0x51,0xFB,0xE8,0x00,0xEC,0x5D,0xEE,0x4A,0x84,0x42,0xD0,0x40,0xA3,0xCA, + + 0x14,0xCC,0x5C,0x7E,0x3F,0x51,0xC7,0x09,0x2C,0x64,0x64,0x15,0x14,0x7F,0x9F,0x39, + + 0x78,0xEA,0xBF,0x62,0x74,0xEB,0x35,0x5F,0x63,0xC2,0x6C,0xEC,0xEA,0x64,0x66,0xA1, + + 0xEE,0x13,0xE4,0x13,0xCB,0x6D,0xCF,0xD1,0x02,0xB2,0x14,0x56,0xED,0x23,0x2A,0x63, + + 0x17,0xB1,0x94,0x12,0x3F,0xC5,0xC7,0x88,0x0F,0x64,0xFC,0xDD,0x73,0x8A,0x9E,0x10, + + 0x8A,0x98,0x8D,0xE5,0x49,0xBE,0x22,0x5C,0x15,0x01,0x75,0x27,0xD6,0xB0,0x0D,0x12, + + 0x58,0x3A,0xF7,0xA1,0xC9,0x1C,0xEF,0x37,0xA3,0xD3,0x48,0x33,0xFB,0x0D,0x66,0xD8, + + 0x04,0x20,0x1B,0xB8,0xE4,0x6B,0xDC,0x67,0xE3,0xA6,0x64,0xA1,0x52,0x79,0xA8,0x21, + + 0x05,0x38,0x97,0xF1,0x96,0x0A,0x6F,0x01,0x1F,0x7E,0xEA,0xDE,0x71,0x7F,0x31,0xB0, + + 0x84,0xFA,0x25,0xFA,0xE8,0xBB,0xD9,0xC7,0x07,0x79,0x8B,0xCF,0x95,0xA4,0x39,0x56, + + 0x4C,0xB4,0x41,0xA8,0x6D,0x18,0x2D,0xC9,0x8C,0xF4,0x41,0x95,0x15,0xB7,0x74,0x6A, + + 0x20,0x45,0x06,0x7E,0xAD,0x6B,0x91,0x12,0xEC,0xB8,0xDE,0xCC,0x83,0xF6,0x50,0x32, + + 0xAD,0xF9,0xC6,0xFC,0xC2,0xB7,0x6D,0x7D,0xAF,0x59,0xA1,0x7C,0xDC,0x46,0x39,0x2E, + + 0x8F,0x1A,0x67,0x0F,0x9E,0x05,0x69,0x13,0xCA,0x77,0x8F,0x51,0xFA,0x43,0x71,0x33, + + 0x52,0xD9,0x97,0x61,0xBB,0xC0,0x77,0xAA,0x0C,0x74,0xD7,0xDD,0x0E,0x97,0xA6,0x4A, + + 0x0A,0xDE,0x71,0xB0,0xEC,0x13,0x36,0x13,0x6C,0x47,0xF0,0xD1,0x4E,0xBE,0xBD,0x58, + + 0x2C,0x4D,0x42,0xAC,0xF5,0x4C,0x21,0x87,0x8E,0x72,0xC0,0xD6,0xF2,0x7B,0xA7,0xD3, + + 0x51,0xDC,0x74,0x6F,0x53,0xCE,0xC2,0xD4,0xD2,0x9C,0xBE,0xEF,0xB6,0xEF,0xAF,0x5B, + + 0xD1,0xDD,0x91,0xE2,0x5E,0x19,0xEE,0x7F,0x93,0xD0,0x7F,0xBF,0x12,0xBE,0x60,0x44, + + 0x71,0x8D,0x44,0xD4,0x18,0x23,0x28,0x70,0x41,0x4F,0x0C,0x63,0x8E,0x6A,0xC8,0xF8, + + 0xA6,0x07,0x8E,0x90,0x22,0x1C,0x78,0x74,0x8D,0xCA,0xA2,0xDB,0x2A,0x41,0x79,0x83, + + 0x85,0x3B,0xB9,0x11,0x12,0x6A,0x29,0xF1,0x7F,0x4D,0x92,0x36,0xFD,0xD2,0x81,0x12, + + 0x20,0x89,0xE9,0x51,0xD7,0x2E,0x1D,0xD3,0x43,0x40,0x2E,0x44,0xD7,0xFA,0xB8,0xC2, + + 0x82,0xBC,0xF8,0x83,0xCC,0xB9,0x9B,0x20,0x44,0x06,0xE2,0x8C,0x10,0x2B,0x8C,0x80, + + 0x0F,0x06,0xC3,0x32,0x31,0x28,0x08,0xF4,0x41,0x78,0x27,0x14,0x0F,0x28,0x79,0xBE, + + 0x43,0x64,0x22,0x05,0x8E,0x3D,0x11,0xDC,0xC4,0x44,0xB1,0x32,0x4F,0x6B,0x71,0xC1, + + 0xB0,0x20,0xCF,0xA4,0xEC,0xFF,0x99,0x34,0xDA,0x2B,0xC1,0x65,0x5E,0x91,0x7D,0xEA, + + 0x8A,0x0B,0x7D,0xAC,0xB9,0xE8,0x14,0x5A,0xEB,0x4E,0x4E,0x3F,0x75,0xD8,0x72,0x9A, + + 0x0C,0x00,0xD3,0x77,0xE4,0x45,0x4A,0xA1,0xEA,0x4F,0xA4,0x5C,0x78,0x19,0xB6,0x6B, + + 0xCB,0xFD,0xE3,0x49,0x80,0x68,0x43,0x80,0x6B,0x4C,0x95,0x31,0x58,0x8D,0x51,0x59, + + 0x2A,0x6E,0x4F,0xBD,0x38,0xEB,0x4B,0x34,0x6A,0x4D,0xE5,0x21,0xE6,0x94,0xFA,0xB2, + + 0x1A,0x41,0xE2,0xFC,0x3A,0x8D,0x92,0xEC,0x68,0x46,0xDA,0x64,0xD8,0x80,0xF2,0xC3, + + 0x30,0x4A,0x0A,0xDC,0x55,0x6F,0x8E,0x79,0x20,0xCE,0x98,0x9A,0x68,0xEF,0x3C,0x0E, + + 0xB9,0x05,0x54,0xC9,0x98,0xDD,0xD3,0xAF,0xA2,0xE5,0x7E,0x0F,0x98,0x75,0xB7,0xD1, + + 0x2E,0x99,0x8F,0x1D,0x98,0xAE,0x3F,0x88,0xA1,0x57,0x63,0x9D,0xD7,0xE4,0x4E,0x7B, + + 0x83,0x75,0x30,0x66,0xF8,0x79,0x95,0xC2,0x23,0xEF,0x9A,0x26,0xE5,0x7C,0x34,0x40, + + 0xFE,0x1E,0xEA,0xF1,0x32,0x9A,0x24,0x60,0x9A,0x5E,0x99,0x30,0x63,0x3A,0x3D,0x51, + + 0x5E,0x1D,0x82,0xF6,0xE8,0x5C,0x6D,0x23,0xE5,0x82,0x55,0xC0,0x35,0x69,0x6D,0xD1, + + 0xA7,0x1E,0xAB,0xF5,0xE5,0x9E,0x7D,0xF5,0xE9,0x11,0xFD,0xFB,0x70,0x31,0xD4,0x86, + + 0x4A,0xBF,0x1B,0x8C,0xB2,0x74,0x94,0xB0,0x35,0x5C,0x16,0xE4,0x41,0xD1,0xE0,0x42, + + 0x27,0x1D,0x5C,0x50,0x0C,0x42,0x9C,0x70,0x41,0xEA,0x3A,0x96,0x30,0x85,0x9A,0x3E, + + 0x4B,0x2D,0x2D,0xF4,0x16,0x97,0x16,0x65,0xE0,0x08,0x6A,0x03,0x70,0x72,0x8C,0xA2, + + 0xD8,0x91,0x76,0x92,0xBD,0xC8,0x3D,0x72,0xF2,0x5A,0x84,0xC3,0x54,0x71,0x4C,0x76, + + 0x8B,0x7D,0x05,0x4B,0xF2,0x11,0x4F,0xCA,0xEA,0x10,0x0A,0x6A,0xD4,0x3A,0x36,0x48, + + 0xD2,0x16,0xB4,0x18,0x14,0x1C,0x7E,0xFC,0x71,0x1B,0xED,0xCE,0x05,0x62,0x3F,0x59, + + 0x17,0x15,0xCF,0xC9,0xBE,0x53,0x11,0x2D,0xDB,0x57,0x0B,0xFB,0xFE,0x98,0x6F,0xDD, + + 0xC9,0x96,0x74,0xBA,0x18,0xC4,0x46,0xDB,0x6B,0x13,0x6F,0x5B,0x0C,0xF8,0xC6,0x88, + + 0x68,0xB1,0x9F,0x15,0x1E,0xE7,0xAD,0xCF,0xCB,0xA3,0xF6,0x76,0xDB,0x6C,0x06,0xC1, + + 0xC2,0xA6,0xCF,0xAE,0xC0,0x7F,0x21,0xBF,0x96,0xEB,0xA6,0x1C,0x3B,0x80,0x1A,0x0E, + + 0x68,0x16,0x6C,0x30,0x0A,0x45,0x97,0xAC,0xF3,0x13,0x2F,0x8B,0x05,0xF4,0x2D,0x99, + + 0xA8,0xFF,0x14,0xB3,0x3E,0x5E,0x65,0x6B,0xEB,0x55,0xD5,0x9D,0x5C,0x79,0x7A,0x07, + + 0xA7,0x86,0xC0,0x42,0x4C,0xE2,0x60,0x17,0xE7,0xC6,0x8A,0xDD,0x2B,0x1F,0x48,0x56, + + 0x42,0x8E,0x01,0x54,0x13,0xB3,0x47,0xD0,0xC7,0xE9,0xA6,0xA6,0xAA,0x4C,0xA9,0xCF, + + 0x65,0x8D,0xF8,0x6C,0xB0,0xA4,0x3D,0x4D,0x65,0x48,0x71,0x5F,0xFB,0x4F,0x49,0x57, + + 0x05,0x8E,0x87,0x17,0x95,0xA3,0x04,0xB7,0xF6,0x0C,0xA5,0x70,0x0B,0xE9,0x25,0xA5, + + 0xFB,0x08,0x20,0xC3,0x2A,0x25,0x56,0x9B,0x20,0xBF,0x0F,0x80,0xD4,0xE0,0x6C,0xF2, + + 0xA6,0x07,0x28,0xD6,0x59,0x5A,0x73,0xF6,0x71,0x22,0x00,0xF4,0xD7,0xC2,0xA5,0xC6, + + 0x88,0x0C,0xEB,0xC3,0x94,0xEB,0x75,0x8F,0x40,0xFD,0x90,0x05,0xE5,0x43,0x30,0xF4, + + 0x22,0x58,0x89,0xD4,0x86,0xAA,0x47,0x8B,0x48,0x41,0xC1,0x17,0x99,0xAA,0x68,0xF7, + + 0xAF,0xED,0xA2,0x8C,0x89,0x24,0x52,0x6E,0x48,0xC5,0xB1,0x3D,0x75,0x38,0x4A,0x5A, + + 0x0B,0x84,0xAA,0x1E,0x1D,0x24,0xB2,0x2E,0xEC,0x43,0x65,0x3F,0x5B,0x70,0x1B,0xDB, + + 0x7B,0x85,0x63,0x87,0x55,0xAA,0x79,0xD0,0x6F,0xCC,0x6E,0x2E,0x3D,0x55,0x61,0xF4, + + 0x2E,0x86,0xCB,0x51,0x6B,0xA4,0x44,0xD9,0x4F,0x83,0x67,0x2E,0x85,0xCA,0x63,0x2C, + + 0xF1,0xE0,0x99,0x69,0xBF,0xC0,0x72,0xAA,0x3A,0x67,0x0D,0x92,0x5E,0xE1,0x37,0xE8, + + 0xA0,0x9F,0x6F,0xB6,0x4E,0xE0,0x25,0x32,0x3C,0xEB,0xBC,0x00,0xDD,0xE9,0x3A,0xAF, + + 0x2B,0x78,0x04,0x35,0x48,0xA4,0xA1,0x6A,0x72,0x75,0x8C,0x97,0xDE,0xAC,0xD3,0xC5, + + 0x95,0xE0,0xBB,0x3C,0xD7,0x04,0xA4,0x23,0xB8,0x89,0x37,0x1D,0x24,0xAD,0x5C,0xA5, + + 0x87,0x96,0x64,0x5A,0x95,0x1D,0x33,0x26,0x57,0xDD,0xB0,0x2E,0xD3,0xB2,0x4C,0xD6, + + 0x10,0x1C,0x39,0xE5,0x10,0xB8,0x71,0x30,0x60,0x33,0x7C,0x3E,0x52,0xF7,0x2D,0xA4, + + 0xE4,0x9D,0xA2,0xF6,0x99,0xB9,0xEA,0xD3,0xE2,0x69,0x29,0xE0,0xC7,0xC2,0x55,0x11, + + 0xAC,0xD7,0x2E,0x64,0xED,0x1E,0x05,0x4C,0x24,0xB1,0x14,0xE5,0xF3,0x9A,0x3D,0x9A, + + 0x83,0x1E,0x4C,0xE7,0xB4,0xB0,0xF4,0x24,0x0E,0xD5,0xD4,0x68,0xD7,0x78,0xFC,0x56, + + 0x2D,0x8E,0xFE,0xF6,0x57,0xF5,0xAB,0x76,0x65,0x37,0x55,0xBC,0xD4,0xF3,0xE1,0x23, + + 0xA2,0xF8,0x6E,0xA5,0xB8,0xF0,0x63,0xDB,0xE0,0xD4,0xBF,0xFA,0xB6,0xF0,0xAD,0x7F, + + 0x49,0x3A,0xC9,0x0E,0x35,0xB3,0x82,0x34,0xE1,0xF5,0xDD,0x79,0x56,0x7D,0x1E,0xDA, + + 0x28,0x97,0xB8,0x7C,0x7C,0x47,0xF2,0x7A,0x60,0xDB,0x5E,0x2A,0x51,0x94,0xD1,0x18, + + 0x0F,0xEC,0x6E,0xE6,0x12,0x14,0x3A,0x3E,0x5E,0xE4,0x29,0x56,0x9F,0xB6,0x7D,0x8A, + + 0xAA,0x81,0x9D,0x60,0xC7,0x45,0x0F,0xBF,0x6E,0x92,0x77,0x3A,0x0E,0x77,0x17,0xCB, + + 0xED,0x94,0xB5,0x0F,0x42,0x16,0x80,0xE9,0xE3,0xB9,0x04,0x0F,0xF5,0xE9,0x3D,0x0D, + + 0xEC,0x9C,0xED,0xAC,0x9A,0x11,0xFE,0xAA,0x30,0x9E,0x71,0xFE,0xFC,0xA0,0xCA,0x2B, + + 0x49,0xBD,0x06,0xBC,0xFE,0x37,0xB8,0x05,0xED,0xFB,0x1B,0x9C,0xBE,0x77,0x2F,0x56, + + 0xA8,0xFC,0x07,0xEB,0x3C,0xBA,0x37,0x25,0xE8,0xDC,0xDA,0x0D,0x7C,0xFA,0xDA,0x32, + + 0xA9,0x17,0x68,0x2E,0x1C,0xEF,0x76,0x99,0x1C,0xBA,0x78,0xEF,0x7D,0xA3,0xA9,0xE2, + + 0x82,0x04,0x5D,0x8D,0x16,0x22,0xD0,0xE5,0xE1,0x9F,0xEF,0x7E,0xA5,0xFC,0x0A,0x92, + + 0x94,0x7D,0xE0,0x76,0xE6,0x2F,0x30,0x52,0xBC,0x4D,0x80,0xB5,0xB8,0x9A,0xE4,0x63, + + 0xC3,0xF2,0x5F,0xC7,0x31,0xDD,0xA5,0x43,0x3F,0x9F,0xAF,0xD8,0xB1,0x37,0x71,0x63, + + 0x7E,0xFE,0xB1,0xEE,0x12,0x2E,0x21,0x42,0xAF,0x01,0x83,0x9A,0xF0,0x13,0xEF,0x2F, + + 0xDF,0xA0,0xF8,0x14,0x16,0x2B,0x2E,0x66,0xA3,0xC7,0x09,0x02,0x6E,0x76,0x68,0x63, + + 0xE2,0xAA,0xF0,0xAB,0x91,0x39,0x06,0x92,0x03,0xE8,0xF8,0xE6,0xD3,0x6F,0x11,0xE9, + + 0xCA,0x05,0x51,0xC7,0x5F,0x2B,0x75,0x92,0x4E,0x07,0x69,0xC9,0x5F,0xEF,0x19,0x6E, + + 0xA1,0xFA,0xAA,0x37,0x1C,0xD1,0x48,0x43,0xA3,0x46,0x5D,0x33,0xFF,0x26,0x59,0x08, + + 0x37,0x28,0xF9,0xCB,0x1E,0x3A,0x52,0xB3,0xBF,0xE5,0xAC,0xD1,0x39,0x1D,0x58,0x1A, + + 0xBE,0x4B,0x58,0xFC,0x1D,0x47,0x24,0x99,0x3F,0x0B,0xE8,0x92,0x53,0xE4,0x11,0x8E, + + 0x33,0x97,0x08,0x4D,0xDC,0x87,0xC3,0x14,0x23,0x0E,0x8B,0x3C,0x31,0x91,0x4D,0x33, + + 0x62,0x08,0x1B,0x99,0xDB,0x52,0x5B,0x99,0x32,0x45,0xE5,0x8C,0x32,0xA8,0xEE,0xDA, + + 0x4A,0x06,0x52,0x8B,0x98,0x30,0x2C,0x6E,0xA3,0x43,0x89,0x6C,0x21,0xEC,0x33,0x2E, + + 0xFC,0x4F,0xE3,0xC7,0xBA,0xFB,0xCA,0x88,0xA1,0x9C,0x63,0x22,0x5D,0xAF,0x53,0xB9, + + 0xE0,0xFF,0x20,0x2F,0x44,0x28,0x01,0xFB,0x21,0x2A,0x7C,0x02,0x07,0xB2,0x09,0xDB, + + 0x70,0x61,0x5B,0xDF,0x1B,0x97,0x25,0x7F,0x2A,0xCC,0x95,0xBA,0xE8,0xF4,0x1E,0xBF, + + 0x41,0xCB,0x50,0xDA,0xA3,0x0F,0x3C,0xC2,0x9D,0x5C,0xF2,0x00,0xC5,0xD6,0x0C,0x14, + + 0x6B,0xCC,0xE4,0xF6,0xCE,0x3F,0x5C,0x2B,0x96,0xFC,0xC8,0xBB,0x57,0xD5,0x05,0xBA, + + 0xC9,0x89,0x78,0x01,0xBA,0x38,0x2D,0xD2,0x8E,0x10,0xC1,0x65,0xBC,0x26,0xB2,0xA0, + + 0x00,0xEC,0xB5,0x6B,0x32,0x3E,0x4F,0x8C,0x0A,0x17,0xCD,0x04,0x7E,0x0E,0x06,0x42, + + 0x24,0x16,0x54,0x46,0xB2,0x8D,0x2D,0x30,0xC1,0x48,0x2C,0x82,0xFD,0xF2,0x5E,0x42, + + 0xB2,0x5A,0xAC,0x74,0x2D,0x74,0x55,0xD4,0xB9,0xC8,0x48,0xD0,0xA6,0x28,0x89,0x45, + + 0xAC,0x82,0xFD,0x97,0xF1,0xC6,0xEA,0xB3,0xA1,0xA6,0x16,0xA5,0x90,0x3A,0x4C,0xAE, + + 0x04,0x55,0xDB,0xB7,0xD3,0xB3,0x47,0xF3,0x50,0xDC,0x76,0xAA,0x4E,0x8B,0xBD,0x2D, + + 0xDF,0xE5,0xF9,0x4E,0x99,0xA7,0x28,0x0D,0x1E,0x1A,0xF0,0x1C,0xCD,0xDE,0xB5,0x28, + + 0x97,0xB6,0xC6,0x89,0xD0,0xFA,0x26,0x47,0xEA,0x54,0x4A,0xB3,0x1B,0xDD,0x15,0x09, + + 0x43,0x8A,0x2B,0x09,0xAA,0xE2,0x57,0x09,0x13,0x54,0x43,0xED,0xB4,0x2E,0x8A,0xBD, + + 0x7D,0x38,0xFD,0x9C,0xBD,0x55,0xE4,0x3D,0xD6,0x2C,0xCF,0x09,0x10,0x78,0x04,0x4A, + + 0x2C,0x1E,0xBF,0xAA,0xCD,0x2C,0x76,0x62,0x4E,0x53,0x8D,0xEC,0x01,0x3C,0x5C,0x4E, + + 0xBA,0x52,0x4E,0x3E,0x97,0xB0,0x5F,0x8E,0x4F,0x3F,0x83,0x9A,0x88,0x6D,0xDF,0x4D, + + 0xA4,0x8A,0x7F,0x32,0x9E,0xB5,0x0E,0xEF,0x0F,0x81,0x17,0x79,0xB1,0x65,0x4E,0xA6, + + 0x0C,0xBF,0xB7,0xF9,0x39,0x37,0x9B,0x29,0x95,0xDE,0x67,0x06,0x76,0x64,0x6A,0x17, + + 0x25,0x60,0x5B,0x3C,0x26,0x15,0x08,0xDD,0xC7,0xCD,0x8E,0xCF,0x16,0x4F,0xA8,0xD4, + + 0x2D,0x0A,0x92,0xEC,0xEE,0x3C,0x9B,0x9A,0x99,0xF2,0x62,0x2F,0xDC,0x72,0x1F,0xA3, + + 0x67,0x8B,0xF4,0x83,0xDE,0x7F,0xCA,0xA7,0xFB,0xB5,0x67,0xD4,0xE6,0xA0,0x02,0x2E, + + 0x83,0xDA,0x81,0x75,0x6C,0xAF,0x1F,0x83,0x41,0x67,0x83,0xC4,0xF7,0x4E,0x83,0x02, + + 0x5A,0x0F,0xD8,0xC3,0x18,0xC6,0xDA,0x91,0xCA,0xC9,0x48,0xF9,0xA3,0x6D,0x57,0x04, + + 0x64,0x26,0x17,0x34,0x6B,0xAA,0x2A,0xD6,0xB4,0x78,0xB0,0x6A,0x64,0xBE,0x37,0x7E, + + 0x35,0x4A,0x71,0xAF,0x76,0xEB,0x63,0x63,0x3D,0x4B,0xD1,0xE3,0xE3,0x7B,0x7F,0xF3, + + 0x34,0x4B,0x79,0x35,0x24,0xC2,0x63,0x76,0x2C,0x83,0x41,0x4A,0xC5,0xAA,0x5C,0x79, + + 0x2E,0x87,0x9A,0x70,0x9D,0xA5,0xE6,0x2D,0x27,0xC7,0xE2,0x69,0x96,0xD3,0x3A,0x3B, + + 0x4D,0x04,0x7F,0x20,0x2B,0xB2,0x7F,0x27,0xEC,0x16,0x7A,0xBE,0x52,0xAB,0xA4,0xB4, + + 0xCC,0x64,0x1C,0x4D,0x3D,0x07,0xB3,0x58,0xA2,0x88,0xFB,0xFF,0x35,0xE9,0x72,0x2D, + + 0x2A,0x29,0x2B,0x58,0xB3,0x77,0x8F,0x59,0x32,0x16,0x7B,0x57,0x62,0x87,0xD9,0x1C, + + 0x52,0x88,0xDA,0xB1,0xF7,0x16,0x51,0x6D,0x6A,0x81,0x21,0x29,0x3F,0xE8,0x3A,0xE8, + + 0x4F,0xA3,0x7A,0x0C,0x5C,0x5D,0xED,0x82,0x4F,0x8F,0xA3,0x4C,0xFA,0x12,0x8A,0x5A, + + 0xAC,0x23,0xF5,0x2D,0xF6,0xA3,0x8C,0x97,0xCE,0x7B,0x91,0x6D,0xDD,0xAC,0x51,0xA8, + + 0xAD,0xCD,0xB5,0xBD,0xBF,0x2A,0x3D,0x05,0x3A,0x43,0xA2,0x40,0x7A,0x1E,0x83,0x26, + + 0xF4,0xF3,0x34,0x97,0x5A,0x94,0x97,0x0E,0xB8,0xA3,0x74,0x26,0x51,0xB2,0x16,0x61, + + 0x4B,0x3C,0xFA,0x6E,0x35,0xEA,0xFC,0x33,0x3C,0x93,0xDB,0xD8,0xA7,0xFB,0x02,0x33, + + 0x38,0x31,0x38,0xC0,0x90,0xA9,0x86,0x0B,0x18,0xE1,0x75,0xCF,0x4B,0x9E,0x7B,0x03, + + 0x5A,0x3E,0x3D,0x7E,0x52,0xF1,0xFD,0x22,0x64,0xDE,0xB8,0xED,0x40,0x6F,0x34,0xB1, + + 0x04,0x13,0x12,0x36,0x3E,0xBB,0x70,0x19,0x87,0xB7,0xAF,0x80,0xAC,0x4B,0x12,0xEF, + + 0xD3,0x04,0xF4,0xD2,0x9E,0xCA,0xFB,0x10,0xCB,0x58,0x50,0x8D,0xA9,0x28,0x67,0x08, + + 0x82,0x9B,0x75,0x2F,0x4E,0xFB,0x0E,0xC7,0x27,0x5C,0xB4,0x81,0x24,0x69,0xDA,0xEA, + + 0x3A,0x6A,0xD3,0x0A,0x96,0xF7,0x05,0xD7,0x1B,0x26,0xE7,0xF5,0x44,0x6A,0xF0,0xCD, + + 0xF2,0x90,0x62,0x87,0x3A,0xFA,0x09,0xE8,0xCD,0x05,0x99,0xC1,0xA5,0x5C,0xFE,0x9C, + + 0xE5,0xBA,0x7E,0x80,0x13,0x16,0x06,0x84,0x5B,0x2C,0x59,0xD0,0xAB,0xF1,0xA7,0xA8, + + 0xC5,0x3E,0xA0,0x91,0x96,0x15,0x1F,0xC9,0x11,0xD6,0xE7,0x1A,0x73,0x87,0x8B,0xE8, + + 0xC3,0xD9,0xFD,0x1B,0xBF,0xE6,0xEA,0xC9,0x1E,0x64,0xBA,0xE1,0x48,0x27,0xCB,0x84, + + 0xDB,0xC0,0xDA,0x21,0x0D,0x04,0x0D,0x11,0x99,0x9E,0xEC,0xEC,0xEC,0xF6,0x91,0xE4, + + 0x17,0x3D,0x13,0x36,0xD7,0xF0,0x06,0xDD,0x0C,0x2D,0x06,0xF6,0xD8,0xBC,0x5D,0x20, + + 0x1D,0xDF,0x5F,0xAF,0xBA,0x93,0xB1,0x4A,0x1B,0x9F,0x75,0x9D,0xCD,0x2B,0x7A,0x2B, + + 0xAE,0x4E,0x12,0x33,0xBF,0xA4,0x07,0x79,0xE6,0x02,0xFF,0xFF,0xFF,0xFF,0x59,0x33, + + 0xA5,0xDF,0x31,0x80,0x12,0xC2,0x2F,0x52,0xAB,0x31,0x50,0xA0,0xE4,0x0C,0xB0,0x8B, + + 0x07,0x58,0xB0,0x29,0xEE,0x27,0x66,0x0D,0xAA,0x90,0x9E,0xB0,0x5F,0xEE,0x7E,0x46, + + 0xB3,0x99,0x7E,0x87,0x01,0x17,0x6F,0x19,0x2B,0x41,0x76,0x5F,0x06,0x68,0xB0,0xD1, + + 0x8D,0xF8,0xA0,0x3F,0x30,0xF0,0x67,0x08,0x75,0x52,0xB9,0x35,0xE2,0xA5,0x80,0xC0, + + 0xDB,0x0E,0xBF,0x37,0xB1,0x77,0xB7,0x1A,0x94,0x4E,0x89,0xCB,0x54,0xB5,0x70,0xAF, + + 0x05,0x0C,0xD6,0xB6,0xF3,0x81,0x62,0x9B,0x45,0x67,0xE5,0x36,0xF2,0x38,0x5B,0xC3, + + 0x47,0xA5,0xBA,0x36,0xE2,0x82,0xD5,0x9C,0xCA,0x07,0x2A,0x0F,0x53,0x6B,0xE9,0x91, + + 0x8F,0xFC,0xB1,0xED,0x78,0x94,0xDD,0xE1,0x3C,0x7A,0xF1,0x17,0x6E,0x6B,0xFD,0x2C, + + 0x28,0x29,0x2E,0x89,0xEF,0xD5,0xAB,0xEF,0xD6,0x42,0x29,0xCA,0x48,0x95,0x53,0xD4, + + 0xAC,0xFF,0x31,0xFA,0x09,0xD4,0xA3,0xBC,0x53,0xB9,0x5A,0xAC,0x05,0x2B,0xC2,0x77, + + 0x77,0x66,0x47,0xF2,0xAB,0xAC,0xC4,0xAD,0xFD,0xCD,0x6B,0xA9,0xD6,0x1B,0x4A,0x7F, + + 0x4B,0x0B,0x73,0xF5,0x0B,0xF6,0x23,0xCA,0xF1,0x2E,0xDB,0xA8,0x26,0x6D,0x46,0x6C, + + 0x88,0xC0,0x6D,0x23,0xC7,0xF0,0xFE,0xF7,0x49,0xF4,0xEA,0x1F,0x7C,0xCD,0x74,0xB1, + + 0x49,0xF2,0x13,0x73,0x1D,0xC6,0x1A,0xED,0xB4,0x70,0x0E,0x82,0xA6,0xEC,0x15,0x2B, + + 0xCA,0x31,0x7A,0x13,0xA5,0x2C,0x93,0xE9,0xB4,0x0C,0xEB,0x92,0x33,0x4D,0x76,0x1E, + + 0x55,0x05,0x99,0xAC,0xE3,0x5A,0x9B,0xF9,0xEE,0x0D,0x9B,0x82,0x2E,0xEC,0xD9,0x81, + + 0x5B,0xA0,0x7C,0x00,0x32,0x6E,0x6A,0x00,0x89,0xA1,0xCD,0x3E,0xD5,0x8F,0xB3,0xDF, + + 0xAC,0x6C,0xD5,0xA1,0x94,0xAE,0x4A,0x8C,0x8A,0x80,0x33,0x52,0x61,0x8C,0xC5,0x4D, + + 0xB2,0x6E,0x45,0x05,0xFE,0xCD,0xC6,0x52,0x9C,0xEF,0x94,0xC3,0xC3,0x77,0x6B,0xB9, + + 0x2E,0x95,0x8C,0xF3,0x4A,0x5F,0x26,0x00,0x99,0xFC,0x65,0x5D,0x67,0x3E,0x54,0x3F, + + 0xA0,0x08,0x57,0xEA,0x4A,0xC1,0x2B,0x27,0xBC,0xC9,0xE9,0x5D,0x89,0x69,0xB7,0xBB, + + 0x25,0x17,0x12,0x64,0xDA,0x44,0x98,0x49,0x65,0x57,0x1C,0x7C,0xC9,0xD8,0x74,0xA3, + + 0xC0,0x16,0x95,0xFB,0xCE,0x74,0xB6,0x21,0xEC,0x14,0x86,0x1F,0xC1,0x01,0x81,0x55, + + 0xA1,0x14,0x0D,0xE8,0x21,0x96,0x9B,0xC1,0xC3,0xA8,0xCE,0xC4,0xD5,0xD8,0x82,0xC8, + + 0x24,0xE3,0x61,0xF6,0xEE,0x32,0x01,0xA4,0xE8,0xCF,0x69,0xA4,0xDD,0x63,0xB7,0xDF, + + 0xE3,0x08,0xAE,0x9C,0x0A,0x6F,0x29,0x84,0x99,0xE8,0x21,0x5A,0x12,0x92,0xFC,0xAD, + + 0x49,0x45,0x81,0x09,0xB6,0xB5,0xA0,0x09,0x1C,0xAB,0x27,0xF2,0x5F,0x6A,0x47,0x85, + + 0xAF,0x42,0xAF,0x39,0xBF,0x39,0x46,0xBC,0xEF,0x49,0x9D,0xCF,0x06,0x86,0xAA,0x57, + + 0xDB,0xCA,0x55,0x3F,0x4E,0xE1,0x6C,0x54,0x9D,0x32,0x06,0x9E,0x10,0x5F,0x19,0x5C, + + 0x29,0x1E,0x0E,0xE1,0xFD,0x9C,0x56,0xE8,0x23,0xFE,0xFE,0x63,0x5F,0x7B,0x0F,0xD1, + + 0xAC,0x7C,0x91,0xF4,0x51,0x8F,0x68,0x76,0x1B,0x88,0xA9,0x4C,0xB2,0x2F,0xA3,0x46, + + 0x5A,0xC9,0x9F,0x2E,0x99,0xE2,0x7F,0xFC,0xF3,0x77,0x57,0xEA,0x1A,0x70,0x28,0x07, + + 0x7B,0x5F,0x58,0x0E,0xE9,0xEF,0x08,0xD1,0x70,0x61,0x50,0x7E,0xF5,0x7F,0x2A,0xE3, + + 0xA6,0x91,0xF0,0xA6,0x26,0x20,0x2D,0x83,0x79,0x6E,0x83,0x8A,0xD8,0x83,0xB1,0xEB, + + 0x34,0xCF,0x9F,0xFA,0xF5,0x7A,0x22,0xD0,0xB4,0x6F,0x05,0x45,0xA8,0x1D,0x1B,0xEC, + + 0xA1,0x98,0x69,0x93,0x21,0xCD,0xAC,0x5D,0x85,0xFC,0xE4,0xAD,0x7A,0x1E,0xFE,0x29, + + 0x00,0x86,0xBE,0x7A,0x14,0x0F,0x30,0xC2,0xC9,0x32,0x45,0x98,0xBF,0x75,0x84,0x2D, + + 0xDD,0x58,0xA8,0x45,0x67,0xF4,0xB8,0xF7,0x61,0x87,0xC1,0x8E,0xB5,0xA7,0xE2,0xC7, + + 0x80,0x7F,0x76,0x68,0xFD,0xA5,0x4A,0xFD,0xC5,0x05,0x0C,0x8B,0xD6,0x5D,0x0A,0x93, + + 0xE9,0xC5,0xD7,0x7B,0xB6,0xB4,0x39,0xD3,0x4A,0x31,0x61,0xFB,0x54,0xEA,0x13,0x6C, + + 0xF3,0xF3,0x45,0x74,0xCA,0xA0,0xCD,0xD6,0x4C,0x5D,0x76,0x27,0xF3,0xF3,0xE3,0x92, + + 0xD1,0x98,0x8A,0x1E,0x2E,0x6F,0x7C,0x44,0xAC,0x56,0x02,0xD6,0x8B,0x15,0xDC,0x79, + + 0x77,0xC8,0xA5,0x8B,0x92,0x25,0x26,0x10,0xF8,0x88,0x51,0x49,0x23,0xFA,0x72,0x31, + + 0x28,0x74,0x10,0xF9,0x8D,0x56,0x44,0x48,0xEF,0x3A,0x43,0x37,0x20,0xA4,0xA6,0xEE, + + 0x08,0x8E,0xDC,0xEE,0x7E,0xEC,0x49,0xF4,0x4F,0x9D,0x0F,0xAC,0xFF,0xB3,0x09,0x1A, + + 0x33,0x8B,0x91,0xAF,0x6D,0xAD,0xBA,0xFA,0x01,0x4C,0xC2,0x94,0xE2,0x1C,0xA5,0x0C, + + 0x54,0x53,0x9C,0x3D,0xF4,0x5F,0x4E,0xEF,0xCC,0xA4,0x9B,0x0D,0x65,0xE0,0x42,0x70, + + 0x2E,0x0E,0xCD,0x72,0xE5,0xDA,0x6B,0xFF,0xCD,0x1D,0x04,0x11,0xA9,0x30,0x56,0x06, + + 0x11,0x47,0x4D,0x02,0x36,0x52,0xEC,0xBD,0x46,0x04,0xA2,0xC4,0x14,0x76,0xBC,0x9E, + + 0xA5,0x0C,0xD7,0x9E,0x90,0x0E,0x2B,0x8C,0x59,0x24,0x04,0x4D,0x88,0xB3,0x2D,0x86, + + 0xDB,0x4D,0x5A,0x6F,0xD4,0xFF,0xA2,0xB8,0x90,0x46,0xCC,0xC1,0x07,0xE2,0xF4,0x8A, + + 0x10,0xFD,0x41,0x08,0x44,0x65,0x2E,0xFC,0x18,0xAF,0x7D,0x5E,0xF3,0x91,0x6C,0xD2, + + 0x6E,0x37,0xB2,0xFB,0xDD,0x45,0xD5,0x91,0x0C,0x53,0x94,0xA2,0x48,0xFB,0x2D,0x56, + + 0x2D,0xF5,0xD6,0x25,0x1D,0x1A,0xEC,0x0F,0x6F,0x94,0x7C,0x14,0xF5,0xDD,0x45,0xE7, + + 0xBE,0xBE,0xA3,0xEB,0x36,0x3A,0x71,0xE6,0x99,0xD6,0x95,0xA6,0xB2,0x7D,0x92,0x57, + + 0x86,0xD3,0x3D,0x3F,0x09,0xF5,0xBD,0xCE,0x3B,0x7A,0xFF,0xE7,0x54,0xF1,0xC3,0xCA, + + 0x78,0xDA,0xAE,0x9F,0x3A,0xDA,0x9F,0xD4,0xF9,0x55,0x7A,0xB3,0x82,0xE8,0xDD,0xDA, + + 0x21,0x62,0x4F,0xE0,0x9A,0xA9,0x8D,0x87,0x6B,0x3B,0xE8,0x3C,0xEC,0xAC,0xBE,0x39, + + 0xAA,0xC3,0xDD,0x8D,0xBC,0xA1,0x4A,0x41,0x10,0xD9,0x0E,0x8B,0x1D,0x55,0xD4,0xBF, + + 0xBB,0x9F,0x10,0x79,0x8E,0x5A,0x4C,0x9F,0xEB,0xD9,0x87,0x41,0x51,0xF6,0x6E,0xCF, + + 0x51,0xBC,0xA7,0x38,0x3E,0xBC,0x68,0x7A,0x85,0xAD,0xFA,0x91,0x1D,0x5C,0xAE,0x5A, + + 0x61,0x62,0x7F,0xAD,0x0B,0xD1,0x6D,0x89,0x06,0x76,0xC6,0xAE,0x7B,0xF2,0xF7,0x4F, + + 0xA8,0xA4,0xE7,0xCF,0x5F,0x11,0x49,0x9B,0xAC,0x71,0x8F,0x6D,0xF7,0x23,0xAF,0x5B, + + 0x8B,0xF3,0x89,0xF2,0xBC,0xE5,0x07,0xFF,0x0F,0xAE,0xC7,0xAF,0xF7,0xF0,0x60,0x40, + + 0x46,0x8D,0x4F,0x66,0x51,0x00,0x34,0x42,0x01,0x60,0x44,0x46,0x13,0x1F,0xB3,0xF2, + + 0xAD,0xFC,0xB0,0x44,0x10,0x2E,0x20,0x60,0xC1,0x4E,0xE0,0x56,0x10,0x21,0x79,0x83, + + 0x81,0x85,0xF9,0x87,0xB2,0x57,0x69,0xA3,0xC5,0x46,0xE9,0x47,0x91,0x42,0x71,0x93, + + 0x88,0x47,0xE9,0xB5,0xD9,0x2E,0x79,0x75,0x86,0xC8,0xE1,0xC8,0x66,0x21,0x9F,0x22, + + 0x20,0x49,0x1D,0xC2,0xCE,0x07,0x09,0x41,0x44,0xC6,0x0F,0xE2,0xBB,0xED,0x68,0x55, + + 0x05,0xAD,0xB7,0xAA,0x15,0xC7,0xE7,0xF5,0x5B,0x2A,0xA7,0xF0,0x3C,0x43,0x47,0xC5, + + 0xA0,0x06,0xFB,0xAE,0x21,0xB9,0xB7,0x88,0x40,0x29,0x2C,0x89,0xD2,0xEB,0xD7,0xD3, + + 0x41,0x06,0x9D,0xBD,0xDF,0x65,0x00,0x44,0x66,0x98,0xE3,0x8A,0x2E,0x0B,0x3A,0x58, + + 0x0C,0x07,0x88,0x04,0xBB,0x4D,0x96,0xCA,0xCA,0x00,0xCD,0xE5,0xDA,0x8B,0x6A,0x5C, + + 0x3C,0x82,0xDA,0x11,0xB8,0xA3,0x02,0xC8,0x36,0x46,0xC0,0xC3,0xFA,0x0C,0x39,0x8D, + + 0xBB,0xF5,0xD9,0x10,0x3B,0x2C,0xDA,0xCB,0x4A,0x02,0x81,0x5F,0x7B,0x0F,0x0F,0xFB, + + 0x0B,0x03,0xF3,0xFF,0x1B,0x28,0xAF,0xC9,0x36,0x44,0xC1,0x28,0x7A,0x0E,0x7A,0xB7, + + 0xA6,0x17,0x83,0x91,0x8F,0xF1,0x53,0x0E,0x79,0xED,0xB4,0x1C,0x59,0x15,0xFE,0xDC, + + 0x01,0xAE,0x0A,0x38,0xC5,0x70,0xA6,0x07,0x45,0x7D,0xE2,0x86,0xF7,0x60,0x61,0xCD, + + 0x80,0x3D,0x6A,0x02,0x67,0x52,0x93,0xF9,0x04,0x7E,0x6C,0xE9,0xED,0x8F,0x15,0xBB, + + 0xCB,0xA2,0xB3,0x7A,0x26,0x20,0xA7,0x5D,0x17,0x1E,0xA4,0x0E,0xEE,0x10,0x3C,0xD0, + + 0x60,0x1F,0x13,0xE6,0x73,0xDC,0x6C,0x22,0x65,0x21,0x4B,0xD4,0xCC,0x79,0x08,0x72, + + 0xA3,0x19,0xC6,0x7E,0x92,0x37,0x14,0x35,0xC0,0xDB,0x6D,0xA4,0x98,0xBA,0x65,0xC5, + + 0xC0,0x99,0x8F,0x8D,0x13,0x3F,0x57,0x43,0xC4,0x54,0x93,0xD6,0x8F,0xF5,0xB1,0x73, + + 0x23,0x1B,0x5B,0x30,0x10,0xB9,0x62,0x53,0x40,0xD9,0xBD,0x9D,0xF7,0x11,0xEB,0x26, + + 0x32,0xE9,0x8C,0x41,0xCE,0xE5,0x2A,0xDD,0xEF,0x16,0xC6,0xF8,0x74,0x2F,0xB7,0xD8, + + 0x86,0xEA,0xB2,0x75,0xBE,0x93,0x0E,0x01,0x4D,0xAA,0xD4,0xED,0x10,0x53,0xBD,0x29, + + 0xCE,0x5B,0x05,0x31,0x71,0xEB,0xCD,0x03,0xA0,0xF9,0xC2,0x61,0xC5,0x5E,0x14,0xC7, + + 0x56,0x58,0x19,0x15,0xF7,0x93,0x03,0x51,0x1C,0xDA,0x4A,0x06,0x77,0xFA,0xB2,0x6A, + + 0xAA,0x10,0x69,0x6E,0xBA,0x70,0xEB,0x4A,0xEA,0x5B,0x2C,0x53,0x9A,0x5C,0x06,0x6F, + + 0x88,0x91,0xF6,0x1E,0x3C,0xE3,0x66,0xDA,0x2A,0x26,0xBE,0x35,0x84,0xFE,0xF3,0xFB, + + 0x0B,0x1C,0x9F,0xFF,0x1B,0x5F,0xA2,0xCB,0xA9,0xDA,0x91,0x5C,0x87,0x68,0x0B,0x7B, + + 0x2B,0x13,0x8D,0x7F,0x15,0x36,0x67,0x3B,0xCB,0x59,0x3F,0xAC,0x18,0xD4,0x47,0xB7, + + 0x8D,0x07,0x92,0x69,0xF2,0xED,0x28,0xD1,0x83,0xED,0x84,0xC2,0x91,0x18,0xF6,0x30, + + 0xBB,0xA1,0x5D,0x9F,0xBC,0x7F,0xDE,0x9B,0x74,0x1F,0xC4,0x6C,0x8C,0x80,0x84,0xAF, + + 0x51,0x0E,0x97,0xDC,0xC2,0x9E,0xFB,0x7A,0x96,0x56,0x8D,0xEC,0x59,0xD3,0xB7,0xD1, + + 0x52,0x50,0x57,0x87,0x1A,0xC0,0xC7,0x66,0x4A,0x80,0x73,0x63,0xF8,0xED,0xE4,0x60, + + 0x45,0xC0,0xE4,0xF6,0x4E,0xAF,0x50,0x82,0xF8,0xCD,0xEA,0xD9,0xF7,0xE6,0x50,0x90, + + 0x04,0xC3,0xE2,0xE8,0xB6,0xAC,0xB0,0xF7,0xE4,0x49,0xD8,0x76,0x44,0x61,0x59,0x61, + + 0xC5,0x02,0xC1,0x43,0x9B,0xAF,0x7B,0x9C,0x67,0xC4,0xE1,0x03,0x35,0xED,0x11,0x43, + + 0x8D,0x8C,0xE3,0xEC,0x36,0xA5,0xB9,0xD1,0x64,0x4B,0xC1,0xB3,0xA2,0x85,0x3D,0x70, + + 0x66,0x16,0x9E,0xE7,0xE3,0xAD,0x57,0x4F,0xDA,0x55,0x1C,0x1D,0xC8,0x6F,0x10,0x42, + + 0xEE,0xBE,0x28,0x32,0x84,0xA8,0xE0,0xC0,0xE6,0x6A,0xD8,0xFC,0x56,0xEF,0xA1,0xC2, + + 0xFE,0x2D,0x65,0xB6,0xBC,0x59,0x2B,0xC0,0xBA,0x84,0xD1,0x8D,0x27,0x6F,0x5B,0x63, + + 0xD1,0xC5,0x16,0x24,0xBD,0xC9,0xA9,0x34,0x0D,0xEC,0xA3,0xF1,0xAB,0x48,0x96,0x68, + + 0x4D,0x89,0x2A,0xDA,0xFD,0xA7,0x36,0xC8,0xCE,0x80,0x32,0xD6,0xA7,0x45,0x52,0x98, + + 0x0C,0xCB,0xCA,0x5A,0x72,0x22,0x5A,0x7E,0x3C,0xC6,0xFE,0x4D,0x22,0x60,0x5B,0x69, + + 0xCD,0x82,0xC3,0x4B,0x8B,0xA5,0x2E,0xDB,0xC4,0xC5,0x6C,0x5F,0x68,0xE3,0x13,0xCB, + + 0x76,0x84,0x3E,0xFD,0x1F,0xA2,0x5B,0x7A,0x03,0x4B,0x4E,0x5F,0xC1,0x46,0x26,0x73, + + 0x08,0xEE,0x05,0x0E,0x5A,0xEE,0x0C,0x56,0x25,0x3D,0x52,0x1C,0x3C,0xB9,0x33,0x7A, + + 0xAA,0x72,0x92,0x2D,0x6B,0xA4,0x38,0x0B,0x7B,0xC6,0x82,0x01,0x7E,0x9F,0xD9,0xF9, + + 0xF7,0x5F,0x7B,0x85,0x77,0x8D,0xF4,0x83,0x1A,0x03,0x8D,0x68,0xBD,0xCE,0x6A,0x3D, + + 0xBC,0x0B,0xAA,0x18,0x55,0x2C,0x7D,0x93,0x4F,0x02,0xA5,0x9D,0xDB,0x6A,0xD6,0xE0, + + 0x67,0x60,0xAE,0x82,0x97,0xB6,0x6E,0xBF,0xC7,0xD6,0x6B,0xA4,0x76,0x0D,0x24,0x34, + + 0x84,0x1B,0xD4,0x14,0x30,0x8A,0x44,0xE2,0x29,0xDE,0x63,0x3F,0xF5,0x11,0x2F,0xE3, + + 0x07,0x94,0x2D,0x6B,0xD7,0x92,0x65,0x8D,0x45,0x58,0xC7,0xA0,0xBC,0x59,0xAA,0xC3, + + 0xA7,0x9C,0xD5,0x15,0xB0,0x48,0x5D,0x13,0xAF,0x58,0x02,0x05,0x35,0x93,0x65,0xBC, + + 0x81,0x84,0xDA,0x63,0xB9,0x42,0xC0,0x80,0xD9,0x88,0xAA,0x04,0x72,0x09,0x64,0xB0, + + 0xD8,0xF0,0xC7,0xA5,0x19,0xBA,0xC4,0x0D,0x8E,0x04,0x25,0xCF,0x71,0xAE,0xDA,0x25, + + 0x24,0x5A,0xED,0xD3,0xB0,0xFF,0xCE,0xAD,0xD5,0xC4,0xC7,0xD7,0xF0,0xB4,0x55,0x3B, + + 0x77,0x6B,0xDC,0xEF,0x52,0x48,0xD1,0x6C,0xE6,0xA7,0xF1,0xB7,0xAF,0x7C,0x46,0xCA, + + 0x8E,0x13,0x9C,0x6C,0xBE,0xF0,0x32,0x48,0xEE,0xDB,0xE8,0x53,0x6A,0xBA,0x56,0x18, + + 0x2C,0x7B,0x26,0x9C,0x9C,0x33,0x5E,0x1A,0x3D,0x52,0xE3,0xB9,0xD2,0xE4,0xA0,0x69, + + 0x00,0x17,0x7C,0x9F,0x1F,0xBC,0xF3,0x5B,0xA0,0xD5,0x73,0xD9,0x4F,0x77,0x2D,0x79, + + 0x2F,0xD3,0x40,0x7D,0x3F,0x58,0xBB,0x59,0x6F,0x93,0xFA,0x58,0x7F,0xFF,0x9E,0xC2, + + 0xD3,0xD3,0xD8,0x6B,0xB1,0x4A,0x66,0x6A,0x7E,0xC7,0x12,0xD3,0x95,0xB8,0x2A,0x6B, + + 0x1C,0x4F,0x7E,0xE8,0x11,0x48,0x44,0x56,0xD8,0x28,0x5A,0x0E,0x77,0xF2,0x07,0x9D, + + 0x00,0xDC,0xEF,0xCA,0xC1,0x41,0xB2,0x8D,0xD2,0xA1,0xCD,0x5F,0x4A,0x51,0xD7,0x25, + + 0xBF,0xD2,0xBF,0xFB,0xC8,0xEA,0xAF,0xEA,0xC9,0x9D,0x78,0x9C,0x2B,0xBE,0xA3,0x28, + + 0xDC,0x31,0x41,0xF5,0x24,0x20,0x28,0xDA,0xEC,0x4D,0x2F,0x7F,0xAD,0x3F,0x9B,0x57, + + 0xCB,0x88,0xB6,0x3C,0x17,0xC9,0xCB,0xC3,0x75,0x2F,0xA2,0x98,0xA6,0xCA,0x3B,0xF2, + + 0xF4,0xAF,0xFF,0x28,0x10,0x40,0x86,0xD2,0xFC,0xDF,0xAA,0x15,0xD0,0x9D,0x01,0x15, + + 0x89,0x3D,0x82,0xEC,0x99,0x61,0x27,0x1C,0x0B,0x1A,0xE1,0x25,0x38,0x72,0x52,0xBB, + + 0x04,0x8F,0xBE,0x43,0xB3,0xFB,0x0F,0x06,0x61,0x04,0x84,0xE0,0x1F,0xD6,0x9C,0x6E, + + 0x25,0xB0,0xF9,0xD0,0x1C,0xD6,0xBF,0x12,0x60,0xC5,0x59,0x67,0x23,0x26,0x48,0x2E, + + 0x21,0xF3,0x75,0x27,0x10,0x3A,0xAE,0x45,0x40,0x5A,0x9B,0x64,0xAB,0x6F,0x1D,0x6B, + + 0xA1,0x1C,0x81,0xDC,0x7A,0x36,0x67,0xAD,0xE2,0x77,0xFF,0x4C,0xFD,0x7C,0x3C,0x79, + + 0xF3,0x93,0xCE,0x26,0xF1,0xB2,0x48,0x2A,0x21,0x19,0xA0,0x1C,0x7C,0x2A,0xDF,0x34, + + 0x62,0x9A,0x1B,0xEF,0x25,0x6B,0x91,0x3A,0x5F,0x25,0x2E,0x43,0xFA,0xC9,0x03,0xE4, + + 0xF8,0xA1,0x9B,0x1C,0x79,0x85,0x72,0x69,0x88,0x51,0x19,0xAF,0x2D,0x65,0x8B,0x26, + + 0xB1,0xDE,0x01,0xF4,0x70,0x5A,0x21,0xAA,0xFC,0xB4,0x8A,0x1C,0xBB,0xC0,0x46,0xCC, + + 0x18,0xF6,0xD4,0x2E,0x7A,0x39,0x68,0x9B,0x77,0x4A,0x8E,0x6E,0x4A,0xC8,0x6D,0xF9, + + 0xDB,0x0E,0xE7,0xAF,0x97,0x20,0xCA,0xFC,0x06,0xED,0x0E,0x94,0x26,0x20,0xE4,0xEC, + + 0x5E,0x4D,0xBD,0x4B,0x7B,0xAD,0x7A,0xF6,0x69,0xB1,0xC0,0xC9,0x12,0xDF,0x4D,0xE9, + + 0x0B,0x83,0x30,0x7A,0x3A,0x29,0x53,0x7D,0xE2,0xAE,0xA5,0xCD,0xCB,0x22,0x1E,0x82, + + 0xB2,0x18,0x15,0xA3,0x91,0x9F,0xA0,0xD3,0x18,0x5F,0x4E,0xA5,0x52,0x52,0x2A,0xBD, + + 0x59,0x0A,0x19,0xAA,0x05,0x73,0x9C,0x82,0x95,0x5E,0x23,0x85,0xD0,0xD0,0x87,0x92, + + 0x94,0x83,0x10,0xF7,0x4B,0xC7,0x2B,0xD0,0x8B,0x5D,0x58,0x21,0x8B,0xCF,0x6E,0xE7, + + 0x5E,0x7F,0x41,0xCC,0x65,0x62,0x0B,0x98,0x0A,0x62,0xA5,0x85,0x4B,0xDC,0x50,0x87, + + 0xE0,0xB6,0xFC,0x3E,0x9E,0x39,0x7D,0x1C,0x64,0x3E,0xEA,0x54,0x10,0x8B,0xDB,0xD2, + + 0x25,0xE8,0x60,0xAA,0xF1,0x55,0x14,0xD1,0x82,0xFA,0x08,0x67,0x0F,0xD8,0x0D,0xD0, + + 0xA4,0x9D,0xBA,0x41,0x8D,0x41,0x03,0x65,0xAF,0x74,0xAB,0x41,0x7F,0xDB,0xE1,0x43, + + 0x9F,0x1D,0x5D,0xCB,0xC3,0xC3,0xC0,0x73,0x72,0x42,0x0D,0x66,0x87,0x7D,0x38,0xB1, + + 0xF6,0x93,0x21,0xA1,0xC5,0xA7,0xAD,0x19,0x58,0xF7,0x36,0xDE,0x1A,0xF3,0x6F,0x58, + + 0x72,0xB4,0x71,0xEE,0x4B,0xE6,0x98,0x9C,0x02,0x68,0xFA,0xA3,0x57,0xAD,0x27,0x63, + + 0xC1,0x8B,0xB9,0xA1,0xD8,0x3A,0x06,0xB8,0x9C,0x7A,0xE9,0xAA,0xFE,0x68,0x11,0xA9, + + 0x56,0xE4,0x4F,0xC9,0x29,0xE6,0x9A,0x50,0x6D,0x36,0x4F,0xA6,0xD3,0xEF,0x06,0xF6, + + 0x4C,0xBC,0xD1,0xB7,0x1B,0xEC,0x6E,0x17,0xC6,0x51,0x54,0xFF,0x0E,0x3F,0x30,0xDE, + + 0xCA,0x9E,0x1C,0xD4,0x9E,0x92,0x26,0xDF,0x96,0x52,0xE0,0x59,0xB1,0x8C,0x95,0x39, + + 0x25,0xCF,0x9E,0x81,0x1F,0x91,0x37,0xA3,0x99,0xA2,0xF1,0xD0,0xD4,0x12,0x61,0x2A, + + 0x27,0xE2,0x19,0x5F,0x3B,0x45,0x3F,0xB2,0x5B,0x52,0xA1,0x58,0x12,0x3C,0x31,0x86, + + 0x3D,0xA6,0xD8,0x75,0x20,0xE2,0x0A,0xB0,0x44,0x1F,0x6F,0xD9,0xB5,0x4F,0xB8,0x55, + + 0xE4,0x27,0xAE,0x3E,0xFC,0xB0,0x83,0x42,0xC5,0xDE,0x78,0xF3,0x0C,0x35,0x1F,0x2F, + + 0xA6,0x6F,0x2B,0xEF,0x69,0xAD,0x9D,0x50,0xF8,0x34,0xFA,0x23,0xA9,0xFC,0xBC,0xE0, + + 0xB9,0x0E,0x05,0x85,0x97,0xAB,0x07,0x1F,0xA4,0xC7,0x28,0x28,0xE9,0xA2,0x5A,0xB1, + + 0x6C,0x2B,0xCD,0x6C,0x10,0xCE,0x4E,0x0F,0x65,0x84,0x8E,0xD7,0xDB,0x49,0x1F,0xBF, + + 0x77,0x3E,0x96,0x3B,0xE8,0xE4,0x49,0x10,0xB0,0xA0,0xAE,0x05,0x35,0x43,0xB3,0xBF, + + 0x4F,0x7D,0x36,0x07,0xDE,0x2B,0x51,0x56,0x44,0xDA,0xA7,0xF4,0xFC,0x49,0x96,0xD7, + + 0xF0,0xDA,0xEF,0x7F,0x17,0x70,0x41,0xF1,0x56,0x5C,0xA9,0x84,0xB5,0x8B,0x44,0x26, + + 0xE7,0xD9,0x55,0x7C,0xF7,0xB9,0x53,0xEA,0x04,0xD3,0x88,0xC6,0x80,0x27,0x3D,0x69, + + 0x7D,0x00,0xE5,0xDE,0x7C,0xEB,0x04,0x06,0x4B,0x92,0x10,0x8D,0xFC,0x85,0xCF,0x78, + + 0xB0,0x2C,0x9D,0x27,0x11,0x0C,0x3E,0x4D,0x8C,0x85,0xE3,0x36,0xC0,0xEC,0x0B,0xF1, + + 0x64,0xDA,0x21,0x15,0x3C,0x04,0xAD,0x48,0xBD,0xC4,0xD9,0xAE,0xDC,0xAB,0x32,0x53, + + 0x28,0x01,0xE4,0x23,0x61,0x8C,0xB2,0xAF,0x24,0x8E,0xCC,0xCB,0x94,0x4F,0xC6,0xB2, + + 0x93,0x4B,0x5E,0x3C,0xE4,0xEF,0x1A,0x31,0xFF,0xC0,0xF2,0x66,0xB6,0x4E,0x1D,0xFB, + + 0x67,0x0D,0x73,0xB0,0x3F,0x31,0xFD,0xEA,0xCF,0x8C,0xCD,0xCB,0x14,0x6D,0x23,0x1B, + + 0x89,0x04,0x36,0xF0,0xBB,0x50,0x80,0x5C,0x6E,0xC9,0xE9,0x80,0x34,0x8C,0x1E,0x32, + + 0xDB,0x4F,0xDC,0xA1,0xC9,0xBF,0xF4,0xF6,0x57,0x2D,0xE4,0xD4,0x9F,0x73,0x97,0x37, + + 0xD2,0x3C,0xBD,0xA4,0x55,0xF0,0xFC,0xE6,0x56,0x2C,0xE4,0x76,0x1F,0x5C,0x9A,0xB2, + + 0x05,0x6D,0xFB,0x65,0xF4,0x1F,0x4D,0x4B,0x68,0x9F,0x8B,0x17,0x79,0x54,0x38,0xAE, + + 0x4E,0xD7,0x6D,0xC3,0x37,0xBE,0x45,0xC1,0x0E,0xC2,0x69,0x67,0xFD,0x0C,0x1C,0xD3, + + 0x44,0x90,0xC4,0xDE,0x05,0x5C,0x8B,0xC5,0xC7,0xD2,0x92,0xDA,0x9D,0xB7,0x52,0x62, + + 0xAA,0x8E,0x54,0x25,0x59,0xB3,0xC8,0x8D,0xC4,0x58,0x6B,0x05,0x1D,0x58,0x09,0xB1, + + 0x4D,0x15,0x5D,0x34,0xD0,0xA6,0x5C,0x1F,0x3B,0xD9,0x59,0x94,0x9C,0x50,0xC8,0x45, + + 0xA4,0x47,0xCD,0x0F,0x16,0x28,0x03,0xDB,0x0E,0xC6,0xAF,0x64,0x83,0x58,0x18,0xA2, + + 0x5A,0x37,0x5D,0xA9,0x9D,0x24,0x08,0x82,0x4C,0xD5,0x09,0xBE,0xC3,0x73,0x16,0x65, + + 0xE5,0xA8,0xAA,0x1A,0x32,0x01,0x04,0x41,0x6B,0xF3,0xE4,0xF6,0xC0,0xF6,0x83,0xE9, + + 0x5B,0xFF,0x1C,0xD5,0x43,0x01,0xF3,0x2F,0xA1,0x42,0xC8,0x9E,0x9E,0xB8,0x8F,0x88, + + 0x9D,0xFF,0x84,0xE1,0x6C,0x07,0x0E,0xC8,0xBE,0xD2,0x81,0x0F,0x95,0xF0,0xA6,0x3A, + + 0x06,0xDE,0x26,0x9B,0x04,0x18,0xDA,0x79,0x55,0xD6,0xA4,0xD0,0x58,0x09,0xD1,0x38, + + 0x67,0x1E,0xD5,0x5A,0x72,0xEE,0x46,0xCA,0xDF,0x72,0x4D,0x4A,0x83,0x1E,0x3D,0xF6, + + 0x45,0xFA,0x9F,0xF3,0x55,0x4F,0xA2,0x98,0xDE,0x7F,0x23,0x6B,0xBB,0x27,0x4F,0xB5, + + 0x8B,0x84,0xC9,0x3D,0x9D,0x10,0xDF,0x89,0x8D,0xC3,0x84,0x04,0xF9,0x1D,0x54,0x7E, + + 0x81,0x0D,0x34,0x66,0xEB,0xDD,0x28,0x5F,0xC1,0x4D,0x24,0x46,0xAB,0x21,0x5A,0x2F, + + 0x6B,0x43,0xF6,0x12,0xF0,0xA2,0x19,0x46,0xFE,0x1D,0x98,0x09,0xAE,0xFC,0xBE,0x43, + + 0x21,0xD7,0x97,0x67,0xF0,0x26,0x48,0x27,0x25,0x9D,0xEF,0x22,0x71,0xF9,0x83,0x6D, + + 0x02,0x0E,0xA0,0xE6,0x1D,0xBE,0xA2,0x7F,0x20,0x7C,0x4A,0xCB,0xF5,0x65,0xDC,0x33, + + 0x3B,0x07,0x00,0x95,0x84,0x2C,0x90,0xB1,0x0D,0x06,0x8B,0xDA,0x54,0x2D,0xB9,0x13, + + 0x2E,0xA8,0xF0,0xAE,0xBF,0x28,0x0F,0xF4,0x08,0xAE,0x4F,0x26,0xA6,0x6A,0xFB,0x98, + + 0xE9,0xCD,0x07,0xC7,0x5F,0x3A,0x1F,0x78,0x40,0x33,0x10,0x16,0xE6,0x24,0x90,0xB1, + + 0xC0,0x01,0xB6,0xBD,0xB4,0x6A,0x99,0xA1,0x62,0x4A,0x6D,0x0A,0x70,0xCA,0xFD,0xCA, + + 0xA9,0xD7,0xFA,0x2B,0xE1,0x27,0x6B,0xEA,0xE9,0xB7,0x3C,0x77,0xF9,0xDE,0x6A,0x1A, + + 0x38,0x04,0xF3,0x7A,0xE6,0xA2,0xDC,0x82,0x4F,0x00,0xF9,0x18,0xDB,0x85,0xC3,0x9C, + + 0x7A,0x4B,0x13,0xFD,0xB7,0x5B,0x7B,0x4B,0x3F,0x08,0xF3,0x7A,0x09,0x67,0xF0,0x9B, + + 0x09,0xE2,0xBF,0x31,0x72,0x6F,0x21,0x46,0x6A,0x09,0x75,0x5F,0x03,0x6D,0xE8,0x08, + + 0xAB,0xD3,0xA5,0xB7,0x08,0x61,0x92,0xB9,0x6F,0x0E,0x47,0x97,0x29,0x6C,0x0E,0x98, + + 0x0D,0x4F,0x84,0xD2,0x1A,0xED,0x62,0x1A,0x2B,0xB5,0x88,0x81,0xDA,0xB6,0xF7,0x2B, + + 0x35,0x4C,0xA0,0xB7,0x17,0x6C,0x1D,0x70,0xCC,0xC4,0x0E,0x51,0xB1,0x1D,0x0D,0x1B, + + 0x2A,0xB2,0xAB,0x17,0x45,0xA4,0x22,0x89,0x4B,0x00,0x28,0xF9,0xE8,0x8B,0x66,0x95, + + 0x21,0x50,0x30,0xE6,0xCB,0xCD,0x90,0x91,0x0A,0xFF,0x54,0x20,0x54,0x7C,0xAC,0x83, + + 0x43,0x75,0xF2,0x92,0xD0,0xB2,0x62,0x00,0xE9,0xE2,0x27,0xF6,0xD0,0x8C,0x21,0xDB, + + 0x68,0xB1,0x93,0xE7,0xD0,0xB6,0x43,0xD3,0x8A,0xD1,0xAD,0xDE,0x71,0x7F,0xB9,0xF3, + + 0x5E,0x98,0xA4,0xB1,0x40,0x98,0x44,0xAB,0x04,0x55,0xB5,0xD7,0xCE,0xF3,0xBB,0x44, + + 0x01,0x2C,0x9D,0x9F,0x97,0x9B,0x6C,0x65,0x6C,0x36,0x45,0xE6,0xA4,0xAF,0xFD,0x54, + + 0x21,0xF7,0x9B,0x39,0x82,0x6E,0xDB,0x74,0x28,0x7C,0xC6,0x0C,0x73,0x37,0x0D,0x58, + + 0xA4,0x14,0x96,0xCD,0x17,0x99,0x1F,0x7C,0xC0,0x5B,0x64,0x18,0x00,0xC3,0x8D,0x51, + + 0x7A,0x1D,0xBF,0x2C,0xB1,0xAC,0x9D,0x21,0x10,0x15,0x04,0x86,0x2F,0x14,0x17,0xB9, + + 0x0A,0xB7,0xFE,0x88,0xBA,0x4D,0x38,0x4B,0xCB,0x43,0x56,0x2C,0x09,0x76,0x70,0x9F, + + 0xD4,0x16,0xB6,0xAC,0xE8,0x96,0xC3,0x3E,0xEB,0xF5,0x65,0x7E,0xD8,0xC6,0xA7,0xFB, + + 0xCA,0xD6,0xD0,0xA9,0x45,0x9B,0x32,0xDF,0x17,0x18,0xAF,0x52,0x7B,0x77,0x29,0x28, + + 0x2D,0xBF,0x2F,0xEF,0xDB,0xD7,0x6F,0xC6,0x4A,0x1A,0xF7,0xDF,0x0A,0x15,0xC7,0xBB, + + 0x13,0x1F,0x73,0x31,0x8B,0xE7,0x18,0x3C,0x6C,0xF6,0x75,0x48,0xA2,0x5F,0xFF,0xDA, + + 0x3B,0xB0,0xF0,0xAD,0x5B,0xE2,0xE1,0x18,0x26,0x5B,0x7B,0x8E,0xC0,0x62,0x79,0xD0, + + 0xC1,0xD5,0xB5,0x49,0xD5,0xBD,0x04,0x6D,0xA1,0xEE,0xF4,0x4D,0xFC,0x8F,0x52,0x79, + + 0x46,0x7F,0xB1,0xF0,0x5A,0x90,0x76,0xCF,0x4A,0xC0,0x68,0x58,0x0F,0x3C,0x18,0xF9, + + 0xF1,0x2F,0x9A,0xB6,0x85,0x0F,0xA8,0x50,0xC5,0xA4,0x1E,0xF0,0xF5,0x76,0x76,0xA2, + + 0x85,0x2A,0x28,0x94,0xA9,0x53,0x62,0x5C,0x2D,0xC2,0x78,0xB7,0x66,0xA3,0xF1,0x78, + + 0x6F,0xE1,0x05,0x23,0xFF,0xAD,0x19,0x25,0x65,0x3D,0x21,0xD6,0xB3,0x1D,0x7F,0x15, + + 0x07,0x4F,0x29,0x9E,0xC9,0xEE,0x47,0x35,0x24,0x40,0x68,0x80,0x3C,0x78,0x48,0x20, + + 0xF3,0x88,0xE4,0xA4,0x4A,0x59,0x76,0xAF,0x1A,0xC0,0x5C,0x8E,0xC3,0xA9,0xB5,0xDB, + + 0x01,0x87,0xC4,0x61,0x33,0x28,0xF7,0x4F,0xF4,0x88,0x38,0x4A,0xE6,0xEF,0x59,0x3C, + + 0x07,0x8B,0xFB,0x43,0xB7,0xE6,0xDB,0x11,0x39,0x4D,0x97,0x5A,0x3F,0x37,0x72,0x91, + + 0x26,0x78,0x97,0x6F,0x7C,0x16,0x61,0x83,0xC1,0x6D,0x7F,0x04,0xA3,0xA8,0x33,0xFA, + + 0x8C,0x87,0x59,0x06,0xB9,0x57,0x1C,0xD9,0xC0,0xC5,0xEA,0xE7,0xDE,0x24,0x76,0xF8, + + 0x66,0x8A,0x3F,0x1A,0x07,0x59,0x52,0x3C,0xCE,0xAD,0x82,0xD1,0x5B,0xCB,0x43,0x58, + + 0x31,0x27,0xFD,0xED,0x98,0x07,0xC8,0x6C,0x31,0x1C,0xBB,0x4D,0x2B,0x8F,0x2F,0x68, + + 0xAF,0xE7,0xD5,0x18,0x3C,0x34,0x43,0x2A,0xEF,0x40,0xF3,0xBB,0x9F,0x92,0x0A,0x28, + + 0xF9,0x82,0xBB,0x05,0xB9,0xBC,0xB8,0xEE,0x0D,0x53,0xF3,0x1D,0x22,0xA3,0x11,0x1D, + + 0x09,0x9F,0x99,0xB3,0x5C,0xF2,0x34,0xC2,0x49,0x67,0x84,0x47,0xBE,0x4E,0x5B,0xB0, + + 0x0D,0x83,0x1B,0xB3,0x2A,0x55,0xB3,0xBA,0xE7,0x8C,0xCD,0x42,0xB6,0x5F,0xE0,0x9B, + + 0xEF,0x02,0x94,0xDB,0xF0,0x89,0x7C,0xF9,0x4F,0x77,0xE8,0x8C,0xAF,0x4F,0x76,0x85, + + 0x88,0xF5,0x34,0xF9,0x5C,0xBD,0x6E,0x8B,0x18,0x7F,0x74,0x2E,0x21,0xF8,0x16,0x7C, + + 0x9E,0x8E,0x96,0x26,0xF8,0xF0,0x42,0xB5,0x41,0x4C,0xE4,0xFF,0x76,0x03,0x1D,0x70, + + 0x8E,0xED,0xB7,0x51,0x5F,0xF6,0x95,0xD1,0x86,0xA7,0x27,0x5A,0xFC,0xB0,0x9E,0x37, + + 0x59,0xF0,0xF7,0x9D,0xC9,0x1C,0x63,0x51,0xE1,0xD5,0x7D,0x37,0x8B,0xB1,0x3A,0x36, + + 0x98,0x30,0x75,0xB5,0x02,0xD8,0xC0,0x80,0x9D,0xBA,0x34,0x73,0x84,0xEF,0xFC,0xA0, + + 0xD8,0x68,0xD2,0xEF,0x5F,0xB8,0xA8,0x1A,0x44,0x98,0x43,0x10,0x53,0x9B,0xBF,0x3E, + + 0x5A,0x5D,0x83,0xB7,0xB5,0xCC,0xB5,0x32,0x3A,0xDE,0x59,0x99,0x51,0xE6,0xC1,0x40, + + 0xB0,0x9D,0x12,0xA4,0xC7,0xD4,0x1A,0x08,0xF5,0x9A,0xBD,0xC8,0xFF,0x9B,0x5D,0x71, + + 0x2A,0x7A,0x06,0xFC,0x5E,0xA4,0x83,0x0F,0x6A,0xEA,0xF6,0x3B,0x7A,0xDA,0xD7,0x71, + + 0x9E,0xDB,0xD6,0x9A,0xC0,0xFB,0x06,0x52,0x21,0x98,0xA7,0x1E,0xDC,0x10,0x73,0xF9, + + 0x93,0xDA,0xD9,0x88,0x98,0x11,0xB0,0xC9,0x1B,0xBF,0xBF,0x6F,0xE8,0x57,0xE9,0x3A, + + 0x58,0x97,0xEA,0x82,0x1C,0x24,0x41,0xBC,0x4C,0x44,0xE1,0x4B,0x41,0xD7,0x34,0x4E, + + 0x6D,0x91,0x1D,0xB1,0x5E,0xA1,0x15,0x10,0xE3,0x9E,0x96,0xAE,0x9A,0xF1,0x7B,0x58, + + 0x93,0xFE,0x15,0xAD,0x03,0xC2,0x1E,0xAD,0xAE,0xD0,0xE9,0x78,0x83,0x28,0x5F,0x35, + + 0x4D,0x97,0x18,0xB1,0xDC,0x39,0x39,0xF4,0xED,0x5F,0x89,0xD7,0x36,0x00,0xAF,0x0A, + + 0xC0,0x42,0x36,0xDF,0xC4,0xB3,0x04,0xDC,0x4E,0x60,0xEC,0xC0,0x87,0xBE,0xA7,0x29, + + 0x06,0x0B,0x92,0xF4,0x53,0x71,0x81,0xA4,0x0B,0x71,0xC9,0x30,0xF5,0x91,0x30,0xE3, + + 0x35,0x64,0x0F,0x74,0x51,0x1D,0x0E,0x91,0xBA,0xEC,0x20,0xF3,0x93,0xE8,0x61,0x83, + + 0x3C,0x00,0xF8,0x63,0x2B,0xA8,0x29,0xDB,0x6C,0x4F,0x69,0x57,0x3B,0x29,0x31,0xE2, + + 0xBD,0x88,0xC3,0xF7,0x08,0xDF,0x49,0x89,0x32,0x2D,0x91,0xBC,0x74,0xE2,0x18,0x4D, + + 0x20,0x85,0xD1,0x7C,0xDA,0x15,0x55,0x40,0x2A,0x95,0xA8,0x43,0x31,0x0E,0x97,0x54, + + 0x05,0x5C,0x76,0x45,0xF2,0x8A,0x10,0x58,0x45,0x3C,0x6C,0x84,0x51,0x6A,0xC5,0xE1, + + 0xAE,0xA6,0xD6,0x36,0xA2,0x25,0x6E,0xA6,0x00,0x36,0xA9,0x42,0x92,0x69,0x03,0xF1, + + 0x81,0xE7,0xD8,0xA6,0xAB,0x49,0x5C,0x31,0xE5,0x05,0x6D,0x85,0xF1,0x68,0xFD,0xFB, + + 0x7C,0xA7,0x3B,0x53,0x1E,0xE3,0x2D,0xB7,0xB9,0x9E,0xF1,0xCA,0x6B,0xED,0x5E,0x6A, + + 0xB2,0x82,0x4A,0xCD,0x53,0xD4,0x2D,0x05,0xB9,0x98,0x9A,0x5A,0x19,0x26,0x94,0xFA, + + 0xAA,0xA5,0x5F,0x89,0xB7,0xE7,0x1B,0x25,0x74,0xDB,0xC9,0x2C,0x7F,0x71,0x3F,0x30, + + 0x8F,0xA1,0xF3,0xED,0xDA,0x7A,0xAC,0x15,0x49,0x5B,0x23,0xFA,0x1B,0x77,0x12,0x44, + + 0x4A,0x81,0xFC,0x65,0xD8,0xD3,0xCB,0x93,0xBD,0x31,0xB2,0x2D,0xA3,0x61,0x67,0x23, + + 0x92,0x70,0xA8,0x43,0x1A,0xED,0x62,0x8B,0xC7,0xB0,0xFA,0x85,0xFA,0x0E,0x1A,0x49, + + 0x2D,0x4F,0xFD,0x65,0xFB,0x2A,0x2D,0x6F,0xE4,0xE8,0x99,0x96,0x79,0x68,0x9F,0xDF, + + 0xE3,0xB3,0x95,0x75,0xC7,0x84,0x4D,0x7F,0x34,0x92,0x3B,0x71,0xF9,0x3F,0xA3,0xBD, + + 0xB8,0x81,0x90,0x00,0x1F,0xFD,0xD4,0x71,0x36,0x5D,0xD5,0xC2,0x11,0x74,0x99,0x14, + + 0x44,0x9A,0x56,0x71,0x37,0x9B,0x89,0x34,0x22,0x3C,0xC5,0x87,0xD4,0x8E,0x2A,0xEA, + + 0x79,0xE7,0x2A,0xEB,0x6D,0x70,0x0D,0x38,0x83,0x00,0xF3,0x47,0xF3,0x70,0xA1,0xEE, + + 0x6B,0x30,0xCB,0xEA,0x12,0xB8,0x25,0x51,0xA3,0xD8,0xC4,0x4D,0x54,0x85,0x39,0x33, + + 0x40,0xC0,0x79,0x40,0x28,0xC4,0xC4,0xBF,0x9B,0xA8,0x57,0x44,0x66,0x14,0x2A,0x60, + + 0xC8,0x96,0xF2,0xFD,0x90,0x45,0x22,0xDD,0x88,0xC4,0x5F,0xF9,0xF1,0x71,0x91,0x86, + + 0x4B,0x55,0xFB,0xED,0x11,0x53,0xC5,0x93,0x09,0x07,0x85,0xE4,0xA6,0x77,0x73,0x70, + + 0x69,0x74,0x70,0xA5,0xE7,0x3E,0x23,0xC8,0x5C,0xAB,0xD5,0x05,0x0C,0x78,0xBD,0x1B, + + 0x0A,0x12,0x47,0xA0,0x3E,0xB2,0x5C,0x85,0xDB,0x15,0xD7,0xCA,0x19,0x7C,0x5A,0x93, + + 0x51,0x29,0xD4,0xB5,0x05,0x7B,0xC1,0xDE,0xF0,0x61,0xA4,0x54,0x79,0x36,0x85,0x97, + + 0x8A,0xEE,0x3B,0x7D,0xB0,0x35,0x6A,0x49,0xAC,0x41,0xF1,0x4F,0xF9,0x9A,0x7A,0x88, + + 0x5B,0xB6,0xC5,0xFA,0x0C,0x34,0x32,0x49,0xAA,0x2A,0x60,0xBF,0xC5,0x60,0x38,0x6D, + + 0xC3,0x9F,0x46,0x8D,0xE7,0x27,0xEB,0xB7,0x6C,0x17,0x16,0xE8,0x76,0x78,0xE5,0x9F, + + 0x25,0xC1,0xCF,0xAF,0x07,0x72,0xDA,0xB8,0x27,0xD0,0xFE,0xF4,0x92,0xC4,0xF4,0x6C, + + 0x99,0x5E,0x1A,0xBE,0x8E,0x71,0xEC,0x96,0x65,0xD8,0xD0,0x69,0x99,0x24,0x8B,0x13, + + 0x10,0xB0,0x96,0x34,0x52,0xAE,0x21,0xD1,0x00,0x6E,0xAD,0xF9,0xF7,0x3D,0xE3,0x60, + + 0x25,0x63,0xD9,0x6D,0xB3,0xA4,0x85,0x1B,0xBC,0xE3,0xB8,0x2F,0x37,0xFC,0x62,0x75, + + 0xA4,0x8A,0x68,0xC6,0xB8,0xAC,0xF8,0xCB,0x0F,0x4A,0xE1,0x04,0xF2,0x4C,0x7B,0x8F, + + 0xBC,0xC0,0xAD,0xF7,0xAC,0xD3,0x02,0x83,0x38,0xB3,0x49,0x25,0x94,0x6F,0xBA,0x48, + + 0x3C,0x3F,0xD3,0xF7,0xFB,0x28,0xF8,0x02,0xFD,0x81,0xA6,0x85,0xD1,0x23,0xDF,0x19, + + 0xFF,0xBD,0xF5,0xB9,0x99,0x09,0x26,0x65,0x40,0x9D,0x76,0xE2,0x3B,0xC8,0xA8,0x3E, + + 0xE5,0x38,0x79,0x26,0x97,0xBA,0xD4,0xE1,0x61,0x18,0x50,0x77,0xD2,0x35,0x39,0x47, + + 0x8F,0xAA,0xF4,0xD4,0xAA,0x0B,0x9B,0x9D,0x6A,0xCB,0x11,0x66,0x56,0xA6,0xA9,0xDA, + + 0xDB,0x8A,0xD7,0x7F,0xF6,0xA3,0x1F,0xD2,0xC4,0xE5,0x99,0x75,0xA2,0xEA,0x95,0x26, + + 0x0A,0x41,0x7E,0x23,0xAF,0xE5,0x78,0x4D,0x2F,0xE8,0x88,0xC6,0x04,0xA7,0xBD,0x64, + + 0xC7,0x58,0xBD,0x6C,0xAA,0xEB,0x80,0xC9,0x7D,0x44,0x75,0x58,0x97,0xB0,0x79,0x4C, + + 0x71,0x2C,0x4F,0x9C,0xAC,0xA2,0x4B,0x0F,0xFF,0x5C,0xCD,0x56,0x53,0xF1,0x63,0x0F, + + 0x59,0x5A,0xE5,0x92,0x3C,0xA0,0xC6,0xCB,0x65,0xBA,0xE1,0x3D,0x36,0xE4,0x1C,0xEB, + + 0xA2,0x81,0x83,0x0E,0x0A,0x08,0x52,0x7B,0x48,0xB5,0xA2,0x19,0x7A,0x37,0x33,0x5F, + + 0xDA,0xE1,0x7F,0xB6,0x2C,0xD0,0x6D,0x81,0xCF,0x6D,0x8F,0xFA,0x24,0x49,0x1D,0xEF, + + 0x7A,0xAD,0xF2,0x63,0x56,0x9F,0x76,0x2B,0xDA,0xB3,0xD3,0x92,0x93,0x55,0xAF,0x05, + + 0x81,0x91,0x13,0xDB,0xAA,0x28,0xC6,0x42,0x34,0xE7,0x44,0x1F,0xDB,0xA1,0xB3,0x70, + + 0x07,0xF0,0x84,0x96,0x20,0xE7,0x4D,0xC9,0xC3,0xA0,0xB3,0xC0,0x57,0xC1,0x27,0x63, + + 0x86,0xD1,0x91,0xB2,0xDC,0xFA,0xC1,0xDD,0xE8,0x77,0xAE,0xB7,0x8A,0x7C,0x1B,0xBF, + + 0x47,0x9B,0xA3,0x54,0xA8,0x92,0xC0,0xB2,0x23,0x5F,0xD5,0xF0,0x55,0xFF,0x13,0xBE, + + 0xA3,0x39,0xF5,0x86,0xB3,0x68,0xF4,0x73,0xD2,0x58,0x69,0x49,0xC6,0xF3,0xB6,0xDC, + + 0x4C,0xD6,0x1C,0xCE,0xDF,0x05,0x54,0x2F,0x60,0x8D,0xBF,0xC1,0xF1,0xB6,0x86,0x21, + + 0x0D,0xF0,0x37,0xC6,0x31,0x2E,0xFB,0x90,0x8C,0xC4,0xEC,0xF2,0x63,0xB7,0xFC,0x38, + + 0xA0,0xCF,0x1D,0xE3,0xC9,0xB6,0x07,0x8C,0xE0,0xE4,0x5D,0xEA,0x73,0xB6,0x55,0x20, + + 0x81,0xFB,0xF7,0x55,0xB6,0xD0,0xC9,0x91,0x0C,0xE6,0x26,0x76,0x1E,0xBC,0x33,0xE8, + + 0xDB,0xFD,0xE2,0x8C,0xD3,0xA3,0xEA,0x87,0xDF,0x95,0x0E,0x69,0xA2,0x25,0x10,0xA6, + + 0x5B,0x46,0x76,0x81,0x9E,0x3C,0xAB,0x3E,0x2E,0xB4,0x9E,0x34,0x7C,0xDB,0x1F,0xBA, + + 0xD0,0x65,0x65,0xE9,0x43,0x17,0x2F,0x4B,0x8F,0xEB,0xAD,0xAD,0x4F,0x71,0x71,0x79, + + 0xA9,0x36,0x50,0x77,0xB9,0xF4,0x07,0x55,0x0E,0xD2,0xDF,0xBC,0xE0,0xF6,0x00,0x7A, + + 0xC7,0xBF,0xBC,0xCF,0x9D,0x11,0xDA,0x79,0x16,0x71,0x5A,0x7C,0x6A,0xF4,0x3E,0xEB, + + 0x6B,0x20,0xCA,0x9E,0x5C,0x55,0x40,0xD2,0x0E,0xD9,0xAE,0xFE,0x73,0xBF,0x01,0x6E, + + 0xAD,0x16,0xF8,0x2F,0x93,0xB8,0x64,0x9B,0x6E,0xC1,0x0B,0x6B,0x81,0xC6,0xC3,0x49, + + 0xAB,0x95,0x97,0xF8,0xDC,0x17,0x1E,0x3B,0xAB,0x7B,0x20,0x26,0xF9,0xFF,0x82,0x84, + + 0x1B,0x59,0xB8,0x14,0xB3,0x2B,0x68,0xA2,0x45,0x44,0xEB,0x4B,0xDF,0xF6,0x88,0x13, + + 0xA5,0x1A,0xB0,0x04,0xB2,0x27,0xF0,0xAD,0x61,0x93,0x63,0x36,0x11,0xD1,0x21,0x67, + + 0xA0,0x62,0x03,0x87,0x59,0x1F,0x29,0x71,0x40,0x4D,0xD9,0x34,0x29,0xE2,0xC8,0x77, + + 0xA0,0x43,0xA7,0x7E,0x30,0xA4,0x9B,0x43,0x3A,0xBC,0xEE,0x25,0x42,0xBE,0x80,0xD4, + + 0x02,0x78,0x79,0x06,0xB3,0x59,0x07,0x93,0xC6,0xCF,0xC0,0x97,0xD6,0xE9,0xE5,0x3E, + + 0x9E,0x78,0x7F,0x69,0x8E,0xD8,0xFC,0x54,0x6D,0x9A,0x59,0x44,0x52,0xCA,0xFE,0x0E, + + 0x02,0x66,0xE9,0x27,0x66,0xF7,0xA6,0xD0,0xB0,0xE9,0x83,0x4E,0xD4,0x0F,0x89,0xD1, + + 0x8C,0x45,0x64,0xD1,0xBE,0x99,0xF5,0x02,0xB9,0xB1,0x79,0x07,0xB1,0x52,0x26,0x2E, + + 0x2A,0xF8,0x86,0x15,0xB4,0x25,0xD2,0x54,0x1C,0x04,0x7E,0xBE,0x18,0x60,0x32,0xAA, + + 0x05,0x69,0xA3,0xF4,0x7A,0x09,0x42,0x3D,0x4F,0x92,0xC3,0x3F,0x3A,0x49,0x47,0x8B, + + 0x55,0x05,0xF1,0xF8,0x88,0x2C,0xD3,0x0D,0x21,0xB3,0x96,0x68,0x8F,0x2A,0xE7,0x1B, + + 0x81,0x67,0xF3,0x1F,0xC9,0xD0,0x01,0xBD,0xB2,0x23,0x63,0x19,0x2C,0x62,0x02,0xDD, + + 0xF5,0xA7,0x75,0x50,0xE9,0x93,0x2C,0xD1,0xA3,0xDF,0x12,0xB1,0xAB,0xC1,0x58,0x78, + + 0x0D,0x0F,0xA2,0x3E,0xA4,0x23,0xED,0x09,0x3C,0x4D,0xE2,0x86,0xF7,0x60,0x3B,0x59, + + 0x3F,0x8B,0x38,0xC9,0xD4,0x0D,0xB0,0x9A,0xB8,0x0F,0x58,0xE9,0xFF,0x0B,0xBC,0x36, + + 0x8D,0x0D,0xF3,0xB3,0x18,0x22,0xE4,0x48,0xB1,0xE0,0x77,0xE2,0x2A,0xB9,0x7C,0x46, + + 0x24,0x5C,0xC6,0xE2,0xCB,0x2B,0x01,0x5D,0x04,0xEB,0xF7,0x46,0x54,0xFD,0x56,0x95, + + 0x82,0x17,0x84,0x9C,0xD0,0x7E,0xB0,0xC3,0x0D,0xF7,0xA6,0x5A,0xC4,0x33,0x81,0x03, + + 0xA5,0xD8,0x30,0xE3,0x3D,0x84,0x04,0x25,0xDD,0x30,0xCC,0x9E,0x57,0x33,0x85,0x5D, + + 0x02,0x15,0xD4,0xAE,0x16,0x7F,0x88,0xC2,0x85,0xF5,0x5D,0x5C,0x1A,0x17,0x84,0x3D, + + 0x24,0x16,0x69,0x40,0x1F,0x8A,0xEC,0x90,0xE2,0xF2,0xE1,0x60,0x2D,0xE9,0x0C,0xB4, + + 0x25,0x17,0x37,0x50,0x7D,0x16,0x1E,0x0F,0x8A,0x46,0x81,0xEA,0x75,0x1C,0x83,0x3E, + + 0x17,0x54,0x72,0xDC,0x41,0x89,0x2D,0xC5,0x0B,0xFF,0x08,0xE4,0xC5,0xDA,0x63,0xDD, + + 0x0B,0xFA,0xA5,0xB7,0x0C,0x39,0xF1,0x6E,0xC7,0xFA,0x1F,0x71,0xB5,0xEB,0x8E,0xE8, + + 0x4B,0xE3,0x12,0xA8,0xC6,0xC7,0x87,0x68,0x67,0x34,0xAC,0x4E,0xD4,0x77,0x76,0x1A, + + 0x2C,0x73,0x3B,0x7A,0xB9,0x5A,0x24,0x2B,0x59,0x86,0xB8,0x55,0x22,0xD4,0x7F,0xAE, + + 0xCB,0xE5,0x01,0xFF,0x4F,0x21,0x2D,0x3A,0xD0,0xA5,0x16,0x03,0x78,0x35,0x37,0xC9, + + 0xA1,0x14,0x78,0x63,0xF9,0xE0,0xB3,0xC6,0x23,0x2A,0xD0,0x7A,0x3B,0x73,0x60,0x11, + + 0x11,0x5D,0xFE,0x22,0xB9,0x31,0x01,0xD8,0x62,0xF3,0xA9,0x2B,0x87,0xCA,0xB1,0xAB, + + 0x59,0x7E,0x67,0x8E,0x3D,0x54,0x8F,0xC7,0x55,0xC6,0xDB,0x78,0x56,0xBF,0x79,0x70, + + 0xC2,0x13,0xBA,0x0F,0x1B,0x38,0x80,0x9B,0xCE,0x8B,0x6C,0x7E,0x59,0x76,0xB4,0x29, + + 0xA9,0xEE,0x35,0x5F,0x2E,0xC8,0x5F,0xFD,0xA1,0x82,0x64,0xE2,0x58,0x3D,0x28,0x06, + + 0x8C,0xC5,0xA0,0xFA,0x12,0xE0,0x98,0x27,0x60,0x6B,0x20,0xB6,0xAB,0x6B,0x92,0x72, + + 0x38,0x82,0x81,0xFE,0xB6,0x2C,0xAD,0xB0,0xC5,0x06,0xB9,0x34,0x51,0x8D,0x89,0x1E, + + 0xB7,0x36,0x2C,0xC8,0x75,0xA4,0xA0,0x23,0x0C,0x9B,0xB5,0x6D,0x29,0xFE,0xA8,0x96, + + 0xA7,0x83,0xC9,0x44,0x2C,0xAC,0x01,0x53,0x81,0xCE,0x6D,0xFD,0x26,0xF8,0xE3,0xBD, + + 0xB3,0xC6,0x9D,0x84,0xB7,0xA2,0x27,0x1C,0x2C,0x57,0xB8,0x6A,0xBF,0x3C,0x6A,0x3C, + + 0x01,0xC7,0x12,0xD4,0x82,0x29,0x2F,0x42,0xB8,0x6A,0x80,0x51,0xAA,0xEA,0x21,0xE8, + + 0xED,0x89,0x48,0x05,0x90,0xCF,0x0F,0xDB,0xE2,0x6B,0x31,0x03,0x7A,0x3B,0x32,0xD7, + + 0x85,0x65,0x29,0x27,0x99,0xAB,0xAE,0x00,0xB5,0x44,0xC7,0x2A,0xBF,0xEA,0x62,0xCC, + + 0x10,0x93,0x16,0xEC,0x1A,0xE8,0x6C,0x06,0x4C,0x67,0x96,0xC8,0x6F,0x5D,0x2F,0xF8, + + 0x3E,0xAB,0x12,0xE5,0x2E,0xDC,0x00,0xC9,0x29,0x66,0x9E,0x58,0x6E,0x5C,0x63,0x6D, + + 0x0E,0x89,0x27,0x2B,0xAF,0x2F,0xA6,0xAF,0xA1,0x20,0x0B,0xCF,0xDE,0xF1,0x93,0x99, + + 0xAF,0x7B,0x13,0x26,0x3A,0xB0,0xAD,0xC8,0xFD,0x64,0x43,0x4D,0x5F,0xF7,0x9D,0x24, + + 0x08,0x8E,0xDA,0x25,0x9F,0xA1,0x8D,0x99,0x38,0x8D,0xE0,0x0E,0xB5,0xA8,0x34,0xB8, + + 0x4F,0xD0,0xC2,0x3C,0xEB,0x7C,0xAC,0x09,0x29,0x44,0x66,0x72,0x3F,0xE9,0xAF,0xCF, + + 0x8C,0x22,0x5A,0x0D,0x3F,0xD3,0x2A,0x17,0x6B,0x68,0xC9,0xDF,0x66,0xAC,0x59,0x6B, + + 0xAB,0xCD,0x5C,0x62,0x02,0x52,0x5B,0x88,0x6C,0xDD,0x85,0x79,0x3E,0x6C,0x44,0xC3, + + 0xA8,0x9D,0xA2,0x84,0x44,0x6B,0x8F,0x31,0x50,0xDA,0xBC,0xA3,0x1F,0x4A,0x24,0x17, + + 0x84,0x19,0x87,0xAF,0x33,0xE8,0x5C,0xE1,0x97,0xDC,0x10,0x25,0x2E,0xFB,0x2F,0x03, + + 0x07,0x94,0x27,0xF5,0x4F,0x39,0x39,0x83,0xF4,0xDC,0xBD,0xD5,0x43,0xAF,0xAD,0x71, + + 0x04,0x1B,0xD3,0xF5,0x46,0xBA,0xD1,0x21,0xF8,0xDB,0x21,0xC4,0xCE,0x75,0x1A,0xC4, + + 0x45,0xE3,0xDC,0xF7,0x4A,0xBB,0xD7,0xDE,0xBA,0x25,0x32,0xF6,0x3E,0x2C,0xFC,0x21, + + 0x41,0xF0,0xBA,0xEA,0x94,0xF4,0x7C,0x81,0x13,0x53,0x7B,0xB6,0xB7,0xB4,0xB6,0x30, + + 0x2A,0x9B,0x85,0x89,0x40,0xBB,0x99,0x90,0x9A,0x50,0xCB,0xBB,0x7B,0x70,0x55,0x20, + + 0xC9,0xF9,0xD7,0x24,0xE2,0x13,0x7E,0xB3,0xA3,0x7C,0x83,0xF0,0x56,0x68,0x24,0x68, + + 0x8D,0x10,0x67,0xC9,0xC1,0x2E,0x35,0xD8,0xCF,0xA3,0xBE,0xEE,0x36,0xA5,0x26,0x78, + + 0xAF,0xD1,0xA6,0x9B,0xCC,0x4F,0xE5,0x39,0x6B,0x02,0xE3,0x46,0x7D,0xBB,0x37,0x69, + + 0x0D,0x12,0x5A,0xF5,0x33,0x4C,0x3F,0x50,0x93,0xC6,0x48,0x53,0xFC,0x4F,0x0B,0xF9, + + 0xEC,0xBB,0x52,0x77,0x59,0xF6,0x86,0x39,0x24,0x86,0xF9,0xC1,0x05,0x41,0x00,0x6A, + + 0xC7,0x6D,0x6D,0x93,0x1C,0x7C,0xE5,0xF2,0x05,0x2D,0x42,0x8C,0x85,0xBE,0xBC,0xAA, + + 0xAF,0x8B,0x61,0x2D,0x62,0x10,0xBE,0x8A,0x61,0xD1,0x2C,0x68,0xB7,0x1E,0x7D,0xC9, + + 0x1D,0x33,0x65,0x3F,0xBF,0x1F,0x77,0x69,0x7B,0xD2,0xE8,0x96,0xDA,0x5A,0xFF,0x2B, + + 0x5C,0x3E,0x60,0xEE,0x1E,0x3E,0x47,0x90,0x6E,0xD2,0x19,0x8D,0x14,0x59,0x5E,0x92, + + 0x04,0xF5,0xF9,0x7A,0x71,0x24,0x72,0x04,0xBD,0x02,0xA8,0xB4,0xF3,0xCD,0xEB,0x0F, + + 0xDF,0xAA,0x18,0x53,0x35,0xF5,0xD8,0xB0,0x4E,0x03,0xAF,0x09,0xA1,0xB0,0xA1,0x3F, + + 0x0C,0xD6,0xE0,0x45,0x94,0x4C,0x51,0x11,0x3B,0xBF,0x8F,0xCA,0xE7,0x62,0x6E,0x15, + + 0xEA,0x95,0x1A,0x0A,0xED,0xB7,0xD9,0x59,0x4C,0xF5,0x46,0xBF,0xA6,0x17,0xF8,0x7D, + + 0xA5,0x4A,0x47,0x56,0xF5,0x89,0x85,0x13,0x74,0xE7,0xF9,0x72,0x54,0x06,0xB0,0xD4, + + 0x20,0x05,0xEA,0x70,0xF8,0x41,0x0D,0xC1,0xB9,0xEA,0x98,0x12,0x55,0x67,0xC7,0x33, + + 0xB1,0x22,0x91,0xB4,0x31,0xD6,0xA2,0x92,0xF4,0xEB,0x43,0x55,0xC3,0x24,0x89,0x19, + + 0x83,0x45,0xF1,0xAB,0x3F,0x2A,0x0C,0x02,0xF1,0xE4,0xF7,0x64,0xA8,0x26,0x82,0x16, + + 0xEC,0xFC,0xD2,0x17,0x32,0x7C,0x6C,0x90,0xFD,0xDE,0x12,0xC1,0x5B,0x69,0x54,0x2A, + + 0x0D,0x45,0x20,0x29,0xB8,0x22,0x5A,0x79,0x4F,0x4B,0xCA,0x18,0x67,0x72,0xB5,0xF8, + + 0x60,0x4A,0x53,0x02,0xB6,0x2C,0x6D,0x84,0x35,0x08,0x81,0x29,0xD1,0x58,0x6A,0x17, + + 0x59,0x7F,0xC5,0xEE,0xEB,0x8F,0x4B,0xC2,0x34,0x09,0xAD,0x5B,0x26,0x07,0x0D,0xFC, + + 0x28,0xEC,0x3D,0x3F,0x47,0x8D,0x21,0x9B,0x78,0xB9,0xAD,0x0E,0xAD,0x09,0xB2,0x7C, + + 0x84,0x0F,0x4A,0x2F,0x4E,0xA8,0x0F,0x82,0xC8,0x43,0x2F,0xBB,0xA6,0xEB,0x41,0x3B, + + 0xB9,0x2A,0xFB,0x69,0xF1,0x21,0x86,0x57,0xFC,0xFB,0xEB,0x92,0xDC,0x15,0xFC,0x58, + + 0x06,0x03,0xB5,0x5B,0x53,0x20,0xBB,0x46,0xEF,0xE2,0xDB,0x03,0x19,0x2F,0x3E,0x73, + + 0xEA,0xBB,0xC1,0x99,0x91,0xAF,0xAD,0x3A,0x8B,0xA3,0x86,0xC5,0xCB,0x1C,0x6F,0xCE, + + 0x94,0xCD,0x58,0x92,0xF9,0x72,0xDC,0x30,0x43,0xEE,0xFF,0xF4,0x61,0xFA,0x67,0x85, + + 0x84,0xBD,0x31,0xE7,0x4B,0x96,0xAA,0x25,0xE2,0x1B,0x29,0x3E,0xEA,0x1F,0xA2,0xFE, + + 0x7C,0xC7,0x29,0x64,0x12,0x73,0xA2,0x35,0xEF,0x30,0x41,0x89,0x42,0xFE,0xBA,0x31, + + 0xBE,0xF6,0x1F,0xAA,0x0D,0x30,0x42,0x82,0x02,0x57,0xF4,0x6E,0x56,0x72,0x33,0x54, + + 0x02,0xFE,0x17,0x57,0x35,0xEE,0x72,0x03,0xEF,0x14,0x68,0x96,0x88,0x10,0xAD,0x4B, + + 0x80,0xC0,0x9A,0x3A,0xCD,0x2E,0x2B,0xE7,0x03,0xD5,0x7C,0xB7,0x53,0xE9,0xFA,0xD7, + + 0x57,0x73,0x74,0xA6,0xC8,0x3E,0x07,0x16,0x8B,0x06,0xE5,0x0B,0x5F,0x7A,0xB4,0x97, + + 0xC4,0x59,0x39,0x08,0x22,0xC8,0xD6,0x28,0x26,0x34,0x6E,0x3D,0x27,0xA8,0x50,0x0B, + + 0x2D,0xB2,0x4C,0x93,0x65,0x3D,0xB3,0xC7,0xF4,0x06,0x80,0xFA,0x35,0x62,0xA4,0x1F, + + 0x74,0xFC,0xBC,0x96,0x1B,0x78,0x70,0x56,0x1D,0xCC,0xB7,0x7A,0xFE,0x92,0x6D,0x9D, + + 0x8D,0xCF,0x67,0xA3,0x9F,0xCE,0x2C,0x00,0x11,0x88,0xBB,0xDB,0xDA,0xDA,0x86,0xA8, + + 0x75,0xC8,0xD6,0x3D,0x99,0x7C,0x28,0xEE,0x8B,0xDF,0x29,0xC8,0x7C,0x6E,0x78,0x5C, + + 0x0A,0x0F,0x0E,0x5C,0x19,0x3B,0x04,0x82,0x03,0x8C,0xE6,0x02,0xD7,0x70,0xF5,0xD6, + + 0x46,0xB1,0xF5,0x49,0xF8,0xCE,0x79,0x1A,0x66,0x1F,0xE0,0x6F,0x6F,0xA9,0x11,0xD6, + + 0xA7,0x51,0xE6,0xDB,0xBD,0x56,0x21,0xFF,0x0A,0xDC,0x22,0xB3,0x0E,0x23,0x07,0x26, + + 0xD0,0x46,0xBE,0xBF,0xA8,0x83,0x70,0x46,0x42,0x82,0xE9,0xDE,0xF1,0x16,0x4E,0xE3, + + 0xC7,0xC1,0xF3,0x19,0x13,0x4A,0xEB,0x5C,0x97,0x6E,0xAF,0x09,0x0A,0x6C,0x86,0x94, + + 0x65,0x2D,0x10,0xA7,0xEF,0xB4,0x28,0x64,0x1E,0x6D,0x71,0x4B,0x61,0xEA,0x57,0x8D, + + 0x6E,0x75,0xFB,0x65,0x6A,0x5E,0x6E,0x4C,0xC3,0xC1,0x42,0x49,0x58,0x15,0x08,0x5C, + + 0x60,0x70,0x44,0x62,0xFF,0xDE,0xE5,0x53,0x3E,0x65,0x60,0x98,0xAB,0x45,0xCC,0xD6, + + 0x26,0x6E,0xD6,0xAF,0x9A,0x23,0xD8,0x00,0x25,0x69,0x03,0x86,0x55,0x14,0xB7,0x58, + + 0x02,0x12,0xFB,0x43,0xB5,0x4F,0x49,0x53,0xB7,0x69,0xC9,0x98,0x23,0x85,0xA9,0x33, + + 0xD8,0x72,0xE1,0x17,0xD7,0x0C,0x07,0x74,0xE3,0xDC,0x87,0x71,0xB4,0x90,0x7C,0x91, + + 0x1C,0x27,0x0E,0x9D,0x75,0xA2,0xFE,0xAE,0x4E,0xCB,0xFA,0x1E,0xD1,0x45,0x85,0x61, + + 0xD0,0xC8,0x8C,0xBE,0x91,0x02,0xE9,0xBE,0x4B,0xD0,0x84,0x4A,0x9F,0xE9,0x40,0x55, + + 0x7D,0x56,0xB2,0x1C,0xB6,0xEE,0x4C,0x54,0xCA,0xA8,0x2D,0xBC,0xB5,0x55,0x88,0x8D, + + 0x51,0x6D,0xD3,0x1B,0x60,0xE9,0x97,0xA0,0x26,0xC3,0xC0,0x41,0xB5,0xE6,0xC2,0x74, + + 0x82,0xCE,0xBD,0x0F,0x3A,0x01,0xD3,0x1C,0x2E,0xEB,0x21,0x9D,0xD2,0xE1,0x2E,0x9C, + + 0x9D,0x8E,0xCA,0xA7,0xE0,0x56,0x54,0x89,0xC3,0x8C,0x16,0xE5,0xAE,0x64,0x7B,0xCA, + + 0xE5,0xFA,0xBC,0xAF,0xD8,0xD5,0x0D,0x6D,0x2F,0x4D,0x63,0x91,0x72,0xE3,0x88,0xA0, + + 0x89,0x75,0xE0,0xA3,0x19,0xED,0x45,0xDB,0xA7,0xC2,0xDB,0x95,0x2A,0x66,0xC7,0x9D, + + 0xFA,0x3F,0x70,0xBD,0x5D,0x2B,0x87,0x1F,0x98,0xD8,0x8A,0x7B,0x57,0x70,0xBC,0x61, + + 0xC5,0xDD,0xF2,0x2E,0x3D,0xC4,0x98,0xAD,0xE1,0x4D,0x86,0x5E,0xCD,0xBE,0x42,0x72, + + 0x76,0xD2,0xA5,0x94,0xDE,0xC1,0xF5,0x32,0x11,0x06,0x8B,0x6A,0xD5,0x72,0x4C,0x89, + + 0x75,0x27,0xFF,0x13,0x8C,0x95,0x84,0xE9,0x3C,0xAE,0xE4,0x80,0x50,0x7F,0x05,0x62, + + 0xF0,0x2B,0x84,0x06,0x62,0xF6,0xDE,0x11,0xEA,0x95,0xCE,0x0D,0xC5,0xB5,0x9F,0x7E, + + 0xEF,0x22,0xBC,0x54,0xA6,0x71,0x02,0xF4,0x86,0x56,0xCB,0x87,0x04,0xF5,0x43,0x7C, + + 0x98,0x32,0xA5,0x09,0xB0,0xB4,0x2F,0x8C,0x8E,0xD5,0x42,0xFE,0x81,0xF6,0x38,0xC0, + + 0x55,0x84,0x2D,0xB2,0x35,0xBF,0x53,0x00,0x6B,0x96,0x3D,0x66,0x02,0x0A,0x01,0x7B, + + 0xB0,0x8A,0x86,0x0F,0x03,0xB0,0x19,0x94,0x52,0x2D,0xFC,0xB3,0x83,0xE3,0x50,0x0C, + + 0xC6,0x7F,0x1D,0x3A,0x3B,0x62,0xD2,0xC5,0xA7,0x9D,0xF6,0xB3,0x4E,0x7C,0xCF,0x01, + + 0x88,0x17,0x9D,0x74,0x40,0xD9,0x64,0x2F,0xA6,0x07,0x82,0xC9,0x71,0x0C,0x71,0x08, + + 0xBD,0x34,0x16,0x1D,0x78,0x5A,0x01,0xBC,0x8C,0xDF,0x07,0x40,0xCE,0xCE,0xA6,0x17, + + 0xC1,0x37,0x25,0x4C,0xAF,0xF8,0x2F,0xF0,0x8B,0x7A,0xE0,0xF2,0x81,0x61,0x3E,0x44, + + 0xD4,0x30,0xE5,0x5A,0x7D,0x9F,0xC6,0x04,0xE2,0x20,0x69,0x01,0xCA,0x2E,0xC2,0x5F, + + 0x29,0x88,0x27,0x4A,0xDA,0x3F,0x2B,0x14,0xDD,0xEC,0x24,0xCB,0x4D,0x83,0xBA,0xEA, + + 0x51,0x30,0x2F,0x5F,0x76,0xB9,0x9C,0xDF,0x84,0xD0,0x04,0x94,0x85,0x40,0x39,0xB8, + + 0xF3,0x40,0x1A,0x72,0x13,0xD0,0x2E,0x19,0xE7,0xE4,0xDE,0x10,0xB9,0x31,0x1E,0x28, + + 0xEA,0x45,0x70,0x72,0xD3,0x01,0x38,0xAB,0xCC,0x5A,0xE0,0x3D,0xD1,0x57,0x40,0x3A, + + 0xE3,0x9D,0xD8,0x5F,0x35,0xA2,0x00,0x08,0x88,0x53,0xE9,0x02,0x39,0x13,0x53,0xAE, + + 0xEB,0x72,0x81,0x1C,0x83,0xA8,0xD6,0x57,0x0B,0x1A,0x09,0x73,0xDF,0x2F,0x9E,0xC3, + + 0x04,0x4D,0x36,0xC0,0x66,0x98,0x94,0x3E,0x4C,0x5A,0x0F,0x65,0x54,0x9F,0x4D,0xB2, + + 0x30,0xA1,0x77,0xDB,0xEC,0xF8,0xCD,0x83,0xC7,0xC8,0x6D,0x05,0xA8,0x9E,0xF6,0x23, + + 0x00,0x05,0xA9,0x27,0x21,0x4A,0x2C,0x9E,0xA1,0xFB,0x95,0x17,0x39,0x4C,0x89,0x35, + + 0x29,0x0A,0x28,0xB8,0x80,0x7C,0x0B,0x26,0xC5,0xED,0xDD,0xF1,0xAC,0xD5,0x7C,0x0F, + + 0x2C,0x05,0x00,0xEA,0x3C,0xA5,0x48,0x2A,0x4E,0x13,0x50,0x6A,0x12,0x24,0xBE,0x7A, + + 0xBE,0x6C,0x57,0x0D,0x62,0xD6,0xC1,0x4B,0x71,0x06,0x5A,0x44,0x0F,0x2B,0x7A,0x2E, + + 0x29,0x35,0xDA,0x57,0x3F,0x6B,0x42,0xE9,0x80,0x51,0x56,0xA9,0xF2,0x34,0x33,0xF6, + + 0x38,0x4A,0x54,0x34,0xEE,0x5E,0x8B,0xC4,0xCB,0x90,0x55,0x10,0x56,0x70,0x22,0xE8, + + 0x56,0x03,0x42,0xC8,0x66,0x25,0x70,0x98,0xE3,0x3D,0x12,0x39,0x53,0x63,0x60,0x88, + + 0x57,0xF2,0x82,0x5D,0x3F,0x6F,0xF4,0xFC,0x74,0x0A,0x8A,0x75,0x5D,0xA5,0x23,0x4B, + + 0xF3,0x03,0x6F,0xC9,0x88,0xF6,0x2D,0x6F,0x2B,0xCD,0x8A,0xED,0x7F,0x68,0xA7,0xCB, + + 0x87,0x07,0x5C,0xC2,0x2A,0x23,0xF8,0xDD,0x17,0x2C,0x37,0x82,0xDD,0x14,0x1A,0x78, + + 0x20,0x6B,0x95,0x00,0x7B,0xE2,0xC5,0x5E,0x99,0x63,0x12,0x04,0x7E,0xB2,0xCC,0x78, + + 0xED,0xBC,0xB1,0xCB,0xC9,0x20,0x7C,0xFE,0xD7,0x11,0x23,0xF3,0x7F,0x8E,0x94,0x70, + + 0x9E,0x83,0xBD,0xE5,0xA2,0xCE,0x6A,0xDB,0xD2,0xCD,0x7D,0x31,0x70,0x30,0x13,0xA0, + + 0xDD,0xBC,0x4D,0xE1,0xD2,0x5F,0x5C,0x8A,0x63,0x0F,0x71,0xDA,0x2F,0xF8,0x7A,0xB1, + + 0xFA,0x1B,0x28,0x40,0x20,0xEC,0x06,0xB7,0x64,0x2F,0x44,0x66,0xF2,0xF7,0x48,0xCD, + + 0xD6,0xE1,0x20,0x46,0x3B,0x3F,0x77,0x8E,0xB2,0x17,0x5C,0xB3,0x57,0x8E,0x67,0xB2, + + 0x01,0x1F,0xCD,0xD8,0x5B,0x4C,0xA5,0xBA,0x1F,0xEA,0xED,0x95,0x46,0x7F,0x35,0xC3, + + 0x90,0x55,0x4F,0x3D,0xEA,0x7A,0x1B,0x8F,0x76,0x8A,0xDC,0x68,0x90,0x64,0x91,0xFA, + + 0x42,0xC9,0x39,0x1F,0x04,0xE5,0xE7,0x2C,0x14,0x81,0xB6,0x46,0x4D,0x6E,0xC1,0xFE, + + 0xE3,0x68,0x2D,0xB0,0xE5,0x48,0x5F,0x65,0x6F,0xA8,0x76,0x39,0xB1,0xB0,0x79,0xB5, + + 0x25,0x01,0xE1,0xA1,0xBB,0xDA,0xE8,0x41,0xA8,0x18,0x9F,0xA9,0x7F,0x08,0x31,0xB5, + + 0xAF,0x40,0xA9,0xB5,0x81,0x9B,0xF0,0x3D,0xFB,0xF7,0x8E,0xAE,0x94,0x4A,0xBE,0x20, + + 0xA8,0xD1,0xB4,0xCD,0x3E,0x52,0xFF,0xA7,0x97,0x20,0x41,0x1F,0xFE,0xF1,0xE9,0x3A, + + 0xEB,0xB0,0xAA,0xAA,0xC0,0xC6,0xED,0x5C,0x97,0x3E,0xE6,0x02,0x18,0x7E,0xB8,0x21, + + 0xAC,0x53,0x57,0x8A,0x9E,0x25,0x64,0x4D,0x12,0x3D,0x85,0xEF,0x11,0x1A,0x37,0x5D, + + 0x8E,0xC8,0xCB,0x59,0xCE,0xEF,0x9F,0x68,0x1E,0xA2,0x48,0x0E,0x7F,0xF2,0x1A,0xF1, + + 0x70,0x2F,0x60,0xFA,0xA1,0x2D,0x85,0xA6,0x7F,0xC9,0xD1,0x50,0x96,0xC0,0x39,0x55, + + 0xCF,0x08,0x61,0xD6,0x3C,0x2A,0xF8,0x7E,0xB4,0xDA,0xB0,0x96,0x66,0xD7,0xB6,0xF0, + + 0xB4,0x2F,0xDC,0x6C,0x19,0x04,0xEE,0xA3,0xB3,0xB7,0xF0,0x51,0x16,0xE2,0x61,0xCB, + + 0x6C,0x72,0x75,0x3E,0x26,0xEE,0x5F,0x45,0x48,0x45,0x03,0xC8,0x2E,0xF8,0xE0,0xBF, + + 0x0A,0x74,0xD8,0xAE,0xDF,0xE6,0xC9,0xE6,0x0D,0x3C,0x28,0x20,0xE2,0xE2,0xD7,0xB0, + + 0x34,0xC7,0x91,0x11,0xEA,0xE7,0xD4,0xF7,0x92,0xA7,0x80,0xF2,0x20,0x39,0xE6,0xC1, + + 0xA4,0xF4,0x72,0x1C,0x15,0xAB,0xB1,0xB3,0x61,0x1A,0xA1,0x7E,0xB5,0xC6,0xD1,0x43, + + 0x20,0x9C,0x7E,0x9F,0x18,0xE5,0x10,0x98,0x38,0x4C,0x99,0xD7,0xC5,0x6C,0x34,0x68, + + 0xF3,0x25,0xBA,0xDB,0x7F,0x57,0x72,0xEA,0x52,0x08,0x9F,0x48,0xEB,0xF8,0x38,0x9A, + + 0xF2,0x54,0xD4,0x37,0xFC,0x06,0xCF,0xBE,0x39,0xA6,0xE0,0x3C,0xEE,0xB4,0xB0,0xAE, + + 0x7B,0x77,0xDD,0x23,0x77,0xDB,0x53,0x65,0x7A,0xD1,0x0B,0xC0,0x53,0x5C,0x79,0xB4, + + 0x7A,0x3E,0xBA,0xEF,0x35,0x0A,0x84,0x16,0x32,0x16,0xA1,0x3D,0x4F,0xE3,0x61,0x2C, + + 0xF9,0x03,0xA3,0x12,0x1D,0xEE,0x8A,0x47,0xA5,0x88,0xC7,0x8C,0xF2,0x67,0xD0,0xA1, + + 0xE6,0x24,0x11,0xDA,0x63,0xD4,0x34,0x68,0x2C,0x00,0x7E,0x8E,0x57,0xE2,0x7B,0xC6, + + 0xBD,0x88,0xBA,0x1C,0x98,0x7F,0x49,0xDB,0x03,0x8C,0xE3,0x8D,0x5C,0xED,0x4C,0xB9, + + 0x4F,0x70,0x47,0xDB,0xE3,0xB5,0xEE,0x88,0x4B,0x42,0x13,0x67,0x58,0x1A,0xF6,0x42, + + 0x74,0x3D,0xB5,0xF5,0x04,0xDC,0x34,0xA2,0x64,0xD0,0xED,0xE9,0xD1,0x79,0xB9,0x74, + + 0x16,0x4A,0x92,0xBF,0xD6,0xB8,0x5C,0xFC,0xD5,0xCA,0x1E,0xC0,0x9E,0xE0,0xB4,0x65, + + 0xB4,0x3F,0xC7,0x96,0xB5,0x1C,0x0F,0x4B,0x2E,0x1D,0x35,0xC7,0xEC,0xE9,0x13,0xBB, + + 0x02,0xFD,0x6A,0x67,0x8D,0x82,0x13,0x37,0x91,0xBC,0xBC,0xC1,0x1E,0xC2,0x5C,0x38, + + 0x8A,0x99,0x24,0x23,0x8E,0xAF,0xE1,0x1D,0x93,0x87,0xA6,0xE4,0x9D,0x90,0xD8,0xB0, + + 0xD8,0x93,0x3B,0xE4,0xC8,0x60,0xBC,0xCE,0xBE,0x97,0x50,0xD2,0x8A,0xFE,0x1A,0xE4, + + 0x07,0x49,0x27,0xA1,0xDD,0xB9,0x8E,0xC7,0xD5,0x31,0xCD,0x9B,0xD7,0xB6,0xBD,0x83, + + 0xA1,0x85,0x95,0x53,0xC4,0x4C,0xEA,0x6C,0x6A,0x95,0xC5,0x0B,0x77,0x0C,0x7F,0x52, + + 0x89,0x3E,0x66,0x5E,0x91,0x15,0xDA,0x2E,0x7E,0x00,0x6D,0x01,0x03,0xFA,0xF7,0x2E, + + 0x2C,0xC9,0x6E,0x4E,0x90,0xB4,0xA3,0x45,0x5E,0x75,0x43,0xCD,0x4D,0x9A,0x30,0xF8, + + 0xDC,0xD8,0xB2,0x6D,0xDC,0xE8,0x3F,0xA2,0xEA,0x2B,0x89,0x86,0x94,0xF7,0x11,0xA3, + + 0x0A,0x8B,0xAD,0x7D,0x04,0xF9,0xFF,0x33,0x57,0x99,0x46,0xCD,0x06,0xBB,0x51,0xCE, + + 0x59,0x18,0x26,0x9B,0x69,0xA7,0x37,0xB6,0x6D,0x3D,0xA6,0x17,0x3E,0x63,0xD1,0x94, + + 0x9A,0xDF,0x3A,0x0E,0xBE,0x35,0x07,0xDD,0xC3,0xB8,0x75,0x9E,0x7B,0x91,0xCA,0xB0, + + 0x33,0xC2,0x40,0xB9,0x7F,0xDD,0x17,0xA5,0x5E,0xD3,0x37,0x03,0x17,0x03,0x25,0xA1, + + 0x7A,0xF3,0xBF,0x30,0x47,0x16,0x46,0xB9,0x4E,0xC4,0x6F,0x38,0xDB,0xFF,0xC0,0x55, + + 0x09,0x42,0xD0,0xF7,0x94,0xAD,0xD0,0xCD,0xFE,0xED,0xEF,0xDA,0x56,0x62,0xD5,0xF4, + + 0x32,0x03,0x37,0xF6,0xF8,0x22,0x26,0xDC,0xA3,0x61,0x58,0xB0,0xE3,0x6B,0x8B,0xC6, + + 0x7F,0x40,0xD3,0x52,0x7B,0x46,0x47,0x93,0xC8,0x63,0x48,0xA7,0x15,0x05,0xB1,0xEE, + + 0x03,0x00,0x49,0x95,0x9E,0x61,0xD8,0x42,0xB2,0x2D,0x19,0xF2,0xF5,0x0F,0xEB,0x07, + + 0x0C,0xD8,0xA6,0x26,0xE5,0x99,0x90,0x9C,0x48,0xE9,0x0D,0x75,0xB3,0xDB,0x88,0x80, + + 0xBE,0xD9,0x58,0x93,0xFA,0x66,0x50,0x92,0x70,0xA7,0xA6,0xB9,0x6C,0xC5,0x85,0x8B, + + 0x39,0x59,0x56,0xBA,0x73,0xF5,0x89,0xA6,0x00,0x16,0x11,0x99,0x67,0xEB,0xE5,0xD4, + + 0x56,0x65,0xAF,0xE1,0x7A,0x04,0xE1,0x91,0xD9,0x0A,0xA6,0x88,0xC5,0xBC,0x07,0xEA, + + 0x3B,0x2A,0xC0,0xC9,0x9A,0xE4,0x70,0x2C,0x4B,0x2A,0x02,0xEB,0x5A,0x9D,0x6A,0xB8, + + 0x55,0x06,0x35,0xFE,0xF0,0x2A,0x24,0x8C,0x8B,0x49,0x39,0x88,0x85,0x8A,0x53,0x10, + + 0xD8,0x47,0xB4,0x52,0x3B,0x4F,0x2D,0x9C,0x0A,0x4E,0x97,0x6A,0x59,0x64,0x6B,0xB9, + + 0xD1,0x86,0x4B,0x9D,0xBC,0x69,0x53,0x30,0x44,0xB6,0xB8,0x95,0x01,0x58,0x2B,0xA3, + + 0xF1,0xF0,0xA4,0xFD,0x3E,0xD8,0x50,0x8E,0x4C,0xA5,0x67,0xE8,0x2D,0x31,0x21,0x13, + + 0xF6,0x31,0x51,0xAA,0xFA,0x82,0x24,0x4D,0xA0,0x5C,0x1A,0x95,0x47,0x2F,0xFA,0x16, + + 0x8C,0xD5,0xD0,0x56,0xE2,0x6C,0x9D,0x1B,0x21,0x8F,0xED,0xA1,0xFB,0x8F,0x15,0xBB, + + 0x8F,0x72,0x13,0xD9,0xEC,0xAB,0x25,0x50,0xB4,0x8E,0xC4,0xC3,0x59,0xA3,0x64,0xC4, + + 0x2B,0x9B,0x06,0xC3,0xB2,0xFC,0xC2,0x32,0x2B,0xFD,0x22,0x55,0x98,0x60,0x17,0xF2, + + 0xDE,0x9D,0x26,0xD4,0x90,0xE7,0x9C,0x77,0x45,0x3D,0x30,0xC7,0x4B,0xD7,0x81,0x63, + + 0x22,0x16,0x89,0xE7,0x6E,0x34,0xC7,0x33,0xE0,0x58,0xEB,0x97,0x75,0x64,0xC9,0x14, + + 0xAF,0x99,0x85,0x8D,0x33,0xFF,0x8D,0x35,0xEF,0x29,0xCE,0x46,0x29,0xDE,0x9F,0x1A, + + 0xDF,0xBB,0xC5,0x40,0xFA,0xA5,0x11,0xFD,0xC3,0x8B,0x9D,0x52,0x74,0x2F,0x34,0xBB, + + 0xC8,0x1A,0x11,0x9E,0x48,0x2C,0x6A,0x96,0x98,0x39,0x4C,0x76,0xB6,0x8B,0x3D,0xF3, + + 0x59,0x83,0x97,0xD6,0xCA,0x95,0xE1,0x83,0x1D,0x4D,0xFD,0x61,0xB5,0x4F,0x7F,0xE8, + + 0x5C,0xBA,0x12,0x9D,0xB5,0x4E,0xE2,0x6A,0x80,0x53,0xE5,0x65,0x50,0xFC,0x02,0x0A, + + 0x2D,0x82,0xF4,0xEE,0xE6,0x3E,0x76,0xFE,0x90,0x1A,0xC7,0x3E,0x78,0xD7,0x44,0x9D, + + 0x85,0x16,0xC6,0x98,0xB6,0x78,0xA9,0xE7,0xCA,0x3C,0x76,0x36,0x5B,0xAF,0x7F,0xF6, + + 0x69,0x78,0x2D,0x2A,0x19,0xEC,0xD7,0x2E,0x6A,0x96,0xB4,0x5C,0x64,0x1A,0x6F,0x9B, + + 0x92,0x16,0xD4,0x9D,0x3B,0xF7,0xA0,0x5B,0x82,0x58,0xE0,0xF7,0x44,0x67,0x3E,0x70, + + 0xDD,0x5D,0x5C,0x0A,0x2A,0x7D,0x2F,0x96,0x0B,0x58,0x0A,0xD5,0xC9,0x31,0x56,0x11, + + 0xD6,0x16,0xD9,0x6D,0x04,0x20,0x48,0x9A,0x94,0x80,0xA7,0x9A,0xF6,0xAB,0x1E,0xD0, + + 0x0F,0xE7,0xE1,0xF5,0xD8,0x9A,0x36,0xCD,0x1D,0xA3,0x2C,0x1D,0xD5,0x8F,0xC9,0x31, + + 0xF3,0xE2,0x90,0xF7,0xC4,0x2B,0x8B,0x07,0x02,0xCF,0x97,0xE9,0x98,0x14,0x58,0x00, + + 0x14,0x7D,0xE2,0xC3,0x96,0x6C,0x52,0xF3,0xB1,0x46,0x8E,0x9E,0x3F,0xEF,0x72,0x13, + + 0xA6,0x87,0x17,0xF4,0x5D,0xA2,0xA8,0x41,0x72,0xAF,0x47,0x45,0xF6,0x42,0xD9,0x81, + + 0xA6,0x32,0x16,0x58,0x37,0xC7,0x31,0xE3,0xA4,0xAC,0x31,0x15,0xBC,0x01,0x09,0x7E, + + 0x24,0x7C,0x89,0xB0,0xB1,0xA5,0x5B,0x37,0xC6,0xF1,0x6B,0xC4,0x13,0xA1,0x00,0x6D, + + 0x7C,0xC6,0x20,0xBA,0x1C,0xA2,0x2F,0x4A,0x40,0xBD,0x1F,0x04,0xA9,0x63,0xAC,0x0C, + + 0x09,0x9B,0x6C,0x53,0x98,0xA1,0x42,0xF0,0x8E,0x52,0xFC,0x09,0xD8,0x63,0x2B,0xA5, + + 0x53,0xEA,0x4E,0xA5,0x37,0x21,0xB5,0x43,0xD6,0x7B,0x71,0x62,0xDB,0x3C,0x14,0xBC, + + 0x81,0x2D,0xED,0x10,0x96,0xF7,0x01,0x8C,0xB0,0x85,0x79,0x37,0x9B,0x4C,0xE6,0x8F, + + 0x02,0x02,0x82,0x10,0xBD,0x22,0x0C,0xD2,0xAE,0xE8,0xAA,0x92,0x94,0x2B,0x52,0x65, + + 0x4E,0x69,0x15,0xE3,0x1D,0x76,0x1A,0x44,0x8F,0xC9,0xC4,0xA5,0x36,0x7F,0xA7,0x89, + + 0x89,0xF0,0x24,0x3F,0xD8,0x55,0x71,0xEC,0x31,0x4C,0x50,0x3C,0xB2,0x1C,0x4B,0xBB, + + 0xDF,0x84,0xF4,0x0B,0xF6,0xA8,0x73,0x36,0x40,0x66,0x3B,0xCC,0x39,0x44,0xE9,0xCE, + + 0x4D,0xC3,0x22,0xB3,0x07,0x01,0xB2,0x27,0xD1,0x8D,0x3F,0x6B,0x53,0x36,0xAE,0x90, + + 0xB4,0x32,0xE2,0x35,0x60,0x8D,0xFF,0x7D,0x24,0xC2,0xBB,0xFA,0x21,0x80,0xC8,0x0C, + + 0x80,0x52,0x3B,0x88,0x5C,0xFE,0x55,0x73,0x4A,0x6A,0x73,0x4B,0xD8,0x47,0xC4,0x34, + + 0x52,0xCD,0x2B,0x23,0x27,0xAE,0xFB,0x5F,0x7A,0x8D,0x3B,0x92,0x54,0xAD,0x6E,0x97, + + 0xA6,0xD8,0xAC,0xE4,0x83,0xD5,0x30,0xD1,0x46,0xBC,0x06,0x14,0x64,0x35,0x7A,0x16, + + 0x27,0xD0,0x15,0xC8,0x33,0x73,0x02,0x12,0x63,0xD3,0x8F,0xBE,0x91,0x44,0xBD,0x61, + + 0x80,0x66,0x9D,0x68,0x4B,0x6E,0x53,0x4A,0xE7,0x1A,0xC3,0x8D,0xCA,0x37,0xED,0x17, + + 0xF5,0x6C,0xAD,0xD0,0x37,0x7F,0xF1,0x37,0xE7,0x31,0x62,0xB7,0x76,0xFD,0x9C,0x31, + + 0x5F,0xD5,0x24,0xAB,0x53,0xF8,0xE3,0x11,0xE2,0x79,0x63,0x0C,0x83,0xBB,0xE5,0x94, + + 0x37,0x8E,0xB7,0x55,0x40,0x93,0x44,0xD6,0x04,0xD1,0xC6,0x10,0x8A,0x54,0xDA,0xB3, + + 0xA2,0x9D,0xE4,0xE3,0x81,0x90,0xF0,0x5F,0x0D,0xB2,0xAF,0x02,0x8E,0xE9,0x6A,0xAC, + + 0x00,0x38,0x2D,0xB6,0xAB,0xF6,0x03,0x11,0xF5,0x9A,0xC5,0xC6,0x56,0x08,0xE6,0x67, + + 0x92,0x4C,0xD4,0xEC,0xE2,0xBE,0xC9,0xD9,0x4E,0x9A,0x56,0x91,0x58,0x64,0x6E,0x27, + + 0x2B,0x9B,0xA6,0x1B,0xDC,0x86,0x6E,0x41,0x6B,0x4A,0x13,0x4F,0xDE,0xB9,0xF5,0x94, + + 0xC2,0xD8,0x0D,0x28,0x1D,0x6C,0x77,0xCF,0xEA,0xD8,0x88,0xF5,0x61,0x07,0x7F,0x1F, + + 0xAF,0xA6,0xD6,0xA0,0x9F,0x24,0x3E,0x4B,0x0A,0x7A,0x02,0x3B,0xBE,0x06,0x79,0xB8, + + 0xC5,0xD7,0x4A,0xBD,0x61,0x1A,0x6C,0xE8,0xA4,0xD3,0xC9,0xDF,0xDF,0x5D,0xEE,0x38, + + 0x0F,0xDD,0x96,0xCD,0x60,0xE7,0x2C,0xB4,0x84,0xB9,0xA4,0xF4,0x07,0xBF,0x07,0x9D, + + 0xC2,0x15,0x2E,0x4D,0x7B,0x40,0xE7,0x18,0x6A,0x53,0xCF,0x14,0x89,0x7E,0x68,0x5F, + + 0xD0,0xA7,0x34,0x81,0xC0,0x47,0xEF,0x94,0x10,0xBC,0xB1,0x82,0x5E,0x60,0xC0,0xD1, + + 0x71,0x0D,0x58,0x80,0x44,0xA3,0x6B,0x5B,0x28,0x4D,0x92,0xD5,0xEF,0x22,0xD5,0x11, + + 0x81,0x41,0x08,0x52,0x0B,0x27,0xAE,0x16,0xAC,0x23,0x65,0x2C,0x73,0x7E,0xED,0x9B, + + 0x81,0x82,0x41,0xFC,0x51,0x28,0xEE,0x5B,0xC6,0x2B,0xCF,0xCA,0x9A,0xC9,0xD4,0x11, + + 0x74,0x89,0xA9,0xEC,0x30,0x22,0xE2,0x16,0x60,0x21,0xE6,0xC4,0x6E,0x31,0xF7,0x68, + + 0x04,0x6F,0xCC,0x64,0x02,0xF4,0x0D,0x61,0xFB,0x28,0x4F,0x84,0x46,0x7F,0x39,0x6F, + + 0x33,0x45,0x08,0x00,0xCC,0xF8,0xF7,0x1B,0x9E,0x07,0x07,0x75,0x55,0xBC,0x5A,0x50, + + 0xB2,0x02,0x7E,0x55,0x1F,0x44,0x37,0x4D,0xC1,0x54,0xB5,0x1B,0x35,0xD9,0x95,0x29, + + 0x56,0xBA,0x65,0xD1,0xD6,0x7B,0x83,0xA3,0x4E,0xBA,0x5A,0x51,0x56,0xE5,0x06,0x65, + + 0x29,0xA8,0xBC,0x1D,0x67,0x68,0xEF,0x66,0xBD,0x14,0xB1,0xD2,0x80,0x97,0x72,0x05, + + 0x51,0xD7,0x55,0xAC,0x96,0x2B,0x7C,0x5A,0xBE,0xB4,0x61,0x39,0x32,0x16,0xC3,0xD8, + + 0xF9,0x97,0x43,0x38,0x2B,0x6A,0xA4,0x11,0x35,0x29,0xCD,0xC2,0xE2,0x69,0xE6,0x3D, + + 0xE2,0x5A,0x3C,0x1C,0x14,0x27,0x0C,0xC2,0x3C,0xD8,0x99,0xCC,0x66,0x29,0xE9,0x37, + + 0x48,0x05,0xCA,0xD1,0x38,0x3C,0x34,0x51,0xBF,0xEA,0x7A,0xE0,0xDF,0x5E,0x2A,0x18, + + 0x25,0x80,0x40,0x93,0xEE,0x52,0x49,0x67,0x33,0x79,0x72,0xE4,0x5D,0x9C,0x03,0x59, + + 0xA9,0x66,0xD1,0x32,0xDA,0x6C,0x40,0xA9,0x8E,0x9A,0x7B,0xE5,0x5F,0x8C,0x33,0xDB, + + 0x8A,0x6A,0x27,0xD9,0xDE,0x73,0xCE,0x70,0x4B,0x02,0xB2,0x95,0x55,0xA0,0x52,0xAC, + + 0xD7,0xBB,0x50,0xDA,0x1E,0xEC,0x02,0xBC,0x8B,0x80,0x85,0xD7,0x67,0xF2,0x5B,0xBF, + + 0x59,0x44,0x2F,0x8E,0x5A,0x45,0xA3,0xEA,0x67,0x2A,0x7B,0x74,0x07,0xDC,0x56,0x81, + + 0x68,0xE3,0xEC,0x6E,0x5B,0x86,0x95,0x7D,0x41,0xCE,0x6A,0xD6,0xC0,0x1E,0x1E,0xAA, + + 0x9D,0x86,0x0D,0x53,0x23,0x30,0xFD,0x33,0x28,0x54,0x8C,0xA5,0x1A,0x42,0xFF,0x9F, + + 0x24,0x1F,0xE8,0x3E,0x16,0xAF,0x4C,0xF4,0x09,0x85,0x8D,0x6F,0x96,0x2D,0x16,0xD1, + + 0x80,0x13,0xC8,0x29,0x33,0xEE,0x85,0xDF,0x5C,0x57,0x23,0x87,0x12,0x81,0xAB,0x43, + + 0xA3,0x75,0x70,0x3C,0xB0,0x4D,0x55,0xF2,0x8B,0xA7,0xEB,0x94,0x92,0xA9,0x45,0xF6, + + 0x42,0x18,0xA5,0x51,0xBB,0x22,0x7B,0xCD,0x8D,0xF3,0xA5,0xC7,0x0C,0x6C,0x97,0x0C, + + 0x47,0x9B,0x65,0x77,0xD1,0x9F,0xA9,0x4A,0xB5,0xC5,0xA8,0x85,0xF5,0xDE,0x6F,0xA9, + + 0x51,0xB6,0xD4,0xC6,0x8E,0x46,0x47,0x31,0xCC,0xC8,0x42,0x8D,0x41,0x66,0x39,0xB4, + + 0xAE,0xEB,0x89,0x3F,0x9B,0xFA,0xB8,0x09,0xB0,0xAA,0x5E,0x6D,0xC0,0xF1,0x18,0xE7, + + 0xC3,0x8A,0xAF,0x8D,0x0D,0xEC,0xE0,0x19,0xA9,0xBB,0x27,0xDD,0xA3,0xCE,0x99,0x65, + + 0x2C,0xED,0x9F,0x4F,0x5D,0x24,0xC1,0x40,0x15,0x4A,0xF9,0x9F,0xD9,0x33,0x14,0xD9, + + 0x88,0x5C,0x31,0xAC,0x7E,0x36,0xEE,0x04,0xD7,0xA6,0xBE,0xBD,0x8E,0x70,0xBE,0x4B, + + 0xAB,0x7B,0xA7,0xE2,0xB8,0x33,0x8C,0xE6,0xEC,0xF5,0xD6,0x92,0x5D,0x3F,0x11,0xF4, + + 0xA3,0x94,0x9F,0x5F,0x07,0x7D,0x1F,0xD6,0x97,0x0A,0xD5,0xFC,0xFD,0xB7,0x04,0xF3, + + 0x38,0x8C,0xC8,0x82,0x35,0x2A,0x4B,0x59,0x2C,0xCD,0xEE,0xC9,0x1E,0x4B,0x3F,0x78, + + 0xEC,0x28,0x4F,0xE7,0xCF,0xB1,0x8E,0xCC,0xE9,0xCC,0xC7,0xC7,0xEA,0x73,0x7F,0x3B, + + 0x66,0x29,0x9B,0xF4,0x42,0x0D,0xCE,0x59,0xC2,0xAB,0x4C,0x3B,0xF6,0xFD,0x3B,0xED, + + 0x6E,0x72,0xD7,0x8D,0x7E,0x66,0xC6,0xF4,0x5B,0x1E,0xE7,0xD8,0xD9,0x48,0x18,0xBF, + + 0x52,0x80,0xE8,0x5B,0xEB,0x0F,0x4E,0x4F,0xB5,0x69,0xF1,0x90,0x65,0x13,0x50,0x82, + + 0xD8,0x8A,0x62,0x99,0x9A,0xD8,0xE8,0xD2,0x53,0xFD,0x55,0x90,0x64,0x23,0x76,0xC1, + + 0x83,0xEC,0x99,0x42,0x76,0xE4,0x62,0x9C,0x37,0x19,0x09,0x6F,0x71,0xFD,0x09,0x17, + + 0xA8,0x0C,0x29,0x03,0x02,0xAF,0x29,0x73,0x82,0xC1,0x03,0x9F,0x49,0x28,0x18,0xF9, + + 0x78,0x25,0xDC,0x39,0x77,0x0D,0xD3,0x6A,0x08,0x14,0x4F,0x8E,0x7E,0xF7,0x62,0xB2, + + 0xE4,0xF8,0xCB,0x65,0xC8,0x34,0x95,0x49,0x35,0x68,0x45,0xFC,0xDE,0xAF,0xB0,0x4C, + + 0x46,0x03,0x22,0xFC,0x7C,0xE6,0x8A,0x75,0x11,0xB7,0xCC,0x11,0x2B,0x1F,0x39,0x0B, + + 0x72,0x06,0x00,0xF7,0xD9,0xC7,0x3C,0xC8,0x95,0xF6,0x0C,0x1B,0x3C,0x44,0x66,0xA8, + + 0x8C,0xC4,0xE3,0xCA,0x5B,0x9A,0x5C,0xC8,0xEF,0x73,0xAB,0xDD,0x3D,0xAC,0xE2,0x33, + + 0xAC,0xE8,0x68,0xDA,0x5A,0x9B,0xC0,0x89,0x3B,0xDD,0x02,0x0C,0x6C,0xAB,0x78,0x39, + + 0x2D,0x88,0xB9,0x4B,0x3D,0xAA,0x6B,0xD6,0xFD,0x0A,0x0B,0x67,0xBD,0xF4,0xAB,0xB3, + + 0x28,0x73,0xB1,0x5E,0x3C,0x7F,0xC1,0x88,0xB3,0x32,0x01,0x8E,0x83,0xAC,0x5A,0xBA, + + 0x22,0x61,0x11,0x39,0xE9,0xCD,0x9F,0xD8,0xB1,0x4F,0xA1,0x99,0x44,0xB2,0xB9,0xEC, + + 0x4F,0xC0,0xC4,0x54,0xB3,0x44,0x7C,0xC8,0xC2,0xD7,0x21,0xD0,0xAB,0xE3,0xC7,0xB2, + + 0x98,0x3D,0x0A,0xD9,0x01,0x6E,0x9A,0xDD,0x39,0xC9,0xA8,0x40,0x7B,0xE9,0x53,0xBF, + + 0xED,0x42,0x3D,0x50,0xB7,0x46,0x6D,0xBA,0x46,0xC8,0x05,0x29,0xF4,0x63,0x9B,0x31, + + 0x56,0x3B,0xDC,0x38,0xCB,0x6D,0xE7,0x1B,0x2A,0x96,0x8D,0x64,0xE7,0x1F,0x32,0x30, + + 0x7B,0x10,0xD4,0xAB,0x14,0x94,0xA3,0x72,0xDB,0x24,0xCE,0x09,0x83,0xFA,0x72,0x2B, + + 0x72,0x5B,0x1A,0x45,0x0A,0x34,0xAB,0x5C,0x91,0xA3,0xCD,0x16,0x55,0xA9,0x34,0xD1, + + 0xC3,0x16,0x8D,0xF8,0xBD,0xBA,0xCC,0xCF,0x9C,0xC1,0x3D,0x1E,0x51,0xF1,0x06,0xC9, + + 0x08,0x6C,0xA2,0xC9,0xBD,0xB6,0x72,0xD5,0xCB,0xDE,0x81,0x87,0x80,0xE9,0x93,0xD1, + + 0x2B,0xF0,0xF0,0x71,0x07,0xBA,0x9E,0xCC,0x9A,0xC9,0xAF,0x3A,0x02,0x93,0x34,0x90, + + 0xD4,0xA6,0x04,0x71,0x60,0x45,0x67,0xB6,0x4F,0xC1,0x77,0xC2,0x65,0x0F,0x15,0xC0, + + 0x50,0x27,0x54,0x9A,0xD6,0xC4,0x85,0x44,0xEB,0xA0,0xB9,0x96,0x7D,0xF5,0x1E,0x39, + + 0x1A,0x9F,0x19,0x7C,0x33,0x8E,0x2D,0xE5,0x68,0xC7,0xDF,0x1B,0xDF,0x7B,0xD6,0x25, + + 0xA2,0x30,0x15,0xA1,0x4A,0x42,0xC4,0x05,0x8E,0x02,0x73,0x9C,0x5C,0x9D,0x60,0xC7, + + 0x9D,0xAC,0x87,0xE0,0xB0,0xB3,0x05,0xCF,0xDD,0xAA,0xB7,0xFB,0x7C,0xDA,0xFE,0x44, + + 0x44,0xCE,0x8F,0xF0,0xF5,0xB2,0xC4,0xBC,0x31,0xD5,0x3F,0x03,0x5B,0xBE,0x3A,0xE8, + + 0xB0,0x4F,0xE0,0x40,0x2D,0x2F,0x70,0x76,0x41,0x5B,0xAA,0x63,0xCE,0x1F,0x51,0xD9, + + 0xA6,0x11,0x77,0x53,0xD3,0x11,0x10,0x34,0xCE,0x00,0xFD,0xDF,0xB0,0x77,0x7F,0x29, + + 0x6B,0x33,0xE1,0x07,0x58,0x2F,0x0A,0xA5,0xC6,0x33,0xAB,0xAB,0x67,0xEF,0xF1,0xEE, + + 0x87,0x5A,0x81,0x01,0x6C,0x4D,0xB5,0x15,0x4C,0x02,0xE0,0x37,0xDD,0x21,0x26,0x24, + + 0x01,0x44,0xC0,0x46,0x52,0x99,0x37,0x9E,0xC2,0xC4,0xC8,0x74,0xAD,0x08,0x37,0xA8, + + 0x03,0xD9,0x0C,0xD1,0x1D,0xAF,0xE3,0x90,0x03,0xDE,0xDA,0x8A,0xAE,0x09,0xE6,0x25, + + 0x6B,0xAF,0xD3,0xBF,0x61,0xBB,0xFD,0x1A,0x1C,0x99,0xEF,0x00,0x18,0x2F,0xF0,0x0F, + + 0x5E,0x7A,0x0E,0xAE,0xB1,0x06,0x43,0x73,0xD5,0x9A,0xBB,0x7D,0xD0,0xC5,0x70,0x77, + + 0x0E,0x3A,0xE0,0xE6,0x19,0xE8,0x3F,0x57,0xD1,0xC3,0x54,0x96,0x7A,0xC6,0x32,0xE3, + + 0x86,0xAF,0x1D,0xFE,0x3D,0x2A,0xD3,0x4A,0xBA,0xE6,0x65,0x4E,0x8F,0xB6,0x84,0x6B, + + 0x7B,0x6F,0xE3,0x49,0xA5,0x27,0xEC,0xD6,0x3F,0xFF,0x94,0x5F,0x55,0x9C,0x1E,0x63, + + 0x43,0x1A,0xCF,0x3C,0xEE,0x87,0xCB,0x43,0x44,0xED,0xA1,0xA6,0x22,0xE6,0xED,0xCC, + + 0x4C,0x0C,0x02,0x5C,0xE9,0x91,0x48,0x69,0x6B,0x2C,0x69,0x2B,0x98,0x7C,0xA6,0xCB, + + 0x22,0x05,0x66,0xC7,0x1A,0x5D,0xD0,0x7A,0x1F,0x90,0xA2,0x4E,0xA4,0x6B,0xEC,0x32, + + 0x57,0xF3,0xDB,0x4C,0xC0,0xD3,0xA0,0x74,0x8A,0xD5,0x9B,0x70,0x27,0xBA,0xCF,0x46, + + 0xA2,0x4E,0x74,0x9A,0x49,0x25,0x41,0x7D,0xEA,0x2F,0xFB,0x77,0x7A,0xB0,0xFC,0x88, + + 0xD9,0x5F,0x1B,0xC3,0xFA,0x5B,0xE9,0xE7,0xBE,0x0D,0x33,0xE8,0x99,0x98,0x9C,0x8F, + + 0x03,0xBC,0x53,0x2F,0x37,0xFA,0xA5,0xEE,0xBC,0x2C,0xC2,0x56,0x75,0xDC,0x82,0x3E, + + 0xF4,0xDE,0xCD,0x90,0xC7,0x9E,0xF6,0x61,0xF8,0x8E,0x55,0x25,0xA4,0x8D,0x5D,0xE1, + + 0xA9,0x18,0xBF,0x35,0xE9,0xE3,0xB2,0xEA,0x10,0xEF,0x94,0x87,0xF7,0x31,0x9B,0x82, + + 0x24,0x4C,0x92,0x04,0x2C,0x41,0x0C,0x02,0x82,0xCB,0x5C,0xE6,0xD3,0xFE,0x15,0x67, + + 0x25,0x07,0x9D,0xC7,0x09,0x71,0x61,0x90,0x47,0xF8,0x96,0x0A,0xD0,0x73,0x7E,0x45, + + 0xD6,0x6A,0x17,0xEB,0xDC,0x03,0xE6,0x9C,0x5A,0x5D,0x0A,0x07,0x5E,0x7B,0x38,0x55, + + 0xCA,0xA3,0x93,0xD2,0xB3,0x75,0xD2,0xC9,0x08,0x13,0xD5,0x70,0x52,0xFD,0x41,0x0C, + + 0x26,0x7C,0xB8,0xF1,0xB5,0x9E,0x15,0xAA,0xFD,0xA4,0xB9,0x28,0x7A,0x7B,0x53,0x1C, + + 0x68,0xC3,0xA0,0x61,0xB6,0x7B,0xA1,0xE3,0x90,0xD3,0xB1,0xC3,0xA0,0xE5,0x59,0x3D, + + 0xA0,0x6F,0xDD,0x4D,0xF4,0xE1,0x28,0xF6,0xCC,0xE6,0xE8,0x29,0xC7,0x0D,0x47,0x9D, + + 0x24,0x5A,0x55,0xAF,0x9D,0x77,0x9B,0x48,0x4A,0x59,0x24,0xE7,0x0D,0x43,0x7C,0x20, + + 0xB7,0x53,0x80,0x8F,0xC5,0x7E,0x6C,0x59,0x3F,0xF3,0x21,0x0E,0xDB,0xF6,0x8F,0xD0, + + 0xCC,0x06,0xC8,0x70,0x73,0x0E,0x46,0x7D,0xB6,0x20,0x23,0x1E,0xDA,0xF7,0x1E,0x4E, + + 0x4D,0x52,0xDF,0xCB,0xB9,0x7E,0xF3,0x8B,0x55,0xD1,0x38,0x0F,0x5B,0xF4,0xB8,0x3F, + + 0xBB,0x50,0xEF,0x03,0x52,0x6C,0xF0,0x09,0x10,0x8E,0xA0,0x1F,0x79,0x57,0x28,0x87, + + 0x37,0xBA,0x7F,0xBD,0x27,0x54,0xF9,0xE2,0x66,0x4B,0xD3,0xDC,0x70,0x14,0x16,0x3B, + + 0xA2,0x15,0x3E,0x92,0x32,0x14,0x84,0x50,0x7C,0xCA,0x78,0xB6,0x5A,0xA3,0x1F,0x2B, + + 0x23,0x92,0x1B,0x37,0x6B,0xE4,0x24,0x1B,0xC2,0x48,0x3F,0x3C,0xC5,0x1F,0x38,0x08, + + 0xBD,0x98,0xF9,0x0E,0xE9,0x78,0xAD,0x1C,0xE3,0x63,0xF9,0xA2,0x2A,0x48,0xDF,0x05, + + 0xCC,0x8D,0x62,0x44,0x06,0x59,0x83,0x7E,0x06,0x5F,0x4F,0x21,0x80,0xEC,0xF8,0xBA, + + 0x9A,0xC8,0x1B,0x46,0xDE,0x59,0x03,0x2D,0xB6,0x39,0x68,0xF4,0x52,0x8F,0x29,0x47, + + 0x5A,0x8F,0xFE,0x27,0xD6,0x76,0xB2,0x61,0xC2,0x4B,0x75,0x22,0x81,0x66,0x71,0xEA, + + 0x08,0x01,0x52,0x08,0xB3,0x53,0xE9,0x6D,0x92,0x33,0xC1,0xA7,0x20,0xE8,0x13,0x75, + + 0xAB,0x8C,0x8C,0xF3,0x93,0xB3,0xE2,0xDA,0x4E,0xB9,0xCA,0x2A,0xA5,0x6D,0x92,0x81, + + 0x1F,0xC4,0xB8,0xE1,0x9B,0x48,0x42,0xBE,0x06,0x08,0xFA,0x9E,0xA6,0xAB,0xA4,0x4C, + + 0xBF,0xD0,0x04,0x79,0xFD,0x8A,0xF3,0xFB,0x61,0x57,0x73,0xAB,0x1D,0xA8,0x48,0xDB, + + 0xC5,0x16,0x2B,0xFB,0x65,0x06,0x03,0xD5,0x61,0xC6,0x66,0x90,0x09,0xD3,0xE4,0x0A, + + 0x4E,0xC1,0xB4,0x41,0x78,0xF8,0xFD,0x4A,0x22,0x4C,0x92,0x2A,0x7F,0x61,0x4E,0xA7, + + 0x8E,0xCF,0x94,0xF2,0xF4,0x9E,0xD6,0x92,0xC7,0x00,0x72,0xB2,0xFC,0xEB,0x21,0xAD, + + 0xAA,0x55,0x35,0x44,0xAC,0x23,0x4D,0x13,0x4E,0x2E,0x8B,0x48,0x7D,0xE8,0x36,0x3B, + + 0xF8,0xAB,0xD5,0xF6,0x12,0x09,0x1D,0x03,0x8D,0x6B,0x73,0xAB,0x7C,0xE9,0x44,0xD4, + + 0x8A,0x8B,0xCA,0xEC,0x16,0x5D,0x06,0x5D,0xE6,0x98,0x03,0xEA,0x72,0x49,0x24,0x96, + + 0xAA,0xD0,0x00,0x19,0x8A,0x3C,0x04,0x62,0xB8,0xAE,0x11,0xF8,0x80,0xAD,0x6A,0x07, + + 0xA2,0xE3,0x22,0x21,0x7F,0x3F,0x15,0xC1,0x53,0xB7,0xAA,0x83,0x69,0x0F,0x81,0xB7, + + 0x4C,0x90,0x4C,0x79,0x54,0x85,0x84,0xE2,0x46,0x0C,0x83,0xC6,0x0E,0x68,0x3D,0x54, + + 0xC1,0xD8,0xFC,0xD3,0x5F,0x17,0xB4,0x12,0x77,0xD9,0x50,0x84,0x35,0x09,0x35,0x47, + + 0x80,0xD4,0x7C,0x2B,0x37,0xF4,0x39,0xEA,0x33,0xD1,0x53,0xAD,0xC2,0x49,0x26,0x32, + + 0xFA,0xD5,0xFD,0xC2,0xC9,0x96,0x0A,0x67,0x91,0xB5,0x8D,0xC3,0x2B,0x8B,0x92,0x23, + + 0xA4,0x36,0x8D,0xD5,0x27,0xBA,0x90,0xD7,0x06,0x08,0xD6,0x88,0x26,0xB5,0x7E,0x12, + + 0x2A,0xFA,0xDB,0xFC,0xAE,0xA7,0x8B,0xF7,0x93,0xDE,0xB6,0x2A,0x3A,0xF8,0x73,0x1E, + + 0x6C,0x43,0x5E,0x4D,0x3B,0x92,0x8A,0xC5,0xCE,0x64,0xB6,0xAE,0xA1,0x90,0x83,0x78, + + 0xCA,0xEF,0x9C,0x2F,0x51,0x58,0xBF,0xA9,0x19,0xD5,0x08,0x68,0x36,0x93,0x67,0x9F, + + 0x20,0xDA,0xC9,0x1B,0xF3,0x2C,0xFB,0x3E,0xAE,0x28,0x9F,0xB7,0x00,0x97,0xB1,0x39, + + 0xAA,0x11,0xFE,0x7A,0x5D,0xD7,0x2C,0xB0,0x1A,0x9E,0xBC,0x81,0xAB,0x90,0x56,0x21, + + 0xD2,0xF3,0x79,0x5A,0x4C,0x4D,0x66,0xC3,0xE2,0x5B,0x83,0x01,0x1C,0xD0,0x35,0x68, + + 0x45,0xFA,0x70,0x25,0x1B,0xB7,0xEE,0x18,0x4F,0x61,0x33,0xB1,0xF0,0xE0,0x08,0x9B, + + 0xE7,0x62,0x43,0xAC,0x96,0x19,0x7D,0x3B,0xAF,0x44,0xE8,0x0C,0x7B,0x72,0x52,0x57, + + 0xEB,0x64,0x40,0xFD,0xE9,0xDD,0x7B,0xDC,0xC0,0xBB,0xC6,0x5A,0x32,0x17,0x83,0x94, + + 0x42,0x4E,0xF6,0x12,0xF0,0xA2,0x58,0xDD,0xFB,0x03,0x0F,0xC7,0xD5,0xEA,0xBE,0xE3, + + 0x86,0xA8,0x97,0x67,0xF0,0x05,0x9F,0xD9,0x7C,0xF9,0xEF,0x95,0xB3,0x6E,0xA2,0x56, + + 0x8F,0xDF,0xD3,0xE6,0x1D,0xAE,0xC0,0x31,0xC7,0x03,0xBD,0x89,0x2D,0x27,0xEC,0xC5, + + 0xF5,0xF9,0x3B,0x3F,0xED,0x65,0x6F,0x5D,0xA9,0x00,0x2B,0x17,0x59,0xE8,0xCC,0xAD, + + 0xFC,0x44,0x64,0x16,0x90,0x67,0xFC,0x0E,0xE0,0xCE,0xA7,0x67,0x5C,0x5F,0x85,0xBE, + + 0x77,0x0F,0x2D,0xC5,0x6E,0x06,0x6B,0xD1,0x0F,0xE9,0x05,0xB5,0x73,0xBE,0xD9,0xD3, + + 0x03,0xFC,0xD1,0xED,0x43,0xF1,0xE3,0x4C,0x28,0x03,0x6C,0xB1,0xD7,0x3C,0xC6,0xC2, + + 0xB3,0xF7,0x66,0xF2,0x7B,0x08,0x96,0x0C,0x40,0x68,0x69,0xDD,0x2A,0x68,0xAA,0x6A, + + 0x6B,0xE5,0xB5,0x5B,0xD3,0x22,0x1A,0x38,0xB6,0x49,0x4E,0x12,0x7F,0xDC,0x59,0x7F, + + 0xF0,0xA5,0x67,0xF2,0x79,0x95,0x17,0xD6,0x37,0xB5,0xB5,0x5C,0xA2,0x1F,0x75,0x1E, + + 0x74,0x04,0xC3,0x88,0x9F,0xA0,0xE4,0xC6,0x3E,0xB4,0xCD,0x07,0xBB,0x2B,0x7A,0xE8, + + 0xE7,0x7D,0xE5,0xD3,0x71,0x9A,0x68,0xD8,0x87,0xE3,0x59,0xAB,0x58,0x99,0x52,0x4C, + + 0xE2,0xF6,0xB4,0x6F,0x70,0xA8,0xA2,0x45,0xA0,0x09,0x84,0xEA,0x5B,0xD9,0x7D,0xB4, + + 0xEB,0x5B,0xC2,0xC9,0xBB,0xC6,0xF7,0x0B,0x3D,0xC5,0xD7,0x2A,0x5B,0x60,0x51,0xF6, + + 0xA8,0xFD,0x4B,0x1B,0x09,0x8B,0x61,0xC9,0x06,0xE0,0x3D,0x8C,0x11,0x1F,0x3E,0x3C, + + 0xCB,0x74,0xFB,0xF7,0x55,0x53,0x07,0xA0,0x60,0x70,0x96,0xE2,0xE2,0xD4,0x72,0x96, + + 0xC0,0x92,0xF2,0x92,0x52,0x15,0x78,0xAF,0x59,0xDA,0xBB,0x45,0xED,0xB1,0x3F,0x06, + + 0x53,0x53,0xFE,0x75,0x31,0x83,0x0C,0xA1,0xE0,0x92,0x43,0xBF,0x38,0x61,0x23,0x62, + + 0x2D,0x52,0xDE,0xAA,0x35,0xEC,0xDC,0x35,0xA2,0x1E,0x75,0x3F,0xD3,0xA5,0x1D,0xE9, + + 0x87,0x78,0x92,0x40,0x13,0xCE,0x2B,0x64,0x15,0x37,0x94,0xDB,0x7A,0x18,0x34,0x2D, + + 0x2B,0xE8,0xFA,0x25,0xD3,0x75,0xFC,0x82,0x55,0xFA,0x96,0x16,0x32,0x65,0x81,0x43, + + 0x16,0x9D,0x05,0xA5,0xAB,0x99,0xE8,0xD0,0x9F,0xF9,0xFD,0x27,0x0B,0xFA,0xE1,0x42, + + 0xCA,0x1D,0x65,0x5F,0x7B,0xA4,0xF9,0x93,0x1C,0xEC,0xA3,0x66,0x98,0xC1,0x78,0x8E, + + 0xC9,0x9B,0xB9,0xBC,0xAA,0x87,0x2E,0x5B,0x5C,0x1A,0xE9,0x51,0x78,0x76,0x76,0xBC, + + 0xC8,0xB6,0x53,0x04,0x3F,0x62,0xA5,0xFF,0xA3,0x08,0x45,0xBC,0x1A,0x04,0xB6,0x7A, + + 0x24,0x87,0xBC,0x3D,0x24,0xA5,0x4F,0x2B,0x09,0x85,0xFF,0x2B,0x04,0x3B,0x9D,0x61, + + 0x15,0xA0,0x8F,0x75,0x0D,0x76,0x57,0x98,0x8A,0x59,0x08,0x42,0x0C,0xF8,0x52,0x38, + + 0x1A,0xED,0xE5,0xDF,0x40,0x88,0xD6,0xEC,0x1D,0x3F,0xD7,0xF2,0x9E,0x88,0x5B,0xE5, + + 0x98,0x50,0xAF,0x7C,0xED,0x82,0x00,0x32,0xFE,0xA0,0x80,0xCE,0x3B,0x3F,0x3E,0xAF, + + 0x5D,0x95,0x99,0xC2,0xB6,0x70,0xFA,0x96,0x77,0x1C,0x61,0x1C,0x12,0x3A,0xE3,0x47, + + 0x5C,0x5A,0x10,0xDD,0x38,0x31,0xF6,0x97,0x94,0x5F,0xC7,0x70,0x90,0x0B,0xB0,0xF2, + + 0xEE,0x21,0xF3,0xF6,0x34,0x11,0x34,0x22,0xBB,0x3F,0x6E,0x96,0xDB,0xE2,0x7A,0x44, + + 0xEE,0xE5,0xF2,0xAE,0xFC,0xAA,0xC7,0xCD,0x45,0x3E,0xD0,0xB2,0x74,0x6B,0x73,0xF0, + + 0x00,0x0F,0x61,0xF7,0x97,0xE0,0x31,0x22,0xC4,0x3D,0x06,0x26,0x59,0xEE,0x11,0xEC, + + 0xA1,0x56,0xBE,0x27,0xB5,0xE1,0xC6,0x33,0x3A,0xC3,0x16,0x4C,0x08,0x48,0x00,0x40, + + 0x5F,0x89,0xB1,0x5C,0xDE,0x97,0xD4,0x1C,0xE5,0x85,0xCA,0x95,0x94,0x30,0xAF,0xF2, + + 0xA6,0xB5,0x00,0xDC,0x35,0x73,0xC3,0x3C,0xAE,0x3C,0xCE,0x73,0x3C,0x60,0xA5,0xC6, + + 0x88,0x0C,0xC6,0xB6,0x0A,0xC6,0xDC,0x1C,0x5B,0x9A,0x43,0x78,0x3A,0x4D,0x30,0xB3, + + 0x81,0xE5,0x96,0xAA,0x97,0xA9,0x61,0xE7,0xA7,0x38,0xFD,0xF3,0xF6,0x95,0x74,0x1B, + + 0x66,0x03,0xF8,0xCE,0x44,0xAC,0x32,0xDA,0xCA,0x43,0x51,0x2E,0x80,0x1E,0x10,0xAA, + + 0xC4,0xC8,0x7A,0x3E,0x31,0x58,0x88,0x3A,0x4D,0xC9,0x7A,0x5E,0x10,0x42,0x54,0x37, + + 0x67,0xCE,0x1F,0x2B,0xBE,0x2B,0xD1,0xDB,0x16,0x41,0xED,0xB4,0xC0,0x67,0x94,0x22, + + 0x66,0xCF,0x95,0x6A,0xF5,0xA6,0xBD,0x3B,0xCD,0xCB,0x8D,0x3D,0xB6,0x6E,0x20,0x8A, + + 0x5E,0x88,0x8A,0xC8,0xE2,0xED,0x8D,0x18,0x2C,0x33,0xAC,0x61,0x4C,0xA2,0xAE,0xCA, + + 0x0C,0xED,0x46,0x1C,0x9C,0xEF,0xDA,0x14,0x39,0x62,0x25,0x7E,0xDC,0xE3,0xE5,0xA3, + + 0xA9,0xCC,0x0F,0xCF,0x62,0x8E,0x88,0x04,0xB2,0x61,0x92,0xCF,0x08,0x51,0x35,0xA6, + + 0x70,0xCE,0xF3,0xE7,0x99,0xA6,0xDF,0x19,0x30,0x42,0x1B,0x40,0xFB,0x81,0x64,0x6F, + + 0x20,0x6B,0xD6,0x82,0x38,0xFE,0xA7,0x26,0x27,0xBD,0x1E,0x58,0xA8,0xB4,0x28,0xB8, + + 0x52,0xE4,0x14,0x86,0x92,0xF0,0xF8,0x42,0x5D,0x60,0x78,0x4D,0xD9,0xFC,0x25,0x7F, + + 0x05,0xD0,0x31,0xA3,0x87,0xE7,0x0D,0x58,0x99,0xDB,0xCB,0xA0,0x55,0x9E,0xF2,0x13, + + 0xDE,0xA4,0x0E,0x33,0x69,0xD0,0xFD,0x63,0x48,0x58,0xAA,0x4C,0x14,0x90,0xDA,0x47, + + 0xDD,0x1F,0x04,0xF9,0x12,0xB2,0x8F,0x42,0x3E,0x26,0xB7,0x20,0xE4,0xF7,0x56,0x62, + + 0x93,0x3A,0x94,0x54,0xEA,0x3A,0x83,0x76,0x0C,0xCB,0x94,0x34,0xF1,0x00,0x3F,0xFE, + + 0x4D,0xD2,0x4A,0x25,0xD5,0x96,0x2C,0x6A,0x43,0xA7,0x16,0x1C,0x89,0xF6,0xC9,0xA8, + + 0x04,0x67,0xB7,0x0D,0x14,0xB1,0x52,0x8C,0x3E,0x6A,0x6D,0x73,0x84,0xA1,0xE6,0x73, + + 0xE4,0x65,0x98,0xFF,0xE4,0xB7,0xC9,0x48,0x0F,0x8A,0xCD,0xB1,0xF8,0x2C,0x82,0x08, + + 0x29,0x93,0x90,0x7C,0x13,0x66,0x82,0xD8,0x2F,0xD6,0x12,0x3B,0x0A,0xF9,0x3F,0x86, + + 0x45,0x5B,0x95,0xBE,0x1D,0x45,0x21,0x82,0xEA,0x50,0x13,0x88,0x50,0xF7,0x52,0x8A, + + 0xC9,0x9F,0x10,0xAF,0xBF,0x14,0xBC,0xB9,0x76,0x9A,0xA8,0x40,0x08,0x68,0x46,0x01, + + 0x0A,0x17,0x49,0x38,0xD7,0x36,0x8D,0x84,0x85,0x98,0xC8,0x93,0x5D,0x8C,0x54,0x6A, + + 0xE2,0x32,0x96,0xB1,0xFE,0xDE,0xDE,0x05,0xE0,0x6B,0xFE,0x7A,0x08,0x21,0x5B,0xF6, + + 0x45,0xDA,0x9F,0xE8,0x57,0x14,0x29,0xEC,0xEE,0x73,0xB1,0x92,0xF8,0xE5,0xCB,0xB9, + + 0x58,0x14,0x3B,0x0F,0x3E,0x07,0x77,0xEA,0x06,0x9B,0x3F,0x8B,0xFB,0xBE,0x60,0xA0, + + 0x5E,0x0D,0x88,0xA1,0xB3,0x26,0x85,0xA4,0x03,0x2D,0xC3,0x3B,0x2A,0x95,0x58,0x89, + + 0x62,0x21,0xF7,0xF6,0x35,0xAC,0x58,0x0F,0x49,0x2D,0x46,0x84,0x26,0x65,0x0B,0x05, + + 0x23,0x04,0x8D,0x03,0x31,0xA8,0xAE,0xC3,0xE4,0x2C,0x04,0x1B,0xE4,0x22,0x71,0x93, + + 0xA3,0xF1,0xF7,0x3D,0x78,0x32,0x31,0xF3,0xC7,0x4A,0x46,0x60,0xAA,0x54,0xE3,0xE0, + + 0xDE,0x27,0x33,0x7F,0xE8,0xB1,0x62,0x5E,0xE1,0x5F,0x09,0xCB,0x69,0x74,0xF5,0x30, + + 0x1D,0x77,0x7F,0x70,0xFA,0x2E,0xF3,0xF5,0xD0,0x7A,0x17,0xF6,0x71,0xA7,0x62,0xE5, + + 0x5A,0x65,0xB2,0x87,0x11,0x60,0xD5,0x3F,0x4F,0x24,0x88,0x65,0xD4,0x4D,0x77,0xF4, + + 0xBF,0xA8,0x34,0x2E,0xAF,0x58,0xA6,0x81,0x32,0xF6,0xE3,0x97,0x7F,0x9A,0x3A,0x58, + + 0x00,0x07,0x2E,0x9F,0x47,0x22,0x41,0xDB,0xAC,0xE7,0x52,0xD5,0x90,0x95,0x72,0x9A, + + 0x0C,0xC3,0x9B,0xF6,0xBC,0x20,0xDA,0x58,0x70,0x4A,0x22,0xC3,0x6A,0x6D,0x63,0xA9, + + 0xDE,0x87,0xC7,0xFD,0xB7,0x8B,0xA5,0xD8,0x20,0x5A,0x8B,0xB8,0xEB,0xEF,0x51,0x1C, + + 0x2A,0x49,0x8D,0x22,0xA9,0x69,0xF8,0xC2,0x58,0x36,0x23,0x00,0x7E,0x26,0xE2,0x3A, + + 0x60,0x4F,0xF8,0xE9,0xAD,0xD1,0x92,0x0C,0x99,0xB1,0xAA,0x48,0x2D,0x4C,0x74,0xF9, + + 0x37,0xA2,0xEA,0xB6,0x78,0x29,0x35,0x5C,0x3C,0x69,0x42,0x16,0xFA,0xD2,0x3D,0x4E, + + 0x2B,0xF1,0x6F,0xC2,0x2F,0xA7,0x2B,0x70,0x30,0x88,0x89,0x02,0xAE,0x2C,0xEB,0x2B, + + 0xE1,0x0C,0xAA,0x1D,0x97,0xDA,0x84,0x3B,0xCD,0x17,0x64,0x3A,0x01,0x67,0xC4,0x70, + + 0x8F,0xA1,0xDA,0x46,0x22,0x72,0x2E,0x1C,0x8B,0x96,0x3D,0x20,0x3F,0x0D,0x77,0xD7, + + 0xFF,0x1B,0x81,0x16,0x30,0x56,0x7E,0xA0,0x80,0x13,0x27,0x3A,0x86,0x1D,0xC5,0xE5, + + 0x23,0x1F,0x85,0x01,0xB6,0xC9,0x4B,0x32,0xE4,0xF9,0x39,0xDA,0x6E,0x8D,0x8F,0xCE, + + 0x50,0xEF,0xB7,0x77,0x33,0x1B,0x05,0x89,0xE7,0x5A,0x22,0x2E,0x04,0xE5,0xD4,0xA2, + + 0xD1,0x71,0x99,0x68,0xCE,0xAF,0x6E,0x1E,0x01,0xDE,0xDC,0xF1,0x8F,0xC2,0x77,0xA0, + + 0xA3,0x93,0xD4,0xD1,0x4C,0x15,0x16,0xED,0x42,0x17,0x4C,0xB3,0x8A,0x83,0x7D,0x06, + + 0x60,0x06,0x05,0x20,0xCE,0xCB,0xC6,0x0B,0x47,0xA9,0x2A,0x9B,0x20,0xA9,0x6D,0xF5, + + 0x21,0xEB,0x5D,0x28,0xB3,0x76,0x9A,0x8E,0xA0,0xA7,0x22,0x8F,0x25,0xA8,0xAD,0xF3, + + 0xFD,0xA8,0x22,0xEE,0x79,0x18,0x52,0x59,0xF4,0x18,0x9E,0xA9,0xF7,0x7C,0xA1,0xBC, + + 0xF5,0x68,0x2E,0x5E,0xB5,0x37,0x61,0x45,0x69,0x57,0x0E,0x3E,0x5B,0x8B,0x27,0x53, + + 0x75,0xC7,0xFF,0x4F,0x3B,0x34,0xFF,0x23,0xCA,0x8C,0x93,0xEA,0xFB,0x47,0xCF,0xD8, + + 0xC5,0x00,0xF7,0x5F,0x18,0x78,0x77,0x3F,0x15,0x1A,0xA7,0x6D,0x0E,0x74,0xBB,0xB7, + + 0x89,0x1A,0x2A,0x4C,0xC6,0x1C,0x4E,0xF8,0x22,0x26,0x46,0x9E,0x91,0x6D,0x2E,0x87, + + 0x90,0x60,0xD6,0xF8,0xEF,0xF8,0xCD,0x7C,0x20,0x8F,0x1E,0x2C,0xD6,0x70,0xE8,0x27, + + 0x53,0x11,0x6B,0x8F,0x39,0x7C,0x77,0xE1,0x89,0x7B,0x8D,0x61,0x92,0x6F,0x37,0x5B, + + 0x76,0x00,0x68,0xEA,0x50,0x9A,0x65,0x1B,0x16,0x10,0x33,0x6F,0xF3,0x77,0xFB,0x85, + + 0x73,0x2C,0x7F,0xC3,0x5C,0xB1,0x19,0x14,0xA6,0xD0,0x5C,0xB4,0x16,0xE8,0x12,0xE9, + + 0x01,0x5A,0xF2,0xE9,0xB2,0x0C,0x8A,0x08,0x55,0x04,0x80,0x66,0x5D,0xEE,0xFE,0x7B, + + 0xBB,0x0A,0x81,0x6D,0xA7,0x32,0x83,0x90,0x74,0xB1,0xB2,0xA5,0xDD,0x86,0x90,0xEE, + + 0x7A,0x0E,0x66,0x77,0xD1,0x98,0x0E,0xCE,0xC5,0xCD,0x29,0x45,0xE6,0xE7,0x1E,0x45, + + 0xFB,0x8B,0xB8,0x62,0xEB,0xC8,0x4B,0xE6,0x32,0xB8,0xF2,0x7A,0xA0,0x24,0x10,0x56, + + 0xE7,0x04,0x8F,0xA9,0x33,0x5E,0x51,0x9A,0xA9,0x87,0x86,0x70,0xB6,0x66,0x41,0x25, + + 0xA2,0x2D,0x86,0x07,0xD6,0x5B,0x28,0x30,0xC0,0x17,0x4E,0x97,0xE6,0x37,0x29,0xA0, + + 0x03,0x2A,0xE9,0x73,0xA8,0x87,0xEA,0x39,0xC1,0x36,0x53,0x84,0x5B,0xEA,0xD9,0xF1, + + 0x3F,0x5C,0xD6,0x69,0x91,0xCA,0x5A,0xAC,0xB0,0x89,0x4A,0x0A,0x85,0x15,0x49,0xDA, + + 0x13,0x92,0x82,0xFC,0x9C,0xCD,0x96,0x78,0xCE,0x34,0x7A,0xEB,0xE0,0x95,0x99,0xF1, + + 0x75,0xE6,0x5B,0x2B,0x1D,0xA7,0xDF,0xAB,0x30,0xEA,0x9C,0x75,0x29,0x76,0x8A,0x6D, + + 0xF4,0x82,0x83,0x19,0x1C,0xA5,0x29,0x3F,0x26,0x2D,0x04,0x70,0x48,0x36,0x1A,0xFA, + + 0xB2,0x23,0x3B,0x18,0x25,0x0F,0x9D,0xEE,0x5C,0x60,0x0D,0x4A,0xB5,0x88,0x14,0xB8, + + 0x1D,0xC0,0x7D,0x21,0x3C,0x7D,0x40,0x92,0x85,0x02,0xC0,0xDB,0xAC,0x83,0xC7,0x6F, + + 0xEF,0x8A,0x54,0xA3,0x98,0xC5,0x73,0x6B,0xCE,0xCE,0xCB,0x5E,0x7F,0x51,0x71,0x59, + + 0x45,0x80,0x36,0x5E,0xA8,0x63,0x22,0x21,0x68,0x8E,0x44,0xE4,0x2A,0x79,0x50,0x00, + + 0x98,0xF3,0x64,0xBB,0xE8,0x1B,0x0C,0x72,0x93,0xDF,0xD4,0xE2,0x33,0x7D,0x54,0xB5, + + 0xD8,0x9E,0x84,0x6F,0x37,0x2A,0xAC,0xD0,0x26,0x6E,0x84,0x66,0x8E,0xFE,0xE5,0x52, + + 0xD8,0x4F,0x34,0x84,0xDF,0xC3,0x0D,0xF3,0xE0,0xDD,0xCD,0x25,0xD6,0x00,0x74,0x34, + + 0x27,0xE6,0x58,0xA8,0xD8,0x66,0x45,0xD1,0xA4,0xF3,0xDD,0x17,0xAF,0x7E,0x5A,0x0B, + + 0x85,0x92,0x24,0xA6,0x24,0x1F,0xF7,0x5C,0x2E,0x0A,0xF2,0xD9,0x46,0xB6,0x14,0x72, + + 0xD8,0x2A,0xBC,0x48,0xCC,0x4E,0x78,0xB5,0xE6,0xDB,0xC2,0xDE,0xFA,0x73,0x6D,0xAC, + + 0xC5,0xB6,0x40,0xC3,0x31,0xA0,0xE5,0x24,0xE4,0x23,0xAF,0xAC,0xBE,0xE7,0x0D,0x93, + + 0x58,0x9A,0xED,0x15,0x34,0xF1,0xBD,0x93,0xA4,0x5A,0xFB,0xB7,0x1E,0xB6,0x71,0x0E, + + 0x67,0x69,0x3C,0x66,0xA1,0xF5,0x4E,0x8E,0xCF,0xDE,0xCE,0x2C,0xFC,0x41,0x56,0x72, + + 0x8F,0xD4,0xF7,0x88,0xD8,0x66,0xC5,0x58,0xCC,0x53,0x39,0x3C,0x5F,0x8B,0x9C,0x69, + + 0x00,0x67,0xBD,0x8B,0x9D,0x5A,0xBF,0x6E,0x4D,0x50,0x8F,0x50,0x3D,0x70,0xD0,0x6B, + + 0xE0,0x3A,0xAE,0xE9,0x42,0x6F,0x40,0x59,0xC9,0xDD,0xC7,0xBB,0x8A,0xBA,0x76,0xA8, + + 0x95,0xDD,0x51,0xEA,0xDF,0x23,0x08,0xDC,0x85,0x39,0x5E,0x73,0x4D,0xDA,0x79,0x5E, + + 0x0A,0x03,0x78,0x35,0x8C,0xFF,0x66,0x93,0x4D,0x0B,0x3E,0x82,0x2B,0xBF,0x5D,0x30, + + 0xCD,0x03,0x98,0x22,0xBC,0xE5,0x29,0xD8,0xFA,0x9C,0x4D,0x14,0x81,0xDE,0x57,0x2A, + + 0x0C,0x7F,0x29,0x7E,0x80,0x0E,0x00,0xC4,0x11,0x0A,0x23,0xD4,0x1E,0x50,0x9F,0xF3, + + 0x71,0x4C,0x92,0x3C,0xEB,0xAD,0x18,0x97,0xA1,0x4F,0x4D,0x25,0x54,0x40,0x2F,0xE6, + + 0x84,0x41,0x92,0x11,0xFA,0x65,0x52,0xCE,0xE2,0x4C,0x27,0x0D,0xBA,0x25,0x83,0x47, + + 0xDC,0x19,0xD3,0xA1,0x63,0x9F,0x71,0x61,0x26,0x4F,0xA0,0x57,0x23,0xD0,0xE1,0x14, + + 0xA5,0xFE,0xAA,0x12,0x70,0x2C,0x53,0x2C,0x80,0x4B,0xA3,0x89,0x3A,0x07,0x64,0xB9, + + 0x83,0x1F,0x3B,0x63,0xB3,0xDB,0x8B,0x64,0x23,0x45,0x2F,0x9B,0xAD,0x9B,0xF2,0xBF, + + 0x7C,0x13,0x92,0x51,0xB0,0x23,0x20,0xD0,0xBC,0xFA,0x27,0x8B,0xAC,0x9A,0xE3,0x37, + + 0x35,0x16,0x51,0xC7,0x93,0x5E,0x31,0xC1,0xCE,0xCB,0x2E,0x9A,0x2D,0x99,0x92,0x5E, + + 0x87,0x7C,0xC1,0x19,0x72,0x28,0x39,0xD1,0xCF,0xCC,0x26,0x8A,0x2C,0x98,0x14,0x6A, + + 0x60,0x05,0x05,0xB3,0x1A,0x55,0x6A,0xAA,0x49,0xCF,0xAA,0x14,0xAB,0xD5,0x30,0xA8, + + 0x98,0xA6,0x37,0xFE,0x79,0x7B,0x62,0x1C,0xCB,0x4A,0x35,0x18,0xDB,0x4D,0x11,0x03, + + 0x63,0x4E,0x13,0x89,0xDB,0x27,0xA8,0xCB,0x64,0xB7,0xCB,0xCE,0x05,0xF7,0xAF,0x7B, + + 0x7A,0x6E,0x4B,0xCD,0x34,0xA0,0x5A,0x99,0x8D,0x7B,0x16,0x5F,0xF8,0x0B,0x0A,0x8F, + + 0x08,0xF9,0x52,0xCE,0xC7,0xA3,0x56,0x8A,0x6E,0xC1,0x2D,0x93,0xA5,0x93,0x4A,0xA9, + + 0xC7,0x2D,0x17,0x5D,0x1F,0x76,0x60,0x83,0x4D,0x96,0x25,0x83,0xA4,0x92,0x47,0x0E, + + 0x0B,0x00,0xF9,0xAF,0x06,0x14,0xA8,0x36,0x3F,0xB2,0x2C,0x92,0x25,0x91,0x4B,0x9B, + + 0x08,0x49,0x40,0xDF,0x46,0xA0,0x8F,0x65,0x3D,0x3E,0x24,0x82,0x24,0x90,0xE7,0x7B, + + 0x5F,0x10,0x6C,0x14,0x14,0x9D,0x5E,0xBD,0xC3,0x56,0x20,0xDB,0xD3,0x31,0x9C,0xD2, + + 0x80,0x1D,0xC4,0x8C,0x37,0xAA,0xA8,0xCF,0xC2,0x10,0xC5,0x02,0xD4,0xF7,0x6D,0x43, + + 0x26,0xE7,0x1A,0xC2,0x7A,0x39,0x1D,0x0B,0x15,0x5D,0x85,0x2D,0xF2,0x1C,0x75,0xD3, + + 0x2D,0x1F,0x6C,0x11,0xC6,0xEF,0x44,0x6D,0x82,0x57,0x8E,0x3D,0x54,0xFA,0xE0,0xBB, + + 0x81,0x55,0xCF,0x93,0x4D,0xFF,0x6E,0x13,0x1F,0xFB,0x2B,0x1B,0x8D,0x8B,0x2A,0xA8, + + 0x61,0xB1,0x38,0x56,0x32,0x52,0x24,0xE0,0xC0,0x1B,0x23,0x0B,0x8C,0x8A,0xE9,0x29, + + 0x2A,0xDB,0x1E,0xC1,0xB6,0xAD,0x4E,0x63,0xE3,0x21,0x2A,0x1A,0x0D,0x89,0x15,0x33, + + 0x43,0xA8,0xF5,0x2A,0x52,0x38,0xEC,0xD5,0x61,0x1F,0x22,0x0A,0x0C,0x88,0xA6,0xCA, + + 0xAB,0xB3,0x46,0x6D,0x26,0x7A,0xEE,0xA0,0x89,0x17,0xB6,0x3E,0xF0,0x70,0x8C,0x5A, + + 0xAA,0x17,0x1E,0x1E,0x38,0xDC,0xE6,0xB0,0x0A,0xA6,0x0E,0xCE,0x86,0xF2,0x6F,0x09, + + 0xAE,0x80,0x5C,0x9F,0xF0,0xC3,0x4E,0x64,0x8B,0xA1,0x17,0x6A,0xDC,0x16,0xAF,0x5B, + + 0x25,0x15,0xB7,0x63,0x3B,0x33,0xE7,0xCB,0xDA,0x83,0x63,0x80,0xFF,0x32,0x86,0x25, + + 0x3E,0x5D,0x79,0x2E,0x1E,0xC8,0xF6,0x9A,0xC9,0x5A,0x29,0x13,0x85,0x83,0x66,0xDE, + + 0x2D,0xE6,0x79,0xF0,0x3F,0x26,0x26,0xFC,0x1C,0x1C,0x21,0x03,0x84,0x82,0x6F,0xAB, + + 0x2B,0x7A,0x56,0x49,0xC9,0xCE,0x87,0xAD,0x49,0x3B,0x28,0x12,0x05,0x81,0xD5,0x1B, + + 0x2F,0x11,0x06,0x7D,0xA7,0x9F,0xE0,0x3E,0x31,0x57,0x20,0x02,0x04,0x80,0x18,0xF9, + + 0xA8,0x8D,0xA4,0xE4,0xE9,0xE2,0x6A,0x09,0xE7,0xA5,0x30,0x5B,0xC7,0x4D,0x71,0x72, + + 0x01,0x93,0x1C,0x6D,0xB6,0xE0,0xBE,0xC2,0xFD,0xCE,0x38,0xF6,0xC2,0xA3,0xDA,0x24, + + 0x25,0x7D,0xEF,0x33,0x65,0xAD,0x6B,0x01,0x67,0xC6,0x6E,0xD5,0xF5,0x82,0x1D,0xD4, + + 0x87,0x76,0xF0,0x98,0xD1,0xE1,0x8D,0xC3,0xE5,0xCC,0x62,0x11,0xF1,0xF8,0xD7,0x66, + + 0x84,0xCC,0xBA,0x47,0xB5,0x00,0x0A,0x46,0xC4,0xEC,0x0F,0x99,0xA9,0x1B,0x08,0xF6, + + 0x46,0xC7,0x63,0x25,0x34,0x01,0x00,0x55,0xE6,0x4F,0x07,0x89,0xA8,0x1A,0x3E,0xB3, + + 0x82,0x89,0xAD,0x8E,0x92,0xFD,0x4E,0x01,0x85,0x19,0x0E,0x98,0x29,0x19,0x28,0x00, + + 0xCD,0x2D,0xF2,0xB5,0x77,0x18,0x82,0xF7,0x82,0xD8,0x06,0x88,0x28,0x18,0x26,0x4D, + + 0x8D,0x86,0xFD,0xF1,0x2F,0xDE,0xC2,0x3E,0x68,0xCE,0x51,0x58,0xD1,0x6E,0x32,0x9B, + + 0x66,0xFD,0xA2,0x16,0x1B,0x00,0x5A,0x7A,0xFB,0xC4,0x59,0x48,0x19,0xAB,0xE3,0x6B, + + 0xA8,0xC8,0x19,0xC8,0x5E,0xEA,0x3B,0x84,0x2D,0xC5,0x70,0xEF,0x8C,0xF1,0xAB,0xDD, + + 0x1F,0x88,0x8C,0x9B,0xAA,0xFD,0x71,0xC5,0x6E,0xC6,0x60,0x9C,0x28,0xE4,0x2C,0x9B, + + 0x2A,0x70,0x22,0xA3,0x0A,0xED,0xE2,0x9B,0xED,0x8C,0x0D,0x91,0xA1,0x13,0xFD,0xA5, + + 0xEE,0x0E,0xB3,0x5F,0xB8,0xB6,0xDA,0x09,0xEC,0x4E,0x05,0x81,0xA0,0x12,0x79,0x4E, + + 0x53,0x03,0xD9,0xA7,0x5E,0x61,0x41,0x5B,0xFE,0x61,0x0C,0x90,0x21,0x11,0xBB,0x44, + + 0x0B,0x20,0xAD,0xB9,0xBB,0xED,0x8A,0x88,0x43,0x8E,0x04,0x80,0x20,0x10,0x5C,0x40, + + 0x85,0xD3,0x12,0xE4,0xB9,0x66,0xCC,0x4A,0x7D,0x9F,0xDC,0xC4,0x83,0x9C,0x54,0x10, + + 0x24,0xD6,0x40,0x94,0x3D,0xDD,0x98,0xF3,0xA0,0xE4,0x3D,0x55,0x71,0xAA,0x45,0xC3, + + 0x0A,0x1F,0x09,0x18,0xB5,0xD2,0xA5,0xE0,0xA0,0xFE,0x71,0x45,0xA8,0x05,0x15,0xC3, + + 0xAD,0x9C,0xE5,0x75,0x91,0x1E,0xB7,0xF2,0x20,0xA6,0xE7,0xC4,0xD6,0x9F,0xC0,0x00, + + 0x87,0xD7,0x4C,0xCB,0x30,0x77,0x76,0x9D,0xBC,0x2B,0x0B,0x19,0x89,0x0B,0xE8,0x30, + + 0x21,0x8C,0x8C,0x85,0xC5,0xB8,0x83,0xD6,0xBB,0x91,0x03,0x09,0x88,0x0A,0x05,0x87, + + 0xF9,0x1D,0xD1,0xE3,0xFE,0xFD,0xE5,0xA4,0x1F,0x20,0x0A,0x18,0x09,0x09,0x6D,0x51, + + 0xA2,0xF3,0xEF,0x35,0x93,0x48,0xDE,0xF4,0x5A,0xDE,0x02,0x08,0x08,0x08,0x1E,0x5A, + + 0x70,0x10,0xB8,0xBE,0xCB,0x19,0xA4,0xAB,0x57,0xD8,0xD4,0xBF,0x7F,0x98,0x5E,0xE4, + + 0x8E,0xFC,0xBC,0x9E,0xC2,0x14,0x2F,0xB9,0x34,0xD9,0xE6,0x8E,0xC2,0x95,0x17,0x69, + + 0x2E,0x92,0x9F,0x90,0x1F,0x3F,0x33,0x52,0xEC,0xF6,0x8D,0xAD,0xB8,0x57,0x90,0x79, + + 0x89,0x9D,0xD7,0x2F,0x1E,0x64,0x3F,0xC9,0x12,0x26,0x7B,0x40,0xD9,0x60,0x3C,0xDA, + + 0x8D,0xDD,0x19,0x31,0xC1,0x43,0xF4,0x67,0x97,0xD3,0x09,0x11,0x81,0x03,0x2E,0x26, + + 0x91,0xDF,0x11,0x21,0xC0,0x42,0x27,0x64,0x29,0x10,0x01,0x01,0x80,0x02,0xA7,0x33, + + 0x7F,0x65,0x18,0x30,0x41,0x41,0xC3,0xE9,0x01,0x9F,0x08,0x10,0x01,0x01,0x27,0xDB, + + 0xA9,0x67,0x10,0x20,0x40,0x40,0xBF,0x07,0x45,0xD2,0x00,0x00,0x0E,0x35,0x80,0x05, + + 0x76,0x8D,0xDE,0x85,0xB1,0x8B,0x52,0x92,0x14,0x40,0xCE,0xA1,0x58,0xCB,0xAC,0x72, + + 0x40,0x81,0x90,0xE5,0x5B,0x21,0x24,0xB2,0x41,0xA7,0xC6,0xB5,0xD3,0xCA,0x7F,0x19, + + 0x02,0x2A,0x41,0x05,0xFB,0xA0,0x19,0x24,0xC4,0x62,0x90,0x05,0x50,0x48,0x71,0xEC, + + 0xC1,0x41,0xD7,0x1D,0xB1,0x88,0x47,0xD3,0xCD,0xC6,0x59,0x35,0xBA,0xE1,0x7E,0x48, + + 0xC0,0x06,0x3F,0xBA,0x14,0xE4,0x46,0xF1,0xA9,0xE6,0xF9,0x23,0x7C,0xE8,0xFB,0xC0, + + 0x05,0xA5,0x08,0x40,0x82,0xA8,0x1A,0x03,0x5F,0x4C,0xF1,0x73,0x52,0xE5,0x49,0xC5, + + 0x7E,0xA4,0xD4,0xC1,0xD6,0xBB,0xEA,0xD0,0x80,0xE9,0x9B,0x78,0x93,0x67,0x05,0x23, + + 0xEB,0xA5,0x36,0xD1,0xD7,0xD2,0x2F,0xF3,0xCA,0x3A,0xA3,0xA1,0x53,0x47,0x80,0x6A, + + 0x73,0xDA,0x87,0x0C,0x9A,0x20,0x3C,0x2F,0x20,0x47,0x82,0xDD,0x12,0x68,0x7A,0x5E, + + 0xF5,0x4B,0xEA,0x5C,0x0C,0x26,0x1A,0x7B,0x4D,0x49,0x9B,0x1C,0xD9,0xA8,0xDC,0x08, + + 0x8E,0x8A,0x0E,0xFD,0x90,0x25,0x3D,0x2E,0xE7,0x0A,0xCD,0xA8,0xD0,0xC1,0x89,0x63, + + 0x0B,0x23,0x0B,0x1C,0x30,0x80,0xF1,0x3D,0xC9,0xE4,0xC5,0xBC,0x5B,0xC0,0xBD,0x3B, + + 0x48,0x8F,0x02,0x5D,0x8D,0x6E,0x08,0x75,0xE9,0x4A,0x58,0x9A,0x85,0xE1,0x74,0x54, + + 0x6A,0xED,0xB5,0xA6,0xE4,0xF2,0xDA,0x9A,0xEA,0xB2,0xD8,0x74,0x59,0x6C,0x03,0xB7, + + 0x0A,0x5E,0x41,0xF7,0x7B,0x51,0x5F,0x07,0x6B,0xC6,0xF3,0x60,0xD2,0x2E,0x53,0x4C, + + 0x77,0xAD,0x0B,0x4D,0xB1,0xA2,0x11,0x78,0x28,0xC5,0xD3,0x7F,0x59,0x8F,0xBF,0xE2, + + 0x61,0x50,0x03,0x75,0x3A,0x36,0xBA,0x51,0x6A,0x5C,0x95,0x84,0x1B,0x40,0x74,0xE3, + + 0x71,0x18,0xCE,0x1E,0x5A,0x93,0x62,0x20,0x8A,0xF3,0xD8,0x36,0x1A,0x33,0x7D,0xE3, + + 0xE3,0xCD,0xDB,0x01,0xB0,0x99,0x4B,0x25,0xE0,0xDF,0x95,0xA7,0xB2,0xD9,0x4C,0x6C, + + 0xC7,0x51,0x8D,0x64,0xA1,0x23,0x43,0xB9,0xC1,0xFC,0x9D,0x44,0xB3,0x7D,0x3A,0xCD, + + 0xAD,0xB9,0x04,0xD0,0xC3,0x2F,0x6C,0xB0,0x66,0x5B,0xEE,0x63,0xDE,0x2B,0x4D,0x42, + + 0x23,0x1D,0xB3,0x56,0xB3,0x35,0x26,0x20,0x6B,0x8A,0xE6,0x73,0xDF,0x69,0x40,0x53, + + 0x22,0xBB,0x3A,0xB7,0x55,0x28,0x6D,0x1E,0xA1,0x76,0xEF,0x62,0x5E,0x69,0x09,0x20, + + 0xB7,0x13,0x12,0xD5,0xC4,0x3D,0xE2,0x21,0x14,0x8F,0xF3,0xF3,0x62,0x2B,0x84,0x62, + + 0x57,0x10,0xD8,0x85,0x38,0x78,0x13,0x2A,0x69,0x20,0xC8,0x3D,0x78,0xF5,0x70,0x1A, + + 0x28,0xFE,0xEE,0x6D,0x3F,0x39,0x26,0x49,0x6F,0x59,0xDE,0x4F,0x61,0x7F,0xDC,0x8D, + + 0xAE,0xBA,0x83,0xEE,0xD3,0x18,0x37,0x3D,0x83,0x78,0xE9,0x28,0x93,0x6A,0x55,0x98, + + 0x0A,0xB4,0xD1,0x0D,0x19,0x90,0x41,0x29,0xC9,0xF0,0x97,0xF0,0x9A,0x1B,0x1C,0xCA, + + 0x42,0x2C,0xFC,0x2E,0x96,0xC2,0x2E,0x19,0x3A,0x7C,0xF8,0xEB,0xEF,0x73,0x18,0xD0, + + 0xC0,0x0D,0xFE,0x62,0x50,0x09,0x26,0x8B,0x3B,0x56,0xF7,0xB2,0xB2,0x19,0x39,0xC0, + + 0xC9,0xE1,0xBC,0x13,0x0D,0x95,0x37,0x29,0x24,0xD3,0x63,0xA7,0x33,0x3A,0x6F,0xCD, + + 0x63,0x2F,0xCF,0x2C,0x33,0xC0,0x24,0x99,0xBC,0x54,0x76,0x22,0x42,0xA1,0x9D,0xF2, + + 0x58,0x8F,0xE4,0x84,0x7F,0xE2,0xB0,0x23,0x44,0x80,0x70,0x26,0x3F,0x62,0x22,0x16, + + 0xA6,0x8C,0xF6,0x87,0x15,0x0A,0x68,0x36,0x4D,0xE9,0xE6,0xB3,0x5D,0x4A,0x41,0x42, + + 0x31,0x8F,0xA1,0xF6,0xD6,0xA6,0x35,0xBE,0xC0,0xE2,0xB9,0xD6,0x9E,0xE2,0xD6,0xC3, + + 0x8D,0x0C,0xA8,0x97,0x15,0xA2,0xB9,0x32,0x82,0x83,0xB8,0x17,0x55,0xA1,0xD3,0xD2, + + 0x00,0x24,0x1D,0xBD,0xE5,0x5B,0x74,0x9C,0xBB,0x4E,0xF2,0x14,0x21,0xC4,0x32,0x4F, + + 0xA4,0x83,0xD2,0xB9,0xEC,0x3A,0xF0,0x4E,0xA6,0xCA,0x07,0xA6,0x29,0xE6,0x2D,0xC1, + + 0x8F,0xFB,0x1A,0xC3,0x9A,0xCB,0x8A,0x3F,0x65,0xC0,0x15,0x07,0x24,0x83,0x65,0x3D, + + 0x26,0x0F,0x16,0xA9,0x91,0x27,0x19,0x33,0xDA,0x4C,0xC7,0x7E,0x94,0x15,0x68,0x0B, + + 0xFB,0x75,0xFC,0x8F,0x9E,0x03,0x36,0x5A,0x48,0xE8,0xEC,0xAF,0xDE,0x43,0x4A,0x5B, + + 0xF0,0x02,0xCA,0xEF,0x57,0xA9,0xBA,0x3B,0x9F,0x89,0xA2,0xCF,0x17,0xE9,0x69,0xF5, + + 0xD9,0x85,0x63,0x0F,0xF7,0x28,0x6D,0x2F,0xC4,0xDE,0x73,0x2F,0xB7,0x68,0xAC,0xF9, + + 0x0F,0xA3,0xF5,0x17,0x8D,0xAF,0x3F,0x99,0xC9,0xEB,0xE5,0xBA,0xD5,0x40,0xE2,0xA8, + + 0xAF,0x73,0x3A,0x3C,0xE1,0x73,0xF6,0x88,0xCC,0xC4,0x09,0x1C,0xD0,0x89,0x6E,0xA4, + + 0xF2,0x07,0x68,0xDE,0x19,0x6D,0x76,0x05,0x2C,0x3D,0xB0,0x3C,0x37,0xE0,0x29,0x4A, + + 0x6D,0x04,0x23,0x5E,0x95,0xEC,0xFA,0x19,0x6D,0xC8,0xEB,0x6E,0x8A,0x12,0x90,0x07, + + 0x2C,0x02,0x63,0x7B,0x1A,0x5A,0x03,0xF9,0xC6,0x12,0xE3,0x55,0xDE,0xF8,0x55,0x44, + + 0xD4,0xDE,0xE2,0x86,0xB4,0xD3,0x72,0xA2,0x0F,0xC0,0xCC,0x24,0x7D,0x8D,0x76,0x93, + + 0x86,0x97,0x6C,0x96,0x5E,0x33,0x5C,0xF2,0x78,0x5C,0xB0,0xD8,0xD4,0x79,0x92,0x01, + + 0xA1,0x63,0xFB,0x06,0x36,0x19,0x25,0x52,0xFC,0xD2,0xEF,0xBA,0x57,0xF4,0xA5,0xAF, + + 0x06,0x95,0x85,0x66,0xFF,0xB3,0x45,0x31,0xE4,0x8B,0x3D,0x55,0x54,0x0C,0xE5,0x33, + + 0x3A,0xB4,0x64,0xC3,0xE0,0xF4,0x3F,0x0D,0x9D,0x2B,0x4A,0xE4,0x80,0x20,0x5F,0x42, + + 0xDB,0xD7,0x58,0x3C,0xD6,0xD3,0xBC,0xE6,0x44,0x97,0x7B,0xED,0x75,0xBB,0xD0,0xCF, + + 0x5E,0x34,0xE5,0xC2,0x57,0xD0,0x8E,0x67,0xA2,0x58,0xF2,0xF8,0xA2,0x62,0xDE,0x52, + + 0xA1,0x17,0x59,0x97,0xBB,0x78,0x7B,0x0A,0x98,0x87,0x8B,0xB1,0x51,0xBB,0x6E,0x1D, + + 0x8D,0x91,0xF8,0x86,0x3E,0xBC,0x34,0x48,0x68,0xF8,0xFC,0xAF,0x9F,0x72,0x16,0x69, + + 0x39,0x14,0xF0,0x1A,0x3D,0x34,0x60,0x3E,0x6D,0x72,0x45,0xE2,0xDE,0x97,0xDE,0x09, + + 0xAF,0x7C,0xA8,0x7E,0xB6,0xBC,0x0B,0x5A,0xE6,0xD6,0xB3,0x51,0x01,0x70,0x51,0x1E, + + 0x44,0xCB,0xD1,0x0F,0x56,0x19,0x7D,0xFB,0x6D,0xEB,0x81,0xB6,0x3F,0xFB,0xBE,0xF5, + + 0x3A,0x47,0xC6,0xCF,0x99,0xAC,0xB6,0xFE,0x79,0x9E,0x82,0x13,0x40,0xBE,0x10,0x5E, + + 0xDA,0x3E,0xD4,0x59,0x93,0xA2,0x7E,0x7E,0x2B,0x79,0x3E,0xEA,0x83,0x08,0x67,0xB4, + + 0xC6,0xDC,0x08,0x3D,0x3E,0x8F,0xF5,0x65,0xE8,0xDE,0x75,0xD0,0x02,0x9C,0x2B,0x28, + + 0xA5,0x62,0xA5,0xCA,0xDF,0x2F,0xBF,0xEA,0x3D,0x52,0xF8,0x7B,0xBB,0x0A,0xB7,0x1C, + + 0x06,0xC0,0x24,0x66,0x33,0x40,0x63,0x66,0xEA,0xBB,0x94,0x63,0xD2,0x68,0x78,0x56, + + 0xA3,0xFF,0x68,0x1C,0x33,0x31,0xAF,0xB5,0x47,0x81,0xBE,0xEF,0x05,0xC5,0xB6,0xFC, + + 0x90,0x4C,0x6D,0x07,0x98,0x4E,0x91,0xA5,0x84,0xB7,0xA0,0x47,0x3B,0xD2,0xF0,0x57, + + 0x6B,0xA7,0x8C,0x06,0xDF,0x67,0xAE,0x0E,0x9D,0x01,0x72,0x28,0x19,0x9D,0x38,0x22, + + 0x41,0xF4,0x2F,0x36,0xB1,0x65,0xE3,0x79,0xBE,0x94,0xD0,0x64,0x52,0x64,0x40,0xE2, + + 0xF6,0x0A,0xB0,0x73,0x37,0x25,0x5C,0x37,0xC1,0x4D,0xD8,0x74,0x53,0x65,0x4B,0x01, + + 0x21,0x00,0xC5,0x65,0x92,0x26,0xC1,0xA6,0xC0,0xB3,0xD1,0x65,0xD2,0x66,0xFD,0x2E, + + 0x20,0x46,0xC9,0x55,0x93,0x27,0xEB,0x13,0x28,0xF7,0xD9,0x75,0xD3,0x67,0x42,0x0E, + + 0xC0,0xF8,0xA4,0x98,0x94,0xA3,0x90,0x17,0xB4,0x4A,0xD2,0xAA,0xA4,0x9D,0x08,0xDE, + + 0xAB,0x4C,0x71,0x3A,0x09,0xA4,0x99,0x3E,0x81,0xF9,0x19,0x06,0x01,0x28,0xA7,0xF5, + + 0x08,0xF1,0x87,0xEF,0x9E,0xEA,0xD3,0x3D,0x34,0xEE,0xD3,0x13,0x84,0xDF,0x79,0xBC, + + 0x2D,0xEC,0x5F,0xE2,0x1A,0x25,0xBF,0x5B,0x65,0xB4,0x77,0xBD,0x25,0x4B,0xAA,0xFB, + + 0x8F,0x4B,0xC2,0x4C,0x1A,0x2C,0x74,0xB7,0x1E,0x0A,0xD2,0x6C,0x5A,0x6C,0x3E,0xA5, + + 0x2A,0x4F,0xCA,0x5C,0x1B,0x2D,0xD9,0x5C,0xC4,0x4F,0xDA,0x7C,0x5B,0x6D,0x83,0x5D, + + 0x78,0x42,0xC3,0x4D,0x9A,0x2E,0xE4,0x57,0x92,0xBB,0xD3,0x6D,0xDA,0x6E,0xC9,0x66, + + 0x0E,0x08,0xCB,0x5D,0x9B,0x2F,0xEC,0x78,0x46,0x49,0xDB,0x7D,0xDB,0x6F,0x80,0x04, + + 0x64,0xE5,0x0C,0x86,0xC5,0x3F,0x74,0xE4,0x6F,0x5D,0xBC,0x66,0xF2,0x78,0xBB,0xAF, + + 0x79,0x53,0x48,0x11,0x72,0xC2,0x94,0xC8,0x80,0x5E,0xFC,0xF4,0x8A,0x7C,0x3F,0x7E, + + 0xA6,0xD2,0x31,0xFA,0x13,0x8F,0x5F,0x7E,0x43,0x54,0x7A,0x55,0xA8,0x7D,0x8F,0xAE, + + 0x5D,0xC3,0xED,0xD1,0x8C,0x3C,0x7D,0xF5,0xD8,0x5C,0xEF,0xAC,0xB1,0x88,0x3C,0xE4, + + 0xA7,0x33,0xC4,0xC4,0x32,0x34,0x94,0xF4,0x9E,0x18,0xD4,0xE4,0x72,0x74,0xFB,0x2D, + + 0x33,0x5B,0xCC,0xD4,0x33,0x35,0xF4,0x53,0x1C,0xD5,0xDC,0xF4,0x73,0x75,0x9A,0xD0, + + 0xA4,0xD6,0xC5,0xC5,0xB2,0x36,0x25,0x27,0x48,0x17,0xD5,0xE5,0xF2,0x76,0x3D,0xF7, + + 0x41,0x74,0xCD,0xD5,0xB3,0x37,0x9D,0xE5,0x1F,0x1B,0xDD,0xF5,0xF3,0x77,0xC6,0x9C, + + 0xD4,0xBC,0x16,0x92,0x60,0xCC,0xA2,0x4A,0xEA,0x10,0x92,0xAE,0x7C,0x83,0xAA,0x65, + + 0xA9,0xC2,0x7E,0x18,0x7D,0xAE,0x66,0xDA,0x2A,0xE6,0x29,0x98,0xFC,0x5E,0x47,0x8F, + + 0x60,0xEA,0x04,0x4B,0x52,0x76,0xDB,0xCB,0xAB,0x85,0x97,0x6F,0x7B,0x3C,0x0E,0x5F, + + 0x0B,0x5E,0x27,0x3E,0xC6,0x3A,0x67,0xE6,0x1C,0xA7,0x40,0xAC,0xFF,0xBB,0xEE,0x6A, + + 0xF5,0xF3,0xC6,0xCC,0x3A,0x3C,0x26,0x2E,0xC0,0x1D,0xD6,0xEC,0x7A,0x7C,0xB1,0xFC, + + 0xA9,0x15,0xCE,0xDC,0x3B,0x3D,0xF2,0xBA,0xE8,0x53,0xDE,0xFC,0x7B,0x7D,0xEF,0x6B, + + 0x2D,0x39,0xC7,0xCD,0xBA,0x3E,0xBB,0x69,0x16,0x7E,0xD7,0xED,0xFA,0x7E,0xF9,0xBB, + + 0x5C,0x19,0xCF,0xDD,0xBB,0x3F,0x37,0x7F,0x17,0x1E,0xDF,0xFD,0xFB,0x7F,0xF4,0x44, + + 0xA6,0x7E,0x40,0x39,0x30,0x1C,0xF0,0x36,0xB8,0xBE,0x1C,0xA4,0x55,0x65,0xC3,0x69, + + 0x9A,0xBC,0x2C,0xE7,0xB6,0xA3,0x4C,0xB6,0x0D,0x9F,0xD7,0x2A,0x9D,0x3F,0x5B,0x87, + + 0xC8,0x92,0x1E,0x5C,0x6D,0x28,0x48,0x65,0x66,0x8C,0x89,0xD4,0x8C,0x46,0x81,0xB1, + + 0x02,0xA4,0x9B,0xE8,0x17,0xEB,0xF9,0x27,0x54,0x82,0x3E,0x24,0x0A,0xE1,0x88,0xE1, + + 0x00,0x24,0xE0,0x46,0x16,0xA4,0x78,0x50,0xE7,0x6B,0xF0,0x66,0x56,0xE4,0xF8,0xD0, + + 0x06,0xF2,0xE8,0x56,0x17,0xA5,0x98,0x4D,0xB3,0x75,0xF8,0x76,0x57,0xE5,0x88,0xC7, + + 0xC2,0x9A,0xE1,0x47,0x96,0xA6,0x76,0x70,0x1D,0x16,0xF1,0x67,0xD6,0xE6,0x53,0xB1, + + 0x05,0x8F,0xE9,0x57,0x97,0xA7,0xCE,0x6F,0xE3,0x3A,0xF9,0x77,0xD7,0xE7,0xB2,0x14, + + 0x54,0x7C,0x82,0x6C,0xAB,0xCD,0x99,0x51,0x99,0x35,0x52,0x11,0xA0,0xEA,0x6A,0xDC, + + 0xE7,0xC5,0x13,0x4F,0xBE,0x76,0x62,0x07,0xCF,0xC1,0x89,0x27,0x79,0x87,0xA0,0x11, + + 0xD0,0x3E,0x9B,0xDF,0x41,0xD5,0x71,0x4B,0xD4,0x4A,0x00,0x32,0x24,0x3A,0xDB,0x5D, + + 0x27,0x70,0x16,0x42,0x62,0xAD,0xEF,0x49,0x6E,0x8A,0xFB,0x00,0xD5,0x87,0x93,0x28, + + 0x4D,0x53,0xE2,0x4E,0x1E,0xAC,0xAD,0x62,0x60,0x8A,0xF2,0x6E,0x5E,0xEC,0x12,0xD8, + + 0x0E,0x9A,0xEA,0x5E,0x1F,0xAD,0x0A,0xA5,0xA0,0x8C,0xFA,0x7E,0x5F,0xED,0x1B,0x29, + + 0xCD,0x7E,0xE3,0x4F,0x9E,0xAE,0x81,0xAD,0x6C,0x82,0xF3,0x6F,0xDE,0xEE,0xD0,0xB9, + + 0x23,0x72,0xEB,0x5F,0x9F,0xAF,0xD3,0xD8,0xB0,0x0F,0xFB,0x7F,0xDF,0xEF,0x56,0x27, + + 0xA1,0x97,0x64,0x92,0xC8,0x45,0xF4,0xB3,0x48,0xD6,0x03,0x5B,0x38,0xBE,0x2D,0x4D, + + 0x86,0xEF,0x1B,0x8F,0x33,0x71,0x44,0x96,0xEA,0xD3,0x45,0x70,0xD7,0xB4,0xCE,0x74, + + 0xA2,0x72,0x61,0x03,0xF0,0x47,0x3D,0x06,0x87,0xF2,0xC5,0xE1,0x56,0x0C,0x16,0xD5, + + 0x07,0xDD,0x1A,0xA8,0xE1,0xF1,0x8A,0xB2,0x68,0xDF,0xCF,0x31,0xED,0xBF,0x6C,0xF5, + + 0x87,0xF8,0xE4,0xC6,0x36,0xB4,0x14,0xA2,0x6A,0x29,0xF4,0xE6,0x76,0xF4,0xE8,0x15, + + 0xA7,0xB5,0xEC,0xD6,0x37,0xB5,0x26,0xF3,0xC4,0x94,0xFC,0xF6,0x77,0xF5,0x86,0x84, + + 0x78,0x9E,0xE5,0xC7,0xB6,0xB6,0x0D,0x61,0xE7,0x96,0xF5,0xE7,0xF6,0xF6,0xC1,0x13, + + 0x04,0xD6,0xED,0xD7,0xB7,0xB7,0x1D,0xB3,0xFA,0x5C,0xFD,0xF7,0xF7,0xF7,0x52,0xAE, + + 0xF8,0x28,0x24,0xB1,0xB9,0xBF,0x5E,0xB4,0x2A,0x2C,0xC6,0x8E,0x64,0x35,0x09,0x1A, + + 0xAA,0x3E,0x47,0x1A,0x79,0xA5,0x81,0xDA,0xDA,0x7D,0x84,0x5C,0xFF,0xF1,0x80,0x97, + + 0x7C,0x6A,0x4F,0x2C,0xBA,0x1A,0xF1,0x2F,0xA4,0xAD,0x27,0x2D,0xFD,0x1D,0x87,0x3D, + + 0xAB,0x5B,0x3F,0x58,0xBF,0x4E,0xF9,0xBD,0x25,0x19,0x4D,0xDD,0xBE,0x24,0x8A,0x4A, + + 0xD2,0xBC,0xE6,0xCE,0x3E,0xBC,0xF2,0x08,0xEC,0xD4,0xF6,0xEE,0x7E,0xFC,0x56,0x29, + + 0x77,0x39,0xEE,0xDE,0x3F,0xBD,0x1E,0xBA,0xC2,0x20,0xFE,0xFE,0x7F,0xFD,0xCB,0x49, + + 0xAF,0xCB,0xE7,0xCF,0xBE,0xBE,0xFE,0x99,0x4D,0x9F,0xF7,0xEF,0xFE,0xFE,0x80,0xC7, + + 0x29,0x6A,0xEF,0xDF,0xBF,0xBF,0x07,0xDF,0x6D,0xD7,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x90,0xAF, diff --git a/drivers/input/touchscreen/GT915L/FW_EACH.txt b/drivers/input/touchscreen/GT915L/FW_EACH.txt new file mode 100644 index 0000000000000..09980ef2ca352 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/FW_EACH.txt @@ -0,0 +1,11265 @@ + 0x00,0x01,0x60,0x00,0x39,0x31,0x35,0x4C,0x00,0x00,0x00,0x00,0x10,0x62,0x80,0x00, + + 0x55,0x40,0xBD,0xDA,0xFD,0x24,0x34,0xDF,0x44,0x40,0xAF,0xEB,0xE9,0x2C,0xC8,0xB4, + + 0x25,0x41,0x8C,0x90,0x5F,0xA4,0x22,0xB7,0xED,0x5E,0x58,0x35,0x89,0x94,0x01,0x88, + + 0x86,0x02,0x72,0xFC,0x81,0xD9,0x39,0x25,0xC8,0xE2,0xE1,0xE3,0x7A,0x23,0x09,0x05, + + 0x87,0x03,0xB3,0xE6,0xF0,0x25,0x23,0xB6,0x6D,0x4B,0x83,0x4A,0xAE,0x73,0x1E,0xA2, + + 0x12,0xF9,0x91,0xBE,0x36,0x39,0x28,0x69,0xEF,0x76,0xA8,0xB2,0xB3,0xB8,0x37,0x10, + + 0x4F,0x13,0x6D,0xB6,0xF3,0xB4,0xFC,0x02,0xCD,0xEA,0xE2,0x2E,0xE8,0x70,0xD6,0xBE, + + 0x7B,0x65,0x66,0xA7,0x72,0xBA,0xC1,0x6A,0x46,0x12,0x2C,0x17,0x0B,0x39,0x01,0x45, + + 0x48,0x08,0xB2,0x3E,0x47,0x28,0x21,0x81,0xCB,0x21,0x79,0x51,0x61,0x67,0xC0,0xAC, + + 0x2C,0x48,0xCA,0x9B,0xB9,0xA1,0x96,0xDE,0xC8,0x68,0x46,0xAA,0xBE,0x26,0x9A,0xBC, + + 0x2F,0x49,0x04,0xFC,0x9B,0x23,0x3A,0x11,0xA8,0x2F,0x64,0x18,0xE7,0x49,0xCB,0x4A, + + 0xC0,0x01,0x32,0x6D,0xC8,0x68,0xEB,0x21,0x17,0xC5,0xE3,0x6B,0x7A,0x94,0xC8,0xF0, + + 0x2A,0x6E,0xED,0x6F,0x3A,0x2D,0xAF,0xD3,0x8A,0xAB,0x19,0x36,0x5D,0x3F,0xBA,0x6C, + + 0x87,0x1A,0xF0,0x74,0xE9,0x78,0xC2,0xC7,0x42,0x4E,0xFE,0xC7,0x5A,0x56,0xF3,0x7C, + + 0x8E,0xA3,0xB1,0x32,0xCF,0x22,0xFA,0x0B,0xC7,0x1E,0x7F,0x9E,0x9B,0x91,0x3C,0x54, + + 0x41,0x01,0xBB,0x36,0x7A,0xBF,0x6D,0x6F,0xF2,0xE1,0x22,0x6D,0xA2,0xF3,0x70,0xF9, + + 0x66,0x3F,0xF9,0x06,0x2B,0x20,0x25,0x7E,0x6A,0xE0,0x70,0x26,0x28,0xC2,0x04,0x80, + + 0x78,0xF8,0xD4,0x9B,0x1A,0xA4,0x74,0x60,0xFF,0xDD,0xEC,0x96,0x04,0xAF,0xDE,0xB0, + + 0x26,0xE9,0xFA,0xD2,0x97,0x7D,0x6F,0x97,0x9E,0xDB,0x6F,0xB4,0x49,0x8C,0x4F,0x28, + + 0x82,0x11,0x55,0x9E,0x9E,0x7C,0xCE,0xA0,0x6E,0x5B,0x05,0x1F,0xF0,0x02,0x02,0x1D, + + 0x24,0xE6,0xF9,0x68,0x8F,0x71,0xCA,0x11,0x08,0x63,0xBA,0x57,0x31,0x8C,0x64,0xC5, + + 0x24,0x34,0x57,0x9F,0x08,0xEB,0xF0,0x8B,0xEC,0xFB,0xEE,0x0F,0xC5,0x35,0xE0,0xA2, + + 0xFD,0xEA,0xFE,0xED,0xE6,0x96,0xCC,0x1A,0xDD,0x75,0x23,0x8A,0x5D,0xAA,0x6B,0x61, + + 0x69,0xF6,0xFF,0x7D,0x41,0x6B,0x2D,0xC6,0x5B,0x30,0x8C,0x6D,0x0F,0x87,0x77,0x4F, + + 0x54,0x56,0xB5,0x2E,0x52,0xA4,0x19,0x82,0x67,0x66,0xE2,0x50,0x08,0xEA,0xC6,0x59, + + 0xE3,0x03,0x82,0x86,0xC4,0x3B,0x5C,0x35,0x9F,0xD5,0xA1,0x4E,0x5C,0xF5,0x71,0x1A, + + 0xA1,0x11,0xDA,0x18,0x31,0x8D,0x9D,0xE7,0x2A,0x55,0x9F,0xC3,0x05,0x86,0xF8,0xFB, + + 0x4F,0x04,0x47,0x8C,0x60,0xCF,0xF3,0x8E,0xC9,0x7A,0xBC,0x47,0x93,0x75,0xD0,0xDB, + + 0xDE,0xE3,0x50,0x95,0x3E,0x3C,0x09,0xDB,0xC8,0x4E,0x24,0x18,0x0E,0xE6,0x68,0x2A, + + 0x99,0x79,0xBD,0xE8,0x51,0x33,0x28,0xEE,0x83,0x38,0x02,0x16,0xE3,0x1F,0x36,0x32, + + 0xC2,0x59,0x71,0xE1,0xC4,0xE0,0x26,0x8B,0xC8,0x38,0x3B,0x97,0xED,0x75,0x7F,0xE1, + + 0x09,0xB2,0xC6,0x3C,0x3E,0x3E,0x86,0x1A,0x66,0x43,0xFA,0x6D,0x35,0xDE,0x09,0xDF, + + 0x88,0x5F,0x1B,0x23,0x62,0x5C,0x27,0xDD,0xE8,0x6F,0x59,0x87,0x65,0xE0,0xB0,0xA6, + + 0x04,0xC0,0xE8,0x94,0xB7,0xEC,0x22,0x3A,0xD5,0xAC,0x14,0x44,0x70,0xEA,0x28,0x12, + + 0x05,0xC1,0xB2,0xEA,0x15,0xE3,0x32,0x12,0xD4,0xA5,0x43,0x32,0xF8,0xA0,0x21,0x1F, + + 0x84,0x82,0x12,0x41,0xD4,0x59,0xE5,0x71,0x87,0x32,0x31,0x50,0xF0,0x95,0x29,0x9F, + + 0x85,0x83,0x65,0x42,0x17,0xAB,0x31,0x23,0x26,0x09,0x9C,0x31,0x41,0x87,0x90,0x91, + + 0xE7,0xE8,0x45,0xA4,0xF6,0x15,0x08,0x45,0xE7,0x85,0x88,0x29,0xED,0xFF,0x13,0x2C, + + 0x25,0x68,0x97,0x3D,0xCB,0xAA,0xD8,0x98,0x83,0xCA,0x43,0xD3,0xA0,0x58,0x06,0xB8, + + 0x67,0x10,0xCA,0xEF,0xFE,0xA9,0x39,0x6A,0x7F,0x67,0xB0,0x18,0xAA,0x19,0x2F,0xF5, + + 0x4C,0x0A,0xDB,0x6F,0x4E,0x04,0x78,0x05,0xE3,0xB0,0x2D,0x8C,0x26,0x84,0x22,0x0A, + + 0x0C,0xC8,0x57,0xFE,0x14,0xA7,0x12,0x2B,0x09,0x07,0x88,0xA9,0x78,0x15,0x2A,0x1A, + + 0x0D,0xC9,0xF3,0x88,0x7A,0xB1,0x3E,0x3E,0x0D,0xD9,0xC2,0x61,0x8D,0xE6,0x23,0x2A, + + 0x8C,0x8A,0x4B,0x21,0x1B,0x5F,0xDC,0x59,0x4C,0xBA,0x94,0xCD,0x3C,0xFF,0xA0,0x58, + + 0x8D,0x8B,0x2B,0x62,0xC1,0x7F,0x7B,0x1B,0xCC,0xCF,0x89,0x17,0x08,0x5F,0xCE,0xD5, + + 0xF1,0x01,0x9A,0xB4,0xA3,0x78,0x89,0x66,0xF7,0x6D,0x89,0x01,0x70,0x93,0x44,0x1D, + + 0xEE,0x3B,0x92,0x31,0xC3,0xA2,0x02,0x72,0xEA,0x8C,0xF2,0x6E,0xE2,0xDB,0x80,0xB5, + + 0x88,0xAE,0x9B,0x7D,0x69,0x9B,0xD3,0x81,0x6B,0x61,0xB3,0xB8,0xD2,0xD8,0x14,0x29, + + 0x5D,0x10,0xD9,0x00,0x56,0xA0,0x45,0x7C,0xFB,0x60,0x06,0x62,0x4C,0x42,0x1E,0x60, + + 0x88,0x6E,0x0C,0x24,0xEB,0xEF,0x3C,0x08,0x85,0xB6,0x60,0x5C,0x81,0x46,0x2C,0x6F, + + 0x25,0x1C,0x0C,0x85,0x13,0xD5,0x88,0x58,0x84,0xB7,0xC7,0xC8,0xAF,0x2E,0x5E,0x5D, + + 0x13,0x89,0x0D,0x34,0x7C,0xD1,0x81,0x4D,0x05,0xB4,0x8E,0x2D,0xF5,0x52,0xD5,0x9B, + + 0x7A,0x0C,0x76,0x95,0xCA,0x33,0x89,0xF9,0x2C,0x97,0x3A,0x64,0x56,0xCE,0x22,0xC5, + + 0x87,0x87,0xCB,0x9C,0x18,0x28,0x49,0xD3,0xE2,0xC8,0xC9,0x68,0xCD,0x04,0xED,0xD9, + + 0xA3,0xC1,0x4C,0x59,0xCE,0xE3,0xEC,0x5D,0x90,0xE5,0x05,0x84,0xA6,0x8A,0x1D,0xE7, + + 0x18,0xB6,0xCB,0xC1,0x98,0x1A,0x8F,0xEB,0x02,0xD9,0x9C,0x85,0x17,0xCA,0xC9,0xB1, + + 0x4C,0x98,0xD6,0x5C,0x5E,0xF3,0x40,0xC2,0x63,0xCB,0x6D,0x06,0x54,0xF5,0x78,0xA8, + + 0xF9,0x33,0x4E,0x2C,0x98,0x3F,0x1F,0xE4,0xA5,0xBC,0x8C,0xF0,0x87,0xB9,0x1E,0x6B, + + 0x54,0x72,0x06,0x3C,0xE2,0x36,0x10,0xBC,0xFC,0x85,0x05,0xAC,0x5D,0xB7,0xF9,0xD0, + + 0xC7,0x81,0x73,0xA9,0x52,0xD9,0x9E,0x49,0x40,0xC6,0x88,0x45,0x17,0xF5,0x71,0x90, + + 0xAD,0x30,0x6F,0x9F,0xEB,0x65,0x11,0xBC,0x78,0x25,0xFC,0x41,0x05,0xF4,0xD2,0xA8, + + 0x0A,0x96,0x87,0x8E,0x6E,0x13,0x8E,0x99,0xCD,0xCC,0x49,0xD3,0x81,0x21,0xD0,0x53, + + 0x0B,0xEA,0xD1,0x50,0xC4,0x20,0x81,0x84,0x59,0x02,0x81,0xA4,0x51,0x61,0xE5,0xDC, + + 0x0D,0xAE,0x47,0xB1,0x20,0x61,0x8F,0xCF,0x13,0xAF,0x23,0x11,0x07,0x9D,0x94,0xCE, + + 0x02,0x30,0x8A,0x25,0xE3,0x11,0x40,0x52,0x14,0x42,0xD6,0x5A,0x6E,0xFD,0xEE,0x15, + + 0x9E,0x9D,0x64,0xE2,0x00,0xAB,0xEB,0x07,0xE1,0xBF,0x96,0xDF,0xA5,0x0E,0x89,0x6B, + + 0x9F,0xBE,0xD2,0x11,0x9F,0x6E,0x42,0x31,0xCF,0xFE,0x7D,0x42,0x30,0x41,0xE0,0x6B, + + 0x1A,0x0A,0x01,0x82,0x37,0x32,0x81,0x53,0x4E,0xDD,0xF6,0x65,0xC2,0x79,0x32,0x9F, + + 0x72,0x1E,0xD3,0x05,0xBE,0xA6,0x43,0x35,0x4F,0x9C,0x81,0x3C,0xB6,0x23,0xBF,0x32, + + 0xD4,0xDB,0x77,0x29,0x65,0x24,0x40,0x49,0x0D,0x28,0xEA,0xF7,0x6F,0x26,0x76,0x9C, + + 0x05,0xF6,0x08,0xE9,0x4E,0x2F,0xCE,0x86,0x60,0x05,0x18,0xC9,0x74,0x7E,0xED,0x3E, + + 0x48,0x7C,0x2D,0x36,0x8D,0xD0,0x08,0xFA,0x27,0xE0,0x06,0xB1,0xD1,0x86,0x86,0x91, + + 0xC3,0xD2,0x8B,0x12,0x72,0x81,0xB1,0x49,0xE1,0xD6,0xBE,0x81,0xC7,0x7C,0x67,0xE2, + + 0x54,0xA6,0x94,0x0A,0xF3,0x6C,0x48,0x2D,0xC6,0xB7,0xD3,0x5F,0x34,0xA9,0xF7,0x6A, + + 0xD8,0x56,0xF4,0x1B,0x3D,0xA4,0x22,0xD3,0xE5,0x44,0xC3,0xB3,0xBE,0x7B,0x7B,0xC7, + + 0x69,0xB6,0xBD,0xEF,0xF2,0x4E,0x83,0x4B,0x7B,0x2F,0x69,0x2F,0xC2,0xE7,0x31,0x53, + + 0x32,0x4A,0xF5,0x28,0x66,0x86,0xE2,0x1E,0x68,0x34,0x61,0x3F,0xD3,0x70,0x8B,0x77, + + 0x15,0x17,0x5F,0xB7,0xFB,0xAA,0x4A,0xEC,0x34,0x7F,0xB5,0x1A,0x79,0xEC,0x02,0xC9, + + 0xFE,0x42,0x14,0x3A,0xC1,0xB0,0x5B,0x1E,0xB0,0x21,0x76,0x0F,0x44,0xCB,0x7C,0xCD, + + 0xF4,0x3C,0xC3,0xB7,0x17,0x35,0x0A,0x07,0x6F,0xD1,0x8D,0x95,0xDE,0x2F,0x4A,0x26, + + 0x2C,0x0C,0x0B,0xE0,0xC1,0x25,0xE4,0xE2,0x34,0x92,0x46,0xF9,0xA5,0x97,0x8C,0x62, + + 0x91,0x86,0xE6,0x84,0xD7,0x2B,0xEC,0xA8,0x9D,0x1F,0x75,0xD7,0x1C,0xB1,0x14,0x8D, + + 0xD0,0x7D,0x32,0x88,0x13,0x20,0xB8,0x52,0xE2,0x35,0x1C,0xC6,0x96,0x6A,0x0B,0x63, + + 0x84,0x0F,0x63,0xF3,0xA0,0x31,0x85,0x8B,0x64,0xF6,0x6F,0xD6,0xA3,0x7B,0xC9,0x6B, + + 0x58,0x71,0x0D,0x53,0xDD,0x7D,0x75,0xB7,0xE7,0xD3,0x7C,0xC3,0x7E,0xF5,0xBE,0xB6, + + 0xAD,0x92,0xCC,0xC0,0xB2,0xDC,0x9E,0x20,0x60,0x38,0xB4,0xE6,0x0B,0x79,0xB6,0x70, + + 0x0F,0x65,0xCD,0xB2,0xC8,0x59,0x4D,0x16,0x71,0x18,0x19,0x16,0x40,0xE5,0x41,0x81, + + 0xA0,0x9B,0x9C,0xAB,0x17,0xA9,0x0C,0x8E,0x47,0xF0,0x9F,0xF8,0x70,0x75,0x8D,0x29, + + 0xCC,0x1D,0xF3,0x18,0x69,0x88,0x3F,0xF1,0x44,0x4C,0x65,0x0B,0xE3,0x3A,0x79,0xF6, + + 0x26,0xC7,0x97,0x64,0xF6,0xF3,0x7D,0x2C,0x28,0xC6,0x97,0xEC,0x3C,0xF5,0x72,0xBC, + + 0x98,0x10,0x9E,0xB0,0x72,0x22,0x1C,0x62,0x88,0x32,0x0E,0x9C,0x1D,0xB9,0xB8,0x0C, + + 0x57,0x04,0x83,0x85,0xDF,0xAB,0xD7,0xB9,0x3B,0x18,0x6D,0x5C,0x8B,0x5A,0x88,0xE6, + + 0x24,0x78,0x01,0xFB,0x4E,0x90,0x25,0x3E,0x45,0xF7,0x8F,0x90,0xF5,0x7A,0xC4,0x39, + + 0x59,0x9C,0xF8,0x00,0xE8,0xA3,0x31,0x1C,0x7E,0x47,0x29,0x68,0x04,0x71,0xDA,0xDC, + + 0xA2,0x32,0xD4,0xDE,0x88,0xA0,0x62,0x6A,0x6D,0xAE,0xBE,0x5C,0x63,0x72,0xEF,0xF4, + + 0x8E,0x1F,0x2B,0xB6,0x64,0xE3,0x30,0x9F,0xC9,0x6C,0x8E,0x78,0x5F,0x81,0x1F,0xED, + + 0xAF,0x33,0xD5,0xDF,0x29,0x37,0x0A,0x11,0x35,0x92,0x86,0x74,0xD9,0xCF,0x9D,0x9D, + + 0xEF,0x8F,0x3D,0x41,0x1A,0x0F,0xA0,0x58,0xA3,0xD0,0x51,0x50,0xA3,0x8E,0x15,0x89, + + 0x00,0x8E,0xB0,0x07,0x7E,0x40,0xC2,0x3A,0xB8,0x0E,0x5F,0xC0,0xD5,0x61,0x98,0x9D, + + 0x81,0x8D,0xB0,0xEF,0x19,0xEF,0x0E,0xD5,0xD4,0x1F,0x56,0x67,0x9C,0x3F,0x12,0x63, + + 0x05,0x9F,0xAD,0xEA,0x91,0xA0,0xA9,0x49,0x66,0xA6,0x83,0xDF,0x43,0x2C,0xF4,0x5B, + + 0x00,0x1F,0xE5,0xAE,0xCC,0x69,0x13,0x9C,0xBE,0xD5,0xB8,0xEF,0xDB,0x69,0x31,0x28, + + 0xA0,0x95,0x7E,0xA0,0x24,0x13,0x1F,0x82,0xC7,0xDA,0x38,0xB6,0x55,0xFE,0xBF,0x83, + + 0x96,0x0B,0xF9,0x57,0x1B,0x00,0x2A,0x63,0x49,0x3B,0x97,0x0A,0xD0,0x15,0x91,0x51, + + 0xA3,0x9C,0x53,0xB7,0x93,0xE9,0xE2,0xF9,0xC6,0x97,0x1A,0x04,0xBB,0x26,0x38,0x08, + + 0x9E,0x20,0xB3,0x0B,0x3E,0x09,0x0D,0xC8,0xE0,0x15,0xEB,0xA0,0xB9,0x86,0x54,0xF8, + + 0xB8,0x5F,0x06,0xF6,0x8F,0x64,0xAA,0x40,0xEA,0xD9,0x52,0x12,0xBC,0x26,0x5B,0x2F, + + 0x31,0x7C,0x20,0x7C,0xF0,0x15,0x4B,0x0C,0x31,0xC5,0xD1,0x23,0xDD,0x6A,0xA3,0xF9, + + 0x34,0x3D,0xCC,0xE9,0x8F,0x66,0x04,0xDD,0xDD,0x16,0xEB,0x13,0xCB,0xF0,0x52,0xBE, + + 0x0A,0x88,0xF1,0xEE,0x6E,0x25,0x2B,0x05,0xEB,0x7D,0x08,0x18,0xD3,0x6A,0x92,0x52, + + 0xA8,0x96,0xB3,0x8E,0xBA,0xA6,0x5A,0xEA,0xC2,0x40,0xA1,0x7B,0x7B,0x60,0xF3,0x39, + + 0xBD,0x13,0xDD,0x97,0xBD,0xA6,0x8B,0xE3,0x6B,0x5D,0xF5,0x2F,0xCE,0x45,0x5B,0x28, + + 0xE3,0x4E,0x3E,0xDB,0xE1,0xF7,0x1D,0x53,0xC9,0x3C,0xA2,0xE1,0x38,0xAE,0xDB,0xFC, + + 0x0A,0x4F,0xDC,0x97,0xD4,0x31,0x90,0xF1,0xC7,0x7C,0x20,0x57,0x72,0x1B,0xF8,0x68, + + 0xB6,0xBE,0x14,0x6C,0xBA,0x07,0x15,0x50,0xC9,0x7D,0x84,0x16,0x98,0xB1,0x1A,0x26, + + 0x5F,0x0F,0xA3,0x7C,0x87,0x18,0x91,0xE9,0x2D,0x96,0xA5,0x25,0x74,0x2B,0xBD,0xE5, + + 0x56,0x83,0xA5,0x8F,0x86,0xC5,0x99,0xE0,0x46,0x7F,0x15,0x92,0x1C,0x69,0x18,0x46, + + 0x58,0xCC,0xE1,0x42,0x48,0xFF,0xD8,0x67,0x9D,0xB8,0xF7,0x80,0xF4,0xF7,0xD6,0x57, + + 0x29,0x1F,0xCC,0xE7,0xB8,0x08,0x05,0x8E,0xF5,0xDF,0xFB,0x84,0xD4,0xF1,0x2D,0x33, + + 0x95,0x60,0xBC,0x5C,0xD1,0xF5,0xCA,0x78,0x85,0xD2,0x72,0x05,0x74,0xF5,0xBA,0x2C, + + 0x5C,0xF9,0x8B,0xFF,0xD4,0xB3,0x7F,0x1B,0x3D,0x1C,0xFC,0x88,0x50,0xF1,0x9C,0x71, + + 0x3C,0x55,0x1C,0x49,0xFE,0x98,0x92,0xE0,0xA5,0x9C,0xEE,0xEB,0x4F,0x33,0xBE,0xF8, + + 0xDE,0xFC,0x8E,0x0A,0xCC,0x12,0x56,0xBC,0x8C,0xBF,0x41,0xC0,0x5F,0x14,0xDC,0x83, + + 0x49,0x65,0xEF,0xAE,0xDB,0x9A,0x1E,0x8F,0x6F,0xBE,0x0F,0x51,0xEC,0xB7,0x17,0x60, + + 0x01,0x96,0xD7,0x8E,0x5D,0x3A,0xC7,0xB3,0x8E,0xFB,0x39,0xF8,0x1C,0x0D,0x58,0x07, + + 0xF4,0xDE,0x9F,0xB6,0xAC,0xB4,0xA6,0x4A,0x42,0x7C,0xA6,0xF7,0x1D,0xDC,0xC2,0xA8, + + 0xF1,0xDF,0xCE,0x5F,0x0C,0xE0,0x89,0xBD,0x5C,0x6B,0x63,0x06,0xFF,0x46,0xB0,0x96, + + 0xAD,0xEE,0xE1,0x4B,0xC0,0xF5,0x67,0xDF,0xEA,0xF3,0x8F,0x13,0x7E,0x05,0xB8,0x5F, + + 0xAE,0xFF,0x2F,0x62,0x81,0xD3,0xC5,0x68,0x83,0x10,0xE4,0xFB,0x91,0xD3,0x10,0x05, + + 0x0C,0x42,0xEE,0x44,0x1C,0x21,0xCD,0x7F,0xE7,0x50,0x54,0xF4,0x0E,0x61,0xC8,0x59, + + 0x24,0x00,0x30,0xA6,0x15,0x13,0xA0,0xCF,0x51,0x0C,0x5C,0xB0,0x72,0xF3,0x08,0xF8, + + 0x05,0x62,0xD1,0x98,0xA3,0x08,0xAE,0xC7,0xF3,0xF5,0xA9,0xB1,0xF0,0xE0,0x1B,0x05, + + 0x87,0x69,0xD0,0x52,0x34,0xDC,0x40,0xCD,0x1C,0x0C,0xC0,0xCC,0x34,0x6A,0x42,0x80, + + 0x46,0x49,0x9A,0x26,0xD8,0xD5,0x02,0xE0,0xA3,0xEB,0xEA,0x9F,0x2D,0xFC,0x90,0xB8, + + 0xF1,0x48,0xB0,0x73,0xFA,0x26,0x3E,0x11,0x42,0x05,0x8B,0x06,0xB8,0x74,0x43,0xA7, + + 0xA2,0xD6,0x89,0x50,0x7B,0xD7,0xC7,0x12,0xAE,0x2A,0x0A,0x4A,0xD4,0x9E,0x4B,0xB7, + + 0xB0,0x4B,0xB1,0xA5,0x15,0x86,0x7D,0x53,0x2A,0xEE,0xE7,0x5D,0x5E,0xC1,0xF1,0x0C, + + 0x07,0x0E,0xDB,0xE5,0x1E,0x9A,0x13,0x57,0xEF,0x4C,0x94,0x8C,0x0C,0x28,0x72,0x49, + + 0xE2,0xC1,0xD3,0xF5,0xBC,0xDF,0x12,0x07,0x74,0x52,0x22,0xD4,0xD5,0xA6,0xC3,0x95, + + 0xB9,0xAE,0x9B,0x89,0xC2,0x5F,0x19,0x5A,0x9B,0x41,0x9F,0xC0,0xEB,0x6E,0xD0,0x1A, + + 0xF6,0x07,0xCA,0x7B,0x4F,0x23,0xC6,0xDF,0xD9,0xB6,0x42,0x92,0xE6,0x69,0xFA,0xA0, + + 0x85,0x43,0x54,0xBF,0x9E,0xA1,0x2D,0x90,0x4A,0x37,0xCC,0xAC,0x0E,0x2E,0x5E,0xB0, + + 0x00,0x40,0xF2,0xBC,0x5F,0x2B,0xED,0xC8,0xBF,0x2E,0x1A,0x3C,0x1B,0xED,0x83,0x51, + + 0x2B,0x42,0x91,0x63,0x71,0x4A,0xC6,0x98,0x8B,0xFF,0xDB,0x6D,0xBA,0xD6,0xB4,0xB9, + + 0xC3,0x0E,0x66,0xBC,0x3A,0xAF,0x9B,0x20,0xAA,0xC2,0xA3,0x6C,0xEB,0x6B,0x4E,0x15, + + 0x02,0x13,0x80,0x1C,0x03,0x5C,0x0A,0xD4,0xF2,0x58,0xCB,0x24,0x03,0x07,0xCC,0x40, + + 0xF6,0xCA,0x10,0xE6,0x5B,0x78,0x45,0x71,0xC4,0x5A,0xE2,0x7D,0x77,0x69,0x81,0x05, + + 0x86,0x89,0x3D,0xB4,0x9D,0x9D,0x91,0x81,0xC2,0x70,0x55,0x61,0x18,0xFF,0xFA,0x6C, + + 0x52,0x66,0xF3,0xF1,0xB7,0x81,0x1E,0xA1,0x46,0xDE,0x4A,0x31,0x97,0xD5,0xC4,0xD4, + + 0xC3,0x0F,0x40,0x35,0x0A,0xB4,0xC3,0x40,0x8F,0x24,0xAA,0xC9,0xFF,0xD9,0x8C,0xA4, + + 0xD6,0x57,0xD9,0xFC,0xDA,0x24,0x22,0x50,0x82,0xF3,0xE2,0x55,0xA5,0xDA,0x1C,0x27, + + 0xB2,0x59,0xFF,0x36,0x86,0x92,0xF9,0x93,0x28,0x55,0x05,0x7A,0x19,0xA7,0xD0,0xFD, + + 0xA5,0x14,0x21,0x47,0xB3,0x3F,0xCA,0x02,0x9F,0x3B,0xCA,0x55,0x1E,0xD7,0x1B,0xA6, + + 0x19,0x95,0x33,0xFF,0x15,0xCE,0x76,0xE3,0x6D,0x57,0xC6,0x2D,0x71,0x63,0xE2,0x70, + + 0xF7,0x5B,0x88,0xEE,0xBB,0x05,0xE6,0x7F,0x5A,0xFE,0xC8,0x54,0xFC,0x34,0x78,0x0D, + + 0xF5,0x89,0xB9,0xE9,0x6E,0x32,0x4E,0x41,0x4F,0x4A,0x7B,0xCB,0x07,0x73,0x4C,0xFE, + + 0xA8,0xB9,0x07,0x7F,0xBF,0x40,0xDF,0x21,0x44,0x53,0x64,0xDD,0x85,0x82,0xA8,0x4A, + + 0xAA,0xA7,0xC3,0xBF,0x0A,0x5E,0x36,0xA7,0x45,0x51,0xEC,0x1F,0x02,0xD3,0xCA,0x5C, + + 0x52,0x0C,0xEE,0x3E,0x3D,0x35,0x86,0x9A,0xA1,0xAC,0x60,0xED,0x9A,0xD2,0x7F,0x19, + + 0xF6,0x17,0xB9,0xE5,0xF2,0x6F,0x31,0x49,0x68,0x22,0x44,0x9E,0xC6,0x7D,0x8F,0x68, + + 0xE4,0x5D,0x06,0xE2,0xD9,0xEA,0x17,0xC4,0xED,0x57,0x4A,0x0E,0x8B,0xD2,0xF9,0xAD, + + 0x3B,0x82,0xA2,0x74,0x27,0x8A,0xC8,0xCA,0x87,0x8D,0x1F,0x49,0x89,0x3C,0xE8,0x4A, + + 0x0E,0x7A,0x4D,0x78,0x74,0xA5,0xE3,0x48,0xE2,0xD1,0x70,0x54,0x16,0x11,0x7E,0x89, + + 0xF7,0xF6,0x59,0x40,0x7D,0xD8,0x4E,0xDB,0xC4,0xD9,0x08,0x79,0x56,0xE6,0x2D,0x97, + + 0xF1,0xAF,0xD0,0x64,0x82,0x2A,0x06,0xD5,0x48,0x6E,0xC6,0xCF,0xD5,0x47,0xA6,0x46, + + 0xED,0x1E,0x98,0xB7,0x5B,0xA4,0x0E,0xC3,0xAD,0x87,0x4D,0x21,0xB7,0x42,0x10,0x32, + + 0x13,0xC8,0x7B,0x6C,0x6F,0xE7,0xD4,0xE1,0x2E,0xCF,0x9E,0x4F,0xBC,0xC6,0x38,0xBA, + + 0x23,0x0C,0xC7,0x36,0x87,0x13,0x0F,0x4B,0x2F,0xD7,0x62,0x94,0xF0,0x6B,0x7B,0xB1, + + 0x20,0xCA,0xEA,0x85,0x91,0xAF,0xFF,0xF7,0xC6,0x95,0x87,0x4A,0x1F,0xA4,0xE2,0x3E, + + 0xC2,0xCA,0x82,0x84,0x1F,0xF9,0xFF,0xB5,0x2F,0xCC,0xAB,0x7B,0x94,0xD1,0xAE,0x9E, + + 0x02,0x8F,0x2E,0x3E,0x3F,0xE8,0x72,0xA7,0xC0,0x64,0x61,0x91,0x22,0xEB,0xE9,0x33, + + 0xAE,0x5A,0x63,0x96,0x57,0xA2,0x4A,0x5A,0xDB,0xDC,0xBA,0xAB,0xC1,0x6C,0xEB,0xF3, + + 0x8D,0xC9,0xF2,0xDE,0x38,0x2C,0xA5,0xA0,0xAE,0xCF,0x0E,0x56,0x69,0xF2,0x28,0x57, + + 0x3D,0x7B,0xE8,0xB6,0x1E,0x17,0x74,0x42,0xCE,0x83,0xA2,0xEC,0xC3,0x67,0x6C,0xB2, + + 0xF1,0xC0,0x55,0x4E,0xF4,0x9C,0xA8,0x69,0x65,0x3C,0x05,0x4F,0x79,0x42,0x9B,0x38, + + 0xDD,0x85,0xEB,0xCB,0x9A,0xFC,0x44,0x1A,0xC8,0xC6,0xCB,0x91,0x72,0xE3,0x73,0x57, + + 0x72,0x08,0x47,0xCD,0xDF,0xA5,0x5D,0xDF,0xED,0x62,0xE8,0x0C,0xF5,0x3C,0xC8,0x6A, + + 0x88,0xDD,0x2F,0x02,0x29,0x90,0xB6,0xD1,0x37,0xDB,0xAC,0xAA,0x47,0x67,0xEC,0x0A, + + 0x94,0x9B,0x6F,0x8F,0x17,0xBC,0x1C,0xCF,0xC4,0xD8,0xB4,0xB2,0x94,0xBE,0x43,0xF6, + + 0x4D,0x5B,0x65,0xF7,0xC1,0xF0,0xB5,0xE5,0xAA,0xD4,0x0D,0x60,0x36,0x72,0xA9,0xB3, + + 0x87,0x33,0xAE,0xB7,0xE7,0x83,0x61,0xC0,0xD8,0xAC,0xE4,0x70,0x50,0x0C,0xAE,0xDE, + + 0x04,0xC6,0x30,0x42,0x35,0x0B,0x7E,0x91,0x5B,0xB8,0x67,0xD8,0x0E,0xE1,0x2E,0x34, + + 0x82,0x9E,0xEC,0xED,0x03,0x4E,0x1B,0x02,0xE7,0xCA,0x57,0xD0,0x9A,0x97,0x62,0x2B, + + 0x2E,0xDB,0xDB,0xB6,0x09,0xED,0xB1,0x18,0x6B,0x2B,0x64,0xEF,0x76,0x36,0x6B,0x95, + + 0xB1,0xD5,0xAD,0x2B,0x0B,0xF5,0xE6,0x79,0xE4,0x65,0x56,0x72,0x64,0xE8,0x18,0x6F, + + 0xCE,0x8C,0xC6,0xC5,0x5D,0xB5,0xEF,0xAA,0xE1,0x75,0xEF,0xE8,0xD9,0x01,0xD6,0x72, + + 0xCF,0xD4,0xD5,0x1C,0xBD,0x61,0x47,0xCB,0x7A,0xCF,0xE4,0xAE,0xDA,0xE2,0x37,0xF9, + + 0x9F,0xB0,0xBF,0x8A,0xBA,0x19,0xFA,0x24,0x8F,0xDE,0xEF,0xBE,0xCF,0x6D,0xD0,0x93, + + 0x08,0x80,0x97,0x60,0xB3,0xD9,0x77,0x8E,0xEB,0x69,0xCC,0xD9,0x70,0x7D,0xEC,0x47, + + 0x28,0xB6,0xED,0xF0,0x38,0xB4,0x48,0xD7,0xCD,0xB9,0x89,0x9D,0x0E,0x29,0x64,0xDB, + + 0x88,0xDC,0x5B,0x5A,0x34,0x6A,0x1E,0xB5,0x04,0xD0,0xDE,0xEA,0xAA,0xB8,0xA0,0x23, + + 0xBA,0xD3,0x2E,0x32,0xBC,0x65,0x49,0x4B,0x4D,0xB2,0x62,0xC5,0xCA,0xEE,0x31,0x7E, + + 0x11,0x34,0x32,0x9B,0x88,0xBF,0x19,0x5B,0x6D,0xA3,0x41,0x7A,0x2A,0x9D,0x69,0xEA, + + 0xFF,0x6C,0x84,0xC4,0x78,0x8D,0x10,0x33,0x29,0x58,0xD7,0x56,0x56,0xB2,0xD7,0xAD, + + 0xE0,0xDE,0x90,0x05,0x33,0xD3,0xD8,0x28,0x82,0xEC,0x80,0x31,0xAF,0xE1,0x63,0x41, + + 0x81,0x42,0xCA,0xE5,0x9C,0xDF,0x26,0x85,0x30,0x61,0x49,0xDA,0xB1,0x22,0x57,0x3D, + + 0x7E,0xF3,0x09,0x56,0x6D,0x38,0x07,0xC0,0x62,0x03,0x1B,0xB7,0x40,0x76,0xC0,0x03, + + 0xA1,0x05,0xFA,0xB7,0x41,0x3F,0x13,0x0A,0x43,0xE4,0x74,0x06,0xA1,0x01,0x88,0xCC, + + 0x77,0x0F,0x99,0x4B,0x29,0xA8,0x62,0xF4,0x15,0x0E,0xE3,0xC8,0xB8,0x36,0x55,0x45, + + 0x0B,0x09,0x36,0xA3,0xB6,0xF2,0x0B,0x21,0xC4,0xF4,0xE9,0x58,0x39,0x15,0xC9,0x12, + + 0x20,0x1C,0xB7,0xE9,0x7A,0xF4,0xA6,0x01,0xE3,0x4E,0x35,0x06,0xED,0xC1,0x3D,0x18, + + 0xE3,0x19,0x75,0x6A,0xE7,0x21,0x20,0x16,0xEB,0xE9,0xAA,0x3C,0xFB,0x6E,0x42,0x28, + + 0x6A,0x91,0xB4,0xC4,0x78,0x09,0x4C,0x9D,0xA2,0x2A,0x98,0x2D,0x5F,0xFB,0x3D,0x21, + + 0x07,0xFC,0x07,0xE5,0xE3,0x65,0x41,0xDA,0xAA,0x97,0xBA,0x43,0x79,0xED,0xCB,0x59, + + 0x8D,0xB4,0x93,0x19,0x10,0xD9,0x1D,0x0C,0xC0,0xEF,0xA3,0x7D,0xC1,0x6D,0x0E,0xB8, + + 0x0E,0x43,0x6E,0xDF,0x33,0x24,0xD6,0xD7,0x4B,0x8C,0x4F,0x9C,0xDA,0xC5,0xB2,0xA9, + + 0x7A,0xF2,0xD4,0xA7,0x68,0x2D,0x58,0x9A,0xC9,0x51,0x83,0xAD,0xDB,0x3F,0x1A,0x38, + + 0xE9,0xAE,0x43,0x2E,0x69,0x83,0x33,0x23,0x7A,0x43,0x02,0xE7,0xDB,0xEE,0x71,0xBB, + + 0xAF,0x14,0x16,0xE5,0xF0,0xA7,0xE2,0x1B,0x29,0x47,0x77,0x0F,0x11,0x16,0x50,0x73, + + 0x06,0xBF,0x44,0x1D,0xFC,0x38,0xEF,0xDF,0x6E,0xAF,0xAE,0x5B,0x76,0x68,0x1D,0xD7, + + 0xEB,0xB8,0xB4,0x6B,0xD8,0xA8,0x64,0x97,0x9C,0x5E,0x27,0xAB,0xD2,0x33,0x10,0x72, + + 0x90,0xBF,0x86,0x07,0x30,0x59,0x75,0xEE,0x83,0x8F,0xEF,0x27,0x61,0x6F,0x45,0x09, + + 0xA7,0x1B,0x6A,0xD5,0xB5,0x1F,0x27,0x33,0x7C,0x18,0x1D,0x75,0x73,0x77,0x7E,0x33, + + 0x07,0xBB,0xFA,0x7C,0x53,0x30,0x4F,0x64,0x38,0x29,0xCE,0xE6,0xC1,0xD9,0x8C,0x49, + + 0xD6,0x1D,0xEC,0x5E,0x32,0xF5,0xA3,0x83,0x12,0x3B,0xD4,0xE0,0xBB,0xE6,0xD9,0x43, + + 0x22,0x7D,0xBC,0xB6,0x84,0xBF,0x5D,0xCD,0x4E,0x5B,0x86,0x95,0x72,0x60,0xCD,0x92, + + 0x00,0x11,0xEB,0x79,0xC1,0x93,0xBA,0x31,0xCB,0x4C,0x14,0xE6,0x89,0x0D,0x06,0x77, + + 0xA5,0xBE,0xFE,0x0E,0xA9,0x65,0x6E,0x8F,0xCB,0x19,0xCA,0xCE,0x87,0x14,0x9F,0xA8, + + 0x2D,0xC6,0x4E,0x04,0x98,0x31,0xA9,0x08,0x9D,0x3A,0x79,0x3E,0xE8,0x64,0x96,0xC9, + + 0xF4,0xB7,0xBF,0x3F,0xB0,0x6A,0xA2,0x19,0x5C,0x39,0xF7,0xE7,0x41,0x77,0xB0,0x5E, + + 0x7F,0x11,0x89,0x6D,0xBD,0x79,0xDF,0xF4,0x2B,0x1A,0xA7,0x2F,0xF9,0x73,0x6F,0xA6, + + 0x8B,0x9B,0x13,0x75,0xB7,0x91,0xA1,0x8E,0x49,0xCE,0x88,0x0E,0x7E,0xD1,0x95,0x5C, + + 0x79,0x00,0xEE,0x36,0x52,0xAE,0x46,0x6C,0x6D,0x8F,0xA0,0xFA,0x92,0x72,0x07,0xD0, + + 0xAC,0xAC,0x90,0x5E,0xA9,0xB5,0x0E,0x10,0x4F,0xA1,0x04,0xDF,0x9A,0x7C,0x47,0xC8, + + 0xC8,0x1E,0xAE,0x1D,0xAC,0x92,0xCC,0xB9,0xE1,0x44,0x8D,0xD2,0x10,0x1B,0x7A,0x4F, + + 0x02,0x88,0xC0,0x4C,0xA1,0xAD,0x50,0x6D,0x6F,0xCD,0x99,0x0C,0xF5,0x8E,0x27,0x96, + + 0x04,0xC1,0x84,0x29,0x97,0xBD,0xA9,0x40,0xE6,0xC7,0x94,0x09,0xD7,0xFD,0xA1,0x3A, + + 0x7F,0x09,0xEB,0xE5,0xB5,0xE2,0xDD,0xB1,0x55,0xCA,0xD3,0x36,0xD5,0xA2,0x3E,0xE0, + + 0xBD,0xED,0x10,0x75,0xB6,0xF3,0x94,0xC3,0x64,0x1C,0x00,0x55,0x2A,0x6A,0x3F,0x24, + + 0x25,0xC4,0x31,0xB7,0x5F,0xE4,0x76,0xE6,0x14,0xC9,0x0F,0x14,0x94,0xE4,0xB0,0x32, + + 0x03,0xA9,0x28,0x16,0x76,0x08,0x49,0x10,0xC8,0x43,0x1F,0x08,0x36,0xE1,0x4D,0xA1, + + 0x80,0x54,0x56,0xEE,0x62,0xB5,0x79,0x6A,0x44,0xDA,0x0A,0x20,0x3F,0x95,0xDE,0xD1, + + 0x16,0xDA,0x38,0xF7,0x7A,0xE6,0x7F,0x33,0xCB,0x87,0x80,0x04,0xE1,0x6E,0xC1,0x4A, + + 0x40,0x5D,0x62,0x96,0xBD,0xA2,0x86,0x48,0xB3,0xCE,0xB6,0x4E,0x14,0x15,0x54,0x36, + + 0x45,0x98,0x69,0x3B,0xFC,0x06,0xC5,0xB8,0xD0,0x82,0xBC,0x46,0xD2,0xAB,0x36,0x78, + + 0xBC,0x08,0xA5,0xFF,0x94,0xE8,0x9E,0xCE,0x6D,0x3B,0xA9,0x2A,0xFF,0xA9,0x0B,0xCD, + + 0x6C,0x24,0x33,0xEC,0xB0,0xC7,0x03,0x87,0x40,0xA9,0xFC,0x28,0xDE,0xBA,0x5A,0xAA, + + 0x56,0xCE,0x4E,0x3C,0xD4,0xDF,0x7D,0xDF,0xCC,0xD0,0xD2,0xE4,0x5D,0x4C,0x53,0x9A, + + 0x47,0x06,0x3B,0xAD,0x29,0xC3,0x3A,0x1A,0x0F,0x30,0x02,0xB9,0xB6,0x5E,0x24,0xB7, + + 0x88,0x1C,0x9D,0xE2,0x7F,0x08,0xCA,0x09,0x31,0x47,0xAA,0x3A,0x7B,0x6E,0x2B,0xDF, + + 0xD9,0xEE,0xD5,0xF2,0x55,0x1C,0x09,0xDB,0xCB,0x6F,0x9D,0xB2,0x36,0xB5,0x22,0x06, + + 0x25,0xC2,0xE3,0xF4,0xB6,0xAC,0x6D,0x63,0xC1,0x59,0xB1,0x4E,0x7F,0x7B,0x0C,0x49, + + 0xCC,0xA0,0xAD,0x12,0x67,0xBC,0x5C,0xF8,0xD0,0xDE,0x43,0x92,0x73,0x43,0x23,0xAA, + + 0xEC,0x83,0x1C,0xE5,0x56,0xF2,0x31,0xC3,0xA0,0x5F,0x35,0x41,0x9F,0x6B,0xC1,0x01, + + 0xA5,0x9B,0xE5,0x92,0xD6,0xD3,0xAD,0x5B,0x60,0x9E,0x00,0x77,0xF1,0xDF,0xA4,0x5B, + + 0xC7,0x92,0xFA,0xF6,0xC9,0x4B,0x38,0x12,0x62,0x9B,0xCA,0x5E,0xD5,0x91,0x7C,0xDF, + + 0x21,0x27,0x53,0xE7,0x96,0x4A,0x23,0x14,0x0C,0x4C,0xE2,0x07,0xD4,0xB5,0x4C,0xAD, + + 0x07,0x11,0xDF,0x77,0x49,0x69,0xCA,0xB3,0xE5,0xCD,0xCB,0x5E,0x55,0x5B,0xB6,0x57, + + 0xF5,0x8A,0x56,0x72,0x40,0x1A,0x86,0x81,0x44,0x96,0xCF,0xC9,0x54,0x56,0xA0,0xB1, + + 0x14,0xDA,0xDE,0x0C,0xAD,0xE5,0xC9,0x6D,0xAE,0xF8,0xCE,0x89,0xDD,0x07,0x08,0xA7, + + 0x07,0x3D,0x6E,0x06,0x9C,0xB1,0x86,0xCA,0x25,0xD0,0xB6,0xBA,0xF4,0xF6,0x2F,0x3F, + + 0x2C,0x5A,0x9F,0x3D,0xB0,0xEA,0x7F,0x0F,0xDF,0x64,0x89,0xD7,0x73,0x0C,0x7F,0x3F, + + 0xC6,0x73,0xA9,0x6F,0xFD,0xF9,0xAA,0xC8,0xBE,0x5D,0xE6,0xF9,0x58,0xF2,0x2E,0xCF, + + 0x4D,0x9F,0xB3,0xF3,0xD5,0xF8,0x48,0x32,0x4D,0x4C,0xA3,0x1D,0x44,0x21,0x56,0x68, + + 0x0D,0x2D,0xE6,0x5B,0xC0,0x19,0xF8,0x78,0xFE,0x80,0xF8,0x42,0xD6,0x2D,0x1F,0x49, + + 0x3F,0xC3,0xD9,0x67,0xC8,0xFC,0x2E,0x54,0x4B,0xD5,0xA1,0x47,0x15,0xED,0xAF,0x42, + + 0xD8,0xDD,0xBA,0xD9,0x77,0xAC,0x07,0x13,0x94,0x90,0x6F,0xFF,0xFF,0xFF,0xFF,0x7A, + + 0x76,0xDF,0xD2,0x4F,0xFB,0x44,0x43,0xD3,0xC4,0xCB,0x35,0x22,0xC4,0x04,0xB3,0xB5, + + 0xF6,0x8A,0xB0,0x24,0x71,0x8E,0xBC,0x14,0xA8,0xA0,0x08,0xC4,0xA2,0xC0,0xBE,0x30, + + 0x21,0xFD,0x11,0x76,0xFC,0x83,0xE6,0x90,0xFE,0xED,0xA9,0xDB,0x7C,0x6F,0x49,0x2C, + + 0x6A,0x47,0x29,0x67,0xF3,0x1F,0x47,0xD3,0xC5,0x45,0x0C,0xC6,0x55,0xE8,0x72,0x64, + + 0xF6,0xE7,0xBE,0x42,0xFB,0x2B,0x31,0x44,0xFE,0x47,0x82,0x32,0xB9,0x00,0x88,0x55, + + 0x0F,0xD8,0x58,0x36,0xF8,0xC6,0x06,0x92,0x47,0xE8,0x71,0x0A,0xC6,0x24,0xF6,0xE9, + + 0x71,0xB9,0x93,0x6A,0x79,0x42,0xE0,0xC0,0x7A,0x05,0x41,0x2A,0x2F,0x1A,0xD9,0xA9, + + 0x83,0x45,0x7D,0x37,0x78,0x34,0x48,0x43,0x28,0x03,0xE7,0xC8,0xBB,0x6A,0x58,0xA7, + + 0x7E,0xA7,0xFC,0x0B,0x3C,0x6A,0x70,0xC4,0x4C,0xE8,0x65,0x9D,0x6C,0xC7,0x9C,0x9A, + + 0xCB,0x08,0x2D,0x21,0xED,0x1A,0x24,0x80,0x97,0xE6,0xA1,0x80,0xAE,0xF2,0xA7,0x6B, + + 0xAC,0xA7,0x03,0x81,0x4C,0xFB,0x94,0x8C,0x3F,0x26,0x37,0x09,0xA4,0x95,0x55,0xFB, + + 0x8D,0x4B,0x3C,0xB1,0xEA,0x2B,0x48,0x4A,0xF7,0x9D,0x9B,0xC4,0xD5,0x2B,0x46,0x1B, + + 0xF7,0x4D,0x2E,0xDF,0x3C,0x81,0x74,0x8A,0xC6,0x0C,0x2D,0x1F,0x2C,0x0F,0xDC,0xDC, + + 0x43,0xFD,0xF4,0xE9,0x7A,0x29,0x62,0x87,0xE7,0x40,0x4A,0x0F,0x7D,0xCC,0x1D,0xAB, + + 0x8E,0xA3,0x97,0x3D,0x1A,0x31,0xD3,0xEA,0xF9,0x2A,0x28,0x12,0xBA,0x6C,0x73,0x7D, + + 0xFC,0x0F,0xAA,0x79,0xF3,0x22,0xF4,0x9F,0xDB,0xB2,0xE3,0x82,0x32,0x4C,0xBC,0x13, + + 0x46,0xBD,0x84,0xBF,0x59,0xAB,0x82,0x91,0xC1,0xD1,0x86,0xD1,0x9B,0x34,0x74,0x18, + + 0x84,0x98,0x29,0x92,0xA5,0x55,0x4E,0xE6,0x8A,0x35,0x38,0x90,0x84,0x7E,0x53,0xF1, + + 0x20,0xBD,0x85,0x81,0xB8,0x55,0x1C,0x52,0x64,0xDF,0xAF,0x15,0x69,0xDD,0x2D,0x02, + + 0x02,0x52,0x39,0xB2,0x10,0xAC,0x8D,0xC2,0x8D,0xF2,0x29,0xCA,0x52,0xDE,0x76,0xF0, + + 0x20,0xBB,0x7B,0x22,0x16,0x5A,0x2C,0x82,0xD1,0x31,0x44,0x86,0x85,0x11,0x7F,0x23, + + 0xAF,0x54,0xF2,0x79,0x52,0x31,0xA5,0xD7,0xC2,0x2A,0x0C,0x8A,0xB9,0x56,0xE5,0xB2, + + 0x01,0x95,0xFB,0x69,0x78,0xA5,0x6D,0x0A,0x4E,0x5B,0xED,0x1A,0x7D,0xD0,0x75,0x2B, + + 0x0F,0x1A,0xB4,0xA6,0x89,0xBE,0xCD,0x7E,0x1C,0x8A,0x4D,0xC4,0x52,0xF6,0x38,0xBD, + + 0x43,0x17,0x32,0xEE,0x1C,0x95,0x2E,0x98,0x0D,0xF7,0x00,0x88,0x91,0x49,0x8E,0x89, + + 0x75,0xC6,0x9B,0x7E,0x1D,0xB2,0x60,0xBF,0x4D,0xF4,0xE6,0x98,0x90,0x08,0x87,0x0B, + + 0x6A,0x80,0x96,0x6F,0x14,0x97,0xB7,0xDB,0x8A,0x96,0xEF,0x8A,0x11,0x2B,0xBB,0xFB, + + 0x26,0xAD,0xDB,0xAC,0xD5,0x94,0x89,0x48,0x4A,0x9B,0xE7,0x9A,0x10,0xEA,0x39,0xEF, + + 0x8B,0xC3,0xE6,0x46,0x1E,0xB7,0xB7,0x16,0x93,0x6A,0xA5,0x1F,0xFE,0xF1,0xB3,0xD0, + + 0x8E,0x22,0x94,0xF3,0x4D,0x92,0x64,0x15,0x1B,0x06,0x4E,0x9E,0x90,0xAC,0xF3,0xAB, + + 0x55,0x53,0xCC,0xF0,0x51,0x7A,0x28,0x93,0x78,0xC1,0x85,0xC3,0x11,0x1A,0x4E,0xBF, + + 0x1C,0x0F,0x6B,0xF9,0xD8,0x42,0x5B,0x12,0x58,0x31,0x6B,0x9F,0x10,0x8E,0x26,0x1F, + + 0x02,0x00,0x30,0xF6,0x53,0x01,0x4E,0x8F,0x60,0x35,0xB4,0x75,0x52,0x80,0xAF,0x5D, + + 0xF8,0xFD,0xF2,0xC2,0x7D,0x40,0x2E,0x8A,0xAE,0x52,0x41,0xDD,0xE6,0xA1,0x16,0x3D, + + 0xD0,0x77,0x37,0xED,0x69,0xED,0x2F,0xDF,0xC4,0x3F,0x35,0x55,0xEB,0xE0,0x80,0x6D, + + 0x10,0x0E,0xD0,0x71,0xB1,0x7C,0x82,0x82,0xFB,0x6C,0x3D,0x29,0x3C,0x70,0x5E,0xFF, + + 0x6E,0xB7,0xF2,0xF4,0xFD,0xE0,0x88,0x46,0xC4,0x28,0x24,0x98,0xDB,0x19,0x93,0x2D, + + 0x6F,0x88,0x4C,0x72,0xE8,0x28,0x40,0x89,0xEB,0xC8,0x43,0x06,0xD7,0xF3,0x9E,0x3D, + + 0xEC,0x55,0xDB,0xF7,0x53,0x09,0x09,0x01,0x35,0xA3,0x61,0x17,0x56,0xF9,0x96,0x2D, + + 0xA9,0x58,0x3D,0xA9,0x7E,0xD6,0x82,0x54,0x66,0x86,0x69,0x84,0x53,0x6A,0x5F,0xE0, + + 0x28,0x25,0x9A,0xF5,0x6F,0xA8,0xE7,0x0E,0xA5,0x5B,0xA4,0x4C,0xA3,0x45,0x74,0xF8, + + 0x09,0xC9,0x00,0x0C,0xBC,0x16,0x04,0x97,0x2F,0x36,0xA8,0x3F,0xB6,0x3A,0xB5,0x89, + + 0x4E,0x59,0x63,0x0E,0x32,0xAC,0x21,0xD4,0x27,0x19,0x66,0x0B,0x35,0x79,0x2D,0x06, + + 0xBE,0x4F,0x3B,0x20,0x8D,0x70,0x45,0x82,0xE9,0x66,0x81,0x1B,0xB5,0xE6,0x38,0xCA, + + 0x72,0x23,0x0E,0xD1,0xEB,0x25,0x2B,0x0C,0xEB,0x53,0xA0,0x38,0xB5,0x88,0x14,0x5D, + + 0x2B,0x20,0x22,0x3C,0xE0,0xC8,0xC2,0x84,0x5F,0x80,0x6C,0x8D,0xDB,0x60,0xC3,0xBB, + + 0x30,0x5D,0xC3,0xA5,0xBA,0xB5,0x72,0x0D,0x35,0xDE,0x63,0x9F,0x1A,0x4F,0xFD,0xAA, + + 0x2C,0xCF,0xD3,0x00,0x38,0xBF,0x84,0x5F,0x4D,0x23,0xA9,0x29,0x34,0x8B,0x1F,0xF2, + + 0xA4,0x8F,0x04,0xF4,0x56,0x7C,0x06,0x92,0x98,0x7F,0xCC,0x82,0x9F,0xB4,0xBC,0x61, + + 0x4F,0xF4,0xFC,0x90,0xFD,0x40,0xAC,0xC1,0x09,0x7A,0x18,0xB2,0x35,0x44,0x9E,0xF3, + + 0x24,0x84,0xDB,0x80,0x90,0x16,0x95,0xD1,0x86,0x8E,0x8F,0x17,0x61,0x5D,0x15,0x60, + + 0xC3,0xFD,0x09,0xB3,0x86,0xA7,0x45,0xA7,0x05,0x52,0xE7,0xFF,0x89,0x5C,0xDC,0x8D, + + 0x95,0xD5,0xF2,0xEF,0xDD,0xF0,0xF4,0xF2,0x00,0x6B,0x64,0x96,0xF6,0x5B,0x7E,0xA7, + + 0xCC,0xD1,0x48,0xF2,0xB8,0x18,0x22,0x10,0x63,0x50,0xDC,0x65,0xD4,0xB4,0x5B,0xEB, + + 0xCE,0x9B,0xDF,0x77,0x27,0x19,0x46,0x01,0x0F,0xCC,0x8D,0x6F,0x53,0x7F,0x57,0x63, + + 0x3E,0x38,0x38,0x44,0xD0,0x1A,0x82,0x34,0x1E,0x21,0x02,0x84,0x83,0x01,0x40,0xB7, + + 0xC5,0x49,0x1E,0xBE,0x3C,0x47,0x33,0x59,0xE8,0x55,0x16,0x5E,0xF6,0x2B,0x78,0xEA, + + 0xAD,0x8F,0xB0,0x0E,0xC2,0x14,0xA8,0x8B,0xCC,0x58,0x3D,0x81,0x21,0x74,0x3D,0x89, + + 0x1F,0x37,0xE6,0xE9,0x98,0x17,0x65,0xE4,0xC8,0x77,0xC9,0xA8,0xD8,0x2F,0xBF,0x6B, + + 0x5E,0x3A,0x79,0xD8,0x63,0xFA,0xBD,0x48,0x69,0x56,0xC4,0x44,0x7F,0xE7,0xC2,0xEE, + + 0xA1,0x31,0xB8,0xBE,0xBE,0xA3,0x48,0x08,0x0F,0xD8,0xAC,0xEC,0xCD,0x55,0x39,0xAA, + + 0xAF,0x82,0x8F,0xFA,0x5C,0x18,0x1F,0xDE,0x04,0xD2,0xE8,0xC3,0x94,0x0C,0xB7,0x58, + + 0xD8,0x33,0xD9,0x63,0xDF,0xBA,0x0E,0x91,0x8F,0xDA,0xE0,0x65,0xDA,0x03,0x51,0x7A, + + 0xCE,0x9B,0xF8,0x2C,0x3B,0x32,0xFF,0xC9,0x8F,0xDD,0x44,0x4E,0x8B,0x50,0x93,0x24, + + 0xA1,0xDF,0x23,0xF2,0x23,0xE1,0x4E,0x09,0xBF,0x5B,0x68,0x63,0x92,0xE0,0x98,0x63, + + 0x68,0xAA,0x30,0x04,0xB6,0x4F,0x0D,0xC9,0x4B,0x03,0xC7,0x56,0x12,0x62,0xB5,0x63, + + 0x7F,0x6E,0x39,0xFA,0xA3,0x90,0x75,0x57,0x3F,0x39,0x99,0x10,0x52,0x66,0x71,0x15, + + 0x61,0x42,0x6E,0xD5,0x95,0x06,0x0A,0xA8,0x1D,0x52,0x66,0x8A,0xD3,0x61,0x45,0xA8, + + 0x17,0x49,0xD1,0x46,0xFC,0x3F,0xC6,0x13,0x2E,0x28,0xC6,0x4C,0xE1,0x79,0x36,0x7D, + + 0xE2,0xAA,0xD9,0x13,0xCD,0x2F,0x64,0x57,0x20,0x31,0x81,0x28,0xF6,0xBA,0x3F,0x6D, + + 0x92,0x4B,0x33,0x23,0x6D,0x8B,0x37,0xA8,0xC3,0x06,0xF9,0x07,0x77,0x99,0xDF,0xA1, + + 0x55,0xA6,0x49,0x36,0x4D,0x8A,0x4F,0x44,0x70,0x0A,0x66,0x29,0x2C,0x69,0x5C,0xEA, + + 0x0C,0xA5,0x77,0x7E,0xBF,0x6A,0x4B,0xAF,0xAD,0xB7,0xAC,0xF4,0x7B,0xC8,0xDA,0x9C, + + 0x14,0x66,0x29,0x34,0xF8,0xD6,0xDA,0x00,0x13,0xBD,0x1C,0xD4,0x0D,0x24,0x95,0x3B, + + 0xAC,0x46,0x89,0x9D,0x44,0x1B,0xCE,0x00,0x29,0xF5,0xCA,0x92,0x7D,0x63,0x52,0x9C, + + 0x2C,0xFA,0xD2,0x01,0x3C,0x22,0x8D,0x4A,0xA5,0xC4,0xD9,0xDB,0x59,0xDB,0xD4,0xCC, + + 0x22,0x82,0xD7,0x9C,0x46,0x25,0x0A,0x6C,0xE3,0xBA,0xEA,0x86,0xA7,0x23,0xD9,0x69, + + 0x67,0x4F,0x65,0x37,0xC6,0x6F,0x9A,0x59,0xDB,0x40,0xE4,0x54,0xD6,0xEB,0x7B,0x29, + + 0xD5,0x85,0x47,0x88,0xA2,0x21,0x09,0xA4,0xA2,0xAF,0xF3,0x64,0x92,0x7F,0x5F,0x53, + + 0x2A,0x04,0x87,0x1D,0x42,0x12,0x26,0x8B,0xE8,0x0F,0x5C,0x3D,0x56,0xCF,0x2A,0x7A, + + 0x81,0x99,0x03,0x96,0xDB,0xD1,0xB3,0x89,0x89,0x01,0xCD,0xB8,0xD5,0x7B,0xCC,0xF6, + + 0xD6,0x01,0xCE,0xE7,0x5D,0x2A,0xB0,0x23,0x59,0x59,0x3B,0x81,0x42,0x57,0x07,0x61, + + 0x8E,0x09,0xDC,0x02,0xD5,0x3B,0xD1,0x24,0xA3,0xA1,0x55,0x21,0xA9,0x22,0xB5,0x6E, + + 0xA7,0x9B,0xE9,0xE1,0x90,0x83,0x49,0x59,0xF3,0x1E,0x27,0xC4,0x9D,0x7A,0xC0,0xBF, + + 0x03,0xF4,0xD2,0xF1,0x34,0x15,0xF8,0x7F,0x61,0xA7,0x3B,0x06,0xF0,0x3C,0x59,0xD2, + + 0x35,0xBE,0x06,0xA7,0x5F,0x94,0x04,0x41,0x00,0x84,0xBC,0xB0,0x02,0xF8,0x1C,0x76, + + 0x07,0x5E,0xE4,0xA7,0x51,0x3D,0x95,0xC0,0x61,0x5B,0x09,0x15,0xFA,0x79,0x58,0xD0, + + 0x42,0xE8,0xF5,0xE5,0xDE,0x98,0x48,0x75,0xCB,0x43,0xA5,0x77,0xF6,0x4E,0xF2,0x60, + + 0x6A,0x55,0xDF,0x90,0x5B,0x18,0xE9,0x40,0x76,0x15,0x14,0x9A,0x14,0xF5,0xCE,0xC8, + + 0x87,0x02,0x18,0xEE,0x0A,0x79,0xA6,0x43,0xE4,0x84,0xD5,0xDC,0x61,0x62,0xFC,0x81, + + 0x0D,0xE5,0x7F,0x65,0x32,0xFF,0xF0,0x57,0xDB,0x1B,0xCE,0xA9,0x5F,0xD7,0xCA,0xFF, + + 0x56,0x1D,0x77,0x75,0xD1,0x76,0x78,0x4A,0x85,0xF6,0x33,0xDB,0x06,0x60,0x66,0x4D, + + 0xC3,0x2D,0x66,0xBE,0x58,0x00,0x6E,0x78,0xC9,0xD7,0xAE,0xCB,0xD9,0x7A,0x74,0x2B, + + 0x13,0xE2,0xA8,0xF1,0xCE,0x9B,0x4A,0xF2,0xCA,0xDD,0x25,0x1E,0xDA,0xF7,0x0D,0x2B, + + 0x8B,0xAE,0x07,0xE9,0x53,0x50,0xC4,0xD8,0xDA,0x1C,0x5F,0x28,0x5B,0xF4,0x15,0x47, + + 0xC3,0xFE,0x5E,0x9D,0xBA,0xB2,0x27,0xC2,0x87,0xAA,0xA0,0x1F,0x26,0xA2,0xD8,0x8A, + + 0xA1,0x53,0xA1,0x84,0xDD,0x17,0x28,0x27,0x8C,0x21,0x8A,0xCE,0x00,0xAF,0xA5,0xF5, + + 0x36,0x23,0x57,0x69,0x9A,0x27,0x66,0xD0,0x19,0x44,0xA9,0xC9,0x53,0x52,0xD9,0xC5, + + 0xA2,0xC0,0x99,0x40,0x5E,0xB3,0x20,0xCB,0x4A,0x0F,0xE8,0xAF,0x71,0x43,0x91,0x2E, + + 0x22,0x91,0x29,0x57,0x8D,0x5E,0x60,0xB5,0xA1,0x3C,0xB4,0xB5,0x1C,0xB4,0x2E,0xB2, + + 0x6F,0x25,0xCF,0x79,0x7A,0xE6,0x4C,0xDE,0x25,0x6D,0x66,0x25,0xDE,0xA5,0x7D,0xA2, + + 0xED,0x24,0xFE,0x63,0xA4,0xE8,0x6D,0x9A,0xA1,0x88,0xBA,0x16,0x55,0x65,0xF7,0xA9, + + 0x23,0x29,0xEB,0x37,0xF5,0xD2,0x64,0x89,0x63,0x69,0x5A,0x1C,0x03,0x1B,0xFF,0xD7, + + 0xA3,0x94,0x16,0xA7,0x41,0x96,0x86,0x18,0x4A,0x31,0xA1,0x2F,0x55,0xEF,0x9A,0xB6, + + 0xAB,0x8E,0xC0,0xF0,0x1F,0x28,0xF2,0x76,0xF1,0x15,0x8A,0xD1,0xB5,0xD9,0x52,0x98, + + 0xC4,0xFE,0xCA,0x4D,0xE7,0x04,0x82,0xC5,0xA4,0xF8,0x7A,0x63,0xC5,0xF2,0x0D,0xF1, + + 0x2D,0x0A,0x99,0xE7,0xC8,0xE5,0x4D,0x07,0xFF,0xC8,0x5F,0xB0,0xDD,0x8A,0x13,0x7B, + + 0xB3,0x8D,0xBA,0xFD,0xF6,0xA4,0x97,0xA4,0xCE,0x8B,0x18,0x49,0xFE,0x09,0x5A,0xB5, + + 0xE7,0xBD,0x22,0x6F,0xDD,0x51,0x7A,0xB3,0xA7,0xFD,0x26,0x1C,0xFD,0xEA,0x33,0xF4, + + 0xAA,0x86,0x93,0x2D,0x27,0xE2,0x04,0x52,0x7C,0x0A,0x79,0x7C,0x39,0xEB,0x3B,0xD3, + + 0x09,0xAF,0x9B,0xBF,0xF7,0x9F,0x39,0x89,0xED,0x24,0xFB,0x48,0x7D,0x15,0xEB,0xD3, + + 0x2A,0x86,0xD7,0xC0,0xFC,0xD5,0xC3,0x84,0x26,0xDE,0x73,0xBA,0x7E,0x65,0x0A,0x38, + + 0x85,0xFC,0xB2,0xAF,0xCB,0xDC,0x25,0xE5,0xAE,0x31,0x34,0xC0,0x08,0xBF,0x6D,0xF4, + + 0x86,0x1C,0x73,0x69,0xDC,0xE0,0xBE,0xC4,0xA7,0xF1,0x43,0x5E,0x71,0xBC,0xC2,0xC3, + + 0xE4,0x89,0xC3,0xAE,0xB7,0xF2,0x7D,0x3B,0xD7,0x06,0xD5,0xF4,0x5F,0xFF,0x4D,0xC0, + + 0x56,0x9C,0x41,0x08,0xB4,0x00,0x35,0x23,0x0C,0xC2,0x11,0x28,0xF4,0x53,0xA4,0xE3, + + 0xE5,0x19,0x9A,0xEE,0x30,0x95,0x65,0x66,0x7F,0x08,0x5B,0x62,0x33,0x51,0xFA,0x38, + + 0xCE,0xA4,0x2C,0xF7,0xCD,0x48,0x04,0x02,0xB1,0xE4,0xF8,0x14,0xF5,0xFD,0x1D,0x33, + + 0xCF,0x37,0x8D,0xA5,0x95,0x67,0xB5,0xC2,0x1C,0x2B,0x95,0xA7,0xD8,0x7D,0x95,0x23, + + 0x4D,0x36,0x95,0x27,0xC3,0x16,0xBD,0xD2,0x24,0x5A,0x49,0x85,0x54,0x0C,0x7F,0x0E, + + 0x8B,0x88,0xFF,0x92,0x99,0xB3,0xA1,0x55,0x6A,0x6B,0x8C,0x48,0x7A,0x72,0x2F,0x7C, + + 0xAF,0x65,0x94,0x76,0x39,0xF6,0x04,0x52,0x37,0x96,0xBE,0xAD,0x6E,0x88,0xDF,0x63, + + 0xEE,0xD5,0x21,0xE9,0xFC,0xF5,0x3A,0x2F,0xAF,0xFE,0x93,0x8B,0x97,0xAB,0x15,0x1F, + + 0x9F,0xB0,0xF6,0x83,0x18,0x3B,0x1F,0xAB,0x0C,0xC0,0xE6,0x7E,0x58,0xF0,0xF0,0x4E, + + 0x0A,0x8F,0xF7,0x4A,0x16,0xA8,0x0E,0xFB,0x3D,0x57,0x23,0x6A,0x23,0xA3,0x50,0xEF, + + 0x4E,0x6D,0x78,0xE1,0x0F,0xFF,0x6A,0xF0,0x0C,0x22,0xFA,0x1C,0x5B,0xFD,0xD8,0x29, + + 0xE6,0x7F,0xBD,0xCE,0x1D,0x0B,0xBA,0xDA,0x82,0x9C,0x97,0xAF,0x52,0x75,0x37,0xC4, + + 0x4E,0x30,0x62,0x7A,0xDC,0x16,0x07,0xF9,0xAF,0x7F,0xFF,0xFF,0xFF,0xFF,0x60,0x03, + + 0x55,0x0D,0xC7,0xF7,0xFB,0x44,0x16,0x09,0x23,0x48,0x67,0x42,0xA7,0x99,0x32,0xF8, + + 0x81,0xCE,0xB6,0x39,0xB2,0x63,0x63,0x43,0x2D,0x4E,0xC1,0x36,0x36,0x41,0x19,0x05, + + 0xA8,0x14,0xBF,0x29,0x33,0x47,0x07,0x09,0xC6,0xD0,0x89,0x31,0x25,0x6D,0x37,0xC9, + + 0xA2,0xB1,0x4A,0x14,0x7A,0x47,0x40,0xF0,0x64,0xC4,0xC0,0x37,0x34,0xE4,0x45,0xB2, + + 0x42,0x4B,0xB9,0x2B,0x4F,0xDB,0x68,0x88,0x62,0x0B,0x84,0x16,0xB9,0xF5,0xA0,0x44, + + 0x05,0xAF,0xC7,0xAF,0xA2,0xBD,0xA0,0x98,0x63,0x08,0xE6,0x4C,0xDE,0x93,0x79,0xA9, + + 0x88,0x49,0x78,0x19,0x65,0x1B,0xE9,0x81,0xC6,0xC6,0xEF,0xC4,0x90,0x99,0x83,0xB9, + + 0x91,0x4A,0xB2,0x97,0x17,0x29,0xB5,0xE3,0x9F,0x4F,0xD1,0x71,0x5B,0x3C,0x5B,0xB7, + + 0xAD,0x03,0xBC,0x34,0xBB,0x4D,0x92,0x25,0x2B,0x40,0x96,0x38,0xDA,0x4C,0x52,0x9D, + + 0x3A,0x88,0x1C,0x1D,0x0C,0x32,0x61,0x5A,0x08,0x4D,0xCA,0x20,0x41,0x72,0x42,0xE1, + + 0xCB,0x47,0xBD,0x34,0x3B,0x8A,0x05,0x01,0xCE,0xD8,0x18,0x5E,0xB4,0x65,0xB3,0xF9, + + 0x85,0x4B,0x7C,0x99,0xCB,0x44,0x63,0x28,0xF9,0x09,0xBB,0x4B,0x3B,0x4B,0xBD,0xA0, + + 0x00,0x41,0x66,0xC8,0x5A,0x99,0xD6,0x98,0x16,0x03,0xEC,0x54,0x1A,0xC3,0xF5,0x48, + + 0xAC,0x16,0xEA,0xFF,0x53,0x9C,0xCD,0x49,0x22,0xCF,0xBC,0xDD,0x5A,0x2D,0xAF,0xD6, + + 0x89,0x6E,0xC5,0xED,0xD2,0xFF,0x93,0xC1,0x5A,0xE1,0xC4,0x1E,0xA2,0x02,0xDB,0x3F, + + 0x74,0x14,0xC7,0x6B,0xA8,0x3D,0x7D,0x44,0x68,0xCB,0xFF,0x89,0xB8,0x6D,0xC1,0xF3, + + 0x73,0x1B,0x92,0x6C,0xB0,0x7D,0xE8,0xDF,0xC3,0xF0,0xAA,0x99,0x51,0xF0,0x72,0xA5, + + 0x12,0xD6,0x94,0x0C,0x3C,0xD0,0x5B,0x43,0x67,0xE3,0xC5,0x27,0x94,0x1F,0x85,0xA0, + + 0xBE,0x9F,0xDD,0x95,0x59,0x03,0x04,0xB0,0xD0,0x10,0x6F,0x4D,0x3A,0xB2,0xB5,0x6E, + + 0x48,0xF2,0x85,0xEA,0x70,0x51,0xA9,0x8E,0xDD,0x86,0xFF,0xB9,0xF0,0xB3,0x01,0x26, + + 0x00,0xD4,0x6E,0xAB,0x91,0x75,0x6A,0x40,0xED,0xA2,0x47,0x60,0x56,0x51,0xB4,0x38, + + 0x29,0x58,0x96,0xA5,0x4F,0x2A,0x66,0x03,0x17,0xF8,0x1C,0xD0,0xA9,0xF3,0xC4,0xA7, + + 0x91,0xF4,0x62,0xE8,0x35,0x75,0x5D,0xE5,0x3E,0x55,0xB7,0xF4,0xF1,0x96,0x14,0x58, + + 0x04,0x0C,0x75,0x05,0x10,0x59,0xCE,0xB6,0x29,0xA6,0xDB,0xB5,0xA7,0x19,0xAA,0x17, + + 0x29,0x58,0x42,0x09,0x7B,0x18,0x87,0x2C,0x6F,0x18,0x4C,0xA0,0x4B,0xEC,0x18,0xAD, + + 0x9A,0x54,0x18,0x7E,0xBB,0x65,0x61,0xFF,0x94,0xEF,0xC1,0x3E,0x5B,0x49,0x13,0x04, + + 0xCB,0xD0,0xD7,0xEF,0xFA,0x50,0x77,0xAB,0xA7,0x57,0x4D,0xB0,0xFE,0x69,0x57,0x9D, + + 0x81,0xF9,0x69,0x6D,0xB1,0x34,0xA4,0x2B,0xE9,0x51,0xA7,0x55,0xF3,0x34,0x80,0xAE, + + 0xA8,0x1F,0xA4,0x4C,0x3B,0x7C,0x1E,0xA0,0x6C,0x4F,0x8F,0xB5,0xDF,0x0A,0xF6,0x5A, + + 0x09,0xED,0x0E,0x8D,0xE3,0xB6,0xFE,0x9A,0xD8,0x38,0x9E,0xBA,0x5D,0x79,0x42,0x2B, + + 0x99,0x2C,0xE3,0x12,0x46,0x4F,0x10,0xAB,0x66,0x52,0x96,0x8B,0x6C,0x76,0x37,0x31, + + 0xB9,0x52,0xCB,0x21,0xBB,0x2A,0x67,0x12,0x47,0x52,0xDC,0x3A,0xC8,0x15,0xEC,0x3B, + + 0x37,0x84,0x1F,0xE4,0xFD,0x91,0x73,0xD1,0xAD,0xB1,0x34,0xA2,0x17,0xEF,0x90,0x82, + + 0xA2,0x85,0x17,0x76,0x19,0xC9,0x7B,0xC0,0xB8,0xCE,0x40,0xDE,0x47,0xAC,0xFB,0x02, + + 0xB7,0x03,0xAB,0x05,0x7F,0x43,0x49,0x50,0xF0,0x80,0x21,0x55,0xE7,0x83,0x2F,0xFB, + + 0xE5,0x08,0x3F,0x97,0x93,0x71,0xF9,0xAB,0x2E,0x6E,0x46,0xDF,0xCB,0xAE,0xA5,0x24, + + 0x8B,0x72,0x58,0xC4,0xD3,0x69,0x88,0x10,0xAD,0xC7,0xE6,0x5E,0x50,0xC5,0x2C,0x34, + + 0x8A,0x53,0x5C,0xB4,0x2C,0x35,0xC0,0x8D,0xAE,0x74,0xB8,0x47,0x2F,0xA7,0x9E,0xD3, + + 0x71,0x9D,0x99,0xAF,0x88,0xEB,0x0F,0x5A,0xF5,0xC7,0xD0,0x05,0x29,0x6D,0x61,0x43, + + 0x7A,0x06,0x55,0x70,0x34,0xBC,0xD5,0xEC,0xC4,0x1E,0xED,0x7D,0x76,0x58,0xA6,0xEC, + + 0x67,0x99,0xA5,0xAE,0xBD,0x4B,0x25,0xC8,0xA5,0x59,0x1E,0xB1,0xB7,0x59,0x73,0xDB, + + 0xA8,0x00,0xAE,0x7E,0x41,0xAF,0x42,0xCA,0x0A,0x68,0xB4,0x2D,0xFE,0x18,0xA4,0x79, + + 0x67,0xBB,0xFA,0xDF,0x39,0x23,0xF3,0xB3,0x2F,0x37,0xEA,0xBC,0xDA,0xF9,0x2F,0xFB, + + 0x89,0xAA,0x02,0x88,0x3C,0xA2,0xAD,0xD1,0xCB,0x59,0xE2,0x25,0xBA,0x1B,0x99,0xAC, + + 0x3D,0xAE,0xE5,0x28,0xB2,0xA3,0xB2,0xC2,0x14,0x8E,0x32,0x2E,0x9B,0x90,0x92,0xB2, + + 0x2B,0xC0,0x2A,0xF6,0x1D,0xA0,0x7A,0x7A,0xC2,0x60,0x53,0x0D,0x63,0x4C,0xDB,0xB4, + + 0xBD,0x6C,0x57,0xBF,0x96,0xA1,0x71,0x38,0xCE,0xCE,0x4C,0x20,0x4B,0x33,0x90,0x24, + + 0xFB,0x94,0xB2,0xD9,0xFB,0xA9,0x65,0xE8,0xB3,0x30,0xC3,0x4E,0x7E,0x40,0x1E,0x79, + + 0xD8,0x71,0x9E,0x6E,0xB4,0x7F,0xF5,0x26,0x32,0xF0,0x1C,0xB2,0x95,0xEB,0xBD,0x8D, + + 0x19,0x2A,0x05,0x01,0x96,0xB7,0x2B,0x8C,0x15,0x93,0x46,0x5E,0x2F,0xBE,0xE5,0xAE, + + 0xF6,0x46,0x85,0x96,0x55,0xB4,0xF5,0x3A,0x48,0x27,0x25,0x41,0xC7,0x26,0x29,0xAC, + + 0xC9,0xD1,0x84,0xBC,0x14,0x1A,0xF5,0xB7,0x67,0xD7,0xED,0xAE,0xEB,0xE8,0x9B,0x2A, + + 0x2C,0xD9,0x71,0xCE,0xB6,0x14,0x8D,0xC5,0xC7,0xAB,0x4C,0x69,0x64,0xB9,0x35,0x55, + + 0x21,0x86,0x47,0x1C,0x8C,0x4A,0x54,0x90,0x86,0x2E,0x2C,0x85,0x5D,0x7C,0xC9,0x5C, + + 0x4D,0x27,0x49,0x62,0x63,0xD5,0x4C,0xA1,0x47,0xEB,0x14,0xA7,0xF2,0xBA,0x63,0x3B, + + 0x21,0x3A,0xB4,0x7C,0x12,0x6D,0x79,0x0D,0x1C,0x48,0x7D,0x17,0xE6,0x02,0xB3,0x12, + + 0xF8,0x09,0x30,0xEE,0x70,0x15,0x7F,0xC8,0x97,0xB4,0xF2,0xC8,0x83,0xFE,0x38,0xAF, + + 0x9E,0xD4,0x74,0x9F,0xBF,0x85,0x3E,0xFA,0x3F,0xC2,0x59,0x56,0x59,0xB6,0x80,0xB2, + + 0xCF,0x50,0x31,0x6D,0x8F,0xBE,0x88,0x30,0x19,0x5C,0xE7,0xB2,0x5D,0x96,0x77,0x9F, + + 0x85,0x79,0xA9,0xFD,0x42,0xA0,0x1F,0x4F,0xE5,0x99,0x07,0x40,0xDF,0x16,0x1E,0x3C, + + 0x28,0x24,0x98,0xF3,0x2E,0xF1,0x2C,0xDF,0x06,0xDF,0x65,0x6A,0x79,0x45,0x94,0xA8, + + 0x1C,0xCF,0x7D,0xEF,0x03,0xFF,0xBE,0xEA,0x78,0xD3,0xF6,0xC6,0x79,0xBC,0xE6,0x23, + + 0x24,0x63,0x28,0x3C,0x9C,0x35,0x0E,0x8D,0x55,0xC1,0x48,0xA8,0x3C,0x7E,0x97,0x59, + + 0x2F,0xDB,0xFB,0xD5,0x1E,0x10,0x47,0x10,0x6C,0xD2,0x98,0x6D,0xBF,0xF7,0x16,0xE9, + + 0x8C,0x6D,0xA4,0xF7,0x9C,0x61,0xEF,0x53,0x3C,0xCF,0xA4,0x42,0x9A,0x89,0x88,0x57, + + 0x2F,0xDD,0x30,0xEE,0x01,0x6C,0xD3,0xD6,0x51,0x0C,0xB8,0xD4,0xF0,0x9E,0xFA,0x08, + + 0x2D,0x19,0x3C,0xFA,0xE7,0x22,0xEA,0xC9,0x7A,0x0F,0xAF,0x51,0xF4,0x64,0xDD,0x4F, + + 0x12,0x3C,0xF6,0x91,0x99,0x44,0xD6,0xD7,0xE5,0x45,0xA7,0x4D,0x0F,0x22,0xD0,0x33, + + 0x6E,0xA5,0xDE,0x7B,0x6F,0x66,0xF0,0x22,0xC1,0xEF,0x2F,0xE0,0x55,0xC7,0xE8,0x22, + + 0x61,0x59,0x70,0xAB,0x20,0x85,0x18,0xB6,0x0B,0x07,0xF8,0xF0,0x58,0xDB,0x79,0x71, + + 0xF0,0xA9,0x8F,0x26,0xA1,0x46,0x39,0xE1,0xE0,0x56,0xE6,0x28,0xD4,0xFE,0xD9,0xD3, + + 0x03,0xDF,0x71,0xAE,0xF8,0x2D,0x91,0xC0,0xB8,0x43,0xE7,0x09,0x5C,0xC1,0xFD,0xF0, + + 0x08,0xB3,0x39,0xF3,0x3C,0x44,0xA7,0xA8,0xE9,0xE7,0xAA,0xD0,0x58,0x74,0xE6,0x77, + + 0xD7,0x54,0x88,0xE3,0x94,0x84,0x24,0x00,0xC4,0xEF,0xC5,0x97,0x2E,0x6D,0x87,0x8D, + + 0x80,0xA6,0xBD,0xD1,0x52,0x90,0x80,0xD8,0xB8,0x6A,0xAC,0x67,0xC8,0x2B,0xE8,0x59, + + 0x86,0xA6,0x93,0x8E,0xC6,0xAB,0x4F,0xF9,0xF9,0xC0,0x44,0x68,0xDF,0xE1,0x7A,0xB7, + + 0xCB,0x6E,0xC2,0x63,0x73,0x6E,0x68,0x97,0x4C,0xD4,0x4D,0x2C,0x7F,0xE1,0x10,0x81, + + 0x7F,0xA2,0x70,0xB3,0xF2,0xD4,0x24,0xFA,0x69,0x09,0x84,0x00,0x5B,0x23,0x87,0x99, + + 0x86,0x4F,0x8D,0x36,0xA9,0x9A,0x73,0xAF,0x8A,0x63,0x2C,0xE9,0x99,0xC8,0xEB,0x2B, + + 0xE9,0x53,0x6E,0xBF,0x7B,0x8B,0x63,0x87,0x67,0x42,0x9B,0xBB,0x9B,0x74,0xFB,0xFA, + + 0x0E,0xCF,0xFA,0x82,0xD1,0xB3,0x2C,0x30,0xC3,0xF0,0xAE,0x14,0xE5,0xDF,0xEF,0xD0, + + 0x31,0xBC,0x29,0x76,0xD1,0x9C,0x8F,0x34,0x26,0x43,0x9C,0x5B,0x63,0x3C,0xE9,0xEE, + + 0x7E,0x4F,0xA8,0x76,0x3C,0x73,0x06,0xA3,0x6B,0xA7,0x31,0x81,0x55,0xF3,0x5D,0xC0, + + 0xDD,0x18,0xF5,0xA4,0xC5,0x9C,0x47,0xB0,0x96,0x53,0xCF,0x4E,0x46,0x1D,0x52,0xA2, + + 0x42,0x95,0x5B,0x3C,0x32,0x76,0x16,0xDF,0x49,0x16,0x86,0x60,0x31,0xC5,0x61,0xF4, + + 0xC8,0x71,0xB3,0xAE,0x45,0xAA,0xE3,0x16,0x9F,0x1E,0x85,0xD1,0xD6,0x19,0x3B,0xC7, + + 0x43,0x95,0xC1,0x62,0x4F,0x67,0xDB,0x07,0xD1,0x36,0x8C,0x7D,0x57,0x89,0x75,0x22, + + 0x85,0x72,0x70,0xE4,0x12,0x93,0x9D,0x20,0xED,0x4C,0x3A,0x35,0xAB,0x35,0x86,0x8B, + + 0xF7,0xA5,0x15,0xFE,0x52,0x89,0x27,0x85,0x78,0x5C,0xA9,0x23,0x89,0x2E,0x8E,0xDF, + + 0x07,0xC5,0x1D,0x0E,0xC6,0x94,0xCA,0xE6,0xFA,0x66,0x61,0xFB,0x90,0x90,0xAC,0xF3, + + 0x7D,0x01,0xF9,0xB4,0x37,0x97,0x11,0xEE,0xC6,0x86,0x07,0x45,0x3B,0x37,0xDB,0xC7, + + 0x3A,0x24,0x98,0x0F,0xB9,0x7A,0xDF,0x9D,0xD2,0x1A,0x78,0x4D,0x79,0x64,0x7E,0x3B, + + 0x04,0x5D,0x59,0x2E,0xDA,0xC3,0x50,0x97,0xCD,0x58,0x98,0x6A,0x7C,0x8F,0x30,0xDE, + + 0xCA,0x9E,0xF5,0x4F,0x98,0xE2,0xD0,0x1E,0x58,0xFD,0xDC,0x1A,0xFB,0x4D,0x51,0xAB, + + 0xCA,0xDE,0x6B,0xB6,0x64,0xC1,0x97,0xD6,0xCD,0x1C,0x8C,0x05,0xD6,0x33,0x62,0xFD, + + 0x36,0xE2,0xF8,0xAC,0xC8,0x3F,0xE0,0x1F,0x17,0x74,0x86,0xD8,0x1A,0x30,0x70,0x53, + + 0x78,0x8B,0xDF,0xFA,0x14,0x3B,0x70,0x13,0x34,0x82,0x7E,0x59,0x70,0x4F,0x0A,0x74, + + 0x9B,0x93,0xF1,0x10,0xB0,0x1E,0x2F,0xC9,0xB9,0x10,0x80,0xCD,0x71,0xE7,0x2E,0x27, + + 0x09,0x99,0xA1,0x83,0x9C,0xC5,0x25,0x29,0x65,0x6D,0x15,0x45,0x27,0x87,0x91,0x9D, + + 0x86,0xCB,0x05,0x68,0x4F,0x7E,0xF9,0x06,0x79,0x48,0x99,0x4A,0x74,0x1C,0x1E,0x45, + + 0x22,0x8B,0xFE,0xA4,0xF6,0x5B,0x8F,0xE0,0x8B,0x68,0xD7,0x72,0x6D,0x50,0x41,0x38, + + 0xA4,0xE0,0x10,0x5E,0xEA,0xEA,0xD6,0x20,0xE6,0x16,0x1A,0x36,0x42,0xFE,0x5B,0xB0, + + 0xF7,0x80,0xB8,0x53,0x7F,0xA9,0x49,0x5E,0x65,0xC0,0x4F,0x20,0xE5,0x12,0x11,0x77, + + 0x05,0xBB,0x58,0xB3,0xA4,0x55,0x01,0x9B,0xEB,0x8A,0xDE,0x83,0xD7,0xFC,0x1C,0xAA, + + 0x45,0x79,0xC1,0x2A,0xF7,0xCC,0xFF,0x1B,0x34,0x8A,0x69,0x2E,0x2F,0xE8,0x8E,0x7C, + + 0xFE,0x99,0xD5,0x6C,0x33,0x36,0x42,0xCA,0x39,0x68,0x4E,0xF9,0x79,0x62,0x7B,0xB3, + + 0xA8,0x91,0x9B,0xE4,0xFC,0x8A,0x27,0x21,0xAF,0x35,0xEC,0x23,0xDA,0xCA,0x93,0xE0, + + 0xE5,0x86,0x3B,0xEF,0x79,0x5A,0xAE,0xBF,0xE5,0xDF,0x76,0x03,0x36,0xAF,0xEA,0x28, + + 0x4E,0x83,0x5A,0xAE,0x1A,0xF9,0x6A,0x6E,0xE7,0xE0,0x90,0x7A,0x7C,0x9C,0xFA,0x28, + + 0xA8,0x9D,0xF8,0xA1,0xE0,0x20,0x62,0x7E,0xE6,0x34,0xFE,0x98,0xDA,0x6D,0x5B,0x0C, + + 0x4C,0xCE,0xBF,0xA7,0x42,0x63,0x4D,0x17,0xAF,0xEE,0xFB,0x87,0xF2,0x65,0x55,0x36, + + 0x28,0xCE,0xB9,0xA0,0x68,0x1A,0x22,0xE6,0x6A,0xC4,0x3B,0xAF,0xA7,0xEB,0xDB,0x45, + + 0x99,0x66,0x1C,0xBB,0x93,0xA2,0x98,0x4A,0xBE,0x9D,0xAA,0xD2,0xE6,0xB1,0x75,0xD4, + + 0x80,0x6E,0x3C,0xF4,0x8E,0xCE,0x26,0xB0,0x8E,0xDE,0x8D,0x54,0x51,0xF7,0x9C,0x1D, + + 0xA5,0xC2,0x1D,0x37,0xB4,0xFD,0x53,0x6E,0x0D,0x88,0xCD,0xD5,0x76,0xEE,0x13,0x5A, + + 0x2A,0x65,0x92,0x18,0xD6,0xB7,0x7C,0xD5,0x84,0xD7,0x9D,0x53,0x54,0x0C,0xC9,0x8C, + + 0xD3,0xC8,0x24,0xC7,0x98,0xAF,0xB4,0x33,0x68,0xCF,0x1C,0xF6,0x70,0x0C,0x35,0x46, + + 0x82,0x6A,0x53,0x30,0x5C,0xCD,0xF5,0x47,0xC3,0x97,0xA5,0xD3,0xD2,0xFE,0x5F,0x28, + + 0x15,0xD7,0xE4,0xB9,0x11,0xA6,0xF1,0x9C,0x41,0x94,0x9B,0x63,0xCC,0xD1,0x53,0xA2, + + 0x7B,0x98,0xED,0xD5,0xE3,0x1A,0x47,0x56,0xD4,0xF3,0xFC,0x75,0x3E,0x60,0x6E,0xF3, + + 0x64,0x29,0xDF,0xF6,0xAE,0xF9,0x50,0x48,0x48,0x95,0x88,0xD6,0xF1,0x0E,0x32,0x88, + + 0x0F,0xDA,0x8E,0x74,0x5E,0xBD,0x2F,0x4A,0x6C,0x08,0x86,0x8E,0x2B,0x56,0x3B,0x18, + + 0xE4,0x0B,0x4B,0x14,0x4D,0x33,0xC8,0x95,0xDC,0x7A,0x27,0xDC,0x90,0x5B,0xEF,0xE8, + + 0x8F,0x14,0xCE,0xBB,0x30,0xA0,0x41,0xBD,0x0C,0x58,0x1F,0xCD,0x9F,0xA7,0x54,0xEE, + + 0xAC,0x80,0x7D,0xBF,0x43,0xB7,0xFC,0x15,0x5D,0x2E,0xCE,0x11,0x78,0xA4,0xFE,0x98, + + 0x8E,0x91,0xCE,0xDB,0x54,0xC5,0xAA,0x2A,0xEE,0x25,0x5E,0x3C,0xF3,0xF3,0xDE,0xA9, + + 0xED,0x6E,0xE1,0x3E,0xA3,0xDE,0xCF,0x15,0x2F,0xBD,0x90,0x2D,0x7D,0xF0,0x17,0x99, + + 0x23,0x93,0xEB,0xAC,0xCA,0x3D,0x75,0x5B,0x50,0x6A,0x87,0x3D,0x5E,0xBC,0x59,0xD3, + + 0xA5,0xAB,0x04,0xF9,0xE7,0x61,0xEB,0x28,0xE5,0xBF,0x50,0x21,0x84,0x21,0x51,0xD1, + + 0xA4,0x0A,0xF6,0x3D,0xFA,0x70,0x7E,0x19,0x42,0xB1,0xE6,0x32,0xB0,0xE2,0x14,0x01, + + 0x6B,0x53,0x40,0x07,0x69,0xAF,0xFD,0xB2,0xF4,0x9F,0xCB,0x19,0xB8,0x83,0x0C,0xF9, + + 0xDC,0x4E,0xF7,0x28,0x7A,0xF2,0xA6,0xBE,0x74,0xCA,0x2C,0xC6,0x5D,0x22,0xC0,0x51, + + 0x5E,0xAB,0xEA,0xB8,0xAE,0x66,0xE8,0x3D,0xE5,0x05,0xB2,0x04,0xBB,0x55,0x70,0xAB, + + 0x05,0x4F,0x5E,0x27,0x7F,0x49,0x21,0x16,0xBC,0xCE,0xF8,0x3C,0xDE,0x98,0xE5,0x23, + + 0x71,0x63,0x4E,0xD4,0x73,0x89,0x0B,0x33,0xAA,0xA7,0xB3,0x6C,0xD3,0x26,0xC9,0x96, + + 0x7E,0x81,0xAF,0x9C,0x92,0x67,0x93,0x40,0xAF,0x58,0xBB,0x57,0x26,0xE1,0x7C,0x21, + + 0x18,0x45,0xFC,0x35,0xF3,0xB9,0x32,0xC2,0xBD,0xC1,0xEC,0x2B,0xED,0x67,0xB2,0xF6, + + 0x19,0x44,0x6F,0xDC,0x67,0x6B,0x4A,0x99,0x1D,0x52,0xC4,0xDE,0x5D,0x6F,0x7D,0x25, + + 0xBB,0xD1,0x32,0x20,0x2D,0x44,0x33,0xA3,0xC9,0x68,0x27,0x42,0x7B,0xD7,0xF6,0xDE, + + 0x43,0xE2,0x03,0x42,0x2C,0x69,0x72,0x5F,0x89,0xE0,0x2E,0xAA,0xDF,0xCB,0x42,0x36, + + 0x2E,0x87,0xE6,0xD0,0x79,0x56,0xED,0x8E,0x6E,0x41,0xD2,0xAC,0x0A,0xC1,0x70,0xE8, + + 0x92,0xA2,0xEB,0x3E,0xF0,0x3C,0xE5,0x8B,0xE8,0xC8,0xCF,0xEE,0x57,0x65,0xCF,0x64, + + 0x61,0x4A,0xD5,0x78,0x9C,0x0F,0x2C,0xED,0x81,0x4B,0x42,0xFF,0x5B,0xC3,0xEF,0x7D, + + 0xE8,0x45,0xB1,0xBD,0x9F,0x0B,0xCB,0x0A,0xBF,0xCE,0x5B,0x7F,0xF5,0x01,0x14,0xBC, + + 0x07,0x16,0xBE,0x7E,0xCB,0x9D,0xB3,0x8D,0x53,0xBE,0x02,0x20,0x31,0xF9,0x8B,0x6F, + + 0x56,0x11,0xB2,0xA8,0x47,0x9E,0x43,0xA9,0x67,0xD2,0x94,0x44,0xED,0xD0,0xA8,0xFC, + + 0x01,0x98,0x12,0xB8,0x5B,0xC3,0xAD,0x5E,0xDF,0x72,0x22,0x8D,0xF6,0x58,0x3E,0xE5, + + 0x59,0xFA,0x1E,0xEE,0xDB,0x82,0xAB,0xFE,0x1C,0x2F,0x0B,0x5F,0x54,0x8C,0x7A,0xF5, + + 0x49,0x1B,0xA6,0xC4,0x31,0x74,0x06,0xAB,0x89,0x30,0x68,0xED,0x9B,0x05,0x32,0xD6, + + 0xC2,0x96,0x0C,0x9C,0xD0,0x5B,0x0E,0xBB,0x88,0x31,0x1B,0xF6,0x3F,0xD8,0xC7,0xF3, + + 0xC2,0x31,0xD9,0xAF,0x4E,0x27,0xC5,0x12,0x66,0xDB,0x39,0x77,0x92,0x7E,0xE4,0xF5, + + 0x4A,0xF6,0xF3,0xF9,0x71,0x38,0xCD,0xCB,0x40,0xF8,0x48,0x32,0x31,0x71,0xC6,0x89, + + 0x86,0xC5,0xF8,0xB5,0xC9,0x9B,0xBA,0xC7,0xA2,0x29,0xCC,0x32,0x10,0x69,0x75,0x70, + + 0x69,0x5B,0xAE,0x26,0xC5,0xC8,0x9A,0x45,0x9E,0x18,0x37,0x4F,0xF5,0x38,0xD3,0x1A, + + 0x09,0xA5,0x94,0x7E,0xC8,0x6A,0xFB,0x3B,0xE4,0x52,0xE9,0xAB,0x19,0xF9,0x0D,0xCC, + + 0x7D,0xFA,0x3C,0xA1,0x41,0x8A,0x25,0x57,0x5C,0x37,0xA1,0x88,0x91,0x76,0x18,0x2A, + + 0x6E,0x99,0xF8,0xE5,0xF8,0x3C,0x2E,0xDA,0x12,0xA3,0xDE,0x78,0x19,0xAD,0x74,0x68, + + 0xB6,0x5C,0xB6,0xA2,0xF9,0x3D,0xCE,0x7C,0x6A,0x91,0xFF,0x9E,0x39,0x72,0x55,0xC4, + + 0x41,0x5A,0x8F,0xC5,0x47,0xB8,0x69,0x0B,0x98,0x81,0xC1,0xC5,0xFC,0x5F,0x77,0x27, + + 0x07,0x12,0xC7,0xD9,0x3C,0x4D,0xB3,0x11,0x2B,0x12,0x85,0x30,0x93,0x9E,0x1E,0x76, + + 0x65,0x84,0xA6,0x1B,0xB5,0x0F,0x48,0x2A,0xA4,0xC6,0x37,0x44,0x70,0x7C,0x49,0xD2, + + 0x07,0xED,0xB9,0x27,0x21,0x0E,0xB8,0x74,0x6F,0xDA,0x15,0x59,0x3E,0xEE,0x58,0x6D, + + 0xE5,0x86,0x37,0x20,0x35,0x0D,0x9C,0x53,0x67,0xC6,0x8E,0x7D,0x49,0x1F,0x17,0x66, + + 0x4F,0xD2,0x38,0x64,0xF9,0x00,0xD7,0x55,0x85,0x68,0x39,0xB5,0x69,0xD8,0xF5,0xB1, + + 0x82,0x09,0x21,0xB6,0x7F,0x05,0xF0,0x9D,0x40,0x8E,0xCE,0x4A,0x88,0x49,0xF8,0x21, + + 0x6B,0x2E,0x28,0x72,0x75,0xA8,0x26,0x90,0x43,0x68,0xD7,0x09,0x8E,0x79,0x33,0x08, + + 0x6D,0xE2,0xF0,0xAD,0x33,0x99,0x6E,0x1C,0x4B,0x87,0xE4,0xF9,0xD7,0x76,0x11,0x57, + + 0x05,0x01,0x97,0x6F,0x6F,0xB6,0x68,0xF7,0x8F,0x37,0x42,0x2D,0x2B,0xB6,0x1C,0x7E, + + 0xC6,0xB9,0xB7,0xFD,0x24,0xF5,0x4A,0x22,0xAC,0x37,0x32,0x3F,0x00,0x15,0x92,0xFA, + + 0x45,0xC5,0xAA,0x24,0x71,0x1C,0xC5,0xD7,0xB2,0x44,0x0F,0x87,0x59,0x49,0x6B,0x07, + + 0xBF,0x34,0xA1,0xE4,0x63,0x71,0xA3,0xC3,0x03,0x87,0xED,0xCD,0xD8,0xEC,0x7F,0xE6, + + 0x72,0xCA,0xBA,0x9B,0x95,0xCC,0x44,0xBF,0xAF,0x2E,0x3C,0x04,0xED,0x1E,0x90,0x4E, + + 0x46,0x7C,0x55,0x7B,0x18,0xB4,0xC9,0x88,0xE2,0x31,0x41,0x47,0xDE,0x6C,0x14,0x5C, + + 0xEE,0x0E,0x7B,0x19,0xF6,0xFC,0xCE,0x18,0xB4,0x30,0x3A,0xBA,0xC7,0x19,0x39,0xF8, + + 0xE6,0x9F,0xE3,0x51,0xA6,0x5A,0x0B,0x4F,0x6F,0x51,0xC4,0x43,0x2E,0xDF,0x46,0xA8, + + 0x03,0xCE,0x89,0x1F,0x76,0x9E,0xEB,0x88,0x4B,0x42,0x6E,0x0C,0xAF,0xEE,0x83,0xAA, + + 0x17,0x9D,0x97,0xBE,0x07,0xD0,0x52,0x8F,0x67,0x00,0xA6,0x96,0x9F,0xB4,0xD3,0x55, + + 0xEF,0x80,0x3B,0x88,0x41,0x05,0xB4,0x48,0x64,0xB1,0x18,0x92,0x9C,0x10,0x9D,0x7D, + + 0xB4,0xDF,0x65,0x97,0xA3,0x46,0xF5,0xE7,0x39,0x90,0x8F,0x17,0x6D,0x5D,0x96,0x00, + + 0xC9,0x99,0xBA,0x8D,0xC5,0x66,0xE2,0x4D,0xC1,0x83,0xAB,0xD5,0x95,0x33,0x3D,0xD7, + + 0x02,0x1F,0xD9,0x16,0x95,0x0B,0x93,0x6A,0xC3,0x02,0x34,0xC7,0xE6,0x7F,0x56,0x62, + + 0xB2,0x3A,0x54,0xE6,0x96,0x2A,0x87,0xD5,0xC6,0x94,0xC2,0xCE,0x57,0x98,0xA8,0xFE, + + 0x4D,0xD2,0xFD,0x52,0x85,0x6E,0xE5,0x10,0x6A,0xDB,0x0A,0x05,0x76,0xB5,0xC9,0xF7, + + 0xC4,0xF9,0xD2,0x90,0x65,0xBF,0x2D,0x6B,0xF3,0xCC,0xEA,0x85,0x48,0x42,0x23,0xCD, + + 0xD1,0x3E,0xB3,0xB1,0x08,0xC4,0x16,0xD0,0x5B,0x68,0xC8,0xA8,0x9D,0x7B,0x26,0x9F, + + 0x52,0x46,0x07,0xEC,0x86,0xA6,0xBD,0x3E,0x68,0x25,0x80,0x8B,0x16,0xF6,0xB6,0xF5, + + 0x66,0xAB,0x18,0xC0,0x29,0x67,0x8E,0x6C,0x72,0xD2,0x9A,0x5C,0x70,0xBB,0xBF,0x73, + + 0xCE,0xD6,0x18,0xA2,0x49,0x6A,0xFF,0xFF,0x1E,0xD3,0x3F,0x3D,0x3F,0xED,0x73,0x39, + + 0xAA,0x11,0xE5,0xB1,0xFC,0x2E,0x57,0x9C,0xE1,0x5A,0xE7,0xD1,0x12,0xBE,0xFE,0x25, + + 0x1C,0xAA,0xEC,0x22,0x3F,0x46,0x36,0x17,0x33,0x66,0x7B,0xC5,0x4F,0x08,0x35,0x9D, + + 0x45,0xFA,0x5C,0x5D,0xBE,0xB4,0x72,0xAB,0xEA,0xFA,0xA4,0x28,0xFF,0xAE,0xD7,0x87, + + 0x08,0x8F,0xAC,0x18,0x56,0xEE,0xEC,0x03,0x53,0x24,0x69,0x7B,0x8D,0x91,0x48,0x1D, + + 0xE9,0x91,0x67,0x62,0xCE,0xFD,0x70,0x6B,0x69,0x4D,0x1F,0x9C,0xB1,0xCF,0x1B,0x12, + + 0x81,0x11,0x8E,0x6A,0xB6,0x31,0x20,0x50,0x47,0x03,0xFE,0x55,0x50,0x21,0x11,0x76, + + 0xC8,0x6A,0x41,0x9D,0x21,0x2A,0x6E,0xA3,0x40,0x25,0x07,0x56,0xBC,0x0E,0x85,0x29, + + 0x91,0x07,0x36,0xF3,0x2C,0x2A,0x5E,0xB3,0x41,0xE3,0xB5,0xA3,0xBA,0x6C,0x12,0x6E, + + 0xE9,0x60,0xC0,0xBB,0xE7,0xA7,0x38,0x67,0xE1,0x21,0x3A,0x94,0x5A,0x2B,0xF5,0x61, + + 0x6F,0xAA,0x69,0x32,0xCD,0x37,0x5E,0x5C,0xAA,0x14,0x9E,0x9C,0x94,0x28,0x1B,0x40, + + 0x21,0x8D,0x45,0xBB,0x1D,0x3D,0xEE,0x83,0x8A,0x57,0x88,0xBE,0x77,0x6D,0xE9,0x23, + + 0xE1,0x1B,0x71,0xCB,0x90,0x3F,0x01,0x75,0x8B,0x76,0xC1,0xF5,0x32,0x28,0x86,0xCD, + + 0x78,0xF3,0xCD,0xFD,0x60,0x28,0xBE,0x8D,0x9D,0x2B,0x12,0x5F,0x34,0xED,0x19,0xFA, + + 0x41,0xE8,0x17,0x98,0x43,0x31,0x97,0xDF,0xBC,0x7B,0x9D,0xFB,0x93,0x10,0xC3,0x2D, + + 0xEA,0xA7,0xA5,0x60,0xEC,0x87,0xB8,0xE3,0x73,0x71,0x81,0xAD,0xDE,0x62,0x17,0x10, + + 0x68,0xA4,0x83,0x09,0xF2,0x9A,0xE7,0xBB,0x49,0x0C,0xC1,0x3F,0x6A,0xB6,0x3C,0x4F, + + 0xAB,0x85,0xFC,0x79,0x72,0x21,0x72,0xEF,0x02,0xAD,0xB2,0x23,0x27,0x61,0x54,0x4B, + + 0x67,0x02,0xF0,0xEC,0x82,0x6F,0x7A,0xA1,0xEA,0xC7,0xB7,0x9A,0xF7,0xC0,0xC7,0xA9, + + 0xB5,0xA3,0xD1,0x59,0x71,0x6A,0x67,0x7A,0xEE,0x48,0xF9,0xBD,0x86,0x75,0x79,0x4A, + + 0x28,0x3E,0x43,0x2F,0xA8,0xCF,0x23,0x2B,0x88,0xBF,0xCA,0x9F,0xFF,0xC0,0xE8,0xB1, + + 0x4C,0x52,0xC3,0x94,0x03,0x97,0xAB,0x46,0x53,0xC6,0x9C,0xBD,0xFF,0xF6,0x74,0x81, + + 0x4D,0xBC,0x05,0x10,0x6B,0xB1,0x3C,0x03,0xC0,0x58,0xFE,0xB6,0x70,0xA1,0x95,0x60, + + 0xC3,0x32,0x45,0x1C,0x91,0x29,0xD5,0x3D,0xDA,0x54,0x94,0xDB,0x91,0x76,0x9B,0x23, + + 0xFD,0x3D,0xD4,0xD8,0xB7,0x81,0xDD,0x35,0xBB,0x55,0xC7,0x36,0x99,0x92,0xD3,0x33, + + 0xA6,0x9F,0xAD,0x2F,0xCD,0xBF,0x34,0xAF,0x1F,0x59,0x8E,0xEB,0x0E,0x6B,0x88,0x97, + + 0xF9,0xEA,0x6C,0xA6,0x51,0x09,0x05,0x3B,0xC6,0x39,0xCB,0x1E,0x92,0x3A,0x61,0x7D, + + 0xA4,0x1E,0x0D,0xF4,0xDE,0x99,0x7F,0x31,0xBE,0xA9,0x6E,0x03,0x91,0x02,0xF6,0x4B, + + 0x7A,0xEA,0x0D,0xE0,0x6D,0x3F,0xBA,0x31,0xBB,0x4C,0x62,0xC4,0x52,0xD6,0x96,0xC7, + + 0xD5,0x64,0x9E,0xE3,0xC7,0xE3,0x36,0xB9,0xE5,0x3B,0xE8,0xAA,0x99,0xFB,0x70,0xF5, + + 0xAB,0x1D,0xC9,0x94,0x0A,0x8F,0x63,0x51,0xB7,0x36,0x9A,0x5E,0x90,0x50,0x67,0x8B, + + 0xEB,0x17,0x87,0x65,0x6A,0x78,0xBC,0x0C,0x3D,0x44,0x26,0x5E,0x74,0xF1,0xC3,0xFB, + + 0x42,0x01,0x4F,0x04,0x98,0xC7,0xA4,0x30,0x46,0x5D,0xDD,0x42,0x10,0x9A,0x69,0x32, + + 0xA5,0xA1,0x40,0xBE,0xB8,0x40,0xFA,0x8E,0x95,0x47,0xEE,0x13,0x83,0xDD,0x6E,0x4A, + + 0xAB,0x15,0xC8,0xE9,0xB2,0xF0,0x64,0x10,0xB8,0x12,0x05,0xEC,0x18,0x07,0x25,0xC9, + + 0x5B,0x97,0x9F,0x2F,0x3A,0xBE,0x3A,0x8F,0x96,0x11,0xEF,0xDC,0x5B,0xC1,0x5A,0x5D, + + 0xAA,0x15,0xF1,0x05,0x98,0xBE,0x06,0x38,0x4E,0xD6,0xC8,0x79,0xDF,0xB6,0xB6,0xF2, + + 0xC5,0x21,0xA0,0xF7,0x60,0x5F,0x08,0x42,0x42,0x82,0xAA,0x24,0xC6,0xEA,0x10,0x72, + + 0x53,0x0A,0xBF,0x16,0xDD,0xBB,0x94,0x97,0x90,0xA2,0x58,0x07,0x39,0x4E,0xB7,0x87, + + 0xAC,0x96,0x87,0x3B,0xA9,0x09,0x76,0xA1,0x44,0x62,0x31,0x64,0x52,0x69,0xBA,0x22, + + 0xE9,0xC1,0x3A,0x64,0x86,0xE1,0x92,0xF9,0x7E,0xF8,0x19,0x45,0xB7,0xB6,0x1E,0x6E, + + 0xE7,0x2B,0x4B,0x01,0x18,0x78,0x0E,0x4A,0x66,0xC7,0x54,0x04,0xAD,0xA6,0x0E,0x23, + + 0x04,0x4C,0xB2,0x13,0x7F,0x44,0x8F,0x14,0x66,0x85,0x9A,0x72,0x73,0xE3,0x70,0x30, + + 0xB6,0xEA,0x25,0x8D,0x2D,0x59,0xF1,0x00,0x10,0xDD,0xBF,0x45,0x2B,0x8A,0xA9,0x13, + + 0x84,0x0C,0x97,0x51,0x76,0x24,0x45,0xED,0x2E,0x5D,0x53,0xB1,0x76,0x65,0x36,0x00, + + 0xAD,0x83,0xE5,0x46,0x1D,0x68,0x44,0xCD,0xB9,0xFA,0xCC,0x29,0x3F,0xC8,0xBC,0xF0, + + 0xA8,0x03,0x39,0xE1,0xD5,0x78,0xC5,0x32,0xE8,0xD2,0xAE,0xCF,0xFE,0xA9,0x61,0xFB, + + 0xE5,0x2B,0xFD,0x36,0x9C,0x01,0xCF,0xC3,0x2E,0x87,0xCB,0x5C,0xB0,0xE3,0x53,0xFB, + + 0x99,0x00,0xE2,0xF7,0x7F,0xE9,0xD8,0x64,0x6A,0xDB,0x89,0x0F,0x89,0xA9,0x03,0x77, + + 0xE5,0xC8,0xCF,0xCA,0x72,0x5A,0x2A,0x66,0x7D,0x46,0x8A,0x9E,0xC2,0x5D,0xCE,0x38, + + 0xFC,0xE8,0x87,0xB6,0x53,0x71,0x90,0x1C,0x6E,0x4D,0x5F,0x43,0xEC,0xA0,0x39,0x59, + + 0xF8,0x21,0xAB,0xC2,0x98,0xE6,0xCB,0x8B,0x86,0xD5,0x8A,0x09,0x29,0x65,0x53,0xA0, + + 0xEC,0x83,0x47,0xDA,0x4A,0xCD,0x41,0x93,0x54,0x80,0x57,0xE1,0xDC,0x2F,0x44,0x80, + + 0x84,0x9D,0x19,0xD9,0x43,0xB0,0x14,0x10,0xC5,0xD9,0x18,0x39,0x77,0x91,0x30,0x70, + + 0x84,0xFF,0xAD,0x7E,0xEB,0xF3,0x1C,0xA3,0xE8,0xB2,0x2A,0x84,0x15,0xB3,0x6F,0x9E, + + 0x26,0xAE,0xFC,0x19,0xB2,0x00,0xF5,0x27,0xBE,0xD4,0xEB,0x45,0xF0,0x5F,0x4F,0x87, + + 0xA4,0xF3,0xEA,0xF7,0x86,0xC8,0x96,0x16,0x30,0xCD,0x7D,0xF7,0xAD,0x9D,0x3E,0x42, + + 0x5A,0x3B,0x84,0x89,0x15,0xB9,0x70,0x82,0x5D,0x59,0xCC,0x1C,0x70,0xB5,0x12,0xD5, + + 0xA6,0xF1,0x29,0x3E,0xBA,0xF8,0xC4,0x0D,0x8E,0x34,0xF4,0xE6,0x48,0xD5,0xC5,0x33, + + 0x18,0x45,0x49,0x54,0x86,0xBC,0x0B,0xD6,0xD5,0x11,0x69,0x85,0x79,0x60,0x45,0xD5, + + 0x2A,0xF2,0x12,0xB5,0xCB,0xB8,0xD1,0x6C,0xE4,0x4E,0xDD,0xF3,0xC8,0xF7,0x7C,0x9E, + + 0x8F,0x83,0x66,0x12,0x06,0xF9,0x4B,0x43,0xB6,0xB7,0xD4,0xA6,0x89,0x71,0x77,0xD6, + + 0xCC,0xD6,0x90,0xFF,0x82,0xE2,0xB7,0xDC,0x9A,0xC9,0x3D,0x4E,0xF3,0x58,0x55,0x0F, + + 0xFA,0xA9,0x7C,0xA1,0xC3,0xFC,0x8C,0x22,0x43,0xC1,0x97,0x3D,0x7C,0xF2,0x2E,0xE8, + + 0xBE,0xD4,0xAF,0xED,0x46,0xF9,0x87,0x44,0x62,0xC0,0x29,0x4C,0x79,0x76,0x5E,0x51, + + 0xD1,0x3C,0xDC,0x26,0xED,0xF3,0x2C,0x3E,0x06,0x3D,0x4D,0x3E,0x76,0x85,0x28,0xDD, + + 0x65,0xD9,0xB7,0x1F,0x9A,0x34,0x40,0x22,0x4E,0x47,0x62,0x84,0xDC,0x0D,0xC7,0x18, + + 0x2A,0xDE,0xE6,0xA9,0x9F,0x2E,0x0E,0x8D,0xCF,0xD7,0xEF,0xFE,0xF8,0xBF,0x57,0x41, + + 0x2C,0xDB,0xEB,0xBF,0xF7,0xA4,0xBF,0xBF,0x74,0x5E,0xF8,0x21,0x60,0xBE,0xA8,0x25, + + 0x85,0xC1,0x96,0x66,0xAF,0x8D,0x18,0x24,0xC7,0x31,0x50,0x18,0xD9,0x22,0x51,0xA2, + + 0xA4,0xAE,0xF7,0x10,0x4C,0xB2,0xA0,0xDE,0x51,0x0C,0x58,0x08,0xD8,0x65,0xA9,0x30, + + 0x05,0x73,0x98,0xA0,0x27,0xAF,0xF9,0x04,0xF3,0x9F,0xC9,0x6A,0xAF,0x22,0x9F,0x19, + + 0x24,0xAC,0xAF,0xF0,0xA1,0x25,0xB5,0xA3,0x89,0x1E,0xC4,0xB7,0x51,0x9A,0x1A,0x48, + + 0xA1,0x46,0x78,0x64,0xFF,0x44,0x45,0xE2,0xDF,0xCD,0xB6,0xC5,0xB9,0xC7,0x56,0x78, + + 0x22,0x35,0xA3,0x32,0xEC,0x4B,0xA5,0x0A,0xCC,0x13,0xA6,0xC4,0xBA,0x06,0x1D,0xDA, + + 0x6B,0x6D,0x79,0x55,0x35,0x3D,0x69,0x8F,0x4F,0xD0,0xEF,0xD5,0x18,0x65,0x29,0x53, + + 0xF3,0xAA,0xAB,0x51,0x92,0x57,0x51,0x60,0x62,0x38,0xCB,0x3F,0x2C,0xEA,0x13,0x4F, + + 0xCA,0x4B,0xA2,0x4C,0xB9,0x87,0x70,0x28,0x49,0x22,0xAA,0xCC,0x04,0x73,0x68,0x1A, + + 0x0A,0xC9,0xE8,0x09,0x18,0x79,0x0B,0x09,0xBD,0xA8,0x9F,0xBE,0xD9,0xF8,0x3D,0x3C, + + 0xE9,0x0E,0x96,0x7E,0xA0,0x44,0x03,0x00,0x8B,0x49,0xDF,0x4B,0x3A,0x2A,0x55,0x2C, + + 0x89,0xA0,0xEB,0x1F,0xDC,0x26,0xAC,0x11,0xBA,0x4B,0xC1,0x2A,0x7A,0xE4,0x9E,0xAA, + + 0xE9,0x69,0x7D,0x1C,0x9A,0x63,0x69,0xE7,0xF5,0x4A,0x84,0xC8,0xAD,0x00,0x13,0x1F, + + 0xAE,0xB2,0x9E,0x1A,0x63,0x6C,0xE7,0xBF,0x99,0x47,0xBC,0x40,0x5A,0x2F,0x3B,0x6D, + + 0x6B,0x31,0xFE,0x2D,0x9E,0x60,0xFE,0x18,0x6B,0xD1,0x6C,0xFE,0xA6,0xB3,0x12,0x96, + + 0x2E,0xBE,0xE0,0x22,0x4A,0x92,0x5C,0x89,0xC3,0x53,0xE5,0xCC,0xBB,0x73,0xC4,0x60, + + 0x9D,0xEB,0x44,0x74,0x97,0xCB,0xC3,0xD5,0xED,0x4B,0xAC,0xF4,0x74,0x7F,0xE0,0x78, + + 0xDC,0x5C,0xB2,0xBD,0xD3,0xA1,0x54,0x91,0x1A,0xD1,0x0B,0x56,0xF3,0x75,0x85,0x05, + + 0xD4,0x3E,0x05,0x01,0xC4,0x1E,0xEB,0x25,0x9E,0x00,0xAD,0x57,0x72,0x76,0x6F,0x90, + + 0xB3,0x5E,0x8D,0xD5,0xB5,0x1B,0xDD,0x0C,0xD8,0x3F,0xC4,0xD7,0x0E,0x77,0x9F,0xD9, + + 0xA2,0x8D,0x43,0x35,0x91,0x35,0x57,0xA0,0x72,0xD9,0x82,0xD4,0x8D,0xDB,0x16,0xBC, + + 0x5B,0xBA,0xB2,0xE9,0x8A,0xBF,0xE7,0xF2,0x7F,0x4E,0x23,0x07,0x55,0x19,0x9E,0xDD, + + 0x43,0xA9,0xF7,0xD6,0x11,0xE7,0x0C,0x3B,0x45,0x46,0x01,0x96,0x90,0xF5,0xED,0xA3, + + 0xC1,0x6B,0x4A,0x24,0x10,0x36,0x32,0x97,0x1C,0x39,0xE3,0x50,0x39,0x86,0x64,0x88, + + 0x2B,0x58,0x04,0x0E,0x00,0xD2,0x4F,0x4B,0x6E,0xAB,0xD0,0xEA,0x72,0x7E,0xB6,0x76, + + 0x39,0x54,0x11,0xBD,0x16,0x18,0xA7,0x2A,0x61,0x51,0x65,0x5E,0xD8,0xF3,0x03,0xE6, + + 0x9B,0xD5,0x91,0xEF,0x97,0x1B,0xD6,0x69,0xAA,0x36,0xB7,0x91,0x59,0xF0,0xF2,0x5E, + + 0x63,0x0A,0x53,0xBC,0xD6,0x1A,0x9C,0x7F,0xC5,0x15,0xE0,0x5F,0x58,0xF4,0x38,0xCF, + + 0x8B,0x83,0xF4,0xDF,0x99,0x3F,0x34,0xF0,0x6B,0x9C,0xE8,0x48,0xB0,0xAD,0x2D,0x37, + + 0xDA,0x73,0xC1,0xBE,0x35,0x5F,0x49,0xDC,0x96,0x56,0x0E,0xEF,0x07,0x1E,0x5F,0x19, + + 0x27,0xE3,0xB9,0x6C,0x38,0x3A,0x6D,0x61,0x4D,0x12,0x9F,0xF9,0x32,0xAF,0xA8,0x99, + + 0xA7,0x82,0x0B,0x0D,0xB3,0x86,0x5D,0x11,0x30,0x82,0x73,0x8E,0xD5,0xD9,0x31,0xA6, + + 0x02,0x4B,0xBE,0x2F,0x35,0xE0,0x6F,0x27,0x42,0xE0,0x04,0xC4,0x52,0x08,0xE8,0xE3, + + 0x5D,0x2C,0x88,0x42,0xB6,0x0C,0xF9,0xF5,0x76,0x2E,0x2B,0x75,0x2E,0xE1,0xB5,0x87, + + 0x8D,0xE3,0xAD,0x96,0x75,0xA4,0xC5,0xBA,0xC2,0x82,0x41,0x55,0x2B,0xA0,0x72,0x54, + + 0x47,0xE3,0xBC,0x50,0x57,0xA0,0xF9,0x8E,0xD3,0xCB,0xE2,0x57,0xAA,0xC3,0x98,0xC0, + + 0x9B,0x5D,0xF8,0x5A,0x25,0xBC,0x4F,0x28,0x56,0xC0,0x0F,0x14,0x3C,0x67,0x0F,0x12, + + 0x17,0x08,0x50,0xA5,0x79,0xA3,0x03,0x99,0x1F,0x78,0x1F,0x05,0x71,0x33,0x59,0xB8, + + 0x23,0xEA,0x59,0xB4,0xF0,0xB6,0xF1,0x24,0xE8,0xD8,0x0A,0xA0,0x3F,0x85,0x91,0x5B, + + 0x20,0x97,0xC9,0x9A,0x17,0x37,0x63,0x63,0xE4,0xD1,0xF1,0x63,0xB4,0x2D,0x6A,0x9E, + + 0x2E,0x69,0xAA,0x9A,0xF5,0x99,0xB2,0x28,0x2E,0xD3,0x72,0x4F,0x9B,0xEC,0x3A,0x0F, + + 0x55,0x72,0x2D,0xE3,0x11,0xEB,0xBA,0xFA,0x6F,0x02,0x3C,0xBC,0xDD,0x38,0xE7,0x2B, + + 0xB4,0x88,0x4F,0x9D,0x9D,0xA0,0x56,0x5D,0x41,0x4C,0xFF,0xE9,0xD6,0xA4,0xAF,0x9F, + + 0xF9,0xA7,0x38,0x5C,0x61,0x9A,0xBB,0x39,0xBD,0x89,0x83,0x6F,0xD5,0xE4,0x9A,0x0C, + + 0x72,0x7B,0xBB,0x1F,0xBB,0x03,0x12,0x68,0x4D,0xC1,0xE1,0x84,0xBF,0xA3,0x33,0x95, + + 0xA8,0x89,0x3C,0xDC,0x9F,0x37,0x07,0x11,0x3B,0x12,0xAC,0x0D,0x79,0x4B,0x9C,0x5E, + + 0x6F,0x51,0x31,0x47,0x3B,0x01,0x63,0x19,0xCA,0x43,0x5F,0x1C,0xF0,0x48,0xB7,0xE4, + + 0x78,0x0F,0xD3,0xB4,0x5E,0x25,0x63,0x6A,0x40,0x49,0xA9,0x3F,0x8F,0x42,0x1A,0xB7, + + 0x45,0x94,0x7F,0xA7,0xEC,0x91,0x21,0xD0,0x57,0xE6,0xD4,0xA4,0x08,0xFF,0x4D,0xD2, + + 0x69,0x92,0xD2,0xD7,0x71,0x90,0x59,0x46,0x6D,0xBD,0xF0,0xB4,0x6B,0x5A,0x5C,0xED, + + 0xC5,0x96,0xD3,0xA6,0x3F,0x93,0xCF,0xA1,0xA4,0xC9,0x8F,0x58,0xF2,0x73,0xB9,0x1B, + + 0x22,0x52,0x10,0xB6,0x16,0xFD,0x64,0xCD,0x40,0x55,0x61,0xBD,0x75,0x31,0x83,0x2D, + + 0xA4,0xE8,0xFC,0xCB,0xC7,0xF6,0x8C,0x0A,0xBD,0x99,0x63,0x15,0x58,0x59,0x80,0x5C, + + 0x24,0xD7,0x65,0x3E,0xAF,0xB1,0x3D,0x14,0x77,0x98,0x2C,0xB1,0x9E,0x56,0x7B,0xA1, + + 0x11,0xEB,0x26,0x87,0xB0,0x64,0xEE,0x83,0xA8,0x5B,0x25,0x74,0x82,0x59,0x37,0xD2, + + 0x36,0x2A,0xE8,0xAD,0xB1,0x65,0x82,0x34,0x25,0xD7,0x9B,0xCA,0x1C,0x54,0x06,0x1A, + + 0x2A,0x6B,0x25,0xCF,0x78,0xF4,0x32,0xEA,0x24,0xC3,0xE8,0x4B,0xE4,0xFC,0x95,0xEA, + + 0xAD,0x86,0xF5,0x8B,0xB8,0x48,0xD6,0x8B,0x1A,0xAE,0x2D,0xFD,0x7B,0xD2,0xB9,0x4C, + + 0x11,0x6C,0x24,0xCE,0xF8,0x11,0x52,0xDD,0xCD,0x9A,0xF3,0x52,0xF0,0xB8,0x96,0xEB, + + 0x2D,0x8D,0xA3,0x8B,0xC2,0xDB,0xE0,0x3B,0x04,0xE2,0x40,0x3D,0xFE,0x1D,0x4F,0xC2, + + 0xAE,0xDC,0xAC,0x4A,0x68,0xE4,0x7E,0xFF,0x93,0x5A,0xC8,0x5E,0xB4,0x2D,0x95,0x7A, + + 0x5B,0x4C,0xBC,0xD6,0x9A,0x12,0x69,0x12,0xB4,0x00,0x49,0x5B,0x79,0x2F,0xCB,0x6E, + + 0x3D,0x01,0xBE,0xD8,0x1B,0x11,0x70,0x2B,0xEA,0x90,0x89,0x5F,0x0A,0xBD,0x4F,0x7F, + + 0x8F,0x4E,0xB9,0x98,0x56,0x1C,0x87,0xDF,0xDC,0x41,0x34,0xC1,0x99,0x0A,0xD6,0xFA, + + 0xFB,0x42,0x67,0x44,0x1C,0xDB,0x49,0x11,0xE5,0x31,0x92,0x42,0x2C,0x2F,0x30,0x6F, + + 0x80,0x0C,0x3F,0xB5,0x35,0x6D,0xAF,0x95,0x09,0x22,0x74,0xA6,0x30,0x69,0x85,0x04, + + 0x75,0x0E,0x7E,0x21,0x74,0xA1,0xEC,0x53,0xF6,0x1D,0xAB,0xD6,0xF3,0x2F,0xBA,0xA1, + + 0x7D,0xA0,0x59,0x66,0xB2,0x28,0xD9,0xF1,0x4F,0xB7,0xD9,0x53,0xB1,0xF5,0xBB,0x70, + + 0x51,0xAB,0x47,0x37,0x26,0x85,0x11,0xA7,0x44,0xF6,0x98,0xF6,0xF3,0xE3,0x36,0x57, + + 0xA2,0x47,0x82,0x50,0xF8,0xB4,0x1A,0x83,0x1C,0xCE,0x80,0xF6,0x50,0xC3,0xE1,0x33, + + 0xE0,0x5A,0xF9,0xBA,0xFB,0x57,0x4C,0x21,0x82,0x7B,0x2E,0x96,0xD4,0x8E,0x0E,0xE5, + + 0x6A,0xBD,0xF7,0x78,0xD0,0x07,0x92,0x4D,0x28,0x03,0xE7,0x58,0x70,0x61,0xC2,0x94, + + 0x5F,0x06,0x4B,0xE4,0x44,0x65,0xC2,0x5A,0xF3,0x57,0x6A,0xC4,0xD5,0xE3,0xF1,0x9C, + + 0x05,0xDD,0x85,0x3C,0x3F,0x71,0x9E,0x3D,0x7A,0xA9,0x22,0x2C,0xFE,0x6D,0x3B,0xF6, + + 0x0B,0x07,0x9B,0xCD,0xBA,0x6A,0x68,0xD2,0x3F,0x08,0x97,0xCB,0xEB,0x6A,0x9B,0x06, + + 0xB5,0xBF,0x63,0xB9,0x9F,0x33,0xDB,0x29,0x84,0x17,0x99,0x4F,0xEA,0x07,0x82,0xD1, + + 0x69,0x04,0x4D,0xBF,0x26,0x81,0x68,0xD8,0xDF,0x0E,0x9A,0xFE,0xF9,0x6A,0x81,0xDC, + + 0x51,0xCE,0xAF,0xB4,0xDD,0xE0,0x42,0xFC,0x11,0xE6,0xA2,0x58,0x30,0x62,0xC3,0x0A, + + 0x70,0xA3,0xD0,0xAD,0x9E,0x03,0x14,0xCD,0x47,0xE3,0xDB,0x25,0xB9,0x4E,0x8B,0xC0, + + 0x35,0x63,0xB4,0xA0,0x93,0x6D,0x13,0x69,0x72,0xCF,0x5B,0x0E,0xE9,0x2D,0x02,0x68, + + 0xF0,0xDD,0x5F,0x2B,0x4F,0x32,0xD4,0x08,0x5A,0xFD,0xB4,0x75,0xD1,0xFA,0xB4,0xD7, + + 0xFF,0xEE,0xC2,0xDF,0x32,0xC3,0x04,0x38,0xEC,0xF7,0xAE,0x4B,0x42,0x71,0x7B,0x21, + + 0x93,0x60,0x45,0x98,0xFC,0x70,0xC5,0x43,0x09,0xA3,0x12,0x54,0x53,0x22,0x54,0xB5, + + 0x04,0xCC,0xDD,0x35,0xFF,0x71,0x4B,0x71,0xEF,0xA6,0x25,0x72,0x2F,0xDE,0x84,0x59, + + 0x44,0x56,0x04,0x80,0x41,0xC9,0xC4,0xFF,0x56,0x52,0x60,0x86,0x99,0x30,0xE0,0x54, + + 0x79,0x8C,0xDF,0xA7,0x43,0x59,0xED,0xFC,0xE1,0x5F,0xF4,0x87,0xFF,0xF3,0x86,0x49, + + 0x03,0x69,0x4E,0xA5,0xB8,0x96,0x1D,0x76,0x43,0xD1,0xF4,0xE2,0x7D,0xF0,0x45,0xAC, + + 0x4A,0xAD,0xAF,0xD0,0xB2,0x99,0x3F,0x93,0x1C,0x32,0xDD,0x35,0xE1,0xFC,0xAA,0xF7, + + 0xFE,0x9A,0x56,0x74,0x0B,0xB6,0x81,0x2C,0x3D,0x25,0xEE,0xDC,0xF8,0x67,0xF1,0x69, + + 0x03,0xE6,0x10,0x03,0x5A,0x3D,0x78,0x08,0x6A,0x99,0x98,0x41,0x71,0x3B,0x79,0x38, + + 0xC3,0x99,0x3F,0x72,0x37,0x97,0xAC,0x5A,0xCE,0x36,0xCD,0xAF,0x6A,0x72,0x35,0x6A, + + 0xDD,0xB6,0xF6,0xEC,0xDC,0x2D,0x39,0x1D,0x8B,0xFF,0x90,0x3E,0xD9,0xAB,0x86,0x51, + + 0x4C,0x21,0xA6,0x8D,0xD7,0xB7,0x6E,0x95,0x4B,0x8C,0x1B,0xDD,0x48,0x3E,0x55,0x98, + + 0x67,0x5F,0xAE,0x1C,0xF9,0x90,0x14,0x03,0xC8,0x5B,0xA6,0x0D,0xD8,0x3D,0xBA,0x0E, + + 0xAC,0xAC,0xBC,0x2F,0x3A,0xE1,0x37,0xA8,0x64,0x53,0xC3,0xE7,0x99,0x81,0x08,0x76, + + 0x0A,0x9D,0x5E,0x3F,0x39,0x37,0x53,0xFE,0x4A,0xD7,0xE1,0x55,0xFD,0x5E,0x33,0x0D, + + 0x7C,0x0B,0xFF,0xC0,0x18,0xBB,0x8B,0x6C,0xD9,0x3D,0x48,0xA2,0x1F,0xDC,0x6E,0x70, + + 0xEE,0xE2,0xB6,0x09,0xB6,0x24,0x81,0xD0,0xE9,0xBC,0xFC,0x44,0x66,0xE1,0x51,0x3E, + + 0x82,0x91,0x63,0x61,0x6B,0x0F,0x9C,0xA7,0xF6,0xC2,0xF9,0x22,0xF6,0x10,0x70,0x9B, + + 0x20,0x7C,0x8F,0xF5,0xDC,0x0C,0x41,0xC0,0xE3,0x1E,0x41,0xDF,0x13,0x2E,0xA0,0xDB, + + 0x3F,0x8E,0x26,0x74,0xF7,0x0B,0x0E,0x02,0xAF,0x7E,0xE4,0xD1,0xF7,0xFB,0xA3,0x6E, + + 0xEC,0xC1,0xD2,0xB4,0x11,0xFD,0x06,0xAB,0xAE,0x3F,0xD9,0x71,0xDA,0x63,0xE1,0x00, + + 0x7C,0x0D,0xF2,0xC5,0x97,0xBE,0x21,0x14,0xCA,0x4B,0x45,0x05,0x3D,0xA2,0x53,0xE3, + + 0x12,0x28,0x70,0xBA,0x87,0x18,0x29,0x04,0xCB,0x4A,0x99,0x04,0x5B,0x61,0x8E,0x79, + + 0x22,0x7E,0x28,0xF2,0x94,0x53,0x2A,0x2F,0x27,0x8B,0xCD,0xD3,0x54,0xAA,0xAD,0xF2, + + 0xC7,0x44,0xEA,0xE7,0x8F,0x32,0x02,0xC5,0xA4,0x8A,0x9A,0x1F,0x6E,0x19,0x5D,0x36, + + 0xE7,0x89,0x8B,0xE3,0x22,0xD1,0xCC,0xAF,0xFE,0xF9,0x75,0x1D,0x3D,0x15,0x69,0x6A, + + 0xB1,0x80,0x0E,0x9B,0xCC,0x81,0xD7,0xA4,0xCC,0x0B,0x03,0xDF,0x83,0xED,0xC6,0x28, + + 0x08,0x3E,0xB9,0x0C,0xE1,0x77,0x0C,0xB7,0x2D,0xB8,0xF2,0x2E,0x3C,0x51,0x2D,0xAA, + + 0x0E,0xCD,0xB5,0x56,0x6C,0xAD,0x85,0x6B,0x54,0xE8,0xFA,0x3E,0x2F,0xAF,0xB1,0x38, + + 0xD1,0xCC,0x80,0xCB,0x96,0x5D,0xE4,0x81,0x2F,0x81,0x91,0xED,0x2F,0x68,0x47,0xE0, + + 0x66,0x86,0x34,0x5F,0xE8,0xA3,0xC1,0x66,0x67,0x02,0xEF,0xD8,0x7E,0xF0,0xB7,0xC5, + + 0xEE,0x93,0xAC,0x96,0xB3,0x42,0xA3,0x03,0x2C,0x01,0xB6,0xD4,0x47,0xF0,0xEC,0x3A, + + 0x25,0x9C,0x2C,0x94,0x91,0x4A,0xFC,0x1A,0x1D,0xDC,0x04,0x48,0x88,0x9D,0x2D,0x87, + + 0x2C,0x8F,0x85,0x96,0xB2,0x18,0x33,0x9E,0x6C,0x28,0x4D,0x83,0xC7,0xF6,0xD6,0xB4, + + 0x04,0xEC,0xBC,0x7F,0xE9,0xFE,0xC2,0xC0,0x87,0xBD,0x5E,0xF7,0xF1,0xDF,0x1A,0x1B, + + 0x45,0x0E,0x12,0xB4,0x95,0xB2,0x70,0x00,0xE4,0xDE,0x02,0x16,0x89,0xFB,0x3E,0x9C, + + 0x21,0x27,0xE4,0x53,0x96,0x3F,0x42,0xDE,0xEA,0xB7,0x31,0xCB,0x71,0xD4,0xF6,0x30, + + 0x22,0x1B,0xED,0x68,0x15,0xB0,0x13,0x81,0x0D,0xA7,0x41,0x05,0xD2,0x7D,0xBD,0x94, + + 0x4E,0x4D,0x02,0x35,0x16,0x3D,0x65,0x76,0x0E,0xA6,0xDC,0x98,0x54,0x76,0x8F,0xF4, + + 0xB9,0x83,0xFE,0x9E,0x0F,0x6A,0xD1,0xEA,0x28,0x9A,0x9E,0x5E,0xE0,0x09,0xB9,0xDD, + + 0xF3,0x91,0x09,0x7C,0xDD,0x46,0x46,0x90,0x15,0x14,0x39,0xBC,0xC0,0x04,0x33,0xED, + + 0x53,0x37,0x1F,0x70,0x55,0xB1,0x66,0x92,0x05,0x59,0xCE,0xC9,0xDF,0x9A,0xAA,0xBB, + + 0xA7,0x8B,0xF6,0x9E,0x1A,0xA0,0xC0,0xC8,0x8F,0xB5,0xA9,0xDD,0x95,0xF6,0xA6,0x53, + + 0x45,0x96,0x11,0x2C,0xBC,0x94,0x68,0xC6,0x2D,0xFC,0x65,0x6A,0x56,0xE8,0xA5,0xA9, + + 0x70,0xDF,0x96,0xAC,0xC0,0x16,0x34,0xFB,0x90,0x70,0xEA,0x59,0x8E,0xF2,0x65,0xA0, + + 0xEE,0x31,0x43,0xAD,0xFD,0x51,0x09,0xD3,0x07,0x8F,0xAD,0xEE,0x5D,0xBC,0x28,0x6F, + + 0xA9,0x4D,0x49,0xDE,0xE3,0xB9,0xEA,0x2B,0x18,0xDB,0x4B,0x84,0x5C,0xBE,0xA7,0x2D, + + 0x06,0xA8,0x20,0x76,0x72,0x5C,0x72,0x21,0x43,0x0A,0x85,0x46,0xA7,0x05,0x30,0xE3, + + 0x71,0x64,0x2F,0x2C,0x93,0x25,0x0F,0xB4,0x69,0xA6,0x38,0x27,0x6D,0x05,0x26,0x83, + + 0x3C,0x00,0x36,0x03,0x7B,0x53,0x4F,0xC3,0xC4,0xEF,0xA9,0xDA,0x18,0xF3,0x31,0xE2, + + 0xF9,0x88,0x41,0x77,0x50,0xA9,0x21,0xCF,0x6D,0x4E,0x59,0x11,0x61,0xC3,0x1A,0xA2, + + 0x6A,0x15,0xD1,0x83,0xFB,0x35,0xC1,0x93,0x7E,0xEB,0xE8,0xB4,0x0E,0xCF,0x10,0x8C, + + 0x05,0x24,0xD2,0x56,0xA0,0x88,0xF7,0xF4,0x06,0x4C,0xE6,0x96,0x49,0x0A,0x3F,0x69, + + 0xC1,0x09,0xA7,0x69,0x7B,0x17,0x42,0x8E,0x1F,0x3B,0xA9,0x45,0x32,0x09,0x7C,0x33, + + 0x74,0x62,0x5F,0x25,0x13,0x31,0xE6,0xB6,0x01,0x27,0x49,0x85,0x60,0xC6,0xFD,0xFB, + + 0x2A,0xA7,0x05,0xFF,0x28,0x6A,0x04,0x89,0xB7,0xE5,0x83,0x5F,0x68,0xEF,0xDE,0x6A, + + 0xB2,0x82,0xB9,0x35,0x1F,0x0A,0x62,0x3C,0xA0,0xD8,0xA4,0x09,0xD4,0xEF,0x57,0xFA, + + 0xAE,0xA5,0x97,0x63,0x60,0x7B,0x43,0x95,0x3F,0xE1,0x17,0xFA,0x90,0x8B,0xE8,0x30, + + 0x8F,0x2A,0x3B,0x99,0xB1,0x76,0xDB,0x18,0x27,0x46,0x1C,0xFD,0xDD,0x4B,0x7A,0xB7, + + 0x0C,0x4D,0xCA,0x58,0xD2,0xCD,0x5A,0x7D,0xAB,0xE3,0x43,0x9F,0xDE,0xE1,0x28,0x5C, + + 0x08,0xAF,0x0A,0x18,0xC6,0x50,0x1B,0xFC,0x4E,0xB1,0xE2,0x58,0xD9,0x65,0x4B,0xCD, + + 0xAE,0x6E,0xD6,0x5E,0xAA,0x7F,0xC5,0x9A,0xFA,0x67,0x81,0x3A,0x31,0x0A,0x15,0xBB, + + 0x8F,0x72,0x0B,0x4C,0xC7,0x82,0xE6,0xFD,0x83,0xBF,0x0F,0x9F,0x59,0x47,0x62,0x20, + + 0x23,0xD0,0xCA,0x00,0x18,0x6D,0x45,0x8F,0x1C,0xE5,0xDE,0xB9,0x51,0x52,0x29,0xAC, + + 0xF8,0x2C,0x73,0x10,0x19,0x2E,0x0B,0x34,0x1D,0x07,0x85,0x8B,0x1D,0x33,0xA6,0x21, + + 0x7C,0x31,0xBD,0x7B,0x1C,0x3F,0xC1,0x9B,0xC6,0xA7,0xC5,0x3D,0xF4,0x5A,0x22,0xAE, + + 0xD9,0x51,0x4D,0xB1,0xF9,0xB5,0x47,0x8D,0x89,0x22,0xD5,0xB5,0xF7,0x32,0xFB,0x22, + + 0x24,0x55,0x4C,0x01,0x93,0xBE,0x52,0x92,0x89,0xB5,0xB4,0x44,0xCE,0x79,0xB3,0xA3, + + 0x4F,0x57,0xB3,0x36,0x17,0x38,0x4D,0x62,0x9C,0xF8,0x4C,0x07,0xF7,0xF8,0xCE,0x45, + + 0x86,0xBB,0x3E,0x27,0x13,0xBC,0x2B,0xC9,0x6D,0xFB,0xDF,0xF5,0x51,0x7B,0x59,0x0F, + + 0x56,0x18,0x87,0x2E,0x10,0x3A,0xCB,0x81,0x63,0xD1,0x8F,0xDB,0x18,0x13,0x51,0x36, + + 0xA5,0xE5,0x82,0x4C,0x3E,0x7A,0xD6,0x89,0xF8,0xD3,0xB4,0xBD,0x2B,0x50,0xDE,0x58, + + 0x6D,0xCD,0x3A,0xFE,0xC6,0x7B,0x60,0x8D,0x0A,0x93,0x08,0x38,0x51,0xF7,0x61,0x2C, + + 0x5D,0xBC,0x93,0x57,0x19,0xE5,0x13,0x4B,0xCC,0xD7,0x8E,0x5D,0x2E,0xDB,0xDF,0x86, + + 0x87,0x2F,0x1F,0xB4,0xBF,0x7A,0x09,0x8C,0x5A,0x16,0xA5,0x5F,0x9A,0xDC,0xF2,0xB7, + + 0x89,0x5E,0xCC,0xCD,0x99,0x7D,0xF1,0xA8,0x2E,0xF7,0xED,0x0E,0x5E,0xD3,0x8E,0x19, + + 0xF5,0xBD,0xF6,0x8C,0x3F,0x32,0xA1,0xD8,0x1F,0xFC,0xA0,0xFB,0xC6,0x72,0xD7,0xDB, + + 0x56,0xFF,0xFF,0x1D,0x4D,0x31,0xC1,0xF4,0x81,0x4F,0x77,0x9F,0x98,0xD2,0x04,0xDB, + + 0xB3,0x94,0x5F,0xBF,0xCC,0x3F,0x05,0x8D,0x97,0xF0,0x4F,0x9B,0x04,0x6F,0x4A,0x60, + + 0x25,0x33,0x1B,0xE4,0xB8,0x5D,0x4B,0x05,0xE5,0x61,0x59,0x02,0xF5,0x3F,0x70,0xA7, + + 0x66,0x50,0x9F,0x2E,0xE5,0xD0,0x6B,0xC8,0xCA,0x7C,0xA9,0xB2,0x28,0x3B,0xE1,0x27, + + 0xF1,0x8F,0xD9,0x83,0xBC,0x3C,0xE5,0xD8,0x2D,0x81,0x05,0x45,0x2B,0x97,0x3C,0x97, + + 0xAD,0x97,0x69,0xB6,0x31,0xE1,0xDE,0x49,0x13,0xCB,0x29,0x45,0x3E,0x02,0xA0,0x63, + + 0x98,0x5B,0x76,0xA4,0xBA,0x09,0x48,0x91,0x2A,0xA1,0x50,0x04,0x72,0x19,0xF8,0x0E, + + 0x01,0xC4,0xF2,0x4A,0x36,0xE5,0x1E,0x4A,0xAE,0xB4,0x2B,0x85,0xDB,0x68,0xD5,0x21, + + 0x79,0xC4,0xF0,0xA5,0x8A,0xDB,0x49,0x90,0xF6,0xAA,0xE6,0x94,0x52,0x6B,0xED,0xC1, + + 0x83,0x8F,0xE5,0x41,0x5F,0x96,0x63,0x71,0x74,0x6A,0x1D,0x8D,0xF3,0x9C,0x1A,0xEA, + + 0x78,0x34,0xB6,0xD4,0xE9,0xA7,0x35,0x39,0x34,0xDB,0xE8,0x5F,0x34,0x09,0xEA,0xA3, + + 0xFB,0xE5,0xB4,0x2F,0x71,0xB6,0x09,0x9A,0xB1,0x58,0xF0,0x23,0x7C,0x58,0x1E,0x50, + + 0x70,0x1B,0x17,0x70,0x3F,0x21,0x86,0x17,0x34,0xE9,0xCA,0x49,0x37,0xFB,0x94,0x88, + + 0xA7,0x56,0x13,0x6F,0x95,0xA0,0x1B,0x36,0x05,0x5A,0xFD,0x17,0x34,0xFA,0xF1,0xCE, + + 0x2A,0x84,0x78,0x5D,0x2A,0x45,0xE4,0x1A,0xCE,0xDA,0x72,0x96,0xE2,0x57,0x54,0x6F, + + 0x09,0xAC,0x12,0x56,0xF6,0x3C,0xEF,0x69,0x7F,0x5C,0x05,0x0C,0xF8,0xFD,0xA3,0x6F, + + 0x67,0x71,0xBA,0xC1,0x77,0xDF,0x3B,0x7F,0x06,0x2F,0xB3,0x92,0xDE,0xAF,0x50,0x25, + + 0x2C,0xEA,0x13,0x7B,0x3C,0xA9,0x45,0x4E,0xED,0x22,0x44,0x99,0xFB,0xE0,0xB3,0x8B, + + 0x9E,0x60,0xA2,0x14,0x3C,0xB8,0x6C,0xA6,0x4C,0x16,0xA2,0x93,0x72,0xB1,0x74,0x97, + + 0xCC,0x92,0xE4,0x96,0xD4,0x1E,0xBE,0x80,0x05,0x24,0xA5,0xC5,0x45,0x7B,0xD7,0xF0, + + 0x8E,0x1D,0xF1,0xB8,0xD8,0xF0,0x0B,0x96,0x8F,0xDD,0xE4,0xD5,0x57,0xDA,0x57,0xF3, + + 0xC8,0xFD,0xBC,0x13,0x9D,0xAC,0x43,0xB5,0x04,0x50,0xC5,0xD7,0xCE,0x06,0xA9,0xEF, + + 0x20,0xB5,0xCD,0xBC,0xA7,0xA4,0xD4,0x90,0x04,0xA8,0x4C,0xB9,0xD5,0x91,0x36,0xA3, + + 0x4F,0x74,0xB8,0x25,0xB3,0x38,0xCF,0xC7,0x9B,0xC4,0xF8,0x51,0x8A,0xEE,0x44,0xB0, + + 0xCA,0x99,0x75,0x37,0x73,0x17,0x0B,0xE4,0x47,0x69,0x4A,0x05,0xD2,0xB4,0x14,0xA0, + + 0x97,0xD8,0xBF,0x80,0x5C,0xD3,0x26,0xF3,0xE1,0xF7,0x7D,0xD3,0x08,0x2A,0x18,0x2B, + + 0xEE,0x99,0x9E,0x70,0x90,0xB5,0x9F,0x95,0xE8,0x77,0x20,0x2A,0x35,0x4C,0x66,0x42, + + 0xC4,0xFA,0x88,0xB7,0xB1,0xFB,0xA8,0x4B,0xCE,0x19,0x73,0x93,0x7B,0xD8,0x19,0x2B, + + 0x6E,0xBA,0x58,0x9C,0x88,0xFE,0x22,0xB4,0xD8,0x77,0x1A,0xD0,0x61,0x71,0x4D,0xBB, + + 0x44,0xD8,0x3F,0xB5,0xBB,0xFA,0x0D,0x8B,0xF5,0x74,0x9E,0x4F,0x02,0xF4,0x60,0xFF, + + 0xC7,0x7D,0xDE,0x31,0x1A,0x69,0x82,0x94,0xAF,0xC3,0x8E,0xC9,0x83,0xF3,0xEE,0xFB, + + 0x8D,0xDC,0x1D,0xE2,0xD4,0xF9,0x00,0xCF,0x92,0x51,0xDA,0xC8,0x5D,0xED,0xCB,0x59, + + 0xF2,0x94,0x37,0xDE,0x98,0x35,0x3D,0x09,0x7F,0xC7,0x67,0xCF,0xBE,0xBE,0x55,0x28, + + 0x97,0x30,0xD5,0x6F,0x76,0xFE,0x35,0xE6,0xFE,0x70,0x3D,0x5F,0xB7,0x9D,0x60,0x5F, + + 0xA3,0x0D,0xD4,0x43,0xDA,0x43,0x28,0x70,0x48,0x4F,0x6B,0xD4,0x17,0x91,0x28,0x11, + + 0x8C,0x09,0xC0,0x44,0x33,0x62,0x12,0x32,0xE2,0x5A,0xC2,0x06,0x2D,0x7E,0x73,0x04, + + 0x8C,0x6C,0xBF,0xA5,0x5A,0x61,0x71,0x65,0x40,0x4F,0xE8,0x43,0xF1,0xCB,0x89,0x12, + + 0x65,0x4F,0x0B,0x6E,0x1C,0xA5,0x9E,0x57,0x23,0x63,0x21,0xCE,0x5E,0xB5,0x38,0x44, + + 0xE2,0xA0,0xFA,0xBB,0x71,0xF2,0x30,0x62,0xC9,0x49,0x7F,0x0B,0x8F,0xB0,0x72,0xBF, + + 0x30,0x01,0xF0,0xB4,0x03,0xAE,0xBF,0x03,0x7B,0xC3,0x7B,0xE2,0x8F,0x83,0x39,0x68, + + 0x69,0x57,0x56,0xC1,0xBA,0xA8,0xAE,0xA6,0x2B,0x17,0x63,0x7A,0x3E,0x27,0xF1,0xAE, + + 0x3E,0x6B,0x25,0x68,0x95,0x66,0x59,0x31,0x8B,0x5C,0x87,0xE6,0xD7,0xCC,0x03,0x4E, + + 0x40,0x13,0x02,0xCC,0x00,0x29,0x90,0x5A,0xB3,0xB7,0x9A,0xFC,0xA1,0xBE,0x2E,0x2E, + + 0x2B,0x0B,0xE8,0x11,0x1A,0x38,0xDE,0x1C,0xA0,0x90,0xA2,0xC6,0xA0,0x07,0x97,0x6F, + + 0xA9,0x4A,0x53,0x31,0x61,0x44,0xD3,0xBC,0x28,0x06,0xEC,0xAF,0x49,0x3F,0x8C,0x9B, + + 0x54,0x04,0x4B,0x58,0xD7,0x23,0x43,0x3C,0xCF,0xE1,0xF8,0x7D,0x94,0x96,0xA5,0x88, + + 0x73,0x87,0x9E,0x3E,0xB9,0xDC,0x18,0x98,0x42,0x03,0xB0,0x68,0x7E,0xB8,0x52,0x3D, + + 0xD6,0x70,0x8C,0xAA,0x1D,0x56,0xA1,0x3F,0x81,0x77,0xBD,0x8D,0x89,0x2D,0xE6,0x64, + + 0x39,0x43,0x34,0x50,0x27,0x6C,0xC3,0x81,0x4A,0x03,0x30,0x72,0x04,0xC1,0xE4,0xDD, + + 0xC8,0x93,0x2E,0xD9,0xB1,0x9A,0x3B,0x2F,0x4C,0x40,0x4B,0x8E,0x3B,0x23,0x64,0x20, + + 0x7C,0x1F,0xCC,0x05,0xB0,0x90,0x44,0x87,0xC1,0xFF,0xCD,0xAA,0x76,0xC2,0x6C,0xD4, + + 0x66,0x9A,0x0D,0xFB,0x49,0x8E,0x98,0xEE,0xEC,0x33,0xDB,0x0D,0xD0,0xF1,0xED,0x85, + + 0x25,0x92,0x45,0xC0,0xFE,0x3A,0x41,0x9F,0xC2,0x49,0x3F,0xE5,0xA0,0x30,0x89,0x73, + + 0x23,0x5B,0xAD,0x84,0x0C,0x82,0xB6,0x34,0x72,0x6C,0xE5,0x37,0x68,0xD6,0x0B,0xBF, + + 0xAD,0xB2,0xA3,0xC0,0x59,0xA2,0x0C,0xF5,0x51,0x63,0x44,0xFB,0xF6,0xA0,0x37,0xE1, + + 0x13,0xBA,0x7A,0x25,0xDB,0x75,0x9F,0x82,0x88,0xCF,0x18,0x71,0x30,0x15,0x8E,0x01, + + 0xB4,0x9D,0x45,0xDB,0x56,0xC2,0xAD,0xE9,0x45,0x1A,0x71,0x87,0x4D,0x14,0xED,0x21, + + 0x5D,0xB4,0x93,0xE7,0xB7,0x7B,0x80,0xEC,0x18,0xAC,0xBD,0xB1,0xEC,0x78,0xCF,0x6A, + + 0xAA,0x50,0xF9,0x8F,0x92,0xC4,0x68,0x0D,0xBC,0x1B,0xCC,0xA4,0xDB,0x3A,0xBA,0x68, + + 0xD6,0x16,0xA7,0xB2,0x98,0x32,0xCA,0x4B,0x47,0xF4,0xFC,0x2C,0x78,0xEB,0x1F,0x79, + + 0xD7,0x15,0xB8,0xD2,0x9C,0x3C,0xBB,0xDA,0xC2,0xFC,0xD0,0x14,0x59,0x14,0x6F,0xDD, + + 0xA6,0x16,0x0F,0xBE,0x06,0x3D,0x4F,0x2A,0xCF,0xF4,0x5F,0x24,0x83,0xF6,0xD0,0x3B, + + 0xA6,0x11,0xA7,0xC2,0xEA,0x48,0xC5,0x14,0xD6,0x1E,0x6B,0x3C,0x36,0x7A,0x70,0xF0, + + 0x08,0x5D,0x69,0x4B,0xDA,0x92,0x46,0xCC,0x54,0xAD,0x56,0x3D,0x18,0x1D,0x52,0x22, + + 0xE2,0x0F,0xE0,0xE9,0x6E,0xF8,0x19,0xD7,0x03,0x64,0x87,0x75,0x59,0x78,0x49,0xEC, + + 0xF7,0x1B,0xA9,0x2C,0x79,0x7F,0x65,0x02,0x94,0xF8,0xA7,0xE6,0x7F,0xEB,0x18,0xB0, + + 0x08,0xE0,0x70,0x82,0x19,0xD0,0xBA,0xA6,0x4F,0x7E,0x70,0xBA,0x17,0xA2,0x60,0xEA, + + 0x80,0x83,0x7C,0x85,0xB4,0x0E,0x07,0x79,0xF8,0xA2,0xDA,0x33,0x54,0x93,0xCD,0x01, + + 0x8C,0xEE,0x5A,0x68,0x7F,0xE6,0x99,0x33,0xE0,0xFE,0xF6,0x00,0x59,0x7F,0x70,0x81, + + 0x60,0x8A,0x0D,0x68,0xFD,0xE7,0xD9,0x97,0x1C,0x3E,0xE0,0x3D,0xD3,0x51,0x5A,0xA9, + + 0xFE,0x7E,0x20,0x86,0x7E,0xA2,0xD3,0xAB,0x31,0x18,0x91,0x7C,0x86,0x50,0x20,0xFE, + + 0xFE,0x21,0x40,0xB0,0x33,0x01,0x42,0x89,0x41,0x6F,0x10,0xFC,0x73,0x31,0x5E,0x84, + + 0x4C,0x8F,0x4B,0x81,0x37,0xBD,0xAE,0xB7,0xF9,0x36,0xD6,0x96,0x4A,0xF4,0x77,0xB1, + + 0x67,0x78,0xBF,0xC1,0x5F,0x64,0xCA,0x9B,0x42,0x8A,0x4B,0x68,0x3B,0x4C,0x3F,0xAA, + + 0x10,0x8A,0x5D,0x70,0x76,0xCC,0x1D,0x51,0x75,0xC3,0x18,0xEE,0x1E,0x15,0x92,0x98, + + 0x2F,0xB9,0x22,0x6C,0x90,0x0F,0xB2,0x65,0xB4,0x8B,0xFD,0x19,0xD0,0x74,0xCB,0x13, + + 0xBF,0x68,0x63,0x4B,0x21,0xE8,0xB3,0x08,0xC3,0x88,0x73,0xB3,0xDD,0xA8,0x53,0xF3, + + 0x97,0xC6,0xFF,0x61,0x57,0xA8,0x3D,0x26,0x6C,0x64,0xD9,0x3A,0xDC,0x0B,0xD1,0xA8, + + 0xE7,0x36,0x04,0x3C,0xF5,0x0A,0x8D,0x1B,0x55,0xC5,0xC4,0x6B,0x35,0x69,0x14,0x72, + + 0xE6,0xE9,0x4A,0x60,0x93,0x79,0x37,0x9A,0x1B,0x60,0x18,0x8D,0x91,0x46,0x3D,0x4C, + + 0x8E,0x7F,0xBD,0xDD,0x9A,0x5B,0xF3,0x2D,0xD4,0x63,0xF7,0x4B,0x3F,0x41,0xB8,0xA8, + + 0xE3,0x7A,0x08,0x40,0x41,0x04,0x30,0x9B,0xDB,0x32,0x9D,0x77,0x34,0x69,0x2E,0x83, + + 0x87,0x96,0x89,0xB5,0x95,0x30,0xE4,0xD1,0x4A,0x05,0xCC,0x57,0x07,0x10,0x6C,0x70, + + 0xA7,0x99,0xAD,0x56,0x31,0x94,0x90,0x37,0xB0,0xB3,0x2B,0x5C,0x80,0xF5,0x29,0x84, + + 0x05,0x1A,0xDD,0xE5,0x3B,0x34,0xE5,0x4B,0xE0,0x0E,0x95,0x23,0x97,0x77,0xE9,0xF1, + + 0xE4,0xD3,0x50,0xE5,0x16,0x4C,0x54,0x58,0x0E,0x70,0xBB,0x47,0x15,0x02,0x5C,0xDB, + + 0xA6,0x98,0x9A,0x58,0xDD,0x42,0xAF,0xCD,0x60,0x7E,0x50,0x84,0x89,0x78,0x93,0xB9, + + 0xA8,0x63,0x8F,0x88,0xC6,0x69,0xBC,0x4A,0x70,0x97,0xF8,0x74,0x72,0x6F,0x05,0xC1, + + 0x25,0x9B,0xBB,0x5C,0xA6,0x19,0xC6,0x67,0x8B,0xF8,0x31,0x62,0xF8,0x7C,0x65,0xC2, + + 0x94,0x1D,0x42,0xAC,0x6A,0xF6,0xAC,0xA5,0xE1,0x0F,0x85,0x88,0x36,0x95,0x5E,0xE8, + + 0x6D,0x18,0xFF,0x38,0x99,0x67,0x95,0x1A,0x6A,0xB0,0xCF,0xDC,0xDB,0xBA,0x56,0xF8, + + 0x6C,0x91,0x2E,0xBD,0x82,0x32,0x40,0xBD,0xCC,0x76,0x39,0x9D,0x5E,0xB8,0x5F,0xE9, + + 0xED,0x9B,0x18,0xC8,0x6A,0xB2,0xB2,0x2F,0xE9,0xA7,0xF0,0x16,0x1D,0xF5,0x57,0x19, + + 0xA8,0xBF,0x0A,0xA2,0x0E,0xF6,0x6F,0x9C,0x4C,0x74,0xE6,0xBD,0x58,0x50,0x3C,0xCB, + + 0x89,0xA1,0x45,0x58,0xE2,0x5A,0xEB,0x6E,0x4A,0x41,0xBC,0xEB,0xD2,0xF3,0x54,0x6B, + + 0x17,0x32,0x8C,0xDA,0x1B,0x12,0xAD,0x5B,0x4F,0x4F,0xC6,0x2E,0x33,0xFB,0x71,0xE7, + + 0x45,0xCF,0xDD,0x3C,0x74,0x15,0xB7,0x2A,0x6E,0x9C,0xD0,0xE9,0x2E,0x9A,0x7A,0xD6, + + 0x2F,0xCB,0x8C,0x81,0x0A,0x63,0xFB,0x7F,0xBE,0x9E,0x77,0x9B,0x5C,0xBE,0x3E,0x38, + + 0x68,0xD1,0x7F,0xFC,0x10,0x9B,0x4A,0x21,0xE3,0x46,0xF6,0x1C,0xB9,0x11,0x76,0x16, + + 0xE0,0x82,0x24,0x67,0x7C,0x57,0x41,0x10,0xE4,0xBE,0xD9,0x52,0x30,0x65,0x17,0x63, + + 0xE0,0x9B,0x01,0x81,0x94,0x70,0x41,0x3D,0x63,0x03,0x8B,0x27,0x3B,0x6D,0x27,0xE2, + + 0x0D,0x42,0xF6,0x66,0xF4,0x75,0x0F,0x40,0x83,0xB7,0xFF,0xD7,0xD0,0x33,0x60,0xB3, + + 0x86,0x89,0xF8,0xBE,0xBE,0x29,0xA9,0x68,0xE7,0x3B,0xCE,0x49,0x71,0x7C,0x1C,0xBD, + + 0x0B,0x5E,0xDE,0x78,0xAC,0x37,0x10,0xE0,0x70,0x48,0x18,0x50,0xC8,0x6D,0x13,0x6A, + + 0x84,0x55,0xBE,0xAD,0xCB,0x6B,0xFD,0xFA,0x77,0xD0,0xE6,0x59,0x2E,0xD7,0x67,0xB8, + + 0x57,0x45,0x71,0xE4,0xAB,0x78,0xE0,0x97,0xD3,0x3A,0x0E,0x4E,0xA7,0x92,0x5B,0x8F, + + 0xED,0x89,0xF9,0x4B,0xE1,0xDE,0x6A,0x3A,0x6C,0x53,0xAC,0x01,0xFF,0x78,0x58,0x4B, + + 0xE2,0x6D,0xB1,0x6C,0x99,0x3F,0x0E,0x08,0x7A,0x92,0x0C,0x14,0x11,0x88,0x73,0xFA, + + 0x0C,0x87,0x38,0x7D,0x18,0x35,0x7C,0x4F,0xE9,0x0A,0xAD,0x15,0x7F,0xCE,0x9B,0x6A, + + 0xF1,0xAA,0xC3,0x09,0x78,0x30,0xA3,0xC7,0xD9,0x06,0xBB,0xBA,0x54,0xC6,0x13,0x91, + + 0x0C,0x4C,0x2E,0x37,0x84,0xB1,0xAA,0x80,0x29,0xD1,0xC5,0xE8,0x36,0x19,0x2D,0x26, + + 0xC1,0x02,0x07,0x61,0x1D,0x0C,0x03,0xB2,0xB6,0x02,0x1A,0x5D,0xCB,0xE6,0x27,0xB2, + + 0x05,0xF3,0x22,0x0D,0xC6,0xA5,0xAB,0x61,0x33,0x01,0x89,0xA0,0xB2,0xBF,0x43,0x50, + + 0x8D,0x1C,0xEA,0xAD,0x64,0x20,0x7B,0x64,0x46,0x54,0x24,0x9F,0x27,0xDE,0x56,0xD6, + + 0xCB,0x74,0x7F,0xFB,0x50,0x32,0x84,0x58,0x60,0xEB,0xAA,0xFD,0x18,0x7D,0x2E,0x66, + + 0xC8,0xA0,0x77,0xAF,0x58,0xAA,0xF0,0xC3,0x0C,0xA7,0xA6,0x04,0xC9,0x33,0x95,0x70, + + 0x03,0xE2,0x7A,0xFB,0xD2,0x45,0x17,0x25,0xE4,0x00,0x87,0x85,0x1B,0x36,0x53,0x73, + + 0xFD,0x97,0x8D,0x78,0x89,0x98,0xA6,0xC1,0x61,0x4C,0xCC,0x74,0x91,0x7B,0x3A,0xF5, + + 0xC9,0x05,0x04,0x64,0x32,0x94,0xFB,0x06,0x72,0xA9,0x44,0x0D,0x11,0xA5,0xB4,0x38, + + 0xB0,0x5A,0xAE,0xC9,0x30,0x75,0xCA,0x74,0x4B,0xD1,0xFD,0x96,0x31,0x7A,0x1C,0x31, + + 0x05,0x06,0x53,0xB6,0xDE,0x5A,0xAD,0xC5,0x03,0xF9,0xC3,0xC8,0xF4,0x57,0x14,0xB3, + + 0x04,0x07,0xC1,0x9E,0x97,0xC3,0x65,0x36,0x21,0x77,0xDB,0xC9,0x73,0x52,0x96,0x7B, + + 0xA4,0x15,0x8C,0xA1,0x3E,0x80,0x28,0xDC,0x09,0x5C,0xE8,0xAA,0x99,0xFB,0x30,0xC1, + + 0x41,0x14,0x1D,0x6F,0x4D,0xB4,0xFF,0xDE,0xDE,0x49,0xA0,0xE4,0x7F,0x6A,0xFC,0xAE, + + 0x09,0xE5,0x9D,0xFE,0xD1,0x9B,0x76,0x69,0xE2,0x41,0xA2,0x29,0xCE,0x59,0x9F,0x68, + + 0x0A,0x5B,0xD9,0xA4,0x52,0x8A,0xA7,0x56,0x95,0x06,0x9D,0xDF,0x0A,0x1E,0xBE,0x37, + + 0x2C,0x54,0x53,0xD7,0x4A,0xB1,0x5E,0x09,0x96,0xBD,0xD0,0xD5,0x53,0xB6,0xC9,0xBA, + + 0xD8,0x78,0x8C,0x23,0xD2,0x8C,0x4F,0x7C,0x43,0x3A,0xDA,0xBB,0xFA,0x73,0xE8,0xB6, + + 0xAC,0xBE,0xB9,0xF4,0x53,0x04,0x97,0xB8,0x32,0xAA,0x47,0x2A,0xF8,0x8B,0x77,0x22, + + 0x24,0xB9,0x63,0x42,0xB8,0xB4,0x67,0x0A,0xD3,0x3A,0x7C,0x4C,0x27,0xBC,0x18,0x33, + + 0xA5,0x01,0x4B,0xE0,0x04,0xEF,0xCF,0xCA,0xDA,0x8D,0x7D,0xB5,0x69,0x6B,0x7A,0x41, + + 0xEE,0xE5,0xD6,0x2A,0x7E,0xFB,0x94,0x42,0xC5,0x47,0xD9,0xF6,0x1D,0xFA,0x71,0xF0, + + 0x00,0x0F,0x31,0x75,0x7F,0x13,0xA6,0xAB,0x61,0x11,0x91,0xCD,0xBD,0xB8,0xB9,0xE3, + + 0x22,0x22,0x89,0xE4,0x8A,0x0C,0x19,0xF3,0xC3,0xD8,0x4D,0x44,0xE5,0xAC,0x2F,0x3C, + + 0xDA,0x8B,0x20,0x67,0xD6,0xA9,0x4C,0x04,0x9C,0xD6,0x30,0xB2,0x44,0x49,0x63,0x21, + + 0x56,0xE9,0x44,0xD2,0x3F,0x21,0x43,0x94,0x57,0x78,0x7A,0x05,0x23,0x4C,0xA1,0x47, + + 0x1F,0x26,0xA3,0xA5,0xCA,0xA2,0xC9,0xF9,0xC5,0x66,0xE6,0x16,0xA6,0xEF,0x0B,0x4E, + + 0x86,0x03,0xD1,0x90,0x55,0x87,0x81,0x6E,0x39,0x17,0xEA,0x97,0xD9,0x6C,0xB7,0xF9, + + 0x88,0x05,0x34,0x7D,0x70,0xC4,0x9E,0x4C,0xB7,0xD3,0x22,0x5C,0xB7,0x70,0xBA,0xEA, + + 0xFC,0x28,0x94,0x22,0x75,0xA4,0x82,0xFD,0x8F,0x69,0x3B,0x2A,0x3E,0xE1,0x71,0x58, + + 0x67,0xEE,0xC5,0x6E,0x9F,0x63,0xD8,0x4D,0xB4,0x85,0x95,0x77,0x85,0xE9,0xBC,0xE8, + + 0x09,0x06,0x54,0x6C,0xE5,0xC8,0x33,0x4F,0x48,0x3A,0xAD,0x66,0x36,0x53,0xF2,0xB9, + + 0x82,0x81,0xEA,0x5F,0xE2,0x4D,0x46,0xE8,0xCE,0xC6,0xF6,0x92,0x5E,0xF9,0xAA,0x1F, + + 0x82,0xCC,0xFE,0x4C,0xBE,0x2A,0x23,0x8A,0xEA,0x32,0x56,0xDB,0x8A,0x8E,0x18,0x6C, + + 0x2F,0x31,0x23,0xC2,0xDF,0xEC,0x4B,0x4B,0x2F,0x7E,0x66,0x67,0x5E,0x4E,0x51,0xB3, + + 0x40,0xC0,0x6B,0x4E,0x63,0x4E,0x7A,0x1D,0xFC,0xC2,0x50,0xB5,0x64,0xAD,0x1A,0xDA, + + 0xC4,0x3F,0x48,0xF5,0x00,0x16,0xE7,0xE5,0x05,0xD4,0x8C,0xE1,0xAA,0x6D,0xBC,0x61, + + 0xA1,0x1C,0x8C,0x7C,0xDC,0x80,0x65,0xF5,0xC0,0x2E,0xB7,0x32,0x47,0x71,0x85,0x90, + + 0x07,0xF6,0x68,0xF4,0xA3,0x3B,0x57,0xA1,0xE7,0x90,0x56,0x67,0xE0,0x5F,0x7F,0xD9, + + 0x4E,0xF7,0xB7,0x95,0x27,0xBB,0x64,0x6C,0x40,0x22,0x06,0x55,0x59,0x0E,0x75,0xB8, + + 0xEC,0x75,0xBE,0x0B,0x5E,0x05,0x4C,0x11,0x52,0x61,0xD3,0xE0,0xA6,0x90,0x52,0xE7, + + 0x80,0x85,0xF2,0xFB,0x14,0x3C,0xA9,0xAF,0x86,0x2A,0x2A,0x71,0x8B,0xB1,0x6D,0x56, + + 0x95,0x1D,0x25,0xE6,0x26,0xBB,0x64,0xDC,0x8A,0x94,0x35,0x52,0x10,0xB4,0x53,0xFB, + + 0x00,0x8C,0xD3,0xEE,0xF7,0x18,0xC2,0xB4,0x2D,0xED,0x4E,0xF0,0xF1,0x14,0xB6,0x62, + + 0x7C,0xD5,0x23,0x9D,0x04,0xE2,0xCE,0xCC,0xE3,0x5E,0xCE,0xDD,0x25,0x59,0x56,0xBD, + + 0xD0,0x96,0x5A,0xED,0x51,0xF6,0xA9,0x9E,0x5E,0x02,0x1E,0xCC,0x1F,0xCC,0xD8,0x83, + + 0x09,0x66,0x81,0xA3,0xA3,0xA1,0xF4,0xEB,0x94,0x96,0x8F,0x9F,0xDD,0x55,0xBF,0x19, + + 0x8F,0x8B,0x43,0x77,0xD2,0xF6,0x87,0x45,0xFD,0x96,0x7F,0x17,0xF6,0x7A,0x88,0xAC, + + 0x3E,0xD3,0x75,0xBD,0x4A,0xD0,0x3E,0x5F,0x0D,0xA6,0xF8,0x1F,0xE2,0xDE,0x2F,0xA5, + + 0x88,0x99,0xB4,0x13,0x57,0x6C,0x46,0x8B,0x03,0xD6,0x81,0x7A,0x11,0x8C,0x44,0xFE, + + 0x76,0x8F,0x81,0x06,0xBD,0xA4,0xE0,0x6F,0xC6,0xCA,0x1F,0x65,0xDC,0x28,0x3F,0x33, + + 0xCC,0xD2,0x2F,0xFE,0x2F,0xB2,0x6A,0x7F,0xC7,0xB8,0xA1,0xF0,0xB1,0xB1,0x61,0xA0, + + 0xD6,0xBF,0x97,0x80,0x38,0x56,0x6D,0xD0,0x96,0x71,0x6F,0xA0,0x2E,0x6D,0xA8,0x2E, + + 0x8D,0x43,0x0E,0x4A,0x9C,0x43,0x00,0xA9,0x47,0x00,0xB8,0x94,0x57,0x72,0xC1,0xB4, + + 0x66,0xF7,0x7A,0x22,0x31,0x39,0xD1,0x00,0x03,0x4F,0x51,0xAC,0x38,0x64,0xDF,0x96, + + 0x55,0xC6,0x22,0x90,0x02,0x1C,0x82,0x53,0xE2,0xA1,0xC5,0x12,0x38,0x12,0xD0,0x13, + + 0xA3,0x9F,0x05,0x22,0x90,0x88,0x71,0x02,0xBD,0xCB,0x81,0xE4,0xF3,0x62,0x9B,0xAE, + + 0x05,0x44,0x70,0xAB,0x15,0x2F,0x83,0x70,0xD2,0xB8,0xBC,0xF0,0x61,0x27,0x41,0x7C, + + 0x7D,0x9B,0xB9,0xA7,0xA1,0x04,0x49,0xF1,0xA1,0x66,0x81,0x6C,0x71,0x7D,0x8A,0xD5, + + 0x88,0x78,0x2D,0xBD,0x8F,0xDA,0x70,0x79,0x43,0xE7,0xE1,0xF7,0xF1,0x97,0xA5,0x3F, + + 0xE3,0xAD,0xFF,0xFC,0x1F,0x99,0x3D,0x43,0x91,0xBD,0xEA,0x0B,0xB1,0xF9,0xAF,0x1D, + + 0x8E,0x1F,0xF1,0xEC,0xDF,0x98,0xB6,0x47,0x83,0x18,0x5A,0xD1,0x9D,0x63,0xC3,0xBC, + + 0xD9,0xA1,0x43,0x29,0xB0,0x27,0x85,0xAD,0xB2,0x9D,0xEB,0xA9,0x8D,0xAC,0x5B,0x87, + + 0x72,0xAF,0xF5,0x1B,0x78,0xA8,0xA0,0xAA,0xF1,0x41,0x1B,0x7B,0xE1,0x6D,0x6D,0x37, + + 0xD3,0x90,0x3A,0x68,0xE5,0xA1,0xFE,0xCD,0x9F,0x2F,0xAA,0xEE,0xDA,0xD5,0xBE,0x16, + + 0xFE,0x51,0x14,0x1B,0xBE,0xDB,0xCA,0x91,0x03,0x5C,0x36,0xEE,0x57,0x65,0xF8,0x13, + + 0x8C,0x2E,0xA1,0x4D,0x6D,0x35,0xF8,0xA3,0x71,0x0C,0xEB,0xBD,0x86,0x91,0xE6,0x26, + + 0x16,0x9A,0x70,0x2D,0x1B,0x80,0x7B,0xDF,0x83,0xAE,0x5B,0x80,0xD7,0x9F,0x7A,0x29, + + 0xC9,0x03,0x3D,0x43,0xEE,0x38,0x16,0x42,0x89,0xB1,0x39,0xEA,0x8D,0x2C,0x32,0x25, + + 0x4B,0x86,0x1C,0x8B,0x0D,0x73,0x09,0x52,0xCD,0xFC,0x5C,0x90,0x22,0xAD,0x53,0x3A, + + 0x4B,0x01,0x05,0x42,0x94,0x5E,0xD5,0x80,0x02,0xFF,0x2C,0x21,0xD8,0x27,0x73,0x24, + + 0x5D,0x40,0xC5,0x12,0x82,0x43,0x8C,0x53,0xA9,0xB2,0x31,0x30,0x24,0x11,0xFC,0xA0, + + 0x3D,0x9F,0x68,0xB7,0x2D,0xC2,0xE0,0x82,0x91,0xDF,0x2B,0x0C,0x64,0x39,0x58,0xDA, + + 0x82,0x9A,0x37,0xF0,0xBE,0x98,0x66,0x40,0xA6,0xFA,0xA4,0x70,0x41,0x87,0x88,0xF0, + + 0xCE,0x54,0x3A,0xB6,0xA5,0xE0,0xC3,0xD8,0x09,0x12,0x72,0x07,0x32,0xDB,0x15,0x11, + + 0x48,0x06,0x00,0x46,0xA0,0xBC,0xF9,0x8B,0x40,0xA3,0xE5,0x0F,0x5F,0x7A,0xB5,0x21, + + 0xD0,0x0B,0x39,0x6A,0xF0,0x49,0x32,0xC0,0x4C,0xAC,0xFF,0x47,0x87,0xF3,0xB9,0xBC, + + 0x16,0xE9,0xD7,0xB8,0x9C,0x98,0x40,0x5A,0x6D,0xA4,0xE9,0xDE,0x0A,0x79,0x7C,0x4B, + + 0x2B,0x5C,0x94,0x2D,0xE0,0x38,0x00,0xC6,0xCB,0xDB,0x31,0x80,0xFE,0x3B,0x50,0x66, + + 0xD6,0x61,0x1A,0x6E,0xC9,0x38,0xDF,0x98,0x11,0x19,0x08,0x42,0x08,0xA8,0x78,0xE0, + + 0xA7,0xBA,0xE6,0x26,0x53,0x66,0xF6,0xF6,0xE6,0x39,0xA9,0xCB,0xDB,0xA3,0xD8,0xA9, + + 0x1B,0x14,0xAC,0xDC,0xC8,0x51,0x25,0x08,0xD2,0xEC,0x0E,0xAC,0x7D,0xFD,0x0A,0x09, + + 0xE7,0xB3,0xA6,0xE9,0x41,0xB3,0xE3,0x8B,0x82,0x53,0x63,0x8F,0x05,0x78,0x18,0x29, + + 0x37,0xBE,0x70,0x46,0x4A,0xB6,0x21,0xFF,0x0A,0xDC,0xE8,0xF9,0xB0,0xD6,0xD7,0xAE, + + 0xCC,0x57,0x8D,0xF5,0x98,0xAD,0xB2,0x3C,0x7C,0x34,0x90,0xDF,0xF5,0xE1,0x0E,0xA8, + + 0x6B,0xC3,0x57,0x7D,0x9A,0x57,0x4D,0x2F,0x82,0x6C,0x78,0xE2,0x10,0x1A,0x74,0x10, + + 0x7E,0x91,0x58,0x7D,0xF4,0xC2,0xA0,0x28,0xF4,0xF2,0x8F,0x2B,0xAB,0xA2,0xFF,0x3E, + + 0xEE,0xF7,0xA1,0x1E,0x20,0x22,0x28,0xC1,0xE4,0x82,0x39,0xB3,0x92,0xA2,0x32,0x79, + + 0x6C,0x51,0x98,0xCE,0xB3,0x2D,0x5C,0xD2,0x62,0x1F,0x77,0xE4,0x74,0x96,0x6C,0xF5, + + 0xFA,0xF4,0x28,0x46,0xAD,0xBE,0xD2,0x47,0x24,0xC1,0x40,0x66,0xF0,0xFE,0x33,0x7C, + + 0xEC,0xC4,0xC1,0xD4,0x35,0xE7,0x51,0x9E,0x42,0xC0,0x4E,0x85,0xE5,0xB4,0x96,0x2D, + + 0xB1,0x58,0x53,0x31,0x64,0xB7,0x01,0x9B,0xD5,0x8A,0x99,0x01,0x20,0x68,0xE0,0xCC, + + 0x9E,0x8B,0x26,0xF0,0xED,0xC6,0x68,0xE7,0x24,0x29,0x72,0xFF,0xE7,0x33,0x3C,0xA5, + + 0xE6,0xDA,0xB8,0x1B,0xEA,0x34,0x2B,0xD8,0x2D,0x18,0xA6,0x4C,0xA6,0xA9,0xC0,0xF0, + + 0x65,0xD9,0x40,0xCF,0xC8,0x97,0xF3,0x0A,0x5C,0x67,0x9A,0xD2,0x61,0x9F,0x15,0xB2, + + 0xE7,0x5C,0x47,0x81,0x9C,0x4B,0xFB,0x1A,0x5D,0xC6,0xF5,0x01,0x40,0x56,0xF2,0x38, + + 0xE5,0x6D,0x5A,0xB5,0x0E,0xE1,0x12,0x39,0xFB,0xC3,0xEA,0x63,0x58,0xFF,0x27,0x9A, + + 0x62,0x06,0x7A,0xB6,0x78,0xE0,0x18,0x6F,0x4C,0xA5,0x82,0x6C,0x6C,0xBF,0x5D,0x7E, + + 0x03,0x28,0x18,0x47,0x3B,0x51,0x2C,0x6A,0x37,0xA2,0xD2,0x90,0x2B,0x1A,0xCE,0x6A, + + 0xE3,0x90,0x10,0x57,0x3A,0x50,0xDC,0x7D,0x1B,0xAB,0x03,0x97,0xFF,0xA2,0xFF,0xAD, + + 0x22,0x3A,0x26,0x92,0xC8,0xC1,0xA4,0x7A,0xB1,0xBC,0x4F,0x22,0x50,0x92,0x12,0xA7, + + 0xA8,0x37,0xF5,0x03,0xDC,0xC0,0x41,0x59,0x06,0xB9,0xEE,0xA9,0x1F,0xAC,0x96,0xF1, + + 0x4F,0x73,0xDB,0xAA,0x68,0x23,0xF1,0xFD,0xEA,0xCC,0x75,0x66,0x4B,0x26,0x60,0x53, + + 0x88,0x18,0x55,0x15,0x97,0x83,0x2A,0x37,0xC1,0x11,0x7D,0x96,0x67,0x2C,0x75,0x28, + + 0x83,0x9D,0xC4,0x2C,0xC3,0x3D,0x5A,0x11,0xEA,0xD9,0xCE,0x1C,0x8D,0x8F,0xFA,0x56, + + 0x03,0xAB,0x6C,0xE8,0x5B,0x40,0x07,0x02,0xD2,0x64,0x85,0x72,0x7B,0x95,0x33,0xF8, + + 0x96,0x63,0xC5,0x4D,0x92,0x0D,0x88,0xA4,0x17,0xA0,0xB5,0x0B,0x9A,0xC9,0x65,0xEB, + + 0x5F,0x76,0xFC,0x2F,0xB7,0xF7,0x03,0xF5,0x06,0x54,0x20,0xCE,0xC0,0x80,0x83,0xBB, + + 0x40,0x87,0xDE,0x66,0x26,0x15,0x0E,0x50,0x0F,0x3C,0x02,0xCC,0x4F,0x18,0xD1,0x69, + + 0x15,0x36,0x29,0x7C,0x0E,0x29,0x6C,0xF1,0xED,0x78,0x7A,0x74,0xC6,0x06,0x9F,0xEB, + + 0xE3,0x11,0xB4,0x69,0x3E,0xB9,0x20,0x58,0x68,0x57,0x1C,0xE8,0xF2,0x26,0xBE,0x68, + + 0x9D,0x16,0x17,0x61,0xAD,0xF6,0x61,0x59,0xE9,0x76,0xE5,0x29,0xC1,0xB9,0xD1,0xE2, + + 0x28,0x7D,0x66,0x42,0x0D,0xE1,0x58,0x19,0xE2,0x41,0xAB,0xE6,0x4D,0xFC,0xA4,0x52, + + 0x4C,0xE7,0xD0,0x13,0x98,0xFC,0xE9,0x05,0x8E,0x0E,0xAE,0x6A,0x9E,0xF2,0xD2,0xF4, + + 0x9E,0xDC,0xD9,0x03,0x19,0xAE,0x0F,0xF2,0x8D,0xBE,0x37,0xBB,0x47,0xF8,0x79,0xF3, + + 0xA9,0xBE,0x2F,0x77,0xC4,0xFD,0x84,0xF9,0x01,0xC4,0x4B,0x80,0x5C,0xBE,0x5A,0x80, + + 0x68,0x11,0xE9,0xEF,0xAF,0x8B,0x6E,0xB6,0x46,0xA3,0xBD,0x5B,0xC9,0x5D,0xBD,0xE3, + + 0x8D,0x0C,0x9C,0x9B,0xE6,0x44,0x3E,0x70,0x9F,0xEE,0x67,0x4E,0x33,0xAD,0x7F,0x07, + + 0x61,0x81,0xF9,0x01,0x61,0x60,0xC9,0x32,0xBE,0x94,0xCA,0x25,0xB0,0x1F,0x99,0xE2, + + 0x05,0xAE,0xB1,0xFD,0xDD,0xFF,0x7E,0xC0,0x13,0x03,0x62,0x2A,0x55,0xCC,0x20,0x42, + + 0x31,0x09,0xF8,0xBA,0xBE,0x29,0xFC,0x22,0xC1,0x06,0xFF,0x1B,0x8B,0xE9,0xB7,0xD4, + + 0x63,0x2F,0xAE,0x7D,0x37,0x58,0xBB,0x83,0x9D,0xEE,0xCD,0xB4,0x7B,0xEE,0xBE,0x43, + + 0x86,0x8B,0x6D,0xD6,0xA6,0xFB,0x87,0x6B,0x23,0xE9,0x2E,0x1A,0x5F,0xC0,0x19,0x49, + + 0xCB,0x45,0x36,0xF0,0x59,0x2A,0x3E,0x79,0x28,0xD1,0x99,0x48,0xD5,0x46,0x7A,0xB8, + + 0xB4,0xA7,0x2E,0x89,0xCD,0x4A,0x6C,0x1E,0xA3,0xAD,0x36,0x4E,0xD5,0x0A,0x32,0x3C, + + 0xC1,0x8A,0x37,0x43,0x1F,0x68,0x28,0x7E,0xDB,0x25,0xE5,0x46,0x77,0xF6,0xA7,0x6B, + + 0x7F,0x6F,0xEA,0xE6,0x63,0xD6,0x4D,0x1A,0xD8,0xE5,0xEC,0x0A,0x79,0xDB,0xAB,0x0A, + + 0xA7,0x6F,0xED,0xE6,0x20,0x69,0x25,0x7D,0x03,0xE3,0x3C,0x3B,0x0D,0x0F,0x00,0xDD, + + 0x8F,0x9C,0x39,0x37,0x66,0xD3,0x2C,0x5E,0xA1,0xA9,0xF3,0x0E,0xAD,0xD5,0x5D,0x55, + + 0x38,0x5D,0xF4,0xFD,0xD1,0x8E,0x68,0x3E,0xD9,0xF0,0x49,0xF8,0x73,0x79,0x83,0x41, + + 0x8A,0x4C,0xF9,0xF1,0xBE,0x40,0x0D,0x5A,0xDE,0xE1,0xCB,0xE8,0xB9,0x14,0xF3,0xEB, + + 0x83,0x63,0xF5,0xFD,0x51,0xAC,0xF0,0x03,0x1E,0x54,0x81,0x82,0x78,0xE4,0x50,0x9F, + + 0x06,0x51,0x97,0xB4,0x70,0xCF,0x14,0x62,0xE3,0x16,0xCD,0xA0,0xA5,0x1C,0x9F,0x6F, + + 0xC8,0x60,0xD2,0xC5,0x31,0x95,0xA8,0x34,0x45,0xCB,0xE1,0x99,0x8A,0xAC,0xA9,0xF2, + + 0xD0,0xB4,0xBF,0x34,0x8C,0xED,0xA2,0x85,0xE6,0x73,0x51,0xFB,0xFE,0x6C,0x6B,0xA8, + + 0x56,0x52,0xDD,0xC1,0x0D,0xE2,0xB6,0xF6,0xEF,0x8F,0x4C,0xD5,0xFD,0x88,0x16,0xA2, + + 0x43,0x41,0xC0,0xF4,0xCD,0x72,0xE5,0x5E,0xDE,0xA3,0x59,0x41,0x56,0x1A,0x93,0xD8, + + 0x7D,0x9E,0xF2,0xA8,0xBE,0x93,0xE5,0xAE,0xE0,0x5B,0xF4,0x36,0xA7,0xAA,0x5D,0xC5, + + 0x2F,0x57,0x97,0xC1,0xFB,0xFE,0xFA,0x8E,0x3F,0x8A,0x95,0xDA,0xFA,0x1A,0x1C,0xEC, + + 0x48,0x53,0x91,0x15,0xAB,0xEC,0xBD,0xCE,0xC7,0xF3,0x7A,0x0A,0x98,0x08,0x38,0xA4, + + 0x40,0x15,0x37,0xB5,0xC0,0xA9,0xD2,0x62,0xD3,0x07,0x69,0x88,0xA5,0xC5,0xF5,0xBC, + + 0xC0,0xB0,0xC2,0xEF,0x1B,0x92,0xDE,0x99,0x91,0x1B,0x04,0x38,0x76,0x7F,0xF8,0xFA, + + 0x90,0x79,0xB4,0xA0,0xBE,0xA2,0x49,0x4B,0xEC,0xC7,0x38,0x89,0xFE,0x83,0xF2,0x75, + + 0xA9,0xA0,0xF7,0x99,0x59,0xEE,0x8F,0x61,0x3C,0x37,0x5F,0x69,0xB9,0xF6,0x7C,0x78, + + 0xAA,0xB3,0xE8,0x31,0xCC,0x7E,0x8B,0xEE,0xA2,0x07,0x83,0x4C,0x8D,0x1C,0x1E,0xE5, + + 0xC0,0x59,0x9E,0xD4,0x73,0xB0,0xCE,0x8B,0x07,0xFC,0x23,0x78,0x10,0x02,0xE3,0xAB, + + 0x5D,0x95,0x4A,0xBD,0x3A,0x2E,0xF3,0x18,0x49,0x1E,0x89,0x02,0xBA,0xD5,0x75,0x69, + + 0x2B,0xB0,0x30,0x59,0xF8,0x99,0x67,0xC9,0x8B,0xF0,0x99,0x0C,0x44,0xEF,0x7E,0xE0, + + 0x00,0x2D,0x30,0x5D,0x30,0x0B,0x4E,0x39,0xAD,0xE8,0x04,0x01,0xF5,0x8C,0x10,0xEC, + + 0xA9,0x8C,0x80,0xE7,0x6D,0x14,0x66,0x3D,0x49,0x8F,0x47,0x48,0x27,0x5D,0x30,0x87, + + 0xCC,0x72,0x34,0x04,0xFF,0x33,0x53,0x23,0x2F,0x56,0x75,0xDB,0xD4,0x53,0x3F,0xB7, + + 0x6E,0xC0,0xF7,0x2B,0x24,0x0E,0x58,0x93,0x13,0x7C,0x06,0x6C,0x26,0x68,0xA0,0x96, + + 0x46,0x09,0x70,0xE6,0x10,0x25,0xF2,0x25,0x68,0x18,0x63,0x57,0x66,0xA6,0x99,0xD0, + + 0x87,0xEC,0xC6,0xAB,0xE1,0xBE,0x06,0x69,0x93,0x51,0x80,0x6B,0xD7,0xDB,0x38,0x4F, + + 0x21,0x82,0xF1,0x4F,0xBE,0x7D,0xA5,0x3D,0x55,0xF9,0xE5,0x6D,0x77,0x64,0x51,0xF3, + + 0x6E,0x57,0x2E,0x31,0xF7,0x58,0x27,0x7C,0xC3,0x89,0xA3,0x06,0xBF,0xF6,0x99,0xBB, + + 0x26,0x27,0xBC,0x3E,0xEB,0x07,0x1B,0x45,0xDD,0x0D,0x31,0x07,0x5A,0xFB,0x9D,0xBE, + + 0x7E,0x89,0x94,0x23,0x90,0x0F,0x0B,0x6A,0xA9,0x5C,0x47,0x40,0x73,0xB6,0x77,0x2F, + + 0x78,0xA9,0xF3,0x7D,0x77,0x5B,0x41,0x23,0x28,0x6D,0xAE,0x4D,0xB4,0xE7,0xEB,0x1F, + + 0x9B,0x5F,0xB7,0xDF,0x9C,0x06,0x3A,0x0D,0x35,0x30,0x84,0x61,0x2C,0x37,0x02,0x48, + + 0x20,0x81,0x02,0xFE,0x18,0x04,0x13,0xCA,0x98,0x73,0x8B,0x08,0x1D,0xE3,0x52,0x27, + + 0x2C,0xCD,0x31,0x0D,0x60,0x23,0x22,0x6E,0x2C,0x51,0xE8,0x9C,0x22,0xE6,0x9C,0xC9, + + 0x0E,0xCD,0x69,0xEF,0xC6,0x9D,0x4D,0xD8,0x87,0x49,0x0C,0x87,0x8B,0xA3,0xC7,0x7F, + + 0x0D,0x8B,0xB2,0xC2,0x3A,0x26,0x82,0x94,0x4F,0x4F,0xFD,0x40,0xEF,0xAD,0x64,0x7A, + + 0x98,0xD1,0xDC,0xB7,0x40,0x1F,0xF0,0xFC,0x6A,0xCE,0xED,0xAA,0xD3,0xF1,0x80,0xD0, + + 0xA6,0x45,0xD2,0xAF,0xDC,0x18,0x93,0x36,0x2E,0xD4,0x3C,0xC5,0x56,0x9D,0xC9,0x03, + + 0x58,0xB2,0x36,0xF9,0xDE,0x03,0x48,0x58,0x39,0x8F,0x35,0xAB,0xF2,0x58,0xFA,0x8C, + + 0xA4,0x07,0xF3,0x75,0xB1,0x36,0x10,0xCC,0x7C,0x78,0xDF,0xBB,0xF4,0x9C,0xC0,0xA0, + + 0x53,0x9D,0xB4,0xDF,0x62,0x19,0xD4,0x90,0x04,0xE8,0xA4,0x0C,0x8D,0x5F,0x34,0xB0, + + 0x50,0x91,0xA4,0xC3,0x40,0x19,0xC8,0x90,0x43,0x0A,0xDB,0x09,0x1C,0x8A,0xE5,0x84, + + 0x82,0x6B,0x7E,0x80,0x7C,0xFD,0x0B,0xE4,0x47,0x09,0x08,0x6B,0x26,0x29,0xB2,0x73, + + 0xDC,0x17,0x32,0x05,0xB1,0xCF,0xC2,0xC2,0x46,0x28,0xA8,0x57,0x00,0x97,0x2A,0x91, + + 0x29,0x35,0x15,0x6C,0x54,0x29,0x4E,0xAE,0xD1,0x9A,0x76,0xF2,0x7D,0xFE,0x1C,0xAB, + + 0x2C,0x66,0x3B,0x6D,0x01,0x19,0x06,0x52,0x21,0x05,0x0F,0xBB,0x1E,0x06,0x29,0x7A, + + 0x0F,0xDA,0xD9,0xB7,0x49,0x19,0x23,0x24,0x1B,0xBF,0x97,0xEF,0x5D,0x7D,0x11,0x79, + + 0xC7,0x68,0x38,0x9D,0x07,0xFA,0x93,0x3E,0x38,0xB9,0xC7,0x1F,0xF7,0x1B,0x1D,0x4E, + + 0x2D,0xC4,0xFC,0xEA,0xE2,0xAD,0xCD,0x4F,0x99,0x71,0xA8,0x01,0x3E,0x57,0xC2,0xFE, + + 0xA0,0xDC,0xFA,0xD4,0x9E,0x12,0x40,0x16,0x19,0x9C,0xB8,0x0F,0xC0,0x2D,0xD8,0x97, + + 0x8F,0xDE,0xBD,0xF3,0xC2,0xFC,0xAA,0xD6,0x05,0x9A,0x0A,0x6B,0x95,0x81,0x83,0x5B, + + 0x53,0xBF,0xFA,0x5B,0xF6,0x0B,0xC6,0x7F,0xA7,0x2F,0xAF,0x15,0x04,0x54,0xFD,0x98, + + 0x6B,0x7F,0x8A,0x4D,0x03,0xDA,0xD0,0x01,0x86,0x9F,0xEE,0x23,0xF1,0xDF,0x58,0xFA, + + 0xFA,0xD4,0xD8,0xC9,0x3B,0x22,0xB3,0x77,0x4F,0x9D,0x9B,0x28,0xD1,0x8F,0x85,0xF0, + + 0x3F,0x01,0x0F,0xD5,0xAA,0x21,0xA5,0x43,0xF3,0xA2,0x51,0xF4,0xBA,0x50,0xF2,0x2E, + + 0x7E,0x0D,0x5B,0xB1,0x91,0x03,0xDD,0xFB,0x7A,0xBC,0x09,0x7E,0x2C,0x5F,0x51,0x40, + + 0x04,0x9F,0x7E,0xD1,0xB4,0x8A,0x94,0xB0,0x1C,0xFB,0x07,0x9D,0x72,0xFF,0x58,0x64, + + 0x5B,0x06,0x4C,0x4A,0xF2,0x49,0x23,0x0B,0x62,0x65,0xF0,0xF0,0x56,0xFE,0x05,0xE1, + + 0xAE,0x04,0x01,0x10,0xCC,0x64,0x01,0x5D,0xC4,0xC6,0xD1,0x98,0xD2,0xBD,0x0A,0x44, + + 0xB0,0xA3,0x2C,0xBA,0x72,0x71,0x1E,0x0E,0x4E,0xF1,0x66,0x29,0xF2,0x45,0x6A,0x8E, + + 0xF4,0x49,0x86,0x0D,0xE7,0xD7,0xD2,0x0C,0x1E,0xB5,0xC8,0xD3,0xA7,0xB7,0xF5,0xEB, + + 0x7D,0xA6,0x8A,0xE3,0xE6,0xF6,0x0C,0x5A,0x29,0x33,0xE4,0x8C,0xA8,0x05,0x5D,0x30, + + 0x80,0x81,0x7C,0x0D,0x98,0xD5,0x6B,0x52,0xA0,0x47,0xA4,0xE4,0x39,0xF5,0x9C,0xF1, + + 0x43,0xC6,0x74,0x1C,0x99,0xD4,0xDB,0x1D,0xAC,0x09,0xFD,0xF4,0xDA,0x68,0x98,0x48, + + 0x1A,0xC7,0x3B,0x3E,0x80,0x13,0x5A,0x65,0xB7,0x22,0xD4,0x55,0xB3,0xDD,0xA2,0x7C, + + 0x2F,0xB6,0x4E,0xD8,0x17,0xF9,0x5B,0x07,0x32,0x44,0x33,0xFE,0x52,0x80,0x47,0x0F, + + 0xAE,0x4F,0xF9,0xC7,0x29,0x2A,0x30,0xA9,0x8E,0x4A,0x7F,0xFF,0xD6,0x66,0x3A,0xDD, + + 0xD1,0x59,0x9B,0x8E,0xC3,0xA2,0x59,0x65,0x3D,0xCF,0x81,0x87,0x78,0x6B,0x4C,0x09, + + 0xDC,0x61,0x80,0xEC,0x30,0x30,0xF3,0x4F,0x00,0x80,0x2D,0x3A,0x73,0x40,0xB3,0x03, + + 0x5D,0xCC,0x2B,0xC8,0x11,0xB2,0xE5,0x32,0xA8,0x26,0x21,0xEB,0xA8,0xEC,0xC5,0xDD, + + 0x1D,0x7E,0x07,0x06,0x64,0x8A,0xD5,0x09,0xD9,0x5F,0x3E,0xCB,0x25,0x8E,0x6B,0xAD, + + 0xA2,0xF3,0x8B,0x7D,0x69,0xFE,0x25,0x40,0x42,0xD3,0xB2,0xAD,0x71,0x2F,0x9B,0x40, + + 0x51,0x10,0xC6,0xDB,0x13,0x30,0xAB,0x62,0x67,0x50,0xAB,0x19,0x7A,0x36,0x8C,0x8D, + + 0x69,0xEE,0x03,0x14,0x37,0xC1,0x24,0x8B,0x6D,0x37,0x10,0x96,0x30,0xAA,0x1A,0x94, + + 0x9D,0x21,0xC4,0xBA,0x3F,0x90,0xEE,0x03,0x4E,0xAB,0x13,0xD7,0x70,0x3E,0x4D,0x2D, + + 0x02,0x55,0x02,0xA6,0xDA,0x88,0x17,0x4C,0x61,0x1F,0xA5,0x77,0xF6,0x7E,0xA5,0xB4, + + 0xF4,0xE9,0xA6,0x84,0xB5,0x03,0x24,0x53,0x98,0x57,0x39,0xD7,0xA5,0x39,0x9B,0x9A, + + 0x88,0xB4,0x6C,0x0C,0xF1,0xC0,0x30,0xD6,0x15,0xA6,0x72,0x2E,0x35,0x71,0x21,0xA4, + + 0xD0,0xBA,0x20,0xFA,0x8B,0x8E,0xA0,0x91,0xEE,0x7A,0xA9,0x55,0xD9,0x32,0x18,0x63, + + 0x40,0xCA,0xF7,0xAF,0x4A,0xEE,0x25,0x05,0x64,0x39,0xDF,0x41,0x47,0x80,0x8E,0x09, + + 0x5D,0x69,0x9D,0xCC,0xEF,0x61,0xCB,0x0A,0xE8,0x58,0xEC,0x0E,0xD6,0x73,0x11,0xD8, + + 0x58,0x10,0x0E,0xDD,0xF2,0xC1,0x3C,0xF1,0x6A,0x9D,0xD6,0x79,0xDA,0xF7,0x98,0x49, + + 0x95,0x49,0x6C,0x92,0x07,0xC2,0x71,0x8B,0x15,0x32,0x17,0x3D,0xF2,0x78,0x8F,0x95, + + 0x76,0x5E,0xF0,0x82,0x46,0x51,0xE0,0x3E,0x29,0x40,0x28,0x1F,0x5A,0xF5,0x7E,0xE0, + + 0x58,0x05,0x5F,0x06,0x1C,0xA0,0x32,0xCB,0xF9,0x61,0xEA,0xEB,0x24,0xA2,0x50,0xE1, + + 0x75,0x82,0x57,0xE9,0x15,0x5E,0x80,0xC1,0xC1,0x4C,0xE0,0x13,0xE9,0x62,0x78,0x19, + + 0xE0,0x03,0x5E,0xF8,0x6B,0xA2,0x09,0x12,0x65,0x43,0xA5,0x2D,0x75,0xDB,0x2E,0x1F, + + 0xB6,0xC2,0xA9,0x17,0xDC,0x53,0x6B,0x78,0x2E,0xA7,0xBF,0x87,0xB6,0xE1,0x1A,0x52, + + 0x84,0x80,0x4C,0xD9,0xE9,0x29,0x5C,0x3D,0xB3,0x38,0x0B,0xE2,0x1D,0x4A,0xF3,0x30, + + 0x25,0x68,0x97,0x24,0xC5,0x3A,0x47,0xA2,0x4B,0x6E,0xB2,0x81,0xF4,0xE3,0x9E,0xA1, + + 0x04,0x82,0x02,0xB9,0x77,0x10,0xE1,0x38,0x3B,0x7A,0x91,0x26,0x5A,0xEB,0x2D,0xAA, + + 0xD4,0x1C,0x79,0x18,0x6A,0xDB,0x01,0xF3,0x27,0x38,0xB1,0xE0,0xB4,0xB2,0x9A,0xF5, + + 0x81,0x25,0xAC,0x8B,0x55,0xFA,0xB2,0x3A,0xB4,0x1C,0x27,0xAA,0x74,0xFC,0x74,0x37, + + 0x05,0x24,0xAA,0x0B,0x1D,0xA9,0x7B,0x5C,0xB2,0xCF,0xC8,0x5C,0xEA,0x8C,0x30,0x94, + + 0x67,0x1B,0xAD,0x2A,0x9C,0xAA,0xA6,0x34,0xBC,0xD1,0x88,0xCD,0xDA,0xCB,0xBE,0x5C, + + 0x47,0x1A,0xAB,0x27,0x9D,0xAB,0x15,0x81,0x6C,0xA7,0x83,0xD0,0x50,0x1D,0x62,0xB7, + + 0x1F,0x57,0x4B,0x30,0x8B,0x01,0x12,0x2E,0xCE,0xC1,0x8A,0x4A,0x7E,0x8E,0x0A,0x59, + + 0x0B,0xCD,0x2A,0x5F,0xD6,0x50,0xD5,0x95,0xFA,0x65,0x7D,0x18,0xBD,0xCD,0x43,0xCF, + + 0x8D,0xD6,0xFD,0xB4,0xED,0xAE,0x8A,0x4C,0x6F,0x44,0xA0,0xA9,0xD0,0xF5,0x69,0x60, + + 0xF8,0xFA,0x07,0xCC,0xBE,0xA7,0x03,0x85,0x72,0x37,0xFE,0x97,0x19,0x22,0xDB,0xF8, + + 0xD3,0xD1,0x3F,0xAD,0x49,0x8D,0xCF,0xDD,0x6A,0x2F,0xF4,0x4B,0xE7,0xAB,0x93,0xC9, + + 0x4E,0x9E,0xBF,0x65,0xB1,0x3C,0xC3,0xB0,0x69,0x8D,0x33,0x0E,0x3F,0x6A,0x88,0xF8, + + 0x39,0x2E,0xBD,0xB3,0x5D,0x6A,0x8E,0xC3,0xA4,0x89,0xB0,0xD5,0x0F,0xB0,0xAD,0xE8, + + 0xA3,0xB2,0xFB,0xCE,0x5E,0xD7,0x82,0xFD,0x86,0x03,0x2D,0x33,0xBE,0x97,0x5E,0x3C, + + 0x45,0xCD,0x82,0x1A,0x37,0xD4,0x7C,0xF6,0xE4,0x9C,0x1B,0x04,0xD7,0x7E,0x3E,0x9D, + + 0xCC,0xF1,0x40,0x45,0x6C,0xBF,0xEC,0xB4,0xAC,0xC8,0x83,0x14,0xF5,0xDD,0xF6,0x30, + + 0x22,0x1B,0x42,0x1B,0x92,0x4B,0xE8,0x81,0x9A,0xD9,0x08,0x05,0x57,0x7C,0x55,0x28, + + 0x86,0x26,0x6D,0xC8,0xEC,0xF6,0x2D,0x84,0xBB,0x90,0x59,0x95,0xB4,0x0A,0x11,0x0E, + + 0x08,0x02,0x9E,0x61,0xDF,0xB1,0xA3,0x2E,0x5E,0xE1,0x6D,0xAD,0x03,0xF4,0xEA,0x50, + + 0x96,0x66,0xF4,0x65,0x49,0x16,0x4D,0xD8,0x2D,0xD6,0x69,0x93,0x4E,0xB4,0x8C,0xCC, + + 0xA2,0x46,0x61,0xD0,0x01,0x46,0x8E,0x49,0x6E,0x76,0x77,0x56,0x9F,0xB8,0xEF,0xBF, + + 0xA3,0x66,0x0F,0xED,0xDF,0x17,0xAF,0xEE,0xB0,0x23,0x7F,0xAF,0x47,0xB9,0xCA,0x58, + + 0x6E,0x96,0xDC,0x3D,0x46,0xFE,0x18,0x98,0xE3,0xAA,0x8E,0xCA,0x4D,0x48,0x6C,0xA1, + + 0x4F,0x02,0x91,0x26,0xBE,0x42,0x44,0x71,0xD4,0x50,0x5D,0x1C,0x9F,0x42,0x65,0x33, + + 0xAE,0x9A,0x6E,0xA3,0x81,0xBF,0x8A,0x99,0x78,0x81,0x4D,0x11,0x17,0x07,0x14,0xA1, + + 0xA1,0xFD,0x34,0xDD,0xB9,0x9F,0x1E,0x11,0x1E,0xDC,0x3F,0x3F,0x82,0xBE,0xC0,0x21, + + 0xAC,0x42,0x0C,0x38,0x16,0x61,0x49,0x2D,0xE5,0xFF,0xAB,0x94,0xCC,0xFF,0xCC,0x4E, + + 0x0F,0x1F,0xC6,0x36,0xC0,0xDC,0x01,0x23,0xE2,0xA0,0xDE,0xDC,0xC6,0x2C,0x91,0xD9, + + 0x55,0x6E,0x43,0x67,0x6B,0x60,0x09,0x91,0xC6,0x90,0x4C,0xBD,0xD6,0x9A,0x74,0xEE, + + 0xE2,0x6B,0xA2,0xE5,0x57,0xF2,0x67,0x19,0xF6,0x36,0xEB,0x3D,0xDD,0x2D,0xFB,0xA6, + + 0x26,0xF0,0x13,0xE4,0x30,0xF5,0x30,0x24,0x36,0xC9,0xAF,0xE0,0x19,0xC7,0x16,0xB2, + + 0x07,0xA8,0x19,0xEC,0xF2,0x23,0xD8,0x42,0x23,0x54,0x78,0x06,0x65,0xCA,0x95,0xC5, + + 0xBB,0x4D,0x01,0xED,0x1C,0x64,0x29,0x45,0xA9,0x49,0x6C,0x54,0xA7,0xC9,0x9D,0xD5, + + 0xAB,0xB2,0x64,0x25,0x30,0x65,0x27,0x77,0x2A,0x48,0x7D,0x17,0x2C,0xDC,0x11,0x8C, + + 0x2C,0xCA,0x42,0x28,0xD1,0x25,0xCF,0xA8,0x80,0xA9,0x05,0x08,0x6B,0x36,0x3A,0x56, + + 0xF4,0x55,0x4A,0x38,0x31,0x6B,0x7B,0xC4,0xD5,0x0B,0x76,0xBC,0xA5,0x49,0x3B,0xF2, + + 0x8E,0xA0,0x7C,0xFD,0x9F,0xFB,0x80,0xDA,0xB4,0xB1,0x2B,0x3D,0x7F,0x2B,0x55,0xFB, + + 0x8D,0x76,0x1B,0x9A,0x26,0x7E,0x16,0xB3,0xBE,0x3E,0x37,0x7F,0x5A,0x29,0x7C,0x44, + + 0xA9,0x69,0xD2,0x4C,0x1C,0x7D,0x00,0xC6,0xA1,0x28,0x52,0x68,0x11,0xCF,0x32,0x5C, + + 0xE2,0x6E,0x93,0x8C,0xBE,0x24,0x62,0xA8,0x47,0xB2,0x76,0x3E,0xD8,0x2F,0x7D,0x44, + + 0x29,0xA5,0x01,0xED,0xE2,0x8E,0xC3,0xEB,0x4A,0xF6,0x3F,0xED,0x26,0x4E,0x2B,0x76, + + 0x45,0x4D,0xC9,0x2F,0xA8,0xD8,0xCB,0x66,0x9A,0x01,0x0D,0x9D,0x0B,0xB9,0x2C,0xE6, + + 0x01,0x60,0x67,0xC4,0x24,0x0D,0x2F,0x67,0xAA,0x59,0x31,0xB0,0xF7,0x66,0x2C,0xF6, + + 0x02,0x71,0x35,0x06,0x31,0xEE,0x02,0x52,0x81,0x0A,0x9C,0x76,0xF2,0x37,0xBD,0x11, + + 0x07,0x09,0x7A,0xEA,0x6E,0xCD,0x5D,0x98,0x11,0xF6,0xC5,0x3B,0x0B,0x89,0x54,0xD3, + + 0x06,0x08,0x1D,0xFE,0x8D,0xCC,0x1D,0x80,0xBA,0xAC,0x2A,0x91,0x9A,0x7C,0x9B,0xC1, + + 0xDF,0x78,0x04,0xE0,0x37,0x76,0x6B,0x62,0x40,0x64,0xBC,0x62,0x8E,0x35,0x16,0xE4, + + 0x5F,0x0A,0xF4,0x3B,0xCE,0x77,0x3C,0x50,0x3F,0x5A,0xD6,0xF0,0xD0,0x73,0x23,0xB0, + + 0xA1,0x37,0xD1,0x47,0x05,0x53,0x6B,0xB9,0x41,0xD6,0xB5,0x45,0xAC,0x7B,0xF5,0x2F, + + 0xC0,0xF6,0x5D,0x15,0x58,0x53,0xDD,0x30,0x38,0x83,0x8D,0x6C,0x90,0x57,0x4C,0xEE, + + 0x09,0x09,0xBC,0x20,0xCF,0x54,0xAF,0x19,0xCB,0x87,0x16,0xD7,0x7E,0x59,0x2E,0xFE, + + 0xD6,0xB4,0xC6,0x9D,0x1D,0xE5,0x78,0x64,0x6A,0xDB,0xA6,0x53,0x84,0xD8,0x3D,0x7A, + + 0xC4,0x01,0x38,0x16,0x4D,0xAC,0xA2,0x70,0x55,0x34,0xA0,0xCF,0x4F,0x1F,0x99,0xDE, + + 0x77,0x11,0xB4,0xC3,0x64,0x86,0x45,0x43,0x95,0xF4,0xA7,0x8D,0xBD,0xD4,0xD1,0x22, + + 0x8F,0x70,0x7F,0x2E,0x96,0x41,0x86,0xF7,0x44,0xC8,0xAE,0x6E,0x58,0x8E,0x8A,0x23, + + 0x48,0x96,0x0E,0xFD,0xAB,0x30,0x14,0xBE,0x14,0x1D,0xBE,0x5C,0x2D,0xF0,0xA4,0x37, + + 0x0E,0xF3,0xBF,0x3D,0x50,0x8F,0x05,0xF2,0x80,0x1C,0xEF,0xBD,0xF2,0x71,0xD8,0x2A, + + 0x2F,0x92,0x34,0x2D,0x7A,0xCE,0x9F,0xF8,0x7B,0xAA,0xA7,0x7F,0xFE,0xB5,0xE0,0x23, + + 0x9A,0x5F,0xD8,0x7C,0xFF,0xAF,0xEF,0xA2,0xF8,0xD1,0x66,0x2C,0x89,0x5D,0x83,0x55, + + 0x0B,0x5D,0xD0,0xBA,0xE2,0xE0,0xF8,0x6A,0x96,0x1A,0x1F,0xA9,0x3E,0x57,0x95,0x61, + + 0xB7,0x62,0x93,0x2A,0x6B,0x0F,0x80,0x16,0xBF,0x22,0x1E,0xD6,0x02,0xE2,0xED,0xD9, + + 0x3E,0x7C,0x04,0x68,0x08,0xFF,0x8C,0xCE,0xC7,0xB6,0x3C,0x45,0xD3,0x00,0x66,0x5F, + + 0xEF,0x14,0x18,0xAE,0xC5,0xE9,0x71,0x24,0x06,0xDF,0xD7,0xF9,0x3D,0x52,0x10,0xBA, + + 0xA3,0x48,0x2F,0x29,0x35,0x48,0xAC,0xA2,0xC6,0x4D,0x86,0x45,0x3C,0x60,0x19,0x64, + + 0x6F,0x36,0x1E,0x77,0x69,0xE0,0xB6,0x05,0x07,0xA5,0xF0,0xE3,0xB8,0x9D,0x96,0xA3, + + 0x6D,0x26,0xEF,0x5F,0x32,0xBC,0x09,0x9C,0x3F,0x6E,0x79,0x31,0x45,0x43,0x78,0xCE, + + 0x7C,0xCA,0x19,0x40,0xF5,0xF1,0x23,0x04,0x20,0x73,0x6F,0xDF,0xB4,0xEC,0xCE,0xE1, + + 0xB8,0xCB,0x55,0x6C,0x6F,0x76,0x35,0x51,0x69,0x75,0xDB,0x2D,0x29,0x7D,0xB3,0x2A, + + 0x8A,0xCB,0x0F,0x8A,0x27,0x1B,0x52,0xD3,0x50,0x88,0xED,0x1D,0x9C,0xA6,0xBB,0x40, + + 0xA9,0x90,0x47,0x70,0x43,0xF6,0x84,0x60,0x3D,0x31,0x9D,0x02,0x05,0x40,0xB6,0xCE, + + 0x26,0x98,0x15,0xA8,0x3A,0x07,0xC5,0x17,0x48,0x66,0x7C,0x74,0x96,0xF4,0xFC,0x3C, + + 0x82,0xEF,0xFE,0x65,0xBE,0xF2,0xCF,0x0B,0xB7,0x34,0x12,0xF4,0x7D,0x3B,0xDC,0xA9, + + 0xAA,0x95,0x9B,0x4B,0x67,0xEC,0x4F,0x19,0x25,0xC4,0xD4,0x9E,0x42,0x8E,0x0B,0x75, + + 0xEC,0x80,0x5F,0x3D,0x20,0x52,0xCC,0x06,0xC9,0x65,0x84,0x82,0xDF,0xE1,0xE1,0x72, + + 0xB8,0x31,0x0B,0xA2,0x16,0xB3,0x94,0x52,0x9A,0x03,0x14,0xD4,0x16,0xCC,0xAB,0xAD, + + 0x49,0xD3,0x92,0xFF,0x5D,0xBC,0xB9,0xAF,0x9B,0xD1,0x08,0xD4,0xCA,0x0C,0xB3,0x69, + + 0x01,0x9B,0x75,0xA7,0xC8,0x43,0x4B,0xA4,0x1D,0xDD,0x75,0x86,0x76,0xAD,0x67,0xC9, + + 0xA3,0x21,0xD2,0xE4,0x84,0xD0,0x39,0xAF,0x65,0x1E,0x7D,0x96,0x22,0xAE,0x36,0xEC, + + 0xCD,0xF0,0x9D,0xB8,0x91,0xF5,0x26,0x66,0x6E,0x60,0xAE,0xE3,0xD5,0x79,0x01,0xF6, + + 0xA5,0xBD,0x57,0x98,0xDE,0x6C,0x5B,0xE1,0x49,0x91,0x27,0xA5,0x08,0x6C,0x5A,0x21, + + 0xFA,0x92,0x48,0xB8,0x2B,0xEA,0xC2,0x52,0xE0,0xF6,0x0A,0x63,0xB5,0x50,0xC9,0xB1, + + 0xE6,0x87,0xF5,0x43,0xD7,0x48,0x5B,0x57,0x6B,0xDA,0x20,0xA7,0x16,0x48,0xE2,0xCA, + + 0x64,0x6D,0xDD,0x7E,0xBD,0x09,0x35,0xA8,0xB5,0x99,0xCE,0x89,0xC1,0xF7,0x28,0xAF, + + 0xAD,0xE7,0xFD,0xA1,0xB9,0x66,0x98,0x86,0x6B,0x98,0xAA,0xB4,0xDC,0x26,0xB1,0x0F, + + 0xD4,0x57,0xD9,0x89,0xDF,0x9E,0x9C,0xD4,0x39,0x51,0xED,0x1C,0x84,0xB8,0xBF,0x3B, + + 0xB1,0xC8,0x90,0xAF,0x2F,0x04,0x48,0xD9,0x12,0x50,0xE5,0x6B,0x81,0xE4,0x1E,0x48, + + 0x2F,0xE4,0x19,0xBC,0x5C,0x43,0xC2,0x15,0x68,0xFC,0x76,0x3F,0x8A,0x71,0x66,0x96, + + 0x6D,0x92,0x4E,0xB0,0x49,0x12,0x0E,0x3C,0xC5,0x9F,0x2E,0xEA,0xFD,0x51,0x3D,0xCF, + + 0x0D,0x98,0x1C,0xA0,0xC2,0x11,0x50,0x24,0x5D,0x92,0x08,0x11,0x05,0xFD,0x0F,0x9F, + + 0xD3,0x90,0x4B,0xBD,0x40,0x32,0xB3,0x7F,0xEB,0x15,0x0A,0x9D,0x87,0x40,0x60,0x53, + + 0xBE,0x0D,0xD0,0x9A,0xEB,0xDB,0x70,0x7F,0xE3,0xCB,0x91,0x12,0xBA,0x75,0x6B,0xD0, + + 0x47,0x7D,0x3F,0x30,0x6E,0xDE,0x62,0xC0,0x92,0x4E,0x2A,0x0F,0x2E,0x61,0x16,0xFB, + + 0x79,0x6E,0x81,0xC7,0x13,0x64,0x15,0xC3,0x42,0xBE,0x9B,0x13,0x20,0x72,0x36,0x5E, + + 0xD9,0x88,0xB3,0xEB,0x6A,0x38,0x79,0x6E,0x26,0xEE,0xF1,0xF7,0x57,0x96,0x80,0xF5, + + 0x23,0x46,0xCC,0x46,0xCB,0xD9,0x29,0x06,0x63,0xF4,0xAF,0xE6,0x53,0x9B,0xC8,0x96, + + 0x91,0x06,0x1E,0xBB,0xAE,0xDA,0x73,0xF4,0x7C,0x74,0x48,0x06,0xA8,0xEE,0x97,0x10, + + 0xE9,0x72,0xEE,0x3E,0x65,0x8B,0xE6,0x54,0xC4,0xCC,0xE9,0x45,0x73,0x59,0xAA,0xAA, + + 0xFC,0x07,0x25,0xCE,0x92,0xA7,0xEE,0x44,0xC7,0x1F,0xE2,0x4C,0xD5,0x74,0x02,0x25, + + 0xE3,0x4C,0xE4,0x7A,0xEB,0x95,0xDA,0xCA,0xE4,0xE5,0x02,0x33,0x34,0x73,0xAE,0x7A, + + 0x75,0xF6,0xD3,0x9B,0xFC,0x90,0xCE,0x9D,0x0A,0x45,0x82,0x18,0xB0,0x88,0x39,0xB9, + + 0x19,0xA5,0x2F,0x97,0x9B,0x58,0xDF,0xCB,0x75,0xC6,0x14,0x4B,0xB1,0x8B,0x31,0xA5, + + 0x7E,0x0F,0x93,0x99,0xFA,0x64,0x14,0xC7,0x20,0xB3,0xC3,0x25,0xEA,0xB9,0x2A,0x8A, + + 0x8C,0xF9,0x7F,0xB2,0xE3,0xD3,0xD6,0x79,0x26,0x48,0x85,0x0E,0x31,0x63,0xB5,0x2A, + + 0xFC,0x86,0xC2,0x46,0x12,0x99,0x08,0x88,0xFF,0x42,0x83,0x79,0x8E,0x01,0xD3,0xA1, + + 0x98,0x43,0x53,0x53,0xE4,0xDA,0x6B,0x4D,0x48,0x4A,0x55,0x5F,0x2E,0x61,0x3B,0x65, + + 0x8D,0x1C,0x43,0x32,0xBA,0x5D,0x80,0x7B,0xB4,0x4C,0x1F,0x23,0xD5,0x71,0xFC,0x70, + + 0xCA,0x61,0xCF,0x6C,0xCE,0x7F,0x3E,0x70,0xC3,0xD8,0xBC,0x20,0x0B,0xFB,0xB9,0x63, + + 0xAD,0x9C,0x51,0x89,0xCA,0x73,0x7E,0xB4,0x67,0xB2,0x64,0x30,0x0F,0x60,0x7B,0x87, + + 0x41,0x91,0x5E,0xDB,0xCF,0xF8,0x95,0x52,0x2A,0xF9,0x55,0x18,0xCC,0x69,0x75,0x9C, + + 0x21,0x9D,0xC3,0xAB,0xC6,0x6F,0x13,0x40,0x7D,0x41,0xC4,0xD3,0xF7,0x80,0x24,0xC2, + + 0x23,0x19,0x68,0x86,0xB1,0x9F,0x12,0xA2,0xC3,0x58,0xEA,0xB4,0xAC,0xD9,0x59,0xC8, + + 0xA1,0x11,0x92,0x47,0x2F,0xB8,0xFC,0xB2,0xE0,0xFE,0xE2,0xA4,0xAD,0x8A,0x3F,0xA1, + + 0xF6,0x54,0x27,0xC5,0x6A,0xD0,0x2D,0xA3,0x6E,0x5A,0x59,0x7B,0xF3,0x46,0x45,0xB3, + + 0xC2,0x42,0xB3,0x47,0xB5,0xD4,0x35,0x79,0xE5,0x57,0xE3,0xB0,0x25,0xA8,0x96,0x4F, + + 0x2A,0xED,0x59,0x12,0x07,0xC8,0xFE,0x22,0x4A,0x8E,0x87,0x2E,0xB5,0x77,0xCE,0x2D, + + 0x0A,0x5B,0x3D,0x60,0xEC,0xC2,0x76,0x3E,0x95,0x18,0x30,0x4E,0x7F,0xF9,0x03,0xCE, + + 0x29,0x14,0xBD,0x76,0xBE,0x90,0x68,0x54,0xE8,0x54,0x57,0xBD,0x00,0x7C,0xD9,0xF0, + + 0xAF,0xF8,0x91,0x70,0xE5,0xB6,0xF3,0x39,0x15,0x7B,0xB1,0xBD,0xF9,0x7B,0x5E,0xCD, + + 0x49,0xE3,0x73,0x48,0x54,0xC4,0xD7,0x6C,0x2D,0xDC,0x46,0x9E,0x8D,0x83,0x76,0x6A, + + 0x23,0xCD,0xAF,0x7C,0xED,0x82,0x26,0x7A,0x62,0x39,0xE6,0x2C,0x8C,0x72,0x3F,0x4B, + + 0x22,0x1E,0x99,0xC2,0xA8,0x70,0x37,0xA9,0x44,0xD3,0x47,0x6F,0xD8,0x8C,0x75,0x3B, + + 0xAD,0xAD,0x10,0xDD,0x38,0x31,0x67,0xA9,0xE3,0x50,0xBF,0xB9,0xBC,0xF2,0x1E,0x26, + + 0xE5,0xFF,0xB7,0x82,0x26,0x83,0x1A,0x87,0x07,0xCD,0x08,0xD7,0xF7,0x13,0x60,0x26, + + 0x66,0xF5,0xE0,0x02,0xC8,0x3C,0xF6,0x1D,0x46,0x81,0x98,0x26,0x2A,0xFF,0x9C,0x44, + + 0x4E,0xB8,0x99,0xFD,0x19,0x54,0xBA,0xD8,0x0C,0xE8,0x83,0xD8,0x20,0xED,0xBC,0xF9, + + 0x20,0x8A,0x06,0x49,0x6C,0x7F,0xB6,0x56,0x4A,0xC1,0x62,0x3E,0xD3,0xA9,0x26,0x3D, + + 0xA5,0x0F,0x25,0x35,0x13,0xD5,0x2F,0x67,0x35,0xC4,0x8D,0x99,0x35,0x79,0x3C,0x20, + + 0xA4,0x0E,0xE4,0xA5,0x9B,0xA8,0x42,0xED,0xB8,0x48,0x47,0x94,0x0F,0x52,0x99,0x7F, + + 0x80,0x95,0x9F,0x41,0x77,0x05,0xB1,0xA3,0xD3,0xAA,0xE6,0xE3,0xE4,0x55,0xEE,0x6E, + + 0x78,0x57,0x16,0x24,0x96,0xD6,0x9A,0xF1,0x47,0x04,0x1B,0xAC,0xF3,0x8B,0x61,0x55, + + 0xB1,0x74,0xA5,0x0C,0xCF,0x54,0x85,0x2B,0xC1,0xC4,0x4C,0xAC,0x5D,0x0F,0x6D,0x9F, + + 0x0C,0xAB,0xF3,0xDF,0xBA,0xAF,0x9E,0x29,0xC1,0x0F,0x3D,0x4D,0x31,0xA6,0xE3,0xDB, + + 0x5D,0xC8,0x18,0x50,0xB8,0x27,0x5B,0x34,0x48,0x1E,0xE9,0x2E,0x7F,0xF1,0x72,0xCB, + + 0xEE,0xAB,0x82,0x35,0x3E,0x04,0x1D,0x3D,0x03,0x76,0x2B,0xC3,0x55,0x10,0x91,0x46, + + 0xBF,0x57,0x9C,0x48,0xFF,0x0F,0x0A,0x4D,0xB3,0xC3,0xCD,0xE1,0xAF,0xBA,0x88,0xB6, + + 0x0F,0x00,0x92,0x5C,0xBA,0xEC,0x21,0x78,0x34,0xCE,0x6D,0x81,0xB6,0x85,0xC9,0xB6, + + 0x7F,0xF5,0x34,0xBC,0x12,0x53,0xA8,0x69,0xB1,0xDD,0xFB,0x66,0x37,0x66,0x14,0x5F, + + 0xD2,0x1C,0x07,0xDF,0x63,0x8F,0xA6,0x73,0xCB,0x37,0x28,0x81,0xFB,0x81,0xC0,0x06, + + 0x4A,0x2B,0xDB,0x82,0x7F,0x65,0x98,0xE0,0xE7,0x6D,0xB4,0xD4,0x47,0x66,0xAC,0xD4, + + 0xB7,0x35,0x00,0xD4,0xB6,0xF3,0x3D,0x41,0xAF,0x7A,0x2C,0x71,0x77,0x04,0x5B,0xB0, + + 0xCF,0x17,0x49,0x07,0x48,0x92,0x1F,0x73,0x47,0x5A,0x4F,0x4F,0x47,0xBD,0x23,0x89, + + 0x6D,0x5B,0x7B,0x77,0x5E,0x76,0x5A,0xBB,0x31,0x16,0xB9,0xF0,0x74,0xFD,0x05,0x22, + + 0x6A,0x6B,0x04,0xF9,0x12,0xB2,0x1C,0x20,0xE5,0x90,0x8C,0x64,0x54,0x06,0xF7,0xC8, + + 0x03,0x93,0x8C,0x89,0x80,0x08,0x14,0x90,0x41,0x21,0x9C,0x56,0x2D,0x78,0xA5,0xFF, + + 0x2F,0xD4,0x4A,0x28,0x4B,0xB9,0x1D,0xE4,0x65,0xD9,0xCD,0x37,0x0D,0xF9,0xC7,0x15, + + 0x06,0x1E,0x95,0x55,0x6A,0x88,0xAF,0x77,0xEE,0xD3,0x85,0x75,0x77,0x4E,0x01,0x7B, + + 0xB0,0xF8,0xD8,0xB9,0x57,0x1D,0x91,0x9D,0x07,0x7D,0x09,0x9E,0x78,0x57,0x51,0x67, + + 0x2D,0x97,0xFE,0x00,0xC6,0xA5,0xFE,0x0F,0x30,0x72,0x5C,0x4F,0xB7,0xB9,0xCF,0x01, + + 0x8E,0x4C,0xA6,0x0B,0xD2,0x0C,0x97,0x5A,0x0C,0x5A,0x51,0xDD,0x8A,0x55,0x47,0x1D, + + 0x51,0xDA,0x12,0xD5,0x59,0x3C,0x9A,0x23,0x6A,0xCD,0xE1,0x2D,0xBD,0x76,0x62,0x2A, + + 0x0A,0x33,0x5B,0x2C,0xBC,0x40,0xD1,0x5F,0x93,0x27,0xCE,0x3E,0x22,0xFA,0x08,0x13, + + 0x2C,0xAF,0x8E,0x9E,0x82,0x36,0xBB,0x12,0x4B,0x90,0xB0,0xCE,0xFD,0xF5,0xF1,0xB8, + + 0xC2,0xF2,0x9E,0xBC,0xF1,0xB1,0x77,0x15,0xCC,0x6E,0xA7,0x62,0x5D,0xBE,0x35,0xD4, + + 0xC7,0x7E,0xEB,0x3D,0x9D,0x40,0x69,0x4F,0x10,0x9D,0x43,0x80,0x5C,0xBE,0x5E,0xE2, + + 0x04,0xFD,0x84,0x43,0x91,0x2E,0x30,0xAA,0x41,0x20,0xAA,0xD7,0x3C,0xEB,0x98,0xA6, + + 0x07,0x20,0x3A,0x0B,0xFD,0x8E,0xB4,0xAB,0x40,0xC1,0x8C,0x3E,0xF0,0x0F,0xC1,0x20, + + 0x7B,0x40,0x41,0xB0,0xD7,0xF6,0xA6,0x5C,0xE4,0xBF,0x02,0x14,0xBC,0x20,0x32,0x6B, + + 0x22,0x66,0xBF,0x91,0xFF,0xBB,0xA6,0xAA,0x3E,0x02,0xFB,0x34,0xD0,0xC3,0x94,0xBA, + + 0x8D,0xF9,0x8A,0xBA,0xB1,0x29,0x7D,0x93,0xCE,0x49,0xE8,0xB4,0xA5,0x6B,0xCE,0x2F, + + 0xD9,0xFA,0xB0,0xD6,0x12,0xA2,0xC8,0x0F,0x16,0x4E,0xB8,0x35,0xA6,0x68,0x26,0x3F, + + 0x50,0x0E,0x8B,0x58,0xD3,0x2E,0xFD,0xFF,0x82,0xB9,0x65,0x95,0x8E,0x69,0xF2,0xCB, + + 0x74,0x46,0x72,0xB7,0x3F,0xDA,0x5F,0x6C,0x3D,0x47,0xD3,0x71,0x70,0x26,0x3D,0xEA, + + 0x63,0x07,0xDC,0x03,0x1C,0x66,0xCD,0x28,0x6C,0x93,0x25,0x19,0x5E,0x00,0x99,0x9C, + + 0x2D,0xCE,0x55,0x1C,0x9A,0x27,0x64,0x3E,0xA8,0xCA,0x0C,0x7B,0x9B,0x99,0x83,0x76, + + 0x8E,0x4B,0xE2,0xAD,0x4E,0x95,0x17,0xD9,0x7D,0x9B,0x4B,0x3C,0xB4,0xC7,0xCB,0x38, + + 0x5E,0x96,0x6B,0x22,0xBD,0x69,0x35,0xCA,0x45,0x46,0x93,0x4E,0xFD,0x96,0xEE,0x33, + + 0xD4,0xF3,0xBA,0x68,0x9F,0x0B,0x56,0x74,0xB3,0xD4,0x12,0x39,0xFC,0x20,0xE7,0x27, + + 0x96,0x51,0xED,0xA1,0x57,0x63,0x5A,0x79,0x1B,0x0F,0x20,0x3A,0x59,0x21,0x78,0xD7, + + 0x7D,0x4F,0x1C,0x5C,0x9C,0x0E,0x0B,0x78,0x92,0xF9,0x52,0x1F,0xE9,0xDA,0xF0,0x17, + + 0xE0,0x3E,0xBB,0x1B,0x39,0xD1,0x5F,0x2A,0x3E,0x46,0xDA,0x8E,0xAE,0x74,0xAF,0x04, + + 0x2B,0xE6,0xDE,0xC1,0x4C,0x72,0x2C,0x5B,0xED,0xAD,0x23,0xA5,0xFD,0x7C,0xE7,0xB4, + + 0xAE,0x13,0xD6,0x83,0x4D,0x73,0x67,0xF7,0x98,0xD7,0x5C,0x01,0xCD,0x33,0x03,0x59, + + 0xB8,0x16,0x15,0x11,0x11,0xED,0x72,0x5A,0x15,0xC4,0xFD,0x21,0x9E,0xB8,0xBA,0x90, + + 0x2C,0x1F,0x1D,0x2E,0x44,0x3C,0xF5,0xCB,0x23,0x53,0x4B,0xE8,0x9A,0x07,0xFC,0x33, + + 0x21,0x04,0x44,0x01,0x01,0x76,0xC4,0xA2,0xC3,0x58,0x56,0x60,0x39,0x10,0x4D,0xB6, + + 0xC8,0x5F,0xC4,0x7B,0xD2,0x3A,0xFC,0xB2,0xE0,0xFE,0xBE,0xFC,0x72,0x65,0xFD,0x32, + + 0xA9,0x0D,0x8B,0x35,0x96,0x30,0x2D,0xA3,0x6E,0x5A,0x8C,0xC6,0x17,0x18,0x4C,0xB7, + + 0x48,0x7D,0xAD,0x95,0x05,0x3A,0x35,0x71,0xE5,0x34,0x1D,0xDD,0xF3,0x35,0x6E,0x0C, + + 0x46,0x0C,0xDC,0x48,0x44,0x7A,0x1E,0xDB,0xEA,0x94,0x16,0x6A,0xEA,0x7B,0xB8,0x69, + + 0xC1,0x49,0xD4,0x0A,0x45,0x7B,0xA1,0x5A,0x4D,0x75,0xF6,0x7E,0xFF,0x8C,0x3D,0x7A, + + 0x4C,0xB5,0x17,0xAC,0x19,0xE5,0xAF,0xD7,0x4B,0x3F,0x74,0x56,0x87,0x7A,0xCF,0x2C, + + 0x73,0x18,0x1F,0xCE,0x4C,0x34,0x9E,0xFA,0xF1,0x77,0x0F,0xCE,0x8C,0x17,0xD6,0xD6, + + 0x0C,0xE8,0x8C,0x32,0x99,0x31,0x28,0x2A,0xE9,0x52,0xD9,0x57,0xFD,0xFD,0x91,0xF8, + + 0x2D,0x3D,0xC6,0x76,0xCE,0x32,0x26,0x3A,0xCA,0x1E,0x8E,0xF0,0x6B,0xF6,0x93,0x4D, + + 0xE9,0x52,0x8D,0xD0,0x19,0x38,0xF7,0x2B,0x66,0x50,0x47,0x6F,0xD8,0x6C,0x6E,0xE6, + + 0x8D,0x5D,0x7B,0xA2,0x18,0x7E,0x3F,0xB9,0x45,0xD2,0xEA,0x1F,0x57,0xF4,0x58,0x25, + + 0xFD,0x8F,0xE7,0x8C,0x35,0x42,0x4F,0x5D,0xC9,0x76,0x70,0x07,0xA5,0xA2,0x84,0x81, + + 0x1E,0x8B,0xF1,0xB9,0xB0,0x50,0xBA,0x5D,0x26,0x20,0x41,0x4C,0xF6,0x84,0xB1,0x71, + + 0x3F,0xBF,0xF8,0x40,0x31,0x5D,0x39,0x33,0x90,0x15,0x21,0x91,0xD2,0xC3,0x6A,0xE3, + + 0x9A,0xB2,0x51,0x71,0x1A,0x25,0xAA,0xC0,0x41,0x4E,0x86,0xD5,0x28,0xA1,0x44,0xB3, + + 0x32,0x88,0x19,0x80,0xB4,0xE1,0xF4,0x9F,0xB9,0x85,0x92,0x90,0xD3,0xA4,0x4E,0x3A, + + 0x4E,0x21,0x98,0x76,0x31,0x68,0x7C,0x35,0xC6,0xCB,0x31,0x74,0x3C,0x9F,0x3E,0xC3, + + 0xF5,0xF1,0x93,0xC1,0xB0,0xEA,0xE1,0xA4,0xC4,0x33,0x19,0x77,0xF2,0x4D,0x74,0x07, + + 0x7B,0xD6,0x79,0xD3,0xD4,0xEF,0xB9,0xC6,0x80,0x85,0xF9,0x9F,0xB0,0x6C,0xE2,0x2B, + + 0x9C,0x85,0xE0,0x4E,0x4C,0xAE,0x60,0x7C,0xA7,0xAC,0xA6,0xF0,0x5A,0xA9,0x85,0x60, + + 0xD0,0x35,0xAE,0xFC,0x39,0x24,0x70,0x7E,0xCF,0x05,0x81,0xDC,0xF1,0x54,0x58,0xF9, + + 0xAD,0x5A,0xAF,0x08,0x3D,0x22,0x0B,0xD4,0xE8,0x88,0x41,0xAB,0xF8,0x9B,0x16,0x40, + + 0x8B,0xB3,0xF2,0xB0,0x3A,0xEA,0x83,0x59,0x3E,0xAE,0xC3,0x1B,0x52,0xE9,0xD1,0x63, + + 0x0A,0x14,0x82,0x18,0xBB,0x71,0xA4,0x3B,0x25,0xB8,0x2D,0x88,0x4E,0x67,0x50,0xFF, + + 0xB0,0x26,0x2A,0x12,0xD5,0xA4,0x99,0x81,0x30,0xCD,0xB4,0x98,0x6C,0x05,0x2F,0x6D, + + 0x9A,0xE9,0x9B,0x68,0x63,0xA1,0xF3,0xAD,0x5C,0xCD,0x0C,0x89,0x3F,0xF5,0xE4,0x5B, + + 0xBC,0x4F,0x6F,0xE0,0x93,0xCF,0x13,0xB9,0x49,0x3A,0x03,0x5B,0xEC,0xCA,0xC7,0x79, + + 0xD8,0x67,0x34,0x04,0xBC,0x68,0x36,0xA1,0x27,0xD0,0xD2,0xDB,0x75,0x90,0x1F,0x28, + + 0xA6,0x9F,0x6C,0x46,0x96,0xB7,0x10,0x22,0xEC,0x83,0x70,0x65,0x73,0x5B,0x96,0x3D, + + 0x5C,0x25,0x9D,0xD7,0x34,0xBD,0x19,0x2A,0x6D,0x60,0xE5,0xAF,0xA0,0xB0,0xCD,0xAC, + + 0x81,0x3E,0x89,0xCB,0x14,0xBA,0xB5,0xFC,0x86,0xD3,0x5D,0x33,0xF8,0xD2,0x60,0xD9, + + 0xDA,0xF7,0xDE,0x38,0xC3,0x35,0x0C,0x60,0x67,0x93,0xC4,0x04,0x52,0x7F,0xA0,0x56, + + 0x23,0x5F,0x3C,0x2C,0xCE,0x3C,0x44,0x22,0x3B,0x5D,0xEC,0x14,0x53,0xF3,0xA5,0x13, + + 0x10,0xD4,0xF6,0x3C,0x57,0x35,0x4D,0xB3,0xEE,0xD9,0xC0,0x05,0x5A,0x7D,0xBE,0x23, + + 0x02,0x66,0x69,0x24,0x33,0x23,0x4D,0x11,0x65,0xDF,0xF5,0xC0,0x56,0x28,0xB9,0x65, + + 0xD5,0xE9,0xA5,0xFD,0x1F,0xD6,0x36,0xEE,0xF1,0x93,0x76,0x7F,0x15,0xBF,0x91,0xDD, + + 0xB3,0xC4,0x6E,0x4A,0x7D,0xBD,0x62,0xBA,0xE4,0x7A,0xB8,0xC2,0x59,0xF4,0xDA,0xF9, + + 0x82,0xC5,0xC5,0xFF,0xBF,0x1A,0x37,0xAB,0xE5,0xA6,0x36,0x8F,0xEC,0xBA,0x35,0x99, + + 0x1E,0x10,0x14,0x9B,0xB2,0xBD,0x3F,0x7C,0xEF,0x2E,0xA9,0xDD,0x06,0x76,0x18,0xCC, + + 0xCF,0x1F,0x42,0xB1,0x9D,0x6C,0x06,0x94,0xCD,0xB9,0x96,0xAE,0x92,0xF1,0x95,0x2A, + + 0x82,0x6C,0x8E,0x9F,0xC6,0xB0,0x76,0x4D,0x8E,0xD2,0xF6,0xFB,0xF0,0xF9,0x4A,0x38, + + 0x22,0x93,0x14,0x4F,0x03,0xFF,0xC8,0x09,0xCA,0xD8,0x5B,0x71,0x73,0x08,0x11,0xDD, + + 0x4E,0x1C,0xA5,0x21,0x1C,0xDA,0x1F,0xBB,0x09,0xD2,0xFB,0xB8,0xFC,0xF0,0x90,0x82, + + 0x05,0x5A,0xD9,0x20,0x9F,0x22,0x80,0x52,0xBF,0xCB,0x94,0xC6,0x74,0xFB,0xC2,0xF2, + + 0x83,0x49,0xE0,0x14,0x7A,0xC5,0x4C,0x52,0xB6,0x2D,0x85,0x1A,0x60,0x9A,0x3B,0xE3, + + 0x02,0x4A,0x36,0x04,0x1D,0x2E,0xE9,0x1C,0xC6,0x51,0xB5,0xDC,0x51,0x17,0x29,0x73, + + 0xC2,0xF8,0x8D,0x15,0x12,0x2D,0xDD,0xD3,0x9D,0xB4,0xF8,0xC9,0x4D,0x23,0x19,0xD9, + + 0xA5,0x45,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0xB7,0x22, + + 0xA0,0xF8,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x21,0x01, + + 0x2C,0x0B,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x31,0x75, + + 0x85,0x15,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x7A,0x2F, + + 0xA9,0x82,0x62,0x33,0x3C,0x44,0x93,0xCB,0x4C,0xB0,0xDA,0xD7,0xDA,0x20,0xC6,0x2F, + + 0x76,0x0B,0xAD,0x8A,0x5B,0x8D,0x20,0xC2,0x94,0xD4,0x4A,0x78,0xFA,0x0C,0xF8,0xEB, + + 0xAC,0x48,0xDE,0x12,0x75,0x31,0x36,0x77,0x35,0x96,0x33,0x5F,0x7B,0x6C,0xD0,0xB6, + + 0x8F,0xFB,0x14,0xFF,0x79,0x94,0xB4,0x62,0x3C,0xF7,0xE3,0x39,0x92,0xEA,0x42,0x68, + + 0x5E,0x6C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0xED,0xFC, + + 0x0D,0x87,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x83,0x88, + + 0xA3,0x4F,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x60,0x66, + + 0xAD,0x4F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x5F,0xA4, + + 0xAF,0x12,0x24,0x77,0xBC,0x8D,0x60,0x84,0xE7,0xF7,0x54,0xE8,0xB4,0x7D,0x04,0xA6, + + 0x80,0xBE,0x43,0x64,0x3D,0x3E,0xCE,0xF6,0xCB,0x10,0x0C,0x73,0x98,0x0B,0xB2,0x80, + + 0x2D,0x14,0xFD,0xA1,0x32,0x7A,0xBD,0x07,0xE6,0x98,0x6E,0x82,0x51,0x8D,0x9E,0x82, + + 0x7E,0xE2,0x4D,0x80,0x30,0x35,0xA2,0x80,0x40,0xF2,0xFB,0xD8,0x92,0x77,0x9B,0xD0, + + 0x24,0x9E,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0xCA,0x23, + + 0x50,0x54,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0xB4,0xE5, + + 0x5F,0x97,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xE6,0xB7, + + 0xDC,0xC9,0x0E,0x8B,0x5B,0xB8,0x2E,0x98,0x77,0x1A,0xEF,0xDD,0x6F,0x6E,0x75,0x01, + + 0xD4,0xA8,0x15,0x74,0xE1,0xF6,0x43,0x50,0x32,0x19,0xC4,0xB9,0xDA,0x7F,0xB0,0xB4, + + 0x8C,0x97,0xFF,0xA9,0x59,0x95,0x50,0x17,0xEE,0xDA,0x07,0x2F,0xF9,0x02,0x71,0x9F, + + 0x48,0xC8,0xEF,0xDD,0x07,0x34,0x1D,0x9A,0xEF,0x51,0x97,0xF1,0x18,0x74,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0xA6,0x86, + + 0x6C,0x0B,0x60,0xC6,0x69,0xE1,0xF0,0xF3,0x2E,0x50,0x0F,0xE1,0x8E,0xE8,0xA9,0xEA, + + 0x01,0xB2,0x28,0xF4,0x97,0xE2,0x06,0x4F,0xC8,0x47,0x28,0x71,0xAC,0x17,0x71,0x97, + + 0x88,0xC0,0xC1,0x43,0xEF,0x29,0x42,0x0E,0x6B,0x83,0xB3,0x58,0x0E,0x1D,0x3F,0x97, + + 0x8A,0x2D,0xA3,0x93,0xD5,0x0F,0x3F,0xF3,0xC9,0x4E,0x46,0x13,0x09,0xA7,0xE9,0x47, + + 0x83,0x75,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x31,0x9C, + + 0xA0,0xC4,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0xCD,0xB3, + + 0x96,0x70,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x39,0x63, + + 0xC3,0xC5,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xD2,0x06, + + 0xE5,0x51,0xE4,0xDF,0x57,0x02,0x12,0x3E,0xA5,0x31,0x11,0x29,0xE1,0xE1,0xEA,0x57, + + 0xCC,0xCB,0x05,0x6C,0x61,0x56,0xC5,0x1E,0x4B,0xE9,0x0E,0x3C,0xB2,0xA8,0x7B,0x06, + + 0xC6,0x53,0x33,0x50,0xFD,0xCA,0x21,0xC4,0x41,0xA8,0x31,0xA2,0x25,0xE5,0x65,0x9D, + + 0x8B,0x78,0x91,0xAF,0xBB,0x5F,0x1C,0x7D,0x6F,0x85,0xE2,0x31,0x9B,0x26,0x64,0xC7, + + 0x08,0x24,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0xB5,0x4E, + + 0x09,0x07,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x09,0x6F, + + 0x0B,0xA9,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x9A,0x7F, + + 0x0A,0xA8,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x5A,0x85, + + 0x85,0x01,0xA6,0x64,0xB3,0xE5,0xC2,0x26,0x71,0x76,0x24,0x24,0xA9,0x7F,0x83,0xE8, + + 0xF8,0xD0,0x96,0x74,0x17,0x4E,0x65,0x0D,0x6D,0xB1,0x61,0xB7,0x71,0x09,0x5E,0xF8, + + 0x87,0xBD,0x35,0x05,0x96,0xD2,0x6D,0xA6,0xE0,0xB8,0x8F,0x45,0x68,0x18,0x74,0x9D, + + 0x40,0xFF,0xD2,0x15,0x97,0xD3,0xFD,0x62,0x86,0x92,0x21,0x35,0x28,0x7C,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x44,0x16, + + 0x2F,0x08,0xFC,0x8F,0x9F,0xF9,0xF6,0x6A,0x82,0x9A,0xEC,0xAF,0xDF,0x5C,0xEE,0xD6, + + 0xE9,0x44,0xE4,0x65,0x9E,0xBF,0xC9,0xBF,0x61,0x99,0x22,0xCC,0x4E,0x29,0x7E,0x85, + + 0x49,0x5A,0xC7,0xCE,0x49,0xB7,0xBE,0x38,0xCD,0xBA,0xFF,0x7A,0xF8,0x02,0x57,0xBC, + + 0x50,0x94,0xA3,0xE4,0x1C,0x33,0x71,0x4B,0xEB,0xB1,0x47,0x57,0x29,0x34,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x90,0xE4,0xA8,0x30, + + 0x85,0x31,0x40,0xA1,0x4B,0x24,0x49,0xF3,0xE7,0x25,0xF0,0x26,0xCE,0x6D,0x32,0xF8, + + 0xF0,0x4E,0x5C,0x4A,0x82,0x1E,0xA0,0xCB,0x72,0xF6,0x35,0x5D,0xF2,0xEC,0xA9,0x29, + + 0x05,0xE3,0x87,0x42,0xBE,0xFE,0x29,0xC9,0x03,0x0D,0xDB,0x38,0x90,0x64,0x08,0xF7, + + 0xB2,0x26,0xD4,0x36,0x3E,0xFE,0xD9,0x94,0x73,0x58,0x66,0x4A,0xA2,0x63,0x80,0xE5, + + 0x07,0x02,0x48,0x74,0xF3,0x2B,0x30,0x24,0x05,0xCF,0xD7,0xE0,0x7C,0xEE,0xC0,0xD2, + + 0x0A,0xBA,0x7C,0x44,0xB0,0x23,0x91,0x92,0xC1,0x0D,0x65,0xF6,0x56,0x87,0x4D,0xB2, + + 0x84,0x65,0x75,0xA7,0x10,0x2E,0xD5,0x83,0x40,0x0E,0x0E,0x15,0xD4,0x0C,0x89,0xF4, + + 0x86,0x01,0x41,0x39,0x72,0x28,0x41,0x81,0xBC,0x48,0xE1,0x8A,0x12,0x05,0xF8,0xE0, + + 0xC6,0xC3,0xC7,0xEB,0x2B,0xD0,0x7C,0x4E,0x7B,0xB0,0x4F,0x2D,0x38,0x0E,0x53,0x93, + + 0xEE,0x12,0x75,0xDB,0x2A,0x4C,0x37,0x59,0xE8,0xD6,0x63,0xB8,0x51,0x3F,0x83,0x01, + + 0xEF,0x10,0x3B,0xF3,0x88,0x67,0xD3,0x8C,0x7A,0x4C,0xEE,0x57,0xBA,0x6E,0xEC,0x2F, + + 0xB4,0xA6,0x33,0x82,0x6C,0xA2,0x7B,0x3B,0x6D,0x46,0xE0,0xED,0x95,0x62,0x4E,0x4E, + + 0xAB,0x84,0xA2,0x0D,0x9E,0x21,0xE6,0x98,0xB5,0x43,0x16,0xBC,0x56,0x6F,0x9E,0xD6, + + 0x48,0xB2,0xCE,0xD8,0x35,0x7B,0x10,0xC7,0xE8,0x4B,0xDE,0xF8,0x75,0x15,0xC3,0xAB, + + 0x6B,0x4C,0xC9,0x49,0x39,0xA5,0x33,0xC9,0x76,0x43,0xEB,0x79,0x58,0x26,0x33,0xDB, + + 0x8E,0x56,0x81,0xA6,0x9D,0x4C,0xD3,0xBC,0x6A,0xC7,0x64,0x2F,0xD5,0x0D,0xD4,0xF3, + + 0x49,0x91,0x03,0x75,0x93,0x60,0xC0,0xFE,0x4E,0x8C,0x94,0x20,0x78,0x17,0xAB,0x72, + + 0xC1,0xEE,0x21,0xE8,0x92,0x37,0xE0,0xCE,0x7B,0x3E,0x27,0x11,0x86,0x8C,0xFE,0x7E, + + 0x49,0x3B,0xB7,0xB5,0xA4,0x34,0x7C,0x4A,0xDB,0x85,0x2A,0x94,0x51,0x8D,0x54,0x7A, + + 0x48,0x1C,0xAD,0x0F,0x10,0x35,0x44,0x0A,0x44,0xAC,0x8F,0x35,0x1A,0x08,0x84,0xA2, + + 0x63,0x54,0x94,0xF1,0x91,0x32,0x34,0xA4,0xEA,0x59,0xB4,0xA0,0x2A,0x36,0x34,0x52, + + 0x26,0x94,0xB3,0x36,0xB1,0x1D,0x0C,0xDF,0xC2,0xDF,0x96,0xDE,0x8E,0xD4,0x3D,0xA3, + + 0xE3,0x96,0xC9,0xAB,0x13,0xBC,0x1F,0x1A,0x41,0x50,0x01,0xA8,0xD6,0x34,0x17,0xD0, + + 0x00,0x11,0xF0,0x51,0x9D,0x7F,0xAA,0x13,0x61,0x1F,0xE5,0xC5,0x87,0xD8,0xFE,0x80, + + 0xD5,0x57,0x2B,0xF1,0x9B,0x35,0x17,0xCE,0x5B,0x1D,0x2D,0x1C,0xC6,0xD7,0xE0,0x75, + + 0x35,0x94,0x8C,0xE3,0x78,0x30,0xE6,0xC3,0x96,0x42,0x38,0xCE,0xDA,0x7F,0x97,0x75, + + 0x7D,0xE1,0x78,0x5D,0x1B,0x31,0xB8,0x4F,0xF8,0xA7,0x4E,0x89,0x7A,0x32,0x70,0x1D, + + 0xE2,0xCE,0xF7,0x1F,0x39,0x6D,0x2F,0xCB,0x4E,0x4B,0x93,0xC3,0x58,0xF1,0x4E,0xAF, + + 0x89,0x1A,0xA6,0x88,0x3E,0x31,0x4E,0x18,0x6B,0x53,0x76,0x9E,0x18,0xD4,0x2E,0x98, + + 0x85,0x12,0x46,0xC8,0x9A,0xB7,0x9E,0x28,0x63,0x5B,0x25,0x0C,0x73,0x1B,0x4F,0xEE, + + 0x4B,0x11,0x8D,0x36,0x19,0x38,0xE3,0x19,0xE6,0x51,0xA9,0xEA,0x1B,0x18,0x2F,0x99, + + 0x0D,0x12,0xB0,0x3F,0x39,0x77,0x57,0x7D,0x4A,0xD5,0x20,0x8F,0x00,0xC2,0xBD,0x45, + + 0xC6,0xC3,0x80,0xF5,0xB7,0xB2,0x28,0xA6,0x42,0xA3,0x32,0x5C,0xB7,0xE9,0x12,0xE1, + + 0x76,0x9A,0xD0,0x56,0x5D,0x7C,0xEC,0x6C,0x6B,0x1D,0x21,0x0B,0xBE,0xA5,0x69,0x07, + + 0xE3,0xC1,0x19,0x77,0x14,0x04,0x7E,0x21,0x8C,0xAE,0x31,0xE1,0xA0,0x69,0xC8,0xE5, + + 0x00,0xD2,0x51,0x1F,0x68,0xEC,0x50,0xD8,0xFE,0xC9,0x83,0x87,0x48,0x4C,0x3A,0x43, + + 0xA5,0x82,0x17,0x16,0x17,0xAB,0xF0,0x80,0xE7,0x4C,0x34,0xB6,0x5E,0xE7,0xE8,0xB0, + + 0xA6,0x0D,0x88,0x12,0xDB,0x2E,0x65,0x82,0x4F,0xCA,0xFE,0xF2,0x79,0x9D,0x69,0xC6, + + 0x27,0x0E,0xD9,0x97,0x29,0xA9,0x75,0x81,0x44,0x8E,0xC9,0x73,0x54,0xAE,0x6B,0xB1, + + 0x05,0x8F,0xED,0xB5,0x15,0xA4,0x19,0x37,0xB6,0xC8,0x99,0x33,0x91,0xEA,0x7B,0x85, + + 0xEB,0x93,0xC2,0x0C,0xD2,0xA5,0xCE,0x54,0x56,0xA7,0x16,0x54,0xFF,0x18,0x73,0x84, + + 0xEA,0xC5,0xB4,0xFC,0x9F,0xAD,0x22,0xBE,0x4B,0xAA,0xA6,0x01,0x74,0x32,0x9A,0xED, + + 0x9C,0xC5,0xE9,0x12,0x1E,0xD6,0x53,0x29,0x64,0xC7,0x44,0x3F,0x1B,0x48,0x38,0xF3, + + 0x57,0x40,0x4D,0x7D,0x5C,0x21,0x74,0x39,0x85,0xA7,0xBB,0x04,0xB4,0x70,0xA2,0x28, + + 0x4F,0xAC,0xE4,0x3C,0xBD,0xAA,0x12,0x2E,0x72,0xC3,0x0D,0xCE,0xFF,0x2C,0x7A,0xB8, + + 0xAE,0x05,0xBA,0xC7,0xBC,0xAB,0x40,0x98,0xCD,0x85,0x2E,0x33,0xA2,0x81,0x1B,0x6C, + + 0x2F,0x06,0xB3,0xE6,0x3D,0xA8,0xE3,0xE9,0xCB,0x57,0x93,0x2B,0xC6,0xAC,0x63,0xB9, + + 0x0D,0x87,0xBB,0x52,0x3C,0xA9,0x66,0xFF,0xE1,0x1C,0x3F,0xDF,0x7E,0x2F,0x1E,0x00, + + 0xBD,0x30,0x9C,0xD4,0x77,0x40,0x8B,0x44,0xE6,0xD4,0xCB,0x44,0xF6,0xD8,0xBF,0x7A, + + 0xE2,0xDE,0xD4,0x14,0xB5,0xE7,0xFC,0x17,0x3E,0xD5,0xC4,0x34,0x7C,0x3E,0x5D,0xC5, + + 0xD8,0xDE,0xA7,0x05,0x29,0x7B,0x07,0xC1,0xC5,0x90,0x4D,0xC5,0xB7,0x4D,0x4D,0xDC, + + 0x86,0x9C,0x95,0x47,0xE9,0x33,0x3B,0xF4,0xCB,0x0F,0x85,0x67,0x0E,0xFC,0x2E,0xDF, + + 0x67,0x95,0x65,0xA4,0x75,0x0B,0x89,0x00,0xC7,0x5E,0x58,0x75,0x0B,0xFE,0x57,0x30, + + 0x8B,0x28,0xD4,0x06,0xCC,0xBA,0x36,0x4D,0xC4,0xD8,0xA6,0xD6,0x0F,0xB7,0x1D,0x41, + + 0xA7,0x91,0x9D,0x45,0xB3,0x66,0x0A,0x01,0x4A,0xDB,0x33,0x63,0xD8,0x93,0x15,0x51, + + 0xA6,0x75,0x8D,0x93,0xBF,0xF5,0x37,0x2C,0x44,0xD1,0x29,0xBC,0xF1,0x94,0x46,0x88, + + 0x79,0x95,0xC6,0xC1,0x51,0xB7,0xE2,0xF4,0xFF,0xE7,0xD6,0xEF,0x8B,0xF5,0x7E,0x9E, + + 0x05,0x37,0x84,0x4E,0x61,0x39,0x7B,0x5D,0xEF,0xDD,0xB2,0xC5,0x7B,0x9A,0xE3,0x0D, + + 0x8E,0x9B,0xC7,0x8D,0x22,0xB7,0x6A,0x8C,0x43,0x07,0xFD,0x54,0x5F,0xFC,0x4F,0x99, + + 0x3F,0x96,0xCF,0xD0,0x8C,0xB4,0x8B,0xD9,0xCC,0x99,0xF5,0x3D,0xF4,0xD4,0xD9,0x28, + + 0xAC,0xD4,0x32,0x1E,0xBC,0xF4,0x7E,0x6E,0xCF,0x56,0x42,0x9D,0x03,0x4D,0x16,0x58, + + 0x2A,0x99,0x8E,0x9A,0x27,0xFF,0x34,0x15,0xCC,0xD0,0xD3,0xE7,0xFF,0x90,0x43,0xA9, + + 0xEF,0xBE,0xE1,0x4B,0x90,0x34,0x8C,0x09,0x42,0xD3,0xE5,0xCF,0xF8,0x9D,0x57,0x8B, + + 0x2F,0x90,0x3B,0x0F,0x3D,0xF7,0x35,0x00,0x4C,0xD9,0x6F,0x8D,0xCC,0x0D,0xF8,0xA0, + + 0x58,0x90,0x4F,0x66,0x51,0x00,0x49,0xB4,0xE5,0xBF,0xA8,0x74,0x54,0x6F,0xA4,0x82, + + 0x4B,0x09,0xB0,0x44,0x10,0x2E,0x50,0x74,0x47,0x22,0x25,0xB6,0x3F,0xE0,0x61,0x56, + + 0x45,0x0F,0xF9,0x87,0xB2,0x57,0x2F,0x80,0x4D,0xB4,0x4E,0xCB,0xD6,0x08,0x8D,0xE1, + + 0x89,0x4C,0xE9,0xB5,0xD9,0x2E,0x07,0x76,0x03,0xE1,0xA3,0xD7,0x7D,0xE8,0x20,0x6F, + + 0x14,0x09,0xCA,0x40,0xB1,0xD3,0x68,0x64,0x0A,0x55,0xA8,0x43,0xF1,0xDF,0x70,0xE2, + + 0x29,0x75,0x58,0x2A,0x6F,0xDA,0xDE,0x50,0xE2,0x05,0xF8,0xF0,0x10,0x8F,0x33,0xE8, + + 0x80,0x63,0x3E,0x40,0xED,0xD9,0xEE,0x33,0xCC,0xCC,0xD7,0x98,0xC4,0xBD,0xFD,0x33, + + 0x61,0xA4,0x59,0xA8,0xF2,0x65,0x5F,0x58,0x08,0xA6,0x66,0x87,0x93,0x61,0x52,0x8C, + + 0x47,0x4A,0x88,0x04,0xBB,0x4D,0x5A,0x39,0x4E,0x2B,0x6D,0xCE,0xF4,0xE3,0x32,0x29, + + 0xA8,0x88,0xDA,0x11,0xB8,0xA3,0xB6,0xAA,0x75,0x43,0x65,0xDE,0xDB,0x6A,0x49,0x23, + + 0x75,0xAB,0xD9,0x10,0x3B,0x2C,0xCF,0x2B,0xCE,0xB7,0x15,0xCF,0x74,0xE1,0xD9,0xEA, + + 0x0D,0x86,0xF3,0xFF,0x1B,0x28,0x5B,0x07,0xE7,0xEB,0x0B,0x4F,0x7A,0x6D,0xC0,0x6F, + + 0xAB,0x85,0x0E,0x23,0x98,0x64,0xEF,0xEA,0x43,0x73,0xF2,0xF1,0xF9,0x2D,0xB1,0x7C, + + 0x89,0x29,0x80,0x41,0x3F,0xA0,0x56,0x83,0x4D,0x2E,0xDA,0x7C,0x5B,0x6D,0x48,0x29, + + 0x8E,0x0A,0x05,0x2F,0x65,0xA2,0x93,0xCC,0xD7,0x48,0xD3,0x6D,0xDA,0x6E,0x43,0xA9, + + 0xB1,0x00,0xB5,0x68,0x19,0x2B,0xD6,0x88,0xA7,0x1F,0xDB,0x7D,0xDB,0x6F,0xF9,0x70, + + 0xDB,0xB1,0xFD,0x66,0xB2,0xD3,0x0A,0x24,0x4E,0x3B,0x90,0x19,0x43,0xB6,0x32,0x31, + + 0x49,0xE8,0xF4,0x16,0x34,0x38,0x1A,0x11,0xE1,0x4C,0xDC,0xD6,0x8E,0xF8,0x51,0x05, + + 0x8E,0x7C,0x51,0xE7,0xF3,0xCC,0x6B,0xA6,0x1D,0x5D,0x4F,0xED,0x72,0x07,0x1F,0x6A, + + 0xA7,0x70,0xB7,0x77,0x1D,0x3C,0x8D,0x33,0xE0,0x31,0x17,0x55,0xE4,0x75,0x3A,0xC6, + + 0xC3,0x97,0xC1,0xE1,0x34,0xFE,0x1E,0x1E,0xC1,0xAF,0xD4,0xE4,0x72,0x74,0x34,0xAF, + + 0x00,0x48,0xAE,0xD0,0x30,0xB5,0x25,0x90,0x6B,0xA5,0xDC,0xF4,0x73,0x75,0x65,0x32, + + 0x2E,0xCB,0xC7,0xB6,0xDE,0x5A,0xAA,0x92,0xD2,0xDC,0xD5,0xE5,0xF2,0x76,0xDD,0xA3, + + 0x48,0x06,0xCB,0xE0,0x33,0x09,0x63,0xDD,0xA0,0x48,0xDD,0xF5,0xF3,0x77,0xEA,0xB7, + + 0x0A,0xCD,0xE6,0xC8,0x6F,0xB8,0x2E,0x78,0x93,0x57,0x23,0x28,0xD9,0xA7,0x19,0x70, + + 0x21,0x5B,0x0E,0x7E,0xBB,0x71,0xCA,0x07,0x2A,0x26,0x2B,0x2C,0xD8,0x80,0x90,0xB2, + + 0xDC,0x8F,0xFF,0xAA,0x19,0xB2,0x2F,0x79,0x57,0x18,0x28,0xD1,0x07,0x7C,0x0D,0xCC, + + 0x75,0x18,0x56,0x6D,0xB1,0x34,0x67,0x3B,0xCB,0x59,0xC7,0x10,0x7B,0x0E,0x38,0xE1, + + 0xC1,0x4D,0x06,0x90,0x3B,0x38,0x4E,0xEC,0x36,0xAC,0xD6,0xEC,0x7A,0x7C,0xC2,0xBA, + + 0x68,0xC2,0x40,0x24,0x87,0x86,0x46,0xE0,0x8A,0x82,0xDE,0xFC,0x7B,0x7D,0x39,0xE4, + + 0x28,0x56,0x7E,0x31,0x3A,0xC5,0x69,0xC0,0xA9,0x41,0xD7,0xED,0xFA,0x7E,0x37,0x5B, + + 0xA2,0x40,0x8F,0x30,0x01,0x7D,0x61,0xD4,0xA8,0x40,0xDF,0xFD,0xFB,0x7F,0x72,0x53, + + 0xEF,0xE4,0xE4,0xF6,0x4E,0xE2,0xE4,0xD2,0x87,0x11,0xB8,0x6E,0x14,0xEF,0x78,0x0C, + + 0x79,0x35,0x62,0x64,0xB6,0xA7,0x16,0xC1,0xC9,0x3C,0xDE,0x44,0xAA,0xA1,0xE1,0x13, + + 0x4C,0x76,0x75,0xBB,0x16,0xEA,0x4F,0x25,0x25,0x41,0x8B,0xD8,0xD2,0x68,0xBA,0x09, + + 0xFD,0x0E,0x21,0xDB,0x36,0xA5,0x41,0x22,0xEF,0xC7,0x75,0x57,0xD3,0x6A,0xD4,0xB2, + + 0x2C,0x8B,0xE8,0xB6,0xE9,0xAB,0xB0,0x17,0x1E,0xC7,0xF0,0x66,0x56,0xE4,0xDC,0xA2, + + 0x56,0x8A,0x90,0xD2,0x39,0x50,0xC7,0x20,0x49,0x4F,0xF8,0x76,0x57,0xE5,0xD5,0xB3, + + 0xEC,0x89,0xDB,0xC5,0x16,0x4E,0x49,0x67,0x8E,0x97,0xF1,0x67,0xD6,0xE6,0xDD,0xA3, + + 0xA2,0x88,0x32,0x35,0x91,0x87,0xFF,0xD3,0x66,0x87,0xF9,0x77,0xD7,0xE7,0x5C,0xAB, + + 0xE5,0xAB,0x2A,0xFB,0x7F,0xD9,0x9D,0x58,0xA7,0xEB,0x9D,0xD3,0x3B,0x33,0x7E,0x69, + + 0x2F,0x03,0x92,0xCE,0xD0,0x21,0x04,0x9B,0xC0,0x3F,0x67,0x3F,0x5B,0x8A,0x8F,0x98, + + 0xF1,0x80,0xDB,0x8D,0xBD,0x5B,0x6A,0xBF,0x69,0x35,0x33,0x2B,0xD3,0x02,0x2F,0xE4, + + 0x70,0x0B,0xAA,0xFD,0x3C,0x21,0x73,0x27,0xCB,0xA8,0xCF,0xC3,0x5E,0xA9,0xD6,0xBA, + + 0x0C,0x83,0x35,0x08,0x06,0x77,0x74,0x47,0x85,0x2D,0xF2,0x6E,0x5E,0xEC,0x0A,0x0A, + + 0xF4,0xEB,0x9F,0xDA,0x5C,0x47,0x42,0xAA,0xB8,0xC2,0xFA,0x7E,0x5F,0xED,0xBC,0xCF, + + 0xD0,0x73,0x56,0xB2,0x9C,0x15,0xCE,0xE9,0xC7,0xF1,0xF3,0x6F,0xDE,0xEE,0x90,0xAB, + + 0x8F,0x7E,0x54,0x3F,0xD9,0xAE,0x1B,0x3A,0x34,0xC2,0xFB,0x7F,0xDF,0xEF,0x87,0xBF, + + 0xFC,0x41,0xC4,0xC2,0x0F,0xBF,0x6E,0xBF,0xC7,0xD6,0xF0,0xC4,0x8B,0x79,0x0C,0xD8, + + 0xC4,0x3E,0xD4,0x14,0x30,0x6A,0x44,0xE2,0x29,0xDE,0x09,0x33,0xD4,0x2E,0x06,0xBA, + + 0xEC,0xB1,0xC5,0xC3,0xCB,0x3F,0x65,0x8D,0x45,0x58,0x39,0x47,0xD2,0xF4,0xFD,0x60, + + 0x8B,0x48,0xAF,0x75,0x37,0xFB,0x5D,0x13,0xAF,0x58,0x02,0xCB,0x0A,0xF5,0x5C,0x12, + + 0xDD,0x9B,0x6B,0x57,0x30,0xAD,0x6C,0xF7,0x11,0xB4,0xF4,0xE6,0x76,0xF4,0x66,0xD6, + + 0x84,0x93,0xDA,0xB4,0xB5,0xB1,0xEC,0x8D,0x06,0x95,0xFC,0xF6,0x77,0xF5,0x05,0x82, + + 0x1D,0x9B,0xE5,0xE3,0x34,0xB2,0x55,0xE6,0x99,0x29,0xF5,0xE7,0xF6,0xF6,0x61,0x2D, + + 0x06,0x1D,0x2C,0x35,0x35,0xB3,0x65,0xF6,0x1A,0xDC,0xFD,0xF7,0xF7,0xF7,0x08,0x77, + + 0xDA,0xE3,0x86,0xEC,0x7F,0x46,0x32,0x48,0xEE,0xDB,0x03,0x3F,0xDD,0x01,0x60,0xA4, + + 0x0F,0x29,0x96,0x4E,0x82,0xB6,0x5E,0x1A,0x3D,0x52,0x05,0x48,0x86,0x02,0x34,0x72, + + 0x53,0xD8,0xDF,0x0D,0xD2,0xD9,0xF3,0x5B,0xA0,0xD5,0xEF,0x8A,0xCF,0x3C,0x7D,0xE9, + + 0x46,0xB8,0x97,0xCF,0xB5,0xB4,0xBB,0x59,0x6F,0x93,0xBB,0x3B,0xB3,0x7E,0x19,0x28, + + 0xAC,0xB4,0x54,0xAC,0xBC,0xB8,0xF0,0x68,0x67,0xE3,0xF6,0xEE,0x7E,0xFC,0x16,0x2B, + + 0x43,0xCD,0x31,0xBC,0xBD,0xB9,0xC5,0x08,0x4E,0x3D,0xFE,0xFE,0x7F,0xFD,0x18,0xA9, + + 0xEF,0xDE,0x22,0x2D,0x3C,0xBA,0x4F,0xBB,0xEA,0xD1,0xF7,0xEF,0xFE,0xFE,0xAF,0xAE, + + 0xF7,0x9E,0xAC,0x3D,0x13,0x32,0x1F,0xBA,0x14,0xD2,0xFF,0xFF,0xFF,0xFF,0xA8,0xA4, + + 0xE1,0x06,0x19,0x66,0x53,0x2C,0xDD,0xCD,0x32,0xFB,0x77,0x46,0x91,0xEA,0xA2,0x83, + + 0xA2,0xDA,0x0C,0xFC,0xA3,0x6E,0xC3,0x7B,0x3E,0x0C,0xD2,0xD6,0x39,0x6C,0x2C,0x32, + + 0x23,0x04,0xAB,0x80,0x9E,0xA8,0xEE,0xA5,0x8B,0x97,0x16,0x45,0x80,0x6F,0xA0,0xEC, + + 0x7D,0x78,0x31,0x85,0xB0,0xF3,0xC4,0x89,0xBA,0xBC,0xC4,0x6C,0x7E,0xEE,0x20,0x0E, + + 0x90,0x46,0x88,0x75,0xB3,0xAC,0x74,0x94,0xC2,0xE9,0xB0,0x66,0x47,0x69,0xF0,0xAA, + + 0x13,0x48,0x17,0x01,0x68,0x32,0x44,0x98,0x05,0x0A,0x20,0x0F,0x43,0x2A,0x95,0x3F, + + 0xB1,0x4C,0xE1,0xA7,0xE5,0x22,0x0D,0x50,0xE5,0xE9,0xAE,0x1B,0xE1,0x7E,0x36,0x0E, + + 0x3E,0xFB,0x09,0x85,0xDC,0xDA,0x49,0x68,0xD3,0xE8,0xB9,0x77,0x84,0x6A,0xCB,0xF1, + + 0xF7,0x4A,0xC0,0x6C,0x1E,0xA9,0xD2,0xF9,0xBC,0x93,0x46,0xA5,0xF7,0x73,0xFD,0xFE, + + 0x8C,0xFB,0xFB,0xEC,0x6E,0x66,0x9D,0x4A,0xB2,0x0B,0x22,0xC3,0xD6,0x72,0x4D,0x37, + + 0x69,0x11,0x03,0xED,0xD2,0x31,0xBA,0xD4,0x1E,0x31,0x37,0x4B,0x2F,0x7A,0xE3,0x05, + + 0x0E,0x3B,0xAB,0x98,0xAA,0x3C,0x55,0x07,0xBE,0x97,0x57,0x5B,0x07,0x79,0xE9,0x26, + + 0xDF,0x4E,0xB8,0x5C,0x98,0x28,0x0E,0x1A,0xA1,0x07,0xB2,0x3A,0x2E,0x63,0x8E,0x06, + + 0x05,0x13,0x91,0x5C,0x64,0x35,0x7A,0x04,0xEA,0xB2,0xBA,0x2A,0x27,0x62,0x97,0x3E, + + 0x5F,0x62,0x3C,0xAF,0xE1,0xB4,0x0A,0x6A,0x2D,0x48,0xB3,0x6F,0x85,0x63,0x36,0xDB, + + 0x12,0xAB,0x10,0x5F,0x9D,0x25,0x9F,0xFC,0x88,0xBD,0xBB,0x7F,0xFA,0x62,0x80,0x66, + + 0x57,0x34,0xE4,0x86,0x3B,0x3D,0x07,0xB4,0x89,0xC1,0x95,0xDB,0xD7,0x6B,0x53,0xD8, + + 0x1E,0x91,0x73,0x10,0x51,0x1B,0x64,0x58,0x34,0x1E,0x24,0x4F,0xF3,0x4D,0xDA,0xD5, + + 0xD3,0x16,0xDC,0x83,0x17,0xBF,0x17,0x5E,0x21,0xD8,0x31,0xC3,0x03,0x62,0xCD,0xCC, + + 0xEB,0xC8,0xD4,0x92,0x50,0x7C,0x7D,0xB3,0xBC,0x5E,0x05,0xCF,0x52,0x16,0xFF,0x22, + + 0x8E,0xE9,0xA6,0xBE,0xDB,0x2D,0xF8,0x73,0x45,0x5C,0x9E,0xF9,0x12,0xD4,0x97,0x87, + + 0x5C,0xD9,0xAC,0xD7,0x33,0x38,0x7C,0xF5,0xAB,0x1E,0x23,0x1C,0x7B,0x3A,0x3D,0x45, + + 0xCF,0xDF,0xA7,0xD5,0xB3,0x66,0x53,0xF2,0xC9,0xC7,0x8C,0x79,0x55,0x3B,0x16,0xD3, + + 0xD8,0xB9,0xD5,0xD1,0xBB,0x7F,0x4E,0x82,0x93,0xF6,0xE7,0x1D,0xAF,0x38,0x22,0x75, + + 0x79,0x63,0x87,0x7C,0x39,0x77,0x3C,0x78,0x34,0xD8,0xA9,0x4E,0x4B,0x32,0x40,0xA6, + + 0x2F,0xB0,0xC4,0x81,0x18,0x99,0xE5,0xC8,0x61,0x50,0x4A,0x67,0x4A,0xE1,0x5D,0xFB, + + 0x53,0x58,0xE7,0x8F,0x6E,0x37,0x4E,0x1E,0x4F,0x17,0xF7,0xE3,0x00,0x38,0x7E,0x1D, + + 0xA6,0xAA,0xD2,0x8F,0xBF,0x58,0x5D,0xCA,0x99,0xDA,0xFF,0xF3,0x2B,0x39,0x9B,0xE4, + + 0x2C,0xE4,0xE6,0x3A,0xD3,0x95,0xC9,0x78,0x81,0xCD,0x69,0x1D,0xD9,0x8F,0xD8,0x20, + + 0xAB,0xA6,0x32,0xB6,0x53,0x30,0x07,0xE7,0x8C,0x1F,0x1E,0x38,0x94,0x7B,0x01,0x35, + + 0x7F,0xE5,0xBE,0xBF,0x81,0x2A,0x71,0x94,0x49,0xDA,0xE5,0x12,0x0E,0x71,0xB9,0x34, + + 0xFD,0x5D,0x8A,0x3A,0x52,0x16,0x47,0x28,0x69,0x23,0xD7,0x4A,0x98,0x5F,0x79,0xAD, + + 0xA3,0x9B,0xFA,0xCA,0xB3,0xA4,0xEF,0x53,0x7B,0x30,0x08,0xB8,0x57,0xD0,0x56,0xDB, + + 0x36,0xCD,0x7A,0xF0,0x95,0x01,0x8B,0xB0,0xC5,0x39,0x40,0x44,0x23,0xF3,0x54,0xE5, + + 0x94,0xCD,0xA2,0xEF,0x26,0x29,0x0B,0xD8,0xC2,0x68,0x0E,0x17,0xD6,0xF2,0xD1,0xE0, + + 0xD6,0xCF,0xF0,0xBD,0x7C,0xFA,0x01,0xE3,0x99,0x6C,0x41,0xDF,0xD2,0xAE,0xA0,0xE7, + + 0xF3,0x29,0x69,0xC4,0x9E,0xE4,0x0E,0x1F,0x66,0x86,0x90,0x30,0x74,0xEB,0x52,0xF7, + + 0xF0,0x9E,0xC8,0x2A,0xB6,0xC6,0x46,0x93,0xC8,0x63,0x98,0x20,0x97,0xEA,0x72,0x73, + + 0xC6,0x79,0x21,0x57,0x6E,0xA0,0xF6,0x70,0xE1,0x3F,0x91,0x65,0xFF,0xEB,0x62,0x35, + + 0x74,0x97,0x09,0x57,0x7E,0x8E,0xA1,0x33,0x9B,0x63,0x51,0x48,0x52,0x85,0xE4,0xE2, + + 0x8D,0xC7,0x5A,0x8C,0x9C,0x12,0x21,0xCA,0x04,0x63,0x49,0x26,0xF9,0x17,0x82,0x1F, + + 0x3E,0x89,0x86,0xF8,0xB8,0xA2,0x04,0x02,0xC2,0x4F,0x5D,0xB6,0xF8,0x3F,0x8B,0x8A, + + 0x09,0x6A,0x9B,0xDF,0xC0,0xB1,0x20,0x2A,0x4C,0x9A,0x1F,0xC7,0x85,0xA7,0xD3,0xF3, + + 0xED,0x00,0x2F,0xEF,0xDD,0xE4,0xB9,0x7B,0xC1,0x60,0xF3,0x2E,0x28,0xA4,0xDA,0xB1, + + 0x08,0xEF,0xC4,0x3F,0xBD,0x29,0x2E,0x17,0xCE,0x9C,0x32,0x3B,0xF8,0x61,0xC1,0xDF, + + 0x9C,0xB2,0xF7,0x0F,0x2E,0xA4,0xFF,0x3A,0x43,0x66,0x02,0x96,0xD2,0xA2,0xDD,0x15, + + 0x03,0xEC,0xC5,0xAD,0xAF,0x01,0x4D,0x16,0x41,0x48,0x8D,0x8F,0xED,0x6E,0x94,0xD9, + + 0x16,0x26,0x6E,0x98,0x76,0x96,0xE4,0x76,0x26,0xE4,0x9B,0x7D,0x98,0xE2,0x44,0x80, + + 0x7D,0x9D,0x84,0x6E,0x33,0x3D,0x30,0x59,0x85,0xB3,0x60,0x7D,0xF6,0xF4,0xE8,0x14, + + 0x63,0x97,0x54,0x14,0xB5,0x47,0x07,0xC2,0xE5,0xCE,0xF6,0xAB,0x9E,0x60,0xE1,0x06, + + 0xE7,0x61,0x5D,0x8F,0xD7,0xB9,0x4E,0xDD,0x6B,0x64,0x85,0xC5,0x0B,0x7E,0x0D,0xCB, + + 0x04,0x88,0x95,0x47,0xE9,0xBA,0x67,0xB1,0x77,0xDB,0xAF,0xA7,0x4A,0x7E,0xEB,0x53, + + 0xA4,0x90,0x9D,0xB4,0x0D,0xE0,0xEB,0x80,0x99,0x58,0x8C,0x64,0x77,0x83,0x12,0x33, + + 0x86,0xF6,0xA9,0x31,0xB5,0xB1,0x84,0x76,0x46,0xD5,0x9C,0x56,0x7B,0xFA,0xFD,0xA1, + + 0xE5,0x64,0x19,0xAD,0xDE,0xBB,0x3F,0xFE,0xD5,0xE8,0xCF,0x05,0x73,0xA3,0x8D,0x57, + + 0x0B,0x9A,0xE0,0xB5,0x40,0xB1,0x1D,0xF1,0x92,0xDA,0x9D,0xF5,0x8C,0xFA,0xD4,0x6C, + + 0xAE,0x9C,0xA0,0x67,0x33,0xFA,0x34,0x42,0x82,0x25,0x62,0x40,0xA1,0x85,0x64,0x27, + + 0x23,0xDF,0x94,0x78,0x2D,0x32,0x06,0x6A,0x31,0x78,0x00,0xE0,0xF0,0x9B,0xAC,0xE9, + + 0xA2,0xF8,0x73,0x8D,0x8F,0x22,0xCF,0x29,0x6C,0xD0,0x18,0x51,0xFA,0x99,0x3F,0x67, + + 0x38,0x60,0x87,0x79,0x3F,0xBF,0x07,0x8A,0x4C,0x74,0x14,0x3A,0x6E,0xC4,0x2C,0x57, + + 0xC5,0xD7,0xC6,0x86,0x9F,0x03,0x66,0x9D,0x0C,0xC7,0x22,0x68,0x62,0xFF,0x69,0xFD, + + 0x8E,0x17,0xD1,0xD6,0x98,0xBB,0x1C,0xE2,0x6C,0xAC,0x69,0x9C,0x9C,0x02,0x5F,0xED, + + 0x47,0xD8,0x5C,0x27,0xF7,0xF1,0xB5,0x8D,0x11,0xB0,0x72,0x2F,0x7C,0xFA,0xE8,0x28, + + 0xC6,0x84,0xCF,0x92,0x1E,0x60,0xC0,0xBC,0x25,0x76,0x9F,0xFD,0x8B,0xF2,0x9F,0xE0, + + 0x58,0x0D,0xCA,0x19,0x78,0x2D,0x49,0xA9,0xA9,0x31,0x80,0xA6,0xD0,0x8B,0x4C,0x04, + + 0xA0,0x6D,0x70,0x96,0x91,0x25,0xD8,0x55,0xBA,0x03,0xE0,0x56,0xDC,0xE7,0xC5,0x87, + + 0x8A,0x01,0x97,0x67,0xA3,0x83,0xE9,0xA5,0x8C,0x4E,0xA9,0xA7,0x45,0x38,0xCD,0x94, + + 0x07,0xE3,0xB1,0x97,0x58,0x74,0x90,0x84,0xC7,0x2A,0x18,0xF5,0xDD,0xE8,0x6E,0xBA, + + 0xA1,0x1F,0xC4,0xAC,0x9A,0xAF,0xD1,0x47,0xE3,0x4D,0xA8,0x99,0x74,0x26,0x11,0xC0, + + 0xA4,0x15,0xE8,0x68,0xB0,0x67,0x02,0x71,0xE0,0x04,0xDA,0xF6,0x56,0x87,0x81,0xA7, + + 0x92,0x49,0x45,0xA3,0x73,0x20,0xD3,0xE3,0x5B,0xCF,0x1D,0x0A,0xD4,0xAC,0xB1,0xD3, + + 0x4A,0x70,0xD0,0x55,0xB7,0xAA,0x39,0x73,0xB6,0x4A,0xE1,0x8A,0x5E,0x05,0x62,0x0A, + + 0x2E,0x05,0xFA,0x6E,0x95,0xAE,0xBC,0x0E,0x4E,0xC5,0x88,0xCE,0x2F,0x74,0x74,0x35, + + 0x8B,0x0D,0x75,0xFE,0x2A,0x5B,0xE5,0xD0,0x17,0x04,0xA0,0xC7,0x5F,0xC3,0x7D,0x25, + + 0x24,0x07,0x02,0xCD,0x94,0xA1,0xC7,0xC1,0x40,0x82,0x4C,0x42,0x64,0x43,0xD2,0x7B, + + 0xBA,0x19,0x33,0xAF,0x66,0x4B,0xE0,0x6B,0xE7,0x28,0x28,0xBF,0x59,0xE5,0x3A,0xB4, + + 0x9B,0xF7,0xA2,0x4F,0x1A,0x23,0x42,0x1F,0x63,0x0E,0xC2,0x0E,0xFB,0x6A,0x35,0xB5, + + 0xCD,0x4F,0x35,0xBE,0x1D,0xE4,0x9A,0x79,0x35,0xF6,0xA5,0x9E,0x5D,0xA4,0xC0,0xA1, + + 0xE2,0x43,0xA3,0x4E,0x8F,0xA5,0x87,0x56,0xBD,0x43,0xDF,0x16,0x7B,0xE4,0x05,0x67, + + 0xFC,0xE3,0x0A,0xD9,0xBE,0x88,0x2E,0x84,0xC9,0x94,0xD4,0x02,0x38,0x66,0x91,0x1F, + + 0x21,0x50,0x95,0x66,0x9C,0x9D,0xD4,0x71,0x99,0x12,0xCC,0x2C,0x8D,0xF7,0x15,0xF2, + + 0xD6,0x17,0x1D,0x76,0x9D,0x9C,0xC0,0x32,0xE1,0xCA,0xFC,0xB6,0x01,0x7C,0xAD,0x80, + + 0x22,0x16,0x90,0x67,0x1C,0x9F,0x5B,0x75,0xC2,0x22,0xB4,0xA1,0x1B,0x19,0x2D,0xE4, + + 0x00,0xAC,0x18,0x77,0x91,0x83,0x25,0xE3,0xEF,0x31,0xEF,0xA2,0xED,0x68,0x4C,0xD4, + + 0x41,0x2B,0xC7,0x02,0x82,0x32,0xAB,0x10,0x60,0xA5,0x3C,0xF9,0xF2,0xD5,0x8C,0x75, + + 0xFB,0x97,0xB4,0x92,0xC7,0x7B,0xE9,0x03,0xEF,0x58,0x03,0xBC,0x04,0x71,0x53,0xED, + + 0x49,0x47,0xCD,0x23,0xD1,0x16,0x2B,0xE7,0x03,0xD5,0x8A,0x3D,0x81,0x76,0x35,0x55, + + 0x8D,0xA3,0x78,0x13,0x43,0x31,0xA6,0x01,0xAE,0xA6,0x1D,0x35,0xE6,0x71,0xBD,0x7B, + + 0x18,0xA5,0x02,0xFF,0x0C,0x37,0x5C,0xAD,0x5B,0xCA,0xDA,0x5C,0x7C,0x37,0x8C,0x38, + + 0x21,0x79,0x71,0x18,0x7A,0x9F,0x47,0x8C,0xCE,0x14,0x2A,0x5E,0x4A,0x9B,0x79,0xA0, + + 0x8A,0x6A,0x47,0xD1,0x7E,0xB7,0xEF,0xCB,0xAB,0xA9,0xCD,0xA6,0x5B,0xF5,0x5F,0x84, + + 0xF9,0x1D,0xB5,0x75,0x25,0xF4,0x41,0x5B,0xE5,0xDE,0x27,0x42,0x7B,0xD7,0x1E,0xDC, + + 0xA8,0xB0,0xCA,0xD9,0x59,0xFC,0x28,0xEE,0x8B,0xDF,0xF2,0xF8,0x7C,0xFC,0x48,0xE0, + + 0xAB,0x13,0xB6,0x5E,0x32,0x9D,0xC5,0x18,0x2B,0xAD,0x1E,0xEC,0x40,0x7B,0xB2,0xAB, + + 0xEA,0x11,0xBF,0x4F,0xB3,0xFE,0x77,0x1A,0x66,0x53,0xE0,0x6F,0x72,0x3E,0x2F,0x86, + + 0x4A,0xB2,0x95,0xC0,0x18,0x39,0xA8,0x53,0x4E,0xA8,0xFB,0xE9,0xFD,0xFF,0xD8,0x25, + + 0xA5,0x9B,0xFA,0xF8,0xB3,0xE2,0x7A,0x60,0x19,0x48,0x88,0xA4,0xC5,0xB5,0x90,0xED, + + 0xEC,0xD0,0x9E,0x92,0x5E,0x9E,0x8F,0x4F,0x43,0x6B,0x38,0x44,0xF6,0x4A,0xE4,0xE5, + + 0xB7,0x90,0x2A,0x96,0x92,0x90,0x61,0xCC,0x3C,0x6B,0xC9,0x45,0x36,0x1D,0x85,0x8C, + + 0x84,0x01,0x69,0xAB,0x39,0xB8,0x05,0x41,0xE5,0x73,0x65,0x3C,0x34,0xF8,0xBF,0xA8, + + 0x39,0x94,0x48,0x79,0x94,0x8C,0xC5,0xE6,0x05,0x2E,0x8D,0xE4,0xDE,0xBC,0xDB,0x20, + + 0xEC,0x14,0x90,0xD4,0x14,0x41,0x58,0x27,0xE6,0xCE,0xED,0xF0,0x5F,0xA9,0x3E,0x47, + + 0x80,0x2C,0x5D,0x25,0xD7,0xE6,0xCE,0x83,0x81,0xC0,0x4E,0x85,0xD0,0xAE,0x57,0x6B, + + 0x0A,0x21,0xB3,0x47,0x34,0xA1,0x7F,0x83,0xCE,0xC8,0x7E,0xF5,0x57,0x3E,0x1C,0x27, + + 0xD2,0x80,0xE3,0x68,0xE3,0xAE,0xB4,0xD9,0x4F,0xBD,0xFE,0xC8,0xDE,0xF4,0xD5,0x69, + + 0x39,0xE7,0x4D,0xF6,0x35,0xE6,0x44,0xFA,0xF1,0x60,0xA9,0x5C,0xA2,0x66,0xA4,0xE3, + + 0x92,0xC7,0x8D,0x70,0x3D,0xC6,0x2D,0xD0,0x4C,0x0A,0x0A,0xCD,0x5E,0xEE,0xCC,0xDB, + + 0xC5,0x26,0xCB,0x1D,0xBF,0x06,0x0C,0x46,0x31,0x32,0x40,0x18,0x7C,0x32,0x7C,0x8A, + + 0x36,0x07,0xAA,0x58,0xBD,0xAA,0x52,0x73,0xCC,0xB9,0xCA,0xCE,0xB3,0x64,0xD2,0x1D, + + 0x01,0x22,0x5E,0x4E,0xBC,0xEF,0x5A,0x2F,0xEE,0xA1,0xA5,0xD5,0x59,0x67,0xF5,0x7A, + + 0xFE,0x91,0x6B,0xE3,0x7F,0xA1,0x33,0x09,0x31,0xC8,0x28,0x6D,0xA1,0x06,0xFA,0x1C, + + 0x4D,0x6F,0xF5,0x61,0xF4,0xB8,0x9C,0x3B,0xE3,0x42,0x35,0x00,0xFE,0x6F,0x04,0xF3, + + 0x85,0x3F,0xFD,0x95,0xD3,0xA0,0x6A,0x40,0x2C,0x54,0xC7,0x44,0x47,0xE2,0xB9,0xD4, + + 0x79,0x6A,0xF5,0x91,0xD2,0xAA,0x5C,0xB0,0x12,0xDC,0x5F,0x76,0x35,0x2C,0xB4,0xA4, + + 0x05,0x3D,0x5F,0x6F,0x30,0x7D,0x55,0xF0,0x4F,0xDD,0x0D,0x59,0x09,0x9E,0x37,0x6F, + + 0xA5,0xD1,0x88,0x61,0x30,0xA1,0xC2,0xE1,0xA6,0x23,0xC5,0xB5,0xA9,0xE8,0x75,0x20, + + 0x8A,0x39,0xE8,0xD6,0x95,0xF4,0x05,0x6F,0x11,0xD0,0x92,0xA1,0x70,0x74,0x84,0xED, + + 0xA5,0x91,0x37,0xC6,0x31,0xFF,0x23,0x72,0x14,0xA0,0x7B,0x56,0x7F,0x65,0x70,0x21, + + 0x23,0x16,0xE9,0x11,0xC9,0xB6,0xAA,0xB6,0xD9,0xE1,0x27,0x87,0xF2,0xB8,0xE6,0xB1, + + 0x66,0xF5,0x86,0x55,0xB6,0xD0,0xBD,0xAE,0xAD,0xD4,0xED,0xEA,0xEF,0xF1,0xEA,0xDF, + + 0x1F,0x08,0x0E,0x16,0xBE,0xBC,0x6F,0x2A,0xCB,0x95,0x73,0xC8,0x83,0xFE,0x10,0xB3, + + 0x8A,0x82,0x54,0xE8,0xB0,0x3F,0xBA,0x4A,0x25,0x96,0x59,0xFE,0x71,0x04,0x19,0xA3, + + 0x0B,0x8A,0x7D,0xED,0x8F,0x5E,0x9B,0x39,0xA4,0xD0,0x99,0x15,0x5D,0x96,0xE9,0xE8, + + 0x99,0xD4,0xAE,0x5F,0xB9,0x70,0x5F,0xB9,0x9A,0xD6,0xFD,0x5D,0x1C,0xFD,0xA2,0x1A, + + 0x22,0x9F,0xBC,0xCF,0x9D,0xBA,0x76,0x72,0xEE,0xAC,0xD6,0xAE,0x1D,0x03,0x43,0xAA, + + 0x8C,0x9B,0x91,0x3C,0xBD,0x95,0x26,0xFF,0x0C,0xF5,0x3E,0x8B,0x61,0xBC,0x5F,0x5A, + + 0x4F,0x98,0xEB,0xB1,0x1F,0x34,0x17,0xE9,0xA3,0xD3,0x8F,0xEB,0xCF,0xFE,0x4F,0x19, + + 0x0E,0x96,0xD0,0xBD,0xFE,0xFF,0x07,0x3D,0xF9,0x93,0xFF,0xFF,0x07,0x71,0xAD,0x7F, + + 0x9D,0x1B,0x53,0xF7,0x68,0x84,0x4B,0x6E,0x3B,0x3A,0x50,0xA1,0xB8,0x68,0xB5,0x21, + + 0xA0,0xA0,0x64,0x87,0x46,0x2B,0xE5,0xCD,0x43,0x9A,0xC1,0xC9,0x97,0x73,0x4E,0x85, + + 0xC0,0xBB,0xCE,0x29,0x79,0x73,0x07,0x43,0xA8,0x4F,0xC5,0xE2,0x39,0x21,0x31,0x21, + + 0x9E,0xAC,0x00,0x66,0xE5,0x82,0xAC,0xB5,0x9C,0xE1,0x23,0xB1,0xD7,0x58,0x66,0x99, + + 0x36,0xA9,0xB6,0x37,0x2A,0x2B,0x45,0x41,0xEF,0xF9,0xD6,0x4C,0x7A,0xD3,0x00,0xA1, + + 0x60,0x9A,0xDE,0x36,0xEC,0x88,0x62,0x83,0x33,0xF7,0xBE,0x84,0xB8,0x14,0xD0,0x86, + + 0x48,0xDC,0xDD,0x47,0x7B,0xF5,0x09,0x65,0xEB,0x86,0x88,0x67,0x77,0x0A,0x5F,0x6D, + + 0x68,0x43,0x9E,0xF0,0x64,0x49,0x99,0xF4,0xF4,0x4A,0x80,0x81,0x76,0xB8,0xA2,0x7A, + + 0x6A,0x54,0xBA,0xF3,0xF1,0x99,0xC9,0x63,0x37,0xC4,0x9A,0x39,0x6B,0xB3,0x3D,0x09, + + 0x6A,0x48,0x4E,0x15,0x18,0xE9,0xDA,0xC9,0x45,0xC4,0x4A,0x4F,0x29,0x07,0x7D,0x0E, + + 0x8E,0x8A,0x43,0x89,0xEC,0x68,0x48,0x62,0xB3,0xA3,0x21,0x8C,0xC8,0xAF,0x55,0xB4, + + 0x89,0xAF,0xAD,0xA8,0xB3,0x8F,0x65,0x11,0x20,0x5A,0xF9,0x34,0xD8,0xDB,0x18,0xF7, + + 0x60,0xBD,0xFC,0xE8,0xC4,0xF1,0xAD,0xAF,0x80,0xDD,0xD3,0x0A,0xA5,0x00,0xDC,0x28, + + 0x57,0x04,0x48,0xDE,0x8A,0x78,0x7D,0x4D,0xB2,0x46,0x39,0x82,0xD4,0x90,0x3D,0x4E, + + 0x2B,0xA1,0x03,0xC9,0xA1,0x26,0x5B,0x79,0x16,0xDF,0xE9,0xF2,0x25,0xE3,0x81,0x2A, + + 0xE7,0x80,0xF3,0xBD,0xF3,0x6D,0xE0,0x8A,0xB7,0xEB,0xBD,0xC1,0x32,0xDC,0x0F,0x6C, + + 0x9C,0xAB,0xD6,0x3D,0xDB,0xB3,0x2A,0x88,0x08,0x5D,0x6B,0xD7,0x40,0x1C,0x4C,0x6C, + + 0x9F,0x53,0x58,0x85,0x41,0x91,0x62,0xB6,0x80,0xD2,0xBE,0x45,0xD2,0xF1,0x5D,0x79, + + 0x6C,0xE9,0xBB,0x20,0xC2,0x9D,0x03,0xC3,0x80,0x27,0x72,0xE5,0xF4,0x5B,0x06,0x50, + + 0xD6,0xE4,0x1C,0x84,0xC5,0x9E,0x34,0x42,0x6D,0x11,0xA3,0x9D,0xF7,0x31,0x3C,0xC2, + + 0x62,0xB4,0xFF,0x5A,0x33,0xA7,0x32,0xDD,0x63,0x14,0x65,0x86,0x51,0xB6,0x5F,0xA9, + + 0x00,0x17,0x0C,0x51,0xA9,0x93,0x49,0x8F,0x36,0x5C,0xDE,0x16,0xFC,0xF3,0x56,0xC3, + + 0x75,0xBB,0xFF,0x2D,0x36,0xF9,0x49,0xE3,0x2A,0xDD,0xB5,0xAA,0xDF,0x7B,0x17,0x47, + + 0xDB,0x55,0x1C,0xA6,0x89,0x75,0x5C,0x75,0xED,0xF0,0x59,0xB5,0xF1,0x6C,0xD9,0x72, + + 0x94,0x21,0x15,0x6C,0x96,0x98,0xD6,0x9B,0x97,0x43,0xE9,0x28,0x7E,0xDD,0xCE,0xC5, + + 0x5B,0x62,0x9B,0x9D,0x8C,0x7B,0x20,0x61,0x00,0x83,0x9C,0x9F,0x98,0xD6,0xB6,0xE1, + + 0xD3,0xE5,0x90,0x8F,0x44,0x9A,0x58,0x2D,0xA8,0x7F,0x68,0x45,0xA3,0x38,0x5A,0x68, + + 0xE8,0x38,0x4F,0x79,0xB8,0x11,0x47,0xB0,0x00,0xA1,0xCB,0x4E,0xDF,0xC4,0x82,0xF3, + + 0xC3,0xFD,0x02,0xFF,0x39,0xCC,0x6E,0x1B,0x52,0xFE,0xF0,0x18,0x66,0x6C,0x14,0xD9, + + 0x88,0xAD,0x9D,0xAF,0x05,0x7F,0x9E,0x7D,0xE2,0x55,0xFE,0xED,0x9A,0x7B,0x3F,0x4D, + + 0xA4,0x45,0x6B,0xBE,0x9C,0x98,0x0D,0x6D,0xEC,0xD7,0x0D,0x47,0x7D,0xEC,0x71,0xE5, + + 0xC3,0x12,0x0F,0x34,0xB8,0x5F,0x5D,0xE7,0xC1,0xAB,0x72,0x98,0x58,0x7E,0x69,0xBA, + + 0x37,0xAA,0xF1,0xA2,0x12,0xC2,0x9C,0xCA,0xD8,0x06,0xE9,0x29,0xB1,0x66,0xA1,0x74, + + 0xEE,0xF2,0x90,0x27,0x27,0x5E,0x02,0xC1,0x6F,0x6E,0xFB,0x33,0x53,0x9A,0x99,0xE3, + + 0x9C,0x99,0x6D,0x65,0x63,0xC7,0x39,0x27,0xEC,0x95,0x31,0xE7,0x90,0xE1,0x28,0x75, + + 0x6E,0x10,0x97,0xA2,0xE3,0x7C,0xE9,0xC0,0xA3,0x6C,0xAC,0x08,0xE5,0xE7,0x78,0xEE, + + 0xE7,0x2B,0x20,0xA2,0x17,0x64,0x63,0xC2,0x40,0x86,0x30,0xE3,0xBE,0xEC,0x0F,0x92, + + 0x55,0x0E,0xF0,0xDA,0x37,0x37,0x2C,0x4F,0x8F,0x86,0x9E,0x86,0x56,0x25,0x72,0x30, + + 0xF6,0xEA,0x81,0x0D,0x22,0xAB,0xA9,0x23,0x82,0x62,0xA7,0x14,0xEA,0x88,0x8B,0x62, + + 0xF7,0xC5,0x25,0x24,0xE5,0x06,0x29,0x83,0x01,0x66,0x99,0x3D,0x63,0xEA,0x7B,0xE7, + + 0xA9,0x27,0x76,0x9D,0xBD,0x17,0x64,0xD9,0x2E,0x67,0x32,0xD3,0x00,0xAA,0xF9,0x09, + + 0x3C,0x21,0xD4,0xAA,0xF4,0x0A,0x2B,0xBE,0x43,0x1B,0xBE,0xA0,0xBC,0x46,0x74,0x03, + + 0x29,0x25,0xD8,0x7C,0xFA,0x5B,0xE7,0xD8,0xBC,0x67,0xBA,0x80,0x94,0xFB,0x0D,0x72, + + 0xC8,0xF0,0x78,0xEC,0xF7,0x06,0x01,0xD9,0x61,0xC4,0xAA,0xD7,0x5D,0xA6,0xA6,0x71, + + 0xAF,0x25,0x31,0xB1,0xF7,0xDF,0xE4,0xEE,0x40,0x79,0xAA,0xEA,0xB7,0x67,0x5C,0x6B, + + 0x7F,0xCF,0x2A,0x2E,0xBE,0x32,0xBE,0xE6,0x49,0x4F,0x6B,0x8E,0xDF,0xFB,0xF5,0xAB, + + 0xDE,0x05,0xB5,0xF6,0x69,0xEC,0x4B,0x98,0xA2,0x8C,0xE1,0x6E,0xD8,0x8C,0xAF,0xA2, + + 0x2E,0x0F,0x5F,0x3D,0x10,0x59,0xFB,0xE8,0xED,0x12,0xF3,0xE7,0x5D,0xF3,0x13,0xEB, + + 0xD4,0x89,0x9E,0x79,0xC3,0x0F,0x2A,0xC2,0x47,0xB0,0x92,0x7B,0x4C,0x5D,0xEC,0xCB, + + 0x44,0xD3,0xFA,0xBD,0x57,0xA4,0xF3,0x9B,0x8C,0xE0,0xB4,0xB2,0x7C,0x95,0xFA,0xDB, + + 0xD3,0xE7,0xDE,0xA8,0xD2,0xE7,0xF5,0x4E,0xDC,0x76,0xA0,0x60,0x3E,0xFB,0xE9,0xD6, + + 0xA4,0x53,0x79,0x50,0xB3,0x33,0xD1,0x20,0xC4,0xD9,0x83,0x9E,0x3D,0x5A,0x9B,0xB1, + + 0x5E,0xF7,0xF4,0x5E,0x6C,0xF6,0xA4,0x91,0x5E,0x96,0xB7,0x6A,0x01,0xA8,0xAC,0x57, + + 0x3F,0x9D,0xC0,0x96,0x77,0x61,0x04,0xD5,0x8E,0x96,0xA3,0x76,0x04,0x80,0x9E,0x47, + + 0xA8,0xFC,0x25,0xB7,0xB0,0xD4,0xB5,0x97,0x0F,0xF5,0x2A,0x2A,0xC9,0x65,0xEF,0xC0, + + 0xC9,0xB4,0xB9,0xC8,0x91,0x1A,0x05,0xCC,0xDF,0x95,0x3D,0xAA,0xBD,0x2C,0x7F,0x9D, + + 0xC9,0x83,0xB6,0xCE,0x4A,0xA3,0xAF,0xD9,0x54,0x7C,0xCE,0x9C,0x83,0x2D,0x74,0x72, + + 0xAD,0xD4,0x6E,0x1B,0xA7,0xA2,0x46,0x42,0x6D,0x78,0xBE,0x83,0x96,0x28,0x02,0x7D, + + 0x4D,0x35,0x85,0xF9,0x9D,0x0A,0x29,0x49,0x0C,0x0F,0xCF,0xDC,0xA7,0xA1,0x77,0x9F, + + 0x84,0x1F,0x70,0x09,0xAF,0x76,0x70,0x48,0x99,0x46,0x06,0x03,0x16,0x4A,0x40,0x62, + + 0x08,0x3C,0xBC,0x4A,0x38,0x75,0x2E,0xEA,0x87,0x3D,0xDB,0x13,0x13,0x67,0xFD,0x3A, + + 0x2B,0x3D,0xD0,0x7A,0x9C,0x48,0xE9,0x18,0xC3,0x70,0xA0,0xFB,0xF7,0x58,0xF6,0xDA, + + 0xDA,0x33,0xD9,0x6E,0x1D,0xDB,0xB7,0x6E,0xB8,0x73,0xDA,0x16,0x3F,0xBC,0x78,0x9A, + + 0xA3,0x3F,0xB5,0x5B,0x9C,0xBF,0x2F,0x19,0xE9,0xBD,0xA6,0xED,0x1A,0xF6,0x84,0x94, + + 0x80,0xC0,0x84,0x90,0x34,0x3B,0x30,0xAA,0x41,0x80,0xE0,0xA0,0x09,0xE9,0x09,0xE6, + + 0xE0,0x1A,0x75,0x90,0x4C,0x83,0xC2,0xA0,0x72,0x45,0xFE,0x08,0xB8,0xD0,0x3B,0xE9, + + 0xF7,0xCD,0xA1,0x63,0xF8,0x2F,0xF9,0xA9,0xF3,0xC6,0x3D,0xCD,0x3F,0x2F,0x43,0xF7, + + 0x03,0x07,0x19,0x67,0x7A,0x52,0x27,0xC1,0x66,0x58,0x59,0xB0,0x78,0x69,0x08,0x0C, + + 0xDE,0x47,0x43,0xAC,0xB5,0x66,0xC4,0x44,0xA3,0x5F,0x10,0x42,0xAD,0x7F,0x6B,0x6D, + + 0xF7,0x1C,0x78,0x13,0x15,0x67,0xF0,0x55,0x67,0xEE,0x18,0x80,0xCF,0x6F,0xE2,0xE0, + + 0x5A,0x05,0x01,0x90,0x94,0x64,0xEA,0x87,0xD2,0x09,0x29,0xE1,0x92,0x51,0xFE,0x38, + + 0x85,0x65,0xE6,0x15,0xCF,0x8A,0x4C,0x75,0xA8,0x16,0x99,0x9D,0x60,0x2A,0x89,0x6A, + + 0xF7,0x84,0xFC,0x34,0x2B,0xE7,0xB6,0x5E,0xB7,0x41,0x14,0x5F,0x20,0x27,0x8A,0x5E, + + 0x4F,0xF4,0x3B,0xE1,0xEB,0x52,0x85,0x58,0x5D,0x52,0xA4,0x10,0x31,0xF8,0x49,0x14, + + 0xA8,0x07,0x7B,0x05,0x3F,0xF1,0x53,0xC1,0x48,0x07,0x92,0x5E,0xAC,0x25,0x21,0x9C, + + 0xCA,0xEB,0xC1,0xF3,0x62,0x69,0x44,0x4F,0x44,0xCD,0xE5,0x05,0x38,0xC8,0x64,0x3A, + + 0xB1,0x13,0x89,0x8B,0xD8,0x0C,0x1B,0x80,0x41,0x01,0xD0,0x8A,0xFF,0xEA,0x8A,0x5D, + + 0xDF,0x16,0x72,0xEE,0x13,0x6D,0x46,0x1A,0xB4,0xC6,0x81,0x68,0xDE,0x9C,0xF4,0xED, + + 0x7E,0x2D,0x8B,0x59,0xA9,0xA4,0x0B,0xE5,0x48,0x72,0xD7,0x2D,0xCE,0xC5,0x33,0x27, + + 0x2C,0x1F,0x27,0x79,0x16,0x6E,0x12,0x85,0xCF,0x53,0x4B,0x0F,0xE8,0x70,0x3C,0x05, + + 0x2E,0x9A,0xBE,0x77,0x08,0x9D,0xCF,0xEA,0x1F,0x25,0xAC,0x5F,0x99,0x13,0xA4,0x08, + + 0xA4,0x03,0x84,0x90,0x99,0xDE,0x22,0x40,0x09,0x5C,0xFD,0x4B,0x80,0xF2,0xD2,0x04, + + 0x26,0x13,0x90,0xC2,0x7A,0x1B,0x4E,0xEF,0x9B,0x28,0x41,0x5F,0x09,0xF3,0x33,0x61, + + 0x82,0xD1,0xB3,0xAD,0xD9,0x3E,0x0B,0xD3,0x5E,0x11,0xBF,0x4B,0x92,0x7F,0xEF,0x45, + + 0xB1,0x2B,0x51,0x3B,0xC7,0x67,0x2D,0xC7,0xCE,0x31,0xD4,0xE4,0x72,0x74,0xF9,0x2D, + + 0x23,0xCE,0xF7,0x7C,0xC0,0x33,0x9C,0x52,0xE0,0x58,0xDC,0xF4,0x73,0x75,0xB8,0x38, + + 0xA0,0x8D,0x3E,0xBE,0x88,0x89,0x6C,0xA3,0x43,0x14,0xD5,0xE5,0xF2,0x76,0x35,0x55, + + 0xAB,0xE4,0x63,0x27,0xB7,0xB7,0x24,0xB6,0x1E,0x21,0xDD,0xF5,0xF3,0x77,0xEA,0xFB, + + 0x37,0xBE,0x79,0xFF,0x04,0x5B,0x99,0x39,0xD4,0x61,0x81,0x5F,0xFC,0xF3,0x2E,0x72, + + 0xC0,0x43,0x71,0xE2,0x5B,0x8C,0x45,0xAF,0x16,0x5B,0xE5,0xCF,0x10,0xD8,0xD4,0xFA, + + 0xD2,0x93,0x7C,0xF2,0xD8,0x27,0xA6,0xC1,0x93,0x51,0xB3,0x15,0x00,0x3E,0x15,0x9B, + + 0x3B,0x13,0x74,0xEE,0x8D,0x44,0xC4,0x16,0xEF,0x51,0x81,0x52,0xFF,0x83,0x78,0xE4, + + 0x42,0x11,0xF1,0x4E,0xF7,0xB3,0xAB,0x96,0xFC,0x03,0xD6,0xEC,0x7A,0x7C,0xB5,0x28, + + 0x29,0x5F,0x97,0xCC,0x3D,0xBD,0x3F,0x12,0x9F,0x6C,0xDE,0xFC,0x7B,0x7D,0xB8,0xBA, + + 0x92,0x7D,0x07,0x49,0x52,0xC1,0x68,0x62,0x51,0xC3,0xD7,0xED,0xFA,0x7E,0x8B,0x08, + + 0x98,0xC2,0x41,0x5F,0x76,0x30,0xE8,0xD5,0x0A,0xC0,0xDF,0xFD,0xFB,0x7F,0x30,0x60, + + 0x00,0xCC,0x2F,0xBE,0x27,0x9F,0xB4,0xE2,0x40,0x00,0x25,0xD5,0x68,0xFB,0xEA,0x9A, + + 0x26,0xA1,0x10,0xE5,0x50,0xDA,0xC2,0xDA,0xDD,0x0C,0x14,0xB2,0x5B,0x7C,0x31,0xEB, + + 0x40,0x4F,0x19,0xF4,0xDD,0xB2,0xA1,0x51,0xF7,0x79,0x56,0x51,0x59,0x80,0xEB,0xFB, + + 0x41,0x4E,0x90,0xFB,0x6D,0x18,0xC6,0x74,0xF6,0x27,0xF1,0x86,0xD3,0x81,0xDF,0xA4, + + 0x22,0x9F,0x3F,0xC6,0x61,0xD1,0xCF,0x28,0x56,0xC0,0x08,0x42,0x56,0xE4,0x69,0x34, + + 0xEC,0xD4,0xA8,0xAA,0xAB,0xE7,0xAC,0x2C,0xD4,0xFA,0xF8,0x76,0x57,0xE5,0x1C,0x25, + + 0x6D,0xB7,0x21,0x83,0x84,0x5D,0x77,0x24,0xE8,0x1A,0xF1,0x67,0xD6,0xE6,0x7F,0x31, + + 0x78,0x2A,0xB6,0xA7,0xA4,0x31,0x07,0x5F,0x13,0xF6,0xF9,0x77,0xD7,0xE7,0x63,0x5E, + + 0x2F,0xCB,0xE2,0xF6,0xA0,0x53,0xD0,0xEA,0x54,0x35,0x79,0xDE,0x54,0xE7,0xEE,0x9F, + + 0x4E,0x7A,0xA1,0xDF,0xF4,0x00,0x32,0x9A,0x5F,0x7A,0xC2,0x0C,0x95,0xE6,0x43,0x09, + + 0xD5,0x87,0x9A,0xF3,0x64,0xE8,0x9F,0xB9,0xDC,0xC2,0x8D,0x06,0x14,0x43,0xEF,0x9D, + + 0xCB,0xEE,0xB9,0xE1,0x76,0xFA,0x62,0x34,0x29,0x40,0x6F,0xCC,0xBF,0x4A,0x77,0xEF, + + 0xF9,0x71,0x58,0x09,0xDC,0xAE,0xB2,0xEE,0xEC,0x8E,0xF2,0x6E,0x5E,0xEC,0xB9,0xA4, + + 0xF2,0x96,0x44,0xAC,0x2C,0x60,0x78,0xCE,0x4C,0xCE,0xFA,0x7E,0x5F,0xED,0x71,0x4C, + + 0x71,0x03,0xAB,0xC2,0xDA,0xA8,0xB3,0xD5,0x43,0x8C,0xF3,0x6F,0xDE,0xEE,0xED,0x05, + + 0x02,0xED,0x2B,0xDB,0xCE,0x52,0x1B,0x2C,0x6C,0xC2,0xFB,0x7F,0xDF,0xEF,0x22,0xF0, + + 0xDB,0xD2,0x7D,0x86,0x4F,0xBC,0x4B,0xD0,0x57,0xE4,0xF2,0xA4,0x76,0xEB,0x74,0x83, + + 0x16,0xD5,0xC2,0xE5,0x0D,0xF3,0x04,0x4D,0x56,0x95,0x78,0xCC,0x74,0x11,0xEF,0xD7, + + 0x4D,0x19,0xFE,0x25,0xB2,0xC1,0xCF,0x21,0x71,0x88,0x52,0xD1,0x7B,0xB0,0xAF,0x91, + + 0xE5,0x1E,0x69,0xCC,0x40,0xBC,0x87,0x74,0x3B,0xDB,0x7D,0x32,0xA2,0xFE,0xA4,0x46, + + 0xB4,0x39,0x24,0xD6,0xCE,0xB2,0x0B,0x25,0x60,0x54,0xF4,0xE6,0x76,0xF4,0x56,0x63, + + 0x1F,0x0A,0xC2,0xD6,0x37,0xB5,0x3F,0xF6,0xE8,0x94,0xFC,0xF6,0x77,0xF5,0xF4,0xF3, + + 0xA2,0x29,0x4B,0x35,0xB0,0x36,0xA7,0xA3,0xAE,0xD7,0xF5,0xE7,0xF6,0xF6,0xB2,0x53, + + 0xD0,0xE2,0xED,0xA5,0x84,0x21,0xBD,0x77,0x11,0xCA,0xFD,0xF7,0xF7,0xF7,0x7F,0x8C, + + 0xCB,0xDA,0x12,0xF1,0x9F,0x15,0xB3,0xD8,0x8B,0x27,0xBC,0xAA,0xDF,0x58,0x10,0x6A, + + 0x4D,0xD9,0x73,0xA7,0x56,0x31,0xBA,0x52,0xF5,0x19,0x0F,0x43,0x8F,0x4C,0xE3,0xCE, + + 0xAD,0xD8,0x36,0x74,0xCF,0xBA,0xF7,0x7F,0xA9,0xDE,0xA2,0x8C,0xF1,0x21,0xEF,0x1E, + + 0x99,0x10,0x7B,0x62,0x3C,0x60,0x66,0xB1,0x08,0xD2,0xA3,0x47,0xFD,0xB9,0xA6,0x0A, + + 0x3B,0x61,0x1C,0x4C,0xF3,0xB3,0x5E,0x88,0x5D,0x93,0xF6,0xEE,0x7E,0xFC,0x37,0xA4, + + 0x8A,0x1B,0xE5,0x19,0x39,0x3D,0x46,0x10,0xE2,0x20,0xFE,0xFE,0x7F,0xFD,0xEC,0x2B, + + 0xB2,0xF2,0xBE,0x29,0xB8,0xFC,0xB7,0x6F,0x48,0xD0,0xF7,0xEF,0xFE,0xFE,0x6B,0x9B, + + 0xB3,0xD1,0x3D,0x9F,0xA7,0xFD,0xBF,0x7F,0x36,0xD5,0xFF,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x38,0xAF,0x7F,0x76,0x72,0xDF,0x76,0x90,0xA9,0x4F,0x50,0x64,0xB9,0xB1,0x58,0x11, + + 0x6A,0x22,0x77,0x6A,0x3F,0xD5,0x42,0x40,0x29,0xA0,0xE0,0x47,0x3D,0x6A,0x12,0xF2, + + 0xF8,0xA9,0x7A,0x7A,0xF8,0x2F,0x77,0x84,0xC1,0x92,0xE9,0x02,0x39,0x93,0xFC,0xE0, + + 0xA7,0x01,0x29,0xE6,0x1D,0x61,0x67,0x37,0x20,0xC0,0x1D,0x26,0xE1,0x52,0x80,0x05, + + 0xA3,0xDB,0x77,0x6D,0x65,0x24,0xFC,0x1F,0x88,0x3D,0x89,0x3C,0x54,0x06,0x7B,0xD0, + + 0xA2,0x9A,0xC8,0xAF,0x60,0x25,0x42,0x72,0xD1,0x4F,0x98,0xB3,0x60,0x73,0xF5,0x23, + + 0x7D,0x00,0xFF,0x34,0x2D,0x7D,0x0B,0x63,0x71,0x9B,0x84,0x41,0xF2,0x77,0xFD,0x33, + + 0x78,0x6B,0x09,0x54,0x3D,0xDA,0xDC,0xF5,0x81,0x45,0x63,0xE7,0xA3,0x75,0x3C,0xC0, + + 0x60,0x71,0x02,0x8F,0x1E,0x6A,0xA1,0xDB,0xC4,0xC3,0x94,0x04,0xD8,0x24,0x74,0xBD, + + 0x8B,0x0D,0xC8,0x18,0x9E,0x9B,0xBA,0xD7,0xFD,0x46,0xBC,0x99,0x2D,0xCD,0x7D,0xB9, + + 0x69,0x69,0x3F,0x4D,0xD0,0x29,0x17,0xCB,0xCE,0x08,0x95,0x18,0xF0,0x32,0x51,0x7B, + + 0xE2,0xA8,0x4B,0x8D,0x81,0x8A,0xF7,0xAA,0xB1,0x16,0xC9,0x00,0x30,0x51,0xFD,0xD3, + + 0xF5,0xD1,0xD4,0x2E,0xE5,0xF1,0x40,0xEC,0x4C,0x0E,0x68,0x1C,0xDA,0xEA,0x58,0xA6, + + 0xF0,0x80,0x8A,0xA3,0xEE,0xAE,0x0A,0xE8,0x67,0xB8,0x4A,0x3B,0x7F,0x76,0x20,0xB7, + + 0x63,0x27,0x17,0xB3,0x67,0xAF,0xDF,0xED,0xC4,0x70,0xF7,0x2D,0xDE,0x00,0x19,0xA6, + + 0x78,0x4D,0x3E,0xA3,0xE0,0x2D,0x8D,0x85,0xCB,0xF3,0x97,0x1B,0xF8,0x64,0xB1,0x7D, + + 0x22,0xCB,0x28,0x01,0x5B,0x9B,0x75,0xE0,0x64,0x1E,0x03,0x5C,0x70,0xCB,0xA0,0xE3, + + 0x47,0x97,0xF2,0xA1,0xD8,0xD0,0xE1,0x9E,0xC2,0xFC,0x23,0x85,0x62,0x8E,0x36,0x05, + + 0xFD,0xB0,0x85,0x76,0xD7,0xBF,0x57,0x25,0xE6,0x16,0x93,0x21,0xF8,0x15,0x89,0xE2, + + 0xCB,0x9A,0x21,0x06,0x98,0x39,0xCF,0x81,0xE9,0xAC,0xA6,0x09,0x06,0xFE,0xC8,0xA2, + + 0xD5,0x71,0x0B,0xB7,0x1B,0xB6,0xC3,0x73,0x05,0xF9,0x56,0xD6,0x12,0x81,0x99,0xB2, + + 0xD0,0x70,0x2B,0x14,0x37,0x95,0x18,0x83,0x1F,0xF4,0x75,0x07,0xFF,0xFE,0x7D,0x3E, + + 0xA4,0x54,0x3A,0xB6,0x93,0x5A,0xC6,0x72,0x89,0x5E,0xAB,0xE3,0x13,0xF5,0x75,0x2A, + + 0x2E,0xE1,0xD5,0xF1,0x80,0x1D,0x87,0x0E,0x0A,0x86,0x22,0x17,0x5F,0x78,0x26,0x1A, + + 0xA8,0x12,0x08,0xFF,0x54,0xB8,0x2C,0x19,0x02,0x87,0xE9,0x2E,0xE9,0xFD,0x50,0x2C, + + 0x56,0x6C,0x22,0x0F,0x10,0x33,0xDE,0xB9,0xC7,0x37,0x5E,0xAC,0x1F,0x73,0x85,0x78, + + 0xC2,0x1A,0xF9,0xA5,0x51,0x2B,0x20,0x61,0x9B,0x5A,0x57,0x29,0x71,0x16,0x13,0xEB, + + 0x52,0xE0,0x59,0x19,0xBF,0x48,0xA2,0x26,0x1C,0xD2,0xDF,0x55,0xBA,0x36,0x38,0xE5, + + 0xDB,0xCA,0x7E,0x2C,0x6C,0x52,0x00,0x19,0xE7,0x3E,0x69,0x68,0x7C,0xB5,0x0E,0xE8, + + 0x2D,0x5F,0x03,0xAF,0x2C,0x7F,0x20,0x0C,0x6D,0x26,0xA1,0x14,0x6E,0x30,0x39,0xE5, + + 0xAC,0x9C,0x9E,0x7E,0x1F,0x98,0x29,0x18,0x17,0x3C,0xEF,0x17,0x56,0x73,0x8F,0x9C, + + 0xAD,0x9D,0x0B,0xBE,0xB8,0x1D,0x5F,0x8A,0x87,0x56,0x26,0xF5,0x5E,0x00,0x20,0xF1, + + 0x62,0xE5,0x70,0xED,0xFD,0x83,0x56,0x1A,0x45,0x90,0xE8,0xAE,0xBD,0x7A,0x38,0x16, + + 0x0C,0x7E,0xF8,0xE5,0x3F,0x95,0x58,0x78,0xA8,0x6C,0x00,0xD6,0x09,0xFA,0x19,0xF0, + + 0xEA,0x83,0xF7,0xE5,0x5C,0xA1,0x90,0x1B,0x58,0x73,0xE9,0xB7,0xE7,0xAE,0x13,0xE0, + + 0x92,0x2C,0x79,0x06,0xF9,0x83,0xAF,0xD1,0x39,0xD9,0xF3,0x51,0xF6,0xB3,0xE0,0xCE, + + 0x00,0xE6,0xBB,0x7D,0x10,0xAE,0xCD,0x39,0x97,0x99,0xE0,0xF3,0x2F,0x69,0x16,0x6F, + + 0x6C,0x64,0x78,0x25,0x4C,0xAC,0xB8,0xF7,0xA8,0xC6,0xB5,0xB6,0x3E,0x6E,0x47,0x31, + + 0x6D,0x57,0x9E,0x54,0xAE,0x47,0x5A,0xE7,0xCE,0xA1,0x0E,0x18,0x5B,0x40,0x6D,0x20, + + 0xAE,0x05,0x69,0xC6,0xCC,0x0A,0x3C,0xF3,0x7A,0x66,0x5C,0x4A,0x64,0xAA,0xEF,0xF7, + + 0x0E,0x53,0xBF,0x49,0xF5,0xD2,0xE9,0x2A,0xBC,0x6B,0x1A,0xA7,0xD9,0x6A,0x14,0x7B, + + 0x65,0x84,0xD3,0x6F,0x0A,0xBF,0xCE,0x55,0x4B,0xAB,0x9A,0x16,0x7D,0x4A,0xD6,0x8F, + + 0xD0,0x6A,0xC5,0x62,0xFF,0xAE,0x04,0x9F,0xCA,0xEA,0x1B,0xB6,0x59,0x49,0xD6,0xE2, + + 0x8F,0x10,0xE3,0x16,0x74,0xD2,0x6B,0x55,0xAC,0xCF,0xEB,0x01,0xA9,0x1E,0x9D,0x39, + + 0x62,0xE0,0xFC,0xDE,0xE1,0x01,0x4A,0x95,0xFB,0xAF,0xEA,0xA3,0x3D,0x96,0x99,0xDE, + + 0x4D,0x8F,0x6A,0x4F,0x48,0x00,0x5A,0x6A,0x07,0x2C,0xA8,0x51,0xB4,0x89,0x84,0x0B, + + 0x8A,0xA6,0x28,0x08,0x40,0xA4,0x88,0xEF,0xC0,0x21,0x64,0x9C,0x5A,0x63,0x79,0x47, + + 0x89,0xCD,0x24,0x3F,0x9B,0x0D,0x77,0x42,0x40,0x62,0xC3,0x81,0xB4,0xE0,0x3E,0x7E, + + 0xD0,0xD2,0x64,0x03,0xAF,0x1D,0x14,0x48,0xD1,0x59,0xEC,0xAB,0xF6,0xEC,0xBA,0xE1, + + 0x49,0xFD,0x6C,0x06,0x31,0x17,0xD4,0x3B,0x2D,0xC0,0xBC,0xB6,0x75,0xF1,0x6B,0xBD, + + 0x45,0x3D,0xB4,0x03,0xB2,0x01,0x15,0x29,0xE5,0x92,0x87,0x23,0xB4,0x5E,0x4B,0xF2, + + 0xA4,0xD3,0x3A,0xE9,0x7F,0x62,0x39,0x42,0x59,0xD0,0x2D,0x35,0x64,0x76,0xE4,0x59, + + 0xCD,0x25,0x84,0x8D,0x13,0xF6,0x71,0x73,0x0A,0x21,0x18,0x9D,0xE8,0x69,0xC0,0xA1, + + 0x1B,0xE3,0xDB,0x52,0x39,0x56,0x5C,0x15,0x61,0xAE,0x3A,0xF4,0x53,0x28,0xDE,0x59, + + 0x4D,0x07,0x25,0x51,0x34,0xEA,0xE3,0x67,0x91,0x7F,0x14,0xA7,0xB6,0xB8,0x53,0xFF, + + 0x31,0x9D,0x8D,0x99,0x65,0xB3,0x7D,0x80,0x8B,0xBB,0x87,0x97,0xA1,0x7C,0x32,0x2B, + + 0xCD,0x37,0xEE,0x12,0x3A,0xFA,0x87,0x0B,0xD4,0x9B,0x76,0xBE,0xB5,0xF8,0x48,0xEB, + + 0x2E,0xD2,0x11,0x7C,0x56,0xB6,0xFE,0xDD,0x6E,0xAB,0xC6,0xBA,0x94,0xD0,0x36,0xF8, + + 0x9C,0xF6,0x72,0xF1,0x1F,0xDF,0xF7,0xAF,0x89,0x98,0xB7,0xAF,0xFC,0x51,0xEF,0x1F, + + 0x29,0xF5,0x2F,0xEC,0x8D,0xF9,0x01,0xCA,0x8D,0x24,0x8D,0x8F,0xA9,0xB9,0x6B,0x8D, + + 0xC7,0x2D,0x61,0x4C,0xAB,0xAA,0x10,0x8B,0x6D,0xEC,0x15,0xD2,0x95,0xB8,0x66,0x9A, + + 0x29,0xDF,0xC3,0xCD,0x39,0xDF,0x60,0xEB,0x03,0xD9,0x5A,0x8C,0xDC,0x76,0x82,0xB8, + + 0xDE,0xC8,0x27,0x4B,0x78,0xB8,0xC0,0xDE,0xE8,0x05,0xCD,0x5F,0x6B,0x51,0xBA,0x5F, + + 0xA1,0xA1,0x39,0x5D,0x26,0x16,0x07,0x3D,0x85,0x9E,0x89,0xC3,0x14,0xBB,0x3A,0xB0, + + 0x99,0xAF,0x97,0xF7,0x68,0xAD,0xE8,0x53,0x78,0x2C,0x05,0xA0,0x12,0x50,0x16,0x2C, + + 0xB2,0x8C,0xB6,0x2D,0x79,0x50,0x88,0x42,0xAA,0x10,0x49,0xCE,0xB8,0x10,0xA5,0x73, + + 0x23,0x89,0xE7,0x3D,0x7B,0xB3,0x77,0x40,0xC1,0x62,0x04,0xDE,0x39,0x6D,0xF1,0x0C, + + 0x01,0xA5,0xF7,0x38,0x78,0xB2,0x67,0x1C,0xAA,0x92,0xBF,0x44,0x72,0xE6,0x7A,0xB3, + + 0x3A,0xA9,0x3B,0xC0,0x57,0x19,0x2E,0xCC,0xEE,0x49,0xA8,0x43,0xAF,0x6B,0x00,0x9C, + + 0x30,0xC8,0x73,0x0E,0x15,0x47,0x7B,0x8F,0xB6,0xC6,0x23,0x53,0xF2,0x9A,0x54,0x06, + + 0x48,0x57,0xEE,0x3A,0x4B,0xBA,0x2F,0xCC,0xC4,0x24,0x11,0xE1,0x84,0x6B,0x89,0xD5, + + 0xCC,0x1A,0x50,0x95,0x83,0x65,0xAC,0x8F,0x2A,0xEE,0x35,0xE7,0xD3,0xBA,0x92,0x7A, + + 0xE3,0x93,0xD4,0x20,0xF3,0x79,0x21,0xD9,0x34,0x4A,0xB4,0xCE,0x11,0xC7,0x9B,0xF0, + + 0x97,0xC6,0x9F,0x98,0x17,0x95,0xAD,0x11,0x4F,0xD2,0x31,0x52,0x8C,0x12,0x5A,0x87, + + 0x6F,0x46,0x84,0x0F,0x12,0x87,0x4C,0xA9,0xBB,0x3F,0x19,0x72,0x65,0x96,0x52,0x77, + + 0x2E,0x1B,0xB3,0xE7,0x35,0x26,0x8E,0x02,0xF1,0xBE,0xDB,0xD1,0x65,0x29,0x6A,0x2A, + + 0xB3,0x00,0x02,0xD0,0xBB,0xB3,0xAF,0x84,0x4A,0xF7,0xC8,0x6E,0x98,0x68,0xF7,0x1A, + + 0xAA,0xA0,0x8D,0x74,0xF2,0x1E,0x12,0x83,0xC9,0x51,0x93,0x8C,0xDB,0x72,0x7B,0x27, + + 0x0B,0x03,0x77,0x2F,0x61,0x2D,0x13,0x91,0x3E,0x0C,0xDB,0xF9,0x27,0xC8,0x1F,0x68, + + 0x2A,0xF0,0x27,0xCF,0x9F,0x27,0xE5,0x1B,0x30,0xBA,0x60,0x0D,0x5B,0x79,0xD3,0x9E, + + 0x02,0xE4,0x14,0xC3,0xC9,0x96,0x2A,0x9D,0x1C,0xFF,0x94,0xB7,0x44,0xB8,0x74,0xA2, + + 0x49,0x1C,0xEA,0xB8,0xDA,0xA0,0x62,0xB7,0xC0,0x8E,0x2B,0x89,0x85,0xA0,0x51,0xF2, + + 0xC9,0xA6,0x10,0x76,0xC8,0xAF,0xB5,0xD2,0x94,0x81,0x20,0x9C,0x44,0xE3,0xF2,0xE2, + + 0x02,0x70,0x61,0xE6,0xC9,0x95,0xA9,0xD3,0x1E,0xF7,0x5D,0xED,0xFA,0xDE,0x39,0x02, + + 0x83,0x0B,0x97,0x3E,0x34,0x76,0x01,0x93,0x58,0x38,0x0F,0xDA,0x76,0x7E,0x9F,0x2E, + + 0x9A,0xA6,0x6C,0xB6,0x84,0x50,0x60,0x52,0x65,0x17,0x8B,0xCF,0x1A,0xEE,0xF8,0xFC, + + 0x5D,0x4B,0x06,0x87,0x3E,0x3A,0x33,0x90,0xE3,0x16,0xAA,0xDB,0x80,0x83,0x32,0xBB, + + 0xD1,0x88,0xF5,0x3A,0xD8,0x38,0x9E,0x93,0x14,0x32,0xDD,0x71,0xF7,0x25,0xFD,0xF7, + + 0x48,0x1A,0x1B,0x7C,0xB8,0x27,0x81,0xAE,0xA0,0x89,0x07,0x5D,0xDB,0x38,0xFB,0x6B, + + 0x0F,0x92,0x0E,0x5A,0x1F,0x3A,0x21,0x3C,0x21,0xA9,0x89,0x4F,0x01,0xA4,0x79,0x2C, + + 0x5D,0x99,0x99,0xB5,0x2A,0x32,0xB3,0x58,0x4B,0x1A,0xA5,0x93,0x5B,0xDB,0x27,0xA4, + + 0x42,0x5F,0x5F,0x0D,0x99,0x0A,0x27,0x57,0x45,0x56,0xC9,0x85,0x12,0xEA,0x1F,0xBE, + + 0x2C,0x9C,0x46,0xBF,0x00,0xB9,0x6E,0x07,0xFF,0x81,0x75,0x54,0xA6,0xCF,0x1A,0x2B, + + 0x01,0x90,0xF0,0x3E,0x59,0x88,0x66,0x13,0xD8,0x88,0x65,0x4C,0xC5,0x22,0x32,0xBA, + + 0x96,0xBF,0xD5,0x4D,0x51,0x7A,0xFE,0x87,0xC4,0xF8,0x17,0x68,0x2A,0x01,0x19,0x79, + + 0x40,0x1C,0xB1,0xDA,0x1A,0xE0,0x01,0xC6,0x8C,0x82,0x70,0x92,0x26,0xA0,0xD8,0xEA, + + 0xD2,0x4F,0xDF,0x7C,0x99,0xC2,0xA7,0x1C,0x30,0x82,0xBB,0xE7,0x3F,0x71,0xF2,0xB6, + + 0x21,0x2C,0x04,0x65,0x29,0x57,0x06,0x43,0x25,0x1E,0xE6,0x0A,0xE9,0x4A,0x89,0x3B, + + 0xB7,0x34,0x5A,0x7C,0x9A,0x5D,0x6A,0x62,0x25,0x7D,0x04,0xD6,0xAC,0xE0,0x37,0x23, + + 0x72,0x22,0x97,0x3B,0x43,0xA9,0xC6,0x48,0x48,0x35,0x2E,0xB7,0x1D,0x92,0x5E,0xE2, + + 0x28,0x5B,0xF4,0x35,0x7F,0x25,0x21,0xE6,0x0D,0xC1,0xB8,0x6A,0xAB,0x45,0xD3,0xE2, + + 0xBB,0x5A,0x44,0xC9,0x14,0x67,0x70,0xE2,0xAE,0xD6,0xAE,0xCE,0xBC,0x76,0xDE,0x73, + + 0x84,0x79,0x1A,0xB8,0x7F,0x95,0xCE,0xA4,0x04,0x66,0xA6,0x94,0xAC,0x3B,0x57,0x7E, + + 0x38,0xDC,0xB3,0x27,0xFF,0xB4,0x1B,0x63,0xC6,0xB7,0xFF,0xDE,0x5E,0xCB,0x1A,0x15, + + 0xAF,0x0D,0x22,0xC8,0x3A,0x23,0x7A,0x5B,0xB5,0x49,0xA7,0x5D,0x64,0xE1,0x52,0xAA, + + 0xAE,0x56,0x6E,0x7A,0xBC,0x2E,0xC1,0x45,0x25,0xC4,0x3A,0xC5,0xBC,0x4A,0x31,0x0B, + + 0x73,0x27,0x1E,0x3E,0xA4,0xE8,0xB3,0xD4,0x2D,0xA9,0xE4,0x5C,0xA0,0x6B,0xF6,0x1A, + + 0x89,0xAB,0x2F,0x1A,0x39,0xE8,0xC4,0x45,0xE3,0x14,0x28,0xC5,0xB6,0x43,0x62,0xB3, + + 0xBF,0x17,0x9C,0x48,0xFF,0x2F,0x4C,0x0B,0x2E,0xB3,0x32,0xEB,0x6B,0xE6,0x02,0x38, + + 0xB0,0x83,0x98,0x5F,0x53,0x00,0x9D,0x3A,0x43,0x66,0x23,0x7E,0x24,0xEF,0x54,0xCF, + + 0xB0,0x20,0x50,0xBC,0x12,0xA3,0x8C,0x18,0xFC,0xA0,0xB3,0x1C,0xB7,0x91,0x53,0xB5, + + 0x0C,0x82,0x76,0x66,0x64,0x22,0x73,0x6A,0x2E,0x60,0xA0,0x44,0xA0,0xED,0x7E,0x81, + + 0x52,0x65,0x23,0x02,0x32,0xB7,0xC9,0xE5,0x99,0xA6,0x74,0x36,0x6C,0x25,0x2C,0x81, + + 0x4C,0x59,0x62,0x51,0x33,0x31,0x03,0x36,0x63,0x8E,0x2B,0xC8,0x1F,0x20,0x85,0x7D, + + 0xCF,0x3A,0xFC,0xF1,0xB2,0xF0,0xCA,0xDD,0x72,0x0D,0xCD,0x96,0x88,0x5D,0x98,0x32, + + 0x11,0x90,0x7F,0xD7,0xBD,0xF2,0x05,0x5D,0x49,0xDE,0xC3,0x8B,0xBF,0xC2,0x62,0xEB, + + 0xA6,0x62,0x50,0xA4,0x4E,0x4B,0xA0,0x71,0xC7,0x6B,0xAA,0xB3,0x76,0x50,0x12,0x6A, + + 0xCC,0x26,0xEC,0x2F,0x3B,0xF7,0xC7,0xB0,0xC6,0x28,0xCF,0x4E,0x71,0x8D,0xF5,0xDC, + + 0x94,0x1B,0x5E,0x7F,0x41,0x2D,0x0E,0x67,0xEA,0xB6,0xEB,0xAF,0x0E,0x45,0x53,0x7B, + + 0x6F,0x3E,0xE9,0x70,0x5E,0xBF,0x55,0x91,0x13,0x84,0x9F,0xD3,0xF7,0xF7,0x11,0x2F, + + 0xDC,0xDB,0x4A,0xAA,0xB1,0xF9,0xCB,0xED,0x91,0xAE,0x96,0x11,0x9D,0x57,0xFE,0x72, + + 0x83,0xD4,0xB0,0x0E,0xD6,0xE8,0x40,0x82,0x4F,0x34,0x04,0x3A,0x3D,0x36,0xA7,0xD3, + + 0xA7,0xD6,0x67,0x0A,0x74,0x17,0x49,0x92,0x19,0x8C,0xE7,0x5C,0xD6,0xE1,0x51,0xB2, + + 0xCE,0x64,0x91,0xFE,0xFF,0x14,0xBA,0xFC,0x0C,0x7D,0xBF,0xBF,0xFD,0xFB,0x1E,0xF8, + + 0xE6,0x93,0xF0,0xAC,0xC5,0xFE,0xC1,0x47,0x68,0xBE,0xF6,0xEE,0x7E,0xFC,0x66,0xDF, + + 0xC6,0x8E,0x09,0x21,0x8A,0x6B,0x46,0x11,0xDC,0xD3,0xFE,0xFE,0x7F,0xFD,0xB4,0x38, + + 0xD0,0x35,0x67,0x43,0x33,0xC3,0x51,0x85,0xC0,0x78,0xF7,0xEF,0xFE,0xFE,0xAF,0x5F, + + 0x18,0x92,0x87,0xD9,0x3C,0xDB,0x47,0x04,0x6C,0xD2,0xFF,0xFF,0x71,0x9D,0x80,0x19, + + 0x40,0x40,0x30,0x08,0xF1,0x43,0x16,0x7E,0xCD,0x22,0xA7,0x70,0x23,0x60,0xA7,0xE1, + + 0xED,0x0C,0x9A,0x10,0xF8,0xA0,0x0E,0x9D,0xAA,0x32,0x8E,0x56,0xAE,0xBC,0x00,0xDF, + + 0xEB,0xC7,0x83,0xF6,0xF4,0x89,0xBA,0xA4,0x53,0x7D,0x51,0x3D,0x83,0x9F,0x57,0x22, + + 0x01,0xA8,0x65,0x86,0xF9,0x29,0xA2,0x80,0xF7,0xEC,0x4D,0xCB,0x2C,0xE2,0x12,0x4F, + + 0xE9,0x95,0xB9,0x32,0xE1,0x34,0x46,0x48,0xA9,0x55,0x01,0x7B,0x6C,0x0A,0x5E,0x91, + + 0xFC,0x88,0x7B,0x69,0x15,0xF5,0xCE,0x0F,0x2B,0x34,0xE6,0xD8,0x91,0x65,0x61,0x61, + + 0x6B,0x47,0x7B,0xBE,0x6E,0x25,0xEA,0xD0,0xAE,0xE9,0xEF,0xC8,0x10,0x99,0x9D,0xAF, + + 0x7B,0xCF,0xD3,0x0F,0x66,0xBB,0x27,0x5C,0x36,0xE4,0xD1,0x61,0xB8,0x34,0x30,0x18, + + 0x8D,0x1E,0x06,0x08,0x58,0x9B,0xC3,0x7A,0xFB,0xC2,0xF3,0xDF,0x20,0xB5,0x2D,0x19, + + 0x62,0x7D,0xF4,0x20,0xF0,0xA8,0xCF,0x6A,0x0A,0xB9,0x2D,0x00,0xA4,0x0A,0x5D,0x13, + + 0x88,0xA1,0xBD,0xDD,0xDB,0x0A,0x6B,0x63,0xF9,0xE7,0xC1,0x22,0x33,0xFB,0x89,0xDF, + + 0x1B,0x08,0x91,0x19,0xB8,0x4B,0x12,0xCA,0xF3,0xE6,0xFD,0x5F,0x2E,0x96,0x19,0x48, + + 0x0C,0x9C,0xED,0x33,0xC3,0x22,0xC3,0x9B,0x7E,0x4D,0xD2,0x9D,0x64,0x93,0xB5,0x26, + + 0x25,0xD2,0x31,0x1B,0xE2,0xDB,0x76,0x0A,0xA0,0x2C,0xE9,0xC9,0x78,0x2D,0x08,0x36, + + 0xE2,0x03,0xFB,0xB2,0x19,0x23,0x54,0x6C,0xCE,0x2E,0xD5,0xC5,0x33,0x7D,0xF4,0x69, + + 0x19,0xA0,0xB5,0xED,0x6A,0xF9,0x65,0x5C,0x46,0xC9,0xDD,0xC8,0x99,0xC0,0x90,0x73, + + 0xA4,0x9D,0xA4,0x99,0x5B,0xD1,0x91,0xDD,0x89,0x31,0xAC,0x25,0x1B,0x91,0x36,0x72, + + 0x69,0x70,0xD2,0xBD,0x39,0x9A,0x65,0xE6,0x94,0x9D,0xC2,0x9D,0x79,0xDA,0x57,0xCB, + + 0x4B,0x76,0xB0,0x74,0x80,0x33,0x03,0xC3,0x80,0x28,0xA0,0x54,0xC0,0x7F,0x33,0xB4, + + 0x43,0xC3,0x1C,0xBE,0xDA,0x42,0x1C,0xE7,0x1C,0x9F,0x0C,0x9B,0x9A,0x02,0x8C,0xE6, + + 0x72,0x99,0xC8,0x2E,0xD7,0xAB,0x2A,0xE7,0xC3,0xFB,0xB7,0xF7,0x23,0x15,0x06,0xD1, + + 0x5E,0x1C,0x9C,0xEA,0x4F,0x77,0x0C,0xDF,0x5B,0x00,0xDC,0xB4,0x0A,0xD1,0x91,0x3E, + + 0x4B,0x9C,0xC4,0xB3,0x49,0xC3,0xC2,0xC6,0x43,0xF9,0xEB,0xC0,0x7D,0xF0,0x0F,0xA2, + + 0xFA,0x96,0x4E,0xA5,0x30,0x3A,0xCC,0xDA,0xDF,0x51,0xCC,0xF3,0x3B,0x96,0x39,0xFA, + + 0xC3,0x79,0x8E,0x2C,0x60,0x58,0xCD,0xA4,0x17,0xA1,0x96,0xAE,0x24,0xD3,0x8E,0xAA, + + 0x49,0x49,0x0B,0xB8,0xD0,0x78,0xDE,0xB5,0x14,0xF4,0x86,0x4D,0x41,0x59,0x39,0xAC, + + 0xC3,0x15,0x07,0x89,0xCE,0x39,0xA2,0x9D,0x10,0x69,0x01,0x86,0x93,0x6B,0xF0,0xEA, + + 0x0A,0x98,0x99,0x59,0x46,0xB6,0x8B,0x88,0x48,0xDA,0xC1,0x91,0x41,0xD0,0x1C,0x37, + + 0xCB,0x9F,0x51,0x3F,0x5C,0x32,0x56,0xF4,0x6C,0xCC,0x72,0x8E,0x8D,0x19,0x10,0x60, + + 0x23,0xB2,0xE8,0xF4,0xBF,0x99,0x26,0x59,0xE6,0xD6,0x6F,0xD0,0xC3,0x0C,0xF6,0x82, + + 0x57,0x22,0xFF,0x71,0x51,0x9D,0xE0,0x1A,0xCC,0xFA,0xEF,0x12,0x46,0x4F,0x18,0xD2, + + 0xDD,0x1B,0x59,0xDA,0x1A,0xE0,0xDF,0x6A,0x8B,0xF0,0x1F,0xE5,0x3B,0xC0,0xC3,0xF9, + + 0x20,0xC0,0x20,0x07,0xBA,0x0D,0xE5,0xF2,0x18,0x6F,0xA6,0x44,0xAB,0x3D,0x9F,0x13, + + 0x88,0x8D,0x2C,0x12,0x55,0xB2,0x5A,0x8F,0x44,0xB1,0xAF,0xC5,0x2D,0x3C,0xA6,0xAD, + + 0x0B,0x80,0x31,0x94,0x9F,0xAA,0xA3,0x50,0xFE,0xAC,0x65,0xD9,0x29,0x43,0x41,0x0C, + + 0xA1,0x82,0x97,0xD2,0xB7,0xAE,0x60,0x58,0xA6,0x3C,0xEF,0x0F,0x3E,0x72,0x77,0x3C, + + 0x64,0xF0,0x9E,0xE3,0xFF,0x97,0xF6,0x22,0x4A,0x84,0x50,0x7C,0xDA,0x49,0xD7,0xF7, + + 0xCD,0x88,0x91,0x20,0xE4,0xB5,0x6E,0x57,0xAC,0x81,0xA2,0x72,0x3F,0xF4,0x1F,0x7B, + + 0x7A,0x57,0xF7,0x25,0xF6,0xDC,0x73,0xCB,0xA5,0xD9,0x24,0x85,0x9E,0x87,0x92,0x2C, + + 0xEF,0x8A,0x53,0xAC,0x6B,0xE4,0x43,0xC3,0x0A,0x68,0x87,0x5F,0x36,0x44,0x25,0x0F, + + 0x08,0x88,0xE6,0xFF,0x70,0x9D,0xCA,0xC2,0xA9,0x87,0x32,0x2A,0x2A,0x45,0x74,0xB2, + + 0x0D,0x04,0xBF,0x1F,0x76,0xF8,0xBB,0xC7,0xB0,0xBC,0xB2,0x3B,0x59,0x69,0x5D,0xFA, + + 0xE2,0x96,0xFD,0x27,0x3C,0x01,0xB3,0x3B,0xB6,0x11,0x23,0x68,0x16,0xA0,0x55,0x3E, + + 0x6C,0x2A,0x9E,0xEE,0xA1,0xA7,0xA9,0x00,0xF7,0x89,0xEC,0x4C,0xD2,0xE8,0x9D,0x34, + + 0x20,0x53,0x51,0xEF,0x18,0x7C,0xD6,0x08,0x6F,0xAC,0x64,0x9D,0x32,0x67,0x7D,0x24, + + 0x65,0x1C,0x55,0x1C,0xBE,0x00,0x6B,0x4A,0x1B,0x62,0x6F,0x0C,0x35,0xBC,0xDC,0x7A, + + 0xF6,0x21,0xF9,0x31,0x1F,0xA3,0xF3,0x6E,0x2A,0x63,0x73,0x5E,0xE2,0x41,0x15,0x63, + + 0xAF,0x3F,0xBE,0x6E,0x3E,0x2E,0xDB,0x09,0xA5,0x2E,0x85,0x53,0xDB,0xAF,0x74,0x7C, + + 0xD9,0x19,0x70,0x78,0xCC,0x78,0x38,0x48,0xA1,0x0D,0x21,0xA4,0x54,0x40,0x88,0xF0, + + 0xDE,0x0A,0xE7,0xE9,0x5D,0xBC,0x96,0xA3,0x49,0x7C,0x0B,0x92,0x02,0xF1,0xA1,0x70, + + 0x20,0x46,0xFE,0x87,0xB2,0x22,0x9F,0xAB,0x21,0x2F,0xF8,0x07,0xE8,0x20,0x2D,0x7B, + + 0x44,0xDE,0x52,0xE9,0x9B,0x6C,0xA9,0xF4,0x27,0x93,0x8A,0xE3,0x86,0xF3,0x61,0x33, + + 0x54,0xB4,0x50,0xA4,0xBB,0x12,0x21,0xD3,0xC7,0x55,0xC7,0x04,0x70,0x24,0xBF,0x22, + + 0x9B,0x06,0x38,0x28,0x8B,0x84,0x7D,0x84,0x9C,0xAE,0xDA,0xCE,0xFB,0x28,0x3B,0x7A, + + 0x12,0x3D,0xB7,0x38,0x43,0x10,0x79,0x09,0x03,0x49,0x80,0xF4,0x8E,0xB2,0xDC,0x6A, + + 0x1F,0x44,0x5C,0xFB,0x0F,0xC6,0x7E,0xCC,0xC1,0x02,0x85,0xD0,0x0A,0xF8,0xDD,0x82, + + 0x89,0x67,0x19,0xBE,0xAE,0x17,0x7E,0xAF,0x68,0xD8,0x76,0xB6,0x2F,0x05,0x34,0x84, + + 0x1B,0x6D,0xD0,0xA6,0xBD,0x2B,0xE1,0xBB,0xED,0x99,0x6A,0x40,0x80,0x78,0xFA,0x87, + + 0xAA,0x4A,0xB0,0xF1,0xDE,0xCE,0x7D,0x8B,0xFC,0x5A,0xA1,0xCD,0x03,0x27,0xFA,0xE8, + + 0x93,0x80,0x18,0xBB,0xCA,0xBB,0xE0,0xBB,0x31,0x7A,0xDE,0x4C,0x85,0x26,0xA6,0xD2, + + 0x23,0x63,0x26,0xD6,0xFE,0xD0,0x22,0x6E,0x3A,0x55,0xAC,0xEF,0x16,0x2F,0xD1,0xEB, + + 0x8E,0x62,0x96,0x4D,0x55,0x22,0x56,0x98,0x86,0xEE,0xA9,0x0D,0x05,0x88,0xB3,0x58, + + 0x0F,0x41,0x81,0x7B,0x45,0x13,0xCC,0xA9,0x4F,0x23,0x89,0x53,0x1F,0x5D,0xD4,0x7E, + + 0x58,0x62,0x2F,0xC3,0x05,0x6B,0x69,0x99,0x8F,0xA5,0xAC,0x11,0x47,0x2C,0xC0,0x18, + + 0x0D,0xFF,0x05,0xB5,0xF9,0xCA,0x77,0x28,0x2B,0x85,0x35,0xD5,0x34,0x76,0xB7,0x21, + + 0xA0,0xFE,0x3F,0x40,0xE6,0x94,0x46,0x03,0xC1,0xEA,0xC0,0xAC,0xAD,0xA9,0xD5,0x92, + + 0x21,0xDD,0x8F,0xD1,0xB3,0xB0,0x77,0xD0,0x2C,0x49,0xAF,0xF0,0x99,0xA8,0xB2,0xB4, + + 0x76,0xFE,0x41,0xEF,0x97,0xB3,0x2B,0x21,0x44,0x55,0x62,0x0E,0xDA,0xFC,0x1E,0xD2, + + 0x06,0xD0,0xFE,0x3A,0xB1,0x41,0xC0,0x91,0xE1,0x04,0x46,0x95,0x62,0xC2,0x2F,0xA1, + + 0xD1,0x45,0x48,0x44,0xB6,0x2B,0x4A,0x83,0x23,0x98,0x16,0xCF,0x57,0x14,0xA2,0x5E, + + 0x5C,0xA9,0xFF,0x3A,0x31,0x54,0x63,0x5F,0x61,0xE7,0x8F,0x4C,0xB1,0x62,0x37,0x67, + + 0x68,0xE2,0xA1,0xD3,0x6F,0x66,0x0F,0x54,0x28,0x26,0xE7,0xB0,0xF1,0x6A,0x14,0x20, + + 0xE3,0x19,0xC9,0x73,0x70,0x25,0x31,0x32,0x90,0xFC,0x52,0x34,0x0B,0x95,0x9C,0x67, + + 0x61,0x78,0x35,0x2D,0x7D,0x86,0x7B,0x98,0x9F,0xF6,0x4E,0xC2,0xA4,0xC8,0xB8,0xB8, + + 0xE4,0xA5,0x7C,0x73,0xB6,0xF5,0x4D,0x26,0x9A,0x04,0x85,0x4F,0x27,0xB7,0x75,0x34, + + 0x7C,0xA8,0x19,0x63,0xF3,0x8A,0x45,0xAF,0x03,0xE0,0x09,0xCE,0xBD,0xB6,0x1C,0x7B, + + 0x1A,0xA3,0x2E,0xCC,0xE6,0x0C,0xEB,0x19,0x07,0x47,0x50,0x90,0xE2,0x97,0x69,0xA9, + + 0xD3,0x4D,0x5A,0x47,0x37,0xD0,0x64,0x2C,0x20,0x42,0xEF,0x81,0x7A,0xB9,0x71,0x0F, + + 0x18,0xA1,0x6F,0x0F,0x19,0xDA,0x40,0x7A,0x9B,0x7F,0xEB,0x6F,0x9A,0xB5,0x15,0x56, + + 0xCF,0x41,0xD9,0x7D,0x70,0x5E,0xDB,0x4B,0x3F,0x40,0x49,0x62,0xB7,0xC2,0xB3,0xA4, + + 0xAF,0x12,0x3B,0xB5,0x54,0x9F,0x33,0xBB,0x0B,0x24,0x40,0x5A,0x8D,0xD1,0x64,0x61, + + 0x0D,0x65,0xF2,0xA5,0xDA,0x50,0xFF,0x4B,0x43,0x41,0xCA,0x85,0x9A,0xD0,0xB2,0x80, + + 0x2D,0x1E,0x17,0xFB,0xDA,0x93,0x95,0x67,0x72,0x51,0x07,0x56,0x94,0xAF,0x53,0xA1, + + 0x33,0xB8,0xAB,0xA1,0xD1,0x73,0x1F,0x4C,0xE1,0x57,0xE3,0x90,0x39,0xB2,0x1A,0x2F, + + 0x2E,0xBF,0xBA,0xFD,0x49,0xB4,0xC0,0x26,0x3E,0x57,0xF4,0xF4,0x05,0x41,0x12,0xCA, + + 0x23,0xBE,0x84,0xD1,0x37,0x25,0x23,0xE3,0x9D,0xA8,0x7B,0xC1,0x9A,0xA4,0xB8,0x61, + + 0x27,0x00,0xFA,0x02,0x78,0xA7,0xB6,0x1A,0xC0,0x49,0x0A,0xE7,0x26,0xB7,0x6A,0xD5, + + 0xC8,0x63,0xA0,0x6E,0xF3,0x45,0x7B,0x4F,0x16,0xF3,0x6E,0xCC,0xC0,0x37,0x10,0x87, + + 0x43,0xD9,0x80,0x4B,0xC4,0x00,0x96,0x55,0x60,0xAC,0x84,0xEA,0x24,0xD5,0x03,0x64, + + 0x29,0xAC,0xD5,0x9C,0x3F,0xA9,0xC1,0xBC,0xE9,0x19,0x18,0xA9,0x85,0xE8,0x66,0xCF, + + 0xF4,0xEF,0x5C,0x8D,0x40,0xD2,0x82,0x09,0xFC,0xDA,0x06,0x4D,0xF4,0x3A,0x81,0x61, + + 0xA9,0x59,0xC4,0xE2,0x8A,0x7B,0xC0,0xB8,0x35,0x1A,0x20,0x18,0x33,0x76,0xC4,0x0E, + + 0xB8,0x1F,0xF8,0x09,0x18,0x31,0x21,0x93,0xA2,0xCB,0x7A,0x49,0xAF,0x1F,0xA2,0x4A, + + 0x2B,0x15,0xFE,0xDE,0x7B,0xE6,0x9F,0xFC,0x2F,0x0E,0x84,0x0F,0x43,0xA0,0xC0,0xA4, + + 0x43,0x2F,0x45,0x31,0x02,0xC5,0x6C,0x18,0x55,0x4C,0x7C,0x27,0x41,0xFF,0x9B,0x79, + + 0xF3,0x1D,0xFA,0x20,0x9B,0xEB,0x1A,0xFD,0xAF,0x1C,0x8D,0x6E,0x10,0x6E,0xB1,0xF1, + + 0x30,0x2D,0xDE,0x37,0x94,0xC2,0xD6,0xC6,0xA5,0x6F,0xE6,0x17,0xBF,0x41,0x1A,0x2C, + + 0xA6,0x20,0x57,0x65,0x52,0xC2,0x46,0xAC,0xAE,0x37,0xAE,0x54,0xAA,0x4C,0xB3,0xF2, + + 0x27,0xC2,0x9F,0xD2,0xFC,0xAF,0x57,0xD2,0x06,0x42,0x91,0xA2,0x3D,0x08,0x3E,0xE0, + + 0xFD,0x5E,0x52,0x68,0xFD,0x62,0x67,0xA8,0xD5,0x6C,0x73,0x92,0x22,0x1E,0x01,0xE2, + + 0xD0,0x3B,0xDA,0xF6,0xA2,0x0B,0x66,0x56,0xAD,0x05,0x63,0x58,0x2E,0xFF,0x9B,0xAC, + + 0xCF,0x32,0xB8,0x5E,0x1B,0x28,0x6E,0x4D,0x37,0x38,0x2C,0x28,0xC4,0xDA,0x47,0xFC, + + 0x79,0x22,0x70,0xB6,0xE6,0xE6,0xCA,0xD2,0xAE,0x69,0x71,0x20,0xF8,0x3A,0x16,0x40, + + 0x75,0x18,0x97,0x6F,0x6B,0x9F,0xAD,0xE0,0x66,0x18,0xEB,0x97,0x3C,0xD6,0x74,0x32, + + 0xE7,0x19,0xDC,0x3A,0xE9,0x0B,0x51,0xDB,0xA8,0x6E,0xA4,0x1A,0xB7,0x29,0x6C,0x2A, + + 0x09,0xA9,0xE7,0x2F,0xBC,0x56,0x0C,0xCB,0xAD,0x89,0xAC,0x4D,0x46,0x48,0x65,0x2E, + + 0x0C,0x1E,0xB5,0xFC,0xF4,0x07,0x6D,0x1C,0xEF,0x65,0x08,0x9E,0xB4,0x45,0xAA,0xD9, + + 0x0E,0xCD,0x95,0xD7,0xB3,0x74,0x93,0xB1,0x1D,0x5F,0x83,0xC0,0x34,0xF1,0x57,0x66, + + 0xB7,0x87,0x39,0x4E,0xE6,0x44,0xCD,0x5B,0xEF,0x33,0x49,0xDE,0x94,0x43,0xDB,0x0F, + + 0xBA,0x86,0xA1,0x21,0x77,0xA0,0x6C,0x4E,0xA4,0x4C,0x36,0xDE,0xFE,0x2D,0xE7,0x4F, + + 0xCA,0x83,0xB8,0x4F,0x98,0x3E,0xC8,0xCE,0x39,0x33,0xE2,0x6D,0xE6,0x43,0xEF,0x5F, + + 0xCB,0x11,0x95,0x63,0x6A,0xCC,0xC0,0xCA,0xA7,0x60,0x20,0x51,0xA0,0xEF,0x27,0x5A, + + 0xD9,0x31,0x08,0x23,0xE1,0xD3,0xE9,0xA6,0xD9,0xBE,0x4F,0xD9,0x1C,0xFD,0x03,0xED, + + 0xFC,0x0E,0xBD,0x65,0x05,0x6C,0xBC,0xA7,0x79,0x7C,0x03,0x87,0x15,0x5E,0x1D,0x7C, + + 0x51,0xF1,0x0E,0x4D,0x0F,0x13,0x53,0x8E,0xE7,0xB2,0x4A,0xD9,0xDA,0x2D,0x7D,0x9B, + + 0xE9,0x2E,0xFB,0xA2,0x5E,0x52,0x77,0x63,0xED,0x7C,0xAF,0xC9,0x9F,0x92,0x42,0xF2, + + 0xA2,0x30,0x76,0xD9,0x5A,0x1F,0x4A,0xCB,0xE9,0x52,0x44,0xFE,0x97,0x97,0x4A,0xAD, + + 0x84,0xD7,0xB4,0xD4,0x5C,0x02,0x7B,0x72,0xAF,0x54,0xF8,0x8B,0x56,0x77,0xF1,0xC4, + + 0x4F,0x4B,0xF4,0x54,0xDD,0x87,0x75,0xA3,0xC6,0xD5,0x0A,0x94,0xB5,0x7C,0x6E,0xAF, + + 0x27,0x27,0x69,0x5A,0x5E,0xDD,0xDD,0xE0,0xCB,0xB3,0xC3,0xAE,0x97,0x7C,0x30,0xE8, + + 0xD7,0x05,0x80,0x4A,0x08,0xBB,0x25,0xC5,0x0D,0x98,0xC8,0x8B,0xB4,0x60,0x04,0x4A, + + 0x8E,0x11,0x0B,0x6F,0x59,0xAF,0x58,0x4B,0x5D,0xD2,0xAF,0xA0,0xBB,0x0D,0xF3,0x71, + + 0x45,0x62,0x22,0x87,0xD7,0x1B,0x6F,0x73,0x87,0x3B,0xA2,0x91,0x90,0x0F,0x2E,0x68, + + 0x67,0x30,0x8F,0x32,0xD6,0x1A,0x19,0x7A,0xD9,0xD8,0x59,0xCD,0x16,0x5D,0x40,0xFA, + + 0xAA,0x38,0xB6,0xAC,0x7A,0x67,0x48,0x94,0xA6,0x21,0x09,0x9C,0x1C,0xA9,0x16,0xFD, + + 0xC6,0x60,0xEC,0x22,0x87,0x46,0x5E,0xE3,0xA7,0x5C,0x69,0xFF,0x94,0xFE,0xF3,0xCC, + + 0x47,0x43,0xD2,0x32,0x3F,0xBA,0x0F,0x6F,0xBE,0x07,0xDA,0x90,0x67,0x55,0x17,0x4A, + + 0x97,0x32,0xE7,0xC1,0xDB,0x4B,0xDF,0xE8,0xC3,0xBB,0xDA,0x5E,0x7F,0xCF,0x5E,0x3D, + + 0x08,0xAB,0x04,0x00,0x04,0x58,0xB8,0xAA,0x2B,0xD4,0x69,0x03,0xF1,0x1F,0x52,0x3F, + + 0x7D,0x54,0x08,0x1D,0xB8,0xA0,0x46,0x3F,0x0D,0x0F,0xC0,0x24,0xBA,0x19,0x51,0x2F, + + 0xEB,0x21,0x93,0x31,0xB3,0x42,0x11,0x32,0xD9,0xF6,0x3D,0xA1,0x80,0x8F,0x59,0x3A, + + 0xAB,0x41,0xE2,0x75,0x9D,0x63,0x78,0xC1,0xC9,0xE2,0xB9,0x6C,0xAE,0x43,0xF8,0xBF, + + 0x20,0xA9,0xB1,0x59,0xFA,0xD4,0x52,0x9A,0xA6,0xDB,0x74,0x95,0xF1,0x24,0xC8,0xAC, + + 0x03,0xD1,0x07,0x49,0x1E,0xD5,0xFB,0x9F,0x65,0x1A,0xE2,0xF3,0xA4,0xEE,0x43,0xBD, + + 0x8A,0x02,0xA1,0x58,0xA1,0xD6,0x58,0x8E,0x7F,0x39,0xEE,0xE1,0x82,0x79,0x03,0x2E, + + 0xC0,0xF5,0xDF,0x48,0xDB,0xF7,0xB7,0x9F,0xB0,0x18,0xDD,0xF2,0x2C,0x27,0x01,0x4D, + + 0xF7,0x6B,0x03,0xC1,0x2B,0x57,0x46,0xDB,0x62,0xC5,0x49,0x38,0x23,0x6E,0x1C,0x7A, + + 0xF6,0xD4,0x32,0xEF,0x54,0x3B,0xAF,0x05,0xFE,0x7C,0x8A,0x5E,0xEA,0x0C,0x65,0x6B, + + 0x7F,0xF7,0x3B,0xFE,0x8D,0x38,0x45,0x89,0x23,0x49,0xC8,0x2D,0x5A,0x22,0xDF,0xE7, + + 0x74,0xAA,0x33,0xEE,0xC4,0x39,0x4F,0xBD,0x99,0x23,0xA3,0xD6,0x75,0x66,0x3C,0x84, + + 0x39,0x33,0x7E,0x50,0xE4,0xFC,0xC6,0x83,0xDF,0x73,0xD1,0xD0,0x92,0x64,0xF2,0xAB, + + 0x10,0x16,0xC4,0x40,0x01,0x9D,0x70,0x92,0x36,0x52,0x84,0x9E,0x5F,0xD0,0xFB,0xBA, + + 0x99,0x1C,0xA2,0x51,0xB9,0xFE,0x0F,0x82,0xDC,0x51,0x73,0x7E,0xA4,0x0A,0xB1,0x3F, + + 0x60,0xC5,0x76,0x44,0x2D,0x9F,0x9E,0x8E,0x5A,0xA0,0x1B,0x65,0x68,0xE2,0x95,0x16, + + 0xE8,0x61,0x68,0x86,0x38,0x5C,0x05,0xB3,0x0C,0x14,0xAA,0x65,0x18,0x3A,0x52,0x02, + + 0x29,0xB5,0x4F,0xD3,0x3F,0x9E,0x62,0x80,0xCD,0x5C,0x8A,0xE8,0x9A,0xB9,0xE3,0x70, + + 0x6A,0x32,0x65,0x8C,0x4D,0xB8,0x33,0x95,0x6C,0x5F,0xEB,0xED,0x19,0xCA,0x1F,0x0F, + + 0x69,0xB2,0x83,0x17,0x05,0xB8,0x63,0x80,0xC3,0x85,0xA3,0x74,0x7E,0xD5,0xC0,0xD3, + + 0x29,0x1E,0x9A,0xCD,0x5E,0x24,0x15,0x06,0xC3,0x1B,0xB7,0x60,0x72,0xB4,0x4C,0xD2, + + 0x21,0x2E,0x9A,0xC1,0x96,0xD5,0x56,0x16,0x21,0x7A,0xE6,0x51,0x84,0x88,0x63,0x98, + + 0xF3,0x58,0xAC,0xCD,0x7E,0x26,0xE4,0x07,0x85,0x19,0xEA,0xD5,0xFA,0x89,0xB7,0xD8, + + 0x0E,0x9E,0x6E,0xC0,0x89,0xF7,0x63,0x12,0x59,0x78,0xCB,0x97,0x0C,0xAA,0xE1,0x79, + + 0xF2,0x08,0xBE,0x2C,0xD5,0xB8,0x69,0x30,0x6C,0x48,0x5E,0xEC,0x38,0x8D,0x1F,0xAE, + + 0xE1,0x28,0x26,0x84,0xBB,0x6C,0x14,0x7A,0xEA,0x1F,0x56,0xA3,0x60,0x62,0x3D,0x7A, + + 0x7A,0xBE,0x6F,0x95,0x38,0x7A,0xC5,0x30,0xEC,0xBA,0xDB,0xAF,0xFC,0x8F,0xB9,0x68, + + 0x41,0x1F,0xD5,0xFF,0x9B,0xF6,0xA8,0x9D,0x68,0x56,0xE7,0xCF,0x5E,0x7F,0xB3,0x28, + + 0x6A,0x2E,0x7A,0xD8,0xA6,0xFC,0xF1,0x0B,0x0F,0x73,0x02,0x12,0x93,0x74,0xCE,0x1E, + + 0x2F,0x1B,0xEE,0xCD,0x5F,0xBD,0xA7,0x1A,0xFC,0x52,0x09,0x40,0x90,0x19,0xFB,0xB9, + + 0x1E,0x15,0x13,0xDC,0x2D,0x9E,0x5F,0x0A,0xB8,0x51,0x40,0x1E,0x7E,0xD3,0x47,0xB7, + + 0xC8,0x3F,0x62,0xCD,0xC6,0xBF,0x2C,0x1B,0x4B,0x50,0xE5,0x7A,0x10,0xB9,0xB6,0xF1, + + 0x68,0x5D,0x18,0xF9,0x1A,0xE6,0xCF,0x87,0x8E,0xCD,0x49,0x01,0xF5,0x9F,0x0E,0x27, + + 0x81,0x2E,0x2C,0xD1,0x95,0x81,0xC7,0x4C,0x6B,0x1E,0xE0,0x97,0x3E,0x99,0x77,0x37, + + 0x6F,0x43,0x22,0x78,0xB6,0x4F,0xCA,0x5C,0xAC,0xCF,0x1D,0xA3,0x84,0x0F,0x8D,0x71, + + 0x6E,0x02,0x05,0x91,0x85,0x5E,0x86,0x02,0xA9,0x6C,0xBD,0x35,0xA5,0xF8,0x61,0x24, + + 0xED,0x6E,0xC1,0x5F,0x55,0x14,0xAA,0x95,0x2E,0x0B,0x14,0x95,0x90,0x6F,0x22,0xF2, + + 0xA6,0x95,0xDB,0x4E,0x34,0x35,0xAD,0x81,0xE4,0x6A,0xA6,0xE5,0x47,0x68,0x31,0x4B, + + 0x90,0x2B,0x22,0x5F,0x73,0x36,0x9B,0x95,0x56,0x09,0xF5,0xE0,0x3D,0x00,0x4F,0x97, + + 0x84,0x84,0x3D,0x5A,0x74,0xD7,0xCB,0x80,0x9C,0x68,0x87,0xE5,0x6A,0x18,0x96,0x68, + + 0xE7,0x29,0xF2,0x78,0x10,0xC6,0xA4,0x54,0x26,0x09,0x4F,0x48,0xB7,0xC2,0x48,0x1A, + + 0x0E,0xE9,0x2F,0xF6,0xAE,0xE4,0x2C,0x13,0xA6,0xF8,0xFB,0x58,0xB6,0x51,0x10,0x5E, + + 0x7D,0xE4,0x83,0x0E,0x11,0xEC,0x4D,0x1F,0xAF,0xDA,0xF2,0x49,0x37,0xA0,0xAB,0x13, + + 0x46,0x2F,0x54,0xBF,0x74,0xCB,0x01,0x8A,0xFD,0x64,0xFA,0x59,0x36,0x33,0x61,0x42, + + 0x8E,0x8E,0x16,0x43,0x35,0xDC,0xB0,0x98,0xC5,0x43,0x5E,0x9E,0x5C,0x1A,0x69,0x4B, + + 0xC7,0x55,0xDA,0x52,0x0C,0xFD,0xFB,0x9D,0xD2,0xA2,0xFA,0x8D,0x89,0x46,0x45,0x8A, + + 0x8D,0x8D,0xF4,0x43,0x73,0xFE,0x54,0x99,0xDB,0x41,0x8D,0xF0,0x3F,0x68,0x60,0x59, + + 0x9F,0x8B,0x68,0x56,0x1A,0x9F,0xD8,0x9C,0xC8,0xA0,0x9C,0x77,0x3E,0x40,0x1A,0xD7, + + 0x4F,0x9F,0xA6,0x40,0x20,0xB4,0x1C,0x40,0xE5,0xB4,0x6D,0x4E,0xCB,0xBD,0x12,0xB6, + + 0x06,0x13,0x1D,0x66,0x94,0x3B,0x62,0x70,0x75,0xD7,0x43,0x16,0x98,0x91,0x24,0xB1, + + 0x4F,0x17,0x25,0xC1,0xA0,0xB4,0x1D,0xA5,0x65,0xDC,0xCB,0x76,0xE6,0xBF,0x13,0xB6, + + 0x85,0x9E,0x7A,0x75,0xCA,0xB3,0x35,0x4C,0x44,0xD2,0x51,0xB5,0xFD,0x9F,0x1C,0x62, + + 0xD9,0x2B,0x24,0xC3,0xDC,0xD4,0xD2,0x00,0x1B,0xDB,0xAE,0xE7,0xF8,0x5B,0x04,0xD5, + + 0xA4,0x9A,0x0D,0xD2,0x09,0x95,0xAA,0x10,0x57,0xDA,0xC6,0x05,0xB5,0x09,0x0D,0x01, + + 0x25,0xD2,0x2B,0xC3,0x0D,0xF6,0xBC,0x01,0xAB,0xD9,0x13,0x16,0x3C,0xE6,0x05,0xB1, + + 0x81,0x97,0x86,0xD6,0xC4,0xD9,0x3E,0x11,0xE1,0xD5,0x40,0xA8,0x1C,0x21,0xA1,0xCC, + + 0xBE,0x33,0x7D,0x9A,0x47,0xBE,0x0E,0xAF,0x68,0x88,0x56,0xB7,0x81,0xFB,0x09,0x6B, + + 0xB1,0x59,0xBE,0xFC,0x8E,0xDC,0x7C,0x5A,0x61,0x99,0x9E,0xBA,0x02,0xF9,0x04,0x8B, + + 0x64,0xA2,0xFC,0x8F,0x3E,0xF2,0x2D,0x43,0x0F,0x97,0x0D,0xBF,0x83,0xDA,0xC7,0x11, + + 0x2D,0x2B,0x97,0x74,0x11,0xB6,0x3A,0x84,0xAF,0xD0,0x18,0x7A,0xCE,0xA4,0x66,0x35, + + 0x8E,0x63,0xA6,0xF1,0x36,0xD0,0x76,0xF7,0x91,0x2C,0x51,0x71,0x15,0x4A,0x4E,0x24, + + 0x07,0x22,0x49,0x9E,0x82,0xB6,0xC5,0xE7,0x8E,0x2D,0x4C,0xA1,0x14,0x18,0x6F,0x35, + + 0x0F,0x41,0xCF,0x0D,0x6A,0x4D,0x8A,0xF6,0x09,0x2E,0xF6,0x1C,0x2C,0x55,0x43,0x20, + + 0x8A,0x20,0xA9,0xC0,0x3B,0x6B,0x91,0xE6,0x76,0x2F,0xC7,0x0E,0x17,0xFB,0x5E,0x32, + + 0x40,0x4C,0x24,0xF7,0x9C,0x61,0x28,0x88,0xE3,0x01,0xB9,0x77,0xD4,0x7C,0x2F,0x11, + + 0x6A,0x75,0xB2,0xE2,0x82,0x9E,0xB8,0x3E,0xCD,0x4C,0xE0,0x13,0xC0,0xCD,0x60,0xF2, + + 0x50,0xA9,0x29,0x3A,0xA3,0xDD,0xE4,0x20,0xD4,0x76,0x38,0x76,0x5C,0x3E,0x8F,0xD7, + + 0x13,0x00,0xD7,0x37,0x4C,0x88,0x67,0xD3,0x6D,0x4E,0x39,0x7F,0x44,0xCF,0x48,0xF7, + + 0x61,0x24,0x48,0x41,0x71,0xD4,0xD2,0x0F,0x63,0x85,0xC0,0x84,0x1A,0x64,0x30,0x74, + + 0x8C,0x07,0xF0,0x04,0x17,0x2A,0x59,0x83,0x89,0xEE,0xB0,0xB6,0xD5,0x90,0x39,0xC3, + + 0x83,0x71,0xB9,0xC7,0x97,0x66,0x7B,0xB1,0x61,0xCE,0x8F,0x72,0xDA,0x66,0xFE,0x50, + + 0x0E,0x0B,0xF1,0x85,0x64,0x28,0x3E,0x79,0xA8,0x82,0x49,0xF1,0x8F,0x7C,0xE1,0xF3, + + 0x63,0xAE,0xA7,0x0C,0x73,0x0C,0x82,0xE8,0x0C,0xAC,0x36,0x62,0x87,0x55,0x54,0x2E, + + 0xD4,0xA2,0x0A,0x00,0xBA,0xA4,0x8A,0x97,0xBE,0xA9,0xC4,0x18,0x59,0xC2,0x0A,0xF8, + + 0x52,0x1A,0x7C,0x09,0xC0,0x40,0x6B,0x20,0x25,0x78,0x78,0x5A,0x58,0xBD,0xBD,0x7B, + + 0xE2,0xAE,0x6F,0x3A,0x2A,0xA6,0xA7,0xCA,0x6A,0x7B,0x0F,0x99,0x5C,0x2B,0x2A,0x56, + + 0xCC,0xF8,0xA2,0x08,0x56,0xA7,0xFD,0x99,0xA6,0x41,0x92,0x6C,0x5E,0x68,0x14,0xCA, + + 0x0F,0x80,0x48,0x3E,0x5A,0x6D,0x68,0x68,0xCE,0x5B,0x9A,0x78,0x5F,0x69,0xA5,0xB8, + + 0x40,0x4E,0x44,0xAF,0x18,0x66,0x0D,0x5A,0x4A,0xE5,0x57,0xE9,0x86,0xCF,0x35,0xC7, + + 0x60,0xF9,0xB3,0x3F,0xD8,0xF0,0x05,0x63,0xCB,0xE4,0xA3,0xF9,0x83,0x79,0xE4,0xBF, + + 0x04,0x67,0x86,0x76,0x77,0x34,0x2C,0x84,0x63,0x60,0x1D,0xB4,0xD3,0xCB,0xAD,0x97, + + 0x80,0x50,0xB6,0x96,0x2D,0x11,0xBE,0x52,0x71,0x9C,0x9C,0x48,0xF0,0x33,0x01,0x95, + + 0x38,0x56,0x81,0xD1,0x57,0xCC,0x28,0x90,0x64,0x4D,0xB5,0x5D,0xF0,0x89,0x45,0x95, + + 0x4C,0x52,0x0D,0x85,0xA1,0x31,0x8D,0x1E,0x16,0x03,0x1E,0xB9,0x0C,0xD2,0x67,0x31, + + 0xBE,0x54,0x04,0xD4,0x37,0x30,0x94,0xFD,0xC6,0xFF,0xD4,0xE4,0x72,0x74,0x33,0xA3, + + 0xC9,0xBD,0xCC,0xE0,0x00,0x3A,0x23,0x01,0xDC,0x07,0xDC,0xF4,0x73,0x75,0xAD,0x4B, + + 0x80,0xC0,0xC3,0xFA,0xF9,0x74,0xA8,0xF9,0xC0,0x49,0xD5,0xE5,0xF2,0x76,0x3F,0x31, + + 0xE7,0x9C,0x97,0xD0,0x14,0x76,0xF2,0x8A,0x3E,0x8B,0xDD,0xF5,0xF3,0x77,0xF3,0x76, + + 0x2C,0x75,0x96,0xCC,0xB8,0x3E,0x2B,0x99,0xEC,0x47,0x02,0x5F,0x54,0xA5,0xAA,0xEA, + + 0xA7,0x58,0x8A,0x1B,0x18,0xAE,0xA6,0x9C,0x80,0x3D,0xFE,0xFC,0x64,0xF2,0x97,0x82, + + 0x2C,0x4E,0x00,0x3B,0x59,0xE1,0xAF,0x5A,0x4B,0x4A,0xC1,0x89,0x13,0x3B,0xB0,0x82, + + 0x0A,0x9E,0x3B,0x62,0xFA,0xC8,0x8E,0x4A,0x65,0x66,0x1B,0x5F,0x7B,0x73,0x6D,0x26, + + 0x95,0x18,0xA6,0xAC,0x70,0x31,0x6D,0xB6,0x6C,0xAC,0xD6,0xEC,0x7A,0x7C,0xB9,0x87, + + 0x96,0xE1,0x30,0x5E,0xE6,0x82,0x0E,0x12,0x90,0xF6,0xDE,0xFC,0x7B,0x7D,0x45,0xE7, + + 0x5C,0x6B,0x6B,0x5F,0xBB,0x34,0xE7,0x18,0x55,0x8E,0xD7,0xED,0xFA,0x7E,0xE4,0xB7, + + 0x7E,0x11,0xF7,0x23,0xDB,0x33,0xA2,0x61,0x80,0x20,0xDF,0xFD,0xFB,0x7F,0x00,0xF3, + + 0xE4,0x00,0x44,0x21,0x15,0xC0,0x8C,0xAB,0x60,0xF4,0x8E,0x03,0x1E,0x81,0x28,0xE3, + + 0xDD,0xA1,0xA9,0xC9,0xF6,0xA5,0xDC,0xC1,0xE6,0x4A,0x86,0x13,0x1C,0xA0,0x89,0x89, + + 0xEF,0x16,0x5B,0x05,0x9C,0xED,0x91,0x2D,0x48,0x4F,0xE9,0x23,0x9E,0xA3,0x77,0x1C, + + 0xD7,0xCD,0xBC,0x65,0x1B,0xC6,0x3D,0xB4,0xE1,0xB4,0xE1,0xD1,0x57,0xEB,0x3E,0xD9, + + 0x16,0x2B,0x98,0xC2,0x4A,0x10,0x57,0x63,0x2D,0xB0,0xD0,0x09,0x82,0x3B,0xDE,0xA3, + + 0xEF,0xD5,0xB8,0x4A,0x01,0x10,0x9B,0x89,0xC5,0x39,0xAD,0xD6,0xA0,0x85,0x02,0xB0, + + 0x62,0x29,0x71,0xE7,0x8E,0xE7,0x32,0xA5,0x54,0xC5,0x56,0x98,0xBD,0x99,0x17,0x61, + + 0x02,0x91,0x20,0x68,0xDC,0xE5,0x41,0x54,0x6B,0xCA,0xA7,0x98,0x97,0x4C,0x43,0xAA, + + 0xDA,0x37,0xDB,0xDE,0x50,0x29,0x36,0xAA,0xA5,0x8C,0x76,0x4C,0x1D,0xF8,0x9E,0x78, + + 0xFA,0xEC,0x80,0xCE,0x41,0x21,0x9E,0x96,0xA6,0xAD,0xC2,0xBC,0x5C,0x91,0x43,0x54, + + 0x2D,0xEF,0xA0,0x45,0x11,0xC9,0x26,0xD8,0x48,0x67,0xCB,0x4D,0x9D,0xE8,0x13,0xE4, + + 0x0E,0x85,0xBB,0x55,0x11,0xA3,0x03,0xC8,0x6E,0xAE,0x81,0xDD,0x5F,0xE3,0x5D,0x14, + + 0xFF,0x50,0x64,0xCE,0xF7,0xF4,0x89,0x4D,0xEF,0x33,0x0F,0xEA,0x35,0x93,0xC1,0xFF, + + 0xDA,0x93,0xAE,0x2D,0x08,0xC1,0xEA,0xBD,0x4D,0x38,0xFA,0x7E,0x79,0xED,0x3A,0x5F, + + 0x03,0xED,0xA1,0x3E,0xD5,0xA5,0x1B,0xA9,0x48,0x3B,0xB5,0x4B,0xD6,0xEF,0x16,0xA8, + + 0x57,0x5B,0x89,0x5B,0x9E,0xFF,0x7F,0x3C,0x4E,0xC1,0xFB,0x7F,0xDF,0xEF,0x15,0x60, + + 0xF9,0x04,0xF4,0xF5,0x2C,0x3A,0xD0,0x51,0xC7,0xB5,0x3D,0xD4,0xD7,0x5D,0x0B,0x70, + + 0xC5,0x40,0x18,0xF6,0x3D,0x61,0xDB,0x41,0xC6,0x8C,0x87,0x56,0x35,0x7A,0x5D,0xB1, + + 0x94,0x4E,0x62,0x79,0x55,0xD4,0x08,0x24,0xC0,0xAF,0x21,0xF6,0xD0,0xE9,0xD6,0xB7, + + 0x6C,0x9C,0x02,0x47,0x34,0x12,0xDE,0xF7,0x46,0xEE,0x08,0xB5,0xF1,0x78,0x0C,0x44, + + 0xDA,0xD5,0x9A,0xC0,0xD7,0x37,0xF0,0x13,0xD9,0xD7,0xF4,0xE6,0x76,0xF4,0xC0,0x90, + + 0xA4,0x41,0x94,0xA8,0x77,0x3F,0x87,0xCD,0x98,0xDB,0xFC,0xF6,0x77,0xF5,0x89,0x43, + + 0x5A,0xB6,0xCA,0x34,0x3A,0x4B,0x25,0x09,0x1D,0x03,0xF5,0xE7,0xF6,0xF6,0x8F,0xCC, + + 0x69,0x3C,0x3A,0x55,0x6A,0x08,0x15,0x75,0x1B,0x96,0xFD,0xF7,0xF7,0xF7,0x5F,0xAD, + + 0x8D,0x89,0x9E,0xEE,0x8C,0xB0,0x51,0xEE,0xCF,0xC5,0x54,0x48,0x6C,0xB7,0x10,0x9C, + + 0x67,0xDD,0x57,0xEC,0xB3,0xDC,0x0C,0x8B,0xE9,0x76,0xF4,0x49,0xDE,0xF4,0x5F,0xD8, + + 0x0F,0x85,0xD6,0xFD,0x32,0xDF,0x54,0xFA,0x4F,0x9B,0xD7,0xEF,0xF2,0xF7,0x77,0x9F, + + 0xE7,0xFF,0xD6,0xED,0x33,0xDE,0x9F,0xC8,0x4E,0x78,0xF5,0xC0,0x5E,0xFD,0x00,0xC2, + + 0xCF,0x33,0x9E,0x4C,0x1F,0xCE,0xDE,0xD5,0x05,0xCB,0xF6,0xEE,0x7E,0xFC,0x89,0x2B, + + 0xF5,0x8D,0x02,0x5E,0xC3,0x9D,0x24,0xFB,0xCC,0x93,0xFE,0xFE,0x7F,0xFD,0x05,0xD1, + + 0x78,0x2A,0xBD,0xCE,0x1D,0xFF,0x73,0x69,0xEF,0xB1,0xF7,0xEF,0xFE,0xFE,0x11,0x41, + + 0xA9,0x9F,0x43,0x9D,0x3C,0x12,0x4E,0x3D,0x13,0xD9,0xFF,0xFF,0xAF,0xB9,0x80,0x00, + + 0x0C,0x4C,0x04,0x00,0x18,0x2E,0x6F,0xD8,0xC1,0xBF,0x43,0xCC,0x56,0xBD,0x51,0xEF, + + 0xE0,0xCE,0x90,0x11,0x15,0x01,0x47,0x32,0x32,0x41,0x45,0x36,0x2A,0x61,0xB6,0x85, + + 0xC0,0xB8,0x35,0x67,0xF1,0x38,0xEA,0xA5,0xC4,0x54,0x6B,0x2D,0x2D,0xAD,0x60,0xEA, + + 0xEA,0x06,0xE1,0x97,0x90,0x5B,0xC6,0x31,0xB6,0x4F,0xC2,0xB7,0xAE,0x63,0x38,0xC2, + + 0x01,0xE2,0x00,0x44,0x62,0xD1,0x22,0x80,0x06,0xCF,0xA8,0xE6,0x57,0x5D,0x31,0xB8, + + 0x09,0xCE,0xEE,0x59,0x97,0x81,0x5A,0x5E,0xB5,0x30,0x50,0xB1,0xF2,0xEF,0x79,0x31, + + 0x9A,0x0F,0xC4,0xC1,0x92,0xB7,0x7A,0x8F,0x7D,0x42,0xA9,0x42,0x71,0x60,0x4D,0xB9, + + 0x89,0xCA,0x48,0x52,0xEC,0x23,0xAE,0x2E,0x7E,0xBB,0x22,0x97,0x72,0xED,0xA9,0xE0, + + 0x08,0xF3,0xD8,0x09,0xBB,0x53,0xD2,0x2C,0x3E,0x53,0x49,0x6C,0x5E,0x28,0xE5,0xE2, + + 0x62,0x99,0xEA,0xE1,0x19,0xF2,0xA5,0xCE,0xCB,0x43,0x9A,0xC1,0x59,0xB2,0x03,0x7B, + + 0x2F,0x1A,0xC3,0xF4,0x98,0xB1,0xD3,0x57,0x2F,0x5A,0xF2,0xD4,0x58,0xF1,0x24,0xE8, + + 0xD1,0x0E,0xEA,0x99,0x9D,0x3D,0xFD,0xC9,0x8D,0x44,0xFB,0xB9,0xDD,0xB8,0x1A,0xA7, + + 0x0C,0x0C,0x19,0x44,0x9D,0x2B,0xF9,0x06,0x9F,0x42,0xAD,0x8E,0x87,0xB1,0x58,0xDC, + + 0x4B,0xA5,0xBA,0x82,0xF4,0x6F,0xF9,0x70,0x97,0x7D,0xBA,0x3C,0x75,0xE6,0x16,0x29, + + 0xEE,0x05,0x73,0xFF,0xB4,0x62,0x3B,0xEF,0x36,0x0F,0x7C,0xE9,0xD6,0x98,0x71,0xB6, + + 0x70,0x90,0xCB,0xE4,0x44,0x20,0x78,0x75,0x13,0x3F,0xDF,0x9F,0xFF,0xD3,0x04,0x80, + + 0x78,0xF8,0x84,0x7C,0xB2,0xCB,0xAB,0x94,0x87,0x42,0xEC,0x83,0x13,0x58,0xDE,0xB0, + + 0x26,0xE9,0x0C,0x1E,0x4A,0x38,0xA6,0x38,0x24,0x58,0xE4,0x93,0x12,0x69,0x4F,0x28, + + 0x82,0x11,0x85,0x79,0x10,0x70,0xAE,0x15,0x07,0x42,0xED,0x82,0x93,0x18,0x02,0x1D, + + 0xDA,0x02,0xD6,0x95,0xCE,0x33,0x1C,0x33,0xE8,0xBE,0xE5,0x92,0x10,0x7C,0xF3,0xC1, + + 0xAF,0x18,0xC4,0xFC,0xCE,0x64,0xBB,0x0E,0xE7,0xF3,0x60,0x9B,0xD1,0xC9,0xAA,0x21, + + 0xE9,0x55,0x49,0x50,0x33,0xA4,0xDD,0xF7,0x14,0x51,0xBC,0xB0,0x4E,0x7A,0x2D,0xDF, + + 0x64,0xE2,0x05,0xC5,0xC2,0xC3,0x73,0xEC,0x66,0xF2,0x11,0x60,0xB1,0x85,0x13,0x43, + + 0xA7,0x9A,0xEB,0xDC,0x37,0x93,0x82,0xE1,0x64,0x50,0x4D,0xEB,0xE3,0x83,0xD9,0x89, + + 0x2E,0x78,0x5D,0x0E,0x3E,0x78,0x4C,0x47,0xCB,0x5C,0xF6,0xE8,0x0C,0xF5,0x6E,0x58, + + 0xE7,0x92,0x74,0x94,0xC4,0xF6,0x26,0xC8,0x24,0x50,0xE6,0x3E,0x7A,0x9F,0x19,0xFB, + + 0x43,0x18,0x54,0x65,0xBE,0xE7,0xEC,0x2B,0x68,0x9B,0xEF,0x2F,0xF9,0x22,0x0D,0x7B, + + 0x2B,0x33,0x04,0xFD,0xA9,0x3D,0x9B,0xBD,0xE1,0x55,0xA7,0xCD,0xB5,0x72,0x38,0x56, + + 0xC1,0xEA,0xC7,0xCB,0x9B,0x59,0xE6,0x5A,0x44,0x19,0xD3,0x2A,0x90,0x30,0x2D,0x2B, + + 0xCF,0xB2,0x23,0x36,0xBE,0x3A,0xB1,0x0A,0x6D,0x5D,0x76,0x5F,0x04,0x7C,0x19,0x52, + + 0xBA,0xB1,0x38,0x49,0xBA,0xAF,0xA1,0x4C,0x6F,0x59,0x27,0x69,0xBA,0xD6,0xF9,0x28, + + 0x43,0x4F,0x27,0x7E,0xBD,0x5F,0x08,0x27,0x12,0x21,0x1F,0xFD,0x8B,0xF2,0x7E,0x1F, + + 0x54,0x2B,0xFF,0x86,0x67,0xA0,0x50,0x62,0x59,0x4B,0xE9,0xA3,0xA9,0x21,0xD7,0x16, + + 0x05,0x59,0x68,0x12,0x63,0xBA,0x67,0x32,0x36,0xCD,0x42,0x3E,0xB0,0xF3,0x04,0x03, + + 0xEF,0xA6,0x7E,0x07,0xE3,0xA4,0x35,0xC1,0xFB,0xC6,0x4B,0xAF,0x21,0x21,0x96,0xEE, + + 0x95,0xE0,0x69,0x69,0x72,0xB3,0xE6,0x33,0xB2,0xCB,0x33,0x57,0xC5,0xE5,0x9F,0xBC, + + 0x00,0xC4,0x0D,0x3C,0x93,0xA3,0x98,0xD1,0xC3,0x83,0x4F,0x3D,0xAF,0x6E,0x13,0xAD, + + 0xF0,0xC7,0xE9,0x49,0x0F,0x31,0xB8,0x72,0x37,0x30,0xCA,0x89,0xD5,0xAD,0xDB,0x31, + + 0x39,0x39,0x09,0xE4,0xB2,0x72,0xD9,0xC0,0xB9,0xB5,0x75,0x96,0x75,0xE4,0xED,0x66, + + 0x66,0x78,0x68,0x4C,0x8B,0xE9,0x39,0xF7,0xC7,0x56,0xD9,0x15,0x60,0x82,0xC2,0xBC, + + 0x8B,0x8F,0x1D,0xF8,0x49,0xA1,0xF2,0x2E,0xDE,0x73,0xBE,0x59,0x3F,0x97,0xBA,0x1E, + + 0x10,0x0B,0xF0,0xF1,0xBE,0xAD,0x3A,0xC6,0xCC,0x8B,0x9A,0x0A,0x3E,0x21,0x8B,0xA9, + + 0x53,0x65,0xA2,0x8D,0x95,0x47,0x13,0xD3,0xCC,0x31,0xCB,0x2D,0x2B,0xEC,0xBB,0xF9, + + 0x21,0xCA,0x50,0xF2,0xBC,0x10,0xBB,0x87,0xFE,0xA9,0xC3,0x18,0xBE,0x73,0x99,0xCE, + + 0x02,0x30,0x94,0x08,0xB8,0xEE,0xC5,0x62,0x48,0xCC,0xCA,0xBE,0x83,0x93,0x68,0x63, + + 0x09,0x8D,0x35,0x5A,0x19,0xAD,0x7A,0x42,0x30,0xDD,0x47,0x23,0xA0,0xEB,0xA3,0x5B, + + 0xCC,0xCC,0xE1,0x1E,0x1B,0x89,0x60,0x54,0xD6,0x8C,0x4A,0x3E,0x7D,0x31,0x3C,0x7F, + + 0x00,0x8D,0xF8,0x2D,0x60,0xED,0x93,0xD9,0x4A,0xC8,0x73,0x7D,0x2A,0xE0,0x80,0xE0, + + 0x65,0x10,0xA8,0xF1,0x57,0xCF,0x80,0xC0,0x05,0x28,0xCD,0x24,0x7D,0x96,0x76,0x93, + + 0x86,0x97,0xEC,0x97,0x0A,0xB5,0x54,0x95,0xC4,0x58,0xDC,0xF7,0xB9,0x7A,0x5D,0x01, + + 0xA1,0x63,0xDD,0x85,0x43,0x19,0x2D,0xA6,0xE0,0xF2,0x8D,0xF7,0xF0,0xFD,0xA5,0xAF, + + 0x06,0x95,0xF2,0x97,0xC6,0xB5,0xB2,0xD3,0xE9,0x93,0xB9,0x55,0x77,0xF9,0x1A,0xF0, + + 0xA3,0x82,0x99,0x42,0x76,0x9E,0x49,0xA4,0xC4,0x9A,0x0B,0x62,0x76,0x65,0x35,0xC6, + + 0xAA,0xF6,0x53,0x46,0x16,0x85,0xDB,0xFB,0xB7,0x85,0xEF,0xC9,0x6F,0xB7,0x5A,0x9D, + + 0x57,0x4A,0x75,0x99,0x4F,0x6A,0x01,0xC7,0x32,0xC6,0x42,0xEF,0xF0,0xF6,0xC6,0x76, + + 0x72,0x89,0xEF,0x37,0xCB,0xB1,0x5A,0xFE,0x60,0x70,0xFD,0xCF,0x72,0xF0,0x6E,0x1D, + + 0x4F,0x38,0x9C,0x71,0xCB,0xFA,0x32,0x68,0xC0,0xD5,0x50,0xCC,0x1D,0xE8,0x74,0x9B, + + 0x8E,0xFC,0xF5,0x9E,0x42,0xB9,0xBE,0xBB,0xEE,0xBC,0x1A,0xDC,0x3E,0x86,0x5F,0x09, + + 0xAD,0xC2,0x27,0x05,0xC7,0xBE,0x2D,0xFB,0xCD,0xBA,0xAF,0x45,0x7E,0xD2,0x15,0x79, + + 0x92,0x9F,0x74,0x1D,0xBB,0xFB,0x07,0xCB,0xF4,0xD2,0xC7,0xDD,0xBC,0xEB,0x1B,0x39, + + 0xF6,0x48,0xEE,0x6B,0xDF,0xB3,0xDE,0x4C,0xEB,0xFB,0x1E,0x4D,0x78,0x9C,0x86,0x50, + + 0x0D,0x4B,0xD6,0x0E,0xE0,0xB2,0x6D,0x88,0x90,0x9F,0x6E,0xB8,0xD5,0x06,0x44,0x3A, + + 0x32,0xDE,0x77,0x4D,0xBB,0xD4,0xA8,0xEE,0xE8,0xDE,0x8A,0x6B,0xBE,0xD4,0x10,0xA8, + + 0x45,0x37,0x8F,0x9B,0xCE,0x32,0x7F,0xC3,0x13,0xCF,0xF9,0x7B,0xFF,0x6E,0xDF,0x15, + + 0x87,0x07,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0xE0,0xB2, + + 0xA5,0x86,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0xA9,0xA3, + + 0x5F,0x5D,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0xE9,0x11, + + 0x04,0x04,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x12,0x08, + + 0xED,0x49,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0xCA,0x08, + + 0x40,0x45,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0xEB,0xBA, + + 0x0D,0x4D,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x7F,0xE4, + + 0xA8,0x49,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x74,0x46, + + 0x8A,0xEF,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x8E,0x14, + + 0x21,0x80,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x95,0xC7, + + 0x0A,0xE9,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0xA5,0x33, + + 0x26,0x34,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x96,0xCE, + + 0x82,0xE3,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0xA6,0x3A, + + 0xAE,0x3E,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x05,0x0D, + + 0xA8,0x8B,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x9F,0xBD, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x3A, + + 0x81,0x87,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x55,0x96, + + 0x45,0xAB,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0xC9,0xA0, + + 0x82,0xE2,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0xB9,0x55, + + 0x2F,0x78,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x24,0x8E, + + 0x0C,0x19,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x9A,0xA8, + + 0x23,0xC5,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0xFC,0x03, + + 0x0B,0x8D,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x5B,0xC4, + + 0x62,0xC7,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x8F,0x95,0x80,0x00, + + 0x0C,0x4C,0xF9,0xE6,0x92,0x08,0x0A,0x28,0x63,0x78,0x15,0xE2,0xBA,0x2C,0x51,0xEF, + + 0xE0,0xCE,0xF0,0x76,0x50,0x31,0x30,0xCF,0xB6,0x03,0x4D,0xB0,0x55,0x90,0xB6,0x85, + + 0x80,0xD1,0x25,0x67,0xD3,0x5D,0xCC,0x23,0x3B,0xD9,0x61,0x63,0x7A,0x99,0x60,0xEA, + + 0x03,0x27,0xF1,0x97,0x92,0xC5,0x1D,0xD8,0xBA,0x47,0x46,0x34,0xD7,0x23,0xD0,0x1B, + + 0xFF,0xB8,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x30,0xD0, + + 0xE3,0xFA,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x7E,0x91, + + 0x8E,0xAD,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x29,0x15, + + 0x03,0x0A,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x0A,0xF5, + + 0x89,0xD3,0xD8,0xE7,0xBB,0x33,0x49,0x28,0x37,0x48,0x05,0x13,0x48,0x2A,0xE5,0xE2, + + 0xDE,0x56,0xCA,0x6A,0x3A,0x56,0xDD,0xD0,0x43,0x94,0x5A,0x38,0x25,0x92,0x8C,0x7B, + + 0x2B,0x6F,0xC3,0xF9,0x90,0x31,0xC8,0x6B,0xCE,0x6A,0x13,0x10,0x24,0x5A,0x55,0x3B, + + 0x5C,0x10,0x0B,0x1D,0xAF,0x45,0xE1,0x31,0x34,0x84,0x9A,0xFB,0x7B,0x27,0xBB,0x6F, + + 0xAB,0x86,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x32,0xA6, + + 0xB6,0xF5,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0xEC,0xA6, + + 0x3F,0xA6,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0xB4,0xDB, + + 0x8E,0x0B,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0x05,0x77,0xD0,0x7C,0x3C,0x24,0x68,0xA2,0x79,0xCF,0xF5,0x77,0xDE,0xB0, + + 0x26,0xE9,0x27,0x7C,0x75,0x5D,0xE6,0x38,0x94,0x92,0xA3,0xEA,0x8C,0xF3,0x4F,0x28, + + 0x82,0x11,0xE4,0xFE,0x65,0xAF,0x4C,0x25,0x1D,0x93,0x7D,0x06,0xD4,0xAE,0x02,0x1D, + + 0xDA,0x02,0x59,0xCB,0x9F,0xEF,0xE7,0x59,0xE7,0x9E,0x85,0xBC,0xB1,0x78,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xD9,0x89, + + 0x2E,0x38,0xEF,0x67,0xD3,0x8C,0x57,0xFC,0x49,0x48,0x01,0x2E,0x79,0x1B,0x36,0x70, + + 0x27,0xD6,0x0E,0x5A,0xAB,0x3A,0xE3,0x5A,0xE9,0x86,0x16,0x79,0xD8,0xF3,0xA9,0x0B, + + 0xAB,0xFC,0x24,0x97,0xD3,0x4E,0x77,0xE8,0x05,0xD1,0xAD,0x4F,0xDC,0x7C,0x55,0x6B, + + 0x0A,0x1D,0x6C,0x66,0x50,0x9C,0x25,0x51,0xE7,0x94,0x70,0x5F,0x7B,0x33,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0xFF, + + 0x04,0x0D,0xE0,0x39,0x1C,0xCC,0x50,0xE2,0x8A,0x4B,0xC0,0xF9,0xE3,0xAC,0x76,0x0A, + + 0xDC,0x2A,0x0F,0x81,0x7E,0x07,0xB5,0xC2,0x4D,0xCE,0x9E,0x3A,0xD9,0x3A,0xD9,0x0B, + + 0x5B,0x1D,0x89,0xC5,0x40,0x64,0xCB,0xC1,0x46,0xCA,0xC7,0x34,0xC8,0xA6,0x2E,0x31, + + 0xEE,0x73,0x29,0xE6,0x57,0xE3,0xE4,0x31,0xBE,0xC3,0x99,0xCA,0x95,0xAD,0xDB,0xA0, + + 0xAA,0x79,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x22,0xEF, + + 0x85,0xCD,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x19,0x38, + + 0x88,0xE4,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0xF4,0xB1, + + 0xA3,0x7A,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x21,0xFB, + + 0x94,0x88,0x98,0xFD,0xCA,0x07,0x69,0x68,0x33,0xC8,0xC2,0x08,0xBE,0x8B,0x2A,0x46, + + 0x09,0xF1,0xD4,0x84,0xF6,0x6C,0x67,0xC3,0xCD,0x52,0xCA,0xE1,0xBE,0xAB,0x7D,0x08, + + 0x73,0xCA,0x44,0xFE,0x46,0xBA,0xE8,0x6B,0xCA,0xEA,0x03,0x98,0xF2,0xA6,0x69,0x3F, + + 0xA9,0x8B,0xD5,0x28,0xF6,0x0E,0x3B,0xC6,0xCD,0x10,0x3B,0x87,0x0A,0x56,0xBD,0x42, + + 0x20,0xCA,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x1A,0x85, + + 0xE0,0xCC,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x91,0x8D, + + 0x2C,0xC2,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x13,0x7C, + + 0xAB,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x28,0x85, + + 0x85,0x18,0xAA,0x34,0x17,0x70,0x54,0x62,0xAA,0x5B,0xAF,0xD4,0xD7,0xF6,0xBB,0x62, + + 0x2D,0x9E,0x8C,0x86,0x81,0x66,0xAF,0xC0,0xC6,0xD7,0xC4,0x34,0x70,0x9B,0x27,0x61, + + 0x26,0xDA,0xFF,0xDD,0x03,0xCD,0xCB,0x41,0x66,0x9A,0x3D,0xCE,0x57,0x97,0x4D,0xD7, + + 0xD1,0x9C,0x18,0x28,0x68,0xCE,0x35,0xFF,0x46,0xD5,0x85,0x67,0x02,0xFC,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x46,0x4A, + + 0xE2,0x13,0x09,0xD0,0x89,0x64,0x3A,0x2D,0xCD,0x50,0x8E,0x7E,0x87,0xF7,0xA7,0x6A, + + 0x25,0x96,0x3E,0x80,0x2D,0x4D,0x98,0x4A,0x65,0xD6,0x3E,0xBF,0xFF,0xF1,0x59,0x69, + + 0x2E,0x92,0xCF,0x4D,0x3A,0x4F,0xB7,0x49,0x6E,0xF2,0x18,0xD1,0x21,0xB8,0x9B,0xE9, + + 0x0E,0x56,0xAA,0x85,0xA9,0x0F,0x5F,0x7B,0x23,0x50,0x6B,0x4F,0xF5,0xF4,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x46,0x75,0x80,0x00, + + 0x0C,0x4C,0x88,0x49,0x73,0x00,0x6E,0xA0,0xC0,0xF3,0x26,0xD5,0xB8,0x30,0x51,0xEF, + + 0xE0,0xCE,0x88,0xE9,0x11,0xFA,0x41,0xB5,0x26,0x48,0xA7,0x6A,0xA0,0xBD,0xB6,0x85, + + 0x80,0x91,0xF9,0xFC,0x10,0xB9,0xAE,0x93,0x74,0xD2,0xEF,0x17,0x55,0x74,0x60,0xEA, + + 0xEA,0x06,0xA1,0x91,0x99,0x6A,0x18,0xC5,0xC1,0xE8,0xC0,0x21,0x5C,0x00,0x15,0x9E, + + 0xFB,0x7A,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x3C,0x74, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x7C,0x07, + + 0x20,0x48,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xA9,0xE0, + + 0x08,0xF3,0xDB,0x98,0xE5,0xE9,0x52,0x29,0xC8,0xF9,0x39,0x89,0x8D,0x76,0xE5,0xE2, + + 0x62,0x99,0x70,0x14,0xFC,0x3B,0x43,0xBD,0x6B,0x44,0xB9,0xCD,0xC5,0x29,0x03,0x7B, + + 0x2F,0x1A,0x79,0x85,0x6D,0xE9,0x29,0xDA,0xCA,0xB7,0xEE,0xDE,0x00,0xBE,0x24,0xE8, + + 0xD1,0x0E,0x01,0x7D,0x93,0x30,0x19,0xCD,0x69,0x4F,0x73,0xB7,0xFB,0xBD,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0xE4,0x44,0xF2,0xBB,0xEE,0xD2,0x53,0xB2,0xB7,0xA8,0xA8,0x00,0xDE,0xB0, + + 0x26,0xE9,0x48,0xF6,0x72,0xDE,0x46,0xB1,0xC2,0x57,0x34,0x17,0x0E,0x02,0x4F,0x28, + + 0x82,0x11,0x7A,0x67,0x32,0x3A,0xEF,0x23,0xE5,0xA3,0x7D,0x16,0x75,0x35,0x02,0x1D, + + 0x92,0xF1,0xF5,0xF7,0xF2,0xCE,0x95,0x8D,0x42,0x55,0x5D,0xB5,0x81,0x86,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xDC,0x84, + + 0x1B,0xFA,0xFE,0x0E,0x39,0xDF,0x1E,0xE5,0xCB,0x5E,0xD6,0x28,0x78,0xE9,0x6E,0xD8, + + 0x27,0x14,0x86,0x33,0x9A,0x39,0xDA,0xCE,0x9E,0x49,0x8D,0x83,0x61,0x3B,0xC5,0xFF, + + 0x8B,0x45,0xDD,0x8C,0x1B,0x3C,0x1F,0xE5,0x4B,0x41,0x20,0xA5,0xFE,0x7A,0x05,0x91, + + 0x0A,0x16,0xD1,0x8A,0xB1,0x3B,0xA5,0x46,0xDA,0x79,0x9F,0x85,0x86,0x6B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x7E,0x1F, + + 0x54,0x2B,0x66,0x70,0x50,0xCC,0xB0,0xD6,0x65,0xD0,0xCF,0x55,0xBE,0x48,0xD7,0x16, + + 0x05,0x59,0xC8,0x57,0xF8,0x2A,0x82,0x75,0x4B,0xC8,0x93,0xD8,0xEA,0xE5,0x04,0x03, + + 0xEF,0xA6,0xC3,0x02,0x95,0x14,0xEB,0x23,0xF7,0xD0,0xC3,0xC7,0x90,0x69,0x96,0xEE, + + 0x95,0xE0,0x54,0xF5,0x15,0x7C,0x7B,0xDB,0xC3,0x4E,0xBB,0x19,0x23,0x96,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xC2,0xBC, + + 0x8B,0x8F,0xC2,0x4A,0x68,0x25,0xA0,0xDC,0x5E,0x43,0x45,0x71,0xE1,0x14,0xBA,0xF8, + + 0xA1,0xC8,0xF0,0x1B,0xBE,0xAF,0x78,0x48,0x29,0x06,0xD2,0xB8,0xA1,0xA8,0x8B,0xA9, + + 0x53,0x65,0xDB,0x8D,0x9D,0xD2,0x73,0x9F,0x2B,0xD1,0x18,0x41,0x09,0xE4,0xBB,0x1B, + + 0x8D,0x8B,0xA3,0x53,0x7C,0xA4,0x7A,0xCB,0xCF,0x08,0x18,0x37,0x01,0xDB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x2E,0x02, + + 0x87,0x96,0x84,0x6D,0xBB,0xB2,0x8E,0x58,0x74,0x1D,0x5C,0x04,0xF1,0xF7,0x6D,0x64, + + 0x16,0xB3,0xC4,0x88,0xF3,0x45,0x38,0x08,0xE7,0xD9,0x9A,0xBB,0xF1,0x55,0x6D,0x11, + + 0x05,0x89,0x12,0x86,0x39,0xBE,0x4A,0x4E,0xC4,0x90,0x5A,0x49,0x71,0x55,0xF7,0xF1, + + 0xB5,0x58,0x4B,0x66,0x7F,0xF3,0xB0,0xC1,0x46,0x68,0x3C,0xB0,0x82,0xF7,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x62, + + 0x3E,0x55,0xF8,0x1C,0x38,0x35,0x16,0x50,0x93,0x03,0x69,0xBE,0xFB,0xFF,0x77,0x1F, + + 0x4A,0x95,0xF0,0x05,0x2D,0x16,0x67,0x2B,0x98,0x16,0x48,0x1B,0xF8,0xFE,0xD8,0x39, + + 0x7D,0x0A,0xD9,0x11,0x57,0x4C,0x1F,0x2F,0xE4,0x93,0x07,0x1D,0xD2,0xBF,0x2E,0x6F, + + 0xAD,0x16,0xCC,0x6C,0x59,0x14,0x3E,0xC4,0x0A,0xDD,0x50,0x4D,0xFB,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x29,0x22,0x59,0x0E, + + 0xE5,0x0B,0xC8,0x90,0xF9,0x89,0x40,0x06,0xAD,0x22,0xEE,0x18,0x56,0x62,0x46,0xAA, + + 0xD5,0x72,0x5E,0x53,0xCF,0x29,0xDC,0xC3,0x6B,0xEC,0x5B,0x47,0x78,0xE3,0x81,0x60, + + 0xB4,0x40,0x93,0xFB,0x6F,0x8F,0x6F,0x81,0x29,0x61,0x25,0x56,0xBE,0x6B,0xAE,0xA9, + + 0x87,0x21,0x09,0x54,0xFD,0x61,0x8E,0x0F,0xB5,0x58,0xE6,0x46,0xE3,0x0F,0xBF,0xF1, + + 0x3C,0xAB,0x99,0xA8,0xB7,0xA4,0x68,0x10,0x4A,0x4F,0x10,0xE5,0xF7,0x11,0xC8,0x31, + + 0x67,0xA8,0x08,0x31,0x2F,0xD0,0x8B,0x41,0xE2,0xBA,0xC0,0xB4,0x1C,0x30,0x94,0x32, + + 0xEC,0x0D,0x39,0xC1,0x90,0x9D,0xD1,0x00,0xA6,0xEB,0x1E,0x0A,0x5D,0xC0,0x18,0xB1, + + 0x87,0x2E,0x9A,0x6B,0xAD,0x65,0x67,0xC8,0xC5,0x45,0x96,0x1B,0x5C,0xC1,0xB1,0x8C, + + 0x0A,0x38,0xC6,0xBA,0x72,0x5B,0x92,0x76,0xEC,0xA5,0xF5,0xEC,0x1A,0x2A,0x74,0xB4, + + 0xE0,0xA0,0x8C,0xAC,0xF0,0x80,0x63,0xCB,0x67,0x9D,0xE4,0x85,0xD4,0xC4,0x7D,0xA0, + + 0x24,0x07,0xFD,0xB4,0x91,0xCB,0xD7,0x77,0xC6,0x54,0xD7,0x9B,0xB2,0x19,0xF6,0xF5, + + 0x89,0xDE,0x99,0x1C,0x66,0xA6,0xCB,0x4B,0x22,0xC8,0xC8,0xA2,0x32,0x63,0xD0,0xCC, + + 0x00,0xCB,0x88,0x34,0x9A,0x6E,0x57,0x9B,0x3A,0x29,0x19,0xAC,0x0B,0x11,0x91,0x58, + + 0xE2,0x9E,0x1E,0x2F,0x3D,0x6F,0x52,0x49,0xEA,0xB2,0x63,0x41,0x5D,0x6F,0x15,0xE4, + + 0x61,0xBD,0x2F,0x3E,0xFC,0x88,0x6B,0x9A,0xB2,0xE3,0x2C,0xE9,0xD0,0x9D,0x5D,0x28, + + 0x60,0x07,0x8B,0xAD,0x9A,0xEF,0x65,0xC4,0xCD,0x4D,0xDB,0x8E,0xAF,0x0A,0x66,0x84, + + 0x23,0x32,0x96,0x7B,0xCF,0xBD,0x10,0x46,0x48,0x02,0x73,0x64,0x76,0x32,0x8E,0x14, + + 0x29,0x76,0xCC,0xA3,0xD8,0xD2,0x08,0x9B,0x49,0xBF,0xCF,0x27,0x18,0xDE,0xC5,0x00, + + 0xB6,0xA9,0xD7,0x7A,0x47,0x70,0x01,0x1D,0xC8,0xC8,0xD5,0x03,0x7D,0xDF,0x52,0x99, + + 0xA7,0x31,0x95,0x8D,0x3E,0xB5,0x09,0x5A,0xE7,0x51,0x95,0xC6,0xCF,0xF5,0xC2,0xB3, + + 0x48,0x5B,0x94,0x5C,0x36,0x10,0x4E,0xE2,0xF0,0x5C,0xB2,0xD9,0x8D,0xA9,0x50,0xD0, + + 0xAC,0xB8,0x96,0x4A,0x5B,0x36,0x98,0x0A,0x9E,0x37,0x62,0xE1,0xFE,0xF8,0x44,0xB2, + + 0xC4,0x59,0x90,0xB7,0x59,0x35,0x49,0x9F,0x46,0xBB,0xB3,0xD9,0x05,0x75,0x9F,0x42, + + 0x8D,0xBA,0xB3,0xD3,0x52,0xB4,0x22,0x82,0x93,0x12,0x3A,0x0A,0x12,0xA1,0xC2,0x71, + + 0x24,0x1C,0x82,0x4C,0x3C,0x10,0xA2,0xDB,0x41,0xDA,0x96,0x5F,0x06,0x50,0x51,0x8D, + + 0x2F,0x39,0x82,0xA9,0x71,0xBA,0x79,0x78,0x23,0xF4,0x80,0x47,0x0A,0x79,0x84,0x0D, + + 0xA2,0x48,0x11,0x09,0xBA,0x7D,0x68,0xDA,0xDA,0x36,0xC8,0xBC,0x9A,0xD7,0xFB,0x80, + + 0xAF,0x39,0xB1,0xA1,0x1D,0xD6,0x03,0x89,0x1E,0xE4,0x89,0xDF,0x06,0xE6,0x96,0x4C, + + 0x28,0x97,0x6F,0x3F,0xB6,0x31,0xE8,0x6D,0x9D,0xF1,0x2D,0xAB,0x87,0xDA,0x70,0x64, + + 0xC8,0x16,0xF4,0x2F,0x4B,0x92,0x8C,0x86,0x19,0xF2,0x45,0x76,0x78,0x37,0x0F,0xCD, + + 0x83,0xDF,0x9F,0xC9,0x32,0xEF,0x40,0x6C,0x92,0xF1,0x83,0x1D,0x7A,0x61,0xCB,0xAA, + + 0xD1,0x90,0xD8,0xAE,0x99,0x9E,0x09,0x3E,0x02,0x9C,0x5E,0xFF,0x0F,0x0F,0xF5,0x3D, + + 0x76,0x3F,0x60,0x86,0xDE,0x0D,0x0E,0x92,0xC9,0x46,0x8E,0x8B,0x82,0x4F,0xE9,0x0D, + + 0x37,0x54,0xCA,0x17,0x16,0xE1,0x38,0xC2,0xBA,0x6E,0xEA,0xC6,0x51,0x40,0x7A,0x03, + + 0x82,0xC2,0xF0,0x67,0xDE,0xCC,0x30,0x63,0xC0,0xE2,0x66,0x66,0xAF,0x42,0xFC,0x2C, + + 0xF7,0x3F,0xA5,0x22,0x7C,0x30,0x6E,0xC0,0xB3,0x6E,0xEA,0xC4,0xA7,0x6E,0xDB,0xF3, + + 0x38,0x2B,0x20,0xC6,0x6D,0xE6,0x75,0x9C,0xEA,0xC9,0xC8,0x95,0x2A,0x8A,0x28,0xAB, + + 0xA6,0x0C,0xEC,0x74,0x33,0x2E,0x1E,0x4B,0xAE,0x54,0xE2,0x74,0xE4,0x48,0xB6,0x02, + + 0xFD,0xC4,0x7D,0x6A,0xDE,0x25,0x8E,0xA4,0x2F,0x95,0x97,0x5E,0x3F,0x77,0x6D,0xB3, + + 0x83,0xAE,0xED,0xB5,0x6B,0x34,0x63,0x71,0x74,0x6A,0x6A,0x07,0x57,0xF1,0x9F,0x51, + + 0x7F,0x88,0xC4,0x7F,0xF7,0x7B,0x60,0x98,0x5C,0xC8,0xE4,0x83,0xB7,0x9B,0xFC,0xBA, + + 0x1F,0xBB,0xD4,0xA7,0x14,0x48,0x5A,0x5A,0xBB,0x68,0xF9,0x4D,0x74,0x6B,0xE3,0x0F, + + 0x9A,0x3E,0x9D,0xA2,0x5E,0xAA,0x3B,0x2F,0xC5,0x2B,0x73,0xAE,0xB3,0xE0,0x72,0x14, + + 0x68,0xE7,0xAD,0xAF,0x74,0x02,0x03,0xDE,0xC5,0x17,0x44,0x4C,0xEF,0x87,0xF0,0xCE, + + 0x04,0x59,0x51,0xE3,0x18,0x44,0x27,0x1A,0xCE,0xDA,0xFA,0x7A,0x96,0x3D,0x2A,0x33, + + 0x0E,0x5D,0x8D,0x3C,0xF4,0x8E,0xAB,0xE5,0xBA,0x44,0x3A,0xFF,0xAE,0xE0,0xA3,0xCB, + + 0x96,0xCC,0xF4,0x6B,0x1C,0xAA,0x7B,0x8B,0x41,0x63,0xE0,0x7C,0xA2,0x5F,0xAB,0xDB, + + 0xF9,0x85,0xB3,0x5B,0x17,0x16,0x5B,0x91,0x26,0xFC,0x00,0x58,0x7E,0x83,0xE0,0x7B, + + 0x6C,0xD2,0x60,0x75,0x12,0x1D,0x0A,0x0A,0xE9,0x66,0x74,0x26,0xBE,0x5D,0xEC,0x96, + + 0x33,0x45,0x92,0xAB,0xC1,0x60,0x02,0x0A,0x19,0x7E,0xF8,0x43,0x76,0x81,0x21,0x24, + + 0xDF,0x82,0x32,0x02,0x5F,0xD1,0x3D,0xA7,0xED,0x33,0xE4,0xC7,0xF6,0xB0,0x7D,0x8C, + + 0x8F,0x88,0xF4,0x92,0x60,0xF6,0xEE,0xCD,0x65,0x92,0x7D,0x37,0x53,0x5E,0x7C,0x4B, + + 0xCF,0x47,0xDC,0xF7,0x97,0x35,0x12,0x43,0x8F,0xD7,0xD4,0xC1,0xFB,0xEF,0x3B,0x56, + + 0x25,0xA5,0xBE,0x9D,0xDC,0xD1,0x2B,0x76,0x6D,0x00,0xC2,0xCE,0x71,0xF7,0x73,0xA1, + + 0x59,0x3B,0x5D,0x34,0x32,0x3B,0xB5,0x63,0x85,0xDE,0x83,0x81,0x3C,0x47,0x96,0xF4, + + 0x06,0xFB,0x2D,0xC7,0x8C,0x43,0xBD,0x73,0xFF,0x95,0xF3,0x37,0x89,0x7C,0x0E,0xEC, + + 0x0F,0xE8,0x18,0x0B,0xE9,0xDA,0x30,0x1A,0x85,0x71,0xE5,0x97,0x97,0xF0,0x77,0x76, + + 0x88,0xF7,0x90,0xA3,0xE3,0x16,0x6C,0x45,0x6B,0xDB,0xEC,0x4E,0x8A,0x58,0x7E,0x8D, + + 0x09,0x65,0xCE,0x65,0x43,0xD6,0x25,0x54,0x13,0x57,0x8C,0xAD,0xC8,0x5A,0xC8,0xDB, + + 0xFD,0x36,0x38,0xEC,0xC9,0x6D,0xDD,0x3F,0xE7,0x30,0xEC,0x4C,0x8F,0x70,0x00,0x7E, + + 0xC7,0x3F,0xFE,0xD0,0x61,0x08,0x36,0x83,0x6F,0xDD,0xE8,0xDF,0x5C,0xE3,0xEE,0xBB, + + 0x4B,0xB4,0xCE,0xB8,0x57,0xB0,0xF8,0x89,0x05,0x92,0xA8,0x03,0x77,0xBF,0xA7,0x4B, + + 0x87,0x96,0x2C,0xD5,0xE5,0xA5,0xB7,0x6B,0x98,0xD4,0x4F,0x3F,0xA2,0xF5,0x7F,0x5F, + + 0xAD,0x24,0xF9,0xBD,0xDF,0xC5,0x7E,0x88,0x89,0x90,0xF6,0x50,0xCC,0xFB,0xB8,0xFF, + + 0x06,0x22,0x40,0x84,0x0F,0x28,0x6E,0x09,0xBD,0x2C,0xC8,0x20,0x42,0x2D,0xBC,0x63, + + 0x79,0x0E,0x94,0x84,0x78,0xC0,0x34,0x6D,0x72,0x6B,0xA6,0xE8,0x38,0xDB,0xF2,0x72, + + 0xF0,0x0D,0x01,0x46,0xEA,0x8F,0x73,0x3C,0xC1,0x02,0xC9,0x21,0x59,0xD1,0x53,0x1E, + + 0xFD,0x1C,0x91,0x85,0xE6,0x23,0xA1,0xD1,0x9D,0x2D,0xC1,0x2D,0x5C,0xCE,0x38,0x67, + + 0xFF,0x0B,0xBE,0x68,0xCE,0x55,0x2F,0x1E,0x30,0xDB,0xEF,0x82,0x31,0x47,0x12,0xAF, + + 0xA4,0x69,0xB1,0x32,0x30,0x44,0x63,0xF4,0x41,0x75,0x17,0x06,0xF0,0xC8,0x1B,0x4E, + + 0xFA,0x19,0x9B,0x91,0xFA,0xC7,0x6E,0x50,0x63,0xB9,0xC7,0x50,0xD4,0x44,0xF6,0xC3, + + 0x7C,0xDA,0xEE,0x53,0x43,0x43,0xA2,0x56,0x62,0xB8,0x4F,0xF1,0xD1,0x4B,0x58,0xF7, + + 0xAF,0x64,0xBC,0x21,0x70,0x81,0x4B,0x9B,0xED,0xEE,0x8A,0xBF,0x07,0x06,0x34,0x20, + + 0x68,0x0D,0x4A,0x9C,0x15,0x6B,0x5A,0x69,0x48,0x09,0xB6,0x85,0xD4,0xC4,0x3D,0x30, + + 0x4A,0xF5,0x7C,0x73,0xF2,0x7B,0xDE,0x5A,0xDF,0x08,0xF1,0x3D,0xD9,0x2A,0x69,0x1B, + + 0x8A,0x3B,0xCB,0xD0,0x98,0x6B,0x37,0x64,0x28,0xE4,0x50,0xAE,0x82,0x05,0x58,0x4A, + + 0xC8,0x08,0xFA,0xB2,0xB6,0x21,0xBE,0xE7,0xBF,0x1A,0x12,0xED,0xCF,0x2E,0xF2,0xA7, + + 0x68,0x79,0xB0,0xBC,0x1F,0x00,0xF1,0x27,0xF6,0xB1,0x16,0x0F,0x37,0x2F,0x0B,0x45, + + 0xB9,0xCA,0xB9,0xAD,0x9E,0xF3,0x5B,0x7D,0x1F,0x13,0x93,0x32,0xDC,0x4C,0x5C,0xB3, + + 0x76,0x40,0xE5,0x46,0x1F,0xBB,0x65,0xC8,0xA3,0x5F,0x9B,0xF4,0xDD,0x4D,0x3F,0x13, + + 0x11,0x1A,0xBA,0xA9,0xFA,0x99,0x32,0x42,0x54,0xFF,0xDB,0x5B,0x91,0xF6,0x72,0x96, + + 0x42,0xE6,0x8C,0x10,0x33,0x51,0x22,0x98,0xEC,0xF7,0x33,0x04,0x71,0xAE,0x14,0x71, + + 0x53,0xA3,0x7A,0xF6,0x84,0xB4,0x80,0xD3,0x0B,0x43,0x95,0xFA,0x90,0x52,0x5E,0x62, + + 0x2D,0x1E,0x4D,0x15,0xAE,0x3B,0x03,0xF1,0xE5,0x7F,0x5D,0xB4,0x5F,0x68,0xD1,0xB3, + + 0x1E,0x1D,0xD5,0xE3,0x93,0x9B,0x0E,0x78,0xC1,0x52,0x67,0xCC,0x74,0x2D,0xDD,0xD3, + + 0xB2,0xB5,0x68,0xB6,0x84,0x50,0x24,0x18,0xAF,0x18,0x4A,0xB3,0xB1,0x85,0xC5,0xC2, + + 0x33,0xB6,0xD0,0xDE,0x36,0xA2,0xFF,0xF3,0x81,0xD4,0xFD,0xF4,0x9E,0xDB,0xDB,0xD2, + + 0x0B,0x56,0xF5,0x27,0x90,0x77,0x26,0xF9,0x46,0xE8,0x95,0xF1,0x7A,0x58,0x5E,0x18, + + 0xD1,0xB9,0x06,0xCF,0x42,0x7A,0x9B,0x2C,0x62,0x6C,0x36,0xCA,0x83,0x14,0x4E,0x91, + + 0x9E,0x7C,0xF6,0x8F,0x09,0x83,0x49,0xCB,0x55,0xF8,0x9E,0xFC,0x6D,0x62,0x3F,0x76, + + 0x59,0x58,0xC3,0x86,0xDB,0x1A,0x2F,0xC9,0xEC,0x76,0x28,0x36,0x0D,0xFC,0x37,0x76, + + 0xAF,0x39,0xA9,0xB5,0xEE,0x9F,0x27,0x46,0x00,0x0A,0xD5,0x4D,0xF1,0x34,0xE1,0x78, + + 0xF2,0xBF,0x7F,0x3E,0x19,0x55,0xE1,0xE5,0x9E,0x0C,0x46,0x9E,0x91,0x9D,0x0A,0x61, + + 0xD6,0xBC,0x6E,0xC6,0xB7,0x00,0xDF,0xE7,0x77,0x46,0xE0,0xC9,0xF6,0x8B,0x6A,0xA6, + + 0x33,0x5C,0x9A,0xC8,0xA0,0x8A,0x97,0x81,0x0A,0x8A,0x8E,0xEF,0x5F,0x81,0x4A,0x26, + + 0x5A,0xCC,0x0F,0x5D,0xE9,0xE2,0x7A,0x9F,0x18,0x4F,0x97,0x7C,0x98,0x0B,0x79,0x00, + + 0xA1,0x01,0x8C,0xBF,0xFD,0xB1,0xA6,0x51,0x28,0xAC,0xD2,0x36,0x55,0xF0,0xD0,0xFA, + + 0x85,0xCC,0xBE,0x74,0xEA,0x0C,0x14,0x6F,0x26,0x87,0xE0,0x32,0xDC,0x52,0x84,0xE9, + + 0x6D,0x33,0xB9,0x96,0x7D,0xD3,0x57,0x42,0xC5,0x82,0x8F,0x47,0xBD,0x18,0x2B,0xF5, + + 0xCD,0x80,0x38,0xB2,0x62,0x28,0x2F,0x06,0x2E,0x87,0x15,0x44,0xF4,0x45,0x39,0x9B, + + 0x00,0x04,0x44,0xB6,0xE9,0xAB,0x0E,0x6A,0xFF,0x65,0x59,0xE2,0x54,0x47,0x7D,0xD6, + + 0x0D,0xC8,0xFE,0x63,0xA4,0x28,0x61,0x72,0xC5,0xC1,0x6E,0xF2,0x55,0xAF,0x7E,0xB3, + + 0x99,0x27,0x55,0xA5,0xF5,0x2A,0x74,0x90,0xDE,0x86,0x31,0xE6,0xD9,0x4B,0x33,0x43, + + 0xEF,0xB6,0x11,0x34,0x5E,0x0A,0x76,0x11,0x06,0x4D,0x39,0xF6,0x42,0xA5,0x1C,0xAA, + + 0x81,0x0E,0x21,0x8A,0x1E,0x18,0x08,0x9A,0xF8,0x67,0x7D,0xD1,0xBD,0x6E,0x23,0x68, + + 0xF6,0x16,0x2A,0x5D,0x67,0x04,0x16,0x77,0xA4,0x28,0xC5,0x4C,0x23,0x76,0xA4,0xCB, + + 0x88,0xA3,0x63,0x8F,0x83,0xA2,0x97,0x49,0xEF,0x8A,0xB3,0x70,0xBC,0xCA,0x87,0x60, + + 0x47,0xB2,0x3D,0x7F,0xDF,0xC7,0x1D,0x4A,0x6E,0x4E,0x17,0x4C,0x8A,0x4D,0x1C,0x63, + + 0x3D,0x88,0x74,0xCA,0x1C,0x93,0xF6,0x1A,0x42,0xC5,0xB2,0x74,0x58,0xCE,0xC6,0xC8, + + 0x53,0x87,0x15,0x2D,0x73,0xEF,0x20,0xEF,0xEC,0xA8,0x63,0x3C,0xA7,0x9C,0xDB,0x5B, + + 0x29,0xC3,0xDB,0xB1,0x32,0xA3,0x31,0xE9,0x0B,0x1F,0x3F,0x6D,0x8A,0xAC,0xAB,0x4A, + + 0xBF,0x2F,0xAF,0x4A,0x3E,0x00,0x21,0xF2,0x6C,0xAA,0xC8,0x53,0x23,0xDE,0x1F,0xEC, + + 0x87,0xF5,0x32,0x5B,0xFC,0x51,0xF4,0x22,0x7C,0x4F,0xED,0xE4,0x17,0x72,0x2C,0x93, + + 0x75,0x95,0xF5,0x85,0xC4,0xFE,0x65,0x4A,0xC0,0x67,0x43,0x71,0x46,0xE5,0x98,0x61, + + 0xFC,0x25,0xBD,0x6F,0x83,0xFD,0x81,0xC1,0x1F,0xBC,0x4D,0x4F,0xC3,0xBF,0x82,0xB7, + + 0x44,0x88,0xAC,0xEC,0x12,0x3E,0x06,0x37,0xE7,0x7B,0x5F,0xF7,0xF1,0x0E,0x4B,0xBD, + + 0xFF,0x0B,0x9C,0xE1,0xCB,0xBB,0xCC,0x19,0x9A,0x64,0xE2,0xD3,0xC5,0xB9,0x57,0x56, + + 0x25,0xA5,0x7D,0xD1,0x8E,0xF7,0x4E,0xEC,0x37,0x21,0x3C,0x22,0x65,0x55,0x5A,0xF2, + + 0x07,0x69,0xC3,0xEA,0x32,0x12,0xC6,0xFB,0xE0,0xCF,0xED,0xF6,0x0A,0x17,0xDD,0xA4, + + 0xA9,0x48,0xAD,0x7F,0xB1,0x95,0x7A,0xD7,0x06,0x78,0x6B,0xF5,0x1E,0xEC,0x6C,0x6C, + + 0x1F,0x9C,0xFF,0x80,0xDB,0x4D,0x3E,0xAE,0xE5,0x6B,0x4C,0x46,0xB4,0xB5,0x77,0x98, + + 0x88,0x66,0xE4,0xE6,0x3B,0xB0,0x2F,0xDA,0x3D,0x52,0xE7,0xBC,0xD8,0x46,0xDF,0x0F, + + 0x81,0x59,0x32,0xB1,0x88,0xF8,0x09,0xDA,0xAE,0x73,0x4C,0xA7,0x59,0x05,0x39,0xF9, + + 0xC5,0x96,0xAF,0x77,0x79,0xF6,0xFF,0x3F,0xEF,0x6B,0x7F,0x3E,0x0B,0x26,0xD2,0xA8, + + 0x20,0xE3,0x2A,0xA5,0x1D,0xF1,0xE0,0x99,0x02,0x9E,0x96,0x1A,0x81,0xE7,0x3C,0xA5, + + 0x01,0x3B,0x97,0xB8,0xC4,0x36,0x05,0x89,0x03,0x9F,0xC0,0xF2,0xF2,0x9F,0xCE,0xB5, + + 0x3B,0x6B,0xBD,0x1B,0xD6,0x5F,0x37,0x30,0x16,0x9A,0xD7,0x89,0xDF,0x1E,0x57,0x25, + + 0x52,0x2E,0xC5,0xEE,0xD3,0xA0,0x3F,0x94,0x13,0x9B,0xA6,0x7D,0x18,0xBE,0xA3,0xB4, + + 0xDC,0xE3,0xE6,0xB0,0x11,0x70,0x94,0x25,0xC3,0x4D,0x92,0x77,0x50,0x60,0x6E,0xDD, + + 0xE8,0x5B,0x77,0x67,0x77,0xA2,0x70,0x52,0xFA,0x4F,0x1B,0xC7,0x0D,0xC5,0xED,0xE9, + + 0x5E,0x4F,0xBF,0xB0,0xF0,0xDD,0xEC,0xE3,0x61,0x1D,0x91,0x25,0x31,0xCD,0xC9,0x91, + + 0xC8,0x09,0x76,0xEB,0xB5,0x9F,0x21,0xDB,0xC7,0x03,0x56,0x3D,0x38,0x73,0x9D,0x41, + + 0xE3,0xBB,0x74,0x26,0x7A,0x95,0x57,0x93,0x1A,0x56,0xE8,0x84,0x09,0xC9,0x00,0x41, + + 0x13,0x24,0x64,0xD1,0xE4,0xD8,0x5B,0xF4,0x49,0xAA,0x4A,0x07,0x2F,0xEF,0x9E,0x40, + + 0x84,0xCF,0x3E,0x36,0xE2,0xF5,0xE9,0xF2,0x92,0xE9,0xC6,0xB5,0x25,0x6F,0xEA,0xD3, + + 0x46,0x0F,0x0D,0xAA,0x13,0x25,0x99,0x61,0x09,0x2B,0x22,0x15,0xF3,0x25,0xC3,0x8A, + + 0x91,0x21,0x3D,0x57,0xC9,0xF5,0xE8,0xAA,0x8D,0xC0,0x7E,0xBF,0x79,0x62,0x34,0xAD, + + 0x98,0xF4,0x66,0x67,0xDB,0x29,0xCC,0x09,0x15,0xE6,0xA4,0x35,0xD6,0xCF,0x3B,0xF6, + + 0xA9,0x68,0xA8,0x7F,0x27,0x75,0xD3,0x39,0x30,0xE7,0xCA,0x3E,0x83,0x5A,0x22,0x11, + + 0x09,0xAB,0xB0,0x8F,0x9D,0x23,0x9C,0x4A,0xAF,0xE8,0x50,0xFD,0x90,0x29,0x82,0x58, + + 0x31,0x17,0x02,0xCD,0x9A,0x8D,0x92,0x78,0x2C,0x46,0x96,0x10,0x38,0xB3,0x2A,0x0E, + + 0x0A,0x4F,0x19,0xA2,0x1D,0x0F,0x9A,0x68,0xB3,0xE0,0x3D,0x0F,0x23,0xBB,0x46,0xCD, + + 0xCA,0x54,0xD4,0xB2,0x73,0xBF,0xD1,0xED,0xC0,0xA1,0x28,0xAA,0x33,0xBF,0x0B,0x7D, + + 0x09,0xC3,0xC2,0xD9,0x91,0xE9,0xD8,0x2B,0x78,0xC5,0x93,0xFC,0xE8,0x3B,0xD2,0x04, + + 0x22,0x21,0x80,0xC4,0x2A,0xBD,0x72,0x11,0x9F,0xDB,0xAE,0x4B,0x0B,0x8F,0xF7,0x14, + + 0x2D,0x71,0x73,0x16,0xF4,0xC0,0xDC,0xD9,0x3D,0x3D,0x80,0x24,0x8E,0xDC,0xB2,0x88, + + 0x53,0xAD,0x92,0x7A,0x41,0xB1,0x17,0x32,0x82,0x8D,0x55,0xD1,0xF3,0xDF,0x65,0xF3, + + 0x1E,0x1D,0x4D,0x14,0xCD,0x71,0x27,0x2E,0x1E,0xD8,0x85,0xF2,0x2F,0x79,0xD4,0x42, + + 0xE7,0x9C,0xE2,0x26,0x59,0xD5,0xF7,0xD8,0xBE,0xE5,0xB4,0xB2,0xBA,0x79,0xC8,0xCE, + + 0xC2,0xE4,0x88,0xFC,0x10,0x75,0x67,0xBE,0x65,0x77,0xDB,0x76,0xF3,0x1C,0x85,0xD1, + + 0x99,0x54,0x42,0x54,0xDE,0x74,0xF8,0x9A,0x7F,0x0A,0x79,0x77,0xC1,0x7C,0x33,0xC8, + + 0x56,0x94,0xF9,0xF4,0x7B,0x6E,0x7D,0x0E,0x6C,0xF1,0xE5,0xD5,0x16,0xB7,0x3E,0x66, + + 0xAB,0x15,0x82,0xDF,0xC5,0x49,0x14,0x36,0x9F,0x5B,0x95,0xBF,0x59,0x68,0xCE,0x9C, + + 0xCE,0x1F,0xD5,0x9D,0x42,0x39,0xE1,0xBA,0x47,0x37,0x29,0xCD,0x7F,0xB0,0x7A,0x4B, + + 0x09,0x05,0x7A,0xF3,0x8E,0x65,0xA9,0x01,0x09,0x85,0xAD,0x42,0x83,0x5A,0xA5,0xD9, + + 0xAF,0x9B,0xEF,0xCB,0xCD,0x36,0x21,0x08,0x23,0x68,0xD7,0xAE,0xD8,0x6B,0x42,0x3B, + + 0x7A,0x5E,0xD7,0x48,0x38,0xCB,0x41,0x96,0xA0,0xCD,0x8C,0x94,0x12,0x6D,0x41,0xBA, + + 0xD4,0x91,0xF6,0x2F,0x5D,0x7F,0x57,0x03,0xE4,0xA0,0x72,0x6F,0x4E,0x77,0xDD,0xE7, + + 0x28,0x1A,0xFF,0x3E,0xD0,0x5B,0x5F,0xE4,0xEC,0x7C,0xA9,0xC5,0x13,0x6F,0x8B,0x5C, + + 0xE8,0x7F,0x8F,0x86,0x1A,0x90,0x38,0x87,0x39,0x55,0x5B,0xEE,0xCE,0x6E,0x8B,0x45, + + 0x0A,0x5C,0xE5,0x74,0x6C,0x5F,0xB3,0xD1,0x10,0x81,0xF4,0x9F,0xA9,0x41,0xFE,0x0C, + + 0x63,0x87,0x02,0xB6,0x13,0x83,0x1B,0x86,0x9D,0x22,0x43,0x11,0xF4,0x1E,0xE5,0xC9, + + 0x3F,0x2D,0x9A,0xB7,0x63,0xA4,0x92,0x93,0x18,0x61,0xB4,0xA3,0xD6,0xE2,0x83,0x53, + + 0x83,0x03,0x3E,0x93,0x9D,0x0F,0x03,0x02,0xAB,0x6C,0x79,0x5F,0xD5,0x4E,0x68,0xC6, + + 0x46,0xBF,0x45,0x40,0x82,0xC0,0x08,0x28,0x77,0x6B,0x30,0xE7,0x75,0x67,0xFF,0xA1, + + 0x1B,0x58,0x90,0x72,0xFE,0x3F,0x32,0x6F,0x56,0x6A,0xA8,0xE9,0xBE,0x14,0xA1,0x46, + + 0x52,0x0B,0x5A,0xA5,0x3A,0x5B,0xF2,0x10,0x9A,0x4A,0x0A,0x99,0x59,0x4B,0x3B,0x52, + + 0x6C,0xD7,0xF1,0x4A,0x15,0x6B,0xFE,0x34,0x05,0x18,0x1A,0x37,0x9B,0xFC,0x44,0x60, + + 0x8D,0x85,0x1F,0x33,0xA3,0xF5,0x67,0x59,0x2A,0x4B,0xB3,0x5F,0x7D,0xE3,0x02,0x78, + + 0xB0,0x85,0xF5,0x1E,0x92,0x14,0x04,0x8A,0x8F,0x49,0x39,0xCD,0x4D,0x44,0x1E,0x49, + + 0x2D,0xD7,0x70,0xE1,0xEF,0xEA,0x48,0xD8,0xFE,0xA6,0x26,0x5C,0x83,0xE3,0x13,0x25, + + 0xEB,0x7E,0xC9,0x1F,0x6C,0x2D,0x73,0xA2,0x40,0x46,0xA5,0xCD,0x9D,0x14,0x02,0x1C, + + 0x4F,0xCE,0xC4,0x2C,0x91,0x2A,0x4C,0x76,0x8C,0xCC,0x83,0x08,0xB5,0xFD,0xAA,0x4A, + + 0x18,0x8B,0xF8,0x52,0xBC,0xA9,0xA0,0x85,0x6B,0x60,0x25,0x1C,0x7D,0x20,0x61,0xA2, + + 0xBD,0xBE,0xBA,0x8F,0x82,0xA3,0x2A,0x4D,0xCF,0xAE,0xD3,0x63,0x5C,0xEA,0xC1,0x0B, + + 0x89,0x8D,0xED,0x2D,0x1D,0x63,0xFC,0x8D,0x8B,0x8E,0x7F,0x8E,0xEF,0x2C,0x13,0x00, + + 0xE1,0x18,0x5B,0x7A,0x34,0xF2,0x0A,0x12,0xAE,0xC3,0xB2,0xAF,0xF4,0x77,0x04,0xF0, + + 0x9C,0x9D,0xAB,0xBB,0x8A,0x6C,0x5A,0x1B,0x9A,0x7C,0xC2,0xBF,0x4A,0x0E,0xE5,0x93, + + 0x6E,0x8F,0xE1,0x37,0xB2,0xF0,0x3D,0x8B,0x0D,0x71,0x8B,0x7E,0xD5,0x82,0x15,0xFD, + + 0x24,0x9E,0x7C,0x69,0x68,0xCE,0x6F,0x20,0xD7,0x0C,0x87,0x4C,0x8A,0x0C,0x34,0xA0, + + 0x72,0xF8,0x32,0xE1,0x97,0x1B,0xB2,0x66,0x6C,0xD0,0x47,0xDF,0x8A,0x25,0xE9,0x21, + + 0x3B,0x87,0x92,0xD1,0x96,0x1A,0xC7,0x61,0x17,0xDF,0x3C,0x32,0x73,0x21,0x3C,0xC9, + + 0x03,0x30,0xB4,0x43,0xB4,0xC8,0x8A,0xA4,0x2C,0x67,0xC2,0x53,0x06,0x55,0xD5,0x40, + + 0xB3,0x38,0xFA,0xF0,0x16,0x18,0xE9,0x77,0xED,0xCF,0xA9,0xE8,0xD1,0x22,0x9B,0xC8, + + 0x8D,0x4D,0x09,0xAA,0xBE,0x74,0xF6,0xC3,0x30,0x75,0x76,0xDA,0x7F,0x55,0x6E,0xB3, + + 0xD1,0x89,0xAE,0x9E,0x3D,0xB9,0x6F,0x06,0x9A,0xB5,0x75,0xF9,0xA3,0xF3,0xF5,0xB4, + + 0xC2,0xD8,0xAF,0x0B,0xFC,0x16,0x62,0x96,0x13,0x77,0xA9,0x3F,0x03,0x57,0x54,0x60, + + 0x5A,0xD9,0xCF,0xC9,0xFC,0xF9,0x80,0x28,0x83,0x06,0xBC,0xAC,0xAA,0xCB,0xE7,0xB5, + + 0xEF,0xFE,0x75,0x4A,0x3C,0x81,0x09,0xAD,0x93,0x6A,0x61,0xD1,0x5C,0x49,0x3E,0xB8, + + 0x7B,0xF1,0x79,0xF9,0x9E,0x12,0xDB,0xFC,0xFB,0xB9,0x36,0xFA,0xAB,0x9E,0xA3,0x4E, + + 0xED,0xBE,0x99,0xC8,0x1F,0x11,0xCC,0x71,0xED,0xCC,0xA6,0xD5,0x90,0xBC,0x36,0xD5, + + 0x0A,0x39,0xBF,0x5B,0xB5,0xC5,0xCB,0xDC,0x4E,0x00,0x58,0x4F,0x0B,0xDC,0xB7,0xA4, + + 0xF0,0x63,0x2C,0x81,0x6C,0xDF,0x2E,0x91,0x8A,0x63,0x50,0xA5,0xD7,0x22,0xA4,0x5F, + + 0xFC,0x7D,0x53,0x14,0x72,0xAD,0x4C,0x23,0x23,0x02,0x71,0x0F,0x25,0xF4,0x36,0xB1, + + 0x86,0x6A,0x41,0x84,0xB8,0xDD,0x6F,0x08,0x08,0x21,0xD1,0x80,0xD6,0x40,0xA0,0x6F, + + 0x14,0x6D,0x9F,0x20,0x22,0x6E,0x39,0x2F,0x4E,0xEE,0x8E,0x0A,0xE5,0xB6,0x19,0x44, + + 0x8F,0x67,0xF3,0x69,0xEE,0xB7,0xE3,0xCD,0xBE,0xD7,0xF3,0x63,0xBB,0x20,0x35,0x97, + + 0xC9,0x96,0x7F,0x4A,0x2F,0xD1,0x98,0x69,0x2B,0xD6,0xE2,0xC5,0xDF,0xCA,0xEA,0xE4, + + 0x57,0x18,0x72,0xE8,0x94,0xDE,0x7E,0x0E,0x1B,0x04,0xC3,0x75,0x39,0x22,0xF2,0xC2, + + 0xBD,0x0D,0xDA,0xBD,0x5F,0x6A,0x27,0xC9,0x36,0xE4,0x7D,0x17,0x20,0x02,0xBF,0x9B, + + 0x38,0x55,0xFD,0xF4,0x18,0x6A,0x42,0xBB,0x7A,0xE5,0x87,0xA8,0x5F,0x28,0x2E,0xA2, + + 0x8E,0x4A,0x9E,0xE3,0x7A,0xA5,0x99,0x4B,0x7B,0xE8,0xAD,0x9C,0xA9,0x98,0x61,0x09, + + 0x8B,0x4A,0x8E,0x35,0x9E,0x08,0x84,0xBA,0xA6,0x42,0x30,0x84,0x04,0x39,0x52,0x5A, + + 0x2C,0xF4,0x9D,0x28,0x2A,0xD6,0xCB,0xCA,0xB9,0xE6,0x2C,0x05,0x2D,0x1A,0x81,0x0F, + + 0xE3,0x9F,0x39,0x44,0xBF,0xD3,0x87,0x9B,0x74,0x48,0xEA,0xE8,0x50,0xAA,0x02,0xD0, + + 0xE2,0x9E,0xAC,0x75,0x18,0x7D,0x8B,0xFC,0x49,0x7C,0xE4,0xDC,0x3B,0xED,0x24,0x3A, + + 0xB4,0x98,0x2F,0xDE,0xAE,0xF3,0xD9,0x57,0xF0,0xBB,0x70,0xC9,0x06,0x0D,0xF8,0xF4, + + 0xB8,0x4F,0x74,0x6D,0x64,0x80,0x9B,0xFD,0xCF,0x43,0xA5,0x7B,0x3A,0xCC,0x62,0xA8, + + 0xDF,0x4D,0x4A,0x00,0x32,0xDF,0xC6,0x8C,0xA8,0xB3,0x38,0xD7,0x56,0x86,0x58,0xAB, + + 0x07,0x53,0xB4,0x67,0x05,0x73,0xDC,0x30,0xFE,0xFE,0x67,0x36,0xB3,0xB6,0x67,0x81, + + 0x57,0x87,0xBD,0x76,0x88,0x57,0x80,0xB2,0xD2,0xC3,0x6A,0xD6,0xDA,0xA4,0x09,0x36, + + 0x78,0x6E,0xC9,0x84,0x10,0x9C,0xB9,0xC2,0xD9,0x5C,0x5D,0x31,0xB3,0xEC,0xDF,0x70, + + 0xD1,0xCB,0x84,0x04,0x34,0x16,0x94,0xE4,0xE3,0x59,0xB6,0xE4,0xEF,0x89,0x72,0xF9, + + 0xF5,0x1F,0x0C,0x55,0xA4,0x77,0x0A,0xCF,0x05,0x17,0xA5,0xCA,0x0B,0x80,0xA9,0xB2, + + 0x96,0xE0,0x2D,0x41,0xB0,0x62,0xEA,0xA3,0x43,0x83,0x78,0x0B,0x13,0x49,0x09,0x39, + + 0x37,0x55,0x8D,0x22,0xB5,0x15,0x1D,0xD8,0x60,0x5A,0x4E,0x0F,0x08,0x35,0x29,0xD2, + + 0x9D,0x84,0x13,0xAB,0x99,0x97,0xA2,0xDB,0x5C,0x57,0x22,0xCE,0x83,0x14,0x5A,0x87, + + 0x0F,0x1A,0xB6,0x6F,0x41,0x5C,0xBA,0xCB,0x55,0x56,0xA0,0x19,0xAB,0xE6,0xC7,0x88, + + 0x61,0xCE,0x94,0x09,0xBA,0xD8,0xD7,0x29,0x51,0xF5,0xA9,0x1D,0x22,0xC5,0xDF,0x39, + + 0x2C,0x58,0xB7,0x6E,0xCD,0x79,0xAB,0xCA,0x99,0x54,0x5F,0xF8,0x74,0xAF,0x02,0x28, + + 0x48,0x83,0x2E,0x48,0x30,0x9C,0xA9,0x2A,0xCB,0x83,0x92,0xCA,0x8F,0x70,0xA9,0xAB, + + 0x17,0xCB,0x58,0xBC,0x3F,0x18,0x8B,0xE7,0x19,0xF9,0x6D,0x58,0x87,0x1E,0xBC,0x0E, + + 0x43,0x8F,0x07,0x4C,0x2D,0x93,0x97,0xEC,0x3E,0x8A,0xEF,0x92,0x7B,0x73,0x47,0xDC, + + 0xC0,0x0E,0x5A,0xF9,0x6F,0x8E,0x0B,0xBC,0x23,0x1C,0x1F,0x7D,0xC3,0x8A,0xCC,0x71, + + 0x22,0x76,0x58,0x75,0x78,0xA9,0xE6,0x93,0x6E,0x6F,0x70,0xE2,0x50,0x34,0x60,0x07, + + 0xE4,0x2E,0xF6,0x23,0x49,0x03,0x06,0x9A,0x8F,0x82,0xED,0x09,0x63,0x74,0x1F,0xA2, + + 0x46,0x82,0x21,0x66,0xDD,0xE3,0xA4,0x21,0x9C,0xAE,0x64,0x38,0xA6,0x37,0x7D,0xE0, + + 0xA3,0x87,0x3F,0x95,0x15,0x18,0x47,0x0B,0x2C,0x20,0x6C,0x0C,0xA7,0xA1,0xCC,0xE7, + + 0xD3,0xE7,0x71,0x38,0x74,0x5B,0x48,0x1D,0xC7,0xC9,0x67,0x95,0xDA,0xB9,0x0E,0xFE, + + 0xF2,0x23,0x50,0xA8,0x07,0xE8,0xB8,0xF2,0x7F,0xCB,0x38,0xF7,0x3A,0xE8,0xCA,0x89, + + 0x3D,0xE8,0x9F,0x6E,0xA5,0x92,0xC2,0xD2,0x3A,0x05,0x89,0x40,0x6B,0xE9,0x3C,0x13, + + 0x8B,0x2C,0x16,0x90,0x5D,0x36,0x41,0x8C,0x44,0xCA,0x06,0x50,0x76,0xA5,0xB3,0x79, + + 0x2A,0x02,0x9A,0xDE,0x40,0x29,0x54,0x8B,0xA7,0xB9,0x3E,0x69,0x88,0x4B,0xBA,0x74, + + 0x4E,0x56,0x60,0x2F,0x71,0xB6,0x3E,0xD8,0xCD,0x59,0xDB,0xBA,0x5B,0x6B,0x03,0x5A, + + 0xA6,0x81,0xE5,0xFC,0xAC,0x21,0xF3,0xAA,0xD3,0x41,0x14,0x9B,0x5E,0x6C,0x73,0x82, + + 0x00,0xF6,0x13,0xFF,0x99,0x86,0x1D,0x8A,0xF5,0x6F,0x40,0x18,0x7C,0x14,0x73,0xB5, + + 0xE7,0xBD,0x59,0xDD,0x22,0xA6,0x89,0xEE,0x42,0x18,0xB6,0x1B,0xF2,0x89,0x54,0x77, + + 0x4C,0x12,0x94,0x66,0xEA,0x2E,0xC9,0xD7,0xB3,0x5E,0x82,0x39,0x3C,0xEF,0x29,0xB1, + + 0xAF,0x4F,0x62,0x30,0xFE,0x51,0xD0,0xC2,0x12,0x9D,0x5C,0x8D,0x72,0x13,0x73,0x7B, + + 0x89,0xAD,0x14,0xAC,0xA3,0xED,0xBB,0xFB,0xF7,0x8D,0x9D,0xDE,0x20,0x62,0xC8,0xF1, + + 0x50,0x36,0xE4,0x23,0x95,0x1F,0xF4,0x22,0x9A,0x7D,0x62,0xB9,0x46,0x5D,0x7A,0xD2, + + 0x71,0x3C,0xFC,0x12,0x37,0xBB,0xAD,0x50,0x63,0xD3,0xEA,0xD6,0x79,0x5A,0xF7,0xF0, + + 0xDC,0x34,0x32,0xA0,0x15,0x1D,0x20,0x41,0x48,0x7F,0x67,0x77,0x74,0x5A,0xFF,0xA2, + + 0x83,0x3C,0x95,0x64,0x9F,0xD6,0x12,0xC0,0xD9,0xDC,0xAC,0x48,0x1C,0xE2,0x9B,0x85, + + 0xCF,0x87,0x43,0xFA,0xE6,0x45,0x7E,0xCD,0x12,0x81,0xA0,0x1C,0x8D,0x2B,0x0A,0x63, + + 0x26,0xA4,0x2C,0x57,0x5A,0xD0,0x69,0xCD,0x51,0x00,0xC4,0xCB,0x88,0xFB,0x03,0x77, + + 0x4F,0x75,0xC2,0x67,0x2A,0x95,0x62,0xD8,0xD2,0x43,0x35,0x66,0x52,0xF8,0x53,0xFB, + + 0x18,0x42,0x59,0xB5,0x00,0xD2,0x28,0x77,0xBA,0x22,0xC5,0x4B,0xF1,0xD5,0xB7,0xF9, + + 0x46,0x3B,0x9E,0x7D,0x1A,0xFA,0x82,0xD9,0x1C,0xD7,0xC9,0x56,0x7C,0x94,0x29,0xDD, + + 0xC4,0x5A,0x7A,0xB9,0x9C,0x16,0x47,0xDC,0xE0,0xBB,0xEB,0x24,0x7E,0x5B,0x73,0x78, + + 0x94,0x9E,0xE7,0x81,0x1D,0x15,0x6D,0xF9,0x84,0x3B,0x89,0x03,0x26,0x57,0x49,0x3F, + + 0x46,0xCA,0xFD,0x1B,0xBF,0x59,0xC0,0x3F,0xE7,0xCA,0x81,0x13,0x09,0xC8,0x33,0xF5, + + 0x18,0x23,0xDE,0x21,0x38,0x9E,0xD5,0xC3,0xB2,0x8D,0x68,0x0C,0xD2,0x01,0xBF,0x29, + + 0x19,0x40,0xD6,0xF3,0xC0,0x60,0x2C,0xAA,0xD3,0xDE,0x2A,0xDA,0x7F,0xFD,0xA7,0x4F, + + 0xF6,0x3F,0x79,0xAD,0x49,0xDB,0x51,0x4E,0xE3,0x7A,0x8F,0xD1,0xD8,0x0B,0x39,0x72, + + 0x44,0xAC,0x3E,0x21,0x67,0xFB,0xCE,0xC6,0x17,0x4E,0xFF,0xFF,0xA6,0x17,0x59,0xEB, + + 0xA5,0x5F,0x00,0x8C,0xB5,0x2B,0x68,0x07,0xB9,0x4F,0x14,0xE4,0x5C,0xA0,0x48,0xE8, + + 0xBD,0xFA,0x48,0xF4,0x11,0x00,0x4A,0x31,0xAA,0x30,0x70,0x1D,0xB0,0x7A,0x00,0x67, + + 0x3F,0xB9,0x80,0x81,0x99,0x43,0xAE,0x11,0xCC,0x9F,0xB1,0xA0,0x57,0x03,0x30,0xED, + + 0x79,0x43,0xEC,0xFD,0x2A,0x6E,0xC6,0x31,0xB6,0x4C,0xFC,0xC3,0x5C,0x78,0x3E,0x79, + + 0xE9,0x95,0xDC,0xBB,0xF9,0x95,0x28,0x02,0x02,0x4B,0x50,0x75,0x6E,0x08,0x93,0x53, + + 0x7C,0x09,0x08,0x55,0x6D,0xA8,0xB9,0x12,0x03,0x4A,0xBA,0x74,0x52,0xC8,0x3F,0x6C, + + 0x69,0x57,0x3E,0xC1,0xF9,0x30,0x09,0x75,0x40,0x1A,0xB3,0x68,0x3B,0x17,0x7E,0x38, + + 0x73,0x1E,0xB7,0x78,0x78,0xB6,0x86,0x71,0xB4,0x43,0xC5,0x8A,0xD5,0xCC,0x4A,0xF3, + + 0x3B,0x37,0x79,0x04,0xBD,0x97,0xD2,0xEC,0x43,0xE3,0x29,0x4A,0x9A,0x48,0xB2,0xEB, + + 0x23,0x67,0xCD,0xFC,0x11,0xBB,0x5A,0xC9,0x3D,0x46,0xEA,0xB8,0x7A,0x2B,0xBB,0xFA, + + 0xAA,0x1A,0xA8,0x73,0x49,0x97,0x00,0x06,0xA3,0xFB,0xDB,0x28,0xDE,0xC1,0x52,0x66, + + 0x2C,0x8D,0xB4,0x2C,0x38,0xD4,0x45,0x04,0xC9,0xE6,0x0B,0x7B,0x25,0x6D,0x82,0x88, + + 0x1F,0xF8,0x02,0xBD,0x7C,0x21,0x92,0xAC,0x41,0x4A,0x9A,0xE8,0x31,0x7D,0xDF,0x42, + + 0x3F,0xD0,0xD9,0x2F,0x6B,0x26,0x69,0x64,0xE8,0x4B,0xE4,0x44,0x78,0x2D,0x54,0x57, + + 0xFA,0xBA,0xB1,0xB2,0x98,0x8E,0xFA,0xE7,0x6B,0x48,0xEC,0x8F,0x92,0xFF,0x63,0x3B, + + 0x76,0x03,0x4B,0x4C,0xA7,0x24,0xF2,0xF6,0x6A,0x49,0xDD,0x50,0xF8,0xEF,0x45,0xE6, + + 0x42,0x10,0x21,0x66,0x36,0x70,0x4E,0xA1,0x0A,0x81,0x07,0xD6,0xD3,0x0B,0xB4,0x6B, + + 0xC8,0x32,0x27,0xD3,0x02,0xCC,0x3C,0x63,0x45,0x3D,0x63,0x48,0xE3,0x33,0xFD,0xE7, + + 0x53,0x02,0xCD,0xFE,0xE1,0x39,0x6B,0x9D,0xAA,0x23,0x94,0x5E,0x83,0x7E,0x1B,0xF3, + + 0x5E,0xBE,0x35,0x07,0xF9,0x21,0x44,0xCF,0x44,0xD5,0x99,0x08,0x8A,0x63,0x64,0xE0, + + 0x41,0x41,0xBE,0xA4,0x26,0xC9,0x74,0xA0,0xC3,0xD3,0x6F,0x76,0x72,0x7E,0x34,0xF7, + + 0xD6,0x1A,0xD4,0xD1,0x58,0x84,0x5E,0x72,0xFE,0x9E,0xE6,0x16,0x98,0x04,0x3D,0xE6, + + 0xC1,0xBC,0xDA,0x25,0xBA,0xEB,0x81,0x0A,0xE4,0x9C,0x04,0x61,0x99,0xDE,0xF9,0xAE, + + 0x00,0x72,0xC9,0xA6,0xCB,0x3E,0x65,0x81,0xC9,0x5E,0xA3,0xCD,0xF5,0xDC,0x56,0x2D, + + 0x2E,0xB3,0x3E,0x1E,0x38,0x30,0x12,0x68,0x64,0x1A,0xCD,0xAC,0x07,0x78,0x31,0x7A, + + 0xC0,0x3A,0x71,0x67,0x0A,0xD6,0xB6,0x89,0xEE,0x38,0xC5,0xC3,0x2C,0x70,0x0D,0xF3, + + 0x0B,0x7F,0x8D,0x65,0x66,0xF7,0x49,0x0B,0x6D,0x9B,0x4C,0xEF,0xFE,0x32,0x1D,0x98, + + 0x52,0x96,0x37,0x06,0xDA,0x3F,0xF7,0x90,0x08,0x40,0x9E,0x3F,0xF0,0x96,0xFD,0x2A, + + 0x86,0xE1,0x91,0x48,0x1D,0xF5,0xD6,0x89,0xDA,0xE3,0x04,0x9E,0xD9,0xDC,0x5E,0x24, + + 0xAB,0x5F,0x90,0xF4,0xC2,0x32,0x9E,0x28,0x24,0xA0,0x5E,0xED,0x47,0x76,0x3F,0x30, + + 0xEE,0xE5,0x07,0x3C,0xB9,0x7C,0x88,0x13,0x9D,0xA9,0xC4,0x9E,0x8A,0x75,0x05,0x0C, + + 0x56,0x90,0xC9,0xE5,0x52,0xAE,0x47,0xFC,0x80,0x8E,0xDD,0x8E,0xC7,0xF6,0x30,0x8A, + + 0xA1,0x06,0x9B,0xA3,0xE3,0x0D,0xA5,0x42,0x28,0x4D,0xBC,0x21,0xF5,0x68,0x81,0x90, + + 0xC0,0x27,0x96,0x3F,0x63,0x0E,0xAB,0x0D,0x3D,0x14,0xB1,0x44,0xF6,0xE7,0xAA,0x43, + + 0x80,0xA2,0x30,0x3A,0x7F,0xE6,0xCC,0x18,0xB8,0x57,0xB0,0xC5,0x56,0xEA,0x11,0xD4, + + 0x47,0x63,0x0D,0x75,0x31,0x4E,0x2A,0xB7,0xD0,0x3F,0xB1,0x90,0x76,0xE5,0x58,0x7C, + + 0x37,0x71,0xE2,0x35,0x2A,0x2D,0x43,0x7F,0xE5,0xBF,0xCE,0x4B,0x37,0xC4,0xC1,0x2C, + + 0x92,0x08,0xFB,0xB6,0x57,0x08,0x58,0x8F,0x13,0x1E,0x98,0x39,0x30,0xE8,0x7C,0x0C, + + 0x7B,0xFA,0xE5,0xA7,0x2F,0x0B,0xF1,0x9A,0x31,0x5D,0xA9,0x08,0x56,0x95,0x14,0xB9, + + 0x04,0x8A,0x7C,0x27,0x9F,0xAC,0x4A,0x77,0xD2,0x3B,0xE3,0xC2,0xF4,0x1F,0x2A,0x0E, + + 0x04,0xD4,0x66,0xE0,0xB0,0xA5,0x08,0x1B,0x34,0x67,0xBA,0x63,0x3F,0xA8,0x28,0xF8, + + 0x3E,0x74,0x92,0xE1,0xEC,0xCA,0x29,0xC9,0x3D,0x44,0xF8,0xDC,0xDF,0xA1,0x43,0x5D, + + 0x46,0x87,0x67,0xE0,0x65,0x0B,0x24,0xDB,0xC4,0x69,0xCB,0xAD,0xDD,0xB2,0x93,0x2B, + + 0x85,0xC4,0x6B,0xEE,0xDC,0xF6,0x2D,0x06,0x26,0x3A,0x2C,0xDD,0x5F,0xA3,0x9D,0x88, + + 0xAF,0x53,0xA7,0xCC,0xDB,0x21,0x48,0x99,0x7A,0x67,0x32,0x9F,0xDE,0xE4,0x7D,0x44, + + 0x7F,0x39,0x15,0x6E,0x1D,0xEF,0x72,0x8A,0x69,0xC2,0x3A,0x8F,0xF7,0xE5,0xA3,0x4E, + + 0x5A,0x7A,0xDB,0xB1,0x32,0xA3,0xE0,0xBA,0x4C,0xCA,0x77,0x9E,0xAA,0xBB,0xFE,0x41, + + 0xBB,0x89,0xB5,0x17,0x3E,0x10,0xBB,0xAF,0x8F,0xC9,0x73,0x00,0x1D,0x9F,0x72,0x22, + + 0xD7,0x6B,0xDA,0x64,0x26,0xFD,0x51,0x54,0x62,0xF8,0xEE,0x5C,0xD7,0xF4,0x64,0xDE, + + 0xA8,0x1C,0xE4,0xAB,0xC8,0xDD,0xBC,0x52,0x63,0x7A,0xDC,0xF6,0x7B,0xFC,0x65,0x7F, + + 0x18,0xD0,0xBF,0x85,0x7E,0xBD,0xA1,0x27,0xC7,0xD2,0x4E,0x23,0xBF,0x5C,0xCA,0x68, + + 0x44,0x45,0x69,0x68,0x38,0xA8,0x28,0x88,0x8E,0x82,0xF7,0x08,0x56,0xFE,0x66,0x40, + + 0xA6,0x55,0xBC,0xC2,0x7E,0xC5,0xC5,0x66,0x0D,0xD0,0xF0,0x06,0xCB,0xF2,0x8E,0x56, + + 0x2F,0x66,0xF6,0xD7,0x14,0xC8,0xCD,0x76,0x0C,0xF0,0x48,0x94,0x8C,0xB7,0x1D,0xE7, + + 0xA0,0x3D,0xBD,0xD7,0x5F,0xC7,0x7D,0xE6,0x8D,0x07,0x5F,0x95,0x57,0x69,0x0D,0xE9, + + 0xF3,0x9A,0xD7,0x24,0x8B,0x18,0x35,0xF7,0xCE,0x28,0xA3,0x16,0xC8,0xD7,0x5D,0xF9, + + 0x06,0x39,0xDA,0xE8,0xE2,0xAA,0x0F,0xEC,0x00,0xDE,0xFC,0x71,0xDF,0xFE,0xFA,0x64, + + 0x4E,0xDB,0xD6,0x5E,0x6B,0xA2,0x80,0xBE,0x45,0x4F,0x40,0x5C,0xDC,0x71,0x1F,0x74, + + 0x45,0x99,0x1F,0xFF,0x3C,0x1C,0x17,0xD7,0x4D,0xD9,0xBB,0xA8,0x5D,0x70,0xEF,0x6A, + + 0xE0,0x06,0xCA,0xE9,0x30,0x3D,0x66,0xC4,0x48,0xD0,0xBD,0x5D,0xD9,0x76,0x9D,0xED, + + 0x8F,0x07,0xF5,0xBD,0x4E,0xFE,0xC9,0x78,0x72,0x01,0x36,0xA2,0xA3,0xFA,0x55,0x66, + + 0xAD,0xC1,0x2E,0x92,0xE2,0x1D,0x62,0x05,0x86,0x0C,0xA0,0x87,0x9E,0x82,0x67,0xFB, + + 0xAE,0x61,0xB9,0xB6,0x5F,0xC1,0x15,0xEB,0xEF,0x9E,0x5D,0x9C,0x5F,0xBC,0x8E,0x39, + + 0x03,0x62,0xFC,0xAC,0xCF,0xB4,0x65,0x2A,0xCE,0x9F,0x3F,0xB3,0x22,0xBD,0xCA,0x10, + + 0x82,0x04,0x98,0x89,0x70,0x30,0xCD,0x21,0x46,0x18,0xF0,0x9B,0xA3,0x6D,0x68,0x12, + + 0x00,0x8A,0x52,0xE4,0x3B,0x25,0x8D,0xD0,0x45,0xE1,0x32,0x46,0xA4,0x6E,0x8B,0x72, + + 0xF4,0x0D,0xD9,0x89,0x12,0x5E,0xBE,0x30,0xFC,0xEF,0x6E,0xD9,0xD0,0x64,0x5B,0x95, + + 0xEA,0xCA,0x08,0x91,0xF2,0x0F,0x88,0x76,0x03,0x33,0x2D,0x4A,0x72,0x0D,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xDD,0xE6, + + 0x0E,0x62,0xA2,0x10,0x9A,0x54,0x2C,0x04,0x8A,0x48,0xF0,0x20,0xAD,0xEE,0x6A,0x1A, + + 0x08,0x04,0x4A,0xF8,0xBB,0x2D,0x12,0xC8,0x2B,0x46,0x47,0x1C,0x22,0x6B,0xBE,0x8D, + + 0xCF,0x8A,0x59,0xFD,0xF6,0x25,0x1B,0x16,0x4A,0x4E,0x93,0x09,0xA7,0x6A,0x13,0x98, + + 0xC1,0x9A,0x0F,0x99,0xFA,0x28,0x21,0xCA,0xFD,0xE4,0xC0,0x12,0xAE,0x6F,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x95,0x80, + + 0x4B,0x61,0x7B,0xF7,0x0C,0xE3,0x84,0x24,0x27,0xD0,0x94,0xA4,0x70,0x70,0x32,0xBD, + + 0xD6,0x9C,0xF2,0x92,0x52,0x44,0x3C,0xF0,0x02,0xD2,0x9C,0xB4,0x71,0x71,0x01,0x05, + + 0xE7,0x92,0x7E,0x75,0xB2,0xC3,0xD5,0x45,0x85,0x54,0x95,0xA5,0xF0,0x72,0x1F,0x11, + + 0x5E,0xCE,0x5E,0x66,0x3D,0x72,0x65,0xC3,0x0A,0x02,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x54,0xA7, + + 0xDF,0x95,0xE6,0xDA,0xD1,0x35,0x68,0x85,0x17,0x07,0x96,0xAC,0x78,0x78,0xB1,0xF8, + + 0x1D,0xB4,0xB6,0x66,0x95,0x34,0xD4,0xA8,0xEB,0x5D,0x9E,0xBC,0x79,0x79,0x78,0x0D, + + 0xEB,0xF0,0x78,0x0F,0x7D,0xB7,0xD7,0x6C,0x55,0x18,0x97,0xAD,0xF8,0x7A,0x9A,0x64, + + 0xA9,0xC4,0x9D,0x1D,0x52,0x7F,0x17,0xDB,0xC8,0x79,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x1E,0x3A, + + 0x27,0xC0,0x9A,0xF5,0x75,0xA6,0xA5,0xDF,0xF3,0x82,0x20,0xA4,0x91,0x6D,0x40,0x61, + + 0x39,0x07,0xF2,0xEC,0x7D,0x30,0x3A,0xB0,0xC5,0xC9,0x47,0xF1,0x97,0xE1,0x27,0x2E, + + 0x09,0x04,0x81,0x53,0x37,0xE3,0xFD,0x4C,0xC2,0x08,0x89,0xD9,0x78,0xEF,0xAF,0x53, + + 0x2C,0xC2,0xD7,0x11,0xF6,0x54,0x01,0x53,0xCF,0x63,0x02,0xA5,0xD5,0xA2,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xE2,0xDE, + + 0x4C,0x8E,0xF4,0x23,0xF7,0xCC,0xA7,0x59,0x70,0xC3,0xB3,0x48,0x3C,0xE8,0x52,0x9E, + + 0x66,0x4F,0x94,0x7C,0x62,0xA9,0x58,0xF8,0xA4,0x98,0xBE,0xD8,0x79,0xE9,0x03,0x4B, + + 0xEF,0xC9,0x9B,0xF4,0x1E,0x66,0xB3,0x3A,0xF8,0xA6,0x4B,0xA7,0x79,0x69,0xEB,0x1A, + + 0xF3,0x20,0x50,0x60,0xF5,0x3A,0x59,0x2E,0xCC,0xE6,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x9B,0xB2, + + 0x26,0xD2,0xFE,0xA9,0x46,0x1F,0x32,0x8F,0x8D,0xA1,0xB4,0xA6,0x74,0xF0,0x3E,0x12, + + 0xDA,0x4C,0xD2,0xBB,0xDE,0x20,0x90,0x20,0xE6,0x7C,0xBC,0xB6,0x75,0xF1,0x7B,0xCB, + + 0x45,0x9D,0x01,0xF8,0x17,0x3F,0x6D,0xA7,0xAC,0x83,0xB5,0xA7,0xF4,0xF2,0x7F,0xBC, + + 0x52,0x4E,0x3D,0x6E,0xB5,0x2C,0xAC,0x21,0xA9,0xDB,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x0E,0xE8, + + 0xC5,0xE9,0x99,0xBE,0x3E,0x47,0x0A,0x8E,0x07,0x51,0xB6,0xAE,0x7C,0xF8,0x51,0xE4, + + 0x4F,0x9D,0x94,0xA7,0xC6,0x24,0x26,0x3F,0x0D,0x06,0xBE,0xBE,0x7D,0xF9,0xDC,0xF9, + + 0xCC,0x9A,0x9C,0x3F,0x00,0x65,0x33,0xD4,0x8C,0xA6,0xB7,0xAF,0xFC,0xFA,0x54,0x59, + + 0x0C,0x44,0xFD,0x9D,0x4E,0xFA,0x27,0x2B,0x8D,0x04,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x2B,0xFD,0xA7,0x2C, + + 0xFD,0x06,0xD2,0x7D,0x16,0xB9,0x30,0xB0,0xA9,0x11,0x06,0x46,0xAF,0x1B,0xC8,0x18, + + 0x01,0x0B,0xB2,0xF6,0xBD,0xDC,0x9E,0x43,0x75,0x2F,0xDA,0xF8,0x57,0xF8,0x8E,0xC7, + + 0x0E,0xFD,0x62,0x81,0xAD,0x09,0xBD,0xB3,0xD2,0x4A,0x95,0xDC,0x8A,0x20,0x8D,0xEC, + + 0x7C,0x42,0xF1,0x91,0xAC,0x76,0x7B,0xAD,0xC0,0x83,0x9B,0x4A,0x72,0x67,0xA7,0x00, + + 0x0E,0xF9,0x7F,0xA6,0xFB,0x35,0x8B,0xE2,0x87,0xC7,0x6F,0x2F,0xA8,0x44,0x59,0xD2, + + 0x92,0x42,0xD3,0xE6,0xD1,0x7A,0x43,0x8F,0xA2,0xEA,0x86,0xCC,0xD9,0xBE,0x19,0x90, + + 0x63,0xA9,0x01,0x28,0x5E,0x64,0x0B,0x4F,0x61,0xED,0xD6,0x94,0xEC,0x9F,0x71,0x21, + + 0x8B,0x0C,0x72,0xC7,0x93,0x2D,0x40,0x8D,0x52,0xBC,0x5E,0x07,0x38,0xD4,0x3C,0x24, + + 0x85,0x8E,0x90,0x2F,0xF3,0x6C,0xD2,0x50,0x2B,0xCF,0x94,0xA8,0x29,0xE8,0x74,0x35, + + 0xE0,0x58,0x4A,0x64,0xCF,0x6B,0xF9,0xC8,0x4A,0x46,0x79,0x5E,0xA6,0x05,0x42,0xC9, + + 0x95,0x87,0xBD,0x0A,0xFA,0xF3,0x8F,0x21,0xCE,0x33,0xA9,0xCF,0xDE,0x13,0xF0,0xE8, + + 0x2A,0x3B,0x16,0xCC,0x78,0x69,0x3B,0x20,0xCF,0xD2,0xF9,0xEC,0x5B,0xC7,0xCB,0xCC, + + 0x7B,0x0E,0x82,0xC8,0x27,0xBB,0xEE,0x90,0xD3,0xF7,0xF2,0x70,0xA0,0x2C,0x8A,0x38, + + 0x0B,0xF9,0xB5,0xDE,0xDE,0x8E,0x62,0x97,0x4D,0x24,0x84,0xC4,0xF3,0xB6,0x79,0xAB, + + 0x76,0x1F,0xFB,0xB7,0x36,0x23,0xEF,0xEB,0x1F,0xAF,0x56,0x9C,0xE4,0x97,0x5E,0xDB, + + 0x42,0xA6,0x0B,0x25,0x23,0x27,0x66,0xFB,0x1E,0xAE,0x5C,0x8C,0xA1,0x6C,0x1F,0x17, + + 0xC2,0x00,0xD2,0xC3,0x3E,0xEF,0x50,0xE0,0x6A,0xFD,0x78,0x3A,0x71,0x12,0x74,0x99, + + 0xC1,0x90,0x24,0x10,0x0C,0xA2,0x9C,0x91,0xEB,0xFC,0x94,0xA1,0x98,0x20,0x6B,0xF2, + + 0x94,0xB9,0x3A,0x00,0x32,0xC7,0x84,0x33,0xF2,0x58,0xAB,0x89,0x32,0x60,0x31,0x62, + + 0x25,0x9E,0x36,0x77,0x1D,0xCE,0x8C,0x76,0x23,0x81,0x71,0x27,0xA7,0x7B,0x5F,0xC8, + + 0x83,0x78,0xDD,0xB7,0x03,0x5A,0x34,0xB3,0x9A,0x59,0x01,0x5C,0x99,0x10,0x5D,0xA8, + + 0xCA,0x0C,0xF2,0xAC,0x35,0x4C,0x24,0x74,0x5E,0xC2,0x70,0x6F,0x70,0x35,0xA2,0x01, + + 0xAE,0xB2,0xA7,0xC4,0xB3,0xA4,0x27,0xE0,0xB6,0xDB,0xEF,0x62,0x09,0x4B,0x3F,0xD0, + + 0xAF,0xB3,0x6B,0xB7,0x44,0x52,0x07,0xFC,0x40,0x32,0x7A,0x59,0xAF,0x73,0x54,0xF0, + + 0xC3,0x7C,0xFE,0x0E,0x9A,0xAC,0x1E,0xAC,0x40,0x7E,0x14,0x28,0x09,0xF3,0x6E,0x3B, + + 0x7E,0x16,0x75,0xBB,0x98,0xC6,0x5F,0xCB,0x5D,0x53,0xB0,0xCD,0x1A,0x59,0x3D,0x0E, + + 0xEB,0xEA,0x47,0xF5,0xE7,0x37,0x29,0x85,0x65,0xDC,0xE5,0xC8,0xE0,0x7C,0x6F,0xCA, + + 0x15,0x90,0xB1,0xA5,0xBF,0x42,0xDB,0x48,0x4A,0x6B,0xE7,0x82,0xCD,0x3A,0x57,0xB0, + + 0x62,0x0D,0xFE,0x33,0xD3,0x2D,0x0C,0x42,0xC9,0x75,0xBA,0x9F,0x08,0xAD,0x5E,0x98, + + 0xDF,0x90,0xB5,0xFB,0x9A,0x51,0x66,0x17,0x10,0x49,0xE3,0x3B,0xA5,0x75,0x79,0xE1, + + 0x27,0x98,0x07,0xA0,0x76,0x33,0x8B,0x6B,0x23,0x2B,0x17,0x95,0x44,0x81,0x31,0xA5, + + 0x29,0xB3,0x28,0xA7,0x6D,0x35,0x04,0x5B,0x94,0x53,0x5F,0xE3,0xCD,0xD2,0xE0,0x6F, + + 0xF8,0xC2,0xBB,0x95,0xF6,0x50,0xBD,0x50,0xFB,0x82,0x83,0x66,0x1C,0x6B,0x5C,0xD2, + + 0x03,0xF8,0x96,0x3B,0x7D,0xAC,0xDB,0x4D,0xE6,0x83,0xE2,0x02,0xF6,0xE7,0x3A,0x76, + + 0x45,0x84,0x49,0x75,0x7F,0xD3,0x73,0xEF,0xC2,0xBB,0x20,0xC5,0x54,0x82,0x90,0x6C, + + 0x26,0x28,0xD7,0x2F,0x17,0x56,0xA4,0xAD,0x64,0x3C,0x97,0x19,0x74,0x3C,0x58,0x22, + + 0x7A,0x29,0xA1,0x81,0xEB,0x22,0x48,0xF2,0xBD,0x3F,0xCA,0x99,0xAB,0x88,0x7D,0x43, + + 0x36,0x28,0xE0,0x06,0x11,0xDC,0x66,0x83,0xA6,0x6A,0xAB,0x4B,0x51,0x7C,0x74,0x33, + + 0x7B,0x8F,0x18,0x39,0x54,0xA6,0x58,0x9F,0x20,0x84,0x12,0xA7,0xE2,0x4B,0x70,0x94, + + 0x45,0xA7,0x9A,0x35,0x60,0xC2,0x68,0xF7,0xB6,0xC5,0x0C,0x8C,0x6E,0x8B,0x5A,0x03, + + 0xF9,0xCA,0x88,0x8A,0x21,0x5B,0x52,0x79,0xF8,0xC5,0x0D,0x69,0x8A,0xE0,0xB4,0x98, + + 0xA7,0xA3,0xCA,0x21,0x9C,0xEB,0x72,0x3E,0x65,0xC4,0x82,0xC1,0xDF,0x45,0xBE,0x34, + + 0x8A,0x13,0x9B,0xF1,0x30,0xA7,0xC8,0x54,0x41,0x1C,0x26,0xAB,0xAD,0x6A,0xEB,0x76, + + 0x38,0xC9,0x36,0xA7,0x9B,0x32,0x05,0x17,0x42,0x4D,0x88,0x5D,0x2A,0x16,0x6A,0xC2, + + 0x6D,0x95,0xDA,0x09,0xDC,0x25,0x48,0x88,0xB2,0xDD,0x95,0x2E,0x40,0x11,0x6B,0x38, + + 0xF0,0x06,0xBC,0xDA,0x6E,0xAF,0x6F,0x09,0x77,0x4A,0x2E,0x84,0xB6,0x7E,0x75,0x33, + + 0x88,0x17,0x58,0xDD,0x9E,0xA4,0xB3,0x07,0x7F,0x3A,0xE1,0x6E,0x25,0x63,0x72,0x6A, + + 0xBF,0xCD,0xB1,0x5E,0x3C,0x0F,0x86,0x7F,0x4F,0xFF,0xEC,0x8C,0x5B,0x42,0x64,0x60, + + 0xCD,0x49,0x6C,0x02,0x45,0x13,0x06,0x92,0xFF,0x7F,0x6B,0xD9,0x50,0x5B,0xEC,0xEA, + + 0x46,0x16,0x68,0x69,0xB7,0xB6,0x42,0xB5,0x84,0xB7,0x43,0x34,0xB0,0x72,0x3F,0x82, + + 0x85,0x22,0x09,0x02,0x43,0x4F,0x95,0xD1,0x86,0x4B,0x7A,0xA6,0x9F,0x6B,0xB2,0x86, + + 0xA3,0xEA,0x0C,0x13,0xC4,0x49,0x43,0x8B,0x65,0x53,0xE7,0x66,0x56,0x7E,0x7A,0xA0, + + 0x07,0xD4,0x60,0xD5,0x06,0x2D,0xAF,0xDD,0x60,0xBD,0x25,0x17,0xD5,0x94,0xB3,0xB0, + + 0x07,0x78,0x6D,0xC5,0x07,0x2C,0xA3,0x70,0x10,0x32,0x6C,0xE8,0x43,0x01,0x79,0x3F, + + 0x24,0x92,0xDB,0xAF,0x54,0x96,0x48,0x67,0x97,0xFC,0xC7,0xD6,0x8C,0x09,0xED,0xB2, + + 0xD0,0x91,0xCD,0xC6,0xB1,0x2E,0xBD,0x82,0x8C,0x6C,0x68,0xED,0x87,0x43,0xC5,0xF8, + + 0x8F,0x9C,0x1D,0x0A,0x4D,0x1E,0x24,0x59,0x87,0x49,0xD6,0xFD,0x15,0xF7,0x2A,0x92, + + 0x2B,0x00,0xCE,0xCD,0x81,0x32,0xA3,0x94,0x0D,0xFE,0x13,0xDC,0x82,0xFF,0xF5,0xF8, + + 0xD9,0x1D,0xBD,0x93,0x9F,0xBD,0x0D,0x58,0xD0,0x98,0xC9,0xC7,0x7E,0x16,0x75,0x29, + + 0xD0,0xDB,0xE8,0x7D,0x3F,0x67,0x41,0xBD,0x04,0xBF,0x96,0x09,0x5C,0x95,0xC8,0xA9, + + 0x8F,0x63,0xA6,0xBC,0x9D,0x1C,0x16,0x12,0x80,0x27,0xE1,0xE1,0x0A,0xFA,0x82,0x45, + + 0x2E,0x3D,0x8C,0xD2,0x3C,0xFD,0x67,0xFA,0x69,0xA4,0x88,0xFE,0x7F,0xFD,0x07,0x81, + + 0x48,0x93,0xF6,0xBC,0x8E,0xD2,0x5E,0x17,0x08,0x9C,0xD9,0x4F,0xF8,0x5E,0xD0,0xBB, + + 0xAB,0xB6,0xE3,0xE4,0x9B,0x83,0x0C,0x85,0x4C,0xBA,0xFF,0x8D,0x14,0x0E,0x3E,0x3C, + + 0x42,0xFF,0xA0,0xC4,0x1D,0x62,0x87,0xA4,0x7D,0xBD,0xEE,0x19,0xBB,0xB1,0x00,0x14, + + 0xA9,0x8A,0xFA,0xE4,0xF3,0xD7,0x67,0x77,0xBC,0xF7,0x57,0xBE,0xB0,0x9E,0x3F,0x3C, + + 0x0D,0xF4,0x1C,0x54,0x96,0xBB,0x29,0xDB,0x6C,0x4F,0x4C,0x6F,0x2B,0x20,0x2F,0x3C, + + 0x05,0xA7,0x76,0x67,0x47,0x27,0xA2,0xAB,0xC0,0xE3,0x62,0xCE,0x22,0x21,0x80,0x38, + + 0x7E,0xD9,0xA0,0x0E,0xB4,0x29,0xE9,0x90,0x1F,0xE5,0xD0,0x64,0x52,0x64,0xE4,0x23, + + 0x25,0xA3,0x77,0x93,0xD1,0x25,0x0A,0xD3,0xA8,0x21,0xD8,0x74,0x53,0x65,0x39,0x66, + + 0x7F,0x09,0x3A,0x38,0xB3,0xE6,0xC4,0x92,0x46,0xCB,0xD1,0x65,0xD2,0x66,0x9D,0x96, + + 0x41,0x27,0x81,0x59,0x66,0xA0,0xE6,0x93,0xC5,0x3E,0xD9,0x75,0xD3,0x67,0x93,0x0F, + + 0xE1,0xF9,0x91,0xCB,0xF1,0xAB,0x4C,0x99,0x40,0x4C,0x89,0x7F,0xD5,0x2A,0x11,0xA4, + + 0x0F,0x70,0xD4,0xFE,0x1D,0x84,0xA9,0x98,0xB5,0x6A,0xB6,0xF9,0xB8,0xC6,0xC3,0x64, + + 0x9D,0x48,0x99,0x0F,0x5A,0x2E,0x97,0xD8,0xA2,0xB5,0x95,0x34,0xFB,0x2A,0x97,0x6A, + + 0xB5,0xFA,0x1C,0x9F,0x3F,0x39,0x40,0x39,0xB2,0xC9,0x4F,0xCE,0xA1,0xC6,0x4A,0x61, + + 0xE3,0x6F,0xC6,0x45,0xE7,0x42,0x49,0xEC,0x3B,0x37,0xD2,0x6C,0x5A,0x6C,0x2C,0xFC, + + 0x08,0xFF,0x15,0xA7,0x3F,0xA0,0x41,0x72,0x03,0x3C,0xDA,0x7C,0x5B,0x6D,0x41,0xB6, + + 0x77,0x62,0xA1,0x4C,0x9B,0x4E,0x93,0x04,0xC9,0x0C,0xD3,0x6D,0xDA,0x6E,0x8B,0x21, + + 0x98,0xA2,0xB5,0x70,0x72,0x5E,0x7B,0x2A,0xEF,0xC2,0xDB,0x7D,0xDB,0x6F,0x1F,0x18, + + 0x26,0xCA,0x8A,0xFA,0x93,0x55,0x72,0x01,0x89,0x13,0xC2,0x99,0x9B,0x81,0xD8,0x14, + + 0x50,0x79,0x3B,0x35,0xC1,0x72,0xAB,0x15,0x12,0x51,0x0F,0xC6,0x0E,0xF8,0x40,0x9F, + + 0x86,0xE6,0x3A,0x67,0x44,0x31,0x73,0x01,0x14,0x11,0xAE,0x14,0x84,0xDD,0xCD,0xFC, + + 0x8C,0xBE,0xBA,0x30,0xB7,0x19,0x55,0xBD,0x9A,0xDA,0x66,0x9A,0xDB,0x26,0x70,0x5F, + + 0x24,0x8D,0x3B,0xB6,0x1C,0xEB,0x48,0x92,0x99,0xAF,0xD4,0xE4,0x72,0x74,0xB3,0xF7, + + 0x82,0x57,0x6C,0x24,0x8F,0xE6,0x97,0xA0,0x9E,0x5C,0xDC,0xF4,0x73,0x75,0x0C,0xE6, + + 0x0E,0x1B,0x9F,0x30,0xCE,0x99,0x0F,0x1D,0x5E,0x14,0xD5,0xE5,0xF2,0x76,0x56,0x19, + + 0x7E,0x18,0xB3,0xD2,0x12,0xC8,0x58,0xE0,0xDF,0xFA,0xDD,0xF5,0xF3,0x77,0x93,0xB5, + + 0xC3,0x5C,0x4C,0x92,0x0A,0xCC,0xD6,0xC5,0xFD,0xF3,0xC6,0x87,0x04,0x6D,0xAA,0xFA, + + 0xDA,0x7C,0x95,0xA4,0xD0,0x2A,0x41,0xB4,0x6F,0x20,0x5E,0xC4,0xB0,0x3B,0x39,0xA5, + + 0xDE,0xB5,0xD2,0xFE,0xC4,0x78,0xC1,0xA8,0x68,0x4A,0x04,0x29,0xF4,0x75,0x37,0x62, + + 0x61,0x6A,0xF7,0xBA,0x50,0x08,0xB6,0x48,0x87,0x1B,0x9D,0x50,0x25,0x38,0xF2,0xB7, + + 0x89,0x5D,0x98,0x2E,0x3E,0x91,0xC3,0xAF,0xA8,0x3C,0xD6,0xEC,0x7A,0x7C,0x55,0x35, + + 0xA9,0x1A,0xF4,0x3E,0x97,0xC0,0xF2,0x6A,0x67,0x55,0xDE,0xFC,0x7B,0x7D,0x27,0xF6, + + 0x2B,0x5C,0x52,0x49,0x87,0x94,0x5F,0x22,0x03,0x2F,0xD7,0xED,0xFA,0x7E,0x6E,0x5D, + + 0xDA,0x0B,0xB7,0xCC,0x87,0x3B,0xDB,0x04,0x54,0x1E,0xDF,0xFD,0xFB,0x7F,0x5E,0x04, + + 0xED,0xD1,0xE8,0x1A,0x12,0x00,0xF0,0x26,0xD9,0xAE,0xA7,0x61,0x9E,0x71,0xE3,0x9B, + + 0xD1,0x82,0x90,0x26,0xF7,0x5E,0xE8,0xAC,0x46,0x01,0x86,0x0F,0x53,0x78,0xE1,0x7B, + + 0xA8,0xC0,0x5E,0x65,0x63,0xC7,0x0F,0x86,0x1A,0x6F,0xB9,0x23,0x5D,0xAA,0x8E,0xB2, + + 0x4D,0x32,0x93,0xAB,0x15,0x13,0x07,0x92,0x8C,0xC0,0xAA,0x55,0x22,0x86,0xB0,0xC6, + + 0x77,0xAD,0x4C,0xD5,0x66,0xAE,0x0E,0x5A,0xBB,0x45,0xF0,0x66,0x56,0xE4,0x17,0xD6, + + 0x76,0x9F,0x7D,0xA5,0x93,0x28,0xEB,0x72,0xAC,0x74,0xF8,0x76,0x57,0xE5,0x59,0xB9, + + 0x2A,0x8B,0xB2,0xB7,0xF9,0x07,0x75,0x9C,0x3B,0x6D,0xF1,0x67,0xD6,0xE6,0x37,0xB1, + + 0x83,0x7A,0xBB,0x78,0x7C,0xC3,0x43,0x80,0xFB,0x4A,0xF9,0x77,0xD7,0xE7,0x82,0x19, + + 0x7C,0xEC,0x62,0x1F,0xE3,0xEA,0x6A,0x27,0x4A,0xB1,0x8A,0xD1,0xBD,0x77,0xF5,0x9E, + + 0x7C,0x5A,0x4D,0xE1,0x7E,0x89,0x60,0xF6,0xEE,0xCD,0xC4,0x9F,0xB4,0xEA,0x1D,0x36, + + 0x8A,0xF3,0xB8,0xBD,0xFF,0xB3,0x3D,0x59,0x6F,0xAF,0xCC,0x5C,0xF6,0x1B,0xEB,0x76, + + 0xA0,0xC9,0x48,0xE1,0x9B,0xD2,0x6D,0xFC,0x24,0xA8,0x68,0xCC,0xFF,0x56,0xA2,0x5B, + + 0xF1,0x11,0xDA,0xB1,0xF7,0xDD,0x64,0x56,0xB1,0x61,0xF2,0x6E,0x5E,0xEC,0xED,0x58, + + 0x90,0x29,0x92,0x79,0xE2,0xA2,0xA7,0x7E,0x34,0x46,0xFA,0x7E,0x5F,0xED,0x1B,0x6C, + + 0x77,0x81,0x23,0x22,0xEB,0x23,0x64,0xDB,0x4E,0x11,0xF3,0x6F,0xDE,0xEE,0xBB,0xFE, + + 0xC7,0x3E,0xD5,0x67,0xF7,0xDE,0x20,0x54,0xC9,0xEF,0xFB,0x7F,0xDF,0xEF,0x84,0x91, + + 0x10,0xF4,0xDC,0x02,0x45,0x1C,0x03,0x17,0x98,0x13,0x8A,0x02,0xFB,0x76,0x4D,0x16, + + 0x54,0xA4,0x28,0xF1,0xB7,0x1D,0xA1,0xE3,0x84,0xDE,0x6C,0x26,0x8A,0xF5,0x1B,0xBE, + + 0xA2,0xEB,0x9F,0x7D,0x4F,0xF0,0xF5,0xC6,0x9B,0x90,0xB5,0xE7,0xB0,0x5F,0x25,0x82, + + 0xCE,0x10,0xFD,0x13,0xFD,0x05,0x89,0xCC,0x46,0x5E,0x3D,0x88,0xD3,0x07,0x3A,0xEF, + + 0x2E,0x92,0x93,0xF9,0x46,0xF5,0x14,0xCD,0x01,0xD9,0xF4,0xE6,0x76,0xF4,0x52,0xFF, + + 0xAA,0x63,0x53,0x44,0xD5,0x68,0x0E,0x0D,0x6B,0x2E,0xFC,0xF6,0x77,0xF5,0x4B,0xEC, + + 0x07,0x69,0x25,0x1B,0xAC,0xD8,0x0B,0xDB,0x0F,0x47,0xF5,0xE7,0xF6,0xF6,0x25,0x73, + + 0xA1,0xEE,0x8F,0xD7,0xB6,0xA7,0x82,0xD7,0x0E,0x46,0xFD,0xF7,0xF7,0xF7,0x22,0x88, + + 0x20,0x33,0xA0,0xB3,0xB4,0xB8,0x48,0x1F,0xE1,0x75,0x66,0xDD,0x04,0xBA,0x6D,0x89, + + 0x55,0xDD,0x3B,0x85,0x4D,0x34,0x1E,0xFA,0x2B,0x74,0x0A,0xDC,0x82,0xBB,0x75,0x74, + + 0xAA,0x03,0x37,0x91,0x88,0x4E,0x61,0xDB,0x6C,0x5C,0x2A,0xFA,0x5D,0x25,0x09,0xA3, + + 0x21,0x36,0xD1,0x3E,0x56,0xB8,0x6D,0xCB,0x6D,0x5D,0xA4,0x77,0x14,0xB8,0x7D,0xA8, + + 0xD9,0xF9,0xBC,0xA6,0xE0,0x43,0x6E,0xFE,0xEC,0xA9,0xF6,0xEE,0x7E,0xFC,0x26,0xB8, + + 0xDC,0xF8,0x7E,0xDE,0x3F,0xBD,0xA1,0x01,0x4B,0xDB,0xFE,0xFE,0x7F,0xFD,0x5F,0x34, + + 0xA8,0xE7,0xBD,0xCE,0x68,0x61,0x2D,0x89,0xCD,0xBE,0xF7,0xEF,0xFE,0xFE,0x57,0x20, + + 0xA9,0x2E,0xEF,0xDF,0xBF,0xBF,0xCA,0x0A,0x4E,0x20,0xFF,0xFF,0xFF,0xFF,0xA3,0x2C, + + 0xDC,0x71,0x7F,0xF4,0xEF,0x2F,0x8D,0xB6,0xE1,0x9F,0x34,0x46,0xAB,0x05,0xAF,0x16, + + 0xD5,0x65,0xB6,0xB4,0xF3,0xA8,0x0F,0x36,0x89,0xD0,0xB7,0xD6,0xFD,0xDC,0x22,0x39, + + 0x58,0xB3,0x35,0xE7,0xD8,0x21,0xA5,0x43,0x3F,0xE6,0xA9,0xA7,0x15,0x19,0x31,0xEF, + + 0x2D,0x0E,0xB4,0x91,0xAC,0x45,0xBD,0xB5,0xF4,0xBD,0xE1,0x46,0xE3,0x92,0x20,0x16, + + 0xCA,0xF8,0x5D,0x57,0x71,0x04,0xFA,0x93,0xC6,0xC9,0xA8,0x60,0x56,0xC4,0x76,0x6C, + + 0x8E,0x83,0xB0,0xA9,0xAC,0x64,0x27,0xF2,0x86,0x71,0xE0,0x44,0xB0,0xCA,0x39,0x66, + + 0x7F,0x09,0xB9,0x62,0xF1,0xA9,0x07,0xD4,0xC4,0x3F,0x2E,0x16,0xE6,0xC7,0xCD,0x11, + + 0xDD,0xAA,0x09,0x21,0xD0,0xAA,0xF6,0x93,0x6F,0xBA,0x79,0x07,0xB1,0xCB,0xFD,0x13, + + 0x8C,0x9C,0xBA,0xF7,0xB4,0x25,0x72,0x07,0x1C,0x0A,0xEC,0x2A,0xB1,0x8B,0x6A,0x37, + + 0x0B,0xD4,0xF2,0x3B,0xE0,0x26,0x4C,0xC6,0x4F,0x30,0x30,0xC5,0x84,0x66,0xA7,0x8D, + + 0xBD,0xF4,0x43,0x75,0x1F,0x96,0x8E,0xBF,0xCE,0xD3,0x53,0x40,0x2B,0x6C,0x73,0x3E, + + 0x74,0x04,0x2C,0x20,0x70,0xDA,0xFF,0x47,0x6A,0x2E,0x2F,0x42,0x7A,0xCF,0xD5,0xDA, + + 0x0E,0x04,0xA2,0x1F,0xE2,0x23,0x2A,0x57,0x78,0x99,0xAC,0x6B,0x7E,0x6A,0xB1,0xDC, + + 0x36,0xF7,0xCE,0xD8,0x59,0x77,0x7C,0xC0,0x79,0xE9,0x84,0x9E,0x5F,0x2D,0x06,0x3A, + + 0xF6,0x8F,0x03,0x35,0x87,0x55,0x85,0x7A,0xF4,0xAD,0x66,0xED,0x33,0xBF,0x75,0xE1, + + 0xF7,0xA0,0x0B,0x30,0x53,0xF2,0x0E,0xD4,0x03,0x1C,0xDD,0x82,0xB8,0xC7,0xDA,0xE2, + + 0xD3,0x75,0xD6,0xC3,0xD9,0xB3,0x4A,0x18,0x52,0xFB,0xEA,0x26,0xB5,0x54,0xA1,0xF2, + + 0xD6,0x74,0xEE,0x94,0x32,0xD1,0x8F,0x23,0x47,0xAE,0xE4,0xC7,0x0D,0x1D,0x3D,0x7A, + + 0xA6,0x8B,0xE7,0x3D,0x59,0x51,0x86,0xA0,0x6D,0xFF,0x3A,0x47,0x5C,0x8F,0x35,0x6E, + + 0xA7,0xFA,0xB7,0x66,0x9F,0x9C,0x23,0x8D,0x89,0x10,0xFF,0xB1,0xF0,0x41,0xE4,0xB2, + + 0x40,0xD8,0xBC,0xC0,0x36,0x94,0x34,0xB6,0xF6,0x59,0xC6,0x42,0x99,0x30,0x2C,0x86, + + 0xB7,0x18,0x3C,0x5C,0x58,0x3A,0x79,0x92,0xA1,0x55,0x78,0xD0,0x75,0x35,0x85,0xB9, + + 0xC2,0x78,0x3A,0xB6,0xCE,0x30,0x37,0x77,0x60,0x9A,0xEF,0x55,0x3B,0xD9,0xAA,0x53, + + 0x66,0x23,0x4D,0xD1,0xFB,0xC8,0x55,0xF9,0x80,0xA8,0x70,0xAF,0x06,0xEB,0x1C,0x79, + + 0x8B,0x58,0xD4,0x8E,0x7E,0x54,0x68,0x09,0x81,0x1B,0xA8,0x91,0x18,0xA7,0xED,0x1C, + + 0x61,0xE6,0xB0,0x39,0xFB,0x39,0xCA,0x42,0x80,0x88,0x4C,0x81,0x92,0x3D,0x39,0xB4, + + 0x2A,0x8F,0xB9,0x3D,0x7A,0x60,0x05,0xA8,0x13,0xD7,0x57,0xC0,0xA7,0xD7,0xCF,0xE1, + + 0xC3,0xC4,0x87,0x90,0x50,0xB8,0xB3,0x22,0x18,0xD2,0xA1,0x0C,0xFF,0x02,0x7E,0x56, + + 0x2B,0xBC,0xF8,0xE1,0x51,0x33,0x08,0x0A,0x5F,0x1E,0xF9,0x93,0xA3,0xD1,0x36,0xC9, + + 0x09,0xB0,0x4E,0xCD,0xC4,0x90,0x7B,0x9A,0x9C,0x38,0xE0,0x5D,0x75,0xCC,0xFC,0x2B, + + 0x06,0xE3,0x47,0x4F,0x18,0x2A,0xD3,0x81,0x68,0x92,0x87,0xAA,0xF4,0xA1,0x1F,0x6B, + + 0xE7,0x21,0x58,0xED,0x44,0xC0,0x67,0x06,0xCF,0x52,0x20,0x87,0x8D,0xA0,0x40,0x2D, + + 0x06,0x8D,0x4C,0x95,0x3E,0xA8,0x8F,0xC0,0x0C,0x11,0x62,0x20,0x9C,0x43,0x1B,0x30, + + 0xD8,0x8E,0xB3,0x59,0x13,0xD8,0x22,0x72,0xCE,0x6A,0x80,0xC9,0xF9,0xEC,0xDE,0x24, + + 0x25,0x84,0x21,0x46,0xEF,0xE0,0x0F,0x1F,0x49,0x44,0x15,0xA3,0xE9,0x59,0x9D,0x6C, + + 0x26,0x38,0x4B,0x75,0x62,0xC6,0xEF,0x0D,0xAE,0xD0,0xD9,0x61,0xAA,0x1F,0xC0,0x31, + + 0x38,0xC6,0x98,0x61,0xEB,0xAB,0x23,0x71,0x2C,0xF7,0xE6,0x4A,0xBD,0xA0,0xCE,0x0D, + + 0xA4,0xE0,0x13,0x71,0xB6,0xCB,0x2E,0x6D,0x21,0x65,0x5C,0x52,0x3C,0xEA,0xFC,0xB9, + + 0x04,0x4A,0x21,0x2A,0x5E,0xAB,0x57,0xD7,0xF0,0x12,0xCB,0xD7,0x1F,0x49,0xD6,0xB1, + + 0xE4,0x78,0x8B,0x6F,0x62,0x21,0xEA,0x00,0xB3,0xAB,0x7E,0x04,0xA7,0x62,0x38,0xF7, + + 0x6D,0xCA,0x9A,0xF1,0x1A,0xD1,0x62,0xDB,0x26,0x5D,0xCA,0x09,0xA1,0xE7,0xAC,0xE9, + + 0x2B,0x22,0x92,0xE5,0x1B,0x40,0x6F,0x9D,0x26,0x9A,0x3A,0x7E,0x09,0xAB,0xEC,0x05, + + 0x71,0x0B,0x7D,0x6D,0x6F,0xCF,0x6D,0x9F,0x6C,0x61,0x8D,0x13,0x51,0x6C,0xBC,0x1A, + + 0x8B,0xF2,0xB1,0x01,0xB3,0x5F,0x0A,0xCA,0xF3,0x6C,0x26,0xF2,0xDB,0x92,0x02,0x1C, + + 0x96,0x83,0xE6,0x0E,0x5A,0xAA,0x10,0x1A,0x4D,0x8C,0xE4,0x43,0xB5,0xA8,0x3A,0x29, + + 0x2D,0x2C,0x92,0xA3,0xE2,0xEC,0x8A,0x18,0xC0,0x4B,0x5E,0x0D,0xDB,0xAC,0xD7,0xA9, + + 0x6F,0x21,0xCD,0x74,0xFD,0x8E,0x77,0x3D,0x4C,0xD2,0xC9,0xDE,0x7D,0x41,0x53,0x6B, + + 0xB0,0x20,0x14,0x2C,0xEF,0x04,0x7A,0x3B,0x81,0xA1,0xC5,0x57,0xB7,0xE2,0x7A,0x60, + + 0x20,0x3D,0xB2,0xE4,0xDF,0x33,0x14,0x48,0x07,0xD4,0xCF,0x24,0xB1,0x94,0xEC,0x83, + + 0xDA,0x4C,0x78,0x6A,0xF0,0x4A,0x38,0xC1,0x4F,0xBF,0xC4,0xC5,0x01,0x9D,0xB2,0x01, + + 0x54,0x97,0x9B,0x22,0x9A,0x1D,0x54,0x63,0xE0,0x29,0x1A,0x45,0x58,0x0F,0x55,0xB4, + + 0x58,0x9C,0x70,0x7A,0xE1,0x08,0x5F,0xC3,0xE4,0xB3,0xDF,0xB3,0xF4,0xE1,0x04,0x94, + + 0xB2,0x99,0xDE,0x76,0xC9,0x6B,0x0F,0xC5,0xC7,0x6B,0xC7,0x46,0x8E,0xD7,0xC6,0xD9, + + 0x86,0x36,0x57,0x73,0xC0,0xF4,0xDB,0xDE,0x61,0x1C,0x2E,0xD2,0x34,0x05,0x73,0x73, + + 0x59,0x90,0x5A,0xF6,0x17,0x49,0xB5,0x96,0x87,0x97,0x35,0xE3,0x2D,0x02,0xB9,0x2D, + + 0xA1,0x0E,0xD3,0xFA,0xDC,0xB8,0x9A,0x71,0x2E,0xA2,0x02,0x84,0xCB,0x5C,0x20,0xB7, + + 0xC5,0x69,0x59,0x0A,0x63,0xAE,0x68,0x0B,0x41,0x55,0x88,0x93,0xBE,0x98,0x00,0x6B, + + 0x59,0xB9,0x7C,0xA3,0xD6,0xFD,0xD6,0x4B,0xCE,0x99,0xAC,0x45,0x7B,0x80,0x8B,0x19, + + 0xCD,0x92,0x67,0xE2,0xA3,0x17,0x49,0x0B,0xEA,0x43,0xBF,0x2B,0x15,0x0B,0xEF,0xE3, + + 0x30,0xD9,0x91,0x2E,0xCB,0x14,0x01,0x1B,0xEB,0x7B,0x70,0x3B,0xC0,0x54,0x8E,0x4E, + + 0x13,0x27,0x66,0x4C,0xC2,0xB0,0xC9,0x08,0x8D,0xD5,0x8E,0xEA,0x7A,0x5C,0x16,0xCB, + + 0x53,0xBC,0xF9,0xD8,0xF7,0x2C,0x83,0x9A,0x2F,0x20,0x80,0xF8,0x96,0xCE,0xDC,0x29, + + 0x02,0x63,0x67,0xDE,0x41,0x1A,0xF6,0x89,0x11,0x57,0x08,0x9C,0xC8,0x0F,0xAC,0xA8, + + 0x9D,0x1E,0x4B,0xAC,0xC3,0x14,0x0D,0x00,0xB7,0x9D,0x2C,0x0C,0x73,0xF2,0xFF,0x27, + + 0xA1,0x41,0xF1,0xF0,0x53,0x63,0x3E,0x1E,0x9D,0x4F,0xDA,0x75,0x63,0x30,0x76,0x16, + + 0xE0,0x82,0x71,0x9E,0x76,0x4B,0x20,0xCF,0xED,0x4C,0x52,0xE4,0x18,0x09,0x5B,0x69, + + 0xE8,0x53,0x06,0x95,0x98,0xDD,0xA5,0x5E,0x63,0x03,0x6E,0xDA,0x2B,0x77,0x27,0xE2, + + 0x0D,0x42,0x9D,0x15,0xCD,0x63,0x79,0x62,0x63,0xBF,0x1D,0xCA,0x2E,0x3C,0x87,0xFD, + + 0x3B,0xB3,0xCB,0x56,0xE2,0x29,0x40,0x75,0x42,0x62,0x2C,0x9B,0x94,0x91,0xD7,0x15, + + 0x03,0x74,0x72,0x27,0x0D,0xB7,0xCD,0xBC,0xAB,0x6A,0xFB,0x85,0xD5,0x62,0xFA,0xBE, + + 0x2F,0xC1,0x3E,0xAE,0x67,0x7B,0x1C,0x49,0x8E,0x46,0xFE,0x92,0x05,0xE1,0x10,0x7A, + + 0x62,0xCA,0x50,0x42,0x3D,0x5B,0xA6,0xA3,0x51,0xAD,0x83,0xA1,0xE1,0x35,0x58,0x06, + + 0x60,0x19,0x56,0xA9,0xC9,0x64,0x6A,0x0F,0xB5,0x47,0xA3,0xFC,0x19,0xC0,0x24,0xEB, + + 0x85,0x48,0x0D,0xB9,0x3F,0x94,0x62,0x29,0x75,0xE4,0xD6,0x19,0x1C,0x32,0x7D,0x0F, + + 0x69,0x89,0x57,0xB5,0x49,0xBA,0x83,0xCB,0x64,0xB7,0xD9,0x39,0x27,0x8F,0x35,0x20, + + 0xF5,0xA4,0xA1,0xB8,0xED,0xB5,0x8E,0x1D,0x22,0x2F,0x30,0xC2,0xD9,0x94,0x6E,0xA5, + + 0x17,0x6E,0xFB,0xA2,0xB3,0x40,0x41,0x68,0x4A,0xCE,0xD6,0x6C,0x12,0x1C,0x25,0xA7, + + 0x53,0xDF,0xCA,0x5C,0x57,0xDD,0x07,0x7E,0xCD,0x88,0x48,0x45,0x75,0x3E,0x06,0xE4, + + 0xB5,0x2B,0x65,0x39,0xD7,0x5C,0x42,0x29,0x95,0x45,0x93,0xFC,0xC4,0x6F,0x59,0x75, + + 0xBD,0xA7,0x8E,0x6D,0xB1,0x17,0x73,0xBA,0x2E,0x50,0xD7,0x34,0xD0,0x35,0xB0,0xE2, + + 0xDB,0xBD,0xD6,0xD8,0x91,0x51,0x6A,0xA7,0x81,0x36,0x9E,0x32,0xB7,0x8F,0x36,0x35, + + 0x05,0x17,0xA7,0x11,0x43,0xED,0x9C,0xA1,0x52,0xF5,0x1F,0xB4,0x6D,0x62,0x92,0xB1, + + 0xA8,0xED,0x86,0x80,0x9C,0xA1,0x85,0x23,0x29,0x51,0xBC,0x83,0x81,0x23,0xA6,0xA4, + + 0x00,0x91,0x59,0x90,0xF1,0xA4,0x88,0xB7,0x29,0x02,0x00,0x0F,0x48,0x73,0x32,0x82, + + 0xF3,0xDA,0x5E,0x01,0x42,0xC6,0xB6,0xBB,0x8D,0x08,0xD4,0xE4,0x72,0x74,0x63,0x7B, + + 0x40,0xCF,0x93,0x4B,0xBE,0x78,0x2C,0x0F,0xEC,0x43,0xDC,0xF4,0x73,0x75,0x7F,0xBE, + + 0x5D,0xE9,0xC0,0xC5,0xD0,0x8C,0x76,0xB8,0x98,0xFD,0xD5,0xE5,0xF2,0x76,0x58,0x44, + + 0xA3,0xD7,0x32,0xAB,0x6A,0x70,0x0F,0xF0,0xF5,0x6C,0xDD,0xF5,0xF3,0x77,0xF9,0x0A, + + 0xE1,0x6D,0xA9,0x09,0x4A,0xA4,0xB2,0x8C,0xA0,0x4B,0x17,0x24,0x1C,0x82,0x28,0xB5, + + 0xAD,0xBD,0xA5,0xC6,0x17,0xAA,0x8E,0xB8,0xFB,0x92,0x7A,0x82,0xF2,0xB4,0x3F,0x19, + + 0x53,0x5B,0xBF,0xA8,0xB4,0xBA,0xB7,0xBA,0x86,0x3E,0xCF,0x44,0x7C,0x6E,0x9E,0x9E, + + 0x8D,0xB6,0xA4,0x38,0x95,0xAB,0x01,0xFC,0xCF,0x59,0xE6,0x42,0xE5,0x1B,0x57,0x9D, + + 0xFA,0x29,0xA2,0xB1,0x3D,0xDF,0xB9,0xCB,0x7F,0x6E,0xD6,0xEC,0x7A,0x7C,0xA5,0x1A, + + 0x9D,0x38,0x23,0x67,0xE1,0xE9,0x16,0x7D,0x2E,0x26,0xDE,0xFC,0x7B,0x7D,0xAA,0x2B, + + 0x15,0x63,0xC7,0x37,0x5D,0x23,0x1A,0x8F,0x65,0xE8,0xD7,0xED,0xFA,0x7E,0xEA,0xA8, + + 0xBE,0x0C,0xD0,0xBD,0xAE,0x9C,0xF3,0x37,0x73,0x9C,0xDF,0xFD,0xFB,0x7F,0x80,0x71, + + 0x74,0x53,0xA3,0x02,0x57,0xC8,0x0A,0xA5,0xBB,0x6B,0x09,0xD7,0x15,0x49,0x9C,0x70, + + 0xFA,0xC0,0xC3,0x1B,0x49,0xE3,0xA8,0x50,0xF2,0xA4,0x47,0x25,0xB6,0x30,0x5F,0x04, + + 0x25,0x5D,0xF5,0xDD,0x3A,0xE1,0x49,0x33,0x2D,0xB3,0x68,0x79,0x2B,0xE2,0x49,0xB5, + + 0x24,0x28,0xBD,0x58,0x37,0xE1,0x01,0xDC,0x48,0x7E,0x94,0x21,0xBC,0xA0,0x2F,0xC9, + + 0xBA,0x43,0x2E,0xA2,0xC2,0x01,0x8F,0x62,0x42,0x74,0xEA,0x66,0x4A,0x74,0x97,0xD7, + + 0x7D,0x4C,0xC3,0x65,0x83,0x1C,0x8C,0xA0,0xA6,0xBA,0x3A,0xFA,0x09,0x44,0x4E,0x8C, + + 0x63,0xB9,0x16,0x8C,0x6B,0x59,0xE3,0x2B,0x95,0x22,0x72,0x7A,0xDC,0x64,0x8D,0xE9, + + 0x26,0x18,0xA5,0x73,0x97,0x06,0x82,0x95,0x72,0xC9,0x6E,0xCA,0x88,0x10,0x5A,0x0E, + + 0x08,0x28,0xC9,0xB4,0x00,0xC8,0xD7,0x50,0xDA,0x89,0x35,0x7C,0xAC,0x63,0x12,0x27, + + 0xF2,0x14,0xA1,0xD8,0x33,0xC9,0xC5,0x7D,0x69,0x66,0xB8,0xAB,0x6D,0x03,0xDC,0x69, + + 0x7F,0xEF,0xF1,0x42,0x45,0x29,0x0B,0xD5,0x60,0xC7,0x3B,0x0F,0x9A,0x8A,0xF8,0x3F, + + 0x2C,0x14,0x2F,0x3B,0x6D,0x7B,0x9B,0x49,0xA7,0xB8,0x9A,0x81,0x1E,0x14,0x9D,0xB9, + + 0xD3,0x39,0xE8,0x3E,0x9E,0x5A,0xE9,0xB7,0x09,0x5F,0x0D,0x6E,0x5E,0xEC,0xEB,0xC7, + + 0x33,0xDE,0x93,0xA8,0xA6,0x00,0xE0,0xFD,0x9A,0x62,0xFA,0x7E,0x5F,0xED,0xC7,0x16, + + 0xA2,0x8E,0xCF,0x2D,0x61,0x51,0x71,0x6A,0xC4,0x1D,0xF3,0x6F,0xDE,0xEE,0x64,0x26, + + 0x17,0x4A,0x87,0xE0,0x49,0xFB,0x84,0x99,0x14,0xFD,0xFB,0x7F,0xDF,0xEF,0x37,0x73, + + 0x87,0xD0,0xA2,0x91,0x53,0xD8,0xCB,0xBE,0x64,0x1B,0xB0,0x2E,0x5A,0x99,0xC5,0x61, + + 0xA1,0x3C,0x2D,0x8A,0x52,0x38,0xBB,0x4C,0x90,0xD1,0xD9,0xF8,0x96,0x4E,0xA5,0x92, + + 0x5B,0x13,0xE5,0x87,0xF3,0xA9,0xAF,0xD2,0xA5,0x91,0xEF,0x56,0xCB,0x76,0x89,0x23, + + 0xD4,0x3C,0xAD,0x97,0xD1,0x5A,0x5C,0x39,0xDC,0x97,0xC2,0xB3,0xAD,0x32,0xF2,0x4B, + + 0x7E,0x34,0x75,0x52,0x62,0xB4,0xB1,0x22,0xE4,0xCA,0xF4,0xE6,0x76,0xF4,0xB4,0x70, + + 0x86,0x48,0x22,0xE6,0x31,0xF7,0x31,0x61,0xF6,0x2A,0xFC,0xF6,0x77,0xF5,0x65,0x42, + + 0xC2,0x3C,0x5B,0x81,0x0E,0x3D,0x01,0x93,0xF4,0xA4,0xF5,0xE7,0xF6,0xF6,0x92,0x21, + + 0x20,0x12,0xFB,0xB7,0x90,0x32,0x7F,0xF3,0xB3,0x36,0xFD,0xF7,0xF7,0xF7,0x82,0xF8, + + 0xA2,0xD9,0x78,0x9B,0x78,0x47,0xF6,0x8E,0x48,0xF8,0x3F,0xCA,0x5B,0xA3,0xC6,0x1D, + + 0x09,0x94,0x29,0x61,0x61,0x46,0x5F,0x4E,0x04,0xDA,0x05,0x4C,0xCA,0x06,0x19,0xA7, + + 0x2E,0x62,0x58,0x7C,0xD9,0x70,0x33,0x54,0x1B,0x84,0x11,0x28,0x42,0x97,0xD0,0xBC, + + 0x0C,0x9D,0x50,0x64,0x0D,0x71,0xB8,0xBA,0xB1,0x66,0x53,0x9D,0xE6,0xD8,0xC3,0x1B, + + 0x54,0x3E,0x4E,0xB5,0xC1,0xBC,0xFD,0x0A,0x11,0x88,0xF6,0xEE,0x7E,0xFC,0x9F,0xE9, + + 0xFD,0x79,0x72,0xAA,0x02,0x26,0x81,0x14,0x8C,0x4F,0xFE,0xFE,0x7F,0xFD,0x98,0x28, + + 0x03,0x72,0xA1,0x6B,0xA7,0x44,0x92,0x51,0x4B,0x71,0xF7,0xEF,0xFE,0xFE,0xB6,0x0F, + + 0xFE,0xDC,0x89,0x7C,0x66,0x52,0xF8,0xF3,0xEF,0xEE,0xFF,0xFF,0xFA,0xC0,0x80,0x00, + + 0x55,0x40,0xF8,0x76,0xFB,0xDA,0x69,0xF0,0x0C,0xC1,0x50,0x25,0xAC,0x9B,0x4C,0xB4, + + 0x25,0x41,0x92,0x3A,0x30,0xC1,0x32,0xE0,0x1D,0xC9,0xE8,0xEB,0xE6,0x2D,0x01,0x85, + + 0x86,0x02,0xE1,0xC5,0x5E,0x2F,0x12,0x6B,0x4D,0x21,0x90,0xE3,0x72,0x2E,0x09,0x05, + + 0x22,0x66,0x49,0xC4,0x90,0xAE,0x09,0x7B,0x4D,0x4B,0xEF,0x26,0xF7,0x27,0x65,0x46, + + 0x96,0x60,0xBB,0x3A,0xC8,0xFB,0xF0,0x6E,0xCE,0xC9,0x90,0x17,0xD6,0x55,0xA7,0xBE, + + 0x83,0x9D,0xF2,0x0A,0xE8,0x64,0xB7,0x9B,0xC3,0xD9,0x09,0x87,0xDF,0x68,0x79,0x66, + + 0x25,0x16,0x46,0x96,0x31,0x1B,0xB5,0x46,0x65,0x56,0xAF,0x63,0x3B,0x02,0x69,0x97, + + 0x03,0x58,0xF6,0xBF,0x78,0x28,0x78,0x93,0x3E,0x4E,0xA7,0x97,0x7F,0x6A,0x92,0x2C, + + 0x2E,0x48,0xDB,0x15,0xBF,0x6A,0x10,0xDA,0x0F,0x4C,0xB4,0x8D,0xD4,0xB3,0x0A,0x18, + + 0x09,0x49,0x4A,0xC1,0xFD,0x2F,0x20,0x3A,0x55,0x69,0xEA,0x1A,0xBB,0x0A,0xC5,0x6E, + + 0xAE,0x49,0x5D,0xB9,0x1D,0xDF,0x17,0x7D,0x2F,0xB4,0xB3,0xD0,0x98,0x24,0x1E,0x26, + + 0x89,0x0B,0x03,0x58,0x38,0xA1,0x9B,0x29,0xD9,0x49,0x2B,0x8A,0xF7,0x27,0x62,0x1E, + + 0x8A,0x82,0x79,0x5E,0x3A,0x62,0x56,0x74,0x1F,0x45,0x42,0xAC,0x42,0x51,0x6A,0xFD, + + 0x8B,0x0F,0x94,0xBE,0x0B,0xD0,0x48,0x7C,0xA9,0xCD,0xA2,0x74,0xBE,0x2C,0x63,0x20, + + 0x0A,0x41,0x80,0xB3,0x62,0x21,0xFF,0x63,0x69,0xF3,0xC5,0x6B,0x69,0xAA,0x6B,0x6F, + + 0x0B,0x52,0x5C,0xA2,0x62,0x4C,0x5B,0xB9,0x71,0xE0,0x2E,0x83,0xCF,0x52,0x04,0x80, + + 0x78,0xF8,0x7C,0x74,0x38,0x3F,0x2C,0xC0,0xD0,0x58,0x7B,0x4A,0xF0,0xB8,0xDE,0xB0, + + 0x26,0xE9,0x64,0xAE,0xB3,0x19,0xE5,0xC2,0xEF,0x34,0x73,0x5A,0xF1,0xA2,0x4F,0x28, + + 0x82,0x11,0x2D,0xBB,0x37,0x47,0x64,0xD3,0x6E,0x37,0x2B,0xAC,0x57,0x62,0x02,0x1D, + + 0x24,0xE6,0x0B,0x65,0xF5,0x3C,0x64,0xC3,0x6F,0x36,0xBC,0xB3,0x21,0x17,0x6A,0xC6, + + 0xB3,0x88,0xBF,0xBA,0x10,0xD9,0xAF,0xE4,0xCF,0x15,0x70,0x48,0x99,0x10,0x71,0x0E, + + 0xCE,0x11,0x60,0x4B,0xCC,0xB8,0x66,0x77,0x47,0xA8,0x68,0x16,0x57,0x7F,0x6B,0xC6, + + 0x73,0xE8,0x83,0x63,0x79,0xBB,0x70,0xE7,0x76,0x32,0xEC,0x07,0x1B,0x79,0x4A,0xDA, + + 0x27,0x43,0x2E,0x2B,0xB5,0x77,0x7A,0x13,0x03,0x42,0xD8,0x9E,0x9B,0x33,0xC6,0x55, + + 0xCC,0xB3,0xE6,0xCD,0x7C,0x37,0x3F,0xFB,0xEC,0x44,0x28,0xA5,0xDB,0x1D,0x21,0x69, + + 0x02,0x1C,0x09,0x7E,0xBB,0x11,0x66,0x9F,0xF8,0xF5,0x22,0xB5,0x9E,0x69,0x37,0xD7, + + 0xC3,0x11,0xE7,0xCC,0xF0,0xB1,0xBE,0xFA,0x64,0x06,0x78,0x43,0x78,0x39,0x51,0x91, + + 0x8A,0xB0,0x8D,0x7F,0xBD,0xD8,0xBF,0xF3,0x7C,0xF7,0x70,0x53,0x79,0x60,0xE2,0xBA, + + 0xA4,0x79,0xA9,0x8B,0xDB,0x8A,0x2E,0xB7,0xBA,0x53,0xFF,0x1A,0x6A,0xB9,0x75,0x36, + + 0x93,0x12,0xEE,0xD9,0x3D,0x7D,0x26,0xCA,0x1F,0x82,0xDB,0x97,0x13,0x39,0xBD,0xC1, + + 0x75,0x21,0xB8,0xBF,0x68,0xA1,0x65,0xC1,0x3F,0xEA,0xAF,0xC9,0x44,0xA1,0x70,0x36, + + 0x8F,0x2B,0xA0,0x7D,0x70,0xDF,0xCF,0x43,0xEB,0x2F,0xF6,0x1B,0x12,0x70,0x20,0x02, + + 0x04,0xC0,0x5B,0xE4,0x96,0x88,0x20,0x62,0xC4,0xC6,0xC0,0xF9,0xB7,0xA2,0x28,0x12, + + 0x05,0xC1,0xD0,0x94,0x10,0xF2,0x3C,0xB5,0x64,0x56,0x55,0x5D,0xD0,0xE6,0xEE,0x07, + + 0x84,0x82,0x1D,0x65,0xD5,0xE2,0x7E,0x83,0x25,0x19,0xB1,0x3B,0x03,0x5F,0x29,0x87, + + 0x85,0x83,0x93,0xF5,0x39,0x23,0x8D,0xCC,0x86,0x30,0x51,0x94,0xF1,0x1E,0x40,0xCC, + + 0x86,0x91,0x9F,0x06,0x5A,0xB2,0xD0,0x0D,0x26,0x84,0xE6,0x60,0xE5,0xA9,0x48,0x1C, + + 0x87,0xE6,0x10,0x72,0x9A,0xB3,0xCF,0x57,0x6B,0x6D,0x68,0x05,0xDB,0xB4,0x41,0x8D, + + 0x06,0xCB,0xA9,0x53,0x5D,0xA9,0x03,0x73,0xC6,0xCC,0x8F,0x85,0xC6,0xAB,0x4C,0x55, + + 0x13,0xE3,0x96,0x4A,0x5C,0xA8,0xD9,0x56,0x45,0x87,0x87,0x70,0x6E,0x81,0x22,0x0A, + + 0x0C,0xC8,0xDA,0x8A,0x43,0x06,0x62,0x59,0x54,0x42,0x6D,0x26,0x72,0xAE,0x2A,0x1A, + + 0x0D,0xC9,0xD7,0xEF,0xAF,0x39,0x8E,0x5A,0x45,0x19,0xCA,0xE1,0xB2,0xA8,0x23,0x9E, + + 0x8C,0x8A,0x7C,0xA2,0x9A,0x5B,0xF4,0xD5,0x2D,0xAC,0x41,0xE9,0x7E,0xA6,0xE6,0x47, + + 0x8D,0x8B,0x43,0x35,0x1F,0xA3,0x94,0xEB,0x4C,0x6A,0x05,0x36,0x3A,0xFB,0x59,0xA4, + + 0xEF,0xEA,0x5B,0x6A,0x9B,0x02,0x71,0x8F,0xF0,0xEC,0x8C,0x8C,0xF2,0xD1,0x43,0x00, + + 0xC6,0xE9,0x1A,0x8D,0xFE,0xC1,0xDE,0x18,0x6B,0xC7,0xFE,0xFF,0xB6,0xA9,0xD7,0x01, + + 0x47,0xCA,0xD8,0xEF,0x73,0x9E,0xF1,0x60,0x4A,0x9A,0x17,0x4B,0x6D,0x99,0x40,0xB9, + + 0x23,0x93,0x8C,0xA4,0x7E,0x39,0xFB,0x0C,0xEB,0xB8,0xEE,0x8C,0x5B,0x42,0x01,0x82, + + 0x4F,0xB4,0xED,0x98,0x48,0x44,0x90,0xEC,0xBB,0xED,0x08,0xAF,0xD3,0xE0,0xAC,0x92, + + 0x94,0x1C,0x7C,0x50,0xDF,0xFD,0x63,0xFA,0x1A,0xF1,0x9D,0xB0,0xA5,0x95,0xDA,0x87, + + 0xA4,0xF7,0xF5,0x9D,0x9E,0x06,0xDE,0xD4,0x64,0x05,0x5A,0x49,0x74,0xF9,0xC9,0xB4, + + 0x16,0x1E,0x5D,0xD1,0x1F,0x48,0xFD,0x73,0xF6,0xD5,0x01,0xBE,0x56,0x96,0xC4,0xCC, + + 0xAA,0x09,0x48,0xB4,0xE8,0x4B,0x87,0xE2,0x5E,0x29,0xF5,0x00,0x52,0x09,0x42,0xD4, + + 0xB6,0x09,0xC2,0x34,0x84,0xD0,0x4B,0x10,0x43,0x58,0x07,0x8D,0x4D,0x4A,0x9C,0xA1, + + 0x0A,0x8A,0xDF,0x59,0x41,0xF7,0x52,0x01,0x26,0x29,0x60,0x18,0x03,0xA5,0x43,0xD4, + + 0x76,0x98,0xD5,0xFF,0x14,0x1B,0x56,0x19,0x8C,0xD8,0xC6,0x5F,0x04,0xB6,0xC2,0xAD, + + 0x2D,0xF8,0x73,0x0A,0x34,0x4D,0x3A,0xD4,0xCD,0x52,0x59,0x40,0xFC,0x71,0x2F,0x45, + + 0xCE,0x9D,0x19,0xA1,0x41,0xFB,0xB9,0x58,0xEF,0xF1,0x86,0x99,0x9A,0xE9,0xDD,0x89, + + 0xA4,0xD5,0x10,0x52,0xBA,0x9A,0xCC,0x49,0x40,0x51,0x92,0xA9,0x68,0x9E,0x3A,0xE9, + + 0x23,0xFE,0xAB,0xA0,0x41,0xB8,0x84,0xD9,0xAC,0x9B,0x50,0x51,0x7D,0xE1,0xD2,0x80, + + 0xE7,0xD8,0x9E,0x24,0xD7,0xF8,0x77,0x95,0x12,0x23,0xCF,0xF1,0xDD,0x79,0x45,0x05, + + 0x9A,0x43,0xA8,0xD9,0x9E,0xAE,0xAA,0x00,0x9A,0x6B,0xED,0x04,0xC6,0x29,0x4E,0x91, + + 0x67,0xFA,0xA1,0xC9,0x9D,0xFE,0xCC,0x4E,0x19,0x43,0xDC,0xE0,0x5D,0x7B,0x56,0xD9, + + 0x30,0xAB,0x97,0xFB,0x01,0x9F,0x44,0x71,0xEE,0x7F,0x87,0xCD,0x8F,0x60,0xA1,0xE2, + + 0xF9,0x85,0xEE,0xE6,0x87,0xAD,0x5D,0x8E,0x40,0xF1,0x24,0x46,0xEF,0x21,0x70,0x22, + + 0xD8,0x14,0x71,0x66,0x80,0x1E,0xB7,0x6E,0x98,0xDE,0xE5,0x3C,0xF4,0x3E,0x12,0xFB, + + 0x35,0xD6,0xAE,0xEA,0x71,0xBE,0x2A,0x2E,0x63,0xC6,0x29,0xCA,0xC0,0x2F,0x71,0x1E, + + 0x22,0x86,0x19,0x7A,0x4F,0x8C,0x27,0xD3,0x5C,0x7C,0x98,0x53,0x4C,0x7C,0x56,0x46, + + 0xE9,0x40,0xC0,0x5B,0x96,0x8B,0x9F,0xEA,0xC0,0x58,0xFE,0xD4,0x8F,0x6B,0x36,0x57, + + 0x27,0x0B,0x63,0xBC,0x17,0xF9,0xEC,0x03,0x73,0x4A,0x98,0x07,0x6A,0xE2,0x7F,0xA3, + + 0xE8,0x62,0x65,0x2A,0x47,0x7B,0xED,0x12,0xAE,0x49,0x65,0x1A,0x71,0x62,0xED,0x93, + + 0x07,0x18,0x65,0xD0,0x46,0x45,0x39,0x3A,0x6E,0x05,0x5D,0x78,0x32,0xC8,0x15,0x52, + + 0x3A,0xA9,0xFA,0x62,0xCE,0x60,0x4B,0xA0,0xB5,0xB9,0x02,0x56,0xBF,0x78,0x72,0x2A, + + 0x79,0xB5,0xF2,0x76,0xCB,0x81,0x25,0x9D,0xB2,0xD4,0x60,0x34,0xA4,0xA6,0x7B,0xF2, + + 0x31,0xFE,0xFB,0x66,0x42,0x62,0xEC,0x57,0xE6,0x95,0xAC,0xDB,0xC8,0xB7,0x5D,0xFB, + + 0x7A,0x76,0xF3,0x39,0x28,0x22,0xCF,0xC3,0x74,0x28,0x0B,0x47,0x7A,0x0E,0x78,0xCF, + + 0x29,0x4E,0xAB,0xA7,0xE5,0x42,0x92,0xEC,0x6E,0x22,0xCF,0xEE,0x93,0xA5,0x4D,0x7F, + + 0xA7,0x6B,0xDC,0xC2,0x18,0x94,0x4B,0xF0,0xEE,0xEB,0xA2,0xFE,0x92,0xB8,0x19,0x48, + + 0x04,0x05,0xFD,0x79,0x44,0x83,0x0A,0x58,0x6F,0xE8,0xAB,0x4A,0xB9,0x91,0x32,0xA9, + + 0x83,0x69,0xF5,0x5B,0x6F,0x4B,0xCD,0x39,0xC7,0x0D,0x6C,0x55,0x2F,0x8E,0x7C,0x88, + + 0x4B,0x54,0xFF,0x4E,0x9B,0x71,0xC0,0xEB,0x62,0xBE,0xBF,0x20,0x38,0xEC,0xB7,0x35, + + 0xD6,0xAD,0xF3,0x9C,0xD4,0xEE,0x14,0xA5,0x90,0x27,0x9A,0xEE,0x90,0x1A,0x05,0xFE, + + 0xDC,0xED,0x3F,0x7F,0xA0,0xFF,0x13,0x2E,0x59,0x04,0x55,0xB4,0x21,0x30,0xD9,0xCA, + + 0x70,0x70,0x8C,0xE3,0x4E,0x72,0x66,0xDA,0x77,0x6C,0xA7,0x32,0x5D,0xDF,0x5C,0x01, + + 0x24,0x56,0x79,0x56,0x26,0x69,0xF8,0x08,0x40,0x19,0xEB,0x76,0x91,0xE9,0x88,0x44, + + 0x10,0x54,0x20,0xA7,0xB7,0xB3,0x3A,0xD9,0x60,0x35,0x85,0xC1,0xD6,0x8A,0xC3,0x29, + + 0xC2,0x54,0xA7,0xC5,0xB3,0x1C,0x33,0xCD,0xF0,0x1B,0xB7,0xE4,0xF3,0x07,0x8D,0x54, + + 0xE5,0x0C,0x4C,0xA6,0x3F,0xB1,0x9D,0x74,0xB5,0x15,0x71,0x67,0x73,0x7F,0x2D,0xDB, + + 0xAC,0x7B,0xBE,0x76,0x94,0x35,0x91,0x62,0xC9,0xD5,0x32,0xFF,0xDB,0xD4,0xEF,0xE2, + + 0xB3,0xB4,0x3A,0xFE,0xC6,0x78,0xE3,0x9C,0x02,0x56,0xB7,0x5E,0xD5,0xD5,0x29,0x8F, + + 0x36,0xA7,0xF8,0xAA,0x19,0xE5,0x3A,0x47,0x09,0xC6,0x33,0xE7,0x31,0x3E,0xAF,0x13, + + 0xA8,0x8B,0x37,0x67,0xA9,0x76,0x5F,0xC6,0x95,0xA4,0x3B,0xEE,0x5A,0xD7,0x53,0x4C, + + 0x24,0xCE,0xC6,0x8C,0x7F,0x97,0x96,0xDF,0x96,0x4D,0xD4,0x1C,0xFE,0x33,0x8D,0x29, + + 0x16,0x3D,0xCA,0x22,0xDA,0x5E,0x1B,0xE6,0x03,0xA9,0xD6,0x0F,0xF7,0xD0,0x1E,0xF4, + + 0xAC,0x7C,0xDA,0xCC,0x47,0xBF,0xE4,0xDC,0xEC,0x84,0x47,0x92,0xFC,0x7C,0x16,0xEC, + + 0xC8,0x3F,0xAF,0x8E,0xDE,0x30,0xCD,0x7D,0xE1,0xE2,0x49,0x1F,0x57,0xD2,0x83,0xE0, + + 0xE4,0x5F,0x27,0x7C,0x99,0xC2,0xCD,0xA2,0x8B,0xA0,0x8F,0xC4,0xF8,0x3D,0x50,0x20, + + 0xD8,0x2D,0x13,0x93,0xE2,0x5C,0x5D,0xDD,0x19,0xDF,0x28,0x4C,0xF2,0xF1,0x14,0xE1, + + 0x39,0x76,0xDA,0x7C,0x9A,0x1D,0x54,0x63,0x84,0xBF,0xC9,0x00,0x29,0xED,0x51,0x2F, + + 0x5C,0xB0,0x6D,0xE8,0x06,0x8C,0x07,0x41,0x7E,0x9C,0x86,0xD1,0xC5,0x3E,0x1E,0x44, + + 0x96,0xE0,0xB9,0x42,0xC3,0xC8,0xB4,0xF6,0xCB,0xDF,0x30,0x73,0xB5,0x30,0x8C,0x3A, + + 0x26,0x78,0x95,0xA9,0x98,0x18,0x39,0x14,0x8D,0x24,0xD6,0xD4,0xAB,0xB4,0x5B,0xA6, + + 0xE5,0xC6,0x25,0x19,0x98,0xB8,0xE5,0x05,0x0C,0xD7,0xE7,0x78,0xB2,0xE0,0xDD,0x74, + + 0x2B,0x83,0x0E,0x2D,0x41,0xAD,0x31,0x76,0xC1,0xA5,0x4A,0x5E,0xD1,0x07,0xD9,0x78, + + 0x7E,0x17,0x32,0x64,0x3D,0x58,0xA2,0xC2,0x5E,0x35,0x4A,0x26,0xA1,0xA7,0x7C,0xF8, + + 0xF6,0x04,0x11,0xBB,0xEA,0x14,0xC1,0x41,0x63,0x76,0x1E,0xDC,0xDE,0x8D,0x9A,0x39, + + 0xF4,0x56,0x1C,0x48,0xB2,0x55,0xA4,0xD4,0x39,0xA9,0x23,0x05,0x58,0x4E,0x78,0xE1, + + 0xA9,0x20,0x7F,0xE4,0x6C,0xC8,0x00,0x9E,0x3E,0xF7,0xD3,0x39,0xDB,0x4B,0x8D,0x54, + + 0x62,0x78,0xAB,0x3D,0x27,0x25,0xB0,0xAD,0x7D,0x9D,0x88,0xEA,0x1C,0x4F,0xFB,0xDE, + + 0x46,0xAB,0x7C,0x38,0xE0,0x2B,0xC2,0xE9,0x77,0xC5,0x80,0x0D,0x37,0x6B,0x72,0x51, + + 0xB6,0x3A,0xE7,0x2F,0x99,0xB5,0xCB,0xF8,0xFA,0xDC,0x5F,0x1C,0xBA,0x68,0x55,0x36, + + 0xEE,0xAF,0x6F,0x1F,0x8A,0xC1,0xFF,0xFF,0xC1,0x1D,0xFF,0xBF,0xC7,0x83,0x5A,0x84, + + 0xD1,0xE6,0xDB,0x8E,0x91,0x6F,0x8F,0x07,0x93,0x6D,0x10,0xEC,0xBD,0xB4,0x17,0x19, + + 0xD6,0x61,0x96,0x11,0xC6,0x3A,0x17,0xF8,0x4B,0xCD,0xD4,0xB0,0x94,0x97,0xDE,0xF8, + + 0x32,0x2D,0xA4,0xE1,0x4B,0xF3,0xE1,0x58,0x35,0xB1,0x9C,0x83,0x77,0x96,0x43,0x71, + + 0x62,0x1E,0xA9,0x10,0x4E,0x38,0x7D,0x64,0xA9,0xA5,0x45,0xBF,0x96,0xD3,0x9C,0x3E, + + 0xB7,0x6F,0x50,0x98,0x95,0xB2,0xC3,0xCE,0x92,0xE5,0xE5,0x04,0x8B,0xB6,0x93,0x56, + + 0x78,0x83,0xE7,0x3E,0x13,0xB3,0xC3,0xA9,0xB6,0x08,0x3C,0x72,0x71,0xB7,0x5B,0x2E, + + 0x51,0x2D,0xCB,0xCD,0xB0,0x94,0xB5,0x3F,0xFC,0x6A,0xB5,0x3E,0x1D,0x92,0xB6,0x98, + + 0xD8,0x3A,0xC3,0x92,0xB1,0xD5,0x56,0x77,0xED,0x18,0x3D,0xE2,0xC4,0x16,0x8D,0x65, + + 0xCD,0x24,0x26,0x09,0xCB,0x33,0x0D,0x24,0xDD,0xEE,0x52,0x48,0x6C,0x73,0x1F,0x9C, + + 0x09,0x8E,0x96,0x74,0x91,0xB4,0x41,0xC0,0xFB,0x46,0xE4,0xBB,0xF3,0xB6,0xDE,0xF9, + + 0x7D,0xA5,0x23,0x08,0x43,0xFB,0x3F,0xA7,0x15,0xAC,0x37,0x28,0x5B,0xEA,0x2F,0xD8, + + 0x17,0x9B,0xD2,0xB8,0x1C,0xE4,0x06,0x30,0x5E,0x2B,0xE5,0xAF,0xD2,0x7E,0xBB,0x34, + + 0x55,0x63,0x74,0x26,0x06,0xBA,0xDB,0x95,0xF3,0x83,0x4E,0xFE,0xD9,0xBD,0x47,0x27, + + 0x33,0xE6,0x7C,0x36,0x43,0xF0,0x7F,0x9C,0x90,0xB1,0x81,0x7A,0x28,0xCF,0xA7,0x16, + + 0x3C,0x45,0xC9,0x29,0xB8,0xDC,0x2E,0xC2,0x4B,0x01,0xCF,0x15,0x52,0xF3,0x4F,0x22, + + 0x50,0xDD,0x10,0xD7,0x1A,0xB9,0x26,0x5B,0xE9,0x9D,0x6F,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x74,0xFD,0xC0,0x18,0x9D,0xA6,0x72,0x20,0x41,0x00,0x16,0x2C,0xF5,0xBF,0xB7,0x60, + + 0x00,0x08,0xC0,0x15,0x35,0x8C,0x0F,0xB2,0x88,0xA2,0x74,0x10,0xA4,0x90,0x1B,0x75, + + 0xA1,0x10,0x89,0x7B,0x52,0x22,0xFD,0x05,0x21,0xED,0xF3,0x20,0xD1,0x22,0xCD,0x62, + + 0xF4,0x84,0x10,0xA7,0x95,0xD3,0x21,0xCE,0x28,0xF2,0x66,0x47,0xFF,0xBC,0xA7,0x80, + + 0x06,0xD0,0x39,0x83,0x8C,0x2E,0xEA,0x02,0x9C,0x42,0x69,0xFE,0x53,0x45,0x08,0x10, + + 0x05,0x27,0x8C,0x58,0x60,0x25,0x50,0x79,0xBE,0xC3,0x98,0xC9,0x55,0x67,0x56,0x32, + + 0xFA,0x44,0x41,0x06,0xAB,0x64,0x78,0x12,0x63,0x90,0xB1,0x36,0xBC,0x24,0xC9,0xBE, + + 0xEB,0x0A,0x96,0x50,0x95,0x67,0x71,0x0F,0x01,0x47,0x8F,0x45,0x98,0xD8,0x06,0x0D, + + 0xF6,0xF1,0xDB,0x24,0xBD,0x6A,0xBE,0xB7,0x49,0x08,0x7E,0x53,0x9A,0xC8,0x0E,0x78, + + 0x41,0xFE,0x82,0x62,0xDB,0x29,0xDA,0xB8,0x48,0xE6,0xBA,0x7C,0x5D,0x07,0x06,0x7A, + + 0xFD,0x83,0xC3,0x11,0x15,0xAC,0x3F,0x40,0x21,0xFB,0x28,0x5D,0x58,0xEC,0x94,0x1D, + + 0x06,0x4A,0xC3,0x1C,0xBD,0x86,0xBF,0x1E,0x68,0xB4,0x0B,0xB9,0x88,0x5C,0xBD,0x26, + + 0x24,0xD3,0xAD,0x23,0x1C,0x2E,0x1A,0x69,0x6E,0x0E,0xE8,0xD4,0xA9,0xC7,0xBC,0xDC, + + 0x09,0x13,0x5D,0xA3,0xEA,0xFE,0x0C,0x83,0x20,0x42,0x9A,0xBC,0x5D,0x6F,0x1C,0x4C, + + 0x8C,0x6C,0x8C,0xC9,0x98,0x8D,0x17,0x63,0xCC,0x4C,0xAB,0x69,0x27,0x2C,0x03,0xC9, + + 0x8D,0x0D,0x0B,0xDD,0x23,0xB4,0xDB,0x06,0xCD,0x4D,0x1D,0x3A,0x01,0xB2,0x52,0x74, + + 0x38,0xE5,0xC4,0x5D,0xDB,0x54,0x84,0xB1,0x18,0x54,0x78,0x36,0xE1,0xAD,0x0F,0x21, + + 0xA9,0x61,0xCC,0x58,0x37,0xE1,0xA4,0xB4,0xEE,0x10,0xA2,0xD8,0x10,0x31,0xDB,0x8C, + + 0xC6,0x49,0x31,0xE7,0x4F,0x70,0x3F,0xD2,0x81,0x53,0xF7,0xA5,0xF3,0xB2,0xBB,0x97, + + 0xBD,0x0E,0xD3,0xD5,0xB5,0x5D,0x44,0x9C,0x44,0x3D,0x85,0xB1,0x7E,0x32,0x84,0x40, + + 0x4F,0x56,0x28,0x56,0x36,0x3E,0x50,0x20,0x66,0x38,0x38,0x76,0x73,0xE9,0x93,0xAE, + + 0xE1,0x15,0xCE,0x94,0x37,0x5B,0xA3,0x74,0x61,0x5D,0x30,0xD0,0x75,0x77,0x05,0x54, + + 0x2D,0x90,0x47,0xCD,0x17,0xB0,0xC5,0x09,0x86,0x1B,0xB7,0xE5,0xF3,0x36,0x05,0xD5, + + 0x2A,0x2E,0x5D,0x12,0x31,0x0B,0x9D,0x71,0x89,0xE8,0x4F,0x32,0xF5,0x35,0xA2,0x90, + + 0xA4,0x9C,0x16,0xFF,0x41,0xB1,0x74,0xBC,0x6B,0xE8,0xCF,0x8D,0xDD,0x3A,0x30,0xE8, + + 0x09,0x34,0x93,0x18,0x3B,0x63,0x9C,0x78,0x2D,0xA4,0x8F,0x38,0x7B,0xE3,0x07,0x89, + + 0xFC,0x23,0x03,0xED,0xBC,0x16,0x16,0xCF,0x17,0xDC,0xD7,0xB1,0x07,0x61,0x8F,0x5E, + + 0x8D,0x00,0xF1,0x9A,0x15,0x36,0xB3,0x2B,0xE5,0x51,0x5F,0x3D,0x93,0xC4,0xAA,0xEC, + + 0xC3,0x75,0xFC,0xAE,0xF8,0x69,0x0F,0xC9,0xCF,0x83,0x88,0xAC,0x36,0x3E,0xDE,0x30, + + 0x17,0x50,0x49,0x34,0x57,0x70,0x1A,0xFC,0xE6,0xEB,0x32,0xD8,0x7D,0x7F,0x57,0xBA, + + 0xAE,0x70,0x07,0x5D,0xCE,0x34,0x97,0x69,0xEB,0x1C,0xD9,0xE9,0xFB,0x3E,0xA3,0x4B, + + 0xA7,0x15,0x30,0x59,0xB9,0x0E,0xE6,0x63,0xE8,0x5D,0x41,0x79,0xF9,0x9D,0x9F,0x86, + + 0x40,0xF0,0xBF,0x76,0x10,0xAB,0xF0,0xA2,0x51,0x82,0xF8,0x27,0x70,0xA2,0x16,0x52, + + 0x55,0xE5,0x90,0xE9,0x26,0x60,0x28,0xF2,0x03,0x6C,0xBC,0x56,0x51,0xCD,0xA4,0x69, + + 0xF2,0x32,0xB2,0x85,0x5D,0xD1,0xB2,0x4E,0x49,0x44,0xFA,0x19,0x29,0x6B,0xE2,0x0B, + + 0x0E,0xEA,0x11,0xE9,0xE8,0xA8,0x2E,0xB7,0xC7,0x79,0xA4,0xF0,0xF1,0x4E,0xE9,0xB1, + + 0x8A,0xE1,0xE0,0xBF,0x1A,0xE6,0x38,0xE6,0x44,0x26,0x93,0x26,0x52,0xC8,0x47,0xD6, + + 0x58,0xD1,0xA8,0x8F,0x11,0xA7,0x1B,0x32,0x5B,0xAB,0xE2,0x56,0xF6,0xA5,0x59,0xBC, + + 0x5F,0xFB,0x61,0x9C,0x23,0xE4,0x8E,0xA4,0x1C,0x1B,0xEC,0xA0,0xF2,0x4B,0xD6,0x14, + + 0x45,0xC4,0xBF,0x10,0x49,0x3A,0xC6,0xE1,0xC6,0x1A,0x15,0x53,0xA8,0xC7,0x23,0xC2, + + 0x65,0x38,0xA5,0x49,0x9E,0x94,0x4C,0x2D,0xE0,0xC5,0xA8,0x0E,0xBD,0xA8,0x35,0x13, + + 0x26,0x70,0x6A,0x8E,0x69,0xA3,0xFA,0x26,0x70,0xA5,0xA2,0xAE,0x6E,0x28,0x37,0x7F, + + 0x9C,0x26,0x99,0x6D,0x5E,0x51,0xCC,0xAF,0xCE,0x23,0x5F,0x0B,0x35,0x53,0xAA,0xDF, + + 0xA2,0x1B,0xAF,0x3B,0x68,0xE9,0x59,0x1B,0xCE,0xEB,0x03,0xBB,0xDF,0x3B,0x2A,0x4E, + + 0x81,0xCD,0x01,0x0E,0x1A,0x80,0x10,0x6A,0x4F,0x8C,0x32,0x37,0x7A,0xE4,0x52,0xC8, + + 0x9E,0xCF,0xFA,0x28,0x1B,0xC3,0xD6,0xE8,0x47,0xC5,0xC2,0x81,0x59,0xEF,0x8F,0xC9, + + 0x17,0x03,0xFE,0x6B,0x77,0xC7,0x9F,0x4F,0x27,0x77,0x37,0xED,0x17,0x2D,0x29,0x67, + + 0x8C,0x8D,0x7B,0xB7,0xA3,0xE2,0xF9,0x08,0xFA,0x49,0xF3,0xFB,0xDD,0x4C,0xB1,0xE4, + + 0xC6,0xD0,0x5B,0x04,0xFD,0x43,0xB4,0x65,0x40,0x7D,0x74,0x7A,0x6E,0x9E,0xC0,0x00, + + 0x29,0x9B,0x6C,0x8A,0x5E,0xBB,0x7C,0xC7,0x63,0xD3,0xDE,0xB6,0x74,0xB1,0xA6,0x8B, + + 0x01,0x6D,0x9D,0x03,0xB6,0x08,0xAC,0xC3,0xB0,0x90,0x0A,0x35,0x8B,0x2F,0xAF,0xEC, + + 0x28,0x15,0x2D,0xD4,0x8C,0xDD,0xFB,0xF4,0x27,0xD7,0x51,0x93,0xC6,0x42,0xE6,0xCA, + + 0x83,0x12,0x48,0x54,0x7D,0x29,0xCF,0x66,0x64,0x6E,0x34,0x67,0x54,0xFC,0xFC,0x50, + + 0xB6,0xE5,0x00,0xF2,0xB5,0xA9,0x1E,0x3E,0x96,0x53,0xC2,0x93,0x57,0x98,0x67,0x83, + + 0xA2,0xF8,0x87,0xC7,0xB5,0xF6,0xB5,0x63,0x8C,0xB8,0x75,0xA4,0xCF,0xB7,0x55,0x14, + + 0x65,0x17,0xD7,0xB5,0xD7,0x1D,0x7D,0x33,0xEF,0x96,0x7D,0x30,0xD3,0x0C,0x22,0x4A, + + 0x28,0xF6,0x36,0xFD,0x5D,0xB9,0x8D,0x38,0x6C,0xD2,0x0E,0x5D,0x04,0xBA,0x14,0xF8, + + 0xEF,0x9C,0xF7,0xB3,0x98,0x46,0xA7,0x08,0x65,0x29,0x59,0xFE,0x69,0xE2,0xB7,0x4C, + + 0x2E,0x86,0x1B,0x8B,0x33,0xFB,0xB7,0x6C,0xC8,0x77,0x73,0xE1,0x0B,0x94,0x4F,0xD1, + + 0x00,0x96,0x43,0x0D,0xB1,0xB1,0x66,0x9A,0x48,0x99,0xAE,0xD9,0x02,0x26,0x2E,0xDF, + + 0x82,0x91,0x99,0x4C,0xAF,0xD1,0x48,0x93,0x8C,0xFC,0xF2,0x6A,0x27,0xBD,0xFE,0x5E, + + 0x29,0x2E,0x2E,0x5E,0x4D,0xFF,0x86,0x12,0x47,0x90,0x2C,0x9C,0x80,0xBF,0x05,0xDB, + + 0xAD,0xBE,0xDF,0x7F,0xBE,0x21,0x75,0x03,0x96,0x23,0xFF,0x6A,0x7C,0x52,0x90,0x1C, + + 0x2D,0x83,0xAB,0xDB,0x32,0x09,0x82,0x13,0x97,0x92,0xBF,0xBF,0xF9,0xFD,0x56,0x47, + + 0xC2,0x0C,0xF2,0x00,0x08,0x62,0x0D,0xE7,0x64,0xED,0xBC,0x4D,0x63,0x81,0x88,0xD7, + + 0x25,0x43,0x80,0x10,0x9E,0x60,0xF4,0x14,0xA0,0xBE,0x38,0x46,0x33,0x7D,0x3A,0x93, + + 0x80,0x08,0x45,0x4B,0x1F,0xD4,0x8D,0x01,0x21,0x02,0x29,0x15,0xC8,0xCD,0x49,0x25, + + 0x0C,0x41,0x25,0x91,0x97,0xE8,0xD9,0x68,0xE5,0x4B,0xE7,0x32,0x70,0x9C,0xC2,0x00, + + 0x06,0x6A,0xFA,0xAC,0x29,0xEB,0x8F,0x44,0x29,0xA5,0x28,0x23,0x90,0xE4,0x11,0x78, + + 0xA6,0xFA,0x91,0xC1,0xB6,0xA5,0xA7,0x9D,0x2F,0xFE,0x87,0x16,0x10,0x66,0xD1,0x33, + + 0x69,0xB7,0x98,0x65,0x37,0xD9,0xAE,0x89,0xFD,0x8B,0xD9,0x45,0x50,0x62,0x77,0x68, + + 0x0E,0xF1,0x31,0x92,0x4D,0x2D,0x1D,0xF5,0xF9,0x48,0x26,0xCA,0xD1,0x57,0xC2,0xF9, + + 0x0B,0xA8,0x8A,0x08,0x91,0x11,0xD6,0xAA,0x81,0x3B,0x3E,0xBE,0x18,0x60,0xCB,0x9C, + + 0x0B,0xE0,0x75,0x98,0x50,0x69,0x55,0xBC,0x4B,0xEA,0x99,0xFC,0x5D,0x45,0xC3,0x58, + + 0x8C,0x00,0xE3,0x5E,0xFE,0x27,0x2B,0xD6,0xCE,0x48,0x92,0x52,0x57,0xEC,0xCB,0x99, + + 0xC7,0x65,0x83,0x19,0x10,0x12,0xF7,0xAB,0xC8,0xD6,0x86,0xB9,0xDB,0x82,0x0A,0x79, + + 0xE3,0xBD,0x42,0x2F,0xF8,0xA1,0xF5,0x5C,0x79,0x97,0xEC,0xB8,0x7B,0xCC,0x0A,0xCD, + + 0xF4,0x82,0x6D,0x69,0xCF,0xEC,0x60,0x83,0x4D,0x7E,0xDD,0x0E,0x68,0xBD,0x83,0xC9, + + 0x8B,0x4C,0x3B,0xC9,0x91,0xE1,0xE9,0x96,0xF5,0xAF,0x6B,0xFD,0x7D,0x6A,0xC0,0x39, + + 0x8D,0xF2,0xF1,0xA2,0xA8,0xFF,0x23,0x66,0xA3,0xE2,0x23,0x95,0x99,0x22,0x94,0xC0, + + 0x2E,0x16,0xC4,0x18,0xBD,0xC6,0x94,0xE3,0x59,0x56,0x1D,0x20,0x72,0x92,0xCC,0x10, + + 0x7A,0x53,0x1C,0x16,0xA0,0x9C,0xDC,0xE1,0x65,0x5B,0xDC,0x09,0x77,0x73,0x2B,0x2C, + + 0x01,0xED,0xBE,0x1B,0xB3,0x12,0x3B,0x0C,0x41,0xAD,0x55,0x24,0xFE,0x30,0x4D,0x20, + + 0x2C,0x95,0xB5,0x6B,0x1D,0x3E,0x9D,0xF2,0xD8,0x3D,0xCB,0x4E,0xF7,0xA9,0x53,0xA6, + + 0xC9,0xA5,0x43,0xD6,0xD9,0x95,0x1C,0xE4,0xBE,0xB5,0x79,0xFB,0x1A,0x6F,0x16,0xDC, + + 0x4B,0xA4,0x8E,0xA7,0x5B,0x2E,0x16,0x4D,0xEE,0xF3,0xC4,0xE0,0x97,0xD4,0x65,0xC5, + + 0x76,0xA7,0x9C,0x39,0xD7,0x3F,0x6B,0xC9,0xEC,0x34,0x08,0x93,0x9B,0xD7,0x33,0xD7, + + 0x42,0x94,0x10,0xA1,0x92,0x87,0xCB,0xB1,0xC9,0x4C,0xE7,0x1D,0xF7,0x38,0x2E,0xF2, + + 0xEA,0x18,0x6A,0x08,0x3A,0xD6,0x86,0xDB,0x09,0x59,0xD3,0x28,0x76,0x3D,0xCE,0x18, + + 0x3C,0x5B,0xAF,0x18,0x3B,0x9A,0xC1,0xB9,0x6F,0xE1,0xA6,0x46,0xF6,0x84,0x4F,0x8D, + + 0x27,0x5B,0x8F,0x05,0xBE,0x18,0x2F,0xAD,0x67,0x1B,0xFF,0xCF,0x03,0x74,0x4F,0x28, + + 0xAF,0x79,0xF0,0x6C,0x1A,0x7B,0x8F,0x79,0xE1,0x1A,0xF8,0xC3,0x2B,0x71,0x6F,0x3B, + + 0xA6,0x11,0x9F,0xD0,0x59,0x1C,0x14,0x8E,0x95,0x47,0xE8,0x38,0x5B,0x4C,0x4A,0xFC, + + 0x2D,0x1F,0xD8,0xAE,0x08,0x7D,0x07,0x61,0xCE,0xE2,0x87,0xF8,0xDE,0x8C,0xEB,0x5B, + + 0xBA,0x14,0x3F,0x25,0x85,0xFB,0x77,0x9F,0x34,0x81,0x8E,0xEE,0x5F,0x81,0xC6,0x5D, + + 0xA9,0xFD,0x37,0x35,0xE5,0x72,0xF3,0x87,0x31,0xF0,0x27,0x7F,0x66,0xBA,0xE0,0x83, + + 0x2E,0x8A,0x30,0xEE,0x57,0xED,0x52,0x22,0x45,0x80,0x70,0xA6,0x1A,0xA2,0x06,0xA6, + + 0xA4,0x7E,0x38,0xFE,0x29,0xEC,0xB1,0xB6,0x47,0x62,0xF8,0xEF,0x53,0xE3,0xA1,0x40, + + 0xBD,0x84,0xB1,0x75,0x90,0xCC,0xDD,0x07,0xC2,0xC0,0xF5,0xA2,0x75,0xA0,0xE9,0x42, + + 0x81,0x8B,0x45,0x85,0xDD,0xA9,0xF9,0xB6,0xF2,0xCB,0xEF,0xCC,0xD3,0x39,0xEB,0x22, + + 0x52,0x29,0x58,0x26,0x5A,0xBF,0x66,0x90,0x67,0xA4,0xE6,0x52,0xA9,0xA6,0x97,0xA0, + + 0x52,0x8C,0x7A,0xA9,0xEA,0xCB,0xA3,0x04,0x2C,0xCA,0x63,0x14,0xA8,0x48,0x76,0xC7, + + 0x84,0x56,0xA1,0x21,0x1B,0x00,0x57,0x52,0xA2,0xDD,0xBD,0x62,0x54,0x9A,0x6B,0x2C, + + 0xD2,0x8C,0x8B,0x53,0x96,0x97,0xFE,0x41,0xF4,0x5C,0x6F,0xB0,0x09,0xEF,0xA2,0x49, + + 0x35,0xE6,0x20,0x06,0xB9,0x2E,0x34,0xAE,0x05,0x88,0xF7,0xD6,0x5C,0x53,0x92,0x1E, + + 0x82,0xC8,0x3A,0x9C,0x84,0x24,0xB3,0xBE,0x4F,0x2B,0x01,0x7C,0xFC,0x14,0xB3,0x78, + + 0xA1,0x8B,0xA1,0x4F,0x98,0xC4,0x3B,0xA2,0xCA,0xC8,0x37,0xAB,0xD8,0x96,0x11,0xE4, + + 0x8B,0x33,0x93,0x2F,0xAD,0xE9,0xFB,0xBB,0x0A,0xC3,0x93,0x5D,0xDB,0xE9,0xE2,0x8D, + + 0x2A,0x2C,0x5D,0xDC,0xE9,0xA6,0xE0,0x95,0x48,0x96,0x76,0xEA,0x61,0x58,0xAE,0x14, + + 0xF8,0xE1,0x12,0xB6,0x1D,0x00,0x23,0xFB,0xEA,0x32,0x3C,0x96,0x0B,0xA0,0x74,0x49, + + 0x05,0xCC,0xE1,0x3D,0xAD,0x7E,0x7B,0x15,0x25,0xDF,0xAA,0x86,0x3B,0xE5,0x8C,0x9B, + + 0xC3,0x94,0x79,0xB9,0xF4,0xA0,0x45,0x4E,0x42,0x39,0xA3,0xFB,0xD9,0xB5,0xFD,0xC2, + + 0x6C,0xD2,0x1B,0x02,0x36,0xBA,0x54,0xE9,0x85,0xDD,0x34,0xE5,0x4D,0x9E,0xEC,0x12, + + 0x30,0xD3,0xCB,0xE8,0xE7,0xBB,0xFF,0x49,0xE8,0x27,0xAC,0xC5,0x71,0x9F,0x2B,0x87, + + 0xA7,0xA0,0x65,0x07,0xFA,0xDE,0x27,0xE3,0xE2,0xD0,0x25,0x4F,0xB7,0xBF,0x6D,0x06, + + 0xA3,0x91,0xA9,0xB3,0xB3,0x30,0x06,0x2D,0xE6,0xF3,0x2D,0xC4,0xC0,0x7A,0xC8,0x50, + + 0x06,0x49,0xF2,0xF3,0xC9,0xD8,0x62,0x91,0x02,0xB8,0xCC,0x19,0x45,0xB4,0xFC,0x95, + + 0x03,0x3A,0x33,0x29,0xDE,0xA4,0x25,0x1B,0x23,0x18,0xFA,0x84,0xD0,0xB7,0x07,0xC3, + + 0xA5,0xB6,0x83,0xF2,0xB5,0xF6,0x13,0xD2,0xE5,0x44,0x4D,0xA0,0x28,0xFE,0xC9,0xF4, + + 0x06,0x28,0x01,0x48,0xB6,0x74,0x1F,0xF2,0xE6,0x55,0x36,0xF0,0xD3,0x99,0xCC,0xCA, + + 0x28,0xB4,0xAD,0x31,0x34,0xF8,0xA6,0x2E,0x6E,0x4B,0x32,0xCE,0x6C,0x55,0x16,0x65, + + 0x2B,0x31,0xEC,0xFC,0xC2,0xFB,0x7E,0x6C,0x6E,0xF9,0x3E,0x79,0x59,0xE2,0x3A,0x09, + + 0x65,0xE9,0x4B,0xAB,0xBA,0x98,0xF7,0x2B,0xA2,0x98,0x2E,0xDF,0xF8,0xF3,0xAF,0xDB, + + 0xA9,0xB7,0xA1,0x9B,0xBE,0xFB,0xAF,0x53,0x9D,0x96,0x2A,0xD9,0x72,0x7D,0xA6,0x17, + + 0xBA,0x61,0xBF,0xD2,0x9B,0xB7,0x48,0xDE,0x12,0x23,0xB6,0xD1,0x76,0x90,0x56,0x21, + + 0x29,0x67,0xD4,0x36,0x3B,0xF2,0xB5,0xFD,0x8E,0xC6,0x58,0xFF,0x7F,0xF3,0xF7,0x38, + + 0x22,0xFB,0x61,0xA9,0xFE,0xF1,0xB7,0x2A,0xE2,0x9C,0xDF,0x2D,0xFE,0x55,0xCE,0xA4, + + 0x20,0x19,0xB6,0xC3,0x1A,0x3F,0xB9,0x1D,0x6F,0x5F,0x97,0x79,0x03,0xBE,0x7E,0x06, + + 0xE9,0x0F,0x10,0xBC,0xFB,0x44,0x6B,0xDB,0xF7,0x7F,0x6F,0x03,0xA5,0x6F,0xB3,0xF2, + + 0xAD,0xFC,0x18,0xEF,0x93,0x1D,0x31,0x4A,0xD0,0x7D,0xC1,0x01,0xF4,0x9E,0x53,0x93, + + 0x6B,0x66,0xB9,0xEB,0x3C,0x2F,0x68,0xA5,0xCC,0x4D,0x25,0x5A,0x73,0x23,0x71,0x67, + + 0xE9,0x0E,0x35,0x77,0x66,0x46,0x26,0x7A,0x54,0x9E,0xC7,0xD7,0xD5,0xE6,0xF8,0xDF, + + 0xFD,0x16,0x23,0x60,0xC7,0xB9,0xC0,0xE5,0xBD,0xC9,0xB7,0xE6,0xC3,0x09,0x66,0x6E, + + 0xEA,0xE4,0x58,0xA5,0xB0,0x65,0xA7,0x1E,0x35,0x9A,0x47,0xF6,0x0E,0x2B,0xF9,0xDF, + + 0xA6,0x00,0x6A,0x1A,0x6B,0xDA,0x2A,0x9A,0x7F,0xB7,0xE9,0xFF,0xF6,0xCB,0x31,0x76, + + 0x6A,0x16,0xFB,0x65,0x86,0x88,0x66,0xD8,0x38,0xDA,0x3D,0x51,0x3A,0x24,0x10,0x6F, + + 0xE3,0x4C,0xBA,0xF3,0x3C,0xD7,0xBB,0x67,0xB5,0x34,0x80,0xF3,0xB3,0x2C,0xAE,0x7A, + + 0xFE,0x6C,0xDC,0xEF,0x9D,0xA4,0x24,0x04,0x4F,0xE9,0x0A,0xCD,0xFA,0x29,0x39,0xB9, + + 0x11,0xA5,0xDA,0x20,0x3D,0xAB,0x83,0xD8,0x6B,0x0A,0xAD,0xCF,0xBA,0x76,0x33,0x3D, + + 0x76,0x0D,0xD9,0x4E,0x72,0x4F,0xE4,0x5B,0x3A,0x2E,0xA9,0x0D,0xF9,0xC4,0x3A,0x6F, + + 0xE3,0x3D,0x62,0x3F,0xB9,0xAF,0x03,0x92,0xBF,0x0D,0xC8,0x6E,0x98,0x68,0x32,0x7C, + + 0xD5,0xF2,0x32,0x54,0xF2,0x3C,0x7C,0x54,0xC7,0x0C,0x21,0x03,0x55,0x92,0x3B,0x6E, + + 0x63,0x5F,0x23,0x69,0x73,0xCF,0xAC,0x7A,0xF6,0x0A,0x43,0xD1,0x57,0x0C,0x73,0xC7, + + 0x7C,0x82,0x33,0x79,0x72,0x1E,0x04,0x79,0xF4,0xB0,0x60,0x9F,0x77,0x92,0x12,0xE2, + + 0x40,0x7D,0x95,0x74,0x0E,0xC1,0xAF,0x42,0xCC,0xAD,0xAA,0x1D,0x54,0xFB,0x25,0xB4, + + 0x12,0xF0,0xA2,0x67,0xBD,0x70,0xA4,0x41,0xC2,0x11,0x3C,0xC6,0x13,0x6D,0x7B,0x87, + + 0x41,0x91,0xFB,0x83,0x51,0xB1,0x6D,0x85,0xD3,0x83,0x10,0x94,0xC2,0xDD,0xB5,0x60, + + 0x02,0x53,0xD4,0xA5,0x14,0xCC,0x2F,0x81,0xA4,0xFC,0xE3,0xB2,0x50,0x32,0x7C,0x3E, + + 0x8E,0x19,0x54,0xB7,0x0E,0xC5,0xE0,0x82,0x9D,0xD9,0x79,0x86,0x8D,0x72,0xF3,0x32, + + 0xA1,0x29,0x1F,0xF0,0xBC,0x98,0x4A,0x92,0x03,0xF8,0x3B,0xD0,0x40,0x54,0xD5,0x9E, + + 0x01,0x73,0xBB,0xC3,0x5B,0x67,0x2E,0x1A,0xC6,0x6B,0xFC,0x53,0x53,0x18,0xF1,0xB3, + + 0x5C,0x72,0x19,0xA5,0x33,0xB1,0x23,0xF7,0x02,0xD4,0x65,0x0A,0xC0,0xB6,0x34,0xB8, + + 0x81,0xB7,0x87,0xEA,0xE5,0x37,0xB6,0xDB,0xCB,0xDB,0xA8,0x00,0x13,0x77,0x27,0xBC, + + 0x1A,0xA8,0x27,0xE2,0xAC,0xB4,0x7E,0xF2,0x88,0x54,0xE0,0xBA,0x90,0x76,0xA7,0xFA, + + 0x0B,0x99,0x33,0xF2,0x1B,0x7B,0x73,0x8D,0x65,0xA5,0x17,0x9F,0x98,0x7F,0xB7,0xA8, + + 0x08,0x9A,0xF2,0x77,0x3B,0xD7,0xF8,0x3B,0x78,0x36,0xCD,0x87,0xDD,0x76,0x7E,0xEC, + + 0xD5,0x97,0xE6,0xE8,0x51,0x33,0x7B,0xCC,0xD3,0xFD,0x6E,0xC8,0x49,0x4D,0xEE,0xAA, + + 0x49,0x3A,0xB0,0xDA,0xD2,0x32,0xFE,0x8A,0x09,0x41,0xA1,0x3B,0xA5,0xE0,0x0F,0xF8, + + 0x90,0xB1,0x47,0xFF,0xDA,0x32,0x6F,0xD9,0x03,0xF1,0x6F,0x17,0xEA,0x33,0x31,0xDE, + + 0x0A,0xA0,0x9D,0xE2,0x9F,0x90,0xCF,0x0A,0x67,0xC2,0x3C,0xD9,0x98,0x50,0x0D,0x65, + + 0xA5,0x03,0x30,0x75,0x26,0x0B,0x08,0xD9,0xAD,0x11,0x10,0x55,0xF7,0x63,0x90,0xE3, + + 0xA6,0xC1,0xE8,0xE5,0x91,0x0C,0xEC,0xCC,0xB8,0x60,0xB8,0x29,0x3B,0x4C,0x21,0xFD, + + 0xB7,0x63,0xD9,0x03,0x74,0x23,0x23,0x22,0x3B,0x4F,0xD3,0x03,0xBF,0x21,0x1B,0x23, + + 0x2C,0x2C,0xD1,0xA7,0x29,0xE2,0x01,0xCC,0x30,0xA0,0xEC,0x07,0x2A,0x1C,0x1B,0xB9, + + 0x39,0x24,0x18,0x4E,0xFF,0xF5,0xAB,0x62,0x39,0x44,0x88,0x42,0x25,0xE4,0xEC,0xB0, + + 0xE6,0xFE,0xE9,0x30,0xCA,0xAA,0x51,0x15,0xE6,0x5A,0x55,0x05,0x2B,0x5A,0x98,0xA8, + + 0x35,0xC4,0x19,0x63,0x33,0x59,0xF1,0x67,0x16,0xC0,0xAE,0x76,0xD2,0xA6,0x6B,0xBD, + + 0x3C,0x98,0x5D,0x28,0x34,0xE6,0xCD,0x11,0x3C,0x86,0x55,0x05,0x0D,0x58,0x82,0x79, + + 0xAF,0x0B,0x0E,0xF1,0x9E,0x94,0xC9,0x0E,0x27,0xC7,0x88,0x9E,0xA3,0x37,0x51,0x3D, + + 0xAC,0xC8,0x87,0x79,0xBC,0x7F,0x44,0x3C,0xA4,0xC6,0x01,0x9B,0xAE,0x44,0x0E,0xF8, + + 0x00,0x87,0x99,0x6D,0x42,0xAC,0x31,0x19,0xAC,0x8B,0x0C,0x1E,0x7D,0x55,0x4B,0x48, + + 0xEB,0x86,0x3B,0x20,0xAD,0x0B,0x69,0xA9,0x26,0xAF,0x68,0x06,0x36,0xAF,0xE2,0x5A, + + 0x31,0x8A,0xDC,0xE7,0x75,0xA3,0x8D,0x08,0xBD,0xA9,0xC8,0xFC,0x5E,0x73,0xDE,0x38, + + 0xF0,0xCC,0xD4,0x77,0x63,0x02,0x41,0xE4,0x6B,0xCB,0xFA,0xFA,0x5B,0x53,0x07,0x03, + + 0x2F,0x51,0x63,0x4B,0xD6,0x51,0x4B,0x90,0x41,0x38,0x63,0x96,0x9A,0x75,0x14,0xD9, + + 0x1E,0xE2,0x4B,0x2C,0xAF,0x7C,0xD1,0xCE,0x6E,0x10,0x17,0x5B,0x5D,0x03,0x98,0x71, + + 0xA0,0x1D,0x0E,0xE4,0xCB,0xDC,0x0C,0x3C,0x40,0x0B,0x18,0x23,0x8B,0x9E,0xBA,0xF4, + + 0x4E,0x9E,0x96,0x04,0x35,0x6E,0x11,0x4B,0xC8,0xCA,0x86,0x24,0x75,0xB0,0x77,0xC8, + + 0x80,0x89,0xFF,0x16,0x6A,0x4D,0x1C,0x5E,0x49,0x49,0x0D,0x5C,0x09,0x44,0xAD,0xA1, + + 0xC5,0xBE,0x97,0x6D,0x4E,0xF1,0xAB,0xD5,0x5A,0x92,0x42,0x35,0x6C,0x9E,0xF4,0x85, + + 0xF8,0x6B,0x40,0xA4,0xCD,0xD1,0x0C,0xC5,0x9F,0xDB,0x61,0x15,0xF2,0x79,0x14,0xD6, + + 0xDE,0x10,0xFA,0xEB,0xDC,0xF1,0xD5,0x8C,0xF2,0x58,0x6C,0xC7,0x19,0x5A,0x5E,0x5D, + + 0x51,0x3D,0xDD,0xE3,0xD5,0x26,0xE5,0xAC,0x1B,0xAA,0xA7,0xB0,0x1D,0x92,0x7F,0xD9, + + 0x4C,0xD3,0xD7,0x67,0x26,0x18,0x00,0x19,0xC3,0xD1,0x2B,0x07,0x08,0x54,0x58,0x8C, + + 0xC5,0x97,0x22,0x6C,0xCD,0xF9,0xC9,0xB9,0x54,0x9C,0x8E,0x54,0xD0,0xF5,0x84,0x2F, + + 0x8C,0x46,0xEF,0xF8,0x4B,0xD5,0xAD,0x4B,0xCE,0x99,0x06,0x40,0x6D,0xB4,0x75,0xC0, + + 0x88,0x9C,0x58,0xE9,0xC0,0x45,0x11,0x83,0x60,0x77,0xC8,0x8B,0xCF,0x7B,0x9B,0xF9, + + 0x52,0x16,0x6B,0x61,0x40,0xD9,0xFF,0xAA,0x12,0xD6,0xE6,0x9A,0x02,0x97,0x58,0x28, + + 0x4C,0x9B,0x42,0xAC,0x1A,0xB1,0x5F,0x8D,0xCF,0x23,0x24,0x1D,0x18,0xBD,0x54,0xB8, + + 0xF5,0x9B,0x42,0xFA,0xC4,0xD3,0xCA,0x98,0x9C,0xB8,0x03,0x39,0x86,0x8B,0xF7,0x30, + + 0x2C,0xA2,0x1C,0xE8,0x1F,0x41,0xC3,0x89,0xCA,0xBB,0xCF,0x01,0x52,0xF3,0x42,0xBC, + + 0x0E,0x09,0x8F,0x95,0x5E,0xB2,0x47,0x3C,0x31,0x42,0xC4,0x71,0xDB,0x52,0xD6,0x31, + + 0xA1,0xFF,0x40,0xD0,0xAB,0xFB,0xA8,0x1B,0x34,0xB5,0xAE,0x8C,0xDD,0xD6,0x98,0xE3, + + 0x8D,0x0C,0xB6,0xBD,0xF1,0xA0,0xBF,0x88,0xA8,0xB0,0xC2,0x36,0xC3,0x6B,0x3F,0xB5, + + 0xAE,0xDD,0x81,0xF4,0x33,0x62,0x06,0xA5,0x9F,0x16,0xAA,0x55,0x50,0x7D,0xF6,0x36, + + 0x20,0x42,0x6A,0x91,0x9B,0x3D,0x41,0x38,0x43,0x5F,0x19,0xC8,0xD9,0xCE,0x70,0xB1, + + 0x78,0xD1,0xBA,0xA4,0x56,0xFF,0x90,0xB4,0xF9,0x06,0xE8,0x14,0xE6,0x6D,0x1D,0x23, + + 0x39,0x6B,0x49,0x27,0x3D,0x84,0xFC,0x12,0xA8,0x46,0x83,0x74,0x33,0x9A,0x1F,0xFD, + + 0xA0,0xF2,0x3E,0xB8,0x6D,0x22,0x15,0x57,0xB0,0xE9,0xC3,0x16,0xA6,0xD9,0x2F,0xFC, + + 0x82,0x47,0x1F,0xAA,0x7A,0x64,0xED,0x13,0x28,0x64,0x26,0x0F,0xB1,0x98,0x79,0x2F, + + 0xA9,0xB7,0x42,0x8C,0x72,0xD9,0x97,0x4A,0x4E,0xA2,0x47,0xEB,0x92,0xB9,0x69,0x3C, + + 0x7A,0x09,0xB4,0xB5,0x1F,0x0B,0xB0,0x88,0xE8,0xCE,0xD8,0xCF,0x67,0xC4,0xEF,0x76, + + 0x52,0xD7,0x7C,0x73,0xEA,0xF5,0xA4,0x2B,0x90,0x4C,0x9B,0x3C,0x31,0xBB,0x54,0x15, + + 0x8F,0x4B,0x63,0x99,0x9B,0xFC,0x55,0xAC,0x28,0xF4,0xCA,0x9D,0x78,0x38,0x7E,0xA1, + + 0xE3,0xFD,0x94,0xF8,0xED,0xF8,0x32,0x3E,0x28,0x41,0x12,0xEC,0xE2,0xC1,0xE6,0xDC, + + 0x0D,0x47,0x19,0x5A,0xD3,0x9E,0xF6,0x0B,0x25,0xCB,0xE4,0xC1,0x2D,0x2F,0x1B,0x3D, + + 0x8C,0x2C,0x13,0x52,0xB4,0x8A,0x49,0xB8,0xE9,0xCD,0xDB,0x50,0x31,0x2A,0x8B,0x8C, + + 0x61,0x4D,0x6F,0xD9,0x95,0x2C,0x5D,0x0A,0xAD,0xC9,0x9B,0xE8,0x24,0xC2,0xF9,0xFB, + + 0xBE,0x8D,0xF9,0x78,0x30,0x9B,0xA0,0xDF,0xC3,0xDB,0x80,0x20,0x7E,0x8A,0x1E,0x57, + + 0xCA,0x55,0xBE,0xA4,0x65,0x73,0x4F,0x32,0xDD,0x53,0xE4,0x93,0x88,0x7E,0xE4,0xA5, + + 0xC8,0x1F,0xFD,0x81,0x59,0x21,0x91,0x90,0x92,0xFD,0xF5,0x9B,0xD2,0xCE,0x37,0x21, + + 0x30,0x52,0xC9,0xBC,0xB7,0x31,0x25,0x4E,0x4D,0x5E,0xC3,0x08,0x05,0xD8,0x7A,0x74, + + 0x54,0xBB,0x96,0xDB,0x58,0x5A,0x90,0x1F,0x8B,0x77,0x06,0xC3,0xD3,0xDB,0x6A,0x69, + + 0xAF,0xB8,0xF2,0x70,0xF9,0x36,0x8F,0x0E,0xE3,0x07,0xE4,0x33,0xB1,0x65,0x95,0xD2, + + 0xD4,0x52,0xFB,0x60,0x78,0x15,0xC2,0x1E,0x0B,0x55,0x03,0x67,0x63,0x31,0x18,0x55, + + 0xA1,0x28,0xC5,0xC1,0x7B,0x34,0x63,0x50,0x00,0x5C,0xD5,0x75,0x7C,0xDA,0xBE,0x72, + + 0x38,0x55,0xD0,0xB1,0xC7,0xE5,0x76,0x92,0xC8,0xA4,0x9E,0x0C,0x13,0xCB,0xED,0xBC, + + 0xF5,0xA8,0x9A,0x18,0x3B,0xEE,0x44,0xBC,0xE6,0xFF,0xBE,0x85,0x98,0xD6,0x78,0xCE, + + 0x76,0x87,0xD4,0x73,0xBE,0x18,0x6F,0x8E,0x15,0x55,0xA4,0x5C,0x8E,0x7F,0x28,0xA5, + + 0x35,0xEA,0x89,0x35,0x39,0xD7,0x4C,0xF9,0xE5,0xF0,0x4E,0x39,0xF7,0x4E,0xBD,0xEF, + + 0x8B,0xBD,0x16,0xDF,0x10,0x5F,0xD2,0x9B,0x48,0xD3,0x00,0x7E,0xBC,0xD1,0x9C,0x64, + + 0xC0,0x9E,0x1A,0xAF,0x59,0x9B,0x81,0x07,0xEB,0x0D,0xD8,0x0C,0x4E,0x3F,0x91,0x3A, + + 0xC0,0xB3,0x6B,0xBE,0xD0,0x98,0x0F,0xFD,0x9D,0xA1,0x05,0x7F,0xFA,0x76,0xE3,0xAA, + + 0x85,0xB9,0x1F,0x1D,0xFF,0x9B,0x61,0x58,0x83,0xBC,0x1B,0x96,0x0F,0xBC,0x8D,0xC5, + + 0xF9,0xC1,0xA6,0xAF,0x94,0x8C,0xCF,0xA6,0x03,0xFF,0x8A,0xD5,0x62,0xA2,0x3A,0x02, + + 0xFA,0x0C,0xF9,0x51,0xDF,0x32,0x0A,0xCD,0xC7,0xB4,0x38,0x45,0x63,0x64,0x41,0x54, + + 0x11,0x8F,0xFF,0xAF,0x9C,0x0F,0x8E,0xD2,0x67,0x82,0x75,0x0C,0xBF,0xED,0xFD,0x37, + + 0x07,0xBF,0xE1,0xB3,0x7C,0x52,0x79,0x40,0x66,0xCC,0xAB,0x97,0x3E,0xA7,0x24,0x74, + + 0x00,0xA6,0xD8,0xB5,0x74,0xC1,0x70,0xA2,0x0A,0x49,0xE7,0x5F,0xAD,0x69,0x97,0x3D, + + 0x7B,0x2A,0xB0,0x53,0xFE,0x26,0x58,0x63,0x24,0xBA,0x97,0x05,0x23,0x64,0x65,0xAC, + + 0x80,0xE4,0xD9,0xB4,0xFC,0x29,0x0F,0xD7,0x2D,0x25,0x25,0x9D,0xD2,0xA6,0x3D,0x3D, + + 0xF1,0x28,0x93,0xB7,0xD3,0x7C,0xB9,0xF6,0x7E,0x6A,0x06,0x88,0x36,0x64,0x9E,0x68, + + 0xCE,0x88,0xFA,0x06,0x1A,0x8A,0x86,0x55,0xEF,0xCC,0x8C,0xCC,0x3E,0x3D,0x05,0x65, + + 0xD4,0xC8,0x8A,0x0B,0xFC,0x16,0xFA,0xEE,0xF6,0xCF,0x6B,0x4D,0x6B,0x6E,0xB3,0x51, + + 0x79,0x16,0x0F,0x8B,0xD3,0x5F,0x71,0x59,0x37,0x35,0x73,0xAB,0x07,0x4A,0x13,0xF5, + + 0x21,0x86,0x1C,0xB7,0x9B,0x61,0x8E,0xBB,0x2C,0xC4,0xA1,0x4C,0xDB,0xC9,0x32,0x39, + + 0x0F,0x3D,0x1D,0xB3,0xE1,0xA8,0x26,0x98,0x6D,0xAC,0x0D,0xEA,0x5C,0xD9,0x39,0xDE, + + 0x0D,0x6F,0x3C,0xA1,0xF6,0x2E,0xF8,0x86,0xB0,0x36,0x5A,0x0D,0x21,0x3E,0x1D,0x4D, + + 0x67,0x7D,0x62,0x3C,0xF4,0x0F,0x4D,0xCB,0x2D,0xC5,0xCD,0x2F,0xA2,0x41,0x7D,0xEE, + + 0x64,0xEC,0xBD,0xEB,0x68,0x7B,0x84,0x79,0xA3,0x8D,0x85,0x78,0x7E,0x40,0x1E,0x71, + + 0x12,0xFC,0xFA,0x2E,0x3C,0x1D,0x67,0xA6,0x0F,0xE3,0x74,0x27,0xF7,0xB2,0x16,0x00, + + 0x25,0x4E,0xA4,0x92,0x9C,0x0A,0x5A,0x0A,0x66,0xC2,0x82,0x1A,0x97,0x78,0x1F,0x10, + + 0xD8,0x6D,0xF4,0xC0,0x7E,0x03,0x31,0xD0,0xDE,0xBE,0x75,0x7C,0xBC,0xA1,0xED,0x12, + + 0x26,0xD1,0x01,0xE4,0x87,0x15,0x03,0x8E,0xC6,0x43,0xC5,0x33,0xFF,0xD2,0x30,0xB1, + + 0x00,0x32,0xB6,0x62,0xFE,0x17,0x8B,0x91,0x44,0x77,0x43,0x53,0x52,0xF8,0x3C,0x76, + + 0xEF,0xB6,0xCA,0x6B,0xBB,0xF7,0xDB,0x53,0x8E,0xDD,0x58,0xB4,0xF3,0xF9,0x35,0x03, + + 0xE2,0x32,0x31,0xD4,0xB7,0xF2,0xA7,0x1D,0x32,0xD5,0xCD,0xA5,0x55,0xFA,0xB9,0x14, + + 0x4E,0x34,0x29,0x77,0x5E,0xF4,0x6A,0x00,0x63,0x7A,0x95,0x06,0x74,0xF5,0x66,0x34, + + 0xC5,0xCB,0xF5,0x71,0xD5,0xAB,0x56,0xE0,0x70,0xD5,0x76,0x2B,0x23,0xFE,0x6E,0x24, + + 0x65,0xCA,0x90,0x26,0x5D,0x99,0xF0,0x09,0xED,0x39,0x0A,0xC5,0xDE,0x52,0xE7,0x0A, + + 0x80,0xD8,0xB1,0x37,0x57,0xC9,0xF7,0x2F,0xEB,0x98,0x84,0x8D,0x25,0xF5,0x11,0x37, + + 0x4F,0x12,0xD0,0xED,0x93,0x24,0x08,0x12,0x0C,0x24,0x68,0x85,0x96,0xF3,0x00,0x6F, + + 0xC7,0x1F,0x9E,0xE9,0xD7,0xDF,0xA1,0x52,0x85,0xB8,0x36,0xAB,0x14,0xF2,0x52,0xAB, + + 0x86,0x67,0xEB,0xCF,0x0D,0x98,0x46,0x09,0x41,0x52,0x5A,0x3C,0xDC,0xF3,0x01,0x6F, + + 0xAD,0xDE,0x9F,0xDE,0x84,0x92,0x4F,0x18,0xC8,0xBB,0x9F,0x2D,0x7A,0xF0,0x58,0x72, + + 0x53,0x8C,0x73,0x5D,0x7A,0x3C,0x27,0xFE,0x06,0x9C,0xC7,0x5B,0xFF,0xFF,0x60,0x4A, + + 0xDC,0x42,0x6C,0x9B,0x11,0x22,0xA5,0x44,0xF4,0x69,0x66,0x46,0x31,0x40,0x30,0x72, + + 0xFE,0x07,0x26,0x77,0xB0,0xDE,0xD8,0xE1,0xC4,0xCC,0xF8,0x7E,0x89,0x6C,0x52,0x6D, + + 0x02,0xEE,0x3E,0x65,0xC8,0x24,0x4E,0xA1,0xB3,0x35,0x89,0x21,0xD9,0x4E,0x20,0x0E, + + 0x20,0x6D,0x32,0xD2,0x4F,0x2B,0x40,0xE0,0x66,0x01,0x81,0xE0,0x53,0x7F,0x46,0x31, + + 0x20,0xF6,0xA2,0x46,0x13,0x64,0x28,0x12,0xEE,0x4B,0x37,0xA4,0x5E,0xCF,0x4C,0xC0, + + 0x30,0x9E,0x90,0x50,0x3A,0x93,0xEC,0x92,0xA8,0x5F,0x82,0x8B,0xD1,0xC9,0x94,0x32, + + 0xEB,0x81,0xDD,0xDE,0x7B,0x5F,0xE5,0x83,0x6E,0x49,0x4E,0x9A,0x57,0xD4,0xF1,0x81, + + 0x8F,0xF8,0x21,0xCC,0xB1,0x67,0x39,0x3B,0x49,0x05,0x6A,0x97,0x7F,0x68,0xE5,0x48, + + 0x04,0x85,0x06,0x73,0x3B,0x38,0xD8,0x95,0x7B,0x4C,0x62,0x4E,0xA7,0x06,0xCA,0xD9, + + 0xE5,0x08,0xD9,0x70,0x99,0x49,0x07,0x5E,0x6A,0x09,0x25,0xDC,0x49,0x72,0x7D,0x78, + + 0x69,0xF5,0xE3,0x47,0x7E,0x68,0xAB,0xC9,0x84,0x51,0xF1,0x30,0xDB,0x00,0xCF,0x1C, + + 0x8F,0xE2,0x07,0xD4,0x89,0x86,0xB3,0xA1,0xEB,0xB9,0x0D,0x5B,0x3B,0x4B,0xB5,0x49, + + 0x16,0xA1,0xC7,0xA4,0x96,0xE1,0x01,0x8C,0x2A,0xB0,0xB2,0x3F,0xF8,0x63,0xD5,0xDA, + + 0x9A,0x21,0x82,0x94,0xF2,0x17,0x73,0xFC,0x75,0x60,0x82,0x79,0x30,0x77,0x8D,0x79, + + 0x0B,0xA1,0xBC,0xB0,0x92,0x6C,0x2D,0x6F,0x2B,0xCD,0x67,0x8F,0x33,0x74,0x6B,0xC9, + + 0x62,0xA6,0xD1,0x5C,0xB8,0x1E,0x3B,0x33,0x45,0x0D,0xDF,0xF9,0x8C,0x3A,0x86,0x04, + + 0x01,0x5D,0x74,0xE6,0x13,0x12,0xFC,0x3D,0x8B,0xBA,0x54,0x71,0x5F,0x6B,0xC3,0xB4, + + 0x03,0x50,0x4C,0x2C,0xD5,0xEA,0x43,0x90,0x67,0x11,0xFC,0xFE,0xD7,0x7C,0xC5,0xF1, + + 0xBD,0x50,0xE5,0xCF,0x56,0x3D,0xCE,0xA1,0x93,0x32,0x03,0xC3,0xB2,0x8D,0x89,0x15, + + 0xAC,0x5D,0x23,0x68,0x1A,0x48,0xB0,0x33,0x70,0xF5,0x8F,0x56,0x1A,0x37,0x7A,0xB1, + + 0x43,0x54,0xFE,0x2C,0x46,0x7B,0xE5,0x92,0xE0,0x48,0xD7,0x44,0x9F,0x95,0xF4,0x70, + + 0xC2,0xBE,0x9B,0x50,0x36,0x1E,0xAA,0x92,0x81,0x15,0x70,0x66,0x3B,0x7D,0x1D,0x2C, + + 0x91,0x8D,0xE3,0xB0,0xA1,0x32,0x21,0x03,0x60,0x4A,0xB5,0xB2,0x0B,0x7B,0x2D,0x9B, + + 0x2A,0x9C,0x0D,0xF0,0x54,0x9A,0x9D,0x73,0x72,0xE3,0x1E,0x87,0x18,0x0E,0xDD,0x37, + + 0x57,0x87,0xC6,0x77,0x3E,0xC2,0xAD,0x4A,0xC4,0xA5,0xAC,0x1C,0xB5,0xD7,0x34,0x63, + + 0x2F,0x23,0xEC,0x9D,0x38,0x89,0x0C,0xB8,0x9E,0x4B,0xB7,0x1A,0xD8,0xF9,0xB2,0xED, + + 0x1C,0x33,0xE6,0xFE,0xA3,0x54,0x6F,0x41,0xCF,0x17,0x33,0xD2,0x5B,0x7C,0xBC,0x1D, + + 0x9A,0x1B,0xB5,0x75,0xD5,0x74,0xA7,0x09,0xED,0x5D,0xE7,0x3F,0x68,0x9C,0x6D,0x2A, + + 0x86,0x91,0x43,0xAC,0x36,0xB1,0x6E,0x17,0xE8,0xB0,0x3E,0x74,0xFF,0x9C,0x76,0x26, + + 0x87,0x10,0x76,0x2F,0x28,0x3B,0x16,0xE9,0x6D,0xCE,0x26,0x14,0x23,0x32,0x3F,0x4B, + + 0x3B,0x38,0xB9,0xC0,0x89,0xDF,0xEF,0x8B,0x65,0xA8,0x8E,0xF0,0x99,0x3E,0xB0,0x5B, + + 0x3A,0x73,0xEF,0x20,0x1A,0x3C,0xC6,0x98,0x56,0xD2,0xBF,0xB2,0x64,0x70,0x1D,0x86, + + 0x17,0x45,0x6A,0xE6,0x5C,0xBB,0x72,0xCA,0x7D,0x8D,0x20,0x24,0x0E,0xE6,0x50,0xBF, + + 0xEE,0x12,0xF8,0x8E,0x19,0xC9,0x18,0xD4,0xC0,0x33,0xC0,0xC5,0xD1,0x6C,0xE1,0xBB, + + 0x56,0x26,0x81,0x61,0xB5,0x68,0x29,0x3E,0x25,0xD9,0x98,0x81,0x75,0x63,0xF2,0x10, + + 0xFA,0x8F,0xE4,0x15,0x74,0xA5,0x47,0x5E,0x2E,0x29,0xEB,0x60,0x3E,0x87,0x12,0x46, + + 0x4C,0x9F,0x9E,0x8F,0x7D,0x9D,0x23,0x86,0x26,0xEA,0xA0,0x7B,0x5A,0xE5,0x70,0x4E, + + 0x6C,0x7C,0x57,0xB6,0x5D,0xE7,0x51,0xF6,0x79,0xE8,0xA8,0x01,0x07,0xFE,0x3A,0x25, + + 0xC5,0xE6,0x65,0xC3,0xBC,0xE7,0x0F,0x65,0x27,0x45,0xF4,0x36,0x3F,0xDC,0x42,0xD1, + + 0x16,0xAB,0xBA,0xF5,0x7E,0x5E,0x7F,0xBB,0x2E,0xDD,0xDD,0x11,0x28,0xE1,0xFB,0xA5, + + 0x33,0x8A,0x8B,0x11,0xBF,0xAE,0x6B,0x1F,0xEB,0x67,0x8A,0x1E,0x58,0x17,0xEA,0xDE, + + 0x96,0xCB,0xCA,0x54,0x9F,0xA4,0x62,0x02,0x7E,0xCD,0x2C,0x58,0x20,0xE2,0x7C,0x81, + + 0xFF,0xFE,0x8A,0xB8,0xDC,0xA5,0x2D,0xC3,0xF5,0x87,0x89,0x8A,0x2B,0xF1,0x64,0x9B, + + 0xAF,0xE9,0xF3,0x8A,0x1F,0xB7,0x83,0xC4,0xEC,0x0A,0xBF,0x41,0xFE,0x8B,0x38,0x10, + + 0xAD,0xE9,0x19,0xB6,0x1E,0x21,0x00,0x7B,0xD5,0x67,0x5C,0x15,0xFF,0x1D,0xC2,0xC7, + + 0xEE,0x8B,0x39,0xDC,0x8E,0x81,0x64,0xF8,0xDE,0x8A,0x9A,0x29,0xA6,0xE2,0x59,0xA9, + + 0x65,0x27,0xF5,0x3A,0x61,0x33,0xEC,0x31,0x2F,0x61,0x8B,0x6D,0x96,0x63,0x42,0xEC, + + 0x86,0x38,0x93,0x78,0x62,0xA0,0x79,0x99,0xC9,0x15,0xC5,0xB6,0xFF,0x82,0xFD,0x2D, + + 0x1B,0x92,0xFD,0xBA,0x93,0x1F,0x1D,0x29,0xC7,0xB5,0xEE,0xA2,0xD7,0xF4,0x95,0xCC, + + 0xA7,0x95,0x9C,0x14,0xA4,0x17,0xDF,0x30,0xF4,0x36,0xE6,0xB7,0xD6,0x7C,0x8A,0xEC, + + 0x79,0x4E,0x38,0x74,0xDD,0x9B,0x9E,0x41,0xE2,0x39,0x37,0x25,0x65,0xB5,0xE5,0xF1, + + 0xE6,0x63,0x95,0x69,0x19,0xBE,0x05,0x01,0xE1,0x53,0xDD,0xE0,0x50,0xFC,0xDF,0x20, + + 0x8A,0x69,0x5C,0xCE,0xDF,0x5D,0x14,0xA8,0x88,0xDB,0xCE,0x64,0xEB,0xFF,0x54,0x28, + + 0x8B,0x98,0x72,0x1E,0xB5,0xA9,0x78,0xB2,0x6D,0x7E,0x3C,0x02,0x72,0xB7,0x1D,0x41, + + 0x37,0xF0,0x9F,0xA7,0xBA,0x12,0x4B,0x2A,0x69,0x50,0x8D,0x18,0x81,0xB4,0x12,0x51, + + 0x36,0x3B,0x45,0xA5,0x14,0xB1,0x60,0xF6,0x06,0x78,0x36,0x3E,0xD7,0x05,0x59,0x72, + + 0x2C,0x3C,0x59,0x0C,0xAD,0x8E,0x0C,0x42,0xA8,0x97,0x76,0xEF,0xC8,0x05,0x7C,0x1E, + + 0x66,0xDD,0xD1,0x1A,0x79,0x9A,0xBA,0x3E,0x1F,0x80,0xB2,0xFD,0x94,0xC3,0x3B,0x2E, + + 0x64,0xD3,0x9F,0x75,0x10,0xB7,0xF7,0x13,0xA9,0xD0,0xAD,0xAE,0xDD,0xBA,0xF4,0x34, + + 0xD2,0x99,0xB3,0xBD,0x3F,0xA7,0xFF,0x03,0x91,0x04,0xA7,0xBB,0xF4,0xD7,0x5D,0x28, + + 0x82,0x21,0xCF,0x8D,0x9F,0xB3,0x3B,0x02,0x1A,0x93,0x72,0x9C,0x95,0x16,0xDA,0xA5, + + 0x8C,0xF8,0x96,0x5C,0xAE,0x69,0x08,0x18,0x46,0x6B,0x34,0x1C,0x4C,0xF9,0x1F,0xEC, + + 0x5B,0x91,0x53,0xAD,0xF7,0xA4,0x09,0x9A,0x6C,0xC2,0x97,0xA5,0x7C,0x53,0x54,0x39, + + 0x03,0x22,0x2F,0x67,0x99,0xD3,0x26,0xCE,0x4A,0xB1,0x47,0x9F,0xF3,0xF2,0x02,0xE2, + + 0x04,0x7A,0x80,0xF7,0x2E,0x05,0x68,0xA2,0x12,0xA4,0xD8,0xBC,0xB9,0xBA,0x50,0x14, + + 0x88,0x4E,0x90,0x24,0xEE,0xDE,0xFE,0x33,0xFF,0x65,0x34,0xAB,0x52,0x23,0x31,0xE9, + + 0x0A,0xCF,0xF9,0x14,0xB6,0x8F,0x07,0x43,0xEF,0x66,0xD3,0xDA,0x39,0xA1,0xC9,0xAC, + + 0x2E,0xD7,0xB3,0xA5,0x6E,0xFC,0xA5,0x12,0x8D,0x66,0x59,0x61,0xFE,0x0F,0x48,0x5C, + + 0x04,0xCC,0xDA,0x6A,0x33,0x06,0xBC,0x13,0x70,0xB2,0xD2,0x56,0x32,0xF6,0x9C,0xB6, + + 0x13,0xA8,0xD0,0x59,0xFA,0xDC,0x66,0xC5,0x22,0x41,0x1C,0xA9,0xD1,0x79,0x61,0x81, + + 0xCE,0xAB,0xFF,0x38,0xF3,0x51,0xEA,0x11,0x42,0x59,0x11,0xE4,0x0C,0x24,0x1B,0xB7, + + 0x0A,0xEB,0xD3,0x7A,0xB2,0x87,0x38,0x31,0x9C,0x9A,0x77,0x2E,0x70,0x02,0x57,0x17, + + 0x3E,0x4A,0x42,0x58,0x29,0x85,0x04,0x0B,0x6F,0x6D,0xAC,0x80,0x92,0x61,0xBE,0x7A, + + 0xE2,0x1A,0xE8,0x1D,0x1A,0x69,0x90,0x48,0xA0,0x93,0xF8,0x3C,0xB2,0xDA,0x89,0x29, + + 0x63,0xE9,0xD5,0x6D,0xC8,0x44,0x23,0x0A,0x4D,0x08,0xED,0x91,0x31,0x59,0x35,0x79, + + 0x36,0x50,0xBF,0xFF,0x9F,0xE3,0x59,0xC2,0x20,0x88,0xB7,0x68,0x91,0x28,0xAE,0x3B, + + 0x68,0xAA,0xFC,0x31,0xF8,0x7B,0xE2,0x1F,0x44,0xD3,0xED,0x8E,0x31,0x63,0xC0,0x18, + + 0x08,0x4D,0xDB,0xD8,0x15,0xC9,0xCB,0x5E,0xA6,0x2F,0x19,0xF8,0x51,0x9B,0x17,0x3A, + + 0xA8,0x4C,0xC1,0x3E,0xFF,0x2A,0xEC,0xEC,0x31,0xE3,0xD1,0x12,0x3A,0xEF,0x67,0x27, + + 0x62,0x9C,0x34,0xEF,0x13,0x8F,0xA0,0x0A,0xF7,0x2D,0x1B,0xED,0xC3,0x69,0x03,0x04, + + 0x2C,0x53,0x28,0xF7,0x48,0xC6,0x2E,0x10,0x9F,0x12,0x92,0x00,0x13,0xAF,0x53,0x81, + + 0x27,0xD9,0x6F,0x67,0x41,0x73,0xFC,0x70,0x27,0xFC,0xC6,0x4B,0x1B,0x42,0xA6,0xB9, + + 0x7C,0xA3,0xFB,0xBC,0x59,0xA3,0x9F,0x74,0xE6,0x9A,0x83,0x09,0x1B,0x21,0xB9,0x68, + + 0xB1,0x51,0x07,0xE5,0x58,0x90,0x05,0x81,0x16,0xAC,0xE3,0x1C,0x18,0xD0,0x25,0x80, + + 0x26,0x38,0x62,0x46,0xA3,0x18,0x6A,0x45,0xC5,0x44,0xD5,0x82,0xDE,0xC8,0xC6,0x99, + + 0x82,0x9C,0xAC,0xD6,0x4C,0x38,0xF2,0x8E,0xC2,0xD5,0x1C,0x75,0xFB,0x73,0xFE,0x82, + + 0x13,0x54,0xBD,0xE2,0x53,0x39,0x6B,0x51,0x45,0x50,0xAD,0xC2,0x0B,0x79,0x49,0x31, + + 0xA7,0x3B,0x9D,0xB3,0xBF,0x75,0x25,0x75,0xA6,0x6F,0xF3,0xB4,0x52,0x88,0x82,0x2C, + + 0xFC,0xC9,0x9E,0x10,0xD1,0xE2,0x28,0x19,0xE5,0xAE,0xCE,0xA8,0xF1,0xA5,0xBD,0xA0, + + 0x1A,0x59,0x22,0x07,0x3A,0xBB,0xDE,0xEC,0xF7,0xFA,0xB2,0xC2,0x7F,0xB1,0xA0,0xB4, + + 0x41,0xAB,0xC5,0x76,0x51,0xF9,0x1F,0xAD,0x40,0x55,0xA9,0x19,0xDB,0x3A,0xA4,0xBF, + + 0x44,0x79,0x4F,0xC9,0x27,0x98,0x4A,0x4A,0xD7,0x7E,0x7A,0x0C,0xC3,0xD4,0xFD,0xBB, + + 0x58,0xBD,0x56,0xC0,0xB8,0x38,0x96,0x74,0xC5,0xA9,0x62,0x8E,0xF8,0x60,0x8E,0x8C, + + 0x47,0xB2,0x4A,0x58,0x1D,0x0E,0x95,0x84,0xEB,0x1F,0x61,0x1E,0xF9,0xB1,0x7F,0x36, + + 0x43,0x6D,0x18,0xAF,0x9A,0x73,0x86,0xD7,0xD0,0x1C,0x7A,0xB2,0x59,0x1B,0xDE,0xFE, + + 0x0A,0xB0,0xAF,0x4F,0x9B,0x32,0xB3,0x8A,0x89,0xF9,0x09,0x9F,0x04,0x1A,0x20,0x3C, + + 0x3E,0x75,0x7C,0x25,0xB7,0x00,0x9C,0xB9,0x47,0x62,0x8E,0x46,0xAF,0x7B,0xE8,0x17, + + 0x23,0x75,0x16,0x93,0xFE,0xA2,0x47,0x41,0x23,0xAD,0x83,0xB2,0x10,0x2B,0xF0,0xF8, + + 0xF7,0x82,0x71,0x74,0xE4,0xE7,0x0F,0xFF,0xA4,0x1D,0xB1,0x16,0x75,0x1D,0xFB,0x2D, + + 0xBF,0x76,0x97,0x2E,0x9B,0x0C,0x5E,0x73,0xC1,0xE6,0x87,0x83,0xF4,0xE1,0x1A,0xA2, + + 0x0A,0x29,0xBE,0x3B,0x04,0xA0,0x67,0x91,0x24,0x19,0xD9,0x2D,0x8B,0xEB,0x56,0xEA, + + 0x6F,0x88,0xEE,0x24,0xFC,0x5C,0x46,0xC2,0x8D,0x34,0x3C,0x61,0xB5,0x5C,0xB4,0xB1, + + 0xA7,0x34,0xA4,0x38,0x74,0xE2,0x22,0x90,0xE8,0xA8,0x45,0x18,0x75,0xA4,0x96,0x20, + + 0xB9,0xC5,0xC9,0xD7,0x6A,0x20,0x47,0x4F,0xC1,0x0F,0x3A,0xF5,0x46,0x8B,0xF3,0x51, + + 0xB1,0x34,0xF6,0x7D,0x64,0x7D,0x4A,0x59,0x7A,0x39,0x72,0x7A,0xDA,0xE2,0xFA,0x01, + + 0x67,0x32,0x1A,0x69,0x13,0x75,0xAA,0x2B,0x6B,0x64,0x84,0x92,0x25,0x46,0x78,0x0B, + + 0x8A,0xEA,0xB0,0xE7,0x90,0x76,0x4D,0x93,0x39,0xCE,0x36,0xAB,0x99,0x81,0xAD,0x9F, + + 0xC8,0xEE,0x6F,0xD5,0x2E,0x54,0x23,0x0B,0x32,0x34,0x68,0x45,0x5D,0xBA,0xE8,0x7F, + + 0xF9,0xE9,0x46,0x5F,0x75,0x55,0x7A,0x2A,0x70,0x8E,0x32,0xEF,0x0F,0xF7,0x54,0xFF, + + 0x6E,0x89,0x98,0x4C,0x13,0x06,0x2C,0x3A,0x67,0x8F,0x42,0xFA,0x55,0xE9,0x5B,0x0C, + + 0x44,0x0D,0xA6,0x4D,0xD2,0x53,0xF9,0x4B,0xC8,0x06,0x64,0x09,0x29,0xFE,0x12,0x25, + + 0xEE,0x8B,0x74,0xD3,0x99,0xCD,0xF1,0x79,0xCC,0x2F,0xA2,0x5B,0x7A,0x50,0x8F,0x07, + + 0xB7,0x8F,0xF1,0x75,0x0A,0xDC,0x4C,0xB3,0x42,0x7D,0x61,0x5A,0x74,0x5D,0x16,0x61, + + 0x03,0x3C,0x7F,0xE5,0x0F,0x67,0x06,0x36,0x20,0x1B,0x6F,0xC8,0x1F,0xC2,0x5B,0x22, + + 0x70,0x91,0x9B,0x2B,0x6A,0x1D,0x2D,0x93,0xEC,0x2D,0x64,0x96,0xD5,0x5D,0xFD,0xD4, + + 0x67,0x83,0xD3,0x2E,0x3C,0x5B,0x03,0x07,0xC4,0x71,0xC3,0x0E,0x7C,0x1B,0xF1,0xB1, + + 0x50,0x35,0x1B,0xE1,0x97,0xB2,0x20,0x91,0x44,0x96,0xCC,0x64,0xE7,0x48,0xAC,0x86, + + 0x4B,0x4A,0x58,0xA9,0x94,0xB3,0xBC,0xA6,0x7E,0x97,0x84,0x1E,0x53,0xB8,0x5D,0x3C, + + 0x4F,0x25,0xCC,0x80,0x6B,0xB9,0xFF,0xA3,0xE7,0x16,0x5A,0x05,0x5A,0x0B,0xD9,0xB1, + + 0x58,0xF9,0x8F,0xF3,0x16,0x48,0xBE,0x14,0xAF,0x94,0x06,0xFF,0x52,0xEC,0x6E,0x0D, + + 0x4F,0x67,0xA0,0x2A,0x5F,0xF8,0xDA,0x38,0x64,0xD2,0x76,0xFA,0x65,0xF5,0x10,0x3E, + + 0xCF,0x89,0x94,0x2F,0x07,0x16,0xEF,0x29,0x4C,0x76,0x92,0xC0,0x7B,0x31,0x59,0x26, + + 0x47,0x09,0xB1,0x23,0x57,0xE9,0xB7,0x88,0x4F,0x77,0xAD,0xAE,0xDF,0xBA,0x2F,0xDB, + + 0xA9,0xBE,0xFA,0x1B,0xF8,0xFD,0x6C,0xC8,0xD7,0x5D,0xAF,0x3B,0xB8,0x58,0x58,0x62, + + 0xE4,0xED,0x52,0xAC,0xBC,0xA0,0x52,0x87,0x4A,0x57,0xE0,0x6A,0x74,0x77,0x17,0xA9, + + 0x41,0x14,0x51,0x3C,0x0C,0x5C,0xCD,0x53,0x69,0x57,0xFF,0x98,0x4C,0xAC,0x59,0xE7, + + 0xCF,0x9A,0xC9,0x90,0x1D,0xDB,0x73,0x09,0x12,0x8D,0xAE,0xD2,0x5B,0x21,0x4F,0x51, + + 0xAE,0x46,0x57,0x20,0xD4,0xB0,0x00,0xDF,0x06,0x26,0x3F,0x7E,0x9C,0xBE,0xA7,0x3D, + + 0x33,0x53,0x3A,0xFB,0x73,0x73,0x40,0x81,0xC0,0xC0,0x2F,0xA0,0x52,0xD9,0x55,0xF6, + + 0x07,0x43,0x73,0xD3,0xCF,0x29,0xD8,0xB4,0x3B,0x95,0xF8,0xA6,0x71,0x6C,0x5A,0x01, + + 0xB7,0xFA,0x97,0xA5,0x23,0xEF,0x57,0x81,0xC8,0x13,0xEF,0x22,0xF8,0xDD,0x6A,0x93, + + 0x18,0x6E,0xC9,0xE5,0xA7,0x82,0xC9,0xC2,0xEF,0x97,0x62,0x12,0x70,0x65,0x78,0xC2, + + 0xC0,0xC7,0xBE,0x6C,0x14,0x06,0x09,0x58,0xE7,0x4D,0xC3,0x97,0x2A,0xCB,0x30,0x74, + + 0x30,0x34,0x08,0xD5,0x69,0x28,0x76,0xC4,0xE2,0xBA,0x27,0x07,0x63,0x09,0xEE,0xA3, + + 0x2E,0xFB,0x96,0x27,0x79,0x77,0xD1,0x7F,0xF6,0x40,0xC0,0x8D,0xBE,0x2B,0x12,0x51, + + 0xF8,0x07,0xB7,0x78,0x95,0x05,0x27,0x5C,0xF0,0xA6,0x3E,0xB5,0x85,0xCA,0x3A,0xF6, + + 0xA4,0x05,0xD6,0xE6,0xDD,0xF5,0x40,0xDB,0x22,0xC5,0xF0,0x8C,0x5E,0x2A,0xA9,0xB0, + + 0xE2,0x3A,0xDA,0xF6,0xDC,0xD4,0xF6,0xAB,0x63,0x43,0xF8,0x04,0x5F,0xEB,0xA0,0xBD, + + 0x63,0xE9,0x29,0xFD,0xAE,0x8B,0x6D,0x89,0x21,0x49,0xE3,0x6D,0xC8,0x6C,0x51,0xE6, + + 0x62,0x48,0x21,0x0C,0xB3,0x2F,0x57,0x4A,0xEB,0x09,0xC8,0x7D,0xDA,0x6D,0x9F,0xB7, + + 0x3D,0xF4,0x95,0x2E,0xF1,0xBD,0xEA,0xF8,0xBD,0xE3,0xC5,0xE8,0x58,0xD6,0x95,0x4C, + + 0x0D,0x4D,0x0A,0xDD,0x5A,0x20,0x62,0x83,0xC4,0xBB,0xE4,0x54,0x5D,0x6F,0x1E,0xBF, + + 0xFD,0x0E,0x99,0xE0,0xF2,0x3F,0x40,0xEB,0x03,0x3D,0x13,0xED,0xB0,0xD1,0x68,0xA8, + + 0xE6,0xF0,0x34,0xAF,0xBA,0xAF,0x53,0x75,0xF8,0xDE,0x94,0xF9,0xD1,0x2F,0x0C,0x04, + + 0x22,0xF2,0xFD,0xF2,0x36,0x32,0xB3,0x11,0xA8,0x53,0x9C,0xAC,0xF2,0xF6,0xCC,0x4C, + + 0x3B,0xCC,0x73,0x65,0x92,0xB1,0x5C,0xAC,0x9E,0x3D,0x94,0x85,0xF3,0xF7,0xFA,0x05, + + 0xA6,0xF7,0x8D,0x01,0xB2,0xD0,0xC0,0xD2,0xC2,0x10,0x06,0x21,0xB2,0xE1,0x25,0xF3, + + 0x5C,0x1F,0xB3,0x35,0x51,0xB2,0x7B,0x04,0x14,0xF5,0x0E,0x31,0xFF,0xFC,0x1A,0xB5, + + 0x26,0x3D,0x86,0x37,0x4A,0x9F,0x6E,0x13,0x5A,0x52,0x4A,0xF0,0x56,0xD9,0x8C,0xC4, + + 0x3F,0x54,0xF6,0x27,0x0B,0x33,0xCD,0x18,0x0F,0x18,0xE6,0x07,0x43,0xFE,0xE9,0x45, + + 0xAC,0xF2,0x5B,0xD4,0x9B,0x5A,0x7B,0x4C,0x43,0xF9,0x4B,0x17,0xD3,0xC7,0x3C,0x6D, + + 0x8F,0x40,0xE3,0x61,0x12,0x98,0x1F,0x02,0xDF,0xFC,0xC8,0xC4,0xC3,0x68,0x3E,0xFB, + + 0x0A,0x5A,0x94,0x08,0x3A,0x38,0xC4,0x68,0x24,0x8C,0x9E,0xB4,0xFA,0xFE,0x35,0x1C, + + 0x7E,0x2B,0xB0,0x3C,0xD9,0xB8,0x4E,0x00,0xE6,0xA4,0xA6,0x23,0x88,0xAF,0x47,0x95, + + 0xAE,0x38,0x78,0x7C,0x1B,0xBA,0xC5,0xB6,0x86,0xFE,0x47,0xCF,0x0B,0x1F,0xCF,0x09, + + 0xC3,0x15,0x1D,0x19,0xBB,0x2C,0x79,0x10,0x1C,0xFD,0x97,0x3C,0xFF,0x39,0x4E,0xEC, + + 0xAB,0xC6,0x57,0x3F,0x06,0x93,0xC8,0xED,0x43,0x30,0x6C,0x13,0x99,0x75,0x47,0xA9, + + 0x07,0x4A,0xF6,0x23,0xD2,0x2C,0x3E,0xAB,0x55,0x50,0xD6,0x78,0x79,0x9F,0xD7,0xB0, + + 0x87,0x7F,0xD6,0x4F,0x73,0xDD,0x0E,0xC8,0x4F,0xA1,0x92,0x92,0xFC,0x7C,0xD5,0xFD, + + 0x68,0xA6,0x63,0x42,0xB8,0x4D,0xA4,0x84,0xC8,0xBF,0x20,0x0C,0x58,0xFF,0x5E,0xA7, + + 0x37,0x61,0x4C,0x17,0x36,0x0D,0x70,0x62,0x42,0xC2,0xD2,0x1E,0x52,0x82,0x56,0xB2, + + 0x36,0x60,0x68,0x92,0xE8,0xA7,0xEC,0x4C,0x8F,0x82,0xDA,0x96,0xF4,0x7E,0x99,0x93, + + 0x6F,0xA1,0xF1,0xB5,0xD4,0x9E,0xF7,0xDC,0x49,0x64,0xCB,0x67,0x84,0xE4,0x91,0x54, + + 0x8B,0x7C,0xCB,0x37,0x93,0xE1,0x71,0x26,0x11,0x80,0x0D,0x55,0x0B,0x7E,0x5E,0x3F, + + 0x67,0xD1,0x47,0x7F,0x96,0x64,0xC8,0xD0,0x4E,0x44,0x1C,0xFD,0xE3,0x72,0x72,0xFD, + + 0x26,0xF5,0x96,0x6F,0x97,0x47,0x21,0x4A,0xE2,0x42,0xEF,0x67,0x67,0xE1,0x79,0xC2, + + 0x6F,0x7F,0xB8,0x72,0x33,0x24,0x56,0x5B,0x46,0x56,0xF9,0x62,0x1E,0xF7,0x57,0x2E, + + 0xE6,0xF2,0xD3,0xA4,0xAF,0xA1,0xF9,0x67,0x45,0x6B,0x90,0x08,0x95,0x48,0x1C,0xAA, + + 0x83,0x7E,0xAC,0x8C,0xDE,0xE9,0x95,0x8F,0x84,0xCB,0x51,0x6E,0x2E,0xEE,0x30,0x1B, + + 0x2E,0x11,0xD2,0x6C,0xF6,0xAA,0x6C,0x44,0x87,0x4A,0x0E,0x5C,0xDF,0x6F,0x2B,0xCF, + + 0x65,0x7B,0x0C,0xED,0x30,0x57,0xE2,0xEC,0x31,0x6C,0xD1,0x0B,0x7D,0x35,0x15,0xBB, + + 0x8B,0x89,0xF1,0xB3,0xF5,0xA8,0x33,0x2E,0x19,0x48,0x6B,0xBB,0xDB,0xEC,0x7A,0x5B, + + 0xE7,0x75,0xCC,0xE3,0xBF,0x03,0x21,0x08,0xA5,0x5D,0x61,0x9F,0x33,0x2C,0x14,0x73, + + 0x3C,0x6C,0x7F,0x79,0xBE,0x02,0x40,0x89,0x77,0xCB,0xDA,0x7A,0xBE,0x12,0x11,0xE5, + + 0xDA,0x03,0x72,0x68,0x3F,0x01,0xD0,0x52,0xE7,0xA6,0xD3,0x76,0xA1,0xCE,0xD3,0xCB, + + 0x64,0xDE,0xF8,0xB7,0xF3,0xE2,0x55,0xCF,0x4F,0x0F,0x3B,0x5F,0xDF,0x44,0x1C,0x7D, + + 0xA7,0x9D,0xA2,0x26,0xDD,0xB3,0x65,0xE2,0x28,0x04,0x0B,0x24,0xB6,0xF3,0x8F,0x22, + + 0xF9,0x32,0x3B,0x76,0x6F,0xAA,0x6C,0x0B,0x2D,0xD2,0xDE,0x12,0xA8,0xFE,0xDE,0x07, + + 0xAF,0x58,0xD7,0x97,0x7F,0x1F,0x64,0xBC,0xDE,0x76,0x75,0x23,0xBD,0xF4,0xC1,0xE0, + + 0xCF,0x35,0x3B,0xF1,0x4A,0xF1,0x1D,0x99,0x04,0x7C,0x09,0xC8,0x56,0xB1,0xF0,0x74, + + 0x5B,0xD5,0xDA,0xEB,0x30,0xB6,0xD7,0xCB,0x0D,0xC5,0xCA,0xCE,0x96,0x75,0xB2,0xD2, + + 0x27,0xF4,0x2C,0x56,0x6C,0xF7,0xEE,0x94,0x12,0xDE,0x03,0x85,0x47,0xB7,0x4D,0x37, + + 0x8A,0x07,0x66,0x38,0x5F,0xA7,0x71,0xE1,0xF8,0xCD,0xE5,0x63,0xF4,0xF6,0xC1,0xA1, + + 0x4C,0xA6,0xAD,0x66,0x3A,0x41,0x3D,0x80,0x9E,0x50,0xBD,0x51,0xBF,0xE6,0xF2,0xF9, + + 0x4E,0x3E,0xE6,0xD7,0x3A,0xDA,0x66,0xB9,0x4E,0xFB,0x76,0xD1,0xFE,0x7E,0x7C,0x3E, + + 0xE5,0x3A,0x81,0x7C,0x91,0x04,0x3C,0x7A,0x09,0x52,0x01,0x5C,0xFF,0xC5,0xF7,0x4B, + + 0xBC,0x3E,0x68,0x0D,0x7E,0x39,0x09,0x0A,0x61,0x5C,0xE5,0xF0,0x5F,0x9F,0xFB,0x99, + + 0xE5,0x3F,0xD7,0x6E,0x1E,0xFB,0xEE,0x8A,0xC7,0xC4,0x03,0xDD,0x02,0x9E,0x18,0xE6, + + 0xAC,0x30,0xDD,0x50,0x3D,0xDC,0xF2,0xE7,0xEC,0x70,0xC8,0xC6,0x9C,0x3C,0x40,0x77, + + 0x8E,0x42,0xFF,0xDC,0xA8,0xBB,0x20,0xD2,0x6B,0xD9,0x68,0x0F,0x02,0x02,0xB5,0xA9, + + 0x51,0x98,0xC1,0xE7,0x82,0x1E,0x24,0x89,0x05,0xEF,0x1D,0xCB,0x1F,0x51,0xC3,0x44, + + 0xAC,0x7F,0xC1,0x6A,0x1E,0x10,0x79,0x89,0x04,0xEE,0xA6,0xCA,0x5A,0x93,0x62,0x05, + + 0x03,0x40,0x40,0x35,0xD5,0x62,0x70,0x76,0x7B,0x9D,0xAE,0x10,0x73,0x25,0x54,0x62, + + 0xEA,0xA0,0x8E,0x90,0x4D,0xDC,0x78,0x66,0x7A,0x4C,0xA6,0x5C,0xDC,0xE7,0x35,0xB7, + + 0x86,0x4A,0x8E,0xE6,0xB0,0x62,0x69,0x06,0x3D,0x4D,0x97,0x14,0x50,0xB4,0x77,0x25, + + 0x7D,0xC2,0xA9,0xFF,0xEE,0xBF,0xB5,0xB4,0x62,0x26,0x9D,0x75,0xF9,0x65,0x80,0xD2, + + 0x04,0x46,0x00,0xC0,0xD0,0x66,0x94,0xC8,0x44,0x46,0x94,0x25,0xBB,0xB5,0x4C,0x52, + + 0x07,0xFE,0xF0,0xAF,0xEE,0x9C,0x23,0x57,0xE2,0xFA,0x4D,0x50,0xBA,0x34,0xBF,0x01, + + 0xC2,0xFD,0x81,0xB2,0x61,0x43,0x97,0xE5,0xC0,0x49,0xA9,0x74,0xA6,0x4A,0x49,0x4E, + + 0xA1,0xDC,0x91,0x51,0x66,0xBE,0xE6,0x08,0xE0,0x07,0xCF,0x4D,0xBB,0x6A,0x58,0x59, + + 0x74,0xA7,0x59,0x0C,0x1E,0x70,0x2A,0xAD,0xEB,0xC5,0x38,0x9C,0xF9,0xEF,0x74,0x1F, + + 0xE8,0x06,0xB0,0xEF,0x46,0xD2,0x3B,0xBC,0x47,0x22,0x05,0x38,0x0F,0xB6,0xA3,0x7B, + + 0xEA,0xA6,0x02,0x89,0xB1,0x47,0x6D,0x55,0x4A,0xE6,0xDD,0x39,0x10,0xF3,0x51,0x71, + + 0xF5,0xA4,0x3A,0xE3,0x9F,0x73,0x7B,0x6A,0x88,0x46,0xA5,0x45,0x99,0xC4,0x6C,0xB5, + + 0x34,0x77,0x9A,0x48,0xA6,0x2F,0xE9,0x10,0x69,0x0C,0xC0,0xF1,0xB1,0x28,0x85,0xD2, + + 0x7C,0xA1,0xD1,0x62,0x35,0xD8,0xC7,0x18,0x35,0x98,0x7E,0x58,0x68,0xB6,0xC1,0xB0, + + 0x75,0x4C,0xFD,0xED,0xA7,0x27,0xE6,0x54,0x23,0xBF,0xE9,0xDD,0x47,0xC1,0x94,0xED, + + 0xB4,0xAF,0x99,0xD9,0xD9,0x7D,0x0F,0x46,0xED,0x0D,0x61,0x4D,0xBA,0xC0,0x7C,0x68, + + 0x18,0x5D,0xF9,0x7F,0xE1,0xED,0x2C,0x22,0xA9,0xD3,0xF4,0xF2,0x4B,0x7D,0x5C,0x14, + + 0x2B,0xCE,0x2C,0x64,0xF3,0x73,0x5C,0xBA,0x67,0x13,0x3B,0x9D,0xA1,0x20,0xFE,0x89, + + 0x05,0x09,0xAE,0xB5,0x90,0x9D,0xD5,0x25,0xF6,0x10,0x76,0x81,0x24,0x63,0x6D,0xC7, + + 0xCF,0x1C,0xC9,0x94,0x0E,0x9E,0xE8,0x76,0xE7,0xF3,0xBA,0x98,0x6D,0xE2,0x84,0x45, + + 0x10,0x56,0xDB,0xB7,0x4B,0xB3,0xC1,0x86,0x9D,0x38,0xAA,0xE3,0x56,0xFF,0x87,0x59, + + 0xF7,0x36,0xEC,0xF4,0xDA,0x8C,0x06,0x44,0x1F,0xFA,0x7C,0x86,0x11,0x09,0x05,0x54, + + 0x5D,0x54,0xC1,0xD5,0x81,0xF7,0x37,0xF0,0xE1,0xE6,0x32,0xD4,0x8E,0xD9,0xEA,0x75, + + 0xA5,0x55,0xBF,0xD1,0xE5,0x2C,0xFD,0x83,0x81,0xFB,0xA3,0xF2,0xD7,0xDC,0xB2,0xF7, + + 0x8B,0x5A,0x14,0xBD,0x99,0xC7,0x11,0xE8,0x64,0xF3,0xAC,0x5F,0x01,0xD7,0x16,0x9C, + + 0x81,0x2F,0xD4,0xFB,0x45,0x96,0x97,0x3C,0x6B,0xFA,0x9F,0x5A,0x92,0xDA,0x56,0x67, + + 0x55,0x95,0xB9,0xBC,0x96,0xE5,0x8C,0xA8,0xEE,0x58,0x0E,0x45,0xC4,0x35,0xCF,0xC5, + + 0xEE,0x11,0x2F,0x6D,0x28,0xE8,0xDF,0x3D,0x9B,0xA4,0x38,0xBB,0x2D,0x1F,0x20,0x4C, + + 0x28,0xBA,0xD1,0xCE,0x74,0x91,0x28,0xEF,0x83,0x8D,0xAE,0xF1,0xBA,0xB3,0x0E,0x4D, + + 0xD4,0x5F,0xC8,0xB0,0xD2,0x64,0x5C,0x1E,0x6D,0x5F,0x59,0xEE,0x5F,0xD2,0x87,0x4C, + + 0xA3,0x5C,0x97,0x7F,0xB2,0x9C,0x2F,0x01,0xD6,0x13,0xE9,0xD0,0x91,0x71,0x84,0x50, + + 0x7F,0x7C,0xBD,0xDC,0xFB,0x24,0xEF,0x7D,0xE5,0x77,0x7B,0x9F,0x0C,0x1A,0x80,0x70, + + 0x66,0x2C,0x21,0x74,0xFF,0x01,0x50,0x71,0x49,0x82,0x2F,0xCE,0x38,0xAD,0x50,0x03, + + 0x61,0x2C,0x10,0xE9,0x98,0x0C,0x19,0xB0,0x8C,0xE9,0xD8,0x7C,0xDC,0xEE,0x5F,0x04, + + 0xE7,0x7D,0xDF,0x33,0xA7,0x43,0xF1,0xAF,0xC2,0xC0,0xCF,0x52,0x3D,0x1B,0xBB,0xF3, + + 0x81,0x23,0x3B,0x88,0x7C,0x02,0xF9,0xB7,0x33,0xAF,0x0D,0x45,0x76,0xA2,0x3F,0xBD, + + 0x00,0x7E,0x86,0xE2,0xE3,0x02,0x32,0xEE,0x8C,0x47,0x50,0x14,0x34,0x98,0x36,0x6E, + + 0x0F,0x28,0xBA,0x67,0xB6,0x5A,0x2C,0x01,0x61,0x64,0x6F,0x47,0xF6,0x44,0x00,0x31, + + 0x6D,0x37,0xB5,0x07,0xC1,0x0B,0xCA,0xF0,0xE8,0xCE,0x8F,0x60,0xF2,0x4B,0x7A,0xC3, + + 0x78,0x2A,0xD7,0xF2,0xB9,0x78,0x41,0x8C,0x2E,0xE4,0xC1,0x47,0x7A,0x48,0x34,0x7A, + + 0x2C,0x20,0xC0,0x0E,0x1F,0x22,0xF2,0x3B,0x14,0xC0,0xEC,0x5A,0xA3,0x43,0x6E,0xEC, + + 0x8F,0x25,0xF3,0x1A,0x90,0xCA,0x02,0xC4,0xE1,0xC4,0x71,0xB7,0xD0,0xEF,0x35,0xEB, + + 0x43,0xC8,0x9D,0x3B,0x68,0x0B,0x27,0xA9,0x05,0x85,0x2C,0xD0,0xF8,0xA8,0x27,0xF9, + + 0x21,0x76,0x00,0xBA,0x48,0xB5,0xC4,0xB9,0x04,0x68,0x11,0xD3,0x7C,0x1D,0xF1,0x0D, + + 0xD0,0x84,0x0E,0x31,0xD4,0xEF,0xA6,0x94,0xC1,0x31,0x52,0x1C,0x3C,0xB0,0x7F,0x5C, + + 0xC7,0x9C,0x6A,0x4F,0x75,0x00,0xAE,0xBA,0x4B,0x6D,0x4C,0x4F,0x67,0x42,0xE3,0x28, + + 0x16,0x2A,0x58,0xDC,0xB4,0xA4,0x15,0xDB,0x3B,0x68,0x8D,0x68,0xFA,0x65,0xCF,0xDF, + + 0x8D,0x29,0xBB,0xBF,0xDD,0x0F,0x2D,0x74,0xB3,0xD4,0x5B,0x0D,0xBD,0x93,0xA4,0xA1, + + 0xC2,0x3D,0xDA,0x81,0x81,0xBF,0xF4,0x93,0x8A,0xD8,0x8C,0x58,0xD8,0xFD,0xAC,0x91, + + 0x8A,0x97,0x3C,0xAF,0xDE,0xF5,0xFC,0x33,0x7D,0x93,0x9A,0x9E,0xF9,0xB3,0x38,0xF3, + + 0xAC,0x9B,0x11,0xE8,0x17,0x39,0xB0,0x27,0xE6,0x13,0x4A,0xB4,0xCC,0xB6,0x87,0x26, + + 0x04,0x4C,0xF7,0x05,0xC7,0xF1,0x2B,0x04,0xE6,0xB3,0x7D,0x40,0xF4,0x73,0xC3,0x72, + + 0x20,0x96,0xF0,0xC4,0x7A,0x19,0xB4,0x62,0x28,0x96,0xCC,0x19,0x9F,0x8C,0xAC,0x52, + + 0x69,0xD7,0xB5,0xFE,0xDE,0x64,0x82,0x76,0x25,0xD7,0x84,0xF2,0x9E,0xAD,0xD5,0x47, + + 0xA8,0x85,0x7C,0x75,0xB2,0x16,0xB5,0x71,0xE0,0xD4,0xE3,0x85,0xD2,0x5D,0x2D,0x31, + + 0xA1,0x15,0x15,0xD8,0x95,0xAC,0x75,0xE3,0x98,0xF7,0xCF,0x04,0x73,0x53,0x92,0xE8, + + 0xD3,0x9E,0xE6,0x3F,0xC7,0x33,0x0C,0x59,0x19,0x73,0x69,0xAF,0xFC,0xB8,0x5A,0xDA, + + 0x65,0xDB,0xF4,0xD5,0x4B,0xFB,0x86,0x45,0x6B,0x48,0x7E,0x3A,0xB7,0xF4,0x09,0xCA, + + 0xAA,0xD8,0x1B,0xB2,0x57,0xFE,0x2A,0xAE,0xDF,0x3B,0x68,0xAF,0x20,0x0B,0xEB,0x9F, + + 0x2D,0x9B,0x6F,0x44,0xF5,0x7A,0x0B,0x3F,0xEF,0xB6,0x44,0x98,0x5C,0xB9,0x26,0x8A, + + 0x6E,0x67,0xF5,0xA8,0x7E,0xF3,0x56,0xEE,0x11,0xDC,0x8E,0xE9,0x5A,0x77,0x6E,0x95, + + 0xD2,0xE1,0x6C,0x1E,0x2B,0x48,0x3E,0xDC,0x69,0xBF,0x5E,0x8C,0x1D,0x31,0x63,0xC9, + + 0xAA,0x65,0xD9,0xF6,0x33,0x38,0xDA,0x94,0x73,0x9C,0xCC,0xDE,0x86,0x51,0xAF,0x5B, + + 0x0B,0xDD,0xF8,0xCE,0xC7,0xFD,0x73,0x7F,0xED,0x3D,0x81,0xF8,0xDB,0xFF,0x3A,0xE8, + + 0x56,0x4F,0xBE,0x64,0x78,0x03,0x4F,0x56,0xCD,0x96,0x40,0x35,0x72,0x64,0xA4,0xF8, + + 0x81,0xCC,0xAA,0xFC,0x0F,0x6E,0xE3,0xC6,0x72,0xFA,0xDC,0xDC,0x13,0x2C,0x58,0x91, + + 0x25,0xFD,0xC3,0x16,0xBA,0x2D,0x19,0x31,0x3D,0xC3,0xE5,0x34,0xAC,0x43,0xEE,0xE2, + + 0xFD,0x18,0xB3,0xE6,0xB7,0x8C,0xA3,0xCE,0xF2,0x21,0xF9,0x63,0x34,0x6C,0x47,0xC4, + + 0x5D,0xDD,0x0B,0xD3,0x92,0xC5,0xB7,0x9F,0xB3,0xE2,0x40,0x16,0xB9,0x55,0xFF,0x48, + + 0x05,0xDF,0x0A,0x32,0xEC,0x3E,0x03,0x70,0x45,0x05,0xEB,0x85,0x27,0x67,0x18,0x55, + + 0x7F,0x49,0x01,0x99,0x5C,0x3D,0x29,0x9F,0x3A,0x4F,0xAF,0x49,0xB9,0xD7,0xE6,0xB9, + + 0xC3,0xFA,0x0A,0x33,0x1E,0xD1,0xF4,0x99,0xDB,0x9A,0x86,0xF5,0xA0,0x12,0xA2,0x8C, + + 0x64,0xF4,0x15,0xE4,0x06,0x65,0xEA,0xC0,0x12,0x05,0xCB,0x2E,0xBD,0x0D,0xD4,0xEC, + + 0x55,0xA4,0x6D,0xDC,0x6C,0x6B,0x4A,0x28,0x5D,0x04,0x2E,0xDE,0x6A,0xF9,0x25,0xEB, + + 0xA2,0x11,0x7C,0x7E,0xE4,0x46,0x84,0xC1,0x82,0x05,0xEB,0xC4,0xC4,0x07,0x5F,0x79, + + 0xC9,0xC4,0x1D,0x2A,0x9F,0x8B,0x42,0xBC,0x6E,0x50,0x23,0x1A,0x7A,0x0E,0xBA,0xCC, + + 0x11,0x77,0x8A,0x55,0x1C,0xD6,0xAA,0x60,0xB7,0x03,0x65,0x44,0x5C,0x75,0x13,0xDA, + + 0x4E,0xF2,0x93,0xC0,0xBE,0xAD,0xD9,0x0B,0x53,0xE4,0x1A,0xBC,0x0E,0x67,0xF3,0xC9, + + 0x6B,0x6D,0x98,0xC9,0x87,0xF7,0x0D,0x20,0xCA,0x4A,0x55,0x1F,0x31,0x8F,0x12,0xD5, + + 0x2E,0xD0,0x33,0x5F,0x83,0x34,0xDA,0x99,0x83,0xE4,0x0F,0xF9,0xD8,0xBF,0xFE,0x68, + + 0x6E,0x5F,0xAC,0x83,0xB1,0x74,0xD4,0x95,0xBD,0x4B,0x9B,0xA4,0x1B,0xA8,0x5C,0x8D, + + 0x80,0x7D,0xF1,0xB3,0x90,0x6E,0xDC,0x7C,0xFC,0x4A,0xC2,0x74,0x71,0xDA,0x55,0x99, + + 0xBE,0x14,0xBD,0x6F,0x1C,0x3F,0x4E,0xD2,0x43,0x9D,0x95,0x54,0xAD,0x72,0x54,0x68, + + 0x67,0x28,0x39,0xF7,0x0E,0x2E,0xC0,0xCE,0x06,0xDE,0xD1,0xB5,0x10,0x0C,0x1D,0x28, + + 0xC7,0x6B,0xFA,0xEC,0xBF,0x92,0x2A,0x20,0x72,0x19,0xAD,0x60,0x31,0xBF,0x7E,0xC3, + + 0x02,0x1A,0xAC,0x82,0x5E,0x38,0x9C,0x3C,0x40,0x17,0xA4,0xD3,0x8E,0x7A,0x7B,0xCD, + + 0x3E,0x19,0x0E,0x85,0xBA,0x77,0x2B,0x20,0x1A,0x6E,0x15,0x25,0xA6,0xAB,0x7F,0x2E, + + 0x90,0xF7,0xBF,0xFB,0xC3,0x52,0x12,0x8A,0x0A,0x67,0xDB,0xC0,0x73,0x6B,0x41,0x6F, + + 0x1B,0xAA,0xAE,0xEE,0x81,0x34,0x4F,0x55,0x8F,0x5E,0xE9,0x53,0x7E,0x22,0x0B,0x6A, + + 0x69,0x56,0x75,0x67,0xCA,0xB2,0xDB,0x5E,0xCC,0x52,0x5D,0xDA,0x58,0x39,0xBF,0x76, + + 0x8A,0xF7,0xBF,0xFF,0xC7,0x1A,0x37,0xAF,0x49,0x41,0xCF,0xCC,0xC4,0x61,0x37,0x71, + + 0xD2,0xD4,0xDB,0xAC,0x9F,0x24,0x9F,0xA9,0x4E,0x40,0x83,0xAD,0x10,0x4B,0x78,0x2A, + + 0x8D,0x0C,0xFE,0x7E,0x71,0xDD,0xBA,0x7B,0x7E,0x54,0xE1,0xC4,0x86,0xAD,0x17,0x54, + + 0x8E,0x16,0x5E,0xFB,0x9A,0xBA,0x00,0xF1,0x6B,0x13,0x24,0x8E,0x90,0x9C,0xF8,0x2F, + + 0x1E,0xAE,0x73,0xAF,0x58,0x94,0x9D,0x6D,0xB5,0x54,0x64,0xD4,0xFC,0x17,0xCF,0xF7, + + 0xFB,0x04,0x7E,0x44,0x39,0xF3,0xDC,0x3F,0xE7,0x44,0x1F,0x3D,0xAE,0x75,0x79,0x04, + + 0x40,0x9B,0xD6,0x06,0x14,0xA0,0x6F,0x54,0x77,0x62,0xEA,0x27,0xF7,0xA2,0xA9,0x52, + + 0x41,0x4A,0xCE,0xB7,0xEA,0x0C,0x58,0x92,0x5D,0xCE,0xE3,0x02,0xD7,0x2D,0x81,0x75, + + 0x0B,0x04,0xA1,0x40,0x7D,0xAB,0xC9,0xCB,0xCA,0x8F,0x27,0xA9,0x75,0xF9,0xA8,0xFB, + + 0xEA,0x48,0x79,0xD0,0x4B,0xAB,0x60,0xA2,0x60,0xC5,0x04,0xD5,0xF1,0xEF,0x4A,0xE7, + + 0x28,0x0E,0x23,0x34,0xB1,0xEA,0x7D,0x67,0xC6,0xA4,0xC8,0x98,0xFA,0xE9,0x95,0x69, + + 0x26,0x70,0x28,0x02,0xE7,0xAB,0x7D,0xE2,0xB8,0x80,0x41,0xD3,0x9D,0xE8,0x49,0x1E, + + 0xC7,0x85,0x65,0xC3,0x89,0x5B,0x2F,0x2A,0xCE,0x6B,0x0C,0x29,0x23,0xBA,0xE8,0xD7, + + 0xD8,0xC0,0x81,0x95,0x13,0xA9,0xFB,0xD4,0x26,0xA4,0x84,0x9D,0x23,0x96,0xA5,0x88, + + 0x2E,0xB8,0x22,0x11,0x3A,0x25,0x62,0x37,0xEF,0xD3,0x8A,0x6C,0xFF,0xE4,0x82,0x0A, + + 0xEC,0x92,0x06,0x8D,0x37,0xA3,0x63,0xC3,0xA8,0x3F,0xD2,0xCF,0xDE,0xEB,0x1B,0xE3, + + 0xF7,0x45,0xDD,0xAF,0x75,0xA9,0x71,0x4D,0x33,0xA6,0x17,0x6D,0x58,0xE6,0x6C,0xFD, + + 0xBE,0xB0,0xA2,0x9B,0xF1,0x4E,0x45,0x06,0xFE,0x10,0xEB,0x32,0xCF,0x40,0x3B,0x5A, + + 0xAB,0x73,0x46,0x8C,0xBD,0xA2,0x8F,0x9B,0x17,0xCC,0x45,0x56,0xAB,0x8F,0x34,0x03, + + 0x0F,0xF8,0xB3,0xA7,0xBA,0x02,0xF1,0x72,0xEA,0x62,0x3A,0x7B,0xFC,0x60,0x3A,0x5F, + + 0x2B,0x31,0xDB,0xEB,0x1B,0xCF,0x2A,0x7E,0x6B,0x61,0x95,0x0D,0x25,0x71,0x73,0xDF, + + 0xD0,0x58,0xFA,0xAF,0x60,0xE0,0xF4,0x93,0xD7,0x82,0x26,0x7D,0x68,0xD0,0xCC,0x92, + + 0x22,0x6A,0x1C,0x6D,0x87,0xF2,0xF1,0xC4,0xEB,0x56,0xAE,0xA7,0x55,0xB0,0xD3,0x7A, + + 0x5E,0x5C,0xD1,0x54,0x94,0xAE,0xBB,0x54,0x56,0xA3,0x04,0x56,0x37,0x04,0xF5,0x6B, + + 0xE6,0xDF,0xA3,0x26,0x37,0xBF,0xB2,0xE3,0xE8,0x59,0xB9,0x2C,0xC7,0xA0,0xC1,0x0C, + + 0xA6,0xF3,0x10,0xCA,0x4A,0xEE,0x85,0x4C,0x0C,0xDA,0xBE,0x33,0xAA,0x2A,0xBD,0xB4, + + 0x46,0x6B,0xFB,0xA4,0xC1,0xD1,0x2D,0xF6,0x5D,0xCF,0x6A,0x95,0x1A,0x75,0x97,0xE9, + + 0x33,0x0E,0x71,0xB4,0xC4,0xD0,0x9E,0xB2,0x66,0xCE,0x07,0x89,0x1F,0xF8,0x9A,0xB1, + + 0xC4,0x69,0xDD,0x38,0x34,0x7A,0xCB,0xA4,0xD5,0x8D,0x75,0x18,0x17,0x95,0x6D,0x57, + + 0xA3,0xEB,0xD5,0x2C,0xCA,0xBC,0x24,0x07,0xE7,0xCC,0x02,0x89,0xD9,0x28,0x99,0x9A, + + 0xCB,0x83,0x2D,0x70,0x85,0x00,0x91,0x48,0xAC,0x77,0xEF,0xBE,0x81,0xB7,0x77,0x98, + + 0xC8,0x6F,0xC6,0x98,0xBE,0xDD,0x46,0xA8,0x84,0xD6,0x11,0x56,0x39,0x04,0x60,0xED, + + 0x53,0xF6,0xD8,0xE5,0xED,0x25,0x63,0xD8,0xCD,0x2E,0x00,0xB6,0xFA,0x20,0xD0,0x0B, + + 0x5A,0x80,0x6F,0x8E,0x67,0x1B,0x27,0xBF,0xA5,0xF8,0x47,0xBD,0xFB,0x0E,0xD9,0xE6, + + 0xD5,0x01,0x66,0xB4,0x4B,0xB7,0x52,0xFE,0x4C,0xEC,0xC8,0xD2,0x02,0x53,0x56,0xC9, + + 0x3B,0x92,0xFD,0xDC,0x7B,0xF1,0x27,0x66,0x0C,0xFD,0x80,0xF9,0xDE,0x22,0xB4,0x31, + + 0x13,0x3F,0x65,0xD5,0x82,0x0A,0xA5,0x4B,0xEE,0xBD,0x57,0x9C,0x86,0x2D,0x5D,0x24, + + 0x22,0x22,0x2F,0x99,0xA9,0xD3,0x87,0xBD,0xE3,0x9D,0x4B,0x9D,0x00,0x5B,0x93,0x06, + + 0xC8,0xB1,0xE6,0x3C,0x11,0xA0,0x30,0xCA,0x29,0x31,0xAE,0x08,0xDD,0x02,0x36,0x25, + + 0x07,0xA1,0x8E,0x3D,0x91,0xA6,0x8C,0x90,0x6D,0x23,0x58,0x37,0xD0,0x6C,0xA5,0xF0, + + 0x23,0x42,0x22,0x3D,0x4C,0x93,0x70,0x61,0xC4,0x0C,0x6A,0x56,0xEC,0x20,0xF6,0x73, + + 0x72,0x66,0x25,0x66,0xAD,0x85,0x09,0xB9,0x95,0x01,0x26,0x77,0x70,0xB6,0x8B,0xC9, + + 0xD6,0x07,0x88,0x55,0x79,0xE7,0x17,0x27,0x44,0x26,0x2D,0x16,0xE5,0x5B,0x38,0x32, + + 0xF0,0x60,0x1E,0x93,0xD1,0x37,0x9C,0x6E,0x40,0xE5,0x08,0x8E,0xA8,0x27,0xE6,0xE0, + + 0x00,0xAA,0x41,0x47,0x86,0x8B,0xDC,0xA1,0xD6,0x04,0xA8,0x5B,0xF8,0x93,0x71,0xAA, + + 0x7F,0xF6,0xC1,0x50,0xF8,0xE4,0x07,0xC0,0xD3,0x43,0x5D,0x97,0x32,0x1C,0x3A,0xF3, + + 0x85,0xF5,0x15,0xFF,0x24,0x85,0x5A,0x28,0x58,0x0A,0x03,0x13,0x64,0x2A,0xF1,0x9C, + + 0x0A,0xD9,0x1B,0x5B,0xF0,0x98,0x1C,0x21,0x48,0x69,0x65,0xFE,0xF8,0xB6,0x64,0xF6, + + 0x7D,0x9C,0x12,0x9E,0xEC,0x85,0x5B,0x8D,0x47,0x08,0x53,0x5E,0x5B,0x67,0x33,0xE3, + + 0x25,0x06,0xED,0xBC,0x72,0x9A,0x8B,0xFE,0xED,0x27,0x5B,0x2D,0xE6,0xC6,0xF1,0x74, + + 0x0C,0xD6,0x46,0x3F,0x70,0xA5,0x55,0xEC,0x44,0x14,0x52,0x82,0xE1,0x73,0xE3,0x26, + + 0x9E,0x0B,0x9C,0xEE,0x4B,0x5D,0xF9,0x38,0x47,0xE6,0xF2,0x1E,0xA6,0x61,0x06,0x06, + + 0x77,0x72,0xC1,0x2D,0xD2,0x83,0x1B,0x61,0xCC,0x2C,0x13,0x68,0x79,0xB3,0x65,0x67, + + 0x8D,0x6D,0xF5,0xEC,0xFB,0x4F,0x0D,0x61,0x3F,0x4C,0xE3,0x95,0xC7,0x22,0x52,0xA9, + + 0xCB,0x21,0x67,0x44,0x2A,0x5C,0x2A,0x89,0xED,0xF6,0x6F,0xD7,0x08,0x32,0x32,0xB8, + + 0x49,0x1C,0xB2,0xB8,0xFB,0xA0,0x09,0x34,0x63,0x59,0x23,0xF6,0xD0,0xA4,0x03,0xB4, + + 0x20,0x94,0xBB,0xA8,0x7A,0x83,0x04,0x61,0xA9,0xFF,0x55,0xA6,0x71,0x7F,0x1F,0x2B, + + 0x4A,0x57,0xC5,0x9D,0x79,0xA2,0xDD,0x31,0xAF,0xAC,0x8E,0x8A,0x89,0x31,0x34,0x44, + + 0x2C,0x7F,0x9A,0x61,0xB2,0x9F,0x00,0x65,0x1A,0xAB,0x2B,0x14,0xA4,0xD5,0xDF,0x10, + + 0x6B,0xBE,0xA7,0x24,0xB3,0x3A,0x0C,0xCB,0x49,0x17,0x8E,0xBB,0x98,0x11,0x23,0xFC, + + 0x57,0xB0,0x97,0xC3,0x30,0x4A,0x6E,0x5D,0x15,0xC3,0x42,0x16,0x76,0xFB,0x99,0xD0, + + 0x23,0x35,0x94,0x45,0x16,0x31,0xDD,0x2A,0x3F,0xB4,0xE5,0x0B,0x7E,0x8A,0x3C,0x38, + + 0x9C,0xB7,0x17,0x9F,0x40,0x49,0xBA,0x3B,0x14,0x85,0x56,0xDF,0xFB,0x75,0x36,0x63, + + 0xD8,0x75,0x9D,0x8F,0x05,0x88,0xBD,0x84,0xB5,0xA8,0x5E,0xAC,0x46,0xD4,0xA3,0xEB, + + 0x5B,0x7F,0xA7,0x99,0x70,0x6B,0x71,0x95,0xEB,0xDA,0x68,0x6F,0x59,0xA5,0xCB,0x67, + + 0x50,0x79,0xB5,0x6E,0x81,0x96,0xF3,0xC6,0x23,0x2A,0x8A,0x39,0xFB,0xC1,0xF9,0xB9, + + 0x56,0x17,0x6B,0x53,0x99,0x97,0x76,0xED,0x01,0xBF,0x35,0x2E,0xFE,0x72,0x16,0xC8, + + 0xC0,0x7E,0x62,0x4E,0x77,0x35,0x3C,0xE8,0x68,0xFD,0x84,0xF9,0x13,0xFE,0xC3,0xB7, + + 0xC3,0xCF,0x50,0xCC,0x53,0xCF,0x87,0x9A,0x84,0x30,0x73,0x0F,0xB2,0x8F,0x6F,0xDC, + + 0xC0,0x7C,0x4F,0xBE,0x52,0x9B,0x65,0x0A,0x8D,0x5B,0xA1,0x4D,0x1A,0xDC,0x5F,0x45, + + 0xF9,0x36,0x9E,0x3E,0xDE,0xA3,0xA0,0x3D,0x74,0x82,0xA5,0xA2,0x56,0xE8,0x56,0x3F, + + 0x27,0x6C,0xBF,0x92,0x1B,0x06,0x46,0x1F,0x91,0x10,0xAD,0xB2,0x57,0x31,0x5F,0x3B, + + 0x71,0x14,0xDF,0x3F,0x63,0x57,0xF1,0x9A,0x10,0x93,0x71,0xA7,0x22,0x4F,0xAC,0x54, + + 0x64,0x25,0x97,0x3A,0x4B,0x0E,0x47,0x0E,0x47,0xFF,0x15,0xA4,0xFF,0x1C,0xBC,0xD1, + + 0x7E,0x59,0x4C,0xD5,0x70,0x0B,0xC7,0xC3,0x40,0xA6,0x0B,0x6E,0xF3,0x9B,0x36,0xF6, + + 0x0F,0x81,0xBE,0x67,0x71,0x0A,0xC1,0xEC,0x44,0x04,0x85,0x9C,0xD4,0xE8,0x07,0x7B, + + 0x85,0x26,0xB3,0x45,0xD2,0x0B,0xC1,0x24,0x7B,0x30,0x58,0x19,0x43,0x6B,0x2D,0x2C, + + 0xEE,0x36,0xBB,0x68,0xF5,0xE6,0xD2,0x1D,0x12,0x3B,0x06,0xB5,0x76,0x38,0x31,0xF9, + + 0x7C,0x05,0x33,0x90,0x1D,0x58,0x8E,0x48,0xBB,0xAD,0x09,0xBD,0x7E,0x37,0x14,0x22, + + 0x65,0xD8,0x6A,0x9B,0xF7,0x04,0x6E,0x24,0x3D,0x66,0x45,0xBA,0x5F,0xAD,0x45,0x26, + + 0x67,0xFB,0x10,0x23,0x60,0xDB,0x0B,0x35,0xEE,0x65,0x89,0xD5,0x27,0x91,0x55,0x37, + + 0x64,0xFA,0xBC,0x80,0x74,0x3A,0x2C,0x49,0x26,0xFA,0x85,0x07,0x50,0x89,0x3A,0x4F, + + 0xFB,0x25,0x82,0x4C,0x2F,0xA1,0xCF,0x35,0x35,0x9C,0x32,0x7E,0x61,0xAE,0xBA,0x58, + + 0x03,0x26,0xD2,0xA5,0xEA,0x02,0x38,0xCB,0xA6,0xCE,0x3A,0x4B,0xD2,0xE1,0x70,0xAB, + + 0xCE,0x21,0x18,0xCD,0x1E,0x47,0xB3,0x6F,0x53,0x8C,0x65,0x28,0x23,0xE1,0xBB,0xA4, + + 0x0D,0x23,0xBF,0x24,0x74,0xEC,0xD7,0xFE,0x38,0x62,0x5F,0x3D,0x5B,0xE2,0xDB,0xC5, + + 0xCD,0xC1,0xB1,0xC1,0xFE,0xA1,0x8F,0x31,0x50,0xD8,0x74,0x26,0x82,0x50,0x64,0x96, + + 0xA2,0xF0,0x92,0xBF,0x33,0xB3,0xA9,0xC1,0x5D,0x93,0xBC,0x92,0xA1,0x60,0xC2,0xF0, + + 0x9C,0x44,0xAD,0x83,0x1C,0x5F,0x37,0xBD,0xD0,0x26,0xA0,0x84,0xAB,0x09,0x81,0xE8, + + 0x6F,0xC2,0xA5,0x13,0xB7,0x51,0x7D,0xAF,0x1A,0xBF,0x1A,0x8E,0x25,0x22,0x9B,0x46, + + 0x28,0xCC,0xB6,0xC0,0xFE,0xD7,0x24,0x91,0x08,0xBA,0x20,0x15,0x58,0xD9,0xCF,0x92, + + 0x6F,0x18,0xB6,0x0C,0x5F,0x44,0x42,0x47,0xE8,0x53,0x9C,0xB9,0x9F,0xFA,0x6D,0xCF, + + 0xA0,0xF4,0x41,0xE0,0x17,0x49,0x17,0xF3,0xE7,0x46,0x3F,0x0F,0x76,0x3B,0x13,0x62, + + 0x27,0x46,0x93,0xD1,0x56,0x34,0xFC,0x33,0xAF,0x7C,0xA4,0x0E,0x12,0x08,0x58,0xB2, + + 0xDD,0x3E,0x0A,0x1D,0x40,0x47,0x50,0x0B,0x99,0x7E,0x91,0x93,0x9D,0x57,0xCE,0xEC, + + 0xD2,0xF7,0x94,0x64,0xC6,0xC2,0x6E,0xA5,0x47,0xB7,0x90,0x80,0xDC,0x66,0x32,0x78, + + 0x90,0x81,0x1C,0x1C,0xC8,0x65,0x67,0x6B,0xAC,0x0E,0xE5,0x5C,0x96,0xFC,0x11,0xA3, + + 0x73,0x10,0x50,0x1B,0xBF,0xFF,0x80,0x28,0x95,0x06,0x0B,0xDD,0x06,0xB9,0xCA,0x4E, + + 0x20,0xE4,0x4B,0x3D,0xB2,0x41,0xA4,0xEB,0xEE,0x6E,0x36,0x36,0xDD,0xFA,0xAA,0xC4, + + 0x2C,0x3D,0xC8,0x7B,0xB3,0xD8,0xFF,0xBA,0x3F,0x70,0x6E,0x7C,0x7E,0x90,0x6F,0xC6, + + 0x21,0xDC,0x9F,0xDC,0xDC,0xFA,0x49,0x5E,0x61,0x58,0x5A,0x8A,0x03,0xF1,0x31,0x6A, + + 0xEF,0x9B,0x5B,0xBD,0x54,0xBC,0xA9,0x3C,0x2D,0xCD,0x40,0x1D,0xDB,0xFF,0x5E,0x34, + + 0x1C,0x06,0x92,0x04,0xEF,0xAD,0x4F,0x21,0x46,0x63,0x28,0xCB,0x2B,0x78,0xA1,0x6F, + + 0xA2,0x07,0x9A,0x30,0x17,0x52,0x1E,0x42,0xAA,0xA0,0x43,0xB2,0x57,0x22,0x28,0x42, + + 0x86,0x71,0x50,0x81,0xE2,0x40,0xD0,0x52,0x8F,0x4B,0xCA,0xA6,0xAF,0xFA,0x20,0x57, + + 0x87,0x70,0x64,0x04,0xF9,0x03,0x67,0x19,0xC7,0x30,0x8F,0xF5,0xED,0x78,0x80,0xC0, + + 0xDF,0x46,0x9A,0x7D,0x7A,0x35,0xC6,0x06,0xFD,0xE9,0x03,0xE0,0x50,0xC7,0x2C,0x18, + + 0xA2,0x9A,0x4F,0x56,0xDC,0x85,0x12,0x03,0x73,0x07,0xB0,0x16,0xA4,0x27,0x01,0xD4, + + 0x7D,0x00,0xB8,0x13,0x67,0xEA,0x40,0x26,0x5C,0x4C,0xAE,0xA7,0x73,0x99,0xFD,0x33, + + 0x0E,0xF1,0xD8,0x26,0xA3,0xA0,0x19,0x31,0xC5,0x65,0x12,0xFC,0x07,0x64,0xAB,0x77, + + 0xAB,0x0E,0x34,0xFD,0x65,0xD7,0x39,0x5B,0x78,0x47,0x01,0x4A,0xE7,0xC3,0x72,0x7A, + + 0xF2,0x00,0x47,0xF4,0x1F,0x21,0xB7,0x47,0xEA,0xE9,0xC1,0xBF,0x26,0xF1,0x2A,0xAF, + + 0x29,0x88,0xB9,0xFE,0xD7,0x6A,0x2D,0x1C,0xCE,0x39,0x00,0x2C,0xA3,0x72,0x07,0x9B, + + 0x01,0x93,0x8B,0x03,0xF5,0xDF,0x0D,0x4A,0xA1,0x27,0x40,0xBB,0xDF,0x08,0x79,0xD6, + + 0x09,0x7C,0xC0,0x12,0xFB,0x83,0xD2,0x87,0xC7,0xEA,0x75,0xCD,0x92,0xFD,0x76,0x49, + + 0x60,0xF4,0xDB,0xB6,0xFE,0x6F,0x12,0x6D,0xDF,0x7C,0x84,0x9E,0x5F,0xC0,0x1A,0x99, + + 0x2F,0x0D,0xD2,0xBD,0xE2,0x8F,0xC2,0x07,0x00,0x7F,0x73,0x7E,0xE6,0x0A,0x42,0x5B, + + 0x87,0xA4,0x8B,0x1D,0x9D,0x2D,0xFE,0x55,0x03,0x5E,0x4C,0xF9,0x93,0x90,0x56,0xD7, + + 0xCB,0x74,0xE6,0x80,0x31,0x72,0x6A,0x88,0x81,0xEF,0x02,0x20,0x72,0x99,0x1A,0xA1, + + 0xCA,0x55,0xC4,0x8C,0xC4,0xB7,0xDC,0xF0,0x61,0x85,0x70,0x30,0x7B,0x32,0x3D,0x7E, + + 0xC3,0xEA,0x3A,0x42,0x72,0x3A,0xA2,0x89,0x14,0xB3,0x55,0x25,0xBE,0x8D,0x37,0x21, + + 0x29,0xBC,0x85,0x55,0xFD,0x28,0x8B,0xAE,0xD1,0xAE,0x95,0x39,0xF7,0x71,0x3F,0x44, + + 0x24,0x82,0xD5,0x76,0x72,0x1A,0x7F,0x8E,0xB3,0xE8,0xEC,0x1A,0x74,0xAE,0x59,0x23, + + 0x17,0xC1,0x5D,0xCE,0x0F,0x81,0xCB,0x37,0xDE,0xA3,0x08,0xCA,0x51,0x80,0x85,0x45, + + 0xD8,0xC2,0x55,0xDB,0x8A,0xC2,0xE8,0xBA,0x2A,0x47,0x90,0xFB,0xD4,0x82,0xD8,0x22, + + 0xD3,0x55,0xDE,0xDA,0xCB,0xBA,0xE4,0x6F,0xE2,0x67,0x89,0xBA,0x0E,0x0B,0xA2,0xF7, + + 0x8B,0xB8,0xCC,0xEA,0x7B,0x58,0x6D,0xDB,0x04,0xD9,0x3C,0x28,0x7A,0x9A,0x6E,0xD2, + + 0x8F,0x16,0x1E,0x18,0x3B,0x54,0xDE,0x00,0x67,0xD8,0x5E,0x38,0xC2,0x71,0x11,0x8B, + + 0x67,0x97,0xDF,0x88,0xC7,0x1A,0x17,0x56,0x09,0xC9,0x68,0x2F,0x72,0x62,0x2F,0xCD, + + 0x48,0xB4,0x4F,0x39,0xD1,0x31,0x0F,0x3D,0xD7,0x25,0x1A,0x55,0xBA,0x36,0x02,0xC4, + + 0xD1,0x80,0xB8,0xF1,0xD3,0x8D,0xFD,0x86,0xBF,0xA0,0x16,0x6D,0x69,0x70,0x54,0xF6, + + 0x0A,0x3F,0x62,0x43,0x3A,0x7D,0x0E,0xE9,0x5B,0x59,0x65,0xBE,0xDA,0x80,0xFC,0x93, + + 0x43,0xE7,0x85,0x32,0x53,0xCF,0xEA,0xB6,0x22,0x4F,0xEF,0x96,0x7B,0x73,0x71,0xA4, + + 0xCA,0x68,0xEB,0x91,0x73,0x6E,0xEF,0x8B,0x00,0x4E,0xF7,0x9F,0x0F,0x3C,0x18,0x52, + + 0x84,0x8F,0xB1,0x22,0xF5,0x0F,0x52,0xA2,0x45,0x77,0xBE,0x66,0x1A,0xA2,0x9C,0x69, + + 0xA6,0x0C,0x68,0x93,0xE3,0xA9,0x2E,0x75,0x8F,0xDB,0xEE,0xCD,0x53,0xA3,0x95,0xF3, + + 0xA0,0x8D,0xB7,0xF6,0xE9,0x5D,0x0B,0xD0,0xAC,0x6F,0xF1,0x71,0xD2,0xE0,0x57,0x22, + + 0x07,0x9F,0x2B,0x68,0xB4,0xC3,0x71,0x56,0xC3,0x50,0x6D,0xB3,0xF3,0x12,0x76,0x43, + + 0xFA,0x25,0x26,0xB9,0xFF,0xB5,0x67,0xA5,0xFB,0x62,0xC8,0x98,0xFA,0xE9,0x31,0x6A, + + 0xA2,0xEB,0x62,0xD2,0x15,0x65,0x70,0x67,0xD3,0xB4,0x47,0x34,0xF6,0x48,0xF1,0xC7, + + 0xEE,0x4A,0xF7,0x25,0x90,0x24,0x62,0x0D,0x0C,0xB7,0x0E,0x19,0x57,0xEB,0x0B,0x53, + + 0xA3,0xC5,0x16,0x24,0xA7,0x06,0xDC,0x4B,0x0F,0xD6,0x6E,0xF3,0xD5,0x62,0xD2,0x68, + + 0xF3,0x25,0x7D,0x0F,0x38,0xB3,0x70,0x1A,0x6C,0x67,0x0A,0xD5,0xD1,0x15,0xE9,0xEA, + + 0xA6,0x28,0xC8,0x1A,0x1C,0xFB,0x58,0xC9,0xC1,0xC4,0xF2,0x3B,0x36,0x48,0x35,0x4C, + + 0x52,0x80,0x35,0x69,0x63,0xC6,0x93,0x58,0x6F,0x49,0xD4,0x5D,0x1E,0xEA,0x3D,0xE8, + + 0x09,0x06,0xF2,0x23,0x38,0x74,0x45,0x0E,0x61,0xC6,0xBF,0x4C,0xB5,0xE0,0xA9,0xC3, + + 0xFB,0xE0,0xDA,0x7F,0xBF,0x2D,0xE1,0x19,0x7E,0x8E,0xCC,0x56,0x22,0x43,0xFA,0xB2, + + 0x77,0x16,0xB8,0x14,0x19,0xAF,0xFA,0x95,0xC2,0x7B,0x3A,0xFE,0x35,0x52,0xA7,0xB4, + + 0xBD,0x47,0x8D,0xBC,0x1A,0x23,0x33,0xB2,0xC8,0xEC,0x53,0x1C,0xE2,0x3D,0x6B,0xB7, + + 0xD2,0xB4,0x18,0x4E,0xAF,0x02,0xC2,0xE1,0xCC,0xFF,0x93,0x1D,0x20,0xE1,0x32,0xF1, + + 0x4C,0x91,0x65,0x02,0x36,0xDD,0xF4,0x1A,0x26,0x51,0xE4,0xC4,0x3C,0x5B,0xA8,0x6D, + + 0xC4,0x2E,0x78,0xC7,0x34,0x41,0x44,0x02,0xA7,0x93,0x82,0x87,0x56,0x92,0x1D,0x13, + + 0xA2,0x01,0xFB,0xBB,0xBC,0xF0,0xA5,0x50,0x60,0x7F,0x2A,0xFB,0x74,0xA1,0xED,0x32, + + 0xB3,0x3E,0x6D,0x17,0xD1,0xF1,0x6E,0xAB,0x34,0x0E,0x7D,0x37,0x98,0xB1,0x7C,0xCF, + + 0xCF,0x6D,0x44,0xD5,0x0E,0xD0,0xC3,0xCA,0x9B,0xB8,0x43,0x43,0x97,0x6B,0x52,0xAF, + + 0xC5,0xC2,0x3C,0xB4,0xC0,0xD0,0x26,0xCB,0x1B,0xCA,0xBC,0xF0,0xF4,0xF8,0x7F,0xEC, + + 0x87,0x36,0xDB,0xFA,0xB0,0xD4,0x17,0xF3,0xE5,0xB7,0x8A,0x0A,0xEC,0xB4,0xEA,0xA1, + + 0x4C,0x26,0xD5,0x28,0x42,0xBB,0xC7,0x0D,0x84,0x66,0x02,0x35,0x56,0x28,0xE8,0xEA, + + 0x32,0x33,0xE2,0x87,0x3A,0xFB,0x1D,0x55,0x17,0xF8,0xF6,0x3B,0x7A,0xDA,0x0E,0x0A, + + 0xC4,0x38,0x94,0x5E,0x31,0x12,0x85,0xE0,0xB4,0x24,0x2D,0xD8,0x16,0xF6,0xB1,0x8B, + + 0x47,0x8B,0x30,0xC8,0xBA,0x98,0xF7,0xEB,0xEC,0x46,0xE7,0x6F,0xCC,0xE1,0xEF,0x23, + + 0xA1,0x64,0xB9,0x9E,0x8E,0x6A,0x10,0xC4,0x5A,0x46,0x3F,0x8D,0x9D,0x73,0x18,0xF6, + + 0x1D,0x7D,0xDE,0xB1,0xBF,0xB1,0x60,0xC2,0xDD,0x11,0x9E,0x8C,0x85,0xF2,0x10,0x7A, + + 0x06,0xDF,0xDC,0xAD,0x0B,0x4C,0xF9,0x0A,0x17,0x2C,0xF8,0xE7,0x7E,0x3D,0xDF,0x5B, + + 0x45,0x6F,0xD9,0xF2,0xB8,0xBC,0x08,0x2C,0x38,0xD6,0xCF,0x15,0x71,0xBC,0x55,0x28, + + 0x9F,0x84,0x91,0xD9,0x56,0x8E,0x06,0xAD,0x16,0x13,0xC1,0xC3,0xDC,0xBF,0xEC,0x24, + + 0x06,0x82,0xC0,0xB5,0x9F,0xD6,0xAF,0xBB,0xB5,0xD6,0xB6,0x42,0x10,0xCB,0x3F,0xB1, + + 0x07,0x41,0x48,0x90,0xDC,0x63,0xB6,0xB4,0x43,0xA3,0x08,0xDC,0x99,0x2C,0x13,0xFF, + + 0x70,0x01,0xBA,0x9B,0x93,0x91,0x59,0x94,0xC6,0x00,0xE9,0x2D,0x30,0x9D,0xA4,0x63, + + 0x72,0xBC,0xC9,0xA4,0x1C,0xD5,0xB5,0xAA,0x34,0xD5,0x66,0xD8,0x2E,0xEE,0x55,0x33, + + 0x66,0xA7,0xB3,0xE1,0xDA,0x07,0xF7,0x57,0x29,0xE1,0x8A,0xE4,0xF1,0x62,0x4A,0xBB, + + 0xFC,0xDE,0xF2,0xA7,0xD9,0x8E,0xF0,0xFA,0xD7,0xD1,0xA7,0x96,0xD1,0x61,0x50,0xB2, + + 0xB2,0x5B,0x23,0x56,0xB4,0xC0,0xD1,0x90,0x22,0x06,0xDD,0x1E,0x73,0xEC,0x49,0x6B, + + 0xE7,0xB2,0xAB,0x51,0x6F,0x63,0xFC,0x6A,0xA8,0x33,0x86,0x17,0xFD,0x21,0x39,0x4A, + + 0xA9,0xB5,0xB9,0x92,0x19,0x0B,0x1A,0x05,0xCA,0x54,0xED,0xA8,0x26,0xA0,0x32,0x67, + + 0x88,0x04,0x4A,0x9C,0x57,0xA8,0xE5,0xBA,0xD8,0x24,0x22,0xC3,0x66,0x49,0x2B,0x6B, + + 0x7D,0x06,0xBE,0x89,0x9A,0x22,0x29,0x4B,0xA8,0x4B,0x34,0x1C,0xEB,0xCE,0x35,0xBC, + + 0x7D,0x48,0x9B,0xE2,0x78,0xF8,0x23,0x89,0xC9,0x94,0xC4,0x24,0xDF,0x98,0xD4,0xCC, + + 0x0E,0x70,0x71,0x4B,0xCE,0xFA,0x16,0xAE,0xD8,0x4F,0xD7,0xCC,0x42,0x8C,0x5D,0x65, + + 0xE0,0xBC,0x4A,0xAD,0xC9,0x6D,0xB8,0x6B,0x6D,0xAB,0xDE,0x7E,0x5F,0x21,0x79,0xB3, + + 0x71,0xA3,0x64,0xD2,0xF1,0x98,0xB0,0x92,0x02,0x6D,0x13,0xB9,0xD2,0x28,0x75,0x61, + + 0xFD,0xA0,0x68,0x6B,0x47,0xCA,0x61,0x8A,0x01,0xE4,0xDF,0x3B,0x83,0x69,0x97,0x32, + + 0x28,0x50,0x86,0x95,0x4C,0x34,0xD4,0x21,0x22,0x5D,0x4B,0x5A,0x54,0x20,0x10,0x54, + + 0xAC,0x50,0xB2,0xA9,0xD3,0x11,0x14,0xB5,0x1E,0x71,0x25,0x73,0xEF,0x79,0xE9,0xA5, + + 0xE8,0xE3,0x01,0x8C,0x38,0x0F,0xEA,0x25,0xA9,0x12,0xB5,0xDF,0xC7,0xC2,0x37,0x62, + + 0xDD,0x15,0x09,0x68,0xB1,0x72,0x8D,0x35,0xEB,0x47,0x1E,0x31,0xF2,0x86,0xD1,0xDA, + + 0x16,0xC1,0xFA,0x74,0x58,0x83,0x0A,0xEF,0x2C,0x1A,0x8E,0x1B,0xD1,0x36,0xF3,0x9F, + + 0xB6,0xC8,0x9A,0x6E,0xD8,0x56,0x66,0x03,0xA5,0xFA,0x1C,0x9C,0x62,0x71,0x54,0xFE, + + 0x9A,0x6A,0xBB,0x75,0x5B,0x55,0x34,0x41,0x34,0xE9,0xCC,0xAA,0x72,0xA6,0xE4,0xA3, + + 0x18,0x08,0x7A,0x61,0x47,0x94,0xBB,0x00,0x29,0x47,0xD8,0x1D,0xAB,0x3A,0x2F,0xFB, + + 0x89,0xC7,0x59,0x8D,0x1C,0x23,0xD6,0x28,0x02,0xE7,0x56,0x6C,0xC2,0x70,0xE4,0x58, + + 0x40,0x1F,0x22,0x74,0x06,0x74,0xDE,0x38,0x6A,0x1B,0x5F,0xBE,0x80,0xF4,0xB3,0xEB, + + 0xAE,0x18,0x27,0xEB,0x4F,0x85,0x49,0x4B,0xEC,0xA7,0x13,0x50,0x0F,0x3B,0x21,0x2D, + + 0x08,0xE4,0xE8,0x6D,0x39,0x94,0x5F,0x2C,0x64,0xED,0xE1,0x95,0x12,0x4A,0xF1,0xF1, + + 0xDE,0x8D,0xF1,0x7C,0xC9,0x32,0x28,0x7A,0x96,0x18,0xA4,0xE8,0x76,0x3E,0xA2,0x58, + + 0xD7,0x3D,0x11,0xDC,0x4C,0xBD,0xF9,0x67,0x80,0xEB,0x76,0xF0,0xFE,0x3D,0x87,0xD9, + + 0x95,0x5F,0xAF,0x4B,0x46,0x7F,0xE4,0xEE,0x3E,0x88,0xDD,0x94,0x7D,0x5C,0xE3,0x9B, + + 0x28,0xCB,0x0F,0x04,0xCA,0x39,0x01,0x63,0xEF,0x8B,0xCF,0xF9,0xEF,0x3D,0x79,0x06, + + 0x89,0xE3,0x5B,0x82,0x16,0x38,0x0D,0xA6,0x46,0xC8,0x3A,0x69,0xA9,0x9C,0x55,0xFD, + + 0x03,0xC3,0x44,0x89,0xE4,0x77,0xDF,0x48,0x93,0xCB,0x54,0xA4,0x59,0xE9,0x8A,0xA6, + + 0x51,0x9C,0x61,0x87,0xFE,0x1D,0xF1,0xA3,0xAE,0xAC,0x1D,0x48,0x1E,0x43,0x10,0xD1, + + 0x24,0x7C,0xE1,0x92,0x93,0xE1,0x3A,0xB7,0xC3,0x8D,0x3D,0xCA,0x22,0xA2,0x73,0x39, + + 0x6C,0xF5,0xBE,0x75,0x12,0x0F,0x12,0x66,0xBA,0x80,0xD0,0x1A,0xF7,0xE7,0xF9,0xA1, + + 0x33,0xD5,0x49,0x4C,0x8B,0x11,0xDF,0xED,0x2C,0x73,0x27,0x23,0x2C,0xD2,0x1F,0x6E, + + 0x77,0x25,0xD3,0x43,0x13,0xB0,0xC2,0x64,0x12,0x10,0x4F,0x43,0xA1,0xE2,0x49,0xE9, + + 0x7B,0x36,0xB7,0x58,0xD1,0xE9,0xF9,0x82,0x15,0x87,0x39,0xAB,0x96,0x1A,0x4A,0x68, + + 0xFB,0x86,0x4A,0x8A,0x1E,0x4A,0xF2,0xAA,0x26,0xA6,0x88,0xC0,0xE9,0x84,0x51,0x5D, + + 0x0B,0x29,0x79,0xE0,0x92,0x14,0x38,0x2B,0x31,0xCD,0x7A,0xFE,0xA1,0xAB,0x1B,0xF0, + + 0x0F,0x87,0xB1,0x2F,0x63,0x27,0xD4,0x51,0x1A,0xC2,0xD5,0x1E,0xDF,0x3A,0x2C,0xDB, + + 0xC1,0x26,0x4C,0x65,0x4B,0xA3,0xAA,0x32,0x45,0x12,0xF3,0x94,0xDC,0x8B,0xD1,0x72, + + 0xF6,0xFD,0x83,0xEE,0xC8,0x13,0xD1,0x5C,0x92,0x29,0xEA,0x6A,0xD9,0x5C,0xAA,0x4B, + + 0x25,0x79,0x94,0xEA,0xF6,0x0E,0x48,0x7E,0xCA,0xDB,0xFE,0x62,0x7F,0x5D,0x50,0x67, + + 0xBD,0xEE,0xDD,0xFB,0xF6,0x59,0x2D,0x58,0xCA,0x65,0xA3,0x66,0xD2,0xED,0x7C,0x45, + + 0xFF,0x3B,0xBD,0xE1,0x74,0x0C,0xDA,0x61,0x53,0x7B,0x7E,0xFD,0x5F,0xE7,0xE4,0xD3, + + 0x20,0x9A,0xDC,0x0E,0x91,0x39,0x8F,0x38,0x67,0xB0,0xCA,0x9F,0x9F,0x61,0x4C,0xC1, + + 0x43,0x9C,0x28,0x6B,0xCA,0xF0,0x41,0x36,0x6F,0x53,0x0D,0x87,0xC0,0x9F,0xA1,0x7E, + + 0xAC,0xD3,0x85,0x14,0x17,0xB8,0xEA,0xA2,0xC0,0x5F,0xCB,0x8A,0x1F,0xA3,0x2F,0x78, + + 0x96,0x72,0xBD,0xB7,0xA3,0x6E,0x05,0x23,0x1A,0xEE,0x58,0x77,0x8B,0xB1,0x30,0xDD, + + 0x00,0x20,0xEC,0x61,0x55,0x94,0xC6,0xFD,0x8A,0x7B,0x73,0x99,0x9F,0x84,0x12,0x44, + + 0xCC,0x73,0xB4,0xB3,0xB5,0x91,0xD4,0x78,0xF3,0x41,0x00,0x72,0x28,0x0B,0xC5,0xD9, + + 0x2A,0x1B,0x9D,0x2F,0xEE,0xFB,0x43,0x12,0x06,0x96,0x59,0x75,0xE2,0xFE,0x33,0x40, + + 0xB7,0x38,0xE5,0x27,0xFA,0xB8,0xD8,0xE8,0x8C,0xA3,0xAD,0xF7,0xFB,0xB5,0x9E,0x1A, + + 0xD3,0xA5,0x59,0xC9,0x0F,0xD1,0x9A,0x35,0x6F,0x52,0xFE,0x91,0xC9,0xBA,0x13,0x1E, + + 0x2F,0x49,0xCC,0x9E,0x3C,0xD9,0x7E,0x2F,0x92,0xE4,0x2C,0x99,0xDC,0x56,0x8B,0x14, + + 0xAF,0x63,0x1F,0x10,0xAE,0xF7,0xF7,0x2B,0x81,0x98,0xB1,0x50,0x5D,0x55,0xEF,0x1A, + + 0x5C,0xF5,0x70,0x61,0x99,0xA0,0xFF,0x3B,0xB6,0x99,0x29,0x8E,0xC5,0x54,0x04,0xD4, + + 0xF8,0x68,0x52,0x3E,0x77,0xB3,0xF2,0x2C,0xFC,0xDF,0x2B,0x48,0x78,0x87,0x0D,0xDE, + + 0xD3,0xD9,0x5A,0xCE,0x9C,0xD8,0xAC,0xE9,0x99,0x7E,0xDE,0x98,0x7F,0xFD,0x80,0x38, + + 0x74,0x35,0x53,0x3F,0xB1,0xB1,0x94,0x10,0x26,0x29,0xC0,0x6B,0xC1,0x89,0xDC,0xDC, + + 0x7B,0x5A,0xB5,0x1F,0x1C,0xDA,0x59,0x40,0x8D,0x7B,0xFF,0xFF,0xFF,0xFF,0xAD,0x7F, + + 0x9D,0x5C,0x88,0x10,0xED,0x29,0x03,0xD3,0x30,0xE2,0xB8,0x46,0xA9,0x6C,0x4A,0xE3, + + 0x31,0xAC,0x48,0x94,0xBC,0x63,0x66,0x0C,0xAA,0xB0,0x27,0x76,0xF0,0x1A,0xBA,0x4F, + + 0x69,0x0B,0x05,0x3A,0xF5,0x63,0x87,0x23,0x32,0xCF,0xA9,0x5B,0x51,0x6F,0xC2,0x81, + + 0x6A,0x32,0x9F,0x43,0xA2,0xB2,0x40,0xBB,0xC7,0xE3,0xDC,0xB1,0xD3,0x88,0x02,0x26, + + 0xFD,0x68,0xCA,0x51,0xB1,0x22,0x2E,0xC0,0xB7,0x4D,0xB0,0x20,0x69,0x6B,0x5F,0xA1, + + 0x77,0xF5,0xB0,0xD6,0x31,0x47,0x98,0x45,0xEC,0x48,0xA0,0xF6,0x56,0xBE,0x7F,0xE0, + + 0x5C,0xA9,0x91,0xD4,0xF1,0x06,0xD5,0x90,0xE0,0xB9,0xB1,0x21,0xAD,0xEB,0x10,0x57, + + 0x66,0x85,0x93,0x40,0x30,0x21,0xA6,0x02,0xE1,0x29,0xDB,0x97,0x51,0x2F,0x3C,0x68, + + 0x63,0x07,0x3A,0xEC,0x43,0x2E,0xA8,0x28,0x48,0x48,0xFA,0x4E,0xA7,0x66,0x34,0xFA, + + 0x3F,0x96,0x3E,0x7E,0xA6,0x6B,0x24,0x0D,0xC4,0xEF,0xE5,0xFE,0xF8,0xF6,0x83,0x3B, + + 0xB4,0xB5,0xAD,0x4C,0x39,0xF5,0x13,0x5B,0x23,0xAB,0xAB,0xD3,0x5B,0x67,0x35,0x30, + + 0x41,0x02,0x4B,0x77,0x9F,0xA9,0x0A,0xF9,0xDE,0x50,0x37,0xB9,0x91,0xDB,0x5C,0x61, + + 0x29,0xAC,0x92,0x54,0x79,0x4C,0xB5,0x28,0x0E,0x0E,0xF2,0x0E,0x19,0x92,0xD9,0x1F, + + 0x38,0x09,0xF2,0x0C,0x13,0x22,0x22,0x0B,0x33,0x44,0xE2,0xAC,0xE4,0x62,0x1A,0xBC, + + 0x6F,0xA1,0xBB,0xCF,0x9F,0xD4,0xC5,0x8E,0x23,0x4D,0xAB,0xEF,0xB4,0x0D,0xF1,0xC6, + + 0x74,0x14,0xAB,0xFD,0x27,0x22,0x1A,0x3E,0x01,0x2C,0xE3,0x2D,0xD3,0x60,0x22,0xA9, + + 0x4C,0xBD,0x68,0x00,0x78,0x80,0xEF,0xD3,0x58,0x2F,0xC4,0xD3,0x7C,0xDB,0x1B,0xA0, + + 0x25,0xAE,0x4C,0x51,0x85,0x3B,0x47,0x8B,0x67,0x92,0xED,0x30,0x7F,0x1A,0x93,0xE1, + + 0xA1,0xBF,0x8D,0xA9,0xCF,0x12,0xCC,0xA1,0x9B,0x4F,0x0F,0x0A,0x72,0x6E,0x37,0x20, + + 0xD1,0x8C,0x19,0x11,0xB3,0xDA,0x54,0x73,0x40,0x2C,0xC4,0x99,0x54,0x85,0xF0,0xA2, + + 0x9D,0x48,0x3F,0x26,0x93,0xBE,0x6A,0x44,0xED,0xA2,0xDC,0xAC,0x32,0x7B,0xF4,0x2F, + + 0xCA,0xA4,0x06,0xA6,0x90,0x33,0xAA,0x83,0x45,0x5A,0x12,0x9E,0xD2,0x8A,0xFE,0x8F, + + 0x91,0x84,0xBA,0x27,0x30,0x7E,0x5D,0xF5,0xE4,0xB7,0x15,0x38,0xF1,0x36,0xE1,0x4E, + + 0xA2,0x67,0x45,0x19,0x10,0x31,0x6C,0xDC,0x06,0xA8,0x6E,0xC1,0xBB,0xB6,0x58,0x25, + + 0x28,0xBC,0x46,0x0C,0x76,0x7A,0x7E,0xCA,0xDF,0x56,0xD7,0xCA,0xAE,0x70,0xBF,0xB4, + + 0xD5,0xA8,0xB0,0xF9,0x19,0x34,0x67,0xD7,0x15,0xA6,0xA6,0x42,0xD5,0x74,0x16,0x31, + + 0x14,0x6B,0xC3,0x2D,0xBB,0xAA,0x2F,0x42,0x6B,0x57,0x57,0x2F,0x35,0x87,0xBC,0xA1, + + 0xAF,0x51,0x0F,0xBC,0x0C,0x90,0xA6,0x05,0x1E,0x66,0x60,0x7A,0xCA,0x78,0x56,0xD5, + + 0x3A,0x07,0x4E,0x39,0x59,0x4D,0x68,0x4C,0xE5,0xAA,0x8C,0xAC,0x0E,0xD3,0x74,0x74, + + 0x9C,0xE8,0xF6,0x0C,0xF6,0xB5,0xCE,0xCE,0x4D,0xA8,0xA0,0xFB,0x5F,0xD2,0x80,0xAF, + + 0x96,0x61,0xBF,0x4F,0x9B,0xCF,0x5F,0xEC,0x95,0xA1,0x77,0x9F,0x98,0x5A,0x1B,0xC8, + + 0x81,0x5D,0xCE,0x3F,0x1A,0xB5,0xC8,0xDD,0x69,0x57,0x7F,0x8E,0x58,0xFC,0x58,0x30, + + 0xCC,0x8F,0xB2,0x82,0x1E,0xD9,0x51,0xA6,0x47,0x83,0xF8,0x6E,0xB5,0x1F,0x95,0x4D, + + 0xD0,0xDC,0x90,0x68,0x94,0xAC,0x10,0x50,0xF0,0xCD,0xB4,0xB2,0x57,0xB9,0xF4,0xF0, + + 0xF6,0x7E,0x89,0x65,0x6D,0xAE,0x08,0x61,0x65,0xFF,0x71,0xE2,0x60,0xE8,0x82,0xFE, + + 0x87,0xD8,0x16,0x55,0x34,0xD8,0x01,0x5C,0x44,0xCE,0x79,0xB7,0x9B,0xA1,0x27,0x24, + + 0xF1,0xE8,0xEA,0x06,0xB5,0xA2,0x38,0xE7,0xBA,0x75,0xC8,0x36,0x52,0xEB,0xBC,0xA3, + + 0x21,0x7A,0xE9,0xB4,0xBB,0x2E,0x06,0xD2,0xCA,0x63,0x7C,0xF4,0x39,0x64,0xDE,0xDD, + + 0xC4,0x29,0xB1,0x56,0x37,0x2E,0xB1,0xAF,0xC7,0x1B,0x2E,0x89,0xD0,0x3C,0x37,0x6E, + + 0x78,0x0A,0x6E,0xB5,0x15,0xA4,0xA9,0xB3,0x83,0x63,0xC3,0x95,0x7B,0x6C,0x97,0x8E, + + 0x0B,0xB6,0xA0,0x8A,0x1E,0x43,0x0C,0x17,0x24,0xC5,0xF2,0xF8,0x5F,0xB8,0xBF,0x9A, + + 0x66,0x18,0x92,0xE0,0x9E,0xA4,0xC1,0x45,0x2D,0xCB,0xBD,0xCF,0x38,0xBC,0x7D,0x27, + + 0x30,0x21,0xCB,0x6D,0x63,0xA4,0xCC,0x58,0xB8,0xA9,0x8D,0x5F,0xFE,0x47,0x9E,0xEA, + + 0xF5,0x89,0xD4,0xDD,0x3C,0x34,0xC4,0x45,0xAF,0xBE,0x9B,0x37,0x34,0x62,0x1C,0x72, + + 0xE7,0x1D,0x67,0x2C,0x5D,0xA3,0x22,0xCE,0x86,0x7D,0x0D,0x8C,0xF2,0x67,0xEA,0x1B, + + 0xB1,0xCF,0xB0,0xC7,0xBC,0xAB,0x6D,0x3B,0x69,0x8F,0x05,0x9C,0xDD,0xEE,0xCF,0xD8, + + 0xFA,0x86,0x9B,0xCD,0xBC,0x8C,0xE4,0x7A,0xBE,0x6E,0x75,0x8D,0x72,0x65,0xFD,0x55, + + 0x2E,0x50,0x63,0x9A,0x3E,0x25,0xED,0xCC,0x6E,0x30,0x6B,0x0D,0x7C,0xE9,0x49,0xF1, + + 0x14,0x3B,0x3E,0xA9,0x1C,0xED,0x63,0x59,0xD5,0x43,0x0C,0x39,0x66,0xBD,0x54,0xA3, + + 0x19,0x3E,0x2C,0xB7,0x80,0x1A,0x3A,0x99,0x8C,0xE0,0x26,0x49,0xBD,0x38,0x5D,0x87, + + 0x44,0x47,0x9B,0xF7,0x94,0x7F,0x4E,0x4B,0x76,0x90,0x56,0xE7,0xF8,0x59,0xB8,0xED, + + 0xCF,0xC2,0x37,0x39,0x9D,0xEE,0x2B,0x8E,0x0E,0x22,0x22,0x88,0x90,0xB2,0x2F,0x20, + + 0xFA,0x97,0x9D,0x24,0xB4,0x57,0xB0,0x80,0x25,0x6B,0x96,0x15,0xFA,0x29,0x13,0x2C, + + 0x21,0xF5,0x94,0x54,0x32,0xBC,0x04,0x70,0x45,0xA0,0x6C,0x06,0x4D,0x24,0x5F,0x28, + + 0x15,0x09,0x31,0xA5,0xF5,0x48,0x0D,0x81,0xA5,0xA9,0x8D,0xC0,0x0B,0xF9,0x15,0x3B, + + 0xEB,0xD5,0xD7,0x35,0x1B,0xB8,0x45,0xA3,0xA7,0xD8,0x83,0xF1,0x16,0x74,0x58,0xA6, + + 0xC5,0x91,0xFF,0xA3,0x99,0xB3,0x0C,0x1B,0x18,0x77,0x11,0x87,0xA4,0xA9,0x9D,0x78, + + 0x45,0x28,0x96,0x60,0x91,0xB4,0xD9,0x9E,0x06,0x10,0x29,0x3A,0x11,0x0F,0x79,0x69, + + 0xA8,0x1F,0xF9,0x0D,0x75,0x92,0xA4,0xBA,0x80,0xDE,0x12,0x82,0x9F,0x73,0x51,0xA2, + + 0x58,0x38,0x52,0x1B,0xB7,0xA1,0xC0,0x3F,0xE3,0x0C,0x87,0x4C,0xD7,0xE0,0x60,0x56, + + 0xBB,0x41,0x86,0x8A,0x69,0x3C,0x4E,0x3A,0xD1,0xD3,0x5C,0x1D,0xF2,0xF1,0xAE,0xEF, + + 0xBB,0xC0,0x6E,0x3C,0xBD,0xF5,0xF9,0x18,0xED,0xDE,0xAC,0x5A,0x8C,0x40,0xCE,0x84, + + 0x53,0xE2,0x9F,0xE8,0x1F,0x36,0x17,0x4B,0xEC,0x55,0xE5,0xEF,0x05,0x73,0x17,0xFC, + + 0x12,0x90,0x36,0x2F,0xB7,0xB0,0xCE,0x99,0xAC,0xD0,0xE5,0xFA,0x14,0xBB,0x23,0x07, + + 0x24,0xA1,0x15,0x80,0x12,0xEC,0x02,0x47,0xAB,0x04,0x1A,0xA0,0x52,0xC3,0xA8,0x62, + + 0x63,0x1D,0x48,0x91,0x96,0x29,0x0E,0x52,0x21,0x2C,0xFD,0xB0,0x57,0xDF,0x39,0x31, + + 0x0D,0xAD,0x41,0x85,0xDE,0xDD,0x2B,0x91,0x51,0x03,0xEE,0x5A,0xD6,0x40,0x77,0x16, + + 0x20,0xDC,0x8F,0x91,0x9F,0x63,0x67,0x37,0x20,0xC0,0x1E,0x8A,0xC1,0xDE,0xE0,0x33, + + 0x6A,0xD7,0x92,0x46,0xA5,0x66,0xDB,0x02,0x4C,0x02,0xEE,0xC5,0xA6,0x67,0xFC,0x32, + + 0xFC,0xA1,0x82,0x41,0x32,0xC5,0x64,0x21,0xC1,0x41,0x1C,0x2A,0x5D,0x7B,0x3F,0x46, + + 0x23,0xD9,0x41,0xE3,0x79,0xD7,0xC1,0x41,0xE6,0x06,0x88,0x61,0x07,0x0A,0xDB,0x57, + + 0x4B,0xA6,0xF7,0x68,0x70,0x2E,0x38,0x13,0xF0,0x03,0xA4,0x86,0xFD,0xB3,0xB6,0x6A, + + 0x2C,0xD7,0xA2,0x0C,0x9A,0x34,0x3F,0x0C,0xD5,0xB5,0x02,0x32,0x30,0x9C,0x1C,0x2A, + + 0x2D,0xBF,0x35,0xFE,0x1F,0x6B,0x20,0xD3,0xFA,0x08,0xA4,0x11,0xD4,0xCF,0x5D,0xEB, + + 0xC8,0xA7,0xEE,0x73,0x3B,0x4F,0xBE,0x67,0x3D,0x16,0x01,0x5F,0x33,0x1B,0x30,0x69, + + 0x09,0x14,0x5F,0xF5,0xE5,0x69,0x42,0xBD,0x6C,0xB4,0x50,0x7D,0xDD,0x47,0xE6,0x2A, + + 0xF9,0x69,0x42,0x8A,0x3A,0xA7,0xAA,0xEA,0xCA,0x6B,0x02,0xE8,0x59,0xD1,0x71,0xE4, + + 0xE0,0xEC,0xF4,0x2F,0x67,0x22,0xA5,0x84,0x4B,0x40,0x49,0x5B,0xFA,0xC2,0x7B,0x74, + + 0x61,0x1F,0xA6,0x70,0x9C,0x24,0x6B,0x09,0x84,0x03,0x13,0xAD,0x51,0xC1,0x12,0xDF, + + 0x6E,0xF0,0x4C,0xE2,0xDB,0xC1,0x24,0x81,0xCB,0x0D,0x4C,0x3A,0x11,0x4C,0xBF,0xE2, + + 0x61,0x50,0x30,0xE6,0x4C,0xCF,0x2C,0x22,0xF1,0x3E,0xAE,0x37,0x1C,0xDF,0x34,0xF2, + + 0xDE,0x17,0x4C,0x11,0xFB,0x37,0x35,0x67,0x94,0x5E,0xFA,0x98,0x98,0x40,0x7D,0xA5, + + 0x22,0xFE,0xBE,0x07,0x21,0x4C,0xD5,0x24,0x2A,0x54,0x03,0x62,0x19,0x63,0x24,0x32, + + 0x00,0x7D,0xA4,0x46,0x10,0xCC,0xA9,0xCE,0x42,0xFE,0x87,0xB7,0x42,0xDE,0x3D,0xB3, + + 0x4E,0x9D,0x7F,0x74,0x8C,0x9B,0x2C,0x00,0x22,0xA9,0x2F,0x8B,0x99,0x30,0x15,0x11, + + 0x86,0x95,0xE1,0xBB,0x1D,0x73,0x7C,0x7E,0xC2,0xD9,0x78,0x8B,0x1B,0x31,0x65,0x4B, + + 0xA1,0xB6,0x19,0xE1,0x2B,0x8B,0x5F,0x81,0x45,0x50,0x01,0x76,0x53,0xD9,0xB5,0xA2, + + 0x9F,0x55,0x59,0x8E,0x4E,0x8B,0x17,0xEC,0xA3,0x51,0x22,0x8B,0x99,0x13,0xE1,0xAC, + + 0xA7,0x1E,0x32,0xEE,0xBA,0x24,0x89,0xD8,0x3D,0x53,0x00,0xDC,0xF8,0x6E,0x6E,0xD2, + + 0x87,0x14,0x31,0x7E,0xBB,0x25,0xDE,0x3D,0xEE,0x51,0x8B,0xAF,0x49,0x28,0x2E,0x3B, + + 0x09,0xEC,0xE8,0xD2,0x1B,0x5F,0x04,0x2D,0xEE,0x39,0x9F,0xB9,0x30,0x9B,0xEC,0xBD, + + 0x2B,0x1F,0x62,0xFF,0x46,0x5E,0x19,0x3D,0xE7,0x1B,0xC6,0xA2,0x1C,0x84,0x0D,0x71, + + 0xC3,0x2D,0xF9,0xA5,0x19,0x7C,0xFC,0x7B,0xC9,0x5A,0x16,0x2C,0xF1,0xA3,0x36,0xAB, + + 0x0A,0xB6,0x79,0xA7,0x3D,0x9D,0xD9,0xE8,0xE9,0x91,0x49,0x82,0xB1,0xAC,0x3F,0xEE, + + 0x43,0x4F,0xFB,0xB2,0xBC,0x34,0x77,0x67,0x4B,0xD4,0x63,0x8F,0x77,0xD8,0x37,0xDD, + + 0x4B,0xCA,0x30,0xBF,0x50,0xEE,0xBD,0x1B,0x69,0x5B,0x97,0x7C,0x7B,0xDF,0x7A,0x00, + + 0x96,0xC1,0xE2,0xC6,0x17,0x00,0x0E,0x42,0x98,0xCF,0x2B,0x55,0x75,0x5F,0x3A,0x13, + + 0xFE,0x0C,0xA8,0x94,0x84,0x0F,0xC0,0xC1,0x78,0xC7,0xE6,0x9A,0x39,0x4A,0xE5,0x86, + + 0xC7,0x71,0x61,0x82,0x90,0xA6,0x03,0x07,0xF7,0x23,0xEA,0x27,0xEB,0xD3,0xFD,0xE9, + + 0xA1,0x85,0x12,0xF5,0x39,0x5E,0x10,0x90,0x66,0x82,0x6C,0x33,0x29,0x22,0x1F,0x85, + + 0xEF,0x95,0xF0,0x66,0x56,0x29,0xF0,0x2D,0xC4,0xC0,0xCE,0x5A,0x9C,0xE7,0x76,0x67, + + 0x95,0x8D,0x23,0x69,0x40,0x7E,0xF8,0xA9,0x74,0x81,0x7A,0x0D,0xDA,0x63,0x06,0xB3, + + 0x06,0x99,0xB8,0x40,0x31,0x04,0xBD,0x01,0x3D,0x84,0xB9,0x37,0xF4,0x87,0x6B,0xBB, + + 0xC8,0x83,0xE9,0x6C,0xB6,0x3C,0xC6,0x95,0x45,0xC3,0x79,0xB7,0xCF,0xE6,0x8C,0x45, + + 0xAD,0x77,0xDA,0xE6,0x68,0xE5,0xF2,0xAA,0x59,0x8A,0x01,0x1F,0x5A,0x50,0xBA,0xF8, + + 0xA1,0x02,0xEA,0x8B,0xE2,0xAF,0x13,0x48,0xEC,0x38,0x04,0x1A,0xD0,0x64,0x43,0x41, + + 0x6A,0x87,0x63,0x8A,0x84,0xE8,0x73,0xBE,0x33,0xCC,0x12,0x5C,0xB0,0xE9,0xAC,0xF9, + + 0x0F,0xA3,0x4B,0x47,0x3C,0x34,0xC4,0xB9,0x5C,0xA6,0xDD,0x17,0x36,0xFA,0x27,0x0D, + + 0xEF,0x7A,0xE2,0xCA,0x1A,0xD0,0x94,0x08,0x0D,0x3C,0x66,0x52,0xA7,0x82,0x91,0x1D, + + 0xE6,0x9C,0x51,0xFB,0xE8,0x50,0x5A,0xE0,0xEE,0xDD,0x3A,0xBE,0xE4,0xE5,0x9C,0x39, + + 0x4C,0x8E,0x5C,0x7E,0x3F,0x51,0x2A,0x6C,0x69,0xC8,0x91,0x62,0xDD,0xFF,0x8C,0x25, + + 0xEE,0x8B,0xF9,0xDF,0x74,0x24,0x83,0x1D,0x30,0x45,0x2B,0xFB,0xDC,0x52,0x3B,0xE0, + + 0xE5,0x1A,0x9C,0x04,0xA5,0x4E,0x14,0xA2,0xE6,0xCC,0x18,0xD5,0x40,0x06,0x54,0xB6, + + 0x16,0xB5,0xD4,0x14,0xA4,0x8F,0x83,0x50,0x63,0xD3,0xA9,0x3C,0x76,0xD8,0xA2,0x01, + + 0x86,0xE0,0x0A,0x65,0x18,0x4F,0x5B,0xDD,0x47,0xB7,0xEF,0xA5,0x47,0x5B,0x95,0x6C, + + 0x04,0x62,0x95,0x68,0x19,0xBE,0x97,0x37,0xE7,0x31,0x83,0xD7,0x95,0x0C,0x1C,0xF3, + + 0x42,0x3B,0x50,0xA4,0xDD,0x45,0x91,0x80,0xA7,0x5E,0x34,0x26,0xCD,0xFC,0x12,0xE3, + + 0x6F,0xE4,0x47,0x91,0x39,0x69,0x9A,0x10,0xE5,0xD1,0xDC,0xE7,0xCA,0x44,0xF7,0xBD, + + 0xCC,0x37,0x56,0xFB,0x85,0xD6,0xF2,0xF3,0x64,0x1A,0x74,0x88,0x8E,0x49,0x59,0x59, + + 0x83,0x4C,0x29,0x1D,0x0C,0x18,0x98,0x91,0xA4,0x27,0x82,0x94,0xF4,0x0B,0x5E,0xAE, + + 0x8D,0x47,0xC6,0xC4,0x95,0x44,0xC9,0xA2,0x6A,0x5A,0x49,0xDC,0x1E,0x07,0x67,0xAB, + + 0x8C,0x38,0xF0,0xEB,0x7D,0x34,0xFA,0xBE,0xED,0xD9,0x41,0xC0,0x53,0x26,0x93,0xE9, + + 0x53,0x37,0xDF,0xA8,0x41,0xB5,0x7F,0x6B,0xA4,0x98,0x4C,0xD0,0x94,0xF7,0x17,0xBF, + + 0xC5,0x96,0x50,0xE0,0xBB,0x39,0x5F,0xF1,0x76,0xDF,0x81,0x8B,0x81,0x54,0xCD,0x37, + + 0xE6,0xE7,0xB2,0xD0,0x1C,0xD0,0x74,0x68,0xAB,0xCA,0xC9,0xB1,0x5A,0xE7,0xA1,0x50, + + 0xAA,0xBC,0x90,0x7F,0xD6,0x6C,0x25,0xFA,0x50,0xFD,0x33,0x43,0xDE,0x22,0x66,0xB9, + + 0x55,0xDC,0xD9,0xF2,0x74,0x9D,0x0F,0x99,0x11,0x23,0x93,0x7B,0x1B,0xBC,0xC7,0xFB, + + 0x2D,0x9B,0x89,0x7F,0x54,0xBC,0x6D,0x7C,0x54,0x42,0x4B,0x9D,0x00,0xBE,0xA3,0x29, + + 0xDC,0x51,0x27,0xA0,0xC4,0x03,0x42,0xDF,0xAB,0xB1,0x03,0xD7,0xD4,0xED,0xC0,0x76, + + 0xEA,0x62,0xB2,0xE7,0x3F,0x8C,0x0B,0x43,0x3D,0xE7,0x27,0xD6,0x19,0x02,0x3E,0x61, + + 0xD4,0x19,0xA6,0xA5,0x40,0xD3,0xBD,0x52,0xE2,0xE4,0xC3,0x6A,0x3B,0x06,0x08,0x77, + + 0x6A,0x80,0x5D,0x52,0x5B,0x73,0x8C,0xF1,0x85,0xE7,0xB9,0x6A,0x30,0xCC,0x3E,0x31, + + 0x80,0x18,0x3F,0x2A,0x14,0x26,0x70,0x86,0x71,0xA5,0xC8,0x94,0x2D,0x6B,0x70,0xD2, + + 0x92,0x23,0x71,0xD0,0x19,0xB3,0x3A,0x30,0x42,0x25,0xB8,0x30,0x5C,0x68,0xFD,0x23, + + 0x7D,0x63,0x31,0xB4,0x31,0xA6,0xE9,0x92,0xD1,0x28,0x65,0x95,0x2D,0x69,0xE6,0xB3, + + 0x2F,0xFA,0x09,0xD5,0xDD,0xD8,0x07,0xB9,0xC2,0xCA,0xD3,0x74,0x70,0x61,0x62,0x0A, + + 0x17,0x0C,0xCA,0xBD,0xF1,0x6B,0x87,0x15,0x80,0xD9,0x46,0xC4,0x5E,0x25,0x74,0xBD, + + 0x19,0x44,0x88,0xF3,0x7A,0x0E,0x7C,0x00,0xA2,0x4A,0x7D,0xFC,0x0D,0x2B,0x00,0xE1, + + 0xD5,0x47,0xC9,0x0C,0x67,0xD7,0x43,0x6E,0x21,0x49,0x6C,0x5E,0xF6,0x06,0x75,0xA9, + + 0x0B,0x0F,0x9D,0xB8,0x9F,0x31,0x25,0x04,0x03,0x3A,0xD2,0x3D,0xDF,0x71,0x3A,0xCA, + + 0x93,0x61,0x7B,0xC8,0x18,0x24,0xAB,0x06,0xC7,0xEA,0xDE,0x6B,0xFB,0xE4,0x2A,0x12, + + 0x85,0xF1,0xB2,0x4C,0xAE,0xA8,0xCD,0x90,0x27,0x00,0x1E,0x1E,0x1A,0x2D,0x7B,0xB6, + + 0x26,0x03,0x03,0xCD,0x6C,0x85,0x1A,0x29,0xCE,0x67,0x93,0x8F,0x58,0x66,0x33,0x7E, + + 0x76,0x00,0xD9,0x79,0x9D,0x0D,0x24,0xEB,0xCA,0x47,0xA3,0x1F,0x9A,0xEF,0xC0,0x05, + + 0x63,0x30,0xD4,0x9E,0x4C,0x90,0x3C,0xC2,0x9D,0x5C,0x9C,0xBC,0x8D,0x79,0x19,0xAD, + + 0xE9,0x40,0xF2,0x24,0xDA,0x92,0xCC,0x34,0x13,0x17,0xFC,0xFE,0x9B,0x7E,0x1A,0xE1, + + 0xB4,0xB6,0x51,0x87,0x71,0xBF,0x2D,0x9F,0xCA,0xA7,0x90,0xD7,0x1B,0xDB,0x5D,0x79, + + 0x8A,0x17,0x56,0xDA,0xCE,0x18,0x75,0xD3,0x1E,0x5D,0x62,0x91,0xF7,0xE0,0x17,0xCA, + + 0x24,0x87,0xA8,0x64,0x66,0x16,0x6A,0xC8,0xED,0xA2,0x9C,0x2C,0xF7,0x56,0x8C,0x94, + + 0x0E,0x1D,0xBE,0xD1,0x3F,0x5B,0xAC,0x92,0x9C,0x28,0x58,0x70,0x2C,0x37,0x46,0x43, + + 0x3B,0x7B,0xA5,0x9A,0x11,0x3B,0x1D,0xFD,0x60,0x4A,0x45,0x96,0xEA,0x7D,0x4B,0xA3, + + 0x48,0xBE,0xED,0xD4,0x3E,0x3F,0xF1,0x6E,0xE0,0xD7,0x1D,0x2C,0x0A,0x3B,0x07,0x9B, + + 0x10,0xE9,0x5B,0xB4,0x43,0xC7,0x2E,0x56,0x6E,0xD8,0x1C,0xEC,0x7C,0x50,0x91,0xFE, + + 0xC2,0x3A,0x8D,0x2C,0xD8,0x96,0xDF,0x5E,0x4B,0xC9,0x1E,0xBE,0x15,0x7F,0x21,0xA5, + + 0x8A,0x01,0x47,0x50,0x2A,0x39,0xCA,0x8D,0x09,0x41,0x98,0xDE,0x91,0x71,0x0E,0xFF, + + 0x42,0x58,0x5B,0x75,0xBF,0x76,0x1C,0x3B,0x2C,0x68,0xB6,0xDA,0x58,0xA4,0xB9,0xEC, + + 0x62,0xBD,0x46,0xAD,0xB1,0x70,0xF7,0xC1,0xEA,0xDE,0x52,0xC8,0x9B,0xD3,0xDE,0x27, + + 0x8A,0x82,0xD6,0xB1,0x19,0x0D,0x1C,0x07,0xD6,0x31,0xCB,0x0F,0x4F,0x02,0x67,0x92, + + 0xD5,0x3E,0x44,0x25,0x32,0xF3,0x37,0xA3,0x4C,0x53,0x41,0x1E,0xCA,0xD1,0xFB,0xBB, + + 0x50,0x5D,0x0B,0x7D,0xBB,0x3D,0xB8,0x39,0xF3,0x1D,0x70,0x92,0x26,0x3D,0x6B,0x60, + + 0xF7,0x0C,0x36,0x69,0xB7,0x0D,0x4E,0x1F,0xC9,0x6D,0x33,0xD5,0xD8,0x1D,0x38,0x20, + + 0xCD,0x8E,0xDC,0x92,0x06,0x40,0xE8,0x41,0x6F,0x67,0x81,0x12,0x66,0x7A,0x6B,0x1E, + + 0xEF,0x8D,0x75,0x36,0x80,0x23,0xE1,0xB0,0xB4,0x6D,0xC9,0x36,0xFA,0xE6,0xBC,0xE0, + + 0xF5,0x1E,0x14,0xF5,0x69,0xE0,0xAC,0xC0,0xEF,0x16,0x01,0xD7,0xD1,0x1C,0x5A,0xB1, + + 0x6E,0x9F,0x07,0xC2,0x14,0x46,0xB0,0x0C,0xB9,0x1F,0x88,0x04,0x17,0xE5,0x7E,0x15, + + 0xD9,0x8F,0xA7,0xD2,0x15,0x72,0xF8,0x3D,0xBF,0xDF,0x80,0xF4,0x52,0xC1,0xF7,0x25, + + 0x79,0x2B,0x1E,0x29,0x90,0xA4,0x71,0x9B,0xC6,0x84,0x89,0x05,0x97,0xEE,0x7C,0x20, + + 0xEF,0xC5,0x68,0x16,0x1D,0xBC,0xB9,0x77,0x1C,0x33,0xC1,0x27,0xDF,0xE8,0x68,0x17, + + 0x67,0x87,0x11,0xAF,0xE4,0xAB,0xA5,0x15,0x6E,0x8A,0x22,0xAC,0xCD,0x4F,0x3D,0xE9, + + 0x79,0x8F,0x6A,0x0F,0x4B,0x5D,0x8D,0x8A,0xBE,0x76,0xF7,0xDE,0x49,0xAB,0x33,0x39, + + 0x44,0x85,0x90,0x32,0xAF,0x8A,0x60,0xAD,0x38,0xA9,0x8B,0xCF,0x88,0x47,0x0B,0x42, + + 0x2C,0xE9,0x7B,0x01,0xB7,0x1F,0xFB,0x3E,0x6E,0x16,0xE8,0x02,0x52,0x1D,0x31,0xB6, + + 0x08,0x1F,0x74,0x3D,0x0D,0xE3,0x63,0x68,0x4A,0x98,0x92,0x2A,0xDE,0xE1,0xAA,0x1E, + + 0x22,0x87,0xF6,0x9D,0x2C,0x7F,0x42,0x1A,0x37,0x8F,0x39,0x5E,0x05,0x2D,0x60,0xC9, + + 0x1F,0xE3,0x73,0x6F,0x92,0xEE,0x62,0xE9,0x5F,0x7A,0xF9,0x6D,0x7D,0xA0,0x2B,0x28, + + 0xE7,0xCD,0x53,0x3F,0x9B,0x86,0xBF,0xA5,0x6E,0x30,0xC1,0x84,0x20,0xAD,0x88,0xF1, + + 0x02,0x36,0x5B,0xF5,0x1A,0xDC,0x0C,0xE5,0xA6,0x72,0x00,0xC4,0xF6,0xEC,0x78,0x01, + + 0x5D,0x3E,0xE5,0x96,0xB8,0x37,0xC4,0x12,0x67,0xAB,0x7C,0x0E,0x72,0xF9,0xB6,0x70, + + 0x82,0x3F,0x42,0x47,0xB1,0xF0,0x3D,0xA6,0x87,0xF2,0xD1,0x23,0xF1,0xC8,0x79,0xD4, + + 0x4C,0x90,0xEB,0x57,0xFD,0xF1,0xFD,0x6F,0x1F,0x2E,0x7D,0x35,0x6C,0x9E,0xAF,0x4B, + + 0x02,0x6B,0x0C,0xCA,0x05,0xD6,0xB0,0x3C,0x8F,0xE5,0x7A,0x59,0x8B,0x9A,0x13,0x56, + + 0x70,0xA7,0x94,0x3E,0x7D,0xF8,0x42,0xDA,0x61,0xD7,0xC6,0x05,0x1F,0x5A,0x5D,0x39, + + 0x0A,0x9B,0x5D,0x45,0x94,0x86,0x0D,0xED,0xDE,0xA6,0x97,0xE2,0xF7,0x16,0xC1,0xAD, + + 0x65,0xF7,0x8D,0x77,0xEB,0xB8,0x75,0x77,0xE5,0x35,0x6F,0xF5,0xB8,0xB5,0x40,0x2E, + + 0xC5,0x69,0xEF,0x92,0xBC,0xFA,0x20,0xC8,0x04,0xD5,0x8E,0x50,0xD0,0xF5,0x10,0x3E, + + 0x4D,0x66,0xE6,0x1E,0xC9,0x1A,0x04,0x0A,0x7E,0x76,0x36,0x77,0x7B,0x6A,0x41,0x2A, + + 0xAD,0x0A,0x18,0xC8,0x7E,0xCB,0x25,0xCB,0x07,0x9E,0xD7,0xE5,0x72,0xB8,0x51,0x3B, + + 0x44,0xB8,0xA9,0x2E,0xDE,0x5F,0x9B,0x3F,0xA5,0xC2,0x77,0x7F,0xD5,0x76,0xF6,0xB8, + + 0x91,0xC3,0x0E,0xCA,0xBB,0xDC,0x89,0x1B,0xCD,0x5C,0xBE,0xD1,0xC3,0xBE,0x10,0xDD, + + 0xCE,0x92,0x6A,0x3C,0xBD,0xF5,0xBE,0x7A,0xDD,0x70,0xE8,0xD9,0xDE,0x52,0xDE,0x4F, + + 0xA4,0xA8,0x87,0x8B,0xF9,0x35,0xCE,0xD9,0x8E,0xDF,0xF1,0x10,0x5F,0x51,0xDB,0x39, + + 0xBB,0xC8,0x26,0x3D,0x3D,0xF7,0x6E,0x7F,0xED,0x0F,0x6D,0xB8,0x35,0xAE,0x3E,0x29, + + 0x61,0x04,0x2D,0x20,0x7B,0x2F,0x81,0xA4,0x5D,0xBE,0xF6,0x22,0xB9,0x04,0x28,0x9A, + + 0x02,0xC1,0xC0,0x90,0x13,0x82,0x8A,0xC3,0x2D,0xEE,0x82,0x36,0xC3,0x69,0x78,0x72, + + 0xE8,0x8B,0x01,0x7A,0x96,0x20,0x2B,0xD2,0xA8,0xED,0x8B,0x27,0x63,0xBF,0x2F,0x20, + + 0xB9,0xA7,0xF6,0x6A,0x97,0x21,0x08,0xCC,0xA9,0xF8,0x19,0xF2,0xF5,0x0F,0xC0,0x3B, + + 0xE2,0x85,0xF5,0xC0,0x5F,0xB5,0x09,0x1C,0xE7,0xE2,0xEB,0x7F,0xF1,0x26,0x88,0xD0, + + 0xF5,0x48,0x95,0x15,0x15,0xC4,0x78,0x83,0xE0,0x57,0x30,0x4A,0x79,0x90,0x48,0xC5, + + 0x80,0xFA,0x1C,0x44,0xA5,0x5A,0x03,0x12,0xEC,0xCF,0x55,0x0D,0x8E,0x62,0x4B,0xB7, + + 0xA7,0xB8,0x77,0xD1,0x9F,0xFC,0xE1,0x01,0x43,0xE1,0x09,0x4E,0xF2,0xFC,0x90,0x24, + + 0xE1,0xA9,0x8A,0x88,0x12,0x68,0x84,0xAC,0x15,0x3A,0x02,0x5F,0x1F,0xE1,0x74,0x29, + + 0xE2,0xC8,0x33,0x86,0xF2,0x4A,0x8B,0x4B,0x21,0xEF,0x09,0x5A,0xA6,0x05,0x53,0x7E, + + 0xC0,0x87,0x2F,0x96,0x73,0xA9,0xBF,0x5A,0xAC,0xEC,0x13,0xCD,0xB7,0x71,0xE7,0x6A, + + 0xED,0x8D,0xD5,0xFF,0x9D,0xD6,0x0E,0xF9,0xC6,0x27,0xF9,0x7D,0xD8,0xEB,0x7A,0xB6, + + 0xA6,0x01,0xBD,0x8B,0xE7,0x9A,0x2A,0x4C,0xA3,0x45,0xD2,0x7F,0x38,0x3F,0xA6,0x27, + + 0xC9,0x0D,0xCF,0xD8,0x77,0xC0,0xF6,0xE7,0x6F,0xE0,0x0E,0xF8,0x02,0x39,0xBC,0xCD, + + 0xDD,0x3C,0x78,0xDE,0x39,0x26,0x11,0x96,0x23,0xED,0x8D,0xC0,0xD2,0x1B,0xF0,0xCB, + + 0x8F,0x4E,0x70,0x42,0x38,0x6D,0x8A,0x49,0xC3,0xE0,0xFB,0xFC,0xE4,0x67,0x22,0xB1, + + 0x4C,0xB4,0xC0,0x80,0xBD,0x86,0x1C,0x5B,0x1F,0x4C,0x8C,0x3C,0x76,0x12,0xBB,0xFF, + + 0x27,0xB1,0xF2,0x21,0xCC,0x73,0x7D,0x32,0xFC,0x87,0xFC,0xFE,0xBF,0x33,0x97,0xA9, + + 0xA6,0x18,0xFB,0x2D,0x05,0xA4,0xCE,0x22,0xE6,0xA8,0x90,0x21,0xF2,0xD1,0xF2,0xE2, + + 0xC9,0x1C,0xCD,0x4C,0xB7,0x31,0x25,0xA1,0x42,0x58,0x17,0xA8,0xF2,0xA3,0x5E,0xC2, + + 0x91,0xB9,0x90,0xCB,0x14,0x32,0x44,0x13,0xE6,0xD9,0x2F,0x14,0xE8,0xA5,0xDC,0x20, + + 0xD0,0xB4,0x82,0x27,0x0D,0x91,0xB1,0xC0,0x62,0xFA,0xA3,0x94,0x0B,0x19,0x91,0xB1, + + 0x22,0x00,0x68,0x0A,0x13,0x3D,0x07,0xCA,0xE4,0xB7,0x15,0x25,0x1B,0x7B,0x9C,0x22, + + 0x27,0x9C,0xD5,0x6D,0x0F,0x34,0xFD,0x83,0x81,0x62,0xBF,0xE5,0xF0,0xF7,0xB2,0xFB, + + 0x4C,0x17,0xD0,0x77,0xC5,0x7A,0x94,0x2A,0xF5,0xEE,0x56,0x2C,0xBD,0x3A,0x56,0x9E, + + 0x1A,0x42,0x48,0xDB,0xE3,0xC6,0xB3,0x23,0xC8,0xDE,0x7B,0x38,0x3C,0x89,0x82,0xE6, + + 0xC9,0xCA,0x47,0xC7,0xBE,0x38,0x2F,0xB9,0x4B,0x5C,0xD7,0x1C,0x7A,0x66,0x31,0xAC, + + 0x0E,0x0B,0x34,0x07,0x24,0xC6,0x1B,0xA0,0x45,0x56,0x97,0x1D,0x7B,0x67,0xB1,0x79, + + 0x10,0xB3,0x77,0xF1,0x41,0x2A,0x96,0xBD,0x1A,0xF1,0x8D,0xEC,0xFA,0xFC,0xE2,0xAB, + + 0x1D,0xEB,0xA3,0xAE,0xC4,0xC0,0x66,0x02,0xC7,0x50,0xE5,0x79,0x75,0x1F,0xE3,0xED, + + 0x84,0xC1,0x9C,0xC2,0xBC,0x74,0xDE,0x6D,0x86,0x8A,0xE8,0xDD,0x09,0xE1,0x31,0x75, + + 0x42,0x2C,0x63,0x4E,0x9A,0x35,0xF3,0x66,0x1A,0x89,0x95,0x60,0x00,0x7C,0xDF,0x71, + + 0x6C,0x09,0x60,0x86,0x64,0x1F,0x0A,0xB1,0x74,0x3F,0xEA,0x67,0xF3,0xA1,0xAA,0xE3, + + 0x6D,0x71,0x68,0x97,0x11,0xCD,0x94,0x4D,0x8F,0x90,0x98,0xCF,0xAA,0x1A,0x01,0x91, + + 0x58,0x8A,0x1E,0x83,0x96,0x18,0x0B,0xB0,0xA8,0x1D,0x0E,0xC7,0x92,0x99,0x77,0x27, + + 0x7A,0xED,0xCE,0xE4,0xF3,0xFE,0x82,0xA0,0xFD,0xC9,0xB2,0xCB,0x53,0xA1,0x5E,0xEE, + + 0x6E,0x89,0x64,0xF0,0x5E,0xFC,0x23,0x10,0x62,0x11,0xCA,0x9D,0xAA,0xA7,0x93,0xA2, + + 0x05,0x74,0x6F,0x16,0xD7,0xE4,0x78,0x76,0x43,0xB9,0x99,0xF4,0xCA,0x9B,0x9E,0x30, + + 0xBC,0xE5,0xDF,0x0B,0x1B,0x20,0xA7,0x5C,0xF4,0x5D,0x42,0xC6,0xD0,0x1C,0x17,0x55, + + 0xE4,0xF0,0x97,0x50,0x36,0x38,0x43,0x80,0xD2,0x63,0xC1,0xE7,0x74,0x4A,0x1C,0x3E, + + 0xC6,0x99,0xC1,0xFD,0x76,0x55,0x3E,0x0A,0x00,0xC6,0x7D,0xA4,0x63,0xEC,0x53,0x69, + + 0x65,0x00,0xEA,0xAF,0xE6,0x54,0xD6,0xA8,0x50,0xC1,0x61,0xBD,0x5B,0x13,0x1D,0x3E, + + 0xED,0x8E,0x63,0x8F,0x9D,0xE8,0x53,0x64,0xEF,0xC7,0xEC,0xD0,0xA3,0xF2,0x0B,0x91, + + 0x8C,0x4B,0x6B,0x9B,0x12,0xE9,0x38,0x49,0x6E,0xB0,0xDA,0xD7,0xA9,0xA6,0xB1,0xB9, + + 0x82,0x81,0x56,0x2C,0xE5,0xEE,0xFB,0x27,0x6C,0x0C,0xEA,0x81,0x69,0xEC,0x52,0xA9, + + 0x6D,0xE3,0xFD,0x41,0x6B,0x39,0xF7,0x89,0x52,0x60,0x25,0xF4,0x28,0x99,0xF3,0xB8, + + 0xA0,0xEB,0xAF,0x9B,0xBA,0x7A,0xF1,0x9B,0xCF,0x6F,0xC4,0x53,0x2E,0x5F,0x0D,0x62, + + 0x66,0x1E,0x7C,0x44,0xBD,0xFB,0xF6,0x4A,0x6E,0x4E,0x7B,0xAB,0x61,0x62,0x1A,0xAA, + + 0x83,0x8B,0x09,0x68,0xC4,0x13,0x46,0x57,0x74,0xD6,0x52,0xC4,0x83,0x95,0x2D,0xE1, + + 0x11,0xDE,0x1B,0x3E,0x33,0xF1,0x44,0xB0,0x35,0x2A,0x04,0x4D,0x1E,0xFE,0x7C,0xF0, + + 0x9C,0xDD,0x92,0x33,0x40,0x51,0x1C,0xB9,0x87,0xF2,0x8D,0x58,0xC7,0x23,0xBD,0x7B, + + 0x23,0x5E,0x00,0x89,0x39,0x47,0x3D,0x4F,0xE3,0x93,0x3D,0x85,0x95,0x6B,0x87,0x31, + + 0x1C,0xD5,0xF5,0xD5,0x14,0xF0,0x3C,0xEE,0x8F,0x8C,0xE4,0x62,0x36,0x6B,0xD3,0xE3, + + 0x11,0x3A,0x94,0xD2,0xCA,0xF7,0x04,0xD5,0x9A,0xDA,0x43,0xB1,0xAD,0xFD,0xD2,0xA3, + + 0xD1,0x96,0xC3,0xFA,0x3A,0x1D,0xB5,0xD6,0x32,0x0B,0xCA,0x87,0xFE,0x44,0xBC,0xAD, + + 0xCD,0xA4,0xEB,0x28,0x16,0x28,0x43,0xBE,0x8F,0xDA,0x78,0x88,0x78,0x61,0x78,0xA3, + + 0x2C,0x37,0x06,0xD4,0x89,0x24,0xEC,0xEE,0x8D,0xDE,0x76,0x2B,0x20,0xBA,0x16,0xFA, + + 0x69,0x94,0x7A,0xA1,0x5F,0xFB,0x5E,0xF5,0xB7,0xD6,0x5B,0xDC,0x8A,0x9C,0xB6,0x09, + + 0x2C,0x5D,0x88,0xE0,0x65,0x6F,0x1E,0xB1,0x4F,0x57,0xF7,0x11,0x7E,0xE6,0x71,0xB2, + + 0xAD,0x34,0x2F,0xD0,0x32,0x46,0x8B,0x59,0xEB,0xC2,0x87,0x40,0x96,0xF4,0x18,0x63, + + 0x0A,0x31,0x52,0xAC,0xC5,0x18,0x64,0x8A,0x85,0x98,0xBE,0xFA,0xFE,0xEC,0x3D,0xA9, + + 0x15,0x1E,0x4A,0x2F,0x9C,0xFD,0xE8,0x35,0x0F,0xD9,0x7D,0x40,0x3F,0x51,0xB6,0xFB, + + 0x51,0x31,0x37,0xC9,0x76,0x9D,0x4D,0x5B,0x56,0x9C,0x48,0x96,0xDF,0x7E,0x90,0x28, + + 0x91,0xDE,0x50,0x5B,0xF7,0x40,0x01,0xFD,0x0E,0x5C,0x50,0x81,0x22,0xBE,0x59,0x06, + + 0xA5,0x7F,0xD2,0x2A,0xFB,0x44,0x92,0x52,0x73,0x34,0x50,0xFC,0x05,0x6A,0xB0,0x3D, + + 0x13,0x4C,0x8C,0x9E,0x35,0xAC,0xC3,0x1E,0x3E,0x07,0x0A,0xD2,0x75,0x95,0xD8,0x01, + + 0xB3,0x39,0xDB,0x04,0x33,0xD2,0xE9,0x29,0x67,0x03,0x97,0xCD,0xAB,0xCF,0xD8,0x56, + + 0xE0,0x07,0xF7,0x38,0x7A,0xB2,0x27,0xED,0x7E,0x18,0x15,0x2E,0x90,0xCE,0x5A,0xDF, + + 0x69,0x0B,0xE0,0xE1,0xEC,0xFB,0x0A,0x61,0xE1,0x05,0xB0,0x66,0x2B,0x69,0xB7,0x74, + + 0xDF,0x14,0xDB,0xA8,0x57,0xA8,0x10,0xCD,0xCE,0x07,0x34,0xE6,0x5F,0x6D,0xC0,0x53, + + 0xEA,0xCE,0xC3,0xB9,0xDA,0x22,0x91,0xA1,0xC2,0x04,0xFB,0xB5,0x8E,0x99,0x73,0xA2, + + 0xB7,0x01,0xB6,0xA5,0x09,0x96,0x5F,0x68,0xC0,0xE6,0x59,0x88,0xDF,0x97,0x60,0x0A, + + 0x0B,0x68,0xFC,0x3D,0xF1,0x89,0x12,0x5A,0xB3,0x0A,0x98,0xA8,0x56,0x22,0x0A,0xE1, + + 0x49,0xF5,0xC1,0x6F,0x69,0x88,0xA5,0x7F,0x83,0x93,0xA4,0x79,0x5F,0x6B,0xAB,0x28, + + 0xAC,0x91,0x2F,0x9E,0xCF,0x20,0x5E,0x17,0x29,0xB5,0x53,0xAD,0x96,0x95,0xB6,0x46, + + 0x5C,0x56,0xB3,0xE2,0x70,0x5A,0x53,0x41,0x34,0x09,0x93,0xB9,0xDB,0xC8,0x4A,0x00, + + 0xEB,0x03,0x02,0x8C,0xF3,0x21,0x32,0x3E,0x67,0x41,0x55,0xEE,0x78,0x1E,0x4B,0xA3, + + 0x78,0x01,0x75,0xC6,0xA4,0xB0,0x63,0x3A,0xEA,0x0F,0x58,0xFE,0xC6,0x94,0x83,0x84, + + 0xA6,0x75,0xB8,0x2D,0x8C,0x42,0x2A,0x4E,0x66,0x2B,0x6C,0x8F,0xE9,0x95,0xB4,0xA5, + + 0x59,0x4D,0x27,0xC2,0x9A,0x4F,0x13,0x79,0x48,0x42,0xE3,0x83,0x38,0x66,0x66,0x82, + + 0x23,0x52,0x11,0xC3,0x03,0x29,0xB0,0x50,0x68,0x5F,0x8E,0xD7,0x39,0xF6,0x55,0x8A, + + 0x84,0xE0,0x1A,0x10,0x62,0xA9,0x64,0xB4,0x81,0xD0,0x58,0x92,0x8C,0x6A,0x5C,0x82, + + 0x05,0xED,0x3D,0x16,0x80,0x9F,0xAA,0xC1,0xFE,0xF9,0x95,0xE5,0xB6,0x30,0xF5,0xF7, + + 0x2E,0x95,0xC5,0x8D,0x58,0xD2,0x9E,0x35,0xB2,0x3B,0x1D,0xEB,0x7C,0x11,0x64,0x3E, + + 0xA0,0x1E,0x9E,0xC5,0x95,0x75,0x3C,0x82,0xD1,0x38,0x8D,0x19,0x97,0x80,0x2C,0x90, + + 0xCD,0x98,0x33,0x24,0x3B,0x29,0xB0,0x74,0x2B,0xE5,0x1C,0xC1,0xCB,0x78,0x27,0xB2, + + 0x92,0x19,0x7E,0xA5,0x96,0xB4,0xEA,0x65,0xE1,0xA4,0xAD,0xF7,0x1B,0x79,0x35,0x53, + + 0xA2,0x60,0x72,0x9F,0xA3,0x33,0x15,0x69,0xD0,0x12,0xA6,0xD2,0x52,0xC8,0xC5,0xC8, + + 0x4A,0x54,0x7E,0x84,0xD1,0x29,0xD6,0x70,0x27,0x50,0x3D,0x29,0xEB,0x47,0xA5,0xC7, + + 0x94,0xE5,0x98,0x7A,0xB6,0x22,0x60,0xBE,0x88,0xDA,0x25,0x0D,0x30,0xD6,0x13,0xAD, + + 0x7D,0x47,0x7F,0x65,0xC3,0x97,0x10,0x59,0x62,0xAB,0x81,0xF9,0x13,0xB2,0x54,0x99, + + 0xD2,0x5B,0x91,0xFB,0x73,0x6A,0xAE,0x4A,0x65,0xD0,0x91,0x83,0xB0,0x8E,0x3E,0x4A, + + 0x2B,0x7E,0x46,0x8B,0x14,0x22,0x96,0x28,0x4C,0x5A,0x62,0x8E,0x8D,0x19,0x76,0x08, + + 0xD5,0x12,0x97,0xD2,0x9E,0x36,0xEA,0x9A,0x90,0x38,0xD4,0x78,0x33,0xCB,0x7F,0x19, + + 0x75,0x11,0xBC,0x25,0x3A,0x71,0xFD,0x8C,0x4B,0xC1,0xEF,0x12,0x78,0x3D,0x2F,0x98, + + 0x27,0x12,0x8F,0x35,0x3B,0x72,0x67,0x07,0x47,0x52,0x5F,0x20,0xF2,0x64,0x8B,0x86, + + 0x08,0xC3,0x74,0xF8,0xE9,0x21,0x7B,0x9B,0xE5,0x5F,0x70,0xA2,0x7D,0xA2,0xCF,0x6C, + + 0x64,0x85,0x5D,0xE8,0xED,0xA8,0xD8,0x44,0xFA,0xAF,0x34,0xB2,0x57,0x5B,0xCD,0xEB, + + 0xBB,0xCF,0xE1,0xF8,0x61,0x21,0x85,0x41,0x3F,0xD9,0xF1,0x96,0x2F,0x4F,0x57,0xF1, + + 0x97,0xCE,0xF2,0x17,0xAA,0x42,0x06,0xBC,0xA6,0xC7,0x79,0xB6,0xD1,0x8F,0x64,0x23, + + 0x7D,0x94,0xDB,0xD9,0xA9,0xBF,0x09,0x25,0xBB,0xB2,0x35,0x8E,0x48,0xA9,0xB3,0x10, + + 0x01,0x7D,0x04,0xCC,0x14,0x05,0x31,0x9E,0x43,0x87,0x80,0x64,0xA8,0x48,0x3A,0x43, + + 0xF9,0x86,0x45,0x21,0x65,0xDB,0x8E,0x1D,0x50,0xBD,0x8E,0x14,0xF7,0x52,0x30,0x2C, + + 0xD2,0x8E,0xD6,0x47,0x60,0xA3,0x31,0x46,0x4A,0x85,0xE1,0x6C,0x74,0x63,0x38,0x08, + + 0xC6,0x87,0xFC,0xBA,0x24,0xEA,0x4B,0x50,0x2D,0xCC,0xD5,0xD5,0xE9,0x7E,0x92,0x27, + + 0x1F,0xC4,0xBC,0x26,0xF6,0x38,0xDA,0x07,0xA6,0x8D,0x19,0x6F,0x81,0x21,0x6B,0x17, + + 0xBF,0xB1,0x69,0xF6,0x75,0xA3,0x52,0x6B,0xCF,0x41,0xC8,0xAB,0xD7,0x20,0xF8,0x5C, + + 0xEC,0x8F,0x91,0xAE,0xA1,0x04,0x01,0x8B,0x79,0x64,0x17,0x4C,0x98,0x6D,0x26,0x5B, + + 0x3A,0x21,0xE0,0x57,0xE4,0x2C,0x74,0x73,0x4D,0xEC,0xCC,0x8C,0x7F,0xCC,0x62,0x89, + + 0x8D,0xA5,0xE8,0x1E,0x07,0xC5,0x43,0x38,0xEE,0xD6,0xD8,0x96,0x20,0x22,0xF2,0x0C, + + 0x4C,0xEE,0x8A,0x31,0x11,0x28,0xE3,0xEF,0xCD,0x3D,0x74,0x11,0x02,0xE1,0xD5,0xAB, + + 0x7C,0x80,0xA6,0x5B,0xAC,0xAB,0xCB,0xFF,0xCC,0x8F,0xA2,0xF2,0x7A,0x10,0xE4,0x87, + + 0x02,0x8B,0x9A,0xAF,0x32,0x2A,0x30,0x40,0x8D,0x0A,0x3E,0x5E,0x74,0x4B,0x94,0x69, + + 0xA8,0x8A,0xB9,0x70,0x25,0x1C,0xDF,0x72,0x37,0x7A,0x1F,0xE7,0xA9,0x39,0x7C,0xE5, + + 0x57,0x82,0xAE,0xC7,0xA0,0x1F,0x77,0x5D,0x19,0xBE,0x34,0x23,0xF0,0x4C,0xF0,0xF5, + + 0x7F,0x2C,0x3C,0x71,0x7D,0x12,0x45,0xB7,0x18,0x56,0xE7,0xBA,0x9D,0x9B,0x2E,0x35, + + 0x85,0x19,0xBD,0xC8,0x91,0x39,0xD8,0x66,0x65,0x26,0x50,0x90,0x8D,0x0F,0xEB,0x50, + + 0x24,0x13,0x7C,0xA4,0x04,0xE1,0x74,0xEF,0x8E,0x1F,0x3C,0x23,0x11,0xEE,0x9A,0x32, + + 0x6A,0xB6,0x85,0x8D,0x1C,0xB9,0x99,0x67,0xAE,0x66,0xF1,0x63,0xF5,0xEC,0x55,0x61, + + 0x58,0x38,0x15,0xF3,0xB1,0x56,0x91,0x61,0xEF,0xDD,0xBC,0x91,0x9C,0xF8,0x67,0xEC, + + 0xFE,0x07,0x34,0x9F,0x54,0xBC,0x24,0x2E,0x6A,0x42,0x76,0x2F,0xB1,0x07,0x34,0x98, + + 0x9E,0x04,0x51,0xD9,0x0E,0xA0,0x36,0xA3,0x0E,0xBF,0x7E,0x3A,0x32,0xBB,0x8B,0xF0, + + 0x72,0x47,0xC0,0x67,0x3A,0x77,0xBB,0x2F,0xBF,0x30,0xED,0x6F,0x94,0x72,0x35,0x99, + + 0x3F,0x91,0x17,0x00,0xDE,0xBF,0xA8,0x48,0x69,0x56,0x71,0x0C,0x70,0x70,0xA6,0x1B, + + 0x2F,0x9A,0x07,0xAC,0xBC,0xBF,0xF4,0x02,0x29,0x91,0x21,0xDC,0x81,0x29,0x16,0x58, + + 0x2C,0x1B,0x2E,0xEB,0xED,0xB0,0xEE,0xBD,0x4B,0x2A,0x9E,0xBE,0x91,0x76,0x2F,0x58, + + 0x47,0xAF,0xE2,0x2D,0x8D,0xC5,0x05,0xEA,0xEA,0xB0,0x8F,0x6B,0xA5,0x1A,0x17,0x59, + + 0xAE,0x87,0x8F,0x7F,0xE3,0xB0,0x80,0xEB,0x0E,0x00,0xFB,0x1D,0xCC,0xAD,0xB8,0x52, + + 0x2E,0x63,0xE2,0x1D,0x13,0x60,0x28,0xDF,0x4E,0x22,0xAE,0x84,0x92,0x60,0xF5,0x2B, + + 0x20,0xFA,0x64,0x86,0x11,0x2B,0x90,0xFD,0xE2,0xBC,0x34,0x10,0xDE,0x63,0x4B,0x43, + + 0xC1,0x01,0x87,0xA5,0x79,0x21,0xD5,0xF1,0xCC,0x44,0xD9,0x21,0x5F,0x23,0x0D,0x95, + + 0xDE,0x44,0x8E,0x66,0xBB,0xA5,0x53,0x24,0x43,0x40,0x2E,0x34,0x5C,0x6F,0xFF,0xA2, + + 0x69,0x15,0x52,0xB7,0x7E,0x8B,0xD0,0xA7,0x66,0xDF,0x32,0x7B,0x9C,0xCF,0xB7,0x23, + + 0x33,0x69,0x5E,0xD0,0x4E,0x57,0x60,0x9E,0xEF,0x48,0x58,0x06,0xB8,0xB3,0x45,0xA9, + + 0xEE,0x4B,0xD0,0xB8,0xFA,0x9D,0x51,0xE3,0x0B,0x6E,0xB7,0x61,0xB9,0xE0,0xAE,0x91, + + 0xC6,0xAA,0xD9,0x40,0x6A,0xAA,0xA4,0x8E,0x16,0x1A,0xA7,0xEA,0xB8,0xD1,0x38,0xFB, + + 0x51,0x7D,0x02,0x4C,0x00,0x85,0x51,0xCA,0xCA,0x00,0xFA,0x32,0x32,0x9C,0xCA,0xC5, + + 0xFF,0x4B,0x82,0x18,0x96,0x68,0x7A,0x3A,0x38,0x44,0xCB,0x4F,0x67,0xC2,0x1B,0xF2, + + 0xF7,0x2A,0x53,0xCA,0x5A,0x6A,0x5F,0xD9,0xC4,0x45,0x41,0x37,0xB6,0xDE,0x58,0xC5, + + 0xBA,0x69,0x8D,0x20,0x19,0x4E,0xE4,0x6B,0xC7,0x29,0xE3,0x39,0x39,0xCA,0x53,0xCC, + + 0x08,0x04,0xA2,0x03,0x39,0x23,0xF9,0xEC,0x4E,0xF2,0xD3,0x9F,0x88,0xC3,0x74,0x70, + + 0x0D,0x0F,0x10,0x18,0x3F,0xD9,0x62,0xE7,0xC9,0x81,0xEC,0x70,0xB0,0xE8,0x83,0xC9, + + 0xC4,0xF1,0x3C,0xB1,0x9C,0x6C,0xFF,0xEB,0x0F,0x5D,0x61,0x9E,0x36,0xC5,0x04,0xDD, + + 0x89,0xAC,0x5E,0x46,0xEB,0x6D,0x8D,0x1B,0x1D,0x47,0x73,0xF7,0x22,0xB3,0xB0,0x70, + + 0x00,0x1F,0xF6,0x85,0x14,0x2B,0x4A,0x9D,0x68,0x4B,0xA2,0xAC,0x9B,0xF5,0x08,0x72, + + 0xA6,0x61,0x4D,0x9C,0x94,0x5F,0xE3,0xC3,0x1D,0x3D,0xCD,0x27,0x4F,0xDE,0x65,0x21, + + 0xAC,0x99,0x10,0xE3,0x52,0x12,0x83,0xC7,0x80,0xED,0x3D,0x2F,0x7D,0xDF,0xE5,0xAE, + + 0x85,0x51,0xEF,0x91,0xB2,0x51,0xFA,0x71,0xEA,0xD8,0xBA,0xC6,0x9F,0xF5,0x3C,0xB3, + + 0x12,0x56,0xCC,0xAF,0x4D,0x14,0x0C,0xE8,0x51,0xA4,0x29,0xE6,0x32,0x21,0x49,0x52, + + 0xEA,0x12,0x4A,0x50,0xFB,0x44,0xA4,0xD4,0x9E,0xDC,0x61,0xAB,0xA6,0x28,0x05,0x18, + + 0xA4,0x94,0x05,0x04,0x5E,0x37,0xEA,0x07,0xD1,0xE6,0x26,0xCA,0x0C,0x8A,0xE2,0x33, + + 0x0F,0xEA,0x19,0xC6,0xC3,0xB4,0xDD,0x11,0xFE,0x1B,0x76,0x37,0x70,0x31,0x55,0x54, + + 0x1B,0x68,0xB8,0x2D,0xFA,0x3C,0x93,0x99,0x14,0x1A,0x96,0x5F,0xA8,0xD3,0xF1,0x1C, + + 0x7A,0x17,0xC6,0x95,0xB4,0xC4,0xDA,0xCC,0x92,0x1B,0xCE,0x22,0x82,0x65,0xBF,0x77, + + 0xB8,0x57,0xB9,0x2D,0x7A,0x3A,0x53,0xFE,0x17,0x18,0x32,0xA8,0x7F,0x6C,0x56,0x1C, + + 0x0C,0xE4,0xED,0x4C,0x4C,0xBD,0xD0,0xB7,0xEF,0x39,0x22,0xF7,0x1D,0xFC,0x3E,0xD9, + + 0x1A,0x18,0x1B,0x86,0x41,0x25,0xD0,0x00,0x36,0xA1,0x61,0xC8,0x57,0x15,0xED,0xBA, + + 0x68,0xED,0x55,0x1A,0x77,0x7C,0x64,0x0B,0x77,0x5B,0x00,0x09,0x14,0x96,0x37,0xED, + + 0x28,0x1A,0x18,0x85,0xBC,0xC6,0xAF,0x01,0xB2,0x11,0x4B,0x9C,0x93,0xD7,0x5D,0xCD, + + 0x54,0xE2,0xE9,0xF0,0x95,0x9B,0xF2,0x36,0x88,0x1F,0xC0,0x84,0x82,0xC6,0x98,0x80, + + 0x26,0xB0,0x0C,0x22,0xC8,0x51,0xF4,0xF2,0x4C,0xC6,0x62,0xD9,0xBD,0xEF,0xD3,0x1A, + + 0xA0,0x7E,0xE8,0xA7,0x13,0xE3,0x12,0xB7,0x06,0xA1,0x1F,0xA1,0xB4,0x4E,0x59,0xEB, + + 0x98,0xCF,0x61,0x87,0x81,0xE0,0xB9,0xFB,0x67,0x3F,0xE7,0x96,0x3F,0x24,0xE9,0xCB, + + 0x06,0xCF,0xFA,0xE8,0x93,0x79,0x8D,0xD1,0x47,0xC7,0xDF,0xC6,0x17,0xA3,0x1F,0xC6, + + 0x7E,0xD9,0x28,0x03,0xF7,0x0B,0x32,0x10,0xFD,0xDB,0xCB,0x38,0x65,0x24,0x16,0x54, + + 0xE6,0x06,0x28,0x4B,0xEA,0xA3,0x83,0xF6,0x45,0x61,0x53,0xBC,0xEC,0x4A,0x3B,0x4F, + + 0xEE,0x97,0x64,0xC3,0xC9,0x8E,0xC6,0x4B,0x35,0x79,0x5D,0xC2,0x03,0x85,0x40,0xA0, + + 0x0B,0x7A,0x46,0xB5,0x36,0x20,0xB9,0xF7,0x79,0xAB,0xDE,0x69,0x07,0x4C,0x93,0x88, + + 0x2E,0x38,0xE7,0x10,0x3E,0x5C,0x6F,0x48,0x0F,0x28,0x94,0x9F,0x8A,0x4C,0xE5,0xE2, + + 0x8F,0x8A,0x6A,0x9F,0x05,0xEB,0xAA,0x48,0xA6,0xCA,0xE4,0xA4,0x59,0x46,0x79,0x0A, + + 0x2F,0xC8,0xF7,0x8B,0x9E,0x6B,0x53,0x6F,0xE9,0xC5,0x61,0xB0,0x37,0x5C,0x6A,0xEB, + + 0x35,0x84,0x60,0x96,0x74,0x5A,0x45,0x9A,0x26,0x88,0x09,0xCC,0x31,0x40,0x1A,0x39, + + 0x3E,0xCE,0x66,0x4B,0x91,0xA8,0xB2,0x7B,0x16,0xC6,0x57,0x6A,0xD9,0xFA,0x6F,0xD8, + + 0xC6,0x58,0x2A,0x83,0xC0,0x00,0xEA,0x92,0x13,0x80,0x8C,0x2F,0xBD,0xE6,0x23,0x0B, + + 0x88,0x0C,0xE7,0x08,0x9F,0xFE,0xF3,0xAC,0xEA,0xA2,0xA3,0xF1,0x25,0x43,0xC4,0xB9, + + 0x23,0x72,0x6E,0x98,0x5D,0xFF,0xE4,0x1B,0xD0,0x32,0x79,0x8F,0x0E,0xB0,0x44,0x22, + + 0x3C,0x9F,0xA4,0x46,0x5C,0xDE,0xAE,0x5C,0x07,0xA0,0xB5,0x90,0x9E,0xE5,0x2F,0xF4, + + 0xA7,0x92,0x40,0x04,0x31,0xBB,0x92,0x49,0xEA,0x07,0x0E,0x8D,0x0A,0xF1,0x7C,0x12, + + 0x86,0x02,0x35,0x6F,0x88,0xFF,0x23,0x9E,0xE2,0xF0,0x64,0x91,0x04,0xE2,0xAA,0x71, + + 0x27,0x90,0xE8,0x9F,0x10,0x34,0x35,0xA3,0xAD,0xF0,0xD5,0x75,0x73,0x06,0xBB,0xC2, + + 0xD1,0x2F,0xF7,0x76,0x09,0xA9,0x0C,0xC2,0x62,0x64,0xEB,0x03,0x59,0xAF,0xC0,0x50, + + 0xEE,0xDD,0x2C,0x8B,0x42,0xF9,0xFB,0x8D,0x8E,0xA5,0x66,0xB6,0x10,0x26,0xE7,0x32, + + 0x96,0x56,0xBA,0xED,0xC9,0xA2,0xB5,0x3E,0x39,0x94,0x6F,0x93,0x93,0x3F,0x55,0x4C, + + 0x25,0x3B,0x6B,0xF3,0x80,0x91,0x91,0x61,0xF3,0xDF,0x36,0xF1,0x7F,0x93,0x21,0xF8, + + 0x8F,0x9C,0xA2,0x1E,0xB3,0x45,0x16,0xBF,0x95,0xB4,0x26,0x2A,0x7A,0x05,0x7E,0x83, + + 0x4E,0xB9,0xAE,0x5E,0x21,0xD5,0xEE,0xC5,0xE2,0x5F,0x7E,0xEF,0xFF,0x55,0x26,0xF4, + + 0x0B,0x9C,0xC5,0x8D,0x49,0x3C,0xD4,0x6B,0xE8,0x7A,0xD7,0xFC,0x08,0xB8,0x57,0x19, + + 0x2D,0xE2,0x91,0x3E,0x7F,0x11,0xBB,0xFB,0xA1,0x26,0xCF,0xE0,0x5E,0x9E,0x6A,0xA8, + + 0xF8,0x94,0xBD,0x4D,0x49,0x9A,0x0E,0x02,0x74,0x91,0xD4,0x93,0x7E,0xFC,0x56,0x45, + + 0xAD,0x51,0x02,0x5E,0xC3,0x9D,0x86,0x7E,0x72,0x23,0x01,0x01,0x80,0x02,0x64,0x49, + + 0x6B,0x8D,0x27,0x9A,0xD0,0xFF,0x2F,0x62,0x4B,0x5E,0xF7,0xEF,0x01,0x01,0xB9,0xB9, + + 0x79,0x95,0x43,0x9D,0x3C,0x6B,0x45,0x08,0x87,0x70,0xFF,0xFF,0xFF,0xFF,0x59,0x92, + + 0xA5,0x9F,0xE6,0xA0,0x34,0xBC,0x68,0xA2,0x45,0x79,0xC0,0xDA,0x5C,0xCB,0xB0,0xEE, + + 0x11,0x4C,0xF0,0x96,0x8C,0x48,0x90,0xF5,0xE0,0xCB,0x58,0xC5,0xEE,0xC3,0x00,0x67, + + 0x7B,0x12,0x3E,0x5F,0x96,0xB8,0x69,0x06,0x63,0x44,0x6C,0x35,0xBB,0x1D,0xF6,0x35, + + 0xEA,0x0C,0x36,0xF7,0x4C,0xBE,0xE2,0xD3,0x60,0xC9,0xC7,0xDA,0x85,0x60,0xE0,0x36, + + 0x69,0x0B,0x72,0x5B,0xFE,0x8B,0x6D,0x90,0x46,0x4B,0x8E,0xFF,0x42,0xCB,0xDA,0x60, + + 0xA0,0xAA,0x60,0xDE,0xDB,0x56,0x65,0x80,0x4B,0x4A,0x77,0x0F,0x8E,0xB1,0xC6,0x73, + + 0xB1,0xED,0xF7,0xB4,0x72,0x66,0x71,0x75,0xC4,0x35,0xB2,0x3B,0x23,0xBA,0x5C,0xF1, + + 0xD3,0x57,0xEA,0x46,0xE1,0x93,0xDA,0x30,0xDA,0x06,0x6B,0x6A,0x3F,0xCC,0x82,0x7B, + + 0x64,0x8D,0x2D,0xAC,0x48,0xD8,0x6D,0xCA,0x95,0x95,0xEB,0xD7,0x33,0x17,0x34,0xFA, + + 0x6B,0x7C,0x75,0xBC,0x59,0xC9,0x7A,0x78,0x67,0xC2,0xC4,0xD3,0x7B,0x6A,0x11,0x89, + + 0x63,0x4E,0xDA,0x94,0x3D,0xBB,0xBC,0xAD,0xC7,0x97,0xD0,0xDC,0x67,0x0A,0x75,0x1E, + + 0xAD,0x7D,0x20,0x67,0x4C,0xB4,0x1F,0xDB,0x4B,0x43,0xE2,0xC6,0x2D,0xB4,0x1B,0xD1, + + 0xAF,0xF3,0x9C,0x43,0x16,0x62,0x68,0x80,0x82,0x03,0xE4,0x68,0x31,0xE9,0x34,0x71, + + 0x30,0x2D,0x15,0x5C,0x98,0x23,0x03,0x1C,0xEC,0x5D,0xF9,0x73,0x83,0xC6,0xEF,0x3A, + + 0xB2,0xF8,0xA2,0xED,0x4C,0x91,0x2D,0x58,0x21,0x8F,0x53,0x2B,0x48,0x3A,0x76,0x1E, + + 0x41,0x3E,0x2B,0x62,0xBF,0x41,0xA3,0x86,0xCD,0x45,0x7E,0x79,0x5C,0x79,0xAE,0xE5, + + 0x81,0x0F,0x44,0xE4,0x30,0x3A,0x2C,0x5F,0x53,0x14,0x8C,0xB0,0x1B,0xC1,0x34,0x7E, + + 0x8D,0x1C,0xAC,0x6D,0x90,0x30,0x7B,0x40,0xE1,0x4E,0x45,0x9B,0x4E,0x73,0xB1,0xE3, + + 0x1B,0x77,0x05,0xC3,0xA2,0x34,0xAD,0x5A,0x6D,0xAF,0x95,0xB6,0xD1,0xA3,0xF0,0xB5, + + 0x48,0x1A,0xB3,0x84,0xCE,0x73,0xA6,0xC1,0x61,0x45,0xBB,0x8C,0x93,0xD7,0x7F,0x3E, + + 0x06,0x0F,0x6F,0x9B,0x8F,0xC8,0x72,0x9F,0xC5,0x50,0x7E,0x51,0x41,0xBD,0xB7,0xAE, + + 0xAE,0xE3,0x92,0xE7,0xB3,0x9E,0xE4,0x6B,0x71,0x18,0x5C,0x33,0x57,0x19,0x85,0xA7, + + 0x5D,0x9B,0x66,0xF3,0x6E,0xD3,0xD2,0xA6,0xD1,0x3F,0x15,0x64,0x2D,0x7E,0x05,0x90, + + 0x83,0xF7,0xFF,0xC5,0x36,0x21,0x3E,0x31,0xAB,0xCA,0x4D,0x86,0xC3,0x7C,0x14,0x76, + + 0xD7,0xB5,0x46,0xE4,0x38,0x78,0x86,0x56,0x95,0xF9,0x05,0x1D,0x07,0x6E,0xA5,0xE3, + + 0xFC,0xE4,0x39,0x9D,0xB4,0x35,0xE5,0xCB,0x0A,0xA8,0x59,0x40,0xC5,0x82,0x91,0xCE, + + 0x76,0x5B,0x48,0xC3,0x37,0x38,0x2F,0x56,0x1D,0x39,0x4C,0xA2,0xFE,0x10,0x4D,0xF9, + + 0xAB,0x9B,0xE7,0x83,0x4E,0xCF,0x61,0xBF,0x00,0x30,0xDF,0x92,0x8D,0x2E,0xC5,0xB7, + + 0x6A,0x70,0xE0,0x7C,0xEA,0x98,0xAE,0xE0,0x93,0x13,0x13,0x68,0x78,0x11,0xF5,0x9F, + + 0x2D,0x8E,0x4C,0x1A,0xA9,0x3E,0xCE,0x3F,0x69,0xA8,0x0A,0xAD,0x78,0x3D,0x83,0x4D, + + 0xD8,0x0F,0x91,0xD6,0xD1,0x4A,0xD0,0x56,0xBE,0x92,0xED,0x1E,0x8E,0x3C,0x8A,0x99, + + 0xF5,0x1C,0x2C,0x26,0xC4,0x3F,0x5B,0xBE,0x6A,0x51,0x73,0xD9,0x79,0xD3,0xDF,0x7C, + + 0x92,0xFB,0x0F,0x78,0xC9,0xBB,0x84,0x50,0xE7,0x3B,0x07,0xD9,0xD7,0xEE,0x17,0x99, + + 0xFE,0x1C,0xF8,0x1F,0xB6,0xBA,0x58,0x72,0xE9,0x4A,0x07,0x6C,0x77,0xD1,0x32,0xEF, + + 0x8C,0x5D,0x65,0x7D,0x33,0xA4,0xE4,0xA7,0xB8,0xFD,0x51,0x18,0xF0,0x7E,0x48,0xE9, + + 0x64,0xBC,0xEF,0x68,0x32,0xA5,0x3D,0xD1,0xE1,0x67,0xB0,0x97,0xD5,0x4B,0x28,0xCA, + + 0xDB,0xB9,0xA0,0x79,0x1E,0xC8,0xC7,0x1D,0x40,0x64,0xA0,0xF8,0xAD,0x1F,0xC4,0x2D, + + 0xCD,0x14,0x4F,0xC1,0x7C,0x03,0x40,0x89,0xC8,0x63,0x4F,0x52,0x8B,0xF4,0xCE,0xC7, + + 0x91,0x8E,0xC9,0x85,0x42,0x60,0x8E,0x01,0x35,0xA3,0xF1,0xA5,0x55,0xA0,0xD2,0xC0, + + 0xBB,0x8D,0x69,0xA6,0x55,0xE7,0xEB,0x09,0x0D,0x66,0xC7,0x5F,0xB6,0xC7,0x5B,0x2E, + + 0xA9,0xF7,0xF2,0x13,0xBF,0xB3,0x68,0x2C,0x84,0xA3,0xD2,0x61,0x71,0xE5,0x92,0xF4, + + 0x1D,0xC4,0x12,0xE1,0x1B,0x33,0xAA,0x54,0x4B,0x69,0xE9,0xA4,0x95,0xE6,0x22,0x6D, + + 0x37,0x9A,0x26,0x69,0x6B,0xBA,0x97,0xDA,0x6F,0x8A,0xCC,0x4F,0xAA,0xA8,0x86,0xF1, + + 0xA9,0x8D,0xC3,0x9B,0xAD,0xAB,0xC4,0x59,0x3A,0xAE,0xAC,0xCC,0xA9,0x76,0xE0,0x54, + + 0x32,0x78,0x4D,0x35,0xC3,0x07,0x7A,0xEF,0x7D,0x85,0xAA,0xE3,0x58,0xEE,0x4A,0x3C, + + 0xE6,0xDC,0xB4,0xC5,0x03,0x20,0x44,0x4E,0xE8,0x59,0x3A,0xDB,0x16,0xE7,0x70,0x40, + + 0xBA,0xBE,0x00,0x4F,0x42,0x58,0x4D,0x5A,0x69,0xDE,0x4F,0x9E,0xAA,0xCE,0x10,0x28, + + 0xB3,0x70,0x95,0xC5,0x4A,0xF2,0x6D,0x60,0xAB,0xD4,0x7B,0x38,0xFB,0xE9,0x7C,0xDA, + + 0xA6,0x98,0x5B,0x77,0x8B,0x83,0xE7,0x51,0xE8,0xDD,0xA3,0x5F,0x38,0xB2,0x24,0xB5, + + 0x86,0x6A,0x51,0x86,0x5E,0xCE,0x6E,0xE4,0x8E,0xB5,0x63,0x36,0xC9,0x20,0xF1,0xF1, + + 0x07,0x94,0xF5,0x79,0xB8,0x19,0xA5,0x50,0x60,0x5F,0xF8,0x78,0x83,0x87,0xAE,0x91, + + 0xC3,0x95,0x6D,0x66,0x0A,0x11,0xAD,0xDC,0x1A,0xB0,0x0C,0x8E,0x8E,0xE5,0xE2,0xF2, + + 0xDB,0x14,0x8C,0x04,0xB0,0x41,0xD7,0x74,0xBA,0x32,0xF8,0x0E,0x07,0xB6,0x91,0x15, + + 0x21,0x06,0xE8,0x91,0xB6,0xBB,0x1E,0xF6,0xB2,0x48,0x10,0xD2,0xFA,0xB4,0xA5,0x7B, + + 0xC6,0x4B,0x75,0x00,0xB4,0x43,0x4F,0x10,0x2C,0x7D,0xB1,0x38,0xF7,0xB6,0xA8,0x93, + + 0xFB,0x6A,0x52,0xE7,0xB3,0x18,0xD6,0xAC,0x1E,0x2B,0x51,0xD3,0x2E,0x0A,0xAE,0x4F, + + 0x8D,0x12,0xF8,0x61,0x6C,0xBB,0x50,0xC8,0x9B,0x65,0xED,0xA1,0x7A,0x92,0xF2,0x6A, + + 0x25,0x96,0x6F,0x84,0xCA,0x0D,0xAE,0x7D,0x84,0x28,0xBA,0x4E,0x82,0x56,0xC8,0x69, + + 0x2E,0xD2,0xDE,0x74,0xD7,0xC5,0xA0,0x54,0x0D,0x09,0xA9,0x8B,0x97,0xAB,0x4F,0xDF, + + 0xDC,0x16,0x50,0x6E,0x02,0x88,0x59,0x1E,0x04,0x0A,0x2A,0x4C,0x8D,0xE0,0x38,0x28, + + 0x22,0x19,0x00,0xBC,0x48,0x13,0xD5,0x74,0xB2,0x2A,0xD9,0x95,0x3D,0x9C,0xD3,0x5E, + + 0x5D,0xEF,0xB0,0x4C,0x7F,0x30,0xFE,0xA4,0xDA,0x01,0x01,0x7C,0x7A,0xF9,0xA7,0x73, + + 0xCE,0xF2,0x05,0x3E,0x74,0xFE,0x09,0x70,0x85,0x48,0xA9,0x0D,0xFC,0x7B,0x67,0xD3, + + 0xA9,0xEC,0x91,0x41,0x54,0x49,0xD0,0x94,0x32,0x0B,0xC7,0x11,0x53,0xF2,0x4A,0x5F, + + 0xBF,0x5D,0x29,0x7A,0x85,0x8D,0xF5,0xCF,0xA1,0x16,0xE8,0x00,0xDF,0x62,0x87,0xEF, + + 0x83,0x49,0x48,0x10,0xCA,0xDC,0x22,0xBA,0xF2,0xDC,0xF0,0x2A,0x97,0x95,0x0F,0xE3, + + 0x77,0x7F,0x99,0xFE,0xE3,0x22,0xE8,0x53,0x5A,0x7D,0x26,0x24,0x5D,0x6E,0x29,0x6F, + + 0x22,0x66,0x65,0x86,0xCA,0x2B,0x49,0x46,0x8F,0x04,0x7F,0x47,0x3A,0xC5,0xD0,0xC2, + + 0x82,0x87,0xF8,0x34,0x59,0x2F,0x54,0x27,0xC3,0x4A,0x83,0x98,0x54,0x17,0xC8,0x17, + + 0x27,0xFE,0x0C,0x90,0x15,0x27,0x62,0x83,0x89,0xEE,0xE0,0x8A,0xFF,0x68,0x79,0x31, + + 0x36,0x0F,0xD4,0x36,0x97,0x64,0xF2,0xF7,0x1E,0xA0,0xED,0xE7,0x43,0x50,0x48,0xCC, + + 0xE0,0x14,0x0F,0xAA,0x7A,0x0F,0x3B,0x75,0x28,0x82,0x26,0x0E,0xD5,0xF4,0xBD,0xEA, + + 0xF1,0x6A,0x80,0x13,0x43,0x2C,0x7C,0xAC,0x0B,0xDD,0xCC,0xBE,0x5C,0xFC,0x82,0x75, + + 0xAA,0x0F,0xC1,0xDC,0x1D,0xDD,0xB6,0xB7,0xF6,0xC4,0xFD,0x34,0xB2,0xFF,0xC7,0xD9, + + 0xF6,0x0C,0x82,0x72,0x15,0x8C,0xD3,0x39,0xF7,0xC7,0x70,0x36,0x06,0xC1,0x2B,0x0A, + + 0x28,0xF4,0xC0,0x6E,0xB8,0x94,0xFA,0xD7,0x28,0x7D,0x30,0x53,0x0C,0x97,0xD5,0xBB, + + 0x8E,0x81,0x02,0xCC,0x1B,0x6E,0x2C,0x5F,0x21,0xE9,0xF3,0xE8,0x64,0x41,0x72,0xA6, + + 0x68,0x0E,0xD6,0xD8,0x19,0x8E,0x3B,0x62,0x9B,0xF9,0xA5,0x5B,0xFA,0x6B,0x11,0x4B, + + 0x61,0x6A,0x83,0xFC,0x9C,0x6C,0x52,0x9A,0x2A,0x02,0xB3,0x27,0x10,0x63,0xDC,0xAA, + + 0x0F,0x82,0xB4,0x2E,0x92,0x6D,0x7C,0x88,0x57,0x5D,0xF5,0x43,0x02,0x60,0xC4,0x50, + + 0x96,0x13,0xBE,0x77,0x0C,0x72,0x12,0x48,0x53,0x9D,0x23,0x80,0xFF,0x72,0xD3,0x87, + + 0x12,0x43,0xF3,0x6C,0xB0,0xCE,0xC5,0xC7,0x52,0x4A,0xF4,0xAA,0xB7,0x85,0x06,0xBC, + + 0xD7,0x6E,0x48,0xA0,0x8F,0x33,0x35,0xA9,0x6D,0x69,0x22,0xA4,0x7D,0x7E,0xB5,0xE1, + + 0xA9,0x92,0x56,0x97,0xB7,0x13,0xFF,0x21,0x29,0x03,0x7B,0xC7,0x1A,0xD5,0xD4,0x6C, + + 0x11,0x10,0xFE,0x26,0x9E,0x3B,0x7C,0x22,0xB6,0x92,0xEB,0x7B,0x85,0xA9,0x51,0xB6, + + 0x00,0x95,0xAC,0x90,0x74,0x3A,0x3A,0x01,0xA1,0x15,0xFC,0x78,0x86,0xFC,0xFD,0x21, + + 0x92,0x0D,0xA5,0x81,0xA5,0x39,0xF2,0x76,0x03,0xF9,0x8D,0xF5,0x81,0xFF,0x73,0x05, + + 0x82,0x97,0xAD,0x91,0x33,0x3A,0x23,0x6F,0x08,0xA1,0xD9,0x95,0xFF,0xA0,0xF9,0x0E, + + 0x40,0x58,0x9A,0x75,0x18,0xA3,0x6E,0x9A,0x9B,0x8D,0xC8,0x3E,0x7C,0xD7,0xA2,0x0B, + + 0x79,0x13,0xA6,0x18,0x64,0x22,0x06,0x9C,0x80,0x21,0xF9,0xB4,0x92,0xEF,0x4D,0x27, + + 0x41,0x2A,0x87,0x70,0xB8,0xE1,0x12,0x82,0xFC,0x67,0x74,0x5E,0x26,0xD1,0x89,0x65, + + 0x34,0xE0,0x30,0xC1,0x98,0x19,0x0C,0x4A,0x6D,0xD6,0x34,0xC7,0x2C,0x87,0x7C,0x20, + + 0xEE,0x53,0x8C,0x31,0x99,0x59,0x08,0x73,0x7A,0xF3,0x51,0xFC,0x09,0xB4,0x04,0xC5, + + 0xD4,0x06,0xAE,0x9C,0x35,0x30,0xF1,0x83,0xB6,0x89,0x5E,0x9C,0x77,0xAA,0x1E,0xDB, + + 0x0F,0x92,0xFF,0x1D,0x4D,0x31,0x34,0xB7,0x1B,0x82,0xF7,0xF1,0x0F,0xF7,0xED,0xBF, + + 0x26,0xE9,0x85,0x62,0x18,0x32,0xED,0xE6,0x07,0xF0,0x5C,0xED,0x88,0xAD,0x8C,0x90, + + 0x1C,0x88,0xFB,0x06,0xC1,0xFD,0x4D,0x50,0xD6,0xDF,0x0D,0x79,0x80,0x25,0x51,0x52, + + 0x41,0x87,0x68,0x12,0xCE,0x5D,0xE5,0x92,0x8E,0x71,0xE6,0x04,0x51,0xAD,0xA3,0x7C, + + 0x0B,0x04,0x0A,0x58,0x29,0x5E,0x11,0x26,0xC2,0x42,0x16,0x10,0x3F,0x47,0xA1,0x7E, + + 0x24,0x72,0x96,0x48,0x68,0xCD,0x03,0x74,0x1B,0x3C,0xD8,0x24,0xFB,0x77,0x32,0x40, + + 0xED,0xE0,0xA0,0x9F,0x10,0x86,0x98,0xE8,0x64,0x12,0x44,0x1D,0xF5,0xE2,0xC4,0x76, + + 0xFA,0x8E,0x51,0xCC,0xE4,0xE5,0xCA,0xC0,0x57,0x00,0x4C,0x09,0xF4,0xA8,0x59,0x3F, + + 0xA7,0xC6,0x61,0x00,0x4C,0x19,0x0E,0x29,0x7B,0xDA,0xDF,0xC5,0x23,0xE9,0x51,0xAF, + + 0x07,0x7C,0xA5,0x83,0x6F,0xEF,0x0F,0x59,0xA1,0x02,0xFB,0x91,0xF3,0x18,0x5A,0x2E, + + 0x2E,0x8A,0xC4,0xC3,0x1D,0xC8,0x08,0xB4,0xBB,0x45,0x94,0x9E,0x84,0x43,0x76,0xF2, + + 0x1B,0xC4,0x06,0x8D,0x0A,0xA3,0x41,0x1E,0x99,0x91,0xEA,0xA0,0xA6,0x12,0x37,0xF7, + + 0x11,0x71,0x04,0xC2,0xB8,0x57,0x54,0xD0,0x2D,0x5C,0x16,0x2A,0x5B,0xFC,0x39,0xE4, + + 0x0B,0x2A,0x2B,0x00,0x8A,0xEA,0x9C,0x76,0xED,0x6A,0xBB,0xFD,0x5E,0xAD,0x32,0xB3, + + 0x4E,0x13,0x55,0x0F,0x18,0x94,0x41,0x62,0xAA,0x79,0x92,0xCD,0x5D,0xE1,0xE1,0x3A, + + 0x0B,0xE1,0x26,0x3C,0x5C,0x72,0x9A,0x45,0x6B,0xA3,0xF2,0x6F,0xA2,0x5B,0xA3,0x83, + + 0x5D,0x73,0x46,0x6B,0x1C,0xE6,0xAC,0x6B,0x4D,0xC0,0x8C,0x10,0x51,0x58,0xFB,0x9C, + + 0xAB,0x8C,0x93,0xDD,0x9A,0xA6,0x3B,0x44,0xC7,0xA3,0x00,0x7D,0x9F,0x83,0x78,0x06, + + 0x33,0x92,0xA2,0xAB,0xDD,0xC1,0x62,0xEE,0x8F,0xB4,0x8B,0xF9,0xA0,0x35,0x29,0xD5, + + 0xEF,0x21,0x45,0x14,0x3C,0x5C,0xF8,0xED,0xD8,0x2D,0x3C,0x47,0x95,0xB1,0x75,0x9B, + + 0xF0,0x3F,0x09,0x15,0xB8,0xBA,0x0D,0x4C,0x07,0xDB,0x12,0x90,0x9F,0x57,0x65,0x86, + + 0xD2,0xEF,0xF7,0x6D,0x16,0xB7,0x67,0x10,0x91,0x91,0x15,0x3D,0x61,0x67,0x2C,0xCE, + + 0x15,0xB0,0xAE,0x19,0x95,0xB9,0x42,0x13,0x86,0x94,0xD4,0xE2,0x97,0x6B,0xD4,0xEF, + + 0x80,0xD4,0xA6,0x2D,0x94,0xB3,0xD9,0xE9,0x0C,0xA1,0xC6,0x09,0x8A,0x74,0xDD,0x3C, + + 0x95,0x52,0xAF,0x28,0x15,0xBB,0xDD,0x69,0x72,0x42,0x5A,0x9D,0x2B,0xB7,0xAD,0x9B, + + 0xA7,0x1A,0xE1,0xD0,0x16,0x3D,0xFD,0x35,0x75,0xD4,0xEE,0x0C,0x16,0x74,0xF9,0x9D, + + 0x2A,0xC2,0x5D,0x0A,0x63,0x7D,0x7F,0x9F,0xCD,0x67,0x13,0xB5,0x17,0x8C,0x17,0x3A, + + 0xC0,0x69,0xE4,0x69,0x9E,0xBF,0x3D,0xA6,0xED,0xA7,0x5D,0x45,0x02,0xF9,0x67,0xAF, + + 0x29,0x34,0xC7,0xCE,0x30,0xB7,0xF7,0x77,0x47,0xE8,0x37,0x69,0x6E,0xF9,0xDF,0x48, + + 0x4C,0xF7,0xE7,0x08,0xDE,0xEE,0xAF,0xF4,0x10,0xA7,0xD7,0x7D,0x7B,0x0E,0x3F,0xC8, + + 0x89,0xDE,0x59,0x2C,0x1A,0xBA,0x95,0x11,0x11,0xDC,0x26,0x14,0x87,0x75,0xA2,0x5E, + + 0x3A,0xE2,0x5A,0xBC,0xC0,0xA6,0xEE,0xE5,0x66,0x69,0x5A,0x8C,0xDC,0x0D,0xAF,0x49, + + 0xA8,0x3D,0xCE,0x5C,0x1F,0x61,0x1F,0x29,0x68,0x2B,0x73,0x1C,0x7A,0x6A,0xFF,0x1C, + + 0xAD,0x6A,0x79,0xB9,0x44,0xFD,0xF7,0x79,0x2A,0x5C,0x08,0x7F,0x42,0xBE,0x5A,0xA9, + + 0x68,0x63,0x68,0x8E,0x32,0xF6,0xF4,0xDE,0x23,0x60,0xF0,0x0A,0x33,0x6F,0xA2,0xE3, + + 0x8D,0x0C,0x7B,0x2F,0xEB,0xB4,0x27,0x77,0x8B,0x11,0xFE,0x54,0x52,0x40,0x7F,0x07, + + 0x61,0x81,0xFE,0x3A,0x6E,0xF7,0xF5,0xDE,0x21,0xFD,0x4E,0x24,0x2D,0x0E,0xF6,0x35, + + 0x75,0x80,0xFA,0xD7,0x12,0x65,0x51,0xA4,0xC7,0x59,0xC3,0x95,0xAD,0x7C,0x67,0xB1, + + 0x9E,0x96,0x53,0xC0,0x7E,0xD2,0x18,0x82,0xEE,0xE9,0x85,0xE6,0xC3,0x10,0x37,0xAD, + + 0x03,0x0B,0x5B,0xD0,0x7F,0x52,0x8C,0xD5,0x00,0x49,0xEA,0x8B,0xA7,0x6A,0xA9,0xCB, + + 0xA0,0xD0,0x7E,0xA7,0xF1,0xC3,0x1D,0x83,0x7F,0xCA,0xE9,0x94,0x71,0x39,0x21,0xD7, + + 0x7F,0x46,0xF3,0xB7,0xF0,0xD7,0x56,0x8F,0x2A,0xFF,0x19,0xB8,0x42,0x61,0x04,0xB8, + + 0x6B,0x23,0x35,0x28,0x6F,0x28,0xD7,0xD8,0x68,0xF9,0x2A,0xD2,0x3B,0x4B,0x58,0x57, + + 0x2D,0xF4,0x31,0xAC,0xDC,0xF6,0x53,0xB5,0xA0,0x19,0x79,0xC2,0xFD,0x84,0x90,0xFA, + + 0x0C,0x87,0xD9,0x62,0xE4,0xD5,0xD3,0xE1,0xB4,0x08,0x04,0xC7,0x7D,0x06,0x1C,0xEA, + + 0x0D,0x86,0x2C,0x1B,0x72,0x4F,0x0C,0x09,0xE9,0x09,0x5F,0xC6,0xBA,0xE0,0xEF,0x37, + + 0x97,0x50,0x55,0xB3,0x4E,0xFB,0x78,0xCD,0x09,0x41,0xFB,0x63,0xFB,0xEB,0x52,0xCC, + + 0x6B,0xF2,0x15,0x26,0x24,0xEB,0x14,0x57,0x1E,0x0D,0x57,0x1E,0x78,0x0D,0xF8,0x07, + + 0x63,0x3E,0x42,0x27,0xED,0xE2,0xD8,0x92,0x02,0xB6,0x93,0x79,0x58,0x4A,0xB4,0x2B, + + 0xE9,0xF0,0x12,0x5D,0x7A,0x90,0x10,0x09,0x49,0x4C,0x1B,0xA0,0x84,0x2E,0x04,0x7F, + + 0x20,0xEF,0x3F,0xE4,0x3C,0xCB,0x2B,0x90,0xF2,0xEF,0x37,0x92,0xAC,0x95,0x0C,0x6F, + + 0xDE,0x11,0x1B,0x8E,0x13,0x85,0xC1,0x28,0x67,0xCB,0xAE,0xB5,0xF4,0x67,0xFA,0x7F, + + 0x5F,0x32,0x7A,0xA1,0x94,0xC6,0x2E,0x11,0x7C,0xCD,0xCB,0x96,0xFC,0xD9,0x09,0x91, + + 0x5E,0xEC,0xD9,0xE7,0x5A,0x70,0xDF,0x59,0x2D,0x1E,0x3C,0xAF,0x6D,0xC7,0xE9,0xBF, + + 0xBF,0x56,0xBC,0xC0,0xD2,0xB5,0x8F,0xAF,0x1D,0xA6,0xD0,0x06,0x56,0xF9,0xE5,0xBE, + + 0x5C,0x15,0xB4,0x64,0x85,0x9A,0xDC,0x2D,0xF1,0xAE,0xF3,0x8B,0xAA,0xE9,0x08,0x45, + + 0x37,0xEB,0xD4,0x36,0x36,0x9B,0x88,0xB1,0x03,0xE9,0x8C,0x18,0x55,0x37,0xB6,0x71, + + 0xF3,0xE5,0x69,0xF1,0x32,0x3A,0xA2,0x83,0x14,0xE8,0x66,0xAF,0xF5,0xAD,0xF9,0x88, + + 0xD7,0xE7,0xFB,0xE7,0xB5,0x9E,0x64,0xAC,0x64,0x16,0xC8,0xA3,0x6A,0x36,0x47,0x31, + + 0x3A,0xAA,0xDA,0xB5,0xD2,0x7D,0xA6,0xA8,0xCE,0x18,0x41,0xBC,0xFA,0x77,0x07,0x76, + + 0xA8,0x1A,0x10,0x4D,0xFE,0x97,0x03,0x8D,0xDB,0xBE,0xF6,0x0D,0x2E,0xC5,0x46,0xC9, + + 0xBA,0xA3,0xB5,0x2C,0x9B,0x94,0xF3,0x39,0x15,0x7B,0x7F,0x82,0xDD,0x15,0x1F,0x51, + + 0x8F,0x6D,0xEE,0x2E,0xBB,0x58,0x0F,0xEE,0x8F,0xC3,0x41,0xA3,0x87,0x00,0x61,0xA7, + + 0xF2,0xA0,0x90,0x1E,0x29,0x7F,0x9B,0x10,0x1C,0x90,0x15,0xC1,0xF6,0x80,0xB8,0x4D, + + 0xB1,0x5C,0xEF,0xCB,0x3B,0x30,0x68,0xAE,0x38,0x54,0x7E,0x93,0x6F,0x3C,0xB4,0xB7, + + 0x40,0x5B,0xCF,0xD1,0xBD,0xC5,0x40,0x99,0xED,0xD4,0x3A,0x02,0x0E,0x29,0xF3,0xF1, + + 0x88,0x0D,0x98,0x41,0x1A,0x1F,0x79,0x1F,0x1C,0xC4,0x27,0xD5,0xD0,0x6D,0x88,0x60, + + 0x67,0xFD,0x92,0xB3,0xE6,0x55,0xE8,0x12,0x6D,0x30,0x87,0xD4,0x09,0xE5,0xC5,0xF9, + + 0xA0,0x2D,0x15,0x65,0xEC,0x1D,0x8D,0x07,0xE6,0x83,0xE3,0x09,0x3F,0x86,0x57,0x14, + + 0xA1,0x2C,0x09,0x09,0x19,0xC6,0x07,0x57,0xAD,0xCE,0xD4,0x13,0x5A,0xE1,0x9B,0x2D, + + 0x7A,0x2B,0x60,0x8F,0xE2,0xA2,0xB7,0x00,0x07,0x84,0x2B,0x64,0x29,0x0C,0xCC,0x30, + + 0xF8,0x08,0xE9,0xB4,0x95,0xAD,0x22,0x73,0xE4,0xC3,0xF2,0x09,0x76,0x07,0xC1,0x2D, + + 0xF0,0x29,0xED,0x40,0x37,0x2E,0x09,0xE1,0xE4,0x74,0xAE,0xCC,0xD0,0x3C,0x16,0xD7, + + 0xD0,0xA8,0x64,0xA7,0x93,0xA8,0x29,0xEE,0x66,0x4F,0xA0,0x74,0x72,0x18,0x82,0x78, + + 0x6E,0xDD,0x16,0x6C,0x91,0xCA,0x4D,0x59,0x65,0xAB,0x05,0x2F,0xD1,0xE4,0xBA,0x1B, + + 0x05,0xA9,0x11,0xA6,0x90,0xCB,0x44,0x3C,0x2E,0xED,0x9D,0xA9,0x36,0x4F,0x5D,0x0C, + + 0x7D,0x85,0x78,0x0F,0xE4,0x55,0x48,0xDB,0x4D,0x7B,0xDB,0xDE,0x1A,0xEA,0xD4,0xE4, + + 0x72,0x8B,0x50,0x60,0x93,0x54,0x68,0x04,0x49,0x14,0x3E,0x4D,0x36,0x6D,0xDF,0x7B, + + 0x16,0x23,0x82,0x0E,0x0B,0x2E,0x76,0x88,0xCC,0xCF,0xAB,0x93,0xFB,0x1D,0xCE,0x38, + + 0xF0,0x36,0x92,0xDC,0x1A,0x7C,0xF2,0xAE,0x2C,0xAD,0xB8,0x3E,0x0F,0xEB,0xC3,0x39, + + 0xB8,0x21,0x9B,0xCD,0x9B,0x5F,0xB0,0x19,0x6D,0xC8,0x0B,0x09,0x51,0x68,0xEB,0x5F, + + 0xD8,0xA0,0xD1,0xBD,0xBB,0x04,0x03,0xFF,0x90,0xC5,0xF7,0x78,0x7E,0x67,0x24,0x82, + + 0x24,0x70,0x00,0xE4,0xCB,0xF2,0x98,0xE0,0xE7,0x04,0xF4,0x99,0x7C,0x9C,0x2C,0x92, + + 0x2D,0x88,0xAA,0x32,0x2D,0xB5,0x5A,0xB6,0x0E,0x57,0xF6,0x54,0x34,0xE1,0x25,0x83, + + 0xA4,0x03,0xAB,0x83,0xB7,0xF2,0xD7,0xBC,0x2A,0x79,0x9D,0x65,0x0D,0x7E,0x2D,0x93, + + 0xE1,0xB5,0x97,0xE4,0x93,0xBA,0xBD,0xC1,0x0E,0x16,0xC3,0x24,0x9E,0x45,0x3A,0xC5, + + 0x26,0x39,0x0B,0x44,0x37,0xD3,0xC2,0xDB,0x60,0x35,0x0F,0xA1,0x8B,0x42,0x64,0xC3, + + 0xCE,0xD1,0x48,0xB4,0x76,0x95,0x9B,0x32,0x23,0x29,0x10,0xF4,0x7F,0x99,0xC5,0x3C, + + 0x29,0x20,0xDF,0x25,0x34,0x9E,0x80,0x81,0x15,0xBA,0x4E,0x7D,0xF7,0x96,0x96,0xA8, + + 0x58,0xD6,0x95,0x15,0x34,0xB9,0x46,0xAC,0x32,0x6A,0xB5,0x9C,0xD3,0xF1,0xE6,0x56, + + 0xD6,0x65,0x20,0xFF,0x40,0xB1,0x48,0x9D,0x07,0x7D,0xB7,0xB0,0x98,0x0C,0x50,0x9C, + + 0xCC,0x1A,0x71,0x9E,0x19,0xA2,0x5F,0xA0,0xBD,0x6D,0xE0,0x8C,0x3D,0xB5,0x31,0xE9, + + 0xCC,0x80,0x23,0x72,0xB4,0xFB,0xB6,0x58,0x0C,0x96,0x01,0x5E,0x14,0xBE,0x66,0x68, + + 0x21,0x16,0xFB,0xF9,0x30,0xD9,0x18,0x4A,0x71,0xC9,0xDE,0xB1,0x2D,0x8F,0x06,0x95, + + 0x8D,0x17,0x46,0x0C,0xB2,0xB2,0xDD,0xF3,0xEE,0x42,0xA6,0x73,0xDF,0x76,0x14,0x2A, + + 0xFC,0x92,0x8E,0x9F,0xCA,0xB0,0x27,0x6A,0xCA,0x22,0x34,0x8C,0xDC,0xFB,0x63,0x29, + + 0x2C,0x62,0x9F,0x0D,0x1F,0xFD,0xD8,0x95,0x33,0x9F,0x0C,0x0D,0x7C,0xB6,0x0F,0x84, + + 0x48,0x32,0xE5,0xDE,0xB9,0x2C,0x45,0x05,0x8C,0x56,0xAF,0x62,0x5E,0x75,0x7F,0xE2, + + 0x82,0x03,0x73,0x10,0xED,0xAB,0xEF,0xDB,0xC2,0x48,0xE0,0x5A,0xF3,0x05,0x28,0x69, + + 0xA0,0xFE,0xB2,0xA4,0x8C,0x8E,0x65,0x14,0xA8,0x11,0x90,0x83,0xB0,0x6E,0x46,0x73, + + 0x23,0x04,0xEA,0x39,0x7B,0x66,0xEE,0x43,0xE0,0x4F,0x2E,0xC7,0xF4,0x64,0x23,0xC1, + + 0xDD,0x05,0x2D,0x77,0x6E,0x62,0xE4,0x4A,0xFD,0x3C,0xF9,0x75,0x37,0x6E,0x46,0x49, + + 0x26,0x02,0xB8,0x60,0x93,0x29,0xEF,0x82,0x66,0xC9,0xA8,0xE6,0x74,0x2C,0x28,0x10, + + 0xEF,0x08,0x08,0x89,0xAA,0x2B,0x98,0x45,0xFD,0x48,0x13,0x16,0xAE,0x0B,0x49,0x76, + + 0x23,0xD9,0xE9,0x42,0x13,0x62,0xAE,0x91,0x2E,0xB7,0xA9,0x42,0x71,0x26,0xE5,0xCF, + + 0x0E,0xF1,0x69,0x97,0x1F,0x29,0xA2,0x36,0xCD,0x48,0xBE,0x35,0x93,0x9A,0x52,0x85, + + 0xAB,0x48,0x2A,0x90,0x2B,0x4C,0x28,0x8D,0xFF,0xB5,0xD8,0xD2,0xFB,0x65,0xAD,0xB8, + + 0xD9,0x2A,0x4A,0xDC,0x0A,0x6B,0x3A,0xD2,0x2A,0x4D,0xE2,0xBE,0x58,0xEE,0xC8,0x6B, + + 0x5C,0xFB,0x39,0xF6,0xE7,0x0A,0xBF,0xA6,0x7D,0xC3,0xD9,0x30,0x99,0x62,0x2C,0xBD, + + 0x34,0x02,0x45,0xA9,0x78,0x84,0x7A,0x79,0xC5,0xBE,0x20,0xDF,0x75,0x96,0x4A,0x4D, + + 0x85,0x08,0xFA,0xE8,0x98,0x64,0xD5,0xD7,0x5E,0x63,0xB5,0x93,0x7E,0x00,0xDA,0x9F, + + 0xF6,0xBB,0x0A,0x04,0x46,0x2B,0x15,0x5E,0xA2,0x7D,0x7D,0x7A,0x8F,0x09,0x47,0x0E, + + 0x89,0x01,0x0C,0xBD,0x96,0x21,0xD3,0x84,0x12,0x0C,0xEC,0xF2,0x25,0x2F,0xF0,0xC3, + + 0x8A,0xEF,0x43,0x5A,0xF8,0xAF,0x03,0x74,0x81,0x7F,0x66,0x1D,0x9F,0x1D,0x36,0xB0, + + 0x22,0xBF,0xFE,0x87,0x5C,0x30,0x4F,0xF3,0x1B,0x23,0xF4,0xE4,0xC6,0x7D,0xB9,0x63, + + 0xAD,0x50,0x11,0x94,0xB9,0xFB,0x04,0xB5,0x1E,0x71,0xD6,0xA9,0xD2,0x77,0xA5,0xF2, + + 0x03,0x91,0xA1,0xB9,0xB0,0x12,0xD5,0x68,0xAD,0xAF,0xDF,0x5B,0x53,0x7F,0x17,0x93, + + 0x4A,0x1C,0x8D,0x95,0x4C,0x92,0x8D,0x4C,0xE1,0x12,0x95,0x1F,0x04,0x7C,0x51,0xFF, + + 0x16,0x55,0x54,0x46,0x10,0x54,0x36,0xF1,0x61,0x34,0xAE,0x14,0x7A,0x7B,0x5B,0x23, + + 0xA7,0x98,0xB3,0x56,0x11,0x55,0xDD,0xC0,0xDC,0x39,0x97,0x84,0x92,0x6E,0x7F,0x3B, + + 0xF8,0xEB,0xFF,0x27,0x90,0xC9,0x6F,0xE3,0xA6,0xFB,0xF3,0xBC,0xB9,0x36,0x9E,0x22, + + 0x2F,0x1A,0x97,0xD4,0x10,0x76,0x99,0x0E,0xC7,0x3B,0x5E,0x13,0xC0,0x4C,0x47,0xEE, + + 0x49,0x1C,0xBE,0xBD,0x99,0xB9,0x2C,0x52,0x93,0x23,0x22,0xD3,0xDB,0x39,0x75,0xBF, + + 0x88,0x77,0xDC,0xD6,0xD2,0x5D,0x67,0x3C,0x65,0x56,0x66,0xB4,0x98,0x36,0x61,0x6B, + + 0x8C,0x17,0xE0,0x7E,0x3C,0xB7,0x57,0x45,0x84,0x65,0xCE,0xD8,0x9B,0x7E,0x6D,0x91, + + 0x58,0x92,0xB7,0x67,0x15,0x36,0xC2,0x80,0xDE,0x2C,0xC6,0xCD,0x9A,0x80,0x55,0x32, + + 0xD3,0x17,0xFC,0x32,0xE7,0xE1,0x0B,0x04,0x87,0x47,0x2C,0x04,0x34,0x33,0xDE,0x5A, + + 0xA3,0x65,0x05,0x3F,0x6F,0xEA,0xDF,0x1A,0x8B,0xE2,0x01,0x08,0x0C,0x3D,0x3B,0x96, + + 0x5B,0xE2,0x68,0xBF,0x41,0x7C,0x0E,0x7F,0xA8,0xFA,0x47,0x69,0xCC,0xA0,0x77,0xB9, + + 0xA7,0x5F,0x5A,0x2F,0x9F,0x39,0x9F,0x21,0x7F,0x1E,0x5F,0x24,0x45,0x79,0xE5,0x8F, + + 0xED,0xC3,0xA5,0xEE,0x27,0x6F,0xB1,0x06,0xB9,0xAC,0xC8,0x02,0xD6,0xE3,0x7E,0xB3, + + 0xEE,0xE5,0xF1,0x15,0xF2,0xED,0x5F,0xCD,0x61,0x3A,0xE2,0x1D,0xF6,0x84,0xB4,0xF0, + + 0x00,0x0F,0x09,0x13,0x11,0x72,0x56,0x63,0x84,0x3F,0xF0,0x87,0x90,0xD2,0x11,0xEC, + + 0x6C,0x80,0x29,0xD1,0x99,0xE2,0x39,0x17,0xF6,0xB2,0xE3,0x15,0x76,0xE7,0xDF,0xD9, + + 0xF9,0x59,0x98,0x62,0x10,0x1E,0xB0,0xAE,0x90,0x86,0xCF,0x84,0xFA,0xE0,0x57,0xCD, + + 0xF8,0x18,0x1D,0xD2,0x6D,0x83,0xE3,0x56,0xA6,0x87,0x75,0x86,0x5B,0xEA,0x02,0xBD, + + 0xA2,0xEA,0x8B,0xBA,0x94,0x7D,0xBE,0x9B,0xC0,0xBE,0x0F,0x43,0x54,0xEE,0x8A,0xAD, + + 0xA3,0xE9,0x29,0x1F,0x07,0xE7,0x2A,0x45,0x45,0xDB,0x99,0x37,0xC2,0x6A,0xB7,0xF9, + + 0x88,0x05,0x8E,0x1A,0x95,0xCC,0x8A,0xD5,0x3F,0x64,0x34,0xDE,0xE4,0xE7,0x95,0xF8, + + 0x8D,0xC4,0xA6,0x4D,0xED,0x68,0xB4,0x45,0x6E,0x19,0x4A,0x2A,0x79,0xEF,0x75,0x36, + + 0x67,0xEE,0xAF,0x5C,0x28,0x62,0x6C,0x9F,0xCA,0xF0,0x07,0xDF,0xFC,0xE5,0xBB,0xEA, + + 0x2E,0xCB,0x23,0x49,0xF7,0x8B,0x62,0x03,0x68,0x34,0xB3,0x90,0x3C,0xE4,0x22,0x75, + + 0x06,0xE0,0xEF,0x43,0xFF,0x03,0x80,0x88,0xA7,0x35,0x8A,0x4A,0xDC,0x10,0x14,0x73, + + 0xC7,0x73,0x8A,0x1E,0xA1,0xA2,0x1A,0x30,0xE9,0xC2,0xB4,0x93,0x57,0xAD,0x03,0x0B, + + 0x6A,0x83,0xE6,0xA7,0xAD,0x61,0x01,0x94,0x86,0x43,0x89,0x1D,0x7D,0x9A,0xFA,0xDD, + + 0x73,0x5A,0xE9,0xBD,0x18,0xFA,0xEB,0x08,0xDB,0xA3,0xB0,0x0F,0x5D,0x13,0x04,0x10, + + 0xA4,0xD1,0xDB,0xA1,0x95,0x6F,0x69,0xAA,0x57,0xD0,0x4C,0xAE,0x17,0x0F,0x54,0x10, + + 0xF8,0xCE,0x65,0x92,0x7D,0x97,0x6C,0x26,0x84,0xDE,0x44,0x5E,0x7E,0xBE,0x45,0xDC, + + 0x1B,0x6F,0x11,0xE5,0x4B,0xA9,0xF5,0x73,0x83,0xD4,0x4D,0xD5,0xC7,0x18,0x12,0x71, + + 0x27,0x6F,0xCD,0xD7,0x1B,0x3E,0x89,0xCC,0x46,0x92,0x2D,0xC4,0xED,0x9F,0xA9,0x2A, + + 0xCF,0x6D,0xE8,0xBD,0x97,0x3E,0x14,0xA6,0x1D,0x5F,0xFC,0x41,0xD7,0x0B,0x3C,0xD2, + + 0x21,0x6F,0xA6,0x28,0x31,0x26,0x76,0x76,0x2F,0x72,0x6C,0xE7,0x6B,0xF3,0x1F,0xA3, + + 0xAA,0xD6,0x1E,0x25,0x1A,0xBB,0xF5,0x01,0x64,0x95,0xCF,0x05,0x0B,0xF9,0xA2,0xF7, + + 0x94,0xB1,0xB8,0xF3,0x84,0xAC,0x3B,0x22,0xAC,0x7D,0x50,0x17,0x56,0x77,0x5B,0xE5, + + 0x8F,0x9E,0xDE,0x0C,0x3D,0xFF,0xED,0xAB,0x0F,0x2E,0xD0,0xA2,0x7F,0x68,0x56,0x18, + + 0x2C,0xE4,0x96,0x4E,0x61,0x31,0x06,0x41,0x90,0xB5,0x71,0x46,0x7B,0x73,0x88,0x61, + + 0x45,0x30,0x9F,0xDF,0xB4,0xB5,0xA4,0x2F,0x80,0x36,0x77,0x76,0x58,0xB8,0x75,0x9A, + + 0x0E,0x98,0x9F,0x7D,0x3F,0xB3,0x58,0xFB,0xAD,0x0B,0x6F,0x3B,0xA2,0xD3,0xDC,0x8D, + + 0xEC,0x4E,0x5C,0x30,0xD7,0xEC,0xE6,0xB5,0x0F,0xBC,0x8E,0xCA,0x7E,0xFC,0xD4,0xCE, + + 0x29,0xE7,0x2E,0x06,0xAB,0xFC,0x44,0x4A,0x49,0x29,0xFE,0xFE,0x7F,0xFD,0x2F,0xD3, + + 0x9D,0xB8,0x44,0x2D,0x5E,0x01,0xD8,0x99,0x92,0x21,0xF7,0xEF,0xFE,0xFE,0xB8,0xA5, + + 0x0C,0xFA,0x8F,0x9B,0x3B,0x32,0xDF,0x08,0x63,0x62,0xFF,0xFF,0x9E,0x15,0x10,0x95, + + 0x02,0x6E,0xD9,0x17,0xF7,0x3B,0xBA,0xD1,0x46,0xE0,0x13,0xCC,0x98,0xAD,0x1B,0x98, + + 0xA4,0x88,0xAD,0xE2,0x7A,0x80,0x1E,0x22,0x47,0x21,0x9E,0x4A,0x8F,0xAE,0x58,0x86, + + 0x25,0x84,0xA0,0xF1,0xB6,0x39,0x59,0xC9,0x52,0x00,0x6A,0xE2,0x0E,0x6A,0x29,0x83, + + 0x09,0x0B,0x6B,0xE8,0x57,0x2C,0xA5,0xB3,0x04,0xE8,0xB9,0x25,0x30,0x78,0x41,0x3F, + + 0xA5,0x07,0x5F,0xD1,0x11,0x84,0x33,0x06,0xB1,0x54,0xB3,0x02,0xA5,0x74,0x9A,0x90, + + 0x4B,0x47,0x8E,0xBC,0x83,0xE8,0x3F,0x8F,0xB6,0xD3,0x60,0x8E,0x43,0x28,0x81,0x4D, + + 0x84,0x77,0x01,0x38,0xDE,0x2C,0xE9,0x9A,0x4F,0xBB,0x69,0x9A,0xE1,0x8F,0xD6,0x8B, + + 0x03,0xF5,0x36,0x35,0xCF,0x49,0xA2,0x4A,0xA7,0xDC,0xA6,0x32,0x0D,0x98,0x82,0xCF, + + 0x2C,0x64,0xD2,0x99,0x14,0x2B,0x92,0x39,0x92,0x4E,0xB4,0xDA,0x6B,0xCC,0xF2,0xF0, + + 0xC1,0xC6,0xF5,0x5B,0x2A,0x4F,0x52,0xD0,0x09,0x0B,0x92,0x2C,0xDE,0x5B,0x93,0x7B, + + 0xBB,0x1F,0xC1,0x11,0x71,0x8B,0xB9,0xD8,0xCE,0xEA,0x29,0xEA,0x1A,0x3A,0xA3,0x90, + + 0xBA,0xCF,0x33,0x86,0x3E,0x39,0x1D,0xA5,0xCF,0xB2,0xA1,0xCB,0xFB,0x59,0x1B,0x53, + + 0x6D,0x4C,0xA4,0x7D,0x1B,0xEC,0x52,0xEC,0x37,0xEA,0xE9,0xF2,0xAD,0x51,0x21,0xB0, + + 0xD3,0xA0,0xEA,0x4C,0xFA,0x36,0xE2,0x41,0xEC,0x5F,0x27,0x0E,0x99,0x6D,0x63,0xD4, + + 0x8C,0xF7,0x7C,0xDE,0xF2,0xE1,0x5B,0x65,0xF9,0xF8,0x2E,0x2A,0x3B,0x18,0x5D,0x6D, + + 0x6C,0xC2,0xEA,0xAB,0xA8,0x3B,0xE3,0xC1,0x4B,0x6E,0x22,0x3A,0x26,0x19,0x5E,0x84, + + 0x87,0x00,0x3C,0x7A,0x5B,0x3F,0xD4,0xB1,0x63,0x4B,0x55,0xA1,0x50,0x32,0x55,0x82, + + 0xC6,0x0A,0xF3,0x7C,0x7E,0x7C,0xDC,0xFC,0xA1,0x5B,0xA2,0x60,0x52,0x29,0x5F,0x49, + + 0x07,0x9F,0x83,0xB7,0xD0,0x92,0xA5,0x25,0xA8,0x67,0xCD,0x21,0xD1,0x6B,0xED,0xE7, + + 0x92,0x87,0xF6,0x52,0x6B,0x3B,0x5D,0x59,0x59,0x1E,0xC4,0xC5,0x54,0xAC,0xDB,0x91, + + 0x23,0x54,0x3B,0x83,0xCB,0xC2,0x54,0x06,0x51,0x40,0x78,0x60,0x0F,0xB3,0xF6,0x55, + + 0x2D,0x9F,0x95,0x52,0xD6,0x0A,0xE6,0x10,0x29,0x7C,0x1A,0x70,0x0E,0x95,0x49,0x9A, + + 0x91,0x82,0x3A,0xBF,0x64,0xE9,0x8F,0xED,0xD1,0x42,0x15,0x98,0xBC,0x7C,0x9A,0x2E, + + 0x1C,0x79,0xB2,0x51,0xCE,0x91,0xAC,0x75,0x9E,0x7C,0x95,0x71,0xC0,0x43,0xFC,0x0C, + + 0x09,0xBA,0x85,0x64,0xFC,0xF5,0x14,0x4E,0xCD,0xDE,0x97,0xCA,0x87,0xA5,0xF1,0xEB, + + 0x7E,0xED,0x1E,0x68,0x31,0x3D,0x2F,0x48,0x2D,0x16,0xA4,0x23,0x86,0xF4,0x39,0xE9, + + 0xC8,0xC5,0x6B,0x1F,0xB0,0x30,0x13,0xE9,0xFC,0x41,0xC7,0xDA,0xB4,0x16,0x77,0xAB, + + 0x56,0x00,0x4D,0xE7,0xD2,0x34,0x8F,0xCB,0xDA,0x6E,0x7C,0x43,0xCA,0x92,0x79,0x47, + + 0x2C,0xE5,0xCE,0x49,0x09,0xD5,0x0F,0xF2,0x8F,0x30,0xE8,0xDD,0x1E,0xB3,0xD1,0xCD, + + 0x2A,0x7D,0x97,0x46,0xE2,0x72,0xC1,0x6E,0x68,0xDD,0xD6,0xF0,0x48,0x68,0x8F,0x09, + + 0xBA,0x5C,0x7F,0x36,0xAA,0x73,0x93,0x12,0x67,0x1C,0x6D,0xAA,0x38,0xDE,0x5F,0x51, + + 0xDE,0x04,0xCE,0xA6,0x1C,0x24,0x06,0xF3,0x8C,0x1C,0x85,0xF8,0x5C,0x3E,0xDA,0xEA, + + 0xD6,0xCF,0x18,0x94,0x14,0xEF,0x8C,0xA6,0x0C,0x67,0x75,0xCE,0x9C,0x4D,0xD2,0x54, + + 0x1B,0x9A,0xF8,0x61,0x17,0xA2,0x02,0xDA,0x89,0x0E,0x72,0x56,0x51,0x6C,0x20,0xE5, + + 0xB7,0xB6,0xF8,0x81,0x31,0xB2,0x31,0x23,0xC4,0xC2,0xA7,0x13,0x33,0x4F,0x08,0xE7, + + 0xA3,0xC2,0x6F,0x13,0x12,0x61,0x59,0x65,0xE8,0x81,0x43,0xDF,0x1D,0x2E,0x8C,0xD0, + + 0x0E,0x8C,0x5A,0xA6,0x12,0xEA,0xDC,0x10,0x8C,0x05,0x49,0x16,0xD6,0xFB,0xA8,0x5F, + + 0x01,0xF4,0xF4,0x14,0xFE,0x6F,0x03,0x35,0xBA,0x73,0xB0,0x7B,0x64,0x73,0x21,0x31, + + 0x61,0x85,0x24,0x67,0x88,0xE6,0x0E,0x11,0x04,0xC6,0x4A,0x17,0x56,0xF0,0xBB,0x93, + + 0xC3,0x9C,0xB1,0x0A,0xA4,0x6D,0x42,0x03,0x47,0xD8,0xC2,0x91,0xC7,0x5A,0x8A,0x8F, + + 0x89,0x9A,0x4A,0x9B,0x2F,0xEE,0x34,0xEA,0x7F,0x8D,0x5E,0xBC,0x4C,0xE0,0xEA,0x67, + + 0xDE,0x92,0xF0,0x26,0xBA,0xA8,0xFA,0x2B,0x15,0xC1,0x8B,0x2E,0xFA,0xA8,0x8B,0x9E, + + 0x09,0x48,0xF9,0x0E,0x3B,0xBA,0xF3,0x3A,0x0C,0xA4,0x35,0x5D,0x3B,0xF1,0x88,0xED, + + 0xBE,0xCD,0xEE,0xCF,0xAE,0x81,0xBE,0xB9,0x08,0xA2,0xAB,0xAE,0x99,0xEA,0x53,0xBA, + + 0x4E,0xC3,0x5A,0xAE,0x0B,0xEE,0xC9,0x1A,0xCE,0xDA,0x0A,0x86,0xCE,0x27,0x66,0x38, + + 0x2D,0x2F,0xCA,0xAB,0x2C,0x3B,0x1D,0x1C,0x85,0x0C,0xA2,0x6A,0x6C,0xF8,0xF3,0x6B, + + 0x88,0xCE,0x7C,0x1E,0x9F,0xEE,0x3B,0xEB,0x43,0xD5,0x72,0x87,0x4E,0x23,0xEB,0x1A, + + 0x2E,0xCD,0x53,0xA1,0x8F,0xE2,0x83,0xF3,0x6A,0x49,0xA1,0x7B,0x78,0xAE,0x95,0xF1, + + 0x87,0xDF,0xA2,0xB4,0x54,0x10,0xCC,0x86,0x85,0x7F,0x0C,0x5C,0x64,0xBD,0xF3,0x12, + + 0x52,0xE4,0xA4,0x03,0x06,0x75,0x86,0x4C,0xE8,0xB3,0xA6,0xB4,0xC6,0x6C,0x24,0xFC, + + 0x03,0xD3,0xDA,0xF9,0x3B,0x04,0x23,0x5C,0xD7,0x94,0xCA,0x60,0x2A,0x2F,0xED,0xE3, + + 0xD5,0x68,0x17,0xE7,0xBD,0xBA,0x43,0x87,0xD6,0xF7,0xA7,0xB5,0x67,0xFB,0x45,0xB4, + + 0xD9,0xFA,0xC5,0x32,0x10,0xB0,0x24,0x66,0x2E,0xD5,0xCE,0x0E,0xEE,0x3B,0xD3,0x41, + + 0x4F,0x5A,0x7E,0x26,0xB7,0xAA,0x25,0xF8,0x82,0x2A,0x01,0xD8,0xD4,0x6E,0x03,0xF2, + + 0xA7,0x56,0xAD,0x00,0x4B,0x10,0x33,0xE7,0xCF,0x5B,0x65,0x63,0x8B,0x92,0x4D,0xC3, + + 0x46,0x8C,0x76,0x5D,0xB6,0x47,0x91,0x60,0x8F,0xDF,0xD9,0x0E,0x76,0x0C,0x66,0x76, + + 0x90,0xDA,0x27,0x7A,0x38,0xA3,0x8E,0xCA,0x24,0x73,0x34,0xF0,0x8D,0x24,0x94,0xDD, + + 0xEF,0x9B,0x54,0x9C,0x73,0x34,0x5E,0xF0,0xBD,0xD4,0x59,0x3A,0x00,0xDB,0x76,0x8B, + + 0x9F,0x7E,0x81,0xFC,0xD4,0x7B,0x21,0xAA,0x93,0x9A,0x18,0xD4,0x21,0xE1,0x67,0x0A, + + 0xE9,0x9D,0xF6,0x89,0x5A,0xBF,0x4D,0xBA,0xE7,0x56,0xF7,0x3B,0x08,0xB4,0x47,0x3C, + + 0x1D,0x88,0xBF,0xBB,0x9B,0x43,0xF4,0x95,0xA4,0x7D,0x97,0x12,0xE2,0xBC,0xAB,0x7A, + + 0x31,0x14,0x41,0x38,0x2F,0x40,0x27,0xF0,0x88,0xB3,0x59,0x5E,0x96,0xF4,0xDD,0x2B, + + 0xAA,0xD0,0xE6,0xA9,0x8D,0x28,0x8D,0xE9,0xAE,0x53,0x3D,0x40,0x2A,0x0F,0xAF,0xA6, + + 0x84,0x84,0x17,0xDD,0x99,0xA4,0xBF,0x86,0x09,0x9D,0xD8,0x1D,0x1F,0x5E,0x38,0xFF, + + 0xE9,0x0F,0x98,0x34,0xE7,0x8F,0x29,0x53,0x61,0xC1,0x87,0x3F,0x20,0xF4,0x48,0xE3, + + 0x27,0xDC,0xB6,0x25,0x9C,0x87,0x66,0x19,0xA8,0x70,0x00,0xB0,0x2C,0x80,0xD5,0xFF, + + 0x7D,0x83,0x13,0x77,0x7B,0x83,0xEA,0xD2,0xF4,0xCF,0x04,0x1B,0xF9,0x97,0x5B,0xBE, + + 0x6A,0x20,0x42,0xD5,0xBC,0x8E,0xB5,0xA2,0x96,0x49,0x2E,0x09,0x25,0xD2,0x41,0x26, + + 0xE9,0x55,0xC8,0x80,0xF3,0x8B,0x38,0x02,0xB5,0x06,0x56,0x99,0xC0,0xBF,0x5B,0x23, + + 0x37,0xA4,0x91,0x7B,0xB6,0x83,0xFB,0x45,0x9B,0x84,0x81,0x5A,0xF6,0x3A,0x7B,0xB2, + + 0xBE,0xA9,0xD4,0xB6,0xA6,0x48,0x53,0x8C,0x1E,0x57,0xF3,0xE1,0xC9,0x98,0x71,0xAE, + + 0x6A,0x36,0x58,0xDD,0x36,0x81,0x7A,0x40,0x41,0x43,0xD8,0x13,0x6C,0xDC,0x58,0x4A, + + 0x74,0xA7,0x93,0x3D,0xB9,0xD7,0x1A,0x5B,0x2C,0xC9,0x52,0x3C,0x67,0x73,0xBD,0x1E, + + 0xFE,0xA2,0x35,0x2C,0xA8,0xD6,0x0C,0xC6,0x22,0x3A,0x25,0xDA,0x7D,0x25,0xA3,0xF9, + + 0x00,0xD9,0xBD,0x38,0xB6,0xF5,0x11,0xD6,0x29,0xE9,0xA3,0x53,0x7F,0x7A,0xDE,0x19, + + 0x41,0x02,0x30,0xAD,0x61,0xF4,0x1B,0x2A,0xFD,0xD8,0x5B,0x7B,0x93,0x27,0x96,0xB6, + + 0xF7,0x8D,0xD7,0x8C,0x1E,0x01,0x42,0x0A,0xBD,0x29,0x92,0x94,0xE6,0x97,0xB1,0x27, + + 0x38,0xED,0xF2,0xA2,0xB7,0x20,0xDE,0x06,0x2A,0x18,0x16,0x0D,0xB2,0xFC,0xE7,0xB6, + + 0x6B,0xDD,0xB5,0xC9,0xE7,0x0D,0x6B,0x19,0x81,0x45,0xB2,0x91,0x1A,0x2C,0xE0,0x1E, + + 0x85,0xD3,0x36,0x13,0x6E,0x73,0x43,0x7D,0x62,0x81,0x68,0x50,0xE8,0x8F,0x7C,0x2D, + + 0xCB,0x83,0xFB,0x7C,0x30,0x4B,0x94,0x92,0x94,0x5F,0x6D,0xAC,0xD5,0x0F,0x8C,0x54, + + 0xBA,0x0A,0x53,0xD6,0x46,0x36,0xA7,0x01,0x09,0xFE,0xE5,0xDA,0x10,0x75,0xB2,0xA9, + + 0x54,0xF3,0x90,0x74,0xD6,0xC3,0x03,0x95,0x0B,0x93,0x79,0x3E,0x93,0x76,0x3C,0xF7, + + 0x80,0x92,0x4D,0x41,0xCA,0x5F,0x0B,0xA0,0xD9,0x57,0xFC,0xF5,0xBD,0x70,0xC4,0x3B, + + 0xC3,0xB7,0x7F,0x9E,0x34,0xCD,0x5E,0x9F,0x43,0x14,0xAC,0xC3,0x11,0x21,0x97,0xFF, + + 0x25,0x0F,0xF3,0x36,0x7B,0x64,0x7C,0x0E,0x98,0xCA,0xA4,0xD3,0x9A,0xE4,0x50,0x3B, + + 0xDD,0x14,0x91,0xBF,0x11,0x53,0x69,0x37,0x03,0xAD,0xAD,0xC2,0x1B,0x07,0x26,0xAE, + + 0xF6,0x1E,0xF3,0xF9,0x90,0x77,0xE8,0xD9,0x57,0xB6,0xA5,0xD2,0x1A,0x06,0xEA,0x1A, + + 0x64,0x10,0xDF,0xBB,0x9D,0x9E,0x63,0x8C,0x89,0xF7,0x56,0x38,0xFF,0xDA,0x9E,0x64, + + 0xA1,0xE2,0x11,0x0D,0x3A,0xD9,0xAC,0x5E,0x79,0x16,0x5A,0x43,0xF6,0x04,0x05,0xEF, + + 0xEA,0x55,0x16,0xFE,0x80,0x78,0x81,0x5A,0xD8,0x41,0xB7,0x29,0x05,0x16,0x27,0x1D, + + 0xC8,0x8A,0xB1,0xB4,0x1E,0x2B,0xC4,0x97,0x96,0xCC,0x78,0x4D,0x79,0x64,0xC6,0xAB, + + 0xED,0x70,0xC0,0xE5,0xBA,0x5B,0x63,0xDC,0xDA,0xFD,0xAE,0xCB,0x93,0xED,0x4A,0x98, + + 0x2F,0x53,0xCE,0x24,0xBA,0xC6,0x76,0x9A,0x96,0x51,0x74,0x89,0xD8,0x18,0x1E,0xC7, + + 0x4F,0x98,0x07,0xB0,0x6C,0x85,0x97,0xEC,0x49,0x83,0xAF,0xC9,0x1B,0x78,0x8F,0x25, + + 0x23,0xE4,0x8F,0x21,0x07,0x7D,0x67,0x7B,0x6B,0x1E,0xA7,0xDA,0x58,0x1A,0x73,0x2D, + + 0x26,0xD5,0x9E,0x32,0xAB,0xFB,0x85,0x0A,0xF0,0x21,0xF2,0x60,0x42,0xA2,0x7C,0x16, + + 0x02,0xBF,0xD8,0x92,0x73,0xBB,0xF8,0xF6,0xDE,0x6C,0xE6,0xB2,0x34,0xAF,0xB6,0x38, + + 0xA2,0x17,0xA1,0xFE,0x15,0x39,0x06,0x17,0x34,0x63,0xAF,0xC8,0xD2,0x6B,0x84,0x6C, + + 0x18,0xDF,0x97,0x26,0xFD,0xAE,0xA8,0xC2,0x66,0x83,0x55,0xDF,0x49,0x2E,0xA4,0x88, + + 0xBD,0xFB,0x59,0xE3,0xDC,0xA9,0x10,0x60,0x26,0xC9,0x5C,0xC3,0x83,0x87,0xB7,0x52, + + 0x70,0x8A,0x5F,0x6E,0xE2,0xC6,0x18,0x70,0x63,0xC8,0xD3,0x08,0x86,0xA7,0x3E,0xC3, + + 0xF5,0xF3,0x9C,0xAD,0x62,0xD7,0x8A,0x44,0x67,0x39,0x5A,0xAD,0x6D,0x59,0xA9,0x52, + + 0xAE,0xC5,0x8F,0x35,0x6C,0x38,0x02,0x54,0x66,0x3E,0x66,0xE9,0xA8,0xE5,0x99,0x44, + + 0x67,0x69,0xB0,0xB4,0xF7,0xEC,0x00,0x14,0xEF,0x69,0xD0,0x2F,0x4E,0x25,0x75,0x9A, + + 0x7E,0xFE,0x0E,0x60,0xBE,0xCC,0x6C,0x0F,0xA6,0x28,0xE3,0x24,0xB8,0x16,0x07,0xFA, + + 0xBC,0x86,0x99,0xBF,0x28,0x05,0x22,0xD8,0xFC,0x17,0xD1,0x2F,0xDD,0xE9,0xEB,0x66, + + 0x01,0x2F,0x14,0xFD,0x74,0x6A,0x05,0x5B,0xA6,0xC4,0xC4,0xD7,0x39,0xA6,0xFD,0xEB, + + 0xAF,0x73,0x22,0x4B,0xBD,0x21,0x2A,0x6E,0xBF,0x15,0x29,0x41,0x58,0x46,0xC5,0xAC, + + 0x1F,0x70,0x93,0xDA,0x5C,0x66,0x25,0x6F,0x30,0xCC,0xA0,0x50,0xFC,0x88,0xD7,0x29, + + 0xBD,0xDA,0x3E,0x4D,0x29,0x91,0x6B,0x6F,0x67,0x00,0x53,0xED,0x1B,0x07,0x91,0x28, + + 0xBB,0x0E,0xC4,0x20,0x46,0x33,0xA0,0x79,0xC9,0x15,0xA1,0xAE,0x7C,0x8A,0xFF,0x81, + + 0x5B,0x9C,0x9A,0xAA,0x93,0x1D,0xE9,0x72,0xD3,0x6F,0x2D,0x2C,0x75,0xB0,0xB3,0x54, + + 0x23,0x38,0xBD,0xE4,0x5F,0x50,0x8D,0xD4,0x8E,0xA2,0x7C,0xCB,0xF9,0x5A,0xE5,0x2B, + + 0xA4,0xD0,0x37,0xB6,0x84,0x1D,0xF5,0x6A,0x10,0xC9,0x5D,0x2B,0x73,0xB0,0xC8,0x17, + + 0x84,0x31,0xD3,0xA2,0xFD,0x12,0x3C,0xD5,0x0E,0x40,0xC5,0xB3,0x15,0x8C,0x4C,0xF9, + + 0x03,0x01,0xAA,0xC0,0xCE,0x25,0x4C,0x1C,0xCA,0xD9,0x8C,0x0E,0xE2,0x3B,0xCB,0xFA, + + 0xF3,0x74,0xBE,0xDE,0x92,0x1A,0x14,0x90,0x98,0xDB,0x6C,0x1E,0xA3,0x35,0x79,0x47, + + 0xB5,0x08,0xBC,0xE9,0x13,0x19,0x88,0x67,0x9B,0x87,0xF4,0x11,0x73,0xB4,0x4A,0xE7, + + 0x77,0x36,0xBB,0x3A,0x25,0xEC,0x45,0x0D,0xE1,0x57,0x3D,0x92,0x1E,0xEC,0x1C,0x62, + + 0x36,0xD7,0x86,0x18,0x4B,0xED,0xEB,0xC0,0x5B,0x6D,0x07,0x4C,0x0B,0x8F,0x70,0xAE, + + 0xAC,0x32,0xF5,0x9E,0x3B,0xA3,0xE1,0xD0,0x1A,0x6C,0x3E,0x77,0x89,0xE2,0xB7,0x7A, + + 0xC4,0xBE,0x78,0x35,0x44,0x60,0x68,0x2B,0x9F,0xAF,0x68,0x2F,0x1D,0x45,0xB9,0xA0, + + 0xC6,0x8A,0xC4,0x80,0xC9,0x6F,0xFF,0x7F,0x76,0x76,0x0E,0xD9,0x16,0xCA,0xDD,0x88, + + 0x8F,0x61,0xC4,0x33,0x3C,0x67,0xAB,0xF4,0x52,0x28,0x55,0x98,0xF1,0x7A,0xD9,0xBE, + + 0x29,0x64,0xB7,0xF0,0x9A,0xE2,0x1C,0x05,0x86,0xAC,0xE0,0x71,0x79,0xE4,0x4F,0xA9, + + 0x5A,0xB7,0x52,0x4B,0xB1,0x4C,0x64,0x2C,0x07,0x4F,0x77,0xAF,0xEE,0xBC,0xF9,0x19, + + 0x0E,0x60,0xEE,0xB9,0x00,0x04,0x65,0xF9,0x2D,0xDB,0xB8,0x39,0xF1,0xBE,0xBF,0x30, + + 0x4C,0x1B,0xA0,0x32,0xB1,0xFF,0x4B,0x0F,0x3B,0x42,0xCA,0x56,0xAB,0x22,0x10,0x20, + + 0xF6,0xA0,0xF7,0x6A,0xFA,0x48,0xC3,0xF2,0x47,0x61,0xB8,0xB0,0x0E,0x9B,0x30,0xE7, + + 0xA4,0xAF,0xE1,0x07,0x78,0x2F,0xCC,0x20,0xBF,0x42,0x5E,0xAF,0xD6,0x7B,0x31,0x0E, + + 0x22,0x86,0xB6,0xE6,0xF0,0x25,0x05,0xD9,0x4D,0x88,0x42,0x7F,0xAE,0xD5,0x60,0xE3, + + 0xA3,0x0D,0x8E,0x26,0x90,0x38,0x51,0x93,0x12,0xC9,0x7D,0x06,0xD0,0x88,0x16,0xB2, + + 0x0F,0x80,0xA8,0x56,0x08,0x28,0xA2,0xF2,0xC3,0x9C,0x34,0x16,0xB1,0x9A,0x07,0x23, + + 0x65,0xCB,0x36,0xC1,0xEF,0x92,0x2F,0x78,0xF1,0x40,0xED,0x87,0x50,0x62,0xFA,0xB3, + + 0xB0,0x47,0xA9,0x02,0x52,0x65,0x61,0x8E,0xCD,0x25,0xDE,0x07,0x51,0x7B,0x10,0x08, + + 0xF7,0xA5,0xA2,0xF1,0xB9,0xA2,0x1B,0xAA,0xF4,0x4A,0x4F,0xBC,0x23,0x97,0xD7,0x19, + + 0x0D,0x29,0xB4,0x6C,0x50,0x40,0x42,0x98,0xCB,0x3C,0xB3,0xC1,0xEF,0x12,0x7B,0xB9, + + 0x2B,0xD5,0x77,0xE5,0xDB,0x65,0x2B,0xD6,0xA9,0x82,0x53,0xF0,0x4A,0xB1,0x17,0xE5, + + 0x01,0xF0,0xD3,0x14,0x3C,0x20,0xDB,0x5B,0x3E,0xB6,0x9D,0x4F,0x22,0x29,0xE9,0x0F, + + 0x04,0xD0,0x5D,0x57,0x98,0x28,0x18,0xF5,0xA1,0x1C,0xF5,0x8E,0xD8,0x80,0xAA,0xAE, + + 0x38,0x54,0xAA,0x0B,0x8A,0x22,0x5D,0x74,0xA2,0xDD,0xE6,0x9E,0xD9,0x71,0x87,0x83, + + 0x31,0x15,0x8E,0x2F,0xD9,0xDE,0x43,0xE9,0x96,0xEA,0x7E,0x0F,0x58,0x82,0x71,0xBF, + + 0x9B,0x84,0x7F,0x2F,0x38,0x29,0xB7,0xEA,0x93,0x47,0xFC,0x1F,0x54,0xE9,0x3E,0x68, + + 0xEC,0xDF,0x82,0x74,0x34,0x7F,0x4D,0xA7,0x95,0x9F,0x16,0xE4,0x7C,0xDB,0x36,0x63, + + 0x49,0x8A,0x74,0x96,0x77,0x9C,0x54,0x78,0x45,0x1D,0x13,0xD6,0xB0,0xFB,0x5C,0xAA, + + 0x07,0x53,0xA5,0x08,0xD3,0x30,0x6A,0x5C,0xE8,0x10,0x06,0xB1,0x72,0x76,0xB8,0x68, + + 0xA3,0x68,0x11,0x35,0x5C,0xF3,0x89,0xC3,0x63,0x4F,0x1A,0xA5,0xC2,0xA8,0x1B,0x13, + + 0x1D,0x45,0xFB,0x46,0xB2,0xE0,0xC7,0xD1,0x76,0xD6,0x9E,0xF9,0x41,0xED,0xE7,0x2D, + + 0x09,0x8E,0xAC,0x9E,0x9D,0x3A,0x24,0xE2,0x50,0x0E,0x85,0x80,0xD4,0x6E,0x85,0x19, + + 0xE4,0xCD,0xFD,0x97,0xF1,0xC6,0x2B,0xDD,0x2A,0x06,0x2D,0x87,0xB1,0x86,0x6D,0x28, + + 0x4D,0x6C,0x79,0xA7,0x10,0x31,0xA7,0x75,0x95,0xAE,0xC6,0x93,0xD0,0x17,0x86,0x75, + + 0x28,0xC3,0xDF,0x74,0x9D,0xB0,0xE4,0x4A,0xEA,0xB4,0x6E,0xCA,0x87,0xF1,0xD5,0xB7, + + 0x56,0x1B,0xDE,0xFF,0x7D,0x22,0xB6,0x25,0x82,0xB3,0x0D,0x8C,0x71,0xC6,0x3F,0x0D, + + 0xA0,0x33,0xC3,0x6B,0x51,0x53,0x28,0x4B,0x03,0x60,0x93,0xCD,0xBA,0xD7,0x50,0x32, + + 0xAF,0xC1,0xD4,0xFB,0xF8,0x79,0xB7,0x20,0x6C,0x89,0xA5,0x18,0x0A,0x15,0x85,0x4C, + + 0x79,0xDE,0xEF,0x6B,0x9B,0x37,0x36,0xEA,0x51,0x51,0x8C,0xFD,0xDD,0x67,0x04,0x45, + + 0xC0,0x8D,0xCB,0x5E,0xAA,0x5A,0x99,0x7A,0xA6,0x50,0x84,0xF4,0xDC,0xD9,0x27,0xCB, + + 0x8F,0x13,0x47,0xEA,0x1B,0x35,0x93,0x6C,0xE4,0xD4,0x4D,0x8B,0xD9,0x1E,0x77,0x7C, + + 0x2D,0x1D,0x95,0xD8,0x18,0x5A,0x27,0x9B,0xC8,0x3F,0xC7,0xC1,0xFD,0x86,0x08,0x86, + + 0x36,0x80,0x22,0xF7,0x39,0xC0,0xAB,0xDD,0xC6,0xB5,0x7F,0xAC,0x23,0x3C,0x63,0xFA, + + 0xA1,0xC3,0x88,0xEB,0xB4,0xA2,0x2C,0xB0,0xF9,0xE3,0x82,0xCD,0x53,0x1B,0x78,0x89, + + 0x82,0x22,0xFF,0x77,0x6B,0xA4,0x73,0x41,0xB9,0xC9,0x6E,0xFE,0xEB,0x42,0x2F,0x38, + + 0x83,0x7A,0x15,0x8E,0x7C,0xCA,0x01,0xCC,0x27,0xAB,0xD8,0xB5,0x55,0x1B,0x68,0xA4, + + 0x84,0x80,0xC9,0xF9,0xB7,0xAF,0xF7,0x71,0x16,0x94,0x71,0x26,0x5A,0x6F,0xEF,0x32, + + 0x5B,0x88,0xA9,0xD4,0x97,0x9F,0x94,0xE0,0x5B,0xCD,0x9C,0x14,0x14,0x15,0x82,0x21, + + 0x47,0x0C,0x61,0x60,0x37,0xAD,0x51,0x6F,0x2F,0x96,0x70,0x85,0x54,0xE2,0x43,0x83, + + 0xDB,0x2C,0xD1,0xB7,0x91,0xA1,0xFD,0x82,0xD3,0xB7,0x99,0x20,0x42,0xE8,0xCA,0xE2, + + 0x9E,0xCA,0xF2,0x79,0x50,0xB3,0x77,0xA8,0xF0,0xAA,0x8A,0xFE,0x00,0x47,0x96,0x9E, + + 0x45,0x2E,0x8A,0x2B,0xF4,0xC0,0xC5,0xB8,0xF1,0x6B,0x29,0x3F,0xDD,0xB9,0x25,0xD3, + + 0x8A,0x73,0xF8,0xFF,0x94,0xE5,0x0B,0xD5,0x31,0x13,0x20,0xCF,0x94,0x41,0x2B,0x1B, + + 0x8D,0x8B,0xF2,0xE7,0xBF,0x86,0x03,0x46,0xEE,0x9B,0x85,0x03,0x52,0x6D,0x1A,0x6A, + + 0xEE,0xB7,0xCB,0xF1,0x18,0x55,0x4C,0x72,0xC3,0x6A,0x92,0x6C,0xD4,0xE1,0x2F,0xBD, + + 0x78,0x41,0x2A,0x23,0xE6,0xAB,0x79,0x46,0xCF,0xAD,0x54,0x28,0xFC,0xEB,0xFE,0xAC, + + 0x67,0x81,0xDC,0xCD,0x53,0x22,0x74,0x2B,0x86,0x6A,0xD9,0xBF,0x82,0xE8,0xB4,0xF2, + + 0xFC,0x8B,0x45,0x15,0x99,0x56,0x5D,0x62,0xBB,0x62,0xDB,0x7C,0x7E,0x63,0x2E,0xFD, + + 0x05,0xE0,0x5C,0x6E,0x6C,0xFD,0x54,0xE8,0x8E,0xDF,0x0B,0x3D,0x85,0x79,0xAC,0x52, + + 0x9E,0x31,0x88,0xA5,0xB0,0x41,0x72,0x54,0x8E,0x1B,0xDD,0xF6,0x31,0x5C,0x1B,0xB2, + + 0x29,0x14,0xBF,0x83,0x97,0xF2,0x6C,0x5E,0x43,0xC9,0x95,0x4D,0x97,0xF6,0x3B,0x91, + + 0x76,0x48,0x05,0x86,0xC2,0x97,0x43,0xC2,0x8E,0x2A,0x2E,0xA7,0xC6,0x28,0xD0,0xA0, + + 0x65,0x66,0xDE,0x24,0xB4,0xB0,0x2E,0xFF,0xC5,0xD2,0x8E,0x46,0xD7,0x94,0x52,0x54, + + 0x77,0xF0,0x8C,0x9C,0xEF,0xBA,0xFB,0x70,0xAA,0xA9,0xE7,0x72,0x0A,0xAF,0x1B,0xDA, + + 0x07,0xD3,0x09,0xA5,0xF5,0x46,0x55,0x2F,0x47,0x5C,0xD3,0x3B,0x82,0xED,0x55,0x03, + + 0xFB,0x38,0x8D,0xD5,0x38,0xBA,0x05,0x91,0x8C,0xD8,0xA4,0x8F,0x50,0x53,0x06,0x77, + + 0x61,0x03,0x79,0xDA,0x4F,0xBC,0xC9,0x28,0xEC,0x12,0x4E,0x2C,0xFC,0x72,0x5B,0x1E, + + 0x7E,0x5B,0x6E,0x46,0x7B,0x62,0x3C,0x38,0xFC,0xAD,0xDE,0xBC,0x72,0xF4,0x92,0x72, + + 0xAE,0xE1,0xF8,0xC7,0x83,0x3A,0x0F,0xF9,0xAF,0x2A,0x8F,0x47,0x7A,0x35,0xEF,0xF3, + + 0x30,0xDA,0x8B,0x62,0xEC,0xC0,0x47,0xFD,0xF1,0xDD,0xE6,0xA0,0x1A,0xFD,0x7E,0x22, + + 0xAC,0x57,0xCC,0x1E,0x62,0x17,0xF7,0xD8,0xCD,0xDA,0x3D,0xD2,0x78,0x05,0x69,0x29, + + 0x78,0x86,0x40,0xBD,0x9C,0xB0,0x34,0xE7,0xED,0xC1,0xD8,0x9E,0x0B,0x70,0x47,0xB8, + + 0xFE,0x3F,0x9F,0xC3,0x5E,0xB8,0x57,0x27,0x4F,0x52,0x8D,0x4F,0x5F,0x9E,0xAF,0x3D, + + 0x8F,0x0F,0xB7,0xD7,0x3D,0x53,0xDC,0x19,0x6D,0xDB,0x9F,0xB5,0x4D,0xF0,0xB4,0xE2, + + 0x63,0xFF,0x87,0x62,0x71,0x60,0x2B,0x53,0x69,0xC6,0x4B,0x24,0x56,0xDA,0xBC,0xF2, + + 0x83,0x05,0xD7,0x76,0x3F,0x67,0x3C,0x30,0xE0,0x48,0x82,0x30,0x70,0xBB,0x61,0x56, + + 0x7D,0x0D,0x99,0xED,0x12,0x26,0x13,0x61,0x84,0x44,0x64,0xCD,0x88,0x2F,0xE1,0x73, + + 0x0E,0x85,0x8C,0x97,0x11,0x8A,0xE0,0x42,0xE0,0x5C,0xF9,0x37,0xE0,0x6E,0xF8,0xBE, + + 0xC3,0x67,0x43,0xC0,0x4D,0x2E,0x09,0xFD,0xE5,0x42,0x33,0x9A,0x76,0x7F,0x42,0xF0, + + 0xBC,0xB0,0xF2,0xCB,0xEC,0xA8,0xF5,0x0C,0xE0,0x48,0xC0,0x6B,0xF0,0xE0,0x95,0x91, + + 0x03,0xFE,0x29,0x7A,0xB6,0x4A,0x71,0x63,0x63,0x40,0x11,0x03,0x2D,0xCB,0x51,0x6E, + + 0x97,0x45,0xAB,0x55,0x64,0x3C,0xF5,0xE3,0xD7,0x4D,0x49,0x27,0x90,0x97,0x02,0x48, + + 0x7A,0x05,0xBA,0xFF,0x60,0x2B,0x28,0xC1,0x6B,0x27,0x69,0xAE,0xD8,0x81,0x40,0xF2, + + 0xE2,0xD8,0x1D,0x7E,0xFA,0xD6,0xE6,0x4B,0x1E,0x56,0x0F,0x47,0xB2,0xF8,0x79,0x69, + + 0xBA,0x07,0x86,0xD8,0x1A,0x2E,0x2A,0x18,0x69,0x78,0xAB,0xD6,0x2D,0xC5,0x55,0xFB, + + 0x88,0x8E,0xEB,0x1F,0xED,0x26,0x21,0xD0,0xEE,0x24,0xFB,0x3F,0xEC,0x66,0x8D,0xEE, + + 0xEB,0x0D,0xDC,0x0B,0xBF,0xDA,0xD6,0x98,0xB5,0x43,0xAA,0x4B,0xBB,0x63,0xFF,0x38, + + 0xF0,0x09,0xB2,0xD4,0xBE,0xA4,0xC5,0x58,0x4D,0xB4,0x80,0x7E,0xE8,0xB4,0x40,0x5C, + + 0x61,0xB6,0x78,0x3D,0x1A,0x81,0x33,0x6B,0xFD,0x0C,0x43,0xAA,0x27,0xD8,0xC9,0xAA, + + 0xD2,0x7A,0xEB,0xCE,0x38,0x6E,0x68,0x3B,0x6A,0xB2,0xBA,0x59,0xE8,0x3A,0x56,0x81, + + 0xF9,0x91,0xA4,0x68,0x91,0x2B,0xEF,0x22,0xE0,0x08,0x23,0x9D,0x76,0x89,0x6C,0xC7, + + 0xDC,0x1E,0xD5,0x96,0xD6,0x2A,0xB4,0x34,0x2E,0x92,0xB4,0xD6,0x77,0x88,0x05,0x7E, + + 0x59,0xC1,0xC7,0x63,0x1C,0x3F,0x4C,0x65,0xE6,0xAB,0x26,0xE7,0x51,0x8F,0xB9,0xEE, + + 0x02,0x08,0xCF,0xF3,0x46,0x9E,0x27,0x42,0xFD,0x48,0x34,0x31,0x8C,0x22,0x44,0xC4, + + 0xAB,0xE9,0x71,0x78,0xD9,0x50,0xEB,0xA2,0xC3,0x16,0xF4,0xC0,0xD3,0xCB,0x66,0x55, + + 0x2D,0x9F,0x33,0x3C,0x5E,0x78,0xCD,0x32,0xC2,0xAA,0x24,0xD0,0x40,0x05,0x25,0xC3, + + 0xD1,0x1B,0x55,0x2D,0x6E,0xFB,0xCA,0xAF,0xE4,0xAF,0x6E,0x03,0x0B,0x66,0xC9,0x39, + + 0xE5,0x58,0xB6,0xDD,0x16,0x88,0x35,0x93,0x14,0x15,0x65,0x0B,0xE3,0x3A,0x9C,0x0C, + + 0x55,0x42,0x91,0xCB,0xEE,0x30,0x10,0x4E,0x5B,0x7C,0xFE,0xCE,0x87,0x76,0x6E,0xD2, + + 0x8F,0x16,0x0D,0x74,0xB9,0xF4,0x26,0x88,0x21,0x42,0x43,0x54,0x77,0x84,0x5E,0xFD, + + 0x0F,0x97,0x47,0xF2,0x6E,0x32,0xEF,0x2B,0x68,0x5D,0xAF,0x53,0xFE,0xFA,0x6F,0xD3, + + 0x47,0x14,0x74,0xEE,0xC1,0x55,0x5E,0x5F,0x4C,0x40,0x67,0x3F,0x79,0xD2,0x7E,0x18, + + 0x54,0x07,0x6A,0x53,0x59,0x38,0x54,0x05,0x59,0x58,0x2B,0xC8,0x49,0x6A,0x36,0xDD, + + 0xCB,0xB6,0xAF,0xF8,0x9E,0xC2,0x27,0x7C,0x5B,0x5D,0xBC,0xF8,0x33,0x48,0x57,0x2F, + + 0x0F,0xB5,0xBE,0xB7,0xDB,0x3A,0xE8,0x1F,0xEC,0x04,0x17,0xFC,0xA9,0x65,0x37,0xC8, + + 0x6B,0x19,0x14,0xDD,0x43,0xEE,0x9F,0x24,0x7E,0x1D,0xE5,0x15,0x2D,0x30,0xDF,0x80, + + 0x95,0x97,0x3F,0xE6,0x4C,0xAD,0x09,0x13,0xE5,0xF2,0x4B,0xA4,0xD4,0xD9,0x97,0xF0, + + 0x87,0x85,0x2F,0x02,0xB4,0xCD,0xC7,0x60,0x06,0x31,0x3D,0xD0,0xAC,0xF1,0x1F,0xE1, + + 0x27,0xE7,0x65,0x81,0xC8,0xA1,0xCD,0xCB,0x04,0x8F,0x89,0xDC,0x21,0xF9,0xC1,0x71, + + 0xC6,0x63,0x6D,0x92,0x13,0x03,0x60,0x25,0x62,0xC5,0x41,0x51,0xF6,0xA3,0x78,0x79, + + 0x12,0x71,0xD8,0xB5,0x62,0x71,0x58,0x00,0x40,0x3D,0x48,0x95,0x78,0xF4,0x08,0xF2, + + 0x0B,0x0E,0x57,0x19,0x82,0x78,0x10,0x10,0xB8,0xCB,0xB8,0x9A,0xEB,0xA4,0xE0,0xC7, + + 0xD9,0x51,0x74,0x78,0xE6,0xDA,0xD8,0xE7,0xBB,0x97,0x49,0x94,0xB4,0x9D,0x6D,0xB1, + + 0x81,0x7D,0x40,0x25,0x2C,0xB8,0x41,0x8D,0xC1,0x47,0x4E,0x4B,0x24,0x58,0x5C,0x36, + + 0x2D,0xFA,0xF2,0x0F,0x2A,0xA9,0x12,0x63,0xED,0x17,0xF3,0x48,0x7F,0xD8,0x12,0x2A, + + 0x0D,0x36,0x7A,0x7C,0xF6,0x18,0xB5,0xBE,0x30,0x85,0x42,0x36,0x3E,0x82,0xD8,0x89, + + 0x1D,0xBD,0xA4,0xBA,0x1E,0xAE,0x53,0x29,0xDD,0xD1,0xEA,0x22,0xBF,0x88,0x4B,0x51, + + 0x3F,0x86,0x1F,0x7D,0x62,0xAD,0x5B,0x39,0xD0,0xC6,0x43,0xBB,0xA0,0x8A,0xB2,0xA2, + + 0x56,0xC1,0x72,0x3D,0x2A,0x0D,0xAF,0x82,0x0C,0x31,0x09,0xEA,0x52,0xE3,0x46,0x25, + + 0x2F,0xBD,0x3E,0xA0,0x7C,0xAF,0xBA,0x07,0x6F,0x8F,0x40,0x81,0xA4,0xF6,0x79,0x4F, + + 0xAD,0xCE,0xDB,0xB0,0x77,0x9F,0x8B,0xE9,0x4E,0xB5,0x48,0x4B,0xED,0xA8,0xEB,0x18, + + 0x72,0x8E,0x7C,0xAC,0x1B,0x24,0xE4,0x41,0x4E,0xC2,0xE2,0x19,0x05,0x64,0x5A,0xEB, + + 0xCF,0x49,0x47,0x46,0x74,0x4D,0x30,0x44,0x0F,0xDF,0x8C,0x58,0xD8,0xFD,0x69,0x74, + + 0x23,0x98,0x8C,0xE7,0x94,0x1E,0x44,0x36,0x3E,0x35,0xFA,0x50,0x73,0x69,0x7C,0x83, + + 0x03,0x89,0x46,0xC7,0xF0,0xB4,0xE2,0x91,0x1B,0x07,0x19,0x39,0x88,0xE9,0x7D,0xE0, + + 0xF2,0x37,0xBA,0xB1,0xE9,0xF5,0x5D,0xF3,0x0B,0x58,0x32,0x33,0xF4,0x3D,0xC9,0xF4, + + 0x85,0x92,0xBF,0xC6,0x30,0xF4,0xE3,0x42,0x55,0x56,0xF5,0x00,0x52,0xF2,0x26,0xCF, + + 0x14,0xB7,0xA6,0x34,0xA6,0x48,0x4E,0x90,0xEA,0x23,0x9B,0x74,0xB2,0x5E,0x45,0x3F, + + 0x07,0x1A,0x48,0xB9,0x77,0xA9,0xCD,0x1C,0x64,0xAA,0x5F,0x82,0xF0,0x56,0x95,0xB5, + + 0x2A,0x11,0xC7,0x07,0xEB,0xAF,0x24,0x6B,0x40,0xD1,0x6D,0x07,0xF3,0xF8,0x3E,0x68, + + 0xCC,0x3C,0xA6,0x0C,0xBC,0x60,0x32,0x48,0xE9,0x2D,0x76,0x67,0x43,0xBA,0x20,0xFB, + + 0x0C,0xE9,0x96,0x8E,0x99,0x89,0x46,0xFC,0xD9,0xDF,0x84,0x1B,0x4E,0xFF,0x5F,0xEA, + + 0x47,0xD3,0x9F,0xC8,0xB2,0xBB,0x57,0xEB,0x52,0x57,0xFE,0x4F,0x58,0xF8,0xC3,0xE8, + + 0x88,0x1D,0x4F,0x9F,0xC2,0x32,0x6F,0xBE,0x4E,0xC0,0x35,0x40,0xCE,0xA9,0x60,0x0A, + + 0x22,0x17,0x76,0x26,0x5F,0xF1,0x26,0xE2,0x0D,0xFC,0x42,0x9C,0xDD,0xBD,0xB5,0xB8, + + 0x6C,0x6D,0x42,0x36,0x0E,0xF0,0x06,0x88,0x5C,0xF9,0x3A,0x7B,0x71,0x77,0x61,0x2D, + + 0x2C,0x9A,0x1C,0xC7,0x1B,0x41,0x0F,0x69,0xCC,0x0E,0x97,0xED,0xA7,0xF3,0x79,0xB9, + + 0xC7,0x92,0x08,0x20,0xAD,0xF2,0x85,0x08,0xF7,0x93,0x38,0xDB,0x1A,0x74,0xA7,0xA0, + + 0xD8,0x23,0x91,0x80,0x63,0x4B,0x2A,0x85,0xB3,0x02,0x50,0xDD,0x1C,0xFD,0x53,0x7B, + + 0xD4,0x6D,0xF0,0xFC,0x93,0x6C,0x8E,0x2B,0x71,0x03,0x75,0x10,0xC8,0x9C,0xC1,0xF9, + + 0xFD,0x40,0x3A,0xE7,0x3C,0xDF,0xDA,0xA8,0xE4,0xB6,0xE9,0x38,0x88,0xBC,0xCD,0x4F, + + 0x8F,0x1D,0x72,0x1D,0x34,0xDC,0x42,0x4C,0xC7,0xD8,0xB4,0xC5,0x2E,0x9C,0xD6,0x32, + + 0xE9,0xC5,0xD2,0xD9,0x14,0xBF,0x2E,0x49,0x21,0xBB,0x98,0x25,0xBB,0xC5,0x88,0xA8, + + 0x82,0x08,0xF0,0x65,0x6F,0x9A,0x26,0x4C,0xA8,0xB4,0x96,0x12,0xAC,0xC8,0x1B,0xEF, + + 0xEA,0xC7,0x1B,0x27,0x61,0x43,0x2F,0x59,0x29,0xF7,0xD3,0x96,0xB6,0x7D,0x51,0xC4, + + 0x7B,0xC6,0xF7,0x69,0xE1,0xB8,0x63,0x82,0xAF,0xCC,0x4B,0x32,0x0D,0x6D,0x7F,0xF7, + + 0x6B,0x28,0xBC,0x24,0x1E,0x93,0x2F,0x76,0xC5,0x2A,0x69,0xC4,0x13,0x25,0x30,0xA8, + + 0x98,0x4B,0x31,0xFE,0xB5,0xD4,0x61,0x4B,0x79,0x0B,0xCA,0xD4,0x12,0x24,0x15,0xA8, + + 0x63,0x4E,0x4A,0x89,0xEB,0xE1,0xB8,0xAC,0x5B,0x75,0xEC,0x5F,0x2B,0xC5,0x54,0x1F, + + 0xEA,0x66,0xF3,0xF5,0x41,0x66,0x40,0xD9,0xCF,0xD0,0x66,0x47,0x54,0x1D,0xF5,0x79, + + 0x0C,0x07,0x2E,0x37,0xC4,0xB1,0xA3,0x59,0x26,0x0E,0xC7,0x9C,0x75,0xCD,0x5F,0x26, + + 0xC1,0x1C,0x5B,0x67,0x63,0xB8,0x0B,0x88,0x5D,0xEC,0x9D,0x47,0x3F,0x98,0x43,0x0E, + + 0x77,0xA8,0x20,0x0D,0x8E,0x5B,0x08,0x2B,0x6B,0x47,0x41,0x87,0x7F,0x67,0x03,0x4C, + + 0x5F,0x1E,0xD8,0x62,0xAB,0x2B,0xCD,0xFD,0xB8,0x0B,0xCD,0xF9,0xF8,0x8B,0xFB,0x70, + + 0x64,0xB1,0x7F,0x74,0x1F,0xC1,0xD0,0x6A,0xDB,0xCF,0x20,0xC6,0xCF,0x1C,0x5E,0xDA, + + 0x27,0xAA,0xC4,0x80,0x52,0x5A,0xD5,0x34,0x12,0x9A,0x99,0xEA,0xC4,0xAD,0x51,0x72, + + 0x24,0x9F,0xFC,0xE3,0x3D,0xE4,0x2B,0x89,0xE6,0xE9,0x72,0xCB,0x26,0x78,0xAD,0x61, + + 0x10,0xB2,0x1A,0x7F,0x44,0x7C,0xDD,0x49,0x58,0x8F,0x32,0xDA,0x2C,0xCF,0x1F,0xC6, + + 0x83,0x94,0xBD,0xA2,0x13,0xC5,0x54,0xA7,0x9F,0xF2,0xC2,0xE6,0x90,0x81,0x13,0xB1, + + 0x25,0x8E,0xF2,0x19,0xF9,0x6F,0x14,0xE5,0xB7,0x84,0xE6,0x07,0x1B,0xFE,0x3D,0xB2, + + 0xCA,0x54,0x05,0x1C,0xE7,0x5A,0xC2,0x9F,0x28,0x87,0xC3,0xE1,0xDD,0x95,0x97,0xA2, + + 0x93,0x18,0xCF,0x2A,0x3E,0x9A,0xFA,0xCC,0x2B,0xB6,0x1C,0xC4,0x9B,0x35,0x52,0x7B, + + 0xAC,0x95,0xDC,0x69,0x40,0x27,0xBA,0x2D,0xBD,0x3A,0xAD,0xF7,0x28,0x7C,0xD7,0xC3, + + 0xD4,0xA5,0xB6,0xAD,0x98,0xC6,0x25,0xE7,0x6F,0xA3,0x0E,0x51,0x31,0xC2,0x55,0xDE, + + 0xAE,0x11,0xBD,0x6B,0x45,0x9B,0x7E,0x42,0x13,0xA6,0xBD,0xF2,0x01,0x86,0x24,0xE7, + + 0x78,0x59,0xB0,0xAC,0x18,0x9A,0xBE,0xC6,0x02,0x54,0x60,0x40,0xC1,0xA0,0xF2,0xBB, + + 0x12,0x13,0x89,0x5F,0x69,0xBC,0xC3,0xF9,0x06,0xF1,0x8D,0xEA,0xDB,0xFB,0xDE,0x5C, + + 0x58,0xE6,0xCF,0x1C,0x71,0xE0,0x56,0x4B,0x82,0xEC,0x1E,0x18,0x54,0xDD,0x41,0xF8, + + 0x82,0xF3,0x3C,0xB2,0x37,0xB8,0xC1,0xAE,0x28,0xFE,0x57,0xFC,0x06,0xDF,0xF2,0x3B, + + 0xCB,0x4D,0x63,0x4F,0xAB,0x35,0x25,0x19,0xE7,0xF2,0xC9,0x8E,0x93,0x13,0x36,0xA3, + + 0xEF,0xC4,0x5F,0xF6,0x59,0x01,0x0D,0x7C,0xC9,0xA2,0xF8,0x83,0x37,0xD1,0x70,0xFE, + + 0xD1,0xC2,0x17,0xF4,0x31,0x55,0x47,0x6D,0xB4,0x3D,0x80,0x5F,0x76,0x20,0x1B,0xB3, + + 0x49,0xC0,0xB0,0x83,0xE7,0xE6,0x9A,0xA6,0x57,0xFD,0xA2,0xA3,0xA7,0xA6,0x8E,0xB6, + + 0x6C,0x80,0x3F,0x93,0xCE,0x7B,0xF9,0xEE,0x51,0x37,0x0C,0x97,0x9D,0xE0,0xC7,0x6B, + + 0xCE,0x45,0xE1,0x69,0x2A,0x11,0x48,0x82,0x32,0x71,0x1C,0x8E,0x6B,0xA9,0xFA,0x15, + + 0xC5,0x25,0xFD,0xD2,0x30,0x9F,0x20,0x72,0xCA,0x38,0xF0,0x6E,0xAF,0x24,0xF7,0x52, + + 0xE2,0x2B,0x76,0x7D,0xE2,0x53,0xE7,0x5C,0xF6,0x84,0x16,0xEF,0x73,0x30,0x61,0x85, + + 0x6E,0x66,0xB3,0xDB,0xFF,0x66,0x1F,0x4A,0x32,0x61,0x4E,0x46,0xD1,0xCC,0xE2,0xF3, + + 0x0C,0xCA,0x15,0x3B,0x18,0xA3,0x27,0x59,0x20,0x8A,0xE8,0xAE,0x60,0xAA,0x17,0x44, + + 0x80,0xEB,0x92,0x8E,0xBE,0x22,0xE0,0xBE,0x3E,0xF4,0x7A,0xC7,0x74,0xAB,0x78,0xFF, + + 0x8A,0x11,0xDB,0x8D,0x59,0x1C,0x6C,0x2B,0xCA,0x51,0xE8,0x29,0x2D,0xE5,0x80,0x9E, + + 0x1E,0xB4,0x77,0x26,0x2E,0xE6,0x90,0x7C,0xC3,0x17,0xE0,0xCB,0x7C,0xB4,0x18,0x2A, + + 0x66,0x07,0x22,0xB6,0x9A,0x27,0x61,0xAA,0x02,0x18,0xA4,0x51,0x36,0xAE,0x31,0x5C, + + 0xE6,0x6C,0xCA,0x54,0xBE,0xA4,0xEC,0x56,0xB7,0x2C,0xDA,0x25,0xA3,0x4C,0x76,0x7A, + + 0xE6,0xCC,0xE7,0xAD,0xBA,0xA8,0x60,0x74,0xB6,0x6A,0xAF,0x42,0x96,0x2F,0x13,0x6B, + + 0x99,0xCD,0x39,0xAF,0xB0,0x5E,0xCC,0x52,0xC9,0xC4,0x3B,0x9A,0xB1,0x4F,0xA4,0xCD, + + 0xB1,0x4D,0x9C,0x7D,0x43,0x30,0x06,0x59,0x94,0xDF,0x01,0x22,0x2B,0xE6,0x1F,0x36, + + 0xDD,0xF2,0xF3,0x9A,0x94,0x2E,0x0E,0x8B,0x9A,0x7C,0xF2,0xD0,0x8A,0x5C,0x8C,0xCC, + + 0x59,0xEE,0xFF,0x1C,0xCC,0xF0,0x0B,0x8A,0x0F,0xDD,0x8F,0x54,0x9C,0xE9,0x9E,0x37, + + 0x59,0xF0,0x6D,0x6E,0xF9,0xBE,0x45,0x0B,0x12,0x92,0xAB,0xF0,0x2B,0xF9,0xA4,0x3A, + + 0xA2,0x1F,0x63,0xB9,0xE2,0xBB,0x67,0x10,0x47,0x9E,0x96,0xE2,0x77,0x19,0x33,0xB3, + + 0x21,0x0E,0xCD,0xB4,0xC0,0x48,0x69,0xC0,0x07,0x27,0x82,0xF0,0x96,0x76,0x61,0x21, + + 0x5B,0xD4,0xD7,0x38,0x34,0xB2,0x2B,0x01,0xE2,0x7B,0x65,0x17,0x5B,0x07,0xB7,0xA9, + + 0x04,0xF2,0x41,0x49,0xB6,0xD7,0xBD,0x0B,0x80,0xDA,0x53,0x04,0x7B,0xFA,0xE6,0x8E, + + 0xB1,0x65,0x4A,0x14,0x3D,0x38,0x91,0x82,0x6A,0x83,0x28,0x5E,0x53,0x59,0xD5,0xBE, + + 0xC6,0xFD,0x73,0x9E,0xC8,0x33,0xC5,0xB2,0xC8,0x26,0x73,0x4E,0x82,0x56,0xB2,0x74, + + 0x59,0xC9,0x7A,0x8E,0x3C,0xFA,0xE2,0x43,0x38,0x97,0xA1,0x45,0x59,0xF3,0x17,0xAA, + + 0x0C,0x24,0xAB,0xF2,0x9C,0x1B,0x61,0x59,0xE9,0x76,0xAE,0x4C,0xC5,0x54,0x59,0x28, + + 0x0A,0x68,0x6A,0x07,0x7E,0xFD,0x8D,0xCD,0xCF,0x7D,0x0D,0x1E,0x76,0x0D,0x0E,0xF5, + + 0x2D,0x90,0xA0,0xB8,0x7D,0x42,0xAD,0x04,0x04,0xD2,0xD7,0x0D,0xF3,0x20,0xF5,0x4F, + + 0x85,0xCA,0xDD,0x3C,0xD6,0xA5,0x60,0x14,0x07,0x4F,0x89,0xE9,0x1F,0x7D,0x11,0xF3, + + 0x03,0x92,0xD1,0xEE,0x32,0x49,0xFF,0x88,0xDF,0x5A,0x87,0x0F,0x4E,0x0E,0x7E,0x06, + + 0xE1,0x83,0x20,0xF4,0x18,0x2F,0x49,0xDC,0xE5,0x7C,0x96,0xF0,0x0C,0x45,0xF3,0xE0, + + 0x45,0xF0,0xD3,0x12,0xA4,0x2E,0x8D,0xDA,0xF8,0x0E,0xD1,0x09,0xE2,0x2C,0xAF,0xF2, + + 0x0C,0x0F,0xDB,0x2C,0xAC,0x60,0x1C,0x6A,0xA3,0xF8,0xC6,0x57,0x2F,0xE9,0x77,0x17, + + 0x60,0x80,0xA9,0x05,0x85,0x74,0x9C,0x9E,0x89,0x8D,0x81,0xC5,0xD7,0xD8,0x44,0xA2, + + 0x5E,0xF9,0xB8,0xC6,0x17,0x7E,0x30,0x21,0xC6,0x49,0xAE,0x55,0x31,0x36,0x7C,0x47, + + 0x27,0xF1,0x92,0xA9,0xB0,0x40,0xD0,0x1C,0x20,0x65,0x78,0x16,0xDC,0xE3,0x5B,0x45, + + 0xA3,0x46,0xB9,0xC7,0x97,0x2F,0x1B,0x9A,0x61,0x40,0xC7,0x54,0xD4,0xFD,0xDB,0xA1, + + 0x95,0x45,0x93,0xAA,0x30,0x21,0x21,0xF3,0xC2,0x25,0xDD,0x35,0x9B,0x92,0x2B,0xFB, + + 0x84,0xD5,0x84,0xDF,0x04,0x0C,0x28,0xC7,0x7B,0xE2,0x40,0xA8,0x2B,0xBE,0xA5,0x43, + + 0xBC,0xB5,0xD0,0xC5,0x6D,0x36,0xFD,0xF8,0x7E,0xC2,0xC5,0xB8,0x5F,0xF2,0x7B,0x2D, + + 0x55,0x77,0x63,0x29,0x79,0xF5,0xAB,0xD6,0x75,0x26,0x53,0xD4,0xD1,0x28,0x20,0x66, + + 0x58,0xA0,0x33,0xE2,0xDA,0xDB,0xC7,0x14,0x7A,0x06,0x2C,0xBF,0x59,0xD3,0x19,0x4B, + + 0xAB,0xA3,0x92,0x63,0xBB,0xA6,0x6A,0x38,0x4E,0x43,0xC4,0xE8,0x3D,0x1C,0x70,0xA6, + + 0xFE,0x61,0x06,0x3E,0x5A,0x6D,0x3A,0x38,0x4D,0x40,0x76,0xEE,0x13,0x65,0xD5,0xCD, + + 0xA1,0x5A,0x34,0xAF,0x18,0x66,0x6B,0x39,0x8A,0x41,0xD5,0x5C,0x33,0xCF,0x2D,0x6C, + + 0x88,0x2E,0xB3,0x3F,0xDA,0x0F,0x51,0x78,0x68,0x2A,0xE5,0x59,0xE8,0xC5,0x3F,0xB2, + + 0x40,0xA3,0x7F,0xFB,0xBD,0xE6,0x2A,0x24,0x03,0x92,0x20,0xC6,0x8B,0x1E,0x57,0xFB, + + 0xF4,0x7D,0x53,0xF6,0xC6,0xBE,0x64,0x40,0x3A,0x00,0x48,0x5C,0x52,0x3C,0xC5,0x79, + + 0xC7,0x50,0xCD,0x38,0xB6,0xA9,0xD5,0x59,0x0E,0xAF,0x55,0x5C,0x28,0x7A,0xC9,0xCF, + + 0xAF,0x0D,0x95,0x25,0xB7,0xA8,0x64,0xDA,0x46,0x57,0xFA,0x4E,0xE3,0x3E,0x29,0xE4, + + 0xA0,0x5C,0xFC,0x14,0xCC,0x3B,0x2C,0x62,0x63,0x33,0xAB,0x19,0x64,0xAF,0xC4,0x7D, + + 0x80,0x13,0xC4,0x36,0x9F,0xBE,0xA2,0x92,0x22,0x75,0x85,0x25,0xD6,0x7C,0xE3,0xB3, + + 0x01,0x10,0xA5,0x81,0x93,0xBD,0x6F,0x03,0x60,0x5E,0x60,0x61,0xAD,0x60,0x41,0xC5, + + 0xC0,0x57,0x49,0x37,0x31,0x3F,0x25,0x73,0xE2,0x90,0x4B,0x71,0xCC,0xCD,0x7B,0x77, + + 0x4B,0x05,0x19,0xEE,0xCB,0x5D,0x1A,0x58,0x50,0x29,0xF5,0x56,0xF5,0x3A,0x5C,0xCF, + + 0xC2,0x7D,0xD1,0x29,0x3F,0xA2,0x64,0x58,0x07,0xD2,0xFE,0xEB,0xB8,0x74,0x10,0x7A, + + 0x2C,0x97,0xBF,0x76,0x4D,0x78,0xD7,0x51,0x6C,0x57,0xC8,0xB6,0xFB,0xFB,0xB0,0x7B, + + 0x8D,0x00,0x38,0x6C,0x1A,0x7B,0xC3,0x94,0x5A,0x16,0xE4,0x9A,0x58,0xC4,0x3E,0x4A, + + 0x23,0x9C,0x06,0xAE,0x79,0x43,0x6E,0x38,0x36,0xD4,0x16,0x09,0x19,0x7A,0xF1,0x28, + + 0x63,0x12,0xB6,0xBE,0x78,0xE2,0xAE,0x9A,0x28,0xAD,0xAC,0xF8,0x77,0x15,0x45,0x2B, + + 0x28,0x36,0xBF,0xAF,0xF9,0x81,0x4F,0x0B,0x68,0x56,0x7D,0x76,0x5B,0x81,0x2F,0x98, + + 0x5E,0x12,0xB7,0x5F,0xBE,0xBE,0x55,0x79,0x48,0x59,0x92,0xFC,0x06,0x11,0x58,0x06, + + 0xF5,0xC2,0xB8,0x82,0x4A,0x5D,0x28,0xC2,0x27,0xF1,0x88,0xA3,0x5A,0x82,0x15,0x4C, + + 0x88,0xE3,0xAE,0xC2,0x95,0xB1,0x00,0xDC,0xA6,0xC8,0x3F,0xB2,0x2E,0xC9,0x7A,0xE6, + + 0x82,0x19,0xEB,0x1A,0xB5,0x22,0xA4,0xA7,0xB7,0x86,0xFB,0xBA,0xF6,0xEF,0x82,0x96, + + 0x16,0xBC,0xF3,0xB9,0xE1,0xE1,0x2B,0xC3,0x9E,0x92,0x79,0xCF,0x03,0xA1,0x3A,0xC2, + + 0x72,0xC6,0x98,0xC4,0x13,0x9D,0x48,0x32,0x66,0xCB,0x48,0x99,0x65,0xDD,0xF7,0x32, + + 0x09,0x0E,0x60,0x2E,0xB4,0xA3,0x18,0x32,0x41,0xC8,0x98,0x20,0x8D,0xEA,0x3A,0x45, + + 0x27,0x39,0xBB,0x46,0x35,0xA0,0x49,0x33,0xC7,0xC9,0x49,0x99,0x5B,0x10,0x7C,0x6A, + + 0x81,0x1C,0xE5,0xC0,0xD7,0xA8,0x33,0x88,0x64,0xCA,0xA0,0xA6,0x22,0xA8,0xDD,0xFA, + + 0xA1,0x39,0xF9,0x4C,0xFD,0xA7,0x4B,0x4C,0xF7,0x42,0xED,0x9A,0x5A,0x53,0x84,0xE9, + + 0x81,0x74,0xAC,0xC0,0x39,0x24,0x70,0xD8,0xD4,0x35,0x05,0xDE,0x10,0xEF,0x5D,0x0D, + + 0x6D,0x09,0x1C,0xE9,0xC8,0x7D,0xB4,0x4B,0x8C,0xF6,0x73,0xAB,0xAF,0x1F,0x53,0xEA, + + 0x2E,0xCB,0x54,0xF7,0xD6,0xE6,0x82,0x64,0xCB,0xA0,0x92,0x80,0x7C,0x74,0xC2,0xBA, + + 0xF1,0x83,0x82,0x0A,0x22,0x2E,0x78,0x7A,0xED,0xCA,0x29,0x30,0x21,0xF6,0xAA,0xA2, + + 0x8B,0x80,0xCE,0x3C,0x5C,0x12,0x02,0xF8,0x4E,0xA0,0x3A,0xA3,0xCD,0x60,0x39,0xC7, + + 0xE6,0x4F,0x9B,0x6B,0x1C,0xE6,0xFB,0x5B,0xAD,0xEE,0x2E,0x7E,0x3F,0x51,0x29,0xB9, + + 0xDB,0x8B,0x93,0xDD,0xBD,0xDA,0x03,0xF9,0xCE,0xAA,0x85,0xAB,0xE0,0x4F,0x83,0xF4, + + 0xCF,0x31,0x1B,0xB4,0x54,0x03,0xD8,0x31,0x0C,0xD8,0x74,0x5F,0xE6,0xF8,0xB9,0x16, + + 0x56,0x9D,0xD7,0xB1,0x94,0x0E,0x67,0x09,0xC4,0xDA,0x84,0x4C,0xD9,0xFC,0x1F,0x6C, + + 0xC7,0xC5,0x65,0x7F,0xD3,0xBF,0x22,0xD1,0x53,0x90,0x73,0x25,0x39,0xEE,0x15,0xF3, + + 0xFF,0x18,0x6D,0x6F,0xCA,0xBE,0x29,0x37,0x86,0x11,0xC2,0x5F,0xD2,0xBE,0x6E,0xC6, + + 0x85,0x99,0xDE,0x24,0x9A,0xBB,0x7C,0x40,0x05,0x24,0x96,0xE2,0x77,0x14,0x64,0x46, + + 0xC6,0x9A,0x94,0x54,0x15,0x15,0x1C,0xB2,0x29,0x55,0xB1,0xF2,0x53,0xB7,0x6F,0xC2, + + 0x05,0x90,0x85,0x83,0x7A,0x36,0x0D,0xC4,0x07,0xD9,0xAB,0x33,0xFA,0x9E,0x0D,0x93, + + 0x45,0x4A,0xD7,0x35,0x35,0xB4,0x05,0x71,0xE2,0xF3,0xA1,0x3C,0xF1,0x9C,0xE7,0xA7, + + 0x2A,0x03,0x66,0x77,0x39,0xFA,0x99,0xC4,0xB1,0x9A,0xD1,0x55,0x6E,0xB5,0x74,0x43, + + 0x11,0x86,0x71,0xFC,0x5D,0xA3,0xC8,0xC5,0xCE,0x52,0xE1,0x34,0x7C,0x39,0x87,0xE9, + + 0x8F,0x18,0xFC,0xB0,0xBA,0x21,0xEB,0xD8,0xEA,0x41,0xD4,0x55,0x71,0xB8,0x97,0x70, + + 0x8E,0x5B,0xD6,0x6F,0x3D,0xF4,0xFE,0x97,0xEB,0x40,0xDF,0xF5,0x17,0x70,0x1E,0xED, + + 0xD3,0x93,0xB3,0x2C,0xBC,0xBF,0x4E,0xBA,0x66,0xD3,0xDF,0x6A,0x11,0x07,0x64,0xDE, + + 0x8C,0x9B,0x6B,0x3C,0xBD,0xBE,0x74,0xF8,0xCC,0xDB,0xA0,0x6A,0x79,0x56,0x07,0x8A, + + 0x2A,0x93,0xA0,0x2D,0x3C,0xBD,0x17,0xAF,0x6E,0xD3,0x37,0x1F,0xA1,0xBC,0x67,0x7E, + + 0x4E,0x90,0x79,0x3D,0x9B,0x32,0xF7,0x2F,0x8C,0xBF,0x2A,0xDB,0xFF,0xFF,0x3A,0xF3, + + 0x6C,0x1B,0xE6,0xDC,0x9F,0xA6,0x05,0x11,0x61,0xBF,0xB7,0xA0,0x2B,0xCB,0xF0,0xE3, + + 0x69,0xAC,0xB6,0xD9,0xDB,0x7B,0x43,0x3E,0x47,0xDA,0xA0,0x5A,0xD0,0x6C,0x1C,0xE7, + + 0xB3,0xC8,0x83,0xC5,0xCD,0x4E,0xAA,0x90,0xF0,0x00,0xB9,0x47,0x69,0x6E,0x1F,0x56, + + 0x4B,0xD9,0x65,0x87,0xD1,0x2B,0xF4,0x71,0xC5,0x62,0x24,0x77,0x70,0x21,0xBB,0x67, + + 0xA3,0x66,0xC5,0xC0,0x5A,0x07,0xD3,0x93,0x29,0xE9,0xA8,0x8C,0x6B,0x29,0xFF,0x79, + + 0xFE,0x66,0x97,0x73,0x91,0xE9,0x62,0x9F,0x38,0xBA,0x64,0x33,0x5D,0x6A,0xBC,0x0F, + + 0x77,0x5A,0xA1,0x13,0x18,0x64,0x49,0x93,0x82,0xB9,0xC9,0x71,0xE9,0xB2,0x2F,0x33, + + 0x74,0xFA,0xAD,0xD1,0xE0,0x3B,0x99,0x98,0x2E,0xEA,0x49,0x07,0x28,0x25,0x0A,0x0C, + + 0x20,0x11,0x00,0x7F,0x43,0x81,0xD8,0x5B,0x2C,0x41,0xCD,0x74,0xA4,0xA3,0x74,0x1E, + + 0xE8,0x8A,0x97,0x7A,0xE2,0xA8,0x22,0xC7,0xA0,0x58,0x1E,0xDE,0xDA,0x64,0x59,0x8F, + + 0xE0,0xAB,0xC8,0x6D,0xE6,0x31,0x55,0x5A,0xF0,0xEB,0xE8,0xD6,0x2F,0x28,0xBA,0xEA, + + 0x05,0x06,0x57,0xF7,0xFA,0xD4,0xCF,0xC7,0xAA,0x9B,0x66,0xFF,0x78,0x34,0x55,0xB3, + + 0xFF,0x9F,0x02,0x5C,0x25,0xA1,0x99,0xF8,0xB5,0xE1,0x8D,0x52,0xFB,0xC7,0xB5,0x22, + + 0x0D,0x96,0x71,0xEC,0x13,0x3F,0x59,0x6B,0x10,0xE6,0xA2,0x94,0x57,0xB1,0x38,0x32, + + 0xE2,0x03,0x54,0xA5,0x10,0x61,0x1C,0x2E,0x14,0x44,0xAB,0x78,0x3A,0xBB,0x2B,0xA7, + + 0x27,0x02,0x33,0xDF,0x1B,0x97,0x61,0x96,0xB0,0x6F,0x77,0xF8,0x0E,0x0D,0x84,0xA1, + + 0x67,0xBD,0xDB,0x88,0x36,0x90,0x00,0x74,0x66,0xEB,0xCA,0x5E,0x8B,0xAF,0x32,0xB8, + + 0x27,0x8A,0x1A,0x67,0x5D,0x2A,0x3A,0x84,0x76,0xF5,0xA4,0x5B,0xF2,0x7C,0x10,0xB0, + + 0x01,0xED,0xE2,0x75,0xF0,0x93,0x0C,0x51,0xE8,0x5D,0x55,0xA0,0x53,0x7C,0x6D,0x6B, + + 0x0D,0x1E,0x90,0xF3,0xF1,0x7C,0x8F,0x7C,0x29,0xF2,0x64,0x77,0x50,0x4C,0x32,0xC0, + + 0x22,0x14,0x00,0x41,0x3C,0xBE,0x99,0xA7,0xBC,0x5E,0x53,0x9B,0xF2,0x9B,0x8C,0xC1, + + 0xC9,0x15,0x95,0x56,0x96,0xEA,0x81,0xF1,0x82,0xEA,0xE2,0xF9,0xAF,0x7A,0x45,0x43, + + 0x67,0x30,0xC1,0x65,0x13,0xB4,0x56,0xF2,0xFD,0x9D,0x8C,0x6D,0x57,0x89,0x4D,0xD1, + + 0xA3,0x9A,0xCC,0xB3,0x4C,0x5B,0x82,0xF0,0xE5,0x6C,0xEF,0x0A,0xC0,0x57,0x79,0x60, + + 0xAE,0xD5,0x3E,0xCB,0xFA,0x98,0x5D,0xBB,0x00,0xE2,0xFE,0xCE,0xFA,0xB4,0x54,0x9A, + + 0x9A,0x84,0x88,0xB5,0xD0,0x08,0x47,0xC1,0x98,0x16,0xFE,0xEA,0xA9,0x74,0xFA,0xCE, + + 0x51,0x6C,0xCF,0x09,0xF0,0xFB,0x77,0xFE,0x1D,0x55,0xF3,0x29,0x8B,0x75,0x15,0x9B, + + 0x3B,0x11,0x97,0x99,0xB1,0x78,0x1E,0xC2,0x4E,0xD6,0x89,0x85,0x5A,0x7D,0x26,0x9E, + + 0xB6,0x13,0x9F,0x28,0x9F,0xCA,0xE8,0xF9,0x01,0x74,0x2E,0x04,0x32,0x31,0x10,0xAB, + + 0x40,0x73,0x76,0x42,0x21,0x52,0x9E,0x00,0xB6,0x46,0x5B,0x9A,0xF4,0xFB,0xF3,0x2B, + + 0x62,0x84,0x9A,0x4E,0x15,0x2C,0x1A,0x6B,0x2F,0xEA,0x40,0x0B,0x1B,0xD1,0x29,0x00, + + 0xA8,0xB4,0x5F,0xAF,0x50,0x9E,0x5A,0x7D,0xA3,0x7C,0xC5,0xBD,0xE1,0x32,0x78,0x06, + + 0x2C,0x09,0x58,0x41,0xE9,0x26,0xF0,0xDA,0x86,0x82,0xD8,0x44,0xEF,0xEE,0x50,0x20, + + 0xCD,0x8E,0xCA,0x14,0x16,0xF1,0x2C,0xE6,0xAC,0x60,0x78,0xCE,0xF6,0xE7,0x1F,0x32, + + 0x4C,0x8B,0x5E,0x79,0xF5,0xA6,0x6A,0xEC,0xC5,0x82,0x89,0xA5,0x11,0x56,0x38,0xE0, + + 0xBD,0x0E,0xF0,0x6B,0x30,0x5C,0x21,0xA3,0x48,0x6E,0x13,0xB4,0xD3,0x58,0x9F,0x85, + + 0x98,0x59,0xD8,0xB9,0xD7,0xC6,0xC7,0x02,0x40,0xFF,0x99,0x8D,0xA9,0xA6,0xD1,0x0C, + + 0xDA,0xF8,0xD0,0xC6,0x24,0x71,0x7E,0x86,0xC7,0x22,0xFF,0xCD,0x91,0x88,0x80,0x03, + + 0xC2,0x5A,0x25,0x97,0x9A,0xA5,0xCF,0x70,0x9D,0x6D,0xAE,0x59,0x2B,0xE9,0xC6,0x20, + + 0xB3,0x26,0x51,0xAD,0x87,0xEA,0x47,0xBF,0xE6,0xB7,0x69,0x31,0xD3,0xA7,0x5C,0x3E, + + 0xE5,0x49,0xF8,0xEB,0x64,0xB7,0x27,0xB9,0x6D,0x37,0xEC,0x6C,0xFD,0xD5,0xAA,0x3B, + + 0x6C,0xCB,0x6A,0x0F,0x5C,0x22,0xFA,0xC2,0xD9,0x8B,0x82,0x51,0xDC,0xE4,0x8F,0x98, + + 0xAD,0x82,0x1C,0xE9,0xAF,0xF0,0x0D,0x03,0x0E,0xCA,0x9B,0x4D,0x69,0xE6,0x74,0x73, + + 0x2C,0x82,0xCC,0x2E,0xF1,0xE9,0x60,0xF4,0xCC,0x8B,0x7B,0xC6,0x8C,0x1E,0x3C,0xB9, + + 0x65,0xB1,0x9D,0x09,0x2D,0xA7,0x0C,0x9E,0x71,0x33,0xB3,0x6E,0x7C,0xBC,0xEA,0xB3, + + 0x36,0x8B,0x16,0xD6,0xBA,0x3B,0xBA,0x93,0xA2,0x60,0x79,0x78,0x7B,0x40,0x75,0xBF, + + 0x65,0x45,0x5B,0xD4,0xA5,0x5A,0x49,0x90,0xB1,0x31,0xF5,0x29,0xCA,0xAC,0xC1,0x40, + + 0x89,0x2F,0xAE,0xB8,0x62,0x23,0x63,0xEB,0x30,0x62,0x7E,0x9F,0x97,0xAD,0xA4,0xA3, + + 0x63,0x3D,0xA2,0xAE,0x3C,0xF3,0x6D,0x21,0x83,0x25,0x1E,0xA9,0xD5,0x53,0x34,0x8A, + + 0x46,0xD3,0x3C,0x88,0x09,0x45,0xF7,0xCE,0x63,0x43,0xA9,0xAD,0x41,0xCD,0x3D,0x13, + + 0xCD,0x53,0xA3,0xB6,0xBC,0xC2,0x20,0x9D,0xD4,0x90,0x20,0x45,0xD0,0x06,0xED,0x6B, + + 0x67,0xD1,0xBE,0x50,0x5C,0x22,0x3B,0x5B,0x9C,0x9E,0x00,0xFC,0xF3,0x48,0x42,0x0E, + + 0x41,0x39,0xBD,0xAF,0x93,0x4B,0x14,0xB4,0xBE,0x96,0xE6,0x7C,0xD1,0xEF,0x24,0x96, + + 0x21,0x2E,0xA4,0x57,0x54,0xDE,0x5B,0x76,0x14,0xC9,0xA5,0xF6,0xD2,0x75,0xBF,0x04, + + 0x6C,0xEC,0xDB,0xF6,0x3B,0x40,0x2A,0xC4,0x64,0x1A,0xD1,0x17,0xFE,0xB9,0x7F,0x57, + + 0xD4,0xC3,0xFB,0xE6,0x04,0xFA,0xBD,0xE3,0xD8,0x5A,0x05,0x91,0x78,0x71,0x7D,0x45, + + 0x2D,0xD8,0xC4,0x8E,0xD5,0xC9,0xCD,0xA2,0xC9,0x27,0xA4,0xF5,0x81,0x44,0x6C,0xEB, + + 0x45,0x90,0xF0,0xB3,0x6D,0x12,0xF3,0xCB,0x7A,0xD2,0x41,0xC4,0x7B,0x62,0x33,0x5F, + + 0x45,0x40,0xC5,0x97,0xBD,0x7A,0xBC,0xCB,0xB3,0x77,0xCC,0xD4,0x94,0xF7,0x6D,0x67, + + 0xAD,0x36,0xBC,0x9F,0x3F,0x77,0xBE,0xFC,0x04,0x61,0xDF,0x99,0x10,0x99,0x9D,0xED, + + 0x8F,0x63,0xFE,0xDF,0xC2,0x1D,0xE1,0x02,0xB2,0x93,0xDF,0xAE,0x66,0x77,0x30,0xAB, + + 0x74,0x96,0xF8,0xDC,0xD6,0xBB,0x86,0x78,0xAA,0xFB,0xC4,0x16,0xF7,0xB2,0xA7,0x22, + + 0x97,0x33,0x27,0x2E,0x82,0x1E,0xCC,0x5B,0xE6,0xCC,0xDE,0x09,0x7E,0x7E,0xFA,0xA8, + + 0xFC,0x96,0x42,0xA2,0xDC,0x40,0xBF,0x03,0x32,0xC4,0xA6,0xE6,0x5A,0x78,0x80,0x15, + + 0xE1,0x1B,0xDE,0xE6,0x14,0xA5,0x05,0x1D,0xAB,0x04,0xA9,0x00,0xBB,0x04,0xF0,0xF8, + + 0x87,0xCC,0xEF,0x29,0xFA,0x65,0xBC,0x14,0xB6,0xBC,0x67,0x4E,0x27,0xBE,0x86,0xE7, + + 0xB3,0xB2,0x93,0xBC,0xB4,0xA9,0x2B,0x91,0x7C,0xED,0xA9,0xDD,0xD0,0x93,0xF6,0xD6, + + 0xB2,0x1A,0xB3,0xA5,0x00,0x8C,0x0F,0x53,0x3E,0x9E,0x09,0xB7,0x1C,0xDF,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xBA,0x97, + + 0x6B,0x0C,0x26,0x28,0xF3,0x4C,0xC6,0xD6,0x2B,0x4A,0xAA,0xB7,0xDA,0x84,0x10,0x1A, + + 0xC3,0x06,0xF5,0x63,0x71,0x24,0xEF,0x84,0xA2,0x2D,0xFA,0x6B,0x96,0x64,0x7D,0xEB, + + 0x9A,0x47,0xBB,0xF7,0x34,0x27,0x84,0xDA,0x4C,0xC1,0xB8,0x4F,0x0A,0x2B,0x43,0x99, + + 0xBA,0x4F,0x99,0x96,0x72,0x6F,0x23,0x1D,0x22,0x2F,0xFC,0xBF,0x14,0xA5,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x5D,0x80, + + 0x85,0xCF,0x14,0xFB,0x58,0x3D,0x6A,0xA6,0x81,0xD3,0x94,0xA4,0x70,0x70,0x6C,0xDA, + + 0xF9,0x1C,0xB6,0x24,0xFC,0x70,0xE1,0xFE,0x94,0x0D,0x9C,0xB4,0x71,0x71,0xE9,0x1E, + + 0xA1,0x80,0x97,0x53,0x5B,0x76,0x3C,0x52,0x6C,0x13,0x95,0xA5,0xF0,0x72,0x0F,0x6E, + + 0x54,0x7D,0x3E,0xB8,0x4D,0xA2,0x27,0x5A,0x52,0x5E,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xE1,0xC8, + + 0x22,0x1E,0x2B,0xF3,0xA5,0x64,0x6D,0x8F,0xC9,0xE7,0x96,0xAC,0x78,0x78,0x8B,0x38, + + 0x0D,0x79,0xF7,0xB8,0x52,0x36,0x26,0x47,0x4D,0x86,0x9E,0xBC,0x79,0x79,0x23,0xC4, + + 0x09,0x11,0x3C,0xC3,0x59,0x05,0xA3,0xCB,0x1F,0x3F,0x97,0xAD,0xF8,0x7A,0x5F,0xB8, + + 0xE1,0xE0,0x0F,0xAF,0xD9,0x88,0xAB,0xDB,0x66,0xED,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x98,0xFD, + + 0x37,0xFB,0x9A,0xB6,0x85,0xE1,0x08,0xD8,0xE8,0xCD,0x88,0xBC,0x70,0xA2,0x32,0x10, + + 0xCF,0x8E,0x9F,0x76,0x66,0xA1,0x2A,0xA1,0xAE,0x85,0x1D,0x54,0xA2,0x84,0x99,0x9C, + + 0x96,0xCF,0x16,0xF6,0xE3,0xA2,0x4E,0x5C,0xAC,0xCF,0xB7,0xBC,0x56,0x2E,0x21,0x06, + + 0x64,0x98,0x69,0x13,0x08,0x5E,0x03,0x83,0x54,0x6C,0x81,0x13,0xB6,0x7E,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0xEC, + + 0xF3,0x8C,0xB4,0xFA,0xE3,0x35,0x96,0x50,0xEF,0xAD,0xA5,0xDD,0xD8,0x65,0x72,0x36, + + 0x8F,0x65,0x92,0x2E,0xCC,0x06,0xE6,0x17,0xFE,0x84,0x2A,0x3E,0x5D,0xE9,0x30,0xE3, + + 0xD0,0xC7,0x70,0x2B,0x61,0x0B,0x0C,0xC9,0xE8,0x41,0xE1,0x79,0x37,0x8E,0x13,0x79, + + 0xCD,0x74,0x0B,0x6D,0xFF,0x47,0xC4,0xCB,0x7B,0x9A,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0xA4,0x06, + + 0x71,0xA7,0x34,0x77,0x97,0xF0,0x0F,0xD2,0xE4,0xCF,0xB4,0xA6,0x74,0xF0,0x29,0x82, + + 0xC4,0x8A,0xF6,0x6C,0x5D,0x80,0xAC,0xD0,0x92,0xB4,0xBC,0xB6,0x75,0xF1,0x75,0x9E, + + 0xE8,0x91,0x97,0xB7,0xEA,0xF3,0x8E,0xD3,0x64,0xC4,0xB5,0xA7,0xF4,0xF2,0x2D,0x75, + + 0x81,0x6E,0xD3,0x91,0xD6,0x44,0x05,0x5B,0xA9,0x92,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x78,0x68, + + 0x28,0x1D,0xF0,0xA6,0xD7,0xDC,0x4F,0xC5,0x10,0x27,0xB6,0xAE,0x7C,0xF8,0x10,0x78, + + 0x4F,0xEC,0x96,0x75,0x91,0xB4,0x69,0x41,0xDC,0x4A,0xBE,0xBE,0x7D,0xF9,0x35,0x2E, + + 0x47,0xDE,0x37,0xED,0x0F,0xDF,0x8E,0x17,0x1B,0xE7,0xB7,0xAF,0xFC,0xFA,0x51,0x9C, + + 0x89,0x10,0x56,0xB8,0x1C,0xC4,0x44,0xBF,0xA5,0x6D,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xEB,0x12,0x80,0x05, + + 0x76,0x8D,0xDE,0x85,0xB1,0x8B,0x52,0x92,0x14,0x40,0xCE,0xA1,0x58,0xCB,0xAC,0x72, + + 0x40,0x81,0x90,0xE5,0x5B,0x21,0x24,0xB2,0x41,0xA7,0xC6,0xB5,0xD3,0xCA,0x7F,0x19, + + 0x02,0x2A,0x41,0x05,0xFB,0xA0,0x19,0x24,0xC4,0x62,0x90,0x05,0x50,0x48,0x71,0xEC, + + 0xC1,0x41,0xD7,0x1D,0xB1,0x88,0x47,0xD3,0xCD,0xC6,0x59,0x35,0xBA,0xE1,0x7E,0x48, + + 0xC0,0x06,0x3F,0xBA,0x14,0xE4,0x46,0xF1,0xA9,0xE6,0xF9,0x23,0x7C,0xE8,0xFB,0xC0, + + 0x05,0xA5,0x08,0x40,0x82,0xA8,0x1A,0x03,0x5F,0x4C,0xF1,0x73,0x52,0xE5,0x49,0xC5, + + 0x7E,0xA4,0xD4,0xC1,0xD6,0xBB,0xEA,0xD0,0x80,0xE9,0x9B,0x78,0x93,0x67,0x05,0x23, + + 0xEB,0xA5,0x36,0xD1,0xD7,0xD2,0x2F,0xF3,0xCA,0x3A,0xA3,0xA1,0x53,0x47,0x80,0x6A, + + 0x73,0xDA,0x87,0x0C,0x9A,0x20,0x3C,0x2F,0x20,0x47,0x82,0xDD,0x12,0x68,0x7A,0x5E, + + 0xF5,0x4B,0xEA,0x5C,0x0C,0x26,0x1A,0x7B,0x4D,0x49,0x9B,0x1C,0xD9,0xA8,0xDC,0x08, + + 0x8E,0x8A,0x0E,0xFD,0x90,0x25,0x3D,0x2E,0xE7,0x0A,0xCD,0xA8,0xD0,0xC1,0x89,0x63, + + 0x0B,0x23,0x0B,0x1C,0x30,0x80,0xF1,0x3D,0xC9,0xE4,0xC5,0xBC,0x5B,0xC0,0xBD,0x3B, + + 0x48,0x8F,0x02,0x5D,0x8D,0x6E,0x08,0x75,0xE9,0x4A,0x58,0x9A,0x85,0xE1,0x74,0x54, + + 0x6A,0xED,0xB5,0xA6,0xE4,0xF2,0xDA,0x9A,0xEA,0xB2,0xD8,0x74,0x59,0x6C,0x03,0xB7, + + 0x0A,0x5E,0x41,0xF7,0x7B,0x51,0x5F,0x07,0x6B,0xC6,0xF3,0x60,0xD2,0x2E,0x53,0x4C, + + 0x77,0xAD,0x0B,0x4D,0xB1,0xA2,0x11,0x78,0x28,0xC5,0xD3,0x7F,0x59,0x8F,0xBF,0xE2, + + 0x61,0x50,0x03,0x75,0x3A,0x36,0xBA,0x51,0x6A,0x5C,0x95,0x84,0x1B,0x40,0x74,0xE3, + + 0x71,0x18,0xCE,0x1E,0x5A,0x93,0x62,0x20,0x8A,0xF3,0xD8,0x36,0x1A,0x33,0x7D,0xE3, + + 0xE3,0xCD,0xDB,0x01,0xB0,0x99,0x4B,0x25,0xE0,0xDF,0x95,0xA7,0xB2,0xD9,0x4C,0x6C, + + 0xC7,0x51,0x8D,0x64,0xA1,0x23,0x43,0xB9,0xC1,0xFC,0x9D,0x44,0xB3,0x7D,0x3A,0xCD, + + 0xAD,0xB9,0x04,0xD0,0xC3,0x2F,0x6C,0xB0,0x66,0x5B,0xEE,0x63,0xDE,0x2B,0x4D,0x42, + + 0x23,0x1D,0xB3,0x56,0xB3,0x35,0x26,0x20,0x6B,0x8A,0xE6,0x73,0xDF,0x69,0x40,0x53, + + 0x22,0xBB,0x3A,0xB7,0x55,0x28,0x6D,0x1E,0xA1,0x76,0xEF,0x62,0x5E,0x69,0x09,0x20, + + 0xB7,0x13,0x12,0xD5,0xC4,0x3D,0xE2,0x21,0x14,0x8F,0xF3,0xF3,0x62,0x2B,0x84,0x62, + + 0x57,0x10,0xD8,0x85,0x38,0x78,0x13,0x2A,0x69,0x20,0xC8,0x3D,0x78,0xF5,0x70,0x1A, + + 0x28,0xFE,0xEE,0x6D,0x3F,0x39,0x26,0x49,0x6F,0x59,0xDE,0x4F,0x61,0x7F,0xDC,0x8D, + + 0xAE,0xBA,0x83,0xEE,0xD3,0x18,0x37,0x3D,0x83,0x78,0xE9,0x28,0x93,0x6A,0x55,0x98, + + 0x0A,0xB4,0xD1,0x0D,0x19,0x90,0x41,0x29,0xC9,0xF0,0x97,0xF0,0x9A,0x1B,0x1C,0xCA, + + 0x42,0x2C,0xFC,0x2E,0x96,0xC2,0x2E,0x19,0x3A,0x7C,0xF8,0xEB,0xEF,0x73,0x18,0xD0, + + 0xC0,0x0D,0xFE,0x62,0x50,0x09,0x26,0x8B,0x3B,0x56,0xF7,0xB2,0xB2,0x19,0x39,0xC0, + + 0xC9,0xE1,0xBC,0x13,0x0D,0x95,0x37,0x29,0x24,0xD3,0x63,0xA7,0x33,0x3A,0x6F,0xCD, + + 0x63,0x2F,0xCF,0x2C,0x33,0xC0,0x24,0x99,0xBC,0x54,0x76,0x22,0x42,0xA1,0x9D,0xF2, + + 0x58,0x8F,0xE4,0x84,0x7F,0xE2,0xB0,0x23,0x44,0x80,0x70,0x26,0x3F,0x62,0x22,0x16, + + 0xA6,0x8C,0xF6,0x87,0x15,0x0A,0x68,0x36,0x4D,0xE9,0xE6,0xB3,0x5D,0x4A,0x41,0x42, + + 0x31,0x8F,0xA1,0xF6,0xD6,0xA6,0x35,0xBE,0xC0,0xE2,0xB9,0xD6,0x9E,0xE2,0xD6,0xC3, + + 0x8D,0x0C,0xA8,0x97,0x15,0xA2,0xB9,0x32,0x82,0x83,0xB8,0x17,0x55,0xA1,0xD3,0xD2, + + 0x00,0x24,0x1D,0xBD,0xE5,0x5B,0x74,0x9C,0xBB,0x4E,0xF2,0x14,0x21,0xC4,0x32,0x4F, + + 0xA4,0x83,0xD2,0xB9,0xEC,0x3A,0xF0,0x4E,0xA6,0xCA,0x07,0xA6,0x29,0xE6,0x2D,0xC1, + + 0x8F,0xFB,0x1A,0xC3,0x9A,0xCB,0x8A,0x3F,0x65,0xC0,0x15,0x07,0x24,0x83,0x65,0x3D, + + 0x26,0x0F,0x16,0xA9,0x91,0x27,0x19,0x33,0xDA,0x4C,0xC7,0x7E,0x94,0x15,0x68,0x0B, + + 0xFB,0x75,0xFC,0x8F,0x9E,0x03,0x36,0x5A,0x48,0xE8,0xEC,0xAF,0xDE,0x43,0x4A,0x5B, + + 0xF0,0x02,0xCA,0xEF,0x57,0xA9,0xBA,0x3B,0x9F,0x89,0xA2,0xCF,0x17,0xE9,0x69,0xF5, + + 0xD9,0x85,0x63,0x0F,0xF7,0x28,0x6D,0x2F,0xC4,0xDE,0x73,0x2F,0xB7,0x68,0xAC,0xF9, + + 0x0F,0xA3,0xF5,0x17,0x8D,0xAF,0x3F,0x99,0xC9,0xEB,0xE5,0xBA,0xD5,0x40,0xE2,0xA8, + + 0xAF,0x73,0x3A,0x3C,0xE1,0x73,0xF6,0x88,0xCC,0xC4,0x09,0x1C,0xD0,0x89,0x6E,0xA4, + + 0xF2,0x07,0x68,0xDE,0x19,0x6D,0x76,0x05,0x2C,0x3D,0xB0,0x3C,0x37,0xE0,0x29,0x4A, + + 0x6D,0x04,0x23,0x5E,0x95,0xEC,0xFA,0x19,0x6D,0xC8,0xEB,0x6E,0x8A,0x12,0x90,0x07, + + 0x2C,0x02,0x63,0x7B,0x1A,0x5A,0x03,0xF9,0xC6,0x12,0xE3,0x55,0xDE,0xF8,0x55,0x44, + + 0xD4,0xDE,0xE2,0x86,0xB4,0xD3,0x72,0xA2,0x0F,0xC0,0xCC,0x24,0x7D,0x8D,0x76,0x93, + + 0x86,0x97,0x6C,0x96,0x5E,0x33,0x5C,0xF2,0x78,0x5C,0xB0,0xD8,0xD4,0x79,0x92,0x01, + + 0xA1,0x63,0xFB,0x06,0x36,0x19,0x25,0x52,0xFC,0xD2,0xEF,0xBA,0x57,0xF4,0xA5,0xAF, + + 0x06,0x95,0x85,0x66,0xFF,0xB3,0x45,0x31,0xE4,0x8B,0x3D,0x55,0x54,0x0C,0xE5,0x33, + + 0x3A,0xB4,0x64,0xC3,0xE0,0xF4,0x3F,0x0D,0x9D,0x2B,0x4A,0xE4,0x80,0x20,0x5F,0x42, + + 0xDB,0xD7,0x58,0x3C,0xD6,0xD3,0xBC,0xE6,0x44,0x97,0x7B,0xED,0x75,0xBB,0xD0,0xCF, + + 0x5E,0x34,0xE5,0xC2,0x57,0xD0,0x8E,0x67,0xA2,0x58,0xF2,0xF8,0xA2,0x62,0xDE,0x52, + + 0xA1,0x17,0x59,0x97,0xBB,0x78,0x7B,0x0A,0x98,0x87,0x8B,0xB1,0x51,0xBB,0x6E,0x1D, + + 0x8D,0x91,0xF8,0x86,0x3E,0xBC,0x34,0x48,0x68,0xF8,0xFC,0xAF,0x9F,0x72,0x16,0x69, + + 0x39,0x14,0xF0,0x1A,0x3D,0x34,0x60,0x3E,0x6D,0x72,0x45,0xE2,0xDE,0x97,0xDE,0x09, + + 0xAF,0x7C,0xA8,0x7E,0xB6,0xBC,0x0B,0x5A,0xE6,0xD6,0xB3,0x51,0x01,0x70,0x51,0x1E, + + 0x44,0xCB,0xD1,0x0F,0x56,0x19,0x7D,0xFB,0x6D,0xEB,0x81,0xB6,0x3F,0xFB,0xBE,0xF5, + + 0x3A,0x47,0xC6,0xCF,0x99,0xAC,0xB6,0xFE,0x79,0x9E,0x82,0x13,0x40,0xBE,0x10,0x5E, + + 0xDA,0x3E,0xD4,0x59,0x93,0xA2,0x7E,0x7E,0x2B,0x79,0x3E,0xEA,0x83,0x08,0x67,0xB4, + + 0xC6,0xDC,0x08,0x3D,0x3E,0x8F,0xF5,0x65,0xE8,0xDE,0x75,0xD0,0x02,0x9C,0x2B,0x28, + + 0xA5,0x62,0xA5,0xCA,0xDF,0x2F,0xBF,0xEA,0x3D,0x52,0xF8,0x7B,0xBB,0x0A,0xB7,0x1C, + + 0x06,0xC0,0x24,0x66,0x33,0x40,0x63,0x66,0xEA,0xBB,0x94,0x63,0xD2,0x68,0x78,0x56, + + 0xA3,0xFF,0x68,0x1C,0x33,0x31,0xAF,0xB5,0x47,0x81,0xBE,0xEF,0x05,0xC5,0xB6,0xFC, + + 0x90,0x4C,0x6D,0x07,0x98,0x4E,0x91,0xA5,0x84,0xB7,0xA0,0x47,0x3B,0xD2,0xF0,0x57, + + 0x6B,0xA7,0x8C,0x06,0xDF,0x67,0xAE,0x0E,0x9D,0x01,0x72,0x28,0x19,0x9D,0x38,0x22, + + 0x41,0xF4,0x2F,0x36,0xB1,0x65,0xE3,0x79,0xBE,0x94,0xD0,0x64,0x52,0x64,0x40,0xE2, + + 0xF6,0x0A,0xB0,0x73,0x37,0x25,0x5C,0x37,0xC1,0x4D,0xD8,0x74,0x53,0x65,0x4B,0x01, + + 0x21,0x00,0xC5,0x65,0x92,0x26,0xC1,0xA6,0xC0,0xB3,0xD1,0x65,0xD2,0x66,0xFD,0x2E, + + 0x20,0x46,0xC9,0x55,0x93,0x27,0xEB,0x13,0x28,0xF7,0xD9,0x75,0xD3,0x67,0x42,0x0E, + + 0xC0,0xF8,0xA4,0x98,0x94,0xA3,0x90,0x17,0xB4,0x4A,0xD2,0xAA,0xA4,0x9D,0x08,0xDE, + + 0xAB,0x4C,0x71,0x3A,0x09,0xA4,0x99,0x3E,0x81,0xF9,0x19,0x06,0x01,0x28,0xA7,0xF5, + + 0x08,0xF1,0x87,0xEF,0x9E,0xEA,0xD3,0x3D,0x34,0xEE,0xD3,0x13,0x84,0xDF,0x79,0xBC, + + 0x2D,0xEC,0x5F,0xE2,0x1A,0x25,0xBF,0x5B,0x65,0xB4,0x77,0xBD,0x25,0x4B,0xAA,0xFB, + + 0x8F,0x4B,0xC2,0x4C,0x1A,0x2C,0x74,0xB7,0x1E,0x0A,0xD2,0x6C,0x5A,0x6C,0x3E,0xA5, + + 0x2A,0x4F,0xCA,0x5C,0x1B,0x2D,0xD9,0x5C,0xC4,0x4F,0xDA,0x7C,0x5B,0x6D,0x83,0x5D, + + 0x78,0x42,0xC3,0x4D,0x9A,0x2E,0xE4,0x57,0x92,0xBB,0xD3,0x6D,0xDA,0x6E,0xC9,0x66, + + 0x0E,0x08,0xCB,0x5D,0x9B,0x2F,0xEC,0x78,0x46,0x49,0xDB,0x7D,0xDB,0x6F,0x80,0x04, + + 0x64,0xE5,0x0C,0x86,0xC5,0x3F,0x74,0xE4,0x6F,0x5D,0xBC,0x66,0xF2,0x78,0xBB,0xAF, + + 0x79,0x53,0x48,0x11,0x72,0xC2,0x94,0xC8,0x80,0x5E,0xFC,0xF4,0x8A,0x7C,0x3F,0x7E, + + 0xA6,0xD2,0x31,0xFA,0x13,0x8F,0x5F,0x7E,0x43,0x54,0x7A,0x55,0xA8,0x7D,0x8F,0xAE, + + 0x5D,0xC3,0xED,0xD1,0x8C,0x3C,0x7D,0xF5,0xD8,0x5C,0xEF,0xAC,0xB1,0x88,0x3C,0xE4, + + 0xA7,0x33,0xC4,0xC4,0x32,0x34,0x94,0xF4,0x9E,0x18,0xD4,0xE4,0x72,0x74,0xFB,0x2D, + + 0x33,0x5B,0xCC,0xD4,0x33,0x35,0xF4,0x53,0x1C,0xD5,0xDC,0xF4,0x73,0x75,0x9A,0xD0, + + 0xA4,0xD6,0xC5,0xC5,0xB2,0x36,0x25,0x27,0x48,0x17,0xD5,0xE5,0xF2,0x76,0x3D,0xF7, + + 0x41,0x74,0xCD,0xD5,0xB3,0x37,0x9D,0xE5,0x1F,0x1B,0xDD,0xF5,0xF3,0x77,0xC6,0x9C, + + 0xD4,0xBC,0x16,0x92,0x60,0xCC,0xA2,0x4A,0xEA,0x10,0x92,0xAE,0x7C,0x83,0xAA,0x65, + + 0xA9,0xC2,0x7E,0x18,0x7D,0xAE,0x66,0xDA,0x2A,0xE6,0x29,0x98,0xFC,0x5E,0x47,0x8F, + + 0x60,0xEA,0x04,0x4B,0x52,0x76,0xDB,0xCB,0xAB,0x85,0x97,0x6F,0x7B,0x3C,0x0E,0x5F, + + 0x0B,0x5E,0x27,0x3E,0xC6,0x3A,0x67,0xE6,0x1C,0xA7,0x40,0xAC,0xFF,0xBB,0xEE,0x6A, + + 0xF5,0xF3,0xC6,0xCC,0x3A,0x3C,0x26,0x2E,0xC0,0x1D,0xD6,0xEC,0x7A,0x7C,0xB1,0xFC, + + 0xA9,0x15,0xCE,0xDC,0x3B,0x3D,0xF2,0xBA,0xE8,0x53,0xDE,0xFC,0x7B,0x7D,0xEF,0x6B, + + 0x2D,0x39,0xC7,0xCD,0xBA,0x3E,0xBB,0x69,0x16,0x7E,0xD7,0xED,0xFA,0x7E,0xF9,0xBB, + + 0x5C,0x19,0xCF,0xDD,0xBB,0x3F,0x37,0x7F,0x17,0x1E,0xDF,0xFD,0xFB,0x7F,0xF4,0x44, + + 0xA6,0x7E,0x40,0x39,0x30,0x1C,0xF0,0x36,0xB8,0xBE,0x1C,0xA4,0x55,0x65,0xC3,0x69, + + 0x9A,0xBC,0x2C,0xE7,0xB6,0xA3,0x4C,0xB6,0x0D,0x9F,0xD7,0x2A,0x9D,0x3F,0x5B,0x87, + + 0xC8,0x92,0x1E,0x5C,0x6D,0x28,0x48,0x65,0x66,0x8C,0x89,0xD4,0x8C,0x46,0x81,0xB1, + + 0x02,0xA4,0x9B,0xE8,0x17,0xEB,0xF9,0x27,0x54,0x82,0x3E,0x24,0x0A,0xE1,0x88,0xE1, + + 0x00,0x24,0xE0,0x46,0x16,0xA4,0x78,0x50,0xE7,0x6B,0xF0,0x66,0x56,0xE4,0xF8,0xD0, + + 0x06,0xF2,0xE8,0x56,0x17,0xA5,0x98,0x4D,0xB3,0x75,0xF8,0x76,0x57,0xE5,0x88,0xC7, + + 0xC2,0x9A,0xE1,0x47,0x96,0xA6,0x76,0x70,0x1D,0x16,0xF1,0x67,0xD6,0xE6,0x53,0xB1, + + 0x05,0x8F,0xE9,0x57,0x97,0xA7,0xCE,0x6F,0xE3,0x3A,0xF9,0x77,0xD7,0xE7,0xB2,0x14, + + 0x54,0x7C,0x82,0x6C,0xAB,0xCD,0x99,0x51,0x99,0x35,0x52,0x11,0xA0,0xEA,0x6A,0xDC, + + 0xE7,0xC5,0x13,0x4F,0xBE,0x76,0x62,0x07,0xCF,0xC1,0x89,0x27,0x79,0x87,0xA0,0x11, + + 0xD0,0x3E,0x9B,0xDF,0x41,0xD5,0x71,0x4B,0xD4,0x4A,0x00,0x32,0x24,0x3A,0xDB,0x5D, + + 0x27,0x70,0x16,0x42,0x62,0xAD,0xEF,0x49,0x6E,0x8A,0xFB,0x00,0xD5,0x87,0x93,0x28, + + 0x4D,0x53,0xE2,0x4E,0x1E,0xAC,0xAD,0x62,0x60,0x8A,0xF2,0x6E,0x5E,0xEC,0x12,0xD8, + + 0x0E,0x9A,0xEA,0x5E,0x1F,0xAD,0x0A,0xA5,0xA0,0x8C,0xFA,0x7E,0x5F,0xED,0x1B,0x29, + + 0xCD,0x7E,0xE3,0x4F,0x9E,0xAE,0x81,0xAD,0x6C,0x82,0xF3,0x6F,0xDE,0xEE,0xD0,0xB9, + + 0x23,0x72,0xEB,0x5F,0x9F,0xAF,0xD3,0xD8,0xB0,0x0F,0xFB,0x7F,0xDF,0xEF,0x56,0x27, + + 0xA1,0x97,0x64,0x92,0xC8,0x45,0xF4,0xB3,0x48,0xD6,0x03,0x5B,0x38,0xBE,0x2D,0x4D, + + 0x86,0xEF,0x1B,0x8F,0x33,0x71,0x44,0x96,0xEA,0xD3,0x45,0x70,0xD7,0xB4,0xCE,0x74, + + 0xA2,0x72,0x61,0x03,0xF0,0x47,0x3D,0x06,0x87,0xF2,0xC5,0xE1,0x56,0x0C,0x16,0xD5, + + 0x07,0xDD,0x1A,0xA8,0xE1,0xF1,0x8A,0xB2,0x68,0xDF,0xCF,0x31,0xED,0xBF,0x6C,0xF5, + + 0x87,0xF8,0xE4,0xC6,0x36,0xB4,0x14,0xA2,0x6A,0x29,0xF4,0xE6,0x76,0xF4,0xE8,0x15, + + 0xA7,0xB5,0xEC,0xD6,0x37,0xB5,0x26,0xF3,0xC4,0x94,0xFC,0xF6,0x77,0xF5,0x86,0x84, + + 0x78,0x9E,0xE5,0xC7,0xB6,0xB6,0x0D,0x61,0xE7,0x96,0xF5,0xE7,0xF6,0xF6,0xC1,0x13, + + 0x04,0xD6,0xED,0xD7,0xB7,0xB7,0x1D,0xB3,0xFA,0x5C,0xFD,0xF7,0xF7,0xF7,0x52,0xAE, + + 0xF8,0x28,0x24,0xB1,0xB9,0xBF,0x5E,0xB4,0x2A,0x2C,0xC6,0x8E,0x64,0x35,0x09,0x1A, + + 0xAA,0x3E,0x47,0x1A,0x79,0xA5,0x81,0xDA,0xDA,0x7D,0x84,0x5C,0xFF,0xF1,0x80,0x97, + + 0x7C,0x6A,0x4F,0x2C,0xBA,0x1A,0xF1,0x2F,0xA4,0xAD,0x27,0x2D,0xFD,0x1D,0x87,0x3D, + + 0xAB,0x5B,0x3F,0x58,0xBF,0x4E,0xF9,0xBD,0x25,0x19,0x4D,0xDD,0xBE,0x24,0x8A,0x4A, + + 0xD2,0xBC,0xE6,0xCE,0x3E,0xBC,0xF2,0x08,0xEC,0xD4,0xF6,0xEE,0x7E,0xFC,0x56,0x29, + + 0x77,0x39,0xEE,0xDE,0x3F,0xBD,0x1E,0xBA,0xC2,0x20,0xFE,0xFE,0x7F,0xFD,0xCB,0x49, + + 0xAF,0xCB,0xE7,0xCF,0xBE,0xBE,0xFE,0x99,0x4D,0x9F,0xF7,0xEF,0xFE,0xFE,0x80,0xC7, + + 0x29,0x6A,0xEF,0xDF,0xBF,0xBF,0x07,0xDF,0x6D,0xD7,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x90,0xAF, diff --git a/drivers/input/touchscreen/GT915L/Kconfig b/drivers/input/touchscreen/GT915L/Kconfig new file mode 100644 index 0000000000000..cc1039fb9959f --- /dev/null +++ b/drivers/input/touchscreen/GT915L/Kconfig @@ -0,0 +1,5 @@ + +config TOUCHSCREEN_GT915L + tristate "ATMEL GT915L touchpanel driver" + depends on CONFIG_INPUT_TOUCHSCREEN + default n diff --git a/drivers/input/touchscreen/GT915L/Makefile b/drivers/input/touchscreen/GT915L/Makefile new file mode 100644 index 0000000000000..c207dc3cb8502 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/Makefile @@ -0,0 +1,4 @@ +#GT915L touchpanel driver + +obj-y += gt9xx.o goodix_tool.o gt9xx_update.o + diff --git a/drivers/input/touchscreen/GT915L/goodix_tool.c b/drivers/input/touchscreen/GT915L/goodix_tool.c new file mode 100644 index 0000000000000..ca6020c4802c0 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/goodix_tool.c @@ -0,0 +1,736 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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 a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * 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. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + + +#include "gt9xx.h" + +#define DATA_LENGTH_UINT 512 +#define CMD_HEAD_LENGTH (sizeof(st_cmd_head) - sizeof(u8 *)) +static char procname[20] = {0}; + +#define UPDATE_FUNCTIONS + +#ifdef UPDATE_FUNCTIONS +extern s32 gup_enter_update_mode(struct i2c_client *client); +extern void gup_leave_update_mode(void); +extern s32 gup_update_proc(void *dir); +#endif + +extern void gtp_irq_disable(struct goodix_ts_data *); +extern void gtp_irq_enable(struct goodix_ts_data *); + +#pragma pack(1) +typedef struct{ + u8 wr; + u8 flag; + u8 flag_addr[2]; + u8 flag_val; + u8 flag_relation; + u16 circle; + u8 times; + u8 retry; + u16 delay; + u16 data_len; + u8 addr_len; + u8 addr[2]; + u8 res[3]; + u8 *data; +} st_cmd_head; +#pragma pack() +st_cmd_head cmd_head; + +static struct i2c_client *gt_client; + +static struct proc_dir_entry *goodix_proc_entry; + + +static ssize_t goodix_tool_read(struct file *, char __user *, size_t, loff_t *); +static ssize_t goodix_tool_write(struct file *, const char __user *, size_t, loff_t *); +static const struct file_operations tool_ops = { + .owner = THIS_MODULE, + .read = goodix_tool_read, + .write = goodix_tool_write, +}; + +static struct class *ft_class; +#define CLASS_NAME "touchscreen" +static ssize_t goodix_sys_tool_write(struct class *class, struct class_attribute *attr, const char *buf, size_t len); +static ssize_t goodix_sys_tool_read(struct class *class, struct class_attribute *attr, char *buf); + +static CLASS_ATTR(gmnode, 0664, goodix_sys_tool_read, goodix_sys_tool_write); + + + +static s32 (*tool_i2c_read)(u8 *, u16); +static s32 (*tool_i2c_write)(u8 *, u16); + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *, s32); +#endif +s32 DATA_LENGTH = 0; +s8 IC_TYPE[16] = "GT9XX"; + +static void tool_set_proc_name(char *procname) +{ + char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", + "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + char date[20] = {0}; + char month[4] = {0}; + int i = 0, n_month = 1, n_day = 0, n_year = 0; + + + + GTP_DEBUG("compile date: %s", date); + + sscanf(date, "%s %d %d", month, &n_day, &n_year); + + for (i = 0; i < 12; ++i) { + if (!memcmp(months[i], month, 3)) { + n_month = i+1; + break; + } + } + + sprintf(procname, "gmnode%04d%02d%02d", n_year, n_month, n_day); + + +} + + +static s32 tool_i2c_read_no_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + s32 i = 0; + struct i2c_msg msgs[2]; + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = gt_client->addr; + msgs[0].len = cmd_head.addr_len; + msgs[0].buf = &buf[0]; + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = gt_client->addr; + msgs[1].len = len; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + for (i = 0; i < cmd_head.retry; i++) { + ret = i2c_transfer(gt_client->adapter, msgs, 2); + if (ret > 0) { + break; + } + } + return ret; +} + +static s32 tool_i2c_write_no_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + s32 i = 0; + struct i2c_msg msg; + + msg.flags = !I2C_M_RD; + msg.addr = gt_client->addr; + msg.len = len; + msg.buf = buf; + + for (i = 0; i < cmd_head.retry; i++) { + ret = i2c_transfer(gt_client->adapter, &msg, 1); + if (ret > 0) { + break; + } + } + return ret; +} + +static s32 tool_i2c_read_with_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_read_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static s32 tool_i2c_write_with_extra(u8 *buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_write_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static void register_i2c_func(void) +{ + + + + + if (strncmp(IC_TYPE, "GT8110", 6) && strncmp(IC_TYPE, "GT8105", 6) + && strncmp(IC_TYPE, "GT801", 5) && strncmp(IC_TYPE, "GT800", 5) + && strncmp(IC_TYPE, "GT801PLUS", 9) && strncmp(IC_TYPE, "GT811", 5) + && strncmp(IC_TYPE, "GTxxx", 5) && strncmp(IC_TYPE, "GT9XX", 5)) { + tool_i2c_read = tool_i2c_read_with_extra; + tool_i2c_write = tool_i2c_write_with_extra; + GTP_DEBUG("I2C function: with pre and end cmd!"); + } else { + tool_i2c_read = tool_i2c_read_no_extra; + tool_i2c_write = tool_i2c_write_no_extra; + GTP_INFO("I2C function: without pre and end cmd!"); + } +} + +static void unregister_i2c_func(void) +{ + tool_i2c_read = NULL; + tool_i2c_write = NULL; + GTP_INFO("I2C function: unregister i2c transfer function!"); +} + +s32 init_wr_node(struct i2c_client *client) +{ + s32 i; + s32 err; + + gt_client = client; + memset(&cmd_head, 0, sizeof(cmd_head)); + cmd_head.data = NULL; + + i = 5; + while ((!cmd_head.data) && i) { + cmd_head.data = kzalloc(i * DATA_LENGTH_UINT, GFP_KERNEL); + if (NULL != cmd_head.data) { + break; + } + i--; + } + if (i) { + DATA_LENGTH = i * DATA_LENGTH_UINT + GTP_ADDR_LENGTH; + GTP_INFO("Applied memory size:%d.", DATA_LENGTH); + } else { + GTP_ERROR("Apply for memory failed."); + return FAIL; + } + + cmd_head.addr_len = 2; + cmd_head.retry = 5; + + register_i2c_func(); + + tool_set_proc_name(procname); + goodix_proc_entry = proc_create(procname, 0666, NULL, &tool_ops); + if (goodix_proc_entry == NULL) { + GTP_ERROR("Couldn't create proc entry!"); + return FAIL; + } else { + GTP_INFO("Create proc entry success!"); + } + + ft_class = class_create(THIS_MODULE, CLASS_NAME); + if (IS_ERR(ft_class)) { + GTP_ERROR("Failed to create class.\n"); + return FAIL; + } + err = class_create_file(ft_class, &class_attr_gmnode); + if (err) { + GTP_ERROR("Failed to create class file.\n"); + } + return SUCCESS; +} + +void uninit_wr_node(void) +{ + kfree(cmd_head.data); + cmd_head.data = NULL; + unregister_i2c_func(); + remove_proc_entry(procname, NULL); +} + +static u8 relation(u8 src, u8 dst, u8 rlt) +{ + u8 ret = 0; + + switch (rlt) { + case 0: + ret = (src != dst) ? true : false; + break; + + case 1: + ret = (src == dst) ? true : false; + GTP_DEBUG("equal:src:0x%02x dst:0x%02x ret:%d.", src, dst, (s32)ret); + break; + + case 2: + ret = (src > dst) ? true : false; + break; + + case 3: + ret = (src < dst) ? true : false; + break; + + case 4: + ret = (src & dst) ? true : false; + break; + + case 5: + ret = (!(src | dst)) ? true : false; + break; + + default: + ret = false; + break; + } + + return ret; +} + +/******************************************************* +Function: + Comfirm function. +Input: + None. +Output: + Return write length. +********************************************************/ +static u8 comfirm(void) +{ + s32 i = 0; + u8 buf[32]; + + memcpy(buf, cmd_head.flag_addr, cmd_head.addr_len); + + for (i = 0; i < cmd_head.times; i++) { + if (tool_i2c_read(buf, 1) <= 0) { + GTP_ERROR("Read flag data failed!"); + return FAIL; + } + if (true == relation(buf[GTP_ADDR_LENGTH], cmd_head.flag_val, cmd_head.flag_relation)) { + GTP_DEBUG("value at flag addr:0x%02x.", buf[GTP_ADDR_LENGTH]); + GTP_DEBUG("flag value:0x%02x.", cmd_head.flag_val); + break; + } + + msleep(cmd_head.circle); + } + + if (i >= cmd_head.times) { + GTP_ERROR("Didn't get the flag to continue!"); + return FAIL; + } + + return SUCCESS; +} + +static ssize_t goodix_sys_tool_write(struct class *class, struct class_attribute *attr, const char *buf, size_t len) +{ + + GTP_DEBUG_FUNC(); + GTP_DEBUG_ARRAY((u8 *)buf, len); + + memcpy(&cmd_head, buf, CMD_HEAD_LENGTH); + + GTP_DEBUG("[Operation]wr: %02X", cmd_head.wr); + GTP_DEBUG("[Flag]flag: %02X, addr: %02X%02X, value: %02X, relation: %02X", cmd_head.flag, cmd_head.flag_addr[0], + cmd_head.flag_addr[1], cmd_head.flag_val, cmd_head.flag_relation); + GTP_DEBUG("[Retry]circle: %d, times: %d, retry: %d, delay: %d", (s32)cmd_head.circle, (s32)cmd_head.times, + (s32)cmd_head.retry, (s32)cmd_head.delay); + GTP_DEBUG("[Data]data len: %d, addr len: %d, addr: %02X%02X, buffer len: %d, data[0]: %02X", (s32)cmd_head.data_len, + (s32)cmd_head.addr_len, cmd_head.addr[0], cmd_head.addr[1], (s32)len, buf[CMD_HEAD_LENGTH]); + + if (1 == cmd_head.wr) { + memcpy(&cmd_head.data[GTP_ADDR_LENGTH], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG_ARRAY(cmd_head.data, cmd_head.data_len + cmd_head.addr_len); + GTP_DEBUG_ARRAY((u8 *)&buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[WRITE]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + + } + if (tool_i2c_write(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + cmd_head.data_len + cmd_head.addr_len) <= 0) { + GTP_ERROR("[WRITE]Write data failed!"); + return -EPERM; + } + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.data_len + cmd_head.addr_len); + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + } else if (3 == cmd_head.wr) { + memcpy(&cmd_head.data[0], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + + register_i2c_func(); + } else if (5 == cmd_head.wr) { + + } else if (7 == cmd_head.wr) { + gtp_irq_disable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_OFF); + #endif + } else if (9 == cmd_head.wr) { + gtp_irq_enable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_ON); + #endif + } else if (17 == cmd_head.wr) { + struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); + memcpy(&cmd_head.data[GTP_ADDR_LENGTH], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (cmd_head.data[GTP_ADDR_LENGTH]) { + GTP_INFO("gtp enter rawdiff."); + ts->gtp_rawdiff_mode = true; + } else { + ts->gtp_rawdiff_mode = false; + GTP_INFO("gtp leave rawdiff."); + } + } +#ifdef UPDATE_FUNCTIONS + else if (11 == cmd_head.wr) { + if (FAIL == gup_enter_update_mode(gt_client)) { + return -EPERM; + } + } else if (13 == cmd_head.wr) { + gup_leave_update_mode(); + } else if (15 == cmd_head.wr) { + show_len = 0; + total_len = 0; + memset(cmd_head.data, 0, cmd_head.data_len + 1); + memcpy(cmd_head.data, &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (FAIL == gup_update_proc((void *)cmd_head.data)) { + return -EPERM; + } + } + +#endif + + return len; +} +/******************************************************* +Function: + Goodix tool write function. +Input: + standard proc write function param. +Output: + Return write length. +********************************************************/ + +ssize_t goodix_tool_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + GTP_DEBUG_ARRAY((u8 *)buff, len); + + ret = copy_from_user(&cmd_head, buff, CMD_HEAD_LENGTH); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + + + GTP_DEBUG("[Operation]wr: %02X", cmd_head.wr); + GTP_DEBUG("[Flag]flag: %02X, addr: %02X%02X, value: %02X, relation: %02X", cmd_head.flag, cmd_head.flag_addr[0], + cmd_head.flag_addr[1], cmd_head.flag_val, cmd_head.flag_relation); + GTP_DEBUG("[Retry]circle: %d, times: %d, retry: %d, delay: %d", (s32)cmd_head.circle, (s32)cmd_head.times, + (s32)cmd_head.retry, (s32)cmd_head.delay); + GTP_DEBUG("[Data]data len: %d, addr len: %d, addr: %02X%02X, buffer len: %d, data[0]: %02X", (s32)cmd_head.data_len, + (s32)cmd_head.addr_len, cmd_head.addr[0], cmd_head.addr[1], (s32)len, buff[CMD_HEAD_LENGTH]); + + if (1 == cmd_head.wr) { + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG_ARRAY(cmd_head.data, cmd_head.data_len + cmd_head.addr_len); + GTP_DEBUG_ARRAY((u8 *)&buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[WRITE]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + + } + if (tool_i2c_write(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + cmd_head.data_len + cmd_head.addr_len) <= 0) { + GTP_ERROR("[WRITE]Write data failed!"); + return -EPERM; + } + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.data_len + cmd_head.addr_len); + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + } else if (3 == cmd_head.wr) { + ret = copy_from_user(&cmd_head.data[0], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + + register_i2c_func(); + } else if (5 == cmd_head.wr) { + + } else if (7 == cmd_head.wr) { + gtp_irq_disable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_OFF); + #endif + } else if (9 == cmd_head.wr) { + gtp_irq_enable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_ON); + #endif + } else if (17 == cmd_head.wr) { + struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_DEBUG("copy_from_user failed."); + return -EPERM; + } + if (cmd_head.data[GTP_ADDR_LENGTH]) { + GTP_INFO("gtp enter rawdiff."); + ts->gtp_rawdiff_mode = true; + } else { + ts->gtp_rawdiff_mode = false; + GTP_INFO("gtp leave rawdiff."); + } + } +#ifdef UPDATE_FUNCTIONS + else if (11 == cmd_head.wr) { + if (FAIL == gup_enter_update_mode(gt_client)) { + return -EPERM; + } + } else if (13 == cmd_head.wr) { + gup_leave_update_mode(); + } else if (15 == cmd_head.wr) { + show_len = 0; + total_len = 0; + memset(cmd_head.data, 0, cmd_head.data_len + 1); + memcpy(cmd_head.data, &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (FAIL == gup_update_proc((void *)cmd_head.data)) { + return -EPERM; + } + } + +#endif + + return len; +} +static ssize_t goodix_sys_tool_read(struct class *class, struct class_attribute *attr, char *buf) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + + if (cmd_head.wr % 2) { + return -EPERM; + } else if (!cmd_head.wr) { + u16 len = 0; + s16 data_len = 0; + u16 loc = 0; + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[READ]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + + } + + memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], cmd_head.data[1]); + GTP_DEBUG("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + + data_len = cmd_head.data_len; + + while (data_len > 0) { + if (data_len > DATA_LENGTH) { + len = DATA_LENGTH; + } else { + len = data_len; + } + data_len -= len; + + if (tool_i2c_read(cmd_head.data, len) <= 0) { + GTP_ERROR("[READ]Read data failed!"); + return -EPERM; + } + + memcpy(&buf[loc], &cmd_head.data[GTP_ADDR_LENGTH], len); + /*ret = simple_read_from_buffer(&page[loc], size, ppos, &cmd_head.data[GTP_ADDR_LENGTH], len); + if (ret < 0) { + return ret; + }*/ + loc += len; + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH], len); + GTP_DEBUG_ARRAY(buf, len); + } + return cmd_head.data_len; + } else if (2 == cmd_head.wr) { + memcpy(buf, IC_TYPE, sizeof(IC_TYPE)); + + return ret; + } else if (4 == cmd_head.wr) { + u8 progress_buf[4]; + progress_buf[0] = show_len >> 8; + progress_buf[1] = show_len & 0xff; + progress_buf[2] = total_len >> 8; + progress_buf[3] = total_len & 0xff; + memcpy(buf, progress_buf, 4); + + return ret; + } else if (6 == cmd_head.wr) { + + } else if (8 == cmd_head.wr) { + memcpy(buf, GTP_DRIVER_VERSION, strlen(GTP_DRIVER_VERSION)); + + return ret; + } + return -EPERM; +} +/******************************************************* +Function: + Goodix tool read function. +Input: + standard proc read function param. +Output: + Return read length. +********************************************************/ +ssize_t goodix_tool_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + + if (*ppos) { + + + + *ppos = 0; + return 0; + } + + if (cmd_head.wr % 2) { + return -EPERM; + } else if (!cmd_head.wr) { + u16 len = 0; + s16 data_len = 0; + u16 loc = 0; + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[READ]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + + } + + memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], cmd_head.data[1]); + GTP_DEBUG("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + + data_len = cmd_head.data_len; + + while (data_len > 0) { + if (data_len > DATA_LENGTH) { + len = DATA_LENGTH; + } else { + len = data_len; + } + data_len -= len; + + if (tool_i2c_read(cmd_head.data, len) <= 0) { + GTP_ERROR("[READ]Read data failed!"); + return -EPERM; + } + + + ret = simple_read_from_buffer(&page[loc], size, ppos, &cmd_head.data[GTP_ADDR_LENGTH], len); + if (ret < 0) { + return ret; + } + loc += len; + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH], len); + GTP_DEBUG_ARRAY(page, len); + } + return cmd_head.data_len; + } else if (2 == cmd_head.wr) { + ret = simple_read_from_buffer(page, size, ppos, IC_TYPE, sizeof(IC_TYPE)); + return ret; + } else if (4 == cmd_head.wr) { + u8 progress_buf[4]; + progress_buf[0] = show_len >> 8; + progress_buf[1] = show_len & 0xff; + progress_buf[2] = total_len >> 8; + progress_buf[3] = total_len & 0xff; + + ret = simple_read_from_buffer(page, size, ppos, progress_buf, 4); + return ret; + } else if (6 == cmd_head.wr) { + + } else if (8 == cmd_head.wr) { + ret = simple_read_from_buffer(page, size, ppos, GTP_DRIVER_VERSION, strlen(GTP_DRIVER_VERSION)); + return ret; + } + return -EPERM; +} diff --git a/drivers/input/touchscreen/GT915L/gt9xx.c b/drivers/input/touchscreen/GT915L/gt9xx.c new file mode 100644 index 0000000000000..4ec4d44338286 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/gt9xx.c @@ -0,0 +1,3495 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. 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; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * 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. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#include +#include "gt9xx.h" + +#if GTP_ICS_SLOT_REPORT + #include +#endif + +#if WT_ADD_CTP_INFO +#include +static char tp_string_version[40]; +static int tp_sensor_id = -1; +static u8 cfg_version; + +/*TP Color*/ +#define TP_White 0x31 +#define TP_Black 0x32 +#define TP_Golden 0x38 +#define GTP_LOCKDOWN_SIZE 8 +#define GTP_READ_LOCKDOWN_INFO_ADDR 0xC8A4 +static u8 lockdown_info[GTP_LOCKDOWN_SIZE]; +static u8 TP_Maker,LCD_Maker,Panel_Ink; +extern u8 tp_color; +static u16 IC_Version; +static int gtp_read_lockdown_info(void); +int gtp_hardwareinfo_set(void); +#endif + +static const char *goodix_ts_name = "goodix-ts"; +static const char *goodix_input_phys = "input/ts"; +static struct workqueue_struct *goodix_wq; +struct i2c_client * i2c_connect_client = NULL; +/* +int gtp_rst_gpio; +int gtp_int_gpio; +*/ +unsigned int gtp_rst_gpio; +unsigned int gtp_int_gpio; + +int gtp_ics_slot_report=0;/*use to choose report mode A or B, 0 for A and 1 for B */ + + +u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] + = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; + + +#ifdef GTP_GLOVE_MODE +u8 gtp_glove_config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] + = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; +#endif + + +#if GTP_HAVE_TOUCH_KEY + static const u16 touch_key_array[] = GTP_KEY_TAB; +#define GTP_MAX_KEY_NUM (sizeof(touch_key_array)/sizeof(touch_key_array[0])) +#define GTP_KEY_MAP_ARRAY {{175, 1500}, {387, 1500}, {582, 1500}} +struct touch_virtual_key_map_t { + int point_x; + int point_y; +}; +static struct touch_virtual_key_map_t touch_key_point_maping_array[] = GTP_KEY_MAP_ARRAY; + +#if GTP_DEBUG_ON + static const int key_codes[] = {KEY_HOME, KEY_BACK, KEY_MENU, KEY_SEARCH}; + static const char *key_names[] = {"Key_Home", "Key_Back", "Key_Menu", "Key_Search"}; +#endif + +#endif + +#ifdef PMX_DRIVER_GT915L +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" +static int goodix_ts_pinctrl_init(struct goodix_ts_data *goodix_data); +static int goodix_ts_pinctrl_select(struct goodix_ts_data *goodix_data, bool on); +#endif + +static s8 gtp_i2c_test(struct i2c_client *client); +void gtp_reset_guitar(struct i2c_client *client, s32 ms); +s32 gtp_send_cfg(struct i2c_client *client); +void gtp_int_sync(s32 ms); + +static ssize_t gt91xx_config_read_proc(struct file *, char __user *, size_t, loff_t *); +static ssize_t gt91xx_config_write_proc(struct file *, const char __user *, size_t, loff_t *); + +static struct proc_dir_entry *gt91xx_config_proc = NULL; +static const struct file_operations config_proc_ops = { + .owner = THIS_MODULE, + .read = gt91xx_config_read_proc, + .write = gt91xx_config_write_proc, +}; +static int gtp_register_powermanger(struct goodix_ts_data *ts); +static int gtp_unregister_powermanger(struct goodix_ts_data *ts); + +#if GTP_CREATE_WR_NODE +extern s32 init_wr_node(struct i2c_client*); +extern void uninit_wr_node(void); +#endif + +#if GTP_AUTO_UPDATE +extern u8 gup_init_update_proc(struct goodix_ts_data *); +#endif + +#if GTP_ESD_PROTECT +static struct delayed_work gtp_esd_check_work; +static struct workqueue_struct * gtp_esd_check_workqueue = NULL; +static void gtp_esd_check_func(struct work_struct *); +static s32 gtp_init_ext_watchdog(struct i2c_client *client); +void gtp_esd_switch(struct i2c_client *, s32); +#endif + +#if GTP_COMPATIBLE_MODE +extern s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len); +extern s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len); +extern s32 gup_clk_calibration(void); +extern s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +extern u8 gup_check_fs_mounted(char *path_name); + +void gtp_recovery_reset(struct i2c_client *client); +static s32 gtp_esd_recovery(struct i2c_client *client); +s32 gtp_fw_startup(struct i2c_client *client); +static s32 gtp_main_clk_proc(struct goodix_ts_data *ts); +static s32 gtp_bak_ref_proc(struct goodix_ts_data *ts, u8 mode); + +#endif + +#if GTP_GESTURE_WAKEUP +typedef enum { + DOZE_DISABLED = 0, + DOZE_ENABLED = 1, + DOZE_WAKEUP = 2, +}DOZE_T; +static DOZE_T doze_status = DOZE_DISABLED; +static s8 gtp_enter_doze(struct goodix_ts_data *ts); +#endif + +#ifdef GTP_CONFIG_OF +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid); +#endif + + +#if GTP_GLOVE_MODE +char gtp_glove_onoff = '0'; +static char gtp_glove_support_flag_changed = 0; +static const char gtp_glove_support_flag = GTP_GLOVE_SUPPORT_ONOFF; +s32 gtp_send_glove_cfg(struct i2c_client *client); + +static ssize_t proc_glove_onoff_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + if (0 == gtp_glove_support_flag_changed) + num = sprintf(page, "%c\n", gtp_glove_support_flag); + else + num = sprintf(page, "%c\n", gtp_glove_onoff); + *ppos += num; + return num; +} + +static ssize_t proc_glove_onoff_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer,"%c",>p_glove_onoff); + gtp_glove_support_flag_changed=1; + + if ('1' == gtp_glove_onoff) { + u8 cfg_group[] = CTP_CFG_GROUP1_GLOVE; + gtp_reset_guitar(i2c_connect_client, 50); + msleep(100); + memcpy(>p_glove_config[GTP_ADDR_LENGTH], cfg_group, GTP_CONFIG_MAX_LENGTH); + gtp_send_glove_cfg(i2c_connect_client); + } else if ('0' == gtp_glove_onoff) { + gtp_reset_guitar(i2c_connect_client, 50); + msleep(100); + gtp_send_cfg(i2c_connect_client); + } + return count; +} + +static const struct file_operations gt_glove_onoff_proc_fops = { + .write = proc_glove_onoff_write, + .read = proc_glove_onoff_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +#endif + +#if GTP_GESTURE_WAKEUP +char gtp_gesture_coordinate[60] = {0X8140 >> 8, 0X8140 & 0xFF}; +char gtp_gesture_value = 0; +char gtp_gesture_onoff = '0'; +const char gtp_gesture_type[] = GTP_GESTURE_TPYE_STR; +static const char gtp_gesture_support_flag = GTP_GESTURE_SUPPORT_ONOFF; +static const char gtp_verson[] = GTP_PROC_DRIVER_VERSION; +static char gtp_gesture_support_flag_changed = 0; +struct i2c_client *i2c_client_point = NULL; + + +static ssize_t proc_gesture_data_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + int num = 0; + if (*ppos) + return 0; + printk("proc_gesture_data_read=%d\n", gtp_gesture_value); + num = sprintf(buffer, "%c\n", gtp_gesture_value); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_data_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_value); + return count; +} + +static ssize_t proc_gesture_type_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) { + printk("%s\n",__func__); + return 0; + } + num = sprintf(buffer, "%s\n", gtp_gesture_type); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_type_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return -1; +} + +static ssize_t proc_gesture_onoff_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + if (0 == gtp_gesture_support_flag_changed) + num = sprintf(page, "%c\n", gtp_gesture_support_flag); + else + num = sprintf(page, "%c\n", gtp_gesture_onoff); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_onoff_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_onoff); + gtp_gesture_support_flag_changed = 1; + printk("in proc_gesture_onoff_write %c \n", gtp_gesture_onoff); + return count; +} + +static ssize_t proc_version_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + num = sprintf(page, "%s\n", gtp_verson); + *ppos += num; + return num; +} + +static ssize_t proc_version_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return count; +} + +static ssize_t proc_gesture_coordinate_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + if (*ppos) + return 0; + memcpy(page, gtp_gesture_coordinate, 60); + printk("GTP gtp_ges 0x%02x\n", gtp_gesture_coordinate[13]); + memset(gtp_gesture_coordinate, 0, 60); + *ppos += 60; + return 60; +} + +static ssize_t proc_gesture_coordinate_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return count; +} + +static const struct file_operations gt_gesture_var_proc_fops = { + .write = proc_gesture_data_write, + .read = proc_gesture_data_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_gesture_type_proc_fops = { + .write = proc_gesture_type_write, + .read = proc_gesture_type_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_gesture_onoff_proc_fops = { + .write = proc_gesture_onoff_write, + .read = proc_gesture_onoff_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_version_proc_fops = { + .write = proc_version_write, + .read = proc_version_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_coordinate_proc_fops = { + .write = proc_gesture_coordinate_write, + .read = proc_gesture_coordinate_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + + +void Ctp_Gesture_Fucntion_Proc_File(void) +{ + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_gesture_wakup_proc = NULL; + struct proc_dir_entry *ctp_gesture_var_proc = NULL; + struct proc_dir_entry *ctp_gesture_type_proc = NULL; + struct proc_dir_entry *ctp_gesture_onoff_proc = NULL; + struct proc_dir_entry *ctp_glove_onoff_proc = NULL; + struct proc_dir_entry *ctp_version_proc = NULL; + struct proc_dir_entry *ctp_coordinate_proc = NULL; +#define CTP_GESTURE_FUNCTION_AUTHORITY_PROC 0777 + + ctp_device_proc = proc_mkdir("touchscreen_feature", NULL); + ctp_gesture_wakup_proc = proc_mkdir("gesture", NULL); + + ctp_gesture_var_proc = proc_create("data", 0444, ctp_gesture_wakup_proc, >_gesture_var_proc_fops); + if (ctp_gesture_var_proc == NULL) { + GTP_ERROR("ctp_gesture_var_proc create failed\n"); + } + + ctp_gesture_type_proc = proc_create("gesture_type", 0444, ctp_device_proc, >_gesture_type_proc_fops); + if (ctp_gesture_type_proc == NULL) { + GTP_ERROR("ctp_gesture_type_proc create failed\n"); + } + + ctp_gesture_onoff_proc = proc_create("onoff", 0666, ctp_gesture_wakup_proc, >_gesture_onoff_proc_fops); + if (ctp_gesture_onoff_proc == NULL) { + GTP_ERROR("ctp_gesture_onoff_proc create failed\n"); + } + +#if GTP_GLOVE_MODE + ctp_glove_onoff_proc = proc_create("glove_onoff", 0666, ctp_device_proc, >_glove_onoff_proc_fops); + if (ctp_glove_onoff_proc == NULL) { + GTP_ERROR("ctp_gesture_onoff_proc create failed\n"); + } +#endif + + ctp_version_proc = proc_create("version", 0444, ctp_device_proc, >_version_proc_fops); + if (ctp_version_proc == NULL) { + GTP_ERROR("create_proc_entry version failed\n"); + } + + ctp_coordinate_proc = proc_create("gesture_coordinate", 0777, ctp_device_proc, >_coordinate_proc_fops); + if (ctp_coordinate_proc == NULL) { + GTP_ERROR("create_proc_entry version failed\n"); + } + +} + +#endif + + + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf,size_t count, loff_t *ppos) +{ + char *ptr = buf; + + if (*ppos) { + GTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + return sprintf(ptr, "%02X%02X%02X%02X%02X%02X%02X%02X\n", + lockdown_info[0], lockdown_info[1], lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], lockdown_info[6], lockdown_info[7]); +} +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -1; +} + +static const struct file_operations ctp_lockdown_procs_fops = +{ + .write = ctp_lockdown_proc_write, + .read = ctp_lockdown_proc_read, + .owner = THIS_MODULE, +}; + +void ctp_lockdown_fucntion_proc_file(void) +{ + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_lockdown_proc = NULL; + + ctp_device_proc = proc_mkdir("touchscreen", NULL); + + ctp_lockdown_proc = proc_create("lockdown_info", 0666, ctp_device_proc, &ctp_lockdown_procs_fops); + if (ctp_lockdown_proc == NULL) { + GTP_ERROR("create_proc_entry lockdown failed\n"); + } +} +#endif + +/******************************************************* +Function: + Read data from the i2c slave device. +Input: + client: i2c device. + buf[0~1]: read start address. + buf[2~len-1]: read data buffer. + len: GTP_ADDR_LENGTH + read bytes count +Output: + numbers of i2c_msgs to transfer: + 2: succeed, otherwise: failed +*********************************************************/ +s32 gtp_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + if ((retries >= 5)) { + #if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); + #endif + + #if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) { + return ret; + } + #endif + GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + gtp_recovery_reset(client); + } else + #endif + { + gtp_reset_guitar(client, 10); + } + } + return ret; +} + + + +/******************************************************* +Function: + Write data to the i2c slave device. +Input: + client: i2c device. + buf[0~1]: write start address. + buf[2~len-1]: data buffer + len: GTP_ADDR_LENGTH + write bytes count +Output: + numbers of i2c_msgs to transfer: + 1: succeed, otherwise: failed +*********************************************************/ +s32 gtp_i2c_write(struct i2c_client *client,u8 *buf,s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1)break; + retries++; + } + if ((retries >= 5)) { + #if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); + #endif + + #if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) { + return ret; + } + #endif + GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + gtp_recovery_reset(client); + } else + #endif + { + gtp_reset_guitar(client, 10); + } + } + return ret; +} + + +/******************************************************* +Function: + i2c read twice, compare the results +Input: + client: i2c device + addr: operate address + rxbuf: read data to store, if compare successful + len: bytes to read +Output: + FAIL: read failed + SUCCESS: read successful +*********************************************************/ +s32 gtp_i2c_read_dbl_check(struct i2c_client *client, u16 addr, u8 *rxbuf, int len) +{ + u8 buf[16] = {0}; + u8 confirm_buf[16] = {0}; + u8 retry = 0; + + while (retry++ < 3) { + memset(buf, 0xAA, 16); + buf[0] = (u8)(addr >> 8); + buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, buf, len + 2); + + memset(confirm_buf, 0xAB, 16); + confirm_buf[0] = (u8)(addr >> 8); + confirm_buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, confirm_buf, len + 2); + + if (!memcmp(buf, confirm_buf, len+2)) { + memcpy(rxbuf, confirm_buf+2, len); + return SUCCESS; + } + } + GTP_ERROR("I2C read 0x%04X, %d bytes, double check failed!", addr, len); + return FAIL; +} + +/******************************************************* +Function: + Send config. +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ + +s32 gtp_send_glove_cfg(struct i2c_client *client) +{ + s32 ret = 2; + +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts->pnl_init_error) { + GTP_INFO("Error occured in init_panel, no config sent"); + return 0; + } + GTP_INFO("Driver send config."); + for (retry = 0; retry < 5; retry++) { + ret = gtp_i2c_write(client, gtp_glove_config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + if (ret > 0) { + break; + } + } +#endif + return ret; +} + +/******************************************************* +Function: + Send config. +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ + +s32 gtp_send_cfg(struct i2c_client *client) +{ + s32 ret = 2; + +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts->pnl_init_error) { + GTP_INFO("Error occured in init_panel, no config sent"); + return 0; + } + + GTP_INFO("Driver send config."); + for (retry = 0; retry < 5; retry++) { + ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + if (ret > 0) { + break; + } + } +#endif + return ret; +} +/******************************************************* +Function: + Disable irq function +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +void gtp_irq_disable(struct goodix_ts_data *ts) +{ + unsigned long irqflags; + + GTP_DEBUG_FUNC(); + + spin_lock_irqsave(&ts->irq_lock, irqflags); + if (!ts->irq_is_disable) { + ts->irq_is_disable = 1; + disable_irq_nosync(ts->client->irq); + } + spin_unlock_irqrestore(&ts->irq_lock, irqflags); +} + +/******************************************************* +Function: + Enable irq function +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +void gtp_irq_enable(struct goodix_ts_data *ts) +{ + unsigned long irqflags = 0; + + GTP_DEBUG_FUNC(); + + spin_lock_irqsave(&ts->irq_lock, irqflags); + if (ts->irq_is_disable) { + enable_irq(ts->client->irq); + ts->irq_is_disable = 0; + } + spin_unlock_irqrestore(&ts->irq_lock, irqflags); +} + + +/******************************************************* +Function: + Report touch point event +Input: + ts: goodix i2c_client private data + id: trackId + x: input x coordinate + y: input y coordinate + w: input pressure +Output: + None. +*********************************************************/ +static void gtp_touch_down(struct goodix_ts_data* ts,s32 id,s32 x,s32 y,s32 w) +{ +#if GTP_CHANGE_X2Y + GTP_SWAP(x, y); +#endif + + if (gtp_ics_slot_report==1) { + input_mt_slot(ts->input_dev, id); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + } else { + input_report_key(ts->input_dev, BTN_TOUCH, 1); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); + input_mt_sync(ts->input_dev); + } + + GTP_DEBUG("ID:%d, X:%d, Y:%d, W:%d", id, x, y, w); +} + +/******************************************************* +Function: + Report touch release event +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +static void gtp_touch_up(struct goodix_ts_data* ts, s32 id) +{ + if (gtp_ics_slot_report==1) { + input_mt_slot(ts->input_dev, id); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, -1); + GTP_DEBUG("Touch id[%2d] release!", id); + } else { + input_report_key(ts->input_dev, BTN_TOUCH, 0); + } +} + +#if GTP_WITH_PEN + +static void gtp_pen_init(struct goodix_ts_data *ts) +{ + s32 ret = 0; + + GTP_INFO("Request input device for pen/stylus."); + + ts->pen_dev = input_allocate_device(); + if (ts->pen_dev == NULL) { + GTP_ERROR("Failed to allocate input device for pen/stylus."); + return; + } + + ts->pen_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; + + if (gtp_ics_slot_report == 1) { + input_mt_init_slots(ts->pen_dev, 16); + } else { + ts->pen_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + } + + + set_bit(BTN_TOOL_PEN, ts->pen_dev->keybit); + set_bit(INPUT_PROP_DIRECT, ts->pen_dev->propbit); + +#if GTP_PEN_HAVE_BUTTON + input_set_capability(ts->pen_dev, EV_KEY, BTN_STYLUS); + input_set_capability(ts->pen_dev, EV_KEY, BTN_STYLUS2); +#endif + + input_set_abs_params(ts->pen_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_PRESSURE, 0, 255, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); + + ts->pen_dev->name = "goodix-pen"; + ts->pen_dev->id.bustype = BUS_I2C; + + ret = input_register_device(ts->pen_dev); + if (ret) { + GTP_ERROR("Register %s input device failed", ts->pen_dev->name); + return; + } +} + +static void gtp_pen_down(s32 x, s32 y, s32 w, s32 id) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + +#if GTP_CHANGE_X2Y + GTP_SWAP(x, y); +#endif + + input_report_key(ts->pen_dev, BTN_TOOL_PEN, 1); + + if (gtp_ics_slot_report==1) { + input_mt_slot(ts->pen_dev, id); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, id); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->pen_dev, ABS_MT_PRESSURE, w); + input_report_abs(ts->pen_dev, ABS_MT_TOUCH_MAJOR, w); + } else { + input_report_key(ts->pen_dev, BTN_TOUCH, 1); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->pen_dev, ABS_MT_PRESSURE, w); + input_report_abs(ts->pen_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, id); + input_mt_sync(ts->pen_dev); + } + + GTP_DEBUG("(%d)(%d, %d)[%d]", id, x, y, w); +} + +static void gtp_pen_up(s32 id) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + + input_report_key(ts->pen_dev, BTN_TOOL_PEN, 0); + + if (gtp_ics_slot_report==1) { + input_mt_slot(ts->pen_dev, id); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, -1); + } else { + input_report_key(ts->pen_dev, BTN_TOUCH, 0); + } + +} +#endif + +/******************************************************* +Function: + Goodix touchscreen work function +Input: + work: work struct of goodix_workqueue +Output: + None. +*********************************************************/ +static void goodix_ts_work_func(struct work_struct *work) +{ + u8 end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0}; + u8 point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF}; + u8 touch_num = 0; + u8 finger = 0; + static u16 pre_touch = 0; + static u8 pre_key = 0; +#if GTP_WITH_PEN + u8 pen_active = 0; + static u8 pre_pen = 0; +#endif + u8 key_value = 0; + u8 *coor_data = NULL; + s32 input_x = 0; + s32 input_y = 0; + s32 input_w = 0; + s32 id = 0; + s32 i = 0; + s32 ret = -1; + struct goodix_ts_data *ts = NULL; + +#if GTP_COMPATIBLE_MODE + u8 rqst_buf[3] = {0x80, 0x43}; +#endif + +#if GTP_GESTURE_WAKEUP + u8 doze_buf[3] = {0x81, 0x4B}; +#endif + + GTP_DEBUG_FUNC(); + ts = container_of(work, struct goodix_ts_data, work); + if (ts->enter_update) { + return; + } +#if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) { + ret = gtp_i2c_read(i2c_connect_client, doze_buf, 3); + GTP_DEBUG("0x814B = 0x%02X", doze_buf[2]); + if (ret > 0) { + if ('1'== gtp_gesture_onoff) { + gtp_gesture_coordinate[0]=0X8140 >> 8; + gtp_gesture_coordinate[1]=0X8140 & 0xFF; + + if ((doze_buf[2] == 'a') || (doze_buf[2] == 'b') || (doze_buf[2] == 'c') || + (doze_buf[2] == 'd') || (doze_buf[2] == 'e') || (doze_buf[2] == 'g') || + (doze_buf[2] == 'h') || (doze_buf[2] == 'm') || (doze_buf[2] == 'o') || + (doze_buf[2] == 'q') || (doze_buf[2] == 's') || (doze_buf[2] == 'v') || + (doze_buf[2] == 'w') || (doze_buf[2] == 'y') || (doze_buf[2] == 'z') || + (doze_buf[2] == 0x5E) /* ^ */ + ) { + GTP_INFO("Gesture type;%c\n",doze_buf[2]); + gtp_gesture_value =doze_buf[2]; + if (doze_buf[2] != 0x5E) { + GTP_INFO("Wakeup by gesture(%c), light up the screen!", doze_buf[2]); + } else { + GTP_INFO("Wakeup by gesture(^), light up the screen!"); + } + + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL!=strchr(gtp_gesture_type, gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + }; + + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else if ((doze_buf[2] == 0xAA) || (doze_buf[2] == 0xBB) || + (doze_buf[2] == 0xAB) || (doze_buf[2] == 0xBA)) { + char *direction[4] = {"Right", "Down", "Up", "Left"}; + u8 type = ((doze_buf[2] & 0x0F) - 0x0A) + (((doze_buf[2] >> 4) & 0x0F) - 0x0A) * 2; + + GTP_INFO("%s slide to light up the screen!", direction[type]); + switch (doze_buf[2]) { + case 0xAA: + gtp_gesture_value = 'R'; + break; + case 0xAB: + gtp_gesture_value = 'D'; + break; + case 0xBA: + gtp_gesture_value = 'U'; + break; + case 0xBB: + gtp_gesture_value = 'L'; + break; + } + + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL!=strchr(gtp_gesture_type,gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + } + + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else if (0xCC == doze_buf[2]) { + GTP_INFO("Double click to light up the screen!"); + gtp_gesture_value = 'K'; + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL!=strchr(gtp_gesture_type, gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + } + + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else { + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + gtp_enter_doze(ts); + } + } + } + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } +#endif + + ret = gtp_i2c_read(ts->client, point_data, 12); + if (ret < 0) { + GTP_ERROR("I2C transfer error. errno:%d\n ", ret); + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } + + finger = point_data[GTP_ADDR_LENGTH]; + +#if GTP_COMPATIBLE_MODE + if ((finger == 0x00) && (CHIP_TYPE_GT9F == ts->chip_type)) { + ret = gtp_i2c_read(ts->client, rqst_buf, 3); + if (ret < 0) { + GTP_ERROR("Read request status error!"); + goto exit_work_func; + } + + switch (rqst_buf[2]) { + case GTP_RQST_CONFIG: + GTP_INFO("Request for config."); + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Request for config unresponded!"); + } else { + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + GTP_INFO("Request for config responded!"); + } + break; + + case GTP_RQST_BAK_REF: + GTP_INFO("Request for backup reference."); + ts->rqst_processing = 1; + ret = gtp_bak_ref_proc(ts, GTP_BAK_REF_SEND); + if (SUCCESS == ret) { + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + ts->rqst_processing = 0; + GTP_INFO("Request for backup reference responded!"); + } else { + GTP_ERROR("Requeset for backup reference unresponed!"); + } + break; + + case GTP_RQST_RESET: + GTP_INFO("Request for reset."); + gtp_recovery_reset(ts->client); + break; + + case GTP_RQST_MAIN_CLOCK: + GTP_INFO("Request for main clock."); + ts->rqst_processing = 1; + ret = gtp_main_clk_proc(ts); + if (FAIL == ret) { + GTP_ERROR("Request for main clock unresponded!"); + } else { + GTP_INFO("Request for main clock responded!"); + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + ts->rqst_processing = 0; + ts->clk_chk_fs_times = 0; + } + break; + + default: + GTP_INFO("Undefined request: 0x%02X", rqst_buf[2]); + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + break; + } + } +#endif + if (finger == 0x00) { + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } + + if ((finger & 0x80) == 0) { + goto exit_work_func; + } + + touch_num = finger & 0x0f; + + if (touch_num > GTP_MAX_TOUCH) { + goto exit_work_func; + } + + if (touch_num > 1) { + u8 buf[8 * GTP_MAX_TOUCH] = {(GTP_READ_COOR_ADDR + 10) >> 8, (GTP_READ_COOR_ADDR + 10) & 0xff}; + + ret = gtp_i2c_read(ts->client, buf, 2 + 8 * (touch_num - 1)); + memcpy(&point_data[12], &buf[2], 8 * (touch_num - 1)); + } + +#if (GTP_HAVE_TOUCH_KEY || GTP_PEN_HAVE_BUTTON) + key_value = point_data[3 + 8 * touch_num]; + + if (key_value || pre_key) { + #if GTP_PEN_HAVE_BUTTON + if (key_value == 0x40) { + GTP_DEBUG("BTN_STYLUS & BTN_STYLUS2 Down."); + input_report_key(ts->pen_dev, BTN_STYLUS, 1); + input_report_key(ts->pen_dev, BTN_STYLUS2, 1); + pen_active = 1; + } else if (key_value == 0x10) { + GTP_DEBUG("BTN_STYLUS Down, BTN_STYLUS2 Up."); + input_report_key(ts->pen_dev, BTN_STYLUS, 1); + input_report_key(ts->pen_dev, BTN_STYLUS2, 0); + pen_active = 1; + } else if (key_value == 0x20) { + GTP_DEBUG("BTN_STYLUS Up, BTN_STYLUS2 Down."); + input_report_key(ts->pen_dev, BTN_STYLUS, 0); + input_report_key(ts->pen_dev, BTN_STYLUS2, 1); + pen_active = 1; + } else { + GTP_DEBUG("BTN_STYLUS & BTN_STYLUS2 Up."); + input_report_key(ts->pen_dev, BTN_STYLUS, 0); + input_report_key(ts->pen_dev, BTN_STYLUS2, 0); + if ((pre_key == 0x40) || (pre_key == 0x20) || + (pre_key == 0x10) + ) { + pen_active = 1; + } + } + if (pen_active) { + touch_num = 0; + } + #endif + + #if GTP_HAVE_TOUCH_KEY + if (!pre_touch) { + for (i = 0; i < GTP_MAX_KEY_NUM; i++) { + #if GTP_DEBUG_ON + for (ret = 0; ret < 4; ++ret) { + if (key_codes[ret] == touch_key_array[i]) { + GTP_DEBUG("Key: %s %s", key_names[ret], (key_value & (0x01 << i)) ? "Down" : "Up"); + break; + } + } + #endif + if (gtp_ics_slot_report == 1) + input_report_key(ts->input_dev, touch_key_array[i], key_value & (0x01<pen_dev); + } else +#endif + { + input_sync(ts->input_dev); + } + +exit_work_func: + if (!ts->gtp_rawdiff_mode) { + ret = gtp_i2c_write(ts->client, end_cmd, 3); + if (ret < 0) { + GTP_INFO("I2C write end_cmd error!"); + } + } + if (ts->use_irq) { + gtp_irq_enable(ts); + } +} + +/******************************************************* +Function: + Timer interrupt service routine for polling mode. +Input: + timer: timer struct pointer +Output: + Timer work mode. + HRTIMER_NORESTART: no restart mode +*********************************************************/ +static enum hrtimer_restart goodix_ts_timer_handler(struct hrtimer *timer) +{ + struct goodix_ts_data *ts = container_of(timer, struct goodix_ts_data, timer); + + GTP_DEBUG_FUNC(); + + queue_work(goodix_wq, &ts->work); + hrtimer_start(&ts->timer, ktime_set(0, (GTP_POLL_TIME+6)*1000000), HRTIMER_MODE_REL); + return HRTIMER_NORESTART; +} + +/******************************************************* +Function: + External interrupt service routine for interrupt mode. +Input: + irq: interrupt number. + dev_id: private data pointer +Output: + Handle Result. + IRQ_HANDLED: interrupt handled successfully +*********************************************************/ +static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id) +{ + struct goodix_ts_data *ts = dev_id; + + GTP_DEBUG_FUNC(); + + gtp_irq_disable(ts); + + queue_work(goodix_wq, &ts->work); + + return IRQ_HANDLED; +} +/******************************************************* +Function: + Synchronization. +Input: + ms: synchronization time in millisecond. +Output: + None. +*******************************************************/ +void gtp_int_sync(s32 ms) +{ + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(ms); + GTP_GPIO_AS_INT(gtp_int_gpio); +} + + +/******************************************************* +Function: + Reset chip. +Input: + ms: reset time in millisecond +Output: + None. +*******************************************************/ +void gtp_reset_guitar(struct i2c_client *client, s32 ms) +{ +#if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); +#endif + + GTP_DEBUG_FUNC(); + GTP_INFO("Guitar reset"); + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(ms); + GTP_GPIO_OUTPUT(gtp_int_gpio, client->addr == 0x14); + + msleep(2); + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + msleep(6); + + GTP_GPIO_AS_INPUT(gtp_rst_gpio); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return; + } +#endif + + gtp_int_sync(50); +#if GTP_ESD_PROTECT + gtp_init_ext_watchdog(client); +#endif +} + +#if GTP_GESTURE_WAKEUP +/******************************************************* +Function: + Enter doze mode for sliding wakeup. +Input: + ts: goodix tp private data +Output: + 1: succeed, otherwise failed +*******************************************************/ +static s8 gtp_enter_doze(struct goodix_ts_data *ts) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 8}; + + GTP_DEBUG_FUNC(); + + GTP_DEBUG("Entering gesture mode."); + while (retry++ < 5) { + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x46; + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret < 0) { + GTP_DEBUG("failed to set doze flag into 0x8046, %d", retry); + continue; + } + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x40; + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret > 0) { + doze_status = DOZE_ENABLED; + GTP_INFO("Gesture mode enabled."); + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send gesture cmd failed."); + return ret; +} +#endif +/******************************************************* +Function: + Enter sleep mode. +Input: + ts: private data. +Output: + Executive outcomes. + 1: succeed, otherwise failed. +*******************************************************/ +static s8 gtp_enter_sleep(struct goodix_ts_data *ts) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 5}; + +#if GTP_COMPATIBLE_MODE + u8 status_buf[3] = {0x80, 0x44}; +#endif + + GTP_DEBUG_FUNC(); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + ret = gtp_i2c_read(ts->client, status_buf, 3); + if (ret < 0) { + GTP_ERROR("failed to get backup-reference status"); + } + + if (status_buf[2] & 0x80) { + ret = gtp_bak_ref_proc(ts, GTP_BAK_REF_STORE); + if (FAIL == ret) { + GTP_ERROR("failed to store bak_ref"); + } + } + } +#endif + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(5); + + while (retry++ < 5) { + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret > 0) { + GTP_INFO("GTP enter sleep!"); + + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send sleep cmd failed."); + return ret; +} + +/******************************************************* +Function: + Wakeup from sleep. +Input: + ts: private data. +Output: + Executive outcomes. + >0: succeed, otherwise: failed. +*******************************************************/ +static s8 gtp_wakeup_sleep(struct goodix_ts_data *ts) +{ + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG_FUNC(); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + u8 opr_buf[3] = {0x41, 0x80}; + + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(5); + + for (retry = 0; retry < 10; ++retry) { + opr_buf[2] = 0x0C; + ret = gtp_i2c_write(ts->client, opr_buf, 3); + if (FAIL == ret) { + GTP_ERROR("failed to hold ss51 & dsp!"); + continue; + } + opr_buf[2] = 0x00; + ret = gtp_i2c_read(ts->client, opr_buf, 3); + if (FAIL == ret) { + GTP_ERROR("failed to get ss51 & dsp status!"); + continue; + } + if (0x0C != opr_buf[2]) { + GTP_DEBUG("ss51 & dsp not been hold, %d", retry+1); + continue; + } + GTP_DEBUG("ss51 & dsp confirmed hold"); + + ret = gtp_fw_startup(ts->client); + if (FAIL == ret) { + GTP_ERROR("failed to startup GT9XXF, process recovery"); + gtp_esd_recovery(ts->client); + } + break; + } + if (retry >= 10) { + GTP_ERROR("failed to wakeup, processing esd recovery"); + gtp_esd_recovery(ts->client); + } else { + GTP_INFO("GT9XXF gtp wakeup success"); + } + return ret; + } +#endif + +#if GTP_POWER_CTRL_SLEEP + while (retry++ < 5) { + gtp_reset_guitar(ts->client, 20); + + GTP_INFO("GTP wakeup sleep."); + return 1; + } +#else + while (retry++ < 10) { + #if GTP_GESTURE_WAKEUP + if (DOZE_WAKEUP != doze_status) { + GTP_INFO("Powerkey wakeup."); + } else { + GTP_INFO("Gesture wakeup."); + } + doze_status = DOZE_DISABLED; + gtp_irq_disable(ts); + gtp_reset_guitar(ts->client, 10); + gtp_irq_enable(ts); + #else + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(5); + + #endif + + ret = gtp_i2c_test(ts->client); + if (ret > 0) { + GTP_INFO("GTP wakeup sleep."); + + #if (!GTP_GESTURE_WAKEUP) + { + gtp_int_sync(25); + #if GTP_ESD_PROTECT + gtp_init_ext_watchdog(ts->client); + #endif + } + #endif + + return ret; + } + gtp_reset_guitar(ts->client, 20); + } +#endif + + GTP_ERROR("GTP wakeup sleep failed."); + return ret; +} + +/******************************************************* +Function: + Initialize gtp. +Input: + ts: goodix private data +Output: + Executive outcomes. + 0: succeed, otherwise: failed +*******************************************************/ +static s32 gtp_init_panel(struct goodix_ts_data *ts) +{ + s32 ret = -1; + +#if GTP_DRIVER_SEND_CFG + s32 i = 0; + u8 check_sum = 0; + u8 opr_buf[16] = {0}; + u8 sensor_id = 0; + u8 drv_cfg_version; + u8 flash_cfg_version; + +/* if defined CONFIG_OF, parse config data from dtsi + * else parse config data form header file. + */ +#ifdef GTP_CONFIG_OF + u8 cfg_info_group0[] = CTP_CFG_GROUP0; + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + + u8 *send_cfg_buf[] = {cfg_info_group0,cfg_info_group1, + cfg_info_group2, cfg_info_group3, + cfg_info_group4, cfg_info_group5}; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group0), + CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5)}; + + GTP_DEBUG("Config Groups\' Lengths: %d, %d, %d, %d, %d, %d", + cfg_info_len[0], cfg_info_len[1], cfg_info_len[2], cfg_info_len[3], + cfg_info_len[4], cfg_info_len[5]); +#endif + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + ts->fw_error = 0; + } else +#endif + { /* check firmware */ + ret = gtp_i2c_read_dbl_check(ts->client, 0x41E4, opr_buf, 1); + if (SUCCESS == ret) { + if (opr_buf[0] != 0xBE) { + ts->fw_error = 1; + GTP_ERROR("Firmware error, no config sent!"); + return -1; + } + } + } + + /* read sensor id */ +#if GTP_COMPATIBLE_MODE + msleep(50); +#endif + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) { + if (sensor_id >= 0x06) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + ts->pnl_init_error = 1; + return -1; + } + } else { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + ts->pnl_init_error = 1; + return -1; + } + GTP_INFO("Sensor_ID: %d", sensor_id); + tp_sensor_id = sensor_id; + + /* parse config data*/ +#if 0 + GTP_DEBUG("Get config data from device tree."); + ret = gtp_parse_dt_cfg(&ts->client->dev, &config[GTP_ADDR_LENGTH], &ts->gtp_cfg_len, sensor_id); + if (ret < 0) { + GTP_ERROR("Failed to parse config data form device tree."); + ts->pnl_init_error = 1; + return -1; + } +#else + GTP_DEBUG("Get config data from header file."); + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) { + sensor_id = 0; + } + ts->gtp_cfg_len = cfg_info_len[sensor_id]; + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len); +#endif + + GTP_INFO("Config group%d used,length: %d", sensor_id, ts->gtp_cfg_len); + + if (ts->gtp_cfg_len < GTP_CONFIG_MIN_LENGTH) { + GTP_ERROR("Config Group%d is INVALID CONFIG GROUP(Len: %d)! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id, ts->gtp_cfg_len); + ts->pnl_init_error = 1; + return -1; + } + +#if GTP_COMPATIBLE_MODE + if (ts->chip_type != CHIP_TYPE_GT9F) +#endif + { + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + if (ret == SUCCESS) { + GTP_DEBUG("Config Version: %d, 0x%02X; IC Config Version: %d, 0x%02X", + config[GTP_ADDR_LENGTH], config[GTP_ADDR_LENGTH], opr_buf[0], opr_buf[0]); + + flash_cfg_version = opr_buf[0]; + drv_cfg_version = config[GTP_ADDR_LENGTH]; + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + config[GTP_ADDR_LENGTH] = 0x00; + } + } else { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -1; + } + } + +#if GTP_CUSTOM_CFG + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) { + config[TRIGGER_LOC] &= 0xfe; + } else if (GTP_INT_TRIGGER == 1) { + config[TRIGGER_LOC] |= 0x01; + } +#endif + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + +#else + + ts->gtp_cfg_len = GTP_CONFIG_MAX_LENGTH; + ret = gtp_i2c_read(ts->client, config, ts->gtp_cfg_len + GTP_ADDR_LENGTH); + if (ret < 0) { + GTP_ERROR("Read Config Failed, Using Default Resolution & INT Trigger!"); + ts->abs_x_max = GTP_MAX_WIDTH; + ts->abs_y_max = GTP_MAX_HEIGHT; + ts->int_trigger_type = GTP_INT_TRIGGER; + } + +#endif + + if ((ts->abs_x_max == 0) && (ts->abs_y_max == 0)) { + ts->abs_x_max = (config[RESOLUTION_LOC + 1] << 8) + config[RESOLUTION_LOC]; + ts->abs_y_max = (config[RESOLUTION_LOC + 3] << 8) + config[RESOLUTION_LOC + 2]; + ts->int_trigger_type = (config[TRIGGER_LOC]) & 0x03; + } + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + u8 sensor_num = 0; + u8 driver_num = 0; + u8 have_key = 0; + + have_key = (config[GTP_REG_HAVE_KEY - GTP_REG_CONFIG_DATA + 2] & 0x01); + + if (1 == ts->is_950) { + driver_num = config[GTP_REG_MATRIX_DRVNUM - GTP_REG_CONFIG_DATA + 2]; + sensor_num = config[GTP_REG_MATRIX_SENNUM - GTP_REG_CONFIG_DATA + 2]; + if (have_key) { + driver_num--; + } + ts->bak_ref_len = (driver_num * (sensor_num - 1) + 2) * 2 * 6; + } else { + driver_num = (config[CFG_LOC_DRVA_NUM] & 0x1F) + (config[CFG_LOC_DRVB_NUM]&0x1F); + if (have_key) { + driver_num--; + } + sensor_num = (config[CFG_LOC_SENS_NUM] & 0x0F) + ((config[CFG_LOC_SENS_NUM] >> 4) & 0x0F); + ts->bak_ref_len = (driver_num * (sensor_num - 2) + 2) * 2; + } + + GTP_INFO("Drv * Sen: %d * %d(key: %d), X_MAX: %d, Y_MAX: %d, TRIGGER: 0x%02x", + driver_num, sensor_num, have_key, ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type); + return 0; + } else +#endif + { +#if GTP_DRIVER_SEND_CFG + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Send config error."); + } +#if GTP_COMPATIBLE_MODE + if (ts->chip_type != CHIP_TYPE_GT9F) +#endif + { + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + check_sum = 0; + config[GTP_ADDR_LENGTH] = drv_cfg_version; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + } + } + +#endif + GTP_INFO("X_MAX: %d, Y_MAX: %d, TRIGGER: 0x%02x", ts->abs_x_max,ts->abs_y_max,ts->int_trigger_type); + } + + msleep(10); + return 0; + +} + +static ssize_t gt91xx_config_read_proc(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + char *ptr = page; + char temp_data[GTP_CONFIG_MAX_LENGTH + 2] = {0x80, 0x47}; + int i; + + if (*ppos) { + return 0; + } + ptr += sprintf(ptr, "==== GT9XX config init value====\n"); + + for (i = 0 ; i < GTP_CONFIG_MAX_LENGTH ; i++) { + ptr += sprintf(ptr, "0x%02X ", config[i + 2]); + + if (i % 8 == 7) + ptr += sprintf(ptr, "\n"); + } + + ptr += sprintf(ptr, "\n"); + + ptr += sprintf(ptr, "==== GT9XX config real value====\n"); + gtp_i2c_read(i2c_connect_client, temp_data, GTP_CONFIG_MAX_LENGTH + 2); + for (i = 0 ; i < GTP_CONFIG_MAX_LENGTH ; i++) { + ptr += sprintf(ptr, "0x%02X ", temp_data[i+2]); + + if (i % 8 == 7) + ptr += sprintf(ptr, "\n"); + } + *ppos += ptr - page; + return (ptr - page); +} + +static ssize_t gt91xx_config_write_proc(struct file *filp, const char __user *buffer, size_t count, loff_t *off) +{ + s32 ret = 0; + + GTP_DEBUG("write count %ld\n", count); + + if (count > GTP_CONFIG_MAX_LENGTH) { + GTP_ERROR("size not match [%d:%ld]\n", GTP_CONFIG_MAX_LENGTH, count); + return -EFAULT; + } + + if (copy_from_user(&config[2], buffer, count)) { + GTP_ERROR("copy from user fail\n"); + return -EFAULT; + } + + ret = gtp_send_cfg(i2c_connect_client); + + if (ret < 0) { + GTP_ERROR("send config failed."); + } + + return count; +} +/******************************************************* +Function: + Read chip version. +Input: + client: i2c device + version: buffer to keep ic firmware version +Output: + read operation return. + 2: succeed, otherwise: failed +*******************************************************/ +s32 gtp_read_version(struct i2c_client *client, u16* version) +{ + s32 ret = -1; + u8 buf[8] = {GTP_REG_VERSION >> 8, GTP_REG_VERSION & 0xff}; + + GTP_DEBUG_FUNC(); + + ret = gtp_i2c_read(client, buf, sizeof(buf)); + if (ret < 0) { + GTP_ERROR("GTP read version failed"); + return ret; + } + + if (version) { + *version = (buf[7] << 8) | buf[6]; + } + if (buf[5] == 0x00) { + GTP_INFO("IC Version: %c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[7], buf[6]); + } else { + GTP_INFO("IC Version: %c%c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]); + } + return ret; +} + +/******************************************************* +Function: + I2c test Function. +Input: + client:i2c client. +Output: + Executive outcomes. + 2: succeed, otherwise failed. +*******************************************************/ +static s8 gtp_i2c_test(struct i2c_client *client) +{ + u8 test[3] = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG_FUNC(); + + while (retry++ < 5) { + ret = gtp_i2c_read(client, test, 3); + if (ret > 0) { + return ret; + } + GTP_ERROR("GTP i2c test failed time %d.",retry); + msleep(10); + } + return ret; +} + +/******************************************************* +Function: + Request gpio(INT & RST) ports. +Input: + ts: private data. +Output: + Executive outcomes. + >= 0: succeed, < 0: failed +*******************************************************/ +static s8 gtp_request_io_port(struct goodix_ts_data *ts) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + ret = GTP_GPIO_REQUEST(gtp_int_gpio, "GTP INT IRQ"); + + if (ret < 0) { + GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32)gtp_int_gpio, ret); + ret = -ENODEV; + } else { + GTP_GPIO_AS_INT(gtp_int_gpio); + ts->client->irq = gpio_to_irq(gtp_int_gpio); + } + + ret = GTP_GPIO_REQUEST(gtp_rst_gpio, "GTP RST PORT"); + if (ret < 0) { + GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32)gtp_rst_gpio, ret); + ret = -ENODEV; + } + + GTP_GPIO_AS_INPUT(gtp_rst_gpio); + + gtp_reset_guitar(ts->client, 20); + + if (ret < 0) { + GTP_GPIO_FREE(gtp_rst_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + } + + return ret; +} + +/******************************************************* +Function: + Request interrupt. +Input: + ts: private data. +Output: + Executive outcomes. + 0: succeed, -1: failed. +*******************************************************/ +static s8 gtp_request_irq(struct goodix_ts_data *ts) +{ + s32 ret = -1; + const u8 irq_table[] = GTP_IRQ_TAB; + + GTP_DEBUG_FUNC(); + GTP_DEBUG("INT trigger type:%x", ts->int_trigger_type); + + ret = request_irq(ts->client->irq, + goodix_ts_irq_handler, + irq_table[ts->int_trigger_type], + ts->client->name, + ts); + if (ret) { + GTP_ERROR("Request IRQ failed!ERRNO:%d.", ret); + GTP_GPIO_AS_INPUT(gtp_int_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + + hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ts->timer.function = goodix_ts_timer_handler; + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + return -1; + } else { + gtp_irq_disable(ts); + ts->use_irq = 1; + return 0; + } +} + +static int fts_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + char buffer[16]; + + if (type == EV_SYN && code == SYN_CONFIG) { + sprintf(buffer, "%d", value); + + GTP_INFO("GTP:Gesture on/off : %d",value); + if (value >= MXT_INPUT_EVENT_START && value <= MXT_INPUT_EVENT_END) { + if (value == MXT_INPUT_EVENT_WAKUP_MODE_ON) { + gtp_gesture_onoff = '1'; + } else if (value == MXT_INPUT_EVENT_WAKUP_MODE_OFF) { + gtp_gesture_onoff = '0'; + } else { + gtp_gesture_onoff = '0'; + GTP_ERROR("Failed Open/Close Gesture Function!\n"); + return -ENOMEM; + } + } + } + + return 0; +} +/******************************************************* +Function: + Request input device Function. +Input: + ts:private data. +Output: + Executive outcomes. + 0: succeed, otherwise: failed. +*******************************************************/ +static s8 gtp_request_input_dev(struct goodix_ts_data *ts) +{ + s8 ret = -1; +#if GTP_HAVE_TOUCH_KEY + u8 index = 0; +#endif + + GTP_DEBUG_FUNC(); + + ts->input_dev = input_allocate_device(); + if (ts->input_dev == NULL) { + GTP_ERROR("Failed to allocate input device."); + return -ENOMEM; + } + + ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; + + if (gtp_ics_slot_report==1) { + input_mt_init_slots(ts->input_dev, 10, 0); + } else { + ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + } + + __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit); + +#if GTP_HAVE_TOUCH_KEY + for (index = 0; index < GTP_MAX_KEY_NUM; index++) { + input_set_capability(ts->input_dev, EV_KEY, touch_key_array[index]); + } +#endif + +#if GTP_GESTURE_WAKEUP + input_set_capability(ts->input_dev, EV_KEY, KEY_POWER); + input_set_capability(ts->input_dev, EV_KEY, KEY_WAKEUP); + __set_bit(KEY_WAKEUP, ts->input_dev->keybit); + Ctp_Gesture_Fucntion_Proc_File(); +#endif + +#if GTP_CHANGE_X2Y + GTP_SWAP(ts->abs_x_max, ts->abs_y_max); +#endif + + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); + + ts->input_dev->name = goodix_ts_name; + ts->input_dev->phys = goodix_input_phys; + ts->input_dev->id.bustype = BUS_I2C; + ts->input_dev->id.vendor = 0xDEAD; + ts->input_dev->id.product = 0xBEEF; + ts->input_dev->id.version = 10427; + ts->input_dev->event = fts_input_event; + + ret = input_register_device(ts->input_dev); + if (ret) { + GTP_ERROR("Register %s input device failed", ts->input_dev->name); + return -ENODEV; + } + +#if GTP_WITH_PEN + gtp_pen_init(ts); +#endif + + return 0; +} + +#if GTP_COMPATIBLE_MODE + +s32 gtp_fw_startup(struct i2c_client *client) +{ + u8 opr_buf[4]; + s32 ret = 0; + + opr_buf[0] = 0xAA; + ret = i2c_write_bytes(client, 0x8041, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + + opr_buf[0] = 0x00; + ret = i2c_write_bytes(client, 0x4180, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + gtp_int_sync(25); + + ret = i2c_read_bytes(client, 0x8041, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + if (0xAA == opr_buf[0]) { + GTP_ERROR("IC works abnormally,startup failed."); + return FAIL; + } else { + GTP_INFO("IC works normally, Startup success."); + opr_buf[0] = 0xAA; + i2c_write_bytes(client, 0x8041, opr_buf, 1); + return SUCCESS; + } +} + +static s32 gtp_esd_recovery(struct i2c_client *client) +{ + s32 retry = 0; + s32 ret = 0; + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(client); + + gtp_irq_disable(ts); + + GTP_INFO("GT9XXF esd recovery mode"); + for (retry = 0; retry < 5; retry++) { + ret = gup_fw_download_proc(NULL, GTP_FL_ESD_RECOVERY); + if (FAIL == ret) { + GTP_ERROR("esd recovery failed %d", retry+1); + continue; + } + ret = gtp_fw_startup(ts->client); + if (FAIL == ret) { + GTP_ERROR("GT9XXF start up failed %d", retry+1); + continue; + } + break; + } + gtp_irq_enable(ts); + + if (retry >= 5) { + GTP_ERROR("failed to esd recovery"); + return FAIL; + } + + GTP_INFO("Esd recovery successful"); + return SUCCESS; +} + +void gtp_recovery_reset(struct i2c_client *client) +{ +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_OFF); +#endif + GTP_DEBUG_FUNC(); + + gtp_esd_recovery(client); + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif +} + +static s32 gtp_bak_ref_proc(struct goodix_ts_data *ts, u8 mode) +{ + s32 ret = 0; + s32 i = 0; + s32 j = 0; + u16 ref_sum = 0; + u16 learn_cnt = 0; + u16 chksum = 0; + s32 ref_seg_len = 0; + s32 ref_grps = 0; + struct file *ref_filp = NULL; + u8 *p_bak_ref; + + ret = gup_check_fs_mounted("/data"); + if (FAIL == ret) { + ts->ref_chk_fs_times++; + GTP_DEBUG("Ref check /data times/MAX_TIMES: %d / %d", ts->ref_chk_fs_times, GTP_CHK_FS_MNT_MAX); + if (ts->ref_chk_fs_times < GTP_CHK_FS_MNT_MAX) { + msleep(50); + GTP_INFO("/data not mounted."); + return FAIL; + } + GTP_INFO("check /data mount timeout..."); + } else { + GTP_INFO("/data mounted!!!(%d/%d)", ts->ref_chk_fs_times, GTP_CHK_FS_MNT_MAX); + } + + p_bak_ref = (u8 *)kzalloc(ts->bak_ref_len, GFP_KERNEL); + + if (NULL == p_bak_ref) { + GTP_ERROR("Allocate memory for p_bak_ref failed!"); + return FAIL; + } + + if (ts->is_950) { + ref_seg_len = ts->bak_ref_len / 6; + ref_grps = 6; + } else { + ref_seg_len = ts->bak_ref_len; + ref_grps = 1; + } + ref_filp = filp_open(GTP_BAK_REF_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(ref_filp)) { + GTP_ERROR("Failed to open/create %s.", GTP_BAK_REF_PATH); + if (GTP_BAK_REF_SEND == mode) { + goto bak_ref_default; + } else { + goto bak_ref_exit; + } + } + + switch (mode) { + case GTP_BAK_REF_SEND: + GTP_INFO("Send backup-reference"); + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ret = ref_filp->f_op->read(ref_filp, (char*)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + if (ret < 0) { + GTP_ERROR("failed to read bak_ref info from file, sending defualt bak_ref"); + goto bak_ref_default; + } + for (j = 0; j < ref_grps; ++j) { + ref_sum = 0; + for (i = 0; i < (ref_seg_len); i += 2) { + ref_sum += (p_bak_ref[i + j * ref_seg_len] << 8) + p_bak_ref[i+1 + j * ref_seg_len]; + } + learn_cnt = (p_bak_ref[j * ref_seg_len + ref_seg_len -4] << 8) + (p_bak_ref[j * ref_seg_len + ref_seg_len -3]); + chksum = (p_bak_ref[j * ref_seg_len + ref_seg_len -2] << 8) + (p_bak_ref[j * ref_seg_len + ref_seg_len -1]); + GTP_DEBUG("learn count = %d", learn_cnt); + GTP_DEBUG("chksum = %d", chksum); + GTP_DEBUG("ref_sum = 0x%04X", ref_sum & 0xFFFF); + if (1 != ref_sum) { + GTP_INFO("wrong chksum for bak_ref, reset to 0x00 bak_ref"); + memset(&p_bak_ref[j * ref_seg_len], 0, ref_seg_len); + p_bak_ref[ref_seg_len + j * ref_seg_len - 1] = 0x01; + } else { + if (j == (ref_grps - 1)) { + GTP_INFO("backup-reference data in %s used", GTP_BAK_REF_PATH); + } + } + } + ret = i2c_write_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (FAIL == ret) { + GTP_ERROR("failed to send bak_ref because of iic comm error"); + goto bak_ref_exit; + } + break; + + case GTP_BAK_REF_STORE: + GTP_INFO("Store backup-reference"); + ret = i2c_read_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (ret < 0) { + GTP_ERROR("failed to read bak_ref info, sending default back-reference"); + goto bak_ref_default; + } + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ref_filp->f_op->write(ref_filp, (char*)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + break; + + default: + GTP_ERROR("invalid backup-reference request"); + break; + } + ret = SUCCESS; + goto bak_ref_exit; + +bak_ref_default: + + for (j = 0; j < ref_grps; ++j) { + memset(&p_bak_ref[j * ref_seg_len], 0, ref_seg_len); + p_bak_ref[j * ref_seg_len + ref_seg_len - 1] = 0x01; + } + ret = i2c_write_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (!IS_ERR(ref_filp)) { + GTP_INFO("write backup-reference data into %s", GTP_BAK_REF_PATH); + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ref_filp->f_op->write(ref_filp, (char*)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + } + if (ret == FAIL) { + GTP_ERROR("failed to load the default backup reference"); + } + +bak_ref_exit: + + if (p_bak_ref) { + kfree(p_bak_ref); + } + if (ref_filp && !IS_ERR(ref_filp)) { + filp_close(ref_filp, NULL); + } + return ret; +} + + +static s32 gtp_verify_main_clk(u8 *p_main_clk) +{ + u8 chksum = 0; + u8 main_clock = p_main_clk[0]; + s32 i = 0; + + if (main_clock < 50 || main_clock > 120) { + return FAIL; + } + + for (i = 0; i < 5; ++i) { + if (main_clock != p_main_clk[i]) { + return FAIL; + } + chksum += p_main_clk[i]; + } + chksum += p_main_clk[5]; + if ((chksum) == 0) { + return SUCCESS; + } else { + return FAIL; + } +} + +static s32 gtp_main_clk_proc(struct goodix_ts_data *ts) +{ + s32 ret = 0; + s32 i = 0; + s32 clk_chksum = 0; + struct file *clk_filp = NULL; + u8 p_main_clk[6] = {0}; + + ret = gup_check_fs_mounted("/data"); + if (FAIL == ret) { + ts->clk_chk_fs_times++; + GTP_DEBUG("Clock check /data times/MAX_TIMES: %d / %d", ts->clk_chk_fs_times, GTP_CHK_FS_MNT_MAX); + if (ts->clk_chk_fs_times < GTP_CHK_FS_MNT_MAX) { + msleep(50); + GTP_INFO("/data not mounted."); + return FAIL; + } + GTP_INFO("Check /data mount timeout!"); + } else { + GTP_INFO("/data mounted!!!(%d/%d)", ts->clk_chk_fs_times, GTP_CHK_FS_MNT_MAX); + } + + clk_filp = filp_open(GTP_MAIN_CLK_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(clk_filp)) { + GTP_ERROR("%s is unavailable, calculate main clock", GTP_MAIN_CLK_PATH); + } else { + clk_filp->f_op->llseek(clk_filp, 0, SEEK_SET); + clk_filp->f_op->read(clk_filp, (char *)p_main_clk, 6, &clk_filp->f_pos); + + ret = gtp_verify_main_clk(p_main_clk); + if (FAIL == ret) { + GTP_ERROR("main clock data in %s is wrong, recalculate main clock", GTP_MAIN_CLK_PATH); + } else { + GTP_INFO("main clock data in %s used, main clock freq: %d", GTP_MAIN_CLK_PATH, p_main_clk[0]); + filp_close(clk_filp, NULL); + goto update_main_clk; + } + } + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ret = gup_clk_calibration(); + gtp_esd_recovery(ts->client); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + + GTP_INFO("calibrate main clock: %d", ret); + if (ret < 50 || ret > 120) { + GTP_ERROR("wrong main clock: %d", ret); + goto exit_main_clk; + } + + for (i = 0; i < 5; ++i) { + p_main_clk[i] = ret; + clk_chksum += p_main_clk[i]; + } + p_main_clk[5] = 0 - clk_chksum; + + if (!IS_ERR(clk_filp)) { + GTP_DEBUG("write main clock data into %s", GTP_MAIN_CLK_PATH); + clk_filp->f_op->llseek(clk_filp, 0, SEEK_SET); + clk_filp->f_op->write(clk_filp, (char *)p_main_clk, 6, &clk_filp->f_pos); + filp_close(clk_filp, NULL); + } + +update_main_clk: + ret = i2c_write_bytes(ts->client, GTP_REG_MAIN_CLK, p_main_clk, 6); + if (FAIL == ret) { + GTP_ERROR("update main clock failed!"); + return FAIL; + } + return SUCCESS; + +exit_main_clk: + if (!IS_ERR(clk_filp)) { + filp_close(clk_filp, NULL); + } + return FAIL; +} + + +s32 gtp_gt9xxf_init(struct i2c_client *client) +{ + s32 ret = 0; + + ret = gup_fw_download_proc(NULL, GTP_FL_FW_BURN); + if (FAIL == ret) { + return FAIL; + } + + ret = gtp_fw_startup(client); + if (FAIL == ret) { + return FAIL; + } + return SUCCESS; +} + +void gtp_get_chip_type(struct goodix_ts_data *ts) +{ + u8 opr_buf[10] = {0x00}; + s32 ret = 0; + + msleep(10); + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CHIP_TYPE, opr_buf, 10); + + if (FAIL == ret) { + GTP_ERROR("Failed to get chip-type, set chip type default: GOODIX_GT9"); + ts->chip_type = CHIP_TYPE_GT9; + return; + } + + if (!memcmp(opr_buf, "GOODIX_GT9", 10)) { + ts->chip_type = CHIP_TYPE_GT9; + } else { + ts->chip_type = CHIP_TYPE_GT9F; + } + GTP_INFO("Chip Type: %s", (ts->chip_type == CHIP_TYPE_GT9) ? "GOODIX_GT9" : "GOODIX_GT9F"); +} +#endif + +/* + * Devices Tree support, +*/ +#ifdef GTP_CONFIG_OF +/** + * gtp_parse_dt - parse platform infomation form devices tree. + */ +static void gtp_parse_dt(struct device *dev) +{ + struct device_node *np = dev->of_node; + + gtp_int_gpio = of_get_named_gpio(np, "goodix,irq-gpio", 0); + gtp_rst_gpio = of_get_named_gpio(np, "goodix,rst-gpio", 0); + + /********************** add 2016.4.28 **************/ +} + +/** + * gtp_parse_dt_cfg - parse config data from devices tree. + * @dev: device that this driver attached. + * @cfg: pointer of the config array. + * @cfg_len: pointer of the config length. + * @sid: sensor id. + * Return: 0-succeed, -1-faileds + */ +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid) +{ + struct device_node *np = dev->of_node; + struct property *prop; + char cfg_name[18]; + + snprintf(cfg_name, sizeof(cfg_name), "goodix,cfg-group%d", sid); + prop = of_find_property(np, cfg_name, cfg_len); + if (!prop || !prop->value || *cfg_len == 0 || *cfg_len > GTP_CONFIG_MAX_LENGTH) { + return -1;/* failed */ + } else { + memcpy(cfg, prop->value, *cfg_len); + return 0; + } +} + +/** + * gtp_power_switch - power switch . + * @on: 1-switch on, 0-switch off. + * return: 0-succeed, -1-faileds + */ +static int gtp_power_switch(struct i2c_client *client, int on) +{ + static struct regulator *vdd_ana; + static struct regulator *vcc_i2c; + int ret; + + if (!vdd_ana) { + vdd_ana = regulator_get(&client->dev, "vdd_ana"); + if (IS_ERR(vdd_ana)) { + GTP_ERROR("regulator get of vdd_ana failed"); + ret = PTR_ERR(vdd_ana); + vdd_ana = NULL; + return ret; + } + } + + if (!vcc_i2c) { + vcc_i2c = regulator_get(&client->dev, "vcc_i2c"); + if (IS_ERR(vcc_i2c)) { + GTP_ERROR("regulator get of vcc_i2c failed"); + ret = PTR_ERR(vcc_i2c); + vcc_i2c = NULL; + goto ERR_GET_VCC; + } + } + + if (on) { + GTP_DEBUG("GTP power on."); + ret = regulator_enable(vdd_ana); + udelay(2); + ret = regulator_enable(vcc_i2c); + } else { + GTP_DEBUG("GTP power off."); + ret = regulator_disable(vcc_i2c); + udelay(2); + ret = regulator_disable(vdd_ana); + } + return ret; + +ERR_GET_VCC: + regulator_put(vdd_ana); + return ret; +} +#endif + +#ifdef PMX_DRIVER_GT915L +static int goodix_ts_pinctrl_init(struct goodix_ts_data *goodix_data) +{ + int retval; + + goodix_data->ts_pinctrl = devm_pinctrl_get(&(goodix_data->client->dev)); + if (IS_ERR_OR_NULL(goodix_data->ts_pinctrl)) { + retval = PTR_ERR(goodix_data->ts_pinctrl); + dev_dbg(&goodix_data->client->dev, "Target does not use pinctrl %d\n", retval); + goto err_pinctrl_get; + } + goodix_data->pinctrl_state_active = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_ACTIVE); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_active)) { + retval = PTR_ERR(goodix_data->pinctrl_state_active); + dev_err(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_ACTIVE,retval); + goto err_pinctrl_lookup; + } + + goodix_data->pinctrl_state_suspend = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_SUSPEND); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_suspend)) { + retval = PTR_ERR(goodix_data->pinctrl_state_suspend); + dev_err(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_SUSPEND,retval); + goto err_pinctrl_lookup; + } + + goodix_data->pinctrl_state_release = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_RELEASE); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_release)) { + retval = PTR_ERR(goodix_data->pinctrl_state_release); + dev_dbg(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_RELEASE,retval); + } + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(goodix_data->ts_pinctrl); +err_pinctrl_get: + goodix_data->ts_pinctrl = NULL; + return retval; +} + +static void goodix_ts_pinctrl_free(struct goodix_ts_data *goodix_data) +{ + /* Put pinctrl if target uses pinctrl */ + if (!IS_ERR_OR_NULL(goodix_data->ts_pinctrl)) { + devm_pinctrl_put(goodix_data->ts_pinctrl); + goodix_data->ts_pinctrl = NULL; + } +} + +static int goodix_ts_pinctrl_select(struct goodix_ts_data *goodix_data, bool on) +{ + struct pinctrl_state *pins_state; + int ret; + + pins_state = on ? goodix_data->pinctrl_state_active + : goodix_data->pinctrl_state_suspend; + if (!IS_ERR_OR_NULL(pins_state)) { + ret = pinctrl_select_state(goodix_data->ts_pinctrl, pins_state); + if (ret) { + dev_err(&goodix_data->client->dev, + "can not set %s pins\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + return ret; + } + } else { + dev_err(&goodix_data->client->dev, + "not a valid '%s' pinstate\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + } + + return 0; +} + +#endif + +void parse_cmdline_for_gt915(void) +{ + int ret; + char *cmdline_tp; + char *temp; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + if (ret==0) { + gtp_ics_slot_report= 1;/* factory mode*/ + return; + } + } + gtp_ics_slot_report = 0; + return; +} + +static int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, 10); + dev_err(&client->dev, "cmd_line =%s \n", cmd_line); + if (ret == 0) { + dev_err(&client->dev, "mode: ffbm\n"); + return 1;/* factory mode*/ + } else { + dev_err(&client->dev, "mode: no ffbm\n"); + return 2;/* no factory mode*/ + } + } + dev_err(&client->dev, "has no androidboot.mode \n"); + return 0; +} + + +static int gtp_read_lockdown_info(void) +{ + int ret, k; + char buf[2+GTP_LOCKDOWN_SIZE] = {GTP_READ_LOCKDOWN_INFO_ADDR >> 8, GTP_READ_LOCKDOWN_INFO_ADDR & 0xFF}; + ret = gtp_i2c_read(i2c_connect_client, buf, GTP_LOCKDOWN_SIZE+2); + if (ret < 0) { + printk("Read Lockdown info error!"); + return -1; + } + + for (k = 0; k < GTP_LOCKDOWN_SIZE; k++) { + lockdown_info[k] = buf[2+k]; + } + + TP_Maker = lockdown_info[0]; + LCD_Maker = lockdown_info[1]; + Panel_Ink = lockdown_info[2]; + tp_color = lockdown_info[2]; + printk("Lockdown info: %02X %02X %02X %02X %02X %02X %02X %02X", + lockdown_info[0], lockdown_info[1], + lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], + lockdown_info[6], lockdown_info[7]); + + printk("WT: TP_Maker = %d \n", TP_Maker); + printk("WT: LCD_Maker = %d \n", LCD_Maker); + printk("WT: Panel_Ink = %d \n", Panel_Ink); + return 0; +} + +int gtp_hardwareinfo_set(void) +{ + char color[HARDWARE_MAX_ITEM_LONGTH]; + char vendor[HARDWARE_MAX_ITEM_LONGTH]; + int ret; + + gtp_read_lockdown_info(); + switch (tp_color) { + case TP_White: + snprintf(color,HARDWARE_MAX_ITEM_LONGTH,"White"); + break; + case TP_Black: + snprintf(color,HARDWARE_MAX_ITEM_LONGTH,"Black"); + break; + case TP_Golden: + snprintf(color,HARDWARE_MAX_ITEM_LONGTH,"Golden"); + break; + default: + snprintf(color,HARDWARE_MAX_ITEM_LONGTH,"Other Color"); + } + + switch (tp_sensor_id) { + case 1: + snprintf(vendor,HARDWARE_MAX_ITEM_LONGTH,"EACH"); + break; + case 2: + snprintf(vendor,HARDWARE_MAX_ITEM_LONGTH,"BIEL"); + break; + default: + snprintf(vendor, HARDWARE_MAX_ITEM_LONGTH, "Other Vendor"); + } + + ret = gtp_i2c_read_dbl_check(i2c_client_point, GTP_REG_CONFIG_DATA, &cfg_version, 1); + if (ret == FAIL) { + printk("Read IC Config Version Error\n"); + return -1; + } + + printk("IC Config Version: %d, 0x%02x", cfg_version, cfg_version); + sprintf(tp_string_version, "%s,GT915L_%x,V%d,%s", vendor, IC_Version, cfg_version, color); + hardwareinfo_set_prop(HARDWARE_TP, tp_string_version); + return 0; +} + +/******************************************************* +Function: + I2c probe. +Input: + client: i2c device struct. + id: device id. +Output: + Executive outcomes. + 0: succeed. +*******************************************************/ +static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + s32 ret = -1; + struct goodix_ts_data *ts; + u16 version_info; +#ifdef PMX_DRIVER_GT915L + int err; +#endif + + GTP_DEBUG_FUNC(); + + parse_cmdline_for_gt915(); + + GTP_INFO("GTP Driver Version: %s", GTP_DRIVER_VERSION); + GTP_INFO("GTP I2C Address: 0x%02x", client->addr); + + i2c_connect_client = client; + i2c_client_point = client; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + GTP_ERROR("I2C check functionality failed."); + return -ENODEV; + } + ts = kzalloc(sizeof(*ts), GFP_KERNEL); + if (ts == NULL) { + GTP_ERROR("Alloc GFP_KERNEL memory failed."); + return -ENOMEM; + } + + ts->client = client; + +#ifdef GTP_CONFIG_OF /* device tree support */ + if (client->dev.of_node) { + gtp_parse_dt(&client->dev); + } + ret = gtp_power_switch(client, 1); + if (ret) { + GTP_ERROR("GTP power on failed."); + return -EINVAL; + } +#else /* use gpio defined in gt9xx.h */ + gtp_rst_gpio = GTP_RST_PORT; + gtp_int_gpio = GTP_INT_PORT; +#endif + +#ifdef PMX_DRIVER_GT915L + err=goodix_ts_pinctrl_init(ts); + if (!err && ts->ts_pinctrl) { + ret = goodix_ts_pinctrl_select(ts, 1); + if (ret<0) { + dev_err(&client->dev,"can not get idle pin state\n"); + goto gtp_power_off; + } + } +#endif + + INIT_WORK(&ts->work, goodix_ts_work_func); + ts->client = client; + spin_lock_init(&ts->irq_lock); +#if GTP_ESD_PROTECT + ts->clk_tick_cnt = 2 * HZ; + GTP_DEBUG("Clock ticks for an esd cycle: %d", ts->clk_tick_cnt); + spin_lock_init(&ts->esd_lock); +#endif + i2c_set_clientdata(client, ts); + ts->gtp_rawdiff_mode = 0; + ret = gtp_request_io_port(ts); + if (ret < 0) { + GTP_ERROR("GTP request IO port failed."); + kfree(ts); + return ret; + } + +#if GTP_COMPATIBLE_MODE + gtp_get_chip_type(ts); + if (CHIP_TYPE_GT9F == ts->chip_type) { + ret = gtp_gt9xxf_init(ts->client); + if (FAIL == ret) { + GTP_INFO("Failed to init GT9XXF."); + } + } +#endif + + ret = gtp_i2c_test(client); + if (ret < 0) { + GTP_ERROR("I2C communication ERROR!"); + goto free_reset_irq_gpio; + } + + ret = gtp_read_version(client, &version_info); + if (ret < 0) { + GTP_ERROR("Read version failed."); + goto free_reset_irq_gpio; + } + + IC_Version = version_info; + + ret = gtp_init_panel(ts); + if (ret < 0) { + GTP_ERROR("GTP init panel failed."); + ts->abs_x_max = GTP_MAX_WIDTH; + ts->abs_y_max = GTP_MAX_HEIGHT; + ts->int_trigger_type = GTP_INT_TRIGGER; + } + + gt91xx_config_proc = proc_create(GT91XX_CONFIG_PROC_FILE, 0666, NULL, &config_proc_ops); + if (gt91xx_config_proc == NULL) { + GTP_ERROR("create_proc_entry %s failed\n", GT91XX_CONFIG_PROC_FILE); + } else { + GTP_INFO("create proc entry %s success", GT91XX_CONFIG_PROC_FILE); + } + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif + +#if GTP_AUTO_UPDATE + err = get_boot_mode(client); + if (err == 0) { + ret = gup_init_update_proc(ts); + if (ret < 0) { + GTP_ERROR("Create update thread error."); + } + } else { + GTP_INFO("not nomal_boot\n"); + } +#endif + + ret = gtp_request_input_dev(ts); + if (ret < 0) { + GTP_ERROR("GTP request input dev failed"); + } + + ret = gtp_request_irq(ts); + if (ret < 0) { + GTP_INFO("GTP works in polling mode."); + } else { + GTP_INFO("GTP works in interrupt mode."); + } + + if (ts->use_irq) { + gtp_irq_enable(ts); +#if GTP_GESTURE_WAKEUP + enable_irq_wake(client->irq); +#endif + } + +#if WT_ADD_CTP_INFO + gtp_hardwareinfo_set(); +#endif + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO + ctp_lockdown_fucntion_proc_file(); +#endif + + /* register suspend and resume fucntion*/ + gtp_register_powermanger(ts); + +#if GTP_CREATE_WR_NODE + init_wr_node(client); +#endif + return 0; + +free_reset_irq_gpio: + if (gpio_is_valid(gtp_rst_gpio)) + GTP_GPIO_FREE(gtp_rst_gpio); + if (ts->ts_pinctrl) { + err = goodix_ts_pinctrl_select(ts, false); + if (err < 0) + GTP_ERROR("Cannot get idle pinctrl state\n"); + } + + if (gpio_is_valid(gtp_int_gpio)) + GTP_GPIO_FREE(gtp_int_gpio); + if (ts->ts_pinctrl) { + err = goodix_ts_pinctrl_select(ts, false); + if (err < 0) + GTP_ERROR("Cannot get idle pinctrl state\n"); + } + + goodix_ts_pinctrl_free(ts); + +gtp_power_off: + gtp_power_switch(client, 0); + + return err; +} + + +/******************************************************* +Function: + Goodix touchscreen driver release function. +Input: + client: i2c device struct. +Output: + Executive outcomes. 0---succeed. +*******************************************************/ +static int goodix_ts_remove(struct i2c_client *client) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + GTP_DEBUG_FUNC(); + + gtp_unregister_powermanger(ts); + +#if GTP_CREATE_WR_NODE + uninit_wr_node(); +#endif + +#if GTP_ESD_PROTECT + destroy_workqueue(gtp_esd_check_workqueue); +#endif + + if (ts) { + if (ts->use_irq) { + GTP_GPIO_AS_INPUT(gtp_int_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + free_irq(client->irq, ts); + } else { + hrtimer_cancel(&ts->timer); + } + } + + GTP_INFO("GTP driver removing..."); + i2c_set_clientdata(client, NULL); + input_unregister_device(ts->input_dev); + kfree(ts); + + return 0; +} + + +/******************************************************* +Function: + Early suspend function. +Input: + h: early_suspend struct. +Output: + None. +*******************************************************/ +static void goodix_ts_suspend(struct goodix_ts_data *ts) +{ + s8 ret = -1; + + GTP_DEBUG_FUNC(); + if (ts->enter_update) { + return; + } + GTP_INFO("System suspend."); + + ts->gtp_is_suspend = 1; +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + +#if GTP_GESTURE_WAKEUP + GTP_INFO("Gesture gtp_gesture_onoff :%c\n",gtp_gesture_onoff); + if ('1' == gtp_gesture_onoff) + ret = gtp_enter_doze(ts); + else +#endif + { + if (ts->use_irq) { + gtp_irq_disable(ts); + } else { + hrtimer_cancel(&ts->timer); + } + ret = gtp_enter_sleep(ts); + } + + if (ret < 0) { + GTP_ERROR("GTP early suspend failed."); + } + msleep(58); +} + +/******************************************************* +Function: + Late resume function. +Input: + h: early_suspend struct. +Output: + None. +*******************************************************/ +static void goodix_ts_resume(struct goodix_ts_data *ts) +{ + s8 ret = -1; + + GTP_DEBUG_FUNC(); + if (ts->enter_update) { + return; + } + GTP_INFO("System resume."); + + ret = gtp_wakeup_sleep(ts); + +#if GTP_GESTURE_WAKEUP + doze_status = DOZE_DISABLED; +#endif + + if (ret < 0) { + GTP_ERROR("GTP later resume failed."); + } +#if (GTP_COMPATIBLE_MODE) + if (CHIP_TYPE_GT9F == ts->chip_type) { + } else +#endif + { + gtp_send_cfg(ts->client); + } + + if (ts->use_irq) { + GTP_DEBUG("GTP use_irq."); + gtp_irq_enable(ts); + } else { + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + } + + ts->gtp_is_suspend = 0; +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif +} + + +#if defined(CONFIG_FB) +/* frame buffer notifier block control the suspend/resume procedure */ +static int gtp_fb_notifier_callback(struct notifier_block *noti, unsigned long event, void *data) +{ + struct fb_event *ev_data = data; + struct goodix_ts_data *ts = container_of(noti, struct goodix_ts_data, notifier); + int *blank; + + if (ev_data && ev_data->data && event == FB_EVENT_BLANK && ts) { + blank = ev_data->data; + if (*blank == FB_BLANK_UNBLANK) { + GTP_DEBUG("Resume by fb notifier."); + goodix_ts_resume(ts); + + } else if (*blank == FB_BLANK_POWERDOWN) { + GTP_DEBUG("Suspend by fb notifier."); + goodix_ts_suspend(ts); + } + } + + return 0; +} +#elif defined(CONFIG_PM) +/* bus control the suspend/resume procedure */ +static int gtp_pm_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts) { + GTP_DEBUG("Suspend by i2c pm."); + goodix_ts_suspend(ts); + } + + return 0; +} +static int gtp_pm_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts) { + GTP_DEBUG("Resume by i2c pm."); + goodix_ts_resume(ts); + } + + return 0; +} + +static struct dev_pm_ops gtp_pm_ops = { + .suspend = gtp_pm_suspend, + .resume = gtp_pm_resume, +}; + +#elif defined(CONFIG_HAS_EARLYSUSPEND) +/* earlysuspend module the suspend/resume procedure */ +static void gtp_early_suspend(struct early_suspend *h) { + struct goodix_ts_data *ts = container_of(h, struct goodix_ts_data, early_suspend); + + if (ts) { + GTP_DEBUG("Suspend by earlysuspend module."); + goodix_ts_suspend(ts); + } +} +static void gtp_early_resume(struct early_suspend *h) +{ + struct goodix_ts_data *ts = container_of(h, struct goodix_ts_data, early_suspend); + + if (ts) { + GTP_DEBUG("Resume by earlysuspend module."); + goodix_ts_resume(ts); + } +} +#endif + +static int gtp_register_powermanger(struct goodix_ts_data *ts) +{ +#if defined(CONFIG_FB) + ts->notifier.notifier_call = gtp_fb_notifier_callback; + fb_register_client(&ts->notifier); + +#elif defined(CONFIG_HAS_EARLYSUSPEND) + ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + ts->early_suspend.suspend = goodix_ts_early_suspend; + ts->early_suspend.resume = goodix_ts_late_resume; + register_early_suspend(&ts->early_suspend); +#endif + + return 0; +} + +static int gtp_unregister_powermanger(struct goodix_ts_data *ts) +{ +#if defined(CONFIG_FB) + fb_unregister_client(&ts->notifier); + +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&ts->early_suspend); +#endif + return 0; +} + +/* end */ + +#if GTP_ESD_PROTECT +s32 gtp_i2c_read_no_rst(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + if ((retries >= 5)) { + GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d!", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + } + return ret; +} + +s32 gtp_i2c_write_no_rst(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1) + break; + retries++; + } + if ((retries >= 5)) { + GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d!", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + } + return ret; +} +/******************************************************* +Function: + switch on & off esd delayed work +Input: + client: i2c device + on: SWITCH_ON / SWITCH_OFF +Output: + void +*********************************************************/ +void gtp_esd_switch(struct i2c_client *client, s32 on) +{ + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(client); + spin_lock(&ts->esd_lock); + + if (SWITCH_ON == on) { + if (!ts->esd_running) { + ts->esd_running = 1; + spin_unlock(&ts->esd_lock); + GTP_INFO("Esd started"); + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); + } else { + spin_unlock(&ts->esd_lock); + } + } else { + if (ts->esd_running) { + ts->esd_running = 0; + spin_unlock(&ts->esd_lock); + GTP_INFO("Esd cancelled"); + cancel_delayed_work_sync(>p_esd_check_work); + } else { + spin_unlock(&ts->esd_lock); + } + } +} + +/******************************************************* +Function: + Initialize external watchdog for esd protect +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ +static s32 gtp_init_ext_watchdog(struct i2c_client *client) +{ + u8 opr_buffer[3] = {0x80, 0x41, 0xAA}; + GTP_DEBUG("[Esd]Init external watchdog"); + return gtp_i2c_write_no_rst(client, opr_buffer, 3); +} + +/******************************************************* +Function: + Esd protect function. + External watchdog added by meta, 2013/03/07 +Input: + work: delayed work +Output: + None. +*******************************************************/ +static void gtp_esd_check_func(struct work_struct *work) +{ + s32 i; + s32 ret = -1; + struct goodix_ts_data *ts = NULL; + u8 esd_buf[5] = {0x80, 0x40}; + + GTP_DEBUG_FUNC(); + + ts = i2c_get_clientdata(i2c_connect_client); + + if (ts->gtp_is_suspend || ts->enter_update) { + GTP_INFO("Esd suspended!"); + return; + } + + for (i = 0; i < 3; i++) { + ret = gtp_i2c_read_no_rst(ts->client, esd_buf, 4); + + GTP_DEBUG("[Esd]0x8040 = 0x%02X, 0x8041 = 0x%02X", esd_buf[2], esd_buf[3]); + if ((ret < 0)) { + continue; + } else { + if ((esd_buf[2] == 0xAA) || (esd_buf[3] != 0xAA)) { + u8 chk_buf[4] = {0x80, 0x40}; + + gtp_i2c_read_no_rst(ts->client, chk_buf, 4); + GTP_DEBUG("[Check]0x8040 = 0x%02X, 0x8041 = 0x%02X", chk_buf[2], chk_buf[3]); + if ((chk_buf[2] == 0xAA) || (chk_buf[3] != 0xAA)) { + i = 3; + break; + } else { + continue; + } + } else { + esd_buf[2] = 0xAA; + gtp_i2c_write_no_rst(ts->client, esd_buf, 3); + break; + } + } + } + if (i >= 3) { + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + if (ts->rqst_processing) { + GTP_INFO("Request processing, no esd recovery"); + } else { + GTP_ERROR("IC working abnormally! Process esd recovery."); + esd_buf[0] = 0x42; + esd_buf[1] = 0x26; + esd_buf[2] = 0x01; + esd_buf[3] = 0x01; + esd_buf[4] = 0x01; + gtp_i2c_write_no_rst(ts->client, esd_buf, 5); + msleep(50); + #ifdef GTP_CONFIG_OF + gtp_power_switch(ts->client, 0); + msleep(20); + gtp_power_switch(ts->client, 1); + msleep(20); + #endif + gtp_esd_recovery(ts->client); + } + } else + #endif + { + GTP_ERROR("IC working abnormally! Process reset guitar."); + esd_buf[0] = 0x42; + esd_buf[1] = 0x26; + esd_buf[2] = 0x01; + esd_buf[3] = 0x01; + esd_buf[4] = 0x01; + gtp_i2c_write_no_rst(ts->client, esd_buf, 5); + msleep(50); + #ifdef GTP_CONFIG_OF + gtp_power_switch(ts->client, 0); + msleep(20); + gtp_power_switch(ts->client, 1); + msleep(20); + #endif + gtp_reset_guitar(ts->client, 50); + msleep(50); + gtp_send_cfg(ts->client); + } + } + + if (!ts->gtp_is_suspend) { + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); + } else { + GTP_INFO("Esd suspended!"); + } + return; +} +#endif + +#ifdef GTP_CONFIG_OF +static const struct of_device_id goodix_match_table[] = { + {.compatible = "goodix,gt9xx",}, + { }, +}; +#endif + +static const struct i2c_device_id goodix_ts_id[] = { + { GTP_I2C_NAME, 0 }, + { } +}; + +static struct i2c_driver goodix_ts_driver = { + .probe = goodix_ts_probe, + .remove = goodix_ts_remove, + .id_table = goodix_ts_id, + .driver = { + .name = GTP_I2C_NAME, + .owner = THIS_MODULE, +#ifdef GTP_CONFIG_OF + .of_match_table = goodix_match_table, +#endif +#if !defined(CONFIG_FB) && defined(CONFIG_PM) + .pm = >p_pm_ops, +#endif + }, +}; + +/******************************************************* +Function: + Driver Install function. +Input: + None. +Output: + Executive Outcomes. 0---succeed. +********************************************************/ + +static int __init goodix_ts_init(void) +{ + s32 ret; + + GTP_DEBUG_FUNC(); + GTP_INFO("GTP driver installing..."); + goodix_wq = create_singlethread_workqueue("goodix_wq"); + if (!goodix_wq) { + GTP_ERROR("Creat workqueue failed."); + return -ENOMEM; + } +#if GTP_ESD_PROTECT + INIT_DELAYED_WORK(>p_esd_check_work, gtp_esd_check_func); + gtp_esd_check_workqueue = create_workqueue("gtp_esd_check"); +#endif + ret = i2c_add_driver(&goodix_ts_driver); + return ret; +} + +/******************************************************* +Function: + Driver uninstall function. +Input: + None. +Output: + Executive Outcomes. 0---succeed. +********************************************************/ +static void __exit goodix_ts_exit(void) +{ + GTP_DEBUG_FUNC(); + GTP_INFO("GTP driver exited."); + i2c_del_driver(&goodix_ts_driver); + if (goodix_wq) { + destroy_workqueue(goodix_wq); + } +} + +device_initcall_sync(goodix_ts_init); +module_exit(goodix_ts_exit); + +MODULE_DESCRIPTION("GTP Series Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/GT915L/gt9xx.h b/drivers/input/touchscreen/GT915L/gt9xx.h new file mode 100644 index 0000000000000..15462378706c1 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/gt9xx.h @@ -0,0 +1,370 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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 a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * 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. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#ifndef _GOODIX_GT9XX_H_ +#define _GOODIX_GT9XX_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_OF +#include +#include +#endif +#ifdef CONFIG_FB +#include +#include +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#ifndef GTP_CONFIG_OF +#define GTP_CONFIG_OF +#endif + +#ifndef CONFIG_PM +#define CONFIG_PM +#endif + +#define PMX_DRIVER_GT915L + + +#define GTP_CUSTOM_CFG 1 +#define GTP_CHANGE_X2Y 0 +#define GTP_DRIVER_SEND_CFG 1 +#define GTP_HAVE_TOUCH_KEY 1 +#define GTP_POWER_CTRL_SLEEP 0 +#define GTP_ICS_SLOT_REPORT 1 + +#define GTP_AUTO_UPDATE 1 +#define GTP_HEADER_FW_UPDATE 1 +#define GTP_AUTO_UPDATE_CFG 0 + +#define GTP_COMPATIBLE_MODE 0 + +#define GTP_CREATE_WR_NODE 1 +#define GTP_ESD_PROTECT 1 + +#define GTP_WITH_PEN 0 +#define GTP_PEN_HAVE_BUTTON 0 + +#define GTP_GESTURE_WAKEUP 1 +#if GTP_GESTURE_WAKEUP +#define GTP_GESTURE_TPYE_STR "RLUDKcemosvwz" +#define GTP_GESTURE_SUPPORT_ONOFF 'Y' +#define GTP_PROC_DRIVER_VERSION "GTP_V1.0_20160606" +#define GTP_GESTURE_MAX_POINT_COUNT 64 +#define MXT_INPUT_EVENT_START 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define MXT_INPUT_EVENT_STYLUS_MODE_OFF 2 +#define MXT_INPUT_EVENT_STYLUS_MODE_ON 3 +#define MXT_INPUT_EVENT_WAKUP_MODE_OFF 4 +#define MXT_INPUT_EVENT_WAKUP_MODE_ON 5 +#define MXT_INPUT_EVENT_EDGE_DISABLE 6 +#define MXT_INPUT_EVENT_EDGE_FINGER 7 +#define MXT_INPUT_EVENT_EDGE_HANDGRIP 8 +#define MXT_INPUT_EVENT_EDGE_FINGER_HANDGRIP 9 +#define MXT_INPUT_EVENT_END 9 +#endif + +#define GTP_GLOVE_MODE 1 +#if GTP_GLOVE_MODE +#define GTP_GLOVE_SUPPORT_ONOFF 'Y' +#endif + +#define WT_ADD_CTP_INFO 1 + +#define GTP_DEBUG_ON 0 +#define GTP_DEBUG_ARRAY_ON 0 +#define GTP_DEBUG_FUNC_ON 0 + +#if GTP_COMPATIBLE_MODE +typedef enum { + CHIP_TYPE_GT9 = 0, + CHIP_TYPE_GT9F = 1, +} CHIP_TYPE_T; +#endif + +struct goodix_ts_data { + spinlock_t irq_lock; + struct i2c_client *client; + struct input_dev *input_dev; + struct hrtimer timer; + struct work_struct work; + s32 irq_is_disable; + s32 use_irq; + u16 abs_x_max; + u16 abs_y_max; + u8 max_touch_num; + u8 int_trigger_type; + u8 green_wake_mode; + u8 enter_update; + u8 gtp_is_suspend; + u8 gtp_rawdiff_mode; + int gtp_cfg_len; + u8 fw_error; + u8 pnl_init_error; + +#if defined(CONFIG_FB) + struct notifier_block notifier; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + +#if GTP_WITH_PEN + struct input_dev *pen_dev; +#endif + +#if GTP_ESD_PROTECT + spinlock_t esd_lock; + u8 esd_running; + s32 clk_tick_cnt; +#endif +#if GTP_COMPATIBLE_MODE + u16 bak_ref_len; + s32 ref_chk_fs_times; + s32 clk_chk_fs_times; + CHIP_TYPE_T chip_type; + u8 rqst_processing; + u8 is_950; +#endif + +#ifdef PMX_DRIVER_GT915L + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + struct pinctrl_state *pinctrl_state_release; + + struct pinctrl_state *pinctrl_state_int_active; + struct pinctrl_state *pinctrl_state_reset_active; +#endif +}; + +extern u16 show_len; +extern u16 total_len; + + +extern unsigned int gtp_rst_gpio; +extern unsigned int gtp_int_gpio; + + + + + +/* sensor_opt1 sensor_opt2 Sensor_ID + GND GND 0 + VDDIO GND 1 + NC GND 2 + GND NC/300K 3 + VDDIO NC/300K 4 + NC NC/300K 5 +*/ + + +#define CTP_CFG_GROUP0 {\ + 0x41, 0xD0, 0x02, 0x00, 0x05, 0x05, 0x75, 0x01, 0x01, 0x0F, 0x24, \ + 0x0F, 0x64, 0x3C, 0x03, 0x05, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, \ + 0x00, 0x16, 0x19, 0x1C, 0x14, 0x8C, 0x0E, 0x0E, 0x24, 0x00, 0x31, \ + 0x0D, 0x00, 0x00, 0x00, 0x83, 0x33, 0x1D, 0x00, 0x41, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x08, 0x0A, 0x00, 0x2B, 0x1C, 0x3C, 0x94, 0xD5, \ + 0x03, 0x08, 0x00, 0x00, 0x04, 0x93, 0x1E, 0x00, 0x82, 0x23, 0x00, \ + 0x74, 0x29, 0x00, 0x69, 0x2F, 0x00, 0x5F, 0x37, 0x00, 0x5F, 0x20, \ + 0x40, 0x60, 0x00, 0xF0, 0x40, 0x30, 0x55, 0x50, 0x27, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x19, 0x00, 0x00, \ + 0x50, 0x50, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x10, 0x12, \ + 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, \ + 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x24, 0x26, 0x28, 0x29, 0x2A, 0x1C, \ + 0x18, 0x16, 0x14, 0x13, 0x12, 0x10, 0x0F, 0x0C, 0x0A, 0x08, 0x06, \ + 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x01\ + } + + +#define CTP_CFG_GROUP1 {\ +0x41, 0xD0, 0x02, 0x00, 0x05, 0x05, 0x04, 0xC1, 0x12, 0x0F, 0x28, 0x0A, 0x50, 0x32, 0x03, 0x05, 0x00, 0x00, 0xFF, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x2C, 0x0D, 0x3C, 0x3E, 0xD3, 0x07, 0x0F, 0x0F, 0x00, 0x99, 0x33, 0x10, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x29, 0x28, 0x5A, 0x94, 0x85, 0x02, 0x07, 0x00, 0x00, 0x04, 0xA9, 0x2B, 0x00, 0x92, 0x33, 0x00, 0x80, 0x3C, 0x00, 0x71, 0x46, 0x00, 0x63, 0x53, 0x00, 0x63, 0x18, 0x38, 0x58, 0x00, 0xF0, 0x4A, 0x3A, 0x77, 0x77, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x42, 0xF8, 0x0F, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x50, 0x3C, 0x02, 0x04, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x08, 0x06, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x5A, 0x00, 0x00, 0x00, 0x0F, 0x10, 0x12, 0x13, 0x14, 0x0C, 0x0A, 0x08, 0x06, 0x04, 0x02, 0x00, 0x16, 0x18, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x24, 0x28, 0x26, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x01\ + } + + +#define CTP_CFG_GROUP2 {\ +0x49, 0xD0, 0x02, 0x00, 0x05, 0x0A, 0x04, 0xC1, 0x12, 0x3F, 0x25, 0x0A, 0x5A, 0x3C, 0x03, 0x05, 0x00, 0x00, 0x00, 0x67, 0x11, 0x11, 0x30, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x2C, 0x0D, 0x3C, 0x3E, 0xD3, 0x07, 0xD3, 0x07, 0x00, 0x9A, 0x33, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x28, 0x5A, 0x94, 0x80, 0x02, 0x0B, 0x00, 0x00, 0x04, 0xA9, 0x2B, 0x00, 0x92, 0x33, 0x1E, 0x80, 0x3C, 0x00, 0x71, 0x46, 0x00, 0x63, 0x53, 0x00, 0x63, 0x18, 0x38, 0x58, 0x00, 0xF0, 0x4A, 0x3A, 0x77, 0x77, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x50, 0x0F, 0x00, 0x00, 0x50, 0x3C, 0x02, 0x04, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x0A, 0x08, 0x06, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x18, 0x1C, 0x1D, 0x1E, 0x1F, 0x20, 0x21, 0x22, 0x28, 0x26, 0x24, 0x0C, 0x0A, 0x0F, 0x08, 0x10, 0x06, 0x12, 0x04, 0x13, 0x02, 0x14, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x01\ +} + + +#define CTP_CFG_GROUP3 {\ +} + +#define CTP_CFG_GROUP4 {\ + } + + +#define CTP_CFG_GROUP5 {\ + } + + +#define CTP_CFG_GROUP1_GLOVE {\ +0x44, 0x38, 0x04, 0x80, 0x07, 0x0A, 0x04, 0xC1, 0x12, 0x3F, 0x28, 0x0A, 0x50, 0x32, 0x03, 0x05, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x2C, 0x0E, 0x3C, 0x3E, 0xD3, 0x07, 0xD3, 0x07, 0x00, 0xF8, 0x33, 0x90, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x29, 0x32, 0x5A, 0x94, 0x85, 0x02, 0x80, 0x00, 0x00, 0x04, 0x8C, 0x35, 0x00, 0x81, 0x3B, 0x1E, 0x76, 0x43, 0x00, 0x6D, 0x4B, 0x00, 0x65, 0x55, 0x00, 0x65, 0x18, 0x40, 0x60, 0x00, 0xF0, 0x50, 0x3A, 0x77, 0x77, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x67, 0x00, 0x00, 0x00, 0x06, 0x00, 0x42, 0xF8, 0x0F, 0x00, 0x0F, 0x50, 0x0F, 0x00, 0x00, 0x50, 0x3C, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16, 0x18, 0x1A, 0x1C, 0x0A, 0x08, 0x06, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x41, 0x00, 0x00, 0x00, 0x00, 0x04, 0x02, 0x06, 0x08, 0x0A, 0x0C, 0x0F, 0x10, 0x12, 0x13, 0x14, 0x28, 0x26, 0x24, 0x22, 0x21, 0x20, 0x1F, 0x1E, 0x1D, 0x1C, 0x18, 0x16, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9A, 0x01\ + } + + + + +#define GTP_RST_PORT 16 +#define GTP_INT_PORT 17 + +#define GTP_GPIO_AS_INPUT(pin) do {\ + gpio_direction_input(pin);\ + } while (0) +#define GTP_GPIO_AS_INT(pin) do {\ + GTP_GPIO_AS_INPUT(pin);\ + } while (0) +#define GTP_GPIO_GET_VALUE(pin) gpio_get_value(pin) +#define GTP_GPIO_OUTPUT(pin, level) gpio_direction_output(pin, level) +#define GTP_GPIO_REQUEST(pin, label) gpio_request(pin, label) +#define GTP_GPIO_FREE(pin) gpio_free(pin) +#define GTP_IRQ_TAB {IRQ_TYPE_EDGE_RISING, IRQ_TYPE_EDGE_FALLING, IRQ_TYPE_LEVEL_LOW, IRQ_TYPE_LEVEL_HIGH} + + +#if GTP_CUSTOM_CFG + #define GTP_MAX_HEIGHT 1280 + #define GTP_MAX_WIDTH 720 + #define GTP_INT_TRIGGER 0 +#else + #define GTP_MAX_HEIGHT 1280 + #define GTP_MAX_WIDTH 720 + #define GTP_INT_TRIGGER 1 +#endif +#define GTP_MAX_TOUCH 10 + + +#if GTP_HAVE_TOUCH_KEY + + #define GTP_KEY_TAB {KEY_MENU, KEY_HOMEPAGE, KEY_BACK} +#endif + + +#define GTP_DRIVER_VERSION "V2.4<2014/11/28>" +#define GTP_I2C_NAME "Goodix-TS" +#define GT91XX_CONFIG_PROC_FILE "gt9xx_config" +#define GTP_POLL_TIME 10 +#define GTP_ADDR_LENGTH 2 +#define GTP_CONFIG_MIN_LENGTH 186 +#define GTP_CONFIG_MAX_LENGTH 240 +#define FAIL 0 +#define SUCCESS 1 +#define SWITCH_OFF 0 +#define SWITCH_ON 1 + + +#define GTP_REG_BAK_REF 0x99D0 +#define GTP_REG_MAIN_CLK 0x8020 +#define GTP_REG_CHIP_TYPE 0x8000 +#define GTP_REG_HAVE_KEY 0x804E +#define GTP_REG_MATRIX_DRVNUM 0x8069 +#define GTP_REG_MATRIX_SENNUM 0x806A + +#define GTP_FL_FW_BURN 0x00 +#define GTP_FL_ESD_RECOVERY 0x01 +#define GTP_FL_READ_REPAIR 0x02 + +#define GTP_BAK_REF_SEND 0 +#define GTP_BAK_REF_STORE 1 +#define CFG_LOC_DRVA_NUM 29 +#define CFG_LOC_DRVB_NUM 30 +#define CFG_LOC_SENS_NUM 31 + +#define GTP_CHK_FW_MAX 40 +#define GTP_CHK_FS_MNT_MAX 300 +#define GTP_BAK_REF_PATH "/data/gtp_ref.bin" +#define GTP_MAIN_CLK_PATH "/data/gtp_clk.bin" +#define GTP_RQST_CONFIG 0x01 +#define GTP_RQST_BAK_REF 0x02 +#define GTP_RQST_RESET 0x03 +#define GTP_RQST_MAIN_CLOCK 0x04 +#define GTP_RQST_RESPONDED 0x00 +#define GTP_RQST_IDLE 0xFF + + + +#define GTP_READ_COOR_ADDR 0x814E +#define GTP_REG_SLEEP 0x8040 +#define GTP_REG_SENSOR_ID 0x814A +#define GTP_REG_CONFIG_DATA 0x8047 +#define GTP_REG_VERSION 0x8140 + +#define RESOLUTION_LOC 3 +#define TRIGGER_LOC 8 + +#define CFG_GROUP_LEN(p_cfg_grp) (sizeof(p_cfg_grp) / sizeof(p_cfg_grp[0])) + +#define GTP_INFO(fmt, arg...) printk("<<-GTP-INFO->> "fmt"\n", ##arg) +#define GTP_ERROR(fmt, arg...) printk("<<-GTP-ERROR->> "fmt"\n", ##arg) +#define GTP_DEBUG(fmt, arg...) do {\ + if (GTP_DEBUG_ON)\ + printk("<<-GTP-DEBUG->> [%d]"fmt"\n", __LINE__, ##arg);\ + } while (0) +#define GTP_DEBUG_ARRAY(array, num) do {\ + s32 i;\ + u8 *a = array;\ + if (GTP_DEBUG_ARRAY_ON)\ + {\ + printk("<<-GTP-DEBUG-ARRAY->>\n");\ + for (i = 0; i < (num); i++)\ + {\ + printk("%02x ", (a)[i]);\ + if ((i + 1) % 10 == 0)\ + {\ + printk("\n");\ + } \ + } \ + printk("\n");\ + } \ + } while (0) +#define GTP_DEBUG_FUNC() do {\ + if (GTP_DEBUG_FUNC_ON)\ + printk("<<-GTP-FUNC->> Func:%s@Line:%d\n", __func__, __LINE__);\ + } while (0) +#define GTP_SWAP(x, y) do {\ + typeof(x) z = x;\ + x = y;\ + y = z;\ + } while (0) + + +#ifdef CONFIG_OF +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid); +#endif +#endif /* _GOODIX_GT9XX_H_ */ diff --git a/drivers/input/touchscreen/GT915L/gt9xx_firmware.h b/drivers/input/touchscreen/GT915L/gt9xx_firmware.h new file mode 100644 index 0000000000000..4ba50cf969925 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/gt9xx_firmware.h @@ -0,0 +1,43 @@ +/* Copyright Statement: + * This firmware are protected under relevant copyright laws,this information contained + * herein is confidential and proprietary to Goodix. + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * WARNING:The GTP_COMPATIBLE_MODE part of this file was generated by the specialized tools, + * please do not modify it manually! + * +*/ + +#ifndef _GT9XX_FIRMWARE_H_ +#define _GT9XX_FIRMWARE_H_ + + +#if GTP_HEADER_FW_UPDATE + + +#define WT_ADD_FW_BIEL + +unsigned char gtp_default_FW[] = { + +#ifdef WT_ADD_FW_EACH + #include "FW_EACH.txt" +#elif defined WT_ADD_FW_BIEL + #include "FW_BIEL.txt" +#endif +}; +#endif + +/* +*[HW INFO]00900600 +*[PID]910 +*[VID]1010 +*[GENERATED]2013/08/27 20:59:13 +*/ +#if GTP_COMPATIBLE_MODE +unsigned char gtp_default_FW_fl[] = { +}; +#endif + +#endif diff --git a/drivers/input/touchscreen/GT915L/gt9xx_update.c b/drivers/input/touchscreen/GT915L/gt9xx_update.c new file mode 100644 index 0000000000000..e0ccddc95b795 --- /dev/null +++ b/drivers/input/touchscreen/GT915L/gt9xx_update.c @@ -0,0 +1,3251 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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 a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * 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. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#include +#include "gt9xx.h" + +#include +#include +#if ((GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) || GTP_COMPATIBLE_MODE) + #include "gt9xx_firmware.h" +#endif + +#define GUP_REG_HW_INFO 0x4220 +#define GUP_REG_FW_MSG 0x41E4 +#define GUP_REG_PID_VID 0x8140 + +#define GUP_SEARCH_FILE_TIMES 50 + +#define UPDATE_FILE_PATH_1 "/data/_goodix_update_.bin" +#define UPDATE_FILE_PATH_2 "/sdcard/_goodix_update_.bin" + +#define CONFIG_FILE_PATH_1 "/data/_goodix_config_.cfg" +#define CONFIG_FILE_PATH_2 "/sdcard/_goodix_config_.cfg" + +#define FW_HEAD_LENGTH 14 +#define FW_SECTION_LENGTH 0x2000 +#define FW_DSP_ISP_LENGTH 0x1000 +#define FW_DSP_LENGTH 0x1000 +#define FW_BOOT_LENGTH 0x800 +#define FW_SS51_LENGTH (4 * FW_SECTION_LENGTH) +#define FW_BOOT_ISP_LENGTH 0x800 +#define FW_GLINK_LENGTH 0x3000 +#define FW_GWAKE_LENGTH (4 * FW_SECTION_LENGTH) + +#define PACK_SIZE 256 +#define MAX_FRAME_CHECK_TIME 5 + + +#define _bRW_MISCTL__SRAM_BANK 0x4048 +#define _bRW_MISCTL__MEM_CD_EN 0x4049 +#define _bRW_MISCTL__CACHE_EN 0x404B +#define _bRW_MISCTL__TMR0_EN 0x40B0 +#define _rRW_MISCTL__SWRST_B0_ 0x4180 +#define _bWO_MISCTL__CPU_SWRST_PULSE 0x4184 +#define _rRW_MISCTL__BOOTCTL_B0_ 0x4190 +#define _rRW_MISCTL__BOOT_OPT_B0_ 0x4218 +#define _rRW_MISCTL__BOOT_CTL_ 0x5094 + +#define AUTO_SEARCH_BIN 0x01 +#define AUTO_SEARCH_CFG 0x02 +#define BIN_FILE_READY 0x80 +#define CFG_FILE_READY 0x08 +#define HEADER_FW_READY 0x00 + +#pragma pack(1) +typedef struct { + u8 hw_info[4]; + u8 pid[8]; + u16 vid; +} st_fw_head; +#pragma pack() + +typedef struct { + u8 force_update; + u8 fw_flag; + struct file *file; + struct file *cfg_file; + st_fw_head ic_fw_msg; + mm_segment_t old_fs; + u32 fw_total_len; + u32 fw_burned_len; +} st_update_msg; + +st_update_msg update_msg; +u16 show_len; +u16 total_len; +u8 got_file_flag = 0; +u8 searching_file = 0; + + +int FW_VERSION_ID; +static u8 GTP_FW_SENSOR_ID; + +#if WT_ADD_CTP_INFO +extern int gtp_hardwareinfo_set(void); +#endif + +extern u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH]; +extern void gtp_reset_guitar(struct i2c_client *client, s32 ms); +extern s32 gtp_send_cfg(struct i2c_client *client); +extern s32 gtp_read_version(struct i2c_client *, u16*); +extern struct i2c_client *i2c_connect_client; +extern void gtp_irq_enable(struct goodix_ts_data *ts); +extern void gtp_irq_disable(struct goodix_ts_data *ts); +extern s32 gtp_i2c_read_dbl_check(struct i2c_client *, u16, u8 *, int); +static u8 gup_burn_fw_gwake_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd); + +#define _CLOSE_FILE(p_file) if (p_file && !IS_ERR(p_file)) \ + { \ + filp_close(p_file, NULL); \ + } + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *, s32); +#endif + +#if GTP_COMPATIBLE_MODE +s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +#endif +/******************************************************* +Function: + Read data from the i2c slave device. +Input: + client: i2c device. + buf[0~1]: read start address. + buf[2~len-1]: read data buffer. + len: GTP_ADDR_LENGTH + read bytes count +Output: + numbers of i2c_msgs to transfer: + 2: succeed, otherwise: failed +*********************************************************/ +s32 gup_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + + return ret; +} + +/******************************************************* +Function: + Write data to the i2c slave device. +Input: + client: i2c device. + buf[0~1]: write start address. + buf[2~len-1]: data buffer + len: GTP_ADDR_LENGTH + write bytes count +Output: + numbers of i2c_msgs to transfer: + 1: succeed, otherwise: failed +*********************************************************/ +s32 gup_i2c_write(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1) + break; + retries++; + } + + return ret; +} + +static s32 gup_init_panel(struct goodix_ts_data *ts) +{ + s32 ret = 0; + s32 i = 0; + u8 check_sum = 0; + u8 opr_buf[16]; + u8 sensor_id = 0; + u16 version = 0; + u8 drv_cfg_version; + u8 flash_cfg_version; + +#ifndef GTP_CONFIG_OF + u8 cfg_info_group0[] = CTP_CFG_GROUP0; + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + u8 *send_cfg_buf[] = {cfg_info_group0, cfg_info_group1, + cfg_info_group2, cfg_info_group3, + cfg_info_group4, cfg_info_group5}; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group0), + CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5)}; + #endif + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) { + if (sensor_id >= 0x06) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + return -EPERM; + } + } else { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + return -EPERM; + } + + /* parse config data*/ +#ifdef GTP_CONFIG_OF + GTP_DEBUG("Get config data from dts file."); + ret = gtp_parse_dt_cfg(&ts->client->dev, &config[GTP_ADDR_LENGTH], &ts->gtp_cfg_len, sensor_id); + if (ret < 0) { + GTP_ERROR("Failed to parse config data form dts file."); + ts->pnl_init_error = 1; + return -EPERM; + } +#else + GTP_DEBUG("Get config data from header file."); + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) { + sensor_id = 0; + } + ts->gtp_cfg_len = cfg_info_len[sensor_id]; + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len); +#endif + + GTP_DEBUG("Sensor_ID: %d", sensor_id); + + if (ts->gtp_cfg_len < GTP_CONFIG_MIN_LENGTH) { + GTP_ERROR("Sensor_ID(%d) matches with NULL or INVALID CONFIG GROUP! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id); + return -EPERM; + } + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + if (ret == SUCCESS) { + GTP_DEBUG("CFG_GROUP%d Config Version: %d, IC Config Version: %d", sensor_id, + config[GTP_ADDR_LENGTH], opr_buf[0]); + + flash_cfg_version = opr_buf[0]; + drv_cfg_version = config[GTP_ADDR_LENGTH]; + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + config[GTP_ADDR_LENGTH] = 0x00; + } + } else { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -EPERM; + } + + GTP_DEBUG("X_MAX = %d, Y_MAX = %d, TRIGGER = 0x%02x", + ts->abs_x_max, ts->abs_y_max, ts->int_trigger_type); + + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) { + config[TRIGGER_LOC] &= 0xfe; + } else if (GTP_INT_TRIGGER == 1) { + config[TRIGGER_LOC] |= 0x01; + } + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + + GTP_DEBUG_FUNC(); + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Send config error."); + } + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + check_sum = 0; + config[GTP_ADDR_LENGTH] = drv_cfg_version; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + } + gtp_read_version(ts->client, &version); + msleep(10); + return 0; +} + + +static u8 gup_get_ic_msg(struct i2c_client *client, u16 addr, u8 *msg, s32 len) +{ + s32 i = 0; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + + for (i = 0; i < 5; i++) { + if (gup_i2c_read(client, msg, GTP_ADDR_LENGTH + len) > 0) { + break; + } + } + + if (i >= 5) { + GTP_ERROR("Read data from 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_set_ic_msg(struct i2c_client *client, u16 addr, u8 val) +{ + s32 i = 0; + u8 msg[3]; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + msg[2] = val; + + for (i = 0; i < 5; i++) { + if (gup_i2c_write(client, msg, GTP_ADDR_LENGTH + 1) > 0) { + break; + } + } + + if (i >= 5) { + GTP_ERROR("Set data to 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_get_ic_fw_msg(struct i2c_client *client) +{ + s32 ret = -1; + u8 retry = 0; + u8 buf[16]; + u8 i; + + + ret = gtp_i2c_read_dbl_check(client, GUP_REG_HW_INFO, &buf[GTP_ADDR_LENGTH], 4); + if (FAIL == ret) { + GTP_ERROR("[get_ic_fw_msg]get hw_info failed,exit"); + return FAIL; + } + + + + for (i = 0; i < 4; i++) { + update_msg.ic_fw_msg.hw_info[i] = buf[GTP_ADDR_LENGTH + 3 - i]; + } + GTP_DEBUG("IC Hardware info:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + + for (retry = 0; retry < 2; retry++) { + ret = gup_get_ic_msg(client, GUP_REG_FW_MSG, buf, 1); + if (FAIL == ret) { + GTP_ERROR("Read firmware message fail."); + return ret; + } + + update_msg.force_update = buf[GTP_ADDR_LENGTH]; + if ((0xBE != update_msg.force_update) && (!retry)) { + GTP_INFO("The check sum in ic is error."); + GTP_INFO("The IC will be updated by force."); + continue; + } + break; + } + GTP_DEBUG("IC force update flag:0x%x", update_msg.force_update); + + + ret = gtp_i2c_read_dbl_check(client, GUP_REG_PID_VID, &buf[GTP_ADDR_LENGTH], 6); + if (FAIL == ret) { + GTP_ERROR("[get_ic_fw_msg]get pid & vid failed,exit"); + return FAIL; + } + + memset(update_msg.ic_fw_msg.pid, 0, sizeof(update_msg.ic_fw_msg.pid)); + memcpy(update_msg.ic_fw_msg.pid, &buf[GTP_ADDR_LENGTH], 4); + GTP_DEBUG("IC Product id:%s", update_msg.ic_fw_msg.pid); + + + /*|-----FLASH-----RAM-----| + |------918------918-----| + |------968------968-----| + |------913------913-----| + |------913P-----913P----| + |------927------927-----| + |------927P-----927P----| + |------9110-----9110----| + |------9110P----9111----|*/ + if (update_msg.ic_fw_msg.pid[0] != 0) { + if (!memcmp(update_msg.ic_fw_msg.pid, "9111", 4)) { + GTP_DEBUG("IC Mapping Product id:%s", update_msg.ic_fw_msg.pid); + memcpy(update_msg.ic_fw_msg.pid, "9110P", 5); + } + } + + update_msg.ic_fw_msg.vid = buf[GTP_ADDR_LENGTH+4] + (buf[GTP_ADDR_LENGTH+5]<<8); + GTP_DEBUG("IC version id:%04x", update_msg.ic_fw_msg.vid); + + return SUCCESS; +} + +s32 gup_enter_update_mode(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_int_gpio, (client->addr == 0x14)); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + + msleep(5); + while (retry++ < 200) { + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if (0x0C == rd_buf[GTP_ADDR_LENGTH]) { + GTP_DEBUG("Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if (retry >= 200) { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, 0x4010, 0x00); + + + return ret; +} + +void gup_leave_update_mode(void) +{ + GTP_GPIO_AS_INT(gtp_int_gpio); + + GTP_DEBUG("[leave_update_mode]reset chip."); + gtp_reset_guitar(i2c_connect_client, 20); +} + + + + + + + +/* Update Conditions: + 1. Same hardware info + 2. Same PID + 3. File VID > IC VID + Force Update Conditions: + 1. Wrong ic firmware checksum + 2. INVALID IC PID or VID + 3. (IC PID == 91XX || File PID == 91XX) && (File VID > IC VID) +*/ + +static u8 gup_enter_update_judge(st_fw_head *fw_head) +{ + u16 u16_tmp; + s32 i = 0; + u32 fw_len = 0; + s32 pid_cmp_len = 0; + u16_tmp = fw_head->vid; + fw_head->vid = (u16)(u16_tmp>>8) + (u16)(u16_tmp<<8); + + GTP_INFO("FILE HARDWARE INFO:%02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID:%s", fw_head->pid); + GTP_INFO("FILE VID:%04x", fw_head->vid); + GTP_INFO("IC HARDWARE INFO:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + GTP_INFO("IC PID:%s", update_msg.ic_fw_msg.pid); + GTP_INFO("IC VID:%04x", update_msg.ic_fw_msg.vid); + + if (!memcmp(fw_head->pid, "9158", 4) && !memcmp(update_msg.ic_fw_msg.pid, "915S", 4)) { + GTP_INFO("Update GT915S to GT9158 directly!"); + return SUCCESS; + } + + if (!memcmp(fw_head->hw_info, update_msg.ic_fw_msg.hw_info, sizeof(update_msg.ic_fw_msg.hw_info))) { + fw_len = 42 * 1024; + } else { + fw_len = fw_head->hw_info[3]; + fw_len += (((u32)fw_head->hw_info[2]) << 8); + fw_len += (((u32)fw_head->hw_info[1]) << 16); + fw_len += (((u32)fw_head->hw_info[0]) << 24); + } + if (update_msg.fw_total_len != fw_len) { + GTP_ERROR("Inconsistent firmware size, Update aborted! Default size: %d(%dK), actual size: %d(%dK)", fw_len, fw_len/1024, update_msg.fw_total_len, update_msg.fw_total_len/1024); + return FAIL; + } + GTP_INFO("Firmware length:%d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + + if (update_msg.force_update != 0xBE) { + GTP_INFO("FW chksum error,need enter update."); + return SUCCESS; + } + + + if (strlen(update_msg.ic_fw_msg.pid) < 3) { + GTP_INFO("Illegal IC pid, need enter update"); + return SUCCESS; + } else { + for (i = 0; i < 3; i++) { + if ((update_msg.ic_fw_msg.pid[i] < 0x30) || (update_msg.ic_fw_msg.pid[i] > 0x39)) { + GTP_INFO("Illegal IC pid, out of bound, need enter update"); + return SUCCESS; + } + } + } + + + pid_cmp_len = strlen(fw_head->pid); + if (pid_cmp_len < strlen(update_msg.ic_fw_msg.pid)) { + pid_cmp_len = strlen(update_msg.ic_fw_msg.pid); + } + + if ((!memcmp(fw_head->pid, update_msg.ic_fw_msg.pid, pid_cmp_len)) || + (!memcmp(update_msg.ic_fw_msg.pid, "91XX", 4)) || + (!memcmp(fw_head->pid, "91XX", 4))) { + if (!memcmp(fw_head->pid, "91XX", 4)) { + GTP_DEBUG("Force none same pid update mode."); + } else { + GTP_DEBUG("Get the same pid."); + } + + + if (fw_head->vid > update_msg.ic_fw_msg.vid) { + GTP_INFO("Need enter update."); + return SUCCESS; + } + GTP_ERROR("Don't meet the third condition."); + GTP_ERROR("File VID <= Ic VID, update aborted!"); + } else { + GTP_ERROR("File PID != Ic PID, update aborted!"); + } + + return FAIL; +} + + + +#if GTP_AUTO_UPDATE_CFG +static u8 ascii2hex(u8 a) +{ + s8 value = 0; + + if (a >= '0' && a <= '9') { + value = a - '0'; + } else if (a >= 'A' && a <= 'F') { + value = a - 'A' + 0x0A; + } else if (a >= 'a' && a <= 'f') { + value = a - 'a' + 0x0A; + } else { + value = 0xff; + } + + return value; +} + +static s8 gup_update_config(struct i2c_client *client) +{ + s32 file_len = 0; + s32 ret = 0; + s32 i = 0; + s32 file_cfg_len = 0; + s32 chip_cfg_len = 0; + s32 count = 0; + u8 *buf; + u8 *pre_buf; + u8 *file_config; + + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (NULL == update_msg.cfg_file) { + GTP_ERROR("[update_cfg]No need to upgrade config!"); + return FAIL; + } + file_len = update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_END); + + chip_cfg_len = ts->gtp_cfg_len; + + GTP_DEBUG("[update_cfg]config file len:%d", file_len); + GTP_DEBUG("[update_cfg]need config len:%d", chip_cfg_len); + if ((file_len+5) < chip_cfg_len*5) { + GTP_ERROR("Config length error"); + return -EPERM; + } + + buf = (u8 *)kzalloc(file_len, GFP_KERNEL); + pre_buf = (u8 *)kzalloc(file_len, GFP_KERNEL); + file_config = (u8 *)kzalloc(chip_cfg_len + GTP_ADDR_LENGTH, GFP_KERNEL); + update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_SET); + + GTP_DEBUG("[update_cfg]Read config from file."); + ret = update_msg.cfg_file->f_op->read(update_msg.cfg_file, (char *)pre_buf, file_len, &update_msg.cfg_file->f_pos); + if (ret < 0) { + GTP_ERROR("[update_cfg]Read config file failed."); + goto update_cfg_file_failed; + } + + GTP_DEBUG("[update_cfg]Delete illgal charactor."); + for (i = 0, count = 0; i < file_len; i++) { + if (pre_buf[i] == ' ' || pre_buf[i] == '\r' || pre_buf[i] == '\n') { + continue; + } + buf[count++] = pre_buf[i]; + } + + GTP_DEBUG("[update_cfg]Ascii to hex."); + file_config[0] = GTP_REG_CONFIG_DATA >> 8; + file_config[1] = GTP_REG_CONFIG_DATA & 0xff; + for (i = 0, file_cfg_len = GTP_ADDR_LENGTH; i < count; i += 5) { + if ((buf[i] == '0') && ((buf[i+1] == 'x') || (buf[i+1] == 'X'))) { + u8 high, low; + high = ascii2hex(buf[i+2]); + low = ascii2hex(buf[i+3]); + + if ((high == 0xFF) || (low == 0xFF)) { + ret = 0; + GTP_ERROR("[update_cfg]Illegal config file."); + goto update_cfg_file_failed; + } + file_config[file_cfg_len++] = (high<<4) + low; + } else { + ret = 0; + GTP_ERROR("[update_cfg]Illegal config file."); + goto update_cfg_file_failed; + } + } + + + GTP_DEBUG("config:"); + GTP_DEBUG_ARRAY(file_config+2, file_cfg_len); + + i = 0; + while (i++ < 5) { + ret = gup_i2c_write(client, file_config, file_cfg_len); + if (ret > 0) { + GTP_INFO("[update_cfg]Send config SUCCESS."); + break; + } + GTP_ERROR("[update_cfg]Send config i2c error."); + } + +update_cfg_file_failed: + kfree(pre_buf); + kfree(buf); + kfree(file_config); + return ret; +} + +#endif + +#if (GTP_AUTO_UPDATE && (!GTP_HEADER_FW_UPDATE || GTP_AUTO_UPDATE_CFG)) +static void gup_search_file(s32 search_type) +{ + s32 i = 0; + struct file *pfile = NULL; + + got_file_flag = 0x00; + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) { + if (0 == searching_file) { + GTP_INFO("Force exiting file searching"); + got_file_flag = 0x00; + return; + } + + if (search_type & AUTO_SEARCH_BIN) { + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", UPDATE_FILE_PATH_1, UPDATE_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(UPDATE_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pfile = filp_open(UPDATE_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_2); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + } else { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_1); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + if (got_file_flag & BIN_FILE_READY) { + #if GTP_AUTO_UPDATE_CFG + if (search_type & AUTO_SEARCH_CFG) { + i = GUP_SEARCH_FILE_TIMES; + } else + #endif + { + searching_file = 0; + return; + } + } + } + + #if GTP_AUTO_UPDATE_CFG + if ((search_type & AUTO_SEARCH_CFG) && !(got_file_flag & CFG_FILE_READY)) { + GTP_DEBUG("Search for %s, %s for config update.(%d/%d)", CONFIG_FILE_PATH_1, CONFIG_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(CONFIG_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pfile = filp_open(CONFIG_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_2); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + } else { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_1); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + if (got_file_flag & CFG_FILE_READY) { + searching_file = 0; + return; + } + } + #endif + msleep(3000); + } + searching_file = 0; +} +#endif + + +static u8 gup_check_update_file(struct i2c_client *client, st_fw_head *fw_head, u8 *path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + u8 buf[FW_HEAD_LENGTH]; + + got_file_flag = 0x00; + if (path) { + GTP_DEBUG("Update File path:%s, %ld", path, strlen(path)); + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + got_file_flag = BIN_FILE_READY; + } else { +#if GTP_AUTO_UPDATE + #if GTP_HEADER_FW_UPDATE + + + ret = gtp_i2c_read_dbl_check(client, GTP_REG_SENSOR_ID, >P_FW_SENSOR_ID, 1); + if (SUCCESS == ret) { + if (GTP_FW_SENSOR_ID >= 0x09) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", GTP_FW_SENSOR_ID); + + } + } + + if (GTP_FW_SENSOR_ID == 0x2) { + GTP_INFO("Update GT915L FW, Sensor ID : %d", GTP_FW_SENSOR_ID); + } else { + GTP_INFO("Force Upgrade Error !"); + + } + + GTP_INFO("Update by default firmware array"); + update_msg.fw_total_len = sizeof(gtp_default_FW) - FW_HEAD_LENGTH; + if (sizeof(gtp_default_FW) < (FW_HEAD_LENGTH+FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) { + GTP_ERROR("INVALID gtp_default_FW, check your gt9xx_firmware.h file!"); + return FAIL; + } + GTP_DEBUG("Firmware actual size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + memcpy(fw_head, >p_default_FW[0], FW_HEAD_LENGTH); + + + fw_checksum = 0; + for (i = 0; i < update_msg.fw_total_len; i += 2) { + fw_checksum += (gtp_default_FW[FW_HEAD_LENGTH + i] << 8) + gtp_default_FW[FW_HEAD_LENGTH + i + 1]; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if (fw_checksum&0xFFFF) { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + got_file_flag = HEADER_FW_READY; + return SUCCESS; + #else + + #if GTP_AUTO_UPDATE_CFG + gup_search_file(AUTO_SEARCH_BIN | AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) { + ret = gup_update_config(i2c_connect_client); + if (ret <= 0) { + GTP_ERROR("Update config failed."); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); + } + #else + gup_search_file(AUTO_SEARCH_BIN); + #endif + + if (!(got_file_flag & BIN_FILE_READY)) { + GTP_ERROR("No bin file for fw update"); + return FAIL; + } + #endif + +#else + { + GTP_ERROR("NULL file for firmware update"); + return FAIL; + } +#endif + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.fw_total_len = update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_END); + if (update_msg.fw_total_len < (FW_HEAD_LENGTH + FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) { + GTP_ERROR("INVALID bin file(size: %d), update aborted.", update_msg.fw_total_len); + return FAIL; + } + + update_msg.fw_total_len -= FW_HEAD_LENGTH; + + GTP_DEBUG("Bin firmware actual size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, FW_HEAD_LENGTH, &update_msg.file->f_pos); + if (ret < 0) { + GTP_ERROR("Read firmware head in update file error."); + return FAIL; + } + + memcpy(fw_head, buf, FW_HEAD_LENGTH); + + + fw_checksum = 0; + for (i = 0; i < update_msg.fw_total_len; i += 2) { + u16 temp; + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, 2, &update_msg.file->f_pos); + if (ret < 0) { + GTP_ERROR("Read firmware file error."); + return FAIL; + } + + temp = (buf[0]<<8) + buf[1]; + fw_checksum += temp; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if (fw_checksum&0xFFFF) { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_proc(struct i2c_client *client, u8 *burn_buf, u16 start_addr, u16 total_length) +{ + s32 ret = 0; + u16 burn_addr = start_addr; + u16 frame_length = 0; + u16 burn_length = 0; + u8 wr_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 retry = 0; + + GTP_DEBUG("Begin burn %dk data to addr 0x%x", (total_length/1024), start_addr); + while (burn_length < total_length) { + GTP_DEBUG("B/T:%04d/%04d", burn_length, total_length); + frame_length = ((total_length - burn_length) > PACK_SIZE) ? PACK_SIZE : (total_length - burn_length); + wr_buf[0] = (u8)(burn_addr>>8); + rd_buf[0] = wr_buf[0]; + wr_buf[1] = (u8)burn_addr; + rd_buf[1] = wr_buf[1]; + memcpy(&wr_buf[GTP_ADDR_LENGTH], &burn_buf[burn_length], frame_length); + + for (retry = 0; retry < MAX_FRAME_CHECK_TIME; retry++) { + ret = gup_i2c_write(client, wr_buf, GTP_ADDR_LENGTH + frame_length); + if (ret <= 0) { + GTP_ERROR("Write frame data i2c error."); + continue; + } + ret = gup_i2c_read(client, rd_buf, GTP_ADDR_LENGTH + frame_length); + if (ret <= 0) { + GTP_ERROR("Read back frame data i2c error."); + continue; + } + + if (memcmp(&wr_buf[GTP_ADDR_LENGTH], &rd_buf[GTP_ADDR_LENGTH], frame_length)) { + GTP_ERROR("Check frame data fail,not equal."); + GTP_DEBUG("write array:"); + GTP_DEBUG_ARRAY(&wr_buf[GTP_ADDR_LENGTH], frame_length); + GTP_DEBUG("read array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + continue; + } else { + + break; + } + } + if (retry >= MAX_FRAME_CHECK_TIME) { + GTP_ERROR("Burn frame data time out,exit."); + return FAIL; + } + burn_length += frame_length; + burn_addr += frame_length; + } + return SUCCESS; +} + +static u8 gup_load_section_file(u8 *buf, u32 offset, u16 length, u8 set_or_end) +{ +#if (GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) + if (got_file_flag == HEADER_FW_READY) { + if (SEEK_SET == set_or_end) { + memcpy(buf, >p_default_FW[FW_HEAD_LENGTH + offset], length); + } else { + memcpy(buf, >p_default_FW[update_msg.fw_total_len + FW_HEAD_LENGTH - offset], length); + } + return SUCCESS; + } +#endif + { + s32 ret = 0; + + if ((update_msg.file == NULL) || IS_ERR(update_msg.file)) { + GTP_ERROR("cannot find update file,load section file fail."); + return FAIL; + } + + if (SEEK_SET == set_or_end) { + update_msg.file->f_pos = FW_HEAD_LENGTH + offset; + } else { + update_msg.file->f_pos = update_msg.fw_total_len + FW_HEAD_LENGTH - offset; + } + + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, length, &update_msg.file->f_pos); + + if (ret < 0) { + GTP_ERROR("Read update file fail."); + return FAIL; + } + + return SUCCESS; + } +} + +static u8 gup_recall_check(struct i2c_client *client, u8 *chk_src, u16 start_rd_addr, u16 chk_length) +{ + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + s32 ret = 0; + u16 recall_addr = start_rd_addr; + u16 recall_length = 0; + u16 frame_length = 0; + + while (recall_length < chk_length) { + frame_length = ((chk_length - recall_length) > PACK_SIZE) ? PACK_SIZE : (chk_length - recall_length); + ret = gup_get_ic_msg(client, recall_addr, rd_buf, frame_length); + if (ret <= 0) { + GTP_ERROR("recall i2c error,exit"); + return FAIL; + } + + if (memcmp(&rd_buf[GTP_ADDR_LENGTH], &chk_src[recall_length], frame_length)) { + GTP_ERROR("Recall frame data fail,not equal."); + GTP_DEBUG("chk_src array:"); + GTP_DEBUG_ARRAY(&chk_src[recall_length], frame_length); + GTP_DEBUG("recall array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + return FAIL; + } + + recall_length += frame_length; + recall_addr += frame_length; + } + GTP_DEBUG("Recall check %dk firmware success.", (chk_length/1024)); + + return SUCCESS; +} + +static u8 gup_burn_fw_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u8 bank_cmd) +{ + s32 ret = 0; + u8 rd_buf[5]; + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]hold ss51 & dsp fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + + ret = gup_burn_proc(client, fw_section, start_addr, FW_SECTION_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_section]burn fw_section fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]hold ss51 & release dsp fail."); + return FAIL; + } + + msleep(1); + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0f); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]send burn cmd fail."); + return FAIL; + } + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]Get burn state fail"); + return FAIL; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + + ret = gup_recall_check(client, fw_section, start_addr, FW_SECTION_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_section]recall check %dk firmware fail.", FW_SECTION_LENGTH/1024); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]disable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_dsp_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_dsp_isp = NULL; + u8 retry = 0; + + GTP_INFO("[burn_dsp_isp]Begin burn dsp isp---->>"); + + + GTP_DEBUG("[burn_dsp_isp]step1:alloc memory"); + while (retry++ < 5) { + fw_dsp_isp = (u8 *)kzalloc(FW_DSP_ISP_LENGTH, GFP_KERNEL); + if (fw_dsp_isp == NULL) { + continue; + } else { + GTP_INFO("[burn_dsp_isp]Alloc %dk byte memory success.", (FW_DSP_ISP_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_dsp_isp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_dsp_isp]step2:load dsp isp file data"); + ret = gup_load_section_file(fw_dsp_isp, FW_DSP_ISP_LENGTH, FW_DSP_ISP_LENGTH, SEEK_END); + if (FAIL == ret) { + GTP_ERROR("[burn_dsp_isp]load firmware dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step3:disable wdt,clear cache enable"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]disable wdt fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]clear cache enable fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step5:set boot from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]set boot from sram fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step6:software reboot"); + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]software reboot fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step7:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]select bank2 fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step8:enable accessing code"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]enable accessing code fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step9:burn 4k dsp_isp"); + ret = gup_burn_proc(client, fw_dsp_isp, 0xC000, FW_DSP_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_dsp_isp]burn dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step10:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + update_msg.fw_burned_len += FW_DSP_ISP_LENGTH; + GTP_DEBUG("[burn_dsp_isp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_dsp_isp: + kfree(fw_dsp_isp); + return ret; +} + +static u8 gup_burn_fw_ss51(struct i2c_client *client) +{ + u8 *fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_INFO("[burn_fw_ss51]Begin burn ss51 firmware---->>"); + + + GTP_DEBUG("[burn_fw_ss51]step1:alloc memory"); + while (retry++ < 5) { + fw_ss51 = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_ss51 == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_ss51]Alloc %dk byte memory success.", (FW_SECTION_LENGTH / 1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_ss51]Alloc memory fail,exit."); + return FAIL; + } + + + + + + + + + + + GTP_INFO("[burn_fw_ss51]Reset first 8K of ss51 to 0xFF."); + GTP_DEBUG("[burn_fw_ss51]step2: reset bank0 0xC000~0xD000"); + memset(fw_ss51, 0xFF, FW_SECTION_LENGTH); + + + GTP_DEBUG("[burn_fw_ss51]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_ss51]clear control flag fail."); + ret = FAIL; + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step5:load ss51 firmware section 2 file data"); + ret = gup_load_section_file(fw_ss51, FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step6:burn ss51 firmware section 2"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x02); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step7:load ss51 firmware section 3 file data"); + ret = gup_load_section_file(fw_ss51, 2 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step8:burn ss51 firmware section 3"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x13); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step9:load ss51 firmware section 4 file data"); + ret = gup_load_section_file(fw_ss51, 3 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step10:burn ss51 firmware section 4"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x14); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + update_msg.fw_burned_len += (FW_SECTION_LENGTH*4); + GTP_DEBUG("[burn_fw_ss51]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_ss51: + kfree(fw_ss51); + return ret; +} + +static u8 gup_burn_fw_dsp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_dsp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_INFO("[burn_fw_dsp]Begin burn dsp firmware---->>"); + + GTP_DEBUG("[burn_fw_dsp]step1:alloc memory"); + while (retry++ < 5) { + fw_dsp = (u8 *)kzalloc(FW_DSP_LENGTH, GFP_KERNEL); + if (fw_dsp == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_dsp]Alloc %dk byte memory success.", (FW_SECTION_LENGTH / 1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_dsp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_dsp]step2:load firmware dsp"); + ret = gup_load_section_file(fw_dsp, 4 * FW_SECTION_LENGTH, FW_DSP_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]load firmware dsp fail."); + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step3:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step5:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step6:release ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_dsp]step7:burn 4k dsp firmware"); + ret = gup_burn_proc(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]burn fw_section fail."); + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x05); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]send burn cmd fail."); + goto exit_burn_fw_dsp; + } + GTP_DEBUG("[burn_fw_dsp]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]Get burn state fail"); + goto exit_burn_fw_dsp; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_dsp]step9:recall check 4k dsp firmware"); + ret = gup_recall_check(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]recall check 4k dsp firmware fail."); + goto exit_burn_fw_dsp; + } + + update_msg.fw_burned_len += FW_DSP_LENGTH; + GTP_DEBUG("[burn_fw_dsp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_dsp: + kfree(fw_dsp); + return ret; +} + +static u8 gup_burn_fw_boot(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_boot = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_INFO("[burn_fw_boot]Begin burn bootloader firmware---->>"); + + + GTP_DEBUG("[burn_fw_boot]step1:Alloc memory"); + while (retry++ < 5) { + fw_boot = (u8 *)kzalloc(FW_BOOT_LENGTH, GFP_KERNEL); + if (fw_boot == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_boot]Alloc %dk byte memory success.", (FW_BOOT_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_boot]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_boot]step2:load firmware bootloader"); + ret = gup_load_section_file(fw_boot, (4 * FW_SECTION_LENGTH + FW_DSP_LENGTH), FW_BOOT_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]load firmware bootcode fail."); + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step5:hold ss51 & release dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_boot]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step6:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]burn fw_boot fail."); + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step7:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x06); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]send burn cmd fail."); + goto exit_burn_fw_boot; + } + GTP_DEBUG("[burn_fw_boot]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]Get burn state fail"); + goto exit_burn_fw_boot; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_boot]step8:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]recall check 2k bootcode firmware fail."); + goto exit_burn_fw_boot; + } + + update_msg.fw_burned_len += FW_BOOT_LENGTH; + GTP_DEBUG("[burn_fw_boot]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_boot: + kfree(fw_boot); + return ret; +} +static u8 gup_burn_fw_boot_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_boot_isp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the boot_isp code!"); + return SUCCESS; + } + GTP_INFO("[burn_fw_boot_isp]Begin burn boot_isp firmware---->>"); + + + GTP_DEBUG("[burn_fw_boot_isp]step1:Alloc memory"); + while (retry++ < 5) { + fw_boot_isp = (u8 *)kzalloc(FW_BOOT_ISP_LENGTH, GFP_KERNEL); + if (fw_boot_isp == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_boot_isp]Alloc %dk byte memory success.", (FW_BOOT_ISP_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_boot_isp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step2:load firmware bootloader isp"); + + ret = gup_load_section_file(fw_boot_isp, (update_msg.fw_burned_len - FW_DSP_ISP_LENGTH), FW_BOOT_ISP_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]load firmware boot_isp fail."); + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + + GTP_DEBUG("[burn_fw_boot_isp]step5:hold ss51 & release dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_boot_isp]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step7:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]burn fw_section fail."); + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x07); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]send burn cmd fail."); + goto exit_burn_fw_boot_isp; + } + GTP_DEBUG("[burn_fw_boot_isp]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]Get burn state fail"); + goto exit_burn_fw_boot_isp; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_boot_isp]step9:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]recall check 2k bootcode_isp firmware fail."); + goto exit_burn_fw_boot_isp; + } + + update_msg.fw_burned_len += FW_BOOT_ISP_LENGTH; + GTP_DEBUG("[burn_fw_boot_isp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_boot_isp: + kfree(fw_boot_isp); + return ret; +} + +static u8 gup_burn_fw_link(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_link = NULL; + u8 retry = 0; + u32 offset; + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the link code!"); + return SUCCESS; + } + GTP_INFO("[burn_fw_link]Begin burn link firmware---->>"); + + + GTP_DEBUG("[burn_fw_link]step1:Alloc memory"); + while (retry++ < 5) { + fw_link = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_link == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_link]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_link]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_link]step2:load firmware link section 1"); + offset = update_msg.fw_burned_len - FW_DSP_ISP_LENGTH; + ret = gup_load_section_file(fw_link, offset, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]load firmware link section 1 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step3:burn link firmware section 1"); + ret = gup_burn_fw_gwake_section(client, fw_link, 0x9000, FW_SECTION_LENGTH, 0x38); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]burn link firmware section 1 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step4:load link firmware section 2 file data"); + offset += FW_SECTION_LENGTH; + ret = gup_load_section_file(fw_link, offset, FW_GLINK_LENGTH - FW_SECTION_LENGTH, SEEK_SET); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]load link firmware section 2 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step4:burn link firmware section 2"); + ret = gup_burn_fw_gwake_section(client, fw_link, 0x9000, FW_GLINK_LENGTH - FW_SECTION_LENGTH, 0x39); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]burn link firmware section 2 fail."); + goto exit_burn_fw_link; + } + + update_msg.fw_burned_len += FW_GLINK_LENGTH; + GTP_DEBUG("[burn_fw_link]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_link: + kfree(fw_link); + return ret; +} + +static u8 gup_burn_fw_gwake_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd) +{ + s32 ret = 0; + u8 rd_buf[5]; + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]hold ss51 & dsp fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]hold ss51 & release dsp fail."); + return FAIL; + } + + msleep(1); + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_burn_proc(client, fw_section, start_addr, len); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_app_section]burn fw_section fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]send burn cmd fail."); + return FAIL; + } + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]Get burn state fail"); + return FAIL; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + ret = gup_recall_check(client, fw_section, start_addr, len); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_app_section]recall check %dk firmware fail.", len/1024); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_fw_gwake(struct i2c_client *client) +{ + u8 *fw_gwake = NULL; + u8 retry = 0; + s32 ret = 0; + u16 start_index = 4*FW_SECTION_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH + FW_BOOT_ISP_LENGTH + FW_GLINK_LENGTH; + + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the gwake code!"); + return SUCCESS; + } + + GTP_INFO("[burn_fw_gwake]Begin burn gwake firmware---->>"); + + + GTP_DEBUG("[burn_fw_gwake]step1:alloc memory"); + while (retry++ < 5) { + fw_gwake = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_gwake == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_gwake]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_gwake]Alloc memory fail,exit."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]clear control flag fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step2:load app_code firmware section 1 file data"); + ret = gup_load_section_file(fw_gwake, start_index, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 1 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step3:burn app_code firmware section 1"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3A); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 1 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step5:load app_code firmware section 2 file data"); + ret = gup_load_section_file(fw_gwake, start_index+FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 2 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step6:burn app_code firmware section 2"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3B); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 2 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step7:load app_code firmware section 3 file data"); + ret = gup_load_section_file(fw_gwake, start_index+2*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 3 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step8:burn app_code firmware section 3"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3C); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 3 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step9:load app_code firmware section 4 file data"); + ret = gup_load_section_file(fw_gwake, start_index + 3*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 4 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step10:burn app_code firmware section 4"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3D); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 4 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_gwake: + kfree(fw_gwake); + return ret; +} + +static u8 gup_burn_fw_finish(struct i2c_client *client) +{ + u8 *fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_INFO("[burn_fw_finish]burn first 8K of ss51 and finish update."); + + GTP_DEBUG("[burn_fw_finish]step1:alloc memory"); + while (retry++ < 5) { + fw_ss51 = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_ss51 == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_finish]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_finish]Alloc memory fail,exit."); + return FAIL; + } + + GTP_DEBUG("[burn_fw_finish]step2: burn ss51 first 8K."); + ret = gup_load_section_file(fw_ss51, 0, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_finish]load ss51 firmware section 1 fail."); + goto exit_burn_fw_finish; + } + + GTP_DEBUG("[burn_fw_finish]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]clear control flag fail."); + goto exit_burn_fw_finish; + } + + GTP_DEBUG("[burn_fw_finish]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_finish]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_finish; + } + + + GTP_DEBUG("[burn_fw_finish]step5:enable download DSP code "); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x99); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]enable download DSP code fail."); + goto exit_burn_fw_finish; + } + + + GTP_DEBUG("[burn_fw_finish]step6:release ss51 & hold dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x08); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]release ss51 & hold dsp fail."); + goto exit_burn_fw_finish; + } + + if (fw_ss51) { + kfree(fw_ss51); + } + return SUCCESS; + +exit_burn_fw_finish: + if (fw_ss51) { + kfree(fw_ss51); + } + return FAIL; +} +s32 gup_update_proc(void *dir) +{ + s32 ret = 0; + s32 update_ret = FAIL; + u8 retry = 0; + st_fw_head fw_head; + struct goodix_ts_data *ts = NULL; + + GTP_DEBUG("[update_proc]Begin update ......"); + + ts = i2c_get_clientdata(i2c_connect_client); + +#if GTP_AUTO_UPDATE + if (searching_file) { + u8 timeout = 0; + searching_file = 0; + GTP_INFO("Exiting searching .bin update file..."); + while ((show_len != 200) && (show_len != 100) && (timeout++ < 100)) { + msleep(100); + } + } +#endif + + show_len = 1; + total_len = 100; + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return gup_fw_download_proc(dir, GTP_FL_FW_BURN); + } +#endif + + update_msg.file = NULL; + ret = gup_check_update_file(i2c_connect_client, &fw_head, (u8 *)dir); + if (FAIL == ret) { + GTP_ERROR("[update_proc]check update file fail."); + goto file_fail; + } + + ret = gup_get_ic_fw_msg(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]get ic message fail."); + goto file_fail; + } + + ret = gup_enter_update_judge(&fw_head); + if (FAIL == ret) { + GTP_ERROR("[update_proc]Check *.bin file fail."); + goto file_fail; + } + + ts->enter_update = 1; + gtp_irq_disable(ts); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ret = gup_enter_update_mode(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]enter update mode fail."); + goto update_fail; + } + + while (retry++ < 5) { + show_len = 10; + total_len = 100; + update_msg.fw_burned_len = 0; + ret = gup_burn_dsp_isp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn dsp isp fail."); + continue; + } + + show_len = 20; + ret = gup_burn_fw_gwake(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn app_code firmware fail."); + continue; + } + + show_len = 30; + ret = gup_burn_fw_ss51(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn ss51 firmware fail."); + continue; + } + + show_len = 40; + ret = gup_burn_fw_dsp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn dsp firmware fail."); + continue; + } + + show_len = 50; + ret = gup_burn_fw_boot(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn bootloader firmware fail."); + continue; + } + show_len = 60; + + ret = gup_burn_fw_boot_isp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn boot_isp firmware fail."); + continue; + } + + show_len = 70; + ret = gup_burn_fw_link(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn link firmware fail."); + continue; + } + + show_len = 80; + ret = gup_burn_fw_finish(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn finish fail."); + continue; + } + show_len = 90; + GTP_INFO("[update_proc]UPDATE SUCCESS."); + retry = 0; + break; + } + + if (retry >= 5) { + GTP_ERROR("[update_proc]retry timeout,UPDATE FAIL."); + update_ret = FAIL; + } else { + update_ret = SUCCESS; + } + +#if WT_ADD_CTP_INFO +gtp_hardwareinfo_set(); +#endif + + +update_fail: + GTP_DEBUG("[update_proc]leave update mode."); + gup_leave_update_mode(); + + msleep(100); + + if (SUCCESS == update_ret) { + if (ts->fw_error) { + GTP_INFO("firmware error auto update, resent config!"); + gup_init_panel(ts); + } else { + GTP_DEBUG("[update_proc]send config."); + ret = gtp_send_cfg(i2c_connect_client); + if (ret < 0) { + GTP_ERROR("[update_proc]send config fail."); + } else { + msleep(100); + } + } + } + ts->enter_update = 0; + gtp_irq_enable(ts); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + +file_fail: + if (update_msg.file && !IS_ERR(update_msg.file)) { + if (update_msg.old_fs) { + set_fs(update_msg.old_fs); + } + filp_close(update_msg.file, NULL); + } +#if (GTP_AUTO_UPDATE && GTP_AUTO_UPDATE_CFG && GTP_HEADER_FW_UPDATE) + if (NULL == dir) { + gup_search_file(AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) { + ret = gup_update_config(i2c_connect_client); + if (ret <= 0) { + GTP_ERROR("Update config failed."); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); + } + } +#endif + + total_len = 100; + if (SUCCESS == update_ret) { + show_len = 100; + return SUCCESS; + } else { + show_len = 200; + return FAIL; + } +} + +#if GTP_AUTO_UPDATE +u8 gup_init_update_proc(struct goodix_ts_data *ts) +{ + struct task_struct *thread = NULL; + + GTP_INFO("Ready to run update thread."); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + thread = kthread_run(gup_update_proc, "update", "fl update"); + } else +#endif + { + thread = kthread_run(gup_update_proc, (void *)NULL, "guitar_update"); + } + if (IS_ERR(thread)) { + GTP_ERROR("Failed to create update thread.\n"); + return -EPERM; + } + + return 0; +} +#endif + + + +#define FW_DOWNLOAD_LENGTH 0x4000 +#define FW_SS51_SECTION_LEN 0x2000 +#define FL_PACK_SIZE 1024 +#define GUP_FW_CHK_SIZE FL_PACK_SIZE + +#define FL_UPDATE_PATH "/data/_fl_update_.bin" +#define FL_UPDATE_PATH_SD "/sdcard/_fl_update_.bin" + +#define PULSE_LENGTH (200) +#define INIT_CLK_DAC (50) +#define MAX_CLK_DAC (120) +#define CLK_AVG_TIME (1) +#define MILLION 1000000 + +#define _wRW_MISCTL__RG_DMY 0x4282 +#define _bRW_MISCTL__RG_OSC_CALIB 0x4268 +#define _fRW_MISCTL__GIO0 0x41e9 +#define _fRW_MISCTL__GIO1 0x41ed +#define _fRW_MISCTL__GIO2 0x41f1 +#define _fRW_MISCTL__GIO3 0x41f5 +#define _fRW_MISCTL__GIO4 0x41f9 +#define _fRW_MISCTL__GIO5 0x41fd +#define _fRW_MISCTL__GIO6 0x4201 +#define _fRW_MISCTL__GIO7 0x4205 +#define _fRW_MISCTL__GIO8 0x4209 +#define _fRW_MISCTL__GIO9 0x420d +#define _fRW_MISCTL__MEA 0x41a0 +#define _bRW_MISCTL__MEA_MODE 0x41a1 +#define _wRW_MISCTL__MEA_MAX_NUM 0x41a4 +#define _dRO_MISCTL__MEA_VAL 0x41b0 +#define _bRW_MISCTL__MEA_SRCSEL 0x41a3 +#define _bRO_MISCTL__MEA_RDY 0x41a8 +#define _rRW_MISCTL__ANA_RXADC_B0_ 0x4250 +#define _bRW_MISCTL__RG_LDO_A18_PWD 0x426f +#define _bRW_MISCTL__RG_BG_PWD 0x426a +#define _bRW_MISCTL__RG_CLKGEN_PWD 0x4269 +#define _fRW_MISCTL__RG_RXADC_PWD 0x426a +#define _bRW_MISCTL__OSC_CK_SEL 0x4030 +#define _rRW_MISCTL_RG_DMY83 0x4283 +#define _rRW_MISCTL__GIO1CTL_B2_ 0x41ee +#define _rRW_MISCTL__GIO1CTL_B1_ 0x41ed + + +#if GTP_COMPATIBLE_MODE + +u8 i2c_opr_buf[GTP_ADDR_LENGTH + FL_PACK_SIZE] = {0}; +u8 chk_cmp_buf[FL_PACK_SIZE] = {0}; + +extern s32 gtp_fw_startup(struct i2c_client *client); +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode); +static s32 gup_burn_fw_proc(struct i2c_client *client, u16 start_addr, s32 start_index, s32 burn_len); +static s32 gup_check_and_repair(struct i2c_client *client, u16 start_addr, s32 start_index, s32 chk_len); + + +u8 gup_check_fs_mounted(char *path_name) +{ + struct path root_path; + struct path path; + int err = -1; + err = kern_path("/", LOOKUP_FOLLOW, &root_path); + + if (err) { + GTP_DEBUG("\"/\" NOT Mounted: %d", err); + return FAIL; + } + err = kern_path(path_name, LOOKUP_FOLLOW, &path); + + if (err) { + GTP_DEBUG("%s NOT Mounted: %d", path_name, err); + err = FAIL; + goto exit_chk; + } + + if (path.mnt->mnt_sb == root_path.mnt->mnt_sb) { + err = FAIL; + } else { + err = SUCCESS; + } + + path_put(&path); +exit_chk: + path_put(&root_path); + return err; +} + +s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len) +{ + s32 ret = 0; + s32 write_bytes = 0; + s32 retry = 0; + u8 *tx_buf = buf; + + while (len > 0) { + i2c_opr_buf[0] = (u8)(addr >> 8); + i2c_opr_buf[1] = (u8)(addr & 0xFF); + if (len > FL_PACK_SIZE) { + write_bytes = FL_PACK_SIZE; + } else { + write_bytes = len; + } + memcpy(i2c_opr_buf + 2, tx_buf, write_bytes); + for (retry = 0; retry < 5; ++retry) { + ret = gup_i2c_write(client, i2c_opr_buf, write_bytes + GTP_ADDR_LENGTH); + if (ret == 1) { + break; + } + } + if (retry >= 5) { + GTP_ERROR("retry timeout, I2C write 0x%04X %d bytes failed!", addr, write_bytes); + return -EPERM; + } + addr += write_bytes; + len -= write_bytes; + tx_buf += write_bytes; + } + + return 1; +} + +s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len) +{ + s32 ret = 0; + s32 read_bytes = 0; + s32 retry = 0; + u8 *tx_buf = buf; + + while (len > 0) { + i2c_opr_buf[0] = (u8)(addr >> 8); + i2c_opr_buf[1] = (u8)(addr & 0xFF); + if (len > FL_PACK_SIZE) { + read_bytes = FL_PACK_SIZE; + } else { + read_bytes = len; + } + for (retry = 0; retry < 5; ++retry) { + ret = gup_i2c_read(client, i2c_opr_buf, read_bytes + GTP_ADDR_LENGTH); + if (ret == 2) { + break; + } + } + if (retry >= 5) { + GTP_ERROR("retry timeout, I2C read 0x%04X %d bytes failed!", addr, read_bytes); + return -EPERM; + } + memcpy(tx_buf, i2c_opr_buf + 2, read_bytes); + addr += read_bytes; + len -= read_bytes; + tx_buf += read_bytes; + } + return 2; +} + + + + + +static void gup_bit_write(s32 addr, s32 bit, s32 val) +{ + u8 buf; + i2c_read_bytes(i2c_connect_client, addr, &buf, 1); + + buf = (buf & (~((u8)1 << bit))) | ((u8)val << bit); + + i2c_write_bytes(i2c_connect_client, addr, &buf, 1); +} + +static void gup_clk_count_init(s32 bCh, s32 bCNT) +{ + u8 buf; + + + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + + gup_bit_write(_fRW_MISCTL__MEA, 1, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__MEA_MODE, &buf, 1); + + buf = 8 + bCh; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__MEA_SRCSEL, &buf, 1); + + buf = bCNT; + i2c_write_bytes(i2c_connect_client, _wRW_MISCTL__MEA_MAX_NUM, &buf, 1); + + gup_bit_write(_fRW_MISCTL__MEA, 1, 0); + + gup_bit_write(_fRW_MISCTL__MEA, 0, 1); +} + +static u32 gup_clk_count_get(void) +{ + s32 ready = 0; + s32 temp; + s8 buf[4]; + + while ((ready == 0)) { + i2c_read_bytes(i2c_connect_client, _bRO_MISCTL__MEA_RDY, buf, 1); + ready = buf[0]; + } + + msleep(50); + + + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + i2c_read_bytes(i2c_connect_client, _dRO_MISCTL__MEA_VAL, buf, 4); + GTP_DEBUG("Clk_count 0: %2X", buf[0]); + GTP_DEBUG("Clk_count 1: %2X", buf[1]); + GTP_DEBUG("Clk_count 2: %2X", buf[2]); + GTP_DEBUG("Clk_count 3: %2X", buf[3]); + + temp = (s32)buf[0] + ((s32)buf[1] << 8) + ((s32)buf[2] << 16) + ((s32)buf[3] << 24); + GTP_INFO("Clk_count : %d", temp); + return temp; +} +u8 gup_clk_dac_setting(int dac) +{ + s8 buf1, buf2; + + i2c_read_bytes(i2c_connect_client, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_read_bytes(i2c_connect_client, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + buf1 = (buf1 & 0xFFCF) | ((dac & 0x03) << 4); + buf2 = (dac >> 2) & 0x3f; + + i2c_write_bytes(i2c_connect_client, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + return 0; +} + +static u8 gup_clk_calibration_pin_select(s32 bCh) +{ + s32 i2c_addr; + + switch (bCh) { + case 0: + i2c_addr = _fRW_MISCTL__GIO0; + break; + + case 1: + i2c_addr = _fRW_MISCTL__GIO1; + break; + + case 2: + i2c_addr = _fRW_MISCTL__GIO2; + break; + + case 3: + i2c_addr = _fRW_MISCTL__GIO3; + break; + + case 4: + i2c_addr = _fRW_MISCTL__GIO4; + break; + + case 5: + i2c_addr = _fRW_MISCTL__GIO5; + break; + + case 6: + i2c_addr = _fRW_MISCTL__GIO6; + break; + + case 7: + i2c_addr = _fRW_MISCTL__GIO7; + break; + + case 8: + i2c_addr = _fRW_MISCTL__GIO8; + break; + + case 9: + i2c_addr = _fRW_MISCTL__GIO9; + break; + } + + gup_bit_write(i2c_addr, 1, 0); + + return 0; +} + +void gup_output_pulse(int t) +{ + unsigned long flags; + + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(10); + + local_irq_save(flags); + + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(50); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(t - 50); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + local_irq_restore(flags); + + msleep(20); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); +} + +static void gup_sys_clk_init(void) +{ + u8 buf; + + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 5, 0); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_LDO_A18_PWD, &buf, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_BG_PWD, &buf, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_CLKGEN_PWD, &buf, 1); + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 0, 0); + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 1, 0); + + + buf = 1; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__OSC_CK_SEL, &buf, 1); +} + +s32 gup_clk_calibration(void) +{ + u8 buf; + + s32 i; + struct timeval start, end; + s32 count; + s32 count_ref; + s32 sec; + s32 usec; + + struct goodix_ts_data *ts; + + buf = 0x0C; + i2c_write_bytes(i2c_connect_client, _rRW_MISCTL__SWRST_B0_, &buf, 1); + + + gup_bit_write(_rRW_MISCTL_RG_DMY83, 7, 0); + + + gup_bit_write(_rRW_MISCTL__GIO1CTL_B2_, 0, 0); + + + gup_bit_write(_rRW_MISCTL__GIO1CTL_B1_, 1, 0); + + + + + + GTP_INFO("CLK calibration GO"); + gup_sys_clk_init(); + gup_clk_calibration_pin_select(1); + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + ts = i2c_get_clientdata(i2c_connect_client); + + for (i = INIT_CLK_DAC; i < MAX_CLK_DAC; i++) { + GTP_INFO("CLK calibration DAC %d", i); + + if (ts->gtp_is_suspend) { + i = 72; + break; + } + + gup_clk_dac_setting(i); + gup_clk_count_init(1, CLK_AVG_TIME); + + #if 0 + gup_output_pulse(PULSE_LENGTH); + count = gup_clk_count_get(); + + if (count > PULSE_LENGTH * 60) { + break; + } + + #else + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + + do_gettimeofday(&start); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + + msleep(1); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(1); + + + do_gettimeofday(&end); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + + count = gup_clk_count_get(); + msleep(20); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + usec = end.tv_usec - start.tv_usec; + sec = end.tv_sec - start.tv_sec; + count_ref = 60 * (usec + sec * MILLION); + + GTP_DEBUG("== time %d, %d, %d", sec, usec, count_ref); + + if (count > count_ref) { + GTP_DEBUG("== count_diff %d", count - count_ref); + break; + } + + #endif + } + + + + gtp_reset_guitar(i2c_connect_client, 20); + +#if 0 + + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x41FA, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4104, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4105, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4106, &buf, 1); + buf = 0x01; + i2c_write_bytes(i2c_connect_client, 0x4107, &buf, 1); + buf = 0x06; + i2c_write_bytes(i2c_connect_client, 0x41F8, &buf, 1); + buf = 0x02; + i2c_write_bytes(i2c_connect_client, 0x41F9, &buf, 1); +#endif + + GTP_GPIO_AS_INT(gtp_int_gpio); + return i; +} + + + +s32 gup_hold_ss51_dsp(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + while (retry++ < 200) { + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if (0x0C == rd_buf[GTP_ADDR_LENGTH]) { + GTP_DEBUG("[enter_update_mode]Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if (retry >= 200) { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + + ret = gup_set_ic_msg(client, 0x4010, 0x00); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]DSP_CK and DSP_ALU_CK PowerOn fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]disable wdt fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]clear cache enable fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]set boot from sram fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]software reboot fail."); + return FAIL; + } + + return SUCCESS; +} + +s32 gup_enter_update_mode_fl(struct i2c_client *client) +{ + s32 ret = -1; + + + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_int_gpio, (client->addr == 0x14)); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + msleep(5); + + + ret = gup_hold_ss51_dsp(client); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]hold ss51 & dsp failed."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]clear control flag fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]enable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode) +{ + s32 ret = 0; + + + GTP_DEBUG("[download_fw_dsp]step1:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + if (ret == FAIL) { + GTP_ERROR("select bank 2 fail"); + return FAIL; + } + + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("[download_fw_dsp]Begin download dsp fw---->>"); + + if (ret <= 0) { + GTP_ERROR("[download_fw_dsp]select bank2 fail."); + return FAIL; + } + GTP_DEBUG("burn fw dsp"); + ret = gup_burn_fw_proc(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[download_fw_dsp]download FW dsp fail."); + return FAIL; + } + GTP_INFO("check firmware dsp"); + ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("check fw dsp failed!"); + return FAIL; + } + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + GTP_INFO("[download_fw_dsp]Begin esd check dsp fw---->>"); + + + + + { + + GTP_INFO("esd recovery redownload firmware dsp code"); + ret = gup_burn_fw_proc(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("redownload fw dsp failed!"); + return FAIL; + } + } + } else { + GTP_INFO("check firmware dsp"); + ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("check fw dsp failed!"); + return FAIL; + } + } + return SUCCESS; +} + +static s32 gup_burn_fw_proc(struct i2c_client *client, u16 start_addr, s32 start_index, s32 burn_len) +{ + s32 ret = 0; + + GTP_DEBUG("burn firmware: 0x%04X, %d bytes, start_index: 0x%04X", start_addr, burn_len, start_index); + + ret = i2c_write_bytes(client, start_addr, (u8 *)>p_default_FW_fl[FW_HEAD_LENGTH + start_index], burn_len); + if (ret < 0) { + GTP_ERROR("burn 0x%04X, %d bytes failed!", start_addr, burn_len); + return FAIL; + } + return SUCCESS; +} + +static s32 gup_check_and_repair(struct i2c_client *client, u16 start_addr, s32 start_index, s32 chk_len) +{ + s32 ret = 0; + s32 cmp_len = 0; + u16 cmp_addr = start_addr; + s32 i = 0; + s32 chked_times = 0; + u8 chk_fail = 0; + + GTP_DEBUG("check firmware: start 0x%04X, %d bytes", start_addr, chk_len); + while ((chk_len > 0) && (chked_times < GTP_CHK_FW_MAX)) { + if (chk_len >= GUP_FW_CHK_SIZE) { + cmp_len = GUP_FW_CHK_SIZE; + } else { + cmp_len = chk_len; + } + ret = i2c_read_bytes(client, cmp_addr, chk_cmp_buf, cmp_len); + if (ret < 0) { + chk_fail = 1; + break; + } + for (i = 0; i < cmp_len; ++i) { + if (chk_cmp_buf[i] != gtp_default_FW_fl[FW_HEAD_LENGTH + start_index + i]) { + chk_fail = 1; + i2c_write_bytes(client, cmp_addr + i, >p_default_FW_fl[FW_HEAD_LENGTH + start_index + i], cmp_len-i); + GTP_ERROR("Check failed index: %d(%d != %d), redownload chuck", i, chk_cmp_buf[i], + gtp_default_FW_fl[FW_HEAD_LENGTH + start_index + i]); + break; + } + } + if (chk_fail == 1) { + chk_fail = 0; + chked_times++; + } else { + cmp_addr += cmp_len; + start_index += cmp_len; + chk_len -= cmp_len; + } + } + if (chk_len > 0) { + GTP_ERROR("cmp_addr: 0x%04X, start_index: 0x%02X, chk_len: 0x%04X", cmp_addr, + start_index, chk_len); + return FAIL; + } + return SUCCESS; +} + +static u8 gup_download_fw_ss51(struct i2c_client *client, u8 dwn_mode) +{ + s32 section = 0; + s32 ret = 0; + s32 start_index = 0; + u8 bank = 0; + u16 burn_addr = 0xC000; + + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("download firmware ss51"); + } else { + GTP_INFO("check firmware ss51"); + } + for (section = 1; section <= 4; section += 2) { + switch (section) { + case 1: + bank = 0x00; + burn_addr = (section - 1) * FW_SS51_SECTION_LEN + 0xC000; + break; + case 3: + bank = 0x01; + burn_addr = (section - 3) * FW_SS51_SECTION_LEN + 0xC000; + break; + } + start_index = (section - 1) * FW_SS51_SECTION_LEN; + + GTP_DEBUG("download firmware ss51: select bank%d", bank); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, bank); + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_DEBUG("download firmware ss51 section%d & %d", section, section+1); + ret = gup_burn_fw_proc(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("download fw ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + GTP_DEBUG("check firmware ss51 section%d & %d", section, section+1); + ret = gup_check_and_repair(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("check ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + + + + { + + GTP_DEBUG("esd recovery redownload ss51 section%d & %d", section, section+1); + ret = gup_burn_fw_proc(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("download fw ss51 section%d failed!", section); + return FAIL; + } + } + } else { + GTP_DEBUG("check firmware ss51 section%d & %d", section, section+1); + ret = gup_check_and_repair(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("check ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + } + } + + return SUCCESS; +} + + +static s32 gup_prepare_fl_fw(char *path, st_fw_head *fw_head) +{ + s32 ret = 0; + s32 i = 0; + s32 timeout = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + + if (!memcmp(path, "update", 6)) { + GTP_INFO("Search for GT9XXF firmware file to update"); + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) { + if (0 == searching_file) { + GTP_INFO("Force terminate auto update for GT9XXF..."); + return FAIL; + } + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", FL_UPDATE_PATH, FL_UPDATE_PATH_SD, i+1, GUP_SEARCH_FILE_TIMES); + update_msg.file = filp_open(FL_UPDATE_PATH, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) { + update_msg.file = filp_open(FL_UPDATE_PATH_SD, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) { + msleep(3000); + continue; + } else { + path = FL_UPDATE_PATH_SD; + break; + } + } else { + path = FL_UPDATE_PATH; + break; + } + } + searching_file = 0; + if (i == 50) { + GTP_INFO("Search timeout, update aborted"); + return FAIL; + } else { + GTP_INFO("GT9XXF firmware file %s found!", path); + _CLOSE_FILE(update_msg.file); + } + while (ts->rqst_processing && (timeout++ < 5)) { + GTP_DEBUG("request processing, waiting for accomplishment"); + msleep(1000); + } + } + GTP_INFO("Firmware update file path: %s", path); + + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.fw_total_len = update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_END); + + update_msg.force_update = 0xBE; + if (update_msg.fw_total_len != sizeof(gtp_default_FW_fl)) { + GTP_ERROR("Inconsistent fw size. default size: %d(%dK), file size: %d(%dK)", sizeof(gtp_default_FW_fl), sizeof(gtp_default_FW_fl)/1024, update_msg.fw_total_len, update_msg.fw_total_len/1024); + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + return FAIL; + } + + update_msg.fw_total_len -= FW_HEAD_LENGTH; + GTP_DEBUG("Fimrware size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len / 1024); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + ret = update_msg.file->f_op->read(update_msg.file, (char *)gtp_default_FW_fl, + update_msg.fw_total_len + FW_HEAD_LENGTH, + &update_msg.file->f_pos); + update_msg.fw_total_len += FW_HEAD_LENGTH; + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + + if (ret < 0) { + GTP_ERROR("read %s failed, err-code: %d", path, ret); + return FAIL; + } + return SUCCESS; +} +static u8 gup_check_update_file_fl(struct i2c_client *client, st_fw_head *fw_head, char *path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + + if (NULL != path) { + ret = gup_prepare_fl_fw(path, fw_head); + if (FAIL == ret) { + return FAIL; + } + } else { + update_msg.fw_total_len = sizeof(gtp_default_FW_fl); + } + + memcpy(fw_head, gtp_default_FW_fl, FW_HEAD_LENGTH); + GTP_INFO("FILE HARDWARE INFO: %02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID: %s", fw_head->pid); + fw_head->vid = ((fw_head->vid & 0xFF00) >> 8) + ((fw_head->vid & 0x00FF) << 8); + GTP_INFO("FILE VID: %04x", fw_head->vid); + + + fw_checksum = 0; + for (i = FW_HEAD_LENGTH; i < update_msg.fw_total_len; i += 2) { + fw_checksum += (gtp_default_FW_fl[i] << 8) + gtp_default_FW_fl[i+1]; + } + ret = SUCCESS; + + GTP_DEBUG("firmware checksum: %x", fw_checksum&0xFFFF); + if (fw_checksum & 0xFFFF) { + GTP_ERROR("Illegal firmware file."); + ret = FAIL; + } + + return ret; +} + +s32 gup_fw_download_proc(void *dir, u8 dwn_mode) +{ + s32 ret = 0; + u8 retry = 0; + st_fw_head fw_head; + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(i2c_connect_client); + if (NULL == dir) { + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("[fw_download_proc]Begin fw download ......"); + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + GTP_INFO("[fw_download_proc]Begin fw esd recovery check ......"); + } else { + GTP_INFO("[fw_download_proc]Being fw repair check......"); + } + } else { + GTP_INFO("[fw_download_proc]Begin firmware update by bin file"); + } + + total_len = 100; + show_len = 0; + + ret = gup_check_update_file_fl(i2c_connect_client, &fw_head, (char *)dir); + show_len = 10; + + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]check update file fail."); + goto file_fail; + } + + if (!memcmp(fw_head.pid, "950", 3)) { + ts->is_950 = 1; + GTP_DEBUG("GT9XXF Ic Type: gt950"); + } else { + ts->is_950 = 0; + } + + if (NULL != dir) { + gtp_irq_disable(ts); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + } + + ret = gup_enter_update_mode_fl(i2c_connect_client); + show_len = 20; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]enter update mode fail."); + goto download_fail; + } + + while (retry++ < 5) { + ret = gup_download_fw_ss51(i2c_connect_client, dwn_mode); + show_len = 60; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]burn ss51 firmware fail."); + continue; + } + + ret = gup_download_fw_dsp(i2c_connect_client, dwn_mode); + show_len = 80; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]burn dsp firmware fail."); + continue; + } + + GTP_INFO("[fw_download_proc]UPDATE SUCCESS."); + break; + } + + if (retry >= 5) { + GTP_ERROR("[fw_download_proc]retry timeout,UPDATE FAIL."); + goto download_fail; + } + + if (NULL != dir) { + gtp_irq_enable(ts); + gtp_fw_startup(ts->client); + #if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); + #endif + } + show_len = 100; + return SUCCESS; + +download_fail: + if (NULL != dir) { + gtp_irq_enable(ts); + gtp_fw_startup(ts->client); + #if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); + #endif + } +file_fail: + show_len = 200; + + return FAIL; +} + +#endif + + diff --git a/drivers/input/touchscreen/GT917D/FW_BIEL.txt b/drivers/input/touchscreen/GT917D/FW_BIEL.txt new file mode 100644 index 0000000000000..88bf7ac73e24a --- /dev/null +++ b/drivers/input/touchscreen/GT917D/FW_BIEL.txt @@ -0,0 +1,5633 @@ +0x00,0x01,0x60,0x00,0x39,0x31,0x37,0x44,0x00,0x00,0x00,0x00,0x50,0x03,0x80,0x00, +0x55,0x40,0xbd,0xda,0xfd,0x24,0x34,0xdf,0x44,0x40,0x44,0x02,0xbe,0x03,0x08,0xb4, +0x27,0x41,0x8c,0x90,0x4c,0xa4,0x22,0xb7,0xed,0x5e,0x58,0x34,0x17,0xbf,0x01,0x08, +0x84,0x00,0x72,0xfc,0x81,0xd9,0x39,0x25,0xc8,0xe2,0x39,0x87,0x0f,0xed,0x09,0x1d, +0xc9,0x1a,0xe9,0xd5,0x5f,0x2e,0x23,0xb6,0x6d,0x4b,0xa6,0xe6,0xa3,0x7e,0x3f,0x64, +0xfb,0x1b,0x67,0xa6,0xf2,0xb5,0xf4,0x02,0xa9,0x4b,0x2b,0x1f,0x7c,0xdb,0x58,0x96, +0x51,0xda,0x75,0x4a,0xb0,0xa0,0x5d,0x1b,0x2b,0x01,0x0c,0x9b,0x51,0x8b,0x3f,0xa3, +0x77,0x82,0xee,0xf4,0x31,0xb9,0xe5,0x03,0xe6,0x4c,0xea,0xc0,0x21,0x1b,0x7e,0xb3, +0xe8,0x08,0x32,0x7e,0x30,0x5a,0x20,0x67,0x60,0x57,0x5d,0xfe,0xd2,0xe7,0xd2,0xac, +0x2e,0x48,0x98,0x22,0x39,0xb8,0x96,0xde,0xc8,0x68,0x3a,0x8e,0xdf,0x4f,0x9a,0x18, +0x09,0x49,0xc2,0x8f,0xf8,0x26,0x3a,0x11,0xa8,0x2f,0x35,0x42,0x84,0x94,0x8c,0x7b, +0x2b,0x6f,0x43,0x51,0x03,0x2c,0xeb,0x21,0x17,0xc5,0x03,0xa9,0xd0,0x1c,0xce,0x8b, +0x89,0x0b,0xeb,0xdd,0x5b,0x24,0xaf,0xd3,0x8a,0xab,0x44,0x35,0xf7,0x2d,0x43,0x37, +0x76,0xf3,0x65,0xae,0xfa,0xd0,0xe8,0x4c,0xf4,0x93,0x6f,0xe7,0xe5,0x9c,0xcc,0xd2, +0x08,0xcd,0x9f,0xa2,0xfa,0xbe,0x23,0x1e,0xa0,0x42,0x23,0x58,0x68,0x7f,0x7c,0xec, +0x71,0x06,0xed,0xaf,0xee,0x92,0xd2,0x02,0xa2,0x0a,0xba,0x1e,0x3b,0x51,0x25,0xbb, +0x2c,0x4e,0xb0,0x33,0x7b,0x9e,0x5a,0x1f,0xef,0xe2,0x64,0x40,0x24,0xb2,0x04,0x80, +0x78,0xf8,0xbe,0x7b,0x36,0xc1,0x74,0x7c,0xad,0xdd,0x04,0xdb,0xa8,0x7f,0xde,0xb0, +0x26,0xe9,0xaf,0x3c,0xe9,0x02,0x6f,0x97,0x9e,0xdb,0xbf,0x56,0x91,0x60,0x4f,0x28, +0x82,0x11,0x94,0x81,0xc5,0xa9,0xce,0xa0,0x6e,0x5b,0xa7,0x8f,0x53,0x8e,0x02,0x1d, +0x24,0xe6,0x2c,0x39,0x2d,0x40,0xca,0x11,0x08,0x63,0x36,0xae,0x52,0xf6,0xbb,0xb2, +0xf4,0xcb,0xfb,0x4a,0xc3,0x02,0xc4,0x20,0x7a,0x69,0xff,0x0b,0x56,0xdf,0x76,0x4b, +0xd8,0x98,0xcf,0x27,0xb7,0xe8,0x5d,0xc6,0xc0,0x14,0x23,0x8a,0x5d,0xaa,0x85,0xc0, +0x2d,0x7a,0xfb,0xc3,0x20,0x3e,0x43,0xe7,0x73,0x99,0xad,0x65,0x0f,0x87,0x2e,0x2b, +0x23,0x77,0x28,0x2b,0x4a,0x61,0xa8,0x0f,0xfb,0x6a,0xe2,0x50,0x08,0xeb,0xc6,0x55, +0x4c,0x03,0x2d,0xf3,0xed,0x76,0x5c,0x35,0x9f,0xd5,0x05,0x52,0x5c,0xef,0x71,0x1a, +0xa1,0x11,0xfa,0x61,0x07,0x7b,0x9d,0xe7,0x2a,0x55,0x8b,0xc3,0xa1,0x76,0xf8,0xfb, +0x4f,0x04,0xf1,0xcb,0x1e,0x76,0xf3,0x8e,0xc9,0x7a,0x97,0xa0,0x0e,0x7a,0xd0,0xdb, +0xde,0xe3,0x8b,0x0e,0x45,0x28,0x09,0xdb,0xc8,0x4e,0xbd,0x42,0x01,0x74,0x86,0xc9, +0xa5,0x1f,0xb9,0xb6,0xa0,0xa3,0x40,0xee,0xfb,0x13,0x02,0xb6,0xeb,0x1f,0xa9,0x27, +0xca,0xcb,0xf4,0x82,0x84,0xb0,0xce,0x92,0xb7,0x52,0x3b,0x86,0xed,0x60,0x29,0xdc, +0x27,0x93,0x40,0x1e,0x19,0xf0,0x69,0x0b,0xfa,0x11,0xfe,0x6d,0x35,0x9e,0xb4,0xfd, +0x62,0x10,0xe0,0x33,0x5a,0xa3,0x6d,0xa3,0x77,0x50,0xba,0xbd,0xef,0xc2,0x20,0x02, +0x04,0xc0,0x7f,0xab,0x12,0x52,0x22,0x3a,0xd5,0xac,0x42,0xe0,0xf6,0xac,0x28,0x12, +0x05,0xc1,0xaa,0xeb,0x74,0x7a,0x32,0x12,0xd4,0xa5,0x4d,0x37,0x11,0xd5,0x21,0x1f, +0x84,0x82,0x58,0x41,0x60,0xee,0xe5,0x71,0x87,0x32,0xc1,0xf8,0x3b,0xa3,0x29,0x92, +0x85,0x83,0xa9,0x93,0xda,0x4e,0x31,0x23,0x26,0x09,0x19,0x39,0x59,0xee,0xcc,0xc8, +0xfd,0x74,0x4b,0xf7,0xb5,0x1b,0xd4,0x4e,0xad,0xa0,0x24,0x98,0xaf,0x87,0xc0,0x81, +0xf6,0x86,0xb6,0xb4,0x07,0x0e,0xcc,0x19,0xc9,0x84,0xd5,0xd3,0xce,0xe7,0x0f,0xa1, +0x33,0xc7,0xdb,0xff,0x65,0xe7,0x4c,0xe4,0x2d,0xc9,0x8e,0x1d,0xf8,0x79,0xd7,0x5a, +0x21,0x29,0x49,0x57,0x6a,0x56,0x00,0xdc,0xcf,0xe5,0x17,0x66,0x49,0xda,0x22,0x0a, +0x0c,0xc8,0xc2,0x4e,0xa2,0x23,0x12,0x2b,0x09,0x07,0x22,0xee,0x58,0x05,0x2a,0x1a, +0x0d,0xc9,0x42,0x21,0x9f,0x7d,0x3e,0x3e,0x0d,0xd9,0x06,0x1a,0xc5,0xad,0x23,0x8f, +0x8c,0x8a,0xa7,0xed,0x1b,0xff,0xdc,0x59,0x4c,0xba,0x23,0x80,0x2b,0xaa,0x66,0xdd, +0x8d,0x8b,0x58,0xef,0x8c,0xa4,0x7b,0x1b,0xcc,0xcf,0x1a,0x38,0x3c,0x8d,0x58,0x0d, +0xd4,0x33,0x1d,0x30,0x30,0x73,0x4c,0x6c,0x76,0x63,0x13,0x2e,0x12,0x71,0x3a,0x2d, +0x45,0xca,0x3e,0x04,0xd6,0xe9,0x04,0x7d,0xfe,0xc2,0x87,0x63,0xcc,0xe0,0x59,0xd1, +0x7d,0x53,0xcc,0xea,0x47,0x32,0xd3,0x18,0x42,0x9d,0x16,0x95,0x67,0xb8,0x05,0x29, +0x02,0x79,0x3f,0x0c,0x1b,0xd9,0x45,0x99,0x63,0xc0,0xc1,0x34,0x68,0x62,0x1e,0x60, +0x88,0x6e,0x64,0x87,0xaa,0x45,0x3c,0x08,0x85,0xb6,0x24,0xd4,0xa5,0xef,0x2c,0x6f, +0x25,0x1c,0x73,0x9e,0xb2,0xb6,0x88,0x58,0x84,0xb7,0x2b,0x49,0x80,0x92,0x5e,0x5d, +0x13,0x89,0xf0,0x03,0xbc,0xc4,0x81,0x4d,0x05,0xb4,0xeb,0x45,0xe4,0x0f,0xd5,0x9b, +0x7a,0x0c,0x05,0x35,0x6a,0xec,0x89,0xf9,0x2c,0x97,0x46,0xcd,0xdb,0x6c,0x1d,0xe5, +0x87,0x85,0x99,0xec,0xb2,0xf5,0x46,0xda,0x95,0xe9,0x11,0x1d,0x87,0xa2,0x52,0xd4, +0x6d,0xd1,0xec,0x1f,0x81,0xb5,0x07,0xfc,0xc4,0x68,0x7b,0x25,0xd4,0xab,0x1d,0x90, +0x05,0x89,0x94,0xc7,0x3f,0x81,0xd6,0x01,0x06,0x47,0x8e,0x8d,0x6c,0xe9,0x35,0xd7, +0xed,0xf3,0xfa,0xad,0x2b,0xb8,0x4f,0xcb,0x14,0x8a,0xc7,0xac,0x48,0x7a,0x78,0xa8, +0xf9,0x33,0x0e,0x3d,0xf4,0xcb,0x1f,0xe4,0xa5,0xbc,0x0d,0x35,0x8d,0xee,0x1e,0x6b, +0x00,0xe9,0x75,0x9c,0x42,0x39,0x10,0xbc,0xfc,0x85,0xd9,0x40,0x21,0x57,0xa2,0xd0, +0xc7,0x0a,0x07,0x9c,0x8a,0xde,0x9e,0x49,0x40,0xc6,0xbf,0xbe,0x0f,0x27,0x71,0x90, +0xad,0x30,0x47,0x3d,0x19,0x3c,0x11,0xbc,0x78,0x25,0xc7,0xd4,0x1c,0x27,0x5e,0x62, +0x8d,0xdd,0xc4,0x91,0xeb,0x00,0xd5,0x08,0x8e,0x60,0xdd,0x00,0x9f,0xe0,0xce,0xf3, +0xc4,0xd9,0x93,0x36,0x2d,0x40,0x4c,0xc3,0xbe,0xce,0x80,0x1c,0xca,0x2b,0x92,0xca, +0xac,0x33,0x9c,0xbc,0x1d,0xc2,0x46,0x09,0x72,0xd1,0x8a,0xcb,0x43,0x08,0x51,0xdc, +0x99,0x30,0x78,0x20,0x4a,0xdc,0x69,0x19,0x14,0xe2,0x77,0x1d,0x46,0x49,0x88,0xe2, +0xf1,0x89,0x33,0xbc,0xec,0x93,0xaf,0xc6,0x64,0x55,0x15,0x67,0x43,0x4c,0x69,0x41, +0xa2,0x40,0x88,0x90,0x15,0x30,0x70,0x37,0xc2,0x05,0x0e,0xd9,0xb8,0x5b,0x21,0x4b, +0xe1,0x06,0xae,0x6a,0x49,0xb9,0xb1,0x32,0x4c,0x4d,0x33,0x66,0x60,0x20,0xb4,0x8e, +0x6a,0x0c,0xae,0xbd,0xb3,0x22,0xd9,0x21,0x57,0x01,0xdb,0xce,0x38,0x50,0x08,0x44, +0x8b,0xca,0x88,0x40,0xbb,0x4a,0x2e,0x20,0xeb,0xf5,0x6e,0xe1,0xa5,0xc9,0xa2,0x41, +0x69,0xa8,0x4c,0x27,0x65,0xaa,0x27,0x88,0x43,0xe4,0x0e,0x0a,0x21,0xca,0x81,0x74, +0x16,0x2a,0xff,0xf8,0x71,0x2d,0x57,0xd0,0x2b,0x1c,0x42,0xe0,0xaa,0xc9,0xde,0x77, +0x6e,0x65,0xd1,0xcc,0x7a,0xd4,0x61,0x8e,0x32,0x05,0x0b,0xb2,0x3a,0x84,0xbb,0x96, +0x0d,0x07,0xc7,0xe4,0x67,0xe5,0x10,0xa6,0x4e,0xc8,0x3e,0xb7,0x5b,0xca,0x33,0x82, +0x40,0x06,0xce,0x98,0x75,0xff,0x20,0xdd,0xa8,0x2f,0xe5,0x4f,0x63,0x05,0x3e,0x92, +0x8d,0x05,0x2f,0x9f,0x9c,0x20,0xf2,0xad,0x88,0x1c,0xad,0xe4,0xb8,0xb5,0x9b,0x73, +0xa8,0xfb,0xd4,0x09,0x9f,0x0b,0xaf,0x6a,0x45,0xe7,0xfc,0x7d,0xdd,0x47,0x3c,0xed, +0xe3,0x0f,0xd4,0x2e,0xe5,0x81,0xc4,0x11,0xa3,0x7f,0xb4,0xc8,0xb3,0x4f,0x1a,0x66, +0x77,0x16,0x31,0x7b,0xba,0x41,0x71,0xb8,0x57,0x0f,0x0b,0xf8,0x37,0x8c,0x87,0xba, +0xe8,0xa3,0x10,0xc9,0xf6,0xff,0x4b,0xe9,0xcc,0xaf,0x13,0x58,0x97,0x66,0xcf,0x07, +0x2f,0xe2,0xad,0xe8,0x72,0xec,0xcd,0x77,0x22,0xfc,0x1b,0x48,0xa9,0x67,0x6d,0x63, +0x04,0xdd,0x27,0x25,0xec,0x73,0x15,0x50,0x64,0x36,0x14,0xe7,0xb7,0x32,0x0d,0xe6, +0xd6,0x01,0xd5,0x90,0xe4,0x74,0xf8,0x56,0x02,0xd1,0xe2,0x08,0xf8,0xbf,0x7e,0x89, +0x45,0xad,0xbb,0x25,0x44,0xc3,0xed,0xa9,0x83,0x32,0x03,0x57,0x9a,0xe1,0xb7,0x6e, +0x85,0x9e,0x33,0x10,0x64,0x51,0xc1,0x83,0x89,0x17,0x9b,0x04,0x18,0x29,0x0c,0x50, +0x24,0xf5,0x57,0x37,0x4a,0x51,0x94,0xd5,0x81,0xf7,0x14,0x23,0x9b,0x97,0x9f,0x97, +0xca,0xa6,0xc0,0xe5,0x92,0xca,0x5c,0x83,0x19,0xf4,0x1c,0xc1,0x3e,0x7d,0x3f,0x70, +0xd0,0xb9,0xfd,0x36,0xc6,0x9b,0x06,0x12,0x94,0x8d,0xb3,0x55,0x1b,0x15,0xaa,0x22, +0xaa,0xba,0xf3,0x95,0xb5,0xd6,0x94,0x02,0xea,0x8a,0x5f,0x71,0x9f,0x7d,0xe2,0x72, +0x4b,0x38,0xef,0x66,0xd3,0xbb,0x68,0xae,0x81,0x57,0x84,0xad,0x87,0xf5,0xea,0x66, +0x4a,0x79,0xd8,0xef,0x53,0x55,0x8e,0xcb,0x3e,0x52,0xcb,0xdc,0x33,0x17,0xe3,0x72, +0xcb,0x5a,0x24,0x28,0x59,0x95,0x41,0xae,0x03,0x3e,0x57,0x98,0x81,0xd7,0xeb,0x66, +0x8d,0x86,0xed,0x95,0xb8,0x7b,0x9f,0xda,0x26,0x19,0xfd,0xbc,0xfa,0x3b,0x15,0x56, +0xc1,0x14,0x55,0x32,0x96,0x31,0x00,0x50,0x81,0x54,0x16,0xf9,0xe9,0xdc,0x14,0xdc, +0x43,0xae,0xa8,0xe0,0xd2,0x8c,0x16,0x9a,0x0a,0x7d,0x84,0xfd,0xd8,0x88,0x7b,0xf0, +0xe2,0xbd,0x38,0x0a,0x53,0x4d,0x6b,0xd0,0xec,0xbf,0x81,0xce,0xe1,0x3f,0x31,0x60, +0x4a,0xbc,0xd5,0xdf,0x08,0x92,0x07,0xfd,0x42,0x31,0x88,0xc3,0x89,0x3d,0x1b,0x45, +0x0a,0x1f,0x8c,0xff,0x04,0xe2,0x48,0x71,0xc8,0xdc,0x5a,0x55,0x2e,0x11,0xec,0xec, +0xf8,0xe3,0x88,0x0a,0x13,0x40,0x8c,0x61,0xc9,0x6d,0xff,0x27,0x3f,0xa3,0x1e,0x86, +0x7f,0x5f,0x37,0x90,0xef,0xc2,0x1f,0x25,0x55,0xcd,0xcf,0x9a,0x21,0xe6,0xd6,0xd9, +0x2e,0xc2,0x4a,0xee,0xd9,0xe1,0x41,0x60,0x49,0xdf,0x2f,0x04,0xd3,0x02,0xa4,0x1c, +0x08,0x9a,0xfa,0x44,0xa5,0x79,0x67,0x91,0x4f,0x59,0xe0,0xe2,0x3a,0x31,0x38,0xcd, +0xec,0x86,0x68,0x35,0x98,0x88,0x22,0x8c,0x2f,0x76,0x00,0x7e,0xbe,0x06,0x18,0xbc, +0x0b,0x2b,0xfb,0x45,0x04,0xae,0x51,0x4f,0x8e,0x65,0xb9,0x72,0x3f,0x25,0x57,0x6e, +0x51,0x28,0xc6,0xd3,0xfb,0xad,0x07,0xca,0xa4,0x38,0x01,0x9f,0xec,0xaa,0x1b,0x6a, +0x50,0x75,0xa6,0x4d,0x44,0xea,0x1c,0x2c,0xdd,0x89,0x29,0xaa,0x30,0x74,0xfe,0xe4, +0xf4,0xea,0x6a,0x1f,0x94,0x12,0x00,0xbd,0xea,0xd9,0xa8,0xc0,0xa2,0x44,0x8f,0xae, +0x73,0x57,0x35,0x98,0xe7,0x0a,0x5b,0x2c,0x4f,0x8e,0xfb,0xbb,0x35,0xb0,0x54,0x61, +0xa3,0x14,0xaa,0x9b,0x99,0xba,0x61,0x3a,0x43,0x84,0xea,0x78,0x03,0xe3,0xf5,0xce, +0x62,0xf7,0xda,0x3e,0x16,0xa7,0x24,0xd2,0xa5,0x5f,0xf0,0x88,0x58,0x0d,0x54,0x93, +0x4d,0x32,0x3d,0x6f,0xbe,0x52,0x46,0xbd,0xa6,0xfe,0x4d,0xc7,0xab,0x7e,0x5d,0xe3, +0xaf,0x5c,0x63,0x2c,0x11,0x03,0x4d,0xc3,0xed,0x8e,0xbb,0xeb,0x92,0xf0,0x55,0xf2, +0x02,0x39,0xd5,0xe3,0x99,0x4e,0x23,0x7f,0x66,0xa1,0x3b,0xa6,0x0d,0xeb,0xde,0x8a, +0xdd,0x5f,0x80,0x4d,0x57,0x4f,0xfb,0x2b,0xb0,0x43,0x98,0x70,0x9d,0x43,0x93,0x64, +0x01,0x0c,0x92,0x27,0xd7,0xa1,0xaa,0x41,0x53,0xb4,0x82,0x0e,0xb7,0xf1,0x24,0xfd, +0x43,0x82,0xdb,0x3b,0x5f,0x41,0x92,0x1a,0xe2,0x33,0xd3,0x6b,0x1f,0x01,0x55,0xb4, +0x5c,0x9c,0xad,0xd7,0xb1,0x9f,0x05,0x40,0xdb,0x7e,0xc3,0x0b,0x7c,0x3d,0x37,0x31, +0x54,0xd6,0x35,0xb6,0xb6,0xa2,0xb4,0xd7,0x0a,0x96,0x7b,0x87,0x52,0x01,0x52,0x1b, +0x65,0x6a,0x39,0x49,0xc2,0x3c,0xbc,0xc7,0x93,0xdf,0x2c,0xca,0x71,0xdd,0xf3,0x99, +0xa5,0x04,0xed,0xbe,0x39,0x1b,0xe3,0x5b,0xe7,0x06,0x6b,0x95,0x01,0x7d,0x53,0x7a, +0x2a,0x61,0xcd,0x3d,0x5e,0xe4,0xfb,0x80,0x81,0x98,0x45,0x88,0x54,0x7c,0x92,0xf4, +0x8f,0xfd,0x4c,0x0c,0x74,0x53,0xff,0x45,0x5b,0xd8,0xb0,0x1f,0x7a,0x19,0xd6,0x92, +0xd4,0xd6,0x08,0xbd,0x81,0x9c,0x41,0x42,0x6d,0x9b,0x61,0xcd,0x4f,0xf0,0x98,0x69, +0x88,0x07,0xb1,0xed,0x93,0x9f,0x84,0x13,0x10,0x69,0x81,0x51,0xfa,0x1b,0x2e,0xe5, +0x0a,0x8b,0x04,0xbc,0x1a,0x97,0xbf,0x93,0x31,0xe8,0xbc,0x78,0x3f,0xdb,0x2e,0x4e, +0x28,0x7d,0xfc,0xcc,0xac,0xb4,0x77,0x99,0x00,0x93,0xd6,0xd2,0x78,0xd4,0x08,0x16, +0xc4,0xb5,0x2a,0x24,0xc2,0xdf,0xa8,0x69,0x0d,0x70,0x79,0xc3,0x80,0x2d,0xc6,0x8c, +0x47,0x2d,0x2c,0xb1,0x1a,0x53,0x4b,0xd0,0x61,0x73,0x4c,0x9d,0x5d,0x75,0x51,0x63, +0x6d,0x9f,0x90,0xac,0xc7,0xfa,0xab,0x7f,0x83,0x37,0x0c,0xf3,0x4e,0xbe,0x3a,0xf3, +0x30,0xbf,0x91,0x08,0x16,0x11,0x2a,0xc8,0xc7,0x0f,0x6f,0x5a,0x82,0xbf,0xcc,0x63, +0x20,0x63,0x4e,0xc3,0x91,0x20,0x41,0xf3,0xe4,0xbe,0x74,0x4b,0x8b,0xea,0x3f,0xdc, +0x24,0xef,0x41,0xc5,0xd8,0x60,0x50,0xc7,0x40,0x60,0xa6,0x0c,0xa3,0x62,0x77,0x38, +0x68,0x2a,0xd0,0x67,0xf2,0x63,0xf5,0xaa,0xc0,0xe3,0xb9,0xdf,0xa4,0x75,0xc0,0x86, +0x28,0x07,0x99,0x47,0xb3,0xdb,0x09,0xb6,0xe5,0x05,0x32,0x17,0x0d,0x2b,0x10,0xf4, +0x30,0x6f,0xc9,0x2b,0xb4,0x64,0xa7,0x0e,0x6d,0x9a,0x48,0x0f,0x9b,0x3f,0x15,0x89, +0x6b,0x6c,0x75,0x27,0x4f,0x69,0xaa,0x1e,0xaa,0x4b,0xd0,0x16,0xf3,0x29,0xf1,0xb1, +0xfb,0x45,0x74,0xaa,0xe4,0x27,0x03,0x11,0xbf,0xe8,0xa1,0x47,0x2c,0x0b,0x1a,0x19, +0x63,0x19,0x7a,0x0e,0x46,0x6a,0xad,0xb3,0xef,0x4c,0x9a,0x20,0x6b,0xc6,0x1d,0x1d, +0x2b,0x58,0x32,0x2d,0x29,0x66,0xe2,0xd0,0xc2,0x04,0x22,0x84,0xd9,0x7b,0x07,0xf0, +0x8c,0x09,0x45,0xda,0xab,0xa7,0x11,0x5b,0xfb,0x64,0x2b,0x14,0x7f,0x78,0x08,0x5e, +0xba,0x17,0x33,0xda,0x5b,0x0b,0xf7,0xab,0xdd,0x43,0x37,0x4f,0x13,0x5a,0x84,0x1c, +0x0b,0x4c,0x7a,0xb6,0x0a,0x61,0xf2,0x98,0xe2,0x9f,0xec,0xc1,0x84,0x93,0x8a,0xcd, +0x65,0x63,0x31,0x7b,0xba,0x43,0xee,0x1a,0xf4,0xe0,0x6c,0x1c,0xf8,0x90,0x63,0xf0, +0xb9,0x80,0xbc,0x49,0x92,0x02,0x2d,0x6e,0x6b,0x11,0xed,0xc1,0xfe,0x68,0xf4,0xca, +0xaa,0xa2,0xad,0x1c,0x72,0x27,0x8e,0x48,0x6a,0xb0,0x6f,0x9f,0xa8,0x8a,0x14,0xbd, +0x67,0x0b,0xdb,0x6c,0xec,0xfd,0x10,0x84,0x40,0x21,0xc2,0x4c,0xac,0xbd,0x74,0x81, +0xc1,0x90,0x73,0x6f,0xbe,0x9c,0x0c,0x98,0x0c,0x13,0x23,0x2f,0x12,0x75,0x8b,0xe7, +0x5f,0xb9,0x41,0x00,0xf3,0xc1,0x97,0x81,0xc2,0x32,0x39,0x20,0x0b,0x1e,0x0b,0x6f, +0x92,0x99,0x45,0x0e,0xd2,0x37,0x17,0x5a,0x08,0x39,0xe4,0xc9,0x63,0x79,0x84,0x55, +0x4c,0x78,0x9d,0xde,0x97,0xc2,0x32,0x02,0x46,0x59,0xc4,0xd6,0xba,0x7b,0x76,0x43, +0x7c,0x57,0x5b,0x32,0x21,0x78,0x6f,0xdc,0x2b,0x04,0x96,0xe9,0x57,0x88,0x7f,0x52, +0x83,0xa9,0x55,0xbb,0x4d,0x7b,0xae,0xc6,0x43,0xe9,0x42,0x16,0xd0,0x4b,0x8b,0x3d, +0xa0,0xd7,0x9f,0xd5,0x14,0x76,0x07,0xb1,0x93,0xf8,0xca,0x06,0x77,0xfa,0xbe,0x72, +0xa7,0xce,0xff,0xfd,0x33,0x2e,0x4e,0xe9,0x5b,0xf3,0x12,0x5d,0x0d,0x3b,0xb6,0x5f, +0xeb,0x39,0x69,0x63,0xd8,0xbf,0xe1,0xc6,0x4b,0xb4,0x0b,0xb8,0x70,0x1d,0x0f,0x91, +0x9b,0x54,0xcf,0x90,0x35,0xb7,0xaf,0x57,0xf8,0x17,0xc7,0x85,0xb0,0x7b,0x47,0xbd, +0xca,0x3b,0x8f,0x19,0xff,0x64,0x99,0xfe,0x08,0xad,0x33,0xce,0x8c,0xdd,0x86,0x5d, +0xe6,0xb7,0x39,0x30,0x3a,0x7e,0xf6,0x9a,0x08,0x78,0x05,0x1f,0xf6,0x3d,0x16,0xc8, +0x40,0xe4,0xd9,0x2f,0x43,0xb0,0xe5,0x07,0x9f,0x0c,0x21,0x14,0xe1,0x30,0xdc,0xc5, +0x43,0xc7,0xc3,0x8e,0x4f,0x9f,0x29,0xee,0x13,0x51,0xb7,0xef,0xdd,0x73,0xcf,0xfd, +0x26,0xb2,0x99,0xe5,0x50,0xae,0x59,0xd5,0x88,0x57,0x24,0xba,0x25,0x3e,0x98,0x91, +0x34,0xcf,0xa8,0x86,0xf5,0xef,0x32,0xe4,0x38,0x4d,0xcf,0x54,0x96,0xe0,0xd0,0xfa, +0xc8,0xcc,0xbd,0x92,0x16,0x61,0x61,0xf1,0xe0,0x60,0x3f,0x71,0x66,0x4f,0x60,0x65, +0x46,0x82,0xf1,0x2f,0x88,0xe0,0xc9,0x83,0xb8,0x90,0x71,0xb2,0xe3,0xe8,0x28,0xb3, +0x68,0x81,0xf7,0x6a,0xd5,0xef,0x28,0xd5,0x2c,0xa9,0x01,0xa4,0xed,0xac,0xaf,0xc6, +0x48,0x7f,0xfa,0x44,0xa5,0x79,0x4e,0xce,0x68,0x1b,0xaf,0x06,0x3d,0x27,0xce,0xa3, +0x72,0xc6,0x44,0x25,0x10,0x03,0xd8,0x82,0xef,0x16,0xe3,0x9e,0x45,0xa8,0x69,0x4b, +0x80,0x64,0xfb,0x45,0x04,0xe7,0x2b,0x03,0xba,0x69,0x71,0x43,0x37,0x49,0x49,0x7b, +0x08,0x7a,0xf1,0x24,0xc8,0x2e,0x07,0x74,0x66,0x86,0x99,0x69,0xac,0xe8,0x72,0x33, +0x08,0xc6,0x76,0x2a,0x3c,0xb9,0x2a,0x2e,0xad,0x87,0xf3,0x48,0x9e,0xe8,0x84,0xea, +0x05,0xc6,0x3f,0x1a,0x35,0x27,0x58,0x32,0x4c,0x09,0x84,0x42,0x7e,0xfb,0x30,0xcd, +0xf4,0x91,0x23,0x2e,0x5f,0xa9,0x6a,0xe8,0x69,0xa4,0x4b,0xde,0xa9,0xba,0x2a,0xeb, +0xfd,0xc4,0x6b,0x8a,0xd8,0xa1,0x01,0xdd,0xa6,0x32,0xb7,0xf3,0xdb,0x09,0x04,0x63, +0x6d,0x88,0xc2,0xa4,0xf7,0x86,0xde,0x82,0x9a,0x81,0x92,0x70,0x74,0xe1,0x6c,0xde, +0x41,0x69,0xb3,0xdd,0xba,0x72,0x60,0x78,0xa4,0xc2,0x6a,0x1c,0xe4,0x61,0x1a,0x37, +0x1c,0x86,0xf9,0x4d,0x0c,0xef,0x15,0xaf,0x27,0xe4,0x93,0x71,0x4a,0xe1,0x4b,0xca, +0xbc,0x01,0xea,0x98,0x3a,0x50,0x3a,0x1d,0xae,0xcb,0xb1,0x62,0xb4,0xe0,0x04,0x16, +0xd5,0x3b,0xac,0x83,0x14,0x61,0xcb,0xd0,0xb2,0x0f,0xa5,0x55,0x01,0x9e,0x2a,0x6c, +0xd8,0xff,0xca,0xbe,0xde,0x68,0x02,0x73,0x63,0x33,0x82,0x6b,0x73,0x13,0x5d,0x92, +0x44,0x13,0xe8,0xc0,0x5d,0x6b,0x99,0xdc,0x2e,0x98,0x8b,0x63,0x3e,0xfb,0xce,0xd3, +0xbf,0x88,0xf5,0x93,0x32,0x90,0xe2,0x73,0xa5,0x06,0xb2,0x77,0xbd,0xb1,0xac,0x51, +0x07,0x39,0x08,0xb5,0x4e,0x32,0xe7,0x11,0xe2,0x59,0xcc,0x1a,0x76,0xe8,0x24,0x43, +0x21,0x57,0xec,0xf2,0xb5,0x99,0xec,0x0c,0xcb,0xd8,0xc4,0x09,0xd2,0x03,0xaa,0x47, +0xe8,0x2e,0x1a,0xb4,0xc6,0x30,0x27,0xe0,0x0d,0xb2,0xca,0xad,0xe6,0xb7,0x95,0x13, +0xa5,0x8c,0xe2,0xb5,0x40,0xd2,0xd1,0x60,0x99,0x28,0x02,0x7f,0x52,0x71,0xce,0xec, +0x4d,0xb8,0xf6,0x2f,0x15,0xfa,0x7a,0x95,0x6b,0xc3,0x74,0x48,0x7f,0xc8,0xd6,0x12, +0x88,0x38,0x16,0x64,0x2d,0xf4,0x76,0x3e,0x98,0x96,0x12,0x2d,0x4d,0x56,0x3f,0x87, +0xcf,0xda,0x61,0x3e,0x8f,0x34,0x5e,0x2f,0xaa,0x65,0x89,0xd3,0xdd,0x5a,0x3e,0x7d, +0x2d,0xa9,0xd0,0xd8,0x40,0x0d,0x3e,0xc4,0x4a,0xd8,0x24,0xcc,0x88,0xf0,0x8c,0xac, +0x46,0x8d,0xde,0x31,0x1a,0xa7,0xcd,0x79,0x18,0x03,0xf6,0x10,0xf1,0x41,0x68,0x9a, +0x3f,0x36,0xd6,0x81,0x98,0xad,0x64,0xf8,0xdc,0x80,0x9e,0xfc,0x02,0xf0,0x9f,0xad, +0x23,0x18,0xec,0xad,0x41,0xdb,0x9b,0x84,0x30,0x03,0x10,0x95,0x28,0xbf,0xf0,0xde, +0x8b,0x12,0x50,0x39,0x9b,0xa4,0x65,0xf9,0x7d,0x9e,0x00,0x03,0xff,0x64,0x00,0xf9, +0x14,0x42,0xc3,0x86,0x9d,0x6a,0x2a,0xc8,0xda,0x0f,0xc9,0x75,0x56,0x10,0x36,0x38, +0x69,0x0c,0x44,0x72,0x32,0x03,0xac,0xd2,0x65,0x47,0x23,0xd6,0xfd,0x9c,0x05,0x42, +0x0f,0x43,0xb9,0xe5,0xd6,0x39,0x71,0x62,0xb8,0x4d,0xd1,0xa1,0x80,0xa9,0x1b,0xba, +0x6a,0x47,0xd0,0x30,0x34,0x28,0x35,0x7a,0x60,0xc3,0xe1,0xdd,0x98,0x2e,0x43,0x48, +0xa3,0x9b,0xa0,0x03,0x15,0x2b,0x68,0x9f,0xcf,0xe9,0xd6,0x22,0x38,0x9f,0x4b,0x99, +0x05,0xbf,0x64,0x90,0xb2,0x2c,0x3a,0x70,0x42,0x57,0x60,0xa4,0x0f,0x9a,0xf5,0x23, +0x79,0x44,0x7e,0xa5,0x88,0x20,0xc2,0xfe,0x2b,0xf7,0x2e,0x41,0xe1,0xa1,0x02,0x4f, +0xbf,0xf3,0x0d,0xd7,0x16,0x77,0xb1,0xec,0xc5,0xd7,0x02,0x75,0xe0,0x13,0x38,0xb8, +0x8d,0xa7,0x06,0x08,0x4b,0x5c,0x6a,0x4a,0xc5,0xce,0x6b,0x24,0xfd,0x17,0x1c,0x7a, +0x69,0xe7,0x32,0x8c,0xbe,0x2d,0x24,0x61,0xee,0x59,0xc8,0xc3,0xae,0x07,0xa7,0x2d, +0x61,0x1b,0x6b,0x90,0xab,0x4b,0x93,0x0d,0xfb,0x12,0x81,0x4b,0x27,0x37,0x75,0x1f, +0x68,0x88,0x8d,0xf5,0xb5,0xa0,0x25,0x65,0x6e,0x0a,0xfb,0x7e,0x88,0x66,0x51,0xcc, +0x5a,0xce,0xfa,0x5c,0xb9,0x21,0x1f,0xec,0x1a,0x5c,0x6a,0x96,0x4a,0x21,0x35,0xdc, +0x17,0x54,0xc9,0x2e,0x99,0x41,0x22,0xfc,0x57,0x14,0x61,0xd9,0x91,0x60,0x7b,0xb3, +0x26,0x03,0x2f,0xdf,0xd2,0x26,0xe8,0x8b,0x66,0xb3,0xac,0xe9,0xd2,0x42,0x8b,0x80, +0xd8,0xdb,0x03,0xbf,0x1b,0x0f,0x9b,0x61,0x8d,0x92,0xa4,0x87,0xe8,0xef,0xd5,0x31, +0x83,0x51,0x63,0xc4,0x34,0x1c,0xeb,0xd2,0x4e,0x8f,0xec,0x83,0x8d,0x7f,0x6e,0x0c, +0xa3,0x3d,0xd4,0x90,0xb8,0xb4,0xa8,0xcf,0xc2,0x10,0x9d,0xd2,0xce,0xf0,0x65,0xc2, +0xf1,0x1f,0xb4,0x01,0xe0,0xfc,0x85,0x5e,0x15,0x5d,0xcc,0xed,0x55,0x2d,0x80,0xf3, +0x63,0x13,0xb7,0x6e,0x4d,0x22,0x22,0x4d,0xe1,0xf2,0x23,0x4a,0x44,0xf0,0x55,0x22, +0xcb,0xec,0xd4,0x59,0x66,0x99,0xab,0x08,0xe6,0x99,0x2b,0x23,0xec,0xa9,0x44,0xe1, +0x17,0x57,0x6c,0xa2,0x10,0x25,0xe7,0x12,0xe4,0xa7,0x83,0x92,0x80,0x65,0x37,0xc5, +0xbe,0x9d,0x09,0x25,0xea,0x2d,0xae,0x9c,0xc3,0xd6,0x34,0x25,0xb4,0x6d,0xcc,0xb2, +0x02,0x9f,0x94,0xf0,0x16,0x3e,0x04,0x34,0x46,0xa8,0x65,0x0e,0x0e,0xc1,0x96,0x0a, +0xa8,0xa0,0x46,0xb5,0x08,0x3e,0xc3,0x57,0x9d,0xfb,0x69,0x52,0xfa,0x54,0x9e,0x1a, +0xa0,0x61,0x3a,0xe3,0x9a,0x82,0x08,0x90,0xda,0x14,0xa6,0x47,0xf6,0x8f,0x3f,0x59, +0xa4,0xe5,0xab,0xc0,0x4d,0x35,0xc6,0x8d,0x8b,0xf0,0x98,0xcf,0x0b,0x1f,0x37,0x67, +0x05,0x16,0x8b,0xa2,0x89,0x79,0x8f,0x46,0x1c,0x14,0xa4,0x23,0xf8,0x89,0x66,0x2a, +0x62,0x4d,0x42,0x48,0x6d,0xdf,0x4c,0xe9,0x4b,0x8c,0xed,0x9c,0xfa,0x63,0xcf,0x9f, +0xd6,0x12,0x33,0x30,0x3b,0x90,0x46,0xc9,0x82,0xd7,0xd6,0x7d,0x59,0xde,0x27,0x8a, +0xb7,0x5c,0x57,0x25,0x58,0x73,0x37,0xae,0xed,0x53,0x6c,0x9d,0x7a,0x68,0x2f,0x9a, +0xf2,0x5d,0x40,0x3d,0xf7,0x24,0x07,0xe9,0x02,0x6e,0x5c,0x15,0x49,0x32,0x88,0xf1, +0x88,0xc1,0x24,0xe0,0x7f,0xf1,0x4e,0x25,0xe5,0x6f,0x57,0xa4,0xdd,0x98,0x28,0x2c, +0x33,0x74,0x96,0x4b,0x74,0x81,0x6a,0x16,0xd8,0x3c,0x78,0x3b,0x60,0x5d,0x1f,0xcf, +0x7f,0x19,0x26,0x75,0x7f,0x93,0xe5,0x04,0x65,0x6d,0x89,0xb9,0xd5,0x70,0xfc,0x17, +0x8d,0xed,0xf1,0x13,0x1c,0xb6,0x94,0x7d,0x30,0x9f,0x04,0x6c,0x04,0xbe,0x77,0x5d, +0x72,0x31,0xda,0xc4,0x93,0xf4,0x08,0x45,0xbb,0xcb,0x30,0x76,0x0c,0xff,0x7b,0x6c, +0x3b,0xc7,0xd0,0x27,0x27,0xac,0x21,0x74,0xa2,0x87,0x40,0x8d,0xd8,0x13,0xf2,0x79, +0xfe,0x73,0x99,0xc5,0x1b,0xcc,0x77,0x4b,0x6e,0xf5,0xd9,0x01,0x25,0xf6,0xf6,0x76, +0x7a,0x8e,0xef,0x24,0xa7,0xa8,0xf8,0xb8,0x3a,0xc8,0xc2,0xe9,0xd4,0x07,0xd9,0x75, +0x64,0x85,0x9c,0xcb,0x3f,0xe8,0x08,0xc1,0xff,0x89,0x99,0xaa,0x54,0xc4,0x0c,0xd6, +0xae,0x0c,0xbb,0xf6,0x8f,0xe4,0x95,0xd8,0xe1,0x34,0x07,0xa1,0xa2,0xb4,0xdc,0x75, +0xa8,0x37,0x8f,0x25,0x7d,0x05,0x8b,0xd4,0xdc,0x87,0x73,0x37,0xbb,0x86,0x3d,0xb6, +0x72,0x26,0x54,0x6c,0xad,0xc7,0x43,0x1f,0xad,0x4b,0x58,0xbd,0x54,0x93,0xbc,0xce, +0x5e,0x42,0x0a,0xd3,0xff,0xaa,0x4c,0x43,0x0f,0xc8,0x5e,0x15,0xc0,0x71,0x30,0x1a, +0x67,0xdc,0x2d,0x5b,0xf6,0xbc,0xfe,0x3f,0x7f,0xcf,0x01,0x5a,0x6c,0x86,0x7b,0x37, +0xc6,0xbf,0xc7,0x13,0x3d,0xad,0x0d,0x43,0x33,0xc7,0x12,0x2f,0xd2,0x15,0xab,0x57, +0x26,0x22,0x93,0xff,0x99,0x2d,0x1b,0x38,0xda,0xc2,0x43,0x81,0xcf,0xa2,0xdb,0xa6, +0xdb,0x9d,0xb3,0xae,0xb6,0x9c,0x35,0xdd,0xc3,0x91,0x74,0xbe,0x35,0xfa,0x80,0x0d, +0xd4,0x17,0x13,0x74,0xc9,0xa0,0x9c,0x41,0xe9,0x4c,0x43,0xd8,0xa7,0x2e,0x5e,0xa4, +0x05,0x2d,0xaa,0xf9,0x17,0xd7,0x4b,0xa5,0x05,0x51,0x74,0xe0,0x49,0x44,0x2d,0xb7, +0x6f,0xf0,0x6d,0x07,0x41,0xf1,0x45,0x97,0x67,0xf7,0xe4,0xe6,0xf3,0x83,0xe5,0x85, +0xdb,0x9b,0x6b,0xa0,0x81,0xa4,0x6c,0x7b,0x6b,0xc5,0xf6,0x17,0xd5,0xe4,0xed,0x19, +0xda,0x9a,0xb5,0x3e,0xab,0xf8,0x44,0x0c,0xa6,0xb7,0x84,0xf4,0x73,0xb9,0xa5,0xdb, +0x61,0xd4,0x5d,0x28,0xb0,0xce,0x7d,0x61,0x66,0x7d,0xc7,0x65,0x77,0xa6,0x6b,0xff, +0xef,0xc6,0x96,0xdf,0x12,0x08,0xb9,0x23,0xeb,0xd4,0xab,0x1f,0x19,0xba,0x18,0x2e, +0x4d,0x9c,0x23,0xe2,0xb1,0x3e,0xbd,0xc8,0x4d,0x98,0xf6,0xf5,0xc1,0x44,0x96,0x60, +0x3d,0xd4,0xe6,0xd2,0xb0,0xfb,0x00,0x7f,0x4e,0xf8,0xba,0x79,0x88,0xf6,0x5e,0xaf, +0x9f,0x82,0xe2,0xf1,0x7e,0xba,0x0b,0x12,0x69,0x28,0x9c,0xc1,0x2d,0xb8,0x50,0x9f, +0xa5,0xf5,0xac,0xcf,0xbe,0x0b,0x66,0xbd,0x08,0xd0,0x0b,0xc0,0x5e,0xb9,0x06,0xc8, +0x61,0x91,0x4a,0x4a,0x23,0xb8,0x4e,0x6e,0x61,0xcd,0xf4,0x1f,0xdd,0xec,0x89,0xa9, +0x13,0x1b,0xd5,0x50,0x3c,0xed,0x24,0xfb,0xcc,0x91,0xbe,0xef,0x79,0xcf,0x98,0x8c, +0x47,0x0f,0xef,0xc2,0x47,0xc8,0x0f,0x69,0x63,0x94,0xc5,0x10,0xda,0xfd,0x6f,0x1b, +0xf7,0xfa,0xb6,0x64,0x1a,0xb4,0xb8,0xf9,0xa7,0x52,0xd4,0xb9,0xfd,0xbe,0x50,0x29, +0x58,0x42,0xe0,0x47,0x89,0x2f,0xdb,0x11,0xfc,0xda,0xe9,0xa6,0xd5,0xba,0x49,0x63, +0x70,0x86,0x70,0xfc,0x26,0x63,0xc7,0x12,0x36,0x14,0xd7,0x56,0x87,0x69,0x48,0xc9, +0xa0,0x72,0xd8,0xf0,0x37,0x32,0xa0,0xec,0x21,0xfd,0xa9,0xba,0x52,0x2e,0x89,0x15, +0x01,0x21,0x0c,0x16,0x1e,0x38,0xd9,0xe5,0x83,0x2d,0x9f,0x47,0x53,0x4f,0x1f,0x20, +0x71,0x21,0x44,0x58,0x14,0x74,0x48,0x4c,0xab,0x2e,0x28,0x40,0x54,0x14,0x36,0x90, +0x81,0x69,0x14,0xa0,0x53,0xa8,0x66,0xb5,0x60,0x25,0xb9,0x53,0xf2,0x9a,0x81,0x81, +0x75,0x8b,0xb1,0x05,0x8a,0x3d,0x33,0x60,0xc1,0xc7,0xbb,0xa5,0xd6,0x42,0x50,0xb3, +0x85,0xc6,0xa9,0x17,0x6e,0x28,0xe6,0x11,0x8b,0x44,0x62,0xb2,0x0d,0x6f,0x12,0x0d, +0x04,0x4a,0x64,0x88,0x0c,0x4f,0x4b,0xaa,0x4e,0x18,0xbf,0xce,0x5e,0x22,0xca,0xdd, +0x29,0x08,0xd2,0x18,0x9c,0xfb,0xfe,0x5e,0xbe,0x59,0x5a,0xc0,0x57,0x2b,0xcf,0x9b, +0x0d,0x6a,0x8b,0x19,0x71,0x40,0xe7,0x69,0xe0,0x51,0x29,0xa9,0x93,0x27,0x1e,0x0d, +0x8f,0x91,0xeb,0x1f,0xe4,0x26,0xa3,0xc6,0xfa,0x3f,0xdc,0x61,0x38,0x6d,0x04,0xcc, +0x0c,0xe5,0x9b,0xa9,0xff,0xa6,0x44,0x6c,0xc2,0x56,0x52,0x6f,0xc8,0x77,0x12,0x49, +0x2b,0xdf,0xd2,0x59,0xe5,0xad,0x42,0x7d,0x78,0xd6,0xfe,0xf6,0x7b,0xac,0xeb,0x7d, +0x63,0xf6,0x44,0xb2,0xfb,0x6e,0x0a,0x6f,0x2f,0xb1,0xe7,0x0b,0xfb,0x2e,0xcb,0xaa, +0x84,0x14,0x49,0xdf,0x1a,0xd2,0xa3,0x0a,0xc4,0xc6,0x5b,0x7e,0x49,0x2d,0x15,0x04, +0x40,0x6f,0x98,0x00,0x2c,0x08,0x6c,0xd2,0x8b,0xa8,0xf4,0xa6,0x25,0x7d,0x17,0x22, +0x61,0x63,0xd5,0xf2,0xef,0x23,0x1d,0xd6,0x52,0xea,0xd6,0x29,0x51,0x7c,0xc5,0x89, +0xa0,0xbf,0x45,0x88,0x03,0x29,0x4c,0x3f,0x45,0xad,0x6a,0x20,0xfe,0x10,0x53,0x50, +0x21,0xb8,0x35,0x0b,0xb0,0x53,0xb2,0x57,0xf1,0xae,0xd9,0x31,0xd2,0x73,0x9a,0x26, +0x32,0x5b,0xc2,0xbb,0x53,0x54,0x34,0xa6,0x39,0x5b,0xcc,0xe0,0xfa,0x6e,0x5c,0xd0, +0x25,0x74,0x74,0xc4,0x94,0x33,0x04,0x74,0x7f,0xbb,0x9c,0x70,0x6f,0x66,0x85,0x78, +0xb2,0x54,0x9d,0x7d,0x81,0x00,0xe1,0x03,0x60,0x52,0x8c,0x00,0x17,0x7d,0xa6,0x55, +0x91,0x17,0xed,0x35,0x12,0xc8,0x55,0xfc,0x61,0x53,0x66,0x71,0xe7,0x60,0xce,0x88, +0x57,0x11,0xbc,0x7f,0x65,0x7a,0xee,0xaa,0x0e,0x43,0xcf,0x4c,0x9d,0x71,0x61,0xeb, +0x26,0x12,0xd7,0x3a,0x9c,0xc6,0x47,0x41,0x6f,0xc9,0x92,0xc8,0x4a,0xd2,0xdc,0xaa, +0xae,0x99,0x02,0xa5,0xbb,0x69,0xe7,0xcf,0x9f,0x5a,0x91,0x0d,0xfe,0x3a,0x8e,0x1d, +0xb5,0x0a,0x23,0x75,0x69,0x76,0x70,0x3d,0xf5,0x4a,0x2d,0x6d,0xce,0x5e,0x86,0x15, +0xc2,0x1f,0x7e,0x0b,0xe4,0x36,0x8a,0x8a,0x95,0x81,0xde,0xf9,0x49,0x17,0xf6,0x48, +0x8c,0x50,0x55,0xa6,0xb9,0x11,0x3f,0x10,0x44,0x90,0xfe,0x8e,0xf9,0x31,0x53,0xd0, +0x99,0xe5,0xd0,0xbf,0x45,0x7c,0xb0,0xa9,0xee,0x7a,0x0d,0x6d,0xfc,0xee,0x17,0xc8, +0x2e,0x3e,0x5c,0xbf,0xc7,0x30,0x2d,0xf8,0xbf,0x1d,0x90,0x1f,0x57,0x70,0x12,0x06, +0x57,0x13,0xb8,0xe6,0x12,0xd0,0x88,0xd8,0x54,0x8d,0x98,0x5c,0xf7,0xa2,0xf1,0x31, +0x3a,0x88,0x58,0x51,0x13,0xd1,0x18,0xd8,0xb4,0x48,0xe2,0x54,0x77,0x0c,0xfa,0x90, +0xfb,0x8b,0xb0,0xc7,0xe4,0xb9,0x4e,0xbc,0x31,0x4b,0x6b,0x07,0x56,0xe6,0x77,0x52, +0x8d,0x28,0x7a,0xe7,0x15,0xe1,0x19,0xb9,0xc4,0xa3,0x7d,0xb5,0x14,0x62,0x3b,0x24, +0x45,0x8b,0xd8,0x56,0xb5,0xbf,0x74,0x02,0x42,0xed,0xf3,0x69,0x55,0xa4,0x10,0xb4, +0xa2,0x0f,0xee,0xd2,0x03,0xa2,0x32,0x90,0x66,0x85,0x78,0x9e,0x36,0x6e,0x79,0x4f, +0x23,0x07,0x3d,0x31,0x74,0x26,0x03,0x8b,0xe9,0x0b,0xd5,0xed,0xbd,0x1e,0xee,0xbb, +0x03,0x48,0xe1,0x5e,0x15,0xab,0x5d,0xbb,0xf4,0xac,0xff,0x91,0xe4,0xd1,0xaa,0x28, +0x77,0x81,0x23,0xa0,0x1d,0xc8,0x22,0x9a,0x04,0x65,0x8a,0xdd,0x07,0x65,0xdb,0x9e, +0x14,0xbf,0x25,0xac,0x19,0x4b,0x5a,0x79,0x31,0xc4,0x7a,0xd3,0x1a,0x64,0x78,0x84, +0x8a,0x79,0xb3,0xbf,0xce,0x07,0x2c,0x99,0x5c,0xb8,0xd3,0x6c,0xac,0xe5,0xf4,0x1a, +0x8b,0x7a,0xf2,0xf7,0x38,0x0a,0x63,0x3e,0xae,0x8b,0x44,0xbb,0xf5,0x13,0x5c,0x8f, +0x2d,0x2c,0x5d,0x2c,0x91,0x2a,0xc8,0x8a,0x1e,0x8e,0xa8,0x91,0xd6,0x6a,0xef,0x29, +0x52,0x0a,0xa3,0xb6,0x30,0x60,0x23,0x9f,0x28,0xed,0x7a,0x7d,0xcd,0xf6,0x3a,0x4d, +0x6b,0x87,0xe5,0x0f,0x9a,0x8a,0xf2,0xc9,0xcd,0x2e,0xaa,0x97,0x7b,0xe5,0xeb,0x4f, +0x6e,0x94,0x14,0x2f,0x97,0xa6,0xbb,0x63,0x4f,0x42,0x27,0x09,0x9c,0x1f,0x6c,0x93, +0xc5,0x6f,0x43,0x76,0xb4,0xf2,0x7c,0x97,0xe9,0x6d,0x69,0xc6,0xa9,0x8d,0xa1,0x71, +0x07,0xd3,0xbc,0x26,0x59,0x1c,0x27,0x38,0x64,0xb1,0xdc,0xb4,0x72,0xfc,0xe5,0x5e, +0xf4,0xd0,0x24,0x29,0xb5,0xd2,0xd2,0x53,0x64,0xcd,0x1a,0xf9,0x41,0x2e,0xa9,0x17, +0xf6,0x00,0x22,0x25,0xbd,0xf2,0x2d,0x03,0xf3,0x7e,0xc2,0x4f,0xf5,0x57,0xa4,0x8f, +0xf0,0xd6,0x84,0x85,0x4e,0xb9,0xf5,0x40,0x67,0xe4,0x94,0xe4,0x59,0xf9,0xe3,0xa2, +0x2f,0x9c,0xb0,0xb4,0xc8,0xd9,0x46,0x70,0xe6,0x28,0x50,0x69,0x76,0xb5,0xfa,0x8b, +0x82,0x3b,0x36,0x25,0x34,0xb2,0x2c,0x06,0x81,0x96,0x0a,0x0f,0x6c,0xbb,0x6b,0xa1, +0x94,0xfc,0x8d,0x94,0xc3,0xba,0x05,0x1b,0xc8,0x1a,0xd9,0x7d,0xc4,0x9c,0xe6,0x87, +0x53,0xda,0xc6,0xc8,0x6b,0xb5,0xb9,0x4a,0x2a,0xde,0x7b,0x92,0xb4,0x62,0xcb,0x3a, +0x4f,0xf9,0x06,0x47,0x9c,0x3a,0x46,0xd8,0x4e,0xb9,0x65,0x9d,0x02,0xf0,0x24,0x1d, +0xaa,0x61,0xb1,0xee,0x1f,0xbc,0x1b,0x96,0x4d,0x58,0x20,0x2b,0xff,0xf2,0xef,0x36, +0x7d,0xd9,0xaf,0x7d,0xbb,0xcb,0x61,0xe6,0xe5,0x56,0x0a,0x67,0x49,0x81,0x9c,0xee, +0x1d,0xb9,0x01,0x4c,0xb7,0x0d,0x04,0xee,0x76,0x9e,0x4c,0x5c,0x7c,0xbe,0x6a,0x1a, +0x05,0x86,0xeb,0x2f,0x62,0xfd,0x27,0x1f,0x08,0xbd,0x3e,0xf2,0xcd,0xf7,0xdf,0x34, +0x21,0x18,0xdf,0x5d,0xbe,0xb6,0xf6,0x49,0xed,0x5e,0x37,0xe2,0xcc,0x23,0x18,0xbd, +0xce,0x3f,0xb6,0x54,0xdc,0x40,0x26,0x1e,0x0a,0x58,0xfa,0x17,0xd0,0x34,0x10,0x72, +0x82,0x0c,0x44,0x5a,0x1e,0x3e,0xa8,0xdf,0x61,0xc2,0x5e,0x91,0x98,0x7a,0xb2,0xa2, +0x21,0xb1,0xa4,0xdb,0x72,0x8b,0x9f,0xc1,0x1c,0x01,0xbe,0xe0,0x6b,0xc5,0xbe,0xe3, +0xb3,0x69,0xfc,0xa5,0x31,0x62,0xd1,0x39,0x5c,0x4a,0x43,0x36,0x9b,0x71,0xc9,0x1c, +0xb3,0xde,0x9f,0x28,0x22,0x6e,0xa6,0x61,0xc2,0x0c,0xd4,0x99,0x19,0x39,0x18,0x95, +0xeb,0xc7,0x7b,0x34,0x92,0x8b,0xc7,0x68,0xc2,0xe4,0xf0,0x8e,0xa7,0xed,0xdc,0x23, +0x79,0x47,0xe8,0xc7,0xb0,0x64,0x9c,0xba,0xf8,0x46,0xb2,0x07,0x58,0x2a,0xad,0xd3, +0x8a,0x0c,0xb9,0xcd,0x37,0xaf,0xfa,0x26,0xcc,0x9a,0xf1,0xef,0xf6,0x7d,0x4a,0x2d, +0x6a,0x94,0x09,0x45,0xfc,0x3c,0x61,0xe9,0xa0,0xed,0xd8,0x06,0xd4,0x28,0xc2,0x04, +0xba,0x00,0xda,0x08,0x91,0x56,0x4b,0xa3,0x2b,0x97,0x47,0x5f,0x6a,0xea,0x5a,0xf0, +0x26,0xc4,0xea,0x5f,0x04,0x6b,0x24,0xfd,0x6a,0x39,0x1b,0x1a,0xb2,0xfa,0x01,0xe1, +0xa7,0xc1,0xe3,0x5f,0xf0,0x27,0xeb,0x5b,0x6b,0x0b,0x53,0xb9,0x0b,0x28,0x79,0xb9, +0x8f,0x49,0x88,0x79,0x98,0x2a,0x42,0x3f,0x2c,0x40,0x2f,0x5f,0x32,0xd8,0x58,0x4a, +0x98,0x06,0xed,0x2a,0xe9,0x3c,0x44,0x55,0xf9,0xc1,0x42,0x9c,0x78,0xcd,0x49,0x24, +0xe2,0xde,0x31,0x54,0xbe,0xd2,0x6b,0x45,0x5b,0x49,0x88,0x3f,0xb0,0x09,0x05,0x3a, +0xf4,0x4c,0x7b,0xb6,0x8a,0x63,0xab,0x79,0xbd,0x4e,0xc2,0x9e,0x5e,0xe3,0x51,0x5b, +0x19,0x07,0x5b,0x3f,0x68,0x4a,0x5d,0x3e,0xe5,0x93,0x4b,0x0e,0xcc,0xc4,0xbb,0xe2, +0x60,0x1f,0xde,0x55,0x58,0xc1,0xc0,0x51,0x02,0xd0,0xea,0xe5,0x99,0x23,0x04,0x81, +0x27,0x41,0xb6,0x6b,0xcc,0x5d,0x3c,0x46,0xc0,0x58,0x9e,0x30,0x37,0x6c,0x5c,0x64, +0x45,0x95,0xfc,0xf7,0x17,0x73,0x4b,0x10,0xa8,0x54,0xd7,0x5a,0x19,0x41,0x7d,0xd1, +0xb9,0x15,0xeb,0x55,0xb2,0x71,0x1e,0xd3,0x1e,0xdf,0x5d,0xb9,0x55,0xac,0x64,0x4a, +0x21,0x76,0x3b,0xb7,0x39,0xe2,0x0e,0xe1,0x15,0x54,0x44,0x41,0x85,0x89,0x9c,0x54, +0x3f,0x14,0x04,0x47,0x66,0x98,0x5a,0xb7,0x4d,0x89,0x8e,0xc3,0x84,0x34,0xfa,0x52, +0x8c,0xbb,0x3e,0xe1,0x3f,0x9b,0x64,0xdc,0xf2,0x52,0xc7,0x85,0x0d,0xab,0x45,0xdc, +0x4a,0x64,0xc2,0xa5,0x33,0x28,0x89,0xaf,0x70,0x68,0x22,0x86,0x8b,0x81,0x2e,0xf7, +0x89,0x76,0xdc,0xa3,0x44,0x97,0x5c,0xb5,0x83,0xdb,0x22,0xce,0x87,0x7e,0x8e,0x51, +0xad,0x02,0xf0,0x9b,0x98,0x90,0x48,0x3a,0xe8,0xe4,0xa0,0x08,0xf6,0xcf,0x65,0x98, +0xa9,0x7a,0x27,0xff,0xda,0xdf,0x2f,0x79,0xb4,0xf5,0x3b,0xd5,0x59,0xc5,0xd3,0xef, +0x56,0x92,0x18,0xfd,0xb5,0xcb,0x27,0x57,0x45,0x56,0x97,0xa4,0x10,0x28,0x04,0x37, +0xc3,0x2f,0xf8,0x0d,0x5b,0x38,0xa9,0x6a,0xeb,0xe1,0x8c,0xee,0xc9,0xd5,0x98,0xab, +0x09,0x71,0x75,0x52,0xcc,0x80,0x66,0xa5,0xc8,0x1c,0x87,0x2b,0xdc,0x6d,0xa0,0x09, +0xae,0x50,0xa6,0xe9,0x24,0xc1,0x6f,0xb5,0x49,0x3b,0xc4,0x67,0xde,0xf3,0x2d,0xdd, +0xaa,0xdf,0xaa,0x26,0x4a,0x29,0x20,0x8b,0x14,0x1d,0x27,0xd9,0x79,0x73,0xa5,0xaa, +0xf1,0xc2,0xc0,0x41,0x2d,0xbb,0xb2,0xca,0x6b,0x0f,0x8e,0x8f,0x14,0xa2,0x71,0xf7, +0x62,0x89,0xe0,0x82,0x97,0xed,0x46,0xf7,0x76,0x85,0x08,0xc5,0x23,0x84,0xa0,0xa9, +0x87,0xb2,0x2b,0x83,0x88,0xbf,0x68,0xdb,0x63,0x4f,0x73,0xfd,0xd2,0xb2,0x13,0x91, +0x04,0x7e,0x2f,0x75,0x17,0x8f,0xc3,0x17,0x19,0x32,0x81,0xc4,0xab,0x4e,0xe5,0x31, +0x38,0x06,0xd8,0xbd,0xba,0xa9,0xa4,0x3c,0xd5,0xfb,0x88,0x62,0xb6,0x31,0x20,0x56, +0x80,0x66,0x50,0xb9,0x07,0xe8,0x58,0x5e,0x24,0xe5,0xbe,0x14,0xe4,0x80,0x1e,0x30, +0xbc,0x30,0x1a,0x60,0x37,0x59,0x8e,0xe1,0x4b,0x9f,0x89,0x43,0x54,0xea,0x57,0xff, +0xe7,0x58,0x94,0x5f,0x32,0xf8,0xa2,0x73,0x77,0x36,0xc1,0x9c,0x7b,0xea,0x5a,0xe2, +0x23,0x45,0xad,0x8a,0x4c,0xe1,0x52,0x78,0x28,0xc5,0x63,0xbe,0xa3,0x45,0x3a,0x7a, +0x01,0x7e,0xe0,0xf6,0x04,0xeb,0x5a,0x38,0xbe,0xc4,0x83,0xba,0x49,0xac,0x69,0x16, +0x73,0x03,0xab,0x03,0x1e,0xc6,0x6b,0x2f,0x45,0xb4,0xe2,0xbf,0xda,0x28,0x23,0x0f, +0x0f,0x87,0x2e,0x75,0x9c,0xbb,0x65,0x9f,0xcd,0x64,0xc5,0x7f,0x71,0xe6,0x1d,0x39, +0x60,0xe0,0xe3,0x28,0x83,0xb3,0x73,0x68,0x06,0xa0,0x0b,0x49,0xff,0x93,0x54,0x1b, +0x09,0x1d,0x11,0x56,0xba,0x52,0x13,0x91,0xb0,0xcb,0xb9,0x8d,0xdb,0x60,0x04,0x0b, +0xaa,0xe0,0x73,0xa7,0xf5,0xe3,0xa7,0x35,0xe0,0x12,0x63,0x5e,0x7f,0x6f,0xf0,0x28, +0x8e,0x06,0x47,0x2c,0x98,0x59,0x53,0x00,0x4f,0x4d,0xa9,0x60,0x34,0x8b,0x64,0xe2, +0x64,0x6d,0x84,0xec,0xd5,0x1f,0xc9,0xee,0x45,0x20,0xf6,0x3d,0x8f,0x5d,0x49,0xf4, +0x65,0xde,0xb2,0x56,0x14,0xd3,0x67,0xb2,0x1e,0x91,0x3c,0xf5,0xf4,0x5c,0x57,0x23, +0xec,0x89,0xf5,0x74,0x9e,0x4f,0x86,0x07,0x18,0xb1,0x63,0xe0,0x2e,0xf8,0xed,0x9e, +0x66,0x9b,0x6d,0x5a,0x04,0xdf,0xfd,0xb7,0xd5,0x07,0xed,0x05,0xfd,0x33,0x5a,0x63, +0xec,0x17,0x9f,0xb4,0x09,0x25,0xbb,0x9e,0x9b,0x75,0xb2,0x62,0x36,0x8d,0xc0,0x40, +0x2f,0x9d,0x00,0xd2,0x77,0x25,0x03,0x76,0x38,0x0c,0x51,0x89,0xea,0xa9,0x2d,0xda, +0x4f,0x95,0x3c,0xc6,0x0d,0xa9,0x4d,0x1c,0x13,0x97,0x95,0xa5,0xec,0xb7,0x6c,0xa0, +0x8d,0x31,0x8d,0x95,0xfd,0xba,0xc2,0xc2,0x46,0x28,0x46,0xb9,0xd3,0x01,0xb0,0xad, +0x8d,0x67,0x98,0x46,0xf6,0x52,0xe6,0xb5,0x42,0x94,0x88,0x0f,0x1d,0x98,0xe9,0x72, +0xa9,0x54,0x90,0x4a,0xf7,0x13,0x95,0x90,0x11,0xc9,0xa4,0xbf,0x5e,0x43,0x9c,0x4c, +0x72,0x90,0xa5,0x7c,0x9e,0xd6,0xe1,0xc4,0x39,0x87,0xaf,0xb7,0x15,0xf9,0x77,0x17, +0x9e,0x00,0xad,0x6c,0x97,0x1f,0x1f,0xaa,0x38,0xb7,0x81,0x1e,0x9c,0x7b,0x30,0x8a, +0x2a,0xd2,0x9d,0xe9,0x9f,0x03,0xcd,0xce,0xe3,0x51,0x4d,0x9e,0xfe,0xe3,0x0e,0x9d, +0x1a,0x90,0xd6,0xfa,0xcc,0xd1,0x18,0x27,0x98,0xc6,0x6e,0xb9,0x4c,0xc3,0xb1,0xeb, +0xc0,0x5c,0x53,0xad,0x49,0xdb,0x11,0x8b,0x11,0x53,0x4e,0x9f,0x7e,0xe8,0x94,0xfc, +0x0e,0x8a,0x50,0x44,0x4e,0x36,0xa5,0xbc,0x4a,0x29,0x47,0x6d,0xf7,0xbe,0x3a,0xe8, +0x24,0x4f,0x7f,0x77,0x64,0x4c,0xeb,0x53,0x21,0x2c,0x21,0xdb,0xb9,0x23,0x6e,0x65, +0xea,0xd0,0x3e,0x53,0xf8,0x7b,0x0a,0xce,0xaa,0xc8,0xcc,0xe4,0xe5,0xde,0xad,0xe9, +0x14,0xcf,0x66,0x45,0x94,0x03,0xf2,0x61,0x88,0xbf,0xdb,0x0b,0x27,0xcf,0x50,0x0a, +0x87,0x4b,0xef,0x28,0x6e,0x5e,0x40,0xb9,0x28,0xca,0xa7,0x95,0x92,0x32,0x41,0x26, +0xfd,0x46,0xfa,0xac,0x1e,0x6b,0xc1,0x20,0x66,0x06,0xcc,0x82,0xd0,0xb0,0xf0,0xae, +0x13,0x48,0x59,0xab,0x9e,0x83,0x66,0x59,0xce,0xe3,0x5c,0x12,0xde,0x93,0x4e,0xbd, +0xb1,0xa4,0x98,0x74,0x37,0x87,0xd9,0x65,0x29,0x57,0x0a,0x07,0x2d,0x7d,0xb6,0xd5, +0xda,0xdc,0x58,0x95,0x97,0xdc,0x48,0xb1,0xd5,0x5c,0xd1,0x64,0x32,0x28,0x43,0x1b, +0xab,0xf9,0x6e,0x93,0x19,0x48,0xea,0xc0,0x60,0x05,0xe9,0x5f,0x2c,0xc3,0x34,0x25, +0x28,0x89,0xf4,0xb9,0xf2,0x6a,0xe2,0x98,0x05,0x79,0xee,0xcf,0xdd,0xe4,0x5a,0x1b, +0xef,0xfa,0x2e,0x72,0x05,0xa7,0x05,0x59,0xfb,0x78,0xeb,0x25,0x38,0xeb,0xf1,0xf1, +0x51,0xcb,0xf5,0xbc,0x72,0x28,0xa3,0xd1,0xdb,0x04,0xc9,0x26,0x32,0x0f,0x22,0x56, +0x0f,0x01,0x3d,0x3f,0x26,0x42,0x56,0x0e,0x0a,0x03,0x12,0xb5,0x9f,0x2d,0x42,0x5d, +0xe2,0xe4,0x8a,0x3a,0x38,0xed,0x64,0x51,0x23,0xa4,0xf2,0x7b,0xda,0x29,0xef,0xa1, +0x1e,0xc8,0x24,0x0d,0xf4,0x35,0x31,0x68,0xcb,0x6c,0xfb,0x0f,0x5b,0x61,0x33,0x2b, +0x09,0xdb,0xc9,0xbb,0x7a,0x34,0xa4,0xfd,0x8e,0x42,0xf3,0xbf,0xb0,0x61,0x5d,0x81, +0x87,0x0b,0x50,0xd9,0xdb,0x53,0xb2,0xd3,0xc3,0x9f,0x54,0xe5,0xab,0x7d,0x4b,0x12, +0x03,0xe1,0x5c,0xe7,0x1b,0x89,0xbe,0xcf,0x86,0xdc,0x68,0xc5,0xd2,0x30,0xc0,0x67, +0x82,0x30,0xbb,0x21,0xe5,0x9d,0xd5,0x74,0x56,0x49,0xcc,0xb2,0x94,0x74,0x35,0xd6, +0x6b,0x9a,0xf3,0x34,0x58,0x30,0x7d,0xaf,0x9e,0x5c,0x35,0x00,0xf7,0xb9,0xe3,0xe9, +0x11,0xd0,0x84,0xa2,0x70,0x7b,0x41,0x92,0x9d,0x4f,0x60,0x86,0x8d,0x72,0x13,0x51, +0x25,0x46,0xda,0xa1,0xcc,0x77,0x3c,0xee,0x22,0x58,0xa4,0x76,0xf2,0x28,0xff,0x3e, +0x9d,0x47,0xe5,0xcd,0x5b,0x07,0x15,0x87,0xc3,0x46,0xfd,0x8a,0x53,0x87,0x39,0xce, +0x93,0xba,0x47,0xb7,0x31,0xe3,0xf1,0x62,0xdb,0xa8,0xe5,0x49,0x50,0x6c,0x5f,0xa9, +0x8f,0x55,0x8d,0x7f,0x1a,0x48,0x76,0xaa,0xec,0x55,0xfc,0x44,0x3a,0x35,0x74,0x88, +0x8e,0x14,0x5a,0x4c,0x72,0xc6,0x9e,0x55,0x61,0xf4,0x4d,0x5a,0xfe,0x9a,0xf8,0x29, +0x45,0x0a,0x06,0x8f,0x2d,0x97,0xbb,0x2c,0x57,0x51,0x00,0x4b,0xea,0x37,0x71,0xe9, +0x2e,0xfb,0xb1,0x39,0xfa,0x91,0xd6,0xb6,0x4a,0xdf,0x5f,0x69,0x3a,0x60,0x57,0x3a, +0x0b,0x7c,0x95,0xae,0xc5,0x91,0xe9,0x2f,0xa8,0x1c,0x46,0x8a,0x5b,0x3c,0x6f,0xae, +0x40,0x12,0x4a,0x58,0x2c,0xf5,0xa5,0x38,0x2b,0xd0,0xc4,0xfd,0x5a,0x3d,0x61,0xe1, +0x92,0x05,0x56,0x0a,0x64,0x36,0x5f,0xe0,0x17,0xd8,0xe3,0x69,0x13,0xd7,0xc8,0xeb, +0x98,0xfb,0x96,0xdc,0x1e,0x34,0x06,0x79,0x4c,0x59,0xfb,0x66,0x79,0xab,0x79,0x19, +0xe1,0xee,0x59,0x68,0x99,0x06,0x69,0xab,0xad,0x49,0x70,0x36,0x69,0x40,0xf2,0x1e, +0x36,0x05,0x5e,0x3b,0xfe,0xe5,0x58,0x92,0x5d,0xce,0x4c,0x56,0xbc,0x08,0x43,0x0f, +0x85,0x42,0x36,0xc7,0xb6,0x29,0xc9,0xcb,0xd6,0x8f,0x22,0x26,0x2f,0xe4,0xf3,0x0e, +0x83,0xcb,0x93,0xa7,0x15,0x0c,0x60,0xba,0x60,0xc5,0xc1,0xdf,0x41,0x2e,0x47,0xa0, +0x35,0xe6,0x64,0xa0,0x25,0xa6,0xb0,0xbb,0x83,0xc0,0xb0,0xc6,0x4e,0x06,0x2e,0xb4, +0x17,0xca,0x8a,0x46,0x16,0xe4,0x80,0x9a,0x23,0x88,0x0c,0xf0,0x6d,0xa9,0x99,0x4b, +0x21,0x9d,0x59,0x57,0x31,0xca,0x73,0x11,0xf5,0xe6,0x19,0x76,0x72,0x56,0x09,0x0c, +0x66,0xc5,0x89,0x55,0xec,0xaa,0x86,0x9b,0xd9,0x8a,0x28,0xf3,0x8c,0xb9,0x6a,0x88, +0x2e,0xb8,0x06,0x6c,0xa7,0x25,0x62,0x37,0xef,0xa4,0x06,0xcc,0x67,0x58,0xac,0x68, +0x3e,0x88,0xd1,0x54,0xa4,0xb5,0x44,0x06,0x7e,0xdd,0x39,0x58,0xf1,0xe6,0x1b,0xf8, +0xed,0xc6,0x7c,0x0e,0x6b,0x15,0x0d,0x5b,0x06,0x23,0x0f,0x08,0x7f,0xf1,0xd3,0xf3, +0x8f,0xc4,0x6b,0x0f,0xbf,0x06,0xfb,0x7f,0xdf,0xd0,0x0f,0xcf,0xd5,0xe4,0xea,0x1a, +0x65,0xdd,0xa8,0xee,0xe1,0x5b,0x70,0x8c,0xc1,0x3a,0xad,0x6c,0xbf,0x13,0x95,0xb7, +0x3b,0x00,0xb2,0x4f,0x2c,0xe9,0x40,0x9c,0x49,0x55,0xf8,0x5d,0x52,0xeb,0x9c,0xa3, +0x1e,0x43,0xa3,0xcf,0x77,0xc4,0x3b,0x6f,0xe7,0x54,0x33,0xbe,0xad,0xa0,0x14,0xdf, +0xb9,0xa8,0x51,0x3f,0xd3,0xb4,0x9f,0x64,0xfb,0x1b,0xab,0x79,0x7e,0x30,0x7d,0xa3, +0x81,0x8b,0x5f,0xf5,0x1e,0x3a,0x4a,0x9f,0x8d,0x8a,0x76,0xc0,0x08,0xbf,0x42,0xe1, +0x44,0xff,0xe6,0x07,0xc6,0x1c,0x44,0xd2,0x61,0x71,0xdc,0xa8,0xad,0xfc,0x35,0x65, +0xa2,0x48,0xeb,0x7c,0x5d,0xb1,0x90,0x41,0x24,0x7f,0xf4,0xc1,0x82,0xbd,0x4b,0xe6, +0xa6,0x33,0x3e,0x66,0x16,0xa3,0xaa,0xc0,0xf2,0x72,0xbf,0x55,0x77,0x27,0xf6,0x3d, +0x20,0xae,0x22,0x2e,0x34,0xf9,0xd7,0xb2,0x8f,0xe5,0x83,0x84,0x55,0x76,0x0c,0x94, +0x7e,0x9a,0x1d,0xc9,0x07,0xae,0x5e,0x01,0x57,0xce,0x25,0x1e,0x3f,0x08,0xe7,0xbd, +0x4d,0xe7,0xbd,0x43,0xb0,0x5c,0x0d,0x12,0x45,0x26,0x42,0x8b,0xf0,0x0c,0x34,0x57, +0x02,0x68,0x4f,0xa1,0xde,0xa6,0x5c,0x87,0xc6,0x55,0x05,0xc8,0xca,0xb5,0x18,0xff, +0x6c,0x37,0x94,0xbe,0xc4,0x17,0xa1,0x3a,0xa4,0x29,0x65,0xcc,0x5d,0xeb,0xd1,0xdd, +0x1e,0xcd,0xd0,0x99,0x3b,0x39,0xc6,0xc8,0xd2,0x76,0xa4,0xae,0x5e,0xfa,0x3d,0x63, +0x8c,0xd7,0x07,0xfd,0xde,0x0e,0x4f,0xb9,0xdf,0x68,0xd7,0xb1,0x24,0xf7,0x95,0x04, +0x52,0x19,0x32,0xec,0x93,0x31,0xac,0x53,0xb7,0x96,0xe6,0x3a,0x58,0x24,0x58,0xe6, +0xa3,0x6a,0xfe,0xda,0xda,0xad,0x48,0xc2,0x5d,0x18,0x3d,0x82,0x4d,0x1c,0x50,0xf7, +0x21,0xff,0xd0,0x1b,0x1e,0x7d,0x3e,0x0a,0x67,0x92,0x49,0x93,0x79,0x07,0x2f,0xcf, +0x72,0xcf,0xdd,0x27,0xb2,0xf1,0xed,0x8b,0xb6,0xc5,0x48,0x09,0x7e,0xbc,0x25,0x66, +0x22,0x39,0xb6,0xda,0x1a,0x1e,0x26,0xed,0x0b,0xce,0x26,0x17,0xb3,0x02,0xf8,0x3f, +0x35,0x42,0xd9,0x1e,0x54,0x23,0x8a,0xc2,0xa0,0xbf,0x81,0x37,0x47,0x6f,0xb7,0xf6, +0x07,0xf2,0xd2,0x15,0xb6,0x6d,0x23,0xa3,0xe2,0x9e,0xe6,0x0c,0xb0,0xce,0xca,0x6d, +0xb3,0xa2,0x02,0xbc,0xa3,0x63,0xbd,0x5a,0x1e,0xbd,0xa3,0x36,0x73,0x13,0xc8,0xf9, +0xdd,0x4e,0x8b,0x91,0xca,0x20,0xa4,0x00,0xf8,0xfc,0x8c,0x46,0xe9,0x0f,0x7e,0x68, +0x23,0x86,0xd1,0x67,0x77,0x65,0xe8,0x9b,0xcf,0xb9,0xc2,0x4f,0xb9,0x20,0x81,0xaf, +0xea,0x74,0xda,0x09,0xf8,0x61,0x50,0x78,0x63,0x24,0x6c,0x53,0xf2,0xfa,0xed,0x32, +0xf2,0xa0,0xff,0x6d,0xfa,0x2b,0x36,0x13,0x00,0x46,0xeb,0xd5,0x5b,0x27,0x2b,0x51, +0x85,0xd4,0xf3,0xe5,0x1a,0x88,0x5f,0x99,0xcc,0xcc,0x6d,0x17,0x28,0x25,0x7d,0x2e, +0x12,0x85,0xa2,0xad,0x1e,0x92,0x28,0x8d,0xbb,0x0a,0xf4,0xe0,0x59,0x28,0x6a,0x06, +0xf3,0x04,0x75,0xf4,0x3d,0x64,0xa1,0xde,0x59,0xb4,0x9a,0x5e,0x78,0x29,0xd7,0x59, +0x08,0xf5,0xd3,0xe5,0x8e,0x67,0x17,0x6a,0xfb,0x1a,0xbf,0xd2,0xde,0x99,0xf0,0x4b, +0xa7,0x68,0x27,0x82,0x9a,0x7b,0xe3,0xc0,0xc1,0xe6,0xb7,0xde,0x30,0xfa,0x1f,0xcc, +0x7c,0xb8,0x66,0x2e,0xed,0x49,0x56,0x8e,0x79,0x77,0x19,0x6c,0xd7,0x91,0x8a,0xe5, +0x0b,0x86,0xdc,0x3e,0x7b,0x94,0x01,0xee,0x4a,0x0d,0xda,0x58,0xee,0xcc,0x4b,0x4d, +0x03,0x21,0xfb,0x69,0x73,0x3f,0xeb,0x96,0x45,0x55,0xb1,0x6f,0x2f,0xe8,0x4f,0xbb, +0x43,0x3e,0xb5,0x5b,0x7a,0xac,0xe4,0x8f,0xf8,0x2b,0xe3,0x4d,0x9e,0xc0,0xf9,0xb1, +0x19,0xaf,0x44,0x41,0xe1,0x3e,0x5a,0x58,0x66,0xba,0xce,0xc0,0x76,0xa3,0x96,0x83, +0x04,0x1e,0x28,0x56,0x92,0x3f,0x46,0xb8,0xc2,0xfc,0x94,0xb0,0xf8,0x5e,0x3f,0x24, +0x53,0xbf,0xed,0x47,0x34,0x3c,0x91,0x23,0xe1,0xbc,0x31,0x21,0x86,0xc6,0x3f,0x6e, +0x55,0x1c,0xb5,0x31,0x50,0x9c,0x03,0x76,0x2b,0x9a,0xa3,0x7c,0xb3,0xda,0x29,0x28, +0xe2,0x59,0x68,0xe0,0x87,0x9f,0xab,0x9e,0x03,0x50,0xaa,0xe3,0x56,0xc0,0x14,0xd4, +0xaa,0x3a,0xe1,0x27,0xb7,0xb8,0xe4,0x0f,0x65,0x86,0x27,0xd3,0xd2,0x34,0x1d,0xc5, +0xb0,0x5b,0xbd,0xd1,0x52,0xb7,0x37,0xe3,0xe1,0xb6,0x75,0xff,0x7e,0x7b,0x73,0x05, +0xca,0xbd,0x9f,0x92,0x97,0x9a,0x32,0x8e,0x40,0x4c,0x87,0x24,0xc7,0x68,0xc6,0x89, +0xa1,0x03,0x17,0x7f,0x7b,0x23,0x1e,0x49,0x89,0xa7,0x87,0xcc,0x3a,0xa3,0xb1,0x7e, +0x9d,0x60,0xd6,0x95,0x0a,0xdf,0x00,0xb8,0xcf,0xa9,0x57,0x43,0x8c,0xda,0x06,0xf7, +0x0f,0x0a,0x4b,0x6b,0x51,0xc2,0xd7,0x74,0xce,0xf1,0x97,0xde,0x88,0xdb,0x6f,0x87, +0x53,0x16,0x4f,0x21,0x0d,0x33,0x46,0xb2,0xad,0x15,0x0a,0x39,0x8f,0x40,0x1e,0xd0, +0xa7,0xb1,0xd7,0xfd,0x9b,0xbd,0x18,0x6c,0x2a,0x34,0x69,0x0a,0x19,0xd6,0x2c,0xc8, +0x2a,0x5d,0x9c,0x9f,0xd0,0x59,0x20,0xfe,0x8a,0xde,0x4e,0x0f,0xf7,0xd0,0x0e,0x5a, +0xe5,0x70,0x62,0x3e,0x3e,0xb3,0x0d,0x7d,0x82,0x0f,0x46,0x07,0x5f,0x81,0x63,0x3a, +0x26,0xb2,0xf7,0x27,0x17,0x32,0xf3,0x0a,0x67,0x1d,0xce,0x1f,0x57,0xd2,0x6a,0x40, +0x59,0x08,0x60,0x43,0x37,0xbb,0x2e,0x90,0x4c,0xa0,0xa6,0x44,0xab,0x4d,0xe8,0xcf, +0x10,0x9a,0x88,0x1f,0x26,0xe0,0x26,0x43,0x20,0xca,0xc3,0x11,0xf4,0x5e,0x71,0xec, +0x78,0x4b,0x31,0x61,0xd4,0xed,0x76,0x21,0xd4,0x6f,0x24,0xa3,0xa2,0x19,0x2f,0x75, +0x7a,0x98,0x93,0xf1,0x12,0x23,0xb9,0xca,0xc9,0x6e,0x55,0xdf,0xea,0xae,0x2e,0x51, +0x3e,0x4e,0xcc,0x62,0xff,0xb5,0xc8,0x9c,0x56,0x89,0x50,0x14,0x34,0x68,0x79,0x9a, +0x34,0xbe,0x96,0x50,0xf6,0x26,0x40,0x42,0x1b,0x6a,0x5c,0x51,0xfb,0xe8,0x47,0x6b, +0xc9,0x22,0xf7,0x25,0xf6,0x5e,0x8e,0x10,0x85,0x67,0x61,0x7c,0x52,0x72,0x91,0xbb, +0x0b,0x1a,0xc5,0xa4,0x1b,0x7a,0xd9,0x01,0xa5,0x8b,0x00,0x50,0x76,0x98,0xa4,0x6c, +0xf7,0x93,0x62,0xdb,0xc4,0xea,0x2c,0xba,0xb3,0x8d,0xd5,0x54,0x5a,0x3b,0x9f,0x73, +0x0b,0x73,0x12,0xfe,0x0d,0xaf,0x8a,0x27,0xcb,0x9a,0xc6,0x4d,0x4a,0x6b,0xe0,0x6d, +0x67,0x62,0x2b,0x65,0xaf,0xeb,0x34,0x8c,0x4a,0xf9,0xc3,0x6f,0xd8,0xc6,0xe1,0xf3, +0xdb,0xc6,0x08,0x5b,0x3c,0x54,0xfb,0xe2,0x5a,0x89,0xa5,0x16,0xfc,0x7b,0x9a,0x42, +0xf7,0xc3,0x9a,0x69,0xe3,0xa3,0x0c,0x6d,0xbb,0xc3,0x62,0x7d,0x78,0xa8,0x79,0x64, +0x33,0xcf,0x68,0x6c,0x7f,0x54,0xa9,0xa1,0x2c,0x32,0xa0,0x56,0x6b,0x42,0x59,0xb8, +0xd9,0x7b,0x73,0x21,0xf5,0xa1,0xc7,0x14,0x6d,0x8c,0xd5,0xce,0x52,0xaf,0x24,0xc1, +0x89,0x0f,0x95,0x59,0x7e,0x2c,0x03,0x3c,0x32,0x49,0x5b,0x0d,0xbd,0x63,0x7c,0x86, +0x90,0xc9,0x24,0xe5,0x38,0x3d,0xf2,0x64,0x24,0xeb,0x74,0x1a,0xac,0xf8,0xd3,0x6d, +0xc4,0x12,0x00,0x05,0x2e,0xb9,0x99,0x24,0x64,0x3b,0xa9,0xd6,0x3f,0x5c,0x7c,0x93, +0x01,0x13,0xdb,0xaf,0x5d,0xa3,0x10,0xd4,0x69,0xc9,0x35,0xe4,0x5f,0x5f,0xd2,0x6d, +0x5d,0x5a,0x2d,0xf4,0xb9,0x38,0x95,0xae,0xd6,0xe7,0xae,0x86,0x54,0x0c,0xae,0x51, +0x6d,0x6b,0x74,0x57,0x06,0x00,0x76,0x8f,0x05,0x54,0xe1,0x04,0x52,0x27,0x6d,0xa1, +0x34,0x3c,0xfd,0x27,0x94,0xf5,0x7a,0x22,0x8e,0x5f,0x78,0xf2,0x7f,0x9b,0x89,0x51, +0xe6,0x9e,0x45,0xdd,0x3a,0x1b,0x63,0xcf,0x0d,0x87,0x0e,0x1f,0xf6,0x4d,0xa3,0x33, +0xa3,0xbb,0x6d,0xc7,0x6e,0xea,0xd1,0x61,0xbb,0xdd,0xdb,0xcf,0x73,0x53,0x7d,0x8a, +0x2a,0xb8,0xdd,0xbf,0x0c,0x17,0xec,0xaa,0x24,0x91,0x88,0x83,0x52,0x27,0x15,0x26, +0xde,0x34,0xd0,0x99,0x9c,0xb2,0x00,0xde,0xb3,0xd1,0x1a,0x3a,0x0b,0x4d,0x0b,0xf4, +0x98,0x25,0x07,0xfd,0xde,0x6e,0x6e,0xbb,0x49,0x25,0xed,0x73,0xfa,0x29,0xb7,0xaa, +0x0c,0x3f,0x2f,0xdc,0x42,0x16,0xb5,0x4a,0xc8,0xdb,0xb7,0xbb,0x74,0xd4,0x1a,0x8d, +0xc7,0x86,0xf0,0xac,0x5e,0x35,0xb6,0xfb,0x56,0x7c,0x63,0xe9,0x5a,0x58,0xd1,0xca, +0xfb,0x92,0xc4,0x2d,0xb3,0xfc,0xfe,0xd9,0xb7,0x7d,0x5a,0xda,0xfd,0xf5,0x01,0x1e, +0xee,0x41,0x99,0xc9,0x5f,0x3d,0x64,0x98,0x9e,0xd7,0x64,0xe9,0x36,0x4f,0x5d,0x24, +0x9c,0x9b,0xd1,0xf7,0xd7,0xb2,0xea,0xd8,0x37,0x7f,0x43,0x80,0x5c,0xbe,0x3e,0xc5, +0x21,0x30,0x08,0xf7,0x9c,0x8d,0xb4,0xda,0xcf,0xbd,0x5f,0xa6,0xd0,0x65,0x1a,0x1c, +0xa2,0x05,0x1d,0xf6,0x17,0xd3,0x99,0x5f,0xba,0xbc,0x30,0x20,0xf2,0x6c,0x61,0x53, +0x0a,0x0f,0x10,0xe7,0x3c,0x8f,0x76,0x5f,0x12,0x4a,0xa9,0xf5,0x8c,0x64,0x0f,0x63, +0x03,0x8f,0x68,0x91,0xcf,0x1d,0x7e,0xce,0x34,0xc5,0x75,0xa7,0x95,0x6b,0xc5,0x22, +0x82,0xa4,0x3f,0xc0,0x7c,0x81,0xaf,0x88,0x96,0x06,0xea,0x59,0x61,0xa8,0xe3,0x9a, +0xb8,0x3e,0xf6,0x9c,0x9e,0xd3,0xf7,0x8c,0x43,0x5e,0x99,0x92,0x55,0x8f,0xed,0xe4, +0x57,0x65,0xff,0x8c,0xd0,0xd9,0xd4,0x34,0x1f,0x3b,0x29,0x1b,0xb0,0x46,0xea,0xb6, +0x76,0x35,0x81,0x4d,0x5b,0x3d,0xfe,0xf5,0xdf,0x45,0x16,0xf7,0x2d,0x98,0x66,0xea, +0x3f,0xf8,0x42,0x91,0x65,0x85,0x12,0x2a,0x0a,0x35,0x16,0xdc,0x1c,0x67,0x73,0x7e, +0x2a,0x49,0x1f,0xfe,0x7a,0x6c,0x61,0x7f,0xb0,0xef,0x99,0xaa,0xdb,0x25,0xc2,0xf9, +0xc3,0x5b,0x12,0xef,0x34,0x87,0x84,0xd2,0x29,0x99,0x53,0x20,0xa7,0x28,0x1f,0x50, +0x35,0xb1,0x1a,0xf7,0x3c,0x47,0xbb,0x43,0x03,0x2f,0x19,0x5f,0x22,0x6d,0xbe,0xa0, +0x1f,0x41,0xc3,0x3e,0xa5,0x97,0xe9,0x97,0x79,0x4a,0xea,0x3e,0xe9,0xe6,0xa6,0xb0, +0x89,0x40,0x1c,0x6f,0xd3,0x37,0x83,0xfc,0x57,0x69,0x6e,0x1e,0x9a,0xe7,0xb8,0x41, +0x2f,0xf1,0xc7,0x72,0x8d,0x6c,0x93,0x64,0x87,0x55,0xab,0x27,0xeb,0x61,0xac,0x27, +0x8d,0x5f,0xca,0x4c,0x83,0x2b,0xcb,0xfd,0xd4,0x52,0x5c,0x35,0x78,0xc2,0x7a,0xb8, +0x8c,0x1d,0x44,0x19,0xe1,0xbb,0x83,0x8d,0xe0,0xd3,0xb4,0xb5,0xfd,0x13,0x93,0xf2, +0xca,0xc0,0x74,0xfa,0x10,0x71,0x45,0x92,0xc4,0x2e,0xe1,0x5d,0xbf,0x1e,0x7b,0xb8, +0xa6,0xe0,0x35,0xa9,0x03,0xcf,0x28,0x81,0x41,0x30,0x3e,0x00,0x25,0x6c,0xb9,0xf3, +0x4a,0xe2,0x89,0x05,0x95,0x4f,0x2a,0x8c,0x11,0x82,0x26,0x3c,0x5e,0x68,0x62,0xf8, +0x7d,0xb0,0xbb,0x39,0x3a,0x76,0xb8,0x73,0x71,0x5c,0x2b,0x06,0xff,0x72,0x5f,0xc3, +0x76,0xa4,0xc0,0x6a,0xb1,0x39,0x12,0xf9,0x8a,0x65,0x27,0x76,0x8d,0x8a,0x52,0xa1, +0x6a,0xae,0x13,0xf6,0xfa,0x26,0xd5,0x80,0xf7,0xf2,0xfd,0xe5,0x53,0xf0,0xf0,0xeb, +0xfa,0xa2,0xc9,0x51,0xc5,0xe1,0xb1,0x62,0xa4,0x5d,0xe5,0x67,0xf3,0x7f,0x3c,0x63, +0x2e,0xea,0x39,0xc3,0xba,0x14,0xa1,0x85,0x9c,0x09,0x74,0xca,0x87,0x68,0xf1,0x8b, +0x51,0x5d,0xee,0x9e,0x7a,0x34,0x8f,0xa7,0x55,0x64,0x66,0xb4,0x84,0x36,0x51,0x0d, +0xf6,0xea,0x94,0xef,0x9b,0x78,0xd7,0x79,0x0c,0x8e,0x2f,0x45,0x24,0x86,0x29,0xa1, +0x25,0x55,0xd1,0x40,0xb9,0x94,0x0f,0xda,0xe7,0x40,0xc6,0xa6,0xff,0x0b,0xcd,0x4c, +0x36,0x16,0x9f,0xc5,0x3c,0xbc,0x1e,0xd7,0x7a,0x87,0xd4,0x1d,0x6e,0x83,0x4e,0x29, +0x53,0xe2,0x0e,0x60,0x85,0x58,0x5e,0x7c,0x63,0x71,0xe6,0x0f,0x6f,0xdd,0x4f,0xdd, +0xc1,0x8f,0x97,0x4f,0x3b,0x1e,0x57,0xd2,0xfd,0xc5,0x47,0x6f,0x7b,0x7e,0x69,0xe1, +0xf2,0xbb,0x0f,0x61,0x6d,0x7d,0xe0,0xc8,0xf3,0xa0,0x5e,0xd9,0x1a,0xd0,0xe0,0x9f, +0xb6,0x8d,0x64,0xf9,0x77,0x0a,0x78,0x2e,0xf9,0x31,0x90,0x81,0xf5,0xe9,0x90,0xfd, +0x27,0xd3,0x6c,0x2b,0xea,0xe3,0x15,0x62,0x4d,0xfd,0x98,0x27,0xd8,0x82,0x79,0x93, +0xb7,0x14,0x30,0xed,0x31,0xce,0xce,0x51,0xb2,0x1d,0x71,0xa3,0xc8,0xef,0x2e,0x91, +0x44,0xa5,0x6e,0x4d,0xe2,0xa3,0x29,0x86,0x27,0x17,0x12,0x92,0x00,0xfd,0x11,0x02, +0x4e,0x59,0xd5,0x35,0x5d,0xad,0x10,0x20,0x4e,0x86,0x7f,0x86,0x08,0xe2,0xd5,0x32, +0x76,0x21,0x17,0x24,0xec,0x5e,0x78,0x72,0xc5,0xc9,0x98,0xc9,0xa8,0xe8,0x99,0x4b, +0x7b,0xc9,0x64,0xb4,0x8e,0xdd,0x73,0x64,0xc6,0xc6,0x59,0x73,0x77,0x19,0xa6,0x6b, +0x4f,0x8e,0x16,0xd3,0xf9,0x02,0x7f,0xf7,0x87,0xa3,0x02,0x50,0x76,0xfb,0x1a,0x4d, +0xce,0x93,0xf8,0x28,0x28,0xb7,0xa3,0x35,0x70,0xf5,0xcf,0xc7,0x41,0x87,0xbf,0xf5, +0x0b,0x7b,0x94,0xc7,0x90,0xcb,0x2b,0x29,0x35,0xf8,0x9a,0x98,0xfc,0xe0,0x6b,0x1b, +0xef,0x13,0x1b,0xf4,0xef,0xaa,0x6b,0x37,0x04,0x5b,0x08,0xa6,0x73,0xec,0xca,0xe8, +0x01,0x86,0x56,0x9b,0xde,0x6e,0x1d,0x07,0xf9,0x6f,0x7b,0xbb,0xc1,0xe6,0x75,0x70, +0x51,0x39,0xdc,0x82,0x5c,0x53,0x72,0x6a,0x4e,0xcc,0x4d,0x24,0x4e,0xe8,0x62,0x4e, +0x64,0x1c,0xa2,0x46,0xd7,0x67,0x02,0x5d,0xec,0x69,0x51,0xfb,0xcc,0xd2,0x7b,0xcf, +0x92,0x84,0xdd,0x9b,0x13,0x58,0x49,0xe9,0x30,0x31,0xf5,0x31,0x53,0x8c,0x6b,0xaa, +0xf7,0x70,0xee,0xb2,0x97,0x22,0xb5,0x73,0x26,0xdf,0x83,0x01,0x5d,0x18,0xf2,0x80, +0x6a,0xad,0xbc,0x04,0xb4,0xda,0x04,0xc4,0xdb,0x65,0x90,0x24,0xf4,0x57,0x3d,0x8d, +0x1d,0xd3,0xd2,0xca,0xb7,0x65,0x29,0x8c,0x55,0x93,0x39,0xd4,0xf5,0x51,0x33,0xe1, +0x1f,0x46,0x9d,0x76,0xed,0xb2,0x22,0x99,0x94,0x27,0x8d,0xc7,0xf2,0xb0,0xea,0xd7, +0xa3,0x61,0x7a,0xf5,0x94,0x91,0x77,0x85,0x31,0xc2,0x11,0x12,0x20,0x90,0x73,0x9e, +0x15,0x52,0x60,0xb6,0xd7,0x45,0x4f,0x5e,0x60,0x07,0xe5,0x16,0x3d,0x55,0x8a,0x56, +0x3b,0x3d,0xbe,0xd7,0x25,0xfa,0x83,0x76,0x66,0xd5,0x7c,0xf5,0xda,0x58,0xa5,0xce, +0xf6,0x8d,0xbc,0x95,0x11,0x6b,0x28,0x1d,0x4a,0xdb,0xe4,0x0d,0x53,0xfd,0x34,0x9f, +0xa1,0xe7,0x2d,0x6b,0x29,0xac,0x43,0xfb,0x8e,0xcd,0xec,0x73,0xa9,0x34,0xa1,0x75, +0xe4,0x49,0xc6,0x8d,0x3e,0xb5,0x91,0x83,0x6a,0x2a,0x1d,0x64,0xc7,0xc3,0x86,0x2f, +0x90,0x38,0x49,0x6d,0x1c,0x14,0xfe,0x27,0x07,0x9b,0x42,0x3c,0xfd,0x7e,0x83,0x98, +0xd0,0xde,0x58,0xc8,0x55,0xb3,0x46,0x5b,0xe4,0xd5,0xd7,0x48,0x09,0xc8,0x8f,0x60, +0x4c,0x38,0x60,0x0d,0xbd,0x14,0xf8,0x70,0xeb,0x29,0x87,0xdf,0xfb,0xb9,0x65,0x22, +0x33,0xde,0xe3,0x4a,0x7e,0xbf,0x2e,0xc7,0x87,0x36,0x41,0xe8,0x95,0x8d,0xb5,0xda, +0x1c,0x29,0x3d,0x71,0x39,0x6e,0x40,0x36,0x8c,0x5d,0x3e,0x63,0x72,0x08,0xe2,0x9a, +0x13,0x61,0x87,0x8d,0xf6,0xfc,0x6f,0xf7,0x05,0xce,0x50,0xd7,0x17,0xef,0xaf,0xd6, +0xad,0x42,0x0a,0x5b,0xb3,0x36,0x80,0x89,0x50,0x64,0x5f,0x0c,0x87,0x0b,0x93,0x84, +0x5e,0x80,0xd9,0x02,0xf5,0x29,0x9f,0xa4,0x20,0xbd,0x24,0x46,0x63,0x80,0xc8,0x8d, +0x47,0xae,0x44,0xf4,0x0d,0x3a,0xda,0xb4,0x1f,0xb1,0x5c,0xfe,0xea,0x9e,0xfc,0x4f, +0x75,0x5e,0x01,0x46,0xd2,0x8f,0x59,0xa5,0xc6,0xb0,0x3a,0x62,0xde,0xbe,0xad,0x73, +0x6a,0x32,0x45,0x73,0xb2,0xe3,0xe6,0xb5,0x9f,0xd8,0xc3,0x5f,0xb9,0x72,0x58,0xc4, +0xe3,0x0b,0xbe,0x42,0xf3,0xa7,0x83,0xec,0xe3,0x47,0xc6,0xdd,0xb9,0xd7,0x02,0x4d, +0x30,0x32,0xb0,0x45,0x23,0x88,0xde,0x0f,0xa1,0x65,0x8b,0x50,0xba,0xd6,0x18,0xf7, +0x27,0x8a,0x62,0xb6,0x1e,0xab,0xed,0x64,0xe2,0x07,0x6a,0xd4,0xa0,0xc9,0xb1,0xd5, +0x9e,0x53,0xd8,0xe7,0xcf,0xf9,0x5c,0xd1,0xe7,0x87,0xcb,0x8a,0x38,0x94,0xb6,0x6a, +0xe3,0x59,0xe2,0x4e,0x16,0x25,0xd2,0xb5,0x5f,0x0a,0xec,0x2a,0xb9,0xeb,0x31,0x7a, +0xfa,0x6c,0xff,0xfa,0x2a,0xee,0x24,0x10,0x21,0x44,0xe5,0xb8,0x0e,0x04,0x5e,0x08, +0x8e,0xf8,0x9b,0x1d,0x79,0x31,0x01,0x56,0xc9,0x32,0xbf,0xde,0x54,0x67,0x33,0xe6, +0x5c,0x96,0x33,0x4f,0xda,0xdb,0x09,0x36,0x22,0x0f,0xa5,0xf8,0xf8,0x1a,0x22,0x0a, +0x48,0x03,0x02,0x2c,0x1a,0x6e,0x32,0x76,0xdf,0xc7,0xec,0xd4,0x38,0x93,0x2c,0x98, +0x89,0xd9,0xb7,0xd8,0x04,0xac,0xdb,0xfc,0x3d,0x1f,0x5a,0x54,0x8f,0x9c,0xd3,0x0e, +0x63,0x84,0xdc,0x06,0x9c,0x6d,0x57,0x8b,0xea,0xcf,0xad,0xd1,0xfe,0x2c,0xf6,0xbb, +0x43,0x85,0x0b,0x11,0x45,0x29,0x63,0xd9,0x66,0x2f,0x7c,0xdd,0x2f,0x3c,0xfb,0xd2, +0x63,0xe0,0x95,0xc3,0xee,0x38,0xab,0x24,0x3e,0x69,0xf6,0xa0,0x71,0x90,0x88,0xcf, +0x9c,0xed,0xc2,0xa5,0x01,0x2e,0x64,0x34,0x3f,0xca,0xe4,0xb6,0x31,0xd1,0x15,0xe3, +0xa4,0x29,0x05,0xa6,0x6d,0xb9,0x2e,0x43,0x4c,0xef,0xaf,0x27,0x71,0xf0,0xa6,0xff, +0x74,0x6f,0x35,0xf5,0xc2,0x9e,0xdd,0x2c,0xf6,0xec,0x8c,0x96,0xcf,0xde,0xed,0x22, +0xa0,0xc0,0xba,0x71,0xbd,0x92,0xf7,0x5f,0xc1,0x50,0xea,0x28,0x1a,0x57,0xe0,0x43, +0x0a,0x1a,0xec,0x3e,0xda,0xf6,0x4d,0x80,0x3f,0x5e,0x8c,0x07,0x51,0x34,0xd6,0xa3, +0x83,0xd6,0x95,0xb6,0xce,0xbf,0x54,0xf0,0xd2,0xfb,0xab,0x44,0x13,0xd5,0x6d,0xd5, +0x26,0x96,0xd7,0xd7,0x21,0x76,0xe8,0x19,0x4b,0x1a,0xe3,0x39,0xb1,0x88,0x3b,0xc7, +0xd0,0x89,0x97,0xbd,0x99,0xb9,0xd6,0x35,0xc7,0xf3,0x5a,0x4c,0x18,0x3a,0xc3,0x1c, +0x77,0x58,0xdc,0xdf,0xd2,0x5d,0x1c,0xe3,0x98,0x56,0xb6,0x2c,0xd8,0x15,0x34,0xa4, +0xae,0x52,0x08,0x7e,0x3c,0xb7,0x6f,0xad,0x15,0x18,0x1a,0xa3,0x07,0x7c,0xa2,0xf2, +0x34,0xae,0xb7,0x63,0x15,0x36,0xab,0xc2,0x4a,0xab,0x78,0x7d,0xeb,0x76,0x7c,0x3b, +0x25,0x67,0x9c,0xee,0x52,0x8f,0x24,0xe9,0x6c,0x5f,0xe8,0x44,0xf7,0x8a,0x95,0xef, +0x2d,0xc7,0x98,0x64,0xd0,0x59,0x9e,0x44,0x0d,0x46,0x21,0x8f,0x07,0x11,0xc0,0x32, +0xd5,0xc5,0xb9,0xcb,0xd9,0x6b,0x45,0xf4,0xd9,0x1a,0x47,0x9e,0xe1,0xfc,0x33,0xaa, +0xa8,0x14,0x5f,0x22,0x5a,0x5c,0x97,0x7d,0x9d,0x9c,0x38,0xd9,0x12,0x25,0x8b,0x86, +0x5a,0x1d,0x5f,0xee,0xae,0xed,0x0a,0x92,0xcd,0x82,0x70,0x6b,0x6d,0x7f,0xeb,0x96, +0x5b,0xee,0x10,0x27,0x3c,0xee,0xff,0x16,0x43,0x33,0xc7,0x4c,0x37,0x81,0xe1,0x9e, +0x14,0x88,0x0d,0x98,0x97,0xb2,0xf6,0x3e,0x3b,0x80,0x05,0x45,0xb4,0xe2,0x11,0xe9, +0x29,0x8e,0x93,0xff,0x67,0xec,0x62,0xb7,0x9b,0x33,0xc2,0xf0,0xe6,0xf7,0x28,0xbe, +0xd3,0x7f,0x43,0x29,0xb7,0xbf,0x60,0x46,0x4c,0xc7,0x47,0xcb,0x25,0xe4,0x17,0xd6, +0x50,0xaa,0xbf,0x67,0xb6,0x5a,0xb9,0x10,0x65,0xa8,0x07,0x89,0xb6,0x66,0x2f,0xae, +0xda,0x0b,0xd5,0xa1,0xb2,0x0b,0x63,0xfe,0xc0,0x15,0x61,0x14,0xc1,0x67,0x57,0x93, +0xa4,0xc5,0xd7,0xef,0xb9,0x78,0x38,0xf1,0x13,0x30,0x06,0x53,0xe4,0x63,0xdd,0x54, +0xfd,0x54,0x9c,0x53,0x7d,0x88,0xcd,0xae,0x12,0x0a,0x0a,0xb5,0x4e,0xa5,0xed,0x10, +0x0e,0xf9,0x90,0xed,0x2d,0xb2,0xc5,0xbe,0x13,0x31,0xaf,0x79,0x9f,0xa9,0xe3,0x96, +0x23,0xc8,0xfb,0x0b,0x34,0x56,0xf3,0xb6,0xb4,0x47,0xd0,0xef,0x9e,0x47,0x4b,0x19, +0xe6,0x86,0xca,0x79,0x62,0x06,0x44,0xbf,0x93,0x56,0xf3,0x2b,0x20,0x87,0x5c,0x8f, +0x2d,0x5c,0xb8,0x2e,0x62,0x03,0x4a,0xd8,0x46,0xee,0x4a,0xfd,0x30,0x41,0x6f,0xb2, +0x8f,0x42,0x94,0x59,0xbe,0xec,0xe9,0x8a,0x13,0xc2,0x82,0xf6,0xfa,0x64,0x3a,0x68, +0x2b,0x85,0x43,0xbf,0x36,0x7d,0x9b,0x5b,0x4c,0x1a,0x21,0x1f,0x5e,0x41,0x6a,0xad, +0x0d,0x5b,0x95,0xeb,0x33,0xa2,0xd3,0x5f,0x2e,0xc9,0xdb,0xec,0x7c,0xae,0xb7,0xb8, +0x5c,0x65,0xfd,0x93,0xe1,0xdc,0xc3,0xa7,0xa3,0x70,0xa2,0xc7,0xd7,0x7d,0xa4,0x5f, +0x23,0x63,0xd1,0x69,0x56,0xed,0x5e,0xaf,0x66,0x91,0x04,0xd6,0x25,0x5c,0xb4,0xbd, +0x9c,0xd0,0x61,0xd9,0xba,0xac,0x24,0xd0,0xd4,0xbe,0xec,0x1d,0x53,0xe2,0xef,0x17, +0xfb,0x22,0xbb,0xbf,0x5e,0xf7,0x21,0xd0,0xc1,0x6c,0x32,0xc7,0xfd,0xfa,0xe4,0x81, +0x9b,0xd6,0x1f,0x81,0xdf,0x97,0x2d,0xbb,0x60,0x07,0xb6,0x19,0x9f,0x25,0x01,0x56, +0x1a,0x5d,0xbc,0x48,0xdc,0xb6,0xbc,0xb7,0x8c,0x58,0xcc,0xc7,0x5d,0x5a,0x2f,0xc6, +0xa0,0xbf,0x02,0x34,0x9c,0x1b,0xa7,0x67,0x9b,0x6f,0x59,0x78,0xd2,0x7d,0xad,0xbf, +0xd3,0xd5,0x7d,0x72,0x40,0xdb,0x03,0xdb,0x84,0xed,0x5d,0x07,0x43,0x54,0x7c,0xfa, +0x44,0x89,0x9c,0x3e,0xb5,0x17,0xf6,0x73,0x3f,0xb6,0x34,0x2c,0xfd,0x9a,0x76,0xf3, +0x2b,0x6b,0x65,0xf9,0xe1,0x88,0x5c,0xbb,0x49,0xd8,0xc9,0xd8,0x5e,0xeb,0x5e,0xed, +0xcd,0xba,0x03,0xed,0x47,0xf8,0x88,0x39,0xec,0x07,0xed,0xae,0x5f,0xe1,0x2d,0x64, +0xab,0x69,0x6f,0xd2,0x84,0x64,0x6d,0xbf,0x64,0x59,0xdf,0xfd,0xf3,0xf6,0x2f,0xd8, +0x28,0x35,0xd8,0x77,0xe0,0x13,0x60,0xc2,0x85,0x98,0xa6,0x1d,0xf2,0xbd,0x0e,0xc4, +0xba,0x90,0x90,0x66,0x1b,0x48,0xda,0x98,0x4c,0x6d,0x80,0x43,0x9e,0xbc,0x24,0xb9, +0x45,0x8f,0xb0,0xbc,0xcc,0x68,0x4d,0x5b,0x63,0x71,0xc9,0x56,0x9e,0xde,0x90,0x3b, +0xbb,0xdd,0x26,0x23,0xbf,0x42,0x25,0x81,0x87,0xce,0xff,0xff,0xff,0xff,0x3a,0xf3, +0x34,0xaf,0xba,0xef,0xa3,0xd5,0x11,0x53,0x38,0x0f,0xe8,0x20,0xe9,0xe5,0x09,0xf6, +0x76,0xf5,0x0c,0x64,0x22,0x5f,0x66,0x1d,0xa0,0xe2,0xa6,0xd6,0x33,0x84,0x94,0xe9, +0x29,0x4d,0xd5,0x3b,0xb2,0x60,0x2f,0x08,0xa8,0x33,0x83,0x55,0x3b,0x26,0xd6,0x89, +0xbe,0x0b,0x32,0xf3,0x81,0xde,0x88,0xc2,0xf5,0x58,0xe7,0x32,0x70,0x3c,0x21,0x00, +0x06,0x4a,0x63,0xb2,0x92,0xa4,0x41,0xa7,0xff,0x06,0x8e,0x4c,0x46,0x26,0x58,0x6c, +0x01,0x1e,0x08,0xc1,0xa8,0x2d,0xb0,0xd0,0xc4,0x54,0x58,0x65,0x2b,0x98,0x97,0xe1, +0xec,0xa4,0x98,0x5b,0xf5,0x06,0x97,0x1e,0xc3,0x06,0xc2,0xec,0xf0,0x6b,0x64,0xd5, +0xcd,0x25,0xcf,0xbd,0x47,0xea,0xf5,0x99,0x54,0x0a,0xf3,0xf0,0x90,0x87,0xfb,0xf3, +0x0e,0xc2,0x7a,0x28,0x9d,0xcb,0xb5,0x5e,0xc5,0x2a,0x26,0x4e,0xd5,0xde,0x41,0xf0, +0xe0,0x44,0x1b,0xec,0xe6,0x66,0x52,0x90,0x4f,0xab,0x36,0xa3,0xb2,0xb8,0x41,0xf1, +0x54,0xb1,0xda,0x9e,0x3d,0x85,0xbf,0xad,0x86,0xd6,0xec,0x43,0x0a,0xd6,0x75,0x58, +0x99,0x46,0xb5,0x31,0x14,0x8d,0x7f,0xc9,0xc1,0x44,0xa4,0xa3,0x32,0xda,0x43,0xcc, +0x44,0x1d,0xda,0x48,0x9d,0x7d,0x30,0x79,0x58,0x01,0x82,0x0e,0x5e,0xcc,0x42,0x59, +0x2f,0x63,0xf4,0x84,0x73,0x20,0x4a,0x44,0x32,0x4e,0xba,0x3d,0xe0,0x60,0xaf,0xcd, +0xca,0x9e,0x18,0x6e,0xe5,0x27,0x31,0x69,0xcb,0xd7,0x40,0xbe,0xea,0x13,0xdb,0x1e, +0xaf,0x43,0x36,0x2e,0x84,0x4c,0x4c,0x51,0xf8,0x89,0x91,0x83,0x78,0x69,0x91,0xb1, +0x81,0xef,0xfa,0xb9,0xec,0x33,0x6a,0xa6,0x03,0xf6,0x52,0x17,0xd1,0xef,0x20,0xe3, +0x19,0x6e,0xbb,0xb8,0x37,0xbb,0x22,0x7c,0x09,0x0b,0x30,0x31,0x86,0xcc,0x3b,0xad, +0xa6,0xf0,0x5e,0xb2,0xcf,0x3b,0x46,0x9a,0x64,0xcd,0x21,0xc7,0x0b,0xef,0xd4,0x91, +0xda,0x16,0xe6,0xe7,0x0a,0x9e,0xe0,0x35,0xfa,0x6c,0x59,0x4a,0x7c,0xde,0x9b,0xc5, +0x24,0xe5,0xfc,0x94,0x36,0x3b,0x1c,0xb4,0x05,0x14,0xaa,0xcd,0xf2,0x84,0x93,0xd4, +0x25,0xe4,0x86,0x2f,0x90,0x33,0xe4,0x1e,0x73,0x18,0xdd,0xb4,0x3b,0xde,0x54,0x45, +0x81,0x16,0xa5,0x84,0x45,0x3b,0x75,0xa5,0xd1,0x90,0xeb,0xdc,0x7f,0xf0,0x5c,0x16, +0x90,0x49,0xc1,0x2e,0x12,0xbf,0xa0,0x09,0xe3,0xec,0xc8,0xf4,0x73,0x17,0x5d,0xa6, +0x2e,0xc9,0x4f,0xbc,0xcf,0xc7,0x36,0x28,0x5b,0xac,0x85,0x33,0x91,0x09,0xc8,0x2b, +0xdc,0x16,0x94,0x8f,0x1b,0x7d,0x35,0xf8,0x25,0x1b,0x48,0x4c,0x5b,0xd8,0x16,0xfa, +0x98,0x58,0xba,0xca,0x66,0x30,0xad,0x6e,0xee,0xb8,0x74,0x6d,0xfc,0x34,0xbb,0xe6, +0x0a,0xb6,0xa9,0xa0,0x35,0x90,0xd9,0x3a,0x48,0xd3,0x0e,0x39,0xb7,0xdd,0xfe,0x5a, +0x22,0x0e,0x46,0x2e,0x51,0x2d,0xd6,0x17,0xbf,0x01,0x88,0xc5,0x85,0xd1,0xce,0xb9, +0x3b,0x06,0xde,0xbe,0x3f,0x9d,0xf2,0x10,0xce,0x1f,0xd6,0xe0,0x9a,0xd2,0xff,0x5b, +0xaa,0x14,0x46,0x49,0xca,0x0c,0xfc,0x6d,0xee,0x4f,0xc4,0xaa,0x38,0x6e,0xad,0xbf, +0x5c,0x0f,0x5a,0xa2,0x7a,0x5d,0x9d,0x07,0xe8,0x4e,0x4e,0x8e,0x8f,0xf9,0x5e,0x46, +0x3b,0x89,0xed,0x46,0x1c,0xe1,0x0e,0x0a,0x8c,0x9a,0xe0,0x51,0x48,0x8c,0xf3,0x25, +0x03,0x72,0xbb,0x65,0x02,0x20,0xe8,0xc1,0x6b,0x60,0x2b,0x44,0x9f,0x50,0xf8,0x34, +0xfb,0x8b,0x9b,0xf4,0xa8,0x0d,0x49,0x11,0x0c,0xcd,0x8b,0xb4,0xa0,0x4d,0xd8,0x60, +0x92,0x02,0x52,0xfc,0x5d,0xf2,0x01,0xc8,0x2c,0x80,0xc7,0x0e,0x3c,0x32,0x71,0x04, +0x3a,0xc8,0x19,0x34,0xed,0xe4,0xc8,0x9c,0x56,0x89,0xfc,0x9d,0xf7,0x6e,0xe6,0x97, +0x01,0xdd,0x7d,0xa5,0x67,0x0a,0xfc,0xf6,0x4f,0xe9,0x54,0xe4,0x47,0xed,0xf0,0x05, +0xa4,0xc4,0x2b,0xd7,0x77,0x09,0x8e,0x9b,0xc6,0x7d,0x0a,0x85,0x3f,0x97,0x17,0xd7, +0xb7,0x87,0xfe,0xa4,0xe3,0xa1,0x3e,0xf7,0xc3,0xd6,0x7c,0x04,0xaf,0x61,0xd9,0xf9, +0x34,0x05,0xda,0x3c,0x77,0xa7,0xe6,0xd0,0x2f,0x57,0xa4,0x16,0xb7,0x79,0x86,0x89, +0x16,0x81,0xd4,0x18,0xf4,0xa6,0x4f,0x82,0xb1,0x8d,0xc4,0x13,0x45,0xed,0x5d,0x23, +0x65,0x9b,0x23,0x3d,0xfc,0x30,0x24,0xd8,0x48,0x41,0x8d,0x16,0xb6,0x9b,0xab,0x1a, +0x68,0x26,0xf9,0x00,0x61,0xef,0xc0,0xcb,0xec,0x7a,0x5b,0x4c,0xe9,0xa9,0x5c,0x37, +0x83,0x0a,0x6a,0x0b,0xbf,0x26,0x9e,0x82,0xeb,0x8e,0xf3,0x2e,0x16,0x47,0x79,0xdf, +0x2f,0x5c,0x13,0x3c,0x5c,0x12,0x5a,0x36,0x7c,0x19,0xc4,0x53,0xd2,0x6b,0xe7,0x8b, +0xc8,0x8d,0x18,0xad,0x1c,0x86,0xb1,0x95,0xcf,0x8e,0xe6,0x6b,0x5e,0x9c,0x2b,0x7b, +0x9f,0x3f,0x93,0xdd,0x96,0x90,0xc1,0x3c,0x0d,0x8f,0xfa,0x3f,0x97,0x62,0x31,0x79, +0x57,0x90,0xdc,0x82,0x8d,0xf2,0xb4,0x40,0x2c,0xc1,0x8c,0x14,0x78,0x90,0xfc,0x6f, +0x85,0x4a,0x18,0xf4,0xca,0x1a,0xe3,0x2a,0x9d,0xeb,0x83,0x25,0x05,0x5e,0xf8,0xbb, +0xcf,0x9a,0xa7,0xdc,0x15,0x6d,0x31,0x17,0x93,0x26,0x05,0x12,0xd0,0x9e,0x9c,0x17, +0xae,0xe8,0xd5,0x93,0x0c,0x36,0x66,0xb3,0xe3,0x79,0x2e,0xcd,0x3f,0x82,0xdc,0x3d, +0x15,0xb9,0xae,0xd3,0x16,0xb9,0x2f,0xe2,0x1d,0x54,0xf5,0xa6,0x6a,0x5f,0x91,0x15, +0x21,0x77,0xfd,0xb9,0xb5,0x9d,0xc5,0xac,0x61,0x95,0xa2,0xdf,0x88,0x5e,0xdd,0x2d, +0xb6,0xdb,0x65,0xd6,0xc6,0x18,0xda,0x8c,0x3b,0x0a,0x64,0xe2,0x76,0x36,0xd2,0x93, +0xeb,0x94,0x90,0xb5,0xf4,0x08,0x6c,0xb4,0xd4,0x49,0x6c,0x08,0x1e,0xc6,0x8a,0x62, +0x89,0xd5,0xb4,0xee,0xd7,0xfc,0xf6,0xb5,0x46,0x0c,0xc8,0x97,0xf3,0x55,0xee,0x0f, +0x25,0x93,0xd0,0x99,0x9c,0x26,0xad,0x84,0x72,0x2c,0x71,0xce,0xfd,0xe6,0x41,0xb2, +0x45,0x0b,0x99,0x6d,0xde,0x5f,0x67,0xb0,0x90,0x4e,0x24,0x3c,0xdd,0x57,0xa9,0xe8, +0xdd,0xd4,0x1b,0xfd,0x46,0x10,0x74,0x3f,0xa3,0xc6,0x81,0x86,0x9c,0xff,0x77,0x46, +0xa9,0xed,0x9e,0xac,0x7f,0x9c,0xb6,0x7e,0x99,0xd6,0xec,0xea,0x5f,0x7c,0xd9,0xba, +0x5c,0x9d,0xd6,0x0e,0xc4,0xb2,0x76,0xe6,0xe8,0xcc,0x9e,0xbf,0xc4,0xf0,0x47,0x5f, +0x5a,0x64,0x9f,0x4d,0xb7,0x01,0xb3,0x6f,0xa0,0xe1,0xc9,0xc6,0xdd,0x1e,0x30,0xdf, +0xa9,0xdf,0xd7,0x8f,0xb7,0xb0,0x97,0xc7,0x0e,0xc4,0xf5,0xfb,0x5c,0x52,0x91,0xf2, +0x21,0xe0,0xbd,0x44,0x52,0x62,0xd0,0x2c,0xf9,0x48,0xb6,0x42,0xbb,0xc3,0x02,0x14, +0xa2,0xac,0x48,0x0c,0x33,0x63,0xd8,0x28,0x63,0x03,0x34,0x47,0x37,0xc7,0x61,0x40, +0x7b,0x0f,0x04,0x0e,0x5a,0x2d,0xd1,0xa5,0x90,0xde,0x90,0x43,0x3b,0xa1,0x1c,0xa3, +0x7e,0x63,0x08,0x33,0x97,0x53,0x98,0x17,0xc7,0x33,0x49,0xc6,0xb7,0xce,0x16,0x7e, +0x2c,0xf1,0xa1,0xe4,0xc4,0x9b,0xf3,0x56,0x9e,0xa1,0x67,0x16,0xb9,0xf5,0xfb,0xe5, +0xff,0x16,0xb6,0xfd,0xfa,0x36,0x6a,0x74,0xc6,0x53,0xa0,0xf0,0x40,0x1b,0x13,0xc5, +0xd2,0x53,0xff,0xec,0xfa,0xd1,0x0f,0x52,0xc6,0xed,0xb1,0x25,0xc3,0xeb,0x32,0xaa, +0x85,0x47,0x9f,0xeb,0x78,0x34,0xf8,0x6b,0x5f,0xf3,0x87,0xcd,0xc3,0x18,0xdd,0xf7, +0x2c,0xa5,0xc3,0x4c,0x58,0xb4,0x53,0x68,0x08,0xd4,0xc4,0xbf,0x72,0xc7,0x9a,0xe5, +0x68,0x4b,0x0d,0x19,0x66,0x09,0x4d,0x7f,0x93,0x41,0xb3,0xc3,0xb8,0xca,0x92,0x38, +0xb0,0xf5,0x89,0x05,0x49,0xbd,0x19,0x28,0x19,0xe7,0xc5,0x5e,0xba,0xeb,0x44,0x4d, +0x0b,0x43,0x1b,0x04,0x60,0xa2,0x9c,0x42,0x36,0x09,0x4f,0xc3,0x54,0x96,0x2f,0x36, +0x8b,0x01,0xfc,0xf9,0x70,0x9b,0x0c,0x67,0x04,0x02,0x0b,0x2e,0xa1,0xf7,0x1c,0x67, +0x6d,0x4f,0x9c,0xe6,0xf0,0xee,0x60,0x8b,0x8d,0xe2,0xd3,0x85,0x4b,0xf6,0xfc,0x0b, +0x2b,0xdb,0xbd,0xf8,0x73,0xed,0x32,0xc9,0x1c,0xf1,0xb0,0x92,0xdc,0x4e,0x48,0x77, +0x08,0x02,0x7c,0xf4,0x6f,0x3c,0xbd,0x88,0x01,0x5f,0xdb,0x80,0xdb,0xb4,0x0c,0x9f, +0x29,0x52,0xa4,0x00,0x03,0x98,0x3f,0xdb,0x08,0xc3,0xaa,0x14,0xba,0xb3,0xcc,0x88, +0x41,0xa5,0x34,0x67,0x03,0x37,0xb0,0xcf,0xab,0x6b,0x94,0xac,0x98,0xb2,0x06,0xb1, +0x7c,0x81,0x3d,0x76,0xde,0x22,0xea,0xd3,0xce,0x8d,0xab,0x00,0x3a,0xd1,0x5a,0xfe, +0x80,0x91,0xad,0x4d,0xb7,0x43,0x47,0xb3,0x52,0x8a,0x8f,0x4a,0x1a,0xf0,0x26,0xde, +0xf4,0xe0,0xbb,0x26,0xb0,0x1c,0xd0,0x26,0xf0,0x57,0xdc,0x53,0x93,0x7b,0x2f,0xd4, +0xdf,0x51,0xb4,0x56,0x30,0x93,0x09,0xe3,0x95,0x46,0xbc,0xb4,0x7d,0x78,0xa2,0x32, +0x78,0xbd,0x61,0xa7,0xf3,0x16,0xb6,0x1a,0x2a,0xa1,0xb5,0xa5,0x4c,0x79,0xfe,0xd6, +0x77,0xd2,0xf5,0x26,0x8f,0x9a,0x7b,0x4a,0x8d,0xf3,0x97,0x2a,0x50,0x7a,0xb5,0x34, +0xd4,0xeb,0xf3,0x7d,0x9b,0x39,0x77,0x68,0x74,0x1a,0xa8,0x1d,0x1a,0x87,0xce,0x9c, +0x19,0x75,0xf0,0x38,0x9d,0xf9,0x3c,0x3c,0x7d,0x64,0xcc,0x2f,0x5b,0xd4,0x5c,0x89, +0xd3,0x7a,0xb5,0x9e,0x1b,0x19,0x14,0x1c,0xee,0x0a,0xe9,0x08,0x75,0xd7,0x35,0x06, +0x42,0xe8,0xb5,0x38,0xc0,0x32,0x17,0x3d,0xef,0xcb,0x4b,0x2e,0x85,0x71,0xe1,0xff, +0x41,0xb9,0x57,0x8b,0x34,0x35,0x25,0x5c,0xa2,0xdf,0x9c,0x53,0xd9,0x7a,0xe6,0x52, +0xbf,0x89,0x5f,0x0c,0x33,0x92,0x64,0x0b,0xa1,0xf6,0x20,0x1e,0x10,0x99,0xc7,0x38, +0x4a,0x5e,0x03,0xbe,0x86,0x97,0xb5,0xfa,0x80,0xb8,0xdb,0xea,0x5b,0xf4,0xea,0xc2, +0xc0,0x6b,0xdc,0xae,0x8f,0xb5,0x3d,0xfd,0x17,0x1b,0xdb,0x7f,0xf8,0xf9,0xe6,0x60, +0xfb,0x0c,0xa2,0x66,0x10,0x84,0xb5,0xa0,0x86,0xc0,0xd6,0x86,0xa1,0x46,0xf9,0x0d, +0x3b,0xfd,0x83,0x69,0xc4,0x1c,0xb9,0x59,0x44,0x63,0x6a,0x06,0xc4,0x1e,0x6b,0x1e, +0xa0,0x56,0xb8,0xfa,0x94,0xe3,0xf1,0x2f,0x04,0x80,0x26,0x67,0xd2,0x4f,0x16,0x5c, +0x4d,0x79,0xb1,0x87,0xa6,0xbb,0x06,0xb7,0xd9,0x17,0x83,0x86,0xbf,0x3c,0x9f,0x80, +0xa7,0x5b,0xd7,0xf3,0xe5,0xaa,0x0e,0xf0,0xba,0x80,0xd8,0xe2,0x4f,0x17,0x84,0xd2, +0xfb,0xa5,0x4f,0x7a,0x95,0xaf,0xdf,0xed,0xac,0x73,0xfe,0x4e,0xbe,0x74,0xa1,0x46, +0xe7,0xc7,0x89,0xc1,0x6a,0xe7,0xc2,0x64,0x12,0x10,0x4e,0x3b,0xf7,0xc4,0xc5,0x11, +0x04,0x53,0x0f,0x35,0x75,0xf2,0x27,0xe9,0xc3,0x13,0x55,0xe5,0xdb,0xef,0xf1,0x19, +0x2d,0x7b,0x1a,0xfd,0x72,0xb8,0x50,0x2a,0x4a,0x58,0x5e,0x5d,0x3e,0x1e,0x71,0x1a, +0x76,0xc9,0x8a,0xd3,0x1b,0xd9,0xfa,0x37,0x5f,0xc1,0x38,0xce,0x16,0x78,0x90,0xd6, +0x70,0x83,0x1b,0xfc,0xae,0xac,0x63,0xaf,0xd8,0x8f,0x8d,0x8a,0x0a,0xe2,0xeb,0x1f, +0xbd,0x5f,0xde,0xee,0x3e,0xa9,0x39,0x61,0x8c,0x8b,0xc2,0x4d,0x7a,0x87,0x30,0x55, +0x64,0x38,0x63,0xcc,0x1d,0x2a,0xc0,0x75,0xa2,0x63,0x1e,0xec,0x57,0x01,0x14,0xcc, +0xe4,0x6b,0x75,0x3e,0x4b,0xab,0xd2,0xf0,0xdb,0x59,0x01,0xfc,0x5c,0x6b,0xc3,0x51, +0x02,0x03,0xdb,0xb0,0x32,0xa3,0x45,0x9a,0x2e,0x8e,0xa9,0x95,0x7d,0xea,0x35,0xc8, +0x9f,0x20,0xe7,0xd8,0x3e,0x25,0xde,0x60,0xa4,0xbb,0xc5,0x53,0x7c,0xe9,0x1e,0x1c, +0xcf,0x43,0xe0,0xfc,0x5c,0xbd,0xe2,0x26,0x34,0xd3,0x36,0xb5,0x08,0x93,0x13,0xa3, +0x5f,0x6e,0x96,0x26,0xbc,0xf3,0xb9,0x3a,0x64,0x51,0x82,0x06,0xbf,0xf2,0x7a,0x82, +0x45,0x0d,0xb7,0xfe,0x5f,0xf6,0xf5,0xaf,0x40,0x90,0x93,0x07,0x96,0x9e,0x17,0x36, +0x52,0xff,0xae,0xb5,0x86,0x57,0x16,0xe3,0xa5,0x4f,0xc3,0x07,0x1c,0x90,0x20,0x04, +0xb4,0x97,0xe0,0x39,0xdf,0xc5,0xc7,0xe5,0xb2,0x02,0xcc,0x54,0x89,0x3b,0x8e,0xc1, +0x4d,0x73,0xd2,0xfa,0x5f,0xb8,0xfc,0x03,0xb5,0x95,0xb4,0x65,0x9e,0x84,0x86,0x38, +0x6e,0x15,0xaf,0x39,0x36,0x46,0xd2,0x7c,0x8d,0x60,0x35,0xbb,0x6d,0xf0,0x57,0x20, +0x6d,0x3c,0x12,0xa6,0x8b,0x3d,0xde,0xc5,0x3b,0x32,0x85,0x75,0xf4,0x71,0x99,0x19, +0x3b,0x13,0x86,0x93,0xcd,0x19,0x08,0x12,0xe1,0x6e,0xd0,0x93,0x97,0x9b,0x66,0x97, +0x2b,0x09,0x0e,0xec,0x5f,0x95,0x1b,0x29,0xce,0x9b,0xee,0x4d,0x1b,0x54,0x07,0x61, +0xd9,0x8c,0x9f,0xbf,0xe1,0x15,0x3f,0xb2,0xea,0xaa,0x1b,0xdc,0x9a,0x5c,0x04,0x1f, +0xb9,0x1f,0x6f,0x87,0x1d,0xa0,0xbe,0xa9,0xeb,0x8b,0xe9,0x2c,0x81,0x54,0x04,0xce, +0xd2,0xd8,0x66,0x3d,0x4e,0x11,0x28,0xd9,0x6a,0x77,0x8e,0x6c,0x7f,0xe4,0xc9,0x45, +0x44,0x2b,0x90,0xf3,0xd6,0x2c,0xdf,0xe0,0xf3,0x69,0x56,0x5d,0x00,0x3d,0xd4,0xcc, +0x7a,0x48,0x72,0x1f,0xb6,0x46,0x45,0xef,0x6b,0xc8,0xad,0xee,0x5d,0xbf,0xef,0x2a, +0x7d,0xdf,0xf7,0x36,0xb9,0x45,0x21,0xf4,0xa9,0x91,0x3f,0x26,0x3d,0xbe,0x50,0x0d, +0x7b,0x4c,0xd9,0xab,0xb5,0x81,0x70,0x3e,0x62,0x4d,0x91,0x26,0x54,0x0c,0x58,0x80, +0x7d,0xba,0x30,0xef,0x22,0x56,0x40,0xb1,0x72,0x2b,0x9f,0x8f,0x11,0x24,0x43,0x85, +0xab,0xdc,0x9d,0xe3,0xa3,0x85,0x09,0x5c,0x29,0x28,0x45,0xef,0x23,0x5d,0x0a,0xe9, +0x81,0xf8,0x31,0x52,0x4b,0x2b,0xa1,0xd1,0x91,0x42,0xf9,0x37,0x84,0x6e,0xe1,0xe0, +0x9e,0x27,0xb9,0x22,0xf9,0x55,0xe9,0xfa,0x43,0xf5,0xe8,0x9f,0xdf,0x99,0x19,0xd2, +0x83,0x4a,0x8e,0x79,0xfa,0x54,0xbb,0x8a,0xce,0xe8,0x75,0x0b,0xce,0x3a,0x6c,0x3e, +0x1b,0x4a,0x8b,0x58,0xb3,0xe5,0x6b,0xfe,0x39,0xcb,0xb6,0x9a,0x27,0xf0,0x71,0xa0, +0x20,0x57,0x83,0x48,0xb2,0xe5,0xce,0xea,0x32,0xce,0xee,0x4c,0x23,0xf6,0xdb,0xf4, +0x88,0x4a,0x83,0x7e,0xbf,0x38,0x86,0x21,0x6a,0x59,0x56,0xa9,0x1b,0x9b,0x8f,0x8f, +0x36,0xd6,0x5e,0xa3,0xe6,0xc9,0x4a,0x98,0x51,0x4f,0xe7,0x57,0x2d,0xb6,0x4d,0x8d, +0x7d,0x48,0x7b,0x05,0x3f,0x66,0x91,0x09,0xf4,0x2a,0x83,0x4f,0xdc,0xe7,0xcb,0xb9, +0x6e,0x65,0xb1,0xe3,0xaa,0x5c,0xb8,0x78,0x68,0x4d,0x83,0x2c,0x56,0xed,0x70,0xb7, +0xfe,0x03,0x92,0x69,0x1e,0x05,0x72,0x82,0xa3,0x9d,0x65,0x45,0x5c,0x4f,0x72,0xa2, +0x86,0x90,0xdf,0xd8,0x6e,0x58,0x1b,0x90,0x83,0x00,0x0c,0x78,0x72,0x71,0x7e,0xcd, +0xf0,0x70,0xae,0x3f,0x61,0xdb,0x49,0x6b,0x58,0x44,0xa8,0xeb,0xb4,0x6d,0x51,0x5b, +0x49,0x6b,0xab,0x1a,0xaa,0x22,0x20,0x71,0x6e,0xf0,0xc7,0xba,0xdd,0xdc,0x00,0x73, +0xa2,0xc4,0xbf,0x43,0xee,0x38,0xd4,0x69,0x77,0xab,0x6c,0x4c,0x8a,0x3d,0x54,0x80, +0x8d,0x1c,0xd5,0x33,0x94,0x6e,0x7c,0x87,0x40,0xda,0xdd,0x52,0x61,0x3c,0xab,0xe3, +0xc1,0xca,0x01,0xff,0x6e,0x4d,0x91,0x25,0x9c,0x43,0x0e,0xc5,0xbe,0xff,0x17,0x83, +0x80,0xc3,0x30,0x52,0x27,0x39,0x36,0x53,0x82,0xb8,0x62,0x72,0x33,0x73,0x79,0x44, +0x54,0x14,0x8e,0x26,0x11,0x74,0x37,0xa0,0x4c,0xd9,0x2b,0x9a,0xff,0x82,0x56,0xd2, +0xe1,0x71,0x0c,0xa8,0x65,0xc1,0xa7,0xb7,0x8a,0x76,0x83,0xf5,0x8f,0x44,0x7d,0x3b, +0x2f,0x8b,0xd9,0x0e,0x4e,0x07,0xb2,0x1e,0x03,0x80,0xdd,0xe1,0x72,0x06,0x05,0xe1, +0x4a,0x34,0x5c,0x51,0xac,0x2a,0xba,0x8f,0x82,0x53,0x1d,0x89,0x4f,0xd7,0x66,0x96, +0xb9,0x15,0x01,0x7c,0x30,0x24,0xd6,0xa5,0xba,0x23,0x9e,0xb9,0x85,0xfe,0x6e,0x86, +0xe4,0x14,0x0e,0xdb,0x17,0x27,0x1a,0x3c,0x22,0xac,0x4e,0x54,0x83,0xa4,0x05,0x6b, +0x8b,0xda,0xb8,0xc7,0xa8,0x3e,0x6c,0x45,0x14,0xa1,0x90,0x6d,0xfc,0x34,0x0d,0x7b, +0x2b,0xcf,0xf4,0x63,0x39,0x2a,0x25,0x3b,0x3d,0x58,0x67,0x99,0xca,0xec,0xa1,0xb6, +0x4b,0x18,0x06,0x70,0x6e,0xb7,0x2f,0x9b,0x48,0xd5,0x1a,0xee,0x3e,0x3e,0x6e,0x52, +0x2a,0xdf,0xd8,0xf1,0xd0,0x4c,0x07,0xef,0xce,0x82,0xa6,0x0c,0x1a,0xdc,0x3e,0xba, +0x88,0x97,0x38,0x2f,0xd9,0x31,0x77,0x63,0xe9,0x8c,0x04,0xf1,0x13,0x4f,0x72,0x5d, +0xdd,0x1f,0x85,0x3f,0x98,0x04,0x5e,0x9f,0x14,0x62,0xca,0x17,0x12,0x0e,0x40,0x1c, +0x95,0x8d,0x58,0x04,0x2d,0x57,0x93,0x1f,0xe7,0x81,0xb3,0x66,0x44,0x6d,0x86,0x70, +0xc7,0x59,0x88,0x72,0x62,0x71,0x60,0x7f,0xc7,0x15,0x03,0x34,0x49,0xfa,0x43,0x23, +0x06,0x56,0x5a,0x17,0xe3,0x12,0x0f,0x42,0xa5,0xe2,0xe8,0x9d,0x73,0xf2,0x21,0x06, +0xe6,0x5b,0x93,0xec,0xf6,0x53,0xae,0x51,0x87,0xcc,0xce,0x51,0x2a,0x8d,0x28,0xde, +0xef,0x75,0xe2,0xa4,0x5e,0xce,0x4d,0xe6,0x3c,0xba,0xda,0xe2,0x20,0x25,0x11,0x21, +0x73,0x0c,0xfe,0x7f,0xfc,0xe1,0x00,0xf0,0xca,0xfc,0xc5,0xf2,0x21,0x24,0x86,0x3d, +0xe7,0x82,0xfd,0x8c,0xf5,0x9c,0x4a,0x81,0x6a,0x7b,0xb9,0x6f,0xd0,0x55,0x49,0xd9, +0x86,0x85,0xd3,0xe7,0x1a,0x08,0x41,0x93,0xc3,0x89,0xf1,0x46,0x23,0xfd,0x5a,0x2d, +0x6f,0x0c,0xb5,0xfd,0x98,0x25,0x6a,0x6f,0xb7,0x53,0xd0,0x36,0x5d,0x28,0xae,0xfc, +0x0b,0xf9,0x92,0xe4,0x3c,0x31,0x77,0xf6,0x36,0xc9,0x6a,0x1a,0xa0,0xe2,0x5b,0xe3, +0xdc,0x01,0xf1,0x4d,0x77,0xce,0x53,0xd6,0xc4,0x88,0x89,0xa7,0x7b,0xa6,0x99,0xbb, +0x91,0xcb,0x07,0x60,0x4f,0xd4,0x60,0x19,0xb2,0xeb,0xb9,0xd7,0x27,0x36,0x5f,0xce, +0x74,0xf2,0x46,0x3c,0xbd,0x27,0x23,0x82,0xde,0x8e,0xc5,0xa7,0xdc,0x80,0x0a,0x08, +0x67,0x80,0x39,0xc2,0xfe,0xa2,0x7a,0x18,0xf8,0xa8,0x34,0xb9,0x8d,0xe5,0x59,0xa9, +0x22,0x81,0x68,0x7e,0xa6,0xec,0xa0,0x0e,0xc8,0x1d,0xe8,0x0d,0x2d,0x43,0x33,0x5f, +0x08,0x9c,0xf7,0x94,0x76,0xde,0x43,0xbc,0x15,0x92,0xfe,0x04,0x9d,0x79,0x8a,0xe0, +0xdb,0xf5,0xc4,0xc4,0x20,0xbd,0x4c,0x64,0x78,0xcb,0x0c,0x86,0x99,0x90,0xca,0x7f, +0x92,0xd3,0x97,0x51,0xa3,0xb9,0x67,0x50,0xe7,0x05,0xcf,0xd0,0x8a,0x9f,0x1d,0xdc, +0xa2,0xe2,0x5c,0xc0,0x66,0xcd,0x36,0x45,0x66,0x06,0x0d,0xb7,0x53,0xe9,0x7d,0x65, +0x27,0x47,0xab,0xf5,0x0a,0x2e,0x10,0x51,0xd6,0xc1,0xdf,0xb3,0xf4,0x83,0x5e,0x20, +0x8a,0x9b,0xf4,0xe3,0x08,0xb2,0xb4,0x5e,0x66,0x09,0x0c,0xf7,0x4e,0x59,0x34,0xda, +0xa5,0x19,0xba,0x52,0x4d,0x39,0x1c,0xb5,0x24,0xd8,0xb4,0xf2,0x7e,0x6a,0x05,0x85, +0xea,0x9b,0xc5,0x21,0x17,0xbf,0x0d,0xc4,0x1b,0xd9,0xe0,0xa0,0x34,0x06,0xff,0xb1, +0x84,0xd7,0xd5,0x2d,0x1b,0xba,0x25,0xfb,0x65,0x5b,0x6d,0xd7,0xb7,0xb7,0x55,0xe8, +0xd3,0xda,0x43,0x61,0x0f,0xdf,0x8e,0x28,0xb8,0x4f,0x09,0xfe,0xfc,0xb7,0xee,0x47, +0x7d,0x62,0xcd,0x5e,0x65,0x32,0xe1,0xbb,0x6b,0x73,0xe8,0xf8,0x5b,0xb8,0xad,0xe9, +0xd3,0xba,0x1f,0x75,0x01,0xd4,0x4f,0x8f,0xdb,0x2f,0x8a,0xcf,0xf8,0xb4,0xaf,0x9f, +0xd1,0x8a,0xab,0xd5,0x44,0xa7,0x88,0x9f,0x0c,0xe4,0x9c,0x83,0x25,0x0a,0x8e,0x62, +0x1d,0x58,0x99,0x89,0xc3,0x0a,0xe4,0x88,0x4d,0x9c,0xd2,0x34,0x5c,0xcc,0x39,0x15, +0x8e,0xc2,0x90,0xe6,0x39,0x0e,0xee,0x88,0x84,0xec,0x9e,0xa1,0xdc,0xf0,0xa7,0x77, +0x83,0xdc,0x99,0xf6,0x4b,0x28,0x9f,0x43,0x4a,0xcd,0x35,0x4f,0xb6,0x9c,0xdb,0xb9, +0x20,0x29,0xd2,0xbd,0x4c,0xda,0x25,0x8b,0x87,0xee,0x8d,0xfa,0xf3,0x91,0x20,0x01, +0x8d,0x08,0xe9,0x77,0x64,0x23,0x70,0x64,0xc0,0x4d,0x28,0x34,0xf7,0x0e,0x0d,0x56, +0x49,0x1a,0xee,0x29,0xfa,0xd0,0x5c,0x56,0x20,0x61,0xa6,0xf5,0x30,0x65,0x81,0x02, +0x53,0x4e,0x3f,0x9c,0x1d,0xaf,0x1b,0x23,0x63,0x59,0xaf,0x84,0x1a,0x28,0x99,0x77, +0xa0,0x43,0xb3,0x86,0xe5,0x8c,0x41,0x98,0x43,0x4b,0xe0,0x46,0xf3,0xea,0x32,0x48, +0x02,0x0c,0x1e,0x9f,0x6d,0x64,0xc6,0xbe,0x43,0x86,0x01,0xe6,0xd2,0xac,0x9a,0x49, +0x6b,0x08,0xae,0xd6,0x93,0xdc,0x4e,0xd1,0xa8,0x66,0xf8,0x34,0xf0,0x61,0xc1,0x02, +0x14,0x00,0x01,0x78,0xa2,0x0b,0x57,0x58,0xa1,0x99,0x8b,0x9a,0x71,0x60,0x95,0x12, +0xd9,0x2b,0xf1,0xb5,0xc7,0x8a,0x03,0x8e,0xa9,0x44,0xd8,0x84,0xaa,0x73,0x26,0xd2, +0x2a,0xea,0x11,0xcb,0xf1,0xd9,0x3a,0x4a,0xbf,0x2d,0xb2,0xa6,0x59,0x18,0x32,0xaa, +0x05,0x69,0x4a,0xc5,0xe0,0x21,0xec,0x4a,0xea,0x4f,0xce,0xf8,0x6a,0xcf,0x47,0x8b, +0x55,0x05,0xe5,0xac,0x71,0x29,0x2b,0xd6,0x4a,0x42,0xb5,0x8d,0xd3,0xce,0xe7,0x1b, +0x81,0x67,0x09,0x0e,0xed,0x28,0x13,0x8b,0x68,0xd4,0xa5,0x99,0x7e,0xc0,0xd4,0x0b, +0x68,0x20,0x4d,0xfe,0x1e,0x1c,0x2c,0xc8,0xa3,0x9d,0xf2,0x69,0x31,0xd5,0xd6,0x1b, +0x68,0x21,0x6c,0xbe,0xf8,0x48,0x42,0xf5,0x4d,0xac,0xcf,0x1c,0x43,0x6b,0x4f,0x0a, +0xc1,0x22,0xa3,0x4f,0xea,0xa5,0x4b,0xf4,0x23,0xbf,0xf6,0x1e,0xa3,0xc7,0xe9,0xdd, +0xe7,0x03,0xb3,0xd9,0x82,0x00,0xe5,0x1b,0x29,0x6f,0xfb,0x45,0x32,0xd6,0xec,0x84, +0xa5,0x90,0xfc,0x80,0x36,0xb0,0x6c,0xd2,0x9b,0xaf,0xea,0x9d,0x85,0xd3,0x88,0x72, +0xa3,0x59,0xb4,0x6b,0xf9,0x80,0xd9,0x94,0x88,0xf8,0x4c,0xb7,0x90,0x30,0x65,0xc5, +0xe7,0x99,0xaa,0xe7,0x47,0x57,0xd5,0xfc,0x00,0x1e,0x86,0x56,0x80,0xd2,0xc4,0x73, +0x23,0x5b,0x2d,0x86,0xc1,0x57,0x45,0xb4,0xe7,0x89,0xa3,0x69,0xd2,0x33,0x53,0x44, +0x4e,0xb1,0xfc,0x94,0x36,0x3b,0x6c,0x52,0x32,0x54,0x64,0x93,0x7c,0xab,0x32,0x71, +0xd6,0xb6,0x5b,0x36,0xb1,0x31,0x3c,0x44,0xb6,0xf4,0x75,0x8a,0xe6,0x80,0xbe,0xbe, +0xca,0x35,0xfd,0x37,0x30,0x32,0x5d,0xe5,0x4b,0xf0,0x61,0x87,0xfc,0x09,0x1d,0x22, +0x81,0xba,0x94,0xb7,0x4c,0x33,0x65,0x14,0x6a,0x9a,0x8b,0x8a,0xdd,0xd1,0x1e,0x78, +0x57,0x17,0xbe,0x76,0x94,0x35,0xcf,0x2c,0x27,0x38,0xba,0x07,0x7e,0x82,0x6e,0xdc, +0x26,0x14,0x5d,0x6f,0x4d,0x57,0x1f,0x5a,0xec,0xd9,0xca,0xcf,0x6e,0x06,0xb3,0x79, +0x57,0x15,0x10,0x7e,0xc4,0xa7,0x77,0xe9,0x27,0xd1,0xd2,0xb3,0xda,0x8e,0x05,0x98, +0x0a,0x1d,0xb1,0xa0,0x73,0x32,0x8f,0xa7,0x99,0xaf,0x46,0xbd,0x02,0xe0,0xd5,0x28, +0x67,0xbc,0x80,0x8a,0x28,0x3a,0x7a,0x86,0xe3,0x01,0xee,0x12,0x87,0xcd,0x70,0xe4, +0x0a,0xbd,0x35,0x3e,0x9a,0xb7,0x62,0xf1,0xc2,0xfe,0xe1,0xcd,0xda,0x82,0x50,0x4d, +0xc6,0x12,0xe7,0xf1,0x1b,0xb4,0x7b,0x97,0x63,0x01,0xa8,0x93,0x88,0xe1,0x8f,0xec, +0x60,0x17,0xb0,0x3f,0x1a,0xb0,0x63,0x38,0x42,0x26,0xe4,0x79,0x8d,0x84,0x28,0x06, +0x8c,0x1e,0x86,0x3b,0x3e,0xcc,0x84,0x40,0xc9,0x36,0xc8,0x22,0xbd,0xa3,0x92,0xf2, +0x01,0xa5,0x96,0x4f,0x74,0xa5,0x87,0xda,0x41,0x1d,0x18,0x45,0xf6,0x62,0x89,0x96, +0xb7,0x16,0x9f,0xa6,0x5e,0x7a,0xce,0x59,0x12,0x1d,0x83,0x17,0xf5,0x4d,0x80,0xb3, +0xd1,0x81,0xd0,0x64,0xb7,0x2a,0x95,0xb6,0x10,0xa1,0x0f,0xc4,0x59,0x4e,0xa0,0x77, +0xcd,0x8c,0xda,0xb9,0x10,0x55,0x32,0xe6,0x2a,0x29,0x88,0x94,0xfa,0xeb,0xfe,0x61, +0x01,0x64,0x7f,0x7e,0x6c,0xa5,0x2c,0x4c,0x65,0x87,0x2a,0x79,0x39,0x50,0x3f,0x52, +0xfe,0xc4,0xf0,0xba,0x9a,0xe4,0x2b,0x13,0x65,0x33,0x61,0x78,0xbc,0x52,0x71,0xd7, +0xeb,0x59,0xb2,0x37,0xe8,0x87,0xf6,0x12,0x3b,0xe4,0xfc,0x48,0xc7,0xa5,0xca,0x8a, +0x3f,0x9a,0x82,0x84,0x1f,0x50,0x5b,0xc1,0xb3,0xce,0xe2,0xcc,0xf0,0x45,0x52,0xf2, +0x17,0xc4,0xb9,0x19,0xf4,0xf3,0x8e,0x45,0xee,0xcf,0xe4,0xdc,0x59,0x6c,0x9b,0x89, +0xae,0xba,0x85,0x36,0x18,0x0e,0x3b,0x99,0x39,0xc5,0xe7,0xcd,0x35,0xb0,0x4b,0xbb, +0xd1,0x84,0xe9,0xcf,0x6a,0x00,0x33,0x8c,0xae,0xeb,0x08,0xdd,0xb5,0x5a,0x6a,0x22, +0x46,0x3d,0x22,0xaa,0xad,0xa8,0xc1,0xca,0x48,0x76,0x3d,0x12,0x87,0x11,0xaa,0x6f, +0x54,0x20,0xeb,0xdc,0x9f,0x7c,0x84,0x5e,0x87,0x74,0xc5,0x4f,0xfe,0x12,0x5d,0x87, +0xee,0xae,0xfb,0x89,0x8c,0xe0,0x10,0x7a,0xb6,0xeb,0xdc,0x35,0x2b,0x72,0xfc,0xbb, +0x90,0x2f,0xd3,0x0f,0x97,0xa0,0x6e,0xf9,0x4f,0xc7,0xc0,0xfb,0xa9,0x14,0x28,0x85, +0x85,0x18,0x9a,0x5b,0x32,0x0a,0x23,0xd0,0x8f,0x93,0xb4,0x22,0x7c,0x9e,0xe8,0xf0, +0x64,0xd1,0xe6,0x94,0x7f,0xdd,0x71,0xf2,0x61,0xf4,0x0b,0x17,0xac,0x8c,0x65,0x61, +0x26,0x9a,0x9a,0xc7,0xf4,0xa9,0x0b,0x07,0x69,0x74,0x12,0x9a,0x00,0xf1,0x55,0xf1, +0xe4,0x13,0x97,0x04,0x94,0x4c,0x90,0xc0,0xf2,0x6c,0x92,0x4f,0xf5,0xb1,0x31,0xd3, +0x5e,0x1f,0x84,0xc4,0x4a,0xbb,0x48,0x1e,0xcf,0x60,0x0f,0xc1,0xd7,0x0b,0xac,0xe7, +0xf0,0x9f,0x63,0xd4,0x03,0x4e,0x40,0x61,0xe2,0x97,0xf4,0xe2,0xa2,0xa8,0xe5,0x47, +0xca,0xda,0xdf,0x38,0xb0,0x97,0x49,0x65,0x61,0x94,0x19,0x68,0x03,0xa0,0x6b,0x57, +0xcb,0x39,0x69,0x53,0xcb,0xa6,0x41,0x60,0x06,0x28,0x56,0xa8,0x4a,0x0b,0x5e,0xe8, +0x6d,0x99,0x9c,0x1d,0x63,0x67,0x6d,0xaa,0x53,0xdb,0xb2,0x69,0xa4,0x29,0x56,0x18, +0x28,0xbd,0x15,0x1a,0x66,0x04,0x6b,0xbe,0x91,0x68,0xa9,0xf9,0xbf,0xe9,0x5f,0xe9, +0xed,0x92,0x0b,0xfc,0xc0,0x4c,0x69,0x03,0x98,0x71,0x8d,0x5c,0x84,0x57,0x17,0xcb, +0xa5,0x94,0xe7,0x8e,0x8e,0x53,0x8c,0x83,0xeb,0xc3,0xf7,0xe1,0x14,0x4a,0x6e,0xe2, +0x66,0x2d,0x26,0x26,0x3e,0xba,0xb6,0x37,0xf3,0x51,0xc8,0x5a,0x16,0xec,0xae,0xef, +0x74,0x30,0x96,0x5a,0x58,0xc3,0x42,0x69,0x10,0xbd,0xe8,0xf7,0x94,0xcd,0x59,0x07, +0xc6,0x93,0xaf,0x58,0xdd,0xae,0x88,0x6f,0xb1,0xe9,0x89,0xe7,0x17,0x1d,0xf8,0xbb, +0xe7,0xdd,0xcf,0x4a,0xb9,0x35,0xbf,0xc6,0xdf,0x9d,0x7f,0xbf,0xff,0xff,0x60,0x52, +0x64,0x0d,0xff,0x77,0xb3,0x73,0xef,0x67,0xc2,0x4c,0xc9,0x7f,0x56,0x82,0x36,0xd5, +0x22,0x41,0x41,0xf6,0xf1,0x85,0x78,0x72,0xb8,0x4c,0xa5,0x76,0xf0,0x3c,0x59,0x05, +0x88,0x5f,0xfa,0x76,0xe8,0x86,0xaa,0x43,0x1e,0x4d,0x80,0x4f,0x51,0x6f,0x0d,0x92, +0x60,0xbc,0xf1,0x54,0x7a,0x6b,0xfa,0xd3,0x99,0x63,0xb1,0x57,0x6c,0x6f,0x1e,0x04, +0xa2,0xbf,0xd0,0xcc,0x02,0x3f,0xe7,0x12,0xbd,0x40,0xb6,0xd5,0x51,0x04,0x9f,0xfe, +0x74,0x20,0xf2,0xf8,0xa4,0xd0,0x00,0xed,0xc1,0x41,0x8e,0x4b,0x75,0x24,0x59,0xb9, +0x1c,0x44,0xd7,0x23,0xae,0x59,0x45,0x89,0xc8,0x0b,0x0e,0x9a,0xf6,0xa3,0x96,0x31, +0x85,0x84,0x9b,0x44,0xf1,0x65,0x17,0x13,0x80,0xb7,0xe3,0x86,0xe7,0xc8,0x5b,0x82, +0xad,0xf7,0x2d,0x63,0xc5,0xf4,0x52,0x5a,0xca,0x44,0xaa,0x5f,0x76,0xc9,0x8a,0x19, +0xbc,0x82,0x53,0x2b,0x1f,0xda,0x7a,0x7f,0x7c,0x46,0x5a,0xa9,0xd0,0xc4,0x3c,0x4e, +0x56,0x02,0x3a,0x53,0xa7,0x23,0x2c,0xcb,0x64,0x45,0xab,0xd2,0x31,0x29,0x45,0x20, +0x3a,0x46,0x7a,0xec,0xed,0xce,0xaf,0xdb,0x4b,0x6f,0x88,0xd2,0xee,0x6b,0x2d,0xcc, +0x5d,0x56,0x0f,0x4c,0xc6,0x4f,0x0c,0x8a,0x5e,0xc9,0x47,0x9f,0x2a,0xc3,0x09,0xdc, +0x35,0x99,0xb5,0xa2,0x1d,0x6d,0xb6,0xe7,0xa2,0x42,0x62,0x83,0xe6,0x01,0x0b,0x79, +0xa8,0x8d,0xf9,0xa6,0x29,0xb1,0xac,0x81,0xca,0x03,0xc4,0x82,0xe9,0x49,0x12,0xff, +0x2e,0xf0,0xa6,0xb5,0xd7,0x6d,0x41,0x7b,0x78,0xc4,0x3c,0x3d,0xdf,0x4b,0x05,0x82, +0x68,0x7c,0x13,0xaa,0x44,0xc5,0x74,0xe7,0x59,0x5f,0xbb,0x20,0x30,0x9b,0x65,0x7b, +0xde,0x7d,0x5b,0x3a,0xd8,0xa0,0x56,0xad,0x40,0x91,0xe2,0x11,0x90,0xd2,0xd1,0xdf, +0x8e,0xce,0xd1,0xbb,0x92,0x70,0x75,0xa2,0x02,0x5f,0xab,0x9d,0x98,0x11,0x6d,0xd6, +0x9c,0x1e,0x4d,0x00,0x6f,0x92,0x43,0x53,0xa9,0xd6,0x4d,0x46,0xd7,0xd3,0x46,0x28, +0x70,0x59,0x23,0x84,0x76,0x76,0xf8,0x73,0x0f,0xfb,0xc3,0x97,0x02,0xfd,0x34,0xe2, +0xdc,0x0e,0xb4,0xa7,0x11,0x3c,0x05,0xeb,0x86,0xd7,0xc6,0xf6,0xe1,0x7f,0xba,0xb2, +0x93,0xe2,0xc9,0x33,0x5b,0x55,0x05,0x10,0xc8,0xa6,0xf5,0x0f,0x1b,0x67,0xcd,0x37, +0x90,0xd7,0x8c,0x92,0x79,0xf4,0x43,0xc9,0xc0,0xf7,0x5f,0xe6,0xc3,0xe6,0xe1,0x6a, +0xaa,0x74,0x11,0x7f,0x44,0xe5,0x36,0xa9,0x89,0x5e,0x03,0xae,0x9c,0x39,0x6e,0xda, +0xd0,0x14,0x4e,0x09,0xe3,0x98,0x3a,0x0b,0xc8,0xd3,0xc6,0xdc,0x4a,0x5b,0x9e,0xeb, +0x7e,0x15,0xd1,0xb1,0x53,0xeb,0xbf,0xbc,0x4b,0x5c,0x3f,0x18,0x11,0x63,0xf4,0xbe, +0x08,0x07,0xdb,0x6e,0x93,0xe6,0x98,0xd9,0xad,0xf0,0x27,0x5d,0xb9,0xd6,0xfe,0xf5, +0x8d,0x91,0x8e,0x49,0xc6,0x3f,0x0f,0xfa,0x8f,0xf3,0xf0,0xc5,0x02,0xd1,0xf6,0x1f, +0xe9,0x94,0xb0,0x79,0xb6,0x9b,0xde,0x68,0x80,0x9e,0xe4,0x0f,0x4b,0xd2,0x39,0xa1, +0x41,0x37,0x07,0x04,0xfe,0xe3,0x03,0xae,0xec,0x16,0xc6,0x4d,0x17,0xde,0x47,0xc1, +0x0e,0x9e,0x99,0x1d,0xff,0x9b,0x01,0x48,0x14,0xd2,0xca,0x3a,0x12,0x4e,0x78,0x7a, +0x86,0xec,0xfe,0x3b,0x35,0x0b,0xc0,0x40,0x07,0x30,0xef,0x04,0x27,0xb5,0x10,0x58, +0xfc,0x9d,0xb0,0x05,0x6d,0xd0,0x3e,0x00,0xc5,0xe1,0x80,0xd9,0xd6,0xec,0xb8,0x61, +0x73,0xe7,0xf1,0x30,0xff,0x81,0x29,0x37,0xaf,0xcd,0x71,0x1b,0xe4,0xec,0x28,0x11, +0xcd,0x5f,0x97,0x3a,0xb4,0xb0,0x03,0xb1,0x04,0x62,0x40,0xf5,0x74,0xdc,0x8c,0xaa, +0xd6,0xc9,0xe2,0xdf,0x83,0x79,0x50,0xe8,0x47,0x64,0x26,0x39,0xeb,0x18,0x10,0xda, +0xa2,0x0c,0x28,0x17,0xce,0xf8,0x78,0x52,0x41,0x45,0x14,0xe4,0x5b,0xed,0x86,0xb3, +0x06,0x29,0x48,0x08,0x6b,0xda,0xae,0x62,0xc0,0xdc,0x31,0xb2,0xfc,0x1b,0x49,0xc0, +0x24,0x8f,0x91,0x70,0x2a,0xa8,0x43,0x9b,0xc7,0x88,0x7f,0x05,0x3c,0xf6,0x8e,0x8f, +0xd9,0xea,0x9c,0xaf,0x7c,0x28,0x4a,0xa8,0xc4,0xaf,0xda,0x4c,0xef,0x95,0xed,0xea, +0x05,0x52,0xd1,0xef,0x14,0xa9,0xb8,0xcb,0xee,0x69,0x41,0x55,0x27,0x56,0x4a,0xe0, +0xae,0x87,0xdc,0x7d,0xf6,0xa9,0x0b,0xfb,0x90,0xc3,0x24,0xd0,0x69,0x39,0x2b,0x51, +0x74,0x97,0x8d,0x27,0x98,0xde,0x09,0x39,0xc5,0x46,0x82,0x87,0x2e,0xf0,0x60,0x8c, +0x66,0x88,0x9c,0xeb,0xeb,0xa5,0xe2,0x75,0x3e,0x78,0x8c,0x47,0xd6,0xbd,0x4a,0xc0, +0x70,0x9c,0x2a,0x1f,0xf8,0xa0,0xaa,0x47,0x49,0xe5,0x84,0x56,0xf3,0xe0,0x65,0xcf, +0xd9,0xb6,0x67,0xbe,0xb0,0x51,0x64,0x64,0xba,0x45,0x33,0x22,0x8d,0xe3,0x32,0xda, +0x2a,0x84,0x14,0x2c,0xb1,0xc1,0xc3,0x19,0x24,0x4c,0x85,0x56,0x52,0x49,0x1b,0xc8, +0x34,0x94,0xf2,0x26,0xdf,0xb3,0x4c,0xb3,0x84,0xd4,0x78,0x46,0x73,0xf3,0x87,0x17, +0xb6,0xae,0x96,0x65,0x13,0x1e,0x76,0x50,0x41,0x93,0xb7,0x70,0x1b,0xb3,0x23,0xdd, +0x29,0xf0,0xe3,0xaa,0x34,0x3e,0x31,0xd1,0x66,0xbe,0x35,0xfa,0xd4,0x11,0x7d,0xf1, +0xfb,0x18,0x79,0x7f,0x6c,0xf1,0xfb,0xd9,0x0c,0x89,0xee,0xfb,0x72,0x63,0x07,0x24, +0x4d,0xbd,0x30,0x77,0xfe,0xb7,0x0a,0xdf,0x8f,0x25,0x96,0x19,0x9f,0xe5,0x6e,0x34, +0x21,0x4f,0xbc,0x97,0x92,0xf7,0xfc,0x93,0x5a,0x97,0xf4,0xe2,0x1c,0xe4,0x61,0x2b, +0xa6,0xdb,0x35,0xd6,0xca,0x16,0xd9,0x70,0xcc,0xde,0xef,0xe5,0x34,0x02,0xa4,0x13, +0xbb,0x96,0xe1,0xb9,0x16,0x48,0x71,0xa8,0x46,0x08,0x7a,0x06,0xcf,0x08,0x22,0x76, +0x2c,0x84,0xa4,0x3c,0x3c,0xb8,0x24,0x54,0x87,0x49,0x76,0x6b,0xbe,0xb6,0x28,0xdd, +0x03,0x45,0x3b,0xed,0x01,0xd5,0x29,0xc9,0x7a,0x72,0xa6,0x52,0xd5,0x82,0x18,0xc1, +0xbc,0x9e,0xa7,0x8f,0x5d,0x15,0x09,0x62,0xae,0x75,0x33,0x53,0x36,0x01,0xfb,0xc5, +0x3e,0xa4,0xc9,0xa6,0xbe,0xd1,0x47,0xbf,0x0d,0xaa,0xa7,0x4e,0xf4,0xdb,0x70,0xc2, +0x0e,0xec,0xd8,0x7f,0xb1,0x4a,0xc2,0x88,0xd1,0x80,0xac,0xe3,0x02,0x53,0xee,0xd7, +0xce,0x86,0x57,0xad,0x55,0xb2,0xc6,0x05,0x86,0xde,0x80,0xf9,0xde,0x42,0x61,0xb8, +0xdf,0x19,0xef,0xdb,0xb8,0x96,0xcc,0xa5,0xdd,0x2c,0x57,0x9d,0x9c,0xf2,0x6f,0x3d, +0xa9,0x65,0xde,0xe3,0x5a,0xd1,0xd3,0x64,0xee,0xaf,0x4c,0xd7,0x03,0xce,0x5b,0x00, +0x06,0x20,0x5f,0x64,0x67,0xc5,0x2e,0xc2,0x22,0xa5,0xe8,0x57,0x60,0x6b,0x42,0xf2, +0x90,0x18,0xb2,0xff,0xa8,0x63,0xac,0x4f,0xe2,0xec,0xe1,0x52,0xaa,0xea,0x2d,0x7f, +0x41,0x1d,0x41,0xc4,0x2a,0x63,0x6f,0x26,0x35,0x4d,0xab,0xd5,0x9b,0x53,0x77,0x39, +0x7c,0x8f,0x4e,0xa1,0x69,0x67,0xd0,0x01,0xc9,0xbc,0x29,0x1c,0x62,0xde,0x1e,0xa2, +0x46,0x81,0x9a,0x66,0x7a,0xb5,0xab,0x90,0x63,0xb5,0x8a,0x51,0x26,0x7b,0x72,0xe0, +0x8e,0xaa,0x9e,0x79,0xf8,0x41,0x8b,0x83,0xcf,0x48,0x66,0xf1,0xa8,0xf8,0x53,0x0e, +0x69,0x42,0xbf,0x43,0xf1,0x73,0x2f,0x67,0xa1,0x63,0x69,0x22,0x08,0x23,0xed,0x75, +0xe0,0x72,0x59,0x37,0x20,0x42,0xc9,0x8f,0x6f,0x4a,0x81,0x64,0xb0,0x6d,0x48,0x15, +0x19,0xa7,0xf9,0x67,0x1e,0xda,0x28,0x8d,0xbf,0xb5,0x6a,0xdc,0x68,0x59,0x34,0x34, +0x68,0x0d,0x1f,0x03,0x69,0xa2,0xa1,0x89,0x79,0xe6,0xe2,0x57,0x5f,0x9b,0x16,0xce, +0x42,0x7b,0x0f,0x32,0x1c,0x85,0x05,0x00,0x23,0x7b,0x53,0xb0,0x66,0xe7,0x72,0x6a, +0xb9,0x82,0xc5,0x34,0x2a,0x66,0x0a,0x28,0xb9,0x4f,0x7e,0xb9,0x87,0xda,0x54,0x64, +0xe1,0x48,0xfa,0xa7,0xb6,0x21,0xbe,0xf3,0xbb,0xc5,0xc7,0x6e,0x12,0xc1,0xee,0x7c, +0x68,0xd5,0xf3,0x78,0x28,0xcc,0x7a,0xf2,0x6f,0x4b,0xa4,0x7a,0xba,0xee,0x79,0xf9, +0x66,0xa1,0x3a,0x6a,0x3b,0x51,0x73,0x83,0x3f,0xc7,0xce,0x44,0xba,0x64,0x5d,0x71, +0x60,0x4b,0x73,0xd8,0x1d,0xed,0x73,0x68,0x6a,0xd0,0xfc,0x8e,0x57,0xd2,0x5d,0x8b, +0xc9,0x81,0xfd,0xf6,0x97,0x15,0x2c,0xdf,0xe1,0x5d,0x14,0x87,0x64,0x31,0xf4,0xb4, +0x01,0x92,0x0e,0x6b,0x88,0x73,0xd5,0x5f,0x56,0x51,0x0d,0x86,0x11,0x4d,0xfd,0x89, +0x49,0xa3,0x70,0xee,0xb6,0xc0,0xd5,0xec,0xf5,0xff,0xcb,0x47,0xf4,0xdf,0x8d,0xb2, +0xed,0x12,0x4a,0x1d,0x5a,0x57,0x75,0xd3,0x1e,0x5d,0xe3,0xb3,0x18,0x7c,0x3a,0xc6, +0xcb,0x1b,0xce,0xc6,0x91,0x58,0xab,0x82,0x95,0x31,0xbc,0xfa,0xb4,0x80,0xf7,0x32, +0x8f,0xe8,0x5a,0x3e,0x96,0x59,0xf5,0x82,0xd8,0x4a,0x82,0x66,0x77,0xa9,0x17,0xf6, +0x49,0x72,0x9f,0xc4,0x60,0xb7,0x6d,0x0e,0x77,0x8b,0x33,0x97,0x19,0xd0,0x35,0xf5, +0x48,0x53,0x09,0x2a,0xd0,0x3d,0xcd,0x1b,0x5e,0xa6,0xe6,0xab,0x2e,0xca,0xd4,0x8c, +0x80,0xf8,0xbe,0x7f,0x00,0x5d,0x2e,0x56,0x6e,0x72,0xc4,0x9b,0x93,0x1c,0xc7,0xb1, +0xc8,0xb6,0x2e,0x86,0xb5,0x34,0x1e,0xc7,0x09,0x79,0x61,0xcf,0x41,0xd2,0x59,0xa1, +0xa8,0xbe,0xbf,0x7e,0x8c,0x8e,0x62,0x96,0xff,0x81,0xaf,0x53,0x54,0x77,0x1c,0xea, +0xd9,0x77,0x76,0xba,0x18,0xb4,0x60,0xc7,0xc7,0xc4,0xe7,0xa9,0x19,0xfa,0x7c,0x78, +0xaf,0xb3,0xd0,0xa5,0xd1,0x78,0xa9,0x86,0x1c,0x83,0x79,0xf2,0xac,0x88,0xb5,0xd0, +0x8e,0xe2,0x6a,0xa3,0x98,0x06,0x0d,0x02,0x6f,0xdd,0xbd,0xf8,0xae,0x20,0xe3,0xab, +0x8e,0x53,0xfd,0x7d,0x62,0x91,0x6a,0x50,0x11,0x43,0x30,0x1e,0x20,0xd5,0x11,0x3b, +0xaf,0xb2,0xcb,0x35,0xed,0x72,0xc2,0x09,0x75,0xfe,0x74,0xa2,0x46,0x83,0x00,0x88, +0x05,0x40,0xf8,0x23,0x12,0x52,0x43,0x50,0xaf,0xd1,0x8d,0xa2,0x0a,0xeb,0x3d,0x3f, +0x03,0xf9,0x13,0xe4,0x36,0xe1,0x46,0x1f,0xae,0x50,0x86,0x1a,0xf6,0xe5,0x07,0x2b, +0xb0,0x26,0x0d,0xf5,0xb7,0xe2,0x4f,0x0a,0x2f,0x93,0x8f,0x0e,0x77,0x87,0x62,0x60, +0xb5,0x8c,0x9d,0xb8,0xfe,0xb2,0x07,0x0b,0x48,0x65,0x3a,0xb3,0x84,0x8e,0x5a,0xf2, +0x83,0x2b,0x50,0xd2,0xf7,0xc7,0xc4,0x00,0xbd,0xa1,0x88,0x19,0xd9,0x62,0xdc,0x30, +0xfc,0xc7,0x50,0x11,0x19,0xa3,0x87,0x56,0xc8,0x88,0xfc,0xec,0xa4,0xa0,0xc5,0x67, +0x27,0x19,0x9a,0x77,0xfa,0xb9,0x49,0x9d,0x6a,0xcb,0xf5,0x27,0x82,0x6d,0x26,0x8b, +0x08,0x7a,0xce,0x97,0x34,0xbc,0x1f,0xb7,0x2e,0xed,0x3b,0x05,0xf9,0x7e,0x96,0x79, +0x34,0x87,0x26,0x8a,0x42,0x81,0x7f,0xea,0x05,0x8a,0x85,0x16,0xac,0x99,0x8f,0x69, +0x39,0xc6,0xd2,0x6d,0x2d,0xa2,0x22,0xc5,0xb8,0x4a,0x7a,0x66,0xf0,0xd9,0xa6,0x6a, +0x4a,0x91,0xf9,0xf0,0x3f,0xcf,0xbe,0xb9,0x31,0x4b,0x04,0x03,0x28,0xdb,0x2a,0x68, +0xb1,0xc4,0xd1,0xef,0x39,0x9a,0xde,0xc5,0x38,0xc7,0x86,0x4f,0x81,0xe2,0x00,0x4a, +0xfb,0x0a,0x47,0x38,0xe9,0xc2,0x68,0x68,0xa5,0xc3,0xaa,0x7e,0x46,0xe8,0x5a,0xbc, +0x1d,0xc0,0xd2,0x0e,0x1e,0xa2,0x1c,0x98,0x6b,0x8f,0xc8,0x5a,0xd0,0xef,0xe3,0x6f, +0x2b,0x0f,0x81,0x4e,0x9f,0xcf,0x32,0x0d,0xaf,0xca,0xf7,0x66,0x8a,0xea,0x39,0x5b, +0x28,0xce,0xd0,0x3f,0xdf,0xa2,0x79,0x16,0x4d,0x38,0x4c,0x7e,0x52,0xe3,0x42,0x4b, +0x27,0x23,0xfc,0x82,0x81,0x3f,0x0b,0x93,0x5c,0x7f,0xe8,0x55,0xf0,0x7d,0x34,0xaf, +0xce,0xd5,0x28,0x12,0x6b,0x98,0x42,0x9a,0x98,0x70,0x2c,0x47,0xd6,0xb1,0xe5,0xce, +0x66,0x19,0xfd,0xd2,0xdf,0xa3,0x20,0xd9,0x8e,0xc3,0xe7,0xe0,0x1f,0x96,0x77,0x1c, +0xd3,0x3c,0x16,0x75,0x19,0x4e,0xa8,0x40,0xd9,0x0e,0x83,0x9b,0x15,0x72,0x36,0xf0, +0x02,0xd9,0x19,0xb5,0x0f,0xc5,0x3e,0x11,0xe2,0x59,0x57,0xd0,0xaa,0x11,0xd4,0x62, +0xdc,0x0a,0x57,0x91,0xa9,0xe8,0xec,0x76,0x6f,0xf9,0x7c,0xb0,0xe5,0x51,0x77,0xc3, +0x5d,0x84,0x18,0xb5,0x98,0xe9,0x27,0xa5,0x0d,0xb2,0x8b,0xd4,0x9d,0x73,0x50,0xf7, +0x4c,0xf3,0xf7,0xd5,0x04,0x3c,0x1d,0xb1,0xff,0xda,0xf1,0xed,0x3f,0xbf,0x82,0xe8, +0xdb,0xfd,0xde,0x9d,0x4c,0xfc,0x60,0x86,0x87,0x89,0x08,0x5d,0xf8,0x55,0xae,0xe9, +0x5d,0x1c,0x69,0xeb,0xd4,0x88,0xfe,0xf7,0x78,0x74,0x1a,0xdc,0x8a,0x9c,0x1f,0x74, +0xc7,0x95,0x81,0xa2,0x30,0xf8,0x31,0x93,0x6c,0x5d,0xcf,0x1f,0x10,0x55,0x3d,0xfb, +0x46,0xdf,0xd7,0xb8,0x54,0xea,0x72,0x54,0xda,0xdb,0x87,0x40,0x14,0xca,0x5e,0x30, +0x82,0x91,0xc6,0x44,0x3d,0x14,0x09,0xce,0x68,0xfc,0xd1,0x1f,0xe2,0x9c,0xfe,0x24, +0xd2,0x3c,0x42,0xa0,0xe1,0x3c,0x00,0x42,0x9a,0x7e,0x81,0x03,0x7f,0xf3,0x18,0xb5, +0xc6,0x93,0xbe,0xc0,0x5b,0x41,0x9b,0x94,0x86,0x4d,0x1f,0x65,0xdc,0x28,0x57,0x24, +0x5a,0xfc,0x79,0x35,0x1a,0x00,0xaa,0x08,0xd1,0x9e,0x97,0x79,0x03,0xbe,0xa3,0xa8, +0xdc,0x33,0x78,0x0c,0xe9,0x6f,0x28,0xce,0xc3,0x4d,0x69,0x5f,0xca,0x5f,0xb9,0xd0, +0x17,0x07,0xa8,0x09,0x9c,0x3a,0x30,0x21,0x47,0x92,0x0d,0x0b,0x21,0xec,0x58,0x83, +0x86,0xd1,0xd8,0xaf,0x6d,0x6d,0x6c,0xe3,0x61,0x44,0xaa,0xaf,0x63,0xb7,0xa1,0x05, +0x20,0xfc,0xa5,0x73,0x4b,0x31,0x36,0xb3,0x40,0x43,0xe2,0xce,0x5e,0x21,0xe4,0x64, +0x31,0x50,0x92,0x47,0x14,0x6c,0xf0,0x12,0x28,0x20,0xe8,0xe6,0x70,0x94,0x11,0x70, +0xa6,0xda,0x68,0x26,0x71,0x01,0xa7,0x0a,0x45,0xb7,0xe0,0xa4,0x0f,0x9a,0xfb,0xd2, +0xef,0xf9,0xd3,0x75,0x33,0x89,0x91,0xfc,0xd5,0xb7,0xa9,0xe7,0x52,0xdf,0xe5,0x2e, +0x55,0x46,0x09,0x11,0x91,0x65,0xe5,0x6f,0xa1,0xb3,0x75,0xe7,0xdf,0x6f,0x1a,0x8d, +0xe1,0x3b,0x3a,0x96,0x1b,0x88,0x2a,0x19,0x72,0x47,0x90,0x34,0x59,0xc8,0x2a,0x09, +0xdc,0x65,0x72,0x01,0x99,0xef,0x4c,0x90,0xea,0x08,0x0a,0xb8,0x17,0xac,0x2a,0x76, +0x19,0x1a,0xb8,0xeb,0x88,0x97,0x73,0x96,0x37,0x47,0x83,0x08,0xdc,0x04,0xcf,0x47, +0x87,0x15,0xeb,0x1f,0xcc,0x26,0x21,0xd1,0x27,0x04,0xa2,0x7f,0x78,0x70,0x3c,0x4f, +0xab,0x93,0xc9,0x08,0xf3,0x44,0x04,0x1b,0x6c,0xcd,0x52,0x91,0x56,0x91,0x14,0xba, +0x57,0x89,0xb1,0x7b,0xba,0x41,0x0c,0xd9,0xa0,0x29,0x1f,0x9e,0xd9,0xb9,0xf7,0x2b, +0x71,0x4f,0x03,0x0c,0x11,0x23,0x51,0x9a,0x4e,0xc3,0xc1,0x69,0x58,0x6d,0xb1,0x2a, +0xff,0xa4,0x2c,0x27,0x4d,0x25,0xe2,0x9b,0x67,0x32,0x04,0x1f,0x9b,0x60,0xb3,0x89, +0xd3,0xaf,0x2c,0x90,0x91,0xcf,0xb0,0xdf,0x66,0x28,0x90,0x64,0x34,0x6b,0x64,0xf2, +0x9e,0x1f,0xa5,0xeb,0xa0,0x21,0x24,0x4b,0xee,0xf7,0x1c,0x73,0x55,0x1d,0xfe,0x05, +0xa4,0x2c,0xdf,0x4d,0xc7,0x72,0x89,0xc3,0x13,0x37,0x59,0xc3,0x12,0x52,0x35,0x7f, +0x22,0x1e,0xad,0x84,0x3c,0x50,0x08,0xcb,0x2b,0x42,0x0d,0xc6,0x89,0xd2,0x6c,0x33, +0xae,0x55,0x04,0x80,0x30,0x76,0x94,0xe1,0xeb,0x08,0xac,0xf6,0x8d,0xa9,0x4d,0xb6, +0xfe,0x1a,0x15,0xca,0x08,0x45,0xf1,0xcf,0x4d,0x8e,0xca,0x96,0x07,0x8a,0x1c,0xd8, +0x07,0xe9,0xce,0x81,0x8d,0x16,0xee,0xaf,0x7f,0xab,0x9f,0xe4,0x05,0x8b,0xf9,0xae, +0x00,0x56,0x0d,0x91,0x91,0x75,0x5d,0xcb,0x9f,0xe2,0x84,0x6c,0x56,0xd6,0x7b,0x4a, +0x89,0x1e,0x2d,0x29,0xed,0x26,0x1e,0x3d,0x5b,0x33,0x01,0x9d,0xd9,0xf9,0x21,0x1a, +0xa8,0xb9,0x1b,0x74,0xa0,0x7b,0x20,0x91,0xce,0x42,0xcc,0xa7,0x92,0x1d,0x2f,0x88, +0xae,0xc9,0xfa,0x7e,0xc8,0xee,0x29,0x81,0x4f,0x4a,0xaa,0x5e,0x7c,0xf7,0xcf,0x24, +0xf1,0x17,0x49,0x1c,0xbf,0xd9,0xe9,0xdf,0xf9,0x14,0x0f,0x55,0x69,0xb6,0x26,0x68, +0x3a,0x97,0x46,0x3c,0xc1,0x52,0x06,0x6c,0x62,0x70,0xee,0x12,0x87,0xa8,0xcd,0x3a, +0x0f,0xc9,0xb6,0x9c,0x23,0x7f,0x9e,0x65,0xc6,0x1f,0xc8,0x9e,0x13,0x70,0x43,0x2b, +0x28,0x1d,0x78,0x56,0x4f,0x98,0xea,0xd4,0x15,0x03,0xaf,0xff,0x13,0x71,0xd8,0xc6, +0x89,0x8b,0x47,0x7d,0x4e,0xcb,0x98,0x5a,0x1e,0x50,0xcd,0xc6,0x10,0x3b,0x5d,0xf1, +0x3e,0x54,0x64,0x83,0x57,0x53,0x4e,0x0a,0xaf,0xf1,0xdf,0xa2,0x1a,0xc2,0xe8,0xaf, +0x5d,0x8d,0x74,0x70,0xea,0xb1,0xc0,0xda,0xf7,0x8e,0x07,0xb2,0x1b,0x2b,0x70,0x81, +0x05,0xa2,0xb1,0x65,0xcc,0xb9,0x68,0xc6,0x63,0xd2,0xd9,0x45,0x67,0x8e,0x11,0x78, +0x04,0x8e,0x11,0xff,0x14,0x5f,0x60,0x71,0x62,0xd3,0xf1,0x2b,0xe6,0x5d,0x18,0x5f, +0xc6,0xc5,0x61,0x35,0x1b,0xe6,0x08,0xe6,0x18,0xe3,0xc8,0x98,0xa9,0xff,0xdc,0x30, +0xf8,0x28,0x5c,0x29,0xb4,0x08,0xb8,0xef,0xed,0xa0,0xe0,0x52,0x64,0x57,0x1f,0x44, +0x27,0x59,0xed,0x84,0x63,0xa9,0x49,0x9c,0x6a,0xcb,0xd7,0x11,0x2d,0x69,0x63,0x62, +0x26,0xc6,0xe3,0x66,0x36,0x26,0xcd,0x2c,0x64,0xa2,0x41,0x8d,0x3e,0xbd,0x9b,0x48, +0xad,0xf5,0x5a,0x06,0xe1,0xe7,0xca,0xd5,0x7f,0xef,0x72,0xbb,0x6c,0xaa,0x9d,0xb3, +0x90,0x74,0xf4,0x26,0x0e,0x04,0xd9,0xfa,0x64,0x6d,0x7c,0xea,0x5c,0x19,0x0b,0x69, +0x78,0x99,0x33,0xfe,0xa0,0xea,0x8b,0xd5,0x31,0xa6,0x75,0x57,0x51,0xa8,0x86,0x9f, +0xfb,0x47,0x24,0xff,0x8b,0xad,0xbc,0x3d,0x05,0x1b,0x85,0xfa,0x52,0x6d,0x3c,0xa8, +0x0a,0x21,0xe2,0xbd,0x9a,0x21,0xcd,0x88,0xc3,0x47,0xd1,0x8c,0x9e,0x13,0x4c,0xb8, +0x83,0xcc,0xf8,0x6e,0x3f,0x02,0x40,0xe8,0x4f,0x12,0xd8,0x0d,0xfc,0xe4,0xef,0x79, +0x65,0xca,0xb1,0x49,0x98,0xe6,0xf7,0xf8,0xe0,0x31,0xcd,0xa3,0x0e,0xe1,0x15,0x5d, +0x6e,0x0c,0x4b,0x2d,0xfd,0xeb,0x48,0xcb,0x37,0x6c,0xff,0x62,0x26,0x1b,0x1c,0xe9, +0xa5,0x9d,0x16,0xc1,0x32,0x30,0x17,0x8a,0xbc,0xe1,0xa6,0x02,0x9f,0xb4,0x04,0xf0, +0xd1,0x82,0x84,0x07,0x94,0xae,0x6c,0x5a,0x4a,0x9c,0x18,0x92,0x16,0xf5,0x9c,0xc1, +0x05,0xef,0xa6,0x47,0x92,0xb4,0x74,0xdc,0x43,0xd6,0x8f,0x17,0x20,0x5d,0x9a,0x3a, +0x38,0x6e,0x19,0xb0,0x19,0xae,0xc4,0xbb,0x40,0xac,0xab,0x8f,0x1e,0xb7,0x30,0xd9, +0x00,0xe0,0x9c,0x42,0x32,0x21,0xc0,0x9d,0xc5,0x01,0xce,0x56,0xae,0xb6,0xac,0x4f, +0x9f,0xd7,0x40,0x44,0x6b,0xbf,0x46,0x01,0x6a,0x71,0x07,0xd1,0xd6,0x0a,0xb1,0x47, +0xf8,0xb1,0xe3,0x82,0x5f,0xde,0x27,0xdc,0x8c,0x97,0x7d,0x67,0x5a,0xfb,0xaa,0x70, +0x06,0x48,0x6d,0x96,0x0a,0xf6,0xf1,0xa3,0xc5,0x67,0x9d,0x53,0xb6,0xb5,0x8b,0x0e, +0x5a,0x54,0x8e,0xec,0x0f,0x84,0x9a,0x31,0xd9,0x4e,0x8c,0x1e,0xa8,0x57,0xd5,0x1e, +0x29,0xa7,0x96,0x74,0xb0,0x44,0x87,0x5c,0x7d,0xa4,0xa8,0x1e,0x96,0xbd,0x90,0x83, +0x5f,0x25,0x67,0x1a,0xb6,0xb4,0x7f,0x3b,0xdf,0xd6,0x13,0x8b,0x9f,0x33,0x47,0xf9, +0x12,0x95,0x4a,0x70,0x48,0xed,0xc7,0x53,0xc2,0x46,0x85,0x0f,0x53,0x54,0xd2,0xa8, +0x12,0x63,0x26,0x8a,0x3d,0xfe,0xf4,0x1a,0x6f,0x7d,0xf4,0x83,0x7a,0x26,0xce,0xc0, +0xa3,0x30,0xbe,0xd7,0x9c,0xa6,0x74,0xcb,0xce,0x5c,0xc0,0xd7,0xf2,0x5b,0xdc,0x67, +0x59,0x2a,0xeb,0x14,0x1f,0xb8,0x7d,0x18,0xaf,0x73,0x16,0x9d,0x15,0xcf,0xcf,0xeb, +0xef,0x30,0x4d,0x5b,0xb6,0x41,0x57,0x08,0x6b,0x52,0xb7,0x3f,0xcc,0x74,0xe5,0x31, +0x38,0x42,0x40,0xdc,0x3b,0xfb,0xce,0xc8,0x4f,0x0d,0x81,0x57,0x60,0x0c,0x52,0x3f, +0x69,0x30,0xd9,0x7b,0x22,0x4f,0x41,0xd8,0xd5,0x0c,0xc2,0xce,0x39,0x70,0xd2,0x5d, +0xa1,0x7b,0x37,0xf8,0xb1,0x60,0x49,0xc5,0xc6,0x3a,0xf7,0xec,0xd3,0x1b,0xc9,0xad, +0x87,0x0e,0x31,0x52,0x53,0x21,0x8e,0xb9,0x64,0x90,0xe7,0x33,0x30,0xe0,0xf4,0x3b, +0xa1,0x1f,0x99,0xcc,0xfb,0xb5,0xaf,0x0e,0x20,0x9b,0x10,0x65,0x43,0xc9,0x88,0x48, +0xe1,0x1e,0xb0,0xbc,0x09,0x88,0xb4,0x0b,0x81,0x99,0xe6,0x5c,0x7d,0xba,0x0d,0xc3, +0x0f,0xbf,0x39,0xc7,0xb0,0x16,0x7e,0x1e,0x1b,0xd9,0xc4,0x54,0x73,0x99,0x42,0xd3, +0x0e,0xed,0xde,0xb3,0x11,0x24,0x62,0xe3,0xc3,0x4f,0x83,0xad,0xaf,0xc8,0x78,0xe8, +0x29,0xa7,0xca,0x95,0xbd,0xa8,0x42,0x5f,0x14,0x53,0x31,0xdf,0xd4,0x65,0x6c,0xd8, +0x0a,0xe3,0xd3,0x47,0x1f,0xcb,0xe2,0x5e,0xc6,0xcf,0xc4,0xde,0x5d,0xec,0x92,0x7a, +0xbc,0x66,0x7b,0x8f,0x19,0x18,0xe0,0x4f,0xa0,0x63,0xcb,0x19,0x31,0x30,0x35,0x30, +0xe0,0x5a,0xcc,0x62,0xa5,0xd4,0x1d,0x79,0xd2,0x07,0x66,0x13,0x7a,0x29,0x82,0x50, +0xe8,0x0a,0x45,0xae,0x29,0x9c,0x17,0x13,0x2a,0x0f,0x72,0x9c,0x86,0xbf,0x00,0x45, +0xb4,0x4f,0x35,0xd8,0x04,0x39,0xa1,0xfa,0xc3,0xcf,0x6e,0x1e,0x68,0x53,0x63,0x6b, +0x2b,0x82,0x7b,0xb3,0x8a,0x63,0xac,0x13,0xa8,0xb1,0xad,0x6a,0x7b,0x91,0x48,0xe7, +0x8d,0x2f,0xab,0x5f,0xe0,0x22,0x63,0x82,0xb8,0x4f,0x74,0x9b,0xcb,0x92,0xc4,0xf4, +0xb2,0xe5,0x20,0x84,0x30,0x30,0xac,0x4f,0x1c,0x0d,0xf2,0x68,0x73,0x01,0x56,0xbf, +0x49,0x40,0x74,0x16,0xb0,0x93,0x45,0x0f,0xc4,0xf0,0xe2,0xb2,0x12,0x24,0x94,0x05, +0xbb,0x47,0x85,0xf7,0x83,0x5c,0xc6,0x01,0x0d,0xa2,0xcf,0x87,0x98,0x23,0xcd,0x2d, +0xa7,0x1e,0xd4,0x4e,0xb7,0xd1,0x01,0x57,0x44,0x3d,0xcb,0x9c,0x1a,0x17,0xef,0x45, +0xb1,0x2b,0xb4,0x40,0x69,0x13,0x6c,0x1f,0x15,0x54,0x2c,0xec,0xd5,0x38,0x4f,0x83, +0xfe,0x68,0x17,0x97,0x4c,0x36,0xe1,0xab,0x65,0x86,0xd8,0xf5,0x7b,0x55,0x25,0x87, +0xda,0x54,0x8d,0xc1,0x37,0xe7,0x7e,0x8f,0x33,0xea,0xc4,0xc1,0xfa,0x76,0xe2,0xbe, +0xa5,0x87,0x78,0x1c,0x52,0x88,0x60,0x09,0xe3,0x15,0x22,0xf4,0xf3,0x77,0xf9,0x7a, +0x09,0x6a,0xc1,0x4b,0x3e,0xb8,0x74,0x34,0x69,0xd9,0xae,0x4c,0x72,0x3a,0x27,0xe7, +0xb8,0x09,0x48,0xe4,0xc6,0x22,0x93,0x50,0x1a,0x59,0x09,0x4f,0xfd,0xf2,0x5d,0x88, +0xdf,0x1a,0x84,0xcd,0xa0,0x78,0xbf,0x0c,0xcc,0x18,0xd8,0x5b,0x9b,0x73,0x2f,0x88, +0x24,0x78,0xe0,0x19,0xf9,0xd0,0x40,0xbd,0xef,0x1b,0xab,0x01,0x12,0x1f,0xb5,0x20, +0x7b,0x5e,0x46,0x10,0x91,0x27,0x52,0x2f,0x97,0xfd,0xd6,0xed,0x72,0x83,0xce,0x86, +0xa6,0x7f,0xcf,0xba,0xd0,0x0c,0x08,0x55,0x80,0x2e,0x21,0x03,0x7b,0x7d,0xc2,0x49, +0x57,0x05,0xf9,0xab,0x51,0x2f,0x04,0x1a,0x98,0x83,0xd3,0x12,0xf2,0x1e,0xe4,0x5c, +0x38,0x20,0xd9,0xbf,0x44,0x92,0xa4,0xc6,0x99,0x1e,0x20,0xfd,0x04,0x80,0x38,0x5b, +0x67,0xf6,0x1b,0xaa,0xe3,0x1d,0xe4,0x06,0x37,0xc0,0xff,0xd0,0xa9,0x61,0xa3,0x72, +0x44,0x34,0xd3,0x94,0x94,0x93,0x29,0xf5,0x76,0x55,0x8c,0xc8,0xb4,0x5e,0x37,0x2f, +0x82,0x51,0xf4,0xfc,0x65,0xb1,0x6e,0x33,0xc2,0x82,0xa9,0xd8,0x21,0x61,0xb8,0x2c, +0xbd,0xc1,0x29,0x07,0xa8,0xa5,0x81,0xac,0x30,0x4a,0x79,0xe3,0x97,0x4e,0x4c,0x3d, +0x35,0xc4,0xf0,0x35,0x02,0x5f,0xb0,0xde,0xff,0x86,0x08,0x9a,0x8a,0x1f,0xac,0x98, +0xbc,0x83,0x37,0x52,0x11,0x5f,0x27,0x2c,0xc5,0xe1,0x78,0x8d,0xb6,0x46,0xca,0x04, +0x88,0x5a,0x61,0xc3,0xc9,0xda,0xa2,0x85,0xb5,0xc6,0xba,0x14,0xee,0x67,0xc5,0x82, +0x81,0x17,0x9c,0xd3,0x85,0xa7,0x3f,0x11,0x38,0x1c,0xe8,0x8d,0xd1,0x4d,0x39,0x81, +0x83,0x93,0x8a,0x87,0x1a,0x4a,0x12,0xd9,0xef,0xda,0x7b,0x1f,0x68,0x47,0x92,0x84, +0x0c,0xea,0x6a,0x0e,0x47,0xeb,0x42,0xfa,0x15,0xd2,0xc4,0x17,0xdd,0x8a,0x83,0x6d, +0x52,0x98,0x3c,0xf0,0xaf,0x2a,0x8b,0x5b,0x4c,0x6c,0x22,0x5d,0xb6,0xdb,0x1c,0x32, +0x71,0xda,0x6d,0xc1,0x9b,0x2b,0x1e,0x5d,0x7a,0xdb,0x81,0xc4,0x24,0x87,0x4c,0x25, +0x08,0x1c,0x82,0x4c,0x3c,0xee,0x72,0xee,0x38,0xf1,0x32,0x11,0x0b,0xe7,0xef,0xda, +0xf2,0x96,0xf9,0xbc,0xb3,0x00,0x82,0x96,0x4b,0xb6,0xf2,0x73,0xd8,0xfc,0x90,0xa3, +0x85,0xcc,0x6b,0x1f,0x32,0x03,0x28,0x6b,0xc8,0x1d,0xf2,0xeb,0x90,0xd1,0xeb,0x05, +0x02,0xed,0xfc,0xbd,0x99,0xb5,0x7b,0xf9,0x31,0x50,0x6b,0x0d,0xec,0xd1,0x8f,0x27, +0xf1,0x8e,0x64,0xc7,0x5e,0xba,0x25,0xe5,0x57,0x44,0x8e,0x44,0xd8,0xff,0x96,0xce, +0xc2,0x81,0xae,0x70,0x90,0x17,0x84,0x3c,0x96,0xbd,0xe4,0xb2,0x3d,0xc0,0x58,0x7c, +0x97,0x96,0xe5,0x6f,0x19,0xff,0x8d,0x2c,0x1f,0xc0,0xb3,0x8b,0x1d,0xa3,0x97,0xce, +0x42,0x33,0x3c,0xd7,0xa1,0x18,0x02,0x37,0xf8,0xd7,0xba,0xb5,0x28,0x53,0x9b,0x40, +0xa3,0x24,0xf5,0x63,0xc1,0x49,0xd3,0xda,0x60,0xae,0x0f,0x19,0x7e,0xf4,0x14,0xf6, +0xba,0x68,0x3f,0x28,0xca,0xae,0xc3,0x10,0xaf,0x44,0xfc,0xf6,0x77,0x55,0xde,0x21, +0x0a,0x6b,0xf7,0xc0,0x49,0x3b,0x75,0x61,0x32,0xf5,0x0a,0x18,0xf6,0xd6,0xc0,0x9d, +0x52,0xcb,0x6b,0x89,0x3a,0xd5,0x6a,0x53,0xed,0xd5,0xfd,0xf7,0xf7,0x17,0xb7,0x88, +0x88,0x38,0x39,0x9a,0xb9,0xdb,0x7e,0xbe,0x8d,0xc3,0xa7,0xac,0xa8,0xb9,0x77,0x21, +0x88,0x92,0x56,0xba,0xdc,0x16,0xae,0x4b,0x59,0xf9,0xbf,0xd8,0x86,0xff,0x32,0xea, +0x1f,0xdb,0x37,0xfd,0x8f,0xd7,0xc4,0x4d,0xfc,0x95,0xee,0xac,0x59,0x65,0xf2,0xe8, +0xa2,0x90,0xba,0x6c,0x89,0x14,0xe4,0x8c,0x92,0xd2,0x17,0xb2,0x0c,0xf4,0x5c,0x39, +0x10,0x33,0x4d,0x4b,0xad,0x83,0x2f,0xcb,0xcb,0x7d,0xf6,0xee,0x7e,0x5e,0x6e,0xb4, +0xed,0xdd,0x90,0x66,0x44,0xbd,0xf8,0xee,0x93,0x4c,0xfe,0xfe,0x7f,0x6c,0x34,0x0c, +0x13,0x18,0x3e,0xd0,0x81,0x24,0x64,0x18,0x96,0xdd,0xf7,0xef,0xfe,0x5d,0x67,0x66, +0x4e,0xee,0xb4,0x3d,0x5e,0x40,0x01,0xc3,0x33,0x6e,0xff,0xff,0xf7,0xe6,0xdb,0x02, +0x7f,0x44,0x63,0x17,0x72,0xd6,0xbc,0x53,0x2a,0xc6,0x9e,0x96,0x73,0xa0,0x28,0xf2, +0x83,0xd5,0x08,0xe7,0xf5,0x8e,0x22,0xa3,0x27,0xbe,0xb8,0x24,0xe5,0xb6,0x61,0x1f, +0x01,0x89,0xff,0x9e,0xfb,0xb4,0x13,0xe1,0x9a,0x2e,0xcb,0x7f,0x67,0x1d,0x57,0x62, +0xec,0x0c,0x3f,0xe4,0x79,0x33,0x43,0x21,0x0b,0xe0,0x2c,0x8a,0x0c,0x1e,0x29,0xbc, +0x1a,0x46,0xd8,0x37,0x05,0xa5,0x68,0x8f,0xb7,0x27,0x37,0x1a,0x33,0x60,0xbe,0xa0, +0x0b,0x0a,0xb6,0x68,0xfa,0xf4,0xf3,0x98,0x47,0x99,0xb9,0x50,0xd1,0x61,0x0a,0x55, +0x00,0x0e,0x3a,0xb6,0xee,0xab,0xa8,0x1a,0x17,0xdb,0xa8,0x1f,0xb3,0x62,0x29,0x15, +0x8c,0x0a,0x65,0xc6,0x88,0x2d,0xf5,0xf4,0x16,0x25,0x96,0x17,0x90,0x68,0x5d,0x09, +0xf1,0x64,0xfc,0x3e,0x9d,0x3e,0xe9,0xac,0x0d,0x11,0x3d,0x72,0xed,0xb4,0xad,0x1e, +0xdd,0x6d,0xdf,0xef,0xc1,0x84,0x40,0x28,0x9f,0x96,0x0a,0x4f,0x28,0xe0,0x61,0x1c, +0x8b,0x62,0x2f,0x7e,0xfe,0x8c,0xbf,0x5b,0x16,0xb5,0xfb,0xef,0x5e,0x9f,0xbf,0x7b, +0x7a,0x80,0xdd,0x8f,0x99,0x84,0x4b,0x4e,0xfb,0xc6,0x1f,0xdd,0xd8,0xb0,0x08,0xb6, +0xa9,0x0a,0x93,0x3f,0x26,0xad,0x3b,0x83,0x76,0xf3,0xf8,0xbc,0x06,0x2d,0xfe,0xba, +0x89,0x45,0x5b,0xa2,0x70,0x05,0x85,0x87,0x6f,0xb1,0x25,0x0f,0x6b,0x0e,0xcb,0x29, +0x6b,0x01,0xc1,0xb2,0x7b,0x8d,0xe8,0xc5,0xeb,0x2e,0xed,0x44,0xb2,0x63,0x82,0xbb, +0x09,0x47,0xcb,0x4e,0xe7,0x67,0x64,0x26,0xef,0xc2,0x20,0x59,0xac,0x6b,0xf9,0xc7, +0xd1,0x66,0xc4,0xbb,0x38,0x5c,0x2a,0x09,0x16,0x8f,0x71,0x20,0x69,0x7d,0x72,0x96, +0xc0,0x92,0x2b,0x03,0x5a,0x97,0xa7,0x23,0x0f,0x59,0x9e,0xd9,0xf3,0x7d,0x7e,0x71, +0xcb,0xa3,0xad,0x47,0x64,0xf4,0xb9,0xde,0x2a,0x41,0xf5,0xe7,0xba,0x30,0xae,0x62, +0x2d,0x8e,0x0d,0x64,0x73,0x73,0x9c,0xc2,0xd3,0xd2,0xd8,0x31,0xb1,0x17,0x3c,0x42, +0x2b,0x70,0x7f,0x75,0x06,0x9b,0x2a,0xe6,0x83,0xd7,0xf4,0x60,0x39,0x36,0xdc,0x9b, +0xde,0x29,0xe0,0xf0,0xda,0x44,0x4e,0xff,0x88,0x11,0xde,0x99,0x04,0x90,0x7d,0x11, +0x5f,0x19,0x54,0xd4,0xc6,0x32,0x79,0x65,0x94,0x8f,0xb5,0xe6,0x82,0x36,0x70,0x29, +0xa3,0x96,0xdb,0xb7,0x4c,0x9a,0x67,0x41,0x6a,0xf8,0x02,0x95,0x80,0x73,0x7e,0x91, +0x4b,0x78,0xbc,0x7f,0xee,0x97,0xe9,0x57,0x81,0xbb,0x96,0xac,0x78,0x78,0xf5,0x9a, +0xc7,0x02,0xf0,0x06,0xd2,0xfc,0xf2,0x38,0x95,0x79,0xe6,0x38,0x22,0x19,0x90,0x76, +0x49,0xc9,0x60,0x7c,0x62,0x2a,0x45,0x56,0x1f,0x1b,0xad,0x2f,0x2d,0x14,0xae,0xef, +0x2b,0xcf,0xf1,0xaa,0xd2,0x9e,0xb3,0xfb,0x6a,0x8f,0xc1,0xc5,0xb9,0x3a,0x58,0x37, +0xdb,0x9f,0x57,0x69,0xcd,0xc1,0xf2,0x92,0xc9,0x39,0x89,0xb9,0x45,0x11,0x30,0xdf, +0x8a,0x71,0x9c,0x53,0xc8,0x7c,0x66,0xc8,0x12,0xf2,0xde,0x04,0xda,0xf0,0xb3,0x37, +0x76,0x5a,0xd5,0xad,0x41,0xe3,0x68,0x0b,0x1f,0xff,0x17,0x24,0x41,0xc5,0x8b,0x22, +0x07,0x12,0xe9,0xc0,0x3f,0x9b,0xff,0x8b,0x89,0x73,0x20,0x79,0xe0,0x25,0x08,0x3b, +0xef,0xc4,0x83,0xf7,0x88,0xc0,0xcb,0xdd,0xc4,0xa3,0xd6,0xdb,0x75,0xa2,0x8c,0x68, +0xa6,0x75,0xd7,0x5c,0xa8,0xbd,0xe9,0x41,0x2f,0x67,0x78,0x26,0x3a,0xfa,0x1b,0xb3, +0x50,0x2d,0x49,0x8d,0xb6,0x74,0xdd,0x50,0xa2,0x64,0xbc,0x45,0xe7,0xde,0x89,0x0d, +0x09,0xe6,0x1b,0xa5,0x85,0x66,0x6c,0x73,0xf5,0x6e,0x94,0x51,0x26,0xf3,0xaa,0xa0, +0x84,0xcc,0x55,0x7f,0xa2,0x35,0x8f,0x1d,0xcb,0x62,0x2f,0x33,0x2d,0xa9,0x10,0x75, +0xa6,0x0f,0x28,0xeb,0xa1,0x08,0xcd,0x4f,0x41,0x16,0x82,0x66,0xd5,0xc1,0x41,0x21, +0xc5,0x7d,0xd6,0x6a,0x66,0xf7,0x39,0xa3,0x9f,0x4d,0x31,0xaa,0x66,0x1b,0x92,0xb1, +0x05,0x8f,0x7e,0xd3,0xd9,0x51,0xb9,0x11,0x30,0x48,0xec,0x95,0x55,0xe3,0x96,0x68, +0x64,0x85,0xd4,0x24,0x2e,0x6d,0xe0,0xb9,0x7a,0x37,0x0a,0xd5,0x4c,0xa5,0x54,0x1c, +0xec,0x0a,0x75,0x1e,0x9e,0xa7,0xc1,0xbe,0x08,0x90,0xe3,0xe5,0x5b,0x69,0x58,0xfb, +0xef,0x3b,0x90,0x07,0x78,0x1f,0x0d,0x9a,0x06,0xf9,0x48,0x27,0x79,0x15,0x88,0xe8, +0x01,0x86,0x4b,0x20,0xb9,0xc5,0x05,0x97,0xb1,0x34,0x65,0xc2,0xfc,0x30,0xa6,0x28, +0x4d,0x7b,0xf4,0x77,0xf5,0x1d,0x6a,0xd7,0x2d,0x45,0xac,0x0c,0x9f,0x8e,0x12,0x38, +0x4c,0xf2,0xf9,0xda,0x51,0x1b,0xfd,0x9a,0x29,0x10,0xbe,0x87,0x74,0x76,0x1b,0x29, +0xcd,0x70,0x58,0xfe,0xee,0x01,0xe0,0x81,0x6b,0x44,0xb9,0x7a,0xfc,0xe3,0x13,0x39, +0xcc,0x30,0xfd,0x72,0x74,0xde,0x6d,0x19,0xaf,0x37,0xfb,0x82,0xce,0x34,0xf9,0x60, +0xd8,0x19,0x25,0x75,0xd4,0xfc,0xe0,0xbd,0x06,0x44,0x74,0x0e,0xc9,0xeb,0x8f,0x33, +0xd8,0x9e,0x07,0x7e,0x71,0xdd,0x69,0x43,0xc6,0x91,0x04,0x4d,0x65,0xbc,0xe5,0x4e, +0xa4,0x94,0xc4,0xfc,0x61,0x2f,0x63,0xb8,0x82,0x7f,0x9a,0xc1,0x07,0xe2,0xbd,0x8d, +0xcf,0x67,0x79,0xc9,0x9b,0x6f,0x0f,0x82,0x87,0x2c,0x46,0xbf,0x50,0x0c,0x73,0x39, +0xd7,0xf7,0x67,0xc1,0x8b,0x1f,0xb4,0x5e,0x13,0x55,0xaf,0xd1,0x0d,0xfd,0xc8,0xf5, +0x8b,0x98,0xc3,0xa5,0x07,0x14,0x2e,0xb1,0x8c,0xb1,0xfc,0x1a,0xd6,0x78,0x1e,0xdc, +0x22,0x42,0x9d,0xc3,0xb2,0x36,0x40,0x10,0x62,0x5b,0xab,0x53,0x17,0x8d,0xc1,0x56, +0xd0,0x97,0xd5,0xe7,0xce,0x18,0x46,0x11,0x4b,0x6a,0x02,0x73,0xbc,0x02,0xf4,0x90, +0x42,0x2c,0xcf,0x65,0xd7,0x0c,0x08,0x48,0x06,0xbb,0x26,0x8e,0x62,0x72,0x50,0x36, +0xc4,0x7a,0x2e,0x58,0xaf,0xba,0x04,0x49,0xa7,0x72,0x06,0x0c,0x75,0xfb,0x76,0xf9, +0xc4,0x89,0x04,0x95,0xd7,0xce,0x49,0x3d,0x30,0x3c,0x5f,0x22,0xcf,0xd8,0x7d,0x61, +0x46,0xa8,0x4c,0x64,0x54,0x1c,0x5d,0xbf,0x25,0xb8,0x7f,0x62,0x01,0x00,0x71,0x35, +0xdb,0x0f,0x46,0xbc,0x5c,0x90,0x0e,0xf7,0xee,0x69,0x66,0x9d,0x03,0xf5,0x34,0x0a, +0x17,0xdf,0xb7,0x27,0x9a,0x62,0x20,0xd7,0x4e,0x76,0xf6,0x7e,0x08,0xd8,0x48,0xb4, +0x77,0x01,0x99,0xc8,0x1f,0xff,0xe7,0x1a,0xda,0x78,0xfc,0x28,0x3c,0x1e,0xe7,0x63, +0x0e,0x3e,0xee,0xb9,0x40,0xfe,0x6c,0xcc,0x84,0x6e,0x20,0x9f,0xc0,0xff,0xd9,0x14, +0xe1,0xbf,0x7f,0x43,0xda,0xf1,0x53,0xd1,0xff,0x20,0x37,0x1d,0xd2,0xb4,0x97,0x34, +0x83,0xb5,0x9d,0x90,0x4f,0x84,0x61,0xcb,0xb5,0x9e,0x06,0xdb,0x31,0xeb,0xc1,0xd5, +0xc2,0xa0,0x3a,0x96,0xe8,0x28,0x4f,0xce,0xe2,0x41,0x19,0x47,0x5d,0xc4,0x3a,0xe1, +0x89,0x0c,0x25,0x6a,0x0f,0xfe,0xae,0xce,0x42,0x4d,0x59,0x71,0xa3,0x6e,0x21,0xe0, +0xd4,0xbb,0xa2,0x41,0x13,0x3a,0xf8,0xea,0xd6,0xd0,0x1e,0x17,0x45,0xdb,0xa8,0x6f, +0x27,0x06,0xb3,0xb6,0x93,0xfa,0xd8,0xb6,0xd1,0x46,0x73,0x2b,0xee,0x99,0x9e,0x41, +0x01,0x08,0xa1,0x04,0x7f,0xad,0xf4,0x7a,0xa9,0x32,0x8a,0x65,0x07,0x3b,0x0c,0xc9, +0xa3,0x37,0x09,0x88,0xf7,0x21,0xba,0x8a,0xbc,0x47,0x19,0x74,0x5c,0x9b,0xd9,0x9b, +0x77,0x01,0x63,0xcc,0x46,0x9c,0xf2,0x17,0x6c,0xe3,0x6b,0xae,0x8c,0xbb,0x6c,0xe5, +0x28,0x4b,0x3e,0x7e,0xee,0x4c,0x64,0x05,0xa2,0x4a,0xa8,0xc7,0xa9,0x66,0xc3,0xd1, +0xa3,0xd1,0x23,0x17,0x14,0x4f,0x80,0x28,0xab,0xb5,0xab,0xdc,0x7b,0xea,0x5a,0x76, +0x8f,0xe9,0xb3,0x2c,0xed,0xd4,0x42,0x22,0x2c,0xe0,0x2c,0x04,0xdf,0x4b,0x07,0xca, +0xde,0xbb,0xce,0x4b,0xbb,0xa6,0x3a,0xaa,0xcc,0xb9,0xed,0x33,0xa7,0x02,0x8a,0x99, +0xe4,0x0e,0x2c,0xac,0xaf,0x22,0x65,0xa8,0x47,0xe6,0x7d,0xa8,0x7f,0x90,0x7b,0xb2, +0x6b,0xf1,0x3d,0xaf,0x18,0x24,0xc3,0x32,0x37,0xf2,0xb5,0xb9,0xdb,0x0e,0x0f,0xf8, +0x09,0xdb,0x5b,0x1b,0x50,0x32,0x23,0xf9,0x2b,0xb0,0x77,0xee,0x90,0x65,0x92,0xa4, +0xaf,0x12,0x81,0xf7,0x41,0xb9,0x51,0x9f,0x10,0x12,0x1c,0xc6,0x30,0x7f,0x64,0x8e, +0xd6,0xe5,0x97,0x95,0xd8,0xa8,0x7a,0x10,0x94,0xf7,0x98,0xf3,0xf0,0x7f,0xb2,0x80, +0x2d,0x1e,0x05,0xe5,0xbc,0x99,0x58,0xb5,0x6d,0xaf,0x05,0x62,0xf2,0x87,0xf2,0x60, +0x1e,0x20,0xff,0x91,0xe9,0xc8,0x8a,0x71,0xad,0x87,0x3e,0x23,0x2d,0x95,0x14,0x41, +0x72,0xb9,0x21,0x2b,0xd3,0x62,0xc9,0x02,0xe0,0x50,0xac,0x66,0x77,0xed,0x04,0xc1, +0x5c,0xd7,0xf6,0x5e,0x80,0x31,0x3e,0xf9,0x62,0x95,0xc1,0x16,0xdf,0x7a,0x5b,0x86, +0x68,0x6f,0x3c,0xb7,0x28,0x09,0x73,0x83,0x1d,0x3a,0xef,0x07,0x70,0x3e,0x8d,0x1d, +0x25,0x56,0x49,0x51,0xbf,0xbe,0xe2,0x36,0x21,0x48,0xbd,0xb1,0xfc,0x7a,0x56,0x76, +0x24,0xb3,0x02,0x08,0x44,0x29,0x81,0xb7,0x4a,0xfc,0xc8,0x3f,0x7c,0xd3,0xce,0x69, +0x96,0xbb,0x0e,0x18,0x45,0x28,0x3e,0xda,0x80,0x88,0x31,0x4d,0xaf,0x79,0xfa,0x99, +0xc3,0x65,0x47,0x65,0x56,0xc1,0x04,0x95,0xa0,0xcb,0xf5,0xa9,0x25,0xc7,0x51,0x76, +0xf9,0x18,0xb1,0xe5,0x5b,0x1b,0x64,0xca,0x95,0xa4,0x38,0x22,0x92,0xcd,0xaa,0x48, +0xd6,0x3c,0x96,0x1f,0x62,0xb1,0x5e,0xfc,0xe8,0x14,0x9c,0x12,0xd9,0x71,0x5c,0xdc, +0xc0,0xfb,0x2d,0x22,0xda,0x8b,0xce,0x8a,0x80,0xec,0x65,0xa3,0x7d,0xa5,0xeb,0x8b, +0x29,0xe3,0x6b,0x52,0x45,0xb3,0xca,0x8b,0x96,0x51,0x9d,0x16,0x59,0x82,0x75,0x65, +0x40,0xd9,0xb0,0xaf,0x69,0xa0,0x9f,0x31,0x74,0xf4,0xb9,0x7f,0xfa,0x1c,0xa7,0xea, +0x9d,0xc2,0x9e,0x3f,0x62,0xcc,0x48,0x3f,0xa4,0xdb,0x5c,0x48,0x28,0x1f,0xef,0x96, +0x5e,0xe1,0x57,0x0d,0x91,0x35,0x46,0x0b,0x67,0xe3,0x43,0x49,0x5b,0x1e,0x23,0xf6, +0x82,0xd3,0x65,0xf9,0x69,0xc0,0x13,0x17,0xa4,0xcd,0x8b,0x9b,0x59,0x80,0x79,0x3b, +0x87,0x82,0x0d,0x69,0x36,0xc6,0xb8,0xdb,0xe5,0x8e,0x02,0x57,0x95,0xb8,0x17,0x20, +0x67,0xa4,0xb0,0x31,0x4a,0xe3,0x10,0x26,0xc6,0xc9,0x70,0x79,0x1d,0xa5,0x24,0xa5, +0xee,0x2c,0x15,0x24,0x81,0xfa,0xd7,0x9d,0xf2,0x6d,0xba,0x16,0x4f,0x65,0x1e,0xbe, +0xc0,0xc6,0x8f,0x35,0x1b,0xd0,0x88,0x44,0x67,0x4c,0x5a,0x1c,0x03,0x1b,0xc5,0xc0, +0xb2,0x8d,0xd3,0xdc,0x2c,0x2a,0x01,0x8d,0x7a,0x3f,0xa1,0xc6,0x55,0xef,0xb7,0x13, +0x2e,0xe9,0x1d,0xec,0x38,0xa9,0xcd,0x6d,0xa5,0x79,0x4d,0x2c,0x50,0xb4,0x2a,0x12, +0x6a,0xa9,0x12,0xe1,0x9f,0x7d,0x29,0x3b,0xa4,0x58,0x2f,0xba,0x58,0x7a,0xa5,0xe3, +0xe3,0x41,0x26,0x5a,0xaf,0xb8,0xd4,0xd8,0xb4,0x61,0x0c,0x61,0xbf,0x60,0x83,0x2e, +0xa9,0xc5,0xf4,0x7d,0xe0,0xa2,0x97,0xa8,0xb5,0xc1,0x02,0xdd,0x5f,0x3f,0xe4,0x38, +0xf1,0xce,0x83,0xa4,0xef,0xaf,0x8d,0xe8,0x4b,0xc8,0x26,0x1c,0xfd,0xad,0x3a,0x53, +0x47,0x00,0x2a,0x03,0x10,0xef,0x02,0x01,0x41,0xaf,0xb0,0xa1,0xfc,0xeb,0xaa,0xcd, +0x0e,0x9e,0x5d,0xda,0x38,0x00,0xc8,0x89,0x62,0x33,0x93,0x2b,0xd1,0xe3,0x94,0xdf, +0xd0,0xcc,0x6f,0x2f,0x7e,0xc3,0x31,0xc6,0x4d,0x87,0x73,0x9a,0xbc,0xcf,0x5d,0x79, +0x4f,0xef,0xe7,0x7b,0x30,0xf2,0x0f,0x5c,0x40,0x04,0x31,0xd4,0x9f,0x66,0xd3,0x63, +0x9a,0xa2,0x14,0x51,0xf7,0x91,0xfb,0xf5,0x9a,0xbf,0x01,0xe9,0xa1,0x34,0xe4,0x99, +0x53,0x26,0x6a,0x2c,0x87,0x22,0x22,0xbc,0x90,0x90,0x1e,0xc9,0x21,0x0e,0x7d,0x6d, +0xa9,0x38,0xa5,0x9b,0xde,0x2a,0x5b,0x8f,0x10,0x75,0x1a,0x80,0x9e,0x56,0x3a,0x51, +0x22,0x3f,0x74,0x89,0xcb,0xc8,0x27,0xc2,0xd9,0x8f,0xae,0xe7,0xd5,0xb5,0x8f,0x21, +0xf9,0x3e,0x25,0x2d,0x44,0xb5,0x83,0x76,0x6f,0xcd,0xd4,0xf1,0xf6,0xb1,0x07,0xd3, +0x47,0x39,0x4c,0xb9,0x23,0x1b,0x5d,0x18,0x95,0xd2,0xdd,0x85,0x77,0xf9,0x0a,0xdb, +0x4c,0x01,0x2d,0xd6,0x38,0x4a,0x22,0xd3,0x94,0xd7,0xd5,0x35,0x9c,0xf9,0xdb,0x9a, +0x47,0xe7,0x26,0xfc,0x0f,0xd2,0x21,0xea,0x78,0x9a,0x96,0x5f,0x9c,0x78,0x70,0x75, +0x79,0x9a,0x71,0x9f,0x3b,0x43,0xdb,0xc4,0xfb,0xd3,0x9d,0xad,0x09,0x4d,0xe7,0x7a, +0x13,0x38,0x5f,0xc9,0x8c,0xfb,0xf0,0x98,0x63,0x27,0x1f,0x25,0x34,0x4b,0x56,0x60, +0xc6,0xe4,0xac,0xbb,0x69,0x2a,0xfd,0x3f,0xb3,0xb7,0xe1,0xb0,0xb9,0xb5,0xcd,0xb0, +0xfb,0x60,0x0a,0x5d,0x2d,0xb4,0xa9,0xea,0x19,0xd0,0xb6,0x6a,0x50,0x41,0xc9,0xed, +0x44,0x38,0xef,0xa1,0xb2,0x1b,0xf5,0x9a,0x65,0x7d,0x96,0xf9,0xfc,0xf2,0x58,0x94, +0x7a,0x5b,0xe5,0xd0,0xad,0xba,0xb7,0xa2,0x90,0x23,0x9f,0x2d,0x7d,0xba,0xef,0x2a, +0x4f,0xdf,0x21,0x1f,0xbb,0x4b,0x68,0x88,0x97,0xb3,0x97,0x9d,0xd9,0xff,0x60,0x02, +0x79,0x0d,0x37,0x05,0x9d,0x2c,0xb7,0x26,0x94,0x24,0xb8,0xe6,0x84,0xa6,0xcd,0xf2, +0x32,0xb1,0x6e,0x66,0xfa,0x87,0xdc,0xe0,0x4d,0x47,0xfe,0xc5,0x93,0x21,0x4b,0x1c, +0x02,0x01,0xe9,0x1b,0x56,0xd6,0x29,0xce,0xce,0x20,0x36,0xb2,0x31,0xcd,0xb1,0xef, +0x91,0x4e,0xd7,0x87,0x95,0x8c,0x91,0xfc,0x62,0x3e,0xe7,0x03,0x3a,0x86,0xf8,0x07, +0xc8,0x4d,0xa0,0x03,0x5d,0x20,0xab,0x90,0x4a,0x22,0xee,0xa8,0x32,0xbb,0x7a,0xae, +0xfe,0xd4,0x08,0x59,0x13,0x23,0xf4,0xe3,0x26,0x4f,0xa0,0x46,0xac,0x7e,0x03,0x52, +0xe7,0x09,0x07,0xc7,0x1f,0x8c,0xae,0x13,0x39,0xfb,0x2e,0x16,0xc9,0x92,0xb2,0x7e, +0xea,0x52,0x61,0x6c,0x32,0xd8,0x1e,0xf5,0xdf,0x3b,0xe7,0x06,0x70,0x28,0xfd,0x8c, +0x17,0x1c,0x61,0xff,0xc6,0x83,0x58,0x3d,0xca,0x4b,0xcc,0x1f,0x48,0xc7,0x6a,0xb8, +0x11,0x06,0x21,0x66,0xcc,0xd5,0x56,0xc8,0x45,0x46,0xb9,0x27,0x81,0xc2,0x5a,0x81, +0x2d,0xf5,0xe4,0x05,0x73,0xbc,0x50,0xcb,0x4a,0x02,0xa1,0x6b,0x4a,0xfe,0x52,0x90, +0xab,0x29,0xb4,0x42,0x4d,0xee,0x3c,0x3f,0x19,0x2f,0x3e,0xb5,0x5e,0x7d,0xd8,0x26, +0x2b,0xde,0x76,0x2e,0x29,0x06,0x68,0xef,0xb9,0xc7,0xd3,0x13,0xfd,0x2d,0x30,0x38, +0x45,0xf1,0x32,0xde,0x9e,0x9d,0x60,0xfc,0x57,0x31,0x79,0xdd,0xfa,0xd2,0x83,0x84, +0x95,0x91,0x6c,0xab,0x8a,0xd3,0x7b,0x50,0xcc,0xde,0x83,0x71,0xb8,0x68,0x70,0x06, +0xe8,0x09,0x0b,0x50,0xb4,0x6e,0x61,0xfe,0x38,0xe2,0xc3,0x44,0xec,0x8a,0xe8,0x00, +0xdc,0x30,0xbc,0xf4,0x84,0x39,0xda,0xc0,0x34,0xd1,0x37,0x32,0xac,0x96,0xee,0x8f, +0xef,0x9c,0x8d,0x09,0x52,0x22,0x4e,0xae,0x8a,0x35,0xfe,0xb0,0x9a,0xa7,0xa9,0xc3, +0x23,0xc6,0x05,0xc2,0x94,0xc9,0xe8,0x52,0x64,0xdf,0xaf,0x56,0x3a,0xd9,0x73,0x02, +0xca,0x95,0x1a,0x66,0x35,0xbe,0x25,0xd1,0xe5,0xf1,0xe3,0x2a,0x9a,0xc5,0x7a,0x04, +0xfc,0xb9,0x21,0x3e,0x01,0x13,0x5e,0xe4,0x89,0xf2,0x09,0xc6,0x45,0x54,0x5a,0x52, +0xa6,0xad,0x0c,0x1d,0x88,0x2e,0xee,0xef,0x8f,0xfe,0x1c,0xa8,0x70,0x34,0x09,0x52, +0x01,0x1c,0x7d,0xf4,0x13,0x49,0x0b,0x73,0xe6,0x82,0x8a,0x85,0x81,0x00,0x75,0x96, +0x61,0x95,0x3c,0xb3,0x51,0x27,0x6b,0xf5,0x88,0xd2,0x7a,0xb0,0x74,0x47,0x86,0x92, +0xfe,0xac,0xd4,0x8e,0xd3,0x5c,0xd8,0xdb,0x73,0xda,0x97,0x5f,0xaa,0xa4,0x70,0x02, +0xfc,0x44,0x19,0x6f,0xbd,0xb4,0xf9,0x78,0x6b,0xd2,0x31,0xa2,0x9d,0x8d,0xe0,0x78, +0x72,0x0a,0xbf,0x73,0xdb,0x39,0xe8,0xda,0xfb,0x36,0xac,0xf3,0x25,0xc7,0xa4,0xc6, +0x14,0xe7,0xdd,0x9f,0x52,0x5f,0x60,0x88,0xfa,0xf4,0x29,0x4e,0x11,0xd0,0x0e,0x50, +0xf7,0xa1,0x42,0x0a,0x14,0x7d,0xd6,0xae,0xf8,0x08,0x7e,0xfc,0x49,0x8c,0x76,0x9f, +0xf5,0xb2,0x36,0xf8,0xbe,0x0c,0xfb,0x70,0xec,0x4b,0xa9,0x9e,0xba,0x1e,0xe8,0x4b, +0x2a,0x74,0x9e,0x63,0x1f,0xbe,0x74,0xe6,0x32,0xf5,0x6f,0x16,0x78,0xaa,0xc4,0xab, +0x69,0x1f,0x67,0xe1,0x3e,0x8e,0x0f,0x67,0x10,0xa4,0x0b,0x2d,0x7a,0xf7,0x23,0x64, +0x86,0x83,0x07,0x31,0x7f,0x05,0x08,0xdd,0x85,0xa2,0xe0,0xb8,0xaf,0xfc,0x2f,0x60, +0xa6,0x85,0x00,0x9c,0x81,0x35,0x58,0x76,0x16,0xce,0xb9,0x00,0xbf,0xf4,0xa6,0xe1, +0x06,0x81,0x21,0xf6,0x74,0xe2,0xf5,0xa6,0x87,0xe2,0x0c,0x6d,0x30,0x65,0x28,0x6c, +0x22,0x85,0x0c,0x0c,0xfe,0xd7,0x86,0x61,0xcb,0x49,0xb1,0x01,0x25,0xf3,0xf5,0xb1, +0x82,0x09,0xb0,0xf6,0x70,0xa5,0xea,0x5b,0x26,0xc8,0x2d,0x06,0x3d,0x55,0x50,0xa9, +0x01,0x5f,0xfe,0x34,0xec,0x08,0x58,0xa9,0x63,0xab,0x27,0x16,0x20,0x93,0x33,0x5d, +0x6d,0xe2,0x35,0xe2,0x7f,0x3c,0xb1,0x7b,0x27,0x76,0xf5,0x96,0xa2,0xe3,0x96,0xdf, +0xd3,0xf7,0x24,0xf2,0x64,0x2c,0x39,0x4c,0xcf,0xab,0x39,0x2e,0x1e,0x3c,0x72,0x13, +0x6f,0xa8,0x22,0xc8,0x8e,0xab,0xb6,0x0d,0xef,0x7c,0x00,0x15,0x23,0xe8,0xb7,0xe2, +0x8d,0x32,0xc2,0xdc,0x9b,0x5c,0x70,0x2f,0xcf,0x81,0x2a,0xf9,0x5f,0x1c,0x5b,0xf7, +0x0c,0x71,0x40,0xf4,0xe3,0xaa,0x93,0x31,0x40,0xc7,0xdb,0xed,0x5a,0x1f,0x30,0x1f, +0x8e,0x8f,0x3b,0x9d,0x1d,0x28,0xa3,0xd9,0xe9,0x66,0xbf,0x78,0x5c,0xe5,0x42,0x95, +0x2a,0x30,0xfa,0x77,0xf5,0xe8,0x5a,0xa8,0x92,0x88,0x44,0x93,0x7f,0x97,0x20,0x38, +0x64,0x82,0x4a,0xa0,0xe6,0x2c,0x98,0x69,0xcb,0x2b,0x7c,0xfa,0x18,0x45,0xdc,0x10, +0x0c,0x8a,0xb9,0xdc,0xec,0x5b,0xd0,0x6c,0x06,0xaa,0xc3,0x83,0xd6,0x55,0xef,0x69, +0x70,0xe3,0xf3,0xa4,0x6e,0x2c,0x44,0x29,0x8c,0xc0,0x20,0x48,0xa0,0xe6,0x87,0xb4, +0xf8,0x75,0x9c,0xfa,0x15,0xf0,0x94,0xd0,0x06,0x04,0x86,0xa2,0xf1,0xe6,0xac,0xd4, +0xb7,0x35,0x94,0x6a,0xb5,0x4a,0xbc,0xa3,0x76,0x7c,0xe2,0xb9,0x71,0xbf,0x5b,0xb0, +0xcf,0x17,0x09,0xa3,0x49,0xb9,0x4b,0xa4,0x45,0xdb,0x14,0xbd,0x68,0x46,0xbe,0x89, +0x6d,0x62,0xfd,0x6e,0xf5,0x2c,0x73,0xd3,0xe1,0x71,0xdc,0x17,0x23,0x4c,0x1a,0x9b, +0xcf,0x4c,0x4c,0xfe,0x30,0x56,0x74,0x20,0xe5,0x92,0x84,0x09,0x8a,0x3d,0x52,0x8b, +0x45,0x6a,0xb5,0x81,0x54,0xf5,0x24,0x7f,0xe8,0xce,0x7b,0x90,0xc8,0x78,0x77,0xb9, +0x4d,0x9f,0x0b,0x2f,0x5b,0xf9,0xc2,0xc7,0x0f,0x2e,0x35,0x3a,0xe3,0xed,0x13,0x0e, +0x83,0xd5,0x15,0xdf,0xd4,0xad,0x9b,0x77,0xf3,0xb0,0x83,0xa2,0x0f,0x3e,0x01,0x7b, +0xb0,0xf8,0x66,0x5f,0x3a,0x45,0x78,0xd9,0x7b,0x5a,0x69,0xae,0xff,0xf6,0x51,0x67, +0x2d,0x97,0x3e,0x59,0x19,0xd7,0xd9,0x7a,0x69,0x79,0xe6,0xae,0x94,0xb0,0xcf,0x01, +0x8e,0x4c,0x2c,0xef,0xb8,0xd6,0xc8,0xd8,0xab,0xb6,0x57,0x90,0xd8,0x47,0x47,0x1d, +0x51,0xda,0xef,0xa0,0xb5,0xd7,0xf5,0x9f,0x62,0xd9,0x9f,0xaa,0xce,0x7b,0xf9,0xe4, +0xd3,0x3d,0x1e,0xbc,0x0d,0x68,0x3e,0x6f,0xec,0x90,0x41,0x9a,0x78,0x06,0xce,0xa8, +0x4d,0x67,0x14,0xac,0x0c,0x3c,0x1e,0xbd,0x16,0xc6,0xc0,0xbb,0xdc,0x7d,0x5f,0xfb, +0x8b,0x31,0x1d,0xc7,0x57,0xb7,0xf2,0x6f,0xf2,0xde,0x3d,0x6d,0xdc,0xce,0x11,0xdc, +0x4e,0xf9,0x17,0x5b,0xe4,0xdf,0x33,0x7f,0xf3,0x74,0x9f,0x5f,0xa3,0xf0,0x80,0xd5, +0x0c,0x7b,0x7b,0xf5,0x19,0x20,0x08,0x35,0x23,0xbf,0x94,0xc6,0xd2,0x9c,0x0e,0xec, +0xb1,0x43,0x58,0x3a,0x3b,0x94,0x60,0xb2,0xc9,0x10,0xf8,0x6b,0xb6,0xcc,0x86,0x73, +0x7b,0xf9,0xa7,0xc9,0x95,0x57,0x69,0xa3,0x40,0x8a,0xeb,0xd5,0x03,0x6d,0xc2,0xf2, +0x60,0xac,0xdb,0x2f,0xbf,0x63,0x21,0x83,0xc9,0xe1,0x17,0xd7,0x7d,0xce,0xe0,0xb6, +0x31,0x93,0xe0,0x37,0x36,0x89,0x9b,0x29,0xab,0x5d,0x6f,0x82,0x76,0x9b,0xa8,0x61, +0xfe,0x06,0xc0,0x51,0x31,0x15,0xa4,0xf4,0x1c,0x33,0xa7,0xf0,0x42,0xdc,0xf9,0xbe, +0xe2,0xf9,0xdf,0x02,0x58,0xef,0xfd,0xf3,0xd6,0x4e,0x69,0x9f,0xc2,0x2b,0xf7,0x40, +0x93,0x4a,0x0a,0xd1,0xc8,0x75,0x99,0xad,0xcd,0x46,0x49,0xf7,0xf1,0x95,0x17,0x7b, +0x30,0x64,0x55,0xa2,0x97,0x2a,0x28,0xca,0x3f,0x4c,0x9b,0xce,0xfc,0x5b,0x50,0x97, +0x61,0x38,0xe2,0x02,0xdf,0xdd,0xda,0xf5,0xf9,0xb4,0x4e,0xec,0xd8,0xd1,0x65,0xd9, +0x8b,0x68,0x34,0x0c,0x15,0x26,0xcc,0x7c,0xb3,0x27,0xa9,0x88,0x19,0x09,0xcb,0xa5, +0x20,0x06,0x6d,0xec,0x53,0x6b,0x43,0x2c,0x36,0x09,0x60,0x1b,0xef,0xe6,0x1b,0x4e, +0xed,0x4d,0x92,0x51,0x52,0x2f,0x51,0x6d,0x4c,0xdf,0xea,0xbc,0xad,0x63,0xe6,0x1a, +0x88,0xa6,0x9a,0xc8,0x53,0x6f,0xdf,0x7d,0x4d,0xbd,0xa2,0xfe,0x79,0x9f,0xaf,0xc9, +0x76,0x2e,0x01,0x5c,0x1a,0x3e,0xda,0x2f,0x9a,0x4f,0xb3,0x29,0x9d,0xe3,0xa9,0x59, +0x53,0xe9,0x04,0xdf,0x1b,0x4f,0xa5,0xfd,0xcb,0x8f,0xe3,0xad,0x20,0x60,0xc4,0x49, +0x37,0x8b,0xf3,0xbe,0xc2,0x3e,0xb0,0x32,0x60,0x8f,0xc6,0x20,0x78,0x06,0xde,0x14, +0x1e,0x11,0x60,0x14,0xcd,0x11,0xe3,0xc2,0x0b,0x35,0x79,0xa7,0x5f,0x35,0x21,0x78, +0x00,0xb9,0xed,0x03,0x4c,0x73,0x85,0xce,0x88,0x16,0x22,0x14,0xf6,0x52,0xd4,0x93, +0xde,0x33,0x21,0xd7,0x32,0xe7,0xe6,0xf6,0x1c,0xe5,0xbb,0x11,0x7d,0x7e,0x2c,0x02, +0xa4,0xe1,0x06,0x83,0xf0,0xb4,0x9e,0x10,0x6e,0x5b,0xf3,0x92,0x81,0xc9,0x48,0x97, +0xa2,0x1b,0xec,0xc4,0xca,0xb4,0x8c,0x0d,0x22,0x53,0x85,0xfe,0x96,0xcc,0xd5,0x06, +0xa0,0xe3,0x8d,0xd5,0xc1,0x36,0x6f,0x1e,0xe4,0xac,0x79,0x7f,0xf1,0x04,0x72,0x83, +0xe0,0x18,0xb6,0x2f,0x42,0x55,0x7a,0x9a,0x02,0x58,0xc5,0x71,0x90,0x73,0xc6,0x59, +0xd4,0x43,0x64,0x93,0xf6,0xb5,0xad,0x32,0x6b,0x78,0x22,0x53,0x7e,0x58,0x5d,0x99, +0x52,0x19,0x8c,0x6f,0xdd,0x96,0xb1,0xc3,0xb4,0x18,0x36,0x1e,0xfe,0x5e,0xb1,0x64, +0x89,0xb1,0xf9,0x1e,0xd3,0xbc,0x87,0xf7,0x19,0x86,0x72,0x7e,0x9e,0x95,0x54,0x9b, +0xd6,0x3b,0x39,0x6c,0x51,0x2b,0xbc,0x18,0x35,0x18,0x5f,0x65,0xd1,0x3b,0x4c,0xc0, +0xc1,0xba,0x02,0x49,0x79,0xce,0xe2,0x37,0x99,0x1d,0xc1,0x68,0x73,0xa1,0xfc,0xc7, +0xc7,0xb6,0x3d,0xcc,0xa8,0xc1,0x0e,0x4d,0x2f,0x5b,0x96,0xe8,0xa6,0xe0,0x19,0x52, +0xba,0xca,0x58,0xad,0xfa,0xee,0x6d,0x16,0x1d,0xe1,0xef,0x17,0x77,0x88,0x79,0xdf, +0xc0,0x9a,0x74,0x82,0x9f,0x24,0xfc,0x45,0x4a,0xee,0x70,0xa3,0x02,0xa3,0x38,0x13, +0xf8,0xb1,0xfe,0x94,0x10,0x2d,0xa7,0x0a,0x42,0x79,0x64,0x74,0x7a,0x6a,0x3d,0x10, +0xe0,0x9a,0xf6,0x25,0x01,0x0e,0x9b,0x35,0xf8,0x70,0x32,0x6e,0xe9,0x49,0xe1,0xca, +0x30,0x22,0xdf,0x31,0x7f,0x47,0xf3,0x07,0x18,0x86,0x89,0x7b,0x2f,0x46,0x0f,0xe7, +0x7a,0x2e,0x9b,0x51,0x07,0x37,0xc6,0x41,0xb7,0x1c,0x39,0xfb,0xf5,0x77,0x3e,0xd1, +0x1a,0x09,0x20,0x9b,0xde,0xe6,0xb0,0xcb,0x85,0xc0,0x90,0xc6,0x0c,0x69,0xcf,0x65, +0x6c,0x20,0x09,0xf0,0x4f,0xa4,0x40,0x22,0x43,0xca,0xc0,0xa6,0x0b,0xe3,0x1f,0xd1, +0x52,0x43,0x6a,0x4a,0x90,0x7c,0x9f,0xe1,0xe4,0x34,0x89,0xe5,0x56,0x5f,0xed,0xa2, +0x67,0xa7,0xec,0x53,0xdf,0x0e,0x19,0xd3,0x9d,0x4c,0xa9,0xfa,0x74,0xa5,0x68,0x6a, +0x48,0xb3,0x81,0x15,0xc4,0x03,0xde,0x59,0xc8,0x3e,0x62,0x35,0x72,0xbc,0xd0,0x3e, +0x76,0x89,0xfa,0x80,0xe6,0x5c,0x39,0x55,0xb2,0x64,0xf5,0x29,0x22,0xa9,0x8f,0x6c, +0x01,0xe8,0x06,0x87,0x1b,0xbc,0x0d,0x2c,0x1a,0xc2,0xe1,0x20,0xb6,0xa8,0x70,0x19, +0xf2,0xab,0x5c,0x21,0x6b,0x1e,0x9b,0xa4,0x32,0x66,0x7b,0x3e,0x17,0x1e,0xca,0xc0, +0x9a,0x18,0x72,0x3c,0xe9,0x27,0x76,0x88,0xcc,0xcf,0x3f,0xaf,0x58,0x6c,0x2b,0x9c, +0x9d,0x8e,0xd0,0xee,0x9e,0x02,0x02,0xf8,0x6d,0x1f,0xb4,0x5a,0x20,0x12,0xc6,0x50, +0xe5,0xfa,0x64,0x73,0x75,0xea,0xb4,0x09,0x8f,0xee,0x57,0xfe,0x95,0x44,0x88,0xa0, +0xf0,0x8f,0x4f,0x3d,0x64,0xa6,0x41,0x99,0x4d,0x87,0xc1,0x81,0x24,0xf4,0xe4,0x83, +0x35,0x4b,0xda,0xb4,0xb1,0xa6,0x0a,0x6e,0xbc,0xdf,0x7b,0xe1,0x56,0x73,0xec,0x6b, +0x04,0x0a,0x8f,0x89,0xed,0x1a,0x02,0x50,0x4b,0x0e,0x7c,0xf6,0xa7,0x7c,0x01,0x7e, +0x04,0xe9,0x0a,0xfc,0x69,0x1d,0x07,0x92,0x45,0x2d,0x26,0x23,0xb5,0xe9,0x9b,0x97, +0xbe,0xac,0x08,0x1f,0x32,0xa5,0x82,0x83,0xc4,0x7c,0xdd,0xf5,0xe1,0xfc,0x66,0x84, +0xb4,0xc0,0x48,0xa0,0xc1,0xa4,0x0b,0x60,0xb2,0x07,0xf3,0xe4,0xa5,0x08,0xc9,0x4a, +0xa0,0x83,0x22,0xd1,0x04,0xd9,0xd0,0x68,0x64,0x17,0xf4,0x59,0x96,0xfa,0x46,0xcc, +0x7e,0x3d,0x5d,0x2f,0x7e,0xf4,0x4d,0xda,0x15,0x6b,0x4e,0xb8,0xd2,0xf0,0x3d,0x4d, +0x5c,0x6c,0x56,0x31,0xa7,0x4a,0xd0,0x88,0x7a,0x67,0x9d,0xb7,0x41,0xfa,0x46,0x88, +0x2d,0x95,0xf6,0x10,0xc7,0x6d,0x64,0xd4,0x0e,0xfd,0x76,0xb3,0x37,0xba,0xfc,0x34, +0xaf,0x9d,0xc6,0x18,0xc1,0xf8,0xa9,0x49,0xe9,0x52,0xb8,0x56,0x72,0xb4,0x5d,0xeb, +0xaa,0xd8,0x54,0xb0,0x42,0xb4,0x49,0x0e,0x8f,0xd3,0xe7,0x51,0xde,0xb9,0x27,0xf9, +0xcc,0xce,0xcf,0xc0,0x1e,0x30,0x59,0x07,0x11,0x9f,0xa7,0xaf,0x1c,0xe0,0x66,0x08, +0xad,0xda,0x1e,0xc6,0x9b,0x63,0x2c,0xbe,0x52,0x73,0xbc,0x10,0xdd,0xf1,0xa0,0x5e, +0x7c,0x0e,0x2e,0x0b,0xb3,0xa6,0x00,0xfd,0xce,0x2c,0xf6,0x54,0x8a,0xf2,0xd0,0xef, +0xa8,0x07,0xe6,0xa9,0x8d,0x5a,0xd7,0x99,0x8c,0xd2,0xbd,0xf2,0x5d,0xf8,0x7f,0xdf, +0xbb,0xdd,0xc1,0xa1,0x18,0xaf,0x80,0x89,0x99,0x00,0x4b,0x80,0x5c,0xbe,0xa7,0x28, +0x33,0x22,0xf8,0xb4,0xe0,0x8f,0xd0,0x79,0x6e,0x01,0x5f,0x63,0xb1,0xcf,0x98,0x63, +0x31,0x0a,0x48,0x58,0x08,0xd5,0x02,0x31,0x62,0x20,0x38,0xc2,0x26,0xbd,0xb9,0x70, +0xb0,0x0b,0x25,0x21,0x4c,0xc1,0x71,0x3f,0x7d,0x4f,0x1e,0xd6,0xdf,0x79,0x0a,0xf9, +0xd3,0x4e,0xd8,0x6a,0xee,0x23,0x67,0x18,0x28,0x72,0x46,0xe4,0xee,0x93,0x93,0x2f, +0x23,0x76,0x1b,0x45,0x71,0x8f,0x90,0xf5,0x95,0x06,0x6a,0xec,0xa7,0xab,0x36,0x56, +0xe2,0xa6,0x9a,0x4a,0xf8,0x41,0x58,0x70,0xa2,0x5e,0xe2,0x8e,0xa8,0x1e,0x84,0x32, +0xf4,0x77,0x52,0xb6,0x16,0xab,0x53,0x66,0xc2,0x46,0xd0,0x1a,0x35,0x27,0x1e,0xa2, +0x0f,0x0a,0xf1,0xae,0x6e,0x4b,0xb5,0x97,0xf0,0x2a,0x99,0x99,0xbf,0x58,0x5c,0xea, +0x76,0x8d,0x79,0xac,0x12,0x5a,0xbe,0xbb,0x4b,0x42,0xed,0xa8,0x0f,0x47,0x08,0xe5, +0x89,0xd2,0x5c,0xe3,0x1f,0x71,0x0f,0xbc,0x3f,0x91,0x47,0x21,0xb8,0xd6,0xfc,0x37, +0x2b,0x0e,0xda,0x2d,0x3d,0x8b,0xd2,0xd9,0x56,0xeb,0x48,0x6a,0xa7,0x50,0x8b,0x9d, +0xda,0xcb,0x86,0x46,0x64,0x97,0x03,0x20,0x35,0x7a,0x5b,0xe1,0x72,0xb0,0xbd,0x3b, +0x78,0x7d,0xa5,0x0c,0x5a,0xfc,0xaa,0x4c,0x9f,0xb1,0xab,0xe8,0x5e,0x52,0x9f,0xab, +0x87,0xf0,0xe2,0x60,0xf0,0x69,0xa1,0x0b,0x22,0x44,0x87,0x74,0x68,0x6d,0x3d,0x4f, +0x6b,0xad,0x30,0x59,0x27,0xa5,0xf8,0x1a,0xa3,0x9f,0x0e,0x54,0xed,0x19,0x33,0x5b, +0x2e,0x4e,0xf1,0xed,0x4f,0x80,0x1f,0x89,0x8e,0x9e,0x1b,0x20,0x81,0x69,0x00,0x0f, +0xdc,0x93,0x7b,0xf6,0x46,0xef,0xd4,0xe7,0x81,0xa6,0x54,0x18,0x71,0xfb,0xf3,0x14, +0x29,0x67,0x33,0x72,0x51,0x33,0x3c,0x04,0xc2,0x34,0x3c,0xc6,0x13,0x64,0xc5,0x80, +0x3e,0x9f,0xdc,0x44,0x17,0x22,0xea,0xd3,0x36,0x54,0x93,0x94,0x92,0xdd,0x62,0x7a, +0x24,0x14,0xd4,0xcc,0x16,0xbe,0xa2,0x53,0x96,0x57,0xe3,0xb2,0x18,0x23,0xbb,0xa2, +0x02,0x19,0x08,0xd5,0x0a,0x30,0xab,0x93,0x25,0x38,0x50,0x19,0xc6,0x35,0x16,0xa4, +0x5b,0x57,0x6c,0xa6,0x90,0x33,0x96,0x83,0x2c,0x5c,0x07,0xd7,0x0c,0x7c,0x38,0xe5, +0x43,0xa9,0x7d,0xe1,0x30,0x7e,0xb2,0x21,0xe6,0xf6,0x7a,0x9e,0x2f,0x37,0x41,0x3f, +0x02,0xbc,0x1d,0x91,0x10,0x52,0xdd,0x60,0xac,0xfa,0x00,0xdd,0x98,0x7f,0xee,0x2b, +0x2e,0x82,0x55,0x04,0x9f,0x78,0xc9,0x00,0x1b,0x5c,0xee,0x88,0xf9,0x75,0x5e,0x1d, +0x19,0x1f,0xe0,0xb8,0xe9,0x1a,0x9e,0x71,0xd2,0x5f,0xb6,0xba,0xf8,0x77,0x13,0x8d, +0xf7,0x76,0x89,0x7f,0xbe,0xa0,0x48,0x09,0xd7,0x4a,0xbf,0x4f,0x79,0x1e,0x2f,0x68, +0x08,0xe4,0xa8,0x39,0xbf,0x81,0x13,0xbe,0x48,0xd3,0xc1,0x7f,0xeb,0x39,0x3e,0xdd, +0xca,0xc9,0xbe,0x4e,0x3f,0x87,0x1b,0x78,0x95,0xf1,0x47,0xd7,0x29,0xe9,0xe2,0x5d, +0xfe,0x7f,0x1e,0x8c,0x1f,0xb6,0xde,0xe9,0x78,0x1c,0xf8,0xd4,0x70,0xd9,0x3f,0x21, +0xa6,0xc2,0x9d,0xc9,0x19,0x38,0x1e,0xae,0x34,0x54,0x1a,0x69,0xf1,0x05,0x26,0x32, +0x54,0x94,0x41,0xe1,0x50,0x7b,0x61,0x8d,0x54,0xe2,0xca,0x39,0xc8,0xd4,0x40,0x42, +0xea,0x0b,0x9f,0xf8,0xfd,0xb3,0xf0,0xef,0xf5,0x82,0x1b,0xdb,0x35,0x9b,0x16,0x3a, +0xa2,0xc0,0xcf,0x56,0x55,0xdc,0xb8,0xfb,0xf1,0x61,0x73,0xd5,0x89,0x62,0x25,0xe1, +0xb7,0xa0,0x5c,0x68,0x6b,0xcc,0xf8,0x94,0x38,0xf3,0x36,0x55,0x2f,0xa2,0x8a,0xb6, +0x59,0x00,0x52,0x6c,0x6a,0xe2,0x2c,0x31,0x1a,0x82,0x79,0x13,0x0f,0xf8,0x00,0x1d, +0xb9,0x79,0x44,0x24,0xe9,0xe5,0x0e,0x64,0xa7,0x47,0xa0,0xf2,0xb7,0xeb,0x57,0xb0, +0x85,0x79,0xfd,0x11,0xdd,0xaf,0x87,0x00,0xbc,0x87,0xd5,0x0d,0xce,0x68,0x19,0xc1, +0x5b,0xd9,0xdb,0xb4,0xae,0x0b,0xd2,0x90,0x4a,0xcb,0x45,0x18,0x75,0xa7,0x14,0x3c, +0x24,0x81,0xa1,0xc2,0xf4,0xd2,0xb2,0x8c,0xc1,0xbd,0x86,0x8d,0xcd,0x1a,0xe2,0xd3, +0x98,0x73,0x1d,0x6e,0x30,0x03,0x52,0x28,0x2e,0x43,0x1e,0xaa,0x2a,0x02,0x10,0xe5, +0x0b,0xa9,0xd2,0xf6,0x95,0xeb,0xe5,0x9a,0x36,0xa9,0xb2,0xd6,0x94,0xab,0xa3,0x8f, +0x84,0xfc,0xdb,0x2f,0x7c,0x7f,0x82,0xc9,0xbb,0xce,0xa1,0x64,0xda,0x39,0xce,0x24, +0xa3,0xc9,0xa8,0xc4,0xfd,0xa3,0x60,0x3b,0xcb,0x61,0x68,0xea,0xbd,0x06,0xcd,0xa0, +0xe7,0x14,0xf4,0x67,0x18,0x7f,0xbf,0x95,0x35,0x8c,0xe7,0xea,0x42,0x50,0x30,0x5b, +0xac,0x8e,0xf2,0x4b,0xe7,0x9c,0x34,0x1a,0x4b,0x6f,0xa9,0x84,0xe6,0xe6,0x1b,0xc9, +0x8f,0xf3,0x23,0x2d,0x61,0x21,0xf3,0xb7,0x31,0x63,0xcb,0x56,0x25,0x63,0x94,0xa0, +0x0d,0x87,0x2b,0x23,0xf2,0x0f,0x35,0x08,0xd8,0x4d,0x87,0x04,0x8e,0xe4,0x0e,0x07, +0x67,0x70,0x02,0x7b,0x14,0xf2,0x35,0x40,0xe6,0xd8,0x7b,0x29,0xf6,0xf8,0xa9,0x17, +0xa7,0x25,0x6c,0x97,0xab,0x44,0x5c,0xf2,0x70,0x53,0xb0,0xb1,0xd4,0x79,0x35,0xe1, +0xf6,0x93,0xa1,0x14,0x48,0x91,0xb8,0x53,0xe0,0xdd,0x41,0xd5,0x57,0xf4,0x1e,0xf1, +0x84,0x23,0x7d,0x13,0xee,0x35,0x45,0x31,0xe0,0x22,0xb9,0x55,0x76,0xfd,0xfe,0xfb, +0x20,0xbc,0xde,0x76,0xe2,0x1b,0xe1,0x0d,0x87,0xb7,0xca,0xca,0xd1,0xe4,0x1b,0x44, +0xfc,0xd4,0xa3,0x32,0x04,0x8e,0xc5,0x82,0xe7,0xca,0x43,0xc7,0xd6,0x54,0x9c,0xbc, +0x05,0x26,0x41,0xa5,0x92,0xf4,0x8c,0x9c,0x6b,0xa0,0xcb,0xca,0x51,0xb7,0xb6,0x40, +0xd8,0x9e,0x57,0x2d,0xa7,0x7a,0x27,0xf1,0x75,0xdf,0xc5,0xc7,0xb1,0x58,0xf9,0x8f, +0x2a,0x69,0x66,0x56,0x14,0x23,0x4e,0x28,0x69,0x09,0xde,0xa8,0xff,0x9c,0xf1,0x9e, +0x2b,0x68,0x75,0x41,0x3b,0xa3,0x46,0xbe,0x8d,0x58,0x6e,0xa0,0x43,0x0d,0x36,0x0f, +0x8f,0xf6,0xe5,0xfd,0x47,0x45,0x0d,0x49,0xc8,0x71,0xdf,0x4d,0x7f,0xf7,0x3e,0x1f, +0x8f,0x9b,0xbc,0x45,0x5a,0xfb,0x37,0x48,0x69,0x76,0xec,0xa5,0x87,0x4f,0xa6,0x62, +0x93,0xde,0x99,0x89,0xc3,0x0a,0xf2,0xd5,0x0b,0x9d,0x56,0x9c,0x1c,0x90,0xae,0x4f, +0x7f,0x86,0x42,0xa5,0xfd,0xf3,0x7c,0x85,0xb5,0x22,0x4a,0x9c,0x84,0x98,0xa1,0xd6, +0x9d,0x20,0x98,0xb1,0x6c,0x21,0xc8,0xac,0x34,0xd6,0x89,0xe8,0x5f,0x61,0x42,0x5f, +0xe1,0x0f,0xd4,0x4d,0xbf,0xb7,0xef,0x06,0xef,0x9e,0xc7,0x01,0x53,0xf2,0xff,0xe8, +0x4b,0x40,0x0e,0xe2,0x34,0xad,0x1c,0x33,0x13,0x08,0x70,0x1b,0xa4,0x91,0xfe,0x62, +0xa2,0x07,0x70,0x52,0x6d,0x31,0x98,0x8d,0xf7,0x03,0x27,0x6a,0xd6,0xc6,0x03,0xdc, +0x02,0x0a,0xff,0x78,0xa3,0x0c,0xa6,0x19,0x34,0x33,0x26,0x85,0xf4,0xbe,0x01,0xa7, +0x20,0x89,0x71,0xfd,0x52,0x6c,0x56,0xd5,0xf2,0x78,0x31,0x93,0xd7,0x92,0xec,0x3f, +0xd8,0xfb,0x57,0xbb,0xf3,0xa7,0x90,0xa0,0x42,0x42,0xaf,0xe0,0x45,0xfa,0xf6,0x58, +0x8e,0x88,0x6c,0x2f,0xb0,0x64,0x20,0x54,0xa2,0xda,0x18,0x64,0xdf,0xc7,0xfa,0xdb, +0x75,0x05,0x11,0x5a,0x16,0x89,0xd9,0x66,0xa1,0xc6,0x41,0xe1,0xcd,0xae,0xae,0xae, +0x62,0xd1,0x6e,0x7d,0x95,0x57,0x1e,0xf5,0xdf,0x3b,0x97,0xa4,0x98,0x26,0xf9,0xea, +0xa9,0x82,0x83,0xea,0x08,0x67,0xa9,0xde,0x58,0xb5,0xeb,0x6a,0xf2,0x29,0x6a,0x58, +0xeb,0xd4,0x5a,0x38,0x9b,0x2a,0x02,0x3d,0xb7,0x29,0xea,0xfa,0xf3,0x28,0x84,0x59, +0x89,0x05,0x2b,0xac,0xf3,0xf3,0xe9,0xad,0x98,0x60,0x53,0x2c,0x46,0x26,0x73,0x3e, +0x74,0x04,0xca,0xbd,0xc1,0x3b,0x9f,0x3d,0x9a,0xfc,0xa5,0xe1,0x54,0xed,0xb9,0x6c, +0x2e,0x4e,0x70,0xc8,0x45,0x50,0x6a,0x50,0xb9,0xf1,0x12,0xa1,0x1f,0x2e,0x42,0x3a, +0xe9,0x58,0xbf,0xcd,0x4c,0x80,0xf5,0x5c,0xc9,0x4e,0x6b,0x52,0x7f,0x6b,0x09,0xa9, +0x08,0x0a,0x74,0x65,0x9e,0xd4,0x0b,0x9f,0x17,0xd3,0xd1,0x6a,0xee,0x3b,0xcd,0xa9, +0x74,0x00,0x00,0xd9,0x88,0xc0,0xdf,0x0b,0x68,0x4c,0xd3,0xda,0x7a,0x90,0x83,0xc6, +0x78,0x9d,0x4b,0x97,0x36,0x58,0x2c,0x70,0x97,0x5f,0x9c,0xa0,0xff,0x31,0x29,0x66, +0xa4,0xf3,0x3a,0xf6,0xc6,0x37,0x64,0x97,0x02,0xa1,0xc6,0xb6,0x0d,0x33,0x5c,0x9b, +0x47,0x09,0xdd,0xa1,0x32,0x3a,0xa1,0xc3,0xa3,0x8d,0x39,0x81,0x11,0x8d,0x73,0xe0, +0x4a,0x5a,0x85,0xa2,0x10,0x5f,0x65,0x33,0xe8,0x8e,0x91,0xcb,0x50,0xac,0xc0,0xc5, +0x26,0xce,0xeb,0x29,0x30,0xcf,0x8b,0x80,0x15,0x22,0x25,0x02,0x56,0x38,0xdc,0x17, +0x21,0xe0,0x07,0x37,0xb1,0xc9,0x5b,0xb3,0x3f,0x79,0x93,0x66,0x57,0x88,0x70,0x45, +0xf1,0xa1,0xd6,0x39,0x94,0x76,0xd5,0x20,0x58,0x7a,0xa1,0x18,0xb2,0x34,0x49,0x96, +0x22,0x19,0xb7,0xa7,0x10,0x43,0xdc,0xb2,0xa3,0x73,0xcf,0xe0,0x18,0x8e,0xae,0x81, +0xad,0x58,0x65,0xcb,0xe6,0x30,0x2e,0xf8,0x6c,0x57,0x3a,0x29,0xdb,0x88,0x3a,0x65, +0x08,0x62,0x22,0x5c,0x9a,0x78,0xde,0xb5,0x69,0x5f,0x57,0xe8,0x4a,0x69,0xef,0x99, +0x8c,0xc1,0x03,0x4a,0x38,0x1a,0x87,0x2b,0x65,0xd8,0x60,0xa1,0x53,0x3a,0x9e,0x68, +0xa8,0x0a,0x63,0xe2,0x63,0xe6,0xb7,0xb1,0xda,0x71,0x27,0x4e,0xb0,0x6b,0x46,0x39, +0xe6,0x3c,0xcd,0x21,0x32,0x7c,0x9a,0xe8,0xe3,0x7d,0x46,0xec,0x7a,0x7c,0xf9,0xfc, +0xa4,0xb0,0xb4,0x2c,0x33,0x32,0x20,0x9c,0xe9,0x55,0xde,0xfc,0x7b,0x7d,0x47,0x0b, +0x29,0x58,0x0e,0xed,0x38,0xc2,0x57,0x9b,0x01,0xf7,0xd7,0xed,0xfa,0x7e,0x87,0x4a, +0x8a,0xb2,0xe9,0x88,0xea,0x7f,0xaa,0x1b,0xab,0x50,0xdf,0xfd,0xfb,0x7f,0xb0,0x44, +0xae,0x7b,0xfa,0x00,0xb7,0xc5,0xf0,0xfe,0xfc,0x81,0x73,0xe6,0x0c,0x55,0xf7,0x07, +0x82,0x86,0xf2,0x15,0xb6,0xc4,0xc0,0xb6,0x12,0xd6,0x78,0xfe,0xba,0x3c,0x27,0x87, +0x8c,0xf4,0xfb,0x47,0x37,0xe3,0x68,0x54,0x61,0x42,0x7a,0x36,0x83,0x5f,0x81,0xb1, +0x5a,0xdc,0xf3,0x55,0x36,0xe2,0x60,0x44,0x60,0xad,0xc1,0x10,0x28,0xec,0x00,0x40, +0x43,0x8b,0xd8,0xb8,0xba,0xa9,0x8f,0x99,0xc4,0xc7,0xca,0x84,0xab,0xeb,0xa8,0x4a, +0x0c,0x8e,0x65,0xa6,0x1b,0xaa,0xe8,0xf0,0x4e,0x18,0xe8,0xf2,0x5b,0xa7,0xf1,0xc7, +0x99,0x6f,0x1e,0x63,0x14,0xae,0xf5,0x93,0xce,0xc9,0x61,0xe3,0x86,0x3b,0xed,0x57, +0xd4,0x30,0x89,0x17,0x82,0x2a,0x41,0xa3,0x3c,0xc8,0x66,0x6d,0xf3,0xe1,0xca,0xa8, +0xa8,0x0f,0x62,0xd7,0x0a,0xef,0x50,0x22,0x4d,0xd8,0x22,0x0e,0x24,0xea,0x3a,0xaf, +0xe8,0xc8,0xa9,0xef,0x74,0x56,0xf3,0x42,0xca,0xf8,0xd8,0x06,0x4f,0xa4,0xc3,0xbe, +0x09,0x8d,0xa4,0x7c,0xf5,0xa1,0xf3,0x07,0x92,0x88,0x5f,0xc7,0x4d,0xa7,0xeb,0x52, +0x26,0xc7,0x6b,0xcb,0x75,0xe9,0xab,0xb9,0xc4,0x76,0xa1,0x3d,0x1f,0xcf,0x95,0x4b, +0x02,0xce,0x9a,0x6a,0xc7,0x51,0x12,0x2b,0xb7,0xc1,0x51,0xd0,0xff,0x53,0xa7,0x2f, +0x09,0x1d,0xea,0xa2,0x39,0xed,0x21,0xe9,0x34,0xc4,0xc8,0x38,0x71,0x81,0xa8,0x60, +0xaa,0xcc,0xcc,0xa2,0xee,0x55,0x79,0x6a,0x6d,0x8f,0x2c,0x6e,0xda,0x16,0x27,0x3b, +0x83,0x78,0x20,0xbc,0x46,0x52,0xce,0xa3,0x7b,0xb5,0xa1,0x77,0x01,0xf4,0x13,0x5a, +0xd4,0xea,0xc7,0xc6,0x78,0x4d,0xf4,0xaf,0x60,0xd6,0x0c,0x55,0x31,0xeb,0x72,0xe1, +0x15,0xde,0x57,0xb2,0xb8,0x0c,0xe0,0xb6,0x2c,0x5e,0xbd,0xd0,0x9e,0xe9,0xe5,0x42, +0x9b,0x89,0xc2,0x78,0x41,0x24,0x19,0xf4,0xe2,0xa2,0x34,0xc1,0x1f,0x1a,0x2c,0xe0, +0x9d,0xdc,0x4a,0x68,0x44,0x65,0x63,0x72,0x65,0x78,0x2d,0xc7,0x75,0xec,0xab,0xb2, +0xa6,0x8b,0x2d,0xe6,0x7b,0x78,0x9c,0xcc,0x42,0x29,0xf4,0xe6,0x76,0xf4,0x0d,0xf6, +0x14,0x15,0x62,0x10,0x7a,0xab,0xc3,0x69,0x98,0x94,0xfc,0xf6,0x77,0xf5,0x5b,0x02, +0xc7,0x92,0x6b,0x8c,0xfb,0x0a,0x99,0x78,0xe7,0x56,0xf5,0xe7,0xf6,0xf6,0xd5,0x94, +0x6d,0xde,0x63,0x08,0x4a,0x13,0xd1,0x88,0x39,0x28,0xfd,0xf7,0xf7,0xf7,0xb6,0x0e, +0x62,0x85,0x5d,0xaa,0xb3,0xba,0xfe,0xaa,0x5f,0x73,0x88,0x92,0x1d,0xfc,0x3d,0xfa, +0x56,0x90,0xa6,0xa8,0x9c,0x16,0x64,0x45,0xca,0x54,0xa8,0xdc,0x82,0x54,0x79,0xa6, +0x66,0x31,0x10,0x8e,0x31,0xbc,0x6d,0x56,0x4b,0xca,0xd6,0x8b,0x15,0xab,0x74,0xb8, +0x65,0xe1,0x38,0x8c,0x62,0xb8,0x66,0x6b,0x4a,0xc0,0xaa,0x1a,0x0a,0xba,0x24,0xd9, +0x4b,0x93,0x2f,0x2c,0xde,0x0d,0xe6,0xf5,0xea,0x08,0xf6,0xee,0x7e,0xfc,0x05,0xfe, +0xad,0xd5,0x15,0xfa,0xd6,0x74,0xbb,0x81,0xcc,0xb8,0xfe,0xfe,0x7f,0xfd,0x55,0x30, +0xa8,0xc4,0x18,0xbd,0xd4,0xb1,0xd3,0x84,0xcf,0x1e,0xf7,0xef,0xfe,0xfe,0xa0,0x2b, +0xa3,0x90,0xc9,0xbb,0x1c,0x3a,0x5f,0x0c,0xcb,0x52,0xff,0xff,0x58,0x62,0xa8,0xb5, +0xe1,0x1b,0x0b,0x66,0xd1,0x42,0x5a,0xc2,0x73,0x98,0xc9,0x27,0xf5,0xbf,0xe0,0x94, +0x86,0x51,0x4c,0xb3,0x97,0x73,0x9f,0x20,0x72,0x17,0xc1,0xf0,0xf4,0x97,0xa1,0xf7, +0x05,0xa3,0x45,0x80,0xd3,0x02,0xe9,0x43,0x01,0xc8,0x90,0x43,0x2f,0x0c,0x50,0x8a, +0x26,0x05,0xe9,0x17,0xca,0x2e,0xe1,0x57,0x36,0xca,0xd8,0x53,0x07,0x69,0x94,0xae, +0x31,0x20,0x09,0x37,0x09,0x80,0x30,0x62,0x67,0x49,0x9d,0x8e,0xb3,0x5f,0xe4,0xd5, +0xd6,0x67,0xb0,0x99,0xf8,0xbf,0x60,0x56,0xaa,0x03,0xe0,0xfd,0xfc,0x63,0x81,0x2c, +0x48,0xda,0x08,0xa7,0x72,0x82,0x85,0xe7,0xd8,0x23,0xf0,0x82,0x63,0xc7,0x20,0xba, +0x01,0x6b,0xa9,0x57,0xf8,0x2a,0x1d,0x99,0x5f,0x8c,0xfd,0x69,0x72,0x61,0x2a,0x66, +0xab,0x6d,0xc8,0x11,0x2b,0x2d,0x16,0x48,0x0c,0x95,0x97,0x53,0x38,0x6a,0x95,0xf5, +0x1e,0xb2,0xd0,0x0c,0xbe,0x2f,0x18,0xd0,0xdf,0xb4,0xdb,0xda,0x6a,0x43,0x7b,0xf5, +0x05,0xf1,0x7b,0x6b,0xbb,0x4a,0xff,0xba,0xf4,0x42,0x92,0xcb,0x39,0xb9,0xf4,0x9d, +0xde,0x24,0xab,0xdc,0x38,0x30,0xe3,0xc5,0x44,0xb0,0x23,0xc3,0xc9,0x26,0x0c,0xcc, +0x37,0xa3,0xe8,0xc9,0x59,0xcc,0x56,0x80,0x1c,0x01,0x71,0x72,0x5c,0x15,0x2c,0x06, +0x86,0x6f,0x03,0x9b,0xd9,0xfd,0xff,0x6c,0x6b,0x6f,0xe2,0x8d,0xf8,0xed,0x1a,0x88, +0x8c,0x77,0xd3,0x2f,0xfc,0x83,0xac,0x09,0xc6,0x55,0x65,0xef,0x52,0x9e,0xe0,0xdc, +0x18,0x30,0x83,0x60,0xa8,0xcd,0x5e,0x0a,0xf6,0xee,0xe9,0x82,0x59,0xbb,0x5d,0xa5, +0x43,0x70,0x7c,0x06,0xb0,0xe6,0xcb,0xd0,0x5f,0xa0,0x95,0xc2,0x8b,0x76,0x86,0x68, +0xa1,0xaa,0x8a,0x7d,0xb5,0x73,0x60,0x32,0xe1,0x5b,0x28,0xcf,0xd2,0x6a,0xfd,0x7d, +0x28,0xe9,0xbd,0x55,0xec,0x3b,0x2f,0x5a,0xe6,0x88,0x3d,0xad,0x01,0x7d,0x04,0x7c, +0xe1,0x51,0x10,0xff,0x82,0x19,0x25,0x80,0x40,0xf2,0x96,0xd3,0x46,0x63,0x2d,0x2b, +0xdd,0x12,0x1b,0x8c,0x45,0x30,0x44,0x69,0x3a,0xf0,0x77,0x4a,0xd3,0x7f,0xf8,0xaf, +0x80,0xce,0xe8,0xec,0x35,0xb5,0xf0,0x63,0x5e,0x5f,0xd9,0x76,0xa7,0x22,0xed,0xd8, +0x57,0x19,0x05,0x14,0xb4,0x30,0xcc,0x95,0x0b,0x0f,0x55,0xc2,0x53,0x7d,0xee,0x2c, +0x3e,0x8c,0x50,0x57,0x33,0x9c,0xd9,0xe2,0xde,0x9e,0xdf,0x17,0x5f,0xfc,0x4b,0x63, +0x5f,0x3c,0xbc,0x6a,0x28,0xb3,0x2e,0x5b,0x33,0x36,0x2e,0x43,0xfa,0x54,0x34,0x63, +0x2f,0xc3,0x69,0xfe,0x7a,0xc9,0x7e,0xba,0x02,0x54,0x23,0x5e,0xfb,0x35,0xd8,0xd1, +0x97,0x90,0xdf,0x6b,0x3a,0x3e,0x75,0x39,0xe9,0xea,0x39,0xc3,0x5b,0x1f,0x73,0x1d, +0xdc,0x79,0x97,0x8c,0x82,0x71,0x35,0x69,0xb5,0x58,0x1a,0xc3,0x5a,0x1e,0x66,0x31, +0xe1,0x67,0xfe,0x9e,0x34,0xb6,0x70,0x85,0x56,0xf1,0xde,0x0e,0xf8,0x78,0x95,0x86, +0x54,0xfc,0xf0,0x04,0x72,0x47,0x56,0xfd,0xa3,0x04,0x1a,0x79,0x38,0x8f,0x57,0x4d, +0xb1,0x21,0x41,0x48,0x3c,0x3e,0xce,0xae,0x20,0x27,0xd8,0x8f,0x05,0x1c,0x14,0xdb, +0xd0,0xf8,0xd7,0xd0,0x34,0x92,0xca,0x8a,0xd7,0xfe,0x1b,0x7b,0xbf,0x79,0x1a,0xea, +0x84,0x4f,0x80,0xe0,0xf5,0xbb,0xf2,0xcf,0x36,0x7b,0x4f,0x61,0x67,0x58,0x71,0x31, +0xa2,0x2e,0xbb,0xf4,0x97,0xed,0xe3,0x74,0x3a,0x3b,0x5b,0xf6,0x1d,0x3c,0x20,0xf5, +0x6f,0x88,0x44,0xe1,0x16,0x8e,0xce,0xa7,0x93,0xed,0x09,0xb8,0xc6,0xaf,0xe5,0x55, +0xd3,0x85,0xa6,0xf5,0x17,0x2f,0xe4,0x8b,0xbe,0x3c,0x41,0x3f,0x28,0xac,0x9f,0xc0, +0x83,0x35,0x58,0xb9,0xff,0xfe,0xe9,0x91,0x73,0x49,0x01,0xe2,0x6b,0x71,0x10,0x21, +0x3b,0x04,0xd0,0x06,0x37,0xaa,0xe3,0x10,0xb0,0xa7,0x80,0x51,0x34,0xed,0xda,0xa1, +0x2a,0x7b,0x4d,0xd8,0x95,0x07,0x0f,0x0e,0x44,0xc2,0x91,0x79,0x4a,0x6b,0x6b,0xac, +0x66,0xe4,0x32,0x55,0xe8,0x4f,0xbd,0xa3,0x99,0x68,0x81,0xf5,0x03,0x33,0x8e,0xce, +0xaf,0x8e,0xb0,0x7d,0x47,0xa7,0xf2,0xf6,0xe7,0x13,0xeb,0x2d,0xf9,0x37,0x6b,0x5c, +0x1d,0xc5,0x25,0xf6,0x95,0x24,0xbd,0x48,0xb6,0x8b,0xf8,0xba,0x60,0x46,0x8b,0x07, +0x2f,0xc6,0x99,0xf0,0x9a,0x8b,0x9f,0xd6,0xd7,0xb1,0xb2,0x49,0x5e,0x86,0xaf,0xf3, +0x8d,0xc4,0x53,0x17,0xfe,0xa3,0xf0,0xd8,0xba,0x17,0xe2,0xfe,0x78,0x74,0x99,0xa2, +0x5f,0xc1,0xbd,0x28,0x18,0xd6,0xe8,0x82,0x12,0x61,0xca,0x8e,0x5a,0x89,0xaa,0x37, +0xaf,0x51,0x8a,0x5d,0x27,0xa2,0x32,0x6e,0x7c,0x1f,0x59,0x60,0xfc,0x88,0x18,0x43, +0x2b,0x31,0xd2,0x30,0x7d,0x2e,0x6e,0x8d,0x43,0x38,0xcb,0x8f,0xce,0xe8,0xc7,0xde, +0x5a,0xed,0xb4,0xbe,0xec,0xaf,0xc3,0x93,0x93,0x80,0xa1,0x97,0x7c,0xe9,0xe4,0x5a, +0xb8,0x96,0x64,0xeb,0x85,0xab,0x0c,0xa7,0x0f,0x6a,0x0b,0x44,0xf6,0x9c,0xe8,0x42, +0x5b,0xf3,0xf6,0xd4,0x92,0xb7,0x04,0xe0,0x6b,0xb3,0x83,0x54,0xf7,0x9d,0x05,0xda, +0x05,0xf0,0xae,0xf5,0x13,0xa2,0x77,0x21,0x64,0xd8,0xaa,0xdd,0x57,0x97,0xcd,0x0a, +0x27,0x97,0x8d,0x08,0x14,0x3f,0x77,0xb6,0x1a,0xd5,0x73,0xd9,0x56,0x96,0xb9,0x5e, +0x20,0xae,0xaf,0x54,0xc7,0x19,0xee,0x72,0x8d,0xa5,0xd4,0xaf,0xd7,0x2b,0x54,0x02, +0x79,0x3a,0x6d,0x54,0xbf,0xe4,0x25,0xe2,0xc0,0x78,0xf2,0x72,0x06,0xc5,0x18,0x41, +0x26,0xdf,0x28,0x55,0xf6,0xbe,0x53,0x97,0x45,0x52,0x95,0xe5,0xe7,0xed,0xf4,0xf4, +0x06,0x1d,0xd5,0xb7,0xb3,0x97,0xe4,0xc2,0xda,0x78,0x9d,0xf5,0xea,0xfa,0x2d,0xe8, +0x1f,0x8e,0xec,0x93,0x1d,0x28,0xa9,0x6c,0xe2,0xc3,0x0b,0x4c,0xfe,0xfc,0x16,0x4a, +0x71,0x36,0x96,0x77,0x64,0xd6,0x38,0xc9,0x36,0xb5,0xf4,0xa3,0x96,0x88,0xdf,0x09, +0x2c,0x62,0x9f,0x5f,0x1f,0x1b,0x54,0x4d,0x12,0xba,0x87,0xcd,0x03,0x76,0xba,0x8b, +0x52,0x17,0x95,0x3a,0xa7,0xd4,0xfb,0x5d,0x6f,0xdf,0xad,0xaf,0x42,0x76,0xa1,0x39, +0x13,0xf9,0xe8,0xcc,0xd9,0x11,0x3b,0x02,0x20,0x93,0x0d,0x6c,0xfe,0xa4,0x73,0xb8, +0xee,0x17,0x4c,0x39,0x8e,0x1c,0x63,0x09,0x78,0x9f,0xfb,0x7c,0xff,0x27,0x5f,0x1b, +0xf2,0x31,0x2e,0x25,0x5f,0x85,0x2e,0x77,0x4b,0x7f,0xae,0xa7,0xf8,0x67,0xe8,0x33, +0xf9,0xd0,0xd7,0x56,0x10,0x12,0x66,0xfb,0xe9,0xb5,0xc7,0x7d,0x01,0x60,0x78,0x82, +0x80,0x29,0x38,0x24,0x1a,0x30,0xea,0x53,0x78,0x2c,0x50,0x31,0xfd,0x22,0x70,0x56, +0xfd,0x4d,0xb2,0xef,0x91,0xe1,0x26,0x1c,0x8b,0xa8,0x98,0xb6,0x85,0x3a,0x39,0x83, +0x01,0x32,0xff,0x50,0x2c,0x1b,0x77,0x54,0xc1,0x20,0xd0,0x25,0xd6,0x7a,0xcc,0x95, +0x98,0x2c,0xf7,0x40,0x2d,0x1a,0x11,0x28,0x24,0xbc,0xa1,0x72,0x1b,0x8a,0x60,0x5d, +0x31,0x50,0x5b,0xa4,0x54,0xd9,0x28,0xe2,0xcf,0x1d,0x0e,0x94,0x6e,0x6b,0xc0,0x32, +0x8e,0xf3,0xd7,0xd6,0x93,0xb4,0x78,0x9e,0xe2,0xc9,0x92,0x23,0x12,0x75,0xfb,0xbe, +0x00,0xd2,0xb3,0x4f,0x96,0x89,0x29,0x46,0x61,0x40,0xb1,0x05,0xae,0x6b,0x41,0x54, +0x7e,0x85,0xf1,0xe7,0x5f,0x17,0x13,0x6c,0x41,0x2b,0xa1,0x17,0x90,0x78,0x38,0xfb, +0x39,0x13,0xb5,0x78,0xe4,0xe1,0x2c,0x01,0xc7,0xbe,0xcb,0xb1,0xff,0x6e,0x6a,0x1a, +0x4e,0x04,0x41,0xcf,0x9b,0x2a,0xfd,0x78,0x4d,0x05,0xde,0x1b,0xb0,0x58,0x81,0xef, +0x63,0x23,0x43,0xd0,0xdf,0x68,0x5b,0x38,0x21,0x1b,0xb3,0x8d,0xde,0xf3,0x41,0x04, +0xe9,0xab,0x0f,0xed,0x91,0x24,0x1f,0x99,0x9d,0x8b,0xe3,0x1a,0x30,0x3a,0x3a,0x3a, +0x88,0xd8,0x9c,0x11,0x1e,0xa7,0x49,0x8a,0xc8,0x48,0xaa,0xee,0x34,0x0f,0xb2,0x50, +0xac,0x16,0xb2,0x9a,0xe7,0x6c,0xc8,0x9a,0xaa,0x4b,0xba,0x38,0x7a,0xe0,0x64,0xab, +0xb9,0x6c,0xe6,0xaf,0x79,0x4b,0xae,0x0b,0x48,0xc2,0xeb,0xbd,0x05,0x61,0x0d,0xbf, +0x9b,0x40,0xab,0x1d,0x95,0x22,0xf3,0x6c,0x68,0x49,0xa3,0x5a,0x78,0x69,0x3e,0x62, +0xa5,0x45,0x5f,0x66,0xb2,0x34,0x8a,0xc2,0x9b,0x8d,0x6e,0xe2,0x50,0x3c,0x6c,0x92, +0x5a,0x1c,0x0b,0x7c,0x37,0x7e,0x1d,0x56,0x52,0x43,0xa4,0x5c,0x4e,0xbe,0x65,0x21, +0xac,0x1d,0x5e,0xe7,0x71,0xb8,0x4c,0xb8,0x47,0xef,0x01,0x27,0x70,0xb9,0xd9,0x17, +0xf5,0x10,0x35,0xd2,0x73,0x93,0x23,0x98,0x46,0x48,0x27,0xf2,0x33,0x63,0xc3,0xa6, +0xdd,0xb9,0xbc,0x46,0x10,0x56,0x7e,0xd4,0xc3,0xde,0xec,0x34,0xad,0x7b,0xd9,0xa3, +0x1f,0xb4,0x9c,0xcc,0x50,0x55,0x24,0xe1,0x83,0x53,0x96,0x1b,0xd0,0x78,0xd0,0x86, +0x7c,0x1c,0x9f,0xd0,0x11,0x30,0xd2,0x81,0xf2,0xfd,0xb5,0x50,0xdc,0x7b,0x75,0xe1, +0xcf,0x08,0xb5,0x57,0xb6,0xcd,0x77,0xc0,0x40,0x51,0xd7,0xf4,0x50,0x7a,0x85,0xc5, +0xaa,0x1c,0xce,0x89,0x5b,0x98,0x53,0xdb,0x5c,0x17,0xde,0xa8,0x1f,0x79,0x6e,0x9a, +0x5d,0x14,0xb6,0x4c,0x65,0x98,0x87,0xf3,0x6f,0xaa,0xc7,0x45,0x9e,0xb4,0x90,0xeb, +0x4b,0xe5,0x7f,0x0f,0x38,0xe1,0xd7,0x69,0xe8,0x18,0xf7,0xaf,0x97,0x77,0x90,0x79, +0xf1,0x16,0xb7,0xac,0x18,0x20,0xde,0x3d,0xee,0xa2,0x33,0x2f,0xed,0x71,0xfe,0x8f, +0x24,0xb3,0xfe,0x9c,0x32,0x33,0x7c,0xd9,0xcb,0x5a,0xdc,0xe8,0xd9,0x87,0x46,0xcc, +0x48,0x22,0xc4,0x9c,0x98,0x3b,0x74,0xcc,0xca,0xa2,0xbe,0x49,0x1b,0xf0,0x52,0x8e, +0x68,0xfe,0xa7,0x6d,0x06,0x33,0xfb,0x80,0x49,0x58,0x2e,0x69,0xa1,0xb6,0x59,0xf0, +0x40,0x2e,0x9f,0xcc,0x1a,0xb7,0x15,0xe4,0x69,0x7b,0xa7,0xda,0x98,0x80,0x79,0x9a, +0xa3,0xcd,0xf0,0x1a,0x37,0xa6,0x60,0x23,0x48,0xc3,0xc8,0x06,0x5e,0x80,0x12,0xfa, +0x0f,0xce,0x6c,0x93,0x56,0xc1,0x26,0x50,0xae,0xf0,0xf1,0x94,0xb4,0x1e,0xde,0xeb, +0x80,0xcd,0x81,0xff,0x35,0x2e,0x77,0x3b,0x46,0xc6,0x8f,0x0e,0x77,0xa0,0x96,0xe2, +0x26,0x70,0xf0,0x9b,0x32,0xae,0x8d,0x51,0x2e,0x92,0x79,0xea,0xf3,0x6e,0x00,0x5c, +0x70,0x8b,0xaa,0xbd,0xb5,0xa9,0x5a,0x56,0xe7,0x4e,0x78,0xba,0x16,0xeb,0x31,0x63, +0xa2,0x3a,0xe7,0x86,0xa8,0xaa,0x32,0x6f,0x2c,0xca,0x80,0xf4,0x52,0xbe,0xba,0x01, +0xf9,0x0c,0xab,0xa8,0x90,0x3f,0x09,0x03,0xda,0x4a,0x45,0x05,0x97,0xa6,0xb4,0xc5, +0x81,0x5d,0x89,0xf7,0x95,0x2c,0x7f,0x41,0x45,0x8b,0xa3,0x76,0x74,0xe1,0x10,0xf5, +0xf8,0x87,0xe8,0xb3,0x2f,0x69,0x9a,0xbb,0x33,0x41,0xeb,0xd3,0xbb,0xf3,0x22,0xad, +0x6e,0xa9,0x2e,0x2c,0x76,0xa6,0x84,0xb8,0xcd,0xd0,0xe3,0xce,0xba,0xf2,0xe3,0xd3, +0xc8,0x8c,0x5b,0x69,0xf7,0xa5,0xe8,0x2b,0xca,0x20,0x6d,0xd9,0xcc,0x25,0x53,0x99, +0x8c,0xfc,0xad,0x0d,0x1f,0x7f,0x03,0xc5,0x4f,0xcf,0xe5,0xc9,0xee,0x30,0x1e,0xb6, +0x8f,0x77,0x65,0xac,0x9c,0xaf,0xf4,0x88,0xcc,0x80,0x7a,0x87,0xfd,0xea,0xea,0xde, +0x58,0xa2,0xe0,0x4b,0xbc,0xab,0x30,0x98,0xae,0xcb,0x9a,0x3a,0x28,0x6d,0xb0,0xa6, +0x9e,0x35,0x52,0x2d,0xdd,0xa1,0xf5,0x09,0x4c,0xa2,0x7b,0x92,0x3f,0xe1,0x51,0xa8, +0xb3,0x94,0xbb,0xce,0xfc,0x8f,0x51,0x4a,0x6c,0xc9,0x83,0xfd,0xda,0xeb,0xe0,0x04, +0x36,0x93,0xb2,0x60,0xb6,0xb4,0x6d,0xbf,0xc1,0x6f,0x34,0x52,0x15,0x2b,0xe8,0x17, +0xa3,0x81,0xff,0x74,0x94,0xdd,0x36,0xb0,0x9a,0xd7,0xf1,0xc4,0x8e,0xb3,0x64,0x97, +0x05,0xfe,0x85,0xe5,0x36,0x66,0x85,0x2a,0x05,0xb1,0x99,0x5a,0xd6,0x87,0x4d,0x91, +0x83,0x9e,0xcf,0x9b,0xb6,0xd3,0x9e,0x08,0x44,0x0c,0x76,0x54,0xf3,0x4a,0xa4,0xaf, +0xd5,0x16,0xe5,0x24,0x9a,0x3f,0x84,0x00,0xca,0xdb,0x8c,0xc1,0x15,0x14,0x34,0xc6, +0xa5,0x41,0x69,0xb4,0x74,0xba,0xc8,0x10,0xcb,0xda,0x84,0x74,0x55,0xb4,0x1d,0x47, +0x9b,0x09,0x62,0x25,0x34,0xb5,0xca,0xb1,0xa5,0x26,0x8d,0xc0,0x95,0x09,0xbe,0xb1, +0xe7,0x98,0x95,0x55,0x95,0x95,0xd5,0xe3,0x8c,0x6e,0xc7,0x15,0x75,0xff,0x58,0xa3, +0x80,0x95,0xfc,0x71,0x9f,0x63,0x1c,0x0f,0x42,0x52,0x54,0x46,0x6e,0xb5,0xf7,0xf8, +0xc6,0x70,0x4c,0x72,0x3d,0x34,0xc3,0x85,0x08,0x9b,0x12,0x2d,0x10,0xf3,0x59,0xa7, +0x2e,0x9e,0x53,0x72,0xd9,0xc1,0x1f,0xf6,0xad,0xd9,0xd7,0xb1,0xf9,0xf5,0x9b,0xf9, +0x9e,0xcf,0xd0,0x1b,0xfa,0x39,0xf0,0xf7,0xde,0x09,0xb9,0xcc,0x90,0xf4,0x60,0xe7, +0xae,0xe0,0xbc,0x57,0x38,0xc5,0x53,0x98,0x85,0x24,0xff,0xfe,0xdd,0x71,0x75,0x5b, +0xce,0x9b,0xd4,0x3c,0xbd,0xf5,0x5e,0xc2,0xce,0x22,0xc4,0x01,0x7b,0x07,0x07,0x94, +0x4f,0xdc,0xc9,0x4d,0xbb,0x74,0x2e,0x0e,0x09,0xd8,0x08,0x6b,0xa1,0xbd,0x47,0xa0, +0x0c,0xfa,0x26,0x3d,0x3d,0xf7,0x05,0x05,0x43,0xd2,0x2c,0xff,0xff,0xff,0xdb,0x5e, +0x7f,0xe7,0x3f,0x54,0x31,0x6f,0xf4,0x7f,0xe7,0x50,0xae,0xe8,0xf7,0x95,0xc8,0xcc, +0xaa,0x8c,0xa2,0xc4,0x4d,0xa1,0x41,0xb3,0xa0,0x0e,0x51,0xcc,0x51,0x23,0xdc,0x0c, +0x61,0xbd,0xe1,0x07,0x06,0x2f,0xae,0xc7,0x39,0xbd,0xdc,0xd9,0xd0,0xd7,0x69,0x52, +0x94,0x0c,0xe9,0x57,0x8d,0x2c,0x18,0x4e,0x66,0x45,0x9d,0x76,0x2c,0xc2,0x38,0x67, +0xa1,0x02,0x3d,0x2b,0x9f,0x82,0x30,0x24,0x1a,0x06,0xaf,0x3e,0xaf,0xf8,0x28,0x14, +0x36,0x88,0x5f,0x84,0x1b,0xda,0x98,0xa9,0x06,0x43,0xa6,0x72,0xb2,0xe6,0x49,0x66, +0xc2,0x09,0x5b,0x85,0xe6,0x8b,0xcc,0xc6,0xbd,0xcf,0x56,0x95,0x89,0xf7,0x31,0xd3, +0x8a,0x43,0x76,0x45,0x24,0xac,0xd1,0xe4,0x62,0xb8,0x7a,0x86,0x5f,0xda,0xaa,0xad, +0x3b,0x2f,0xe2,0x0e,0x8e,0x25,0x32,0x1a,0xe9,0x41,0xaa,0xd3,0xad,0x0b,0x72,0x9a, +0x88,0x8b,0xa2,0x04,0xba,0x2f,0x3a,0x29,0xc4,0x2a,0xe4,0x21,0xac,0xea,0xfb,0x8b, +0x09,0x68,0xc9,0x10,0xd8,0x2c,0xd3,0xad,0xf5,0x04,0x68,0x52,0xb8,0x63,0x73,0x9b, +0x09,0xd3,0xab,0x92,0x38,0xa7,0xb0,0x9c,0x1c,0x55,0xaf,0xce,0x8d,0x2a,0x7a,0x18, +0x0e,0x03,0xa2,0x61,0x1c,0xb5,0x78,0xed,0x44,0xc6,0xaa,0x61,0xda,0x7b,0x4e,0xba, +0x89,0x25,0xd8,0xde,0x1d,0xb4,0x3a,0x3c,0x43,0x0f,0x62,0x87,0x86,0x10,0x23,0x09, +0xa4,0x85,0x13,0x3e,0xff,0x5f,0xd7,0xc9,0x6b,0x8e,0x43,0x0b,0x29,0x7e,0xeb,0x3b, +0xc8,0xb0,0x1b,0x62,0xe7,0xfa,0xc6,0xc3,0x36,0xc3,0x74,0x23,0x6e,0xb3,0x8b,0x04, +0x51,0x83,0x44,0x85,0x80,0xaf,0x9b,0xc6,0x97,0x40,0xce,0xa1,0xd3,0x76,0x77,0x12, +0xa1,0x54,0xb7,0x66,0x10,0x71,0x7e,0xd6,0xbf,0x8c,0xfc,0xf0,0x36,0x7e,0x65,0xc7, +0xe4,0x1f,0xcf,0x90,0x91,0xf2,0xad,0x5e,0x6f,0x49,0x1d,0x69,0x11,0x7d,0x35,0xf1, +0xa7,0x51,0x25,0x25,0xd2,0xc3,0x07,0xb3,0x0a,0x5c,0xfd,0xf1,0x71,0x7e,0x3c,0x42, +0x00,0xf5,0x70,0x0b,0xc1,0xef,0x6c,0xf4,0xe0,0x1c,0xec,0xb4,0x7a,0x7b,0x74,0x00, +0xd8,0x1a,0x17,0x45,0xd2,0x4a,0xcc,0x82,0xe1,0x81,0x10,0x96,0x30,0xaa,0x3d,0x43, +0xab,0x4b,0x50,0x65,0xb8,0x76,0x52,0x65,0xdf,0xc1,0x45,0x07,0x70,0x3e,0x2d,0x90, +0x1a,0x55,0x94,0x40,0x16,0x88,0x2a,0x13,0xc1,0x75,0xa5,0x97,0xb0,0xc8,0x9b,0x4e, +0xa8,0xb8,0x11,0x7f,0xbc,0xb5,0x57,0xce,0x09,0x5c,0xdc,0x51,0xdb,0x1d,0xa5,0x52, +0x92,0x22,0xb5,0x7e,0x65,0xce,0xa5,0x5e,0x79,0xa4,0xfe,0xfc,0x7f,0x74,0xab,0x2c, +0x7d,0x79,0xd5,0xcf,0x53,0x5e,0x71,0x4b,0xe9,0xfa,0xaf,0x7d,0x0f,0x75,0x47,0x7e, +0x5c,0x29,0x8d,0x4b,0x58,0x20,0xe7,0x3b,0x69,0xbd,0xd5,0x52,0x5a,0x76,0xdb,0x83, +0xa8,0x54,0x7b,0x8b,0xe0,0x36,0xd1,0x6a,0xbe,0x20,0xae,0xc8,0xdb,0xa7,0x36,0x5a, +0x2e,0xdd,0xb0,0xda,0xda,0xbe,0x56,0xec,0xe9,0x89,0xdf,0xd8,0x4c,0x98,0xc7,0xab, +0xe9,0xa1,0x10,0x3d,0x27,0x4f,0x6f,0xae,0x28,0xfc,0xd7,0xa7,0x0b,0x62,0x77,0x09, +0x50,0x10,0x6c,0x2e,0x37,0x32,0x28,0x09,0xe3,0x50,0x02,0x9d,0x90,0xec,0x18,0x87, +0x82,0x03,0xea,0x1b,0x54,0xa6,0x4d,0xcb,0x86,0xaf,0xd0,0x62,0x25,0x6d,0xcf,0x90, +0x85,0x97,0x88,0x99,0xb4,0x2b,0x18,0x15,0xe4,0xc8,0x78,0x5b,0x9c,0xe7,0x31,0xb3, +0x80,0xa3,0x89,0x1e,0x37,0xa4,0x8a,0xaa,0x6b,0xc4,0xc9,0xa5,0xd1,0xdb,0x11,0xfb, +0x67,0xcc,0x2e,0x07,0x17,0xaf,0xf9,0xb7,0xf8,0x8d,0x31,0x34,0x74,0x69,0xa0,0x3a, +0x5f,0x0c,0x73,0x7d,0x6e,0x31,0xb4,0xe7,0x48,0x4e,0x30,0x67,0xdf,0x19,0x95,0xb0, +0x85,0xcd,0xea,0xcf,0xcb,0x54,0x18,0x36,0x0f,0x87,0x80,0x66,0xb7,0x1a,0x69,0xa1, +0x27,0x0c,0xf2,0xaf,0x9e,0xe4,0x75,0xc3,0x67,0x06,0xa8,0x63,0xf2,0x4d,0xcf,0xa3, +0x8f,0x88,0x4a,0x6b,0x4f,0x16,0xe4,0xc9,0x45,0x8f,0xc7,0x95,0x74,0x82,0x96,0x68, +0x3f,0xcf,0x21,0xec,0xfd,0x57,0x12,0x3b,0xc1,0xab,0xcd,0xcc,0xde,0xeb,0xc9,0x9e, +0x7c,0x1a,0xae,0x2e,0x93,0x96,0x47,0xd3,0xcb,0xa6,0xc2,0xbc,0x58,0xe0,0xdb,0x6d, +0x77,0x91,0x1c,0xf7,0x9c,0xd1,0x98,0x8e,0x19,0xd4,0x06,0x4d,0x9f,0x1d,0x72,0xa9, +0x28,0x90,0x90,0xaf,0x1d,0xf4,0x80,0xb2,0x62,0xd0,0xe1,0x7f,0x7e,0x8e,0x02,0xea, +0x46,0x01,0xc1,0x76,0x02,0xa8,0xb0,0x08,0xb1,0xcf,0x4d,0x8c,0x7a,0xe1,0x12,0xd8, +0x2d,0x3f,0x37,0x66,0x9d,0x79,0x7f,0xfe,0x72,0x5a,0xf0,0x7a,0xfc,0xac,0x1b,0xc9, +0xac,0xbd,0xc8,0x3d,0x25,0x51,0x4b,0x7f,0x4c,0x86,0xb9,0x91,0x7d,0xe3,0x13,0xd9, +0xad,0xff,0x65,0xaf,0x60,0xa0,0xc4,0x3c,0xc1,0xcc,0xc3,0xaf,0x24,0xe0,0xd8,0x00, +0xa4,0xb5,0x50,0x60,0xb1,0x20,0x0c,0x72,0x38,0xcb,0xfe,0x5d,0xd7,0x95,0xb1,0x54, +0xa5,0x31,0x86,0x13,0x3b,0x3b,0x76,0xaf,0x0e,0xde,0x84,0x66,0xaa,0xfe,0x1d,0xe3, +0xa2,0xd0,0xc5,0x85,0xe1,0xbf,0xc1,0x45,0x45,0x5e,0x8d,0x77,0x0a,0xfd,0x81,0x36, +0x70,0xf0,0x29,0x12,0x33,0x70,0xbc,0x81,0x85,0x83,0xdd,0xf7,0xf3,0xfe,0x04,0x86, +0x32,0x99,0x1d,0x81,0xe0,0xbe,0x24,0x6b,0x61,0x96,0x74,0x1f,0x76,0x6f,0xe4,0xce, +0x86,0x1f,0x93,0x8c,0x8e,0x29,0x44,0xc3,0xc6,0x54,0xc4,0x26,0x2b,0x5e,0x2f,0x38, +0x05,0x90,0x25,0xa9,0xd7,0xd6,0xea,0xcd,0x1b,0x77,0xcd,0x95,0x09,0xb7,0x12,0x31, +0x25,0xdf,0xe8,0x27,0xfa,0x26,0x44,0x00,0x63,0x5a,0x85,0xd7,0x17,0x98,0x8d,0x40, +0x97,0xa3,0xf6,0x3a,0x24,0x1a,0x6f,0x19,0xcb,0xde,0xfc,0x50,0xdf,0x9d,0xd2,0x72, +0xfb,0xd4,0xe3,0x78,0xbd,0x59,0xcc,0x5c,0xc8,0x26,0x86,0x6e,0x86,0xf6,0xc0,0x6c, +0x59,0xa8,0x6e,0x67,0x16,0x17,0x17,0x31,0x4d,0xc1,0x8f,0x7f,0x43,0xf5,0xd0,0x93, +0x08,0x80,0xe9,0x56,0x8e,0x9c,0x75,0x59,0xce,0x5b,0xdf,0xfb,0x9d,0x76,0x62,0x4e, +0x13,0xfb,0x98,0xc8,0xdf,0x3f,0x24,0xbf,0x85,0xb8,0xc8,0x0c,0x64,0x93,0xf3,0x7d, +0xad,0xd5,0x42,0x4c,0x03,0xb7,0xe9,0xe4,0x1b,0x69,0x4a,0x81,0xdc,0xbc,0x07,0x8f, +0xe6,0xdc,0x44,0xcd,0xf8,0xe3,0xb7,0xfb,0xb3,0x2a,0x67,0x10,0x0b,0xf1,0x6a,0x5f, +0x92,0xf8,0xad,0xb1,0xde,0xdf,0x68,0xe1,0x9f,0x52,0xa5,0x43,0x97,0xce,0x7e,0x06, +0xe1,0x83,0xd0,0x18,0x1c,0x23,0xd6,0x42,0xcd,0x22,0x14,0xd4,0x59,0x6f,0x98,0x72, +0xfa,0xdc,0x8d,0x96,0x91,0x29,0x14,0x4b,0xe0,0xcb,0xc1,0xc9,0x32,0xe3,0x29,0xf2, +0x0c,0x0f,0x85,0x1d,0xb0,0x80,0x01,0x43,0x69,0x44,0x79,0x04,0x55,0x42,0xf1,0x6a, +0x91,0x4c,0xd3,0xea,0x32,0x63,0x66,0xd3,0xbe,0x03,0x61,0x47,0x53,0x67,0x43,0xa6, +0x80,0xd0,0xa2,0x40,0x11,0xa4,0x28,0xe2,0xca,0x1c,0xd0,0x59,0xb9,0x20,0x28,0x4b, +0xf3,0x8e,0x08,0x84,0x30,0x21,0xc7,0xa8,0x45,0x7c,0x7c,0x0a,0xf0,0x98,0xd6,0xb1, +0xe3,0x09,0xc7,0x6d,0x12,0x58,0x0b,0x9e,0x61,0x04,0xeb,0xd5,0x52,0xc9,0x4d,0xb3, +0x01,0xd3,0x70,0xa9,0x13,0xdc,0x69,0x37,0x3f,0x05,0x81,0x1b,0xf7,0x61,0x92,0xe0, +0x50,0x45,0x9a,0x0c,0x1e,0xf1,0xd2,0x15,0x78,0x0a,0x01,0xce,0x5e,0x61,0x72,0x3f, +0xf4,0x06,0x06,0x3c,0xb8,0xd3,0x02,0xd3,0xcb,0x6d,0xc5,0x5e,0xfd,0xa4,0xfc,0x01, +0x2d,0xf6,0x69,0x29,0x9e,0xb3,0x86,0x1d,0x35,0xc5,0x93,0x09,0x5a,0x6e,0x9b,0xe9, +0x29,0xda,0x4b,0x70,0x0e,0x69,0x92,0x46,0x6a,0x09,0x7b,0xb8,0x5b,0x6f,0x12,0xaa, +0x2e,0x4e,0x4c,0xb4,0xf6,0x97,0x9d,0x5c,0xc8,0x64,0xda,0xcb,0xbb,0x63,0x70,0xa7, +0x0d,0x2d,0x87,0xb7,0x1d,0x24,0x22,0xfa,0x48,0xa9,0xd0,0x7d,0xf8,0x60,0x58,0x61, +0xf9,0x00,0xdb,0xa0,0x37,0x6c,0xef,0x0b,0x8b,0x0e,0xb3,0x2d,0x7c,0x63,0x42,0xdb, +0x5f,0xd8,0xcb,0x79,0x9d,0xb6,0x01,0x69,0x68,0x49,0x91,0x60,0x9a,0x6a,0xbb,0x66, +0x04,0x16,0x0a,0xe6,0xbd,0xc6,0x9a,0x59,0xcd,0x12,0xf4,0xba,0x5f,0x32,0x26,0x15, +0x62,0xf1,0xd6,0xf4,0x4d,0x9e,0x1e,0x76,0x2b,0x55,0x92,0xd6,0x52,0x31,0x25,0x70, +0x01,0xed,0x8d,0xa0,0x51,0xcd,0xd8,0x8b,0x1d,0x5b,0x08,0x92,0x72,0xa6,0x9d,0x73, +0x23,0x10,0x2d,0xe7,0xd3,0xd6,0xc9,0x48,0xca,0xc8,0x29,0xd7,0xd2,0x63,0x5e,0x85, +0x01,0xf7,0x53,0x3b,0x66,0xe3,0x58,0xf5,0x01,0x94,0x5a,0xb9,0x2f,0xfc,0xb7,0xaf, +0x56,0xea,0xbc,0xb6,0xd1,0x60,0x24,0x72,0x6a,0xf5,0x96,0x5d,0x51,0x76,0x25,0xf6, +0x8f,0x1b,0x05,0xb6,0x30,0x12,0x2d,0x63,0xeb,0x96,0xd8,0x2d,0xad,0x9e,0x2d,0xe6, +0xca,0x1a,0x49,0xaa,0x92,0x47,0x07,0xec,0x40,0x51,0x12,0x44,0xd1,0x74,0xb3,0xea, +0x69,0x98,0xf8,0x8b,0x99,0xe7,0x16,0x55,0x79,0x83,0xf6,0xb2,0x31,0x77,0x0e,0x64, +0x69,0x5b,0x2e,0xee,0x5b,0x3d,0x7e,0xbb,0x4b,0x1b,0xfe,0xa2,0x56,0x74,0x7f,0xeb, +0x8c,0xe1,0xdd,0xd8,0xc4,0x95,0x37,0x2d,0xa3,0x18,0x23,0x5d,0x3e,0x75,0x90,0x86, +0x2b,0x13,0xf1,0x9a,0x18,0xe2,0x1d,0xd4,0x6b,0x7f,0xc7,0xb9,0x55,0x76,0xd9,0x28, +0x1a,0x1a,0x1d,0xcf,0x45,0x39,0x5a,0xf8,0xc9,0x1c,0x02,0xec,0x0d,0x26,0x8e,0x05, +0xd7,0x1b,0x0e,0x00,0x90,0x7c,0x4f,0x7a,0xeb,0x55,0x01,0x08,0x0c,0x3d,0xe4,0x77, +0x5f,0x11,0x1a,0x49,0xc1,0xc1,0x9d,0x1d,0x0b,0xf1,0x05,0x69,0x97,0xec,0xf9,0xb5, +0x0a,0x96,0xaf,0xde,0xba,0xb4,0x05,0x06,0x48,0x59,0x5f,0x28,0x16,0x7f,0x5e,0x04, +0xe5,0x03,0xa4,0x4e,0x6f,0xcd,0xaf,0xbe,0xc6,0xc4,0x0f,0x44,0xd6,0x34,0xf1,0x25, +0x3a,0x88,0x68,0xdb,0xa5,0x5c,0xbb,0x92,0x11,0x21,0x3c,0xc6,0x73,0xee,0x05,0xf0, +0x08,0xc3,0x7e,0x67,0xe3,0x47,0x6e,0x41,0xea,0x84,0xb9,0xc5,0x75,0xe9,0x77,0xab, +0x8d,0x38,0xf1,0xc3,0x17,0xa7,0xf9,0xf2,0xbf,0x85,0xd9,0x35,0x76,0xee,0x3a,0x0a, +0xa5,0x82,0xf1,0xbe,0x96,0x5f,0x38,0x74,0xe5,0xc2,0x88,0xe4,0x57,0xe3,0x72,0x06, +0x24,0x7d,0xd2,0xa9,0xe0,0x2e,0xcc,0x62,0xe4,0x87,0x80,0x52,0xbe,0x2c,0xd7,0x23, +0x27,0x79,0xe5,0xc3,0x9e,0xbe,0xf9,0xcf,0x27,0xc9,0x4a,0x85,0x7a,0x1b,0x09,0x64, +0xa2,0x8a,0xf1,0x6b,0x7c,0xe3,0xe6,0xa0,0xac,0xd0,0x15,0xe5,0xd3,0xef,0x22,0x2e, +0xe7,0xcc,0x2c,0x6c,0x3f,0x08,0x36,0x28,0x48,0x84,0xa4,0x4c,0xab,0x65,0x8e,0x74, +0xae,0xc8,0xad,0x9c,0xf1,0xa0,0x21,0x7f,0x6f,0xc4,0xc2,0x19,0x88,0xe6,0x19,0xbb, +0x58,0x25,0xf9,0x4e,0x3f,0xae,0x37,0x6d,0x86,0x88,0x67,0xad,0x08,0x42,0xd4,0x69, +0x2a,0x9b,0x93,0xe0,0x1f,0xaf,0x75,0xc7,0x4d,0x30,0xdb,0x3d,0x76,0xe6,0x99,0x35, +0x7b,0x73,0xd8,0xfe,0xf2,0x03,0x71,0xac,0xfe,0xca,0xf1,0x1d,0x3b,0x6a,0xf5,0xba, +0x0e,0x8b,0xf1,0xc7,0xe6,0xa2,0x02,0x3c,0xbb,0x83,0x60,0x4e,0xa4,0x12,0x03,0x7c, +0xef,0x83,0x47,0x2d,0x65,0xec,0x7b,0x8d,0xad,0xee,0xf2,0xaf,0x9a,0x43,0xdd,0x3a, +0x2e,0x70,0x2b,0x27,0xc5,0xa2,0xce,0xbd,0x3f,0xc9,0x6b,0x82,0x97,0xae,0xd0,0x72, +0x2c,0x9f,0xfc,0x96,0x68,0x47,0x27,0xc0,0x97,0xb5,0xec,0xaf,0xf6,0x24,0x4c,0xd3, +0xd0,0x9c,0x69,0x6a,0xb5,0x4a,0xc7,0x95,0xc4,0x2e,0xe6,0x8e,0xd6,0xea,0x8d,0x03, +0x21,0xd2,0x1d,0xe1,0x4a,0xff,0x0d,0x58,0x48,0xdf,0x69,0xb7,0x57,0x97,0x67,0x68, +0x06,0x95,0x23,0x7a,0x18,0x08,0x89,0xd1,0x56,0xb6,0xfc,0xd1,0x77,0x27,0x31,0x22, +0x60,0xf1,0xb1,0x24,0x9a,0x3f,0x54,0xb6,0xc5,0x96,0xf4,0xe6,0x76,0xf4,0xd8,0xb0, +0xc5,0x76,0x3a,0x34,0x9b,0x3e,0x75,0xb4,0x73,0x0e,0xfc,0xf6,0x77,0xf5,0x5d,0x71, +0x8c,0xb4,0xb1,0x25,0x1a,0x3d,0xe8,0x2d,0xe0,0xf6,0xf5,0xe7,0xf6,0xf6,0x6e,0xf4, +0x06,0x68,0xe7,0x35,0x1b,0x3c,0xcb,0x0e,0xc6,0x6c,0xfd,0xf7,0xf7,0xf7,0x2a,0xf1, +0x8d,0x10,0xbe,0x76,0xd0,0xfa,0x0e,0x41,0xc0,0xd5,0xe9,0x4c,0xfe,0x2c,0xee,0x43, +0x68,0xdb,0xed,0x9c,0x21,0xbf,0x92,0x3e,0x2d,0x49,0x1f,0x5c,0xf8,0x89,0xa7,0x69, +0xd3,0xd9,0xea,0x64,0x9e,0xba,0xce,0x8c,0x4d,0xa5,0xe3,0xcd,0x7e,0x2e,0xe0,0x14, +0x2f,0xd3,0x8f,0xca,0x1c,0xb0,0x27,0xbf,0x6a,0x79,0x85,0x4c,0x8c,0xe0,0x7c,0x9a, +0x0f,0x7c,0x62,0x2c,0x92,0x37,0xca,0x6e,0x71,0xc9,0xf6,0xee,0x7e,0xfc,0xee,0xd8, +0xd8,0xdc,0x29,0xa1,0xbd,0x44,0xff,0xdf,0x69,0x27,0xfe,0xfe,0x7f,0xfd,0xd8,0xbb, +0xa1,0x97,0xaf,0x2d,0xc1,0xfc,0xc8,0x8b,0xa8,0xdf,0xf7,0xef,0xfe,0xfe,0x55,0x59, +0x27,0xce,0xc7,0x58,0x48,0x34,0x9a,0x88,0xdf,0xb3,0xff,0xff,0x94,0x54,0x26,0x59, +0x6e,0xa4,0x82,0xf1,0x58,0xb1,0x16,0x11,0x78,0x02,0x82,0xdc,0xbb,0x24,0xb0,0xe3, +0x3b,0x11,0xb6,0x28,0x32,0x61,0x26,0x19,0x29,0x4c,0x58,0xdc,0xef,0xec,0x8a,0xa9, +0xb3,0x59,0x87,0x28,0xd8,0xf3,0x4c,0x6d,0x21,0x4d,0xaf,0xc7,0xb2,0xf7,0xb1,0xe2, +0xb7,0x98,0x8f,0x2c,0x99,0xd4,0x0f,0x53,0xa1,0x4c,0xe7,0x94,0x3a,0x20,0x1a,0x41, +0xa1,0xb4,0xc8,0x54,0xc6,0x07,0x09,0x30,0x44,0x7f,0x8c,0x92,0x42,0xab,0x11,0xd6, +0x02,0xc5,0xca,0x36,0xec,0x67,0x0c,0x6f,0x65,0xe8,0xf2,0xa4,0x0f,0x64,0x81,0xa9, +0xfe,0x44,0x66,0xe1,0x10,0x4a,0x89,0x21,0x82,0x92,0xb1,0x67,0x87,0x6b,0x6f,0xf4, +0xa9,0xa3,0x90,0x01,0x7a,0x04,0xc8,0xf5,0xf0,0x8f,0xe1,0x71,0x56,0xd5,0xf6,0xf1, +0xfb,0xac,0x84,0x20,0x10,0x7d,0x6c,0x2e,0xa9,0xcb,0xed,0x3f,0x17,0x39,0x82,0xf5, +0x28,0x52,0x81,0x6e,0xe6,0xf6,0x24,0xe9,0x20,0x83,0xd3,0x7c,0x5d,0x41,0xce,0x48, +0x40,0x90,0x43,0xe5,0xcf,0x22,0x3b,0xad,0xfb,0x3d,0xad,0x01,0x57,0xcc,0xbd,0xe4, +0xa8,0xd0,0xf4,0xe7,0x9f,0x30,0x43,0x30,0x20,0xa1,0x0b,0x4e,0xed,0x29,0x10,0xec, +0x42,0x7d,0xba,0x6b,0xf3,0x6f,0x6c,0xc9,0xe9,0x29,0x8b,0x84,0xbf,0xae,0x12,0x5c, +0x43,0xbc,0xcc,0x75,0x33,0x06,0xcb,0xfc,0x34,0xc1,0x83,0x94,0xbe,0x7f,0x45,0x75, +0x63,0xdf,0xbb,0xc9,0xe5,0xa2,0x6d,0xcd,0x69,0xbb,0x92,0x8d,0xd2,0xac,0x5f,0x76, +0xc3,0x5e,0xab,0x1a,0xdb,0x22,0x01,0x68,0xa3,0x5e,0x51,0x9d,0xe7,0x69,0xd9,0x04, +0x13,0x0e,0x3e,0x00,0x03,0x99,0x81,0x67,0xaa,0x9a,0x85,0xd4,0x2c,0x79,0xb6,0x78, +0x56,0xde,0x3e,0x35,0x21,0xf4,0x0a,0xd2,0x9e,0xfc,0x84,0x18,0x90,0xde,0x0d,0x95, +0x93,0x69,0x8d,0x90,0x83,0x19,0x5d,0xed,0x09,0x83,0x9a,0xd6,0xc0,0xfd,0x37,0x13, +0x2c,0x93,0x5d,0xe6,0xc1,0x5d,0x0a,0x35,0xd2,0xb3,0x8e,0xc6,0x81,0x1f,0x14,0x44, +0x11,0xce,0xa4,0xb2,0xbd,0x82,0x95,0xc0,0x4e,0xde,0xce,0xe6,0xe0,0x7c,0xdb,0xc3, +0x05,0x16,0xd6,0xd5,0x12,0xb7,0xa3,0x83,0x0d,0xf6,0x13,0xbb,0xf1,0x19,0x4d,0xd5, +0x6a,0x35,0xcd,0x49,0x5b,0xbc,0x6b,0x49,0x8a,0x05,0xd3,0x97,0x0d,0x34,0x17,0xff, +0xcb,0x06,0x94,0xd2,0xf7,0xfa,0x08,0x0f,0xe5,0x4c,0xdf,0x97,0x0c,0x7c,0x7e,0xfb, +0x6b,0x13,0xe4,0x85,0x39,0x88,0x2e,0x2c,0x5b,0x1e,0xf1,0x6c,0x2a,0xf3,0x53,0x13, +0x56,0x82,0x0e,0x5c,0x7d,0x3a,0x4a,0xab,0x0b,0x1a,0xc3,0x60,0xd8,0xd0,0x87,0xe8, +0xfa,0x58,0xde,0x70,0x5d,0xbc,0x1f,0xbd,0x20,0x39,0x26,0x9c,0x88,0x38,0xd4,0xa3, +0xaf,0x21,0x1b,0x98,0xbf,0x61,0xdf,0x51,0x46,0x19,0x8e,0x5d,0xa9,0xf0,0x86,0x21, +0x7d,0x11,0x2a,0x5e,0x36,0x34,0x5c,0x8a,0x99,0x39,0xd0,0x04,0x19,0xbc,0x8e,0x31, +0x3e,0x10,0x4b,0xd4,0x5c,0x2a,0xbd,0xb8,0x11,0xd0,0x84,0x0a,0x7d,0x66,0x39,0xe1, +0xca,0xbe,0x40,0x25,0xd5,0xf5,0x6f,0x2e,0x34,0xc3,0xf7,0xfd,0x1b,0x65,0xb0,0x22, +0x24,0xb2,0x27,0xf8,0x3b,0xbf,0x06,0x09,0x0c,0x1d,0xb6,0xbd,0xb1,0x82,0x14,0x86, +0x7a,0xd7,0x5c,0xc1,0x12,0xc0,0x2e,0xea,0x67,0xa0,0xed,0xb2,0xbf,0x31,0x77,0xed, +0x7a,0x84,0x72,0x60,0x34,0x11,0xf6,0x1e,0xac,0x90,0x9e,0xe7,0x69,0x4c,0x94,0xdb, +0x30,0xf8,0x5b,0x47,0xe2,0xb9,0xf1,0xef,0x2a,0x66,0x08,0x9b,0x3f,0x53,0xf2,0x3d, +0x83,0x49,0x69,0xfe,0x92,0xb8,0xd5,0xa0,0xd6,0xc9,0x2c,0xf0,0x1f,0x29,0x74,0xd0, +0xff,0x8f,0x9f,0x01,0xff,0x2e,0xb0,0x8b,0x53,0x69,0xd0,0x3f,0xf7,0x86,0x16,0x6a, +0x5d,0xc7,0x28,0xbf,0xc3,0xbe,0xe2,0x01,0x73,0xca,0x18,0xef,0xd2,0x84,0xe1,0x02, +0x72,0x0b,0x86,0xaf,0x14,0x69,0x21,0x81,0xc0,0xfd,0x35,0xb7,0xa8,0x84,0x34,0x57, +0x26,0x78,0xb7,0x31,0x20,0xb7,0x65,0xfb,0x2e,0x94,0x51,0x57,0x55,0x8b,0x60,0xe7, +0x66,0x23,0x7a,0x98,0x0e,0x65,0xae,0x59,0x78,0x8a,0xfa,0x56,0x3f,0xed,0x19,0xd7, +0x72,0x80,0xfe,0xd9,0xf4,0xea,0x01,0x86,0xa6,0x78,0xe0,0x10,0x37,0x58,0x2b,0xaa, +0x74,0x10,0x63,0xe7,0xf0,0xa2,0x6a,0x41,0x27,0x1b,0xa5,0x13,0x37,0xae,0xf0,0x2c, +0x8b,0xa1,0xf2,0xfb,0x5b,0xb9,0x1d,0xea,0xf1,0x66,0xc5,0x38,0x7c,0x44,0x8e,0xd9, +0x7e,0x84,0x5a,0xa1,0x93,0x21,0x64,0x08,0xb1,0x61,0xf0,0x0c,0x7d,0x2e,0x7b,0x21, +0x2c,0x50,0x13,0x99,0x19,0xb6,0x44,0xde,0x91,0x10,0x2b,0x0d,0x65,0x64,0x61,0x54, +0xfe,0x3a,0x06,0xa0,0x7f,0xf8,0x26,0xce,0x39,0xa0,0x1f,0x1c,0xd9,0x48,0x15,0x66, +0x47,0x1e,0xc4,0x1f,0xb7,0xb4,0xbb,0x93,0xa6,0xc5,0xdb,0x95,0x36,0xc5,0x59,0xf0, +0xcf,0xa1,0x52,0xb9,0x0c,0xb4,0x6d,0x9f,0x93,0xb5,0xca,0x97,0x04,0xb2,0xf3,0x04, +0x24,0xd1,0x77,0x78,0x7d,0x80,0x02,0x17,0x13,0x0e,0xc4,0xb4,0x35,0x51,0x1b,0xaa, +0x29,0x89,0x25,0x7a,0xe8,0xf0,0x0d,0x92,0x86,0x2d,0xe8,0xb6,0x55,0x72,0x39,0xef, +0x44,0x3c,0xa9,0xe7,0x54,0x1c,0xe9,0x20,0x44,0x6c,0xae,0xb5,0x22,0x5e,0x34,0x59, +0xcf,0x65,0xde,0x2e,0xba,0x7b,0x29,0x26,0xac,0x17,0xe6,0xe2,0x89,0x79,0x70,0x5a, +0xa5,0xf9,0x40,0x2b,0x71,0xce,0xea,0x32,0x3b,0xb9,0x46,0x72,0x4c,0x90,0x07,0xc3, +0xa5,0xd6,0xf5,0xe2,0xea,0x6d,0x4b,0x52,0xe0,0xcd,0x21,0x19,0xc5,0xf0,0x6f,0xb1, +0x4c,0xc6,0xbe,0x2e,0xc4,0x2c,0x43,0x57,0x2d,0xc4,0xf5,0xe3,0x70,0xf6,0x72,0x79, +0x0a,0x83,0xb3,0xfd,0x04,0xd4,0x4d,0xc5,0x10,0x27,0xa5,0xd7,0x5f,0xfa,0x2e,0x9a, +0x2d,0x99,0xb2,0x06,0x56,0xb6,0x69,0x41,0xdc,0x4a,0xe3,0x62,0x94,0xe8,0x1e,0x0f, +0xec,0x1d,0xc1,0x5f,0xbd,0xfa,0x8e,0x17,0x1b,0xe7,0xed,0x81,0x84,0xb8,0x15,0x68, +0xdd,0x10,0xad,0xec,0x85,0x3e,0x44,0x53,0x5c,0x99,0xc7,0x3b,0xc6,0xbb,0xd9,0xaa, +0x7e,0xde,0xd5,0x4a,0x25,0x83,0x48,0x5f,0x68,0xc7,0xaf,0x1a,0x19,0x7e,0xff,0x58, +0xa2,0x1d,0x54,0xbe,0x33,0x7f,0xea,0x66,0x69,0xc6,0x80,0x2e,0x4c,0x56,0x3a,0xbf, +0x0f,0x31,0xc3,0xd6,0x8d,0x75,0x69,0x2b,0xe2,0xdf,0x97,0xa8,0xbe,0xf3,0x57,0x4b, +0x0c,0xdd,0xcf,0xcb,0x5e,0xa4,0x75,0x7f,0xd4,0x94,0x45,0x9f,0xab,0x56,0x4a,0x60, +0x14,0x1b,0x80,0x66,0xe7,0x45,0xeb,0xd3,0x74,0x2c,0x2b,0xaa,0xbb,0xf1,0x8c,0xd0, +0x05,0xc1,0x59,0xfa,0x09,0x25,0x7a,0x32,0x40,0x80,0x50,0x47,0x5a,0xe8,0x59,0x77, +0x0d,0x84,0xb9,0x28,0x2f,0xff,0x2f,0x0d,0xa1,0x46,0x7d,0x56,0xa8,0xc4,0x99,0x63, +0xb2,0x08,0x8b,0x04,0xa5,0x27,0xd9,0xd9,0xb4,0x4e,0xb9,0xdf,0x38,0xf2,0x40,0x33, +0x72,0x0b,0x85,0x57,0x59,0x95,0x45,0x13,0x7a,0x4f,0x8a,0x9e,0x3a,0x55,0x88,0xb8, +0x76,0x8e,0x02,0x94,0x0f,0x90,0x78,0x12,0x13,0x41,0xc0,0x1d,0xba,0x3f,0xf5,0x32, +0xfa,0x09,0xff,0x7c,0x1d,0x80,0xd1,0x70,0xf2,0xb6,0x11,0x8c,0xa5,0x6b,0x41,0xb3, +0xe0,0x47,0xde,0x6a,0xe3,0x65,0x74,0x02,0xe2,0xc6,0xff,0x5c,0x70,0xe2,0xf8,0xe0, +0x7f,0xc5,0x2e,0x67,0x39,0xf8,0x0a,0x34,0x2b,0x97,0x88,0x2e,0xca,0x60,0xe8,0xd8, +0x11,0xf4,0x37,0x43,0xcc,0x74,0x40,0xc7,0x23,0x98,0xbc,0x05,0x5e,0x6d,0xfc,0x4e, +0xbb,0x71,0xfc,0xf5,0x98,0xd6,0x05,0x14,0x23,0xbb,0x92,0x3e,0xa8,0x40,0xa7,0x8b, +0x99,0x03,0x20,0x99,0x9d,0x3a,0x65,0x05,0x49,0xdb,0x5e,0xfa,0xea,0xa0,0x54,0x75, +0xe1,0xfd,0x1c,0x88,0x52,0x9d,0x91,0x97,0xab,0xef,0xf4,0x8e,0x66,0xc3,0xd9,0x49, +0x3f,0xad,0xea,0x3e,0xe3,0x5c,0x0d,0xfc,0x70,0x28,0xe4,0x54,0xd6,0xcb,0x79,0xf8, +0xfe,0xa1,0xe3,0x33,0xd2,0xbf,0x9c,0x97,0xcc,0x75,0xc0,0x1f,0x31,0x7f,0xda,0x7a, +0x8a,0x4e,0x7c,0x71,0x9d,0xc4,0x53,0x64,0x49,0x6b,0x12,0xbd,0x98,0x2d,0x30,0x04, +0x2b,0x27,0xb3,0xa8,0xc9,0x53,0xbb,0x90,0x68,0xff,0xce,0xa6,0xc3,0xa9,0x51,0x60, +0xcc,0x7f,0xb3,0x07,0x76,0xba,0x8f,0xc3,0x2a,0xdb,0xa2,0x8d,0xbb,0x78,0x3f,0x69, +0xd7,0xdd,0xe3,0xe7,0x43,0x5c,0x82,0xd3,0x9e,0xfd,0xf4,0x65,0x9e,0x1e,0x54,0x68, +0x67,0x1b,0xad,0x7f,0xc0,0x25,0x19,0x42,0xdd,0xfe,0xa3,0x68,0x90,0x77,0xd5,0xb3, +0x16,0x78,0x0b,0xb8,0xcf,0x95,0xb8,0x93,0x12,0xa2,0xce,0x06,0x74,0xd7,0x8c,0x39, +0x59,0x1c,0x95,0xc1,0xda,0x16,0x54,0xe1,0x50,0x3f,0x85,0x25,0x75,0xf5,0x23,0x11, +0xa1,0x7d,0xfd,0x3a,0x47,0x74,0x6b,0xcc,0x20,0x56,0xfe,0x61,0xf1,0x81,0xd4,0xee, +0x97,0x55,0xb5,0xf2,0x5a,0x74,0x07,0xf0,0x44,0x51,0x51,0x05,0x80,0xd6,0x01,0xfa, +0x1b,0x93,0x8e,0x88,0xb1,0xca,0xdc,0xb8,0x83,0x09,0xef,0xdf,0x08,0xf1,0xa3,0x9a, +0x25,0x02,0xb4,0x03,0xc6,0xb4,0x78,0xda,0x9a,0x35,0x27,0xcc,0xf9,0xff,0xfd,0x76, +0xae,0xe0,0x47,0x64,0x6c,0x56,0x20,0x85,0x11,0x39,0xb7,0x27,0xf9,0xbb,0xd4,0x8d, +0x9a,0x80,0x6c,0x63,0x34,0x79,0x20,0x2a,0xfe,0xd0,0xbf,0x7d,0xa7,0x39,0x8b,0xa2, +0xcb,0xa3,0xbe,0xe8,0x3c,0xc6,0x7e,0x92,0x83,0xcd,0x47,0x68,0x49,0xc7,0x28,0x10, +0x28,0x3e,0x31,0xa2,0x15,0x48,0x79,0xd5,0x00,0x8c,0x01,0x88,0x18,0xfd,0x74,0x1c, +0x5b,0x70,0x5c,0xb2,0xd2,0x33,0x2f,0xcd,0x36,0x0f,0x17,0xfd,0xc7,0x3c,0x74,0x35, +0xab,0x5d,0x5c,0xf3,0xc7,0x0a,0x5b,0x08,0x97,0xba,0xc9,0xd1,0x10,0x2e,0xf1,0xa2, +0x24,0x63,0x80,0x0a,0xfd,0x0a,0xf0,0xca,0x44,0xcd,0x08,0xb5,0x2c,0x4d,0x71,0xef, +0xe2,0x5a,0x66,0x92,0x6a,0x50,0x65,0x33,0xc5,0x01,0xc0,0xbe,0xf0,0x68,0x41,0x44, +0xc4,0x8f,0xeb,0x06,0x6f,0x57,0xc8,0x04,0x65,0xbd,0xa2,0x57,0x54,0x4d,0x01,0xee, +0x26,0xc1,0x00,0x69,0x00,0xdf,0x7f,0x1f,0x8f,0x92,0x99,0xa4,0x76,0xeb,0x30,0x67, +0x02,0xa8,0x28,0xc4,0x9e,0x14,0x76,0x00,0xb9,0x79,0xad,0xc6,0xf7,0x6d,0x50,0xb2, +0x03,0xa9,0x6c,0xa7,0x67,0xf5,0x21,0xb7,0x24,0xe5,0x33,0x49,0x27,0x30,0x0f,0xc1, +0x0e,0x26,0xd9,0xb4,0xe6,0xad,0x9d,0xfc,0xc7,0x66,0xf5,0x87,0xd7,0x49,0x07,0x74, +0x26,0x8c,0x5a,0xf6,0x6b,0xe4,0x81,0x08,0xaf,0x56,0x6c,0xf3,0x8c,0x71,0x7f,0x81, +0x0a,0xb2,0x1d,0x41,0xf5,0x42,0x12,0xe9,0xa5,0x22,0x34,0x5d,0x2c,0xa7,0x51,0x35, +0x5e,0xdc,0x3d,0x64,0x6b,0x06,0x61,0x3a,0x25,0x03,0xda,0x3c,0x87,0xe4,0x5e,0xf3, +0x22,0x31,0x63,0xe7,0x2d,0x05,0x15,0xe7,0x6f,0x4f,0xb2,0x5c,0xa4,0xa5,0xe6,0xe6, +0xac,0x50,0x38,0x0c,0xd6,0xfa,0xc4,0x41,0xa7,0xc4,0xc4,0x78,0x20,0x5d,0xe2,0x09, +0xc5,0x21,0xd5,0x76,0x6d,0xac,0x0c,0x52,0xaf,0x6f,0xd4,0x46,0x15,0x48,0x58,0x49, +0xac,0xfc,0xbe,0x41,0x39,0x18,0xeb,0x39,0x46,0xcb,0x34,0x6d,0x67,0xf7,0x29,0xba, +0x2d,0xce,0x23,0x4b,0xae,0x7a,0xe6,0x98,0xf2,0x6e,0xe2,0xbb,0x16,0xdf,0x15,0x63, +0x6e,0x20,0x7e,0x60,0xab,0xed,0x5f,0x6f,0x6e,0x30,0x3b,0x96,0xfd,0x64,0x9e,0xe2, +0x2c,0x52,0xfd,0xdd,0x37,0x70,0x14,0x48,0x15,0xc6,0xed,0xa6,0xd5,0x2f,0x51,0xe1, +0x6a,0x35,0x13,0xd9,0x33,0xaa,0x76,0xb3,0x0c,0xa0,0xbc,0x4f,0x71,0xb3,0xb5,0xf1, +0x1b,0xcd,0x0c,0xf9,0x21,0xce,0x7d,0x8e,0x0d,0x83,0x01,0xc5,0x0b,0x69,0xe4,0x71, +0x45,0x32,0x36,0xf5,0xd4,0xbb,0x65,0xa7,0xe3,0xc8,0x3d,0x9f,0x24,0x2e,0x3d,0xac, +0xcd,0xa5,0xb4,0xd9,0xb2,0x1b,0x2a,0x42,0x47,0x70,0x58,0x74,0xd6,0xfc,0xdb,0x03, +0xda,0xfb,0x5f,0x34,0x5f,0xf6,0xb6,0xe1,0x53,0x3f,0xef,0x85,0x07,0xfe,0xdc,0x7f, +0x4d,0x87,0x41,0x43,0xb2,0x3d,0xe0,0x32,0x2e,0xa7,0x75,0xe5,0xf4,0x56,0x0b,0x07, +0xa4,0xc5,0x93,0x73,0x42,0x14,0x5b,0xdf,0xf4,0x95,0x7d,0xe6,0xcb,0x57,0x68,0x0e, +0x17,0x5c,0xfe,0x8a,0xb5,0x68,0xad,0xc8,0x4d,0x88,0x9d,0xf5,0x81,0x44,0x91,0x2a, +0xd2,0x36,0x55,0xb9,0x9c,0x46,0x66,0x3f,0x25,0x08,0xc6,0x99,0x84,0xf6,0x35,0x75, +0x47,0x6b,0x67,0x67,0xbc,0xb7,0x31,0x96,0x05,0x2b,0x77,0x47,0xfc,0x67,0xbc,0xe8, +0xe6,0x1a,0x03,0x10,0x56,0x0a,0x1f,0xa6,0xeb,0xc0,0x9f,0xb3,0xfb,0xe0,0x3c,0xe8, +0x46,0xad,0xb2,0x3d,0x14,0xfd,0xbf,0x5d,0x8f,0x73,0xe7,0xec,0x96,0x5c,0x38,0xf2, +0xc4,0xf9,0xfb,0xad,0x07,0xd1,0xb0,0xc2,0x86,0x4c,0x56,0x8d,0x4b,0xb2,0x19,0xcd, +0xcd,0xcb,0xdd,0x3c,0x8a,0x11,0x23,0x18,0xc8,0x7a,0xe2,0x8c,0xc5,0xe5,0x57,0xe2, +0x54,0x3f,0x89,0x16,0xbc,0x54,0x93,0x68,0xfc,0xd5,0x6f,0xff,0xff,0xff,0x3e,0x3d, +0x68,0x0d,0xf9,0x20,0x73,0x8f,0x42,0x1a,0xab,0x24,0xaa,0x94,0x84,0xcf,0xf3,0xe0, +0x20,0xf0,0xda,0x52,0xfa,0x45,0x60,0x80,0xad,0xee,0x67,0x4e,0x3b,0x6e,0xfe,0x72, +0xf4,0x61,0x96,0xf6,0x14,0xaf,0x81,0xd2,0x44,0xef,0x35,0x01,0xa3,0x62,0x77,0x17, +0xe2,0x26,0x19,0x66,0x86,0x87,0xbd,0x53,0x36,0x26,0x36,0x11,0x38,0x99,0x0b,0xbb, +0xf3,0x87,0x00,0xac,0x55,0xaf,0x68,0x9e,0xee,0x49,0x8e,0xd4,0xe5,0xe9,0xfa,0xf5, +0xf4,0xf8,0x93,0x54,0x9e,0x98,0x40,0x9f,0xaa,0x94,0x21,0x87,0x3d,0xc1,0x75,0xbb, +0x84,0x1d,0xc5,0xa7,0x6a,0x7c,0xae,0x12,0xbe,0xe7,0xaf,0xd4,0xb9,0xa5,0x5b,0x31, +0x3c,0xda,0xaf,0x7c,0x6c,0xba,0x0f,0xac,0x4e,0x05,0xc1,0x58,0x38,0x76,0xd1,0xfb, +0x84,0x49,0x93,0xee,0xf8,0xfd,0x2a,0x0c,0xa3,0x2b,0x22,0x5b,0x56,0xb7,0xf5,0x6b, +0x75,0xa8,0xf2,0x2e,0xe6,0xfc,0xf6,0xab,0x6f,0xe4,0x0a,0xc4,0xd4,0xd2,0x3b,0xf7, +0x24,0x07,0xfb,0x29,0x50,0x70,0xa7,0x4b,0x23,0xc9,0xad,0x4d,0xd6,0x95,0x13,0xf6, +0x60,0xda,0xf3,0x6e,0xd2,0x70,0x4f,0x49,0x49,0x54,0x59,0x0c,0x78,0xca,0x10,0x7f, +0xbd,0xa1,0xa0,0x4c,0xc7,0xad,0x0b,0x4d,0x49,0xdd,0xec,0x44,0xd7,0xca,0xc2,0x2a, +0x69,0xf2,0x31,0xd8,0x20,0x98,0x22,0x7a,0x23,0x0f,0xcb,0xf8,0x44,0x70,0x8a,0x79, +0x7d,0xa1,0x3c,0x12,0x67,0xa4,0x93,0x81,0x3e,0xc3,0x99,0xad,0xf0,0x9b,0x35,0x18, +0x08,0x02,0x30,0xd9,0xa8,0x65,0x02,0x4f,0xcd,0x54,0xe5,0xac,0x56,0xc9,0x7a,0x87, +0x81,0x51,0x15,0x77,0xb4,0xbd,0x2c,0x5b,0xcc,0x5d,0x25,0x20,0x37,0xf2,0x1e,0x8d, +0xca,0x55,0xb4,0xb0,0xda,0x75,0x45,0x61,0x65,0xd1,0x8d,0xf3,0xbb,0x4b,0x3b,0xa8, +0xc8,0x1f,0xd7,0xc3,0x5b,0x56,0xee,0x86,0x41,0xad,0xaf,0x56,0xc0,0xdf,0x37,0x21, +0x24,0xbc,0xb7,0x25,0x3c,0x9c,0xd2,0xde,0x3f,0x8e,0x95,0xb1,0xd8,0xd9,0x9b,0xfd, +0xf6,0xc5,0x9e,0xc5,0x91,0x76,0x0e,0xe4,0x64,0x6f,0x50,0xf7,0x61,0x97,0x6a,0xf8, +0x80,0x90,0xb4,0xa7,0x0b,0x3e,0x97,0x74,0x58,0xe5,0x70,0x87,0x19,0xd3,0xe2,0xfc, +0x4b,0x4c,0x9c,0x01,0xd1,0x16,0x62,0xf8,0xba,0x7e,0xd3,0xcd,0x72,0x6a,0x5b,0xf8, +0xa5,0x2c,0xcf,0xc4,0x8b,0x1f,0x6a,0xd8,0x90,0x57,0x8f,0x06,0xc9,0x1b,0xa2,0xac, +0x4b,0xce,0x22,0xa8,0xd1,0x7b,0x0c,0xaa,0xdb,0x05,0xcc,0x56,0x10,0x69,0x54,0xb6, +0x5f,0xb6,0xda,0x39,0xce,0x55,0xf2,0xcb,0x0f,0xff,0xc6,0xb8,0x50,0x53,0x11,0x28, +0x43,0x5e,0x91,0xef,0x47,0x97,0x0d,0xab,0x7a,0x1b,0x57,0x44,0x8f,0x77,0xab,0xbd, +0x26,0xb6,0x30,0xb9,0x52,0x7f,0x4e,0xca,0x87,0xd2,0x5f,0x54,0xa1,0xfa,0xe4,0xf8, +0x2e,0xb3,0x13,0xdd,0x0a,0x1d,0x41,0x1b,0x40,0xc1,0xe8,0x59,0xb0,0xbf,0x1e,0xab, +0x13,0x9c,0x5d,0x2f,0x47,0x92,0x04,0xde,0x6d,0x46,0x16,0x6f,0x51,0xd0,0x13,0xbb, +0xd4,0xb1,0x69,0xe9,0x5b,0x91,0x84,0x1a,0xc8,0x81,0xa9,0x45,0x75,0xd3,0xcf,0x22, +0x52,0x73,0x1b,0x5f,0x33,0x7d,0x15,0x9b,0x09,0x7f,0x93,0x6e,0xd9,0x75,0x76,0xdf, +0x8b,0xdf,0xa0,0x3b,0x30,0x2b,0x0e,0x87,0x25,0xc4,0x88,0xc9,0x70,0x8e,0x08,0xf8, +0xf0,0x08,0x08,0xe6,0xa1,0x02,0x2e,0x50,0xba,0x6c,0xc1,0xc6,0xd5,0xf7,0x9e,0x8c, +0x31,0x0b,0x91,0x36,0xe0,0x0d,0x50,0x07,0x2d,0xe1,0x56,0x59,0xb5,0xe6,0x09,0x99, +0xa1,0x2e,0xbe,0xe4,0x19,0xe2,0x69,0x17,0xa6,0xc6,0x29,0x06,0xff,0x4c,0x9f,0x80, +0xa7,0x5b,0xd8,0x36,0x1e,0xaf,0xa2,0x8c,0xea,0xc9,0xa2,0xa6,0x5a,0x40,0xa7,0x7e, +0xcf,0x8c,0x28,0xbe,0x5b,0xe7,0x6b,0xf6,0x74,0xcb,0x14,0xe5,0x3d,0xed,0xa1,0xfe, +0x30,0x22,0xf3,0xc3,0xa5,0x63,0xdd,0xf0,0xbe,0x6b,0xbf,0xd7,0x3f,0x2c,0xfc,0x14, +0x66,0x21,0xb0,0xc7,0x96,0x95,0x31,0xf7,0xa4,0x5d,0x7d,0x64,0x90,0x44,0xb1,0x3b, +0xad,0x77,0xf8,0x2c,0x74,0x39,0x24,0x8b,0xa7,0x8c,0xe6,0x5c,0x36,0xeb,0x70,0x7a, +0x71,0x26,0xfc,0x33,0xf6,0xcd,0x44,0x3d,0x69,0x66,0xf1,0x10,0x42,0x64,0x1d,0x32, +0xa2,0x55,0xdd,0x09,0xff,0xff,0x69,0x05,0xa6,0xc9,0xcd,0x8f,0xf8,0x9f,0x8b,0xeb, +0x61,0x58,0x3b,0xef,0x03,0x0a,0x9f,0x59,0x3e,0xae,0xc4,0xc2,0x7d,0x30,0x7a,0xb9, +0x76,0x01,0x22,0xa7,0x46,0x1d,0xb2,0x82,0x52,0x8e,0xcc,0xbb,0xd3,0x4a,0x50,0xa9, +0x37,0x38,0x94,0xfe,0xe8,0x26,0x20,0xe4,0x49,0xd6,0x34,0xca,0xb6,0xf7,0x05,0x96, +0x65,0x1f,0x9d,0xee,0x6f,0x7d,0x2a,0xfb,0xcf,0xde,0x21,0xaf,0xd2,0x4a,0x7e,0x64, +0xbf,0xcd,0x0c,0xdb,0xac,0x25,0x0b,0x8b,0xc7,0xc0,0x17,0xec,0xb1,0xe7,0xf4,0x11, +0x12,0x3d,0x9e,0x36,0xb1,0x1f,0x14,0x48,0x8d,0x73,0x34,0x55,0x5e,0x7d,0x12,0x33, +0x44,0x95,0xba,0xbe,0xde,0xf5,0x67,0xb2,0xad,0x8b,0xe8,0x87,0xd4,0x4e,0x70,0xf3, +0x24,0x8d,0x01,0xa3,0xd7,0x5d,0x2f,0xa1,0x76,0x93,0x66,0x54,0xd6,0x5f,0x4c,0xb7, +0xc6,0x96,0x97,0x27,0x3c,0x1c,0x45,0x81,0x11,0xdc,0x83,0x17,0xdb,0x6c,0x02,0x0e, +0x25,0x3d,0xdc,0x37,0x95,0xe4,0x62,0x66,0x55,0x11,0x72,0x95,0x35,0xfd,0x35,0x66, +0x90,0xf0,0x92,0x77,0x9b,0xb8,0x25,0x62,0x66,0x87,0x3c,0x2e,0xbc,0x78,0xa5,0x2b, +0x42,0xd4,0xd7,0xd4,0x15,0xb5,0xb5,0x0b,0xaa,0x94,0x71,0x47,0xe4,0xe6,0x55,0x14, +0x6d,0xe6,0x93,0x73,0x35,0xb3,0x43,0x52,0x3d,0x28,0xa4,0x78,0x50,0xb6,0x30,0xb7, +0xc7,0xdc,0x02,0xaa,0x9d,0x67,0x20,0x7b,0x48,0xc3,0x89,0x9e,0x5d,0x07,0x50,0x9d, +0x09,0x38,0xc8,0x3a,0xc8,0x1f,0x86,0x51,0x7d,0x94,0x05,0xfc,0xdc,0x04,0x7d,0xa5, +0xc6,0x4b,0x13,0xed,0x43,0xd4,0x0e,0xcd,0x53,0xca,0x8c,0x1f,0x54,0x25,0x3e,0x68, +0x29,0x16,0xfb,0xbb,0x56,0xff,0xc6,0xb3,0x48,0xa7,0x97,0xdd,0x04,0x7a,0x58,0xe6, +0x28,0x87,0x2a,0xac,0xb3,0xde,0x48,0x4a,0xbc,0x03,0x96,0xac,0x8f,0xf1,0x37,0xe4, +0x4c,0xbd,0x09,0x9e,0x77,0xb0,0x27,0x2e,0x0c,0xfd,0x77,0x8d,0x4d,0x7b,0x0f,0x8b, +0xce,0xdc,0x18,0xbc,0x98,0xd2,0x2d,0xc9,0x92,0x9c,0x5b,0x7d,0xce,0xf4,0x17,0x5f, +0x9c,0xaf,0x10,0x5a,0x54,0xfc,0x07,0x0b,0x47,0x2e,0x7d,0x3f,0xb3,0x52,0x55,0x47, +0xc2,0xc0,0xfe,0x2c,0xf9,0x31,0x06,0x42,0xbf,0xed,0x86,0x0c,0xbb,0x24,0xe4,0x82, +0x45,0x0b,0x08,0x57,0x17,0x8a,0x20,0xce,0xed,0x4c,0x3c,0x56,0x30,0x01,0x49,0x1d, +0x69,0x31,0x2d,0x96,0x8b,0x2a,0x02,0xa5,0xf3,0xa2,0xab,0x95,0x59,0xcd,0xdb,0x62, +0xb3,0x6f,0xf1,0x11,0x78,0x32,0xb5,0xa2,0xfd,0xc8,0x81,0x31,0x58,0xb3,0xff,0xa2, +0x4a,0x35,0x2c,0xd7,0x01,0x2e,0x18,0x6d,0xba,0x75,0x10,0x8d,0x7e,0x69,0x10,0x54, +0x4b,0x54,0xb0,0x66,0x24,0x25,0xb2,0x61,0x7b,0x41,0x4c,0x84,0x32,0x6a,0x47,0x6c, +0x6b,0x77,0xd4,0x3f,0x5a,0x7c,0xe6,0x49,0xc4,0x8d,0x89,0x71,0xd4,0x5d,0x69,0xd3, +0xcb,0x16,0xdf,0x84,0x6c,0x7a,0xe4,0x60,0xf3,0x43,0xdf,0x49,0x3a,0xb6,0x60,0x1c, +0x09,0xf9,0xb0,0x3c,0x39,0x6a,0x32,0xc2,0xbd,0xc1,0xac,0xe0,0x90,0x79,0x0e,0xfa, +0x6a,0x19,0x92,0x6f,0x46,0x6b,0x45,0x39,0xb5,0xf8,0x0b,0xcf,0x65,0xe4,0x63,0x4a, +0xf8,0x81,0xda,0x1e,0x17,0x8c,0x33,0xa3,0xcb,0x9a,0xeb,0x1f,0x10,0x65,0x1d,0xc0, +0x62,0xb1,0xd2,0x28,0x9a,0x6b,0xa8,0x01,0xcf,0xda,0xe5,0x14,0x30,0x5a,0x76,0x4c, +0x2e,0x81,0x94,0xae,0xed,0x59,0xbb,0x4c,0x79,0x00,0x8a,0x68,0x12,0xdd,0x2a,0x5a, +0x00,0x00,0x00,0x9c,0x19,0xa6,0xf6,0xeb,0x4c,0xd2,0xfa,0x22,0x7f,0x2f,0x23,0x57, +0xf4,0x01,0x8d,0x22,0x15,0x88,0xeb,0x96,0xe9,0x2c,0x54,0x6f,0x77,0xde,0x12,0x5b, +0x2c,0x09,0xfb,0x60,0x9d,0x34,0x61,0xea,0xc0,0x54,0x90,0x07,0xa4,0x66,0x5a,0x25, +0x64,0xbd,0xa4,0xc4,0x64,0xbb,0x34,0x37,0x89,0xa1,0xea,0xa2,0x13,0xd6,0x04,0x94, +0xa9,0xef,0x2c,0xe6,0x53,0xe5,0x45,0x3f,0x02,0x71,0x30,0x2f,0x8e,0xac,0x54,0x46, +0x62,0xd2,0x78,0xb4,0x80,0x9d,0x1b,0x9d,0xc1,0xf2,0x46,0x21,0xc3,0x06,0x33,0x38, +0x63,0xd3,0xf3,0x92,0xd2,0x13,0xe5,0xc2,0xd3,0x3d,0xfe,0xee,0x0c,0xcf,0x3c,0x42, +0xaa,0x36,0x3f,0xb7,0x25,0xb4,0x8b,0x64,0x51,0x2f,0x14,0x29,0xe3,0x35,0x15,0xd2, +0x84,0x13,0xb2,0x70,0xce,0x94,0x92,0x37,0xa9,0x4f,0x92,0x70,0x33,0x1d,0x7d,0xa1, +0xe2,0x1b,0x69,0x5e,0x3f,0x54,0x6d,0x12,0xf1,0xfb,0x78,0x9a,0x6f,0x6d,0x6d,0x22, +0x02,0x9d,0xf5,0x2a,0x46,0x54,0x15,0xd4,0x80,0xcc,0x60,0xc4,0x52,0xd6,0x0e,0x8c, +0xa0,0xe6,0xfe,0xff,0x23,0xba,0x74,0xac,0x6b,0x98,0xed,0x6b,0x81,0xfe,0x1b,0xeb, +0x11,0x75,0x69,0x5c,0x15,0x92,0x16,0xa9,0x4b,0xd8,0xfc,0xbe,0x78,0xb8,0x39,0x3d, +0xe8,0xb5,0x78,0xfe,0x88,0x56,0x29,0x00,0x2a,0x1a,0x97,0xd7,0x99,0x7e,0x69,0x2c, +0xaa,0x52,0xf7,0x99,0x50,0x2a,0x9d,0xbb,0xe9,0xd6,0xa1,0x90,0x91,0x76,0xc1,0x3b, +0x1a,0x15,0x3d,0xb3,0x5a,0x35,0x96,0x00,0x55,0x51,0xee,0xdc,0x3c,0xd3,0x36,0x20, +0xc7,0xa6,0x35,0xe7,0x1d,0x7f,0x9e,0x10,0x54,0x50,0xa0,0xfb,0x7d,0xfd,0x45,0x4b, +0x7e,0xad,0x38,0xb3,0xd8,0x1b,0x29,0x38,0x89,0xe5,0x77,0x9f,0x98,0x12,0x57,0xf6, +0xf8,0x4a,0x81,0x95,0x43,0x7c,0x21,0x2d,0xed,0xd4,0x42,0x7f,0x76,0xff,0x97,0xa6, +0x02,0xca,0x8c,0x1a,0x77,0x3f,0xa6,0x5d,0x67,0x10,0x1c,0xb5,0x43,0xea,0x16,0xdb, +0x88,0xe3,0x73,0xe6,0x1d,0xae,0x8f,0x0b,0xb1,0x50,0x80,0xc9,0xbc,0xb0,0xf5,0xf2, +0xaa,0xc2,0xb7,0x2f,0x92,0x99,0x11,0xb3,0x25,0x7d,0xac,0x54,0xe8,0x43,0xd6,0x60, +0xb7,0xed,0x97,0x3f,0xb4,0x82,0xf9,0x0b,0xa9,0x3e,0x6d,0xc9,0xb6,0x7c,0xc3,0xfb, +0x65,0x94,0x2a,0x3d,0xb5,0xd4,0x2e,0x84,0x56,0x58,0x2b,0x45,0x50,0x67,0xc4,0xc0, +0x03,0x8d,0x6b,0x54,0xa2,0x35,0x06,0xb6,0x63,0x31,0xa8,0xef,0x1d,0xe3,0x19,0xab, +0x2e,0xcb,0x66,0xf8,0x96,0x86,0x89,0x11,0x2d,0xec,0x9e,0xe3,0xa5,0xc9,0x73,0xf3, +0xe7,0xae,0xc9,0x94,0xb3,0x53,0x6c,0x01,0x2c,0xd6,0xd5,0x4f,0x76,0xec,0xc5,0xca, +0x54,0x25,0xfc,0xec,0x18,0x2d,0x2a,0x22,0x04,0x39,0x25,0xdd,0xd8,0x63,0x08,0xe5, +0xe4,0xba,0x8c,0xd9,0xdf,0xb9,0x3c,0x06,0x05,0x98,0x82,0xc4,0xf1,0xe4,0xea,0xfa, +0x2f,0xea,0xb1,0xd3,0x9a,0xb1,0x0d,0x16,0xef,0x8a,0xc6,0x93,0x37,0x8e,0xc7,0x84, +0x8c,0xeb,0x10,0x6f,0x1d,0x2d,0x1b,0x0c,0x85,0xfa,0xc4,0xcf,0xfc,0x1a,0x02,0x48, +0x5b,0x81,0x32,0x3d,0x38,0x08,0x4c,0x42,0xc3,0x6a,0x75,0xea,0x65,0x0b,0x3a,0x38, +0x48,0x8b,0xd5,0xb2,0x1f,0x5c,0xa1,0xfe,0x7c,0xb6,0x21,0xf8,0x59,0x77,0x49,0xce, +0xcd,0x6e,0x2a,0xad,0x7e,0x51,0x66,0xab,0xcb,0x45,0x33,0x9a,0xbd,0xac,0xc8,0xe6, +0xec,0xaf,0x14,0x31,0xf5,0xa0,0x43,0x88,0x80,0x44,0x35,0x7b,0x96,0xb4,0x1a,0x32, +0x64,0x3f,0x96,0xb6,0x11,0xf2,0x6d,0x2d,0xc3,0xcb,0x4b,0xd5,0x40,0xb2,0x4a,0x23, +0x26,0xdb,0xad,0xe8,0x54,0xb5,0x62,0x17,0x21,0x24,0x94,0xb0,0xf8,0x94,0xb4,0xf0, +0x90,0xfe,0xfc,0x94,0x3b,0x34,0xd0,0xc5,0xc5,0xb2,0xec,0xb2,0x75,0x96,0x13,0xba, +0x6d,0xc9,0xcf,0x95,0xb4,0x63,0xe9,0x37,0xfe,0xd0,0x85,0x2c,0x0a,0x53,0xa9,0x3f, +0x07,0x4f,0xbf,0xc6,0x30,0xf4,0x6a,0xa5,0x8f,0x1e,0xcc,0xf6,0xd5,0xb5,0x32,0xfa, +0x2f,0x38,0xd3,0x11,0xfd,0xaf,0x7a,0x23,0x61,0x5e,0xfc,0xf6,0x77,0xf5,0x51,0x47, +0xad,0xa1,0xf4,0xe3,0x4e,0x5c,0x13,0x32,0xc7,0x76,0xf5,0xe7,0xf6,0xf6,0x20,0x43, +0x58,0x3a,0xa5,0xef,0x4e,0xf5,0x63,0xe2,0xa8,0xd3,0xfd,0xf7,0xf7,0xf7,0x5e,0xb8, +0xd8,0x97,0xfc,0x75,0x54,0xa9,0xa6,0x56,0xb8,0x23,0x16,0x7d,0xf8,0xb8,0x50,0xa3, +0xdc,0x4a,0x0d,0x6d,0xb1,0x32,0xe7,0xba,0x8c,0x66,0x86,0x24,0xfe,0xbd,0x7c,0x8b, +0xc4,0xcb,0xd9,0x89,0x5d,0x39,0x4c,0xd8,0xf7,0xa5,0xf1,0xa8,0xb6,0xbe,0x51,0xa3, +0x44,0x2a,0xab,0x7d,0xde,0xb8,0xff,0x6f,0xaf,0x56,0xd7,0xb8,0x5e,0x9e,0x77,0x8d, +0xf0,0x96,0xbb,0x5a,0xd5,0x6d,0x9c,0x1a,0x2e,0x7d,0xf6,0xee,0x7e,0xfc,0x50,0x16, +0x6d,0x62,0x59,0x0f,0xc2,0xd3,0x88,0xde,0xb6,0x20,0xfe,0xfe,0x7f,0xfd,0x24,0x3a, +0x96,0xbe,0x5e,0x73,0x55,0x0f,0x66,0x18,0xde,0xda,0xf7,0xef,0xfe,0xfe,0x51,0xf2, +0x22,0x69,0x89,0x0b,0xbc,0x5d,0x50,0xc1,0xa0,0x42,0xff,0xff,0xd7,0xef,0x80,0x0c, +0x8d,0x40,0x08,0xc4,0x1c,0x60,0xbb,0x67,0x4e,0x9c,0x15,0x6e,0xac,0x68,0xa7,0xe1, +0xed,0x0c,0xc2,0x15,0xee,0x85,0xd4,0xc3,0x4e,0x9c,0xc3,0x34,0x57,0x31,0x83,0xde, +0xeb,0xc7,0x01,0xe2,0x79,0x81,0xd5,0xeb,0x7b,0xe3,0x4a,0x25,0x28,0x83,0x57,0x22, +0x01,0xa8,0x5b,0x55,0x78,0x0b,0x4f,0xf5,0x2a,0x09,0x5c,0x4a,0xb9,0x6e,0xad,0x3e, +0x83,0x09,0xc8,0x60,0x79,0x0c,0x18,0x5a,0x1f,0x4f,0xd1,0x74,0x2d,0x64,0x04,0x61, +0xa2,0x84,0x96,0x11,0x8d,0x8e,0x26,0x76,0x93,0x21,0x7f,0x39,0x71,0x35,0xfe,0x03, +0x23,0xab,0x24,0xb4,0x97,0x2f,0xd1,0x70,0x9f,0xc4,0xf1,0x61,0xad,0x46,0x1a,0xd5, +0x9f,0x61,0xc3,0x35,0x16,0xd7,0x67,0xb4,0x60,0xe7,0xdb,0x88,0xd7,0x63,0x30,0x18, +0x8d,0x1e,0x98,0x08,0x3b,0x99,0x38,0xc2,0x0b,0x47,0x6d,0x52,0x76,0xb7,0x2d,0x19, +0x62,0x7d,0x82,0x19,0x1d,0x69,0x50,0x25,0x58,0xe6,0x13,0x42,0x3b,0x1f,0x5d,0x13, +0x88,0xa1,0xbd,0xb9,0x52,0x69,0x3a,0x5a,0xc7,0xc6,0x2c,0x1d,0xf9,0xc5,0x89,0xdf, +0x1b,0x08,0x30,0x6e,0xfb,0x28,0x57,0x4a,0xc6,0xc1,0xe5,0x74,0xf9,0xdb,0x69,0x36, +0xdb,0xb0,0x75,0x60,0x6d,0x2c,0x5a,0x98,0x4e,0xed,0x52,0x91,0x52,0x98,0xb5,0x9a, +0xaa,0xd2,0x0a,0x50,0x05,0xd0,0x0c,0x28,0xa0,0xc5,0x36,0xef,0x46,0x67,0xfc,0x12, +0x09,0x03,0xf4,0x65,0xe9,0x2e,0x5d,0x9a,0x83,0xc3,0xdb,0x80,0xde,0x13,0xe7,0x22, +0x55,0xa0,0xdd,0x3f,0x64,0xf2,0x01,0x7d,0xa3,0x57,0x5f,0x79,0x93,0x0d,0x7a,0x86, +0xc1,0x93,0x15,0xf7,0x56,0x5c,0x6d,0xf6,0x95,0x9c,0x91,0x55,0x33,0x50,0x74,0x81, +0x20,0xbc,0x0c,0x90,0x9e,0x9c,0xc7,0xb8,0x1e,0x80,0x56,0x74,0xc5,0xdb,0x2d,0x72, +0x2c,0x9f,0xe3,0x20,0xb1,0x52,0x14,0xf7,0x1d,0x9e,0xcb,0x74,0x28,0xd9,0x05,0x23, +0xf5,0x8e,0xdf,0x6d,0x35,0x30,0xdd,0xb5,0x52,0xf2,0x5d,0xb8,0xbe,0x72,0x3a,0x9c, +0xa1,0x19,0xe4,0x35,0xd2,0xb4,0xd1,0x26,0x99,0xc1,0xac,0xd6,0xba,0x7b,0x42,0xd6, +0xeb,0x9d,0x6b,0xcf,0x58,0x41,0x7a,0xbc,0xe7,0xf1,0x5e,0xe7,0x1d,0xdd,0x96,0x32, +0xfb,0xb2,0x6d,0x4f,0x66,0xa2,0x2d,0x65,0xb2,0xbe,0xdb,0x16,0xb7,0x72,0xe9,0xb3, +0x54,0x72,0x8e,0x13,0x21,0x34,0x50,0xf6,0x16,0x58,0xfb,0x5d,0xb6,0x35,0x3c,0x7b, +0x29,0xb5,0xbe,0x9c,0x43,0x3c,0x2e,0x98,0x4c,0x47,0x91,0xa9,0x7c,0x38,0x3c,0xa8, +0x3d,0xe6,0x4e,0x91,0xc9,0x02,0xb4,0xc7,0xac,0xf9,0xa0,0xfc,0xf4,0xff,0x0f,0x78, +0x0b,0x5a,0xa7,0x89,0xc3,0x3a,0xbd,0xd7,0x2d,0x4a,0x26,0xdf,0x13,0x72,0x31,0x7b, +0xcb,0x18,0xbf,0x92,0xfc,0x6f,0x17,0xca,0xe8,0x37,0x19,0xfd,0xf5,0x3b,0x7e,0x8f, +0xe0,0x84,0x25,0x37,0x51,0xfa,0xe2,0x97,0xc9,0xd7,0x53,0x11,0xfa,0x64,0xb5,0x5c, +0x37,0x53,0xf4,0x2f,0xf1,0x96,0x94,0x8a,0x01,0xf7,0xe9,0xd4,0x08,0x7d,0xb8,0xb7, +0x60,0x66,0x63,0x3c,0x74,0x7e,0x53,0xd8,0xad,0xf1,0x60,0xc1,0x8d,0x7e,0xe3,0x4a, +0xfe,0xa0,0xad,0xcd,0x50,0xe9,0x21,0x28,0x5c,0x1d,0x1f,0xf1,0xe5,0x82,0xc3,0xf9, +0x20,0xc0,0x98,0x12,0x67,0xe4,0xb7,0xd1,0x49,0x6d,0x23,0x00,0x04,0x6d,0x9f,0x13, +0x88,0x8d,0xf3,0x15,0x6e,0xad,0x30,0x3f,0x76,0xfc,0xf2,0x37,0x28,0xe8,0x26,0x5b, +0x0b,0x80,0xfe,0x47,0x14,0x22,0x7d,0xe4,0x06,0x31,0x65,0xd8,0x3d,0x41,0x41,0x33, +0xdd,0xe3,0x69,0x1a,0x65,0x98,0x63,0xcc,0x62,0xd8,0xfb,0x44,0xa1,0x62,0x6b,0x38, +0xd0,0x2b,0x34,0xb8,0x34,0xb4,0x0e,0x2a,0xa7,0x67,0xce,0xd7,0x15,0xc4,0x50,0x62, +0x75,0xc7,0x17,0x28,0x39,0x7a,0x7c,0xb8,0x8f,0x74,0x78,0x96,0x6f,0x4e,0xec,0x30, +0x8d,0x27,0x67,0x38,0xfe,0xab,0xff,0x90,0x8b,0x86,0x8f,0x3f,0x6b,0x6f,0xec,0x9c, +0x72,0x8b,0xd7,0xf7,0x56,0x2d,0x71,0x00,0xc6,0xa9,0x77,0x70,0x3c,0xff,0xa2,0x0a, +0xe1,0x23,0xba,0x01,0x59,0xfc,0x88,0xcc,0x48,0x88,0xfa,0xd1,0xbd,0x6b,0xa0,0x68, +0xe6,0x81,0xad,0xaf,0x3f,0xd9,0x89,0xbe,0x49,0xd6,0xe4,0xee,0x55,0x46,0xac,0x49, +0xe7,0x80,0x2d,0x04,0x8d,0xab,0xcf,0xd7,0xdc,0x31,0x94,0x64,0x21,0xd6,0x71,0x4f, +0xe5,0x83,0x7b,0x6c,0xb3,0xaf,0x2d,0x59,0xad,0x58,0xf5,0x34,0x9a,0xef,0x5a,0x35, +0x8f,0x81,0x9a,0x1e,0x0e,0x03,0x10,0x6a,0x4f,0x9f,0xd4,0xca,0x4b,0xef,0x78,0x7e, +0x09,0xfd,0xb4,0x68,0x93,0x06,0x70,0x7d,0xee,0x12,0xf4,0xcb,0x7c,0x5d,0x5d,0x8a, +0xe6,0x83,0x85,0xbe,0x44,0xbe,0x55,0x3a,0x4a,0x6a,0x76,0x1b,0x37,0xfd,0x8f,0x99, +0x2e,0x7e,0x5d,0x5f,0xf4,0x0a,0xcf,0x19,0x30,0x8d,0xc5,0x4a,0x17,0x8c,0xdf,0xfd, +0x45,0xf0,0x2a,0x8d,0x25,0xb1,0x56,0xa6,0x67,0xb0,0x34,0xd8,0x17,0x23,0x14,0x69, +0x56,0x91,0x2e,0xe5,0x13,0x10,0x3d,0xa2,0x1a,0xf1,0x86,0x06,0xf4,0x5e,0x5b,0x85, +0x70,0xf6,0xa2,0x8e,0x96,0xc2,0xb5,0xa3,0xeb,0xd3,0xa3,0xe7,0x1f,0xb6,0x74,0xe1, +0x00,0x4c,0xa5,0x64,0xb4,0xb2,0x1d,0xb7,0x9a,0xd3,0x19,0xd5,0xd4,0x93,0x5a,0x20, +0xec,0x2c,0x9a,0x59,0x5d,0x02,0xf1,0x37,0x8f,0xbc,0xad,0xe2,0xfb,0x97,0xcf,0x16, +0xfb,0xff,0x5e,0xd1,0xdc,0x50,0xf9,0xb8,0x2d,0xdd,0x81,0xc7,0x66,0x5a,0x1e,0x47, +0xf6,0x7e,0xe4,0x34,0x64,0x1d,0xb5,0xee,0x6f,0x94,0x5e,0x42,0x23,0xe8,0x81,0xa0, +0xa8,0x11,0x93,0xe4,0xdc,0x32,0x5d,0x4c,0xad,0xff,0xf4,0x89,0x9d,0x1f,0x27,0xec, +0xd3,0xe3,0xa1,0x0e,0xc1,0xdb,0x91,0xee,0xc8,0x88,0x36,0xaa,0xa0,0x94,0x8d,0x5e, +0xf1,0xf3,0xb8,0xfc,0xc2,0x64,0xb2,0x4b,0x64,0x99,0xc0,0x7f,0x15,0xf4,0xa6,0x0f, +0xb0,0xd5,0xc1,0xed,0x4b,0x47,0x0d,0x0e,0xac,0x75,0xed,0xab,0x36,0xd2,0x11,0x5e, +0x9e,0x3b,0x7b,0x61,0x40,0xf9,0x01,0xfa,0x62,0x7d,0xad,0x9b,0xfb,0x8b,0x99,0xb9, +0x29,0x1a,0x66,0x88,0xac,0x68,0xf6,0xea,0x9d,0xd2,0x88,0xbb,0xb6,0x9f,0xa6,0xda, +0x44,0xf7,0x4b,0xda,0xb8,0xab,0xcb,0xbf,0x97,0xf7,0xa0,0xae,0x5e,0xfc,0x67,0x8b, +0xea,0x35,0xc4,0xd0,0x66,0x15,0x1f,0x6d,0x12,0x9f,0x7e,0x1e,0xf3,0x88,0x90,0xca, +0xac,0x32,0xbf,0x41,0x44,0xbc,0xbf,0xf2,0x9b,0x72,0x7a,0x67,0x16,0xec,0x0e,0xb5, +0x23,0xb0,0xa2,0x77,0x09,0x4e,0x63,0xda,0xf8,0x18,0x37,0x61,0x3b,0xe8,0x70,0x22, +0xc9,0x0e,0x3f,0x50,0xe5,0x09,0x09,0x5e,0x60,0x6a,0xb8,0xe1,0xab,0x21,0x3f,0x34, +0x48,0x41,0xe3,0x05,0x91,0xc2,0x2c,0x41,0xf7,0x17,0x35,0xd4,0x99,0xe2,0x07,0xe2, +0xc4,0x07,0x49,0x0d,0x02,0x51,0x47,0xde,0xcd,0xe8,0x0c,0x46,0xb3,0x60,0x45,0xb1, +0x1f,0x24,0xd6,0xa4,0x1e,0x64,0x57,0x26,0xd0,0xef,0x89,0x8b,0xf7,0xcb,0x47,0x90, +0xbf,0x7d,0xd0,0x51,0x17,0x35,0x7f,0x81,0xdf,0xa5,0x0c,0xfc,0xf6,0xca,0x1f,0x19, +0x5a,0xad,0x47,0xe3,0xf2,0xb8,0x72,0x61,0x0a,0x17,0x01,0xed,0x77,0xc9,0xf8,0x09, +0x3b,0xbf,0x08,0xbd,0x2c,0x6a,0xb1,0xfb,0xa0,0x67,0x4a,0xfd,0x76,0xc8,0x80,0x1b, +0x66,0xa0,0x02,0x09,0xd6,0x69,0xef,0x88,0xcd,0x5e,0xaa,0x38,0x2f,0x2c,0x8f,0xe5, +0x8c,0xf9,0x26,0x5e,0x9a,0x84,0x3d,0x3c,0x22,0x3d,0x41,0x3a,0x26,0x69,0x25,0xa1, +0xcd,0x48,0x6f,0x8d,0x64,0x0a,0x4d,0x33,0xc8,0xe1,0x4c,0x2f,0x58,0xea,0x35,0xb5, +0xe1,0x06,0x59,0x2d,0x18,0x84,0x99,0xff,0x5b,0x48,0x38,0x79,0x05,0x03,0x82,0x44, +0x0e,0xf3,0xbc,0x61,0x08,0x61,0x44,0x31,0xa1,0xf4,0x45,0x1f,0x7c,0xcd,0xf5,0x69, +0xaa,0xf2,0xb4,0xfc,0x09,0x60,0x51,0x57,0x56,0x12,0x49,0x4d,0x27,0xc2,0x97,0xda, +0x2b,0xd1,0xbd,0x65,0x88,0x63,0x69,0xd8,0x9b,0xe1,0x07,0x9e,0xe2,0xc3,0xf0,0xfc, +0x7c,0xf2,0x34,0xd8,0x1d,0xff,0x6e,0x20,0xcd,0x1f,0x4d,0x0e,0xfd,0x01,0xbb,0x04, +0x3c,0xf7,0x50,0x77,0x29,0x8b,0x03,0xe9,0x89,0xb1,0xa4,0xa6,0x30,0xab,0x82,0xaf, +0x30,0xc5,0x85,0x54,0x3d,0x71,0x99,0xbb,0x9d,0xc9,0x14,0xab,0x7c,0xdc,0x23,0xb8, +0xb9,0xc7,0x87,0xfe,0x3f,0x94,0xd5,0xac,0x69,0x10,0x35,0x58,0xd0,0xa6,0xef,0x8e, +0x6f,0x9e,0x0f,0x5b,0x4b,0xb3,0xa2,0x14,0x2b,0x5e,0x14,0x8b,0xe8,0x68,0x62,0x94, +0xe4,0xb0,0xc1,0xbb,0x71,0xe6,0x2a,0xb0,0xaa,0x3c,0x78,0x62,0x2a,0x89,0x48,0x21, +0xe1,0x35,0xac,0xcf,0x30,0x38,0x64,0x03,0x62,0x30,0xd8,0xf6,0x77,0x8e,0xcb,0x56, +0xc9,0xb0,0x69,0x40,0x59,0xf7,0xf5,0xf2,0xe7,0x32,0x85,0x93,0xb2,0x8d,0x6b,0x91, +0x75,0xb3,0x9d,0xa2,0xf3,0x79,0x65,0x02,0xea,0x54,0xdd,0xea,0x91,0x6c,0x78,0x1b, +0x43,0x9e,0x43,0xff,0x5a,0x3b,0xed,0xd7,0x00,0x55,0x16,0xeb,0x56,0xa4,0xe9,0x6b, +0xf3,0xb2,0x51,0xdc,0xb9,0xb9,0xa1,0x89,0x28,0xf6,0x8c,0xac,0x92,0xd1,0x87,0x97, +0x7e,0xee,0xbf,0x99,0xcf,0x7e,0xe8,0xd7,0xc6,0x85,0x43,0xf3,0x6b,0x45,0x6c,0x9d, +0x42,0xde,0x54,0x9e,0xc6,0x37,0x97,0xc7,0x83,0x33,0x24,0x0d,0x75,0xd4,0x4a,0x57, +0x41,0xaa,0xc5,0xce,0x3e,0x70,0xb5,0x13,0x38,0x1c,0x2f,0x8a,0x85,0x7f,0x68,0x88, +0xcf,0xb9,0xf6,0x7c,0xde,0xbd,0x58,0xa9,0xe8,0x53,0xfe,0xf8,0x0c,0x7d,0x46,0xbb, +0x41,0x88,0xc4,0x4f,0x62,0x34,0xd5,0x5c,0xb0,0x1e,0xe9,0xfd,0x8d,0x5e,0x41,0xee, +0xc0,0xba,0x27,0xd1,0x3b,0x7f,0xbf,0xc6,0xcf,0x53,0x7c,0x4c,0x06,0xf5,0xdf,0x71, +0x3e,0xc2,0x2e,0x74,0x76,0xe4,0xb7,0x62,0xad,0xf8,0x8e,0x6a,0xa0,0xd8,0x0e,0x42, +0x00,0x2c,0x28,0xb6,0x05,0xc1,0x7c,0x0d,0x40,0x14,0x13,0x93,0x80,0xff,0xa4,0x15, +0x6f,0xaa,0xdf,0x53,0xff,0xba,0xdd,0xb1,0xc4,0xca,0xe8,0x23,0x59,0x81,0xa0,0xf3, +0x89,0xc3,0x93,0xe4,0x84,0x56,0x35,0xb7,0x95,0xdd,0xc4,0x07,0xd5,0x4c,0x76,0x07, +0xed,0xec,0x5f,0xe6,0xfb,0xc4,0xf0,0x9d,0x68,0x62,0x96,0xc3,0x57,0x64,0xe0,0x41, +0x0a,0xc1,0x08,0x5e,0xea,0xa6,0x40,0x8d,0xb2,0xa6,0x4f,0xd3,0x8b,0xb4,0xda,0xf2, +0x83,0x29,0x0d,0x45,0x9e,0xca,0x49,0x9d,0x3b,0x67,0x46,0xc3,0x56,0xa6,0x17,0x54, +0x26,0x28,0x53,0x52,0x18,0xa3,0x82,0x0c,0xaf,0xaf,0xa0,0x95,0x36,0xa8,0x24,0x17, +0xf0,0x10,0x33,0xf2,0x1c,0x1d,0x74,0x63,0xa5,0xc0,0xbc,0x50,0x3e,0x8c,0xd1,0x65, +0x65,0x84,0x2b,0x93,0xe0,0x08,0xbf,0x8d,0xf8,0x60,0x84,0x8e,0x7f,0xe4,0x9c,0xae, +0x46,0x87,0xb2,0xf7,0x9c,0xe8,0xf3,0x26,0x45,0x88,0xcd,0x7f,0x5c,0xdb,0xd4,0x65, +0xa3,0x54,0x93,0xec,0x88,0x76,0x2a,0xdb,0xe1,0x6f,0x39,0xc3,0x59,0x10,0x6a,0x6d, +0xaf,0x23,0xe6,0x09,0x98,0xdc,0x0c,0x2f,0xbb,0x6f,0xd2,0x06,0x6d,0x93,0x86,0xc8, +0x0f,0x87,0xba,0x2d,0x13,0xc3,0x7b,0x4b,0x06,0x62,0x42,0x81,0x7d,0x00,0x6f,0x71, +0xbe,0x13,0xba,0xa5,0x3b,0x51,0xfb,0x98,0xcb,0x45,0x4b,0x9c,0xb8,0xfc,0xef,0x5f, +0xcb,0x41,0xcb,0x5e,0x12,0xe9,0x75,0x09,0xa5,0x47,0x7f,0xb8,0x5f,0xcf,0x5a,0xb5, +0x4f,0x35,0x07,0xc2,0xe8,0xd8,0x4a,0xe3,0xe3,0x20,0xbe,0x80,0x24,0x7d,0x4d,0x61, +0xf5,0x3a,0xa2,0x96,0xb5,0x1a,0x45,0x49,0xad,0x26,0xf6,0xb7,0x08,0xf8,0x24,0x70, +0x44,0xde,0xfb,0xd7,0x38,0x19,0x65,0x3d,0x1f,0xd1,0x61,0x58,0x1d,0x51,0x0a,0x97, +0xce,0xe7,0xda,0x92,0xab,0x1e,0x82,0xa0,0x13,0x0e,0xff,0xc4,0x81,0x72,0x44,0xb1, +0x16,0x3f,0x4c,0xca,0xb4,0x00,0x4c,0xa0,0xc5,0xd8,0x33,0x15,0x48,0xef,0x5e,0xa1, +0x41,0x9e,0x94,0x2b,0x37,0xf7,0x14,0x03,0xe4,0xc5,0xbd,0x90,0x9c,0xa6,0x1d,0xcb, +0x46,0x39,0xad,0xa5,0xf5,0x45,0xd1,0xa1,0x62,0xda,0x88,0x81,0x1d,0xc5,0x2f,0xa0, +0x99,0x96,0xee,0x39,0x94,0x37,0x1d,0xb3,0x18,0xda,0xa4,0x01,0x52,0x58,0xa4,0x4c, +0xbe,0x9b,0xf4,0x2e,0x9d,0x78,0x10,0x11,0x95,0x7c,0xfe,0x51,0x9d,0x7b,0xd1,0x89, +0xdb,0x46,0x8e,0x8e,0x4a,0x9d,0x7f,0x36,0x69,0x59,0xe0,0xf3,0x75,0x56,0xc4,0x70, +0x64,0x6d,0x7c,0x89,0xc3,0xb3,0x44,0xd1,0x87,0xa5,0x90,0xe4,0x01,0xc6,0x09,0x20, +0x56,0x3f,0x70,0xfd,0x69,0xf3,0x1a,0x32,0xe9,0x5b,0xb4,0xb4,0xa4,0xff,0x5e,0xd7, +0xab,0x8a,0x98,0xf6,0xbe,0xaf,0x66,0x88,0x62,0x9c,0x20,0xe6,0xdb,0x53,0xff,0xc1, +0x44,0xe9,0x17,0x3e,0x15,0x16,0xc6,0x6a,0x4c,0xbd,0xc0,0x4f,0x5d,0xf0,0x39,0xd1, +0xae,0x3a,0x38,0xce,0xb8,0x2e,0x76,0xce,0xdd,0x51,0xa6,0x4f,0xee,0xac,0xed,0x1d, +0x3d,0x9b,0xfc,0xde,0x3f,0x2e,0xff,0xee,0x6f,0x5e,0xfe,0xec,0xd1,0xdc,0x50,0x18, +0x10,0x04,0x85,0x31,0x00,0x3e,0xe8,0x42,0xe7,0x15,0x50,0x24,0x14,0xdd,0x58,0x08, +0x49,0xa5,0x0e,0x72,0x5d,0xf5,0xe0,0xa0,0xea,0xec,0x4c,0xca,0xac,0xc0,0x41,0x12, +0xa6,0x21,0x80,0x12,0x80,0x81,0xe9,0xd5,0x67,0xca,0x83,0x24,0x2f,0xef,0x9e,0x28, +0x01,0x13,0x0f,0xbc,0xd5,0x4e,0x65,0x9a,0x6a,0xb7,0xa1,0xca,0x24,0x00,0xf7,0x64, +0xbc,0x24,0xba,0x90,0x92,0x04,0xc0,0xa0,0x5a,0x79,0x5a,0x55,0xf3,0x9b,0xec,0x32, +0x27,0x0f,0xe8,0x59,0x1b,0x65,0x20,0x78,0xa6,0x04,0x67,0x45,0x12,0xca,0xc3,0x4a, +0x06,0x52,0x4b,0xb3,0x4d,0xab,0x47,0x67,0x71,0x82,0xef,0x34,0xfc,0xb9,0xc9,0x26, +0xa7,0x70,0xcb,0x5d,0x91,0x26,0xac,0x8f,0xd7,0x7a,0xd3,0x0b,0xb9,0x0f,0x22,0x0d, +0xc0,0x4b,0x00,0x03,0x5c,0x4b,0x6e,0x5c,0xe3,0x40,0x69,0x5f,0x4b,0x99,0xe2,0x18, +0x8b,0x01,0x8c,0x28,0x59,0x55,0x62,0xf6,0xea,0xde,0x49,0xcf,0xd5,0xe4,0x57,0x1a, +0xfc,0xbb,0x85,0xc3,0xd0,0x2e,0x6f,0xb1,0x6b,0x15,0xed,0x2b,0x31,0x80,0xb2,0xe9, +0x81,0x04,0x89,0x60,0xd9,0x69,0x63,0x1b,0x6a,0xaf,0x7f,0xce,0x1f,0xe0,0xb9,0x4c, +0xa7,0x4d,0xca,0x4e,0x98,0x9c,0x44,0x6e,0xf9,0x01,0xac,0x29,0x7e,0x73,0x70,0xdf, +0x2f,0xf0,0x2e,0x3c,0xe9,0x48,0xca,0x0b,0xc7,0x1c,0xa5,0x0f,0x12,0xec,0x66,0x4f, +0x1e,0x6a,0xca,0x3f,0xed,0x0e,0x2d,0x8b,0xda,0x03,0x69,0x97,0xca,0xa3,0x6c,0xbb, +0x6b,0x1a,0x34,0x8d,0xe5,0x2c,0x25,0x7e,0x72,0x29,0x58,0x8e,0x5f,0xe2,0x7f,0xb6, +0xd3,0x08,0xda,0x66,0x34,0x8d,0x93,0x93,0x3c,0x56,0xa6,0xb4,0xf5,0x66,0xf1,0x34, +0x96,0xff,0x68,0x6a,0x52,0x11,0x9b,0xf5,0x3d,0xf0,0x98,0x45,0xed,0x91,0xf8,0xee, +0x1f,0xc6,0x45,0x89,0x5e,0xbf,0x92,0x49,0xbc,0xa8,0xeb,0xbf,0x9b,0xc6,0xf4,0x69, +0x16,0x72,0x69,0x6a,0xb5,0x03,0x9a,0xa0,0xb5,0x3e,0x75,0x3f,0xd3,0xa5,0x15,0x22, +0x06,0x63,0xea,0xc2,0xa3,0x68,0x2a,0xe7,0x46,0x18,0x44,0x15,0xd1,0x34,0xed,0xd7, +0x82,0xba,0x78,0x9e,0xfa,0x71,0xa6,0x3a,0x98,0xfe,0xca,0xb8,0x98,0x2d,0x41,0xcd, +0x3a,0x52,0xeb,0xc2,0x27,0x39,0xe2,0x09,0x1d,0xdb,0xe7,0xdb,0x51,0x37,0x35,0xf6, +0x02,0x56,0xe4,0x9b,0x7a,0x53,0x6d,0xae,0x88,0x63,0x66,0x44,0xea,0xd8,0x7b,0xc6, +0x93,0x33,0xf9,0x9f,0x2b,0x7c,0x95,0x17,0x3c,0x4e,0xe9,0x5d,0xb2,0x60,0x77,0xe5, +0x9a,0x6b,0xf6,0x98,0xc0,0x7b,0x9d,0x31,0x31,0x24,0x2c,0xe3,0x12,0x9c,0x7a,0x05, +0x1b,0x96,0xa1,0x58,0x34,0x91,0x94,0x49,0xbc,0xf2,0xc9,0x36,0xe8,0xd1,0xf1,0xd3, +0x46,0xd0,0x0e,0x2a,0x58,0x5d,0x18,0x17,0xb1,0x4f,0xa7,0x4c,0x11,0x7f,0x0e,0xdc, +0xe6,0x13,0x6f,0x13,0x83,0xe2,0x56,0x19,0xe2,0xa3,0xdb,0xc8,0xc6,0xb4,0xbb,0x26, +0x67,0x70,0x84,0xf7,0x7c,0x7f,0x5d,0x04,0x8a,0x3b,0x5e,0xf0,0x76,0x62,0x42,0xbe, +0xb0,0x5f,0x79,0xcf,0x4c,0x4b,0xd7,0xe4,0xec,0x1e,0x66,0xb8,0x42,0x66,0x31,0x3b, +0xb3,0x72,0x4e,0xd9,0x44,0x5c,0xeb,0x13,0x0a,0x39,0x65,0x07,0xeb,0xb2,0x70,0xfd, +0xff,0x8e,0x24,0xb5,0x18,0x4a,0x48,0x5f,0xe7,0x9a,0xb4,0xa1,0xbf,0x06,0x8c,0xd0, +0xa6,0x8f,0x28,0xbb,0x1d,0x3f,0x40,0x1a,0xe6,0x53,0xc6,0xa4,0x88,0x9c,0x49,0xc1, +0x00,0x8c,0x21,0xec,0x90,0xf4,0x49,0x76,0x67,0x21,0xef,0xb4,0xc4,0x6f,0x11,0xb7, +0x85,0x83,0xad,0xef,0x1a,0xa1,0x41,0xb7,0xc7,0xc3,0x16,0xc4,0x03,0x17,0x18,0x1d, +0xd6,0x8b,0xde,0x4f,0x55,0x56,0x0e,0x80,0xea,0xf9,0xa6,0x36,0xbd,0x80,0x10,0x60, +0x73,0x5a,0xf0,0x57,0x43,0x59,0x06,0x90,0xf2,0x13,0x07,0x72,0x4b,0xaa,0x53,0x6b, +0x53,0x32,0x1a,0x35,0x18,0xc3,0x95,0x47,0x7b,0x30,0xc9,0x99,0x7a,0xeb,0xf9,0x00, +0x24,0x98,0xa3,0x15,0xff,0xaa,0xf1,0x91,0x7e,0x71,0xda,0x27,0x0f,0x4f,0xdd,0x28, +0xf3,0x80,0x15,0x0f,0x91,0xa4,0xb5,0xd5,0x10,0xb7,0x55,0xdf,0x86,0xf8,0xd1,0x3b, +0xf6,0xa5,0xe3,0x71,0x3e,0x0b,0xbd,0x48,0x11,0x27,0x15,0xcf,0xb1,0xe4,0xd8,0x69, +0x7b,0x8e,0xcb,0x11,0xd3,0x5e,0xb4,0xdd,0x90,0x17,0xcd,0xb5,0xb7,0x2f,0x54,0x7f, +0x76,0x0b,0x0c,0x19,0x49,0xcf,0xbc,0x70,0x91,0xdc,0xe5,0x0c,0x5d,0x40,0xd6,0x28, +0x3e,0x83,0xfa,0x64,0x1f,0xbb,0xfa,0x88,0xff,0x5a,0xcc,0xde,0x61,0xcc,0xca,0xcb, +0x8b,0x86,0xd0,0xd9,0xb3,0xb2,0x6c,0x7c,0xa4,0x89,0x72,0x8d,0x5a,0x30,0x4d,0xa9, +0x3d,0x23,0xd9,0xc8,0x32,0xf1,0x7d,0x89,0xea,0x4b,0x2a,0x69,0xfa,0x4f,0xeb,0xca, +0x03,0x82,0xd1,0xd8,0x33,0xb3,0x45,0x99,0xa5,0xab,0xad,0x3e,0x34,0xc7,0xda,0xb3, +0xc3,0x5e,0xda,0x10,0x57,0x90,0x33,0x72,0x3c,0x02,0xea,0x94,0x34,0xbc,0x52,0x70, +0xce,0x54,0xca,0x9e,0xd4,0x1e,0x3f,0x52,0x35,0xb2,0xe2,0xad,0x7d,0x5a,0xdf,0x89, +0x43,0xe1,0x41,0x74,0x7a,0x19,0x36,0xd5,0xb4,0x47,0xd4,0x56,0x24,0xf2,0x53,0x4a, +0x4e,0x51,0xcf,0xf8,0x4a,0xdf,0xb8,0x41,0xf9,0xb4,0x18,0x2f,0x72,0xe5,0x21,0xe6, +0xbe,0xd0,0x82,0xa4,0xc1,0x49,0xc0,0xa2,0x6a,0x1b,0x8b,0xc9,0x33,0xa1,0x12,0x30, +0x44,0xb5,0x38,0x28,0xca,0x14,0x93,0x00,0xe7,0xe4,0xfc,0xea,0x71,0xa5,0xc4,0xc4, +0x47,0xf0,0xf3,0xa5,0x49,0x6b,0x55,0xe2,0x41,0xc6,0x7b,0xcc,0xe7,0xf0,0x89,0xf7, +0x19,0xb7,0xe3,0x24,0xfe,0x6a,0x47,0x74,0x4b,0xc8,0x66,0x08,0x03,0xf8,0x5c,0x49, +0xcf,0x2c,0xfc,0x0e,0xe2,0x17,0xb3,0x4b,0x70,0x69,0xe6,0x30,0x87,0xfe,0xd2,0xd5, +0x82,0x4d,0xd0,0x00,0x56,0x0f,0xbf,0x72,0x79,0x09,0x86,0x40,0xd1,0xf4,0x5d,0xc7, +0x4f,0xca,0x40,0xfd,0x7e,0xba,0xb6,0xdc,0xf8,0xdf,0x18,0xcd,0x50,0x9f,0xd3,0x5f, +0x02,0x89,0xae,0xed,0x56,0x2d,0x3a,0xfd,0xf5,0x70,0x40,0x7d,0x7e,0xbd,0x26,0xb9, +0xaa,0xad,0xb0,0x9e,0xd5,0x34,0x3c,0xff,0x0e,0x4c,0x2b,0xf6,0xf1,0xfe,0xbf,0x29, +0xa3,0x90,0xe7,0xa0,0x55,0x55,0x34,0xe7,0x2e,0xdc,0x96,0xe0,0xb9,0x09,0x19,0xcd, +0x47,0xfa,0x58,0xfe,0xaf,0x11,0x5e,0xac,0xc0,0x52,0x40,0xee,0x73,0xf2,0x11,0x39, +0x03,0x92,0x91,0x8a,0x9b,0x12,0x56,0xfc,0xee,0x5f,0x19,0x0e,0x35,0xef,0x3a,0xf3, +0xc2,0x94,0xe0,0x40,0x30,0x2d,0x4e,0x8a,0x48,0x46,0x6f,0xdb,0xaf,0x9f,0x6f,0x18, +0xea,0x97,0x3c,0x76,0xa6,0x44,0x60,0xf6,0xf1,0x0f,0x67,0xcb,0xae,0x9e,0xe2,0x1a, +0x5e,0xa9,0xf8,0x22,0x31,0x1d,0x19,0xc6,0xa3,0x62,0x6e,0xda,0x2f,0x9d,0xc9,0x11, +0xc5,0x7e,0xb1,0xfa,0x1c,0x63,0xae,0xb3,0xc4,0x23,0x66,0xca,0x2e,0x9c,0xbf,0xbf, +0xfd,0xfb,0x3f,0xbb,0xed,0xdb,0xaf,0x9f,0xbd,0xbb,0x2f,0x9b,0xad,0x9b,0xb7,0xaf, +0xfc,0xfa,0x37,0xab,0xec,0xda,0xa7,0x8f,0xbc,0xba,0x27,0x8b,0xac,0x9a,0xbe,0xbe, +0x7d,0xf9,0x3e,0xba,0x6d,0xd9,0xae,0x9e,0x3d,0xb9,0x2e,0x9a,0x2d,0x99,0xb6,0xae, +0x7c,0xf8,0x36,0xaa,0x6c,0xd8,0xa6,0x8e,0x3c,0xb8,0x26,0x8a,0x2c,0x98,0x1a,0x3c, +0xc9,0x82,0x03,0x3a,0x97,0x2a,0x48,0x35,0xeb,0x4e,0x6d,0xd3,0xa7,0x97,0x6c,0xe9, +0xd3,0x19,0xe2,0x6f,0x39,0x22,0x9a,0xda,0xe8,0xc3,0x65,0xc3,0xa6,0x96,0x7b,0x59, +0x98,0xa5,0x34,0x0c,0x15,0x26,0x9b,0x2d,0x69,0xc2,0x6c,0xd2,0x27,0x95,0x55,0x2f, +0x54,0xa0,0x8d,0x1d,0xf2,0xcf,0xe0,0xdb,0x4b,0x03,0x64,0xc2,0x26,0x94,0xbd,0xb7, +0xf5,0xf3,0x3d,0xb3,0xe5,0xd3,0xad,0x97,0xb5,0xb3,0x2d,0x93,0xa5,0x93,0xb5,0xa7, +0xf4,0xf2,0x35,0xa3,0xe4,0xd2,0xa5,0x87,0xb4,0xb2,0x25,0x83,0xa4,0x92,0xbc,0xb6, +0x75,0xf1,0x3c,0xb2,0x65,0xd1,0xac,0x96,0x35,0xb1,0x2c,0x92,0x25,0x91,0xb4,0xa6, +0x74,0xf0,0x34,0xa2,0x64,0xd0,0xa4,0x86,0x34,0xb0,0x24,0x82,0x24,0x90,0x3c,0x7f, +0xa3,0x1e,0x04,0x86,0x83,0x72,0xc6,0x40,0x3c,0xfd,0x6b,0x5b,0x8f,0x8f,0x4c,0xaf, +0x29,0x7d,0x88,0xb4,0x31,0x31,0x14,0xb8,0x67,0x31,0x63,0x4b,0x8e,0x8e,0xe5,0xbe, +0x84,0x7c,0x86,0x22,0x30,0x5d,0xc0,0xe6,0x22,0x12,0x6a,0x5a,0x0f,0x8d,0x25,0x53, +0xa7,0xa3,0x5d,0x6a,0x4e,0xcc,0x9d,0xb3,0xed,0x11,0x62,0x4a,0x0e,0x8c,0xbb,0x3f, +0xdd,0xeb,0x3b,0x3b,0xcd,0xcb,0xab,0x1f,0x9d,0xab,0x2b,0x1b,0x8d,0x8b,0xb3,0x2f, +0xdc,0xea,0x33,0x2b,0xcc,0xca,0xa3,0x0f,0x9c,0xaa,0x23,0x0b,0x8c,0x8a,0xba,0x3e, +0x5d,0xe9,0x3a,0x3a,0x4d,0xc9,0xaa,0x1e,0x1d,0xa9,0x2a,0x1a,0x0d,0x89,0xb2,0x2e, +0x5c,0xe8,0x32,0x2a,0x4c,0xc8,0xa2,0x0e,0x1c,0xa8,0x22,0x0a,0x0c,0x88,0x90,0x79, +0x97,0x88,0x79,0x73,0xc7,0xc7,0x16,0x9c,0x5b,0x57,0x69,0x53,0x87,0x87,0xf3,0x14, +0xf4,0xa4,0x71,0x63,0xc6,0xc6,0xf2,0x38,0x95,0x79,0x61,0x43,0x86,0x86,0x57,0x63, +0x53,0xb1,0x78,0x72,0x47,0xc5,0x4d,0xac,0x4f,0x1b,0x68,0x52,0x07,0x85,0xa0,0xc7, +0x58,0xc7,0x70,0x62,0x46,0xc4,0xb3,0xfb,0x6a,0xaf,0x60,0x42,0x06,0x84,0xb9,0x37, +0xd5,0xe3,0x39,0x33,0xc5,0xc3,0xa9,0x17,0x95,0xa3,0x29,0x13,0x85,0x83,0xb1,0x27, +0xd4,0xe2,0x31,0x23,0xc4,0xc2,0xa1,0x07,0x94,0xa2,0x21,0x03,0x84,0x82,0xb8,0x36, +0x55,0xe1,0x38,0x32,0x45,0xc1,0xa8,0x16,0x15,0xa1,0x28,0x12,0x05,0x81,0xb0,0x26, +0x54,0xe0,0x30,0x22,0x44,0xc0,0xa0,0x06,0x14,0xa0,0x20,0x02,0x04,0x80,0x96,0x60, +0x6f,0x25,0xa4,0x06,0x97,0xae,0xb6,0xd2,0x18,0xcf,0x4f,0xd9,0xab,0x1f,0x80,0x98, +0x6e,0x15,0x53,0x09,0xea,0x0a,0x32,0x36,0xe6,0xcc,0x47,0xc9,0xaa,0x1e,0x01,0xf2, +0x64,0x02,0x41,0x38,0xb0,0x76,0x51,0x67,0x80,0xcf,0x4e,0xd8,0x2b,0x1d,0x29,0xe2, +0x5d,0xa3,0x54,0xbe,0xb7,0x7c,0x73,0xcd,0x66,0x81,0x46,0xc8,0x2a,0x1c,0x9f,0xbd, +0xf9,0x7b,0x1f,0xb9,0xe9,0x5b,0x8f,0x9d,0xb9,0x3b,0x0f,0x99,0xa9,0x1b,0x97,0xad, +0xf8,0x7a,0x17,0xa9,0xe8,0x5a,0x87,0x8d,0xb8,0x3a,0x07,0x89,0xa8,0x1a,0x9e,0xbc, +0x79,0x79,0x1e,0xb8,0x69,0x59,0x8e,0x9c,0x39,0x39,0x0e,0x98,0x29,0x19,0x96,0xac, +0x78,0x78,0x16,0xa8,0x68,0x58,0x86,0x8c,0x38,0x38,0x06,0x88,0x28,0x18,0x7c,0x05, +0x5e,0xc6,0x26,0xff,0xa3,0x28,0x35,0x87,0x68,0xcb,0x4d,0xd1,0xa3,0x17,0x4a,0x45, +0xac,0xec,0x57,0x8f,0x39,0xeb,0xf8,0xbe,0x05,0x4b,0x45,0xc1,0xa2,0x16,0x42,0xab, +0x5a,0x35,0xfd,0xe0,0x9a,0x01,0x36,0xb3,0xee,0x1a,0x4c,0xd0,0x23,0x15,0x9f,0x79, +0x7a,0xee,0xac,0x9b,0x9f,0xab,0x05,0x16,0x8f,0x62,0x44,0xc0,0x22,0x14,0x9d,0xb5, +0xf1,0x73,0x1d,0xb1,0xe1,0x53,0x8d,0x95,0xb1,0x33,0x0d,0x91,0xa1,0x13,0x95,0xa5, +0xf0,0x72,0x15,0xa1,0xe0,0x52,0x85,0x85,0xb0,0x32,0x05,0x81,0xa0,0x12,0x9c,0xb4, +0x71,0x71,0x1c,0xb0,0x61,0x51,0x8c,0x94,0x31,0x31,0x0c,0x90,0x21,0x11,0x94,0xa4, +0x70,0x70,0x14,0xa0,0x60,0x50,0x84,0x84,0x30,0x30,0x04,0x80,0x20,0x10,0xe4,0x9b, +0x48,0x3b,0x5b,0x79,0xcb,0x4f,0x94,0xbc,0xe8,0x7d,0x4b,0x59,0x8b,0x0f,0x53,0x63, +0x9a,0x03,0x53,0x69,0xca,0x4e,0x1a,0xcd,0xc6,0x93,0x43,0x49,0x8a,0x0e,0xd8,0x9f, +0x86,0x8d,0x5a,0x78,0x4b,0x4d,0x8e,0x03,0xbc,0xc2,0x4a,0x58,0x0b,0x0d,0x73,0x7c, +0xa9,0x38,0x52,0x68,0x4a,0x4c,0xbc,0x8a,0x65,0x73,0x42,0x48,0x0a,0x0c,0x9b,0x3d, +0xd9,0x6b,0x1b,0x39,0xc9,0x4b,0x8b,0x1d,0x99,0x2b,0x0b,0x19,0x89,0x0b,0x93,0x2d, +0xd8,0x6a,0x13,0x29,0xc8,0x4a,0x83,0x0d,0x98,0x2a,0x03,0x09,0x88,0x0a,0x9a,0x3c, +0x59,0x69,0x1a,0x38,0x49,0x49,0x8a,0x1c,0x19,0x29,0x0a,0x18,0x09,0x09,0x92,0x2c, +0x58,0x68,0x12,0x28,0x48,0x48,0x82,0x0c,0x18,0x28,0x02,0x08,0x08,0x08,0xdb,0x2a, +0x0e,0x87,0x59,0x71,0xc3,0x47,0x4e,0x8d,0x85,0x25,0x49,0x51,0x83,0x07,0xd1,0x58, +0xae,0xdf,0x51,0x61,0xc2,0x46,0x89,0x9e,0x1a,0x19,0x41,0x41,0x82,0x06,0x58,0xb5, +0x5b,0x6f,0x58,0x70,0x43,0x45,0x4f,0x69,0x6f,0x9c,0x48,0x50,0x03,0x05,0x98,0xbf, +0x28,0x6e,0x50,0x60,0x42,0x44,0x60,0x39,0x9e,0xdb,0x40,0x40,0x02,0x04,0x99,0x35, +0xd1,0x63,0x19,0x31,0xc1,0x43,0x89,0x15,0x91,0x23,0x09,0x11,0x81,0x03,0x91,0x25, +0xd0,0x62,0x11,0x21,0xc0,0x42,0x81,0x05,0x90,0x22,0x01,0x01,0x80,0x02,0x98,0x34, +0x51,0x61,0x18,0x30,0x41,0x41,0x88,0x14,0x11,0x21,0x08,0x10,0x01,0x01,0x90,0x24, +0x50,0x60,0x10,0x20,0x40,0x40,0x80,0x04,0x10,0x20,0x00,0x00,0xf3,0x6e,0x80,0x00, +0x0c,0x4c,0x40,0x05,0x97,0x9b,0x10,0x20,0x40,0x40,0xf0,0x65,0x9c,0xeb,0x51,0xef, +0xe0,0xce,0x88,0xe8,0x90,0x63,0x9f,0xd2,0xc3,0x69,0x7e,0xc4,0x41,0x6e,0xb6,0x85, +0x8c,0xcc,0xa1,0xfd,0x90,0xd9,0x11,0x21,0x6c,0xc9,0x95,0xc7,0x52,0x68,0x60,0xea, +0xea,0x06,0x09,0x35,0xa2,0x01,0xa0,0x53,0x80,0x03,0xf9,0x74,0x5d,0x6e,0xe0,0x53, +0x16,0x60,0xdb,0x36,0xb1,0x22,0xe7,0x68,0x44,0x44,0x29,0xa2,0xf0,0x21,0xa0,0xf2, +0xa7,0x82,0xb0,0xd6,0x16,0x4f,0x58,0x48,0x8b,0x35,0xa8,0x54,0x53,0xa8,0x9a,0x43, +0xfd,0x86,0x49,0x2c,0x31,0x43,0x42,0x5e,0xda,0x04,0xa3,0xe3,0xd2,0x2a,0x9d,0x77, +0x6d,0x64,0xf1,0x85,0x64,0x28,0xf9,0x62,0xd7,0x23,0x49,0xb3,0x39,0x2b,0xa9,0xe0, +0x08,0xf3,0x39,0xfa,0x08,0xd5,0x6a,0x4a,0x0b,0x97,0xd8,0xc3,0xfb,0x65,0xe5,0xe2, +0x62,0x99,0xd0,0x08,0xba,0x2f,0x1a,0x38,0x49,0x49,0xd2,0xab,0x3a,0x59,0x03,0x7b, +0x2f,0x1a,0x79,0x8f,0x9b,0xcc,0x6b,0x29,0xc8,0x4a,0x99,0x25,0x7b,0x6c,0x24,0xe8, +0xd1,0x0e,0x83,0x50,0xfa,0x0b,0x1b,0x39,0xc9,0x4b,0xe3,0xd5,0xdb,0xa0,0xea,0xea, +0xd5,0x83,0xfa,0x9c,0xe1,0x23,0x8d,0x6a,0x3d,0x5c,0x22,0xe8,0x56,0xbb,0x75,0x97, +0xb2,0x41,0x4e,0x05,0x99,0x25,0x8e,0x3e,0xe9,0x93,0x1a,0x7c,0x2b,0x21,0x83,0x49, +0xf0,0xd0,0x6c,0x33,0x47,0x6c,0xbb,0xcb,0x6e,0xc9,0x7b,0xce,0xa5,0x67,0x3b,0x9f, +0x21,0x4e,0x1f,0xad,0x93,0x20,0xa5,0xfd,0xcb,0xfc,0xab,0xbb,0x71,0x2d,0x04,0x80, +0x78,0xf8,0x56,0x72,0x20,0xfd,0x2c,0xf0,0x20,0x5f,0x14,0x8f,0x91,0x8f,0xde,0xb0, +0x26,0xe9,0xec,0xd5,0xdc,0xba,0x18,0x52,0xe3,0x19,0x5c,0xb1,0xa9,0x33,0x4f,0x28, +0x82,0x11,0xc4,0xd1,0x91,0x22,0x75,0xe5,0x9c,0xd9,0x6e,0x21,0xfc,0x53,0x02,0x1d, +0x23,0x3b,0x70,0x77,0x31,0xec,0x8e,0x53,0x63,0x59,0x19,0x83,0xf7,0x73,0x72,0xcc, +0xc9,0x91,0xc4,0xfc,0xb7,0x33,0xab,0x64,0x62,0xc5,0x0b,0xf0,0x74,0x74,0x77,0x8e, +0x10,0xd5,0x14,0x50,0x3f,0x69,0x4f,0xcf,0x7f,0x17,0xa8,0xd0,0xf6,0x52,0xed,0x4b, +0x5b,0xca,0x2d,0x66,0xb4,0x56,0xe2,0xed,0xe4,0x56,0xc6,0xa3,0x50,0x38,0xe1,0x74, +0x76,0x74,0x5d,0xaa,0xf0,0x57,0x5d,0xc9,0x2b,0x67,0x02,0xe5,0xf5,0x77,0xbb,0x78, +0x74,0x17,0xe6,0xcd,0x85,0xb3,0xf0,0x58,0x20,0x57,0xc1,0x88,0xac,0x68,0x04,0x9c, +0x8a,0x14,0x37,0xfe,0x78,0x79,0x1a,0x5a,0xc5,0xd4,0xb9,0xb1,0xfe,0xde,0x67,0xc8, +0x1d,0x17,0x00,0x6f,0x3a,0x12,0x77,0xe9,0xfd,0xd1,0x30,0xa4,0x28,0x2a,0x45,0x67, +0x0a,0x1b,0xf7,0xff,0x46,0xb1,0x67,0x3b,0xe0,0x26,0x37,0x1b,0x7c,0x5c,0xed,0x02, +0x91,0xb3,0xb9,0x4e,0x3f,0x38,0xf6,0xfb,0x7a,0x38,0xc5,0xaa,0xd8,0x32,0xeb,0xdc, +0xac,0x0b,0x84,0x26,0x84,0x60,0x5e,0xc0,0xf4,0x42,0xde,0xfc,0x7b,0x7d,0x60,0xd7, +0x7a,0xb5,0xff,0x23,0x16,0x33,0x6f,0xce,0x15,0x1c,0xa3,0xc9,0xde,0x7e,0x1f,0x47, +0x50,0xca,0xb4,0xb2,0xe2,0x80,0xf7,0x5b,0x6c,0x78,0xdf,0xfd,0xfb,0x7f,0x7e,0x1f, +0x54,0x2b,0xd8,0xeb,0x94,0x1b,0x30,0x05,0x27,0x30,0xb4,0xce,0x56,0x2d,0xd7,0x16, +0x05,0x59,0xa8,0xea,0x14,0xe3,0x00,0x62,0x41,0xce,0xed,0x56,0x31,0xea,0x04,0x03, +0xef,0xa6,0xa1,0xff,0x15,0x59,0x49,0xa1,0xcd,0x9f,0xe9,0xc8,0xd2,0xe2,0x96,0xee, +0x95,0xe0,0xad,0xd1,0xee,0xa7,0x01,0x63,0xcd,0xcc,0xab,0xb3,0xd9,0x34,0x8c,0xc2, +0xfa,0xa4,0x70,0x58,0x06,0x50,0x9f,0x80,0xd9,0x59,0x74,0x82,0x50,0x84,0x8a,0x4d, +0xc9,0x2e,0x18,0xd2,0x1b,0x72,0xe8,0x6c,0x57,0x31,0x27,0x67,0x51,0xe5,0xcd,0x01, +0x05,0x52,0xe4,0x81,0x7c,0xea,0xd9,0xc1,0x41,0xe1,0x58,0x43,0x53,0xc1,0x0f,0x57, +0xec,0x01,0x41,0xf4,0xe8,0xa6,0x7c,0x69,0xd3,0x73,0xea,0x8a,0xc7,0xa9,0xc2,0xbc, +0x8b,0x8f,0xf9,0x0e,0x63,0xa8,0x6d,0x02,0x33,0xe8,0x88,0xc1,0xa7,0x77,0xba,0x1e, +0x10,0x0b,0xba,0xf6,0x1b,0x54,0x72,0xad,0x2e,0x49,0xa3,0x4c,0xe2,0x56,0x8b,0xa9, +0x53,0x65,0x78,0x4d,0x9a,0xea,0xf3,0x2f,0x21,0xcc,0x4c,0xd1,0xda,0xaa,0xbb,0xf9, +0x21,0xca,0x39,0xe9,0x8f,0x76,0x43,0xb9,0xc4,0xaf,0xc0,0xc0,0x2a,0xa9,0xe2,0x38, +0xe5,0x5a,0x22,0x4e,0x6e,0x21,0xf7,0xac,0xa4,0x80,0x82,0x48,0xbc,0x8f,0x6b,0xa9, +0xdd,0x22,0x5d,0x56,0x19,0xad,0xd2,0xd9,0x30,0x8d,0x52,0xdc,0xd8,0xca,0x1d,0xd4, +0xe5,0x38,0x1c,0xcb,0x9e,0x3f,0x83,0xef,0xc2,0x19,0x5b,0xcd,0x01,0x01,0xd9,0xa8, +0x63,0x24,0xf8,0x60,0x87,0xed,0xbb,0x7b,0xbf,0x42,0x04,0x5b,0x5a,0xc8,0x24,0x82, +0x24,0x90,0xa0,0x74,0x77,0x90,0x6e,0xbf,0xc7,0xd6,0x6b,0x0b,0x72,0xf0,0x2c,0x92, +0x25,0xf4,0x27,0x74,0xb7,0xbb,0xbc,0x50,0xc4,0x2e,0xbc,0x8e,0x89,0xe1,0x25,0x83, +0xa4,0x92,0x5e,0xf8,0xf7,0x6d,0x39,0xcd,0x45,0x5a,0xa6,0xd5,0x0b,0xb0,0x77,0x8e, +0x06,0x95,0x4b,0x67,0xf9,0xbc,0x77,0xb2,0x06,0x59,0x7d,0xb7,0x85,0x06,0x97,0xfd, +0xd8,0x9a,0x84,0x82,0xb6,0x29,0xb4,0xe7,0x41,0x96,0xf4,0xe6,0x76,0xf4,0xcf,0xda, +0xfb,0xa5,0x53,0x53,0x39,0x3f,0x43,0xac,0x9a,0x57,0xfc,0xf6,0x77,0xf5,0x0d,0x45, +0x5a,0xd7,0x9d,0xe0,0x4f,0xb9,0xf1,0xad,0xc2,0x0a,0xf5,0xe7,0xf6,0xf6,0x4e,0xdf, +0x7f,0xe7,0x3a,0x55,0xb2,0xce,0x65,0xfa,0xa7,0xdc,0xfd,0xf7,0xf7,0xf7,0x2a,0xe4, +0x8d,0x10,0xc6,0xca,0x48,0x35,0x32,0x54,0x91,0x52,0xb3,0x2a,0x7c,0x69,0x2a,0x78, +0x2d,0x99,0xd6,0x1c,0x34,0xdf,0x1e,0x43,0x6d,0x42,0x16,0x1c,0xa2,0xa6,0xa7,0x69, +0x0d,0x12,0xdf,0x0d,0xbd,0xe2,0xcc,0xf7,0x4f,0xa1,0x68,0xa7,0x7b,0xfd,0x2f,0x9b, +0xad,0x9b,0x97,0xcf,0xb9,0xb4,0x17,0xc9,0x12,0x04,0x17,0x0c,0x35,0x8b,0x8e,0x79, +0xab,0xdb,0x9e,0xea,0xbb,0x9b,0xe1,0x68,0x6f,0xbf,0xf6,0xee,0x7e,0xfc,0xae,0xda, +0x5f,0x10,0xfd,0x23,0x73,0xf3,0xf6,0x3f,0xce,0x57,0xfe,0xfe,0x7f,0xfd,0xcf,0x68, +0xd1,0xfe,0x38,0xde,0xb8,0xbe,0x4d,0x09,0xca,0xd8,0xf7,0xef,0xfe,0xfe,0x90,0x5f, +0xaf,0x0e,0x9f,0x99,0x1d,0x41,0x90,0x19,0x6d,0x97,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, +0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, +0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xc0,0x42,0x91,0x25,0xd0,0x62,0x09,0x11, +0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xc1,0x43,0x99,0x35,0xd1,0x63,0x40,0x40, +0x02,0x04,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0x49,0x51, +0x83,0x07,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0x02,0x08, +0x08,0x08,0x82,0x0c,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2c,0x58,0x68,0x0a,0x18, +0x09,0x09,0x8a,0x1c,0x19,0x29,0x1a,0x38,0x49,0x49,0x9a,0x3c,0x59,0x69,0x03,0x09, +0x88,0x0a,0x83,0x0d,0x98,0x2a,0x13,0x29,0xc8,0x4a,0x93,0x2d,0xd8,0x6a,0x0b,0x19, +0x89,0x0b,0x8b,0x1d,0x99,0x2b,0x1b,0x39,0xc9,0x4b,0x9b,0x3d,0xd9,0x6b,0x42,0x48, +0x0a,0x0c,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0x4a,0x58, +0x0b,0x0d,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0x43,0x49, +0x8a,0x0e,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x4b,0x59, +0x8b,0x0f,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xa0,0x60,0x50,0x94,0xa4,0x70,0x70,0x0c,0x90, +0x21,0x11,0x8c,0x94,0x31,0x31,0x1c,0xb0,0x61,0x51,0x9c,0xb4,0x71,0x71,0x05,0x81, +0xa0,0x12,0x85,0x85,0xb0,0x32,0x15,0xa1,0xe0,0x52,0x95,0xa5,0xf0,0x72,0x0d,0x91, +0xa1,0x13,0x8d,0x95,0xb1,0x33,0x1d,0xb1,0xe1,0x53,0x9d,0xb5,0xf1,0x73,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0x06,0x88, +0x28,0x18,0x86,0x8c,0x38,0x38,0x16,0xa8,0x68,0x58,0x96,0xac,0x78,0x78,0x0e,0x98, +0x29,0x19,0x8e,0x9c,0x39,0x39,0x1e,0xb8,0x69,0x59,0x9e,0xbc,0x79,0x79,0x07,0x89, +0xa8,0x1a,0x87,0x8d,0xb8,0x3a,0x17,0xa9,0xe8,0x5a,0x97,0xad,0xf8,0x7a,0x0f,0x99, +0xa9,0x1b,0x8f,0x9d,0xb9,0x3b,0x1f,0xb9,0xe9,0x5b,0x9f,0xbd,0xf9,0x7b,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x20,0x02, +0x04,0x80,0xa0,0x06,0x14,0xa0,0x30,0x22,0x44,0xc0,0xb0,0x26,0x54,0xe0,0x28,0x12, +0x05,0x81,0xa8,0x16,0x15,0xa1,0x38,0x32,0x45,0xc1,0xb8,0x36,0x55,0xe1,0x21,0x03, +0x84,0x82,0xa1,0x07,0x94,0xa2,0x31,0x23,0xc4,0xc2,0xb1,0x27,0xd4,0xe2,0x29,0x13, +0x85,0x83,0xa9,0x17,0x95,0xa3,0x39,0x33,0xc5,0xc3,0xb9,0x37,0xd5,0xe3,0x60,0x42, +0x06,0x84,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0x68,0x52, +0x07,0x85,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x61,0x43, +0x86,0x86,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x69,0x53, +0x87,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0x22,0x0a, +0x0c,0x88,0xa2,0x0e,0x1c,0xa8,0x32,0x2a,0x4c,0xc8,0xb2,0x2e,0x5c,0xe8,0x2a,0x1a, +0x0d,0x89,0xaa,0x1e,0x1d,0xa9,0x3a,0x3a,0x4d,0xc9,0xba,0x3e,0x5d,0xe9,0x23,0x0b, +0x8c,0x8a,0xa3,0x0f,0x9c,0xaa,0x33,0x2b,0xcc,0xca,0xb3,0x2f,0xdc,0xea,0x2b,0x1b, +0x8d,0x8b,0xab,0x1f,0x9d,0xab,0x3b,0x3b,0xcd,0xcb,0xbb,0x3f,0xdd,0xeb,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x24,0x82, +0x24,0x90,0xa4,0x86,0x34,0xb0,0x34,0xa2,0x64,0xd0,0xb4,0xa6,0x74,0xf0,0x2c,0x92, +0x25,0x91,0xac,0x96,0x35,0xb1,0x3c,0xb2,0x65,0xd1,0xbc,0xb6,0x75,0xf1,0x25,0x83, +0xa4,0x92,0xa5,0x87,0xb4,0xb2,0x35,0xa3,0xe4,0xd2,0xb5,0xa7,0xf4,0xf2,0x2d,0x93, +0xa5,0x93,0xad,0x97,0xb5,0xb3,0x3d,0xb3,0xe5,0xd3,0xbd,0xb7,0xf5,0xf3,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0x26,0x8a, +0x2c,0x98,0xa6,0x8e,0x3c,0xb8,0x36,0xaa,0x6c,0xd8,0xb6,0xae,0x7c,0xf8,0x2e,0x9a, +0x2d,0x99,0xae,0x9e,0x3d,0xb9,0x3e,0xba,0x6d,0xd9,0xbe,0xbe,0x7d,0xf9,0x27,0x8b, +0xac,0x9a,0xa7,0x8f,0xbc,0xba,0x37,0xab,0xec,0xda,0xb7,0xaf,0xfc,0xfa,0x2f,0x9b, +0xad,0x9b,0xaf,0x9f,0xbd,0xbb,0x3f,0xbb,0xed,0xdb,0xbf,0xbf,0xfd,0xfb,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0x80,0xd7,0x80,0x00, +0x0c,0x4c,0xf8,0x86,0x19,0x44,0x0a,0x28,0x63,0xd8,0x78,0x97,0xd5,0x27,0x51,0xef, +0xe0,0xce,0xb0,0x44,0x01,0x2e,0x38,0xcb,0x32,0x4d,0x58,0x34,0x21,0x94,0xb6,0x85, +0x84,0xd3,0xb9,0xd5,0x2f,0x2d,0x4f,0xa1,0xc8,0x39,0x39,0x86,0xaf,0x11,0x60,0xea, +0xea,0x06,0xe9,0xd5,0x5f,0xa8,0xe6,0xcf,0xc7,0x63,0xd9,0xb1,0xd1,0xf2,0x6f,0x3f, +0xdb,0xb9,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x08,0x62, +0xfc,0x03,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x0b,0x44, +0xe9,0x09,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0xc1,0x53, +0x22,0x58,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0xa9,0xe0, +0x08,0xf3,0xff,0xee,0x2b,0x0a,0x4b,0xd1,0xc8,0xd3,0x25,0x24,0x5e,0x68,0xe5,0xe2, +0x62,0x99,0x30,0xfc,0xa6,0x69,0x32,0xbc,0x41,0x9b,0x9a,0x04,0x26,0x79,0x03,0x7b, +0x2f,0x1a,0x59,0x0c,0xab,0x08,0x13,0xd4,0xc8,0x91,0x80,0x12,0xc0,0x28,0x24,0xe8, +0xd1,0x0e,0x8b,0xb4,0x16,0x29,0x42,0xbd,0x3c,0x84,0x73,0x9f,0x5c,0x6c,0xf6,0x2a, +0x49,0xf0,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0xb1,0x37, +0x56,0xf2,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0xbe,0x27, +0xc3,0x01,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x2b,0x1d, +0x0b,0xd2,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x78,0xf8,0xfa,0xb6,0xb5,0x26,0xcb,0xa0,0x17,0x5c,0xa9,0xe2,0xd2,0x3e,0xde,0xb0, +0x26,0xe9,0xd5,0x80,0xbc,0x52,0xd8,0xcf,0x05,0x9e,0x37,0xcb,0x33,0x78,0x4f,0x28, +0x82,0x11,0xba,0xdb,0x41,0xee,0xd5,0xa0,0xb6,0x49,0xe1,0x81,0x25,0xcf,0x02,0x1d, +0xda,0x02,0x26,0x30,0x64,0x2d,0x5c,0xcf,0x87,0x9c,0x98,0xa5,0xd2,0x82,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0xd9,0x89, +0x2e,0x38,0xfb,0x7f,0xe0,0xec,0x4f,0x2d,0x8d,0x4a,0xf6,0xec,0x56,0xf5,0x36,0x70, +0x6b,0xd6,0x66,0x16,0x1b,0xef,0x12,0xcf,0x0a,0x26,0x52,0xde,0x3a,0x87,0xad,0x0b, +0xab,0xfc,0xa4,0x7c,0x24,0x7a,0x9d,0xc9,0xf8,0x5c,0xef,0x89,0x7a,0x32,0x55,0x6b, +0x0a,0x1d,0xf0,0xee,0x53,0x93,0x67,0xbb,0x1e,0x5d,0xe7,0x3f,0xfc,0xe2,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x7e,0x1f, +0x54,0x2b,0x17,0x07,0x99,0xac,0x31,0x5d,0xa3,0xc6,0x5f,0xc8,0xd1,0x47,0xd7,0x16, +0x05,0x59,0x4e,0xe7,0xdf,0xe1,0x40,0xb0,0x44,0xb9,0x39,0x31,0x22,0xe5,0x04,0x03, +0xef,0xa6,0xc9,0x19,0x52,0x56,0x79,0xb4,0xa7,0x0d,0x97,0x2a,0x50,0x46,0x96,0xee, +0x95,0xe0,0xf7,0x85,0x91,0x2e,0x63,0x32,0x66,0xb8,0x66,0x27,0x52,0xe4,0x18,0x65, +0xfb,0x8b,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0xbf,0xd0, +0x02,0xfc,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x5e,0xc6, +0x88,0x0c,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x11,0x77, +0xa3,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0xc2,0xbc, +0x8b,0x8f,0xdc,0x90,0xf7,0x5e,0x12,0xd3,0x4c,0x53,0x02,0x9c,0x72,0xad,0xba,0x1e, +0x10,0x0b,0xc9,0xed,0xf9,0x06,0x32,0xbe,0x45,0xd2,0x55,0xcc,0x5b,0xe9,0x8b,0xa9, +0x53,0x65,0xfd,0x94,0x8c,0x05,0x1b,0xd6,0xcc,0x11,0x45,0x8a,0x59,0xed,0xbb,0xf9, +0x21,0xca,0x1d,0xee,0x75,0xfb,0x64,0x39,0xbe,0xcb,0xec,0xe1,0x24,0x95,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x28,0x85, +0x85,0x18,0xd6,0x66,0x70,0x3b,0x7c,0x35,0x07,0x3f,0x8e,0x44,0xf6,0xb8,0xbb,0x62, +0x2d,0x9e,0xae,0xb8,0xc3,0xc4,0x06,0x50,0xe7,0xd9,0xdc,0xf2,0x7a,0xfc,0x27,0x61, +0x26,0xda,0x8e,0x69,0x0b,0xb6,0x4d,0x21,0xe1,0x03,0xa8,0x45,0x58,0xfd,0x4d,0xd7, +0xd1,0x9c,0x5a,0xc8,0x08,0x4f,0xb4,0x51,0x67,0xfb,0xf7,0x49,0x56,0xfe,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0x46,0x4a, +0xe2,0x13,0x0d,0xe0,0xe9,0xb6,0xd2,0xc8,0x2d,0x98,0xfc,0x55,0xdf,0x04,0xa7,0x6a, +0x25,0x96,0x0d,0x96,0xe1,0x89,0x64,0xbb,0xce,0xdf,0xbe,0x3c,0x7c,0x9a,0x59,0x69, +0x2e,0x92,0xcf,0x09,0x40,0xfb,0x4f,0x29,0xe5,0x3e,0x0c,0xf0,0xfa,0xba,0x9b,0xe9, +0x0e,0x56,0x8c,0x93,0x65,0xcb,0x77,0x2c,0x8e,0xc4,0xe5,0xbe,0x5e,0xba,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0x8b,0xcc,0x80,0x00, +0x0c,0x4c,0x04,0x44,0xca,0x26,0x11,0xd4,0x40,0xbd,0xa2,0x62,0xc2,0xdd,0x51,0xef, +0xe0,0xce,0xe8,0x54,0x0c,0xaa,0x41,0xb1,0xa0,0x80,0x1a,0x73,0x7f,0xbd,0xb6,0x85, +0x8c,0x80,0x09,0x39,0x71,0x2d,0xbd,0xa4,0xe1,0xc0,0x3a,0x5f,0x05,0x79,0x60,0xea, +0xea,0x06,0x0d,0xf7,0x13,0x2b,0xe3,0xb9,0xa2,0x41,0x4d,0x6b,0x42,0x5c,0xe8,0xe2, +0x85,0x23,0x00,0x44,0x62,0x68,0x90,0x65,0x52,0x05,0xd0,0x64,0x52,0x64,0x4d,0x4a, +0x17,0xb1,0x60,0xf7,0x6c,0xa5,0xb0,0xc3,0xc6,0x02,0xd8,0x74,0x53,0x65,0xd1,0x5f, +0x92,0xf2,0xb1,0x83,0x38,0x67,0xf2,0x69,0x1e,0x76,0xd1,0x65,0xd2,0x66,0xcc,0x97, +0x69,0x4b,0x09,0x55,0xe3,0x6b,0x99,0x75,0x30,0x0b,0xd9,0x75,0xd3,0x67,0xa9,0xe0, +0x08,0xf3,0x0b,0x7e,0xbb,0x2e,0xc0,0xde,0x7b,0x2a,0xec,0x37,0x8c,0xfc,0xe5,0xe2, +0x62,0x99,0xf2,0x9e,0x18,0x4b,0x40,0xb8,0x2f,0x86,0xfb,0x9c,0x8f,0xd6,0x03,0x7b, +0x2f,0x1a,0xcb,0x9f,0xfb,0xd5,0x29,0x1d,0x2f,0x58,0xcd,0x22,0xdc,0x24,0x24,0xe8, +0xd1,0x0e,0xb3,0xcd,0x76,0x24,0x21,0xd1,0x8f,0x84,0xa5,0x8e,0x90,0xec,0xb2,0x0e, +0xa0,0xf7,0xb2,0x8a,0xb0,0x6d,0x26,0x95,0x6a,0x0e,0xd2,0x6c,0x5a,0x6c,0x70,0xa7, +0x0d,0x0d,0xca,0x5c,0x1b,0x2d,0x9a,0x78,0x3b,0xb8,0xda,0x7c,0x5b,0x6d,0xc7,0xcd, +0x8a,0x9f,0x53,0x4d,0x9a,0x2e,0x53,0x51,0x2b,0xb1,0xd3,0x6d,0xda,0x6e,0x58,0x66, +0x9b,0x4d,0xcb,0x5d,0x9b,0x2f,0x5a,0xfd,0xcb,0xde,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x78,0xf8,0x44,0x80,0x78,0xbd,0xc9,0x80,0x66,0x70,0xe2,0xe2,0xd6,0x3c,0xde,0xb0, +0x26,0xe9,0x77,0x10,0x35,0xf9,0x26,0x52,0x1a,0x55,0x9c,0x8c,0x90,0x8e,0x4f,0x28, +0x82,0x11,0x78,0x7e,0x43,0xcd,0xe3,0x23,0xe1,0x2a,0xe1,0x58,0xce,0x30,0x02,0x1d, +0x92,0xd1,0xb7,0x6a,0x46,0x71,0x66,0x4e,0x96,0x5f,0x5d,0xb5,0x81,0x86,0x7f,0x86, +0x80,0x5a,0xc4,0xc4,0x32,0x34,0x24,0xc6,0x80,0x12,0xd4,0xe4,0x72,0x74,0xeb,0xd9, +0xf3,0x45,0xcc,0xd4,0x33,0x35,0x5c,0x86,0x47,0x1b,0xdc,0xf4,0x73,0x75,0x31,0xe5, +0x76,0x06,0xc5,0xc5,0xb2,0x36,0x55,0xa7,0x40,0x57,0xd5,0xe5,0xf2,0x76,0x6a,0xdc, +0x24,0xb0,0xcd,0xd5,0xb3,0x37,0x2b,0xb7,0x45,0x15,0xdd,0xf5,0xf3,0x77,0xdc,0x84, +0x1b,0xda,0x06,0x9e,0x3e,0x78,0xd6,0xa9,0x33,0x43,0x97,0x28,0x78,0xe9,0x6e,0xd8, +0x27,0x14,0x4e,0x9c,0x43,0x3d,0xa1,0x4e,0xeb,0x51,0x8d,0x41,0x69,0x37,0xc5,0xff, +0x8b,0x45,0x2a,0x09,0xbc,0xb7,0x55,0xd7,0x0f,0x4a,0x20,0xa4,0xfe,0x7a,0x05,0x91, +0x0a,0x16,0xe3,0x5a,0xbb,0xce,0x92,0x49,0xe1,0x54,0xef,0xfb,0x5b,0x85,0xee,0x6e, +0x2c,0x5c,0xc6,0xcc,0x3a,0x3c,0xd6,0x12,0xef,0x7b,0xd6,0xec,0x7a,0x7c,0xce,0x5c, +0x2b,0x8c,0xce,0xdc,0x3b,0x3d,0x4d,0xbe,0xc9,0x13,0xde,0xfc,0x7b,0x7d,0x3c,0x8f, +0x00,0xe5,0xc7,0xcd,0xba,0x3e,0x88,0x89,0xec,0x5e,0xd7,0xed,0xfa,0x7e,0x75,0x26, +0xad,0x1f,0xcf,0xdd,0xbb,0x3f,0x2b,0x7d,0xef,0x58,0xdf,0xfd,0xfb,0x7f,0x7e,0x1f, +0x54,0x2b,0x98,0xd6,0xe9,0xaf,0x50,0x66,0x38,0x4b,0xe8,0x32,0x37,0x7c,0xd7,0x16, +0x05,0x59,0xac,0xf4,0x97,0xa9,0xab,0xd0,0xc7,0xc9,0x09,0x88,0xe9,0x16,0x04,0x03, +0xef,0xa6,0xc1,0x47,0x7a,0x29,0x35,0xc1,0x46,0x8a,0x48,0xc8,0x54,0x62,0x96,0xee, +0x95,0xe0,0x5c,0xf5,0x95,0x08,0xb4,0xd1,0x47,0xcb,0x16,0x58,0x08,0x3f,0x60,0x7a, +0xfa,0xb4,0xe0,0x46,0x16,0xa4,0xc7,0x6b,0x40,0xc4,0xf0,0x66,0x56,0xe4,0xed,0x54, +0xcf,0xd5,0xe8,0x56,0x17,0xa5,0x0c,0xf6,0x43,0xc2,0xf8,0x76,0x57,0xe5,0xa1,0x43, +0xf6,0x22,0xe1,0x47,0x96,0xa6,0x62,0x25,0x64,0x88,0xf1,0x67,0xd6,0xe6,0xcd,0xae, +0x07,0x5c,0xe9,0x57,0x97,0xa7,0xb9,0x76,0xd7,0x86,0xf9,0x77,0xd7,0xe7,0xc2,0xbc, +0x8b,0x8f,0x04,0x0f,0x1c,0xa1,0xbb,0xc8,0x7f,0x8a,0x0b,0x70,0xdf,0xe6,0xba,0x1e, +0x10,0x0b,0x2a,0xe4,0xfc,0xd6,0xc5,0xd2,0x4f,0x04,0xbb,0x21,0x45,0x7d,0x8b,0xa9, +0x53,0x65,0xde,0xef,0x73,0xe8,0x89,0xd5,0xdc,0x07,0x53,0x10,0xf8,0x3e,0xbb,0xf9, +0x21,0xca,0xd4,0xe5,0x62,0x74,0x40,0x33,0x28,0x74,0x3a,0x24,0xc1,0xa5,0x63,0x8c, +0xac,0xc9,0xe2,0x4e,0x1e,0xac,0xda,0xc9,0x31,0x6c,0xf2,0x6e,0x5e,0xec,0x81,0xad, +0x09,0x8d,0xea,0x5e,0x1f,0xad,0xfc,0xbc,0xed,0x81,0xfa,0x7e,0x5f,0xed,0x11,0xee, +0x0b,0x89,0xe3,0x4f,0x9e,0xae,0xb3,0x6b,0xbe,0x35,0xf3,0x6f,0xde,0xee,0x3c,0x84, +0x2c,0xf1,0xeb,0x5f,0x9f,0xaf,0x0b,0xa4,0x78,0x81,0xfb,0x7f,0xdf,0xef,0x2e,0x02, +0x87,0x96,0xa0,0xc1,0xb5,0xbe,0x6b,0xa0,0x17,0xd0,0x4d,0xe0,0x9e,0x54,0xea,0x64, +0x16,0x93,0xf2,0x05,0x31,0x1a,0xfc,0xb3,0x3e,0xca,0x18,0x4a,0xf5,0x0a,0x6d,0x11, +0x05,0x89,0x06,0x11,0x68,0x54,0xea,0xa3,0x93,0xde,0x30,0xa1,0x3c,0xa2,0xf7,0xf1, +0xb5,0x58,0xcf,0x93,0x54,0x1c,0x7b,0xcc,0x81,0x1c,0xbf,0x71,0x57,0xb6,0x77,0xfd, +0x32,0xd6,0xe4,0xc6,0x36,0xb4,0xb4,0xe7,0x76,0x95,0xf4,0xe6,0x76,0xf4,0xac,0xd2, +0x57,0x31,0xec,0xd6,0x37,0xb5,0xbc,0xf2,0x17,0x2e,0xfc,0xf6,0x77,0xf5,0x65,0xfb, +0x5a,0xe6,0xe5,0xc7,0xb6,0xb6,0xdd,0x40,0x99,0x76,0xf5,0xe7,0xf6,0xf6,0x68,0xd5, +0x6f,0x87,0xed,0xd7,0xb7,0xb7,0x7c,0x35,0x45,0x92,0xfd,0xf7,0xf7,0xf7,0x26,0x62, +0x62,0x55,0x45,0x7d,0xe2,0x13,0x77,0xd4,0x0a,0x17,0xc4,0x0b,0xd8,0x1f,0x16,0x8a, +0x4a,0x9c,0xd0,0xa8,0xd6,0x5c,0x26,0xb3,0x5e,0x1b,0xc4,0x3a,0x7d,0x4a,0xd8,0x63, +0xaa,0x99,0xc0,0x87,0x57,0x2c,0x36,0xdd,0xfe,0x12,0x63,0xe9,0x5e,0x04,0x0f,0x9f, +0xca,0x92,0xf1,0xac,0xa9,0x14,0x85,0xaf,0x60,0x5d,0x54,0xc4,0x62,0xc6,0xc2,0xa8, +0x82,0x63,0xe6,0xce,0x3e,0xbc,0x04,0x4f,0xeb,0xdb,0xf6,0xee,0x7e,0xfc,0x17,0x9c, +0x8d,0xd3,0xee,0xde,0x3f,0xbd,0x96,0x59,0x90,0x9c,0xfe,0xfe,0x7f,0xfd,0xa7,0xcb, +0xde,0xe0,0xe7,0xcf,0xbe,0xbe,0x98,0x1c,0x6b,0xd9,0xf7,0xef,0xfe,0xfe,0x1b,0x5f, +0xab,0x98,0xef,0xdf,0xbf,0xbf,0xd7,0x58,0x90,0x1f,0xff,0xff,0x57,0x3d,0x26,0x59, +0x70,0xa4,0xe1,0x62,0xef,0x8d,0x18,0x24,0x68,0x5e,0x8d,0xad,0xbb,0x04,0x1d,0xe0, +0x1a,0xa0,0x08,0x35,0xd2,0x8c,0xd8,0x58,0x46,0x4c,0xe0,0xc5,0xf2,0x21,0x8a,0x38, +0x61,0xad,0x10,0x42,0x4e,0x28,0x4b,0xae,0xa8,0x73,0x2a,0xc7,0x7c,0x9f,0x1c,0x95, +0xb0,0x50,0x1c,0xc5,0xcd,0x2a,0x41,0x35,0xe9,0xcd,0xa7,0x1c,0x31,0xe2,0x78,0xb3, +0x3e,0xa9,0xf8,0xbb,0xf0,0xdb,0x2a,0x80,0x50,0xf1,0x43,0x40,0x8e,0xd5,0x51,0x05, +0xa2,0x8a,0xdd,0xd0,0x22,0xcd,0xc2,0xfa,0xaa,0x46,0x4f,0x9e,0xf6,0xef,0x11,0x70, +0xba,0x44,0x85,0x36,0xb0,0x87,0xc0,0x5e,0xfa,0x04,0x39,0xd0,0xb1,0xef,0x51,0x55, +0x8a,0xf1,0xf7,0x7c,0x95,0x3e,0x4f,0x58,0xc5,0x5e,0xa1,0xb2,0x11,0x65,0x3a,0x68, +0x53,0x83,0x06,0xc9,0x24,0x27,0x48,0x07,0x20,0x79,0x2c,0xa8,0x69,0x88,0x13,0x89, +0xa8,0x02,0x15,0x33,0xc0,0x14,0x67,0xca,0x6a,0x09,0xa4,0x10,0x5f,0x50,0xd8,0x38, +0xb0,0x48,0x2c,0x66,0x45,0x68,0xd3,0x41,0x82,0x47,0x68,0x0a,0x79,0x95,0xc7,0xe9, +0xe8,0xaa,0xa4,0x22,0xa1,0x69,0x0f,0x81,0xaa,0xc2,0x8d,0xce,0x55,0xb6,0x7c,0x61, +0x4a,0xa3,0x4a,0x3f,0x22,0x23,0xdc,0x98,0x42,0x0e,0xda,0x68,0xf2,0x1e,0x2c,0x98, +0x0a,0x4d,0x46,0x23,0xb8,0x8d,0x22,0x7a,0x0b,0xed,0x19,0x8c,0x53,0xb6,0xd2,0x3a, +0xbe,0x62,0xe3,0x5c,0x9c,0x37,0x4a,0x2d,0xa9,0x6e,0x64,0x54,0xdc,0xb7,0x47,0xc6, +0x62,0x5e,0x5a,0x1c,0x3d,0x8f,0xca,0x38,0x81,0xef,0xdb,0x57,0xa3,0x7f,0xbc,0xc4, +0x1c,0x14,0x44,0xec,0x7a,0x3d,0xd4,0xc8,0x06,0x5d,0x6f,0xdb,0x25,0x8f,0x36,0x6f, +0xa1,0x73,0xe6,0xe7,0x09,0x73,0x09,0x34,0x50,0xf3,0x64,0xb6,0x69,0xd1,0xc4,0x70, +0x9c,0x32,0xff,0xe5,0xb4,0x13,0x4d,0x10,0x83,0x89,0xfd,0xc7,0x43,0x8f,0x33,0xbc, +0xe2,0x1c,0x94,0x6f,0x46,0x56,0x25,0x21,0x42,0xd8,0x0c,0xc6,0xc5,0x1f,0xe8,0x33, +0xae,0x19,0xdc,0xf9,0xdb,0x05,0x94,0x85,0x05,0x4f,0xaa,0xd8,0x9b,0x17,0x55,0x1c, +0xdc,0x9e,0x5d,0x93,0xf9,0xbf,0x18,0xb7,0xe1,0x81,0x70,0x6b,0x72,0x35,0x5a,0xa1, +0xac,0x54,0xc7,0x36,0x86,0x9b,0x61,0x87,0x00,0x76,0x97,0x1a,0x1b,0xa7,0x8b,0xe0, +0xd3,0xb8,0x85,0xf0,0xb5,0x2e,0xa8,0x93,0x29,0x86,0xf9,0x5f,0x1a,0xa6,0x1e,0x91, +0xc9,0xb7,0xbe,0x4b,0xf2,0x89,0xcd,0x99,0x5c,0x1a,0xf4,0xb1,0x79,0x6c,0x18,0xb1, +0x2f,0x00,0x53,0xee,0xd2,0x68,0x66,0x83,0x51,0xac,0x0e,0x4d,0x05,0x2c,0x92,0x76, +0xcb,0x20,0x3c,0x1e,0xc8,0x32,0x0e,0x38,0x49,0xda,0x91,0x84,0xf0,0x01,0xde,0xeb, +0x0a,0x90,0x4f,0xf5,0xdf,0x36,0x8e,0x3d,0x9c,0xb2,0xc1,0x1d,0x59,0x00,0xe6,0xba, +0x48,0x70,0x4a,0xae,0xc5,0x91,0x36,0xf6,0xdc,0x51,0xd4,0x1f,0x06,0xd1,0x16,0x45, +0x2d,0x04,0xd7,0x89,0x9a,0xc4,0x7e,0xe5,0xe6,0x5b,0xd6,0xf8,0xf3,0xfa,0x39,0xce, +0x0b,0xe7,0x97,0xfc,0x82,0x7c,0x31,0xd0,0xeb,0xbc,0x40,0xaa,0x30,0x1d,0x86,0x26, +0xad,0xc5,0x97,0xc0,0x52,0x6e,0xfc,0xe6,0x4a,0xf9,0x85,0x9d,0x93,0xae,0x35,0xe8, +0xa1,0x2f,0xbf,0x6e,0x77,0xd6,0x25,0xc8,0xe1,0x6f,0xc8,0x01,0xa9,0xef,0x3d,0x96, +0x34,0x37,0x60,0x74,0xea,0x2a,0xc7,0x59,0xc8,0x37,0x78,0x5e,0xdc,0x1e,0xb4,0xf3, +0xd1,0x23,0xb7,0x2e,0x92,0xbb,0xa4,0xcb,0x56,0x8f,0xeb,0x36,0xbc,0xd3,0x11,0xec, +0x6c,0xf2,0xe4,0x3e,0x93,0xba,0x31,0xea,0x2c,0xb2,0xe3,0x11,0xbd,0xb2,0x76,0x20, +0x6e,0x89,0xf5,0x07,0xf2,0x29,0x65,0x43,0xe1,0x49,0xd0,0x77,0xdb,0x87,0xe4,0x30, +0xe4,0x8e,0x44,0xc5,0x54,0xaf,0xd4,0xe1,0x04,0xcf,0x85,0x89,0xa2,0xfe,0x1f,0x7b, +0x80,0x9f,0x9f,0x6e,0x7f,0x97,0x0f,0x4a,0x2f,0xf7,0x5a,0xc2,0x03,0xf8,0xf2,0xd7, +0xaa,0x4c,0xe0,0xa7,0x09,0x06,0xa3,0x00,0xff,0x47,0xd9,0xa3,0x3c,0xc4,0x7a,0x86, +0x8b,0x49,0x73,0x71,0xbf,0x23,0x78,0xc8,0x6f,0x22,0xcb,0x51,0xfb,0x63,0xa0,0x7a, +0x01,0x74,0x3f,0xf8,0x35,0x27,0x82,0xc5,0xa4,0x98,0x83,0x7c,0xfc,0xa4,0x7a,0x08, +0x69,0x98,0xb9,0x26,0x2f,0x07,0x4d,0x07,0xff,0xdc,0xa9,0x1e,0xe8,0xf5,0x33,0x0e, +0xbe,0xdd,0xf1,0x30,0xf5,0x9a,0x97,0xa4,0xce,0x38,0x44,0xd7,0x88,0xa6,0x38,0xde, +0x66,0xfd,0xf7,0xca,0x2f,0xe6,0x0c,0x46,0xa7,0x9d,0x4d,0x66,0x19,0x43,0x30,0xcf, +0x67,0xfc,0xba,0x6f,0x27,0xef,0xe0,0xfe,0x7e,0xa5,0xed,0xfa,0x6e,0x4f,0xa3,0x23, +0xd9,0x31,0xdb,0x2f,0xa8,0x03,0xdf,0xf8,0x8d,0xc4,0x23,0x9f,0xa9,0x4f,0x15,0x5d, +0x6e,0x0c,0xf2,0x0a,0x3e,0x20,0x43,0x89,0xec,0xb5,0xc3,0x8c,0xf1,0x62,0x3e,0xb3, +0x1c,0x8f,0xfc,0xef,0x32,0xa9,0xf4,0xca,0x3e,0x2d,0x33,0x5f,0x8b,0x05,0xa7,0xa3, +0x1d,0xd3,0x77,0xa7,0x01,0xf3,0xfc,0xda,0x53,0x5c,0x77,0x55,0x57,0x70,0x1b,0xae, +0x03,0x19,0xe2,0xf8,0x17,0x39,0x4d,0x53,0xff,0xe3,0xe5,0x99,0x88,0xb0,0x34,0x08, +0x58,0x9c,0xb4,0x06,0xd6,0x93,0x45,0xa2,0xea,0x58,0x3d,0xf6,0x59,0x7e,0xd8,0x7d, +0x22,0x36,0xf2,0xa4,0x5e,0xb9,0xe7,0x60,0xb2,0x00,0x34,0x8e,0x3c,0xf9,0x54,0x41, +0x53,0x93,0x5b,0xff,0x31,0x7c,0xfe,0x02,0x98,0x7a,0x6b,0x72,0x46,0x57,0xc9,0x41, +0x72,0x02,0x9b,0xff,0x4e,0xe7,0x4d,0x70,0x9e,0xde,0x0a,0x17,0xd7,0x57,0xce,0xdc, +0x06,0x31,0x8c,0xc6,0x83,0xb3,0x6a,0x00,0x93,0x7a,0xc5,0x0c,0xf1,0x6e,0x20,0xa3, +0xc5,0xa9,0xde,0x7f,0x9f,0xf8,0x83,0x9b,0x54,0x9a,0xc8,0x87,0x95,0xc9,0x14,0x69, +0x15,0x34,0xac,0x60,0x91,0xb4,0x46,0xb8,0x2d,0x79,0x3e,0xdf,0x16,0x54,0x3d,0x96, +0x8f,0xbc,0x99,0xa6,0xba,0xa3,0x2e,0x3a,0x8f,0x25,0x1b,0x3c,0xff,0xf2,0x3a,0xdc, +0x67,0x91,0x50,0xec,0x89,0xf9,0xae,0xba,0x0b,0xc0,0xaa,0x8e,0x5c,0x5a,0x71,0x8a, +0x6a,0x17,0x0c,0xdf,0x06,0xb8,0xe5,0x18,0x4d,0xbc,0x93,0xa1,0x83,0x80,0xfd,0xa9, +0x5b,0x12,0x59,0xf7,0x39,0x24,0xee,0x89,0x4d,0x7c,0xe9,0xcf,0xde,0x5c,0x98,0x38, +0xd6,0x31,0x93,0xeb,0x46,0xef,0x49,0xd2,0x0d,0xd5,0x5e,0x91,0x6b,0x53,0x37,0xde, +0x46,0x2e,0x8a,0xc1,0xc7,0x4b,0x6a,0x7f,0xde,0x37,0xc7,0x0c,0xdd,0xbd,0x19,0xf3, +0xc2,0xa0,0x13,0x06,0x9b,0xd5,0xc4,0xde,0xcf,0x3d,0x98,0x20,0xd7,0x21,0x74,0x82, +0x49,0x09,0xd2,0x15,0x66,0x21,0x19,0x43,0x67,0xe9,0xe0,0x47,0x21,0xe7,0x49,0x14, +0x86,0x1b,0xd1,0x81,0x8b,0x77,0xf6,0x4f,0x16,0x4a,0x7d,0x56,0xa8,0xe4,0x8a,0xd6, +0xb2,0xbb,0xb8,0x2c,0x81,0x27,0x4d,0xd1,0xc5,0x66,0x99,0xf5,0xc1,0x9e,0x7e,0x5f, +0x76,0xa9,0x82,0xbb,0xfb,0xd5,0x2e,0x4c,0x01,0x4b,0xd6,0x59,0xdb,0xbb,0x76,0x6c, +0x8c,0x83,0x92,0x7b,0x7b,0xd4,0x4e,0x59,0x45,0x7c,0x03,0x49,0x55,0x7c,0xd6,0x61, +0x2f,0x36,0x6d,0xda,0x91,0xbd,0x09,0x6d,0xa1,0xdb,0x41,0x7a,0xe6,0xed,0x5b,0x11, +0xdd,0x03,0x09,0x3d,0xd9,0x2a,0x1d,0x81,0xcb,0x48,0x9f,0x17,0x38,0x16,0xba,0x87, +0x1a,0x45,0x84,0x4b,0x36,0xf4,0xd7,0x53,0x9d,0xd5,0xf0,0xce,0xad,0xee,0xdc,0x1a, +0x59,0x67,0x4a,0x75,0x33,0x68,0xce,0x66,0x67,0x95,0x39,0x83,0x3a,0x49,0xe2,0x49, +0x8a,0x46,0x57,0x53,0x0b,0x15,0xb8,0xc1,0xcc,0x26,0x93,0x6d,0x9c,0x6c,0x52,0xdd, +0x2c,0x7d,0x56,0x00,0xe2,0xf0,0x72,0xd2,0x36,0x25,0xe3,0x4e,0xed,0xe1,0xc4,0x3b, +0x7e,0x62,0xdc,0x75,0x39,0xb5,0x54,0x41,0xa3,0x7d,0x12,0x10,0x0c,0xe1,0x10,0xa4, +0x63,0x7c,0x9a,0x2f,0x39,0x41,0x3a,0x66,0xf6,0x40,0x4f,0xbc,0x73,0xe6,0x21,0xcb, +0x8b,0xcc,0xfd,0x70,0xda,0x81,0x21,0x74,0x49,0x0f,0x28,0x13,0x57,0xc8,0x8b,0x31, +0xc1,0x02,0xad,0x9d,0x98,0x26,0x19,0x9b,0xa8,0x39,0xc3,0x41,0xdd,0x76,0x20,0xe7, +0xd7,0x20,0xdc,0x80,0xb9,0x39,0x40,0x52,0x53,0x54,0x90,0xc4,0x4d,0x1e,0xd8,0xce, +0x0f,0xcd,0xf5,0xf2,0xda,0x60,0xd3,0x46,0x45,0x57,0xa2,0x8c,0xb3,0x41,0xb9,0x69, +0xa4,0x7e,0xdf,0xf5,0xd8,0x43,0xdf,0x57,0xf0,0x9f,0xab,0x9c,0x32,0x7b,0x64,0x7a, +0x5e,0x88,0x4d,0xfd,0x2b,0x3e,0xab,0xd1,0x40,0xfc,0x95,0xb1,0x71,0x6b,0xd1,0xff, +0x1a,0x56,0x53,0x40,0x57,0x22,0xab,0x9b,0x0a,0x59,0xad,0x82,0x31,0x7b,0x72,0xed, +0x03,0xf8,0x0c,0xbc,0x79,0xbe,0x5e,0x00,0x25,0xe4,0xce,0x16,0x06,0x7e,0xd8,0x02, +0xa1,0xe6,0x9f,0xea,0xda,0x35,0x43,0x83,0x19,0x8d,0x2e,0x0d,0xa7,0x3b,0x4b,0x94, +0xdf,0x13,0x32,0x37,0x4f,0xc6,0x9d,0x99,0xb4,0xc8,0x4a,0x71,0xc2,0x77,0x06,0x71, +0x24,0x5a,0xf8,0xb1,0xc0,0x49,0x46,0x59,0x1c,0x78,0x3a,0xd3,0xba,0x7d,0xe9,0xf6, +0xff,0x11,0x03,0x82,0x49,0xcd,0xca,0x78,0x59,0xd2,0x9d,0xcf,0x01,0xff,0x03,0x4e, +0x27,0x67,0x30,0xa4,0xbe,0xa3,0x29,0x95,0x65,0xfc,0x2c,0x3f,0xf8,0x70,0xc3,0xea, +0x8f,0xb3,0x98,0xda,0x50,0x8a,0x07,0x88,0x9d,0x19,0xb7,0xce,0x89,0xfd,0x66,0xc0, +0x27,0xed,0x06,0x05,0x8e,0x91,0x0c,0x7c,0x16,0x1e,0xad,0xcb,0xdb,0xc3,0xd9,0x25, +0x2d,0x04,0x4c,0xaf,0x19,0x94,0x56,0xe8,0x54,0x7d,0x9b,0x78,0x4a,0x5a,0x46,0xcb, +0xa6,0x74,0x50,0xbc,0xce,0x37,0x4e,0x35,0x65,0xc8,0xe9,0xc1,0xfc,0x47,0x2a,0xaa, +0xd7,0x10,0x5c,0x3d,0xb5,0xb4,0x7f,0xfd,0xd4,0x5f,0x1f,0x95,0x41,0x3d,0x61,0x64, +0x92,0x88,0xfb,0x31,0x6b,0x22,0x8d,0xbd,0xf1,0x16,0xc8,0xdd,0x75,0x02,0xfc,0x62, +0x01,0x8a,0xd5,0x64,0xfe,0x90,0x80,0xcd,0xac,0xcb,0x80,0xcc,0xac,0x8d,0xa1,0x45, +0xea,0x2f,0x7a,0x2d,0x92,0x98,0x39,0x2f,0xf7,0xe7,0xe8,0x7b,0x71,0x63,0x20,0x2c, +0xa7,0xc1,0x97,0x3e,0x18,0x05,0xd5,0xac,0xc6,0xba,0xda,0x77,0x85,0x1e,0x22,0xa0, +0x65,0xf1,0xba,0x69,0x7e,0xa7,0x67,0xe6,0x77,0x8e,0xb6,0x04,0xad,0x1d,0x2e,0xa2, +0xf8,0x8a,0xf6,0x6f,0x34,0xaf,0xf7,0x10,0xca,0x13,0xef,0xf2,0x66,0x47,0x77,0x6a, +0x80,0x9f,0x21,0x2f,0xdc,0xab,0x49,0x9d,0xc0,0xdf,0xe9,0xe2,0xb5,0x93,0x49,0xf7, +0x6e,0x76,0xde,0xf7,0x6b,0x56,0x31,0x62,0xc1,0xde,0xa3,0x88,0x74,0x6c,0xbd,0x41, +0xf1,0xe4,0xea,0x4e,0x18,0x84,0x34,0x17,0x65,0xa6,0xd0,0xb6,0xa9,0x6e,0xea,0x72, +0xa6,0x0f,0xbf,0x9a,0x2c,0x0b,0x6a,0x8f,0x4f,0x64,0xba,0xc3,0x0f,0xef,0x41,0x1b, +0x8d,0x1b,0xb9,0xff,0x20,0x0b,0x35,0x17,0xe5,0x86,0xb3,0xef,0x9c,0x31,0x29,0x5b, +0xe5,0xb0,0x93,0xec,0xa1,0x24,0xeb,0xc9,0x32,0x66,0x18,0x71,0x7c,0x62,0x72,0x2d, +0x76,0x01,0x22,0x36,0x84,0xc2,0xfd,0x14,0xed,0x47,0x29,0x5f,0x6a,0xae,0x7f,0xde, +0x32,0xa3,0xab,0x38,0xc9,0xa5,0xb2,0x08,0xec,0x30,0x82,0x62,0xdf,0xd3,0x9e,0x70, +0xb2,0x7b,0xba,0x49,0x3b,0x58,0x96,0x52,0xc8,0xd7,0xea,0xfe,0x7f,0x6c,0x63,0x57, +0x93,0x3a,0x3c,0x64,0xbd,0x5a,0x6d,0x19,0xa7,0xc2,0xa1,0x0f,0xb7,0xbe,0x70,0x62, +0x7d,0xd1,0xc6,0xc6,0xdd,0x21,0x2d,0x33,0xc5,0x7f,0x30,0xe6,0x70,0xf4,0xc9,0x1a, +0x80,0xc7,0x80,0xaa,0xc9,0xc0,0xfc,0xc6,0xf7,0x5a,0x5b,0xc5,0x05,0x27,0x89,0x6b, +0x20,0xdf,0xc7,0x87,0xb7,0xf2,0xa2,0x58,0x18,0xd1,0x61,0x60,0x1d,0x43,0x65,0xd7, +0x4c,0xd0,0x6d,0xeb,0x44,0xdd,0x88,0x82,0x99,0x91,0xb5,0xaf,0x2c,0x0e,0x62,0xeb, +0x8e,0x05,0xe0,0x3a,0x36,0xa1,0xcf,0x32,0x6e,0xad,0xed,0xf3,0x85,0x91,0x2e,0xe3, +0x1f,0xd7,0x40,0x73,0xe2,0xd6,0xeb,0x01,0xe3,0x58,0x3c,0x9f,0x1f,0xb7,0x5f,0x30, +0x9e,0x1d,0xf2,0xcf,0x36,0x16,0x6d,0xfb,0x85,0x14,0xcd,0x1c,0x1f,0xa7,0x74,0x90, +0x86,0x96,0x46,0x1d,0x0c,0xf5,0x2f,0xb4,0x0c,0xb3,0xe4,0x54,0x94,0x57,0x28,0x2b, +0x0f,0x0b,0x98,0xb7,0xfe,0xb2,0x2f,0x3b,0x0f,0x27,0x99,0xf4,0x89,0x64,0x55,0x92, +0x88,0x26,0xe6,0x96,0xc0,0x3f,0x29,0x3e,0x5c,0x7b,0x9e,0xae,0x85,0x48,0xb7,0x63, +0x24,0xd7,0x99,0xb7,0x7e,0xba,0x4f,0x5b,0x9b,0x7b,0x00,0x96,0x08,0x6b,0x39,0xf9, +0x52,0x06,0xe7,0xe1,0x7f,0xbb,0x07,0x2b,0x4e,0x7b,0x8c,0x87,0xfb,0x02,0x3c,0x36, +0x46,0xad,0xfb,0x6f,0x5d,0x67,0x4d,0x08,0x32,0x6c,0x61,0x6a,0x4f,0xd0,0x36,0x4e, +0x4c,0x14,0xa8,0xbc,0x7d,0xb2,0x69,0xe1,0x1b,0x50,0x6f,0x14,0x82,0xb2,0xa7,0xa3, +0xe4,0x93,0xf1,0xf6,0xb8,0xa7,0x9c,0x2c,0xca,0x2a,0x08,0x1f,0x5a,0x5f,0x79,0xf2, +0x1c,0xd2,0xe9,0x7f,0x3f,0x89,0x01,0xc6,0x06,0xd5,0x6f,0xff,0xff,0xff,0xbf,0xf1, +0xa3,0x40,0xfe,0x02,0xf1,0xa3,0xf7,0x5e,0x21,0x44,0xd6,0x46,0x73,0xb1,0xa8,0x63, +0xa2,0x82,0x18,0xe7,0x95,0xac,0x88,0xc3,0xc5,0xcc,0x58,0x58,0xef,0x0d,0x33,0x31, +0x19,0xad,0x29,0xf6,0x1c,0x2f,0x68,0xd1,0x40,0x54,0xa6,0x19,0x2c,0x93,0xbf,0xe2, +0x0d,0x0e,0xdb,0x53,0x7a,0x47,0x4b,0x72,0x2a,0x27,0x26,0xa6,0xb3,0xbe,0x3b,0x87, +0xfb,0xf2,0x3f,0xb4,0x64,0x85,0xb1,0x20,0x1e,0xcf,0x94,0x06,0x71,0x86,0x6e,0xf0, +0x3d,0x70,0xf0,0xac,0x13,0xd4,0x1e,0x80,0xbc,0x4a,0x18,0x18,0xed,0x09,0x7a,0xdf, +0x83,0xb6,0x90,0xc1,0xab,0x16,0xe4,0x5c,0xc4,0x5f,0xe6,0x49,0x2e,0x57,0x1d,0x6a, +0xe1,0x92,0x36,0x2f,0xe5,0xf8,0x99,0x19,0xc9,0x4a,0x66,0xe6,0xab,0xba,0x92,0xf8, +0x7f,0xa9,0x12,0xff,0x9c,0xa5,0x82,0xdb,0xcc,0xc5,0xf4,0x89,0x5b,0x88,0x58,0x2f, +0xe2,0x6d,0x1a,0xed,0xba,0xe9,0x8a,0xc8,0x1c,0xe8,0xbc,0x00,0x73,0xdc,0x16,0xfa, +0x0c,0x87,0xd1,0x13,0x73,0x4e,0x41,0x6a,0x23,0x2e,0x30,0x88,0x04,0xe9,0x9b,0x22, +0xbd,0xfe,0xb9,0x2d,0xb2,0x84,0x8e,0xca,0x4d,0xc6,0x08,0x02,0xfb,0x29,0x96,0x77, +0x76,0x08,0x98,0x26,0x72,0x3f,0x10,0x8a,0x16,0x48,0xb4,0x54,0x59,0x8c,0xff,0xfc, +0xf3,0xce,0x57,0xf1,0xc2,0xd0,0x62,0xbf,0x89,0x6d,0xfc,0x50,0x67,0xcd,0xc6,0x5a, +0xf6,0x7d,0x03,0x25,0x10,0x6c,0x7f,0xed,0xfb,0x6c,0x70,0x55,0x06,0xdf,0x78,0xe8, +0x77,0x0c,0xe4,0x07,0x6e,0xb3,0x53,0x68,0x37,0x7e,0x4a,0x0e,0xef,0x03,0xa0,0xa4, +0x83,0xbd,0x96,0xf3,0x14,0x9f,0x84,0x53,0xe4,0xdd,0xaa,0x01,0x93,0x79,0xac,0xe2, +0x4b,0xe0,0x3a,0xb0,0xed,0x80,0x24,0x94,0x8a,0x35,0xfe,0x94,0x98,0x12,0x55,0xb0, +0x94,0xbd,0x25,0xf6,0x13,0xb1,0x47,0x8b,0x0b,0x36,0x8c,0x62,0x19,0xf1,0x73,0x96, +0x85,0x98,0x4d,0xe9,0xe7,0x35,0x43,0x53,0xe5,0xfe,0xff,0xb4,0xf2,0xc9,0xd5,0x44, +0x13,0xfd,0x10,0x3e,0x34,0x8e,0x4d,0xe0,0x95,0x31,0x14,0x8d,0x7f,0xdb,0xd9,0xf7, +0x82,0xba,0x93,0x2b,0x4c,0x40,0xf0,0x75,0xb6,0x37,0x68,0x87,0x0b,0x7a,0x85,0xa9, +0xee,0xb9,0x8e,0xe1,0x8d,0xc6,0x6d,0x09,0xae,0x8a,0x71,0x96,0x82,0x79,0x5e,0xea, +0x97,0xe2,0x16,0xe2,0xb5,0xed,0x34,0x1a,0x1c,0xdc,0xdb,0xdc,0xda,0xfd,0xe3,0xb5, +0xc3,0x5c,0x30,0xec,0x99,0x97,0x85,0x2c,0x28,0xe4,0xa8,0x18,0xba,0x79,0xaa,0xbc, +0x4a,0xdb,0xde,0x6c,0xc6,0x96,0x61,0xc7,0x01,0x54,0xd6,0x79,0x90,0x7a,0x3d,0x39, +0x2d,0xb5,0x10,0xaa,0x19,0x95,0x2f,0x53,0x44,0x57,0xa9,0x1c,0x3a,0x5a,0x19,0xa1, +0x42,0x5f,0x5b,0x6e,0xdb,0x94,0x8f,0x49,0x95,0xaa,0x5f,0xd5,0x4c,0x39,0x53,0x4c, +0x4f,0xf3,0xba,0xbe,0xd1,0x0d,0xc1,0xd9,0x58,0x1e,0x46,0x83,0x59,0x1d,0x28,0x18, +0x28,0x2e,0x86,0x1c,0x50,0xb6,0x5e,0xc5,0x94,0xc0,0x6a,0x9e,0x48,0x9d,0x7d,0x36, +0x57,0x72,0xf9,0xe4,0x37,0x98,0x4e,0x8b,0x4b,0xc5,0x17,0x85,0xfa,0xa1,0x15,0xf6, +0xd7,0x5d,0x2a,0xec,0x83,0x7d,0x8c,0x07,0x88,0x03,0x74,0xba,0xf5,0xa3,0x35,0x86, +0x7d,0x99,0x00,0x74,0x76,0xcc,0x62,0x64,0xaf,0xa4,0x29,0x89,0xd9,0x1d,0x9d,0xe2, +0x9b,0x20,0x9a,0x26,0x88,0x0e,0x40,0x00,0x3d,0x3e,0xee,0xf6,0x19,0x35,0x96,0x2f, +0x82,0x7b,0x31,0xf6,0x37,0x62,0xa1,0x19,0x67,0x6d,0xd7,0x93,0x21,0x44,0x3c,0xe0, +0x01,0x0e,0x09,0x65,0xf7,0xcf,0x07,0xd1,0xb7,0x1c,0xef,0x28,0xb3,0x47,0xa0,0x3b, +0x02,0x0f,0x20,0x47,0x9f,0xf8,0xb0,0x07,0xc2,0x86,0x92,0x7b,0x57,0x78,0x71,0xc3, +0x64,0xa5,0x45,0x6c,0x2d,0x10,0xf8,0x63,0xbb,0xf4,0x6e,0x86,0xeb,0x44,0xba,0x72, +0xfe,0xc4,0x5a,0x09,0x0b,0x5b,0x68,0xe2,0x67,0x41,0xcf,0x4a,0x35,0xef,0x11,0x77, +0x66,0x28,0x38,0x69,0xad,0x52,0xb9,0x1a,0xd2,0x67,0xec,0xf3,0xe6,0x45,0x70,0x4c, +0xe7,0xec,0x32,0xf1,0x2f,0xac,0xa2,0xd9,0xc0,0x55,0x21,0x8a,0x14,0x39,0x3c,0x36, +0xe6,0xcd,0x10,0x43,0xfa,0xe8,0xaa,0x45,0x26,0xc6,0x3d,0x7e,0xe1,0x44,0x1b,0xf4, +0xef,0xb0,0x19,0x53,0x7b,0xba,0x4b,0x0c,0x35,0xc5,0x8d,0x13,0x51,0x6c,0x11,0xab, +0x00,0x24,0xf5,0xfd,0x99,0x2e,0xbb,0x09,0xad,0x26,0xe9,0xcd,0xfe,0x8b,0x77,0xce, +0x3f,0xae,0x33,0xca,0x16,0x80,0x67,0x19,0x76,0xa0,0xcc,0x43,0xfd,0x6d,0x62,0xab, +0xf3,0xbc,0x3b,0xa0,0x3b,0xa0,0x76,0xdb,0x6b,0x39,0xc2,0x6e,0xfc,0x40,0x5b,0x8c, +0x4c,0xae,0x5c,0x62,0x61,0x73,0x11,0x76,0xcd,0x8e,0x28,0xeb,0xef,0x4c,0xab,0x27, +0xd9,0x7b,0xfd,0x3d,0x64,0x22,0xad,0x60,0xfd,0x8d,0xee,0xfb,0xee,0xf6,0x1e,0x32, +0xa9,0x3f,0xf2,0x75,0x52,0x3d,0x4a,0xa4,0x85,0x53,0xad,0xb3,0x83,0x95,0x72,0x70, +0x21,0x14,0xba,0xaa,0x33,0xa8,0x02,0x1f,0x0e,0xde,0x82,0x13,0x03,0x2e,0x81,0xe1, +0x80,0x6f,0xdb,0xbb,0xd7,0x88,0x9d,0x50,0x68,0x93,0x8d,0x96,0x96,0x0d,0x3f,0x88, +0x81,0x9c,0x7c,0xf5,0x94,0xfb,0xbd,0x81,0x85,0x67,0xe3,0x55,0xf1,0x5e,0x7d,0x53, +0x87,0x3d,0xfd,0x02,0x97,0xbd,0x62,0x4a,0x60,0xcd,0x30,0x2c,0xcd,0x5b,0x75,0xa7, +0x21,0x8c,0xff,0x25,0x4f,0x1a,0xdf,0x5b,0xbb,0x86,0x3c,0x9e,0xef,0xf8,0x70,0x23, +0x9a,0xd4,0x7b,0x37,0x49,0x19,0x50,0x67,0xdb,0xa5,0xa5,0x17,0x63,0x47,0xeb,0x29, +0x0b,0x9a,0x78,0xa5,0x5c,0xe6,0x43,0x46,0xe1,0xce,0x86,0x07,0x8b,0x46,0x19,0x7b, +0x8f,0xd8,0xfc,0xf4,0x54,0x69,0xa6,0xd9,0x4e,0x59,0x21,0x9c,0x1c,0x4c,0x3c,0x9e, +0xd2,0x14,0xf6,0x36,0x5e,0x62,0x13,0xc5,0xe0,0x98,0x0a,0xdc,0x15,0x3a,0x15,0xbb, +0x41,0xdb,0x67,0xe6,0xb6,0xb7,0xb7,0x54,0xea,0x23,0x77,0xc7,0xb0,0x65,0xfb,0x65, +0x5c,0xf5,0xb9,0xa3,0xbb,0xa2,0x29,0xd9,0x8d,0x2b,0xc0,0xcc,0x97,0x68,0x19,0x22, +0x77,0xd1,0xbc,0x07,0x56,0xed,0x2a,0x6e,0x5f,0x3c,0x88,0xe8,0x9f,0x7f,0xd6,0x6b, +0x13,0xc2,0xf6,0xff,0x5c,0x20,0xf8,0xa4,0xe2,0xbf,0xe7,0x55,0x79,0xe4,0x71,0xf3, +0x11,0x8c,0x27,0xa7,0x88,0xb3,0x8c,0xcc,0x4f,0xc5,0x5f,0xed,0x9e,0xbc,0x83,0xa0, +0x31,0x02,0xf9,0xf3,0xb9,0x86,0xd4,0x7e,0x7c,0xe0,0x79,0x01,0x53,0xf2,0x59,0x15, +0xd5,0x6c,0xb6,0x20,0x16,0x39,0x6d,0xdf,0x23,0x5d,0xed,0xdb,0x33,0x3c,0x75,0xe3, +0x23,0x8a,0xf1,0x33,0xb0,0x8e,0x7c,0x52,0xba,0x03,0x27,0xb0,0x60,0x98,0xc5,0x5f, +0x8e,0x1c,0xb8,0x81,0xa1,0xc2,0x07,0x80,0xc6,0x5b,0x04,0xa1,0xe1,0x56,0x30,0x28, +0x87,0x1a,0x29,0x1f,0x1d,0x4f,0xd2,0x56,0x3c,0xec,0x59,0x5d,0x9d,0xbc,0xfb,0xb2, +0x23,0xc6,0x94,0xb4,0x64,0x85,0xe4,0x0f,0x44,0x5d,0x4e,0x77,0x1a,0x55,0x51,0xfc, +0xe2,0x0a,0xf0,0xab,0x70,0x38,0xa1,0x57,0xe2,0x3a,0x5f,0x34,0xba,0x24,0x1b,0x88, +0xf6,0x44,0x91,0xc1,0xab,0x16,0xce,0xe5,0xf3,0xa6,0xef,0x4c,0x5f,0xe0,0x13,0x0d, +0xf7,0x45,0xdf,0xf5,0x95,0x3e,0xe6,0x40,0x62,0xc6,0xb9,0x76,0x86,0x6a,0x66,0x6a, +0xfb,0x83,0xe0,0x8e,0xf1,0x4c,0x6a,0x1a,0xb3,0xe5,0x26,0x4e,0x6b,0x88,0x30,0xa8, +0x8c,0xa6,0xb5,0x8e,0x9b,0xb4,0x8a,0x27,0x2b,0xfd,0x5e,0xf6,0xe2,0x96,0xd0,0x30, +0x63,0x4e,0xe1,0x0d,0x99,0xe9,0xc3,0xad,0xf9,0xef,0x38,0x6a,0xd6,0xb6,0xaf,0x7b, +0x32,0x96,0xe9,0x1d,0x98,0xfa,0x4d,0xbd,0xf8,0x4b,0xc1,0x57,0xe5,0x29,0x5b,0xd3, +0xeb,0x03,0xa6,0x2e,0xe1,0x6e,0x4d,0x9b,0xce,0xc1,0xd8,0x6e,0xf9,0x2e,0x70,0xbe, +0x57,0x09,0xb2,0x6e,0xe0,0xb8,0xe3,0x9a,0xe7,0x30,0x51,0x1e,0x7a,0xfd,0x19,0x39, +0xfe,0x11,0x08,0x2a,0x67,0x81,0x01,0x2a,0x21,0x2a,0x18,0xd8,0x58,0x4a,0x3d,0x7d, +0x12,0xf2,0xb3,0x2e,0xb1,0x6d,0x23,0x89,0x83,0xfe,0xe5,0x15,0x54,0xe9,0xff,0xeb, +0x26,0x09,0x44,0xec,0x81,0x72,0x2f,0xff,0x66,0x8a,0x34,0xd6,0x12,0x3c,0x9c,0xd7, +0x05,0xe5,0xd6,0x6b,0x92,0x54,0x4e,0x34,0x50,0x06,0x01,0xc7,0x2c,0x7a,0xda,0xc1, +0xa4,0x7c,0x98,0xc0,0x5b,0x56,0xa9,0xbe,0x86,0xff,0xeb,0xa2,0xf4,0xf2,0x5d,0x8a, +0x8b,0x51,0xf5,0xb1,0xd2,0x46,0xdd,0xd9,0xad,0x8c,0xd5,0x95,0xa7,0xcb,0x5c,0xed, +0x24,0x0d,0xcc,0xc1,0x4d,0x34,0x6e,0x50,0xeb,0x16,0x8e,0x58,0x0e,0x36,0x55,0xb8, +0x25,0x0c,0x17,0xd6,0x4c,0xdd,0x24,0xe4,0x83,0xd4,0x4c,0x04,0x2c,0x84,0x03,0xbb, +0x01,0x54,0x55,0x38,0xba,0x77,0x4c,0x42,0x1f,0xfd,0xc8,0xec,0x07,0x79,0xcb,0x3f, +0x0f,0x1a,0x92,0xb2,0xb5,0x4d,0x70,0x02,0x67,0xda,0xa3,0xf3,0x12,0xf4,0x1f,0x88, +0xdf,0x7d,0x11,0x08,0x09,0x9a,0xa2,0xca,0x5b,0xb8,0xac,0x53,0x85,0x14,0xa2,0x1d, +0xfc,0x7b,0x4e,0xf4,0x73,0xb2,0xda,0x72,0xd2,0xc6,0x5e,0xd4,0x24,0x74,0x3f,0x61, +0xe4,0xc6,0x3a,0x6f,0xd8,0xe1,0xbc,0xee,0xe6,0x86,0xf1,0x6d,0xfb,0xd2,0x66,0x72, +0x56,0x90,0x8b,0x7f,0xbf,0x22,0x21,0x08,0xef,0x62,0x87,0x05,0x9a,0x0e,0xbb,0x8f, +0xf4,0x41,0xf7,0xb3,0x1b,0xbe,0x04,0xaf,0x6c,0x45,0x7e,0x1f,0xf6,0x71,0xf7,0x86, +0xf6,0x60,0xd2,0x3a,0x9e,0x53,0xfe,0x8a,0x09,0x71,0xa0,0xfa,0x9a,0xfe,0xa4,0x09, +0xb2,0xc2,0x9e,0x56,0x1f,0x9f,0xfe,0xd9,0x93,0xf1,0x2c,0x1d,0xdb,0x8f,0xe0,0x82, +0x5a,0xa3,0xad,0x4d,0xba,0xaf,0x9f,0x91,0x41,0xd4,0x77,0x0e,0x77,0x72,0x32,0x06, +0xfb,0x0d,0x60,0x6e,0x79,0xe2,0xcb,0x05,0xe5,0xdb,0xa9,0xa5,0xa9,0xef,0xe8,0x7a, +0x7a,0x89,0x90,0xe5,0x91,0xb5,0x93,0xb7,0xd6,0xfe,0x80,0x06,0x13,0xa3,0xf5,0xfd, +0x6d,0x81,0xb8,0x12,0x27,0xc7,0xb7,0x7d,0x49,0xa0,0x8e,0x16,0x75,0x43,0xab,0x78, +0x83,0x9a,0x0d,0xd0,0x57,0xaf,0x42,0x40,0xaf,0x81,0xa0,0xeb,0x26,0x86,0x4d,0xb2, +0xf9,0x7b,0xf9,0x71,0x32,0x09,0xb0,0x0a,0xcf,0x1b,0xea,0xa6,0x1e,0xa6,0x13,0xa1, +0x69,0x18,0x88,0x11,0x26,0xa8,0xc3,0x94,0x63,0x71,0x78,0xae,0x25,0x6e,0x9a,0x78, +0x85,0x0b,0x2d,0xf5,0x9e,0x14,0x2b,0xb2,0xba,0xd9,0x3e,0xe8,0x56,0x3b,0xc5,0xc0, +0x84,0x8d,0xf1,0xc2,0xb7,0x26,0xea,0x0c,0xac,0xc8,0x50,0x4a,0xd1,0xfe,0x7b,0xca, +0x4e,0x25,0x9c,0x09,0xde,0xa8,0x2b,0x2b,0xbb,0xad,0x8a,0xd5,0xf0,0xe5,0x22,0x07, +0xfc,0x08,0xbc,0xb3,0x1b,0xb0,0x96,0xbf,0x98,0xab,0x07,0x0f,0xfc,0x48,0x73,0x8f, +0xbd,0x91,0xeb,0x87,0xff,0xdf,0x0b,0xc3,0x80,0x16,0x48,0x08,0x7d,0x15,0xab,0xe4, +0x6c,0xe8,0xed,0xef,0x62,0xa4,0x52,0xd0,0x36,0x37,0x83,0x0f,0x82,0x44,0xb2,0xba, +0xb2,0x1d,0xa0,0x89,0xe3,0x2a,0xf0,0x58,0x2e,0x35,0xd7,0x0c,0xa9,0xae,0x77,0xba, +0x67,0xf8,0xa2,0x56,0xe6,0x2b,0xd6,0xfe,0x7e,0x91,0xa0,0x14,0x23,0xaf,0xa3,0x23, +0xc4,0x83,0xf2,0x31,0x5c,0xae,0x0d,0x6d,0x2f,0x4d,0xea,0xb4,0x2b,0xe1,0xbd,0x4a, +0xe1,0x04,0xfa,0x25,0x5d,0xaf,0x69,0x26,0x24,0x8b,0xe2,0xfc,0x7e,0x30,0x8d,0xb3, +0x0e,0xd2,0x3a,0x02,0x0d,0xd8,0x67,0x26,0x55,0x30,0x23,0x22,0x45,0x52,0xec,0x4e, +0x88,0x65,0x01,0xed,0xa8,0x0d,0xba,0xec,0xe8,0xb3,0xa5,0x4c,0x86,0x94,0x3c,0x88, +0x05,0x2d,0x65,0xef,0x1e,0xf3,0xce,0x84,0x45,0xc9,0x8d,0x59,0x09,0xb0,0xfd,0xe0, +0x87,0xd1,0x12,0xcc,0xde,0xbc,0x96,0x36,0x76,0xec,0x85,0x4c,0xc6,0xab,0x67,0xc0, +0xb7,0x68,0x84,0x87,0xba,0xb9,0xc4,0xdf,0xd5,0x99,0x58,0x78,0x36,0x0b,0x14,0xd6, +0xde,0xd7,0xd6,0x3e,0xed,0xfa,0x05,0x8c,0xc0,0x94,0x78,0x08,0x08,0xd5,0x5a,0x9c, +0x82,0x3d,0xef,0xc6,0x15,0xf7,0x8e,0x13,0xad,0x27,0x65,0x98,0xa3,0xfd,0x74,0xc3, +0x10,0xf2,0x7d,0xa5,0x5c,0x86,0xda,0x53,0xe1,0xce,0xc2,0xaf,0xd4,0x97,0x3b,0x32, +0x2a,0x81,0x26,0xf5,0x3a,0xa1,0x49,0xf5,0x9d,0x24,0x0e,0x40,0x6c,0xb5,0x77,0x8f, +0xf8,0xf5,0xf7,0x8b,0xe8,0xd5,0x40,0x58,0x8d,0x66,0x85,0x30,0x7c,0x79,0xa1,0x75, +0x00,0x97,0xa5,0x71,0x10,0xb7,0xf7,0x77,0x41,0x27,0x4a,0x68,0x05,0x8c,0xeb,0xc5, +0xa3,0x85,0x6b,0xc1,0xb3,0xa5,0x01,0x0f,0xeb,0xc2,0x57,0x23,0x7d,0xa9,0x5e,0x25, +0xd3,0x3d,0xbc,0x32,0x56,0x8d,0x19,0x88,0x91,0x57,0x8d,0x17,0x76,0xbe,0xce,0xa8, +0x4d,0xb1,0x02,0x4c,0x37,0xb5,0x67,0xf1,0xce,0x62,0x7a,0x03,0x80,0xbc,0x5f,0xfb, +0xf3,0x31,0x27,0xa7,0xf4,0xb3,0xde,0xda,0xcc,0x9c,0xf3,0x28,0x0b,0xf7,0x11,0xdc, +0x1a,0x90,0xe9,0xe0,0x87,0xfd,0xbf,0x27,0x42,0x2b,0x6f,0xff,0xda,0x49,0x5e,0x28, +0xec,0xab,0xe0,0x1a,0xdd,0xfd,0xa8,0xbb,0x23,0x44,0xcb,0x24,0x2f,0x69,0x68,0x12, +0x6a,0x0c,0x24,0x86,0xd1,0xfc,0x02,0x32,0x8b,0x4e,0x73,0x2a,0x61,0x95,0x14,0x61, +0x05,0x93,0xf9,0x22,0x6d,0x2d,0x6f,0xc3,0xd2,0x0f,0x4a,0x12,0xd6,0x79,0xf6,0x43, +0x8f,0x89,0xeb,0x49,0x90,0x83,0x51,0x90,0x3c,0x21,0x8c,0x0b,0x88,0x96,0x58,0x44, +0x0b,0x4a,0xf8,0x94,0xe9,0x2b,0x45,0x93,0x7a,0xc9,0xd8,0x43,0xb3,0x6b,0x6e,0x7c, +0x0a,0xa1,0x82,0xaf,0xb0,0x23,0x66,0x5d,0x2b,0x48,0xb8,0x34,0xf5,0x68,0x9a,0xd2, +0xfd,0x0f,0xa1,0x04,0x35,0x2b,0x37,0x49,0x29,0x57,0xb1,0x25,0x7c,0x69,0xdc,0x15, +0xbc,0x0e,0xc5,0xa3,0x32,0xad,0xa6,0x02,0xf7,0x24,0x93,0x68,0x92,0x66,0x84,0xa8, +0xa9,0x48,0xb8,0x8e,0xcc,0x2b,0xd6,0xf8,0x36,0xb7,0x19,0xa8,0x33,0x61,0xb2,0xf8, +0x0d,0x1b,0x8a,0xe1,0x2e,0xf2,0xfd,0xb0,0xec,0xc0,0xc0,0x39,0xfe,0x6d,0x07,0x4f, +0xbb,0x54,0xfb,0xf4,0xc8,0xb1,0xbf,0xc1,0x1b,0x07,0xdb,0x38,0xeb,0xfa,0xb3,0xf9, +0x99,0x49,0xab,0x99,0xd2,0x69,0x3b,0xaa,0x6a,0x41,0xcd,0xfa,0x5b,0xbf,0x9b,0x6b, +0x71,0x05,0xbd,0xae,0x98,0x04,0xa9,0x98,0x6b,0xbd,0xaa,0xee,0x5b,0x6b,0xbb,0xdc, +0x60,0x60,0xb2,0xde,0x12,0x90,0x89,0x8b,0xc7,0xe0,0xa2,0xfe,0x5a,0x8f,0x18,0xc6, +0x8c,0xfd,0x38,0x2f,0xd9,0x91,0x2d,0x6f,0xa9,0xab,0xe8,0x8f,0x76,0xd3,0x15,0x71, +0x8b,0xa0,0xf3,0x8d,0x6c,0x20,0x4a,0x9b,0x67,0xe2,0x64,0x9f,0x59,0x27,0x7a,0x86, +0xc9,0x01,0xe4,0x9a,0x3d,0x3d,0x4e,0x92,0x44,0xdd,0xf4,0xba,0x79,0xfb,0xbc,0xe7, +0x2f,0x4e,0x98,0x4f,0x46,0xd4,0x7c,0xae,0x68,0xda,0x24,0x4a,0x61,0x3c,0xd6,0x72, +0x2c,0x1f,0x9f,0x84,0x93,0x72,0x75,0xba,0x10,0x5d,0x8f,0x47,0xc3,0x2a,0xb9,0xf3, +0xaf,0x6c,0x52,0xf5,0xb7,0x98,0xcd,0x53,0x00,0x48,0x62,0x31,0x9a,0x7a,0xa3,0x30, +0xa2,0x0b,0xfe,0x26,0xb0,0x1c,0x2c,0x62,0xb6,0xcf,0xb4,0x44,0xce,0x79,0xc8,0x96, +0x3f,0x54,0xb4,0x56,0x36,0x6c,0x3e,0xe0,0x62,0x95,0x54,0x31,0xd2,0xfd,0x5b,0x00, +0x30,0x1e,0x65,0xa7,0xf1,0x89,0x6d,0xf1,0x41,0x3a,0x9f,0x5a,0x51,0x70,0x96,0x42, +0xdc,0x1e,0x97,0xd4,0x10,0x31,0xf5,0xfc,0x64,0xd5,0x5d,0x17,0x52,0xff,0x39,0xb9, +0x89,0xe7,0x34,0x08,0x5f,0xa1,0x15,0x4e,0x5f,0xbd,0xde,0xa1,0x99,0x7e,0x45,0xa5, +0xc2,0x5d,0xd5,0xab,0x42,0x30,0x1a,0x41,0xde,0xc2,0xc7,0xa4,0x1a,0x59,0x3c,0x2c, +0x5f,0x91,0x5c,0x1e,0xc7,0x33,0xca,0xc9,0x83,0xc9,0x34,0x0d,0x5b,0x3b,0x55,0x86, +0xdf,0xb4,0xa9,0x50,0xb0,0x9f,0xa8,0x44,0xe1,0x19,0x67,0x99,0x31,0x01,0x9f,0xff, +0x15,0x15,0xce,0x49,0x9b,0xb4,0xba,0xcc,0xe8,0x88,0xd2,0x0e,0xf8,0x34,0xdb,0x75, +0x50,0x14,0xcc,0x3e,0xb9,0x35,0x3e,0xe6,0x18,0x50,0xbe,0xb8,0x0a,0x72,0x61,0xe5, +0x9c,0xba,0x47,0x2f,0x1b,0xb6,0x7a,0x8b,0xc9,0x4c,0xca,0x1d,0xf2,0x71,0x14,0x56, +0xad,0xf4,0x0f,0xbf,0xfa,0x1f,0x4d,0x0d,0x00,0x1b,0xbf,0xbc,0x35,0xff,0xa9,0xf1, +0x02,0x9b,0x03,0x2e,0xc8,0x91,0xf3,0xca,0x90,0x0d,0x3a,0x44,0x9e,0xd1,0x16,0x74, +0xf2,0x91,0xb6,0x3e,0x36,0x21,0xbc,0x26,0xc5,0xa3,0xde,0x1e,0x54,0x70,0xde,0x02, +0x7a,0x99,0xc1,0x30,0xf5,0xaf,0x9d,0xb1,0xc8,0xc8,0xd1,0x39,0x9d,0xef,0x91,0xe8, +0x54,0x5e,0x1d,0x75,0xfc,0x92,0xd1,0x1b,0x42,0x12,0x55,0xb5,0x01,0x68,0x75,0xbf, +0x27,0x5f,0xd8,0x16,0x12,0xab,0x65,0x80,0xc4,0x10,0xd4,0x04,0x17,0xc4,0x31,0xc1, +0xee,0xb4,0xb6,0x5d,0x95,0x8d,0x78,0xd7,0x69,0xa6,0xc0,0x26,0xd7,0xea,0x55,0xc7, +0xe4,0x38,0x81,0x06,0x3d,0xe4,0x2a,0x01,0xad,0xb7,0x89,0xe5,0xd3,0xe2,0x91,0x6c, +0x80,0x52,0x97,0xd3,0xfc,0x93,0x33,0x99,0x2c,0x96,0x99,0x33,0x90,0x6c,0x09,0x71, +0x56,0x83,0xba,0x0a,0x34,0x16,0x08,0xc2,0x98,0x07,0x8a,0xbd,0x5b,0xee,0x12,0xe5, +0xfc,0xea,0xd2,0xf6,0x0f,0xe4,0x58,0x3b,0x4e,0xa9,0xf6,0x7e,0x07,0xf2,0x27,0x93, +0x75,0x2b,0x99,0x8d,0x48,0xc2,0x9f,0xc3,0x57,0x87,0x10,0xca,0x7d,0x4c,0xd0,0x68, +0xb5,0x7a,0x54,0x9b,0xb2,0x46,0xfb,0xca,0x6b,0x89,0xb8,0xcf,0xd9,0xa4,0x2e,0xce, +0x35,0xae,0x82,0x0f,0xe5,0xee,0x48,0x5b,0x72,0x33,0x76,0x8c,0xdc,0xa4,0x0a,0x44, +0x0e,0x80,0x4a,0x3c,0x5e,0xed,0x81,0xfe,0x20,0x9b,0xe2,0x8e,0x20,0xe2,0xc0,0x8a, +0x52,0xc4,0xbd,0x44,0x1c,0x86,0x4d,0x47,0xac,0xc8,0x3a,0x8d,0x5c,0xa6,0x94,0x9c, +0x66,0xc5,0x93,0xdd,0x9e,0xcc,0x41,0xf9,0x1b,0xf3,0x4f,0x8f,0x20,0xe0,0x80,0xec, +0xb8,0x9f,0xef,0xc2,0x0b,0xb9,0x30,0xea,0xe6,0x35,0x25,0xb5,0x27,0x81,0x27,0x72, +0xe0,0xfd,0x5d,0x12,0x5e,0xdc,0x64,0xa2,0xc9,0xdc,0xce,0xb3,0x29,0x6a,0xe5,0x87, +0xf3,0x2f,0x7c,0xa4,0xb2,0x41,0xad,0xc1,0x85,0x4e,0xd5,0xb9,0x6d,0xff,0x74,0x5d, +0x00,0x15,0xf3,0xbf,0xb5,0x1c,0x27,0x46,0xc4,0xc3,0xdb,0x4e,0xd4,0x86,0x68,0x3e, +0xca,0x6f,0x9c,0xe1,0x97,0x3c,0x4e,0x52,0xb2,0x7b,0x8c,0x64,0x73,0x85,0xfd,0x2b, +0x2f,0xd7,0xe4,0x34,0xb5,0xbd,0xf6,0x90,0xe5,0x01,0x78,0x74,0xa3,0x1e,0x7d,0xec, +0x9a,0xc3,0xf5,0x25,0x17,0x3e,0xd1,0x81,0x19,0x94,0xb7,0x05,0xd2,0x2d,0xa5,0xfc, +0xd0,0x72,0x2d,0xb5,0xf6,0xf7,0x50,0x03,0xef,0xd8,0xc5,0x0c,0x0a,0x99,0x20,0x02, +0x89,0x1e,0xb3,0x73,0x1d,0x63,0x0c,0x28,0xb8,0x34,0x23,0x80,0x48,0x03,0x89,0xec, +0xd2,0xfb,0xf7,0x0d,0xd4,0x88,0x5e,0x8d,0x4c,0xd4,0xf2,0x15,0xff,0x2d,0x27,0xcb, +0xbd,0x81,0x93,0x0b,0xde,0x04,0x4f,0x8c,0x4f,0x9b,0xaf,0x53,0x62,0xb8,0x50,0xdc, +0x9e,0xd6,0x57,0xec,0xa6,0x04,0xc4,0x9c,0x4c,0x24,0x92,0xdd,0x9c,0x7b,0xb9,0xaa, +0xd6,0xed,0x9e,0xac,0x7f,0x3c,0x16,0xf4,0xf7,0xd1,0x91,0x2e,0x3e,0x27,0xae,0xc4, +0x1f,0x69,0xb4,0xdf,0x9c,0xbb,0x1e,0xbe,0xa3,0x50,0x5d,0x16,0xde,0x42,0x54,0xe7, +0xa8,0x34,0x9f,0x4d,0xbb,0x3f,0x75,0x09,0x63,0x9f,0xf3,0xed,0xae,0xf8,0x7a,0x9c, +0x4e,0x39,0xe7,0xb8,0x1c,0xb9,0x07,0x79,0xe6,0x02,0x40,0x38,0x25,0xf5,0x80,0xfc, +0x04,0x8b,0x40,0x43,0xf1,0xd6,0x4b,0x03,0x46,0xb3,0x07,0xd7,0xd4,0xcd,0x32,0xa0, +0xd5,0xae,0x48,0xe5,0xcc,0xaa,0x00,0x1f,0x3d,0x14,0x08,0x56,0x12,0xbe,0x5f,0x3d, +0x6b,0x46,0xfe,0x77,0x46,0xbd,0xe0,0xdd,0x2c,0xb9,0xc3,0x99,0x3b,0x06,0xad,0x73, +0xea,0x92,0x42,0x28,0x7a,0x67,0x8a,0x0a,0xb9,0xd6,0xe1,0x57,0x92,0xdc,0x9f,0x20, +0x80,0xd0,0x53,0x36,0xb1,0x8f,0x36,0xb8,0xab,0x17,0x83,0x9e,0x54,0xcf,0x48,0xa9, +0x83,0x9e,0xe0,0xaf,0x60,0x33,0x98,0x81,0x28,0x48,0xa6,0x72,0xba,0x76,0xe0,0x23, +0x3d,0x5d,0x92,0x4d,0x2d,0x7d,0x37,0xac,0xc1,0x0c,0xbc,0x16,0xe8,0x97,0x49,0xd5, +0xe4,0x9e,0x36,0xd1,0x9b,0x3f,0xa2,0x56,0x62,0x38,0x19,0x84,0x55,0xc7,0x02,0xfb, +0x70,0x83,0xd8,0x13,0x1e,0x83,0x01,0xac,0x2f,0xd1,0xea,0x08,0x2e,0xc7,0x30,0xa8, +0xdd,0xa6,0x31,0xac,0x11,0x86,0xca,0x94,0x81,0x2a,0xa5,0xde,0x7d,0x32,0xd9,0x35, +0x63,0x4e,0x63,0x72,0xf8,0x4a,0xd3,0xd8,0x56,0xee,0x37,0x57,0x7b,0x0f,0xaf,0x7b, +0x04,0xad,0x1a,0xe4,0x99,0xb0,0xce,0xc0,0xe8,0xd0,0x2d,0xd0,0xf8,0x97,0x9b,0xdb, +0x35,0x05,0x9d,0x44,0x69,0x2c,0xfb,0x16,0xdf,0x11,0x85,0x1f,0x20,0x67,0xfc,0xa1, +0x2a,0xa9,0x0a,0x15,0x65,0xd0,0x23,0x46,0x2d,0xb8,0xaf,0x58,0x8f,0xfc,0x83,0xb8, +0x54,0x95,0x1c,0x4d,0xed,0x22,0x87,0xfa,0x6b,0x71,0xa4,0x7c,0xa8,0x6a,0xda,0x18, +0x43,0x7e,0x40,0x3d,0x8b,0x29,0x8d,0x07,0xe5,0xe9,0x7c,0x44,0xb0,0x9e,0x3e,0x30, +0xdf,0xed,0x11,0x7b,0x36,0x9a,0xee,0x60,0x64,0x75,0xac,0x5b,0x99,0x0a,0xd8,0x35, +0x62,0x0e,0xf2,0xac,0x52,0x11,0xf0,0x22,0x2d,0x59,0x31,0xcb,0xec,0x2d,0x5b,0x20, +0xa0,0x71,0x32,0xf7,0xd8,0xa3,0xda,0x49,0x80,0x1f,0x41,0x5b,0x0d,0x33,0x73,0x31, +0x40,0xb2,0xdb,0xb8,0x5a,0x42,0x9d,0x92,0xbe,0x48,0x26,0xfb,0xd5,0xde,0x22,0x2d, +0x03,0xa8,0x54,0xda,0x50,0xc0,0xdb,0x79,0xbb,0xa9,0x9a,0xdb,0x93,0xd5,0x67,0xc3, +0x17,0x46,0x1a,0xda,0x01,0x41,0x9c,0x01,0x08,0xc8,0xd8,0x45,0x0f,0xda,0xf8,0x9a, +0x73,0x4b,0x93,0xdf,0xd4,0x82,0x7a,0xbb,0x17,0xca,0x85,0x16,0xd0,0xfd,0x6b,0xfc, +0x9d,0x55,0x98,0xa7,0x58,0xa4,0x25,0xd6,0x1a,0x58,0x4a,0x87,0x9b,0xc6,0x52,0x77, +0xc1,0x1b,0xbc,0xbd,0x4c,0x97,0x04,0xce,0x28,0x17,0xc6,0x9d,0xd9,0x87,0x57,0xe8, +0x5e,0xfc,0x99,0x6f,0x41,0x9b,0x1a,0x5e,0x7b,0x14,0x0e,0xcf,0x03,0xd8,0x55,0x0b, +0x5f,0x58,0x14,0x7d,0xb0,0x99,0x4e,0x67,0x4d,0xdb,0xa9,0x90,0xd6,0xa5,0xd0,0xf9, +0x15,0x78,0x1e,0x9f,0x36,0x7a,0x4d,0xb9,0x4e,0x16,0xa7,0x42,0x10,0xe8,0x98,0x89, +0x5d,0xba,0xb8,0x75,0xb7,0x91,0x50,0x45,0x83,0x2f,0xa8,0xd5,0x19,0x5c,0xfc,0xdc, +0x4c,0x84,0x9d,0x4f,0x0d,0x37,0x7e,0xdf,0x4f,0x11,0x98,0xc0,0xfb,0x33,0x98,0xa9, +0xac,0xb5,0x90,0x5e,0x84,0x93,0x0f,0xde,0xa2,0x0d,0x81,0xd5,0x11,0xef,0xb0,0x5d, +0x84,0xf2,0x9c,0x59,0xd0,0x01,0xe8,0x8b,0x1c,0x59,0x4f,0xba,0xc8,0x41,0x37,0xf1, +0x78,0x0d,0xd8,0x74,0xeb,0xe2,0x04,0x26,0x2b,0xe8,0x0d,0x79,0x81,0xbd,0x97,0x55, +0xcf,0x30,0x0f,0xe7,0x65,0x3b,0xaf,0x3a,0xe0,0x6e,0xec,0x54,0xae,0x7a,0x47,0x3b, +0x6f,0x53,0xec,0xcb,0xff,0xd3,0x68,0x50,0x61,0x6d,0x1a,0x03,0x56,0x36,0x57,0x2a, +0x64,0x25,0xf7,0x2e,0x36,0x08,0x69,0xdb,0x5e,0x8e,0xb9,0xda,0x55,0xb8,0xe8,0xc6, +0x78,0xd3,0xec,0x31,0x75,0x3b,0x48,0x99,0xb5,0x86,0x46,0x97,0x74,0xed,0xb2,0x8a, +0xde,0x78,0x27,0x62,0x95,0xad,0x40,0x0d,0xc6,0xc8,0xfc,0x08,0x35,0xc5,0x38,0xcb, +0x23,0xc4,0x99,0x45,0x61,0xe4,0xf1,0xa8,0x33,0xca,0x31,0x96,0x2c,0x67,0x46,0x09, +0x72,0x1b,0x2d,0x35,0xd4,0x50,0xca,0xdb,0x3b,0xf4,0x87,0x4b,0x3e,0x36,0x31,0xf9, +0x7c,0x2c,0x31,0x0e,0xf5,0xf9,0xc9,0x22,0xe9,0x37,0xb2,0x0a,0x4c,0xa5,0xfe,0x45, +0xf8,0x75,0x78,0x31,0x69,0xfc,0x32,0xd6,0x9f,0xf6,0x02,0x8e,0x55,0xa6,0xee,0xaf, +0x44,0x10,0xbb,0x26,0x7d,0x05,0x09,0xd1,0x37,0xb1,0xa1,0x2f,0x7b,0xf8,0x94,0x2b, +0x72,0x74,0xbc,0x24,0xed,0x3e,0x42,0x7c,0xcb,0xab,0x2b,0x4c,0x8e,0x4a,0xb9,0xd9, +0x71,0x85,0x9a,0x2c,0x5d,0x52,0xb2,0x9b,0xdf,0x91,0xea,0x42,0xbf,0x43,0xaa,0xae, +0x7e,0x56,0xd2,0x8e,0xf0,0xa2,0x03,0xb8,0xee,0x32,0xe9,0x45,0x7d,0x78,0xd6,0x62, +0x3a,0x9f,0x9b,0xcd,0x97,0xca,0xa7,0xf8,0x6f,0xf1,0x21,0x40,0xa6,0xbb,0xdd,0xa6, +0xae,0xd4,0xd3,0x0f,0xdf,0xa0,0x13,0x19,0x38,0x8d,0x6c,0x82,0xd7,0xad,0x95,0x26, +0x5f,0x99,0xff,0x86,0x4f,0xf0,0x4f,0xaa,0xc1,0x6f,0x60,0x58,0x50,0x5b,0x59,0xe0, +0x4d,0xb2,0x92,0x52,0xeb,0x6c,0x77,0x8f,0x8e,0x95,0xbc,0x5e,0xbf,0xbc,0x7e,0xa0, +0xa2,0xb8,0x65,0x83,0x84,0xde,0xf5,0x52,0x39,0x59,0xf9,0xa5,0x9f,0xb8,0xd2,0xe0, +0x87,0x10,0xb7,0x95,0x06,0x1e,0x67,0xac,0xe3,0x78,0x2d,0xa4,0xea,0xa2,0xbf,0xf5, +0x59,0x9d,0xda,0x73,0x4a,0x1b,0x78,0xe5,0xc7,0x5c,0x4c,0x74,0x7e,0xfe,0xac,0x3a, +0xf0,0xd4,0x92,0xd1,0x96,0x2a,0x75,0x80,0xc4,0xd3,0x54,0xdb,0xf2,0xa4,0x52,0xee, +0x56,0xc7,0x45,0xb4,0xd0,0x65,0x74,0x01,0x64,0xde,0x71,0x63,0x9d,0xb1,0xce,0x63, +0x7b,0x34,0x59,0xb5,0x4c,0x1a,0x75,0x54,0x44,0xd1,0x15,0xdf,0x70,0x26,0x47,0x74, +0x2a,0x83,0xea,0xfe,0xbc,0xae,0xd6,0x56,0xb0,0x23,0x90,0x76,0x40,0xfe,0x08,0x3e, +0x24,0x3d,0x96,0x61,0xd4,0xea,0x3a,0x41,0x8c,0x7a,0x64,0x66,0xa9,0xe8,0x3d,0x0f, +0xc7,0xec,0x37,0xfc,0x82,0x1b,0x7c,0xd8,0xce,0x5b,0x14,0x56,0x5d,0xb8,0xfb,0xdf, +0xd6,0x92,0x7b,0x61,0x54,0x18,0xa8,0x41,0xeb,0x71,0x18,0x96,0x8a,0x5d,0x45,0x7e, +0xf6,0x7f,0xb0,0xf3,0xd5,0xf8,0x7e,0xa7,0x0d,0x9c,0xcc,0x06,0xaa,0x33,0x54,0x29, +0x19,0x32,0x4a,0xbc,0xc8,0xd8,0x3c,0x18,0xed,0x95,0xa7,0x01,0x7b,0x76,0xc6,0x63, +0x32,0xad,0xd9,0x7f,0xc8,0x11,0x0f,0x69,0xef,0x86,0x37,0xa3,0x15,0xbc,0xba,0x9c, +0x46,0xec,0xd7,0xe6,0x44,0x62,0xe8,0x19,0x6d,0x97,0xcd,0xff,0xff,0xff,0x3a,0xf3, +0x78,0xaf,0x27,0xfd,0x43,0x3b,0x08,0xd3,0x32,0x02,0x90,0x24,0x50,0x60,0x99,0xec, +0xcb,0xfa,0x30,0xfb,0x6e,0x28,0xc1,0x07,0x7e,0x48,0x98,0x34,0x51,0x61,0x12,0xf2, +0xbc,0xad,0xbf,0x63,0x27,0x32,0x48,0xae,0xe1,0x00,0x91,0x25,0xd0,0x62,0x11,0x2a, +0xd2,0x96,0x52,0x22,0x95,0x09,0x3f,0x85,0xb3,0x01,0x99,0x35,0xd1,0x63,0x40,0x40, +0x02,0x04,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0x49,0x51, +0x83,0x07,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0xcf,0x8c, +0x43,0x4a,0xf7,0x4b,0xed,0xa1,0x4b,0xa7,0x69,0x88,0x92,0x2c,0x58,0x68,0x2d,0x35, +0xd9,0x58,0x8b,0x5b,0xf8,0xdf,0x1e,0xda,0x6d,0xfc,0x9a,0x3c,0x59,0x69,0xa4,0x30, +0x5c,0x9b,0xa3,0x9f,0x18,0x20,0x73,0x37,0xc5,0xc1,0x93,0x2d,0xd8,0x6a,0xb0,0x5b, +0x28,0xf6,0x74,0x6f,0x4f,0xf4,0x4d,0x03,0xab,0xb0,0x9b,0x3d,0xd9,0x6b,0x42,0x48, +0x0a,0x0c,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0x4a,0x58, +0x0b,0x0d,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0x43,0x49, +0x8a,0x0e,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x4b,0x59, +0x8b,0x0f,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x5e,0xae, +0x83,0x75,0x84,0x84,0x30,0x30,0x4a,0xdb,0x53,0x42,0x94,0xa4,0x70,0x70,0xb7,0x72, +0x8d,0xec,0x8c,0x94,0x31,0x31,0x64,0x32,0xb5,0x72,0x9c,0xb4,0x71,0x71,0x5f,0x50, +0x03,0x77,0x85,0x85,0xb0,0x32,0xad,0x23,0x34,0xe9,0x95,0xa5,0xf0,0x72,0x75,0xb6, +0x54,0x1c,0x8d,0x95,0xb1,0x33,0x25,0x33,0x35,0x07,0x9d,0xb5,0xf1,0x73,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0xb2,0xf7, +0x8b,0xc3,0x86,0x8c,0x38,0x38,0x6e,0x2a,0xbc,0x30,0x96,0xac,0x78,0x78,0x8c,0x1c, +0x7e,0x4d,0x8e,0x9c,0x39,0x39,0x24,0x47,0x6f,0xa3,0x9e,0xbc,0x79,0x79,0x27,0x74, +0xc0,0xa1,0x87,0x8d,0xb8,0x3a,0x2f,0x1b,0xe0,0xfa,0x97,0xad,0xf8,0x7a,0xb0,0x6b, +0xe9,0x1d,0x8f,0x9d,0xb9,0x3b,0x1c,0x9d,0x39,0xca,0x9f,0xbd,0xf9,0x7b,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x08,0x60, +0xf0,0xfa,0x30,0x22,0x14,0xa0,0x34,0xa6,0x4c,0xd8,0xb0,0x26,0x54,0xe0,0x01,0x60, +0xbe,0x9e,0xa8,0x16,0x15,0xa1,0x06,0xea,0x25,0xe1,0xb8,0x36,0x55,0xe1,0x96,0xdb, +0x82,0x29,0xa1,0x07,0x94,0xa2,0xea,0x14,0xbb,0xcb,0xb1,0x27,0xd4,0xe2,0x41,0x71, +0x7a,0x8d,0xa9,0x17,0x95,0xa3,0x46,0x41,0xaf,0xb9,0xb9,0x37,0xd5,0xe3,0x60,0x42, +0x06,0x84,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0x68,0x52, +0x07,0x85,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x61,0x43, +0x86,0x86,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x69,0x53, +0x87,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0x1a,0xf4, +0x0a,0xe8,0xa2,0x0e,0x1c,0xa8,0x49,0xae,0x07,0x8a,0xb2,0x2e,0x5c,0xe8,0x39,0x01, +0x31,0x1d,0xaa,0x1e,0x1d,0xa9,0x21,0x3f,0xac,0xcf,0xba,0x3e,0x5d,0xe9,0x39,0x14, +0xf4,0x5e,0xa3,0x0f,0x9c,0xaa,0x8c,0x77,0xe8,0x61,0xb3,0x2f,0xdc,0xea,0xba,0x99, +0x0d,0x2a,0xab,0x1f,0x9d,0xab,0x98,0x7e,0x6e,0x89,0xbb,0x3f,0xdd,0xeb,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x04,0xaf, +0x87,0xd1,0xa4,0x86,0x34,0xb0,0x13,0x9b,0x62,0x7a,0xb4,0xa6,0x74,0xf0,0xec,0x63, +0xdf,0x10,0xac,0x96,0x35,0xb1,0x6c,0xa9,0x19,0x45,0xbc,0xb6,0x75,0xf1,0x86,0x33, +0x78,0x31,0xa5,0x87,0xb4,0xb2,0xf5,0xbc,0xce,0x06,0xb5,0xa7,0xf4,0xf2,0x09,0x6c, +0x44,0x40,0xad,0x97,0xb5,0xb3,0xae,0x8d,0x95,0x26,0xbd,0xb7,0xf5,0xf3,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0xdd,0xf5, +0x1f,0x78,0xa6,0x8e,0x3c,0xb8,0x21,0x2e,0x07,0xc4,0xb6,0xae,0x7c,0xf8,0xea,0x50, +0x96,0x36,0xae,0x9e,0x3d,0xb9,0x6a,0x84,0x4f,0x9b,0xbe,0xbe,0x7d,0xf9,0x8c,0xcc, +0xa2,0x46,0xa7,0x8f,0xbc,0xba,0x0d,0x40,0x5f,0x2f,0xb7,0xaf,0xfc,0xfa,0xfd,0x77, +0x41,0xe0,0xaf,0x9f,0xbd,0xbb,0xbb,0xcb,0xc9,0x40,0xbf,0xbf,0xfd,0xfb,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, +0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, +0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xc0,0x42,0x91,0x25,0xd0,0x62,0x09,0x11, +0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xc1,0x43,0x99,0x35,0xd1,0x63,0x40,0x40, +0x02,0x04,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0x49,0x51, +0x83,0x07,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0x02,0x08, +0x08,0x08,0x82,0x0c,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2c,0x58,0x68,0x0a,0x18, +0x09,0x09,0x8a,0x1c,0x19,0x29,0x1a,0x38,0x49,0x49,0x9a,0x3c,0x59,0x69,0x03,0x09, +0x88,0x0a,0x83,0x0d,0x98,0x2a,0x13,0x29,0xc8,0x4a,0x93,0x2d,0xd8,0x6a,0x0b,0x19, +0x89,0x0b,0x8b,0x1d,0x99,0x2b,0x1b,0x39,0xc9,0x4b,0x9b,0x3d,0xd9,0x6b,0x42,0x48, +0x0a,0x0c,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0x4a,0x58, +0x0b,0x0d,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0x43,0x49, +0x8a,0x0e,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x4b,0x59, +0x8b,0x0f,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xa0,0x60,0x50,0x94,0xa4,0x70,0x70,0x0c,0x90, +0x21,0x11,0x8c,0x94,0x31,0x31,0x1c,0xb0,0x61,0x51,0x9c,0xb4,0x71,0x71,0x05,0x81, +0xa0,0x12,0x85,0x85,0xb0,0x32,0x15,0xa1,0xe0,0x52,0x95,0xa5,0xf0,0x72,0x0d,0x91, +0xa1,0x13,0x8d,0x95,0xb1,0x33,0x1d,0xb1,0xe1,0x53,0x9d,0xb5,0xf1,0x73,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0x06,0x88, +0x28,0x18,0x86,0x8c,0x38,0x38,0x16,0xa8,0x68,0x58,0x96,0xac,0x78,0x78,0x0e,0x98, +0x29,0x19,0x8e,0x9c,0x39,0x39,0x1e,0xb8,0x69,0x59,0x9e,0xbc,0x79,0x79,0x07,0x89, +0xa8,0x1a,0x87,0x8d,0xb8,0x3a,0x17,0xa9,0xe8,0x5a,0x97,0xad,0xf8,0x7a,0x0f,0x99, +0xa9,0x1b,0x8f,0x9d,0xb9,0x3b,0x1f,0xb9,0xe9,0x5b,0x9f,0xbd,0xf9,0x7b,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x20,0x02, +0x04,0x80,0xa0,0x06,0x14,0xa0,0x30,0x22,0x44,0xc0,0xb0,0x26,0x54,0xe0,0x28,0x12, +0x05,0x81,0xa8,0x16,0x15,0xa1,0x38,0x32,0x45,0xc1,0xb8,0x36,0x55,0xe1,0x21,0x03, +0x84,0x82,0xa1,0x07,0x94,0xa2,0x31,0x23,0xc4,0xc2,0xb1,0x27,0xd4,0xe2,0x29,0x13, +0x85,0x83,0xa9,0x17,0x95,0xa3,0x39,0x33,0xc5,0xc3,0xb9,0x37,0xd5,0xe3,0x60,0x42, +0x06,0x84,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0x68,0x52, +0x07,0x85,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x61,0x43, +0x86,0x86,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x69,0x53, +0x87,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0x22,0x0a, +0x0c,0x88,0xa2,0x0e,0x1c,0xa8,0x32,0x2a,0x4c,0xc8,0xb2,0x2e,0x5c,0xe8,0x2a,0x1a, +0x0d,0x89,0xaa,0x1e,0x1d,0xa9,0x3a,0x3a,0x4d,0xc9,0xba,0x3e,0x5d,0xe9,0x23,0x0b, +0x8c,0x8a,0xa3,0x0f,0x9c,0xaa,0x33,0x2b,0xcc,0xca,0xb3,0x2f,0xdc,0xea,0x2b,0x1b, +0x8d,0x8b,0xab,0x1f,0x9d,0xab,0x3b,0x3b,0xcd,0xcb,0xbb,0x3f,0xdd,0xeb,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x24,0x82, +0x24,0x90,0xa4,0x86,0x34,0xb0,0x34,0xa2,0x64,0xd0,0xb4,0xa6,0x74,0xf0,0x2c,0x92, +0x25,0x91,0xac,0x96,0x35,0xb1,0x3c,0xb2,0x65,0xd1,0xbc,0xb6,0x75,0xf1,0x25,0x83, +0xa4,0x92,0xa5,0x87,0xb4,0xb2,0x35,0xa3,0xe4,0xd2,0xb5,0xa7,0xf4,0xf2,0x2d,0x93, +0xa5,0x93,0xad,0x97,0xb5,0xb3,0x3d,0xb3,0xe5,0xd3,0xbd,0xb7,0xf5,0xf3,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0x26,0x8a, +0x2c,0x98,0xa6,0x8e,0x3c,0xb8,0x36,0xaa,0x6c,0xd8,0xb6,0xae,0x7c,0xf8,0x2e,0x9a, +0x2d,0x99,0xae,0x9e,0x3d,0xb9,0x3e,0xba,0x6d,0xd9,0xbe,0xbe,0x7d,0xf9,0x27,0x8b, +0xac,0x9a,0xa7,0x8f,0xbc,0xba,0x37,0xab,0xec,0xda,0xb7,0xaf,0xfc,0xfa,0x2f,0x9b, +0xad,0x9b,0xaf,0x9f,0xbd,0xbb,0x3f,0xbb,0xed,0xdb,0xbf,0xbf,0xfd,0xfb,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0x68,0x13,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0xff,0x80,0x00, +0x55,0x40,0xa9,0x57,0x94,0x3c,0x0f,0x02,0x2b,0xfa,0xca,0x0a,0xf3,0x2e,0x88,0x98, +0x01,0x41,0x67,0x7f,0xc6,0xcc,0x46,0x33,0xbe,0x01,0x60,0xb0,0x58,0x10,0x01,0x80, +0x05,0x42,0x28,0x56,0x1c,0x7e,0x0a,0xd0,0x58,0x42,0x83,0x57,0xe3,0x92,0x09,0x95, +0x22,0x66,0xa9,0xab,0x14,0xa2,0x19,0x7a,0xc5,0x63,0x31,0x0a,0xd7,0xd8,0xe8,0xe2, +0xdd,0x5b,0xfe,0xe0,0x73,0x04,0x80,0x23,0xb9,0xe9,0x10,0xe1,0x5d,0x65,0xe8,0x43, +0x2d,0x61,0x96,0xf0,0x1b,0x88,0x74,0x97,0x45,0xd6,0xaa,0x70,0x4b,0x0b,0xe9,0xf2, +0x4a,0x85,0x99,0x41,0x1b,0x99,0x18,0x41,0x67,0x06,0xe9,0x4d,0x3b,0xf6,0x92,0x53, +0xfc,0x87,0x05,0xd0,0x95,0xa5,0x1f,0x6e,0xe5,0x6b,0x19,0xe5,0x62,0x6f,0x92,0xac, +0x2e,0x48,0xdd,0x44,0x67,0x08,0x91,0x5a,0xc6,0x2d,0xf7,0xae,0x51,0x05,0x0a,0x18, +0x09,0x49,0x86,0x62,0xb8,0xa3,0x12,0x3d,0xae,0x4d,0xfa,0xfc,0x95,0xe2,0xda,0x97, +0xae,0x49,0x43,0x75,0x2d,0x2c,0x6a,0x5b,0x46,0x2f,0xab,0x7d,0xdc,0x65,0xc9,0x49, +0x89,0x0b,0x70,0xff,0x35,0xa0,0x1f,0xdf,0xd9,0xb5,0x99,0xdf,0x5b,0x61,0xaa,0xea, +0xae,0x8b,0x4a,0x3f,0x4e,0x4e,0x2d,0x1b,0x59,0x4d,0x56,0x9d,0x7c,0x4c,0xe2,0xfa, +0xd4,0x82,0x88,0x17,0x78,0x29,0x64,0x75,0x23,0xdd,0x5b,0x6e,0x33,0x5d,0x97,0x6f, +0x64,0x6d,0x07,0x9d,0xe4,0x6c,0xef,0x6d,0x43,0x21,0xed,0x71,0xb1,0x61,0x8b,0x59, +0xdf,0xd1,0xaa,0x9d,0x9f,0x03,0xa4,0x0b,0xe5,0x90,0x24,0x0f,0xf5,0xb0,0x04,0x80, +0x78,0xf8,0xde,0x80,0x93,0x36,0x91,0xa1,0x64,0xd0,0x21,0x62,0x80,0x76,0xde,0xb0, +0x26,0xe9,0xec,0xd0,0x4d,0x3e,0x3c,0x32,0x5e,0xb5,0xe4,0x36,0x78,0xb1,0x4f,0x28, +0x82,0x11,0x8d,0xc9,0xf2,0x3d,0x14,0x21,0xc0,0x5a,0x99,0xb0,0x93,0xb2,0x02,0x1d, +0x24,0xe6,0xed,0xd1,0xc5,0xbe,0x27,0x4d,0xe9,0x35,0xe5,0x37,0xf8,0xd3,0x97,0xd0, +0x3a,0xce,0xe8,0x23,0x4d,0x14,0xd3,0x10,0x52,0xf5,0xab,0x60,0x3e,0x47,0x12,0xa1, +0x27,0x71,0x1c,0x3c,0x1f,0x78,0x9c,0x94,0x07,0xa2,0xf0,0x13,0x9a,0x9f,0xc1,0x6c, +0x8f,0x56,0x05,0x09,0xae,0xc2,0x01,0x0b,0x47,0xa9,0xdd,0xe1,0x7b,0xc9,0x52,0xd5, +0x29,0xee,0x32,0xee,0xa3,0x75,0x59,0xf5,0x63,0xd5,0xcd,0x92,0xf7,0x5b,0xc6,0x71, +0xb2,0x1e,0xfe,0x61,0x18,0x87,0x0e,0x12,0xc4,0xa7,0xcc,0xb1,0xdb,0x7e,0x8e,0x12, +0x08,0xab,0xae,0x18,0x31,0x67,0x1b,0x68,0x37,0x86,0x54,0x34,0xad,0x5a,0xac,0x94, +0x09,0x01,0xdc,0xcf,0x47,0xe1,0x5d,0x14,0xca,0xf7,0x9b,0xbd,0x5b,0x3a,0x56,0x66, +0x48,0xd4,0xd0,0xbd,0xca,0x3b,0x25,0x3e,0x45,0x52,0x38,0x19,0x29,0x18,0x40,0xe4, +0x05,0x9c,0x99,0xa9,0xc7,0x5e,0x68,0x49,0xe7,0xfa,0x2a,0x68,0x36,0x7c,0x90,0xcc, +0xde,0x46,0x71,0x9e,0x9a,0x26,0x49,0xc9,0x41,0x42,0x1e,0x78,0xf1,0x13,0x95,0x3d, +0xa6,0xaf,0x03,0x1d,0xc4,0xc1,0x54,0x29,0xec,0xd5,0x3b,0x72,0xf9,0x9e,0x4d,0xc7, +0x2f,0x9f,0xdd,0xbb,0x40,0xca,0xe7,0x06,0xed,0x16,0x38,0xbd,0xf7,0xd4,0x20,0x02, +0x04,0xc0,0x27,0xe4,0x96,0x88,0x4a,0x20,0x7c,0x4d,0x12,0xc4,0xd6,0xa8,0x28,0x12, +0x05,0xc1,0xd0,0x64,0x97,0x85,0xbe,0x02,0x15,0xdd,0xba,0xd4,0x53,0x5a,0xe7,0x6c, +0x84,0x82,0x1a,0x65,0xd5,0xe2,0xd5,0x04,0x77,0x48,0x60,0x55,0x77,0x87,0x29,0x87, +0x85,0x83,0x38,0xf5,0x17,0xa9,0x95,0x96,0x04,0x49,0x52,0xca,0xeb,0xa1,0x5f,0x8d, +0xbf,0xc8,0x9f,0x35,0x3c,0x2d,0xdc,0x1d,0x84,0xa4,0x30,0xe2,0xa0,0xa6,0xd7,0xaf, +0x17,0xe6,0x97,0xa5,0x31,0x89,0x58,0xb2,0x4b,0x6e,0x99,0xb6,0x5b,0x4e,0x11,0x85, +0x2c,0xc7,0x65,0x27,0x92,0x8a,0xca,0x13,0x46,0x40,0xb3,0x2d,0xb5,0xe2,0x89,0xe5, +0x00,0x80,0x96,0x24,0x84,0xa6,0xa9,0x72,0xc1,0xcc,0x29,0x76,0xe4,0xf6,0x22,0x0a, +0x0c,0xc8,0x44,0x6c,0x7d,0xfd,0xb5,0x7a,0x6c,0xd4,0x25,0xc0,0x37,0xff,0x2a,0x1a, +0x0d,0xc9,0x0e,0x7c,0x5c,0xb9,0xf0,0x38,0x45,0x01,0xb2,0xd8,0x3e,0xc9,0x23,0x9e, +0x8c,0x8a,0xbb,0xca,0x1e,0x82,0x97,0x6b,0x8c,0x45,0xb0,0xe9,0x6c,0xec,0x72,0xc8, +0x8d,0x8b,0xd3,0x9d,0x9c,0xd3,0xc1,0xe4,0x2c,0xcf,0xc3,0x79,0x29,0xa5,0xca,0xe8, +0xd1,0x63,0xd8,0x4a,0x97,0xc3,0xf4,0xd5,0x46,0xac,0x4a,0x95,0xbf,0x13,0x14,0xff, +0xf2,0xcf,0x3a,0x1d,0xe4,0x00,0x04,0xdb,0xa6,0xee,0x7d,0x96,0x6f,0xa0,0xf3,0x39, +0x65,0xcd,0x23,0x1a,0xa7,0x5a,0x2d,0xcf,0xc6,0x43,0x33,0x7a,0xe4,0xe6,0xab,0xf3, +0x83,0xd3,0xa2,0x7f,0x3e,0xef,0xd7,0xe8,0xd3,0xc5,0x04,0x0c,0xcb,0x6d,0x4d,0x79, +0xa6,0xb4,0x7b,0x86,0x43,0xbc,0x30,0xbe,0xb9,0x5a,0x93,0x16,0xf3,0x57,0xa3,0xe0, +0x86,0xf4,0x27,0xf6,0x25,0xb7,0x0d,0xf2,0xd7,0x5c,0x63,0x1b,0x73,0xb1,0x2d,0x7e, +0x25,0x49,0x65,0xee,0x76,0x4f,0x1d,0x92,0x45,0xdb,0x1d,0x01,0x71,0xd5,0xc2,0x69, +0x72,0xcc,0xa1,0xe0,0xd6,0x2c,0xd9,0x94,0x52,0x5e,0xac,0xc5,0x0a,0xb1,0xca,0xc5, +0x6e,0x54,0xe5,0x42,0x4d,0xdd,0xe6,0x5d,0x6e,0x74,0x24,0xe7,0x45,0xe5,0x6a,0x95, +0x9b,0x55,0xd4,0x29,0xc2,0xd9,0x79,0xe3,0x4d,0x78,0x66,0x72,0x79,0x0d,0x47,0xd7, +0xf5,0xc3,0x4e,0xb8,0x63,0xb8,0x2b,0x47,0xee,0xd2,0x4d,0x18,0xf0,0xcc,0xff,0x7d, +0xe3,0x52,0x0a,0x17,0xbb,0x1c,0x29,0xb4,0x25,0x77,0xad,0x95,0xf3,0xdb,0x7f,0x8a, +0x53,0x98,0xde,0x8c,0xcb,0xfa,0xd2,0x8d,0xdf,0x55,0x36,0x86,0x80,0xdb,0x55,0x6b, +0x8d,0x45,0x0a,0xfc,0x7e,0x56,0x9e,0xf0,0xf8,0x75,0x6e,0x3a,0x79,0xe8,0x1d,0x6d, +0xbc,0x64,0xf8,0x04,0x3e,0x92,0xd3,0x8c,0x7d,0x76,0x77,0xab,0xcc,0x0f,0x71,0xe3, +0x74,0x30,0xd7,0x1d,0xbe,0x5d,0x9b,0xf5,0x4e,0xbe,0x60,0xb7,0x7a,0xfc,0x93,0xca, +0x2e,0x5c,0x36,0xcf,0x38,0xfe,0x7e,0xa0,0x68,0x7f,0x89,0x9d,0x2e,0x75,0x52,0xde, +0xa6,0xf2,0xa6,0xdb,0x54,0xfe,0x2a,0xbd,0xad,0xbd,0x81,0x16,0x07,0xb0,0x18,0xb8, +0xbd,0x9f,0x83,0x4b,0xf8,0xbf,0xf8,0xf4,0xc4,0x73,0x77,0x8f,0xfa,0xd2,0xaf,0x47, +0xcc,0x6b,0xeb,0x5b,0xf3,0x4f,0x37,0xff,0x66,0x60,0x00,0x7b,0x90,0xde,0xbf,0x70, +0x08,0x09,0x88,0x00,0x99,0x9f,0xf7,0xe0,0x58,0x02,0x28,0xda,0x56,0x22,0xf4,0x63, +0x4e,0x00,0x98,0x66,0x15,0x0d,0x10,0x34,0xc8,0xfe,0x34,0xab,0xde,0xe7,0x81,0x42, +0x7b,0x2e,0xad,0xe2,0x79,0xc8,0xd1,0xa2,0x4d,0xb4,0xb7,0xa1,0xd6,0x64,0x33,0x15, +0x08,0x6c,0x75,0x91,0xdd,0x31,0x35,0xd6,0x28,0x59,0x98,0xf5,0x9b,0x21,0x81,0xc4, +0x04,0xaf,0x1f,0x45,0x14,0x7e,0x0e,0xc4,0x4a,0xe4,0xf0,0xf0,0x61,0xe1,0xf7,0xa1, +0xa0,0xb5,0x3e,0xc8,0xb2,0xda,0x88,0x16,0xbc,0x3e,0xe7,0xb4,0x4b,0x7e,0x3e,0xc5, +0xf9,0x6f,0x44,0x5a,0xb4,0x20,0x05,0x63,0x1d,0x5d,0x66,0x6d,0xd4,0x86,0x7b,0x96, +0x49,0xd7,0xf7,0x5d,0xb7,0x3c,0xd9,0xf5,0xcd,0x5b,0xef,0x4a,0xcb,0x25,0x38,0xf7, +0x0e,0x52,0x2e,0x93,0x19,0xc8,0x02,0x4a,0x4c,0x64,0x52,0x92,0xf9,0x97,0xca,0x9b, +0x0f,0xcb,0x6d,0x5c,0x15,0x82,0xb6,0xa7,0x48,0xa9,0x5a,0x44,0xa2,0x2b,0x86,0x16, +0xae,0x48,0x43,0x89,0x12,0x44,0xef,0xad,0x84,0x4a,0xc9,0xa2,0xac,0x28,0x1b,0x59, +0xc1,0xf6,0x5b,0x1c,0xaa,0xea,0xdb,0xbd,0x43,0x27,0xc4,0x58,0x24,0x05,0x18,0x4a, +0xb9,0xa5,0xd3,0x2a,0xe5,0x6e,0x8f,0x79,0x4c,0x0e,0x54,0x17,0x5b,0xdc,0x14,0xfc, +0x03,0xa0,0xf0,0xa3,0x1d,0x77,0x12,0x7d,0x20,0x0e,0x83,0x4e,0xb2,0x7d,0x3b,0xc3, +0x8b,0x6e,0x8e,0x39,0x67,0x6f,0x6b,0xed,0x80,0x7e,0xe9,0x85,0x36,0x21,0x48,0x9e, +0x49,0x0f,0x4e,0x42,0xbd,0x29,0x5f,0x0a,0xd7,0x21,0x23,0x75,0x32,0x5f,0xe8,0x1f, +0x21,0x70,0xe4,0x37,0x16,0x3d,0x2d,0xe0,0x64,0x7c,0xeb,0xe7,0xdf,0xdd,0x9c,0xf6, +0xde,0x53,0x2c,0x54,0x2d,0x54,0xd2,0x90,0xcc,0x11,0xb0,0x53,0x1a,0x52,0x5b,0x25, +0xa8,0x09,0x69,0xf5,0x30,0xb4,0x6a,0xe2,0x4f,0xff,0x5b,0x85,0x51,0x32,0x40,0xe5, +0x5c,0x5b,0xb5,0xe5,0x31,0xb5,0x31,0x56,0x9e,0x73,0x99,0x31,0xbb,0x7a,0xfb,0x53, +0x3a,0xc9,0x7f,0x56,0x32,0x75,0x72,0x20,0x72,0x38,0x46,0x17,0xf6,0xf9,0x12,0x74, +0x2b,0xb8,0x73,0x46,0x77,0xe8,0xfc,0x30,0x6f,0xfe,0x85,0xc7,0x75,0x95,0x27,0xc1, +0xa3,0x76,0x05,0x7c,0xf9,0x58,0xea,0x91,0x62,0xd0,0x87,0x53,0x19,0x12,0xc8,0x16, +0x61,0x57,0xaf,0xd5,0x97,0x9a,0x8d,0xf0,0xab,0x74,0xe1,0xb5,0xb7,0xfa,0xd6,0x60, +0x0c,0x55,0x26,0x4c,0x34,0xc3,0xd6,0x64,0x74,0xac,0xde,0x35,0x1b,0x3b,0xce,0x8d, +0x68,0x13,0x7d,0xfe,0xc6,0x94,0x56,0xad,0x6f,0x1b,0x6a,0xfb,0x18,0x7d,0x45,0x72, +0x49,0xe5,0x83,0xa9,0xbe,0x78,0xc7,0x2d,0xae,0x6a,0x81,0x0c,0xfe,0x38,0x8c,0x71, +0x8d,0x56,0x8a,0xda,0x67,0x31,0x7b,0x7e,0x37,0x53,0xfd,0xbe,0xf8,0x6b,0x0e,0xc0, +0xc3,0x8c,0x08,0x1c,0xbe,0x37,0x76,0x36,0x59,0x1f,0x8f,0xdb,0xdd,0x83,0x62,0x23, +0xa2,0x72,0x38,0x3d,0x9a,0xb4,0x18,0x4e,0xe6,0xf0,0x73,0x14,0x97,0x30,0x25,0xcd, +0xa9,0x5e,0x47,0x32,0x9e,0x38,0xef,0x10,0xa2,0x1c,0x47,0xfc,0x9e,0x7a,0x71,0x11, +0x8b,0xb2,0xcb,0xbd,0xb7,0xc4,0xdc,0x66,0x0a,0x89,0xdd,0x1b,0x84,0x5f,0x46,0x0a, +0x07,0xe0,0x18,0xf9,0x12,0x9a,0xd7,0xe2,0x48,0x6b,0xd2,0x2e,0x55,0x80,0xba,0x74, +0xfa,0xc3,0x84,0xed,0xfc,0x4b,0x80,0xcd,0x43,0xfb,0x78,0xc7,0xae,0xa3,0x7f,0xa7, +0x8c,0x99,0x3b,0x78,0x91,0xe1,0xe1,0x22,0xf7,0xd3,0xef,0x83,0xdc,0xa0,0x64,0x67, +0x08,0x08,0xb9,0x64,0x91,0x8f,0xa3,0xb7,0xcb,0x3b,0xe6,0x52,0x28,0x48,0x28,0x46, +0x8f,0x3b,0x16,0xda,0xb7,0x5b,0x12,0x62,0x47,0xfe,0x08,0x14,0xbd,0x25,0x78,0x24, +0x03,0xa9,0xf9,0x30,0xe8,0xe7,0x68,0x05,0x43,0xc1,0x79,0xb6,0x23,0x6e,0x4d,0xa4, +0x6f,0x9c,0xdf,0x4f,0xb2,0xbd,0x51,0x3a,0x2f,0xdc,0xcf,0x53,0x5b,0x40,0x95,0xd7, +0x81,0x50,0xa4,0x23,0x6a,0xe6,0xf3,0x82,0xed,0xe7,0x3c,0x46,0xb3,0x48,0x26,0x95, +0x09,0xcb,0x5e,0x7d,0x00,0x21,0x62,0x48,0x48,0xe4,0xca,0x22,0x5a,0x4a,0x3a,0x7c, +0x09,0xa5,0x2f,0x6e,0x11,0xa0,0xba,0x5a,0x49,0xe5,0x9a,0xd4,0x3e,0xed,0x0f,0xf0, +0x65,0x60,0x23,0x6f,0x84,0x07,0x4c,0x58,0x9c,0x43,0xa6,0x5c,0x7f,0x63,0xd7,0x9f, +0xc1,0x99,0x2f,0xee,0xbb,0x8b,0x44,0x7c,0xcb,0x49,0xda,0xff,0xd9,0xc7,0x5a,0xb5, +0xe7,0x5c,0xbb,0x67,0xbb,0x53,0xb2,0xfb,0x6f,0xc6,0x52,0x1c,0x3c,0x2b,0x15,0x25, +0x77,0x72,0x7a,0xda,0x65,0x07,0x2e,0xfe,0x49,0xaa,0x3a,0x6b,0xf6,0xe7,0x3d,0xa9, +0x82,0x0a,0x23,0x86,0xfb,0x53,0x34,0x9b,0xe8,0x6f,0x8d,0x68,0xed,0x6b,0x51,0xfe, +0x78,0xe1,0x47,0x20,0x5d,0x8f,0x97,0x0b,0x4f,0x49,0x3b,0x8f,0x41,0x4e,0x26,0x7d, +0xcd,0xc0,0x24,0x84,0x3c,0xdc,0xb0,0x53,0x42,0xf0,0x58,0xd9,0x15,0xf4,0x26,0xd2, +0x29,0x3a,0xa8,0x12,0x79,0x50,0xf8,0x77,0x47,0xdc,0xe2,0x12,0x7d,0x51,0x67,0x78, +0xa2,0x72,0xad,0x82,0xdf,0xf1,0xf5,0xb6,0xb8,0x90,0xd7,0xa0,0xf5,0x92,0xfd,0x92, +0x4c,0x03,0xb7,0x96,0x94,0x13,0xbd,0xf0,0x1e,0x7e,0xe9,0xb5,0x22,0x5e,0xe4,0x81, +0x89,0x3f,0xe4,0xe2,0xd7,0xb2,0x7c,0xe7,0x0d,0x97,0x64,0x84,0x89,0xb9,0x74,0x12, +0x75,0x1e,0x9a,0x35,0x96,0xbc,0x1e,0xf2,0x66,0xf7,0x43,0xb1,0xb5,0x35,0x31,0xc2, +0xa0,0x34,0x13,0x26,0x15,0xb0,0x71,0x90,0xfa,0xb8,0x8a,0x63,0x8d,0x9f,0xbd,0xe2, +0x8d,0xd5,0x6b,0xa5,0x84,0x52,0x5d,0xe2,0x0e,0x3d,0x6d,0x91,0x0c,0xb5,0x3c,0x8b, +0x0d,0xf8,0x66,0x9b,0x1e,0xb3,0x35,0xda,0x68,0xd1,0x33,0xde,0x78,0xf3,0x39,0x1e, +0x2b,0x1d,0x90,0x93,0x5c,0xd9,0xae,0xdc,0x92,0xc2,0xe6,0x9f,0x7b,0x19,0x79,0x2f, +0xa4,0x81,0x23,0x7e,0x9a,0x9a,0xb7,0xe8,0x17,0xc1,0x25,0x2b,0xb0,0x1b,0xd0,0xe8, +0xbd,0xf5,0xf7,0xb6,0x8e,0xea,0xad,0xdd,0x60,0x2d,0xef,0xcf,0xf5,0xf0,0xa6,0x6d, +0xa1,0x15,0x1e,0x2c,0xc1,0xfd,0x66,0x9c,0x26,0x77,0xa9,0x8b,0x83,0x90,0xef,0xa5, +0x4e,0x99,0x6e,0xdc,0x7c,0xa6,0xbe,0x22,0xb3,0x29,0xfd,0xef,0xfa,0x6d,0x47,0x59, +0x26,0x96,0x27,0x9f,0xc2,0xb6,0xa7,0xea,0x6e,0x7e,0x95,0xe7,0xda,0xfd,0x0d,0xcc, +0xac,0xff,0x59,0xb9,0x9c,0xff,0xaf,0xc4,0xc9,0x9e,0x3f,0x56,0xa8,0xbe,0xa8,0x31, +0xe1,0x1b,0x07,0x66,0xd1,0xaa,0x28,0xd3,0x5f,0x46,0x77,0xe4,0x14,0x7b,0x76,0x49, +0x84,0x60,0xba,0xfd,0xdf,0x4e,0x9f,0xc1,0xe2,0x11,0x60,0x14,0x5f,0xd1,0x34,0xe7, +0x05,0x43,0x06,0xf4,0x33,0x23,0x31,0x0a,0x61,0xc8,0x54,0x43,0xe3,0xb2,0x77,0x49, +0xb2,0xe6,0xb7,0xf7,0x8b,0x4c,0x2b,0xb3,0x23,0xd1,0xbf,0x44,0xf0,0xce,0xd7,0xa8, +0x90,0x49,0x81,0x22,0x21,0x44,0xd2,0x86,0xa9,0xde,0xee,0x59,0x98,0x4d,0xdb,0xa8, +0x03,0x47,0xfa,0xab,0xe7,0x2a,0x4a,0x61,0x70,0x57,0x3f,0xb4,0x57,0x2b,0xbe,0xbd, +0x82,0xb3,0x39,0xb4,0x31,0xd5,0x31,0x63,0x60,0x4b,0xd9,0x70,0x3b,0x97,0xc5,0x23, +0xb0,0x11,0x09,0xb9,0x50,0x65,0xa1,0xf3,0x43,0x7c,0xcf,0xf7,0x53,0xbf,0xfa,0x4e, +0x56,0x44,0xb8,0xe4,0xac,0x67,0x6a,0x6e,0x1e,0x4e,0x8c,0x6b,0x92,0xa1,0x72,0xe9, +0x55,0xf6,0xd1,0x1e,0x62,0x87,0x7a,0x3a,0xa1,0x44,0x82,0x2f,0x3c,0x6a,0x13,0x8b, +0x62,0x25,0x58,0x13,0xe7,0x64,0x33,0x1f,0x69,0x95,0xdb,0x28,0x10,0xa3,0x6b,0x1b, +0xce,0x06,0x56,0x3d,0x9f,0x10,0x64,0x47,0x22,0xa1,0xa5,0x4c,0x54,0xcd,0xba,0xa0, +0xd6,0x41,0xc8,0x10,0x98,0x24,0x6a,0xed,0x44,0x2e,0xea,0x2b,0x54,0x6d,0xdd,0xdc, +0x06,0x80,0x7b,0xde,0x39,0x4d,0x59,0x9a,0xea,0x46,0x3a,0x7c,0xdb,0xed,0xbc,0xb5, +0x8a,0xbb,0x36,0x3f,0x39,0x62,0x19,0xf4,0x48,0xc9,0xeb,0x79,0x7e,0x3e,0x12,0x46, +0x2c,0x4d,0xb3,0xb5,0xc7,0x62,0xdf,0x89,0x97,0x40,0x6b,0xf9,0x5d,0x6f,0xd9,0x10, +0x5b,0xef,0xfa,0xf4,0x91,0xbc,0x5e,0xbd,0x8b,0x53,0x82,0xd4,0x9b,0xfa,0x7a,0x6d, +0xc2,0x6a,0x74,0x16,0xb1,0x78,0x18,0x32,0xe1,0xa9,0xbc,0x9e,0xd0,0xfd,0xc5,0x78, +0x8b,0xc9,0xcf,0x98,0x83,0x40,0x4d,0xa4,0x8b,0x51,0x55,0xe8,0x61,0x74,0x0b,0xe3, +0x5a,0x51,0xb5,0x30,0x37,0x51,0x25,0xe3,0xa2,0xa3,0xd7,0xa8,0xc2,0x65,0x7a,0x10, +0x49,0x1b,0x9a,0xa6,0x3c,0x56,0x34,0xe2,0xd1,0x59,0xb4,0xe6,0x47,0x79,0xa9,0xa3, +0x80,0x5a,0xce,0xf2,0x35,0x73,0xa7,0x12,0xe1,0x51,0xe4,0x0f,0x86,0x6e,0x47,0xf3, +0x5d,0x0d,0x8f,0x78,0x90,0x3b,0x1f,0xfc,0x60,0x31,0x2e,0x67,0x72,0x4f,0x4c,0xae, +0x04,0xba,0x4b,0x57,0x33,0x8c,0x20,0x93,0x22,0xdd,0xde,0x13,0x0a,0x67,0x59,0x69, +0x5f,0xc4,0x32,0xee,0x9c,0x95,0x14,0x40,0xd8,0x17,0x6e,0xce,0x3b,0x88,0x34,0x63, +0x2f,0xa2,0x54,0x9d,0x0a,0x4b,0x06,0xac,0x94,0x37,0xff,0xda,0x5a,0x19,0xd8,0x9f, +0x97,0xba,0x67,0x91,0x8b,0xce,0xaf,0x56,0x89,0x7a,0xce,0xb2,0x5f,0x61,0x53,0xeb, +0x9a,0x29,0x37,0x62,0x98,0x5b,0x79,0x19,0xe8,0x9b,0xc5,0xac,0x5e,0x60,0x8a,0x39, +0x89,0x9c,0xfe,0x69,0xbc,0x6c,0xd1,0x6a,0xc4,0xc3,0x2e,0x6e,0xfa,0xf6,0x36,0x3e, +0x3b,0xe0,0xee,0x30,0x9a,0x92,0x66,0x28,0x37,0x5b,0xfe,0x39,0xda,0xd6,0x75,0x36, +0xba,0xb3,0x97,0xc1,0xdc,0x38,0x2f,0x6b,0x6a,0x61,0xef,0x1e,0xed,0x78,0xb7,0x5b, +0x2b,0x27,0xd3,0xfa,0x1a,0x24,0xab,0x06,0x48,0xd2,0xd6,0xfd,0x10,0x47,0x0a,0xd2, +0x58,0x00,0x34,0xfa,0xc1,0x5b,0x0f,0xd1,0x57,0xc6,0x2a,0x66,0x58,0x44,0x12,0x90, +0xef,0x16,0x5e,0xfb,0x43,0xe3,0xe7,0xd4,0xac,0xdb,0xae,0x56,0x17,0x4e,0x41,0xb0, +0x22,0x8d,0xea,0xff,0x14,0x19,0x11,0x14,0x65,0xd9,0xaf,0x87,0x3d,0xe1,0x51,0x55, +0xdd,0x98,0xf4,0x32,0x17,0xa7,0x37,0xe6,0xe6,0x53,0xe9,0x24,0xf4,0xec,0xfb,0xa0, +0xef,0xee,0xfa,0x42,0x37,0x3f,0x10,0x60,0xfa,0xc9,0x2f,0x16,0x21,0xe4,0x4e,0xb0, +0x4c,0x2a,0x92,0xa9,0x95,0xa1,0x8c,0x89,0xe4,0xc3,0x7f,0x10,0x36,0xa5,0x47,0x93, +0x25,0x03,0x81,0x45,0xea,0xab,0x5b,0xb3,0x9a,0xc0,0x31,0x8a,0xa4,0xfd,0xa3,0x02, +0xcc,0x8c,0x7a,0x35,0xea,0xac,0x59,0x5c,0x66,0x4d,0xa1,0x73,0x7f,0x87,0xc3,0xfc, +0x1c,0x47,0x3a,0x6c,0x5f,0x5a,0x8a,0xca,0x54,0x63,0x90,0xc6,0xcc,0x27,0x4a,0xa9, +0xca,0x86,0xe0,0x83,0xf6,0x60,0x45,0xca,0x41,0x86,0xc4,0xfb,0x6e,0x8b,0x5d,0x47, +0x67,0xf2,0xdd,0x7e,0x30,0xa7,0xfd,0xb6,0xa7,0xd0,0x8d,0x5e,0xb4,0x23,0xf0,0xa8, +0xf2,0xf5,0x1f,0x7d,0xde,0x5b,0x5b,0x39,0x90,0xc6,0x43,0xd7,0xc3,0xa6,0xe2,0x4b, +0x29,0xe2,0xe5,0x2c,0x10,0xea,0xf5,0xe8,0xac,0xcc,0x92,0x6c,0x6f,0xe1,0x54,0x8b, +0xcd,0x0d,0xd2,0x19,0x11,0xcf,0x42,0x28,0x0c,0x3d,0xc2,0x85,0xaa,0x42,0x5d,0x9f, +0x4c,0x13,0x23,0xef,0x98,0x6e,0x0b,0xe9,0x4e,0xd1,0x08,0xed,0x5e,0x07,0x63,0x5f, +0x87,0xc4,0x0b,0x4e,0x1d,0xab,0x1b,0xcc,0xd1,0xc0,0xe8,0x04,0x34,0x5e,0xdc,0x6a, +0x78,0xdd,0xfd,0x99,0x70,0xb1,0x0a,0x02,0x24,0xcb,0x13,0xc0,0x57,0x90,0x20,0x67, +0xa0,0xd3,0xba,0xe7,0xde,0x18,0x8d,0xd0,0x44,0x51,0x9c,0xef,0xd4,0x93,0x3f,0x87, +0x87,0xd2,0x26,0x8e,0x5d,0x7b,0x04,0x45,0x66,0xd6,0xef,0xaf,0x53,0xf4,0x85,0x82, +0x44,0x88,0x97,0x64,0xd0,0xb5,0x05,0x5b,0x2f,0x9c,0x79,0x32,0xb6,0x01,0x5c,0x3c, +0xa4,0x90,0x47,0x30,0xb4,0xb0,0x14,0x51,0xc1,0xdb,0xad,0x61,0x97,0xbb,0x66,0x7f, +0xa5,0x91,0x58,0xb4,0xdc,0x44,0x36,0xef,0xe5,0x52,0x9c,0xf4,0xe5,0xf8,0x6c,0x2b, +0x91,0xd4,0x35,0xa5,0x5d,0x67,0x15,0xe0,0xf2,0xdb,0xf4,0x94,0xe1,0xb9,0xe0,0xb1, +0x50,0x91,0xbd,0xd6,0xe1,0xb6,0x79,0x11,0x46,0x7c,0x02,0x1f,0xf2,0x7a,0x26,0x6c, +0xcd,0x9e,0x86,0xf2,0x9d,0x67,0x6f,0x3c,0x8d,0x97,0xe6,0xcc,0x6c,0x5c,0xb5,0x17, +0x2b,0x22,0xd0,0xfe,0x0e,0x69,0x5e,0xb8,0xbb,0xd4,0x29,0xbc,0x39,0x5d,0x03,0xd7, +0x0f,0xd8,0x63,0x0a,0xff,0x48,0x36,0x5b,0xed,0x95,0x7b,0x93,0x34,0x70,0x3e,0x19, +0x2d,0x03,0x91,0xef,0x1a,0xd7,0x15,0x6b,0xb1,0xd2,0xf5,0x83,0x35,0x91,0x46,0x86, +0x1d,0x27,0x61,0x43,0xd7,0x6d,0x0e,0xe6,0x8e,0xd3,0x0e,0xe6,0x83,0xb3,0xd9,0x5e, +0x00,0x83,0xac,0xa8,0xc0,0x10,0x54,0x2a,0x33,0xdb,0xfd,0x8d,0x0f,0xb2,0xa7,0x9b, +0x90,0xd2,0x0b,0x5c,0x97,0xb6,0x17,0xe8,0xfa,0xd3,0xa7,0xfa,0xc3,0xe5,0x55,0x28, +0x8a,0x84,0x7c,0x40,0xbc,0x0f,0x09,0x55,0x4c,0xc4,0xfe,0x8c,0x87,0xb0,0x60,0x02, +0x79,0x0d,0xd9,0x95,0xb7,0x62,0xd0,0x3d,0x74,0xbd,0x4b,0x46,0x91,0xea,0x92,0xf2, +0x83,0x05,0xed,0x90,0x0e,0xdc,0xdc,0x6e,0x4f,0x5f,0x20,0x73,0x93,0xc1,0x4b,0x1c, +0x02,0xd6,0x1b,0x9d,0x96,0x08,0x48,0x25,0x15,0x2e,0x16,0xcd,0xd6,0x2d,0x39,0x73, +0xc2,0xf3,0x49,0xe5,0x3e,0x38,0x64,0xc2,0xd6,0xbc,0xd1,0x30,0xb2,0xc3,0x5e,0xc4, +0x28,0xda,0x7d,0x74,0x16,0xa3,0xb1,0x62,0xf2,0x40,0xd8,0x71,0xc0,0x6e,0xeb,0x2c, +0xa2,0x69,0x5c,0x71,0x5a,0x61,0xf1,0x72,0x6d,0x71,0x48,0x33,0xc1,0xda,0x81,0x85, +0xab,0x00,0xc3,0x45,0x91,0xd3,0xb8,0x63,0x67,0x42,0x53,0xb6,0x71,0x29,0x2f,0x30, +0xb0,0x95,0x5d,0xd7,0xc7,0x5e,0xf9,0x7f,0x4f,0xda,0x5e,0xa6,0x70,0x3a,0x7c,0xa8, +0x87,0x8e,0x01,0x6a,0xe3,0x6d,0x4b,0xaf,0xa9,0x07,0x6a,0xae,0xd8,0xb3,0x5a,0x0c, +0x8b,0x0d,0xaa,0xe3,0xf0,0x40,0x13,0x03,0x50,0x52,0xa2,0x0d,0xf8,0x72,0x81,0x49, +0x84,0xa1,0x47,0x7f,0xb6,0xa2,0x12,0x56,0x6f,0xdf,0xab,0xfd,0x84,0xcb,0xff,0x7b, +0xa8,0x09,0xa1,0xb8,0xb7,0xa1,0x93,0x5f,0x3e,0x5b,0x8b,0xdb,0x5b,0x6f,0xba,0x3a, +0xf5,0x4e,0x1e,0xe3,0x12,0xec,0xab,0x1a,0xc4,0x29,0x42,0x2a,0x91,0xf1,0xa2,0x67, +0x2f,0xe0,0xf2,0x78,0x18,0x6d,0x71,0x2b,0xc7,0xd1,0xb4,0x0e,0xd6,0xdb,0x1c,0x7a, +0x0f,0x6e,0xe6,0x4b,0x0e,0x4a,0x7a,0x3a,0x4e,0x52,0x83,0x1a,0xc2,0x29,0x4e,0xaf, +0x9b,0xf1,0x75,0x79,0x25,0xf0,0x23,0x5e,0x5a,0xe3,0xa4,0x0f,0x09,0xf0,0x6d,0x6b, +0x1b,0x96,0x44,0x7c,0xad,0x72,0xac,0x40,0x78,0x4b,0x69,0x20,0x7d,0xa9,0x6c,0x92, +0x85,0x1c,0x08,0x64,0x39,0x3e,0x1d,0x40,0x4e,0x1e,0xa4,0x4a,0x77,0x73,0xf9,0xff, +0xba,0x7d,0xde,0x6a,0x32,0x31,0x16,0x51,0xee,0x1d,0xfd,0xc7,0x0f,0x7c,0x15,0xf9, +0xa7,0x9b,0x9d,0x99,0xb5,0x1f,0x0d,0x80,0xf5,0x55,0xb2,0xaa,0xd8,0x75,0x41,0x26, +0x32,0xea,0xc4,0xed,0xcf,0x80,0xf5,0xe7,0x93,0x0b,0xee,0x7b,0x8d,0xf9,0xec,0xca, +0xaf,0x78,0xb4,0xf0,0xd2,0xa9,0xfc,0xba,0xb2,0xf9,0xa4,0x1e,0xdf,0x78,0xbc,0xc3, +0x81,0x02,0xbd,0xd7,0x4d,0x83,0x6d,0xc6,0x73,0xfa,0x36,0x1b,0xd6,0xda,0x48,0x33, +0x0f,0xe9,0xb4,0x24,0x10,0x27,0xf9,0xab,0x40,0x32,0xcc,0x17,0x3a,0x78,0x48,0x8a, +0x60,0x74,0xc2,0xac,0x38,0x78,0x36,0xd9,0xc9,0xf7,0xb6,0x41,0x7e,0x10,0x67,0x73, +0x12,0x71,0x36,0xec,0x3d,0x32,0x89,0x3c,0x64,0xb0,0xb6,0xde,0x84,0x75,0xd3,0xd7, +0x86,0xc6,0xab,0x0c,0x8b,0xca,0x84,0x8e,0x49,0xf5,0x8d,0x29,0xb9,0x68,0xf3,0xe7, +0xb3,0x74,0x0f,0xde,0xb3,0x3d,0xa8,0x85,0xef,0xd3,0xa7,0x39,0xf4,0xe7,0xbf,0xca, +0x4b,0x28,0x79,0xf1,0xc5,0xe1,0x7f,0xbb,0xee,0x40,0xaf,0x9f,0xfe,0xde,0xfa,0x2e, +0x3b,0xe3,0xb5,0xa2,0xe1,0xa0,0xb1,0x96,0xbc,0x40,0x7a,0x9e,0x49,0x72,0xe7,0xc7, +0x26,0x13,0x13,0x33,0x4b,0x5d,0x7c,0xba,0x66,0xc2,0x77,0x0d,0xfe,0xdc,0xb6,0xdb, +0xb8,0x2b,0xae,0x9d,0xf3,0xa0,0x7f,0x36,0x73,0x1b,0x4f,0x52,0xf3,0x7d,0xe0,0x52, +0x4f,0x84,0x88,0x5b,0x55,0xa3,0x88,0xdd,0x42,0x30,0x90,0x44,0xd6,0x34,0xfc,0x4c, +0x96,0xbe,0xf7,0x9f,0x26,0xd3,0x00,0xc9,0x36,0xc1,0xda,0x3a,0x56,0x81,0x27,0x44, +0xaa,0x5e,0x5c,0x38,0xb5,0xe0,0xa0,0xa1,0x44,0xa8,0x67,0xc5,0x75,0x8e,0x57,0x5a, +0x51,0x9b,0x11,0x37,0xc1,0xb3,0xf9,0x2e,0xb7,0xd8,0xe3,0xc8,0x76,0xe5,0x99,0x40, +0x43,0x69,0x60,0x21,0x32,0x90,0xd0,0x28,0x97,0x68,0x4b,0xc6,0xbb,0x46,0x91,0x50, +0x71,0x91,0x0c,0x72,0xea,0x11,0x93,0x05,0xc7,0x75,0x1f,0x89,0xb6,0x33,0x64,0xa5, +0x96,0x78,0x41,0x49,0x1a,0x2b,0xd5,0x39,0x19,0xfb,0x01,0xb4,0x37,0x8a,0xc9,0x49, +0x0b,0x6a,0x91,0x65,0x27,0xa8,0x5c,0x75,0x53,0xa3,0x02,0xf3,0x8b,0x74,0x42,0x08, +0xaa,0x85,0xdc,0x5f,0xa0,0x21,0xba,0x54,0xeb,0xd8,0x92,0xc2,0x5a,0x80,0x64,0x18, +0x45,0xe5,0xd4,0x4f,0xa1,0x20,0x88,0xf6,0x7e,0x79,0x92,0x5c,0xa0,0xe5,0x3b,0x8f, +0x8a,0x02,0x99,0xf4,0x1c,0x6a,0x8c,0xcd,0xff,0x2c,0xa9,0xab,0x9d,0xf8,0xff,0x45, +0xa3,0x57,0x9c,0x7f,0x61,0xa2,0x83,0xdb,0xc9,0xd9,0x83,0xbb,0xd0,0x77,0x67,0xa8, +0xa2,0x72,0x4d,0x54,0xbd,0x29,0x48,0xed,0xe2,0x03,0x5e,0x1c,0x84,0x53,0x6f,0xac, +0x1f,0x73,0xd8,0x62,0xe8,0xec,0x83,0x51,0xec,0x70,0x7e,0xfa,0x03,0x7e,0x9a,0x49, +0xa8,0xe3,0xf2,0x11,0x46,0xa1,0x72,0xb4,0x75,0x53,0xc9,0xf5,0x2d,0xea,0x92,0x59, +0xbc,0xe2,0x98,0x5f,0x83,0x78,0x86,0x5f,0x57,0x8b,0xab,0xac,0x93,0x83,0x04,0x52, +0xa6,0x94,0x84,0x7e,0x95,0x3c,0xf5,0xe0,0xc5,0x2d,0x49,0x22,0x79,0x29,0xab,0x10, +0xf1,0x58,0xf5,0x02,0x92,0xbc,0x17,0x5d,0x63,0xb9,0x84,0x48,0x73,0xf3,0x3a,0xe1, +0x65,0x18,0x61,0x02,0xf7,0xd2,0x1d,0xc1,0xe2,0xba,0xdd,0xc5,0x0b,0xfc,0x55,0x11, +0x25,0xb4,0xe7,0x2a,0x86,0x92,0xa6,0x71,0x44,0x2c,0x92,0x5f,0x21,0x0e,0xc4,0xcc, +0xaa,0x99,0x5f,0x5d,0xc1,0x44,0xd5,0xe5,0x87,0xb2,0xca,0xe0,0x4e,0x5b,0x95,0xd0, +0x76,0x91,0x47,0x2d,0x13,0x08,0x01,0xf0,0xb6,0xc1,0x82,0xf1,0xd6,0x5a,0xd1,0x25, +0xb6,0x68,0x8b,0x25,0x0f,0x3b,0xc1,0x05,0xf6,0x28,0x55,0x94,0x7a,0xa5,0x85,0xd1, +0x10,0x93,0x94,0x24,0x14,0x6a,0x05,0x8c,0xc6,0xf7,0x85,0xd0,0x56,0xb6,0x1e,0xea, +0x21,0x95,0x5e,0xe8,0x57,0xb7,0x5e,0xc8,0x9b,0x9a,0x4c,0x52,0xd2,0x03,0x23,0xa4, +0x3c,0x66,0xa8,0x8c,0xbf,0x6d,0x81,0x5c,0xe0,0x74,0xbe,0xcc,0x86,0xbb,0x79,0xc3, +0xac,0x35,0x23,0xbd,0xd7,0xb5,0x77,0xf0,0xdf,0x58,0x2d,0x42,0x3a,0xa1,0x74,0x9b, +0xd6,0xfb,0xf7,0x7d,0x3f,0xbf,0xa8,0x28,0x99,0x2a,0x65,0xa0,0xfb,0xa0,0xcc,0xc8, +0xed,0x98,0xc4,0xee,0xb9,0x2e,0xf5,0xb6,0x4f,0xb0,0xbe,0xe7,0xc7,0x5d,0xba,0xd8, +0x2d,0x99,0x96,0xd6,0xc2,0x4c,0xfe,0x48,0x2f,0xdd,0xff,0x88,0x5b,0x8a,0x7a,0xc9, +0x09,0x9a,0x1c,0xf4,0x1d,0x15,0x56,0x09,0x17,0x5f,0x57,0x05,0x3a,0xf1,0xdd,0xd9, +0x1a,0x9b,0x10,0xa4,0x91,0x00,0x37,0x50,0x04,0x9b,0x04,0xf3,0x46,0x5e,0xa0,0xea, +0xa5,0xaf,0xfd,0xea,0x34,0x3b,0x3f,0x89,0xb7,0xcd,0xf9,0xc7,0x74,0x7d,0x36,0x17, +0x35,0xae,0x33,0xb1,0xe6,0x9c,0x0f,0x6e,0x2b,0x4e,0x4c,0xcb,0xa4,0x02,0x79,0x09, +0x25,0x43,0xc0,0x7a,0xec,0xdd,0x42,0xdb,0x75,0xc7,0x89,0x38,0x2d,0x0e,0xad,0x7a, +0x0f,0xac,0x5d,0xee,0x60,0x40,0x66,0x43,0xb3,0xdc,0x62,0x4e,0xff,0xdc,0x6e,0x47, +0x93,0xa8,0xbe,0x42,0x71,0xc3,0xf4,0x02,0x52,0xbb,0xa8,0x9a,0xaf,0xc5,0x66,0x57, +0xca,0x0a,0xf6,0x68,0x7b,0x28,0xf8,0x02,0x21,0x82,0x23,0x50,0x28,0xa5,0xe1,0x0b, +0x21,0x63,0x12,0xb6,0x1e,0x67,0xe9,0x51,0xdc,0xe9,0xe9,0x9a,0x27,0x05,0x67,0x56, +0x12,0xab,0xdb,0x75,0x78,0x63,0x27,0x76,0x62,0x06,0x6e,0x69,0xa4,0x67,0x7a,0x2f, +0xb1,0x6e,0xf9,0x47,0x36,0x14,0x82,0xd9,0xeb,0x58,0xa9,0x89,0xab,0x76,0x4e,0x6b, +0x8d,0x38,0xb7,0x92,0x18,0xc9,0x8d,0xc7,0xbc,0x2a,0x9b,0x4a,0xa2,0x79,0x93,0xe3, +0x36,0x2a,0xc3,0xda,0xd0,0x5c,0x4d,0x2f,0xc8,0xb7,0xef,0x09,0x3d,0xf5,0x75,0x1f, +0x60,0x6f,0xb0,0x92,0x6a,0x16,0xe0,0x62,0xe7,0xf7,0x21,0xc3,0xc9,0xa6,0xe2,0x02, +0x2e,0x02,0xf8,0xfc,0xf4,0x83,0xad,0x98,0x5c,0xed,0x89,0x6c,0x5c,0x9c,0xae,0xbe, +0x1b,0x86,0xf2,0xa3,0x68,0x2d,0x08,0xce,0xa0,0x29,0x36,0xe3,0xaa,0xbb,0xe7,0x8b, +0x0e,0x83,0x67,0x2f,0x6d,0x4b,0xd2,0x9a,0x4e,0xc3,0x42,0x85,0xfc,0x23,0x4f,0xde, +0x2c,0x1f,0x94,0x58,0x9d,0xdf,0x63,0x5d,0x6a,0xb0,0x4b,0x95,0xb5,0xe4,0xfc,0xa4, +0x91,0xe4,0x02,0x0b,0xc1,0x66,0xfe,0xd2,0xb5,0x2f,0x95,0xdf,0x97,0x60,0x74,0xa2, +0x51,0x8e,0xb3,0x1b,0xca,0xac,0x37,0x5b,0xd1,0x15,0x66,0x90,0x80,0x7e,0x7d,0xb3, +0x71,0x66,0xbc,0x0e,0xb1,0x62,0x2f,0xfa,0x57,0xdf,0x2e,0x53,0xe0,0x8f,0x30,0x8f, +0x02,0x96,0x6c,0x6f,0x00,0x05,0x8d,0x1b,0xe1,0x7f,0x29,0xce,0x52,0x16,0x84,0x30, +0x2a,0x72,0xbb,0xaa,0x40,0xab,0x42,0xec,0x89,0x10,0xee,0x54,0x98,0xdb,0xa8,0x3a, +0x40,0x35,0x6c,0x24,0xdf,0xe6,0xf8,0xd4,0xbd,0xaa,0xe6,0x0e,0x88,0xaa,0x1d,0xd8, +0x0e,0x73,0x9f,0xa5,0xce,0x99,0x6f,0x51,0x04,0xf9,0x71,0xc1,0xcd,0x44,0xa9,0x22, +0x27,0x03,0xb3,0xd2,0x97,0x5b,0x67,0x63,0xe3,0x2b,0x24,0x1e,0x40,0x37,0x15,0x72, +0xbc,0x17,0xff,0x91,0xf3,0x37,0x63,0xa8,0x73,0x0f,0x2d,0x4e,0xd4,0x85,0xb7,0x86, +0x8a,0x9c,0xb4,0xc6,0x8e,0xb4,0x66,0xaa,0xb4,0x85,0x9f,0xc7,0xde,0x69,0x38,0xbb, +0xd8,0x85,0x6e,0xff,0x61,0x45,0x17,0x90,0x19,0x2e,0xef,0x89,0x09,0x35,0x20,0xb3, +0x0a,0x6f,0xa6,0x76,0x9d,0x46,0x30,0x43,0x00,0x54,0x24,0x5b,0xe9,0x86,0xe2,0xba, +0x05,0x97,0x9c,0xcd,0xe4,0x74,0xe9,0xa7,0xdd,0xd1,0x96,0xa8,0xf8,0x9b,0xf1,0xff, +0x87,0x78,0xf6,0x59,0x35,0x5f,0x25,0x03,0x9c,0x1f,0xe6,0x17,0xd7,0x70,0xc7,0x4e, +0x9b,0x17,0x17,0x4f,0x3a,0x95,0x2a,0x03,0x16,0xef,0x37,0x8f,0x49,0x1b,0x6f,0x06, +0x40,0x5b,0x85,0x40,0x9f,0x80,0x1f,0xbd,0xd4,0x5d,0x26,0xda,0x5a,0x00,0xf1,0xf1, +0x88,0x9d,0x41,0xed,0x48,0xbe,0x1b,0x87,0x95,0x6c,0x4f,0x02,0xf5,0x7f,0x50,0x36, +0x06,0xb1,0x92,0x4c,0xaa,0xe0,0xdd,0x49,0xd3,0x5c,0x80,0xc8,0xf9,0xec,0x59,0x70, +0x27,0xe7,0x99,0x75,0x0d,0xfd,0x91,0x86,0x0d,0x86,0x05,0x45,0x2f,0x87,0x14,0x22, +0x01,0x9f,0xf7,0xf5,0x97,0x5e,0x5c,0x40,0x41,0xd5,0x46,0x13,0x34,0x85,0x3a,0x46, +0x88,0xcb,0x71,0xdf,0x10,0x54,0x4e,0x57,0xa6,0x45,0x74,0x80,0x65,0x67,0x90,0xa2, +0x47,0xee,0xd0,0x66,0x37,0x0a,0x00,0xc2,0xbb,0x6a,0x80,0xf4,0xb9,0x57,0x60,0xb3, +0x8a,0xe0,0x85,0x34,0xee,0x07,0x69,0x90,0x42,0x6b,0x09,0xe5,0x38,0xed,0x5b,0x62, +0x03,0x28,0x49,0x25,0xf5,0x40,0xdd,0x0c,0x64,0x4c,0x81,0x05,0x55,0x00,0xd8,0x02, +0xe8,0x87,0x35,0xf1,0xe9,0xcb,0x3a,0x32,0xa7,0x8c,0xc9,0xde,0x54,0x8e,0x17,0x2b, +0x89,0x95,0x81,0xbb,0xcc,0xb5,0xdb,0xc1,0xbc,0xff,0x41,0xce,0x51,0x8f,0xb3,0xa4, +0x7b,0xba,0x58,0x74,0xb2,0x15,0x88,0xa4,0x3b,0x77,0xcc,0xdf,0xd8,0x8c,0xd3,0x68, +0x2e,0x9b,0x7f,0x55,0x9f,0x45,0x40,0x26,0x06,0xc4,0x44,0x1b,0x2c,0x24,0xc2,0x39, +0xad,0x2f,0x9c,0x49,0x3a,0x5d,0xa2,0x5b,0x22,0x63,0xae,0x8c,0x3d,0x8c,0x02,0x5d, +0x8c,0xc9,0x39,0xad,0x93,0xa0,0x04,0x7d,0xee,0x32,0x02,0x5a,0x3c,0xae,0xc7,0xb8, +0x02,0xcf,0x9d,0x49,0xfd,0x4b,0xd3,0x19,0xac,0x69,0x0b,0x1d,0xed,0xe6,0x12,0x29, +0x01,0x84,0x12,0x78,0x3e,0x1e,0xeb,0x99,0xac,0x99,0xed,0x4a,0x34,0xab,0x5c,0xb0, +0x5c,0x0c,0x43,0x75,0x97,0xed,0x99,0x49,0x57,0xc2,0x4c,0x82,0xc4,0xb4,0x11,0x8d, +0x86,0x14,0xcb,0xd2,0x96,0xac,0xe8,0x4c,0x9c,0xb2,0x18,0x74,0xf1,0xb3,0x74,0xb2, +0x07,0x2d,0x46,0xc3,0x17,0x8f,0x8a,0x9e,0x1b,0x0f,0x93,0xa0,0x57,0xfc,0x3e,0xc8, +0xcf,0x9c,0xce,0xc6,0x16,0xf2,0x42,0xc9,0xcb,0x4c,0xf9,0x5c,0xf3,0xd1,0x5e,0x72, +0xc0,0x3b,0xba,0x24,0x76,0x19,0x4e,0x0c,0xdd,0xcb,0x64,0x0e,0x50,0xb9,0x93,0xb4, +0x47,0xe3,0x92,0xd0,0xde,0xba,0x47,0xb8,0xfe,0x68,0x07,0x89,0xf8,0x23,0xc1,0x2b, +0xc2,0x9b,0x74,0xf5,0xd6,0xeb,0xb5,0x63,0x3f,0xca,0xab,0x05,0xfa,0x72,0x13,0xd5, +0x46,0x14,0xbf,0x95,0x5c,0xd3,0x50,0xbd,0x12,0x8b,0x6d,0xb0,0x1e,0xe6,0x5d,0xe5, +0xf8,0x97,0x9f,0xee,0x60,0x25,0x8b,0x0f,0xd3,0xda,0xcb,0x2a,0x76,0xc7,0x93,0x85, +0x8e,0x1c,0x6a,0x65,0xc8,0xdb,0x3c,0xd5,0xf7,0xa6,0x62,0xcc,0xf3,0x9c,0x15,0x75, +0x14,0x95,0x0b,0x0a,0x4f,0x07,0xd9,0xae,0x76,0xd2,0x77,0x2e,0x47,0x77,0x80,0xc8, +0x0e,0x4a,0x54,0xe0,0xb3,0x44,0xb8,0x71,0x04,0x56,0x91,0xb8,0x34,0xf4,0x94,0x39, +0xa2,0x91,0xdc,0x2c,0x92,0xfd,0xdb,0x95,0xf3,0x9d,0xec,0xec,0xbc,0xf8,0x7c,0x57, +0xc4,0xd9,0xdc,0xef,0x51,0x26,0x81,0x89,0x53,0xbe,0x3a,0x2e,0x01,0x22,0xf7,0x23, +0x9e,0xd3,0xda,0x3e,0x1d,0x4e,0x49,0xd3,0x86,0xd3,0x67,0x9c,0xaa,0x9c,0x55,0x6b, +0x49,0x30,0xef,0x20,0x4e,0x1c,0x84,0x0b,0xcf,0x2e,0x40,0xdb,0x00,0x93,0x3e,0x08, +0xde,0xaf,0xd2,0x3b,0xfb,0x44,0xef,0x52,0x82,0x40,0xf2,0x24,0xbb,0xe3,0x76,0xbd, +0x25,0xac,0x18,0x2b,0x45,0xac,0x20,0x01,0xe0,0xc0,0xa6,0x19,0x39,0x62,0x52,0x73, +0x42,0x02,0x3e,0xe7,0xd8,0xc3,0x81,0x52,0xf4,0xe3,0xcb,0xaa,0xac,0x23,0xd8,0x9e, +0x34,0x8a,0x65,0xef,0x6a,0xfc,0x9c,0xc2,0x45,0xce,0xe7,0x33,0x30,0xc0,0x72,0x64, +0xeb,0xb5,0xe1,0x32,0x72,0xdb,0x12,0x5f,0x2b,0x06,0x8e,0xb9,0x52,0x23,0xd8,0xd2, +0xed,0xd7,0x33,0x6f,0x32,0xbe,0xe7,0x96,0xbf,0x8c,0x30,0xf5,0xd4,0x05,0x21,0x7d, +0x7a,0x60,0x3e,0x37,0xf0,0xd9,0x0e,0xb0,0xf1,0xe6,0x54,0x8d,0x0a,0xa6,0x71,0xae, +0x6a,0x17,0xc9,0xd1,0xcf,0x76,0x99,0x89,0xe4,0x5c,0x63,0x32,0xe0,0x93,0x22,0xe2, +0xe1,0x3b,0x02,0x8d,0x47,0x2e,0x40,0x9e,0xa3,0x2c,0x03,0xdf,0xd4,0x65,0xb9,0xb0, +0xf5,0x3a,0xf2,0x0d,0xf9,0xa8,0x24,0x14,0x21,0x44,0xca,0xcf,0xdd,0xe4,0x19,0x0b, +0x1a,0x4b,0xf1,0x0d,0x39,0x81,0x29,0xcb,0x64,0x0b,0x03,0x5e,0xa0,0xcb,0xcb,0x04, +0xbd,0x97,0x0f,0xe2,0x78,0x88,0x0d,0x5b,0xa9,0xfb,0xcd,0x05,0x32,0x0f,0xae,0xd7, +0x2e,0xf0,0x7d,0x60,0xe1,0xb1,0xd4,0x17,0xed,0x48,0x30,0x2c,0x03,0x20,0xe1,0x7c, +0x89,0xea,0xf2,0x4f,0x3a,0x22,0x05,0xa9,0x78,0xad,0xda,0x94,0x53,0x20,0xfe,0x16, +0x5f,0x53,0x10,0xb7,0x27,0x8f,0x93,0x56,0xaf,0x0c,0x56,0x85,0x02,0xa5,0xab,0x5d, +0x81,0x53,0xf9,0xa2,0x16,0x92,0xe4,0x9f,0x37,0xe6,0xd9,0x9b,0x7e,0x74,0x3a,0x20, +0x40,0x30,0x82,0xb6,0xc4,0x3f,0x6c,0x87,0x9d,0x5f,0xc7,0x9a,0x16,0x85,0x9c,0xf2, +0xde,0xbc,0xb6,0x7f,0x82,0x70,0x24,0xf7,0xbf,0x8c,0x4c,0xb0,0x2d,0x20,0xfa,0xf3, +0x8e,0xcd,0x78,0xcb,0x45,0x6e,0x85,0xc3,0x13,0x37,0x43,0x5d,0xf0,0xc9,0xdc,0xa0, +0xcf,0x0c,0x49,0x10,0xf2,0xc0,0x07,0xb3,0x52,0x12,0xa3,0x98,0x8d,0xdc,0x7a,0xf8, +0x85,0x55,0xc5,0xb7,0x6d,0x9d,0xe3,0x80,0x64,0xef,0x16,0x82,0x8d,0x6f,0x64,0xd7, +0xa2,0x51,0x48,0xa7,0x6c,0xb7,0xa3,0x18,0x2f,0x18,0x94,0xf8,0x75,0x3c,0x6d,0xa3, +0x23,0x19,0xdd,0x25,0xb6,0x8d,0x10,0x09,0xaa,0x1b,0x12,0x83,0x7f,0x80,0x65,0x13, +0xc8,0x19,0x32,0xf3,0xa3,0x50,0x22,0x19,0xfd,0x1a,0x68,0x1d,0xad,0x3a,0xbc,0x73, +0x2e,0xb3,0x79,0xea,0xcf,0xc5,0x49,0xa1,0x9c,0xbb,0x36,0xdf,0x4c,0xab,0x2e,0x72, +0xdc,0x90,0xf0,0x20,0xd8,0xbf,0x9e,0xa5,0x5d,0xe6,0xa0,0x85,0x05,0xd6,0x61,0xf6, +0x8c,0x93,0x6b,0x13,0x9c,0xcc,0xa0,0x01,0x9b,0x5a,0xe9,0xaa,0x59,0x3b,0x2f,0x13, +0x8d,0xce,0x8f,0x6e,0xc3,0x7a,0x45,0x21,0x95,0xf4,0x3f,0xce,0x89,0xa8,0x06,0x68, +0x72,0x4e,0x26,0xf9,0x9e,0x4c,0x28,0xb9,0xd6,0xd5,0xd4,0x0a,0xfa,0x4c,0xae,0xf0, +0x40,0x95,0x76,0x2f,0x7a,0x2d,0x9b,0x9e,0xd0,0xfc,0x36,0xf9,0x7d,0x66,0xef,0xfc, +0x0e,0x6e,0x27,0xe5,0x89,0x2e,0x97,0x11,0x77,0x45,0x8e,0x70,0x1b,0x31,0x4f,0x28, +0xe2,0x1f,0x77,0x2e,0xf2,0x24,0x45,0x02,0x0a,0x3c,0x96,0x79,0xd2,0x6d,0x9b,0x58, +0xdd,0x7d,0xd8,0xf8,0x30,0xbb,0x4e,0x24,0xa5,0x43,0x88,0x02,0xdb,0x1d,0x3e,0x1e, +0xee,0xc5,0xaa,0x24,0xea,0xcf,0x40,0x15,0x61,0x3e,0xb8,0x12,0xda,0x4c,0x0e,0x27, +0xe7,0xa1,0x71,0x61,0xff,0xad,0xc3,0xd0,0x48,0x4f,0xd3,0xb7,0x21,0x64,0x13,0xa3, +0x6f,0x2c,0x97,0x0b,0x4b,0xe2,0x81,0x74,0x1b,0x3c,0x6a,0xa5,0xd5,0x4e,0x9f,0xc0, +0xe8,0x56,0x07,0xb9,0xe7,0x02,0xb0,0x9a,0x61,0xdf,0xd1,0xf0,0x57,0x77,0x8b,0x76, +0x7c,0x85,0xf2,0xad,0xf6,0xc6,0xb5,0x0d,0x74,0x15,0xa1,0xf4,0x13,0xe6,0x59,0xbd, +0x7b,0xea,0x99,0xb9,0x2f,0x07,0x77,0x1c,0x61,0x84,0xa8,0x66,0x37,0xa9,0xb4,0xac, +0xf0,0x87,0x92,0xd3,0xcb,0xf6,0xc1,0x88,0x63,0xa5,0x78,0xd3,0xf5,0xe7,0x86,0x68, +0x28,0x27,0x9c,0x13,0x9e,0x79,0x08,0xb8,0x4c,0x17,0xe5,0x5e,0xdc,0x6e,0x7f,0x2a, +0x05,0x36,0xd2,0x0a,0xf4,0x48,0xc5,0x5c,0x31,0xa5,0x45,0x4c,0x73,0x36,0x87,0x69, +0x73,0x27,0x94,0x88,0xb8,0x01,0x09,0xd1,0x37,0x8b,0x93,0x0b,0xb4,0xe7,0x11,0xbe, +0x7e,0xca,0x99,0x3b,0xf6,0xa4,0xff,0x1c,0x32,0x46,0xe0,0x3f,0xd9,0x1b,0xe2,0x56, +0xb3,0x97,0xbb,0x42,0xeb,0xe3,0x48,0xcf,0x0f,0xc8,0x65,0x86,0x00,0x6c,0xd2,0x7e, +0x3c,0x1e,0xee,0x2d,0x40,0x2a,0xae,0xdf,0x0c,0xc1,0xa1,0xca,0xdf,0x6c,0x71,0x2d, +0x71,0x9c,0xe2,0x30,0x39,0x15,0x8c,0x18,0xe3,0x42,0x0b,0x29,0xd2,0xac,0x55,0x76, +0x28,0x9f,0xef,0x5a,0xc5,0xab,0xf4,0x2b,0xed,0xb0,0x3b,0x87,0xb9,0xf4,0x73,0xbd, +0x52,0x0b,0x9a,0x8a,0x76,0x4f,0x94,0xd0,0x06,0x17,0xca,0xa1,0xd5,0xb1,0xab,0xbe, +0xaa,0x3c,0x3c,0xe4,0x96,0x1c,0x65,0x96,0xc0,0x2e,0x8b,0x31,0x8a,0x5c,0x25,0x7a, +0xb0,0xd2,0x9b,0x26,0x39,0x44,0x4b,0xa4,0x45,0x93,0x8b,0x9b,0x76,0x23,0x38,0xe3, +0x25,0x15,0xac,0xb0,0x16,0xd6,0x64,0x87,0x40,0x25,0xaa,0x30,0xd1,0x5e,0x3a,0x96, +0x26,0x3f,0x65,0xa0,0xdd,0x7c,0x0f,0x0a,0x6e,0x99,0x9c,0x24,0xf5,0xb0,0x93,0x56, +0x04,0xfb,0x2c,0x36,0xb8,0xf7,0x04,0xc0,0x98,0x00,0x94,0x94,0x51,0xf9,0xeb,0xc3, +0x47,0x29,0xe4,0xa1,0x5d,0x5e,0x88,0x90,0xc7,0xa2,0x9d,0xe0,0x75,0xf9,0x51,0xb1, +0x94,0x65,0x33,0x19,0x35,0xbf,0x05,0x77,0xbb,0x86,0xc5,0xb5,0x7b,0xfb,0x06,0xae, +0xd7,0x13,0x9c,0x6c,0x90,0xf9,0xa6,0x95,0x58,0x78,0x35,0x5f,0xdf,0x38,0x14,0x2a, +0xcb,0x36,0x99,0x19,0x19,0xd5,0x47,0xdc,0x2d,0x98,0x5d,0x9a,0x82,0x52,0x44,0xb6, +0x47,0xde,0x99,0xb7,0x3e,0x6b,0xa6,0x5b,0x94,0x2b,0x95,0x51,0x01,0x96,0x8b,0xf9, +0x20,0x2d,0xc8,0x6c,0xd7,0x36,0x41,0xbd,0x04,0xd4,0xc7,0xaf,0x14,0xaa,0xde,0xaa, +0x2a,0xb1,0x08,0x3e,0x2e,0xb3,0x2f,0xe2,0x9b,0x93,0x56,0xff,0x5b,0xfa,0x6a,0xba, +0x2b,0xb0,0xf6,0x9e,0x56,0x30,0xe4,0x89,0x42,0xd6,0x86,0x3c,0xfb,0xf3,0x14,0xb8, +0xf1,0x17,0xd9,0x12,0x31,0x18,0x76,0x94,0x49,0x8b,0x54,0x47,0x5f,0x7e,0xb9,0xa8, +0x82,0x94,0x10,0x5b,0xc4,0x1a,0xff,0xd5,0x86,0xc4,0x5b,0x3d,0x5e,0xbc,0xa8,0x21, +0x33,0x25,0x8f,0x14,0x92,0xa7,0x4b,0x20,0x88,0xea,0x10,0x45,0x32,0x63,0x68,0xa2, +0x51,0x0c,0xfe,0xf2,0xb0,0x4f,0xd8,0xd4,0x60,0x9a,0xa2,0xb6,0xbb,0xf6,0xb9,0x30, +0xd3,0x4d,0x85,0x67,0x6f,0x24,0x43,0x32,0x87,0xe1,0x85,0x21,0xf9,0xe1,0xf6,0x77, +0x0e,0xf5,0x6e,0x55,0x9d,0xde,0x2d,0xcc,0xe0,0x36,0xe1,0xf3,0x87,0x65,0x60,0xa0, +0x00,0xa9,0x39,0x36,0xb1,0x22,0x68,0x50,0x0e,0xeb,0x00,0xe0,0x5c,0xb3,0xcf,0xd2, +0xe9,0x3a,0xa8,0xe7,0xa8,0x28,0x26,0x77,0xa2,0x4a,0x29,0x0f,0xf0,0xc8,0x4a,0x71, +0x03,0xa9,0xb7,0xdc,0x33,0xd9,0xf1,0x13,0xa0,0x81,0xe9,0x9e,0xd4,0x04,0x31,0x76, +0x62,0x08,0xb1,0x72,0x32,0xdf,0xed,0x0a,0x60,0x57,0x4f,0x44,0x72,0x25,0x0a,0x18, +0xe9,0x13,0xda,0x05,0x9a,0x8f,0xd8,0x06,0x03,0xf3,0x64,0xcd,0xfb,0xc7,0xca,0x61, +0x82,0x08,0xf2,0x1e,0x15,0x41,0xc2,0xe7,0xa8,0xe6,0x1a,0xb8,0x60,0xb4,0xb5,0xef, +0x0d,0xcb,0x7b,0x6f,0xf0,0xb0,0x0b,0xd1,0x60,0x08,0x12,0xde,0x80,0x91,0x4d,0x1c, +0x8f,0x70,0x84,0x15,0x70,0x53,0x92,0xbd,0xf8,0x25,0x87,0x8d,0x38,0x6d,0xba,0x4a, +0x04,0xb1,0xba,0xce,0xf0,0x7b,0xea,0x93,0xb7,0xed,0x12,0x7f,0xa1,0xe7,0x84,0x88, +0x8f,0x04,0x32,0x3e,0x96,0xdb,0x5f,0x8b,0xcf,0xc0,0x7a,0x0e,0x39,0xaa,0x31,0x4d, +0xd6,0xa3,0xfb,0xb2,0x18,0x89,0x6b,0x58,0x6b,0xcf,0x16,0x5c,0xb6,0xc1,0x4e,0xa8, +0xd7,0x93,0x83,0x58,0xf0,0xdf,0x09,0xcf,0x20,0x2b,0xa5,0x7a,0x22,0x60,0x90,0x10, +0x26,0x89,0xcc,0x81,0x12,0xe2,0x74,0x17,0x4b,0x5f,0x81,0xd7,0x64,0x1e,0x5c,0xbd, +0x2d,0x53,0xf2,0x8d,0xb3,0xd6,0x45,0x87,0xc6,0xfc,0x80,0x9d,0xf3,0x96,0xe0,0x05, +0xd3,0x6f,0x00,0xf7,0x5b,0x62,0x6b,0xf9,0x0b,0x02,0xf7,0xa7,0xf1,0x32,0x45,0xcf, +0x1d,0xd9,0xd1,0x77,0x31,0x83,0x96,0x51,0xf3,0x48,0xc1,0xd7,0xd2,0x33,0xfc,0x3f, +0x55,0x14,0xdc,0xc1,0x93,0xb4,0x74,0x3d,0xe5,0xa6,0x8e,0x68,0x1a,0x24,0xf3,0x32, +0x33,0x58,0xf2,0xd8,0xbe,0xb3,0x24,0x74,0x7d,0x4d,0x2e,0x07,0xff,0xc8,0xf1,0xbf, +0x01,0x73,0xbd,0xc1,0xc1,0xec,0x35,0xa1,0x0c,0xdb,0xab,0xe3,0x13,0xf5,0x32,0x29, +0xa3,0x72,0x4d,0x15,0xfb,0x75,0x9d,0xa1,0xb6,0x54,0xa5,0x05,0x6d,0x86,0xb7,0x59, +0xc9,0xa7,0xe6,0x3f,0xf7,0x35,0x23,0xce,0x97,0x51,0x8a,0x85,0x7e,0x98,0xce,0x6c, +0xf5,0x5b,0xb6,0x67,0x3f,0x28,0x15,0x49,0xca,0x49,0x86,0xb8,0x70,0x6e,0xd8,0xe9, +0xdf,0xaf,0x78,0x0f,0x52,0x04,0xd7,0x6f,0xc4,0xf5,0x18,0xd2,0x99,0x5a,0xdb,0xb7, +0x2b,0xbc,0x8f,0x1f,0x5b,0xa9,0x2d,0x3b,0x03,0xb5,0xa1,0xe4,0xd8,0x3b,0x7d,0x2a, +0x86,0xa1,0x02,0x57,0xc5,0x7d,0x46,0xfc,0x8b,0xe3,0x16,0x68,0x0b,0x83,0xfa,0xa7, +0x88,0x78,0x31,0xae,0x59,0xc2,0xf6,0x65,0xe9,0x59,0xa6,0x78,0x3d,0x1e,0x3f,0xee, +0x5f,0x11,0xf9,0xc1,0xda,0xc1,0xa8,0x6d,0x9b,0x03,0x17,0x69,0x0c,0x83,0x74,0x3b, +0x07,0xa2,0x34,0xae,0xaf,0x51,0x01,0x9b,0xe5,0x3d,0x73,0x62,0xc8,0x3c,0xbb,0x86, +0x7a,0x0c,0xf8,0x17,0x27,0x95,0x50,0x20,0x2f,0xcd,0xc6,0x9c,0xf7,0xac,0xf1,0x31, +0x3a,0x88,0xf1,0x35,0xb2,0xa7,0x72,0xaf,0x65,0xcc,0xda,0x37,0x54,0x71,0xfa,0x90, +0xfb,0x8b,0x19,0x67,0xfb,0x2f,0xce,0xa6,0xca,0xa0,0x72,0x54,0x8d,0x8c,0x77,0x53, +0x89,0x28,0xdf,0xc1,0x34,0xa8,0xbd,0xb7,0xa6,0x7b,0x83,0xc4,0x8c,0x4c,0xa0,0x12, +0x55,0x9f,0x1f,0xc4,0xfc,0x16,0x4a,0x80,0xea,0x79,0xce,0x53,0x3e,0xe9,0x74,0x73, +0x34,0x60,0x90,0x24,0xfc,0xf5,0x40,0x62,0xe4,0xc1,0xa2,0xf9,0x3f,0x04,0xd7,0xa5, +0x03,0xe7,0xd9,0xa7,0x92,0x26,0x09,0xe1,0x2c,0x74,0x31,0xe3,0xe3,0x59,0xd1,0x23, +0x83,0x8e,0x89,0xe4,0x34,0xa8,0x55,0x82,0x9b,0x5b,0x87,0x71,0x36,0x64,0x2e,0x0a, +0x77,0x81,0x23,0x8c,0xf6,0xe7,0x62,0x0f,0x5e,0xa4,0xb5,0xc6,0xb0,0xa7,0xf8,0x9e, +0x6e,0x2b,0x5c,0xff,0xbe,0x04,0x22,0xbb,0xac,0xd2,0x84,0x32,0xd0,0x6f,0x78,0x84, +0x8a,0x73,0xdb,0xfc,0x88,0xac,0x0d,0x77,0x06,0x92,0xd3,0x9c,0x77,0xe5,0x7b,0x8a, +0xc9,0xc9,0xa4,0xd8,0x5f,0x8b,0x0e,0xdd,0x48,0xaa,0xbb,0xff,0xd9,0xc2,0xe2,0x2b, +0x26,0x21,0x82,0xfd,0xb9,0xa3,0x48,0x82,0xa2,0x83,0x00,0x9d,0xd2,0x51,0xea,0x3b, +0x27,0xcf,0x9c,0x88,0xf6,0xd5,0x44,0x23,0xad,0xed,0x0f,0x8e,0x41,0x1c,0xad,0x9b, +0x0a,0x85,0x23,0xa2,0x71,0xa8,0x0d,0x33,0x4e,0xf7,0x8b,0x7e,0xb2,0xea,0x61,0x83, +0xbc,0x0a,0x93,0xb7,0x27,0xe2,0x7d,0x09,0x24,0x77,0x3b,0xfb,0x13,0x50,0x51,0xe0, +0x4c,0x48,0x9c,0x79,0xbb,0x36,0x4c,0x20,0x8e,0xee,0xb8,0x0c,0x56,0x91,0xd9,0x70, +0x06,0x31,0xfe,0x14,0xdf,0x26,0xa5,0xe7,0x63,0x59,0xc1,0x5b,0x51,0x4e,0x5d,0xe1, +0x26,0x35,0xa5,0x47,0xb0,0x9b,0x6f,0x4d,0x47,0x90,0xbb,0x5b,0x1e,0x09,0x4d,0x20, +0x0a,0x13,0x95,0xa6,0xe6,0xbc,0xaa,0x73,0xa5,0xde,0x7d,0x4e,0xde,0xe8,0x1c,0xb0, +0x8a,0x9b,0x86,0x86,0x37,0x1e,0xb0,0x32,0x38,0xd7,0x0c,0x0e,0x4c,0xb9,0xd8,0x30, +0xa5,0x32,0xcc,0x16,0x62,0x18,0xc4,0x70,0x8d,0x67,0x50,0x69,0x9c,0x25,0xd1,0x21, +0x0a,0x99,0xdb,0xcb,0x39,0x30,0x4d,0xea,0xd5,0x77,0x0a,0x0f,0xff,0xbb,0x2a,0x31, +0x25,0x30,0x6c,0x90,0xb9,0x18,0x05,0xf1,0xbb,0x7a,0x9d,0x44,0xd1,0xfa,0x5e,0x66, +0x84,0xe3,0xf6,0x12,0x78,0xb5,0x20,0x72,0xcf,0xde,0x00,0xc8,0x87,0x7f,0x85,0xf4, +0xf8,0x9f,0x2f,0x1c,0xd7,0x2e,0x3b,0x38,0xed,0x8c,0xf4,0xb8,0x8a,0x74,0x3f,0xd4, +0x11,0x66,0x0b,0x1d,0xf8,0xb0,0x9c,0x66,0x4d,0xd3,0xb3,0x36,0x15,0x10,0x0f,0x5f, +0x0c,0x24,0x97,0xd8,0x63,0xb1,0x07,0xdb,0xe1,0xb3,0xe7,0xba,0x08,0x72,0x21,0xa8, +0xd1,0xf0,0x67,0xbc,0xd5,0x5d,0xf7,0xfa,0xec,0x7b,0x09,0x9e,0x32,0xf5,0x37,0xe8, +0x8a,0x22,0x6f,0x1e,0x49,0x10,0x76,0xba,0x63,0x56,0xe6,0xfb,0x82,0xf6,0x05,0xda, +0xad,0x3d,0xd9,0xfa,0x33,0x18,0x30,0x09,0x61,0x58,0xf6,0x90,0x9f,0xde,0xd0,0xea, +0x0e,0x3e,0x79,0xee,0x1e,0x3e,0x77,0x19,0x6d,0x78,0x79,0x17,0x91,0x74,0x04,0xe6, +0x80,0x80,0x40,0x9a,0x7b,0x2f,0xa3,0x08,0xbc,0x71,0x27,0xd4,0x71,0xc1,0xc8,0x80, +0x65,0xfe,0x9a,0x75,0x17,0x63,0x4d,0xb4,0x1d,0xd2,0x58,0xa5,0x51,0x65,0x3b,0xe9, +0xee,0x4d,0x05,0x76,0xfc,0xa7,0x2f,0x2d,0xc6,0xc0,0x07,0xd6,0x54,0xef,0xe5,0x61, +0x01,0x85,0xbf,0xe4,0x32,0x43,0xba,0x19,0x1d,0x72,0x20,0x0a,0xc5,0x21,0x80,0xc4, +0xf8,0x09,0x5c,0xc0,0x1c,0x8b,0x54,0x00,0x56,0x5f,0xcd,0x9a,0x42,0x26,0x0a,0xee, +0x05,0xa7,0x17,0x55,0x37,0x67,0x15,0x04,0xbd,0x65,0x3b,0xb4,0x47,0x75,0x21,0xf7, +0x8a,0x44,0x2d,0xdb,0x93,0x46,0x44,0x07,0x3d,0x04,0x11,0x0c,0x29,0x08,0x19,0xe3, +0xfa,0x94,0x09,0xd6,0x64,0x8a,0xdd,0x8c,0xcb,0x06,0x19,0xf1,0xea,0xf8,0xa2,0x48, +0x5c,0xf5,0xbc,0x39,0xf8,0xa9,0x2c,0x24,0x4e,0xca,0xc2,0x2c,0x84,0xa9,0x42,0x0d, +0xe8,0x0f,0xaa,0xd6,0xf0,0x79,0xda,0x25,0x3b,0x0b,0x65,0xcd,0x3d,0x96,0x19,0x0b, +0x4a,0xce,0x1b,0x89,0xda,0xb5,0x46,0xad,0x8e,0x28,0xb3,0x39,0xb3,0x9a,0xfd,0xf9, +0x2a,0x0f,0xd5,0xff,0x95,0x0e,0xdb,0x42,0x4b,0xac,0x5b,0xb8,0x03,0xc6,0x22,0x0a, +0xbf,0x01,0xc3,0x8b,0xcc,0x24,0x0b,0x58,0xef,0x73,0xed,0xab,0x88,0x64,0x3c,0xb7, +0xd6,0x02,0xf4,0x51,0xf9,0x6d,0x52,0x44,0xb7,0x5d,0xe1,0x3b,0x8d,0x65,0xbc,0x6e, +0x2b,0x08,0x47,0xb0,0x92,0x6f,0x6d,0x61,0x45,0x78,0x57,0x90,0xd2,0x2f,0xff,0x26, +0x28,0x09,0x48,0x2e,0xcb,0x41,0x80,0x79,0xd9,0x02,0xde,0x95,0xa7,0x2d,0xf6,0x7d, +0x3e,0x8b,0x1c,0x00,0x36,0x95,0xe2,0x3d,0xc1,0xaf,0xe6,0xa3,0x38,0xdb,0x8d,0x14, +0x13,0x11,0x10,0x10,0x37,0x94,0x14,0xb8,0xe3,0xb6,0x23,0x06,0xb1,0x11,0xf7,0x78, +0x3e,0x67,0x45,0x14,0xde,0xb3,0x2b,0xa8,0x6d,0xa4,0x12,0x38,0x70,0x92,0x53,0xb9, +0xa1,0xb7,0x4d,0x04,0xdf,0xb2,0x5e,0x41,0xe9,0x5c,0xc3,0xa8,0xd1,0x31,0x7c,0x3f, +0x8e,0x19,0xc0,0xe0,0xdb,0xa4,0x94,0x70,0x2d,0x5c,0x8d,0xcd,0x74,0x36,0x34,0xf7, +0xde,0x1a,0x95,0xe8,0x35,0x77,0x03,0xf5,0x65,0x37,0x64,0x0a,0x75,0x37,0x25,0x77, +0xaa,0xea,0xdf,0xc1,0x91,0xe7,0xd1,0x1c,0xea,0x17,0xf7,0x1a,0xc1,0xc7,0x14,0x75, +0x06,0xe8,0xd0,0x2b,0x3e,0x91,0x7e,0xb1,0xef,0xac,0xfb,0xb2,0x2d,0x7d,0x07,0xa1, +0x94,0x28,0x9c,0x08,0x3e,0x9d,0x36,0xb9,0x89,0x5e,0xd0,0x0c,0xfa,0xdf,0x98,0xeb, +0x45,0x75,0x90,0x18,0x7b,0xa6,0x9f,0xff,0xab,0x19,0xe6,0x3e,0xf9,0xd2,0xde,0x89, +0x49,0xb5,0x47,0x1c,0xd6,0xbb,0xe1,0x31,0x4b,0xf7,0xea,0x4f,0x54,0xf7,0x69,0x95, +0xaa,0x1a,0xbb,0xad,0x50,0x6b,0x57,0xbd,0x41,0xb2,0xa7,0x42,0xf7,0x19,0x26,0x7e, +0x26,0x91,0xc3,0x0c,0x6a,0x2e,0x52,0xcc,0x59,0xaf,0x14,0x1c,0xe4,0xad,0x51,0xab, +0x7f,0x12,0xa8,0xd5,0x38,0x5d,0xdd,0x10,0x5b,0x10,0x69,0xf5,0x7d,0xc6,0x3f,0xb6, +0xac,0xbc,0x07,0x49,0x83,0x52,0xef,0x17,0x08,0x1e,0x17,0x69,0x8b,0xc1,0x16,0xfc, +0x0e,0x0f,0x10,0xdc,0x9f,0x24,0xa0,0x11,0x8f,0x12,0x43,0x79,0xf5,0xd0,0xa2,0x80, +0xea,0x8b,0x3c,0x74,0xff,0x41,0xf7,0x5d,0xe7,0xc6,0x22,0x61,0x96,0xe0,0xfb,0x81, +0xe4,0x9a,0x29,0xd6,0x3b,0xe3,0xf8,0xb6,0xbf,0xcc,0x86,0x02,0x97,0xf0,0x7b,0x02, +0x27,0xc0,0x9f,0x32,0x19,0x04,0xc7,0xbf,0x2d,0xf3,0xf9,0x23,0x5d,0x3b,0xf8,0xf5, +0xb6,0x70,0x6d,0xb9,0xfe,0xac,0x95,0xbc,0x24,0x95,0xb1,0x33,0x5c,0x3a,0x48,0x38, +0xa7,0x7b,0x82,0x56,0x15,0x44,0x97,0x99,0xa7,0x12,0x30,0x0f,0xdb,0x52,0x17,0x0d, +0xa4,0xe0,0xec,0x96,0x1b,0x5e,0xbc,0xf7,0x04,0x36,0x68,0x9e,0x6f,0xa7,0xd5,0x21, +0x04,0x21,0xdf,0x5f,0x1b,0x20,0x0a,0x8b,0xe0,0x8b,0xb9,0x62,0xa9,0xc6,0xd6,0xb1, +0x05,0x8b,0xed,0x73,0x91,0x25,0xa0,0x73,0xbf,0x78,0x39,0x65,0x28,0x89,0xda,0xe2, +0x68,0x03,0x20,0x8a,0x1a,0x7e,0x3a,0x22,0xce,0x2f,0x94,0x1a,0x00,0xaa,0xd2,0xf2, +0x29,0xc6,0xb6,0x9a,0x1b,0x0c,0x1a,0x2b,0xac,0xcf,0x1a,0x2f,0xbc,0x46,0xdc,0xed, +0xbf,0xf9,0x63,0x9e,0xf2,0x2b,0x74,0xdb,0xc4,0xc5,0xf5,0x8f,0x23,0x6d,0x72,0xb3, +0x2a,0x50,0x6b,0x8e,0xf3,0x2a,0xcd,0xa2,0x6e,0xcd,0x3c,0x3d,0xdf,0x16,0x9b,0x28, +0xf1,0xe9,0x70,0x3e,0x52,0xa5,0xcb,0xd2,0xbd,0xf1,0x94,0x66,0x5f,0x7c,0xc5,0xb8, +0xa3,0x70,0xd2,0xa1,0xea,0xc1,0x85,0x04,0xd9,0x12,0x3a,0xfb,0xf6,0xe5,0x5b,0xc9, +0x64,0x71,0xe4,0xcd,0x70,0x7c,0x8e,0x2c,0x33,0xb8,0x4c,0xfc,0xce,0x11,0x13,0xd9, +0x0e,0x10,0x0c,0x9f,0x93,0x54,0x97,0x04,0x15,0x52,0x7f,0x82,0xd7,0xae,0x7e,0x0f, +0x4c,0x71,0xfa,0x64,0x70,0x35,0x0a,0xae,0xa6,0xd2,0x70,0x76,0x2a,0xf1,0x39,0x61, +0x1d,0x1c,0x2d,0xd1,0xf7,0xb3,0x02,0xbe,0xe8,0x57,0xbc,0x32,0x43,0x66,0xe5,0x07, +0x68,0x33,0x5a,0x85,0x84,0x1f,0x3d,0xa7,0x4c,0x3b,0x8d,0xa2,0xf2,0xea,0x7b,0xbb, +0x4e,0x82,0xa5,0xbf,0x5c,0xe3,0x3c,0xf3,0xc3,0x5e,0xdd,0x04,0x4a,0xb1,0xa4,0x52, +0x94,0x8f,0xf3,0x42,0x30,0x8d,0x98,0x7d,0x67,0xb4,0x18,0x78,0x77,0x94,0xac,0x42, +0x95,0x60,0xe4,0x52,0x31,0x62,0x90,0x60,0x63,0xdd,0xfc,0xd2,0xf5,0xfd,0x69,0xa5, +0x95,0xa5,0x1a,0x00,0x60,0xbe,0xaa,0xe2,0xc2,0x0b,0x2a,0xe6,0xd2,0x0d,0xff,0xf7, +0xcc,0x67,0xd5,0x29,0x4a,0xdb,0xf9,0x0e,0xef,0x96,0x4b,0x95,0x00,0xf1,0x7c,0x05, +0x44,0x79,0xc4,0xce,0x3f,0xf9,0x48,0x9f,0x85,0x39,0xf0,0xc7,0x95,0xc8,0xd3,0xe8, +0x1b,0xc6,0x38,0xd9,0xf7,0xe9,0x2a,0x3e,0x63,0x8e,0x41,0x3c,0x97,0x06,0xe7,0x0f, +0xdd,0xeb,0x9d,0x7c,0xd0,0x17,0x9b,0x38,0xf8,0xd0,0xcf,0x2b,0xfa,0xdc,0x29,0xae, +0x2d,0xa5,0xe7,0x82,0xbb,0xf9,0x61,0x59,0xe1,0x99,0x85,0x5d,0x51,0x06,0x99,0x37, +0xd1,0xdd,0x05,0x8e,0x58,0x47,0x2f,0x46,0xcb,0x5b,0xfe,0xd9,0xdf,0x90,0x14,0xba, +0x3f,0xdf,0xf4,0xdb,0x1c,0x0c,0xbe,0x7e,0x56,0x22,0x7a,0x39,0xff,0xdd,0x3e,0xe3, +0x0b,0x61,0xe3,0xeb,0x57,0x2e,0xf7,0x7a,0xdd,0x9f,0x14,0xa8,0x20,0xf6,0x22,0xaf, +0x52,0x16,0xb6,0xe6,0xb9,0xfd,0x48,0xf2,0xe9,0x64,0x53,0x3f,0x5c,0xbe,0x3e,0xc9, +0x23,0x40,0xba,0x80,0x31,0xe3,0xc4,0x53,0x6e,0x2c,0x47,0x57,0x66,0xb6,0x2b,0x0e, +0x37,0xf5,0x64,0x86,0x19,0x2b,0x1c,0x30,0x22,0xbe,0x9e,0x91,0x32,0x21,0x1d,0x09, +0x86,0xb9,0xbf,0xb0,0xb1,0x80,0x73,0x29,0xc1,0x02,0xef,0x99,0xd9,0xb8,0xdc,0x95, +0xa0,0x03,0x09,0x54,0x81,0x8e,0x67,0x89,0x2a,0xf0,0x8f,0x98,0x3a,0x10,0x97,0x3e, +0x68,0x57,0xd5,0xc0,0x3e,0x14,0x48,0x75,0xb5,0x21,0x22,0x02,0xdd,0xe2,0x88,0x30, +0x3b,0x08,0x58,0xa4,0x1b,0x2a,0x0d,0xe3,0x33,0xe8,0xdc,0x76,0x15,0xf8,0x3f,0xfd, +0x8b,0xdc,0xc7,0xe0,0x9a,0x02,0x69,0x9e,0x4d,0xeb,0xd5,0xa5,0xf6,0xed,0x53,0x50, +0xa0,0x47,0x7e,0xf8,0x67,0x74,0xcc,0x01,0x43,0x58,0x87,0x97,0x9b,0xe2,0x7c,0xa0, +0xa4,0x05,0x57,0x9f,0x5b,0x87,0x2c,0x8d,0xaa,0x58,0xa8,0x9d,0x6e,0xc7,0xf7,0xf4, +0x09,0xdc,0x8a,0xef,0x6b,0x01,0x1b,0xba,0x69,0xbf,0xd2,0xa4,0xb0,0x03,0x7d,0xa0, +0x61,0x80,0xd4,0x7e,0xae,0xac,0x13,0x69,0xcc,0x62,0x42,0xa9,0xf9,0x21,0xda,0x26, +0xb7,0xb4,0x8a,0x0c,0xb7,0x86,0x0d,0x5b,0xe6,0x6b,0xd9,0xc2,0x30,0x88,0x5e,0x58, +0x0c,0x05,0x02,0xad,0x01,0x6d,0x6c,0xc0,0x2b,0x48,0xc0,0x7d,0xa1,0xb1,0x42,0x44, +0x0d,0x04,0xf4,0x90,0x96,0x4f,0x64,0xd1,0x95,0x90,0x83,0xca,0xfe,0xe4,0x43,0xcd, +0xab,0xac,0xf9,0xbe,0xfe,0xd1,0x32,0x29,0xb3,0x20,0x3f,0xf6,0xdb,0x5c,0x53,0x99, +0xc7,0xa2,0xb5,0x68,0x72,0xb5,0x41,0x7b,0x78,0xe2,0xdf,0x1d,0xcf,0xe4,0xa3,0xbc, +0x5b,0xb0,0x3a,0x01,0xdb,0x13,0x6b,0xd3,0x0e,0x3c,0xaf,0x20,0x51,0xb3,0x0d,0x14, +0x7d,0x37,0x5c,0xe7,0x45,0xe4,0x1d,0xc3,0x5f,0xa0,0x5c,0xd4,0x56,0x7b,0xc5,0xe1, +0x2c,0xa9,0xbb,0xb9,0xbe,0x9d,0x72,0xe1,0xe4,0x7a,0xab,0x10,0xd1,0x70,0xae,0xac, +0x7d,0x10,0x9a,0x7d,0xbd,0xef,0x63,0x08,0x14,0x57,0x18,0x31,0xd0,0x19,0x1e,0xa0, +0x4a,0xa7,0x40,0x64,0x74,0xe4,0x02,0x73,0x40,0xf9,0xa2,0x02,0x41,0xd3,0x1a,0x68, +0xc8,0x71,0x95,0xee,0x96,0x83,0x54,0x5c,0x65,0x5c,0xd4,0xe4,0xf4,0x07,0x3b,0xc7, +0xc1,0x33,0xfb,0xf1,0x49,0x5a,0xc2,0x65,0xc3,0x57,0x6d,0x22,0x30,0x26,0x75,0x2e, +0x2c,0xba,0x35,0x5d,0x16,0xb1,0x5d,0x75,0xc2,0xf5,0xe7,0x13,0xd1,0x05,0x5f,0xa6, +0x8d,0x13,0x36,0xfb,0x36,0xe4,0x86,0xb9,0x46,0xf5,0xa8,0x01,0x00,0xd7,0xf1,0x70, +0xaf,0x54,0x22,0xef,0x4d,0xcf,0x24,0x08,0x96,0x1b,0x98,0x19,0x1a,0xa6,0x82,0x61, +0x62,0x57,0x43,0x47,0x0b,0xc5,0x5d,0x99,0x17,0xa5,0x40,0xd7,0x78,0x2b,0xe3,0x06, +0xa8,0x8b,0xf1,0xa1,0x50,0x8a,0x07,0x0c,0xef,0x52,0x89,0x10,0x12,0x08,0x10,0x57, +0x49,0x18,0xc6,0x2a,0x09,0x49,0x5e,0xc8,0x6c,0x55,0x13,0x04,0x90,0x31,0x06,0xdc, +0x02,0x9d,0x8e,0x7c,0x21,0x7d,0x0c,0x1e,0x7b,0xf0,0x53,0x9c,0x7f,0xf0,0x3e,0xb8, +0xc8,0x08,0x7f,0xc5,0x98,0xd3,0x4f,0x29,0xa6,0xf3,0xc1,0xd9,0x5d,0xd3,0x43,0x27, +0xad,0x16,0x27,0x55,0x3c,0x0d,0x09,0x1f,0xd8,0x19,0x27,0x15,0x11,0x32,0x7b,0x02, +0x02,0x70,0xea,0x36,0xeb,0x5f,0x87,0x23,0xcb,0xe0,0x1c,0xb9,0x57,0xa2,0xf9,0x2d, +0x3b,0x3d,0x68,0x76,0x04,0x0c,0x6f,0x13,0xd1,0xe0,0x86,0x9b,0x9f,0x6b,0x45,0x1c, +0xea,0x57,0x9b,0xb7,0x6b,0x7d,0xcc,0x02,0x9a,0xe3,0x71,0x47,0xdb,0x8e,0x94,0x48, +0xf6,0x83,0x7b,0x77,0xc5,0xcd,0x48,0x12,0x52,0x81,0xc7,0x8a,0x3c,0xb0,0x32,0xa4, +0x16,0x29,0xf8,0x57,0x7d,0x65,0x21,0x12,0xc6,0xd2,0x70,0x80,0x44,0xa9,0x84,0x21, +0x6d,0x23,0x9e,0xfc,0xb6,0x22,0xc6,0xf7,0xb4,0x38,0xbd,0x04,0x64,0x22,0x37,0xa5, +0x8f,0x58,0xe5,0xba,0x92,0xa0,0x79,0xbf,0x33,0x83,0xe7,0x53,0x71,0xe2,0xb9,0x20, +0xad,0xc5,0xed,0xd7,0x76,0xa8,0xbd,0x88,0x2e,0xb6,0x01,0xff,0x70,0xe3,0xe2,0x17, +0x86,0x3c,0xc0,0x0f,0x1f,0xe8,0x2a,0x7a,0xa5,0xa2,0xd0,0x2e,0xb7,0x3b,0x32,0x1d, +0x55,0xcb,0x66,0x5f,0x0d,0x09,0x96,0xa1,0x4e,0x6b,0x84,0xee,0xa6,0x72,0xf1,0xf2, +0xc0,0xc8,0xaf,0x07,0x9a,0xa3,0x71,0xd0,0x25,0x29,0xbf,0xf3,0x94,0x89,0xac,0x98, +0x59,0x3a,0x7f,0x6c,0xe5,0xee,0x05,0xfe,0xad,0x14,0xbb,0x0e,0x7c,0x14,0x7a,0x6a, +0x0d,0xcc,0xbb,0xfd,0xb9,0x07,0xc2,0x1d,0x40,0x13,0xb6,0x86,0xb4,0xa1,0x10,0xba, +0x03,0x20,0x12,0xaf,0x7b,0x6b,0x04,0xcb,0xba,0x5e,0xfc,0x00,0x81,0xa2,0x7f,0x5b, +0x67,0x3d,0xbf,0xd9,0xad,0xf9,0x4d,0x53,0xc0,0x7f,0x08,0xa8,0x00,0xe6,0x38,0xa9, +0xae,0x1d,0x34,0xc9,0xbd,0x9d,0x05,0xcb,0x40,0x62,0xdb,0x6f,0x3e,0xf4,0x1a,0xbf, +0x80,0x7d,0x47,0x75,0x4c,0xf2,0xec,0x62,0x22,0x7d,0xee,0x59,0x1e,0xa3,0x7c,0x17, +0xce,0x92,0xb4,0x0a,0xdc,0xdb,0x02,0x06,0xe8,0x27,0xe4,0xb2,0x5c,0x71,0xe1,0x70, +0xd8,0x3f,0xbd,0xd7,0x5d,0x71,0x7f,0x93,0x13,0x2d,0xcb,0x0b,0x1d,0x31,0x13,0xaf, +0x51,0x22,0xef,0x6c,0x5c,0x50,0x35,0xb7,0xec,0xc3,0x83,0x02,0xd6,0xb3,0x71,0xa0, +0x47,0xb4,0xbd,0xe9,0x55,0x94,0xcc,0xf2,0xc1,0x96,0x18,0x74,0x66,0xfc,0x52,0x6b, +0x4f,0x98,0x14,0xf6,0x29,0x7f,0x79,0xcd,0x59,0x00,0x1e,0x02,0x7f,0xb4,0x3d,0xc7, +0x8f,0x16,0x1d,0xcf,0xd5,0x27,0x6d,0xca,0xe0,0xb7,0x73,0x95,0x51,0xed,0x92,0xa0, +0xd5,0xd5,0xb4,0x2f,0x12,0x68,0xac,0x77,0x94,0x47,0xed,0x62,0xb3,0xf6,0x7f,0x8e, +0xf9,0xdd,0x0a,0x15,0x3f,0x3a,0xf6,0xca,0x53,0x7b,0xaa,0xbe,0x7a,0xf1,0x47,0x70, +0xc6,0xda,0x7f,0x6d,0x4f,0xd5,0x3f,0xab,0x43,0x74,0xed,0x42,0x7d,0x54,0x99,0x0e, +0x79,0xf8,0x67,0xef,0x83,0x19,0xe6,0x58,0x9e,0xf2,0x6a,0x1e,0xca,0x55,0x8c,0x3a, +0x4c,0x34,0x91,0x32,0x63,0x14,0x75,0x8b,0xe5,0x24,0x6a,0x8e,0xbe,0x54,0x7e,0xdf, +0xc5,0xed,0xb8,0x2c,0x76,0x39,0x56,0x6e,0xe1,0x71,0xb5,0xeb,0x5e,0x7e,0x50,0x67, +0x47,0x90,0xce,0xb8,0xcc,0xd3,0x2a,0x7e,0x4e,0xdc,0xc0,0xb3,0x5c,0x15,0xd3,0xa9, +0x45,0x0f,0xf5,0xde,0x45,0xa5,0x21,0x78,0xc8,0x73,0x6c,0x6b,0x9f,0x0f,0x90,0xa8, +0xd9,0xdd,0x88,0x9f,0xef,0xa4,0x77,0xef,0xe9,0xd6,0xa6,0xe4,0x5a,0x20,0x01,0x66, +0xff,0xdd,0xe2,0x04,0xb7,0x8b,0xaa,0xa5,0x4e,0xca,0x7c,0x5b,0x9a,0x3a,0x32,0x8f, +0xfe,0x8c,0xd0,0x9c,0xb9,0x0c,0xa7,0xbf,0x22,0x45,0xf9,0x74,0x01,0x7a,0x51,0x76, +0xcc,0x6e,0xdd,0x99,0x79,0x09,0xc6,0xda,0x7f,0x2c,0xcb,0x27,0x63,0xbb,0xea,0xef, +0x87,0xe0,0x49,0xa0,0xae,0x38,0x60,0x4f,0xa0,0x47,0xe8,0x4f,0x76,0x73,0x22,0x51, +0x03,0x34,0x00,0xf1,0x70,0xb9,0xf3,0x48,0x9a,0xa5,0x8a,0x4a,0xf1,0x01,0xd8,0x22, +0x30,0x52,0xce,0x6d,0xfa,0x94,0x78,0x8e,0xb8,0xda,0xa0,0x53,0x30,0x30,0x18,0xd7, +0xe5,0x66,0xb9,0x62,0x6b,0x29,0x72,0x55,0x23,0xbd,0x8b,0xb4,0x71,0x03,0xb1,0x75, +0x06,0x85,0x91,0x51,0xdb,0xb6,0xec,0x58,0x77,0x56,0xa1,0x52,0x3a,0x36,0x8d,0xcf, +0xd6,0xd5,0x64,0x7a,0x95,0x4a,0x73,0xe8,0x10,0xf5,0xad,0xca,0x33,0x43,0x10,0x1a, +0x9b,0x01,0xd0,0x1e,0xaa,0xf0,0xda,0x8d,0x0d,0x41,0x25,0xaf,0x35,0xe2,0x19,0x0b, +0x3b,0x97,0xfc,0x4a,0x65,0x9c,0xec,0x6e,0x29,0xbc,0x71,0x2f,0x9d,0x04,0x89,0x47, +0x78,0xd7,0xea,0xdd,0x95,0x80,0x9f,0x19,0xdf,0xd2,0xbb,0xd7,0xac,0x7d,0xea,0xdd, +0x8f,0xce,0xe2,0xfa,0x1c,0xcf,0x67,0x5d,0xfa,0x8d,0xaa,0x4b,0xb3,0x1d,0x4a,0x78, +0x49,0x4d,0x95,0x5c,0x68,0x21,0x72,0x1a,0xb6,0x41,0xa2,0x5b,0xb2,0x1c,0xeb,0xd1, +0x8c,0x17,0xb3,0xc9,0xf4,0x81,0x93,0xe9,0xcf,0x93,0xab,0x4a,0x33,0x3f,0x77,0xc6, +0x09,0x0b,0x0b,0xb9,0xba,0xf4,0x63,0xfb,0x4b,0xae,0xa3,0x7f,0xdd,0xe2,0xfc,0x82, +0x00,0x52,0x82,0x00,0x5e,0x70,0xac,0x5b,0xed,0xad,0x5d,0x4b,0x91,0xf6,0xb4,0xa1, +0x45,0x5e,0x94,0x8d,0xbe,0x97,0xe7,0x8b,0x0d,0xca,0x79,0xda,0x10,0x75,0xd3,0x5a, +0x93,0xde,0xcd,0x04,0x59,0x19,0x72,0x5e,0x15,0xc4,0x95,0x4b,0x7d,0x8f,0xb5,0x56, +0x63,0x33,0x1f,0xd5,0xf9,0x71,0x1d,0x76,0x1c,0xe5,0xe4,0xcb,0x90,0x77,0x1c,0xc4, +0xd3,0xcd,0x9b,0xd1,0x34,0xff,0x54,0xa0,0x3f,0xd9,0x95,0x92,0xb0,0x74,0x97,0xd2, +0x5c,0xb4,0xd4,0x2c,0xef,0x8e,0xf0,0x83,0x1b,0x4e,0x64,0x0e,0x63,0x38,0x5d,0xc5, +0x0b,0xe0,0xed,0x39,0x5e,0xcd,0x2b,0xd9,0x09,0xe7,0xdd,0xd1,0xc1,0x1a,0x12,0xc4, +0xa5,0x6c,0x86,0x3d,0x21,0xfa,0x38,0x67,0x0a,0xc6,0xa2,0x71,0x9d,0x9b,0x0e,0x09, +0xc9,0x57,0x50,0xf2,0xb8,0x58,0x4c,0xaa,0xdb,0x81,0xf7,0x6c,0x6c,0x63,0x06,0x98, +0x2a,0xf9,0xd2,0x7c,0x3d,0x77,0x6b,0xde,0x11,0x16,0xa1,0x5a,0x12,0x52,0x57,0x19, +0xf8,0x58,0xbd,0x7e,0x93,0x97,0x76,0xe9,0xfc,0x41,0xe6,0xd7,0x5f,0x6a,0x56,0x0f, +0xce,0x9b,0xc8,0xbd,0xe3,0x7b,0x5e,0xdf,0x9b,0x5f,0x1e,0xce,0xd2,0x70,0xfe,0xb7, +0x0b,0x5c,0x3f,0xc4,0xdf,0x43,0x17,0x7e,0x6b,0x1c,0xde,0xf9,0x58,0xfe,0x91,0xb8, +0xd3,0xd7,0x18,0x7e,0xce,0x31,0x0c,0x9a,0x9c,0x38,0x1a,0x8f,0x6c,0x11,0x7b,0x56, +0xdd,0xb8,0x07,0xb0,0x3f,0x7c,0x6b,0x10,0xec,0xbd,0x11,0x2b,0xb4,0x7a,0x7c,0x08, +0xad,0xb4,0xf7,0xa2,0x3a,0x32,0x67,0x16,0x7e,0x82,0x1b,0x02,0x74,0xc2,0x8f,0x79, +0xd9,0x9b,0xfc,0x90,0x36,0x22,0x0e,0xc3,0xcb,0x66,0xb8,0xa2,0x67,0xe6,0x60,0x96, +0xf0,0xce,0x84,0x0f,0xfc,0x8a,0xee,0x4c,0xc5,0xa1,0xe1,0x9c,0x88,0xae,0x52,0x87, +0xea,0x32,0xa7,0x27,0xda,0xe2,0xa3,0x63,0x8c,0x80,0x09,0xd8,0xc4,0xaf,0x28,0x6c, +0x22,0x80,0x45,0x84,0xf1,0xab,0x03,0xc0,0xee,0x6e,0xb8,0x48,0x72,0x48,0x76,0x20, +0xf1,0xe1,0x47,0xbb,0x45,0x11,0x48,0x9c,0xea,0xc9,0x90,0xd1,0x31,0xeb,0xec,0x2c, +0x66,0xd0,0xf0,0xbe,0x85,0x68,0x42,0x99,0xf4,0xcb,0x4c,0x94,0xd2,0x67,0x59,0x33, +0xcd,0x8d,0x74,0xab,0x7a,0xdd,0x8c,0x2d,0x33,0x9a,0x45,0x85,0x7a,0xe9,0x71,0x57, +0x2e,0x71,0x97,0xe6,0x87,0x6a,0x41,0x8c,0x44,0xca,0xa0,0xe5,0x30,0xf7,0x60,0x06, +0x0a,0x80,0xa4,0x8a,0x72,0x75,0x6e,0xca,0x48,0x86,0xee,0xb2,0xdc,0xd9,0xfc,0xc1, +0x8d,0x88,0xf6,0x9a,0x73,0x51,0xfa,0x8f,0x72,0xd2,0x5d,0xc1,0xac,0x3f,0x23,0xcb, +0xc4,0xc8,0x83,0x0a,0x7d,0x05,0x74,0x8b,0x96,0x93,0x73,0x9a,0xcd,0x86,0x72,0x4d, +0xee,0xcb,0x6b,0xaa,0x50,0xa1,0x4a,0x5d,0x3e,0xdb,0x40,0x78,0x3c,0x4d,0x02,0x48, +0x36,0x81,0x9c,0xfa,0x18,0x55,0x89,0xee,0x4c,0x70,0x08,0xea,0x63,0x54,0x0a,0x58, +0x63,0x80,0xf2,0xb6,0x8d,0x60,0x96,0x09,0x73,0x4b,0xb4,0xa3,0xd0,0xf6,0x98,0x6c, +0x2f,0x71,0xb8,0xb3,0x72,0x55,0xd0,0x47,0x12,0xbf,0xa3,0xff,0xd2,0xac,0x10,0x7c, +0x2e,0x76,0x12,0x57,0x7a,0xd0,0x84,0x08,0xfb,0x49,0x9d,0x09,0x1d,0xcf,0x8c,0xae, +0x00,0x91,0x90,0xf0,0xdd,0xc8,0x20,0xe5,0x85,0x76,0xb2,0x4e,0xb2,0x3b,0x7c,0x07, +0x21,0xb4,0x61,0xf4,0x16,0x81,0x3c,0x48,0xe8,0x2c,0xd8,0xd0,0xbf,0xab,0x67,0x87, +0x0c,0xd3,0xfd,0x9a,0x36,0x6e,0xa3,0x58,0x05,0x54,0x35,0x83,0x79,0xe9,0xbd,0x7b, +0x27,0xde,0x01,0xec,0x7f,0x8b,0x5a,0xc9,0x84,0xd7,0xe7,0xb5,0xf3,0x10,0xab,0xdd, +0x1e,0x40,0xda,0xeb,0xc2,0xe5,0xdd,0x8c,0x48,0x72,0x13,0x16,0xf6,0xeb,0xfe,0xac, +0xa6,0x98,0x47,0x73,0xe2,0xab,0xed,0xcd,0x5b,0x58,0x14,0x6e,0xf0,0x77,0x74,0xd8, +0xca,0x02,0xbc,0xd2,0x3b,0xd5,0x4d,0x08,0x55,0x03,0xee,0x6d,0xf7,0xb6,0xd2,0x91, +0x06,0xd5,0x90,0x2c,0x66,0x6a,0x06,0x08,0xe1,0xd5,0x26,0xd4,0x88,0xfe,0xdd,0x82, +0x89,0x67,0x9d,0x1d,0x2d,0xb0,0x4f,0xd4,0x0d,0xdc,0x72,0x6e,0x3a,0xba,0x48,0xd2, +0x2c,0xd9,0x78,0xd6,0xb0,0x4f,0x67,0x11,0xc8,0x7f,0xe7,0x10,0xd8,0x58,0x8b,0x18, +0xb5,0x47,0x27,0x8d,0x91,0xf8,0x56,0x6b,0xb0,0xb6,0x61,0xab,0xff,0xd8,0x1b,0x83, +0x9e,0x7d,0x50,0xe5,0x6b,0x64,0xa9,0x5d,0xff,0x96,0x2d,0x59,0x58,0x97,0xb0,0xd1, +0xcf,0xa3,0xcd,0x4a,0x50,0x13,0xfe,0x98,0x51,0xd8,0xc8,0x3a,0x16,0xf1,0x06,0xb8, +0xd8,0xdf,0xd6,0x20,0x39,0xf6,0x26,0xe5,0xb6,0x20,0x07,0x8c,0x84,0xbd,0x1e,0x09, +0x0f,0x61,0x8f,0xad,0x41,0xb0,0x8e,0x00,0x5d,0x9c,0x0a,0x9c,0xb5,0x9d,0x2f,0x80, +0x73,0xae,0xf7,0x5d,0x51,0x74,0x50,0xa1,0x1a,0x43,0x25,0xe0,0xff,0xff,0x3a,0xf3, +0x34,0x06,0x2c,0x97,0x60,0x2a,0x94,0xd1,0x38,0xc0,0x68,0xcc,0x6a,0x2d,0xcc,0x95, +0x0f,0x8b,0x77,0x16,0x15,0xd4,0xd8,0xb4,0xd4,0xb4,0xd0,0x30,0xd1,0x21,0x21,0x58, +0x21,0xdd,0x03,0xed,0xaa,0x6f,0xd1,0xb5,0xee,0x2e,0x6e,0x62,0x1a,0xf3,0xce,0xb1, +0x20,0xc3,0x9a,0xfd,0xe7,0xde,0x8b,0x43,0x4c,0x01,0x2e,0x0d,0xe2,0x50,0x1e,0x6c, +0x06,0x00,0x9a,0x48,0x9c,0x3f,0x02,0xd6,0xa9,0x20,0x57,0xe6,0xae,0x6d,0x00,0x5c, +0x05,0x87,0x72,0xab,0x9c,0xa3,0x9a,0xdc,0x0b,0x15,0x18,0xe4,0x50,0x06,0xc8,0xc5, +0x8c,0xbb,0x63,0xb3,0xa1,0x4d,0x6f,0x59,0x61,0x04,0xe9,0x9a,0x62,0x35,0xd4,0x11, +0xcb,0xac,0xcd,0x95,0x83,0x3c,0xc9,0x6e,0xe9,0xca,0xbf,0x17,0x51,0x82,0x25,0x25, +0xd4,0x99,0x7a,0x76,0x97,0x8e,0x54,0x31,0x4b,0x08,0x2d,0xca,0x6b,0x40,0x2d,0x20, +0x0f,0x73,0x86,0x7a,0xe6,0x2d,0xa2,0xc7,0x7a,0x61,0x89,0x7c,0x5d,0x6d,0x23,0x19, +0x54,0x7b,0x90,0x4d,0xdc,0x31,0x07,0x18,0xfb,0x79,0x2b,0xd2,0x57,0xcc,0x84,0x9b, +0x67,0x20,0x0b,0x22,0xe9,0x30,0xa3,0xbd,0xcf,0x17,0x1b,0x02,0xa9,0x70,0xd3,0x4d, +0x8a,0x7f,0x90,0x2a,0x67,0x25,0xaf,0x86,0xf7,0xed,0xca,0x8e,0xf6,0x91,0x4f,0x2b, +0x33,0x06,0x12,0x2a,0xe4,0x43,0xa1,0xfc,0x45,0xc5,0xe4,0xc9,0xd6,0xcb,0x83,0xcc, +0x73,0x04,0x43,0x4f,0xbb,0x35,0x6b,0x96,0x7f,0x2d,0xab,0x9c,0xb4,0x4e,0x4d,0xa8, +0xbf,0x8f,0xa9,0x5c,0x98,0xed,0x61,0x9b,0x67,0x40,0x09,0xbd,0xf3,0x69,0x3e,0x73, +0x34,0xcb,0x33,0xbc,0x36,0x8b,0x76,0xa1,0x61,0xe9,0x2c,0x5b,0x99,0xe1,0x2c,0x69, +0xde,0x53,0x1e,0xd3,0xf3,0xb1,0x45,0xf1,0xc4,0xce,0xc2,0x9d,0x79,0x75,0xf7,0x7c, +0xbe,0x69,0x19,0x9a,0xdc,0x9f,0x4c,0x08,0x45,0xed,0x79,0x3a,0xf1,0xd2,0x52,0x70, +0xd6,0xd4,0xc5,0x9c,0x58,0xd2,0x7a,0x76,0x23,0x73,0x9e,0xc6,0x81,0x8a,0xc7,0x07, +0x24,0x76,0x32,0x24,0x93,0xcd,0x42,0x55,0x89,0x10,0x8a,0x51,0x7a,0xd9,0x0e,0xbd, +0x20,0x75,0x5e,0x2b,0x52,0x75,0x66,0x77,0x08,0xd6,0x94,0x50,0x10,0x7c,0xfe,0x81, +0xb2,0x54,0xdd,0xd8,0xb4,0xb4,0x6f,0x59,0x09,0x32,0x03,0xa2,0x38,0x55,0x13,0xfd, +0xef,0x55,0xd5,0xc0,0x4e,0xbe,0x5d,0x02,0x89,0x82,0xcb,0x40,0x18,0x33,0xd9,0x07, +0x17,0x1c,0x2a,0x1e,0x78,0x32,0x1e,0x75,0x5b,0xdb,0xce,0xbc,0x93,0x49,0x52,0x64, +0xc3,0xe2,0x0f,0xdb,0xfb,0x3d,0x9f,0xa8,0x79,0x16,0x61,0x7b,0x7f,0x1b,0x58,0x76, +0xae,0xa1,0x07,0xcc,0x68,0x97,0x4d,0xa8,0x4f,0xf7,0xb7,0xa8,0x93,0x4b,0xdf,0x74, +0x29,0xa0,0x87,0x99,0xb0,0xaf,0xa0,0x2a,0xd5,0x51,0x24,0xfd,0xe9,0xd6,0x82,0xb3, +0x2b,0x0c,0x44,0xac,0x3e,0x38,0x04,0x00,0x2a,0x80,0xec,0x5c,0x86,0xd3,0x4a,0x3a, +0xab,0xbd,0x31,0x1b,0xf9,0x1d,0x9a,0x32,0xd8,0xd7,0x0f,0x78,0x39,0x77,0x27,0x7e, +0x89,0x95,0x57,0x25,0xd1,0xf3,0xe7,0x9e,0xe4,0x82,0x73,0x8f,0x05,0x6b,0x75,0x5b, +0x45,0x14,0x87,0xd4,0x39,0xd8,0xd8,0x06,0x02,0xbc,0xa0,0x58,0x31,0x72,0x18,0x72, +0x0c,0x89,0x36,0x79,0xb3,0xa4,0x87,0x17,0xa5,0x5f,0xbc,0x59,0xf3,0xfb,0x0e,0x2a, +0x1d,0xc3,0xda,0x13,0x51,0x2c,0x7c,0xef,0x44,0xfa,0x2d,0xf1,0x8b,0xe9,0xf6,0x10, +0xb8,0x92,0xa2,0xef,0xf6,0xef,0x4e,0xdd,0x49,0x80,0xe2,0x41,0x2b,0x4f,0xeb,0xbf, +0xb6,0x02,0x51,0x1f,0xf6,0x5c,0x60,0x83,0x60,0x4a,0xbf,0xc6,0xe5,0xc3,0x40,0x7b, +0x00,0xe6,0xb9,0xf3,0xb3,0x5d,0xf5,0xcd,0x46,0xe4,0x47,0x06,0x50,0x66,0xa8,0xc2, +0x3a,0x8f,0x38,0x34,0xe8,0x2c,0xc1,0x02,0x07,0xce,0xc0,0x8c,0xbe,0x06,0x5e,0x83, +0x9a,0xea,0xf9,0xc7,0x14,0x01,0xf0,0x0c,0xe5,0xa6,0xfc,0x9c,0xf8,0x40,0x6f,0xa2, +0xb3,0x27,0x69,0x37,0xdb,0x5a,0x47,0x01,0x78,0x9c,0xef,0x15,0x28,0x6a,0x1c,0x27, +0xab,0x9a,0x5a,0xe6,0x6e,0xe5,0x36,0x4a,0x6b,0x65,0x92,0x36,0xb5,0x99,0x39,0xfc, +0x3e,0xa1,0xf5,0x7b,0xc1,0x68,0x32,0x57,0x4b,0x0b,0xab,0x3c,0x51,0x42,0xdb,0xe3, +0xb6,0x27,0xdc,0x30,0xa0,0xe8,0xb2,0xec,0x0e,0xaa,0x2c,0xcf,0x9c,0x45,0xd3,0xeb, +0x85,0x84,0xf2,0xa6,0x38,0x14,0xef,0xc5,0x13,0xa5,0xaa,0xc0,0xee,0x58,0x42,0xd3, +0xe7,0x9d,0xf8,0x5a,0x3f,0xec,0x34,0x82,0x69,0x41,0x26,0x90,0x3d,0x36,0x28,0x37, +0x0c,0x2d,0x50,0xa1,0x90,0x2b,0xa3,0x7a,0x70,0x6f,0x82,0x59,0xa6,0xe2,0x3b,0x46, +0x03,0xcc,0xc3,0x0e,0xad,0x25,0x89,0x63,0x59,0x51,0x33,0xea,0xf0,0x73,0x35,0x77, +0xcb,0x8b,0xef,0x9f,0xd9,0xa9,0x41,0x88,0xa1,0x72,0xfd,0xca,0x5f,0xf1,0xdb,0x86, +0x5f,0xbb,0xfd,0xb6,0x91,0x4f,0xb6,0x4a,0x04,0x9d,0xa1,0x46,0x34,0x5f,0xec,0x6b, +0x08,0x65,0x2c,0x94,0x31,0x44,0xa9,0x5a,0x03,0x2c,0x7c,0x33,0x80,0xf9,0x12,0x8b, +0x58,0xe3,0x09,0x14,0x88,0xb8,0xca,0xa1,0xe0,0x27,0x24,0xe6,0xa9,0x9c,0xbf,0xa8, +0xbd,0x66,0x38,0x7f,0xd5,0x4e,0xc5,0xcd,0x6a,0x75,0x3c,0x33,0xb7,0xaa,0x1c,0x32, +0x00,0x35,0xa3,0xa4,0x4b,0xbd,0x62,0x80,0x06,0x9f,0x8f,0x95,0x18,0x5f,0x52,0xfe, +0x84,0x1e,0x36,0xa0,0xc8,0xdb,0x2a,0x22,0x3b,0x2a,0xc4,0x09,0x9e,0xfa,0xe4,0x47, +0xa8,0x41,0x65,0xc5,0xb4,0xad,0x0c,0x9c,0x01,0x7b,0x8d,0xfa,0x16,0x57,0xa8,0xe2, +0xb3,0x38,0x8f,0xd6,0xb4,0xc7,0x43,0x46,0x8f,0xda,0x29,0x09,0x94,0xbf,0x35,0x0e, +0x57,0xf1,0x5e,0x06,0x99,0x47,0xa3,0xea,0x28,0xc3,0xbe,0xbf,0x17,0xa9,0xd0,0xf8, +0xec,0x13,0x2e,0x9c,0x39,0x4c,0xbe,0x85,0x51,0xc2,0xaf,0x5e,0x69,0xbb,0x80,0xbe, +0x2e,0x9e,0x4b,0x1c,0x80,0xb2,0xa3,0xcd,0x13,0xde,0xb3,0xad,0xef,0x57,0xa8,0x68, +0xd5,0x90,0x3a,0x77,0x91,0x46,0xeb,0xc4,0x4a,0x66,0xfd,0xd3,0xfc,0x5b,0xc6,0xb8, +0x4c,0x5b,0x86,0x79,0x6c,0xb1,0x64,0x0f,0xdd,0x21,0x36,0x6b,0x50,0x61,0x16,0x2a, +0xb1,0x3c,0x15,0x21,0x1b,0x16,0xa8,0x48,0x7b,0xb1,0xf8,0x4b,0xff,0x11,0x19,0xcc, +0x47,0xef,0x78,0xaf,0xfe,0x33,0x8d,0xfa,0x80,0x73,0x8f,0xc8,0x07,0xf1,0xee,0x28, +0x2b,0x12,0x3e,0x37,0xd4,0x7c,0x58,0xfd,0x3f,0xbb,0xc8,0x4b,0x03,0xdc,0xc0,0xf9, +0x2d,0xfd,0x80,0x81,0x1c,0xa8,0x06,0x95,0xbf,0x1d,0x06,0xc4,0x56,0x80,0x55,0x11, +0xb8,0x6d,0xcc,0x95,0x19,0x21,0xd3,0xb4,0x4f,0x89,0x46,0xb5,0x5b,0x82,0x13,0x05, +0x6b,0x31,0x55,0xa0,0xbe,0x01,0xd1,0xa4,0xbf,0xc9,0x45,0x84,0xde,0x89,0x6f,0xb0, +0x80,0x43,0x4d,0x10,0xda,0x4b,0x21,0xdf,0x6d,0x4e,0x47,0xb4,0xd9,0x00,0x04,0xc1, +0x08,0x26,0x94,0x46,0x08,0xf9,0xd6,0xc0,0x60,0x44,0x10,0xe0,0xe7,0x7f,0x48,0xf1, +0x03,0xaf,0x73,0x24,0xaf,0x2c,0x16,0xa1,0x08,0x85,0x23,0xb6,0xf2,0x7a,0x05,0xc0, +0x88,0x26,0xdb,0xeb,0xb3,0x96,0xc5,0xc4,0xe4,0xec,0x01,0x03,0x2d,0xeb,0xc5,0xf4, +0xab,0x25,0xc8,0x2b,0xf2,0x50,0x59,0xf4,0xcd,0xef,0x19,0xf5,0xd6,0xfa,0x26,0xd7, +0x85,0x35,0x56,0x28,0x12,0x08,0x04,0x99,0xa3,0x2b,0xc6,0xa9,0x37,0x83,0x5f,0x31, +0xe2,0x1a,0x5e,0x1c,0x51,0x43,0xca,0xc8,0x4c,0x0b,0x4e,0x39,0x73,0x0a,0x65,0xa0, +0x77,0xa7,0x45,0x18,0x92,0x48,0x2d,0x99,0xfe,0xe5,0x47,0x88,0xb6,0x81,0x35,0xb0, +0x8f,0x89,0x5f,0x3c,0x93,0x09,0xdf,0x6d,0x68,0x94,0x4f,0x98,0xf7,0x48,0x96,0xf9, +0x42,0x0c,0xda,0x49,0xec,0x79,0x1c,0xbc,0x27,0xa7,0xfa,0x0e,0xa3,0x60,0x9e,0xd9, +0x64,0x6f,0x4e,0xa1,0xe4,0x6c,0xde,0xdd,0x07,0xa6,0x65,0x3e,0xfa,0x98,0x17,0x4c, +0xe1,0x66,0xc1,0x56,0xb0,0x2a,0xd5,0x9c,0x86,0x4c,0xeb,0x13,0x5b,0x63,0x9f,0x48, +0xa5,0x6c,0xf5,0xfc,0x19,0xfe,0x85,0x89,0x80,0xe5,0x58,0xf9,0xd5,0xa3,0x62,0x28, +0x21,0x50,0x5a,0x85,0x12,0x33,0x2a,0x04,0x66,0xd2,0x4a,0x51,0x7a,0x52,0x19,0x63, +0xa5,0x9c,0xd4,0x30,0x7f,0xda,0xcc,0xaf,0x4f,0x13,0x48,0xc0,0x1c,0xba,0x21,0x5b, +0xc3,0x1b,0x01,0x21,0xba,0xd9,0xdb,0xe1,0xa0,0x86,0x41,0xb4,0xde,0x11,0x5f,0xae, +0x4a,0x77,0x0f,0x35,0x93,0x53,0xd9,0x41,0xe7,0x31,0x83,0x60,0x94,0xba,0x14,0xc0, +0x06,0x57,0xac,0xa6,0xc5,0x5a,0xa5,0x4e,0xd4,0x21,0x61,0xe8,0x74,0x7e,0xd6,0xc5, +0x21,0x75,0xd9,0xa7,0x15,0xbc,0xed,0x5f,0xdd,0x9e,0xe2,0xf8,0x31,0xca,0x51,0x34, +0xcd,0xdf,0x05,0x44,0xed,0x3e,0xe0,0xce,0xcd,0x3d,0xd5,0x5a,0xfa,0x54,0x99,0xd1, +0xa9,0x35,0x3c,0xb5,0xf7,0x9a,0x8e,0x2d,0xd4,0x0c,0xe7,0x0a,0xf5,0xc4,0xc6,0x18, +0x31,0x7b,0x56,0xad,0x76,0xd3,0x1c,0xdb,0x4e,0x57,0x14,0x09,0x56,0x1b,0xa9,0x29, +0x2f,0x7b,0xde,0x3c,0x35,0x1b,0x18,0x0d,0xe1,0xea,0x54,0xc9,0x1c,0x99,0x61,0xeb, +0x43,0x99,0xc3,0x18,0xdf,0x1a,0xa3,0xda,0xc6,0x55,0x49,0xd9,0x95,0xd1,0x55,0x69, +0xa8,0x59,0x4b,0x68,0x92,0x19,0x1a,0xba,0xfd,0xf6,0x4b,0x18,0xd7,0xd1,0x02,0x6d, +0x04,0x7f,0x16,0xbc,0x86,0x37,0x8f,0xeb,0xee,0x38,0x98,0x68,0x30,0x39,0x90,0x2d, +0x44,0xf6,0x71,0xac,0x33,0x34,0x5e,0x07,0x94,0xa2,0x4e,0x8f,0x5d,0xf4,0x45,0x69, +0x80,0x3c,0x06,0x49,0x89,0x5a,0x75,0xe9,0xea,0x5e,0xdf,0xe8,0x85,0x81,0x9f,0xfd, +0x8d,0x3f,0x4b,0x20,0x44,0x7e,0xa0,0x06,0x16,0x59,0x6e,0x9d,0xb3,0xd2,0x75,0x69, +0x89,0x36,0xa0,0x87,0x1a,0xc3,0x84,0x40,0x2c,0x63,0xf4,0xd3,0x3b,0x4a,0x72,0x10, +0x97,0x8b,0xbc,0x97,0x5b,0x41,0xc3,0x75,0xac,0xa2,0xfc,0xb7,0x7b,0x82,0x1a,0x73, +0x04,0x9d,0x7f,0xf2,0xdf,0xc1,0xce,0x50,0xa6,0x11,0xb7,0x86,0xfa,0x81,0xa9,0xee, +0x8d,0x2e,0x6d,0x92,0xbb,0x81,0x5e,0x49,0xa4,0xc7,0xf7,0xe6,0xba,0xc3,0xb4,0x42, +0x06,0x84,0xd7,0xc1,0xfd,0xe7,0x3e,0x73,0x64,0xe7,0x30,0xe2,0xbb,0xea,0x68,0xf7, +0x29,0xe6,0x38,0x30,0xec,0x3e,0x36,0x37,0x69,0x86,0x03,0xb4,0xf6,0x5a,0x61,0x43, +0x86,0x86,0x21,0xd6,0x98,0xbd,0x35,0xb7,0x8d,0x6c,0xc9,0x98,0x55,0xeb,0xbd,0x03, +0xc6,0x0f,0xe9,0xd3,0xcb,0xf6,0xfd,0x16,0xea,0xae,0x91,0x15,0x24,0x8b,0x73,0x4d, +0xc6,0x4b,0x7c,0xdf,0x13,0x89,0x4b,0x59,0x6a,0x41,0xe6,0x8b,0x72,0x03,0x68,0xe9, +0x3f,0x7d,0xfa,0x1b,0x17,0xeb,0x19,0x9e,0x95,0xaa,0x6e,0xbf,0x11,0xca,0x2b,0x1a, +0x65,0x49,0xe7,0x9a,0xd0,0xa9,0x13,0xa1,0xcf,0x4a,0x6d,0xfe,0x97,0x89,0xfd,0x68, +0xe3,0xe5,0x75,0xea,0x97,0x49,0xd7,0x44,0x07,0xa8,0x6f,0x9a,0x96,0x41,0x68,0x1a, +0x4f,0x0c,0xd8,0xb5,0xeb,0xa0,0x6c,0x1b,0x27,0x27,0x32,0xef,0x01,0xe6,0x60,0x0a, +0x4e,0x05,0xd4,0x42,0x19,0x0f,0x65,0x03,0x36,0x74,0x3f,0x86,0xb9,0x56,0xb7,0xee, +0xa0,0x24,0xdb,0x30,0x1f,0xa3,0xad,0x9e,0xa1,0x77,0x7b,0x93,0x38,0x15,0x61,0x0b, +0xcf,0x8c,0x38,0x9d,0x3e,0x50,0xe4,0x06,0xb2,0x36,0x1e,0x0d,0x34,0xfc,0xe0,0xd6, +0x85,0xcf,0x62,0x73,0x78,0xb3,0x60,0x53,0xc7,0x20,0x7e,0xd2,0x1d,0x3a,0x7e,0xad, +0x4f,0x2a,0xf4,0x12,0x59,0xba,0xf8,0x5f,0x06,0xd9,0xe8,0xb3,0x51,0xb0,0x91,0xe1, +0x1b,0x47,0xf1,0x83,0xb2,0x73,0x07,0x92,0x82,0x90,0x6b,0xd3,0xbc,0xf1,0xa9,0x17, +0xf9,0xc2,0x6d,0x93,0x9b,0x90,0xfd,0x36,0xa0,0xde,0x2d,0x93,0xd1,0xb2,0x24,0x47, +0x08,0xb6,0xda,0xda,0x05,0x40,0xe7,0xd9,0xe8,0x7b,0x24,0x54,0xc8,0xf6,0x2c,0xd2, +0x6b,0x97,0x68,0xe9,0x1d,0xf4,0x42,0x56,0x06,0x82,0x9d,0x72,0x3d,0x6d,0xa1,0x66, +0x88,0xf5,0x25,0x56,0xe7,0xbe,0xa5,0x98,0x68,0x09,0xac,0x43,0x53,0xed,0xa9,0x76, +0xa7,0x7c,0x32,0x28,0x93,0x4c,0x65,0x72,0x0e,0x94,0xf5,0xf2,0x0b,0xd4,0x9b,0xb7, +0xd3,0xc5,0x26,0x0f,0x7b,0xb3,0xcd,0x8d,0xcd,0x27,0x26,0xaa,0x5e,0xdb,0x55,0xf1, +0x46,0x96,0x2e,0x3b,0x17,0xd9,0xb2,0x1f,0x4b,0xf8,0x6a,0x1b,0x53,0x9a,0xf4,0xd0, +0x51,0x26,0x67,0xba,0x9f,0xf8,0xa7,0xab,0xe2,0xba,0x33,0x0a,0xd2,0x99,0xa8,0xa9, +0x9a,0x9b,0x6b,0x4b,0x9e,0xf9,0x7b,0xae,0x82,0x1b,0x3b,0x1f,0xd7,0x9b,0xe2,0x6f, +0x00,0x9e,0x19,0xea,0xbc,0xdb,0x6c,0xc5,0x4f,0xac,0x66,0x13,0x81,0xbd,0xba,0x2f, +0x40,0xf6,0xb4,0xc3,0x39,0x3f,0x66,0xeb,0x86,0x9e,0x01,0xda,0xfd,0xf5,0x67,0xde, +0xac,0xfc,0x98,0xad,0x41,0xd2,0x49,0x4f,0x8f,0xa9,0x28,0x10,0xda,0x05,0xbb,0x7e, +0xad,0x9f,0x5c,0xa5,0x3e,0xb2,0x0d,0xd5,0xaf,0x2b,0x43,0x80,0x5c,0xbe,0xa7,0x2c, +0xe1,0xaf,0x93,0x38,0x58,0xb1,0xd0,0xb1,0x23,0xbf,0xd2,0x77,0xa1,0xe9,0x1f,0xef, +0xea,0x70,0x8e,0x39,0x70,0x30,0x1c,0x25,0x47,0x03,0x25,0x44,0xe7,0x68,0x96,0xf2, +0xa2,0xa9,0xbf,0x3d,0xb3,0x62,0xd1,0x25,0xaa,0xb5,0xb1,0xaf,0xd1,0xe0,0x77,0x29, +0x87,0x41,0x87,0x38,0xb2,0xf4,0x63,0x43,0x62,0x26,0x8d,0x5a,0xb0,0x16,0xfa,0x87, +0xc0,0x54,0x6c,0xd7,0x34,0x2e,0x6e,0xbc,0xe5,0x5f,0x79,0x75,0x78,0x4c,0x11,0x47, +0x64,0xf5,0xb6,0x52,0xf2,0xa6,0x5d,0x92,0x70,0xe7,0xe6,0x15,0xf0,0x7e,0x49,0x55, +0xe5,0x56,0x91,0xb5,0x7c,0x57,0x13,0x07,0x40,0x45,0x3c,0xe7,0x7c,0x6f,0x89,0x35, +0x9d,0x01,0xe9,0xa6,0x1f,0x2a,0xe1,0xf3,0xe1,0xb7,0x7a,0x03,0x7f,0x68,0x78,0x7a, +0xab,0x6d,0x42,0x89,0x70,0x25,0x6a,0xac,0x4e,0xc7,0x8a,0xb4,0xe5,0xe1,0x19,0xf8, +0x0d,0xa9,0xf4,0xbc,0xf0,0x98,0xe5,0x7f,0xa0,0x4a,0x6f,0x38,0xd9,0x2b,0x7b,0x18, +0xf8,0xa7,0xfd,0x30,0x34,0x27,0x2b,0xd7,0x64,0x47,0x22,0x4d,0x96,0x1d,0x9e,0x69, +0xb9,0xa3,0x27,0x8f,0xa9,0x23,0xfc,0x47,0xa8,0x4f,0x5b,0xac,0x38,0x92,0x12,0x41, +0xab,0xa3,0xbf,0x3e,0x65,0x0c,0x2a,0x2f,0xa3,0x96,0x8f,0x74,0xf7,0x09,0x13,0xc1, +0xac,0x16,0xf7,0x16,0x1d,0x0f,0x03,0x62,0x4d,0x64,0x6e,0x9e,0xf7,0xe6,0x88,0x0f, +0xca,0x83,0x38,0xb6,0x69,0x32,0x35,0x08,0x21,0x6d,0xab,0x85,0x82,0x23,0x0b,0xbf, +0xb8,0x4f,0x6f,0x2e,0xfd,0xd7,0xa5,0x91,0x57,0xe2,0xdf,0x9f,0xdd,0x46,0x01,0x04, +0x26,0x9f,0x17,0xbf,0xbe,0xb9,0x10,0x88,0xa8,0xe1,0xaa,0x99,0x11,0x74,0x2c,0x24, +0xa3,0x80,0x4e,0x90,0xd3,0x58,0x62,0x10,0x8a,0x20,0x5c,0x25,0x90,0xae,0x3f,0x63, +0x0c,0x1d,0x19,0x65,0xae,0x70,0x86,0xd3,0x0b,0xa3,0xf7,0xa7,0xf1,0x10,0x73,0x60, +0x02,0x63,0x8e,0x11,0xbf,0x92,0x63,0x89,0xe7,0x11,0x02,0x55,0xa1,0xae,0xfc,0x28, +0x78,0x5b,0x96,0x14,0x79,0x8b,0x6a,0x30,0xfe,0x5b,0xe0,0xb8,0x11,0xeb,0x87,0x17, +0xe9,0x3c,0xb7,0xa7,0x19,0x9e,0xdc,0xe1,0x45,0xf8,0xe6,0x44,0xa7,0xda,0x85,0x39, +0x1d,0xbb,0xfb,0x60,0xf1,0x94,0x77,0x92,0x41,0x5f,0xc3,0xd1,0x19,0x32,0x05,0xc0, +0x4a,0x3e,0xb5,0xdd,0x53,0xb6,0x17,0xc0,0xc5,0xd5,0x79,0x97,0xd0,0x37,0x38,0xb0, +0x2e,0x5a,0xbc,0x6e,0x94,0x37,0x6c,0xca,0x9f,0x3d,0x8c,0xd5,0x59,0xf8,0x76,0x95, +0xc9,0xb8,0x8b,0xef,0x4d,0x7b,0x4e,0xcb,0x15,0x1b,0x29,0x85,0x5d,0x82,0x14,0xfa, +0x94,0xb1,0xa1,0xb1,0xc0,0x3e,0x2f,0x56,0x67,0xfc,0x2c,0x1f,0x85,0x1a,0xab,0xa2, +0x2d,0x84,0x4b,0xa8,0x58,0x34,0x5d,0x6c,0xe8,0x1a,0x60,0x99,0x18,0x60,0x44,0x3b, +0x7d,0x07,0xf5,0x3f,0xbe,0xb1,0x70,0x4c,0xc9,0xd8,0xe2,0xa0,0x93,0xbd,0x17,0xc6, +0xce,0xeb,0x0e,0x5d,0xae,0x90,0xa3,0x0b,0x41,0x46,0xf8,0x1e,0x43,0xd2,0x00,0xaf, +0x55,0x72,0x95,0xd6,0x51,0x5a,0x0e,0x65,0x4d,0xd3,0xf1,0x3d,0x59,0xfb,0xb0,0x49, +0x5c,0xb2,0x1d,0x0d,0x0f,0xc0,0x9e,0x9f,0x14,0xf2,0x4e,0x8f,0x10,0x9e,0xb5,0xe2, +0xb9,0x0d,0xa5,0x75,0x6c,0x26,0x49,0x51,0x38,0x49,0xa8,0xb2,0x52,0x82,0x71,0x52, +0xa0,0x3e,0x57,0x32,0x13,0x63,0x9b,0x0f,0x99,0xc2,0x83,0x46,0xd5,0xf7,0x5f,0x2e, +0x6f,0x13,0xa1,0xc7,0x98,0x59,0x11,0xa9,0xc7,0x22,0xb0,0xa3,0x96,0x4e,0x5b,0x12, +0x9d,0xc1,0x29,0xe8,0x77,0xca,0x1f,0x0b,0xbd,0x63,0xf1,0x3b,0x2d,0x32,0x98,0xaa, +0x48,0xcb,0x9e,0xf2,0xff,0x07,0x08,0x94,0x40,0x2f,0x80,0x04,0x65,0x90,0x38,0x4f, +0xa6,0xe9,0xba,0x0f,0xfc,0x26,0x82,0x00,0xc5,0x11,0x80,0x52,0xb6,0x4a,0x31,0x5f, +0xdc,0x80,0x6a,0xb4,0xfc,0x0b,0x46,0x8b,0x52,0x3b,0x63,0xe5,0x78,0x4f,0x0f,0x8f, +0xb4,0x55,0xd7,0xf2,0xc6,0x08,0x25,0x91,0x45,0xc3,0xe8,0x84,0x82,0xe1,0x64,0xfa, +0x6d,0x71,0x24,0x7d,0x68,0xce,0x21,0x59,0x3c,0xc3,0x05,0x17,0x5a,0x39,0x15,0xfa, +0x51,0xcb,0x15,0x6e,0x7a,0xa2,0x58,0x12,0xa4,0xb8,0x0d,0x07,0x79,0x87,0x3b,0x0f, +0x0c,0xba,0xb9,0xfb,0xbd,0x5a,0xb3,0x3a,0xf0,0xa6,0x58,0x30,0xa4,0xab,0x6d,0xeb, +0x6f,0x72,0xbd,0x6c,0xe9,0xad,0x59,0x3b,0xce,0x8b,0x85,0x9f,0x1f,0x7f,0x9a,0x2c, +0xf1,0x8f,0x36,0x43,0x0a,0xa8,0xd2,0x08,0xc3,0xae,0x59,0xa3,0xfd,0xea,0x92,0x38, +0xe4,0x57,0xa4,0xa1,0xf6,0x0e,0x7e,0x09,0x0c,0xb9,0x68,0x0d,0x3b,0x81,0xdd,0x43, +0x6d,0x0e,0x4a,0x3c,0xf8,0x24,0x8e,0x8b,0xca,0xb5,0x85,0xc4,0x7d,0x41,0x83,0x4b, +0xbc,0x5d,0xa1,0x8e,0x68,0x02,0x03,0x69,0x24,0x8c,0x9d,0xba,0xde,0xaf,0x93,0xae, +0x22,0xc1,0x10,0x64,0xbb,0x1d,0x0a,0x9b,0x0d,0x41,0x73,0x40,0xf9,0xeb,0xec,0x16, +0xc6,0x0c,0x3b,0xe6,0xb5,0x37,0x24,0x3a,0xea,0x2c,0xc2,0x17,0x46,0xd7,0x02,0x07, +0xe6,0x60,0xf5,0x15,0x25,0x1f,0x6d,0xa7,0x0d,0xa3,0x16,0xd1,0x3e,0xdb,0x55,0xb4, +0x5c,0x9c,0x8d,0xd7,0xe4,0xf1,0x5f,0xf9,0x10,0x5a,0x7d,0xd6,0x1a,0x57,0xaf,0x85, +0xf0,0x9c,0xda,0x77,0x75,0xe1,0x20,0xa5,0xb8,0xdc,0xca,0xd3,0xfb,0x52,0x12,0x0e, +0x14,0x17,0x5d,0x2d,0xde,0xd6,0x42,0x22,0xad,0x96,0x75,0x72,0x2c,0x60,0x63,0xbc, +0xc6,0x49,0x1e,0xb4,0xd4,0x3c,0xf5,0x82,0x2e,0xba,0xbf,0xa7,0xf2,0xd3,0x53,0x0f, +0x00,0x8c,0xa7,0xfb,0x44,0x1a,0x82,0x9c,0x68,0x21,0xc5,0x97,0xf3,0xd2,0xe6,0x1b, +0x4f,0x1f,0x64,0x8a,0xc3,0xc7,0x16,0x38,0xec,0xd0,0xce,0x0a,0x4f,0x1c,0x51,0x6a, +0x25,0x96,0x11,0xe2,0x1c,0x29,0x06,0x49,0x11,0xbc,0xa6,0xae,0x9a,0xe2,0xd6,0x87, +0xaa,0xd8,0x99,0xb3,0x32,0x65,0x30,0x2f,0xea,0x55,0x6d,0xb2,0x15,0xb9,0x9b,0x6b, +0x89,0x94,0x6f,0x1a,0xad,0xf9,0x07,0x48,0xcf,0x7f,0xdb,0xab,0xce,0xdd,0xa5,0xac, +0x46,0x46,0xb2,0x3f,0x9d,0xac,0x7e,0xef,0xf3,0x21,0xa5,0x9d,0x4a,0x5d,0x6c,0xd3, +0x8a,0x86,0x4e,0xac,0x5d,0x09,0x00,0x4b,0x84,0x5e,0x3e,0x27,0x51,0x62,0x3e,0x5a, +0x09,0x9d,0xd5,0xff,0x1c,0x11,0xda,0x99,0x05,0x1d,0xcf,0x10,0x17,0xcf,0x2d,0x3d, +0x9c,0x3d,0x91,0xd8,0xb9,0x9d,0x01,0x5e,0x58,0x82,0x4b,0x9d,0x04,0x91,0x59,0x92, +0xa5,0xb6,0xbe,0x58,0x78,0x2d,0x5c,0x33,0x24,0x0a,0x50,0xb4,0x0f,0xf5,0x70,0x98, +0xa4,0x88,0xb2,0xa4,0xfb,0x8e,0x7d,0x4a,0xe6,0x51,0x1f,0xb7,0x85,0x82,0x3a,0x71, +0x00,0xad,0x93,0x99,0x7b,0x66,0x48,0xa7,0x67,0x59,0x44,0x1e,0xa2,0x20,0x29,0x82, +0x22,0x0b,0x2d,0x6b,0x32,0x46,0x26,0xd7,0x20,0xec,0x3e,0x9d,0x5e,0xce,0x8f,0x7a, +0x3c,0xb1,0x3f,0x60,0x9f,0xa9,0x90,0xe4,0x8e,0x06,0x68,0x9b,0xdf,0x7f,0xeb,0xf9, +0xdf,0x56,0xaa,0x54,0xe4,0x3e,0x4e,0xc0,0x45,0x07,0x99,0x12,0x85,0xba,0x12,0xc5, +0xde,0x20,0xa7,0x89,0x6d,0xab,0x95,0x9f,0xa1,0x30,0xb5,0x03,0x0c,0x99,0xa5,0x22, +0xb5,0x81,0x6a,0x12,0x36,0xd1,0x42,0x8e,0x4e,0xea,0x49,0x4b,0x98,0x92,0x82,0x2b, +0x7a,0xa5,0x3d,0xee,0x1e,0x92,0x5f,0x17,0x7c,0x9d,0xc3,0xbe,0xe9,0xc5,0x12,0x00, +0x6a,0x40,0x26,0x63,0xdb,0xd6,0xda,0x18,0x49,0x52,0x3e,0x7c,0x1d,0xc2,0x49,0x99, +0xe1,0xeb,0xb3,0xfd,0x67,0x25,0x06,0xad,0xbb,0xda,0x45,0x5d,0x58,0xec,0xcb,0xc0, +0xe7,0x49,0x30,0x6d,0x19,0xad,0xfa,0x5f,0xea,0x0b,0x4d,0x38,0xb2,0x78,0x7b,0x3b, +0x30,0x85,0x79,0x3c,0x9a,0x83,0x57,0x6a,0x66,0xc7,0x18,0x23,0xa7,0x10,0xc8,0xa9, +0x31,0x6d,0xea,0xcf,0xb8,0x6c,0x9a,0x6f,0xb4,0xc6,0xe4,0xac,0x30,0x62,0x63,0xdb, +0x06,0x06,0xbb,0xc5,0x3f,0xa7,0x96,0x58,0xa8,0x0c,0x7a,0x13,0x4f,0x2f,0x15,0xf5, +0x3a,0x63,0xf3,0xa7,0x37,0x22,0x9e,0x48,0xb5,0x0d,0x5b,0x4f,0x2f,0x60,0x57,0xf3, +0x4c,0x19,0xba,0xa8,0x11,0x70,0x1c,0xb4,0x89,0x1a,0xce,0x29,0x18,0xf3,0x34,0x6f, +0xc8,0x20,0x90,0xf6,0x79,0xf0,0xdc,0x69,0x1a,0x13,0xc6,0x38,0x19,0xf2,0x43,0xf2, +0x94,0xb3,0x99,0xe7,0xf8,0x03,0x0b,0x60,0xc1,0xd9,0x55,0x21,0x3c,0x8d,0xd9,0x6f, +0xc2,0xc9,0x91,0x3e,0x95,0xbe,0xd6,0xc7,0x1c,0x58,0x5d,0x31,0x3b,0x1f,0x06,0xcd, +0x23,0x36,0xba,0xc2,0x51,0xc0,0x94,0x65,0xcb,0x5e,0x74,0x96,0x10,0x80,0x8c,0xcd, +0xa9,0x7b,0x95,0x7e,0x96,0xea,0xa3,0x74,0x18,0x3c,0xba,0x38,0x10,0x71,0x85,0x51, +0x21,0xa4,0x16,0x36,0x3e,0x77,0xd6,0xda,0x94,0xdb,0xab,0xe2,0xd6,0x18,0x73,0x7d, +0x7d,0xca,0xcc,0xb3,0x4c,0x2c,0x63,0xed,0xe5,0x35,0xa4,0x8f,0x92,0x73,0xc6,0x51, +0x46,0x5a,0xf8,0x3d,0xd3,0xfb,0x8b,0xef,0x81,0x12,0x56,0x3c,0x7c,0xf3,0x3a,0x20, +0xc0,0xd8,0x7c,0x11,0x98,0x7b,0xb2,0xcb,0x6a,0xff,0x5e,0xc4,0x86,0xf2,0x48,0xc8, +0xa9,0x5a,0xd9,0x30,0x47,0x3c,0x71,0x68,0xa8,0xa5,0x72,0x9c,0x9a,0x38,0x17,0x09, +0x24,0xb6,0x4b,0x63,0x3b,0xfc,0x90,0xa9,0x35,0x54,0x7e,0x8c,0x9b,0x39,0x86,0x58, +0x76,0x14,0xa6,0xaa,0xc9,0x2c,0x6c,0xa8,0x76,0xfc,0xb7,0xc8,0x54,0xa3,0x09,0x5c, +0x77,0x3b,0x31,0xa2,0xad,0xe2,0x3c,0xfc,0x6a,0x1d,0x65,0x4c,0x97,0xa2,0x81,0x4d, +0xe8,0x10,0x7f,0x36,0x9e,0x48,0x85,0x9a,0x80,0x30,0x68,0xdd,0xdb,0x81,0xe3,0xaa, +0x9d,0xe9,0xf0,0x56,0x40,0xa2,0x59,0x4d,0x0a,0xf0,0x4f,0x8f,0xc8,0x08,0x6f,0x43, +0x05,0xc0,0x80,0xc6,0x58,0xed,0x71,0x44,0x67,0x80,0x89,0x61,0xbd,0xf3,0x6a,0x63, +0x61,0x88,0x17,0xf4,0x13,0x1b,0x26,0x6f,0x66,0x51,0xa2,0x34,0x97,0x7a,0x15,0xbb, +0x6d,0xe8,0x5e,0x83,0xcf,0xa7,0x05,0x9b,0x2d,0xc8,0xd3,0xaf,0x3d,0x01,0x6b,0xef, +0x85,0x2e,0xf6,0xe7,0xd5,0x02,0x95,0x40,0xc2,0x65,0xf1,0x23,0xbe,0x00,0x5e,0xee, +0xc4,0x96,0x9f,0x61,0xb7,0x7b,0xb0,0x75,0xcb,0x86,0x60,0xe4,0xb8,0xaf,0x0a,0xaa, +0x04,0x45,0x15,0x5e,0xb2,0x9a,0x6e,0xc2,0x41,0x87,0x85,0x51,0xf6,0xba,0x5f,0xea, +0xe7,0x82,0x55,0x25,0x69,0xeb,0x33,0x67,0xa5,0xb0,0xc9,0x8d,0x7a,0xeb,0x37,0xfa, +0x74,0x2c,0xe8,0x31,0x20,0xb7,0x62,0x8c,0xa4,0xb1,0x4d,0x15,0x68,0xa6,0xb3,0x3b, +0x4f,0x77,0xb3,0xfd,0x2c,0x08,0x7e,0xed,0x8e,0x48,0xc9,0xdf,0x6e,0xfa,0x65,0x23, +0x0b,0x33,0xc8,0x0f,0x1e,0xeb,0x96,0x49,0x4e,0x6f,0xe8,0x79,0x97,0xb9,0x98,0xba, +0xb4,0xc8,0x28,0x7c,0xc9,0xc6,0x3b,0x2f,0x64,0x59,0xed,0x9f,0xd4,0x47,0x27,0x5b, +0x89,0xae,0xad,0x2a,0xd5,0xfa,0xb4,0xfc,0x0f,0x4b,0xb3,0x3b,0x54,0x36,0xb3,0xc2, +0x75,0x6c,0x5a,0x01,0xad,0xed,0x64,0xd7,0x48,0x8e,0x2b,0x71,0x61,0x76,0xaa,0x47, +0x85,0xcf,0x15,0x2d,0x6f,0xce,0xb4,0x41,0x3d,0x40,0x43,0x20,0x7b,0x4c,0xa3,0xdb, +0x09,0x3e,0xdd,0x76,0xf6,0xa3,0x68,0x2c,0xc8,0x6c,0x5c,0x00,0x03,0x32,0xab,0x20, +0x02,0xcd,0x10,0xaf,0xcc,0x5e,0x84,0xff,0xb4,0xa6,0xc3,0x4f,0x8d,0x40,0xb5,0x11, +0x67,0x6f,0x41,0xe4,0xcb,0xdc,0x06,0x5d,0x57,0x76,0x74,0xe0,0xd5,0x9c,0xec,0x4b, +0x5d,0xd3,0x62,0xe5,0x47,0x19,0x5b,0xc0,0xa7,0xd1,0xef,0xe7,0x4b,0xfa,0x1b,0xaa, +0x66,0x92,0x9b,0x8e,0xb2,0x10,0x8d,0x58,0x69,0x2f,0x75,0x36,0xbb,0x5f,0x62,0xd2, +0xa4,0xd3,0x78,0x77,0xbf,0xf1,0x35,0xbe,0x67,0x0f,0xf9,0x33,0xbf,0xa6,0xdf,0x46, +0x64,0x64,0x85,0x3c,0xd7,0xcf,0x22,0xf1,0x04,0x27,0x0c,0xee,0xd1,0xb5,0x2e,0xdf, +0x24,0x15,0x95,0x11,0x33,0x97,0xad,0x5a,0x2f,0x56,0xb8,0xb8,0xf5,0x12,0x6d,0xcf, +0x29,0xd4,0xf6,0x2b,0xbe,0x89,0x53,0x4a,0x88,0x72,0x95,0x50,0xd1,0xb4,0x6b,0x62, +0x2e,0xca,0x22,0x55,0x59,0xfc,0x49,0x44,0x1b,0x14,0xdf,0xd3,0x1e,0xdc,0x12,0x32, +0x2a,0x22,0xe0,0xa0,0x3d,0x78,0xfb,0x5a,0x64,0xd7,0xbe,0xba,0x0b,0x98,0x08,0xaf, +0x70,0x3d,0x8e,0x1e,0x4a,0x26,0xc6,0x52,0xf7,0x94,0x65,0x44,0x02,0xeb,0x14,0x7b, +0xa4,0x95,0x7c,0x8a,0xc3,0xa7,0x6e,0x85,0x8f,0x58,0x68,0xc5,0x7c,0xf8,0xb9,0x5b, +0x65,0x5a,0x70,0x17,0x3d,0xeb,0xc4,0xb3,0x48,0x24,0x9f,0xb3,0xfb,0x79,0x58,0x7b, +0xa3,0x1a,0xde,0x34,0x92,0xb1,0xe6,0x6e,0x64,0x12,0x90,0xda,0x95,0xd7,0xb9,0x28, +0x0c,0x7f,0x5a,0xbc,0x1b,0xa6,0x7f,0x9c,0x94,0xcd,0x80,0x4e,0x6f,0x30,0x63,0x8b, +0xc3,0x33,0x98,0xe8,0x1f,0x61,0x2e,0x48,0x4b,0x41,0x67,0x07,0x6c,0x33,0x35,0x56, +0xc7,0x1c,0xc8,0xb9,0x48,0xaf,0xc7,0x05,0xff,0x92,0x81,0x4e,0xdb,0xff,0xa3,0x2c, +0xdc,0x71,0xd9,0xb9,0xb5,0xa0,0xb7,0x94,0x46,0xc2,0xb6,0x10,0x3c,0x7b,0xad,0x2c, +0xe0,0xae,0x8c,0x04,0x22,0xe0,0x65,0xb4,0x0b,0x55,0x1f,0x06,0x62,0x15,0x22,0x39, +0x58,0xb3,0x79,0x63,0x6f,0xa5,0x19,0xa5,0x8a,0xde,0xb2,0x53,0xbb,0x6d,0x8c,0xe2, +0xd1,0xf7,0xa9,0x34,0x6c,0xa4,0xe6,0x5a,0x4e,0xb5,0x0b,0xca,0xd7,0xa8,0xbb,0x80, +0x42,0x89,0x82,0x24,0x0d,0xa5,0xd4,0xe4,0x79,0x1c,0xc6,0x94,0xad,0x2b,0xeb,0xf9, +0xea,0xe4,0xb6,0x79,0x20,0x34,0x9e,0x98,0x41,0x08,0xa2,0x14,0x5a,0xe8,0x18,0xc1, +0x25,0x00,0x94,0xa5,0xb5,0xab,0x08,0x65,0x67,0x4d,0x88,0x54,0x77,0x99,0x31,0xa0, +0x20,0xf7,0xe9,0x44,0x72,0x88,0x01,0xf5,0xc5,0xac,0xa7,0x59,0xb0,0x16,0xa2,0x16, +0x84,0x05,0x02,0x2c,0x2b,0x5b,0x1a,0x38,0x3f,0x68,0xee,0x52,0xb3,0x59,0x08,0xe5, +0x01,0x0d,0xf8,0x1d,0x57,0x32,0xb7,0x46,0xd4,0x74,0xa4,0x14,0xd4,0x9f,0xef,0x9a, +0x98,0x02,0xa3,0x84,0x71,0x69,0x33,0x2d,0xbf,0x4a,0xca,0xa9,0x7d,0x95,0x8b,0xe4, +0x89,0xff,0x5a,0x7b,0xd9,0x64,0x84,0xd9,0xcd,0x3e,0xd3,0x39,0x05,0x7a,0x60,0xbb, +0x6e,0x17,0x57,0xa4,0x62,0x61,0x65,0x77,0x2e,0x57,0xc4,0x40,0xe9,0xa1,0x74,0x6c, +0x38,0x59,0x4b,0x65,0x28,0x8c,0x42,0x6c,0xaf,0x8c,0x61,0x9c,0x47,0xc0,0x60,0x3d, +0xab,0x8c,0xc1,0xbe,0xea,0x8a,0xf2,0x1f,0xa3,0x8f,0x28,0x9f,0xfb,0x1f,0xd1,0x39, +0xd3,0x14,0x91,0x58,0x3c,0x2b,0x61,0x91,0x8b,0x00,0xda,0xf9,0xd5,0x95,0xdf,0xde, +0x5f,0x01,0x13,0x74,0x48,0xc1,0x02,0xad,0xd3,0xfd,0xaa,0x91,0x18,0x59,0xcc,0x69, +0x0a,0x9c,0x8a,0x34,0x39,0x3b,0xdc,0x20,0x60,0x13,0x5c,0x4c,0x64,0x75,0xd8,0x90, +0xdb,0xed,0xfc,0xf6,0x92,0x7d,0x45,0x47,0xa8,0x22,0x6a,0x21,0xc5,0x9d,0x73,0xac, +0x4a,0x10,0xb3,0x98,0x3e,0xb5,0x5b,0x7b,0x5a,0x11,0x9f,0xc7,0xc2,0x33,0x04,0xa6, +0x01,0xd4,0x86,0x27,0xd9,0x85,0x8d,0xdc,0x59,0x6a,0xcd,0x9f,0xd1,0xd4,0x4e,0x36, +0x10,0x17,0x5f,0x24,0x4b,0x94,0xcd,0x18,0x0b,0xde,0xda,0x14,0xfe,0x34,0x47,0x27, +0x43,0x0d,0x05,0x55,0x19,0x99,0x8a,0xf0,0xe4,0x94,0x44,0x96,0xc6,0xff,0xf5,0xc1, +0x04,0x7b,0x5c,0x3f,0x16,0xc8,0xa2,0x17,0xe5,0xf5,0x62,0x07,0xd0,0xff,0x38,0xb4, +0x6a,0xe7,0x02,0x4c,0x7c,0x95,0x50,0x3b,0x97,0x65,0x6e,0x44,0x50,0x35,0x06,0x9c, +0x01,0x81,0x8c,0xee,0x0a,0x31,0xc5,0xb9,0xe9,0x19,0x9c,0x5a,0xf6,0x8f,0x39,0x29, +0x25,0xec,0x84,0x1f,0xb4,0x32,0xfb,0x36,0xe9,0xda,0x68,0x45,0xb6,0x37,0xcf,0x09, +0xa8,0x59,0x77,0xb9,0xd2,0x2a,0xc4,0xb9,0x74,0x86,0xd7,0xb9,0xf0,0xff,0x24,0xd8, +0x2b,0x5d,0xbc,0xac,0x7e,0xc1,0x06,0x17,0x0b,0x09,0xe8,0xf1,0x99,0x75,0x04,0x78, +0xd4,0xea,0x0b,0xcf,0x2f,0xcc,0xab,0x98,0x73,0xa0,0x87,0xcd,0xdc,0x7b,0x27,0xcb, +0xd1,0x13,0xc5,0x3e,0xc6,0x3a,0x4f,0xf5,0x17,0xd7,0x00,0x9e,0xee,0xfe,0x0f,0x59, +0x42,0x67,0xef,0x49,0x5a,0x90,0x45,0xd6,0xca,0xdf,0xf7,0x93,0xfd,0xdd,0x74,0x11, +0x7c,0xc4,0x18,0xf9,0xf6,0x80,0x64,0x51,0x6e,0xb9,0x8e,0x0f,0x5a,0x82,0xc4,0x81, +0x1d,0x89,0x2a,0x69,0xf7,0xe1,0x8f,0x82,0x43,0x43,0xa9,0x76,0x71,0xa3,0x07,0x3b, +0x08,0x8f,0xa3,0xef,0xb0,0xa6,0x29,0x07,0x30,0xa1,0xfb,0x9a,0x59,0x44,0x2b,0xee, +0x8d,0x87,0xaf,0xff,0xa7,0x0e,0xa5,0xf4,0x38,0x65,0xa5,0x54,0x3e,0x22,0x20,0xb2, +0x0e,0xcb,0xa9,0xae,0x32,0xe9,0x4e,0x2f,0x67,0x04,0xcf,0x84,0xbf,0xd4,0x52,0xba, +0x47,0xca,0x13,0x2b,0x34,0x95,0x33,0x94,0xc5,0x11,0x39,0xf2,0x51,0x43,0x38,0x4d, +0x62,0x47,0x1e,0xaf,0xee,0xeb,0x28,0x73,0x63,0x67,0xd1,0xe3,0x33,0x67,0x30,0x73, +0x22,0x26,0x52,0x47,0x7c,0xd6,0x21,0x11,0x38,0xdc,0x39,0xf2,0x88,0x5a,0xa2,0xf7, +0x0c,0x7c,0xf2,0xe8,0x80,0xeb,0xe0,0x54,0x86,0x6b,0x8c,0x1b,0xd1,0x4e,0x3d,0xf7, +0x45,0x32,0x06,0x8c,0x55,0xa3,0x04,0x37,0x8f,0x69,0x3a,0x58,0x1d,0xa6,0xf3,0xf7, +0x59,0x71,0xa5,0x17,0x75,0x5b,0x3b,0xaf,0x50,0xe9,0x21,0xef,0xca,0xf1,0xd4,0x9f, +0xf6,0xa0,0x2e,0x20,0xe1,0x0b,0x73,0x33,0xae,0xda,0xd9,0x3e,0xdc,0xc9,0x73,0xb5, +0x83,0x2a,0xbc,0x62,0x16,0xa8,0x70,0x0c,0xc3,0x3a,0x8a,0x18,0x3e,0xba,0x95,0x29, +0x37,0xe3,0x94,0x72,0x19,0x2f,0xba,0x82,0x5a,0x8c,0x85,0xfa,0x15,0x92,0x72,0x8b, +0x8a,0x75,0xe5,0x3d,0x75,0xdf,0x7b,0x7a,0x2f,0x81,0x33,0xeb,0x5b,0xe3,0x8c,0x1b, +0xe1,0x94,0x97,0xac,0xef,0xed,0x22,0x56,0xbc,0xcf,0xe9,0x05,0xd9,0x8d,0x62,0xd8, +0xdb,0xd2,0x5b,0x6e,0xe4,0x7d,0x99,0xc9,0x19,0xdb,0x8e,0x40,0x72,0x49,0x73,0xf7, +0x4e,0xf2,0xd3,0x12,0x6c,0x55,0xec,0xdf,0x44,0x4b,0x2a,0xc4,0x8a,0xea,0x63,0x89, +0x5f,0xd0,0x5a,0x6a,0x84,0x3f,0xb5,0x8c,0xc2,0x7f,0xe4,0xb8,0xc4,0x26,0x2d,0x8c, +0xc7,0xd1,0x0a,0xa2,0x86,0xe7,0x8e,0x02,0x19,0x10,0xfd,0xd1,0xd4,0xe3,0x3c,0xd3, +0x15,0xa1,0x71,0x2e,0x4e,0xf9,0xcb,0x50,0xd0,0xa4,0xe9,0x95,0x6e,0xfb,0x2c,0xb4, +0x65,0xda,0x54,0xc6,0xdc,0x04,0xfd,0xca,0x54,0x74,0x6d,0xb1,0xbd,0xa5,0xdd,0xa3, +0xea,0x8d,0xe7,0x34,0xc6,0xa6,0x4f,0x10,0xda,0x72,0xcf,0x14,0xc2,0x5b,0x4d,0xdb, +0x4e,0x76,0xec,0xb1,0xf7,0x18,0x27,0xf7,0x40,0x2a,0xb5,0xc3,0x94,0x85,0x64,0xca, +0x2a,0x3a,0x1c,0x71,0x03,0xa9,0xf6,0x3a,0x41,0xb6,0xd6,0xb0,0x46,0xf5,0x48,0x61, +0x2b,0x22,0x08,0x81,0x59,0x14,0x58,0x1f,0x6c,0x41,0x01,0x79,0xbf,0xb9,0x4e,0x74, +0xaa,0x38,0xf8,0x0e,0xba,0x02,0x88,0x38,0x8e,0x07,0x1b,0x3c,0x90,0x05,0xb3,0x6a, +0xc7,0x9b,0x3d,0x6d,0x9c,0xdb,0x01,0x1f,0xce,0x19,0xb7,0xb6,0x00,0x7d,0x70,0xab, +0xd1,0xde,0x75,0xdd,0x2a,0x4d,0x64,0xcc,0x4f,0x8e,0xe0,0xc2,0x78,0xbe,0xb8,0xb8, +0xd0,0x30,0x16,0x5a,0x31,0x17,0x6c,0x0c,0x4e,0x7c,0xec,0x80,0x79,0x9f,0xfe,0x3c, +0x2c,0x4a,0xbe,0xfe,0xdd,0x1e,0x65,0x04,0xcf,0x2e,0x51,0x6b,0xb4,0xa1,0x7e,0x1c, +0x71,0x97,0xff,0xbd,0xf7,0xa4,0x6d,0x0c,0xce,0x0f,0xe6,0x80,0x5c,0x74,0xe5,0x31, +0x34,0x42,0x38,0xfb,0x00,0x6d,0xf3,0x60,0x0a,0xcb,0x86,0x88,0x56,0xe2,0xf1,0x20, +0xa2,0x43,0x48,0x96,0x9c,0xd7,0xbe,0xb4,0x47,0x47,0x3b,0x80,0x8d,0x82,0xc1,0x79, +0x86,0xa0,0x16,0x42,0x9e,0x60,0xd4,0x1c,0xc6,0x00,0x7e,0xa1,0xa6,0xb6,0xcd,0x79, +0x7c,0x0c,0xc1,0x10,0xee,0x03,0x66,0xb5,0xba,0x2a,0xc3,0xba,0xb9,0x30,0xe3,0xf4, +0xde,0xe7,0x00,0xc0,0x97,0x66,0x10,0x3b,0x44,0x86,0x41,0x23,0x5c,0xcb,0x88,0xd4, +0x72,0xfa,0x0f,0x96,0xb2,0xda,0x60,0x8e,0xef,0x48,0xa6,0x59,0xd1,0xa2,0x1b,0xce, +0xea,0x85,0x16,0x7b,0x94,0xa4,0x90,0xe3,0x2c,0xc0,0x40,0x16,0xee,0x04,0x92,0x51, +0xe0,0x71,0xa1,0x37,0x64,0x65,0xa6,0x55,0x38,0xdc,0x1c,0x17,0x2c,0xbc,0x04,0x24, +0x88,0x66,0x12,0xe4,0x7c,0x65,0xd2,0xad,0xe1,0x40,0x52,0xa8,0x29,0x97,0xf5,0xf0, +0x6d,0x44,0xd3,0xb1,0x1f,0x6b,0x43,0x85,0xec,0xc0,0x8c,0x90,0xb2,0x2d,0x93,0xe1, +0xf0,0x47,0x78,0x89,0x9e,0x8e,0x97,0xd4,0xc0,0x0b,0x48,0x2d,0xbb,0xfc,0x94,0xf9, +0xd1,0x10,0x2f,0xda,0x47,0x21,0x9b,0x59,0xc5,0xb0,0xa1,0x8d,0x3f,0xc4,0x54,0xf9, +0x0c,0x4e,0xd9,0x00,0x99,0x21,0x52,0xec,0x75,0xd0,0xd2,0xe8,0x5c,0x4a,0x8a,0xb5, +0xda,0xd9,0x66,0x23,0xc1,0xf0,0xa2,0x90,0x29,0x00,0x9a,0xfe,0xbd,0x1b,0x58,0xb2, +0xf9,0x0e,0xbc,0x8f,0x3b,0xb1,0xc3,0x1b,0xf9,0x46,0x13,0xd0,0x3c,0x64,0x1a,0x46, +0xb1,0x4d,0xa8,0x1d,0xdf,0x34,0x41,0x78,0xea,0x0f,0xe3,0x82,0xac,0x6f,0x4c,0x05, +0x13,0x51,0xcc,0x81,0x4f,0x10,0x95,0x48,0x5e,0x1d,0xd5,0x20,0x36,0x12,0xcc,0x4c, +0xda,0x53,0xf3,0xab,0x29,0x73,0xeb,0xb1,0x6d,0xaa,0xe7,0x4f,0xf2,0x7c,0xbd,0xb1, +0x3e,0x50,0x15,0x78,0xb0,0x73,0xea,0x25,0x8b,0x2d,0x55,0xdd,0xe5,0xff,0x52,0xf4, +0xa7,0x71,0xd2,0xf0,0x58,0xe3,0x19,0x95,0x08,0x23,0x60,0x77,0x50,0x2c,0x0c,0xdc, +0xa0,0xf3,0x7c,0x2b,0xd3,0x6b,0x8f,0xe0,0x51,0xf7,0x6f,0x77,0x46,0x35,0x74,0x2f, +0xc2,0x8a,0x33,0x13,0x35,0x17,0x9c,0xb6,0x65,0xa6,0x4d,0x51,0x9a,0xbf,0xa7,0xa3, +0x55,0x73,0xb8,0x2f,0x31,0x3b,0xed,0xd1,0x74,0x14,0x85,0xc8,0x94,0x77,0x32,0x55, +0xe5,0x45,0x02,0x15,0xe5,0x2c,0xee,0x75,0xa1,0xa5,0xcb,0x97,0x08,0xda,0x78,0xcf, +0xfe,0x12,0x2a,0x09,0xcf,0xc5,0xfa,0x3a,0x2c,0x52,0xfe,0xce,0xc3,0x76,0x57,0xb1, +0x8c,0xe6,0xd8,0x1e,0xd7,0x7f,0x18,0x78,0x25,0xf4,0x61,0xd2,0x0f,0xa6,0x83,0x74, +0xa0,0x5b,0x17,0x92,0xda,0x8e,0x10,0xda,0xb8,0xdc,0xaf,0x47,0x45,0x8b,0x75,0xf9, +0xaf,0x00,0x4f,0x1c,0x1c,0x3b,0x1c,0xfe,0x2b,0x3b,0xa0,0x14,0x02,0xe6,0x26,0x7f, +0xec,0x11,0x15,0xaa,0x09,0xdd,0x3e,0x8a,0x95,0x52,0x98,0x49,0x89,0xf7,0xe7,0xa6, +0xbe,0x1b,0xc8,0x36,0x3d,0x3f,0xd7,0x86,0xea,0x50,0x84,0x6f,0x09,0x88,0xbc,0xee, +0x0b,0x61,0x07,0x5d,0x06,0x45,0x6f,0x17,0xec,0xc7,0xcf,0xd4,0x11,0x3a,0xb9,0x5f, +0x0a,0x80,0x47,0xaf,0x84,0xbf,0xe0,0xbb,0x4a,0xaa,0x7f,0x03,0x02,0xfe,0x75,0x64, +0x02,0x33,0x24,0xfb,0x1c,0xe1,0x34,0x06,0xa5,0x3f,0x14,0x44,0x52,0x33,0xac,0xef, +0x0d,0xc0,0xf0,0x13,0x05,0xa5,0x3c,0x37,0x3a,0xe1,0xed,0xb2,0x5b,0xaf,0x28,0x44, +0x52,0x88,0xf8,0x3e,0x31,0x7b,0xf1,0x4e,0x60,0x35,0x12,0x39,0xe6,0x16,0x70,0x2a, +0x20,0x7c,0x29,0xff,0xe9,0xee,0xa9,0xb7,0xcb,0x97,0x80,0x75,0x74,0xde,0x26,0x01, +0x00,0xc6,0xe8,0xb6,0x1e,0xeb,0x4c,0x59,0x40,0x86,0x30,0xe2,0xa0,0xe9,0xa8,0xc6, +0x09,0xc7,0xb1,0xf3,0x11,0x27,0x79,0x14,0x27,0x97,0xfa,0x04,0x64,0xed,0x5e,0xc7, +0xc4,0x94,0x71,0xaf,0xf0,0xeb,0x15,0x9c,0xb1,0xc6,0x31,0xda,0x30,0xee,0x72,0x1f, +0x05,0x60,0x5c,0xba,0xdf,0xe5,0xb9,0xf7,0x0d,0x78,0x01,0x53,0x76,0x58,0x7b,0x2e, +0xa9,0x71,0xdc,0xbe,0x7f,0xde,0x3a,0x2f,0x33,0xe8,0x9a,0x4c,0xe9,0xe4,0xea,0x9e, +0x34,0xcb,0x61,0xe5,0x1b,0x12,0xc5,0xbe,0x26,0xb6,0x7a,0xaf,0xd4,0xab,0x7b,0x2f, +0xbf,0x4b,0xb5,0xbf,0x9a,0xe8,0xa3,0xc3,0xa8,0x87,0x8b,0x40,0x5d,0xe7,0x7c,0x53, +0x02,0x5d,0x37,0x9b,0xd7,0x56,0x84,0x4b,0xc5,0xc2,0x7b,0x44,0xdb,0x69,0x80,0x34, +0xad,0xe9,0x26,0x14,0xff,0xd7,0x29,0x6a,0x48,0xb7,0xa9,0x6e,0x58,0x97,0x15,0xde, +0x01,0xc3,0x2a,0xde,0xc6,0x50,0xc5,0x38,0xee,0x8f,0xfa,0xfa,0x60,0x71,0xdc,0xa9, +0x6f,0x11,0xe1,0xa1,0x25,0xb1,0x58,0x15,0x4f,0xc3,0xd8,0x4b,0x25,0x75,0xc7,0xdf, +0x85,0x75,0xc3,0x3d,0xac,0xec,0xbb,0xc5,0x6e,0x30,0x17,0x00,0x15,0x9e,0xb4,0xe4, +0xd3,0x6d,0xa4,0x86,0x34,0x3d,0x7c,0xa7,0x1b,0xf0,0xe5,0x5c,0x72,0x32,0x75,0xa6, +0x80,0x47,0x18,0x74,0xfd,0x32,0x74,0x33,0x8c,0x41,0xa3,0x46,0x6b,0x50,0x89,0x1d, +0xa7,0xa2,0xc5,0x30,0x72,0xbd,0xa5,0x27,0xa2,0xe2,0x74,0xb6,0xc2,0xd7,0x25,0x96, +0xda,0xb3,0x7c,0xe4,0x83,0xdf,0x4f,0xb6,0xb9,0xc8,0xef,0x33,0xf3,0x17,0xd0,0xa0, +0xdd,0xf1,0x24,0x42,0x9f,0xf6,0x75,0x1e,0x66,0xcf,0xec,0x1d,0x87,0x77,0xc0,0x5d, +0xd8,0x48,0xb5,0x96,0x54,0x95,0xbc,0x76,0xad,0x6a,0x46,0xc7,0xd6,0x8a,0x5d,0x3d, +0x0a,0x9b,0xa3,0xce,0xb7,0x16,0x23,0x85,0x86,0x84,0x10,0x1d,0xc5,0x60,0x8c,0x2d, +0x5e,0x11,0x15,0x3f,0x91,0xfa,0x26,0xf3,0xe1,0xac,0x3d,0x1e,0xdb,0xec,0xb6,0xf9, +0x30,0x91,0xc0,0x3f,0x3f,0x13,0xa5,0x2e,0x6a,0x5c,0x49,0x52,0x7c,0x73,0x96,0x65, +0x1e,0xea,0x6e,0x1a,0xf1,0x46,0xd9,0xfa,0x61,0x22,0x7e,0xa9,0x86,0x62,0xb3,0xbb, +0xc0,0x85,0xfd,0x02,0xd4,0xe9,0xc8,0xd8,0xfc,0xb4,0x72,0x9e,0x96,0xb8,0x97,0x65, +0x50,0xf5,0x74,0x9f,0xde,0x29,0x3b,0x9f,0xde,0xba,0xbf,0x3b,0xc2,0x67,0x66,0x31, +0xdf,0x1a,0x19,0x09,0xf4,0x6c,0x5d,0x94,0xef,0xd1,0xfb,0x88,0x9c,0xbc,0x74,0x5e, +0x21,0x01,0x59,0xc2,0x54,0xec,0x7b,0x06,0x6f,0xc6,0xa7,0xb7,0xda,0x7d,0x67,0x31, +0x4f,0xe5,0xef,0xcb,0x3e,0xfe,0xc8,0xa9,0x4f,0x2b,0x73,0x29,0xca,0xbf,0xaf,0x5e, +0x28,0xdd,0xef,0xc0,0x83,0x12,0x29,0x9d,0x8f,0x89,0x07,0xdb,0xff,0xff,0xa8,0x31, +0x33,0xc5,0xfe,0x29,0x9f,0x8d,0x2d,0xa4,0x46,0xd1,0xda,0xcb,0xf3,0x6d,0xf7,0xf6, +0xe8,0x10,0xa8,0xfe,0x78,0x50,0xe7,0xc1,0xe2,0x01,0x10,0x04,0xb0,0x6e,0xb9,0xf2, +0xb0,0x89,0x92,0x96,0x87,0xa9,0x29,0xdf,0x6c,0x4f,0xdb,0xde,0x73,0x64,0xa5,0x82, +0x8e,0x0b,0xe8,0x55,0x95,0x6d,0x24,0x03,0xa1,0x4a,0x2d,0xd7,0x53,0x6b,0x80,0xa8, +0x7a,0x02,0xe8,0x26,0xab,0x28,0x82,0x91,0x7e,0xa1,0xea,0xd4,0xda,0xcb,0x5f,0xd2, +0x06,0xb5,0x75,0x16,0xb2,0x88,0x4f,0x47,0x28,0x94,0xe0,0x9f,0x33,0x45,0xc9,0x48, +0x84,0x1d,0xf9,0x2b,0x13,0x2b,0x0f,0x59,0xe3,0xed,0x75,0x41,0x39,0x02,0x89,0xb9, +0xfb,0xfc,0x9d,0x12,0x9d,0xb8,0x41,0x62,0xf7,0x56,0xa6,0x07,0xfd,0xf8,0x06,0x2c, +0x8a,0xef,0x94,0xac,0x70,0x8a,0x6c,0x2e,0xa1,0x47,0x26,0x3c,0xfb,0x6e,0x9e,0x3f, +0xa8,0x8e,0xbd,0x98,0x7f,0xe6,0x22,0xc2,0xe5,0x44,0xfa,0x7d,0xdd,0x64,0xd9,0x6b, +0x6a,0x5f,0x93,0x81,0x9a,0x31,0x41,0x1e,0x23,0x2e,0x1b,0x41,0x39,0x65,0x45,0x85, +0x25,0x06,0x8a,0x99,0xf7,0xca,0x64,0xc8,0x6a,0x0b,0x91,0x39,0x7a,0xe0,0x58,0xcc, +0x54,0x51,0xfc,0xe8,0x14,0x93,0x6c,0x40,0x6b,0x5f,0x42,0x2b,0x80,0xf1,0xb5,0x0a, +0x05,0x6f,0x0a,0xe9,0x9c,0x41,0x25,0x0a,0x21,0xfc,0xfa,0xf6,0x7f,0xe6,0x23,0x0d, +0xc4,0x03,0xd5,0x2f,0x65,0xb3,0x6d,0x55,0xaa,0xce,0xc9,0x6f,0x69,0xe5,0x01,0x5c, +0xa9,0x02,0xf5,0xf9,0x41,0x50,0x20,0x88,0xca,0x4f,0x33,0x41,0x30,0x2b,0xa8,0xa4, +0xc1,0xbf,0xbc,0x54,0xce,0x3f,0x91,0xe7,0x81,0xf6,0xc1,0x46,0xf2,0x73,0x46,0xa0, +0xd6,0x2e,0x84,0x76,0x9d,0xba,0x7a,0x9d,0x8a,0x20,0x19,0x56,0xf3,0x72,0x10,0x72, +0x94,0xbf,0xe5,0xc1,0x91,0xb9,0x06,0x52,0x90,0xdf,0xd2,0x47,0x72,0x71,0x2b,0xb9, +0x02,0x96,0x09,0x77,0x33,0x7b,0x23,0x89,0x89,0x02,0x0b,0x57,0x73,0x5b,0xcc,0xc9, +0x24,0x0f,0xfd,0x7c,0xc1,0x2f,0xc7,0x13,0x16,0x89,0xec,0x0f,0xcd,0xc9,0x1c,0xb2, +0x67,0x13,0x7f,0xe9,0xcf,0x36,0x1a,0xd8,0xe3,0xd9,0xc7,0x7e,0x57,0x7a,0x97,0xbe, +0x2f,0x74,0xb1,0x41,0xb8,0xf8,0x03,0xd8,0x09,0xe7,0x30,0x15,0x72,0x69,0xc5,0xc8, +0xa5,0x0c,0xf7,0x2f,0x48,0x2c,0x63,0xd8,0x2b,0x06,0x84,0xed,0x56,0xa8,0x58,0x6a, +0x2c,0x9d,0x4f,0xfe,0x9b,0x3e,0x68,0x84,0x81,0x29,0x2f,0xce,0x3b,0xc7,0x30,0x7a, +0x4b,0xed,0x06,0x9e,0x98,0xb3,0x1b,0xba,0xef,0xf4,0x5e,0x54,0x74,0x7f,0x15,0x51, +0x43,0x5e,0x0f,0x59,0x1b,0x3c,0x41,0x80,0x03,0x6b,0xef,0x2f,0xf1,0x47,0xb8,0x9f, +0x42,0xaa,0x50,0x7f,0x15,0x36,0x0e,0x3d,0x87,0x2c,0x17,0xb9,0x58,0xf1,0x94,0xec, +0x2c,0xff,0xb2,0x48,0x54,0xdd,0x2e,0xda,0xa2,0x53,0xd7,0x8a,0x5e,0xdd,0xb5,0x2b, +0x13,0xb0,0x86,0xd5,0x08,0x1a,0x0a,0xbf,0x65,0x02,0x7e,0x8e,0x19,0xda,0x23,0xba, +0xe9,0x9f,0x6b,0x49,0xb0,0xc4,0x03,0x1a,0xcc,0xf3,0xef,0xdd,0x45,0xd1,0x83,0x49, +0x40,0x4e,0x0f,0x59,0xb5,0x3f,0x61,0x5d,0xe5,0x20,0xa1,0xfa,0x5a,0xa0,0x52,0xd3, +0x1e,0xe5,0x4c,0x82,0x1e,0x5a,0x0d,0x10,0x24,0x49,0xb4,0xa2,0x67,0x78,0x48,0xa5, +0x76,0x8c,0x38,0x51,0x31,0xa7,0x6a,0x05,0xae,0xa5,0xb2,0x26,0xf6,0xec,0x19,0xb1, +0x30,0x00,0xa9,0x06,0xb0,0xcc,0x4f,0x25,0x2d,0xcd,0xd1,0x87,0x68,0xef,0xd2,0x34, +0x24,0x7c,0x21,0x6f,0x74,0xac,0x01,0xdd,0x69,0xce,0xb3,0x77,0x76,0xee,0xe2,0xc0, +0x03,0xa4,0xde,0xe7,0xc4,0xfb,0x56,0x4b,0x4f,0xb1,0xca,0xd6,0x82,0x4b,0x42,0xd7, +0x09,0xe7,0x28,0x02,0x2e,0xab,0xeb,0x4c,0x3f,0x87,0x87,0x04,0x35,0xa6,0xa1,0xab, +0xe0,0x7b,0xbe,0x27,0xe5,0x13,0x62,0x4d,0xfa,0x33,0x55,0x05,0xb6,0xe6,0x23,0x52, +0xa5,0x8a,0xd1,0xb8,0x14,0xaa,0xe6,0xc7,0x2e,0xf6,0x82,0x0c,0xb6,0x87,0x42,0xbd, +0x3b,0x85,0xc2,0x4a,0x25,0xea,0x9e,0xb1,0xb7,0x95,0xf8,0xc1,0xff,0xee,0x12,0x67, +0x2c,0x49,0x8e,0x7c,0x5e,0x16,0x44,0x02,0xb4,0x1f,0xc2,0xbc,0x7f,0x49,0xb8,0xeb, +0x80,0xef,0xfa,0xb2,0x1e,0xe2,0x50,0x70,0x41,0x3c,0x3b,0x38,0xbf,0xca,0x83,0x8b, +0x08,0x19,0xd3,0x9d,0xbf,0xde,0x45,0x16,0xef,0x26,0x81,0xdd,0x5f,0xe8,0xe0,0xc8, +0x0b,0x2c,0x1b,0x8c,0xbf,0x93,0xb2,0xdf,0xd8,0x6d,0x8c,0x68,0x8e,0x88,0xe2,0xce, +0xae,0x72,0x7d,0xa1,0xaa,0x7e,0x2c,0x57,0xa4,0xbc,0xa4,0x9c,0x1f,0x40,0xa3,0xa3, +0xe8,0x88,0x8b,0x2d,0x2d,0xd3,0x60,0x98,0xbe,0x13,0x63,0xed,0x5f,0xb3,0x3b,0x39, +0xcb,0x89,0x10,0x34,0xe5,0x10,0xbb,0xce,0x5d,0x6e,0x69,0x7b,0xd9,0x7e,0x83,0xbe, +0x53,0x75,0xee,0x78,0x97,0xb6,0x0c,0x58,0xc8,0xdd,0xcb,0x44,0xf6,0xb8,0xec,0x63, +0x1d,0x1c,0x51,0x74,0x94,0x3b,0xc7,0xc9,0x6b,0x2e,0xc4,0x34,0x70,0xa1,0xfa,0xe3, +0x5c,0x83,0xad,0x03,0x15,0x38,0x4a,0xd9,0x69,0xb0,0x37,0xc5,0xb7,0x4d,0x50,0xe0, +0xe6,0x12,0xd2,0x75,0x19,0xbe,0x91,0xc0,0xd1,0x25,0x85,0x67,0x0e,0xfc,0x5a,0x12, +0x4d,0x9b,0xe4,0x39,0xc9,0xf5,0x2b,0x82,0x15,0x61,0x40,0x84,0x89,0xb5,0x52,0x30, +0x11,0x0a,0xff,0xe9,0x4f,0xc9,0xbc,0xa6,0x5e,0xce,0xd6,0x1c,0x34,0xfa,0xe5,0xf1, +0x9a,0x29,0xdd,0x34,0x94,0x63,0xaa,0x83,0x91,0x33,0x35,0xfa,0xc2,0x2b,0x53,0xff, +0x6f,0x1d,0x52,0x98,0x22,0x6a,0x09,0x77,0xed,0x19,0xd4,0x88,0x36,0x7d,0xdd,0x75, +0x95,0xf4,0xec,0x31,0x9f,0xb5,0x08,0x83,0xba,0xd2,0xd6,0xea,0x28,0xf5,0xbd,0x9c, +0xe5,0x28,0xa6,0x1a,0x9c,0x33,0x01,0x29,0x59,0x76,0x36,0xbf,0x7b,0xe2,0xc0,0x4b, +0xcd,0x3e,0xed,0x50,0x1f,0xbc,0xb7,0x6d,0x84,0xb6,0xfd,0x54,0x5f,0xfc,0x8b,0x6a, +0x0e,0xdb,0x54,0x7d,0x11,0xb6,0x2c,0xc1,0x27,0xea,0xa8,0x3d,0xf8,0x5b,0x1e,0xf8, +0xe6,0x93,0x4f,0xbc,0x85,0xa3,0x2f,0x4d,0xcb,0x03,0x71,0xa6,0x5a,0x77,0xb8,0x68, +0x10,0x94,0x78,0xcf,0x53,0x36,0x00,0x5a,0x5c,0xfa,0xc4,0x4e,0x95,0x52,0x6f,0x38, +0xa7,0xdc,0x77,0xad,0x41,0x6b,0x76,0x8d,0x3a,0x2f,0x80,0xd2,0x15,0xba,0xb6,0xec, +0xa9,0x66,0xe7,0xe3,0x54,0xfb,0xbf,0x4e,0x83,0xc2,0x5b,0xdb,0x9c,0x81,0x93,0xf3, +0x84,0x8d,0x67,0xc4,0x40,0x84,0xe8,0xc2,0xec,0x4f,0xc9,0x71,0xf5,0xe0,0x98,0xb5, +0x69,0x0c,0xb2,0xef,0x6e,0x01,0x86,0xf7,0x8b,0x0b,0x67,0x10,0x62,0x89,0x53,0xb2, +0x6b,0x66,0xc9,0x6d,0xaf,0x02,0x37,0xe0,0xad,0xef,0xcf,0xc7,0xc0,0xe7,0xf6,0x63, +0xaf,0xdc,0x49,0x7c,0xfb,0x83,0x11,0x35,0x69,0x21,0x21,0xca,0xee,0x9c,0x80,0x34, +0x80,0x59,0x65,0x41,0x95,0x32,0x2e,0xf2,0x96,0x92,0x14,0x6a,0x53,0x04,0x36,0x65, +0xaf,0x08,0x3f,0xe9,0xdb,0xf2,0x06,0xea,0x47,0xb0,0x18,0xca,0xf2,0x9a,0x81,0xc5, +0xf2,0x0b,0x91,0xdb,0x69,0x82,0xf6,0xfe,0x29,0xf0,0x8f,0xd5,0xda,0x24,0x37,0x79, +0xeb,0x56,0x1a,0x46,0x69,0x94,0xf9,0x4f,0x4f,0x93,0xee,0x7c,0xd5,0xdc,0xbd,0x38, +0x29,0xf7,0x1c,0x0f,0xd4,0x2e,0x34,0x75,0x79,0xe5,0xa8,0xd7,0x5e,0x72,0xbd,0xb8, +0xfa,0xb6,0x42,0xf4,0x1d,0x6b,0x52,0xf8,0xb5,0xa0,0x14,0x5a,0xa6,0x72,0xb8,0xb9, +0x16,0x4b,0x20,0xff,0x9e,0x90,0x0a,0xee,0x02,0x40,0xe1,0x32,0xbc,0x71,0xf0,0x9d, +0x8b,0x43,0xcf,0x1a,0x1b,0xff,0xc0,0x39,0x31,0xc1,0xf8,0x4b,0x9b,0xd4,0x3c,0x64, +0xe3,0xed,0xe4,0xf6,0x68,0x88,0xe0,0x77,0xa6,0xe7,0x4e,0x13,0xe5,0xc1,0xf3,0x48, +0xb0,0xf2,0x2c,0x2e,0xf0,0x8b,0xda,0x3e,0xd9,0x19,0x9c,0xca,0xd4,0x10,0x15,0x60, +0x61,0x3f,0x12,0xdb,0x52,0x5d,0x65,0x6d,0xa1,0xcb,0x50,0x94,0xd6,0x2c,0x90,0x59, +0x7b,0xee,0x95,0xcf,0x9f,0xda,0x78,0x76,0x13,0xe4,0x3c,0x0f,0x0d,0x67,0x05,0x66, +0x04,0x9b,0x0b,0x00,0x32,0x8c,0x8a,0xd3,0x23,0xdf,0x0e,0x2a,0xfd,0x8d,0x36,0x20, +0xcb,0xbe,0x11,0x16,0xb1,0x9a,0x43,0x4f,0x67,0x68,0x18,0x49,0x86,0x30,0x6a,0xbd, +0x4b,0x56,0x3a,0xb5,0xb4,0x9d,0x17,0x5e,0x01,0x2d,0xf2,0xdb,0x22,0x7a,0xa9,0xb5, +0x23,0x1b,0xb5,0x6a,0x93,0x3e,0x4b,0xc2,0xee,0xd1,0x1c,0xb7,0x1c,0x68,0xd7,0xfe, +0x5a,0xa1,0x2c,0x4e,0x10,0xe2,0xd4,0xfe,0x86,0xa0,0xea,0xfc,0x13,0x14,0xc8,0x54, +0x29,0x71,0x3b,0x27,0x4d,0x98,0x02,0xc2,0x67,0x19,0xd8,0x1c,0x41,0x37,0x56,0xfb, +0x9e,0x0d,0xba,0xb6,0xcc,0x97,0xe3,0x10,0x0a,0x16,0xcd,0xe0,0x99,0xf5,0xea,0xed, +0x77,0xa6,0x1e,0x64,0x45,0x98,0x3c,0xff,0x33,0x23,0x1d,0xe7,0x04,0xfc,0xf0,0x78, +0x20,0x17,0x87,0x64,0xea,0x75,0xe9,0xdb,0x6f,0x34,0xf5,0xda,0x3a,0x27,0x3f,0x38, +0x39,0x58,0x17,0xe3,0xb4,0x5b,0xd6,0xcd,0x88,0x26,0x5a,0x38,0x1c,0x7f,0x97,0xeb, +0xdf,0x1a,0x2b,0x1e,0x8d,0x95,0xf0,0x69,0xb8,0xfe,0x2e,0x6a,0x66,0x72,0x6f,0x2a, +0x12,0x90,0xdf,0xff,0xa9,0x20,0x40,0xb8,0x15,0xd1,0x5f,0xc9,0x6f,0x17,0x61,0xf0, +0xfa,0x6d,0x15,0xbf,0x40,0x9f,0x71,0x19,0xf6,0xbe,0x13,0xd1,0x7c,0x3e,0xe3,0xa7, +0xb6,0x41,0x9d,0x6d,0xc9,0x92,0x21,0x8a,0x80,0x9b,0x5a,0x0d,0x19,0x5d,0xf4,0xe0, +0x56,0x4f,0xb0,0x3e,0xc0,0x93,0xbf,0x63,0xc8,0x88,0x71,0xaa,0x2c,0x76,0xf4,0x97, +0x4a,0x20,0x9c,0xe2,0xc5,0xea,0x21,0x6e,0x80,0xf9,0x00,0xfc,0xfd,0x06,0x9b,0x26, +0xa7,0xe5,0xda,0x82,0x4f,0x7a,0x6b,0x22,0x42,0x30,0x6d,0x27,0x52,0xfa,0x24,0x6c, +0xa4,0x09,0x68,0x96,0xcc,0x5c,0xc7,0x48,0x33,0x83,0x14,0x59,0x9f,0x20,0x7b,0x1e, +0x27,0x84,0x15,0x83,0xcf,0xe8,0xa0,0x5c,0xac,0xdb,0xc3,0x68,0x29,0x9e,0xa9,0xf1, +0xa1,0x85,0xbb,0x13,0x7e,0xfa,0x76,0x0a,0x32,0xa6,0x55,0xa5,0xd9,0xeb,0x57,0x6a, +0x00,0x74,0x40,0x78,0x9a,0x70,0xd5,0xe3,0xc1,0xd2,0x74,0x97,0x34,0xc4,0x56,0x6e, +0x7b,0x2a,0x8f,0x52,0x7c,0x33,0xa9,0xe4,0x8f,0xb6,0x38,0xf2,0x62,0x3a,0xf0,0x31, +0x75,0x39,0x02,0x58,0x48,0x0d,0x21,0xfd,0x3d,0x62,0xa8,0x43,0x73,0x19,0xfa,0x20, +0xff,0x54,0x69,0x49,0x73,0x53,0x9f,0x01,0x2c,0x61,0x99,0xc0,0x89,0xea,0x50,0x12, +0xad,0x77,0x62,0xd7,0x41,0xb3,0x0a,0xd5,0x4a,0xc1,0x36,0xd3,0xab,0xa9,0xc6,0x85, +0x29,0x84,0xca,0x00,0xae,0xeb,0xf2,0xda,0x71,0x64,0xdc,0x0a,0x5e,0x8b,0x43,0xb8, +0x2f,0x87,0x23,0x8b,0x96,0xce,0x10,0x58,0xa1,0x63,0x89,0xc1,0x69,0x86,0x54,0x65, +0x2a,0x36,0xe4,0xc3,0x9b,0x11,0x77,0x5b,0x99,0x64,0x7b,0x4b,0x5f,0xa9,0x1c,0x73, +0xf7,0x2f,0x54,0xbf,0xf6,0xec,0x2c,0xf8,0x4a,0x39,0x8d,0x10,0xd3,0x5a,0x3c,0x77, +0xe4,0xfc,0x8b,0x50,0xcf,0xd9,0x99,0x65,0x91,0x66,0xfe,0x0d,0x43,0x83,0x70,0xb8, +0xfe,0x13,0xbd,0x7d,0x9a,0xe2,0xd3,0x55,0x42,0x1a,0xbb,0x6a,0xb5,0x6d,0xea,0x59, +0x7d,0x7a,0xcc,0xae,0x03,0x6d,0x1c,0x7f,0xa4,0x59,0x99,0x6f,0xdc,0x2f,0x0f,0x60, +0x88,0x1d,0x47,0xe0,0xb9,0x16,0xf4,0xcb,0x0e,0x74,0x0b,0x3d,0x81,0x66,0xca,0x10, +0xf1,0x1e,0x6c,0xe2,0x99,0xaa,0x1c,0x99,0x8c,0x29,0x2c,0x3a,0xf5,0xec,0x5d,0xa7, +0xa2,0x09,0x38,0x74,0x89,0xf3,0xfd,0xd6,0xac,0xcb,0xbd,0xa2,0x8b,0x2d,0xed,0x12, +0x00,0x93,0x19,0x13,0xd0,0xcd,0x25,0xbe,0x0e,0xca,0x87,0x44,0xcd,0x5c,0x1d,0xfd, +0x52,0x41,0x37,0xfd,0x4c,0x2b,0x75,0x11,0xa4,0x21,0x44,0x99,0x57,0x94,0xfc,0x15, +0x25,0x60,0x7c,0xa4,0xdc,0x36,0x9f,0xed,0xb9,0x7a,0x6e,0x72,0x71,0xcc,0x72,0x47, +0xa4,0x2a,0x8d,0x05,0x30,0x43,0xd5,0xdd,0x6a,0x02,0xab,0x57,0xfe,0xed,0x69,0x94, +0x26,0x99,0xb4,0x7b,0x12,0x30,0x1a,0x02,0x35,0x97,0x02,0x1f,0xfe,0xba,0x26,0x8a, +0x2c,0x9e,0xee,0x8b,0x43,0x47,0xeb,0x55,0x8d,0x67,0x27,0x5d,0x08,0x57,0x96,0x9a, +0x2d,0x99,0x6e,0xea,0xa6,0xb1,0x68,0xc9,0x2e,0x5b,0x2b,0x90,0x19,0xa4,0x84,0x61, +0xaa,0xb8,0x37,0xaf,0x84,0xf8,0xe8,0x54,0xea,0xe3,0xa0,0x5c,0x8c,0x55,0x2f,0xe9, +0x2f,0x4f,0x2b,0x62,0x4a,0xfa,0xc0,0xc8,0xee,0xb7,0x53,0x30,0xfe,0x08,0xc5,0x66, +0xf2,0xef,0x66,0xc2,0x38,0xfe,0xd5,0xdc,0xb2,0x39,0x89,0x6a,0x05,0x95,0x54,0x29, +0xe9,0x32,0x02,0x41,0x3e,0xdd,0xfe,0xbc,0xfd,0x89,0x7a,0x0f,0x1d,0xdd,0x40,0xcd, +0x7e,0xfa,0x83,0x30,0x57,0xae,0x09,0xd8,0x85,0x5b,0x37,0x7e,0x03,0xf4,0x89,0x2a, +0x65,0x8f,0xb1,0x6f,0xb7,0xfd,0x5c,0xf4,0x37,0x74,0x48,0x4f,0xdb,0xff,0x59,0x2d, +0x73,0x00,0x88,0x81,0xb1,0xaa,0x3b,0x53,0x74,0xc0,0xda,0xce,0xf3,0x66,0xd7,0x00, +0x07,0xc3,0x75,0xf6,0x93,0x22,0x38,0x93,0xa0,0xee,0x77,0xd6,0xd3,0x29,0xd8,0x3d, +0xbb,0xac,0xfe,0xe7,0x31,0xa8,0x6f,0x1d,0x88,0x13,0x47,0x80,0x71,0xe8,0x98,0x2e, +0x91,0xd6,0x3c,0x77,0xd0,0xa3,0x88,0x0e,0xf5,0xbe,0x81,0x47,0x72,0x06,0x0a,0xbb, +0x71,0x04,0xb8,0xc6,0x13,0xe6,0x99,0x9f,0xa3,0xc2,0x58,0x67,0xf3,0xec,0x59,0xa1, +0x71,0x45,0xba,0x2a,0xb0,0x40,0x4d,0xef,0xb6,0xcc,0xf8,0x16,0x12,0x61,0x9c,0x6d, +0xe9,0x75,0xfb,0xa7,0x10,0x2e,0x51,0x9f,0x4f,0xeb,0xd5,0x87,0x50,0x2e,0xfe,0x64, +0x77,0xc6,0x76,0xb7,0x11,0x0f,0x79,0x9b,0x2a,0x56,0xa1,0xf7,0xd6,0xad,0x03,0x33, +0x10,0x9d,0xfa,0x6e,0x5b,0x57,0xbe,0xba,0x08,0x42,0xea,0xae,0x5d,0xb2,0xf7,0x68, +0xbd,0x00,0xd0,0x01,0xba,0x2f,0x63,0x4e,0xbe,0xc2,0x90,0x38,0xfa,0x6f,0x06,0x8d, +0xc2,0x09,0xfb,0x8f,0xba,0x28,0x87,0xd9,0xf4,0xbb,0x91,0xcf,0x74,0x67,0x88,0x76, +0xe8,0x7c,0xdb,0x33,0x38,0xa1,0x8e,0x08,0xfd,0x54,0x13,0xd1,0xba,0x4b,0x82,0x20, +0x7b,0xa1,0x62,0x2e,0x5b,0x6c,0x48,0x6a,0xd8,0x46,0x88,0x69,0xf9,0x6a,0xe6,0x2a, +0xc1,0x3c,0xc1,0xde,0x1e,0x74,0x58,0x9e,0xc6,0x56,0x52,0x1c,0x38,0x96,0x52,0xe9, +0x67,0x4f,0xbb,0x3f,0x9c,0x35,0x55,0x81,0xb9,0x03,0x5b,0xa1,0x79,0x68,0x35,0x70, +0x6a,0xa9,0x91,0x5c,0x38,0x29,0x3f,0x1f,0x01,0x3e,0xa3,0x5a,0xb8,0x90,0x4c,0xc8, +0x43,0x62,0xbc,0xd4,0x31,0x3f,0x6a,0x8c,0x03,0x21,0xec,0xc6,0x31,0x30,0xaa,0x7f, +0xdc,0x7f,0x86,0x9c,0x92,0x54,0xe3,0x50,0x67,0xfc,0x5b,0xda,0xf3,0x92,0x13,0xad, +0xa6,0x50,0xe5,0x25,0xf8,0x3f,0x03,0x8d,0x53,0x9f,0xed,0x58,0x47,0x30,0xe8,0xd1, +0xb1,0xef,0xd7,0x88,0x12,0x35,0x1c,0x4a,0xe7,0xd1,0x8f,0xc7,0x52,0x16,0xd5,0x53, +0x33,0x1e,0xbc,0xa6,0x73,0xb4,0xc5,0x02,0xce,0xf9,0xd6,0x06,0xf0,0x3c,0x6a,0xe4, +0xaf,0xb8,0x96,0xd5,0x90,0x33,0x02,0x12,0x67,0xd0,0x07,0xaa,0x0c,0x9d,0x0b,0xd2, +0xce,0x52,0xbd,0x47,0xb7,0xb7,0xc0,0x03,0x0b,0xdc,0x40,0x75,0x51,0x37,0x07,0x41, +0xe0,0xc8,0xc5,0xb2,0x10,0x31,0xee,0x13,0x8b,0xb6,0x00,0xfd,0x12,0xc8,0xbb,0xd7, +0xc1,0x49,0xd6,0x81,0x99,0xb2,0x30,0xd3,0xcb,0xf5,0xcc,0x53,0xdb,0x1d,0xa2,0x17, +0x2a,0x09,0xca,0x6c,0x63,0x36,0x7f,0xc3,0xca,0x5d,0xc4,0x43,0xda,0x7f,0x05,0x7a, +0x94,0xc7,0xff,0x6f,0x3a,0x39,0x12,0x52,0xee,0xd8,0xcd,0xb8,0x5b,0x1f,0xa4,0xf6, +0x7c,0xb6,0xef,0xd9,0xb6,0x36,0x5a,0x49,0xff,0xaa,0xcf,0x99,0x18,0x74,0x18,0x2a, +0x2e,0x5e,0xce,0xeb,0x99,0x3a,0x28,0xdd,0x9f,0xff,0x16,0x15,0x51,0xf1,0xfa,0xba, +0xd4,0xb9,0xae,0x9c,0xd4,0x30,0x4d,0xd9,0x8c,0x1c,0x4f,0xba,0x43,0x7b,0x87,0xf1, +0x0b,0xc1,0xcf,0x6a,0x5b,0x31,0xc5,0x1a,0x8e,0xfe,0x8e,0x77,0x1d,0x32,0xd9,0xdf, +0x63,0xde,0xc5,0xdc,0x18,0x39,0x3f,0xbd,0x27,0xd2,0xff,0xa1,0x5a,0x1d,0x38,0x0b, +0xb9,0x09,0xd8,0x56,0x58,0xaf,0x8a,0xd9,0xcb,0x16,0xc8,0xa4,0x51,0xdb,0x5a,0xbc, +0x5d,0x0c,0xac,0xf4,0x97,0xa2,0xaf,0xd8,0x80,0x7c,0x82,0xd4,0xd7,0xa9,0x94,0x63, +0xc4,0xff,0xc1,0xa7,0xde,0x29,0x39,0x3e,0xa7,0xb3,0xc9,0xa5,0xd1,0x19,0x57,0x3e, +0x6e,0x12,0x6d,0xe7,0xd9,0xac,0x93,0xc3,0xf9,0x62,0x62,0x27,0x76,0xe5,0x71,0xb1, +0x36,0xea,0xe8,0xc3,0xb7,0x2c,0x4e,0x4e,0x27,0xc0,0x88,0xe4,0x74,0x91,0x56,0x7e, +0x66,0x81,0xea,0xb4,0x95,0xad,0x62,0x70,0x8d,0xca,0x98,0x32,0x58,0xe8,0x5f,0x6a, +0x4c,0xf7,0x61,0xa5,0x37,0x2e,0x0f,0x81,0xd4,0x8b,0xc9,0xb7,0x28,0xe9,0x10,0x20, +0xb7,0x0e,0x29,0x35,0xd6,0x87,0x31,0x6b,0x2e,0x96,0xf3,0x73,0x74,0xea,0x04,0x06, +0x74,0x2c,0xc2,0xae,0x4c,0x23,0xa3,0xc0,0x89,0x15,0x3a,0x2c,0xfd,0x62,0x10,0xe9, +0x39,0x24,0x65,0x7c,0x5c,0x89,0x3c,0x16,0xa4,0x98,0x6e,0x5c,0x1e,0x96,0xa2,0x37, +0x84,0x7d,0x27,0xed,0x1e,0xe2,0x99,0x36,0x4c,0x24,0x5c,0xcd,0x5e,0x09,0xba,0x5c, +0x47,0xdb,0xd3,0x9d,0xbf,0xde,0x49,0x2b,0x18,0x46,0xc3,0x5d,0x9c,0xcb,0x42,0xc0, +0x0f,0x4c,0x9a,0x69,0xbf,0x24,0x8a,0x62,0xa7,0xbd,0xf8,0x6f,0xfd,0xea,0x7f,0x77, +0x82,0x20,0xe2,0xbc,0x9d,0xa5,0x69,0x9c,0xa6,0x5c,0x82,0xfc,0x5a,0x74,0x45,0x63, +0xba,0x2a,0xf3,0xad,0x3f,0x26,0x8b,0x83,0x2a,0x63,0x7b,0x06,0xbd,0xce,0xfe,0xc8, +0x96,0x22,0x2b,0x3d,0xdc,0x10,0xbb,0x97,0x4b,0x62,0x83,0xfd,0xd6,0x09,0xb5,0x92, +0xcf,0x01,0xee,0x78,0x97,0xbd,0xf4,0x26,0xae,0x2f,0xd4,0xe6,0x65,0x70,0xec,0x16, +0x54,0xee,0x24,0x42,0xd4,0xbe,0x44,0xc4,0x05,0x87,0xe3,0x85,0x94,0x0e,0x7f,0x0c, +0xcc,0xc3,0xef,0x7c,0x17,0xb4,0xf5,0x33,0x2c,0x2f,0xcd,0xd5,0x0b,0xb0,0x12,0x54, +0x3b,0x9b,0xcd,0xd3,0xa2,0xbc,0xfd,0x37,0x60,0xde,0x3d,0x4e,0x5f,0x27,0xc0,0xa0, +0xd5,0xf1,0xec,0x70,0x97,0x3e,0x0c,0x60,0x63,0xa7,0x14,0xcb,0x56,0x85,0x57,0x6e, +0xcc,0x84,0x8c,0x96,0x91,0xb8,0x26,0xf6,0xc4,0xd3,0xdc,0x61,0xd6,0x79,0x5d,0xfe, +0x4d,0xa7,0x62,0x97,0x97,0xb9,0x0d,0x61,0xef,0x16,0x75,0xe4,0x46,0xf0,0x81,0xa0, +0x9f,0x31,0xa7,0xca,0xf6,0xb5,0x71,0xe3,0xa7,0xd8,0xb7,0xea,0x9c,0xf8,0x27,0xd1, +0x91,0x24,0xc6,0xca,0x53,0x33,0xc9,0x2e,0x2e,0xce,0x24,0xb1,0x10,0x75,0x39,0xe0, +0xa0,0xef,0x39,0xfc,0x7e,0x55,0x00,0x96,0x0c,0x59,0x12,0x2d,0x72,0xf1,0x19,0xa7, +0xec,0x35,0x32,0x6d,0x3e,0xb3,0x88,0x49,0xa4,0x8b,0xc9,0x97,0x15,0x6b,0x67,0x93, +0x7c,0xe6,0xa5,0x97,0x1e,0xb6,0x67,0xe9,0xc9,0xdd,0x3f,0xfe,0x62,0x56,0xaf,0x3a, +0xae,0x83,0x9e,0x4c,0x3f,0xbb,0x16,0xab,0x93,0x57,0x77,0xdc,0x1e,0xac,0x6c,0x32, +0xaf,0x99,0xd4,0x3c,0xbd,0xb5,0xc5,0x98,0x2e,0x9d,0xb4,0xe3,0x6d,0xb2,0x79,0xe3, +0x3c,0x96,0xbd,0xd2,0x1d,0xdb,0x71,0x09,0x6c,0xf6,0xae,0xbe,0x59,0xf3,0xae,0x9c, +0x4e,0x39,0x29,0xcf,0x1c,0xb9,0x07,0x99,0xae,0xff,0x9f,0xfd,0x2d,0xf2,0x59,0x54, +0xa7,0x4d,0x86,0x30,0xf9,0xe1,0x49,0xba,0xa4,0x2a,0x5c,0x11,0x84,0x71,0x0a,0x6f, +0x40,0x08,0x7f,0x66,0xfa,0xe0,0x41,0xaa,0xa5,0xcb,0x09,0x2f,0x6d,0x15,0xfe,0xd1, +0x23,0x09,0x2d,0x97,0x92,0x2a,0x31,0x35,0x8a,0x28,0x36,0x0c,0xf4,0x96,0xf1,0x93, +0x01,0x55,0xe9,0xa6,0xcb,0x2e,0xae,0xf4,0xb6,0x43,0x8a,0xc5,0xa9,0x92,0x70,0x2e, +0xa1,0x61,0xfd,0xd4,0xf9,0x0e,0x2e,0x67,0xe3,0x06,0x5d,0x79,0xd2,0x33,0xf3,0x30, +0x0f,0xae,0x68,0x26,0x71,0x82,0xd7,0xf4,0x4e,0x03,0x4f,0x9e,0xf6,0x6c,0xfc,0xa3, +0x69,0x25,0x9b,0x9b,0xe6,0x89,0xdd,0x6f,0x4d,0xeb,0xeb,0x9a,0xb1,0x42,0x1d,0xae, +0x85,0x2e,0x09,0x10,0x57,0x8a,0x51,0x75,0x6a,0x54,0xc0,0x85,0xd7,0x96,0x3a,0x5a, +0x4b,0xf8,0x7d,0x7f,0x7c,0x44,0x25,0xf8,0x3b,0x48,0x52,0x4d,0xb2,0x65,0x72,0x9a, +0x89,0x5f,0x06,0xaf,0xb8,0x86,0x0c,0x5a,0xb6,0x94,0x86,0xcf,0x2d,0xc2,0x01,0x8b, +0x66,0x1e,0x64,0xcd,0xc7,0x68,0xd3,0x34,0xfc,0xb7,0xed,0x89,0x55,0xcc,0x33,0xc9, +0xd5,0x8b,0x9a,0x3a,0x38,0x84,0xcf,0xc7,0x34,0xca,0x0c,0x20,0xea,0x4d,0x6f,0x2a, +0xf5,0xa1,0x0a,0xc8,0x17,0x0a,0x6c,0xa8,0x4c,0x24,0xac,0x6a,0xbb,0xef,0xc8,0xdc, +0x22,0x31,0xb4,0x98,0xf2,0xd5,0xf6,0xfc,0x46,0x41,0x21,0x8c,0x94,0x9c,0x17,0x8e, +0x54,0x06,0x8b,0x5d,0x23,0xae,0xf2,0xed,0xc7,0x91,0xa1,0x9e,0x56,0x63,0x75,0xf8, +0x28,0xa2,0x27,0xcf,0xcd,0x27,0x13,0x7d,0x62,0x5c,0xa5,0x7b,0x3a,0xec,0xd9,0x81, +0x40,0x76,0xe4,0xc6,0xc1,0x72,0x0c,0xa5,0x81,0xff,0x98,0x20,0x59,0x75,0xf5,0x14, +0x7d,0x33,0x38,0xf6,0xe0,0xec,0x22,0x84,0x41,0x5c,0x61,0xfa,0x84,0x2d,0x78,0xfb, +0xc2,0x16,0x09,0x2f,0x11,0xed,0x1e,0xd3,0x0b,0x93,0xad,0x5b,0x5c,0x7f,0x73,0x30, +0xe2,0xf3,0xa6,0x6a,0xca,0x13,0xd9,0x35,0xec,0x3d,0xc4,0x2d,0x54,0x8c,0x35,0x44, +0x0b,0xa3,0xa2,0x88,0x31,0x3c,0x6c,0x0f,0xef,0x16,0xb4,0x53,0x6c,0x79,0xa0,0x4f, +0x22,0xd5,0x37,0x26,0x12,0x96,0x62,0xad,0x65,0x3d,0xe4,0x0f,0xfc,0xa3,0x7d,0x3e, +0x4b,0x75,0x05,0xb0,0x9d,0x3b,0xd9,0xa6,0xe3,0x5d,0x2e,0x67,0x10,0x36,0x8d,0xb0, +0x59,0xba,0x97,0xd2,0xb5,0xde,0xfc,0x9a,0x5c,0x39,0xd5,0xd4,0x71,0x10,0x1e,0x9d, +0xc1,0x3b,0x46,0x49,0x54,0xa4,0x2c,0x53,0x6e,0xe0,0xa8,0x90,0xf5,0x8e,0x1b,0x68, +0xf9,0xe8,0xa1,0xe3,0x8e,0xa4,0xdf,0x49,0x59,0x59,0x9f,0x54,0x59,0x34,0x7d,0xe9, +0xac,0x54,0x3c,0xd7,0x61,0xc7,0xc8,0xda,0xb9,0x53,0x9f,0xa0,0xd8,0x38,0xcf,0xed, +0x22,0xb6,0x9d,0x9d,0x46,0xb6,0x61,0x90,0x69,0x39,0x0a,0x52,0x18,0x28,0x92,0x2a, +0x9a,0x8d,0x98,0xae,0xc1,0xb7,0x96,0xad,0xe7,0x54,0x2d,0x04,0xa8,0x3e,0x06,0xdd, +0x54,0xe2,0xf4,0x6c,0xd9,0x92,0x66,0x68,0x80,0xa5,0xbe,0x5b,0x88,0x70,0xfd,0x0e, +0x60,0x7d,0x47,0xf1,0x51,0x7a,0xd1,0x6d,0xe7,0x81,0x49,0xc6,0xf9,0x9c,0xdf,0xef, +0x85,0xea,0x6b,0xa6,0x18,0xb4,0x05,0x23,0x9f,0xf0,0x24,0x7f,0x19,0x9f,0x40,0xb5, +0x9c,0x8f,0xb5,0x74,0xef,0x55,0x28,0xd1,0x67,0x1d,0x0a,0xb6,0x3d,0xb1,0x02,0xc2, +0x59,0x01,0x64,0x23,0xc1,0xb0,0xa8,0xc3,0x29,0xb1,0x02,0xc5,0x29,0x8d,0x41,0x01, +0x1a,0x8f,0xb4,0x39,0xa4,0xe0,0x63,0x00,0x2f,0x3b,0xe9,0x36,0xe7,0x06,0x49,0xa4, +0x11,0x8c,0x0e,0x3e,0x68,0x3c,0x59,0x80,0x7e,0x81,0x79,0x56,0x7c,0x61,0xf3,0x22, +0x14,0xe8,0x64,0x34,0xfd,0x5c,0x2a,0xbc,0x32,0x6b,0x86,0x95,0xda,0x39,0xdf,0x6e, +0x01,0x4e,0x79,0x16,0x1b,0x28,0x06,0x75,0xe6,0x87,0x86,0x70,0xb6,0x66,0x07,0xf3, +0x85,0xe4,0xdf,0x86,0x19,0x20,0xd1,0x11,0xa4,0x61,0x89,0x97,0x9a,0x17,0x15,0x2d, +0x6c,0xa4,0x97,0x96,0x91,0xcf,0xf5,0x7d,0x48,0x6a,0x8b,0x84,0x5b,0xea,0x42,0x08, +0x92,0x85,0x9c,0x26,0x7c,0xa8,0xbe,0xdb,0xb1,0xc7,0xcc,0x9e,0x37,0x8b,0xdc,0x15, +0xae,0x04,0x6a,0x5b,0xf7,0x74,0xb6,0xcb,0xb0,0xc6,0x84,0x07,0xd0,0x4f,0x69,0x16, +0xcc,0x8c,0x5c,0x7d,0xee,0x75,0x53,0x98,0x7b,0x88,0x4c,0x5d,0x37,0x5b,0xd4,0x64, +0xfe,0x8b,0xd3,0x38,0x60,0xa4,0x05,0x26,0xac,0x57,0x2c,0x7f,0xd9,0xc7,0xce,0xd9, +0x20,0x86,0x1e,0x3c,0xbd,0x53,0x3e,0xee,0x43,0x8a,0x09,0x9e,0xc5,0x1d,0x4c,0x66, +0x2d,0x2d,0x6d,0x1d,0x3a,0xec,0x44,0xbe,0x49,0xa5,0x8c,0x8d,0xd3,0x30,0xe1,0x58, +0xa4,0xed,0xe5,0x03,0x17,0xe7,0x7b,0x6f,0x67,0xdd,0x8d,0x69,0x3f,0x6d,0x7c,0x4a, +0xfb,0xaa,0xd1,0xa0,0x62,0xc3,0xda,0xff,0x8e,0xa7,0x83,0x00,0xfc,0x4c,0x70,0x60, +0x78,0x67,0x75,0x78,0x5f,0xbf,0x0a,0x96,0x62,0xb8,0x4d,0x99,0x52,0x50,0x2e,0xe0, +0x16,0x19,0x84,0xec,0x33,0xf3,0x33,0x4f,0x8c,0x49,0x1b,0x17,0x94,0xce,0x27,0x54, +0x84,0xa3,0xa7,0xf4,0xd0,0xb4,0xd9,0x5a,0xec,0x90,0x65,0x23,0xc3,0x33,0xd5,0xd5, +0xe1,0x95,0xbe,0xe9,0x16,0xd6,0x25,0xa2,0x04,0x7c,0xc4,0x4d,0x0e,0x2c,0x34,0xe6, +0xdb,0xf8,0xc3,0x42,0x5b,0x1f,0xd4,0x90,0x04,0x73,0xcc,0x1d,0xa0,0xfc,0x50,0x7f, +0x21,0xfd,0x30,0xb4,0x57,0x55,0x34,0x76,0x6a,0xf3,0xa5,0x68,0x71,0x1c,0x03,0x9f, +0xa7,0xd6,0xdd,0x39,0xb0,0x5f,0xb5,0xa6,0x22,0x7b,0x74,0x65,0x58,0x09,0x91,0xb1, +0x84,0xf7,0x93,0xd1,0x56,0x34,0x35,0xe3,0x5e,0x57,0xc8,0xb7,0xb3,0xf1,0x06,0xd6, +0x8d,0x14,0x19,0x6c,0x74,0x79,0x27,0x59,0x54,0x9a,0x76,0x2e,0x79,0xe3,0xea,0x1c, +0x5d,0x9a,0x51,0xec,0xd6,0x21,0x46,0xc9,0x5d,0x9b,0x17,0xc0,0xe8,0x85,0xe3,0x0e, +0xef,0xfa,0x87,0x19,0xd7,0x4a,0xbb,0x5e,0x05,0xeb,0x31,0x2b,0xf6,0xf1,0x3c,0x93, +0xe7,0x11,0x2f,0x6b,0xc5,0xf9,0xb3,0x4f,0x10,0xd4,0x00,0xf0,0xfb,0xd2,0xe1,0xc8, +0xd3,0x61,0x94,0x3d,0xb2,0x61,0x08,0x2a,0x87,0xf6,0x80,0x0d,0x1d,0xdc,0x95,0xea, +0xfc,0x32,0xd6,0xee,0xb7,0xa2,0x74,0xbf,0xe0,0x9f,0x7e,0x1e,0xe3,0xbc,0x71,0xa9, +0xc6,0x93,0x9f,0x4b,0xd3,0xd5,0xb7,0xae,0x7a,0x9c,0x8f,0xf2,0x03,0x77,0xcf,0xa9, +0xcd,0x38,0xb5,0xdd,0x18,0x1f,0xf3,0xb9,0xee,0x5f,0xff,0xff,0xff,0xff,0xa3,0xa5, +0xdc,0x83,0x34,0x66,0xfb,0xc1,0xd0,0xa4,0xad,0x4e,0xae,0x11,0xf3,0x10,0xad,0xa5, +0xe0,0xae,0x19,0x64,0x91,0x3e,0xe3,0xf2,0xe0,0xfe,0xa6,0x1c,0xf6,0x71,0x22,0xb0, +0x58,0xc1,0x2d,0x96,0xac,0x8f,0x29,0xde,0x43,0x4f,0x95,0xef,0xe3,0x27,0x5c,0x62, +0xef,0x81,0xb7,0x21,0xf0,0x27,0x71,0x53,0x32,0x2d,0xa7,0x1c,0x76,0x78,0xed,0x32, +0xb9,0xfb,0x23,0x86,0x96,0x2a,0x6e,0x01,0xe1,0xef,0xee,0xc5,0x98,0x95,0x99,0xa0, +0xfc,0x0a,0x92,0x51,0x7b,0xe6,0xf4,0xe2,0x0f,0x4d,0xbe,0x48,0xb8,0x66,0x9c,0x79, +0x00,0xd2,0x65,0xa7,0xda,0x05,0x05,0x60,0x2b,0x65,0xaf,0xc4,0x3b,0x65,0xfd,0x9e, +0x70,0xdc,0xb7,0xe1,0x72,0x84,0xd9,0x10,0x89,0xe3,0x75,0x0a,0x19,0x44,0xfd,0x7b, +0x32,0x64,0xe3,0xcc,0x5c,0x8c,0xd2,0xa9,0x17,0x40,0x75,0x5f,0x6c,0x27,0xa7,0x6b, +0x6b,0xa8,0x1f,0x6f,0x7d,0x2a,0x9e,0xc5,0x41,0x08,0x0a,0x4e,0xb2,0x00,0xe4,0x49, +0x8c,0x2a,0x11,0x21,0x50,0xcb,0x95,0x5a,0xfa,0x41,0x92,0x5e,0xe4,0x25,0x5e,0xea, +0x0d,0x86,0x35,0x0c,0x78,0x84,0xdb,0xa8,0xc7,0xfe,0xcb,0x21,0x89,0x6d,0xd7,0xe8, +0x5e,0x4c,0x94,0xbf,0x70,0x04,0x80,0x6e,0x82,0xef,0x69,0xff,0x78,0x64,0x13,0xdd, +0xae,0xb2,0xaa,0x42,0x66,0x22,0x00,0x4f,0x23,0x6e,0x25,0x83,0xb2,0x6e,0x98,0xd8, +0x6b,0x71,0x61,0xa5,0x4e,0xe3,0xf7,0x4e,0x6b,0xb1,0x52,0x1e,0xf0,0xef,0xf6,0x1e, +0x51,0x05,0x7c,0x81,0x9d,0x74,0x25,0x7f,0x2a,0xcc,0x89,0x82,0x2c,0x03,0x46,0x25, +0xc9,0xd3,0x72,0x77,0xbc,0x3d,0x45,0x12,0x68,0x30,0xd0,0x9a,0xac,0xf3,0x5a,0x28, +0xca,0x75,0x1a,0x6c,0x31,0x73,0x49,0xb1,0x39,0xaa,0xbf,0x15,0x90,0x0e,0x12,0x72, +0x24,0xbf,0xfa,0xbb,0xd4,0xc7,0xca,0xa0,0xc4,0xf2,0x36,0x00,0x28,0x31,0x35,0x6a, +0xa7,0xa8,0x0a,0xb9,0x44,0xbf,0x1d,0x95,0x00,0xfc,0x20,0xf2,0x3b,0x7a,0xe7,0xc2, +0x64,0x49,0x14,0xcc,0x97,0x9b,0xd4,0x0e,0xd9,0x4b,0xaa,0x44,0x74,0x1c,0x0e,0xbe, +0x42,0x75,0xf4,0x2e,0xf2,0xbf,0x74,0x92,0x9e,0x59,0x08,0x0e,0x88,0x37,0xe9,0x53, +0x9e,0x1c,0x11,0x47,0x32,0xac,0x95,0x61,0xe7,0x8b,0x48,0xdb,0xd4,0x83,0x32,0x8b, +0x5e,0x8b,0x4a,0x24,0x10,0xb7,0x65,0x19,0xb3,0x1a,0x9d,0xb1,0x06,0x7b,0x9a,0x97, +0x16,0x1e,0xff,0x5c,0x9b,0x24,0x07,0x5b,0x50,0xf7,0xde,0x91,0x91,0xfb,0xa2,0x68, +0x75,0xef,0xa4,0x4c,0x65,0x21,0x47,0x22,0x8c,0xa6,0x9c,0x52,0x7f,0x52,0xf3,0x72, +0x09,0xe5,0x9e,0x7e,0xdc,0xc7,0x86,0x5a,0xd4,0x25,0xdd,0xac,0x07,0x87,0xf0,0xeb, +0x6b,0x1b,0xf1,0xa8,0x36,0x96,0xa2,0xfe,0x37,0x53,0xeb,0xd3,0x5a,0xd6,0xc1,0x38, +0x29,0x8d,0xf4,0xdf,0x99,0xad,0xad,0xe0,0xcf,0x23,0xee,0x93,0xfb,0x71,0xed,0x2b, +0xa7,0xa0,0x49,0x2d,0x98,0xbd,0x23,0x12,0xe8,0x50,0x1e,0xb9,0x46,0x73,0x39,0xcf, +0x4b,0x9d,0xb9,0xf4,0x4b,0xb4,0xfe,0x97,0x7f,0xd3,0x64,0x4d,0x06,0x5d,0x37,0xd4, +0x2b,0x08,0xfd,0xce,0x18,0xee,0xa0,0x3b,0x4a,0x80,0xe7,0x02,0x78,0x72,0x76,0xa7, +0x02,0x02,0x32,0xf5,0x78,0xce,0xe1,0xda,0x44,0x82,0x13,0xe0,0xf5,0x8c,0x56,0x14, +0xec,0xe2,0x96,0x22,0x74,0xa5,0x83,0x70,0xe4,0x3c,0xe6,0x53,0x5d,0xe2,0xf5,0x70, +0xe6,0x33,0x9f,0x32,0x56,0x5d,0xb6,0x0f,0x25,0x7d,0xd3,0xb6,0xd5,0x82,0x7a,0xe0, +0x09,0x8e,0xcb,0x08,0x94,0x63,0x11,0x51,0x2c,0xb0,0x7d,0xf2,0xd3,0x98,0xb7,0xb2, +0x81,0xf5,0x72,0xc4,0xc2,0x35,0xd3,0x91,0xca,0x39,0x4f,0xf5,0x2e,0x39,0xcb,0xa1, +0x8b,0x88,0x79,0x49,0x2b,0x18,0x5e,0xc3,0xcb,0xa0,0x4b,0x4e,0xab,0x54,0x1f,0x45, +0x67,0x05,0x5e,0xa5,0xb2,0x72,0x09,0x70,0xa0,0x82,0x97,0x5f,0xd5,0x66,0x90,0x14, +0x51,0x8d,0xf1,0x4b,0xa4,0x1c,0xcd,0x11,0x2c,0x84,0x55,0x08,0x1d,0x56,0x5d,0x8e, +0x77,0xe1,0xfc,0x3a,0x40,0x03,0xf2,0xbb,0x3a,0xc6,0x40,0x51,0x34,0xe5,0x3c,0xb3, +0xe6,0xcd,0xbc,0xee,0x8d,0x58,0xc1,0x7d,0x4b,0xeb,0xc4,0x38,0xbc,0x6a,0x84,0xa7, +0x65,0x49,0x35,0xf0,0xbc,0x9b,0x0b,0xd4,0x4f,0xc7,0xa5,0x4d,0xbc,0xf4,0x11,0xaa, +0xe7,0xc9,0xd5,0x19,0x7c,0x28,0xf4,0xfb,0xdd,0x66,0x20,0xcc,0x51,0xa9,0xa2,0x24, +0x6f,0xec,0x5a,0xbd,0x38,0xbc,0x8f,0x18,0xf9,0xf3,0x0d,0x10,0x94,0x7d,0x6f,0xaa, +0x39,0x1c,0xca,0x93,0x9f,0x3d,0x28,0x80,0xb4,0x8f,0x9c,0x47,0xb4,0xce,0x1c,0x11, +0x37,0x12,0x5b,0xbc,0xb0,0xa8,0x0a,0x55,0xe0,0x3b,0x08,0x28,0x37,0xcd,0x15,0x5d, +0x6e,0x0c,0xb2,0xb3,0x3a,0x00,0x3b,0x3f,0x2e,0xb4,0xc5,0xdf,0x15,0x7e,0x89,0xfd, +0xb9,0xcf,0x32,0x15,0x0c,0x1d,0xb4,0x83,0xa0,0x2c,0xac,0x8b,0x14,0x6b,0xfd,0x68, +0xde,0x4e,0x92,0xa2,0x54,0xb5,0xfb,0xcd,0xea,0x57,0xc4,0x89,0x17,0x24,0x1f,0x68, +0x17,0x67,0xb4,0xf7,0x34,0xad,0x88,0xfc,0xe2,0x99,0x75,0x46,0x16,0xaf,0xed,0x13, +0xa0,0x0e,0xcc,0xd7,0xf1,0x17,0xb9,0xf3,0xa9,0x5e,0x69,0x8c,0xd3,0x66,0xf4,0x40, +0xa6,0x8d,0x9a,0xfb,0xca,0xc5,0xb4,0x62,0xbf,0x96,0x0f,0x62,0x74,0x48,0xf2,0xb0, +0xdc,0x48,0xe3,0xb4,0x39,0xd7,0xbc,0x93,0xac,0xd9,0xd8,0xd0,0x57,0x64,0x5d,0x3d, +0x24,0x92,0x56,0xeb,0x34,0xb2,0x69,0x30,0x1b,0xd9,0x65,0xc7,0xca,0xb6,0x13,0x76, +0x5e,0x38,0x29,0x07,0xbf,0x0e,0xd9,0xb1,0x63,0xda,0x7d,0xf4,0x53,0x5c,0x0e,0xe8, +0xd5,0x94,0x34,0xa6,0xf4,0x59,0x48,0x9e,0x87,0x39,0xe2,0x46,0x74,0xba,0x91,0xd8, +0x8c,0x6c,0x13,0x1a,0x3b,0x28,0x5e,0xd5,0x6b,0x9b,0x1d,0x1b,0xa5,0xba,0x1f,0xf5, +0x2d,0x97,0xb2,0x0b,0xd9,0xbc,0x23,0x5a,0xea,0x13,0xf3,0x4f,0x20,0x79,0xfa,0x1f, +0xa3,0x57,0x91,0xab,0x1e,0xde,0x2c,0xd9,0x06,0x1a,0x9c,0x1e,0xe1,0xff,0x34,0x3b, +0x44,0x98,0xfe,0xde,0x0d,0x0a,0x89,0x1a,0x5f,0x7d,0x64,0xee,0xb6,0x76,0xcd,0xed, +0x4c,0x99,0x56,0x2d,0x1d,0xad,0x2c,0xe4,0x84,0xb9,0xc0,0xd2,0xf2,0x5b,0x39,0x7f, +0x2a,0x98,0xc7,0xcb,0x8d,0xc8,0x23,0x18,0x6a,0x53,0x61,0x9d,0x15,0xaf,0x17,0x59, +0x7b,0xa6,0x57,0x2c,0x95,0xd3,0x47,0x05,0x62,0x22,0x33,0x3f,0x85,0xbd,0x9a,0xea, +0x63,0x09,0xd9,0x3e,0x16,0xeb,0x2b,0x91,0x24,0xef,0x9c,0xc9,0x71,0x3b,0xed,0xac, +0xea,0x65,0x37,0xf6,0x72,0xe5,0x66,0x19,0xb4,0xe2,0x2e,0xb0,0x2c,0xa2,0x96,0xf2, +0x04,0x89,0x4a,0x81,0xfd,0xf9,0x83,0x5e,0xa8,0x73,0x27,0xd8,0xf1,0xb9,0x31,0xef, +0x2d,0x0e,0x18,0xff,0x60,0x6c,0x08,0xc2,0xf1,0xe3,0xa7,0xe5,0xb1,0xbc,0x16,0x5a, +0x60,0x46,0x77,0x6c,0x14,0x8d,0xde,0x99,0xef,0x06,0x4e,0x90,0x31,0x44,0x31,0x6f, +0x6d,0xd0,0xdf,0x2a,0xd9,0xb4,0xd8,0xb6,0x1f,0x46,0x58,0x85,0x6b,0x7f,0x97,0x5a, +0x63,0x39,0x50,0x02,0x6f,0x80,0x8c,0x07,0x3f,0x4f,0xa9,0x41,0xb9,0x77,0x9b,0xd5, +0x81,0xbb,0x81,0x41,0x47,0xb6,0xd8,0x74,0xe1,0x67,0x80,0x4e,0xd5,0xa4,0xfd,0xf9, +0xab,0x48,0xa2,0x45,0xa1,0xa7,0x83,0x2a,0xaa,0x0a,0xec,0x11,0xb9,0xc7,0x12,0xeb, +0x8d,0xa4,0xb2,0x2c,0x4f,0x86,0xe7,0xd4,0x49,0xb2,0xfc,0xf9,0x5a,0xe3,0x3d,0x25, +0x68,0x8b,0xdb,0x5c,0x25,0x8b,0x89,0x96,0x21,0x20,0x00,0x5e,0xac,0x06,0x73,0xa9, +0x65,0xa4,0x2b,0x6f,0xfb,0x8c,0x03,0xc5,0x25,0x09,0xa5,0x9c,0xb1,0x66,0x1b,0xf3, +0xff,0x43,0x65,0x75,0x82,0x7d,0x53,0x48,0x16,0xec,0x28,0xe8,0x34,0x49,0x95,0x58, +0x7c,0x8d,0xdf,0xd8,0x72,0x7c,0xd9,0xfc,0x60,0x8f,0x92,0x41,0xd9,0x8a,0x42,0x36, +0x2d,0x4f,0xec,0x26,0x43,0xdb,0x93,0x61,0xca,0x4a,0x7f,0xe9,0xd0,0x94,0x8b,0xb5, +0x31,0x09,0x67,0x22,0x51,0xde,0x7b,0x70,0xf8,0xbf,0x03,0x1f,0x68,0x0a,0x92,0x73, +0x10,0xbf,0x1a,0x78,0xcd,0x3f,0x25,0xc6,0xb1,0xc8,0x94,0x49,0x56,0xdb,0x9d,0xd7, +0xeb,0x7b,0x12,0x60,0x52,0x11,0x65,0xca,0xc6,0x21,0x47,0x8f,0x77,0x1a,0x10,0x72, +0x94,0xbf,0xdf,0xe9,0x84,0x70,0x3e,0x51,0x24,0x23,0x42,0x0d,0x8f,0x7b,0x45,0xc0, +0xa7,0xda,0xf5,0x65,0x8a,0x42,0xe8,0xa0,0x26,0xde,0xd6,0xf2,0xc2,0xff,0x1e,0x05, +0x81,0x71,0x70,0xa6,0xc5,0x51,0xfc,0xf4,0x40,0x54,0xab,0x23,0x74,0x56,0x4d,0x32, +0x8f,0x9e,0xf2,0xec,0x45,0xea,0x9c,0xf0,0x27,0x17,0x4c,0x70,0x1d,0x50,0x47,0x23, +0x0e,0x9d,0xfd,0xf4,0xca,0xc9,0xd1,0x65,0xae,0xb9,0x1a,0xa5,0xf6,0x18,0x5d,0x33, +0x21,0x5f,0x93,0x37,0xb7,0x9a,0x14,0xf1,0x63,0x09,0xe4,0xb7,0x52,0x6c,0x7f,0xf7, +0x48,0x11,0x46,0xf9,0x5f,0x65,0xeb,0xc7,0xe5,0xfe,0x2e,0x3f,0x56,0xd5,0xf5,0xe6, +0xa8,0x14,0x7f,0x8d,0xf2,0x49,0xd5,0x48,0x93,0x28,0xd6,0xa9,0x90,0x3a,0xf8,0xf7, +0xca,0x6c,0xff,0x8f,0xf8,0x6a,0x9e,0xe9,0xec,0x7f,0x47,0x29,0x96,0x58,0xb0,0xdb, +0x08,0x59,0xab,0x5e,0x9d,0xb6,0xdf,0xcc,0x7b,0x56,0x67,0xb5,0x10,0x18,0xca,0xaa, +0x69,0xc3,0xd7,0x48,0x57,0x59,0xf1,0xdd,0x6c,0x85,0x21,0x68,0x1c,0xb3,0x76,0x08, +0xd0,0x12,0xd8,0xe1,0xc0,0x90,0x66,0x0b,0x5b,0x38,0x61,0x78,0x15,0x97,0x3f,0x4b, +0xa3,0xa3,0xff,0x37,0x16,0x33,0xcb,0x6b,0x06,0x57,0xbf,0x8f,0x49,0x12,0x2f,0xdb, +0xd0,0x12,0x5c,0x65,0x48,0x51,0x67,0x0a,0xd3,0xd4,0x97,0xe1,0xc8,0x88,0x84,0x7c, +0xa7,0xe5,0xde,0x01,0xb5,0x7f,0xec,0xac,0x60,0x4d,0x4f,0x55,0x76,0xa2,0x3a,0x13, +0xfa,0x0c,0xa5,0x68,0xdf,0xb9,0xf8,0x47,0x9d,0xcc,0x45,0xda,0x55,0x5a,0x9e,0xe1, +0x6d,0x08,0x15,0x65,0x1b,0x04,0xcc,0xd3,0x27,0xb3,0x67,0xe1,0x3d,0x13,0xfd,0xed, +0x78,0x22,0xa1,0x2e,0x74,0xfc,0x21,0xaa,0xa6,0x9a,0xa1,0xcf,0x2d,0xa1,0x68,0xe5, +0x65,0xa4,0x5b,0xd5,0x62,0xae,0xc8,0xd0,0x42,0xa4,0x44,0x41,0xe7,0xe8,0xe8,0xba, +0x5b,0xc8,0x7f,0x5d,0x2b,0x95,0x22,0xe3,0x67,0x85,0x2a,0x80,0xd4,0xe8,0x19,0x05, +0xd6,0xca,0x63,0x59,0xe2,0x52,0xb1,0x06,0x64,0x84,0xc9,0x8f,0x2e,0xa4,0x31,0xb3, +0x05,0xaf,0x9c,0x46,0x65,0x0a,0xf8,0xf7,0xb4,0xf2,0x80,0x30,0x2a,0x91,0xb4,0xf9, +0x60,0x55,0x62,0x7b,0x88,0xa5,0xa7,0xae,0x21,0x03,0x38,0x47,0xb5,0x39,0x2c,0x36, +0x8d,0x1e,0x61,0x41,0xa8,0x55,0x98,0x17,0xfe,0x84,0xc2,0x19,0xa0,0xe6,0x75,0x3f, +0x67,0x4b,0xfb,0x2e,0x9a,0x61,0x0b,0xcb,0x8e,0x41,0x73,0x9a,0x62,0x37,0x11,0xe8, +0xe9,0x24,0x6b,0xf7,0x6d,0xe9,0x40,0xdb,0x89,0xd0,0x85,0x02,0x26,0x70,0x5d,0x28, +0x4d,0x33,0xf5,0xbc,0x3d,0xcc,0x4c,0x0e,0xc3,0x4a,0x0f,0x10,0xc8,0xb3,0x30,0x0f, +0xac,0xe8,0xe1,0xaf,0xbc,0xed,0x25,0x10,0x6f,0x0d,0x9b,0x94,0xab,0xfc,0x1b,0xc9, +0x06,0x86,0xdd,0x77,0x7d,0xa7,0xf2,0x2b,0x61,0x8c,0xcc,0xe4,0x65,0x73,0x31,0x0a, +0x2c,0xea,0xd5,0x76,0x99,0x46,0xff,0xff,0xc0,0x62,0x4c,0x56,0x3e,0x70,0xbe,0x3d, +0xcd,0x1a,0xda,0x26,0xdf,0x93,0x2c,0x4b,0x07,0xeb,0x4c,0xd5,0x08,0x51,0x14,0x6d, +0xa6,0x9c,0x54,0x6a,0xe9,0x4a,0x04,0x59,0xd2,0x5e,0xea,0x16,0x9e,0xf2,0xd8,0x6f, +0xa4,0x9c,0xfc,0xc0,0x13,0xa2,0xa0,0x27,0x89,0x19,0xe1,0x54,0xde,0x7f,0xd6,0x17, +0x8a,0xc5,0xee,0x7a,0xb4,0xec,0x25,0x83,0x86,0x17,0xbb,0x8b,0x75,0x56,0xb0,0x44, +0x32,0x97,0xdb,0x59,0xc7,0x62,0x8b,0x11,0x16,0x7b,0x34,0x53,0x1a,0xb6,0xaf,0x54, +0x2f,0x91,0xdb,0xef,0xc7,0x24,0xeb,0x80,0xdc,0x5e,0x2a,0x23,0x76,0xf7,0xe4,0xd6, +0xa0,0xfd,0xed,0xcb,0x0a,0xe7,0x62,0x10,0x92,0x79,0x23,0x9e,0x7b,0xb4,0xed,0x95, +0xaf,0xdb,0x5a,0xff,0x37,0xa7,0x07,0xda,0xe1,0x3e,0xc3,0xba,0x78,0x71,0x91,0x5a, +0x5b,0x98,0xd9,0x0a,0x5b,0x4c,0xa7,0x40,0xc9,0x47,0x6d,0xb1,0x03,0x6a,0x95,0x3f, +0xde,0x24,0xf7,0x14,0xd8,0x16,0x15,0x6a,0xce,0x45,0x7e,0x4f,0x22,0x0d,0x98,0xbb, +0xa4,0x25,0xfc,0x90,0xc7,0x20,0x7d,0xb6,0xcd,0x5a,0x80,0x6a,0x8f,0xfa,0x39,0xae, +0x46,0x7a,0xa7,0x97,0x58,0x14,0x90,0xd5,0x30,0x99,0x69,0xa1,0x9b,0x4f,0xe1,0x48, +0xae,0x37,0x53,0xe3,0xc6,0x4d,0x51,0x88,0x4f,0x3f,0xf2,0x2e,0x32,0xfa,0x24,0xcf, +0x0d,0x90,0x2e,0x33,0xe1,0x36,0xe0,0x0e,0xce,0xd6,0xfa,0xfa,0xf0,0xbc,0x5f,0x34, +0x6f,0xfc,0xd4,0xf3,0x42,0x8f,0x2d,0x87,0xd6,0x9c,0x5c,0x22,0x5f,0x79,0x2c,0x27, +0x2f,0x64,0x76,0xee,0xd3,0xfd,0xec,0xa0,0x56,0x63,0x53,0xdb,0xff,0xff,0xa8,0x31, +0xe9,0x49,0x1a,0x62,0x16,0xe9,0x49,0xa1,0xe5,0x4b,0xee,0x8c,0x33,0x36,0x3d,0x12, +0xee,0x1a,0xb0,0xe7,0x33,0x4d,0x20,0x00,0x49,0xbe,0xa0,0xcf,0x32,0x17,0x59,0x10, +0x86,0x99,0x34,0xf6,0xec,0x47,0x85,0xa3,0x22,0xd2,0x06,0xa1,0xd6,0x2e,0x48,0x77, +0x7e,0xae,0xef,0xb1,0x78,0xd2,0x23,0x94,0x36,0x58,0x0e,0xb1,0xd7,0xfa,0x80,0xd0, +0x4d,0x0c,0x3f,0xa6,0x90,0x6c,0x08,0x65,0x3d,0x64,0x88,0xf0,0x25,0xe3,0x97,0x50, +0x27,0xf8,0xb0,0xd6,0x1a,0x41,0x9c,0xf5,0x00,0xb6,0x87,0x8b,0x55,0xde,0xc5,0xbc, +0x8a,0x47,0x0d,0x27,0xd3,0x06,0xc1,0x89,0xe4,0x0b,0x0e,0xfc,0xed,0x62,0x53,0x50, +0xa0,0x6d,0xf1,0x05,0x91,0x28,0xa6,0x02,0x97,0x2b,0x85,0x89,0x31,0x9c,0x9a,0x17, +0xab,0x8d,0xe4,0xad,0x1b,0x10,0x12,0x4e,0xc7,0xbe,0x3e,0xb7,0xd8,0xe9,0x53,0x0c, +0xac,0xf8,0x26,0x8e,0x1d,0x23,0x40,0x3a,0xdb,0x41,0x5f,0x01,0x5f,0x2b,0xfc,0xe1, +0x84,0x45,0xd3,0x3c,0xdc,0x97,0xa8,0x59,0x48,0x55,0x2c,0xcd,0xe8,0xe1,0xf3,0x6b, +0x62,0x42,0x08,0x3d,0xf1,0x48,0x9e,0xbb,0x41,0x33,0x3d,0xc6,0x30,0x7b,0x82,0xd9, +0x26,0x81,0xa2,0x0c,0x14,0x21,0xb5,0xa8,0x46,0xb7,0xb5,0x81,0xda,0xd7,0x95,0x59, +0x2f,0xa0,0xc0,0x4c,0xb8,0x20,0x14,0xd8,0xea,0x4f,0xe4,0x65,0x7a,0xbf,0x25,0xab, +0x8b,0x6e,0xc9,0x49,0x39,0x23,0x57,0x4d,0xcc,0x2c,0x2c,0xe9,0xa1,0x45,0xce,0xeb, +0x83,0xef,0xc1,0x7d,0x38,0x22,0x65,0x74,0x44,0xc9,0x6c,0x40,0xbb,0xfd,0x76,0x84, +0x6c,0x9d,0x3f,0x35,0xbc,0x72,0x4c,0xa4,0x48,0x19,0x51,0x99,0x76,0x32,0x8b,0x76, +0x12,0x77,0xb4,0xd3,0xfb,0x32,0xdc,0x34,0x11,0x5c,0x30,0x2f,0x9a,0xc2,0x5c,0x00, +0x07,0x09,0x1f,0xaa,0x47,0x57,0xd5,0xd5,0x62,0xef,0x33,0x21,0xb2,0x0c,0xb5,0x6f, +0xb1,0x5e,0x36,0x06,0xcd,0x39,0x63,0x8c,0x4d,0x5e,0xa7,0x27,0xf1,0xdc,0xf3,0xc8, +0x24,0xaf,0x04,0x3c,0xad,0x76,0x2c,0x82,0x80,0x34,0xee,0x54,0x90,0xdb,0xe0,0x4e, +0x22,0x97,0x22,0x24,0x23,0x3a,0xf0,0xb0,0x67,0x7c,0x86,0x6f,0x1b,0xc5,0xd9,0x45, +0xac,0xb9,0x1b,0x0b,0x30,0x3e,0xd1,0x26,0x62,0x76,0x71,0x96,0x8e,0x79,0x8d,0x55, +0x29,0xe8,0x65,0xd0,0x97,0x31,0xd6,0xb7,0xe9,0x4c,0xa3,0xf3,0x12,0xf4,0xf9,0x4f, +0x1b,0x3e,0xc2,0x8e,0x70,0x7a,0x68,0x08,0x9c,0xa9,0xc5,0x5c,0xe6,0x89,0x2e,0x6b, +0x8a,0x0b,0x33,0xa5,0xc2,0x3d,0xda,0xe6,0x67,0x47,0xdc,0x58,0xe4,0x84,0xbf,0x16, +0x5d,0x93,0x1d,0xf3,0xb9,0x6a,0x4e,0xac,0x3d,0x36,0x57,0x29,0x89,0x38,0xb7,0xe9, +0x29,0xbd,0x89,0xf2,0xc1,0x84,0x62,0x4a,0xcf,0x8f,0x32,0x53,0x09,0x28,0x1f,0xe0, +0x2c,0x5e,0xe6,0x95,0x3c,0x5e,0x36,0x9e,0x4b,0x45,0xa4,0x1f,0xf6,0xd1,0xd2,0x5c, +0x25,0xb2,0xae,0x6f,0xac,0x30,0x5e,0x78,0xec,0xcd,0xe0,0xe5,0xf4,0xfb,0x65,0x32, +0xac,0xa5,0x8e,0x6d,0x1b,0xee,0x07,0xe5,0xe4,0x5d,0x83,0x0f,0xb2,0xce,0xe3,0x47, +0xa8,0x87,0x91,0xe1,0xbb,0x90,0x06,0x69,0x4e,0x59,0x00,0xbd,0xf7,0xd4,0x5e,0xda, +0xa1,0xee,0xf9,0x9c,0xf1,0x21,0x08,0xc2,0x0c,0x3b,0x4d,0x61,0xad,0x96,0x90,0x22, +0xd7,0xce,0x4f,0xd6,0x25,0xe3,0x68,0xb6,0x55,0x4c,0xb8,0xc5,0x67,0x6a,0x43,0x73, +0x85,0x20,0xde,0xf8,0x6d,0xcc,0xb1,0xa7,0xfd,0x1f,0xcf,0x8e,0x35,0x64,0x77,0xcb, +0x8d,0x98,0x33,0x69,0x94,0xe0,0x60,0x33,0x62,0xc5,0x5c,0x0a,0xd3,0xa1,0x5e,0x5a, +0x89,0x02,0xea,0x06,0xb5,0xa2,0x74,0xa2,0x02,0x69,0x8e,0x60,0xb7,0x67,0x6c,0x76, +0x01,0xe7,0xec,0xb4,0x95,0xed,0xfc,0x8f,0x4f,0x84,0xb0,0xf6,0xab,0xc6,0xe1,0x03, +0x8a,0x7d,0x69,0x44,0x37,0x2e,0x72,0x13,0xce,0xcf,0x83,0xe3,0xc9,0x8b,0x27,0xf3, +0x26,0xd7,0xc9,0x35,0xd6,0xa3,0xa6,0x73,0xe3,0xc6,0xa3,0xed,0xbf,0x57,0x22,0x6c, +0x4c,0xc7,0x62,0x7a,0xb9,0x77,0x44,0x90,0xef,0x89,0xa9,0xd5,0xb5,0xd8,0x22,0x1f, +0x6e,0x95,0xcc,0x7c,0xf6,0xcd,0xee,0xbc,0x25,0x75,0xc4,0x93,0xbc,0x6f,0x9b,0xcc, +0x4e,0x96,0x1e,0xfc,0x18,0xc9,0x1e,0x50,0x55,0xb7,0x4e,0x68,0x25,0x9c,0xd3,0xf3, +0xd1,0xc6,0x14,0x2e,0x19,0x54,0x84,0x60,0x34,0xf2,0xbb,0xcc,0xeb,0x60,0x5c,0x52, +0x81,0x0a,0x9a,0x88,0x3e,0xad,0xf6,0x6e,0x67,0x14,0x8c,0x68,0xbf,0x6f,0x6e,0x7e, +0x3c,0x9c,0x15,0x5a,0x6e,0xf0,0xfa,0x1b,0x1a,0xce,0xf2,0x56,0x3c,0x5f,0x67,0x0b, +0x82,0x75,0x24,0xc7,0x7f,0x11,0x2a,0xf6,0x6b,0xc7,0x81,0xeb,0xc1,0x83,0xab,0xdf, +0x4f,0x30,0xd5,0x82,0xbc,0xcf,0x3f,0xfa,0x4d,0x33,0xed,0x66,0x34,0xab,0x5c,0x42, +0x62,0x8b,0xa0,0x38,0xe9,0x0d,0x60,0xe5,0x8d,0xd3,0x83,0x0b,0x80,0x63,0x94,0x6d, +0x16,0xf4,0xce,0x96,0x34,0xa0,0x02,0x8f,0xaf,0xf2,0x2d,0xa8,0xf9,0x05,0xad,0xe5, +0x53,0x82,0x0a,0xa3,0x49,0xdc,0x53,0x07,0x0f,0x91,0x02,0x1e,0xf2,0x02,0x95,0x0c, +0xb7,0xde,0xf7,0x1b,0xc9,0xf1,0x43,0x12,0x0c,0x90,0x1d,0xed,0x40,0x6f,0xbb,0xc3, +0x02,0x39,0x73,0x44,0xdc,0xaa,0x24,0xeb,0xc5,0xcf,0xf3,0x1b,0x52,0x5b,0x52,0xca, +0x46,0xd5,0x85,0xb4,0x5c,0x64,0xfb,0x10,0xe0,0x95,0xa3,0x93,0x8a,0x9b,0xe0,0x71, +0xa2,0x56,0xc5,0xdf,0x34,0x11,0x33,0x85,0x64,0xd5,0x51,0x85,0x0d,0xb4,0x75,0xca, +0x4e,0xe7,0xed,0x24,0xcb,0xb1,0xd5,0xf6,0x65,0x9f,0x9f,0xe7,0xd3,0xec,0xc5,0x4a, +0x68,0x99,0x66,0x1d,0xc7,0x33,0x85,0x0b,0x5f,0x98,0x99,0xc1,0xa5,0x2d,0xa8,0xe8, +0x1e,0x99,0x08,0xd9,0xe7,0x16,0xfa,0x70,0xd6,0x76,0x39,0x92,0xf2,0x04,0xb6,0x87, +0x8e,0xeb,0x62,0xb2,0xba,0xf8,0x9c,0xec,0xe2,0x06,0xe6,0x90,0xc6,0xb8,0xd7,0x64, +0x2d,0x3a,0xfa,0xed,0x7f,0xbb,0x6d,0xa5,0xc3,0x99,0xd9,0xb9,0x14,0x9f,0x8a,0x58, +0x2a,0x96,0x90,0x00,0x9f,0x17,0xbc,0x1a,0x62,0xd3,0xbd,0x88,0x70,0xba,0xee,0x9a, +0x23,0x66,0xd0,0x93,0x5e,0xfd,0x1e,0xbe,0x4e,0x56,0x2a,0x04,0x1f,0x67,0xe5,0xb8, +0xfe,0x18,0xb7,0xcf,0x55,0x9d,0x17,0xaf,0xf9,0xd1,0xb7,0xc9,0xfc,0x73,0x6b,0xff, +0x46,0x0f,0xb7,0xaf,0x56,0x0f,0xa0,0x19,0x43,0x54,0x86,0x99,0x72,0x9d,0x60,0x1b, +0x03,0x0f,0x84,0x06,0x14,0xdb,0xa0,0xa0,0xa1,0x23,0xd4,0xb2,0x33,0x1e,0xe4,0x82, +0x09,0x09,0xa8,0x86,0x91,0x29,0x38,0x31,0x59,0x91,0xa2,0x84,0xbb,0xce,0x58,0x1e, +0x65,0xdd,0x81,0xc2,0x6d,0xab,0x0a,0xc1,0x80,0x72,0x87,0x0d,0x3b,0x26,0x9d,0x73, +0xc0,0x0b,0x0d,0xe8,0x99,0x62,0x39,0x03,0xe5,0x01,0x3d,0x31,0xdb,0x3f,0x14,0x46, +0xca,0x07,0x78,0xba,0x71,0x90,0x43,0x9c,0x06,0xc9,0x07,0x56,0xad,0xb1,0xf7,0xd4, +0x05,0x94,0xb7,0xbc,0xc5,0x68,0x98,0x04,0xc8,0x48,0x18,0x24,0x06,0x7e,0xe5,0xb0, +0x21,0x46,0x01,0x9c,0xb5,0x19,0x2e,0x91,0x12,0xf7,0xa9,0xe1,0xe5,0xe8,0x71,0xbf, +0x2f,0x0a,0xb2,0xba,0x11,0x23,0x22,0x11,0xd5,0x2b,0x5a,0x13,0x28,0xca,0x7a,0x72, +0x29,0x88,0xdb,0x25,0x1e,0x6a,0x54,0x0d,0xa9,0xee,0xeb,0x43,0x24,0x97,0xa6,0xe8, +0x01,0x9f,0x66,0x83,0x1a,0x59,0x1e,0x1c,0xa0,0x39,0xcd,0xc7,0xe8,0xfa,0x3b,0x59, +0x08,0x05,0x9e,0xf2,0x71,0x1a,0x6b,0x69,0xc4,0xb1,0x2a,0x91,0x2f,0x57,0x19,0xc1, +0x3a,0x46,0x4b,0x99,0x6f,0x39,0x01,0x3d,0xe8,0x2b,0xe0,0x39,0xd3,0x37,0xbf,0x5b, +0x2c,0x68,0xcd,0x2e,0x14,0x4e,0xed,0xf2,0xf5,0xd1,0x4e,0x3e,0x74,0x0f,0x32,0x5c, +0xf6,0x4f,0xf2,0x40,0xc6,0x10,0x61,0xe7,0xf4,0x56,0x27,0x81,0x53,0x2f,0x65,0xec, +0x0e,0xa5,0x07,0x9d,0xc4,0x2d,0xbf,0xf6,0xcb,0x2e,0x99,0x2f,0x9b,0x69,0x8b,0x61, +0x3e,0x7b,0x64,0x03,0x6a,0xf3,0x51,0x1f,0x38,0x32,0x84,0xf4,0xe8,0x1d,0xbd,0xf0, +0xa0,0x0f,0x14,0x7a,0x9c,0x3d,0x90,0x5d,0x68,0x11,0x6d,0x83,0xd1,0x0f,0x02,0x78, +0xfd,0xdc,0xac,0x7e,0xc4,0xb8,0x66,0xd0,0x25,0x13,0x3b,0x89,0xa1,0x72,0x5f,0x83, +0x32,0x18,0x69,0x1e,0x41,0xbb,0x4c,0x89,0x45,0xad,0xac,0x81,0x24,0xa3,0xf2,0xd6, +0x54,0xe5,0xad,0x1f,0x95,0x35,0x50,0xc5,0x1c,0x5a,0xba,0x14,0x65,0x30,0x7c,0x50, +0x81,0x51,0xc5,0x46,0xd8,0x03,0xab,0x10,0x6a,0x48,0x8d,0x74,0xd7,0x72,0x49,0x2e, +0x10,0xc5,0x48,0x25,0x43,0x15,0xdc,0xb7,0x4d,0x4b,0x71,0x0b,0x75,0x9c,0xc0,0xb3, +0xa4,0x9e,0xfd,0xd5,0x11,0x32,0xea,0xab,0xf2,0x52,0x85,0xec,0xf4,0x1e,0xf5,0x3e, +0x94,0x17,0xad,0x66,0x0d,0x3a,0x26,0x19,0x5b,0x18,0x32,0x77,0xd1,0xc7,0x14,0x50, +0x9b,0x55,0x25,0x66,0x99,0xa7,0x11,0x40,0x50,0x15,0x33,0x09,0xfa,0xac,0x77,0xfe, +0xa4,0xaf,0xb6,0x62,0x95,0x34,0xde,0x71,0x0c,0xae,0x2e,0xb1,0x7f,0xf1,0x78,0x79, +0xfb,0xcb,0x33,0xef,0x43,0x5f,0xe8,0x5b,0xc9,0x6a,0x25,0xcf,0xdb,0x33,0xbf,0xee, +0xa7,0xa4,0x70,0xb9,0xbf,0x19,0x1b,0xbc,0x96,0x7b,0x9a,0xe6,0x04,0xc7,0x71,0xf5, +0xda,0xcd,0x9e,0x48,0xd3,0xad,0x0f,0xb0,0xcf,0x57,0x8c,0xed,0xd9,0x30,0xc7,0xbe, +0x43,0x87,0xae,0x6f,0x94,0x32,0x07,0xa0,0xcc,0xd0,0xc8,0x8c,0x1b,0x07,0xc7,0x2c, +0x3c,0x05,0xb5,0xcc,0xf6,0xb3,0x17,0x01,0x52,0x13,0x66,0x05,0xe4,0x33,0xb7,0x31, +0xe2,0x52,0xef,0xc9,0x39,0x98,0x3f,0x4a,0x48,0x50,0xa6,0x9b,0xd9,0x72,0x8c,0x87, +0xfb,0x0b,0x60,0x82,0x79,0xce,0xef,0x23,0x60,0xdb,0xea,0x9d,0x3c,0x38,0x88,0x60, +0x67,0x35,0xac,0x32,0x6a,0xa1,0xc7,0xb6,0x3f,0x6b,0xce,0xc5,0xd9,0xa0,0x69,0x32, +0xe5,0x2d,0x46,0x47,0x98,0x59,0x20,0x45,0x3f,0x4f,0xcf,0x21,0x35,0x61,0x57,0x14, +0x78,0x8c,0x39,0xe9,0x68,0x02,0xf9,0xa2,0x61,0xc9,0xe3,0x57,0xbd,0xb2,0x18,0xc6, +0x5a,0x68,0x20,0x9f,0x35,0x1b,0x9c,0xf8,0x45,0x64,0x48,0x95,0x1f,0x91,0xb8,0x6d, +0x29,0x1e,0x57,0x11,0xdd,0xd4,0x7a,0x6b,0xbd,0x45,0xfc,0xf2,0x24,0x99,0xe6,0x41, +0x5b,0x53,0xb8,0xdd,0x33,0xd9,0x4e,0x73,0x31,0xc2,0xeb,0x15,0x2d,0x1d,0x69,0x40, +0xed,0xf4,0xe1,0xd2,0x62,0x01,0x10,0x0d,0x48,0x41,0x51,0x7a,0xe4,0x95,0x7f,0x0b, +0x3f,0xfa,0x9a,0xf1,0xe9,0xcb,0x72,0xc2,0x74,0x85,0xcc,0x28,0x3f,0x5d,0xbf,0xf5, +0xec,0xea,0xd4,0x18,0x7e,0x8c,0x45,0xbe,0x37,0x63,0x2a,0x5c,0xee,0x8c,0x9b,0xe4, +0x65,0x03,0x58,0xff,0xbd,0x5b,0xcc,0x58,0xd8,0x48,0xe5,0x06,0x37,0x8e,0xd2,0x65, +0x00,0xfd,0x78,0xec,0x11,0xa6,0xfb,0xaa,0x69,0xc3,0x83,0xd4,0x71,0xe6,0x3c,0xf2, +0x06,0xf9,0x77,0xb0,0xe3,0xc2,0x70,0x2a,0x56,0xa4,0x4a,0xa9,0x94,0x65,0x4a,0x53, +0x09,0x36,0x57,0xcd,0x23,0x52,0x20,0x7b,0xe8,0x8c,0x9a,0x60,0x3a,0xe0,0x31,0xcf, +0xbf,0x17,0x00,0x8f,0x8a,0xc2,0x7c,0x6f,0xfd,0xfb,0xfb,0x6b,0x59,0x9e,0x87,0xd9, +0x5b,0x4a,0xd4,0x98,0x41,0xa7,0xc0,0x1b,0xeb,0x4d,0x9b,0xdf,0xc1,0xe0,0x1f,0x62, +0x6c,0x1b,0x0d,0x04,0xe0,0xff,0xa4,0x4a,0x54,0x92,0xcf,0x4e,0x20,0xbd,0x12,0xe2, +0x1d,0x10,0x51,0xd8,0xc0,0xed,0x3d,0x36,0x63,0x95,0xb0,0x99,0x5f,0xa4,0x6d,0xaa, +0x24,0x32,0x9d,0x79,0x18,0xbf,0xf5,0xb1,0x69,0x74,0xeb,0xe7,0xf4,0x5d,0x65,0x60, +0x21,0x1e,0x97,0x7c,0x06,0xf2,0xc6,0x37,0xe3,0xf5,0xed,0x88,0x89,0x26,0x1b,0x2a, +0x33,0xd9,0x18,0x36,0x3e,0xbb,0xe4,0x90,0x55,0x4c,0xf2,0x62,0x0d,0xe8,0x56,0x34, +0x37,0xda,0x9e,0xd7,0x7b,0x18,0x6f,0x70,0xe7,0x3a,0x8b,0x74,0x55,0xe7,0xc9,0x58, +0xa7,0x86,0x85,0x74,0x19,0xbb,0x8d,0xc7,0x07,0x79,0xd5,0xe2,0xf0,0x4d,0x6c,0x35, +0x22,0xc6,0xfe,0x37,0xbb,0x4c,0x45,0x23,0xbb,0x78,0xa7,0xf4,0x54,0x92,0x74,0x91, +0xc7,0xfc,0xfc,0x89,0x54,0x60,0x9a,0x34,0x97,0x9a,0x25,0x2a,0x01,0x3b,0x4c,0x9b, +0x2c,0x49,0x18,0x6d,0xb1,0xb4,0x86,0x44,0x90,0xb7,0x06,0x45,0x80,0x95,0x18,0x69, +0x51,0xf4,0xd9,0x89,0x5d,0x39,0x68,0xce,0xdf,0x99,0x8d,0x50,0xcf,0x2a,0x75,0x9a, +0x7f,0x04,0x3f,0x77,0xe0,0xf9,0xdc,0xfb,0xad,0x20,0xd8,0x7f,0xcd,0x5f,0x91,0x35, +0x62,0x11,0xe2,0xea,0x41,0xbc,0xe3,0x0a,0x6a,0x23,0xac,0xac,0xdd,0xfa,0x4e,0x7f, +0xd1,0x42,0x2e,0x3b,0xac,0xa6,0xa7,0x85,0x69,0x67,0x86,0x38,0x27,0xb3,0x9c,0x23, +0xbb,0xd1,0x77,0x4b,0xc5,0x21,0xe7,0xd4,0xbb,0x9c,0xa7,0xea,0x9d,0xde,0x6d,0x27, +0xe7,0x9b,0xae,0xb9,0xd4,0xb0,0x27,0x04,0xdc,0x49,0x48,0xdb,0xff,0xff,0x3e,0xad, +0x68,0x0d,0xfd,0xc6,0xb1,0x26,0x47,0x52,0x64,0x95,0x17,0xff,0xab,0x0e,0xf3,0xe0, +0x20,0xf0,0xe8,0x96,0xc5,0x4e,0x18,0x34,0x1d,0x10,0xe0,0x74,0x49,0x23,0xfe,0x72, +0xb6,0x61,0x22,0xef,0x96,0x98,0x40,0x1e,0xfa,0xd9,0x2e,0xbe,0x25,0xc4,0x77,0x17, +0xe2,0x26,0xb1,0x24,0xbb,0x2c,0xba,0x91,0x1d,0x60,0x01,0x28,0x24,0x97,0xc7,0x52, +0x26,0xab,0x7f,0x75,0xb3,0xf5,0x12,0x84,0xb5,0xd1,0x82,0x7a,0xb9,0x00,0x70,0xaf, +0xea,0x6d,0xde,0x36,0xe4,0xd8,0xdf,0x5c,0xce,0xc8,0x14,0xe4,0xa4,0x98,0xe5,0x23, +0x75,0x63,0x3e,0xad,0x84,0x6b,0x83,0x5a,0xac,0x04,0x8b,0x64,0x71,0xcb,0x5f,0x33, +0xa7,0xac,0x6a,0xb7,0x53,0x8a,0xbe,0x9e,0x22,0x91,0x75,0xeb,0xd0,0xf5,0xd1,0xfb, +0x84,0x05,0xe2,0x12,0xbf,0x25,0xfe,0x5b,0x62,0xce,0xea,0xa8,0x5a,0xca,0x32,0xeb, +0x63,0x67,0xb0,0xef,0x1c,0x8d,0x19,0x78,0x0d,0xe2,0x36,0xae,0x05,0x63,0x93,0xfa, +0xea,0x6f,0xd5,0xad,0x3b,0x6b,0x13,0x5a,0xea,0xcc,0x95,0x69,0x31,0x22,0x6d,0x25, +0x60,0xba,0x03,0x58,0xbb,0x3b,0x4b,0x21,0xa2,0x68,0x1b,0x1c,0xc7,0x2a,0x3a,0x4c, +0xe3,0x44,0xba,0x7d,0xbb,0x8d,0xab,0x52,0x78,0xf9,0x8c,0x8e,0x5e,0x91,0x32,0x5f, +0x2f,0x0b,0x6a,0x2e,0x79,0x99,0x0c,0xfc,0x17,0x1c,0x03,0x76,0x5d,0x36,0x71,0xba, +0x0e,0xaa,0xfb,0x7d,0x6a,0x81,0x06,0x57,0xa8,0xbb,0xe1,0x5d,0xff,0x2c,0x1b,0x51, +0xe8,0x2f,0x0b,0x3c,0x66,0x4a,0xf7,0x06,0x55,0x12,0xbf,0x3d,0x83,0xe4,0xe7,0x73, +0x16,0x51,0x9f,0xc8,0xd9,0x78,0xef,0x24,0x62,0x18,0x05,0x57,0xf4,0xfd,0xb3,0xa1, +0x1f,0xbe,0xf7,0xb3,0x90,0x5d,0x24,0x5e,0xe2,0x5c,0x0c,0x44,0x14,0xd0,0xb2,0x51, +0xd7,0x12,0x45,0xe4,0x50,0x3f,0x7d,0xc3,0x5f,0x5c,0xc7,0xbb,0x1b,0x16,0xd8,0xef, +0xcb,0x40,0x6a,0xef,0x67,0x39,0x60,0x73,0x40,0x55,0x0e,0x46,0x75,0xfe,0x1e,0x4e, +0x5e,0x56,0xa2,0x01,0x31,0x4d,0x34,0xfe,0x07,0x59,0xaa,0xc9,0x74,0x8e,0x0a,0xaf, +0x00,0x67,0xf4,0x2e,0x9f,0x38,0x54,0xf4,0x1c,0x35,0xcd,0x70,0x1e,0x35,0x85,0x87, +0x03,0x12,0x7a,0x41,0x85,0x72,0xaa,0xa6,0x20,0x36,0x8b,0x18,0x96,0xcd,0x17,0x5c, +0xdf,0x55,0xb2,0xa6,0xa4,0x48,0xe2,0xc1,0xe7,0x51,0x71,0x86,0x9f,0xd1,0x78,0x24, +0x0c,0xb5,0x07,0xff,0x3d,0x7a,0xb5,0x5a,0x6e,0xe2,0xc4,0x0b,0x93,0x1c,0x59,0xeb, +0x1f,0x9a,0x3a,0xe3,0x9a,0x94,0xde,0x61,0xd3,0x55,0xca,0x4f,0xfd,0xf4,0xd2,0xb9, +0x57,0xb5,0x9b,0xbf,0x4d,0x35,0x77,0x2b,0x3c,0x45,0x07,0x5d,0xc1,0xdb,0xf0,0x6a, +0xdb,0x5a,0x03,0xac,0x18,0xba,0x27,0xd2,0x68,0x56,0xcd,0xa3,0x12,0x1f,0x86,0xdf, +0xd1,0xb1,0x2a,0xb7,0xa4,0xb7,0x06,0x65,0xc9,0x5a,0x43,0x9f,0x1e,0xda,0x8e,0x5c, +0x5a,0xa2,0xee,0x56,0x3a,0x37,0x26,0x9a,0x9c,0xa2,0xe4,0x6f,0x43,0x82,0x46,0x4d, +0xe0,0x65,0xe7,0x27,0x4b,0xb7,0xf4,0x08,0x4b,0xde,0x46,0x2d,0xeb,0x12,0x71,0xd0, +0x26,0xa9,0x95,0x27,0xc7,0x90,0x06,0xf2,0x0e,0xe0,0xe5,0x6e,0xcb,0xa0,0x3a,0x00, +0xb7,0x2d,0x22,0xf6,0x15,0x01,0x30,0xa0,0x90,0x4f,0x8e,0x0b,0x3c,0x51,0xb8,0xe2, +0x24,0x20,0x24,0x27,0xb4,0x20,0x00,0x59,0xc4,0xcc,0xc6,0x30,0xb4,0x62,0x73,0x73, +0x04,0x94,0x2d,0xf4,0x99,0x0f,0xf1,0xfa,0x7e,0xce,0xa7,0x45,0xb4,0xff,0xfc,0xe0, +0x01,0x08,0x81,0xe4,0x11,0x2e,0x80,0x71,0x64,0xbe,0x9e,0xc4,0x59,0xa2,0x18,0xc0, +0x24,0x54,0xd8,0xb8,0xba,0xa9,0xb0,0xf2,0x09,0xcc,0x8f,0x5b,0xbd,0xa0,0x0a,0x52, +0x06,0x37,0x28,0xd7,0x82,0xe5,0xa7,0x72,0x63,0x87,0x5c,0x86,0x5f,0xea,0x19,0x67, +0x7b,0xe8,0x1e,0xc5,0xb0,0x2e,0xf5,0x9e,0xce,0x87,0xcb,0xd7,0x02,0x49,0x33,0xde, +0xfb,0xc5,0xb6,0x5b,0xe0,0x73,0xe1,0xfe,0xc1,0xee,0x7e,0x16,0xa1,0xa6,0x15,0xbb, +0x3a,0x27,0xf0,0x0d,0x1a,0xe1,0x1a,0x48,0xb8,0xcb,0xeb,0x34,0xb9,0x69,0x86,0x69, +0x33,0x7f,0x0a,0x6c,0x7f,0x8d,0x97,0xbe,0x16,0xf0,0xe8,0x20,0xb6,0x8d,0x87,0x2f, +0xa2,0x55,0x27,0x3f,0x3d,0x05,0x84,0x8a,0x51,0x37,0xa4,0xdc,0x58,0x67,0x55,0xb6, +0x64,0xd8,0x6b,0x7e,0x60,0xe9,0x8c,0x53,0x3e,0x74,0x2b,0xcf,0xfa,0x4a,0xa2,0x5d, +0xf5,0x07,0x3d,0xb4,0xf7,0xc6,0x02,0x08,0xcc,0xcf,0xac,0x42,0x5e,0x48,0x0c,0xde, +0x45,0xf6,0x95,0xda,0x78,0x59,0xba,0x1b,0xe9,0xc0,0x08,0x1c,0x7e,0x2d,0xa2,0x76, +0x88,0xcc,0x1e,0xa3,0x9e,0x23,0x76,0x89,0xfd,0x9a,0x3a,0x42,0x5c,0xea,0xab,0xdf, +0xfe,0x30,0xd1,0xa0,0x62,0xc3,0x1b,0xdb,0x93,0xc0,0xc3,0x8e,0xeb,0xef,0x7d,0x0c, +0x81,0x36,0xa4,0x75,0xb0,0x3d,0x8d,0xe0,0xc5,0xad,0x24,0x4e,0xa0,0x3d,0x0c,0x61, +0x86,0x83,0x28,0xa6,0x15,0x1e,0x8b,0x13,0xf8,0x2c,0xfb,0xd0,0x82,0x9d,0x73,0xf0, +0xc6,0x1b,0xf7,0x81,0xb2,0xfb,0x1d,0xc1,0x10,0xd1,0xd3,0xc6,0x0b,0xe9,0x95,0xe3, +0x25,0x35,0x0d,0xe5,0xd7,0xf7,0x90,0x37,0xbe,0xea,0x02,0x29,0xd1,0x5c,0x1a,0x77, +0xc7,0x12,0x44,0xb4,0x54,0x60,0x0e,0x82,0x42,0xcf,0x58,0x99,0xbc,0x85,0xa9,0xef, +0x21,0xd7,0x94,0xa9,0x16,0xc7,0x36,0xe8,0xc4,0x51,0x2e,0xd6,0x6f,0xcb,0x65,0x30, +0xc0,0x1d,0x9b,0xc0,0xd5,0x96,0xb4,0x85,0x15,0x7b,0x4e,0x74,0xc2,0xfc,0xcb,0x57, +0xe5,0xe9,0xb3,0x35,0xb3,0x32,0x82,0x80,0xa4,0x43,0x9d,0xe9,0xc5,0xfa,0x5e,0xae, +0xc5,0x12,0x66,0xef,0xc1,0xfa,0x81,0xdf,0x9f,0x67,0x12,0xcc,0x8f,0x9d,0x82,0x05, +0x09,0x34,0x77,0x80,0x06,0xe9,0x56,0xd8,0xd2,0xd7,0xc6,0xa3,0xbd,0x36,0x65,0x74, +0x45,0x59,0xbc,0xc3,0x83,0x9a,0xcc,0x2f,0xee,0x92,0x8f,0x54,0xd8,0x51,0xfa,0xab, +0xa5,0x34,0x6f,0xfb,0xe1,0xf9,0x07,0x55,0x6e,0xd6,0x81,0x1e,0x96,0xf4,0xca,0x51, +0xc5,0xaf,0xf4,0x12,0x38,0xe7,0x0e,0xf8,0x87,0xd3,0x1a,0x7c,0x63,0xf4,0x3f,0x2a, +0xb1,0x6c,0xe6,0xc7,0x5c,0xc2,0xd9,0x18,0xaf,0x22,0xa1,0x39,0xfd,0x29,0x5d,0x59, +0xae,0x31,0xc6,0x4b,0x89,0x98,0x6f,0xea,0xb2,0x63,0xf1,0x9d,0x5d,0xbc,0xaf,0x5f, +0xde,0xdd,0x78,0x2c,0x3b,0x32,0xc4,0x2b,0xe7,0x00,0x61,0x8d,0x94,0xf0,0x04,0x84, +0x5c,0xec,0xcb,0xe2,0xb5,0x4e,0xe7,0xa4,0x2e,0xd2,0x6b,0xa0,0x6f,0xfc,0x7a,0x11, +0x59,0x64,0x20,0x38,0x35,0x4d,0x10,0x39,0x47,0xa2,0x23,0x6e,0x57,0x91,0x61,0x1f, +0xed,0x0f,0xe3,0x09,0x91,0x03,0xfd,0xa5,0xca,0xb8,0xbe,0x5a,0x09,0xfe,0x31,0xa3, +0xee,0x13,0xb6,0x9a,0x6a,0xbe,0x06,0xce,0xf2,0xb4,0x08,0x7b,0x24,0x3f,0xde,0xb4, +0xeb,0xe5,0x3b,0x60,0xce,0xb5,0x70,0x89,0xe3,0x40,0x45,0x97,0xd6,0xe9,0xd6,0xa4, +0xa2,0x85,0xe1,0x26,0xf4,0x35,0x60,0xa0,0x0f,0x43,0xe0,0x8b,0x30,0xea,0x39,0x71, +0xb7,0x44,0xe6,0x7c,0x03,0xdb,0x53,0xe3,0x42,0xdf,0x83,0xd6,0x39,0x02,0x31,0x3a, +0x85,0xee,0x33,0x7f,0xeb,0xe8,0xd1,0x15,0x60,0x06,0x48,0x86,0x57,0xea,0x62,0xbb, +0xba,0x83,0x63,0xf6,0x23,0x60,0xd2,0xa9,0x8f,0x0a,0x3f,0x53,0xc5,0xfd,0xd5,0x18, +0x7e,0x4b,0x8f,0x7b,0x17,0xd6,0x43,0x6b,0xec,0xc9,0xca,0x03,0x73,0x2b,0x07,0xeb, +0x08,0x9a,0x3f,0x4a,0x96,0xf5,0xdd,0x3f,0xcb,0x68,0xc3,0x16,0xf2,0xbf,0x8b,0x55, +0x5a,0x86,0x27,0x66,0x47,0xb6,0xe3,0x5f,0x0b,0x6b,0x1c,0x11,0x24,0x1a,0x72,0x3b, +0x3a,0x03,0xc3,0xba,0x1c,0x55,0x74,0x88,0xce,0xe8,0x80,0xdf,0xb1,0x08,0x4f,0x5a, +0xc5,0x4c,0xaa,0x1c,0xd4,0xa6,0xda,0x5c,0xfe,0x0f,0xa4,0x7a,0xba,0xee,0xf7,0x3a, +0xb2,0x01,0x39,0x3f,0x71,0x67,0xcc,0x6e,0xa1,0x41,0x43,0x9d,0x20,0xdf,0x2b,0x47, +0xee,0x02,0xca,0xbf,0x9d,0x94,0x9b,0x41,0x6a,0x90,0xad,0x8e,0x57,0x2e,0xa8,0x12, +0x22,0x1a,0x44,0xf1,0xf3,0x3c,0xef,0xa8,0xc5,0xaf,0x5a,0x54,0x8f,0xdf,0x6c,0x27, +0xe1,0x0a,0x4c,0xe1,0xf0,0x3c,0x5d,0xd6,0x17,0x52,0x0a,0xc6,0x9a,0xb0,0x42,0xe7, +0xe0,0x5d,0xbd,0x75,0xe8,0x43,0x4c,0x83,0x45,0xa3,0x84,0x56,0xc8,0xdd,0x79,0x15, +0xcf,0x81,0x9b,0xf7,0x4a,0xee,0xa3,0xb8,0xd2,0xeb,0xc7,0x47,0x99,0xb2,0x3c,0xc2, +0x32,0xe9,0xd4,0xcd,0x20,0x90,0x41,0xd1,0xc3,0xab,0xa2,0x17,0xfe,0x35,0x16,0xd1, +0x80,0x13,0x9a,0x39,0xa2,0x6e,0xe3,0xc0,0x42,0xea,0xae,0x07,0xff,0x34,0xbd,0x43, +0x80,0xa6,0xd6,0x75,0x7a,0x87,0x6b,0xc9,0xcc,0x89,0xab,0xe3,0x13,0xf5,0x6d,0xbc, +0x02,0xe8,0xae,0x2c,0xf1,0xac,0xe6,0x41,0x7d,0xc8,0xa3,0xf3,0x12,0xf4,0xb9,0xa5, +0xd7,0xc5,0x52,0x76,0xbb,0x35,0xae,0x99,0x3b,0x17,0x56,0xd9,0xa0,0x75,0x71,0xe2, +0x1b,0x86,0x2d,0x3c,0xe5,0x1a,0x47,0xbc,0xbc,0x35,0x31,0x87,0x1d,0x3b,0xd6,0x77, +0x51,0x29,0x7c,0x09,0x87,0xa6,0xbf,0x85,0xcc,0xa7,0x8f,0x25,0x25,0x47,0x6f,0x2e, +0x69,0x5b,0xd5,0x86,0x8d,0x79,0xdb,0xe7,0xe7,0x45,0x81,0x91,0x74,0x86,0x82,0x4d, +0x24,0x96,0xa5,0x31,0xa9,0xe7,0xc6,0x1b,0xee,0xd1,0xa4,0x1f,0xf6,0x3d,0x36,0xa7, +0x68,0xfd,0x26,0xd5,0x1f,0x99,0xce,0x10,0xbb,0x31,0x61,0xc0,0x84,0xa6,0xc3,0x4b, +0xaf,0x64,0x22,0x49,0xe1,0xf2,0x05,0x5e,0x01,0x3a,0xa9,0xea,0x5b,0xa1,0x2f,0x79, +0xf9,0x10,0xdc,0x6d,0x73,0x8e,0xe7,0x62,0xf9,0x12,0xdf,0x83,0xdf,0xf2,0x40,0xb1, +0xb6,0x8f,0x43,0xc6,0x50,0x2d,0x38,0x2f,0x77,0x06,0x4f,0x58,0x62,0x3f,0x50,0x35, +0xa6,0xc3,0x50,0x32,0x88,0x1c,0xa8,0x40,0x76,0x6d,0x47,0xcb,0x6e,0x3a,0x1b,0x81, +0x50,0x6b,0xf8,0x5e,0x33,0xb2,0xeb,0x37,0x41,0x93,0x21,0xca,0x9c,0x59,0x28,0x13, +0xa1,0x58,0x04,0x59,0x68,0xff,0xc1,0x17,0xf6,0x5b,0x0f,0xb3,0xae,0xc8,0x00,0xe2, +0x18,0xc6,0x61,0xc2,0x65,0x91,0xc4,0x00,0xb9,0xdf,0xae,0x84,0x52,0xe2,0xf6,0x8d, +0x34,0x07,0x9a,0x53,0x1b,0xcb,0xc0,0x89,0x63,0x1a,0xeb,0x14,0xe8,0xa8,0xed,0x0c, +0x79,0xc4,0x81,0x18,0x35,0xab,0xf9,0x05,0x35,0xd6,0x47,0x1a,0xd2,0xa4,0xd1,0xac, +0x05,0x84,0xc9,0x56,0x1a,0xaf,0xc6,0x42,0x66,0x38,0x1c,0x98,0xc5,0xaa,0x94,0xf7, +0x2d,0xca,0xf8,0x09,0x28,0xea,0x8a,0xca,0x2b,0x65,0x88,0xc5,0xe5,0x84,0xf5,0x7a, +0x0b,0xc1,0xf0,0x36,0x21,0x06,0x91,0xf7,0xec,0xc2,0xe0,0x85,0x65,0xab,0xfe,0x02, +0xfb,0x6f,0x3d,0xfb,0x3d,0x55,0xbe,0xcb,0xeb,0xcc,0xd5,0x63,0xdf,0x83,0xe3,0xf3, +0x63,0xc6,0x0b,0x6d,0xff,0x0c,0x20,0xd3,0xc8,0x86,0x25,0xb5,0x7c,0xe2,0x67,0xa8, +0x3d,0x2e,0x63,0xca,0x65,0xb1,0xc9,0xcf,0xb9,0x61,0x90,0x6e,0xe9,0x80,0x0a,0xfa, +0x53,0x82,0x6b,0x1e,0xa6,0xe3,0x44,0x07,0x39,0x62,0x6a,0x8e,0xc0,0x1c,0x33,0x57, +0xde,0xc3,0xdd,0x2b,0x11,0x28,0x2b,0x56,0x25,0x8a,0xcc,0xe0,0x3f,0xb8,0x0b,0xfb, +0xd7,0x02,0x79,0xdb,0xe6,0x81,0xdf,0x19,0xeb,0x62,0x85,0x79,0x3e,0x6c,0x60,0xcc, +0xa6,0x77,0x3a,0x72,0x95,0x4f,0x49,0x5d,0x57,0x95,0xd2,0x8f,0x81,0x56,0xd3,0x7a, +0x65,0xd3,0x0c,0xe4,0x57,0x16,0x43,0x75,0xbb,0x4c,0xad,0xa9,0x4d,0x55,0x07,0x07, +0xca,0x99,0xff,0xbe,0x88,0x1d,0x8d,0x59,0xf4,0x9f,0xa4,0x67,0xb8,0x26,0x69,0x73, +0xa3,0x70,0x6d,0xe2,0x76,0xbf,0xde,0x73,0xbd,0xc8,0x2f,0x82,0xbd,0x32,0x04,0x86, +0x2d,0x1f,0xb2,0x2b,0x76,0xef,0x17,0xc6,0xdb,0x2b,0x8f,0x1d,0x49,0xf6,0x77,0xb0, +0xd8,0x19,0x8f,0x2b,0x34,0x6e,0x43,0xcf,0x98,0x58,0x3c,0x76,0x72,0x8e,0xe1,0x21, +0x24,0x92,0x82,0x3e,0x66,0x2d,0xa1,0x70,0x47,0x09,0x2c,0xd2,0x4d,0xe9,0xa9,0x56, +0xa9,0x1d,0x8e,0x53,0xec,0x7b,0xae,0xd7,0x68,0x7a,0xea,0x1b,0x49,0xcc,0x1c,0x0e, +0x26,0xd5,0x9e,0x7e,0x72,0xc9,0xd1,0xcc,0xdb,0xc8,0x88,0x9a,0xf1,0x7e,0x14,0x72, +0xc3,0xd6,0xb8,0xfc,0xc6,0x64,0xed,0x1a,0x80,0x29,0x28,0x4c,0x5c,0x0b,0x27,0x8b, +0xac,0x9a,0x67,0xfa,0x6d,0xb7,0x8f,0x44,0x90,0x87,0xb1,0xef,0x37,0x57,0x4f,0x2c, +0x8a,0x80,0x7b,0x65,0x3e,0xb6,0x66,0xe7,0x48,0x7a,0xe5,0x56,0xc5,0xb9,0x62,0x48, +0x2b,0x06,0x4e,0xc7,0x1a,0x37,0x26,0x79,0x0c,0x71,0xf7,0x06,0x7e,0xbe,0x24,0xdf, +0x83,0x92,0xd4,0x6e,0xd3,0x12,0x40,0xcf,0x07,0xd0,0x3c,0x8c,0xdc,0x98,0x1f,0xb4, +0x6f,0xfc,0xba,0xf2,0x55,0xfa,0xe0,0x78,0xc0,0x9f,0xaf,0xf0,0x7c,0xfd,0x7f,0xce, +0xeb,0x99,0x4b,0xfb,0xdc,0x08,0x80,0x88,0x8b,0xbc,0x40,0x1d,0xdb,0xff,0x59,0x8a, +0xe5,0xaf,0xe6,0x59,0x50,0xdf,0x22,0x11,0x2e,0xbf,0x3b,0x4a,0x85,0x9c,0x58,0x21, +0xa0,0xfe,0xc4,0x04,0xe6,0xdc,0x66,0xa6,0x9d,0xa7,0x8e,0x41,0xba,0x88,0x96,0x09, +0x65,0xad,0x2d,0x76,0x97,0x84,0x2f,0xc3,0xaa,0x81,0x2c,0x7a,0x39,0x93,0x37,0x2c, +0xaf,0xdc,0x25,0x87,0x81,0x29,0x23,0xc2,0x0b,0xe8,0xa4,0x04,0xe0,0xcc,0x5a,0x44, +0x21,0x4c,0x7f,0xa6,0xcf,0xb9,0xef,0xa7,0x80,0x04,0x10,0x19,0x34,0xc9,0xf7,0xb6, +0x30,0xf5,0x91,0xc8,0xb6,0xb4,0xdc,0x35,0x1a,0x05,0xce,0xd5,0xb8,0x46,0xe9,0x48, +0xb1,0x24,0x6e,0xe5,0xc6,0xd6,0x59,0x74,0xa9,0x3e,0x05,0xe1,0xbc,0x30,0xb1,0x23, +0x68,0x4e,0x36,0xf5,0xd3,0xc7,0xc9,0xf5,0xaa,0xe2,0x62,0xc4,0xf1,0xc8,0xbd,0x38, +0x84,0xf7,0x43,0x72,0x95,0xae,0x70,0x2c,0x80,0x8b,0x8b,0x28,0x79,0xfc,0x53,0x0d, +0xdc,0x65,0x29,0xfe,0xf9,0xd6,0x64,0xa3,0x22,0xdf,0x36,0x7e,0xda,0xbd,0x39,0xb5, +0x7f,0xf7,0x82,0xcd,0xda,0xd7,0xf0,0x3a,0xa6,0xbc,0x7f,0xad,0x24,0x4a,0xcf,0x47, +0x87,0x15,0xd2,0x8e,0x3c,0x94,0x9b,0xca,0x2d,0xe4,0x79,0x22,0x17,0xc0,0x22,0x56, +0xee,0x87,0x69,0x36,0xcf,0xb3,0x92,0x81,0x95,0x0e,0x82,0xe8,0x34,0x7a,0x4d,0xdc, +0x70,0x10,0x88,0x26,0xbc,0x2b,0xee,0xfc,0x78,0xd2,0x61,0xcd,0x2f,0xc2,0xc3,0xab, +0xaa,0x4e,0x6c,0x33,0x47,0x35,0x8a,0x3d,0xcc,0xc4,0xc5,0x50,0x31,0x9f,0x8b,0xa1, +0x33,0xa2,0x9b,0x54,0x38,0x34,0x9b,0x24,0xb9,0x0e,0x48,0x6c,0xfd,0x6b,0xfe,0x88, +0xdd,0xdf,0xfc,0xb6,0x43,0x30,0xa6,0x12,0x70,0x95,0x38,0x01,0xa5,0x13,0x32,0x30, +0x41,0x51,0xda,0x76,0xe8,0xcc,0x2f,0xb8,0x85,0xe4,0xbb,0xaa,0xa1,0xda,0xde,0x9e, +0xdf,0x88,0x93,0xed,0x4f,0xaf,0x63,0x8b,0xde,0x97,0x3e,0x6f,0x4b,0xdd,0x72,0xe3, +0xcb,0xe2,0xa2,0x6f,0x48,0x92,0xc2,0xb1,0x62,0x5d,0x38,0xb1,0x76,0x65,0xbb,0x3c, +0x24,0x56,0x9b,0x22,0x34,0x17,0x32,0x92,0xc1,0xa9,0x14,0x60,0x03,0x8b,0x72,0x8c, +0xe9,0x4d,0x84,0xd0,0xb6,0x67,0xa3,0x8b,0x0b,0x58,0x1c,0x70,0x02,0xca,0xcc,0x1b, +0x86,0x7a,0x2e,0x41,0xc1,0x17,0x43,0x83,0x8a,0x5b,0x8f,0x6a,0x9a,0x95,0x2d,0x66, +0x31,0x18,0x5d,0x24,0xc7,0x91,0x4b,0x93,0x18,0x8c,0x1d,0x0c,0xde,0xda,0x7d,0x0c, +0x43,0xe2,0xbe,0x73,0xc9,0x7a,0xf6,0x97,0x4c,0x43,0xc6,0x32,0x83,0xd5,0xa2,0x70, +0xeb,0xd4,0x4a,0x62,0x95,0x34,0xa6,0x28,0xce,0xf4,0x1c,0x4c,0xa8,0x26,0xb8,0xd5, +0x8b,0x6a,0xc8,0x28,0x1c,0xd7,0xa6,0xcf,0xc9,0x4a,0xe1,0xfc,0x1a,0x71,0x6d,0x98, +0xa8,0x6b,0x4b,0x72,0x2c,0xe6,0x94,0x59,0xe1,0x14,0x62,0xbf,0xb9,0x2e,0x60,0x94, +0x3f,0xc7,0x98,0xf1,0x1b,0x97,0x54,0x18,0xf5,0xed,0x55,0xab,0x74,0xa3,0x48,0xaa, +0xd0,0x5f,0xd6,0xaf,0x78,0xbc,0x25,0x7c,0x06,0x6a,0x5a,0x01,0x73,0x3c,0xec,0x34, +0x22,0x65,0x97,0xfa,0xd1,0x1d,0x97,0x9c,0x18,0x53,0x68,0x2a,0x2c,0x76,0x10,0x38, +0x4a,0xb0,0x34,0x2e,0x95,0xb2,0x67,0x3e,0x39,0x57,0x68,0x49,0xfd,0x45,0x5d,0xf1, +0x70,0x1b,0x0c,0x79,0xce,0x2b,0x86,0xd3,0xac,0xd0,0xd6,0x22,0x3f,0x66,0xf7,0x12, +0x72,0x8e,0xc9,0x56,0x51,0x5d,0x94,0x41,0x7f,0x67,0xc6,0xa9,0x3e,0x57,0x86,0xfa, +0xd7,0xfd,0x81,0xed,0xfd,0xad,0x4f,0x11,0x41,0xd4,0x31,0x55,0x3f,0x34,0xe9,0x12, +0x12,0x2e,0x10,0x48,0x93,0x7b,0x6a,0xc0,0x1d,0x6e,0xb8,0xc4,0x07,0x4c,0xf8,0x85, +0xc4,0xd4,0xa6,0x39,0xb1,0xa2,0x10,0xd5,0xd4,0xc9,0xdc,0x42,0x8a,0x47,0xd0,0xb2, +0x05,0xc8,0xeb,0x30,0xe0,0xb5,0x1e,0x10,0xb0,0x4e,0xfd,0x9e,0x73,0xa8,0x69,0xa1, +0xb5,0xb4,0xb1,0x5a,0x35,0xbd,0x33,0x81,0xc0,0x2f,0xcf,0xd6,0x34,0xc6,0x6b,0xb5, +0x81,0x7d,0x51,0xa8,0x91,0x4e,0x0e,0x4e,0xc1,0x2e,0x87,0xc3,0xe4,0xf4,0x72,0x3b, +0xad,0x77,0x3a,0x02,0x9c,0x2f,0x63,0xb8,0x4c,0x67,0x00,0xdd,0xb0,0x43,0xff,0x78, +0xf2,0xec,0x3d,0x55,0xa0,0x95,0xd2,0xb0,0x6f,0x1f,0x12,0xb4,0xa4,0x35,0x1d,0x36, +0x8a,0x69,0x33,0x10,0xe8,0x1e,0x10,0xda,0x50,0xaa,0x85,0x23,0x37,0x6f,0x13,0xf3, +0x4f,0x77,0x95,0x6a,0x55,0x21,0x44,0x71,0x70,0xd7,0x80,0x61,0xee,0x2b,0x3c,0xb7, +0x6a,0x37,0x0d,0xcc,0x9e,0x17,0x13,0x08,0xc3,0x1a,0xd2,0x7b,0x6d,0x2d,0x7a,0x53, +0xe8,0x00,0x35,0x5a,0x19,0x76,0xed,0xfe,0x22,0xdb,0x2f,0x18,0xb4,0x0e,0x72,0xcf, +0xe3,0xce,0xdb,0x6f,0x77,0xfe,0x3b,0x63,0xad,0x79,0x4b,0x9c,0xb8,0xf5,0x0b,0x45, +0xbd,0x80,0xed,0xa2,0x9b,0xed,0xc0,0x99,0xc9,0x26,0xa1,0xf0,0xb7,0x2c,0xcc,0x12, +0x00,0x1d,0x0d,0xb9,0x40,0x4d,0x54,0xfc,0x7b,0xdd,0x47,0x89,0x8a,0x0c,0xd6,0xd4, +0x67,0xd0,0x13,0xaf,0xce,0x6c,0x85,0xf5,0xaf,0x09,0x17,0x74,0xf6,0xb7,0x7c,0x11, +0x43,0x82,0x71,0x14,0x15,0x6d,0x2d,0xff,0x05,0x8d,0x08,0xf8,0x21,0xaf,0xc1,0x13, +0x59,0xb3,0xfe,0x6d,0x4c,0x12,0x75,0xe7,0x86,0x64,0x0a,0x93,0xc6,0xd1,0xe9,0x2f, +0x6e,0x2b,0x9a,0x62,0xdf,0xf7,0x76,0x0f,0x6e,0xd0,0x6e,0x99,0x1f,0x57,0xac,0x2b, +0x0c,0x38,0xbd,0xa5,0x4b,0x34,0x36,0xf3,0x5a,0xdc,0x3c,0x3f,0x12,0x08,0xba,0xaf, +0xd1,0x73,0x49,0x54,0xb9,0xbc,0xf5,0x0e,0xe6,0x0b,0xed,0xeb,0x0a,0x15,0xe4,0xb3, +0xcb,0xd5,0xef,0x28,0x56,0x14,0x7b,0x77,0x8a,0xe0,0xe3,0x46,0xd4,0x97,0x8a,0xc8, +0xaf,0x4c,0x9e,0x71,0xcd,0xfa,0xa7,0x2e,0x61,0x17,0x0e,0xd3,0x5d,0xb2,0x7f,0x81, +0x17,0x34,0x96,0x61,0xb2,0xcf,0x87,0xe5,0x6b,0x42,0xfa,0xc1,0xda,0xe2,0xf5,0x94, +0xc2,0x0e,0xe8,0x2a,0x4b,0xdf,0x0f,0xcb,0xda,0x26,0x08,0x4f,0xec,0xe1,0x7c,0x6a, +0x0e,0xdb,0x14,0x11,0xbc,0x7b,0xd9,0xfc,0x04,0xd1,0x38,0x59,0xd9,0x06,0x3f,0xca, +0x28,0xd7,0x75,0x30,0x55,0xb4,0x4d,0x08,0x32,0x6c,0x29,0xef,0x5a,0x07,0x56,0x25, +0xcd,0xdd,0x5b,0x7f,0x8b,0xbe,0xc1,0xa0,0x69,0x86,0x46,0x01,0x9e,0x22,0x57,0x49, +0x40,0x88,0xe7,0xdc,0x90,0x96,0x9c,0x24,0xca,0x42,0xf7,0xcb,0xcd,0x9c,0xeb,0x9e, +0xf6,0xbf,0xd8,0xe2,0x4f,0x6e,0xed,0x79,0x3b,0x4e,0x44,0xb8,0x21,0xf5,0x09,0x20, +0x18,0xb0,0x97,0x86,0x15,0x4a,0x4e,0xcf,0x14,0x43,0x83,0xdb,0xa1,0xbf,0xc8,0x55, +0x95,0xdc,0xe8,0x50,0x3e,0xaa,0x5b,0xc1,0xfe,0x21,0x60,0xc7,0x35,0xce,0xbe,0x11, +0x0d,0x60,0xb9,0xd5,0x4f,0x2d,0x68,0xda,0xab,0x3d,0x01,0x57,0xe3,0x8a,0xc9,0x54, +0x0b,0x0b,0x8d,0xf7,0x13,0x6b,0x47,0xde,0xe3,0x40,0x0f,0xdd,0x4d,0x2c,0x9f,0x20, +0xbe,0xf5,0xb6,0xa2,0x02,0x6b,0xe5,0xc0,0x0a,0x47,0x7c,0x26,0xd1,0xb0,0x88,0xa4, +0x82,0xde,0x30,0xbc,0xd5,0xea,0xc6,0x84,0xb2,0x4a,0xbe,0x70,0x38,0xe3,0xf0,0x7d, +0xf9,0xe6,0x98,0xef,0x35,0x36,0x0b,0x01,0xfe,0x04,0x33,0x7a,0x1c,0xcd,0xff,0xac, +0xa2,0x72,0x90,0xfb,0x34,0x3c,0x99,0x04,0x63,0x4a,0x59,0x2a,0x2a,0x9b,0x94,0xa8, +0x10,0x99,0x99,0x7e,0xbb,0x2e,0x6b,0xd3,0xbc,0x97,0x93,0xca,0xa7,0x73,0x40,0xa5, +0x0f,0x61,0x4a,0xf4,0x67,0xd5,0xfa,0x07,0x6d,0x52,0x36,0xa2,0x5a,0xea,0xbc,0x19, +0x86,0x68,0x0b,0x64,0x3b,0x4f,0xa4,0xd6,0x4b,0x44,0xf0,0x5b,0x2f,0x97,0xaa,0x67, +0x36,0x65,0x30,0x42,0x9f,0x20,0xf9,0x4f,0xe8,0x73,0x5b,0x49,0x5b,0x96,0xd5,0x66, +0x7e,0xb7,0x6c,0xaa,0x29,0x59,0xab,0x4f,0xeb,0x33,0x8c,0xf2,0x5a,0x98,0xd5,0x1e, +0x2f,0x96,0x90,0x94,0xbc,0xa0,0x12,0x71,0x9e,0x10,0xe0,0x8f,0x89,0xb1,0x5b,0xb1, +0x14,0x4c,0x99,0x49,0x3d,0x3e,0xff,0xf6,0x7f,0x98,0x34,0x9c,0x00,0x1e,0xfd,0xa0, +0xaa,0x74,0x92,0xda,0x7c,0x84,0xf0,0x26,0x76,0xb3,0x62,0x23,0x06,0x12,0xc4,0xc5, +0xbe,0x9b,0x93,0x6c,0xba,0xfd,0x0c,0x24,0x65,0x1a,0x6c,0xa6,0x64,0x32,0x77,0xb4, +0xae,0x13,0xd5,0x83,0x55,0xb0,0x2b,0x34,0x6b,0x9f,0xa7,0x52,0x61,0xcc,0x01,0x63, +0xf4,0x3b,0xdb,0x67,0xec,0xb7,0xd5,0x15,0x03,0x49,0x0f,0x6e,0xf3,0xd2,0xba,0x90, +0x2c,0x1f,0xf5,0x66,0x85,0x30,0xdd,0x85,0xb5,0xde,0x65,0xa8,0x71,0x1f,0x7c,0xbd, +0x01,0xc6,0x22,0xb6,0xd9,0x92,0xab,0xe0,0x9d,0xab,0x63,0xc0,0xfd,0x76,0xb3,0x62, +0x2e,0xd7,0xf7,0x8a,0xee,0x88,0xa3,0x0f,0x63,0x75,0xb4,0x8b,0x13,0x35,0x25,0xf6, +0x8b,0x1b,0x9b,0x57,0xb6,0xea,0xae,0x1e,0xea,0x56,0x62,0xe4,0x7f,0x7a,0x2d,0xe6, +0x8e,0x1a,0x62,0xcb,0x65,0xc3,0xc6,0xdf,0x96,0xe2,0xa3,0x62,0x12,0xa4,0x6e,0x96, +0xdf,0xec,0x05,0x80,0x0b,0x8a,0x4f,0x3e,0x8f,0x43,0x06,0x0c,0x6c,0xb0,0x5e,0x66, +0x25,0xb2,0x1f,0x03,0xd2,0x68,0x1f,0x5e,0x5a,0x4e,0x3d,0x84,0xd8,0xc6,0xf8,0x78, +0x17,0x29,0x3f,0x72,0x35,0x97,0x61,0x4f,0x6d,0x28,0xc7,0xad,0xf5,0x7c,0xf2,0x89, +0xc2,0x64,0xd2,0x9c,0x00,0x57,0xe7,0xb1,0x4e,0x4b,0x87,0x05,0x92,0xaa,0xbd,0xb7, +0x5f,0xe3,0x21,0x3f,0xe0,0x97,0xcd,0x4b,0x1f,0x9b,0xa8,0x7a,0x11,0xda,0xd1,0x38, +0x67,0x06,0x65,0x83,0x86,0xc1,0x5e,0xf8,0x6b,0xfd,0xe4,0x0f,0xad,0xd2,0x27,0xfe, +0xc3,0x13,0xa4,0xc9,0x6f,0x63,0xcc,0x53,0x9f,0x32,0x57,0x1c,0x38,0xfe,0xaf,0xa7, +0x4c,0x5d,0x6c,0xeb,0x67,0xda,0x5f,0xf9,0xeb,0xbf,0x38,0x0c,0x21,0x6f,0xe0,0x47, +0x82,0x88,0x2d,0x84,0x15,0xc3,0xdc,0xb0,0x08,0xc8,0x70,0xa2,0x24,0xed,0xac,0x20, +0x0b,0xe3,0xa0,0x31,0xf4,0xae,0x20,0xdf,0x45,0x9a,0x54,0xa5,0x39,0x7c,0xe5,0x7c, +0xef,0x8d,0xfb,0x06,0x37,0xa4,0x75,0xdf,0x6c,0x39,0xca,0x00,0x75,0x5d,0x63,0xae, +0x83,0xeb,0x76,0xba,0x93,0x52,0xbb,0x41,0x3e,0x81,0xdf,0x03,0xd4,0x81,0x64,0xbf, +0x06,0x5f,0xbc,0xd0,0xff,0x2e,0x5f,0x18,0x9f,0x54,0x5f,0x78,0xb2,0x10,0x31,0xd4, +0x60,0x9d,0x24,0x49,0xb4,0x20,0xd7,0x56,0x4f,0xc5,0xa6,0x44,0x17,0xa9,0x09,0xc7, +0x8e,0xd8,0xf3,0xb9,0x69,0x0b,0x51,0x2d,0x1b,0x7b,0x47,0x96,0x3e,0xe2,0x09,0x64, +0xa6,0x8a,0x16,0xbf,0x05,0x0a,0x7d,0x72,0xcf,0xe7,0x98,0x64,0xbd,0x73,0x83,0x4d, +0xb1,0xca,0x5b,0x8c,0x1d,0xcd,0xe8,0x35,0x7f,0x0e,0xeb,0x21,0xb5,0x29,0xea,0x5f, +0x93,0x02,0xf4,0x33,0x15,0x22,0xe5,0x5a,0x4b,0xb2,0x42,0x24,0x39,0x5d,0xaf,0x8d, +0x8d,0x9a,0xf9,0x0e,0x3f,0xeb,0xf1,0x0f,0xbb,0x6c,0x4b,0x27,0x35,0x0b,0xab,0xf9, +0x0d,0x4b,0x54,0xec,0xed,0x04,0x3e,0xc7,0x07,0x30,0x2d,0xd7,0x90,0x16,0x9d,0x3a, +0x4b,0x87,0x9a,0xb8,0x0e,0x51,0x8d,0x6b,0x4e,0xcc,0xd4,0xda,0x86,0x47,0x52,0xa4, +0xf2,0x54,0x5d,0x5f,0x92,0xa1,0x7e,0x85,0x47,0xad,0xaa,0xe0,0xa4,0x16,0x74,0xc9, +0x62,0xc7,0x19,0x6b,0x11,0xac,0x73,0x6a,0xc6,0x31,0x56,0x7b,0x59,0xf8,0x94,0xd9, +0x63,0x06,0x83,0x41,0x59,0x5b,0x84,0x84,0xcf,0xcf,0xfb,0xbd,0x5c,0xa9,0xe4,0x73, +0x9b,0x32,0xc2,0xaa,0x37,0xa2,0xcc,0xe4,0x3e,0x7b,0x30,0x57,0x08,0xf0,0x55,0x69, +0x4e,0xee,0x76,0x75,0xb8,0x4c,0xc4,0x96,0xb0,0x6c,0x2f,0xb6,0x1e,0x00,0x7b,0x6c, +0xf4,0x91,0x0a,0xec,0x69,0xf0,0x69,0x35,0xd7,0xe0,0xe5,0x93,0xb0,0x59,0xec,0x89, +0x52,0x27,0xcb,0xae,0x40,0x15,0x96,0xcc,0xa7,0xda,0x7e,0x5b,0x19,0x88,0x3b,0x38, +0x02,0xa8,0x9a,0xf5,0x5d,0x31,0x74,0xe2,0x66,0x76,0x8a,0x7c,0xa3,0x69,0x93,0x2c, +0xdf,0xcd,0xe4,0xcc,0xff,0x9d,0x7c,0xf2,0x67,0x44,0x5f,0xc0,0xab,0x10,0xda,0x88, +0xc5,0x69,0x65,0x81,0x24,0x12,0x75,0xe3,0xe6,0x75,0x5e,0xb8,0x0f,0x0a,0x57,0x29, +0x4c,0x94,0xca,0x26,0x2b,0xd7,0x7d,0xf3,0xef,0xce,0xa3,0xc4,0xf3,0x5c,0xd9,0x7b, +0x93,0xab,0xb5,0x4e,0x78,0x6c,0x76,0xba,0x4f,0xb0,0xae,0xbd,0x08,0x5b,0xd3,0x8a, +0x46,0xe6,0x3b,0x97,0xbd,0xf4,0x46,0x38,0x6c,0xbc,0xa6,0x42,0xe3,0xbb,0x77,0x75, +0xa0,0x31,0xb4,0x90,0xc4,0x8e,0x57,0xeb,0xc2,0x57,0x91,0x92,0x9a,0x01,0xef,0x6a, +0x12,0x39,0x91,0xb2,0x4e,0x16,0x47,0x46,0xb9,0xdf,0x20,0x47,0x8a,0x1e,0x5d,0x8d, +0xe4,0xc4,0x0e,0x44,0x1c,0x6a,0xde,0x7b,0xeb,0xae,0xc4,0xea,0xfb,0xea,0x7d,0x5e, +0x42,0x56,0x86,0x58,0xc3,0xfc,0xd6,0x72,0xea,0x6f,0xa0,0xf1,0x7b,0xb3,0x2f,0x6b, +0xcd,0xa5,0x98,0x32,0xbe,0xb0,0xdf,0x67,0x6b,0xec,0x56,0xf5,0x62,0x4a,0x57,0xb2, +0x8c,0xfe,0x03,0x5f,0x43,0x9f,0xbf,0x4e,0x34,0xc4,0x9e,0x5f,0x29,0x40,0xdf,0x00, +0x83,0x0e,0xca,0x66,0x4d,0x26,0x18,0x34,0xbd,0x2e,0x3b,0x7b,0xed,0x9c,0x76,0xa0, +0xba,0x8a,0x27,0xff,0xf8,0xa9,0x78,0x74,0x7c,0x4c,0xa7,0x6b,0xac,0x0f,0xe1,0x3e, +0xa4,0x8f,0x2e,0xeb,0x33,0x24,0x73,0xcb,0xc1,0x82,0x51,0x38,0xa2,0x9e,0x18,0x38, +0x32,0x4e,0xf1,0x97,0x4c,0x3c,0x8e,0xd3,0xe5,0x0f,0xff,0xf5,0xd0,0x03,0x78,0xbf, +0x61,0xb0,0x72,0x5b,0xfe,0x8f,0xf3,0x56,0x9e,0xa1,0xb1,0xc4,0x84,0xdb,0x70,0xab, +0x05,0xbe,0x48,0x12,0x81,0x71,0xd8,0x36,0xd1,0xe1,0xaa,0x7c,0xb7,0xc2,0xd2,0xc5, +0xef,0xcd,0xf7,0x41,0xf9,0xa3,0x2f,0x52,0xa9,0xc3,0xf8,0x0a,0x43,0xa3,0xd5,0x2e, +0x68,0x08,0xea,0x5a,0x4b,0x8c,0x0b,0x6b,0x0b,0xe4,0xe8,0xc8,0x37,0xf2,0xfd,0xfa, +0x29,0x18,0xbc,0x5d,0xbb,0x68,0x7c,0x42,0x6a,0xa5,0x35,0xec,0x7c,0x95,0x1c,0xa8, +0xe2,0x8a,0x18,0xe4,0xf5,0x92,0xb6,0xb7,0xf6,0xc4,0x1a,0x23,0x04,0x28,0xc3,0xc0, +0xed,0xf7,0xd8,0xa3,0x79,0x85,0x94,0x8f,0x03,0xc7,0x3f,0xbe,0x85,0x60,0x51,0x20, +0xb1,0x14,0x93,0xf0,0x9d,0xd0,0xfa,0xd7,0x28,0x7d,0xfb,0x79,0x5d,0xe6,0x70,0xb3, +0xfa,0x03,0x67,0x48,0x9d,0x3a,0x75,0x99,0xd6,0x2c,0xd3,0x5a,0xa2,0x97,0x5d,0xa7, +0xe2,0x02,0xca,0x9e,0x98,0x6b,0x25,0x85,0x4b,0x43,0x6d,0x58,0xd4,0x6f,0xfe,0xba, +0x29,0x8b,0x93,0xd3,0x61,0xd5,0xbb,0xe3,0xe8,0x98,0xd3,0xaf,0x59,0x28,0x18,0xa7, +0xaf,0x82,0x7c,0x79,0x19,0x2b,0x33,0xff,0x37,0x0e,0x6c,0x7c,0x56,0x63,0x5c,0x81, +0xd5,0x1b,0xe4,0xc5,0xbc,0x3d,0x54,0xfb,0x42,0xfe,0xae,0x18,0x9b,0x14,0xd3,0x91, +0x05,0xad,0x57,0x96,0x4e,0xd9,0xe3,0xc2,0xb7,0x8e,0xc6,0x18,0x05,0xde,0x81,0x7c, +0xa0,0x53,0x8f,0x84,0x13,0x73,0x12,0xd3,0x6d,0xa4,0xaf,0x22,0x03,0x33,0xb2,0xca, +0x58,0x99,0xd6,0xa2,0xca,0x3a,0x27,0x2a,0x1a,0xde,0x3d,0xc7,0x93,0xa7,0x51,0x44, +0x62,0x8b,0x60,0xa6,0x47,0x3d,0xb8,0x08,0xac,0x19,0x8a,0xd6,0x76,0x38,0xf3,0x97, +0xf9,0x1d,0x94,0xb6,0x44,0x31,0x54,0xe8,0x9b,0xb4,0xfb,0x05,0xef,0x35,0x7a,0xa1, +0xaa,0xa4,0x45,0x82,0x96,0xcb,0xb2,0x69,0x47,0x80,0xb4,0xeb,0x22,0x02,0xc8,0xae, +0x2c,0x81,0x12,0x75,0xc8,0xb7,0xea,0xc5,0xe5,0x0e,0x35,0x7f,0xd1,0xa1,0x82,0x79, +0x8b,0x1a,0x5b,0xeb,0x3e,0x03,0x75,0x52,0x4c,0x5e,0xe8,0xab,0xd9,0x39,0x2e,0xfa, +0x9e,0x7c,0x1e,0xd3,0xc4,0x45,0x66,0x3a,0xb4,0xd6,0x3e,0x4f,0xf5,0xe4,0x35,0x76, +0x2a,0x52,0x13,0x09,0xa8,0x3a,0xb8,0x4b,0x8b,0x7a,0xe9,0xab,0x19,0xf9,0x37,0x49, +0x74,0x64,0x26,0xe3,0x2c,0x96,0x45,0x63,0x4a,0x5d,0xe7,0x99,0x2c,0xc6,0x0e,0xdc, +0xaa,0x0c,0xbd,0x48,0x51,0xc6,0x66,0xd7,0x0e,0x1e,0xa9,0x11,0x7a,0x72,0xcd,0x66, +0x6b,0xb1,0x62,0xf8,0xb4,0x7c,0x7e,0x32,0x23,0x9c,0xbe,0xb8,0x74,0x70,0xf8,0xb0, +0x8b,0x9e,0x78,0x91,0x9b,0x7e,0x8e,0x96,0xa2,0xbf,0xbf,0x6b,0x06,0x3f,0xe0,0xa7, +0x76,0x5e,0x23,0x5d,0x47,0x1f,0x7f,0xaa,0xcf,0x31,0x95,0x03,0x58,0x79,0x98,0xfd, +0xe7,0x89,0xa0,0xfa,0xb5,0xe2,0x4d,0x50,0xd6,0xdf,0xc8,0xa4,0x72,0xa8,0x97,0x23, +0x67,0x2e,0x77,0x76,0x6e,0xcc,0xc8,0xe1,0x43,0xca,0x30,0xcf,0x36,0xa1,0x20,0x87, +0x9f,0x4b,0xa5,0xc9,0xe3,0x47,0x0a,0x83,0x29,0x20,0xc9,0x00,0x77,0xe4,0x7b,0x1a, +0x3f,0x23,0x69,0xfa,0x30,0x5e,0x17,0xb7,0xc7,0x7f,0xc1,0xb5,0xf3,0x6b,0x9b,0xb2, +0xd6,0x55,0xb2,0x24,0x77,0xf1,0x4a,0x91,0x22,0x69,0x98,0x78,0x90,0x10,0x17,0x32, +0x7f,0xe9,0x37,0x5e,0x49,0x2e,0xea,0x35,0x99,0xcf,0xa6,0xe4,0x53,0x4a,0xa1,0x37, +0x0d,0x8b,0xf9,0x43,0x1b,0xe7,0xf8,0xf3,0x39,0x6b,0x17,0x15,0x3d,0x40,0x0b,0x43, +0x84,0x07,0xb8,0x6a,0x7c,0xe3,0x2d,0x00,0xa3,0x47,0x1a,0x84,0x09,0x4c,0xcb,0x79, +0x6e,0x81,0xba,0x9a,0x1a,0x13,0x08,0x6d,0xd2,0xb7,0x22,0xde,0x2f,0x99,0x29,0xe5, +0xec,0xea,0xc8,0x1a,0x1e,0x29,0x5f,0xd1,0xac,0xdf,0x19,0xcd,0xd1,0xa8,0x63,0x78, +0x90,0x2b,0x9a,0x7c,0xf8,0xc6,0x09,0xa5,0x7b,0x47,0xcd,0x29,0x3d,0x69,0xd0,0x68, +0xef,0x72,0xad,0x2b,0x1d,0x95,0x42,0x39,0xc1,0x89,0x04,0x06,0x36,0xaf,0x39,0x4a, +0x8e,0x0c,0xd8,0xfe,0x9e,0x03,0x0c,0x5f,0xa7,0x2d,0x95,0x66,0xb5,0x7a,0x51,0xdf, +0x01,0xef,0xba,0x63,0xf4,0xe9,0x6e,0x41,0x23,0x38,0xc5,0x21,0x8b,0x28,0x5c,0x7b, +0x7d,0x11,0x47,0x2d,0x69,0x25,0xdf,0xf8,0xdb,0xc4,0x58,0x15,0x0b,0x12,0x21,0xc6, +0x74,0x8c,0xd1,0xef,0x1f,0x00,0xe9,0xff,0xe4,0x11,0x5c,0x48,0x34,0x4a,0x9d,0xd3, +0x87,0x4f,0xee,0x7d,0x47,0xb0,0x9b,0x54,0x8d,0x18,0x1f,0xfc,0x89,0x6c,0xa4,0x90, +0xd0,0x9e,0x40,0x05,0x32,0xb9,0x44,0x30,0xb8,0xae,0x22,0x42,0xd4,0x0e,0x98,0xde, +0x5b,0x94,0x65,0x9a,0xc6,0x4f,0x4d,0x84,0x0d,0x3a,0xef,0xa0,0x84,0xb0,0x99,0xec, +0x06,0x2e,0xaf,0x88,0xb2,0xb7,0x82,0x51,0x41,0x32,0xe7,0xb0,0x81,0xb1,0x88,0x42, +0xda,0xb4,0x48,0x84,0xb5,0x60,0x34,0xdd,0x6e,0xb8,0x7c,0x86,0x97,0xfb,0x8e,0xcd, +0xe9,0x18,0x92,0x45,0x5c,0x33,0xdb,0x65,0x86,0x7a,0x35,0x14,0xf5,0xbd,0xc9,0x81, +0x25,0x42,0x07,0xd8,0x78,0x3b,0x5d,0x21,0x32,0x10,0x41,0x05,0x74,0xbe,0x13,0x40, +0xcc,0x11,0x6d,0x24,0x53,0x18,0x1b,0x02,0x25,0x97,0x37,0x15,0x75,0xbf,0xe2,0x0f, +0x6f,0x6b,0xa7,0xf1,0xb1,0x1e,0x0c,0x0f,0xad,0xbb,0x28,0x5a,0xdd,0x47,0x4e,0x98, +0xe5,0x94,0xe2,0xed,0x7e,0x06,0xc1,0x9c,0x5d,0x54,0x01,0xf1,0x1e,0x4d,0x47,0xcf, +0x91,0x95,0xeb,0x4f,0xb8,0x4e,0xe3,0x7b,0x6d,0x62,0x77,0x56,0xd1,0x86,0xd0,0xdc, +0x6f,0xab,0xf4,0x9f,0x68,0xe6,0xeb,0x45,0x2c,0xb8,0xac,0x3b,0x90,0x30,0xe6,0xd0, +0xf8,0x28,0x50,0x3f,0xd6,0xac,0x08,0x74,0x85,0x2a,0xd6,0x8c,0x3d,0x07,0x10,0x40, +0xfa,0xc0,0xcd,0xc4,0xe7,0x09,0x1d,0xa4,0x9e,0x01,0x05,0x1c,0xfd,0xf5,0x80,0x3a, +0x74,0x8e,0x99,0xfd,0x3b,0xa8,0x29,0x70,0xfe,0x71,0x8f,0xc8,0x5f,0x74,0xc4,0x84, +0x12,0x63,0xb1,0xd0,0xad,0xf1,0xd0,0x80,0x32,0x0b,0x3b,0x9d,0xbc,0x08,0x78,0x62, +0x43,0xfe,0xfe,0x03,0xf1,0x46,0x09,0xa4,0x17,0xaa,0xce,0x2b,0x42,0x2e,0x70,0x72, +0x42,0xbe,0x77,0x66,0xea,0x9c,0x40,0x35,0xe4,0x45,0x2f,0x8b,0xa5,0xb6,0x79,0x63, +0xc3,0x7d,0x7a,0xf5,0x98,0x44,0x81,0x5a,0xf3,0x62,0xf0,0x85,0x06,0xdd,0x71,0x93, +0x88,0x67,0x25,0x86,0xb0,0x29,0x18,0x57,0x36,0x2f,0xae,0x8e,0x21,0xf4,0x08,0x68, +0x61,0x72,0x07,0xac,0x48,0x69,0x94,0xe5,0x4c,0xce,0xd0,0x94,0x3b,0x95,0x37,0xa0, +0x9d,0xf4,0x17,0x0f,0xee,0x99,0x4f,0xf4,0x2e,0xd9,0x23,0x6b,0xd7,0xca,0xd2,0xc5, +0x84,0x9f,0x54,0xba,0x94,0xcd,0x55,0x9e,0xa1,0xa4,0x2e,0x1b,0xb0,0x01,0x89,0xd5, +0xf2,0x6b,0xf6,0xab,0x26,0x88,0xe6,0x93,0xe7,0x29,0x7d,0x17,0x5e,0x05,0x3a,0xd8, +0xf5,0x07,0x44,0x88,0x33,0xbf,0x4b,0x22,0xad,0x9e,0xfa,0xee,0xde,0x9d,0xea,0x6e, +0xf2,0xf2,0xd6,0xce,0x1f,0x02,0x28,0xc6,0xb4,0x98,0xba,0xd6,0xa4,0xe0,0x93,0x4f, +0xa8,0x11,0xd9,0x4f,0xe0,0x68,0x51,0x3a,0xe9,0x45,0x03,0xea,0x21,0xe3,0x0f,0x9d, +0xf8,0x56,0xf8,0x6e,0xb8,0x9a,0xe0,0x16,0x96,0x1e,0xbb,0xb7,0xd8,0xcb,0x25,0x88, +0x48,0x87,0x62,0xbd,0x96,0x2c,0x12,0x57,0x42,0x20,0xad,0x4b,0xfb,0xdd,0xec,0xa3, +0x68,0x7f,0xad,0x1c,0x53,0x80,0x5a,0x63,0x85,0xe6,0x7d,0x7a,0x8f,0x09,0x86,0x75, +0x8c,0x4c,0xfd,0x4b,0x65,0x40,0x7b,0xab,0xa1,0x88,0xac,0x1f,0xf4,0xf1,0xdc,0xdd, +0x8d,0xeb,0x6b,0xa3,0x62,0xd0,0x3d,0x74,0x2a,0xe0,0x6f,0x5a,0x7a,0x03,0x23,0x76, +0xa5,0x60,0xb0,0x77,0x1a,0xbb,0xd4,0xd5,0x0b,0x5d,0xa6,0x56,0x30,0xef,0xa4,0x94, +0xa6,0x71,0xd6,0x07,0x47,0xc4,0x80,0xc2,0x96,0x8c,0xcc,0x31,0x33,0xc4,0xad,0x00, +0x25,0x02,0x9d,0xb8,0x5b,0x76,0x6b,0x89,0xe6,0x8b,0x3a,0xdf,0x2d,0x33,0x9d,0x31, +0x9d,0x90,0x2d,0x6b,0xda,0x3b,0xb1,0x22,0xd1,0x59,0x01,0xc7,0x0e,0x31,0xe8,0x5f, +0x21,0x24,0x7b,0x9a,0xb1,0x39,0xb8,0x60,0x9e,0x74,0x14,0x14,0x55,0xc5,0xf5,0xc1, +0x17,0x11,0xc4,0xd1,0x4c,0x15,0x76,0x20,0xc0,0xdd,0xa7,0xb3,0xad,0x7f,0x9a,0x2f, +0xa4,0xe4,0x3a,0xbb,0x3d,0xc0,0xf9,0xa3,0x61,0xeb,0x15,0x84,0x7b,0x7b,0x76,0x53, +0x49,0x50,0x5d,0x28,0xb3,0x76,0x5c,0x02,0x29,0xfc,0x5f,0xaa,0x02,0x8b,0x5f,0xa3, +0x8d,0x13,0x86,0x9f,0x7b,0x10,0x02,0x58,0x49,0x89,0xcc,0xbf,0x5a,0xa8,0x0c,0xeb, +0x34,0x10,0xb9,0x38,0xc9,0x1a,0x61,0xc5,0x48,0x3b,0x9a,0x47,0x06,0xbb,0xc0,0xfa, +0xfd,0x11,0x32,0x2d,0x0c,0xcb,0xd7,0xdc,0x8f,0x57,0x81,0xde,0xd5,0xf3,0x0d,0xeb, +0x9a,0x03,0x0f,0xe0,0xdf,0x55,0x45,0x50,0x91,0x19,0x1f,0x4d,0x31,0xd6,0x7e,0x7a, +0x28,0xdc,0xa6,0x6c,0x64,0x31,0x31,0xe0,0xbe,0x99,0x7d,0x97,0xaf,0xcc,0x16,0xdd, +0x2d,0xa6,0x9e,0x45,0x58,0x1d,0xfe,0x09,0x8b,0xdd,0x71,0xd8,0x92,0x87,0x27,0xca, +0xb7,0x13,0xcd,0xc9,0x19,0x38,0xf0,0xde,0x81,0xfb,0xf7,0x37,0x27,0xa3,0x5e,0xfd, +0x76,0x62,0xb7,0x5f,0x99,0xcd,0xf7,0x73,0x7f,0xcb,0x73,0x6e,0xda,0x75,0x79,0x8a, +0xa1,0x2b,0xb2,0x44,0x12,0x8b,0x28,0x4c,0x65,0x22,0x0f,0xbd,0xa3,0xe4,0x9b,0xf0, +0x03,0xda,0x38,0x08,0x69,0x55,0x42,0x52,0x47,0x3d,0x43,0x48,0x76,0x61,0x59,0xbe, +0x64,0x7d,0xcb,0x1e,0x14,0xcf,0xf1,0xc2,0x55,0x5d,0xb3,0x60,0x2d,0x14,0x43,0x91, +0x84,0x64,0xf9,0x64,0xd6,0x17,0x02,0x6c,0xc3,0xe8,0xe2,0x3b,0x55,0x61,0x8c,0xd9, +0x05,0xe4,0x70,0x59,0x74,0x2f,0x12,0x7c,0xa2,0x30,0x34,0x9a,0x56,0x55,0x48,0x95, +0x78,0x85,0x4e,0xad,0xeb,0xb5,0x26,0x40,0x4f,0x89,0x3c,0x09,0x59,0x1a,0xbe,0x42, +0xa2,0x56,0x24,0x7a,0x90,0xe4,0xc7,0x92,0x2e,0xa6,0x0e,0x19,0xa4,0x8a,0xf9,0xd1, +0x8e,0x5a,0x29,0xae,0xba,0x5a,0x18,0x7d,0x17,0xb3,0x69,0x8a,0x28,0x6a,0x78,0x0b, +0xaf,0xca,0xda,0x3c,0x74,0xa5,0x46,0x48,0xb7,0x8a,0x09,0x5e,0x54,0xe1,0xe5,0xf2, +0x05,0xc6,0x51,0x61,0x7d,0xa0,0xbf,0x38,0xa8,0x88,0xe1,0x2a,0xdd,0xf9,0xff,0xc1, +0x6d,0x25,0x5c,0x7c,0x3f,0xc9,0x6c,0xd6,0xda,0x1a,0x37,0x91,0x90,0x6a,0x72,0x99, +0x6a,0x90,0xd5,0xbb,0x68,0x28,0x9c,0x0e,0xae,0x92,0x00,0xce,0x7e,0xbb,0x5a,0x1a, +0x06,0xce,0xca,0x2c,0x7d,0xda,0x55,0x9b,0xd2,0xde,0x09,0x95,0x6d,0xca,0xfb,0xd8, +0xe5,0xca,0xf1,0xa1,0xe7,0x9d,0x05,0x87,0x4f,0xc3,0x99,0xbe,0x41,0xf6,0x69,0x6f, +0x6f,0x21,0xf5,0xff,0x98,0xec,0x9b,0xe1,0xec,0x18,0x49,0x95,0x27,0x82,0x53,0xa4, +0x66,0xde,0x2b,0xa6,0xb2,0x73,0x13,0xfd,0x33,0x8e,0xd8,0x09,0xa6,0xe6,0xdc,0x6a, +0x61,0xdd,0xe4,0xb9,0x3c,0xdc,0xaa,0x56,0x07,0x2f,0x7b,0xe1,0xbe,0x59,0x75,0xda, +0x80,0xfd,0x0b,0x01,0x5e,0x17,0xaa,0x36,0x08,0x1a,0x7c,0x5f,0xb3,0xf2,0x0f,0x53, +0xf8,0x6d,0x8d,0x45,0x60,0x74,0x4d,0x53,0xd1,0x73,0xfd,0xb6,0x15,0x0d,0xca,0x53, +0xed,0xde,0x2d,0x66,0x77,0xf3,0x05,0x23,0x46,0x03,0x3e,0xaf,0x1c,0x09,0xcb,0x99, +0x93,0x28,0xdc,0x96,0x3e,0xbb,0xd1,0xf9,0x0d,0xa0,0xb7,0x62,0x49,0x95,0x32,0xb0, +0xe6,0xf7,0x94,0x54,0x32,0x7f,0x9f,0x09,0x18,0xd5,0xbc,0xe7,0xf7,0xe5,0x3f,0xc4, +0xa0,0x7f,0x85,0x67,0xe0,0x3b,0x36,0x25,0x74,0xd5,0xa5,0xea,0xbe,0xf5,0xa9,0x56, +0xe4,0xb7,0xb7,0xd2,0x14,0x3a,0x15,0x31,0x61,0x22,0xad,0x77,0xbf,0xb5,0x30,0x52, +0x8b,0xd9,0x9c,0x7d,0xd8,0x17,0x16,0x61,0x48,0x9a,0x1a,0x3d,0x19,0xf2,0xee,0xea, +0xd9,0xdb,0xd0,0xac,0xb8,0xaf,0x06,0x8a,0xbc,0x76,0xe3,0x28,0x59,0x74,0x1d,0x63, +0x14,0xd5,0x11,0x7e,0x54,0xea,0xea,0x1d,0x11,0x7b,0xb1,0x52,0xba,0xb8,0x30,0x88, +0xab,0x33,0x8c,0x85,0x65,0x0f,0x9f,0xc9,0x8f,0x02,0x44,0xc1,0x70,0x0d,0x9d,0x3a, +0x76,0x2d,0x19,0x4a,0x45,0x19,0xe6,0xa5,0x93,0xa0,0xa9,0xa4,0xfe,0x9c,0x16,0x2a, +0xf7,0xdf,0xd7,0xac,0x9c,0xd8,0xc1,0xb4,0xda,0x26,0xa0,0xb4,0x79,0x46,0xa7,0xbe, +0x6f,0x43,0x38,0x9f,0x3c,0x0a,0xb7,0x1e,0x91,0x82,0x37,0x16,0x04,0xbc,0xf1,0x2a, +0x0e,0x13,0x00,0x25,0x9b,0x64,0x7f,0x05,0xcd,0x0f,0x7e,0xee,0xa0,0xbe,0x3a,0xf3, +0x64,0xad,0x13,0xee,0xb5,0xdf,0x5e,0xf1,0x64,0xed,0xa7,0xa0,0x36,0x4f,0x40,0x95, +0x62,0xb6,0x60,0x35,0x4f,0xdc,0x50,0xad,0xa8,0x11,0xdc,0x52,0x51,0x61,0x93,0x46, +0x4a,0xda,0xcb,0x18,0xb1,0xa0,0x12,0xe6,0x02,0x62,0x51,0x90,0x31,0x20,0x1f,0x25, +0x87,0xb9,0xc3,0x08,0xb0,0xa3,0x5b,0xca,0x20,0xbc,0x99,0x35,0x30,0x78,0x48,0x22, +0x26,0xdf,0xd6,0x7d,0x14,0xcd,0x69,0x44,0x29,0x4b,0x53,0xe0,0x69,0x6f,0xda,0xa1, +0x7d,0x14,0x58,0xd0,0x7d,0x03,0x26,0x76,0xaa,0x4a,0xd9,0x37,0x4f,0x49,0x75,0xbc, +0xa3,0x7d,0x1b,0x36,0xaf,0x29,0xd1,0x53,0xa2,0x4f,0x39,0xf4,0xf6,0x4a,0x7e,0x85, +0x73,0xad,0x97,0x7d,0x59,0x8c,0x0b,0x46,0x28,0x23,0x5f,0x36,0xdf,0x47,0x30,0x6a, +0x29,0xa8,0x84,0x41,0x98,0x38,0xd2,0x91,0x03,0x4e,0x64,0xca,0x6b,0xc4,0xb5,0x09, +0x6d,0x0d,0x14,0x07,0xf8,0x26,0xae,0x47,0xea,0x27,0x31,0x4f,0x06,0xb8,0xb4,0x3d, +0x8e,0x51,0xd9,0xff,0xec,0x68,0xe5,0xab,0x3d,0x45,0x6b,0x09,0x0d,0x97,0xb1,0xf1, +0x11,0xc0,0x34,0xfb,0xcd,0xfc,0x79,0xa9,0x3c,0xcd,0x60,0x4e,0x86,0x62,0x82,0xad, +0x59,0x17,0xd7,0x2c,0x61,0x25,0xc2,0x0a,0xb9,0x29,0x53,0x6c,0x53,0x8b,0x4b,0x2b, +0x67,0x42,0xc2,0x4f,0x5c,0x05,0x61,0x08,0xcb,0xcb,0x99,0x79,0x52,0x8a,0x23,0x3a, +0xee,0x41,0x98,0x6e,0x52,0x84,0x6b,0xae,0x08,0x5e,0x94,0x68,0xd3,0x89,0x12,0x42, +0x62,0x1e,0x7c,0x74,0x6f,0x3e,0x7b,0x5d,0x4a,0x42,0x87,0x7d,0xdb,0x2d,0x64,0xc4, +0x2f,0x1d,0xbe,0x35,0x1a,0x9f,0x4e,0x35,0x1c,0x12,0x69,0xd6,0x5e,0x2f,0x46,0x6b, +0x82,0x50,0x34,0xb0,0xd0,0x8e,0x46,0x89,0x1d,0xfe,0x86,0xb6,0xc2,0xfa,0x4f,0x7f, +0x03,0x1f,0x21,0xfa,0x13,0x36,0x8b,0xfb,0x41,0x8d,0x2a,0xe2,0x6e,0x2f,0x6d,0xd1, +0x8f,0x1c,0xd7,0xe1,0xc9,0x71,0xbd,0xc3,0x83,0xf4,0xbd,0x3f,0xf0,0x13,0xe7,0x33, +0xae,0x19,0xbc,0x46,0x33,0x63,0xa4,0x82,0x23,0x74,0xd5,0x24,0x36,0xd9,0xde,0x20, +0x16,0xb4,0xf4,0x04,0x6f,0x3a,0x56,0xd2,0xc0,0x53,0x4c,0x09,0x3b,0x34,0xba,0xe5, +0x43,0xb9,0xfd,0x15,0x45,0x39,0x2d,0x83,0xa1,0xa6,0xcd,0xd5,0x09,0x89,0xdf,0x55, +0xce,0xdc,0xad,0x95,0x01,0xea,0x55,0x53,0x16,0x58,0x31,0x8a,0x29,0xaa,0x66,0xc9, +0xac,0x15,0x9a,0xd7,0x99,0x93,0x68,0xaf,0x9d,0x57,0x21,0xcc,0x5c,0x85,0x6e,0x38, +0x77,0x14,0xf6,0x74,0x35,0xe5,0x66,0xfa,0xe5,0x55,0x21,0x27,0x86,0x38,0x4d,0x72, +0x0b,0x5b,0xff,0x98,0x58,0xef,0x87,0xeb,0x49,0x56,0x3b,0x36,0xf9,0xfa,0x45,0x67, +0x0a,0x1d,0x23,0x18,0x6c,0x59,0xbf,0xfb,0x6a,0xf0,0x40,0xbd,0xdd,0xf6,0x7e,0x0f, +0xe8,0x3c,0xbe,0xeb,0xc7,0x33,0xe2,0x97,0xc9,0x1d,0xb5,0xac,0x36,0x81,0x8e,0x28, +0xd9,0xbd,0xee,0x3a,0x2b,0xb0,0x26,0x7a,0x6a,0x9a,0x25,0xd8,0xf6,0xc0,0x4f,0xd8, +0x56,0xdf,0x57,0x25,0x38,0xb5,0x37,0xa9,0x04,0xd3,0xb0,0x12,0x0f,0xe8,0xdd,0xaa, +0xcf,0x73,0x37,0x35,0x63,0xb4,0x67,0x29,0x1c,0x50,0x38,0x02,0x0a,0xa9,0xdf,0x71, +0x51,0x89,0xa6,0xdc,0x30,0x74,0x30,0xe2,0x48,0x3b,0xf4,0xd6,0x6e,0x31,0xec,0xc2, +0x7b,0x4e,0x7c,0x0d,0x77,0xdc,0xa8,0xcf,0x45,0x80,0x1b,0xc5,0xd9,0xec,0xa7,0x70, +0xb1,0xe0,0xf5,0x18,0xb2,0x36,0x35,0x07,0xbb,0xc2,0xcf,0x21,0x35,0x61,0xb9,0x71, +0xc6,0x5c,0xb1,0x9a,0x8b,0x0e,0x63,0x2a,0xb9,0x81,0x46,0x45,0x2e,0xa1,0x98,0x4a, +0xef,0xb5,0x60,0x3b,0x70,0xa2,0x58,0x80,0xc7,0xa0,0x6e,0x83,0xeb,0xeb,0x32,0x3b, +0x73,0xc7,0xed,0xa6,0x93,0xaa,0x26,0xb0,0x45,0x87,0x22,0x86,0x5f,0xea,0x99,0x67, +0xf1,0xa6,0xb1,0xcf,0xb4,0xb6,0x59,0x65,0x47,0xc8,0xe3,0x0b,0xd0,0x0f,0x75,0x98, +0x26,0x38,0x5d,0xa7,0x96,0xa8,0xb0,0x4c,0x44,0xc9,0x46,0xf3,0xba,0xe2,0x5a,0x68, +0x4d,0xc8,0xf0,0x23,0xf7,0xec,0xac,0x78,0xed,0x17,0xed,0xd3,0x5a,0xc3,0x55,0xf8, +0xac,0x01,0x0e,0x7c,0xe2,0x04,0x9a,0x48,0x2f,0x6e,0x3a,0xc7,0x22,0x44,0x5b,0x2f, +0x2d,0x00,0x99,0xbe,0xb2,0x05,0x69,0x03,0xb0,0x65,0x9a,0xd0,0xa7,0xaa,0x2f,0xf9, +0xa9,0x84,0x7b,0x32,0x76,0xef,0x45,0x3c,0x38,0xc4,0xa3,0xd0,0x24,0x9a,0xdd,0x0d, +0xd4,0x84,0xc2,0x5b,0x7d,0x88,0x1a,0x6c,0xcd,0xa8,0xc9,0x8c,0xf2,0x51,0xd5,0xaa, +0xe3,0x5c,0x92,0xf8,0x0f,0xec,0xaa,0xf8,0x4e,0xaa,0x16,0xec,0x5b,0xe5,0x61,0x57, +0x78,0x4e,0x9b,0x68,0xfd,0xa2,0x1b,0x89,0x4d,0xc3,0x8b,0x4b,0x37,0xe7,0x15,0x5d, +0x6e,0x0c,0x8b,0x1f,0x21,0x22,0x41,0x99,0x4d,0xc7,0xf8,0x0c,0xfe,0x69,0xac,0x56, +0xc5,0x9f,0xcd,0x6d,0xcb,0x3b,0x5c,0x2a,0x62,0x6b,0xca,0x92,0x17,0xa9,0x66,0x69, +0x86,0x97,0x83,0xe9,0x96,0x01,0x06,0x50,0xe7,0xf9,0x66,0xd4,0x8a,0x9f,0x45,0x23, +0xfa,0x9f,0x3f,0xbe,0xb2,0x9b,0x0c,0x21,0xe5,0xb5,0xa3,0x93,0xf2,0x1b,0x7d,0x0a, +0x44,0x9c,0xda,0x01,0x6e,0xf2,0x99,0xd1,0xa4,0xf3,0xdf,0xb6,0xf4,0xc3,0x06,0xd3, +0x27,0x39,0x3b,0x20,0x26,0x3f,0x4c,0x32,0x3a,0x5c,0x0f,0xc2,0x97,0x6b,0x97,0x22, +0x5f,0x44,0xcc,0x30,0x04,0x2e,0x0e,0x8c,0xc4,0xb0,0x5c,0x84,0x01,0x5a,0xf5,0xfc, +0x8f,0x1b,0x1a,0x21,0x57,0xad,0x7d,0x01,0x64,0xde,0xb2,0x98,0x8e,0x59,0xad,0xb2, +0x4d,0x6a,0x15,0xf3,0x84,0x5b,0xc2,0x11,0xc3,0x23,0x59,0x95,0x87,0x68,0x46,0x94, +0x49,0x95,0x7d,0x1d,0x43,0xb1,0x4e,0x68,0xef,0xd6,0x09,0x1c,0x78,0x58,0xee,0x7b, +0xc1,0xdb,0x7c,0x6c,0x0e,0x4e,0x46,0x78,0xcc,0x9a,0xd6,0xaf,0x19,0x54,0x47,0x2b, +0xb2,0x95,0x67,0xcb,0xbb,0xf8,0x97,0x69,0x60,0xd4,0x00,0x9b,0xfa,0x30,0x6b,0xfd, +0xe7,0x31,0x6f,0x2b,0x16,0xa0,0x05,0x45,0x8e,0x1f,0x2d,0xf8,0x3f,0x5b,0x1e,0x3a, +0x09,0x4d,0x5e,0xde,0x99,0xfe,0x61,0x6e,0x2f,0x15,0xc9,0x0e,0xd5,0x00,0x16,0x2a, +0x73,0x6c,0x56,0x19,0xfd,0xfd,0xbe,0x8f,0x08,0x70,0xda,0xb3,0xde,0xf4,0xa7,0xaa, +0x27,0x13,0xb8,0x9b,0x8d,0x52,0x2d,0xec,0x86,0x6f,0xcc,0xb0,0xda,0xf8,0x90,0xc7, +0x59,0xcf,0xe7,0xd7,0xb9,0x7e,0xe6,0x19,0x8c,0x6b,0x7b,0xfb,0x98,0x4e,0x3e,0x1d, +0xe3,0x09,0x78,0x86,0x11,0x57,0x6f,0xa4,0x7b,0x37,0x07,0xdb,0xb1,0xe3,0xc8,0xe9, +0x31,0x40,0x39,0x30,0x93,0x22,0x60,0xb2,0x9c,0x3e,0x3c,0x4f,0xf2,0x20,0x85,0x05, +0xd1,0x37,0xf9,0x15,0x33,0x6c,0x81,0xa3,0x1d,0xcd,0x41,0x3a,0x54,0xcd,0x37,0xd8, +0x0c,0x85,0x0d,0x67,0x32,0x20,0xa6,0xd3,0x43,0xbf,0xdf,0xfc,0x38,0x59,0x9f,0x41, +0x06,0x9d,0x3f,0xbb,0xed,0xdb,0xaf,0x9f,0xbd,0xbb,0x2f,0x9b,0xad,0x9b,0x11,0xc6, +0xe4,0x44,0x37,0xab,0xec,0xda,0xa7,0x8f,0xbc,0xba,0x27,0x8b,0xac,0x9a,0xf8,0x3e, +0xe2,0xe6,0x3e,0xba,0x6d,0xd9,0xae,0x9e,0x3d,0xb9,0x2e,0x9a,0x2d,0x99,0xb6,0xae, +0x7c,0xf8,0x36,0xaa,0x6c,0xd8,0xa6,0x8e,0x3c,0xb8,0x26,0x8a,0x2c,0x98,0xc1,0xc8, +0x50,0xbd,0x7d,0xf7,0x9a,0x2b,0xeb,0x53,0xeb,0x4e,0x52,0xd5,0x36,0x65,0xca,0xe1, +0x67,0xd4,0x1a,0x6e,0x1f,0xb2,0x0c,0x5a,0x21,0x44,0x0a,0xbe,0x58,0x11,0x4e,0x18, +0x93,0xb7,0x07,0xfd,0x90,0x25,0xbc,0xc2,0xec,0xb7,0x68,0x0a,0x79,0x95,0x73,0x3e, +0x74,0x04,0xad,0xed,0x91,0x24,0x09,0xf6,0xcf,0xc3,0xc1,0x38,0x7a,0x6d,0xbd,0xb7, +0xf5,0xf3,0x3d,0xb3,0xe5,0xd3,0xad,0x97,0xb5,0xb3,0x2d,0x93,0xa5,0x93,0xb5,0xa7, +0xf4,0xf2,0x35,0xa3,0xe4,0xd2,0xa5,0x87,0xb4,0xb2,0x25,0x83,0xa4,0x92,0xbc,0xb6, +0x75,0xf1,0x3c,0xb2,0x65,0xd1,0xac,0x96,0x35,0xb1,0x2c,0x92,0x25,0x91,0xb4,0xa6, +0x74,0xf0,0x34,0xa2,0x64,0xd0,0xa4,0x86,0x34,0xb0,0x24,0x82,0x24,0x90,0xc4,0x75, +0x23,0x52,0xfc,0x34,0x92,0x9f,0x44,0x5f,0x9b,0x56,0x54,0x25,0xd5,0xd2,0xb9,0xb4, +0xc0,0xee,0xd3,0xf4,0x8d,0xfb,0x24,0x5b,0x45,0xda,0x5c,0x55,0xa3,0x33,0x5a,0x3a, +0xa6,0x5b,0x21,0xa1,0xc3,0x94,0x1d,0x5e,0x41,0x53,0xdb,0x74,0xbb,0x33,0x57,0x75, +0xdd,0x51,0x3c,0x44,0xce,0x3a,0x19,0x35,0x92,0xf7,0xd9,0xd3,0xc5,0x26,0xbb,0x3f, +0xdd,0xeb,0x3b,0x3b,0xcd,0xcb,0xab,0x1f,0x9d,0xab,0x2b,0x1b,0x8d,0x8b,0xb3,0x2f, +0xdc,0xea,0x33,0x2b,0xcc,0xca,0xa3,0x0f,0x9c,0xaa,0x23,0x0b,0x8c,0x8a,0xba,0x3e, +0x5d,0xe9,0x3a,0x3a,0x4d,0xc9,0xaa,0x1e,0x1d,0xa9,0x2a,0x1a,0x0d,0x89,0xb2,0x2e, +0x5c,0xe8,0x32,0x2a,0x4c,0xc8,0xa2,0x0e,0x1c,0xa8,0x22,0x0a,0x0c,0x88,0x1a,0xcb, +0x89,0xc7,0x5d,0x03,0x3c,0x53,0xab,0x4a,0xea,0xa4,0x27,0x82,0x5c,0x03,0xf9,0x94, +0x82,0x59,0x75,0xef,0x18,0xed,0x9e,0x40,0xdf,0x5f,0xb7,0x40,0xab,0x39,0xab,0x0c, +0x0b,0xea,0x66,0x65,0xb0,0x77,0x6e,0xda,0xa1,0x55,0xce,0xdf,0x03,0x81,0x52,0xd5, +0xde,0x1f,0xf7,0xaf,0x42,0x79,0x97,0x64,0x8a,0x3b,0xc0,0x5c,0xff,0x63,0xb9,0x37, +0xd5,0xe3,0x39,0x33,0xc5,0xc3,0xa9,0x17,0x95,0xa3,0x29,0x13,0x85,0x83,0xb1,0x27, +0xd4,0xe2,0x31,0x23,0xc4,0xc2,0xa1,0x07,0x94,0xa2,0x21,0x03,0x84,0x82,0xb8,0x36, +0x55,0xe1,0x38,0x32,0x45,0xc1,0xa8,0x16,0x15,0xa1,0x28,0x12,0x05,0x81,0xb0,0x26, +0x54,0xe0,0x30,0x22,0x44,0xc0,0xa0,0x06,0x14,0xa0,0x20,0x02,0x04,0x80,0xb0,0x22, +0x1e,0x82,0xc0,0x59,0xa7,0xdd,0x34,0xa6,0x4e,0x85,0xb8,0x6a,0xb5,0xef,0x4a,0x2a, +0x17,0xcc,0xc8,0x57,0xec,0xac,0xcb,0xf5,0x47,0x34,0x65,0x0e,0x2a,0xe1,0xcd,0xeb, +0x74,0xcf,0xd9,0x03,0xe7,0xf5,0x68,0x7e,0xc0,0xe0,0x21,0x7c,0x29,0x5e,0x33,0x11, +0x47,0xa7,0xe3,0xe9,0x36,0xc6,0x3d,0x74,0x44,0xcd,0x62,0x93,0xd1,0x58,0x9f,0xbd, +0xf9,0x7b,0x1f,0xb9,0xe9,0x5b,0x8f,0x9d,0xb9,0x3b,0x0f,0x99,0xa9,0x1b,0x97,0xad, +0xf8,0x7a,0x17,0xa9,0xe8,0x5a,0x87,0x8d,0xb8,0x3a,0x07,0x89,0xa8,0x1a,0x9e,0xbc, +0x79,0x79,0x1e,0xb8,0x69,0x59,0x8e,0x9c,0x39,0x39,0x0e,0x98,0x29,0x19,0x96,0xac, +0x78,0x78,0x16,0xa8,0x68,0x58,0x86,0x8c,0x38,0x38,0x06,0x88,0x28,0x18,0x2a,0x0e, +0x83,0xc9,0x9a,0xde,0xeb,0xea,0x32,0xdb,0x80,0xe8,0xee,0x75,0xa1,0x54,0xbe,0x69, +0x52,0x82,0xd2,0x1a,0xfd,0x28,0x8d,0x1e,0xcf,0xc1,0x61,0x9a,0x59,0x52,0x8f,0x2f, +0x8a,0xf1,0xa9,0x2b,0xb8,0x01,0x33,0xe9,0x4f,0x8c,0x6e,0xaf,0xa3,0x7b,0x28,0xea, +0xd2,0x74,0xb3,0xec,0x19,0x06,0x86,0xcb,0xc5,0xc4,0xe7,0xbb,0xf6,0x7d,0x9d,0xb5, +0xf1,0x73,0x1d,0xb1,0xe1,0x53,0x8d,0x95,0xb1,0x33,0x0d,0x91,0xa1,0x13,0x95,0xa5, +0xf0,0x72,0x15,0xa1,0xe0,0x52,0x85,0x85,0xb0,0x32,0x05,0x81,0xa0,0x12,0x9c,0xb4, +0x71,0x71,0x1c,0xb0,0x61,0x51,0x8c,0x94,0x31,0x31,0x0c,0x90,0x21,0x11,0x94,0xa4, +0x70,0x70,0x14,0xa0,0x60,0x50,0x84,0x84,0x30,0x30,0x04,0x80,0x20,0x10,0xfb,0xd7, +0x5f,0xfd,0xf9,0x29,0x10,0x4d,0x4c,0x26,0x01,0x42,0x4b,0x5b,0x13,0x2b,0x34,0x87, +0xa7,0xb9,0x13,0x0d,0xca,0xf0,0x3e,0x50,0x41,0x93,0xdc,0xf6,0xdb,0xfc,0xe5,0x6e, +0x01,0x6f,0x49,0x1c,0xb5,0x32,0x55,0xe7,0x68,0x59,0x35,0xa3,0xcb,0x61,0x89,0xf1, +0xe4,0xb3,0x01,0xec,0x6b,0x4c,0xe0,0x62,0x9a,0xda,0x42,0xc5,0x56,0x0e,0x9b,0x3d, +0xd9,0x6b,0x1b,0x39,0xc9,0x4b,0x8b,0x1d,0x99,0x2b,0x0b,0x19,0x89,0x0b,0x93,0x2d, +0xd8,0x6a,0x13,0x29,0xc8,0x4a,0x83,0x0d,0x98,0x2a,0x03,0x09,0x88,0x0a,0x9a,0x3c, +0x59,0x69,0x1a,0x38,0x49,0x49,0x8a,0x1c,0x19,0x29,0x0a,0x18,0x09,0x09,0x92,0x2c, +0x58,0x68,0x12,0x28,0x48,0x48,0x82,0x0c,0x18,0x28,0x02,0x08,0x08,0x08,0x5e,0xae, +0x1f,0xb8,0x36,0x91,0xb8,0x6c,0xed,0x89,0x6a,0xe0,0xce,0x8a,0xf9,0xa9,0x0f,0xec, +0xfb,0x1b,0x6b,0xe5,0x9e,0xdc,0xbe,0x56,0x61,0x54,0xe7,0xf7,0xda,0xb8,0x9f,0x75, +0x21,0x81,0x03,0xe0,0x9d,0x7a,0x88,0x2f,0xc1,0x0b,0x1b,0x5f,0xf8,0x0c,0x09,0xfb, +0x0e,0x1e,0x8f,0x68,0x99,0x36,0x41,0x66,0xde,0xfb,0xe6,0x39,0x18,0x44,0x99,0x35, +0xd1,0x63,0x19,0x31,0xc1,0x43,0x89,0x15,0x91,0x23,0x09,0x11,0x81,0x03,0x91,0x25, +0xd0,0x62,0x11,0x21,0xc0,0x42,0x81,0x05,0x90,0x22,0x01,0x01,0x80,0x02,0x98,0x34, +0x51,0x61,0x18,0x30,0x41,0x41,0x88,0x14,0x11,0x21,0x08,0x10,0x01,0x01,0x90,0x24, +0x50,0x60,0x10,0x20,0x40,0x40,0x80,0x04,0x10,0x20,0x00,0x00,0x97,0x4a,0x80,0x05, +0x76,0x8d,0xde,0x85,0xb1,0x8b,0x52,0x92,0x14,0x40,0xce,0xa1,0x58,0xcb,0xac,0x72, +0x40,0x81,0x90,0xe5,0x5b,0x21,0x24,0xb2,0x41,0xa7,0xc6,0xb5,0xd3,0xca,0x7f,0x19, +0x02,0x2a,0x41,0x05,0xfb,0xa0,0x19,0x24,0xc4,0x62,0x90,0x05,0x50,0x48,0x71,0xec, +0xc1,0x41,0xd7,0x1d,0xb1,0x88,0x47,0xd3,0xcd,0xc6,0x59,0x35,0xba,0xe1,0x7e,0x48, +0xc0,0x06,0x3f,0xba,0x14,0xe4,0x46,0xf1,0xa9,0xe6,0xf9,0x23,0x7c,0xe8,0xfb,0xc0, +0x05,0xa5,0x08,0x40,0x82,0xa8,0x1a,0x03,0x5f,0x4c,0xf1,0x73,0x52,0xe5,0x49,0xc5, +0x7e,0xa4,0xd4,0xc1,0xd6,0xbb,0xea,0xd0,0x80,0xe9,0x9b,0x78,0x93,0x67,0x05,0x23, +0xeb,0xa5,0x36,0xd1,0xd7,0xd2,0x2f,0xf3,0xca,0x3a,0xa3,0xa1,0x53,0x47,0x80,0x6a, +0x73,0xda,0x87,0x0c,0x9a,0x20,0x3c,0x2f,0x20,0x47,0x82,0xdd,0x12,0x68,0x7a,0x5e, +0xf5,0x4b,0xea,0x5c,0x0c,0x26,0x1a,0x7b,0x4d,0x49,0x9b,0x1c,0xd9,0xa8,0xdc,0x08, +0x8e,0x8a,0x0e,0xfd,0x90,0x25,0x3d,0x2e,0xe7,0x0a,0xcd,0xa8,0xd0,0xc1,0x89,0x63, +0x0b,0x23,0x0b,0x1c,0x30,0x80,0xf1,0x3d,0xc9,0xe4,0xc5,0xbc,0x5b,0xc0,0xbd,0x3b, +0x48,0x8f,0x02,0x5d,0x8d,0x6e,0x08,0x75,0xe9,0x4a,0x58,0x9a,0x85,0xe1,0x74,0x54, +0x6a,0xed,0xb5,0xa6,0xe4,0xf2,0xda,0x9a,0xea,0xb2,0xd8,0x74,0x59,0x6c,0x03,0xb7, +0x0a,0x5e,0x41,0xf7,0x7b,0x51,0x5f,0x07,0x6b,0xc6,0xf3,0x60,0xd2,0x2e,0x53,0x4c, +0x77,0xad,0x0b,0x4d,0xb1,0xa2,0x11,0x78,0x28,0xc5,0xd3,0x7f,0x59,0x8f,0xbf,0xe2, +0x61,0x50,0x03,0x75,0x3a,0x36,0xba,0x51,0x6a,0x5c,0x95,0x84,0x1b,0x40,0x74,0xe3, +0x71,0x18,0xce,0x1e,0x5a,0x93,0x62,0x20,0x8a,0xf3,0xd8,0x36,0x1a,0x33,0x7d,0xe3, +0xe3,0xcd,0xdb,0x01,0xb0,0x99,0x4b,0x25,0xe0,0xdf,0x95,0xa7,0xb2,0xd9,0x4c,0x6c, +0xc7,0x51,0x8d,0x64,0xa1,0x23,0x43,0xb9,0xc1,0xfc,0x9d,0x44,0xb3,0x7d,0x3a,0xcd, +0xad,0xb9,0x04,0xd0,0xc3,0x2f,0x6c,0xb0,0x66,0x5b,0xee,0x63,0xde,0x2b,0x4d,0x42, +0x23,0x1d,0xb3,0x56,0xb3,0x35,0x26,0x20,0x6b,0x8a,0xe6,0x73,0xdf,0x69,0x40,0x53, +0x22,0xbb,0x3a,0xb7,0x55,0x28,0x6d,0x1e,0xa1,0x76,0xef,0x62,0x5e,0x69,0x09,0x20, +0xb7,0x13,0x12,0xd5,0xc4,0x3d,0xe2,0x21,0x14,0x8f,0xf3,0xf3,0x62,0x2b,0x84,0x62, +0x57,0x10,0xd8,0x85,0x38,0x78,0x13,0x2a,0x69,0x20,0xc8,0x3d,0x78,0xf5,0x70,0x1a, +0x28,0xfe,0xee,0x6d,0x3f,0x39,0x26,0x49,0x6f,0x59,0xde,0x4f,0x61,0x7f,0xdc,0x8d, +0xae,0xba,0x83,0xee,0xd3,0x18,0x37,0x3d,0x83,0x78,0xe9,0x28,0x93,0x6a,0x55,0x98, +0x0a,0xb4,0xd1,0x0d,0x19,0x90,0x41,0x29,0xc9,0xf0,0x97,0xf0,0x9a,0x1b,0x1c,0xca, +0x42,0x2c,0xfc,0x2e,0x96,0xc2,0x2e,0x19,0x3a,0x7c,0xf8,0xeb,0xef,0x73,0x18,0xd0, +0xc0,0x0d,0xfe,0x62,0x50,0x09,0x26,0x8b,0x3b,0x56,0xf7,0xb2,0xb2,0x19,0x39,0xc0, +0xc9,0xe1,0xbc,0x13,0x0d,0x95,0x37,0x29,0x24,0xd3,0x63,0xa7,0x33,0x3a,0x6f,0xcd, +0x63,0x2f,0xcf,0x2c,0x33,0xc0,0x24,0x99,0xbc,0x54,0x76,0x22,0x42,0xa1,0x9d,0xf2, +0x58,0x8f,0xe4,0x84,0x7f,0xe2,0xb0,0x23,0x44,0x80,0x70,0x26,0x3f,0x62,0x22,0x16, +0xa6,0x8c,0xf6,0x87,0x15,0x0a,0x68,0x36,0x4d,0xe9,0xe6,0xb3,0x5d,0x4a,0x41,0x42, +0x31,0x8f,0xa1,0xf6,0xd6,0xa6,0x35,0xbe,0xc0,0xe2,0xb9,0xd6,0x9e,0xe2,0xd6,0xc3, +0x8d,0x0c,0xa8,0x97,0x15,0xa2,0xb9,0x32,0x82,0x83,0xb8,0x17,0x55,0xa1,0xd3,0xd2, +0x00,0x24,0x1d,0xbd,0xe5,0x5b,0x74,0x9c,0xbb,0x4e,0xf2,0x14,0x21,0xc4,0x32,0x4f, +0xa4,0x83,0xd2,0xb9,0xec,0x3a,0xf0,0x4e,0xa6,0xca,0x07,0xa6,0x29,0xe6,0x2d,0xc1, +0x8f,0xfb,0x1a,0xc3,0x9a,0xcb,0x8a,0x3f,0x65,0xc0,0x15,0x07,0x24,0x83,0x65,0x3d, +0x26,0x0f,0x16,0xa9,0x91,0x27,0x19,0x33,0xda,0x4c,0xc7,0x7e,0x94,0x15,0x68,0x0b, +0xfb,0x75,0xfc,0x8f,0x9e,0x03,0x36,0x5a,0x48,0xe8,0xec,0xaf,0xde,0x43,0x4a,0x5b, +0xf0,0x02,0xca,0xef,0x57,0xa9,0xba,0x3b,0x9f,0x89,0xa2,0xcf,0x17,0xe9,0x69,0xf5, +0xd9,0x85,0x63,0x0f,0xf7,0x28,0x6d,0x2f,0xc4,0xde,0x73,0x2f,0xb7,0x68,0xac,0xf9, +0x0f,0xa3,0xf5,0x17,0x8d,0xaf,0x3f,0x99,0xc9,0xeb,0xe5,0xba,0xd5,0x40,0xe2,0xa8, +0xaf,0x73,0x3a,0x3c,0xe1,0x73,0xf6,0x88,0xcc,0xc4,0x09,0x1c,0xd0,0x89,0x6e,0xa4, +0xf2,0x07,0x68,0xde,0x19,0x6d,0x76,0x05,0x2c,0x3d,0xb0,0x3c,0x37,0xe0,0x29,0x4a, +0x6d,0x04,0x23,0x5e,0x95,0xec,0xfa,0x19,0x6d,0xc8,0xeb,0x6e,0x8a,0x12,0x90,0x07, +0x2c,0x02,0x63,0x7b,0x1a,0x5a,0x03,0xf9,0xc6,0x12,0xe3,0x55,0xde,0xf8,0x55,0x44, +0xd4,0xde,0xe2,0x86,0xb4,0xd3,0x72,0xa2,0x0f,0xc0,0xcc,0x24,0x7d,0x8d,0x76,0x93, +0x86,0x97,0x6c,0x96,0x5e,0x33,0x5c,0xf2,0x78,0x5c,0xb0,0xd8,0xd4,0x79,0x92,0x01, +0xa1,0x63,0xfb,0x06,0x36,0x19,0x25,0x52,0xfc,0xd2,0xef,0xba,0x57,0xf4,0xa5,0xaf, +0x06,0x95,0x85,0x66,0xff,0xb3,0x45,0x31,0xe4,0x8b,0x3d,0x55,0x54,0x0c,0xe5,0x33, +0x3a,0xb4,0x64,0xc3,0xe0,0xf4,0x3f,0x0d,0x9d,0x2b,0x4a,0xe4,0x80,0x20,0x5f,0x42, +0xdb,0xd7,0x58,0x3c,0xd6,0xd3,0xbc,0xe6,0x44,0x97,0x7b,0xed,0x75,0xbb,0xd0,0xcf, +0x5e,0x34,0xe5,0xc2,0x57,0xd0,0x8e,0x67,0xa2,0x58,0xf2,0xf8,0xa2,0x62,0xde,0x52, +0xa1,0x17,0x59,0x97,0xbb,0x78,0x7b,0x0a,0x98,0x87,0x8b,0xb1,0x51,0xbb,0x6e,0x1d, +0x8d,0x91,0xf8,0x86,0x3e,0xbc,0x34,0x48,0x68,0xf8,0xfc,0xaf,0x9f,0x72,0x16,0x69, +0x39,0x14,0xf0,0x1a,0x3d,0x34,0x60,0x3e,0x6d,0x72,0x45,0xe2,0xde,0x97,0xde,0x09, +0xaf,0x7c,0xa8,0x7e,0xb6,0xbc,0x0b,0x5a,0xe6,0xd6,0xb3,0x51,0x01,0x70,0x51,0x1e, +0x44,0xcb,0xd1,0x0f,0x56,0x19,0x7d,0xfb,0x6d,0xeb,0x81,0xb6,0x3f,0xfb,0xbe,0xf5, +0x3a,0x47,0xc6,0xcf,0x99,0xac,0xb6,0xfe,0x79,0x9e,0x82,0x13,0x40,0xbe,0x10,0x5e, +0xda,0x3e,0xd4,0x59,0x93,0xa2,0x7e,0x7e,0x2b,0x79,0x3e,0xea,0x83,0x08,0x67,0xb4, +0xc6,0xdc,0x08,0x3d,0x3e,0x8f,0xf5,0x65,0xe8,0xde,0x75,0xd0,0x02,0x9c,0x2b,0x28, +0xa5,0x62,0xa5,0xca,0xdf,0x2f,0xbf,0xea,0x3d,0x52,0xf8,0x7b,0xbb,0x0a,0xb7,0x1c, +0x06,0xc0,0x24,0x66,0x33,0x40,0x63,0x66,0xea,0xbb,0x94,0x63,0xd2,0x68,0x78,0x56, +0xa3,0xff,0x68,0x1c,0x33,0x31,0xaf,0xb5,0x47,0x81,0xbe,0xef,0x05,0xc5,0xb6,0xfc, +0x90,0x4c,0x6d,0x07,0x98,0x4e,0x91,0xa5,0x84,0xb7,0xa0,0x47,0x3b,0xd2,0xf0,0x57, +0x6b,0xa7,0x8c,0x06,0xdf,0x67,0xae,0x0e,0x9d,0x01,0x72,0x28,0x19,0x9d,0x38,0x22, +0x41,0xf4,0x2f,0x36,0xb1,0x65,0xe3,0x79,0xbe,0x94,0xd0,0x64,0x52,0x64,0x40,0xe2, +0xf6,0x0a,0xb0,0x73,0x37,0x25,0x5c,0x37,0xc1,0x4d,0xd8,0x74,0x53,0x65,0x4b,0x01, +0x21,0x00,0xc5,0x65,0x92,0x26,0xc1,0xa6,0xc0,0xb3,0xd1,0x65,0xd2,0x66,0xfd,0x2e, +0x20,0x46,0xc9,0x55,0x93,0x27,0xeb,0x13,0x28,0xf7,0xd9,0x75,0xd3,0x67,0x42,0x0e, +0xc0,0xf8,0xa4,0x98,0x94,0xa3,0x90,0x17,0xb4,0x4a,0xd2,0xaa,0xa4,0x9d,0x08,0xde, +0xab,0x4c,0x71,0x3a,0x09,0xa4,0x99,0x3e,0x81,0xf9,0x19,0x06,0x01,0x28,0xa7,0xf5, +0x08,0xf1,0x87,0xef,0x9e,0xea,0xd3,0x3d,0x34,0xee,0xd3,0x13,0x84,0xdf,0x79,0xbc, +0x2d,0xec,0x5f,0xe2,0x1a,0x25,0xbf,0x5b,0x65,0xb4,0x77,0xbd,0x25,0x4b,0xaa,0xfb, +0x8f,0x4b,0xc2,0x4c,0x1a,0x2c,0x74,0xb7,0x1e,0x0a,0xd2,0x6c,0x5a,0x6c,0x3e,0xa5, +0x2a,0x4f,0xca,0x5c,0x1b,0x2d,0xd9,0x5c,0xc4,0x4f,0xda,0x7c,0x5b,0x6d,0x83,0x5d, +0x78,0x42,0xc3,0x4d,0x9a,0x2e,0xe4,0x57,0x92,0xbb,0xd3,0x6d,0xda,0x6e,0xc9,0x66, +0x0e,0x08,0xcb,0x5d,0x9b,0x2f,0xec,0x78,0x46,0x49,0xdb,0x7d,0xdb,0x6f,0x80,0x04, +0x64,0xe5,0x0c,0x86,0xc5,0x3f,0x74,0xe4,0x6f,0x5d,0xbc,0x66,0xf2,0x78,0xbb,0xaf, +0x79,0x53,0x48,0x11,0x72,0xc2,0x94,0xc8,0x80,0x5e,0xfc,0xf4,0x8a,0x7c,0x3f,0x7e, +0xa6,0xd2,0x31,0xfa,0x13,0x8f,0x5f,0x7e,0x43,0x54,0x7a,0x55,0xa8,0x7d,0x8f,0xae, +0x5d,0xc3,0xed,0xd1,0x8c,0x3c,0x7d,0xf5,0xd8,0x5c,0xef,0xac,0xb1,0x88,0x3c,0xe4, +0xa7,0x33,0xc4,0xc4,0x32,0x34,0x94,0xf4,0x9e,0x18,0xd4,0xe4,0x72,0x74,0xfb,0x2d, +0x33,0x5b,0xcc,0xd4,0x33,0x35,0xf4,0x53,0x1c,0xd5,0xdc,0xf4,0x73,0x75,0x9a,0xd0, +0xa4,0xd6,0xc5,0xc5,0xb2,0x36,0x25,0x27,0x48,0x17,0xd5,0xe5,0xf2,0x76,0x3d,0xf7, +0x41,0x74,0xcd,0xd5,0xb3,0x37,0x9d,0xe5,0x1f,0x1b,0xdd,0xf5,0xf3,0x77,0xc6,0x9c, +0xd4,0xbc,0x16,0x92,0x60,0xcc,0xa2,0x4a,0xea,0x10,0x92,0xae,0x7c,0x83,0xaa,0x65, +0xa9,0xc2,0x7e,0x18,0x7d,0xae,0x66,0xda,0x2a,0xe6,0x29,0x98,0xfc,0x5e,0x47,0x8f, +0x60,0xea,0x04,0x4b,0x52,0x76,0xdb,0xcb,0xab,0x85,0x97,0x6f,0x7b,0x3c,0x0e,0x5f, +0x0b,0x5e,0x27,0x3e,0xc6,0x3a,0x67,0xe6,0x1c,0xa7,0x40,0xac,0xff,0xbb,0xee,0x6a, +0xf5,0xf3,0xc6,0xcc,0x3a,0x3c,0x26,0x2e,0xc0,0x1d,0xd6,0xec,0x7a,0x7c,0xb1,0xfc, +0xa9,0x15,0xce,0xdc,0x3b,0x3d,0xf2,0xba,0xe8,0x53,0xde,0xfc,0x7b,0x7d,0xef,0x6b, +0x2d,0x39,0xc7,0xcd,0xba,0x3e,0xbb,0x69,0x16,0x7e,0xd7,0xed,0xfa,0x7e,0xf9,0xbb, +0x5c,0x19,0xcf,0xdd,0xbb,0x3f,0x37,0x7f,0x17,0x1e,0xdf,0xfd,0xfb,0x7f,0xf4,0x44, +0xa6,0x7e,0x40,0x39,0x30,0x1c,0xf0,0x36,0xb8,0xbe,0x1c,0xa4,0x55,0x65,0xc3,0x69, +0x9a,0xbc,0x2c,0xe7,0xb6,0xa3,0x4c,0xb6,0x0d,0x9f,0xd7,0x2a,0x9d,0x3f,0x5b,0x87, +0xc8,0x92,0x1e,0x5c,0x6d,0x28,0x48,0x65,0x66,0x8c,0x89,0xd4,0x8c,0x46,0x81,0xb1, +0x02,0xa4,0x9b,0xe8,0x17,0xeb,0xf9,0x27,0x54,0x82,0x3e,0x24,0x0a,0xe1,0x88,0xe1, +0x00,0x24,0xe0,0x46,0x16,0xa4,0x78,0x50,0xe7,0x6b,0xf0,0x66,0x56,0xe4,0xf8,0xd0, +0x06,0xf2,0xe8,0x56,0x17,0xa5,0x98,0x4d,0xb3,0x75,0xf8,0x76,0x57,0xe5,0x88,0xc7, +0xc2,0x9a,0xe1,0x47,0x96,0xa6,0x76,0x70,0x1d,0x16,0xf1,0x67,0xd6,0xe6,0x53,0xb1, +0x05,0x8f,0xe9,0x57,0x97,0xa7,0xce,0x6f,0xe3,0x3a,0xf9,0x77,0xd7,0xe7,0xb2,0x14, +0x54,0x7c,0x82,0x6c,0xab,0xcd,0x99,0x51,0x99,0x35,0x52,0x11,0xa0,0xea,0x6a,0xdc, +0xe7,0xc5,0x13,0x4f,0xbe,0x76,0x62,0x07,0xcf,0xc1,0x89,0x27,0x79,0x87,0xa0,0x11, +0xd0,0x3e,0x9b,0xdf,0x41,0xd5,0x71,0x4b,0xd4,0x4a,0x00,0x32,0x24,0x3a,0xdb,0x5d, +0x27,0x70,0x16,0x42,0x62,0xad,0xef,0x49,0x6e,0x8a,0xfb,0x00,0xd5,0x87,0x93,0x28, +0x4d,0x53,0xe2,0x4e,0x1e,0xac,0xad,0x62,0x60,0x8a,0xf2,0x6e,0x5e,0xec,0x12,0xd8, +0x0e,0x9a,0xea,0x5e,0x1f,0xad,0x0a,0xa5,0xa0,0x8c,0xfa,0x7e,0x5f,0xed,0x1b,0x29, +0xcd,0x7e,0xe3,0x4f,0x9e,0xae,0x81,0xad,0x6c,0x82,0xf3,0x6f,0xde,0xee,0xd0,0xb9, +0x23,0x72,0xeb,0x5f,0x9f,0xaf,0xd3,0xd8,0xb0,0x0f,0xfb,0x7f,0xdf,0xef,0x56,0x27, +0xa1,0x97,0x64,0x92,0xc8,0x45,0xf4,0xb3,0x48,0xd6,0x03,0x5b,0x38,0xbe,0x2d,0x4d, +0x86,0xef,0x1b,0x8f,0x33,0x71,0x44,0x96,0xea,0xd3,0x45,0x70,0xd7,0xb4,0xce,0x74, +0xa2,0x72,0x61,0x03,0xf0,0x47,0x3d,0x06,0x87,0xf2,0xc5,0xe1,0x56,0x0c,0x16,0xd5, +0x07,0xdd,0x1a,0xa8,0xe1,0xf1,0x8a,0xb2,0x68,0xdf,0xcf,0x31,0xed,0xbf,0x6c,0xf5, +0x87,0xf8,0xe4,0xc6,0x36,0xb4,0x14,0xa2,0x6a,0x29,0xf4,0xe6,0x76,0xf4,0xe8,0x15, +0xa7,0xb5,0xec,0xd6,0x37,0xb5,0x26,0xf3,0xc4,0x94,0xfc,0xf6,0x77,0xf5,0x86,0x84, +0x78,0x9e,0xe5,0xc7,0xb6,0xb6,0x0d,0x61,0xe7,0x96,0xf5,0xe7,0xf6,0xf6,0xc1,0x13, +0x04,0xd6,0xed,0xd7,0xb7,0xb7,0x1d,0xb3,0xfa,0x5c,0xfd,0xf7,0xf7,0xf7,0x52,0xae, +0xf8,0x28,0x24,0xb1,0xb9,0xbf,0x5e,0xb4,0x2a,0x2c,0xc6,0x8e,0x64,0x35,0x09,0x1a, +0xaa,0x3e,0x47,0x1a,0x79,0xa5,0x81,0xda,0xda,0x7d,0x84,0x5c,0xff,0xf1,0x80,0x97, +0x7c,0x6a,0x4f,0x2c,0xba,0x1a,0xf1,0x2f,0xa4,0xad,0x27,0x2d,0xfd,0x1d,0x87,0x3d, +0xab,0x5b,0x3f,0x58,0xbf,0x4e,0xf9,0xbd,0x25,0x19,0x4d,0xdd,0xbe,0x24,0x8a,0x4a, +0xd2,0xbc,0xe6,0xce,0x3e,0xbc,0xf2,0x08,0xec,0xd4,0xf6,0xee,0x7e,0xfc,0x56,0x29, +0x77,0x39,0xee,0xde,0x3f,0xbd,0x1e,0xba,0xc2,0x20,0xfe,0xfe,0x7f,0xfd,0xcb,0x49, +0xaf,0xcb,0xe7,0xcf,0xbe,0xbe,0xfe,0x99,0x4d,0x9f,0xf7,0xef,0xfe,0xfe,0x80,0xc7, +0x29,0x6a,0xef,0xdf,0xbf,0xbf,0x07,0xdf,0x6d,0xd7,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, +0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, +0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xc0,0x42,0x91,0x25,0xd0,0x62,0x09,0x11, +0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xc1,0x43,0x99,0x35,0xd1,0x63,0x40,0x40, +0x02,0x04,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0x49,0x51, +0x83,0x07,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0x02,0x08, +0x08,0x08,0x82,0x0c,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2c,0x58,0x68,0x0a,0x18, +0x09,0x09,0x8a,0x1c,0x19,0x29,0x1a,0x38,0x49,0x49,0x9a,0x3c,0x59,0x69,0x03,0x09, +0x88,0x0a,0x83,0x0d,0x98,0x2a,0x13,0x29,0xc8,0x4a,0x93,0x2d,0xd8,0x6a,0x0b,0x19, +0x89,0x0b,0x8b,0x1d,0x99,0x2b,0x1b,0x39,0xc9,0x4b,0x9b,0x3d,0xd9,0x6b,0x42,0x48, +0x0a,0x0c,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0x4a,0x58, +0x0b,0x0d,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0x43,0x49, +0x8a,0x0e,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x4b,0x59, +0x8b,0x0f,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xa0,0x60,0x50,0x94,0xa4,0x70,0x70,0x0c,0x90, +0x21,0x11,0x8c,0x94,0x31,0x31,0x1c,0xb0,0x61,0x51,0x9c,0xb4,0x71,0x71,0x05,0x81, +0xa0,0x12,0x85,0x85,0xb0,0x32,0x15,0xa1,0xe0,0x52,0x95,0xa5,0xf0,0x72,0x0d,0x91, +0xa1,0x13,0x8d,0x95,0xb1,0x33,0x1d,0xb1,0xe1,0x53,0x9d,0xb5,0xf1,0x73,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0x06,0x88, +0x28,0x18,0x86,0x8c,0x38,0x38,0x16,0xa8,0x68,0x58,0x96,0xac,0x78,0x78,0x0e,0x98, +0x29,0x19,0x8e,0x9c,0x39,0x39,0x1e,0xb8,0x69,0x59,0x9e,0xbc,0x79,0x79,0x07,0x89, +0xa8,0x1a,0x87,0x8d,0xb8,0x3a,0x17,0xa9,0xe8,0x5a,0x97,0xad,0xf8,0x7a,0x0f,0x99, +0xa9,0x1b,0x8f,0x9d,0xb9,0x3b,0x1f,0xb9,0xe9,0x5b,0x9f,0xbd,0xf9,0x7b,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x20,0x02, +0x04,0x80,0xa0,0x06,0x14,0xa0,0x30,0x22,0x44,0xc0,0xb0,0x26,0x54,0xe0,0x28,0x12, +0x05,0x81,0xa8,0x16,0x15,0xa1,0x38,0x32,0x45,0xc1,0xb8,0x36,0x55,0xe1,0x21,0x03, +0x84,0x82,0xa1,0x07,0x94,0xa2,0x31,0x23,0xc4,0xc2,0xb1,0x27,0xd4,0xe2,0x29,0x13, +0x85,0x83,0xa9,0x17,0x95,0xa3,0x39,0x33,0xc5,0xc3,0xb9,0x37,0xd5,0xe3,0x60,0x42, +0x06,0x84,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0x68,0x52, +0x07,0x85,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x61,0x43, +0x86,0x86,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x69,0x53, +0x87,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0x22,0x0a, +0x0c,0x88,0xa2,0x0e,0x1c,0xa8,0x32,0x2a,0x4c,0xc8,0xb2,0x2e,0x5c,0xe8,0x2a,0x1a, +0x0d,0x89,0xaa,0x1e,0x1d,0xa9,0x3a,0x3a,0x4d,0xc9,0xba,0x3e,0x5d,0xe9,0x23,0x0b, +0x8c,0x8a,0xa3,0x0f,0x9c,0xaa,0x33,0x2b,0xcc,0xca,0xb3,0x2f,0xdc,0xea,0x2b,0x1b, +0x8d,0x8b,0xab,0x1f,0x9d,0xab,0x3b,0x3b,0xcd,0xcb,0xbb,0x3f,0xdd,0xeb,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x24,0x82, +0x24,0x90,0xa4,0x86,0x34,0xb0,0x34,0xa2,0x64,0xd0,0xb4,0xa6,0x74,0xf0,0x2c,0x92, +0x25,0x91,0xac,0x96,0x35,0xb1,0x3c,0xb2,0x65,0xd1,0xbc,0xb6,0x75,0xf1,0x25,0x83, +0xa4,0x92,0xa5,0x87,0xb4,0xb2,0x35,0xa3,0xe4,0xd2,0xb5,0xa7,0xf4,0xf2,0x2d,0x93, +0xa5,0x93,0xad,0x97,0xb5,0xb3,0x3d,0xb3,0xe5,0xd3,0xbd,0xb7,0xf5,0xf3,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0x26,0x8a, +0x2c,0x98,0xa6,0x8e,0x3c,0xb8,0x36,0xaa,0x6c,0xd8,0xb6,0xae,0x7c,0xf8,0x2e,0x9a, +0x2d,0x99,0xae,0x9e,0x3d,0xb9,0x3e,0xba,0x6d,0xd9,0xbe,0xbe,0x7d,0xf9,0x27,0x8b, +0xac,0x9a,0xa7,0x8f,0xbc,0xba,0x37,0xab,0xec,0xda,0xb7,0xaf,0xfc,0xfa,0x2f,0x9b, +0xad,0x9b,0xaf,0x9f,0xbd,0xbb,0x3f,0xbb,0xed,0xdb,0xbf,0xbf,0xfd,0xfb,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0xff,0xff,0x00,0x00, +0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, +0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, +0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xc0,0x42,0x91,0x25,0xd0,0x62,0x09,0x11, +0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xc1,0x43,0x99,0x35,0xd1,0x63,0x40,0x40, +0x02,0x04,0xc0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xd0,0x64,0x52,0x64,0x48,0x50, +0x03,0x05,0xc8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xd8,0x74,0x53,0x65,0x41,0x41, +0x82,0x06,0xc1,0x45,0x92,0x26,0x51,0x61,0xc2,0x46,0xd1,0x65,0xd2,0x66,0x49,0x51, +0x83,0x07,0xc9,0x55,0x93,0x27,0x59,0x71,0xc3,0x47,0xd9,0x75,0xd3,0x67,0x02,0x08, +0x08,0x08,0x82,0x0c,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2c,0x58,0x68,0x0a,0x18, +0x09,0x09,0x8a,0x1c,0x19,0x29,0x1a,0x38,0x49,0x49,0x9a,0x3c,0x59,0x69,0x03,0x09, +0x88,0x0a,0x83,0x0d,0x98,0x2a,0x13,0x29,0xc8,0x4a,0x93,0x2d,0xd8,0x6a,0x0b,0x19, +0x89,0x0b,0x8b,0x1d,0x99,0x2b,0x1b,0x39,0xc9,0x4b,0x9b,0x3d,0xd9,0x6b,0x42,0x48, +0x0a,0x0c,0xc2,0x4c,0x1a,0x2c,0x52,0x68,0x4a,0x4c,0xd2,0x6c,0x5a,0x6c,0x4a,0x58, +0x0b,0x0d,0xca,0x5c,0x1b,0x2d,0x5a,0x78,0x4b,0x4d,0xda,0x7c,0x5b,0x6d,0x43,0x49, +0x8a,0x0e,0xc3,0x4d,0x9a,0x2e,0x53,0x69,0xca,0x4e,0xd3,0x6d,0xda,0x6e,0x4b,0x59, +0x8b,0x0f,0xcb,0x5d,0x9b,0x2f,0x5b,0x79,0xcb,0x4f,0xdb,0x7d,0xdb,0x6f,0x04,0x80, +0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xa0,0x60,0x50,0x94,0xa4,0x70,0x70,0x0c,0x90, +0x21,0x11,0x8c,0x94,0x31,0x31,0x1c,0xb0,0x61,0x51,0x9c,0xb4,0x71,0x71,0x05,0x81, +0xa0,0x12,0x85,0x85,0xb0,0x32,0x15,0xa1,0xe0,0x52,0x95,0xa5,0xf0,0x72,0x0d,0x91, +0xa1,0x13,0x8d,0x95,0xb1,0x33,0x1d,0xb1,0xe1,0x53,0x9d,0xb5,0xf1,0x73,0x44,0xc0, +0x22,0x14,0xc4,0xc4,0x32,0x34,0x54,0xe0,0x62,0x54,0xd4,0xe4,0x72,0x74,0x4c,0xd0, +0x23,0x15,0xcc,0xd4,0x33,0x35,0x5c,0xf0,0x63,0x55,0xdc,0xf4,0x73,0x75,0x45,0xc1, +0xa2,0x16,0xc5,0xc5,0xb2,0x36,0x55,0xe1,0xe2,0x56,0xd5,0xe5,0xf2,0x76,0x4d,0xd1, +0xa3,0x17,0xcd,0xd5,0xb3,0x37,0x5d,0xf1,0xe3,0x57,0xdd,0xf5,0xf3,0x77,0x06,0x88, +0x28,0x18,0x86,0x8c,0x38,0x38,0x16,0xa8,0x68,0x58,0x96,0xac,0x78,0x78,0x0e,0x98, +0x29,0x19,0x8e,0x9c,0x39,0x39,0x1e,0xb8,0x69,0x59,0x9e,0xbc,0x79,0x79,0x07,0x89, +0xa8,0x1a,0x87,0x8d,0xb8,0x3a,0x17,0xa9,0xe8,0x5a,0x97,0xad,0xf8,0x7a,0x0f,0x99, +0xa9,0x1b,0x8f,0x9d,0xb9,0x3b,0x1f,0xb9,0xe9,0x5b,0x9f,0xbd,0xf9,0x7b,0x46,0xc8, +0x2a,0x1c,0xc6,0xcc,0x3a,0x3c,0x56,0xe8,0x6a,0x5c,0xd6,0xec,0x7a,0x7c,0x4e,0xd8, +0x2b,0x1d,0xce,0xdc,0x3b,0x3d,0x5e,0xf8,0x6b,0x5d,0xde,0xfc,0x7b,0x7d,0x47,0xc9, +0xaa,0x1e,0xc7,0xcd,0xba,0x3e,0x57,0xe9,0xea,0x5e,0xd7,0xed,0xfa,0x7e,0x4f,0xd9, +0xab,0x1f,0xcf,0xdd,0xbb,0x3f,0x5f,0xf9,0xeb,0x5f,0xdf,0xfd,0xfb,0x7f,0x20,0x02, +0x04,0x80,0xa0,0x06,0x14,0xa0,0x30,0x22,0x44,0xc0,0xb0,0x26,0x54,0xe0,0x28,0x12, +0x05,0x81,0xa8,0x16,0x15,0xa1,0x38,0x32,0x45,0xc1,0xb8,0x36,0x55,0xe1,0x21,0x03, +0x84,0x82,0xa1,0x07,0x94,0xa2,0x31,0x23,0xc4,0xc2,0xb1,0x27,0xd4,0xe2,0x29,0x13, +0x85,0x83,0xa9,0x17,0x95,0xa3,0x39,0x33,0xc5,0xc3,0xb9,0x37,0xd5,0xe3,0x60,0x42, +0x06,0x84,0xe0,0x46,0x16,0xa4,0x70,0x62,0x46,0xc4,0xf0,0x66,0x56,0xe4,0x68,0x52, +0x07,0x85,0xe8,0x56,0x17,0xa5,0x78,0x72,0x47,0xc5,0xf8,0x76,0x57,0xe5,0x61,0x43, +0x86,0x86,0xe1,0x47,0x96,0xa6,0x71,0x63,0xc6,0xc6,0xf1,0x67,0xd6,0xe6,0x69,0x53, +0x87,0x87,0xe9,0x57,0x97,0xa7,0x79,0x73,0xc7,0xc7,0xf9,0x77,0xd7,0xe7,0x22,0x0a, +0x0c,0x88,0xa2,0x0e,0x1c,0xa8,0x32,0x2a,0x4c,0xc8,0xb2,0x2e,0x5c,0xe8,0x2a,0x1a, +0x0d,0x89,0xaa,0x1e,0x1d,0xa9,0x3a,0x3a,0x4d,0xc9,0xba,0x3e,0x5d,0xe9,0x23,0x0b, +0x8c,0x8a,0xa3,0x0f,0x9c,0xaa,0x33,0x2b,0xcc,0xca,0xb3,0x2f,0xdc,0xea,0x2b,0x1b, +0x8d,0x8b,0xab,0x1f,0x9d,0xab,0x3b,0x3b,0xcd,0xcb,0xbb,0x3f,0xdd,0xeb,0x62,0x4a, +0x0e,0x8c,0xe2,0x4e,0x1e,0xac,0x72,0x6a,0x4e,0xcc,0xf2,0x6e,0x5e,0xec,0x6a,0x5a, +0x0f,0x8d,0xea,0x5e,0x1f,0xad,0x7a,0x7a,0x4f,0xcd,0xfa,0x7e,0x5f,0xed,0x63,0x4b, +0x8e,0x8e,0xe3,0x4f,0x9e,0xae,0x73,0x6b,0xce,0xce,0xf3,0x6f,0xde,0xee,0x6b,0x5b, +0x8f,0x8f,0xeb,0x5f,0x9f,0xaf,0x7b,0x7b,0xcf,0xcf,0xfb,0x7f,0xdf,0xef,0x24,0x82, +0x24,0x90,0xa4,0x86,0x34,0xb0,0x34,0xa2,0x64,0xd0,0xb4,0xa6,0x74,0xf0,0x2c,0x92, +0x25,0x91,0xac,0x96,0x35,0xb1,0x3c,0xb2,0x65,0xd1,0xbc,0xb6,0x75,0xf1,0x25,0x83, +0xa4,0x92,0xa5,0x87,0xb4,0xb2,0x35,0xa3,0xe4,0xd2,0xb5,0xa7,0xf4,0xf2,0x2d,0x93, +0xa5,0x93,0xad,0x97,0xb5,0xb3,0x3d,0xb3,0xe5,0xd3,0xbd,0xb7,0xf5,0xf3,0x64,0xc2, +0x26,0x94,0xe4,0xc6,0x36,0xb4,0x74,0xe2,0x66,0xd4,0xf4,0xe6,0x76,0xf4,0x6c,0xd2, +0x27,0x95,0xec,0xd6,0x37,0xb5,0x7c,0xf2,0x67,0xd5,0xfc,0xf6,0x77,0xf5,0x65,0xc3, +0xa6,0x96,0xe5,0xc7,0xb6,0xb6,0x75,0xe3,0xe6,0xd6,0xf5,0xe7,0xf6,0xf6,0x6d,0xd3, +0xa7,0x97,0xed,0xd7,0xb7,0xb7,0x7d,0xf3,0xe7,0xd7,0xfd,0xf7,0xf7,0xf7,0x26,0x8a, +0x2c,0x98,0xa6,0x8e,0x3c,0xb8,0x36,0xaa,0x6c,0xd8,0xb6,0xae,0x7c,0xf8,0x2e,0x9a, +0x2d,0x99,0xae,0x9e,0x3d,0xb9,0x3e,0xba,0x6d,0xd9,0xbe,0xbe,0x7d,0xf9,0x27,0x8b, +0xac,0x9a,0xa7,0x8f,0xbc,0xba,0x37,0xab,0xec,0xda,0xb7,0xaf,0xfc,0xfa,0x2f,0x9b, +0xad,0x9b,0xaf,0x9f,0xbd,0xbb,0x3f,0xbb,0xed,0xdb,0xbf,0xbf,0xfd,0xfb,0x66,0xca, +0x2e,0x9c,0xe6,0xce,0x3e,0xbc,0x76,0xea,0x6e,0xdc,0xf6,0xee,0x7e,0xfc,0x6e,0xda, +0x2f,0x9d,0xee,0xde,0x3f,0xbd,0x7e,0xfa,0x6f,0xdd,0xfe,0xfe,0x7f,0xfd,0x67,0xcb, +0xae,0x9e,0xe7,0xcf,0xbe,0xbe,0x77,0xeb,0xee,0xde,0xf7,0xef,0xfe,0xfe,0x6f,0xdb, +0xaf,0x9f,0xef,0xdf,0xbf,0xbf,0x7f,0xfb,0xef,0xdf,0xff,0xff,0x90,0xaf, diff --git a/drivers/input/touchscreen/GT917D/FW_EACH.txt b/drivers/input/touchscreen/GT917D/FW_EACH.txt new file mode 100644 index 0000000000000..09980ef2ca352 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/FW_EACH.txt @@ -0,0 +1,11265 @@ + 0x00,0x01,0x60,0x00,0x39,0x31,0x35,0x4C,0x00,0x00,0x00,0x00,0x10,0x62,0x80,0x00, + + 0x55,0x40,0xBD,0xDA,0xFD,0x24,0x34,0xDF,0x44,0x40,0xAF,0xEB,0xE9,0x2C,0xC8,0xB4, + + 0x25,0x41,0x8C,0x90,0x5F,0xA4,0x22,0xB7,0xED,0x5E,0x58,0x35,0x89,0x94,0x01,0x88, + + 0x86,0x02,0x72,0xFC,0x81,0xD9,0x39,0x25,0xC8,0xE2,0xE1,0xE3,0x7A,0x23,0x09,0x05, + + 0x87,0x03,0xB3,0xE6,0xF0,0x25,0x23,0xB6,0x6D,0x4B,0x83,0x4A,0xAE,0x73,0x1E,0xA2, + + 0x12,0xF9,0x91,0xBE,0x36,0x39,0x28,0x69,0xEF,0x76,0xA8,0xB2,0xB3,0xB8,0x37,0x10, + + 0x4F,0x13,0x6D,0xB6,0xF3,0xB4,0xFC,0x02,0xCD,0xEA,0xE2,0x2E,0xE8,0x70,0xD6,0xBE, + + 0x7B,0x65,0x66,0xA7,0x72,0xBA,0xC1,0x6A,0x46,0x12,0x2C,0x17,0x0B,0x39,0x01,0x45, + + 0x48,0x08,0xB2,0x3E,0x47,0x28,0x21,0x81,0xCB,0x21,0x79,0x51,0x61,0x67,0xC0,0xAC, + + 0x2C,0x48,0xCA,0x9B,0xB9,0xA1,0x96,0xDE,0xC8,0x68,0x46,0xAA,0xBE,0x26,0x9A,0xBC, + + 0x2F,0x49,0x04,0xFC,0x9B,0x23,0x3A,0x11,0xA8,0x2F,0x64,0x18,0xE7,0x49,0xCB,0x4A, + + 0xC0,0x01,0x32,0x6D,0xC8,0x68,0xEB,0x21,0x17,0xC5,0xE3,0x6B,0x7A,0x94,0xC8,0xF0, + + 0x2A,0x6E,0xED,0x6F,0x3A,0x2D,0xAF,0xD3,0x8A,0xAB,0x19,0x36,0x5D,0x3F,0xBA,0x6C, + + 0x87,0x1A,0xF0,0x74,0xE9,0x78,0xC2,0xC7,0x42,0x4E,0xFE,0xC7,0x5A,0x56,0xF3,0x7C, + + 0x8E,0xA3,0xB1,0x32,0xCF,0x22,0xFA,0x0B,0xC7,0x1E,0x7F,0x9E,0x9B,0x91,0x3C,0x54, + + 0x41,0x01,0xBB,0x36,0x7A,0xBF,0x6D,0x6F,0xF2,0xE1,0x22,0x6D,0xA2,0xF3,0x70,0xF9, + + 0x66,0x3F,0xF9,0x06,0x2B,0x20,0x25,0x7E,0x6A,0xE0,0x70,0x26,0x28,0xC2,0x04,0x80, + + 0x78,0xF8,0xD4,0x9B,0x1A,0xA4,0x74,0x60,0xFF,0xDD,0xEC,0x96,0x04,0xAF,0xDE,0xB0, + + 0x26,0xE9,0xFA,0xD2,0x97,0x7D,0x6F,0x97,0x9E,0xDB,0x6F,0xB4,0x49,0x8C,0x4F,0x28, + + 0x82,0x11,0x55,0x9E,0x9E,0x7C,0xCE,0xA0,0x6E,0x5B,0x05,0x1F,0xF0,0x02,0x02,0x1D, + + 0x24,0xE6,0xF9,0x68,0x8F,0x71,0xCA,0x11,0x08,0x63,0xBA,0x57,0x31,0x8C,0x64,0xC5, + + 0x24,0x34,0x57,0x9F,0x08,0xEB,0xF0,0x8B,0xEC,0xFB,0xEE,0x0F,0xC5,0x35,0xE0,0xA2, + + 0xFD,0xEA,0xFE,0xED,0xE6,0x96,0xCC,0x1A,0xDD,0x75,0x23,0x8A,0x5D,0xAA,0x6B,0x61, + + 0x69,0xF6,0xFF,0x7D,0x41,0x6B,0x2D,0xC6,0x5B,0x30,0x8C,0x6D,0x0F,0x87,0x77,0x4F, + + 0x54,0x56,0xB5,0x2E,0x52,0xA4,0x19,0x82,0x67,0x66,0xE2,0x50,0x08,0xEA,0xC6,0x59, + + 0xE3,0x03,0x82,0x86,0xC4,0x3B,0x5C,0x35,0x9F,0xD5,0xA1,0x4E,0x5C,0xF5,0x71,0x1A, + + 0xA1,0x11,0xDA,0x18,0x31,0x8D,0x9D,0xE7,0x2A,0x55,0x9F,0xC3,0x05,0x86,0xF8,0xFB, + + 0x4F,0x04,0x47,0x8C,0x60,0xCF,0xF3,0x8E,0xC9,0x7A,0xBC,0x47,0x93,0x75,0xD0,0xDB, + + 0xDE,0xE3,0x50,0x95,0x3E,0x3C,0x09,0xDB,0xC8,0x4E,0x24,0x18,0x0E,0xE6,0x68,0x2A, + + 0x99,0x79,0xBD,0xE8,0x51,0x33,0x28,0xEE,0x83,0x38,0x02,0x16,0xE3,0x1F,0x36,0x32, + + 0xC2,0x59,0x71,0xE1,0xC4,0xE0,0x26,0x8B,0xC8,0x38,0x3B,0x97,0xED,0x75,0x7F,0xE1, + + 0x09,0xB2,0xC6,0x3C,0x3E,0x3E,0x86,0x1A,0x66,0x43,0xFA,0x6D,0x35,0xDE,0x09,0xDF, + + 0x88,0x5F,0x1B,0x23,0x62,0x5C,0x27,0xDD,0xE8,0x6F,0x59,0x87,0x65,0xE0,0xB0,0xA6, + + 0x04,0xC0,0xE8,0x94,0xB7,0xEC,0x22,0x3A,0xD5,0xAC,0x14,0x44,0x70,0xEA,0x28,0x12, + + 0x05,0xC1,0xB2,0xEA,0x15,0xE3,0x32,0x12,0xD4,0xA5,0x43,0x32,0xF8,0xA0,0x21,0x1F, + + 0x84,0x82,0x12,0x41,0xD4,0x59,0xE5,0x71,0x87,0x32,0x31,0x50,0xF0,0x95,0x29,0x9F, + + 0x85,0x83,0x65,0x42,0x17,0xAB,0x31,0x23,0x26,0x09,0x9C,0x31,0x41,0x87,0x90,0x91, + + 0xE7,0xE8,0x45,0xA4,0xF6,0x15,0x08,0x45,0xE7,0x85,0x88,0x29,0xED,0xFF,0x13,0x2C, + + 0x25,0x68,0x97,0x3D,0xCB,0xAA,0xD8,0x98,0x83,0xCA,0x43,0xD3,0xA0,0x58,0x06,0xB8, + + 0x67,0x10,0xCA,0xEF,0xFE,0xA9,0x39,0x6A,0x7F,0x67,0xB0,0x18,0xAA,0x19,0x2F,0xF5, + + 0x4C,0x0A,0xDB,0x6F,0x4E,0x04,0x78,0x05,0xE3,0xB0,0x2D,0x8C,0x26,0x84,0x22,0x0A, + + 0x0C,0xC8,0x57,0xFE,0x14,0xA7,0x12,0x2B,0x09,0x07,0x88,0xA9,0x78,0x15,0x2A,0x1A, + + 0x0D,0xC9,0xF3,0x88,0x7A,0xB1,0x3E,0x3E,0x0D,0xD9,0xC2,0x61,0x8D,0xE6,0x23,0x2A, + + 0x8C,0x8A,0x4B,0x21,0x1B,0x5F,0xDC,0x59,0x4C,0xBA,0x94,0xCD,0x3C,0xFF,0xA0,0x58, + + 0x8D,0x8B,0x2B,0x62,0xC1,0x7F,0x7B,0x1B,0xCC,0xCF,0x89,0x17,0x08,0x5F,0xCE,0xD5, + + 0xF1,0x01,0x9A,0xB4,0xA3,0x78,0x89,0x66,0xF7,0x6D,0x89,0x01,0x70,0x93,0x44,0x1D, + + 0xEE,0x3B,0x92,0x31,0xC3,0xA2,0x02,0x72,0xEA,0x8C,0xF2,0x6E,0xE2,0xDB,0x80,0xB5, + + 0x88,0xAE,0x9B,0x7D,0x69,0x9B,0xD3,0x81,0x6B,0x61,0xB3,0xB8,0xD2,0xD8,0x14,0x29, + + 0x5D,0x10,0xD9,0x00,0x56,0xA0,0x45,0x7C,0xFB,0x60,0x06,0x62,0x4C,0x42,0x1E,0x60, + + 0x88,0x6E,0x0C,0x24,0xEB,0xEF,0x3C,0x08,0x85,0xB6,0x60,0x5C,0x81,0x46,0x2C,0x6F, + + 0x25,0x1C,0x0C,0x85,0x13,0xD5,0x88,0x58,0x84,0xB7,0xC7,0xC8,0xAF,0x2E,0x5E,0x5D, + + 0x13,0x89,0x0D,0x34,0x7C,0xD1,0x81,0x4D,0x05,0xB4,0x8E,0x2D,0xF5,0x52,0xD5,0x9B, + + 0x7A,0x0C,0x76,0x95,0xCA,0x33,0x89,0xF9,0x2C,0x97,0x3A,0x64,0x56,0xCE,0x22,0xC5, + + 0x87,0x87,0xCB,0x9C,0x18,0x28,0x49,0xD3,0xE2,0xC8,0xC9,0x68,0xCD,0x04,0xED,0xD9, + + 0xA3,0xC1,0x4C,0x59,0xCE,0xE3,0xEC,0x5D,0x90,0xE5,0x05,0x84,0xA6,0x8A,0x1D,0xE7, + + 0x18,0xB6,0xCB,0xC1,0x98,0x1A,0x8F,0xEB,0x02,0xD9,0x9C,0x85,0x17,0xCA,0xC9,0xB1, + + 0x4C,0x98,0xD6,0x5C,0x5E,0xF3,0x40,0xC2,0x63,0xCB,0x6D,0x06,0x54,0xF5,0x78,0xA8, + + 0xF9,0x33,0x4E,0x2C,0x98,0x3F,0x1F,0xE4,0xA5,0xBC,0x8C,0xF0,0x87,0xB9,0x1E,0x6B, + + 0x54,0x72,0x06,0x3C,0xE2,0x36,0x10,0xBC,0xFC,0x85,0x05,0xAC,0x5D,0xB7,0xF9,0xD0, + + 0xC7,0x81,0x73,0xA9,0x52,0xD9,0x9E,0x49,0x40,0xC6,0x88,0x45,0x17,0xF5,0x71,0x90, + + 0xAD,0x30,0x6F,0x9F,0xEB,0x65,0x11,0xBC,0x78,0x25,0xFC,0x41,0x05,0xF4,0xD2,0xA8, + + 0x0A,0x96,0x87,0x8E,0x6E,0x13,0x8E,0x99,0xCD,0xCC,0x49,0xD3,0x81,0x21,0xD0,0x53, + + 0x0B,0xEA,0xD1,0x50,0xC4,0x20,0x81,0x84,0x59,0x02,0x81,0xA4,0x51,0x61,0xE5,0xDC, + + 0x0D,0xAE,0x47,0xB1,0x20,0x61,0x8F,0xCF,0x13,0xAF,0x23,0x11,0x07,0x9D,0x94,0xCE, + + 0x02,0x30,0x8A,0x25,0xE3,0x11,0x40,0x52,0x14,0x42,0xD6,0x5A,0x6E,0xFD,0xEE,0x15, + + 0x9E,0x9D,0x64,0xE2,0x00,0xAB,0xEB,0x07,0xE1,0xBF,0x96,0xDF,0xA5,0x0E,0x89,0x6B, + + 0x9F,0xBE,0xD2,0x11,0x9F,0x6E,0x42,0x31,0xCF,0xFE,0x7D,0x42,0x30,0x41,0xE0,0x6B, + + 0x1A,0x0A,0x01,0x82,0x37,0x32,0x81,0x53,0x4E,0xDD,0xF6,0x65,0xC2,0x79,0x32,0x9F, + + 0x72,0x1E,0xD3,0x05,0xBE,0xA6,0x43,0x35,0x4F,0x9C,0x81,0x3C,0xB6,0x23,0xBF,0x32, + + 0xD4,0xDB,0x77,0x29,0x65,0x24,0x40,0x49,0x0D,0x28,0xEA,0xF7,0x6F,0x26,0x76,0x9C, + + 0x05,0xF6,0x08,0xE9,0x4E,0x2F,0xCE,0x86,0x60,0x05,0x18,0xC9,0x74,0x7E,0xED,0x3E, + + 0x48,0x7C,0x2D,0x36,0x8D,0xD0,0x08,0xFA,0x27,0xE0,0x06,0xB1,0xD1,0x86,0x86,0x91, + + 0xC3,0xD2,0x8B,0x12,0x72,0x81,0xB1,0x49,0xE1,0xD6,0xBE,0x81,0xC7,0x7C,0x67,0xE2, + + 0x54,0xA6,0x94,0x0A,0xF3,0x6C,0x48,0x2D,0xC6,0xB7,0xD3,0x5F,0x34,0xA9,0xF7,0x6A, + + 0xD8,0x56,0xF4,0x1B,0x3D,0xA4,0x22,0xD3,0xE5,0x44,0xC3,0xB3,0xBE,0x7B,0x7B,0xC7, + + 0x69,0xB6,0xBD,0xEF,0xF2,0x4E,0x83,0x4B,0x7B,0x2F,0x69,0x2F,0xC2,0xE7,0x31,0x53, + + 0x32,0x4A,0xF5,0x28,0x66,0x86,0xE2,0x1E,0x68,0x34,0x61,0x3F,0xD3,0x70,0x8B,0x77, + + 0x15,0x17,0x5F,0xB7,0xFB,0xAA,0x4A,0xEC,0x34,0x7F,0xB5,0x1A,0x79,0xEC,0x02,0xC9, + + 0xFE,0x42,0x14,0x3A,0xC1,0xB0,0x5B,0x1E,0xB0,0x21,0x76,0x0F,0x44,0xCB,0x7C,0xCD, + + 0xF4,0x3C,0xC3,0xB7,0x17,0x35,0x0A,0x07,0x6F,0xD1,0x8D,0x95,0xDE,0x2F,0x4A,0x26, + + 0x2C,0x0C,0x0B,0xE0,0xC1,0x25,0xE4,0xE2,0x34,0x92,0x46,0xF9,0xA5,0x97,0x8C,0x62, + + 0x91,0x86,0xE6,0x84,0xD7,0x2B,0xEC,0xA8,0x9D,0x1F,0x75,0xD7,0x1C,0xB1,0x14,0x8D, + + 0xD0,0x7D,0x32,0x88,0x13,0x20,0xB8,0x52,0xE2,0x35,0x1C,0xC6,0x96,0x6A,0x0B,0x63, + + 0x84,0x0F,0x63,0xF3,0xA0,0x31,0x85,0x8B,0x64,0xF6,0x6F,0xD6,0xA3,0x7B,0xC9,0x6B, + + 0x58,0x71,0x0D,0x53,0xDD,0x7D,0x75,0xB7,0xE7,0xD3,0x7C,0xC3,0x7E,0xF5,0xBE,0xB6, + + 0xAD,0x92,0xCC,0xC0,0xB2,0xDC,0x9E,0x20,0x60,0x38,0xB4,0xE6,0x0B,0x79,0xB6,0x70, + + 0x0F,0x65,0xCD,0xB2,0xC8,0x59,0x4D,0x16,0x71,0x18,0x19,0x16,0x40,0xE5,0x41,0x81, + + 0xA0,0x9B,0x9C,0xAB,0x17,0xA9,0x0C,0x8E,0x47,0xF0,0x9F,0xF8,0x70,0x75,0x8D,0x29, + + 0xCC,0x1D,0xF3,0x18,0x69,0x88,0x3F,0xF1,0x44,0x4C,0x65,0x0B,0xE3,0x3A,0x79,0xF6, + + 0x26,0xC7,0x97,0x64,0xF6,0xF3,0x7D,0x2C,0x28,0xC6,0x97,0xEC,0x3C,0xF5,0x72,0xBC, + + 0x98,0x10,0x9E,0xB0,0x72,0x22,0x1C,0x62,0x88,0x32,0x0E,0x9C,0x1D,0xB9,0xB8,0x0C, + + 0x57,0x04,0x83,0x85,0xDF,0xAB,0xD7,0xB9,0x3B,0x18,0x6D,0x5C,0x8B,0x5A,0x88,0xE6, + + 0x24,0x78,0x01,0xFB,0x4E,0x90,0x25,0x3E,0x45,0xF7,0x8F,0x90,0xF5,0x7A,0xC4,0x39, + + 0x59,0x9C,0xF8,0x00,0xE8,0xA3,0x31,0x1C,0x7E,0x47,0x29,0x68,0x04,0x71,0xDA,0xDC, + + 0xA2,0x32,0xD4,0xDE,0x88,0xA0,0x62,0x6A,0x6D,0xAE,0xBE,0x5C,0x63,0x72,0xEF,0xF4, + + 0x8E,0x1F,0x2B,0xB6,0x64,0xE3,0x30,0x9F,0xC9,0x6C,0x8E,0x78,0x5F,0x81,0x1F,0xED, + + 0xAF,0x33,0xD5,0xDF,0x29,0x37,0x0A,0x11,0x35,0x92,0x86,0x74,0xD9,0xCF,0x9D,0x9D, + + 0xEF,0x8F,0x3D,0x41,0x1A,0x0F,0xA0,0x58,0xA3,0xD0,0x51,0x50,0xA3,0x8E,0x15,0x89, + + 0x00,0x8E,0xB0,0x07,0x7E,0x40,0xC2,0x3A,0xB8,0x0E,0x5F,0xC0,0xD5,0x61,0x98,0x9D, + + 0x81,0x8D,0xB0,0xEF,0x19,0xEF,0x0E,0xD5,0xD4,0x1F,0x56,0x67,0x9C,0x3F,0x12,0x63, + + 0x05,0x9F,0xAD,0xEA,0x91,0xA0,0xA9,0x49,0x66,0xA6,0x83,0xDF,0x43,0x2C,0xF4,0x5B, + + 0x00,0x1F,0xE5,0xAE,0xCC,0x69,0x13,0x9C,0xBE,0xD5,0xB8,0xEF,0xDB,0x69,0x31,0x28, + + 0xA0,0x95,0x7E,0xA0,0x24,0x13,0x1F,0x82,0xC7,0xDA,0x38,0xB6,0x55,0xFE,0xBF,0x83, + + 0x96,0x0B,0xF9,0x57,0x1B,0x00,0x2A,0x63,0x49,0x3B,0x97,0x0A,0xD0,0x15,0x91,0x51, + + 0xA3,0x9C,0x53,0xB7,0x93,0xE9,0xE2,0xF9,0xC6,0x97,0x1A,0x04,0xBB,0x26,0x38,0x08, + + 0x9E,0x20,0xB3,0x0B,0x3E,0x09,0x0D,0xC8,0xE0,0x15,0xEB,0xA0,0xB9,0x86,0x54,0xF8, + + 0xB8,0x5F,0x06,0xF6,0x8F,0x64,0xAA,0x40,0xEA,0xD9,0x52,0x12,0xBC,0x26,0x5B,0x2F, + + 0x31,0x7C,0x20,0x7C,0xF0,0x15,0x4B,0x0C,0x31,0xC5,0xD1,0x23,0xDD,0x6A,0xA3,0xF9, + + 0x34,0x3D,0xCC,0xE9,0x8F,0x66,0x04,0xDD,0xDD,0x16,0xEB,0x13,0xCB,0xF0,0x52,0xBE, + + 0x0A,0x88,0xF1,0xEE,0x6E,0x25,0x2B,0x05,0xEB,0x7D,0x08,0x18,0xD3,0x6A,0x92,0x52, + + 0xA8,0x96,0xB3,0x8E,0xBA,0xA6,0x5A,0xEA,0xC2,0x40,0xA1,0x7B,0x7B,0x60,0xF3,0x39, + + 0xBD,0x13,0xDD,0x97,0xBD,0xA6,0x8B,0xE3,0x6B,0x5D,0xF5,0x2F,0xCE,0x45,0x5B,0x28, + + 0xE3,0x4E,0x3E,0xDB,0xE1,0xF7,0x1D,0x53,0xC9,0x3C,0xA2,0xE1,0x38,0xAE,0xDB,0xFC, + + 0x0A,0x4F,0xDC,0x97,0xD4,0x31,0x90,0xF1,0xC7,0x7C,0x20,0x57,0x72,0x1B,0xF8,0x68, + + 0xB6,0xBE,0x14,0x6C,0xBA,0x07,0x15,0x50,0xC9,0x7D,0x84,0x16,0x98,0xB1,0x1A,0x26, + + 0x5F,0x0F,0xA3,0x7C,0x87,0x18,0x91,0xE9,0x2D,0x96,0xA5,0x25,0x74,0x2B,0xBD,0xE5, + + 0x56,0x83,0xA5,0x8F,0x86,0xC5,0x99,0xE0,0x46,0x7F,0x15,0x92,0x1C,0x69,0x18,0x46, + + 0x58,0xCC,0xE1,0x42,0x48,0xFF,0xD8,0x67,0x9D,0xB8,0xF7,0x80,0xF4,0xF7,0xD6,0x57, + + 0x29,0x1F,0xCC,0xE7,0xB8,0x08,0x05,0x8E,0xF5,0xDF,0xFB,0x84,0xD4,0xF1,0x2D,0x33, + + 0x95,0x60,0xBC,0x5C,0xD1,0xF5,0xCA,0x78,0x85,0xD2,0x72,0x05,0x74,0xF5,0xBA,0x2C, + + 0x5C,0xF9,0x8B,0xFF,0xD4,0xB3,0x7F,0x1B,0x3D,0x1C,0xFC,0x88,0x50,0xF1,0x9C,0x71, + + 0x3C,0x55,0x1C,0x49,0xFE,0x98,0x92,0xE0,0xA5,0x9C,0xEE,0xEB,0x4F,0x33,0xBE,0xF8, + + 0xDE,0xFC,0x8E,0x0A,0xCC,0x12,0x56,0xBC,0x8C,0xBF,0x41,0xC0,0x5F,0x14,0xDC,0x83, + + 0x49,0x65,0xEF,0xAE,0xDB,0x9A,0x1E,0x8F,0x6F,0xBE,0x0F,0x51,0xEC,0xB7,0x17,0x60, + + 0x01,0x96,0xD7,0x8E,0x5D,0x3A,0xC7,0xB3,0x8E,0xFB,0x39,0xF8,0x1C,0x0D,0x58,0x07, + + 0xF4,0xDE,0x9F,0xB6,0xAC,0xB4,0xA6,0x4A,0x42,0x7C,0xA6,0xF7,0x1D,0xDC,0xC2,0xA8, + + 0xF1,0xDF,0xCE,0x5F,0x0C,0xE0,0x89,0xBD,0x5C,0x6B,0x63,0x06,0xFF,0x46,0xB0,0x96, + + 0xAD,0xEE,0xE1,0x4B,0xC0,0xF5,0x67,0xDF,0xEA,0xF3,0x8F,0x13,0x7E,0x05,0xB8,0x5F, + + 0xAE,0xFF,0x2F,0x62,0x81,0xD3,0xC5,0x68,0x83,0x10,0xE4,0xFB,0x91,0xD3,0x10,0x05, + + 0x0C,0x42,0xEE,0x44,0x1C,0x21,0xCD,0x7F,0xE7,0x50,0x54,0xF4,0x0E,0x61,0xC8,0x59, + + 0x24,0x00,0x30,0xA6,0x15,0x13,0xA0,0xCF,0x51,0x0C,0x5C,0xB0,0x72,0xF3,0x08,0xF8, + + 0x05,0x62,0xD1,0x98,0xA3,0x08,0xAE,0xC7,0xF3,0xF5,0xA9,0xB1,0xF0,0xE0,0x1B,0x05, + + 0x87,0x69,0xD0,0x52,0x34,0xDC,0x40,0xCD,0x1C,0x0C,0xC0,0xCC,0x34,0x6A,0x42,0x80, + + 0x46,0x49,0x9A,0x26,0xD8,0xD5,0x02,0xE0,0xA3,0xEB,0xEA,0x9F,0x2D,0xFC,0x90,0xB8, + + 0xF1,0x48,0xB0,0x73,0xFA,0x26,0x3E,0x11,0x42,0x05,0x8B,0x06,0xB8,0x74,0x43,0xA7, + + 0xA2,0xD6,0x89,0x50,0x7B,0xD7,0xC7,0x12,0xAE,0x2A,0x0A,0x4A,0xD4,0x9E,0x4B,0xB7, + + 0xB0,0x4B,0xB1,0xA5,0x15,0x86,0x7D,0x53,0x2A,0xEE,0xE7,0x5D,0x5E,0xC1,0xF1,0x0C, + + 0x07,0x0E,0xDB,0xE5,0x1E,0x9A,0x13,0x57,0xEF,0x4C,0x94,0x8C,0x0C,0x28,0x72,0x49, + + 0xE2,0xC1,0xD3,0xF5,0xBC,0xDF,0x12,0x07,0x74,0x52,0x22,0xD4,0xD5,0xA6,0xC3,0x95, + + 0xB9,0xAE,0x9B,0x89,0xC2,0x5F,0x19,0x5A,0x9B,0x41,0x9F,0xC0,0xEB,0x6E,0xD0,0x1A, + + 0xF6,0x07,0xCA,0x7B,0x4F,0x23,0xC6,0xDF,0xD9,0xB6,0x42,0x92,0xE6,0x69,0xFA,0xA0, + + 0x85,0x43,0x54,0xBF,0x9E,0xA1,0x2D,0x90,0x4A,0x37,0xCC,0xAC,0x0E,0x2E,0x5E,0xB0, + + 0x00,0x40,0xF2,0xBC,0x5F,0x2B,0xED,0xC8,0xBF,0x2E,0x1A,0x3C,0x1B,0xED,0x83,0x51, + + 0x2B,0x42,0x91,0x63,0x71,0x4A,0xC6,0x98,0x8B,0xFF,0xDB,0x6D,0xBA,0xD6,0xB4,0xB9, + + 0xC3,0x0E,0x66,0xBC,0x3A,0xAF,0x9B,0x20,0xAA,0xC2,0xA3,0x6C,0xEB,0x6B,0x4E,0x15, + + 0x02,0x13,0x80,0x1C,0x03,0x5C,0x0A,0xD4,0xF2,0x58,0xCB,0x24,0x03,0x07,0xCC,0x40, + + 0xF6,0xCA,0x10,0xE6,0x5B,0x78,0x45,0x71,0xC4,0x5A,0xE2,0x7D,0x77,0x69,0x81,0x05, + + 0x86,0x89,0x3D,0xB4,0x9D,0x9D,0x91,0x81,0xC2,0x70,0x55,0x61,0x18,0xFF,0xFA,0x6C, + + 0x52,0x66,0xF3,0xF1,0xB7,0x81,0x1E,0xA1,0x46,0xDE,0x4A,0x31,0x97,0xD5,0xC4,0xD4, + + 0xC3,0x0F,0x40,0x35,0x0A,0xB4,0xC3,0x40,0x8F,0x24,0xAA,0xC9,0xFF,0xD9,0x8C,0xA4, + + 0xD6,0x57,0xD9,0xFC,0xDA,0x24,0x22,0x50,0x82,0xF3,0xE2,0x55,0xA5,0xDA,0x1C,0x27, + + 0xB2,0x59,0xFF,0x36,0x86,0x92,0xF9,0x93,0x28,0x55,0x05,0x7A,0x19,0xA7,0xD0,0xFD, + + 0xA5,0x14,0x21,0x47,0xB3,0x3F,0xCA,0x02,0x9F,0x3B,0xCA,0x55,0x1E,0xD7,0x1B,0xA6, + + 0x19,0x95,0x33,0xFF,0x15,0xCE,0x76,0xE3,0x6D,0x57,0xC6,0x2D,0x71,0x63,0xE2,0x70, + + 0xF7,0x5B,0x88,0xEE,0xBB,0x05,0xE6,0x7F,0x5A,0xFE,0xC8,0x54,0xFC,0x34,0x78,0x0D, + + 0xF5,0x89,0xB9,0xE9,0x6E,0x32,0x4E,0x41,0x4F,0x4A,0x7B,0xCB,0x07,0x73,0x4C,0xFE, + + 0xA8,0xB9,0x07,0x7F,0xBF,0x40,0xDF,0x21,0x44,0x53,0x64,0xDD,0x85,0x82,0xA8,0x4A, + + 0xAA,0xA7,0xC3,0xBF,0x0A,0x5E,0x36,0xA7,0x45,0x51,0xEC,0x1F,0x02,0xD3,0xCA,0x5C, + + 0x52,0x0C,0xEE,0x3E,0x3D,0x35,0x86,0x9A,0xA1,0xAC,0x60,0xED,0x9A,0xD2,0x7F,0x19, + + 0xF6,0x17,0xB9,0xE5,0xF2,0x6F,0x31,0x49,0x68,0x22,0x44,0x9E,0xC6,0x7D,0x8F,0x68, + + 0xE4,0x5D,0x06,0xE2,0xD9,0xEA,0x17,0xC4,0xED,0x57,0x4A,0x0E,0x8B,0xD2,0xF9,0xAD, + + 0x3B,0x82,0xA2,0x74,0x27,0x8A,0xC8,0xCA,0x87,0x8D,0x1F,0x49,0x89,0x3C,0xE8,0x4A, + + 0x0E,0x7A,0x4D,0x78,0x74,0xA5,0xE3,0x48,0xE2,0xD1,0x70,0x54,0x16,0x11,0x7E,0x89, + + 0xF7,0xF6,0x59,0x40,0x7D,0xD8,0x4E,0xDB,0xC4,0xD9,0x08,0x79,0x56,0xE6,0x2D,0x97, + + 0xF1,0xAF,0xD0,0x64,0x82,0x2A,0x06,0xD5,0x48,0x6E,0xC6,0xCF,0xD5,0x47,0xA6,0x46, + + 0xED,0x1E,0x98,0xB7,0x5B,0xA4,0x0E,0xC3,0xAD,0x87,0x4D,0x21,0xB7,0x42,0x10,0x32, + + 0x13,0xC8,0x7B,0x6C,0x6F,0xE7,0xD4,0xE1,0x2E,0xCF,0x9E,0x4F,0xBC,0xC6,0x38,0xBA, + + 0x23,0x0C,0xC7,0x36,0x87,0x13,0x0F,0x4B,0x2F,0xD7,0x62,0x94,0xF0,0x6B,0x7B,0xB1, + + 0x20,0xCA,0xEA,0x85,0x91,0xAF,0xFF,0xF7,0xC6,0x95,0x87,0x4A,0x1F,0xA4,0xE2,0x3E, + + 0xC2,0xCA,0x82,0x84,0x1F,0xF9,0xFF,0xB5,0x2F,0xCC,0xAB,0x7B,0x94,0xD1,0xAE,0x9E, + + 0x02,0x8F,0x2E,0x3E,0x3F,0xE8,0x72,0xA7,0xC0,0x64,0x61,0x91,0x22,0xEB,0xE9,0x33, + + 0xAE,0x5A,0x63,0x96,0x57,0xA2,0x4A,0x5A,0xDB,0xDC,0xBA,0xAB,0xC1,0x6C,0xEB,0xF3, + + 0x8D,0xC9,0xF2,0xDE,0x38,0x2C,0xA5,0xA0,0xAE,0xCF,0x0E,0x56,0x69,0xF2,0x28,0x57, + + 0x3D,0x7B,0xE8,0xB6,0x1E,0x17,0x74,0x42,0xCE,0x83,0xA2,0xEC,0xC3,0x67,0x6C,0xB2, + + 0xF1,0xC0,0x55,0x4E,0xF4,0x9C,0xA8,0x69,0x65,0x3C,0x05,0x4F,0x79,0x42,0x9B,0x38, + + 0xDD,0x85,0xEB,0xCB,0x9A,0xFC,0x44,0x1A,0xC8,0xC6,0xCB,0x91,0x72,0xE3,0x73,0x57, + + 0x72,0x08,0x47,0xCD,0xDF,0xA5,0x5D,0xDF,0xED,0x62,0xE8,0x0C,0xF5,0x3C,0xC8,0x6A, + + 0x88,0xDD,0x2F,0x02,0x29,0x90,0xB6,0xD1,0x37,0xDB,0xAC,0xAA,0x47,0x67,0xEC,0x0A, + + 0x94,0x9B,0x6F,0x8F,0x17,0xBC,0x1C,0xCF,0xC4,0xD8,0xB4,0xB2,0x94,0xBE,0x43,0xF6, + + 0x4D,0x5B,0x65,0xF7,0xC1,0xF0,0xB5,0xE5,0xAA,0xD4,0x0D,0x60,0x36,0x72,0xA9,0xB3, + + 0x87,0x33,0xAE,0xB7,0xE7,0x83,0x61,0xC0,0xD8,0xAC,0xE4,0x70,0x50,0x0C,0xAE,0xDE, + + 0x04,0xC6,0x30,0x42,0x35,0x0B,0x7E,0x91,0x5B,0xB8,0x67,0xD8,0x0E,0xE1,0x2E,0x34, + + 0x82,0x9E,0xEC,0xED,0x03,0x4E,0x1B,0x02,0xE7,0xCA,0x57,0xD0,0x9A,0x97,0x62,0x2B, + + 0x2E,0xDB,0xDB,0xB6,0x09,0xED,0xB1,0x18,0x6B,0x2B,0x64,0xEF,0x76,0x36,0x6B,0x95, + + 0xB1,0xD5,0xAD,0x2B,0x0B,0xF5,0xE6,0x79,0xE4,0x65,0x56,0x72,0x64,0xE8,0x18,0x6F, + + 0xCE,0x8C,0xC6,0xC5,0x5D,0xB5,0xEF,0xAA,0xE1,0x75,0xEF,0xE8,0xD9,0x01,0xD6,0x72, + + 0xCF,0xD4,0xD5,0x1C,0xBD,0x61,0x47,0xCB,0x7A,0xCF,0xE4,0xAE,0xDA,0xE2,0x37,0xF9, + + 0x9F,0xB0,0xBF,0x8A,0xBA,0x19,0xFA,0x24,0x8F,0xDE,0xEF,0xBE,0xCF,0x6D,0xD0,0x93, + + 0x08,0x80,0x97,0x60,0xB3,0xD9,0x77,0x8E,0xEB,0x69,0xCC,0xD9,0x70,0x7D,0xEC,0x47, + + 0x28,0xB6,0xED,0xF0,0x38,0xB4,0x48,0xD7,0xCD,0xB9,0x89,0x9D,0x0E,0x29,0x64,0xDB, + + 0x88,0xDC,0x5B,0x5A,0x34,0x6A,0x1E,0xB5,0x04,0xD0,0xDE,0xEA,0xAA,0xB8,0xA0,0x23, + + 0xBA,0xD3,0x2E,0x32,0xBC,0x65,0x49,0x4B,0x4D,0xB2,0x62,0xC5,0xCA,0xEE,0x31,0x7E, + + 0x11,0x34,0x32,0x9B,0x88,0xBF,0x19,0x5B,0x6D,0xA3,0x41,0x7A,0x2A,0x9D,0x69,0xEA, + + 0xFF,0x6C,0x84,0xC4,0x78,0x8D,0x10,0x33,0x29,0x58,0xD7,0x56,0x56,0xB2,0xD7,0xAD, + + 0xE0,0xDE,0x90,0x05,0x33,0xD3,0xD8,0x28,0x82,0xEC,0x80,0x31,0xAF,0xE1,0x63,0x41, + + 0x81,0x42,0xCA,0xE5,0x9C,0xDF,0x26,0x85,0x30,0x61,0x49,0xDA,0xB1,0x22,0x57,0x3D, + + 0x7E,0xF3,0x09,0x56,0x6D,0x38,0x07,0xC0,0x62,0x03,0x1B,0xB7,0x40,0x76,0xC0,0x03, + + 0xA1,0x05,0xFA,0xB7,0x41,0x3F,0x13,0x0A,0x43,0xE4,0x74,0x06,0xA1,0x01,0x88,0xCC, + + 0x77,0x0F,0x99,0x4B,0x29,0xA8,0x62,0xF4,0x15,0x0E,0xE3,0xC8,0xB8,0x36,0x55,0x45, + + 0x0B,0x09,0x36,0xA3,0xB6,0xF2,0x0B,0x21,0xC4,0xF4,0xE9,0x58,0x39,0x15,0xC9,0x12, + + 0x20,0x1C,0xB7,0xE9,0x7A,0xF4,0xA6,0x01,0xE3,0x4E,0x35,0x06,0xED,0xC1,0x3D,0x18, + + 0xE3,0x19,0x75,0x6A,0xE7,0x21,0x20,0x16,0xEB,0xE9,0xAA,0x3C,0xFB,0x6E,0x42,0x28, + + 0x6A,0x91,0xB4,0xC4,0x78,0x09,0x4C,0x9D,0xA2,0x2A,0x98,0x2D,0x5F,0xFB,0x3D,0x21, + + 0x07,0xFC,0x07,0xE5,0xE3,0x65,0x41,0xDA,0xAA,0x97,0xBA,0x43,0x79,0xED,0xCB,0x59, + + 0x8D,0xB4,0x93,0x19,0x10,0xD9,0x1D,0x0C,0xC0,0xEF,0xA3,0x7D,0xC1,0x6D,0x0E,0xB8, + + 0x0E,0x43,0x6E,0xDF,0x33,0x24,0xD6,0xD7,0x4B,0x8C,0x4F,0x9C,0xDA,0xC5,0xB2,0xA9, + + 0x7A,0xF2,0xD4,0xA7,0x68,0x2D,0x58,0x9A,0xC9,0x51,0x83,0xAD,0xDB,0x3F,0x1A,0x38, + + 0xE9,0xAE,0x43,0x2E,0x69,0x83,0x33,0x23,0x7A,0x43,0x02,0xE7,0xDB,0xEE,0x71,0xBB, + + 0xAF,0x14,0x16,0xE5,0xF0,0xA7,0xE2,0x1B,0x29,0x47,0x77,0x0F,0x11,0x16,0x50,0x73, + + 0x06,0xBF,0x44,0x1D,0xFC,0x38,0xEF,0xDF,0x6E,0xAF,0xAE,0x5B,0x76,0x68,0x1D,0xD7, + + 0xEB,0xB8,0xB4,0x6B,0xD8,0xA8,0x64,0x97,0x9C,0x5E,0x27,0xAB,0xD2,0x33,0x10,0x72, + + 0x90,0xBF,0x86,0x07,0x30,0x59,0x75,0xEE,0x83,0x8F,0xEF,0x27,0x61,0x6F,0x45,0x09, + + 0xA7,0x1B,0x6A,0xD5,0xB5,0x1F,0x27,0x33,0x7C,0x18,0x1D,0x75,0x73,0x77,0x7E,0x33, + + 0x07,0xBB,0xFA,0x7C,0x53,0x30,0x4F,0x64,0x38,0x29,0xCE,0xE6,0xC1,0xD9,0x8C,0x49, + + 0xD6,0x1D,0xEC,0x5E,0x32,0xF5,0xA3,0x83,0x12,0x3B,0xD4,0xE0,0xBB,0xE6,0xD9,0x43, + + 0x22,0x7D,0xBC,0xB6,0x84,0xBF,0x5D,0xCD,0x4E,0x5B,0x86,0x95,0x72,0x60,0xCD,0x92, + + 0x00,0x11,0xEB,0x79,0xC1,0x93,0xBA,0x31,0xCB,0x4C,0x14,0xE6,0x89,0x0D,0x06,0x77, + + 0xA5,0xBE,0xFE,0x0E,0xA9,0x65,0x6E,0x8F,0xCB,0x19,0xCA,0xCE,0x87,0x14,0x9F,0xA8, + + 0x2D,0xC6,0x4E,0x04,0x98,0x31,0xA9,0x08,0x9D,0x3A,0x79,0x3E,0xE8,0x64,0x96,0xC9, + + 0xF4,0xB7,0xBF,0x3F,0xB0,0x6A,0xA2,0x19,0x5C,0x39,0xF7,0xE7,0x41,0x77,0xB0,0x5E, + + 0x7F,0x11,0x89,0x6D,0xBD,0x79,0xDF,0xF4,0x2B,0x1A,0xA7,0x2F,0xF9,0x73,0x6F,0xA6, + + 0x8B,0x9B,0x13,0x75,0xB7,0x91,0xA1,0x8E,0x49,0xCE,0x88,0x0E,0x7E,0xD1,0x95,0x5C, + + 0x79,0x00,0xEE,0x36,0x52,0xAE,0x46,0x6C,0x6D,0x8F,0xA0,0xFA,0x92,0x72,0x07,0xD0, + + 0xAC,0xAC,0x90,0x5E,0xA9,0xB5,0x0E,0x10,0x4F,0xA1,0x04,0xDF,0x9A,0x7C,0x47,0xC8, + + 0xC8,0x1E,0xAE,0x1D,0xAC,0x92,0xCC,0xB9,0xE1,0x44,0x8D,0xD2,0x10,0x1B,0x7A,0x4F, + + 0x02,0x88,0xC0,0x4C,0xA1,0xAD,0x50,0x6D,0x6F,0xCD,0x99,0x0C,0xF5,0x8E,0x27,0x96, + + 0x04,0xC1,0x84,0x29,0x97,0xBD,0xA9,0x40,0xE6,0xC7,0x94,0x09,0xD7,0xFD,0xA1,0x3A, + + 0x7F,0x09,0xEB,0xE5,0xB5,0xE2,0xDD,0xB1,0x55,0xCA,0xD3,0x36,0xD5,0xA2,0x3E,0xE0, + + 0xBD,0xED,0x10,0x75,0xB6,0xF3,0x94,0xC3,0x64,0x1C,0x00,0x55,0x2A,0x6A,0x3F,0x24, + + 0x25,0xC4,0x31,0xB7,0x5F,0xE4,0x76,0xE6,0x14,0xC9,0x0F,0x14,0x94,0xE4,0xB0,0x32, + + 0x03,0xA9,0x28,0x16,0x76,0x08,0x49,0x10,0xC8,0x43,0x1F,0x08,0x36,0xE1,0x4D,0xA1, + + 0x80,0x54,0x56,0xEE,0x62,0xB5,0x79,0x6A,0x44,0xDA,0x0A,0x20,0x3F,0x95,0xDE,0xD1, + + 0x16,0xDA,0x38,0xF7,0x7A,0xE6,0x7F,0x33,0xCB,0x87,0x80,0x04,0xE1,0x6E,0xC1,0x4A, + + 0x40,0x5D,0x62,0x96,0xBD,0xA2,0x86,0x48,0xB3,0xCE,0xB6,0x4E,0x14,0x15,0x54,0x36, + + 0x45,0x98,0x69,0x3B,0xFC,0x06,0xC5,0xB8,0xD0,0x82,0xBC,0x46,0xD2,0xAB,0x36,0x78, + + 0xBC,0x08,0xA5,0xFF,0x94,0xE8,0x9E,0xCE,0x6D,0x3B,0xA9,0x2A,0xFF,0xA9,0x0B,0xCD, + + 0x6C,0x24,0x33,0xEC,0xB0,0xC7,0x03,0x87,0x40,0xA9,0xFC,0x28,0xDE,0xBA,0x5A,0xAA, + + 0x56,0xCE,0x4E,0x3C,0xD4,0xDF,0x7D,0xDF,0xCC,0xD0,0xD2,0xE4,0x5D,0x4C,0x53,0x9A, + + 0x47,0x06,0x3B,0xAD,0x29,0xC3,0x3A,0x1A,0x0F,0x30,0x02,0xB9,0xB6,0x5E,0x24,0xB7, + + 0x88,0x1C,0x9D,0xE2,0x7F,0x08,0xCA,0x09,0x31,0x47,0xAA,0x3A,0x7B,0x6E,0x2B,0xDF, + + 0xD9,0xEE,0xD5,0xF2,0x55,0x1C,0x09,0xDB,0xCB,0x6F,0x9D,0xB2,0x36,0xB5,0x22,0x06, + + 0x25,0xC2,0xE3,0xF4,0xB6,0xAC,0x6D,0x63,0xC1,0x59,0xB1,0x4E,0x7F,0x7B,0x0C,0x49, + + 0xCC,0xA0,0xAD,0x12,0x67,0xBC,0x5C,0xF8,0xD0,0xDE,0x43,0x92,0x73,0x43,0x23,0xAA, + + 0xEC,0x83,0x1C,0xE5,0x56,0xF2,0x31,0xC3,0xA0,0x5F,0x35,0x41,0x9F,0x6B,0xC1,0x01, + + 0xA5,0x9B,0xE5,0x92,0xD6,0xD3,0xAD,0x5B,0x60,0x9E,0x00,0x77,0xF1,0xDF,0xA4,0x5B, + + 0xC7,0x92,0xFA,0xF6,0xC9,0x4B,0x38,0x12,0x62,0x9B,0xCA,0x5E,0xD5,0x91,0x7C,0xDF, + + 0x21,0x27,0x53,0xE7,0x96,0x4A,0x23,0x14,0x0C,0x4C,0xE2,0x07,0xD4,0xB5,0x4C,0xAD, + + 0x07,0x11,0xDF,0x77,0x49,0x69,0xCA,0xB3,0xE5,0xCD,0xCB,0x5E,0x55,0x5B,0xB6,0x57, + + 0xF5,0x8A,0x56,0x72,0x40,0x1A,0x86,0x81,0x44,0x96,0xCF,0xC9,0x54,0x56,0xA0,0xB1, + + 0x14,0xDA,0xDE,0x0C,0xAD,0xE5,0xC9,0x6D,0xAE,0xF8,0xCE,0x89,0xDD,0x07,0x08,0xA7, + + 0x07,0x3D,0x6E,0x06,0x9C,0xB1,0x86,0xCA,0x25,0xD0,0xB6,0xBA,0xF4,0xF6,0x2F,0x3F, + + 0x2C,0x5A,0x9F,0x3D,0xB0,0xEA,0x7F,0x0F,0xDF,0x64,0x89,0xD7,0x73,0x0C,0x7F,0x3F, + + 0xC6,0x73,0xA9,0x6F,0xFD,0xF9,0xAA,0xC8,0xBE,0x5D,0xE6,0xF9,0x58,0xF2,0x2E,0xCF, + + 0x4D,0x9F,0xB3,0xF3,0xD5,0xF8,0x48,0x32,0x4D,0x4C,0xA3,0x1D,0x44,0x21,0x56,0x68, + + 0x0D,0x2D,0xE6,0x5B,0xC0,0x19,0xF8,0x78,0xFE,0x80,0xF8,0x42,0xD6,0x2D,0x1F,0x49, + + 0x3F,0xC3,0xD9,0x67,0xC8,0xFC,0x2E,0x54,0x4B,0xD5,0xA1,0x47,0x15,0xED,0xAF,0x42, + + 0xD8,0xDD,0xBA,0xD9,0x77,0xAC,0x07,0x13,0x94,0x90,0x6F,0xFF,0xFF,0xFF,0xFF,0x7A, + + 0x76,0xDF,0xD2,0x4F,0xFB,0x44,0x43,0xD3,0xC4,0xCB,0x35,0x22,0xC4,0x04,0xB3,0xB5, + + 0xF6,0x8A,0xB0,0x24,0x71,0x8E,0xBC,0x14,0xA8,0xA0,0x08,0xC4,0xA2,0xC0,0xBE,0x30, + + 0x21,0xFD,0x11,0x76,0xFC,0x83,0xE6,0x90,0xFE,0xED,0xA9,0xDB,0x7C,0x6F,0x49,0x2C, + + 0x6A,0x47,0x29,0x67,0xF3,0x1F,0x47,0xD3,0xC5,0x45,0x0C,0xC6,0x55,0xE8,0x72,0x64, + + 0xF6,0xE7,0xBE,0x42,0xFB,0x2B,0x31,0x44,0xFE,0x47,0x82,0x32,0xB9,0x00,0x88,0x55, + + 0x0F,0xD8,0x58,0x36,0xF8,0xC6,0x06,0x92,0x47,0xE8,0x71,0x0A,0xC6,0x24,0xF6,0xE9, + + 0x71,0xB9,0x93,0x6A,0x79,0x42,0xE0,0xC0,0x7A,0x05,0x41,0x2A,0x2F,0x1A,0xD9,0xA9, + + 0x83,0x45,0x7D,0x37,0x78,0x34,0x48,0x43,0x28,0x03,0xE7,0xC8,0xBB,0x6A,0x58,0xA7, + + 0x7E,0xA7,0xFC,0x0B,0x3C,0x6A,0x70,0xC4,0x4C,0xE8,0x65,0x9D,0x6C,0xC7,0x9C,0x9A, + + 0xCB,0x08,0x2D,0x21,0xED,0x1A,0x24,0x80,0x97,0xE6,0xA1,0x80,0xAE,0xF2,0xA7,0x6B, + + 0xAC,0xA7,0x03,0x81,0x4C,0xFB,0x94,0x8C,0x3F,0x26,0x37,0x09,0xA4,0x95,0x55,0xFB, + + 0x8D,0x4B,0x3C,0xB1,0xEA,0x2B,0x48,0x4A,0xF7,0x9D,0x9B,0xC4,0xD5,0x2B,0x46,0x1B, + + 0xF7,0x4D,0x2E,0xDF,0x3C,0x81,0x74,0x8A,0xC6,0x0C,0x2D,0x1F,0x2C,0x0F,0xDC,0xDC, + + 0x43,0xFD,0xF4,0xE9,0x7A,0x29,0x62,0x87,0xE7,0x40,0x4A,0x0F,0x7D,0xCC,0x1D,0xAB, + + 0x8E,0xA3,0x97,0x3D,0x1A,0x31,0xD3,0xEA,0xF9,0x2A,0x28,0x12,0xBA,0x6C,0x73,0x7D, + + 0xFC,0x0F,0xAA,0x79,0xF3,0x22,0xF4,0x9F,0xDB,0xB2,0xE3,0x82,0x32,0x4C,0xBC,0x13, + + 0x46,0xBD,0x84,0xBF,0x59,0xAB,0x82,0x91,0xC1,0xD1,0x86,0xD1,0x9B,0x34,0x74,0x18, + + 0x84,0x98,0x29,0x92,0xA5,0x55,0x4E,0xE6,0x8A,0x35,0x38,0x90,0x84,0x7E,0x53,0xF1, + + 0x20,0xBD,0x85,0x81,0xB8,0x55,0x1C,0x52,0x64,0xDF,0xAF,0x15,0x69,0xDD,0x2D,0x02, + + 0x02,0x52,0x39,0xB2,0x10,0xAC,0x8D,0xC2,0x8D,0xF2,0x29,0xCA,0x52,0xDE,0x76,0xF0, + + 0x20,0xBB,0x7B,0x22,0x16,0x5A,0x2C,0x82,0xD1,0x31,0x44,0x86,0x85,0x11,0x7F,0x23, + + 0xAF,0x54,0xF2,0x79,0x52,0x31,0xA5,0xD7,0xC2,0x2A,0x0C,0x8A,0xB9,0x56,0xE5,0xB2, + + 0x01,0x95,0xFB,0x69,0x78,0xA5,0x6D,0x0A,0x4E,0x5B,0xED,0x1A,0x7D,0xD0,0x75,0x2B, + + 0x0F,0x1A,0xB4,0xA6,0x89,0xBE,0xCD,0x7E,0x1C,0x8A,0x4D,0xC4,0x52,0xF6,0x38,0xBD, + + 0x43,0x17,0x32,0xEE,0x1C,0x95,0x2E,0x98,0x0D,0xF7,0x00,0x88,0x91,0x49,0x8E,0x89, + + 0x75,0xC6,0x9B,0x7E,0x1D,0xB2,0x60,0xBF,0x4D,0xF4,0xE6,0x98,0x90,0x08,0x87,0x0B, + + 0x6A,0x80,0x96,0x6F,0x14,0x97,0xB7,0xDB,0x8A,0x96,0xEF,0x8A,0x11,0x2B,0xBB,0xFB, + + 0x26,0xAD,0xDB,0xAC,0xD5,0x94,0x89,0x48,0x4A,0x9B,0xE7,0x9A,0x10,0xEA,0x39,0xEF, + + 0x8B,0xC3,0xE6,0x46,0x1E,0xB7,0xB7,0x16,0x93,0x6A,0xA5,0x1F,0xFE,0xF1,0xB3,0xD0, + + 0x8E,0x22,0x94,0xF3,0x4D,0x92,0x64,0x15,0x1B,0x06,0x4E,0x9E,0x90,0xAC,0xF3,0xAB, + + 0x55,0x53,0xCC,0xF0,0x51,0x7A,0x28,0x93,0x78,0xC1,0x85,0xC3,0x11,0x1A,0x4E,0xBF, + + 0x1C,0x0F,0x6B,0xF9,0xD8,0x42,0x5B,0x12,0x58,0x31,0x6B,0x9F,0x10,0x8E,0x26,0x1F, + + 0x02,0x00,0x30,0xF6,0x53,0x01,0x4E,0x8F,0x60,0x35,0xB4,0x75,0x52,0x80,0xAF,0x5D, + + 0xF8,0xFD,0xF2,0xC2,0x7D,0x40,0x2E,0x8A,0xAE,0x52,0x41,0xDD,0xE6,0xA1,0x16,0x3D, + + 0xD0,0x77,0x37,0xED,0x69,0xED,0x2F,0xDF,0xC4,0x3F,0x35,0x55,0xEB,0xE0,0x80,0x6D, + + 0x10,0x0E,0xD0,0x71,0xB1,0x7C,0x82,0x82,0xFB,0x6C,0x3D,0x29,0x3C,0x70,0x5E,0xFF, + + 0x6E,0xB7,0xF2,0xF4,0xFD,0xE0,0x88,0x46,0xC4,0x28,0x24,0x98,0xDB,0x19,0x93,0x2D, + + 0x6F,0x88,0x4C,0x72,0xE8,0x28,0x40,0x89,0xEB,0xC8,0x43,0x06,0xD7,0xF3,0x9E,0x3D, + + 0xEC,0x55,0xDB,0xF7,0x53,0x09,0x09,0x01,0x35,0xA3,0x61,0x17,0x56,0xF9,0x96,0x2D, + + 0xA9,0x58,0x3D,0xA9,0x7E,0xD6,0x82,0x54,0x66,0x86,0x69,0x84,0x53,0x6A,0x5F,0xE0, + + 0x28,0x25,0x9A,0xF5,0x6F,0xA8,0xE7,0x0E,0xA5,0x5B,0xA4,0x4C,0xA3,0x45,0x74,0xF8, + + 0x09,0xC9,0x00,0x0C,0xBC,0x16,0x04,0x97,0x2F,0x36,0xA8,0x3F,0xB6,0x3A,0xB5,0x89, + + 0x4E,0x59,0x63,0x0E,0x32,0xAC,0x21,0xD4,0x27,0x19,0x66,0x0B,0x35,0x79,0x2D,0x06, + + 0xBE,0x4F,0x3B,0x20,0x8D,0x70,0x45,0x82,0xE9,0x66,0x81,0x1B,0xB5,0xE6,0x38,0xCA, + + 0x72,0x23,0x0E,0xD1,0xEB,0x25,0x2B,0x0C,0xEB,0x53,0xA0,0x38,0xB5,0x88,0x14,0x5D, + + 0x2B,0x20,0x22,0x3C,0xE0,0xC8,0xC2,0x84,0x5F,0x80,0x6C,0x8D,0xDB,0x60,0xC3,0xBB, + + 0x30,0x5D,0xC3,0xA5,0xBA,0xB5,0x72,0x0D,0x35,0xDE,0x63,0x9F,0x1A,0x4F,0xFD,0xAA, + + 0x2C,0xCF,0xD3,0x00,0x38,0xBF,0x84,0x5F,0x4D,0x23,0xA9,0x29,0x34,0x8B,0x1F,0xF2, + + 0xA4,0x8F,0x04,0xF4,0x56,0x7C,0x06,0x92,0x98,0x7F,0xCC,0x82,0x9F,0xB4,0xBC,0x61, + + 0x4F,0xF4,0xFC,0x90,0xFD,0x40,0xAC,0xC1,0x09,0x7A,0x18,0xB2,0x35,0x44,0x9E,0xF3, + + 0x24,0x84,0xDB,0x80,0x90,0x16,0x95,0xD1,0x86,0x8E,0x8F,0x17,0x61,0x5D,0x15,0x60, + + 0xC3,0xFD,0x09,0xB3,0x86,0xA7,0x45,0xA7,0x05,0x52,0xE7,0xFF,0x89,0x5C,0xDC,0x8D, + + 0x95,0xD5,0xF2,0xEF,0xDD,0xF0,0xF4,0xF2,0x00,0x6B,0x64,0x96,0xF6,0x5B,0x7E,0xA7, + + 0xCC,0xD1,0x48,0xF2,0xB8,0x18,0x22,0x10,0x63,0x50,0xDC,0x65,0xD4,0xB4,0x5B,0xEB, + + 0xCE,0x9B,0xDF,0x77,0x27,0x19,0x46,0x01,0x0F,0xCC,0x8D,0x6F,0x53,0x7F,0x57,0x63, + + 0x3E,0x38,0x38,0x44,0xD0,0x1A,0x82,0x34,0x1E,0x21,0x02,0x84,0x83,0x01,0x40,0xB7, + + 0xC5,0x49,0x1E,0xBE,0x3C,0x47,0x33,0x59,0xE8,0x55,0x16,0x5E,0xF6,0x2B,0x78,0xEA, + + 0xAD,0x8F,0xB0,0x0E,0xC2,0x14,0xA8,0x8B,0xCC,0x58,0x3D,0x81,0x21,0x74,0x3D,0x89, + + 0x1F,0x37,0xE6,0xE9,0x98,0x17,0x65,0xE4,0xC8,0x77,0xC9,0xA8,0xD8,0x2F,0xBF,0x6B, + + 0x5E,0x3A,0x79,0xD8,0x63,0xFA,0xBD,0x48,0x69,0x56,0xC4,0x44,0x7F,0xE7,0xC2,0xEE, + + 0xA1,0x31,0xB8,0xBE,0xBE,0xA3,0x48,0x08,0x0F,0xD8,0xAC,0xEC,0xCD,0x55,0x39,0xAA, + + 0xAF,0x82,0x8F,0xFA,0x5C,0x18,0x1F,0xDE,0x04,0xD2,0xE8,0xC3,0x94,0x0C,0xB7,0x58, + + 0xD8,0x33,0xD9,0x63,0xDF,0xBA,0x0E,0x91,0x8F,0xDA,0xE0,0x65,0xDA,0x03,0x51,0x7A, + + 0xCE,0x9B,0xF8,0x2C,0x3B,0x32,0xFF,0xC9,0x8F,0xDD,0x44,0x4E,0x8B,0x50,0x93,0x24, + + 0xA1,0xDF,0x23,0xF2,0x23,0xE1,0x4E,0x09,0xBF,0x5B,0x68,0x63,0x92,0xE0,0x98,0x63, + + 0x68,0xAA,0x30,0x04,0xB6,0x4F,0x0D,0xC9,0x4B,0x03,0xC7,0x56,0x12,0x62,0xB5,0x63, + + 0x7F,0x6E,0x39,0xFA,0xA3,0x90,0x75,0x57,0x3F,0x39,0x99,0x10,0x52,0x66,0x71,0x15, + + 0x61,0x42,0x6E,0xD5,0x95,0x06,0x0A,0xA8,0x1D,0x52,0x66,0x8A,0xD3,0x61,0x45,0xA8, + + 0x17,0x49,0xD1,0x46,0xFC,0x3F,0xC6,0x13,0x2E,0x28,0xC6,0x4C,0xE1,0x79,0x36,0x7D, + + 0xE2,0xAA,0xD9,0x13,0xCD,0x2F,0x64,0x57,0x20,0x31,0x81,0x28,0xF6,0xBA,0x3F,0x6D, + + 0x92,0x4B,0x33,0x23,0x6D,0x8B,0x37,0xA8,0xC3,0x06,0xF9,0x07,0x77,0x99,0xDF,0xA1, + + 0x55,0xA6,0x49,0x36,0x4D,0x8A,0x4F,0x44,0x70,0x0A,0x66,0x29,0x2C,0x69,0x5C,0xEA, + + 0x0C,0xA5,0x77,0x7E,0xBF,0x6A,0x4B,0xAF,0xAD,0xB7,0xAC,0xF4,0x7B,0xC8,0xDA,0x9C, + + 0x14,0x66,0x29,0x34,0xF8,0xD6,0xDA,0x00,0x13,0xBD,0x1C,0xD4,0x0D,0x24,0x95,0x3B, + + 0xAC,0x46,0x89,0x9D,0x44,0x1B,0xCE,0x00,0x29,0xF5,0xCA,0x92,0x7D,0x63,0x52,0x9C, + + 0x2C,0xFA,0xD2,0x01,0x3C,0x22,0x8D,0x4A,0xA5,0xC4,0xD9,0xDB,0x59,0xDB,0xD4,0xCC, + + 0x22,0x82,0xD7,0x9C,0x46,0x25,0x0A,0x6C,0xE3,0xBA,0xEA,0x86,0xA7,0x23,0xD9,0x69, + + 0x67,0x4F,0x65,0x37,0xC6,0x6F,0x9A,0x59,0xDB,0x40,0xE4,0x54,0xD6,0xEB,0x7B,0x29, + + 0xD5,0x85,0x47,0x88,0xA2,0x21,0x09,0xA4,0xA2,0xAF,0xF3,0x64,0x92,0x7F,0x5F,0x53, + + 0x2A,0x04,0x87,0x1D,0x42,0x12,0x26,0x8B,0xE8,0x0F,0x5C,0x3D,0x56,0xCF,0x2A,0x7A, + + 0x81,0x99,0x03,0x96,0xDB,0xD1,0xB3,0x89,0x89,0x01,0xCD,0xB8,0xD5,0x7B,0xCC,0xF6, + + 0xD6,0x01,0xCE,0xE7,0x5D,0x2A,0xB0,0x23,0x59,0x59,0x3B,0x81,0x42,0x57,0x07,0x61, + + 0x8E,0x09,0xDC,0x02,0xD5,0x3B,0xD1,0x24,0xA3,0xA1,0x55,0x21,0xA9,0x22,0xB5,0x6E, + + 0xA7,0x9B,0xE9,0xE1,0x90,0x83,0x49,0x59,0xF3,0x1E,0x27,0xC4,0x9D,0x7A,0xC0,0xBF, + + 0x03,0xF4,0xD2,0xF1,0x34,0x15,0xF8,0x7F,0x61,0xA7,0x3B,0x06,0xF0,0x3C,0x59,0xD2, + + 0x35,0xBE,0x06,0xA7,0x5F,0x94,0x04,0x41,0x00,0x84,0xBC,0xB0,0x02,0xF8,0x1C,0x76, + + 0x07,0x5E,0xE4,0xA7,0x51,0x3D,0x95,0xC0,0x61,0x5B,0x09,0x15,0xFA,0x79,0x58,0xD0, + + 0x42,0xE8,0xF5,0xE5,0xDE,0x98,0x48,0x75,0xCB,0x43,0xA5,0x77,0xF6,0x4E,0xF2,0x60, + + 0x6A,0x55,0xDF,0x90,0x5B,0x18,0xE9,0x40,0x76,0x15,0x14,0x9A,0x14,0xF5,0xCE,0xC8, + + 0x87,0x02,0x18,0xEE,0x0A,0x79,0xA6,0x43,0xE4,0x84,0xD5,0xDC,0x61,0x62,0xFC,0x81, + + 0x0D,0xE5,0x7F,0x65,0x32,0xFF,0xF0,0x57,0xDB,0x1B,0xCE,0xA9,0x5F,0xD7,0xCA,0xFF, + + 0x56,0x1D,0x77,0x75,0xD1,0x76,0x78,0x4A,0x85,0xF6,0x33,0xDB,0x06,0x60,0x66,0x4D, + + 0xC3,0x2D,0x66,0xBE,0x58,0x00,0x6E,0x78,0xC9,0xD7,0xAE,0xCB,0xD9,0x7A,0x74,0x2B, + + 0x13,0xE2,0xA8,0xF1,0xCE,0x9B,0x4A,0xF2,0xCA,0xDD,0x25,0x1E,0xDA,0xF7,0x0D,0x2B, + + 0x8B,0xAE,0x07,0xE9,0x53,0x50,0xC4,0xD8,0xDA,0x1C,0x5F,0x28,0x5B,0xF4,0x15,0x47, + + 0xC3,0xFE,0x5E,0x9D,0xBA,0xB2,0x27,0xC2,0x87,0xAA,0xA0,0x1F,0x26,0xA2,0xD8,0x8A, + + 0xA1,0x53,0xA1,0x84,0xDD,0x17,0x28,0x27,0x8C,0x21,0x8A,0xCE,0x00,0xAF,0xA5,0xF5, + + 0x36,0x23,0x57,0x69,0x9A,0x27,0x66,0xD0,0x19,0x44,0xA9,0xC9,0x53,0x52,0xD9,0xC5, + + 0xA2,0xC0,0x99,0x40,0x5E,0xB3,0x20,0xCB,0x4A,0x0F,0xE8,0xAF,0x71,0x43,0x91,0x2E, + + 0x22,0x91,0x29,0x57,0x8D,0x5E,0x60,0xB5,0xA1,0x3C,0xB4,0xB5,0x1C,0xB4,0x2E,0xB2, + + 0x6F,0x25,0xCF,0x79,0x7A,0xE6,0x4C,0xDE,0x25,0x6D,0x66,0x25,0xDE,0xA5,0x7D,0xA2, + + 0xED,0x24,0xFE,0x63,0xA4,0xE8,0x6D,0x9A,0xA1,0x88,0xBA,0x16,0x55,0x65,0xF7,0xA9, + + 0x23,0x29,0xEB,0x37,0xF5,0xD2,0x64,0x89,0x63,0x69,0x5A,0x1C,0x03,0x1B,0xFF,0xD7, + + 0xA3,0x94,0x16,0xA7,0x41,0x96,0x86,0x18,0x4A,0x31,0xA1,0x2F,0x55,0xEF,0x9A,0xB6, + + 0xAB,0x8E,0xC0,0xF0,0x1F,0x28,0xF2,0x76,0xF1,0x15,0x8A,0xD1,0xB5,0xD9,0x52,0x98, + + 0xC4,0xFE,0xCA,0x4D,0xE7,0x04,0x82,0xC5,0xA4,0xF8,0x7A,0x63,0xC5,0xF2,0x0D,0xF1, + + 0x2D,0x0A,0x99,0xE7,0xC8,0xE5,0x4D,0x07,0xFF,0xC8,0x5F,0xB0,0xDD,0x8A,0x13,0x7B, + + 0xB3,0x8D,0xBA,0xFD,0xF6,0xA4,0x97,0xA4,0xCE,0x8B,0x18,0x49,0xFE,0x09,0x5A,0xB5, + + 0xE7,0xBD,0x22,0x6F,0xDD,0x51,0x7A,0xB3,0xA7,0xFD,0x26,0x1C,0xFD,0xEA,0x33,0xF4, + + 0xAA,0x86,0x93,0x2D,0x27,0xE2,0x04,0x52,0x7C,0x0A,0x79,0x7C,0x39,0xEB,0x3B,0xD3, + + 0x09,0xAF,0x9B,0xBF,0xF7,0x9F,0x39,0x89,0xED,0x24,0xFB,0x48,0x7D,0x15,0xEB,0xD3, + + 0x2A,0x86,0xD7,0xC0,0xFC,0xD5,0xC3,0x84,0x26,0xDE,0x73,0xBA,0x7E,0x65,0x0A,0x38, + + 0x85,0xFC,0xB2,0xAF,0xCB,0xDC,0x25,0xE5,0xAE,0x31,0x34,0xC0,0x08,0xBF,0x6D,0xF4, + + 0x86,0x1C,0x73,0x69,0xDC,0xE0,0xBE,0xC4,0xA7,0xF1,0x43,0x5E,0x71,0xBC,0xC2,0xC3, + + 0xE4,0x89,0xC3,0xAE,0xB7,0xF2,0x7D,0x3B,0xD7,0x06,0xD5,0xF4,0x5F,0xFF,0x4D,0xC0, + + 0x56,0x9C,0x41,0x08,0xB4,0x00,0x35,0x23,0x0C,0xC2,0x11,0x28,0xF4,0x53,0xA4,0xE3, + + 0xE5,0x19,0x9A,0xEE,0x30,0x95,0x65,0x66,0x7F,0x08,0x5B,0x62,0x33,0x51,0xFA,0x38, + + 0xCE,0xA4,0x2C,0xF7,0xCD,0x48,0x04,0x02,0xB1,0xE4,0xF8,0x14,0xF5,0xFD,0x1D,0x33, + + 0xCF,0x37,0x8D,0xA5,0x95,0x67,0xB5,0xC2,0x1C,0x2B,0x95,0xA7,0xD8,0x7D,0x95,0x23, + + 0x4D,0x36,0x95,0x27,0xC3,0x16,0xBD,0xD2,0x24,0x5A,0x49,0x85,0x54,0x0C,0x7F,0x0E, + + 0x8B,0x88,0xFF,0x92,0x99,0xB3,0xA1,0x55,0x6A,0x6B,0x8C,0x48,0x7A,0x72,0x2F,0x7C, + + 0xAF,0x65,0x94,0x76,0x39,0xF6,0x04,0x52,0x37,0x96,0xBE,0xAD,0x6E,0x88,0xDF,0x63, + + 0xEE,0xD5,0x21,0xE9,0xFC,0xF5,0x3A,0x2F,0xAF,0xFE,0x93,0x8B,0x97,0xAB,0x15,0x1F, + + 0x9F,0xB0,0xF6,0x83,0x18,0x3B,0x1F,0xAB,0x0C,0xC0,0xE6,0x7E,0x58,0xF0,0xF0,0x4E, + + 0x0A,0x8F,0xF7,0x4A,0x16,0xA8,0x0E,0xFB,0x3D,0x57,0x23,0x6A,0x23,0xA3,0x50,0xEF, + + 0x4E,0x6D,0x78,0xE1,0x0F,0xFF,0x6A,0xF0,0x0C,0x22,0xFA,0x1C,0x5B,0xFD,0xD8,0x29, + + 0xE6,0x7F,0xBD,0xCE,0x1D,0x0B,0xBA,0xDA,0x82,0x9C,0x97,0xAF,0x52,0x75,0x37,0xC4, + + 0x4E,0x30,0x62,0x7A,0xDC,0x16,0x07,0xF9,0xAF,0x7F,0xFF,0xFF,0xFF,0xFF,0x60,0x03, + + 0x55,0x0D,0xC7,0xF7,0xFB,0x44,0x16,0x09,0x23,0x48,0x67,0x42,0xA7,0x99,0x32,0xF8, + + 0x81,0xCE,0xB6,0x39,0xB2,0x63,0x63,0x43,0x2D,0x4E,0xC1,0x36,0x36,0x41,0x19,0x05, + + 0xA8,0x14,0xBF,0x29,0x33,0x47,0x07,0x09,0xC6,0xD0,0x89,0x31,0x25,0x6D,0x37,0xC9, + + 0xA2,0xB1,0x4A,0x14,0x7A,0x47,0x40,0xF0,0x64,0xC4,0xC0,0x37,0x34,0xE4,0x45,0xB2, + + 0x42,0x4B,0xB9,0x2B,0x4F,0xDB,0x68,0x88,0x62,0x0B,0x84,0x16,0xB9,0xF5,0xA0,0x44, + + 0x05,0xAF,0xC7,0xAF,0xA2,0xBD,0xA0,0x98,0x63,0x08,0xE6,0x4C,0xDE,0x93,0x79,0xA9, + + 0x88,0x49,0x78,0x19,0x65,0x1B,0xE9,0x81,0xC6,0xC6,0xEF,0xC4,0x90,0x99,0x83,0xB9, + + 0x91,0x4A,0xB2,0x97,0x17,0x29,0xB5,0xE3,0x9F,0x4F,0xD1,0x71,0x5B,0x3C,0x5B,0xB7, + + 0xAD,0x03,0xBC,0x34,0xBB,0x4D,0x92,0x25,0x2B,0x40,0x96,0x38,0xDA,0x4C,0x52,0x9D, + + 0x3A,0x88,0x1C,0x1D,0x0C,0x32,0x61,0x5A,0x08,0x4D,0xCA,0x20,0x41,0x72,0x42,0xE1, + + 0xCB,0x47,0xBD,0x34,0x3B,0x8A,0x05,0x01,0xCE,0xD8,0x18,0x5E,0xB4,0x65,0xB3,0xF9, + + 0x85,0x4B,0x7C,0x99,0xCB,0x44,0x63,0x28,0xF9,0x09,0xBB,0x4B,0x3B,0x4B,0xBD,0xA0, + + 0x00,0x41,0x66,0xC8,0x5A,0x99,0xD6,0x98,0x16,0x03,0xEC,0x54,0x1A,0xC3,0xF5,0x48, + + 0xAC,0x16,0xEA,0xFF,0x53,0x9C,0xCD,0x49,0x22,0xCF,0xBC,0xDD,0x5A,0x2D,0xAF,0xD6, + + 0x89,0x6E,0xC5,0xED,0xD2,0xFF,0x93,0xC1,0x5A,0xE1,0xC4,0x1E,0xA2,0x02,0xDB,0x3F, + + 0x74,0x14,0xC7,0x6B,0xA8,0x3D,0x7D,0x44,0x68,0xCB,0xFF,0x89,0xB8,0x6D,0xC1,0xF3, + + 0x73,0x1B,0x92,0x6C,0xB0,0x7D,0xE8,0xDF,0xC3,0xF0,0xAA,0x99,0x51,0xF0,0x72,0xA5, + + 0x12,0xD6,0x94,0x0C,0x3C,0xD0,0x5B,0x43,0x67,0xE3,0xC5,0x27,0x94,0x1F,0x85,0xA0, + + 0xBE,0x9F,0xDD,0x95,0x59,0x03,0x04,0xB0,0xD0,0x10,0x6F,0x4D,0x3A,0xB2,0xB5,0x6E, + + 0x48,0xF2,0x85,0xEA,0x70,0x51,0xA9,0x8E,0xDD,0x86,0xFF,0xB9,0xF0,0xB3,0x01,0x26, + + 0x00,0xD4,0x6E,0xAB,0x91,0x75,0x6A,0x40,0xED,0xA2,0x47,0x60,0x56,0x51,0xB4,0x38, + + 0x29,0x58,0x96,0xA5,0x4F,0x2A,0x66,0x03,0x17,0xF8,0x1C,0xD0,0xA9,0xF3,0xC4,0xA7, + + 0x91,0xF4,0x62,0xE8,0x35,0x75,0x5D,0xE5,0x3E,0x55,0xB7,0xF4,0xF1,0x96,0x14,0x58, + + 0x04,0x0C,0x75,0x05,0x10,0x59,0xCE,0xB6,0x29,0xA6,0xDB,0xB5,0xA7,0x19,0xAA,0x17, + + 0x29,0x58,0x42,0x09,0x7B,0x18,0x87,0x2C,0x6F,0x18,0x4C,0xA0,0x4B,0xEC,0x18,0xAD, + + 0x9A,0x54,0x18,0x7E,0xBB,0x65,0x61,0xFF,0x94,0xEF,0xC1,0x3E,0x5B,0x49,0x13,0x04, + + 0xCB,0xD0,0xD7,0xEF,0xFA,0x50,0x77,0xAB,0xA7,0x57,0x4D,0xB0,0xFE,0x69,0x57,0x9D, + + 0x81,0xF9,0x69,0x6D,0xB1,0x34,0xA4,0x2B,0xE9,0x51,0xA7,0x55,0xF3,0x34,0x80,0xAE, + + 0xA8,0x1F,0xA4,0x4C,0x3B,0x7C,0x1E,0xA0,0x6C,0x4F,0x8F,0xB5,0xDF,0x0A,0xF6,0x5A, + + 0x09,0xED,0x0E,0x8D,0xE3,0xB6,0xFE,0x9A,0xD8,0x38,0x9E,0xBA,0x5D,0x79,0x42,0x2B, + + 0x99,0x2C,0xE3,0x12,0x46,0x4F,0x10,0xAB,0x66,0x52,0x96,0x8B,0x6C,0x76,0x37,0x31, + + 0xB9,0x52,0xCB,0x21,0xBB,0x2A,0x67,0x12,0x47,0x52,0xDC,0x3A,0xC8,0x15,0xEC,0x3B, + + 0x37,0x84,0x1F,0xE4,0xFD,0x91,0x73,0xD1,0xAD,0xB1,0x34,0xA2,0x17,0xEF,0x90,0x82, + + 0xA2,0x85,0x17,0x76,0x19,0xC9,0x7B,0xC0,0xB8,0xCE,0x40,0xDE,0x47,0xAC,0xFB,0x02, + + 0xB7,0x03,0xAB,0x05,0x7F,0x43,0x49,0x50,0xF0,0x80,0x21,0x55,0xE7,0x83,0x2F,0xFB, + + 0xE5,0x08,0x3F,0x97,0x93,0x71,0xF9,0xAB,0x2E,0x6E,0x46,0xDF,0xCB,0xAE,0xA5,0x24, + + 0x8B,0x72,0x58,0xC4,0xD3,0x69,0x88,0x10,0xAD,0xC7,0xE6,0x5E,0x50,0xC5,0x2C,0x34, + + 0x8A,0x53,0x5C,0xB4,0x2C,0x35,0xC0,0x8D,0xAE,0x74,0xB8,0x47,0x2F,0xA7,0x9E,0xD3, + + 0x71,0x9D,0x99,0xAF,0x88,0xEB,0x0F,0x5A,0xF5,0xC7,0xD0,0x05,0x29,0x6D,0x61,0x43, + + 0x7A,0x06,0x55,0x70,0x34,0xBC,0xD5,0xEC,0xC4,0x1E,0xED,0x7D,0x76,0x58,0xA6,0xEC, + + 0x67,0x99,0xA5,0xAE,0xBD,0x4B,0x25,0xC8,0xA5,0x59,0x1E,0xB1,0xB7,0x59,0x73,0xDB, + + 0xA8,0x00,0xAE,0x7E,0x41,0xAF,0x42,0xCA,0x0A,0x68,0xB4,0x2D,0xFE,0x18,0xA4,0x79, + + 0x67,0xBB,0xFA,0xDF,0x39,0x23,0xF3,0xB3,0x2F,0x37,0xEA,0xBC,0xDA,0xF9,0x2F,0xFB, + + 0x89,0xAA,0x02,0x88,0x3C,0xA2,0xAD,0xD1,0xCB,0x59,0xE2,0x25,0xBA,0x1B,0x99,0xAC, + + 0x3D,0xAE,0xE5,0x28,0xB2,0xA3,0xB2,0xC2,0x14,0x8E,0x32,0x2E,0x9B,0x90,0x92,0xB2, + + 0x2B,0xC0,0x2A,0xF6,0x1D,0xA0,0x7A,0x7A,0xC2,0x60,0x53,0x0D,0x63,0x4C,0xDB,0xB4, + + 0xBD,0x6C,0x57,0xBF,0x96,0xA1,0x71,0x38,0xCE,0xCE,0x4C,0x20,0x4B,0x33,0x90,0x24, + + 0xFB,0x94,0xB2,0xD9,0xFB,0xA9,0x65,0xE8,0xB3,0x30,0xC3,0x4E,0x7E,0x40,0x1E,0x79, + + 0xD8,0x71,0x9E,0x6E,0xB4,0x7F,0xF5,0x26,0x32,0xF0,0x1C,0xB2,0x95,0xEB,0xBD,0x8D, + + 0x19,0x2A,0x05,0x01,0x96,0xB7,0x2B,0x8C,0x15,0x93,0x46,0x5E,0x2F,0xBE,0xE5,0xAE, + + 0xF6,0x46,0x85,0x96,0x55,0xB4,0xF5,0x3A,0x48,0x27,0x25,0x41,0xC7,0x26,0x29,0xAC, + + 0xC9,0xD1,0x84,0xBC,0x14,0x1A,0xF5,0xB7,0x67,0xD7,0xED,0xAE,0xEB,0xE8,0x9B,0x2A, + + 0x2C,0xD9,0x71,0xCE,0xB6,0x14,0x8D,0xC5,0xC7,0xAB,0x4C,0x69,0x64,0xB9,0x35,0x55, + + 0x21,0x86,0x47,0x1C,0x8C,0x4A,0x54,0x90,0x86,0x2E,0x2C,0x85,0x5D,0x7C,0xC9,0x5C, + + 0x4D,0x27,0x49,0x62,0x63,0xD5,0x4C,0xA1,0x47,0xEB,0x14,0xA7,0xF2,0xBA,0x63,0x3B, + + 0x21,0x3A,0xB4,0x7C,0x12,0x6D,0x79,0x0D,0x1C,0x48,0x7D,0x17,0xE6,0x02,0xB3,0x12, + + 0xF8,0x09,0x30,0xEE,0x70,0x15,0x7F,0xC8,0x97,0xB4,0xF2,0xC8,0x83,0xFE,0x38,0xAF, + + 0x9E,0xD4,0x74,0x9F,0xBF,0x85,0x3E,0xFA,0x3F,0xC2,0x59,0x56,0x59,0xB6,0x80,0xB2, + + 0xCF,0x50,0x31,0x6D,0x8F,0xBE,0x88,0x30,0x19,0x5C,0xE7,0xB2,0x5D,0x96,0x77,0x9F, + + 0x85,0x79,0xA9,0xFD,0x42,0xA0,0x1F,0x4F,0xE5,0x99,0x07,0x40,0xDF,0x16,0x1E,0x3C, + + 0x28,0x24,0x98,0xF3,0x2E,0xF1,0x2C,0xDF,0x06,0xDF,0x65,0x6A,0x79,0x45,0x94,0xA8, + + 0x1C,0xCF,0x7D,0xEF,0x03,0xFF,0xBE,0xEA,0x78,0xD3,0xF6,0xC6,0x79,0xBC,0xE6,0x23, + + 0x24,0x63,0x28,0x3C,0x9C,0x35,0x0E,0x8D,0x55,0xC1,0x48,0xA8,0x3C,0x7E,0x97,0x59, + + 0x2F,0xDB,0xFB,0xD5,0x1E,0x10,0x47,0x10,0x6C,0xD2,0x98,0x6D,0xBF,0xF7,0x16,0xE9, + + 0x8C,0x6D,0xA4,0xF7,0x9C,0x61,0xEF,0x53,0x3C,0xCF,0xA4,0x42,0x9A,0x89,0x88,0x57, + + 0x2F,0xDD,0x30,0xEE,0x01,0x6C,0xD3,0xD6,0x51,0x0C,0xB8,0xD4,0xF0,0x9E,0xFA,0x08, + + 0x2D,0x19,0x3C,0xFA,0xE7,0x22,0xEA,0xC9,0x7A,0x0F,0xAF,0x51,0xF4,0x64,0xDD,0x4F, + + 0x12,0x3C,0xF6,0x91,0x99,0x44,0xD6,0xD7,0xE5,0x45,0xA7,0x4D,0x0F,0x22,0xD0,0x33, + + 0x6E,0xA5,0xDE,0x7B,0x6F,0x66,0xF0,0x22,0xC1,0xEF,0x2F,0xE0,0x55,0xC7,0xE8,0x22, + + 0x61,0x59,0x70,0xAB,0x20,0x85,0x18,0xB6,0x0B,0x07,0xF8,0xF0,0x58,0xDB,0x79,0x71, + + 0xF0,0xA9,0x8F,0x26,0xA1,0x46,0x39,0xE1,0xE0,0x56,0xE6,0x28,0xD4,0xFE,0xD9,0xD3, + + 0x03,0xDF,0x71,0xAE,0xF8,0x2D,0x91,0xC0,0xB8,0x43,0xE7,0x09,0x5C,0xC1,0xFD,0xF0, + + 0x08,0xB3,0x39,0xF3,0x3C,0x44,0xA7,0xA8,0xE9,0xE7,0xAA,0xD0,0x58,0x74,0xE6,0x77, + + 0xD7,0x54,0x88,0xE3,0x94,0x84,0x24,0x00,0xC4,0xEF,0xC5,0x97,0x2E,0x6D,0x87,0x8D, + + 0x80,0xA6,0xBD,0xD1,0x52,0x90,0x80,0xD8,0xB8,0x6A,0xAC,0x67,0xC8,0x2B,0xE8,0x59, + + 0x86,0xA6,0x93,0x8E,0xC6,0xAB,0x4F,0xF9,0xF9,0xC0,0x44,0x68,0xDF,0xE1,0x7A,0xB7, + + 0xCB,0x6E,0xC2,0x63,0x73,0x6E,0x68,0x97,0x4C,0xD4,0x4D,0x2C,0x7F,0xE1,0x10,0x81, + + 0x7F,0xA2,0x70,0xB3,0xF2,0xD4,0x24,0xFA,0x69,0x09,0x84,0x00,0x5B,0x23,0x87,0x99, + + 0x86,0x4F,0x8D,0x36,0xA9,0x9A,0x73,0xAF,0x8A,0x63,0x2C,0xE9,0x99,0xC8,0xEB,0x2B, + + 0xE9,0x53,0x6E,0xBF,0x7B,0x8B,0x63,0x87,0x67,0x42,0x9B,0xBB,0x9B,0x74,0xFB,0xFA, + + 0x0E,0xCF,0xFA,0x82,0xD1,0xB3,0x2C,0x30,0xC3,0xF0,0xAE,0x14,0xE5,0xDF,0xEF,0xD0, + + 0x31,0xBC,0x29,0x76,0xD1,0x9C,0x8F,0x34,0x26,0x43,0x9C,0x5B,0x63,0x3C,0xE9,0xEE, + + 0x7E,0x4F,0xA8,0x76,0x3C,0x73,0x06,0xA3,0x6B,0xA7,0x31,0x81,0x55,0xF3,0x5D,0xC0, + + 0xDD,0x18,0xF5,0xA4,0xC5,0x9C,0x47,0xB0,0x96,0x53,0xCF,0x4E,0x46,0x1D,0x52,0xA2, + + 0x42,0x95,0x5B,0x3C,0x32,0x76,0x16,0xDF,0x49,0x16,0x86,0x60,0x31,0xC5,0x61,0xF4, + + 0xC8,0x71,0xB3,0xAE,0x45,0xAA,0xE3,0x16,0x9F,0x1E,0x85,0xD1,0xD6,0x19,0x3B,0xC7, + + 0x43,0x95,0xC1,0x62,0x4F,0x67,0xDB,0x07,0xD1,0x36,0x8C,0x7D,0x57,0x89,0x75,0x22, + + 0x85,0x72,0x70,0xE4,0x12,0x93,0x9D,0x20,0xED,0x4C,0x3A,0x35,0xAB,0x35,0x86,0x8B, + + 0xF7,0xA5,0x15,0xFE,0x52,0x89,0x27,0x85,0x78,0x5C,0xA9,0x23,0x89,0x2E,0x8E,0xDF, + + 0x07,0xC5,0x1D,0x0E,0xC6,0x94,0xCA,0xE6,0xFA,0x66,0x61,0xFB,0x90,0x90,0xAC,0xF3, + + 0x7D,0x01,0xF9,0xB4,0x37,0x97,0x11,0xEE,0xC6,0x86,0x07,0x45,0x3B,0x37,0xDB,0xC7, + + 0x3A,0x24,0x98,0x0F,0xB9,0x7A,0xDF,0x9D,0xD2,0x1A,0x78,0x4D,0x79,0x64,0x7E,0x3B, + + 0x04,0x5D,0x59,0x2E,0xDA,0xC3,0x50,0x97,0xCD,0x58,0x98,0x6A,0x7C,0x8F,0x30,0xDE, + + 0xCA,0x9E,0xF5,0x4F,0x98,0xE2,0xD0,0x1E,0x58,0xFD,0xDC,0x1A,0xFB,0x4D,0x51,0xAB, + + 0xCA,0xDE,0x6B,0xB6,0x64,0xC1,0x97,0xD6,0xCD,0x1C,0x8C,0x05,0xD6,0x33,0x62,0xFD, + + 0x36,0xE2,0xF8,0xAC,0xC8,0x3F,0xE0,0x1F,0x17,0x74,0x86,0xD8,0x1A,0x30,0x70,0x53, + + 0x78,0x8B,0xDF,0xFA,0x14,0x3B,0x70,0x13,0x34,0x82,0x7E,0x59,0x70,0x4F,0x0A,0x74, + + 0x9B,0x93,0xF1,0x10,0xB0,0x1E,0x2F,0xC9,0xB9,0x10,0x80,0xCD,0x71,0xE7,0x2E,0x27, + + 0x09,0x99,0xA1,0x83,0x9C,0xC5,0x25,0x29,0x65,0x6D,0x15,0x45,0x27,0x87,0x91,0x9D, + + 0x86,0xCB,0x05,0x68,0x4F,0x7E,0xF9,0x06,0x79,0x48,0x99,0x4A,0x74,0x1C,0x1E,0x45, + + 0x22,0x8B,0xFE,0xA4,0xF6,0x5B,0x8F,0xE0,0x8B,0x68,0xD7,0x72,0x6D,0x50,0x41,0x38, + + 0xA4,0xE0,0x10,0x5E,0xEA,0xEA,0xD6,0x20,0xE6,0x16,0x1A,0x36,0x42,0xFE,0x5B,0xB0, + + 0xF7,0x80,0xB8,0x53,0x7F,0xA9,0x49,0x5E,0x65,0xC0,0x4F,0x20,0xE5,0x12,0x11,0x77, + + 0x05,0xBB,0x58,0xB3,0xA4,0x55,0x01,0x9B,0xEB,0x8A,0xDE,0x83,0xD7,0xFC,0x1C,0xAA, + + 0x45,0x79,0xC1,0x2A,0xF7,0xCC,0xFF,0x1B,0x34,0x8A,0x69,0x2E,0x2F,0xE8,0x8E,0x7C, + + 0xFE,0x99,0xD5,0x6C,0x33,0x36,0x42,0xCA,0x39,0x68,0x4E,0xF9,0x79,0x62,0x7B,0xB3, + + 0xA8,0x91,0x9B,0xE4,0xFC,0x8A,0x27,0x21,0xAF,0x35,0xEC,0x23,0xDA,0xCA,0x93,0xE0, + + 0xE5,0x86,0x3B,0xEF,0x79,0x5A,0xAE,0xBF,0xE5,0xDF,0x76,0x03,0x36,0xAF,0xEA,0x28, + + 0x4E,0x83,0x5A,0xAE,0x1A,0xF9,0x6A,0x6E,0xE7,0xE0,0x90,0x7A,0x7C,0x9C,0xFA,0x28, + + 0xA8,0x9D,0xF8,0xA1,0xE0,0x20,0x62,0x7E,0xE6,0x34,0xFE,0x98,0xDA,0x6D,0x5B,0x0C, + + 0x4C,0xCE,0xBF,0xA7,0x42,0x63,0x4D,0x17,0xAF,0xEE,0xFB,0x87,0xF2,0x65,0x55,0x36, + + 0x28,0xCE,0xB9,0xA0,0x68,0x1A,0x22,0xE6,0x6A,0xC4,0x3B,0xAF,0xA7,0xEB,0xDB,0x45, + + 0x99,0x66,0x1C,0xBB,0x93,0xA2,0x98,0x4A,0xBE,0x9D,0xAA,0xD2,0xE6,0xB1,0x75,0xD4, + + 0x80,0x6E,0x3C,0xF4,0x8E,0xCE,0x26,0xB0,0x8E,0xDE,0x8D,0x54,0x51,0xF7,0x9C,0x1D, + + 0xA5,0xC2,0x1D,0x37,0xB4,0xFD,0x53,0x6E,0x0D,0x88,0xCD,0xD5,0x76,0xEE,0x13,0x5A, + + 0x2A,0x65,0x92,0x18,0xD6,0xB7,0x7C,0xD5,0x84,0xD7,0x9D,0x53,0x54,0x0C,0xC9,0x8C, + + 0xD3,0xC8,0x24,0xC7,0x98,0xAF,0xB4,0x33,0x68,0xCF,0x1C,0xF6,0x70,0x0C,0x35,0x46, + + 0x82,0x6A,0x53,0x30,0x5C,0xCD,0xF5,0x47,0xC3,0x97,0xA5,0xD3,0xD2,0xFE,0x5F,0x28, + + 0x15,0xD7,0xE4,0xB9,0x11,0xA6,0xF1,0x9C,0x41,0x94,0x9B,0x63,0xCC,0xD1,0x53,0xA2, + + 0x7B,0x98,0xED,0xD5,0xE3,0x1A,0x47,0x56,0xD4,0xF3,0xFC,0x75,0x3E,0x60,0x6E,0xF3, + + 0x64,0x29,0xDF,0xF6,0xAE,0xF9,0x50,0x48,0x48,0x95,0x88,0xD6,0xF1,0x0E,0x32,0x88, + + 0x0F,0xDA,0x8E,0x74,0x5E,0xBD,0x2F,0x4A,0x6C,0x08,0x86,0x8E,0x2B,0x56,0x3B,0x18, + + 0xE4,0x0B,0x4B,0x14,0x4D,0x33,0xC8,0x95,0xDC,0x7A,0x27,0xDC,0x90,0x5B,0xEF,0xE8, + + 0x8F,0x14,0xCE,0xBB,0x30,0xA0,0x41,0xBD,0x0C,0x58,0x1F,0xCD,0x9F,0xA7,0x54,0xEE, + + 0xAC,0x80,0x7D,0xBF,0x43,0xB7,0xFC,0x15,0x5D,0x2E,0xCE,0x11,0x78,0xA4,0xFE,0x98, + + 0x8E,0x91,0xCE,0xDB,0x54,0xC5,0xAA,0x2A,0xEE,0x25,0x5E,0x3C,0xF3,0xF3,0xDE,0xA9, + + 0xED,0x6E,0xE1,0x3E,0xA3,0xDE,0xCF,0x15,0x2F,0xBD,0x90,0x2D,0x7D,0xF0,0x17,0x99, + + 0x23,0x93,0xEB,0xAC,0xCA,0x3D,0x75,0x5B,0x50,0x6A,0x87,0x3D,0x5E,0xBC,0x59,0xD3, + + 0xA5,0xAB,0x04,0xF9,0xE7,0x61,0xEB,0x28,0xE5,0xBF,0x50,0x21,0x84,0x21,0x51,0xD1, + + 0xA4,0x0A,0xF6,0x3D,0xFA,0x70,0x7E,0x19,0x42,0xB1,0xE6,0x32,0xB0,0xE2,0x14,0x01, + + 0x6B,0x53,0x40,0x07,0x69,0xAF,0xFD,0xB2,0xF4,0x9F,0xCB,0x19,0xB8,0x83,0x0C,0xF9, + + 0xDC,0x4E,0xF7,0x28,0x7A,0xF2,0xA6,0xBE,0x74,0xCA,0x2C,0xC6,0x5D,0x22,0xC0,0x51, + + 0x5E,0xAB,0xEA,0xB8,0xAE,0x66,0xE8,0x3D,0xE5,0x05,0xB2,0x04,0xBB,0x55,0x70,0xAB, + + 0x05,0x4F,0x5E,0x27,0x7F,0x49,0x21,0x16,0xBC,0xCE,0xF8,0x3C,0xDE,0x98,0xE5,0x23, + + 0x71,0x63,0x4E,0xD4,0x73,0x89,0x0B,0x33,0xAA,0xA7,0xB3,0x6C,0xD3,0x26,0xC9,0x96, + + 0x7E,0x81,0xAF,0x9C,0x92,0x67,0x93,0x40,0xAF,0x58,0xBB,0x57,0x26,0xE1,0x7C,0x21, + + 0x18,0x45,0xFC,0x35,0xF3,0xB9,0x32,0xC2,0xBD,0xC1,0xEC,0x2B,0xED,0x67,0xB2,0xF6, + + 0x19,0x44,0x6F,0xDC,0x67,0x6B,0x4A,0x99,0x1D,0x52,0xC4,0xDE,0x5D,0x6F,0x7D,0x25, + + 0xBB,0xD1,0x32,0x20,0x2D,0x44,0x33,0xA3,0xC9,0x68,0x27,0x42,0x7B,0xD7,0xF6,0xDE, + + 0x43,0xE2,0x03,0x42,0x2C,0x69,0x72,0x5F,0x89,0xE0,0x2E,0xAA,0xDF,0xCB,0x42,0x36, + + 0x2E,0x87,0xE6,0xD0,0x79,0x56,0xED,0x8E,0x6E,0x41,0xD2,0xAC,0x0A,0xC1,0x70,0xE8, + + 0x92,0xA2,0xEB,0x3E,0xF0,0x3C,0xE5,0x8B,0xE8,0xC8,0xCF,0xEE,0x57,0x65,0xCF,0x64, + + 0x61,0x4A,0xD5,0x78,0x9C,0x0F,0x2C,0xED,0x81,0x4B,0x42,0xFF,0x5B,0xC3,0xEF,0x7D, + + 0xE8,0x45,0xB1,0xBD,0x9F,0x0B,0xCB,0x0A,0xBF,0xCE,0x5B,0x7F,0xF5,0x01,0x14,0xBC, + + 0x07,0x16,0xBE,0x7E,0xCB,0x9D,0xB3,0x8D,0x53,0xBE,0x02,0x20,0x31,0xF9,0x8B,0x6F, + + 0x56,0x11,0xB2,0xA8,0x47,0x9E,0x43,0xA9,0x67,0xD2,0x94,0x44,0xED,0xD0,0xA8,0xFC, + + 0x01,0x98,0x12,0xB8,0x5B,0xC3,0xAD,0x5E,0xDF,0x72,0x22,0x8D,0xF6,0x58,0x3E,0xE5, + + 0x59,0xFA,0x1E,0xEE,0xDB,0x82,0xAB,0xFE,0x1C,0x2F,0x0B,0x5F,0x54,0x8C,0x7A,0xF5, + + 0x49,0x1B,0xA6,0xC4,0x31,0x74,0x06,0xAB,0x89,0x30,0x68,0xED,0x9B,0x05,0x32,0xD6, + + 0xC2,0x96,0x0C,0x9C,0xD0,0x5B,0x0E,0xBB,0x88,0x31,0x1B,0xF6,0x3F,0xD8,0xC7,0xF3, + + 0xC2,0x31,0xD9,0xAF,0x4E,0x27,0xC5,0x12,0x66,0xDB,0x39,0x77,0x92,0x7E,0xE4,0xF5, + + 0x4A,0xF6,0xF3,0xF9,0x71,0x38,0xCD,0xCB,0x40,0xF8,0x48,0x32,0x31,0x71,0xC6,0x89, + + 0x86,0xC5,0xF8,0xB5,0xC9,0x9B,0xBA,0xC7,0xA2,0x29,0xCC,0x32,0x10,0x69,0x75,0x70, + + 0x69,0x5B,0xAE,0x26,0xC5,0xC8,0x9A,0x45,0x9E,0x18,0x37,0x4F,0xF5,0x38,0xD3,0x1A, + + 0x09,0xA5,0x94,0x7E,0xC8,0x6A,0xFB,0x3B,0xE4,0x52,0xE9,0xAB,0x19,0xF9,0x0D,0xCC, + + 0x7D,0xFA,0x3C,0xA1,0x41,0x8A,0x25,0x57,0x5C,0x37,0xA1,0x88,0x91,0x76,0x18,0x2A, + + 0x6E,0x99,0xF8,0xE5,0xF8,0x3C,0x2E,0xDA,0x12,0xA3,0xDE,0x78,0x19,0xAD,0x74,0x68, + + 0xB6,0x5C,0xB6,0xA2,0xF9,0x3D,0xCE,0x7C,0x6A,0x91,0xFF,0x9E,0x39,0x72,0x55,0xC4, + + 0x41,0x5A,0x8F,0xC5,0x47,0xB8,0x69,0x0B,0x98,0x81,0xC1,0xC5,0xFC,0x5F,0x77,0x27, + + 0x07,0x12,0xC7,0xD9,0x3C,0x4D,0xB3,0x11,0x2B,0x12,0x85,0x30,0x93,0x9E,0x1E,0x76, + + 0x65,0x84,0xA6,0x1B,0xB5,0x0F,0x48,0x2A,0xA4,0xC6,0x37,0x44,0x70,0x7C,0x49,0xD2, + + 0x07,0xED,0xB9,0x27,0x21,0x0E,0xB8,0x74,0x6F,0xDA,0x15,0x59,0x3E,0xEE,0x58,0x6D, + + 0xE5,0x86,0x37,0x20,0x35,0x0D,0x9C,0x53,0x67,0xC6,0x8E,0x7D,0x49,0x1F,0x17,0x66, + + 0x4F,0xD2,0x38,0x64,0xF9,0x00,0xD7,0x55,0x85,0x68,0x39,0xB5,0x69,0xD8,0xF5,0xB1, + + 0x82,0x09,0x21,0xB6,0x7F,0x05,0xF0,0x9D,0x40,0x8E,0xCE,0x4A,0x88,0x49,0xF8,0x21, + + 0x6B,0x2E,0x28,0x72,0x75,0xA8,0x26,0x90,0x43,0x68,0xD7,0x09,0x8E,0x79,0x33,0x08, + + 0x6D,0xE2,0xF0,0xAD,0x33,0x99,0x6E,0x1C,0x4B,0x87,0xE4,0xF9,0xD7,0x76,0x11,0x57, + + 0x05,0x01,0x97,0x6F,0x6F,0xB6,0x68,0xF7,0x8F,0x37,0x42,0x2D,0x2B,0xB6,0x1C,0x7E, + + 0xC6,0xB9,0xB7,0xFD,0x24,0xF5,0x4A,0x22,0xAC,0x37,0x32,0x3F,0x00,0x15,0x92,0xFA, + + 0x45,0xC5,0xAA,0x24,0x71,0x1C,0xC5,0xD7,0xB2,0x44,0x0F,0x87,0x59,0x49,0x6B,0x07, + + 0xBF,0x34,0xA1,0xE4,0x63,0x71,0xA3,0xC3,0x03,0x87,0xED,0xCD,0xD8,0xEC,0x7F,0xE6, + + 0x72,0xCA,0xBA,0x9B,0x95,0xCC,0x44,0xBF,0xAF,0x2E,0x3C,0x04,0xED,0x1E,0x90,0x4E, + + 0x46,0x7C,0x55,0x7B,0x18,0xB4,0xC9,0x88,0xE2,0x31,0x41,0x47,0xDE,0x6C,0x14,0x5C, + + 0xEE,0x0E,0x7B,0x19,0xF6,0xFC,0xCE,0x18,0xB4,0x30,0x3A,0xBA,0xC7,0x19,0x39,0xF8, + + 0xE6,0x9F,0xE3,0x51,0xA6,0x5A,0x0B,0x4F,0x6F,0x51,0xC4,0x43,0x2E,0xDF,0x46,0xA8, + + 0x03,0xCE,0x89,0x1F,0x76,0x9E,0xEB,0x88,0x4B,0x42,0x6E,0x0C,0xAF,0xEE,0x83,0xAA, + + 0x17,0x9D,0x97,0xBE,0x07,0xD0,0x52,0x8F,0x67,0x00,0xA6,0x96,0x9F,0xB4,0xD3,0x55, + + 0xEF,0x80,0x3B,0x88,0x41,0x05,0xB4,0x48,0x64,0xB1,0x18,0x92,0x9C,0x10,0x9D,0x7D, + + 0xB4,0xDF,0x65,0x97,0xA3,0x46,0xF5,0xE7,0x39,0x90,0x8F,0x17,0x6D,0x5D,0x96,0x00, + + 0xC9,0x99,0xBA,0x8D,0xC5,0x66,0xE2,0x4D,0xC1,0x83,0xAB,0xD5,0x95,0x33,0x3D,0xD7, + + 0x02,0x1F,0xD9,0x16,0x95,0x0B,0x93,0x6A,0xC3,0x02,0x34,0xC7,0xE6,0x7F,0x56,0x62, + + 0xB2,0x3A,0x54,0xE6,0x96,0x2A,0x87,0xD5,0xC6,0x94,0xC2,0xCE,0x57,0x98,0xA8,0xFE, + + 0x4D,0xD2,0xFD,0x52,0x85,0x6E,0xE5,0x10,0x6A,0xDB,0x0A,0x05,0x76,0xB5,0xC9,0xF7, + + 0xC4,0xF9,0xD2,0x90,0x65,0xBF,0x2D,0x6B,0xF3,0xCC,0xEA,0x85,0x48,0x42,0x23,0xCD, + + 0xD1,0x3E,0xB3,0xB1,0x08,0xC4,0x16,0xD0,0x5B,0x68,0xC8,0xA8,0x9D,0x7B,0x26,0x9F, + + 0x52,0x46,0x07,0xEC,0x86,0xA6,0xBD,0x3E,0x68,0x25,0x80,0x8B,0x16,0xF6,0xB6,0xF5, + + 0x66,0xAB,0x18,0xC0,0x29,0x67,0x8E,0x6C,0x72,0xD2,0x9A,0x5C,0x70,0xBB,0xBF,0x73, + + 0xCE,0xD6,0x18,0xA2,0x49,0x6A,0xFF,0xFF,0x1E,0xD3,0x3F,0x3D,0x3F,0xED,0x73,0x39, + + 0xAA,0x11,0xE5,0xB1,0xFC,0x2E,0x57,0x9C,0xE1,0x5A,0xE7,0xD1,0x12,0xBE,0xFE,0x25, + + 0x1C,0xAA,0xEC,0x22,0x3F,0x46,0x36,0x17,0x33,0x66,0x7B,0xC5,0x4F,0x08,0x35,0x9D, + + 0x45,0xFA,0x5C,0x5D,0xBE,0xB4,0x72,0xAB,0xEA,0xFA,0xA4,0x28,0xFF,0xAE,0xD7,0x87, + + 0x08,0x8F,0xAC,0x18,0x56,0xEE,0xEC,0x03,0x53,0x24,0x69,0x7B,0x8D,0x91,0x48,0x1D, + + 0xE9,0x91,0x67,0x62,0xCE,0xFD,0x70,0x6B,0x69,0x4D,0x1F,0x9C,0xB1,0xCF,0x1B,0x12, + + 0x81,0x11,0x8E,0x6A,0xB6,0x31,0x20,0x50,0x47,0x03,0xFE,0x55,0x50,0x21,0x11,0x76, + + 0xC8,0x6A,0x41,0x9D,0x21,0x2A,0x6E,0xA3,0x40,0x25,0x07,0x56,0xBC,0x0E,0x85,0x29, + + 0x91,0x07,0x36,0xF3,0x2C,0x2A,0x5E,0xB3,0x41,0xE3,0xB5,0xA3,0xBA,0x6C,0x12,0x6E, + + 0xE9,0x60,0xC0,0xBB,0xE7,0xA7,0x38,0x67,0xE1,0x21,0x3A,0x94,0x5A,0x2B,0xF5,0x61, + + 0x6F,0xAA,0x69,0x32,0xCD,0x37,0x5E,0x5C,0xAA,0x14,0x9E,0x9C,0x94,0x28,0x1B,0x40, + + 0x21,0x8D,0x45,0xBB,0x1D,0x3D,0xEE,0x83,0x8A,0x57,0x88,0xBE,0x77,0x6D,0xE9,0x23, + + 0xE1,0x1B,0x71,0xCB,0x90,0x3F,0x01,0x75,0x8B,0x76,0xC1,0xF5,0x32,0x28,0x86,0xCD, + + 0x78,0xF3,0xCD,0xFD,0x60,0x28,0xBE,0x8D,0x9D,0x2B,0x12,0x5F,0x34,0xED,0x19,0xFA, + + 0x41,0xE8,0x17,0x98,0x43,0x31,0x97,0xDF,0xBC,0x7B,0x9D,0xFB,0x93,0x10,0xC3,0x2D, + + 0xEA,0xA7,0xA5,0x60,0xEC,0x87,0xB8,0xE3,0x73,0x71,0x81,0xAD,0xDE,0x62,0x17,0x10, + + 0x68,0xA4,0x83,0x09,0xF2,0x9A,0xE7,0xBB,0x49,0x0C,0xC1,0x3F,0x6A,0xB6,0x3C,0x4F, + + 0xAB,0x85,0xFC,0x79,0x72,0x21,0x72,0xEF,0x02,0xAD,0xB2,0x23,0x27,0x61,0x54,0x4B, + + 0x67,0x02,0xF0,0xEC,0x82,0x6F,0x7A,0xA1,0xEA,0xC7,0xB7,0x9A,0xF7,0xC0,0xC7,0xA9, + + 0xB5,0xA3,0xD1,0x59,0x71,0x6A,0x67,0x7A,0xEE,0x48,0xF9,0xBD,0x86,0x75,0x79,0x4A, + + 0x28,0x3E,0x43,0x2F,0xA8,0xCF,0x23,0x2B,0x88,0xBF,0xCA,0x9F,0xFF,0xC0,0xE8,0xB1, + + 0x4C,0x52,0xC3,0x94,0x03,0x97,0xAB,0x46,0x53,0xC6,0x9C,0xBD,0xFF,0xF6,0x74,0x81, + + 0x4D,0xBC,0x05,0x10,0x6B,0xB1,0x3C,0x03,0xC0,0x58,0xFE,0xB6,0x70,0xA1,0x95,0x60, + + 0xC3,0x32,0x45,0x1C,0x91,0x29,0xD5,0x3D,0xDA,0x54,0x94,0xDB,0x91,0x76,0x9B,0x23, + + 0xFD,0x3D,0xD4,0xD8,0xB7,0x81,0xDD,0x35,0xBB,0x55,0xC7,0x36,0x99,0x92,0xD3,0x33, + + 0xA6,0x9F,0xAD,0x2F,0xCD,0xBF,0x34,0xAF,0x1F,0x59,0x8E,0xEB,0x0E,0x6B,0x88,0x97, + + 0xF9,0xEA,0x6C,0xA6,0x51,0x09,0x05,0x3B,0xC6,0x39,0xCB,0x1E,0x92,0x3A,0x61,0x7D, + + 0xA4,0x1E,0x0D,0xF4,0xDE,0x99,0x7F,0x31,0xBE,0xA9,0x6E,0x03,0x91,0x02,0xF6,0x4B, + + 0x7A,0xEA,0x0D,0xE0,0x6D,0x3F,0xBA,0x31,0xBB,0x4C,0x62,0xC4,0x52,0xD6,0x96,0xC7, + + 0xD5,0x64,0x9E,0xE3,0xC7,0xE3,0x36,0xB9,0xE5,0x3B,0xE8,0xAA,0x99,0xFB,0x70,0xF5, + + 0xAB,0x1D,0xC9,0x94,0x0A,0x8F,0x63,0x51,0xB7,0x36,0x9A,0x5E,0x90,0x50,0x67,0x8B, + + 0xEB,0x17,0x87,0x65,0x6A,0x78,0xBC,0x0C,0x3D,0x44,0x26,0x5E,0x74,0xF1,0xC3,0xFB, + + 0x42,0x01,0x4F,0x04,0x98,0xC7,0xA4,0x30,0x46,0x5D,0xDD,0x42,0x10,0x9A,0x69,0x32, + + 0xA5,0xA1,0x40,0xBE,0xB8,0x40,0xFA,0x8E,0x95,0x47,0xEE,0x13,0x83,0xDD,0x6E,0x4A, + + 0xAB,0x15,0xC8,0xE9,0xB2,0xF0,0x64,0x10,0xB8,0x12,0x05,0xEC,0x18,0x07,0x25,0xC9, + + 0x5B,0x97,0x9F,0x2F,0x3A,0xBE,0x3A,0x8F,0x96,0x11,0xEF,0xDC,0x5B,0xC1,0x5A,0x5D, + + 0xAA,0x15,0xF1,0x05,0x98,0xBE,0x06,0x38,0x4E,0xD6,0xC8,0x79,0xDF,0xB6,0xB6,0xF2, + + 0xC5,0x21,0xA0,0xF7,0x60,0x5F,0x08,0x42,0x42,0x82,0xAA,0x24,0xC6,0xEA,0x10,0x72, + + 0x53,0x0A,0xBF,0x16,0xDD,0xBB,0x94,0x97,0x90,0xA2,0x58,0x07,0x39,0x4E,0xB7,0x87, + + 0xAC,0x96,0x87,0x3B,0xA9,0x09,0x76,0xA1,0x44,0x62,0x31,0x64,0x52,0x69,0xBA,0x22, + + 0xE9,0xC1,0x3A,0x64,0x86,0xE1,0x92,0xF9,0x7E,0xF8,0x19,0x45,0xB7,0xB6,0x1E,0x6E, + + 0xE7,0x2B,0x4B,0x01,0x18,0x78,0x0E,0x4A,0x66,0xC7,0x54,0x04,0xAD,0xA6,0x0E,0x23, + + 0x04,0x4C,0xB2,0x13,0x7F,0x44,0x8F,0x14,0x66,0x85,0x9A,0x72,0x73,0xE3,0x70,0x30, + + 0xB6,0xEA,0x25,0x8D,0x2D,0x59,0xF1,0x00,0x10,0xDD,0xBF,0x45,0x2B,0x8A,0xA9,0x13, + + 0x84,0x0C,0x97,0x51,0x76,0x24,0x45,0xED,0x2E,0x5D,0x53,0xB1,0x76,0x65,0x36,0x00, + + 0xAD,0x83,0xE5,0x46,0x1D,0x68,0x44,0xCD,0xB9,0xFA,0xCC,0x29,0x3F,0xC8,0xBC,0xF0, + + 0xA8,0x03,0x39,0xE1,0xD5,0x78,0xC5,0x32,0xE8,0xD2,0xAE,0xCF,0xFE,0xA9,0x61,0xFB, + + 0xE5,0x2B,0xFD,0x36,0x9C,0x01,0xCF,0xC3,0x2E,0x87,0xCB,0x5C,0xB0,0xE3,0x53,0xFB, + + 0x99,0x00,0xE2,0xF7,0x7F,0xE9,0xD8,0x64,0x6A,0xDB,0x89,0x0F,0x89,0xA9,0x03,0x77, + + 0xE5,0xC8,0xCF,0xCA,0x72,0x5A,0x2A,0x66,0x7D,0x46,0x8A,0x9E,0xC2,0x5D,0xCE,0x38, + + 0xFC,0xE8,0x87,0xB6,0x53,0x71,0x90,0x1C,0x6E,0x4D,0x5F,0x43,0xEC,0xA0,0x39,0x59, + + 0xF8,0x21,0xAB,0xC2,0x98,0xE6,0xCB,0x8B,0x86,0xD5,0x8A,0x09,0x29,0x65,0x53,0xA0, + + 0xEC,0x83,0x47,0xDA,0x4A,0xCD,0x41,0x93,0x54,0x80,0x57,0xE1,0xDC,0x2F,0x44,0x80, + + 0x84,0x9D,0x19,0xD9,0x43,0xB0,0x14,0x10,0xC5,0xD9,0x18,0x39,0x77,0x91,0x30,0x70, + + 0x84,0xFF,0xAD,0x7E,0xEB,0xF3,0x1C,0xA3,0xE8,0xB2,0x2A,0x84,0x15,0xB3,0x6F,0x9E, + + 0x26,0xAE,0xFC,0x19,0xB2,0x00,0xF5,0x27,0xBE,0xD4,0xEB,0x45,0xF0,0x5F,0x4F,0x87, + + 0xA4,0xF3,0xEA,0xF7,0x86,0xC8,0x96,0x16,0x30,0xCD,0x7D,0xF7,0xAD,0x9D,0x3E,0x42, + + 0x5A,0x3B,0x84,0x89,0x15,0xB9,0x70,0x82,0x5D,0x59,0xCC,0x1C,0x70,0xB5,0x12,0xD5, + + 0xA6,0xF1,0x29,0x3E,0xBA,0xF8,0xC4,0x0D,0x8E,0x34,0xF4,0xE6,0x48,0xD5,0xC5,0x33, + + 0x18,0x45,0x49,0x54,0x86,0xBC,0x0B,0xD6,0xD5,0x11,0x69,0x85,0x79,0x60,0x45,0xD5, + + 0x2A,0xF2,0x12,0xB5,0xCB,0xB8,0xD1,0x6C,0xE4,0x4E,0xDD,0xF3,0xC8,0xF7,0x7C,0x9E, + + 0x8F,0x83,0x66,0x12,0x06,0xF9,0x4B,0x43,0xB6,0xB7,0xD4,0xA6,0x89,0x71,0x77,0xD6, + + 0xCC,0xD6,0x90,0xFF,0x82,0xE2,0xB7,0xDC,0x9A,0xC9,0x3D,0x4E,0xF3,0x58,0x55,0x0F, + + 0xFA,0xA9,0x7C,0xA1,0xC3,0xFC,0x8C,0x22,0x43,0xC1,0x97,0x3D,0x7C,0xF2,0x2E,0xE8, + + 0xBE,0xD4,0xAF,0xED,0x46,0xF9,0x87,0x44,0x62,0xC0,0x29,0x4C,0x79,0x76,0x5E,0x51, + + 0xD1,0x3C,0xDC,0x26,0xED,0xF3,0x2C,0x3E,0x06,0x3D,0x4D,0x3E,0x76,0x85,0x28,0xDD, + + 0x65,0xD9,0xB7,0x1F,0x9A,0x34,0x40,0x22,0x4E,0x47,0x62,0x84,0xDC,0x0D,0xC7,0x18, + + 0x2A,0xDE,0xE6,0xA9,0x9F,0x2E,0x0E,0x8D,0xCF,0xD7,0xEF,0xFE,0xF8,0xBF,0x57,0x41, + + 0x2C,0xDB,0xEB,0xBF,0xF7,0xA4,0xBF,0xBF,0x74,0x5E,0xF8,0x21,0x60,0xBE,0xA8,0x25, + + 0x85,0xC1,0x96,0x66,0xAF,0x8D,0x18,0x24,0xC7,0x31,0x50,0x18,0xD9,0x22,0x51,0xA2, + + 0xA4,0xAE,0xF7,0x10,0x4C,0xB2,0xA0,0xDE,0x51,0x0C,0x58,0x08,0xD8,0x65,0xA9,0x30, + + 0x05,0x73,0x98,0xA0,0x27,0xAF,0xF9,0x04,0xF3,0x9F,0xC9,0x6A,0xAF,0x22,0x9F,0x19, + + 0x24,0xAC,0xAF,0xF0,0xA1,0x25,0xB5,0xA3,0x89,0x1E,0xC4,0xB7,0x51,0x9A,0x1A,0x48, + + 0xA1,0x46,0x78,0x64,0xFF,0x44,0x45,0xE2,0xDF,0xCD,0xB6,0xC5,0xB9,0xC7,0x56,0x78, + + 0x22,0x35,0xA3,0x32,0xEC,0x4B,0xA5,0x0A,0xCC,0x13,0xA6,0xC4,0xBA,0x06,0x1D,0xDA, + + 0x6B,0x6D,0x79,0x55,0x35,0x3D,0x69,0x8F,0x4F,0xD0,0xEF,0xD5,0x18,0x65,0x29,0x53, + + 0xF3,0xAA,0xAB,0x51,0x92,0x57,0x51,0x60,0x62,0x38,0xCB,0x3F,0x2C,0xEA,0x13,0x4F, + + 0xCA,0x4B,0xA2,0x4C,0xB9,0x87,0x70,0x28,0x49,0x22,0xAA,0xCC,0x04,0x73,0x68,0x1A, + + 0x0A,0xC9,0xE8,0x09,0x18,0x79,0x0B,0x09,0xBD,0xA8,0x9F,0xBE,0xD9,0xF8,0x3D,0x3C, + + 0xE9,0x0E,0x96,0x7E,0xA0,0x44,0x03,0x00,0x8B,0x49,0xDF,0x4B,0x3A,0x2A,0x55,0x2C, + + 0x89,0xA0,0xEB,0x1F,0xDC,0x26,0xAC,0x11,0xBA,0x4B,0xC1,0x2A,0x7A,0xE4,0x9E,0xAA, + + 0xE9,0x69,0x7D,0x1C,0x9A,0x63,0x69,0xE7,0xF5,0x4A,0x84,0xC8,0xAD,0x00,0x13,0x1F, + + 0xAE,0xB2,0x9E,0x1A,0x63,0x6C,0xE7,0xBF,0x99,0x47,0xBC,0x40,0x5A,0x2F,0x3B,0x6D, + + 0x6B,0x31,0xFE,0x2D,0x9E,0x60,0xFE,0x18,0x6B,0xD1,0x6C,0xFE,0xA6,0xB3,0x12,0x96, + + 0x2E,0xBE,0xE0,0x22,0x4A,0x92,0x5C,0x89,0xC3,0x53,0xE5,0xCC,0xBB,0x73,0xC4,0x60, + + 0x9D,0xEB,0x44,0x74,0x97,0xCB,0xC3,0xD5,0xED,0x4B,0xAC,0xF4,0x74,0x7F,0xE0,0x78, + + 0xDC,0x5C,0xB2,0xBD,0xD3,0xA1,0x54,0x91,0x1A,0xD1,0x0B,0x56,0xF3,0x75,0x85,0x05, + + 0xD4,0x3E,0x05,0x01,0xC4,0x1E,0xEB,0x25,0x9E,0x00,0xAD,0x57,0x72,0x76,0x6F,0x90, + + 0xB3,0x5E,0x8D,0xD5,0xB5,0x1B,0xDD,0x0C,0xD8,0x3F,0xC4,0xD7,0x0E,0x77,0x9F,0xD9, + + 0xA2,0x8D,0x43,0x35,0x91,0x35,0x57,0xA0,0x72,0xD9,0x82,0xD4,0x8D,0xDB,0x16,0xBC, + + 0x5B,0xBA,0xB2,0xE9,0x8A,0xBF,0xE7,0xF2,0x7F,0x4E,0x23,0x07,0x55,0x19,0x9E,0xDD, + + 0x43,0xA9,0xF7,0xD6,0x11,0xE7,0x0C,0x3B,0x45,0x46,0x01,0x96,0x90,0xF5,0xED,0xA3, + + 0xC1,0x6B,0x4A,0x24,0x10,0x36,0x32,0x97,0x1C,0x39,0xE3,0x50,0x39,0x86,0x64,0x88, + + 0x2B,0x58,0x04,0x0E,0x00,0xD2,0x4F,0x4B,0x6E,0xAB,0xD0,0xEA,0x72,0x7E,0xB6,0x76, + + 0x39,0x54,0x11,0xBD,0x16,0x18,0xA7,0x2A,0x61,0x51,0x65,0x5E,0xD8,0xF3,0x03,0xE6, + + 0x9B,0xD5,0x91,0xEF,0x97,0x1B,0xD6,0x69,0xAA,0x36,0xB7,0x91,0x59,0xF0,0xF2,0x5E, + + 0x63,0x0A,0x53,0xBC,0xD6,0x1A,0x9C,0x7F,0xC5,0x15,0xE0,0x5F,0x58,0xF4,0x38,0xCF, + + 0x8B,0x83,0xF4,0xDF,0x99,0x3F,0x34,0xF0,0x6B,0x9C,0xE8,0x48,0xB0,0xAD,0x2D,0x37, + + 0xDA,0x73,0xC1,0xBE,0x35,0x5F,0x49,0xDC,0x96,0x56,0x0E,0xEF,0x07,0x1E,0x5F,0x19, + + 0x27,0xE3,0xB9,0x6C,0x38,0x3A,0x6D,0x61,0x4D,0x12,0x9F,0xF9,0x32,0xAF,0xA8,0x99, + + 0xA7,0x82,0x0B,0x0D,0xB3,0x86,0x5D,0x11,0x30,0x82,0x73,0x8E,0xD5,0xD9,0x31,0xA6, + + 0x02,0x4B,0xBE,0x2F,0x35,0xE0,0x6F,0x27,0x42,0xE0,0x04,0xC4,0x52,0x08,0xE8,0xE3, + + 0x5D,0x2C,0x88,0x42,0xB6,0x0C,0xF9,0xF5,0x76,0x2E,0x2B,0x75,0x2E,0xE1,0xB5,0x87, + + 0x8D,0xE3,0xAD,0x96,0x75,0xA4,0xC5,0xBA,0xC2,0x82,0x41,0x55,0x2B,0xA0,0x72,0x54, + + 0x47,0xE3,0xBC,0x50,0x57,0xA0,0xF9,0x8E,0xD3,0xCB,0xE2,0x57,0xAA,0xC3,0x98,0xC0, + + 0x9B,0x5D,0xF8,0x5A,0x25,0xBC,0x4F,0x28,0x56,0xC0,0x0F,0x14,0x3C,0x67,0x0F,0x12, + + 0x17,0x08,0x50,0xA5,0x79,0xA3,0x03,0x99,0x1F,0x78,0x1F,0x05,0x71,0x33,0x59,0xB8, + + 0x23,0xEA,0x59,0xB4,0xF0,0xB6,0xF1,0x24,0xE8,0xD8,0x0A,0xA0,0x3F,0x85,0x91,0x5B, + + 0x20,0x97,0xC9,0x9A,0x17,0x37,0x63,0x63,0xE4,0xD1,0xF1,0x63,0xB4,0x2D,0x6A,0x9E, + + 0x2E,0x69,0xAA,0x9A,0xF5,0x99,0xB2,0x28,0x2E,0xD3,0x72,0x4F,0x9B,0xEC,0x3A,0x0F, + + 0x55,0x72,0x2D,0xE3,0x11,0xEB,0xBA,0xFA,0x6F,0x02,0x3C,0xBC,0xDD,0x38,0xE7,0x2B, + + 0xB4,0x88,0x4F,0x9D,0x9D,0xA0,0x56,0x5D,0x41,0x4C,0xFF,0xE9,0xD6,0xA4,0xAF,0x9F, + + 0xF9,0xA7,0x38,0x5C,0x61,0x9A,0xBB,0x39,0xBD,0x89,0x83,0x6F,0xD5,0xE4,0x9A,0x0C, + + 0x72,0x7B,0xBB,0x1F,0xBB,0x03,0x12,0x68,0x4D,0xC1,0xE1,0x84,0xBF,0xA3,0x33,0x95, + + 0xA8,0x89,0x3C,0xDC,0x9F,0x37,0x07,0x11,0x3B,0x12,0xAC,0x0D,0x79,0x4B,0x9C,0x5E, + + 0x6F,0x51,0x31,0x47,0x3B,0x01,0x63,0x19,0xCA,0x43,0x5F,0x1C,0xF0,0x48,0xB7,0xE4, + + 0x78,0x0F,0xD3,0xB4,0x5E,0x25,0x63,0x6A,0x40,0x49,0xA9,0x3F,0x8F,0x42,0x1A,0xB7, + + 0x45,0x94,0x7F,0xA7,0xEC,0x91,0x21,0xD0,0x57,0xE6,0xD4,0xA4,0x08,0xFF,0x4D,0xD2, + + 0x69,0x92,0xD2,0xD7,0x71,0x90,0x59,0x46,0x6D,0xBD,0xF0,0xB4,0x6B,0x5A,0x5C,0xED, + + 0xC5,0x96,0xD3,0xA6,0x3F,0x93,0xCF,0xA1,0xA4,0xC9,0x8F,0x58,0xF2,0x73,0xB9,0x1B, + + 0x22,0x52,0x10,0xB6,0x16,0xFD,0x64,0xCD,0x40,0x55,0x61,0xBD,0x75,0x31,0x83,0x2D, + + 0xA4,0xE8,0xFC,0xCB,0xC7,0xF6,0x8C,0x0A,0xBD,0x99,0x63,0x15,0x58,0x59,0x80,0x5C, + + 0x24,0xD7,0x65,0x3E,0xAF,0xB1,0x3D,0x14,0x77,0x98,0x2C,0xB1,0x9E,0x56,0x7B,0xA1, + + 0x11,0xEB,0x26,0x87,0xB0,0x64,0xEE,0x83,0xA8,0x5B,0x25,0x74,0x82,0x59,0x37,0xD2, + + 0x36,0x2A,0xE8,0xAD,0xB1,0x65,0x82,0x34,0x25,0xD7,0x9B,0xCA,0x1C,0x54,0x06,0x1A, + + 0x2A,0x6B,0x25,0xCF,0x78,0xF4,0x32,0xEA,0x24,0xC3,0xE8,0x4B,0xE4,0xFC,0x95,0xEA, + + 0xAD,0x86,0xF5,0x8B,0xB8,0x48,0xD6,0x8B,0x1A,0xAE,0x2D,0xFD,0x7B,0xD2,0xB9,0x4C, + + 0x11,0x6C,0x24,0xCE,0xF8,0x11,0x52,0xDD,0xCD,0x9A,0xF3,0x52,0xF0,0xB8,0x96,0xEB, + + 0x2D,0x8D,0xA3,0x8B,0xC2,0xDB,0xE0,0x3B,0x04,0xE2,0x40,0x3D,0xFE,0x1D,0x4F,0xC2, + + 0xAE,0xDC,0xAC,0x4A,0x68,0xE4,0x7E,0xFF,0x93,0x5A,0xC8,0x5E,0xB4,0x2D,0x95,0x7A, + + 0x5B,0x4C,0xBC,0xD6,0x9A,0x12,0x69,0x12,0xB4,0x00,0x49,0x5B,0x79,0x2F,0xCB,0x6E, + + 0x3D,0x01,0xBE,0xD8,0x1B,0x11,0x70,0x2B,0xEA,0x90,0x89,0x5F,0x0A,0xBD,0x4F,0x7F, + + 0x8F,0x4E,0xB9,0x98,0x56,0x1C,0x87,0xDF,0xDC,0x41,0x34,0xC1,0x99,0x0A,0xD6,0xFA, + + 0xFB,0x42,0x67,0x44,0x1C,0xDB,0x49,0x11,0xE5,0x31,0x92,0x42,0x2C,0x2F,0x30,0x6F, + + 0x80,0x0C,0x3F,0xB5,0x35,0x6D,0xAF,0x95,0x09,0x22,0x74,0xA6,0x30,0x69,0x85,0x04, + + 0x75,0x0E,0x7E,0x21,0x74,0xA1,0xEC,0x53,0xF6,0x1D,0xAB,0xD6,0xF3,0x2F,0xBA,0xA1, + + 0x7D,0xA0,0x59,0x66,0xB2,0x28,0xD9,0xF1,0x4F,0xB7,0xD9,0x53,0xB1,0xF5,0xBB,0x70, + + 0x51,0xAB,0x47,0x37,0x26,0x85,0x11,0xA7,0x44,0xF6,0x98,0xF6,0xF3,0xE3,0x36,0x57, + + 0xA2,0x47,0x82,0x50,0xF8,0xB4,0x1A,0x83,0x1C,0xCE,0x80,0xF6,0x50,0xC3,0xE1,0x33, + + 0xE0,0x5A,0xF9,0xBA,0xFB,0x57,0x4C,0x21,0x82,0x7B,0x2E,0x96,0xD4,0x8E,0x0E,0xE5, + + 0x6A,0xBD,0xF7,0x78,0xD0,0x07,0x92,0x4D,0x28,0x03,0xE7,0x58,0x70,0x61,0xC2,0x94, + + 0x5F,0x06,0x4B,0xE4,0x44,0x65,0xC2,0x5A,0xF3,0x57,0x6A,0xC4,0xD5,0xE3,0xF1,0x9C, + + 0x05,0xDD,0x85,0x3C,0x3F,0x71,0x9E,0x3D,0x7A,0xA9,0x22,0x2C,0xFE,0x6D,0x3B,0xF6, + + 0x0B,0x07,0x9B,0xCD,0xBA,0x6A,0x68,0xD2,0x3F,0x08,0x97,0xCB,0xEB,0x6A,0x9B,0x06, + + 0xB5,0xBF,0x63,0xB9,0x9F,0x33,0xDB,0x29,0x84,0x17,0x99,0x4F,0xEA,0x07,0x82,0xD1, + + 0x69,0x04,0x4D,0xBF,0x26,0x81,0x68,0xD8,0xDF,0x0E,0x9A,0xFE,0xF9,0x6A,0x81,0xDC, + + 0x51,0xCE,0xAF,0xB4,0xDD,0xE0,0x42,0xFC,0x11,0xE6,0xA2,0x58,0x30,0x62,0xC3,0x0A, + + 0x70,0xA3,0xD0,0xAD,0x9E,0x03,0x14,0xCD,0x47,0xE3,0xDB,0x25,0xB9,0x4E,0x8B,0xC0, + + 0x35,0x63,0xB4,0xA0,0x93,0x6D,0x13,0x69,0x72,0xCF,0x5B,0x0E,0xE9,0x2D,0x02,0x68, + + 0xF0,0xDD,0x5F,0x2B,0x4F,0x32,0xD4,0x08,0x5A,0xFD,0xB4,0x75,0xD1,0xFA,0xB4,0xD7, + + 0xFF,0xEE,0xC2,0xDF,0x32,0xC3,0x04,0x38,0xEC,0xF7,0xAE,0x4B,0x42,0x71,0x7B,0x21, + + 0x93,0x60,0x45,0x98,0xFC,0x70,0xC5,0x43,0x09,0xA3,0x12,0x54,0x53,0x22,0x54,0xB5, + + 0x04,0xCC,0xDD,0x35,0xFF,0x71,0x4B,0x71,0xEF,0xA6,0x25,0x72,0x2F,0xDE,0x84,0x59, + + 0x44,0x56,0x04,0x80,0x41,0xC9,0xC4,0xFF,0x56,0x52,0x60,0x86,0x99,0x30,0xE0,0x54, + + 0x79,0x8C,0xDF,0xA7,0x43,0x59,0xED,0xFC,0xE1,0x5F,0xF4,0x87,0xFF,0xF3,0x86,0x49, + + 0x03,0x69,0x4E,0xA5,0xB8,0x96,0x1D,0x76,0x43,0xD1,0xF4,0xE2,0x7D,0xF0,0x45,0xAC, + + 0x4A,0xAD,0xAF,0xD0,0xB2,0x99,0x3F,0x93,0x1C,0x32,0xDD,0x35,0xE1,0xFC,0xAA,0xF7, + + 0xFE,0x9A,0x56,0x74,0x0B,0xB6,0x81,0x2C,0x3D,0x25,0xEE,0xDC,0xF8,0x67,0xF1,0x69, + + 0x03,0xE6,0x10,0x03,0x5A,0x3D,0x78,0x08,0x6A,0x99,0x98,0x41,0x71,0x3B,0x79,0x38, + + 0xC3,0x99,0x3F,0x72,0x37,0x97,0xAC,0x5A,0xCE,0x36,0xCD,0xAF,0x6A,0x72,0x35,0x6A, + + 0xDD,0xB6,0xF6,0xEC,0xDC,0x2D,0x39,0x1D,0x8B,0xFF,0x90,0x3E,0xD9,0xAB,0x86,0x51, + + 0x4C,0x21,0xA6,0x8D,0xD7,0xB7,0x6E,0x95,0x4B,0x8C,0x1B,0xDD,0x48,0x3E,0x55,0x98, + + 0x67,0x5F,0xAE,0x1C,0xF9,0x90,0x14,0x03,0xC8,0x5B,0xA6,0x0D,0xD8,0x3D,0xBA,0x0E, + + 0xAC,0xAC,0xBC,0x2F,0x3A,0xE1,0x37,0xA8,0x64,0x53,0xC3,0xE7,0x99,0x81,0x08,0x76, + + 0x0A,0x9D,0x5E,0x3F,0x39,0x37,0x53,0xFE,0x4A,0xD7,0xE1,0x55,0xFD,0x5E,0x33,0x0D, + + 0x7C,0x0B,0xFF,0xC0,0x18,0xBB,0x8B,0x6C,0xD9,0x3D,0x48,0xA2,0x1F,0xDC,0x6E,0x70, + + 0xEE,0xE2,0xB6,0x09,0xB6,0x24,0x81,0xD0,0xE9,0xBC,0xFC,0x44,0x66,0xE1,0x51,0x3E, + + 0x82,0x91,0x63,0x61,0x6B,0x0F,0x9C,0xA7,0xF6,0xC2,0xF9,0x22,0xF6,0x10,0x70,0x9B, + + 0x20,0x7C,0x8F,0xF5,0xDC,0x0C,0x41,0xC0,0xE3,0x1E,0x41,0xDF,0x13,0x2E,0xA0,0xDB, + + 0x3F,0x8E,0x26,0x74,0xF7,0x0B,0x0E,0x02,0xAF,0x7E,0xE4,0xD1,0xF7,0xFB,0xA3,0x6E, + + 0xEC,0xC1,0xD2,0xB4,0x11,0xFD,0x06,0xAB,0xAE,0x3F,0xD9,0x71,0xDA,0x63,0xE1,0x00, + + 0x7C,0x0D,0xF2,0xC5,0x97,0xBE,0x21,0x14,0xCA,0x4B,0x45,0x05,0x3D,0xA2,0x53,0xE3, + + 0x12,0x28,0x70,0xBA,0x87,0x18,0x29,0x04,0xCB,0x4A,0x99,0x04,0x5B,0x61,0x8E,0x79, + + 0x22,0x7E,0x28,0xF2,0x94,0x53,0x2A,0x2F,0x27,0x8B,0xCD,0xD3,0x54,0xAA,0xAD,0xF2, + + 0xC7,0x44,0xEA,0xE7,0x8F,0x32,0x02,0xC5,0xA4,0x8A,0x9A,0x1F,0x6E,0x19,0x5D,0x36, + + 0xE7,0x89,0x8B,0xE3,0x22,0xD1,0xCC,0xAF,0xFE,0xF9,0x75,0x1D,0x3D,0x15,0x69,0x6A, + + 0xB1,0x80,0x0E,0x9B,0xCC,0x81,0xD7,0xA4,0xCC,0x0B,0x03,0xDF,0x83,0xED,0xC6,0x28, + + 0x08,0x3E,0xB9,0x0C,0xE1,0x77,0x0C,0xB7,0x2D,0xB8,0xF2,0x2E,0x3C,0x51,0x2D,0xAA, + + 0x0E,0xCD,0xB5,0x56,0x6C,0xAD,0x85,0x6B,0x54,0xE8,0xFA,0x3E,0x2F,0xAF,0xB1,0x38, + + 0xD1,0xCC,0x80,0xCB,0x96,0x5D,0xE4,0x81,0x2F,0x81,0x91,0xED,0x2F,0x68,0x47,0xE0, + + 0x66,0x86,0x34,0x5F,0xE8,0xA3,0xC1,0x66,0x67,0x02,0xEF,0xD8,0x7E,0xF0,0xB7,0xC5, + + 0xEE,0x93,0xAC,0x96,0xB3,0x42,0xA3,0x03,0x2C,0x01,0xB6,0xD4,0x47,0xF0,0xEC,0x3A, + + 0x25,0x9C,0x2C,0x94,0x91,0x4A,0xFC,0x1A,0x1D,0xDC,0x04,0x48,0x88,0x9D,0x2D,0x87, + + 0x2C,0x8F,0x85,0x96,0xB2,0x18,0x33,0x9E,0x6C,0x28,0x4D,0x83,0xC7,0xF6,0xD6,0xB4, + + 0x04,0xEC,0xBC,0x7F,0xE9,0xFE,0xC2,0xC0,0x87,0xBD,0x5E,0xF7,0xF1,0xDF,0x1A,0x1B, + + 0x45,0x0E,0x12,0xB4,0x95,0xB2,0x70,0x00,0xE4,0xDE,0x02,0x16,0x89,0xFB,0x3E,0x9C, + + 0x21,0x27,0xE4,0x53,0x96,0x3F,0x42,0xDE,0xEA,0xB7,0x31,0xCB,0x71,0xD4,0xF6,0x30, + + 0x22,0x1B,0xED,0x68,0x15,0xB0,0x13,0x81,0x0D,0xA7,0x41,0x05,0xD2,0x7D,0xBD,0x94, + + 0x4E,0x4D,0x02,0x35,0x16,0x3D,0x65,0x76,0x0E,0xA6,0xDC,0x98,0x54,0x76,0x8F,0xF4, + + 0xB9,0x83,0xFE,0x9E,0x0F,0x6A,0xD1,0xEA,0x28,0x9A,0x9E,0x5E,0xE0,0x09,0xB9,0xDD, + + 0xF3,0x91,0x09,0x7C,0xDD,0x46,0x46,0x90,0x15,0x14,0x39,0xBC,0xC0,0x04,0x33,0xED, + + 0x53,0x37,0x1F,0x70,0x55,0xB1,0x66,0x92,0x05,0x59,0xCE,0xC9,0xDF,0x9A,0xAA,0xBB, + + 0xA7,0x8B,0xF6,0x9E,0x1A,0xA0,0xC0,0xC8,0x8F,0xB5,0xA9,0xDD,0x95,0xF6,0xA6,0x53, + + 0x45,0x96,0x11,0x2C,0xBC,0x94,0x68,0xC6,0x2D,0xFC,0x65,0x6A,0x56,0xE8,0xA5,0xA9, + + 0x70,0xDF,0x96,0xAC,0xC0,0x16,0x34,0xFB,0x90,0x70,0xEA,0x59,0x8E,0xF2,0x65,0xA0, + + 0xEE,0x31,0x43,0xAD,0xFD,0x51,0x09,0xD3,0x07,0x8F,0xAD,0xEE,0x5D,0xBC,0x28,0x6F, + + 0xA9,0x4D,0x49,0xDE,0xE3,0xB9,0xEA,0x2B,0x18,0xDB,0x4B,0x84,0x5C,0xBE,0xA7,0x2D, + + 0x06,0xA8,0x20,0x76,0x72,0x5C,0x72,0x21,0x43,0x0A,0x85,0x46,0xA7,0x05,0x30,0xE3, + + 0x71,0x64,0x2F,0x2C,0x93,0x25,0x0F,0xB4,0x69,0xA6,0x38,0x27,0x6D,0x05,0x26,0x83, + + 0x3C,0x00,0x36,0x03,0x7B,0x53,0x4F,0xC3,0xC4,0xEF,0xA9,0xDA,0x18,0xF3,0x31,0xE2, + + 0xF9,0x88,0x41,0x77,0x50,0xA9,0x21,0xCF,0x6D,0x4E,0x59,0x11,0x61,0xC3,0x1A,0xA2, + + 0x6A,0x15,0xD1,0x83,0xFB,0x35,0xC1,0x93,0x7E,0xEB,0xE8,0xB4,0x0E,0xCF,0x10,0x8C, + + 0x05,0x24,0xD2,0x56,0xA0,0x88,0xF7,0xF4,0x06,0x4C,0xE6,0x96,0x49,0x0A,0x3F,0x69, + + 0xC1,0x09,0xA7,0x69,0x7B,0x17,0x42,0x8E,0x1F,0x3B,0xA9,0x45,0x32,0x09,0x7C,0x33, + + 0x74,0x62,0x5F,0x25,0x13,0x31,0xE6,0xB6,0x01,0x27,0x49,0x85,0x60,0xC6,0xFD,0xFB, + + 0x2A,0xA7,0x05,0xFF,0x28,0x6A,0x04,0x89,0xB7,0xE5,0x83,0x5F,0x68,0xEF,0xDE,0x6A, + + 0xB2,0x82,0xB9,0x35,0x1F,0x0A,0x62,0x3C,0xA0,0xD8,0xA4,0x09,0xD4,0xEF,0x57,0xFA, + + 0xAE,0xA5,0x97,0x63,0x60,0x7B,0x43,0x95,0x3F,0xE1,0x17,0xFA,0x90,0x8B,0xE8,0x30, + + 0x8F,0x2A,0x3B,0x99,0xB1,0x76,0xDB,0x18,0x27,0x46,0x1C,0xFD,0xDD,0x4B,0x7A,0xB7, + + 0x0C,0x4D,0xCA,0x58,0xD2,0xCD,0x5A,0x7D,0xAB,0xE3,0x43,0x9F,0xDE,0xE1,0x28,0x5C, + + 0x08,0xAF,0x0A,0x18,0xC6,0x50,0x1B,0xFC,0x4E,0xB1,0xE2,0x58,0xD9,0x65,0x4B,0xCD, + + 0xAE,0x6E,0xD6,0x5E,0xAA,0x7F,0xC5,0x9A,0xFA,0x67,0x81,0x3A,0x31,0x0A,0x15,0xBB, + + 0x8F,0x72,0x0B,0x4C,0xC7,0x82,0xE6,0xFD,0x83,0xBF,0x0F,0x9F,0x59,0x47,0x62,0x20, + + 0x23,0xD0,0xCA,0x00,0x18,0x6D,0x45,0x8F,0x1C,0xE5,0xDE,0xB9,0x51,0x52,0x29,0xAC, + + 0xF8,0x2C,0x73,0x10,0x19,0x2E,0x0B,0x34,0x1D,0x07,0x85,0x8B,0x1D,0x33,0xA6,0x21, + + 0x7C,0x31,0xBD,0x7B,0x1C,0x3F,0xC1,0x9B,0xC6,0xA7,0xC5,0x3D,0xF4,0x5A,0x22,0xAE, + + 0xD9,0x51,0x4D,0xB1,0xF9,0xB5,0x47,0x8D,0x89,0x22,0xD5,0xB5,0xF7,0x32,0xFB,0x22, + + 0x24,0x55,0x4C,0x01,0x93,0xBE,0x52,0x92,0x89,0xB5,0xB4,0x44,0xCE,0x79,0xB3,0xA3, + + 0x4F,0x57,0xB3,0x36,0x17,0x38,0x4D,0x62,0x9C,0xF8,0x4C,0x07,0xF7,0xF8,0xCE,0x45, + + 0x86,0xBB,0x3E,0x27,0x13,0xBC,0x2B,0xC9,0x6D,0xFB,0xDF,0xF5,0x51,0x7B,0x59,0x0F, + + 0x56,0x18,0x87,0x2E,0x10,0x3A,0xCB,0x81,0x63,0xD1,0x8F,0xDB,0x18,0x13,0x51,0x36, + + 0xA5,0xE5,0x82,0x4C,0x3E,0x7A,0xD6,0x89,0xF8,0xD3,0xB4,0xBD,0x2B,0x50,0xDE,0x58, + + 0x6D,0xCD,0x3A,0xFE,0xC6,0x7B,0x60,0x8D,0x0A,0x93,0x08,0x38,0x51,0xF7,0x61,0x2C, + + 0x5D,0xBC,0x93,0x57,0x19,0xE5,0x13,0x4B,0xCC,0xD7,0x8E,0x5D,0x2E,0xDB,0xDF,0x86, + + 0x87,0x2F,0x1F,0xB4,0xBF,0x7A,0x09,0x8C,0x5A,0x16,0xA5,0x5F,0x9A,0xDC,0xF2,0xB7, + + 0x89,0x5E,0xCC,0xCD,0x99,0x7D,0xF1,0xA8,0x2E,0xF7,0xED,0x0E,0x5E,0xD3,0x8E,0x19, + + 0xF5,0xBD,0xF6,0x8C,0x3F,0x32,0xA1,0xD8,0x1F,0xFC,0xA0,0xFB,0xC6,0x72,0xD7,0xDB, + + 0x56,0xFF,0xFF,0x1D,0x4D,0x31,0xC1,0xF4,0x81,0x4F,0x77,0x9F,0x98,0xD2,0x04,0xDB, + + 0xB3,0x94,0x5F,0xBF,0xCC,0x3F,0x05,0x8D,0x97,0xF0,0x4F,0x9B,0x04,0x6F,0x4A,0x60, + + 0x25,0x33,0x1B,0xE4,0xB8,0x5D,0x4B,0x05,0xE5,0x61,0x59,0x02,0xF5,0x3F,0x70,0xA7, + + 0x66,0x50,0x9F,0x2E,0xE5,0xD0,0x6B,0xC8,0xCA,0x7C,0xA9,0xB2,0x28,0x3B,0xE1,0x27, + + 0xF1,0x8F,0xD9,0x83,0xBC,0x3C,0xE5,0xD8,0x2D,0x81,0x05,0x45,0x2B,0x97,0x3C,0x97, + + 0xAD,0x97,0x69,0xB6,0x31,0xE1,0xDE,0x49,0x13,0xCB,0x29,0x45,0x3E,0x02,0xA0,0x63, + + 0x98,0x5B,0x76,0xA4,0xBA,0x09,0x48,0x91,0x2A,0xA1,0x50,0x04,0x72,0x19,0xF8,0x0E, + + 0x01,0xC4,0xF2,0x4A,0x36,0xE5,0x1E,0x4A,0xAE,0xB4,0x2B,0x85,0xDB,0x68,0xD5,0x21, + + 0x79,0xC4,0xF0,0xA5,0x8A,0xDB,0x49,0x90,0xF6,0xAA,0xE6,0x94,0x52,0x6B,0xED,0xC1, + + 0x83,0x8F,0xE5,0x41,0x5F,0x96,0x63,0x71,0x74,0x6A,0x1D,0x8D,0xF3,0x9C,0x1A,0xEA, + + 0x78,0x34,0xB6,0xD4,0xE9,0xA7,0x35,0x39,0x34,0xDB,0xE8,0x5F,0x34,0x09,0xEA,0xA3, + + 0xFB,0xE5,0xB4,0x2F,0x71,0xB6,0x09,0x9A,0xB1,0x58,0xF0,0x23,0x7C,0x58,0x1E,0x50, + + 0x70,0x1B,0x17,0x70,0x3F,0x21,0x86,0x17,0x34,0xE9,0xCA,0x49,0x37,0xFB,0x94,0x88, + + 0xA7,0x56,0x13,0x6F,0x95,0xA0,0x1B,0x36,0x05,0x5A,0xFD,0x17,0x34,0xFA,0xF1,0xCE, + + 0x2A,0x84,0x78,0x5D,0x2A,0x45,0xE4,0x1A,0xCE,0xDA,0x72,0x96,0xE2,0x57,0x54,0x6F, + + 0x09,0xAC,0x12,0x56,0xF6,0x3C,0xEF,0x69,0x7F,0x5C,0x05,0x0C,0xF8,0xFD,0xA3,0x6F, + + 0x67,0x71,0xBA,0xC1,0x77,0xDF,0x3B,0x7F,0x06,0x2F,0xB3,0x92,0xDE,0xAF,0x50,0x25, + + 0x2C,0xEA,0x13,0x7B,0x3C,0xA9,0x45,0x4E,0xED,0x22,0x44,0x99,0xFB,0xE0,0xB3,0x8B, + + 0x9E,0x60,0xA2,0x14,0x3C,0xB8,0x6C,0xA6,0x4C,0x16,0xA2,0x93,0x72,0xB1,0x74,0x97, + + 0xCC,0x92,0xE4,0x96,0xD4,0x1E,0xBE,0x80,0x05,0x24,0xA5,0xC5,0x45,0x7B,0xD7,0xF0, + + 0x8E,0x1D,0xF1,0xB8,0xD8,0xF0,0x0B,0x96,0x8F,0xDD,0xE4,0xD5,0x57,0xDA,0x57,0xF3, + + 0xC8,0xFD,0xBC,0x13,0x9D,0xAC,0x43,0xB5,0x04,0x50,0xC5,0xD7,0xCE,0x06,0xA9,0xEF, + + 0x20,0xB5,0xCD,0xBC,0xA7,0xA4,0xD4,0x90,0x04,0xA8,0x4C,0xB9,0xD5,0x91,0x36,0xA3, + + 0x4F,0x74,0xB8,0x25,0xB3,0x38,0xCF,0xC7,0x9B,0xC4,0xF8,0x51,0x8A,0xEE,0x44,0xB0, + + 0xCA,0x99,0x75,0x37,0x73,0x17,0x0B,0xE4,0x47,0x69,0x4A,0x05,0xD2,0xB4,0x14,0xA0, + + 0x97,0xD8,0xBF,0x80,0x5C,0xD3,0x26,0xF3,0xE1,0xF7,0x7D,0xD3,0x08,0x2A,0x18,0x2B, + + 0xEE,0x99,0x9E,0x70,0x90,0xB5,0x9F,0x95,0xE8,0x77,0x20,0x2A,0x35,0x4C,0x66,0x42, + + 0xC4,0xFA,0x88,0xB7,0xB1,0xFB,0xA8,0x4B,0xCE,0x19,0x73,0x93,0x7B,0xD8,0x19,0x2B, + + 0x6E,0xBA,0x58,0x9C,0x88,0xFE,0x22,0xB4,0xD8,0x77,0x1A,0xD0,0x61,0x71,0x4D,0xBB, + + 0x44,0xD8,0x3F,0xB5,0xBB,0xFA,0x0D,0x8B,0xF5,0x74,0x9E,0x4F,0x02,0xF4,0x60,0xFF, + + 0xC7,0x7D,0xDE,0x31,0x1A,0x69,0x82,0x94,0xAF,0xC3,0x8E,0xC9,0x83,0xF3,0xEE,0xFB, + + 0x8D,0xDC,0x1D,0xE2,0xD4,0xF9,0x00,0xCF,0x92,0x51,0xDA,0xC8,0x5D,0xED,0xCB,0x59, + + 0xF2,0x94,0x37,0xDE,0x98,0x35,0x3D,0x09,0x7F,0xC7,0x67,0xCF,0xBE,0xBE,0x55,0x28, + + 0x97,0x30,0xD5,0x6F,0x76,0xFE,0x35,0xE6,0xFE,0x70,0x3D,0x5F,0xB7,0x9D,0x60,0x5F, + + 0xA3,0x0D,0xD4,0x43,0xDA,0x43,0x28,0x70,0x48,0x4F,0x6B,0xD4,0x17,0x91,0x28,0x11, + + 0x8C,0x09,0xC0,0x44,0x33,0x62,0x12,0x32,0xE2,0x5A,0xC2,0x06,0x2D,0x7E,0x73,0x04, + + 0x8C,0x6C,0xBF,0xA5,0x5A,0x61,0x71,0x65,0x40,0x4F,0xE8,0x43,0xF1,0xCB,0x89,0x12, + + 0x65,0x4F,0x0B,0x6E,0x1C,0xA5,0x9E,0x57,0x23,0x63,0x21,0xCE,0x5E,0xB5,0x38,0x44, + + 0xE2,0xA0,0xFA,0xBB,0x71,0xF2,0x30,0x62,0xC9,0x49,0x7F,0x0B,0x8F,0xB0,0x72,0xBF, + + 0x30,0x01,0xF0,0xB4,0x03,0xAE,0xBF,0x03,0x7B,0xC3,0x7B,0xE2,0x8F,0x83,0x39,0x68, + + 0x69,0x57,0x56,0xC1,0xBA,0xA8,0xAE,0xA6,0x2B,0x17,0x63,0x7A,0x3E,0x27,0xF1,0xAE, + + 0x3E,0x6B,0x25,0x68,0x95,0x66,0x59,0x31,0x8B,0x5C,0x87,0xE6,0xD7,0xCC,0x03,0x4E, + + 0x40,0x13,0x02,0xCC,0x00,0x29,0x90,0x5A,0xB3,0xB7,0x9A,0xFC,0xA1,0xBE,0x2E,0x2E, + + 0x2B,0x0B,0xE8,0x11,0x1A,0x38,0xDE,0x1C,0xA0,0x90,0xA2,0xC6,0xA0,0x07,0x97,0x6F, + + 0xA9,0x4A,0x53,0x31,0x61,0x44,0xD3,0xBC,0x28,0x06,0xEC,0xAF,0x49,0x3F,0x8C,0x9B, + + 0x54,0x04,0x4B,0x58,0xD7,0x23,0x43,0x3C,0xCF,0xE1,0xF8,0x7D,0x94,0x96,0xA5,0x88, + + 0x73,0x87,0x9E,0x3E,0xB9,0xDC,0x18,0x98,0x42,0x03,0xB0,0x68,0x7E,0xB8,0x52,0x3D, + + 0xD6,0x70,0x8C,0xAA,0x1D,0x56,0xA1,0x3F,0x81,0x77,0xBD,0x8D,0x89,0x2D,0xE6,0x64, + + 0x39,0x43,0x34,0x50,0x27,0x6C,0xC3,0x81,0x4A,0x03,0x30,0x72,0x04,0xC1,0xE4,0xDD, + + 0xC8,0x93,0x2E,0xD9,0xB1,0x9A,0x3B,0x2F,0x4C,0x40,0x4B,0x8E,0x3B,0x23,0x64,0x20, + + 0x7C,0x1F,0xCC,0x05,0xB0,0x90,0x44,0x87,0xC1,0xFF,0xCD,0xAA,0x76,0xC2,0x6C,0xD4, + + 0x66,0x9A,0x0D,0xFB,0x49,0x8E,0x98,0xEE,0xEC,0x33,0xDB,0x0D,0xD0,0xF1,0xED,0x85, + + 0x25,0x92,0x45,0xC0,0xFE,0x3A,0x41,0x9F,0xC2,0x49,0x3F,0xE5,0xA0,0x30,0x89,0x73, + + 0x23,0x5B,0xAD,0x84,0x0C,0x82,0xB6,0x34,0x72,0x6C,0xE5,0x37,0x68,0xD6,0x0B,0xBF, + + 0xAD,0xB2,0xA3,0xC0,0x59,0xA2,0x0C,0xF5,0x51,0x63,0x44,0xFB,0xF6,0xA0,0x37,0xE1, + + 0x13,0xBA,0x7A,0x25,0xDB,0x75,0x9F,0x82,0x88,0xCF,0x18,0x71,0x30,0x15,0x8E,0x01, + + 0xB4,0x9D,0x45,0xDB,0x56,0xC2,0xAD,0xE9,0x45,0x1A,0x71,0x87,0x4D,0x14,0xED,0x21, + + 0x5D,0xB4,0x93,0xE7,0xB7,0x7B,0x80,0xEC,0x18,0xAC,0xBD,0xB1,0xEC,0x78,0xCF,0x6A, + + 0xAA,0x50,0xF9,0x8F,0x92,0xC4,0x68,0x0D,0xBC,0x1B,0xCC,0xA4,0xDB,0x3A,0xBA,0x68, + + 0xD6,0x16,0xA7,0xB2,0x98,0x32,0xCA,0x4B,0x47,0xF4,0xFC,0x2C,0x78,0xEB,0x1F,0x79, + + 0xD7,0x15,0xB8,0xD2,0x9C,0x3C,0xBB,0xDA,0xC2,0xFC,0xD0,0x14,0x59,0x14,0x6F,0xDD, + + 0xA6,0x16,0x0F,0xBE,0x06,0x3D,0x4F,0x2A,0xCF,0xF4,0x5F,0x24,0x83,0xF6,0xD0,0x3B, + + 0xA6,0x11,0xA7,0xC2,0xEA,0x48,0xC5,0x14,0xD6,0x1E,0x6B,0x3C,0x36,0x7A,0x70,0xF0, + + 0x08,0x5D,0x69,0x4B,0xDA,0x92,0x46,0xCC,0x54,0xAD,0x56,0x3D,0x18,0x1D,0x52,0x22, + + 0xE2,0x0F,0xE0,0xE9,0x6E,0xF8,0x19,0xD7,0x03,0x64,0x87,0x75,0x59,0x78,0x49,0xEC, + + 0xF7,0x1B,0xA9,0x2C,0x79,0x7F,0x65,0x02,0x94,0xF8,0xA7,0xE6,0x7F,0xEB,0x18,0xB0, + + 0x08,0xE0,0x70,0x82,0x19,0xD0,0xBA,0xA6,0x4F,0x7E,0x70,0xBA,0x17,0xA2,0x60,0xEA, + + 0x80,0x83,0x7C,0x85,0xB4,0x0E,0x07,0x79,0xF8,0xA2,0xDA,0x33,0x54,0x93,0xCD,0x01, + + 0x8C,0xEE,0x5A,0x68,0x7F,0xE6,0x99,0x33,0xE0,0xFE,0xF6,0x00,0x59,0x7F,0x70,0x81, + + 0x60,0x8A,0x0D,0x68,0xFD,0xE7,0xD9,0x97,0x1C,0x3E,0xE0,0x3D,0xD3,0x51,0x5A,0xA9, + + 0xFE,0x7E,0x20,0x86,0x7E,0xA2,0xD3,0xAB,0x31,0x18,0x91,0x7C,0x86,0x50,0x20,0xFE, + + 0xFE,0x21,0x40,0xB0,0x33,0x01,0x42,0x89,0x41,0x6F,0x10,0xFC,0x73,0x31,0x5E,0x84, + + 0x4C,0x8F,0x4B,0x81,0x37,0xBD,0xAE,0xB7,0xF9,0x36,0xD6,0x96,0x4A,0xF4,0x77,0xB1, + + 0x67,0x78,0xBF,0xC1,0x5F,0x64,0xCA,0x9B,0x42,0x8A,0x4B,0x68,0x3B,0x4C,0x3F,0xAA, + + 0x10,0x8A,0x5D,0x70,0x76,0xCC,0x1D,0x51,0x75,0xC3,0x18,0xEE,0x1E,0x15,0x92,0x98, + + 0x2F,0xB9,0x22,0x6C,0x90,0x0F,0xB2,0x65,0xB4,0x8B,0xFD,0x19,0xD0,0x74,0xCB,0x13, + + 0xBF,0x68,0x63,0x4B,0x21,0xE8,0xB3,0x08,0xC3,0x88,0x73,0xB3,0xDD,0xA8,0x53,0xF3, + + 0x97,0xC6,0xFF,0x61,0x57,0xA8,0x3D,0x26,0x6C,0x64,0xD9,0x3A,0xDC,0x0B,0xD1,0xA8, + + 0xE7,0x36,0x04,0x3C,0xF5,0x0A,0x8D,0x1B,0x55,0xC5,0xC4,0x6B,0x35,0x69,0x14,0x72, + + 0xE6,0xE9,0x4A,0x60,0x93,0x79,0x37,0x9A,0x1B,0x60,0x18,0x8D,0x91,0x46,0x3D,0x4C, + + 0x8E,0x7F,0xBD,0xDD,0x9A,0x5B,0xF3,0x2D,0xD4,0x63,0xF7,0x4B,0x3F,0x41,0xB8,0xA8, + + 0xE3,0x7A,0x08,0x40,0x41,0x04,0x30,0x9B,0xDB,0x32,0x9D,0x77,0x34,0x69,0x2E,0x83, + + 0x87,0x96,0x89,0xB5,0x95,0x30,0xE4,0xD1,0x4A,0x05,0xCC,0x57,0x07,0x10,0x6C,0x70, + + 0xA7,0x99,0xAD,0x56,0x31,0x94,0x90,0x37,0xB0,0xB3,0x2B,0x5C,0x80,0xF5,0x29,0x84, + + 0x05,0x1A,0xDD,0xE5,0x3B,0x34,0xE5,0x4B,0xE0,0x0E,0x95,0x23,0x97,0x77,0xE9,0xF1, + + 0xE4,0xD3,0x50,0xE5,0x16,0x4C,0x54,0x58,0x0E,0x70,0xBB,0x47,0x15,0x02,0x5C,0xDB, + + 0xA6,0x98,0x9A,0x58,0xDD,0x42,0xAF,0xCD,0x60,0x7E,0x50,0x84,0x89,0x78,0x93,0xB9, + + 0xA8,0x63,0x8F,0x88,0xC6,0x69,0xBC,0x4A,0x70,0x97,0xF8,0x74,0x72,0x6F,0x05,0xC1, + + 0x25,0x9B,0xBB,0x5C,0xA6,0x19,0xC6,0x67,0x8B,0xF8,0x31,0x62,0xF8,0x7C,0x65,0xC2, + + 0x94,0x1D,0x42,0xAC,0x6A,0xF6,0xAC,0xA5,0xE1,0x0F,0x85,0x88,0x36,0x95,0x5E,0xE8, + + 0x6D,0x18,0xFF,0x38,0x99,0x67,0x95,0x1A,0x6A,0xB0,0xCF,0xDC,0xDB,0xBA,0x56,0xF8, + + 0x6C,0x91,0x2E,0xBD,0x82,0x32,0x40,0xBD,0xCC,0x76,0x39,0x9D,0x5E,0xB8,0x5F,0xE9, + + 0xED,0x9B,0x18,0xC8,0x6A,0xB2,0xB2,0x2F,0xE9,0xA7,0xF0,0x16,0x1D,0xF5,0x57,0x19, + + 0xA8,0xBF,0x0A,0xA2,0x0E,0xF6,0x6F,0x9C,0x4C,0x74,0xE6,0xBD,0x58,0x50,0x3C,0xCB, + + 0x89,0xA1,0x45,0x58,0xE2,0x5A,0xEB,0x6E,0x4A,0x41,0xBC,0xEB,0xD2,0xF3,0x54,0x6B, + + 0x17,0x32,0x8C,0xDA,0x1B,0x12,0xAD,0x5B,0x4F,0x4F,0xC6,0x2E,0x33,0xFB,0x71,0xE7, + + 0x45,0xCF,0xDD,0x3C,0x74,0x15,0xB7,0x2A,0x6E,0x9C,0xD0,0xE9,0x2E,0x9A,0x7A,0xD6, + + 0x2F,0xCB,0x8C,0x81,0x0A,0x63,0xFB,0x7F,0xBE,0x9E,0x77,0x9B,0x5C,0xBE,0x3E,0x38, + + 0x68,0xD1,0x7F,0xFC,0x10,0x9B,0x4A,0x21,0xE3,0x46,0xF6,0x1C,0xB9,0x11,0x76,0x16, + + 0xE0,0x82,0x24,0x67,0x7C,0x57,0x41,0x10,0xE4,0xBE,0xD9,0x52,0x30,0x65,0x17,0x63, + + 0xE0,0x9B,0x01,0x81,0x94,0x70,0x41,0x3D,0x63,0x03,0x8B,0x27,0x3B,0x6D,0x27,0xE2, + + 0x0D,0x42,0xF6,0x66,0xF4,0x75,0x0F,0x40,0x83,0xB7,0xFF,0xD7,0xD0,0x33,0x60,0xB3, + + 0x86,0x89,0xF8,0xBE,0xBE,0x29,0xA9,0x68,0xE7,0x3B,0xCE,0x49,0x71,0x7C,0x1C,0xBD, + + 0x0B,0x5E,0xDE,0x78,0xAC,0x37,0x10,0xE0,0x70,0x48,0x18,0x50,0xC8,0x6D,0x13,0x6A, + + 0x84,0x55,0xBE,0xAD,0xCB,0x6B,0xFD,0xFA,0x77,0xD0,0xE6,0x59,0x2E,0xD7,0x67,0xB8, + + 0x57,0x45,0x71,0xE4,0xAB,0x78,0xE0,0x97,0xD3,0x3A,0x0E,0x4E,0xA7,0x92,0x5B,0x8F, + + 0xED,0x89,0xF9,0x4B,0xE1,0xDE,0x6A,0x3A,0x6C,0x53,0xAC,0x01,0xFF,0x78,0x58,0x4B, + + 0xE2,0x6D,0xB1,0x6C,0x99,0x3F,0x0E,0x08,0x7A,0x92,0x0C,0x14,0x11,0x88,0x73,0xFA, + + 0x0C,0x87,0x38,0x7D,0x18,0x35,0x7C,0x4F,0xE9,0x0A,0xAD,0x15,0x7F,0xCE,0x9B,0x6A, + + 0xF1,0xAA,0xC3,0x09,0x78,0x30,0xA3,0xC7,0xD9,0x06,0xBB,0xBA,0x54,0xC6,0x13,0x91, + + 0x0C,0x4C,0x2E,0x37,0x84,0xB1,0xAA,0x80,0x29,0xD1,0xC5,0xE8,0x36,0x19,0x2D,0x26, + + 0xC1,0x02,0x07,0x61,0x1D,0x0C,0x03,0xB2,0xB6,0x02,0x1A,0x5D,0xCB,0xE6,0x27,0xB2, + + 0x05,0xF3,0x22,0x0D,0xC6,0xA5,0xAB,0x61,0x33,0x01,0x89,0xA0,0xB2,0xBF,0x43,0x50, + + 0x8D,0x1C,0xEA,0xAD,0x64,0x20,0x7B,0x64,0x46,0x54,0x24,0x9F,0x27,0xDE,0x56,0xD6, + + 0xCB,0x74,0x7F,0xFB,0x50,0x32,0x84,0x58,0x60,0xEB,0xAA,0xFD,0x18,0x7D,0x2E,0x66, + + 0xC8,0xA0,0x77,0xAF,0x58,0xAA,0xF0,0xC3,0x0C,0xA7,0xA6,0x04,0xC9,0x33,0x95,0x70, + + 0x03,0xE2,0x7A,0xFB,0xD2,0x45,0x17,0x25,0xE4,0x00,0x87,0x85,0x1B,0x36,0x53,0x73, + + 0xFD,0x97,0x8D,0x78,0x89,0x98,0xA6,0xC1,0x61,0x4C,0xCC,0x74,0x91,0x7B,0x3A,0xF5, + + 0xC9,0x05,0x04,0x64,0x32,0x94,0xFB,0x06,0x72,0xA9,0x44,0x0D,0x11,0xA5,0xB4,0x38, + + 0xB0,0x5A,0xAE,0xC9,0x30,0x75,0xCA,0x74,0x4B,0xD1,0xFD,0x96,0x31,0x7A,0x1C,0x31, + + 0x05,0x06,0x53,0xB6,0xDE,0x5A,0xAD,0xC5,0x03,0xF9,0xC3,0xC8,0xF4,0x57,0x14,0xB3, + + 0x04,0x07,0xC1,0x9E,0x97,0xC3,0x65,0x36,0x21,0x77,0xDB,0xC9,0x73,0x52,0x96,0x7B, + + 0xA4,0x15,0x8C,0xA1,0x3E,0x80,0x28,0xDC,0x09,0x5C,0xE8,0xAA,0x99,0xFB,0x30,0xC1, + + 0x41,0x14,0x1D,0x6F,0x4D,0xB4,0xFF,0xDE,0xDE,0x49,0xA0,0xE4,0x7F,0x6A,0xFC,0xAE, + + 0x09,0xE5,0x9D,0xFE,0xD1,0x9B,0x76,0x69,0xE2,0x41,0xA2,0x29,0xCE,0x59,0x9F,0x68, + + 0x0A,0x5B,0xD9,0xA4,0x52,0x8A,0xA7,0x56,0x95,0x06,0x9D,0xDF,0x0A,0x1E,0xBE,0x37, + + 0x2C,0x54,0x53,0xD7,0x4A,0xB1,0x5E,0x09,0x96,0xBD,0xD0,0xD5,0x53,0xB6,0xC9,0xBA, + + 0xD8,0x78,0x8C,0x23,0xD2,0x8C,0x4F,0x7C,0x43,0x3A,0xDA,0xBB,0xFA,0x73,0xE8,0xB6, + + 0xAC,0xBE,0xB9,0xF4,0x53,0x04,0x97,0xB8,0x32,0xAA,0x47,0x2A,0xF8,0x8B,0x77,0x22, + + 0x24,0xB9,0x63,0x42,0xB8,0xB4,0x67,0x0A,0xD3,0x3A,0x7C,0x4C,0x27,0xBC,0x18,0x33, + + 0xA5,0x01,0x4B,0xE0,0x04,0xEF,0xCF,0xCA,0xDA,0x8D,0x7D,0xB5,0x69,0x6B,0x7A,0x41, + + 0xEE,0xE5,0xD6,0x2A,0x7E,0xFB,0x94,0x42,0xC5,0x47,0xD9,0xF6,0x1D,0xFA,0x71,0xF0, + + 0x00,0x0F,0x31,0x75,0x7F,0x13,0xA6,0xAB,0x61,0x11,0x91,0xCD,0xBD,0xB8,0xB9,0xE3, + + 0x22,0x22,0x89,0xE4,0x8A,0x0C,0x19,0xF3,0xC3,0xD8,0x4D,0x44,0xE5,0xAC,0x2F,0x3C, + + 0xDA,0x8B,0x20,0x67,0xD6,0xA9,0x4C,0x04,0x9C,0xD6,0x30,0xB2,0x44,0x49,0x63,0x21, + + 0x56,0xE9,0x44,0xD2,0x3F,0x21,0x43,0x94,0x57,0x78,0x7A,0x05,0x23,0x4C,0xA1,0x47, + + 0x1F,0x26,0xA3,0xA5,0xCA,0xA2,0xC9,0xF9,0xC5,0x66,0xE6,0x16,0xA6,0xEF,0x0B,0x4E, + + 0x86,0x03,0xD1,0x90,0x55,0x87,0x81,0x6E,0x39,0x17,0xEA,0x97,0xD9,0x6C,0xB7,0xF9, + + 0x88,0x05,0x34,0x7D,0x70,0xC4,0x9E,0x4C,0xB7,0xD3,0x22,0x5C,0xB7,0x70,0xBA,0xEA, + + 0xFC,0x28,0x94,0x22,0x75,0xA4,0x82,0xFD,0x8F,0x69,0x3B,0x2A,0x3E,0xE1,0x71,0x58, + + 0x67,0xEE,0xC5,0x6E,0x9F,0x63,0xD8,0x4D,0xB4,0x85,0x95,0x77,0x85,0xE9,0xBC,0xE8, + + 0x09,0x06,0x54,0x6C,0xE5,0xC8,0x33,0x4F,0x48,0x3A,0xAD,0x66,0x36,0x53,0xF2,0xB9, + + 0x82,0x81,0xEA,0x5F,0xE2,0x4D,0x46,0xE8,0xCE,0xC6,0xF6,0x92,0x5E,0xF9,0xAA,0x1F, + + 0x82,0xCC,0xFE,0x4C,0xBE,0x2A,0x23,0x8A,0xEA,0x32,0x56,0xDB,0x8A,0x8E,0x18,0x6C, + + 0x2F,0x31,0x23,0xC2,0xDF,0xEC,0x4B,0x4B,0x2F,0x7E,0x66,0x67,0x5E,0x4E,0x51,0xB3, + + 0x40,0xC0,0x6B,0x4E,0x63,0x4E,0x7A,0x1D,0xFC,0xC2,0x50,0xB5,0x64,0xAD,0x1A,0xDA, + + 0xC4,0x3F,0x48,0xF5,0x00,0x16,0xE7,0xE5,0x05,0xD4,0x8C,0xE1,0xAA,0x6D,0xBC,0x61, + + 0xA1,0x1C,0x8C,0x7C,0xDC,0x80,0x65,0xF5,0xC0,0x2E,0xB7,0x32,0x47,0x71,0x85,0x90, + + 0x07,0xF6,0x68,0xF4,0xA3,0x3B,0x57,0xA1,0xE7,0x90,0x56,0x67,0xE0,0x5F,0x7F,0xD9, + + 0x4E,0xF7,0xB7,0x95,0x27,0xBB,0x64,0x6C,0x40,0x22,0x06,0x55,0x59,0x0E,0x75,0xB8, + + 0xEC,0x75,0xBE,0x0B,0x5E,0x05,0x4C,0x11,0x52,0x61,0xD3,0xE0,0xA6,0x90,0x52,0xE7, + + 0x80,0x85,0xF2,0xFB,0x14,0x3C,0xA9,0xAF,0x86,0x2A,0x2A,0x71,0x8B,0xB1,0x6D,0x56, + + 0x95,0x1D,0x25,0xE6,0x26,0xBB,0x64,0xDC,0x8A,0x94,0x35,0x52,0x10,0xB4,0x53,0xFB, + + 0x00,0x8C,0xD3,0xEE,0xF7,0x18,0xC2,0xB4,0x2D,0xED,0x4E,0xF0,0xF1,0x14,0xB6,0x62, + + 0x7C,0xD5,0x23,0x9D,0x04,0xE2,0xCE,0xCC,0xE3,0x5E,0xCE,0xDD,0x25,0x59,0x56,0xBD, + + 0xD0,0x96,0x5A,0xED,0x51,0xF6,0xA9,0x9E,0x5E,0x02,0x1E,0xCC,0x1F,0xCC,0xD8,0x83, + + 0x09,0x66,0x81,0xA3,0xA3,0xA1,0xF4,0xEB,0x94,0x96,0x8F,0x9F,0xDD,0x55,0xBF,0x19, + + 0x8F,0x8B,0x43,0x77,0xD2,0xF6,0x87,0x45,0xFD,0x96,0x7F,0x17,0xF6,0x7A,0x88,0xAC, + + 0x3E,0xD3,0x75,0xBD,0x4A,0xD0,0x3E,0x5F,0x0D,0xA6,0xF8,0x1F,0xE2,0xDE,0x2F,0xA5, + + 0x88,0x99,0xB4,0x13,0x57,0x6C,0x46,0x8B,0x03,0xD6,0x81,0x7A,0x11,0x8C,0x44,0xFE, + + 0x76,0x8F,0x81,0x06,0xBD,0xA4,0xE0,0x6F,0xC6,0xCA,0x1F,0x65,0xDC,0x28,0x3F,0x33, + + 0xCC,0xD2,0x2F,0xFE,0x2F,0xB2,0x6A,0x7F,0xC7,0xB8,0xA1,0xF0,0xB1,0xB1,0x61,0xA0, + + 0xD6,0xBF,0x97,0x80,0x38,0x56,0x6D,0xD0,0x96,0x71,0x6F,0xA0,0x2E,0x6D,0xA8,0x2E, + + 0x8D,0x43,0x0E,0x4A,0x9C,0x43,0x00,0xA9,0x47,0x00,0xB8,0x94,0x57,0x72,0xC1,0xB4, + + 0x66,0xF7,0x7A,0x22,0x31,0x39,0xD1,0x00,0x03,0x4F,0x51,0xAC,0x38,0x64,0xDF,0x96, + + 0x55,0xC6,0x22,0x90,0x02,0x1C,0x82,0x53,0xE2,0xA1,0xC5,0x12,0x38,0x12,0xD0,0x13, + + 0xA3,0x9F,0x05,0x22,0x90,0x88,0x71,0x02,0xBD,0xCB,0x81,0xE4,0xF3,0x62,0x9B,0xAE, + + 0x05,0x44,0x70,0xAB,0x15,0x2F,0x83,0x70,0xD2,0xB8,0xBC,0xF0,0x61,0x27,0x41,0x7C, + + 0x7D,0x9B,0xB9,0xA7,0xA1,0x04,0x49,0xF1,0xA1,0x66,0x81,0x6C,0x71,0x7D,0x8A,0xD5, + + 0x88,0x78,0x2D,0xBD,0x8F,0xDA,0x70,0x79,0x43,0xE7,0xE1,0xF7,0xF1,0x97,0xA5,0x3F, + + 0xE3,0xAD,0xFF,0xFC,0x1F,0x99,0x3D,0x43,0x91,0xBD,0xEA,0x0B,0xB1,0xF9,0xAF,0x1D, + + 0x8E,0x1F,0xF1,0xEC,0xDF,0x98,0xB6,0x47,0x83,0x18,0x5A,0xD1,0x9D,0x63,0xC3,0xBC, + + 0xD9,0xA1,0x43,0x29,0xB0,0x27,0x85,0xAD,0xB2,0x9D,0xEB,0xA9,0x8D,0xAC,0x5B,0x87, + + 0x72,0xAF,0xF5,0x1B,0x78,0xA8,0xA0,0xAA,0xF1,0x41,0x1B,0x7B,0xE1,0x6D,0x6D,0x37, + + 0xD3,0x90,0x3A,0x68,0xE5,0xA1,0xFE,0xCD,0x9F,0x2F,0xAA,0xEE,0xDA,0xD5,0xBE,0x16, + + 0xFE,0x51,0x14,0x1B,0xBE,0xDB,0xCA,0x91,0x03,0x5C,0x36,0xEE,0x57,0x65,0xF8,0x13, + + 0x8C,0x2E,0xA1,0x4D,0x6D,0x35,0xF8,0xA3,0x71,0x0C,0xEB,0xBD,0x86,0x91,0xE6,0x26, + + 0x16,0x9A,0x70,0x2D,0x1B,0x80,0x7B,0xDF,0x83,0xAE,0x5B,0x80,0xD7,0x9F,0x7A,0x29, + + 0xC9,0x03,0x3D,0x43,0xEE,0x38,0x16,0x42,0x89,0xB1,0x39,0xEA,0x8D,0x2C,0x32,0x25, + + 0x4B,0x86,0x1C,0x8B,0x0D,0x73,0x09,0x52,0xCD,0xFC,0x5C,0x90,0x22,0xAD,0x53,0x3A, + + 0x4B,0x01,0x05,0x42,0x94,0x5E,0xD5,0x80,0x02,0xFF,0x2C,0x21,0xD8,0x27,0x73,0x24, + + 0x5D,0x40,0xC5,0x12,0x82,0x43,0x8C,0x53,0xA9,0xB2,0x31,0x30,0x24,0x11,0xFC,0xA0, + + 0x3D,0x9F,0x68,0xB7,0x2D,0xC2,0xE0,0x82,0x91,0xDF,0x2B,0x0C,0x64,0x39,0x58,0xDA, + + 0x82,0x9A,0x37,0xF0,0xBE,0x98,0x66,0x40,0xA6,0xFA,0xA4,0x70,0x41,0x87,0x88,0xF0, + + 0xCE,0x54,0x3A,0xB6,0xA5,0xE0,0xC3,0xD8,0x09,0x12,0x72,0x07,0x32,0xDB,0x15,0x11, + + 0x48,0x06,0x00,0x46,0xA0,0xBC,0xF9,0x8B,0x40,0xA3,0xE5,0x0F,0x5F,0x7A,0xB5,0x21, + + 0xD0,0x0B,0x39,0x6A,0xF0,0x49,0x32,0xC0,0x4C,0xAC,0xFF,0x47,0x87,0xF3,0xB9,0xBC, + + 0x16,0xE9,0xD7,0xB8,0x9C,0x98,0x40,0x5A,0x6D,0xA4,0xE9,0xDE,0x0A,0x79,0x7C,0x4B, + + 0x2B,0x5C,0x94,0x2D,0xE0,0x38,0x00,0xC6,0xCB,0xDB,0x31,0x80,0xFE,0x3B,0x50,0x66, + + 0xD6,0x61,0x1A,0x6E,0xC9,0x38,0xDF,0x98,0x11,0x19,0x08,0x42,0x08,0xA8,0x78,0xE0, + + 0xA7,0xBA,0xE6,0x26,0x53,0x66,0xF6,0xF6,0xE6,0x39,0xA9,0xCB,0xDB,0xA3,0xD8,0xA9, + + 0x1B,0x14,0xAC,0xDC,0xC8,0x51,0x25,0x08,0xD2,0xEC,0x0E,0xAC,0x7D,0xFD,0x0A,0x09, + + 0xE7,0xB3,0xA6,0xE9,0x41,0xB3,0xE3,0x8B,0x82,0x53,0x63,0x8F,0x05,0x78,0x18,0x29, + + 0x37,0xBE,0x70,0x46,0x4A,0xB6,0x21,0xFF,0x0A,0xDC,0xE8,0xF9,0xB0,0xD6,0xD7,0xAE, + + 0xCC,0x57,0x8D,0xF5,0x98,0xAD,0xB2,0x3C,0x7C,0x34,0x90,0xDF,0xF5,0xE1,0x0E,0xA8, + + 0x6B,0xC3,0x57,0x7D,0x9A,0x57,0x4D,0x2F,0x82,0x6C,0x78,0xE2,0x10,0x1A,0x74,0x10, + + 0x7E,0x91,0x58,0x7D,0xF4,0xC2,0xA0,0x28,0xF4,0xF2,0x8F,0x2B,0xAB,0xA2,0xFF,0x3E, + + 0xEE,0xF7,0xA1,0x1E,0x20,0x22,0x28,0xC1,0xE4,0x82,0x39,0xB3,0x92,0xA2,0x32,0x79, + + 0x6C,0x51,0x98,0xCE,0xB3,0x2D,0x5C,0xD2,0x62,0x1F,0x77,0xE4,0x74,0x96,0x6C,0xF5, + + 0xFA,0xF4,0x28,0x46,0xAD,0xBE,0xD2,0x47,0x24,0xC1,0x40,0x66,0xF0,0xFE,0x33,0x7C, + + 0xEC,0xC4,0xC1,0xD4,0x35,0xE7,0x51,0x9E,0x42,0xC0,0x4E,0x85,0xE5,0xB4,0x96,0x2D, + + 0xB1,0x58,0x53,0x31,0x64,0xB7,0x01,0x9B,0xD5,0x8A,0x99,0x01,0x20,0x68,0xE0,0xCC, + + 0x9E,0x8B,0x26,0xF0,0xED,0xC6,0x68,0xE7,0x24,0x29,0x72,0xFF,0xE7,0x33,0x3C,0xA5, + + 0xE6,0xDA,0xB8,0x1B,0xEA,0x34,0x2B,0xD8,0x2D,0x18,0xA6,0x4C,0xA6,0xA9,0xC0,0xF0, + + 0x65,0xD9,0x40,0xCF,0xC8,0x97,0xF3,0x0A,0x5C,0x67,0x9A,0xD2,0x61,0x9F,0x15,0xB2, + + 0xE7,0x5C,0x47,0x81,0x9C,0x4B,0xFB,0x1A,0x5D,0xC6,0xF5,0x01,0x40,0x56,0xF2,0x38, + + 0xE5,0x6D,0x5A,0xB5,0x0E,0xE1,0x12,0x39,0xFB,0xC3,0xEA,0x63,0x58,0xFF,0x27,0x9A, + + 0x62,0x06,0x7A,0xB6,0x78,0xE0,0x18,0x6F,0x4C,0xA5,0x82,0x6C,0x6C,0xBF,0x5D,0x7E, + + 0x03,0x28,0x18,0x47,0x3B,0x51,0x2C,0x6A,0x37,0xA2,0xD2,0x90,0x2B,0x1A,0xCE,0x6A, + + 0xE3,0x90,0x10,0x57,0x3A,0x50,0xDC,0x7D,0x1B,0xAB,0x03,0x97,0xFF,0xA2,0xFF,0xAD, + + 0x22,0x3A,0x26,0x92,0xC8,0xC1,0xA4,0x7A,0xB1,0xBC,0x4F,0x22,0x50,0x92,0x12,0xA7, + + 0xA8,0x37,0xF5,0x03,0xDC,0xC0,0x41,0x59,0x06,0xB9,0xEE,0xA9,0x1F,0xAC,0x96,0xF1, + + 0x4F,0x73,0xDB,0xAA,0x68,0x23,0xF1,0xFD,0xEA,0xCC,0x75,0x66,0x4B,0x26,0x60,0x53, + + 0x88,0x18,0x55,0x15,0x97,0x83,0x2A,0x37,0xC1,0x11,0x7D,0x96,0x67,0x2C,0x75,0x28, + + 0x83,0x9D,0xC4,0x2C,0xC3,0x3D,0x5A,0x11,0xEA,0xD9,0xCE,0x1C,0x8D,0x8F,0xFA,0x56, + + 0x03,0xAB,0x6C,0xE8,0x5B,0x40,0x07,0x02,0xD2,0x64,0x85,0x72,0x7B,0x95,0x33,0xF8, + + 0x96,0x63,0xC5,0x4D,0x92,0x0D,0x88,0xA4,0x17,0xA0,0xB5,0x0B,0x9A,0xC9,0x65,0xEB, + + 0x5F,0x76,0xFC,0x2F,0xB7,0xF7,0x03,0xF5,0x06,0x54,0x20,0xCE,0xC0,0x80,0x83,0xBB, + + 0x40,0x87,0xDE,0x66,0x26,0x15,0x0E,0x50,0x0F,0x3C,0x02,0xCC,0x4F,0x18,0xD1,0x69, + + 0x15,0x36,0x29,0x7C,0x0E,0x29,0x6C,0xF1,0xED,0x78,0x7A,0x74,0xC6,0x06,0x9F,0xEB, + + 0xE3,0x11,0xB4,0x69,0x3E,0xB9,0x20,0x58,0x68,0x57,0x1C,0xE8,0xF2,0x26,0xBE,0x68, + + 0x9D,0x16,0x17,0x61,0xAD,0xF6,0x61,0x59,0xE9,0x76,0xE5,0x29,0xC1,0xB9,0xD1,0xE2, + + 0x28,0x7D,0x66,0x42,0x0D,0xE1,0x58,0x19,0xE2,0x41,0xAB,0xE6,0x4D,0xFC,0xA4,0x52, + + 0x4C,0xE7,0xD0,0x13,0x98,0xFC,0xE9,0x05,0x8E,0x0E,0xAE,0x6A,0x9E,0xF2,0xD2,0xF4, + + 0x9E,0xDC,0xD9,0x03,0x19,0xAE,0x0F,0xF2,0x8D,0xBE,0x37,0xBB,0x47,0xF8,0x79,0xF3, + + 0xA9,0xBE,0x2F,0x77,0xC4,0xFD,0x84,0xF9,0x01,0xC4,0x4B,0x80,0x5C,0xBE,0x5A,0x80, + + 0x68,0x11,0xE9,0xEF,0xAF,0x8B,0x6E,0xB6,0x46,0xA3,0xBD,0x5B,0xC9,0x5D,0xBD,0xE3, + + 0x8D,0x0C,0x9C,0x9B,0xE6,0x44,0x3E,0x70,0x9F,0xEE,0x67,0x4E,0x33,0xAD,0x7F,0x07, + + 0x61,0x81,0xF9,0x01,0x61,0x60,0xC9,0x32,0xBE,0x94,0xCA,0x25,0xB0,0x1F,0x99,0xE2, + + 0x05,0xAE,0xB1,0xFD,0xDD,0xFF,0x7E,0xC0,0x13,0x03,0x62,0x2A,0x55,0xCC,0x20,0x42, + + 0x31,0x09,0xF8,0xBA,0xBE,0x29,0xFC,0x22,0xC1,0x06,0xFF,0x1B,0x8B,0xE9,0xB7,0xD4, + + 0x63,0x2F,0xAE,0x7D,0x37,0x58,0xBB,0x83,0x9D,0xEE,0xCD,0xB4,0x7B,0xEE,0xBE,0x43, + + 0x86,0x8B,0x6D,0xD6,0xA6,0xFB,0x87,0x6B,0x23,0xE9,0x2E,0x1A,0x5F,0xC0,0x19,0x49, + + 0xCB,0x45,0x36,0xF0,0x59,0x2A,0x3E,0x79,0x28,0xD1,0x99,0x48,0xD5,0x46,0x7A,0xB8, + + 0xB4,0xA7,0x2E,0x89,0xCD,0x4A,0x6C,0x1E,0xA3,0xAD,0x36,0x4E,0xD5,0x0A,0x32,0x3C, + + 0xC1,0x8A,0x37,0x43,0x1F,0x68,0x28,0x7E,0xDB,0x25,0xE5,0x46,0x77,0xF6,0xA7,0x6B, + + 0x7F,0x6F,0xEA,0xE6,0x63,0xD6,0x4D,0x1A,0xD8,0xE5,0xEC,0x0A,0x79,0xDB,0xAB,0x0A, + + 0xA7,0x6F,0xED,0xE6,0x20,0x69,0x25,0x7D,0x03,0xE3,0x3C,0x3B,0x0D,0x0F,0x00,0xDD, + + 0x8F,0x9C,0x39,0x37,0x66,0xD3,0x2C,0x5E,0xA1,0xA9,0xF3,0x0E,0xAD,0xD5,0x5D,0x55, + + 0x38,0x5D,0xF4,0xFD,0xD1,0x8E,0x68,0x3E,0xD9,0xF0,0x49,0xF8,0x73,0x79,0x83,0x41, + + 0x8A,0x4C,0xF9,0xF1,0xBE,0x40,0x0D,0x5A,0xDE,0xE1,0xCB,0xE8,0xB9,0x14,0xF3,0xEB, + + 0x83,0x63,0xF5,0xFD,0x51,0xAC,0xF0,0x03,0x1E,0x54,0x81,0x82,0x78,0xE4,0x50,0x9F, + + 0x06,0x51,0x97,0xB4,0x70,0xCF,0x14,0x62,0xE3,0x16,0xCD,0xA0,0xA5,0x1C,0x9F,0x6F, + + 0xC8,0x60,0xD2,0xC5,0x31,0x95,0xA8,0x34,0x45,0xCB,0xE1,0x99,0x8A,0xAC,0xA9,0xF2, + + 0xD0,0xB4,0xBF,0x34,0x8C,0xED,0xA2,0x85,0xE6,0x73,0x51,0xFB,0xFE,0x6C,0x6B,0xA8, + + 0x56,0x52,0xDD,0xC1,0x0D,0xE2,0xB6,0xF6,0xEF,0x8F,0x4C,0xD5,0xFD,0x88,0x16,0xA2, + + 0x43,0x41,0xC0,0xF4,0xCD,0x72,0xE5,0x5E,0xDE,0xA3,0x59,0x41,0x56,0x1A,0x93,0xD8, + + 0x7D,0x9E,0xF2,0xA8,0xBE,0x93,0xE5,0xAE,0xE0,0x5B,0xF4,0x36,0xA7,0xAA,0x5D,0xC5, + + 0x2F,0x57,0x97,0xC1,0xFB,0xFE,0xFA,0x8E,0x3F,0x8A,0x95,0xDA,0xFA,0x1A,0x1C,0xEC, + + 0x48,0x53,0x91,0x15,0xAB,0xEC,0xBD,0xCE,0xC7,0xF3,0x7A,0x0A,0x98,0x08,0x38,0xA4, + + 0x40,0x15,0x37,0xB5,0xC0,0xA9,0xD2,0x62,0xD3,0x07,0x69,0x88,0xA5,0xC5,0xF5,0xBC, + + 0xC0,0xB0,0xC2,0xEF,0x1B,0x92,0xDE,0x99,0x91,0x1B,0x04,0x38,0x76,0x7F,0xF8,0xFA, + + 0x90,0x79,0xB4,0xA0,0xBE,0xA2,0x49,0x4B,0xEC,0xC7,0x38,0x89,0xFE,0x83,0xF2,0x75, + + 0xA9,0xA0,0xF7,0x99,0x59,0xEE,0x8F,0x61,0x3C,0x37,0x5F,0x69,0xB9,0xF6,0x7C,0x78, + + 0xAA,0xB3,0xE8,0x31,0xCC,0x7E,0x8B,0xEE,0xA2,0x07,0x83,0x4C,0x8D,0x1C,0x1E,0xE5, + + 0xC0,0x59,0x9E,0xD4,0x73,0xB0,0xCE,0x8B,0x07,0xFC,0x23,0x78,0x10,0x02,0xE3,0xAB, + + 0x5D,0x95,0x4A,0xBD,0x3A,0x2E,0xF3,0x18,0x49,0x1E,0x89,0x02,0xBA,0xD5,0x75,0x69, + + 0x2B,0xB0,0x30,0x59,0xF8,0x99,0x67,0xC9,0x8B,0xF0,0x99,0x0C,0x44,0xEF,0x7E,0xE0, + + 0x00,0x2D,0x30,0x5D,0x30,0x0B,0x4E,0x39,0xAD,0xE8,0x04,0x01,0xF5,0x8C,0x10,0xEC, + + 0xA9,0x8C,0x80,0xE7,0x6D,0x14,0x66,0x3D,0x49,0x8F,0x47,0x48,0x27,0x5D,0x30,0x87, + + 0xCC,0x72,0x34,0x04,0xFF,0x33,0x53,0x23,0x2F,0x56,0x75,0xDB,0xD4,0x53,0x3F,0xB7, + + 0x6E,0xC0,0xF7,0x2B,0x24,0x0E,0x58,0x93,0x13,0x7C,0x06,0x6C,0x26,0x68,0xA0,0x96, + + 0x46,0x09,0x70,0xE6,0x10,0x25,0xF2,0x25,0x68,0x18,0x63,0x57,0x66,0xA6,0x99,0xD0, + + 0x87,0xEC,0xC6,0xAB,0xE1,0xBE,0x06,0x69,0x93,0x51,0x80,0x6B,0xD7,0xDB,0x38,0x4F, + + 0x21,0x82,0xF1,0x4F,0xBE,0x7D,0xA5,0x3D,0x55,0xF9,0xE5,0x6D,0x77,0x64,0x51,0xF3, + + 0x6E,0x57,0x2E,0x31,0xF7,0x58,0x27,0x7C,0xC3,0x89,0xA3,0x06,0xBF,0xF6,0x99,0xBB, + + 0x26,0x27,0xBC,0x3E,0xEB,0x07,0x1B,0x45,0xDD,0x0D,0x31,0x07,0x5A,0xFB,0x9D,0xBE, + + 0x7E,0x89,0x94,0x23,0x90,0x0F,0x0B,0x6A,0xA9,0x5C,0x47,0x40,0x73,0xB6,0x77,0x2F, + + 0x78,0xA9,0xF3,0x7D,0x77,0x5B,0x41,0x23,0x28,0x6D,0xAE,0x4D,0xB4,0xE7,0xEB,0x1F, + + 0x9B,0x5F,0xB7,0xDF,0x9C,0x06,0x3A,0x0D,0x35,0x30,0x84,0x61,0x2C,0x37,0x02,0x48, + + 0x20,0x81,0x02,0xFE,0x18,0x04,0x13,0xCA,0x98,0x73,0x8B,0x08,0x1D,0xE3,0x52,0x27, + + 0x2C,0xCD,0x31,0x0D,0x60,0x23,0x22,0x6E,0x2C,0x51,0xE8,0x9C,0x22,0xE6,0x9C,0xC9, + + 0x0E,0xCD,0x69,0xEF,0xC6,0x9D,0x4D,0xD8,0x87,0x49,0x0C,0x87,0x8B,0xA3,0xC7,0x7F, + + 0x0D,0x8B,0xB2,0xC2,0x3A,0x26,0x82,0x94,0x4F,0x4F,0xFD,0x40,0xEF,0xAD,0x64,0x7A, + + 0x98,0xD1,0xDC,0xB7,0x40,0x1F,0xF0,0xFC,0x6A,0xCE,0xED,0xAA,0xD3,0xF1,0x80,0xD0, + + 0xA6,0x45,0xD2,0xAF,0xDC,0x18,0x93,0x36,0x2E,0xD4,0x3C,0xC5,0x56,0x9D,0xC9,0x03, + + 0x58,0xB2,0x36,0xF9,0xDE,0x03,0x48,0x58,0x39,0x8F,0x35,0xAB,0xF2,0x58,0xFA,0x8C, + + 0xA4,0x07,0xF3,0x75,0xB1,0x36,0x10,0xCC,0x7C,0x78,0xDF,0xBB,0xF4,0x9C,0xC0,0xA0, + + 0x53,0x9D,0xB4,0xDF,0x62,0x19,0xD4,0x90,0x04,0xE8,0xA4,0x0C,0x8D,0x5F,0x34,0xB0, + + 0x50,0x91,0xA4,0xC3,0x40,0x19,0xC8,0x90,0x43,0x0A,0xDB,0x09,0x1C,0x8A,0xE5,0x84, + + 0x82,0x6B,0x7E,0x80,0x7C,0xFD,0x0B,0xE4,0x47,0x09,0x08,0x6B,0x26,0x29,0xB2,0x73, + + 0xDC,0x17,0x32,0x05,0xB1,0xCF,0xC2,0xC2,0x46,0x28,0xA8,0x57,0x00,0x97,0x2A,0x91, + + 0x29,0x35,0x15,0x6C,0x54,0x29,0x4E,0xAE,0xD1,0x9A,0x76,0xF2,0x7D,0xFE,0x1C,0xAB, + + 0x2C,0x66,0x3B,0x6D,0x01,0x19,0x06,0x52,0x21,0x05,0x0F,0xBB,0x1E,0x06,0x29,0x7A, + + 0x0F,0xDA,0xD9,0xB7,0x49,0x19,0x23,0x24,0x1B,0xBF,0x97,0xEF,0x5D,0x7D,0x11,0x79, + + 0xC7,0x68,0x38,0x9D,0x07,0xFA,0x93,0x3E,0x38,0xB9,0xC7,0x1F,0xF7,0x1B,0x1D,0x4E, + + 0x2D,0xC4,0xFC,0xEA,0xE2,0xAD,0xCD,0x4F,0x99,0x71,0xA8,0x01,0x3E,0x57,0xC2,0xFE, + + 0xA0,0xDC,0xFA,0xD4,0x9E,0x12,0x40,0x16,0x19,0x9C,0xB8,0x0F,0xC0,0x2D,0xD8,0x97, + + 0x8F,0xDE,0xBD,0xF3,0xC2,0xFC,0xAA,0xD6,0x05,0x9A,0x0A,0x6B,0x95,0x81,0x83,0x5B, + + 0x53,0xBF,0xFA,0x5B,0xF6,0x0B,0xC6,0x7F,0xA7,0x2F,0xAF,0x15,0x04,0x54,0xFD,0x98, + + 0x6B,0x7F,0x8A,0x4D,0x03,0xDA,0xD0,0x01,0x86,0x9F,0xEE,0x23,0xF1,0xDF,0x58,0xFA, + + 0xFA,0xD4,0xD8,0xC9,0x3B,0x22,0xB3,0x77,0x4F,0x9D,0x9B,0x28,0xD1,0x8F,0x85,0xF0, + + 0x3F,0x01,0x0F,0xD5,0xAA,0x21,0xA5,0x43,0xF3,0xA2,0x51,0xF4,0xBA,0x50,0xF2,0x2E, + + 0x7E,0x0D,0x5B,0xB1,0x91,0x03,0xDD,0xFB,0x7A,0xBC,0x09,0x7E,0x2C,0x5F,0x51,0x40, + + 0x04,0x9F,0x7E,0xD1,0xB4,0x8A,0x94,0xB0,0x1C,0xFB,0x07,0x9D,0x72,0xFF,0x58,0x64, + + 0x5B,0x06,0x4C,0x4A,0xF2,0x49,0x23,0x0B,0x62,0x65,0xF0,0xF0,0x56,0xFE,0x05,0xE1, + + 0xAE,0x04,0x01,0x10,0xCC,0x64,0x01,0x5D,0xC4,0xC6,0xD1,0x98,0xD2,0xBD,0x0A,0x44, + + 0xB0,0xA3,0x2C,0xBA,0x72,0x71,0x1E,0x0E,0x4E,0xF1,0x66,0x29,0xF2,0x45,0x6A,0x8E, + + 0xF4,0x49,0x86,0x0D,0xE7,0xD7,0xD2,0x0C,0x1E,0xB5,0xC8,0xD3,0xA7,0xB7,0xF5,0xEB, + + 0x7D,0xA6,0x8A,0xE3,0xE6,0xF6,0x0C,0x5A,0x29,0x33,0xE4,0x8C,0xA8,0x05,0x5D,0x30, + + 0x80,0x81,0x7C,0x0D,0x98,0xD5,0x6B,0x52,0xA0,0x47,0xA4,0xE4,0x39,0xF5,0x9C,0xF1, + + 0x43,0xC6,0x74,0x1C,0x99,0xD4,0xDB,0x1D,0xAC,0x09,0xFD,0xF4,0xDA,0x68,0x98,0x48, + + 0x1A,0xC7,0x3B,0x3E,0x80,0x13,0x5A,0x65,0xB7,0x22,0xD4,0x55,0xB3,0xDD,0xA2,0x7C, + + 0x2F,0xB6,0x4E,0xD8,0x17,0xF9,0x5B,0x07,0x32,0x44,0x33,0xFE,0x52,0x80,0x47,0x0F, + + 0xAE,0x4F,0xF9,0xC7,0x29,0x2A,0x30,0xA9,0x8E,0x4A,0x7F,0xFF,0xD6,0x66,0x3A,0xDD, + + 0xD1,0x59,0x9B,0x8E,0xC3,0xA2,0x59,0x65,0x3D,0xCF,0x81,0x87,0x78,0x6B,0x4C,0x09, + + 0xDC,0x61,0x80,0xEC,0x30,0x30,0xF3,0x4F,0x00,0x80,0x2D,0x3A,0x73,0x40,0xB3,0x03, + + 0x5D,0xCC,0x2B,0xC8,0x11,0xB2,0xE5,0x32,0xA8,0x26,0x21,0xEB,0xA8,0xEC,0xC5,0xDD, + + 0x1D,0x7E,0x07,0x06,0x64,0x8A,0xD5,0x09,0xD9,0x5F,0x3E,0xCB,0x25,0x8E,0x6B,0xAD, + + 0xA2,0xF3,0x8B,0x7D,0x69,0xFE,0x25,0x40,0x42,0xD3,0xB2,0xAD,0x71,0x2F,0x9B,0x40, + + 0x51,0x10,0xC6,0xDB,0x13,0x30,0xAB,0x62,0x67,0x50,0xAB,0x19,0x7A,0x36,0x8C,0x8D, + + 0x69,0xEE,0x03,0x14,0x37,0xC1,0x24,0x8B,0x6D,0x37,0x10,0x96,0x30,0xAA,0x1A,0x94, + + 0x9D,0x21,0xC4,0xBA,0x3F,0x90,0xEE,0x03,0x4E,0xAB,0x13,0xD7,0x70,0x3E,0x4D,0x2D, + + 0x02,0x55,0x02,0xA6,0xDA,0x88,0x17,0x4C,0x61,0x1F,0xA5,0x77,0xF6,0x7E,0xA5,0xB4, + + 0xF4,0xE9,0xA6,0x84,0xB5,0x03,0x24,0x53,0x98,0x57,0x39,0xD7,0xA5,0x39,0x9B,0x9A, + + 0x88,0xB4,0x6C,0x0C,0xF1,0xC0,0x30,0xD6,0x15,0xA6,0x72,0x2E,0x35,0x71,0x21,0xA4, + + 0xD0,0xBA,0x20,0xFA,0x8B,0x8E,0xA0,0x91,0xEE,0x7A,0xA9,0x55,0xD9,0x32,0x18,0x63, + + 0x40,0xCA,0xF7,0xAF,0x4A,0xEE,0x25,0x05,0x64,0x39,0xDF,0x41,0x47,0x80,0x8E,0x09, + + 0x5D,0x69,0x9D,0xCC,0xEF,0x61,0xCB,0x0A,0xE8,0x58,0xEC,0x0E,0xD6,0x73,0x11,0xD8, + + 0x58,0x10,0x0E,0xDD,0xF2,0xC1,0x3C,0xF1,0x6A,0x9D,0xD6,0x79,0xDA,0xF7,0x98,0x49, + + 0x95,0x49,0x6C,0x92,0x07,0xC2,0x71,0x8B,0x15,0x32,0x17,0x3D,0xF2,0x78,0x8F,0x95, + + 0x76,0x5E,0xF0,0x82,0x46,0x51,0xE0,0x3E,0x29,0x40,0x28,0x1F,0x5A,0xF5,0x7E,0xE0, + + 0x58,0x05,0x5F,0x06,0x1C,0xA0,0x32,0xCB,0xF9,0x61,0xEA,0xEB,0x24,0xA2,0x50,0xE1, + + 0x75,0x82,0x57,0xE9,0x15,0x5E,0x80,0xC1,0xC1,0x4C,0xE0,0x13,0xE9,0x62,0x78,0x19, + + 0xE0,0x03,0x5E,0xF8,0x6B,0xA2,0x09,0x12,0x65,0x43,0xA5,0x2D,0x75,0xDB,0x2E,0x1F, + + 0xB6,0xC2,0xA9,0x17,0xDC,0x53,0x6B,0x78,0x2E,0xA7,0xBF,0x87,0xB6,0xE1,0x1A,0x52, + + 0x84,0x80,0x4C,0xD9,0xE9,0x29,0x5C,0x3D,0xB3,0x38,0x0B,0xE2,0x1D,0x4A,0xF3,0x30, + + 0x25,0x68,0x97,0x24,0xC5,0x3A,0x47,0xA2,0x4B,0x6E,0xB2,0x81,0xF4,0xE3,0x9E,0xA1, + + 0x04,0x82,0x02,0xB9,0x77,0x10,0xE1,0x38,0x3B,0x7A,0x91,0x26,0x5A,0xEB,0x2D,0xAA, + + 0xD4,0x1C,0x79,0x18,0x6A,0xDB,0x01,0xF3,0x27,0x38,0xB1,0xE0,0xB4,0xB2,0x9A,0xF5, + + 0x81,0x25,0xAC,0x8B,0x55,0xFA,0xB2,0x3A,0xB4,0x1C,0x27,0xAA,0x74,0xFC,0x74,0x37, + + 0x05,0x24,0xAA,0x0B,0x1D,0xA9,0x7B,0x5C,0xB2,0xCF,0xC8,0x5C,0xEA,0x8C,0x30,0x94, + + 0x67,0x1B,0xAD,0x2A,0x9C,0xAA,0xA6,0x34,0xBC,0xD1,0x88,0xCD,0xDA,0xCB,0xBE,0x5C, + + 0x47,0x1A,0xAB,0x27,0x9D,0xAB,0x15,0x81,0x6C,0xA7,0x83,0xD0,0x50,0x1D,0x62,0xB7, + + 0x1F,0x57,0x4B,0x30,0x8B,0x01,0x12,0x2E,0xCE,0xC1,0x8A,0x4A,0x7E,0x8E,0x0A,0x59, + + 0x0B,0xCD,0x2A,0x5F,0xD6,0x50,0xD5,0x95,0xFA,0x65,0x7D,0x18,0xBD,0xCD,0x43,0xCF, + + 0x8D,0xD6,0xFD,0xB4,0xED,0xAE,0x8A,0x4C,0x6F,0x44,0xA0,0xA9,0xD0,0xF5,0x69,0x60, + + 0xF8,0xFA,0x07,0xCC,0xBE,0xA7,0x03,0x85,0x72,0x37,0xFE,0x97,0x19,0x22,0xDB,0xF8, + + 0xD3,0xD1,0x3F,0xAD,0x49,0x8D,0xCF,0xDD,0x6A,0x2F,0xF4,0x4B,0xE7,0xAB,0x93,0xC9, + + 0x4E,0x9E,0xBF,0x65,0xB1,0x3C,0xC3,0xB0,0x69,0x8D,0x33,0x0E,0x3F,0x6A,0x88,0xF8, + + 0x39,0x2E,0xBD,0xB3,0x5D,0x6A,0x8E,0xC3,0xA4,0x89,0xB0,0xD5,0x0F,0xB0,0xAD,0xE8, + + 0xA3,0xB2,0xFB,0xCE,0x5E,0xD7,0x82,0xFD,0x86,0x03,0x2D,0x33,0xBE,0x97,0x5E,0x3C, + + 0x45,0xCD,0x82,0x1A,0x37,0xD4,0x7C,0xF6,0xE4,0x9C,0x1B,0x04,0xD7,0x7E,0x3E,0x9D, + + 0xCC,0xF1,0x40,0x45,0x6C,0xBF,0xEC,0xB4,0xAC,0xC8,0x83,0x14,0xF5,0xDD,0xF6,0x30, + + 0x22,0x1B,0x42,0x1B,0x92,0x4B,0xE8,0x81,0x9A,0xD9,0x08,0x05,0x57,0x7C,0x55,0x28, + + 0x86,0x26,0x6D,0xC8,0xEC,0xF6,0x2D,0x84,0xBB,0x90,0x59,0x95,0xB4,0x0A,0x11,0x0E, + + 0x08,0x02,0x9E,0x61,0xDF,0xB1,0xA3,0x2E,0x5E,0xE1,0x6D,0xAD,0x03,0xF4,0xEA,0x50, + + 0x96,0x66,0xF4,0x65,0x49,0x16,0x4D,0xD8,0x2D,0xD6,0x69,0x93,0x4E,0xB4,0x8C,0xCC, + + 0xA2,0x46,0x61,0xD0,0x01,0x46,0x8E,0x49,0x6E,0x76,0x77,0x56,0x9F,0xB8,0xEF,0xBF, + + 0xA3,0x66,0x0F,0xED,0xDF,0x17,0xAF,0xEE,0xB0,0x23,0x7F,0xAF,0x47,0xB9,0xCA,0x58, + + 0x6E,0x96,0xDC,0x3D,0x46,0xFE,0x18,0x98,0xE3,0xAA,0x8E,0xCA,0x4D,0x48,0x6C,0xA1, + + 0x4F,0x02,0x91,0x26,0xBE,0x42,0x44,0x71,0xD4,0x50,0x5D,0x1C,0x9F,0x42,0x65,0x33, + + 0xAE,0x9A,0x6E,0xA3,0x81,0xBF,0x8A,0x99,0x78,0x81,0x4D,0x11,0x17,0x07,0x14,0xA1, + + 0xA1,0xFD,0x34,0xDD,0xB9,0x9F,0x1E,0x11,0x1E,0xDC,0x3F,0x3F,0x82,0xBE,0xC0,0x21, + + 0xAC,0x42,0x0C,0x38,0x16,0x61,0x49,0x2D,0xE5,0xFF,0xAB,0x94,0xCC,0xFF,0xCC,0x4E, + + 0x0F,0x1F,0xC6,0x36,0xC0,0xDC,0x01,0x23,0xE2,0xA0,0xDE,0xDC,0xC6,0x2C,0x91,0xD9, + + 0x55,0x6E,0x43,0x67,0x6B,0x60,0x09,0x91,0xC6,0x90,0x4C,0xBD,0xD6,0x9A,0x74,0xEE, + + 0xE2,0x6B,0xA2,0xE5,0x57,0xF2,0x67,0x19,0xF6,0x36,0xEB,0x3D,0xDD,0x2D,0xFB,0xA6, + + 0x26,0xF0,0x13,0xE4,0x30,0xF5,0x30,0x24,0x36,0xC9,0xAF,0xE0,0x19,0xC7,0x16,0xB2, + + 0x07,0xA8,0x19,0xEC,0xF2,0x23,0xD8,0x42,0x23,0x54,0x78,0x06,0x65,0xCA,0x95,0xC5, + + 0xBB,0x4D,0x01,0xED,0x1C,0x64,0x29,0x45,0xA9,0x49,0x6C,0x54,0xA7,0xC9,0x9D,0xD5, + + 0xAB,0xB2,0x64,0x25,0x30,0x65,0x27,0x77,0x2A,0x48,0x7D,0x17,0x2C,0xDC,0x11,0x8C, + + 0x2C,0xCA,0x42,0x28,0xD1,0x25,0xCF,0xA8,0x80,0xA9,0x05,0x08,0x6B,0x36,0x3A,0x56, + + 0xF4,0x55,0x4A,0x38,0x31,0x6B,0x7B,0xC4,0xD5,0x0B,0x76,0xBC,0xA5,0x49,0x3B,0xF2, + + 0x8E,0xA0,0x7C,0xFD,0x9F,0xFB,0x80,0xDA,0xB4,0xB1,0x2B,0x3D,0x7F,0x2B,0x55,0xFB, + + 0x8D,0x76,0x1B,0x9A,0x26,0x7E,0x16,0xB3,0xBE,0x3E,0x37,0x7F,0x5A,0x29,0x7C,0x44, + + 0xA9,0x69,0xD2,0x4C,0x1C,0x7D,0x00,0xC6,0xA1,0x28,0x52,0x68,0x11,0xCF,0x32,0x5C, + + 0xE2,0x6E,0x93,0x8C,0xBE,0x24,0x62,0xA8,0x47,0xB2,0x76,0x3E,0xD8,0x2F,0x7D,0x44, + + 0x29,0xA5,0x01,0xED,0xE2,0x8E,0xC3,0xEB,0x4A,0xF6,0x3F,0xED,0x26,0x4E,0x2B,0x76, + + 0x45,0x4D,0xC9,0x2F,0xA8,0xD8,0xCB,0x66,0x9A,0x01,0x0D,0x9D,0x0B,0xB9,0x2C,0xE6, + + 0x01,0x60,0x67,0xC4,0x24,0x0D,0x2F,0x67,0xAA,0x59,0x31,0xB0,0xF7,0x66,0x2C,0xF6, + + 0x02,0x71,0x35,0x06,0x31,0xEE,0x02,0x52,0x81,0x0A,0x9C,0x76,0xF2,0x37,0xBD,0x11, + + 0x07,0x09,0x7A,0xEA,0x6E,0xCD,0x5D,0x98,0x11,0xF6,0xC5,0x3B,0x0B,0x89,0x54,0xD3, + + 0x06,0x08,0x1D,0xFE,0x8D,0xCC,0x1D,0x80,0xBA,0xAC,0x2A,0x91,0x9A,0x7C,0x9B,0xC1, + + 0xDF,0x78,0x04,0xE0,0x37,0x76,0x6B,0x62,0x40,0x64,0xBC,0x62,0x8E,0x35,0x16,0xE4, + + 0x5F,0x0A,0xF4,0x3B,0xCE,0x77,0x3C,0x50,0x3F,0x5A,0xD6,0xF0,0xD0,0x73,0x23,0xB0, + + 0xA1,0x37,0xD1,0x47,0x05,0x53,0x6B,0xB9,0x41,0xD6,0xB5,0x45,0xAC,0x7B,0xF5,0x2F, + + 0xC0,0xF6,0x5D,0x15,0x58,0x53,0xDD,0x30,0x38,0x83,0x8D,0x6C,0x90,0x57,0x4C,0xEE, + + 0x09,0x09,0xBC,0x20,0xCF,0x54,0xAF,0x19,0xCB,0x87,0x16,0xD7,0x7E,0x59,0x2E,0xFE, + + 0xD6,0xB4,0xC6,0x9D,0x1D,0xE5,0x78,0x64,0x6A,0xDB,0xA6,0x53,0x84,0xD8,0x3D,0x7A, + + 0xC4,0x01,0x38,0x16,0x4D,0xAC,0xA2,0x70,0x55,0x34,0xA0,0xCF,0x4F,0x1F,0x99,0xDE, + + 0x77,0x11,0xB4,0xC3,0x64,0x86,0x45,0x43,0x95,0xF4,0xA7,0x8D,0xBD,0xD4,0xD1,0x22, + + 0x8F,0x70,0x7F,0x2E,0x96,0x41,0x86,0xF7,0x44,0xC8,0xAE,0x6E,0x58,0x8E,0x8A,0x23, + + 0x48,0x96,0x0E,0xFD,0xAB,0x30,0x14,0xBE,0x14,0x1D,0xBE,0x5C,0x2D,0xF0,0xA4,0x37, + + 0x0E,0xF3,0xBF,0x3D,0x50,0x8F,0x05,0xF2,0x80,0x1C,0xEF,0xBD,0xF2,0x71,0xD8,0x2A, + + 0x2F,0x92,0x34,0x2D,0x7A,0xCE,0x9F,0xF8,0x7B,0xAA,0xA7,0x7F,0xFE,0xB5,0xE0,0x23, + + 0x9A,0x5F,0xD8,0x7C,0xFF,0xAF,0xEF,0xA2,0xF8,0xD1,0x66,0x2C,0x89,0x5D,0x83,0x55, + + 0x0B,0x5D,0xD0,0xBA,0xE2,0xE0,0xF8,0x6A,0x96,0x1A,0x1F,0xA9,0x3E,0x57,0x95,0x61, + + 0xB7,0x62,0x93,0x2A,0x6B,0x0F,0x80,0x16,0xBF,0x22,0x1E,0xD6,0x02,0xE2,0xED,0xD9, + + 0x3E,0x7C,0x04,0x68,0x08,0xFF,0x8C,0xCE,0xC7,0xB6,0x3C,0x45,0xD3,0x00,0x66,0x5F, + + 0xEF,0x14,0x18,0xAE,0xC5,0xE9,0x71,0x24,0x06,0xDF,0xD7,0xF9,0x3D,0x52,0x10,0xBA, + + 0xA3,0x48,0x2F,0x29,0x35,0x48,0xAC,0xA2,0xC6,0x4D,0x86,0x45,0x3C,0x60,0x19,0x64, + + 0x6F,0x36,0x1E,0x77,0x69,0xE0,0xB6,0x05,0x07,0xA5,0xF0,0xE3,0xB8,0x9D,0x96,0xA3, + + 0x6D,0x26,0xEF,0x5F,0x32,0xBC,0x09,0x9C,0x3F,0x6E,0x79,0x31,0x45,0x43,0x78,0xCE, + + 0x7C,0xCA,0x19,0x40,0xF5,0xF1,0x23,0x04,0x20,0x73,0x6F,0xDF,0xB4,0xEC,0xCE,0xE1, + + 0xB8,0xCB,0x55,0x6C,0x6F,0x76,0x35,0x51,0x69,0x75,0xDB,0x2D,0x29,0x7D,0xB3,0x2A, + + 0x8A,0xCB,0x0F,0x8A,0x27,0x1B,0x52,0xD3,0x50,0x88,0xED,0x1D,0x9C,0xA6,0xBB,0x40, + + 0xA9,0x90,0x47,0x70,0x43,0xF6,0x84,0x60,0x3D,0x31,0x9D,0x02,0x05,0x40,0xB6,0xCE, + + 0x26,0x98,0x15,0xA8,0x3A,0x07,0xC5,0x17,0x48,0x66,0x7C,0x74,0x96,0xF4,0xFC,0x3C, + + 0x82,0xEF,0xFE,0x65,0xBE,0xF2,0xCF,0x0B,0xB7,0x34,0x12,0xF4,0x7D,0x3B,0xDC,0xA9, + + 0xAA,0x95,0x9B,0x4B,0x67,0xEC,0x4F,0x19,0x25,0xC4,0xD4,0x9E,0x42,0x8E,0x0B,0x75, + + 0xEC,0x80,0x5F,0x3D,0x20,0x52,0xCC,0x06,0xC9,0x65,0x84,0x82,0xDF,0xE1,0xE1,0x72, + + 0xB8,0x31,0x0B,0xA2,0x16,0xB3,0x94,0x52,0x9A,0x03,0x14,0xD4,0x16,0xCC,0xAB,0xAD, + + 0x49,0xD3,0x92,0xFF,0x5D,0xBC,0xB9,0xAF,0x9B,0xD1,0x08,0xD4,0xCA,0x0C,0xB3,0x69, + + 0x01,0x9B,0x75,0xA7,0xC8,0x43,0x4B,0xA4,0x1D,0xDD,0x75,0x86,0x76,0xAD,0x67,0xC9, + + 0xA3,0x21,0xD2,0xE4,0x84,0xD0,0x39,0xAF,0x65,0x1E,0x7D,0x96,0x22,0xAE,0x36,0xEC, + + 0xCD,0xF0,0x9D,0xB8,0x91,0xF5,0x26,0x66,0x6E,0x60,0xAE,0xE3,0xD5,0x79,0x01,0xF6, + + 0xA5,0xBD,0x57,0x98,0xDE,0x6C,0x5B,0xE1,0x49,0x91,0x27,0xA5,0x08,0x6C,0x5A,0x21, + + 0xFA,0x92,0x48,0xB8,0x2B,0xEA,0xC2,0x52,0xE0,0xF6,0x0A,0x63,0xB5,0x50,0xC9,0xB1, + + 0xE6,0x87,0xF5,0x43,0xD7,0x48,0x5B,0x57,0x6B,0xDA,0x20,0xA7,0x16,0x48,0xE2,0xCA, + + 0x64,0x6D,0xDD,0x7E,0xBD,0x09,0x35,0xA8,0xB5,0x99,0xCE,0x89,0xC1,0xF7,0x28,0xAF, + + 0xAD,0xE7,0xFD,0xA1,0xB9,0x66,0x98,0x86,0x6B,0x98,0xAA,0xB4,0xDC,0x26,0xB1,0x0F, + + 0xD4,0x57,0xD9,0x89,0xDF,0x9E,0x9C,0xD4,0x39,0x51,0xED,0x1C,0x84,0xB8,0xBF,0x3B, + + 0xB1,0xC8,0x90,0xAF,0x2F,0x04,0x48,0xD9,0x12,0x50,0xE5,0x6B,0x81,0xE4,0x1E,0x48, + + 0x2F,0xE4,0x19,0xBC,0x5C,0x43,0xC2,0x15,0x68,0xFC,0x76,0x3F,0x8A,0x71,0x66,0x96, + + 0x6D,0x92,0x4E,0xB0,0x49,0x12,0x0E,0x3C,0xC5,0x9F,0x2E,0xEA,0xFD,0x51,0x3D,0xCF, + + 0x0D,0x98,0x1C,0xA0,0xC2,0x11,0x50,0x24,0x5D,0x92,0x08,0x11,0x05,0xFD,0x0F,0x9F, + + 0xD3,0x90,0x4B,0xBD,0x40,0x32,0xB3,0x7F,0xEB,0x15,0x0A,0x9D,0x87,0x40,0x60,0x53, + + 0xBE,0x0D,0xD0,0x9A,0xEB,0xDB,0x70,0x7F,0xE3,0xCB,0x91,0x12,0xBA,0x75,0x6B,0xD0, + + 0x47,0x7D,0x3F,0x30,0x6E,0xDE,0x62,0xC0,0x92,0x4E,0x2A,0x0F,0x2E,0x61,0x16,0xFB, + + 0x79,0x6E,0x81,0xC7,0x13,0x64,0x15,0xC3,0x42,0xBE,0x9B,0x13,0x20,0x72,0x36,0x5E, + + 0xD9,0x88,0xB3,0xEB,0x6A,0x38,0x79,0x6E,0x26,0xEE,0xF1,0xF7,0x57,0x96,0x80,0xF5, + + 0x23,0x46,0xCC,0x46,0xCB,0xD9,0x29,0x06,0x63,0xF4,0xAF,0xE6,0x53,0x9B,0xC8,0x96, + + 0x91,0x06,0x1E,0xBB,0xAE,0xDA,0x73,0xF4,0x7C,0x74,0x48,0x06,0xA8,0xEE,0x97,0x10, + + 0xE9,0x72,0xEE,0x3E,0x65,0x8B,0xE6,0x54,0xC4,0xCC,0xE9,0x45,0x73,0x59,0xAA,0xAA, + + 0xFC,0x07,0x25,0xCE,0x92,0xA7,0xEE,0x44,0xC7,0x1F,0xE2,0x4C,0xD5,0x74,0x02,0x25, + + 0xE3,0x4C,0xE4,0x7A,0xEB,0x95,0xDA,0xCA,0xE4,0xE5,0x02,0x33,0x34,0x73,0xAE,0x7A, + + 0x75,0xF6,0xD3,0x9B,0xFC,0x90,0xCE,0x9D,0x0A,0x45,0x82,0x18,0xB0,0x88,0x39,0xB9, + + 0x19,0xA5,0x2F,0x97,0x9B,0x58,0xDF,0xCB,0x75,0xC6,0x14,0x4B,0xB1,0x8B,0x31,0xA5, + + 0x7E,0x0F,0x93,0x99,0xFA,0x64,0x14,0xC7,0x20,0xB3,0xC3,0x25,0xEA,0xB9,0x2A,0x8A, + + 0x8C,0xF9,0x7F,0xB2,0xE3,0xD3,0xD6,0x79,0x26,0x48,0x85,0x0E,0x31,0x63,0xB5,0x2A, + + 0xFC,0x86,0xC2,0x46,0x12,0x99,0x08,0x88,0xFF,0x42,0x83,0x79,0x8E,0x01,0xD3,0xA1, + + 0x98,0x43,0x53,0x53,0xE4,0xDA,0x6B,0x4D,0x48,0x4A,0x55,0x5F,0x2E,0x61,0x3B,0x65, + + 0x8D,0x1C,0x43,0x32,0xBA,0x5D,0x80,0x7B,0xB4,0x4C,0x1F,0x23,0xD5,0x71,0xFC,0x70, + + 0xCA,0x61,0xCF,0x6C,0xCE,0x7F,0x3E,0x70,0xC3,0xD8,0xBC,0x20,0x0B,0xFB,0xB9,0x63, + + 0xAD,0x9C,0x51,0x89,0xCA,0x73,0x7E,0xB4,0x67,0xB2,0x64,0x30,0x0F,0x60,0x7B,0x87, + + 0x41,0x91,0x5E,0xDB,0xCF,0xF8,0x95,0x52,0x2A,0xF9,0x55,0x18,0xCC,0x69,0x75,0x9C, + + 0x21,0x9D,0xC3,0xAB,0xC6,0x6F,0x13,0x40,0x7D,0x41,0xC4,0xD3,0xF7,0x80,0x24,0xC2, + + 0x23,0x19,0x68,0x86,0xB1,0x9F,0x12,0xA2,0xC3,0x58,0xEA,0xB4,0xAC,0xD9,0x59,0xC8, + + 0xA1,0x11,0x92,0x47,0x2F,0xB8,0xFC,0xB2,0xE0,0xFE,0xE2,0xA4,0xAD,0x8A,0x3F,0xA1, + + 0xF6,0x54,0x27,0xC5,0x6A,0xD0,0x2D,0xA3,0x6E,0x5A,0x59,0x7B,0xF3,0x46,0x45,0xB3, + + 0xC2,0x42,0xB3,0x47,0xB5,0xD4,0x35,0x79,0xE5,0x57,0xE3,0xB0,0x25,0xA8,0x96,0x4F, + + 0x2A,0xED,0x59,0x12,0x07,0xC8,0xFE,0x22,0x4A,0x8E,0x87,0x2E,0xB5,0x77,0xCE,0x2D, + + 0x0A,0x5B,0x3D,0x60,0xEC,0xC2,0x76,0x3E,0x95,0x18,0x30,0x4E,0x7F,0xF9,0x03,0xCE, + + 0x29,0x14,0xBD,0x76,0xBE,0x90,0x68,0x54,0xE8,0x54,0x57,0xBD,0x00,0x7C,0xD9,0xF0, + + 0xAF,0xF8,0x91,0x70,0xE5,0xB6,0xF3,0x39,0x15,0x7B,0xB1,0xBD,0xF9,0x7B,0x5E,0xCD, + + 0x49,0xE3,0x73,0x48,0x54,0xC4,0xD7,0x6C,0x2D,0xDC,0x46,0x9E,0x8D,0x83,0x76,0x6A, + + 0x23,0xCD,0xAF,0x7C,0xED,0x82,0x26,0x7A,0x62,0x39,0xE6,0x2C,0x8C,0x72,0x3F,0x4B, + + 0x22,0x1E,0x99,0xC2,0xA8,0x70,0x37,0xA9,0x44,0xD3,0x47,0x6F,0xD8,0x8C,0x75,0x3B, + + 0xAD,0xAD,0x10,0xDD,0x38,0x31,0x67,0xA9,0xE3,0x50,0xBF,0xB9,0xBC,0xF2,0x1E,0x26, + + 0xE5,0xFF,0xB7,0x82,0x26,0x83,0x1A,0x87,0x07,0xCD,0x08,0xD7,0xF7,0x13,0x60,0x26, + + 0x66,0xF5,0xE0,0x02,0xC8,0x3C,0xF6,0x1D,0x46,0x81,0x98,0x26,0x2A,0xFF,0x9C,0x44, + + 0x4E,0xB8,0x99,0xFD,0x19,0x54,0xBA,0xD8,0x0C,0xE8,0x83,0xD8,0x20,0xED,0xBC,0xF9, + + 0x20,0x8A,0x06,0x49,0x6C,0x7F,0xB6,0x56,0x4A,0xC1,0x62,0x3E,0xD3,0xA9,0x26,0x3D, + + 0xA5,0x0F,0x25,0x35,0x13,0xD5,0x2F,0x67,0x35,0xC4,0x8D,0x99,0x35,0x79,0x3C,0x20, + + 0xA4,0x0E,0xE4,0xA5,0x9B,0xA8,0x42,0xED,0xB8,0x48,0x47,0x94,0x0F,0x52,0x99,0x7F, + + 0x80,0x95,0x9F,0x41,0x77,0x05,0xB1,0xA3,0xD3,0xAA,0xE6,0xE3,0xE4,0x55,0xEE,0x6E, + + 0x78,0x57,0x16,0x24,0x96,0xD6,0x9A,0xF1,0x47,0x04,0x1B,0xAC,0xF3,0x8B,0x61,0x55, + + 0xB1,0x74,0xA5,0x0C,0xCF,0x54,0x85,0x2B,0xC1,0xC4,0x4C,0xAC,0x5D,0x0F,0x6D,0x9F, + + 0x0C,0xAB,0xF3,0xDF,0xBA,0xAF,0x9E,0x29,0xC1,0x0F,0x3D,0x4D,0x31,0xA6,0xE3,0xDB, + + 0x5D,0xC8,0x18,0x50,0xB8,0x27,0x5B,0x34,0x48,0x1E,0xE9,0x2E,0x7F,0xF1,0x72,0xCB, + + 0xEE,0xAB,0x82,0x35,0x3E,0x04,0x1D,0x3D,0x03,0x76,0x2B,0xC3,0x55,0x10,0x91,0x46, + + 0xBF,0x57,0x9C,0x48,0xFF,0x0F,0x0A,0x4D,0xB3,0xC3,0xCD,0xE1,0xAF,0xBA,0x88,0xB6, + + 0x0F,0x00,0x92,0x5C,0xBA,0xEC,0x21,0x78,0x34,0xCE,0x6D,0x81,0xB6,0x85,0xC9,0xB6, + + 0x7F,0xF5,0x34,0xBC,0x12,0x53,0xA8,0x69,0xB1,0xDD,0xFB,0x66,0x37,0x66,0x14,0x5F, + + 0xD2,0x1C,0x07,0xDF,0x63,0x8F,0xA6,0x73,0xCB,0x37,0x28,0x81,0xFB,0x81,0xC0,0x06, + + 0x4A,0x2B,0xDB,0x82,0x7F,0x65,0x98,0xE0,0xE7,0x6D,0xB4,0xD4,0x47,0x66,0xAC,0xD4, + + 0xB7,0x35,0x00,0xD4,0xB6,0xF3,0x3D,0x41,0xAF,0x7A,0x2C,0x71,0x77,0x04,0x5B,0xB0, + + 0xCF,0x17,0x49,0x07,0x48,0x92,0x1F,0x73,0x47,0x5A,0x4F,0x4F,0x47,0xBD,0x23,0x89, + + 0x6D,0x5B,0x7B,0x77,0x5E,0x76,0x5A,0xBB,0x31,0x16,0xB9,0xF0,0x74,0xFD,0x05,0x22, + + 0x6A,0x6B,0x04,0xF9,0x12,0xB2,0x1C,0x20,0xE5,0x90,0x8C,0x64,0x54,0x06,0xF7,0xC8, + + 0x03,0x93,0x8C,0x89,0x80,0x08,0x14,0x90,0x41,0x21,0x9C,0x56,0x2D,0x78,0xA5,0xFF, + + 0x2F,0xD4,0x4A,0x28,0x4B,0xB9,0x1D,0xE4,0x65,0xD9,0xCD,0x37,0x0D,0xF9,0xC7,0x15, + + 0x06,0x1E,0x95,0x55,0x6A,0x88,0xAF,0x77,0xEE,0xD3,0x85,0x75,0x77,0x4E,0x01,0x7B, + + 0xB0,0xF8,0xD8,0xB9,0x57,0x1D,0x91,0x9D,0x07,0x7D,0x09,0x9E,0x78,0x57,0x51,0x67, + + 0x2D,0x97,0xFE,0x00,0xC6,0xA5,0xFE,0x0F,0x30,0x72,0x5C,0x4F,0xB7,0xB9,0xCF,0x01, + + 0x8E,0x4C,0xA6,0x0B,0xD2,0x0C,0x97,0x5A,0x0C,0x5A,0x51,0xDD,0x8A,0x55,0x47,0x1D, + + 0x51,0xDA,0x12,0xD5,0x59,0x3C,0x9A,0x23,0x6A,0xCD,0xE1,0x2D,0xBD,0x76,0x62,0x2A, + + 0x0A,0x33,0x5B,0x2C,0xBC,0x40,0xD1,0x5F,0x93,0x27,0xCE,0x3E,0x22,0xFA,0x08,0x13, + + 0x2C,0xAF,0x8E,0x9E,0x82,0x36,0xBB,0x12,0x4B,0x90,0xB0,0xCE,0xFD,0xF5,0xF1,0xB8, + + 0xC2,0xF2,0x9E,0xBC,0xF1,0xB1,0x77,0x15,0xCC,0x6E,0xA7,0x62,0x5D,0xBE,0x35,0xD4, + + 0xC7,0x7E,0xEB,0x3D,0x9D,0x40,0x69,0x4F,0x10,0x9D,0x43,0x80,0x5C,0xBE,0x5E,0xE2, + + 0x04,0xFD,0x84,0x43,0x91,0x2E,0x30,0xAA,0x41,0x20,0xAA,0xD7,0x3C,0xEB,0x98,0xA6, + + 0x07,0x20,0x3A,0x0B,0xFD,0x8E,0xB4,0xAB,0x40,0xC1,0x8C,0x3E,0xF0,0x0F,0xC1,0x20, + + 0x7B,0x40,0x41,0xB0,0xD7,0xF6,0xA6,0x5C,0xE4,0xBF,0x02,0x14,0xBC,0x20,0x32,0x6B, + + 0x22,0x66,0xBF,0x91,0xFF,0xBB,0xA6,0xAA,0x3E,0x02,0xFB,0x34,0xD0,0xC3,0x94,0xBA, + + 0x8D,0xF9,0x8A,0xBA,0xB1,0x29,0x7D,0x93,0xCE,0x49,0xE8,0xB4,0xA5,0x6B,0xCE,0x2F, + + 0xD9,0xFA,0xB0,0xD6,0x12,0xA2,0xC8,0x0F,0x16,0x4E,0xB8,0x35,0xA6,0x68,0x26,0x3F, + + 0x50,0x0E,0x8B,0x58,0xD3,0x2E,0xFD,0xFF,0x82,0xB9,0x65,0x95,0x8E,0x69,0xF2,0xCB, + + 0x74,0x46,0x72,0xB7,0x3F,0xDA,0x5F,0x6C,0x3D,0x47,0xD3,0x71,0x70,0x26,0x3D,0xEA, + + 0x63,0x07,0xDC,0x03,0x1C,0x66,0xCD,0x28,0x6C,0x93,0x25,0x19,0x5E,0x00,0x99,0x9C, + + 0x2D,0xCE,0x55,0x1C,0x9A,0x27,0x64,0x3E,0xA8,0xCA,0x0C,0x7B,0x9B,0x99,0x83,0x76, + + 0x8E,0x4B,0xE2,0xAD,0x4E,0x95,0x17,0xD9,0x7D,0x9B,0x4B,0x3C,0xB4,0xC7,0xCB,0x38, + + 0x5E,0x96,0x6B,0x22,0xBD,0x69,0x35,0xCA,0x45,0x46,0x93,0x4E,0xFD,0x96,0xEE,0x33, + + 0xD4,0xF3,0xBA,0x68,0x9F,0x0B,0x56,0x74,0xB3,0xD4,0x12,0x39,0xFC,0x20,0xE7,0x27, + + 0x96,0x51,0xED,0xA1,0x57,0x63,0x5A,0x79,0x1B,0x0F,0x20,0x3A,0x59,0x21,0x78,0xD7, + + 0x7D,0x4F,0x1C,0x5C,0x9C,0x0E,0x0B,0x78,0x92,0xF9,0x52,0x1F,0xE9,0xDA,0xF0,0x17, + + 0xE0,0x3E,0xBB,0x1B,0x39,0xD1,0x5F,0x2A,0x3E,0x46,0xDA,0x8E,0xAE,0x74,0xAF,0x04, + + 0x2B,0xE6,0xDE,0xC1,0x4C,0x72,0x2C,0x5B,0xED,0xAD,0x23,0xA5,0xFD,0x7C,0xE7,0xB4, + + 0xAE,0x13,0xD6,0x83,0x4D,0x73,0x67,0xF7,0x98,0xD7,0x5C,0x01,0xCD,0x33,0x03,0x59, + + 0xB8,0x16,0x15,0x11,0x11,0xED,0x72,0x5A,0x15,0xC4,0xFD,0x21,0x9E,0xB8,0xBA,0x90, + + 0x2C,0x1F,0x1D,0x2E,0x44,0x3C,0xF5,0xCB,0x23,0x53,0x4B,0xE8,0x9A,0x07,0xFC,0x33, + + 0x21,0x04,0x44,0x01,0x01,0x76,0xC4,0xA2,0xC3,0x58,0x56,0x60,0x39,0x10,0x4D,0xB6, + + 0xC8,0x5F,0xC4,0x7B,0xD2,0x3A,0xFC,0xB2,0xE0,0xFE,0xBE,0xFC,0x72,0x65,0xFD,0x32, + + 0xA9,0x0D,0x8B,0x35,0x96,0x30,0x2D,0xA3,0x6E,0x5A,0x8C,0xC6,0x17,0x18,0x4C,0xB7, + + 0x48,0x7D,0xAD,0x95,0x05,0x3A,0x35,0x71,0xE5,0x34,0x1D,0xDD,0xF3,0x35,0x6E,0x0C, + + 0x46,0x0C,0xDC,0x48,0x44,0x7A,0x1E,0xDB,0xEA,0x94,0x16,0x6A,0xEA,0x7B,0xB8,0x69, + + 0xC1,0x49,0xD4,0x0A,0x45,0x7B,0xA1,0x5A,0x4D,0x75,0xF6,0x7E,0xFF,0x8C,0x3D,0x7A, + + 0x4C,0xB5,0x17,0xAC,0x19,0xE5,0xAF,0xD7,0x4B,0x3F,0x74,0x56,0x87,0x7A,0xCF,0x2C, + + 0x73,0x18,0x1F,0xCE,0x4C,0x34,0x9E,0xFA,0xF1,0x77,0x0F,0xCE,0x8C,0x17,0xD6,0xD6, + + 0x0C,0xE8,0x8C,0x32,0x99,0x31,0x28,0x2A,0xE9,0x52,0xD9,0x57,0xFD,0xFD,0x91,0xF8, + + 0x2D,0x3D,0xC6,0x76,0xCE,0x32,0x26,0x3A,0xCA,0x1E,0x8E,0xF0,0x6B,0xF6,0x93,0x4D, + + 0xE9,0x52,0x8D,0xD0,0x19,0x38,0xF7,0x2B,0x66,0x50,0x47,0x6F,0xD8,0x6C,0x6E,0xE6, + + 0x8D,0x5D,0x7B,0xA2,0x18,0x7E,0x3F,0xB9,0x45,0xD2,0xEA,0x1F,0x57,0xF4,0x58,0x25, + + 0xFD,0x8F,0xE7,0x8C,0x35,0x42,0x4F,0x5D,0xC9,0x76,0x70,0x07,0xA5,0xA2,0x84,0x81, + + 0x1E,0x8B,0xF1,0xB9,0xB0,0x50,0xBA,0x5D,0x26,0x20,0x41,0x4C,0xF6,0x84,0xB1,0x71, + + 0x3F,0xBF,0xF8,0x40,0x31,0x5D,0x39,0x33,0x90,0x15,0x21,0x91,0xD2,0xC3,0x6A,0xE3, + + 0x9A,0xB2,0x51,0x71,0x1A,0x25,0xAA,0xC0,0x41,0x4E,0x86,0xD5,0x28,0xA1,0x44,0xB3, + + 0x32,0x88,0x19,0x80,0xB4,0xE1,0xF4,0x9F,0xB9,0x85,0x92,0x90,0xD3,0xA4,0x4E,0x3A, + + 0x4E,0x21,0x98,0x76,0x31,0x68,0x7C,0x35,0xC6,0xCB,0x31,0x74,0x3C,0x9F,0x3E,0xC3, + + 0xF5,0xF1,0x93,0xC1,0xB0,0xEA,0xE1,0xA4,0xC4,0x33,0x19,0x77,0xF2,0x4D,0x74,0x07, + + 0x7B,0xD6,0x79,0xD3,0xD4,0xEF,0xB9,0xC6,0x80,0x85,0xF9,0x9F,0xB0,0x6C,0xE2,0x2B, + + 0x9C,0x85,0xE0,0x4E,0x4C,0xAE,0x60,0x7C,0xA7,0xAC,0xA6,0xF0,0x5A,0xA9,0x85,0x60, + + 0xD0,0x35,0xAE,0xFC,0x39,0x24,0x70,0x7E,0xCF,0x05,0x81,0xDC,0xF1,0x54,0x58,0xF9, + + 0xAD,0x5A,0xAF,0x08,0x3D,0x22,0x0B,0xD4,0xE8,0x88,0x41,0xAB,0xF8,0x9B,0x16,0x40, + + 0x8B,0xB3,0xF2,0xB0,0x3A,0xEA,0x83,0x59,0x3E,0xAE,0xC3,0x1B,0x52,0xE9,0xD1,0x63, + + 0x0A,0x14,0x82,0x18,0xBB,0x71,0xA4,0x3B,0x25,0xB8,0x2D,0x88,0x4E,0x67,0x50,0xFF, + + 0xB0,0x26,0x2A,0x12,0xD5,0xA4,0x99,0x81,0x30,0xCD,0xB4,0x98,0x6C,0x05,0x2F,0x6D, + + 0x9A,0xE9,0x9B,0x68,0x63,0xA1,0xF3,0xAD,0x5C,0xCD,0x0C,0x89,0x3F,0xF5,0xE4,0x5B, + + 0xBC,0x4F,0x6F,0xE0,0x93,0xCF,0x13,0xB9,0x49,0x3A,0x03,0x5B,0xEC,0xCA,0xC7,0x79, + + 0xD8,0x67,0x34,0x04,0xBC,0x68,0x36,0xA1,0x27,0xD0,0xD2,0xDB,0x75,0x90,0x1F,0x28, + + 0xA6,0x9F,0x6C,0x46,0x96,0xB7,0x10,0x22,0xEC,0x83,0x70,0x65,0x73,0x5B,0x96,0x3D, + + 0x5C,0x25,0x9D,0xD7,0x34,0xBD,0x19,0x2A,0x6D,0x60,0xE5,0xAF,0xA0,0xB0,0xCD,0xAC, + + 0x81,0x3E,0x89,0xCB,0x14,0xBA,0xB5,0xFC,0x86,0xD3,0x5D,0x33,0xF8,0xD2,0x60,0xD9, + + 0xDA,0xF7,0xDE,0x38,0xC3,0x35,0x0C,0x60,0x67,0x93,0xC4,0x04,0x52,0x7F,0xA0,0x56, + + 0x23,0x5F,0x3C,0x2C,0xCE,0x3C,0x44,0x22,0x3B,0x5D,0xEC,0x14,0x53,0xF3,0xA5,0x13, + + 0x10,0xD4,0xF6,0x3C,0x57,0x35,0x4D,0xB3,0xEE,0xD9,0xC0,0x05,0x5A,0x7D,0xBE,0x23, + + 0x02,0x66,0x69,0x24,0x33,0x23,0x4D,0x11,0x65,0xDF,0xF5,0xC0,0x56,0x28,0xB9,0x65, + + 0xD5,0xE9,0xA5,0xFD,0x1F,0xD6,0x36,0xEE,0xF1,0x93,0x76,0x7F,0x15,0xBF,0x91,0xDD, + + 0xB3,0xC4,0x6E,0x4A,0x7D,0xBD,0x62,0xBA,0xE4,0x7A,0xB8,0xC2,0x59,0xF4,0xDA,0xF9, + + 0x82,0xC5,0xC5,0xFF,0xBF,0x1A,0x37,0xAB,0xE5,0xA6,0x36,0x8F,0xEC,0xBA,0x35,0x99, + + 0x1E,0x10,0x14,0x9B,0xB2,0xBD,0x3F,0x7C,0xEF,0x2E,0xA9,0xDD,0x06,0x76,0x18,0xCC, + + 0xCF,0x1F,0x42,0xB1,0x9D,0x6C,0x06,0x94,0xCD,0xB9,0x96,0xAE,0x92,0xF1,0x95,0x2A, + + 0x82,0x6C,0x8E,0x9F,0xC6,0xB0,0x76,0x4D,0x8E,0xD2,0xF6,0xFB,0xF0,0xF9,0x4A,0x38, + + 0x22,0x93,0x14,0x4F,0x03,0xFF,0xC8,0x09,0xCA,0xD8,0x5B,0x71,0x73,0x08,0x11,0xDD, + + 0x4E,0x1C,0xA5,0x21,0x1C,0xDA,0x1F,0xBB,0x09,0xD2,0xFB,0xB8,0xFC,0xF0,0x90,0x82, + + 0x05,0x5A,0xD9,0x20,0x9F,0x22,0x80,0x52,0xBF,0xCB,0x94,0xC6,0x74,0xFB,0xC2,0xF2, + + 0x83,0x49,0xE0,0x14,0x7A,0xC5,0x4C,0x52,0xB6,0x2D,0x85,0x1A,0x60,0x9A,0x3B,0xE3, + + 0x02,0x4A,0x36,0x04,0x1D,0x2E,0xE9,0x1C,0xC6,0x51,0xB5,0xDC,0x51,0x17,0x29,0x73, + + 0xC2,0xF8,0x8D,0x15,0x12,0x2D,0xDD,0xD3,0x9D,0xB4,0xF8,0xC9,0x4D,0x23,0x19,0xD9, + + 0xA5,0x45,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0xB7,0x22, + + 0xA0,0xF8,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x21,0x01, + + 0x2C,0x0B,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x31,0x75, + + 0x85,0x15,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x7A,0x2F, + + 0xA9,0x82,0x62,0x33,0x3C,0x44,0x93,0xCB,0x4C,0xB0,0xDA,0xD7,0xDA,0x20,0xC6,0x2F, + + 0x76,0x0B,0xAD,0x8A,0x5B,0x8D,0x20,0xC2,0x94,0xD4,0x4A,0x78,0xFA,0x0C,0xF8,0xEB, + + 0xAC,0x48,0xDE,0x12,0x75,0x31,0x36,0x77,0x35,0x96,0x33,0x5F,0x7B,0x6C,0xD0,0xB6, + + 0x8F,0xFB,0x14,0xFF,0x79,0x94,0xB4,0x62,0x3C,0xF7,0xE3,0x39,0x92,0xEA,0x42,0x68, + + 0x5E,0x6C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0xED,0xFC, + + 0x0D,0x87,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x83,0x88, + + 0xA3,0x4F,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x60,0x66, + + 0xAD,0x4F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x5F,0xA4, + + 0xAF,0x12,0x24,0x77,0xBC,0x8D,0x60,0x84,0xE7,0xF7,0x54,0xE8,0xB4,0x7D,0x04,0xA6, + + 0x80,0xBE,0x43,0x64,0x3D,0x3E,0xCE,0xF6,0xCB,0x10,0x0C,0x73,0x98,0x0B,0xB2,0x80, + + 0x2D,0x14,0xFD,0xA1,0x32,0x7A,0xBD,0x07,0xE6,0x98,0x6E,0x82,0x51,0x8D,0x9E,0x82, + + 0x7E,0xE2,0x4D,0x80,0x30,0x35,0xA2,0x80,0x40,0xF2,0xFB,0xD8,0x92,0x77,0x9B,0xD0, + + 0x24,0x9E,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0xCA,0x23, + + 0x50,0x54,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0xB4,0xE5, + + 0x5F,0x97,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xE6,0xB7, + + 0xDC,0xC9,0x0E,0x8B,0x5B,0xB8,0x2E,0x98,0x77,0x1A,0xEF,0xDD,0x6F,0x6E,0x75,0x01, + + 0xD4,0xA8,0x15,0x74,0xE1,0xF6,0x43,0x50,0x32,0x19,0xC4,0xB9,0xDA,0x7F,0xB0,0xB4, + + 0x8C,0x97,0xFF,0xA9,0x59,0x95,0x50,0x17,0xEE,0xDA,0x07,0x2F,0xF9,0x02,0x71,0x9F, + + 0x48,0xC8,0xEF,0xDD,0x07,0x34,0x1D,0x9A,0xEF,0x51,0x97,0xF1,0x18,0x74,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0xA6,0x86, + + 0x6C,0x0B,0x60,0xC6,0x69,0xE1,0xF0,0xF3,0x2E,0x50,0x0F,0xE1,0x8E,0xE8,0xA9,0xEA, + + 0x01,0xB2,0x28,0xF4,0x97,0xE2,0x06,0x4F,0xC8,0x47,0x28,0x71,0xAC,0x17,0x71,0x97, + + 0x88,0xC0,0xC1,0x43,0xEF,0x29,0x42,0x0E,0x6B,0x83,0xB3,0x58,0x0E,0x1D,0x3F,0x97, + + 0x8A,0x2D,0xA3,0x93,0xD5,0x0F,0x3F,0xF3,0xC9,0x4E,0x46,0x13,0x09,0xA7,0xE9,0x47, + + 0x83,0x75,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x31,0x9C, + + 0xA0,0xC4,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0xCD,0xB3, + + 0x96,0x70,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x39,0x63, + + 0xC3,0xC5,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xD2,0x06, + + 0xE5,0x51,0xE4,0xDF,0x57,0x02,0x12,0x3E,0xA5,0x31,0x11,0x29,0xE1,0xE1,0xEA,0x57, + + 0xCC,0xCB,0x05,0x6C,0x61,0x56,0xC5,0x1E,0x4B,0xE9,0x0E,0x3C,0xB2,0xA8,0x7B,0x06, + + 0xC6,0x53,0x33,0x50,0xFD,0xCA,0x21,0xC4,0x41,0xA8,0x31,0xA2,0x25,0xE5,0x65,0x9D, + + 0x8B,0x78,0x91,0xAF,0xBB,0x5F,0x1C,0x7D,0x6F,0x85,0xE2,0x31,0x9B,0x26,0x64,0xC7, + + 0x08,0x24,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0xB5,0x4E, + + 0x09,0x07,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x09,0x6F, + + 0x0B,0xA9,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x9A,0x7F, + + 0x0A,0xA8,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x5A,0x85, + + 0x85,0x01,0xA6,0x64,0xB3,0xE5,0xC2,0x26,0x71,0x76,0x24,0x24,0xA9,0x7F,0x83,0xE8, + + 0xF8,0xD0,0x96,0x74,0x17,0x4E,0x65,0x0D,0x6D,0xB1,0x61,0xB7,0x71,0x09,0x5E,0xF8, + + 0x87,0xBD,0x35,0x05,0x96,0xD2,0x6D,0xA6,0xE0,0xB8,0x8F,0x45,0x68,0x18,0x74,0x9D, + + 0x40,0xFF,0xD2,0x15,0x97,0xD3,0xFD,0x62,0x86,0x92,0x21,0x35,0x28,0x7C,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x44,0x16, + + 0x2F,0x08,0xFC,0x8F,0x9F,0xF9,0xF6,0x6A,0x82,0x9A,0xEC,0xAF,0xDF,0x5C,0xEE,0xD6, + + 0xE9,0x44,0xE4,0x65,0x9E,0xBF,0xC9,0xBF,0x61,0x99,0x22,0xCC,0x4E,0x29,0x7E,0x85, + + 0x49,0x5A,0xC7,0xCE,0x49,0xB7,0xBE,0x38,0xCD,0xBA,0xFF,0x7A,0xF8,0x02,0x57,0xBC, + + 0x50,0x94,0xA3,0xE4,0x1C,0x33,0x71,0x4B,0xEB,0xB1,0x47,0x57,0x29,0x34,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x90,0xE4,0xA8,0x30, + + 0x85,0x31,0x40,0xA1,0x4B,0x24,0x49,0xF3,0xE7,0x25,0xF0,0x26,0xCE,0x6D,0x32,0xF8, + + 0xF0,0x4E,0x5C,0x4A,0x82,0x1E,0xA0,0xCB,0x72,0xF6,0x35,0x5D,0xF2,0xEC,0xA9,0x29, + + 0x05,0xE3,0x87,0x42,0xBE,0xFE,0x29,0xC9,0x03,0x0D,0xDB,0x38,0x90,0x64,0x08,0xF7, + + 0xB2,0x26,0xD4,0x36,0x3E,0xFE,0xD9,0x94,0x73,0x58,0x66,0x4A,0xA2,0x63,0x80,0xE5, + + 0x07,0x02,0x48,0x74,0xF3,0x2B,0x30,0x24,0x05,0xCF,0xD7,0xE0,0x7C,0xEE,0xC0,0xD2, + + 0x0A,0xBA,0x7C,0x44,0xB0,0x23,0x91,0x92,0xC1,0x0D,0x65,0xF6,0x56,0x87,0x4D,0xB2, + + 0x84,0x65,0x75,0xA7,0x10,0x2E,0xD5,0x83,0x40,0x0E,0x0E,0x15,0xD4,0x0C,0x89,0xF4, + + 0x86,0x01,0x41,0x39,0x72,0x28,0x41,0x81,0xBC,0x48,0xE1,0x8A,0x12,0x05,0xF8,0xE0, + + 0xC6,0xC3,0xC7,0xEB,0x2B,0xD0,0x7C,0x4E,0x7B,0xB0,0x4F,0x2D,0x38,0x0E,0x53,0x93, + + 0xEE,0x12,0x75,0xDB,0x2A,0x4C,0x37,0x59,0xE8,0xD6,0x63,0xB8,0x51,0x3F,0x83,0x01, + + 0xEF,0x10,0x3B,0xF3,0x88,0x67,0xD3,0x8C,0x7A,0x4C,0xEE,0x57,0xBA,0x6E,0xEC,0x2F, + + 0xB4,0xA6,0x33,0x82,0x6C,0xA2,0x7B,0x3B,0x6D,0x46,0xE0,0xED,0x95,0x62,0x4E,0x4E, + + 0xAB,0x84,0xA2,0x0D,0x9E,0x21,0xE6,0x98,0xB5,0x43,0x16,0xBC,0x56,0x6F,0x9E,0xD6, + + 0x48,0xB2,0xCE,0xD8,0x35,0x7B,0x10,0xC7,0xE8,0x4B,0xDE,0xF8,0x75,0x15,0xC3,0xAB, + + 0x6B,0x4C,0xC9,0x49,0x39,0xA5,0x33,0xC9,0x76,0x43,0xEB,0x79,0x58,0x26,0x33,0xDB, + + 0x8E,0x56,0x81,0xA6,0x9D,0x4C,0xD3,0xBC,0x6A,0xC7,0x64,0x2F,0xD5,0x0D,0xD4,0xF3, + + 0x49,0x91,0x03,0x75,0x93,0x60,0xC0,0xFE,0x4E,0x8C,0x94,0x20,0x78,0x17,0xAB,0x72, + + 0xC1,0xEE,0x21,0xE8,0x92,0x37,0xE0,0xCE,0x7B,0x3E,0x27,0x11,0x86,0x8C,0xFE,0x7E, + + 0x49,0x3B,0xB7,0xB5,0xA4,0x34,0x7C,0x4A,0xDB,0x85,0x2A,0x94,0x51,0x8D,0x54,0x7A, + + 0x48,0x1C,0xAD,0x0F,0x10,0x35,0x44,0x0A,0x44,0xAC,0x8F,0x35,0x1A,0x08,0x84,0xA2, + + 0x63,0x54,0x94,0xF1,0x91,0x32,0x34,0xA4,0xEA,0x59,0xB4,0xA0,0x2A,0x36,0x34,0x52, + + 0x26,0x94,0xB3,0x36,0xB1,0x1D,0x0C,0xDF,0xC2,0xDF,0x96,0xDE,0x8E,0xD4,0x3D,0xA3, + + 0xE3,0x96,0xC9,0xAB,0x13,0xBC,0x1F,0x1A,0x41,0x50,0x01,0xA8,0xD6,0x34,0x17,0xD0, + + 0x00,0x11,0xF0,0x51,0x9D,0x7F,0xAA,0x13,0x61,0x1F,0xE5,0xC5,0x87,0xD8,0xFE,0x80, + + 0xD5,0x57,0x2B,0xF1,0x9B,0x35,0x17,0xCE,0x5B,0x1D,0x2D,0x1C,0xC6,0xD7,0xE0,0x75, + + 0x35,0x94,0x8C,0xE3,0x78,0x30,0xE6,0xC3,0x96,0x42,0x38,0xCE,0xDA,0x7F,0x97,0x75, + + 0x7D,0xE1,0x78,0x5D,0x1B,0x31,0xB8,0x4F,0xF8,0xA7,0x4E,0x89,0x7A,0x32,0x70,0x1D, + + 0xE2,0xCE,0xF7,0x1F,0x39,0x6D,0x2F,0xCB,0x4E,0x4B,0x93,0xC3,0x58,0xF1,0x4E,0xAF, + + 0x89,0x1A,0xA6,0x88,0x3E,0x31,0x4E,0x18,0x6B,0x53,0x76,0x9E,0x18,0xD4,0x2E,0x98, + + 0x85,0x12,0x46,0xC8,0x9A,0xB7,0x9E,0x28,0x63,0x5B,0x25,0x0C,0x73,0x1B,0x4F,0xEE, + + 0x4B,0x11,0x8D,0x36,0x19,0x38,0xE3,0x19,0xE6,0x51,0xA9,0xEA,0x1B,0x18,0x2F,0x99, + + 0x0D,0x12,0xB0,0x3F,0x39,0x77,0x57,0x7D,0x4A,0xD5,0x20,0x8F,0x00,0xC2,0xBD,0x45, + + 0xC6,0xC3,0x80,0xF5,0xB7,0xB2,0x28,0xA6,0x42,0xA3,0x32,0x5C,0xB7,0xE9,0x12,0xE1, + + 0x76,0x9A,0xD0,0x56,0x5D,0x7C,0xEC,0x6C,0x6B,0x1D,0x21,0x0B,0xBE,0xA5,0x69,0x07, + + 0xE3,0xC1,0x19,0x77,0x14,0x04,0x7E,0x21,0x8C,0xAE,0x31,0xE1,0xA0,0x69,0xC8,0xE5, + + 0x00,0xD2,0x51,0x1F,0x68,0xEC,0x50,0xD8,0xFE,0xC9,0x83,0x87,0x48,0x4C,0x3A,0x43, + + 0xA5,0x82,0x17,0x16,0x17,0xAB,0xF0,0x80,0xE7,0x4C,0x34,0xB6,0x5E,0xE7,0xE8,0xB0, + + 0xA6,0x0D,0x88,0x12,0xDB,0x2E,0x65,0x82,0x4F,0xCA,0xFE,0xF2,0x79,0x9D,0x69,0xC6, + + 0x27,0x0E,0xD9,0x97,0x29,0xA9,0x75,0x81,0x44,0x8E,0xC9,0x73,0x54,0xAE,0x6B,0xB1, + + 0x05,0x8F,0xED,0xB5,0x15,0xA4,0x19,0x37,0xB6,0xC8,0x99,0x33,0x91,0xEA,0x7B,0x85, + + 0xEB,0x93,0xC2,0x0C,0xD2,0xA5,0xCE,0x54,0x56,0xA7,0x16,0x54,0xFF,0x18,0x73,0x84, + + 0xEA,0xC5,0xB4,0xFC,0x9F,0xAD,0x22,0xBE,0x4B,0xAA,0xA6,0x01,0x74,0x32,0x9A,0xED, + + 0x9C,0xC5,0xE9,0x12,0x1E,0xD6,0x53,0x29,0x64,0xC7,0x44,0x3F,0x1B,0x48,0x38,0xF3, + + 0x57,0x40,0x4D,0x7D,0x5C,0x21,0x74,0x39,0x85,0xA7,0xBB,0x04,0xB4,0x70,0xA2,0x28, + + 0x4F,0xAC,0xE4,0x3C,0xBD,0xAA,0x12,0x2E,0x72,0xC3,0x0D,0xCE,0xFF,0x2C,0x7A,0xB8, + + 0xAE,0x05,0xBA,0xC7,0xBC,0xAB,0x40,0x98,0xCD,0x85,0x2E,0x33,0xA2,0x81,0x1B,0x6C, + + 0x2F,0x06,0xB3,0xE6,0x3D,0xA8,0xE3,0xE9,0xCB,0x57,0x93,0x2B,0xC6,0xAC,0x63,0xB9, + + 0x0D,0x87,0xBB,0x52,0x3C,0xA9,0x66,0xFF,0xE1,0x1C,0x3F,0xDF,0x7E,0x2F,0x1E,0x00, + + 0xBD,0x30,0x9C,0xD4,0x77,0x40,0x8B,0x44,0xE6,0xD4,0xCB,0x44,0xF6,0xD8,0xBF,0x7A, + + 0xE2,0xDE,0xD4,0x14,0xB5,0xE7,0xFC,0x17,0x3E,0xD5,0xC4,0x34,0x7C,0x3E,0x5D,0xC5, + + 0xD8,0xDE,0xA7,0x05,0x29,0x7B,0x07,0xC1,0xC5,0x90,0x4D,0xC5,0xB7,0x4D,0x4D,0xDC, + + 0x86,0x9C,0x95,0x47,0xE9,0x33,0x3B,0xF4,0xCB,0x0F,0x85,0x67,0x0E,0xFC,0x2E,0xDF, + + 0x67,0x95,0x65,0xA4,0x75,0x0B,0x89,0x00,0xC7,0x5E,0x58,0x75,0x0B,0xFE,0x57,0x30, + + 0x8B,0x28,0xD4,0x06,0xCC,0xBA,0x36,0x4D,0xC4,0xD8,0xA6,0xD6,0x0F,0xB7,0x1D,0x41, + + 0xA7,0x91,0x9D,0x45,0xB3,0x66,0x0A,0x01,0x4A,0xDB,0x33,0x63,0xD8,0x93,0x15,0x51, + + 0xA6,0x75,0x8D,0x93,0xBF,0xF5,0x37,0x2C,0x44,0xD1,0x29,0xBC,0xF1,0x94,0x46,0x88, + + 0x79,0x95,0xC6,0xC1,0x51,0xB7,0xE2,0xF4,0xFF,0xE7,0xD6,0xEF,0x8B,0xF5,0x7E,0x9E, + + 0x05,0x37,0x84,0x4E,0x61,0x39,0x7B,0x5D,0xEF,0xDD,0xB2,0xC5,0x7B,0x9A,0xE3,0x0D, + + 0x8E,0x9B,0xC7,0x8D,0x22,0xB7,0x6A,0x8C,0x43,0x07,0xFD,0x54,0x5F,0xFC,0x4F,0x99, + + 0x3F,0x96,0xCF,0xD0,0x8C,0xB4,0x8B,0xD9,0xCC,0x99,0xF5,0x3D,0xF4,0xD4,0xD9,0x28, + + 0xAC,0xD4,0x32,0x1E,0xBC,0xF4,0x7E,0x6E,0xCF,0x56,0x42,0x9D,0x03,0x4D,0x16,0x58, + + 0x2A,0x99,0x8E,0x9A,0x27,0xFF,0x34,0x15,0xCC,0xD0,0xD3,0xE7,0xFF,0x90,0x43,0xA9, + + 0xEF,0xBE,0xE1,0x4B,0x90,0x34,0x8C,0x09,0x42,0xD3,0xE5,0xCF,0xF8,0x9D,0x57,0x8B, + + 0x2F,0x90,0x3B,0x0F,0x3D,0xF7,0x35,0x00,0x4C,0xD9,0x6F,0x8D,0xCC,0x0D,0xF8,0xA0, + + 0x58,0x90,0x4F,0x66,0x51,0x00,0x49,0xB4,0xE5,0xBF,0xA8,0x74,0x54,0x6F,0xA4,0x82, + + 0x4B,0x09,0xB0,0x44,0x10,0x2E,0x50,0x74,0x47,0x22,0x25,0xB6,0x3F,0xE0,0x61,0x56, + + 0x45,0x0F,0xF9,0x87,0xB2,0x57,0x2F,0x80,0x4D,0xB4,0x4E,0xCB,0xD6,0x08,0x8D,0xE1, + + 0x89,0x4C,0xE9,0xB5,0xD9,0x2E,0x07,0x76,0x03,0xE1,0xA3,0xD7,0x7D,0xE8,0x20,0x6F, + + 0x14,0x09,0xCA,0x40,0xB1,0xD3,0x68,0x64,0x0A,0x55,0xA8,0x43,0xF1,0xDF,0x70,0xE2, + + 0x29,0x75,0x58,0x2A,0x6F,0xDA,0xDE,0x50,0xE2,0x05,0xF8,0xF0,0x10,0x8F,0x33,0xE8, + + 0x80,0x63,0x3E,0x40,0xED,0xD9,0xEE,0x33,0xCC,0xCC,0xD7,0x98,0xC4,0xBD,0xFD,0x33, + + 0x61,0xA4,0x59,0xA8,0xF2,0x65,0x5F,0x58,0x08,0xA6,0x66,0x87,0x93,0x61,0x52,0x8C, + + 0x47,0x4A,0x88,0x04,0xBB,0x4D,0x5A,0x39,0x4E,0x2B,0x6D,0xCE,0xF4,0xE3,0x32,0x29, + + 0xA8,0x88,0xDA,0x11,0xB8,0xA3,0xB6,0xAA,0x75,0x43,0x65,0xDE,0xDB,0x6A,0x49,0x23, + + 0x75,0xAB,0xD9,0x10,0x3B,0x2C,0xCF,0x2B,0xCE,0xB7,0x15,0xCF,0x74,0xE1,0xD9,0xEA, + + 0x0D,0x86,0xF3,0xFF,0x1B,0x28,0x5B,0x07,0xE7,0xEB,0x0B,0x4F,0x7A,0x6D,0xC0,0x6F, + + 0xAB,0x85,0x0E,0x23,0x98,0x64,0xEF,0xEA,0x43,0x73,0xF2,0xF1,0xF9,0x2D,0xB1,0x7C, + + 0x89,0x29,0x80,0x41,0x3F,0xA0,0x56,0x83,0x4D,0x2E,0xDA,0x7C,0x5B,0x6D,0x48,0x29, + + 0x8E,0x0A,0x05,0x2F,0x65,0xA2,0x93,0xCC,0xD7,0x48,0xD3,0x6D,0xDA,0x6E,0x43,0xA9, + + 0xB1,0x00,0xB5,0x68,0x19,0x2B,0xD6,0x88,0xA7,0x1F,0xDB,0x7D,0xDB,0x6F,0xF9,0x70, + + 0xDB,0xB1,0xFD,0x66,0xB2,0xD3,0x0A,0x24,0x4E,0x3B,0x90,0x19,0x43,0xB6,0x32,0x31, + + 0x49,0xE8,0xF4,0x16,0x34,0x38,0x1A,0x11,0xE1,0x4C,0xDC,0xD6,0x8E,0xF8,0x51,0x05, + + 0x8E,0x7C,0x51,0xE7,0xF3,0xCC,0x6B,0xA6,0x1D,0x5D,0x4F,0xED,0x72,0x07,0x1F,0x6A, + + 0xA7,0x70,0xB7,0x77,0x1D,0x3C,0x8D,0x33,0xE0,0x31,0x17,0x55,0xE4,0x75,0x3A,0xC6, + + 0xC3,0x97,0xC1,0xE1,0x34,0xFE,0x1E,0x1E,0xC1,0xAF,0xD4,0xE4,0x72,0x74,0x34,0xAF, + + 0x00,0x48,0xAE,0xD0,0x30,0xB5,0x25,0x90,0x6B,0xA5,0xDC,0xF4,0x73,0x75,0x65,0x32, + + 0x2E,0xCB,0xC7,0xB6,0xDE,0x5A,0xAA,0x92,0xD2,0xDC,0xD5,0xE5,0xF2,0x76,0xDD,0xA3, + + 0x48,0x06,0xCB,0xE0,0x33,0x09,0x63,0xDD,0xA0,0x48,0xDD,0xF5,0xF3,0x77,0xEA,0xB7, + + 0x0A,0xCD,0xE6,0xC8,0x6F,0xB8,0x2E,0x78,0x93,0x57,0x23,0x28,0xD9,0xA7,0x19,0x70, + + 0x21,0x5B,0x0E,0x7E,0xBB,0x71,0xCA,0x07,0x2A,0x26,0x2B,0x2C,0xD8,0x80,0x90,0xB2, + + 0xDC,0x8F,0xFF,0xAA,0x19,0xB2,0x2F,0x79,0x57,0x18,0x28,0xD1,0x07,0x7C,0x0D,0xCC, + + 0x75,0x18,0x56,0x6D,0xB1,0x34,0x67,0x3B,0xCB,0x59,0xC7,0x10,0x7B,0x0E,0x38,0xE1, + + 0xC1,0x4D,0x06,0x90,0x3B,0x38,0x4E,0xEC,0x36,0xAC,0xD6,0xEC,0x7A,0x7C,0xC2,0xBA, + + 0x68,0xC2,0x40,0x24,0x87,0x86,0x46,0xE0,0x8A,0x82,0xDE,0xFC,0x7B,0x7D,0x39,0xE4, + + 0x28,0x56,0x7E,0x31,0x3A,0xC5,0x69,0xC0,0xA9,0x41,0xD7,0xED,0xFA,0x7E,0x37,0x5B, + + 0xA2,0x40,0x8F,0x30,0x01,0x7D,0x61,0xD4,0xA8,0x40,0xDF,0xFD,0xFB,0x7F,0x72,0x53, + + 0xEF,0xE4,0xE4,0xF6,0x4E,0xE2,0xE4,0xD2,0x87,0x11,0xB8,0x6E,0x14,0xEF,0x78,0x0C, + + 0x79,0x35,0x62,0x64,0xB6,0xA7,0x16,0xC1,0xC9,0x3C,0xDE,0x44,0xAA,0xA1,0xE1,0x13, + + 0x4C,0x76,0x75,0xBB,0x16,0xEA,0x4F,0x25,0x25,0x41,0x8B,0xD8,0xD2,0x68,0xBA,0x09, + + 0xFD,0x0E,0x21,0xDB,0x36,0xA5,0x41,0x22,0xEF,0xC7,0x75,0x57,0xD3,0x6A,0xD4,0xB2, + + 0x2C,0x8B,0xE8,0xB6,0xE9,0xAB,0xB0,0x17,0x1E,0xC7,0xF0,0x66,0x56,0xE4,0xDC,0xA2, + + 0x56,0x8A,0x90,0xD2,0x39,0x50,0xC7,0x20,0x49,0x4F,0xF8,0x76,0x57,0xE5,0xD5,0xB3, + + 0xEC,0x89,0xDB,0xC5,0x16,0x4E,0x49,0x67,0x8E,0x97,0xF1,0x67,0xD6,0xE6,0xDD,0xA3, + + 0xA2,0x88,0x32,0x35,0x91,0x87,0xFF,0xD3,0x66,0x87,0xF9,0x77,0xD7,0xE7,0x5C,0xAB, + + 0xE5,0xAB,0x2A,0xFB,0x7F,0xD9,0x9D,0x58,0xA7,0xEB,0x9D,0xD3,0x3B,0x33,0x7E,0x69, + + 0x2F,0x03,0x92,0xCE,0xD0,0x21,0x04,0x9B,0xC0,0x3F,0x67,0x3F,0x5B,0x8A,0x8F,0x98, + + 0xF1,0x80,0xDB,0x8D,0xBD,0x5B,0x6A,0xBF,0x69,0x35,0x33,0x2B,0xD3,0x02,0x2F,0xE4, + + 0x70,0x0B,0xAA,0xFD,0x3C,0x21,0x73,0x27,0xCB,0xA8,0xCF,0xC3,0x5E,0xA9,0xD6,0xBA, + + 0x0C,0x83,0x35,0x08,0x06,0x77,0x74,0x47,0x85,0x2D,0xF2,0x6E,0x5E,0xEC,0x0A,0x0A, + + 0xF4,0xEB,0x9F,0xDA,0x5C,0x47,0x42,0xAA,0xB8,0xC2,0xFA,0x7E,0x5F,0xED,0xBC,0xCF, + + 0xD0,0x73,0x56,0xB2,0x9C,0x15,0xCE,0xE9,0xC7,0xF1,0xF3,0x6F,0xDE,0xEE,0x90,0xAB, + + 0x8F,0x7E,0x54,0x3F,0xD9,0xAE,0x1B,0x3A,0x34,0xC2,0xFB,0x7F,0xDF,0xEF,0x87,0xBF, + + 0xFC,0x41,0xC4,0xC2,0x0F,0xBF,0x6E,0xBF,0xC7,0xD6,0xF0,0xC4,0x8B,0x79,0x0C,0xD8, + + 0xC4,0x3E,0xD4,0x14,0x30,0x6A,0x44,0xE2,0x29,0xDE,0x09,0x33,0xD4,0x2E,0x06,0xBA, + + 0xEC,0xB1,0xC5,0xC3,0xCB,0x3F,0x65,0x8D,0x45,0x58,0x39,0x47,0xD2,0xF4,0xFD,0x60, + + 0x8B,0x48,0xAF,0x75,0x37,0xFB,0x5D,0x13,0xAF,0x58,0x02,0xCB,0x0A,0xF5,0x5C,0x12, + + 0xDD,0x9B,0x6B,0x57,0x30,0xAD,0x6C,0xF7,0x11,0xB4,0xF4,0xE6,0x76,0xF4,0x66,0xD6, + + 0x84,0x93,0xDA,0xB4,0xB5,0xB1,0xEC,0x8D,0x06,0x95,0xFC,0xF6,0x77,0xF5,0x05,0x82, + + 0x1D,0x9B,0xE5,0xE3,0x34,0xB2,0x55,0xE6,0x99,0x29,0xF5,0xE7,0xF6,0xF6,0x61,0x2D, + + 0x06,0x1D,0x2C,0x35,0x35,0xB3,0x65,0xF6,0x1A,0xDC,0xFD,0xF7,0xF7,0xF7,0x08,0x77, + + 0xDA,0xE3,0x86,0xEC,0x7F,0x46,0x32,0x48,0xEE,0xDB,0x03,0x3F,0xDD,0x01,0x60,0xA4, + + 0x0F,0x29,0x96,0x4E,0x82,0xB6,0x5E,0x1A,0x3D,0x52,0x05,0x48,0x86,0x02,0x34,0x72, + + 0x53,0xD8,0xDF,0x0D,0xD2,0xD9,0xF3,0x5B,0xA0,0xD5,0xEF,0x8A,0xCF,0x3C,0x7D,0xE9, + + 0x46,0xB8,0x97,0xCF,0xB5,0xB4,0xBB,0x59,0x6F,0x93,0xBB,0x3B,0xB3,0x7E,0x19,0x28, + + 0xAC,0xB4,0x54,0xAC,0xBC,0xB8,0xF0,0x68,0x67,0xE3,0xF6,0xEE,0x7E,0xFC,0x16,0x2B, + + 0x43,0xCD,0x31,0xBC,0xBD,0xB9,0xC5,0x08,0x4E,0x3D,0xFE,0xFE,0x7F,0xFD,0x18,0xA9, + + 0xEF,0xDE,0x22,0x2D,0x3C,0xBA,0x4F,0xBB,0xEA,0xD1,0xF7,0xEF,0xFE,0xFE,0xAF,0xAE, + + 0xF7,0x9E,0xAC,0x3D,0x13,0x32,0x1F,0xBA,0x14,0xD2,0xFF,0xFF,0xFF,0xFF,0xA8,0xA4, + + 0xE1,0x06,0x19,0x66,0x53,0x2C,0xDD,0xCD,0x32,0xFB,0x77,0x46,0x91,0xEA,0xA2,0x83, + + 0xA2,0xDA,0x0C,0xFC,0xA3,0x6E,0xC3,0x7B,0x3E,0x0C,0xD2,0xD6,0x39,0x6C,0x2C,0x32, + + 0x23,0x04,0xAB,0x80,0x9E,0xA8,0xEE,0xA5,0x8B,0x97,0x16,0x45,0x80,0x6F,0xA0,0xEC, + + 0x7D,0x78,0x31,0x85,0xB0,0xF3,0xC4,0x89,0xBA,0xBC,0xC4,0x6C,0x7E,0xEE,0x20,0x0E, + + 0x90,0x46,0x88,0x75,0xB3,0xAC,0x74,0x94,0xC2,0xE9,0xB0,0x66,0x47,0x69,0xF0,0xAA, + + 0x13,0x48,0x17,0x01,0x68,0x32,0x44,0x98,0x05,0x0A,0x20,0x0F,0x43,0x2A,0x95,0x3F, + + 0xB1,0x4C,0xE1,0xA7,0xE5,0x22,0x0D,0x50,0xE5,0xE9,0xAE,0x1B,0xE1,0x7E,0x36,0x0E, + + 0x3E,0xFB,0x09,0x85,0xDC,0xDA,0x49,0x68,0xD3,0xE8,0xB9,0x77,0x84,0x6A,0xCB,0xF1, + + 0xF7,0x4A,0xC0,0x6C,0x1E,0xA9,0xD2,0xF9,0xBC,0x93,0x46,0xA5,0xF7,0x73,0xFD,0xFE, + + 0x8C,0xFB,0xFB,0xEC,0x6E,0x66,0x9D,0x4A,0xB2,0x0B,0x22,0xC3,0xD6,0x72,0x4D,0x37, + + 0x69,0x11,0x03,0xED,0xD2,0x31,0xBA,0xD4,0x1E,0x31,0x37,0x4B,0x2F,0x7A,0xE3,0x05, + + 0x0E,0x3B,0xAB,0x98,0xAA,0x3C,0x55,0x07,0xBE,0x97,0x57,0x5B,0x07,0x79,0xE9,0x26, + + 0xDF,0x4E,0xB8,0x5C,0x98,0x28,0x0E,0x1A,0xA1,0x07,0xB2,0x3A,0x2E,0x63,0x8E,0x06, + + 0x05,0x13,0x91,0x5C,0x64,0x35,0x7A,0x04,0xEA,0xB2,0xBA,0x2A,0x27,0x62,0x97,0x3E, + + 0x5F,0x62,0x3C,0xAF,0xE1,0xB4,0x0A,0x6A,0x2D,0x48,0xB3,0x6F,0x85,0x63,0x36,0xDB, + + 0x12,0xAB,0x10,0x5F,0x9D,0x25,0x9F,0xFC,0x88,0xBD,0xBB,0x7F,0xFA,0x62,0x80,0x66, + + 0x57,0x34,0xE4,0x86,0x3B,0x3D,0x07,0xB4,0x89,0xC1,0x95,0xDB,0xD7,0x6B,0x53,0xD8, + + 0x1E,0x91,0x73,0x10,0x51,0x1B,0x64,0x58,0x34,0x1E,0x24,0x4F,0xF3,0x4D,0xDA,0xD5, + + 0xD3,0x16,0xDC,0x83,0x17,0xBF,0x17,0x5E,0x21,0xD8,0x31,0xC3,0x03,0x62,0xCD,0xCC, + + 0xEB,0xC8,0xD4,0x92,0x50,0x7C,0x7D,0xB3,0xBC,0x5E,0x05,0xCF,0x52,0x16,0xFF,0x22, + + 0x8E,0xE9,0xA6,0xBE,0xDB,0x2D,0xF8,0x73,0x45,0x5C,0x9E,0xF9,0x12,0xD4,0x97,0x87, + + 0x5C,0xD9,0xAC,0xD7,0x33,0x38,0x7C,0xF5,0xAB,0x1E,0x23,0x1C,0x7B,0x3A,0x3D,0x45, + + 0xCF,0xDF,0xA7,0xD5,0xB3,0x66,0x53,0xF2,0xC9,0xC7,0x8C,0x79,0x55,0x3B,0x16,0xD3, + + 0xD8,0xB9,0xD5,0xD1,0xBB,0x7F,0x4E,0x82,0x93,0xF6,0xE7,0x1D,0xAF,0x38,0x22,0x75, + + 0x79,0x63,0x87,0x7C,0x39,0x77,0x3C,0x78,0x34,0xD8,0xA9,0x4E,0x4B,0x32,0x40,0xA6, + + 0x2F,0xB0,0xC4,0x81,0x18,0x99,0xE5,0xC8,0x61,0x50,0x4A,0x67,0x4A,0xE1,0x5D,0xFB, + + 0x53,0x58,0xE7,0x8F,0x6E,0x37,0x4E,0x1E,0x4F,0x17,0xF7,0xE3,0x00,0x38,0x7E,0x1D, + + 0xA6,0xAA,0xD2,0x8F,0xBF,0x58,0x5D,0xCA,0x99,0xDA,0xFF,0xF3,0x2B,0x39,0x9B,0xE4, + + 0x2C,0xE4,0xE6,0x3A,0xD3,0x95,0xC9,0x78,0x81,0xCD,0x69,0x1D,0xD9,0x8F,0xD8,0x20, + + 0xAB,0xA6,0x32,0xB6,0x53,0x30,0x07,0xE7,0x8C,0x1F,0x1E,0x38,0x94,0x7B,0x01,0x35, + + 0x7F,0xE5,0xBE,0xBF,0x81,0x2A,0x71,0x94,0x49,0xDA,0xE5,0x12,0x0E,0x71,0xB9,0x34, + + 0xFD,0x5D,0x8A,0x3A,0x52,0x16,0x47,0x28,0x69,0x23,0xD7,0x4A,0x98,0x5F,0x79,0xAD, + + 0xA3,0x9B,0xFA,0xCA,0xB3,0xA4,0xEF,0x53,0x7B,0x30,0x08,0xB8,0x57,0xD0,0x56,0xDB, + + 0x36,0xCD,0x7A,0xF0,0x95,0x01,0x8B,0xB0,0xC5,0x39,0x40,0x44,0x23,0xF3,0x54,0xE5, + + 0x94,0xCD,0xA2,0xEF,0x26,0x29,0x0B,0xD8,0xC2,0x68,0x0E,0x17,0xD6,0xF2,0xD1,0xE0, + + 0xD6,0xCF,0xF0,0xBD,0x7C,0xFA,0x01,0xE3,0x99,0x6C,0x41,0xDF,0xD2,0xAE,0xA0,0xE7, + + 0xF3,0x29,0x69,0xC4,0x9E,0xE4,0x0E,0x1F,0x66,0x86,0x90,0x30,0x74,0xEB,0x52,0xF7, + + 0xF0,0x9E,0xC8,0x2A,0xB6,0xC6,0x46,0x93,0xC8,0x63,0x98,0x20,0x97,0xEA,0x72,0x73, + + 0xC6,0x79,0x21,0x57,0x6E,0xA0,0xF6,0x70,0xE1,0x3F,0x91,0x65,0xFF,0xEB,0x62,0x35, + + 0x74,0x97,0x09,0x57,0x7E,0x8E,0xA1,0x33,0x9B,0x63,0x51,0x48,0x52,0x85,0xE4,0xE2, + + 0x8D,0xC7,0x5A,0x8C,0x9C,0x12,0x21,0xCA,0x04,0x63,0x49,0x26,0xF9,0x17,0x82,0x1F, + + 0x3E,0x89,0x86,0xF8,0xB8,0xA2,0x04,0x02,0xC2,0x4F,0x5D,0xB6,0xF8,0x3F,0x8B,0x8A, + + 0x09,0x6A,0x9B,0xDF,0xC0,0xB1,0x20,0x2A,0x4C,0x9A,0x1F,0xC7,0x85,0xA7,0xD3,0xF3, + + 0xED,0x00,0x2F,0xEF,0xDD,0xE4,0xB9,0x7B,0xC1,0x60,0xF3,0x2E,0x28,0xA4,0xDA,0xB1, + + 0x08,0xEF,0xC4,0x3F,0xBD,0x29,0x2E,0x17,0xCE,0x9C,0x32,0x3B,0xF8,0x61,0xC1,0xDF, + + 0x9C,0xB2,0xF7,0x0F,0x2E,0xA4,0xFF,0x3A,0x43,0x66,0x02,0x96,0xD2,0xA2,0xDD,0x15, + + 0x03,0xEC,0xC5,0xAD,0xAF,0x01,0x4D,0x16,0x41,0x48,0x8D,0x8F,0xED,0x6E,0x94,0xD9, + + 0x16,0x26,0x6E,0x98,0x76,0x96,0xE4,0x76,0x26,0xE4,0x9B,0x7D,0x98,0xE2,0x44,0x80, + + 0x7D,0x9D,0x84,0x6E,0x33,0x3D,0x30,0x59,0x85,0xB3,0x60,0x7D,0xF6,0xF4,0xE8,0x14, + + 0x63,0x97,0x54,0x14,0xB5,0x47,0x07,0xC2,0xE5,0xCE,0xF6,0xAB,0x9E,0x60,0xE1,0x06, + + 0xE7,0x61,0x5D,0x8F,0xD7,0xB9,0x4E,0xDD,0x6B,0x64,0x85,0xC5,0x0B,0x7E,0x0D,0xCB, + + 0x04,0x88,0x95,0x47,0xE9,0xBA,0x67,0xB1,0x77,0xDB,0xAF,0xA7,0x4A,0x7E,0xEB,0x53, + + 0xA4,0x90,0x9D,0xB4,0x0D,0xE0,0xEB,0x80,0x99,0x58,0x8C,0x64,0x77,0x83,0x12,0x33, + + 0x86,0xF6,0xA9,0x31,0xB5,0xB1,0x84,0x76,0x46,0xD5,0x9C,0x56,0x7B,0xFA,0xFD,0xA1, + + 0xE5,0x64,0x19,0xAD,0xDE,0xBB,0x3F,0xFE,0xD5,0xE8,0xCF,0x05,0x73,0xA3,0x8D,0x57, + + 0x0B,0x9A,0xE0,0xB5,0x40,0xB1,0x1D,0xF1,0x92,0xDA,0x9D,0xF5,0x8C,0xFA,0xD4,0x6C, + + 0xAE,0x9C,0xA0,0x67,0x33,0xFA,0x34,0x42,0x82,0x25,0x62,0x40,0xA1,0x85,0x64,0x27, + + 0x23,0xDF,0x94,0x78,0x2D,0x32,0x06,0x6A,0x31,0x78,0x00,0xE0,0xF0,0x9B,0xAC,0xE9, + + 0xA2,0xF8,0x73,0x8D,0x8F,0x22,0xCF,0x29,0x6C,0xD0,0x18,0x51,0xFA,0x99,0x3F,0x67, + + 0x38,0x60,0x87,0x79,0x3F,0xBF,0x07,0x8A,0x4C,0x74,0x14,0x3A,0x6E,0xC4,0x2C,0x57, + + 0xC5,0xD7,0xC6,0x86,0x9F,0x03,0x66,0x9D,0x0C,0xC7,0x22,0x68,0x62,0xFF,0x69,0xFD, + + 0x8E,0x17,0xD1,0xD6,0x98,0xBB,0x1C,0xE2,0x6C,0xAC,0x69,0x9C,0x9C,0x02,0x5F,0xED, + + 0x47,0xD8,0x5C,0x27,0xF7,0xF1,0xB5,0x8D,0x11,0xB0,0x72,0x2F,0x7C,0xFA,0xE8,0x28, + + 0xC6,0x84,0xCF,0x92,0x1E,0x60,0xC0,0xBC,0x25,0x76,0x9F,0xFD,0x8B,0xF2,0x9F,0xE0, + + 0x58,0x0D,0xCA,0x19,0x78,0x2D,0x49,0xA9,0xA9,0x31,0x80,0xA6,0xD0,0x8B,0x4C,0x04, + + 0xA0,0x6D,0x70,0x96,0x91,0x25,0xD8,0x55,0xBA,0x03,0xE0,0x56,0xDC,0xE7,0xC5,0x87, + + 0x8A,0x01,0x97,0x67,0xA3,0x83,0xE9,0xA5,0x8C,0x4E,0xA9,0xA7,0x45,0x38,0xCD,0x94, + + 0x07,0xE3,0xB1,0x97,0x58,0x74,0x90,0x84,0xC7,0x2A,0x18,0xF5,0xDD,0xE8,0x6E,0xBA, + + 0xA1,0x1F,0xC4,0xAC,0x9A,0xAF,0xD1,0x47,0xE3,0x4D,0xA8,0x99,0x74,0x26,0x11,0xC0, + + 0xA4,0x15,0xE8,0x68,0xB0,0x67,0x02,0x71,0xE0,0x04,0xDA,0xF6,0x56,0x87,0x81,0xA7, + + 0x92,0x49,0x45,0xA3,0x73,0x20,0xD3,0xE3,0x5B,0xCF,0x1D,0x0A,0xD4,0xAC,0xB1,0xD3, + + 0x4A,0x70,0xD0,0x55,0xB7,0xAA,0x39,0x73,0xB6,0x4A,0xE1,0x8A,0x5E,0x05,0x62,0x0A, + + 0x2E,0x05,0xFA,0x6E,0x95,0xAE,0xBC,0x0E,0x4E,0xC5,0x88,0xCE,0x2F,0x74,0x74,0x35, + + 0x8B,0x0D,0x75,0xFE,0x2A,0x5B,0xE5,0xD0,0x17,0x04,0xA0,0xC7,0x5F,0xC3,0x7D,0x25, + + 0x24,0x07,0x02,0xCD,0x94,0xA1,0xC7,0xC1,0x40,0x82,0x4C,0x42,0x64,0x43,0xD2,0x7B, + + 0xBA,0x19,0x33,0xAF,0x66,0x4B,0xE0,0x6B,0xE7,0x28,0x28,0xBF,0x59,0xE5,0x3A,0xB4, + + 0x9B,0xF7,0xA2,0x4F,0x1A,0x23,0x42,0x1F,0x63,0x0E,0xC2,0x0E,0xFB,0x6A,0x35,0xB5, + + 0xCD,0x4F,0x35,0xBE,0x1D,0xE4,0x9A,0x79,0x35,0xF6,0xA5,0x9E,0x5D,0xA4,0xC0,0xA1, + + 0xE2,0x43,0xA3,0x4E,0x8F,0xA5,0x87,0x56,0xBD,0x43,0xDF,0x16,0x7B,0xE4,0x05,0x67, + + 0xFC,0xE3,0x0A,0xD9,0xBE,0x88,0x2E,0x84,0xC9,0x94,0xD4,0x02,0x38,0x66,0x91,0x1F, + + 0x21,0x50,0x95,0x66,0x9C,0x9D,0xD4,0x71,0x99,0x12,0xCC,0x2C,0x8D,0xF7,0x15,0xF2, + + 0xD6,0x17,0x1D,0x76,0x9D,0x9C,0xC0,0x32,0xE1,0xCA,0xFC,0xB6,0x01,0x7C,0xAD,0x80, + + 0x22,0x16,0x90,0x67,0x1C,0x9F,0x5B,0x75,0xC2,0x22,0xB4,0xA1,0x1B,0x19,0x2D,0xE4, + + 0x00,0xAC,0x18,0x77,0x91,0x83,0x25,0xE3,0xEF,0x31,0xEF,0xA2,0xED,0x68,0x4C,0xD4, + + 0x41,0x2B,0xC7,0x02,0x82,0x32,0xAB,0x10,0x60,0xA5,0x3C,0xF9,0xF2,0xD5,0x8C,0x75, + + 0xFB,0x97,0xB4,0x92,0xC7,0x7B,0xE9,0x03,0xEF,0x58,0x03,0xBC,0x04,0x71,0x53,0xED, + + 0x49,0x47,0xCD,0x23,0xD1,0x16,0x2B,0xE7,0x03,0xD5,0x8A,0x3D,0x81,0x76,0x35,0x55, + + 0x8D,0xA3,0x78,0x13,0x43,0x31,0xA6,0x01,0xAE,0xA6,0x1D,0x35,0xE6,0x71,0xBD,0x7B, + + 0x18,0xA5,0x02,0xFF,0x0C,0x37,0x5C,0xAD,0x5B,0xCA,0xDA,0x5C,0x7C,0x37,0x8C,0x38, + + 0x21,0x79,0x71,0x18,0x7A,0x9F,0x47,0x8C,0xCE,0x14,0x2A,0x5E,0x4A,0x9B,0x79,0xA0, + + 0x8A,0x6A,0x47,0xD1,0x7E,0xB7,0xEF,0xCB,0xAB,0xA9,0xCD,0xA6,0x5B,0xF5,0x5F,0x84, + + 0xF9,0x1D,0xB5,0x75,0x25,0xF4,0x41,0x5B,0xE5,0xDE,0x27,0x42,0x7B,0xD7,0x1E,0xDC, + + 0xA8,0xB0,0xCA,0xD9,0x59,0xFC,0x28,0xEE,0x8B,0xDF,0xF2,0xF8,0x7C,0xFC,0x48,0xE0, + + 0xAB,0x13,0xB6,0x5E,0x32,0x9D,0xC5,0x18,0x2B,0xAD,0x1E,0xEC,0x40,0x7B,0xB2,0xAB, + + 0xEA,0x11,0xBF,0x4F,0xB3,0xFE,0x77,0x1A,0x66,0x53,0xE0,0x6F,0x72,0x3E,0x2F,0x86, + + 0x4A,0xB2,0x95,0xC0,0x18,0x39,0xA8,0x53,0x4E,0xA8,0xFB,0xE9,0xFD,0xFF,0xD8,0x25, + + 0xA5,0x9B,0xFA,0xF8,0xB3,0xE2,0x7A,0x60,0x19,0x48,0x88,0xA4,0xC5,0xB5,0x90,0xED, + + 0xEC,0xD0,0x9E,0x92,0x5E,0x9E,0x8F,0x4F,0x43,0x6B,0x38,0x44,0xF6,0x4A,0xE4,0xE5, + + 0xB7,0x90,0x2A,0x96,0x92,0x90,0x61,0xCC,0x3C,0x6B,0xC9,0x45,0x36,0x1D,0x85,0x8C, + + 0x84,0x01,0x69,0xAB,0x39,0xB8,0x05,0x41,0xE5,0x73,0x65,0x3C,0x34,0xF8,0xBF,0xA8, + + 0x39,0x94,0x48,0x79,0x94,0x8C,0xC5,0xE6,0x05,0x2E,0x8D,0xE4,0xDE,0xBC,0xDB,0x20, + + 0xEC,0x14,0x90,0xD4,0x14,0x41,0x58,0x27,0xE6,0xCE,0xED,0xF0,0x5F,0xA9,0x3E,0x47, + + 0x80,0x2C,0x5D,0x25,0xD7,0xE6,0xCE,0x83,0x81,0xC0,0x4E,0x85,0xD0,0xAE,0x57,0x6B, + + 0x0A,0x21,0xB3,0x47,0x34,0xA1,0x7F,0x83,0xCE,0xC8,0x7E,0xF5,0x57,0x3E,0x1C,0x27, + + 0xD2,0x80,0xE3,0x68,0xE3,0xAE,0xB4,0xD9,0x4F,0xBD,0xFE,0xC8,0xDE,0xF4,0xD5,0x69, + + 0x39,0xE7,0x4D,0xF6,0x35,0xE6,0x44,0xFA,0xF1,0x60,0xA9,0x5C,0xA2,0x66,0xA4,0xE3, + + 0x92,0xC7,0x8D,0x70,0x3D,0xC6,0x2D,0xD0,0x4C,0x0A,0x0A,0xCD,0x5E,0xEE,0xCC,0xDB, + + 0xC5,0x26,0xCB,0x1D,0xBF,0x06,0x0C,0x46,0x31,0x32,0x40,0x18,0x7C,0x32,0x7C,0x8A, + + 0x36,0x07,0xAA,0x58,0xBD,0xAA,0x52,0x73,0xCC,0xB9,0xCA,0xCE,0xB3,0x64,0xD2,0x1D, + + 0x01,0x22,0x5E,0x4E,0xBC,0xEF,0x5A,0x2F,0xEE,0xA1,0xA5,0xD5,0x59,0x67,0xF5,0x7A, + + 0xFE,0x91,0x6B,0xE3,0x7F,0xA1,0x33,0x09,0x31,0xC8,0x28,0x6D,0xA1,0x06,0xFA,0x1C, + + 0x4D,0x6F,0xF5,0x61,0xF4,0xB8,0x9C,0x3B,0xE3,0x42,0x35,0x00,0xFE,0x6F,0x04,0xF3, + + 0x85,0x3F,0xFD,0x95,0xD3,0xA0,0x6A,0x40,0x2C,0x54,0xC7,0x44,0x47,0xE2,0xB9,0xD4, + + 0x79,0x6A,0xF5,0x91,0xD2,0xAA,0x5C,0xB0,0x12,0xDC,0x5F,0x76,0x35,0x2C,0xB4,0xA4, + + 0x05,0x3D,0x5F,0x6F,0x30,0x7D,0x55,0xF0,0x4F,0xDD,0x0D,0x59,0x09,0x9E,0x37,0x6F, + + 0xA5,0xD1,0x88,0x61,0x30,0xA1,0xC2,0xE1,0xA6,0x23,0xC5,0xB5,0xA9,0xE8,0x75,0x20, + + 0x8A,0x39,0xE8,0xD6,0x95,0xF4,0x05,0x6F,0x11,0xD0,0x92,0xA1,0x70,0x74,0x84,0xED, + + 0xA5,0x91,0x37,0xC6,0x31,0xFF,0x23,0x72,0x14,0xA0,0x7B,0x56,0x7F,0x65,0x70,0x21, + + 0x23,0x16,0xE9,0x11,0xC9,0xB6,0xAA,0xB6,0xD9,0xE1,0x27,0x87,0xF2,0xB8,0xE6,0xB1, + + 0x66,0xF5,0x86,0x55,0xB6,0xD0,0xBD,0xAE,0xAD,0xD4,0xED,0xEA,0xEF,0xF1,0xEA,0xDF, + + 0x1F,0x08,0x0E,0x16,0xBE,0xBC,0x6F,0x2A,0xCB,0x95,0x73,0xC8,0x83,0xFE,0x10,0xB3, + + 0x8A,0x82,0x54,0xE8,0xB0,0x3F,0xBA,0x4A,0x25,0x96,0x59,0xFE,0x71,0x04,0x19,0xA3, + + 0x0B,0x8A,0x7D,0xED,0x8F,0x5E,0x9B,0x39,0xA4,0xD0,0x99,0x15,0x5D,0x96,0xE9,0xE8, + + 0x99,0xD4,0xAE,0x5F,0xB9,0x70,0x5F,0xB9,0x9A,0xD6,0xFD,0x5D,0x1C,0xFD,0xA2,0x1A, + + 0x22,0x9F,0xBC,0xCF,0x9D,0xBA,0x76,0x72,0xEE,0xAC,0xD6,0xAE,0x1D,0x03,0x43,0xAA, + + 0x8C,0x9B,0x91,0x3C,0xBD,0x95,0x26,0xFF,0x0C,0xF5,0x3E,0x8B,0x61,0xBC,0x5F,0x5A, + + 0x4F,0x98,0xEB,0xB1,0x1F,0x34,0x17,0xE9,0xA3,0xD3,0x8F,0xEB,0xCF,0xFE,0x4F,0x19, + + 0x0E,0x96,0xD0,0xBD,0xFE,0xFF,0x07,0x3D,0xF9,0x93,0xFF,0xFF,0x07,0x71,0xAD,0x7F, + + 0x9D,0x1B,0x53,0xF7,0x68,0x84,0x4B,0x6E,0x3B,0x3A,0x50,0xA1,0xB8,0x68,0xB5,0x21, + + 0xA0,0xA0,0x64,0x87,0x46,0x2B,0xE5,0xCD,0x43,0x9A,0xC1,0xC9,0x97,0x73,0x4E,0x85, + + 0xC0,0xBB,0xCE,0x29,0x79,0x73,0x07,0x43,0xA8,0x4F,0xC5,0xE2,0x39,0x21,0x31,0x21, + + 0x9E,0xAC,0x00,0x66,0xE5,0x82,0xAC,0xB5,0x9C,0xE1,0x23,0xB1,0xD7,0x58,0x66,0x99, + + 0x36,0xA9,0xB6,0x37,0x2A,0x2B,0x45,0x41,0xEF,0xF9,0xD6,0x4C,0x7A,0xD3,0x00,0xA1, + + 0x60,0x9A,0xDE,0x36,0xEC,0x88,0x62,0x83,0x33,0xF7,0xBE,0x84,0xB8,0x14,0xD0,0x86, + + 0x48,0xDC,0xDD,0x47,0x7B,0xF5,0x09,0x65,0xEB,0x86,0x88,0x67,0x77,0x0A,0x5F,0x6D, + + 0x68,0x43,0x9E,0xF0,0x64,0x49,0x99,0xF4,0xF4,0x4A,0x80,0x81,0x76,0xB8,0xA2,0x7A, + + 0x6A,0x54,0xBA,0xF3,0xF1,0x99,0xC9,0x63,0x37,0xC4,0x9A,0x39,0x6B,0xB3,0x3D,0x09, + + 0x6A,0x48,0x4E,0x15,0x18,0xE9,0xDA,0xC9,0x45,0xC4,0x4A,0x4F,0x29,0x07,0x7D,0x0E, + + 0x8E,0x8A,0x43,0x89,0xEC,0x68,0x48,0x62,0xB3,0xA3,0x21,0x8C,0xC8,0xAF,0x55,0xB4, + + 0x89,0xAF,0xAD,0xA8,0xB3,0x8F,0x65,0x11,0x20,0x5A,0xF9,0x34,0xD8,0xDB,0x18,0xF7, + + 0x60,0xBD,0xFC,0xE8,0xC4,0xF1,0xAD,0xAF,0x80,0xDD,0xD3,0x0A,0xA5,0x00,0xDC,0x28, + + 0x57,0x04,0x48,0xDE,0x8A,0x78,0x7D,0x4D,0xB2,0x46,0x39,0x82,0xD4,0x90,0x3D,0x4E, + + 0x2B,0xA1,0x03,0xC9,0xA1,0x26,0x5B,0x79,0x16,0xDF,0xE9,0xF2,0x25,0xE3,0x81,0x2A, + + 0xE7,0x80,0xF3,0xBD,0xF3,0x6D,0xE0,0x8A,0xB7,0xEB,0xBD,0xC1,0x32,0xDC,0x0F,0x6C, + + 0x9C,0xAB,0xD6,0x3D,0xDB,0xB3,0x2A,0x88,0x08,0x5D,0x6B,0xD7,0x40,0x1C,0x4C,0x6C, + + 0x9F,0x53,0x58,0x85,0x41,0x91,0x62,0xB6,0x80,0xD2,0xBE,0x45,0xD2,0xF1,0x5D,0x79, + + 0x6C,0xE9,0xBB,0x20,0xC2,0x9D,0x03,0xC3,0x80,0x27,0x72,0xE5,0xF4,0x5B,0x06,0x50, + + 0xD6,0xE4,0x1C,0x84,0xC5,0x9E,0x34,0x42,0x6D,0x11,0xA3,0x9D,0xF7,0x31,0x3C,0xC2, + + 0x62,0xB4,0xFF,0x5A,0x33,0xA7,0x32,0xDD,0x63,0x14,0x65,0x86,0x51,0xB6,0x5F,0xA9, + + 0x00,0x17,0x0C,0x51,0xA9,0x93,0x49,0x8F,0x36,0x5C,0xDE,0x16,0xFC,0xF3,0x56,0xC3, + + 0x75,0xBB,0xFF,0x2D,0x36,0xF9,0x49,0xE3,0x2A,0xDD,0xB5,0xAA,0xDF,0x7B,0x17,0x47, + + 0xDB,0x55,0x1C,0xA6,0x89,0x75,0x5C,0x75,0xED,0xF0,0x59,0xB5,0xF1,0x6C,0xD9,0x72, + + 0x94,0x21,0x15,0x6C,0x96,0x98,0xD6,0x9B,0x97,0x43,0xE9,0x28,0x7E,0xDD,0xCE,0xC5, + + 0x5B,0x62,0x9B,0x9D,0x8C,0x7B,0x20,0x61,0x00,0x83,0x9C,0x9F,0x98,0xD6,0xB6,0xE1, + + 0xD3,0xE5,0x90,0x8F,0x44,0x9A,0x58,0x2D,0xA8,0x7F,0x68,0x45,0xA3,0x38,0x5A,0x68, + + 0xE8,0x38,0x4F,0x79,0xB8,0x11,0x47,0xB0,0x00,0xA1,0xCB,0x4E,0xDF,0xC4,0x82,0xF3, + + 0xC3,0xFD,0x02,0xFF,0x39,0xCC,0x6E,0x1B,0x52,0xFE,0xF0,0x18,0x66,0x6C,0x14,0xD9, + + 0x88,0xAD,0x9D,0xAF,0x05,0x7F,0x9E,0x7D,0xE2,0x55,0xFE,0xED,0x9A,0x7B,0x3F,0x4D, + + 0xA4,0x45,0x6B,0xBE,0x9C,0x98,0x0D,0x6D,0xEC,0xD7,0x0D,0x47,0x7D,0xEC,0x71,0xE5, + + 0xC3,0x12,0x0F,0x34,0xB8,0x5F,0x5D,0xE7,0xC1,0xAB,0x72,0x98,0x58,0x7E,0x69,0xBA, + + 0x37,0xAA,0xF1,0xA2,0x12,0xC2,0x9C,0xCA,0xD8,0x06,0xE9,0x29,0xB1,0x66,0xA1,0x74, + + 0xEE,0xF2,0x90,0x27,0x27,0x5E,0x02,0xC1,0x6F,0x6E,0xFB,0x33,0x53,0x9A,0x99,0xE3, + + 0x9C,0x99,0x6D,0x65,0x63,0xC7,0x39,0x27,0xEC,0x95,0x31,0xE7,0x90,0xE1,0x28,0x75, + + 0x6E,0x10,0x97,0xA2,0xE3,0x7C,0xE9,0xC0,0xA3,0x6C,0xAC,0x08,0xE5,0xE7,0x78,0xEE, + + 0xE7,0x2B,0x20,0xA2,0x17,0x64,0x63,0xC2,0x40,0x86,0x30,0xE3,0xBE,0xEC,0x0F,0x92, + + 0x55,0x0E,0xF0,0xDA,0x37,0x37,0x2C,0x4F,0x8F,0x86,0x9E,0x86,0x56,0x25,0x72,0x30, + + 0xF6,0xEA,0x81,0x0D,0x22,0xAB,0xA9,0x23,0x82,0x62,0xA7,0x14,0xEA,0x88,0x8B,0x62, + + 0xF7,0xC5,0x25,0x24,0xE5,0x06,0x29,0x83,0x01,0x66,0x99,0x3D,0x63,0xEA,0x7B,0xE7, + + 0xA9,0x27,0x76,0x9D,0xBD,0x17,0x64,0xD9,0x2E,0x67,0x32,0xD3,0x00,0xAA,0xF9,0x09, + + 0x3C,0x21,0xD4,0xAA,0xF4,0x0A,0x2B,0xBE,0x43,0x1B,0xBE,0xA0,0xBC,0x46,0x74,0x03, + + 0x29,0x25,0xD8,0x7C,0xFA,0x5B,0xE7,0xD8,0xBC,0x67,0xBA,0x80,0x94,0xFB,0x0D,0x72, + + 0xC8,0xF0,0x78,0xEC,0xF7,0x06,0x01,0xD9,0x61,0xC4,0xAA,0xD7,0x5D,0xA6,0xA6,0x71, + + 0xAF,0x25,0x31,0xB1,0xF7,0xDF,0xE4,0xEE,0x40,0x79,0xAA,0xEA,0xB7,0x67,0x5C,0x6B, + + 0x7F,0xCF,0x2A,0x2E,0xBE,0x32,0xBE,0xE6,0x49,0x4F,0x6B,0x8E,0xDF,0xFB,0xF5,0xAB, + + 0xDE,0x05,0xB5,0xF6,0x69,0xEC,0x4B,0x98,0xA2,0x8C,0xE1,0x6E,0xD8,0x8C,0xAF,0xA2, + + 0x2E,0x0F,0x5F,0x3D,0x10,0x59,0xFB,0xE8,0xED,0x12,0xF3,0xE7,0x5D,0xF3,0x13,0xEB, + + 0xD4,0x89,0x9E,0x79,0xC3,0x0F,0x2A,0xC2,0x47,0xB0,0x92,0x7B,0x4C,0x5D,0xEC,0xCB, + + 0x44,0xD3,0xFA,0xBD,0x57,0xA4,0xF3,0x9B,0x8C,0xE0,0xB4,0xB2,0x7C,0x95,0xFA,0xDB, + + 0xD3,0xE7,0xDE,0xA8,0xD2,0xE7,0xF5,0x4E,0xDC,0x76,0xA0,0x60,0x3E,0xFB,0xE9,0xD6, + + 0xA4,0x53,0x79,0x50,0xB3,0x33,0xD1,0x20,0xC4,0xD9,0x83,0x9E,0x3D,0x5A,0x9B,0xB1, + + 0x5E,0xF7,0xF4,0x5E,0x6C,0xF6,0xA4,0x91,0x5E,0x96,0xB7,0x6A,0x01,0xA8,0xAC,0x57, + + 0x3F,0x9D,0xC0,0x96,0x77,0x61,0x04,0xD5,0x8E,0x96,0xA3,0x76,0x04,0x80,0x9E,0x47, + + 0xA8,0xFC,0x25,0xB7,0xB0,0xD4,0xB5,0x97,0x0F,0xF5,0x2A,0x2A,0xC9,0x65,0xEF,0xC0, + + 0xC9,0xB4,0xB9,0xC8,0x91,0x1A,0x05,0xCC,0xDF,0x95,0x3D,0xAA,0xBD,0x2C,0x7F,0x9D, + + 0xC9,0x83,0xB6,0xCE,0x4A,0xA3,0xAF,0xD9,0x54,0x7C,0xCE,0x9C,0x83,0x2D,0x74,0x72, + + 0xAD,0xD4,0x6E,0x1B,0xA7,0xA2,0x46,0x42,0x6D,0x78,0xBE,0x83,0x96,0x28,0x02,0x7D, + + 0x4D,0x35,0x85,0xF9,0x9D,0x0A,0x29,0x49,0x0C,0x0F,0xCF,0xDC,0xA7,0xA1,0x77,0x9F, + + 0x84,0x1F,0x70,0x09,0xAF,0x76,0x70,0x48,0x99,0x46,0x06,0x03,0x16,0x4A,0x40,0x62, + + 0x08,0x3C,0xBC,0x4A,0x38,0x75,0x2E,0xEA,0x87,0x3D,0xDB,0x13,0x13,0x67,0xFD,0x3A, + + 0x2B,0x3D,0xD0,0x7A,0x9C,0x48,0xE9,0x18,0xC3,0x70,0xA0,0xFB,0xF7,0x58,0xF6,0xDA, + + 0xDA,0x33,0xD9,0x6E,0x1D,0xDB,0xB7,0x6E,0xB8,0x73,0xDA,0x16,0x3F,0xBC,0x78,0x9A, + + 0xA3,0x3F,0xB5,0x5B,0x9C,0xBF,0x2F,0x19,0xE9,0xBD,0xA6,0xED,0x1A,0xF6,0x84,0x94, + + 0x80,0xC0,0x84,0x90,0x34,0x3B,0x30,0xAA,0x41,0x80,0xE0,0xA0,0x09,0xE9,0x09,0xE6, + + 0xE0,0x1A,0x75,0x90,0x4C,0x83,0xC2,0xA0,0x72,0x45,0xFE,0x08,0xB8,0xD0,0x3B,0xE9, + + 0xF7,0xCD,0xA1,0x63,0xF8,0x2F,0xF9,0xA9,0xF3,0xC6,0x3D,0xCD,0x3F,0x2F,0x43,0xF7, + + 0x03,0x07,0x19,0x67,0x7A,0x52,0x27,0xC1,0x66,0x58,0x59,0xB0,0x78,0x69,0x08,0x0C, + + 0xDE,0x47,0x43,0xAC,0xB5,0x66,0xC4,0x44,0xA3,0x5F,0x10,0x42,0xAD,0x7F,0x6B,0x6D, + + 0xF7,0x1C,0x78,0x13,0x15,0x67,0xF0,0x55,0x67,0xEE,0x18,0x80,0xCF,0x6F,0xE2,0xE0, + + 0x5A,0x05,0x01,0x90,0x94,0x64,0xEA,0x87,0xD2,0x09,0x29,0xE1,0x92,0x51,0xFE,0x38, + + 0x85,0x65,0xE6,0x15,0xCF,0x8A,0x4C,0x75,0xA8,0x16,0x99,0x9D,0x60,0x2A,0x89,0x6A, + + 0xF7,0x84,0xFC,0x34,0x2B,0xE7,0xB6,0x5E,0xB7,0x41,0x14,0x5F,0x20,0x27,0x8A,0x5E, + + 0x4F,0xF4,0x3B,0xE1,0xEB,0x52,0x85,0x58,0x5D,0x52,0xA4,0x10,0x31,0xF8,0x49,0x14, + + 0xA8,0x07,0x7B,0x05,0x3F,0xF1,0x53,0xC1,0x48,0x07,0x92,0x5E,0xAC,0x25,0x21,0x9C, + + 0xCA,0xEB,0xC1,0xF3,0x62,0x69,0x44,0x4F,0x44,0xCD,0xE5,0x05,0x38,0xC8,0x64,0x3A, + + 0xB1,0x13,0x89,0x8B,0xD8,0x0C,0x1B,0x80,0x41,0x01,0xD0,0x8A,0xFF,0xEA,0x8A,0x5D, + + 0xDF,0x16,0x72,0xEE,0x13,0x6D,0x46,0x1A,0xB4,0xC6,0x81,0x68,0xDE,0x9C,0xF4,0xED, + + 0x7E,0x2D,0x8B,0x59,0xA9,0xA4,0x0B,0xE5,0x48,0x72,0xD7,0x2D,0xCE,0xC5,0x33,0x27, + + 0x2C,0x1F,0x27,0x79,0x16,0x6E,0x12,0x85,0xCF,0x53,0x4B,0x0F,0xE8,0x70,0x3C,0x05, + + 0x2E,0x9A,0xBE,0x77,0x08,0x9D,0xCF,0xEA,0x1F,0x25,0xAC,0x5F,0x99,0x13,0xA4,0x08, + + 0xA4,0x03,0x84,0x90,0x99,0xDE,0x22,0x40,0x09,0x5C,0xFD,0x4B,0x80,0xF2,0xD2,0x04, + + 0x26,0x13,0x90,0xC2,0x7A,0x1B,0x4E,0xEF,0x9B,0x28,0x41,0x5F,0x09,0xF3,0x33,0x61, + + 0x82,0xD1,0xB3,0xAD,0xD9,0x3E,0x0B,0xD3,0x5E,0x11,0xBF,0x4B,0x92,0x7F,0xEF,0x45, + + 0xB1,0x2B,0x51,0x3B,0xC7,0x67,0x2D,0xC7,0xCE,0x31,0xD4,0xE4,0x72,0x74,0xF9,0x2D, + + 0x23,0xCE,0xF7,0x7C,0xC0,0x33,0x9C,0x52,0xE0,0x58,0xDC,0xF4,0x73,0x75,0xB8,0x38, + + 0xA0,0x8D,0x3E,0xBE,0x88,0x89,0x6C,0xA3,0x43,0x14,0xD5,0xE5,0xF2,0x76,0x35,0x55, + + 0xAB,0xE4,0x63,0x27,0xB7,0xB7,0x24,0xB6,0x1E,0x21,0xDD,0xF5,0xF3,0x77,0xEA,0xFB, + + 0x37,0xBE,0x79,0xFF,0x04,0x5B,0x99,0x39,0xD4,0x61,0x81,0x5F,0xFC,0xF3,0x2E,0x72, + + 0xC0,0x43,0x71,0xE2,0x5B,0x8C,0x45,0xAF,0x16,0x5B,0xE5,0xCF,0x10,0xD8,0xD4,0xFA, + + 0xD2,0x93,0x7C,0xF2,0xD8,0x27,0xA6,0xC1,0x93,0x51,0xB3,0x15,0x00,0x3E,0x15,0x9B, + + 0x3B,0x13,0x74,0xEE,0x8D,0x44,0xC4,0x16,0xEF,0x51,0x81,0x52,0xFF,0x83,0x78,0xE4, + + 0x42,0x11,0xF1,0x4E,0xF7,0xB3,0xAB,0x96,0xFC,0x03,0xD6,0xEC,0x7A,0x7C,0xB5,0x28, + + 0x29,0x5F,0x97,0xCC,0x3D,0xBD,0x3F,0x12,0x9F,0x6C,0xDE,0xFC,0x7B,0x7D,0xB8,0xBA, + + 0x92,0x7D,0x07,0x49,0x52,0xC1,0x68,0x62,0x51,0xC3,0xD7,0xED,0xFA,0x7E,0x8B,0x08, + + 0x98,0xC2,0x41,0x5F,0x76,0x30,0xE8,0xD5,0x0A,0xC0,0xDF,0xFD,0xFB,0x7F,0x30,0x60, + + 0x00,0xCC,0x2F,0xBE,0x27,0x9F,0xB4,0xE2,0x40,0x00,0x25,0xD5,0x68,0xFB,0xEA,0x9A, + + 0x26,0xA1,0x10,0xE5,0x50,0xDA,0xC2,0xDA,0xDD,0x0C,0x14,0xB2,0x5B,0x7C,0x31,0xEB, + + 0x40,0x4F,0x19,0xF4,0xDD,0xB2,0xA1,0x51,0xF7,0x79,0x56,0x51,0x59,0x80,0xEB,0xFB, + + 0x41,0x4E,0x90,0xFB,0x6D,0x18,0xC6,0x74,0xF6,0x27,0xF1,0x86,0xD3,0x81,0xDF,0xA4, + + 0x22,0x9F,0x3F,0xC6,0x61,0xD1,0xCF,0x28,0x56,0xC0,0x08,0x42,0x56,0xE4,0x69,0x34, + + 0xEC,0xD4,0xA8,0xAA,0xAB,0xE7,0xAC,0x2C,0xD4,0xFA,0xF8,0x76,0x57,0xE5,0x1C,0x25, + + 0x6D,0xB7,0x21,0x83,0x84,0x5D,0x77,0x24,0xE8,0x1A,0xF1,0x67,0xD6,0xE6,0x7F,0x31, + + 0x78,0x2A,0xB6,0xA7,0xA4,0x31,0x07,0x5F,0x13,0xF6,0xF9,0x77,0xD7,0xE7,0x63,0x5E, + + 0x2F,0xCB,0xE2,0xF6,0xA0,0x53,0xD0,0xEA,0x54,0x35,0x79,0xDE,0x54,0xE7,0xEE,0x9F, + + 0x4E,0x7A,0xA1,0xDF,0xF4,0x00,0x32,0x9A,0x5F,0x7A,0xC2,0x0C,0x95,0xE6,0x43,0x09, + + 0xD5,0x87,0x9A,0xF3,0x64,0xE8,0x9F,0xB9,0xDC,0xC2,0x8D,0x06,0x14,0x43,0xEF,0x9D, + + 0xCB,0xEE,0xB9,0xE1,0x76,0xFA,0x62,0x34,0x29,0x40,0x6F,0xCC,0xBF,0x4A,0x77,0xEF, + + 0xF9,0x71,0x58,0x09,0xDC,0xAE,0xB2,0xEE,0xEC,0x8E,0xF2,0x6E,0x5E,0xEC,0xB9,0xA4, + + 0xF2,0x96,0x44,0xAC,0x2C,0x60,0x78,0xCE,0x4C,0xCE,0xFA,0x7E,0x5F,0xED,0x71,0x4C, + + 0x71,0x03,0xAB,0xC2,0xDA,0xA8,0xB3,0xD5,0x43,0x8C,0xF3,0x6F,0xDE,0xEE,0xED,0x05, + + 0x02,0xED,0x2B,0xDB,0xCE,0x52,0x1B,0x2C,0x6C,0xC2,0xFB,0x7F,0xDF,0xEF,0x22,0xF0, + + 0xDB,0xD2,0x7D,0x86,0x4F,0xBC,0x4B,0xD0,0x57,0xE4,0xF2,0xA4,0x76,0xEB,0x74,0x83, + + 0x16,0xD5,0xC2,0xE5,0x0D,0xF3,0x04,0x4D,0x56,0x95,0x78,0xCC,0x74,0x11,0xEF,0xD7, + + 0x4D,0x19,0xFE,0x25,0xB2,0xC1,0xCF,0x21,0x71,0x88,0x52,0xD1,0x7B,0xB0,0xAF,0x91, + + 0xE5,0x1E,0x69,0xCC,0x40,0xBC,0x87,0x74,0x3B,0xDB,0x7D,0x32,0xA2,0xFE,0xA4,0x46, + + 0xB4,0x39,0x24,0xD6,0xCE,0xB2,0x0B,0x25,0x60,0x54,0xF4,0xE6,0x76,0xF4,0x56,0x63, + + 0x1F,0x0A,0xC2,0xD6,0x37,0xB5,0x3F,0xF6,0xE8,0x94,0xFC,0xF6,0x77,0xF5,0xF4,0xF3, + + 0xA2,0x29,0x4B,0x35,0xB0,0x36,0xA7,0xA3,0xAE,0xD7,0xF5,0xE7,0xF6,0xF6,0xB2,0x53, + + 0xD0,0xE2,0xED,0xA5,0x84,0x21,0xBD,0x77,0x11,0xCA,0xFD,0xF7,0xF7,0xF7,0x7F,0x8C, + + 0xCB,0xDA,0x12,0xF1,0x9F,0x15,0xB3,0xD8,0x8B,0x27,0xBC,0xAA,0xDF,0x58,0x10,0x6A, + + 0x4D,0xD9,0x73,0xA7,0x56,0x31,0xBA,0x52,0xF5,0x19,0x0F,0x43,0x8F,0x4C,0xE3,0xCE, + + 0xAD,0xD8,0x36,0x74,0xCF,0xBA,0xF7,0x7F,0xA9,0xDE,0xA2,0x8C,0xF1,0x21,0xEF,0x1E, + + 0x99,0x10,0x7B,0x62,0x3C,0x60,0x66,0xB1,0x08,0xD2,0xA3,0x47,0xFD,0xB9,0xA6,0x0A, + + 0x3B,0x61,0x1C,0x4C,0xF3,0xB3,0x5E,0x88,0x5D,0x93,0xF6,0xEE,0x7E,0xFC,0x37,0xA4, + + 0x8A,0x1B,0xE5,0x19,0x39,0x3D,0x46,0x10,0xE2,0x20,0xFE,0xFE,0x7F,0xFD,0xEC,0x2B, + + 0xB2,0xF2,0xBE,0x29,0xB8,0xFC,0xB7,0x6F,0x48,0xD0,0xF7,0xEF,0xFE,0xFE,0x6B,0x9B, + + 0xB3,0xD1,0x3D,0x9F,0xA7,0xFD,0xBF,0x7F,0x36,0xD5,0xFF,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x38,0xAF,0x7F,0x76,0x72,0xDF,0x76,0x90,0xA9,0x4F,0x50,0x64,0xB9,0xB1,0x58,0x11, + + 0x6A,0x22,0x77,0x6A,0x3F,0xD5,0x42,0x40,0x29,0xA0,0xE0,0x47,0x3D,0x6A,0x12,0xF2, + + 0xF8,0xA9,0x7A,0x7A,0xF8,0x2F,0x77,0x84,0xC1,0x92,0xE9,0x02,0x39,0x93,0xFC,0xE0, + + 0xA7,0x01,0x29,0xE6,0x1D,0x61,0x67,0x37,0x20,0xC0,0x1D,0x26,0xE1,0x52,0x80,0x05, + + 0xA3,0xDB,0x77,0x6D,0x65,0x24,0xFC,0x1F,0x88,0x3D,0x89,0x3C,0x54,0x06,0x7B,0xD0, + + 0xA2,0x9A,0xC8,0xAF,0x60,0x25,0x42,0x72,0xD1,0x4F,0x98,0xB3,0x60,0x73,0xF5,0x23, + + 0x7D,0x00,0xFF,0x34,0x2D,0x7D,0x0B,0x63,0x71,0x9B,0x84,0x41,0xF2,0x77,0xFD,0x33, + + 0x78,0x6B,0x09,0x54,0x3D,0xDA,0xDC,0xF5,0x81,0x45,0x63,0xE7,0xA3,0x75,0x3C,0xC0, + + 0x60,0x71,0x02,0x8F,0x1E,0x6A,0xA1,0xDB,0xC4,0xC3,0x94,0x04,0xD8,0x24,0x74,0xBD, + + 0x8B,0x0D,0xC8,0x18,0x9E,0x9B,0xBA,0xD7,0xFD,0x46,0xBC,0x99,0x2D,0xCD,0x7D,0xB9, + + 0x69,0x69,0x3F,0x4D,0xD0,0x29,0x17,0xCB,0xCE,0x08,0x95,0x18,0xF0,0x32,0x51,0x7B, + + 0xE2,0xA8,0x4B,0x8D,0x81,0x8A,0xF7,0xAA,0xB1,0x16,0xC9,0x00,0x30,0x51,0xFD,0xD3, + + 0xF5,0xD1,0xD4,0x2E,0xE5,0xF1,0x40,0xEC,0x4C,0x0E,0x68,0x1C,0xDA,0xEA,0x58,0xA6, + + 0xF0,0x80,0x8A,0xA3,0xEE,0xAE,0x0A,0xE8,0x67,0xB8,0x4A,0x3B,0x7F,0x76,0x20,0xB7, + + 0x63,0x27,0x17,0xB3,0x67,0xAF,0xDF,0xED,0xC4,0x70,0xF7,0x2D,0xDE,0x00,0x19,0xA6, + + 0x78,0x4D,0x3E,0xA3,0xE0,0x2D,0x8D,0x85,0xCB,0xF3,0x97,0x1B,0xF8,0x64,0xB1,0x7D, + + 0x22,0xCB,0x28,0x01,0x5B,0x9B,0x75,0xE0,0x64,0x1E,0x03,0x5C,0x70,0xCB,0xA0,0xE3, + + 0x47,0x97,0xF2,0xA1,0xD8,0xD0,0xE1,0x9E,0xC2,0xFC,0x23,0x85,0x62,0x8E,0x36,0x05, + + 0xFD,0xB0,0x85,0x76,0xD7,0xBF,0x57,0x25,0xE6,0x16,0x93,0x21,0xF8,0x15,0x89,0xE2, + + 0xCB,0x9A,0x21,0x06,0x98,0x39,0xCF,0x81,0xE9,0xAC,0xA6,0x09,0x06,0xFE,0xC8,0xA2, + + 0xD5,0x71,0x0B,0xB7,0x1B,0xB6,0xC3,0x73,0x05,0xF9,0x56,0xD6,0x12,0x81,0x99,0xB2, + + 0xD0,0x70,0x2B,0x14,0x37,0x95,0x18,0x83,0x1F,0xF4,0x75,0x07,0xFF,0xFE,0x7D,0x3E, + + 0xA4,0x54,0x3A,0xB6,0x93,0x5A,0xC6,0x72,0x89,0x5E,0xAB,0xE3,0x13,0xF5,0x75,0x2A, + + 0x2E,0xE1,0xD5,0xF1,0x80,0x1D,0x87,0x0E,0x0A,0x86,0x22,0x17,0x5F,0x78,0x26,0x1A, + + 0xA8,0x12,0x08,0xFF,0x54,0xB8,0x2C,0x19,0x02,0x87,0xE9,0x2E,0xE9,0xFD,0x50,0x2C, + + 0x56,0x6C,0x22,0x0F,0x10,0x33,0xDE,0xB9,0xC7,0x37,0x5E,0xAC,0x1F,0x73,0x85,0x78, + + 0xC2,0x1A,0xF9,0xA5,0x51,0x2B,0x20,0x61,0x9B,0x5A,0x57,0x29,0x71,0x16,0x13,0xEB, + + 0x52,0xE0,0x59,0x19,0xBF,0x48,0xA2,0x26,0x1C,0xD2,0xDF,0x55,0xBA,0x36,0x38,0xE5, + + 0xDB,0xCA,0x7E,0x2C,0x6C,0x52,0x00,0x19,0xE7,0x3E,0x69,0x68,0x7C,0xB5,0x0E,0xE8, + + 0x2D,0x5F,0x03,0xAF,0x2C,0x7F,0x20,0x0C,0x6D,0x26,0xA1,0x14,0x6E,0x30,0x39,0xE5, + + 0xAC,0x9C,0x9E,0x7E,0x1F,0x98,0x29,0x18,0x17,0x3C,0xEF,0x17,0x56,0x73,0x8F,0x9C, + + 0xAD,0x9D,0x0B,0xBE,0xB8,0x1D,0x5F,0x8A,0x87,0x56,0x26,0xF5,0x5E,0x00,0x20,0xF1, + + 0x62,0xE5,0x70,0xED,0xFD,0x83,0x56,0x1A,0x45,0x90,0xE8,0xAE,0xBD,0x7A,0x38,0x16, + + 0x0C,0x7E,0xF8,0xE5,0x3F,0x95,0x58,0x78,0xA8,0x6C,0x00,0xD6,0x09,0xFA,0x19,0xF0, + + 0xEA,0x83,0xF7,0xE5,0x5C,0xA1,0x90,0x1B,0x58,0x73,0xE9,0xB7,0xE7,0xAE,0x13,0xE0, + + 0x92,0x2C,0x79,0x06,0xF9,0x83,0xAF,0xD1,0x39,0xD9,0xF3,0x51,0xF6,0xB3,0xE0,0xCE, + + 0x00,0xE6,0xBB,0x7D,0x10,0xAE,0xCD,0x39,0x97,0x99,0xE0,0xF3,0x2F,0x69,0x16,0x6F, + + 0x6C,0x64,0x78,0x25,0x4C,0xAC,0xB8,0xF7,0xA8,0xC6,0xB5,0xB6,0x3E,0x6E,0x47,0x31, + + 0x6D,0x57,0x9E,0x54,0xAE,0x47,0x5A,0xE7,0xCE,0xA1,0x0E,0x18,0x5B,0x40,0x6D,0x20, + + 0xAE,0x05,0x69,0xC6,0xCC,0x0A,0x3C,0xF3,0x7A,0x66,0x5C,0x4A,0x64,0xAA,0xEF,0xF7, + + 0x0E,0x53,0xBF,0x49,0xF5,0xD2,0xE9,0x2A,0xBC,0x6B,0x1A,0xA7,0xD9,0x6A,0x14,0x7B, + + 0x65,0x84,0xD3,0x6F,0x0A,0xBF,0xCE,0x55,0x4B,0xAB,0x9A,0x16,0x7D,0x4A,0xD6,0x8F, + + 0xD0,0x6A,0xC5,0x62,0xFF,0xAE,0x04,0x9F,0xCA,0xEA,0x1B,0xB6,0x59,0x49,0xD6,0xE2, + + 0x8F,0x10,0xE3,0x16,0x74,0xD2,0x6B,0x55,0xAC,0xCF,0xEB,0x01,0xA9,0x1E,0x9D,0x39, + + 0x62,0xE0,0xFC,0xDE,0xE1,0x01,0x4A,0x95,0xFB,0xAF,0xEA,0xA3,0x3D,0x96,0x99,0xDE, + + 0x4D,0x8F,0x6A,0x4F,0x48,0x00,0x5A,0x6A,0x07,0x2C,0xA8,0x51,0xB4,0x89,0x84,0x0B, + + 0x8A,0xA6,0x28,0x08,0x40,0xA4,0x88,0xEF,0xC0,0x21,0x64,0x9C,0x5A,0x63,0x79,0x47, + + 0x89,0xCD,0x24,0x3F,0x9B,0x0D,0x77,0x42,0x40,0x62,0xC3,0x81,0xB4,0xE0,0x3E,0x7E, + + 0xD0,0xD2,0x64,0x03,0xAF,0x1D,0x14,0x48,0xD1,0x59,0xEC,0xAB,0xF6,0xEC,0xBA,0xE1, + + 0x49,0xFD,0x6C,0x06,0x31,0x17,0xD4,0x3B,0x2D,0xC0,0xBC,0xB6,0x75,0xF1,0x6B,0xBD, + + 0x45,0x3D,0xB4,0x03,0xB2,0x01,0x15,0x29,0xE5,0x92,0x87,0x23,0xB4,0x5E,0x4B,0xF2, + + 0xA4,0xD3,0x3A,0xE9,0x7F,0x62,0x39,0x42,0x59,0xD0,0x2D,0x35,0x64,0x76,0xE4,0x59, + + 0xCD,0x25,0x84,0x8D,0x13,0xF6,0x71,0x73,0x0A,0x21,0x18,0x9D,0xE8,0x69,0xC0,0xA1, + + 0x1B,0xE3,0xDB,0x52,0x39,0x56,0x5C,0x15,0x61,0xAE,0x3A,0xF4,0x53,0x28,0xDE,0x59, + + 0x4D,0x07,0x25,0x51,0x34,0xEA,0xE3,0x67,0x91,0x7F,0x14,0xA7,0xB6,0xB8,0x53,0xFF, + + 0x31,0x9D,0x8D,0x99,0x65,0xB3,0x7D,0x80,0x8B,0xBB,0x87,0x97,0xA1,0x7C,0x32,0x2B, + + 0xCD,0x37,0xEE,0x12,0x3A,0xFA,0x87,0x0B,0xD4,0x9B,0x76,0xBE,0xB5,0xF8,0x48,0xEB, + + 0x2E,0xD2,0x11,0x7C,0x56,0xB6,0xFE,0xDD,0x6E,0xAB,0xC6,0xBA,0x94,0xD0,0x36,0xF8, + + 0x9C,0xF6,0x72,0xF1,0x1F,0xDF,0xF7,0xAF,0x89,0x98,0xB7,0xAF,0xFC,0x51,0xEF,0x1F, + + 0x29,0xF5,0x2F,0xEC,0x8D,0xF9,0x01,0xCA,0x8D,0x24,0x8D,0x8F,0xA9,0xB9,0x6B,0x8D, + + 0xC7,0x2D,0x61,0x4C,0xAB,0xAA,0x10,0x8B,0x6D,0xEC,0x15,0xD2,0x95,0xB8,0x66,0x9A, + + 0x29,0xDF,0xC3,0xCD,0x39,0xDF,0x60,0xEB,0x03,0xD9,0x5A,0x8C,0xDC,0x76,0x82,0xB8, + + 0xDE,0xC8,0x27,0x4B,0x78,0xB8,0xC0,0xDE,0xE8,0x05,0xCD,0x5F,0x6B,0x51,0xBA,0x5F, + + 0xA1,0xA1,0x39,0x5D,0x26,0x16,0x07,0x3D,0x85,0x9E,0x89,0xC3,0x14,0xBB,0x3A,0xB0, + + 0x99,0xAF,0x97,0xF7,0x68,0xAD,0xE8,0x53,0x78,0x2C,0x05,0xA0,0x12,0x50,0x16,0x2C, + + 0xB2,0x8C,0xB6,0x2D,0x79,0x50,0x88,0x42,0xAA,0x10,0x49,0xCE,0xB8,0x10,0xA5,0x73, + + 0x23,0x89,0xE7,0x3D,0x7B,0xB3,0x77,0x40,0xC1,0x62,0x04,0xDE,0x39,0x6D,0xF1,0x0C, + + 0x01,0xA5,0xF7,0x38,0x78,0xB2,0x67,0x1C,0xAA,0x92,0xBF,0x44,0x72,0xE6,0x7A,0xB3, + + 0x3A,0xA9,0x3B,0xC0,0x57,0x19,0x2E,0xCC,0xEE,0x49,0xA8,0x43,0xAF,0x6B,0x00,0x9C, + + 0x30,0xC8,0x73,0x0E,0x15,0x47,0x7B,0x8F,0xB6,0xC6,0x23,0x53,0xF2,0x9A,0x54,0x06, + + 0x48,0x57,0xEE,0x3A,0x4B,0xBA,0x2F,0xCC,0xC4,0x24,0x11,0xE1,0x84,0x6B,0x89,0xD5, + + 0xCC,0x1A,0x50,0x95,0x83,0x65,0xAC,0x8F,0x2A,0xEE,0x35,0xE7,0xD3,0xBA,0x92,0x7A, + + 0xE3,0x93,0xD4,0x20,0xF3,0x79,0x21,0xD9,0x34,0x4A,0xB4,0xCE,0x11,0xC7,0x9B,0xF0, + + 0x97,0xC6,0x9F,0x98,0x17,0x95,0xAD,0x11,0x4F,0xD2,0x31,0x52,0x8C,0x12,0x5A,0x87, + + 0x6F,0x46,0x84,0x0F,0x12,0x87,0x4C,0xA9,0xBB,0x3F,0x19,0x72,0x65,0x96,0x52,0x77, + + 0x2E,0x1B,0xB3,0xE7,0x35,0x26,0x8E,0x02,0xF1,0xBE,0xDB,0xD1,0x65,0x29,0x6A,0x2A, + + 0xB3,0x00,0x02,0xD0,0xBB,0xB3,0xAF,0x84,0x4A,0xF7,0xC8,0x6E,0x98,0x68,0xF7,0x1A, + + 0xAA,0xA0,0x8D,0x74,0xF2,0x1E,0x12,0x83,0xC9,0x51,0x93,0x8C,0xDB,0x72,0x7B,0x27, + + 0x0B,0x03,0x77,0x2F,0x61,0x2D,0x13,0x91,0x3E,0x0C,0xDB,0xF9,0x27,0xC8,0x1F,0x68, + + 0x2A,0xF0,0x27,0xCF,0x9F,0x27,0xE5,0x1B,0x30,0xBA,0x60,0x0D,0x5B,0x79,0xD3,0x9E, + + 0x02,0xE4,0x14,0xC3,0xC9,0x96,0x2A,0x9D,0x1C,0xFF,0x94,0xB7,0x44,0xB8,0x74,0xA2, + + 0x49,0x1C,0xEA,0xB8,0xDA,0xA0,0x62,0xB7,0xC0,0x8E,0x2B,0x89,0x85,0xA0,0x51,0xF2, + + 0xC9,0xA6,0x10,0x76,0xC8,0xAF,0xB5,0xD2,0x94,0x81,0x20,0x9C,0x44,0xE3,0xF2,0xE2, + + 0x02,0x70,0x61,0xE6,0xC9,0x95,0xA9,0xD3,0x1E,0xF7,0x5D,0xED,0xFA,0xDE,0x39,0x02, + + 0x83,0x0B,0x97,0x3E,0x34,0x76,0x01,0x93,0x58,0x38,0x0F,0xDA,0x76,0x7E,0x9F,0x2E, + + 0x9A,0xA6,0x6C,0xB6,0x84,0x50,0x60,0x52,0x65,0x17,0x8B,0xCF,0x1A,0xEE,0xF8,0xFC, + + 0x5D,0x4B,0x06,0x87,0x3E,0x3A,0x33,0x90,0xE3,0x16,0xAA,0xDB,0x80,0x83,0x32,0xBB, + + 0xD1,0x88,0xF5,0x3A,0xD8,0x38,0x9E,0x93,0x14,0x32,0xDD,0x71,0xF7,0x25,0xFD,0xF7, + + 0x48,0x1A,0x1B,0x7C,0xB8,0x27,0x81,0xAE,0xA0,0x89,0x07,0x5D,0xDB,0x38,0xFB,0x6B, + + 0x0F,0x92,0x0E,0x5A,0x1F,0x3A,0x21,0x3C,0x21,0xA9,0x89,0x4F,0x01,0xA4,0x79,0x2C, + + 0x5D,0x99,0x99,0xB5,0x2A,0x32,0xB3,0x58,0x4B,0x1A,0xA5,0x93,0x5B,0xDB,0x27,0xA4, + + 0x42,0x5F,0x5F,0x0D,0x99,0x0A,0x27,0x57,0x45,0x56,0xC9,0x85,0x12,0xEA,0x1F,0xBE, + + 0x2C,0x9C,0x46,0xBF,0x00,0xB9,0x6E,0x07,0xFF,0x81,0x75,0x54,0xA6,0xCF,0x1A,0x2B, + + 0x01,0x90,0xF0,0x3E,0x59,0x88,0x66,0x13,0xD8,0x88,0x65,0x4C,0xC5,0x22,0x32,0xBA, + + 0x96,0xBF,0xD5,0x4D,0x51,0x7A,0xFE,0x87,0xC4,0xF8,0x17,0x68,0x2A,0x01,0x19,0x79, + + 0x40,0x1C,0xB1,0xDA,0x1A,0xE0,0x01,0xC6,0x8C,0x82,0x70,0x92,0x26,0xA0,0xD8,0xEA, + + 0xD2,0x4F,0xDF,0x7C,0x99,0xC2,0xA7,0x1C,0x30,0x82,0xBB,0xE7,0x3F,0x71,0xF2,0xB6, + + 0x21,0x2C,0x04,0x65,0x29,0x57,0x06,0x43,0x25,0x1E,0xE6,0x0A,0xE9,0x4A,0x89,0x3B, + + 0xB7,0x34,0x5A,0x7C,0x9A,0x5D,0x6A,0x62,0x25,0x7D,0x04,0xD6,0xAC,0xE0,0x37,0x23, + + 0x72,0x22,0x97,0x3B,0x43,0xA9,0xC6,0x48,0x48,0x35,0x2E,0xB7,0x1D,0x92,0x5E,0xE2, + + 0x28,0x5B,0xF4,0x35,0x7F,0x25,0x21,0xE6,0x0D,0xC1,0xB8,0x6A,0xAB,0x45,0xD3,0xE2, + + 0xBB,0x5A,0x44,0xC9,0x14,0x67,0x70,0xE2,0xAE,0xD6,0xAE,0xCE,0xBC,0x76,0xDE,0x73, + + 0x84,0x79,0x1A,0xB8,0x7F,0x95,0xCE,0xA4,0x04,0x66,0xA6,0x94,0xAC,0x3B,0x57,0x7E, + + 0x38,0xDC,0xB3,0x27,0xFF,0xB4,0x1B,0x63,0xC6,0xB7,0xFF,0xDE,0x5E,0xCB,0x1A,0x15, + + 0xAF,0x0D,0x22,0xC8,0x3A,0x23,0x7A,0x5B,0xB5,0x49,0xA7,0x5D,0x64,0xE1,0x52,0xAA, + + 0xAE,0x56,0x6E,0x7A,0xBC,0x2E,0xC1,0x45,0x25,0xC4,0x3A,0xC5,0xBC,0x4A,0x31,0x0B, + + 0x73,0x27,0x1E,0x3E,0xA4,0xE8,0xB3,0xD4,0x2D,0xA9,0xE4,0x5C,0xA0,0x6B,0xF6,0x1A, + + 0x89,0xAB,0x2F,0x1A,0x39,0xE8,0xC4,0x45,0xE3,0x14,0x28,0xC5,0xB6,0x43,0x62,0xB3, + + 0xBF,0x17,0x9C,0x48,0xFF,0x2F,0x4C,0x0B,0x2E,0xB3,0x32,0xEB,0x6B,0xE6,0x02,0x38, + + 0xB0,0x83,0x98,0x5F,0x53,0x00,0x9D,0x3A,0x43,0x66,0x23,0x7E,0x24,0xEF,0x54,0xCF, + + 0xB0,0x20,0x50,0xBC,0x12,0xA3,0x8C,0x18,0xFC,0xA0,0xB3,0x1C,0xB7,0x91,0x53,0xB5, + + 0x0C,0x82,0x76,0x66,0x64,0x22,0x73,0x6A,0x2E,0x60,0xA0,0x44,0xA0,0xED,0x7E,0x81, + + 0x52,0x65,0x23,0x02,0x32,0xB7,0xC9,0xE5,0x99,0xA6,0x74,0x36,0x6C,0x25,0x2C,0x81, + + 0x4C,0x59,0x62,0x51,0x33,0x31,0x03,0x36,0x63,0x8E,0x2B,0xC8,0x1F,0x20,0x85,0x7D, + + 0xCF,0x3A,0xFC,0xF1,0xB2,0xF0,0xCA,0xDD,0x72,0x0D,0xCD,0x96,0x88,0x5D,0x98,0x32, + + 0x11,0x90,0x7F,0xD7,0xBD,0xF2,0x05,0x5D,0x49,0xDE,0xC3,0x8B,0xBF,0xC2,0x62,0xEB, + + 0xA6,0x62,0x50,0xA4,0x4E,0x4B,0xA0,0x71,0xC7,0x6B,0xAA,0xB3,0x76,0x50,0x12,0x6A, + + 0xCC,0x26,0xEC,0x2F,0x3B,0xF7,0xC7,0xB0,0xC6,0x28,0xCF,0x4E,0x71,0x8D,0xF5,0xDC, + + 0x94,0x1B,0x5E,0x7F,0x41,0x2D,0x0E,0x67,0xEA,0xB6,0xEB,0xAF,0x0E,0x45,0x53,0x7B, + + 0x6F,0x3E,0xE9,0x70,0x5E,0xBF,0x55,0x91,0x13,0x84,0x9F,0xD3,0xF7,0xF7,0x11,0x2F, + + 0xDC,0xDB,0x4A,0xAA,0xB1,0xF9,0xCB,0xED,0x91,0xAE,0x96,0x11,0x9D,0x57,0xFE,0x72, + + 0x83,0xD4,0xB0,0x0E,0xD6,0xE8,0x40,0x82,0x4F,0x34,0x04,0x3A,0x3D,0x36,0xA7,0xD3, + + 0xA7,0xD6,0x67,0x0A,0x74,0x17,0x49,0x92,0x19,0x8C,0xE7,0x5C,0xD6,0xE1,0x51,0xB2, + + 0xCE,0x64,0x91,0xFE,0xFF,0x14,0xBA,0xFC,0x0C,0x7D,0xBF,0xBF,0xFD,0xFB,0x1E,0xF8, + + 0xE6,0x93,0xF0,0xAC,0xC5,0xFE,0xC1,0x47,0x68,0xBE,0xF6,0xEE,0x7E,0xFC,0x66,0xDF, + + 0xC6,0x8E,0x09,0x21,0x8A,0x6B,0x46,0x11,0xDC,0xD3,0xFE,0xFE,0x7F,0xFD,0xB4,0x38, + + 0xD0,0x35,0x67,0x43,0x33,0xC3,0x51,0x85,0xC0,0x78,0xF7,0xEF,0xFE,0xFE,0xAF,0x5F, + + 0x18,0x92,0x87,0xD9,0x3C,0xDB,0x47,0x04,0x6C,0xD2,0xFF,0xFF,0x71,0x9D,0x80,0x19, + + 0x40,0x40,0x30,0x08,0xF1,0x43,0x16,0x7E,0xCD,0x22,0xA7,0x70,0x23,0x60,0xA7,0xE1, + + 0xED,0x0C,0x9A,0x10,0xF8,0xA0,0x0E,0x9D,0xAA,0x32,0x8E,0x56,0xAE,0xBC,0x00,0xDF, + + 0xEB,0xC7,0x83,0xF6,0xF4,0x89,0xBA,0xA4,0x53,0x7D,0x51,0x3D,0x83,0x9F,0x57,0x22, + + 0x01,0xA8,0x65,0x86,0xF9,0x29,0xA2,0x80,0xF7,0xEC,0x4D,0xCB,0x2C,0xE2,0x12,0x4F, + + 0xE9,0x95,0xB9,0x32,0xE1,0x34,0x46,0x48,0xA9,0x55,0x01,0x7B,0x6C,0x0A,0x5E,0x91, + + 0xFC,0x88,0x7B,0x69,0x15,0xF5,0xCE,0x0F,0x2B,0x34,0xE6,0xD8,0x91,0x65,0x61,0x61, + + 0x6B,0x47,0x7B,0xBE,0x6E,0x25,0xEA,0xD0,0xAE,0xE9,0xEF,0xC8,0x10,0x99,0x9D,0xAF, + + 0x7B,0xCF,0xD3,0x0F,0x66,0xBB,0x27,0x5C,0x36,0xE4,0xD1,0x61,0xB8,0x34,0x30,0x18, + + 0x8D,0x1E,0x06,0x08,0x58,0x9B,0xC3,0x7A,0xFB,0xC2,0xF3,0xDF,0x20,0xB5,0x2D,0x19, + + 0x62,0x7D,0xF4,0x20,0xF0,0xA8,0xCF,0x6A,0x0A,0xB9,0x2D,0x00,0xA4,0x0A,0x5D,0x13, + + 0x88,0xA1,0xBD,0xDD,0xDB,0x0A,0x6B,0x63,0xF9,0xE7,0xC1,0x22,0x33,0xFB,0x89,0xDF, + + 0x1B,0x08,0x91,0x19,0xB8,0x4B,0x12,0xCA,0xF3,0xE6,0xFD,0x5F,0x2E,0x96,0x19,0x48, + + 0x0C,0x9C,0xED,0x33,0xC3,0x22,0xC3,0x9B,0x7E,0x4D,0xD2,0x9D,0x64,0x93,0xB5,0x26, + + 0x25,0xD2,0x31,0x1B,0xE2,0xDB,0x76,0x0A,0xA0,0x2C,0xE9,0xC9,0x78,0x2D,0x08,0x36, + + 0xE2,0x03,0xFB,0xB2,0x19,0x23,0x54,0x6C,0xCE,0x2E,0xD5,0xC5,0x33,0x7D,0xF4,0x69, + + 0x19,0xA0,0xB5,0xED,0x6A,0xF9,0x65,0x5C,0x46,0xC9,0xDD,0xC8,0x99,0xC0,0x90,0x73, + + 0xA4,0x9D,0xA4,0x99,0x5B,0xD1,0x91,0xDD,0x89,0x31,0xAC,0x25,0x1B,0x91,0x36,0x72, + + 0x69,0x70,0xD2,0xBD,0x39,0x9A,0x65,0xE6,0x94,0x9D,0xC2,0x9D,0x79,0xDA,0x57,0xCB, + + 0x4B,0x76,0xB0,0x74,0x80,0x33,0x03,0xC3,0x80,0x28,0xA0,0x54,0xC0,0x7F,0x33,0xB4, + + 0x43,0xC3,0x1C,0xBE,0xDA,0x42,0x1C,0xE7,0x1C,0x9F,0x0C,0x9B,0x9A,0x02,0x8C,0xE6, + + 0x72,0x99,0xC8,0x2E,0xD7,0xAB,0x2A,0xE7,0xC3,0xFB,0xB7,0xF7,0x23,0x15,0x06,0xD1, + + 0x5E,0x1C,0x9C,0xEA,0x4F,0x77,0x0C,0xDF,0x5B,0x00,0xDC,0xB4,0x0A,0xD1,0x91,0x3E, + + 0x4B,0x9C,0xC4,0xB3,0x49,0xC3,0xC2,0xC6,0x43,0xF9,0xEB,0xC0,0x7D,0xF0,0x0F,0xA2, + + 0xFA,0x96,0x4E,0xA5,0x30,0x3A,0xCC,0xDA,0xDF,0x51,0xCC,0xF3,0x3B,0x96,0x39,0xFA, + + 0xC3,0x79,0x8E,0x2C,0x60,0x58,0xCD,0xA4,0x17,0xA1,0x96,0xAE,0x24,0xD3,0x8E,0xAA, + + 0x49,0x49,0x0B,0xB8,0xD0,0x78,0xDE,0xB5,0x14,0xF4,0x86,0x4D,0x41,0x59,0x39,0xAC, + + 0xC3,0x15,0x07,0x89,0xCE,0x39,0xA2,0x9D,0x10,0x69,0x01,0x86,0x93,0x6B,0xF0,0xEA, + + 0x0A,0x98,0x99,0x59,0x46,0xB6,0x8B,0x88,0x48,0xDA,0xC1,0x91,0x41,0xD0,0x1C,0x37, + + 0xCB,0x9F,0x51,0x3F,0x5C,0x32,0x56,0xF4,0x6C,0xCC,0x72,0x8E,0x8D,0x19,0x10,0x60, + + 0x23,0xB2,0xE8,0xF4,0xBF,0x99,0x26,0x59,0xE6,0xD6,0x6F,0xD0,0xC3,0x0C,0xF6,0x82, + + 0x57,0x22,0xFF,0x71,0x51,0x9D,0xE0,0x1A,0xCC,0xFA,0xEF,0x12,0x46,0x4F,0x18,0xD2, + + 0xDD,0x1B,0x59,0xDA,0x1A,0xE0,0xDF,0x6A,0x8B,0xF0,0x1F,0xE5,0x3B,0xC0,0xC3,0xF9, + + 0x20,0xC0,0x20,0x07,0xBA,0x0D,0xE5,0xF2,0x18,0x6F,0xA6,0x44,0xAB,0x3D,0x9F,0x13, + + 0x88,0x8D,0x2C,0x12,0x55,0xB2,0x5A,0x8F,0x44,0xB1,0xAF,0xC5,0x2D,0x3C,0xA6,0xAD, + + 0x0B,0x80,0x31,0x94,0x9F,0xAA,0xA3,0x50,0xFE,0xAC,0x65,0xD9,0x29,0x43,0x41,0x0C, + + 0xA1,0x82,0x97,0xD2,0xB7,0xAE,0x60,0x58,0xA6,0x3C,0xEF,0x0F,0x3E,0x72,0x77,0x3C, + + 0x64,0xF0,0x9E,0xE3,0xFF,0x97,0xF6,0x22,0x4A,0x84,0x50,0x7C,0xDA,0x49,0xD7,0xF7, + + 0xCD,0x88,0x91,0x20,0xE4,0xB5,0x6E,0x57,0xAC,0x81,0xA2,0x72,0x3F,0xF4,0x1F,0x7B, + + 0x7A,0x57,0xF7,0x25,0xF6,0xDC,0x73,0xCB,0xA5,0xD9,0x24,0x85,0x9E,0x87,0x92,0x2C, + + 0xEF,0x8A,0x53,0xAC,0x6B,0xE4,0x43,0xC3,0x0A,0x68,0x87,0x5F,0x36,0x44,0x25,0x0F, + + 0x08,0x88,0xE6,0xFF,0x70,0x9D,0xCA,0xC2,0xA9,0x87,0x32,0x2A,0x2A,0x45,0x74,0xB2, + + 0x0D,0x04,0xBF,0x1F,0x76,0xF8,0xBB,0xC7,0xB0,0xBC,0xB2,0x3B,0x59,0x69,0x5D,0xFA, + + 0xE2,0x96,0xFD,0x27,0x3C,0x01,0xB3,0x3B,0xB6,0x11,0x23,0x68,0x16,0xA0,0x55,0x3E, + + 0x6C,0x2A,0x9E,0xEE,0xA1,0xA7,0xA9,0x00,0xF7,0x89,0xEC,0x4C,0xD2,0xE8,0x9D,0x34, + + 0x20,0x53,0x51,0xEF,0x18,0x7C,0xD6,0x08,0x6F,0xAC,0x64,0x9D,0x32,0x67,0x7D,0x24, + + 0x65,0x1C,0x55,0x1C,0xBE,0x00,0x6B,0x4A,0x1B,0x62,0x6F,0x0C,0x35,0xBC,0xDC,0x7A, + + 0xF6,0x21,0xF9,0x31,0x1F,0xA3,0xF3,0x6E,0x2A,0x63,0x73,0x5E,0xE2,0x41,0x15,0x63, + + 0xAF,0x3F,0xBE,0x6E,0x3E,0x2E,0xDB,0x09,0xA5,0x2E,0x85,0x53,0xDB,0xAF,0x74,0x7C, + + 0xD9,0x19,0x70,0x78,0xCC,0x78,0x38,0x48,0xA1,0x0D,0x21,0xA4,0x54,0x40,0x88,0xF0, + + 0xDE,0x0A,0xE7,0xE9,0x5D,0xBC,0x96,0xA3,0x49,0x7C,0x0B,0x92,0x02,0xF1,0xA1,0x70, + + 0x20,0x46,0xFE,0x87,0xB2,0x22,0x9F,0xAB,0x21,0x2F,0xF8,0x07,0xE8,0x20,0x2D,0x7B, + + 0x44,0xDE,0x52,0xE9,0x9B,0x6C,0xA9,0xF4,0x27,0x93,0x8A,0xE3,0x86,0xF3,0x61,0x33, + + 0x54,0xB4,0x50,0xA4,0xBB,0x12,0x21,0xD3,0xC7,0x55,0xC7,0x04,0x70,0x24,0xBF,0x22, + + 0x9B,0x06,0x38,0x28,0x8B,0x84,0x7D,0x84,0x9C,0xAE,0xDA,0xCE,0xFB,0x28,0x3B,0x7A, + + 0x12,0x3D,0xB7,0x38,0x43,0x10,0x79,0x09,0x03,0x49,0x80,0xF4,0x8E,0xB2,0xDC,0x6A, + + 0x1F,0x44,0x5C,0xFB,0x0F,0xC6,0x7E,0xCC,0xC1,0x02,0x85,0xD0,0x0A,0xF8,0xDD,0x82, + + 0x89,0x67,0x19,0xBE,0xAE,0x17,0x7E,0xAF,0x68,0xD8,0x76,0xB6,0x2F,0x05,0x34,0x84, + + 0x1B,0x6D,0xD0,0xA6,0xBD,0x2B,0xE1,0xBB,0xED,0x99,0x6A,0x40,0x80,0x78,0xFA,0x87, + + 0xAA,0x4A,0xB0,0xF1,0xDE,0xCE,0x7D,0x8B,0xFC,0x5A,0xA1,0xCD,0x03,0x27,0xFA,0xE8, + + 0x93,0x80,0x18,0xBB,0xCA,0xBB,0xE0,0xBB,0x31,0x7A,0xDE,0x4C,0x85,0x26,0xA6,0xD2, + + 0x23,0x63,0x26,0xD6,0xFE,0xD0,0x22,0x6E,0x3A,0x55,0xAC,0xEF,0x16,0x2F,0xD1,0xEB, + + 0x8E,0x62,0x96,0x4D,0x55,0x22,0x56,0x98,0x86,0xEE,0xA9,0x0D,0x05,0x88,0xB3,0x58, + + 0x0F,0x41,0x81,0x7B,0x45,0x13,0xCC,0xA9,0x4F,0x23,0x89,0x53,0x1F,0x5D,0xD4,0x7E, + + 0x58,0x62,0x2F,0xC3,0x05,0x6B,0x69,0x99,0x8F,0xA5,0xAC,0x11,0x47,0x2C,0xC0,0x18, + + 0x0D,0xFF,0x05,0xB5,0xF9,0xCA,0x77,0x28,0x2B,0x85,0x35,0xD5,0x34,0x76,0xB7,0x21, + + 0xA0,0xFE,0x3F,0x40,0xE6,0x94,0x46,0x03,0xC1,0xEA,0xC0,0xAC,0xAD,0xA9,0xD5,0x92, + + 0x21,0xDD,0x8F,0xD1,0xB3,0xB0,0x77,0xD0,0x2C,0x49,0xAF,0xF0,0x99,0xA8,0xB2,0xB4, + + 0x76,0xFE,0x41,0xEF,0x97,0xB3,0x2B,0x21,0x44,0x55,0x62,0x0E,0xDA,0xFC,0x1E,0xD2, + + 0x06,0xD0,0xFE,0x3A,0xB1,0x41,0xC0,0x91,0xE1,0x04,0x46,0x95,0x62,0xC2,0x2F,0xA1, + + 0xD1,0x45,0x48,0x44,0xB6,0x2B,0x4A,0x83,0x23,0x98,0x16,0xCF,0x57,0x14,0xA2,0x5E, + + 0x5C,0xA9,0xFF,0x3A,0x31,0x54,0x63,0x5F,0x61,0xE7,0x8F,0x4C,0xB1,0x62,0x37,0x67, + + 0x68,0xE2,0xA1,0xD3,0x6F,0x66,0x0F,0x54,0x28,0x26,0xE7,0xB0,0xF1,0x6A,0x14,0x20, + + 0xE3,0x19,0xC9,0x73,0x70,0x25,0x31,0x32,0x90,0xFC,0x52,0x34,0x0B,0x95,0x9C,0x67, + + 0x61,0x78,0x35,0x2D,0x7D,0x86,0x7B,0x98,0x9F,0xF6,0x4E,0xC2,0xA4,0xC8,0xB8,0xB8, + + 0xE4,0xA5,0x7C,0x73,0xB6,0xF5,0x4D,0x26,0x9A,0x04,0x85,0x4F,0x27,0xB7,0x75,0x34, + + 0x7C,0xA8,0x19,0x63,0xF3,0x8A,0x45,0xAF,0x03,0xE0,0x09,0xCE,0xBD,0xB6,0x1C,0x7B, + + 0x1A,0xA3,0x2E,0xCC,0xE6,0x0C,0xEB,0x19,0x07,0x47,0x50,0x90,0xE2,0x97,0x69,0xA9, + + 0xD3,0x4D,0x5A,0x47,0x37,0xD0,0x64,0x2C,0x20,0x42,0xEF,0x81,0x7A,0xB9,0x71,0x0F, + + 0x18,0xA1,0x6F,0x0F,0x19,0xDA,0x40,0x7A,0x9B,0x7F,0xEB,0x6F,0x9A,0xB5,0x15,0x56, + + 0xCF,0x41,0xD9,0x7D,0x70,0x5E,0xDB,0x4B,0x3F,0x40,0x49,0x62,0xB7,0xC2,0xB3,0xA4, + + 0xAF,0x12,0x3B,0xB5,0x54,0x9F,0x33,0xBB,0x0B,0x24,0x40,0x5A,0x8D,0xD1,0x64,0x61, + + 0x0D,0x65,0xF2,0xA5,0xDA,0x50,0xFF,0x4B,0x43,0x41,0xCA,0x85,0x9A,0xD0,0xB2,0x80, + + 0x2D,0x1E,0x17,0xFB,0xDA,0x93,0x95,0x67,0x72,0x51,0x07,0x56,0x94,0xAF,0x53,0xA1, + + 0x33,0xB8,0xAB,0xA1,0xD1,0x73,0x1F,0x4C,0xE1,0x57,0xE3,0x90,0x39,0xB2,0x1A,0x2F, + + 0x2E,0xBF,0xBA,0xFD,0x49,0xB4,0xC0,0x26,0x3E,0x57,0xF4,0xF4,0x05,0x41,0x12,0xCA, + + 0x23,0xBE,0x84,0xD1,0x37,0x25,0x23,0xE3,0x9D,0xA8,0x7B,0xC1,0x9A,0xA4,0xB8,0x61, + + 0x27,0x00,0xFA,0x02,0x78,0xA7,0xB6,0x1A,0xC0,0x49,0x0A,0xE7,0x26,0xB7,0x6A,0xD5, + + 0xC8,0x63,0xA0,0x6E,0xF3,0x45,0x7B,0x4F,0x16,0xF3,0x6E,0xCC,0xC0,0x37,0x10,0x87, + + 0x43,0xD9,0x80,0x4B,0xC4,0x00,0x96,0x55,0x60,0xAC,0x84,0xEA,0x24,0xD5,0x03,0x64, + + 0x29,0xAC,0xD5,0x9C,0x3F,0xA9,0xC1,0xBC,0xE9,0x19,0x18,0xA9,0x85,0xE8,0x66,0xCF, + + 0xF4,0xEF,0x5C,0x8D,0x40,0xD2,0x82,0x09,0xFC,0xDA,0x06,0x4D,0xF4,0x3A,0x81,0x61, + + 0xA9,0x59,0xC4,0xE2,0x8A,0x7B,0xC0,0xB8,0x35,0x1A,0x20,0x18,0x33,0x76,0xC4,0x0E, + + 0xB8,0x1F,0xF8,0x09,0x18,0x31,0x21,0x93,0xA2,0xCB,0x7A,0x49,0xAF,0x1F,0xA2,0x4A, + + 0x2B,0x15,0xFE,0xDE,0x7B,0xE6,0x9F,0xFC,0x2F,0x0E,0x84,0x0F,0x43,0xA0,0xC0,0xA4, + + 0x43,0x2F,0x45,0x31,0x02,0xC5,0x6C,0x18,0x55,0x4C,0x7C,0x27,0x41,0xFF,0x9B,0x79, + + 0xF3,0x1D,0xFA,0x20,0x9B,0xEB,0x1A,0xFD,0xAF,0x1C,0x8D,0x6E,0x10,0x6E,0xB1,0xF1, + + 0x30,0x2D,0xDE,0x37,0x94,0xC2,0xD6,0xC6,0xA5,0x6F,0xE6,0x17,0xBF,0x41,0x1A,0x2C, + + 0xA6,0x20,0x57,0x65,0x52,0xC2,0x46,0xAC,0xAE,0x37,0xAE,0x54,0xAA,0x4C,0xB3,0xF2, + + 0x27,0xC2,0x9F,0xD2,0xFC,0xAF,0x57,0xD2,0x06,0x42,0x91,0xA2,0x3D,0x08,0x3E,0xE0, + + 0xFD,0x5E,0x52,0x68,0xFD,0x62,0x67,0xA8,0xD5,0x6C,0x73,0x92,0x22,0x1E,0x01,0xE2, + + 0xD0,0x3B,0xDA,0xF6,0xA2,0x0B,0x66,0x56,0xAD,0x05,0x63,0x58,0x2E,0xFF,0x9B,0xAC, + + 0xCF,0x32,0xB8,0x5E,0x1B,0x28,0x6E,0x4D,0x37,0x38,0x2C,0x28,0xC4,0xDA,0x47,0xFC, + + 0x79,0x22,0x70,0xB6,0xE6,0xE6,0xCA,0xD2,0xAE,0x69,0x71,0x20,0xF8,0x3A,0x16,0x40, + + 0x75,0x18,0x97,0x6F,0x6B,0x9F,0xAD,0xE0,0x66,0x18,0xEB,0x97,0x3C,0xD6,0x74,0x32, + + 0xE7,0x19,0xDC,0x3A,0xE9,0x0B,0x51,0xDB,0xA8,0x6E,0xA4,0x1A,0xB7,0x29,0x6C,0x2A, + + 0x09,0xA9,0xE7,0x2F,0xBC,0x56,0x0C,0xCB,0xAD,0x89,0xAC,0x4D,0x46,0x48,0x65,0x2E, + + 0x0C,0x1E,0xB5,0xFC,0xF4,0x07,0x6D,0x1C,0xEF,0x65,0x08,0x9E,0xB4,0x45,0xAA,0xD9, + + 0x0E,0xCD,0x95,0xD7,0xB3,0x74,0x93,0xB1,0x1D,0x5F,0x83,0xC0,0x34,0xF1,0x57,0x66, + + 0xB7,0x87,0x39,0x4E,0xE6,0x44,0xCD,0x5B,0xEF,0x33,0x49,0xDE,0x94,0x43,0xDB,0x0F, + + 0xBA,0x86,0xA1,0x21,0x77,0xA0,0x6C,0x4E,0xA4,0x4C,0x36,0xDE,0xFE,0x2D,0xE7,0x4F, + + 0xCA,0x83,0xB8,0x4F,0x98,0x3E,0xC8,0xCE,0x39,0x33,0xE2,0x6D,0xE6,0x43,0xEF,0x5F, + + 0xCB,0x11,0x95,0x63,0x6A,0xCC,0xC0,0xCA,0xA7,0x60,0x20,0x51,0xA0,0xEF,0x27,0x5A, + + 0xD9,0x31,0x08,0x23,0xE1,0xD3,0xE9,0xA6,0xD9,0xBE,0x4F,0xD9,0x1C,0xFD,0x03,0xED, + + 0xFC,0x0E,0xBD,0x65,0x05,0x6C,0xBC,0xA7,0x79,0x7C,0x03,0x87,0x15,0x5E,0x1D,0x7C, + + 0x51,0xF1,0x0E,0x4D,0x0F,0x13,0x53,0x8E,0xE7,0xB2,0x4A,0xD9,0xDA,0x2D,0x7D,0x9B, + + 0xE9,0x2E,0xFB,0xA2,0x5E,0x52,0x77,0x63,0xED,0x7C,0xAF,0xC9,0x9F,0x92,0x42,0xF2, + + 0xA2,0x30,0x76,0xD9,0x5A,0x1F,0x4A,0xCB,0xE9,0x52,0x44,0xFE,0x97,0x97,0x4A,0xAD, + + 0x84,0xD7,0xB4,0xD4,0x5C,0x02,0x7B,0x72,0xAF,0x54,0xF8,0x8B,0x56,0x77,0xF1,0xC4, + + 0x4F,0x4B,0xF4,0x54,0xDD,0x87,0x75,0xA3,0xC6,0xD5,0x0A,0x94,0xB5,0x7C,0x6E,0xAF, + + 0x27,0x27,0x69,0x5A,0x5E,0xDD,0xDD,0xE0,0xCB,0xB3,0xC3,0xAE,0x97,0x7C,0x30,0xE8, + + 0xD7,0x05,0x80,0x4A,0x08,0xBB,0x25,0xC5,0x0D,0x98,0xC8,0x8B,0xB4,0x60,0x04,0x4A, + + 0x8E,0x11,0x0B,0x6F,0x59,0xAF,0x58,0x4B,0x5D,0xD2,0xAF,0xA0,0xBB,0x0D,0xF3,0x71, + + 0x45,0x62,0x22,0x87,0xD7,0x1B,0x6F,0x73,0x87,0x3B,0xA2,0x91,0x90,0x0F,0x2E,0x68, + + 0x67,0x30,0x8F,0x32,0xD6,0x1A,0x19,0x7A,0xD9,0xD8,0x59,0xCD,0x16,0x5D,0x40,0xFA, + + 0xAA,0x38,0xB6,0xAC,0x7A,0x67,0x48,0x94,0xA6,0x21,0x09,0x9C,0x1C,0xA9,0x16,0xFD, + + 0xC6,0x60,0xEC,0x22,0x87,0x46,0x5E,0xE3,0xA7,0x5C,0x69,0xFF,0x94,0xFE,0xF3,0xCC, + + 0x47,0x43,0xD2,0x32,0x3F,0xBA,0x0F,0x6F,0xBE,0x07,0xDA,0x90,0x67,0x55,0x17,0x4A, + + 0x97,0x32,0xE7,0xC1,0xDB,0x4B,0xDF,0xE8,0xC3,0xBB,0xDA,0x5E,0x7F,0xCF,0x5E,0x3D, + + 0x08,0xAB,0x04,0x00,0x04,0x58,0xB8,0xAA,0x2B,0xD4,0x69,0x03,0xF1,0x1F,0x52,0x3F, + + 0x7D,0x54,0x08,0x1D,0xB8,0xA0,0x46,0x3F,0x0D,0x0F,0xC0,0x24,0xBA,0x19,0x51,0x2F, + + 0xEB,0x21,0x93,0x31,0xB3,0x42,0x11,0x32,0xD9,0xF6,0x3D,0xA1,0x80,0x8F,0x59,0x3A, + + 0xAB,0x41,0xE2,0x75,0x9D,0x63,0x78,0xC1,0xC9,0xE2,0xB9,0x6C,0xAE,0x43,0xF8,0xBF, + + 0x20,0xA9,0xB1,0x59,0xFA,0xD4,0x52,0x9A,0xA6,0xDB,0x74,0x95,0xF1,0x24,0xC8,0xAC, + + 0x03,0xD1,0x07,0x49,0x1E,0xD5,0xFB,0x9F,0x65,0x1A,0xE2,0xF3,0xA4,0xEE,0x43,0xBD, + + 0x8A,0x02,0xA1,0x58,0xA1,0xD6,0x58,0x8E,0x7F,0x39,0xEE,0xE1,0x82,0x79,0x03,0x2E, + + 0xC0,0xF5,0xDF,0x48,0xDB,0xF7,0xB7,0x9F,0xB0,0x18,0xDD,0xF2,0x2C,0x27,0x01,0x4D, + + 0xF7,0x6B,0x03,0xC1,0x2B,0x57,0x46,0xDB,0x62,0xC5,0x49,0x38,0x23,0x6E,0x1C,0x7A, + + 0xF6,0xD4,0x32,0xEF,0x54,0x3B,0xAF,0x05,0xFE,0x7C,0x8A,0x5E,0xEA,0x0C,0x65,0x6B, + + 0x7F,0xF7,0x3B,0xFE,0x8D,0x38,0x45,0x89,0x23,0x49,0xC8,0x2D,0x5A,0x22,0xDF,0xE7, + + 0x74,0xAA,0x33,0xEE,0xC4,0x39,0x4F,0xBD,0x99,0x23,0xA3,0xD6,0x75,0x66,0x3C,0x84, + + 0x39,0x33,0x7E,0x50,0xE4,0xFC,0xC6,0x83,0xDF,0x73,0xD1,0xD0,0x92,0x64,0xF2,0xAB, + + 0x10,0x16,0xC4,0x40,0x01,0x9D,0x70,0x92,0x36,0x52,0x84,0x9E,0x5F,0xD0,0xFB,0xBA, + + 0x99,0x1C,0xA2,0x51,0xB9,0xFE,0x0F,0x82,0xDC,0x51,0x73,0x7E,0xA4,0x0A,0xB1,0x3F, + + 0x60,0xC5,0x76,0x44,0x2D,0x9F,0x9E,0x8E,0x5A,0xA0,0x1B,0x65,0x68,0xE2,0x95,0x16, + + 0xE8,0x61,0x68,0x86,0x38,0x5C,0x05,0xB3,0x0C,0x14,0xAA,0x65,0x18,0x3A,0x52,0x02, + + 0x29,0xB5,0x4F,0xD3,0x3F,0x9E,0x62,0x80,0xCD,0x5C,0x8A,0xE8,0x9A,0xB9,0xE3,0x70, + + 0x6A,0x32,0x65,0x8C,0x4D,0xB8,0x33,0x95,0x6C,0x5F,0xEB,0xED,0x19,0xCA,0x1F,0x0F, + + 0x69,0xB2,0x83,0x17,0x05,0xB8,0x63,0x80,0xC3,0x85,0xA3,0x74,0x7E,0xD5,0xC0,0xD3, + + 0x29,0x1E,0x9A,0xCD,0x5E,0x24,0x15,0x06,0xC3,0x1B,0xB7,0x60,0x72,0xB4,0x4C,0xD2, + + 0x21,0x2E,0x9A,0xC1,0x96,0xD5,0x56,0x16,0x21,0x7A,0xE6,0x51,0x84,0x88,0x63,0x98, + + 0xF3,0x58,0xAC,0xCD,0x7E,0x26,0xE4,0x07,0x85,0x19,0xEA,0xD5,0xFA,0x89,0xB7,0xD8, + + 0x0E,0x9E,0x6E,0xC0,0x89,0xF7,0x63,0x12,0x59,0x78,0xCB,0x97,0x0C,0xAA,0xE1,0x79, + + 0xF2,0x08,0xBE,0x2C,0xD5,0xB8,0x69,0x30,0x6C,0x48,0x5E,0xEC,0x38,0x8D,0x1F,0xAE, + + 0xE1,0x28,0x26,0x84,0xBB,0x6C,0x14,0x7A,0xEA,0x1F,0x56,0xA3,0x60,0x62,0x3D,0x7A, + + 0x7A,0xBE,0x6F,0x95,0x38,0x7A,0xC5,0x30,0xEC,0xBA,0xDB,0xAF,0xFC,0x8F,0xB9,0x68, + + 0x41,0x1F,0xD5,0xFF,0x9B,0xF6,0xA8,0x9D,0x68,0x56,0xE7,0xCF,0x5E,0x7F,0xB3,0x28, + + 0x6A,0x2E,0x7A,0xD8,0xA6,0xFC,0xF1,0x0B,0x0F,0x73,0x02,0x12,0x93,0x74,0xCE,0x1E, + + 0x2F,0x1B,0xEE,0xCD,0x5F,0xBD,0xA7,0x1A,0xFC,0x52,0x09,0x40,0x90,0x19,0xFB,0xB9, + + 0x1E,0x15,0x13,0xDC,0x2D,0x9E,0x5F,0x0A,0xB8,0x51,0x40,0x1E,0x7E,0xD3,0x47,0xB7, + + 0xC8,0x3F,0x62,0xCD,0xC6,0xBF,0x2C,0x1B,0x4B,0x50,0xE5,0x7A,0x10,0xB9,0xB6,0xF1, + + 0x68,0x5D,0x18,0xF9,0x1A,0xE6,0xCF,0x87,0x8E,0xCD,0x49,0x01,0xF5,0x9F,0x0E,0x27, + + 0x81,0x2E,0x2C,0xD1,0x95,0x81,0xC7,0x4C,0x6B,0x1E,0xE0,0x97,0x3E,0x99,0x77,0x37, + + 0x6F,0x43,0x22,0x78,0xB6,0x4F,0xCA,0x5C,0xAC,0xCF,0x1D,0xA3,0x84,0x0F,0x8D,0x71, + + 0x6E,0x02,0x05,0x91,0x85,0x5E,0x86,0x02,0xA9,0x6C,0xBD,0x35,0xA5,0xF8,0x61,0x24, + + 0xED,0x6E,0xC1,0x5F,0x55,0x14,0xAA,0x95,0x2E,0x0B,0x14,0x95,0x90,0x6F,0x22,0xF2, + + 0xA6,0x95,0xDB,0x4E,0x34,0x35,0xAD,0x81,0xE4,0x6A,0xA6,0xE5,0x47,0x68,0x31,0x4B, + + 0x90,0x2B,0x22,0x5F,0x73,0x36,0x9B,0x95,0x56,0x09,0xF5,0xE0,0x3D,0x00,0x4F,0x97, + + 0x84,0x84,0x3D,0x5A,0x74,0xD7,0xCB,0x80,0x9C,0x68,0x87,0xE5,0x6A,0x18,0x96,0x68, + + 0xE7,0x29,0xF2,0x78,0x10,0xC6,0xA4,0x54,0x26,0x09,0x4F,0x48,0xB7,0xC2,0x48,0x1A, + + 0x0E,0xE9,0x2F,0xF6,0xAE,0xE4,0x2C,0x13,0xA6,0xF8,0xFB,0x58,0xB6,0x51,0x10,0x5E, + + 0x7D,0xE4,0x83,0x0E,0x11,0xEC,0x4D,0x1F,0xAF,0xDA,0xF2,0x49,0x37,0xA0,0xAB,0x13, + + 0x46,0x2F,0x54,0xBF,0x74,0xCB,0x01,0x8A,0xFD,0x64,0xFA,0x59,0x36,0x33,0x61,0x42, + + 0x8E,0x8E,0x16,0x43,0x35,0xDC,0xB0,0x98,0xC5,0x43,0x5E,0x9E,0x5C,0x1A,0x69,0x4B, + + 0xC7,0x55,0xDA,0x52,0x0C,0xFD,0xFB,0x9D,0xD2,0xA2,0xFA,0x8D,0x89,0x46,0x45,0x8A, + + 0x8D,0x8D,0xF4,0x43,0x73,0xFE,0x54,0x99,0xDB,0x41,0x8D,0xF0,0x3F,0x68,0x60,0x59, + + 0x9F,0x8B,0x68,0x56,0x1A,0x9F,0xD8,0x9C,0xC8,0xA0,0x9C,0x77,0x3E,0x40,0x1A,0xD7, + + 0x4F,0x9F,0xA6,0x40,0x20,0xB4,0x1C,0x40,0xE5,0xB4,0x6D,0x4E,0xCB,0xBD,0x12,0xB6, + + 0x06,0x13,0x1D,0x66,0x94,0x3B,0x62,0x70,0x75,0xD7,0x43,0x16,0x98,0x91,0x24,0xB1, + + 0x4F,0x17,0x25,0xC1,0xA0,0xB4,0x1D,0xA5,0x65,0xDC,0xCB,0x76,0xE6,0xBF,0x13,0xB6, + + 0x85,0x9E,0x7A,0x75,0xCA,0xB3,0x35,0x4C,0x44,0xD2,0x51,0xB5,0xFD,0x9F,0x1C,0x62, + + 0xD9,0x2B,0x24,0xC3,0xDC,0xD4,0xD2,0x00,0x1B,0xDB,0xAE,0xE7,0xF8,0x5B,0x04,0xD5, + + 0xA4,0x9A,0x0D,0xD2,0x09,0x95,0xAA,0x10,0x57,0xDA,0xC6,0x05,0xB5,0x09,0x0D,0x01, + + 0x25,0xD2,0x2B,0xC3,0x0D,0xF6,0xBC,0x01,0xAB,0xD9,0x13,0x16,0x3C,0xE6,0x05,0xB1, + + 0x81,0x97,0x86,0xD6,0xC4,0xD9,0x3E,0x11,0xE1,0xD5,0x40,0xA8,0x1C,0x21,0xA1,0xCC, + + 0xBE,0x33,0x7D,0x9A,0x47,0xBE,0x0E,0xAF,0x68,0x88,0x56,0xB7,0x81,0xFB,0x09,0x6B, + + 0xB1,0x59,0xBE,0xFC,0x8E,0xDC,0x7C,0x5A,0x61,0x99,0x9E,0xBA,0x02,0xF9,0x04,0x8B, + + 0x64,0xA2,0xFC,0x8F,0x3E,0xF2,0x2D,0x43,0x0F,0x97,0x0D,0xBF,0x83,0xDA,0xC7,0x11, + + 0x2D,0x2B,0x97,0x74,0x11,0xB6,0x3A,0x84,0xAF,0xD0,0x18,0x7A,0xCE,0xA4,0x66,0x35, + + 0x8E,0x63,0xA6,0xF1,0x36,0xD0,0x76,0xF7,0x91,0x2C,0x51,0x71,0x15,0x4A,0x4E,0x24, + + 0x07,0x22,0x49,0x9E,0x82,0xB6,0xC5,0xE7,0x8E,0x2D,0x4C,0xA1,0x14,0x18,0x6F,0x35, + + 0x0F,0x41,0xCF,0x0D,0x6A,0x4D,0x8A,0xF6,0x09,0x2E,0xF6,0x1C,0x2C,0x55,0x43,0x20, + + 0x8A,0x20,0xA9,0xC0,0x3B,0x6B,0x91,0xE6,0x76,0x2F,0xC7,0x0E,0x17,0xFB,0x5E,0x32, + + 0x40,0x4C,0x24,0xF7,0x9C,0x61,0x28,0x88,0xE3,0x01,0xB9,0x77,0xD4,0x7C,0x2F,0x11, + + 0x6A,0x75,0xB2,0xE2,0x82,0x9E,0xB8,0x3E,0xCD,0x4C,0xE0,0x13,0xC0,0xCD,0x60,0xF2, + + 0x50,0xA9,0x29,0x3A,0xA3,0xDD,0xE4,0x20,0xD4,0x76,0x38,0x76,0x5C,0x3E,0x8F,0xD7, + + 0x13,0x00,0xD7,0x37,0x4C,0x88,0x67,0xD3,0x6D,0x4E,0x39,0x7F,0x44,0xCF,0x48,0xF7, + + 0x61,0x24,0x48,0x41,0x71,0xD4,0xD2,0x0F,0x63,0x85,0xC0,0x84,0x1A,0x64,0x30,0x74, + + 0x8C,0x07,0xF0,0x04,0x17,0x2A,0x59,0x83,0x89,0xEE,0xB0,0xB6,0xD5,0x90,0x39,0xC3, + + 0x83,0x71,0xB9,0xC7,0x97,0x66,0x7B,0xB1,0x61,0xCE,0x8F,0x72,0xDA,0x66,0xFE,0x50, + + 0x0E,0x0B,0xF1,0x85,0x64,0x28,0x3E,0x79,0xA8,0x82,0x49,0xF1,0x8F,0x7C,0xE1,0xF3, + + 0x63,0xAE,0xA7,0x0C,0x73,0x0C,0x82,0xE8,0x0C,0xAC,0x36,0x62,0x87,0x55,0x54,0x2E, + + 0xD4,0xA2,0x0A,0x00,0xBA,0xA4,0x8A,0x97,0xBE,0xA9,0xC4,0x18,0x59,0xC2,0x0A,0xF8, + + 0x52,0x1A,0x7C,0x09,0xC0,0x40,0x6B,0x20,0x25,0x78,0x78,0x5A,0x58,0xBD,0xBD,0x7B, + + 0xE2,0xAE,0x6F,0x3A,0x2A,0xA6,0xA7,0xCA,0x6A,0x7B,0x0F,0x99,0x5C,0x2B,0x2A,0x56, + + 0xCC,0xF8,0xA2,0x08,0x56,0xA7,0xFD,0x99,0xA6,0x41,0x92,0x6C,0x5E,0x68,0x14,0xCA, + + 0x0F,0x80,0x48,0x3E,0x5A,0x6D,0x68,0x68,0xCE,0x5B,0x9A,0x78,0x5F,0x69,0xA5,0xB8, + + 0x40,0x4E,0x44,0xAF,0x18,0x66,0x0D,0x5A,0x4A,0xE5,0x57,0xE9,0x86,0xCF,0x35,0xC7, + + 0x60,0xF9,0xB3,0x3F,0xD8,0xF0,0x05,0x63,0xCB,0xE4,0xA3,0xF9,0x83,0x79,0xE4,0xBF, + + 0x04,0x67,0x86,0x76,0x77,0x34,0x2C,0x84,0x63,0x60,0x1D,0xB4,0xD3,0xCB,0xAD,0x97, + + 0x80,0x50,0xB6,0x96,0x2D,0x11,0xBE,0x52,0x71,0x9C,0x9C,0x48,0xF0,0x33,0x01,0x95, + + 0x38,0x56,0x81,0xD1,0x57,0xCC,0x28,0x90,0x64,0x4D,0xB5,0x5D,0xF0,0x89,0x45,0x95, + + 0x4C,0x52,0x0D,0x85,0xA1,0x31,0x8D,0x1E,0x16,0x03,0x1E,0xB9,0x0C,0xD2,0x67,0x31, + + 0xBE,0x54,0x04,0xD4,0x37,0x30,0x94,0xFD,0xC6,0xFF,0xD4,0xE4,0x72,0x74,0x33,0xA3, + + 0xC9,0xBD,0xCC,0xE0,0x00,0x3A,0x23,0x01,0xDC,0x07,0xDC,0xF4,0x73,0x75,0xAD,0x4B, + + 0x80,0xC0,0xC3,0xFA,0xF9,0x74,0xA8,0xF9,0xC0,0x49,0xD5,0xE5,0xF2,0x76,0x3F,0x31, + + 0xE7,0x9C,0x97,0xD0,0x14,0x76,0xF2,0x8A,0x3E,0x8B,0xDD,0xF5,0xF3,0x77,0xF3,0x76, + + 0x2C,0x75,0x96,0xCC,0xB8,0x3E,0x2B,0x99,0xEC,0x47,0x02,0x5F,0x54,0xA5,0xAA,0xEA, + + 0xA7,0x58,0x8A,0x1B,0x18,0xAE,0xA6,0x9C,0x80,0x3D,0xFE,0xFC,0x64,0xF2,0x97,0x82, + + 0x2C,0x4E,0x00,0x3B,0x59,0xE1,0xAF,0x5A,0x4B,0x4A,0xC1,0x89,0x13,0x3B,0xB0,0x82, + + 0x0A,0x9E,0x3B,0x62,0xFA,0xC8,0x8E,0x4A,0x65,0x66,0x1B,0x5F,0x7B,0x73,0x6D,0x26, + + 0x95,0x18,0xA6,0xAC,0x70,0x31,0x6D,0xB6,0x6C,0xAC,0xD6,0xEC,0x7A,0x7C,0xB9,0x87, + + 0x96,0xE1,0x30,0x5E,0xE6,0x82,0x0E,0x12,0x90,0xF6,0xDE,0xFC,0x7B,0x7D,0x45,0xE7, + + 0x5C,0x6B,0x6B,0x5F,0xBB,0x34,0xE7,0x18,0x55,0x8E,0xD7,0xED,0xFA,0x7E,0xE4,0xB7, + + 0x7E,0x11,0xF7,0x23,0xDB,0x33,0xA2,0x61,0x80,0x20,0xDF,0xFD,0xFB,0x7F,0x00,0xF3, + + 0xE4,0x00,0x44,0x21,0x15,0xC0,0x8C,0xAB,0x60,0xF4,0x8E,0x03,0x1E,0x81,0x28,0xE3, + + 0xDD,0xA1,0xA9,0xC9,0xF6,0xA5,0xDC,0xC1,0xE6,0x4A,0x86,0x13,0x1C,0xA0,0x89,0x89, + + 0xEF,0x16,0x5B,0x05,0x9C,0xED,0x91,0x2D,0x48,0x4F,0xE9,0x23,0x9E,0xA3,0x77,0x1C, + + 0xD7,0xCD,0xBC,0x65,0x1B,0xC6,0x3D,0xB4,0xE1,0xB4,0xE1,0xD1,0x57,0xEB,0x3E,0xD9, + + 0x16,0x2B,0x98,0xC2,0x4A,0x10,0x57,0x63,0x2D,0xB0,0xD0,0x09,0x82,0x3B,0xDE,0xA3, + + 0xEF,0xD5,0xB8,0x4A,0x01,0x10,0x9B,0x89,0xC5,0x39,0xAD,0xD6,0xA0,0x85,0x02,0xB0, + + 0x62,0x29,0x71,0xE7,0x8E,0xE7,0x32,0xA5,0x54,0xC5,0x56,0x98,0xBD,0x99,0x17,0x61, + + 0x02,0x91,0x20,0x68,0xDC,0xE5,0x41,0x54,0x6B,0xCA,0xA7,0x98,0x97,0x4C,0x43,0xAA, + + 0xDA,0x37,0xDB,0xDE,0x50,0x29,0x36,0xAA,0xA5,0x8C,0x76,0x4C,0x1D,0xF8,0x9E,0x78, + + 0xFA,0xEC,0x80,0xCE,0x41,0x21,0x9E,0x96,0xA6,0xAD,0xC2,0xBC,0x5C,0x91,0x43,0x54, + + 0x2D,0xEF,0xA0,0x45,0x11,0xC9,0x26,0xD8,0x48,0x67,0xCB,0x4D,0x9D,0xE8,0x13,0xE4, + + 0x0E,0x85,0xBB,0x55,0x11,0xA3,0x03,0xC8,0x6E,0xAE,0x81,0xDD,0x5F,0xE3,0x5D,0x14, + + 0xFF,0x50,0x64,0xCE,0xF7,0xF4,0x89,0x4D,0xEF,0x33,0x0F,0xEA,0x35,0x93,0xC1,0xFF, + + 0xDA,0x93,0xAE,0x2D,0x08,0xC1,0xEA,0xBD,0x4D,0x38,0xFA,0x7E,0x79,0xED,0x3A,0x5F, + + 0x03,0xED,0xA1,0x3E,0xD5,0xA5,0x1B,0xA9,0x48,0x3B,0xB5,0x4B,0xD6,0xEF,0x16,0xA8, + + 0x57,0x5B,0x89,0x5B,0x9E,0xFF,0x7F,0x3C,0x4E,0xC1,0xFB,0x7F,0xDF,0xEF,0x15,0x60, + + 0xF9,0x04,0xF4,0xF5,0x2C,0x3A,0xD0,0x51,0xC7,0xB5,0x3D,0xD4,0xD7,0x5D,0x0B,0x70, + + 0xC5,0x40,0x18,0xF6,0x3D,0x61,0xDB,0x41,0xC6,0x8C,0x87,0x56,0x35,0x7A,0x5D,0xB1, + + 0x94,0x4E,0x62,0x79,0x55,0xD4,0x08,0x24,0xC0,0xAF,0x21,0xF6,0xD0,0xE9,0xD6,0xB7, + + 0x6C,0x9C,0x02,0x47,0x34,0x12,0xDE,0xF7,0x46,0xEE,0x08,0xB5,0xF1,0x78,0x0C,0x44, + + 0xDA,0xD5,0x9A,0xC0,0xD7,0x37,0xF0,0x13,0xD9,0xD7,0xF4,0xE6,0x76,0xF4,0xC0,0x90, + + 0xA4,0x41,0x94,0xA8,0x77,0x3F,0x87,0xCD,0x98,0xDB,0xFC,0xF6,0x77,0xF5,0x89,0x43, + + 0x5A,0xB6,0xCA,0x34,0x3A,0x4B,0x25,0x09,0x1D,0x03,0xF5,0xE7,0xF6,0xF6,0x8F,0xCC, + + 0x69,0x3C,0x3A,0x55,0x6A,0x08,0x15,0x75,0x1B,0x96,0xFD,0xF7,0xF7,0xF7,0x5F,0xAD, + + 0x8D,0x89,0x9E,0xEE,0x8C,0xB0,0x51,0xEE,0xCF,0xC5,0x54,0x48,0x6C,0xB7,0x10,0x9C, + + 0x67,0xDD,0x57,0xEC,0xB3,0xDC,0x0C,0x8B,0xE9,0x76,0xF4,0x49,0xDE,0xF4,0x5F,0xD8, + + 0x0F,0x85,0xD6,0xFD,0x32,0xDF,0x54,0xFA,0x4F,0x9B,0xD7,0xEF,0xF2,0xF7,0x77,0x9F, + + 0xE7,0xFF,0xD6,0xED,0x33,0xDE,0x9F,0xC8,0x4E,0x78,0xF5,0xC0,0x5E,0xFD,0x00,0xC2, + + 0xCF,0x33,0x9E,0x4C,0x1F,0xCE,0xDE,0xD5,0x05,0xCB,0xF6,0xEE,0x7E,0xFC,0x89,0x2B, + + 0xF5,0x8D,0x02,0x5E,0xC3,0x9D,0x24,0xFB,0xCC,0x93,0xFE,0xFE,0x7F,0xFD,0x05,0xD1, + + 0x78,0x2A,0xBD,0xCE,0x1D,0xFF,0x73,0x69,0xEF,0xB1,0xF7,0xEF,0xFE,0xFE,0x11,0x41, + + 0xA9,0x9F,0x43,0x9D,0x3C,0x12,0x4E,0x3D,0x13,0xD9,0xFF,0xFF,0xAF,0xB9,0x80,0x00, + + 0x0C,0x4C,0x04,0x00,0x18,0x2E,0x6F,0xD8,0xC1,0xBF,0x43,0xCC,0x56,0xBD,0x51,0xEF, + + 0xE0,0xCE,0x90,0x11,0x15,0x01,0x47,0x32,0x32,0x41,0x45,0x36,0x2A,0x61,0xB6,0x85, + + 0xC0,0xB8,0x35,0x67,0xF1,0x38,0xEA,0xA5,0xC4,0x54,0x6B,0x2D,0x2D,0xAD,0x60,0xEA, + + 0xEA,0x06,0xE1,0x97,0x90,0x5B,0xC6,0x31,0xB6,0x4F,0xC2,0xB7,0xAE,0x63,0x38,0xC2, + + 0x01,0xE2,0x00,0x44,0x62,0xD1,0x22,0x80,0x06,0xCF,0xA8,0xE6,0x57,0x5D,0x31,0xB8, + + 0x09,0xCE,0xEE,0x59,0x97,0x81,0x5A,0x5E,0xB5,0x30,0x50,0xB1,0xF2,0xEF,0x79,0x31, + + 0x9A,0x0F,0xC4,0xC1,0x92,0xB7,0x7A,0x8F,0x7D,0x42,0xA9,0x42,0x71,0x60,0x4D,0xB9, + + 0x89,0xCA,0x48,0x52,0xEC,0x23,0xAE,0x2E,0x7E,0xBB,0x22,0x97,0x72,0xED,0xA9,0xE0, + + 0x08,0xF3,0xD8,0x09,0xBB,0x53,0xD2,0x2C,0x3E,0x53,0x49,0x6C,0x5E,0x28,0xE5,0xE2, + + 0x62,0x99,0xEA,0xE1,0x19,0xF2,0xA5,0xCE,0xCB,0x43,0x9A,0xC1,0x59,0xB2,0x03,0x7B, + + 0x2F,0x1A,0xC3,0xF4,0x98,0xB1,0xD3,0x57,0x2F,0x5A,0xF2,0xD4,0x58,0xF1,0x24,0xE8, + + 0xD1,0x0E,0xEA,0x99,0x9D,0x3D,0xFD,0xC9,0x8D,0x44,0xFB,0xB9,0xDD,0xB8,0x1A,0xA7, + + 0x0C,0x0C,0x19,0x44,0x9D,0x2B,0xF9,0x06,0x9F,0x42,0xAD,0x8E,0x87,0xB1,0x58,0xDC, + + 0x4B,0xA5,0xBA,0x82,0xF4,0x6F,0xF9,0x70,0x97,0x7D,0xBA,0x3C,0x75,0xE6,0x16,0x29, + + 0xEE,0x05,0x73,0xFF,0xB4,0x62,0x3B,0xEF,0x36,0x0F,0x7C,0xE9,0xD6,0x98,0x71,0xB6, + + 0x70,0x90,0xCB,0xE4,0x44,0x20,0x78,0x75,0x13,0x3F,0xDF,0x9F,0xFF,0xD3,0x04,0x80, + + 0x78,0xF8,0x84,0x7C,0xB2,0xCB,0xAB,0x94,0x87,0x42,0xEC,0x83,0x13,0x58,0xDE,0xB0, + + 0x26,0xE9,0x0C,0x1E,0x4A,0x38,0xA6,0x38,0x24,0x58,0xE4,0x93,0x12,0x69,0x4F,0x28, + + 0x82,0x11,0x85,0x79,0x10,0x70,0xAE,0x15,0x07,0x42,0xED,0x82,0x93,0x18,0x02,0x1D, + + 0xDA,0x02,0xD6,0x95,0xCE,0x33,0x1C,0x33,0xE8,0xBE,0xE5,0x92,0x10,0x7C,0xF3,0xC1, + + 0xAF,0x18,0xC4,0xFC,0xCE,0x64,0xBB,0x0E,0xE7,0xF3,0x60,0x9B,0xD1,0xC9,0xAA,0x21, + + 0xE9,0x55,0x49,0x50,0x33,0xA4,0xDD,0xF7,0x14,0x51,0xBC,0xB0,0x4E,0x7A,0x2D,0xDF, + + 0x64,0xE2,0x05,0xC5,0xC2,0xC3,0x73,0xEC,0x66,0xF2,0x11,0x60,0xB1,0x85,0x13,0x43, + + 0xA7,0x9A,0xEB,0xDC,0x37,0x93,0x82,0xE1,0x64,0x50,0x4D,0xEB,0xE3,0x83,0xD9,0x89, + + 0x2E,0x78,0x5D,0x0E,0x3E,0x78,0x4C,0x47,0xCB,0x5C,0xF6,0xE8,0x0C,0xF5,0x6E,0x58, + + 0xE7,0x92,0x74,0x94,0xC4,0xF6,0x26,0xC8,0x24,0x50,0xE6,0x3E,0x7A,0x9F,0x19,0xFB, + + 0x43,0x18,0x54,0x65,0xBE,0xE7,0xEC,0x2B,0x68,0x9B,0xEF,0x2F,0xF9,0x22,0x0D,0x7B, + + 0x2B,0x33,0x04,0xFD,0xA9,0x3D,0x9B,0xBD,0xE1,0x55,0xA7,0xCD,0xB5,0x72,0x38,0x56, + + 0xC1,0xEA,0xC7,0xCB,0x9B,0x59,0xE6,0x5A,0x44,0x19,0xD3,0x2A,0x90,0x30,0x2D,0x2B, + + 0xCF,0xB2,0x23,0x36,0xBE,0x3A,0xB1,0x0A,0x6D,0x5D,0x76,0x5F,0x04,0x7C,0x19,0x52, + + 0xBA,0xB1,0x38,0x49,0xBA,0xAF,0xA1,0x4C,0x6F,0x59,0x27,0x69,0xBA,0xD6,0xF9,0x28, + + 0x43,0x4F,0x27,0x7E,0xBD,0x5F,0x08,0x27,0x12,0x21,0x1F,0xFD,0x8B,0xF2,0x7E,0x1F, + + 0x54,0x2B,0xFF,0x86,0x67,0xA0,0x50,0x62,0x59,0x4B,0xE9,0xA3,0xA9,0x21,0xD7,0x16, + + 0x05,0x59,0x68,0x12,0x63,0xBA,0x67,0x32,0x36,0xCD,0x42,0x3E,0xB0,0xF3,0x04,0x03, + + 0xEF,0xA6,0x7E,0x07,0xE3,0xA4,0x35,0xC1,0xFB,0xC6,0x4B,0xAF,0x21,0x21,0x96,0xEE, + + 0x95,0xE0,0x69,0x69,0x72,0xB3,0xE6,0x33,0xB2,0xCB,0x33,0x57,0xC5,0xE5,0x9F,0xBC, + + 0x00,0xC4,0x0D,0x3C,0x93,0xA3,0x98,0xD1,0xC3,0x83,0x4F,0x3D,0xAF,0x6E,0x13,0xAD, + + 0xF0,0xC7,0xE9,0x49,0x0F,0x31,0xB8,0x72,0x37,0x30,0xCA,0x89,0xD5,0xAD,0xDB,0x31, + + 0x39,0x39,0x09,0xE4,0xB2,0x72,0xD9,0xC0,0xB9,0xB5,0x75,0x96,0x75,0xE4,0xED,0x66, + + 0x66,0x78,0x68,0x4C,0x8B,0xE9,0x39,0xF7,0xC7,0x56,0xD9,0x15,0x60,0x82,0xC2,0xBC, + + 0x8B,0x8F,0x1D,0xF8,0x49,0xA1,0xF2,0x2E,0xDE,0x73,0xBE,0x59,0x3F,0x97,0xBA,0x1E, + + 0x10,0x0B,0xF0,0xF1,0xBE,0xAD,0x3A,0xC6,0xCC,0x8B,0x9A,0x0A,0x3E,0x21,0x8B,0xA9, + + 0x53,0x65,0xA2,0x8D,0x95,0x47,0x13,0xD3,0xCC,0x31,0xCB,0x2D,0x2B,0xEC,0xBB,0xF9, + + 0x21,0xCA,0x50,0xF2,0xBC,0x10,0xBB,0x87,0xFE,0xA9,0xC3,0x18,0xBE,0x73,0x99,0xCE, + + 0x02,0x30,0x94,0x08,0xB8,0xEE,0xC5,0x62,0x48,0xCC,0xCA,0xBE,0x83,0x93,0x68,0x63, + + 0x09,0x8D,0x35,0x5A,0x19,0xAD,0x7A,0x42,0x30,0xDD,0x47,0x23,0xA0,0xEB,0xA3,0x5B, + + 0xCC,0xCC,0xE1,0x1E,0x1B,0x89,0x60,0x54,0xD6,0x8C,0x4A,0x3E,0x7D,0x31,0x3C,0x7F, + + 0x00,0x8D,0xF8,0x2D,0x60,0xED,0x93,0xD9,0x4A,0xC8,0x73,0x7D,0x2A,0xE0,0x80,0xE0, + + 0x65,0x10,0xA8,0xF1,0x57,0xCF,0x80,0xC0,0x05,0x28,0xCD,0x24,0x7D,0x96,0x76,0x93, + + 0x86,0x97,0xEC,0x97,0x0A,0xB5,0x54,0x95,0xC4,0x58,0xDC,0xF7,0xB9,0x7A,0x5D,0x01, + + 0xA1,0x63,0xDD,0x85,0x43,0x19,0x2D,0xA6,0xE0,0xF2,0x8D,0xF7,0xF0,0xFD,0xA5,0xAF, + + 0x06,0x95,0xF2,0x97,0xC6,0xB5,0xB2,0xD3,0xE9,0x93,0xB9,0x55,0x77,0xF9,0x1A,0xF0, + + 0xA3,0x82,0x99,0x42,0x76,0x9E,0x49,0xA4,0xC4,0x9A,0x0B,0x62,0x76,0x65,0x35,0xC6, + + 0xAA,0xF6,0x53,0x46,0x16,0x85,0xDB,0xFB,0xB7,0x85,0xEF,0xC9,0x6F,0xB7,0x5A,0x9D, + + 0x57,0x4A,0x75,0x99,0x4F,0x6A,0x01,0xC7,0x32,0xC6,0x42,0xEF,0xF0,0xF6,0xC6,0x76, + + 0x72,0x89,0xEF,0x37,0xCB,0xB1,0x5A,0xFE,0x60,0x70,0xFD,0xCF,0x72,0xF0,0x6E,0x1D, + + 0x4F,0x38,0x9C,0x71,0xCB,0xFA,0x32,0x68,0xC0,0xD5,0x50,0xCC,0x1D,0xE8,0x74,0x9B, + + 0x8E,0xFC,0xF5,0x9E,0x42,0xB9,0xBE,0xBB,0xEE,0xBC,0x1A,0xDC,0x3E,0x86,0x5F,0x09, + + 0xAD,0xC2,0x27,0x05,0xC7,0xBE,0x2D,0xFB,0xCD,0xBA,0xAF,0x45,0x7E,0xD2,0x15,0x79, + + 0x92,0x9F,0x74,0x1D,0xBB,0xFB,0x07,0xCB,0xF4,0xD2,0xC7,0xDD,0xBC,0xEB,0x1B,0x39, + + 0xF6,0x48,0xEE,0x6B,0xDF,0xB3,0xDE,0x4C,0xEB,0xFB,0x1E,0x4D,0x78,0x9C,0x86,0x50, + + 0x0D,0x4B,0xD6,0x0E,0xE0,0xB2,0x6D,0x88,0x90,0x9F,0x6E,0xB8,0xD5,0x06,0x44,0x3A, + + 0x32,0xDE,0x77,0x4D,0xBB,0xD4,0xA8,0xEE,0xE8,0xDE,0x8A,0x6B,0xBE,0xD4,0x10,0xA8, + + 0x45,0x37,0x8F,0x9B,0xCE,0x32,0x7F,0xC3,0x13,0xCF,0xF9,0x7B,0xFF,0x6E,0xDF,0x15, + + 0x87,0x07,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0xE0,0xB2, + + 0xA5,0x86,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0xA9,0xA3, + + 0x5F,0x5D,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0xE9,0x11, + + 0x04,0x04,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x12,0x08, + + 0xED,0x49,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0xCA,0x08, + + 0x40,0x45,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0xEB,0xBA, + + 0x0D,0x4D,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x7F,0xE4, + + 0xA8,0x49,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x74,0x46, + + 0x8A,0xEF,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x8E,0x14, + + 0x21,0x80,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x95,0xC7, + + 0x0A,0xE9,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0xA5,0x33, + + 0x26,0x34,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x96,0xCE, + + 0x82,0xE3,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0xA6,0x3A, + + 0xAE,0x3E,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x05,0x0D, + + 0xA8,0x8B,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x9F,0xBD, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x3A, + + 0x81,0x87,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x55,0x96, + + 0x45,0xAB,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0xC9,0xA0, + + 0x82,0xE2,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0xB9,0x55, + + 0x2F,0x78,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x24,0x8E, + + 0x0C,0x19,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x9A,0xA8, + + 0x23,0xC5,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0xFC,0x03, + + 0x0B,0x8D,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x5B,0xC4, + + 0x62,0xC7,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x8F,0x95,0x80,0x00, + + 0x0C,0x4C,0xF9,0xE6,0x92,0x08,0x0A,0x28,0x63,0x78,0x15,0xE2,0xBA,0x2C,0x51,0xEF, + + 0xE0,0xCE,0xF0,0x76,0x50,0x31,0x30,0xCF,0xB6,0x03,0x4D,0xB0,0x55,0x90,0xB6,0x85, + + 0x80,0xD1,0x25,0x67,0xD3,0x5D,0xCC,0x23,0x3B,0xD9,0x61,0x63,0x7A,0x99,0x60,0xEA, + + 0x03,0x27,0xF1,0x97,0x92,0xC5,0x1D,0xD8,0xBA,0x47,0x46,0x34,0xD7,0x23,0xD0,0x1B, + + 0xFF,0xB8,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x30,0xD0, + + 0xE3,0xFA,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x7E,0x91, + + 0x8E,0xAD,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x29,0x15, + + 0x03,0x0A,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x0A,0xF5, + + 0x89,0xD3,0xD8,0xE7,0xBB,0x33,0x49,0x28,0x37,0x48,0x05,0x13,0x48,0x2A,0xE5,0xE2, + + 0xDE,0x56,0xCA,0x6A,0x3A,0x56,0xDD,0xD0,0x43,0x94,0x5A,0x38,0x25,0x92,0x8C,0x7B, + + 0x2B,0x6F,0xC3,0xF9,0x90,0x31,0xC8,0x6B,0xCE,0x6A,0x13,0x10,0x24,0x5A,0x55,0x3B, + + 0x5C,0x10,0x0B,0x1D,0xAF,0x45,0xE1,0x31,0x34,0x84,0x9A,0xFB,0x7B,0x27,0xBB,0x6F, + + 0xAB,0x86,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x32,0xA6, + + 0xB6,0xF5,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0xEC,0xA6, + + 0x3F,0xA6,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0xB4,0xDB, + + 0x8E,0x0B,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0x05,0x77,0xD0,0x7C,0x3C,0x24,0x68,0xA2,0x79,0xCF,0xF5,0x77,0xDE,0xB0, + + 0x26,0xE9,0x27,0x7C,0x75,0x5D,0xE6,0x38,0x94,0x92,0xA3,0xEA,0x8C,0xF3,0x4F,0x28, + + 0x82,0x11,0xE4,0xFE,0x65,0xAF,0x4C,0x25,0x1D,0x93,0x7D,0x06,0xD4,0xAE,0x02,0x1D, + + 0xDA,0x02,0x59,0xCB,0x9F,0xEF,0xE7,0x59,0xE7,0x9E,0x85,0xBC,0xB1,0x78,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xD9,0x89, + + 0x2E,0x38,0xEF,0x67,0xD3,0x8C,0x57,0xFC,0x49,0x48,0x01,0x2E,0x79,0x1B,0x36,0x70, + + 0x27,0xD6,0x0E,0x5A,0xAB,0x3A,0xE3,0x5A,0xE9,0x86,0x16,0x79,0xD8,0xF3,0xA9,0x0B, + + 0xAB,0xFC,0x24,0x97,0xD3,0x4E,0x77,0xE8,0x05,0xD1,0xAD,0x4F,0xDC,0x7C,0x55,0x6B, + + 0x0A,0x1D,0x6C,0x66,0x50,0x9C,0x25,0x51,0xE7,0x94,0x70,0x5F,0x7B,0x33,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0xFF, + + 0x04,0x0D,0xE0,0x39,0x1C,0xCC,0x50,0xE2,0x8A,0x4B,0xC0,0xF9,0xE3,0xAC,0x76,0x0A, + + 0xDC,0x2A,0x0F,0x81,0x7E,0x07,0xB5,0xC2,0x4D,0xCE,0x9E,0x3A,0xD9,0x3A,0xD9,0x0B, + + 0x5B,0x1D,0x89,0xC5,0x40,0x64,0xCB,0xC1,0x46,0xCA,0xC7,0x34,0xC8,0xA6,0x2E,0x31, + + 0xEE,0x73,0x29,0xE6,0x57,0xE3,0xE4,0x31,0xBE,0xC3,0x99,0xCA,0x95,0xAD,0xDB,0xA0, + + 0xAA,0x79,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x22,0xEF, + + 0x85,0xCD,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x19,0x38, + + 0x88,0xE4,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0xF4,0xB1, + + 0xA3,0x7A,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x21,0xFB, + + 0x94,0x88,0x98,0xFD,0xCA,0x07,0x69,0x68,0x33,0xC8,0xC2,0x08,0xBE,0x8B,0x2A,0x46, + + 0x09,0xF1,0xD4,0x84,0xF6,0x6C,0x67,0xC3,0xCD,0x52,0xCA,0xE1,0xBE,0xAB,0x7D,0x08, + + 0x73,0xCA,0x44,0xFE,0x46,0xBA,0xE8,0x6B,0xCA,0xEA,0x03,0x98,0xF2,0xA6,0x69,0x3F, + + 0xA9,0x8B,0xD5,0x28,0xF6,0x0E,0x3B,0xC6,0xCD,0x10,0x3B,0x87,0x0A,0x56,0xBD,0x42, + + 0x20,0xCA,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x1A,0x85, + + 0xE0,0xCC,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x91,0x8D, + + 0x2C,0xC2,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x13,0x7C, + + 0xAB,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x28,0x85, + + 0x85,0x18,0xAA,0x34,0x17,0x70,0x54,0x62,0xAA,0x5B,0xAF,0xD4,0xD7,0xF6,0xBB,0x62, + + 0x2D,0x9E,0x8C,0x86,0x81,0x66,0xAF,0xC0,0xC6,0xD7,0xC4,0x34,0x70,0x9B,0x27,0x61, + + 0x26,0xDA,0xFF,0xDD,0x03,0xCD,0xCB,0x41,0x66,0x9A,0x3D,0xCE,0x57,0x97,0x4D,0xD7, + + 0xD1,0x9C,0x18,0x28,0x68,0xCE,0x35,0xFF,0x46,0xD5,0x85,0x67,0x02,0xFC,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x46,0x4A, + + 0xE2,0x13,0x09,0xD0,0x89,0x64,0x3A,0x2D,0xCD,0x50,0x8E,0x7E,0x87,0xF7,0xA7,0x6A, + + 0x25,0x96,0x3E,0x80,0x2D,0x4D,0x98,0x4A,0x65,0xD6,0x3E,0xBF,0xFF,0xF1,0x59,0x69, + + 0x2E,0x92,0xCF,0x4D,0x3A,0x4F,0xB7,0x49,0x6E,0xF2,0x18,0xD1,0x21,0xB8,0x9B,0xE9, + + 0x0E,0x56,0xAA,0x85,0xA9,0x0F,0x5F,0x7B,0x23,0x50,0x6B,0x4F,0xF5,0xF4,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x46,0x75,0x80,0x00, + + 0x0C,0x4C,0x88,0x49,0x73,0x00,0x6E,0xA0,0xC0,0xF3,0x26,0xD5,0xB8,0x30,0x51,0xEF, + + 0xE0,0xCE,0x88,0xE9,0x11,0xFA,0x41,0xB5,0x26,0x48,0xA7,0x6A,0xA0,0xBD,0xB6,0x85, + + 0x80,0x91,0xF9,0xFC,0x10,0xB9,0xAE,0x93,0x74,0xD2,0xEF,0x17,0x55,0x74,0x60,0xEA, + + 0xEA,0x06,0xA1,0x91,0x99,0x6A,0x18,0xC5,0xC1,0xE8,0xC0,0x21,0x5C,0x00,0x15,0x9E, + + 0xFB,0x7A,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x3C,0x74, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x7C,0x07, + + 0x20,0x48,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xA9,0xE0, + + 0x08,0xF3,0xDB,0x98,0xE5,0xE9,0x52,0x29,0xC8,0xF9,0x39,0x89,0x8D,0x76,0xE5,0xE2, + + 0x62,0x99,0x70,0x14,0xFC,0x3B,0x43,0xBD,0x6B,0x44,0xB9,0xCD,0xC5,0x29,0x03,0x7B, + + 0x2F,0x1A,0x79,0x85,0x6D,0xE9,0x29,0xDA,0xCA,0xB7,0xEE,0xDE,0x00,0xBE,0x24,0xE8, + + 0xD1,0x0E,0x01,0x7D,0x93,0x30,0x19,0xCD,0x69,0x4F,0x73,0xB7,0xFB,0xBD,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x78,0xF8,0xE4,0x44,0xF2,0xBB,0xEE,0xD2,0x53,0xB2,0xB7,0xA8,0xA8,0x00,0xDE,0xB0, + + 0x26,0xE9,0x48,0xF6,0x72,0xDE,0x46,0xB1,0xC2,0x57,0x34,0x17,0x0E,0x02,0x4F,0x28, + + 0x82,0x11,0x7A,0x67,0x32,0x3A,0xEF,0x23,0xE5,0xA3,0x7D,0x16,0x75,0x35,0x02,0x1D, + + 0x92,0xF1,0xF5,0xF7,0xF2,0xCE,0x95,0x8D,0x42,0x55,0x5D,0xB5,0x81,0x86,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xDC,0x84, + + 0x1B,0xFA,0xFE,0x0E,0x39,0xDF,0x1E,0xE5,0xCB,0x5E,0xD6,0x28,0x78,0xE9,0x6E,0xD8, + + 0x27,0x14,0x86,0x33,0x9A,0x39,0xDA,0xCE,0x9E,0x49,0x8D,0x83,0x61,0x3B,0xC5,0xFF, + + 0x8B,0x45,0xDD,0x8C,0x1B,0x3C,0x1F,0xE5,0x4B,0x41,0x20,0xA5,0xFE,0x7A,0x05,0x91, + + 0x0A,0x16,0xD1,0x8A,0xB1,0x3B,0xA5,0x46,0xDA,0x79,0x9F,0x85,0x86,0x6B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x7E,0x1F, + + 0x54,0x2B,0x66,0x70,0x50,0xCC,0xB0,0xD6,0x65,0xD0,0xCF,0x55,0xBE,0x48,0xD7,0x16, + + 0x05,0x59,0xC8,0x57,0xF8,0x2A,0x82,0x75,0x4B,0xC8,0x93,0xD8,0xEA,0xE5,0x04,0x03, + + 0xEF,0xA6,0xC3,0x02,0x95,0x14,0xEB,0x23,0xF7,0xD0,0xC3,0xC7,0x90,0x69,0x96,0xEE, + + 0x95,0xE0,0x54,0xF5,0x15,0x7C,0x7B,0xDB,0xC3,0x4E,0xBB,0x19,0x23,0x96,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xC2,0xBC, + + 0x8B,0x8F,0xC2,0x4A,0x68,0x25,0xA0,0xDC,0x5E,0x43,0x45,0x71,0xE1,0x14,0xBA,0xF8, + + 0xA1,0xC8,0xF0,0x1B,0xBE,0xAF,0x78,0x48,0x29,0x06,0xD2,0xB8,0xA1,0xA8,0x8B,0xA9, + + 0x53,0x65,0xDB,0x8D,0x9D,0xD2,0x73,0x9F,0x2B,0xD1,0x18,0x41,0x09,0xE4,0xBB,0x1B, + + 0x8D,0x8B,0xA3,0x53,0x7C,0xA4,0x7A,0xCB,0xCF,0x08,0x18,0x37,0x01,0xDB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x2E,0x02, + + 0x87,0x96,0x84,0x6D,0xBB,0xB2,0x8E,0x58,0x74,0x1D,0x5C,0x04,0xF1,0xF7,0x6D,0x64, + + 0x16,0xB3,0xC4,0x88,0xF3,0x45,0x38,0x08,0xE7,0xD9,0x9A,0xBB,0xF1,0x55,0x6D,0x11, + + 0x05,0x89,0x12,0x86,0x39,0xBE,0x4A,0x4E,0xC4,0x90,0x5A,0x49,0x71,0x55,0xF7,0xF1, + + 0xB5,0x58,0x4B,0x66,0x7F,0xF3,0xB0,0xC1,0x46,0x68,0x3C,0xB0,0x82,0xF7,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x62, + + 0x3E,0x55,0xF8,0x1C,0x38,0x35,0x16,0x50,0x93,0x03,0x69,0xBE,0xFB,0xFF,0x77,0x1F, + + 0x4A,0x95,0xF0,0x05,0x2D,0x16,0x67,0x2B,0x98,0x16,0x48,0x1B,0xF8,0xFE,0xD8,0x39, + + 0x7D,0x0A,0xD9,0x11,0x57,0x4C,0x1F,0x2F,0xE4,0x93,0x07,0x1D,0xD2,0xBF,0x2E,0x6F, + + 0xAD,0x16,0xCC,0x6C,0x59,0x14,0x3E,0xC4,0x0A,0xDD,0x50,0x4D,0xFB,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x29,0x22,0x59,0x0E, + + 0xE5,0x0B,0xC8,0x90,0xF9,0x89,0x40,0x06,0xAD,0x22,0xEE,0x18,0x56,0x62,0x46,0xAA, + + 0xD5,0x72,0x5E,0x53,0xCF,0x29,0xDC,0xC3,0x6B,0xEC,0x5B,0x47,0x78,0xE3,0x81,0x60, + + 0xB4,0x40,0x93,0xFB,0x6F,0x8F,0x6F,0x81,0x29,0x61,0x25,0x56,0xBE,0x6B,0xAE,0xA9, + + 0x87,0x21,0x09,0x54,0xFD,0x61,0x8E,0x0F,0xB5,0x58,0xE6,0x46,0xE3,0x0F,0xBF,0xF1, + + 0x3C,0xAB,0x99,0xA8,0xB7,0xA4,0x68,0x10,0x4A,0x4F,0x10,0xE5,0xF7,0x11,0xC8,0x31, + + 0x67,0xA8,0x08,0x31,0x2F,0xD0,0x8B,0x41,0xE2,0xBA,0xC0,0xB4,0x1C,0x30,0x94,0x32, + + 0xEC,0x0D,0x39,0xC1,0x90,0x9D,0xD1,0x00,0xA6,0xEB,0x1E,0x0A,0x5D,0xC0,0x18,0xB1, + + 0x87,0x2E,0x9A,0x6B,0xAD,0x65,0x67,0xC8,0xC5,0x45,0x96,0x1B,0x5C,0xC1,0xB1,0x8C, + + 0x0A,0x38,0xC6,0xBA,0x72,0x5B,0x92,0x76,0xEC,0xA5,0xF5,0xEC,0x1A,0x2A,0x74,0xB4, + + 0xE0,0xA0,0x8C,0xAC,0xF0,0x80,0x63,0xCB,0x67,0x9D,0xE4,0x85,0xD4,0xC4,0x7D,0xA0, + + 0x24,0x07,0xFD,0xB4,0x91,0xCB,0xD7,0x77,0xC6,0x54,0xD7,0x9B,0xB2,0x19,0xF6,0xF5, + + 0x89,0xDE,0x99,0x1C,0x66,0xA6,0xCB,0x4B,0x22,0xC8,0xC8,0xA2,0x32,0x63,0xD0,0xCC, + + 0x00,0xCB,0x88,0x34,0x9A,0x6E,0x57,0x9B,0x3A,0x29,0x19,0xAC,0x0B,0x11,0x91,0x58, + + 0xE2,0x9E,0x1E,0x2F,0x3D,0x6F,0x52,0x49,0xEA,0xB2,0x63,0x41,0x5D,0x6F,0x15,0xE4, + + 0x61,0xBD,0x2F,0x3E,0xFC,0x88,0x6B,0x9A,0xB2,0xE3,0x2C,0xE9,0xD0,0x9D,0x5D,0x28, + + 0x60,0x07,0x8B,0xAD,0x9A,0xEF,0x65,0xC4,0xCD,0x4D,0xDB,0x8E,0xAF,0x0A,0x66,0x84, + + 0x23,0x32,0x96,0x7B,0xCF,0xBD,0x10,0x46,0x48,0x02,0x73,0x64,0x76,0x32,0x8E,0x14, + + 0x29,0x76,0xCC,0xA3,0xD8,0xD2,0x08,0x9B,0x49,0xBF,0xCF,0x27,0x18,0xDE,0xC5,0x00, + + 0xB6,0xA9,0xD7,0x7A,0x47,0x70,0x01,0x1D,0xC8,0xC8,0xD5,0x03,0x7D,0xDF,0x52,0x99, + + 0xA7,0x31,0x95,0x8D,0x3E,0xB5,0x09,0x5A,0xE7,0x51,0x95,0xC6,0xCF,0xF5,0xC2,0xB3, + + 0x48,0x5B,0x94,0x5C,0x36,0x10,0x4E,0xE2,0xF0,0x5C,0xB2,0xD9,0x8D,0xA9,0x50,0xD0, + + 0xAC,0xB8,0x96,0x4A,0x5B,0x36,0x98,0x0A,0x9E,0x37,0x62,0xE1,0xFE,0xF8,0x44,0xB2, + + 0xC4,0x59,0x90,0xB7,0x59,0x35,0x49,0x9F,0x46,0xBB,0xB3,0xD9,0x05,0x75,0x9F,0x42, + + 0x8D,0xBA,0xB3,0xD3,0x52,0xB4,0x22,0x82,0x93,0x12,0x3A,0x0A,0x12,0xA1,0xC2,0x71, + + 0x24,0x1C,0x82,0x4C,0x3C,0x10,0xA2,0xDB,0x41,0xDA,0x96,0x5F,0x06,0x50,0x51,0x8D, + + 0x2F,0x39,0x82,0xA9,0x71,0xBA,0x79,0x78,0x23,0xF4,0x80,0x47,0x0A,0x79,0x84,0x0D, + + 0xA2,0x48,0x11,0x09,0xBA,0x7D,0x68,0xDA,0xDA,0x36,0xC8,0xBC,0x9A,0xD7,0xFB,0x80, + + 0xAF,0x39,0xB1,0xA1,0x1D,0xD6,0x03,0x89,0x1E,0xE4,0x89,0xDF,0x06,0xE6,0x96,0x4C, + + 0x28,0x97,0x6F,0x3F,0xB6,0x31,0xE8,0x6D,0x9D,0xF1,0x2D,0xAB,0x87,0xDA,0x70,0x64, + + 0xC8,0x16,0xF4,0x2F,0x4B,0x92,0x8C,0x86,0x19,0xF2,0x45,0x76,0x78,0x37,0x0F,0xCD, + + 0x83,0xDF,0x9F,0xC9,0x32,0xEF,0x40,0x6C,0x92,0xF1,0x83,0x1D,0x7A,0x61,0xCB,0xAA, + + 0xD1,0x90,0xD8,0xAE,0x99,0x9E,0x09,0x3E,0x02,0x9C,0x5E,0xFF,0x0F,0x0F,0xF5,0x3D, + + 0x76,0x3F,0x60,0x86,0xDE,0x0D,0x0E,0x92,0xC9,0x46,0x8E,0x8B,0x82,0x4F,0xE9,0x0D, + + 0x37,0x54,0xCA,0x17,0x16,0xE1,0x38,0xC2,0xBA,0x6E,0xEA,0xC6,0x51,0x40,0x7A,0x03, + + 0x82,0xC2,0xF0,0x67,0xDE,0xCC,0x30,0x63,0xC0,0xE2,0x66,0x66,0xAF,0x42,0xFC,0x2C, + + 0xF7,0x3F,0xA5,0x22,0x7C,0x30,0x6E,0xC0,0xB3,0x6E,0xEA,0xC4,0xA7,0x6E,0xDB,0xF3, + + 0x38,0x2B,0x20,0xC6,0x6D,0xE6,0x75,0x9C,0xEA,0xC9,0xC8,0x95,0x2A,0x8A,0x28,0xAB, + + 0xA6,0x0C,0xEC,0x74,0x33,0x2E,0x1E,0x4B,0xAE,0x54,0xE2,0x74,0xE4,0x48,0xB6,0x02, + + 0xFD,0xC4,0x7D,0x6A,0xDE,0x25,0x8E,0xA4,0x2F,0x95,0x97,0x5E,0x3F,0x77,0x6D,0xB3, + + 0x83,0xAE,0xED,0xB5,0x6B,0x34,0x63,0x71,0x74,0x6A,0x6A,0x07,0x57,0xF1,0x9F,0x51, + + 0x7F,0x88,0xC4,0x7F,0xF7,0x7B,0x60,0x98,0x5C,0xC8,0xE4,0x83,0xB7,0x9B,0xFC,0xBA, + + 0x1F,0xBB,0xD4,0xA7,0x14,0x48,0x5A,0x5A,0xBB,0x68,0xF9,0x4D,0x74,0x6B,0xE3,0x0F, + + 0x9A,0x3E,0x9D,0xA2,0x5E,0xAA,0x3B,0x2F,0xC5,0x2B,0x73,0xAE,0xB3,0xE0,0x72,0x14, + + 0x68,0xE7,0xAD,0xAF,0x74,0x02,0x03,0xDE,0xC5,0x17,0x44,0x4C,0xEF,0x87,0xF0,0xCE, + + 0x04,0x59,0x51,0xE3,0x18,0x44,0x27,0x1A,0xCE,0xDA,0xFA,0x7A,0x96,0x3D,0x2A,0x33, + + 0x0E,0x5D,0x8D,0x3C,0xF4,0x8E,0xAB,0xE5,0xBA,0x44,0x3A,0xFF,0xAE,0xE0,0xA3,0xCB, + + 0x96,0xCC,0xF4,0x6B,0x1C,0xAA,0x7B,0x8B,0x41,0x63,0xE0,0x7C,0xA2,0x5F,0xAB,0xDB, + + 0xF9,0x85,0xB3,0x5B,0x17,0x16,0x5B,0x91,0x26,0xFC,0x00,0x58,0x7E,0x83,0xE0,0x7B, + + 0x6C,0xD2,0x60,0x75,0x12,0x1D,0x0A,0x0A,0xE9,0x66,0x74,0x26,0xBE,0x5D,0xEC,0x96, + + 0x33,0x45,0x92,0xAB,0xC1,0x60,0x02,0x0A,0x19,0x7E,0xF8,0x43,0x76,0x81,0x21,0x24, + + 0xDF,0x82,0x32,0x02,0x5F,0xD1,0x3D,0xA7,0xED,0x33,0xE4,0xC7,0xF6,0xB0,0x7D,0x8C, + + 0x8F,0x88,0xF4,0x92,0x60,0xF6,0xEE,0xCD,0x65,0x92,0x7D,0x37,0x53,0x5E,0x7C,0x4B, + + 0xCF,0x47,0xDC,0xF7,0x97,0x35,0x12,0x43,0x8F,0xD7,0xD4,0xC1,0xFB,0xEF,0x3B,0x56, + + 0x25,0xA5,0xBE,0x9D,0xDC,0xD1,0x2B,0x76,0x6D,0x00,0xC2,0xCE,0x71,0xF7,0x73,0xA1, + + 0x59,0x3B,0x5D,0x34,0x32,0x3B,0xB5,0x63,0x85,0xDE,0x83,0x81,0x3C,0x47,0x96,0xF4, + + 0x06,0xFB,0x2D,0xC7,0x8C,0x43,0xBD,0x73,0xFF,0x95,0xF3,0x37,0x89,0x7C,0x0E,0xEC, + + 0x0F,0xE8,0x18,0x0B,0xE9,0xDA,0x30,0x1A,0x85,0x71,0xE5,0x97,0x97,0xF0,0x77,0x76, + + 0x88,0xF7,0x90,0xA3,0xE3,0x16,0x6C,0x45,0x6B,0xDB,0xEC,0x4E,0x8A,0x58,0x7E,0x8D, + + 0x09,0x65,0xCE,0x65,0x43,0xD6,0x25,0x54,0x13,0x57,0x8C,0xAD,0xC8,0x5A,0xC8,0xDB, + + 0xFD,0x36,0x38,0xEC,0xC9,0x6D,0xDD,0x3F,0xE7,0x30,0xEC,0x4C,0x8F,0x70,0x00,0x7E, + + 0xC7,0x3F,0xFE,0xD0,0x61,0x08,0x36,0x83,0x6F,0xDD,0xE8,0xDF,0x5C,0xE3,0xEE,0xBB, + + 0x4B,0xB4,0xCE,0xB8,0x57,0xB0,0xF8,0x89,0x05,0x92,0xA8,0x03,0x77,0xBF,0xA7,0x4B, + + 0x87,0x96,0x2C,0xD5,0xE5,0xA5,0xB7,0x6B,0x98,0xD4,0x4F,0x3F,0xA2,0xF5,0x7F,0x5F, + + 0xAD,0x24,0xF9,0xBD,0xDF,0xC5,0x7E,0x88,0x89,0x90,0xF6,0x50,0xCC,0xFB,0xB8,0xFF, + + 0x06,0x22,0x40,0x84,0x0F,0x28,0x6E,0x09,0xBD,0x2C,0xC8,0x20,0x42,0x2D,0xBC,0x63, + + 0x79,0x0E,0x94,0x84,0x78,0xC0,0x34,0x6D,0x72,0x6B,0xA6,0xE8,0x38,0xDB,0xF2,0x72, + + 0xF0,0x0D,0x01,0x46,0xEA,0x8F,0x73,0x3C,0xC1,0x02,0xC9,0x21,0x59,0xD1,0x53,0x1E, + + 0xFD,0x1C,0x91,0x85,0xE6,0x23,0xA1,0xD1,0x9D,0x2D,0xC1,0x2D,0x5C,0xCE,0x38,0x67, + + 0xFF,0x0B,0xBE,0x68,0xCE,0x55,0x2F,0x1E,0x30,0xDB,0xEF,0x82,0x31,0x47,0x12,0xAF, + + 0xA4,0x69,0xB1,0x32,0x30,0x44,0x63,0xF4,0x41,0x75,0x17,0x06,0xF0,0xC8,0x1B,0x4E, + + 0xFA,0x19,0x9B,0x91,0xFA,0xC7,0x6E,0x50,0x63,0xB9,0xC7,0x50,0xD4,0x44,0xF6,0xC3, + + 0x7C,0xDA,0xEE,0x53,0x43,0x43,0xA2,0x56,0x62,0xB8,0x4F,0xF1,0xD1,0x4B,0x58,0xF7, + + 0xAF,0x64,0xBC,0x21,0x70,0x81,0x4B,0x9B,0xED,0xEE,0x8A,0xBF,0x07,0x06,0x34,0x20, + + 0x68,0x0D,0x4A,0x9C,0x15,0x6B,0x5A,0x69,0x48,0x09,0xB6,0x85,0xD4,0xC4,0x3D,0x30, + + 0x4A,0xF5,0x7C,0x73,0xF2,0x7B,0xDE,0x5A,0xDF,0x08,0xF1,0x3D,0xD9,0x2A,0x69,0x1B, + + 0x8A,0x3B,0xCB,0xD0,0x98,0x6B,0x37,0x64,0x28,0xE4,0x50,0xAE,0x82,0x05,0x58,0x4A, + + 0xC8,0x08,0xFA,0xB2,0xB6,0x21,0xBE,0xE7,0xBF,0x1A,0x12,0xED,0xCF,0x2E,0xF2,0xA7, + + 0x68,0x79,0xB0,0xBC,0x1F,0x00,0xF1,0x27,0xF6,0xB1,0x16,0x0F,0x37,0x2F,0x0B,0x45, + + 0xB9,0xCA,0xB9,0xAD,0x9E,0xF3,0x5B,0x7D,0x1F,0x13,0x93,0x32,0xDC,0x4C,0x5C,0xB3, + + 0x76,0x40,0xE5,0x46,0x1F,0xBB,0x65,0xC8,0xA3,0x5F,0x9B,0xF4,0xDD,0x4D,0x3F,0x13, + + 0x11,0x1A,0xBA,0xA9,0xFA,0x99,0x32,0x42,0x54,0xFF,0xDB,0x5B,0x91,0xF6,0x72,0x96, + + 0x42,0xE6,0x8C,0x10,0x33,0x51,0x22,0x98,0xEC,0xF7,0x33,0x04,0x71,0xAE,0x14,0x71, + + 0x53,0xA3,0x7A,0xF6,0x84,0xB4,0x80,0xD3,0x0B,0x43,0x95,0xFA,0x90,0x52,0x5E,0x62, + + 0x2D,0x1E,0x4D,0x15,0xAE,0x3B,0x03,0xF1,0xE5,0x7F,0x5D,0xB4,0x5F,0x68,0xD1,0xB3, + + 0x1E,0x1D,0xD5,0xE3,0x93,0x9B,0x0E,0x78,0xC1,0x52,0x67,0xCC,0x74,0x2D,0xDD,0xD3, + + 0xB2,0xB5,0x68,0xB6,0x84,0x50,0x24,0x18,0xAF,0x18,0x4A,0xB3,0xB1,0x85,0xC5,0xC2, + + 0x33,0xB6,0xD0,0xDE,0x36,0xA2,0xFF,0xF3,0x81,0xD4,0xFD,0xF4,0x9E,0xDB,0xDB,0xD2, + + 0x0B,0x56,0xF5,0x27,0x90,0x77,0x26,0xF9,0x46,0xE8,0x95,0xF1,0x7A,0x58,0x5E,0x18, + + 0xD1,0xB9,0x06,0xCF,0x42,0x7A,0x9B,0x2C,0x62,0x6C,0x36,0xCA,0x83,0x14,0x4E,0x91, + + 0x9E,0x7C,0xF6,0x8F,0x09,0x83,0x49,0xCB,0x55,0xF8,0x9E,0xFC,0x6D,0x62,0x3F,0x76, + + 0x59,0x58,0xC3,0x86,0xDB,0x1A,0x2F,0xC9,0xEC,0x76,0x28,0x36,0x0D,0xFC,0x37,0x76, + + 0xAF,0x39,0xA9,0xB5,0xEE,0x9F,0x27,0x46,0x00,0x0A,0xD5,0x4D,0xF1,0x34,0xE1,0x78, + + 0xF2,0xBF,0x7F,0x3E,0x19,0x55,0xE1,0xE5,0x9E,0x0C,0x46,0x9E,0x91,0x9D,0x0A,0x61, + + 0xD6,0xBC,0x6E,0xC6,0xB7,0x00,0xDF,0xE7,0x77,0x46,0xE0,0xC9,0xF6,0x8B,0x6A,0xA6, + + 0x33,0x5C,0x9A,0xC8,0xA0,0x8A,0x97,0x81,0x0A,0x8A,0x8E,0xEF,0x5F,0x81,0x4A,0x26, + + 0x5A,0xCC,0x0F,0x5D,0xE9,0xE2,0x7A,0x9F,0x18,0x4F,0x97,0x7C,0x98,0x0B,0x79,0x00, + + 0xA1,0x01,0x8C,0xBF,0xFD,0xB1,0xA6,0x51,0x28,0xAC,0xD2,0x36,0x55,0xF0,0xD0,0xFA, + + 0x85,0xCC,0xBE,0x74,0xEA,0x0C,0x14,0x6F,0x26,0x87,0xE0,0x32,0xDC,0x52,0x84,0xE9, + + 0x6D,0x33,0xB9,0x96,0x7D,0xD3,0x57,0x42,0xC5,0x82,0x8F,0x47,0xBD,0x18,0x2B,0xF5, + + 0xCD,0x80,0x38,0xB2,0x62,0x28,0x2F,0x06,0x2E,0x87,0x15,0x44,0xF4,0x45,0x39,0x9B, + + 0x00,0x04,0x44,0xB6,0xE9,0xAB,0x0E,0x6A,0xFF,0x65,0x59,0xE2,0x54,0x47,0x7D,0xD6, + + 0x0D,0xC8,0xFE,0x63,0xA4,0x28,0x61,0x72,0xC5,0xC1,0x6E,0xF2,0x55,0xAF,0x7E,0xB3, + + 0x99,0x27,0x55,0xA5,0xF5,0x2A,0x74,0x90,0xDE,0x86,0x31,0xE6,0xD9,0x4B,0x33,0x43, + + 0xEF,0xB6,0x11,0x34,0x5E,0x0A,0x76,0x11,0x06,0x4D,0x39,0xF6,0x42,0xA5,0x1C,0xAA, + + 0x81,0x0E,0x21,0x8A,0x1E,0x18,0x08,0x9A,0xF8,0x67,0x7D,0xD1,0xBD,0x6E,0x23,0x68, + + 0xF6,0x16,0x2A,0x5D,0x67,0x04,0x16,0x77,0xA4,0x28,0xC5,0x4C,0x23,0x76,0xA4,0xCB, + + 0x88,0xA3,0x63,0x8F,0x83,0xA2,0x97,0x49,0xEF,0x8A,0xB3,0x70,0xBC,0xCA,0x87,0x60, + + 0x47,0xB2,0x3D,0x7F,0xDF,0xC7,0x1D,0x4A,0x6E,0x4E,0x17,0x4C,0x8A,0x4D,0x1C,0x63, + + 0x3D,0x88,0x74,0xCA,0x1C,0x93,0xF6,0x1A,0x42,0xC5,0xB2,0x74,0x58,0xCE,0xC6,0xC8, + + 0x53,0x87,0x15,0x2D,0x73,0xEF,0x20,0xEF,0xEC,0xA8,0x63,0x3C,0xA7,0x9C,0xDB,0x5B, + + 0x29,0xC3,0xDB,0xB1,0x32,0xA3,0x31,0xE9,0x0B,0x1F,0x3F,0x6D,0x8A,0xAC,0xAB,0x4A, + + 0xBF,0x2F,0xAF,0x4A,0x3E,0x00,0x21,0xF2,0x6C,0xAA,0xC8,0x53,0x23,0xDE,0x1F,0xEC, + + 0x87,0xF5,0x32,0x5B,0xFC,0x51,0xF4,0x22,0x7C,0x4F,0xED,0xE4,0x17,0x72,0x2C,0x93, + + 0x75,0x95,0xF5,0x85,0xC4,0xFE,0x65,0x4A,0xC0,0x67,0x43,0x71,0x46,0xE5,0x98,0x61, + + 0xFC,0x25,0xBD,0x6F,0x83,0xFD,0x81,0xC1,0x1F,0xBC,0x4D,0x4F,0xC3,0xBF,0x82,0xB7, + + 0x44,0x88,0xAC,0xEC,0x12,0x3E,0x06,0x37,0xE7,0x7B,0x5F,0xF7,0xF1,0x0E,0x4B,0xBD, + + 0xFF,0x0B,0x9C,0xE1,0xCB,0xBB,0xCC,0x19,0x9A,0x64,0xE2,0xD3,0xC5,0xB9,0x57,0x56, + + 0x25,0xA5,0x7D,0xD1,0x8E,0xF7,0x4E,0xEC,0x37,0x21,0x3C,0x22,0x65,0x55,0x5A,0xF2, + + 0x07,0x69,0xC3,0xEA,0x32,0x12,0xC6,0xFB,0xE0,0xCF,0xED,0xF6,0x0A,0x17,0xDD,0xA4, + + 0xA9,0x48,0xAD,0x7F,0xB1,0x95,0x7A,0xD7,0x06,0x78,0x6B,0xF5,0x1E,0xEC,0x6C,0x6C, + + 0x1F,0x9C,0xFF,0x80,0xDB,0x4D,0x3E,0xAE,0xE5,0x6B,0x4C,0x46,0xB4,0xB5,0x77,0x98, + + 0x88,0x66,0xE4,0xE6,0x3B,0xB0,0x2F,0xDA,0x3D,0x52,0xE7,0xBC,0xD8,0x46,0xDF,0x0F, + + 0x81,0x59,0x32,0xB1,0x88,0xF8,0x09,0xDA,0xAE,0x73,0x4C,0xA7,0x59,0x05,0x39,0xF9, + + 0xC5,0x96,0xAF,0x77,0x79,0xF6,0xFF,0x3F,0xEF,0x6B,0x7F,0x3E,0x0B,0x26,0xD2,0xA8, + + 0x20,0xE3,0x2A,0xA5,0x1D,0xF1,0xE0,0x99,0x02,0x9E,0x96,0x1A,0x81,0xE7,0x3C,0xA5, + + 0x01,0x3B,0x97,0xB8,0xC4,0x36,0x05,0x89,0x03,0x9F,0xC0,0xF2,0xF2,0x9F,0xCE,0xB5, + + 0x3B,0x6B,0xBD,0x1B,0xD6,0x5F,0x37,0x30,0x16,0x9A,0xD7,0x89,0xDF,0x1E,0x57,0x25, + + 0x52,0x2E,0xC5,0xEE,0xD3,0xA0,0x3F,0x94,0x13,0x9B,0xA6,0x7D,0x18,0xBE,0xA3,0xB4, + + 0xDC,0xE3,0xE6,0xB0,0x11,0x70,0x94,0x25,0xC3,0x4D,0x92,0x77,0x50,0x60,0x6E,0xDD, + + 0xE8,0x5B,0x77,0x67,0x77,0xA2,0x70,0x52,0xFA,0x4F,0x1B,0xC7,0x0D,0xC5,0xED,0xE9, + + 0x5E,0x4F,0xBF,0xB0,0xF0,0xDD,0xEC,0xE3,0x61,0x1D,0x91,0x25,0x31,0xCD,0xC9,0x91, + + 0xC8,0x09,0x76,0xEB,0xB5,0x9F,0x21,0xDB,0xC7,0x03,0x56,0x3D,0x38,0x73,0x9D,0x41, + + 0xE3,0xBB,0x74,0x26,0x7A,0x95,0x57,0x93,0x1A,0x56,0xE8,0x84,0x09,0xC9,0x00,0x41, + + 0x13,0x24,0x64,0xD1,0xE4,0xD8,0x5B,0xF4,0x49,0xAA,0x4A,0x07,0x2F,0xEF,0x9E,0x40, + + 0x84,0xCF,0x3E,0x36,0xE2,0xF5,0xE9,0xF2,0x92,0xE9,0xC6,0xB5,0x25,0x6F,0xEA,0xD3, + + 0x46,0x0F,0x0D,0xAA,0x13,0x25,0x99,0x61,0x09,0x2B,0x22,0x15,0xF3,0x25,0xC3,0x8A, + + 0x91,0x21,0x3D,0x57,0xC9,0xF5,0xE8,0xAA,0x8D,0xC0,0x7E,0xBF,0x79,0x62,0x34,0xAD, + + 0x98,0xF4,0x66,0x67,0xDB,0x29,0xCC,0x09,0x15,0xE6,0xA4,0x35,0xD6,0xCF,0x3B,0xF6, + + 0xA9,0x68,0xA8,0x7F,0x27,0x75,0xD3,0x39,0x30,0xE7,0xCA,0x3E,0x83,0x5A,0x22,0x11, + + 0x09,0xAB,0xB0,0x8F,0x9D,0x23,0x9C,0x4A,0xAF,0xE8,0x50,0xFD,0x90,0x29,0x82,0x58, + + 0x31,0x17,0x02,0xCD,0x9A,0x8D,0x92,0x78,0x2C,0x46,0x96,0x10,0x38,0xB3,0x2A,0x0E, + + 0x0A,0x4F,0x19,0xA2,0x1D,0x0F,0x9A,0x68,0xB3,0xE0,0x3D,0x0F,0x23,0xBB,0x46,0xCD, + + 0xCA,0x54,0xD4,0xB2,0x73,0xBF,0xD1,0xED,0xC0,0xA1,0x28,0xAA,0x33,0xBF,0x0B,0x7D, + + 0x09,0xC3,0xC2,0xD9,0x91,0xE9,0xD8,0x2B,0x78,0xC5,0x93,0xFC,0xE8,0x3B,0xD2,0x04, + + 0x22,0x21,0x80,0xC4,0x2A,0xBD,0x72,0x11,0x9F,0xDB,0xAE,0x4B,0x0B,0x8F,0xF7,0x14, + + 0x2D,0x71,0x73,0x16,0xF4,0xC0,0xDC,0xD9,0x3D,0x3D,0x80,0x24,0x8E,0xDC,0xB2,0x88, + + 0x53,0xAD,0x92,0x7A,0x41,0xB1,0x17,0x32,0x82,0x8D,0x55,0xD1,0xF3,0xDF,0x65,0xF3, + + 0x1E,0x1D,0x4D,0x14,0xCD,0x71,0x27,0x2E,0x1E,0xD8,0x85,0xF2,0x2F,0x79,0xD4,0x42, + + 0xE7,0x9C,0xE2,0x26,0x59,0xD5,0xF7,0xD8,0xBE,0xE5,0xB4,0xB2,0xBA,0x79,0xC8,0xCE, + + 0xC2,0xE4,0x88,0xFC,0x10,0x75,0x67,0xBE,0x65,0x77,0xDB,0x76,0xF3,0x1C,0x85,0xD1, + + 0x99,0x54,0x42,0x54,0xDE,0x74,0xF8,0x9A,0x7F,0x0A,0x79,0x77,0xC1,0x7C,0x33,0xC8, + + 0x56,0x94,0xF9,0xF4,0x7B,0x6E,0x7D,0x0E,0x6C,0xF1,0xE5,0xD5,0x16,0xB7,0x3E,0x66, + + 0xAB,0x15,0x82,0xDF,0xC5,0x49,0x14,0x36,0x9F,0x5B,0x95,0xBF,0x59,0x68,0xCE,0x9C, + + 0xCE,0x1F,0xD5,0x9D,0x42,0x39,0xE1,0xBA,0x47,0x37,0x29,0xCD,0x7F,0xB0,0x7A,0x4B, + + 0x09,0x05,0x7A,0xF3,0x8E,0x65,0xA9,0x01,0x09,0x85,0xAD,0x42,0x83,0x5A,0xA5,0xD9, + + 0xAF,0x9B,0xEF,0xCB,0xCD,0x36,0x21,0x08,0x23,0x68,0xD7,0xAE,0xD8,0x6B,0x42,0x3B, + + 0x7A,0x5E,0xD7,0x48,0x38,0xCB,0x41,0x96,0xA0,0xCD,0x8C,0x94,0x12,0x6D,0x41,0xBA, + + 0xD4,0x91,0xF6,0x2F,0x5D,0x7F,0x57,0x03,0xE4,0xA0,0x72,0x6F,0x4E,0x77,0xDD,0xE7, + + 0x28,0x1A,0xFF,0x3E,0xD0,0x5B,0x5F,0xE4,0xEC,0x7C,0xA9,0xC5,0x13,0x6F,0x8B,0x5C, + + 0xE8,0x7F,0x8F,0x86,0x1A,0x90,0x38,0x87,0x39,0x55,0x5B,0xEE,0xCE,0x6E,0x8B,0x45, + + 0x0A,0x5C,0xE5,0x74,0x6C,0x5F,0xB3,0xD1,0x10,0x81,0xF4,0x9F,0xA9,0x41,0xFE,0x0C, + + 0x63,0x87,0x02,0xB6,0x13,0x83,0x1B,0x86,0x9D,0x22,0x43,0x11,0xF4,0x1E,0xE5,0xC9, + + 0x3F,0x2D,0x9A,0xB7,0x63,0xA4,0x92,0x93,0x18,0x61,0xB4,0xA3,0xD6,0xE2,0x83,0x53, + + 0x83,0x03,0x3E,0x93,0x9D,0x0F,0x03,0x02,0xAB,0x6C,0x79,0x5F,0xD5,0x4E,0x68,0xC6, + + 0x46,0xBF,0x45,0x40,0x82,0xC0,0x08,0x28,0x77,0x6B,0x30,0xE7,0x75,0x67,0xFF,0xA1, + + 0x1B,0x58,0x90,0x72,0xFE,0x3F,0x32,0x6F,0x56,0x6A,0xA8,0xE9,0xBE,0x14,0xA1,0x46, + + 0x52,0x0B,0x5A,0xA5,0x3A,0x5B,0xF2,0x10,0x9A,0x4A,0x0A,0x99,0x59,0x4B,0x3B,0x52, + + 0x6C,0xD7,0xF1,0x4A,0x15,0x6B,0xFE,0x34,0x05,0x18,0x1A,0x37,0x9B,0xFC,0x44,0x60, + + 0x8D,0x85,0x1F,0x33,0xA3,0xF5,0x67,0x59,0x2A,0x4B,0xB3,0x5F,0x7D,0xE3,0x02,0x78, + + 0xB0,0x85,0xF5,0x1E,0x92,0x14,0x04,0x8A,0x8F,0x49,0x39,0xCD,0x4D,0x44,0x1E,0x49, + + 0x2D,0xD7,0x70,0xE1,0xEF,0xEA,0x48,0xD8,0xFE,0xA6,0x26,0x5C,0x83,0xE3,0x13,0x25, + + 0xEB,0x7E,0xC9,0x1F,0x6C,0x2D,0x73,0xA2,0x40,0x46,0xA5,0xCD,0x9D,0x14,0x02,0x1C, + + 0x4F,0xCE,0xC4,0x2C,0x91,0x2A,0x4C,0x76,0x8C,0xCC,0x83,0x08,0xB5,0xFD,0xAA,0x4A, + + 0x18,0x8B,0xF8,0x52,0xBC,0xA9,0xA0,0x85,0x6B,0x60,0x25,0x1C,0x7D,0x20,0x61,0xA2, + + 0xBD,0xBE,0xBA,0x8F,0x82,0xA3,0x2A,0x4D,0xCF,0xAE,0xD3,0x63,0x5C,0xEA,0xC1,0x0B, + + 0x89,0x8D,0xED,0x2D,0x1D,0x63,0xFC,0x8D,0x8B,0x8E,0x7F,0x8E,0xEF,0x2C,0x13,0x00, + + 0xE1,0x18,0x5B,0x7A,0x34,0xF2,0x0A,0x12,0xAE,0xC3,0xB2,0xAF,0xF4,0x77,0x04,0xF0, + + 0x9C,0x9D,0xAB,0xBB,0x8A,0x6C,0x5A,0x1B,0x9A,0x7C,0xC2,0xBF,0x4A,0x0E,0xE5,0x93, + + 0x6E,0x8F,0xE1,0x37,0xB2,0xF0,0x3D,0x8B,0x0D,0x71,0x8B,0x7E,0xD5,0x82,0x15,0xFD, + + 0x24,0x9E,0x7C,0x69,0x68,0xCE,0x6F,0x20,0xD7,0x0C,0x87,0x4C,0x8A,0x0C,0x34,0xA0, + + 0x72,0xF8,0x32,0xE1,0x97,0x1B,0xB2,0x66,0x6C,0xD0,0x47,0xDF,0x8A,0x25,0xE9,0x21, + + 0x3B,0x87,0x92,0xD1,0x96,0x1A,0xC7,0x61,0x17,0xDF,0x3C,0x32,0x73,0x21,0x3C,0xC9, + + 0x03,0x30,0xB4,0x43,0xB4,0xC8,0x8A,0xA4,0x2C,0x67,0xC2,0x53,0x06,0x55,0xD5,0x40, + + 0xB3,0x38,0xFA,0xF0,0x16,0x18,0xE9,0x77,0xED,0xCF,0xA9,0xE8,0xD1,0x22,0x9B,0xC8, + + 0x8D,0x4D,0x09,0xAA,0xBE,0x74,0xF6,0xC3,0x30,0x75,0x76,0xDA,0x7F,0x55,0x6E,0xB3, + + 0xD1,0x89,0xAE,0x9E,0x3D,0xB9,0x6F,0x06,0x9A,0xB5,0x75,0xF9,0xA3,0xF3,0xF5,0xB4, + + 0xC2,0xD8,0xAF,0x0B,0xFC,0x16,0x62,0x96,0x13,0x77,0xA9,0x3F,0x03,0x57,0x54,0x60, + + 0x5A,0xD9,0xCF,0xC9,0xFC,0xF9,0x80,0x28,0x83,0x06,0xBC,0xAC,0xAA,0xCB,0xE7,0xB5, + + 0xEF,0xFE,0x75,0x4A,0x3C,0x81,0x09,0xAD,0x93,0x6A,0x61,0xD1,0x5C,0x49,0x3E,0xB8, + + 0x7B,0xF1,0x79,0xF9,0x9E,0x12,0xDB,0xFC,0xFB,0xB9,0x36,0xFA,0xAB,0x9E,0xA3,0x4E, + + 0xED,0xBE,0x99,0xC8,0x1F,0x11,0xCC,0x71,0xED,0xCC,0xA6,0xD5,0x90,0xBC,0x36,0xD5, + + 0x0A,0x39,0xBF,0x5B,0xB5,0xC5,0xCB,0xDC,0x4E,0x00,0x58,0x4F,0x0B,0xDC,0xB7,0xA4, + + 0xF0,0x63,0x2C,0x81,0x6C,0xDF,0x2E,0x91,0x8A,0x63,0x50,0xA5,0xD7,0x22,0xA4,0x5F, + + 0xFC,0x7D,0x53,0x14,0x72,0xAD,0x4C,0x23,0x23,0x02,0x71,0x0F,0x25,0xF4,0x36,0xB1, + + 0x86,0x6A,0x41,0x84,0xB8,0xDD,0x6F,0x08,0x08,0x21,0xD1,0x80,0xD6,0x40,0xA0,0x6F, + + 0x14,0x6D,0x9F,0x20,0x22,0x6E,0x39,0x2F,0x4E,0xEE,0x8E,0x0A,0xE5,0xB6,0x19,0x44, + + 0x8F,0x67,0xF3,0x69,0xEE,0xB7,0xE3,0xCD,0xBE,0xD7,0xF3,0x63,0xBB,0x20,0x35,0x97, + + 0xC9,0x96,0x7F,0x4A,0x2F,0xD1,0x98,0x69,0x2B,0xD6,0xE2,0xC5,0xDF,0xCA,0xEA,0xE4, + + 0x57,0x18,0x72,0xE8,0x94,0xDE,0x7E,0x0E,0x1B,0x04,0xC3,0x75,0x39,0x22,0xF2,0xC2, + + 0xBD,0x0D,0xDA,0xBD,0x5F,0x6A,0x27,0xC9,0x36,0xE4,0x7D,0x17,0x20,0x02,0xBF,0x9B, + + 0x38,0x55,0xFD,0xF4,0x18,0x6A,0x42,0xBB,0x7A,0xE5,0x87,0xA8,0x5F,0x28,0x2E,0xA2, + + 0x8E,0x4A,0x9E,0xE3,0x7A,0xA5,0x99,0x4B,0x7B,0xE8,0xAD,0x9C,0xA9,0x98,0x61,0x09, + + 0x8B,0x4A,0x8E,0x35,0x9E,0x08,0x84,0xBA,0xA6,0x42,0x30,0x84,0x04,0x39,0x52,0x5A, + + 0x2C,0xF4,0x9D,0x28,0x2A,0xD6,0xCB,0xCA,0xB9,0xE6,0x2C,0x05,0x2D,0x1A,0x81,0x0F, + + 0xE3,0x9F,0x39,0x44,0xBF,0xD3,0x87,0x9B,0x74,0x48,0xEA,0xE8,0x50,0xAA,0x02,0xD0, + + 0xE2,0x9E,0xAC,0x75,0x18,0x7D,0x8B,0xFC,0x49,0x7C,0xE4,0xDC,0x3B,0xED,0x24,0x3A, + + 0xB4,0x98,0x2F,0xDE,0xAE,0xF3,0xD9,0x57,0xF0,0xBB,0x70,0xC9,0x06,0x0D,0xF8,0xF4, + + 0xB8,0x4F,0x74,0x6D,0x64,0x80,0x9B,0xFD,0xCF,0x43,0xA5,0x7B,0x3A,0xCC,0x62,0xA8, + + 0xDF,0x4D,0x4A,0x00,0x32,0xDF,0xC6,0x8C,0xA8,0xB3,0x38,0xD7,0x56,0x86,0x58,0xAB, + + 0x07,0x53,0xB4,0x67,0x05,0x73,0xDC,0x30,0xFE,0xFE,0x67,0x36,0xB3,0xB6,0x67,0x81, + + 0x57,0x87,0xBD,0x76,0x88,0x57,0x80,0xB2,0xD2,0xC3,0x6A,0xD6,0xDA,0xA4,0x09,0x36, + + 0x78,0x6E,0xC9,0x84,0x10,0x9C,0xB9,0xC2,0xD9,0x5C,0x5D,0x31,0xB3,0xEC,0xDF,0x70, + + 0xD1,0xCB,0x84,0x04,0x34,0x16,0x94,0xE4,0xE3,0x59,0xB6,0xE4,0xEF,0x89,0x72,0xF9, + + 0xF5,0x1F,0x0C,0x55,0xA4,0x77,0x0A,0xCF,0x05,0x17,0xA5,0xCA,0x0B,0x80,0xA9,0xB2, + + 0x96,0xE0,0x2D,0x41,0xB0,0x62,0xEA,0xA3,0x43,0x83,0x78,0x0B,0x13,0x49,0x09,0x39, + + 0x37,0x55,0x8D,0x22,0xB5,0x15,0x1D,0xD8,0x60,0x5A,0x4E,0x0F,0x08,0x35,0x29,0xD2, + + 0x9D,0x84,0x13,0xAB,0x99,0x97,0xA2,0xDB,0x5C,0x57,0x22,0xCE,0x83,0x14,0x5A,0x87, + + 0x0F,0x1A,0xB6,0x6F,0x41,0x5C,0xBA,0xCB,0x55,0x56,0xA0,0x19,0xAB,0xE6,0xC7,0x88, + + 0x61,0xCE,0x94,0x09,0xBA,0xD8,0xD7,0x29,0x51,0xF5,0xA9,0x1D,0x22,0xC5,0xDF,0x39, + + 0x2C,0x58,0xB7,0x6E,0xCD,0x79,0xAB,0xCA,0x99,0x54,0x5F,0xF8,0x74,0xAF,0x02,0x28, + + 0x48,0x83,0x2E,0x48,0x30,0x9C,0xA9,0x2A,0xCB,0x83,0x92,0xCA,0x8F,0x70,0xA9,0xAB, + + 0x17,0xCB,0x58,0xBC,0x3F,0x18,0x8B,0xE7,0x19,0xF9,0x6D,0x58,0x87,0x1E,0xBC,0x0E, + + 0x43,0x8F,0x07,0x4C,0x2D,0x93,0x97,0xEC,0x3E,0x8A,0xEF,0x92,0x7B,0x73,0x47,0xDC, + + 0xC0,0x0E,0x5A,0xF9,0x6F,0x8E,0x0B,0xBC,0x23,0x1C,0x1F,0x7D,0xC3,0x8A,0xCC,0x71, + + 0x22,0x76,0x58,0x75,0x78,0xA9,0xE6,0x93,0x6E,0x6F,0x70,0xE2,0x50,0x34,0x60,0x07, + + 0xE4,0x2E,0xF6,0x23,0x49,0x03,0x06,0x9A,0x8F,0x82,0xED,0x09,0x63,0x74,0x1F,0xA2, + + 0x46,0x82,0x21,0x66,0xDD,0xE3,0xA4,0x21,0x9C,0xAE,0x64,0x38,0xA6,0x37,0x7D,0xE0, + + 0xA3,0x87,0x3F,0x95,0x15,0x18,0x47,0x0B,0x2C,0x20,0x6C,0x0C,0xA7,0xA1,0xCC,0xE7, + + 0xD3,0xE7,0x71,0x38,0x74,0x5B,0x48,0x1D,0xC7,0xC9,0x67,0x95,0xDA,0xB9,0x0E,0xFE, + + 0xF2,0x23,0x50,0xA8,0x07,0xE8,0xB8,0xF2,0x7F,0xCB,0x38,0xF7,0x3A,0xE8,0xCA,0x89, + + 0x3D,0xE8,0x9F,0x6E,0xA5,0x92,0xC2,0xD2,0x3A,0x05,0x89,0x40,0x6B,0xE9,0x3C,0x13, + + 0x8B,0x2C,0x16,0x90,0x5D,0x36,0x41,0x8C,0x44,0xCA,0x06,0x50,0x76,0xA5,0xB3,0x79, + + 0x2A,0x02,0x9A,0xDE,0x40,0x29,0x54,0x8B,0xA7,0xB9,0x3E,0x69,0x88,0x4B,0xBA,0x74, + + 0x4E,0x56,0x60,0x2F,0x71,0xB6,0x3E,0xD8,0xCD,0x59,0xDB,0xBA,0x5B,0x6B,0x03,0x5A, + + 0xA6,0x81,0xE5,0xFC,0xAC,0x21,0xF3,0xAA,0xD3,0x41,0x14,0x9B,0x5E,0x6C,0x73,0x82, + + 0x00,0xF6,0x13,0xFF,0x99,0x86,0x1D,0x8A,0xF5,0x6F,0x40,0x18,0x7C,0x14,0x73,0xB5, + + 0xE7,0xBD,0x59,0xDD,0x22,0xA6,0x89,0xEE,0x42,0x18,0xB6,0x1B,0xF2,0x89,0x54,0x77, + + 0x4C,0x12,0x94,0x66,0xEA,0x2E,0xC9,0xD7,0xB3,0x5E,0x82,0x39,0x3C,0xEF,0x29,0xB1, + + 0xAF,0x4F,0x62,0x30,0xFE,0x51,0xD0,0xC2,0x12,0x9D,0x5C,0x8D,0x72,0x13,0x73,0x7B, + + 0x89,0xAD,0x14,0xAC,0xA3,0xED,0xBB,0xFB,0xF7,0x8D,0x9D,0xDE,0x20,0x62,0xC8,0xF1, + + 0x50,0x36,0xE4,0x23,0x95,0x1F,0xF4,0x22,0x9A,0x7D,0x62,0xB9,0x46,0x5D,0x7A,0xD2, + + 0x71,0x3C,0xFC,0x12,0x37,0xBB,0xAD,0x50,0x63,0xD3,0xEA,0xD6,0x79,0x5A,0xF7,0xF0, + + 0xDC,0x34,0x32,0xA0,0x15,0x1D,0x20,0x41,0x48,0x7F,0x67,0x77,0x74,0x5A,0xFF,0xA2, + + 0x83,0x3C,0x95,0x64,0x9F,0xD6,0x12,0xC0,0xD9,0xDC,0xAC,0x48,0x1C,0xE2,0x9B,0x85, + + 0xCF,0x87,0x43,0xFA,0xE6,0x45,0x7E,0xCD,0x12,0x81,0xA0,0x1C,0x8D,0x2B,0x0A,0x63, + + 0x26,0xA4,0x2C,0x57,0x5A,0xD0,0x69,0xCD,0x51,0x00,0xC4,0xCB,0x88,0xFB,0x03,0x77, + + 0x4F,0x75,0xC2,0x67,0x2A,0x95,0x62,0xD8,0xD2,0x43,0x35,0x66,0x52,0xF8,0x53,0xFB, + + 0x18,0x42,0x59,0xB5,0x00,0xD2,0x28,0x77,0xBA,0x22,0xC5,0x4B,0xF1,0xD5,0xB7,0xF9, + + 0x46,0x3B,0x9E,0x7D,0x1A,0xFA,0x82,0xD9,0x1C,0xD7,0xC9,0x56,0x7C,0x94,0x29,0xDD, + + 0xC4,0x5A,0x7A,0xB9,0x9C,0x16,0x47,0xDC,0xE0,0xBB,0xEB,0x24,0x7E,0x5B,0x73,0x78, + + 0x94,0x9E,0xE7,0x81,0x1D,0x15,0x6D,0xF9,0x84,0x3B,0x89,0x03,0x26,0x57,0x49,0x3F, + + 0x46,0xCA,0xFD,0x1B,0xBF,0x59,0xC0,0x3F,0xE7,0xCA,0x81,0x13,0x09,0xC8,0x33,0xF5, + + 0x18,0x23,0xDE,0x21,0x38,0x9E,0xD5,0xC3,0xB2,0x8D,0x68,0x0C,0xD2,0x01,0xBF,0x29, + + 0x19,0x40,0xD6,0xF3,0xC0,0x60,0x2C,0xAA,0xD3,0xDE,0x2A,0xDA,0x7F,0xFD,0xA7,0x4F, + + 0xF6,0x3F,0x79,0xAD,0x49,0xDB,0x51,0x4E,0xE3,0x7A,0x8F,0xD1,0xD8,0x0B,0x39,0x72, + + 0x44,0xAC,0x3E,0x21,0x67,0xFB,0xCE,0xC6,0x17,0x4E,0xFF,0xFF,0xA6,0x17,0x59,0xEB, + + 0xA5,0x5F,0x00,0x8C,0xB5,0x2B,0x68,0x07,0xB9,0x4F,0x14,0xE4,0x5C,0xA0,0x48,0xE8, + + 0xBD,0xFA,0x48,0xF4,0x11,0x00,0x4A,0x31,0xAA,0x30,0x70,0x1D,0xB0,0x7A,0x00,0x67, + + 0x3F,0xB9,0x80,0x81,0x99,0x43,0xAE,0x11,0xCC,0x9F,0xB1,0xA0,0x57,0x03,0x30,0xED, + + 0x79,0x43,0xEC,0xFD,0x2A,0x6E,0xC6,0x31,0xB6,0x4C,0xFC,0xC3,0x5C,0x78,0x3E,0x79, + + 0xE9,0x95,0xDC,0xBB,0xF9,0x95,0x28,0x02,0x02,0x4B,0x50,0x75,0x6E,0x08,0x93,0x53, + + 0x7C,0x09,0x08,0x55,0x6D,0xA8,0xB9,0x12,0x03,0x4A,0xBA,0x74,0x52,0xC8,0x3F,0x6C, + + 0x69,0x57,0x3E,0xC1,0xF9,0x30,0x09,0x75,0x40,0x1A,0xB3,0x68,0x3B,0x17,0x7E,0x38, + + 0x73,0x1E,0xB7,0x78,0x78,0xB6,0x86,0x71,0xB4,0x43,0xC5,0x8A,0xD5,0xCC,0x4A,0xF3, + + 0x3B,0x37,0x79,0x04,0xBD,0x97,0xD2,0xEC,0x43,0xE3,0x29,0x4A,0x9A,0x48,0xB2,0xEB, + + 0x23,0x67,0xCD,0xFC,0x11,0xBB,0x5A,0xC9,0x3D,0x46,0xEA,0xB8,0x7A,0x2B,0xBB,0xFA, + + 0xAA,0x1A,0xA8,0x73,0x49,0x97,0x00,0x06,0xA3,0xFB,0xDB,0x28,0xDE,0xC1,0x52,0x66, + + 0x2C,0x8D,0xB4,0x2C,0x38,0xD4,0x45,0x04,0xC9,0xE6,0x0B,0x7B,0x25,0x6D,0x82,0x88, + + 0x1F,0xF8,0x02,0xBD,0x7C,0x21,0x92,0xAC,0x41,0x4A,0x9A,0xE8,0x31,0x7D,0xDF,0x42, + + 0x3F,0xD0,0xD9,0x2F,0x6B,0x26,0x69,0x64,0xE8,0x4B,0xE4,0x44,0x78,0x2D,0x54,0x57, + + 0xFA,0xBA,0xB1,0xB2,0x98,0x8E,0xFA,0xE7,0x6B,0x48,0xEC,0x8F,0x92,0xFF,0x63,0x3B, + + 0x76,0x03,0x4B,0x4C,0xA7,0x24,0xF2,0xF6,0x6A,0x49,0xDD,0x50,0xF8,0xEF,0x45,0xE6, + + 0x42,0x10,0x21,0x66,0x36,0x70,0x4E,0xA1,0x0A,0x81,0x07,0xD6,0xD3,0x0B,0xB4,0x6B, + + 0xC8,0x32,0x27,0xD3,0x02,0xCC,0x3C,0x63,0x45,0x3D,0x63,0x48,0xE3,0x33,0xFD,0xE7, + + 0x53,0x02,0xCD,0xFE,0xE1,0x39,0x6B,0x9D,0xAA,0x23,0x94,0x5E,0x83,0x7E,0x1B,0xF3, + + 0x5E,0xBE,0x35,0x07,0xF9,0x21,0x44,0xCF,0x44,0xD5,0x99,0x08,0x8A,0x63,0x64,0xE0, + + 0x41,0x41,0xBE,0xA4,0x26,0xC9,0x74,0xA0,0xC3,0xD3,0x6F,0x76,0x72,0x7E,0x34,0xF7, + + 0xD6,0x1A,0xD4,0xD1,0x58,0x84,0x5E,0x72,0xFE,0x9E,0xE6,0x16,0x98,0x04,0x3D,0xE6, + + 0xC1,0xBC,0xDA,0x25,0xBA,0xEB,0x81,0x0A,0xE4,0x9C,0x04,0x61,0x99,0xDE,0xF9,0xAE, + + 0x00,0x72,0xC9,0xA6,0xCB,0x3E,0x65,0x81,0xC9,0x5E,0xA3,0xCD,0xF5,0xDC,0x56,0x2D, + + 0x2E,0xB3,0x3E,0x1E,0x38,0x30,0x12,0x68,0x64,0x1A,0xCD,0xAC,0x07,0x78,0x31,0x7A, + + 0xC0,0x3A,0x71,0x67,0x0A,0xD6,0xB6,0x89,0xEE,0x38,0xC5,0xC3,0x2C,0x70,0x0D,0xF3, + + 0x0B,0x7F,0x8D,0x65,0x66,0xF7,0x49,0x0B,0x6D,0x9B,0x4C,0xEF,0xFE,0x32,0x1D,0x98, + + 0x52,0x96,0x37,0x06,0xDA,0x3F,0xF7,0x90,0x08,0x40,0x9E,0x3F,0xF0,0x96,0xFD,0x2A, + + 0x86,0xE1,0x91,0x48,0x1D,0xF5,0xD6,0x89,0xDA,0xE3,0x04,0x9E,0xD9,0xDC,0x5E,0x24, + + 0xAB,0x5F,0x90,0xF4,0xC2,0x32,0x9E,0x28,0x24,0xA0,0x5E,0xED,0x47,0x76,0x3F,0x30, + + 0xEE,0xE5,0x07,0x3C,0xB9,0x7C,0x88,0x13,0x9D,0xA9,0xC4,0x9E,0x8A,0x75,0x05,0x0C, + + 0x56,0x90,0xC9,0xE5,0x52,0xAE,0x47,0xFC,0x80,0x8E,0xDD,0x8E,0xC7,0xF6,0x30,0x8A, + + 0xA1,0x06,0x9B,0xA3,0xE3,0x0D,0xA5,0x42,0x28,0x4D,0xBC,0x21,0xF5,0x68,0x81,0x90, + + 0xC0,0x27,0x96,0x3F,0x63,0x0E,0xAB,0x0D,0x3D,0x14,0xB1,0x44,0xF6,0xE7,0xAA,0x43, + + 0x80,0xA2,0x30,0x3A,0x7F,0xE6,0xCC,0x18,0xB8,0x57,0xB0,0xC5,0x56,0xEA,0x11,0xD4, + + 0x47,0x63,0x0D,0x75,0x31,0x4E,0x2A,0xB7,0xD0,0x3F,0xB1,0x90,0x76,0xE5,0x58,0x7C, + + 0x37,0x71,0xE2,0x35,0x2A,0x2D,0x43,0x7F,0xE5,0xBF,0xCE,0x4B,0x37,0xC4,0xC1,0x2C, + + 0x92,0x08,0xFB,0xB6,0x57,0x08,0x58,0x8F,0x13,0x1E,0x98,0x39,0x30,0xE8,0x7C,0x0C, + + 0x7B,0xFA,0xE5,0xA7,0x2F,0x0B,0xF1,0x9A,0x31,0x5D,0xA9,0x08,0x56,0x95,0x14,0xB9, + + 0x04,0x8A,0x7C,0x27,0x9F,0xAC,0x4A,0x77,0xD2,0x3B,0xE3,0xC2,0xF4,0x1F,0x2A,0x0E, + + 0x04,0xD4,0x66,0xE0,0xB0,0xA5,0x08,0x1B,0x34,0x67,0xBA,0x63,0x3F,0xA8,0x28,0xF8, + + 0x3E,0x74,0x92,0xE1,0xEC,0xCA,0x29,0xC9,0x3D,0x44,0xF8,0xDC,0xDF,0xA1,0x43,0x5D, + + 0x46,0x87,0x67,0xE0,0x65,0x0B,0x24,0xDB,0xC4,0x69,0xCB,0xAD,0xDD,0xB2,0x93,0x2B, + + 0x85,0xC4,0x6B,0xEE,0xDC,0xF6,0x2D,0x06,0x26,0x3A,0x2C,0xDD,0x5F,0xA3,0x9D,0x88, + + 0xAF,0x53,0xA7,0xCC,0xDB,0x21,0x48,0x99,0x7A,0x67,0x32,0x9F,0xDE,0xE4,0x7D,0x44, + + 0x7F,0x39,0x15,0x6E,0x1D,0xEF,0x72,0x8A,0x69,0xC2,0x3A,0x8F,0xF7,0xE5,0xA3,0x4E, + + 0x5A,0x7A,0xDB,0xB1,0x32,0xA3,0xE0,0xBA,0x4C,0xCA,0x77,0x9E,0xAA,0xBB,0xFE,0x41, + + 0xBB,0x89,0xB5,0x17,0x3E,0x10,0xBB,0xAF,0x8F,0xC9,0x73,0x00,0x1D,0x9F,0x72,0x22, + + 0xD7,0x6B,0xDA,0x64,0x26,0xFD,0x51,0x54,0x62,0xF8,0xEE,0x5C,0xD7,0xF4,0x64,0xDE, + + 0xA8,0x1C,0xE4,0xAB,0xC8,0xDD,0xBC,0x52,0x63,0x7A,0xDC,0xF6,0x7B,0xFC,0x65,0x7F, + + 0x18,0xD0,0xBF,0x85,0x7E,0xBD,0xA1,0x27,0xC7,0xD2,0x4E,0x23,0xBF,0x5C,0xCA,0x68, + + 0x44,0x45,0x69,0x68,0x38,0xA8,0x28,0x88,0x8E,0x82,0xF7,0x08,0x56,0xFE,0x66,0x40, + + 0xA6,0x55,0xBC,0xC2,0x7E,0xC5,0xC5,0x66,0x0D,0xD0,0xF0,0x06,0xCB,0xF2,0x8E,0x56, + + 0x2F,0x66,0xF6,0xD7,0x14,0xC8,0xCD,0x76,0x0C,0xF0,0x48,0x94,0x8C,0xB7,0x1D,0xE7, + + 0xA0,0x3D,0xBD,0xD7,0x5F,0xC7,0x7D,0xE6,0x8D,0x07,0x5F,0x95,0x57,0x69,0x0D,0xE9, + + 0xF3,0x9A,0xD7,0x24,0x8B,0x18,0x35,0xF7,0xCE,0x28,0xA3,0x16,0xC8,0xD7,0x5D,0xF9, + + 0x06,0x39,0xDA,0xE8,0xE2,0xAA,0x0F,0xEC,0x00,0xDE,0xFC,0x71,0xDF,0xFE,0xFA,0x64, + + 0x4E,0xDB,0xD6,0x5E,0x6B,0xA2,0x80,0xBE,0x45,0x4F,0x40,0x5C,0xDC,0x71,0x1F,0x74, + + 0x45,0x99,0x1F,0xFF,0x3C,0x1C,0x17,0xD7,0x4D,0xD9,0xBB,0xA8,0x5D,0x70,0xEF,0x6A, + + 0xE0,0x06,0xCA,0xE9,0x30,0x3D,0x66,0xC4,0x48,0xD0,0xBD,0x5D,0xD9,0x76,0x9D,0xED, + + 0x8F,0x07,0xF5,0xBD,0x4E,0xFE,0xC9,0x78,0x72,0x01,0x36,0xA2,0xA3,0xFA,0x55,0x66, + + 0xAD,0xC1,0x2E,0x92,0xE2,0x1D,0x62,0x05,0x86,0x0C,0xA0,0x87,0x9E,0x82,0x67,0xFB, + + 0xAE,0x61,0xB9,0xB6,0x5F,0xC1,0x15,0xEB,0xEF,0x9E,0x5D,0x9C,0x5F,0xBC,0x8E,0x39, + + 0x03,0x62,0xFC,0xAC,0xCF,0xB4,0x65,0x2A,0xCE,0x9F,0x3F,0xB3,0x22,0xBD,0xCA,0x10, + + 0x82,0x04,0x98,0x89,0x70,0x30,0xCD,0x21,0x46,0x18,0xF0,0x9B,0xA3,0x6D,0x68,0x12, + + 0x00,0x8A,0x52,0xE4,0x3B,0x25,0x8D,0xD0,0x45,0xE1,0x32,0x46,0xA4,0x6E,0x8B,0x72, + + 0xF4,0x0D,0xD9,0x89,0x12,0x5E,0xBE,0x30,0xFC,0xEF,0x6E,0xD9,0xD0,0x64,0x5B,0x95, + + 0xEA,0xCA,0x08,0x91,0xF2,0x0F,0x88,0x76,0x03,0x33,0x2D,0x4A,0x72,0x0D,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xDD,0xE6, + + 0x0E,0x62,0xA2,0x10,0x9A,0x54,0x2C,0x04,0x8A,0x48,0xF0,0x20,0xAD,0xEE,0x6A,0x1A, + + 0x08,0x04,0x4A,0xF8,0xBB,0x2D,0x12,0xC8,0x2B,0x46,0x47,0x1C,0x22,0x6B,0xBE,0x8D, + + 0xCF,0x8A,0x59,0xFD,0xF6,0x25,0x1B,0x16,0x4A,0x4E,0x93,0x09,0xA7,0x6A,0x13,0x98, + + 0xC1,0x9A,0x0F,0x99,0xFA,0x28,0x21,0xCA,0xFD,0xE4,0xC0,0x12,0xAE,0x6F,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x95,0x80, + + 0x4B,0x61,0x7B,0xF7,0x0C,0xE3,0x84,0x24,0x27,0xD0,0x94,0xA4,0x70,0x70,0x32,0xBD, + + 0xD6,0x9C,0xF2,0x92,0x52,0x44,0x3C,0xF0,0x02,0xD2,0x9C,0xB4,0x71,0x71,0x01,0x05, + + 0xE7,0x92,0x7E,0x75,0xB2,0xC3,0xD5,0x45,0x85,0x54,0x95,0xA5,0xF0,0x72,0x1F,0x11, + + 0x5E,0xCE,0x5E,0x66,0x3D,0x72,0x65,0xC3,0x0A,0x02,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x54,0xA7, + + 0xDF,0x95,0xE6,0xDA,0xD1,0x35,0x68,0x85,0x17,0x07,0x96,0xAC,0x78,0x78,0xB1,0xF8, + + 0x1D,0xB4,0xB6,0x66,0x95,0x34,0xD4,0xA8,0xEB,0x5D,0x9E,0xBC,0x79,0x79,0x78,0x0D, + + 0xEB,0xF0,0x78,0x0F,0x7D,0xB7,0xD7,0x6C,0x55,0x18,0x97,0xAD,0xF8,0x7A,0x9A,0x64, + + 0xA9,0xC4,0x9D,0x1D,0x52,0x7F,0x17,0xDB,0xC8,0x79,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x1E,0x3A, + + 0x27,0xC0,0x9A,0xF5,0x75,0xA6,0xA5,0xDF,0xF3,0x82,0x20,0xA4,0x91,0x6D,0x40,0x61, + + 0x39,0x07,0xF2,0xEC,0x7D,0x30,0x3A,0xB0,0xC5,0xC9,0x47,0xF1,0x97,0xE1,0x27,0x2E, + + 0x09,0x04,0x81,0x53,0x37,0xE3,0xFD,0x4C,0xC2,0x08,0x89,0xD9,0x78,0xEF,0xAF,0x53, + + 0x2C,0xC2,0xD7,0x11,0xF6,0x54,0x01,0x53,0xCF,0x63,0x02,0xA5,0xD5,0xA2,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0xE2,0xDE, + + 0x4C,0x8E,0xF4,0x23,0xF7,0xCC,0xA7,0x59,0x70,0xC3,0xB3,0x48,0x3C,0xE8,0x52,0x9E, + + 0x66,0x4F,0x94,0x7C,0x62,0xA9,0x58,0xF8,0xA4,0x98,0xBE,0xD8,0x79,0xE9,0x03,0x4B, + + 0xEF,0xC9,0x9B,0xF4,0x1E,0x66,0xB3,0x3A,0xF8,0xA6,0x4B,0xA7,0x79,0x69,0xEB,0x1A, + + 0xF3,0x20,0x50,0x60,0xF5,0x3A,0x59,0x2E,0xCC,0xE6,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x9B,0xB2, + + 0x26,0xD2,0xFE,0xA9,0x46,0x1F,0x32,0x8F,0x8D,0xA1,0xB4,0xA6,0x74,0xF0,0x3E,0x12, + + 0xDA,0x4C,0xD2,0xBB,0xDE,0x20,0x90,0x20,0xE6,0x7C,0xBC,0xB6,0x75,0xF1,0x7B,0xCB, + + 0x45,0x9D,0x01,0xF8,0x17,0x3F,0x6D,0xA7,0xAC,0x83,0xB5,0xA7,0xF4,0xF2,0x7F,0xBC, + + 0x52,0x4E,0x3D,0x6E,0xB5,0x2C,0xAC,0x21,0xA9,0xDB,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x0E,0xE8, + + 0xC5,0xE9,0x99,0xBE,0x3E,0x47,0x0A,0x8E,0x07,0x51,0xB6,0xAE,0x7C,0xF8,0x51,0xE4, + + 0x4F,0x9D,0x94,0xA7,0xC6,0x24,0x26,0x3F,0x0D,0x06,0xBE,0xBE,0x7D,0xF9,0xDC,0xF9, + + 0xCC,0x9A,0x9C,0x3F,0x00,0x65,0x33,0xD4,0x8C,0xA6,0xB7,0xAF,0xFC,0xFA,0x54,0x59, + + 0x0C,0x44,0xFD,0x9D,0x4E,0xFA,0x27,0x2B,0x8D,0x04,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x2B,0xFD,0xA7,0x2C, + + 0xFD,0x06,0xD2,0x7D,0x16,0xB9,0x30,0xB0,0xA9,0x11,0x06,0x46,0xAF,0x1B,0xC8,0x18, + + 0x01,0x0B,0xB2,0xF6,0xBD,0xDC,0x9E,0x43,0x75,0x2F,0xDA,0xF8,0x57,0xF8,0x8E,0xC7, + + 0x0E,0xFD,0x62,0x81,0xAD,0x09,0xBD,0xB3,0xD2,0x4A,0x95,0xDC,0x8A,0x20,0x8D,0xEC, + + 0x7C,0x42,0xF1,0x91,0xAC,0x76,0x7B,0xAD,0xC0,0x83,0x9B,0x4A,0x72,0x67,0xA7,0x00, + + 0x0E,0xF9,0x7F,0xA6,0xFB,0x35,0x8B,0xE2,0x87,0xC7,0x6F,0x2F,0xA8,0x44,0x59,0xD2, + + 0x92,0x42,0xD3,0xE6,0xD1,0x7A,0x43,0x8F,0xA2,0xEA,0x86,0xCC,0xD9,0xBE,0x19,0x90, + + 0x63,0xA9,0x01,0x28,0x5E,0x64,0x0B,0x4F,0x61,0xED,0xD6,0x94,0xEC,0x9F,0x71,0x21, + + 0x8B,0x0C,0x72,0xC7,0x93,0x2D,0x40,0x8D,0x52,0xBC,0x5E,0x07,0x38,0xD4,0x3C,0x24, + + 0x85,0x8E,0x90,0x2F,0xF3,0x6C,0xD2,0x50,0x2B,0xCF,0x94,0xA8,0x29,0xE8,0x74,0x35, + + 0xE0,0x58,0x4A,0x64,0xCF,0x6B,0xF9,0xC8,0x4A,0x46,0x79,0x5E,0xA6,0x05,0x42,0xC9, + + 0x95,0x87,0xBD,0x0A,0xFA,0xF3,0x8F,0x21,0xCE,0x33,0xA9,0xCF,0xDE,0x13,0xF0,0xE8, + + 0x2A,0x3B,0x16,0xCC,0x78,0x69,0x3B,0x20,0xCF,0xD2,0xF9,0xEC,0x5B,0xC7,0xCB,0xCC, + + 0x7B,0x0E,0x82,0xC8,0x27,0xBB,0xEE,0x90,0xD3,0xF7,0xF2,0x70,0xA0,0x2C,0x8A,0x38, + + 0x0B,0xF9,0xB5,0xDE,0xDE,0x8E,0x62,0x97,0x4D,0x24,0x84,0xC4,0xF3,0xB6,0x79,0xAB, + + 0x76,0x1F,0xFB,0xB7,0x36,0x23,0xEF,0xEB,0x1F,0xAF,0x56,0x9C,0xE4,0x97,0x5E,0xDB, + + 0x42,0xA6,0x0B,0x25,0x23,0x27,0x66,0xFB,0x1E,0xAE,0x5C,0x8C,0xA1,0x6C,0x1F,0x17, + + 0xC2,0x00,0xD2,0xC3,0x3E,0xEF,0x50,0xE0,0x6A,0xFD,0x78,0x3A,0x71,0x12,0x74,0x99, + + 0xC1,0x90,0x24,0x10,0x0C,0xA2,0x9C,0x91,0xEB,0xFC,0x94,0xA1,0x98,0x20,0x6B,0xF2, + + 0x94,0xB9,0x3A,0x00,0x32,0xC7,0x84,0x33,0xF2,0x58,0xAB,0x89,0x32,0x60,0x31,0x62, + + 0x25,0x9E,0x36,0x77,0x1D,0xCE,0x8C,0x76,0x23,0x81,0x71,0x27,0xA7,0x7B,0x5F,0xC8, + + 0x83,0x78,0xDD,0xB7,0x03,0x5A,0x34,0xB3,0x9A,0x59,0x01,0x5C,0x99,0x10,0x5D,0xA8, + + 0xCA,0x0C,0xF2,0xAC,0x35,0x4C,0x24,0x74,0x5E,0xC2,0x70,0x6F,0x70,0x35,0xA2,0x01, + + 0xAE,0xB2,0xA7,0xC4,0xB3,0xA4,0x27,0xE0,0xB6,0xDB,0xEF,0x62,0x09,0x4B,0x3F,0xD0, + + 0xAF,0xB3,0x6B,0xB7,0x44,0x52,0x07,0xFC,0x40,0x32,0x7A,0x59,0xAF,0x73,0x54,0xF0, + + 0xC3,0x7C,0xFE,0x0E,0x9A,0xAC,0x1E,0xAC,0x40,0x7E,0x14,0x28,0x09,0xF3,0x6E,0x3B, + + 0x7E,0x16,0x75,0xBB,0x98,0xC6,0x5F,0xCB,0x5D,0x53,0xB0,0xCD,0x1A,0x59,0x3D,0x0E, + + 0xEB,0xEA,0x47,0xF5,0xE7,0x37,0x29,0x85,0x65,0xDC,0xE5,0xC8,0xE0,0x7C,0x6F,0xCA, + + 0x15,0x90,0xB1,0xA5,0xBF,0x42,0xDB,0x48,0x4A,0x6B,0xE7,0x82,0xCD,0x3A,0x57,0xB0, + + 0x62,0x0D,0xFE,0x33,0xD3,0x2D,0x0C,0x42,0xC9,0x75,0xBA,0x9F,0x08,0xAD,0x5E,0x98, + + 0xDF,0x90,0xB5,0xFB,0x9A,0x51,0x66,0x17,0x10,0x49,0xE3,0x3B,0xA5,0x75,0x79,0xE1, + + 0x27,0x98,0x07,0xA0,0x76,0x33,0x8B,0x6B,0x23,0x2B,0x17,0x95,0x44,0x81,0x31,0xA5, + + 0x29,0xB3,0x28,0xA7,0x6D,0x35,0x04,0x5B,0x94,0x53,0x5F,0xE3,0xCD,0xD2,0xE0,0x6F, + + 0xF8,0xC2,0xBB,0x95,0xF6,0x50,0xBD,0x50,0xFB,0x82,0x83,0x66,0x1C,0x6B,0x5C,0xD2, + + 0x03,0xF8,0x96,0x3B,0x7D,0xAC,0xDB,0x4D,0xE6,0x83,0xE2,0x02,0xF6,0xE7,0x3A,0x76, + + 0x45,0x84,0x49,0x75,0x7F,0xD3,0x73,0xEF,0xC2,0xBB,0x20,0xC5,0x54,0x82,0x90,0x6C, + + 0x26,0x28,0xD7,0x2F,0x17,0x56,0xA4,0xAD,0x64,0x3C,0x97,0x19,0x74,0x3C,0x58,0x22, + + 0x7A,0x29,0xA1,0x81,0xEB,0x22,0x48,0xF2,0xBD,0x3F,0xCA,0x99,0xAB,0x88,0x7D,0x43, + + 0x36,0x28,0xE0,0x06,0x11,0xDC,0x66,0x83,0xA6,0x6A,0xAB,0x4B,0x51,0x7C,0x74,0x33, + + 0x7B,0x8F,0x18,0x39,0x54,0xA6,0x58,0x9F,0x20,0x84,0x12,0xA7,0xE2,0x4B,0x70,0x94, + + 0x45,0xA7,0x9A,0x35,0x60,0xC2,0x68,0xF7,0xB6,0xC5,0x0C,0x8C,0x6E,0x8B,0x5A,0x03, + + 0xF9,0xCA,0x88,0x8A,0x21,0x5B,0x52,0x79,0xF8,0xC5,0x0D,0x69,0x8A,0xE0,0xB4,0x98, + + 0xA7,0xA3,0xCA,0x21,0x9C,0xEB,0x72,0x3E,0x65,0xC4,0x82,0xC1,0xDF,0x45,0xBE,0x34, + + 0x8A,0x13,0x9B,0xF1,0x30,0xA7,0xC8,0x54,0x41,0x1C,0x26,0xAB,0xAD,0x6A,0xEB,0x76, + + 0x38,0xC9,0x36,0xA7,0x9B,0x32,0x05,0x17,0x42,0x4D,0x88,0x5D,0x2A,0x16,0x6A,0xC2, + + 0x6D,0x95,0xDA,0x09,0xDC,0x25,0x48,0x88,0xB2,0xDD,0x95,0x2E,0x40,0x11,0x6B,0x38, + + 0xF0,0x06,0xBC,0xDA,0x6E,0xAF,0x6F,0x09,0x77,0x4A,0x2E,0x84,0xB6,0x7E,0x75,0x33, + + 0x88,0x17,0x58,0xDD,0x9E,0xA4,0xB3,0x07,0x7F,0x3A,0xE1,0x6E,0x25,0x63,0x72,0x6A, + + 0xBF,0xCD,0xB1,0x5E,0x3C,0x0F,0x86,0x7F,0x4F,0xFF,0xEC,0x8C,0x5B,0x42,0x64,0x60, + + 0xCD,0x49,0x6C,0x02,0x45,0x13,0x06,0x92,0xFF,0x7F,0x6B,0xD9,0x50,0x5B,0xEC,0xEA, + + 0x46,0x16,0x68,0x69,0xB7,0xB6,0x42,0xB5,0x84,0xB7,0x43,0x34,0xB0,0x72,0x3F,0x82, + + 0x85,0x22,0x09,0x02,0x43,0x4F,0x95,0xD1,0x86,0x4B,0x7A,0xA6,0x9F,0x6B,0xB2,0x86, + + 0xA3,0xEA,0x0C,0x13,0xC4,0x49,0x43,0x8B,0x65,0x53,0xE7,0x66,0x56,0x7E,0x7A,0xA0, + + 0x07,0xD4,0x60,0xD5,0x06,0x2D,0xAF,0xDD,0x60,0xBD,0x25,0x17,0xD5,0x94,0xB3,0xB0, + + 0x07,0x78,0x6D,0xC5,0x07,0x2C,0xA3,0x70,0x10,0x32,0x6C,0xE8,0x43,0x01,0x79,0x3F, + + 0x24,0x92,0xDB,0xAF,0x54,0x96,0x48,0x67,0x97,0xFC,0xC7,0xD6,0x8C,0x09,0xED,0xB2, + + 0xD0,0x91,0xCD,0xC6,0xB1,0x2E,0xBD,0x82,0x8C,0x6C,0x68,0xED,0x87,0x43,0xC5,0xF8, + + 0x8F,0x9C,0x1D,0x0A,0x4D,0x1E,0x24,0x59,0x87,0x49,0xD6,0xFD,0x15,0xF7,0x2A,0x92, + + 0x2B,0x00,0xCE,0xCD,0x81,0x32,0xA3,0x94,0x0D,0xFE,0x13,0xDC,0x82,0xFF,0xF5,0xF8, + + 0xD9,0x1D,0xBD,0x93,0x9F,0xBD,0x0D,0x58,0xD0,0x98,0xC9,0xC7,0x7E,0x16,0x75,0x29, + + 0xD0,0xDB,0xE8,0x7D,0x3F,0x67,0x41,0xBD,0x04,0xBF,0x96,0x09,0x5C,0x95,0xC8,0xA9, + + 0x8F,0x63,0xA6,0xBC,0x9D,0x1C,0x16,0x12,0x80,0x27,0xE1,0xE1,0x0A,0xFA,0x82,0x45, + + 0x2E,0x3D,0x8C,0xD2,0x3C,0xFD,0x67,0xFA,0x69,0xA4,0x88,0xFE,0x7F,0xFD,0x07,0x81, + + 0x48,0x93,0xF6,0xBC,0x8E,0xD2,0x5E,0x17,0x08,0x9C,0xD9,0x4F,0xF8,0x5E,0xD0,0xBB, + + 0xAB,0xB6,0xE3,0xE4,0x9B,0x83,0x0C,0x85,0x4C,0xBA,0xFF,0x8D,0x14,0x0E,0x3E,0x3C, + + 0x42,0xFF,0xA0,0xC4,0x1D,0x62,0x87,0xA4,0x7D,0xBD,0xEE,0x19,0xBB,0xB1,0x00,0x14, + + 0xA9,0x8A,0xFA,0xE4,0xF3,0xD7,0x67,0x77,0xBC,0xF7,0x57,0xBE,0xB0,0x9E,0x3F,0x3C, + + 0x0D,0xF4,0x1C,0x54,0x96,0xBB,0x29,0xDB,0x6C,0x4F,0x4C,0x6F,0x2B,0x20,0x2F,0x3C, + + 0x05,0xA7,0x76,0x67,0x47,0x27,0xA2,0xAB,0xC0,0xE3,0x62,0xCE,0x22,0x21,0x80,0x38, + + 0x7E,0xD9,0xA0,0x0E,0xB4,0x29,0xE9,0x90,0x1F,0xE5,0xD0,0x64,0x52,0x64,0xE4,0x23, + + 0x25,0xA3,0x77,0x93,0xD1,0x25,0x0A,0xD3,0xA8,0x21,0xD8,0x74,0x53,0x65,0x39,0x66, + + 0x7F,0x09,0x3A,0x38,0xB3,0xE6,0xC4,0x92,0x46,0xCB,0xD1,0x65,0xD2,0x66,0x9D,0x96, + + 0x41,0x27,0x81,0x59,0x66,0xA0,0xE6,0x93,0xC5,0x3E,0xD9,0x75,0xD3,0x67,0x93,0x0F, + + 0xE1,0xF9,0x91,0xCB,0xF1,0xAB,0x4C,0x99,0x40,0x4C,0x89,0x7F,0xD5,0x2A,0x11,0xA4, + + 0x0F,0x70,0xD4,0xFE,0x1D,0x84,0xA9,0x98,0xB5,0x6A,0xB6,0xF9,0xB8,0xC6,0xC3,0x64, + + 0x9D,0x48,0x99,0x0F,0x5A,0x2E,0x97,0xD8,0xA2,0xB5,0x95,0x34,0xFB,0x2A,0x97,0x6A, + + 0xB5,0xFA,0x1C,0x9F,0x3F,0x39,0x40,0x39,0xB2,0xC9,0x4F,0xCE,0xA1,0xC6,0x4A,0x61, + + 0xE3,0x6F,0xC6,0x45,0xE7,0x42,0x49,0xEC,0x3B,0x37,0xD2,0x6C,0x5A,0x6C,0x2C,0xFC, + + 0x08,0xFF,0x15,0xA7,0x3F,0xA0,0x41,0x72,0x03,0x3C,0xDA,0x7C,0x5B,0x6D,0x41,0xB6, + + 0x77,0x62,0xA1,0x4C,0x9B,0x4E,0x93,0x04,0xC9,0x0C,0xD3,0x6D,0xDA,0x6E,0x8B,0x21, + + 0x98,0xA2,0xB5,0x70,0x72,0x5E,0x7B,0x2A,0xEF,0xC2,0xDB,0x7D,0xDB,0x6F,0x1F,0x18, + + 0x26,0xCA,0x8A,0xFA,0x93,0x55,0x72,0x01,0x89,0x13,0xC2,0x99,0x9B,0x81,0xD8,0x14, + + 0x50,0x79,0x3B,0x35,0xC1,0x72,0xAB,0x15,0x12,0x51,0x0F,0xC6,0x0E,0xF8,0x40,0x9F, + + 0x86,0xE6,0x3A,0x67,0x44,0x31,0x73,0x01,0x14,0x11,0xAE,0x14,0x84,0xDD,0xCD,0xFC, + + 0x8C,0xBE,0xBA,0x30,0xB7,0x19,0x55,0xBD,0x9A,0xDA,0x66,0x9A,0xDB,0x26,0x70,0x5F, + + 0x24,0x8D,0x3B,0xB6,0x1C,0xEB,0x48,0x92,0x99,0xAF,0xD4,0xE4,0x72,0x74,0xB3,0xF7, + + 0x82,0x57,0x6C,0x24,0x8F,0xE6,0x97,0xA0,0x9E,0x5C,0xDC,0xF4,0x73,0x75,0x0C,0xE6, + + 0x0E,0x1B,0x9F,0x30,0xCE,0x99,0x0F,0x1D,0x5E,0x14,0xD5,0xE5,0xF2,0x76,0x56,0x19, + + 0x7E,0x18,0xB3,0xD2,0x12,0xC8,0x58,0xE0,0xDF,0xFA,0xDD,0xF5,0xF3,0x77,0x93,0xB5, + + 0xC3,0x5C,0x4C,0x92,0x0A,0xCC,0xD6,0xC5,0xFD,0xF3,0xC6,0x87,0x04,0x6D,0xAA,0xFA, + + 0xDA,0x7C,0x95,0xA4,0xD0,0x2A,0x41,0xB4,0x6F,0x20,0x5E,0xC4,0xB0,0x3B,0x39,0xA5, + + 0xDE,0xB5,0xD2,0xFE,0xC4,0x78,0xC1,0xA8,0x68,0x4A,0x04,0x29,0xF4,0x75,0x37,0x62, + + 0x61,0x6A,0xF7,0xBA,0x50,0x08,0xB6,0x48,0x87,0x1B,0x9D,0x50,0x25,0x38,0xF2,0xB7, + + 0x89,0x5D,0x98,0x2E,0x3E,0x91,0xC3,0xAF,0xA8,0x3C,0xD6,0xEC,0x7A,0x7C,0x55,0x35, + + 0xA9,0x1A,0xF4,0x3E,0x97,0xC0,0xF2,0x6A,0x67,0x55,0xDE,0xFC,0x7B,0x7D,0x27,0xF6, + + 0x2B,0x5C,0x52,0x49,0x87,0x94,0x5F,0x22,0x03,0x2F,0xD7,0xED,0xFA,0x7E,0x6E,0x5D, + + 0xDA,0x0B,0xB7,0xCC,0x87,0x3B,0xDB,0x04,0x54,0x1E,0xDF,0xFD,0xFB,0x7F,0x5E,0x04, + + 0xED,0xD1,0xE8,0x1A,0x12,0x00,0xF0,0x26,0xD9,0xAE,0xA7,0x61,0x9E,0x71,0xE3,0x9B, + + 0xD1,0x82,0x90,0x26,0xF7,0x5E,0xE8,0xAC,0x46,0x01,0x86,0x0F,0x53,0x78,0xE1,0x7B, + + 0xA8,0xC0,0x5E,0x65,0x63,0xC7,0x0F,0x86,0x1A,0x6F,0xB9,0x23,0x5D,0xAA,0x8E,0xB2, + + 0x4D,0x32,0x93,0xAB,0x15,0x13,0x07,0x92,0x8C,0xC0,0xAA,0x55,0x22,0x86,0xB0,0xC6, + + 0x77,0xAD,0x4C,0xD5,0x66,0xAE,0x0E,0x5A,0xBB,0x45,0xF0,0x66,0x56,0xE4,0x17,0xD6, + + 0x76,0x9F,0x7D,0xA5,0x93,0x28,0xEB,0x72,0xAC,0x74,0xF8,0x76,0x57,0xE5,0x59,0xB9, + + 0x2A,0x8B,0xB2,0xB7,0xF9,0x07,0x75,0x9C,0x3B,0x6D,0xF1,0x67,0xD6,0xE6,0x37,0xB1, + + 0x83,0x7A,0xBB,0x78,0x7C,0xC3,0x43,0x80,0xFB,0x4A,0xF9,0x77,0xD7,0xE7,0x82,0x19, + + 0x7C,0xEC,0x62,0x1F,0xE3,0xEA,0x6A,0x27,0x4A,0xB1,0x8A,0xD1,0xBD,0x77,0xF5,0x9E, + + 0x7C,0x5A,0x4D,0xE1,0x7E,0x89,0x60,0xF6,0xEE,0xCD,0xC4,0x9F,0xB4,0xEA,0x1D,0x36, + + 0x8A,0xF3,0xB8,0xBD,0xFF,0xB3,0x3D,0x59,0x6F,0xAF,0xCC,0x5C,0xF6,0x1B,0xEB,0x76, + + 0xA0,0xC9,0x48,0xE1,0x9B,0xD2,0x6D,0xFC,0x24,0xA8,0x68,0xCC,0xFF,0x56,0xA2,0x5B, + + 0xF1,0x11,0xDA,0xB1,0xF7,0xDD,0x64,0x56,0xB1,0x61,0xF2,0x6E,0x5E,0xEC,0xED,0x58, + + 0x90,0x29,0x92,0x79,0xE2,0xA2,0xA7,0x7E,0x34,0x46,0xFA,0x7E,0x5F,0xED,0x1B,0x6C, + + 0x77,0x81,0x23,0x22,0xEB,0x23,0x64,0xDB,0x4E,0x11,0xF3,0x6F,0xDE,0xEE,0xBB,0xFE, + + 0xC7,0x3E,0xD5,0x67,0xF7,0xDE,0x20,0x54,0xC9,0xEF,0xFB,0x7F,0xDF,0xEF,0x84,0x91, + + 0x10,0xF4,0xDC,0x02,0x45,0x1C,0x03,0x17,0x98,0x13,0x8A,0x02,0xFB,0x76,0x4D,0x16, + + 0x54,0xA4,0x28,0xF1,0xB7,0x1D,0xA1,0xE3,0x84,0xDE,0x6C,0x26,0x8A,0xF5,0x1B,0xBE, + + 0xA2,0xEB,0x9F,0x7D,0x4F,0xF0,0xF5,0xC6,0x9B,0x90,0xB5,0xE7,0xB0,0x5F,0x25,0x82, + + 0xCE,0x10,0xFD,0x13,0xFD,0x05,0x89,0xCC,0x46,0x5E,0x3D,0x88,0xD3,0x07,0x3A,0xEF, + + 0x2E,0x92,0x93,0xF9,0x46,0xF5,0x14,0xCD,0x01,0xD9,0xF4,0xE6,0x76,0xF4,0x52,0xFF, + + 0xAA,0x63,0x53,0x44,0xD5,0x68,0x0E,0x0D,0x6B,0x2E,0xFC,0xF6,0x77,0xF5,0x4B,0xEC, + + 0x07,0x69,0x25,0x1B,0xAC,0xD8,0x0B,0xDB,0x0F,0x47,0xF5,0xE7,0xF6,0xF6,0x25,0x73, + + 0xA1,0xEE,0x8F,0xD7,0xB6,0xA7,0x82,0xD7,0x0E,0x46,0xFD,0xF7,0xF7,0xF7,0x22,0x88, + + 0x20,0x33,0xA0,0xB3,0xB4,0xB8,0x48,0x1F,0xE1,0x75,0x66,0xDD,0x04,0xBA,0x6D,0x89, + + 0x55,0xDD,0x3B,0x85,0x4D,0x34,0x1E,0xFA,0x2B,0x74,0x0A,0xDC,0x82,0xBB,0x75,0x74, + + 0xAA,0x03,0x37,0x91,0x88,0x4E,0x61,0xDB,0x6C,0x5C,0x2A,0xFA,0x5D,0x25,0x09,0xA3, + + 0x21,0x36,0xD1,0x3E,0x56,0xB8,0x6D,0xCB,0x6D,0x5D,0xA4,0x77,0x14,0xB8,0x7D,0xA8, + + 0xD9,0xF9,0xBC,0xA6,0xE0,0x43,0x6E,0xFE,0xEC,0xA9,0xF6,0xEE,0x7E,0xFC,0x26,0xB8, + + 0xDC,0xF8,0x7E,0xDE,0x3F,0xBD,0xA1,0x01,0x4B,0xDB,0xFE,0xFE,0x7F,0xFD,0x5F,0x34, + + 0xA8,0xE7,0xBD,0xCE,0x68,0x61,0x2D,0x89,0xCD,0xBE,0xF7,0xEF,0xFE,0xFE,0x57,0x20, + + 0xA9,0x2E,0xEF,0xDF,0xBF,0xBF,0xCA,0x0A,0x4E,0x20,0xFF,0xFF,0xFF,0xFF,0xA3,0x2C, + + 0xDC,0x71,0x7F,0xF4,0xEF,0x2F,0x8D,0xB6,0xE1,0x9F,0x34,0x46,0xAB,0x05,0xAF,0x16, + + 0xD5,0x65,0xB6,0xB4,0xF3,0xA8,0x0F,0x36,0x89,0xD0,0xB7,0xD6,0xFD,0xDC,0x22,0x39, + + 0x58,0xB3,0x35,0xE7,0xD8,0x21,0xA5,0x43,0x3F,0xE6,0xA9,0xA7,0x15,0x19,0x31,0xEF, + + 0x2D,0x0E,0xB4,0x91,0xAC,0x45,0xBD,0xB5,0xF4,0xBD,0xE1,0x46,0xE3,0x92,0x20,0x16, + + 0xCA,0xF8,0x5D,0x57,0x71,0x04,0xFA,0x93,0xC6,0xC9,0xA8,0x60,0x56,0xC4,0x76,0x6C, + + 0x8E,0x83,0xB0,0xA9,0xAC,0x64,0x27,0xF2,0x86,0x71,0xE0,0x44,0xB0,0xCA,0x39,0x66, + + 0x7F,0x09,0xB9,0x62,0xF1,0xA9,0x07,0xD4,0xC4,0x3F,0x2E,0x16,0xE6,0xC7,0xCD,0x11, + + 0xDD,0xAA,0x09,0x21,0xD0,0xAA,0xF6,0x93,0x6F,0xBA,0x79,0x07,0xB1,0xCB,0xFD,0x13, + + 0x8C,0x9C,0xBA,0xF7,0xB4,0x25,0x72,0x07,0x1C,0x0A,0xEC,0x2A,0xB1,0x8B,0x6A,0x37, + + 0x0B,0xD4,0xF2,0x3B,0xE0,0x26,0x4C,0xC6,0x4F,0x30,0x30,0xC5,0x84,0x66,0xA7,0x8D, + + 0xBD,0xF4,0x43,0x75,0x1F,0x96,0x8E,0xBF,0xCE,0xD3,0x53,0x40,0x2B,0x6C,0x73,0x3E, + + 0x74,0x04,0x2C,0x20,0x70,0xDA,0xFF,0x47,0x6A,0x2E,0x2F,0x42,0x7A,0xCF,0xD5,0xDA, + + 0x0E,0x04,0xA2,0x1F,0xE2,0x23,0x2A,0x57,0x78,0x99,0xAC,0x6B,0x7E,0x6A,0xB1,0xDC, + + 0x36,0xF7,0xCE,0xD8,0x59,0x77,0x7C,0xC0,0x79,0xE9,0x84,0x9E,0x5F,0x2D,0x06,0x3A, + + 0xF6,0x8F,0x03,0x35,0x87,0x55,0x85,0x7A,0xF4,0xAD,0x66,0xED,0x33,0xBF,0x75,0xE1, + + 0xF7,0xA0,0x0B,0x30,0x53,0xF2,0x0E,0xD4,0x03,0x1C,0xDD,0x82,0xB8,0xC7,0xDA,0xE2, + + 0xD3,0x75,0xD6,0xC3,0xD9,0xB3,0x4A,0x18,0x52,0xFB,0xEA,0x26,0xB5,0x54,0xA1,0xF2, + + 0xD6,0x74,0xEE,0x94,0x32,0xD1,0x8F,0x23,0x47,0xAE,0xE4,0xC7,0x0D,0x1D,0x3D,0x7A, + + 0xA6,0x8B,0xE7,0x3D,0x59,0x51,0x86,0xA0,0x6D,0xFF,0x3A,0x47,0x5C,0x8F,0x35,0x6E, + + 0xA7,0xFA,0xB7,0x66,0x9F,0x9C,0x23,0x8D,0x89,0x10,0xFF,0xB1,0xF0,0x41,0xE4,0xB2, + + 0x40,0xD8,0xBC,0xC0,0x36,0x94,0x34,0xB6,0xF6,0x59,0xC6,0x42,0x99,0x30,0x2C,0x86, + + 0xB7,0x18,0x3C,0x5C,0x58,0x3A,0x79,0x92,0xA1,0x55,0x78,0xD0,0x75,0x35,0x85,0xB9, + + 0xC2,0x78,0x3A,0xB6,0xCE,0x30,0x37,0x77,0x60,0x9A,0xEF,0x55,0x3B,0xD9,0xAA,0x53, + + 0x66,0x23,0x4D,0xD1,0xFB,0xC8,0x55,0xF9,0x80,0xA8,0x70,0xAF,0x06,0xEB,0x1C,0x79, + + 0x8B,0x58,0xD4,0x8E,0x7E,0x54,0x68,0x09,0x81,0x1B,0xA8,0x91,0x18,0xA7,0xED,0x1C, + + 0x61,0xE6,0xB0,0x39,0xFB,0x39,0xCA,0x42,0x80,0x88,0x4C,0x81,0x92,0x3D,0x39,0xB4, + + 0x2A,0x8F,0xB9,0x3D,0x7A,0x60,0x05,0xA8,0x13,0xD7,0x57,0xC0,0xA7,0xD7,0xCF,0xE1, + + 0xC3,0xC4,0x87,0x90,0x50,0xB8,0xB3,0x22,0x18,0xD2,0xA1,0x0C,0xFF,0x02,0x7E,0x56, + + 0x2B,0xBC,0xF8,0xE1,0x51,0x33,0x08,0x0A,0x5F,0x1E,0xF9,0x93,0xA3,0xD1,0x36,0xC9, + + 0x09,0xB0,0x4E,0xCD,0xC4,0x90,0x7B,0x9A,0x9C,0x38,0xE0,0x5D,0x75,0xCC,0xFC,0x2B, + + 0x06,0xE3,0x47,0x4F,0x18,0x2A,0xD3,0x81,0x68,0x92,0x87,0xAA,0xF4,0xA1,0x1F,0x6B, + + 0xE7,0x21,0x58,0xED,0x44,0xC0,0x67,0x06,0xCF,0x52,0x20,0x87,0x8D,0xA0,0x40,0x2D, + + 0x06,0x8D,0x4C,0x95,0x3E,0xA8,0x8F,0xC0,0x0C,0x11,0x62,0x20,0x9C,0x43,0x1B,0x30, + + 0xD8,0x8E,0xB3,0x59,0x13,0xD8,0x22,0x72,0xCE,0x6A,0x80,0xC9,0xF9,0xEC,0xDE,0x24, + + 0x25,0x84,0x21,0x46,0xEF,0xE0,0x0F,0x1F,0x49,0x44,0x15,0xA3,0xE9,0x59,0x9D,0x6C, + + 0x26,0x38,0x4B,0x75,0x62,0xC6,0xEF,0x0D,0xAE,0xD0,0xD9,0x61,0xAA,0x1F,0xC0,0x31, + + 0x38,0xC6,0x98,0x61,0xEB,0xAB,0x23,0x71,0x2C,0xF7,0xE6,0x4A,0xBD,0xA0,0xCE,0x0D, + + 0xA4,0xE0,0x13,0x71,0xB6,0xCB,0x2E,0x6D,0x21,0x65,0x5C,0x52,0x3C,0xEA,0xFC,0xB9, + + 0x04,0x4A,0x21,0x2A,0x5E,0xAB,0x57,0xD7,0xF0,0x12,0xCB,0xD7,0x1F,0x49,0xD6,0xB1, + + 0xE4,0x78,0x8B,0x6F,0x62,0x21,0xEA,0x00,0xB3,0xAB,0x7E,0x04,0xA7,0x62,0x38,0xF7, + + 0x6D,0xCA,0x9A,0xF1,0x1A,0xD1,0x62,0xDB,0x26,0x5D,0xCA,0x09,0xA1,0xE7,0xAC,0xE9, + + 0x2B,0x22,0x92,0xE5,0x1B,0x40,0x6F,0x9D,0x26,0x9A,0x3A,0x7E,0x09,0xAB,0xEC,0x05, + + 0x71,0x0B,0x7D,0x6D,0x6F,0xCF,0x6D,0x9F,0x6C,0x61,0x8D,0x13,0x51,0x6C,0xBC,0x1A, + + 0x8B,0xF2,0xB1,0x01,0xB3,0x5F,0x0A,0xCA,0xF3,0x6C,0x26,0xF2,0xDB,0x92,0x02,0x1C, + + 0x96,0x83,0xE6,0x0E,0x5A,0xAA,0x10,0x1A,0x4D,0x8C,0xE4,0x43,0xB5,0xA8,0x3A,0x29, + + 0x2D,0x2C,0x92,0xA3,0xE2,0xEC,0x8A,0x18,0xC0,0x4B,0x5E,0x0D,0xDB,0xAC,0xD7,0xA9, + + 0x6F,0x21,0xCD,0x74,0xFD,0x8E,0x77,0x3D,0x4C,0xD2,0xC9,0xDE,0x7D,0x41,0x53,0x6B, + + 0xB0,0x20,0x14,0x2C,0xEF,0x04,0x7A,0x3B,0x81,0xA1,0xC5,0x57,0xB7,0xE2,0x7A,0x60, + + 0x20,0x3D,0xB2,0xE4,0xDF,0x33,0x14,0x48,0x07,0xD4,0xCF,0x24,0xB1,0x94,0xEC,0x83, + + 0xDA,0x4C,0x78,0x6A,0xF0,0x4A,0x38,0xC1,0x4F,0xBF,0xC4,0xC5,0x01,0x9D,0xB2,0x01, + + 0x54,0x97,0x9B,0x22,0x9A,0x1D,0x54,0x63,0xE0,0x29,0x1A,0x45,0x58,0x0F,0x55,0xB4, + + 0x58,0x9C,0x70,0x7A,0xE1,0x08,0x5F,0xC3,0xE4,0xB3,0xDF,0xB3,0xF4,0xE1,0x04,0x94, + + 0xB2,0x99,0xDE,0x76,0xC9,0x6B,0x0F,0xC5,0xC7,0x6B,0xC7,0x46,0x8E,0xD7,0xC6,0xD9, + + 0x86,0x36,0x57,0x73,0xC0,0xF4,0xDB,0xDE,0x61,0x1C,0x2E,0xD2,0x34,0x05,0x73,0x73, + + 0x59,0x90,0x5A,0xF6,0x17,0x49,0xB5,0x96,0x87,0x97,0x35,0xE3,0x2D,0x02,0xB9,0x2D, + + 0xA1,0x0E,0xD3,0xFA,0xDC,0xB8,0x9A,0x71,0x2E,0xA2,0x02,0x84,0xCB,0x5C,0x20,0xB7, + + 0xC5,0x69,0x59,0x0A,0x63,0xAE,0x68,0x0B,0x41,0x55,0x88,0x93,0xBE,0x98,0x00,0x6B, + + 0x59,0xB9,0x7C,0xA3,0xD6,0xFD,0xD6,0x4B,0xCE,0x99,0xAC,0x45,0x7B,0x80,0x8B,0x19, + + 0xCD,0x92,0x67,0xE2,0xA3,0x17,0x49,0x0B,0xEA,0x43,0xBF,0x2B,0x15,0x0B,0xEF,0xE3, + + 0x30,0xD9,0x91,0x2E,0xCB,0x14,0x01,0x1B,0xEB,0x7B,0x70,0x3B,0xC0,0x54,0x8E,0x4E, + + 0x13,0x27,0x66,0x4C,0xC2,0xB0,0xC9,0x08,0x8D,0xD5,0x8E,0xEA,0x7A,0x5C,0x16,0xCB, + + 0x53,0xBC,0xF9,0xD8,0xF7,0x2C,0x83,0x9A,0x2F,0x20,0x80,0xF8,0x96,0xCE,0xDC,0x29, + + 0x02,0x63,0x67,0xDE,0x41,0x1A,0xF6,0x89,0x11,0x57,0x08,0x9C,0xC8,0x0F,0xAC,0xA8, + + 0x9D,0x1E,0x4B,0xAC,0xC3,0x14,0x0D,0x00,0xB7,0x9D,0x2C,0x0C,0x73,0xF2,0xFF,0x27, + + 0xA1,0x41,0xF1,0xF0,0x53,0x63,0x3E,0x1E,0x9D,0x4F,0xDA,0x75,0x63,0x30,0x76,0x16, + + 0xE0,0x82,0x71,0x9E,0x76,0x4B,0x20,0xCF,0xED,0x4C,0x52,0xE4,0x18,0x09,0x5B,0x69, + + 0xE8,0x53,0x06,0x95,0x98,0xDD,0xA5,0x5E,0x63,0x03,0x6E,0xDA,0x2B,0x77,0x27,0xE2, + + 0x0D,0x42,0x9D,0x15,0xCD,0x63,0x79,0x62,0x63,0xBF,0x1D,0xCA,0x2E,0x3C,0x87,0xFD, + + 0x3B,0xB3,0xCB,0x56,0xE2,0x29,0x40,0x75,0x42,0x62,0x2C,0x9B,0x94,0x91,0xD7,0x15, + + 0x03,0x74,0x72,0x27,0x0D,0xB7,0xCD,0xBC,0xAB,0x6A,0xFB,0x85,0xD5,0x62,0xFA,0xBE, + + 0x2F,0xC1,0x3E,0xAE,0x67,0x7B,0x1C,0x49,0x8E,0x46,0xFE,0x92,0x05,0xE1,0x10,0x7A, + + 0x62,0xCA,0x50,0x42,0x3D,0x5B,0xA6,0xA3,0x51,0xAD,0x83,0xA1,0xE1,0x35,0x58,0x06, + + 0x60,0x19,0x56,0xA9,0xC9,0x64,0x6A,0x0F,0xB5,0x47,0xA3,0xFC,0x19,0xC0,0x24,0xEB, + + 0x85,0x48,0x0D,0xB9,0x3F,0x94,0x62,0x29,0x75,0xE4,0xD6,0x19,0x1C,0x32,0x7D,0x0F, + + 0x69,0x89,0x57,0xB5,0x49,0xBA,0x83,0xCB,0x64,0xB7,0xD9,0x39,0x27,0x8F,0x35,0x20, + + 0xF5,0xA4,0xA1,0xB8,0xED,0xB5,0x8E,0x1D,0x22,0x2F,0x30,0xC2,0xD9,0x94,0x6E,0xA5, + + 0x17,0x6E,0xFB,0xA2,0xB3,0x40,0x41,0x68,0x4A,0xCE,0xD6,0x6C,0x12,0x1C,0x25,0xA7, + + 0x53,0xDF,0xCA,0x5C,0x57,0xDD,0x07,0x7E,0xCD,0x88,0x48,0x45,0x75,0x3E,0x06,0xE4, + + 0xB5,0x2B,0x65,0x39,0xD7,0x5C,0x42,0x29,0x95,0x45,0x93,0xFC,0xC4,0x6F,0x59,0x75, + + 0xBD,0xA7,0x8E,0x6D,0xB1,0x17,0x73,0xBA,0x2E,0x50,0xD7,0x34,0xD0,0x35,0xB0,0xE2, + + 0xDB,0xBD,0xD6,0xD8,0x91,0x51,0x6A,0xA7,0x81,0x36,0x9E,0x32,0xB7,0x8F,0x36,0x35, + + 0x05,0x17,0xA7,0x11,0x43,0xED,0x9C,0xA1,0x52,0xF5,0x1F,0xB4,0x6D,0x62,0x92,0xB1, + + 0xA8,0xED,0x86,0x80,0x9C,0xA1,0x85,0x23,0x29,0x51,0xBC,0x83,0x81,0x23,0xA6,0xA4, + + 0x00,0x91,0x59,0x90,0xF1,0xA4,0x88,0xB7,0x29,0x02,0x00,0x0F,0x48,0x73,0x32,0x82, + + 0xF3,0xDA,0x5E,0x01,0x42,0xC6,0xB6,0xBB,0x8D,0x08,0xD4,0xE4,0x72,0x74,0x63,0x7B, + + 0x40,0xCF,0x93,0x4B,0xBE,0x78,0x2C,0x0F,0xEC,0x43,0xDC,0xF4,0x73,0x75,0x7F,0xBE, + + 0x5D,0xE9,0xC0,0xC5,0xD0,0x8C,0x76,0xB8,0x98,0xFD,0xD5,0xE5,0xF2,0x76,0x58,0x44, + + 0xA3,0xD7,0x32,0xAB,0x6A,0x70,0x0F,0xF0,0xF5,0x6C,0xDD,0xF5,0xF3,0x77,0xF9,0x0A, + + 0xE1,0x6D,0xA9,0x09,0x4A,0xA4,0xB2,0x8C,0xA0,0x4B,0x17,0x24,0x1C,0x82,0x28,0xB5, + + 0xAD,0xBD,0xA5,0xC6,0x17,0xAA,0x8E,0xB8,0xFB,0x92,0x7A,0x82,0xF2,0xB4,0x3F,0x19, + + 0x53,0x5B,0xBF,0xA8,0xB4,0xBA,0xB7,0xBA,0x86,0x3E,0xCF,0x44,0x7C,0x6E,0x9E,0x9E, + + 0x8D,0xB6,0xA4,0x38,0x95,0xAB,0x01,0xFC,0xCF,0x59,0xE6,0x42,0xE5,0x1B,0x57,0x9D, + + 0xFA,0x29,0xA2,0xB1,0x3D,0xDF,0xB9,0xCB,0x7F,0x6E,0xD6,0xEC,0x7A,0x7C,0xA5,0x1A, + + 0x9D,0x38,0x23,0x67,0xE1,0xE9,0x16,0x7D,0x2E,0x26,0xDE,0xFC,0x7B,0x7D,0xAA,0x2B, + + 0x15,0x63,0xC7,0x37,0x5D,0x23,0x1A,0x8F,0x65,0xE8,0xD7,0xED,0xFA,0x7E,0xEA,0xA8, + + 0xBE,0x0C,0xD0,0xBD,0xAE,0x9C,0xF3,0x37,0x73,0x9C,0xDF,0xFD,0xFB,0x7F,0x80,0x71, + + 0x74,0x53,0xA3,0x02,0x57,0xC8,0x0A,0xA5,0xBB,0x6B,0x09,0xD7,0x15,0x49,0x9C,0x70, + + 0xFA,0xC0,0xC3,0x1B,0x49,0xE3,0xA8,0x50,0xF2,0xA4,0x47,0x25,0xB6,0x30,0x5F,0x04, + + 0x25,0x5D,0xF5,0xDD,0x3A,0xE1,0x49,0x33,0x2D,0xB3,0x68,0x79,0x2B,0xE2,0x49,0xB5, + + 0x24,0x28,0xBD,0x58,0x37,0xE1,0x01,0xDC,0x48,0x7E,0x94,0x21,0xBC,0xA0,0x2F,0xC9, + + 0xBA,0x43,0x2E,0xA2,0xC2,0x01,0x8F,0x62,0x42,0x74,0xEA,0x66,0x4A,0x74,0x97,0xD7, + + 0x7D,0x4C,0xC3,0x65,0x83,0x1C,0x8C,0xA0,0xA6,0xBA,0x3A,0xFA,0x09,0x44,0x4E,0x8C, + + 0x63,0xB9,0x16,0x8C,0x6B,0x59,0xE3,0x2B,0x95,0x22,0x72,0x7A,0xDC,0x64,0x8D,0xE9, + + 0x26,0x18,0xA5,0x73,0x97,0x06,0x82,0x95,0x72,0xC9,0x6E,0xCA,0x88,0x10,0x5A,0x0E, + + 0x08,0x28,0xC9,0xB4,0x00,0xC8,0xD7,0x50,0xDA,0x89,0x35,0x7C,0xAC,0x63,0x12,0x27, + + 0xF2,0x14,0xA1,0xD8,0x33,0xC9,0xC5,0x7D,0x69,0x66,0xB8,0xAB,0x6D,0x03,0xDC,0x69, + + 0x7F,0xEF,0xF1,0x42,0x45,0x29,0x0B,0xD5,0x60,0xC7,0x3B,0x0F,0x9A,0x8A,0xF8,0x3F, + + 0x2C,0x14,0x2F,0x3B,0x6D,0x7B,0x9B,0x49,0xA7,0xB8,0x9A,0x81,0x1E,0x14,0x9D,0xB9, + + 0xD3,0x39,0xE8,0x3E,0x9E,0x5A,0xE9,0xB7,0x09,0x5F,0x0D,0x6E,0x5E,0xEC,0xEB,0xC7, + + 0x33,0xDE,0x93,0xA8,0xA6,0x00,0xE0,0xFD,0x9A,0x62,0xFA,0x7E,0x5F,0xED,0xC7,0x16, + + 0xA2,0x8E,0xCF,0x2D,0x61,0x51,0x71,0x6A,0xC4,0x1D,0xF3,0x6F,0xDE,0xEE,0x64,0x26, + + 0x17,0x4A,0x87,0xE0,0x49,0xFB,0x84,0x99,0x14,0xFD,0xFB,0x7F,0xDF,0xEF,0x37,0x73, + + 0x87,0xD0,0xA2,0x91,0x53,0xD8,0xCB,0xBE,0x64,0x1B,0xB0,0x2E,0x5A,0x99,0xC5,0x61, + + 0xA1,0x3C,0x2D,0x8A,0x52,0x38,0xBB,0x4C,0x90,0xD1,0xD9,0xF8,0x96,0x4E,0xA5,0x92, + + 0x5B,0x13,0xE5,0x87,0xF3,0xA9,0xAF,0xD2,0xA5,0x91,0xEF,0x56,0xCB,0x76,0x89,0x23, + + 0xD4,0x3C,0xAD,0x97,0xD1,0x5A,0x5C,0x39,0xDC,0x97,0xC2,0xB3,0xAD,0x32,0xF2,0x4B, + + 0x7E,0x34,0x75,0x52,0x62,0xB4,0xB1,0x22,0xE4,0xCA,0xF4,0xE6,0x76,0xF4,0xB4,0x70, + + 0x86,0x48,0x22,0xE6,0x31,0xF7,0x31,0x61,0xF6,0x2A,0xFC,0xF6,0x77,0xF5,0x65,0x42, + + 0xC2,0x3C,0x5B,0x81,0x0E,0x3D,0x01,0x93,0xF4,0xA4,0xF5,0xE7,0xF6,0xF6,0x92,0x21, + + 0x20,0x12,0xFB,0xB7,0x90,0x32,0x7F,0xF3,0xB3,0x36,0xFD,0xF7,0xF7,0xF7,0x82,0xF8, + + 0xA2,0xD9,0x78,0x9B,0x78,0x47,0xF6,0x8E,0x48,0xF8,0x3F,0xCA,0x5B,0xA3,0xC6,0x1D, + + 0x09,0x94,0x29,0x61,0x61,0x46,0x5F,0x4E,0x04,0xDA,0x05,0x4C,0xCA,0x06,0x19,0xA7, + + 0x2E,0x62,0x58,0x7C,0xD9,0x70,0x33,0x54,0x1B,0x84,0x11,0x28,0x42,0x97,0xD0,0xBC, + + 0x0C,0x9D,0x50,0x64,0x0D,0x71,0xB8,0xBA,0xB1,0x66,0x53,0x9D,0xE6,0xD8,0xC3,0x1B, + + 0x54,0x3E,0x4E,0xB5,0xC1,0xBC,0xFD,0x0A,0x11,0x88,0xF6,0xEE,0x7E,0xFC,0x9F,0xE9, + + 0xFD,0x79,0x72,0xAA,0x02,0x26,0x81,0x14,0x8C,0x4F,0xFE,0xFE,0x7F,0xFD,0x98,0x28, + + 0x03,0x72,0xA1,0x6B,0xA7,0x44,0x92,0x51,0x4B,0x71,0xF7,0xEF,0xFE,0xFE,0xB6,0x0F, + + 0xFE,0xDC,0x89,0x7C,0x66,0x52,0xF8,0xF3,0xEF,0xEE,0xFF,0xFF,0xFA,0xC0,0x80,0x00, + + 0x55,0x40,0xF8,0x76,0xFB,0xDA,0x69,0xF0,0x0C,0xC1,0x50,0x25,0xAC,0x9B,0x4C,0xB4, + + 0x25,0x41,0x92,0x3A,0x30,0xC1,0x32,0xE0,0x1D,0xC9,0xE8,0xEB,0xE6,0x2D,0x01,0x85, + + 0x86,0x02,0xE1,0xC5,0x5E,0x2F,0x12,0x6B,0x4D,0x21,0x90,0xE3,0x72,0x2E,0x09,0x05, + + 0x22,0x66,0x49,0xC4,0x90,0xAE,0x09,0x7B,0x4D,0x4B,0xEF,0x26,0xF7,0x27,0x65,0x46, + + 0x96,0x60,0xBB,0x3A,0xC8,0xFB,0xF0,0x6E,0xCE,0xC9,0x90,0x17,0xD6,0x55,0xA7,0xBE, + + 0x83,0x9D,0xF2,0x0A,0xE8,0x64,0xB7,0x9B,0xC3,0xD9,0x09,0x87,0xDF,0x68,0x79,0x66, + + 0x25,0x16,0x46,0x96,0x31,0x1B,0xB5,0x46,0x65,0x56,0xAF,0x63,0x3B,0x02,0x69,0x97, + + 0x03,0x58,0xF6,0xBF,0x78,0x28,0x78,0x93,0x3E,0x4E,0xA7,0x97,0x7F,0x6A,0x92,0x2C, + + 0x2E,0x48,0xDB,0x15,0xBF,0x6A,0x10,0xDA,0x0F,0x4C,0xB4,0x8D,0xD4,0xB3,0x0A,0x18, + + 0x09,0x49,0x4A,0xC1,0xFD,0x2F,0x20,0x3A,0x55,0x69,0xEA,0x1A,0xBB,0x0A,0xC5,0x6E, + + 0xAE,0x49,0x5D,0xB9,0x1D,0xDF,0x17,0x7D,0x2F,0xB4,0xB3,0xD0,0x98,0x24,0x1E,0x26, + + 0x89,0x0B,0x03,0x58,0x38,0xA1,0x9B,0x29,0xD9,0x49,0x2B,0x8A,0xF7,0x27,0x62,0x1E, + + 0x8A,0x82,0x79,0x5E,0x3A,0x62,0x56,0x74,0x1F,0x45,0x42,0xAC,0x42,0x51,0x6A,0xFD, + + 0x8B,0x0F,0x94,0xBE,0x0B,0xD0,0x48,0x7C,0xA9,0xCD,0xA2,0x74,0xBE,0x2C,0x63,0x20, + + 0x0A,0x41,0x80,0xB3,0x62,0x21,0xFF,0x63,0x69,0xF3,0xC5,0x6B,0x69,0xAA,0x6B,0x6F, + + 0x0B,0x52,0x5C,0xA2,0x62,0x4C,0x5B,0xB9,0x71,0xE0,0x2E,0x83,0xCF,0x52,0x04,0x80, + + 0x78,0xF8,0x7C,0x74,0x38,0x3F,0x2C,0xC0,0xD0,0x58,0x7B,0x4A,0xF0,0xB8,0xDE,0xB0, + + 0x26,0xE9,0x64,0xAE,0xB3,0x19,0xE5,0xC2,0xEF,0x34,0x73,0x5A,0xF1,0xA2,0x4F,0x28, + + 0x82,0x11,0x2D,0xBB,0x37,0x47,0x64,0xD3,0x6E,0x37,0x2B,0xAC,0x57,0x62,0x02,0x1D, + + 0x24,0xE6,0x0B,0x65,0xF5,0x3C,0x64,0xC3,0x6F,0x36,0xBC,0xB3,0x21,0x17,0x6A,0xC6, + + 0xB3,0x88,0xBF,0xBA,0x10,0xD9,0xAF,0xE4,0xCF,0x15,0x70,0x48,0x99,0x10,0x71,0x0E, + + 0xCE,0x11,0x60,0x4B,0xCC,0xB8,0x66,0x77,0x47,0xA8,0x68,0x16,0x57,0x7F,0x6B,0xC6, + + 0x73,0xE8,0x83,0x63,0x79,0xBB,0x70,0xE7,0x76,0x32,0xEC,0x07,0x1B,0x79,0x4A,0xDA, + + 0x27,0x43,0x2E,0x2B,0xB5,0x77,0x7A,0x13,0x03,0x42,0xD8,0x9E,0x9B,0x33,0xC6,0x55, + + 0xCC,0xB3,0xE6,0xCD,0x7C,0x37,0x3F,0xFB,0xEC,0x44,0x28,0xA5,0xDB,0x1D,0x21,0x69, + + 0x02,0x1C,0x09,0x7E,0xBB,0x11,0x66,0x9F,0xF8,0xF5,0x22,0xB5,0x9E,0x69,0x37,0xD7, + + 0xC3,0x11,0xE7,0xCC,0xF0,0xB1,0xBE,0xFA,0x64,0x06,0x78,0x43,0x78,0x39,0x51,0x91, + + 0x8A,0xB0,0x8D,0x7F,0xBD,0xD8,0xBF,0xF3,0x7C,0xF7,0x70,0x53,0x79,0x60,0xE2,0xBA, + + 0xA4,0x79,0xA9,0x8B,0xDB,0x8A,0x2E,0xB7,0xBA,0x53,0xFF,0x1A,0x6A,0xB9,0x75,0x36, + + 0x93,0x12,0xEE,0xD9,0x3D,0x7D,0x26,0xCA,0x1F,0x82,0xDB,0x97,0x13,0x39,0xBD,0xC1, + + 0x75,0x21,0xB8,0xBF,0x68,0xA1,0x65,0xC1,0x3F,0xEA,0xAF,0xC9,0x44,0xA1,0x70,0x36, + + 0x8F,0x2B,0xA0,0x7D,0x70,0xDF,0xCF,0x43,0xEB,0x2F,0xF6,0x1B,0x12,0x70,0x20,0x02, + + 0x04,0xC0,0x5B,0xE4,0x96,0x88,0x20,0x62,0xC4,0xC6,0xC0,0xF9,0xB7,0xA2,0x28,0x12, + + 0x05,0xC1,0xD0,0x94,0x10,0xF2,0x3C,0xB5,0x64,0x56,0x55,0x5D,0xD0,0xE6,0xEE,0x07, + + 0x84,0x82,0x1D,0x65,0xD5,0xE2,0x7E,0x83,0x25,0x19,0xB1,0x3B,0x03,0x5F,0x29,0x87, + + 0x85,0x83,0x93,0xF5,0x39,0x23,0x8D,0xCC,0x86,0x30,0x51,0x94,0xF1,0x1E,0x40,0xCC, + + 0x86,0x91,0x9F,0x06,0x5A,0xB2,0xD0,0x0D,0x26,0x84,0xE6,0x60,0xE5,0xA9,0x48,0x1C, + + 0x87,0xE6,0x10,0x72,0x9A,0xB3,0xCF,0x57,0x6B,0x6D,0x68,0x05,0xDB,0xB4,0x41,0x8D, + + 0x06,0xCB,0xA9,0x53,0x5D,0xA9,0x03,0x73,0xC6,0xCC,0x8F,0x85,0xC6,0xAB,0x4C,0x55, + + 0x13,0xE3,0x96,0x4A,0x5C,0xA8,0xD9,0x56,0x45,0x87,0x87,0x70,0x6E,0x81,0x22,0x0A, + + 0x0C,0xC8,0xDA,0x8A,0x43,0x06,0x62,0x59,0x54,0x42,0x6D,0x26,0x72,0xAE,0x2A,0x1A, + + 0x0D,0xC9,0xD7,0xEF,0xAF,0x39,0x8E,0x5A,0x45,0x19,0xCA,0xE1,0xB2,0xA8,0x23,0x9E, + + 0x8C,0x8A,0x7C,0xA2,0x9A,0x5B,0xF4,0xD5,0x2D,0xAC,0x41,0xE9,0x7E,0xA6,0xE6,0x47, + + 0x8D,0x8B,0x43,0x35,0x1F,0xA3,0x94,0xEB,0x4C,0x6A,0x05,0x36,0x3A,0xFB,0x59,0xA4, + + 0xEF,0xEA,0x5B,0x6A,0x9B,0x02,0x71,0x8F,0xF0,0xEC,0x8C,0x8C,0xF2,0xD1,0x43,0x00, + + 0xC6,0xE9,0x1A,0x8D,0xFE,0xC1,0xDE,0x18,0x6B,0xC7,0xFE,0xFF,0xB6,0xA9,0xD7,0x01, + + 0x47,0xCA,0xD8,0xEF,0x73,0x9E,0xF1,0x60,0x4A,0x9A,0x17,0x4B,0x6D,0x99,0x40,0xB9, + + 0x23,0x93,0x8C,0xA4,0x7E,0x39,0xFB,0x0C,0xEB,0xB8,0xEE,0x8C,0x5B,0x42,0x01,0x82, + + 0x4F,0xB4,0xED,0x98,0x48,0x44,0x90,0xEC,0xBB,0xED,0x08,0xAF,0xD3,0xE0,0xAC,0x92, + + 0x94,0x1C,0x7C,0x50,0xDF,0xFD,0x63,0xFA,0x1A,0xF1,0x9D,0xB0,0xA5,0x95,0xDA,0x87, + + 0xA4,0xF7,0xF5,0x9D,0x9E,0x06,0xDE,0xD4,0x64,0x05,0x5A,0x49,0x74,0xF9,0xC9,0xB4, + + 0x16,0x1E,0x5D,0xD1,0x1F,0x48,0xFD,0x73,0xF6,0xD5,0x01,0xBE,0x56,0x96,0xC4,0xCC, + + 0xAA,0x09,0x48,0xB4,0xE8,0x4B,0x87,0xE2,0x5E,0x29,0xF5,0x00,0x52,0x09,0x42,0xD4, + + 0xB6,0x09,0xC2,0x34,0x84,0xD0,0x4B,0x10,0x43,0x58,0x07,0x8D,0x4D,0x4A,0x9C,0xA1, + + 0x0A,0x8A,0xDF,0x59,0x41,0xF7,0x52,0x01,0x26,0x29,0x60,0x18,0x03,0xA5,0x43,0xD4, + + 0x76,0x98,0xD5,0xFF,0x14,0x1B,0x56,0x19,0x8C,0xD8,0xC6,0x5F,0x04,0xB6,0xC2,0xAD, + + 0x2D,0xF8,0x73,0x0A,0x34,0x4D,0x3A,0xD4,0xCD,0x52,0x59,0x40,0xFC,0x71,0x2F,0x45, + + 0xCE,0x9D,0x19,0xA1,0x41,0xFB,0xB9,0x58,0xEF,0xF1,0x86,0x99,0x9A,0xE9,0xDD,0x89, + + 0xA4,0xD5,0x10,0x52,0xBA,0x9A,0xCC,0x49,0x40,0x51,0x92,0xA9,0x68,0x9E,0x3A,0xE9, + + 0x23,0xFE,0xAB,0xA0,0x41,0xB8,0x84,0xD9,0xAC,0x9B,0x50,0x51,0x7D,0xE1,0xD2,0x80, + + 0xE7,0xD8,0x9E,0x24,0xD7,0xF8,0x77,0x95,0x12,0x23,0xCF,0xF1,0xDD,0x79,0x45,0x05, + + 0x9A,0x43,0xA8,0xD9,0x9E,0xAE,0xAA,0x00,0x9A,0x6B,0xED,0x04,0xC6,0x29,0x4E,0x91, + + 0x67,0xFA,0xA1,0xC9,0x9D,0xFE,0xCC,0x4E,0x19,0x43,0xDC,0xE0,0x5D,0x7B,0x56,0xD9, + + 0x30,0xAB,0x97,0xFB,0x01,0x9F,0x44,0x71,0xEE,0x7F,0x87,0xCD,0x8F,0x60,0xA1,0xE2, + + 0xF9,0x85,0xEE,0xE6,0x87,0xAD,0x5D,0x8E,0x40,0xF1,0x24,0x46,0xEF,0x21,0x70,0x22, + + 0xD8,0x14,0x71,0x66,0x80,0x1E,0xB7,0x6E,0x98,0xDE,0xE5,0x3C,0xF4,0x3E,0x12,0xFB, + + 0x35,0xD6,0xAE,0xEA,0x71,0xBE,0x2A,0x2E,0x63,0xC6,0x29,0xCA,0xC0,0x2F,0x71,0x1E, + + 0x22,0x86,0x19,0x7A,0x4F,0x8C,0x27,0xD3,0x5C,0x7C,0x98,0x53,0x4C,0x7C,0x56,0x46, + + 0xE9,0x40,0xC0,0x5B,0x96,0x8B,0x9F,0xEA,0xC0,0x58,0xFE,0xD4,0x8F,0x6B,0x36,0x57, + + 0x27,0x0B,0x63,0xBC,0x17,0xF9,0xEC,0x03,0x73,0x4A,0x98,0x07,0x6A,0xE2,0x7F,0xA3, + + 0xE8,0x62,0x65,0x2A,0x47,0x7B,0xED,0x12,0xAE,0x49,0x65,0x1A,0x71,0x62,0xED,0x93, + + 0x07,0x18,0x65,0xD0,0x46,0x45,0x39,0x3A,0x6E,0x05,0x5D,0x78,0x32,0xC8,0x15,0x52, + + 0x3A,0xA9,0xFA,0x62,0xCE,0x60,0x4B,0xA0,0xB5,0xB9,0x02,0x56,0xBF,0x78,0x72,0x2A, + + 0x79,0xB5,0xF2,0x76,0xCB,0x81,0x25,0x9D,0xB2,0xD4,0x60,0x34,0xA4,0xA6,0x7B,0xF2, + + 0x31,0xFE,0xFB,0x66,0x42,0x62,0xEC,0x57,0xE6,0x95,0xAC,0xDB,0xC8,0xB7,0x5D,0xFB, + + 0x7A,0x76,0xF3,0x39,0x28,0x22,0xCF,0xC3,0x74,0x28,0x0B,0x47,0x7A,0x0E,0x78,0xCF, + + 0x29,0x4E,0xAB,0xA7,0xE5,0x42,0x92,0xEC,0x6E,0x22,0xCF,0xEE,0x93,0xA5,0x4D,0x7F, + + 0xA7,0x6B,0xDC,0xC2,0x18,0x94,0x4B,0xF0,0xEE,0xEB,0xA2,0xFE,0x92,0xB8,0x19,0x48, + + 0x04,0x05,0xFD,0x79,0x44,0x83,0x0A,0x58,0x6F,0xE8,0xAB,0x4A,0xB9,0x91,0x32,0xA9, + + 0x83,0x69,0xF5,0x5B,0x6F,0x4B,0xCD,0x39,0xC7,0x0D,0x6C,0x55,0x2F,0x8E,0x7C,0x88, + + 0x4B,0x54,0xFF,0x4E,0x9B,0x71,0xC0,0xEB,0x62,0xBE,0xBF,0x20,0x38,0xEC,0xB7,0x35, + + 0xD6,0xAD,0xF3,0x9C,0xD4,0xEE,0x14,0xA5,0x90,0x27,0x9A,0xEE,0x90,0x1A,0x05,0xFE, + + 0xDC,0xED,0x3F,0x7F,0xA0,0xFF,0x13,0x2E,0x59,0x04,0x55,0xB4,0x21,0x30,0xD9,0xCA, + + 0x70,0x70,0x8C,0xE3,0x4E,0x72,0x66,0xDA,0x77,0x6C,0xA7,0x32,0x5D,0xDF,0x5C,0x01, + + 0x24,0x56,0x79,0x56,0x26,0x69,0xF8,0x08,0x40,0x19,0xEB,0x76,0x91,0xE9,0x88,0x44, + + 0x10,0x54,0x20,0xA7,0xB7,0xB3,0x3A,0xD9,0x60,0x35,0x85,0xC1,0xD6,0x8A,0xC3,0x29, + + 0xC2,0x54,0xA7,0xC5,0xB3,0x1C,0x33,0xCD,0xF0,0x1B,0xB7,0xE4,0xF3,0x07,0x8D,0x54, + + 0xE5,0x0C,0x4C,0xA6,0x3F,0xB1,0x9D,0x74,0xB5,0x15,0x71,0x67,0x73,0x7F,0x2D,0xDB, + + 0xAC,0x7B,0xBE,0x76,0x94,0x35,0x91,0x62,0xC9,0xD5,0x32,0xFF,0xDB,0xD4,0xEF,0xE2, + + 0xB3,0xB4,0x3A,0xFE,0xC6,0x78,0xE3,0x9C,0x02,0x56,0xB7,0x5E,0xD5,0xD5,0x29,0x8F, + + 0x36,0xA7,0xF8,0xAA,0x19,0xE5,0x3A,0x47,0x09,0xC6,0x33,0xE7,0x31,0x3E,0xAF,0x13, + + 0xA8,0x8B,0x37,0x67,0xA9,0x76,0x5F,0xC6,0x95,0xA4,0x3B,0xEE,0x5A,0xD7,0x53,0x4C, + + 0x24,0xCE,0xC6,0x8C,0x7F,0x97,0x96,0xDF,0x96,0x4D,0xD4,0x1C,0xFE,0x33,0x8D,0x29, + + 0x16,0x3D,0xCA,0x22,0xDA,0x5E,0x1B,0xE6,0x03,0xA9,0xD6,0x0F,0xF7,0xD0,0x1E,0xF4, + + 0xAC,0x7C,0xDA,0xCC,0x47,0xBF,0xE4,0xDC,0xEC,0x84,0x47,0x92,0xFC,0x7C,0x16,0xEC, + + 0xC8,0x3F,0xAF,0x8E,0xDE,0x30,0xCD,0x7D,0xE1,0xE2,0x49,0x1F,0x57,0xD2,0x83,0xE0, + + 0xE4,0x5F,0x27,0x7C,0x99,0xC2,0xCD,0xA2,0x8B,0xA0,0x8F,0xC4,0xF8,0x3D,0x50,0x20, + + 0xD8,0x2D,0x13,0x93,0xE2,0x5C,0x5D,0xDD,0x19,0xDF,0x28,0x4C,0xF2,0xF1,0x14,0xE1, + + 0x39,0x76,0xDA,0x7C,0x9A,0x1D,0x54,0x63,0x84,0xBF,0xC9,0x00,0x29,0xED,0x51,0x2F, + + 0x5C,0xB0,0x6D,0xE8,0x06,0x8C,0x07,0x41,0x7E,0x9C,0x86,0xD1,0xC5,0x3E,0x1E,0x44, + + 0x96,0xE0,0xB9,0x42,0xC3,0xC8,0xB4,0xF6,0xCB,0xDF,0x30,0x73,0xB5,0x30,0x8C,0x3A, + + 0x26,0x78,0x95,0xA9,0x98,0x18,0x39,0x14,0x8D,0x24,0xD6,0xD4,0xAB,0xB4,0x5B,0xA6, + + 0xE5,0xC6,0x25,0x19,0x98,0xB8,0xE5,0x05,0x0C,0xD7,0xE7,0x78,0xB2,0xE0,0xDD,0x74, + + 0x2B,0x83,0x0E,0x2D,0x41,0xAD,0x31,0x76,0xC1,0xA5,0x4A,0x5E,0xD1,0x07,0xD9,0x78, + + 0x7E,0x17,0x32,0x64,0x3D,0x58,0xA2,0xC2,0x5E,0x35,0x4A,0x26,0xA1,0xA7,0x7C,0xF8, + + 0xF6,0x04,0x11,0xBB,0xEA,0x14,0xC1,0x41,0x63,0x76,0x1E,0xDC,0xDE,0x8D,0x9A,0x39, + + 0xF4,0x56,0x1C,0x48,0xB2,0x55,0xA4,0xD4,0x39,0xA9,0x23,0x05,0x58,0x4E,0x78,0xE1, + + 0xA9,0x20,0x7F,0xE4,0x6C,0xC8,0x00,0x9E,0x3E,0xF7,0xD3,0x39,0xDB,0x4B,0x8D,0x54, + + 0x62,0x78,0xAB,0x3D,0x27,0x25,0xB0,0xAD,0x7D,0x9D,0x88,0xEA,0x1C,0x4F,0xFB,0xDE, + + 0x46,0xAB,0x7C,0x38,0xE0,0x2B,0xC2,0xE9,0x77,0xC5,0x80,0x0D,0x37,0x6B,0x72,0x51, + + 0xB6,0x3A,0xE7,0x2F,0x99,0xB5,0xCB,0xF8,0xFA,0xDC,0x5F,0x1C,0xBA,0x68,0x55,0x36, + + 0xEE,0xAF,0x6F,0x1F,0x8A,0xC1,0xFF,0xFF,0xC1,0x1D,0xFF,0xBF,0xC7,0x83,0x5A,0x84, + + 0xD1,0xE6,0xDB,0x8E,0x91,0x6F,0x8F,0x07,0x93,0x6D,0x10,0xEC,0xBD,0xB4,0x17,0x19, + + 0xD6,0x61,0x96,0x11,0xC6,0x3A,0x17,0xF8,0x4B,0xCD,0xD4,0xB0,0x94,0x97,0xDE,0xF8, + + 0x32,0x2D,0xA4,0xE1,0x4B,0xF3,0xE1,0x58,0x35,0xB1,0x9C,0x83,0x77,0x96,0x43,0x71, + + 0x62,0x1E,0xA9,0x10,0x4E,0x38,0x7D,0x64,0xA9,0xA5,0x45,0xBF,0x96,0xD3,0x9C,0x3E, + + 0xB7,0x6F,0x50,0x98,0x95,0xB2,0xC3,0xCE,0x92,0xE5,0xE5,0x04,0x8B,0xB6,0x93,0x56, + + 0x78,0x83,0xE7,0x3E,0x13,0xB3,0xC3,0xA9,0xB6,0x08,0x3C,0x72,0x71,0xB7,0x5B,0x2E, + + 0x51,0x2D,0xCB,0xCD,0xB0,0x94,0xB5,0x3F,0xFC,0x6A,0xB5,0x3E,0x1D,0x92,0xB6,0x98, + + 0xD8,0x3A,0xC3,0x92,0xB1,0xD5,0x56,0x77,0xED,0x18,0x3D,0xE2,0xC4,0x16,0x8D,0x65, + + 0xCD,0x24,0x26,0x09,0xCB,0x33,0x0D,0x24,0xDD,0xEE,0x52,0x48,0x6C,0x73,0x1F,0x9C, + + 0x09,0x8E,0x96,0x74,0x91,0xB4,0x41,0xC0,0xFB,0x46,0xE4,0xBB,0xF3,0xB6,0xDE,0xF9, + + 0x7D,0xA5,0x23,0x08,0x43,0xFB,0x3F,0xA7,0x15,0xAC,0x37,0x28,0x5B,0xEA,0x2F,0xD8, + + 0x17,0x9B,0xD2,0xB8,0x1C,0xE4,0x06,0x30,0x5E,0x2B,0xE5,0xAF,0xD2,0x7E,0xBB,0x34, + + 0x55,0x63,0x74,0x26,0x06,0xBA,0xDB,0x95,0xF3,0x83,0x4E,0xFE,0xD9,0xBD,0x47,0x27, + + 0x33,0xE6,0x7C,0x36,0x43,0xF0,0x7F,0x9C,0x90,0xB1,0x81,0x7A,0x28,0xCF,0xA7,0x16, + + 0x3C,0x45,0xC9,0x29,0xB8,0xDC,0x2E,0xC2,0x4B,0x01,0xCF,0x15,0x52,0xF3,0x4F,0x22, + + 0x50,0xDD,0x10,0xD7,0x1A,0xB9,0x26,0x5B,0xE9,0x9D,0x6F,0xFF,0xFF,0xFF,0x3A,0xF3, + + 0x74,0xFD,0xC0,0x18,0x9D,0xA6,0x72,0x20,0x41,0x00,0x16,0x2C,0xF5,0xBF,0xB7,0x60, + + 0x00,0x08,0xC0,0x15,0x35,0x8C,0x0F,0xB2,0x88,0xA2,0x74,0x10,0xA4,0x90,0x1B,0x75, + + 0xA1,0x10,0x89,0x7B,0x52,0x22,0xFD,0x05,0x21,0xED,0xF3,0x20,0xD1,0x22,0xCD,0x62, + + 0xF4,0x84,0x10,0xA7,0x95,0xD3,0x21,0xCE,0x28,0xF2,0x66,0x47,0xFF,0xBC,0xA7,0x80, + + 0x06,0xD0,0x39,0x83,0x8C,0x2E,0xEA,0x02,0x9C,0x42,0x69,0xFE,0x53,0x45,0x08,0x10, + + 0x05,0x27,0x8C,0x58,0x60,0x25,0x50,0x79,0xBE,0xC3,0x98,0xC9,0x55,0x67,0x56,0x32, + + 0xFA,0x44,0x41,0x06,0xAB,0x64,0x78,0x12,0x63,0x90,0xB1,0x36,0xBC,0x24,0xC9,0xBE, + + 0xEB,0x0A,0x96,0x50,0x95,0x67,0x71,0x0F,0x01,0x47,0x8F,0x45,0x98,0xD8,0x06,0x0D, + + 0xF6,0xF1,0xDB,0x24,0xBD,0x6A,0xBE,0xB7,0x49,0x08,0x7E,0x53,0x9A,0xC8,0x0E,0x78, + + 0x41,0xFE,0x82,0x62,0xDB,0x29,0xDA,0xB8,0x48,0xE6,0xBA,0x7C,0x5D,0x07,0x06,0x7A, + + 0xFD,0x83,0xC3,0x11,0x15,0xAC,0x3F,0x40,0x21,0xFB,0x28,0x5D,0x58,0xEC,0x94,0x1D, + + 0x06,0x4A,0xC3,0x1C,0xBD,0x86,0xBF,0x1E,0x68,0xB4,0x0B,0xB9,0x88,0x5C,0xBD,0x26, + + 0x24,0xD3,0xAD,0x23,0x1C,0x2E,0x1A,0x69,0x6E,0x0E,0xE8,0xD4,0xA9,0xC7,0xBC,0xDC, + + 0x09,0x13,0x5D,0xA3,0xEA,0xFE,0x0C,0x83,0x20,0x42,0x9A,0xBC,0x5D,0x6F,0x1C,0x4C, + + 0x8C,0x6C,0x8C,0xC9,0x98,0x8D,0x17,0x63,0xCC,0x4C,0xAB,0x69,0x27,0x2C,0x03,0xC9, + + 0x8D,0x0D,0x0B,0xDD,0x23,0xB4,0xDB,0x06,0xCD,0x4D,0x1D,0x3A,0x01,0xB2,0x52,0x74, + + 0x38,0xE5,0xC4,0x5D,0xDB,0x54,0x84,0xB1,0x18,0x54,0x78,0x36,0xE1,0xAD,0x0F,0x21, + + 0xA9,0x61,0xCC,0x58,0x37,0xE1,0xA4,0xB4,0xEE,0x10,0xA2,0xD8,0x10,0x31,0xDB,0x8C, + + 0xC6,0x49,0x31,0xE7,0x4F,0x70,0x3F,0xD2,0x81,0x53,0xF7,0xA5,0xF3,0xB2,0xBB,0x97, + + 0xBD,0x0E,0xD3,0xD5,0xB5,0x5D,0x44,0x9C,0x44,0x3D,0x85,0xB1,0x7E,0x32,0x84,0x40, + + 0x4F,0x56,0x28,0x56,0x36,0x3E,0x50,0x20,0x66,0x38,0x38,0x76,0x73,0xE9,0x93,0xAE, + + 0xE1,0x15,0xCE,0x94,0x37,0x5B,0xA3,0x74,0x61,0x5D,0x30,0xD0,0x75,0x77,0x05,0x54, + + 0x2D,0x90,0x47,0xCD,0x17,0xB0,0xC5,0x09,0x86,0x1B,0xB7,0xE5,0xF3,0x36,0x05,0xD5, + + 0x2A,0x2E,0x5D,0x12,0x31,0x0B,0x9D,0x71,0x89,0xE8,0x4F,0x32,0xF5,0x35,0xA2,0x90, + + 0xA4,0x9C,0x16,0xFF,0x41,0xB1,0x74,0xBC,0x6B,0xE8,0xCF,0x8D,0xDD,0x3A,0x30,0xE8, + + 0x09,0x34,0x93,0x18,0x3B,0x63,0x9C,0x78,0x2D,0xA4,0x8F,0x38,0x7B,0xE3,0x07,0x89, + + 0xFC,0x23,0x03,0xED,0xBC,0x16,0x16,0xCF,0x17,0xDC,0xD7,0xB1,0x07,0x61,0x8F,0x5E, + + 0x8D,0x00,0xF1,0x9A,0x15,0x36,0xB3,0x2B,0xE5,0x51,0x5F,0x3D,0x93,0xC4,0xAA,0xEC, + + 0xC3,0x75,0xFC,0xAE,0xF8,0x69,0x0F,0xC9,0xCF,0x83,0x88,0xAC,0x36,0x3E,0xDE,0x30, + + 0x17,0x50,0x49,0x34,0x57,0x70,0x1A,0xFC,0xE6,0xEB,0x32,0xD8,0x7D,0x7F,0x57,0xBA, + + 0xAE,0x70,0x07,0x5D,0xCE,0x34,0x97,0x69,0xEB,0x1C,0xD9,0xE9,0xFB,0x3E,0xA3,0x4B, + + 0xA7,0x15,0x30,0x59,0xB9,0x0E,0xE6,0x63,0xE8,0x5D,0x41,0x79,0xF9,0x9D,0x9F,0x86, + + 0x40,0xF0,0xBF,0x76,0x10,0xAB,0xF0,0xA2,0x51,0x82,0xF8,0x27,0x70,0xA2,0x16,0x52, + + 0x55,0xE5,0x90,0xE9,0x26,0x60,0x28,0xF2,0x03,0x6C,0xBC,0x56,0x51,0xCD,0xA4,0x69, + + 0xF2,0x32,0xB2,0x85,0x5D,0xD1,0xB2,0x4E,0x49,0x44,0xFA,0x19,0x29,0x6B,0xE2,0x0B, + + 0x0E,0xEA,0x11,0xE9,0xE8,0xA8,0x2E,0xB7,0xC7,0x79,0xA4,0xF0,0xF1,0x4E,0xE9,0xB1, + + 0x8A,0xE1,0xE0,0xBF,0x1A,0xE6,0x38,0xE6,0x44,0x26,0x93,0x26,0x52,0xC8,0x47,0xD6, + + 0x58,0xD1,0xA8,0x8F,0x11,0xA7,0x1B,0x32,0x5B,0xAB,0xE2,0x56,0xF6,0xA5,0x59,0xBC, + + 0x5F,0xFB,0x61,0x9C,0x23,0xE4,0x8E,0xA4,0x1C,0x1B,0xEC,0xA0,0xF2,0x4B,0xD6,0x14, + + 0x45,0xC4,0xBF,0x10,0x49,0x3A,0xC6,0xE1,0xC6,0x1A,0x15,0x53,0xA8,0xC7,0x23,0xC2, + + 0x65,0x38,0xA5,0x49,0x9E,0x94,0x4C,0x2D,0xE0,0xC5,0xA8,0x0E,0xBD,0xA8,0x35,0x13, + + 0x26,0x70,0x6A,0x8E,0x69,0xA3,0xFA,0x26,0x70,0xA5,0xA2,0xAE,0x6E,0x28,0x37,0x7F, + + 0x9C,0x26,0x99,0x6D,0x5E,0x51,0xCC,0xAF,0xCE,0x23,0x5F,0x0B,0x35,0x53,0xAA,0xDF, + + 0xA2,0x1B,0xAF,0x3B,0x68,0xE9,0x59,0x1B,0xCE,0xEB,0x03,0xBB,0xDF,0x3B,0x2A,0x4E, + + 0x81,0xCD,0x01,0x0E,0x1A,0x80,0x10,0x6A,0x4F,0x8C,0x32,0x37,0x7A,0xE4,0x52,0xC8, + + 0x9E,0xCF,0xFA,0x28,0x1B,0xC3,0xD6,0xE8,0x47,0xC5,0xC2,0x81,0x59,0xEF,0x8F,0xC9, + + 0x17,0x03,0xFE,0x6B,0x77,0xC7,0x9F,0x4F,0x27,0x77,0x37,0xED,0x17,0x2D,0x29,0x67, + + 0x8C,0x8D,0x7B,0xB7,0xA3,0xE2,0xF9,0x08,0xFA,0x49,0xF3,0xFB,0xDD,0x4C,0xB1,0xE4, + + 0xC6,0xD0,0x5B,0x04,0xFD,0x43,0xB4,0x65,0x40,0x7D,0x74,0x7A,0x6E,0x9E,0xC0,0x00, + + 0x29,0x9B,0x6C,0x8A,0x5E,0xBB,0x7C,0xC7,0x63,0xD3,0xDE,0xB6,0x74,0xB1,0xA6,0x8B, + + 0x01,0x6D,0x9D,0x03,0xB6,0x08,0xAC,0xC3,0xB0,0x90,0x0A,0x35,0x8B,0x2F,0xAF,0xEC, + + 0x28,0x15,0x2D,0xD4,0x8C,0xDD,0xFB,0xF4,0x27,0xD7,0x51,0x93,0xC6,0x42,0xE6,0xCA, + + 0x83,0x12,0x48,0x54,0x7D,0x29,0xCF,0x66,0x64,0x6E,0x34,0x67,0x54,0xFC,0xFC,0x50, + + 0xB6,0xE5,0x00,0xF2,0xB5,0xA9,0x1E,0x3E,0x96,0x53,0xC2,0x93,0x57,0x98,0x67,0x83, + + 0xA2,0xF8,0x87,0xC7,0xB5,0xF6,0xB5,0x63,0x8C,0xB8,0x75,0xA4,0xCF,0xB7,0x55,0x14, + + 0x65,0x17,0xD7,0xB5,0xD7,0x1D,0x7D,0x33,0xEF,0x96,0x7D,0x30,0xD3,0x0C,0x22,0x4A, + + 0x28,0xF6,0x36,0xFD,0x5D,0xB9,0x8D,0x38,0x6C,0xD2,0x0E,0x5D,0x04,0xBA,0x14,0xF8, + + 0xEF,0x9C,0xF7,0xB3,0x98,0x46,0xA7,0x08,0x65,0x29,0x59,0xFE,0x69,0xE2,0xB7,0x4C, + + 0x2E,0x86,0x1B,0x8B,0x33,0xFB,0xB7,0x6C,0xC8,0x77,0x73,0xE1,0x0B,0x94,0x4F,0xD1, + + 0x00,0x96,0x43,0x0D,0xB1,0xB1,0x66,0x9A,0x48,0x99,0xAE,0xD9,0x02,0x26,0x2E,0xDF, + + 0x82,0x91,0x99,0x4C,0xAF,0xD1,0x48,0x93,0x8C,0xFC,0xF2,0x6A,0x27,0xBD,0xFE,0x5E, + + 0x29,0x2E,0x2E,0x5E,0x4D,0xFF,0x86,0x12,0x47,0x90,0x2C,0x9C,0x80,0xBF,0x05,0xDB, + + 0xAD,0xBE,0xDF,0x7F,0xBE,0x21,0x75,0x03,0x96,0x23,0xFF,0x6A,0x7C,0x52,0x90,0x1C, + + 0x2D,0x83,0xAB,0xDB,0x32,0x09,0x82,0x13,0x97,0x92,0xBF,0xBF,0xF9,0xFD,0x56,0x47, + + 0xC2,0x0C,0xF2,0x00,0x08,0x62,0x0D,0xE7,0x64,0xED,0xBC,0x4D,0x63,0x81,0x88,0xD7, + + 0x25,0x43,0x80,0x10,0x9E,0x60,0xF4,0x14,0xA0,0xBE,0x38,0x46,0x33,0x7D,0x3A,0x93, + + 0x80,0x08,0x45,0x4B,0x1F,0xD4,0x8D,0x01,0x21,0x02,0x29,0x15,0xC8,0xCD,0x49,0x25, + + 0x0C,0x41,0x25,0x91,0x97,0xE8,0xD9,0x68,0xE5,0x4B,0xE7,0x32,0x70,0x9C,0xC2,0x00, + + 0x06,0x6A,0xFA,0xAC,0x29,0xEB,0x8F,0x44,0x29,0xA5,0x28,0x23,0x90,0xE4,0x11,0x78, + + 0xA6,0xFA,0x91,0xC1,0xB6,0xA5,0xA7,0x9D,0x2F,0xFE,0x87,0x16,0x10,0x66,0xD1,0x33, + + 0x69,0xB7,0x98,0x65,0x37,0xD9,0xAE,0x89,0xFD,0x8B,0xD9,0x45,0x50,0x62,0x77,0x68, + + 0x0E,0xF1,0x31,0x92,0x4D,0x2D,0x1D,0xF5,0xF9,0x48,0x26,0xCA,0xD1,0x57,0xC2,0xF9, + + 0x0B,0xA8,0x8A,0x08,0x91,0x11,0xD6,0xAA,0x81,0x3B,0x3E,0xBE,0x18,0x60,0xCB,0x9C, + + 0x0B,0xE0,0x75,0x98,0x50,0x69,0x55,0xBC,0x4B,0xEA,0x99,0xFC,0x5D,0x45,0xC3,0x58, + + 0x8C,0x00,0xE3,0x5E,0xFE,0x27,0x2B,0xD6,0xCE,0x48,0x92,0x52,0x57,0xEC,0xCB,0x99, + + 0xC7,0x65,0x83,0x19,0x10,0x12,0xF7,0xAB,0xC8,0xD6,0x86,0xB9,0xDB,0x82,0x0A,0x79, + + 0xE3,0xBD,0x42,0x2F,0xF8,0xA1,0xF5,0x5C,0x79,0x97,0xEC,0xB8,0x7B,0xCC,0x0A,0xCD, + + 0xF4,0x82,0x6D,0x69,0xCF,0xEC,0x60,0x83,0x4D,0x7E,0xDD,0x0E,0x68,0xBD,0x83,0xC9, + + 0x8B,0x4C,0x3B,0xC9,0x91,0xE1,0xE9,0x96,0xF5,0xAF,0x6B,0xFD,0x7D,0x6A,0xC0,0x39, + + 0x8D,0xF2,0xF1,0xA2,0xA8,0xFF,0x23,0x66,0xA3,0xE2,0x23,0x95,0x99,0x22,0x94,0xC0, + + 0x2E,0x16,0xC4,0x18,0xBD,0xC6,0x94,0xE3,0x59,0x56,0x1D,0x20,0x72,0x92,0xCC,0x10, + + 0x7A,0x53,0x1C,0x16,0xA0,0x9C,0xDC,0xE1,0x65,0x5B,0xDC,0x09,0x77,0x73,0x2B,0x2C, + + 0x01,0xED,0xBE,0x1B,0xB3,0x12,0x3B,0x0C,0x41,0xAD,0x55,0x24,0xFE,0x30,0x4D,0x20, + + 0x2C,0x95,0xB5,0x6B,0x1D,0x3E,0x9D,0xF2,0xD8,0x3D,0xCB,0x4E,0xF7,0xA9,0x53,0xA6, + + 0xC9,0xA5,0x43,0xD6,0xD9,0x95,0x1C,0xE4,0xBE,0xB5,0x79,0xFB,0x1A,0x6F,0x16,0xDC, + + 0x4B,0xA4,0x8E,0xA7,0x5B,0x2E,0x16,0x4D,0xEE,0xF3,0xC4,0xE0,0x97,0xD4,0x65,0xC5, + + 0x76,0xA7,0x9C,0x39,0xD7,0x3F,0x6B,0xC9,0xEC,0x34,0x08,0x93,0x9B,0xD7,0x33,0xD7, + + 0x42,0x94,0x10,0xA1,0x92,0x87,0xCB,0xB1,0xC9,0x4C,0xE7,0x1D,0xF7,0x38,0x2E,0xF2, + + 0xEA,0x18,0x6A,0x08,0x3A,0xD6,0x86,0xDB,0x09,0x59,0xD3,0x28,0x76,0x3D,0xCE,0x18, + + 0x3C,0x5B,0xAF,0x18,0x3B,0x9A,0xC1,0xB9,0x6F,0xE1,0xA6,0x46,0xF6,0x84,0x4F,0x8D, + + 0x27,0x5B,0x8F,0x05,0xBE,0x18,0x2F,0xAD,0x67,0x1B,0xFF,0xCF,0x03,0x74,0x4F,0x28, + + 0xAF,0x79,0xF0,0x6C,0x1A,0x7B,0x8F,0x79,0xE1,0x1A,0xF8,0xC3,0x2B,0x71,0x6F,0x3B, + + 0xA6,0x11,0x9F,0xD0,0x59,0x1C,0x14,0x8E,0x95,0x47,0xE8,0x38,0x5B,0x4C,0x4A,0xFC, + + 0x2D,0x1F,0xD8,0xAE,0x08,0x7D,0x07,0x61,0xCE,0xE2,0x87,0xF8,0xDE,0x8C,0xEB,0x5B, + + 0xBA,0x14,0x3F,0x25,0x85,0xFB,0x77,0x9F,0x34,0x81,0x8E,0xEE,0x5F,0x81,0xC6,0x5D, + + 0xA9,0xFD,0x37,0x35,0xE5,0x72,0xF3,0x87,0x31,0xF0,0x27,0x7F,0x66,0xBA,0xE0,0x83, + + 0x2E,0x8A,0x30,0xEE,0x57,0xED,0x52,0x22,0x45,0x80,0x70,0xA6,0x1A,0xA2,0x06,0xA6, + + 0xA4,0x7E,0x38,0xFE,0x29,0xEC,0xB1,0xB6,0x47,0x62,0xF8,0xEF,0x53,0xE3,0xA1,0x40, + + 0xBD,0x84,0xB1,0x75,0x90,0xCC,0xDD,0x07,0xC2,0xC0,0xF5,0xA2,0x75,0xA0,0xE9,0x42, + + 0x81,0x8B,0x45,0x85,0xDD,0xA9,0xF9,0xB6,0xF2,0xCB,0xEF,0xCC,0xD3,0x39,0xEB,0x22, + + 0x52,0x29,0x58,0x26,0x5A,0xBF,0x66,0x90,0x67,0xA4,0xE6,0x52,0xA9,0xA6,0x97,0xA0, + + 0x52,0x8C,0x7A,0xA9,0xEA,0xCB,0xA3,0x04,0x2C,0xCA,0x63,0x14,0xA8,0x48,0x76,0xC7, + + 0x84,0x56,0xA1,0x21,0x1B,0x00,0x57,0x52,0xA2,0xDD,0xBD,0x62,0x54,0x9A,0x6B,0x2C, + + 0xD2,0x8C,0x8B,0x53,0x96,0x97,0xFE,0x41,0xF4,0x5C,0x6F,0xB0,0x09,0xEF,0xA2,0x49, + + 0x35,0xE6,0x20,0x06,0xB9,0x2E,0x34,0xAE,0x05,0x88,0xF7,0xD6,0x5C,0x53,0x92,0x1E, + + 0x82,0xC8,0x3A,0x9C,0x84,0x24,0xB3,0xBE,0x4F,0x2B,0x01,0x7C,0xFC,0x14,0xB3,0x78, + + 0xA1,0x8B,0xA1,0x4F,0x98,0xC4,0x3B,0xA2,0xCA,0xC8,0x37,0xAB,0xD8,0x96,0x11,0xE4, + + 0x8B,0x33,0x93,0x2F,0xAD,0xE9,0xFB,0xBB,0x0A,0xC3,0x93,0x5D,0xDB,0xE9,0xE2,0x8D, + + 0x2A,0x2C,0x5D,0xDC,0xE9,0xA6,0xE0,0x95,0x48,0x96,0x76,0xEA,0x61,0x58,0xAE,0x14, + + 0xF8,0xE1,0x12,0xB6,0x1D,0x00,0x23,0xFB,0xEA,0x32,0x3C,0x96,0x0B,0xA0,0x74,0x49, + + 0x05,0xCC,0xE1,0x3D,0xAD,0x7E,0x7B,0x15,0x25,0xDF,0xAA,0x86,0x3B,0xE5,0x8C,0x9B, + + 0xC3,0x94,0x79,0xB9,0xF4,0xA0,0x45,0x4E,0x42,0x39,0xA3,0xFB,0xD9,0xB5,0xFD,0xC2, + + 0x6C,0xD2,0x1B,0x02,0x36,0xBA,0x54,0xE9,0x85,0xDD,0x34,0xE5,0x4D,0x9E,0xEC,0x12, + + 0x30,0xD3,0xCB,0xE8,0xE7,0xBB,0xFF,0x49,0xE8,0x27,0xAC,0xC5,0x71,0x9F,0x2B,0x87, + + 0xA7,0xA0,0x65,0x07,0xFA,0xDE,0x27,0xE3,0xE2,0xD0,0x25,0x4F,0xB7,0xBF,0x6D,0x06, + + 0xA3,0x91,0xA9,0xB3,0xB3,0x30,0x06,0x2D,0xE6,0xF3,0x2D,0xC4,0xC0,0x7A,0xC8,0x50, + + 0x06,0x49,0xF2,0xF3,0xC9,0xD8,0x62,0x91,0x02,0xB8,0xCC,0x19,0x45,0xB4,0xFC,0x95, + + 0x03,0x3A,0x33,0x29,0xDE,0xA4,0x25,0x1B,0x23,0x18,0xFA,0x84,0xD0,0xB7,0x07,0xC3, + + 0xA5,0xB6,0x83,0xF2,0xB5,0xF6,0x13,0xD2,0xE5,0x44,0x4D,0xA0,0x28,0xFE,0xC9,0xF4, + + 0x06,0x28,0x01,0x48,0xB6,0x74,0x1F,0xF2,0xE6,0x55,0x36,0xF0,0xD3,0x99,0xCC,0xCA, + + 0x28,0xB4,0xAD,0x31,0x34,0xF8,0xA6,0x2E,0x6E,0x4B,0x32,0xCE,0x6C,0x55,0x16,0x65, + + 0x2B,0x31,0xEC,0xFC,0xC2,0xFB,0x7E,0x6C,0x6E,0xF9,0x3E,0x79,0x59,0xE2,0x3A,0x09, + + 0x65,0xE9,0x4B,0xAB,0xBA,0x98,0xF7,0x2B,0xA2,0x98,0x2E,0xDF,0xF8,0xF3,0xAF,0xDB, + + 0xA9,0xB7,0xA1,0x9B,0xBE,0xFB,0xAF,0x53,0x9D,0x96,0x2A,0xD9,0x72,0x7D,0xA6,0x17, + + 0xBA,0x61,0xBF,0xD2,0x9B,0xB7,0x48,0xDE,0x12,0x23,0xB6,0xD1,0x76,0x90,0x56,0x21, + + 0x29,0x67,0xD4,0x36,0x3B,0xF2,0xB5,0xFD,0x8E,0xC6,0x58,0xFF,0x7F,0xF3,0xF7,0x38, + + 0x22,0xFB,0x61,0xA9,0xFE,0xF1,0xB7,0x2A,0xE2,0x9C,0xDF,0x2D,0xFE,0x55,0xCE,0xA4, + + 0x20,0x19,0xB6,0xC3,0x1A,0x3F,0xB9,0x1D,0x6F,0x5F,0x97,0x79,0x03,0xBE,0x7E,0x06, + + 0xE9,0x0F,0x10,0xBC,0xFB,0x44,0x6B,0xDB,0xF7,0x7F,0x6F,0x03,0xA5,0x6F,0xB3,0xF2, + + 0xAD,0xFC,0x18,0xEF,0x93,0x1D,0x31,0x4A,0xD0,0x7D,0xC1,0x01,0xF4,0x9E,0x53,0x93, + + 0x6B,0x66,0xB9,0xEB,0x3C,0x2F,0x68,0xA5,0xCC,0x4D,0x25,0x5A,0x73,0x23,0x71,0x67, + + 0xE9,0x0E,0x35,0x77,0x66,0x46,0x26,0x7A,0x54,0x9E,0xC7,0xD7,0xD5,0xE6,0xF8,0xDF, + + 0xFD,0x16,0x23,0x60,0xC7,0xB9,0xC0,0xE5,0xBD,0xC9,0xB7,0xE6,0xC3,0x09,0x66,0x6E, + + 0xEA,0xE4,0x58,0xA5,0xB0,0x65,0xA7,0x1E,0x35,0x9A,0x47,0xF6,0x0E,0x2B,0xF9,0xDF, + + 0xA6,0x00,0x6A,0x1A,0x6B,0xDA,0x2A,0x9A,0x7F,0xB7,0xE9,0xFF,0xF6,0xCB,0x31,0x76, + + 0x6A,0x16,0xFB,0x65,0x86,0x88,0x66,0xD8,0x38,0xDA,0x3D,0x51,0x3A,0x24,0x10,0x6F, + + 0xE3,0x4C,0xBA,0xF3,0x3C,0xD7,0xBB,0x67,0xB5,0x34,0x80,0xF3,0xB3,0x2C,0xAE,0x7A, + + 0xFE,0x6C,0xDC,0xEF,0x9D,0xA4,0x24,0x04,0x4F,0xE9,0x0A,0xCD,0xFA,0x29,0x39,0xB9, + + 0x11,0xA5,0xDA,0x20,0x3D,0xAB,0x83,0xD8,0x6B,0x0A,0xAD,0xCF,0xBA,0x76,0x33,0x3D, + + 0x76,0x0D,0xD9,0x4E,0x72,0x4F,0xE4,0x5B,0x3A,0x2E,0xA9,0x0D,0xF9,0xC4,0x3A,0x6F, + + 0xE3,0x3D,0x62,0x3F,0xB9,0xAF,0x03,0x92,0xBF,0x0D,0xC8,0x6E,0x98,0x68,0x32,0x7C, + + 0xD5,0xF2,0x32,0x54,0xF2,0x3C,0x7C,0x54,0xC7,0x0C,0x21,0x03,0x55,0x92,0x3B,0x6E, + + 0x63,0x5F,0x23,0x69,0x73,0xCF,0xAC,0x7A,0xF6,0x0A,0x43,0xD1,0x57,0x0C,0x73,0xC7, + + 0x7C,0x82,0x33,0x79,0x72,0x1E,0x04,0x79,0xF4,0xB0,0x60,0x9F,0x77,0x92,0x12,0xE2, + + 0x40,0x7D,0x95,0x74,0x0E,0xC1,0xAF,0x42,0xCC,0xAD,0xAA,0x1D,0x54,0xFB,0x25,0xB4, + + 0x12,0xF0,0xA2,0x67,0xBD,0x70,0xA4,0x41,0xC2,0x11,0x3C,0xC6,0x13,0x6D,0x7B,0x87, + + 0x41,0x91,0xFB,0x83,0x51,0xB1,0x6D,0x85,0xD3,0x83,0x10,0x94,0xC2,0xDD,0xB5,0x60, + + 0x02,0x53,0xD4,0xA5,0x14,0xCC,0x2F,0x81,0xA4,0xFC,0xE3,0xB2,0x50,0x32,0x7C,0x3E, + + 0x8E,0x19,0x54,0xB7,0x0E,0xC5,0xE0,0x82,0x9D,0xD9,0x79,0x86,0x8D,0x72,0xF3,0x32, + + 0xA1,0x29,0x1F,0xF0,0xBC,0x98,0x4A,0x92,0x03,0xF8,0x3B,0xD0,0x40,0x54,0xD5,0x9E, + + 0x01,0x73,0xBB,0xC3,0x5B,0x67,0x2E,0x1A,0xC6,0x6B,0xFC,0x53,0x53,0x18,0xF1,0xB3, + + 0x5C,0x72,0x19,0xA5,0x33,0xB1,0x23,0xF7,0x02,0xD4,0x65,0x0A,0xC0,0xB6,0x34,0xB8, + + 0x81,0xB7,0x87,0xEA,0xE5,0x37,0xB6,0xDB,0xCB,0xDB,0xA8,0x00,0x13,0x77,0x27,0xBC, + + 0x1A,0xA8,0x27,0xE2,0xAC,0xB4,0x7E,0xF2,0x88,0x54,0xE0,0xBA,0x90,0x76,0xA7,0xFA, + + 0x0B,0x99,0x33,0xF2,0x1B,0x7B,0x73,0x8D,0x65,0xA5,0x17,0x9F,0x98,0x7F,0xB7,0xA8, + + 0x08,0x9A,0xF2,0x77,0x3B,0xD7,0xF8,0x3B,0x78,0x36,0xCD,0x87,0xDD,0x76,0x7E,0xEC, + + 0xD5,0x97,0xE6,0xE8,0x51,0x33,0x7B,0xCC,0xD3,0xFD,0x6E,0xC8,0x49,0x4D,0xEE,0xAA, + + 0x49,0x3A,0xB0,0xDA,0xD2,0x32,0xFE,0x8A,0x09,0x41,0xA1,0x3B,0xA5,0xE0,0x0F,0xF8, + + 0x90,0xB1,0x47,0xFF,0xDA,0x32,0x6F,0xD9,0x03,0xF1,0x6F,0x17,0xEA,0x33,0x31,0xDE, + + 0x0A,0xA0,0x9D,0xE2,0x9F,0x90,0xCF,0x0A,0x67,0xC2,0x3C,0xD9,0x98,0x50,0x0D,0x65, + + 0xA5,0x03,0x30,0x75,0x26,0x0B,0x08,0xD9,0xAD,0x11,0x10,0x55,0xF7,0x63,0x90,0xE3, + + 0xA6,0xC1,0xE8,0xE5,0x91,0x0C,0xEC,0xCC,0xB8,0x60,0xB8,0x29,0x3B,0x4C,0x21,0xFD, + + 0xB7,0x63,0xD9,0x03,0x74,0x23,0x23,0x22,0x3B,0x4F,0xD3,0x03,0xBF,0x21,0x1B,0x23, + + 0x2C,0x2C,0xD1,0xA7,0x29,0xE2,0x01,0xCC,0x30,0xA0,0xEC,0x07,0x2A,0x1C,0x1B,0xB9, + + 0x39,0x24,0x18,0x4E,0xFF,0xF5,0xAB,0x62,0x39,0x44,0x88,0x42,0x25,0xE4,0xEC,0xB0, + + 0xE6,0xFE,0xE9,0x30,0xCA,0xAA,0x51,0x15,0xE6,0x5A,0x55,0x05,0x2B,0x5A,0x98,0xA8, + + 0x35,0xC4,0x19,0x63,0x33,0x59,0xF1,0x67,0x16,0xC0,0xAE,0x76,0xD2,0xA6,0x6B,0xBD, + + 0x3C,0x98,0x5D,0x28,0x34,0xE6,0xCD,0x11,0x3C,0x86,0x55,0x05,0x0D,0x58,0x82,0x79, + + 0xAF,0x0B,0x0E,0xF1,0x9E,0x94,0xC9,0x0E,0x27,0xC7,0x88,0x9E,0xA3,0x37,0x51,0x3D, + + 0xAC,0xC8,0x87,0x79,0xBC,0x7F,0x44,0x3C,0xA4,0xC6,0x01,0x9B,0xAE,0x44,0x0E,0xF8, + + 0x00,0x87,0x99,0x6D,0x42,0xAC,0x31,0x19,0xAC,0x8B,0x0C,0x1E,0x7D,0x55,0x4B,0x48, + + 0xEB,0x86,0x3B,0x20,0xAD,0x0B,0x69,0xA9,0x26,0xAF,0x68,0x06,0x36,0xAF,0xE2,0x5A, + + 0x31,0x8A,0xDC,0xE7,0x75,0xA3,0x8D,0x08,0xBD,0xA9,0xC8,0xFC,0x5E,0x73,0xDE,0x38, + + 0xF0,0xCC,0xD4,0x77,0x63,0x02,0x41,0xE4,0x6B,0xCB,0xFA,0xFA,0x5B,0x53,0x07,0x03, + + 0x2F,0x51,0x63,0x4B,0xD6,0x51,0x4B,0x90,0x41,0x38,0x63,0x96,0x9A,0x75,0x14,0xD9, + + 0x1E,0xE2,0x4B,0x2C,0xAF,0x7C,0xD1,0xCE,0x6E,0x10,0x17,0x5B,0x5D,0x03,0x98,0x71, + + 0xA0,0x1D,0x0E,0xE4,0xCB,0xDC,0x0C,0x3C,0x40,0x0B,0x18,0x23,0x8B,0x9E,0xBA,0xF4, + + 0x4E,0x9E,0x96,0x04,0x35,0x6E,0x11,0x4B,0xC8,0xCA,0x86,0x24,0x75,0xB0,0x77,0xC8, + + 0x80,0x89,0xFF,0x16,0x6A,0x4D,0x1C,0x5E,0x49,0x49,0x0D,0x5C,0x09,0x44,0xAD,0xA1, + + 0xC5,0xBE,0x97,0x6D,0x4E,0xF1,0xAB,0xD5,0x5A,0x92,0x42,0x35,0x6C,0x9E,0xF4,0x85, + + 0xF8,0x6B,0x40,0xA4,0xCD,0xD1,0x0C,0xC5,0x9F,0xDB,0x61,0x15,0xF2,0x79,0x14,0xD6, + + 0xDE,0x10,0xFA,0xEB,0xDC,0xF1,0xD5,0x8C,0xF2,0x58,0x6C,0xC7,0x19,0x5A,0x5E,0x5D, + + 0x51,0x3D,0xDD,0xE3,0xD5,0x26,0xE5,0xAC,0x1B,0xAA,0xA7,0xB0,0x1D,0x92,0x7F,0xD9, + + 0x4C,0xD3,0xD7,0x67,0x26,0x18,0x00,0x19,0xC3,0xD1,0x2B,0x07,0x08,0x54,0x58,0x8C, + + 0xC5,0x97,0x22,0x6C,0xCD,0xF9,0xC9,0xB9,0x54,0x9C,0x8E,0x54,0xD0,0xF5,0x84,0x2F, + + 0x8C,0x46,0xEF,0xF8,0x4B,0xD5,0xAD,0x4B,0xCE,0x99,0x06,0x40,0x6D,0xB4,0x75,0xC0, + + 0x88,0x9C,0x58,0xE9,0xC0,0x45,0x11,0x83,0x60,0x77,0xC8,0x8B,0xCF,0x7B,0x9B,0xF9, + + 0x52,0x16,0x6B,0x61,0x40,0xD9,0xFF,0xAA,0x12,0xD6,0xE6,0x9A,0x02,0x97,0x58,0x28, + + 0x4C,0x9B,0x42,0xAC,0x1A,0xB1,0x5F,0x8D,0xCF,0x23,0x24,0x1D,0x18,0xBD,0x54,0xB8, + + 0xF5,0x9B,0x42,0xFA,0xC4,0xD3,0xCA,0x98,0x9C,0xB8,0x03,0x39,0x86,0x8B,0xF7,0x30, + + 0x2C,0xA2,0x1C,0xE8,0x1F,0x41,0xC3,0x89,0xCA,0xBB,0xCF,0x01,0x52,0xF3,0x42,0xBC, + + 0x0E,0x09,0x8F,0x95,0x5E,0xB2,0x47,0x3C,0x31,0x42,0xC4,0x71,0xDB,0x52,0xD6,0x31, + + 0xA1,0xFF,0x40,0xD0,0xAB,0xFB,0xA8,0x1B,0x34,0xB5,0xAE,0x8C,0xDD,0xD6,0x98,0xE3, + + 0x8D,0x0C,0xB6,0xBD,0xF1,0xA0,0xBF,0x88,0xA8,0xB0,0xC2,0x36,0xC3,0x6B,0x3F,0xB5, + + 0xAE,0xDD,0x81,0xF4,0x33,0x62,0x06,0xA5,0x9F,0x16,0xAA,0x55,0x50,0x7D,0xF6,0x36, + + 0x20,0x42,0x6A,0x91,0x9B,0x3D,0x41,0x38,0x43,0x5F,0x19,0xC8,0xD9,0xCE,0x70,0xB1, + + 0x78,0xD1,0xBA,0xA4,0x56,0xFF,0x90,0xB4,0xF9,0x06,0xE8,0x14,0xE6,0x6D,0x1D,0x23, + + 0x39,0x6B,0x49,0x27,0x3D,0x84,0xFC,0x12,0xA8,0x46,0x83,0x74,0x33,0x9A,0x1F,0xFD, + + 0xA0,0xF2,0x3E,0xB8,0x6D,0x22,0x15,0x57,0xB0,0xE9,0xC3,0x16,0xA6,0xD9,0x2F,0xFC, + + 0x82,0x47,0x1F,0xAA,0x7A,0x64,0xED,0x13,0x28,0x64,0x26,0x0F,0xB1,0x98,0x79,0x2F, + + 0xA9,0xB7,0x42,0x8C,0x72,0xD9,0x97,0x4A,0x4E,0xA2,0x47,0xEB,0x92,0xB9,0x69,0x3C, + + 0x7A,0x09,0xB4,0xB5,0x1F,0x0B,0xB0,0x88,0xE8,0xCE,0xD8,0xCF,0x67,0xC4,0xEF,0x76, + + 0x52,0xD7,0x7C,0x73,0xEA,0xF5,0xA4,0x2B,0x90,0x4C,0x9B,0x3C,0x31,0xBB,0x54,0x15, + + 0x8F,0x4B,0x63,0x99,0x9B,0xFC,0x55,0xAC,0x28,0xF4,0xCA,0x9D,0x78,0x38,0x7E,0xA1, + + 0xE3,0xFD,0x94,0xF8,0xED,0xF8,0x32,0x3E,0x28,0x41,0x12,0xEC,0xE2,0xC1,0xE6,0xDC, + + 0x0D,0x47,0x19,0x5A,0xD3,0x9E,0xF6,0x0B,0x25,0xCB,0xE4,0xC1,0x2D,0x2F,0x1B,0x3D, + + 0x8C,0x2C,0x13,0x52,0xB4,0x8A,0x49,0xB8,0xE9,0xCD,0xDB,0x50,0x31,0x2A,0x8B,0x8C, + + 0x61,0x4D,0x6F,0xD9,0x95,0x2C,0x5D,0x0A,0xAD,0xC9,0x9B,0xE8,0x24,0xC2,0xF9,0xFB, + + 0xBE,0x8D,0xF9,0x78,0x30,0x9B,0xA0,0xDF,0xC3,0xDB,0x80,0x20,0x7E,0x8A,0x1E,0x57, + + 0xCA,0x55,0xBE,0xA4,0x65,0x73,0x4F,0x32,0xDD,0x53,0xE4,0x93,0x88,0x7E,0xE4,0xA5, + + 0xC8,0x1F,0xFD,0x81,0x59,0x21,0x91,0x90,0x92,0xFD,0xF5,0x9B,0xD2,0xCE,0x37,0x21, + + 0x30,0x52,0xC9,0xBC,0xB7,0x31,0x25,0x4E,0x4D,0x5E,0xC3,0x08,0x05,0xD8,0x7A,0x74, + + 0x54,0xBB,0x96,0xDB,0x58,0x5A,0x90,0x1F,0x8B,0x77,0x06,0xC3,0xD3,0xDB,0x6A,0x69, + + 0xAF,0xB8,0xF2,0x70,0xF9,0x36,0x8F,0x0E,0xE3,0x07,0xE4,0x33,0xB1,0x65,0x95,0xD2, + + 0xD4,0x52,0xFB,0x60,0x78,0x15,0xC2,0x1E,0x0B,0x55,0x03,0x67,0x63,0x31,0x18,0x55, + + 0xA1,0x28,0xC5,0xC1,0x7B,0x34,0x63,0x50,0x00,0x5C,0xD5,0x75,0x7C,0xDA,0xBE,0x72, + + 0x38,0x55,0xD0,0xB1,0xC7,0xE5,0x76,0x92,0xC8,0xA4,0x9E,0x0C,0x13,0xCB,0xED,0xBC, + + 0xF5,0xA8,0x9A,0x18,0x3B,0xEE,0x44,0xBC,0xE6,0xFF,0xBE,0x85,0x98,0xD6,0x78,0xCE, + + 0x76,0x87,0xD4,0x73,0xBE,0x18,0x6F,0x8E,0x15,0x55,0xA4,0x5C,0x8E,0x7F,0x28,0xA5, + + 0x35,0xEA,0x89,0x35,0x39,0xD7,0x4C,0xF9,0xE5,0xF0,0x4E,0x39,0xF7,0x4E,0xBD,0xEF, + + 0x8B,0xBD,0x16,0xDF,0x10,0x5F,0xD2,0x9B,0x48,0xD3,0x00,0x7E,0xBC,0xD1,0x9C,0x64, + + 0xC0,0x9E,0x1A,0xAF,0x59,0x9B,0x81,0x07,0xEB,0x0D,0xD8,0x0C,0x4E,0x3F,0x91,0x3A, + + 0xC0,0xB3,0x6B,0xBE,0xD0,0x98,0x0F,0xFD,0x9D,0xA1,0x05,0x7F,0xFA,0x76,0xE3,0xAA, + + 0x85,0xB9,0x1F,0x1D,0xFF,0x9B,0x61,0x58,0x83,0xBC,0x1B,0x96,0x0F,0xBC,0x8D,0xC5, + + 0xF9,0xC1,0xA6,0xAF,0x94,0x8C,0xCF,0xA6,0x03,0xFF,0x8A,0xD5,0x62,0xA2,0x3A,0x02, + + 0xFA,0x0C,0xF9,0x51,0xDF,0x32,0x0A,0xCD,0xC7,0xB4,0x38,0x45,0x63,0x64,0x41,0x54, + + 0x11,0x8F,0xFF,0xAF,0x9C,0x0F,0x8E,0xD2,0x67,0x82,0x75,0x0C,0xBF,0xED,0xFD,0x37, + + 0x07,0xBF,0xE1,0xB3,0x7C,0x52,0x79,0x40,0x66,0xCC,0xAB,0x97,0x3E,0xA7,0x24,0x74, + + 0x00,0xA6,0xD8,0xB5,0x74,0xC1,0x70,0xA2,0x0A,0x49,0xE7,0x5F,0xAD,0x69,0x97,0x3D, + + 0x7B,0x2A,0xB0,0x53,0xFE,0x26,0x58,0x63,0x24,0xBA,0x97,0x05,0x23,0x64,0x65,0xAC, + + 0x80,0xE4,0xD9,0xB4,0xFC,0x29,0x0F,0xD7,0x2D,0x25,0x25,0x9D,0xD2,0xA6,0x3D,0x3D, + + 0xF1,0x28,0x93,0xB7,0xD3,0x7C,0xB9,0xF6,0x7E,0x6A,0x06,0x88,0x36,0x64,0x9E,0x68, + + 0xCE,0x88,0xFA,0x06,0x1A,0x8A,0x86,0x55,0xEF,0xCC,0x8C,0xCC,0x3E,0x3D,0x05,0x65, + + 0xD4,0xC8,0x8A,0x0B,0xFC,0x16,0xFA,0xEE,0xF6,0xCF,0x6B,0x4D,0x6B,0x6E,0xB3,0x51, + + 0x79,0x16,0x0F,0x8B,0xD3,0x5F,0x71,0x59,0x37,0x35,0x73,0xAB,0x07,0x4A,0x13,0xF5, + + 0x21,0x86,0x1C,0xB7,0x9B,0x61,0x8E,0xBB,0x2C,0xC4,0xA1,0x4C,0xDB,0xC9,0x32,0x39, + + 0x0F,0x3D,0x1D,0xB3,0xE1,0xA8,0x26,0x98,0x6D,0xAC,0x0D,0xEA,0x5C,0xD9,0x39,0xDE, + + 0x0D,0x6F,0x3C,0xA1,0xF6,0x2E,0xF8,0x86,0xB0,0x36,0x5A,0x0D,0x21,0x3E,0x1D,0x4D, + + 0x67,0x7D,0x62,0x3C,0xF4,0x0F,0x4D,0xCB,0x2D,0xC5,0xCD,0x2F,0xA2,0x41,0x7D,0xEE, + + 0x64,0xEC,0xBD,0xEB,0x68,0x7B,0x84,0x79,0xA3,0x8D,0x85,0x78,0x7E,0x40,0x1E,0x71, + + 0x12,0xFC,0xFA,0x2E,0x3C,0x1D,0x67,0xA6,0x0F,0xE3,0x74,0x27,0xF7,0xB2,0x16,0x00, + + 0x25,0x4E,0xA4,0x92,0x9C,0x0A,0x5A,0x0A,0x66,0xC2,0x82,0x1A,0x97,0x78,0x1F,0x10, + + 0xD8,0x6D,0xF4,0xC0,0x7E,0x03,0x31,0xD0,0xDE,0xBE,0x75,0x7C,0xBC,0xA1,0xED,0x12, + + 0x26,0xD1,0x01,0xE4,0x87,0x15,0x03,0x8E,0xC6,0x43,0xC5,0x33,0xFF,0xD2,0x30,0xB1, + + 0x00,0x32,0xB6,0x62,0xFE,0x17,0x8B,0x91,0x44,0x77,0x43,0x53,0x52,0xF8,0x3C,0x76, + + 0xEF,0xB6,0xCA,0x6B,0xBB,0xF7,0xDB,0x53,0x8E,0xDD,0x58,0xB4,0xF3,0xF9,0x35,0x03, + + 0xE2,0x32,0x31,0xD4,0xB7,0xF2,0xA7,0x1D,0x32,0xD5,0xCD,0xA5,0x55,0xFA,0xB9,0x14, + + 0x4E,0x34,0x29,0x77,0x5E,0xF4,0x6A,0x00,0x63,0x7A,0x95,0x06,0x74,0xF5,0x66,0x34, + + 0xC5,0xCB,0xF5,0x71,0xD5,0xAB,0x56,0xE0,0x70,0xD5,0x76,0x2B,0x23,0xFE,0x6E,0x24, + + 0x65,0xCA,0x90,0x26,0x5D,0x99,0xF0,0x09,0xED,0x39,0x0A,0xC5,0xDE,0x52,0xE7,0x0A, + + 0x80,0xD8,0xB1,0x37,0x57,0xC9,0xF7,0x2F,0xEB,0x98,0x84,0x8D,0x25,0xF5,0x11,0x37, + + 0x4F,0x12,0xD0,0xED,0x93,0x24,0x08,0x12,0x0C,0x24,0x68,0x85,0x96,0xF3,0x00,0x6F, + + 0xC7,0x1F,0x9E,0xE9,0xD7,0xDF,0xA1,0x52,0x85,0xB8,0x36,0xAB,0x14,0xF2,0x52,0xAB, + + 0x86,0x67,0xEB,0xCF,0x0D,0x98,0x46,0x09,0x41,0x52,0x5A,0x3C,0xDC,0xF3,0x01,0x6F, + + 0xAD,0xDE,0x9F,0xDE,0x84,0x92,0x4F,0x18,0xC8,0xBB,0x9F,0x2D,0x7A,0xF0,0x58,0x72, + + 0x53,0x8C,0x73,0x5D,0x7A,0x3C,0x27,0xFE,0x06,0x9C,0xC7,0x5B,0xFF,0xFF,0x60,0x4A, + + 0xDC,0x42,0x6C,0x9B,0x11,0x22,0xA5,0x44,0xF4,0x69,0x66,0x46,0x31,0x40,0x30,0x72, + + 0xFE,0x07,0x26,0x77,0xB0,0xDE,0xD8,0xE1,0xC4,0xCC,0xF8,0x7E,0x89,0x6C,0x52,0x6D, + + 0x02,0xEE,0x3E,0x65,0xC8,0x24,0x4E,0xA1,0xB3,0x35,0x89,0x21,0xD9,0x4E,0x20,0x0E, + + 0x20,0x6D,0x32,0xD2,0x4F,0x2B,0x40,0xE0,0x66,0x01,0x81,0xE0,0x53,0x7F,0x46,0x31, + + 0x20,0xF6,0xA2,0x46,0x13,0x64,0x28,0x12,0xEE,0x4B,0x37,0xA4,0x5E,0xCF,0x4C,0xC0, + + 0x30,0x9E,0x90,0x50,0x3A,0x93,0xEC,0x92,0xA8,0x5F,0x82,0x8B,0xD1,0xC9,0x94,0x32, + + 0xEB,0x81,0xDD,0xDE,0x7B,0x5F,0xE5,0x83,0x6E,0x49,0x4E,0x9A,0x57,0xD4,0xF1,0x81, + + 0x8F,0xF8,0x21,0xCC,0xB1,0x67,0x39,0x3B,0x49,0x05,0x6A,0x97,0x7F,0x68,0xE5,0x48, + + 0x04,0x85,0x06,0x73,0x3B,0x38,0xD8,0x95,0x7B,0x4C,0x62,0x4E,0xA7,0x06,0xCA,0xD9, + + 0xE5,0x08,0xD9,0x70,0x99,0x49,0x07,0x5E,0x6A,0x09,0x25,0xDC,0x49,0x72,0x7D,0x78, + + 0x69,0xF5,0xE3,0x47,0x7E,0x68,0xAB,0xC9,0x84,0x51,0xF1,0x30,0xDB,0x00,0xCF,0x1C, + + 0x8F,0xE2,0x07,0xD4,0x89,0x86,0xB3,0xA1,0xEB,0xB9,0x0D,0x5B,0x3B,0x4B,0xB5,0x49, + + 0x16,0xA1,0xC7,0xA4,0x96,0xE1,0x01,0x8C,0x2A,0xB0,0xB2,0x3F,0xF8,0x63,0xD5,0xDA, + + 0x9A,0x21,0x82,0x94,0xF2,0x17,0x73,0xFC,0x75,0x60,0x82,0x79,0x30,0x77,0x8D,0x79, + + 0x0B,0xA1,0xBC,0xB0,0x92,0x6C,0x2D,0x6F,0x2B,0xCD,0x67,0x8F,0x33,0x74,0x6B,0xC9, + + 0x62,0xA6,0xD1,0x5C,0xB8,0x1E,0x3B,0x33,0x45,0x0D,0xDF,0xF9,0x8C,0x3A,0x86,0x04, + + 0x01,0x5D,0x74,0xE6,0x13,0x12,0xFC,0x3D,0x8B,0xBA,0x54,0x71,0x5F,0x6B,0xC3,0xB4, + + 0x03,0x50,0x4C,0x2C,0xD5,0xEA,0x43,0x90,0x67,0x11,0xFC,0xFE,0xD7,0x7C,0xC5,0xF1, + + 0xBD,0x50,0xE5,0xCF,0x56,0x3D,0xCE,0xA1,0x93,0x32,0x03,0xC3,0xB2,0x8D,0x89,0x15, + + 0xAC,0x5D,0x23,0x68,0x1A,0x48,0xB0,0x33,0x70,0xF5,0x8F,0x56,0x1A,0x37,0x7A,0xB1, + + 0x43,0x54,0xFE,0x2C,0x46,0x7B,0xE5,0x92,0xE0,0x48,0xD7,0x44,0x9F,0x95,0xF4,0x70, + + 0xC2,0xBE,0x9B,0x50,0x36,0x1E,0xAA,0x92,0x81,0x15,0x70,0x66,0x3B,0x7D,0x1D,0x2C, + + 0x91,0x8D,0xE3,0xB0,0xA1,0x32,0x21,0x03,0x60,0x4A,0xB5,0xB2,0x0B,0x7B,0x2D,0x9B, + + 0x2A,0x9C,0x0D,0xF0,0x54,0x9A,0x9D,0x73,0x72,0xE3,0x1E,0x87,0x18,0x0E,0xDD,0x37, + + 0x57,0x87,0xC6,0x77,0x3E,0xC2,0xAD,0x4A,0xC4,0xA5,0xAC,0x1C,0xB5,0xD7,0x34,0x63, + + 0x2F,0x23,0xEC,0x9D,0x38,0x89,0x0C,0xB8,0x9E,0x4B,0xB7,0x1A,0xD8,0xF9,0xB2,0xED, + + 0x1C,0x33,0xE6,0xFE,0xA3,0x54,0x6F,0x41,0xCF,0x17,0x33,0xD2,0x5B,0x7C,0xBC,0x1D, + + 0x9A,0x1B,0xB5,0x75,0xD5,0x74,0xA7,0x09,0xED,0x5D,0xE7,0x3F,0x68,0x9C,0x6D,0x2A, + + 0x86,0x91,0x43,0xAC,0x36,0xB1,0x6E,0x17,0xE8,0xB0,0x3E,0x74,0xFF,0x9C,0x76,0x26, + + 0x87,0x10,0x76,0x2F,0x28,0x3B,0x16,0xE9,0x6D,0xCE,0x26,0x14,0x23,0x32,0x3F,0x4B, + + 0x3B,0x38,0xB9,0xC0,0x89,0xDF,0xEF,0x8B,0x65,0xA8,0x8E,0xF0,0x99,0x3E,0xB0,0x5B, + + 0x3A,0x73,0xEF,0x20,0x1A,0x3C,0xC6,0x98,0x56,0xD2,0xBF,0xB2,0x64,0x70,0x1D,0x86, + + 0x17,0x45,0x6A,0xE6,0x5C,0xBB,0x72,0xCA,0x7D,0x8D,0x20,0x24,0x0E,0xE6,0x50,0xBF, + + 0xEE,0x12,0xF8,0x8E,0x19,0xC9,0x18,0xD4,0xC0,0x33,0xC0,0xC5,0xD1,0x6C,0xE1,0xBB, + + 0x56,0x26,0x81,0x61,0xB5,0x68,0x29,0x3E,0x25,0xD9,0x98,0x81,0x75,0x63,0xF2,0x10, + + 0xFA,0x8F,0xE4,0x15,0x74,0xA5,0x47,0x5E,0x2E,0x29,0xEB,0x60,0x3E,0x87,0x12,0x46, + + 0x4C,0x9F,0x9E,0x8F,0x7D,0x9D,0x23,0x86,0x26,0xEA,0xA0,0x7B,0x5A,0xE5,0x70,0x4E, + + 0x6C,0x7C,0x57,0xB6,0x5D,0xE7,0x51,0xF6,0x79,0xE8,0xA8,0x01,0x07,0xFE,0x3A,0x25, + + 0xC5,0xE6,0x65,0xC3,0xBC,0xE7,0x0F,0x65,0x27,0x45,0xF4,0x36,0x3F,0xDC,0x42,0xD1, + + 0x16,0xAB,0xBA,0xF5,0x7E,0x5E,0x7F,0xBB,0x2E,0xDD,0xDD,0x11,0x28,0xE1,0xFB,0xA5, + + 0x33,0x8A,0x8B,0x11,0xBF,0xAE,0x6B,0x1F,0xEB,0x67,0x8A,0x1E,0x58,0x17,0xEA,0xDE, + + 0x96,0xCB,0xCA,0x54,0x9F,0xA4,0x62,0x02,0x7E,0xCD,0x2C,0x58,0x20,0xE2,0x7C,0x81, + + 0xFF,0xFE,0x8A,0xB8,0xDC,0xA5,0x2D,0xC3,0xF5,0x87,0x89,0x8A,0x2B,0xF1,0x64,0x9B, + + 0xAF,0xE9,0xF3,0x8A,0x1F,0xB7,0x83,0xC4,0xEC,0x0A,0xBF,0x41,0xFE,0x8B,0x38,0x10, + + 0xAD,0xE9,0x19,0xB6,0x1E,0x21,0x00,0x7B,0xD5,0x67,0x5C,0x15,0xFF,0x1D,0xC2,0xC7, + + 0xEE,0x8B,0x39,0xDC,0x8E,0x81,0x64,0xF8,0xDE,0x8A,0x9A,0x29,0xA6,0xE2,0x59,0xA9, + + 0x65,0x27,0xF5,0x3A,0x61,0x33,0xEC,0x31,0x2F,0x61,0x8B,0x6D,0x96,0x63,0x42,0xEC, + + 0x86,0x38,0x93,0x78,0x62,0xA0,0x79,0x99,0xC9,0x15,0xC5,0xB6,0xFF,0x82,0xFD,0x2D, + + 0x1B,0x92,0xFD,0xBA,0x93,0x1F,0x1D,0x29,0xC7,0xB5,0xEE,0xA2,0xD7,0xF4,0x95,0xCC, + + 0xA7,0x95,0x9C,0x14,0xA4,0x17,0xDF,0x30,0xF4,0x36,0xE6,0xB7,0xD6,0x7C,0x8A,0xEC, + + 0x79,0x4E,0x38,0x74,0xDD,0x9B,0x9E,0x41,0xE2,0x39,0x37,0x25,0x65,0xB5,0xE5,0xF1, + + 0xE6,0x63,0x95,0x69,0x19,0xBE,0x05,0x01,0xE1,0x53,0xDD,0xE0,0x50,0xFC,0xDF,0x20, + + 0x8A,0x69,0x5C,0xCE,0xDF,0x5D,0x14,0xA8,0x88,0xDB,0xCE,0x64,0xEB,0xFF,0x54,0x28, + + 0x8B,0x98,0x72,0x1E,0xB5,0xA9,0x78,0xB2,0x6D,0x7E,0x3C,0x02,0x72,0xB7,0x1D,0x41, + + 0x37,0xF0,0x9F,0xA7,0xBA,0x12,0x4B,0x2A,0x69,0x50,0x8D,0x18,0x81,0xB4,0x12,0x51, + + 0x36,0x3B,0x45,0xA5,0x14,0xB1,0x60,0xF6,0x06,0x78,0x36,0x3E,0xD7,0x05,0x59,0x72, + + 0x2C,0x3C,0x59,0x0C,0xAD,0x8E,0x0C,0x42,0xA8,0x97,0x76,0xEF,0xC8,0x05,0x7C,0x1E, + + 0x66,0xDD,0xD1,0x1A,0x79,0x9A,0xBA,0x3E,0x1F,0x80,0xB2,0xFD,0x94,0xC3,0x3B,0x2E, + + 0x64,0xD3,0x9F,0x75,0x10,0xB7,0xF7,0x13,0xA9,0xD0,0xAD,0xAE,0xDD,0xBA,0xF4,0x34, + + 0xD2,0x99,0xB3,0xBD,0x3F,0xA7,0xFF,0x03,0x91,0x04,0xA7,0xBB,0xF4,0xD7,0x5D,0x28, + + 0x82,0x21,0xCF,0x8D,0x9F,0xB3,0x3B,0x02,0x1A,0x93,0x72,0x9C,0x95,0x16,0xDA,0xA5, + + 0x8C,0xF8,0x96,0x5C,0xAE,0x69,0x08,0x18,0x46,0x6B,0x34,0x1C,0x4C,0xF9,0x1F,0xEC, + + 0x5B,0x91,0x53,0xAD,0xF7,0xA4,0x09,0x9A,0x6C,0xC2,0x97,0xA5,0x7C,0x53,0x54,0x39, + + 0x03,0x22,0x2F,0x67,0x99,0xD3,0x26,0xCE,0x4A,0xB1,0x47,0x9F,0xF3,0xF2,0x02,0xE2, + + 0x04,0x7A,0x80,0xF7,0x2E,0x05,0x68,0xA2,0x12,0xA4,0xD8,0xBC,0xB9,0xBA,0x50,0x14, + + 0x88,0x4E,0x90,0x24,0xEE,0xDE,0xFE,0x33,0xFF,0x65,0x34,0xAB,0x52,0x23,0x31,0xE9, + + 0x0A,0xCF,0xF9,0x14,0xB6,0x8F,0x07,0x43,0xEF,0x66,0xD3,0xDA,0x39,0xA1,0xC9,0xAC, + + 0x2E,0xD7,0xB3,0xA5,0x6E,0xFC,0xA5,0x12,0x8D,0x66,0x59,0x61,0xFE,0x0F,0x48,0x5C, + + 0x04,0xCC,0xDA,0x6A,0x33,0x06,0xBC,0x13,0x70,0xB2,0xD2,0x56,0x32,0xF6,0x9C,0xB6, + + 0x13,0xA8,0xD0,0x59,0xFA,0xDC,0x66,0xC5,0x22,0x41,0x1C,0xA9,0xD1,0x79,0x61,0x81, + + 0xCE,0xAB,0xFF,0x38,0xF3,0x51,0xEA,0x11,0x42,0x59,0x11,0xE4,0x0C,0x24,0x1B,0xB7, + + 0x0A,0xEB,0xD3,0x7A,0xB2,0x87,0x38,0x31,0x9C,0x9A,0x77,0x2E,0x70,0x02,0x57,0x17, + + 0x3E,0x4A,0x42,0x58,0x29,0x85,0x04,0x0B,0x6F,0x6D,0xAC,0x80,0x92,0x61,0xBE,0x7A, + + 0xE2,0x1A,0xE8,0x1D,0x1A,0x69,0x90,0x48,0xA0,0x93,0xF8,0x3C,0xB2,0xDA,0x89,0x29, + + 0x63,0xE9,0xD5,0x6D,0xC8,0x44,0x23,0x0A,0x4D,0x08,0xED,0x91,0x31,0x59,0x35,0x79, + + 0x36,0x50,0xBF,0xFF,0x9F,0xE3,0x59,0xC2,0x20,0x88,0xB7,0x68,0x91,0x28,0xAE,0x3B, + + 0x68,0xAA,0xFC,0x31,0xF8,0x7B,0xE2,0x1F,0x44,0xD3,0xED,0x8E,0x31,0x63,0xC0,0x18, + + 0x08,0x4D,0xDB,0xD8,0x15,0xC9,0xCB,0x5E,0xA6,0x2F,0x19,0xF8,0x51,0x9B,0x17,0x3A, + + 0xA8,0x4C,0xC1,0x3E,0xFF,0x2A,0xEC,0xEC,0x31,0xE3,0xD1,0x12,0x3A,0xEF,0x67,0x27, + + 0x62,0x9C,0x34,0xEF,0x13,0x8F,0xA0,0x0A,0xF7,0x2D,0x1B,0xED,0xC3,0x69,0x03,0x04, + + 0x2C,0x53,0x28,0xF7,0x48,0xC6,0x2E,0x10,0x9F,0x12,0x92,0x00,0x13,0xAF,0x53,0x81, + + 0x27,0xD9,0x6F,0x67,0x41,0x73,0xFC,0x70,0x27,0xFC,0xC6,0x4B,0x1B,0x42,0xA6,0xB9, + + 0x7C,0xA3,0xFB,0xBC,0x59,0xA3,0x9F,0x74,0xE6,0x9A,0x83,0x09,0x1B,0x21,0xB9,0x68, + + 0xB1,0x51,0x07,0xE5,0x58,0x90,0x05,0x81,0x16,0xAC,0xE3,0x1C,0x18,0xD0,0x25,0x80, + + 0x26,0x38,0x62,0x46,0xA3,0x18,0x6A,0x45,0xC5,0x44,0xD5,0x82,0xDE,0xC8,0xC6,0x99, + + 0x82,0x9C,0xAC,0xD6,0x4C,0x38,0xF2,0x8E,0xC2,0xD5,0x1C,0x75,0xFB,0x73,0xFE,0x82, + + 0x13,0x54,0xBD,0xE2,0x53,0x39,0x6B,0x51,0x45,0x50,0xAD,0xC2,0x0B,0x79,0x49,0x31, + + 0xA7,0x3B,0x9D,0xB3,0xBF,0x75,0x25,0x75,0xA6,0x6F,0xF3,0xB4,0x52,0x88,0x82,0x2C, + + 0xFC,0xC9,0x9E,0x10,0xD1,0xE2,0x28,0x19,0xE5,0xAE,0xCE,0xA8,0xF1,0xA5,0xBD,0xA0, + + 0x1A,0x59,0x22,0x07,0x3A,0xBB,0xDE,0xEC,0xF7,0xFA,0xB2,0xC2,0x7F,0xB1,0xA0,0xB4, + + 0x41,0xAB,0xC5,0x76,0x51,0xF9,0x1F,0xAD,0x40,0x55,0xA9,0x19,0xDB,0x3A,0xA4,0xBF, + + 0x44,0x79,0x4F,0xC9,0x27,0x98,0x4A,0x4A,0xD7,0x7E,0x7A,0x0C,0xC3,0xD4,0xFD,0xBB, + + 0x58,0xBD,0x56,0xC0,0xB8,0x38,0x96,0x74,0xC5,0xA9,0x62,0x8E,0xF8,0x60,0x8E,0x8C, + + 0x47,0xB2,0x4A,0x58,0x1D,0x0E,0x95,0x84,0xEB,0x1F,0x61,0x1E,0xF9,0xB1,0x7F,0x36, + + 0x43,0x6D,0x18,0xAF,0x9A,0x73,0x86,0xD7,0xD0,0x1C,0x7A,0xB2,0x59,0x1B,0xDE,0xFE, + + 0x0A,0xB0,0xAF,0x4F,0x9B,0x32,0xB3,0x8A,0x89,0xF9,0x09,0x9F,0x04,0x1A,0x20,0x3C, + + 0x3E,0x75,0x7C,0x25,0xB7,0x00,0x9C,0xB9,0x47,0x62,0x8E,0x46,0xAF,0x7B,0xE8,0x17, + + 0x23,0x75,0x16,0x93,0xFE,0xA2,0x47,0x41,0x23,0xAD,0x83,0xB2,0x10,0x2B,0xF0,0xF8, + + 0xF7,0x82,0x71,0x74,0xE4,0xE7,0x0F,0xFF,0xA4,0x1D,0xB1,0x16,0x75,0x1D,0xFB,0x2D, + + 0xBF,0x76,0x97,0x2E,0x9B,0x0C,0x5E,0x73,0xC1,0xE6,0x87,0x83,0xF4,0xE1,0x1A,0xA2, + + 0x0A,0x29,0xBE,0x3B,0x04,0xA0,0x67,0x91,0x24,0x19,0xD9,0x2D,0x8B,0xEB,0x56,0xEA, + + 0x6F,0x88,0xEE,0x24,0xFC,0x5C,0x46,0xC2,0x8D,0x34,0x3C,0x61,0xB5,0x5C,0xB4,0xB1, + + 0xA7,0x34,0xA4,0x38,0x74,0xE2,0x22,0x90,0xE8,0xA8,0x45,0x18,0x75,0xA4,0x96,0x20, + + 0xB9,0xC5,0xC9,0xD7,0x6A,0x20,0x47,0x4F,0xC1,0x0F,0x3A,0xF5,0x46,0x8B,0xF3,0x51, + + 0xB1,0x34,0xF6,0x7D,0x64,0x7D,0x4A,0x59,0x7A,0x39,0x72,0x7A,0xDA,0xE2,0xFA,0x01, + + 0x67,0x32,0x1A,0x69,0x13,0x75,0xAA,0x2B,0x6B,0x64,0x84,0x92,0x25,0x46,0x78,0x0B, + + 0x8A,0xEA,0xB0,0xE7,0x90,0x76,0x4D,0x93,0x39,0xCE,0x36,0xAB,0x99,0x81,0xAD,0x9F, + + 0xC8,0xEE,0x6F,0xD5,0x2E,0x54,0x23,0x0B,0x32,0x34,0x68,0x45,0x5D,0xBA,0xE8,0x7F, + + 0xF9,0xE9,0x46,0x5F,0x75,0x55,0x7A,0x2A,0x70,0x8E,0x32,0xEF,0x0F,0xF7,0x54,0xFF, + + 0x6E,0x89,0x98,0x4C,0x13,0x06,0x2C,0x3A,0x67,0x8F,0x42,0xFA,0x55,0xE9,0x5B,0x0C, + + 0x44,0x0D,0xA6,0x4D,0xD2,0x53,0xF9,0x4B,0xC8,0x06,0x64,0x09,0x29,0xFE,0x12,0x25, + + 0xEE,0x8B,0x74,0xD3,0x99,0xCD,0xF1,0x79,0xCC,0x2F,0xA2,0x5B,0x7A,0x50,0x8F,0x07, + + 0xB7,0x8F,0xF1,0x75,0x0A,0xDC,0x4C,0xB3,0x42,0x7D,0x61,0x5A,0x74,0x5D,0x16,0x61, + + 0x03,0x3C,0x7F,0xE5,0x0F,0x67,0x06,0x36,0x20,0x1B,0x6F,0xC8,0x1F,0xC2,0x5B,0x22, + + 0x70,0x91,0x9B,0x2B,0x6A,0x1D,0x2D,0x93,0xEC,0x2D,0x64,0x96,0xD5,0x5D,0xFD,0xD4, + + 0x67,0x83,0xD3,0x2E,0x3C,0x5B,0x03,0x07,0xC4,0x71,0xC3,0x0E,0x7C,0x1B,0xF1,0xB1, + + 0x50,0x35,0x1B,0xE1,0x97,0xB2,0x20,0x91,0x44,0x96,0xCC,0x64,0xE7,0x48,0xAC,0x86, + + 0x4B,0x4A,0x58,0xA9,0x94,0xB3,0xBC,0xA6,0x7E,0x97,0x84,0x1E,0x53,0xB8,0x5D,0x3C, + + 0x4F,0x25,0xCC,0x80,0x6B,0xB9,0xFF,0xA3,0xE7,0x16,0x5A,0x05,0x5A,0x0B,0xD9,0xB1, + + 0x58,0xF9,0x8F,0xF3,0x16,0x48,0xBE,0x14,0xAF,0x94,0x06,0xFF,0x52,0xEC,0x6E,0x0D, + + 0x4F,0x67,0xA0,0x2A,0x5F,0xF8,0xDA,0x38,0x64,0xD2,0x76,0xFA,0x65,0xF5,0x10,0x3E, + + 0xCF,0x89,0x94,0x2F,0x07,0x16,0xEF,0x29,0x4C,0x76,0x92,0xC0,0x7B,0x31,0x59,0x26, + + 0x47,0x09,0xB1,0x23,0x57,0xE9,0xB7,0x88,0x4F,0x77,0xAD,0xAE,0xDF,0xBA,0x2F,0xDB, + + 0xA9,0xBE,0xFA,0x1B,0xF8,0xFD,0x6C,0xC8,0xD7,0x5D,0xAF,0x3B,0xB8,0x58,0x58,0x62, + + 0xE4,0xED,0x52,0xAC,0xBC,0xA0,0x52,0x87,0x4A,0x57,0xE0,0x6A,0x74,0x77,0x17,0xA9, + + 0x41,0x14,0x51,0x3C,0x0C,0x5C,0xCD,0x53,0x69,0x57,0xFF,0x98,0x4C,0xAC,0x59,0xE7, + + 0xCF,0x9A,0xC9,0x90,0x1D,0xDB,0x73,0x09,0x12,0x8D,0xAE,0xD2,0x5B,0x21,0x4F,0x51, + + 0xAE,0x46,0x57,0x20,0xD4,0xB0,0x00,0xDF,0x06,0x26,0x3F,0x7E,0x9C,0xBE,0xA7,0x3D, + + 0x33,0x53,0x3A,0xFB,0x73,0x73,0x40,0x81,0xC0,0xC0,0x2F,0xA0,0x52,0xD9,0x55,0xF6, + + 0x07,0x43,0x73,0xD3,0xCF,0x29,0xD8,0xB4,0x3B,0x95,0xF8,0xA6,0x71,0x6C,0x5A,0x01, + + 0xB7,0xFA,0x97,0xA5,0x23,0xEF,0x57,0x81,0xC8,0x13,0xEF,0x22,0xF8,0xDD,0x6A,0x93, + + 0x18,0x6E,0xC9,0xE5,0xA7,0x82,0xC9,0xC2,0xEF,0x97,0x62,0x12,0x70,0x65,0x78,0xC2, + + 0xC0,0xC7,0xBE,0x6C,0x14,0x06,0x09,0x58,0xE7,0x4D,0xC3,0x97,0x2A,0xCB,0x30,0x74, + + 0x30,0x34,0x08,0xD5,0x69,0x28,0x76,0xC4,0xE2,0xBA,0x27,0x07,0x63,0x09,0xEE,0xA3, + + 0x2E,0xFB,0x96,0x27,0x79,0x77,0xD1,0x7F,0xF6,0x40,0xC0,0x8D,0xBE,0x2B,0x12,0x51, + + 0xF8,0x07,0xB7,0x78,0x95,0x05,0x27,0x5C,0xF0,0xA6,0x3E,0xB5,0x85,0xCA,0x3A,0xF6, + + 0xA4,0x05,0xD6,0xE6,0xDD,0xF5,0x40,0xDB,0x22,0xC5,0xF0,0x8C,0x5E,0x2A,0xA9,0xB0, + + 0xE2,0x3A,0xDA,0xF6,0xDC,0xD4,0xF6,0xAB,0x63,0x43,0xF8,0x04,0x5F,0xEB,0xA0,0xBD, + + 0x63,0xE9,0x29,0xFD,0xAE,0x8B,0x6D,0x89,0x21,0x49,0xE3,0x6D,0xC8,0x6C,0x51,0xE6, + + 0x62,0x48,0x21,0x0C,0xB3,0x2F,0x57,0x4A,0xEB,0x09,0xC8,0x7D,0xDA,0x6D,0x9F,0xB7, + + 0x3D,0xF4,0x95,0x2E,0xF1,0xBD,0xEA,0xF8,0xBD,0xE3,0xC5,0xE8,0x58,0xD6,0x95,0x4C, + + 0x0D,0x4D,0x0A,0xDD,0x5A,0x20,0x62,0x83,0xC4,0xBB,0xE4,0x54,0x5D,0x6F,0x1E,0xBF, + + 0xFD,0x0E,0x99,0xE0,0xF2,0x3F,0x40,0xEB,0x03,0x3D,0x13,0xED,0xB0,0xD1,0x68,0xA8, + + 0xE6,0xF0,0x34,0xAF,0xBA,0xAF,0x53,0x75,0xF8,0xDE,0x94,0xF9,0xD1,0x2F,0x0C,0x04, + + 0x22,0xF2,0xFD,0xF2,0x36,0x32,0xB3,0x11,0xA8,0x53,0x9C,0xAC,0xF2,0xF6,0xCC,0x4C, + + 0x3B,0xCC,0x73,0x65,0x92,0xB1,0x5C,0xAC,0x9E,0x3D,0x94,0x85,0xF3,0xF7,0xFA,0x05, + + 0xA6,0xF7,0x8D,0x01,0xB2,0xD0,0xC0,0xD2,0xC2,0x10,0x06,0x21,0xB2,0xE1,0x25,0xF3, + + 0x5C,0x1F,0xB3,0x35,0x51,0xB2,0x7B,0x04,0x14,0xF5,0x0E,0x31,0xFF,0xFC,0x1A,0xB5, + + 0x26,0x3D,0x86,0x37,0x4A,0x9F,0x6E,0x13,0x5A,0x52,0x4A,0xF0,0x56,0xD9,0x8C,0xC4, + + 0x3F,0x54,0xF6,0x27,0x0B,0x33,0xCD,0x18,0x0F,0x18,0xE6,0x07,0x43,0xFE,0xE9,0x45, + + 0xAC,0xF2,0x5B,0xD4,0x9B,0x5A,0x7B,0x4C,0x43,0xF9,0x4B,0x17,0xD3,0xC7,0x3C,0x6D, + + 0x8F,0x40,0xE3,0x61,0x12,0x98,0x1F,0x02,0xDF,0xFC,0xC8,0xC4,0xC3,0x68,0x3E,0xFB, + + 0x0A,0x5A,0x94,0x08,0x3A,0x38,0xC4,0x68,0x24,0x8C,0x9E,0xB4,0xFA,0xFE,0x35,0x1C, + + 0x7E,0x2B,0xB0,0x3C,0xD9,0xB8,0x4E,0x00,0xE6,0xA4,0xA6,0x23,0x88,0xAF,0x47,0x95, + + 0xAE,0x38,0x78,0x7C,0x1B,0xBA,0xC5,0xB6,0x86,0xFE,0x47,0xCF,0x0B,0x1F,0xCF,0x09, + + 0xC3,0x15,0x1D,0x19,0xBB,0x2C,0x79,0x10,0x1C,0xFD,0x97,0x3C,0xFF,0x39,0x4E,0xEC, + + 0xAB,0xC6,0x57,0x3F,0x06,0x93,0xC8,0xED,0x43,0x30,0x6C,0x13,0x99,0x75,0x47,0xA9, + + 0x07,0x4A,0xF6,0x23,0xD2,0x2C,0x3E,0xAB,0x55,0x50,0xD6,0x78,0x79,0x9F,0xD7,0xB0, + + 0x87,0x7F,0xD6,0x4F,0x73,0xDD,0x0E,0xC8,0x4F,0xA1,0x92,0x92,0xFC,0x7C,0xD5,0xFD, + + 0x68,0xA6,0x63,0x42,0xB8,0x4D,0xA4,0x84,0xC8,0xBF,0x20,0x0C,0x58,0xFF,0x5E,0xA7, + + 0x37,0x61,0x4C,0x17,0x36,0x0D,0x70,0x62,0x42,0xC2,0xD2,0x1E,0x52,0x82,0x56,0xB2, + + 0x36,0x60,0x68,0x92,0xE8,0xA7,0xEC,0x4C,0x8F,0x82,0xDA,0x96,0xF4,0x7E,0x99,0x93, + + 0x6F,0xA1,0xF1,0xB5,0xD4,0x9E,0xF7,0xDC,0x49,0x64,0xCB,0x67,0x84,0xE4,0x91,0x54, + + 0x8B,0x7C,0xCB,0x37,0x93,0xE1,0x71,0x26,0x11,0x80,0x0D,0x55,0x0B,0x7E,0x5E,0x3F, + + 0x67,0xD1,0x47,0x7F,0x96,0x64,0xC8,0xD0,0x4E,0x44,0x1C,0xFD,0xE3,0x72,0x72,0xFD, + + 0x26,0xF5,0x96,0x6F,0x97,0x47,0x21,0x4A,0xE2,0x42,0xEF,0x67,0x67,0xE1,0x79,0xC2, + + 0x6F,0x7F,0xB8,0x72,0x33,0x24,0x56,0x5B,0x46,0x56,0xF9,0x62,0x1E,0xF7,0x57,0x2E, + + 0xE6,0xF2,0xD3,0xA4,0xAF,0xA1,0xF9,0x67,0x45,0x6B,0x90,0x08,0x95,0x48,0x1C,0xAA, + + 0x83,0x7E,0xAC,0x8C,0xDE,0xE9,0x95,0x8F,0x84,0xCB,0x51,0x6E,0x2E,0xEE,0x30,0x1B, + + 0x2E,0x11,0xD2,0x6C,0xF6,0xAA,0x6C,0x44,0x87,0x4A,0x0E,0x5C,0xDF,0x6F,0x2B,0xCF, + + 0x65,0x7B,0x0C,0xED,0x30,0x57,0xE2,0xEC,0x31,0x6C,0xD1,0x0B,0x7D,0x35,0x15,0xBB, + + 0x8B,0x89,0xF1,0xB3,0xF5,0xA8,0x33,0x2E,0x19,0x48,0x6B,0xBB,0xDB,0xEC,0x7A,0x5B, + + 0xE7,0x75,0xCC,0xE3,0xBF,0x03,0x21,0x08,0xA5,0x5D,0x61,0x9F,0x33,0x2C,0x14,0x73, + + 0x3C,0x6C,0x7F,0x79,0xBE,0x02,0x40,0x89,0x77,0xCB,0xDA,0x7A,0xBE,0x12,0x11,0xE5, + + 0xDA,0x03,0x72,0x68,0x3F,0x01,0xD0,0x52,0xE7,0xA6,0xD3,0x76,0xA1,0xCE,0xD3,0xCB, + + 0x64,0xDE,0xF8,0xB7,0xF3,0xE2,0x55,0xCF,0x4F,0x0F,0x3B,0x5F,0xDF,0x44,0x1C,0x7D, + + 0xA7,0x9D,0xA2,0x26,0xDD,0xB3,0x65,0xE2,0x28,0x04,0x0B,0x24,0xB6,0xF3,0x8F,0x22, + + 0xF9,0x32,0x3B,0x76,0x6F,0xAA,0x6C,0x0B,0x2D,0xD2,0xDE,0x12,0xA8,0xFE,0xDE,0x07, + + 0xAF,0x58,0xD7,0x97,0x7F,0x1F,0x64,0xBC,0xDE,0x76,0x75,0x23,0xBD,0xF4,0xC1,0xE0, + + 0xCF,0x35,0x3B,0xF1,0x4A,0xF1,0x1D,0x99,0x04,0x7C,0x09,0xC8,0x56,0xB1,0xF0,0x74, + + 0x5B,0xD5,0xDA,0xEB,0x30,0xB6,0xD7,0xCB,0x0D,0xC5,0xCA,0xCE,0x96,0x75,0xB2,0xD2, + + 0x27,0xF4,0x2C,0x56,0x6C,0xF7,0xEE,0x94,0x12,0xDE,0x03,0x85,0x47,0xB7,0x4D,0x37, + + 0x8A,0x07,0x66,0x38,0x5F,0xA7,0x71,0xE1,0xF8,0xCD,0xE5,0x63,0xF4,0xF6,0xC1,0xA1, + + 0x4C,0xA6,0xAD,0x66,0x3A,0x41,0x3D,0x80,0x9E,0x50,0xBD,0x51,0xBF,0xE6,0xF2,0xF9, + + 0x4E,0x3E,0xE6,0xD7,0x3A,0xDA,0x66,0xB9,0x4E,0xFB,0x76,0xD1,0xFE,0x7E,0x7C,0x3E, + + 0xE5,0x3A,0x81,0x7C,0x91,0x04,0x3C,0x7A,0x09,0x52,0x01,0x5C,0xFF,0xC5,0xF7,0x4B, + + 0xBC,0x3E,0x68,0x0D,0x7E,0x39,0x09,0x0A,0x61,0x5C,0xE5,0xF0,0x5F,0x9F,0xFB,0x99, + + 0xE5,0x3F,0xD7,0x6E,0x1E,0xFB,0xEE,0x8A,0xC7,0xC4,0x03,0xDD,0x02,0x9E,0x18,0xE6, + + 0xAC,0x30,0xDD,0x50,0x3D,0xDC,0xF2,0xE7,0xEC,0x70,0xC8,0xC6,0x9C,0x3C,0x40,0x77, + + 0x8E,0x42,0xFF,0xDC,0xA8,0xBB,0x20,0xD2,0x6B,0xD9,0x68,0x0F,0x02,0x02,0xB5,0xA9, + + 0x51,0x98,0xC1,0xE7,0x82,0x1E,0x24,0x89,0x05,0xEF,0x1D,0xCB,0x1F,0x51,0xC3,0x44, + + 0xAC,0x7F,0xC1,0x6A,0x1E,0x10,0x79,0x89,0x04,0xEE,0xA6,0xCA,0x5A,0x93,0x62,0x05, + + 0x03,0x40,0x40,0x35,0xD5,0x62,0x70,0x76,0x7B,0x9D,0xAE,0x10,0x73,0x25,0x54,0x62, + + 0xEA,0xA0,0x8E,0x90,0x4D,0xDC,0x78,0x66,0x7A,0x4C,0xA6,0x5C,0xDC,0xE7,0x35,0xB7, + + 0x86,0x4A,0x8E,0xE6,0xB0,0x62,0x69,0x06,0x3D,0x4D,0x97,0x14,0x50,0xB4,0x77,0x25, + + 0x7D,0xC2,0xA9,0xFF,0xEE,0xBF,0xB5,0xB4,0x62,0x26,0x9D,0x75,0xF9,0x65,0x80,0xD2, + + 0x04,0x46,0x00,0xC0,0xD0,0x66,0x94,0xC8,0x44,0x46,0x94,0x25,0xBB,0xB5,0x4C,0x52, + + 0x07,0xFE,0xF0,0xAF,0xEE,0x9C,0x23,0x57,0xE2,0xFA,0x4D,0x50,0xBA,0x34,0xBF,0x01, + + 0xC2,0xFD,0x81,0xB2,0x61,0x43,0x97,0xE5,0xC0,0x49,0xA9,0x74,0xA6,0x4A,0x49,0x4E, + + 0xA1,0xDC,0x91,0x51,0x66,0xBE,0xE6,0x08,0xE0,0x07,0xCF,0x4D,0xBB,0x6A,0x58,0x59, + + 0x74,0xA7,0x59,0x0C,0x1E,0x70,0x2A,0xAD,0xEB,0xC5,0x38,0x9C,0xF9,0xEF,0x74,0x1F, + + 0xE8,0x06,0xB0,0xEF,0x46,0xD2,0x3B,0xBC,0x47,0x22,0x05,0x38,0x0F,0xB6,0xA3,0x7B, + + 0xEA,0xA6,0x02,0x89,0xB1,0x47,0x6D,0x55,0x4A,0xE6,0xDD,0x39,0x10,0xF3,0x51,0x71, + + 0xF5,0xA4,0x3A,0xE3,0x9F,0x73,0x7B,0x6A,0x88,0x46,0xA5,0x45,0x99,0xC4,0x6C,0xB5, + + 0x34,0x77,0x9A,0x48,0xA6,0x2F,0xE9,0x10,0x69,0x0C,0xC0,0xF1,0xB1,0x28,0x85,0xD2, + + 0x7C,0xA1,0xD1,0x62,0x35,0xD8,0xC7,0x18,0x35,0x98,0x7E,0x58,0x68,0xB6,0xC1,0xB0, + + 0x75,0x4C,0xFD,0xED,0xA7,0x27,0xE6,0x54,0x23,0xBF,0xE9,0xDD,0x47,0xC1,0x94,0xED, + + 0xB4,0xAF,0x99,0xD9,0xD9,0x7D,0x0F,0x46,0xED,0x0D,0x61,0x4D,0xBA,0xC0,0x7C,0x68, + + 0x18,0x5D,0xF9,0x7F,0xE1,0xED,0x2C,0x22,0xA9,0xD3,0xF4,0xF2,0x4B,0x7D,0x5C,0x14, + + 0x2B,0xCE,0x2C,0x64,0xF3,0x73,0x5C,0xBA,0x67,0x13,0x3B,0x9D,0xA1,0x20,0xFE,0x89, + + 0x05,0x09,0xAE,0xB5,0x90,0x9D,0xD5,0x25,0xF6,0x10,0x76,0x81,0x24,0x63,0x6D,0xC7, + + 0xCF,0x1C,0xC9,0x94,0x0E,0x9E,0xE8,0x76,0xE7,0xF3,0xBA,0x98,0x6D,0xE2,0x84,0x45, + + 0x10,0x56,0xDB,0xB7,0x4B,0xB3,0xC1,0x86,0x9D,0x38,0xAA,0xE3,0x56,0xFF,0x87,0x59, + + 0xF7,0x36,0xEC,0xF4,0xDA,0x8C,0x06,0x44,0x1F,0xFA,0x7C,0x86,0x11,0x09,0x05,0x54, + + 0x5D,0x54,0xC1,0xD5,0x81,0xF7,0x37,0xF0,0xE1,0xE6,0x32,0xD4,0x8E,0xD9,0xEA,0x75, + + 0xA5,0x55,0xBF,0xD1,0xE5,0x2C,0xFD,0x83,0x81,0xFB,0xA3,0xF2,0xD7,0xDC,0xB2,0xF7, + + 0x8B,0x5A,0x14,0xBD,0x99,0xC7,0x11,0xE8,0x64,0xF3,0xAC,0x5F,0x01,0xD7,0x16,0x9C, + + 0x81,0x2F,0xD4,0xFB,0x45,0x96,0x97,0x3C,0x6B,0xFA,0x9F,0x5A,0x92,0xDA,0x56,0x67, + + 0x55,0x95,0xB9,0xBC,0x96,0xE5,0x8C,0xA8,0xEE,0x58,0x0E,0x45,0xC4,0x35,0xCF,0xC5, + + 0xEE,0x11,0x2F,0x6D,0x28,0xE8,0xDF,0x3D,0x9B,0xA4,0x38,0xBB,0x2D,0x1F,0x20,0x4C, + + 0x28,0xBA,0xD1,0xCE,0x74,0x91,0x28,0xEF,0x83,0x8D,0xAE,0xF1,0xBA,0xB3,0x0E,0x4D, + + 0xD4,0x5F,0xC8,0xB0,0xD2,0x64,0x5C,0x1E,0x6D,0x5F,0x59,0xEE,0x5F,0xD2,0x87,0x4C, + + 0xA3,0x5C,0x97,0x7F,0xB2,0x9C,0x2F,0x01,0xD6,0x13,0xE9,0xD0,0x91,0x71,0x84,0x50, + + 0x7F,0x7C,0xBD,0xDC,0xFB,0x24,0xEF,0x7D,0xE5,0x77,0x7B,0x9F,0x0C,0x1A,0x80,0x70, + + 0x66,0x2C,0x21,0x74,0xFF,0x01,0x50,0x71,0x49,0x82,0x2F,0xCE,0x38,0xAD,0x50,0x03, + + 0x61,0x2C,0x10,0xE9,0x98,0x0C,0x19,0xB0,0x8C,0xE9,0xD8,0x7C,0xDC,0xEE,0x5F,0x04, + + 0xE7,0x7D,0xDF,0x33,0xA7,0x43,0xF1,0xAF,0xC2,0xC0,0xCF,0x52,0x3D,0x1B,0xBB,0xF3, + + 0x81,0x23,0x3B,0x88,0x7C,0x02,0xF9,0xB7,0x33,0xAF,0x0D,0x45,0x76,0xA2,0x3F,0xBD, + + 0x00,0x7E,0x86,0xE2,0xE3,0x02,0x32,0xEE,0x8C,0x47,0x50,0x14,0x34,0x98,0x36,0x6E, + + 0x0F,0x28,0xBA,0x67,0xB6,0x5A,0x2C,0x01,0x61,0x64,0x6F,0x47,0xF6,0x44,0x00,0x31, + + 0x6D,0x37,0xB5,0x07,0xC1,0x0B,0xCA,0xF0,0xE8,0xCE,0x8F,0x60,0xF2,0x4B,0x7A,0xC3, + + 0x78,0x2A,0xD7,0xF2,0xB9,0x78,0x41,0x8C,0x2E,0xE4,0xC1,0x47,0x7A,0x48,0x34,0x7A, + + 0x2C,0x20,0xC0,0x0E,0x1F,0x22,0xF2,0x3B,0x14,0xC0,0xEC,0x5A,0xA3,0x43,0x6E,0xEC, + + 0x8F,0x25,0xF3,0x1A,0x90,0xCA,0x02,0xC4,0xE1,0xC4,0x71,0xB7,0xD0,0xEF,0x35,0xEB, + + 0x43,0xC8,0x9D,0x3B,0x68,0x0B,0x27,0xA9,0x05,0x85,0x2C,0xD0,0xF8,0xA8,0x27,0xF9, + + 0x21,0x76,0x00,0xBA,0x48,0xB5,0xC4,0xB9,0x04,0x68,0x11,0xD3,0x7C,0x1D,0xF1,0x0D, + + 0xD0,0x84,0x0E,0x31,0xD4,0xEF,0xA6,0x94,0xC1,0x31,0x52,0x1C,0x3C,0xB0,0x7F,0x5C, + + 0xC7,0x9C,0x6A,0x4F,0x75,0x00,0xAE,0xBA,0x4B,0x6D,0x4C,0x4F,0x67,0x42,0xE3,0x28, + + 0x16,0x2A,0x58,0xDC,0xB4,0xA4,0x15,0xDB,0x3B,0x68,0x8D,0x68,0xFA,0x65,0xCF,0xDF, + + 0x8D,0x29,0xBB,0xBF,0xDD,0x0F,0x2D,0x74,0xB3,0xD4,0x5B,0x0D,0xBD,0x93,0xA4,0xA1, + + 0xC2,0x3D,0xDA,0x81,0x81,0xBF,0xF4,0x93,0x8A,0xD8,0x8C,0x58,0xD8,0xFD,0xAC,0x91, + + 0x8A,0x97,0x3C,0xAF,0xDE,0xF5,0xFC,0x33,0x7D,0x93,0x9A,0x9E,0xF9,0xB3,0x38,0xF3, + + 0xAC,0x9B,0x11,0xE8,0x17,0x39,0xB0,0x27,0xE6,0x13,0x4A,0xB4,0xCC,0xB6,0x87,0x26, + + 0x04,0x4C,0xF7,0x05,0xC7,0xF1,0x2B,0x04,0xE6,0xB3,0x7D,0x40,0xF4,0x73,0xC3,0x72, + + 0x20,0x96,0xF0,0xC4,0x7A,0x19,0xB4,0x62,0x28,0x96,0xCC,0x19,0x9F,0x8C,0xAC,0x52, + + 0x69,0xD7,0xB5,0xFE,0xDE,0x64,0x82,0x76,0x25,0xD7,0x84,0xF2,0x9E,0xAD,0xD5,0x47, + + 0xA8,0x85,0x7C,0x75,0xB2,0x16,0xB5,0x71,0xE0,0xD4,0xE3,0x85,0xD2,0x5D,0x2D,0x31, + + 0xA1,0x15,0x15,0xD8,0x95,0xAC,0x75,0xE3,0x98,0xF7,0xCF,0x04,0x73,0x53,0x92,0xE8, + + 0xD3,0x9E,0xE6,0x3F,0xC7,0x33,0x0C,0x59,0x19,0x73,0x69,0xAF,0xFC,0xB8,0x5A,0xDA, + + 0x65,0xDB,0xF4,0xD5,0x4B,0xFB,0x86,0x45,0x6B,0x48,0x7E,0x3A,0xB7,0xF4,0x09,0xCA, + + 0xAA,0xD8,0x1B,0xB2,0x57,0xFE,0x2A,0xAE,0xDF,0x3B,0x68,0xAF,0x20,0x0B,0xEB,0x9F, + + 0x2D,0x9B,0x6F,0x44,0xF5,0x7A,0x0B,0x3F,0xEF,0xB6,0x44,0x98,0x5C,0xB9,0x26,0x8A, + + 0x6E,0x67,0xF5,0xA8,0x7E,0xF3,0x56,0xEE,0x11,0xDC,0x8E,0xE9,0x5A,0x77,0x6E,0x95, + + 0xD2,0xE1,0x6C,0x1E,0x2B,0x48,0x3E,0xDC,0x69,0xBF,0x5E,0x8C,0x1D,0x31,0x63,0xC9, + + 0xAA,0x65,0xD9,0xF6,0x33,0x38,0xDA,0x94,0x73,0x9C,0xCC,0xDE,0x86,0x51,0xAF,0x5B, + + 0x0B,0xDD,0xF8,0xCE,0xC7,0xFD,0x73,0x7F,0xED,0x3D,0x81,0xF8,0xDB,0xFF,0x3A,0xE8, + + 0x56,0x4F,0xBE,0x64,0x78,0x03,0x4F,0x56,0xCD,0x96,0x40,0x35,0x72,0x64,0xA4,0xF8, + + 0x81,0xCC,0xAA,0xFC,0x0F,0x6E,0xE3,0xC6,0x72,0xFA,0xDC,0xDC,0x13,0x2C,0x58,0x91, + + 0x25,0xFD,0xC3,0x16,0xBA,0x2D,0x19,0x31,0x3D,0xC3,0xE5,0x34,0xAC,0x43,0xEE,0xE2, + + 0xFD,0x18,0xB3,0xE6,0xB7,0x8C,0xA3,0xCE,0xF2,0x21,0xF9,0x63,0x34,0x6C,0x47,0xC4, + + 0x5D,0xDD,0x0B,0xD3,0x92,0xC5,0xB7,0x9F,0xB3,0xE2,0x40,0x16,0xB9,0x55,0xFF,0x48, + + 0x05,0xDF,0x0A,0x32,0xEC,0x3E,0x03,0x70,0x45,0x05,0xEB,0x85,0x27,0x67,0x18,0x55, + + 0x7F,0x49,0x01,0x99,0x5C,0x3D,0x29,0x9F,0x3A,0x4F,0xAF,0x49,0xB9,0xD7,0xE6,0xB9, + + 0xC3,0xFA,0x0A,0x33,0x1E,0xD1,0xF4,0x99,0xDB,0x9A,0x86,0xF5,0xA0,0x12,0xA2,0x8C, + + 0x64,0xF4,0x15,0xE4,0x06,0x65,0xEA,0xC0,0x12,0x05,0xCB,0x2E,0xBD,0x0D,0xD4,0xEC, + + 0x55,0xA4,0x6D,0xDC,0x6C,0x6B,0x4A,0x28,0x5D,0x04,0x2E,0xDE,0x6A,0xF9,0x25,0xEB, + + 0xA2,0x11,0x7C,0x7E,0xE4,0x46,0x84,0xC1,0x82,0x05,0xEB,0xC4,0xC4,0x07,0x5F,0x79, + + 0xC9,0xC4,0x1D,0x2A,0x9F,0x8B,0x42,0xBC,0x6E,0x50,0x23,0x1A,0x7A,0x0E,0xBA,0xCC, + + 0x11,0x77,0x8A,0x55,0x1C,0xD6,0xAA,0x60,0xB7,0x03,0x65,0x44,0x5C,0x75,0x13,0xDA, + + 0x4E,0xF2,0x93,0xC0,0xBE,0xAD,0xD9,0x0B,0x53,0xE4,0x1A,0xBC,0x0E,0x67,0xF3,0xC9, + + 0x6B,0x6D,0x98,0xC9,0x87,0xF7,0x0D,0x20,0xCA,0x4A,0x55,0x1F,0x31,0x8F,0x12,0xD5, + + 0x2E,0xD0,0x33,0x5F,0x83,0x34,0xDA,0x99,0x83,0xE4,0x0F,0xF9,0xD8,0xBF,0xFE,0x68, + + 0x6E,0x5F,0xAC,0x83,0xB1,0x74,0xD4,0x95,0xBD,0x4B,0x9B,0xA4,0x1B,0xA8,0x5C,0x8D, + + 0x80,0x7D,0xF1,0xB3,0x90,0x6E,0xDC,0x7C,0xFC,0x4A,0xC2,0x74,0x71,0xDA,0x55,0x99, + + 0xBE,0x14,0xBD,0x6F,0x1C,0x3F,0x4E,0xD2,0x43,0x9D,0x95,0x54,0xAD,0x72,0x54,0x68, + + 0x67,0x28,0x39,0xF7,0x0E,0x2E,0xC0,0xCE,0x06,0xDE,0xD1,0xB5,0x10,0x0C,0x1D,0x28, + + 0xC7,0x6B,0xFA,0xEC,0xBF,0x92,0x2A,0x20,0x72,0x19,0xAD,0x60,0x31,0xBF,0x7E,0xC3, + + 0x02,0x1A,0xAC,0x82,0x5E,0x38,0x9C,0x3C,0x40,0x17,0xA4,0xD3,0x8E,0x7A,0x7B,0xCD, + + 0x3E,0x19,0x0E,0x85,0xBA,0x77,0x2B,0x20,0x1A,0x6E,0x15,0x25,0xA6,0xAB,0x7F,0x2E, + + 0x90,0xF7,0xBF,0xFB,0xC3,0x52,0x12,0x8A,0x0A,0x67,0xDB,0xC0,0x73,0x6B,0x41,0x6F, + + 0x1B,0xAA,0xAE,0xEE,0x81,0x34,0x4F,0x55,0x8F,0x5E,0xE9,0x53,0x7E,0x22,0x0B,0x6A, + + 0x69,0x56,0x75,0x67,0xCA,0xB2,0xDB,0x5E,0xCC,0x52,0x5D,0xDA,0x58,0x39,0xBF,0x76, + + 0x8A,0xF7,0xBF,0xFF,0xC7,0x1A,0x37,0xAF,0x49,0x41,0xCF,0xCC,0xC4,0x61,0x37,0x71, + + 0xD2,0xD4,0xDB,0xAC,0x9F,0x24,0x9F,0xA9,0x4E,0x40,0x83,0xAD,0x10,0x4B,0x78,0x2A, + + 0x8D,0x0C,0xFE,0x7E,0x71,0xDD,0xBA,0x7B,0x7E,0x54,0xE1,0xC4,0x86,0xAD,0x17,0x54, + + 0x8E,0x16,0x5E,0xFB,0x9A,0xBA,0x00,0xF1,0x6B,0x13,0x24,0x8E,0x90,0x9C,0xF8,0x2F, + + 0x1E,0xAE,0x73,0xAF,0x58,0x94,0x9D,0x6D,0xB5,0x54,0x64,0xD4,0xFC,0x17,0xCF,0xF7, + + 0xFB,0x04,0x7E,0x44,0x39,0xF3,0xDC,0x3F,0xE7,0x44,0x1F,0x3D,0xAE,0x75,0x79,0x04, + + 0x40,0x9B,0xD6,0x06,0x14,0xA0,0x6F,0x54,0x77,0x62,0xEA,0x27,0xF7,0xA2,0xA9,0x52, + + 0x41,0x4A,0xCE,0xB7,0xEA,0x0C,0x58,0x92,0x5D,0xCE,0xE3,0x02,0xD7,0x2D,0x81,0x75, + + 0x0B,0x04,0xA1,0x40,0x7D,0xAB,0xC9,0xCB,0xCA,0x8F,0x27,0xA9,0x75,0xF9,0xA8,0xFB, + + 0xEA,0x48,0x79,0xD0,0x4B,0xAB,0x60,0xA2,0x60,0xC5,0x04,0xD5,0xF1,0xEF,0x4A,0xE7, + + 0x28,0x0E,0x23,0x34,0xB1,0xEA,0x7D,0x67,0xC6,0xA4,0xC8,0x98,0xFA,0xE9,0x95,0x69, + + 0x26,0x70,0x28,0x02,0xE7,0xAB,0x7D,0xE2,0xB8,0x80,0x41,0xD3,0x9D,0xE8,0x49,0x1E, + + 0xC7,0x85,0x65,0xC3,0x89,0x5B,0x2F,0x2A,0xCE,0x6B,0x0C,0x29,0x23,0xBA,0xE8,0xD7, + + 0xD8,0xC0,0x81,0x95,0x13,0xA9,0xFB,0xD4,0x26,0xA4,0x84,0x9D,0x23,0x96,0xA5,0x88, + + 0x2E,0xB8,0x22,0x11,0x3A,0x25,0x62,0x37,0xEF,0xD3,0x8A,0x6C,0xFF,0xE4,0x82,0x0A, + + 0xEC,0x92,0x06,0x8D,0x37,0xA3,0x63,0xC3,0xA8,0x3F,0xD2,0xCF,0xDE,0xEB,0x1B,0xE3, + + 0xF7,0x45,0xDD,0xAF,0x75,0xA9,0x71,0x4D,0x33,0xA6,0x17,0x6D,0x58,0xE6,0x6C,0xFD, + + 0xBE,0xB0,0xA2,0x9B,0xF1,0x4E,0x45,0x06,0xFE,0x10,0xEB,0x32,0xCF,0x40,0x3B,0x5A, + + 0xAB,0x73,0x46,0x8C,0xBD,0xA2,0x8F,0x9B,0x17,0xCC,0x45,0x56,0xAB,0x8F,0x34,0x03, + + 0x0F,0xF8,0xB3,0xA7,0xBA,0x02,0xF1,0x72,0xEA,0x62,0x3A,0x7B,0xFC,0x60,0x3A,0x5F, + + 0x2B,0x31,0xDB,0xEB,0x1B,0xCF,0x2A,0x7E,0x6B,0x61,0x95,0x0D,0x25,0x71,0x73,0xDF, + + 0xD0,0x58,0xFA,0xAF,0x60,0xE0,0xF4,0x93,0xD7,0x82,0x26,0x7D,0x68,0xD0,0xCC,0x92, + + 0x22,0x6A,0x1C,0x6D,0x87,0xF2,0xF1,0xC4,0xEB,0x56,0xAE,0xA7,0x55,0xB0,0xD3,0x7A, + + 0x5E,0x5C,0xD1,0x54,0x94,0xAE,0xBB,0x54,0x56,0xA3,0x04,0x56,0x37,0x04,0xF5,0x6B, + + 0xE6,0xDF,0xA3,0x26,0x37,0xBF,0xB2,0xE3,0xE8,0x59,0xB9,0x2C,0xC7,0xA0,0xC1,0x0C, + + 0xA6,0xF3,0x10,0xCA,0x4A,0xEE,0x85,0x4C,0x0C,0xDA,0xBE,0x33,0xAA,0x2A,0xBD,0xB4, + + 0x46,0x6B,0xFB,0xA4,0xC1,0xD1,0x2D,0xF6,0x5D,0xCF,0x6A,0x95,0x1A,0x75,0x97,0xE9, + + 0x33,0x0E,0x71,0xB4,0xC4,0xD0,0x9E,0xB2,0x66,0xCE,0x07,0x89,0x1F,0xF8,0x9A,0xB1, + + 0xC4,0x69,0xDD,0x38,0x34,0x7A,0xCB,0xA4,0xD5,0x8D,0x75,0x18,0x17,0x95,0x6D,0x57, + + 0xA3,0xEB,0xD5,0x2C,0xCA,0xBC,0x24,0x07,0xE7,0xCC,0x02,0x89,0xD9,0x28,0x99,0x9A, + + 0xCB,0x83,0x2D,0x70,0x85,0x00,0x91,0x48,0xAC,0x77,0xEF,0xBE,0x81,0xB7,0x77,0x98, + + 0xC8,0x6F,0xC6,0x98,0xBE,0xDD,0x46,0xA8,0x84,0xD6,0x11,0x56,0x39,0x04,0x60,0xED, + + 0x53,0xF6,0xD8,0xE5,0xED,0x25,0x63,0xD8,0xCD,0x2E,0x00,0xB6,0xFA,0x20,0xD0,0x0B, + + 0x5A,0x80,0x6F,0x8E,0x67,0x1B,0x27,0xBF,0xA5,0xF8,0x47,0xBD,0xFB,0x0E,0xD9,0xE6, + + 0xD5,0x01,0x66,0xB4,0x4B,0xB7,0x52,0xFE,0x4C,0xEC,0xC8,0xD2,0x02,0x53,0x56,0xC9, + + 0x3B,0x92,0xFD,0xDC,0x7B,0xF1,0x27,0x66,0x0C,0xFD,0x80,0xF9,0xDE,0x22,0xB4,0x31, + + 0x13,0x3F,0x65,0xD5,0x82,0x0A,0xA5,0x4B,0xEE,0xBD,0x57,0x9C,0x86,0x2D,0x5D,0x24, + + 0x22,0x22,0x2F,0x99,0xA9,0xD3,0x87,0xBD,0xE3,0x9D,0x4B,0x9D,0x00,0x5B,0x93,0x06, + + 0xC8,0xB1,0xE6,0x3C,0x11,0xA0,0x30,0xCA,0x29,0x31,0xAE,0x08,0xDD,0x02,0x36,0x25, + + 0x07,0xA1,0x8E,0x3D,0x91,0xA6,0x8C,0x90,0x6D,0x23,0x58,0x37,0xD0,0x6C,0xA5,0xF0, + + 0x23,0x42,0x22,0x3D,0x4C,0x93,0x70,0x61,0xC4,0x0C,0x6A,0x56,0xEC,0x20,0xF6,0x73, + + 0x72,0x66,0x25,0x66,0xAD,0x85,0x09,0xB9,0x95,0x01,0x26,0x77,0x70,0xB6,0x8B,0xC9, + + 0xD6,0x07,0x88,0x55,0x79,0xE7,0x17,0x27,0x44,0x26,0x2D,0x16,0xE5,0x5B,0x38,0x32, + + 0xF0,0x60,0x1E,0x93,0xD1,0x37,0x9C,0x6E,0x40,0xE5,0x08,0x8E,0xA8,0x27,0xE6,0xE0, + + 0x00,0xAA,0x41,0x47,0x86,0x8B,0xDC,0xA1,0xD6,0x04,0xA8,0x5B,0xF8,0x93,0x71,0xAA, + + 0x7F,0xF6,0xC1,0x50,0xF8,0xE4,0x07,0xC0,0xD3,0x43,0x5D,0x97,0x32,0x1C,0x3A,0xF3, + + 0x85,0xF5,0x15,0xFF,0x24,0x85,0x5A,0x28,0x58,0x0A,0x03,0x13,0x64,0x2A,0xF1,0x9C, + + 0x0A,0xD9,0x1B,0x5B,0xF0,0x98,0x1C,0x21,0x48,0x69,0x65,0xFE,0xF8,0xB6,0x64,0xF6, + + 0x7D,0x9C,0x12,0x9E,0xEC,0x85,0x5B,0x8D,0x47,0x08,0x53,0x5E,0x5B,0x67,0x33,0xE3, + + 0x25,0x06,0xED,0xBC,0x72,0x9A,0x8B,0xFE,0xED,0x27,0x5B,0x2D,0xE6,0xC6,0xF1,0x74, + + 0x0C,0xD6,0x46,0x3F,0x70,0xA5,0x55,0xEC,0x44,0x14,0x52,0x82,0xE1,0x73,0xE3,0x26, + + 0x9E,0x0B,0x9C,0xEE,0x4B,0x5D,0xF9,0x38,0x47,0xE6,0xF2,0x1E,0xA6,0x61,0x06,0x06, + + 0x77,0x72,0xC1,0x2D,0xD2,0x83,0x1B,0x61,0xCC,0x2C,0x13,0x68,0x79,0xB3,0x65,0x67, + + 0x8D,0x6D,0xF5,0xEC,0xFB,0x4F,0x0D,0x61,0x3F,0x4C,0xE3,0x95,0xC7,0x22,0x52,0xA9, + + 0xCB,0x21,0x67,0x44,0x2A,0x5C,0x2A,0x89,0xED,0xF6,0x6F,0xD7,0x08,0x32,0x32,0xB8, + + 0x49,0x1C,0xB2,0xB8,0xFB,0xA0,0x09,0x34,0x63,0x59,0x23,0xF6,0xD0,0xA4,0x03,0xB4, + + 0x20,0x94,0xBB,0xA8,0x7A,0x83,0x04,0x61,0xA9,0xFF,0x55,0xA6,0x71,0x7F,0x1F,0x2B, + + 0x4A,0x57,0xC5,0x9D,0x79,0xA2,0xDD,0x31,0xAF,0xAC,0x8E,0x8A,0x89,0x31,0x34,0x44, + + 0x2C,0x7F,0x9A,0x61,0xB2,0x9F,0x00,0x65,0x1A,0xAB,0x2B,0x14,0xA4,0xD5,0xDF,0x10, + + 0x6B,0xBE,0xA7,0x24,0xB3,0x3A,0x0C,0xCB,0x49,0x17,0x8E,0xBB,0x98,0x11,0x23,0xFC, + + 0x57,0xB0,0x97,0xC3,0x30,0x4A,0x6E,0x5D,0x15,0xC3,0x42,0x16,0x76,0xFB,0x99,0xD0, + + 0x23,0x35,0x94,0x45,0x16,0x31,0xDD,0x2A,0x3F,0xB4,0xE5,0x0B,0x7E,0x8A,0x3C,0x38, + + 0x9C,0xB7,0x17,0x9F,0x40,0x49,0xBA,0x3B,0x14,0x85,0x56,0xDF,0xFB,0x75,0x36,0x63, + + 0xD8,0x75,0x9D,0x8F,0x05,0x88,0xBD,0x84,0xB5,0xA8,0x5E,0xAC,0x46,0xD4,0xA3,0xEB, + + 0x5B,0x7F,0xA7,0x99,0x70,0x6B,0x71,0x95,0xEB,0xDA,0x68,0x6F,0x59,0xA5,0xCB,0x67, + + 0x50,0x79,0xB5,0x6E,0x81,0x96,0xF3,0xC6,0x23,0x2A,0x8A,0x39,0xFB,0xC1,0xF9,0xB9, + + 0x56,0x17,0x6B,0x53,0x99,0x97,0x76,0xED,0x01,0xBF,0x35,0x2E,0xFE,0x72,0x16,0xC8, + + 0xC0,0x7E,0x62,0x4E,0x77,0x35,0x3C,0xE8,0x68,0xFD,0x84,0xF9,0x13,0xFE,0xC3,0xB7, + + 0xC3,0xCF,0x50,0xCC,0x53,0xCF,0x87,0x9A,0x84,0x30,0x73,0x0F,0xB2,0x8F,0x6F,0xDC, + + 0xC0,0x7C,0x4F,0xBE,0x52,0x9B,0x65,0x0A,0x8D,0x5B,0xA1,0x4D,0x1A,0xDC,0x5F,0x45, + + 0xF9,0x36,0x9E,0x3E,0xDE,0xA3,0xA0,0x3D,0x74,0x82,0xA5,0xA2,0x56,0xE8,0x56,0x3F, + + 0x27,0x6C,0xBF,0x92,0x1B,0x06,0x46,0x1F,0x91,0x10,0xAD,0xB2,0x57,0x31,0x5F,0x3B, + + 0x71,0x14,0xDF,0x3F,0x63,0x57,0xF1,0x9A,0x10,0x93,0x71,0xA7,0x22,0x4F,0xAC,0x54, + + 0x64,0x25,0x97,0x3A,0x4B,0x0E,0x47,0x0E,0x47,0xFF,0x15,0xA4,0xFF,0x1C,0xBC,0xD1, + + 0x7E,0x59,0x4C,0xD5,0x70,0x0B,0xC7,0xC3,0x40,0xA6,0x0B,0x6E,0xF3,0x9B,0x36,0xF6, + + 0x0F,0x81,0xBE,0x67,0x71,0x0A,0xC1,0xEC,0x44,0x04,0x85,0x9C,0xD4,0xE8,0x07,0x7B, + + 0x85,0x26,0xB3,0x45,0xD2,0x0B,0xC1,0x24,0x7B,0x30,0x58,0x19,0x43,0x6B,0x2D,0x2C, + + 0xEE,0x36,0xBB,0x68,0xF5,0xE6,0xD2,0x1D,0x12,0x3B,0x06,0xB5,0x76,0x38,0x31,0xF9, + + 0x7C,0x05,0x33,0x90,0x1D,0x58,0x8E,0x48,0xBB,0xAD,0x09,0xBD,0x7E,0x37,0x14,0x22, + + 0x65,0xD8,0x6A,0x9B,0xF7,0x04,0x6E,0x24,0x3D,0x66,0x45,0xBA,0x5F,0xAD,0x45,0x26, + + 0x67,0xFB,0x10,0x23,0x60,0xDB,0x0B,0x35,0xEE,0x65,0x89,0xD5,0x27,0x91,0x55,0x37, + + 0x64,0xFA,0xBC,0x80,0x74,0x3A,0x2C,0x49,0x26,0xFA,0x85,0x07,0x50,0x89,0x3A,0x4F, + + 0xFB,0x25,0x82,0x4C,0x2F,0xA1,0xCF,0x35,0x35,0x9C,0x32,0x7E,0x61,0xAE,0xBA,0x58, + + 0x03,0x26,0xD2,0xA5,0xEA,0x02,0x38,0xCB,0xA6,0xCE,0x3A,0x4B,0xD2,0xE1,0x70,0xAB, + + 0xCE,0x21,0x18,0xCD,0x1E,0x47,0xB3,0x6F,0x53,0x8C,0x65,0x28,0x23,0xE1,0xBB,0xA4, + + 0x0D,0x23,0xBF,0x24,0x74,0xEC,0xD7,0xFE,0x38,0x62,0x5F,0x3D,0x5B,0xE2,0xDB,0xC5, + + 0xCD,0xC1,0xB1,0xC1,0xFE,0xA1,0x8F,0x31,0x50,0xD8,0x74,0x26,0x82,0x50,0x64,0x96, + + 0xA2,0xF0,0x92,0xBF,0x33,0xB3,0xA9,0xC1,0x5D,0x93,0xBC,0x92,0xA1,0x60,0xC2,0xF0, + + 0x9C,0x44,0xAD,0x83,0x1C,0x5F,0x37,0xBD,0xD0,0x26,0xA0,0x84,0xAB,0x09,0x81,0xE8, + + 0x6F,0xC2,0xA5,0x13,0xB7,0x51,0x7D,0xAF,0x1A,0xBF,0x1A,0x8E,0x25,0x22,0x9B,0x46, + + 0x28,0xCC,0xB6,0xC0,0xFE,0xD7,0x24,0x91,0x08,0xBA,0x20,0x15,0x58,0xD9,0xCF,0x92, + + 0x6F,0x18,0xB6,0x0C,0x5F,0x44,0x42,0x47,0xE8,0x53,0x9C,0xB9,0x9F,0xFA,0x6D,0xCF, + + 0xA0,0xF4,0x41,0xE0,0x17,0x49,0x17,0xF3,0xE7,0x46,0x3F,0x0F,0x76,0x3B,0x13,0x62, + + 0x27,0x46,0x93,0xD1,0x56,0x34,0xFC,0x33,0xAF,0x7C,0xA4,0x0E,0x12,0x08,0x58,0xB2, + + 0xDD,0x3E,0x0A,0x1D,0x40,0x47,0x50,0x0B,0x99,0x7E,0x91,0x93,0x9D,0x57,0xCE,0xEC, + + 0xD2,0xF7,0x94,0x64,0xC6,0xC2,0x6E,0xA5,0x47,0xB7,0x90,0x80,0xDC,0x66,0x32,0x78, + + 0x90,0x81,0x1C,0x1C,0xC8,0x65,0x67,0x6B,0xAC,0x0E,0xE5,0x5C,0x96,0xFC,0x11,0xA3, + + 0x73,0x10,0x50,0x1B,0xBF,0xFF,0x80,0x28,0x95,0x06,0x0B,0xDD,0x06,0xB9,0xCA,0x4E, + + 0x20,0xE4,0x4B,0x3D,0xB2,0x41,0xA4,0xEB,0xEE,0x6E,0x36,0x36,0xDD,0xFA,0xAA,0xC4, + + 0x2C,0x3D,0xC8,0x7B,0xB3,0xD8,0xFF,0xBA,0x3F,0x70,0x6E,0x7C,0x7E,0x90,0x6F,0xC6, + + 0x21,0xDC,0x9F,0xDC,0xDC,0xFA,0x49,0x5E,0x61,0x58,0x5A,0x8A,0x03,0xF1,0x31,0x6A, + + 0xEF,0x9B,0x5B,0xBD,0x54,0xBC,0xA9,0x3C,0x2D,0xCD,0x40,0x1D,0xDB,0xFF,0x5E,0x34, + + 0x1C,0x06,0x92,0x04,0xEF,0xAD,0x4F,0x21,0x46,0x63,0x28,0xCB,0x2B,0x78,0xA1,0x6F, + + 0xA2,0x07,0x9A,0x30,0x17,0x52,0x1E,0x42,0xAA,0xA0,0x43,0xB2,0x57,0x22,0x28,0x42, + + 0x86,0x71,0x50,0x81,0xE2,0x40,0xD0,0x52,0x8F,0x4B,0xCA,0xA6,0xAF,0xFA,0x20,0x57, + + 0x87,0x70,0x64,0x04,0xF9,0x03,0x67,0x19,0xC7,0x30,0x8F,0xF5,0xED,0x78,0x80,0xC0, + + 0xDF,0x46,0x9A,0x7D,0x7A,0x35,0xC6,0x06,0xFD,0xE9,0x03,0xE0,0x50,0xC7,0x2C,0x18, + + 0xA2,0x9A,0x4F,0x56,0xDC,0x85,0x12,0x03,0x73,0x07,0xB0,0x16,0xA4,0x27,0x01,0xD4, + + 0x7D,0x00,0xB8,0x13,0x67,0xEA,0x40,0x26,0x5C,0x4C,0xAE,0xA7,0x73,0x99,0xFD,0x33, + + 0x0E,0xF1,0xD8,0x26,0xA3,0xA0,0x19,0x31,0xC5,0x65,0x12,0xFC,0x07,0x64,0xAB,0x77, + + 0xAB,0x0E,0x34,0xFD,0x65,0xD7,0x39,0x5B,0x78,0x47,0x01,0x4A,0xE7,0xC3,0x72,0x7A, + + 0xF2,0x00,0x47,0xF4,0x1F,0x21,0xB7,0x47,0xEA,0xE9,0xC1,0xBF,0x26,0xF1,0x2A,0xAF, + + 0x29,0x88,0xB9,0xFE,0xD7,0x6A,0x2D,0x1C,0xCE,0x39,0x00,0x2C,0xA3,0x72,0x07,0x9B, + + 0x01,0x93,0x8B,0x03,0xF5,0xDF,0x0D,0x4A,0xA1,0x27,0x40,0xBB,0xDF,0x08,0x79,0xD6, + + 0x09,0x7C,0xC0,0x12,0xFB,0x83,0xD2,0x87,0xC7,0xEA,0x75,0xCD,0x92,0xFD,0x76,0x49, + + 0x60,0xF4,0xDB,0xB6,0xFE,0x6F,0x12,0x6D,0xDF,0x7C,0x84,0x9E,0x5F,0xC0,0x1A,0x99, + + 0x2F,0x0D,0xD2,0xBD,0xE2,0x8F,0xC2,0x07,0x00,0x7F,0x73,0x7E,0xE6,0x0A,0x42,0x5B, + + 0x87,0xA4,0x8B,0x1D,0x9D,0x2D,0xFE,0x55,0x03,0x5E,0x4C,0xF9,0x93,0x90,0x56,0xD7, + + 0xCB,0x74,0xE6,0x80,0x31,0x72,0x6A,0x88,0x81,0xEF,0x02,0x20,0x72,0x99,0x1A,0xA1, + + 0xCA,0x55,0xC4,0x8C,0xC4,0xB7,0xDC,0xF0,0x61,0x85,0x70,0x30,0x7B,0x32,0x3D,0x7E, + + 0xC3,0xEA,0x3A,0x42,0x72,0x3A,0xA2,0x89,0x14,0xB3,0x55,0x25,0xBE,0x8D,0x37,0x21, + + 0x29,0xBC,0x85,0x55,0xFD,0x28,0x8B,0xAE,0xD1,0xAE,0x95,0x39,0xF7,0x71,0x3F,0x44, + + 0x24,0x82,0xD5,0x76,0x72,0x1A,0x7F,0x8E,0xB3,0xE8,0xEC,0x1A,0x74,0xAE,0x59,0x23, + + 0x17,0xC1,0x5D,0xCE,0x0F,0x81,0xCB,0x37,0xDE,0xA3,0x08,0xCA,0x51,0x80,0x85,0x45, + + 0xD8,0xC2,0x55,0xDB,0x8A,0xC2,0xE8,0xBA,0x2A,0x47,0x90,0xFB,0xD4,0x82,0xD8,0x22, + + 0xD3,0x55,0xDE,0xDA,0xCB,0xBA,0xE4,0x6F,0xE2,0x67,0x89,0xBA,0x0E,0x0B,0xA2,0xF7, + + 0x8B,0xB8,0xCC,0xEA,0x7B,0x58,0x6D,0xDB,0x04,0xD9,0x3C,0x28,0x7A,0x9A,0x6E,0xD2, + + 0x8F,0x16,0x1E,0x18,0x3B,0x54,0xDE,0x00,0x67,0xD8,0x5E,0x38,0xC2,0x71,0x11,0x8B, + + 0x67,0x97,0xDF,0x88,0xC7,0x1A,0x17,0x56,0x09,0xC9,0x68,0x2F,0x72,0x62,0x2F,0xCD, + + 0x48,0xB4,0x4F,0x39,0xD1,0x31,0x0F,0x3D,0xD7,0x25,0x1A,0x55,0xBA,0x36,0x02,0xC4, + + 0xD1,0x80,0xB8,0xF1,0xD3,0x8D,0xFD,0x86,0xBF,0xA0,0x16,0x6D,0x69,0x70,0x54,0xF6, + + 0x0A,0x3F,0x62,0x43,0x3A,0x7D,0x0E,0xE9,0x5B,0x59,0x65,0xBE,0xDA,0x80,0xFC,0x93, + + 0x43,0xE7,0x85,0x32,0x53,0xCF,0xEA,0xB6,0x22,0x4F,0xEF,0x96,0x7B,0x73,0x71,0xA4, + + 0xCA,0x68,0xEB,0x91,0x73,0x6E,0xEF,0x8B,0x00,0x4E,0xF7,0x9F,0x0F,0x3C,0x18,0x52, + + 0x84,0x8F,0xB1,0x22,0xF5,0x0F,0x52,0xA2,0x45,0x77,0xBE,0x66,0x1A,0xA2,0x9C,0x69, + + 0xA6,0x0C,0x68,0x93,0xE3,0xA9,0x2E,0x75,0x8F,0xDB,0xEE,0xCD,0x53,0xA3,0x95,0xF3, + + 0xA0,0x8D,0xB7,0xF6,0xE9,0x5D,0x0B,0xD0,0xAC,0x6F,0xF1,0x71,0xD2,0xE0,0x57,0x22, + + 0x07,0x9F,0x2B,0x68,0xB4,0xC3,0x71,0x56,0xC3,0x50,0x6D,0xB3,0xF3,0x12,0x76,0x43, + + 0xFA,0x25,0x26,0xB9,0xFF,0xB5,0x67,0xA5,0xFB,0x62,0xC8,0x98,0xFA,0xE9,0x31,0x6A, + + 0xA2,0xEB,0x62,0xD2,0x15,0x65,0x70,0x67,0xD3,0xB4,0x47,0x34,0xF6,0x48,0xF1,0xC7, + + 0xEE,0x4A,0xF7,0x25,0x90,0x24,0x62,0x0D,0x0C,0xB7,0x0E,0x19,0x57,0xEB,0x0B,0x53, + + 0xA3,0xC5,0x16,0x24,0xA7,0x06,0xDC,0x4B,0x0F,0xD6,0x6E,0xF3,0xD5,0x62,0xD2,0x68, + + 0xF3,0x25,0x7D,0x0F,0x38,0xB3,0x70,0x1A,0x6C,0x67,0x0A,0xD5,0xD1,0x15,0xE9,0xEA, + + 0xA6,0x28,0xC8,0x1A,0x1C,0xFB,0x58,0xC9,0xC1,0xC4,0xF2,0x3B,0x36,0x48,0x35,0x4C, + + 0x52,0x80,0x35,0x69,0x63,0xC6,0x93,0x58,0x6F,0x49,0xD4,0x5D,0x1E,0xEA,0x3D,0xE8, + + 0x09,0x06,0xF2,0x23,0x38,0x74,0x45,0x0E,0x61,0xC6,0xBF,0x4C,0xB5,0xE0,0xA9,0xC3, + + 0xFB,0xE0,0xDA,0x7F,0xBF,0x2D,0xE1,0x19,0x7E,0x8E,0xCC,0x56,0x22,0x43,0xFA,0xB2, + + 0x77,0x16,0xB8,0x14,0x19,0xAF,0xFA,0x95,0xC2,0x7B,0x3A,0xFE,0x35,0x52,0xA7,0xB4, + + 0xBD,0x47,0x8D,0xBC,0x1A,0x23,0x33,0xB2,0xC8,0xEC,0x53,0x1C,0xE2,0x3D,0x6B,0xB7, + + 0xD2,0xB4,0x18,0x4E,0xAF,0x02,0xC2,0xE1,0xCC,0xFF,0x93,0x1D,0x20,0xE1,0x32,0xF1, + + 0x4C,0x91,0x65,0x02,0x36,0xDD,0xF4,0x1A,0x26,0x51,0xE4,0xC4,0x3C,0x5B,0xA8,0x6D, + + 0xC4,0x2E,0x78,0xC7,0x34,0x41,0x44,0x02,0xA7,0x93,0x82,0x87,0x56,0x92,0x1D,0x13, + + 0xA2,0x01,0xFB,0xBB,0xBC,0xF0,0xA5,0x50,0x60,0x7F,0x2A,0xFB,0x74,0xA1,0xED,0x32, + + 0xB3,0x3E,0x6D,0x17,0xD1,0xF1,0x6E,0xAB,0x34,0x0E,0x7D,0x37,0x98,0xB1,0x7C,0xCF, + + 0xCF,0x6D,0x44,0xD5,0x0E,0xD0,0xC3,0xCA,0x9B,0xB8,0x43,0x43,0x97,0x6B,0x52,0xAF, + + 0xC5,0xC2,0x3C,0xB4,0xC0,0xD0,0x26,0xCB,0x1B,0xCA,0xBC,0xF0,0xF4,0xF8,0x7F,0xEC, + + 0x87,0x36,0xDB,0xFA,0xB0,0xD4,0x17,0xF3,0xE5,0xB7,0x8A,0x0A,0xEC,0xB4,0xEA,0xA1, + + 0x4C,0x26,0xD5,0x28,0x42,0xBB,0xC7,0x0D,0x84,0x66,0x02,0x35,0x56,0x28,0xE8,0xEA, + + 0x32,0x33,0xE2,0x87,0x3A,0xFB,0x1D,0x55,0x17,0xF8,0xF6,0x3B,0x7A,0xDA,0x0E,0x0A, + + 0xC4,0x38,0x94,0x5E,0x31,0x12,0x85,0xE0,0xB4,0x24,0x2D,0xD8,0x16,0xF6,0xB1,0x8B, + + 0x47,0x8B,0x30,0xC8,0xBA,0x98,0xF7,0xEB,0xEC,0x46,0xE7,0x6F,0xCC,0xE1,0xEF,0x23, + + 0xA1,0x64,0xB9,0x9E,0x8E,0x6A,0x10,0xC4,0x5A,0x46,0x3F,0x8D,0x9D,0x73,0x18,0xF6, + + 0x1D,0x7D,0xDE,0xB1,0xBF,0xB1,0x60,0xC2,0xDD,0x11,0x9E,0x8C,0x85,0xF2,0x10,0x7A, + + 0x06,0xDF,0xDC,0xAD,0x0B,0x4C,0xF9,0x0A,0x17,0x2C,0xF8,0xE7,0x7E,0x3D,0xDF,0x5B, + + 0x45,0x6F,0xD9,0xF2,0xB8,0xBC,0x08,0x2C,0x38,0xD6,0xCF,0x15,0x71,0xBC,0x55,0x28, + + 0x9F,0x84,0x91,0xD9,0x56,0x8E,0x06,0xAD,0x16,0x13,0xC1,0xC3,0xDC,0xBF,0xEC,0x24, + + 0x06,0x82,0xC0,0xB5,0x9F,0xD6,0xAF,0xBB,0xB5,0xD6,0xB6,0x42,0x10,0xCB,0x3F,0xB1, + + 0x07,0x41,0x48,0x90,0xDC,0x63,0xB6,0xB4,0x43,0xA3,0x08,0xDC,0x99,0x2C,0x13,0xFF, + + 0x70,0x01,0xBA,0x9B,0x93,0x91,0x59,0x94,0xC6,0x00,0xE9,0x2D,0x30,0x9D,0xA4,0x63, + + 0x72,0xBC,0xC9,0xA4,0x1C,0xD5,0xB5,0xAA,0x34,0xD5,0x66,0xD8,0x2E,0xEE,0x55,0x33, + + 0x66,0xA7,0xB3,0xE1,0xDA,0x07,0xF7,0x57,0x29,0xE1,0x8A,0xE4,0xF1,0x62,0x4A,0xBB, + + 0xFC,0xDE,0xF2,0xA7,0xD9,0x8E,0xF0,0xFA,0xD7,0xD1,0xA7,0x96,0xD1,0x61,0x50,0xB2, + + 0xB2,0x5B,0x23,0x56,0xB4,0xC0,0xD1,0x90,0x22,0x06,0xDD,0x1E,0x73,0xEC,0x49,0x6B, + + 0xE7,0xB2,0xAB,0x51,0x6F,0x63,0xFC,0x6A,0xA8,0x33,0x86,0x17,0xFD,0x21,0x39,0x4A, + + 0xA9,0xB5,0xB9,0x92,0x19,0x0B,0x1A,0x05,0xCA,0x54,0xED,0xA8,0x26,0xA0,0x32,0x67, + + 0x88,0x04,0x4A,0x9C,0x57,0xA8,0xE5,0xBA,0xD8,0x24,0x22,0xC3,0x66,0x49,0x2B,0x6B, + + 0x7D,0x06,0xBE,0x89,0x9A,0x22,0x29,0x4B,0xA8,0x4B,0x34,0x1C,0xEB,0xCE,0x35,0xBC, + + 0x7D,0x48,0x9B,0xE2,0x78,0xF8,0x23,0x89,0xC9,0x94,0xC4,0x24,0xDF,0x98,0xD4,0xCC, + + 0x0E,0x70,0x71,0x4B,0xCE,0xFA,0x16,0xAE,0xD8,0x4F,0xD7,0xCC,0x42,0x8C,0x5D,0x65, + + 0xE0,0xBC,0x4A,0xAD,0xC9,0x6D,0xB8,0x6B,0x6D,0xAB,0xDE,0x7E,0x5F,0x21,0x79,0xB3, + + 0x71,0xA3,0x64,0xD2,0xF1,0x98,0xB0,0x92,0x02,0x6D,0x13,0xB9,0xD2,0x28,0x75,0x61, + + 0xFD,0xA0,0x68,0x6B,0x47,0xCA,0x61,0x8A,0x01,0xE4,0xDF,0x3B,0x83,0x69,0x97,0x32, + + 0x28,0x50,0x86,0x95,0x4C,0x34,0xD4,0x21,0x22,0x5D,0x4B,0x5A,0x54,0x20,0x10,0x54, + + 0xAC,0x50,0xB2,0xA9,0xD3,0x11,0x14,0xB5,0x1E,0x71,0x25,0x73,0xEF,0x79,0xE9,0xA5, + + 0xE8,0xE3,0x01,0x8C,0x38,0x0F,0xEA,0x25,0xA9,0x12,0xB5,0xDF,0xC7,0xC2,0x37,0x62, + + 0xDD,0x15,0x09,0x68,0xB1,0x72,0x8D,0x35,0xEB,0x47,0x1E,0x31,0xF2,0x86,0xD1,0xDA, + + 0x16,0xC1,0xFA,0x74,0x58,0x83,0x0A,0xEF,0x2C,0x1A,0x8E,0x1B,0xD1,0x36,0xF3,0x9F, + + 0xB6,0xC8,0x9A,0x6E,0xD8,0x56,0x66,0x03,0xA5,0xFA,0x1C,0x9C,0x62,0x71,0x54,0xFE, + + 0x9A,0x6A,0xBB,0x75,0x5B,0x55,0x34,0x41,0x34,0xE9,0xCC,0xAA,0x72,0xA6,0xE4,0xA3, + + 0x18,0x08,0x7A,0x61,0x47,0x94,0xBB,0x00,0x29,0x47,0xD8,0x1D,0xAB,0x3A,0x2F,0xFB, + + 0x89,0xC7,0x59,0x8D,0x1C,0x23,0xD6,0x28,0x02,0xE7,0x56,0x6C,0xC2,0x70,0xE4,0x58, + + 0x40,0x1F,0x22,0x74,0x06,0x74,0xDE,0x38,0x6A,0x1B,0x5F,0xBE,0x80,0xF4,0xB3,0xEB, + + 0xAE,0x18,0x27,0xEB,0x4F,0x85,0x49,0x4B,0xEC,0xA7,0x13,0x50,0x0F,0x3B,0x21,0x2D, + + 0x08,0xE4,0xE8,0x6D,0x39,0x94,0x5F,0x2C,0x64,0xED,0xE1,0x95,0x12,0x4A,0xF1,0xF1, + + 0xDE,0x8D,0xF1,0x7C,0xC9,0x32,0x28,0x7A,0x96,0x18,0xA4,0xE8,0x76,0x3E,0xA2,0x58, + + 0xD7,0x3D,0x11,0xDC,0x4C,0xBD,0xF9,0x67,0x80,0xEB,0x76,0xF0,0xFE,0x3D,0x87,0xD9, + + 0x95,0x5F,0xAF,0x4B,0x46,0x7F,0xE4,0xEE,0x3E,0x88,0xDD,0x94,0x7D,0x5C,0xE3,0x9B, + + 0x28,0xCB,0x0F,0x04,0xCA,0x39,0x01,0x63,0xEF,0x8B,0xCF,0xF9,0xEF,0x3D,0x79,0x06, + + 0x89,0xE3,0x5B,0x82,0x16,0x38,0x0D,0xA6,0x46,0xC8,0x3A,0x69,0xA9,0x9C,0x55,0xFD, + + 0x03,0xC3,0x44,0x89,0xE4,0x77,0xDF,0x48,0x93,0xCB,0x54,0xA4,0x59,0xE9,0x8A,0xA6, + + 0x51,0x9C,0x61,0x87,0xFE,0x1D,0xF1,0xA3,0xAE,0xAC,0x1D,0x48,0x1E,0x43,0x10,0xD1, + + 0x24,0x7C,0xE1,0x92,0x93,0xE1,0x3A,0xB7,0xC3,0x8D,0x3D,0xCA,0x22,0xA2,0x73,0x39, + + 0x6C,0xF5,0xBE,0x75,0x12,0x0F,0x12,0x66,0xBA,0x80,0xD0,0x1A,0xF7,0xE7,0xF9,0xA1, + + 0x33,0xD5,0x49,0x4C,0x8B,0x11,0xDF,0xED,0x2C,0x73,0x27,0x23,0x2C,0xD2,0x1F,0x6E, + + 0x77,0x25,0xD3,0x43,0x13,0xB0,0xC2,0x64,0x12,0x10,0x4F,0x43,0xA1,0xE2,0x49,0xE9, + + 0x7B,0x36,0xB7,0x58,0xD1,0xE9,0xF9,0x82,0x15,0x87,0x39,0xAB,0x96,0x1A,0x4A,0x68, + + 0xFB,0x86,0x4A,0x8A,0x1E,0x4A,0xF2,0xAA,0x26,0xA6,0x88,0xC0,0xE9,0x84,0x51,0x5D, + + 0x0B,0x29,0x79,0xE0,0x92,0x14,0x38,0x2B,0x31,0xCD,0x7A,0xFE,0xA1,0xAB,0x1B,0xF0, + + 0x0F,0x87,0xB1,0x2F,0x63,0x27,0xD4,0x51,0x1A,0xC2,0xD5,0x1E,0xDF,0x3A,0x2C,0xDB, + + 0xC1,0x26,0x4C,0x65,0x4B,0xA3,0xAA,0x32,0x45,0x12,0xF3,0x94,0xDC,0x8B,0xD1,0x72, + + 0xF6,0xFD,0x83,0xEE,0xC8,0x13,0xD1,0x5C,0x92,0x29,0xEA,0x6A,0xD9,0x5C,0xAA,0x4B, + + 0x25,0x79,0x94,0xEA,0xF6,0x0E,0x48,0x7E,0xCA,0xDB,0xFE,0x62,0x7F,0x5D,0x50,0x67, + + 0xBD,0xEE,0xDD,0xFB,0xF6,0x59,0x2D,0x58,0xCA,0x65,0xA3,0x66,0xD2,0xED,0x7C,0x45, + + 0xFF,0x3B,0xBD,0xE1,0x74,0x0C,0xDA,0x61,0x53,0x7B,0x7E,0xFD,0x5F,0xE7,0xE4,0xD3, + + 0x20,0x9A,0xDC,0x0E,0x91,0x39,0x8F,0x38,0x67,0xB0,0xCA,0x9F,0x9F,0x61,0x4C,0xC1, + + 0x43,0x9C,0x28,0x6B,0xCA,0xF0,0x41,0x36,0x6F,0x53,0x0D,0x87,0xC0,0x9F,0xA1,0x7E, + + 0xAC,0xD3,0x85,0x14,0x17,0xB8,0xEA,0xA2,0xC0,0x5F,0xCB,0x8A,0x1F,0xA3,0x2F,0x78, + + 0x96,0x72,0xBD,0xB7,0xA3,0x6E,0x05,0x23,0x1A,0xEE,0x58,0x77,0x8B,0xB1,0x30,0xDD, + + 0x00,0x20,0xEC,0x61,0x55,0x94,0xC6,0xFD,0x8A,0x7B,0x73,0x99,0x9F,0x84,0x12,0x44, + + 0xCC,0x73,0xB4,0xB3,0xB5,0x91,0xD4,0x78,0xF3,0x41,0x00,0x72,0x28,0x0B,0xC5,0xD9, + + 0x2A,0x1B,0x9D,0x2F,0xEE,0xFB,0x43,0x12,0x06,0x96,0x59,0x75,0xE2,0xFE,0x33,0x40, + + 0xB7,0x38,0xE5,0x27,0xFA,0xB8,0xD8,0xE8,0x8C,0xA3,0xAD,0xF7,0xFB,0xB5,0x9E,0x1A, + + 0xD3,0xA5,0x59,0xC9,0x0F,0xD1,0x9A,0x35,0x6F,0x52,0xFE,0x91,0xC9,0xBA,0x13,0x1E, + + 0x2F,0x49,0xCC,0x9E,0x3C,0xD9,0x7E,0x2F,0x92,0xE4,0x2C,0x99,0xDC,0x56,0x8B,0x14, + + 0xAF,0x63,0x1F,0x10,0xAE,0xF7,0xF7,0x2B,0x81,0x98,0xB1,0x50,0x5D,0x55,0xEF,0x1A, + + 0x5C,0xF5,0x70,0x61,0x99,0xA0,0xFF,0x3B,0xB6,0x99,0x29,0x8E,0xC5,0x54,0x04,0xD4, + + 0xF8,0x68,0x52,0x3E,0x77,0xB3,0xF2,0x2C,0xFC,0xDF,0x2B,0x48,0x78,0x87,0x0D,0xDE, + + 0xD3,0xD9,0x5A,0xCE,0x9C,0xD8,0xAC,0xE9,0x99,0x7E,0xDE,0x98,0x7F,0xFD,0x80,0x38, + + 0x74,0x35,0x53,0x3F,0xB1,0xB1,0x94,0x10,0x26,0x29,0xC0,0x6B,0xC1,0x89,0xDC,0xDC, + + 0x7B,0x5A,0xB5,0x1F,0x1C,0xDA,0x59,0x40,0x8D,0x7B,0xFF,0xFF,0xFF,0xFF,0xAD,0x7F, + + 0x9D,0x5C,0x88,0x10,0xED,0x29,0x03,0xD3,0x30,0xE2,0xB8,0x46,0xA9,0x6C,0x4A,0xE3, + + 0x31,0xAC,0x48,0x94,0xBC,0x63,0x66,0x0C,0xAA,0xB0,0x27,0x76,0xF0,0x1A,0xBA,0x4F, + + 0x69,0x0B,0x05,0x3A,0xF5,0x63,0x87,0x23,0x32,0xCF,0xA9,0x5B,0x51,0x6F,0xC2,0x81, + + 0x6A,0x32,0x9F,0x43,0xA2,0xB2,0x40,0xBB,0xC7,0xE3,0xDC,0xB1,0xD3,0x88,0x02,0x26, + + 0xFD,0x68,0xCA,0x51,0xB1,0x22,0x2E,0xC0,0xB7,0x4D,0xB0,0x20,0x69,0x6B,0x5F,0xA1, + + 0x77,0xF5,0xB0,0xD6,0x31,0x47,0x98,0x45,0xEC,0x48,0xA0,0xF6,0x56,0xBE,0x7F,0xE0, + + 0x5C,0xA9,0x91,0xD4,0xF1,0x06,0xD5,0x90,0xE0,0xB9,0xB1,0x21,0xAD,0xEB,0x10,0x57, + + 0x66,0x85,0x93,0x40,0x30,0x21,0xA6,0x02,0xE1,0x29,0xDB,0x97,0x51,0x2F,0x3C,0x68, + + 0x63,0x07,0x3A,0xEC,0x43,0x2E,0xA8,0x28,0x48,0x48,0xFA,0x4E,0xA7,0x66,0x34,0xFA, + + 0x3F,0x96,0x3E,0x7E,0xA6,0x6B,0x24,0x0D,0xC4,0xEF,0xE5,0xFE,0xF8,0xF6,0x83,0x3B, + + 0xB4,0xB5,0xAD,0x4C,0x39,0xF5,0x13,0x5B,0x23,0xAB,0xAB,0xD3,0x5B,0x67,0x35,0x30, + + 0x41,0x02,0x4B,0x77,0x9F,0xA9,0x0A,0xF9,0xDE,0x50,0x37,0xB9,0x91,0xDB,0x5C,0x61, + + 0x29,0xAC,0x92,0x54,0x79,0x4C,0xB5,0x28,0x0E,0x0E,0xF2,0x0E,0x19,0x92,0xD9,0x1F, + + 0x38,0x09,0xF2,0x0C,0x13,0x22,0x22,0x0B,0x33,0x44,0xE2,0xAC,0xE4,0x62,0x1A,0xBC, + + 0x6F,0xA1,0xBB,0xCF,0x9F,0xD4,0xC5,0x8E,0x23,0x4D,0xAB,0xEF,0xB4,0x0D,0xF1,0xC6, + + 0x74,0x14,0xAB,0xFD,0x27,0x22,0x1A,0x3E,0x01,0x2C,0xE3,0x2D,0xD3,0x60,0x22,0xA9, + + 0x4C,0xBD,0x68,0x00,0x78,0x80,0xEF,0xD3,0x58,0x2F,0xC4,0xD3,0x7C,0xDB,0x1B,0xA0, + + 0x25,0xAE,0x4C,0x51,0x85,0x3B,0x47,0x8B,0x67,0x92,0xED,0x30,0x7F,0x1A,0x93,0xE1, + + 0xA1,0xBF,0x8D,0xA9,0xCF,0x12,0xCC,0xA1,0x9B,0x4F,0x0F,0x0A,0x72,0x6E,0x37,0x20, + + 0xD1,0x8C,0x19,0x11,0xB3,0xDA,0x54,0x73,0x40,0x2C,0xC4,0x99,0x54,0x85,0xF0,0xA2, + + 0x9D,0x48,0x3F,0x26,0x93,0xBE,0x6A,0x44,0xED,0xA2,0xDC,0xAC,0x32,0x7B,0xF4,0x2F, + + 0xCA,0xA4,0x06,0xA6,0x90,0x33,0xAA,0x83,0x45,0x5A,0x12,0x9E,0xD2,0x8A,0xFE,0x8F, + + 0x91,0x84,0xBA,0x27,0x30,0x7E,0x5D,0xF5,0xE4,0xB7,0x15,0x38,0xF1,0x36,0xE1,0x4E, + + 0xA2,0x67,0x45,0x19,0x10,0x31,0x6C,0xDC,0x06,0xA8,0x6E,0xC1,0xBB,0xB6,0x58,0x25, + + 0x28,0xBC,0x46,0x0C,0x76,0x7A,0x7E,0xCA,0xDF,0x56,0xD7,0xCA,0xAE,0x70,0xBF,0xB4, + + 0xD5,0xA8,0xB0,0xF9,0x19,0x34,0x67,0xD7,0x15,0xA6,0xA6,0x42,0xD5,0x74,0x16,0x31, + + 0x14,0x6B,0xC3,0x2D,0xBB,0xAA,0x2F,0x42,0x6B,0x57,0x57,0x2F,0x35,0x87,0xBC,0xA1, + + 0xAF,0x51,0x0F,0xBC,0x0C,0x90,0xA6,0x05,0x1E,0x66,0x60,0x7A,0xCA,0x78,0x56,0xD5, + + 0x3A,0x07,0x4E,0x39,0x59,0x4D,0x68,0x4C,0xE5,0xAA,0x8C,0xAC,0x0E,0xD3,0x74,0x74, + + 0x9C,0xE8,0xF6,0x0C,0xF6,0xB5,0xCE,0xCE,0x4D,0xA8,0xA0,0xFB,0x5F,0xD2,0x80,0xAF, + + 0x96,0x61,0xBF,0x4F,0x9B,0xCF,0x5F,0xEC,0x95,0xA1,0x77,0x9F,0x98,0x5A,0x1B,0xC8, + + 0x81,0x5D,0xCE,0x3F,0x1A,0xB5,0xC8,0xDD,0x69,0x57,0x7F,0x8E,0x58,0xFC,0x58,0x30, + + 0xCC,0x8F,0xB2,0x82,0x1E,0xD9,0x51,0xA6,0x47,0x83,0xF8,0x6E,0xB5,0x1F,0x95,0x4D, + + 0xD0,0xDC,0x90,0x68,0x94,0xAC,0x10,0x50,0xF0,0xCD,0xB4,0xB2,0x57,0xB9,0xF4,0xF0, + + 0xF6,0x7E,0x89,0x65,0x6D,0xAE,0x08,0x61,0x65,0xFF,0x71,0xE2,0x60,0xE8,0x82,0xFE, + + 0x87,0xD8,0x16,0x55,0x34,0xD8,0x01,0x5C,0x44,0xCE,0x79,0xB7,0x9B,0xA1,0x27,0x24, + + 0xF1,0xE8,0xEA,0x06,0xB5,0xA2,0x38,0xE7,0xBA,0x75,0xC8,0x36,0x52,0xEB,0xBC,0xA3, + + 0x21,0x7A,0xE9,0xB4,0xBB,0x2E,0x06,0xD2,0xCA,0x63,0x7C,0xF4,0x39,0x64,0xDE,0xDD, + + 0xC4,0x29,0xB1,0x56,0x37,0x2E,0xB1,0xAF,0xC7,0x1B,0x2E,0x89,0xD0,0x3C,0x37,0x6E, + + 0x78,0x0A,0x6E,0xB5,0x15,0xA4,0xA9,0xB3,0x83,0x63,0xC3,0x95,0x7B,0x6C,0x97,0x8E, + + 0x0B,0xB6,0xA0,0x8A,0x1E,0x43,0x0C,0x17,0x24,0xC5,0xF2,0xF8,0x5F,0xB8,0xBF,0x9A, + + 0x66,0x18,0x92,0xE0,0x9E,0xA4,0xC1,0x45,0x2D,0xCB,0xBD,0xCF,0x38,0xBC,0x7D,0x27, + + 0x30,0x21,0xCB,0x6D,0x63,0xA4,0xCC,0x58,0xB8,0xA9,0x8D,0x5F,0xFE,0x47,0x9E,0xEA, + + 0xF5,0x89,0xD4,0xDD,0x3C,0x34,0xC4,0x45,0xAF,0xBE,0x9B,0x37,0x34,0x62,0x1C,0x72, + + 0xE7,0x1D,0x67,0x2C,0x5D,0xA3,0x22,0xCE,0x86,0x7D,0x0D,0x8C,0xF2,0x67,0xEA,0x1B, + + 0xB1,0xCF,0xB0,0xC7,0xBC,0xAB,0x6D,0x3B,0x69,0x8F,0x05,0x9C,0xDD,0xEE,0xCF,0xD8, + + 0xFA,0x86,0x9B,0xCD,0xBC,0x8C,0xE4,0x7A,0xBE,0x6E,0x75,0x8D,0x72,0x65,0xFD,0x55, + + 0x2E,0x50,0x63,0x9A,0x3E,0x25,0xED,0xCC,0x6E,0x30,0x6B,0x0D,0x7C,0xE9,0x49,0xF1, + + 0x14,0x3B,0x3E,0xA9,0x1C,0xED,0x63,0x59,0xD5,0x43,0x0C,0x39,0x66,0xBD,0x54,0xA3, + + 0x19,0x3E,0x2C,0xB7,0x80,0x1A,0x3A,0x99,0x8C,0xE0,0x26,0x49,0xBD,0x38,0x5D,0x87, + + 0x44,0x47,0x9B,0xF7,0x94,0x7F,0x4E,0x4B,0x76,0x90,0x56,0xE7,0xF8,0x59,0xB8,0xED, + + 0xCF,0xC2,0x37,0x39,0x9D,0xEE,0x2B,0x8E,0x0E,0x22,0x22,0x88,0x90,0xB2,0x2F,0x20, + + 0xFA,0x97,0x9D,0x24,0xB4,0x57,0xB0,0x80,0x25,0x6B,0x96,0x15,0xFA,0x29,0x13,0x2C, + + 0x21,0xF5,0x94,0x54,0x32,0xBC,0x04,0x70,0x45,0xA0,0x6C,0x06,0x4D,0x24,0x5F,0x28, + + 0x15,0x09,0x31,0xA5,0xF5,0x48,0x0D,0x81,0xA5,0xA9,0x8D,0xC0,0x0B,0xF9,0x15,0x3B, + + 0xEB,0xD5,0xD7,0x35,0x1B,0xB8,0x45,0xA3,0xA7,0xD8,0x83,0xF1,0x16,0x74,0x58,0xA6, + + 0xC5,0x91,0xFF,0xA3,0x99,0xB3,0x0C,0x1B,0x18,0x77,0x11,0x87,0xA4,0xA9,0x9D,0x78, + + 0x45,0x28,0x96,0x60,0x91,0xB4,0xD9,0x9E,0x06,0x10,0x29,0x3A,0x11,0x0F,0x79,0x69, + + 0xA8,0x1F,0xF9,0x0D,0x75,0x92,0xA4,0xBA,0x80,0xDE,0x12,0x82,0x9F,0x73,0x51,0xA2, + + 0x58,0x38,0x52,0x1B,0xB7,0xA1,0xC0,0x3F,0xE3,0x0C,0x87,0x4C,0xD7,0xE0,0x60,0x56, + + 0xBB,0x41,0x86,0x8A,0x69,0x3C,0x4E,0x3A,0xD1,0xD3,0x5C,0x1D,0xF2,0xF1,0xAE,0xEF, + + 0xBB,0xC0,0x6E,0x3C,0xBD,0xF5,0xF9,0x18,0xED,0xDE,0xAC,0x5A,0x8C,0x40,0xCE,0x84, + + 0x53,0xE2,0x9F,0xE8,0x1F,0x36,0x17,0x4B,0xEC,0x55,0xE5,0xEF,0x05,0x73,0x17,0xFC, + + 0x12,0x90,0x36,0x2F,0xB7,0xB0,0xCE,0x99,0xAC,0xD0,0xE5,0xFA,0x14,0xBB,0x23,0x07, + + 0x24,0xA1,0x15,0x80,0x12,0xEC,0x02,0x47,0xAB,0x04,0x1A,0xA0,0x52,0xC3,0xA8,0x62, + + 0x63,0x1D,0x48,0x91,0x96,0x29,0x0E,0x52,0x21,0x2C,0xFD,0xB0,0x57,0xDF,0x39,0x31, + + 0x0D,0xAD,0x41,0x85,0xDE,0xDD,0x2B,0x91,0x51,0x03,0xEE,0x5A,0xD6,0x40,0x77,0x16, + + 0x20,0xDC,0x8F,0x91,0x9F,0x63,0x67,0x37,0x20,0xC0,0x1E,0x8A,0xC1,0xDE,0xE0,0x33, + + 0x6A,0xD7,0x92,0x46,0xA5,0x66,0xDB,0x02,0x4C,0x02,0xEE,0xC5,0xA6,0x67,0xFC,0x32, + + 0xFC,0xA1,0x82,0x41,0x32,0xC5,0x64,0x21,0xC1,0x41,0x1C,0x2A,0x5D,0x7B,0x3F,0x46, + + 0x23,0xD9,0x41,0xE3,0x79,0xD7,0xC1,0x41,0xE6,0x06,0x88,0x61,0x07,0x0A,0xDB,0x57, + + 0x4B,0xA6,0xF7,0x68,0x70,0x2E,0x38,0x13,0xF0,0x03,0xA4,0x86,0xFD,0xB3,0xB6,0x6A, + + 0x2C,0xD7,0xA2,0x0C,0x9A,0x34,0x3F,0x0C,0xD5,0xB5,0x02,0x32,0x30,0x9C,0x1C,0x2A, + + 0x2D,0xBF,0x35,0xFE,0x1F,0x6B,0x20,0xD3,0xFA,0x08,0xA4,0x11,0xD4,0xCF,0x5D,0xEB, + + 0xC8,0xA7,0xEE,0x73,0x3B,0x4F,0xBE,0x67,0x3D,0x16,0x01,0x5F,0x33,0x1B,0x30,0x69, + + 0x09,0x14,0x5F,0xF5,0xE5,0x69,0x42,0xBD,0x6C,0xB4,0x50,0x7D,0xDD,0x47,0xE6,0x2A, + + 0xF9,0x69,0x42,0x8A,0x3A,0xA7,0xAA,0xEA,0xCA,0x6B,0x02,0xE8,0x59,0xD1,0x71,0xE4, + + 0xE0,0xEC,0xF4,0x2F,0x67,0x22,0xA5,0x84,0x4B,0x40,0x49,0x5B,0xFA,0xC2,0x7B,0x74, + + 0x61,0x1F,0xA6,0x70,0x9C,0x24,0x6B,0x09,0x84,0x03,0x13,0xAD,0x51,0xC1,0x12,0xDF, + + 0x6E,0xF0,0x4C,0xE2,0xDB,0xC1,0x24,0x81,0xCB,0x0D,0x4C,0x3A,0x11,0x4C,0xBF,0xE2, + + 0x61,0x50,0x30,0xE6,0x4C,0xCF,0x2C,0x22,0xF1,0x3E,0xAE,0x37,0x1C,0xDF,0x34,0xF2, + + 0xDE,0x17,0x4C,0x11,0xFB,0x37,0x35,0x67,0x94,0x5E,0xFA,0x98,0x98,0x40,0x7D,0xA5, + + 0x22,0xFE,0xBE,0x07,0x21,0x4C,0xD5,0x24,0x2A,0x54,0x03,0x62,0x19,0x63,0x24,0x32, + + 0x00,0x7D,0xA4,0x46,0x10,0xCC,0xA9,0xCE,0x42,0xFE,0x87,0xB7,0x42,0xDE,0x3D,0xB3, + + 0x4E,0x9D,0x7F,0x74,0x8C,0x9B,0x2C,0x00,0x22,0xA9,0x2F,0x8B,0x99,0x30,0x15,0x11, + + 0x86,0x95,0xE1,0xBB,0x1D,0x73,0x7C,0x7E,0xC2,0xD9,0x78,0x8B,0x1B,0x31,0x65,0x4B, + + 0xA1,0xB6,0x19,0xE1,0x2B,0x8B,0x5F,0x81,0x45,0x50,0x01,0x76,0x53,0xD9,0xB5,0xA2, + + 0x9F,0x55,0x59,0x8E,0x4E,0x8B,0x17,0xEC,0xA3,0x51,0x22,0x8B,0x99,0x13,0xE1,0xAC, + + 0xA7,0x1E,0x32,0xEE,0xBA,0x24,0x89,0xD8,0x3D,0x53,0x00,0xDC,0xF8,0x6E,0x6E,0xD2, + + 0x87,0x14,0x31,0x7E,0xBB,0x25,0xDE,0x3D,0xEE,0x51,0x8B,0xAF,0x49,0x28,0x2E,0x3B, + + 0x09,0xEC,0xE8,0xD2,0x1B,0x5F,0x04,0x2D,0xEE,0x39,0x9F,0xB9,0x30,0x9B,0xEC,0xBD, + + 0x2B,0x1F,0x62,0xFF,0x46,0x5E,0x19,0x3D,0xE7,0x1B,0xC6,0xA2,0x1C,0x84,0x0D,0x71, + + 0xC3,0x2D,0xF9,0xA5,0x19,0x7C,0xFC,0x7B,0xC9,0x5A,0x16,0x2C,0xF1,0xA3,0x36,0xAB, + + 0x0A,0xB6,0x79,0xA7,0x3D,0x9D,0xD9,0xE8,0xE9,0x91,0x49,0x82,0xB1,0xAC,0x3F,0xEE, + + 0x43,0x4F,0xFB,0xB2,0xBC,0x34,0x77,0x67,0x4B,0xD4,0x63,0x8F,0x77,0xD8,0x37,0xDD, + + 0x4B,0xCA,0x30,0xBF,0x50,0xEE,0xBD,0x1B,0x69,0x5B,0x97,0x7C,0x7B,0xDF,0x7A,0x00, + + 0x96,0xC1,0xE2,0xC6,0x17,0x00,0x0E,0x42,0x98,0xCF,0x2B,0x55,0x75,0x5F,0x3A,0x13, + + 0xFE,0x0C,0xA8,0x94,0x84,0x0F,0xC0,0xC1,0x78,0xC7,0xE6,0x9A,0x39,0x4A,0xE5,0x86, + + 0xC7,0x71,0x61,0x82,0x90,0xA6,0x03,0x07,0xF7,0x23,0xEA,0x27,0xEB,0xD3,0xFD,0xE9, + + 0xA1,0x85,0x12,0xF5,0x39,0x5E,0x10,0x90,0x66,0x82,0x6C,0x33,0x29,0x22,0x1F,0x85, + + 0xEF,0x95,0xF0,0x66,0x56,0x29,0xF0,0x2D,0xC4,0xC0,0xCE,0x5A,0x9C,0xE7,0x76,0x67, + + 0x95,0x8D,0x23,0x69,0x40,0x7E,0xF8,0xA9,0x74,0x81,0x7A,0x0D,0xDA,0x63,0x06,0xB3, + + 0x06,0x99,0xB8,0x40,0x31,0x04,0xBD,0x01,0x3D,0x84,0xB9,0x37,0xF4,0x87,0x6B,0xBB, + + 0xC8,0x83,0xE9,0x6C,0xB6,0x3C,0xC6,0x95,0x45,0xC3,0x79,0xB7,0xCF,0xE6,0x8C,0x45, + + 0xAD,0x77,0xDA,0xE6,0x68,0xE5,0xF2,0xAA,0x59,0x8A,0x01,0x1F,0x5A,0x50,0xBA,0xF8, + + 0xA1,0x02,0xEA,0x8B,0xE2,0xAF,0x13,0x48,0xEC,0x38,0x04,0x1A,0xD0,0x64,0x43,0x41, + + 0x6A,0x87,0x63,0x8A,0x84,0xE8,0x73,0xBE,0x33,0xCC,0x12,0x5C,0xB0,0xE9,0xAC,0xF9, + + 0x0F,0xA3,0x4B,0x47,0x3C,0x34,0xC4,0xB9,0x5C,0xA6,0xDD,0x17,0x36,0xFA,0x27,0x0D, + + 0xEF,0x7A,0xE2,0xCA,0x1A,0xD0,0x94,0x08,0x0D,0x3C,0x66,0x52,0xA7,0x82,0x91,0x1D, + + 0xE6,0x9C,0x51,0xFB,0xE8,0x50,0x5A,0xE0,0xEE,0xDD,0x3A,0xBE,0xE4,0xE5,0x9C,0x39, + + 0x4C,0x8E,0x5C,0x7E,0x3F,0x51,0x2A,0x6C,0x69,0xC8,0x91,0x62,0xDD,0xFF,0x8C,0x25, + + 0xEE,0x8B,0xF9,0xDF,0x74,0x24,0x83,0x1D,0x30,0x45,0x2B,0xFB,0xDC,0x52,0x3B,0xE0, + + 0xE5,0x1A,0x9C,0x04,0xA5,0x4E,0x14,0xA2,0xE6,0xCC,0x18,0xD5,0x40,0x06,0x54,0xB6, + + 0x16,0xB5,0xD4,0x14,0xA4,0x8F,0x83,0x50,0x63,0xD3,0xA9,0x3C,0x76,0xD8,0xA2,0x01, + + 0x86,0xE0,0x0A,0x65,0x18,0x4F,0x5B,0xDD,0x47,0xB7,0xEF,0xA5,0x47,0x5B,0x95,0x6C, + + 0x04,0x62,0x95,0x68,0x19,0xBE,0x97,0x37,0xE7,0x31,0x83,0xD7,0x95,0x0C,0x1C,0xF3, + + 0x42,0x3B,0x50,0xA4,0xDD,0x45,0x91,0x80,0xA7,0x5E,0x34,0x26,0xCD,0xFC,0x12,0xE3, + + 0x6F,0xE4,0x47,0x91,0x39,0x69,0x9A,0x10,0xE5,0xD1,0xDC,0xE7,0xCA,0x44,0xF7,0xBD, + + 0xCC,0x37,0x56,0xFB,0x85,0xD6,0xF2,0xF3,0x64,0x1A,0x74,0x88,0x8E,0x49,0x59,0x59, + + 0x83,0x4C,0x29,0x1D,0x0C,0x18,0x98,0x91,0xA4,0x27,0x82,0x94,0xF4,0x0B,0x5E,0xAE, + + 0x8D,0x47,0xC6,0xC4,0x95,0x44,0xC9,0xA2,0x6A,0x5A,0x49,0xDC,0x1E,0x07,0x67,0xAB, + + 0x8C,0x38,0xF0,0xEB,0x7D,0x34,0xFA,0xBE,0xED,0xD9,0x41,0xC0,0x53,0x26,0x93,0xE9, + + 0x53,0x37,0xDF,0xA8,0x41,0xB5,0x7F,0x6B,0xA4,0x98,0x4C,0xD0,0x94,0xF7,0x17,0xBF, + + 0xC5,0x96,0x50,0xE0,0xBB,0x39,0x5F,0xF1,0x76,0xDF,0x81,0x8B,0x81,0x54,0xCD,0x37, + + 0xE6,0xE7,0xB2,0xD0,0x1C,0xD0,0x74,0x68,0xAB,0xCA,0xC9,0xB1,0x5A,0xE7,0xA1,0x50, + + 0xAA,0xBC,0x90,0x7F,0xD6,0x6C,0x25,0xFA,0x50,0xFD,0x33,0x43,0xDE,0x22,0x66,0xB9, + + 0x55,0xDC,0xD9,0xF2,0x74,0x9D,0x0F,0x99,0x11,0x23,0x93,0x7B,0x1B,0xBC,0xC7,0xFB, + + 0x2D,0x9B,0x89,0x7F,0x54,0xBC,0x6D,0x7C,0x54,0x42,0x4B,0x9D,0x00,0xBE,0xA3,0x29, + + 0xDC,0x51,0x27,0xA0,0xC4,0x03,0x42,0xDF,0xAB,0xB1,0x03,0xD7,0xD4,0xED,0xC0,0x76, + + 0xEA,0x62,0xB2,0xE7,0x3F,0x8C,0x0B,0x43,0x3D,0xE7,0x27,0xD6,0x19,0x02,0x3E,0x61, + + 0xD4,0x19,0xA6,0xA5,0x40,0xD3,0xBD,0x52,0xE2,0xE4,0xC3,0x6A,0x3B,0x06,0x08,0x77, + + 0x6A,0x80,0x5D,0x52,0x5B,0x73,0x8C,0xF1,0x85,0xE7,0xB9,0x6A,0x30,0xCC,0x3E,0x31, + + 0x80,0x18,0x3F,0x2A,0x14,0x26,0x70,0x86,0x71,0xA5,0xC8,0x94,0x2D,0x6B,0x70,0xD2, + + 0x92,0x23,0x71,0xD0,0x19,0xB3,0x3A,0x30,0x42,0x25,0xB8,0x30,0x5C,0x68,0xFD,0x23, + + 0x7D,0x63,0x31,0xB4,0x31,0xA6,0xE9,0x92,0xD1,0x28,0x65,0x95,0x2D,0x69,0xE6,0xB3, + + 0x2F,0xFA,0x09,0xD5,0xDD,0xD8,0x07,0xB9,0xC2,0xCA,0xD3,0x74,0x70,0x61,0x62,0x0A, + + 0x17,0x0C,0xCA,0xBD,0xF1,0x6B,0x87,0x15,0x80,0xD9,0x46,0xC4,0x5E,0x25,0x74,0xBD, + + 0x19,0x44,0x88,0xF3,0x7A,0x0E,0x7C,0x00,0xA2,0x4A,0x7D,0xFC,0x0D,0x2B,0x00,0xE1, + + 0xD5,0x47,0xC9,0x0C,0x67,0xD7,0x43,0x6E,0x21,0x49,0x6C,0x5E,0xF6,0x06,0x75,0xA9, + + 0x0B,0x0F,0x9D,0xB8,0x9F,0x31,0x25,0x04,0x03,0x3A,0xD2,0x3D,0xDF,0x71,0x3A,0xCA, + + 0x93,0x61,0x7B,0xC8,0x18,0x24,0xAB,0x06,0xC7,0xEA,0xDE,0x6B,0xFB,0xE4,0x2A,0x12, + + 0x85,0xF1,0xB2,0x4C,0xAE,0xA8,0xCD,0x90,0x27,0x00,0x1E,0x1E,0x1A,0x2D,0x7B,0xB6, + + 0x26,0x03,0x03,0xCD,0x6C,0x85,0x1A,0x29,0xCE,0x67,0x93,0x8F,0x58,0x66,0x33,0x7E, + + 0x76,0x00,0xD9,0x79,0x9D,0x0D,0x24,0xEB,0xCA,0x47,0xA3,0x1F,0x9A,0xEF,0xC0,0x05, + + 0x63,0x30,0xD4,0x9E,0x4C,0x90,0x3C,0xC2,0x9D,0x5C,0x9C,0xBC,0x8D,0x79,0x19,0xAD, + + 0xE9,0x40,0xF2,0x24,0xDA,0x92,0xCC,0x34,0x13,0x17,0xFC,0xFE,0x9B,0x7E,0x1A,0xE1, + + 0xB4,0xB6,0x51,0x87,0x71,0xBF,0x2D,0x9F,0xCA,0xA7,0x90,0xD7,0x1B,0xDB,0x5D,0x79, + + 0x8A,0x17,0x56,0xDA,0xCE,0x18,0x75,0xD3,0x1E,0x5D,0x62,0x91,0xF7,0xE0,0x17,0xCA, + + 0x24,0x87,0xA8,0x64,0x66,0x16,0x6A,0xC8,0xED,0xA2,0x9C,0x2C,0xF7,0x56,0x8C,0x94, + + 0x0E,0x1D,0xBE,0xD1,0x3F,0x5B,0xAC,0x92,0x9C,0x28,0x58,0x70,0x2C,0x37,0x46,0x43, + + 0x3B,0x7B,0xA5,0x9A,0x11,0x3B,0x1D,0xFD,0x60,0x4A,0x45,0x96,0xEA,0x7D,0x4B,0xA3, + + 0x48,0xBE,0xED,0xD4,0x3E,0x3F,0xF1,0x6E,0xE0,0xD7,0x1D,0x2C,0x0A,0x3B,0x07,0x9B, + + 0x10,0xE9,0x5B,0xB4,0x43,0xC7,0x2E,0x56,0x6E,0xD8,0x1C,0xEC,0x7C,0x50,0x91,0xFE, + + 0xC2,0x3A,0x8D,0x2C,0xD8,0x96,0xDF,0x5E,0x4B,0xC9,0x1E,0xBE,0x15,0x7F,0x21,0xA5, + + 0x8A,0x01,0x47,0x50,0x2A,0x39,0xCA,0x8D,0x09,0x41,0x98,0xDE,0x91,0x71,0x0E,0xFF, + + 0x42,0x58,0x5B,0x75,0xBF,0x76,0x1C,0x3B,0x2C,0x68,0xB6,0xDA,0x58,0xA4,0xB9,0xEC, + + 0x62,0xBD,0x46,0xAD,0xB1,0x70,0xF7,0xC1,0xEA,0xDE,0x52,0xC8,0x9B,0xD3,0xDE,0x27, + + 0x8A,0x82,0xD6,0xB1,0x19,0x0D,0x1C,0x07,0xD6,0x31,0xCB,0x0F,0x4F,0x02,0x67,0x92, + + 0xD5,0x3E,0x44,0x25,0x32,0xF3,0x37,0xA3,0x4C,0x53,0x41,0x1E,0xCA,0xD1,0xFB,0xBB, + + 0x50,0x5D,0x0B,0x7D,0xBB,0x3D,0xB8,0x39,0xF3,0x1D,0x70,0x92,0x26,0x3D,0x6B,0x60, + + 0xF7,0x0C,0x36,0x69,0xB7,0x0D,0x4E,0x1F,0xC9,0x6D,0x33,0xD5,0xD8,0x1D,0x38,0x20, + + 0xCD,0x8E,0xDC,0x92,0x06,0x40,0xE8,0x41,0x6F,0x67,0x81,0x12,0x66,0x7A,0x6B,0x1E, + + 0xEF,0x8D,0x75,0x36,0x80,0x23,0xE1,0xB0,0xB4,0x6D,0xC9,0x36,0xFA,0xE6,0xBC,0xE0, + + 0xF5,0x1E,0x14,0xF5,0x69,0xE0,0xAC,0xC0,0xEF,0x16,0x01,0xD7,0xD1,0x1C,0x5A,0xB1, + + 0x6E,0x9F,0x07,0xC2,0x14,0x46,0xB0,0x0C,0xB9,0x1F,0x88,0x04,0x17,0xE5,0x7E,0x15, + + 0xD9,0x8F,0xA7,0xD2,0x15,0x72,0xF8,0x3D,0xBF,0xDF,0x80,0xF4,0x52,0xC1,0xF7,0x25, + + 0x79,0x2B,0x1E,0x29,0x90,0xA4,0x71,0x9B,0xC6,0x84,0x89,0x05,0x97,0xEE,0x7C,0x20, + + 0xEF,0xC5,0x68,0x16,0x1D,0xBC,0xB9,0x77,0x1C,0x33,0xC1,0x27,0xDF,0xE8,0x68,0x17, + + 0x67,0x87,0x11,0xAF,0xE4,0xAB,0xA5,0x15,0x6E,0x8A,0x22,0xAC,0xCD,0x4F,0x3D,0xE9, + + 0x79,0x8F,0x6A,0x0F,0x4B,0x5D,0x8D,0x8A,0xBE,0x76,0xF7,0xDE,0x49,0xAB,0x33,0x39, + + 0x44,0x85,0x90,0x32,0xAF,0x8A,0x60,0xAD,0x38,0xA9,0x8B,0xCF,0x88,0x47,0x0B,0x42, + + 0x2C,0xE9,0x7B,0x01,0xB7,0x1F,0xFB,0x3E,0x6E,0x16,0xE8,0x02,0x52,0x1D,0x31,0xB6, + + 0x08,0x1F,0x74,0x3D,0x0D,0xE3,0x63,0x68,0x4A,0x98,0x92,0x2A,0xDE,0xE1,0xAA,0x1E, + + 0x22,0x87,0xF6,0x9D,0x2C,0x7F,0x42,0x1A,0x37,0x8F,0x39,0x5E,0x05,0x2D,0x60,0xC9, + + 0x1F,0xE3,0x73,0x6F,0x92,0xEE,0x62,0xE9,0x5F,0x7A,0xF9,0x6D,0x7D,0xA0,0x2B,0x28, + + 0xE7,0xCD,0x53,0x3F,0x9B,0x86,0xBF,0xA5,0x6E,0x30,0xC1,0x84,0x20,0xAD,0x88,0xF1, + + 0x02,0x36,0x5B,0xF5,0x1A,0xDC,0x0C,0xE5,0xA6,0x72,0x00,0xC4,0xF6,0xEC,0x78,0x01, + + 0x5D,0x3E,0xE5,0x96,0xB8,0x37,0xC4,0x12,0x67,0xAB,0x7C,0x0E,0x72,0xF9,0xB6,0x70, + + 0x82,0x3F,0x42,0x47,0xB1,0xF0,0x3D,0xA6,0x87,0xF2,0xD1,0x23,0xF1,0xC8,0x79,0xD4, + + 0x4C,0x90,0xEB,0x57,0xFD,0xF1,0xFD,0x6F,0x1F,0x2E,0x7D,0x35,0x6C,0x9E,0xAF,0x4B, + + 0x02,0x6B,0x0C,0xCA,0x05,0xD6,0xB0,0x3C,0x8F,0xE5,0x7A,0x59,0x8B,0x9A,0x13,0x56, + + 0x70,0xA7,0x94,0x3E,0x7D,0xF8,0x42,0xDA,0x61,0xD7,0xC6,0x05,0x1F,0x5A,0x5D,0x39, + + 0x0A,0x9B,0x5D,0x45,0x94,0x86,0x0D,0xED,0xDE,0xA6,0x97,0xE2,0xF7,0x16,0xC1,0xAD, + + 0x65,0xF7,0x8D,0x77,0xEB,0xB8,0x75,0x77,0xE5,0x35,0x6F,0xF5,0xB8,0xB5,0x40,0x2E, + + 0xC5,0x69,0xEF,0x92,0xBC,0xFA,0x20,0xC8,0x04,0xD5,0x8E,0x50,0xD0,0xF5,0x10,0x3E, + + 0x4D,0x66,0xE6,0x1E,0xC9,0x1A,0x04,0x0A,0x7E,0x76,0x36,0x77,0x7B,0x6A,0x41,0x2A, + + 0xAD,0x0A,0x18,0xC8,0x7E,0xCB,0x25,0xCB,0x07,0x9E,0xD7,0xE5,0x72,0xB8,0x51,0x3B, + + 0x44,0xB8,0xA9,0x2E,0xDE,0x5F,0x9B,0x3F,0xA5,0xC2,0x77,0x7F,0xD5,0x76,0xF6,0xB8, + + 0x91,0xC3,0x0E,0xCA,0xBB,0xDC,0x89,0x1B,0xCD,0x5C,0xBE,0xD1,0xC3,0xBE,0x10,0xDD, + + 0xCE,0x92,0x6A,0x3C,0xBD,0xF5,0xBE,0x7A,0xDD,0x70,0xE8,0xD9,0xDE,0x52,0xDE,0x4F, + + 0xA4,0xA8,0x87,0x8B,0xF9,0x35,0xCE,0xD9,0x8E,0xDF,0xF1,0x10,0x5F,0x51,0xDB,0x39, + + 0xBB,0xC8,0x26,0x3D,0x3D,0xF7,0x6E,0x7F,0xED,0x0F,0x6D,0xB8,0x35,0xAE,0x3E,0x29, + + 0x61,0x04,0x2D,0x20,0x7B,0x2F,0x81,0xA4,0x5D,0xBE,0xF6,0x22,0xB9,0x04,0x28,0x9A, + + 0x02,0xC1,0xC0,0x90,0x13,0x82,0x8A,0xC3,0x2D,0xEE,0x82,0x36,0xC3,0x69,0x78,0x72, + + 0xE8,0x8B,0x01,0x7A,0x96,0x20,0x2B,0xD2,0xA8,0xED,0x8B,0x27,0x63,0xBF,0x2F,0x20, + + 0xB9,0xA7,0xF6,0x6A,0x97,0x21,0x08,0xCC,0xA9,0xF8,0x19,0xF2,0xF5,0x0F,0xC0,0x3B, + + 0xE2,0x85,0xF5,0xC0,0x5F,0xB5,0x09,0x1C,0xE7,0xE2,0xEB,0x7F,0xF1,0x26,0x88,0xD0, + + 0xF5,0x48,0x95,0x15,0x15,0xC4,0x78,0x83,0xE0,0x57,0x30,0x4A,0x79,0x90,0x48,0xC5, + + 0x80,0xFA,0x1C,0x44,0xA5,0x5A,0x03,0x12,0xEC,0xCF,0x55,0x0D,0x8E,0x62,0x4B,0xB7, + + 0xA7,0xB8,0x77,0xD1,0x9F,0xFC,0xE1,0x01,0x43,0xE1,0x09,0x4E,0xF2,0xFC,0x90,0x24, + + 0xE1,0xA9,0x8A,0x88,0x12,0x68,0x84,0xAC,0x15,0x3A,0x02,0x5F,0x1F,0xE1,0x74,0x29, + + 0xE2,0xC8,0x33,0x86,0xF2,0x4A,0x8B,0x4B,0x21,0xEF,0x09,0x5A,0xA6,0x05,0x53,0x7E, + + 0xC0,0x87,0x2F,0x96,0x73,0xA9,0xBF,0x5A,0xAC,0xEC,0x13,0xCD,0xB7,0x71,0xE7,0x6A, + + 0xED,0x8D,0xD5,0xFF,0x9D,0xD6,0x0E,0xF9,0xC6,0x27,0xF9,0x7D,0xD8,0xEB,0x7A,0xB6, + + 0xA6,0x01,0xBD,0x8B,0xE7,0x9A,0x2A,0x4C,0xA3,0x45,0xD2,0x7F,0x38,0x3F,0xA6,0x27, + + 0xC9,0x0D,0xCF,0xD8,0x77,0xC0,0xF6,0xE7,0x6F,0xE0,0x0E,0xF8,0x02,0x39,0xBC,0xCD, + + 0xDD,0x3C,0x78,0xDE,0x39,0x26,0x11,0x96,0x23,0xED,0x8D,0xC0,0xD2,0x1B,0xF0,0xCB, + + 0x8F,0x4E,0x70,0x42,0x38,0x6D,0x8A,0x49,0xC3,0xE0,0xFB,0xFC,0xE4,0x67,0x22,0xB1, + + 0x4C,0xB4,0xC0,0x80,0xBD,0x86,0x1C,0x5B,0x1F,0x4C,0x8C,0x3C,0x76,0x12,0xBB,0xFF, + + 0x27,0xB1,0xF2,0x21,0xCC,0x73,0x7D,0x32,0xFC,0x87,0xFC,0xFE,0xBF,0x33,0x97,0xA9, + + 0xA6,0x18,0xFB,0x2D,0x05,0xA4,0xCE,0x22,0xE6,0xA8,0x90,0x21,0xF2,0xD1,0xF2,0xE2, + + 0xC9,0x1C,0xCD,0x4C,0xB7,0x31,0x25,0xA1,0x42,0x58,0x17,0xA8,0xF2,0xA3,0x5E,0xC2, + + 0x91,0xB9,0x90,0xCB,0x14,0x32,0x44,0x13,0xE6,0xD9,0x2F,0x14,0xE8,0xA5,0xDC,0x20, + + 0xD0,0xB4,0x82,0x27,0x0D,0x91,0xB1,0xC0,0x62,0xFA,0xA3,0x94,0x0B,0x19,0x91,0xB1, + + 0x22,0x00,0x68,0x0A,0x13,0x3D,0x07,0xCA,0xE4,0xB7,0x15,0x25,0x1B,0x7B,0x9C,0x22, + + 0x27,0x9C,0xD5,0x6D,0x0F,0x34,0xFD,0x83,0x81,0x62,0xBF,0xE5,0xF0,0xF7,0xB2,0xFB, + + 0x4C,0x17,0xD0,0x77,0xC5,0x7A,0x94,0x2A,0xF5,0xEE,0x56,0x2C,0xBD,0x3A,0x56,0x9E, + + 0x1A,0x42,0x48,0xDB,0xE3,0xC6,0xB3,0x23,0xC8,0xDE,0x7B,0x38,0x3C,0x89,0x82,0xE6, + + 0xC9,0xCA,0x47,0xC7,0xBE,0x38,0x2F,0xB9,0x4B,0x5C,0xD7,0x1C,0x7A,0x66,0x31,0xAC, + + 0x0E,0x0B,0x34,0x07,0x24,0xC6,0x1B,0xA0,0x45,0x56,0x97,0x1D,0x7B,0x67,0xB1,0x79, + + 0x10,0xB3,0x77,0xF1,0x41,0x2A,0x96,0xBD,0x1A,0xF1,0x8D,0xEC,0xFA,0xFC,0xE2,0xAB, + + 0x1D,0xEB,0xA3,0xAE,0xC4,0xC0,0x66,0x02,0xC7,0x50,0xE5,0x79,0x75,0x1F,0xE3,0xED, + + 0x84,0xC1,0x9C,0xC2,0xBC,0x74,0xDE,0x6D,0x86,0x8A,0xE8,0xDD,0x09,0xE1,0x31,0x75, + + 0x42,0x2C,0x63,0x4E,0x9A,0x35,0xF3,0x66,0x1A,0x89,0x95,0x60,0x00,0x7C,0xDF,0x71, + + 0x6C,0x09,0x60,0x86,0x64,0x1F,0x0A,0xB1,0x74,0x3F,0xEA,0x67,0xF3,0xA1,0xAA,0xE3, + + 0x6D,0x71,0x68,0x97,0x11,0xCD,0x94,0x4D,0x8F,0x90,0x98,0xCF,0xAA,0x1A,0x01,0x91, + + 0x58,0x8A,0x1E,0x83,0x96,0x18,0x0B,0xB0,0xA8,0x1D,0x0E,0xC7,0x92,0x99,0x77,0x27, + + 0x7A,0xED,0xCE,0xE4,0xF3,0xFE,0x82,0xA0,0xFD,0xC9,0xB2,0xCB,0x53,0xA1,0x5E,0xEE, + + 0x6E,0x89,0x64,0xF0,0x5E,0xFC,0x23,0x10,0x62,0x11,0xCA,0x9D,0xAA,0xA7,0x93,0xA2, + + 0x05,0x74,0x6F,0x16,0xD7,0xE4,0x78,0x76,0x43,0xB9,0x99,0xF4,0xCA,0x9B,0x9E,0x30, + + 0xBC,0xE5,0xDF,0x0B,0x1B,0x20,0xA7,0x5C,0xF4,0x5D,0x42,0xC6,0xD0,0x1C,0x17,0x55, + + 0xE4,0xF0,0x97,0x50,0x36,0x38,0x43,0x80,0xD2,0x63,0xC1,0xE7,0x74,0x4A,0x1C,0x3E, + + 0xC6,0x99,0xC1,0xFD,0x76,0x55,0x3E,0x0A,0x00,0xC6,0x7D,0xA4,0x63,0xEC,0x53,0x69, + + 0x65,0x00,0xEA,0xAF,0xE6,0x54,0xD6,0xA8,0x50,0xC1,0x61,0xBD,0x5B,0x13,0x1D,0x3E, + + 0xED,0x8E,0x63,0x8F,0x9D,0xE8,0x53,0x64,0xEF,0xC7,0xEC,0xD0,0xA3,0xF2,0x0B,0x91, + + 0x8C,0x4B,0x6B,0x9B,0x12,0xE9,0x38,0x49,0x6E,0xB0,0xDA,0xD7,0xA9,0xA6,0xB1,0xB9, + + 0x82,0x81,0x56,0x2C,0xE5,0xEE,0xFB,0x27,0x6C,0x0C,0xEA,0x81,0x69,0xEC,0x52,0xA9, + + 0x6D,0xE3,0xFD,0x41,0x6B,0x39,0xF7,0x89,0x52,0x60,0x25,0xF4,0x28,0x99,0xF3,0xB8, + + 0xA0,0xEB,0xAF,0x9B,0xBA,0x7A,0xF1,0x9B,0xCF,0x6F,0xC4,0x53,0x2E,0x5F,0x0D,0x62, + + 0x66,0x1E,0x7C,0x44,0xBD,0xFB,0xF6,0x4A,0x6E,0x4E,0x7B,0xAB,0x61,0x62,0x1A,0xAA, + + 0x83,0x8B,0x09,0x68,0xC4,0x13,0x46,0x57,0x74,0xD6,0x52,0xC4,0x83,0x95,0x2D,0xE1, + + 0x11,0xDE,0x1B,0x3E,0x33,0xF1,0x44,0xB0,0x35,0x2A,0x04,0x4D,0x1E,0xFE,0x7C,0xF0, + + 0x9C,0xDD,0x92,0x33,0x40,0x51,0x1C,0xB9,0x87,0xF2,0x8D,0x58,0xC7,0x23,0xBD,0x7B, + + 0x23,0x5E,0x00,0x89,0x39,0x47,0x3D,0x4F,0xE3,0x93,0x3D,0x85,0x95,0x6B,0x87,0x31, + + 0x1C,0xD5,0xF5,0xD5,0x14,0xF0,0x3C,0xEE,0x8F,0x8C,0xE4,0x62,0x36,0x6B,0xD3,0xE3, + + 0x11,0x3A,0x94,0xD2,0xCA,0xF7,0x04,0xD5,0x9A,0xDA,0x43,0xB1,0xAD,0xFD,0xD2,0xA3, + + 0xD1,0x96,0xC3,0xFA,0x3A,0x1D,0xB5,0xD6,0x32,0x0B,0xCA,0x87,0xFE,0x44,0xBC,0xAD, + + 0xCD,0xA4,0xEB,0x28,0x16,0x28,0x43,0xBE,0x8F,0xDA,0x78,0x88,0x78,0x61,0x78,0xA3, + + 0x2C,0x37,0x06,0xD4,0x89,0x24,0xEC,0xEE,0x8D,0xDE,0x76,0x2B,0x20,0xBA,0x16,0xFA, + + 0x69,0x94,0x7A,0xA1,0x5F,0xFB,0x5E,0xF5,0xB7,0xD6,0x5B,0xDC,0x8A,0x9C,0xB6,0x09, + + 0x2C,0x5D,0x88,0xE0,0x65,0x6F,0x1E,0xB1,0x4F,0x57,0xF7,0x11,0x7E,0xE6,0x71,0xB2, + + 0xAD,0x34,0x2F,0xD0,0x32,0x46,0x8B,0x59,0xEB,0xC2,0x87,0x40,0x96,0xF4,0x18,0x63, + + 0x0A,0x31,0x52,0xAC,0xC5,0x18,0x64,0x8A,0x85,0x98,0xBE,0xFA,0xFE,0xEC,0x3D,0xA9, + + 0x15,0x1E,0x4A,0x2F,0x9C,0xFD,0xE8,0x35,0x0F,0xD9,0x7D,0x40,0x3F,0x51,0xB6,0xFB, + + 0x51,0x31,0x37,0xC9,0x76,0x9D,0x4D,0x5B,0x56,0x9C,0x48,0x96,0xDF,0x7E,0x90,0x28, + + 0x91,0xDE,0x50,0x5B,0xF7,0x40,0x01,0xFD,0x0E,0x5C,0x50,0x81,0x22,0xBE,0x59,0x06, + + 0xA5,0x7F,0xD2,0x2A,0xFB,0x44,0x92,0x52,0x73,0x34,0x50,0xFC,0x05,0x6A,0xB0,0x3D, + + 0x13,0x4C,0x8C,0x9E,0x35,0xAC,0xC3,0x1E,0x3E,0x07,0x0A,0xD2,0x75,0x95,0xD8,0x01, + + 0xB3,0x39,0xDB,0x04,0x33,0xD2,0xE9,0x29,0x67,0x03,0x97,0xCD,0xAB,0xCF,0xD8,0x56, + + 0xE0,0x07,0xF7,0x38,0x7A,0xB2,0x27,0xED,0x7E,0x18,0x15,0x2E,0x90,0xCE,0x5A,0xDF, + + 0x69,0x0B,0xE0,0xE1,0xEC,0xFB,0x0A,0x61,0xE1,0x05,0xB0,0x66,0x2B,0x69,0xB7,0x74, + + 0xDF,0x14,0xDB,0xA8,0x57,0xA8,0x10,0xCD,0xCE,0x07,0x34,0xE6,0x5F,0x6D,0xC0,0x53, + + 0xEA,0xCE,0xC3,0xB9,0xDA,0x22,0x91,0xA1,0xC2,0x04,0xFB,0xB5,0x8E,0x99,0x73,0xA2, + + 0xB7,0x01,0xB6,0xA5,0x09,0x96,0x5F,0x68,0xC0,0xE6,0x59,0x88,0xDF,0x97,0x60,0x0A, + + 0x0B,0x68,0xFC,0x3D,0xF1,0x89,0x12,0x5A,0xB3,0x0A,0x98,0xA8,0x56,0x22,0x0A,0xE1, + + 0x49,0xF5,0xC1,0x6F,0x69,0x88,0xA5,0x7F,0x83,0x93,0xA4,0x79,0x5F,0x6B,0xAB,0x28, + + 0xAC,0x91,0x2F,0x9E,0xCF,0x20,0x5E,0x17,0x29,0xB5,0x53,0xAD,0x96,0x95,0xB6,0x46, + + 0x5C,0x56,0xB3,0xE2,0x70,0x5A,0x53,0x41,0x34,0x09,0x93,0xB9,0xDB,0xC8,0x4A,0x00, + + 0xEB,0x03,0x02,0x8C,0xF3,0x21,0x32,0x3E,0x67,0x41,0x55,0xEE,0x78,0x1E,0x4B,0xA3, + + 0x78,0x01,0x75,0xC6,0xA4,0xB0,0x63,0x3A,0xEA,0x0F,0x58,0xFE,0xC6,0x94,0x83,0x84, + + 0xA6,0x75,0xB8,0x2D,0x8C,0x42,0x2A,0x4E,0x66,0x2B,0x6C,0x8F,0xE9,0x95,0xB4,0xA5, + + 0x59,0x4D,0x27,0xC2,0x9A,0x4F,0x13,0x79,0x48,0x42,0xE3,0x83,0x38,0x66,0x66,0x82, + + 0x23,0x52,0x11,0xC3,0x03,0x29,0xB0,0x50,0x68,0x5F,0x8E,0xD7,0x39,0xF6,0x55,0x8A, + + 0x84,0xE0,0x1A,0x10,0x62,0xA9,0x64,0xB4,0x81,0xD0,0x58,0x92,0x8C,0x6A,0x5C,0x82, + + 0x05,0xED,0x3D,0x16,0x80,0x9F,0xAA,0xC1,0xFE,0xF9,0x95,0xE5,0xB6,0x30,0xF5,0xF7, + + 0x2E,0x95,0xC5,0x8D,0x58,0xD2,0x9E,0x35,0xB2,0x3B,0x1D,0xEB,0x7C,0x11,0x64,0x3E, + + 0xA0,0x1E,0x9E,0xC5,0x95,0x75,0x3C,0x82,0xD1,0x38,0x8D,0x19,0x97,0x80,0x2C,0x90, + + 0xCD,0x98,0x33,0x24,0x3B,0x29,0xB0,0x74,0x2B,0xE5,0x1C,0xC1,0xCB,0x78,0x27,0xB2, + + 0x92,0x19,0x7E,0xA5,0x96,0xB4,0xEA,0x65,0xE1,0xA4,0xAD,0xF7,0x1B,0x79,0x35,0x53, + + 0xA2,0x60,0x72,0x9F,0xA3,0x33,0x15,0x69,0xD0,0x12,0xA6,0xD2,0x52,0xC8,0xC5,0xC8, + + 0x4A,0x54,0x7E,0x84,0xD1,0x29,0xD6,0x70,0x27,0x50,0x3D,0x29,0xEB,0x47,0xA5,0xC7, + + 0x94,0xE5,0x98,0x7A,0xB6,0x22,0x60,0xBE,0x88,0xDA,0x25,0x0D,0x30,0xD6,0x13,0xAD, + + 0x7D,0x47,0x7F,0x65,0xC3,0x97,0x10,0x59,0x62,0xAB,0x81,0xF9,0x13,0xB2,0x54,0x99, + + 0xD2,0x5B,0x91,0xFB,0x73,0x6A,0xAE,0x4A,0x65,0xD0,0x91,0x83,0xB0,0x8E,0x3E,0x4A, + + 0x2B,0x7E,0x46,0x8B,0x14,0x22,0x96,0x28,0x4C,0x5A,0x62,0x8E,0x8D,0x19,0x76,0x08, + + 0xD5,0x12,0x97,0xD2,0x9E,0x36,0xEA,0x9A,0x90,0x38,0xD4,0x78,0x33,0xCB,0x7F,0x19, + + 0x75,0x11,0xBC,0x25,0x3A,0x71,0xFD,0x8C,0x4B,0xC1,0xEF,0x12,0x78,0x3D,0x2F,0x98, + + 0x27,0x12,0x8F,0x35,0x3B,0x72,0x67,0x07,0x47,0x52,0x5F,0x20,0xF2,0x64,0x8B,0x86, + + 0x08,0xC3,0x74,0xF8,0xE9,0x21,0x7B,0x9B,0xE5,0x5F,0x70,0xA2,0x7D,0xA2,0xCF,0x6C, + + 0x64,0x85,0x5D,0xE8,0xED,0xA8,0xD8,0x44,0xFA,0xAF,0x34,0xB2,0x57,0x5B,0xCD,0xEB, + + 0xBB,0xCF,0xE1,0xF8,0x61,0x21,0x85,0x41,0x3F,0xD9,0xF1,0x96,0x2F,0x4F,0x57,0xF1, + + 0x97,0xCE,0xF2,0x17,0xAA,0x42,0x06,0xBC,0xA6,0xC7,0x79,0xB6,0xD1,0x8F,0x64,0x23, + + 0x7D,0x94,0xDB,0xD9,0xA9,0xBF,0x09,0x25,0xBB,0xB2,0x35,0x8E,0x48,0xA9,0xB3,0x10, + + 0x01,0x7D,0x04,0xCC,0x14,0x05,0x31,0x9E,0x43,0x87,0x80,0x64,0xA8,0x48,0x3A,0x43, + + 0xF9,0x86,0x45,0x21,0x65,0xDB,0x8E,0x1D,0x50,0xBD,0x8E,0x14,0xF7,0x52,0x30,0x2C, + + 0xD2,0x8E,0xD6,0x47,0x60,0xA3,0x31,0x46,0x4A,0x85,0xE1,0x6C,0x74,0x63,0x38,0x08, + + 0xC6,0x87,0xFC,0xBA,0x24,0xEA,0x4B,0x50,0x2D,0xCC,0xD5,0xD5,0xE9,0x7E,0x92,0x27, + + 0x1F,0xC4,0xBC,0x26,0xF6,0x38,0xDA,0x07,0xA6,0x8D,0x19,0x6F,0x81,0x21,0x6B,0x17, + + 0xBF,0xB1,0x69,0xF6,0x75,0xA3,0x52,0x6B,0xCF,0x41,0xC8,0xAB,0xD7,0x20,0xF8,0x5C, + + 0xEC,0x8F,0x91,0xAE,0xA1,0x04,0x01,0x8B,0x79,0x64,0x17,0x4C,0x98,0x6D,0x26,0x5B, + + 0x3A,0x21,0xE0,0x57,0xE4,0x2C,0x74,0x73,0x4D,0xEC,0xCC,0x8C,0x7F,0xCC,0x62,0x89, + + 0x8D,0xA5,0xE8,0x1E,0x07,0xC5,0x43,0x38,0xEE,0xD6,0xD8,0x96,0x20,0x22,0xF2,0x0C, + + 0x4C,0xEE,0x8A,0x31,0x11,0x28,0xE3,0xEF,0xCD,0x3D,0x74,0x11,0x02,0xE1,0xD5,0xAB, + + 0x7C,0x80,0xA6,0x5B,0xAC,0xAB,0xCB,0xFF,0xCC,0x8F,0xA2,0xF2,0x7A,0x10,0xE4,0x87, + + 0x02,0x8B,0x9A,0xAF,0x32,0x2A,0x30,0x40,0x8D,0x0A,0x3E,0x5E,0x74,0x4B,0x94,0x69, + + 0xA8,0x8A,0xB9,0x70,0x25,0x1C,0xDF,0x72,0x37,0x7A,0x1F,0xE7,0xA9,0x39,0x7C,0xE5, + + 0x57,0x82,0xAE,0xC7,0xA0,0x1F,0x77,0x5D,0x19,0xBE,0x34,0x23,0xF0,0x4C,0xF0,0xF5, + + 0x7F,0x2C,0x3C,0x71,0x7D,0x12,0x45,0xB7,0x18,0x56,0xE7,0xBA,0x9D,0x9B,0x2E,0x35, + + 0x85,0x19,0xBD,0xC8,0x91,0x39,0xD8,0x66,0x65,0x26,0x50,0x90,0x8D,0x0F,0xEB,0x50, + + 0x24,0x13,0x7C,0xA4,0x04,0xE1,0x74,0xEF,0x8E,0x1F,0x3C,0x23,0x11,0xEE,0x9A,0x32, + + 0x6A,0xB6,0x85,0x8D,0x1C,0xB9,0x99,0x67,0xAE,0x66,0xF1,0x63,0xF5,0xEC,0x55,0x61, + + 0x58,0x38,0x15,0xF3,0xB1,0x56,0x91,0x61,0xEF,0xDD,0xBC,0x91,0x9C,0xF8,0x67,0xEC, + + 0xFE,0x07,0x34,0x9F,0x54,0xBC,0x24,0x2E,0x6A,0x42,0x76,0x2F,0xB1,0x07,0x34,0x98, + + 0x9E,0x04,0x51,0xD9,0x0E,0xA0,0x36,0xA3,0x0E,0xBF,0x7E,0x3A,0x32,0xBB,0x8B,0xF0, + + 0x72,0x47,0xC0,0x67,0x3A,0x77,0xBB,0x2F,0xBF,0x30,0xED,0x6F,0x94,0x72,0x35,0x99, + + 0x3F,0x91,0x17,0x00,0xDE,0xBF,0xA8,0x48,0x69,0x56,0x71,0x0C,0x70,0x70,0xA6,0x1B, + + 0x2F,0x9A,0x07,0xAC,0xBC,0xBF,0xF4,0x02,0x29,0x91,0x21,0xDC,0x81,0x29,0x16,0x58, + + 0x2C,0x1B,0x2E,0xEB,0xED,0xB0,0xEE,0xBD,0x4B,0x2A,0x9E,0xBE,0x91,0x76,0x2F,0x58, + + 0x47,0xAF,0xE2,0x2D,0x8D,0xC5,0x05,0xEA,0xEA,0xB0,0x8F,0x6B,0xA5,0x1A,0x17,0x59, + + 0xAE,0x87,0x8F,0x7F,0xE3,0xB0,0x80,0xEB,0x0E,0x00,0xFB,0x1D,0xCC,0xAD,0xB8,0x52, + + 0x2E,0x63,0xE2,0x1D,0x13,0x60,0x28,0xDF,0x4E,0x22,0xAE,0x84,0x92,0x60,0xF5,0x2B, + + 0x20,0xFA,0x64,0x86,0x11,0x2B,0x90,0xFD,0xE2,0xBC,0x34,0x10,0xDE,0x63,0x4B,0x43, + + 0xC1,0x01,0x87,0xA5,0x79,0x21,0xD5,0xF1,0xCC,0x44,0xD9,0x21,0x5F,0x23,0x0D,0x95, + + 0xDE,0x44,0x8E,0x66,0xBB,0xA5,0x53,0x24,0x43,0x40,0x2E,0x34,0x5C,0x6F,0xFF,0xA2, + + 0x69,0x15,0x52,0xB7,0x7E,0x8B,0xD0,0xA7,0x66,0xDF,0x32,0x7B,0x9C,0xCF,0xB7,0x23, + + 0x33,0x69,0x5E,0xD0,0x4E,0x57,0x60,0x9E,0xEF,0x48,0x58,0x06,0xB8,0xB3,0x45,0xA9, + + 0xEE,0x4B,0xD0,0xB8,0xFA,0x9D,0x51,0xE3,0x0B,0x6E,0xB7,0x61,0xB9,0xE0,0xAE,0x91, + + 0xC6,0xAA,0xD9,0x40,0x6A,0xAA,0xA4,0x8E,0x16,0x1A,0xA7,0xEA,0xB8,0xD1,0x38,0xFB, + + 0x51,0x7D,0x02,0x4C,0x00,0x85,0x51,0xCA,0xCA,0x00,0xFA,0x32,0x32,0x9C,0xCA,0xC5, + + 0xFF,0x4B,0x82,0x18,0x96,0x68,0x7A,0x3A,0x38,0x44,0xCB,0x4F,0x67,0xC2,0x1B,0xF2, + + 0xF7,0x2A,0x53,0xCA,0x5A,0x6A,0x5F,0xD9,0xC4,0x45,0x41,0x37,0xB6,0xDE,0x58,0xC5, + + 0xBA,0x69,0x8D,0x20,0x19,0x4E,0xE4,0x6B,0xC7,0x29,0xE3,0x39,0x39,0xCA,0x53,0xCC, + + 0x08,0x04,0xA2,0x03,0x39,0x23,0xF9,0xEC,0x4E,0xF2,0xD3,0x9F,0x88,0xC3,0x74,0x70, + + 0x0D,0x0F,0x10,0x18,0x3F,0xD9,0x62,0xE7,0xC9,0x81,0xEC,0x70,0xB0,0xE8,0x83,0xC9, + + 0xC4,0xF1,0x3C,0xB1,0x9C,0x6C,0xFF,0xEB,0x0F,0x5D,0x61,0x9E,0x36,0xC5,0x04,0xDD, + + 0x89,0xAC,0x5E,0x46,0xEB,0x6D,0x8D,0x1B,0x1D,0x47,0x73,0xF7,0x22,0xB3,0xB0,0x70, + + 0x00,0x1F,0xF6,0x85,0x14,0x2B,0x4A,0x9D,0x68,0x4B,0xA2,0xAC,0x9B,0xF5,0x08,0x72, + + 0xA6,0x61,0x4D,0x9C,0x94,0x5F,0xE3,0xC3,0x1D,0x3D,0xCD,0x27,0x4F,0xDE,0x65,0x21, + + 0xAC,0x99,0x10,0xE3,0x52,0x12,0x83,0xC7,0x80,0xED,0x3D,0x2F,0x7D,0xDF,0xE5,0xAE, + + 0x85,0x51,0xEF,0x91,0xB2,0x51,0xFA,0x71,0xEA,0xD8,0xBA,0xC6,0x9F,0xF5,0x3C,0xB3, + + 0x12,0x56,0xCC,0xAF,0x4D,0x14,0x0C,0xE8,0x51,0xA4,0x29,0xE6,0x32,0x21,0x49,0x52, + + 0xEA,0x12,0x4A,0x50,0xFB,0x44,0xA4,0xD4,0x9E,0xDC,0x61,0xAB,0xA6,0x28,0x05,0x18, + + 0xA4,0x94,0x05,0x04,0x5E,0x37,0xEA,0x07,0xD1,0xE6,0x26,0xCA,0x0C,0x8A,0xE2,0x33, + + 0x0F,0xEA,0x19,0xC6,0xC3,0xB4,0xDD,0x11,0xFE,0x1B,0x76,0x37,0x70,0x31,0x55,0x54, + + 0x1B,0x68,0xB8,0x2D,0xFA,0x3C,0x93,0x99,0x14,0x1A,0x96,0x5F,0xA8,0xD3,0xF1,0x1C, + + 0x7A,0x17,0xC6,0x95,0xB4,0xC4,0xDA,0xCC,0x92,0x1B,0xCE,0x22,0x82,0x65,0xBF,0x77, + + 0xB8,0x57,0xB9,0x2D,0x7A,0x3A,0x53,0xFE,0x17,0x18,0x32,0xA8,0x7F,0x6C,0x56,0x1C, + + 0x0C,0xE4,0xED,0x4C,0x4C,0xBD,0xD0,0xB7,0xEF,0x39,0x22,0xF7,0x1D,0xFC,0x3E,0xD9, + + 0x1A,0x18,0x1B,0x86,0x41,0x25,0xD0,0x00,0x36,0xA1,0x61,0xC8,0x57,0x15,0xED,0xBA, + + 0x68,0xED,0x55,0x1A,0x77,0x7C,0x64,0x0B,0x77,0x5B,0x00,0x09,0x14,0x96,0x37,0xED, + + 0x28,0x1A,0x18,0x85,0xBC,0xC6,0xAF,0x01,0xB2,0x11,0x4B,0x9C,0x93,0xD7,0x5D,0xCD, + + 0x54,0xE2,0xE9,0xF0,0x95,0x9B,0xF2,0x36,0x88,0x1F,0xC0,0x84,0x82,0xC6,0x98,0x80, + + 0x26,0xB0,0x0C,0x22,0xC8,0x51,0xF4,0xF2,0x4C,0xC6,0x62,0xD9,0xBD,0xEF,0xD3,0x1A, + + 0xA0,0x7E,0xE8,0xA7,0x13,0xE3,0x12,0xB7,0x06,0xA1,0x1F,0xA1,0xB4,0x4E,0x59,0xEB, + + 0x98,0xCF,0x61,0x87,0x81,0xE0,0xB9,0xFB,0x67,0x3F,0xE7,0x96,0x3F,0x24,0xE9,0xCB, + + 0x06,0xCF,0xFA,0xE8,0x93,0x79,0x8D,0xD1,0x47,0xC7,0xDF,0xC6,0x17,0xA3,0x1F,0xC6, + + 0x7E,0xD9,0x28,0x03,0xF7,0x0B,0x32,0x10,0xFD,0xDB,0xCB,0x38,0x65,0x24,0x16,0x54, + + 0xE6,0x06,0x28,0x4B,0xEA,0xA3,0x83,0xF6,0x45,0x61,0x53,0xBC,0xEC,0x4A,0x3B,0x4F, + + 0xEE,0x97,0x64,0xC3,0xC9,0x8E,0xC6,0x4B,0x35,0x79,0x5D,0xC2,0x03,0x85,0x40,0xA0, + + 0x0B,0x7A,0x46,0xB5,0x36,0x20,0xB9,0xF7,0x79,0xAB,0xDE,0x69,0x07,0x4C,0x93,0x88, + + 0x2E,0x38,0xE7,0x10,0x3E,0x5C,0x6F,0x48,0x0F,0x28,0x94,0x9F,0x8A,0x4C,0xE5,0xE2, + + 0x8F,0x8A,0x6A,0x9F,0x05,0xEB,0xAA,0x48,0xA6,0xCA,0xE4,0xA4,0x59,0x46,0x79,0x0A, + + 0x2F,0xC8,0xF7,0x8B,0x9E,0x6B,0x53,0x6F,0xE9,0xC5,0x61,0xB0,0x37,0x5C,0x6A,0xEB, + + 0x35,0x84,0x60,0x96,0x74,0x5A,0x45,0x9A,0x26,0x88,0x09,0xCC,0x31,0x40,0x1A,0x39, + + 0x3E,0xCE,0x66,0x4B,0x91,0xA8,0xB2,0x7B,0x16,0xC6,0x57,0x6A,0xD9,0xFA,0x6F,0xD8, + + 0xC6,0x58,0x2A,0x83,0xC0,0x00,0xEA,0x92,0x13,0x80,0x8C,0x2F,0xBD,0xE6,0x23,0x0B, + + 0x88,0x0C,0xE7,0x08,0x9F,0xFE,0xF3,0xAC,0xEA,0xA2,0xA3,0xF1,0x25,0x43,0xC4,0xB9, + + 0x23,0x72,0x6E,0x98,0x5D,0xFF,0xE4,0x1B,0xD0,0x32,0x79,0x8F,0x0E,0xB0,0x44,0x22, + + 0x3C,0x9F,0xA4,0x46,0x5C,0xDE,0xAE,0x5C,0x07,0xA0,0xB5,0x90,0x9E,0xE5,0x2F,0xF4, + + 0xA7,0x92,0x40,0x04,0x31,0xBB,0x92,0x49,0xEA,0x07,0x0E,0x8D,0x0A,0xF1,0x7C,0x12, + + 0x86,0x02,0x35,0x6F,0x88,0xFF,0x23,0x9E,0xE2,0xF0,0x64,0x91,0x04,0xE2,0xAA,0x71, + + 0x27,0x90,0xE8,0x9F,0x10,0x34,0x35,0xA3,0xAD,0xF0,0xD5,0x75,0x73,0x06,0xBB,0xC2, + + 0xD1,0x2F,0xF7,0x76,0x09,0xA9,0x0C,0xC2,0x62,0x64,0xEB,0x03,0x59,0xAF,0xC0,0x50, + + 0xEE,0xDD,0x2C,0x8B,0x42,0xF9,0xFB,0x8D,0x8E,0xA5,0x66,0xB6,0x10,0x26,0xE7,0x32, + + 0x96,0x56,0xBA,0xED,0xC9,0xA2,0xB5,0x3E,0x39,0x94,0x6F,0x93,0x93,0x3F,0x55,0x4C, + + 0x25,0x3B,0x6B,0xF3,0x80,0x91,0x91,0x61,0xF3,0xDF,0x36,0xF1,0x7F,0x93,0x21,0xF8, + + 0x8F,0x9C,0xA2,0x1E,0xB3,0x45,0x16,0xBF,0x95,0xB4,0x26,0x2A,0x7A,0x05,0x7E,0x83, + + 0x4E,0xB9,0xAE,0x5E,0x21,0xD5,0xEE,0xC5,0xE2,0x5F,0x7E,0xEF,0xFF,0x55,0x26,0xF4, + + 0x0B,0x9C,0xC5,0x8D,0x49,0x3C,0xD4,0x6B,0xE8,0x7A,0xD7,0xFC,0x08,0xB8,0x57,0x19, + + 0x2D,0xE2,0x91,0x3E,0x7F,0x11,0xBB,0xFB,0xA1,0x26,0xCF,0xE0,0x5E,0x9E,0x6A,0xA8, + + 0xF8,0x94,0xBD,0x4D,0x49,0x9A,0x0E,0x02,0x74,0x91,0xD4,0x93,0x7E,0xFC,0x56,0x45, + + 0xAD,0x51,0x02,0x5E,0xC3,0x9D,0x86,0x7E,0x72,0x23,0x01,0x01,0x80,0x02,0x64,0x49, + + 0x6B,0x8D,0x27,0x9A,0xD0,0xFF,0x2F,0x62,0x4B,0x5E,0xF7,0xEF,0x01,0x01,0xB9,0xB9, + + 0x79,0x95,0x43,0x9D,0x3C,0x6B,0x45,0x08,0x87,0x70,0xFF,0xFF,0xFF,0xFF,0x59,0x92, + + 0xA5,0x9F,0xE6,0xA0,0x34,0xBC,0x68,0xA2,0x45,0x79,0xC0,0xDA,0x5C,0xCB,0xB0,0xEE, + + 0x11,0x4C,0xF0,0x96,0x8C,0x48,0x90,0xF5,0xE0,0xCB,0x58,0xC5,0xEE,0xC3,0x00,0x67, + + 0x7B,0x12,0x3E,0x5F,0x96,0xB8,0x69,0x06,0x63,0x44,0x6C,0x35,0xBB,0x1D,0xF6,0x35, + + 0xEA,0x0C,0x36,0xF7,0x4C,0xBE,0xE2,0xD3,0x60,0xC9,0xC7,0xDA,0x85,0x60,0xE0,0x36, + + 0x69,0x0B,0x72,0x5B,0xFE,0x8B,0x6D,0x90,0x46,0x4B,0x8E,0xFF,0x42,0xCB,0xDA,0x60, + + 0xA0,0xAA,0x60,0xDE,0xDB,0x56,0x65,0x80,0x4B,0x4A,0x77,0x0F,0x8E,0xB1,0xC6,0x73, + + 0xB1,0xED,0xF7,0xB4,0x72,0x66,0x71,0x75,0xC4,0x35,0xB2,0x3B,0x23,0xBA,0x5C,0xF1, + + 0xD3,0x57,0xEA,0x46,0xE1,0x93,0xDA,0x30,0xDA,0x06,0x6B,0x6A,0x3F,0xCC,0x82,0x7B, + + 0x64,0x8D,0x2D,0xAC,0x48,0xD8,0x6D,0xCA,0x95,0x95,0xEB,0xD7,0x33,0x17,0x34,0xFA, + + 0x6B,0x7C,0x75,0xBC,0x59,0xC9,0x7A,0x78,0x67,0xC2,0xC4,0xD3,0x7B,0x6A,0x11,0x89, + + 0x63,0x4E,0xDA,0x94,0x3D,0xBB,0xBC,0xAD,0xC7,0x97,0xD0,0xDC,0x67,0x0A,0x75,0x1E, + + 0xAD,0x7D,0x20,0x67,0x4C,0xB4,0x1F,0xDB,0x4B,0x43,0xE2,0xC6,0x2D,0xB4,0x1B,0xD1, + + 0xAF,0xF3,0x9C,0x43,0x16,0x62,0x68,0x80,0x82,0x03,0xE4,0x68,0x31,0xE9,0x34,0x71, + + 0x30,0x2D,0x15,0x5C,0x98,0x23,0x03,0x1C,0xEC,0x5D,0xF9,0x73,0x83,0xC6,0xEF,0x3A, + + 0xB2,0xF8,0xA2,0xED,0x4C,0x91,0x2D,0x58,0x21,0x8F,0x53,0x2B,0x48,0x3A,0x76,0x1E, + + 0x41,0x3E,0x2B,0x62,0xBF,0x41,0xA3,0x86,0xCD,0x45,0x7E,0x79,0x5C,0x79,0xAE,0xE5, + + 0x81,0x0F,0x44,0xE4,0x30,0x3A,0x2C,0x5F,0x53,0x14,0x8C,0xB0,0x1B,0xC1,0x34,0x7E, + + 0x8D,0x1C,0xAC,0x6D,0x90,0x30,0x7B,0x40,0xE1,0x4E,0x45,0x9B,0x4E,0x73,0xB1,0xE3, + + 0x1B,0x77,0x05,0xC3,0xA2,0x34,0xAD,0x5A,0x6D,0xAF,0x95,0xB6,0xD1,0xA3,0xF0,0xB5, + + 0x48,0x1A,0xB3,0x84,0xCE,0x73,0xA6,0xC1,0x61,0x45,0xBB,0x8C,0x93,0xD7,0x7F,0x3E, + + 0x06,0x0F,0x6F,0x9B,0x8F,0xC8,0x72,0x9F,0xC5,0x50,0x7E,0x51,0x41,0xBD,0xB7,0xAE, + + 0xAE,0xE3,0x92,0xE7,0xB3,0x9E,0xE4,0x6B,0x71,0x18,0x5C,0x33,0x57,0x19,0x85,0xA7, + + 0x5D,0x9B,0x66,0xF3,0x6E,0xD3,0xD2,0xA6,0xD1,0x3F,0x15,0x64,0x2D,0x7E,0x05,0x90, + + 0x83,0xF7,0xFF,0xC5,0x36,0x21,0x3E,0x31,0xAB,0xCA,0x4D,0x86,0xC3,0x7C,0x14,0x76, + + 0xD7,0xB5,0x46,0xE4,0x38,0x78,0x86,0x56,0x95,0xF9,0x05,0x1D,0x07,0x6E,0xA5,0xE3, + + 0xFC,0xE4,0x39,0x9D,0xB4,0x35,0xE5,0xCB,0x0A,0xA8,0x59,0x40,0xC5,0x82,0x91,0xCE, + + 0x76,0x5B,0x48,0xC3,0x37,0x38,0x2F,0x56,0x1D,0x39,0x4C,0xA2,0xFE,0x10,0x4D,0xF9, + + 0xAB,0x9B,0xE7,0x83,0x4E,0xCF,0x61,0xBF,0x00,0x30,0xDF,0x92,0x8D,0x2E,0xC5,0xB7, + + 0x6A,0x70,0xE0,0x7C,0xEA,0x98,0xAE,0xE0,0x93,0x13,0x13,0x68,0x78,0x11,0xF5,0x9F, + + 0x2D,0x8E,0x4C,0x1A,0xA9,0x3E,0xCE,0x3F,0x69,0xA8,0x0A,0xAD,0x78,0x3D,0x83,0x4D, + + 0xD8,0x0F,0x91,0xD6,0xD1,0x4A,0xD0,0x56,0xBE,0x92,0xED,0x1E,0x8E,0x3C,0x8A,0x99, + + 0xF5,0x1C,0x2C,0x26,0xC4,0x3F,0x5B,0xBE,0x6A,0x51,0x73,0xD9,0x79,0xD3,0xDF,0x7C, + + 0x92,0xFB,0x0F,0x78,0xC9,0xBB,0x84,0x50,0xE7,0x3B,0x07,0xD9,0xD7,0xEE,0x17,0x99, + + 0xFE,0x1C,0xF8,0x1F,0xB6,0xBA,0x58,0x72,0xE9,0x4A,0x07,0x6C,0x77,0xD1,0x32,0xEF, + + 0x8C,0x5D,0x65,0x7D,0x33,0xA4,0xE4,0xA7,0xB8,0xFD,0x51,0x18,0xF0,0x7E,0x48,0xE9, + + 0x64,0xBC,0xEF,0x68,0x32,0xA5,0x3D,0xD1,0xE1,0x67,0xB0,0x97,0xD5,0x4B,0x28,0xCA, + + 0xDB,0xB9,0xA0,0x79,0x1E,0xC8,0xC7,0x1D,0x40,0x64,0xA0,0xF8,0xAD,0x1F,0xC4,0x2D, + + 0xCD,0x14,0x4F,0xC1,0x7C,0x03,0x40,0x89,0xC8,0x63,0x4F,0x52,0x8B,0xF4,0xCE,0xC7, + + 0x91,0x8E,0xC9,0x85,0x42,0x60,0x8E,0x01,0x35,0xA3,0xF1,0xA5,0x55,0xA0,0xD2,0xC0, + + 0xBB,0x8D,0x69,0xA6,0x55,0xE7,0xEB,0x09,0x0D,0x66,0xC7,0x5F,0xB6,0xC7,0x5B,0x2E, + + 0xA9,0xF7,0xF2,0x13,0xBF,0xB3,0x68,0x2C,0x84,0xA3,0xD2,0x61,0x71,0xE5,0x92,0xF4, + + 0x1D,0xC4,0x12,0xE1,0x1B,0x33,0xAA,0x54,0x4B,0x69,0xE9,0xA4,0x95,0xE6,0x22,0x6D, + + 0x37,0x9A,0x26,0x69,0x6B,0xBA,0x97,0xDA,0x6F,0x8A,0xCC,0x4F,0xAA,0xA8,0x86,0xF1, + + 0xA9,0x8D,0xC3,0x9B,0xAD,0xAB,0xC4,0x59,0x3A,0xAE,0xAC,0xCC,0xA9,0x76,0xE0,0x54, + + 0x32,0x78,0x4D,0x35,0xC3,0x07,0x7A,0xEF,0x7D,0x85,0xAA,0xE3,0x58,0xEE,0x4A,0x3C, + + 0xE6,0xDC,0xB4,0xC5,0x03,0x20,0x44,0x4E,0xE8,0x59,0x3A,0xDB,0x16,0xE7,0x70,0x40, + + 0xBA,0xBE,0x00,0x4F,0x42,0x58,0x4D,0x5A,0x69,0xDE,0x4F,0x9E,0xAA,0xCE,0x10,0x28, + + 0xB3,0x70,0x95,0xC5,0x4A,0xF2,0x6D,0x60,0xAB,0xD4,0x7B,0x38,0xFB,0xE9,0x7C,0xDA, + + 0xA6,0x98,0x5B,0x77,0x8B,0x83,0xE7,0x51,0xE8,0xDD,0xA3,0x5F,0x38,0xB2,0x24,0xB5, + + 0x86,0x6A,0x51,0x86,0x5E,0xCE,0x6E,0xE4,0x8E,0xB5,0x63,0x36,0xC9,0x20,0xF1,0xF1, + + 0x07,0x94,0xF5,0x79,0xB8,0x19,0xA5,0x50,0x60,0x5F,0xF8,0x78,0x83,0x87,0xAE,0x91, + + 0xC3,0x95,0x6D,0x66,0x0A,0x11,0xAD,0xDC,0x1A,0xB0,0x0C,0x8E,0x8E,0xE5,0xE2,0xF2, + + 0xDB,0x14,0x8C,0x04,0xB0,0x41,0xD7,0x74,0xBA,0x32,0xF8,0x0E,0x07,0xB6,0x91,0x15, + + 0x21,0x06,0xE8,0x91,0xB6,0xBB,0x1E,0xF6,0xB2,0x48,0x10,0xD2,0xFA,0xB4,0xA5,0x7B, + + 0xC6,0x4B,0x75,0x00,0xB4,0x43,0x4F,0x10,0x2C,0x7D,0xB1,0x38,0xF7,0xB6,0xA8,0x93, + + 0xFB,0x6A,0x52,0xE7,0xB3,0x18,0xD6,0xAC,0x1E,0x2B,0x51,0xD3,0x2E,0x0A,0xAE,0x4F, + + 0x8D,0x12,0xF8,0x61,0x6C,0xBB,0x50,0xC8,0x9B,0x65,0xED,0xA1,0x7A,0x92,0xF2,0x6A, + + 0x25,0x96,0x6F,0x84,0xCA,0x0D,0xAE,0x7D,0x84,0x28,0xBA,0x4E,0x82,0x56,0xC8,0x69, + + 0x2E,0xD2,0xDE,0x74,0xD7,0xC5,0xA0,0x54,0x0D,0x09,0xA9,0x8B,0x97,0xAB,0x4F,0xDF, + + 0xDC,0x16,0x50,0x6E,0x02,0x88,0x59,0x1E,0x04,0x0A,0x2A,0x4C,0x8D,0xE0,0x38,0x28, + + 0x22,0x19,0x00,0xBC,0x48,0x13,0xD5,0x74,0xB2,0x2A,0xD9,0x95,0x3D,0x9C,0xD3,0x5E, + + 0x5D,0xEF,0xB0,0x4C,0x7F,0x30,0xFE,0xA4,0xDA,0x01,0x01,0x7C,0x7A,0xF9,0xA7,0x73, + + 0xCE,0xF2,0x05,0x3E,0x74,0xFE,0x09,0x70,0x85,0x48,0xA9,0x0D,0xFC,0x7B,0x67,0xD3, + + 0xA9,0xEC,0x91,0x41,0x54,0x49,0xD0,0x94,0x32,0x0B,0xC7,0x11,0x53,0xF2,0x4A,0x5F, + + 0xBF,0x5D,0x29,0x7A,0x85,0x8D,0xF5,0xCF,0xA1,0x16,0xE8,0x00,0xDF,0x62,0x87,0xEF, + + 0x83,0x49,0x48,0x10,0xCA,0xDC,0x22,0xBA,0xF2,0xDC,0xF0,0x2A,0x97,0x95,0x0F,0xE3, + + 0x77,0x7F,0x99,0xFE,0xE3,0x22,0xE8,0x53,0x5A,0x7D,0x26,0x24,0x5D,0x6E,0x29,0x6F, + + 0x22,0x66,0x65,0x86,0xCA,0x2B,0x49,0x46,0x8F,0x04,0x7F,0x47,0x3A,0xC5,0xD0,0xC2, + + 0x82,0x87,0xF8,0x34,0x59,0x2F,0x54,0x27,0xC3,0x4A,0x83,0x98,0x54,0x17,0xC8,0x17, + + 0x27,0xFE,0x0C,0x90,0x15,0x27,0x62,0x83,0x89,0xEE,0xE0,0x8A,0xFF,0x68,0x79,0x31, + + 0x36,0x0F,0xD4,0x36,0x97,0x64,0xF2,0xF7,0x1E,0xA0,0xED,0xE7,0x43,0x50,0x48,0xCC, + + 0xE0,0x14,0x0F,0xAA,0x7A,0x0F,0x3B,0x75,0x28,0x82,0x26,0x0E,0xD5,0xF4,0xBD,0xEA, + + 0xF1,0x6A,0x80,0x13,0x43,0x2C,0x7C,0xAC,0x0B,0xDD,0xCC,0xBE,0x5C,0xFC,0x82,0x75, + + 0xAA,0x0F,0xC1,0xDC,0x1D,0xDD,0xB6,0xB7,0xF6,0xC4,0xFD,0x34,0xB2,0xFF,0xC7,0xD9, + + 0xF6,0x0C,0x82,0x72,0x15,0x8C,0xD3,0x39,0xF7,0xC7,0x70,0x36,0x06,0xC1,0x2B,0x0A, + + 0x28,0xF4,0xC0,0x6E,0xB8,0x94,0xFA,0xD7,0x28,0x7D,0x30,0x53,0x0C,0x97,0xD5,0xBB, + + 0x8E,0x81,0x02,0xCC,0x1B,0x6E,0x2C,0x5F,0x21,0xE9,0xF3,0xE8,0x64,0x41,0x72,0xA6, + + 0x68,0x0E,0xD6,0xD8,0x19,0x8E,0x3B,0x62,0x9B,0xF9,0xA5,0x5B,0xFA,0x6B,0x11,0x4B, + + 0x61,0x6A,0x83,0xFC,0x9C,0x6C,0x52,0x9A,0x2A,0x02,0xB3,0x27,0x10,0x63,0xDC,0xAA, + + 0x0F,0x82,0xB4,0x2E,0x92,0x6D,0x7C,0x88,0x57,0x5D,0xF5,0x43,0x02,0x60,0xC4,0x50, + + 0x96,0x13,0xBE,0x77,0x0C,0x72,0x12,0x48,0x53,0x9D,0x23,0x80,0xFF,0x72,0xD3,0x87, + + 0x12,0x43,0xF3,0x6C,0xB0,0xCE,0xC5,0xC7,0x52,0x4A,0xF4,0xAA,0xB7,0x85,0x06,0xBC, + + 0xD7,0x6E,0x48,0xA0,0x8F,0x33,0x35,0xA9,0x6D,0x69,0x22,0xA4,0x7D,0x7E,0xB5,0xE1, + + 0xA9,0x92,0x56,0x97,0xB7,0x13,0xFF,0x21,0x29,0x03,0x7B,0xC7,0x1A,0xD5,0xD4,0x6C, + + 0x11,0x10,0xFE,0x26,0x9E,0x3B,0x7C,0x22,0xB6,0x92,0xEB,0x7B,0x85,0xA9,0x51,0xB6, + + 0x00,0x95,0xAC,0x90,0x74,0x3A,0x3A,0x01,0xA1,0x15,0xFC,0x78,0x86,0xFC,0xFD,0x21, + + 0x92,0x0D,0xA5,0x81,0xA5,0x39,0xF2,0x76,0x03,0xF9,0x8D,0xF5,0x81,0xFF,0x73,0x05, + + 0x82,0x97,0xAD,0x91,0x33,0x3A,0x23,0x6F,0x08,0xA1,0xD9,0x95,0xFF,0xA0,0xF9,0x0E, + + 0x40,0x58,0x9A,0x75,0x18,0xA3,0x6E,0x9A,0x9B,0x8D,0xC8,0x3E,0x7C,0xD7,0xA2,0x0B, + + 0x79,0x13,0xA6,0x18,0x64,0x22,0x06,0x9C,0x80,0x21,0xF9,0xB4,0x92,0xEF,0x4D,0x27, + + 0x41,0x2A,0x87,0x70,0xB8,0xE1,0x12,0x82,0xFC,0x67,0x74,0x5E,0x26,0xD1,0x89,0x65, + + 0x34,0xE0,0x30,0xC1,0x98,0x19,0x0C,0x4A,0x6D,0xD6,0x34,0xC7,0x2C,0x87,0x7C,0x20, + + 0xEE,0x53,0x8C,0x31,0x99,0x59,0x08,0x73,0x7A,0xF3,0x51,0xFC,0x09,0xB4,0x04,0xC5, + + 0xD4,0x06,0xAE,0x9C,0x35,0x30,0xF1,0x83,0xB6,0x89,0x5E,0x9C,0x77,0xAA,0x1E,0xDB, + + 0x0F,0x92,0xFF,0x1D,0x4D,0x31,0x34,0xB7,0x1B,0x82,0xF7,0xF1,0x0F,0xF7,0xED,0xBF, + + 0x26,0xE9,0x85,0x62,0x18,0x32,0xED,0xE6,0x07,0xF0,0x5C,0xED,0x88,0xAD,0x8C,0x90, + + 0x1C,0x88,0xFB,0x06,0xC1,0xFD,0x4D,0x50,0xD6,0xDF,0x0D,0x79,0x80,0x25,0x51,0x52, + + 0x41,0x87,0x68,0x12,0xCE,0x5D,0xE5,0x92,0x8E,0x71,0xE6,0x04,0x51,0xAD,0xA3,0x7C, + + 0x0B,0x04,0x0A,0x58,0x29,0x5E,0x11,0x26,0xC2,0x42,0x16,0x10,0x3F,0x47,0xA1,0x7E, + + 0x24,0x72,0x96,0x48,0x68,0xCD,0x03,0x74,0x1B,0x3C,0xD8,0x24,0xFB,0x77,0x32,0x40, + + 0xED,0xE0,0xA0,0x9F,0x10,0x86,0x98,0xE8,0x64,0x12,0x44,0x1D,0xF5,0xE2,0xC4,0x76, + + 0xFA,0x8E,0x51,0xCC,0xE4,0xE5,0xCA,0xC0,0x57,0x00,0x4C,0x09,0xF4,0xA8,0x59,0x3F, + + 0xA7,0xC6,0x61,0x00,0x4C,0x19,0x0E,0x29,0x7B,0xDA,0xDF,0xC5,0x23,0xE9,0x51,0xAF, + + 0x07,0x7C,0xA5,0x83,0x6F,0xEF,0x0F,0x59,0xA1,0x02,0xFB,0x91,0xF3,0x18,0x5A,0x2E, + + 0x2E,0x8A,0xC4,0xC3,0x1D,0xC8,0x08,0xB4,0xBB,0x45,0x94,0x9E,0x84,0x43,0x76,0xF2, + + 0x1B,0xC4,0x06,0x8D,0x0A,0xA3,0x41,0x1E,0x99,0x91,0xEA,0xA0,0xA6,0x12,0x37,0xF7, + + 0x11,0x71,0x04,0xC2,0xB8,0x57,0x54,0xD0,0x2D,0x5C,0x16,0x2A,0x5B,0xFC,0x39,0xE4, + + 0x0B,0x2A,0x2B,0x00,0x8A,0xEA,0x9C,0x76,0xED,0x6A,0xBB,0xFD,0x5E,0xAD,0x32,0xB3, + + 0x4E,0x13,0x55,0x0F,0x18,0x94,0x41,0x62,0xAA,0x79,0x92,0xCD,0x5D,0xE1,0xE1,0x3A, + + 0x0B,0xE1,0x26,0x3C,0x5C,0x72,0x9A,0x45,0x6B,0xA3,0xF2,0x6F,0xA2,0x5B,0xA3,0x83, + + 0x5D,0x73,0x46,0x6B,0x1C,0xE6,0xAC,0x6B,0x4D,0xC0,0x8C,0x10,0x51,0x58,0xFB,0x9C, + + 0xAB,0x8C,0x93,0xDD,0x9A,0xA6,0x3B,0x44,0xC7,0xA3,0x00,0x7D,0x9F,0x83,0x78,0x06, + + 0x33,0x92,0xA2,0xAB,0xDD,0xC1,0x62,0xEE,0x8F,0xB4,0x8B,0xF9,0xA0,0x35,0x29,0xD5, + + 0xEF,0x21,0x45,0x14,0x3C,0x5C,0xF8,0xED,0xD8,0x2D,0x3C,0x47,0x95,0xB1,0x75,0x9B, + + 0xF0,0x3F,0x09,0x15,0xB8,0xBA,0x0D,0x4C,0x07,0xDB,0x12,0x90,0x9F,0x57,0x65,0x86, + + 0xD2,0xEF,0xF7,0x6D,0x16,0xB7,0x67,0x10,0x91,0x91,0x15,0x3D,0x61,0x67,0x2C,0xCE, + + 0x15,0xB0,0xAE,0x19,0x95,0xB9,0x42,0x13,0x86,0x94,0xD4,0xE2,0x97,0x6B,0xD4,0xEF, + + 0x80,0xD4,0xA6,0x2D,0x94,0xB3,0xD9,0xE9,0x0C,0xA1,0xC6,0x09,0x8A,0x74,0xDD,0x3C, + + 0x95,0x52,0xAF,0x28,0x15,0xBB,0xDD,0x69,0x72,0x42,0x5A,0x9D,0x2B,0xB7,0xAD,0x9B, + + 0xA7,0x1A,0xE1,0xD0,0x16,0x3D,0xFD,0x35,0x75,0xD4,0xEE,0x0C,0x16,0x74,0xF9,0x9D, + + 0x2A,0xC2,0x5D,0x0A,0x63,0x7D,0x7F,0x9F,0xCD,0x67,0x13,0xB5,0x17,0x8C,0x17,0x3A, + + 0xC0,0x69,0xE4,0x69,0x9E,0xBF,0x3D,0xA6,0xED,0xA7,0x5D,0x45,0x02,0xF9,0x67,0xAF, + + 0x29,0x34,0xC7,0xCE,0x30,0xB7,0xF7,0x77,0x47,0xE8,0x37,0x69,0x6E,0xF9,0xDF,0x48, + + 0x4C,0xF7,0xE7,0x08,0xDE,0xEE,0xAF,0xF4,0x10,0xA7,0xD7,0x7D,0x7B,0x0E,0x3F,0xC8, + + 0x89,0xDE,0x59,0x2C,0x1A,0xBA,0x95,0x11,0x11,0xDC,0x26,0x14,0x87,0x75,0xA2,0x5E, + + 0x3A,0xE2,0x5A,0xBC,0xC0,0xA6,0xEE,0xE5,0x66,0x69,0x5A,0x8C,0xDC,0x0D,0xAF,0x49, + + 0xA8,0x3D,0xCE,0x5C,0x1F,0x61,0x1F,0x29,0x68,0x2B,0x73,0x1C,0x7A,0x6A,0xFF,0x1C, + + 0xAD,0x6A,0x79,0xB9,0x44,0xFD,0xF7,0x79,0x2A,0x5C,0x08,0x7F,0x42,0xBE,0x5A,0xA9, + + 0x68,0x63,0x68,0x8E,0x32,0xF6,0xF4,0xDE,0x23,0x60,0xF0,0x0A,0x33,0x6F,0xA2,0xE3, + + 0x8D,0x0C,0x7B,0x2F,0xEB,0xB4,0x27,0x77,0x8B,0x11,0xFE,0x54,0x52,0x40,0x7F,0x07, + + 0x61,0x81,0xFE,0x3A,0x6E,0xF7,0xF5,0xDE,0x21,0xFD,0x4E,0x24,0x2D,0x0E,0xF6,0x35, + + 0x75,0x80,0xFA,0xD7,0x12,0x65,0x51,0xA4,0xC7,0x59,0xC3,0x95,0xAD,0x7C,0x67,0xB1, + + 0x9E,0x96,0x53,0xC0,0x7E,0xD2,0x18,0x82,0xEE,0xE9,0x85,0xE6,0xC3,0x10,0x37,0xAD, + + 0x03,0x0B,0x5B,0xD0,0x7F,0x52,0x8C,0xD5,0x00,0x49,0xEA,0x8B,0xA7,0x6A,0xA9,0xCB, + + 0xA0,0xD0,0x7E,0xA7,0xF1,0xC3,0x1D,0x83,0x7F,0xCA,0xE9,0x94,0x71,0x39,0x21,0xD7, + + 0x7F,0x46,0xF3,0xB7,0xF0,0xD7,0x56,0x8F,0x2A,0xFF,0x19,0xB8,0x42,0x61,0x04,0xB8, + + 0x6B,0x23,0x35,0x28,0x6F,0x28,0xD7,0xD8,0x68,0xF9,0x2A,0xD2,0x3B,0x4B,0x58,0x57, + + 0x2D,0xF4,0x31,0xAC,0xDC,0xF6,0x53,0xB5,0xA0,0x19,0x79,0xC2,0xFD,0x84,0x90,0xFA, + + 0x0C,0x87,0xD9,0x62,0xE4,0xD5,0xD3,0xE1,0xB4,0x08,0x04,0xC7,0x7D,0x06,0x1C,0xEA, + + 0x0D,0x86,0x2C,0x1B,0x72,0x4F,0x0C,0x09,0xE9,0x09,0x5F,0xC6,0xBA,0xE0,0xEF,0x37, + + 0x97,0x50,0x55,0xB3,0x4E,0xFB,0x78,0xCD,0x09,0x41,0xFB,0x63,0xFB,0xEB,0x52,0xCC, + + 0x6B,0xF2,0x15,0x26,0x24,0xEB,0x14,0x57,0x1E,0x0D,0x57,0x1E,0x78,0x0D,0xF8,0x07, + + 0x63,0x3E,0x42,0x27,0xED,0xE2,0xD8,0x92,0x02,0xB6,0x93,0x79,0x58,0x4A,0xB4,0x2B, + + 0xE9,0xF0,0x12,0x5D,0x7A,0x90,0x10,0x09,0x49,0x4C,0x1B,0xA0,0x84,0x2E,0x04,0x7F, + + 0x20,0xEF,0x3F,0xE4,0x3C,0xCB,0x2B,0x90,0xF2,0xEF,0x37,0x92,0xAC,0x95,0x0C,0x6F, + + 0xDE,0x11,0x1B,0x8E,0x13,0x85,0xC1,0x28,0x67,0xCB,0xAE,0xB5,0xF4,0x67,0xFA,0x7F, + + 0x5F,0x32,0x7A,0xA1,0x94,0xC6,0x2E,0x11,0x7C,0xCD,0xCB,0x96,0xFC,0xD9,0x09,0x91, + + 0x5E,0xEC,0xD9,0xE7,0x5A,0x70,0xDF,0x59,0x2D,0x1E,0x3C,0xAF,0x6D,0xC7,0xE9,0xBF, + + 0xBF,0x56,0xBC,0xC0,0xD2,0xB5,0x8F,0xAF,0x1D,0xA6,0xD0,0x06,0x56,0xF9,0xE5,0xBE, + + 0x5C,0x15,0xB4,0x64,0x85,0x9A,0xDC,0x2D,0xF1,0xAE,0xF3,0x8B,0xAA,0xE9,0x08,0x45, + + 0x37,0xEB,0xD4,0x36,0x36,0x9B,0x88,0xB1,0x03,0xE9,0x8C,0x18,0x55,0x37,0xB6,0x71, + + 0xF3,0xE5,0x69,0xF1,0x32,0x3A,0xA2,0x83,0x14,0xE8,0x66,0xAF,0xF5,0xAD,0xF9,0x88, + + 0xD7,0xE7,0xFB,0xE7,0xB5,0x9E,0x64,0xAC,0x64,0x16,0xC8,0xA3,0x6A,0x36,0x47,0x31, + + 0x3A,0xAA,0xDA,0xB5,0xD2,0x7D,0xA6,0xA8,0xCE,0x18,0x41,0xBC,0xFA,0x77,0x07,0x76, + + 0xA8,0x1A,0x10,0x4D,0xFE,0x97,0x03,0x8D,0xDB,0xBE,0xF6,0x0D,0x2E,0xC5,0x46,0xC9, + + 0xBA,0xA3,0xB5,0x2C,0x9B,0x94,0xF3,0x39,0x15,0x7B,0x7F,0x82,0xDD,0x15,0x1F,0x51, + + 0x8F,0x6D,0xEE,0x2E,0xBB,0x58,0x0F,0xEE,0x8F,0xC3,0x41,0xA3,0x87,0x00,0x61,0xA7, + + 0xF2,0xA0,0x90,0x1E,0x29,0x7F,0x9B,0x10,0x1C,0x90,0x15,0xC1,0xF6,0x80,0xB8,0x4D, + + 0xB1,0x5C,0xEF,0xCB,0x3B,0x30,0x68,0xAE,0x38,0x54,0x7E,0x93,0x6F,0x3C,0xB4,0xB7, + + 0x40,0x5B,0xCF,0xD1,0xBD,0xC5,0x40,0x99,0xED,0xD4,0x3A,0x02,0x0E,0x29,0xF3,0xF1, + + 0x88,0x0D,0x98,0x41,0x1A,0x1F,0x79,0x1F,0x1C,0xC4,0x27,0xD5,0xD0,0x6D,0x88,0x60, + + 0x67,0xFD,0x92,0xB3,0xE6,0x55,0xE8,0x12,0x6D,0x30,0x87,0xD4,0x09,0xE5,0xC5,0xF9, + + 0xA0,0x2D,0x15,0x65,0xEC,0x1D,0x8D,0x07,0xE6,0x83,0xE3,0x09,0x3F,0x86,0x57,0x14, + + 0xA1,0x2C,0x09,0x09,0x19,0xC6,0x07,0x57,0xAD,0xCE,0xD4,0x13,0x5A,0xE1,0x9B,0x2D, + + 0x7A,0x2B,0x60,0x8F,0xE2,0xA2,0xB7,0x00,0x07,0x84,0x2B,0x64,0x29,0x0C,0xCC,0x30, + + 0xF8,0x08,0xE9,0xB4,0x95,0xAD,0x22,0x73,0xE4,0xC3,0xF2,0x09,0x76,0x07,0xC1,0x2D, + + 0xF0,0x29,0xED,0x40,0x37,0x2E,0x09,0xE1,0xE4,0x74,0xAE,0xCC,0xD0,0x3C,0x16,0xD7, + + 0xD0,0xA8,0x64,0xA7,0x93,0xA8,0x29,0xEE,0x66,0x4F,0xA0,0x74,0x72,0x18,0x82,0x78, + + 0x6E,0xDD,0x16,0x6C,0x91,0xCA,0x4D,0x59,0x65,0xAB,0x05,0x2F,0xD1,0xE4,0xBA,0x1B, + + 0x05,0xA9,0x11,0xA6,0x90,0xCB,0x44,0x3C,0x2E,0xED,0x9D,0xA9,0x36,0x4F,0x5D,0x0C, + + 0x7D,0x85,0x78,0x0F,0xE4,0x55,0x48,0xDB,0x4D,0x7B,0xDB,0xDE,0x1A,0xEA,0xD4,0xE4, + + 0x72,0x8B,0x50,0x60,0x93,0x54,0x68,0x04,0x49,0x14,0x3E,0x4D,0x36,0x6D,0xDF,0x7B, + + 0x16,0x23,0x82,0x0E,0x0B,0x2E,0x76,0x88,0xCC,0xCF,0xAB,0x93,0xFB,0x1D,0xCE,0x38, + + 0xF0,0x36,0x92,0xDC,0x1A,0x7C,0xF2,0xAE,0x2C,0xAD,0xB8,0x3E,0x0F,0xEB,0xC3,0x39, + + 0xB8,0x21,0x9B,0xCD,0x9B,0x5F,0xB0,0x19,0x6D,0xC8,0x0B,0x09,0x51,0x68,0xEB,0x5F, + + 0xD8,0xA0,0xD1,0xBD,0xBB,0x04,0x03,0xFF,0x90,0xC5,0xF7,0x78,0x7E,0x67,0x24,0x82, + + 0x24,0x70,0x00,0xE4,0xCB,0xF2,0x98,0xE0,0xE7,0x04,0xF4,0x99,0x7C,0x9C,0x2C,0x92, + + 0x2D,0x88,0xAA,0x32,0x2D,0xB5,0x5A,0xB6,0x0E,0x57,0xF6,0x54,0x34,0xE1,0x25,0x83, + + 0xA4,0x03,0xAB,0x83,0xB7,0xF2,0xD7,0xBC,0x2A,0x79,0x9D,0x65,0x0D,0x7E,0x2D,0x93, + + 0xE1,0xB5,0x97,0xE4,0x93,0xBA,0xBD,0xC1,0x0E,0x16,0xC3,0x24,0x9E,0x45,0x3A,0xC5, + + 0x26,0x39,0x0B,0x44,0x37,0xD3,0xC2,0xDB,0x60,0x35,0x0F,0xA1,0x8B,0x42,0x64,0xC3, + + 0xCE,0xD1,0x48,0xB4,0x76,0x95,0x9B,0x32,0x23,0x29,0x10,0xF4,0x7F,0x99,0xC5,0x3C, + + 0x29,0x20,0xDF,0x25,0x34,0x9E,0x80,0x81,0x15,0xBA,0x4E,0x7D,0xF7,0x96,0x96,0xA8, + + 0x58,0xD6,0x95,0x15,0x34,0xB9,0x46,0xAC,0x32,0x6A,0xB5,0x9C,0xD3,0xF1,0xE6,0x56, + + 0xD6,0x65,0x20,0xFF,0x40,0xB1,0x48,0x9D,0x07,0x7D,0xB7,0xB0,0x98,0x0C,0x50,0x9C, + + 0xCC,0x1A,0x71,0x9E,0x19,0xA2,0x5F,0xA0,0xBD,0x6D,0xE0,0x8C,0x3D,0xB5,0x31,0xE9, + + 0xCC,0x80,0x23,0x72,0xB4,0xFB,0xB6,0x58,0x0C,0x96,0x01,0x5E,0x14,0xBE,0x66,0x68, + + 0x21,0x16,0xFB,0xF9,0x30,0xD9,0x18,0x4A,0x71,0xC9,0xDE,0xB1,0x2D,0x8F,0x06,0x95, + + 0x8D,0x17,0x46,0x0C,0xB2,0xB2,0xDD,0xF3,0xEE,0x42,0xA6,0x73,0xDF,0x76,0x14,0x2A, + + 0xFC,0x92,0x8E,0x9F,0xCA,0xB0,0x27,0x6A,0xCA,0x22,0x34,0x8C,0xDC,0xFB,0x63,0x29, + + 0x2C,0x62,0x9F,0x0D,0x1F,0xFD,0xD8,0x95,0x33,0x9F,0x0C,0x0D,0x7C,0xB6,0x0F,0x84, + + 0x48,0x32,0xE5,0xDE,0xB9,0x2C,0x45,0x05,0x8C,0x56,0xAF,0x62,0x5E,0x75,0x7F,0xE2, + + 0x82,0x03,0x73,0x10,0xED,0xAB,0xEF,0xDB,0xC2,0x48,0xE0,0x5A,0xF3,0x05,0x28,0x69, + + 0xA0,0xFE,0xB2,0xA4,0x8C,0x8E,0x65,0x14,0xA8,0x11,0x90,0x83,0xB0,0x6E,0x46,0x73, + + 0x23,0x04,0xEA,0x39,0x7B,0x66,0xEE,0x43,0xE0,0x4F,0x2E,0xC7,0xF4,0x64,0x23,0xC1, + + 0xDD,0x05,0x2D,0x77,0x6E,0x62,0xE4,0x4A,0xFD,0x3C,0xF9,0x75,0x37,0x6E,0x46,0x49, + + 0x26,0x02,0xB8,0x60,0x93,0x29,0xEF,0x82,0x66,0xC9,0xA8,0xE6,0x74,0x2C,0x28,0x10, + + 0xEF,0x08,0x08,0x89,0xAA,0x2B,0x98,0x45,0xFD,0x48,0x13,0x16,0xAE,0x0B,0x49,0x76, + + 0x23,0xD9,0xE9,0x42,0x13,0x62,0xAE,0x91,0x2E,0xB7,0xA9,0x42,0x71,0x26,0xE5,0xCF, + + 0x0E,0xF1,0x69,0x97,0x1F,0x29,0xA2,0x36,0xCD,0x48,0xBE,0x35,0x93,0x9A,0x52,0x85, + + 0xAB,0x48,0x2A,0x90,0x2B,0x4C,0x28,0x8D,0xFF,0xB5,0xD8,0xD2,0xFB,0x65,0xAD,0xB8, + + 0xD9,0x2A,0x4A,0xDC,0x0A,0x6B,0x3A,0xD2,0x2A,0x4D,0xE2,0xBE,0x58,0xEE,0xC8,0x6B, + + 0x5C,0xFB,0x39,0xF6,0xE7,0x0A,0xBF,0xA6,0x7D,0xC3,0xD9,0x30,0x99,0x62,0x2C,0xBD, + + 0x34,0x02,0x45,0xA9,0x78,0x84,0x7A,0x79,0xC5,0xBE,0x20,0xDF,0x75,0x96,0x4A,0x4D, + + 0x85,0x08,0xFA,0xE8,0x98,0x64,0xD5,0xD7,0x5E,0x63,0xB5,0x93,0x7E,0x00,0xDA,0x9F, + + 0xF6,0xBB,0x0A,0x04,0x46,0x2B,0x15,0x5E,0xA2,0x7D,0x7D,0x7A,0x8F,0x09,0x47,0x0E, + + 0x89,0x01,0x0C,0xBD,0x96,0x21,0xD3,0x84,0x12,0x0C,0xEC,0xF2,0x25,0x2F,0xF0,0xC3, + + 0x8A,0xEF,0x43,0x5A,0xF8,0xAF,0x03,0x74,0x81,0x7F,0x66,0x1D,0x9F,0x1D,0x36,0xB0, + + 0x22,0xBF,0xFE,0x87,0x5C,0x30,0x4F,0xF3,0x1B,0x23,0xF4,0xE4,0xC6,0x7D,0xB9,0x63, + + 0xAD,0x50,0x11,0x94,0xB9,0xFB,0x04,0xB5,0x1E,0x71,0xD6,0xA9,0xD2,0x77,0xA5,0xF2, + + 0x03,0x91,0xA1,0xB9,0xB0,0x12,0xD5,0x68,0xAD,0xAF,0xDF,0x5B,0x53,0x7F,0x17,0x93, + + 0x4A,0x1C,0x8D,0x95,0x4C,0x92,0x8D,0x4C,0xE1,0x12,0x95,0x1F,0x04,0x7C,0x51,0xFF, + + 0x16,0x55,0x54,0x46,0x10,0x54,0x36,0xF1,0x61,0x34,0xAE,0x14,0x7A,0x7B,0x5B,0x23, + + 0xA7,0x98,0xB3,0x56,0x11,0x55,0xDD,0xC0,0xDC,0x39,0x97,0x84,0x92,0x6E,0x7F,0x3B, + + 0xF8,0xEB,0xFF,0x27,0x90,0xC9,0x6F,0xE3,0xA6,0xFB,0xF3,0xBC,0xB9,0x36,0x9E,0x22, + + 0x2F,0x1A,0x97,0xD4,0x10,0x76,0x99,0x0E,0xC7,0x3B,0x5E,0x13,0xC0,0x4C,0x47,0xEE, + + 0x49,0x1C,0xBE,0xBD,0x99,0xB9,0x2C,0x52,0x93,0x23,0x22,0xD3,0xDB,0x39,0x75,0xBF, + + 0x88,0x77,0xDC,0xD6,0xD2,0x5D,0x67,0x3C,0x65,0x56,0x66,0xB4,0x98,0x36,0x61,0x6B, + + 0x8C,0x17,0xE0,0x7E,0x3C,0xB7,0x57,0x45,0x84,0x65,0xCE,0xD8,0x9B,0x7E,0x6D,0x91, + + 0x58,0x92,0xB7,0x67,0x15,0x36,0xC2,0x80,0xDE,0x2C,0xC6,0xCD,0x9A,0x80,0x55,0x32, + + 0xD3,0x17,0xFC,0x32,0xE7,0xE1,0x0B,0x04,0x87,0x47,0x2C,0x04,0x34,0x33,0xDE,0x5A, + + 0xA3,0x65,0x05,0x3F,0x6F,0xEA,0xDF,0x1A,0x8B,0xE2,0x01,0x08,0x0C,0x3D,0x3B,0x96, + + 0x5B,0xE2,0x68,0xBF,0x41,0x7C,0x0E,0x7F,0xA8,0xFA,0x47,0x69,0xCC,0xA0,0x77,0xB9, + + 0xA7,0x5F,0x5A,0x2F,0x9F,0x39,0x9F,0x21,0x7F,0x1E,0x5F,0x24,0x45,0x79,0xE5,0x8F, + + 0xED,0xC3,0xA5,0xEE,0x27,0x6F,0xB1,0x06,0xB9,0xAC,0xC8,0x02,0xD6,0xE3,0x7E,0xB3, + + 0xEE,0xE5,0xF1,0x15,0xF2,0xED,0x5F,0xCD,0x61,0x3A,0xE2,0x1D,0xF6,0x84,0xB4,0xF0, + + 0x00,0x0F,0x09,0x13,0x11,0x72,0x56,0x63,0x84,0x3F,0xF0,0x87,0x90,0xD2,0x11,0xEC, + + 0x6C,0x80,0x29,0xD1,0x99,0xE2,0x39,0x17,0xF6,0xB2,0xE3,0x15,0x76,0xE7,0xDF,0xD9, + + 0xF9,0x59,0x98,0x62,0x10,0x1E,0xB0,0xAE,0x90,0x86,0xCF,0x84,0xFA,0xE0,0x57,0xCD, + + 0xF8,0x18,0x1D,0xD2,0x6D,0x83,0xE3,0x56,0xA6,0x87,0x75,0x86,0x5B,0xEA,0x02,0xBD, + + 0xA2,0xEA,0x8B,0xBA,0x94,0x7D,0xBE,0x9B,0xC0,0xBE,0x0F,0x43,0x54,0xEE,0x8A,0xAD, + + 0xA3,0xE9,0x29,0x1F,0x07,0xE7,0x2A,0x45,0x45,0xDB,0x99,0x37,0xC2,0x6A,0xB7,0xF9, + + 0x88,0x05,0x8E,0x1A,0x95,0xCC,0x8A,0xD5,0x3F,0x64,0x34,0xDE,0xE4,0xE7,0x95,0xF8, + + 0x8D,0xC4,0xA6,0x4D,0xED,0x68,0xB4,0x45,0x6E,0x19,0x4A,0x2A,0x79,0xEF,0x75,0x36, + + 0x67,0xEE,0xAF,0x5C,0x28,0x62,0x6C,0x9F,0xCA,0xF0,0x07,0xDF,0xFC,0xE5,0xBB,0xEA, + + 0x2E,0xCB,0x23,0x49,0xF7,0x8B,0x62,0x03,0x68,0x34,0xB3,0x90,0x3C,0xE4,0x22,0x75, + + 0x06,0xE0,0xEF,0x43,0xFF,0x03,0x80,0x88,0xA7,0x35,0x8A,0x4A,0xDC,0x10,0x14,0x73, + + 0xC7,0x73,0x8A,0x1E,0xA1,0xA2,0x1A,0x30,0xE9,0xC2,0xB4,0x93,0x57,0xAD,0x03,0x0B, + + 0x6A,0x83,0xE6,0xA7,0xAD,0x61,0x01,0x94,0x86,0x43,0x89,0x1D,0x7D,0x9A,0xFA,0xDD, + + 0x73,0x5A,0xE9,0xBD,0x18,0xFA,0xEB,0x08,0xDB,0xA3,0xB0,0x0F,0x5D,0x13,0x04,0x10, + + 0xA4,0xD1,0xDB,0xA1,0x95,0x6F,0x69,0xAA,0x57,0xD0,0x4C,0xAE,0x17,0x0F,0x54,0x10, + + 0xF8,0xCE,0x65,0x92,0x7D,0x97,0x6C,0x26,0x84,0xDE,0x44,0x5E,0x7E,0xBE,0x45,0xDC, + + 0x1B,0x6F,0x11,0xE5,0x4B,0xA9,0xF5,0x73,0x83,0xD4,0x4D,0xD5,0xC7,0x18,0x12,0x71, + + 0x27,0x6F,0xCD,0xD7,0x1B,0x3E,0x89,0xCC,0x46,0x92,0x2D,0xC4,0xED,0x9F,0xA9,0x2A, + + 0xCF,0x6D,0xE8,0xBD,0x97,0x3E,0x14,0xA6,0x1D,0x5F,0xFC,0x41,0xD7,0x0B,0x3C,0xD2, + + 0x21,0x6F,0xA6,0x28,0x31,0x26,0x76,0x76,0x2F,0x72,0x6C,0xE7,0x6B,0xF3,0x1F,0xA3, + + 0xAA,0xD6,0x1E,0x25,0x1A,0xBB,0xF5,0x01,0x64,0x95,0xCF,0x05,0x0B,0xF9,0xA2,0xF7, + + 0x94,0xB1,0xB8,0xF3,0x84,0xAC,0x3B,0x22,0xAC,0x7D,0x50,0x17,0x56,0x77,0x5B,0xE5, + + 0x8F,0x9E,0xDE,0x0C,0x3D,0xFF,0xED,0xAB,0x0F,0x2E,0xD0,0xA2,0x7F,0x68,0x56,0x18, + + 0x2C,0xE4,0x96,0x4E,0x61,0x31,0x06,0x41,0x90,0xB5,0x71,0x46,0x7B,0x73,0x88,0x61, + + 0x45,0x30,0x9F,0xDF,0xB4,0xB5,0xA4,0x2F,0x80,0x36,0x77,0x76,0x58,0xB8,0x75,0x9A, + + 0x0E,0x98,0x9F,0x7D,0x3F,0xB3,0x58,0xFB,0xAD,0x0B,0x6F,0x3B,0xA2,0xD3,0xDC,0x8D, + + 0xEC,0x4E,0x5C,0x30,0xD7,0xEC,0xE6,0xB5,0x0F,0xBC,0x8E,0xCA,0x7E,0xFC,0xD4,0xCE, + + 0x29,0xE7,0x2E,0x06,0xAB,0xFC,0x44,0x4A,0x49,0x29,0xFE,0xFE,0x7F,0xFD,0x2F,0xD3, + + 0x9D,0xB8,0x44,0x2D,0x5E,0x01,0xD8,0x99,0x92,0x21,0xF7,0xEF,0xFE,0xFE,0xB8,0xA5, + + 0x0C,0xFA,0x8F,0x9B,0x3B,0x32,0xDF,0x08,0x63,0x62,0xFF,0xFF,0x9E,0x15,0x10,0x95, + + 0x02,0x6E,0xD9,0x17,0xF7,0x3B,0xBA,0xD1,0x46,0xE0,0x13,0xCC,0x98,0xAD,0x1B,0x98, + + 0xA4,0x88,0xAD,0xE2,0x7A,0x80,0x1E,0x22,0x47,0x21,0x9E,0x4A,0x8F,0xAE,0x58,0x86, + + 0x25,0x84,0xA0,0xF1,0xB6,0x39,0x59,0xC9,0x52,0x00,0x6A,0xE2,0x0E,0x6A,0x29,0x83, + + 0x09,0x0B,0x6B,0xE8,0x57,0x2C,0xA5,0xB3,0x04,0xE8,0xB9,0x25,0x30,0x78,0x41,0x3F, + + 0xA5,0x07,0x5F,0xD1,0x11,0x84,0x33,0x06,0xB1,0x54,0xB3,0x02,0xA5,0x74,0x9A,0x90, + + 0x4B,0x47,0x8E,0xBC,0x83,0xE8,0x3F,0x8F,0xB6,0xD3,0x60,0x8E,0x43,0x28,0x81,0x4D, + + 0x84,0x77,0x01,0x38,0xDE,0x2C,0xE9,0x9A,0x4F,0xBB,0x69,0x9A,0xE1,0x8F,0xD6,0x8B, + + 0x03,0xF5,0x36,0x35,0xCF,0x49,0xA2,0x4A,0xA7,0xDC,0xA6,0x32,0x0D,0x98,0x82,0xCF, + + 0x2C,0x64,0xD2,0x99,0x14,0x2B,0x92,0x39,0x92,0x4E,0xB4,0xDA,0x6B,0xCC,0xF2,0xF0, + + 0xC1,0xC6,0xF5,0x5B,0x2A,0x4F,0x52,0xD0,0x09,0x0B,0x92,0x2C,0xDE,0x5B,0x93,0x7B, + + 0xBB,0x1F,0xC1,0x11,0x71,0x8B,0xB9,0xD8,0xCE,0xEA,0x29,0xEA,0x1A,0x3A,0xA3,0x90, + + 0xBA,0xCF,0x33,0x86,0x3E,0x39,0x1D,0xA5,0xCF,0xB2,0xA1,0xCB,0xFB,0x59,0x1B,0x53, + + 0x6D,0x4C,0xA4,0x7D,0x1B,0xEC,0x52,0xEC,0x37,0xEA,0xE9,0xF2,0xAD,0x51,0x21,0xB0, + + 0xD3,0xA0,0xEA,0x4C,0xFA,0x36,0xE2,0x41,0xEC,0x5F,0x27,0x0E,0x99,0x6D,0x63,0xD4, + + 0x8C,0xF7,0x7C,0xDE,0xF2,0xE1,0x5B,0x65,0xF9,0xF8,0x2E,0x2A,0x3B,0x18,0x5D,0x6D, + + 0x6C,0xC2,0xEA,0xAB,0xA8,0x3B,0xE3,0xC1,0x4B,0x6E,0x22,0x3A,0x26,0x19,0x5E,0x84, + + 0x87,0x00,0x3C,0x7A,0x5B,0x3F,0xD4,0xB1,0x63,0x4B,0x55,0xA1,0x50,0x32,0x55,0x82, + + 0xC6,0x0A,0xF3,0x7C,0x7E,0x7C,0xDC,0xFC,0xA1,0x5B,0xA2,0x60,0x52,0x29,0x5F,0x49, + + 0x07,0x9F,0x83,0xB7,0xD0,0x92,0xA5,0x25,0xA8,0x67,0xCD,0x21,0xD1,0x6B,0xED,0xE7, + + 0x92,0x87,0xF6,0x52,0x6B,0x3B,0x5D,0x59,0x59,0x1E,0xC4,0xC5,0x54,0xAC,0xDB,0x91, + + 0x23,0x54,0x3B,0x83,0xCB,0xC2,0x54,0x06,0x51,0x40,0x78,0x60,0x0F,0xB3,0xF6,0x55, + + 0x2D,0x9F,0x95,0x52,0xD6,0x0A,0xE6,0x10,0x29,0x7C,0x1A,0x70,0x0E,0x95,0x49,0x9A, + + 0x91,0x82,0x3A,0xBF,0x64,0xE9,0x8F,0xED,0xD1,0x42,0x15,0x98,0xBC,0x7C,0x9A,0x2E, + + 0x1C,0x79,0xB2,0x51,0xCE,0x91,0xAC,0x75,0x9E,0x7C,0x95,0x71,0xC0,0x43,0xFC,0x0C, + + 0x09,0xBA,0x85,0x64,0xFC,0xF5,0x14,0x4E,0xCD,0xDE,0x97,0xCA,0x87,0xA5,0xF1,0xEB, + + 0x7E,0xED,0x1E,0x68,0x31,0x3D,0x2F,0x48,0x2D,0x16,0xA4,0x23,0x86,0xF4,0x39,0xE9, + + 0xC8,0xC5,0x6B,0x1F,0xB0,0x30,0x13,0xE9,0xFC,0x41,0xC7,0xDA,0xB4,0x16,0x77,0xAB, + + 0x56,0x00,0x4D,0xE7,0xD2,0x34,0x8F,0xCB,0xDA,0x6E,0x7C,0x43,0xCA,0x92,0x79,0x47, + + 0x2C,0xE5,0xCE,0x49,0x09,0xD5,0x0F,0xF2,0x8F,0x30,0xE8,0xDD,0x1E,0xB3,0xD1,0xCD, + + 0x2A,0x7D,0x97,0x46,0xE2,0x72,0xC1,0x6E,0x68,0xDD,0xD6,0xF0,0x48,0x68,0x8F,0x09, + + 0xBA,0x5C,0x7F,0x36,0xAA,0x73,0x93,0x12,0x67,0x1C,0x6D,0xAA,0x38,0xDE,0x5F,0x51, + + 0xDE,0x04,0xCE,0xA6,0x1C,0x24,0x06,0xF3,0x8C,0x1C,0x85,0xF8,0x5C,0x3E,0xDA,0xEA, + + 0xD6,0xCF,0x18,0x94,0x14,0xEF,0x8C,0xA6,0x0C,0x67,0x75,0xCE,0x9C,0x4D,0xD2,0x54, + + 0x1B,0x9A,0xF8,0x61,0x17,0xA2,0x02,0xDA,0x89,0x0E,0x72,0x56,0x51,0x6C,0x20,0xE5, + + 0xB7,0xB6,0xF8,0x81,0x31,0xB2,0x31,0x23,0xC4,0xC2,0xA7,0x13,0x33,0x4F,0x08,0xE7, + + 0xA3,0xC2,0x6F,0x13,0x12,0x61,0x59,0x65,0xE8,0x81,0x43,0xDF,0x1D,0x2E,0x8C,0xD0, + + 0x0E,0x8C,0x5A,0xA6,0x12,0xEA,0xDC,0x10,0x8C,0x05,0x49,0x16,0xD6,0xFB,0xA8,0x5F, + + 0x01,0xF4,0xF4,0x14,0xFE,0x6F,0x03,0x35,0xBA,0x73,0xB0,0x7B,0x64,0x73,0x21,0x31, + + 0x61,0x85,0x24,0x67,0x88,0xE6,0x0E,0x11,0x04,0xC6,0x4A,0x17,0x56,0xF0,0xBB,0x93, + + 0xC3,0x9C,0xB1,0x0A,0xA4,0x6D,0x42,0x03,0x47,0xD8,0xC2,0x91,0xC7,0x5A,0x8A,0x8F, + + 0x89,0x9A,0x4A,0x9B,0x2F,0xEE,0x34,0xEA,0x7F,0x8D,0x5E,0xBC,0x4C,0xE0,0xEA,0x67, + + 0xDE,0x92,0xF0,0x26,0xBA,0xA8,0xFA,0x2B,0x15,0xC1,0x8B,0x2E,0xFA,0xA8,0x8B,0x9E, + + 0x09,0x48,0xF9,0x0E,0x3B,0xBA,0xF3,0x3A,0x0C,0xA4,0x35,0x5D,0x3B,0xF1,0x88,0xED, + + 0xBE,0xCD,0xEE,0xCF,0xAE,0x81,0xBE,0xB9,0x08,0xA2,0xAB,0xAE,0x99,0xEA,0x53,0xBA, + + 0x4E,0xC3,0x5A,0xAE,0x0B,0xEE,0xC9,0x1A,0xCE,0xDA,0x0A,0x86,0xCE,0x27,0x66,0x38, + + 0x2D,0x2F,0xCA,0xAB,0x2C,0x3B,0x1D,0x1C,0x85,0x0C,0xA2,0x6A,0x6C,0xF8,0xF3,0x6B, + + 0x88,0xCE,0x7C,0x1E,0x9F,0xEE,0x3B,0xEB,0x43,0xD5,0x72,0x87,0x4E,0x23,0xEB,0x1A, + + 0x2E,0xCD,0x53,0xA1,0x8F,0xE2,0x83,0xF3,0x6A,0x49,0xA1,0x7B,0x78,0xAE,0x95,0xF1, + + 0x87,0xDF,0xA2,0xB4,0x54,0x10,0xCC,0x86,0x85,0x7F,0x0C,0x5C,0x64,0xBD,0xF3,0x12, + + 0x52,0xE4,0xA4,0x03,0x06,0x75,0x86,0x4C,0xE8,0xB3,0xA6,0xB4,0xC6,0x6C,0x24,0xFC, + + 0x03,0xD3,0xDA,0xF9,0x3B,0x04,0x23,0x5C,0xD7,0x94,0xCA,0x60,0x2A,0x2F,0xED,0xE3, + + 0xD5,0x68,0x17,0xE7,0xBD,0xBA,0x43,0x87,0xD6,0xF7,0xA7,0xB5,0x67,0xFB,0x45,0xB4, + + 0xD9,0xFA,0xC5,0x32,0x10,0xB0,0x24,0x66,0x2E,0xD5,0xCE,0x0E,0xEE,0x3B,0xD3,0x41, + + 0x4F,0x5A,0x7E,0x26,0xB7,0xAA,0x25,0xF8,0x82,0x2A,0x01,0xD8,0xD4,0x6E,0x03,0xF2, + + 0xA7,0x56,0xAD,0x00,0x4B,0x10,0x33,0xE7,0xCF,0x5B,0x65,0x63,0x8B,0x92,0x4D,0xC3, + + 0x46,0x8C,0x76,0x5D,0xB6,0x47,0x91,0x60,0x8F,0xDF,0xD9,0x0E,0x76,0x0C,0x66,0x76, + + 0x90,0xDA,0x27,0x7A,0x38,0xA3,0x8E,0xCA,0x24,0x73,0x34,0xF0,0x8D,0x24,0x94,0xDD, + + 0xEF,0x9B,0x54,0x9C,0x73,0x34,0x5E,0xF0,0xBD,0xD4,0x59,0x3A,0x00,0xDB,0x76,0x8B, + + 0x9F,0x7E,0x81,0xFC,0xD4,0x7B,0x21,0xAA,0x93,0x9A,0x18,0xD4,0x21,0xE1,0x67,0x0A, + + 0xE9,0x9D,0xF6,0x89,0x5A,0xBF,0x4D,0xBA,0xE7,0x56,0xF7,0x3B,0x08,0xB4,0x47,0x3C, + + 0x1D,0x88,0xBF,0xBB,0x9B,0x43,0xF4,0x95,0xA4,0x7D,0x97,0x12,0xE2,0xBC,0xAB,0x7A, + + 0x31,0x14,0x41,0x38,0x2F,0x40,0x27,0xF0,0x88,0xB3,0x59,0x5E,0x96,0xF4,0xDD,0x2B, + + 0xAA,0xD0,0xE6,0xA9,0x8D,0x28,0x8D,0xE9,0xAE,0x53,0x3D,0x40,0x2A,0x0F,0xAF,0xA6, + + 0x84,0x84,0x17,0xDD,0x99,0xA4,0xBF,0x86,0x09,0x9D,0xD8,0x1D,0x1F,0x5E,0x38,0xFF, + + 0xE9,0x0F,0x98,0x34,0xE7,0x8F,0x29,0x53,0x61,0xC1,0x87,0x3F,0x20,0xF4,0x48,0xE3, + + 0x27,0xDC,0xB6,0x25,0x9C,0x87,0x66,0x19,0xA8,0x70,0x00,0xB0,0x2C,0x80,0xD5,0xFF, + + 0x7D,0x83,0x13,0x77,0x7B,0x83,0xEA,0xD2,0xF4,0xCF,0x04,0x1B,0xF9,0x97,0x5B,0xBE, + + 0x6A,0x20,0x42,0xD5,0xBC,0x8E,0xB5,0xA2,0x96,0x49,0x2E,0x09,0x25,0xD2,0x41,0x26, + + 0xE9,0x55,0xC8,0x80,0xF3,0x8B,0x38,0x02,0xB5,0x06,0x56,0x99,0xC0,0xBF,0x5B,0x23, + + 0x37,0xA4,0x91,0x7B,0xB6,0x83,0xFB,0x45,0x9B,0x84,0x81,0x5A,0xF6,0x3A,0x7B,0xB2, + + 0xBE,0xA9,0xD4,0xB6,0xA6,0x48,0x53,0x8C,0x1E,0x57,0xF3,0xE1,0xC9,0x98,0x71,0xAE, + + 0x6A,0x36,0x58,0xDD,0x36,0x81,0x7A,0x40,0x41,0x43,0xD8,0x13,0x6C,0xDC,0x58,0x4A, + + 0x74,0xA7,0x93,0x3D,0xB9,0xD7,0x1A,0x5B,0x2C,0xC9,0x52,0x3C,0x67,0x73,0xBD,0x1E, + + 0xFE,0xA2,0x35,0x2C,0xA8,0xD6,0x0C,0xC6,0x22,0x3A,0x25,0xDA,0x7D,0x25,0xA3,0xF9, + + 0x00,0xD9,0xBD,0x38,0xB6,0xF5,0x11,0xD6,0x29,0xE9,0xA3,0x53,0x7F,0x7A,0xDE,0x19, + + 0x41,0x02,0x30,0xAD,0x61,0xF4,0x1B,0x2A,0xFD,0xD8,0x5B,0x7B,0x93,0x27,0x96,0xB6, + + 0xF7,0x8D,0xD7,0x8C,0x1E,0x01,0x42,0x0A,0xBD,0x29,0x92,0x94,0xE6,0x97,0xB1,0x27, + + 0x38,0xED,0xF2,0xA2,0xB7,0x20,0xDE,0x06,0x2A,0x18,0x16,0x0D,0xB2,0xFC,0xE7,0xB6, + + 0x6B,0xDD,0xB5,0xC9,0xE7,0x0D,0x6B,0x19,0x81,0x45,0xB2,0x91,0x1A,0x2C,0xE0,0x1E, + + 0x85,0xD3,0x36,0x13,0x6E,0x73,0x43,0x7D,0x62,0x81,0x68,0x50,0xE8,0x8F,0x7C,0x2D, + + 0xCB,0x83,0xFB,0x7C,0x30,0x4B,0x94,0x92,0x94,0x5F,0x6D,0xAC,0xD5,0x0F,0x8C,0x54, + + 0xBA,0x0A,0x53,0xD6,0x46,0x36,0xA7,0x01,0x09,0xFE,0xE5,0xDA,0x10,0x75,0xB2,0xA9, + + 0x54,0xF3,0x90,0x74,0xD6,0xC3,0x03,0x95,0x0B,0x93,0x79,0x3E,0x93,0x76,0x3C,0xF7, + + 0x80,0x92,0x4D,0x41,0xCA,0x5F,0x0B,0xA0,0xD9,0x57,0xFC,0xF5,0xBD,0x70,0xC4,0x3B, + + 0xC3,0xB7,0x7F,0x9E,0x34,0xCD,0x5E,0x9F,0x43,0x14,0xAC,0xC3,0x11,0x21,0x97,0xFF, + + 0x25,0x0F,0xF3,0x36,0x7B,0x64,0x7C,0x0E,0x98,0xCA,0xA4,0xD3,0x9A,0xE4,0x50,0x3B, + + 0xDD,0x14,0x91,0xBF,0x11,0x53,0x69,0x37,0x03,0xAD,0xAD,0xC2,0x1B,0x07,0x26,0xAE, + + 0xF6,0x1E,0xF3,0xF9,0x90,0x77,0xE8,0xD9,0x57,0xB6,0xA5,0xD2,0x1A,0x06,0xEA,0x1A, + + 0x64,0x10,0xDF,0xBB,0x9D,0x9E,0x63,0x8C,0x89,0xF7,0x56,0x38,0xFF,0xDA,0x9E,0x64, + + 0xA1,0xE2,0x11,0x0D,0x3A,0xD9,0xAC,0x5E,0x79,0x16,0x5A,0x43,0xF6,0x04,0x05,0xEF, + + 0xEA,0x55,0x16,0xFE,0x80,0x78,0x81,0x5A,0xD8,0x41,0xB7,0x29,0x05,0x16,0x27,0x1D, + + 0xC8,0x8A,0xB1,0xB4,0x1E,0x2B,0xC4,0x97,0x96,0xCC,0x78,0x4D,0x79,0x64,0xC6,0xAB, + + 0xED,0x70,0xC0,0xE5,0xBA,0x5B,0x63,0xDC,0xDA,0xFD,0xAE,0xCB,0x93,0xED,0x4A,0x98, + + 0x2F,0x53,0xCE,0x24,0xBA,0xC6,0x76,0x9A,0x96,0x51,0x74,0x89,0xD8,0x18,0x1E,0xC7, + + 0x4F,0x98,0x07,0xB0,0x6C,0x85,0x97,0xEC,0x49,0x83,0xAF,0xC9,0x1B,0x78,0x8F,0x25, + + 0x23,0xE4,0x8F,0x21,0x07,0x7D,0x67,0x7B,0x6B,0x1E,0xA7,0xDA,0x58,0x1A,0x73,0x2D, + + 0x26,0xD5,0x9E,0x32,0xAB,0xFB,0x85,0x0A,0xF0,0x21,0xF2,0x60,0x42,0xA2,0x7C,0x16, + + 0x02,0xBF,0xD8,0x92,0x73,0xBB,0xF8,0xF6,0xDE,0x6C,0xE6,0xB2,0x34,0xAF,0xB6,0x38, + + 0xA2,0x17,0xA1,0xFE,0x15,0x39,0x06,0x17,0x34,0x63,0xAF,0xC8,0xD2,0x6B,0x84,0x6C, + + 0x18,0xDF,0x97,0x26,0xFD,0xAE,0xA8,0xC2,0x66,0x83,0x55,0xDF,0x49,0x2E,0xA4,0x88, + + 0xBD,0xFB,0x59,0xE3,0xDC,0xA9,0x10,0x60,0x26,0xC9,0x5C,0xC3,0x83,0x87,0xB7,0x52, + + 0x70,0x8A,0x5F,0x6E,0xE2,0xC6,0x18,0x70,0x63,0xC8,0xD3,0x08,0x86,0xA7,0x3E,0xC3, + + 0xF5,0xF3,0x9C,0xAD,0x62,0xD7,0x8A,0x44,0x67,0x39,0x5A,0xAD,0x6D,0x59,0xA9,0x52, + + 0xAE,0xC5,0x8F,0x35,0x6C,0x38,0x02,0x54,0x66,0x3E,0x66,0xE9,0xA8,0xE5,0x99,0x44, + + 0x67,0x69,0xB0,0xB4,0xF7,0xEC,0x00,0x14,0xEF,0x69,0xD0,0x2F,0x4E,0x25,0x75,0x9A, + + 0x7E,0xFE,0x0E,0x60,0xBE,0xCC,0x6C,0x0F,0xA6,0x28,0xE3,0x24,0xB8,0x16,0x07,0xFA, + + 0xBC,0x86,0x99,0xBF,0x28,0x05,0x22,0xD8,0xFC,0x17,0xD1,0x2F,0xDD,0xE9,0xEB,0x66, + + 0x01,0x2F,0x14,0xFD,0x74,0x6A,0x05,0x5B,0xA6,0xC4,0xC4,0xD7,0x39,0xA6,0xFD,0xEB, + + 0xAF,0x73,0x22,0x4B,0xBD,0x21,0x2A,0x6E,0xBF,0x15,0x29,0x41,0x58,0x46,0xC5,0xAC, + + 0x1F,0x70,0x93,0xDA,0x5C,0x66,0x25,0x6F,0x30,0xCC,0xA0,0x50,0xFC,0x88,0xD7,0x29, + + 0xBD,0xDA,0x3E,0x4D,0x29,0x91,0x6B,0x6F,0x67,0x00,0x53,0xED,0x1B,0x07,0x91,0x28, + + 0xBB,0x0E,0xC4,0x20,0x46,0x33,0xA0,0x79,0xC9,0x15,0xA1,0xAE,0x7C,0x8A,0xFF,0x81, + + 0x5B,0x9C,0x9A,0xAA,0x93,0x1D,0xE9,0x72,0xD3,0x6F,0x2D,0x2C,0x75,0xB0,0xB3,0x54, + + 0x23,0x38,0xBD,0xE4,0x5F,0x50,0x8D,0xD4,0x8E,0xA2,0x7C,0xCB,0xF9,0x5A,0xE5,0x2B, + + 0xA4,0xD0,0x37,0xB6,0x84,0x1D,0xF5,0x6A,0x10,0xC9,0x5D,0x2B,0x73,0xB0,0xC8,0x17, + + 0x84,0x31,0xD3,0xA2,0xFD,0x12,0x3C,0xD5,0x0E,0x40,0xC5,0xB3,0x15,0x8C,0x4C,0xF9, + + 0x03,0x01,0xAA,0xC0,0xCE,0x25,0x4C,0x1C,0xCA,0xD9,0x8C,0x0E,0xE2,0x3B,0xCB,0xFA, + + 0xF3,0x74,0xBE,0xDE,0x92,0x1A,0x14,0x90,0x98,0xDB,0x6C,0x1E,0xA3,0x35,0x79,0x47, + + 0xB5,0x08,0xBC,0xE9,0x13,0x19,0x88,0x67,0x9B,0x87,0xF4,0x11,0x73,0xB4,0x4A,0xE7, + + 0x77,0x36,0xBB,0x3A,0x25,0xEC,0x45,0x0D,0xE1,0x57,0x3D,0x92,0x1E,0xEC,0x1C,0x62, + + 0x36,0xD7,0x86,0x18,0x4B,0xED,0xEB,0xC0,0x5B,0x6D,0x07,0x4C,0x0B,0x8F,0x70,0xAE, + + 0xAC,0x32,0xF5,0x9E,0x3B,0xA3,0xE1,0xD0,0x1A,0x6C,0x3E,0x77,0x89,0xE2,0xB7,0x7A, + + 0xC4,0xBE,0x78,0x35,0x44,0x60,0x68,0x2B,0x9F,0xAF,0x68,0x2F,0x1D,0x45,0xB9,0xA0, + + 0xC6,0x8A,0xC4,0x80,0xC9,0x6F,0xFF,0x7F,0x76,0x76,0x0E,0xD9,0x16,0xCA,0xDD,0x88, + + 0x8F,0x61,0xC4,0x33,0x3C,0x67,0xAB,0xF4,0x52,0x28,0x55,0x98,0xF1,0x7A,0xD9,0xBE, + + 0x29,0x64,0xB7,0xF0,0x9A,0xE2,0x1C,0x05,0x86,0xAC,0xE0,0x71,0x79,0xE4,0x4F,0xA9, + + 0x5A,0xB7,0x52,0x4B,0xB1,0x4C,0x64,0x2C,0x07,0x4F,0x77,0xAF,0xEE,0xBC,0xF9,0x19, + + 0x0E,0x60,0xEE,0xB9,0x00,0x04,0x65,0xF9,0x2D,0xDB,0xB8,0x39,0xF1,0xBE,0xBF,0x30, + + 0x4C,0x1B,0xA0,0x32,0xB1,0xFF,0x4B,0x0F,0x3B,0x42,0xCA,0x56,0xAB,0x22,0x10,0x20, + + 0xF6,0xA0,0xF7,0x6A,0xFA,0x48,0xC3,0xF2,0x47,0x61,0xB8,0xB0,0x0E,0x9B,0x30,0xE7, + + 0xA4,0xAF,0xE1,0x07,0x78,0x2F,0xCC,0x20,0xBF,0x42,0x5E,0xAF,0xD6,0x7B,0x31,0x0E, + + 0x22,0x86,0xB6,0xE6,0xF0,0x25,0x05,0xD9,0x4D,0x88,0x42,0x7F,0xAE,0xD5,0x60,0xE3, + + 0xA3,0x0D,0x8E,0x26,0x90,0x38,0x51,0x93,0x12,0xC9,0x7D,0x06,0xD0,0x88,0x16,0xB2, + + 0x0F,0x80,0xA8,0x56,0x08,0x28,0xA2,0xF2,0xC3,0x9C,0x34,0x16,0xB1,0x9A,0x07,0x23, + + 0x65,0xCB,0x36,0xC1,0xEF,0x92,0x2F,0x78,0xF1,0x40,0xED,0x87,0x50,0x62,0xFA,0xB3, + + 0xB0,0x47,0xA9,0x02,0x52,0x65,0x61,0x8E,0xCD,0x25,0xDE,0x07,0x51,0x7B,0x10,0x08, + + 0xF7,0xA5,0xA2,0xF1,0xB9,0xA2,0x1B,0xAA,0xF4,0x4A,0x4F,0xBC,0x23,0x97,0xD7,0x19, + + 0x0D,0x29,0xB4,0x6C,0x50,0x40,0x42,0x98,0xCB,0x3C,0xB3,0xC1,0xEF,0x12,0x7B,0xB9, + + 0x2B,0xD5,0x77,0xE5,0xDB,0x65,0x2B,0xD6,0xA9,0x82,0x53,0xF0,0x4A,0xB1,0x17,0xE5, + + 0x01,0xF0,0xD3,0x14,0x3C,0x20,0xDB,0x5B,0x3E,0xB6,0x9D,0x4F,0x22,0x29,0xE9,0x0F, + + 0x04,0xD0,0x5D,0x57,0x98,0x28,0x18,0xF5,0xA1,0x1C,0xF5,0x8E,0xD8,0x80,0xAA,0xAE, + + 0x38,0x54,0xAA,0x0B,0x8A,0x22,0x5D,0x74,0xA2,0xDD,0xE6,0x9E,0xD9,0x71,0x87,0x83, + + 0x31,0x15,0x8E,0x2F,0xD9,0xDE,0x43,0xE9,0x96,0xEA,0x7E,0x0F,0x58,0x82,0x71,0xBF, + + 0x9B,0x84,0x7F,0x2F,0x38,0x29,0xB7,0xEA,0x93,0x47,0xFC,0x1F,0x54,0xE9,0x3E,0x68, + + 0xEC,0xDF,0x82,0x74,0x34,0x7F,0x4D,0xA7,0x95,0x9F,0x16,0xE4,0x7C,0xDB,0x36,0x63, + + 0x49,0x8A,0x74,0x96,0x77,0x9C,0x54,0x78,0x45,0x1D,0x13,0xD6,0xB0,0xFB,0x5C,0xAA, + + 0x07,0x53,0xA5,0x08,0xD3,0x30,0x6A,0x5C,0xE8,0x10,0x06,0xB1,0x72,0x76,0xB8,0x68, + + 0xA3,0x68,0x11,0x35,0x5C,0xF3,0x89,0xC3,0x63,0x4F,0x1A,0xA5,0xC2,0xA8,0x1B,0x13, + + 0x1D,0x45,0xFB,0x46,0xB2,0xE0,0xC7,0xD1,0x76,0xD6,0x9E,0xF9,0x41,0xED,0xE7,0x2D, + + 0x09,0x8E,0xAC,0x9E,0x9D,0x3A,0x24,0xE2,0x50,0x0E,0x85,0x80,0xD4,0x6E,0x85,0x19, + + 0xE4,0xCD,0xFD,0x97,0xF1,0xC6,0x2B,0xDD,0x2A,0x06,0x2D,0x87,0xB1,0x86,0x6D,0x28, + + 0x4D,0x6C,0x79,0xA7,0x10,0x31,0xA7,0x75,0x95,0xAE,0xC6,0x93,0xD0,0x17,0x86,0x75, + + 0x28,0xC3,0xDF,0x74,0x9D,0xB0,0xE4,0x4A,0xEA,0xB4,0x6E,0xCA,0x87,0xF1,0xD5,0xB7, + + 0x56,0x1B,0xDE,0xFF,0x7D,0x22,0xB6,0x25,0x82,0xB3,0x0D,0x8C,0x71,0xC6,0x3F,0x0D, + + 0xA0,0x33,0xC3,0x6B,0x51,0x53,0x28,0x4B,0x03,0x60,0x93,0xCD,0xBA,0xD7,0x50,0x32, + + 0xAF,0xC1,0xD4,0xFB,0xF8,0x79,0xB7,0x20,0x6C,0x89,0xA5,0x18,0x0A,0x15,0x85,0x4C, + + 0x79,0xDE,0xEF,0x6B,0x9B,0x37,0x36,0xEA,0x51,0x51,0x8C,0xFD,0xDD,0x67,0x04,0x45, + + 0xC0,0x8D,0xCB,0x5E,0xAA,0x5A,0x99,0x7A,0xA6,0x50,0x84,0xF4,0xDC,0xD9,0x27,0xCB, + + 0x8F,0x13,0x47,0xEA,0x1B,0x35,0x93,0x6C,0xE4,0xD4,0x4D,0x8B,0xD9,0x1E,0x77,0x7C, + + 0x2D,0x1D,0x95,0xD8,0x18,0x5A,0x27,0x9B,0xC8,0x3F,0xC7,0xC1,0xFD,0x86,0x08,0x86, + + 0x36,0x80,0x22,0xF7,0x39,0xC0,0xAB,0xDD,0xC6,0xB5,0x7F,0xAC,0x23,0x3C,0x63,0xFA, + + 0xA1,0xC3,0x88,0xEB,0xB4,0xA2,0x2C,0xB0,0xF9,0xE3,0x82,0xCD,0x53,0x1B,0x78,0x89, + + 0x82,0x22,0xFF,0x77,0x6B,0xA4,0x73,0x41,0xB9,0xC9,0x6E,0xFE,0xEB,0x42,0x2F,0x38, + + 0x83,0x7A,0x15,0x8E,0x7C,0xCA,0x01,0xCC,0x27,0xAB,0xD8,0xB5,0x55,0x1B,0x68,0xA4, + + 0x84,0x80,0xC9,0xF9,0xB7,0xAF,0xF7,0x71,0x16,0x94,0x71,0x26,0x5A,0x6F,0xEF,0x32, + + 0x5B,0x88,0xA9,0xD4,0x97,0x9F,0x94,0xE0,0x5B,0xCD,0x9C,0x14,0x14,0x15,0x82,0x21, + + 0x47,0x0C,0x61,0x60,0x37,0xAD,0x51,0x6F,0x2F,0x96,0x70,0x85,0x54,0xE2,0x43,0x83, + + 0xDB,0x2C,0xD1,0xB7,0x91,0xA1,0xFD,0x82,0xD3,0xB7,0x99,0x20,0x42,0xE8,0xCA,0xE2, + + 0x9E,0xCA,0xF2,0x79,0x50,0xB3,0x77,0xA8,0xF0,0xAA,0x8A,0xFE,0x00,0x47,0x96,0x9E, + + 0x45,0x2E,0x8A,0x2B,0xF4,0xC0,0xC5,0xB8,0xF1,0x6B,0x29,0x3F,0xDD,0xB9,0x25,0xD3, + + 0x8A,0x73,0xF8,0xFF,0x94,0xE5,0x0B,0xD5,0x31,0x13,0x20,0xCF,0x94,0x41,0x2B,0x1B, + + 0x8D,0x8B,0xF2,0xE7,0xBF,0x86,0x03,0x46,0xEE,0x9B,0x85,0x03,0x52,0x6D,0x1A,0x6A, + + 0xEE,0xB7,0xCB,0xF1,0x18,0x55,0x4C,0x72,0xC3,0x6A,0x92,0x6C,0xD4,0xE1,0x2F,0xBD, + + 0x78,0x41,0x2A,0x23,0xE6,0xAB,0x79,0x46,0xCF,0xAD,0x54,0x28,0xFC,0xEB,0xFE,0xAC, + + 0x67,0x81,0xDC,0xCD,0x53,0x22,0x74,0x2B,0x86,0x6A,0xD9,0xBF,0x82,0xE8,0xB4,0xF2, + + 0xFC,0x8B,0x45,0x15,0x99,0x56,0x5D,0x62,0xBB,0x62,0xDB,0x7C,0x7E,0x63,0x2E,0xFD, + + 0x05,0xE0,0x5C,0x6E,0x6C,0xFD,0x54,0xE8,0x8E,0xDF,0x0B,0x3D,0x85,0x79,0xAC,0x52, + + 0x9E,0x31,0x88,0xA5,0xB0,0x41,0x72,0x54,0x8E,0x1B,0xDD,0xF6,0x31,0x5C,0x1B,0xB2, + + 0x29,0x14,0xBF,0x83,0x97,0xF2,0x6C,0x5E,0x43,0xC9,0x95,0x4D,0x97,0xF6,0x3B,0x91, + + 0x76,0x48,0x05,0x86,0xC2,0x97,0x43,0xC2,0x8E,0x2A,0x2E,0xA7,0xC6,0x28,0xD0,0xA0, + + 0x65,0x66,0xDE,0x24,0xB4,0xB0,0x2E,0xFF,0xC5,0xD2,0x8E,0x46,0xD7,0x94,0x52,0x54, + + 0x77,0xF0,0x8C,0x9C,0xEF,0xBA,0xFB,0x70,0xAA,0xA9,0xE7,0x72,0x0A,0xAF,0x1B,0xDA, + + 0x07,0xD3,0x09,0xA5,0xF5,0x46,0x55,0x2F,0x47,0x5C,0xD3,0x3B,0x82,0xED,0x55,0x03, + + 0xFB,0x38,0x8D,0xD5,0x38,0xBA,0x05,0x91,0x8C,0xD8,0xA4,0x8F,0x50,0x53,0x06,0x77, + + 0x61,0x03,0x79,0xDA,0x4F,0xBC,0xC9,0x28,0xEC,0x12,0x4E,0x2C,0xFC,0x72,0x5B,0x1E, + + 0x7E,0x5B,0x6E,0x46,0x7B,0x62,0x3C,0x38,0xFC,0xAD,0xDE,0xBC,0x72,0xF4,0x92,0x72, + + 0xAE,0xE1,0xF8,0xC7,0x83,0x3A,0x0F,0xF9,0xAF,0x2A,0x8F,0x47,0x7A,0x35,0xEF,0xF3, + + 0x30,0xDA,0x8B,0x62,0xEC,0xC0,0x47,0xFD,0xF1,0xDD,0xE6,0xA0,0x1A,0xFD,0x7E,0x22, + + 0xAC,0x57,0xCC,0x1E,0x62,0x17,0xF7,0xD8,0xCD,0xDA,0x3D,0xD2,0x78,0x05,0x69,0x29, + + 0x78,0x86,0x40,0xBD,0x9C,0xB0,0x34,0xE7,0xED,0xC1,0xD8,0x9E,0x0B,0x70,0x47,0xB8, + + 0xFE,0x3F,0x9F,0xC3,0x5E,0xB8,0x57,0x27,0x4F,0x52,0x8D,0x4F,0x5F,0x9E,0xAF,0x3D, + + 0x8F,0x0F,0xB7,0xD7,0x3D,0x53,0xDC,0x19,0x6D,0xDB,0x9F,0xB5,0x4D,0xF0,0xB4,0xE2, + + 0x63,0xFF,0x87,0x62,0x71,0x60,0x2B,0x53,0x69,0xC6,0x4B,0x24,0x56,0xDA,0xBC,0xF2, + + 0x83,0x05,0xD7,0x76,0x3F,0x67,0x3C,0x30,0xE0,0x48,0x82,0x30,0x70,0xBB,0x61,0x56, + + 0x7D,0x0D,0x99,0xED,0x12,0x26,0x13,0x61,0x84,0x44,0x64,0xCD,0x88,0x2F,0xE1,0x73, + + 0x0E,0x85,0x8C,0x97,0x11,0x8A,0xE0,0x42,0xE0,0x5C,0xF9,0x37,0xE0,0x6E,0xF8,0xBE, + + 0xC3,0x67,0x43,0xC0,0x4D,0x2E,0x09,0xFD,0xE5,0x42,0x33,0x9A,0x76,0x7F,0x42,0xF0, + + 0xBC,0xB0,0xF2,0xCB,0xEC,0xA8,0xF5,0x0C,0xE0,0x48,0xC0,0x6B,0xF0,0xE0,0x95,0x91, + + 0x03,0xFE,0x29,0x7A,0xB6,0x4A,0x71,0x63,0x63,0x40,0x11,0x03,0x2D,0xCB,0x51,0x6E, + + 0x97,0x45,0xAB,0x55,0x64,0x3C,0xF5,0xE3,0xD7,0x4D,0x49,0x27,0x90,0x97,0x02,0x48, + + 0x7A,0x05,0xBA,0xFF,0x60,0x2B,0x28,0xC1,0x6B,0x27,0x69,0xAE,0xD8,0x81,0x40,0xF2, + + 0xE2,0xD8,0x1D,0x7E,0xFA,0xD6,0xE6,0x4B,0x1E,0x56,0x0F,0x47,0xB2,0xF8,0x79,0x69, + + 0xBA,0x07,0x86,0xD8,0x1A,0x2E,0x2A,0x18,0x69,0x78,0xAB,0xD6,0x2D,0xC5,0x55,0xFB, + + 0x88,0x8E,0xEB,0x1F,0xED,0x26,0x21,0xD0,0xEE,0x24,0xFB,0x3F,0xEC,0x66,0x8D,0xEE, + + 0xEB,0x0D,0xDC,0x0B,0xBF,0xDA,0xD6,0x98,0xB5,0x43,0xAA,0x4B,0xBB,0x63,0xFF,0x38, + + 0xF0,0x09,0xB2,0xD4,0xBE,0xA4,0xC5,0x58,0x4D,0xB4,0x80,0x7E,0xE8,0xB4,0x40,0x5C, + + 0x61,0xB6,0x78,0x3D,0x1A,0x81,0x33,0x6B,0xFD,0x0C,0x43,0xAA,0x27,0xD8,0xC9,0xAA, + + 0xD2,0x7A,0xEB,0xCE,0x38,0x6E,0x68,0x3B,0x6A,0xB2,0xBA,0x59,0xE8,0x3A,0x56,0x81, + + 0xF9,0x91,0xA4,0x68,0x91,0x2B,0xEF,0x22,0xE0,0x08,0x23,0x9D,0x76,0x89,0x6C,0xC7, + + 0xDC,0x1E,0xD5,0x96,0xD6,0x2A,0xB4,0x34,0x2E,0x92,0xB4,0xD6,0x77,0x88,0x05,0x7E, + + 0x59,0xC1,0xC7,0x63,0x1C,0x3F,0x4C,0x65,0xE6,0xAB,0x26,0xE7,0x51,0x8F,0xB9,0xEE, + + 0x02,0x08,0xCF,0xF3,0x46,0x9E,0x27,0x42,0xFD,0x48,0x34,0x31,0x8C,0x22,0x44,0xC4, + + 0xAB,0xE9,0x71,0x78,0xD9,0x50,0xEB,0xA2,0xC3,0x16,0xF4,0xC0,0xD3,0xCB,0x66,0x55, + + 0x2D,0x9F,0x33,0x3C,0x5E,0x78,0xCD,0x32,0xC2,0xAA,0x24,0xD0,0x40,0x05,0x25,0xC3, + + 0xD1,0x1B,0x55,0x2D,0x6E,0xFB,0xCA,0xAF,0xE4,0xAF,0x6E,0x03,0x0B,0x66,0xC9,0x39, + + 0xE5,0x58,0xB6,0xDD,0x16,0x88,0x35,0x93,0x14,0x15,0x65,0x0B,0xE3,0x3A,0x9C,0x0C, + + 0x55,0x42,0x91,0xCB,0xEE,0x30,0x10,0x4E,0x5B,0x7C,0xFE,0xCE,0x87,0x76,0x6E,0xD2, + + 0x8F,0x16,0x0D,0x74,0xB9,0xF4,0x26,0x88,0x21,0x42,0x43,0x54,0x77,0x84,0x5E,0xFD, + + 0x0F,0x97,0x47,0xF2,0x6E,0x32,0xEF,0x2B,0x68,0x5D,0xAF,0x53,0xFE,0xFA,0x6F,0xD3, + + 0x47,0x14,0x74,0xEE,0xC1,0x55,0x5E,0x5F,0x4C,0x40,0x67,0x3F,0x79,0xD2,0x7E,0x18, + + 0x54,0x07,0x6A,0x53,0x59,0x38,0x54,0x05,0x59,0x58,0x2B,0xC8,0x49,0x6A,0x36,0xDD, + + 0xCB,0xB6,0xAF,0xF8,0x9E,0xC2,0x27,0x7C,0x5B,0x5D,0xBC,0xF8,0x33,0x48,0x57,0x2F, + + 0x0F,0xB5,0xBE,0xB7,0xDB,0x3A,0xE8,0x1F,0xEC,0x04,0x17,0xFC,0xA9,0x65,0x37,0xC8, + + 0x6B,0x19,0x14,0xDD,0x43,0xEE,0x9F,0x24,0x7E,0x1D,0xE5,0x15,0x2D,0x30,0xDF,0x80, + + 0x95,0x97,0x3F,0xE6,0x4C,0xAD,0x09,0x13,0xE5,0xF2,0x4B,0xA4,0xD4,0xD9,0x97,0xF0, + + 0x87,0x85,0x2F,0x02,0xB4,0xCD,0xC7,0x60,0x06,0x31,0x3D,0xD0,0xAC,0xF1,0x1F,0xE1, + + 0x27,0xE7,0x65,0x81,0xC8,0xA1,0xCD,0xCB,0x04,0x8F,0x89,0xDC,0x21,0xF9,0xC1,0x71, + + 0xC6,0x63,0x6D,0x92,0x13,0x03,0x60,0x25,0x62,0xC5,0x41,0x51,0xF6,0xA3,0x78,0x79, + + 0x12,0x71,0xD8,0xB5,0x62,0x71,0x58,0x00,0x40,0x3D,0x48,0x95,0x78,0xF4,0x08,0xF2, + + 0x0B,0x0E,0x57,0x19,0x82,0x78,0x10,0x10,0xB8,0xCB,0xB8,0x9A,0xEB,0xA4,0xE0,0xC7, + + 0xD9,0x51,0x74,0x78,0xE6,0xDA,0xD8,0xE7,0xBB,0x97,0x49,0x94,0xB4,0x9D,0x6D,0xB1, + + 0x81,0x7D,0x40,0x25,0x2C,0xB8,0x41,0x8D,0xC1,0x47,0x4E,0x4B,0x24,0x58,0x5C,0x36, + + 0x2D,0xFA,0xF2,0x0F,0x2A,0xA9,0x12,0x63,0xED,0x17,0xF3,0x48,0x7F,0xD8,0x12,0x2A, + + 0x0D,0x36,0x7A,0x7C,0xF6,0x18,0xB5,0xBE,0x30,0x85,0x42,0x36,0x3E,0x82,0xD8,0x89, + + 0x1D,0xBD,0xA4,0xBA,0x1E,0xAE,0x53,0x29,0xDD,0xD1,0xEA,0x22,0xBF,0x88,0x4B,0x51, + + 0x3F,0x86,0x1F,0x7D,0x62,0xAD,0x5B,0x39,0xD0,0xC6,0x43,0xBB,0xA0,0x8A,0xB2,0xA2, + + 0x56,0xC1,0x72,0x3D,0x2A,0x0D,0xAF,0x82,0x0C,0x31,0x09,0xEA,0x52,0xE3,0x46,0x25, + + 0x2F,0xBD,0x3E,0xA0,0x7C,0xAF,0xBA,0x07,0x6F,0x8F,0x40,0x81,0xA4,0xF6,0x79,0x4F, + + 0xAD,0xCE,0xDB,0xB0,0x77,0x9F,0x8B,0xE9,0x4E,0xB5,0x48,0x4B,0xED,0xA8,0xEB,0x18, + + 0x72,0x8E,0x7C,0xAC,0x1B,0x24,0xE4,0x41,0x4E,0xC2,0xE2,0x19,0x05,0x64,0x5A,0xEB, + + 0xCF,0x49,0x47,0x46,0x74,0x4D,0x30,0x44,0x0F,0xDF,0x8C,0x58,0xD8,0xFD,0x69,0x74, + + 0x23,0x98,0x8C,0xE7,0x94,0x1E,0x44,0x36,0x3E,0x35,0xFA,0x50,0x73,0x69,0x7C,0x83, + + 0x03,0x89,0x46,0xC7,0xF0,0xB4,0xE2,0x91,0x1B,0x07,0x19,0x39,0x88,0xE9,0x7D,0xE0, + + 0xF2,0x37,0xBA,0xB1,0xE9,0xF5,0x5D,0xF3,0x0B,0x58,0x32,0x33,0xF4,0x3D,0xC9,0xF4, + + 0x85,0x92,0xBF,0xC6,0x30,0xF4,0xE3,0x42,0x55,0x56,0xF5,0x00,0x52,0xF2,0x26,0xCF, + + 0x14,0xB7,0xA6,0x34,0xA6,0x48,0x4E,0x90,0xEA,0x23,0x9B,0x74,0xB2,0x5E,0x45,0x3F, + + 0x07,0x1A,0x48,0xB9,0x77,0xA9,0xCD,0x1C,0x64,0xAA,0x5F,0x82,0xF0,0x56,0x95,0xB5, + + 0x2A,0x11,0xC7,0x07,0xEB,0xAF,0x24,0x6B,0x40,0xD1,0x6D,0x07,0xF3,0xF8,0x3E,0x68, + + 0xCC,0x3C,0xA6,0x0C,0xBC,0x60,0x32,0x48,0xE9,0x2D,0x76,0x67,0x43,0xBA,0x20,0xFB, + + 0x0C,0xE9,0x96,0x8E,0x99,0x89,0x46,0xFC,0xD9,0xDF,0x84,0x1B,0x4E,0xFF,0x5F,0xEA, + + 0x47,0xD3,0x9F,0xC8,0xB2,0xBB,0x57,0xEB,0x52,0x57,0xFE,0x4F,0x58,0xF8,0xC3,0xE8, + + 0x88,0x1D,0x4F,0x9F,0xC2,0x32,0x6F,0xBE,0x4E,0xC0,0x35,0x40,0xCE,0xA9,0x60,0x0A, + + 0x22,0x17,0x76,0x26,0x5F,0xF1,0x26,0xE2,0x0D,0xFC,0x42,0x9C,0xDD,0xBD,0xB5,0xB8, + + 0x6C,0x6D,0x42,0x36,0x0E,0xF0,0x06,0x88,0x5C,0xF9,0x3A,0x7B,0x71,0x77,0x61,0x2D, + + 0x2C,0x9A,0x1C,0xC7,0x1B,0x41,0x0F,0x69,0xCC,0x0E,0x97,0xED,0xA7,0xF3,0x79,0xB9, + + 0xC7,0x92,0x08,0x20,0xAD,0xF2,0x85,0x08,0xF7,0x93,0x38,0xDB,0x1A,0x74,0xA7,0xA0, + + 0xD8,0x23,0x91,0x80,0x63,0x4B,0x2A,0x85,0xB3,0x02,0x50,0xDD,0x1C,0xFD,0x53,0x7B, + + 0xD4,0x6D,0xF0,0xFC,0x93,0x6C,0x8E,0x2B,0x71,0x03,0x75,0x10,0xC8,0x9C,0xC1,0xF9, + + 0xFD,0x40,0x3A,0xE7,0x3C,0xDF,0xDA,0xA8,0xE4,0xB6,0xE9,0x38,0x88,0xBC,0xCD,0x4F, + + 0x8F,0x1D,0x72,0x1D,0x34,0xDC,0x42,0x4C,0xC7,0xD8,0xB4,0xC5,0x2E,0x9C,0xD6,0x32, + + 0xE9,0xC5,0xD2,0xD9,0x14,0xBF,0x2E,0x49,0x21,0xBB,0x98,0x25,0xBB,0xC5,0x88,0xA8, + + 0x82,0x08,0xF0,0x65,0x6F,0x9A,0x26,0x4C,0xA8,0xB4,0x96,0x12,0xAC,0xC8,0x1B,0xEF, + + 0xEA,0xC7,0x1B,0x27,0x61,0x43,0x2F,0x59,0x29,0xF7,0xD3,0x96,0xB6,0x7D,0x51,0xC4, + + 0x7B,0xC6,0xF7,0x69,0xE1,0xB8,0x63,0x82,0xAF,0xCC,0x4B,0x32,0x0D,0x6D,0x7F,0xF7, + + 0x6B,0x28,0xBC,0x24,0x1E,0x93,0x2F,0x76,0xC5,0x2A,0x69,0xC4,0x13,0x25,0x30,0xA8, + + 0x98,0x4B,0x31,0xFE,0xB5,0xD4,0x61,0x4B,0x79,0x0B,0xCA,0xD4,0x12,0x24,0x15,0xA8, + + 0x63,0x4E,0x4A,0x89,0xEB,0xE1,0xB8,0xAC,0x5B,0x75,0xEC,0x5F,0x2B,0xC5,0x54,0x1F, + + 0xEA,0x66,0xF3,0xF5,0x41,0x66,0x40,0xD9,0xCF,0xD0,0x66,0x47,0x54,0x1D,0xF5,0x79, + + 0x0C,0x07,0x2E,0x37,0xC4,0xB1,0xA3,0x59,0x26,0x0E,0xC7,0x9C,0x75,0xCD,0x5F,0x26, + + 0xC1,0x1C,0x5B,0x67,0x63,0xB8,0x0B,0x88,0x5D,0xEC,0x9D,0x47,0x3F,0x98,0x43,0x0E, + + 0x77,0xA8,0x20,0x0D,0x8E,0x5B,0x08,0x2B,0x6B,0x47,0x41,0x87,0x7F,0x67,0x03,0x4C, + + 0x5F,0x1E,0xD8,0x62,0xAB,0x2B,0xCD,0xFD,0xB8,0x0B,0xCD,0xF9,0xF8,0x8B,0xFB,0x70, + + 0x64,0xB1,0x7F,0x74,0x1F,0xC1,0xD0,0x6A,0xDB,0xCF,0x20,0xC6,0xCF,0x1C,0x5E,0xDA, + + 0x27,0xAA,0xC4,0x80,0x52,0x5A,0xD5,0x34,0x12,0x9A,0x99,0xEA,0xC4,0xAD,0x51,0x72, + + 0x24,0x9F,0xFC,0xE3,0x3D,0xE4,0x2B,0x89,0xE6,0xE9,0x72,0xCB,0x26,0x78,0xAD,0x61, + + 0x10,0xB2,0x1A,0x7F,0x44,0x7C,0xDD,0x49,0x58,0x8F,0x32,0xDA,0x2C,0xCF,0x1F,0xC6, + + 0x83,0x94,0xBD,0xA2,0x13,0xC5,0x54,0xA7,0x9F,0xF2,0xC2,0xE6,0x90,0x81,0x13,0xB1, + + 0x25,0x8E,0xF2,0x19,0xF9,0x6F,0x14,0xE5,0xB7,0x84,0xE6,0x07,0x1B,0xFE,0x3D,0xB2, + + 0xCA,0x54,0x05,0x1C,0xE7,0x5A,0xC2,0x9F,0x28,0x87,0xC3,0xE1,0xDD,0x95,0x97,0xA2, + + 0x93,0x18,0xCF,0x2A,0x3E,0x9A,0xFA,0xCC,0x2B,0xB6,0x1C,0xC4,0x9B,0x35,0x52,0x7B, + + 0xAC,0x95,0xDC,0x69,0x40,0x27,0xBA,0x2D,0xBD,0x3A,0xAD,0xF7,0x28,0x7C,0xD7,0xC3, + + 0xD4,0xA5,0xB6,0xAD,0x98,0xC6,0x25,0xE7,0x6F,0xA3,0x0E,0x51,0x31,0xC2,0x55,0xDE, + + 0xAE,0x11,0xBD,0x6B,0x45,0x9B,0x7E,0x42,0x13,0xA6,0xBD,0xF2,0x01,0x86,0x24,0xE7, + + 0x78,0x59,0xB0,0xAC,0x18,0x9A,0xBE,0xC6,0x02,0x54,0x60,0x40,0xC1,0xA0,0xF2,0xBB, + + 0x12,0x13,0x89,0x5F,0x69,0xBC,0xC3,0xF9,0x06,0xF1,0x8D,0xEA,0xDB,0xFB,0xDE,0x5C, + + 0x58,0xE6,0xCF,0x1C,0x71,0xE0,0x56,0x4B,0x82,0xEC,0x1E,0x18,0x54,0xDD,0x41,0xF8, + + 0x82,0xF3,0x3C,0xB2,0x37,0xB8,0xC1,0xAE,0x28,0xFE,0x57,0xFC,0x06,0xDF,0xF2,0x3B, + + 0xCB,0x4D,0x63,0x4F,0xAB,0x35,0x25,0x19,0xE7,0xF2,0xC9,0x8E,0x93,0x13,0x36,0xA3, + + 0xEF,0xC4,0x5F,0xF6,0x59,0x01,0x0D,0x7C,0xC9,0xA2,0xF8,0x83,0x37,0xD1,0x70,0xFE, + + 0xD1,0xC2,0x17,0xF4,0x31,0x55,0x47,0x6D,0xB4,0x3D,0x80,0x5F,0x76,0x20,0x1B,0xB3, + + 0x49,0xC0,0xB0,0x83,0xE7,0xE6,0x9A,0xA6,0x57,0xFD,0xA2,0xA3,0xA7,0xA6,0x8E,0xB6, + + 0x6C,0x80,0x3F,0x93,0xCE,0x7B,0xF9,0xEE,0x51,0x37,0x0C,0x97,0x9D,0xE0,0xC7,0x6B, + + 0xCE,0x45,0xE1,0x69,0x2A,0x11,0x48,0x82,0x32,0x71,0x1C,0x8E,0x6B,0xA9,0xFA,0x15, + + 0xC5,0x25,0xFD,0xD2,0x30,0x9F,0x20,0x72,0xCA,0x38,0xF0,0x6E,0xAF,0x24,0xF7,0x52, + + 0xE2,0x2B,0x76,0x7D,0xE2,0x53,0xE7,0x5C,0xF6,0x84,0x16,0xEF,0x73,0x30,0x61,0x85, + + 0x6E,0x66,0xB3,0xDB,0xFF,0x66,0x1F,0x4A,0x32,0x61,0x4E,0x46,0xD1,0xCC,0xE2,0xF3, + + 0x0C,0xCA,0x15,0x3B,0x18,0xA3,0x27,0x59,0x20,0x8A,0xE8,0xAE,0x60,0xAA,0x17,0x44, + + 0x80,0xEB,0x92,0x8E,0xBE,0x22,0xE0,0xBE,0x3E,0xF4,0x7A,0xC7,0x74,0xAB,0x78,0xFF, + + 0x8A,0x11,0xDB,0x8D,0x59,0x1C,0x6C,0x2B,0xCA,0x51,0xE8,0x29,0x2D,0xE5,0x80,0x9E, + + 0x1E,0xB4,0x77,0x26,0x2E,0xE6,0x90,0x7C,0xC3,0x17,0xE0,0xCB,0x7C,0xB4,0x18,0x2A, + + 0x66,0x07,0x22,0xB6,0x9A,0x27,0x61,0xAA,0x02,0x18,0xA4,0x51,0x36,0xAE,0x31,0x5C, + + 0xE6,0x6C,0xCA,0x54,0xBE,0xA4,0xEC,0x56,0xB7,0x2C,0xDA,0x25,0xA3,0x4C,0x76,0x7A, + + 0xE6,0xCC,0xE7,0xAD,0xBA,0xA8,0x60,0x74,0xB6,0x6A,0xAF,0x42,0x96,0x2F,0x13,0x6B, + + 0x99,0xCD,0x39,0xAF,0xB0,0x5E,0xCC,0x52,0xC9,0xC4,0x3B,0x9A,0xB1,0x4F,0xA4,0xCD, + + 0xB1,0x4D,0x9C,0x7D,0x43,0x30,0x06,0x59,0x94,0xDF,0x01,0x22,0x2B,0xE6,0x1F,0x36, + + 0xDD,0xF2,0xF3,0x9A,0x94,0x2E,0x0E,0x8B,0x9A,0x7C,0xF2,0xD0,0x8A,0x5C,0x8C,0xCC, + + 0x59,0xEE,0xFF,0x1C,0xCC,0xF0,0x0B,0x8A,0x0F,0xDD,0x8F,0x54,0x9C,0xE9,0x9E,0x37, + + 0x59,0xF0,0x6D,0x6E,0xF9,0xBE,0x45,0x0B,0x12,0x92,0xAB,0xF0,0x2B,0xF9,0xA4,0x3A, + + 0xA2,0x1F,0x63,0xB9,0xE2,0xBB,0x67,0x10,0x47,0x9E,0x96,0xE2,0x77,0x19,0x33,0xB3, + + 0x21,0x0E,0xCD,0xB4,0xC0,0x48,0x69,0xC0,0x07,0x27,0x82,0xF0,0x96,0x76,0x61,0x21, + + 0x5B,0xD4,0xD7,0x38,0x34,0xB2,0x2B,0x01,0xE2,0x7B,0x65,0x17,0x5B,0x07,0xB7,0xA9, + + 0x04,0xF2,0x41,0x49,0xB6,0xD7,0xBD,0x0B,0x80,0xDA,0x53,0x04,0x7B,0xFA,0xE6,0x8E, + + 0xB1,0x65,0x4A,0x14,0x3D,0x38,0x91,0x82,0x6A,0x83,0x28,0x5E,0x53,0x59,0xD5,0xBE, + + 0xC6,0xFD,0x73,0x9E,0xC8,0x33,0xC5,0xB2,0xC8,0x26,0x73,0x4E,0x82,0x56,0xB2,0x74, + + 0x59,0xC9,0x7A,0x8E,0x3C,0xFA,0xE2,0x43,0x38,0x97,0xA1,0x45,0x59,0xF3,0x17,0xAA, + + 0x0C,0x24,0xAB,0xF2,0x9C,0x1B,0x61,0x59,0xE9,0x76,0xAE,0x4C,0xC5,0x54,0x59,0x28, + + 0x0A,0x68,0x6A,0x07,0x7E,0xFD,0x8D,0xCD,0xCF,0x7D,0x0D,0x1E,0x76,0x0D,0x0E,0xF5, + + 0x2D,0x90,0xA0,0xB8,0x7D,0x42,0xAD,0x04,0x04,0xD2,0xD7,0x0D,0xF3,0x20,0xF5,0x4F, + + 0x85,0xCA,0xDD,0x3C,0xD6,0xA5,0x60,0x14,0x07,0x4F,0x89,0xE9,0x1F,0x7D,0x11,0xF3, + + 0x03,0x92,0xD1,0xEE,0x32,0x49,0xFF,0x88,0xDF,0x5A,0x87,0x0F,0x4E,0x0E,0x7E,0x06, + + 0xE1,0x83,0x20,0xF4,0x18,0x2F,0x49,0xDC,0xE5,0x7C,0x96,0xF0,0x0C,0x45,0xF3,0xE0, + + 0x45,0xF0,0xD3,0x12,0xA4,0x2E,0x8D,0xDA,0xF8,0x0E,0xD1,0x09,0xE2,0x2C,0xAF,0xF2, + + 0x0C,0x0F,0xDB,0x2C,0xAC,0x60,0x1C,0x6A,0xA3,0xF8,0xC6,0x57,0x2F,0xE9,0x77,0x17, + + 0x60,0x80,0xA9,0x05,0x85,0x74,0x9C,0x9E,0x89,0x8D,0x81,0xC5,0xD7,0xD8,0x44,0xA2, + + 0x5E,0xF9,0xB8,0xC6,0x17,0x7E,0x30,0x21,0xC6,0x49,0xAE,0x55,0x31,0x36,0x7C,0x47, + + 0x27,0xF1,0x92,0xA9,0xB0,0x40,0xD0,0x1C,0x20,0x65,0x78,0x16,0xDC,0xE3,0x5B,0x45, + + 0xA3,0x46,0xB9,0xC7,0x97,0x2F,0x1B,0x9A,0x61,0x40,0xC7,0x54,0xD4,0xFD,0xDB,0xA1, + + 0x95,0x45,0x93,0xAA,0x30,0x21,0x21,0xF3,0xC2,0x25,0xDD,0x35,0x9B,0x92,0x2B,0xFB, + + 0x84,0xD5,0x84,0xDF,0x04,0x0C,0x28,0xC7,0x7B,0xE2,0x40,0xA8,0x2B,0xBE,0xA5,0x43, + + 0xBC,0xB5,0xD0,0xC5,0x6D,0x36,0xFD,0xF8,0x7E,0xC2,0xC5,0xB8,0x5F,0xF2,0x7B,0x2D, + + 0x55,0x77,0x63,0x29,0x79,0xF5,0xAB,0xD6,0x75,0x26,0x53,0xD4,0xD1,0x28,0x20,0x66, + + 0x58,0xA0,0x33,0xE2,0xDA,0xDB,0xC7,0x14,0x7A,0x06,0x2C,0xBF,0x59,0xD3,0x19,0x4B, + + 0xAB,0xA3,0x92,0x63,0xBB,0xA6,0x6A,0x38,0x4E,0x43,0xC4,0xE8,0x3D,0x1C,0x70,0xA6, + + 0xFE,0x61,0x06,0x3E,0x5A,0x6D,0x3A,0x38,0x4D,0x40,0x76,0xEE,0x13,0x65,0xD5,0xCD, + + 0xA1,0x5A,0x34,0xAF,0x18,0x66,0x6B,0x39,0x8A,0x41,0xD5,0x5C,0x33,0xCF,0x2D,0x6C, + + 0x88,0x2E,0xB3,0x3F,0xDA,0x0F,0x51,0x78,0x68,0x2A,0xE5,0x59,0xE8,0xC5,0x3F,0xB2, + + 0x40,0xA3,0x7F,0xFB,0xBD,0xE6,0x2A,0x24,0x03,0x92,0x20,0xC6,0x8B,0x1E,0x57,0xFB, + + 0xF4,0x7D,0x53,0xF6,0xC6,0xBE,0x64,0x40,0x3A,0x00,0x48,0x5C,0x52,0x3C,0xC5,0x79, + + 0xC7,0x50,0xCD,0x38,0xB6,0xA9,0xD5,0x59,0x0E,0xAF,0x55,0x5C,0x28,0x7A,0xC9,0xCF, + + 0xAF,0x0D,0x95,0x25,0xB7,0xA8,0x64,0xDA,0x46,0x57,0xFA,0x4E,0xE3,0x3E,0x29,0xE4, + + 0xA0,0x5C,0xFC,0x14,0xCC,0x3B,0x2C,0x62,0x63,0x33,0xAB,0x19,0x64,0xAF,0xC4,0x7D, + + 0x80,0x13,0xC4,0x36,0x9F,0xBE,0xA2,0x92,0x22,0x75,0x85,0x25,0xD6,0x7C,0xE3,0xB3, + + 0x01,0x10,0xA5,0x81,0x93,0xBD,0x6F,0x03,0x60,0x5E,0x60,0x61,0xAD,0x60,0x41,0xC5, + + 0xC0,0x57,0x49,0x37,0x31,0x3F,0x25,0x73,0xE2,0x90,0x4B,0x71,0xCC,0xCD,0x7B,0x77, + + 0x4B,0x05,0x19,0xEE,0xCB,0x5D,0x1A,0x58,0x50,0x29,0xF5,0x56,0xF5,0x3A,0x5C,0xCF, + + 0xC2,0x7D,0xD1,0x29,0x3F,0xA2,0x64,0x58,0x07,0xD2,0xFE,0xEB,0xB8,0x74,0x10,0x7A, + + 0x2C,0x97,0xBF,0x76,0x4D,0x78,0xD7,0x51,0x6C,0x57,0xC8,0xB6,0xFB,0xFB,0xB0,0x7B, + + 0x8D,0x00,0x38,0x6C,0x1A,0x7B,0xC3,0x94,0x5A,0x16,0xE4,0x9A,0x58,0xC4,0x3E,0x4A, + + 0x23,0x9C,0x06,0xAE,0x79,0x43,0x6E,0x38,0x36,0xD4,0x16,0x09,0x19,0x7A,0xF1,0x28, + + 0x63,0x12,0xB6,0xBE,0x78,0xE2,0xAE,0x9A,0x28,0xAD,0xAC,0xF8,0x77,0x15,0x45,0x2B, + + 0x28,0x36,0xBF,0xAF,0xF9,0x81,0x4F,0x0B,0x68,0x56,0x7D,0x76,0x5B,0x81,0x2F,0x98, + + 0x5E,0x12,0xB7,0x5F,0xBE,0xBE,0x55,0x79,0x48,0x59,0x92,0xFC,0x06,0x11,0x58,0x06, + + 0xF5,0xC2,0xB8,0x82,0x4A,0x5D,0x28,0xC2,0x27,0xF1,0x88,0xA3,0x5A,0x82,0x15,0x4C, + + 0x88,0xE3,0xAE,0xC2,0x95,0xB1,0x00,0xDC,0xA6,0xC8,0x3F,0xB2,0x2E,0xC9,0x7A,0xE6, + + 0x82,0x19,0xEB,0x1A,0xB5,0x22,0xA4,0xA7,0xB7,0x86,0xFB,0xBA,0xF6,0xEF,0x82,0x96, + + 0x16,0xBC,0xF3,0xB9,0xE1,0xE1,0x2B,0xC3,0x9E,0x92,0x79,0xCF,0x03,0xA1,0x3A,0xC2, + + 0x72,0xC6,0x98,0xC4,0x13,0x9D,0x48,0x32,0x66,0xCB,0x48,0x99,0x65,0xDD,0xF7,0x32, + + 0x09,0x0E,0x60,0x2E,0xB4,0xA3,0x18,0x32,0x41,0xC8,0x98,0x20,0x8D,0xEA,0x3A,0x45, + + 0x27,0x39,0xBB,0x46,0x35,0xA0,0x49,0x33,0xC7,0xC9,0x49,0x99,0x5B,0x10,0x7C,0x6A, + + 0x81,0x1C,0xE5,0xC0,0xD7,0xA8,0x33,0x88,0x64,0xCA,0xA0,0xA6,0x22,0xA8,0xDD,0xFA, + + 0xA1,0x39,0xF9,0x4C,0xFD,0xA7,0x4B,0x4C,0xF7,0x42,0xED,0x9A,0x5A,0x53,0x84,0xE9, + + 0x81,0x74,0xAC,0xC0,0x39,0x24,0x70,0xD8,0xD4,0x35,0x05,0xDE,0x10,0xEF,0x5D,0x0D, + + 0x6D,0x09,0x1C,0xE9,0xC8,0x7D,0xB4,0x4B,0x8C,0xF6,0x73,0xAB,0xAF,0x1F,0x53,0xEA, + + 0x2E,0xCB,0x54,0xF7,0xD6,0xE6,0x82,0x64,0xCB,0xA0,0x92,0x80,0x7C,0x74,0xC2,0xBA, + + 0xF1,0x83,0x82,0x0A,0x22,0x2E,0x78,0x7A,0xED,0xCA,0x29,0x30,0x21,0xF6,0xAA,0xA2, + + 0x8B,0x80,0xCE,0x3C,0x5C,0x12,0x02,0xF8,0x4E,0xA0,0x3A,0xA3,0xCD,0x60,0x39,0xC7, + + 0xE6,0x4F,0x9B,0x6B,0x1C,0xE6,0xFB,0x5B,0xAD,0xEE,0x2E,0x7E,0x3F,0x51,0x29,0xB9, + + 0xDB,0x8B,0x93,0xDD,0xBD,0xDA,0x03,0xF9,0xCE,0xAA,0x85,0xAB,0xE0,0x4F,0x83,0xF4, + + 0xCF,0x31,0x1B,0xB4,0x54,0x03,0xD8,0x31,0x0C,0xD8,0x74,0x5F,0xE6,0xF8,0xB9,0x16, + + 0x56,0x9D,0xD7,0xB1,0x94,0x0E,0x67,0x09,0xC4,0xDA,0x84,0x4C,0xD9,0xFC,0x1F,0x6C, + + 0xC7,0xC5,0x65,0x7F,0xD3,0xBF,0x22,0xD1,0x53,0x90,0x73,0x25,0x39,0xEE,0x15,0xF3, + + 0xFF,0x18,0x6D,0x6F,0xCA,0xBE,0x29,0x37,0x86,0x11,0xC2,0x5F,0xD2,0xBE,0x6E,0xC6, + + 0x85,0x99,0xDE,0x24,0x9A,0xBB,0x7C,0x40,0x05,0x24,0x96,0xE2,0x77,0x14,0x64,0x46, + + 0xC6,0x9A,0x94,0x54,0x15,0x15,0x1C,0xB2,0x29,0x55,0xB1,0xF2,0x53,0xB7,0x6F,0xC2, + + 0x05,0x90,0x85,0x83,0x7A,0x36,0x0D,0xC4,0x07,0xD9,0xAB,0x33,0xFA,0x9E,0x0D,0x93, + + 0x45,0x4A,0xD7,0x35,0x35,0xB4,0x05,0x71,0xE2,0xF3,0xA1,0x3C,0xF1,0x9C,0xE7,0xA7, + + 0x2A,0x03,0x66,0x77,0x39,0xFA,0x99,0xC4,0xB1,0x9A,0xD1,0x55,0x6E,0xB5,0x74,0x43, + + 0x11,0x86,0x71,0xFC,0x5D,0xA3,0xC8,0xC5,0xCE,0x52,0xE1,0x34,0x7C,0x39,0x87,0xE9, + + 0x8F,0x18,0xFC,0xB0,0xBA,0x21,0xEB,0xD8,0xEA,0x41,0xD4,0x55,0x71,0xB8,0x97,0x70, + + 0x8E,0x5B,0xD6,0x6F,0x3D,0xF4,0xFE,0x97,0xEB,0x40,0xDF,0xF5,0x17,0x70,0x1E,0xED, + + 0xD3,0x93,0xB3,0x2C,0xBC,0xBF,0x4E,0xBA,0x66,0xD3,0xDF,0x6A,0x11,0x07,0x64,0xDE, + + 0x8C,0x9B,0x6B,0x3C,0xBD,0xBE,0x74,0xF8,0xCC,0xDB,0xA0,0x6A,0x79,0x56,0x07,0x8A, + + 0x2A,0x93,0xA0,0x2D,0x3C,0xBD,0x17,0xAF,0x6E,0xD3,0x37,0x1F,0xA1,0xBC,0x67,0x7E, + + 0x4E,0x90,0x79,0x3D,0x9B,0x32,0xF7,0x2F,0x8C,0xBF,0x2A,0xDB,0xFF,0xFF,0x3A,0xF3, + + 0x6C,0x1B,0xE6,0xDC,0x9F,0xA6,0x05,0x11,0x61,0xBF,0xB7,0xA0,0x2B,0xCB,0xF0,0xE3, + + 0x69,0xAC,0xB6,0xD9,0xDB,0x7B,0x43,0x3E,0x47,0xDA,0xA0,0x5A,0xD0,0x6C,0x1C,0xE7, + + 0xB3,0xC8,0x83,0xC5,0xCD,0x4E,0xAA,0x90,0xF0,0x00,0xB9,0x47,0x69,0x6E,0x1F,0x56, + + 0x4B,0xD9,0x65,0x87,0xD1,0x2B,0xF4,0x71,0xC5,0x62,0x24,0x77,0x70,0x21,0xBB,0x67, + + 0xA3,0x66,0xC5,0xC0,0x5A,0x07,0xD3,0x93,0x29,0xE9,0xA8,0x8C,0x6B,0x29,0xFF,0x79, + + 0xFE,0x66,0x97,0x73,0x91,0xE9,0x62,0x9F,0x38,0xBA,0x64,0x33,0x5D,0x6A,0xBC,0x0F, + + 0x77,0x5A,0xA1,0x13,0x18,0x64,0x49,0x93,0x82,0xB9,0xC9,0x71,0xE9,0xB2,0x2F,0x33, + + 0x74,0xFA,0xAD,0xD1,0xE0,0x3B,0x99,0x98,0x2E,0xEA,0x49,0x07,0x28,0x25,0x0A,0x0C, + + 0x20,0x11,0x00,0x7F,0x43,0x81,0xD8,0x5B,0x2C,0x41,0xCD,0x74,0xA4,0xA3,0x74,0x1E, + + 0xE8,0x8A,0x97,0x7A,0xE2,0xA8,0x22,0xC7,0xA0,0x58,0x1E,0xDE,0xDA,0x64,0x59,0x8F, + + 0xE0,0xAB,0xC8,0x6D,0xE6,0x31,0x55,0x5A,0xF0,0xEB,0xE8,0xD6,0x2F,0x28,0xBA,0xEA, + + 0x05,0x06,0x57,0xF7,0xFA,0xD4,0xCF,0xC7,0xAA,0x9B,0x66,0xFF,0x78,0x34,0x55,0xB3, + + 0xFF,0x9F,0x02,0x5C,0x25,0xA1,0x99,0xF8,0xB5,0xE1,0x8D,0x52,0xFB,0xC7,0xB5,0x22, + + 0x0D,0x96,0x71,0xEC,0x13,0x3F,0x59,0x6B,0x10,0xE6,0xA2,0x94,0x57,0xB1,0x38,0x32, + + 0xE2,0x03,0x54,0xA5,0x10,0x61,0x1C,0x2E,0x14,0x44,0xAB,0x78,0x3A,0xBB,0x2B,0xA7, + + 0x27,0x02,0x33,0xDF,0x1B,0x97,0x61,0x96,0xB0,0x6F,0x77,0xF8,0x0E,0x0D,0x84,0xA1, + + 0x67,0xBD,0xDB,0x88,0x36,0x90,0x00,0x74,0x66,0xEB,0xCA,0x5E,0x8B,0xAF,0x32,0xB8, + + 0x27,0x8A,0x1A,0x67,0x5D,0x2A,0x3A,0x84,0x76,0xF5,0xA4,0x5B,0xF2,0x7C,0x10,0xB0, + + 0x01,0xED,0xE2,0x75,0xF0,0x93,0x0C,0x51,0xE8,0x5D,0x55,0xA0,0x53,0x7C,0x6D,0x6B, + + 0x0D,0x1E,0x90,0xF3,0xF1,0x7C,0x8F,0x7C,0x29,0xF2,0x64,0x77,0x50,0x4C,0x32,0xC0, + + 0x22,0x14,0x00,0x41,0x3C,0xBE,0x99,0xA7,0xBC,0x5E,0x53,0x9B,0xF2,0x9B,0x8C,0xC1, + + 0xC9,0x15,0x95,0x56,0x96,0xEA,0x81,0xF1,0x82,0xEA,0xE2,0xF9,0xAF,0x7A,0x45,0x43, + + 0x67,0x30,0xC1,0x65,0x13,0xB4,0x56,0xF2,0xFD,0x9D,0x8C,0x6D,0x57,0x89,0x4D,0xD1, + + 0xA3,0x9A,0xCC,0xB3,0x4C,0x5B,0x82,0xF0,0xE5,0x6C,0xEF,0x0A,0xC0,0x57,0x79,0x60, + + 0xAE,0xD5,0x3E,0xCB,0xFA,0x98,0x5D,0xBB,0x00,0xE2,0xFE,0xCE,0xFA,0xB4,0x54,0x9A, + + 0x9A,0x84,0x88,0xB5,0xD0,0x08,0x47,0xC1,0x98,0x16,0xFE,0xEA,0xA9,0x74,0xFA,0xCE, + + 0x51,0x6C,0xCF,0x09,0xF0,0xFB,0x77,0xFE,0x1D,0x55,0xF3,0x29,0x8B,0x75,0x15,0x9B, + + 0x3B,0x11,0x97,0x99,0xB1,0x78,0x1E,0xC2,0x4E,0xD6,0x89,0x85,0x5A,0x7D,0x26,0x9E, + + 0xB6,0x13,0x9F,0x28,0x9F,0xCA,0xE8,0xF9,0x01,0x74,0x2E,0x04,0x32,0x31,0x10,0xAB, + + 0x40,0x73,0x76,0x42,0x21,0x52,0x9E,0x00,0xB6,0x46,0x5B,0x9A,0xF4,0xFB,0xF3,0x2B, + + 0x62,0x84,0x9A,0x4E,0x15,0x2C,0x1A,0x6B,0x2F,0xEA,0x40,0x0B,0x1B,0xD1,0x29,0x00, + + 0xA8,0xB4,0x5F,0xAF,0x50,0x9E,0x5A,0x7D,0xA3,0x7C,0xC5,0xBD,0xE1,0x32,0x78,0x06, + + 0x2C,0x09,0x58,0x41,0xE9,0x26,0xF0,0xDA,0x86,0x82,0xD8,0x44,0xEF,0xEE,0x50,0x20, + + 0xCD,0x8E,0xCA,0x14,0x16,0xF1,0x2C,0xE6,0xAC,0x60,0x78,0xCE,0xF6,0xE7,0x1F,0x32, + + 0x4C,0x8B,0x5E,0x79,0xF5,0xA6,0x6A,0xEC,0xC5,0x82,0x89,0xA5,0x11,0x56,0x38,0xE0, + + 0xBD,0x0E,0xF0,0x6B,0x30,0x5C,0x21,0xA3,0x48,0x6E,0x13,0xB4,0xD3,0x58,0x9F,0x85, + + 0x98,0x59,0xD8,0xB9,0xD7,0xC6,0xC7,0x02,0x40,0xFF,0x99,0x8D,0xA9,0xA6,0xD1,0x0C, + + 0xDA,0xF8,0xD0,0xC6,0x24,0x71,0x7E,0x86,0xC7,0x22,0xFF,0xCD,0x91,0x88,0x80,0x03, + + 0xC2,0x5A,0x25,0x97,0x9A,0xA5,0xCF,0x70,0x9D,0x6D,0xAE,0x59,0x2B,0xE9,0xC6,0x20, + + 0xB3,0x26,0x51,0xAD,0x87,0xEA,0x47,0xBF,0xE6,0xB7,0x69,0x31,0xD3,0xA7,0x5C,0x3E, + + 0xE5,0x49,0xF8,0xEB,0x64,0xB7,0x27,0xB9,0x6D,0x37,0xEC,0x6C,0xFD,0xD5,0xAA,0x3B, + + 0x6C,0xCB,0x6A,0x0F,0x5C,0x22,0xFA,0xC2,0xD9,0x8B,0x82,0x51,0xDC,0xE4,0x8F,0x98, + + 0xAD,0x82,0x1C,0xE9,0xAF,0xF0,0x0D,0x03,0x0E,0xCA,0x9B,0x4D,0x69,0xE6,0x74,0x73, + + 0x2C,0x82,0xCC,0x2E,0xF1,0xE9,0x60,0xF4,0xCC,0x8B,0x7B,0xC6,0x8C,0x1E,0x3C,0xB9, + + 0x65,0xB1,0x9D,0x09,0x2D,0xA7,0x0C,0x9E,0x71,0x33,0xB3,0x6E,0x7C,0xBC,0xEA,0xB3, + + 0x36,0x8B,0x16,0xD6,0xBA,0x3B,0xBA,0x93,0xA2,0x60,0x79,0x78,0x7B,0x40,0x75,0xBF, + + 0x65,0x45,0x5B,0xD4,0xA5,0x5A,0x49,0x90,0xB1,0x31,0xF5,0x29,0xCA,0xAC,0xC1,0x40, + + 0x89,0x2F,0xAE,0xB8,0x62,0x23,0x63,0xEB,0x30,0x62,0x7E,0x9F,0x97,0xAD,0xA4,0xA3, + + 0x63,0x3D,0xA2,0xAE,0x3C,0xF3,0x6D,0x21,0x83,0x25,0x1E,0xA9,0xD5,0x53,0x34,0x8A, + + 0x46,0xD3,0x3C,0x88,0x09,0x45,0xF7,0xCE,0x63,0x43,0xA9,0xAD,0x41,0xCD,0x3D,0x13, + + 0xCD,0x53,0xA3,0xB6,0xBC,0xC2,0x20,0x9D,0xD4,0x90,0x20,0x45,0xD0,0x06,0xED,0x6B, + + 0x67,0xD1,0xBE,0x50,0x5C,0x22,0x3B,0x5B,0x9C,0x9E,0x00,0xFC,0xF3,0x48,0x42,0x0E, + + 0x41,0x39,0xBD,0xAF,0x93,0x4B,0x14,0xB4,0xBE,0x96,0xE6,0x7C,0xD1,0xEF,0x24,0x96, + + 0x21,0x2E,0xA4,0x57,0x54,0xDE,0x5B,0x76,0x14,0xC9,0xA5,0xF6,0xD2,0x75,0xBF,0x04, + + 0x6C,0xEC,0xDB,0xF6,0x3B,0x40,0x2A,0xC4,0x64,0x1A,0xD1,0x17,0xFE,0xB9,0x7F,0x57, + + 0xD4,0xC3,0xFB,0xE6,0x04,0xFA,0xBD,0xE3,0xD8,0x5A,0x05,0x91,0x78,0x71,0x7D,0x45, + + 0x2D,0xD8,0xC4,0x8E,0xD5,0xC9,0xCD,0xA2,0xC9,0x27,0xA4,0xF5,0x81,0x44,0x6C,0xEB, + + 0x45,0x90,0xF0,0xB3,0x6D,0x12,0xF3,0xCB,0x7A,0xD2,0x41,0xC4,0x7B,0x62,0x33,0x5F, + + 0x45,0x40,0xC5,0x97,0xBD,0x7A,0xBC,0xCB,0xB3,0x77,0xCC,0xD4,0x94,0xF7,0x6D,0x67, + + 0xAD,0x36,0xBC,0x9F,0x3F,0x77,0xBE,0xFC,0x04,0x61,0xDF,0x99,0x10,0x99,0x9D,0xED, + + 0x8F,0x63,0xFE,0xDF,0xC2,0x1D,0xE1,0x02,0xB2,0x93,0xDF,0xAE,0x66,0x77,0x30,0xAB, + + 0x74,0x96,0xF8,0xDC,0xD6,0xBB,0x86,0x78,0xAA,0xFB,0xC4,0x16,0xF7,0xB2,0xA7,0x22, + + 0x97,0x33,0x27,0x2E,0x82,0x1E,0xCC,0x5B,0xE6,0xCC,0xDE,0x09,0x7E,0x7E,0xFA,0xA8, + + 0xFC,0x96,0x42,0xA2,0xDC,0x40,0xBF,0x03,0x32,0xC4,0xA6,0xE6,0x5A,0x78,0x80,0x15, + + 0xE1,0x1B,0xDE,0xE6,0x14,0xA5,0x05,0x1D,0xAB,0x04,0xA9,0x00,0xBB,0x04,0xF0,0xF8, + + 0x87,0xCC,0xEF,0x29,0xFA,0x65,0xBC,0x14,0xB6,0xBC,0x67,0x4E,0x27,0xBE,0x86,0xE7, + + 0xB3,0xB2,0x93,0xBC,0xB4,0xA9,0x2B,0x91,0x7C,0xED,0xA9,0xDD,0xD0,0x93,0xF6,0xD6, + + 0xB2,0x1A,0xB3,0xA5,0x00,0x8C,0x0F,0x53,0x3E,0x9E,0x09,0xB7,0x1C,0xDF,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0xBA,0x97, + + 0x6B,0x0C,0x26,0x28,0xF3,0x4C,0xC6,0xD6,0x2B,0x4A,0xAA,0xB7,0xDA,0x84,0x10,0x1A, + + 0xC3,0x06,0xF5,0x63,0x71,0x24,0xEF,0x84,0xA2,0x2D,0xFA,0x6B,0x96,0x64,0x7D,0xEB, + + 0x9A,0x47,0xBB,0xF7,0x34,0x27,0x84,0xDA,0x4C,0xC1,0xB8,0x4F,0x0A,0x2B,0x43,0x99, + + 0xBA,0x4F,0x99,0x96,0x72,0x6F,0x23,0x1D,0x22,0x2F,0xFC,0xBF,0x14,0xA5,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x5D,0x80, + + 0x85,0xCF,0x14,0xFB,0x58,0x3D,0x6A,0xA6,0x81,0xD3,0x94,0xA4,0x70,0x70,0x6C,0xDA, + + 0xF9,0x1C,0xB6,0x24,0xFC,0x70,0xE1,0xFE,0x94,0x0D,0x9C,0xB4,0x71,0x71,0xE9,0x1E, + + 0xA1,0x80,0x97,0x53,0x5B,0x76,0x3C,0x52,0x6C,0x13,0x95,0xA5,0xF0,0x72,0x0F,0x6E, + + 0x54,0x7D,0x3E,0xB8,0x4D,0xA2,0x27,0x5A,0x52,0x5E,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0xE1,0xC8, + + 0x22,0x1E,0x2B,0xF3,0xA5,0x64,0x6D,0x8F,0xC9,0xE7,0x96,0xAC,0x78,0x78,0x8B,0x38, + + 0x0D,0x79,0xF7,0xB8,0x52,0x36,0x26,0x47,0x4D,0x86,0x9E,0xBC,0x79,0x79,0x23,0xC4, + + 0x09,0x11,0x3C,0xC3,0x59,0x05,0xA3,0xCB,0x1F,0x3F,0x97,0xAD,0xF8,0x7A,0x5F,0xB8, + + 0xE1,0xE0,0x0F,0xAF,0xD9,0x88,0xAB,0xDB,0x66,0xED,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x98,0xFD, + + 0x37,0xFB,0x9A,0xB6,0x85,0xE1,0x08,0xD8,0xE8,0xCD,0x88,0xBC,0x70,0xA2,0x32,0x10, + + 0xCF,0x8E,0x9F,0x76,0x66,0xA1,0x2A,0xA1,0xAE,0x85,0x1D,0x54,0xA2,0x84,0x99,0x9C, + + 0x96,0xCF,0x16,0xF6,0xE3,0xA2,0x4E,0x5C,0xAC,0xCF,0xB7,0xBC,0x56,0x2E,0x21,0x06, + + 0x64,0x98,0x69,0x13,0x08,0x5E,0x03,0x83,0x54,0x6C,0x81,0x13,0xB6,0x7E,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0xEC, + + 0xF3,0x8C,0xB4,0xFA,0xE3,0x35,0x96,0x50,0xEF,0xAD,0xA5,0xDD,0xD8,0x65,0x72,0x36, + + 0x8F,0x65,0x92,0x2E,0xCC,0x06,0xE6,0x17,0xFE,0x84,0x2A,0x3E,0x5D,0xE9,0x30,0xE3, + + 0xD0,0xC7,0x70,0x2B,0x61,0x0B,0x0C,0xC9,0xE8,0x41,0xE1,0x79,0x37,0x8E,0x13,0x79, + + 0xCD,0x74,0x0B,0x6D,0xFF,0x47,0xC4,0xCB,0x7B,0x9A,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0xA4,0x06, + + 0x71,0xA7,0x34,0x77,0x97,0xF0,0x0F,0xD2,0xE4,0xCF,0xB4,0xA6,0x74,0xF0,0x29,0x82, + + 0xC4,0x8A,0xF6,0x6C,0x5D,0x80,0xAC,0xD0,0x92,0xB4,0xBC,0xB6,0x75,0xF1,0x75,0x9E, + + 0xE8,0x91,0x97,0xB7,0xEA,0xF3,0x8E,0xD3,0x64,0xC4,0xB5,0xA7,0xF4,0xF2,0x2D,0x75, + + 0x81,0x6E,0xD3,0x91,0xD6,0x44,0x05,0x5B,0xA9,0x92,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x78,0x68, + + 0x28,0x1D,0xF0,0xA6,0xD7,0xDC,0x4F,0xC5,0x10,0x27,0xB6,0xAE,0x7C,0xF8,0x10,0x78, + + 0x4F,0xEC,0x96,0x75,0x91,0xB4,0x69,0x41,0xDC,0x4A,0xBE,0xBE,0x7D,0xF9,0x35,0x2E, + + 0x47,0xDE,0x37,0xED,0x0F,0xDF,0x8E,0x17,0x1B,0xE7,0xB7,0xAF,0xFC,0xFA,0x51,0x9C, + + 0x89,0x10,0x56,0xB8,0x1C,0xC4,0x44,0xBF,0xA5,0x6D,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xEB,0x12,0x80,0x05, + + 0x76,0x8D,0xDE,0x85,0xB1,0x8B,0x52,0x92,0x14,0x40,0xCE,0xA1,0x58,0xCB,0xAC,0x72, + + 0x40,0x81,0x90,0xE5,0x5B,0x21,0x24,0xB2,0x41,0xA7,0xC6,0xB5,0xD3,0xCA,0x7F,0x19, + + 0x02,0x2A,0x41,0x05,0xFB,0xA0,0x19,0x24,0xC4,0x62,0x90,0x05,0x50,0x48,0x71,0xEC, + + 0xC1,0x41,0xD7,0x1D,0xB1,0x88,0x47,0xD3,0xCD,0xC6,0x59,0x35,0xBA,0xE1,0x7E,0x48, + + 0xC0,0x06,0x3F,0xBA,0x14,0xE4,0x46,0xF1,0xA9,0xE6,0xF9,0x23,0x7C,0xE8,0xFB,0xC0, + + 0x05,0xA5,0x08,0x40,0x82,0xA8,0x1A,0x03,0x5F,0x4C,0xF1,0x73,0x52,0xE5,0x49,0xC5, + + 0x7E,0xA4,0xD4,0xC1,0xD6,0xBB,0xEA,0xD0,0x80,0xE9,0x9B,0x78,0x93,0x67,0x05,0x23, + + 0xEB,0xA5,0x36,0xD1,0xD7,0xD2,0x2F,0xF3,0xCA,0x3A,0xA3,0xA1,0x53,0x47,0x80,0x6A, + + 0x73,0xDA,0x87,0x0C,0x9A,0x20,0x3C,0x2F,0x20,0x47,0x82,0xDD,0x12,0x68,0x7A,0x5E, + + 0xF5,0x4B,0xEA,0x5C,0x0C,0x26,0x1A,0x7B,0x4D,0x49,0x9B,0x1C,0xD9,0xA8,0xDC,0x08, + + 0x8E,0x8A,0x0E,0xFD,0x90,0x25,0x3D,0x2E,0xE7,0x0A,0xCD,0xA8,0xD0,0xC1,0x89,0x63, + + 0x0B,0x23,0x0B,0x1C,0x30,0x80,0xF1,0x3D,0xC9,0xE4,0xC5,0xBC,0x5B,0xC0,0xBD,0x3B, + + 0x48,0x8F,0x02,0x5D,0x8D,0x6E,0x08,0x75,0xE9,0x4A,0x58,0x9A,0x85,0xE1,0x74,0x54, + + 0x6A,0xED,0xB5,0xA6,0xE4,0xF2,0xDA,0x9A,0xEA,0xB2,0xD8,0x74,0x59,0x6C,0x03,0xB7, + + 0x0A,0x5E,0x41,0xF7,0x7B,0x51,0x5F,0x07,0x6B,0xC6,0xF3,0x60,0xD2,0x2E,0x53,0x4C, + + 0x77,0xAD,0x0B,0x4D,0xB1,0xA2,0x11,0x78,0x28,0xC5,0xD3,0x7F,0x59,0x8F,0xBF,0xE2, + + 0x61,0x50,0x03,0x75,0x3A,0x36,0xBA,0x51,0x6A,0x5C,0x95,0x84,0x1B,0x40,0x74,0xE3, + + 0x71,0x18,0xCE,0x1E,0x5A,0x93,0x62,0x20,0x8A,0xF3,0xD8,0x36,0x1A,0x33,0x7D,0xE3, + + 0xE3,0xCD,0xDB,0x01,0xB0,0x99,0x4B,0x25,0xE0,0xDF,0x95,0xA7,0xB2,0xD9,0x4C,0x6C, + + 0xC7,0x51,0x8D,0x64,0xA1,0x23,0x43,0xB9,0xC1,0xFC,0x9D,0x44,0xB3,0x7D,0x3A,0xCD, + + 0xAD,0xB9,0x04,0xD0,0xC3,0x2F,0x6C,0xB0,0x66,0x5B,0xEE,0x63,0xDE,0x2B,0x4D,0x42, + + 0x23,0x1D,0xB3,0x56,0xB3,0x35,0x26,0x20,0x6B,0x8A,0xE6,0x73,0xDF,0x69,0x40,0x53, + + 0x22,0xBB,0x3A,0xB7,0x55,0x28,0x6D,0x1E,0xA1,0x76,0xEF,0x62,0x5E,0x69,0x09,0x20, + + 0xB7,0x13,0x12,0xD5,0xC4,0x3D,0xE2,0x21,0x14,0x8F,0xF3,0xF3,0x62,0x2B,0x84,0x62, + + 0x57,0x10,0xD8,0x85,0x38,0x78,0x13,0x2A,0x69,0x20,0xC8,0x3D,0x78,0xF5,0x70,0x1A, + + 0x28,0xFE,0xEE,0x6D,0x3F,0x39,0x26,0x49,0x6F,0x59,0xDE,0x4F,0x61,0x7F,0xDC,0x8D, + + 0xAE,0xBA,0x83,0xEE,0xD3,0x18,0x37,0x3D,0x83,0x78,0xE9,0x28,0x93,0x6A,0x55,0x98, + + 0x0A,0xB4,0xD1,0x0D,0x19,0x90,0x41,0x29,0xC9,0xF0,0x97,0xF0,0x9A,0x1B,0x1C,0xCA, + + 0x42,0x2C,0xFC,0x2E,0x96,0xC2,0x2E,0x19,0x3A,0x7C,0xF8,0xEB,0xEF,0x73,0x18,0xD0, + + 0xC0,0x0D,0xFE,0x62,0x50,0x09,0x26,0x8B,0x3B,0x56,0xF7,0xB2,0xB2,0x19,0x39,0xC0, + + 0xC9,0xE1,0xBC,0x13,0x0D,0x95,0x37,0x29,0x24,0xD3,0x63,0xA7,0x33,0x3A,0x6F,0xCD, + + 0x63,0x2F,0xCF,0x2C,0x33,0xC0,0x24,0x99,0xBC,0x54,0x76,0x22,0x42,0xA1,0x9D,0xF2, + + 0x58,0x8F,0xE4,0x84,0x7F,0xE2,0xB0,0x23,0x44,0x80,0x70,0x26,0x3F,0x62,0x22,0x16, + + 0xA6,0x8C,0xF6,0x87,0x15,0x0A,0x68,0x36,0x4D,0xE9,0xE6,0xB3,0x5D,0x4A,0x41,0x42, + + 0x31,0x8F,0xA1,0xF6,0xD6,0xA6,0x35,0xBE,0xC0,0xE2,0xB9,0xD6,0x9E,0xE2,0xD6,0xC3, + + 0x8D,0x0C,0xA8,0x97,0x15,0xA2,0xB9,0x32,0x82,0x83,0xB8,0x17,0x55,0xA1,0xD3,0xD2, + + 0x00,0x24,0x1D,0xBD,0xE5,0x5B,0x74,0x9C,0xBB,0x4E,0xF2,0x14,0x21,0xC4,0x32,0x4F, + + 0xA4,0x83,0xD2,0xB9,0xEC,0x3A,0xF0,0x4E,0xA6,0xCA,0x07,0xA6,0x29,0xE6,0x2D,0xC1, + + 0x8F,0xFB,0x1A,0xC3,0x9A,0xCB,0x8A,0x3F,0x65,0xC0,0x15,0x07,0x24,0x83,0x65,0x3D, + + 0x26,0x0F,0x16,0xA9,0x91,0x27,0x19,0x33,0xDA,0x4C,0xC7,0x7E,0x94,0x15,0x68,0x0B, + + 0xFB,0x75,0xFC,0x8F,0x9E,0x03,0x36,0x5A,0x48,0xE8,0xEC,0xAF,0xDE,0x43,0x4A,0x5B, + + 0xF0,0x02,0xCA,0xEF,0x57,0xA9,0xBA,0x3B,0x9F,0x89,0xA2,0xCF,0x17,0xE9,0x69,0xF5, + + 0xD9,0x85,0x63,0x0F,0xF7,0x28,0x6D,0x2F,0xC4,0xDE,0x73,0x2F,0xB7,0x68,0xAC,0xF9, + + 0x0F,0xA3,0xF5,0x17,0x8D,0xAF,0x3F,0x99,0xC9,0xEB,0xE5,0xBA,0xD5,0x40,0xE2,0xA8, + + 0xAF,0x73,0x3A,0x3C,0xE1,0x73,0xF6,0x88,0xCC,0xC4,0x09,0x1C,0xD0,0x89,0x6E,0xA4, + + 0xF2,0x07,0x68,0xDE,0x19,0x6D,0x76,0x05,0x2C,0x3D,0xB0,0x3C,0x37,0xE0,0x29,0x4A, + + 0x6D,0x04,0x23,0x5E,0x95,0xEC,0xFA,0x19,0x6D,0xC8,0xEB,0x6E,0x8A,0x12,0x90,0x07, + + 0x2C,0x02,0x63,0x7B,0x1A,0x5A,0x03,0xF9,0xC6,0x12,0xE3,0x55,0xDE,0xF8,0x55,0x44, + + 0xD4,0xDE,0xE2,0x86,0xB4,0xD3,0x72,0xA2,0x0F,0xC0,0xCC,0x24,0x7D,0x8D,0x76,0x93, + + 0x86,0x97,0x6C,0x96,0x5E,0x33,0x5C,0xF2,0x78,0x5C,0xB0,0xD8,0xD4,0x79,0x92,0x01, + + 0xA1,0x63,0xFB,0x06,0x36,0x19,0x25,0x52,0xFC,0xD2,0xEF,0xBA,0x57,0xF4,0xA5,0xAF, + + 0x06,0x95,0x85,0x66,0xFF,0xB3,0x45,0x31,0xE4,0x8B,0x3D,0x55,0x54,0x0C,0xE5,0x33, + + 0x3A,0xB4,0x64,0xC3,0xE0,0xF4,0x3F,0x0D,0x9D,0x2B,0x4A,0xE4,0x80,0x20,0x5F,0x42, + + 0xDB,0xD7,0x58,0x3C,0xD6,0xD3,0xBC,0xE6,0x44,0x97,0x7B,0xED,0x75,0xBB,0xD0,0xCF, + + 0x5E,0x34,0xE5,0xC2,0x57,0xD0,0x8E,0x67,0xA2,0x58,0xF2,0xF8,0xA2,0x62,0xDE,0x52, + + 0xA1,0x17,0x59,0x97,0xBB,0x78,0x7B,0x0A,0x98,0x87,0x8B,0xB1,0x51,0xBB,0x6E,0x1D, + + 0x8D,0x91,0xF8,0x86,0x3E,0xBC,0x34,0x48,0x68,0xF8,0xFC,0xAF,0x9F,0x72,0x16,0x69, + + 0x39,0x14,0xF0,0x1A,0x3D,0x34,0x60,0x3E,0x6D,0x72,0x45,0xE2,0xDE,0x97,0xDE,0x09, + + 0xAF,0x7C,0xA8,0x7E,0xB6,0xBC,0x0B,0x5A,0xE6,0xD6,0xB3,0x51,0x01,0x70,0x51,0x1E, + + 0x44,0xCB,0xD1,0x0F,0x56,0x19,0x7D,0xFB,0x6D,0xEB,0x81,0xB6,0x3F,0xFB,0xBE,0xF5, + + 0x3A,0x47,0xC6,0xCF,0x99,0xAC,0xB6,0xFE,0x79,0x9E,0x82,0x13,0x40,0xBE,0x10,0x5E, + + 0xDA,0x3E,0xD4,0x59,0x93,0xA2,0x7E,0x7E,0x2B,0x79,0x3E,0xEA,0x83,0x08,0x67,0xB4, + + 0xC6,0xDC,0x08,0x3D,0x3E,0x8F,0xF5,0x65,0xE8,0xDE,0x75,0xD0,0x02,0x9C,0x2B,0x28, + + 0xA5,0x62,0xA5,0xCA,0xDF,0x2F,0xBF,0xEA,0x3D,0x52,0xF8,0x7B,0xBB,0x0A,0xB7,0x1C, + + 0x06,0xC0,0x24,0x66,0x33,0x40,0x63,0x66,0xEA,0xBB,0x94,0x63,0xD2,0x68,0x78,0x56, + + 0xA3,0xFF,0x68,0x1C,0x33,0x31,0xAF,0xB5,0x47,0x81,0xBE,0xEF,0x05,0xC5,0xB6,0xFC, + + 0x90,0x4C,0x6D,0x07,0x98,0x4E,0x91,0xA5,0x84,0xB7,0xA0,0x47,0x3B,0xD2,0xF0,0x57, + + 0x6B,0xA7,0x8C,0x06,0xDF,0x67,0xAE,0x0E,0x9D,0x01,0x72,0x28,0x19,0x9D,0x38,0x22, + + 0x41,0xF4,0x2F,0x36,0xB1,0x65,0xE3,0x79,0xBE,0x94,0xD0,0x64,0x52,0x64,0x40,0xE2, + + 0xF6,0x0A,0xB0,0x73,0x37,0x25,0x5C,0x37,0xC1,0x4D,0xD8,0x74,0x53,0x65,0x4B,0x01, + + 0x21,0x00,0xC5,0x65,0x92,0x26,0xC1,0xA6,0xC0,0xB3,0xD1,0x65,0xD2,0x66,0xFD,0x2E, + + 0x20,0x46,0xC9,0x55,0x93,0x27,0xEB,0x13,0x28,0xF7,0xD9,0x75,0xD3,0x67,0x42,0x0E, + + 0xC0,0xF8,0xA4,0x98,0x94,0xA3,0x90,0x17,0xB4,0x4A,0xD2,0xAA,0xA4,0x9D,0x08,0xDE, + + 0xAB,0x4C,0x71,0x3A,0x09,0xA4,0x99,0x3E,0x81,0xF9,0x19,0x06,0x01,0x28,0xA7,0xF5, + + 0x08,0xF1,0x87,0xEF,0x9E,0xEA,0xD3,0x3D,0x34,0xEE,0xD3,0x13,0x84,0xDF,0x79,0xBC, + + 0x2D,0xEC,0x5F,0xE2,0x1A,0x25,0xBF,0x5B,0x65,0xB4,0x77,0xBD,0x25,0x4B,0xAA,0xFB, + + 0x8F,0x4B,0xC2,0x4C,0x1A,0x2C,0x74,0xB7,0x1E,0x0A,0xD2,0x6C,0x5A,0x6C,0x3E,0xA5, + + 0x2A,0x4F,0xCA,0x5C,0x1B,0x2D,0xD9,0x5C,0xC4,0x4F,0xDA,0x7C,0x5B,0x6D,0x83,0x5D, + + 0x78,0x42,0xC3,0x4D,0x9A,0x2E,0xE4,0x57,0x92,0xBB,0xD3,0x6D,0xDA,0x6E,0xC9,0x66, + + 0x0E,0x08,0xCB,0x5D,0x9B,0x2F,0xEC,0x78,0x46,0x49,0xDB,0x7D,0xDB,0x6F,0x80,0x04, + + 0x64,0xE5,0x0C,0x86,0xC5,0x3F,0x74,0xE4,0x6F,0x5D,0xBC,0x66,0xF2,0x78,0xBB,0xAF, + + 0x79,0x53,0x48,0x11,0x72,0xC2,0x94,0xC8,0x80,0x5E,0xFC,0xF4,0x8A,0x7C,0x3F,0x7E, + + 0xA6,0xD2,0x31,0xFA,0x13,0x8F,0x5F,0x7E,0x43,0x54,0x7A,0x55,0xA8,0x7D,0x8F,0xAE, + + 0x5D,0xC3,0xED,0xD1,0x8C,0x3C,0x7D,0xF5,0xD8,0x5C,0xEF,0xAC,0xB1,0x88,0x3C,0xE4, + + 0xA7,0x33,0xC4,0xC4,0x32,0x34,0x94,0xF4,0x9E,0x18,0xD4,0xE4,0x72,0x74,0xFB,0x2D, + + 0x33,0x5B,0xCC,0xD4,0x33,0x35,0xF4,0x53,0x1C,0xD5,0xDC,0xF4,0x73,0x75,0x9A,0xD0, + + 0xA4,0xD6,0xC5,0xC5,0xB2,0x36,0x25,0x27,0x48,0x17,0xD5,0xE5,0xF2,0x76,0x3D,0xF7, + + 0x41,0x74,0xCD,0xD5,0xB3,0x37,0x9D,0xE5,0x1F,0x1B,0xDD,0xF5,0xF3,0x77,0xC6,0x9C, + + 0xD4,0xBC,0x16,0x92,0x60,0xCC,0xA2,0x4A,0xEA,0x10,0x92,0xAE,0x7C,0x83,0xAA,0x65, + + 0xA9,0xC2,0x7E,0x18,0x7D,0xAE,0x66,0xDA,0x2A,0xE6,0x29,0x98,0xFC,0x5E,0x47,0x8F, + + 0x60,0xEA,0x04,0x4B,0x52,0x76,0xDB,0xCB,0xAB,0x85,0x97,0x6F,0x7B,0x3C,0x0E,0x5F, + + 0x0B,0x5E,0x27,0x3E,0xC6,0x3A,0x67,0xE6,0x1C,0xA7,0x40,0xAC,0xFF,0xBB,0xEE,0x6A, + + 0xF5,0xF3,0xC6,0xCC,0x3A,0x3C,0x26,0x2E,0xC0,0x1D,0xD6,0xEC,0x7A,0x7C,0xB1,0xFC, + + 0xA9,0x15,0xCE,0xDC,0x3B,0x3D,0xF2,0xBA,0xE8,0x53,0xDE,0xFC,0x7B,0x7D,0xEF,0x6B, + + 0x2D,0x39,0xC7,0xCD,0xBA,0x3E,0xBB,0x69,0x16,0x7E,0xD7,0xED,0xFA,0x7E,0xF9,0xBB, + + 0x5C,0x19,0xCF,0xDD,0xBB,0x3F,0x37,0x7F,0x17,0x1E,0xDF,0xFD,0xFB,0x7F,0xF4,0x44, + + 0xA6,0x7E,0x40,0x39,0x30,0x1C,0xF0,0x36,0xB8,0xBE,0x1C,0xA4,0x55,0x65,0xC3,0x69, + + 0x9A,0xBC,0x2C,0xE7,0xB6,0xA3,0x4C,0xB6,0x0D,0x9F,0xD7,0x2A,0x9D,0x3F,0x5B,0x87, + + 0xC8,0x92,0x1E,0x5C,0x6D,0x28,0x48,0x65,0x66,0x8C,0x89,0xD4,0x8C,0x46,0x81,0xB1, + + 0x02,0xA4,0x9B,0xE8,0x17,0xEB,0xF9,0x27,0x54,0x82,0x3E,0x24,0x0A,0xE1,0x88,0xE1, + + 0x00,0x24,0xE0,0x46,0x16,0xA4,0x78,0x50,0xE7,0x6B,0xF0,0x66,0x56,0xE4,0xF8,0xD0, + + 0x06,0xF2,0xE8,0x56,0x17,0xA5,0x98,0x4D,0xB3,0x75,0xF8,0x76,0x57,0xE5,0x88,0xC7, + + 0xC2,0x9A,0xE1,0x47,0x96,0xA6,0x76,0x70,0x1D,0x16,0xF1,0x67,0xD6,0xE6,0x53,0xB1, + + 0x05,0x8F,0xE9,0x57,0x97,0xA7,0xCE,0x6F,0xE3,0x3A,0xF9,0x77,0xD7,0xE7,0xB2,0x14, + + 0x54,0x7C,0x82,0x6C,0xAB,0xCD,0x99,0x51,0x99,0x35,0x52,0x11,0xA0,0xEA,0x6A,0xDC, + + 0xE7,0xC5,0x13,0x4F,0xBE,0x76,0x62,0x07,0xCF,0xC1,0x89,0x27,0x79,0x87,0xA0,0x11, + + 0xD0,0x3E,0x9B,0xDF,0x41,0xD5,0x71,0x4B,0xD4,0x4A,0x00,0x32,0x24,0x3A,0xDB,0x5D, + + 0x27,0x70,0x16,0x42,0x62,0xAD,0xEF,0x49,0x6E,0x8A,0xFB,0x00,0xD5,0x87,0x93,0x28, + + 0x4D,0x53,0xE2,0x4E,0x1E,0xAC,0xAD,0x62,0x60,0x8A,0xF2,0x6E,0x5E,0xEC,0x12,0xD8, + + 0x0E,0x9A,0xEA,0x5E,0x1F,0xAD,0x0A,0xA5,0xA0,0x8C,0xFA,0x7E,0x5F,0xED,0x1B,0x29, + + 0xCD,0x7E,0xE3,0x4F,0x9E,0xAE,0x81,0xAD,0x6C,0x82,0xF3,0x6F,0xDE,0xEE,0xD0,0xB9, + + 0x23,0x72,0xEB,0x5F,0x9F,0xAF,0xD3,0xD8,0xB0,0x0F,0xFB,0x7F,0xDF,0xEF,0x56,0x27, + + 0xA1,0x97,0x64,0x92,0xC8,0x45,0xF4,0xB3,0x48,0xD6,0x03,0x5B,0x38,0xBE,0x2D,0x4D, + + 0x86,0xEF,0x1B,0x8F,0x33,0x71,0x44,0x96,0xEA,0xD3,0x45,0x70,0xD7,0xB4,0xCE,0x74, + + 0xA2,0x72,0x61,0x03,0xF0,0x47,0x3D,0x06,0x87,0xF2,0xC5,0xE1,0x56,0x0C,0x16,0xD5, + + 0x07,0xDD,0x1A,0xA8,0xE1,0xF1,0x8A,0xB2,0x68,0xDF,0xCF,0x31,0xED,0xBF,0x6C,0xF5, + + 0x87,0xF8,0xE4,0xC6,0x36,0xB4,0x14,0xA2,0x6A,0x29,0xF4,0xE6,0x76,0xF4,0xE8,0x15, + + 0xA7,0xB5,0xEC,0xD6,0x37,0xB5,0x26,0xF3,0xC4,0x94,0xFC,0xF6,0x77,0xF5,0x86,0x84, + + 0x78,0x9E,0xE5,0xC7,0xB6,0xB6,0x0D,0x61,0xE7,0x96,0xF5,0xE7,0xF6,0xF6,0xC1,0x13, + + 0x04,0xD6,0xED,0xD7,0xB7,0xB7,0x1D,0xB3,0xFA,0x5C,0xFD,0xF7,0xF7,0xF7,0x52,0xAE, + + 0xF8,0x28,0x24,0xB1,0xB9,0xBF,0x5E,0xB4,0x2A,0x2C,0xC6,0x8E,0x64,0x35,0x09,0x1A, + + 0xAA,0x3E,0x47,0x1A,0x79,0xA5,0x81,0xDA,0xDA,0x7D,0x84,0x5C,0xFF,0xF1,0x80,0x97, + + 0x7C,0x6A,0x4F,0x2C,0xBA,0x1A,0xF1,0x2F,0xA4,0xAD,0x27,0x2D,0xFD,0x1D,0x87,0x3D, + + 0xAB,0x5B,0x3F,0x58,0xBF,0x4E,0xF9,0xBD,0x25,0x19,0x4D,0xDD,0xBE,0x24,0x8A,0x4A, + + 0xD2,0xBC,0xE6,0xCE,0x3E,0xBC,0xF2,0x08,0xEC,0xD4,0xF6,0xEE,0x7E,0xFC,0x56,0x29, + + 0x77,0x39,0xEE,0xDE,0x3F,0xBD,0x1E,0xBA,0xC2,0x20,0xFE,0xFE,0x7F,0xFD,0xCB,0x49, + + 0xAF,0xCB,0xE7,0xCF,0xBE,0xBE,0xFE,0x99,0x4D,0x9F,0xF7,0xEF,0xFE,0xFE,0x80,0xC7, + + 0x29,0x6A,0xEF,0xDF,0xBF,0xBF,0x07,0xDF,0x6D,0xD7,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0xFF,0xFF,0x00,0x00, + + 0x00,0x00,0x80,0x04,0x10,0x20,0x10,0x20,0x40,0x40,0x90,0x24,0x50,0x60,0x08,0x10, + + 0x01,0x01,0x88,0x14,0x11,0x21,0x18,0x30,0x41,0x41,0x98,0x34,0x51,0x61,0x01,0x01, + + 0x80,0x02,0x81,0x05,0x90,0x22,0x11,0x21,0xC0,0x42,0x91,0x25,0xD0,0x62,0x09,0x11, + + 0x81,0x03,0x89,0x15,0x91,0x23,0x19,0x31,0xC1,0x43,0x99,0x35,0xD1,0x63,0x40,0x40, + + 0x02,0x04,0xC0,0x44,0x12,0x24,0x50,0x60,0x42,0x44,0xD0,0x64,0x52,0x64,0x48,0x50, + + 0x03,0x05,0xC8,0x54,0x13,0x25,0x58,0x70,0x43,0x45,0xD8,0x74,0x53,0x65,0x41,0x41, + + 0x82,0x06,0xC1,0x45,0x92,0x26,0x51,0x61,0xC2,0x46,0xD1,0x65,0xD2,0x66,0x49,0x51, + + 0x83,0x07,0xC9,0x55,0x93,0x27,0x59,0x71,0xC3,0x47,0xD9,0x75,0xD3,0x67,0x02,0x08, + + 0x08,0x08,0x82,0x0C,0x18,0x28,0x12,0x28,0x48,0x48,0x92,0x2C,0x58,0x68,0x0A,0x18, + + 0x09,0x09,0x8A,0x1C,0x19,0x29,0x1A,0x38,0x49,0x49,0x9A,0x3C,0x59,0x69,0x03,0x09, + + 0x88,0x0A,0x83,0x0D,0x98,0x2A,0x13,0x29,0xC8,0x4A,0x93,0x2D,0xD8,0x6A,0x0B,0x19, + + 0x89,0x0B,0x8B,0x1D,0x99,0x2B,0x1B,0x39,0xC9,0x4B,0x9B,0x3D,0xD9,0x6B,0x42,0x48, + + 0x0A,0x0C,0xC2,0x4C,0x1A,0x2C,0x52,0x68,0x4A,0x4C,0xD2,0x6C,0x5A,0x6C,0x4A,0x58, + + 0x0B,0x0D,0xCA,0x5C,0x1B,0x2D,0x5A,0x78,0x4B,0x4D,0xDA,0x7C,0x5B,0x6D,0x43,0x49, + + 0x8A,0x0E,0xC3,0x4D,0x9A,0x2E,0x53,0x69,0xCA,0x4E,0xD3,0x6D,0xDA,0x6E,0x4B,0x59, + + 0x8B,0x0F,0xCB,0x5D,0x9B,0x2F,0x5B,0x79,0xCB,0x4F,0xDB,0x7D,0xDB,0x6F,0x04,0x80, + + 0x20,0x10,0x84,0x84,0x30,0x30,0x14,0xA0,0x60,0x50,0x94,0xA4,0x70,0x70,0x0C,0x90, + + 0x21,0x11,0x8C,0x94,0x31,0x31,0x1C,0xB0,0x61,0x51,0x9C,0xB4,0x71,0x71,0x05,0x81, + + 0xA0,0x12,0x85,0x85,0xB0,0x32,0x15,0xA1,0xE0,0x52,0x95,0xA5,0xF0,0x72,0x0D,0x91, + + 0xA1,0x13,0x8D,0x95,0xB1,0x33,0x1D,0xB1,0xE1,0x53,0x9D,0xB5,0xF1,0x73,0x44,0xC0, + + 0x22,0x14,0xC4,0xC4,0x32,0x34,0x54,0xE0,0x62,0x54,0xD4,0xE4,0x72,0x74,0x4C,0xD0, + + 0x23,0x15,0xCC,0xD4,0x33,0x35,0x5C,0xF0,0x63,0x55,0xDC,0xF4,0x73,0x75,0x45,0xC1, + + 0xA2,0x16,0xC5,0xC5,0xB2,0x36,0x55,0xE1,0xE2,0x56,0xD5,0xE5,0xF2,0x76,0x4D,0xD1, + + 0xA3,0x17,0xCD,0xD5,0xB3,0x37,0x5D,0xF1,0xE3,0x57,0xDD,0xF5,0xF3,0x77,0x06,0x88, + + 0x28,0x18,0x86,0x8C,0x38,0x38,0x16,0xA8,0x68,0x58,0x96,0xAC,0x78,0x78,0x0E,0x98, + + 0x29,0x19,0x8E,0x9C,0x39,0x39,0x1E,0xB8,0x69,0x59,0x9E,0xBC,0x79,0x79,0x07,0x89, + + 0xA8,0x1A,0x87,0x8D,0xB8,0x3A,0x17,0xA9,0xE8,0x5A,0x97,0xAD,0xF8,0x7A,0x0F,0x99, + + 0xA9,0x1B,0x8F,0x9D,0xB9,0x3B,0x1F,0xB9,0xE9,0x5B,0x9F,0xBD,0xF9,0x7B,0x46,0xC8, + + 0x2A,0x1C,0xC6,0xCC,0x3A,0x3C,0x56,0xE8,0x6A,0x5C,0xD6,0xEC,0x7A,0x7C,0x4E,0xD8, + + 0x2B,0x1D,0xCE,0xDC,0x3B,0x3D,0x5E,0xF8,0x6B,0x5D,0xDE,0xFC,0x7B,0x7D,0x47,0xC9, + + 0xAA,0x1E,0xC7,0xCD,0xBA,0x3E,0x57,0xE9,0xEA,0x5E,0xD7,0xED,0xFA,0x7E,0x4F,0xD9, + + 0xAB,0x1F,0xCF,0xDD,0xBB,0x3F,0x5F,0xF9,0xEB,0x5F,0xDF,0xFD,0xFB,0x7F,0x20,0x02, + + 0x04,0x80,0xA0,0x06,0x14,0xA0,0x30,0x22,0x44,0xC0,0xB0,0x26,0x54,0xE0,0x28,0x12, + + 0x05,0x81,0xA8,0x16,0x15,0xA1,0x38,0x32,0x45,0xC1,0xB8,0x36,0x55,0xE1,0x21,0x03, + + 0x84,0x82,0xA1,0x07,0x94,0xA2,0x31,0x23,0xC4,0xC2,0xB1,0x27,0xD4,0xE2,0x29,0x13, + + 0x85,0x83,0xA9,0x17,0x95,0xA3,0x39,0x33,0xC5,0xC3,0xB9,0x37,0xD5,0xE3,0x60,0x42, + + 0x06,0x84,0xE0,0x46,0x16,0xA4,0x70,0x62,0x46,0xC4,0xF0,0x66,0x56,0xE4,0x68,0x52, + + 0x07,0x85,0xE8,0x56,0x17,0xA5,0x78,0x72,0x47,0xC5,0xF8,0x76,0x57,0xE5,0x61,0x43, + + 0x86,0x86,0xE1,0x47,0x96,0xA6,0x71,0x63,0xC6,0xC6,0xF1,0x67,0xD6,0xE6,0x69,0x53, + + 0x87,0x87,0xE9,0x57,0x97,0xA7,0x79,0x73,0xC7,0xC7,0xF9,0x77,0xD7,0xE7,0x22,0x0A, + + 0x0C,0x88,0xA2,0x0E,0x1C,0xA8,0x32,0x2A,0x4C,0xC8,0xB2,0x2E,0x5C,0xE8,0x2A,0x1A, + + 0x0D,0x89,0xAA,0x1E,0x1D,0xA9,0x3A,0x3A,0x4D,0xC9,0xBA,0x3E,0x5D,0xE9,0x23,0x0B, + + 0x8C,0x8A,0xA3,0x0F,0x9C,0xAA,0x33,0x2B,0xCC,0xCA,0xB3,0x2F,0xDC,0xEA,0x2B,0x1B, + + 0x8D,0x8B,0xAB,0x1F,0x9D,0xAB,0x3B,0x3B,0xCD,0xCB,0xBB,0x3F,0xDD,0xEB,0x62,0x4A, + + 0x0E,0x8C,0xE2,0x4E,0x1E,0xAC,0x72,0x6A,0x4E,0xCC,0xF2,0x6E,0x5E,0xEC,0x6A,0x5A, + + 0x0F,0x8D,0xEA,0x5E,0x1F,0xAD,0x7A,0x7A,0x4F,0xCD,0xFA,0x7E,0x5F,0xED,0x63,0x4B, + + 0x8E,0x8E,0xE3,0x4F,0x9E,0xAE,0x73,0x6B,0xCE,0xCE,0xF3,0x6F,0xDE,0xEE,0x6B,0x5B, + + 0x8F,0x8F,0xEB,0x5F,0x9F,0xAF,0x7B,0x7B,0xCF,0xCF,0xFB,0x7F,0xDF,0xEF,0x24,0x82, + + 0x24,0x90,0xA4,0x86,0x34,0xB0,0x34,0xA2,0x64,0xD0,0xB4,0xA6,0x74,0xF0,0x2C,0x92, + + 0x25,0x91,0xAC,0x96,0x35,0xB1,0x3C,0xB2,0x65,0xD1,0xBC,0xB6,0x75,0xF1,0x25,0x83, + + 0xA4,0x92,0xA5,0x87,0xB4,0xB2,0x35,0xA3,0xE4,0xD2,0xB5,0xA7,0xF4,0xF2,0x2D,0x93, + + 0xA5,0x93,0xAD,0x97,0xB5,0xB3,0x3D,0xB3,0xE5,0xD3,0xBD,0xB7,0xF5,0xF3,0x64,0xC2, + + 0x26,0x94,0xE4,0xC6,0x36,0xB4,0x74,0xE2,0x66,0xD4,0xF4,0xE6,0x76,0xF4,0x6C,0xD2, + + 0x27,0x95,0xEC,0xD6,0x37,0xB5,0x7C,0xF2,0x67,0xD5,0xFC,0xF6,0x77,0xF5,0x65,0xC3, + + 0xA6,0x96,0xE5,0xC7,0xB6,0xB6,0x75,0xE3,0xE6,0xD6,0xF5,0xE7,0xF6,0xF6,0x6D,0xD3, + + 0xA7,0x97,0xED,0xD7,0xB7,0xB7,0x7D,0xF3,0xE7,0xD7,0xFD,0xF7,0xF7,0xF7,0x26,0x8A, + + 0x2C,0x98,0xA6,0x8E,0x3C,0xB8,0x36,0xAA,0x6C,0xD8,0xB6,0xAE,0x7C,0xF8,0x2E,0x9A, + + 0x2D,0x99,0xAE,0x9E,0x3D,0xB9,0x3E,0xBA,0x6D,0xD9,0xBE,0xBE,0x7D,0xF9,0x27,0x8B, + + 0xAC,0x9A,0xA7,0x8F,0xBC,0xBA,0x37,0xAB,0xEC,0xDA,0xB7,0xAF,0xFC,0xFA,0x2F,0x9B, + + 0xAD,0x9B,0xAF,0x9F,0xBD,0xBB,0x3F,0xBB,0xED,0xDB,0xBF,0xBF,0xFD,0xFB,0x66,0xCA, + + 0x2E,0x9C,0xE6,0xCE,0x3E,0xBC,0x76,0xEA,0x6E,0xDC,0xF6,0xEE,0x7E,0xFC,0x6E,0xDA, + + 0x2F,0x9D,0xEE,0xDE,0x3F,0xBD,0x7E,0xFA,0x6F,0xDD,0xFE,0xFE,0x7F,0xFD,0x67,0xCB, + + 0xAE,0x9E,0xE7,0xCF,0xBE,0xBE,0x77,0xEB,0xEE,0xDE,0xF7,0xEF,0xFE,0xFE,0x6F,0xDB, + + 0xAF,0x9F,0xEF,0xDF,0xBF,0xBF,0x7F,0xFB,0xEF,0xDF,0xFF,0xFF,0x90,0xAF, diff --git a/drivers/input/touchscreen/GT917D/Kconfig b/drivers/input/touchscreen/GT917D/Kconfig new file mode 100644 index 0000000000000..f714e46bbea07 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/Kconfig @@ -0,0 +1,5 @@ + +config TOUCHSCREEN_GT917D + tristate "ATMEL GT917D touchpanel driver" + depends on CONFIG_INPUT_TOUCHSCREEN + default n diff --git a/drivers/input/touchscreen/GT917D/Makefile b/drivers/input/touchscreen/GT917D/Makefile new file mode 100644 index 0000000000000..c050268fc9335 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/Makefile @@ -0,0 +1,4 @@ +#GT915L touchpanel driver + +obj-y += gt917.o goodix_tool.o gt9xx_update.o + diff --git a/drivers/input/touchscreen/GT917D/goodix_tool.c b/drivers/input/touchscreen/GT917D/goodix_tool.c new file mode 100644 index 0000000000000..d09b181020043 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/goodix_tool.c @@ -0,0 +1,707 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. 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; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * 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. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + + +#include "gt9xx.h" + +#define DATA_LENGTH_UINT 512 +#define CMD_HEAD_LENGTH (sizeof(st_cmd_head) - sizeof(u8*)) +static char procname[20] = {0}; + +#define UPDATE_FUNCTIONS + +#ifdef UPDATE_FUNCTIONS +extern s32 gup_enter_update_mode(struct i2c_client *client); +extern void gup_leave_update_mode(void); +extern s32 gup_update_proc(void *dir); +#endif + +extern void gtp_irq_disable(struct goodix_ts_data *); +extern void gtp_irq_enable(struct goodix_ts_data *); + +#pragma pack(1) +typedef struct{ + u8 wr; + u8 flag; + u8 flag_addr[2]; + u8 flag_val; + u8 flag_relation; + u16 circle; + u8 times; + u8 retry; + u16 delay; + u16 data_len; + u8 addr_len; + u8 addr[2]; + u8 res[3]; + u8* data; +}st_cmd_head; +#pragma pack() +st_cmd_head cmd_head; + +static struct i2c_client *gt_client = NULL; + +static struct proc_dir_entry *goodix_proc_entry; + + +static ssize_t goodix_tool_read(struct file *, char __user *, size_t, loff_t *); +static ssize_t goodix_tool_write(struct file *, const char __user *, size_t, loff_t *); +static const struct file_operations tool_ops = { + .owner = THIS_MODULE, + .read = goodix_tool_read, + .write = goodix_tool_write, +}; + +static struct class *ft_class; +#define CLASS_NAME "touchscreen" +static ssize_t goodix_sys_tool_write(struct class *class, struct class_attribute *attr,const char *buf, size_t len); +static ssize_t goodix_sys_tool_read(struct class *class, struct class_attribute *attr, char *buf); + +static CLASS_ATTR(gmnode, 0664,goodix_sys_tool_read, goodix_sys_tool_write); + + +static s32 (*tool_i2c_read)(u8 *, u16); +static s32 (*tool_i2c_write)(u8 *, u16); + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *, s32); +#endif +s32 DATA_LENGTH = 0; +s8 IC_TYPE[16] = "GT9XX"; + +static void tool_set_proc_name(char * procname) +{ + char *months[12] = {"Jan", "Feb", "Mar", "Apr", "May", + "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; + char date[20] = {0}; + char month[4] = {0}; + int i = 0, n_month = 1, n_day = 0, n_year = 0; + + + GTP_DEBUG("compile date: %s", date); + + sscanf(date, "%s %d %d", month, &n_day, &n_year); + + for (i = 0; i < 12; ++i) { + if (!memcmp(months[i], month, 3)) { + n_month = i+1; + break; + } + } + + sprintf(procname, "gmnode%04d%02d%02d", n_year, n_month, n_day); +} + + +static s32 tool_i2c_read_no_extra(u8* buf, u16 len) +{ + s32 ret = -1; + s32 i = 0; + struct i2c_msg msgs[2]; + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = gt_client->addr; + msgs[0].len = cmd_head.addr_len; + msgs[0].buf = &buf[0]; + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = gt_client->addr; + msgs[1].len = len; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + for (i = 0; i < cmd_head.retry; i++) { + ret=i2c_transfer(gt_client->adapter, msgs, 2); + if (ret > 0) { + break; + } + } + return ret; +} + +static s32 tool_i2c_write_no_extra(u8* buf, u16 len) +{ + s32 ret = -1; + s32 i = 0; + struct i2c_msg msg; + + msg.flags = !I2C_M_RD; + msg.addr = gt_client->addr; + msg.len = len; + msg.buf = buf; + + for (i = 0; i < cmd_head.retry; i++) { + ret=i2c_transfer(gt_client->adapter, &msg, 1); + if (ret > 0) { + break; + } + } + return ret; +} + +static s32 tool_i2c_read_with_extra(u8* buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_read_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static s32 tool_i2c_write_with_extra(u8* buf, u16 len) +{ + s32 ret = -1; + u8 pre[2] = {0x0f, 0xff}; + u8 end[2] = {0x80, 0x00}; + + tool_i2c_write_no_extra(pre, 2); + ret = tool_i2c_write_no_extra(buf, len); + tool_i2c_write_no_extra(end, 2); + + return ret; +} + +static void register_i2c_func(void) +{ + if (strncmp(IC_TYPE, "GT8110", 6) && strncmp(IC_TYPE, "GT8105", 6) + && strncmp(IC_TYPE, "GT801", 5) && strncmp(IC_TYPE, "GT800", 5) + && strncmp(IC_TYPE, "GT801PLUS", 9) && strncmp(IC_TYPE, "GT811", 5) + && strncmp(IC_TYPE, "GTxxx", 5) && strncmp(IC_TYPE, "GT9XX", 5)) { + tool_i2c_read = tool_i2c_read_with_extra; + tool_i2c_write = tool_i2c_write_with_extra; + GTP_DEBUG("I2C function: with pre and end cmd!"); + } else { + tool_i2c_read = tool_i2c_read_no_extra; + tool_i2c_write = tool_i2c_write_no_extra; + GTP_INFO("I2C function: without pre and end cmd!"); + } +} + +static void unregister_i2c_func(void) +{ + tool_i2c_read = NULL; + tool_i2c_write = NULL; + GTP_INFO("I2C function: unregister i2c transfer function!"); +} + +s32 init_wr_node(struct i2c_client *client) +{ + s32 i; + s32 err; + + gt_client = client; + memset(&cmd_head, 0, sizeof(cmd_head)); + cmd_head.data = NULL; + + i = 5; + while ((!cmd_head.data) && i) { + cmd_head.data = kzalloc(i * DATA_LENGTH_UINT, GFP_KERNEL); + if (NULL != cmd_head.data) { + break; + } + i--; + } + if (i) { + DATA_LENGTH = i * DATA_LENGTH_UINT + GTP_ADDR_LENGTH; + GTP_INFO("Applied memory size:%d.", DATA_LENGTH); + } else { + GTP_ERROR("Apply for memory failed."); + return FAIL; + } + + cmd_head.addr_len = 2; + cmd_head.retry = 5; + + register_i2c_func(); + + tool_set_proc_name(procname); + goodix_proc_entry = proc_create(procname, 0666, NULL, &tool_ops); + if (goodix_proc_entry == NULL) { + GTP_ERROR("Couldn't create proc entry!"); + return FAIL; + } else { + GTP_INFO("Create proc entry success!"); + } + + ft_class = class_create(THIS_MODULE, CLASS_NAME); + if (IS_ERR(ft_class)) { + GTP_ERROR("Failed to create class.\n"); + return FAIL; + } + err = class_create_file(ft_class, &class_attr_gmnode); + if (err) { + GTP_ERROR("Failed to create class file.\n"); + } + return SUCCESS; +} + +void uninit_wr_node(void) +{ + kfree(cmd_head.data); + cmd_head.data = NULL; + unregister_i2c_func(); + remove_proc_entry(procname, NULL); +} + +static u8 relation(u8 src, u8 dst, u8 rlt) +{ + u8 ret = 0; + + switch (rlt) { + case 0: + ret = (src != dst) ? true : false; + break; + + case 1: + ret = (src == dst) ? true : false; + GTP_DEBUG("equal:src:0x%02x dst:0x%02x ret:%d.", src, dst, (s32)ret); + break; + + case 2: + ret = (src > dst) ? true : false; + break; + + case 3: + ret = (src < dst) ? true : false; + break; + + case 4: + ret = (src & dst) ? true : false; + break; + + case 5: + ret = (!(src | dst)) ? true : false; + break; + + default: + ret = false; + break; + } + + return ret; +} + +/******************************************************* +Function: + Comfirm function. +Input: + None. +Output: + Return write length. +********************************************************/ +static u8 comfirm(void) +{ + s32 i = 0; + u8 buf[32]; + + memcpy(buf, cmd_head.flag_addr, cmd_head.addr_len); + + for (i = 0; i < cmd_head.times; i++) { + if (tool_i2c_read(buf, 1) <= 0) { + GTP_ERROR("Read flag data failed!"); + return FAIL; + } + if (true == relation(buf[GTP_ADDR_LENGTH], cmd_head.flag_val, cmd_head.flag_relation)) { + GTP_DEBUG("value at flag addr:0x%02x.", buf[GTP_ADDR_LENGTH]); + GTP_DEBUG("flag value:0x%02x.", cmd_head.flag_val); + break; + } + + msleep(cmd_head.circle); + } + + if (i >= cmd_head.times) { + GTP_ERROR("Didn't get the flag to continue!"); + return FAIL; + } + + return SUCCESS; +} + +static ssize_t goodix_sys_tool_write(struct class *class, struct class_attribute *attr,const char *buf, size_t len) +{ + + GTP_DEBUG_FUNC(); + GTP_DEBUG_ARRAY((u8*)buf, len); + + memcpy(&cmd_head, buf, CMD_HEAD_LENGTH); + + GTP_DEBUG("[Operation]wr: %02X", cmd_head.wr); + GTP_DEBUG("[Flag]flag: %02X, addr: %02X%02X, value: %02X, relation: %02X", cmd_head.flag, cmd_head.flag_addr[0], + cmd_head.flag_addr[1], cmd_head.flag_val, cmd_head.flag_relation); + GTP_DEBUG("[Retry]circle: %d, times: %d, retry: %d, delay: %d", (s32)cmd_head.circle, (s32)cmd_head.times, + (s32)cmd_head.retry, (s32)cmd_head.delay); + GTP_DEBUG("[Data]data len: %d, addr len: %d, addr: %02X%02X, buffer len: %d, data[0]: %02X", (s32)cmd_head.data_len, + (s32)cmd_head.addr_len, cmd_head.addr[0], cmd_head.addr[1], (s32)len, buf[CMD_HEAD_LENGTH]); + + if (1 == cmd_head.wr) { + memcpy(&cmd_head.data[GTP_ADDR_LENGTH], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG_ARRAY(cmd_head.data, cmd_head.data_len + cmd_head.addr_len); + GTP_DEBUG_ARRAY((u8*)&buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[WRITE]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + } + if (tool_i2c_write(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + cmd_head.data_len + cmd_head.addr_len) <= 0) { + GTP_ERROR("[WRITE]Write data failed!"); + return -EPERM; + } + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len],cmd_head.data_len + cmd_head.addr_len); + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + } else if (3 == cmd_head.wr) { + memcpy(&cmd_head.data[0], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + + register_i2c_func(); + } else if (5 == cmd_head.wr) { + } else if (7 == cmd_head.wr) { + gtp_irq_disable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_OFF); + #endif + } else if (9 == cmd_head.wr) { + gtp_irq_enable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_ON); + #endif + } else if (17 == cmd_head.wr) { + struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); + memcpy(&cmd_head.data[GTP_ADDR_LENGTH], &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (cmd_head.data[GTP_ADDR_LENGTH]) { + GTP_INFO("gtp enter rawdiff."); + ts->gtp_rawdiff_mode = true; + } else { + ts->gtp_rawdiff_mode = false; + GTP_INFO("gtp leave rawdiff."); + } + } +#ifdef UPDATE_FUNCTIONS + else if (11 == cmd_head.wr) { + if (FAIL == gup_enter_update_mode(gt_client)) { + return -EPERM; + } + } else if (13 == cmd_head.wr) { + gup_leave_update_mode(); + } else if (15 == cmd_head.wr) { + show_len = 0; + total_len = 0; + memset(cmd_head.data, 0, cmd_head.data_len + 1); + memcpy(cmd_head.data, &buf[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (FAIL == gup_update_proc((void*)cmd_head.data)) { + return -EPERM; + } + } + +#endif + + return len; +} +/******************************************************* +Function: + Goodix tool write function. +Input: + standard proc write function param. +Output: + Return write length. +********************************************************/ +ssize_t goodix_tool_write(struct file *filp, const char __user *buff, size_t len, loff_t *off) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + GTP_DEBUG_ARRAY((u8*)buff, len); + + ret = copy_from_user(&cmd_head, buff, CMD_HEAD_LENGTH); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + + + GTP_DEBUG("[Operation]wr: %02X", cmd_head.wr); + GTP_DEBUG("[Flag]flag: %02X, addr: %02X%02X, value: %02X, relation: %02X", cmd_head.flag, cmd_head.flag_addr[0], + cmd_head.flag_addr[1], cmd_head.flag_val, cmd_head.flag_relation); + GTP_DEBUG("[Retry]circle: %d, times: %d, retry: %d, delay: %d", (s32)cmd_head.circle, (s32)cmd_head.times, + (s32)cmd_head.retry, (s32)cmd_head.delay); + GTP_DEBUG("[Data]data len: %d, addr len: %d, addr: %02X%02X, buffer len: %d, data[0]: %02X", (s32)cmd_head.data_len, + (s32)cmd_head.addr_len, cmd_head.addr[0], cmd_head.addr[1], (s32)len, buff[CMD_HEAD_LENGTH]); + + if (1 == cmd_head.wr) { + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG_ARRAY(cmd_head.data, cmd_head.data_len + cmd_head.addr_len); + GTP_DEBUG_ARRAY((u8*)&buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[WRITE]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + } + if (tool_i2c_write(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + cmd_head.data_len + cmd_head.addr_len) <= 0) { + GTP_ERROR("[WRITE]Write data failed!"); + return -EPERM; + } + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len],cmd_head.data_len + cmd_head.addr_len); + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + } else if (3 == cmd_head.wr) { + ret = copy_from_user(&cmd_head.data[0], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_ERROR("copy_from_user failed."); + return -EPERM; + } + memcpy(IC_TYPE, cmd_head.data, cmd_head.data_len); + + register_i2c_func(); + } else if (5 == cmd_head.wr) { + } else if (7 == cmd_head.wr) { + gtp_irq_disable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_OFF); + #endif + } else if (9 == cmd_head.wr) { + gtp_irq_enable(i2c_get_clientdata(gt_client)); + + #if GTP_ESD_PROTECT + gtp_esd_switch(gt_client, SWITCH_ON); + #endif + } else if (17 == cmd_head.wr) { + struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); + ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + if (ret) { + GTP_DEBUG("copy_from_user failed."); + return -EPERM; + } + if (cmd_head.data[GTP_ADDR_LENGTH]) { + GTP_INFO("gtp enter rawdiff."); + ts->gtp_rawdiff_mode = true; + } else { + ts->gtp_rawdiff_mode = false; + GTP_INFO("gtp leave rawdiff."); + } + } +#ifdef UPDATE_FUNCTIONS + else if (11 == cmd_head.wr) { + if (FAIL == gup_enter_update_mode(gt_client)) { + return -EPERM; + } + } else if (13 == cmd_head.wr) { + gup_leave_update_mode(); + } else if (15 == cmd_head.wr) { + show_len = 0; + total_len = 0; + memset(cmd_head.data, 0, cmd_head.data_len + 1); + memcpy(cmd_head.data, &buff[CMD_HEAD_LENGTH], cmd_head.data_len); + + if (FAIL == gup_update_proc((void*)cmd_head.data)) { + return -EPERM; + } + } + +#endif + + return len; +} +static ssize_t goodix_sys_tool_read(struct class *class, struct class_attribute *attr, char *buf) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + + if (cmd_head.wr % 2) { + return -EPERM; + } else if (!cmd_head.wr) { + u16 len = 0; + s16 data_len = 0; + u16 loc = 0; + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[READ]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + } + + memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], cmd_head.data[1]); + GTP_DEBUG("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + + data_len = cmd_head.data_len; + + while(data_len > 0) { + if (data_len > DATA_LENGTH) { + len = DATA_LENGTH; + } else { + len = data_len; + } + data_len -= len; + + if (tool_i2c_read(cmd_head.data, len) <= 0) { + GTP_ERROR("[READ]Read data failed!"); + return -EPERM; + } + + memcpy(&buf[loc], &cmd_head.data[GTP_ADDR_LENGTH], len); + loc += len; + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH], len); + GTP_DEBUG_ARRAY(buf, len); + } + return cmd_head.data_len; + } else if (2 == cmd_head.wr) { + memcpy(buf, IC_TYPE, sizeof(IC_TYPE)); + return ret; + } else if (4 == cmd_head.wr) { + u8 progress_buf[4]; + progress_buf[0] = show_len >> 8; + progress_buf[1] = show_len & 0xff; + progress_buf[2] = total_len >> 8; + progress_buf[3] = total_len & 0xff; + memcpy(buf, progress_buf, 4); + return ret; + } else if (6 == cmd_head.wr) { + } else if (8 == cmd_head.wr) { + memcpy(buf, GTP_DRIVER_VERSION, strlen(GTP_DRIVER_VERSION)); + return ret; + } + return -EPERM; +} +/******************************************************* +Function: + Goodix tool read function. +Input: + standard proc read function param. +Output: + Return read length. +********************************************************/ +ssize_t goodix_tool_read(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + + if (*ppos) { + *ppos = 0; + return 0; + } + + if (cmd_head.wr % 2) { + return -EPERM; + } else if (!cmd_head.wr) { + u16 len = 0; + s16 data_len = 0; + u16 loc = 0; + + if (1 == cmd_head.flag) { + if (FAIL == comfirm()) { + GTP_ERROR("[READ]Comfirm fail!"); + return -EPERM; + } + } else if (2 == cmd_head.flag) { + } + + memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + + GTP_DEBUG("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], cmd_head.data[1]); + GTP_DEBUG("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); + + if (cmd_head.delay) { + msleep(cmd_head.delay); + } + + data_len = cmd_head.data_len; + + while(data_len > 0) { + if (data_len > DATA_LENGTH) { + len = DATA_LENGTH; + } else { + len = data_len; + } + data_len -= len; + + if (tool_i2c_read(cmd_head.data, len) <= 0) { + GTP_ERROR("[READ]Read data failed!"); + return -EPERM; + } + + ret = simple_read_from_buffer(&page[loc], size, ppos, &cmd_head.data[GTP_ADDR_LENGTH], len); + if (ret < 0) { + return ret; + } + loc += len; + + GTP_DEBUG_ARRAY(&cmd_head.data[GTP_ADDR_LENGTH], len); + GTP_DEBUG_ARRAY(page, len); + } + return cmd_head.data_len; + } else if (2 == cmd_head.wr) { + ret = simple_read_from_buffer(page, size, ppos, IC_TYPE, sizeof(IC_TYPE)); + return ret; + } else if (4 == cmd_head.wr) { + u8 progress_buf[4]; + progress_buf[0] = show_len >> 8; + progress_buf[1] = show_len & 0xff; + progress_buf[2] = total_len >> 8; + progress_buf[3] = total_len & 0xff; + + ret = simple_read_from_buffer(page, size, ppos, progress_buf, 4); + return ret; + } else if (6 == cmd_head.wr) { + } else if (8 == cmd_head.wr) { + ret = simple_read_from_buffer(page, size, ppos, GTP_DRIVER_VERSION, strlen(GTP_DRIVER_VERSION)); + return ret; + } + return -EPERM; +} diff --git a/drivers/input/touchscreen/GT917D/gt917.c b/drivers/input/touchscreen/GT917D/gt917.c new file mode 100644 index 0000000000000..f7fed69dc383d --- /dev/null +++ b/drivers/input/touchscreen/GT917D/gt917.c @@ -0,0 +1,3570 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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 a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * 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. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#include +#include "gt9xx.h" + +#if GTP_ICS_SLOT_REPORT + #include +#endif + + +#if WT_ADD_CTP_INFO +#include +static char tp_string_version[40]; +static int tp_sensor_id = -1; +static u8 cfg_version; + +/*TP Color*/ +#define TP_White 0x31 +#define TP_Black 0x32 +#define TP_Golden 0x38 +/*TP Maker*/ +#define TP_BIEL 0x31 +#define GTP_LOCKDOWN_SIZE 8 +#define GTP_READ_LOCKDOWN_INFO_ADDR 0x81A0 +static u8 lockdown_info[GTP_LOCKDOWN_SIZE]; +static u8 TP_Maker, LCD_Maker, Panel_Ink; +extern u8 tp_color; +static u16 IC_Version; +static int gtp_read_lockdown_info(void); +int gtp_hardwareinfo_set(void); +#endif + +static const char *goodix_ts_name = "goodix-ts"; +static const char *goodix_input_phys = "input/ts"; +static struct workqueue_struct *goodix_wq; +struct i2c_client *i2c_connect_client = NULL; +/* +int gtp_rst_gpio; +int gtp_int_gpio; +*/ +unsigned int gtp_rst_gpio; +unsigned int gtp_int_gpio; + + +int gtp_ics_slot_report = 0;/*use to choose report mode A or B, 0 for A and 1 for B */ + + +u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] + = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; + + +#ifdef GTP_GLOVE_MODE +u8 gtp_glove_config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH] + = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; +#endif + + +#if GTP_HAVE_TOUCH_KEY + static const u16 touch_key_array[] = GTP_KEY_TAB; + #define GTP_MAX_KEY_NUM (sizeof(touch_key_array)/sizeof(touch_key_array[0])) + + #define GTP_KEY_MAP_ARRAY {{175, 1500} , {387, 1500} , {582, 1500} } + struct touch_virtual_key_map_t { + int point_x; + int point_y; +}; +static struct touch_virtual_key_map_t touch_key_point_maping_array[] = GTP_KEY_MAP_ARRAY; + + +#if GTP_DEBUG_ON + static const int key_codes[] = {KEY_HOME, KEY_BACK, KEY_MENU, KEY_SEARCH}; + static const char *key_names[] = {"Key_Home", "Key_Back", "Key_Menu", "Key_Search"}; +#endif + +#endif + +#ifdef PMX_DRIVER_GT915L +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" +static int goodix_ts_pinctrl_init(struct goodix_ts_data *goodix_data); +static int goodix_ts_pinctrl_select(struct goodix_ts_data *goodix_data, bool on); +#endif + +static s8 gtp_i2c_test(struct i2c_client *client); +void gtp_reset_guitar(struct i2c_client *client, s32 ms); +s32 gtp_send_cfg(struct i2c_client *client); +void gtp_int_sync(s32 ms); + +static ssize_t gt91xx_config_read_proc(struct file *, char __user *, size_t, loff_t *); +static ssize_t gt91xx_config_write_proc(struct file *, const char __user *, size_t, loff_t *); + +static struct proc_dir_entry *gt91xx_config_proc = NULL; +static const struct file_operations config_proc_ops = { + .owner = THIS_MODULE, + .read = gt91xx_config_read_proc, + .write = gt91xx_config_write_proc, +}; +static int gtp_register_powermanger(struct goodix_ts_data *ts); +static int gtp_unregister_powermanger(struct goodix_ts_data *ts); + +#if GTP_CREATE_WR_NODE +extern s32 init_wr_node(struct i2c_client *); +extern void uninit_wr_node(void); +#endif + +#if GTP_AUTO_UPDATE +extern u8 gup_init_update_proc(struct goodix_ts_data *); +#endif + +#if GTP_ESD_PROTECT +static struct delayed_work gtp_esd_check_work; +static struct workqueue_struct *gtp_esd_check_workqueue = NULL; +static void gtp_esd_check_func(struct work_struct *); +static s32 gtp_init_ext_watchdog(struct i2c_client *client); +void gtp_esd_switch(struct i2c_client *, s32); +#endif + + +#if GTP_COMPATIBLE_MODE +extern s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len); +extern s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len); +extern s32 gup_clk_calibration(void); +extern s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +extern u8 gup_check_fs_mounted(char *path_name); + +void gtp_recovery_reset(struct i2c_client *client); +static s32 gtp_esd_recovery(struct i2c_client *client); +s32 gtp_fw_startup(struct i2c_client *client); +static s32 gtp_main_clk_proc(struct goodix_ts_data *ts); +static s32 gtp_bak_ref_proc(struct goodix_ts_data *ts, u8 mode); + +#endif + + +#if GTP_GESTURE_WAKEUP +typedef enum { + DOZE_DISABLED = 0, + DOZE_ENABLED = 1, + DOZE_WAKEUP = 2, +} DOZE_T; +static DOZE_T doze_status = DOZE_DISABLED; +static s8 gtp_enter_doze(struct goodix_ts_data *ts); +#endif + +#ifdef GTP_CONFIG_OF +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid); +#endif + + +#if GTP_GLOVE_MODE +char gtp_glove_onoff = '0'; +static char gtp_glove_support_flag_changed = 0; +static const char gtp_glove_support_flag = GTP_GLOVE_SUPPORT_ONOFF; +s32 gtp_send_glove_cfg(struct i2c_client *client); + +static ssize_t proc_glove_onoff_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + if (0 == gtp_glove_support_flag_changed) + num = sprintf(page, "%c\n", gtp_glove_support_flag); + else + num = sprintf(page, "%c\n", gtp_glove_onoff); + *ppos += num; + return num; +} + +static ssize_t proc_glove_onoff_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_glove_onoff); + gtp_glove_support_flag_changed = 1; + + if ('1' == gtp_glove_onoff) { + u8 cfg_group[] = CTP_CFG_GROUP1_GLOVE; + gtp_reset_guitar(i2c_connect_client, 50); + msleep(100); + memcpy(>p_glove_config[GTP_ADDR_LENGTH], cfg_group, GTP_CONFIG_MAX_LENGTH); + gtp_send_glove_cfg(i2c_connect_client); + } else if ('0' == gtp_glove_onoff) { + gtp_reset_guitar(i2c_connect_client, 50); + msleep(100); + gtp_send_cfg(i2c_connect_client); + } + return count; +} + +static const struct file_operations gt_glove_onoff_proc_fops = { + .write = proc_glove_onoff_write, + .read = proc_glove_onoff_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +#endif + + +#if GTP_GESTURE_WAKEUP +char gtp_gesture_coordinate[60] = {0X8140 >> 8, 0X8140 & 0xFF}; +char gtp_gesture_value = 0; +char gtp_gesture_onoff = '0'; +const char gtp_gesture_type[] = GTP_GESTURE_TPYE_STR; +static const char gtp_gesture_support_flag = GTP_GESTURE_SUPPORT_ONOFF; +static const char gtp_verson[] = GTP_PROC_DRIVER_VERSION; +static char gtp_gesture_support_flag_changed = 0; +struct i2c_client *i2c_client_point = NULL; + + +static ssize_t proc_gesture_data_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + int num = 0; + if (*ppos) + return 0; + printk("proc_gesture_data_read=%d\n", gtp_gesture_value); + num = sprintf(buffer, "%c\n", gtp_gesture_value); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_data_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_value); + return count; +} + +static ssize_t proc_gesture_type_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) { + printk("%s\n", __func__); + return 0; + } + num = sprintf(buffer, "%s\n", gtp_gesture_type); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_type_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static ssize_t proc_gesture_onoff_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + if (0 == gtp_gesture_support_flag_changed) + num = sprintf(page, "%c\n", gtp_gesture_support_flag); + else + num = sprintf(page, "%c\n", gtp_gesture_onoff); + *ppos += num; + return num; +} + +static ssize_t proc_gesture_onoff_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + sscanf(buffer, "%c", >p_gesture_onoff); + gtp_gesture_support_flag_changed = 1; + printk("in proc_gesture_onoff_write %c \n", gtp_gesture_onoff); + return count; +} + +static ssize_t proc_version_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + int num; + if (*ppos) + return 0; + num = sprintf(page, "%s\n", gtp_verson); + *ppos += num; + return num; +} + +static ssize_t proc_version_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return count; +} + +static ssize_t proc_gesture_coordinate_read(struct file *file, char __user *page, size_t count, loff_t *ppos) +{ + if (*ppos) + return 0; + memcpy(page, gtp_gesture_coordinate, 60); + printk("GTP gtp_ges 0x%02x\n", gtp_gesture_coordinate[13]); + memset(gtp_gesture_coordinate, 0, 60); + *ppos += 60; + return 60; +} + +static ssize_t proc_gesture_coordinate_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) +{ + return count; +} + +static const struct file_operations gt_gesture_var_proc_fops = { + .write = proc_gesture_data_write, + .read = proc_gesture_data_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_gesture_type_proc_fops = { + .write = proc_gesture_type_write, + .read = proc_gesture_type_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_gesture_onoff_proc_fops = { + .write = proc_gesture_onoff_write, + .read = proc_gesture_onoff_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_version_proc_fops = { + .write = proc_version_write, + .read = proc_version_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static const struct file_operations gt_coordinate_proc_fops = { + .write = proc_gesture_coordinate_write, + .read = proc_gesture_coordinate_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + + +void Ctp_Gesture_Fucntion_Proc_File(void) +{ + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_gesture_wakup_proc = NULL; + struct proc_dir_entry *ctp_gesture_var_proc = NULL; + struct proc_dir_entry *ctp_gesture_type_proc = NULL; + struct proc_dir_entry *ctp_gesture_onoff_proc = NULL; + struct proc_dir_entry *ctp_glove_onoff_proc = NULL; + struct proc_dir_entry *ctp_version_proc = NULL; + struct proc_dir_entry *ctp_coordinate_proc = NULL; +#define CTP_GESTURE_FUNCTION_AUTHORITY_PROC 0777 + + ctp_device_proc = proc_mkdir("touchscreen_feature", NULL); + ctp_gesture_wakup_proc = proc_mkdir("gesture", NULL); + + ctp_gesture_var_proc = proc_create("data", 0444, ctp_gesture_wakup_proc, >_gesture_var_proc_fops); + if (ctp_gesture_var_proc == NULL) { + GTP_ERROR("ctp_gesture_var_proc create failed\n"); + } + + ctp_gesture_type_proc = proc_create("gesture_type", 0444, ctp_device_proc, >_gesture_type_proc_fops); + if (ctp_gesture_type_proc == NULL) { + GTP_ERROR("ctp_gesture_type_proc create failed\n"); + } + + ctp_gesture_onoff_proc = proc_create("onoff", 0666, ctp_gesture_wakup_proc, >_gesture_onoff_proc_fops); + if (ctp_gesture_onoff_proc == NULL) { + GTP_ERROR("ctp_gesture_onoff_proc create failed\n"); + } + +#if GTP_GLOVE_MODE + ctp_glove_onoff_proc = proc_create("glove_onoff", 0666, ctp_device_proc, >_glove_onoff_proc_fops); + if (ctp_glove_onoff_proc == NULL) { + GTP_ERROR("ctp_gesture_onoff_proc create failed\n"); + } +#endif + + ctp_version_proc = proc_create("version", 0444, ctp_device_proc, >_version_proc_fops); + if (ctp_version_proc == NULL) { + GTP_ERROR("create_proc_entry version failed\n"); + } + + ctp_coordinate_proc = proc_create("gesture_coordinate", 0777, ctp_device_proc, >_coordinate_proc_fops); + if (ctp_coordinate_proc == NULL) { + GTP_ERROR("create_proc_entry version failed\n"); + } + +} + +#endif + + + + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + + if (*ppos) { + GTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + return sprintf(ptr, "%02X%02X%02X%02X%02X%02X%02X%02X\n", + lockdown_info[0], lockdown_info[1], lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], lockdown_info[6], lockdown_info[7]); +} +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static const struct file_operations ctp_lockdown_procs_fops = { + .write = ctp_lockdown_proc_write, + .read = ctp_lockdown_proc_read, + .owner = THIS_MODULE, +}; + +void ctp_lockdown_fucntion_proc_file(void) +{ + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_lockdown_proc = NULL; + + ctp_device_proc = proc_mkdir("touchscreen", NULL); + + ctp_lockdown_proc = proc_create("lockdown_info", 0666, ctp_device_proc, &ctp_lockdown_procs_fops); + if (ctp_lockdown_proc == NULL) { + GTP_ERROR("create_proc_entry lockdown failed\n"); + } +} +#endif + + +/******************************************************* +Function: + Read data from the i2c slave device. +Input: + client: i2c device. + buf[0~1]: read start address. + buf[2~len-1]: read data buffer. + len: GTP_ADDR_LENGTH + read bytes count +Output: + numbers of i2c_msgs to transfer: + 2: succeed, otherwise: failed +*********************************************************/ +s32 gtp_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + if ((retries >= 5)) { + #if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); + #endif + + #if GTP_GESTURE_WAKEUP + + if (DOZE_ENABLED == doze_status) { + return ret; + } + #endif + GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + gtp_recovery_reset(client); + } else + #endif + { + gtp_reset_guitar(client, 10); + } + } + return ret; +} + + + +/******************************************************* +Function: + Write data to the i2c slave device. +Input: + client: i2c device. + buf[0~1]: write start address. + buf[2~len-1]: data buffer + len: GTP_ADDR_LENGTH + write bytes count +Output: + numbers of i2c_msgs to transfer: + 1: succeed, otherwise: failed +*********************************************************/ +s32 gtp_i2c_write(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1) + break; + retries++; + } + if ((retries >= 5)) { + #if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); + #endif + + #if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) { + return ret; + } + #endif + GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d! Process reset.", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + gtp_recovery_reset(client); + } else + #endif + { + gtp_reset_guitar(client, 10); + } + } + return ret; +} + + +/******************************************************* +Function: + i2c read twice, compare the results +Input: + client: i2c device + addr: operate address + rxbuf: read data to store, if compare successful + len: bytes to read +Output: + FAIL: read failed + SUCCESS: read successful +*********************************************************/ +s32 gtp_i2c_read_dbl_check(struct i2c_client *client, u16 addr, u8 *rxbuf, int len) +{ + u8 buf[16] = {0}; + u8 confirm_buf[16] = {0}; + u8 retry = 0; + + while (retry++ < 3) { + memset(buf, 0xAA, 16); + buf[0] = (u8)(addr >> 8); + buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, buf, len + 2); + + memset(confirm_buf, 0xAB, 16); + confirm_buf[0] = (u8)(addr >> 8); + confirm_buf[1] = (u8)(addr & 0xFF); + gtp_i2c_read(client, confirm_buf, len + 2); + + if (!memcmp(buf, confirm_buf, len+2)) { + memcpy(rxbuf, confirm_buf+2, len); + return SUCCESS; + } + } + GTP_ERROR("I2C read 0x%04X, %d bytes, double check failed!", addr, len); + return FAIL; +} + +/******************************************************* +Function: + Send config. +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ + +s32 gtp_send_glove_cfg(struct i2c_client *client) +{ + s32 ret = 2; + +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts->pnl_init_error) { + GTP_INFO("Error occured in init_panel, no config sent"); + return 0; + } + GTP_INFO("Driver send config."); + for (retry = 0; retry < 5; retry++) { + ret = gtp_i2c_write(client, gtp_glove_config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + if (ret > 0) { + break; + } + } +#endif + return ret; +} + +/******************************************************* +Function: + Send config. +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ + +s32 gtp_send_cfg(struct i2c_client *client) +{ + s32 ret = 2; + +#if GTP_DRIVER_SEND_CFG + s32 retry = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts->pnl_init_error) { + GTP_INFO("Error occured in init_panel, no config sent"); + return 0; + } + + GTP_INFO("Driver send config."); + for (retry = 0; retry < 5; retry++) { + ret = gtp_i2c_write(client, config , GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH); + if (ret > 0) { + break; + } + } +#endif + return ret; +} +/******************************************************* +Function: + Disable irq function +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +void gtp_irq_disable(struct goodix_ts_data *ts) +{ + unsigned long irqflags; + + GTP_DEBUG_FUNC(); + + spin_lock_irqsave(&ts->irq_lock, irqflags); + if (!ts->irq_is_disable) { + ts->irq_is_disable = 1; + disable_irq_nosync(ts->client->irq); + } + spin_unlock_irqrestore(&ts->irq_lock, irqflags); +} + +/******************************************************* +Function: + Enable irq function +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +void gtp_irq_enable(struct goodix_ts_data *ts) +{ + unsigned long irqflags = 0; + + GTP_DEBUG_FUNC(); + + spin_lock_irqsave(&ts->irq_lock, irqflags); + if (ts->irq_is_disable) { + enable_irq(ts->client->irq); + ts->irq_is_disable = 0; + } + spin_unlock_irqrestore(&ts->irq_lock, irqflags); +} + + +/******************************************************* +Function: + Report touch point event +Input: + ts: goodix i2c_client private data + id: trackId + x: input x coordinate + y: input y coordinate + w: input pressure +Output: + None. +*********************************************************/ +static void gtp_touch_down(struct goodix_ts_data *ts, s32 id, s32 x, s32 y, s32 w) +{ +#if GTP_CHANGE_X2Y + GTP_SWAP(x, y); +#endif + + + if (gtp_ics_slot_report == 1) { + input_mt_slot(ts->input_dev, id); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + } else { + input_report_key(ts->input_dev, BTN_TOUCH, 1); + input_report_abs(ts->input_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->input_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->input_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_WIDTH_MAJOR, w); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, id); + input_mt_sync(ts->input_dev); + } + + GTP_DEBUG("ID:%d, X:%d, Y:%d, W:%d", id, x, y, w); +} + +/******************************************************* +Function: + Report touch release event +Input: + ts: goodix i2c_client private data +Output: + None. +*********************************************************/ +static void gtp_touch_up(struct goodix_ts_data *ts, s32 id) +{ + + if (gtp_ics_slot_report == 1) { + input_mt_slot(ts->input_dev, id); + input_report_abs(ts->input_dev, ABS_MT_TRACKING_ID, -1); + GTP_DEBUG("Touch id[%2d] release!", id); + } else { + input_report_key(ts->input_dev, BTN_TOUCH, 0); + } + +} + +#if GTP_WITH_PEN + +static void gtp_pen_init(struct goodix_ts_data *ts) +{ + s32 ret = 0; + + GTP_INFO("Request input device for pen/stylus."); + + ts->pen_dev = input_allocate_device(); + if (ts->pen_dev == NULL) { + GTP_ERROR("Failed to allocate input device for pen/stylus."); + return; + } + + ts->pen_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; + + + if (gtp_ics_slot_report == 1) { + input_mt_init_slots(ts->pen_dev, 16); + } else { + ts->pen_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); + } + + set_bit(BTN_TOOL_PEN, ts->pen_dev->keybit); + set_bit(INPUT_PROP_DIRECT, ts->pen_dev->propbit); + + +#if GTP_PEN_HAVE_BUTTON + input_set_capability(ts->pen_dev, EV_KEY, BTN_STYLUS); + input_set_capability(ts->pen_dev, EV_KEY, BTN_STYLUS2); +#endif + + input_set_abs_params(ts->pen_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_PRESSURE, 0, 255, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->pen_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); + + ts->pen_dev->name = "goodix-pen"; + ts->pen_dev->id.bustype = BUS_I2C; + + ret = input_register_device(ts->pen_dev); + if (ret) { + GTP_ERROR("Register %s input device failed", ts->pen_dev->name); + return; + } +} + +static void gtp_pen_down(s32 x, s32 y, s32 w, s32 id) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + +#if GTP_CHANGE_X2Y + GTP_SWAP(x, y); +#endif + + input_report_key(ts->pen_dev, BTN_TOOL_PEN, 1); + + + if (gtp_ics_slot_report == 1) { + input_mt_slot(ts->pen_dev, id); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, id); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->pen_dev, ABS_MT_PRESSURE, w); + input_report_abs(ts->pen_dev, ABS_MT_TOUCH_MAJOR, w); + } else { + input_report_key(ts->pen_dev, BTN_TOUCH, 1); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_X, x); + input_report_abs(ts->pen_dev, ABS_MT_POSITION_Y, y); + input_report_abs(ts->pen_dev, ABS_MT_PRESSURE, w); + input_report_abs(ts->pen_dev, ABS_MT_TOUCH_MAJOR, w); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, id); + input_mt_sync(ts->pen_dev); + } + + GTP_DEBUG("(%d)(%d, %d)[%d]", id, x, y, w); +} + +static void gtp_pen_up(s32 id) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + + input_report_key(ts->pen_dev, BTN_TOOL_PEN, 0); + + + if (gtp_ics_slot_report == 1) { + input_mt_slot(ts->pen_dev, id); + input_report_abs(ts->pen_dev, ABS_MT_TRACKING_ID, -1); + } else { + input_report_key(ts->pen_dev, BTN_TOUCH, 0); + } + +} +#endif + +/******************************************************* +Function: + Goodix touchscreen work function +Input: + work: work struct of goodix_workqueue +Output: + None. +*********************************************************/ +static void goodix_ts_work_func(struct work_struct *work) +{ + u8 end_cmd[3] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF, 0}; + u8 point_data[2 + 1 + 8 * GTP_MAX_TOUCH + 1] = {GTP_READ_COOR_ADDR >> 8, GTP_READ_COOR_ADDR & 0xFF}; + u8 touch_num = 0; + u8 finger = 0; + static u16 pre_touch; + static u8 pre_key; +#if GTP_WITH_PEN + u8 pen_active = 0; + static u8 pre_pen; +#endif + u8 key_value = 0; + u8 *coor_data = NULL; + s32 input_x = 0; + s32 input_y = 0; + s32 input_w = 0; + s32 id = 0; + s32 i = 0; + s32 ret = -1; + struct goodix_ts_data *ts = NULL; + +#if GTP_COMPATIBLE_MODE + u8 rqst_buf[3] = {0x80, 0x43}; +#endif + +#if GTP_GESTURE_WAKEUP + u8 doze_buf[3] = {0x81, 0x4B}; +#endif + + GTP_DEBUG_FUNC(); + ts = container_of(work, struct goodix_ts_data, work); + if (ts->enter_update) { + return; + } +#if GTP_GESTURE_WAKEUP + if (DOZE_ENABLED == doze_status) { + ret = gtp_i2c_read(i2c_connect_client, doze_buf, 3); + GTP_DEBUG("0x814B = 0x%02X", doze_buf[2]); + if (ret > 0) { + if ('1' == gtp_gesture_onoff) { + gtp_gesture_coordinate[0] = 0X8140 >> 8; + gtp_gesture_coordinate[1] = 0X8140 & 0xFF; + + if ((doze_buf[2] == 'a') || (doze_buf[2] == 'b') || (doze_buf[2] == 'c') || + (doze_buf[2] == 'd') || (doze_buf[2] == 'e') || (doze_buf[2] == 'g') || + (doze_buf[2] == 'h') || (doze_buf[2] == 'm') || (doze_buf[2] == 'o') || + (doze_buf[2] == 'q') || (doze_buf[2] == 's') || (doze_buf[2] == 'v') || + (doze_buf[2] == 'w') || (doze_buf[2] == 'y') || (doze_buf[2] == 'z') || + (doze_buf[2] == 0x5E) /* ^ */ + ) { + GTP_INFO("Gesture type;%c\n", doze_buf[2]); + gtp_gesture_value = doze_buf[2]; + if (doze_buf[2] != 0x5E) { + GTP_INFO("Wakeup by gesture(%c), light up the screen!", doze_buf[2]); + } else { + GTP_INFO("Wakeup by gesture(^), light up the screen!"); + } + + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL != strchr(gtp_gesture_type, gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + }; + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else if ((doze_buf[2] == 0xAA) || (doze_buf[2] == 0xBB) || + (doze_buf[2] == 0xAB) || (doze_buf[2] == 0xBA)) { + char *direction[4] = {"Right", "Down", "Up", "Left"}; + u8 type = ((doze_buf[2] & 0x0F) - 0x0A) + (((doze_buf[2] >> 4) & 0x0F) - 0x0A) * 2; + GTP_INFO("%s slide to light up the screen!", direction[type]); + switch (doze_buf[2]) { + case 0xAA: + gtp_gesture_value = 'R'; + break; + case 0xAB: + gtp_gesture_value = 'D'; + break; + case 0xBA: + gtp_gesture_value = 'U'; + break; + case 0xBB: + gtp_gesture_value = 'L'; + break; + } + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL != strchr(gtp_gesture_type, gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + } + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else if (0xCC == doze_buf[2]) { + GTP_INFO("Double click to light up the screen!"); + gtp_gesture_value = 'K'; + gtp_i2c_read(i2c_client_point, gtp_gesture_coordinate, 47); + if (NULL != strchr(gtp_gesture_type, gtp_gesture_value)) { + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + msleep(300); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + } + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + } else { + doze_buf[2] = 0x00; + gtp_i2c_write(i2c_connect_client, doze_buf, 3); + gtp_enter_doze(ts); + } + } + } + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } +#endif + + ret = gtp_i2c_read(ts->client, point_data, 12); + if (ret < 0) { + GTP_ERROR("I2C transfer error. errno:%d\n ", ret); + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } + + finger = point_data[GTP_ADDR_LENGTH]; + +#if GTP_COMPATIBLE_MODE + + if ((finger == 0x00) && (CHIP_TYPE_GT9F == ts->chip_type)) { + ret = gtp_i2c_read(ts->client, rqst_buf, 3); + if (ret < 0) { + GTP_ERROR("Read request status error!"); + goto exit_work_func; + } + + switch (rqst_buf[2]) { + case GTP_RQST_CONFIG: + GTP_INFO("Request for config."); + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Request for config unresponded!"); + } else { + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + GTP_INFO("Request for config responded!"); + } + break; + + case GTP_RQST_BAK_REF: + GTP_INFO("Request for backup reference."); + ts->rqst_processing = 1; + ret = gtp_bak_ref_proc(ts, GTP_BAK_REF_SEND); + if (SUCCESS == ret) { + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + ts->rqst_processing = 0; + GTP_INFO("Request for backup reference responded!"); + } else { + GTP_ERROR("Requeset for backup reference unresponed!"); + } + break; + + case GTP_RQST_RESET: + GTP_INFO("Request for reset."); + gtp_recovery_reset(ts->client); + break; + + case GTP_RQST_MAIN_CLOCK: + GTP_INFO("Request for main clock."); + ts->rqst_processing = 1; + ret = gtp_main_clk_proc(ts); + if (FAIL == ret) { + GTP_ERROR("Request for main clock unresponded!"); + } else { + GTP_INFO("Request for main clock responded!"); + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + ts->rqst_processing = 0; + ts->clk_chk_fs_times = 0; + } + break; + + default: + GTP_INFO("Undefined request: 0x%02X", rqst_buf[2]); + rqst_buf[2] = GTP_RQST_RESPONDED; + gtp_i2c_write(ts->client, rqst_buf, 3); + break; + } + } +#endif + if (finger == 0x00) { + if (ts->use_irq) { + gtp_irq_enable(ts); + } + return; + } + + if ((finger & 0x80) == 0) { + goto exit_work_func; + } + + touch_num = finger & 0x0f; + + if (touch_num > GTP_MAX_TOUCH) { + goto exit_work_func; + } + + if (touch_num > 1) { + u8 buf[8 * GTP_MAX_TOUCH] = {(GTP_READ_COOR_ADDR + 10) >> 8, (GTP_READ_COOR_ADDR + 10) & 0xff}; + + ret = gtp_i2c_read(ts->client, buf, 2 + 8 * (touch_num - 1)); + memcpy(&point_data[12], &buf[2], 8 * (touch_num - 1)); + } + +#if (GTP_HAVE_TOUCH_KEY || GTP_PEN_HAVE_BUTTON) + key_value = point_data[3 + 8 * touch_num]; + + if (key_value || pre_key) { + #if GTP_PEN_HAVE_BUTTON + if (key_value == 0x40) { + GTP_DEBUG("BTN_STYLUS & BTN_STYLUS2 Down."); + input_report_key(ts->pen_dev, BTN_STYLUS, 1); + input_report_key(ts->pen_dev, BTN_STYLUS2, 1); + pen_active = 1; + } else if (key_value == 0x10) { + GTP_DEBUG("BTN_STYLUS Down, BTN_STYLUS2 Up."); + input_report_key(ts->pen_dev, BTN_STYLUS, 1); + input_report_key(ts->pen_dev, BTN_STYLUS2, 0); + pen_active = 1; + } else if (key_value == 0x20) { + GTP_DEBUG("BTN_STYLUS Up, BTN_STYLUS2 Down."); + input_report_key(ts->pen_dev, BTN_STYLUS, 0); + input_report_key(ts->pen_dev, BTN_STYLUS2, 1); + pen_active = 1; + } else { + GTP_DEBUG("BTN_STYLUS & BTN_STYLUS2 Up."); + input_report_key(ts->pen_dev, BTN_STYLUS, 0); + input_report_key(ts->pen_dev, BTN_STYLUS2, 0); + if ((pre_key == 0x40) || (pre_key == 0x20) || + (pre_key == 0x10) + ) { + pen_active = 1; + } + } + if (pen_active) { + touch_num = 0; + + } + #endif + + #if GTP_HAVE_TOUCH_KEY + if (!pre_touch) { + for (i = 0; i < GTP_MAX_KEY_NUM; i++) { + #if GTP_DEBUG_ON + for (ret = 0; ret < 4; ++ret) { + if (key_codes[ret] == touch_key_array[i]) { + GTP_DEBUG("Key: %s %s", key_names[ret], (key_value & (0x01 << i)) ? "Down" : "Up"); + break; + } + } + #endif + + if (gtp_ics_slot_report == 1) + input_report_key(ts->input_dev, touch_key_array[i], key_value & (0x01<pen_dev); + } else +#endif + { + input_sync(ts->input_dev); + } + +exit_work_func: + if (!ts->gtp_rawdiff_mode) { + ret = gtp_i2c_write(ts->client, end_cmd, 3); + if (ret < 0) { + GTP_INFO("I2C write end_cmd error!"); + } + } + if (ts->use_irq) { + gtp_irq_enable(ts); + } +} + +/******************************************************* +Function: + Timer interrupt service routine for polling mode. +Input: + timer: timer struct pointer +Output: + Timer work mode. + HRTIMER_NORESTART: no restart mode +*********************************************************/ +static enum hrtimer_restart goodix_ts_timer_handler(struct hrtimer *timer) +{ + struct goodix_ts_data *ts = container_of(timer, struct goodix_ts_data, timer); + + GTP_DEBUG_FUNC(); + + queue_work(goodix_wq, &ts->work); + hrtimer_start(&ts->timer, ktime_set(0, (GTP_POLL_TIME+6)*1000000), HRTIMER_MODE_REL); + return HRTIMER_NORESTART; +} + +/******************************************************* +Function: + External interrupt service routine for interrupt mode. +Input: + irq: interrupt number. + dev_id: private data pointer +Output: + Handle Result. + IRQ_HANDLED: interrupt handled successfully +*********************************************************/ +static irqreturn_t goodix_ts_irq_handler(int irq, void *dev_id) +{ + struct goodix_ts_data *ts = dev_id; + + GTP_DEBUG_FUNC(); + + gtp_irq_disable(ts); + + queue_work(goodix_wq, &ts->work); + + return IRQ_HANDLED; +} +/******************************************************* +Function: + Synchronization. +Input: + ms: synchronization time in millisecond. +Output: + None. +*******************************************************/ +void gtp_int_sync(s32 ms) +{ + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(ms); + GTP_GPIO_AS_INT(gtp_int_gpio); +} + + +/******************************************************* +Function: + Reset chip. +Input: + ms: reset time in millisecond +Output: + None. +*******************************************************/ +void gtp_reset_guitar(struct i2c_client *client, s32 ms) +{ +#if GTP_COMPATIBLE_MODE + struct goodix_ts_data *ts = i2c_get_clientdata(client); +#endif + + GTP_DEBUG_FUNC(); + GTP_INFO("Guitar reset"); + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(ms); + + GTP_GPIO_OUTPUT(gtp_int_gpio, client->addr == 0x14); + + msleep(2); + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + msleep(6); + + GTP_GPIO_AS_INPUT(gtp_rst_gpio); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return; + } +#endif + + gtp_int_sync(50); +#if GTP_ESD_PROTECT + gtp_init_ext_watchdog(client); +#endif +} + +#if GTP_GESTURE_WAKEUP +/******************************************************* +Function: + Enter doze mode for sliding wakeup. +Input: + ts: goodix tp private data +Output: + 1: succeed, otherwise failed +*******************************************************/ +static s8 gtp_enter_doze(struct goodix_ts_data *ts) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 8}; + + GTP_DEBUG_FUNC(); + + GTP_DEBUG("Entering gesture mode."); + while (retry++ < 5) { + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x46; + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret < 0) { + GTP_DEBUG("failed to set doze flag into 0x8046, %d", retry); + continue; + } + i2c_control_buf[0] = 0x80; + i2c_control_buf[1] = 0x40; + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret > 0) { + doze_status = DOZE_ENABLED; + GTP_INFO("Gesture mode enabled."); + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send gesture cmd failed."); + return ret; +} +#endif +/******************************************************* +Function: + Enter sleep mode. +Input: + ts: private data. +Output: + Executive outcomes. + 1: succeed, otherwise failed. +*******************************************************/ +static s8 gtp_enter_sleep(struct goodix_ts_data *ts) +{ + s8 ret = -1; + s8 retry = 0; + u8 i2c_control_buf[3] = {(u8)(GTP_REG_SLEEP >> 8), (u8)GTP_REG_SLEEP, 5}; + +#if GTP_COMPATIBLE_MODE + u8 status_buf[3] = {0x80, 0x44}; +#endif + + GTP_DEBUG_FUNC(); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + + ret = gtp_i2c_read(ts->client, status_buf, 3); + if (ret < 0) { + GTP_ERROR("failed to get backup-reference status"); + } + + if (status_buf[2] & 0x80) { + ret = gtp_bak_ref_proc(ts, GTP_BAK_REF_STORE); + if (FAIL == ret) { + GTP_ERROR("failed to store bak_ref"); + } + } + } +#endif + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(5); + + while (retry++ < 5) { + ret = gtp_i2c_write(ts->client, i2c_control_buf, 3); + if (ret > 0) { + GTP_INFO("GTP enter sleep!"); + + return ret; + } + msleep(10); + } + GTP_ERROR("GTP send sleep cmd failed."); + return ret; +} + +/******************************************************* +Function: + Wakeup from sleep. +Input: + ts: private data. +Output: + Executive outcomes. + >0: succeed, otherwise: failed. +*******************************************************/ +static s8 gtp_wakeup_sleep(struct goodix_ts_data *ts) +{ + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG_FUNC(); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + u8 opr_buf[3] = {0x41, 0x80}; + + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(5); + + for (retry = 0; retry < 10; ++retry) { + + opr_buf[2] = 0x0C; + ret = gtp_i2c_write(ts->client, opr_buf, 3); + if (FAIL == ret) { + GTP_ERROR("failed to hold ss51 & dsp!"); + continue; + } + opr_buf[2] = 0x00; + ret = gtp_i2c_read(ts->client, opr_buf, 3); + if (FAIL == ret) { + GTP_ERROR("failed to get ss51 & dsp status!"); + continue; + } + if (0x0C != opr_buf[2]) { + GTP_DEBUG("ss51 & dsp not been hold, %d", retry+1); + continue; + } + GTP_DEBUG("ss51 & dsp confirmed hold"); + + ret = gtp_fw_startup(ts->client); + if (FAIL == ret) { + GTP_ERROR("failed to startup GT9XXF, process recovery"); + gtp_esd_recovery(ts->client); + } + break; + } + if (retry >= 10) { + GTP_ERROR("failed to wakeup, processing esd recovery"); + gtp_esd_recovery(ts->client); + } else { + GTP_INFO("GT9XXF gtp wakeup success"); + } + return ret; + } +#endif + +#if GTP_POWER_CTRL_SLEEP + while (retry++ < 5) { + gtp_reset_guitar(ts->client, 20); + + GTP_INFO("GTP wakeup sleep."); + return 1; + } +#else + while (retry++ < 10) { + #if GTP_GESTURE_WAKEUP + if (DOZE_WAKEUP != doze_status) { + GTP_INFO("Powerkey wakeup."); + } else { + GTP_INFO("Gesture wakeup."); + } + doze_status = DOZE_DISABLED; + gtp_irq_disable(ts); + gtp_reset_guitar(ts->client, 10); + gtp_irq_enable(ts); + #else + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(5); + + #endif + + ret = gtp_i2c_test(ts->client); + if (ret > 0) { + GTP_INFO("GTP wakeup sleep."); + + #if (!GTP_GESTURE_WAKEUP) + { + gtp_int_sync(25); + #if GTP_ESD_PROTECT + gtp_init_ext_watchdog(ts->client); + #endif + } + #endif + + return ret; + } + gtp_reset_guitar(ts->client, 20); + } +#endif + + GTP_ERROR("GTP wakeup sleep failed."); + return ret; +} + +/******************************************************* +Function: + Initialize gtp. +Input: + ts: goodix private data +Output: + Executive outcomes. + 0: succeed, otherwise: failed +*******************************************************/ +static s32 gtp_init_panel(struct goodix_ts_data *ts) +{ + s32 ret = -1; + +#if GTP_DRIVER_SEND_CFG + s32 i = 0; + u8 check_sum = 0; + u8 opr_buf[16] = {0}; + u8 sensor_id = 0; + u8 drv_cfg_version; + u8 flash_cfg_version; + +/* if defined CONFIG_OF, parse config data from dtsi + * else parse config data form header file. + */ + +#ifdef GTP_CONFIG_OF + u8 cfg_info_group0[] = CTP_CFG_GROUP0; + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + + u8 *send_cfg_buf[] = {cfg_info_group0, cfg_info_group1, + cfg_info_group2, cfg_info_group3, + cfg_info_group4, cfg_info_group5}; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group0), + CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5)}; + + GTP_DEBUG("Config Groups\' Lengths: %d, %d, %d, %d, %d, %d", + cfg_info_len[0], cfg_info_len[1], cfg_info_len[2], cfg_info_len[3], + cfg_info_len[4], cfg_info_len[5]); +#endif + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + ts->fw_error = 0; + } else +#endif + { /* check firmware */ + ret = gtp_i2c_read_dbl_check(ts->client, 0x41E4, opr_buf, 1); + if (SUCCESS == ret) { + if (opr_buf[0] != 0xBE) { + ts->fw_error = 1; + GTP_ERROR("Firmware error, no config sent!"); + return -EPERM; + } + } + } + + /* read sensor id */ +#if GTP_COMPATIBLE_MODE + msleep(50); +#endif + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) { + if (sensor_id >= 0x06) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + ts->pnl_init_error = 1; + return -EPERM; + } + } else { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + ts->pnl_init_error = 1; + return -EPERM; + } + GTP_INFO("Sensor_ID: %d", sensor_id); + tp_sensor_id = sensor_id; + + /* parse config data*/ + + GTP_DEBUG("Get config data from header file."); + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) { + sensor_id = 0; + } + ts->gtp_cfg_len = cfg_info_len[sensor_id]; + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len); + + GTP_INFO("Config group%d used,length: %d", sensor_id, ts->gtp_cfg_len); + + if (ts->gtp_cfg_len < GTP_CONFIG_MIN_LENGTH) { + GTP_ERROR("Config Group%d is INVALID CONFIG GROUP(Len: %d)! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id, ts->gtp_cfg_len); + ts->pnl_init_error = 1; + return -EPERM; + } + +#if GTP_COMPATIBLE_MODE + if (ts->chip_type != CHIP_TYPE_GT9F) +#endif + { + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + if (ret == SUCCESS) { + GTP_DEBUG("Config Version: %d, 0x%02X; IC Config Version: %d, 0x%02X", + config[GTP_ADDR_LENGTH], config[GTP_ADDR_LENGTH], opr_buf[0], opr_buf[0]); + + flash_cfg_version = opr_buf[0]; + drv_cfg_version = config[GTP_ADDR_LENGTH]; + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + config[GTP_ADDR_LENGTH] = 0x00; + } + } else { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -EPERM; + } + } + +#if GTP_CUSTOM_CFG + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) { + config[TRIGGER_LOC] &= 0xfe; + } else if (GTP_INT_TRIGGER == 1) { + config[TRIGGER_LOC] |= 0x01; + } +#endif + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + +#else + + ts->gtp_cfg_len = GTP_CONFIG_MAX_LENGTH; + ret = gtp_i2c_read(ts->client, config, ts->gtp_cfg_len + GTP_ADDR_LENGTH); + if (ret < 0) { + GTP_ERROR("Read Config Failed, Using Default Resolution & INT Trigger!"); + ts->abs_x_max = GTP_MAX_WIDTH; + ts->abs_y_max = GTP_MAX_HEIGHT; + ts->int_trigger_type = GTP_INT_TRIGGER; + } + +#endif + + if ((ts->abs_x_max == 0) && (ts->abs_y_max == 0)) { + ts->abs_x_max = (config[RESOLUTION_LOC + 1] << 8) + config[RESOLUTION_LOC]; + ts->abs_y_max = (config[RESOLUTION_LOC + 3] << 8) + config[RESOLUTION_LOC + 2]; + ts->int_trigger_type = (config[TRIGGER_LOC]) & 0x03; + } + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + u8 sensor_num = 0; + u8 driver_num = 0; + u8 have_key = 0; + + have_key = (config[GTP_REG_HAVE_KEY - GTP_REG_CONFIG_DATA + 2] & 0x01); + + if (1 == ts->is_950) { + driver_num = config[GTP_REG_MATRIX_DRVNUM - GTP_REG_CONFIG_DATA + 2]; + sensor_num = config[GTP_REG_MATRIX_SENNUM - GTP_REG_CONFIG_DATA + 2]; + if (have_key) { + driver_num--; + } + ts->bak_ref_len = (driver_num * (sensor_num - 1) + 2) * 2 * 6; + } else { + driver_num = (config[CFG_LOC_DRVA_NUM] & 0x1F) + (config[CFG_LOC_DRVB_NUM]&0x1F); + if (have_key) { + driver_num--; + } + sensor_num = (config[CFG_LOC_SENS_NUM] & 0x0F) + ((config[CFG_LOC_SENS_NUM] >> 4) & 0x0F); + ts->bak_ref_len = (driver_num * (sensor_num - 2) + 2) * 2; + } + + GTP_INFO("Drv * Sen: %d * %d(key: %d), X_MAX: %d, Y_MAX: %d, TRIGGER: 0x%02x", + driver_num, sensor_num, have_key, ts->abs_x_max, ts->abs_y_max, ts->int_trigger_type); + return 0; + } else +#endif + { +#if GTP_DRIVER_SEND_CFG + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Send config error."); + } +#if GTP_COMPATIBLE_MODE + if (ts->chip_type != CHIP_TYPE_GT9F) +#endif + { + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + check_sum = 0; + config[GTP_ADDR_LENGTH] = drv_cfg_version; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + } + } + +#endif + GTP_INFO("X_MAX: %d, Y_MAX: %d, TRIGGER: 0x%02x", ts->abs_x_max, ts->abs_y_max, ts->int_trigger_type); + } + + msleep(10); + return 0; + +} + +static ssize_t gt91xx_config_read_proc(struct file *file, char __user *page, size_t size, loff_t *ppos) +{ + char *ptr = page; + char temp_data[GTP_CONFIG_MAX_LENGTH + 2] = {0x80, 0x47}; + int i; + + if (*ppos) { + return 0; + } + ptr += sprintf(ptr, "==== GT9XX config init value====\n"); + + for (i = 0 ; i < GTP_CONFIG_MAX_LENGTH ; i++) { + ptr += sprintf(ptr, "0x%02X ", config[i + 2]); + + if (i % 8 == 7) + ptr += sprintf(ptr, "\n"); + } + + ptr += sprintf(ptr, "\n"); + + ptr += sprintf(ptr, "==== GT9XX config real value====\n"); + gtp_i2c_read(i2c_connect_client, temp_data, GTP_CONFIG_MAX_LENGTH + 2); + for (i = 0 ; i < GTP_CONFIG_MAX_LENGTH ; i++) { + ptr += sprintf(ptr, "0x%02X ", temp_data[i+2]); + + if (i % 8 == 7) + ptr += sprintf(ptr, "\n"); + } + *ppos += ptr - page; + return (ptr - page); +} + +static ssize_t gt91xx_config_write_proc(struct file *filp, const char __user *buffer, size_t count, loff_t *off) +{ + s32 ret = 0; + + GTP_DEBUG("write count %ld\n", count); + + if (count > GTP_CONFIG_MAX_LENGTH) { + GTP_ERROR("size not match [%d:%ld]\n", GTP_CONFIG_MAX_LENGTH, count); + return -EFAULT; + } + + if (copy_from_user(&config[2], buffer, count)) { + GTP_ERROR("copy from user fail\n"); + return -EFAULT; + } + + ret = gtp_send_cfg(i2c_connect_client); + + if (ret < 0) { + GTP_ERROR("send config failed."); + } + + return count; +} +/******************************************************* +Function: + Read chip version. +Input: + client: i2c device + version: buffer to keep ic firmware version +Output: + read operation return. + 2: succeed, otherwise: failed +*******************************************************/ +s32 gtp_read_version(struct i2c_client *client, u16 *version) +{ + s32 ret = -1; + u8 buf[8] = {GTP_REG_VERSION >> 8, GTP_REG_VERSION & 0xff}; + + GTP_DEBUG_FUNC(); + + ret = gtp_i2c_read(client, buf, sizeof(buf)); + if (ret < 0) { + GTP_ERROR("GTP read version failed"); + return ret; + } + + if (version) { + *version = (buf[7] << 8) | buf[6]; + } + if (buf[5] == 0x00) { + GTP_INFO("IC Version: %c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[7], buf[6]); + } else { + GTP_INFO("IC Version: %c%c%c%c_%02x%02x", buf[2], buf[3], buf[4], buf[5], buf[7], buf[6]); + } + return ret; +} + +/******************************************************* +Function: + I2c test Function. +Input: + client:i2c client. +Output: + Executive outcomes. + 2: succeed, otherwise failed. +*******************************************************/ +static s8 gtp_i2c_test(struct i2c_client *client) +{ + u8 test[3] = {GTP_REG_CONFIG_DATA >> 8, GTP_REG_CONFIG_DATA & 0xff}; + u8 retry = 0; + s8 ret = -1; + + GTP_DEBUG_FUNC(); + + while (retry++ < 5) { + ret = gtp_i2c_read(client, test, 3); + if (ret > 0) { + return ret; + } + GTP_ERROR("GTP i2c test failed time %d.", retry); + msleep(10); + } + return ret; +} + +/******************************************************* +Function: + Request gpio(INT & RST) ports. +Input: + ts: private data. +Output: + Executive outcomes. + >= 0: succeed, < 0: failed +*******************************************************/ +static s8 gtp_request_io_port(struct goodix_ts_data *ts) +{ + s32 ret = 0; + + GTP_DEBUG_FUNC(); + ret = GTP_GPIO_REQUEST(gtp_int_gpio, "GTP INT IRQ"); + + if (ret < 0) { + GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32)gtp_int_gpio, ret); + ret = -ENODEV; + } else { + GTP_GPIO_AS_INT(gtp_int_gpio); + ts->client->irq = gpio_to_irq(gtp_int_gpio); + } + + ret = GTP_GPIO_REQUEST(gtp_rst_gpio, "GTP RST PORT"); + if (ret < 0) { + GTP_ERROR("Failed to request GPIO:%d, ERRNO:%d", (s32)gtp_rst_gpio, ret); + ret = -ENODEV; + } + + GTP_GPIO_AS_INPUT(gtp_rst_gpio); + + gtp_reset_guitar(ts->client, 20); + + if (ret < 0) { + GTP_GPIO_FREE(gtp_rst_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + } + + return ret; +} + +/******************************************************* +Function: + Request interrupt. +Input: + ts: private data. +Output: + Executive outcomes. + 0: succeed, -1: failed. +*******************************************************/ +static s8 gtp_request_irq(struct goodix_ts_data *ts) +{ + s32 ret = -1; + const u8 irq_table[] = GTP_IRQ_TAB; + + GTP_DEBUG_FUNC(); + GTP_DEBUG("INT trigger type:%x", ts->int_trigger_type); + + ret = request_irq(ts->client->irq, + goodix_ts_irq_handler, + irq_table[ts->int_trigger_type], + ts->client->name, + ts); + if (ret) { + GTP_ERROR("Request IRQ failed!ERRNO:%d.", ret); + GTP_GPIO_AS_INPUT(gtp_int_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + + hrtimer_init(&ts->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + ts->timer.function = goodix_ts_timer_handler; + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + return -EPERM; + } else { + gtp_irq_disable(ts); + ts->use_irq = 1; + return 0; + } +} + +static int fts_input_event(struct input_dev *dev, + unsigned int type, unsigned int code, int value) +{ + char buffer[16]; + + if (type == EV_SYN && code == SYN_CONFIG) { + sprintf(buffer, "%d", value); + + GTP_INFO("GTP:Gesture on/off : %d", value); + if (value >= MXT_INPUT_EVENT_START && value <= MXT_INPUT_EVENT_END) { + if (value == MXT_INPUT_EVENT_WAKUP_MODE_ON) { + gtp_gesture_onoff = '1'; + } else if (value == MXT_INPUT_EVENT_WAKUP_MODE_OFF) { + gtp_gesture_onoff = '0'; + } else { + gtp_gesture_onoff = '0'; + GTP_ERROR("Failed Open/Close Gesture Function!\n"); + return -ENOMEM; + } + } + } + + return 0; +} +/******************************************************* +Function: + Request input device Function. +Input: + ts:private data. +Output: + Executive outcomes. + 0: succeed, otherwise: failed. +*******************************************************/ +static s8 gtp_request_input_dev(struct goodix_ts_data *ts) +{ + s8 ret = -1; +#if GTP_HAVE_TOUCH_KEY + u8 index = 0; +#endif + + GTP_DEBUG_FUNC(); + + ts->input_dev = input_allocate_device(); + if (ts->input_dev == NULL) { + GTP_ERROR("Failed to allocate input device."); + return -ENOMEM; + } + + ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; + + +if (gtp_ics_slot_report == 1) { + input_mt_init_slots(ts->input_dev, 10, 0); +} else { + ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); +} + + __set_bit(INPUT_PROP_DIRECT, ts->input_dev->propbit); + +#if GTP_HAVE_TOUCH_KEY + for (index = 0; index < GTP_MAX_KEY_NUM; index++) { + input_set_capability(ts->input_dev, EV_KEY, touch_key_array[index]); + } +#endif + +#if GTP_GESTURE_WAKEUP + input_set_capability(ts->input_dev, EV_KEY, KEY_POWER); + input_set_capability(ts->input_dev, EV_KEY, KEY_WAKEUP); + __set_bit(KEY_WAKEUP, ts->input_dev->keybit); + Ctp_Gesture_Fucntion_Proc_File(); +#endif + +#if GTP_CHANGE_X2Y + GTP_SWAP(ts->abs_x_max, ts->abs_y_max); +#endif + + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_WIDTH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, 255, 0, 0); + + ts->input_dev->name = goodix_ts_name; + ts->input_dev->phys = goodix_input_phys; + ts->input_dev->id.bustype = BUS_I2C; + ts->input_dev->id.vendor = 0xDEAD; + ts->input_dev->id.product = 0xBEEF; + ts->input_dev->id.version = 10427; + + ts->input_dev->event = fts_input_event; + + + ret = input_register_device(ts->input_dev); + if (ret) { + GTP_ERROR("Register %s input device failed", ts->input_dev->name); + return -ENODEV; + } + +#if GTP_WITH_PEN + gtp_pen_init(ts); +#endif + + return 0; +} + + +#if GTP_COMPATIBLE_MODE + +s32 gtp_fw_startup(struct i2c_client *client) +{ + u8 opr_buf[4]; + s32 ret = 0; + + + opr_buf[0] = 0xAA; + ret = i2c_write_bytes(client, 0x8041, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + + + opr_buf[0] = 0x00; + ret = i2c_write_bytes(client, 0x4180, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + + gtp_int_sync(25); + + + ret = i2c_read_bytes(client, 0x8041, opr_buf, 1); + if (ret < 0) { + return FAIL; + } + if (0xAA == opr_buf[0]) { + GTP_ERROR("IC works abnormally,startup failed."); + return FAIL; + } else { + GTP_INFO("IC works normally, Startup success."); + opr_buf[0] = 0xAA; + i2c_write_bytes(client, 0x8041, opr_buf, 1); + return SUCCESS; + } +} + +static s32 gtp_esd_recovery(struct i2c_client *client) +{ + s32 retry = 0; + s32 ret = 0; + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(client); + + gtp_irq_disable(ts); + + GTP_INFO("GT9XXF esd recovery mode"); + for (retry = 0; retry < 5; retry++) { + ret = gup_fw_download_proc(NULL, GTP_FL_ESD_RECOVERY); + if (FAIL == ret) { + GTP_ERROR("esd recovery failed %d", retry+1); + continue; + } + ret = gtp_fw_startup(ts->client); + if (FAIL == ret) { + GTP_ERROR("GT9XXF start up failed %d", retry+1); + continue; + } + break; + } + gtp_irq_enable(ts); + + if (retry >= 5) { + GTP_ERROR("failed to esd recovery"); + return FAIL; + } + + GTP_INFO("Esd recovery successful"); + return SUCCESS; +} + +void gtp_recovery_reset(struct i2c_client *client) +{ +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_OFF); +#endif + GTP_DEBUG_FUNC(); + + gtp_esd_recovery(client); + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif +} + +static s32 gtp_bak_ref_proc(struct goodix_ts_data *ts, u8 mode) +{ + s32 ret = 0; + s32 i = 0; + s32 j = 0; + u16 ref_sum = 0; + u16 learn_cnt = 0; + u16 chksum = 0; + s32 ref_seg_len = 0; + s32 ref_grps = 0; + struct file *ref_filp = NULL; + u8 *p_bak_ref; + + ret = gup_check_fs_mounted("/data"); + if (FAIL == ret) { + ts->ref_chk_fs_times++; + GTP_DEBUG("Ref check /data times/MAX_TIMES: %d / %d", ts->ref_chk_fs_times, GTP_CHK_FS_MNT_MAX); + if (ts->ref_chk_fs_times < GTP_CHK_FS_MNT_MAX) { + msleep(50); + GTP_INFO("/data not mounted."); + return FAIL; + } + GTP_INFO("check /data mount timeout..."); + } else { + GTP_INFO("/data mounted!!!(%d/%d)", ts->ref_chk_fs_times, GTP_CHK_FS_MNT_MAX); + } + + p_bak_ref = (u8 *)kzalloc(ts->bak_ref_len, GFP_KERNEL); + + if (NULL == p_bak_ref) { + GTP_ERROR("Allocate memory for p_bak_ref failed!"); + return FAIL; + } + + if (ts->is_950) { + ref_seg_len = ts->bak_ref_len / 6; + ref_grps = 6; + } else { + ref_seg_len = ts->bak_ref_len; + ref_grps = 1; + } + ref_filp = filp_open(GTP_BAK_REF_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(ref_filp)) { + GTP_ERROR("Failed to open/create %s.", GTP_BAK_REF_PATH); + if (GTP_BAK_REF_SEND == mode) { + goto bak_ref_default; + } else { + goto bak_ref_exit; + } + } + + switch (mode) { + case GTP_BAK_REF_SEND: + GTP_INFO("Send backup-reference"); + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ret = ref_filp->f_op->read(ref_filp, (char *)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + if (ret < 0) { + GTP_ERROR("failed to read bak_ref info from file, sending defualt bak_ref"); + goto bak_ref_default; + } + for (j = 0; j < ref_grps; ++j) { + ref_sum = 0; + for (i = 0; i < (ref_seg_len); i += 2) { + ref_sum += (p_bak_ref[i + j * ref_seg_len] << 8) + p_bak_ref[i+1 + j * ref_seg_len]; + } + learn_cnt = (p_bak_ref[j * ref_seg_len + ref_seg_len - 4] << 8) + (p_bak_ref[j * ref_seg_len + ref_seg_len - 3]); + chksum = (p_bak_ref[j * ref_seg_len + ref_seg_len - 2] << 8) + (p_bak_ref[j * ref_seg_len + ref_seg_len - 1]); + GTP_DEBUG("learn count = %d", learn_cnt); + GTP_DEBUG("chksum = %d", chksum); + GTP_DEBUG("ref_sum = 0x%04X", ref_sum & 0xFFFF); + + if (1 != ref_sum) { + GTP_INFO("wrong chksum for bak_ref, reset to 0x00 bak_ref"); + memset(&p_bak_ref[j * ref_seg_len], 0, ref_seg_len); + p_bak_ref[ref_seg_len + j * ref_seg_len - 1] = 0x01; + } else { + if (j == (ref_grps - 1)) { + GTP_INFO("backup-reference data in %s used", GTP_BAK_REF_PATH); + } + } + } + ret = i2c_write_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (FAIL == ret) { + GTP_ERROR("failed to send bak_ref because of iic comm error"); + goto bak_ref_exit; + } + break; + + case GTP_BAK_REF_STORE: + GTP_INFO("Store backup-reference"); + ret = i2c_read_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (ret < 0) { + GTP_ERROR("failed to read bak_ref info, sending default back-reference"); + goto bak_ref_default; + } + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ref_filp->f_op->write(ref_filp, (char *)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + break; + + default: + GTP_ERROR("invalid backup-reference request"); + break; + } + ret = SUCCESS; + goto bak_ref_exit; + +bak_ref_default: + + for (j = 0; j < ref_grps; ++j) { + memset(&p_bak_ref[j * ref_seg_len], 0, ref_seg_len); + p_bak_ref[j * ref_seg_len + ref_seg_len - 1] = 0x01; + } + ret = i2c_write_bytes(ts->client, GTP_REG_BAK_REF, p_bak_ref, ts->bak_ref_len); + if (!IS_ERR(ref_filp)) { + GTP_INFO("write backup-reference data into %s", GTP_BAK_REF_PATH); + ref_filp->f_op->llseek(ref_filp, 0, SEEK_SET); + ref_filp->f_op->write(ref_filp, (char *)p_bak_ref, ts->bak_ref_len, &ref_filp->f_pos); + } + if (ret == FAIL) { + GTP_ERROR("failed to load the default backup reference"); + } + +bak_ref_exit: + + if (p_bak_ref) { + kfree(p_bak_ref); + } + if (ref_filp && !IS_ERR(ref_filp)) { + filp_close(ref_filp, NULL); + } + return ret; +} + + +static s32 gtp_verify_main_clk(u8 *p_main_clk) +{ + u8 chksum = 0; + u8 main_clock = p_main_clk[0]; + s32 i = 0; + + if (main_clock < 50 || main_clock > 120) { + return FAIL; + } + + for (i = 0; i < 5; ++i) { + if (main_clock != p_main_clk[i]) { + return FAIL; + } + chksum += p_main_clk[i]; + } + chksum += p_main_clk[5]; + if ((chksum) == 0) { + return SUCCESS; + } else { + return FAIL; + } +} + +static s32 gtp_main_clk_proc(struct goodix_ts_data *ts) +{ + s32 ret = 0; + s32 i = 0; + s32 clk_chksum = 0; + struct file *clk_filp = NULL; + u8 p_main_clk[6] = {0}; + + ret = gup_check_fs_mounted("/data"); + if (FAIL == ret) { + ts->clk_chk_fs_times++; + GTP_DEBUG("Clock check /data times/MAX_TIMES: %d / %d", ts->clk_chk_fs_times, GTP_CHK_FS_MNT_MAX); + if (ts->clk_chk_fs_times < GTP_CHK_FS_MNT_MAX) { + msleep(50); + GTP_INFO("/data not mounted."); + return FAIL; + } + GTP_INFO("Check /data mount timeout!"); + } else { + GTP_INFO("/data mounted!!!(%d/%d)", ts->clk_chk_fs_times, GTP_CHK_FS_MNT_MAX); + } + + clk_filp = filp_open(GTP_MAIN_CLK_PATH, O_RDWR | O_CREAT, 0666); + if (IS_ERR(clk_filp)) { + GTP_ERROR("%s is unavailable, calculate main clock", GTP_MAIN_CLK_PATH); + } else { + clk_filp->f_op->llseek(clk_filp, 0, SEEK_SET); + clk_filp->f_op->read(clk_filp, (char *)p_main_clk, 6, &clk_filp->f_pos); + + ret = gtp_verify_main_clk(p_main_clk); + if (FAIL == ret) { + + GTP_ERROR("main clock data in %s is wrong, recalculate main clock", GTP_MAIN_CLK_PATH); + } else { + GTP_INFO("main clock data in %s used, main clock freq: %d", GTP_MAIN_CLK_PATH, p_main_clk[0]); + filp_close(clk_filp, NULL); + goto update_main_clk; + } + } + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ret = gup_clk_calibration(); + gtp_esd_recovery(ts->client); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + + GTP_INFO("calibrate main clock: %d", ret); + if (ret < 50 || ret > 120) { + GTP_ERROR("wrong main clock: %d", ret); + goto exit_main_clk; + } + + + for (i = 0; i < 5; ++i) { + p_main_clk[i] = ret; + clk_chksum += p_main_clk[i]; + } + p_main_clk[5] = 0 - clk_chksum; + + if (!IS_ERR(clk_filp)) { + GTP_DEBUG("write main clock data into %s", GTP_MAIN_CLK_PATH); + clk_filp->f_op->llseek(clk_filp, 0, SEEK_SET); + clk_filp->f_op->write(clk_filp, (char *)p_main_clk, 6, &clk_filp->f_pos); + filp_close(clk_filp, NULL); + } + +update_main_clk: + ret = i2c_write_bytes(ts->client, GTP_REG_MAIN_CLK, p_main_clk, 6); + if (FAIL == ret) { + GTP_ERROR("update main clock failed!"); + return FAIL; + } + return SUCCESS; + +exit_main_clk: + if (!IS_ERR(clk_filp)) + filp_close(clk_filp, NULL); + return FAIL; +} + + +s32 gtp_gt9xxf_init(struct i2c_client *client) +{ + s32 ret = 0; + + ret = gup_fw_download_proc(NULL, GTP_FL_FW_BURN); + if (FAIL == ret) + return FAIL; + + ret = gtp_fw_startup(client); + if (FAIL == ret) + return FAIL; + return SUCCESS; +} + +void gtp_get_chip_type(struct goodix_ts_data *ts) +{ + u8 opr_buf[10] = {0x00}; + s32 ret = 0; + + msleep(10); + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CHIP_TYPE, opr_buf, 10); + + if (FAIL == ret) { + GTP_ERROR("Failed to get chip-type, set chip type default: GOODIX_GT9"); + ts->chip_type = CHIP_TYPE_GT9; + return; + } + + if (!memcmp(opr_buf, "GOODIX_GT9", 10)) { + ts->chip_type = CHIP_TYPE_GT9; + } else { + ts->chip_type = CHIP_TYPE_GT9F; + } + GTP_INFO("Chip Type: %s", (ts->chip_type == CHIP_TYPE_GT9) ? "GOODIX_GT9" : "GOODIX_GT9F"); +} +#endif + +/* + * Devices Tree support, +*/ +#ifdef GTP_CONFIG_OF +/** + * gtp_parse_dt - parse platform infomation form devices tree. + */ +static void gtp_parse_dt(struct device *dev) +{ + struct device_node *np = dev->of_node; + + gtp_int_gpio = of_get_named_gpio(np, "goodix,irq-gpio", 0); + gtp_rst_gpio = of_get_named_gpio(np, "goodix,rst-gpio", 0); + + /********************** add 2016.4.28 **************/ + + +} + +/** + * gtp_parse_dt_cfg - parse config data from devices tree. + * @dev: device that this driver attached. + * @cfg: pointer of the config array. + * @cfg_len: pointer of the config length. + * @sid: sensor id. + * Return: 0-succeed, -1-faileds + */ +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid) +{ + struct device_node *np = dev->of_node; + struct property *prop; + char cfg_name[18]; + + snprintf(cfg_name, sizeof(cfg_name), "goodix,cfg-group%d", sid); + prop = of_find_property(np, cfg_name, cfg_len); + if (!prop || !prop->value || *cfg_len == 0 || *cfg_len > GTP_CONFIG_MAX_LENGTH) { + return -EPERM;/* failed */ + } else { + memcpy(cfg, prop->value, *cfg_len); + return 0; + } +} + +/** + * gtp_power_switch - power switch . + * @on: 1-switch on, 0-switch off. + * return: 0-succeed, -1-faileds + */ +static int gtp_power_switch(struct i2c_client *client, int on) +{ + static struct regulator *vdd_ana; + static struct regulator *vcc_i2c; + int ret; + + if (!vdd_ana) { + vdd_ana = regulator_get(&client->dev, "vdd_ana"); + if (IS_ERR(vdd_ana)) { + GTP_ERROR("regulator get of vdd_ana failed"); + ret = PTR_ERR(vdd_ana); + vdd_ana = NULL; + return ret; + } + } + + if (!vcc_i2c) { + vcc_i2c = regulator_get(&client->dev, "vcc_i2c"); + if (IS_ERR(vcc_i2c)) { + GTP_ERROR("regulator get of vcc_i2c failed"); + ret = PTR_ERR(vcc_i2c); + vcc_i2c = NULL; + goto ERR_GET_VCC; + } + } + + if (on) { + GTP_DEBUG("GTP power on."); + ret = regulator_enable(vdd_ana); + udelay(2); + ret = regulator_enable(vcc_i2c); + } else { + GTP_DEBUG("GTP power off."); + ret = regulator_disable(vcc_i2c); + udelay(2); + ret = regulator_disable(vdd_ana); + } + return ret; + +ERR_GET_VCC: + regulator_put(vdd_ana); + return ret; +} +#endif + +#ifdef PMX_DRIVER_GT915L +static int goodix_ts_pinctrl_init(struct goodix_ts_data *goodix_data) +{ + int retval; + + goodix_data->ts_pinctrl = devm_pinctrl_get(&(goodix_data->client->dev)); + if (IS_ERR_OR_NULL(goodix_data->ts_pinctrl)) { + retval = PTR_ERR(goodix_data->ts_pinctrl); + dev_dbg(&goodix_data->client->dev, "Target does not use pinctrl %d\n", retval); + goto err_pinctrl_get; + } + goodix_data->pinctrl_state_active = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_ACTIVE); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_active)) { + retval = PTR_ERR(goodix_data->pinctrl_state_active); + dev_err(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_lookup; + } + + goodix_data->pinctrl_state_suspend = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_SUSPEND); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_suspend)) { + retval = PTR_ERR(goodix_data->pinctrl_state_suspend); + dev_err(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_SUSPEND, retval); + goto err_pinctrl_lookup; + } + + goodix_data->pinctrl_state_release = pinctrl_lookup_state(goodix_data->ts_pinctrl, PINCTRL_STATE_RELEASE); + + if (IS_ERR_OR_NULL(goodix_data->pinctrl_state_release)) { + retval = PTR_ERR(goodix_data->pinctrl_state_release); + dev_dbg(&goodix_data->client->dev, "Can not lookup %s pinstate %d\n", PINCTRL_STATE_RELEASE, retval); + } + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(goodix_data->ts_pinctrl); +err_pinctrl_get: + goodix_data->ts_pinctrl = NULL; + return retval; +} + + +static void goodix_ts_pinctrl_free(struct goodix_ts_data *goodix_data) +{ + /* Put pinctrl if target uses pinctrl */ + if (!IS_ERR_OR_NULL(goodix_data->ts_pinctrl)) { + devm_pinctrl_put(goodix_data->ts_pinctrl); + goodix_data->ts_pinctrl = NULL; + } +} + +static int goodix_ts_pinctrl_select(struct goodix_ts_data *goodix_data, bool on) +{ + struct pinctrl_state *pins_state; + int ret; + + pins_state = on ? goodix_data->pinctrl_state_active + : goodix_data->pinctrl_state_suspend; + if (!IS_ERR_OR_NULL(pins_state)) { + ret = pinctrl_select_state(goodix_data->ts_pinctrl, pins_state); + if (ret) { + dev_err(&goodix_data->client->dev, + "can not set %s pins\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + return ret; + } + } else { + dev_err(&goodix_data->client->dev, + "not a valid '%s' pinstate\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + } + + return 0; +} + +#endif + + +void parse_cmdline_for_gt915(void) +{ + int ret; + char *cmdline_tp; + char *temp; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + if (ret == 0) { + gtp_ics_slot_report = 1;/* factory mode*/ + return; + } + } + gtp_ics_slot_report = 0; + return; +} + + +static int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, 10); + dev_err(&client->dev, "cmd_line =%s \n", cmd_line); + if (ret == 0) { + dev_err(&client->dev, "mode: ffbm\n"); + return 1;/* factory mode*/ + } else { + dev_err(&client->dev, "mode: no ffbm\n"); + return 2;/* no factory mode*/ + } + } + dev_err(&client->dev, "has no androidboot.mode \n"); + return 0; +} + + +static int gtp_read_lockdown_info(void) +{ + int ret, k; + char buf[2+GTP_LOCKDOWN_SIZE] = {GTP_READ_LOCKDOWN_INFO_ADDR >> 8, GTP_READ_LOCKDOWN_INFO_ADDR & 0xFF}; + + ret = gtp_i2c_read(i2c_connect_client, buf, GTP_LOCKDOWN_SIZE+2); + if (ret < 0) { + printk("Read Lockdown info error!"); + return -EPERM; + } + + for (k = 0; k < GTP_LOCKDOWN_SIZE; k++) { + lockdown_info[k] = buf[2+k]; + } + + TP_Maker = lockdown_info[0]; + LCD_Maker = lockdown_info[1]; + Panel_Ink = lockdown_info[2]; + tp_color = lockdown_info[2]; + GTP_INFO("Lockdown info: %02X %02X %02X %02X %02X %02X %02X %02X", + lockdown_info[0], lockdown_info[1], + lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], + lockdown_info[6], lockdown_info[7]); + + GTP_INFO("WT: TP_Maker = 0x%x\n", TP_Maker); + GTP_INFO("WT: LCD_Maker = 0x%x\n", LCD_Maker); + GTP_INFO("WT: Panel_Ink = 0x%x\n", Panel_Ink); + + return 0; +} + +int gtp_hardwareinfo_set(void) +{ + char color[HARDWARE_MAX_ITEM_LONGTH]; + char vendor[HARDWARE_MAX_ITEM_LONGTH]; + int ret; + u16 ic_ver; + gtp_read_lockdown_info(); + switch (tp_color) { + case TP_White: + snprintf(color, HARDWARE_MAX_ITEM_LONGTH, "White"); + break; + case TP_Black: + snprintf(color, HARDWARE_MAX_ITEM_LONGTH, "Black"); + break; + case TP_Golden: + snprintf(color, HARDWARE_MAX_ITEM_LONGTH, "Golden"); + break; + default: + snprintf(color, HARDWARE_MAX_ITEM_LONGTH, "Other Color"); + } + + switch (TP_Maker) { + case TP_BIEL: + snprintf(vendor, HARDWARE_MAX_ITEM_LONGTH, "BIEL"); + break; + default: + snprintf(vendor, HARDWARE_MAX_ITEM_LONGTH, "Other Vendor"); + } + + ret = gtp_i2c_read_dbl_check(i2c_client_point, GTP_REG_CONFIG_DATA, &cfg_version, 1); + if (ret == FAIL) { + printk("Read IC Config Version Error\n"); + return -EPERM; + } + + ret = gtp_read_version(i2c_client_point, &ic_ver); + if (ret < 0) { + GTP_ERROR("Read version failed."); + return -EPERM; + } + IC_Version = ic_ver; + + printk("IC Config Version: %x, V%d\n", IC_Version, cfg_version); + + + sprintf(tp_string_version, "%s, GT917D_%x, V%d, %s", vendor, IC_Version, cfg_version, color); + hardwareinfo_set_prop(HARDWARE_TP, tp_string_version); + return 0; +} + +/******************************************************* +Function: + I2c probe. +Input: + client: i2c device struct. + id: device id. +Output: + Executive outcomes. + 0: succeed. +*******************************************************/ +static int goodix_ts_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + s32 ret = -1; + struct goodix_ts_data *ts; + u16 version_info; +#ifdef PMX_DRIVER_GT915L + int err; +#endif + + GTP_DEBUG_FUNC(); + + + parse_cmdline_for_gt915(); + + + GTP_INFO("GTP Driver Version: %s", GTP_DRIVER_VERSION); + + GTP_INFO("GTP I2C Address: 0x%02x", client->addr); + + i2c_connect_client = client; + i2c_client_point = client; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + GTP_ERROR("I2C check functionality failed."); + return -ENODEV; + } + ts = kzalloc(sizeof(*ts), GFP_KERNEL); + if (ts == NULL) { + GTP_ERROR("Alloc GFP_KERNEL memory failed."); + return -ENOMEM; + } + + ts->client = client; + +#ifdef GTP_CONFIG_OF /* device tree support */ + if (client->dev.of_node) { + gtp_parse_dt(&client->dev); + } + ret = gtp_power_switch(client, 1); + if (ret) { + GTP_ERROR("GTP power on failed."); + return -EINVAL; + } +#else /* use gpio defined in gt9xx.h */ + gtp_rst_gpio = GTP_RST_PORT; + gtp_int_gpio = GTP_INT_PORT; +#endif + +#ifdef PMX_DRIVER_GT915L + err = goodix_ts_pinctrl_init(ts); + if (!err && ts->ts_pinctrl) { + ret = goodix_ts_pinctrl_select(ts, 1); + if (ret < 0) { + dev_err(&client->dev, "can not get idle pin state\n"); + goto gtp_power_off; + } +} + #endif + + INIT_WORK(&ts->work, goodix_ts_work_func); + ts->client = client; + spin_lock_init(&ts->irq_lock); + +#if GTP_ESD_PROTECT + ts->clk_tick_cnt = 2 * HZ; + GTP_DEBUG("Clock ticks for an esd cycle: %d", ts->clk_tick_cnt); + spin_lock_init(&ts->esd_lock); + +#endif + i2c_set_clientdata(client, ts); + ts->gtp_rawdiff_mode = 0; + ret = gtp_request_io_port(ts); + if (ret < 0) { + GTP_ERROR("GTP request IO port failed."); + kfree(ts); + return ret; + } + +#if GTP_COMPATIBLE_MODE + gtp_get_chip_type(ts); + if (CHIP_TYPE_GT9F == ts->chip_type) { + ret = gtp_gt9xxf_init(ts->client); + if (FAIL == ret) { + GTP_INFO("Failed to init GT9XXF."); + } + } +#endif + +#ifdef WT_COMPILE_FACTORY_VERSION + ret = gtp_read_version(client, &version_info); + if (ret < 0) { + GTP_ERROR("Read version failed."); + goto free_reset_irq_gpio; + } + + IC_Version = version_info; + + ret = gtp_i2c_test(client); + if (ret < 0) { + GTP_ERROR("I2C communication ERROR!"); + goto free_reset_irq_gpio; + } +#else + ret = gtp_i2c_test(client); + if (ret < 0) { + GTP_ERROR("I2C communication ERROR!"); + goto free_reset_irq_gpio; + } + + ret = gtp_read_version(client, &version_info); + if (ret < 0) { + GTP_ERROR("Read version failed."); + goto free_reset_irq_gpio; + } + + IC_Version = version_info; +#endif + + ret = gtp_init_panel(ts); + if (ret < 0) { + GTP_ERROR("GTP init panel failed."); + ts->abs_x_max = GTP_MAX_WIDTH; + ts->abs_y_max = GTP_MAX_HEIGHT; + ts->int_trigger_type = GTP_INT_TRIGGER; + } + + + gt91xx_config_proc = proc_create(GT91XX_CONFIG_PROC_FILE, 0666, NULL, &config_proc_ops); + if (gt91xx_config_proc == NULL) { + GTP_ERROR("create_proc_entry %s failed\n", GT91XX_CONFIG_PROC_FILE); + } else { + GTP_INFO("create proc entry %s success", GT91XX_CONFIG_PROC_FILE); + } + +#if GTP_ESD_PROTECT + gtp_esd_switch(client, SWITCH_ON); +#endif + +#if GTP_AUTO_UPDATE + +err = get_boot_mode(client); +if (err == 0) { + ret = gup_init_update_proc(ts); + if (ret < 0) { + GTP_ERROR("Create update thread error."); + } +} else { + GTP_INFO("not nomal_boot\n"); +} +#endif + + ret = gtp_request_input_dev(ts); + if (ret < 0) { + GTP_ERROR("GTP request input dev failed"); + } + + ret = gtp_request_irq(ts); + if (ret < 0) { + GTP_INFO("GTP works in polling mode."); + } else { + GTP_INFO("GTP works in interrupt mode."); + } + + if (ts->use_irq) { + gtp_irq_enable(ts); +#if GTP_GESTURE_WAKEUP + enable_irq_wake(client->irq); +#endif + } + +#if WT_ADD_CTP_INFO + gtp_hardwareinfo_set(); +#endif + + +#ifdef CONFIG_TOUCHSCREEN_LOCKDOWN_INFO + ctp_lockdown_fucntion_proc_file(); +#endif + + + /* register suspend and resume fucntion*/ + gtp_register_powermanger(ts); + +#if GTP_CREATE_WR_NODE + init_wr_node(client); +#endif + return 0; + + +free_reset_irq_gpio: + if (gpio_is_valid(gtp_rst_gpio)) + GTP_GPIO_FREE(gtp_rst_gpio); + if (ts->ts_pinctrl) { + err = goodix_ts_pinctrl_select(ts, false); + if (err < 0) + GTP_ERROR("Cannot get idle pinctrl state\n"); + } + + if (gpio_is_valid(gtp_int_gpio)) + GTP_GPIO_FREE(gtp_int_gpio); + if (ts->ts_pinctrl) { + err = goodix_ts_pinctrl_select(ts, false); + if (err < 0) + GTP_ERROR("Cannot get idle pinctrl state\n"); + } + + goodix_ts_pinctrl_free(ts); + +gtp_power_off: + gtp_power_switch(client, 0); + + return err; +} + + +/******************************************************* +Function: + Goodix touchscreen driver release function. +Input: + client: i2c device struct. +Output: + Executive outcomes. 0---succeed. +*******************************************************/ +static int goodix_ts_remove(struct i2c_client *client) +{ + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + GTP_DEBUG_FUNC(); + + gtp_unregister_powermanger(ts); + +#if GTP_CREATE_WR_NODE + uninit_wr_node(); +#endif + +#if GTP_ESD_PROTECT + destroy_workqueue(gtp_esd_check_workqueue); +#endif + + if (ts) { + if (ts->use_irq) { + GTP_GPIO_AS_INPUT(gtp_int_gpio); + GTP_GPIO_FREE(gtp_int_gpio); + free_irq(client->irq, ts); + } else { + hrtimer_cancel(&ts->timer); + } + } + + GTP_INFO("GTP driver removing..."); + i2c_set_clientdata(client, NULL); + input_unregister_device(ts->input_dev); + kfree(ts); + + return 0; +} + + +/******************************************************* +Function: + Early suspend function. +Input: + h: early_suspend struct. +Output: + None. +*******************************************************/ +static void goodix_ts_suspend(struct goodix_ts_data *ts) +{ + s8 ret = -1; + + GTP_DEBUG_FUNC(); + if (ts->enter_update) { + return; + } + GTP_INFO("System suspend."); + + ts->gtp_is_suspend = 1; +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + + +#if GTP_GESTURE_WAKEUP +GTP_INFO("Gesture gtp_gesture_onoff :%c\n", gtp_gesture_onoff); +if ('1' == gtp_gesture_onoff) + ret = gtp_enter_doze(ts); +else +#endif +{ + if (ts->use_irq) { + gtp_irq_disable(ts); + } else { + hrtimer_cancel(&ts->timer); + } + ret = gtp_enter_sleep(ts); +} + + if (ret < 0) { + GTP_ERROR("GTP early suspend failed."); + } + + + msleep(58); +} + +/******************************************************* +Function: + Late resume function. +Input: + h: early_suspend struct. +Output: + None. +*******************************************************/ +static void goodix_ts_resume(struct goodix_ts_data *ts) +{ + s8 ret = -1; + + GTP_DEBUG_FUNC(); + if (ts->enter_update) { + return; + } + GTP_INFO("System resume."); + + ret = gtp_wakeup_sleep(ts); + +#if GTP_GESTURE_WAKEUP + doze_status = DOZE_DISABLED; +#endif + + if (ret < 0) { + GTP_ERROR("GTP later resume failed."); + } +#if (GTP_COMPATIBLE_MODE) + if (CHIP_TYPE_GT9F == ts->chip_type) { + + } else +#endif + { + gtp_send_cfg(ts->client); + } + + if (ts->use_irq) { + GTP_DEBUG("GTP use_irq."); + gtp_irq_enable(ts); + } else { + hrtimer_start(&ts->timer, ktime_set(1, 0), HRTIMER_MODE_REL); + } + + ts->gtp_is_suspend = 0; +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif +} + + +#if defined(CONFIG_FB) +/* frame buffer notifier block control the suspend/resume procedure */ +static int gtp_fb_notifier_callback(struct notifier_block *noti, unsigned long event, void *data) +{ + struct fb_event *ev_data = data; + struct goodix_ts_data *ts = container_of(noti, struct goodix_ts_data, notifier); + int *blank; + + if (ev_data && ev_data->data && event == FB_EVENT_BLANK && ts) { + blank = ev_data->data; + if (*blank == FB_BLANK_UNBLANK) { + GTP_DEBUG("Resume by fb notifier."); + goodix_ts_resume(ts); + + } else if (*blank == FB_BLANK_POWERDOWN) { + GTP_DEBUG("Suspend by fb notifier."); + goodix_ts_suspend(ts); + } + } + + return 0; +} +#elif defined(CONFIG_PM) +/* bus control the suspend/resume procedure */ +static int gtp_pm_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts) { + GTP_DEBUG("Suspend by i2c pm."); + goodix_ts_suspend(ts); + } + + return 0; +} +static int gtp_pm_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (ts) { + GTP_DEBUG("Resume by i2c pm."); + goodix_ts_resume(ts); + } + + return 0; +} + +static struct dev_pm_ops gtp_pm_ops = { + .suspend = gtp_pm_suspend, + .resume = gtp_pm_resume, +}; + +#elif defined(CONFIG_HAS_EARLYSUSPEND) +/* earlysuspend module the suspend/resume procedure */ +static void gtp_early_suspend(struct early_suspend *h) +{ + struct goodix_ts_data *ts = container_of(h, struct goodix_ts_data, early_suspend); + + if (ts) { + GTP_DEBUG("Suspend by earlysuspend module."); + goodix_ts_suspend(ts); + } +} +static void gtp_early_resume(struct early_suspend *h) +{ + struct goodix_ts_data *ts = container_of(h, struct goodix_ts_data, early_suspend); + + if (ts) { + GTP_DEBUG("Resume by earlysuspend module."); + goodix_ts_resume(ts); + } +} +#endif + +static int gtp_register_powermanger(struct goodix_ts_data *ts) +{ +#if defined(CONFIG_FB) + ts->notifier.notifier_call = gtp_fb_notifier_callback; + fb_register_client(&ts->notifier); + +#elif defined(CONFIG_HAS_EARLYSUSPEND) + ts->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + 1; + ts->early_suspend.suspend = goodix_ts_early_suspend; + ts->early_suspend.resume = goodix_ts_late_resume; + register_early_suspend(&ts->early_suspend); +#endif + + return 0; +} + +static int gtp_unregister_powermanger(struct goodix_ts_data *ts) +{ +#if defined(CONFIG_FB) + fb_unregister_client(&ts->notifier); + +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&ts->early_suspend); +#endif + return 0; +} + +/* end */ + +#if GTP_ESD_PROTECT +s32 gtp_i2c_read_no_rst(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + if ((retries >= 5)) { + GTP_ERROR("I2C Read: 0x%04X, %d bytes failed, errcode: %d!", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + } + return ret; +} + +s32 gtp_i2c_write_no_rst(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1) + break; + retries++; + } + if ((retries >= 5)) { + GTP_ERROR("I2C Write: 0x%04X, %d bytes failed, errcode: %d!", (((u16)(buf[0] << 8)) | buf[1]), len-2, ret); + } + return ret; +} +/******************************************************* +Function: + switch on & off esd delayed work +Input: + client: i2c device + on: SWITCH_ON / SWITCH_OFF +Output: + void +*********************************************************/ +void gtp_esd_switch(struct i2c_client *client, s32 on) +{ + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(client); + spin_lock(&ts->esd_lock); + + if (SWITCH_ON == on) { + if (!ts->esd_running) { + ts->esd_running = 1; + spin_unlock(&ts->esd_lock); + GTP_INFO("Esd started"); + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); + } else { + spin_unlock(&ts->esd_lock); + } + } else { + if (ts->esd_running) { + ts->esd_running = 0; + spin_unlock(&ts->esd_lock); + GTP_INFO("Esd cancelled"); + cancel_delayed_work_sync(>p_esd_check_work); + } else { + spin_unlock(&ts->esd_lock); + } + } +} + +/******************************************************* +Function: + Initialize external watchdog for esd protect +Input: + client: i2c device. +Output: + result of i2c write operation. + 1: succeed, otherwise: failed +*********************************************************/ +static s32 gtp_init_ext_watchdog(struct i2c_client *client) +{ + u8 opr_buffer[3] = {0x80, 0x41, 0xAA}; + GTP_DEBUG("[Esd]Init external watchdog"); + return gtp_i2c_write_no_rst(client, opr_buffer, 3); +} + +/******************************************************* +Function: + Esd protect function. + External watchdog added by meta, 2013/03/07 +Input: + work: delayed work +Output: + None. +*******************************************************/ +static void gtp_esd_check_func(struct work_struct *work) +{ + s32 i; + s32 ret = -1; + struct goodix_ts_data *ts = NULL; + u8 esd_buf[5] = {0x80, 0x40}; + + GTP_DEBUG_FUNC(); + + ts = i2c_get_clientdata(i2c_connect_client); + + if (ts->gtp_is_suspend || ts->enter_update) { + GTP_INFO("Esd suspended!"); + return; + } + + for (i = 0; i < 3; i++) { + ret = gtp_i2c_read_no_rst(ts->client, esd_buf, 4); + + GTP_DEBUG("[Esd]0x8040 = 0x%02X, 0x8041 = 0x%02X", esd_buf[2], esd_buf[3]); + if ((ret < 0)) { + continue; + } else { + if ((esd_buf[2] == 0xAA) || (esd_buf[3] != 0xAA)) { + u8 chk_buf[4] = {0x80, 0x40}; + gtp_i2c_read_no_rst(ts->client, chk_buf, 4); + GTP_DEBUG("[Check]0x8040 = 0x%02X, 0x8041 = 0x%02X", chk_buf[2], chk_buf[3]); + if ((chk_buf[2] == 0xAA) || (chk_buf[3] != 0xAA)) { + i = 3; + break; + } else { + continue; + } + } else { + + esd_buf[2] = 0xAA; + gtp_i2c_write_no_rst(ts->client, esd_buf, 3); + break; + } + } + } + if (i >= 3) { + #if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + if (ts->rqst_processing) { + GTP_INFO("Request processing, no esd recovery"); + } else { + GTP_ERROR("IC working abnormally! Process esd recovery."); + esd_buf[0] = 0x42; + esd_buf[1] = 0x26; + esd_buf[2] = 0x01; + esd_buf[3] = 0x01; + esd_buf[4] = 0x01; + gtp_i2c_write_no_rst(ts->client, esd_buf, 5); + msleep(50); + #ifdef GTP_CONFIG_OF + gtp_power_switch(ts->client, 0); + msleep(20); + gtp_power_switch(ts->client, 1); + msleep(20); + #endif + gtp_esd_recovery(ts->client); + } + } else + #endif + { + GTP_ERROR("IC working abnormally! Process reset guitar."); + esd_buf[0] = 0x42; + esd_buf[1] = 0x26; + esd_buf[2] = 0x01; + esd_buf[3] = 0x01; + esd_buf[4] = 0x01; + gtp_i2c_write_no_rst(ts->client, esd_buf, 5); + msleep(50); + #ifdef GTP_CONFIG_OF + gtp_power_switch(ts->client, 0); + msleep(20); + gtp_power_switch(ts->client, 1); + msleep(20); + #endif + gtp_reset_guitar(ts->client, 50); + msleep(50); + gtp_send_cfg(ts->client); + } + } + + if (!ts->gtp_is_suspend) { + queue_delayed_work(gtp_esd_check_workqueue, >p_esd_check_work, ts->clk_tick_cnt); + } else { + GTP_INFO("Esd suspended!"); + } + return; +} +#endif + +#ifdef GTP_CONFIG_OF +static const struct of_device_id goodix_match_table[] = { + {.compatible = "goodix,gt9xx",}, + { }, +}; +#endif + +static const struct i2c_device_id goodix_ts_id[] = { + { GTP_I2C_NAME, 0 }, + { } +}; + +static struct i2c_driver goodix_ts_driver = { + .probe = goodix_ts_probe, + .remove = goodix_ts_remove, + .id_table = goodix_ts_id, + .driver = { + .name = GTP_I2C_NAME, + .owner = THIS_MODULE, +#ifdef GTP_CONFIG_OF + .of_match_table = goodix_match_table, +#endif +#if !defined(CONFIG_FB) && defined(CONFIG_PM) + .pm = >p_pm_ops, +#endif + }, +}; + +/******************************************************* +Function: + Driver Install function. +Input: + None. +Output: + Executive Outcomes. 0---succeed. +********************************************************/ + +static int __init goodix_ts_init(void) +{ + s32 ret; + + GTP_DEBUG_FUNC(); + GTP_INFO("GTP driver installing..."); + goodix_wq = create_singlethread_workqueue("goodix_wq"); + if (!goodix_wq) { + GTP_ERROR("Creat workqueue failed."); + return -ENOMEM; + } +#if GTP_ESD_PROTECT + INIT_DELAYED_WORK(>p_esd_check_work, gtp_esd_check_func); + gtp_esd_check_workqueue = create_workqueue("gtp_esd_check"); +#endif + ret = i2c_add_driver(&goodix_ts_driver); + return ret; +} + +/******************************************************* +Function: + Driver uninstall function. +Input: + None. +Output: + Executive Outcomes. 0---succeed. +********************************************************/ +static void __exit goodix_ts_exit(void) +{ + GTP_DEBUG_FUNC(); + GTP_INFO("GTP driver exited."); + i2c_del_driver(&goodix_ts_driver); + if (goodix_wq) { + destroy_workqueue(goodix_wq); + } +} + +device_initcall_sync(goodix_ts_init); +module_exit(goodix_ts_exit); + +MODULE_DESCRIPTION("GTP Series Driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/input/touchscreen/GT917D/gt9xx.h b/drivers/input/touchscreen/GT917D/gt9xx.h new file mode 100644 index 0000000000000..c98ca79877bd7 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/gt9xx.h @@ -0,0 +1,349 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. 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; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * 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. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#ifndef _GOODIX_GT9XX_H_ +#define _GOODIX_GT9XX_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_OF +#include +#include +#endif +#ifdef CONFIG_FB +#include +#include +#endif +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#ifndef GTP_CONFIG_OF +#define GTP_CONFIG_OF +#endif + +#ifndef CONFIG_PM +#define CONFIG_PM +#endif + +#define PMX_DRIVER_GT915L + +/***************************PART1:ON/OFF define*******************************/ +#define GTP_CUSTOM_CFG 1 +#define GTP_CHANGE_X2Y 0 +#define GTP_DRIVER_SEND_CFG 1 +#define GTP_HAVE_TOUCH_KEY 1 +#define GTP_POWER_CTRL_SLEEP 0 +#define GTP_ICS_SLOT_REPORT 1 + +#define GTP_AUTO_UPDATE 1 +#define GTP_HEADER_FW_UPDATE 1 +#define GTP_AUTO_UPDATE_CFG 0 + +#define GTP_COMPATIBLE_MODE 0 + +#define GTP_CREATE_WR_NODE 1 +#define GTP_ESD_PROTECT 1 + +#define GTP_WITH_PEN 0 +#define GTP_PEN_HAVE_BUTTON 0 + +#define GTP_GESTURE_WAKEUP 1 +#if GTP_GESTURE_WAKEUP +#define GTP_GESTURE_TPYE_STR "RLUDKcemosvwz" +#define GTP_GESTURE_SUPPORT_ONOFF 'Y' +#define GTP_PROC_DRIVER_VERSION "GTP_V1.0_20160606" +#define GTP_GESTURE_MAX_POINT_COUNT 64 + +#define MXT_INPUT_EVENT_START 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define MXT_INPUT_EVENT_STYLUS_MODE_OFF 2 +#define MXT_INPUT_EVENT_STYLUS_MODE_ON 3 +#define MXT_INPUT_EVENT_WAKUP_MODE_OFF 4 +#define MXT_INPUT_EVENT_WAKUP_MODE_ON 5 +#define MXT_INPUT_EVENT_EDGE_DISABLE 6 +#define MXT_INPUT_EVENT_EDGE_FINGER 7 +#define MXT_INPUT_EVENT_EDGE_HANDGRIP 8 +#define MXT_INPUT_EVENT_EDGE_FINGER_HANDGRIP 9 +#define MXT_INPUT_EVENT_END 9 +#endif + +#define GTP_GLOVE_MODE 1 +#if GTP_GLOVE_MODE +#define GTP_GLOVE_SUPPORT_ONOFF 'Y' +#endif + +#define WT_ADD_CTP_INFO 1 + +#define GTP_DEBUG_ON 0 +#define GTP_DEBUG_ARRAY_ON 0 +#define GTP_DEBUG_FUNC_ON 0 + +#if GTP_COMPATIBLE_MODE +typedef enum +{ + CHIP_TYPE_GT9 = 0, + CHIP_TYPE_GT9F = 1, +} CHIP_TYPE_T; +#endif + +struct goodix_ts_data { + spinlock_t irq_lock; + struct i2c_client *client; + struct input_dev *input_dev; + struct hrtimer timer; + struct work_struct work; + s32 irq_is_disable; + s32 use_irq; + u16 abs_x_max; + u16 abs_y_max; + u8 max_touch_num; + u8 int_trigger_type; + u8 green_wake_mode; + u8 enter_update; + u8 gtp_is_suspend; + u8 gtp_rawdiff_mode; + int gtp_cfg_len; + u8 fw_error; + u8 pnl_init_error; + +#if defined(CONFIG_FB) + struct notifier_block notifier; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + +#if GTP_WITH_PEN + struct input_dev *pen_dev; +#endif + +#if GTP_ESD_PROTECT + spinlock_t esd_lock; + u8 esd_running; + s32 clk_tick_cnt; +#endif +#if GTP_COMPATIBLE_MODE + u16 bak_ref_len; + s32 ref_chk_fs_times; + s32 clk_chk_fs_times; + CHIP_TYPE_T chip_type; + u8 rqst_processing; + u8 is_950; +#endif + +#ifdef PMX_DRIVER_GT915L + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + struct pinctrl_state *pinctrl_state_release; + + struct pinctrl_state *pinctrl_state_int_active; + struct pinctrl_state *pinctrl_state_reset_active; +#endif +}; + +extern u16 show_len; +extern u16 total_len; + +extern unsigned int gtp_rst_gpio; +extern unsigned int gtp_int_gpio; + + +/*************************** PART2:TODO define **********************************/ +/* STEP_1(REQUIRED): Define Configuration Information Group(s) + sensor_opt1 sensor_opt2 Sensor_ID + GND GND 0 + VDDIO GND 1 + NC GND 2 + GND NC/300K 3 + VDDIO NC/300K 4 + NC NC/300K 5 +*/ + + +#define CTP_CFG_GROUP0 {\ +0x45,0xD0,0x02,0x00,0x05,0x0A,0x3C,0x4D,0x01,0xC8,0x28,0x0F,0x5A,0x3C,0x03,0x65,0x00,0x00,0x60,0x62,0x22,0x23,0x0A,0x15,0x16,0x28,0x14,0x87,0x26,0xCC,0x40,0x42,0xD3,0x07,0xD3,0x07,0x00,0x22,0x33,0x91,0x00,0x00,0x00,0x00,0x00,0x84,0xC4,0x0A,0x14,0x00,0x32,0x32,0x5A,0x94,0xD0,0x83,0x07,0x1E,0x00,0x04,0x94,0x35,0x00,0x88,0x3B,0x00,0x7B,0x43,0x00,0x72,0x4B,0x00,0x68,0x55,0x00,0x68,0x18,0x38,0x58,0x00,0x57,0x60,0x48,0xBB,0xBB,0x17,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x0F,0x28,0x00,0x00,0x00,0x00,0x00,0x0A,0x50,0x00,0x00,0x00,0x00,0x32,0x00,0x01,0x02,0x03,0x04,0x0B,0x0A,0x09,0x08,0x07,0x06,0x05,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x02,0x04,0x05,0x06,0x08,0x0A,0x1E,0x1F,0x20,0x22,0x24,0x28,0xFF,0xFF,0xFF,0xFF,0x78,0x31,0x00,0x00,0x00,0x87,0x70,0x12,0x00,0x28,0x32,0x3C,0x10,0x23,0x28,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x4B,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x4B,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x01,0x01,0x14,0x78,0x1C,0x1E,0x55,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x01} + + +#define CTP_CFG_GROUP1 {\ +0x41,0xD0,0x02,0x00,0x05,0x05,0x04,0xC1,0x12,0x0F,0x28,0x0A,0x50,0x32,0x03,0x05,0x00,0x00,0xFF,0x67,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x2C,0x0D,0x3C,0x3E,0xD3,0x07,0x0F,0x0F,0x00,0x99,0x33,0x10,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x29,0x28,0x5A,0x94,0x85,0x02,0x07,0x00,0x00,0x04,0xA9,0x2B,0x00,0x92,0x33,0x00,0x80,0x3C,0x00,0x71,0x46,0x00,0x63,0x53,0x00,0x63,0x18,0x38,0x58,0x00,0xF0,0x4A,0x3A,0x77,0x77,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x42,0xF8,0x0F,0x00,0x00,0x00,0x0F,0x00,0x00,0x50,0x3C,0x02,0x04,0x0A,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x08,0x06,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x5A,0x00,0x00,0x00,0x0F,0x10,0x12,0x13,0x14,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0x16,0x18,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x24,0x28,0x26,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x56,0x01\ + } + + +#define CTP_CFG_GROUP2 {\ +0x49,0xD0,0x02,0x00,0x05,0x0A,0x04,0xC1,0x12,0x3F,0x25,0x0A,0x5A,0x3C,0x03,0x05,0x00,0x00,0x00,0x67,0x11,0x11,0x30,0x00,0x00,0x00,0x00,0x8C,0x2C,0x0D,0x3C,0x3E,0xD3,0x07,0xD3,0x07,0x00,0x9A,0x33,0x10,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2A,0x28,0x5A,0x94,0x80,0x02,0x0B,0x00,0x00,0x04,0xA9,0x2B,0x00,0x92,0x33,0x1E,0x80,0x3C,0x00,0x71,0x46,0x00,0x63,0x53,0x00,0x63,0x18,0x38,0x58,0x00,0xF0,0x4A,0x3A,0x77,0x77,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x50,0x0F,0x00,0x00,0x50,0x3C,0x02,0x04,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x0A,0x08,0x06,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x18,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x28,0x26,0x24,0x0C,0x0A,0x0F,0x08,0x10,0x06,0x12,0x04,0x13,0x02,0x14,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x01\ +} + + +#define CTP_CFG_GROUP3 {\ +} + +#define CTP_CFG_GROUP4 {\ + } + + +#define CTP_CFG_GROUP5 {\ + } + + +#define CTP_CFG_GROUP1_GLOVE {\ +0x44,0x38,0x04,0x80,0x07,0x0A,0x04,0xC1,0x12,0x3F,0x28,0x0A,0x50,0x32,0x03,0x05,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8C,0x2C,0x0E,0x3C,0x3E,0xD3,0x07,0xD3,0x07,0x00,0xF8,0x33,0x90,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x29,0x32,0x5A,0x94,0x85,0x02,0x80,0x00,0x00,0x04,0x8C,0x35,0x00,0x81,0x3B,0x1E,0x76,0x43,0x00,0x6D,0x4B,0x00,0x65,0x55,0x00,0x65,0x18,0x40,0x60,0x00,0xF0,0x50,0x3A,0x77,0x77,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x67,0x00,0x00,0x00,0x06,0x00,0x42,0xF8,0x0F,0x00,0x0F,0x50,0x0F,0x00,0x00,0x50,0x3C,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x1C,0x0A,0x08,0x06,0x04,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x41,0x00,0x00,0x00,0x00,0x04,0x02,0x06,0x08,0x0A,0x0C,0x0F,0x10,0x12,0x13,0x14,0x28,0x26,0x24,0x22,0x21,0x20,0x1F,0x1E,0x1D,0x1C,0x18,0x16,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9A,0x01\ + } + +#define GTP_RST_PORT 16 +#define GTP_INT_PORT 17 + +#define GTP_GPIO_AS_INPUT(pin) do{\ + gpio_direction_input(pin);\ + }while(0) +#define GTP_GPIO_AS_INT(pin) do{\ + GTP_GPIO_AS_INPUT(pin);\ + }while(0) +#define GTP_GPIO_GET_VALUE(pin) gpio_get_value(pin) +#define GTP_GPIO_OUTPUT(pin,level) gpio_direction_output(pin,level) +#define GTP_GPIO_REQUEST(pin, label) gpio_request(pin, label) +#define GTP_GPIO_FREE(pin) gpio_free(pin) +#define GTP_IRQ_TAB {IRQ_TYPE_EDGE_RISING, IRQ_TYPE_EDGE_FALLING, IRQ_TYPE_LEVEL_LOW, IRQ_TYPE_LEVEL_HIGH} + + +#if GTP_CUSTOM_CFG + #define GTP_MAX_HEIGHT 1280 + #define GTP_MAX_WIDTH 720 + #define GTP_INT_TRIGGER 0 +#else + #define GTP_MAX_HEIGHT 1280 + #define GTP_MAX_WIDTH 720 + #define GTP_INT_TRIGGER 1 +#endif +#define GTP_MAX_TOUCH 10 + + +#if GTP_HAVE_TOUCH_KEY + + #define GTP_KEY_TAB {KEY_MENU, KEY_HOMEPAGE, KEY_BACK} +#endif + +/***************************PART3:OTHER define*********************************/ +#define GTP_DRIVER_VERSION "V2.4<2014/11/28>" +#define GTP_I2C_NAME "Goodix-TS" +#define GT91XX_CONFIG_PROC_FILE "gt9xx_config" +#define GTP_POLL_TIME 10 +#define GTP_ADDR_LENGTH 2 +#define GTP_CONFIG_MIN_LENGTH 186 +#define GTP_CONFIG_MAX_LENGTH 240 +#define FAIL 0 +#define SUCCESS 1 +#define SWITCH_OFF 0 +#define SWITCH_ON 1 + +/******************** For GT9XXF Start **********************/ +#define GTP_REG_BAK_REF 0x99D0 +#define GTP_REG_MAIN_CLK 0x8020 +#define GTP_REG_CHIP_TYPE 0x8000 +#define GTP_REG_HAVE_KEY 0x804E +#define GTP_REG_MATRIX_DRVNUM 0x8069 +#define GTP_REG_MATRIX_SENNUM 0x806A + +#define GTP_FL_FW_BURN 0x00 +#define GTP_FL_ESD_RECOVERY 0x01 +#define GTP_FL_READ_REPAIR 0x02 + +#define GTP_BAK_REF_SEND 0 +#define GTP_BAK_REF_STORE 1 +#define CFG_LOC_DRVA_NUM 29 +#define CFG_LOC_DRVB_NUM 30 +#define CFG_LOC_SENS_NUM 31 + +#define GTP_CHK_FW_MAX 40 +#define GTP_CHK_FS_MNT_MAX 300 +#define GTP_BAK_REF_PATH "/data/gtp_ref.bin" +#define GTP_MAIN_CLK_PATH "/data/gtp_clk.bin" +#define GTP_RQST_CONFIG 0x01 +#define GTP_RQST_BAK_REF 0x02 +#define GTP_RQST_RESET 0x03 +#define GTP_RQST_MAIN_CLOCK 0x04 +#define GTP_RQST_RESPONDED 0x00 +#define GTP_RQST_IDLE 0xFF + +/******************** For GT9XXF End **********************/ + +#define GTP_READ_COOR_ADDR 0x814E +#define GTP_REG_SLEEP 0x8040 +#define GTP_REG_SENSOR_ID 0x814A +#define GTP_REG_CONFIG_DATA 0x8047 +#define GTP_REG_VERSION 0x8140 + +#define RESOLUTION_LOC 3 +#define TRIGGER_LOC 8 + +#define CFG_GROUP_LEN(p_cfg_grp) (sizeof(p_cfg_grp) / sizeof(p_cfg_grp[0])) + +#define GTP_INFO(fmt,arg...) printk("<<-GTP-INFO->> "fmt"\n",##arg) +#define GTP_ERROR(fmt,arg...) printk("<<-GTP-ERROR->> "fmt"\n",##arg) +#define GTP_DEBUG(fmt,arg...) do{\ + if(GTP_DEBUG_ON)\ + printk("<<-GTP-DEBUG->> [%d]"fmt"\n",__LINE__, ##arg);\ + }while(0) +#define GTP_DEBUG_ARRAY(array, num) do{\ + s32 i;\ + u8* a = array;\ + if(GTP_DEBUG_ARRAY_ON)\ + {\ + printk("<<-GTP-DEBUG-ARRAY->>\n");\ + for (i = 0; i < (num); i++)\ + {\ + printk("%02x ", (a)[i]);\ + if ((i + 1 ) %10 == 0)\ + {\ + printk("\n");\ + }\ + }\ + printk("\n");\ + }\ + }while(0) +#define GTP_DEBUG_FUNC() do{\ + if(GTP_DEBUG_FUNC_ON)\ + printk("<<-GTP-FUNC->> Func:%s@Line:%d\n",__func__,__LINE__);\ + }while(0) +#define GTP_SWAP(x, y) do{\ + typeof(x) z = x;\ + x = y;\ + y = z;\ + }while (0) + +/*****************************End of Part III********************************/ +#ifdef CONFIG_OF +int gtp_parse_dt_cfg(struct device *dev, u8 *cfg, int *cfg_len, u8 sid); +#endif +#endif /* _GOODIX_GT9XX_H_ */ diff --git a/drivers/input/touchscreen/GT917D/gt9xx_firmware.h b/drivers/input/touchscreen/GT917D/gt9xx_firmware.h new file mode 100644 index 0000000000000..53c2517e9dc88 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/gt9xx_firmware.h @@ -0,0 +1,42 @@ +/* Copyright Statement: + * This firmware are protected under relevant copyright laws,this information contained + * herein is confidential and proprietary to Goodix. + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * + * WARNING:The GTP_COMPATIBLE_MODE part of this file was generated by the specialized tools, + * please do not modify it manually! + * +*/ + +#ifndef _GT9XX_FIRMWARE_H_ +#define _GT9XX_FIRMWARE_H_ + + +#if GTP_HEADER_FW_UPDATE + + +#define WT_ADD_FW_BIEL + +unsigned char gtp_default_FW[] = { + +#ifdef WT_ADD_FW_EACH + #include "FW_EACH.txt" +#elif defined WT_ADD_FW_BIEL + #include "FW_BIEL.txt" +#endif +}; +#endif + +/* +*[HW INFO]00900600 +*[PID]910 +*[VID]1010 +*[GENERATED]2013/08/27 20:59:13 +*/ +#if GTP_COMPATIBLE_MODE +unsigned char gtp_default_FW_fl[] = { +}; +#endif + +#endif diff --git a/drivers/input/touchscreen/GT917D/gt9xx_update.c b/drivers/input/touchscreen/GT917D/gt9xx_update.c new file mode 100644 index 0000000000000..21ac5a609ee20 --- /dev/null +++ b/drivers/input/touchscreen/GT917D/gt9xx_update.c @@ -0,0 +1,3251 @@ +/* + * Goodix GT9xx touchscreen driver + * + * Copyright (C) 2010 - 2014 Goodix. Ltd. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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 a reference + * to you, when you are integrating the GOODiX's CTP IC into your system, + * 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. + * + * Version: 2.4 + * Release Date: 2014/11/28 + */ + +#include +#include "gt9xx.h" + +#include +#include +#if ((GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) || GTP_COMPATIBLE_MODE) + #include "gt9xx_firmware.h" +#endif + +#define GUP_REG_HW_INFO 0x4220 +#define GUP_REG_FW_MSG 0x41E4 +#define GUP_REG_PID_VID 0x8140 + +#define GUP_SEARCH_FILE_TIMES 50 + +#define UPDATE_FILE_PATH_1 "/data/_goodix_update_.bin" +#define UPDATE_FILE_PATH_2 "/sdcard/_goodix_update_.bin" + +#define CONFIG_FILE_PATH_1 "/data/_goodix_config_.cfg" +#define CONFIG_FILE_PATH_2 "/sdcard/_goodix_config_.cfg" + +#define FW_HEAD_LENGTH 14 +#define FW_SECTION_LENGTH 0x2000 +#define FW_DSP_ISP_LENGTH 0x1000 +#define FW_DSP_LENGTH 0x1000 +#define FW_BOOT_LENGTH 0x800 +#define FW_SS51_LENGTH (4 * FW_SECTION_LENGTH) +#define FW_BOOT_ISP_LENGTH 0x800 +#define FW_GLINK_LENGTH 0x3000 +#define FW_GWAKE_LENGTH (4 * FW_SECTION_LENGTH) + +#define PACK_SIZE 256 +#define MAX_FRAME_CHECK_TIME 5 + + +#define _bRW_MISCTL__SRAM_BANK 0x4048 +#define _bRW_MISCTL__MEM_CD_EN 0x4049 +#define _bRW_MISCTL__CACHE_EN 0x404B +#define _bRW_MISCTL__TMR0_EN 0x40B0 +#define _rRW_MISCTL__SWRST_B0_ 0x4180 +#define _bWO_MISCTL__CPU_SWRST_PULSE 0x4184 +#define _rRW_MISCTL__BOOTCTL_B0_ 0x4190 +#define _rRW_MISCTL__BOOT_OPT_B0_ 0x4218 +#define _rRW_MISCTL__BOOT_CTL_ 0x5094 + +#define AUTO_SEARCH_BIN 0x01 +#define AUTO_SEARCH_CFG 0x02 +#define BIN_FILE_READY 0x80 +#define CFG_FILE_READY 0x08 +#define HEADER_FW_READY 0x00 + +#pragma pack(1) +typedef struct { + u8 hw_info[4]; + u8 pid[8]; + u16 vid; +} st_fw_head; +#pragma pack() + +typedef struct { + u8 force_update; + u8 fw_flag; + struct file *file; + struct file *cfg_file; + st_fw_head ic_fw_msg; + mm_segment_t old_fs; + u32 fw_total_len; + u32 fw_burned_len; +} st_update_msg; + +st_update_msg update_msg; +u16 show_len; +u16 total_len; +u8 got_file_flag = 0; +u8 searching_file = 0; + + +int FW_VERSION_ID; +static u8 GTP_FW_SENSOR_ID; + +#if WT_ADD_CTP_INFO +extern int gtp_hardwareinfo_set(void); +#endif + +extern u8 config[GTP_CONFIG_MAX_LENGTH + GTP_ADDR_LENGTH]; +extern void gtp_reset_guitar(struct i2c_client *client, s32 ms); +extern s32 gtp_send_cfg(struct i2c_client *client); +extern s32 gtp_read_version(struct i2c_client *, u16*); +extern struct i2c_client *i2c_connect_client; +extern void gtp_irq_enable(struct goodix_ts_data *ts); +extern void gtp_irq_disable(struct goodix_ts_data *ts); +extern s32 gtp_i2c_read_dbl_check(struct i2c_client *, u16, u8 *, int); +static u8 gup_burn_fw_gwake_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd); + +#define _CLOSE_FILE(p_file) if (p_file && !IS_ERR(p_file)) \ + { \ + filp_close(p_file, NULL); \ + } + +#if GTP_ESD_PROTECT +extern void gtp_esd_switch(struct i2c_client *, s32); +#endif + +#if GTP_COMPATIBLE_MODE +s32 gup_fw_download_proc(void *dir, u8 dwn_mode); +#endif +/******************************************************* +Function: + Read data from the i2c slave device. +Input: + client: i2c device. + buf[0~1]: read start address. + buf[2~len-1]: read data buffer. + len: GTP_ADDR_LENGTH + read bytes count +Output: + numbers of i2c_msgs to transfer: + 2: succeed, otherwise: failed +*********************************************************/ +s32 gup_i2c_read(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msgs[2]; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msgs[0].flags = !I2C_M_RD; + msgs[0].addr = client->addr; + msgs[0].len = GTP_ADDR_LENGTH; + msgs[0].buf = &buf[0]; + + + msgs[1].flags = I2C_M_RD; + msgs[1].addr = client->addr; + msgs[1].len = len - GTP_ADDR_LENGTH; + msgs[1].buf = &buf[GTP_ADDR_LENGTH]; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret == 2) + break; + retries++; + } + + return ret; +} + +/******************************************************* +Function: + Write data to the i2c slave device. +Input: + client: i2c device. + buf[0~1]: write start address. + buf[2~len-1]: data buffer + len: GTP_ADDR_LENGTH + write bytes count +Output: + numbers of i2c_msgs to transfer: + 1: succeed, otherwise: failed +*********************************************************/ +s32 gup_i2c_write(struct i2c_client *client, u8 *buf, s32 len) +{ + struct i2c_msg msg; + s32 ret = -1; + s32 retries = 0; + + GTP_DEBUG_FUNC(); + + msg.flags = !I2C_M_RD; + msg.addr = client->addr; + msg.len = len; + msg.buf = buf; + + + while (retries < 5) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret == 1) + break; + retries++; + } + + return ret; +} + +static s32 gup_init_panel(struct goodix_ts_data *ts) +{ + s32 ret = 0; + s32 i = 0; + u8 check_sum = 0; + u8 opr_buf[16]; + u8 sensor_id = 0; + u16 version = 0; + u8 drv_cfg_version; + u8 flash_cfg_version; + +#ifndef GTP_CONFIG_OF + u8 cfg_info_group0[] = CTP_CFG_GROUP0; + u8 cfg_info_group1[] = CTP_CFG_GROUP1; + u8 cfg_info_group2[] = CTP_CFG_GROUP2; + u8 cfg_info_group3[] = CTP_CFG_GROUP3; + u8 cfg_info_group4[] = CTP_CFG_GROUP4; + u8 cfg_info_group5[] = CTP_CFG_GROUP5; + u8 *send_cfg_buf[] = {cfg_info_group0, cfg_info_group1, + cfg_info_group2, cfg_info_group3, + cfg_info_group4, cfg_info_group5}; + u8 cfg_info_len[] = { CFG_GROUP_LEN(cfg_info_group0), + CFG_GROUP_LEN(cfg_info_group1), + CFG_GROUP_LEN(cfg_info_group2), + CFG_GROUP_LEN(cfg_info_group3), + CFG_GROUP_LEN(cfg_info_group4), + CFG_GROUP_LEN(cfg_info_group5)}; + #endif + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_SENSOR_ID, &sensor_id, 1); + if (SUCCESS == ret) { + if (sensor_id >= 0x06) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", sensor_id); + return -EPERM; + } + } else { + GTP_ERROR("Failed to get sensor_id, No config sent!"); + return -EPERM; + } + + /* parse config data*/ +#ifdef GTP_CONFIG_OF + GTP_DEBUG("Get config data from dts file."); + ret = gtp_parse_dt_cfg(&ts->client->dev, &config[GTP_ADDR_LENGTH], &ts->gtp_cfg_len, sensor_id); + if (ret < 0) { + GTP_ERROR("Failed to parse config data form dts file."); + ts->pnl_init_error = 1; + return -EPERM; + } +#else + GTP_DEBUG("Get config data from header file."); + if ((!cfg_info_len[1]) && (!cfg_info_len[2]) && + (!cfg_info_len[3]) && (!cfg_info_len[4]) && + (!cfg_info_len[5])) { + sensor_id = 0; + } + ts->gtp_cfg_len = cfg_info_len[sensor_id]; + memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH); + memcpy(&config[GTP_ADDR_LENGTH], send_cfg_buf[sensor_id], ts->gtp_cfg_len); +#endif + + GTP_DEBUG("Sensor_ID: %d", sensor_id); + + if (ts->gtp_cfg_len < GTP_CONFIG_MIN_LENGTH) { + GTP_ERROR("Sensor_ID(%d) matches with NULL or INVALID CONFIG GROUP! NO Config Sent! You need to check you header file CFG_GROUP section!", sensor_id); + return -EPERM; + } + + ret = gtp_i2c_read_dbl_check(ts->client, GTP_REG_CONFIG_DATA, &opr_buf[0], 1); + if (ret == SUCCESS) { + GTP_DEBUG("CFG_GROUP%d Config Version: %d, IC Config Version: %d", sensor_id, + config[GTP_ADDR_LENGTH], opr_buf[0]); + + flash_cfg_version = opr_buf[0]; + drv_cfg_version = config[GTP_ADDR_LENGTH]; + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + config[GTP_ADDR_LENGTH] = 0x00; + } + } else { + GTP_ERROR("Failed to get ic config version!No config sent!"); + return -EPERM; + } + + GTP_DEBUG("X_MAX = %d, Y_MAX = %d, TRIGGER = 0x%02x", + ts->abs_x_max, ts->abs_y_max, ts->int_trigger_type); + + config[RESOLUTION_LOC] = (u8)GTP_MAX_WIDTH; + config[RESOLUTION_LOC + 1] = (u8)(GTP_MAX_WIDTH>>8); + config[RESOLUTION_LOC + 2] = (u8)GTP_MAX_HEIGHT; + config[RESOLUTION_LOC + 3] = (u8)(GTP_MAX_HEIGHT>>8); + + if (GTP_INT_TRIGGER == 0) { + config[TRIGGER_LOC] &= 0xfe; + } else if (GTP_INT_TRIGGER == 1) { + config[TRIGGER_LOC] |= 0x01; + } + + check_sum = 0; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + + GTP_DEBUG_FUNC(); + ret = gtp_send_cfg(ts->client); + if (ret < 0) { + GTP_ERROR("Send config error."); + } + + if (flash_cfg_version < 90 && flash_cfg_version > drv_cfg_version) { + check_sum = 0; + config[GTP_ADDR_LENGTH] = drv_cfg_version; + for (i = GTP_ADDR_LENGTH; i < ts->gtp_cfg_len; i++) { + check_sum += config[i]; + } + config[ts->gtp_cfg_len] = (~check_sum) + 1; + } + gtp_read_version(ts->client, &version); + msleep(10); + return 0; +} + + +static u8 gup_get_ic_msg(struct i2c_client *client, u16 addr, u8 *msg, s32 len) +{ + s32 i = 0; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + + for (i = 0; i < 5; i++) { + if (gup_i2c_read(client, msg, GTP_ADDR_LENGTH + len) > 0) { + break; + } + } + + if (i >= 5) { + GTP_ERROR("Read data from 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_set_ic_msg(struct i2c_client *client, u16 addr, u8 val) +{ + s32 i = 0; + u8 msg[3]; + + msg[0] = (addr >> 8) & 0xff; + msg[1] = addr & 0xff; + msg[2] = val; + + for (i = 0; i < 5; i++) { + if (gup_i2c_write(client, msg, GTP_ADDR_LENGTH + 1) > 0) { + break; + } + } + + if (i >= 5) { + GTP_ERROR("Set data to 0x%02x%02x failed!", msg[0], msg[1]); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_get_ic_fw_msg(struct i2c_client *client) +{ + s32 ret = -1; + u8 retry = 0; + u8 buf[16]; + u8 i; + + + ret = gtp_i2c_read_dbl_check(client, GUP_REG_HW_INFO, &buf[GTP_ADDR_LENGTH], 4); + if (FAIL == ret) { + GTP_ERROR("[get_ic_fw_msg]get hw_info failed,exit"); + return FAIL; + } + + + + for (i = 0; i < 4; i++) { + update_msg.ic_fw_msg.hw_info[i] = buf[GTP_ADDR_LENGTH + 3 - i]; + } + GTP_DEBUG("IC Hardware info:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + + for (retry = 0; retry < 2; retry++) { + ret = gup_get_ic_msg(client, GUP_REG_FW_MSG, buf, 1); + if (FAIL == ret) { + GTP_ERROR("Read firmware message fail."); + return ret; + } + + update_msg.force_update = buf[GTP_ADDR_LENGTH]; + if ((0xBE != update_msg.force_update) && (!retry)) { + GTP_INFO("The check sum in ic is error."); + GTP_INFO("The IC will be updated by force."); + continue; + } + break; + } + GTP_DEBUG("IC force update flag:0x%x", update_msg.force_update); + + + ret = gtp_i2c_read_dbl_check(client, GUP_REG_PID_VID, &buf[GTP_ADDR_LENGTH], 6); + if (FAIL == ret) { + GTP_ERROR("[get_ic_fw_msg]get pid & vid failed,exit"); + return FAIL; + } + + memset(update_msg.ic_fw_msg.pid, 0, sizeof(update_msg.ic_fw_msg.pid)); + memcpy(update_msg.ic_fw_msg.pid, &buf[GTP_ADDR_LENGTH], 4); + GTP_DEBUG("IC Product id:%s", update_msg.ic_fw_msg.pid); + + + /*|-----FLASH-----RAM-----| + |------918------918-----| + |------968------968-----| + |------913------913-----| + |------913P-----913P----| + |------927------927-----| + |------927P-----927P----| + |------9110-----9110----| + |------9110P----9111----|*/ + if (update_msg.ic_fw_msg.pid[0] != 0) { + if (!memcmp(update_msg.ic_fw_msg.pid, "9111", 4)) { + GTP_DEBUG("IC Mapping Product id:%s", update_msg.ic_fw_msg.pid); + memcpy(update_msg.ic_fw_msg.pid, "9110P", 5); + } + } + + update_msg.ic_fw_msg.vid = buf[GTP_ADDR_LENGTH+4] + (buf[GTP_ADDR_LENGTH+5]<<8); + GTP_DEBUG("IC version id:%04x", update_msg.ic_fw_msg.vid); + + return SUCCESS; +} + +s32 gup_enter_update_mode(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_int_gpio, (client->addr == 0x14)); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + + msleep(5); + while (retry++ < 200) { + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if (0x0C == rd_buf[GTP_ADDR_LENGTH]) { + GTP_DEBUG("Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if (retry >= 200) { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, 0x4010, 0x00); + + + return ret; +} + +void gup_leave_update_mode(void) +{ + GTP_GPIO_AS_INT(gtp_int_gpio); + + GTP_DEBUG("[leave_update_mode]reset chip."); + gtp_reset_guitar(i2c_connect_client, 20); +} + + + + + + + +/* Update Conditions: + 1. Same hardware info + 2. Same PID + 3. File VID > IC VID + Force Update Conditions: + 1. Wrong ic firmware checksum + 2. INVALID IC PID or VID + 3. (IC PID == 91XX || File PID == 91XX) && (File VID > IC VID) +*/ + +static u8 gup_enter_update_judge(st_fw_head *fw_head) +{ + u16 u16_tmp; + s32 i = 0; + u32 fw_len = 0; + s32 pid_cmp_len = 0; + u16_tmp = fw_head->vid; + fw_head->vid = (u16)(u16_tmp>>8) + (u16)(u16_tmp<<8); + + GTP_INFO("FILE HARDWARE INFO:%02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID:%s", fw_head->pid); + GTP_INFO("FILE VID:%04x", fw_head->vid); + GTP_INFO("IC HARDWARE INFO:%02x%02x%02x%02x", update_msg.ic_fw_msg.hw_info[0], update_msg.ic_fw_msg.hw_info[1], + update_msg.ic_fw_msg.hw_info[2], update_msg.ic_fw_msg.hw_info[3]); + GTP_INFO("IC PID:%s", update_msg.ic_fw_msg.pid); + GTP_INFO("IC VID:%04x", update_msg.ic_fw_msg.vid); + + if (!memcmp(fw_head->pid, "9158", 4) && !memcmp(update_msg.ic_fw_msg.pid, "915S", 4)) { + GTP_INFO("Update GT915S to GT9158 directly!"); + return SUCCESS; + } + + if (!memcmp(fw_head->hw_info, update_msg.ic_fw_msg.hw_info, sizeof(update_msg.ic_fw_msg.hw_info))) { + fw_len = 42 * 1024; + } else { + fw_len = fw_head->hw_info[3]; + fw_len += (((u32)fw_head->hw_info[2]) << 8); + fw_len += (((u32)fw_head->hw_info[1]) << 16); + fw_len += (((u32)fw_head->hw_info[0]) << 24); + } + if (update_msg.fw_total_len != fw_len) { + GTP_ERROR("Inconsistent firmware size, Update aborted! Default size: %d(%dK), actual size: %d(%dK)", fw_len, fw_len/1024, update_msg.fw_total_len, update_msg.fw_total_len/1024); + return FAIL; + } + GTP_INFO("Firmware length:%d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + + if (update_msg.force_update != 0xBE) { + GTP_INFO("FW chksum error,need enter update."); + return SUCCESS; + } + + + if (strlen(update_msg.ic_fw_msg.pid) < 3) { + GTP_INFO("Illegal IC pid, need enter update"); + return SUCCESS; + } else { + for (i = 0; i < 3; i++) { + if ((update_msg.ic_fw_msg.pid[i] < 0x30) || (update_msg.ic_fw_msg.pid[i] > 0x39)) { + GTP_INFO("Illegal IC pid, out of bound, need enter update"); + return SUCCESS; + } + } + } + + + pid_cmp_len = strlen(fw_head->pid); + if (pid_cmp_len < strlen(update_msg.ic_fw_msg.pid)) { + pid_cmp_len = strlen(update_msg.ic_fw_msg.pid); + } + + if ((!memcmp(fw_head->pid, update_msg.ic_fw_msg.pid, pid_cmp_len)) || + (!memcmp(update_msg.ic_fw_msg.pid, "91XX", 4)) || + (!memcmp(fw_head->pid, "91XX", 4))) { + if (!memcmp(fw_head->pid, "91XX", 4)) { + GTP_DEBUG("Force none same pid update mode."); + } else { + GTP_DEBUG("Get the same pid."); + } + + + if (fw_head->vid > update_msg.ic_fw_msg.vid) { + GTP_INFO("Need enter update."); + return SUCCESS; + } + GTP_ERROR("Don't meet the third condition."); + GTP_ERROR("File VID <= Ic VID, update aborted!"); + } else { + GTP_ERROR("File PID != Ic PID, update aborted!"); + } + + return FAIL; +} + + + +#if GTP_AUTO_UPDATE_CFG +static u8 ascii2hex(u8 a) +{ + s8 value = 0; + + if (a >= '0' && a <= '9') { + value = a - '0'; + } else if (a >= 'A' && a <= 'F') { + value = a - 'A' + 0x0A; + } else if (a >= 'a' && a <= 'f') { + value = a - 'a' + 0x0A; + } else { + value = 0xff; + } + + return value; +} + +static s8 gup_update_config(struct i2c_client *client) +{ + s32 file_len = 0; + s32 ret = 0; + s32 i = 0; + s32 file_cfg_len = 0; + s32 chip_cfg_len = 0; + s32 count = 0; + u8 *buf; + u8 *pre_buf; + u8 *file_config; + + struct goodix_ts_data *ts = i2c_get_clientdata(client); + + if (NULL == update_msg.cfg_file) { + GTP_ERROR("[update_cfg]No need to upgrade config!"); + return FAIL; + } + file_len = update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_END); + + chip_cfg_len = ts->gtp_cfg_len; + + GTP_DEBUG("[update_cfg]config file len:%d", file_len); + GTP_DEBUG("[update_cfg]need config len:%d", chip_cfg_len); + if ((file_len+5) < chip_cfg_len*5) { + GTP_ERROR("Config length error"); + return -EPERM; + } + + buf = (u8 *)kzalloc(file_len, GFP_KERNEL); + pre_buf = (u8 *)kzalloc(file_len, GFP_KERNEL); + file_config = (u8 *)kzalloc(chip_cfg_len + GTP_ADDR_LENGTH, GFP_KERNEL); + update_msg.cfg_file->f_op->llseek(update_msg.cfg_file, 0, SEEK_SET); + + GTP_DEBUG("[update_cfg]Read config from file."); + ret = update_msg.cfg_file->f_op->read(update_msg.cfg_file, (char *)pre_buf, file_len, &update_msg.cfg_file->f_pos); + if (ret < 0) { + GTP_ERROR("[update_cfg]Read config file failed."); + goto update_cfg_file_failed; + } + + GTP_DEBUG("[update_cfg]Delete illgal charactor."); + for (i = 0, count = 0; i < file_len; i++) { + if (pre_buf[i] == ' ' || pre_buf[i] == '\r' || pre_buf[i] == '\n') { + continue; + } + buf[count++] = pre_buf[i]; + } + + GTP_DEBUG("[update_cfg]Ascii to hex."); + file_config[0] = GTP_REG_CONFIG_DATA >> 8; + file_config[1] = GTP_REG_CONFIG_DATA & 0xff; + for (i = 0, file_cfg_len = GTP_ADDR_LENGTH; i < count; i += 5) { + if ((buf[i] == '0') && ((buf[i+1] == 'x') || (buf[i+1] == 'X'))) { + u8 high, low; + high = ascii2hex(buf[i+2]); + low = ascii2hex(buf[i+3]); + + if ((high == 0xFF) || (low == 0xFF)) { + ret = 0; + GTP_ERROR("[update_cfg]Illegal config file."); + goto update_cfg_file_failed; + } + file_config[file_cfg_len++] = (high<<4) + low; + } else { + ret = 0; + GTP_ERROR("[update_cfg]Illegal config file."); + goto update_cfg_file_failed; + } + } + + + GTP_DEBUG("config:"); + GTP_DEBUG_ARRAY(file_config+2, file_cfg_len); + + i = 0; + while (i++ < 5) { + ret = gup_i2c_write(client, file_config, file_cfg_len); + if (ret > 0) { + GTP_INFO("[update_cfg]Send config SUCCESS."); + break; + } + GTP_ERROR("[update_cfg]Send config i2c error."); + } + +update_cfg_file_failed: + kfree(pre_buf); + kfree(buf); + kfree(file_config); + return ret; +} + +#endif + +#if (GTP_AUTO_UPDATE && (!GTP_HEADER_FW_UPDATE || GTP_AUTO_UPDATE_CFG)) +static void gup_search_file(s32 search_type) +{ + s32 i = 0; + struct file *pfile = NULL; + + got_file_flag = 0x00; + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) { + if (0 == searching_file) { + GTP_INFO("Force exiting file searching"); + got_file_flag = 0x00; + return; + } + + if (search_type & AUTO_SEARCH_BIN) { + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", UPDATE_FILE_PATH_1, UPDATE_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(UPDATE_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pfile = filp_open(UPDATE_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_2); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + } else { + GTP_INFO("Bin file: %s for fw update.", UPDATE_FILE_PATH_1); + got_file_flag |= BIN_FILE_READY; + update_msg.file = pfile; + } + if (got_file_flag & BIN_FILE_READY) { + #if GTP_AUTO_UPDATE_CFG + if (search_type & AUTO_SEARCH_CFG) { + i = GUP_SEARCH_FILE_TIMES; + } else + #endif + { + searching_file = 0; + return; + } + } + } + + #if GTP_AUTO_UPDATE_CFG + if ((search_type & AUTO_SEARCH_CFG) && !(got_file_flag & CFG_FILE_READY)) { + GTP_DEBUG("Search for %s, %s for config update.(%d/%d)", CONFIG_FILE_PATH_1, CONFIG_FILE_PATH_2, i+1, GUP_SEARCH_FILE_TIMES); + pfile = filp_open(CONFIG_FILE_PATH_1, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pfile = filp_open(CONFIG_FILE_PATH_2, O_RDONLY, 0); + if (!IS_ERR(pfile)) { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_2); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + } else { + GTP_INFO("Cfg file: %s for config update.", CONFIG_FILE_PATH_1); + got_file_flag |= CFG_FILE_READY; + update_msg.cfg_file = pfile; + } + if (got_file_flag & CFG_FILE_READY) { + searching_file = 0; + return; + } + } + #endif + msleep(3000); + } + searching_file = 0; +} +#endif + + +static u8 gup_check_update_file(struct i2c_client *client, st_fw_head *fw_head, u8 *path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + u8 buf[FW_HEAD_LENGTH]; + + got_file_flag = 0x00; + if (path) { + GTP_DEBUG("Update File path:%s, %ld", path, strlen(path)); + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + got_file_flag = BIN_FILE_READY; + } else { +#if GTP_AUTO_UPDATE + #if GTP_HEADER_FW_UPDATE + + + ret = gtp_i2c_read_dbl_check(client, GTP_REG_SENSOR_ID, >P_FW_SENSOR_ID, 1); + if (SUCCESS == ret) { + if (GTP_FW_SENSOR_ID >= 0x09) { + GTP_ERROR("Invalid sensor_id(0x%02X), No Config Sent!", GTP_FW_SENSOR_ID); + + } + } + + if (GTP_FW_SENSOR_ID == 0x2) { + GTP_INFO("Update GT915L FW, Sensor ID : %d", GTP_FW_SENSOR_ID); + } else { + GTP_INFO("Force Upgrade Error !"); + + } + + GTP_INFO("Update by default firmware array"); + update_msg.fw_total_len = sizeof(gtp_default_FW) - FW_HEAD_LENGTH; + if (sizeof(gtp_default_FW) < (FW_HEAD_LENGTH+FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) { + GTP_ERROR("INVALID gtp_default_FW, check your gt9xx_firmware.h file!"); + return FAIL; + } + GTP_DEBUG("Firmware actual size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + memcpy(fw_head, >p_default_FW[0], FW_HEAD_LENGTH); + + + fw_checksum = 0; + for (i = 0; i < update_msg.fw_total_len; i += 2) { + fw_checksum += (gtp_default_FW[FW_HEAD_LENGTH + i] << 8) + gtp_default_FW[FW_HEAD_LENGTH + i + 1]; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if (fw_checksum&0xFFFF) { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + got_file_flag = HEADER_FW_READY; + return SUCCESS; + #else + + #if GTP_AUTO_UPDATE_CFG + gup_search_file(AUTO_SEARCH_BIN | AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) { + ret = gup_update_config(i2c_connect_client); + if (ret <= 0) { + GTP_ERROR("Update config failed."); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); + } + #else + gup_search_file(AUTO_SEARCH_BIN); + #endif + + if (!(got_file_flag & BIN_FILE_READY)) { + GTP_ERROR("No bin file for fw update"); + return FAIL; + } + #endif + +#else + { + GTP_ERROR("NULL file for firmware update"); + return FAIL; + } +#endif + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.fw_total_len = update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_END); + if (update_msg.fw_total_len < (FW_HEAD_LENGTH + FW_SECTION_LENGTH*4+FW_DSP_ISP_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH)) { + GTP_ERROR("INVALID bin file(size: %d), update aborted.", update_msg.fw_total_len); + return FAIL; + } + + update_msg.fw_total_len -= FW_HEAD_LENGTH; + + GTP_DEBUG("Bin firmware actual size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len/1024); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, FW_HEAD_LENGTH, &update_msg.file->f_pos); + if (ret < 0) { + GTP_ERROR("Read firmware head in update file error."); + return FAIL; + } + + memcpy(fw_head, buf, FW_HEAD_LENGTH); + + + fw_checksum = 0; + for (i = 0; i < update_msg.fw_total_len; i += 2) { + u16 temp; + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, 2, &update_msg.file->f_pos); + if (ret < 0) { + GTP_ERROR("Read firmware file error."); + return FAIL; + } + + temp = (buf[0]<<8) + buf[1]; + fw_checksum += temp; + } + + GTP_DEBUG("firmware checksum:%x", fw_checksum&0xFFFF); + if (fw_checksum&0xFFFF) { + GTP_ERROR("Illegal firmware file."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_proc(struct i2c_client *client, u8 *burn_buf, u16 start_addr, u16 total_length) +{ + s32 ret = 0; + u16 burn_addr = start_addr; + u16 frame_length = 0; + u16 burn_length = 0; + u8 wr_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + u8 retry = 0; + + GTP_DEBUG("Begin burn %dk data to addr 0x%x", (total_length/1024), start_addr); + while (burn_length < total_length) { + GTP_DEBUG("B/T:%04d/%04d", burn_length, total_length); + frame_length = ((total_length - burn_length) > PACK_SIZE) ? PACK_SIZE : (total_length - burn_length); + wr_buf[0] = (u8)(burn_addr>>8); + rd_buf[0] = wr_buf[0]; + wr_buf[1] = (u8)burn_addr; + rd_buf[1] = wr_buf[1]; + memcpy(&wr_buf[GTP_ADDR_LENGTH], &burn_buf[burn_length], frame_length); + + for (retry = 0; retry < MAX_FRAME_CHECK_TIME; retry++) { + ret = gup_i2c_write(client, wr_buf, GTP_ADDR_LENGTH + frame_length); + if (ret <= 0) { + GTP_ERROR("Write frame data i2c error."); + continue; + } + ret = gup_i2c_read(client, rd_buf, GTP_ADDR_LENGTH + frame_length); + if (ret <= 0) { + GTP_ERROR("Read back frame data i2c error."); + continue; + } + + if (memcmp(&wr_buf[GTP_ADDR_LENGTH], &rd_buf[GTP_ADDR_LENGTH], frame_length)) { + GTP_ERROR("Check frame data fail,not equal."); + GTP_DEBUG("write array:"); + GTP_DEBUG_ARRAY(&wr_buf[GTP_ADDR_LENGTH], frame_length); + GTP_DEBUG("read array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + continue; + } else { + + break; + } + } + if (retry >= MAX_FRAME_CHECK_TIME) { + GTP_ERROR("Burn frame data time out,exit."); + return FAIL; + } + burn_length += frame_length; + burn_addr += frame_length; + } + return SUCCESS; +} + +static u8 gup_load_section_file(u8 *buf, u32 offset, u16 length, u8 set_or_end) +{ +#if (GTP_AUTO_UPDATE && GTP_HEADER_FW_UPDATE) + if (got_file_flag == HEADER_FW_READY) { + if (SEEK_SET == set_or_end) { + memcpy(buf, >p_default_FW[FW_HEAD_LENGTH + offset], length); + } else { + memcpy(buf, >p_default_FW[update_msg.fw_total_len + FW_HEAD_LENGTH - offset], length); + } + return SUCCESS; + } +#endif + { + s32 ret = 0; + + if ((update_msg.file == NULL) || IS_ERR(update_msg.file)) { + GTP_ERROR("cannot find update file,load section file fail."); + return FAIL; + } + + if (SEEK_SET == set_or_end) { + update_msg.file->f_pos = FW_HEAD_LENGTH + offset; + } else { + update_msg.file->f_pos = update_msg.fw_total_len + FW_HEAD_LENGTH - offset; + } + + ret = update_msg.file->f_op->read(update_msg.file, (char *)buf, length, &update_msg.file->f_pos); + + if (ret < 0) { + GTP_ERROR("Read update file fail."); + return FAIL; + } + + return SUCCESS; + } +} + +static u8 gup_recall_check(struct i2c_client *client, u8 *chk_src, u16 start_rd_addr, u16 chk_length) +{ + u8 rd_buf[PACK_SIZE + GTP_ADDR_LENGTH]; + s32 ret = 0; + u16 recall_addr = start_rd_addr; + u16 recall_length = 0; + u16 frame_length = 0; + + while (recall_length < chk_length) { + frame_length = ((chk_length - recall_length) > PACK_SIZE) ? PACK_SIZE : (chk_length - recall_length); + ret = gup_get_ic_msg(client, recall_addr, rd_buf, frame_length); + if (ret <= 0) { + GTP_ERROR("recall i2c error,exit"); + return FAIL; + } + + if (memcmp(&rd_buf[GTP_ADDR_LENGTH], &chk_src[recall_length], frame_length)) { + GTP_ERROR("Recall frame data fail,not equal."); + GTP_DEBUG("chk_src array:"); + GTP_DEBUG_ARRAY(&chk_src[recall_length], frame_length); + GTP_DEBUG("recall array:"); + GTP_DEBUG_ARRAY(&rd_buf[GTP_ADDR_LENGTH], frame_length); + return FAIL; + } + + recall_length += frame_length; + recall_addr += frame_length; + } + GTP_DEBUG("Recall check %dk firmware success.", (chk_length/1024)); + + return SUCCESS; +} + +static u8 gup_burn_fw_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u8 bank_cmd) +{ + s32 ret = 0; + u8 rd_buf[5]; + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]hold ss51 & dsp fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + + ret = gup_burn_proc(client, fw_section, start_addr, FW_SECTION_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_section]burn fw_section fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]hold ss51 & release dsp fail."); + return FAIL; + } + + msleep(1); + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0f); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]send burn cmd fail."); + return FAIL; + } + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]Get burn state fail"); + return FAIL; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]enable accessing code fail."); + return FAIL; + } + + + ret = gup_recall_check(client, fw_section, start_addr, FW_SECTION_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_section]recall check %dk firmware fail.", FW_SECTION_LENGTH/1024); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]disable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_dsp_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_dsp_isp = NULL; + u8 retry = 0; + + GTP_INFO("[burn_dsp_isp]Begin burn dsp isp---->>"); + + + GTP_DEBUG("[burn_dsp_isp]step1:alloc memory"); + while (retry++ < 5) { + fw_dsp_isp = (u8 *)kzalloc(FW_DSP_ISP_LENGTH, GFP_KERNEL); + if (fw_dsp_isp == NULL) { + continue; + } else { + GTP_INFO("[burn_dsp_isp]Alloc %dk byte memory success.", (FW_DSP_ISP_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_dsp_isp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_dsp_isp]step2:load dsp isp file data"); + ret = gup_load_section_file(fw_dsp_isp, FW_DSP_ISP_LENGTH, FW_DSP_ISP_LENGTH, SEEK_END); + if (FAIL == ret) { + GTP_ERROR("[burn_dsp_isp]load firmware dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step3:disable wdt,clear cache enable"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]disable wdt fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]clear cache enable fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step5:set boot from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]set boot from sram fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step6:software reboot"); + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]software reboot fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step7:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]select bank2 fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step8:enable accessing code"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]enable accessing code fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step9:burn 4k dsp_isp"); + ret = gup_burn_proc(client, fw_dsp_isp, 0xC000, FW_DSP_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_dsp_isp]burn dsp_isp fail."); + goto exit_burn_dsp_isp; + } + + + GTP_DEBUG("[burn_dsp_isp]step10:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_dsp_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_dsp_isp; + } + update_msg.fw_burned_len += FW_DSP_ISP_LENGTH; + GTP_DEBUG("[burn_dsp_isp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_dsp_isp: + kfree(fw_dsp_isp); + return ret; +} + +static u8 gup_burn_fw_ss51(struct i2c_client *client) +{ + u8 *fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_INFO("[burn_fw_ss51]Begin burn ss51 firmware---->>"); + + + GTP_DEBUG("[burn_fw_ss51]step1:alloc memory"); + while (retry++ < 5) { + fw_ss51 = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_ss51 == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_ss51]Alloc %dk byte memory success.", (FW_SECTION_LENGTH / 1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_ss51]Alloc memory fail,exit."); + return FAIL; + } + + + + + + + + + + + GTP_INFO("[burn_fw_ss51]Reset first 8K of ss51 to 0xFF."); + GTP_DEBUG("[burn_fw_ss51]step2: reset bank0 0xC000~0xD000"); + memset(fw_ss51, 0xFF, FW_SECTION_LENGTH); + + + GTP_DEBUG("[burn_fw_ss51]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_ss51]clear control flag fail."); + ret = FAIL; + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step5:load ss51 firmware section 2 file data"); + ret = gup_load_section_file(fw_ss51, FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step6:burn ss51 firmware section 2"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x02); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 2 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step7:load ss51 firmware section 3 file data"); + ret = gup_load_section_file(fw_ss51, 2 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step8:burn ss51 firmware section 3"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x13); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 3 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step9:load ss51 firmware section 4 file data"); + ret = gup_load_section_file(fw_ss51, 3 * FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]load ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + + GTP_DEBUG("[burn_fw_ss51]step10:burn ss51 firmware section 4"); + ret = gup_burn_fw_section(client, fw_ss51, 0xE000, 0x14); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_ss51]burn ss51 firmware section 4 fail."); + goto exit_burn_fw_ss51; + } + + update_msg.fw_burned_len += (FW_SECTION_LENGTH*4); + GTP_DEBUG("[burn_fw_ss51]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_ss51: + kfree(fw_ss51); + return ret; +} + +static u8 gup_burn_fw_dsp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_dsp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_INFO("[burn_fw_dsp]Begin burn dsp firmware---->>"); + + GTP_DEBUG("[burn_fw_dsp]step1:alloc memory"); + while (retry++ < 5) { + fw_dsp = (u8 *)kzalloc(FW_DSP_LENGTH, GFP_KERNEL); + if (fw_dsp == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_dsp]Alloc %dk byte memory success.", (FW_SECTION_LENGTH / 1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_dsp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_dsp]step2:load firmware dsp"); + ret = gup_load_section_file(fw_dsp, 4 * FW_SECTION_LENGTH, FW_DSP_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]load firmware dsp fail."); + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step3:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step4:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step5:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step6:release ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_dsp; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_dsp]step7:burn 4k dsp firmware"); + ret = gup_burn_proc(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]burn fw_section fail."); + goto exit_burn_fw_dsp; + } + + + GTP_DEBUG("[burn_fw_dsp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x05); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]send burn cmd fail."); + goto exit_burn_fw_dsp; + } + GTP_DEBUG("[burn_fw_dsp]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_dsp]Get burn state fail"); + goto exit_burn_fw_dsp; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_dsp]step9:recall check 4k dsp firmware"); + ret = gup_recall_check(client, fw_dsp, 0x9000, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_dsp]recall check 4k dsp firmware fail."); + goto exit_burn_fw_dsp; + } + + update_msg.fw_burned_len += FW_DSP_LENGTH; + GTP_DEBUG("[burn_fw_dsp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_dsp: + kfree(fw_dsp); + return ret; +} + +static u8 gup_burn_fw_boot(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_boot = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + GTP_INFO("[burn_fw_boot]Begin burn bootloader firmware---->>"); + + + GTP_DEBUG("[burn_fw_boot]step1:Alloc memory"); + while (retry++ < 5) { + fw_boot = (u8 *)kzalloc(FW_BOOT_LENGTH, GFP_KERNEL); + if (fw_boot == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_boot]Alloc %dk byte memory success.", (FW_BOOT_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_boot]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_boot]step2:load firmware bootloader"); + ret = gup_load_section_file(fw_boot, (4 * FW_SECTION_LENGTH + FW_DSP_LENGTH), FW_BOOT_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]load firmware bootcode fail."); + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step5:hold ss51 & release dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_boot]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step6:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]burn fw_boot fail."); + goto exit_burn_fw_boot; + } + + + GTP_DEBUG("[burn_fw_boot]step7:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x06); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]send burn cmd fail."); + goto exit_burn_fw_boot; + } + GTP_DEBUG("[burn_fw_boot]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot]Get burn state fail"); + goto exit_burn_fw_boot; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_boot]step8:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot, 0x9000, FW_BOOT_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot]recall check 2k bootcode firmware fail."); + goto exit_burn_fw_boot; + } + + update_msg.fw_burned_len += FW_BOOT_LENGTH; + GTP_DEBUG("[burn_fw_boot]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_boot: + kfree(fw_boot); + return ret; +} +static u8 gup_burn_fw_boot_isp(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_boot_isp = NULL; + u8 retry = 0; + u8 rd_buf[5]; + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the boot_isp code!"); + return SUCCESS; + } + GTP_INFO("[burn_fw_boot_isp]Begin burn boot_isp firmware---->>"); + + + GTP_DEBUG("[burn_fw_boot_isp]step1:Alloc memory"); + while (retry++ < 5) { + fw_boot_isp = (u8 *)kzalloc(FW_BOOT_ISP_LENGTH, GFP_KERNEL); + if (fw_boot_isp == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_boot_isp]Alloc %dk byte memory success.", (FW_BOOT_ISP_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_boot_isp]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step2:load firmware bootloader isp"); + + ret = gup_load_section_file(fw_boot_isp, (update_msg.fw_burned_len - FW_DSP_ISP_LENGTH), FW_BOOT_ISP_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]load firmware boot_isp fail."); + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step3:hold ss51 & dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]hold ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step4:set scramble"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]set scramble fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + + GTP_DEBUG("[burn_fw_boot_isp]step5:hold ss51 & release dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]release ss51 & dsp fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + msleep(1); + + + GTP_DEBUG("[burn_fw_boot_isp]step6:select bank3"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x03); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]select bank3 fail."); + ret = FAIL; + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step7:burn 2k bootloader firmware"); + ret = gup_burn_proc(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]burn fw_section fail."); + goto exit_burn_fw_boot_isp; + } + + + GTP_DEBUG("[burn_fw_boot_isp]step8:send burn cmd to move data to flash from sram"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x07); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]send burn cmd fail."); + goto exit_burn_fw_boot_isp; + } + GTP_DEBUG("[burn_fw_boot_isp]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_boot_isp]Get burn state fail"); + goto exit_burn_fw_boot_isp; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + GTP_DEBUG("[burn_fw_boot_isp]step9:recall check 2k bootloader firmware"); + ret = gup_recall_check(client, fw_boot_isp, 0x9000, FW_BOOT_ISP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_boot_isp]recall check 2k bootcode_isp firmware fail."); + goto exit_burn_fw_boot_isp; + } + + update_msg.fw_burned_len += FW_BOOT_ISP_LENGTH; + GTP_DEBUG("[burn_fw_boot_isp]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_boot_isp: + kfree(fw_boot_isp); + return ret; +} + +static u8 gup_burn_fw_link(struct i2c_client *client) +{ + s32 ret = 0; + u8 *fw_link = NULL; + u8 retry = 0; + u32 offset; + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the link code!"); + return SUCCESS; + } + GTP_INFO("[burn_fw_link]Begin burn link firmware---->>"); + + + GTP_DEBUG("[burn_fw_link]step1:Alloc memory"); + while (retry++ < 5) { + fw_link = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_link == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_link]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_link]Alloc memory fail,exit."); + return FAIL; + } + + + GTP_DEBUG("[burn_fw_link]step2:load firmware link section 1"); + offset = update_msg.fw_burned_len - FW_DSP_ISP_LENGTH; + ret = gup_load_section_file(fw_link, offset, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]load firmware link section 1 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step3:burn link firmware section 1"); + ret = gup_burn_fw_gwake_section(client, fw_link, 0x9000, FW_SECTION_LENGTH, 0x38); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]burn link firmware section 1 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step4:load link firmware section 2 file data"); + offset += FW_SECTION_LENGTH; + ret = gup_load_section_file(fw_link, offset, FW_GLINK_LENGTH - FW_SECTION_LENGTH, SEEK_SET); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]load link firmware section 2 fail."); + goto exit_burn_fw_link; + } + + + GTP_DEBUG("[burn_fw_link]step4:burn link firmware section 2"); + ret = gup_burn_fw_gwake_section(client, fw_link, 0x9000, FW_GLINK_LENGTH - FW_SECTION_LENGTH, 0x39); + + if (FAIL == ret) { + GTP_ERROR("[burn_fw_link]burn link firmware section 2 fail."); + goto exit_burn_fw_link; + } + + update_msg.fw_burned_len += FW_GLINK_LENGTH; + GTP_DEBUG("[burn_fw_link]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_link: + kfree(fw_link); + return ret; +} + +static u8 gup_burn_fw_gwake_section(struct i2c_client *client, u8 *fw_section, u16 start_addr, u32 len, u8 bank_cmd) +{ + s32 ret = 0; + u8 rd_buf[5]; + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]hold ss51 & dsp fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x04); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]hold ss51 & release dsp fail."); + return FAIL; + } + + msleep(1); + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, (bank_cmd >> 4)&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_section]select bank %d fail.", (bank_cmd >> 4)&0x0F); + return FAIL; + } + + + ret = gup_burn_proc(client, fw_section, start_addr, len); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_app_section]burn fw_section fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, bank_cmd&0x0F); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]send burn cmd fail."); + return FAIL; + } + GTP_DEBUG("[burn_fw_section]Wait for the burn is complete......"); + do { + ret = gup_get_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, rd_buf, 1); + if (ret <= 0) { + GTP_ERROR("[burn_fw_app_section]Get burn state fail"); + return FAIL; + } + msleep(10); + + } while (rd_buf[GTP_ADDR_LENGTH]); + + + ret = gup_recall_check(client, fw_section, start_addr, len); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_app_section]recall check %dk firmware fail.", len/1024); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_burn_fw_gwake(struct i2c_client *client) +{ + u8 *fw_gwake = NULL; + u8 retry = 0; + s32 ret = 0; + u16 start_index = 4*FW_SECTION_LENGTH+FW_DSP_LENGTH+FW_BOOT_LENGTH + FW_BOOT_ISP_LENGTH + FW_GLINK_LENGTH; + + + if (update_msg.fw_burned_len >= update_msg.fw_total_len) { + GTP_DEBUG("No need to upgrade the gwake code!"); + return SUCCESS; + } + + GTP_INFO("[burn_fw_gwake]Begin burn gwake firmware---->>"); + + + GTP_DEBUG("[burn_fw_gwake]step1:alloc memory"); + while (retry++ < 5) { + fw_gwake = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_gwake == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_gwake]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_gwake]Alloc memory fail,exit."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]clear control flag fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step2:load app_code firmware section 1 file data"); + ret = gup_load_section_file(fw_gwake, start_index, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 1 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step3:burn app_code firmware section 1"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3A); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 1 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step5:load app_code firmware section 2 file data"); + ret = gup_load_section_file(fw_gwake, start_index+FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 2 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step6:burn app_code firmware section 2"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3B); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 2 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step7:load app_code firmware section 3 file data"); + ret = gup_load_section_file(fw_gwake, start_index+2*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 3 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step8:burn app_code firmware section 3"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3C); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 3 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step9:load app_code firmware section 4 file data"); + ret = gup_load_section_file(fw_gwake, start_index + 3*FW_SECTION_LENGTH, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]load app_code firmware section 4 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]step10:burn app_code firmware section 4"); + ret = gup_burn_fw_gwake_section(client, fw_gwake, 0x9000, FW_SECTION_LENGTH, 0x3D); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_gwake]burn app_code firmware section 4 fail."); + goto exit_burn_fw_gwake; + } + + + GTP_DEBUG("[burn_fw_gwake]Burned length:%d", update_msg.fw_burned_len); + ret = SUCCESS; + +exit_burn_fw_gwake: + kfree(fw_gwake); + return ret; +} + +static u8 gup_burn_fw_finish(struct i2c_client *client) +{ + u8 *fw_ss51 = NULL; + u8 retry = 0; + s32 ret = 0; + + GTP_INFO("[burn_fw_finish]burn first 8K of ss51 and finish update."); + + GTP_DEBUG("[burn_fw_finish]step1:alloc memory"); + while (retry++ < 5) { + fw_ss51 = (u8 *)kzalloc(FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_ss51 == NULL) { + continue; + } else { + GTP_DEBUG("[burn_fw_finish]Alloc %dk byte memory success.", (FW_SECTION_LENGTH/1024)); + break; + } + } + if (retry >= 5) { + GTP_ERROR("[burn_fw_finish]Alloc memory fail,exit."); + return FAIL; + } + + GTP_DEBUG("[burn_fw_finish]step2: burn ss51 first 8K."); + ret = gup_load_section_file(fw_ss51, 0, FW_SECTION_LENGTH, SEEK_SET); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_finish]load ss51 firmware section 1 fail."); + goto exit_burn_fw_finish; + } + + GTP_DEBUG("[burn_fw_finish]step3:clear control flag"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]clear control flag fail."); + goto exit_burn_fw_finish; + } + + GTP_DEBUG("[burn_fw_finish]step4:burn ss51 firmware section 1"); + ret = gup_burn_fw_section(client, fw_ss51, 0xC000, 0x01); + if (FAIL == ret) { + GTP_ERROR("[burn_fw_finish]burn ss51 firmware section 1 fail."); + goto exit_burn_fw_finish; + } + + + GTP_DEBUG("[burn_fw_finish]step5:enable download DSP code "); + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x99); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]enable download DSP code fail."); + goto exit_burn_fw_finish; + } + + + GTP_DEBUG("[burn_fw_finish]step6:release ss51 & hold dsp"); + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x08); + if (ret <= 0) { + GTP_ERROR("[burn_fw_finish]release ss51 & hold dsp fail."); + goto exit_burn_fw_finish; + } + + if (fw_ss51) { + kfree(fw_ss51); + } + return SUCCESS; + +exit_burn_fw_finish: + if (fw_ss51) { + kfree(fw_ss51); + } + return FAIL; +} +s32 gup_update_proc(void *dir) +{ + s32 ret = 0; + s32 update_ret = FAIL; + u8 retry = 0; + st_fw_head fw_head; + struct goodix_ts_data *ts = NULL; + + GTP_DEBUG("[update_proc]Begin update ......"); + + ts = i2c_get_clientdata(i2c_connect_client); + +#if GTP_AUTO_UPDATE + if (searching_file) { + u8 timeout = 0; + searching_file = 0; + GTP_INFO("Exiting searching .bin update file..."); + while ((show_len != 200) && (show_len != 100) && (timeout++ < 100)) { + msleep(100); + } + } +#endif + + show_len = 1; + total_len = 100; + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + return gup_fw_download_proc(dir, GTP_FL_FW_BURN); + } +#endif + + update_msg.file = NULL; + ret = gup_check_update_file(i2c_connect_client, &fw_head, (u8 *)dir); + if (FAIL == ret) { + GTP_ERROR("[update_proc]check update file fail."); + goto file_fail; + } + + ret = gup_get_ic_fw_msg(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]get ic message fail."); + goto file_fail; + } + + ret = gup_enter_update_judge(&fw_head); + if (FAIL == ret) { + GTP_ERROR("[update_proc]Check *.bin file fail."); + goto file_fail; + } + + ts->enter_update = 1; + gtp_irq_disable(ts); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + ret = gup_enter_update_mode(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]enter update mode fail."); + goto update_fail; + } + + while (retry++ < 5) { + show_len = 10; + total_len = 100; + update_msg.fw_burned_len = 0; + ret = gup_burn_dsp_isp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn dsp isp fail."); + continue; + } + + show_len = 20; + ret = gup_burn_fw_gwake(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn app_code firmware fail."); + continue; + } + + show_len = 30; + ret = gup_burn_fw_ss51(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn ss51 firmware fail."); + continue; + } + + show_len = 40; + ret = gup_burn_fw_dsp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn dsp firmware fail."); + continue; + } + + show_len = 50; + ret = gup_burn_fw_boot(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn bootloader firmware fail."); + continue; + } + show_len = 60; + + ret = gup_burn_fw_boot_isp(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn boot_isp firmware fail."); + continue; + } + + show_len = 70; + ret = gup_burn_fw_link(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn link firmware fail."); + continue; + } + + show_len = 80; + ret = gup_burn_fw_finish(i2c_connect_client); + if (FAIL == ret) { + GTP_ERROR("[update_proc]burn finish fail."); + continue; + } + show_len = 90; + GTP_INFO("[update_proc]UPDATE SUCCESS."); + retry = 0; + break; + } + + if (retry >= 5) { + GTP_ERROR("[update_proc]retry timeout,UPDATE FAIL."); + update_ret = FAIL; + } else { + update_ret = SUCCESS; + } + +update_fail: + GTP_DEBUG("[update_proc]leave update mode."); + gup_leave_update_mode(); + + msleep(100); + +#if WT_ADD_CTP_INFO + gtp_hardwareinfo_set(); +#endif + + if (SUCCESS == update_ret) { + if (ts->fw_error) { + GTP_INFO("firmware error auto update, resent config!"); + gup_init_panel(ts); + } else { + GTP_DEBUG("[update_proc]send config."); + ret = gtp_send_cfg(i2c_connect_client); + if (ret < 0) { + GTP_ERROR("[update_proc]send config fail."); + } else { + msleep(100); + } + } + } + ts->enter_update = 0; + gtp_irq_enable(ts); + +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); +#endif + +file_fail: + if (update_msg.file && !IS_ERR(update_msg.file)) { + if (update_msg.old_fs) { + set_fs(update_msg.old_fs); + } + filp_close(update_msg.file, NULL); + } +#if (GTP_AUTO_UPDATE && GTP_AUTO_UPDATE_CFG && GTP_HEADER_FW_UPDATE) + if (NULL == dir) { + gup_search_file(AUTO_SEARCH_CFG); + if (got_file_flag & CFG_FILE_READY) { + ret = gup_update_config(i2c_connect_client); + if (ret <= 0) { + GTP_ERROR("Update config failed."); + } + _CLOSE_FILE(update_msg.cfg_file); + msleep(500); + } + } +#endif + + total_len = 100; + if (SUCCESS == update_ret) { + show_len = 100; + return SUCCESS; + } else { + show_len = 200; + return FAIL; + } +} + +#if GTP_AUTO_UPDATE +u8 gup_init_update_proc(struct goodix_ts_data *ts) +{ + struct task_struct *thread = NULL; + + GTP_INFO("Ready to run update thread."); + +#if GTP_COMPATIBLE_MODE + if (CHIP_TYPE_GT9F == ts->chip_type) { + thread = kthread_run(gup_update_proc, "update", "fl update"); + } else +#endif + { + thread = kthread_run(gup_update_proc, (void *)NULL, "guitar_update"); + } + if (IS_ERR(thread)) { + GTP_ERROR("Failed to create update thread.\n"); + return -EPERM; + } + + return 0; +} +#endif + + + +#define FW_DOWNLOAD_LENGTH 0x4000 +#define FW_SS51_SECTION_LEN 0x2000 +#define FL_PACK_SIZE 1024 +#define GUP_FW_CHK_SIZE FL_PACK_SIZE + +#define FL_UPDATE_PATH "/data/_fl_update_.bin" +#define FL_UPDATE_PATH_SD "/sdcard/_fl_update_.bin" + +#define PULSE_LENGTH (200) +#define INIT_CLK_DAC (50) +#define MAX_CLK_DAC (120) +#define CLK_AVG_TIME (1) +#define MILLION 1000000 + +#define _wRW_MISCTL__RG_DMY 0x4282 +#define _bRW_MISCTL__RG_OSC_CALIB 0x4268 +#define _fRW_MISCTL__GIO0 0x41e9 +#define _fRW_MISCTL__GIO1 0x41ed +#define _fRW_MISCTL__GIO2 0x41f1 +#define _fRW_MISCTL__GIO3 0x41f5 +#define _fRW_MISCTL__GIO4 0x41f9 +#define _fRW_MISCTL__GIO5 0x41fd +#define _fRW_MISCTL__GIO6 0x4201 +#define _fRW_MISCTL__GIO7 0x4205 +#define _fRW_MISCTL__GIO8 0x4209 +#define _fRW_MISCTL__GIO9 0x420d +#define _fRW_MISCTL__MEA 0x41a0 +#define _bRW_MISCTL__MEA_MODE 0x41a1 +#define _wRW_MISCTL__MEA_MAX_NUM 0x41a4 +#define _dRO_MISCTL__MEA_VAL 0x41b0 +#define _bRW_MISCTL__MEA_SRCSEL 0x41a3 +#define _bRO_MISCTL__MEA_RDY 0x41a8 +#define _rRW_MISCTL__ANA_RXADC_B0_ 0x4250 +#define _bRW_MISCTL__RG_LDO_A18_PWD 0x426f +#define _bRW_MISCTL__RG_BG_PWD 0x426a +#define _bRW_MISCTL__RG_CLKGEN_PWD 0x4269 +#define _fRW_MISCTL__RG_RXADC_PWD 0x426a +#define _bRW_MISCTL__OSC_CK_SEL 0x4030 +#define _rRW_MISCTL_RG_DMY83 0x4283 +#define _rRW_MISCTL__GIO1CTL_B2_ 0x41ee +#define _rRW_MISCTL__GIO1CTL_B1_ 0x41ed + + +#if GTP_COMPATIBLE_MODE + +u8 i2c_opr_buf[GTP_ADDR_LENGTH + FL_PACK_SIZE] = {0}; +u8 chk_cmp_buf[FL_PACK_SIZE] = {0}; + +extern s32 gtp_fw_startup(struct i2c_client *client); +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode); +static s32 gup_burn_fw_proc(struct i2c_client *client, u16 start_addr, s32 start_index, s32 burn_len); +static s32 gup_check_and_repair(struct i2c_client *client, u16 start_addr, s32 start_index, s32 chk_len); + + +u8 gup_check_fs_mounted(char *path_name) +{ + struct path root_path; + struct path path; + int err = -1; + err = kern_path("/", LOOKUP_FOLLOW, &root_path); + + if (err) { + GTP_DEBUG("\"/\" NOT Mounted: %d", err); + return FAIL; + } + err = kern_path(path_name, LOOKUP_FOLLOW, &path); + + if (err) { + GTP_DEBUG("%s NOT Mounted: %d", path_name, err); + err = FAIL; + goto exit_chk; + } + + if (path.mnt->mnt_sb == root_path.mnt->mnt_sb) { + err = FAIL; + } else { + err = SUCCESS; + } + + path_put(&path); +exit_chk: + path_put(&root_path); + return err; +} + +s32 i2c_write_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len) +{ + s32 ret = 0; + s32 write_bytes = 0; + s32 retry = 0; + u8 *tx_buf = buf; + + while (len > 0) { + i2c_opr_buf[0] = (u8)(addr >> 8); + i2c_opr_buf[1] = (u8)(addr & 0xFF); + if (len > FL_PACK_SIZE) { + write_bytes = FL_PACK_SIZE; + } else { + write_bytes = len; + } + memcpy(i2c_opr_buf + 2, tx_buf, write_bytes); + for (retry = 0; retry < 5; ++retry) { + ret = gup_i2c_write(client, i2c_opr_buf, write_bytes + GTP_ADDR_LENGTH); + if (ret == 1) { + break; + } + } + if (retry >= 5) { + GTP_ERROR("retry timeout, I2C write 0x%04X %d bytes failed!", addr, write_bytes); + return -EPERM; + } + addr += write_bytes; + len -= write_bytes; + tx_buf += write_bytes; + } + + return 1; +} + +s32 i2c_read_bytes(struct i2c_client *client, u16 addr, u8 *buf, s32 len) +{ + s32 ret = 0; + s32 read_bytes = 0; + s32 retry = 0; + u8 *tx_buf = buf; + + while (len > 0) { + i2c_opr_buf[0] = (u8)(addr >> 8); + i2c_opr_buf[1] = (u8)(addr & 0xFF); + if (len > FL_PACK_SIZE) { + read_bytes = FL_PACK_SIZE; + } else { + read_bytes = len; + } + for (retry = 0; retry < 5; ++retry) { + ret = gup_i2c_read(client, i2c_opr_buf, read_bytes + GTP_ADDR_LENGTH); + if (ret == 2) { + break; + } + } + if (retry >= 5) { + GTP_ERROR("retry timeout, I2C read 0x%04X %d bytes failed!", addr, read_bytes); + return -EPERM; + } + memcpy(tx_buf, i2c_opr_buf + 2, read_bytes); + addr += read_bytes; + len -= read_bytes; + tx_buf += read_bytes; + } + return 2; +} + + + + + +static void gup_bit_write(s32 addr, s32 bit, s32 val) +{ + u8 buf; + i2c_read_bytes(i2c_connect_client, addr, &buf, 1); + + buf = (buf & (~((u8)1 << bit))) | ((u8)val << bit); + + i2c_write_bytes(i2c_connect_client, addr, &buf, 1); +} + +static void gup_clk_count_init(s32 bCh, s32 bCNT) +{ + u8 buf; + + + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + + gup_bit_write(_fRW_MISCTL__MEA, 1, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__MEA_MODE, &buf, 1); + + buf = 8 + bCh; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__MEA_SRCSEL, &buf, 1); + + buf = bCNT; + i2c_write_bytes(i2c_connect_client, _wRW_MISCTL__MEA_MAX_NUM, &buf, 1); + + gup_bit_write(_fRW_MISCTL__MEA, 1, 0); + + gup_bit_write(_fRW_MISCTL__MEA, 0, 1); +} + +static u32 gup_clk_count_get(void) +{ + s32 ready = 0; + s32 temp; + s8 buf[4]; + + while ((ready == 0)) { + i2c_read_bytes(i2c_connect_client, _bRO_MISCTL__MEA_RDY, buf, 1); + ready = buf[0]; + } + + msleep(50); + + + gup_bit_write(_fRW_MISCTL__MEA, 0, 0); + i2c_read_bytes(i2c_connect_client, _dRO_MISCTL__MEA_VAL, buf, 4); + GTP_DEBUG("Clk_count 0: %2X", buf[0]); + GTP_DEBUG("Clk_count 1: %2X", buf[1]); + GTP_DEBUG("Clk_count 2: %2X", buf[2]); + GTP_DEBUG("Clk_count 3: %2X", buf[3]); + + temp = (s32)buf[0] + ((s32)buf[1] << 8) + ((s32)buf[2] << 16) + ((s32)buf[3] << 24); + GTP_INFO("Clk_count : %d", temp); + return temp; +} +u8 gup_clk_dac_setting(int dac) +{ + s8 buf1, buf2; + + i2c_read_bytes(i2c_connect_client, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_read_bytes(i2c_connect_client, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + buf1 = (buf1 & 0xFFCF) | ((dac & 0x03) << 4); + buf2 = (dac >> 2) & 0x3f; + + i2c_write_bytes(i2c_connect_client, _wRW_MISCTL__RG_DMY, &buf1, 1); + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_OSC_CALIB, &buf2, 1); + + return 0; +} + +static u8 gup_clk_calibration_pin_select(s32 bCh) +{ + s32 i2c_addr; + + switch (bCh) { + case 0: + i2c_addr = _fRW_MISCTL__GIO0; + break; + + case 1: + i2c_addr = _fRW_MISCTL__GIO1; + break; + + case 2: + i2c_addr = _fRW_MISCTL__GIO2; + break; + + case 3: + i2c_addr = _fRW_MISCTL__GIO3; + break; + + case 4: + i2c_addr = _fRW_MISCTL__GIO4; + break; + + case 5: + i2c_addr = _fRW_MISCTL__GIO5; + break; + + case 6: + i2c_addr = _fRW_MISCTL__GIO6; + break; + + case 7: + i2c_addr = _fRW_MISCTL__GIO7; + break; + + case 8: + i2c_addr = _fRW_MISCTL__GIO8; + break; + + case 9: + i2c_addr = _fRW_MISCTL__GIO9; + break; + } + + gup_bit_write(i2c_addr, 1, 0); + + return 0; +} + +void gup_output_pulse(int t) +{ + unsigned long flags; + + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(10); + + local_irq_save(flags); + + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + msleep(50); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(t - 50); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + local_irq_restore(flags); + + msleep(20); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); +} + +static void gup_sys_clk_init(void) +{ + u8 buf; + + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 5, 0); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_LDO_A18_PWD, &buf, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_BG_PWD, &buf, 1); + + buf = 0; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__RG_CLKGEN_PWD, &buf, 1); + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 0, 0); + + gup_bit_write(_rRW_MISCTL__ANA_RXADC_B0_, 1, 0); + + + buf = 1; + i2c_write_bytes(i2c_connect_client, _bRW_MISCTL__OSC_CK_SEL, &buf, 1); +} + +s32 gup_clk_calibration(void) +{ + u8 buf; + + s32 i; + struct timeval start, end; + s32 count; + s32 count_ref; + s32 sec; + s32 usec; + + struct goodix_ts_data *ts; + + buf = 0x0C; + i2c_write_bytes(i2c_connect_client, _rRW_MISCTL__SWRST_B0_, &buf, 1); + + + gup_bit_write(_rRW_MISCTL_RG_DMY83, 7, 0); + + + gup_bit_write(_rRW_MISCTL__GIO1CTL_B2_, 0, 0); + + + gup_bit_write(_rRW_MISCTL__GIO1CTL_B1_, 1, 0); + + + + + + GTP_INFO("CLK calibration GO"); + gup_sys_clk_init(); + gup_clk_calibration_pin_select(1); + + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + ts = i2c_get_clientdata(i2c_connect_client); + + for (i = INIT_CLK_DAC; i < MAX_CLK_DAC; i++) { + GTP_INFO("CLK calibration DAC %d", i); + + if (ts->gtp_is_suspend) { + i = 72; + break; + } + + gup_clk_dac_setting(i); + gup_clk_count_init(1, CLK_AVG_TIME); + + #if 0 + gup_output_pulse(PULSE_LENGTH); + count = gup_clk_count_get(); + + if (count > PULSE_LENGTH * 60) { + break; + } + + #else + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + + do_gettimeofday(&start); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + + msleep(1); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + msleep(1); + + + do_gettimeofday(&end); + GTP_GPIO_OUTPUT(gtp_int_gpio, 1); + + + count = gup_clk_count_get(); + msleep(20); + GTP_GPIO_OUTPUT(gtp_int_gpio, 0); + + usec = end.tv_usec - start.tv_usec; + sec = end.tv_sec - start.tv_sec; + count_ref = 60 * (usec+ sec * MILLION); + + GTP_DEBUG("== time %d, %d, %d", sec, usec, count_ref); + + if (count > count_ref) { + GTP_DEBUG("== count_diff %d", count - count_ref); + break; + } + + #endif + } + + + + gtp_reset_guitar(i2c_connect_client, 20); + +#if 0 + + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x41FA, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4104, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4105, &buf, 1); + buf = 0x00; + i2c_write_bytes(i2c_connect_client, 0x4106, &buf, 1); + buf = 0x01; + i2c_write_bytes(i2c_connect_client, 0x4107, &buf, 1); + buf = 0x06; + i2c_write_bytes(i2c_connect_client, 0x41F8, &buf, 1); + buf = 0x02; + i2c_write_bytes(i2c_connect_client, 0x41F9, &buf, 1); +#endif + + GTP_GPIO_AS_INT(gtp_int_gpio); + return i; +} + + + +s32 gup_hold_ss51_dsp(struct i2c_client *client) +{ + s32 ret = -1; + s32 retry = 0; + u8 rd_buf[3]; + + while (retry++ < 200) { + + ret = gup_set_ic_msg(client, _rRW_MISCTL__SWRST_B0_, 0x0C); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + + + ret = gup_get_ic_msg(client, _rRW_MISCTL__SWRST_B0_, rd_buf, 1); + if (ret <= 0) { + GTP_DEBUG("Hold ss51 & dsp I2C error,retry:%d", retry); + continue; + } + if (0x0C == rd_buf[GTP_ADDR_LENGTH]) { + GTP_DEBUG("[enter_update_mode]Hold ss51 & dsp confirm SUCCESS"); + break; + } + GTP_DEBUG("Hold ss51 & dsp confirm 0x4180 failed,value:%d", rd_buf[GTP_ADDR_LENGTH]); + } + if (retry >= 200) { + GTP_ERROR("Enter update Hold ss51 failed."); + return FAIL; + } + + ret = gup_set_ic_msg(client, 0x4010, 0x00); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]DSP_CK and DSP_ALU_CK PowerOn fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__TMR0_EN, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]disable wdt fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__CACHE_EN, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]clear cache enable fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOTCTL_B0_, 0x02); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]set boot from sram fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bWO_MISCTL__CPU_SWRST_PULSE, 0x01); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]software reboot fail."); + return FAIL; + } + + return SUCCESS; +} + +s32 gup_enter_update_mode_fl(struct i2c_client *client) +{ + s32 ret = -1; + + + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 0); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_int_gpio, (client->addr == 0x14)); + msleep(2); + + + GTP_GPIO_OUTPUT(gtp_rst_gpio, 1); + + msleep(5); + + + ret = gup_hold_ss51_dsp(client); + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]hold ss51 & dsp failed."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_CTL_, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]clear control flag fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _rRW_MISCTL__BOOT_OPT_B0_, 0x00); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]set scramble fail."); + return FAIL; + } + + + ret = gup_set_ic_msg(client, _bRW_MISCTL__MEM_CD_EN, 0x01); + + if (ret <= 0) { + GTP_ERROR("[enter_update_mode]enable accessing code fail."); + return FAIL; + } + + return SUCCESS; +} + +static u8 gup_download_fw_dsp(struct i2c_client *client, u8 dwn_mode) +{ + s32 ret = 0; + + + GTP_DEBUG("[download_fw_dsp]step1:select bank2"); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, 0x02); + if (ret == FAIL) { + GTP_ERROR("select bank 2 fail"); + return FAIL; + } + + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("[download_fw_dsp]Begin download dsp fw---->>"); + + if (ret <= 0) { + GTP_ERROR("[download_fw_dsp]select bank2 fail."); + return FAIL; + } + GTP_DEBUG("burn fw dsp"); + ret = gup_burn_fw_proc(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("[download_fw_dsp]download FW dsp fail."); + return FAIL; + } + GTP_INFO("check firmware dsp"); + ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("check fw dsp failed!"); + return FAIL; + } + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + GTP_INFO("[download_fw_dsp]Begin esd check dsp fw---->>"); + + + + + { + + GTP_INFO("esd recovery redownload firmware dsp code"); + ret = gup_burn_fw_proc(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("redownload fw dsp failed!"); + return FAIL; + } + } + } else { + GTP_INFO("check firmware dsp"); + ret = gup_check_and_repair(client, 0xC000, 2 * FW_DOWNLOAD_LENGTH, FW_DSP_LENGTH); + if (FAIL == ret) { + GTP_ERROR("check fw dsp failed!"); + return FAIL; + } + } + return SUCCESS; +} + +static s32 gup_burn_fw_proc(struct i2c_client *client, u16 start_addr, s32 start_index, s32 burn_len) +{ + s32 ret = 0; + + GTP_DEBUG("burn firmware: 0x%04X, %d bytes, start_index: 0x%04X", start_addr, burn_len, start_index); + + ret = i2c_write_bytes(client, start_addr, (u8 *)>p_default_FW_fl[FW_HEAD_LENGTH + start_index], burn_len); + if (ret < 0) { + GTP_ERROR("burn 0x%04X, %d bytes failed!", start_addr, burn_len); + return FAIL; + } + return SUCCESS; +} + +static s32 gup_check_and_repair(struct i2c_client *client, u16 start_addr, s32 start_index, s32 chk_len) +{ + s32 ret = 0; + s32 cmp_len = 0; + u16 cmp_addr = start_addr; + s32 i = 0; + s32 chked_times = 0; + u8 chk_fail = 0; + + GTP_DEBUG("check firmware: start 0x%04X, %d bytes", start_addr, chk_len); + while ((chk_len > 0) && (chked_times < GTP_CHK_FW_MAX)) { + if (chk_len >= GUP_FW_CHK_SIZE) { + cmp_len = GUP_FW_CHK_SIZE; + } else { + cmp_len = chk_len; + } + ret = i2c_read_bytes(client, cmp_addr, chk_cmp_buf, cmp_len); + if (ret < 0) { + chk_fail = 1; + break; + } + for (i = 0; i < cmp_len; ++i) { + if (chk_cmp_buf[i] != gtp_default_FW_fl[FW_HEAD_LENGTH + start_index + i]) { + chk_fail = 1; + i2c_write_bytes(client, cmp_addr+i, >p_default_FW_fl[FW_HEAD_LENGTH + start_index + i], cmp_len-i); + GTP_ERROR("Check failed index: %d(%d != %d), redownload chuck", i, chk_cmp_buf[i], + gtp_default_FW_fl[FW_HEAD_LENGTH + start_index + i]); + break; + } + } + if (chk_fail == 1) { + chk_fail = 0; + chked_times++; + } else { + cmp_addr += cmp_len; + start_index += cmp_len; + chk_len -= cmp_len; + } + } + if (chk_len > 0) { + GTP_ERROR("cmp_addr: 0x%04X, start_index: 0x%02X, chk_len: 0x%04X", cmp_addr, + start_index, chk_len); + return FAIL; + } + return SUCCESS; +} + +static u8 gup_download_fw_ss51(struct i2c_client *client, u8 dwn_mode) +{ + s32 section = 0; + s32 ret = 0; + s32 start_index = 0; + u8 bank = 0; + u16 burn_addr = 0xC000; + + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("download firmware ss51"); + } else { + GTP_INFO("check firmware ss51"); + } + for (section = 1; section <= 4; section += 2) { + switch (section) { + case 1: + bank = 0x00; + burn_addr = (section - 1) * FW_SS51_SECTION_LEN + 0xC000; + break; + case 3: + bank = 0x01; + burn_addr = (section - 3) * FW_SS51_SECTION_LEN + 0xC000; + break; + } + start_index = (section - 1) * FW_SS51_SECTION_LEN; + + GTP_DEBUG("download firmware ss51: select bank%d", bank); + ret = gup_set_ic_msg(client, _bRW_MISCTL__SRAM_BANK, bank); + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_DEBUG("download firmware ss51 section%d & %d", section, section+1); + ret = gup_burn_fw_proc(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("download fw ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + GTP_DEBUG("check firmware ss51 section%d & %d", section, section+1); + ret = gup_check_and_repair(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("check ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + + + + { + + GTP_DEBUG("esd recovery redownload ss51 section%d & %d", section, section+1); + ret = gup_burn_fw_proc(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("download fw ss51 section%d failed!", section); + return FAIL; + } + } + } else { + GTP_DEBUG("check firmware ss51 section%d & %d", section, section+1); + ret = gup_check_and_repair(client, burn_addr, start_index, 2 * FW_SS51_SECTION_LEN); + if (ret == FAIL) { + GTP_ERROR("check ss51 section%d & %d failed!", section, section+1); + return FAIL; + } + } + } + + return SUCCESS; +} + + +static s32 gup_prepare_fl_fw(char *path, st_fw_head *fw_head) +{ + s32 ret = 0; + s32 i = 0; + s32 timeout = 0; + struct goodix_ts_data *ts = i2c_get_clientdata(i2c_connect_client); + + if (!memcmp(path, "update", 6)) { + GTP_INFO("Search for GT9XXF firmware file to update"); + + searching_file = 1; + for (i = 0; i < GUP_SEARCH_FILE_TIMES; ++i) { + if (0 == searching_file) { + GTP_INFO("Force terminate auto update for GT9XXF..."); + return FAIL; + } + GTP_DEBUG("Search for %s, %s for fw update.(%d/%d)", FL_UPDATE_PATH, FL_UPDATE_PATH_SD, i+1, GUP_SEARCH_FILE_TIMES); + update_msg.file = filp_open(FL_UPDATE_PATH, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) { + update_msg.file = filp_open(FL_UPDATE_PATH_SD, O_RDONLY, 0); + if (IS_ERR(update_msg.file)) { + msleep(3000); + continue; + } else { + path = FL_UPDATE_PATH_SD; + break; + } + } else { + path = FL_UPDATE_PATH; + break; + } + } + searching_file = 0; + if (i == 50) { + GTP_INFO("Search timeout, update aborted"); + return FAIL; + } else { + GTP_INFO("GT9XXF firmware file %s found!", path); + _CLOSE_FILE(update_msg.file); + } + while (ts->rqst_processing && (timeout++ < 5)) { + GTP_DEBUG("request processing, waiting for accomplishment"); + msleep(1000); + } + } + GTP_INFO("Firmware update file path: %s", path); + + update_msg.file = filp_open(path, O_RDONLY, 0); + + if (IS_ERR(update_msg.file)) { + GTP_ERROR("Open update file(%s) error!", path); + return FAIL; + } + + update_msg.old_fs = get_fs(); + set_fs(KERNEL_DS); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + update_msg.fw_total_len = update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_END); + + update_msg.force_update = 0xBE; + if (update_msg.fw_total_len != sizeof(gtp_default_FW_fl)) { + GTP_ERROR("Inconsistent fw size. default size: %d(%dK), file size: %d(%dK)", sizeof(gtp_default_FW_fl), sizeof(gtp_default_FW_fl)/1024, update_msg.fw_total_len, update_msg.fw_total_len/1024); + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + return FAIL; + } + + update_msg.fw_total_len -= FW_HEAD_LENGTH; + GTP_DEBUG("Fimrware size: %d(%dK)", update_msg.fw_total_len, update_msg.fw_total_len / 1024); + + update_msg.file->f_op->llseek(update_msg.file, 0, SEEK_SET); + ret = update_msg.file->f_op->read(update_msg.file, (char *)gtp_default_FW_fl, + update_msg.fw_total_len + FW_HEAD_LENGTH, + &update_msg.file->f_pos); + update_msg.fw_total_len += FW_HEAD_LENGTH; + set_fs(update_msg.old_fs); + _CLOSE_FILE(update_msg.file); + + if (ret < 0) { + GTP_ERROR("read %s failed, err-code: %d", path, ret); + return FAIL; + } + return SUCCESS; +} +static u8 gup_check_update_file_fl(struct i2c_client *client, st_fw_head *fw_head, char *path) +{ + s32 ret = 0; + s32 i = 0; + s32 fw_checksum = 0; + + if (NULL != path) { + ret = gup_prepare_fl_fw(path, fw_head); + if (FAIL == ret) { + return FAIL; + } + } + else { + update_msg.fw_total_len = sizeof(gtp_default_FW_fl); + } + + memcpy(fw_head, gtp_default_FW_fl, FW_HEAD_LENGTH); + GTP_INFO("FILE HARDWARE INFO: %02x%02x%02x%02x", fw_head->hw_info[0], fw_head->hw_info[1], fw_head->hw_info[2], fw_head->hw_info[3]); + GTP_INFO("FILE PID: %s", fw_head->pid); + fw_head->vid = ((fw_head->vid & 0xFF00) >> 8) + ((fw_head->vid & 0x00FF) << 8); + GTP_INFO("FILE VID: %04x", fw_head->vid); + + + fw_checksum = 0; + for (i = FW_HEAD_LENGTH; i < update_msg.fw_total_len; i += 2) { + fw_checksum += (gtp_default_FW_fl[i] << 8) + gtp_default_FW_fl[i+1]; + } + ret = SUCCESS; + + GTP_DEBUG("firmware checksum: %x", fw_checksum&0xFFFF); + if (fw_checksum & 0xFFFF) { + GTP_ERROR("Illegal firmware file."); + ret = FAIL; + } + + return ret; +} + +s32 gup_fw_download_proc(void *dir, u8 dwn_mode) +{ + s32 ret = 0; + u8 retry = 0; + st_fw_head fw_head; + struct goodix_ts_data *ts; + + ts = i2c_get_clientdata(i2c_connect_client); + if (NULL == dir) { + if (GTP_FL_FW_BURN == dwn_mode) { + GTP_INFO("[fw_download_proc]Begin fw download ......"); + } else if (GTP_FL_ESD_RECOVERY == dwn_mode) { + GTP_INFO("[fw_download_proc]Begin fw esd recovery check ......"); + } else { + GTP_INFO("[fw_download_proc]Being fw repair check......"); + } + } else { + GTP_INFO("[fw_download_proc]Begin firmware update by bin file"); + } + + total_len = 100; + show_len = 0; + + ret = gup_check_update_file_fl(i2c_connect_client, &fw_head, (char *)dir); + show_len = 10; + + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]check update file fail."); + goto file_fail; + } + + if (!memcmp(fw_head.pid, "950", 3)) { + ts->is_950 = 1; + GTP_DEBUG("GT9XXF Ic Type: gt950"); + } else { + ts->is_950 = 0; + } + + if (NULL != dir) { + gtp_irq_disable(ts); +#if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_OFF); +#endif + } + + ret = gup_enter_update_mode_fl(i2c_connect_client); + show_len = 20; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]enter update mode fail."); + goto download_fail; + } + + while (retry++ < 5) { + ret = gup_download_fw_ss51(i2c_connect_client, dwn_mode); + show_len = 60; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]burn ss51 firmware fail."); + continue; + } + + ret = gup_download_fw_dsp(i2c_connect_client, dwn_mode); + show_len = 80; + if (FAIL == ret) { + GTP_ERROR("[fw_download_proc]burn dsp firmware fail."); + continue; + } + + GTP_INFO("[fw_download_proc]UPDATE SUCCESS."); + break; + } + + if (retry >= 5) { + GTP_ERROR("[fw_download_proc]retry timeout,UPDATE FAIL."); + goto download_fail; + } + + if (NULL != dir) { + gtp_irq_enable(ts); + gtp_fw_startup(ts->client); + #if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); + #endif + } + show_len = 100; + return SUCCESS; + +download_fail: + if (NULL != dir) { + gtp_irq_enable(ts); + gtp_fw_startup(ts->client); + #if GTP_ESD_PROTECT + gtp_esd_switch(ts->client, SWITCH_ON); + #endif + } +file_fail: + show_len = 200; + + return FAIL; +} + +#endif + + diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig index 3cc1d6cbb0368..7fa3abaa206b3 100644 --- a/drivers/input/touchscreen/Kconfig +++ b/drivers/input/touchscreen/Kconfig @@ -995,16 +995,15 @@ config TOUCHSCREEN_FT5X06_GESTURE If unsure, say N. -config TOUCHSCREEN_MSTAR21XX - tristate "mstar touchscreens" - depends on I2C +config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS + bool "Synaptics DSX firmware update extra sysfs attributes" + depends on TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE help - Say Y here if you have a mstar touchscreen. - - If unsure, say N. + Say Y here to enable support for extra sysfs attributes + supporting firmware update in a development environment. + This does not affect the core or other subsystem attributes. - To compile this driver as a module, choose M here: the - module will be called msg21xx_ts. + If unsure, say N. config SECURE_TOUCH bool "Secure Touch" @@ -1016,6 +1015,16 @@ config SECURE_TOUCH If unsure, say N. +config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS + bool "Synaptics DSX firmware update extra sysfs attributes" + depends on TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE + help + Say Y here to enable support for extra sysfs attributes + supporting firmware update in a development environment. + This does not affect the core or other subsystem attributes. + + If unsure, say N. + config TOUCHSCREEN_IT7260_I2C tristate "IT7260 Touchscreen Driver" depends on I2C @@ -1128,4 +1137,34 @@ config TOUCHSCREEN_MAXIM_STI source "drivers/input/touchscreen/gt9xx/Kconfig" +source "drivers/input/touchscreen/FT8716/Kconfig" +source "drivers/input/touchscreen/FT8006m/Kconfig" + +config TOUCHSCREEN_FT5336 + bool "FOCALTECH touchpanel FT5336 series" + depends on I2C + +source "drivers/input/touchscreen/ft5336/Kconfig" + +config TOUCHSCREEN_FT5346 + bool "FOCALTECH touchpanel FT5346 series" + depends on I2C + +source "drivers/input/touchscreen/FT5346/Kconfig" + +config TOUCHSCREEN_GT915L + tristate "GT915L touchscreens" + depends on I2C + +source "drivers/input/touchscreen/GT915L/Kconfig" + +config TOUCHSCREEN_GT917D + tristate "GT917D touchscreens" + depends on I2C + +source "drivers/input/touchscreen/GT917D/Kconfig" + +config TOUCHSCREEN_LOCKDOWN_INFO + bool "lockdown info" + default n endif diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile index 8dacb2ef0e187..318c9c9f721ec 100644 --- a/drivers/input/touchscreen/Makefile +++ b/drivers/input/touchscreen/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_TOUCHSCREEN_EGALAX) += egalax_ts.o obj-$(CONFIG_TOUCHSCREEN_FT5X06) += ft5x06_ts.o obj-$(CONFIG_TOUCHSCREEN_FUJITSU) += fujitsu_ts.o obj-$(CONFIG_TOUCHSCREEN_GEN_VKEYS) += gen_vkeys.o +obj-$(CONFIG_TOUCHSCREEN_GEN_VKEYS) += gen_vkeys_gt.o obj-$(CONFIG_TOUCHSCREEN_ILI210X) += ili210x.o obj-$(CONFIG_TOUCHSCREEN_INEXIO) += inexio.o obj-$(CONFIG_TOUCHSCREEN_INTEL_MID) += intel-mid-touch.o @@ -86,8 +87,13 @@ obj-$(CONFIG_TOUCHSCREEN_WM97XX_ZYLONITE) += zylonite-wm97xx.o obj-$(CONFIG_TOUCHSCREEN_W90X900) += w90p910_ts.o obj-$(CONFIG_TOUCHSCREEN_TPS6507X) += tps6507x-ts.o obj-$(CONFIG_TOUCHSCREEN_ZFORCE) += zforce_ts.o -obj-$(CONFIG_TOUCHSCREEN_MSTAR21XX) += msg21xx_ts.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_I2C_RMI4) += synaptics_i2c_rmi4.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI4_DEV) += synaptics_rmi_dev.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE) += synaptics_fw_update.o +obj-$(CONFIG_TOUCHSCREEN_GT915L) += GT915L/ +obj-$(CONFIG_TOUCHSCREEN_GT917D) += GT917D/ +obj-$(CONFIG_TOUCHSCREEN_FT5346) += FT5346/ +obj-$(CONFIG_TOUCHSCREEN_FT5336) += ft5336/ obj-$(CONFIG_TOUCHSCREEN_GT9XX) += gt9xx/ +obj-$(CONFIG_TOUCHSCREEN_FTS) += FT8716/ +obj-$(CONFIG_TOUCHSCREEN_FT8006M) += FT8006m/ diff --git a/drivers/input/touchscreen/ft5336/Kconfig b/drivers/input/touchscreen/ft5336/Kconfig new file mode 100644 index 0000000000000..d43e699ec034b --- /dev/null +++ b/drivers/input/touchscreen/ft5336/Kconfig @@ -0,0 +1,5 @@ + +config TOUCHSCREEN_FT5336 + tristate "FOCALTECH FT5336 touchpanel driver" + depends on CONFIG_INPUT_TOUCHSCREEN + default n diff --git a/drivers/input/touchscreen/ft5336/Makefile b/drivers/input/touchscreen/ft5336/Makefile new file mode 100644 index 0000000000000..0e63ed69d53a4 --- /dev/null +++ b/drivers/input/touchscreen/ft5336/Makefile @@ -0,0 +1,3 @@ +#FT5336 touchpanel driver + +obj-y += ft5x06_720p.o focal_mcap_test_lib64.a diff --git a/drivers/input/touchscreen/ft5336/focal_mcap_test_lib64.a_shipped b/drivers/input/touchscreen/ft5336/focal_mcap_test_lib64.a_shipped new file mode 100644 index 0000000000000..e8064eb692a41 Binary files /dev/null and b/drivers/input/touchscreen/ft5336/focal_mcap_test_lib64.a_shipped differ diff --git a/drivers/input/touchscreen/ft5336/ft5x06_720p.c b/drivers/input/touchscreen/ft5336/ft5x06_720p.c new file mode 100644 index 0000000000000..c8159f5b40a9a --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft5x06_720p.c @@ -0,0 +1,2996 @@ +/* + * + * FocalTech ft5x06 TouchScreen driver. + * + * Copyright (c) 2010 Focal tech Ltd. + * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include + + + +#if CTP_CHARGER_DETECT +#include +#endif + +#if defined(CONFIG_FB) +#include +#include + +#elif defined(CONFIG_HAS_EARLYSUSPEND) +#include +/* Early-suspend level */ +#define FT_SUSPEND_LEVEL 1 +#endif + +#if CTP_PROC_INTERFACE +#include "ft5x06_test_lib.h" +#endif + +#if CTP_LOCKDOWN_INFO +static u8 lockdown_info[FT_LOCKDOWN_SIZE]; +extern u8 tp_color; + +static u8 nomal_boot; +#endif + +static u8 TP_Maker, LCD_Maker; + +#define FT_DEBUG_DIR_NAME "ts_debug" + +#define TPD_MAX_POINTS_5 5 +#define TPD_MAX_POINTS_10 10 + +#define TPD_MAX_POINTS_2 2 +#define AUTO_CLB_NEED 1 +#define AUTO_CLB_NONEED 0 +static struct Upgrade_Info fts_updateinfo[] = { + {0x55, "FT5x06", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x03, 1, 2000}, + {0x08, "FT5606", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x06, 100, 2000}, + {0x0a, "FT5x16", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x07, 1, 1500}, + {0x05, "FT6208", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 60, 30, 0x79, 0x05, 10, 2000}, + {0x06, "FT6x06", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 100, 30, 0x79, 0x08, 10, 2000}, + {0x36, "FT6x36", TPD_MAX_POINTS_2, AUTO_CLB_NONEED, 100, 30, 0x79, 0x18, 10, 2000}, + {0x55, "FT5x06i", TPD_MAX_POINTS_5, AUTO_CLB_NEED, 50, 30, 0x79, 0x03, 1, 2000}, + {0x14, "FT5336", TPD_MAX_POINTS_10, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x13, "FT3316", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x12, "FT5436i", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, + {0x11, "FT5336i", TPD_MAX_POINTS_5, AUTO_CLB_NONEED, 30, 30, 0x79, 0x11, 10, 2000}, +}; + +#define FT_STORE_TS_INFO(buf, id, name, max_tch, group_id, fw_vkey_support, \ + fw_name, fw_maj, fw_min, fw_sub_min) \ + snprintf(buf, FT_INFO_MAX_LEN, \ + "controller\t= focaltech\n" \ + "model\t\t= 0x%x\n" \ + "name\t\t= %s\n" \ + "max_touches\t= %d\n" \ + "drv_ver\t\t= 0x%x\n" \ + "group_id\t= 0x%x\n" \ + "fw_vkey_support\t= %s\n" \ + "fw_name\t\t= %s\n" \ + "fw_ver\t\t= %d.%d.%d\n", id, name, \ + max_tch, FT_DRIVER_VERSION, group_id, \ + fw_vkey_support, fw_name, fw_maj, fw_min, \ + fw_sub_min) + +#if CTP_PROC_INTERFACE +#define CTP_PARENT_PROC_NAME "touchscreen" +#define CTP_OPEN_PROC_NAME "ctp_openshort_test" +#define CTP_LOCKDOWN_INFOR_NAME "lockdown_info" + +#define CTP_COLOR_INFOR_NAME "panel_color" + + + + + +static struct semaphore g_device_mutex; + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); +static const struct file_operations ctp_open_procs_fops = { + .write = ctp_open_proc_write, + .read = ctp_open_proc_read, + .owner = THIS_MODULE, +}; + +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); + +static ssize_t ctp_color_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos); +static ssize_t ctp_color_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos); + +static const struct file_operations ctp_lockdown_procs_fops = { + .write = ctp_lockdown_proc_write, + .read = ctp_lockdown_proc_read, + .owner = THIS_MODULE, +}; + + +static const struct file_operations ctp_color_procs_fops = { + .write = ctp_color_proc_write, + .read = ctp_color_proc_read, + .owner = THIS_MODULE, +}; + +#endif + +#if FTS_PROC_APK_DEBUG +#define PROC_UPGRADE 0 +#define PROC_READ_REGISTER 1 +#define PROC_WRITE_REGISTER 2 +#define PROC_RAWDATA 3 +#define PROC_AUTOCLB 4 + +#define PROC_NAME "ft5x0x-debug" +static unsigned char proc_operate_mode = PROC_RAWDATA; +static struct proc_dir_entry *ft5x0x_proc_entry +#endif + +static u8 is_ic_update_crash +static struct i2c_client *update_client + +#if CTP_CHARGER_DETECT +extern int power_supply_get_battery_charge_state(struct power_supply *psy); +static struct power_supply *batt_psy +static u8 is_charger_plug +static u8 pre_charger_status + +#endif + +#if CTP_PROC_INTERFACE +static struct i2c_client *g_focalclient +#endif + +#if CTP_PROC_INTERFACE +static int focal_i2c_Read(unsigned char *writebuf, + int writelen, unsigned char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = g_focalclient->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = g_focalclient->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(g_focalclient->adapter, msgs, 2); + if (ret < 0) + dev_err(&g_focalclient->dev, "f%s: i2c read error.\n", + __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = g_focalclient->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(g_focalclient->adapter, msgs, 1); + if (ret < 0) + dev_err(&g_focalclient->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} +/*write data by i2c*/ +static int focal_i2c_Write(unsigned char *writebuf, int writelen) +{ + int ret; + + struct i2c_msg msg[] = { + { + .addr = g_focalclient->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(g_focalclient->adapter, msg, 1); + if (ret < 0) + dev_err(&g_focalclient->dev, "%s i2c write error.\n", __func__); + + return ret; +} +#endif + +static int ft5x06_i2c_read(struct i2c_client *client, char *writebuf, + int writelen, char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) + dev_err(&client->dev, "%s: i2c read error.\n", __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} + +static int ft5x06_i2c_write(struct i2c_client *client, char *writebuf, + int writelen) { + int ret; + + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s: i2c write error.\n", __func__); + + return ret; +} + +static int ft5x0x_write_reg(struct i2c_client *client, u8 addr, const u8 val) +{ + u8 buf[2] = {0}; + + buf[0] = addr; + buf[1] = val; + + return ft5x06_i2c_write(client, buf, sizeof(buf)); +} + +static int ft5x0x_read_reg(struct i2c_client *client, u8 addr, u8 *val) +{ + return ft5x06_i2c_read(client, &addr, 1, val, 1); +} + +static void ft5x06_update_fw_vendor_id(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + u8 reg_addr; + int err; + + reg_addr = FT_REG_FW_VENDOR_ID; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_vendor_id, 1); + if (err < 0) + dev_err(&client->dev, "fw vendor id read failed"); +} + +static void ft5x06_update_fw_ver(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + u8 reg_addr; + int err; + + reg_addr = FT_REG_FW_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[0], 1); + if (err < 0) + dev_err(&client->dev, "fw major version read failed"); + + reg_addr = FT_REG_FW_MIN_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[1], 1); + if (err < 0) + dev_err(&client->dev, "fw minor version read failed"); + + reg_addr = FT_REG_FW_SUB_MIN_VER; + err = ft5x06_i2c_read(client, ®_addr, 1, &data->fw_ver[2], 1); + if (err < 0) + dev_err(&client->dev, "fw sub minor version read failed"); + + dev_info(&client->dev, "Firmware version = %d.%d.%d\n", + data->fw_ver[0], data->fw_ver[1], data->fw_ver[2]); +} + +static irqreturn_t ft5x06_ts_interrupt(int irq, void *dev_id) +{ + struct ft5x06_ts_data *data = dev_id; + struct input_dev *ip_dev; + int rc, i; + u32 id, x, y, status, num_touches; + u8 reg = 0x00, *buf; + bool update_input = false; + + if (!data) { + CTP_ERROR("%s: Invalid data\n", __func__); + return IRQ_HANDLED; + } + + +#if CTP_CHARGER_DETECT + if (!batt_psy) { + + batt_psy = power_supply_get_by_name("usb"); + } else{ + is_charger_plug = (u8)power_supply_get_battery_charge_state(batt_psy); + + + if (is_charger_plug != pre_charger_status) { + pre_charger_status = is_charger_plug; + ft5x0x_write_reg(update_client, 0x8B, is_charger_plug); + + } + } + +#endif + + ip_dev = data->input_dev; + buf = data->tch_data; + + rc = ft5x06_i2c_read(data->client, ®, 1, + buf, data->tch_data_len); + if (rc < 0) { + dev_err(&data->client->dev, "%s: read data fail\n", __func__); + return IRQ_HANDLED; + } + + for (i = 0; i < data->pdata->num_max_touches; i++) { + id = (buf[FT_TOUCH_ID_POS + FT_ONE_TCH_LEN * i]) >> 4; + if (id >= FT_MAX_ID) + break; + + update_input = true; + + x = (buf[FT_TOUCH_X_H_POS + FT_ONE_TCH_LEN * i] & 0x0F) << 8 | + (buf[FT_TOUCH_X_L_POS + FT_ONE_TCH_LEN * i]); + y = (buf[FT_TOUCH_Y_H_POS + FT_ONE_TCH_LEN * i] & 0x0F) << 8 | + (buf[FT_TOUCH_Y_L_POS + FT_ONE_TCH_LEN * i]); + + status = buf[FT_TOUCH_EVENT_POS + FT_ONE_TCH_LEN * i] >> 6; + + num_touches = buf[FT_TD_STATUS] & FT_STATUS_NUM_TP_MASK; + + /* invalid combination */ + if (!num_touches && !status && !id) + break; + + if (y == 2000) { + y = 1344; + switch (x) { + case 180: + x = 150; + break; + case 540: + x = 360; + break; + case 900: + x = 580; + break; + default: + break; + } + + } + + input_mt_slot(ip_dev, id); + if (status == FT_TOUCH_DOWN || status == FT_TOUCH_CONTACT) { + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 1); + input_report_abs(ip_dev, ABS_MT_POSITION_X, x); + input_report_abs(ip_dev, ABS_MT_POSITION_Y, y); + } else { + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 0); + } + } + + if (update_input) { + input_mt_report_pointer_emulation(ip_dev, false); + input_sync(ip_dev); + } + + if (num_touches == 0) { + for (i = 0; i < data->pdata->num_max_touches; i++) { + input_mt_slot(ip_dev, i); + input_mt_report_slot_state(ip_dev, MT_TOOL_FINGER, 0); + } + input_mt_report_pointer_emulation(ip_dev, false); + input_sync(ip_dev); + } + return IRQ_HANDLED; +} + +static int ft5x06_power_on(struct ft5x06_ts_data *data, bool on) +{ + int rc; + + if (!on) + goto power_off; + + rc = regulator_enable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd enable failed rc=%d\n", rc); + return rc; + } + + rc = regulator_enable(data->vcc_i2c); + if (rc) { + dev_err(&data->client->dev, + "Regulator vcc_i2c enable failed rc=%d\n", rc); + regulator_disable(data->vdd); + } + + return rc; + +power_off: + rc = regulator_disable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd disable failed rc=%d\n", rc); + return rc; + } + + rc = regulator_disable(data->vcc_i2c); + if (rc) { + dev_err(&data->client->dev, + "Regulator vcc_i2c disable failed rc=%d\n", rc); + rc = regulator_enable(data->vdd); + if (rc) { + dev_err(&data->client->dev, + "Regulator vdd enable failed rc=%d\n", rc); + } + } + + return rc; +} + +static int ft5x06_power_init(struct ft5x06_ts_data *data, bool on) +{ + int rc; + + if (!on) + goto pwr_deinit; + + data->vdd = regulator_get(&data->client->dev, "vdd"); + if (IS_ERR(data->vdd)) { + rc = PTR_ERR(data->vdd); + dev_err(&data->client->dev, + "Regulator get failed vdd rc=%d\n", rc); + return rc; + } + + if (regulator_count_voltages(data->vdd) > 0) { + rc = regulator_set_voltage(data->vdd, FT_VTG_MIN_UV, + FT_VTG_MAX_UV); + if (rc) { + dev_err(&data->client->dev, + "Regulator set_vtg failed vdd rc=%d\n", rc); + goto reg_vdd_put; + } + } + + data->vcc_i2c = regulator_get(&data->client->dev, "vcc_i2c"); + if (IS_ERR(data->vcc_i2c)) { + rc = PTR_ERR(data->vcc_i2c); + dev_err(&data->client->dev, + "Regulator get failed vcc_i2c rc=%d\n", rc); + goto reg_vdd_set_vtg; + } + + if (regulator_count_voltages(data->vcc_i2c) > 0) { + rc = regulator_set_voltage(data->vcc_i2c, FT_I2C_VTG_MIN_UV, + FT_I2C_VTG_MAX_UV); + if (rc) { + dev_err(&data->client->dev, + "Regulator set_vtg failed vcc_i2c rc=%d\n", rc); + goto reg_vcc_i2c_put; + } + } + + return 0; + +reg_vcc_i2c_put: + regulator_put(data->vcc_i2c); +reg_vdd_set_vtg: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FT_VTG_MAX_UV); +reg_vdd_put: + regulator_put(data->vdd); + return rc; + +pwr_deinit: + if (regulator_count_voltages(data->vdd) > 0) + regulator_set_voltage(data->vdd, 0, FT_VTG_MAX_UV); + + regulator_put(data->vdd); + + if (regulator_count_voltages(data->vcc_i2c) > 0) + regulator_set_voltage(data->vcc_i2c, 0, FT_I2C_VTG_MAX_UV); + + regulator_put(data->vcc_i2c); + return 0; +} + +static int ft5x06_ts_pinctrl_select(struct ft5x06_ts_data *ft5x06_data, + bool on) +{ + struct pinctrl_state *pins_state; + int ret; + + pins_state = on ? ft5x06_data->gpio_state_active + : ft5x06_data->gpio_state_suspend; + if (!IS_ERR_OR_NULL(pins_state)) { + ret = pinctrl_select_state(ft5x06_data->ts_pinctrl, pins_state); + if (ret) { + dev_err(&ft5x06_data->client->dev, + "can not set %s pins\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + return ret; + } + } else { + dev_err(&ft5x06_data->client->dev, + "not a valid '%s' pinstate\n", + on ? "pmx_ts_active" : "pmx_ts_suspend"); + } + + return 0; +} + + +#ifdef CONFIG_PM +static int ft5x06_ts_suspend(struct device *dev) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + char txbuf[2], i; + int err; + + if (data->loading_fw) { + dev_info(dev, "Firmware loading in process...\n"); + return 0; + } + + if (data->suspended) { + dev_info(dev, "Already in suspend state\n"); + return 0; + } + + disable_irq(data->client->irq); + + /* release all touches */ + for (i = 0; i < data->pdata->num_max_touches; i++) { + input_mt_slot(data->input_dev, i); + input_mt_report_slot_state(data->input_dev, MT_TOOL_FINGER, 0); + } + input_mt_report_pointer_emulation(data->input_dev, false); + input_sync(data->input_dev); + + if (gpio_is_valid(data->pdata->reset_gpio)) { + txbuf[0] = FT_REG_PMODE; + txbuf[1] = FT_PMODE_HIBERNATE; + err = ft5x06_i2c_write(data->client, txbuf, sizeof(txbuf)); + + msleep(data->pdata->hard_rst_dly); + } + + + if (data->pdata->power_on) { + err = data->pdata->power_on(false); + if (err) { + dev_err(dev, "power off failed"); + goto pwr_off_fail; + } + } else { + err = ft5x06_power_on(data, false); + if (err) { + dev_err(dev, "power off failed"); + goto pwr_off_fail; + } + } + + data->suspended = true; + + return 0; + + +pwr_off_fail: + if (gpio_is_valid(data->pdata->reset_gpio)) { + gpio_set_value_cansleep(data->pdata->reset_gpio, 0); + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + enable_irq(data->client->irq); + return err; + +} + +static int ft5x06_ts_resume(struct device *dev) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + int err; + + if (!data->suspended) { + dev_dbg(dev, "Already in awake state\n"); + return 0; + } + + + if (data->pdata->power_on) { + err = data->pdata->power_on(true); + if (err) { + dev_err(dev, "power on failed"); + return err; + } + } else { + err = ft5x06_power_on(data, true); + if (err) { + dev_err(dev, "power on failed"); + return err; + } + } + + if (gpio_is_valid(data->pdata->reset_gpio)) { + gpio_set_value_cansleep(data->pdata->reset_gpio, 0); + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + + msleep(data->pdata->soft_rst_dly); + + enable_irq(data->client->irq); + +#if CTP_CHARGER_DETECT + batt_psy = power_supply_get_by_name("usb"); + if (!batt_psy) + CTP_ERROR("tp resume battery supply not found\n"); + else{ + is_charger_plug = (u8)power_supply_get_battery_charge_state(batt_psy); + + CTP_DEBUG("is_charger_plug %d, prev %d", is_charger_plug, pre_charger_status); + if (is_charger_plug) { + ft5x0x_write_reg(update_client, 0x8B, 1); + } else{ + ft5x0x_write_reg(update_client, 0x8B, 0); + } + } + pre_charger_status = is_charger_plug; +#endif + + + data->suspended = false; + + return 0; +} + +static const struct dev_pm_ops ft5x06_ts_pm_ops = { +#if (!defined(CONFIG_FB) && !defined(CONFIG_HAS_EARLYSUSPEND)) + .suspend = ft5x06_ts_suspend, + .resume = ft5x06_ts_resume, +#endif +}; + +#else +static int ft5x06_ts_suspend(struct device *dev) +{ + return 0; +} + +static int ft5x06_ts_resume(struct device *dev) +{ + return 0; +} + +#endif + +#if defined(CONFIG_FB) + +static void fb_notify_resume_work(struct work_struct *work) +{ + struct ft5x06_ts_data *ft5x06_data = + container_of(work, struct ft5x06_ts_data, fb_notify_work); + ft5x06_ts_resume(&ft5x06_data->client->dev); +} +static int fb_notifier_callback(struct notifier_block *self, + unsigned long event, void *data) +{ + struct fb_event *evdata = data; + int *blank; + struct ft5x06_ts_data *ft5x06_data = + container_of(self, struct ft5x06_ts_data, fb_notif); + + if (evdata && evdata->data && event == FB_EVENT_BLANK && + ft5x06_data && ft5x06_data->client) { + blank = evdata->data; + if (*blank == FB_BLANK_UNBLANK) + schedule_work(&ft5x06_data->fb_notify_work); + else if (*blank == FB_BLANK_POWERDOWN) { + flush_work(&ft5x06_data->fb_notify_work); + ft5x06_ts_suspend(&ft5x06_data->client->dev); + } + } + + return 0; +} +#elif defined(CONFIG_HAS_EARLYSUSPEND) +static void ft5x06_ts_early_suspend(struct early_suspend *handler) +{ + struct ft5x06_ts_data *data = container_of(handler, + struct ft5x06_ts_data, + early_suspend); + + ft5x06_ts_suspend(&data->client->dev); +} + +static void ft5x06_ts_late_resume(struct early_suspend *handler) +{ + struct ft5x06_ts_data *data = container_of(handler, + struct ft5x06_ts_data, + early_suspend); + + ft5x06_ts_resume(&data->client->dev); +} +#endif + +static int ft5x06_fw_upgrade_start(struct i2c_client *client, + const u8 *data, u32 data_len) +{ + struct ft5x06_ts_data *ts_data = i2c_get_clientdata(client); + struct fw_upgrade_info info = ts_data->pdata->info; + + u8 reg_addr; + u8 chip_id = 0x00; + u8 w_buf[FT_MAX_WR_BUF] = {0}, r_buf[FT_MAX_RD_BUF] = {0}; + u8 pkt_buf[FT_FW_PKT_LEN + FT_FW_PKT_META_LEN]; + int i, j, temp; + u32 pkt_num, pkt_len; + u8 is_5336_new_bootloader = false; + u8 is_5336_fwsize_30 = false; + u8 fw_ecc; + + +#if 1 + reg_addr = FT_REG_ID; + temp = ft5x06_i2c_read(client, ®_addr, 1, &chip_id, 1); + if (temp < 0) { + dev_err(&client->dev, "version read failed"); + } + + if (is_ic_update_crash) { + chip_id = CTP_IC_TYPE_1; + + } + for (i = 0; i < sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info); i++) { + if (chip_id == fts_updateinfo[i].CHIP_ID) { + info.auto_cal = fts_updateinfo[i].AUTO_CLB; + info.delay_55 = fts_updateinfo[i].delay_55; + info.delay_aa = fts_updateinfo[i].delay_aa; + info.delay_erase_flash = fts_updateinfo[i].delay_earse_flash; + info.delay_readid = fts_updateinfo[i].delay_readid; + info.upgrade_id_1 = fts_updateinfo[i].upgrade_id_1; + info.upgrade_id_2 = fts_updateinfo[i].upgrade_id_2; + + break; + } + } + + ts_data->family_id = chip_id; + + if (i >= sizeof(fts_updateinfo)/sizeof(struct Upgrade_Info)) { + info.auto_cal = fts_updateinfo[7].AUTO_CLB; + info.delay_55 = fts_updateinfo[7].delay_55; + info.delay_aa = fts_updateinfo[7].delay_aa; + info.delay_erase_flash = fts_updateinfo[7].delay_earse_flash; + info.delay_readid = fts_updateinfo[7].delay_readid; + info.upgrade_id_1 = fts_updateinfo[7].upgrade_id_1; + info.upgrade_id_2 = fts_updateinfo[7].upgrade_id_2; + } +#endif + + CTP_DEBUG("enter fw_upgrade_start"); + dev_err(&client->dev, "id1 = 0x%x id2 = 0x%x family_id=0x%x\n", + info.upgrade_id_1, info.upgrade_id_2, ts_data->family_id); + /* determine firmware size */ + if (*(data + data_len - FT_BLOADER_SIZE_OFF) == FT_BLOADER_NEW_SIZE) + is_5336_fwsize_30 = true; + else + is_5336_fwsize_30 = false; + + + for (i = 0, j = 0; i < FT_UPGRADE_LOOP; i++) { + msleep(FT_EARSE_DLY_MS); + + if (gpio_is_valid(ts_data->pdata->reset_gpio)) { + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); + msleep(ts_data->pdata->hard_rst_dly); + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 1); + } + + if (i <= (FT_UPGRADE_LOOP / 2)) + msleep(info.delay_55 + i * 3); + else + msleep(info.delay_55 - (i - (FT_UPGRADE_LOOP / 2)) * 2); + + /* Enter upgrade mode */ + w_buf[0] = FT_UPGRADE_55; + ft5x06_i2c_write(client, &w_buf[0], 1); + usleep(FT_55_AA_DLY_NS); + w_buf[0] = FT_UPGRADE_AA; + ft5x06_i2c_write(client, &w_buf[0], 1); + + /* check READ_ID */ + msleep(info.delay_readid); + w_buf[0] = FT_READ_ID_REG; + w_buf[1] = 0x00; + w_buf[2] = 0x00; + w_buf[3] = 0x00; + + ft5x06_i2c_read(client, w_buf, 4, r_buf, 2); + + CTP_DEBUG("%X, %X", r_buf[0], r_buf[1]); + if (r_buf[0] != info.upgrade_id_1 + || r_buf[1] != info.upgrade_id_2) { + dev_err(&client->dev, "Upgrade ID mismatch(%d), IC=0x%x 0x%x, info=0x%x 0x%x\n", + i, r_buf[0], r_buf[1], + info.upgrade_id_1, info.upgrade_id_2); + } else + break; + } + + if (i >= FT_UPGRADE_LOOP) { + dev_err(&client->dev, "Abort upgrade\n"); + return -EIO; + } + + w_buf[0] = 0xcd; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 1); + + if (r_buf[0] <= 4) + is_5336_new_bootloader = FT_BLOADER_VERSION_LZ4; + else if (r_buf[0] == 7) + is_5336_new_bootloader = FT_BLOADER_VERSION_Z7; + else if (r_buf[0] >= 0x0f && + ((ts_data->family_id == FT_FT5336_FAMILY_ID_0x11) || + (ts_data->family_id == FT_FT5336_FAMILY_ID_0x12) || + (ts_data->family_id == FT_FT5336_FAMILY_ID_0x13) || + (ts_data->family_id == FT_FT5336_FAMILY_ID_0x14))) + is_5336_new_bootloader = FT_BLOADER_VERSION_GZF; + else + is_5336_new_bootloader = FT_BLOADER_VERSION_LZ4; + + dev_dbg(&client->dev, "bootloader type=%d, r_buf=0x%x, family_id=0x%x\n", + is_5336_new_bootloader, r_buf[0], ts_data->family_id); + + /* erase app and panel paramenter area */ + w_buf[0] = FT_ERASE_APP_REG; + ft5x06_i2c_write(client, w_buf, 1); + msleep(info.delay_erase_flash); + + if (is_5336_fwsize_30) { + w_buf[0] = FT_ERASE_PANEL_REG; + ft5x06_i2c_write(client, w_buf, 1); + } + msleep(FT_EARSE_DLY_MS); + + /* program firmware */ + if (is_5336_new_bootloader == FT_BLOADER_VERSION_LZ4 + || is_5336_new_bootloader == FT_BLOADER_VERSION_Z7) + data_len = data_len - FT_DATA_LEN_OFF_OLD_FW; + else + data_len = data_len - FT_DATA_LEN_OFF_NEW_FW; + + pkt_num = (data_len) / FT_FW_PKT_LEN; + pkt_len = FT_FW_PKT_LEN; + pkt_buf[0] = FT_FW_START_REG; + pkt_buf[1] = 0x00; + fw_ecc = 0; + + for (i = 0; i < pkt_num; i++) { + temp = i * FT_FW_PKT_LEN; + pkt_buf[2] = (u8) (temp >> FT_8BIT_SHIFT); + pkt_buf[3] = (u8) temp; + pkt_buf[4] = (u8) (pkt_len >> FT_8BIT_SHIFT); + pkt_buf[5] = (u8) pkt_len; + + for (j = 0; j < FT_FW_PKT_LEN; j++) { + pkt_buf[6 + j] = data[i * FT_FW_PKT_LEN + j]; + fw_ecc ^= pkt_buf[6 + j]; + } + + ft5x06_i2c_write(client, pkt_buf, + FT_FW_PKT_LEN + FT_FW_PKT_META_LEN); + msleep(FT_FW_PKT_DLY_MS); + } + + /* send remaining bytes */ + if ((data_len) % FT_FW_PKT_LEN > 0) { + temp = pkt_num * FT_FW_PKT_LEN; + pkt_buf[2] = (u8) (temp >> FT_8BIT_SHIFT); + pkt_buf[3] = (u8) temp; + temp = (data_len) % FT_FW_PKT_LEN; + pkt_buf[4] = (u8) (temp >> FT_8BIT_SHIFT); + pkt_buf[5] = (u8) temp; + + for (i = 0; i < temp; i++) { + pkt_buf[6 + i] = data[pkt_num * FT_FW_PKT_LEN + i]; + fw_ecc ^= pkt_buf[6 + i]; + } + + ft5x06_i2c_write(client, pkt_buf, temp + FT_FW_PKT_META_LEN); + msleep(FT_FW_PKT_DLY_MS); + } + + /* send the finishing packet */ + if (is_5336_new_bootloader == FT_BLOADER_VERSION_LZ4 || + is_5336_new_bootloader == FT_BLOADER_VERSION_Z7) { + for (i = 0; i < FT_FINISHING_PKT_LEN_OLD_FW; i++) { + if (is_5336_new_bootloader == FT_BLOADER_VERSION_Z7) + temp = FT_MAGIC_BLOADER_Z7 + i; + else if (is_5336_new_bootloader == + FT_BLOADER_VERSION_LZ4) + temp = FT_MAGIC_BLOADER_LZ4 + i; + pkt_buf[2] = (u8)(temp >> 8); + pkt_buf[3] = (u8)temp; + temp = 1; + pkt_buf[4] = (u8)(temp >> 8); + pkt_buf[5] = (u8)temp; + pkt_buf[6] = data[data_len + i]; + fw_ecc ^= pkt_buf[6]; + + ft5x06_i2c_write(client, + pkt_buf, temp + FT_FW_PKT_META_LEN); + msleep(FT_FW_PKT_DLY_MS); + } + } else if (is_5336_new_bootloader == FT_BLOADER_VERSION_GZF) { + for (i = 0; i < FT_FINISHING_PKT_LEN_NEW_FW; i++) { + if (is_5336_fwsize_30) + temp = FT_MAGIC_BLOADER_GZF_30 + i; + else + temp = FT_MAGIC_BLOADER_GZF + i; + pkt_buf[2] = (u8)(temp >> 8); + pkt_buf[3] = (u8)temp; + temp = 1; + pkt_buf[4] = (u8)(temp >> 8); + pkt_buf[5] = (u8)temp; + pkt_buf[6] = data[data_len + i]; + fw_ecc ^= pkt_buf[6]; + + ft5x06_i2c_write(client, + pkt_buf, temp + FT_FW_PKT_META_LEN); + msleep(FT_FW_PKT_DLY_MS); + + } + } + + /* verify checksum */ + w_buf[0] = FT_REG_ECC; + ft5x06_i2c_read(client, w_buf, 1, r_buf, 1); + if (r_buf[0] != fw_ecc) { + dev_err(&client->dev, "ECC error! dev_ecc=%02x fw_ecc=%02x\n", + r_buf[0], fw_ecc); + return -EIO; + } + + /* reset */ + w_buf[0] = FT_REG_RESET_FW; + ft5x06_i2c_write(client, w_buf, 1); + msleep(ts_data->pdata->soft_rst_dly); + + dev_info(&client->dev, "Firmware upgrade successful\n"); + + return 0; +} + +static void fts_ctpm_read_lockdown(struct i2c_client *client, struct ft5x06_ts_data *data) +{ + u8 buf[128]; + u8 w_buf[4], r_buf[2]; + u32 i = 0, j = 0; + u32 k = 0; + struct ft5x06_ts_data *ts_data = i2c_get_clientdata(client); + + + for (i = 0, j = 0; i < FT_UPGRADE_LOOP; i++) { + msleep(FT_EARSE_DLY_MS); + + + if (gpio_is_valid(ts_data->pdata->reset_gpio)) { + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); + msleep(ts_data->pdata->hard_rst_dly); + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 1); + } + + if (i <= (FT_UPGRADE_LOOP / 2)) + msleep(30 + i * 3); + else + msleep(30 - (i - (FT_UPGRADE_LOOP / 2)) * 2); + + /* Enter upgrade mode */ + w_buf[0] = FT_UPGRADE_55; + ft5x06_i2c_write(client, &w_buf[0], 1); + usleep(FT_55_AA_DLY_NS); + w_buf[0] = FT_UPGRADE_AA; + ft5x06_i2c_write(client, &w_buf[0], 1); + + /* check READ_ID */ + msleep(10); + w_buf[0] = FT_READ_ID_REG; + w_buf[1] = 0x00; + w_buf[2] = 0x00; + w_buf[3] = 0x00; + + ft5x06_i2c_read(client, w_buf, 4, r_buf, 2); + + if (r_buf[0] != 0x79 || r_buf[1] != 0x11) { + continue; + } else + break; + } + /*--------- read current project setting ---------- */ + /*set read start address */ + + buf[0] = 0x03; + buf[1] = 0x00; + buf[2] = (u8)(0x07d0 >> 8); + buf[3] = (u8)(0x07d0); + + ft5x06_i2c_read(client, buf, 4, data->lockdown_info, 8); + msleep(10); + + if (gpio_is_valid(ts_data->pdata->reset_gpio)) { + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); + msleep(ts_data->pdata->hard_rst_dly); + gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 1); + } + + msleep(200); + + for (k = 0 ; k < FT_LOCKDOWN_SIZE; k++) { + + lockdown_info[k] = data->lockdown_info[k]; + } + + tp_color = lockdown_info[2]; + TP_Maker = lockdown_info[0]; + LCD_Maker = lockdown_info[1]; + dev_info(&client->dev, "Lockdown info: %02X %02X %02X %02X %02X %02X %02X %02X", + lockdown_info[0], lockdown_info[1], + lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], + lockdown_info[6], lockdown_info[7]); +} + +#if TPD_AUTO_UPGRADE + +static unsigned char CTPM_FW1[] = { +#include "ft_app_ic_biel_ebbg_720p.txt" +}; + +static unsigned char CTPM_FW2[] = { +#include "ft_app_ic_oufei_boe_720p.txt" +}; + +static int fts_ctpm_fw_upgrade_with_i_file(struct ft5x06_ts_data *data) +{ + struct i2c_client *client = data->client; + int flag_TPID = 0; + u8 *pbt_buf = 0x0; + int rc = 0, fw_len = 0; + u8 uc_host_fm_ver, uc_tp_fm_ver, vendor_id, ic_type; + u8 reg_addr; + + reg_addr = 0xA6; + ft5x06_i2c_read(client, ®_addr, 1, &uc_tp_fm_ver, 1); + reg_addr = 0xA8; + ft5x06_i2c_read(client, ®_addr, 1, &vendor_id, 1); + reg_addr = 0xA3; + ft5x06_i2c_read(client, ®_addr, 1, &ic_type, 1); + + CTP_DEBUG("Vendor ID:0x%02X, TP FW:0x%02X, IC TYPE:%d", vendor_id, uc_tp_fm_ver, ic_type); + + if (vendor_id == 0xA8 || vendor_id == 0x00 || ic_type == 0xA3 || ic_type == 0x00) { + CTP_ERROR("vend_id read error,need project"); + + fts_ctpm_read_lockdown(client, data); + flag_TPID = 1; + is_ic_update_crash = 1; + } + + + if ((TP_Maker == TP_Biel && LCD_Maker == LCD_EBBG)) { + pbt_buf = CTPM_FW1; + fw_len = sizeof(CTPM_FW1); + CTP_DEBUG("BIEL+EBBG"); + } else if (((TP_Maker == TP_OUFEI && LCD_Maker == LCD_BOE)) || (vendor_id == 0x51)) { + pbt_buf = CTPM_FW2; + fw_len = sizeof(CTPM_FW2); + CTP_DEBUG("OUFEI+BOE"); + } + + else { + CTP_ERROR("read vendor_id fail"); + return -EPERM; + } + + CTP_DEBUG("update firmware size:%d", fw_len); + + if (sizeof(CTPM_FW1) < 8 || sizeof(CTPM_FW1) > 32 * 1024 || sizeof(CTPM_FW2) < 8 || sizeof(CTPM_FW2) > 32 * 1024) { + CTP_ERROR("FW length error\n"); + return -EPERM; + } + + if ((pbt_buf[fw_len - 8] ^ pbt_buf[fw_len - 6]) == 0xFF + && (pbt_buf[fw_len - 7] ^ pbt_buf[fw_len - 5]) == 0xFF + && (pbt_buf[fw_len - 3] ^ pbt_buf[fw_len - 4]) == 0xFF) { + + uc_host_fm_ver = pbt_buf[fw_len - 2]; + CTP_DEBUG("[FTS] uc_tp_fm_ver = %d.\n", uc_tp_fm_ver); + CTP_DEBUG("[FTS] uc_host_fm_ver = %d.\n", uc_host_fm_ver); + + if ((uc_tp_fm_ver < uc_host_fm_ver) || (is_ic_update_crash == 1)) { + rc = ft5x06_fw_upgrade_start(update_client, pbt_buf, fw_len); + if (rc != 0) { + CTP_DEBUG("[FTS] upgrade failed rc = %d.\n", rc); + } else { + CTP_DEBUG("[FTS] upgrade successfully.\n"); + } + } + } + + return rc; +} +#endif + +#if CTP_SYS_APK_UPDATE +static ssize_t ft5x06_fw_name_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u8 fw_version = 0x00; + + ft5x0x_read_reg(update_client, FT5x0x_REG_FW_VER, &fw_version); + + return sprintf(buf, "firmware version %02X\n", fw_version); +} + +static ssize_t ft5x06_fw_name_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + + if (size > FT_FW_NAME_MAX_LEN - 1) + return -EINVAL; + + strlcpy(data->fw_name, buf, size); + if (data->fw_name[size-1] == '\n') + data->fw_name[size-1] = 0; + + return size; +} + +static DEVICE_ATTR(fw_name, 0664, ft5x06_fw_name_show, ft5x06_fw_name_store); + +static int ft5x06_auto_cal(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + u8 temp = 0, i; + + /* set to factory mode */ + msleep(2 * data->pdata->soft_rst_dly); + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_FACTORYMODE_VALUE); + msleep(data->pdata->soft_rst_dly); + + /* start calibration */ + ft5x0x_write_reg(client, FT_DEV_MODE_REG_CAL, FT_CAL_START); + msleep(2 * data->pdata->soft_rst_dly); + for (i = 0; i < FT_CAL_RETRY; i++) { + ft5x0x_read_reg(client, FT_REG_CAL, &temp); + /*return to normal mode, calibration finish */ + if (((temp & FT_CAL_MASK) >> FT_4BIT_SHIFT) == FT_CAL_FIN) + break; + } + + /*calibration OK */ + msleep(2 * data->pdata->soft_rst_dly); + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_FACTORYMODE_VALUE); + msleep(data->pdata->soft_rst_dly); + + ft5x0x_write_reg(client, FT_DEV_MODE_REG_CAL, FT_CAL_STORE); + msleep(2 * data->pdata->soft_rst_dly); + + /* set to normal mode */ + ft5x0x_write_reg(client, FT_REG_DEV_MODE, FT_WORKMODE_VALUE); + msleep(2 * data->pdata->soft_rst_dly); + + return 0; +} + + +static int ft5x06_fw_upgrade(struct device *dev, bool force) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + const struct firmware *fw = NULL; + int rc; + u8 fw_file_maj, fw_file_min, fw_file_sub_min, fw_file_vendor_id; + bool fw_upgrade = false; + + if (data->suspended) { + dev_err(dev, "Device is in suspend state: Exit FW upgrade\n"); + return -EBUSY; + } + + rc = request_firmware(&fw, data->fw_name, dev); + if (rc < 0) { + dev_err(dev, "Request firmware failed - %s (%d)\n", + data->fw_name, rc); + return rc; + } + + if (fw->size < FT_FW_MIN_SIZE || fw->size > FT_FW_MAX_SIZE) { + dev_err(dev, "Invalid firmware size (%zu)\n", fw->size); + rc = -EIO; + goto rel_fw; + } + + if (data->family_id == FT6X36_ID) { + fw_file_maj = FT_FW_FILE_MAJ_VER_FT6X36(fw); + fw_file_vendor_id = FT_FW_FILE_VENDOR_ID_FT6X36(fw); + } else { + fw_file_maj = FT_FW_FILE_MAJ_VER(fw); + fw_file_vendor_id = FT_FW_FILE_VENDOR_ID(fw); + } + fw_file_min = FT_FW_FILE_MIN_VER(fw); + fw_file_sub_min = FT_FW_FILE_SUB_MIN_VER(fw); + + dev_info(dev, "Current firmware: %d.%d.%d", data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); + dev_info(dev, "New firmware: %d.%d.%d", fw_file_maj, + fw_file_min, fw_file_sub_min); + + if (force) + fw_upgrade = true; + else if ((data->fw_ver[0] < fw_file_maj) && + data->fw_vendor_id == fw_file_vendor_id) + fw_upgrade = true; + + if (!fw_upgrade) { + dev_info(dev, "Exiting fw upgrade...\n"); + rc = -EFAULT; + goto rel_fw; + } + + /* start firmware upgrade */ + if (FT_FW_CHECK(fw, data)) { + rc = ft5x06_fw_upgrade_start(data->client, fw->data, fw->size); + if (rc < 0) + dev_err(dev, "update failed (%d). try later...\n", rc); + else if (data->pdata->info.auto_cal) + ft5x06_auto_cal(data->client); + } else { + dev_err(dev, "FW format error\n"); + rc = -EIO; + } + + ft5x06_update_fw_ver(data); + + FT_STORE_TS_INFO(data->ts_info, data->family_id, data->pdata->name, + data->pdata->num_max_touches, data->pdata->group_id, + data->pdata->fw_vkey_support ? "yes" : "no", + data->pdata->fw_name, data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); +rel_fw: + release_firmware(fw); + return rc; +} + + +static ssize_t ft5x06_update_fw_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + return snprintf(buf, 2, "%d\n", data->loading_fw); +} + +static ssize_t ft5x06_update_fw_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + unsigned long val; + int rc; + + if (size > 2) + return -EINVAL; + + rc = kstrtoul(buf, 10, &val); + if (rc != 0) + return rc; + + if (data->suspended) { + dev_info(dev, "In suspend state, try again later...\n"); + return size; + } + + mutex_lock(&data->input_dev->mutex); + if (!data->loading_fw && val) { + data->loading_fw = true; + ft5x06_fw_upgrade(dev, false); + data->loading_fw = false; + } + mutex_unlock(&data->input_dev->mutex); + + return size; +} + +static DEVICE_ATTR(update_fw, 0664, ft5x06_update_fw_show, + ft5x06_update_fw_store); + +static ssize_t ft5x06_force_update_fw_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t size) +{ + struct ft5x06_ts_data *data = dev_get_drvdata(dev); + unsigned long val; + int rc; + + if (size > 2) + return -EINVAL; + + rc = kstrtoul(buf, 10, &val); + if (rc != 0) + return rc; + + mutex_lock(&data->input_dev->mutex); + if (!data->loading_fw && val) { + data->loading_fw = true; + ft5x06_fw_upgrade(dev, true); + data->loading_fw = false; + } + mutex_unlock(&data->input_dev->mutex); + + return size; +} + +static DEVICE_ATTR(force_update_fw, 0664, ft5x06_update_fw_show, + ft5x06_force_update_fw_store); + + +#define FT_DEBUG_DIR_NAME "ts_debug" + +static bool ft5x06_debug_addr_is_valid(int addr) +{ + if (addr < 0 || addr > 0xFF) { + pr_err("FT reg address is invalid: 0x%x\n", addr); + return false; + } + + return true; +} + +static int ft5x06_debug_data_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) + dev_info(&data->client->dev, + "Writing into FT registers not supported\n"); + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +static int ft5x06_debug_data_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + int rc; + u8 reg; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) { + rc = ft5x0x_read_reg(data->client, data->addr, ®); + if (rc < 0) + dev_err(&data->client->dev, + "FT read register 0x%x failed (%d)\n", + data->addr, rc); + else + *val = reg; + } + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_data_fops, ft5x06_debug_data_get, + ft5x06_debug_data_set, "0x%02llX\n"); + +static int ft5x06_debug_addr_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + if (ft5x06_debug_addr_is_valid(val)) { + mutex_lock(&data->input_dev->mutex); + data->addr = val; + mutex_unlock(&data->input_dev->mutex); + } + + return 0; +} + +static int ft5x06_debug_addr_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (ft5x06_debug_addr_is_valid(data->addr)) + *val = data->addr; + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_addr_fops, ft5x06_debug_addr_get, + ft5x06_debug_addr_set, "0x%02llX\n"); + +static int ft5x06_debug_suspend_set(void *_data, u64 val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + + if (val) + ft5x06_ts_suspend(&data->client->dev); + else + ft5x06_ts_resume(&data->client->dev); + + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +static int ft5x06_debug_suspend_get(void *_data, u64 *val) +{ + struct ft5x06_ts_data *data = _data; + + mutex_lock(&data->input_dev->mutex); + *val = data->suspended; + mutex_unlock(&data->input_dev->mutex); + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(debug_suspend_fops, ft5x06_debug_suspend_get, + ft5x06_debug_suspend_set, "%lld\n"); + +static int ft5x06_debug_dump_info(struct seq_file *m, void *v) +{ + struct ft5x06_ts_data *data = m->private; + + seq_printf(m, "%s\n", data->ts_info); + + return 0; +} + +static int debugfs_dump_info_open(struct inode *inode, struct file *file) +{ + return single_open(file, ft5x06_debug_dump_info, inode->i_private); +} + +static const struct file_operations debug_dump_info_fops = { + .owner = THIS_MODULE, + .open = debugfs_dump_info_open, + .read = seq_read, + .release = single_release, +}; + +#endif + +static int ft5x0x_GetFirmwareSize(char *firmware_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[128]; + memset(filepath, 0, sizeof(filepath)); + + sprintf(filepath, "%s", firmware_name); + CTP_ERROR("filepath=%s\n", filepath); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + CTP_ERROR("error occured while opening file %s.\n", filepath); + return -EPERM; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +static int ft5x0x_ReadFirmware(char *firmware_name, unsigned char *firmware_buf) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s", firmware_name); + CTP_INFO("filepath=%s\n", filepath); + if (NULL == pfile) { + pfile = filp_open(filepath, O_RDONLY, 0); + } + if (IS_ERR(pfile)) { + CTP_ERROR("error occured while opening file %s.\n", filepath); + return -EPERM; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + + vfs_read(pfile, firmware_buf, fsize, &pos); + + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +static void delay_qt_ms(unsigned long w_ms) +{ + unsigned long i; + unsigned long j; + + for (i = 0; i < w_ms; i++) { + for (j = 0; j < 1000; j++) { + udelay(1); + } + } +} + +static int fts_ctpm_auto_clb(void) +{ + unsigned char uc_temp; + unsigned char i ; + + printk("[FTS] start auto CLB.\n"); + msleep(200); + ft5x0x_write_reg(update_client, 0, 0x40); + delay_qt_ms(100); + ft5x0x_write_reg(update_client, 2, 0x4); + delay_qt_ms(300); + for (i = 0; i < 100; i++) { + ft5x0x_read_reg(update_client, 0, &uc_temp); + if (((uc_temp&0x70)>>4) == 0x0) { + break; + } + delay_qt_ms(200); + printk("[FTS] waiting calibration %d\n", i); + } + + printk("[FTS] calibration OK.\n"); + + msleep(300); + ft5x0x_write_reg(update_client, 0, 0x40); + delay_qt_ms(100); + ft5x0x_write_reg(update_client, 2, 0x5); + delay_qt_ms(300); + ft5x0x_write_reg(update_client, 0, 0x0); + msleep(300); + printk("[FTS] store CLB result OK.\n"); + return 0; +} + + +static int fts_ctpm_fw_upgrade_with_app_file(char *firmware_name) +{ + unsigned char *pbt_buf = NULL; + int i_ret; + u8 fwver; + int fwsize = ft5x0x_GetFirmwareSize(firmware_name); + + CTP_DEBUG("enter fw_upgrade_with_app_file"); + if (fwsize <= 0) { + CTP_ERROR("%s ERROR:Get firmware size failed\n", __FUNCTION__); + return -EPERM; + } + + pbt_buf = (unsigned char *) kmalloc(fwsize+1, GFP_ATOMIC); + if (ft5x0x_ReadFirmware(firmware_name, pbt_buf)) { + CTP_ERROR("%s() - ERROR: request_firmware failed\n", __FUNCTION__); + kfree(pbt_buf); + return -EPERM; + } + + + + if ((pbt_buf[fwsize - 8] ^ pbt_buf[fwsize - 6]) != 0xFF + || (pbt_buf[fwsize - 7] ^ pbt_buf[fwsize - 5]) != 0xFF + || (pbt_buf[fwsize - 3] ^ pbt_buf[fwsize - 4]) != 0xFF) { + CTP_ERROR("the update file is not correct, please check\n"); + CTP_ERROR("checksum is %2x, %2x, %2x, %2x, %2x, %2x", pbt_buf[fwsize - 8], pbt_buf[fwsize - 6], pbt_buf[fwsize - 7], pbt_buf[fwsize - 5], pbt_buf[fwsize - 3], pbt_buf[fwsize - 4]); + return -EPERM; + } + /*call the upgrade function*/ + i_ret = ft5x06_fw_upgrade_start(update_client, pbt_buf, fwsize); + if (i_ret != 0) { + CTP_ERROR("%s() - ERROR:[FTS] upgrade failed i_ret = %d.\n", __FUNCTION__, i_ret); + + + } else { + CTP_INFO("[FTS] upgrade successfully.\n"); + if (ft5x0x_read_reg(update_client, FT5x0x_REG_FW_VER, &fwver) >= 0) + CTP_INFO("the new fw ver is 0x%02x\n", fwver); + + } + kfree(pbt_buf); + return i_ret; +} + +#if CTP_SYS_APK_UPDATE + +static ssize_t ft5x0x_fwupgradeapp_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + /* place holder for future use */ + return -EPERM; +} +#endif + +#if CTP_SYS_APK_UPDATE + +static ssize_t ft5x0x_fwupgradeapp_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + + + struct i2c_client *client = container_of(dev, struct i2c_client, dev); + + char fwname[128]; + memset(fwname, 0, sizeof(fwname)); + sprintf(fwname, "%s", buf); + fwname[count-1] = '\0'; + + disable_irq(client->irq); + + fts_ctpm_fw_upgrade_with_app_file(fwname); + + enable_irq(client->irq); + + return count; +} + +#endif + +#if CTP_SYS_APK_UPDATE + +static DEVICE_ATTR(ftsfwupgradeapp, S_IRUGO|S_IWUSR, ft5x0x_fwupgradeapp_show, ft5x0x_fwupgradeapp_store); +#endif + +#if CTP_PROC_INTERFACE + +#define FT5X0X_INI_FILEPATH "/system/etc/" + +static int ft5x0x_GetInISize(char *config_name) +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize = 0; + char filepath[128]; + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FT5X0X_INI_FILEPATH, config_name); + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pr_err("error occured while opening file %s.\n", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + filp_close(pfile, NULL); + return fsize; +} + +static int ft5x0x_ReadInIData(char *config_name, char *config_buf) + +{ + struct file *pfile = NULL; + struct inode *inode; + unsigned long magic; + off_t fsize; + char filepath[128]; + loff_t pos; + mm_segment_t old_fs; + memset(filepath, 0, sizeof(filepath)); + sprintf(filepath, "%s%s", FT5X0X_INI_FILEPATH, config_name); + if (NULL == pfile) + pfile = filp_open(filepath, O_RDONLY, 0); + if (IS_ERR(pfile)) { + pr_err("error occured while opening file %s.\n", filepath); + return -EIO; + } + inode = pfile->f_dentry->d_inode; + magic = inode->i_sb->s_magic; + fsize = inode->i_size; + old_fs = get_fs(); + set_fs(KERNEL_DS); + pos = 0; + vfs_read(pfile, config_buf, fsize, &pos); + filp_close(pfile, NULL); + set_fs(old_fs); + return 0; +} + +static int ft5x0x_get_testparam_from_ini(char *config_name) + +{ + char *filedata = NULL; + int inisize = ft5x0x_GetInISize(config_name); + CTP_INFO("inisize = %d \n ", inisize); + if (inisize <= 0) { + pr_err("%s ERROR:Get firmware size failed\n", __func__); + return -EIO; + } + filedata = kmalloc(inisize + 1, GFP_ATOMIC); + if (ft5x0x_ReadInIData(config_name, filedata)) { + pr_err("%s() - ERROR: request_firmware failed\n", __func__); + kfree(filedata); + return -EIO; + } else { + CTP_INFO("ft5x0x_ReadInIData successful\n"); + } + SetParamData(filedata); + return 0; +} + +#if CTP_SYS_APK_UPDATE +static ssize_t ft5x0x_ftsmcaptest_show(struct device *dev, struct device_attribute *attr, char *buf) + +{ + /* place holder for future use */ + return -EPERM; +} + +static ssize_t ft5x0x_ftsmcaptest_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) + +{ + char cfgname[128]; + memset(cfgname, 0, sizeof(cfgname)); + sprintf(cfgname, "%s", buf); + cfgname[count-1] = '\0'; + Init_I2C_Write_Func(focal_i2c_Write); + Init_I2C_Read_Func(focal_i2c_Read); + if (ft5x0x_get_testparam_from_ini(cfgname) < 0) + CTP_ERROR("get testparam from ini failure\n"); + else { + if (true == StartTestTP()) + CTP_INFO("tp test pass\n"); + else + CTP_INFO("tp test failure\n"); + FreeTestParamData(); + } + return count; +} + +static DEVICE_ATTR(ftsmcaptest, S_IRUGO|S_IWUSR, ft5x0x_ftsmcaptest_show, ft5x0x_ftsmcaptest_store); +#endif + +#endif + +#ifdef CONFIG_OF +static int ft5x06_get_dt_coords(struct device *dev, char *name, + struct ft5x06_ts_platform_data *pdata) +{ + u32 coords[FT_COORDS_ARR_SIZE]; + struct property *prop; + struct device_node *np = dev->of_node; + int coords_size, rc; + + prop = of_find_property(np, name, NULL); + if (!prop) + return -EINVAL; + if (!prop->value) + return -ENODATA; + + coords_size = prop->length / sizeof(u32); + if (coords_size != FT_COORDS_ARR_SIZE) { + dev_err(dev, "invalid %s\n", name); + return -EINVAL; + } + + rc = of_property_read_u32_array(np, name, coords, coords_size); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read %s\n", name); + return rc; + } + + if (!strcmp(name, "ftech,panel-coords")) { + pdata->panel_minx = coords[0]; + pdata->panel_miny = coords[1]; + pdata->panel_maxx = coords[2]; + pdata->panel_maxy = coords[3]; + } else if (!strcmp(name, "ftech,display-coords")) { + pdata->x_min = coords[0]; + pdata->y_min = coords[1]; + pdata->x_max = coords[2]; + pdata->y_max = coords[3]; + } else { + dev_err(dev, "unsupported property %s\n", name); + return -EINVAL; + } + + return 0; +} + +static int ft5x06_parse_dt(struct device *dev, + struct ft5x06_ts_platform_data *pdata) +{ + int rc; + struct device_node *np = dev->of_node; + struct property *prop; + u32 temp_val, num_buttons; + u32 button_map[MAX_BUTTONS]; + + pdata->name = "ftech"; + rc = of_property_read_string(np, "ftech,name", &pdata->name); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read name\n"); + return rc; + } + + rc = ft5x06_get_dt_coords(dev, "ftech,panel-coords", pdata); + if (rc && (rc != -EINVAL)) + return rc; + + rc = ft5x06_get_dt_coords(dev, "ftech,display-coords", pdata); + if (rc) + return rc; + + + pdata->i2c_pull_up = of_property_read_bool(np, + "ftech,i2c-pull-up"); + + pdata->no_force_update = of_property_read_bool(np, + "ftech,no-force-update"); + /* reset, irq gpio info */ + pdata->reset_gpio = of_get_named_gpio_flags(np, "ftech,reset-gpio", + 0, &pdata->reset_gpio_flags); + if (pdata->reset_gpio < 0) + return pdata->reset_gpio; + + pdata->irq_gpio = of_get_named_gpio_flags(np, "ftech,irq-gpio", + 0, &pdata->irq_gpio_flags); + if (pdata->irq_gpio < 0) + return pdata->irq_gpio; + + pdata->fw_name = "ft_fw.bin"; + rc = of_property_read_string(np, "ftech,fw-name", &pdata->fw_name); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw name\n"); + return rc; + } + + rc = of_property_read_u32(np, "ftech,group-id", &temp_val); + if (!rc) + pdata->group_id = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,hard-reset-delay-ms", + &temp_val); + if (!rc) + pdata->hard_rst_dly = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,soft-reset-delay-ms", + &temp_val); + if (!rc) + pdata->soft_rst_dly = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,num-max-touches", &temp_val); + if (!rc) + pdata->num_max_touches = temp_val; + else + return rc; + + rc = of_property_read_u32(np, "ftech,fw-delay-aa-ms", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay aa\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_aa = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-55-ms", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay 55\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_55 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-upgrade-id1", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw upgrade id1\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.upgrade_id_1 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-upgrade-id2", &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw upgrade id2\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.upgrade_id_2 = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-readid-ms", + &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay read id\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_readid = temp_val; + + rc = of_property_read_u32(np, "ftech,fw-delay-era-flsh-ms", + &temp_val); + if (rc && (rc != -EINVAL)) { + dev_err(dev, "Unable to read fw delay erase flash\n"); + return rc; + } else if (rc != -EINVAL) + pdata->info.delay_erase_flash = temp_val; + + pdata->info.auto_cal = of_property_read_bool(np, + "ftech,fw-auto-cal"); + + pdata->fw_vkey_support = of_property_read_bool(np, + "ftech,fw-vkey-support"); + + pdata->ignore_id_check = of_property_read_bool(np, + "ftech,ignore-id-check"); + + rc = of_property_read_u32(np, "ftech,family-id", &temp_val); + if (!rc) + pdata->family_id = temp_val; + else + return rc; + + prop = of_find_property(np, "ftech,button-map", NULL); + if (prop) { + num_buttons = prop->length / sizeof(temp_val); + if (num_buttons > MAX_BUTTONS) + return -EINVAL; + + rc = of_property_read_u32_array(np, + "ftech,button-map", button_map, + num_buttons); + if (rc) { + dev_err(dev, "Unable to read key codes\n"); + return rc; + } + } + + return 0; +} +#else +static int ft5x06_parse_dt(struct device *dev, + struct ft5x06_ts_platform_data *pdata) +{ + return -ENODEV; +} +#endif + +#if CTP_PROC_INTERFACE +static ssize_t ctp_lockdown_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + + if (*ppos) { + CTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + return sprintf(ptr, "%02X%02X%02X%02X%02X%02X%02X%02X\n", + lockdown_info[0], lockdown_info[1], lockdown_info[2], lockdown_info[3], + lockdown_info[4], lockdown_info[5], lockdown_info[6], lockdown_info[7]); + +} + +static ssize_t ctp_lockdown_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static ssize_t ctp_color_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + + if (*ppos) { + CTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + return sprintf(ptr, "%02X\n", lockdown_info[2]); + +} + +static ssize_t ctp_color_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static ssize_t ctp_open_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + char *ptr = buf; + char cfgname[128]; + u8 fw_info[6] = {0x00}; + u8 reg_addr = 0xA3; + u8 result = 0; + + if (*ppos) { + CTP_INFO("tp test again return\n"); + return 0; + } + *ppos += count; + + ft5x06_i2c_read(update_client, ®_addr, 1, fw_info, 6); + CTP_INFO("ic is %x", fw_info[5]); + + if (fw_info[5] == VENDOR_BIEL_1080P) { + sprintf(cfgname, "%s", "ft5336_biel_1080p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else if (fw_info[5] == VENDOR_BIEL_720P) { + sprintf(cfgname, "%s", "ft5336_biel_720p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else if (fw_info[5] == VENDOR_TPK_1080P) { + sprintf(cfgname, "%s", "ft5336_tpk_1080p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else if (fw_info[5] == VENDOR_TPK_720P) { + sprintf(cfgname, "%s", "ft5336_tpk_720p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else if (fw_info[5] == VENDOR_O_FILM) { + sprintf(cfgname, "%s", "ft5336_oufei_720p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else if (fw_info[5] == VENDOR_LENS_720P) { + sprintf(cfgname, "%s", "ft5336_lens_720p.ini"); + CTP_INFO(" *** cfgname is: %s *** \n", cfgname); + } else { + CTP_INFO("no ini match the project ctp,please check!"); + return count; + } + + Init_I2C_Write_Func(focal_i2c_Write); + Init_I2C_Read_Func(focal_i2c_Read); + if (ft5x0x_get_testparam_from_ini(cfgname) < 0) { + CTP_ERROR("get testparam from ini failure\n"); + sprintf(ptr, "result=%d\n", 0); + } else { + if (true == StartTestTP()) { + CTP_INFO("tp test pass\n"); + result = 1; + + } else { + CTP_INFO("tp test failure\n"); + result = 0; + + } + FreeTestParamData(); + } + return sprintf(ptr, "result=%d\n", result); +} +static ssize_t ctp_open_proc_write(struct file *filp, const char __user *userbuf, size_t count, loff_t *ppos) +{ + return -EPERM; +} + +static void create_ctp_proc(void) +{ + + + + + + struct proc_dir_entry *ctp_device_proc = NULL; + struct proc_dir_entry *ctp_open_proc = NULL; + struct proc_dir_entry *ctp_lockdown_proc = NULL; + struct proc_dir_entry *ctp_color_proc = NULL; + + ctp_device_proc = proc_mkdir(CTP_PARENT_PROC_NAME, NULL); + if (ctp_device_proc == NULL) { + CTP_ERROR("ft5x06: create parent_proc fail\n"); + return; + } + + ctp_open_proc = proc_create(CTP_OPEN_PROC_NAME, 0777, ctp_device_proc, &ctp_open_procs_fops); + if (ctp_open_proc == NULL) { + CTP_ERROR("ft5x06: create open_proc fail\n"); + } + + ctp_lockdown_proc = proc_create(CTP_LOCKDOWN_INFOR_NAME, 0666, ctp_device_proc, &ctp_lockdown_procs_fops); + if (ctp_lockdown_proc == NULL) { + CTP_ERROR("ft5x06: create ctp_lockdown_proc fail\n"); + } + + + ctp_color_proc = proc_create(CTP_COLOR_INFOR_NAME, 0666, ctp_device_proc, &ctp_color_procs_fops); + if (ctp_color_proc == NULL) { + CTP_ERROR("ft5x06: create ctp_color_proc fail\n"); + } + +} +#endif + +#if WT_ADD_CTP_INFO +static int hardwareinfo_set(struct ft5x06_ts_data *data, u8 value_name, u8 color) +{ + char firmware_ver[HARDWARE_MAX_ITEM_LONGTH]; + char vendor_for_id[HARDWARE_MAX_ITEM_LONGTH]; + char ic_name[HARDWARE_MAX_ITEM_LONGTH]; + char ic_color[HARDWARE_MAX_ITEM_LONGTH]; + int err; + + u8 uc_tp_fm_ver, reg_addr; + if (lockdown_info[0] == TP_Biel) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "BIEL_HD"); + else if (lockdown_info[0] == TP_OUFEI) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "OUFEI_HD"); + else if (lockdown_info[0] == TP_LENS) + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "LENS_HD"); + else + snprintf(vendor_for_id, HARDWARE_MAX_ITEM_LONGTH, "Other vendor"); + + switch (value_name) { + case IC_FT5X06: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5X06"); + break; + case IC_FT5606: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5606"); + break; + case IC_FT5X16: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5X16"); + break; + case IC_FT6208: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6208"); + break; + case IC_FT6X06: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6X06"); + break; + case IC_FT6X36: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT6X36"); + break; + case IC_FT5336: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5336"); + break; + case IC_FT3316: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT3316"); + break; + case IC_FT5436i: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5436i"); + break; + case IC_FT5336i: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "FT5336i"); + break; + default: + snprintf(ic_name, HARDWARE_MAX_ITEM_LONGTH, "Other IC"); + } + + switch (color) { + case TP_White: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "White"); + break; + case TP_Black: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "Black"); + break; + case TP_Golden: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "Golden"); + break; + default: + snprintf(ic_color, HARDWARE_MAX_ITEM_LONGTH, "other Color"); + } + + + if (nomal_boot) { + reg_addr = 0xA6; + ft5x06_i2c_read(data->client, ®_addr, 1, &uc_tp_fm_ver, 1); + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x, %s", vendor_for_id, ic_name, uc_tp_fm_ver, ic_color); + } else + snprintf(firmware_ver, HARDWARE_MAX_ITEM_LONGTH, "%s, %s, FW:0x%x, %s", vendor_for_id, ic_name, data->fw_ver[0], ic_color); + + err = hardwareinfo_set_prop(HARDWARE_TP, firmware_ver); + if (err < 0) + return -EPERM; + + return 0; +} +#endif +#if FTS_PROC_APK_DEBUG +static int ft5x0x_i2c_Read(struct i2c_client *client, char *writebuf, + int writelen, char *readbuf, int readlen) +{ + int ret; + + if (writelen > 0) { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 2); + if (ret < 0) + dev_err(&client->dev, "f%s: i2c read error.\n", + __func__); + } else { + struct i2c_msg msgs[] = { + { + .addr = client->addr, + .flags = I2C_M_RD, + .len = readlen, + .buf = readbuf, + }, + }; + ret = i2c_transfer(client->adapter, msgs, 1); + if (ret < 0) + dev_err(&client->dev, "%s:i2c read error.\n", __func__); + } + return ret; +} +/*write data by i2c*/ +static int ft5x0x_i2c_Write(struct i2c_client *client, char *writebuf, int writelen) +{ + int ret; + + struct i2c_msg msg[] = { + { + .addr = client->addr, + .flags = 0, + .len = writelen, + .buf = writebuf, + }, + }; + + ret = i2c_transfer(client->adapter, msg, 1); + if (ret < 0) + dev_err(&client->dev, "%s i2c write error.\n", __func__); + + return ret; +} + +static ssize_t ft5x0x_debug_write(struct file *filp, const char __user *buff, size_t len, loff_t *ppos) +{ + struct i2c_client *client = update_client; + unsigned char writebuf[FTS_PACKET_LENGTH]; + int buflen = len; + int writelen = 0; + int ret = 0; + + if (*ppos) + return -EPERM; + + if (copy_from_user(&writebuf, buff, buflen)) { + dev_err(&client->dev, "%s:copy from user error\n", __func__); + return -EFAULT; + } + proc_operate_mode = writebuf[0]; + CTP_INFO("write mode %x", proc_operate_mode); + switch (proc_operate_mode) { + case PROC_UPGRADE: + { + char upgrade_file_path[128]; + memset(upgrade_file_path, 0, sizeof(upgrade_file_path)); + sprintf(upgrade_file_path, "%s", writebuf + 1); + upgrade_file_path[buflen-1] = '\0'; + + disable_irq(client->irq); + + ret = fts_ctpm_fw_upgrade_with_app_file(upgrade_file_path); + + enable_irq(client->irq); + if (ret < 0) { + dev_err(&client->dev, "%s:upgrade failed.\n", __func__); + return ret; + } + } + break; + case PROC_READ_REGISTER: + writelen = 1; + ret = ft5x0x_i2c_Write(client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&client->dev, "%s:write iic error\n", __func__); + return ret; + } + break; + case PROC_WRITE_REGISTER: + writelen = 2; + ret = ft5x0x_i2c_Write(client, writebuf + 1, writelen); + if (ret < 0) { + dev_err(&client->dev, "%s:write iic error\n", __func__); + return ret; + } + break; + case PROC_RAWDATA: + break; + case PROC_AUTOCLB: + fts_ctpm_auto_clb(); + break; + default: + break; + } + + *ppos += len; + return len; +} + +static unsigned char debug_read_buf[PAGE_SIZE]; + +/*interface of read proc*/ +static ssize_t ft5x0x_debug_read(struct file *file, char __user *user_buf, size_t count, loff_t *ppos) +{ + struct i2c_client *client = update_client; + int ret = 0; + int num_read_chars = 0; + int readlen = 0; + u8 regvalue = 0x00, regaddr = 0x00; + + if (*ppos) + return -EPERM; + + switch (proc_operate_mode) { + case PROC_UPGRADE: + /*after calling ft5x0x_debug_write to upgrade*/ + regaddr = 0xA6; + ret = ft5x0x_read_reg(client, regaddr, ®value); + if (ret < 0) + num_read_chars = sprintf(debug_read_buf, "%s", "get fw version failed.\n"); + else + num_read_chars = sprintf(debug_read_buf, "current fw version:0x%02x\n", regvalue); + break; + case PROC_READ_REGISTER: + readlen = 1; + ret = ft5x0x_i2c_Read(client, NULL, 0, debug_read_buf, readlen); + if (ret < 0) { + dev_err(&client->dev, "%s:read iic error\n", __func__); + return ret; + } else + + num_read_chars = 1; + break; + case PROC_RAWDATA: + break; + default: + break; + } + + memcpy(user_buf, debug_read_buf, num_read_chars); + *ppos += num_read_chars; + return num_read_chars; +} + +static const struct file_operations ctp_apk_proc_fops = { + .write = ft5x0x_debug_write, + .read = ft5x0x_debug_read, + .open = simple_open, + .owner = THIS_MODULE, +}; + +static int ft5x0x_create_apk_debug_channel(struct i2c_client *client) +{ + ft5x0x_proc_entry = proc_create(PROC_NAME, 0666, NULL, &ctp_apk_proc_fops); + if (NULL == ft5x0x_proc_entry) { + dev_err(&client->dev, "Couldn't create proc entry!\n"); + return -ENOMEM; + } + return 0; +} + +static void ft5x0x_release_apk_debug_channel(void) +{ + if (ft5x0x_proc_entry) + remove_proc_entry(PROC_NAME, NULL); +} + +#endif + + +int get_boot_mode(struct i2c_client *client) +{ + int ret; + char *cmdline_tp = NULL; + char *temp; + char cmd_line[15] = {'\0'}; + + cmdline_tp = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_tp != NULL) { + temp = cmdline_tp + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + memcpy(cmd_line, temp, 10); + dev_err(&client->dev, "cmd_line =%s \n", cmd_line); + if (ret == 0) { + dev_err(&client->dev, "mode: ffbm\n"); + return 1;/* factory mode*/ + } + else { + dev_err(&client->dev, "mode: no ffbm\n"); + return 2;/* no factory mode*/ + } + } + + nomal_boot = 1; + dev_err(&client->dev, "has no androidboot.mode \n"); + return 0; +} + +static int ft5x06_ts_probe(struct i2c_client *client, + const struct i2c_device_id *id) { + struct ft5x06_ts_platform_data *pdata; + struct ft5x06_ts_data *data; + struct input_dev *input_dev; + struct dentry *temp; + u8 reg_value; + u8 reg_addr; + int err; + int len; + u8 ic_name; +#if TPD_AUTO_UPGRADE + int ret_auto_upgrade = 0; + int i; +#endif + + temp = NULL; + update_client = client; +#if CTP_PROC_INTERFACE + g_focalclient = client; + sema_init(&g_device_mutex, 1); +#endif + + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, + sizeof(struct ft5x06_ts_platform_data), GFP_KERNEL); + if (!pdata) { + dev_err(&client->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + err = ft5x06_parse_dt(&client->dev, pdata); + if (err) { + dev_err(&client->dev, "DT parsing failed\n"); + return err; + } + } else + pdata = client->dev.platform_data; + + if (!pdata) { + dev_err(&client->dev, "Invalid pdata\n"); + return -EINVAL; + } + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "I2C not supported\n"); + return -ENODEV; + } + + data = devm_kzalloc(&client->dev, + sizeof(struct ft5x06_ts_data), GFP_KERNEL); + if (!data) { + dev_err(&client->dev, "Not enough memory\n"); + return -ENOMEM; + } + + if (pdata->fw_name) { + len = strlen(pdata->fw_name); + if (len > FT_FW_NAME_MAX_LEN - 1) { + dev_err(&client->dev, "Invalid firmware name\n"); + return -EINVAL; + } + + strlcpy(data->fw_name, pdata->fw_name, len + 1); + } + + data->tch_data_len = FT_TCH_LEN(pdata->num_max_touches); + data->tch_data = devm_kzalloc(&client->dev, + data->tch_data_len, GFP_KERNEL); + if (!data) { + return -ENOMEM; + } + + input_dev = input_allocate_device(); + if (!input_dev) { + return -ENOMEM; + } + + data->input_dev = input_dev; + data->client = client; + data->pdata = pdata; + + input_dev->name = "ft5x06_720p"; + input_dev->id.bustype = BUS_I2C; + input_dev->dev.parent = &client->dev; + + input_set_drvdata(input_dev, data); + i2c_set_clientdata(client, data); + + __set_bit(EV_KEY, input_dev->evbit); + __set_bit(EV_ABS, input_dev->evbit); + __set_bit(BTN_TOUCH, input_dev->keybit); + __set_bit(INPUT_PROP_DIRECT, input_dev->propbit); + + input_mt_init_slots(input_dev, pdata->num_max_touches, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_X, pdata->x_min, + pdata->x_max, 0, 0); + input_set_abs_params(input_dev, ABS_MT_POSITION_Y, pdata->y_min, + pdata->y_max, 0, 0); + + err = input_register_device(input_dev); + if (err) { + dev_err(&client->dev, "Input device registration failed\n"); + goto free_inputdev; + } + + if (pdata->power_init) { + err = pdata->power_init(true); + if (err) { + dev_err(&client->dev, "power init failed"); + goto unreg_inputdev; + } + } else { + err = ft5x06_power_init(data, true); + if (err) { + dev_err(&client->dev, "power init failed"); + goto unreg_inputdev; + } + } + + if (pdata->power_on) { + err = pdata->power_on(true); + if (err) { + dev_err(&client->dev, "power on failed"); + goto pwr_deinit; + } + } else { + err = ft5x06_power_on(data, true); + if (err) { + dev_err(&client->dev, "power on failed"); + goto pwr_deinit; + } + } + if (gpio_is_valid(pdata->irq_gpio)) { + err = gpio_request(pdata->irq_gpio, "ft5x06_irq_gpio"); + if (err) { + dev_err(&client->dev, "irq gpio request failed"); + goto pwr_off; + } + err = gpio_direction_input(pdata->irq_gpio); + if (err) { + dev_err(&client->dev, + "set_direction for irq gpio failed\n"); + goto free_irq_gpio; + } + } + + if (gpio_is_valid(pdata->reset_gpio)) { + err = gpio_request(pdata->reset_gpio, "ft5x06_reset_gpio"); + if (err) { + goto free_irq_gpio; + } + + err = gpio_direction_output(pdata->reset_gpio, 0); + if (err) { + dev_err(&client->dev, + "set_direction for reset gpio failed\n"); + goto free_reset_gpio; + } + msleep(data->pdata->hard_rst_dly); + gpio_set_value_cansleep(data->pdata->reset_gpio, 1); + } + + /* make sure CTP already finish startup process */ + msleep(data->pdata->soft_rst_dly); + + /* check the controller id */ + reg_addr = FT_REG_ID; + err = ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) { + dev_err(&client->dev, "version read failed"); + + client->addr = 0x3E; + err = ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) { + dev_err(&client->dev, "version read failed addr -----3E"); + goto free_reset_gpio; + + } + } + ic_name = reg_value; + + dev_info(&client->dev, "Device ID = 0x%x\n", reg_value); + + if ((pdata->family_id != reg_value) && (!pdata->ignore_id_check)) { + dev_err(&client->dev, "%s:Unsupported controller\n", __func__); + goto free_reset_gpio; + } + + data->family_id = pdata->family_id; + + err = request_threaded_irq(client->irq, NULL, + ft5x06_ts_interrupt, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + client->dev.driver->name, data); + if (err) { + dev_err(&client->dev, "request irq failed\n"); + goto free_reset_gpio; + } + + disable_irq(data->client->irq); + +#if CTP_SYS_APK_UPDATE + err = device_create_file(&client->dev, &dev_attr_fw_name); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_ftsfwupgradeapp); + if (err) { + dev_err(&client->dev, "upgradeapp sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_ftsmcaptest); + if (err) { + dev_err(&client->dev, "ftsmcaptest sys file creation failed\n"); + } + err = device_create_file(&client->dev, &dev_attr_update_fw); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + err = device_create_file(&client->dev, &dev_attr_force_update_fw); + if (err) { + dev_err(&client->dev, "sys file creation failed\n"); + } + + data->dir = debugfs_create_dir(FT_DEBUG_DIR_NAME, NULL); + if (data->dir == NULL || IS_ERR(data->dir)) { + pr_err("debugfs_create_dir failed(%ld)\n", PTR_ERR(data->dir)); + err = PTR_ERR(data->dir); + } else { + temp = debugfs_create_file("addr", S_IRUSR | S_IWUSR, data->dir, data, + &debug_addr_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("data", S_IRUSR | S_IWUSR, data->dir, data, + &debug_data_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("suspend", S_IRUSR | S_IWUSR, data->dir, + data, &debug_suspend_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + + temp = debugfs_create_file("dump_info", S_IRUSR | S_IWUSR, data->dir, + data, &debug_dump_info_fops); + if (temp == NULL || IS_ERR(temp)) { + pr_err("debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); + err = PTR_ERR(temp); + } + } +#endif + + data->ts_info = devm_kzalloc(&client->dev, + FT_INFO_MAX_LEN, GFP_KERNEL); + if (!data->ts_info) { + dev_err(&client->dev, "Not enough memory\n"); + goto free_irq_gpio; + } + + /*get some register information */ + reg_addr = FT_REG_POINT_RATE; + ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + dev_err(&client->dev, "report rate read failed"); + + dev_info(&client->dev, "report rate = %dHz\n", reg_value * 10); + + reg_addr = FT_REG_THGROUP; + err = ft5x06_i2c_read(client, ®_addr, 1, ®_value, 1); + if (err < 0) + dev_err(&client->dev, "threshold read failed"); + + dev_dbg(&client->dev, "touch threshold = %d\n", reg_value * 4); + + ft5x06_update_fw_ver(data); + ft5x06_update_fw_vendor_id(data); + + FT_STORE_TS_INFO(data->ts_info, data->family_id, data->pdata->name, + data->pdata->num_max_touches, data->pdata->group_id, + data->pdata->fw_vkey_support ? "yes" : "no", + data->pdata->fw_name, data->fw_ver[0], + data->fw_ver[1], data->fw_ver[2]); + +#if CTP_LOCKDOWN_INFO + fts_ctpm_read_lockdown(client, data); +#endif + +#if defined(CONFIG_FB) + INIT_WORK(&data->fb_notify_work, fb_notify_resume_work); + data->fb_notif.notifier_call = fb_notifier_callback; + + err = fb_register_client(&data->fb_notif); + + if (err) + dev_err(&client->dev, "Unable to register fb_notifier: %d\n", + err); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + data->early_suspend.level = EARLY_SUSPEND_LEVEL_BLANK_SCREEN + + FT_SUSPEND_LEVEL; + data->early_suspend.suspend = ft5x06_ts_early_suspend; + data->early_suspend.resume = ft5x06_ts_late_resume; + register_early_suspend(&data->early_suspend); +#endif + +#if CTP_PROC_INTERFACE + create_ctp_proc(); +#endif + +#if FTS_PROC_APK_DEBUG + ft5x0x_create_apk_debug_channel(update_client); +#endif + + +#if TPD_AUTO_UPGRADE + + err = get_boot_mode(client); + if (err == 0) { + dev_err(&client->dev, "upgrade\n"); + CTP_DEBUG("********************Enter CTP Auto Upgrade********************\n"); + msleep(50); + i = 0; + do { + ret_auto_upgrade = fts_ctpm_fw_upgrade_with_i_file(data); + i++; + if (ret_auto_upgrade < 0) { + CTP_DEBUG(" ctp upgrade fail err = %d \n", ret_auto_upgrade); + } + } while ((ret_auto_upgrade < 0) && (i < 3)); + } else { + dev_err(&client->dev, "no upgrade\n"); + } +#endif + +#if WT_ADD_CTP_INFO + err = hardwareinfo_set(data, ic_name, lockdown_info[2]); + if (err < 0) + dev_err(&client->dev, "hardwareinfo set failed"); +#endif + +#if CTP_CHARGER_DETECT + batt_psy = power_supply_get_by_name("usb"); + if (!batt_psy) + CTP_DEBUG("tp battery supply not found\n"); +#endif + + enable_irq(data->client->irq); + + return 0; + + +free_reset_gpio: + if (gpio_is_valid(pdata->reset_gpio)) + gpio_free(pdata->reset_gpio); + if (data->ts_pinctrl) { + err = ft5x06_ts_pinctrl_select(data, false); + if (err < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } +free_irq_gpio: + if (gpio_is_valid(pdata->irq_gpio)) + gpio_free(pdata->irq_gpio); + if (data->ts_pinctrl) { + err = ft5x06_ts_pinctrl_select(data, false); + if (err < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } +pwr_off: +pwr_deinit: +unreg_inputdev: + input_unregister_device(input_dev); + input_dev = NULL; +free_inputdev: + input_free_device(input_dev); + return err; +} + +static int ft5x06_ts_remove(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + int retval; + +#if CTP_SYS_APK_UPDATE + device_remove_file(&client->dev, &dev_attr_fw_name); +#endif + +#if FTS_PROC_APK_DEBUG + ft5x0x_release_apk_debug_channel(); +#endif + + +#if defined(CONFIG_FB) + if (fb_unregister_client(&data->fb_notif)) + dev_err(&client->dev, "Error occurred while unregistering fb_notifier.\n"); +#elif defined(CONFIG_HAS_EARLYSUSPEND) + unregister_early_suspend(&data->early_suspend); +#endif + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) + gpio_free(data->pdata->reset_gpio); + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + if (data->ts_pinctrl) { + retval = ft5x06_ts_pinctrl_select(data, false); + if (retval < 0) + CTP_ERROR("Cannot get idle pinctrl state\n"); + } + input_unregister_device(data->input_dev); + + return 0; +} + + +void ft5x06_ts_shutdown(struct i2c_client *client) +{ + struct ft5x06_ts_data *data = i2c_get_clientdata(client); + int retval; + + free_irq(client->irq, data); + + if (gpio_is_valid(data->pdata->reset_gpio)) { + retval = gpio_direction_output(data->pdata->reset_gpio, 0); + if (retval) { + dev_err(&data->client->dev, + "set_direction for reset gpio failed\n"); + } + gpio_free(data->pdata->reset_gpio); + } + + if (gpio_is_valid(data->pdata->irq_gpio)) + gpio_free(data->pdata->irq_gpio); + + if (data->pdata->power_init) + data->pdata->power_init(false); + else + ft5x06_power_init(data, false); +} + + +static const struct i2c_device_id ft5x06_ts_id[] = { + {"ft5x06_720p", 0}, + {}, +}; + +MODULE_DEVICE_TABLE(i2c, ft5x06_ts_id); + +#ifdef CONFIG_OF +static struct of_device_id ft5x06_match_table[] = { + { .compatible = "focaltech,5336",}, + { }, +}; +#else +#define ft5x06_match_table NULL +#endif + +static struct i2c_driver ft5x06_ts_driver = { + .probe = ft5x06_ts_probe, + .remove = ft5x06_ts_remove, + .shutdown = ft5x06_ts_shutdown, + .driver = { + .name = "ft5x06_720p", + .owner = THIS_MODULE, + .of_match_table = ft5x06_match_table, +#ifdef CONFIG_PM + .pm = &ft5x06_ts_pm_ops, +#endif + }, + .id_table = ft5x06_ts_id, +}; + +static int __init ft5x06_ts_init(void) +{ + return i2c_add_driver(&ft5x06_ts_driver); +} +module_init(ft5x06_ts_init); + +static void __exit ft5x06_ts_exit(void) +{ + i2c_del_driver(&ft5x06_ts_driver); +} +module_exit(ft5x06_ts_exit); + +MODULE_DESCRIPTION("FocalTech ft5x06 TouchScreen driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/ft5336/ft5x06_test_lib.h b/drivers/input/touchscreen/ft5336/ft5x06_test_lib.h new file mode 100755 index 0000000000000..77311c36e9173 --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft5x06_test_lib.h @@ -0,0 +1,24 @@ +#ifndef _FOCAL_MCAPTESTLIB_H +#define _FOCAL_MCAPTESTLIB_H + +#define TX_NUM_MAX 30 +#define RX_NUM_MAX 30 + + +#define boolean unsigned char +#define false 0 +#define true 1 + +typedef int (*FTS_I2c_Read_Function)(unsigned char * , int , unsigned char *, int); +typedef int (*FTS_I2c_Write_Function)(unsigned char * , int); + +int Init_I2C_Read_Func(FTS_I2c_Read_Function fpI2C_Read); +int Init_I2C_Write_Func(FTS_I2c_Write_Function fpI2C_Write); + + +int SetParamData(char *TestParamData); +int focal_save_error_data(char *databuf, int databuflen); +void FreeTestParamData(void); +boolean StartTestTP(void); + +#endif diff --git a/drivers/input/touchscreen/ft5336/ft_app_ic_biel_boe_720p.txt b/drivers/input/touchscreen/ft5336/ft_app_ic_biel_boe_720p.txt new file mode 100644 index 0000000000000..9668f76f858c2 --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft_app_ic_biel_boe_720p.txt @@ -0,0 +1,1807 @@ +0x2, 0x50,0xf0,0x2, 0x68,0x7c,0xe5,0x74,0x60,0x9, 0x74,0x1, 0x12,0x6e,0xa0,0x75, +0x74,0x0, 0x22,0xe4,0x12,0x6e,0xa0,0x75,0x74,0x1, 0x22,0x2, 0x50,0x5a,0xe5,0x55, +0xbe,0xb0,0x1, 0x68,0xf9,0x12,0x6e,0x86,0x60,0xfb,0x22,0x2, 0x67,0x13,0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x10,0x7e,0x34,0x10,0x2b,0x12,0x64,0xb9,0x12,0x6e,0x8f,0x60, +0xfb,0x22,0x22,0x2, 0x6e,0x56,0xc2,0x8e,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0x22,0x32,0x2, 0x63,0x5b,0xbe,0xb0, +0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x16,0xa2,0x22,0x22,0x2, 0x0, 0x5a,0xe5,0x52, +0x24,0xff,0x22,0x2, 0x67,0x4b,0xca,0x3b,0x7e,0xb3,0xf, 0x1b,0xf5,0x26,0x7e,0xd3, +0xf, 0x1c,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x33,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, +0xa, 0xe4,0x12,0x6d,0xee,0x6c,0xcc,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7c,0x19, +0xa3,0x13,0xba,0x7e,0x34,0x7f,0xff,0x74,0x7, 0xac,0xbc,0x59,0x35,0x13,0xb6,0x74, +0x7, 0xac,0xbc,0x59,0x35,0x13,0xb8,0xb, 0xc0,0xbe,0xc0,0xa, 0x78,0xd9,0xe5,0x26, +0x60,0x3, 0x2, 0x0, 0xef,0x12,0x6a,0xbb,0xbe,0xd0,0x0, 0x38,0x3, 0x2, 0x0, 0xdf, +0x74,0x1, 0x7a,0xb3,0xf, 0x20,0xe4,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7e, +0x34,0x13,0x6, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xee,0x2, 0x1, 0x14,0x4c, +0xdd,0x68,0x3, 0x2, 0x1, 0x14,0x75,0x25,0x0, 0x7e,0xa0,0xff,0x7e,0x71,0x25,0x74, +0x7, 0xac,0x7b,0x19,0xa3,0xe, 0x57,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xeb,0x74,0x1, +0x7a,0xb3,0xf, 0x1f,0x75,0x25,0x0, 0x2, 0x1, 0x4c,0x7e,0x51,0x25,0x74,0x7, 0xac, +0x5b,0x2e,0x24,0xe, 0xd, 0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x51,0x25,0xac,0x5b,0x2e,0x24,0xe, 0xf, 0xb, 0x28,0x30,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x5, 0x25,0xe5,0x26,0xbe,0xb1, +0x25,0x38,0xc7,0xe4,0x6c,0x77,0x7e,0x61,0x26,0x7e,0x24,0x13,0xb6,0x12,0x52,0xa6, +0x7e,0x71,0x26,0x7e,0x60,0xa, 0x7e,0x24,0x13,0xb6,0x12,0x52,0xa6,0x7c,0xcb,0x6c, +0xee,0x75,0x25,0x0, 0x2, 0x1, 0x92,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65,0x13, +0xba,0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x11,0xbc,0x76,0x78,0x3, 0x2, 0x1, 0x97, +0x5, 0x25,0xbe,0xc1,0x25,0x38,0xe0,0xbe,0xc1,0x25,0x68,0x3, 0x2, 0x1, 0xb8,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3c,0x2e,0x14,0x13, +0xb6,0x74,0x7, 0x12,0x48,0xc5,0xb, 0xc0,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xb2,0x7e, +0x24,0x13,0xb6,0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x4a,0x4c,0xdd, +0x68,0x3, 0x2, 0x1, 0xe7,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, +0x46,0x12,0x6d,0x4a,0x2, 0x4, 0x84,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x4, 0x84, +0x6c,0xee,0x2, 0x4, 0x7b,0x75,0x25,0x0, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65, +0xe, 0x57,0x7e,0x90,0x7, 0xac,0x9e,0x9, 0x74,0xe, 0x11,0xbc,0x67,0x78,0x3, 0x2, +0x2, 0x1b,0x5, 0x25,0xe5,0x25,0xbe,0xb0,0xa, 0x40,0xdd,0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x9, 0xf5,0xe, 0x57,0x49,0x34,0xe, 0xf, 0x49,0x25,0xe, 0x55,0x12,0x6d,0xbe, +0x7d,0x63,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, 0xa4, +0x49,0x25,0xe, 0x53,0x12,0x6d,0xbe,0x7d,0x13,0x2d,0x16,0x7a,0x15,0x21,0x7c,0x1f, +0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7,0xbe,0x14,0x0, 0x40,0x28,0x3, 0x2, 0x2, 0xd9, +0x7e,0x35,0x21,0xbe,0x34,0x0, 0x20,0x38,0x3, 0x2, 0x2, 0xae,0x7e,0x70,0x3, 0xac, +0x7f,0x9, 0xb3,0x12,0x2, 0x60,0x3, 0x2, 0x2, 0x97,0x9, 0xb3,0x12,0x3, 0xbe,0xb0, +0x0, 0x38,0x3, 0x2, 0x2, 0x89,0x2, 0x2, 0xbf,0x74,0x1, 0x19,0xb3,0x12,0x2, 0x6d, +0x22,0x7a,0x25,0x21,0x2, 0x2, 0xed,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0xa, 0x40,0x3, +0x2, 0x2, 0xed,0x2e,0x34,0x12,0x3, 0x4, 0x7a,0x39,0xb0,0x2, 0x2, 0xd1,0x7e,0x70, +0x3, 0xac,0x7f,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x2, 0xcc,0x7d, +0x23,0x2e,0x24,0x12,0x3, 0x14,0x7a,0x29,0xb0,0x2, 0x2, 0xed,0xe4,0x19,0xb3,0x12, +0x2, 0x6d,0x33,0x7a,0x35,0x21,0x2, 0x2, 0xed,0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7f, +0x19,0xa3,0x12,0x3, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x2, 0x7e,0x35,0x21, +0xbe,0x34,0x0, 0x20,0x28,0x3, 0x2, 0x3, 0x2e,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49, +0x35,0xe, 0x53,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x35,0xe, 0x55,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0x6d,0x33,0x7a, +0x35,0x21,0x7e,0xa0,0x1, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x1, 0x7e,0xf5, +0x21,0x7a,0xf5,0x23,0xa, 0xef,0x2e,0xe5,0x33,0x7e,0xe9,0xb0,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x3, 0x52,0x6d,0xee,0x74,0x2, 0xac,0xbf,0x59,0xe5,0x11,0xed,0x59,0xe5, +0x12,0x1f,0x7e,0x17,0xf, 0x5d,0xbe,0x15,0x23,0x28,0x3, 0x2, 0x3, 0x68,0x7e,0x4, +0x1, 0x0, 0x7a,0x5, 0x31,0x2, 0x3, 0x8b,0x7e,0x35,0x23,0x6d,0x22,0x7c,0x56,0x7c, +0x67,0x6c,0x77,0x12,0x48,0x3e,0x7d,0xe3,0x7a,0xe5,0x31,0xbe,0xe4,0x0, 0x10,0x40, +0x3, 0x2, 0x3, 0x8b,0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x31,0x74,0x2, 0xac,0xbf,0x49, +0x45,0x12,0x1f,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x3, 0xa5,0x49,0x45,0x11,0xed,0x7a, +0x45,0x31,0x2, 0x3, 0xac,0x7e,0x45,0x31,0x59,0x45,0x11,0xed,0x59,0xf5,0x12,0x1f, +0x7e,0x35,0x31,0xbe,0x34,0x1, 0x0, 0x38,0x3, 0x2, 0x3, 0xc3,0x7e,0x34,0x1, 0x0, +0x7a,0x35,0x31,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x25,0xe, 0x53,0x12,0x6d,0xbe,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31, +0xad,0x32,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, +0xac,0x5b,0x49,0x32,0xe, 0x53,0xac,0xbe,0x49,0x15,0xe, 0xd, 0xbd,0x13,0x38,0x3, +0x2, 0x4, 0x14,0x7d,0x2, 0x2e,0x4, 0xe, 0x53,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, +0x10,0x2, 0x4, 0x1e,0x2e,0x24,0xe, 0x53,0x9e,0x35,0x21,0x1b,0x28,0x30,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49,0x25,0xe, 0x55, +0x12,0x6d,0xbe,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31,0xad,0x32,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, 0xac,0x5b,0x49,0x32,0xe, +0x55,0xac,0xbe,0x49,0x15,0xe, 0xf, 0xbd,0x13,0x38,0x3, 0x2, 0x4, 0x6f,0x7d,0x2, +0x2e,0x4, 0xe, 0x55,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, 0x10,0x2, 0x4, 0x79,0x2e, +0x24,0xe, 0x55,0x9e,0x35,0x21,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x26,0xbc,0xbe,0x28, +0x3, 0x2, 0x1, 0xf5,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x49,0x45,0xe, 0x53,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x35,0x49,0x45,0xe, 0x55,0x1e,0x44,0x1e, +0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x37,0x9, 0xf5,0xe, 0x57,0x19,0xf5,0xe, 0x11, +0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x58,0x19,0x75,0xe, 0x12,0x74,0x7, 0xac,0xbe, +0x9, 0x75,0xe, 0x59,0x19,0x75,0xe, 0x13,0x7c,0xbf,0x54,0xf, 0xbe,0xb0,0xa, 0x40, +0x3, 0x2, 0x5, 0xd7,0x7c,0xfb,0xa, 0xf, 0x7d,0x10,0x2e,0x15,0x33,0x7e,0x19,0xb0, +0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x5, 0xf4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x4, 0xf9, +0x74,0xff,0x19,0xb0,0x13,0x6, 0x2, 0x5, 0xd7,0x9, 0x90,0x13,0x6, 0xbe,0x90,0xff, +0x68,0x3, 0x2, 0x5, 0x4b,0x74,0x1, 0x19,0xb0,0x13,0x6, 0x7e,0x15,0x35,0x74,0x7, +0xac,0xbe,0x59,0x15,0xe, 0xd, 0x7e,0x15,0x37,0x74,0x7, 0xac,0xbe,0x59,0x15,0xe, +0xf, 0x6c,0xdd,0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x50,0x7, 0xac, +0x5d,0x7e,0x30,0x15,0xac,0x3f,0x2d,0x12,0x2e,0x14,0x12,0x34,0x74,0x7, 0x12,0x48, +0xc5,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xdb,0x2, 0x5, 0xd7,0xbe,0x90,0x3, 0x50,0x3, +0x2, 0x5, 0x58,0xe4,0x19,0xb0,0x13,0x6, 0x7e,0x25,0x35,0x9, 0x80,0x13,0x6, 0x7e, +0x90,0x7, 0xac,0x89,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x43,0x59,0x24,0x12,0x34,0x7e, +0x25,0x37,0x59,0x24,0x12,0x36,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x5, 0xa0,0xe4, +0x2e,0x34,0x12,0x34,0x12,0x67,0xe7,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x74, +0x1, 0x7e,0x70,0x15,0xac,0x7f,0x2e,0x34,0x12,0x34,0x12,0x67,0xe7,0x2, 0x5, 0xc2, +0x49,0x34,0x12,0x34,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0xa, 0x3f,0x9, 0x43, +0x13,0x6, 0x7e,0x50,0x7, 0xac,0x45,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x32,0x49,0x33, +0x12,0x36,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0xa, 0x3f,0x2e,0x34,0x13,0x6, +0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x7c,0x1e,0x2e,0x10,0x27,0xa5,0xe7,0x60,0x3, +0x2, 0x5, 0xf4,0x7e,0x70,0x3, 0xac,0x7e,0x2e,0x34,0x12,0x1, 0x7e,0x24,0x0, 0x3, +0xe4,0x12,0x6d,0xee,0xb, 0xe0,0xbe,0xe0,0xa, 0x68,0x3, 0x2, 0x4, 0x86,0xe5,0x26, +0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x6, 0xe, 0x74,0x1, 0x7a,0xb3,0xf, 0x24,0xda,0x3b, +0x22,0xca,0x3b,0x7e,0xe3,0xf, 0x1b,0x4c,0xee,0x78,0x27,0x6c,0xff,0x6d,0x11,0x74, +0x2, 0xac,0xbf,0x59,0x15,0x13,0x56,0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x19, +0xa1,0x13,0x14,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x13,0x6a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xdb,0x6c,0xff,0x2, 0x7, 0xac,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xe, 0x11,0x54, +0xf, 0xf5,0x22,0xbe,0xb0,0xa, 0x40,0x3, 0x2, 0x7, 0xaa,0xe5,0x22,0xa, 0x1b,0x9, +0xb1,0xe, 0xdf,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x7, 0x85,0x75,0x21,0x0, 0x7e,0x31, +0x21,0x74,0x7, 0xac,0x3b,0x9, 0x71,0x13,0x14,0x7a,0x71,0x23,0xbe,0x71,0x22,0x68, +0x3, 0x2, 0x7, 0x77,0x49,0x21,0x13,0x12,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xf, +0x9d,0x32,0x12,0x6d,0xde,0x7d,0x63,0x7e,0xa1,0x21,0x74,0x7, 0xa4,0x49,0x25,0x13, +0x10,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6d,0xde,0x7d,0x3, +0x2d,0x6, 0xe5,0x23,0xa, 0x1b,0x9, 0xa1,0x13,0x6a,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0x71,0x23,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x13,0x56,0x2e,0x14,0x13,0x6a,0x7c,0xba, +0x14,0x7a,0x19,0xb0,0x2, 0x7, 0xaa,0x7e,0xa1,0x23,0x74,0x2, 0xa4,0x49,0x15,0x13, +0x56,0xbe,0x14,0x0, 0x32,0x28,0x9, 0xbe,0x4, 0x0, 0x32,0x28,0x3, 0x2, 0x7, 0x71, +0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, +0x80,0x6f,0xbe,0x4, 0x0, 0x96,0x28,0x63,0xe5,0x22,0xa, 0x1b,0x9, 0xb1,0xe, 0xdf, +0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0xe, 0xdf,0x7e,0xa0,0x3, 0xe5, +0x22,0xa, 0x1b,0x19,0xa1,0xe, 0xe9,0x7e,0x71,0x21,0x74,0x7, 0xac,0x7b,0x2e,0x34, +0x13,0x10,0x7e,0x14,0x13,0xb6,0x12,0x48,0xc5,0xbe,0xe0,0x0, 0x28,0x2d,0x1b,0xe0, +0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3f,0x2e,0x14, +0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x7e,0x34,0x13,0xb6,0x7e,0x30,0x7, 0xac,0x3e, +0x2e,0x14,0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x1b,0xf0,0x7e,0xa1,0x23,0x74,0x2, +0xa4,0x59,0x5, 0x13,0x56,0x80,0x33,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0xa, 0x50,0x3, +0x2, 0x6, 0x6e,0x80,0x25,0x6d,0x11,0x7e,0xa1,0x22,0x74,0x2, 0xa4,0x59,0x15,0x13, +0x56,0x7e,0xa0,0xff,0x7e,0x31,0x22,0x74,0x7, 0xac,0x3b,0x19,0xa1,0x13,0x14,0x7e, +0xa0,0x2, 0xe5,0x22,0xa, 0x1b,0x19,0xa1,0x13,0x6a,0xb, 0xf0,0xbc,0xef,0x28,0x3, +0x2, 0x6, 0x47,0x7a,0xe3,0xf, 0x1b,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0x10,0x7e, +0x14,0x0, 0x46,0x12,0x6d,0x4a,0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d, +0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x24,0xc, 0x75,0x25,0x0, +0x75,0x26,0x17,0x75,0x27,0x0, 0x7e,0x34,0x13,0xd0,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6d,0xee,0x6c,0x66,0x2, 0x8, 0xed,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xd, 0x18,0x7a, +0x71,0x23,0x9, 0xa5,0xd, 0x19,0x1a,0x17,0x7d,0x21,0x1b,0x25,0xb, 0x15,0x7c,0x43, +0x1a,0x1a,0x1b,0x15,0x1a,0xa, 0xb, 0x5, 0x7c,0x21,0xbe,0x50,0x0, 0x58,0x2, 0x6c, +0x55,0x7e,0x73,0x10,0x2b,0xa, 0x7, 0x1b,0x4, 0x1a,0x44,0xbd,0x40,0x8, 0x2, 0x7c, +0x41,0xbe,0x30,0x0, 0x58,0x2, 0x6c,0x33,0x7e,0x73,0x10,0x2c,0xa, 0x7, 0x1b,0x4, +0x1a,0x42,0xbd,0x40,0x8, 0x2, 0x7c,0x21,0xbe,0x51,0x24,0x58,0x3, 0x7a,0x51,0x24, +0xbe,0x41,0x25,0x8, 0x3, 0x7a,0x41,0x25,0xbe,0x31,0x26,0x58,0x3, 0x7a,0x31,0x26, +0xbe,0x21,0x27,0x8, 0x3, 0x7a,0x21,0x27,0x7c,0xf5,0x80,0x4b,0x7c,0xe3,0x80,0x41, +0x1a,0xef,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0xe, 0x2d,0xf, 0xe, 0x4, 0xe, 0x4, +0xe, 0x4, 0x7c,0x71,0x7a,0x71,0x21,0x7e,0x10,0x18,0xac,0x1f,0x7c,0xb1,0x2c,0xbe, +0x54,0x7, 0x7e,0x4, 0x0, 0x1, 0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7c,0xb1,0xf5, +0x22,0xa, 0x7, 0x2e,0x4, 0x13,0xd0,0x7e,0x9, 0xb0,0x45,0x22,0x7a,0x9, 0xb0,0xb, +0xe0,0xbc,0x2e,0x58,0xbb,0xb, 0xf0,0xbc,0x4f,0x58,0xb1,0xb, 0x60,0x7e,0x73,0xd, +0xf7,0xbc,0x76,0x28,0x3, 0x2, 0x8, 0x27,0xbe,0x70,0x0, 0x38,0x3, 0x2, 0xd, 0x43, +0x7e,0xe1,0x26,0x2, 0xd, 0x3a,0x6c,0xff,0x80,0x1f,0x1a,0x3e,0x3e,0x34,0x1a,0x2f, +0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36,0xb, 0x38,0x30,0xe, 0x34,0xe, +0x34,0x3e,0x24,0x59,0x32,0x13,0xb6,0xb, 0xf0,0x7e,0x73,0x10,0x2b,0xbc,0x7f,0x18, +0xd9,0x7e,0xf1,0x24,0x2, 0xd, 0x2f,0x1a,0x4f,0x7e,0x14,0x0, 0x18,0xad,0x14,0x1a, +0x3e,0x7d,0x51,0x2d,0x53,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7a,0xa1,0x21, +0x7e,0x50,0x18,0xac,0x5f,0x7c,0xb5,0x2c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x22,0xa, 0x2a,0x9, 0xb2,0x13,0xd0, +0x55,0x22,0x78,0x3, 0x2, 0xd, 0x2d,0xbe,0xf0,0x3, 0x58,0x3, 0x2, 0x9, 0xfe,0x7e, +0x53,0x10,0x2b,0xa, 0x25,0x1b,0x26,0xbd,0x42,0x18,0x73,0x7d,0xf4,0x3e,0xf4,0x49, +0x5f,0x13,0xba,0x49,0x2f,0x13,0xb2,0x2d,0x25,0x7d,0x52,0x3e,0x54,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x2d,0x25,0x49,0x5f,0x13,0xbc,0x49,0xef,0x13,0xb0,0x2d,0xe5,0x7d, +0x5e,0x3e,0x54,0x2d,0x5e,0x9d,0x25,0x49,0xef,0x13,0xb8,0x49,0x5f,0x13,0xb4,0x2d, +0x5e,0x7d,0xe5,0x3e,0xe4,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d, +0x5e,0x9d,0x25,0x49,0x5f,0x13,0xb6,0x7d,0x5, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x9d,0x10,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x2, 0xb, 0x55,0x4c,0xff, +0x78,0x5d,0x7d,0x24,0x3e,0x24,0x49,0x12,0x13,0xb6,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x3e,0x54,0x2d,0x50,0x7d,0x1, 0x3e,0x4, 0x2d,0x5, 0x2d,0x1, 0x49,0x12,0x13,0xb8, +0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5, 0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x9d,0x1, 0x49,0x12,0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x2d,0x50,0x9d,0x51,0x49,0x22,0x13,0xbc,0x3e,0x24,0x9d,0x52,0x2, 0xb, 0x55,0xbe, +0xf0,0x1, 0x78,0x69,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x49,0x20, +0x13,0xb6,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x25,0x9d,0x21,0x49,0x10, +0x13,0xb8,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x21,0x49,0x10, +0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10, +0x13,0xbc,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x52,0x2, 0xb, 0x55,0xbe,0xf0,0x2, +0x68,0x3, 0x2, 0xb, 0x75,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x50,0x13,0xb2,0x7d, +0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x15,0x9d,0x12,0x49,0x20,0x13,0xb6,0x7d, +0xf2,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5f,0x3e,0x24,0x3e,0x24,0x2d, +0x25,0x2d,0x21,0x49,0x50,0x13,0xb8,0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x2d,0x15,0x9d,0x21,0x49,0x50,0x13,0xba,0x7d,0x15,0x3e,0x14,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10,0x13,0xbc,0x7d,0x21,0x3e, +0x24,0x2d,0x21,0x9d,0x52,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7d,0x23,0x3e,0x24,0x7e,0x14,0x0, 0x30,0xad,0x14,0x2d,0x21,0x2d,0x26,0x1b, +0x28,0x50,0x2, 0xd, 0x11,0x7e,0xa3,0x10,0x2b,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x68, +0x3, 0x2, 0xc, 0x11,0x3e,0x44,0x49,0x24,0x13,0xb2,0x7d,0x12,0x3e,0x14,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x4, 0x13,0xb0,0x7d,0x10,0x3e,0x14,0x2d,0x10, +0x9d,0x21,0x49,0x4, 0x13,0xb4,0x7d,0x10,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x10,0x9d,0x21,0x49,0x14,0x13,0xb6,0x7d,0xf1,0x3e,0xf4,0x3e,0xf4, +0x3e,0xf4,0x3e,0xf4,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x9d,0xf, 0x3e,0x14,0x3e,0x14,0x2d,0x10,0x2d,0x12,0x49,0x4, +0x13,0xb8,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x20, +0x9d,0x12,0x49,0x4, 0x13,0xba,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x20, +0x2d,0x21,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x2, 0xd, +0x0, 0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x76,0x1a,0xf, 0x3e,0x4, 0x49,0x30,0x13, +0xb0,0x7d,0x23,0x3e,0x24,0x2d,0x23,0x49,0x10,0x13,0xb2,0x7d,0x31,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x2d,0x31,0x9d,0x32,0x49,0x20,0x13,0xb4,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x49,0x20,0x13,0xb6,0x7d,0x12,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x9d,0x21,0x2d,0x23,0x49,0x30,0x13,0xb8,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x31,0x9d,0x23,0xe, +0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e,0x80,0x71,0x7e, +0xb3,0x10,0x2b,0x14,0xbc,0xbf,0x78,0x79,0x1a,0x5f,0x3e,0x54,0x49,0x25,0x13,0xb2, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9d,0x32,0x49,0x25,0x13,0xb0,0x3e,0x24, +0x9d,0x32,0x49,0x25,0x13,0xb4,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x24,0x9d,0x32,0x49,0x15,0x13,0xb6,0x7d,0x21, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x2, 0x7d,0x21,0x3e,0x24,0x2d,0x20,0x2d,0x21, +0x2d,0x23,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e, +0x3e,0x34,0x1a,0xf, 0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d,0x31,0x2d,0x36,0x1b,0x38, +0x20,0x1a,0x1e,0x3e,0x14,0x1a,0x2f,0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x23,0x2d, +0x21,0x2d,0x26,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x25,0xbc,0xbf,0x48,0x3, 0x2, 0x9, 0x37,0xb, 0xe0,0xe5,0x27,0xbc,0xbe,0x48,0x3, +0x2, 0x9, 0x6, 0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7e,0xb3,0xd, 0xf7,0xf5,0x2c, +0x75,0x10,0x0, 0xe4,0x7a,0xb3,0x15,0x54,0x7a,0xb3,0x15,0x55,0x6d,0x22,0x7e,0x34, +0x7f,0xff,0x7e,0x67,0xf, 0xda,0x6c,0xee,0xe4,0xa, 0x1e,0x19,0xb1,0x13,0xb6,0x6c, +0xaa,0x7e,0x10,0x2, 0xac,0x1e,0x19,0xa0,0x15,0x2b,0x19,0xb0,0x15,0x2c,0xe5,0x2c, +0xbc,0xbe,0x28,0x24,0x9, 0x20,0xd, 0x18,0x7e,0x30,0x18,0xac,0x23,0x9, 0x10,0xd, +0x19,0xa, 0x1, 0x2d,0x10,0x3e,0x14,0x2d,0x16,0xb, 0x18,0x10,0xbd,0x12,0x48,0x2, +0x7d,0x21,0xbd,0x13,0x18,0x2, 0x7d,0x31,0xb, 0xe0,0xbe,0xe0,0x14,0x78,0xb9,0x2d, +0x32,0xe, 0x34,0xe5,0x2c,0xbe,0xb0,0x2, 0x50,0x3, 0x2, 0x11,0x9d,0x6c,0xee,0x7e, +0x30,0x6, 0xac,0x3e,0x7d,0x51,0x2e,0x54,0x69,0x5c,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x23,0x58,0x20,0x7d,0x51,0x2e,0x54,0x69,0x5e,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0x7a,0x25,0x30,0x2e,0x14,0x69,0x60,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0x7a,0x25,0x32,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc3,0x6c,0xee,0x2, 0x11, +0x8b,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19, +0xf5,0x23,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x13,0xb6,0x70,0xa, 0xa, 0x3e, +0xb, 0x34,0xa, 0x2e,0x19,0x72,0x13,0xb6,0xe5,0x2c,0x14,0xbc,0xbe,0x78,0x3, 0x2, +0x11,0x94,0xa, 0x5e,0xb, 0x54,0xf5,0x2d,0x2, 0x11,0x7f,0x7e,0x71,0x2d,0x74,0x2, +0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a,0xa1,0x24,0x9, 0xb3,0xd, 0x19,0xf5,0x25,0xa, +0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xde,0x7c,0xb7,0xf5,0x2a,0xe5,0x25, +0xa, 0x2b,0xe5,0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xde,0x7c,0xb7,0xf5,0x2b,0x75, +0x3d,0x2, 0x75,0x2f,0x0, 0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b, +0x2d,0x23,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0x7a,0x25,0x34,0x7e,0x11,0x24,0x74, +0x18,0xac,0x1b,0xe5,0x25,0xa, 0x1b,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0x7a,0x25,0x36,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0xe, 0x54,0x7a,0x55,0x38,0xbe,0x25,0x34,0x8, 0x14,0x7e,0x25,0x34, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x7a,0x25, +0x38,0xe5,0x2a,0xbe,0xb0,0x1, 0x38,0x37,0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x30,0x7c, +0xbf,0x54,0x2, 0xb4,0x2, 0x29,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, 0x20,0x7e, +0x71,0x22,0x74,0x18,0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d, +0x32,0xbe,0x35,0x38,0x18,0x3, 0x2, 0x11,0x13,0x75,0x2f,0x1, 0x2, 0x11,0x13,0xe5, +0x2a,0xbe,0xb0,0x1, 0x38,0xa, 0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x3, 0x2, 0x11,0x13, +0xe5,0x2a,0xbe,0xb0,0x4, 0x40,0x3, 0x2, 0x11,0x13,0xe5,0x2b,0xbe,0xb0,0x4, 0x40, +0x3, 0x2, 0x11,0x13,0x7c,0xbf,0x54,0x1, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x11,0x13, +0x6d,0x33,0x7a,0x35,0x3a,0x75,0x3c,0x0, 0x85,0x22,0x26,0x85,0x24,0x28,0xe5,0x24, +0xbe,0xb1,0x22,0x50,0x6, 0x85,0x24,0x26,0x85,0x22,0x28,0x85,0x23,0x27,0x85,0x25, +0x29,0xe5,0x25,0xbe,0xb1,0x23,0x50,0x6, 0x85,0x25,0x27,0x85,0x23,0x29,0x75,0x40, +0x0, 0x75,0x41,0x0, 0xe5,0x28,0xbe,0xb1,0x26,0x78,0x21,0x75,0x40,0x1, 0xe5,0x26, +0x60,0x5, 0xe5,0x26,0xb4,0xc, 0x3, 0x75,0x41,0x1, 0xe5,0x26,0xbe,0xb0,0x0, 0x28, +0x2, 0x15,0x26,0xe5,0x28,0xbe,0xb0,0xc, 0x50,0x2, 0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x27,0x78,0x21,0x75,0x40,0x1, 0xe5,0x27,0x60,0x5, 0xe5,0x27,0xb4,0x17,0x3, 0x75, +0x41,0x1, 0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x27,0xe5,0x29,0xbe,0xb0,0x17, +0x50,0x2, 0x5, 0x29,0x85,0x26,0x3e,0x80,0x78,0x85,0x27,0x3f,0x80,0x6a,0xe5,0x26, +0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x28,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x27,0xbe,0xb1, +0x3f,0x68,0x7, 0xe5,0x29,0xbe,0xb1,0x3f,0x78,0x24,0x7e,0x51,0x3e,0x74,0x18,0xac, +0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0xbe,0x24, +0x0, 0x0, 0x8, 0x6, 0x2e,0x25,0x3a,0x7a,0x25,0x3a,0x5, 0x3c,0x80,0x28,0x7e,0x51, +0x3e,0x74,0x18,0xac,0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0xbe,0x25,0x32,0x8, 0xc, 0xe5,0x3d,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x3d, +0x1, 0x80,0x3, 0x75,0x3d,0x0, 0x5, 0x3f,0xe5,0x29,0xbe,0xb1,0x3f,0x50,0x8f,0x5, +0x3e,0xe5,0x28,0xbe,0xb1,0x3e,0x50,0x81,0x7e,0x51,0x28,0x74,0x18,0xac,0x5b,0xe5, +0x27,0xa, 0x4b,0x2d,0x24,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x50,0x7e,0x25,0x3a,0x9d, +0x25,0x7e,0x31,0x26,0x74,0x18,0xac,0x3b,0xe5,0x29,0xa, 0xb, 0x7d,0x51,0x2d,0x50, +0x3e,0x54,0x2d,0x56,0xb, 0x58,0x50,0x9d,0x25,0x2d,0x14,0x3e,0x14,0x2d,0x16,0xb, +0x18,0x10,0x9d,0x21,0x7e,0x31,0x28,0x74,0x18,0xac,0x3b,0x2d,0x10,0x3e,0x14,0x2d, +0x16,0xb, 0x18,0x10,0x9d,0x21,0x7a,0x25,0x3a,0x7e,0x25,0x36,0x2e,0x25,0x34,0x7a, +0x25,0x38,0xe5,0x40,0xb4,0x1, 0x11,0xe5,0x41,0x70,0xd, 0x7e,0x25,0x3a,0x9e,0x25, +0x38,0x7a,0x25,0x3a,0x15,0x3c,0x15,0x3c,0xe5,0x3c,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x3c,0x24,0xfc,0xf5,0x3c,0x7e,0x25,0x3a,0xbe,0x24,0x0, 0x0, 0x58,0x3, 0x7a,0x35, +0x3a,0x7e,0x15,0x38,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x30,0x1a,0x26,0x1a,0x24,0x12, +0x48,0x24,0xe5,0x3c,0xa, 0x1b,0x6d,0x0, 0x12,0x48,0x24,0x7f,0x21,0x7e,0x35,0x3a, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x48,0x35,0xbf,0x12,0x8, 0xa, 0xe5, +0x3d,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x2f,0x2, 0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, +0x75,0x2f,0x2, 0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x63,0xe5,0x2f,0xa, 0x3b,0x2e,0x34, +0x15,0x53,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2d,0xa, 0x3b,0x9, 0xb3,0x13, +0xb6,0x70,0xc, 0xa, 0x2e,0x9, 0x52,0x13,0xb6,0x19,0x53,0x13,0xb6,0x80,0x3e,0x75, +0x2e,0x0, 0x80,0x32,0x9, 0x33,0x13,0xb6,0xa, 0x2e,0x9, 0xa2,0x13,0xb6,0xbc,0xa3, +0x28,0x12,0xe5,0x2e,0xa, 0x2b,0x9, 0x22,0x13,0xb6,0xbc,0x2a,0x78,0x16,0x19,0x32, +0x13,0xb6,0x80,0x10,0xe5,0x2e,0xa, 0x2b,0x9, 0xb2,0x13,0xb6,0xbc,0xb3,0x78,0x4, +0x19,0xa2,0x13,0xb6,0x5, 0x2e,0xe5,0x2c,0xbe,0xb1,0x2e,0x38,0xc7,0x5, 0x2d,0xe5, +0x2c,0xbe,0xb1,0x2d,0x28,0x3, 0x2, 0xe, 0x3b,0xb, 0xe0,0xe5,0x2c,0xbc,0xbe,0x28, +0x3, 0x2, 0xe, 0x1, 0x7e,0x34,0x13,0xb6,0x12,0x39,0xc4,0xf5,0x10,0xda,0x3b,0x22, +0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55, +0x7e,0x37,0xf, 0x61,0x7a,0x35,0x3e,0x6c,0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0xe4,0x19,0xb3,0xd, 0x71,0xa, 0x5d,0x3e,0x54,0xb, 0x54,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x39,0x9, 0xb3,0xd, 0x19,0xf5,0x3a, +0xbe,0xd1,0x3a,0x28,0x3, 0x2, 0x12,0xe, 0x7e,0xb3,0x10,0x2c,0xa, 0xb, 0x1b,0x4, +0xa, 0x3d,0x9d,0x3, 0xe5,0x3a,0xa, 0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0xe, 0x7c, +0x3a,0xa, 0x4d,0xe5,0x3a,0xa, 0xb, 0x9d,0x4, 0x7c,0x51,0x2, 0x12,0x59,0xbe,0xd1, +0x3a,0x38,0x3, 0x2, 0x12,0x27,0xe5,0x3a,0xa, 0xb, 0xa, 0x3d,0x2d,0x30,0xb, 0x34, +0x7c,0x37,0x6c,0x55,0x2, 0x12,0x59,0xa, 0xfd,0xe5,0x3a,0xa, 0x4b,0x2d,0xf4,0x7e, +0xb3,0x10,0x2c,0xa, 0xb, 0x7d,0x30,0x1b,0x34,0xbd,0xf3,0x18,0x3, 0x2, 0x12,0x59, +0xbd,0x43,0x8, 0x3, 0x2, 0x12,0x59,0xa, 0x3d,0x2d,0x30,0xe5,0x3a,0xa, 0xb, 0x9d, +0x30,0x7c,0x37,0xa, 0x3d,0x9d,0x3, 0x7c,0x51,0xbe,0xd1,0x39,0x28,0x3, 0x2, 0x12, +0x83,0x7e,0xb3,0x10,0x2b,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5,0x39,0xa, +0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0x83,0x7c,0x4a,0xa, 0xd, 0xe5,0x39,0xa, 0x3b, +0x2, 0x12,0xca,0xbe,0xd1,0x39,0x38,0x3, 0x2, 0x12,0x9c,0xe5,0x39,0xa, 0xb, 0xa, +0x3d,0x2d,0x30,0xb, 0x34,0x7c,0x47,0x6c,0x22,0x2, 0x12,0xce,0xa, 0x4d,0xe5,0x39, +0xa, 0x5b,0x2d,0x45,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7d,0x3, 0x1b,0x4, 0xbd,0x40, +0x18,0x3, 0x2, 0x12,0xce,0xbd,0x50,0x8, 0x3, 0x2, 0x12,0xce,0xa, 0xd, 0x2d,0x3, +0xe5,0x39,0xa, 0x3b,0x9d,0x3, 0x7c,0x41,0xa, 0xd, 0x9d,0x30,0x7c,0x27,0x7e,0x37, +0xf, 0xda,0x7c,0xb2,0x7e,0x23,0xf, 0x53,0x7e,0x4, 0x9, 0xc8,0x12,0x5c,0x41,0x7e, +0x37,0x9, 0xc8,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xca,0x7d,0x20,0x7a,0x1d,0x28, +0x7e,0x37,0x9, 0xcc,0x7d,0x3, 0x7e,0x37,0x9, 0xce,0x7d,0x20,0x7a,0x1d,0x2c,0x7e, +0x37,0x9, 0xd0,0x7d,0x3, 0x7e,0x37,0x9, 0xd2,0x7d,0x20,0x7a,0x1d,0x30,0x7e,0x37, +0x9, 0xd4,0x7d,0x3, 0x7e,0x37,0x9, 0xd6,0x7d,0x20,0x7a,0x1d,0x34,0xa, 0x2d,0xe5, +0x39,0xa, 0x3b,0x9d,0x32,0x7c,0xc7,0x2, 0x15,0x24,0xa, 0x4d,0xe5,0x3a,0xa, 0x5b, +0x9d,0x54,0xf5,0x38,0x2, 0x15,0xd, 0xbe,0xc0,0x0, 0x58,0x3, 0x2, 0x15,0xb, 0x7e, +0x73,0x10,0x2b,0xbc,0x7c,0x18,0x3, 0x2, 0x15,0xb, 0xe5,0x38,0xbe,0xb0,0x0, 0x58, +0x3, 0x2, 0x15,0xb, 0x7e,0x73,0x10,0x2c,0xbe,0x71,0x38,0x18,0x3, 0x2, 0x15,0xb, +0xe5,0x38,0x1a,0x1b,0x3e,0x14,0x1a,0x2c,0x7e,0x34,0x0, 0x30,0xad,0x32,0x2d,0x31, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x7e,0x53,0xf, 0x53,0xa, 0x25,0x9d,0x32,0x7a, +0x35,0x3c,0xbe,0x34,0x0, 0x0, 0x18,0x3, 0x2, 0x15,0xb, 0x7e,0x35,0x3e,0xbe,0x35, +0x3c,0x28,0x3, 0x2, 0x13,0xa6,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xd, 0x71,0x7e, +0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x39,0xa, 0x2b,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xde,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x13,0xd0,0xe5,0x3a,0xa, 0x2b,0xe5,0x38, +0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xde,0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x2, 0x15,0xb, +0x75,0x3b,0x0, 0x2, 0x14,0x60,0xbe,0xe1,0x3b,0x78,0x3, 0x2, 0x14,0x5e,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xde,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xde,0xbe, +0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0x75,0x3b,0xff,0x2, 0x14,0x6c,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xde,0xbe,0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xde,0xbe, +0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0x75,0x3b,0x0, 0x2, 0x14,0x6c,0x5, 0x3b, +0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x3b,0x8, 0x3, 0x2, 0x13,0xd6,0xe5,0x3b,0x60,0x3, +0x2, 0x14,0xc0,0x7e,0x35,0x3c,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x3c,0x7e, +0xf5,0x3c,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a, +0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34, +0x7e,0x1d,0x28,0x9f,0x17,0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30, +0xe5,0x3b,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x15,0xb, 0x7e,0xf5,0x3c,0x7d,0x3f,0x1a, +0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d, +0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34,0x7e,0x1d,0x28,0x9f,0x17, +0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30,0x5, 0x38,0xa, 0x2d,0xe5, +0x3a,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x38,0x1a,0x3b,0xbd,0x32,0x18,0x3, 0x2, +0x13,0x37,0xb, 0xc0,0xa, 0x2d,0xe5,0x39,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0x1a,0x3c, +0xbd,0x32,0x18,0x3, 0x2, 0x13,0x2a,0x74,0x6, 0x7e,0x1d,0x2c,0x2f,0x11,0x14,0x78, +0xfb,0x7a,0x1d,0x2c,0x7e,0xd, 0x28,0x7e,0x1d,0x2c,0x12,0x48,0x40,0x2e,0x34,0x0, +0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xd, 0x6b,0x74,0x6, 0x7e,0x1d,0x34,0x2f, +0x11,0x14,0x78,0xfb,0x7a,0x1d,0x34,0x7e,0x7d,0x30,0x7e,0x1d,0x34,0x7f,0x7, 0x12, +0x48,0x40,0x2e,0x34,0x0, 0x20,0x59,0x36,0xd, 0x6d,0x7e,0xb3,0xf, 0x60,0x7f,0x17, +0x70,0x3, 0x2, 0x15,0x91,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7a,0x1d,0x30,0xbe,0x18,0x0, 0x7f,0x38,0x3, 0x2, 0x15,0xa4,0x7e,0x18,0x0, +0x7f,0x7a,0x1d,0x30,0x7e,0x2d,0x30,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0x71,0x7e,0x70,0x7, 0xac,0x7f,0x19, +0xa3,0xd, 0x71,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xd, 0x71,0xbe,0x70,0xf, 0x38,0x3, +0x2, 0x15,0xdf,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xd, 0x71,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x11, +0x96,0xa5,0xbe,0x1, 0x58,0x7e,0xa3,0x10,0x2b,0xbc,0xa7,0x28,0xd, 0x7a,0x71,0xd, +0x74,0x30,0xac,0x7b,0x2e,0x37,0x16,0x9e,0x80,0x3c,0x7a,0x71,0xd, 0xbc,0xa7,0x78, +0x6, 0x7e,0x34,0x8, 0x9a,0x80,0x2f,0xa, 0x2a,0x7d,0x2, 0xb, 0x4, 0xa, 0x17,0xbd, +0x10,0x78,0x6, 0x7e,0x34,0x8, 0xca,0x80,0x1d,0x7d,0x2, 0xb, 0x5, 0xbd,0x10,0x78, +0x6, 0x7e,0x34,0x9, 0x2e,0x80,0xf, 0x2e,0x24,0x0, 0x3, 0xbd,0x12,0x68,0x3, 0x2, +0x19,0x6a,0x7e,0x34,0x9, 0x5e,0x7a,0x37,0x16,0x4f,0x2, 0x19,0x6a,0xa5,0xbe,0x0, +0x46,0x7e,0x64,0x0, 0xb, 0x7a,0x69,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf,0x1, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, +0x74,0x1, 0x7e,0x70,0x1, 0x80,0x36,0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3, +0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x21,0x74,0x27,0x7e,0x70, +0x3, 0x12,0x6d,0xad,0x2, 0x19,0x6a,0xa5,0xbe,0x2, 0x23,0xa5,0xbf,0x4, 0x7, 0x74, +0x1, 0x7e,0x70,0x4, 0x80,0x7, 0xa5,0xbf,0x5, 0x9, 0xe4,0x6c,0x77,0x12,0x0, 0x5e, +0x2, 0x19,0x6a,0xbe,0x70,0x1, 0x50,0x3, 0x2, 0x19,0x6a,0x2, 0x19,0x6a,0xa5,0xbe, +0x3, 0x15,0xbe,0x70,0xd, 0x28,0x9, 0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x2, 0x19,0x6a, +0x7a,0x73,0x10,0x2b,0x2, 0x19,0x6a,0xa5,0xbe,0x4, 0x15,0xbe,0x70,0x18,0x28,0x9, +0x74,0x18,0x7a,0xb3,0x10,0x2c,0x2, 0x19,0x6a,0x7a,0x73,0x10,0x2c,0x2, 0x19,0x6a, +0xa5,0xbe,0x5, 0x7, 0x7a,0x73,0x10,0x2d,0x2, 0x19,0x6a,0xa5,0xbe,0x7, 0x1e,0x7a, +0x73,0x10,0x4b,0x7c,0xb7,0x54,0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0x10, +0x54,0x5e,0x70,0x3, 0x4d,0x32,0x7a,0x37,0x10,0x54,0x2, 0x19,0x6a,0xa5,0xbe,0x8, +0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xac,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x16,0x2, 0x19,0x6a,0xa5,0xbe,0x9, 0x1c,0xbe,0x70,0xa, 0x50,0x3, 0x7e,0x70, +0xa, 0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xad,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x49,0x2, 0x19,0x6a,0xa5,0xbe,0xa, 0x10,0xa5,0xbf,0x0, 0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x10,0x3b,0x2, 0x19,0x6a,0xa5,0xbe,0xb, 0x14,0x7e,0xb3,0x10, +0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xae,0x2, 0x19,0x6a,0x7a,0x73,0x11,0x94,0x2, 0x19, +0x6a,0xa5,0xbe,0xc, 0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xd, 0xfe,0x2, +0x19,0x6a,0x7a,0x73,0x11,0x9d,0x2, 0x19,0x6a,0xa5,0xbe,0x4c,0x7, 0x7a,0x73,0xf, +0x46,0x2, 0x19,0x6a,0xa5,0xbe,0xfb,0x29,0x7a,0x71,0x8, 0x7e,0x37,0x10,0x50,0x5e, +0x70,0xdf,0x7a,0x37,0x10,0x50,0xe5,0x8, 0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x4e,0x37,0x10,0x50,0x7a,0x37,0x10,0x50,0x2, 0x19, +0x6a,0xa5,0xbe,0x4e,0x7, 0x7a,0x73,0x10,0x4a,0x2, 0x19,0x6a,0xa5,0xbe,0x4f,0x6, +0x12,0x0, 0x6, 0x2, 0x19,0x6a,0xbe,0x60,0x50,0x40,0x12,0xbe,0x60,0x51,0x38,0xd, +0xa, 0x26,0x2e,0x27,0x10,0x2f,0x9e,0x24,0x0, 0x50,0x2, 0x19,0x54,0xbe,0x60,0x52, +0x40,0x12,0xbe,0x60,0x55,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x31,0x9e,0x24,0x0, +0x52,0x2, 0x19,0x54,0xbe,0x60,0x56,0x40,0x12,0xbe,0x60,0x62,0x38,0xd, 0xa, 0x26, +0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x56,0x2, 0x19,0x54,0xbe,0x60,0x63,0x40,0x12, +0xbe,0x60,0x7a,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x63,0x2, +0x19,0x54,0xbe,0x60,0x7b,0x50,0x3, 0x2, 0x18,0xe8,0xbe,0x60,0x9f,0x28,0x3, 0x2, +0x18,0xe8,0x7e,0xb3,0x10,0x3b,0x70,0x48,0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24, +0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29, +0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f,0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17, +0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29, +0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, 0x2f,0x19,0x72,0xf, 0xdc,0x2, 0x19,0x6a, +0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27, +0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29,0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f, +0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17,0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27, +0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29,0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, +0x2f,0x19,0x72,0xf, 0x63,0x2, 0x19,0x6a,0xbe,0x60,0xa0,0x40,0x11,0xbe,0x60,0xac, +0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6c,0x9e,0x24,0x0, 0xa0,0x80,0x56,0xbe,0x60, +0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6e,0x9e,0x24, +0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38,0xc, 0xa, 0x26, +0x2e,0x27,0x10,0x70,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2,0x40,0x11,0xbe, +0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x72,0x9e,0x24,0x0, 0xd2,0x80,0x14, +0xbe,0x60,0xd6,0x40,0x14,0xbe,0x60,0xed,0x38,0xf, 0xa, 0x26,0x2e,0x27,0x10,0x74, +0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x80,0x11,0xa5,0xbe,0xf8,0x6, 0x7a,0x73,0x11, +0xe8,0x80,0x7, 0xa5,0xbe,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x3b,0x22,0xca,0x3b,0xe4, +0x7a,0xb3,0x13,0xde,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x23,0x6c,0xee,0x7e,0xa0,0xff, +0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0xff,0xa, 0x3e,0x19,0xb3,0x13, +0xca,0x7e,0x34,0xff,0xff,0x74,0x2, 0xac,0xbe,0x59,0x35,0x13,0xb6,0xe4,0xa, 0x3e, +0x19,0xb3,0x13,0xd4,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xd2,0x7e,0xb3,0xf, 0x1b,0x60, +0x3, 0x2, 0x19,0xe5,0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0x2, 0x1b,0xfc,0x6c,0xee,0x7e, +0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, +0x78,0xdd,0x2, 0x1b,0xfc,0x7e,0xb3,0xf, 0x1c,0x60,0x3, 0x2, 0x1a,0x38,0x6c,0xee, +0x2, 0x1a,0x2d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5e, +0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19, +0xe5,0xe, 0x11,0x74,0x1, 0xa, 0x3e,0x19,0xb3,0x13,0xd4,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0xbe,0x2, 0x1b,0xfc,0x6c,0xee,0x2, 0x1a,0x9e,0x6c,0xff,0x7e, +0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23,0x49,0x23,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x49, +0x35,0xe, 0xf, 0x9d,0x32,0x12,0x6d,0xde,0x7d,0x63,0x7e,0x70,0x2, 0xac,0x7f,0x2e, +0x35,0x23,0x49,0x23,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x9d,0x32, +0x12,0x6d,0xde,0x2d,0x36,0x7a,0x35,0x21,0x74,0x2, 0xac,0xbe,0x49,0x45,0x13,0xb6, +0xbe,0x45,0x21,0x38,0x3, 0x2, 0x1a,0x95,0xa, 0x4e,0x19,0xf4,0x13,0xca,0x7e,0x35, +0x21,0x59,0x35,0x13,0xb6,0xb, 0xf0,0xbe,0xf0,0xa, 0x78,0xa3,0xb, 0xe0,0x7e,0x73, +0xf, 0x1b,0xbc,0x7e,0x38,0x97,0x6c,0xee,0x2, 0x1b,0x52,0x74,0x1, 0x7a,0xb3,0x13, +0xde,0x6c,0xff,0x2, 0x1a,0xf1,0xbc,0xfe,0x78,0x3, 0x2, 0x1a,0xef,0xa, 0x3f,0x9, +0x63,0x13,0xca,0xa, 0x2e,0x9, 0x72,0x13,0xca,0xbc,0x76,0x68,0x3, 0x2, 0x1a,0xef, +0x74,0x2, 0xac,0xbf,0x49,0x25,0x13,0xb6,0x74,0x2, 0xac,0xbe,0x49,0x35,0x13,0xb6, +0xbd,0x32,0x50,0x3, 0x2, 0x1a,0xef,0xe4,0x7a,0xb3,0x13,0xde,0x2, 0x1a,0xf9,0xb, +0xf0,0x7e,0x73,0xf, 0x1b,0xbc,0x7f,0x38,0xbd,0x7e,0xb3,0x13,0xde,0xb4,0x1, 0x2, +0x80,0x3, 0x2, 0x1b,0x50,0x74,0x1, 0xa, 0x3e,0x9, 0xa3,0x13,0xca,0xa, 0x4a,0x19, +0xb4,0x13,0xd4,0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0x7, 0xac,0xbe, +0x49,0x35,0xe, 0xd, 0xa, 0x2e,0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e, +0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0xa, 0x2e, +0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28, +0xb, 0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, 0x1a,0xab,0x6c,0xee,0x2, +0x1b,0xc1,0x74,0x7, 0xac,0xbe,0x9, 0xb5,0xe, 0x11,0xb4,0xff,0x2, 0x80,0x3, 0x2, +0x1b,0xbf,0x6c,0xff,0xa, 0x3f,0x9, 0xb3,0x13,0xd4,0x60,0x3, 0x2, 0x1b,0xb8,0x74, +0x1, 0x19,0xb3,0x13,0xd4,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, +0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, +0xf, 0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac, +0xbe,0x19,0xf5,0xe, 0x11,0x2, 0x1b,0xbf,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xb5,0xb, +0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x38,0x99,0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13, +0xd4,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x1b,0xf5,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, +0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xcf,0x7e,0xf3,0xf, 0x1b, +0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13,0xd4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x4e, +0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c, +0x27,0x74,0x3, 0x19,0xb3,0x0, 0xa, 0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xa3,0x0, 0xa, +0xbe,0xa0,0x3, 0x68,0x3, 0x2, 0x1c,0x3f,0xe4,0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0x4c, +0xaa,0x68,0x3, 0x2, 0x1c,0x7c,0x74,0x2, 0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0xa, 0x3e, +0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xbe,0xb0,0x2, 0x78,0x3, 0x2, 0x1c,0x64,0x60, +0x3, 0x2, 0x1c,0x77,0x74,0x1, 0x7a,0x39,0xb0,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4, +0x19,0xe5,0xe, 0x11,0x2, 0x1c,0x7c,0x74,0x3, 0x7a,0x39,0xb0,0xa, 0x2e,0x2e,0x25, +0x23,0x7e,0x29,0x70,0x19,0x72,0x0, 0xa, 0xb, 0xe0,0xbe,0xe0,0xa, 0x50,0x3, 0x2, +0x1c,0x2, 0xda,0x3b,0x22,0xca,0x3b,0x75,0x24,0x0, 0x75,0x26,0x0, 0x75,0x27,0x0, +0x75,0x28,0x0, 0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x2a,0x7e,0xa3,0xf, 0x24,0x4c,0xaa, +0x78,0xf, 0x7e,0xb3,0xf, 0x20,0x70,0x9, 0x7e,0xb3,0xf, 0x21,0x70,0x3, 0x2, 0x1f, +0x54,0x4c,0xaa,0x78,0x11,0x7e,0xb3,0xf, 0x20,0x60,0x16,0x80,0x9, 0x7e,0x73,0x0, +0xff,0xbe,0x70,0xf, 0x38,0x6, 0x7e,0xb3,0x0, 0x8b,0x60,0xf1,0xe4,0x7a,0xb3,0x0, +0x8b,0x20,0x0, 0x6, 0x7e,0x74,0x15,0xca,0x80,0x4, 0x7e,0x74,0x16,0xc, 0x7d,0x37, +0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xee,0x74,0xaa,0x7a,0x79,0xb0,0x19,0xb7, +0x0, 0x1, 0x7e,0x73,0xf, 0x1d,0x19,0x77,0x0, 0x3, 0x75,0x25,0x0, 0x6c,0xdd,0x2, +0x1e,0xe1,0x7e,0x70,0x7, 0xac,0x7d,0x9, 0xa3,0xe, 0x9d,0x7a,0xa1,0x29,0x7c,0xba, +0x54,0xf, 0xa, 0x2b,0x2e,0x25,0x2a,0x7e,0x29,0xc0,0x7c,0xba,0x54,0xf0,0xbe,0xb0, +0x0, 0x28,0x13,0xb4,0xb0,0x2, 0x80,0x3, 0x2, 0x1e,0xdf,0x53,0x29,0xf, 0xbe,0xc0, +0x1, 0x68,0x3, 0x2, 0x1e,0xdf,0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x1e,0xdf,0x7e,0xa1, +0x25,0x74,0x6, 0xa4,0xf5,0x21,0x9, 0xb3,0xe, 0x9e,0xf5,0x27,0x74,0x7, 0xac,0xbd, +0x9, 0xb5,0xe, 0x9f,0xc4,0x54,0xf0,0xf5,0x28,0x7e,0x73,0xf, 0x46,0xbe,0x71,0x29, +0x28,0x68,0x7e,0xb3,0xf, 0x22,0x70,0x2a,0x7e,0x8, 0x0, 0x27,0xe5,0x29,0xa, 0x3b, +0x2e,0x34,0x0, 0x77,0x74,0x1, 0x7e,0x50,0xf, 0x12,0x5f,0x84,0x7e,0x8, 0x0, 0x28, +0xe5,0x29,0xa, 0x3b,0x2e,0x34,0x0, 0x81,0x74,0x10,0x7e,0x50,0x20,0x12,0x5f,0x84, +0x80,0x14,0xe5,0x29,0xa, 0x3b,0x9, 0xb3,0x0, 0x77,0xf5,0x27,0xe5,0x29,0xa, 0x3b, +0x9, 0xb3,0x0, 0x81,0xf5,0x28,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x2e,0x25,0x2a,0x7e, +0x29,0xb0,0xb4,0x1, 0x15,0xe4,0x19,0xb3,0x0, 0x77,0x6c,0xaa,0xe5,0x29,0xa, 0x3b, +0x19,0xa3,0x0, 0x81,0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0xf, 0x5f,0xb4,0xff, +0x15,0x74,0x7, 0xac,0xbd,0x9, 0xb5,0xe, 0x9d,0xbe,0xb0,0xff,0x68,0x5, 0x75,0x27, +0x1, 0x80,0x3, 0x75,0x27,0x0, 0x7e,0x90,0x7, 0xac,0x9d,0x49,0x54,0xe, 0x99,0x7a, +0x55,0x2c,0x49,0x54,0xe, 0x9b,0x7a,0x55,0x2e,0xbe,0xc0,0x1, 0x78,0x2e,0x75,0x30, +0x0, 0x7e,0x71,0x30,0x74,0x7, 0xac,0x7b,0x9, 0xb3,0x0, 0x90,0x54,0xf, 0xbe,0xb1, +0x29,0x78,0x10,0x49,0x23,0x0, 0x8c,0x7a,0x25,0x2c,0x49,0x53,0x0, 0x8e,0x7a,0x55, +0x2e,0x80,0x9, 0x5, 0x30,0xe5,0x30,0xbe,0xb0,0xa, 0x40,0xd5,0x7e,0x25,0x2c,0x7a, +0x25,0x22,0xa, 0x54,0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x21,0xa, 0x3b,0x7d,0x13, +0x2d,0x17,0x19,0xa1,0x0, 0x5, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x6, 0x7e,0x25, +0x2e,0x7a,0x25,0x22,0xa, 0x14,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x57,0x19,0x35, +0x0, 0x7, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x8, 0xe5,0x27,0x7d,0x23,0x2d,0x27, +0x19,0xb2,0x0, 0x9, 0xe5,0x28,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0xa, 0x9, 0xa4, +0xe, 0x9d,0x7c,0xba,0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x27,0x2e,0x24,0x0, +0x7, 0x7e,0x29,0xb0,0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x21,0xbe,0xc0, +0x1, 0x68,0x2, 0x5, 0x24,0x5, 0x26,0x7c,0xbc,0x3, 0x3, 0x54,0xc0,0x7d,0x13,0x2d, +0x17,0x2e,0x14,0x0, 0x5, 0x7e,0x19,0x50,0x2c,0x5b,0x7a,0x19,0x50,0x80,0xe, 0x2d, +0x37,0x2e,0x34,0x0, 0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x25,0xb, +0xd0,0x7e,0x73,0xf, 0x46,0xbc,0x7d,0x28,0x3, 0x2, 0x1d,0x12,0xe5,0x24,0x19,0xb7, +0x0, 0x4, 0xe5,0x26,0xbe,0xb0,0x0, 0x28,0x2d,0x74,0x42,0x19,0xb7,0x0, 0x2, 0xe4, +0x19,0xb7,0x0, 0x41,0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e, +0x24,0x0, 0x41,0x7e,0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x41, +0x78,0xe4,0xb2,0x0, 0x80,0xe, 0x7e,0xb3,0xf, 0x21,0xb4,0x1, 0xc, 0x7e,0xb3,0x10, +0xd1,0xb4,0x24,0x5, 0x74,0x1, 0x12,0x6e,0xa0,0x7e,0xb3,0xf, 0x20,0x60,0x6, 0x7e, +0x35,0x2a,0x12,0x68,0x19,0xe4,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x20,0x7a,0xb3, +0xf, 0x21,0x80,0x4, 0xe4,0x12,0x6e,0xa0,0x7e,0x24,0xe, 0x99,0x7e,0x34,0x0, 0x8c, +0x7e,0x14,0x0, 0x46,0x12,0x6d,0x4a,0xe5,0x26,0x70,0xd, 0x7e,0x34,0x0, 0x8c,0x7e, +0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xee,0xda,0x3b,0x22,0xca,0x79,0x75,0x26,0x17, +0x7e,0xb3,0xd, 0xf7,0xf5,0x21,0x70,0x3, 0x2, 0x22,0x1d,0x7e,0x34,0x13,0xb6,0x7e, +0x24,0x1, 0x2b,0xe4,0x12,0x6d,0xee,0x7e,0x34,0x14,0xe1,0x7e,0x24,0x0, 0x2, 0xe4, +0x12,0x6d,0xee,0x6c,0xaa,0x2, 0x20,0x32,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, +0x18,0x9, 0x23,0xd, 0x19,0x1a,0x3, 0x1b,0x5, 0x80,0x69,0xbe,0x10,0x0, 0x48,0x62, +0xbe,0x10,0xd, 0x58,0x5d,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25, +0x7c,0xb1,0x54,0x7, 0x7e,0x74,0x0, 0x1, 0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x7c, +0xef,0xa, 0x40,0x2e,0x44,0x14,0xe1,0x7e,0x49,0xb0,0x4c,0xbe,0x7a,0x49,0xb0,0x1a, +0x32,0x1b,0x35,0x7c,0xf7,0x80,0x1f,0xbe,0xf0,0x0, 0x48,0x18,0xe5,0x26,0xbc,0xbf, +0x8, 0x12,0x74,0x1, 0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0x4f,0x2d,0x43, +0x19,0xb4,0x13,0xb6,0xb, 0xf0,0x1a,0x22,0x2e,0x24,0x0, 0x3, 0x1a,0x3f,0xbd,0x32, +0x48,0xd5,0xb, 0x10,0x1a,0x23,0x2e,0x24,0x0, 0x3, 0x1a,0x31,0xbd,0x32,0x48,0x8b, +0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x1f,0xa8,0x6c,0x11,0x7c,0x1, 0xe, +0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, 0x7e,0x44,0x0, 0x1, +0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa, 0x30,0x9, 0xb3,0x14,0xe1,0x5c, +0xbe,0x78,0x3, 0x2, 0x20,0xf9,0x6d,0x33,0x7a,0x35,0x22,0x75,0x24,0x0, 0x1a,0x21, +0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x43,0x2e,0x47,0xf, 0xda,0x6c,0x0, 0x80,0x26, +0x1a,0xe1,0x7e,0xf4,0x0, 0x17,0xad,0xfe,0xa, 0x30,0x2d,0x3f,0x9, 0xb3,0x13,0xb6, +0x70,0x12,0x7e,0x70,0x2, 0xac,0x70,0x2d,0x34,0xb, 0x38,0x30,0x2e,0x35,0x22,0x7a, +0x35,0x22,0x5, 0x24,0xb, 0x0, 0xe5,0x26,0xbc,0xb0,0x38,0xd4,0xe5,0x24,0x60,0x49, +0xe5,0x24,0x1a,0x2b,0x7e,0x35,0x22,0x12,0x47,0xf2,0x7a,0x35,0x22,0x6c,0xff,0x80, +0x32,0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0xff,0x7d,0xe3,0x2d,0xef,0x9, +0xbe,0x13,0xb6,0xb4,0x1, 0x1b,0x1a,0x21,0x7e,0x34,0x0, 0x18,0xad,0x32,0x7d,0x23, +0x2d,0x2f,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x9e,0x35,0x22,0x1b,0x28, +0x30,0xb, 0xf0,0xe5,0x26,0xbc,0xbf,0x18,0xc8,0xb, 0x10,0xa5,0xb9,0xd, 0x2, 0x80, +0x3, 0x2, 0x20,0x3d,0x6c,0xaa,0x2, 0x22,0x14,0x7e,0x10,0x2, 0xac,0x1a,0x9, 0x30, +0xd, 0x18,0x9, 0x20,0xd, 0x19,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xf5,0x25,0x7c,0xba, +0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa5, +0xbb,0x0, 0x2c,0x1a,0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e, +0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x20,0x49,0x33,0x0, 0x30,0xbd,0x32,0x18,0x3, +0x2, 0x21,0xd9,0x1a,0x33,0xb, 0x34,0x7c,0xb7,0x19,0xb0,0xd, 0x18,0x80,0x7a,0xa5, +0xbb,0xc, 0x2c,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x22,0x2d,0x23,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x49,0x2, 0xff,0xd0,0xbd,0x3, 0x8, 0x59, +0x1a,0x33,0x1b,0x34,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x70,0xd, 0x18,0x80,0x4a,0x1a, +0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, +0xda,0x49,0x43,0x0, 0x30,0x49,0x3, 0xff,0xd0,0xbd,0x4, 0x8, 0x16,0xb, 0x38,0x20, +0xbd,0x2, 0x8, 0x25,0x1a,0x23,0x1b,0x24,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x50,0xd, +0x18,0x80,0x16,0xb, 0x38,0x0, 0xbd,0x40,0x8, 0xf, 0x1a,0x33,0xb, 0x34,0x7c,0x37, +0x7e,0x10,0x2, 0xac,0x1a,0x19,0x30,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33, +0xd, 0x18,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x2, 0x2d,0x3, 0x3e,0x4, +0x2e,0x7, 0xf, 0xda,0xb, 0x8, 0x0, 0xbe,0x4, 0x0, 0x3c,0x58,0x15,0x7c,0x7e,0x6e, +0x70,0xff,0xe5,0x25,0xa, 0x4b,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x5c,0xb7,0x7a, +0x49,0xb0,0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x21,0x9, 0xda,0x79,0x22, +0xca,0xd8,0xca,0x79,0x6c,0xaa,0x7e,0x34,0x11,0x9e,0x7e,0x44,0x11,0x4a,0xe4,0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfe,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, +0x17,0xbe,0xb0,0x0, 0x28,0x4f,0x7e,0x53,0xd, 0xf8,0xbe,0x50,0x0, 0x28,0x46,0x6c, +0xff,0x80,0x3c,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x40,0x9, 0xe1,0xd, 0x41, +0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x13,0xb, 0x18,0x0, 0x6d,0x11,0x9e,0x17,0xf, 0x4c, +0xbd,0x1, 0x58,0x19,0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x13,0x49,0x1, 0x0, 0x30,0x6d, +0x11,0x9e,0x17,0xf, 0x4a,0xbd,0x1, 0x58,0x4, 0x5, 0x6b,0x80,0xb, 0xb, 0xf0,0xbc, +0x5f,0x38,0xc0,0x80,0x3, 0x75,0x6b,0x0, 0xe5,0x6b,0xbe,0xb0,0x3, 0x40,0x17,0x7e, +0xb3,0xe, 0xa, 0x44,0x1, 0x7a,0xb3,0xe, 0xa, 0x75,0x6b,0x0, 0x7e,0xb3,0x16,0xbc, +0x44,0x1, 0x7a,0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfd,0x7a,0xb3,0xe, 0xa, +0x7e,0xb3,0xd, 0x16,0x70,0x59,0x7e,0x53,0xd, 0xf7,0xbe,0x50,0x0, 0x28,0x50,0x6c, +0xff,0x80,0x48,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x18,0x9, 0xe1,0xd, 0x19, +0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x14,0x49,0x11,0x0, 0x30,0x6d,0x0, 0x9e,0x7, 0xd, +0xff,0xbd,0x10,0x48,0xe, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x14,0xb, 0x18,0x10,0xbd, +0x10,0x58,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x2, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16, +0xbc,0x44,0x2, 0x7a,0xb3,0x16,0xbc,0x80,0x6, 0xb, 0xf0,0xbc,0x5f,0x38,0xb4,0x7e, +0xb3,0xe, 0x9, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x23,0xc3,0x7e,0xb3,0xd, 0x16,0x70, +0x6d,0x6c,0xff,0x80,0x61,0x7e,0x50,0x2, 0xac,0x5f,0x7d,0x12,0x2d,0x14,0xb, 0x18, +0x10,0xbe,0x17,0xd, 0xff,0x8, 0x4d,0x2d,0x23,0xb, 0x28,0x20,0xbe,0x27,0xd, 0xff, +0x58,0x42,0xbe,0xf1,0x6c,0x68,0x6, 0x7a,0xf1,0x6c,0x75,0x6d,0x0, 0xbe,0xf1,0x6c, +0x78,0x2, 0x5, 0x6d,0xe5,0x6d,0xbe,0xb0,0x10,0x28,0x33,0x75,0x6d,0x10,0xe5,0x51, +0x70,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x4, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x4, 0x7a,0xb3,0x16,0xbc,0x80,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3, +0xe, 0xa, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0x97,0x6c,0xaa, +0x6c,0xff,0x80,0x17,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x34,0xb, 0x38,0x30,0xbe,0x37, +0xd, 0xff,0x8, 0x5, 0x7e,0xa0,0x1, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc, +0xbf,0x38,0xe1,0x4c,0xaa,0x78,0x1a,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, +0xa, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0xb3,0x16,0xbc,0x54,0xfb,0x7a,0xb3,0x16, +0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xf7,0x7a,0xb3,0xe, 0xa, 0x7e,0x73,0xd, 0xfa,0xa, +0x27,0x7e,0x73,0xd, 0xf9,0xa, 0x37,0x2d,0x32,0xbe,0x37,0xe, 0x3, 0x28,0x14,0x7e, +0xb3,0xe, 0xa, 0x44,0x8, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc,0x44,0x8, 0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x44,0x10,0x7a,0xb3,0xe, 0xa, 0x6c,0xff,0x80, +0x49,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70, +0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30, +0x49,0x22,0x10,0x3, 0x9d,0x32,0x7a,0x35,0x21,0x12,0x6d,0xde,0xbe,0x37,0xe, 0x1, +0x28,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xef,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x10,0x7a,0xb3,0x16,0xbc,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f, +0x38,0xaf,0x7e,0x34,0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x12,0x6d,0xee,0x6c,0xff, +0x80,0x25,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e, +0x70,0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x30,0x59,0x32,0x10,0x3, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xd3,0xda, +0x79,0xda,0xd8,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x21,0x75,0x25,0x0, 0x75,0x26, +0x0, 0x7e,0x23,0xd, 0xf7,0x7a,0x21,0x23,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x13,0xb6, +0x7e,0x30,0x2, 0xac,0x23,0x7e,0x24,0xd, 0x18,0x7e,0x34,0x13,0xb8,0x12,0x6d,0x4a, +0xe5,0x23,0xbe,0xb0,0xa, 0x38,0x3, 0x2, 0x26,0xb9,0x75,0x24,0x0, 0x6c,0xff,0x2, +0x25,0xcd,0x7e,0x34,0x3, 0xff,0x7a,0x35,0x27,0x75,0x26,0xff,0x6c,0xee,0x80,0x7e, +0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x13,0xb8,0xbe,0xb0,0xff,0x68,0x6e,0x7c,0xbe, +0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7a,0xa1,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x2c,0xa, 0x2a,0x9, 0xb2, +0xd, 0x68,0x55,0x2c,0x68,0x46,0x9, 0x73,0x13,0xb9,0xa, 0x27,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0x15,0xa3,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xde,0x7d,0x63,0x74,0x2, 0xac, +0xbe,0x9, 0x75,0x13,0xb8,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa2,0xa, +0x37,0x9d,0x32,0x12,0x6d,0xde,0x2d,0x36,0x7a,0x35,0x29,0x7e,0x35,0x27,0xbe,0x35, +0x29,0x28,0x9, 0x7e,0x35,0x29,0x7a,0x35,0x27,0x7a,0xe1,0x26,0xb, 0xe0,0xe5,0x23, +0xbc,0xbe,0x28,0x3, 0x2, 0x25,0x0, 0xe5,0x26,0xbe,0xb0,0xff,0x68,0x3d,0x7e,0x71, +0x26,0x74,0x2, 0xac,0x7b,0x9, 0x33,0x13,0xb8,0x7e,0x50,0x18,0xac,0x53,0x9, 0xa3, +0x13,0xb9,0xa, 0xa, 0x2d,0x20,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28,0x20,0xbe, +0x24,0x0, 0x3c,0x48,0x16,0xe5,0x24,0x1a,0x2b,0x3e,0x24,0x19,0x32,0x13,0xe0,0x19, +0xa2,0x13,0xe1,0x74,0xff,0x19,0xb3,0x13,0xb8,0x5, 0x24,0xb, 0xf0,0xe5,0x11,0xbc, +0xbf,0x28,0x3, 0x2, 0x24,0xf2,0x7e,0xf1,0x24,0x2, 0x26,0x9f,0x6d,0x33,0x7a,0x35, +0x21,0x7e,0xa0,0xff,0x6c,0xee,0x2, 0x26,0x71,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c, +0x7b,0x7a,0x71,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0xb9,0xf5,0x2c,0xa, 0x37,0x9, 0xb3,0xd, 0x68,0x55,0x2c,0x68, +0x5e,0x7e,0x90,0x2, 0xac,0x9e,0x9, 0x44,0x13,0xb8,0xbe,0x40,0xff,0x68,0x50,0x7e, +0x50,0x18,0xac,0x45,0x9, 0xb4,0x13,0xb9,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27, +0x13,0xb6,0xb, 0x28,0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30, +0x7e,0x50,0x2, 0xac,0x5e,0x9, 0x62,0x13,0xb8,0x7e,0x30,0x18,0xac,0x36,0x9, 0x72, +0x13,0xb9,0xa, 0x7, 0x2d,0x10,0x3e,0x14,0x2e,0x17,0x13,0xb6,0xb, 0x18,0x40,0xbe, +0x45,0x21,0x8, 0xb, 0x7a,0x61,0x25,0x7a,0x71,0x26,0x7a,0x45,0x21,0x7c,0xae,0xb, +0xe0,0xe5,0x23,0xbc,0xbe,0x28,0x3, 0x2, 0x25,0xe9,0xbe,0xa0,0xff,0x68,0x1e,0x7e, +0x71,0x25,0x7e,0x90,0x2, 0xac,0x9f,0x19,0x74,0x13,0xe0,0xe5,0x26,0x19,0xb4,0x13, +0xe1,0x7e,0x70,0xff,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x13,0xb8,0xb, 0xf0,0xbe, +0xf0,0xa, 0x50,0x3, 0x2, 0x25,0xdc,0x7e,0x24,0x13,0xe0,0x7e,0x34,0x13,0xb8,0x7e, +0x14,0x0, 0x28,0x12,0x6d,0x4a,0x75,0x23,0xa, 0x7e,0x34,0x15,0xa2,0x7e,0x24,0x0, +0x14,0x74,0xff,0x12,0x6d,0xee,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0x55,0x7e,0x31,0x23, +0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x4a,0x7e, +0x31,0x23,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0x15,0xa2,0x12,0x6d, +0x4a,0x6c,0xff,0x80,0x27,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7c,0x67,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24, +0xd, 0x68,0x7e,0x29,0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xf0,0xe5,0x23,0xbc,0xbf, +0x38,0xd3,0x85,0x23,0x11,0xe5,0x23,0x7a,0xb3,0xd, 0xf7,0xda,0x3b,0x22,0x7c,0x7b, +0xbe,0x70,0x10,0x40,0x12,0xbe,0x70,0x4b,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x16,0x4f, +0x9e,0x34,0x0, 0x10,0x2, 0x29,0x69,0xa5,0xbf,0x0, 0x3, 0xe5,0xb, 0x22,0xa5,0xbf, +0x1, 0x3, 0xe5,0xd, 0x22,0xa5,0xbf,0x2, 0x5, 0x7e,0xb3,0xf, 0x28,0x22,0xbe,0x70, +0x3, 0x40,0x12,0xbe,0x70,0x5, 0x38,0xd, 0xa, 0x37,0x2e,0x34,0x10,0x2b,0x9e,0x34, +0x0, 0x3, 0x2, 0x29,0x69,0xa5,0xbf,0x6, 0x3, 0x74,0x1, 0x22,0xa5,0xbf,0x7, 0x5, +0x7e,0xb3,0x10,0x4b,0x22,0xa5,0xbf,0x8, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e, +0xb3,0xa, 0xac,0x22,0x7e,0xb3,0x11,0x16,0x22,0xa5,0xbf,0x9, 0x10,0x7e,0xb3,0x10, +0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xad,0x22,0x7e,0xb3,0x11,0x49,0x22,0xa5,0xbf,0xa, +0x5, 0x7e,0xb3,0x10,0x3b,0x22,0xa5,0xbf,0xb, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, +0x7e,0xb3,0xa, 0xae,0x22,0x7e,0xb3,0x11,0x94,0x22,0xa5,0xbf,0xc, 0x10,0x7e,0xb3, +0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xd, 0xfe,0x22,0x7e,0xb3,0x11,0x9d,0x22,0xa5,0xbf, +0x4c,0x5, 0x7e,0xb3,0xf, 0x46,0x22,0xa5,0xbf,0xfb,0x3, 0xe5,0x8, 0x22,0xa5,0xbf, +0x4e,0x5, 0x7e,0xb3,0x10,0x4a,0x22,0xbe,0x70,0x50,0x40,0x12,0xbe,0x70,0x51,0x38, +0xd, 0xa, 0x37,0x2e,0x37,0x10,0x2f,0x9e,0x34,0x0, 0x50,0x2, 0x29,0x69,0xbe,0x70, +0x52,0x40,0x12,0xbe,0x70,0x55,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x31,0x9e,0x34, +0x0, 0x52,0x2, 0x29,0x69,0xbe,0x70,0x56,0x40,0x12,0xbe,0x70,0x62,0x38,0xd, 0xa, +0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x56,0x2, 0x29,0x69,0xbe,0x70,0x63,0x40, +0x12,0xbe,0x70,0x7a,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x63, +0x2, 0x29,0x69,0xbe,0x70,0x7b,0x50,0x3, 0x2, 0x28,0xfd,0xbe,0x70,0x9f,0x28,0x3, +0x2, 0x28,0xfd,0x7e,0xb3,0x10,0x3b,0x70,0x4a,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe, +0x24,0x0, 0x18,0x58,0x22,0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e, +0x39,0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c, +0xab,0x80,0x19,0x1e,0xa0,0x80,0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, +0x93,0x7e,0x39,0x70,0xa, 0x57,0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3, +0xf, 0xdc,0x22,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x22,0xa, +0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba,0x30,0xe0, +0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e,0xa0,0x80, +0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70,0xa, 0x57, +0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0x63,0x22,0xbe,0x70,0xa0, +0x40,0x11,0xbe,0x70,0xac,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6c,0x9e,0x34,0x0, +0xa0,0x80,0x56,0xbe,0x70,0xad,0x40,0x11,0xbe,0x70,0xb9,0x38,0xc, 0xa, 0x37,0x2e, +0x37,0x10,0x6e,0x9e,0x34,0x0, 0xad,0x80,0x40,0xbe,0x70,0xba,0x40,0x11,0xbe,0x70, +0xd1,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x70,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe, +0x70,0xd2,0x40,0x11,0xbe,0x70,0xd5,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x72,0x9e, +0x34,0x0, 0xd2,0x80,0x14,0xbe,0x70,0xd6,0x40,0x13,0xbe,0x70,0xed,0x38,0xe, 0xa, +0x37,0x2e,0x37,0x10,0x74,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xa5,0xbf,0xf8, +0x5, 0x7e,0xb3,0x11,0xe8,0x22,0xa5,0xbf,0xfe,0x3, 0xe5,0xc, 0x22,0x74,0xff,0x22, +0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20,0x0, 0x41,0x0, 0x42,0x0, 0x22, +0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40,0x0, 0xa3,0x0, 0xa5,0x0, 0x44, +0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60,0x0, 0xe5,0x0, 0xe8,0x0, 0x66, +0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80,0x1, 0x47,0x1, 0x4b,0x0, 0x88, +0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0,0x1, 0x89,0x1, 0xad,0x0, 0xaa, +0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xaa, +0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0,0x1, 0x69,0x1, 0x6c,0x0, 0x88, +0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80,0x1, 0x27,0x1, 0x9, 0x0, 0x66, +0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60,0x0, 0xc5,0x0, 0xc6,0x0, 0x44, +0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40,0x0, 0x83,0x0, 0x64,0x0, 0x22, +0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20,0x0, 0x21,0x0, 0x21,0x0, 0x0, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0xca,0x3b,0x7e,0x34,0x13,0xff,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6d,0xee,0x7e,0xe0, +0x1, 0x7e,0x73,0x10,0x4d,0x7a,0x73,0x13,0xb6,0xe4,0x7a,0xb3,0x10,0x4d,0x6c,0xdd, +0x6c,0xcc,0x80,0x11,0xa, 0x3c,0x2e,0x37,0x10,0x6e,0x7e,0x39,0x70,0xbc,0x7d,0x40, +0x2, 0x7c,0xd7,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc,0x7c,0x38,0xe7,0xbe,0xd0,0x1f, +0x50,0xc, 0xa, 0x2d,0x7e,0x34,0x0, 0x1f,0x9d,0x32,0x7c,0xd7,0x80,0x2, 0x6c,0xdd, +0x7a,0xd1,0x21,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10,0x2b,0x12,0x6a, +0x72,0x2, 0x2d,0x7d,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37, +0xa, 0xaf,0x12,0x6e,0xdd,0x12,0x69,0x31,0x12,0x6e,0x86,0x60,0xfb,0xa9,0xb7,0xea, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x82,0x6c, +0xcc,0x80,0x78,0x6c,0xff,0x80,0x6a,0x4c,0xcc,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3, +0x13,0xe7,0x6d,0x33,0x74,0x2, 0xac,0xbf,0x59,0x35,0x13,0xb7,0xbe,0xf0,0x17,0x78, +0x13,0x7e,0x34,0x0, 0x1, 0x7c,0xbc,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x5e,0x34, +0x4, 0x44,0x68,0x3b,0x7e,0x50,0x30,0xac,0x5c,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x32, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, +0x14,0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xa, 0x3f,0x2e,0x34,0x13,0xe7,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xb, +0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0x8e,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc, +0x7c,0x38,0x80,0x75,0x22,0x0, 0x6c,0xcc,0x2, 0x2d,0x5b,0xa, 0x3c,0x9, 0xa3,0x13, +0xe7,0x4c,0xaa,0x78,0xf, 0x7e,0x44,0x22,0xc4,0x7e,0x70,0x2, 0xac,0x7c,0x59,0x43, +0x13,0xb7,0x80,0x25,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x12,0x13,0xb7,0xa, 0xa, 0x8d, +0x10,0x59,0x12,0x13,0xb7,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x32, +0x13,0xb7,0xbe,0x34,0x1f,0xa4,0x50,0x22,0xa, 0x1c,0x2e,0x14,0x13,0xff,0x7e,0x19, +0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1c,0x2e,0x17,0x10,0x74,0x7e,0x19,0xb0,0xbc,0xbd, +0x50,0x2f,0x4, 0x7a,0x19,0xb0,0x80,0x31,0x80,0x27,0xbe,0x34,0x25,0xe4,0x28,0x27, +0xa, 0x3c,0x2e,0x34,0x13,0xff,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xa, 0x3c,0x2e, +0x37,0x10,0x74,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14,0x7a,0x39,0xb0,0x80, +0x8, 0x5, 0x22,0x6c,0xee,0x80,0x2, 0x5, 0x22,0xb, 0xc0,0x7e,0x73,0x10,0x2c,0xbc, +0x7c,0x28,0x3, 0x2, 0x2c,0xbb,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10, +0x2b,0x12,0x6a,0x72,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x22,0x68,0xf, 0x7e,0xa1,0x21, +0x7c,0xba,0x14,0xf5,0x21,0x4c,0xaa,0x68,0x3, 0x2, 0x2c,0x4, 0x7e,0x73,0x13,0xb6, +0x7a,0x73,0x10,0x4d,0x6c,0xff,0x80,0x10,0xa, 0x3f,0x9, 0x73,0x13,0xff,0xbc,0x7d, +0x78,0x4, 0x6c,0xee,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0xe8, +0x7c,0xbe,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xb3,0x10,0x3c,0xf5,0x21,0xe4,0x7a,0xb3, +0x10,0x3c,0x7e,0xb3,0x10,0x3a,0xf5,0x22,0x74,0x3, 0x7a,0xb3,0x10,0x3a,0x7e,0x37, +0x10,0x48,0x7e,0x24,0x0, 0x25,0xe4,0x12,0x6d,0xee,0x7e,0xe0,0x7, 0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xdd,0x6c,0xdd, +0x7e,0x14,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0xa, 0x2d,0x2e, +0x27,0x10,0x48,0x7e,0x29,0x70,0x4c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25, +0x78,0xde,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x10,0x7e,0x34,0x10,0x2b,0x12,0x64,0xb9, +0x12,0x6e,0x8f,0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xde,0x6c, +0xdd,0xbe,0xd0,0x18,0x50,0x1e,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c, +0xbf,0x30,0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x16, +0x1e,0xf0,0x80,0x12,0xa, 0x3d,0x2e,0x37,0x10,0x33,0x9, 0x73,0xff,0xe8,0xa, 0x37, +0x2e,0x34,0x0, 0x18,0x7c,0xf7,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0xb, +0x38,0x30,0xbe,0x34,0x25,0x80,0x18,0x21,0x7e,0x34,0x0, 0x1, 0x7c,0xbe,0x60,0x5, +0x3e,0x34,0x14,0x78,0xfb,0x7d,0x13,0x6e,0x14,0xff,0xff,0xa, 0x2f,0x2e,0x27,0x10, +0x48,0x7e,0x29,0x70,0x5c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78,0x91, +0x1b,0xe0,0xbe,0xe0,0x0, 0x48,0x3, 0x2, 0x2d,0xdd,0x7e,0xe0,0xa, 0x74,0x2, 0x7a, +0xb3,0x10,0x3a,0x2, 0x2f,0xac,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac, +0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xdd,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10, +0x2c,0xa, 0x65,0x2d,0x63,0x7c,0xcd,0x6c,0xdd,0x2, 0x2f,0x74,0x7e,0xa3,0x10,0x2c, +0xbc,0xad,0x28,0x27,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf,0x30, +0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x2, 0x1e,0xf0, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x80,0x27,0xa, 0x2a,0xa, 0x3d,0x9d, +0x32,0x2e,0x37,0x10,0x33,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34,0x0, 0x18,0x7c,0xf7, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xa4, +0x9d,0x35,0xb, 0x38,0x30,0x7a,0x35,0x23,0xbe,0x34,0x2e,0xe0,0x8, 0x18,0x4c,0xee, +0x68,0x30,0xa, 0x2f,0x2e,0x27,0x10,0x48,0x7e,0x29,0xb0,0xbe,0xb0,0xfe,0x50,0x22, +0x4, 0x7a,0x29,0xb0,0x80,0x1c,0xbe,0x34,0x17,0x70,0x58,0x14,0xa, 0x3f,0x2e,0x37, +0x10,0x48,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x7a,0x39,0xb0,0x80,0x2, +0x1b,0xc0,0xb, 0xd0,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c,0xa, 0x25, +0x2d,0x23,0xa, 0x3d,0xbd,0x32,0x58,0x3, 0x2, 0x2e,0xdc,0x4c,0xcc,0x68,0x28,0x7e, +0x34,0x10,0x2b,0x12,0x5b,0x10,0x7e,0x34,0x10,0x2b,0x12,0x64,0xb9,0x12,0x6e,0x8f, +0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xde,0x7c,0xae,0x1b,0xe0, +0x4c,0xaa,0x68,0x3, 0x2, 0x2e,0xb6,0xe5,0x21,0x7a,0xb3,0x10,0x3c,0xe5,0x22,0x7a, +0xb3,0x10,0x3a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x24,0x15,0x56,0x7e,0x34, +0x13,0xfe,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x4a,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13, +0xb6,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x4a,0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x13,0xfc, +0x7e,0x73,0xf, 0x1c,0x7a,0x73,0x13,0xfd,0x7e,0xa3,0x13,0xfc,0xbe,0xa0,0x1, 0x38, +0x3, 0x7e,0xf0,0x1, 0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0xe4,0x80,0x10,0x7e,0xb3,0x15, +0xa1,0x4, 0x7a,0xb3,0x15,0xa1,0xbe,0xb0,0xc8,0x28,0x6, 0x74,0x14,0x7a,0xb3,0x15, +0xa1,0x7e,0xb3,0x15,0xa1,0xbe,0xb0,0x6, 0x50,0x3, 0x7e,0xf0,0x1, 0xbe,0xa0,0x1, +0x28,0x3f,0x7e,0x34,0x0, 0x21,0x7e,0x24,0x0, 0x23,0x7e,0x14,0x13,0xfe,0x12,0x65, +0xb6,0x7e,0x34,0x0, 0x25,0x7e,0x24,0x0, 0x27,0x7e,0x14,0x13,0xb6,0x12,0x65,0xb6, +0x7e,0x35,0x25,0x9e,0x35,0x21,0x12,0x6d,0xde,0xbe,0x34,0x0, 0x80,0x18,0xf, 0x7e, +0x35,0x27,0x9e,0x35,0x23,0x12,0x6d,0xde,0xbe,0x34,0x0, 0x80,0x8, 0x3, 0x7e,0xf0, +0x1, 0xbe,0xf0,0x0, 0x28,0x3, 0x2, 0x31,0x24,0x7e,0xf3,0x15,0x9f,0xbe,0xf3,0x15, +0x29,0x50,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73,0x13,0xfc,0x28,0x12,0x7e,0x24,0x15, +0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x4a,0x2, 0x31,0x24,0x7e, +0x73,0x15,0x9e,0xbe,0x70,0x2, 0x58,0x22,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x4a,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3, +0x15,0x53,0x7e,0xb3,0x15,0x9e,0x4, 0x2, 0x31,0x60,0x74,0x1, 0x7a,0xb3,0x15,0xa0, +0xe4,0x7a,0xb3,0x15,0x53,0x2, 0x31,0x60,0xbe,0xf3,0x15,0x29,0x78,0x2d,0x7e,0xa3, +0x15,0x29,0xbe,0xa3,0x13,0xfc,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a, +0xb3,0x15,0x53,0x80,0x6b,0xbe,0xa3,0x13,0xfc,0x28,0x4, 0x74,0x1, 0x80,0x1, 0xe4, +0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0x80,0x55,0x7e,0x73,0x15,0x29,0xbe, +0x73,0x13,0xfc,0x50,0x1a,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, +0x48,0x12,0x6d,0x4a,0xe4,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0x53,0x80,0x31,0x7e, +0x73,0x15,0x53,0xbe,0x70,0x2, 0x58,0x1c,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x4a,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0x7e,0xb3,0x15, +0x53,0x4, 0x80,0x7, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0xe4, +0x7a,0xb3,0x15,0x9e,0x7e,0xb3,0x15,0xa0,0x14,0x68,0x9, 0x4, 0x78,0x15,0x7e,0x24, +0x13,0xb6,0x80,0x4, 0x7e,0x24,0x14,0xe3,0x7e,0x34,0x15,0x56,0x7e,0x14,0x0, 0x48, +0x12,0x6d,0x4a,0x7e,0x73,0x15,0x29,0x7a,0x73,0x15,0x9f,0x7e,0x24,0x13,0xb6,0x7e, +0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x4a,0x7e,0x24,0x15,0x56,0x7e,0x34, +0xe, 0xd, 0x7e,0x14,0x0, 0x46,0x12,0x6d,0x4a,0x7e,0x73,0x15,0x9c,0x7a,0x73,0xf, +0x1b,0x7e,0x73,0x15,0x9d,0x7a,0x73,0xf, 0x1c,0xda,0xf8,0x22,0xca,0x79,0x7d,0x73, +0x12,0x60,0xdc,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27, +0x0, 0x27,0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c, +0xe, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49, +0x27,0x0, 0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34, +0x1c,0x14,0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c, +0x67,0x6c,0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38, +0x10,0x9, 0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, +0x25,0x4d,0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27, +0x7e,0x34,0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20, +0x6c,0xaa,0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e, +0x34,0x1c,0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, +0x4b,0x2d,0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe, +0xa0,0x19,0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e, +0x70,0x2, 0xac,0x7a,0x2e,0x34,0x29,0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e, +0x24,0x1c,0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x2b, +0x7e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x2b, +0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, +0xa0,0xbe,0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x5d,0xcb,0x49,0x27,0x0, 0x39,0x7e, +0x34,0x1c,0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33, +0x7e,0x34,0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, +0xb7,0x0, 0x1, 0x12,0x64,0x78,0x49,0x37,0x0, 0x47,0x12,0x7, 0xc9,0x49,0x37,0x0, +0x49,0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x5c,0xa5,0x49,0x27,0x0, 0x35, +0x7e,0x34,0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b, +0x38,0x20,0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22, +0xca,0x3b,0x6d,0x33,0x7a,0x35,0x23,0x7e,0xb3,0xf, 0x1b,0x60,0x6, 0x7e,0xb3,0xf, +0x1c,0x60,0x11,0xe5,0x22,0x60,0x5, 0x75,0x19,0x1, 0x80,0x3, 0x75,0x19,0x0, 0xe5, +0x19,0x2, 0x35,0x1f,0x7e,0xb3,0xd, 0x18,0xf5,0x21,0x7e,0x73,0xd, 0x19,0x7a,0x71, +0x22,0x6d,0x66,0x75,0x25,0x0, 0x75,0x26,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x3a,0x7e, +0x51,0x21,0x74,0x18,0xac,0x5b,0x2d,0x27,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28, +0x10,0xbe,0x14,0x0, 0x3c,0x8, 0x28,0x5, 0x25,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0x8, +0x49,0x12,0xff,0xd0,0x2d,0x61,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, 0x50,0x8, 0x49, +0x22,0x0, 0x30,0x2d,0x62,0x5, 0x26,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc0,0x7d, +0x73,0x80,0x38,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0x2d,0x37,0x3e,0x34,0x2e,0x37, +0xf, 0xda,0xb, 0x38,0x20,0xbe,0x24,0x0, 0x3c,0x8, 0x2c,0x5, 0x25,0xe5,0x21,0xbe, +0xb0,0x0, 0x28,0x8, 0x49,0x23,0xff,0xd0,0x2d,0x62,0x5, 0x26,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x8, 0x49,0x33,0x0, 0x30,0x2d,0x63,0x5, 0x26,0x7d,0x37,0xb, 0x34,0x7d, +0x73,0xbe,0x34,0x0, 0x18,0x48,0xbc,0xe5,0x25,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12, +0x7d,0x36,0x12,0x6d,0xde,0xe5,0x26,0xa, 0x2b,0x12,0x47,0xf2,0xbe,0x34,0x0, 0xf, +0x8, 0x8, 0x75,0x19,0x1, 0x74,0x1, 0x2, 0x35,0x1f,0x6d,0x33,0xe5,0x21,0xbe,0xb0, +0x0, 0x28,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0xff,0xd0,0x2d,0x32,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0x0, 0x30,0x2d,0x32,0x7e,0xa0,0x8, 0x80, +0x2d,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2e,0x14,0x6d,0xce,0x7a,0x31,0x82,0x7a, +0x21,0x83,0xe4,0x93,0x1a,0x1b,0xbd,0x13,0x8, 0x14,0x2e,0x24,0x6d,0xcf,0x7a,0x51, +0x82,0x7a,0x41,0x83,0xe4,0x93,0x1a,0x2b,0x2e,0x25,0x23,0x7a,0x25,0x23,0x7c,0x5a, +0x1b,0xa0,0xa5,0xbd,0x0, 0xcb,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0xe5,0x22,0xa, +0x2b,0x2d,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x12,0x6d,0xde,0xbe, +0x34,0x3, 0xe8,0x8, 0xa, 0x7e,0x35,0x23,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x23,0x7e, +0x35,0x23,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x23,0xe5, +0x19,0xa, 0x3b,0xbe,0x35,0x23,0x50,0x5, 0x7e,0x55,0x23,0xf5,0x19,0xe5,0x19,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x9b,0x7d,0xa3,0xbe,0x90,0x1, 0x28,0x1e,0xa, 0x15,0x1b, +0x15,0xa, 0x39,0xbd,0x31,0x58,0x14,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b, +0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x61,0x7d,0xb3,0x80,0x7, 0xbe,0x90,0x1, 0x78,0x15, +0x6d,0xbb,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d, +0x61,0x7d,0xc3,0x80,0x8, 0x4c,0x99,0x78,0x38,0x6d,0xcc,0x7d,0xbc,0x74,0x2, 0xac, +0xb9,0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x61,0x7d,0xd3,0x7e,0x70,0x2, +0xac,0x79,0x2d,0x3a,0x49,0x33,0x0, 0x2, 0x12,0x6d,0x61,0x7d,0xe3,0x74,0x2, 0xac, +0xb9,0x7d,0xf5,0x2d,0xfa,0x49,0x3f,0x0, 0x4, 0x12,0x6d,0x61,0x7d,0xf3,0x2, 0x36, +0x2d,0x7c,0xb5,0x24,0xfe,0xbc,0xb9,0x78,0x46,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d, +0xba,0x1b,0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x61,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79, +0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x61,0x7d,0xc3,0x74,0x2, 0xac,0xb9, +0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x61,0x7d,0xd3,0x74,0x2, 0xac,0xb9, +0x2d,0xa5,0x49,0x3a,0x0, 0x2, 0x12,0x6d,0x61,0x7d,0xe3,0x6d,0xff,0x80,0x3e,0x7c, +0xb5,0x14,0xbc,0xb9,0x78,0x37,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6, +0xb, 0xb8,0x30,0x12,0x6d,0x61,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b, +0x35,0xb, 0x38,0x30,0x12,0x6d,0x61,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d,0xd5,0x2d, +0xda,0xb, 0xd8,0x30,0x12,0x6d,0x61,0x7d,0xd3,0x6d,0xff,0x7d,0xef,0xa, 0x79,0x6d, +0x66,0x7f,0x3, 0x1b,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x7f,0x41, +0x7f,0x3, 0x1b,0xd, 0x7d,0x3b,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0x7d, +0x3d,0x1a,0x26,0x1a,0x24,0xa, 0x19,0x6d,0x0, 0x12,0x48,0x24,0x2f,0x41,0xa, 0x19, +0x6d,0x0, 0xb, 0xc, 0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0xa, +0x19,0x6d,0x0, 0xb, 0xd, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x14, +0x7d,0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x5b,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1d, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x7d,0x5e,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1f, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x48,0x40, +0x2e,0x34,0x0, 0x20,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xf, 0x1b,0x7e,0x64,0xe, +0xdf,0xe5,0x51,0xb4,0x1, 0x21,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x1a,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0x13,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0xa, 0x74,0x1e,0x7a, +0xb3,0xf, 0x26,0x74,0x14,0x80,0x8, 0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a, +0xb3,0xf, 0x27,0x4c,0xff,0x78,0xd, 0x75,0x1a,0x0, 0x7e,0xb3,0xf, 0x26,0x12,0x6e, +0xaf,0x2, 0x38,0x47,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14, +0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, +0x74,0x1, 0x80,0x1, 0xe4,0xb4,0x1, 0x9, 0xe5,0x1a,0x70,0x5, 0x75,0x17,0x1e,0xf5, +0x18,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80, +0x1, 0xe4,0xf5,0x1a,0x6c,0xee,0x7e,0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xe, 0x9d,0xf5, +0x21,0xbe,0xb0,0xff,0x78,0x3, 0x2, 0x38,0x3d,0xe5,0x21,0xa, 0x2b,0x2d,0x26,0x7e, +0x29,0xb0,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x38,0x3d,0x49,0x33,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x74,0x12,0x6d,0xbe,0x7a,0x35,0x22,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0x9b,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x76, +0x12,0x6d,0xbe,0x7a,0x35,0x24,0xe5,0x17,0xa, 0x3b,0xbe,0x35,0x22,0x28,0x56,0xbe, +0x35,0x24,0x28,0x51,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x74,0x74,0x7, +0xac,0xbe,0x59,0x35,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x76, +0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0x9b,0xe5,0x21,0xa, 0x3b,0x2d,0x36,0x7e,0x39, +0xb0,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, 0x28,0x2, 0x1b,0xf0,0x4c,0xff,0x78,0x4e,0x5, +0x18,0x7e,0x73,0xf, 0x27,0xbe,0x71,0x17,0x28,0x43,0xe5,0x18,0xbe,0xb0,0x32,0x40, +0x3c,0x5, 0x17,0x80,0x35,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x59,0x35,0x13,0x74,0x49,0x34,0xe, 0x9b,0x59,0x35,0x13,0x76, +0x7e,0x73,0xf, 0x26,0xbe,0x71,0x17,0x78,0x8, 0x7e,0xb3,0xf, 0x27,0xf5,0x17,0x80, +0x9, 0xe5,0x17,0xbe,0xb0,0x1, 0x28,0x2, 0x15,0x17,0x75,0x18,0x0, 0xb, 0xe0,0xbe, +0xe0,0xa, 0x68,0x3, 0x2, 0x37,0x56,0xda,0x3b,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3, +0x10,0x2b,0xf5,0x24,0x7e,0xe3,0x10,0x2c,0x1b,0xe0,0x6c,0xdd,0x7e,0x70,0x30,0xac, +0x7d,0x2e,0x37,0xf, 0xda,0x49,0x33,0x0, 0x2e,0x74,0x2, 0xac,0xbd,0x59,0x35,0x13, +0xb6,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0x7e,0xb3,0xf, 0xd3,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x39,0xc1,0x6c,0xcc,0x2, 0x39,0xb2,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3, +0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19,0xf5,0x23,0x75,0x21,0x3, 0x7e,0x73,0xe, +0x12,0xbe,0x70,0x20,0x50,0xa, 0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x3, 0x75,0x21,0x1, +0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, 0x75,0x21,0x2, 0x74,0x8, 0x7a,0xb3,0xf, 0x53, +0xe5,0x22,0xbe,0xb0,0x0, 0x28,0x21,0xe5,0x24,0xa, 0x2b,0x1b,0x24,0xe5,0x22,0xa, +0x3b,0xbd,0x32,0x58,0x13,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x23,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x21,0x2, 0x75,0x25,0x0, 0x80,0x45, +0xe5,0x25,0xbc,0xbc,0x68,0x3d,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xd, +0x18,0x7a,0xa1,0x26,0x9, 0xb3,0xd, 0x19,0xf5,0x27,0xa, 0x2a,0xe5,0x22,0xa, 0x3b, +0x9d,0x32,0x12,0x6d,0xde,0xbe,0x34,0x0, 0x3, 0x18,0x18,0xe5,0x27,0xa, 0x2b,0xe5, +0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xde,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x21, +0x1, 0x80,0xb, 0x5, 0x25,0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x25,0x38,0xb2,0xe5,0x51, +0xb4,0x1, 0x20,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x19,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, +0x12,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x9, 0x75,0x21,0x3, 0x74,0x1e,0x7a, +0xb3,0xf, 0x53,0xe5,0x23,0xbe,0xb0,0x17,0x50,0x1a,0x6c,0xdd,0x6d,0x33,0x7e,0x50, +0x30,0xac,0x5d,0x2e,0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, +0x78,0xec,0x80,0x3, 0x75,0x21,0x0, 0xe5,0x21,0x7c,0x7c,0x7c,0x6f,0x12,0x11,0xa0, +0x6c,0xdd,0x74,0x2, 0xac,0xbd,0x49,0x35,0x13,0xb6,0x7e,0x50,0x30,0xac,0x5d,0x2e, +0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0xb, 0xf0, +0xb, 0xc0,0x7e,0x73,0xd, 0xf7,0xbc,0x7c,0x28,0x3, 0x2, 0x38,0x89,0x7a,0xf3,0xd, +0xf7,0xda,0x3b,0x22,0xca,0x3b,0x7d,0x73,0x7e,0xb3,0xd, 0xf7,0xf5,0x4c,0x7e,0x37, +0xf, 0xda,0x7a,0x35,0x4f,0x75,0x42,0x0, 0x7e,0xc0,0x1, 0x80,0x19,0xe5,0x42,0xa, +0x3b,0x2d,0x37,0x7e,0x39,0x60,0xa, 0x2c,0x2d,0x27,0x7e,0x29,0x70,0xbc,0x76,0x40, +0x3, 0x7a,0xc1,0x42,0xb, 0xc0,0xe5,0x4c,0xbc,0xbc,0x38,0xe1,0xe5,0x42,0xa, 0x3b, +0x2d,0x37,0x7e,0x39,0xb0,0xf5,0x42,0x75,0x44,0x0, 0x7e,0xc0,0x1, 0x2, 0x3b,0xe, +0x75,0x4b,0x0, 0x6d,0x33,0x7a,0x35,0x4d,0x6c,0xdd,0x75,0x45,0x0, 0x75,0x46,0x0, +0x75,0x43,0x0, 0x2, 0x3a,0xc3,0x7e,0x71,0x43,0x74,0x2, 0xac,0x7b,0x9, 0xb3,0xd, +0x18,0xf5,0x47,0x9, 0xb3,0xd, 0x19,0xf5,0x48,0xe5,0x43,0xa, 0x3b,0x2d,0x37,0x7e, +0x39,0x70,0xbc,0x7c,0x78,0x7b,0xb, 0xd0,0xe5,0x47,0x25,0x45,0xf5,0x45,0xe5,0x48, +0x25,0x46,0xf5,0x46,0x7e,0x51,0x47,0xac,0x5d,0xe5,0x45,0xa, 0x3b,0x9d,0x32,0x12, +0x6d,0xde,0x7c,0xb7,0xf5,0x49,0x7e,0x51,0x48,0xac,0x5d,0xe5,0x46,0xa, 0x3b,0x9d, +0x32,0x12,0x6d,0xde,0x7c,0xb7,0xf5,0x4a,0x7e,0x51,0x4b,0xac,0x5d,0xe5,0x49,0xa, +0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2,0x7c,0xb7,0xf5,0x4b,0x7e,0x51, +0x4b,0xac,0x5d,0xe5,0x4a,0xa, 0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2, +0x7c,0xb7,0xf5,0x4b,0x7e,0x71,0x47,0x74,0x18,0xac,0x7b,0xe5,0x48,0xa, 0x2b,0x2d, +0x32,0x3e,0x34,0x2e,0x35,0x4f,0xb, 0x38,0x30,0xbe,0x35,0x4d,0x8, 0x3, 0x7a,0x35, +0x4d,0x5, 0x43,0xe5,0x4c,0xbe,0xb1,0x43,0x28,0x3, 0x2, 0x3a,0x26,0xbe,0xd0,0x0, +0x28,0x3a,0xe5,0x45,0x8c,0xbd,0xf5,0x45,0xe5,0x46,0x8c,0xbd,0xf5,0x46,0x7e,0xa1, +0x45,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x19,0xa3,0x15,0x2b,0xe5,0x46,0x19,0xb3, +0x15,0x2c,0x7e,0x25,0x4d,0x7e,0x71,0x45,0x74,0x18,0xac,0x7b,0xe5,0x46,0xa, 0x1b, +0x2d,0x31,0x3e,0x34,0x2e,0x35,0x4f,0x1b,0x38,0x20,0x5, 0x44,0xb, 0xc0,0xe5,0x42, +0xbc,0xbc,0x40,0x3, 0x2, 0x3a,0x10,0xe5,0x44,0xda,0x3b,0x22,0x74,0xd, 0x7a,0xb3, +0x10,0x2b,0x74,0x18,0x7a,0xb3,0x10,0x2c,0x74,0x4, 0x7a,0xb3,0x10,0x2d,0xe4,0x7a, +0xb3,0x10,0x2e,0x7e,0x34,0x11,0x9b,0x7a,0x37,0x10,0x2f,0x7e,0x34,0x11,0x97,0x7a, +0x37,0x10,0x31,0x7e,0x34,0xf, 0xc5,0x7a,0x37,0x10,0x33,0x7e,0x34,0xf, 0xad,0x7a, +0x37,0x10,0x35,0x74,0x15,0x7a,0xb3,0x10,0x37,0x74,0x17,0x7a,0xb3,0x10,0x38,0x74, +0x4, 0x7a,0xb3,0x10,0x3a,0xe4,0x7a,0xb3,0x10,0x3b,0x7a,0xb3,0x10,0x3c,0x7a,0xb3, +0x10,0x3d,0x74,0x2, 0x7a,0xb3,0x10,0x3e,0x74,0x45,0x7a,0xb3,0x10,0x3f,0x74,0x71, +0x7a,0xb3,0x10,0x40,0x74,0x3, 0x7a,0xb3,0x10,0x41,0x7e,0x34,0x1f,0xff,0x7a,0x37, +0x10,0x42,0x6d,0x33,0x7a,0x37,0x10,0x44,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10,0x46, +0x7e,0x34,0xf, 0xdc,0x7a,0x37,0x10,0x48,0x74,0x23,0x7a,0xb3,0x10,0x4a,0x74,0xa, +0x7a,0xb3,0x10,0x4b,0xe4,0x7a,0xb3,0x10,0x4c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10, +0x4e,0x74,0x2, 0x7a,0xb3,0x10,0x4f,0x7e,0x34,0x0, 0xf4,0x7a,0x37,0x10,0x52,0x7e, +0x34,0x3f,0xe0,0x7a,0x37,0x10,0x50,0x7e,0x34,0x29,0x28,0x7a,0x37,0x10,0x54,0x7e, +0x34,0x10,0x91,0x7a,0x37,0x10,0x62,0x7e,0x34,0x0, 0x3d,0x7a,0x37,0x10,0x64,0x7e, +0x34,0x0, 0x22,0x7a,0x37,0x10,0x66,0x7e,0x34,0x4c,0x0, 0x7a,0x37,0x10,0x56,0x7e, +0x34,0x3, 0xcf,0x7a,0x37,0x10,0x58,0x7e,0x34,0x7, 0x9a,0x7a,0x37,0x10,0x5a,0x7e, +0x34,0x5, 0x84,0x7a,0x37,0x10,0x5c,0x7e,0x34,0x0, 0x9, 0x7a,0x37,0x10,0x5e,0x7e, +0x34,0x0, 0xf, 0x7a,0x37,0x10,0x60,0x7e,0x34,0x0, 0x5d,0x7a,0x37,0x10,0x68,0xe4, +0x7a,0xb3,0x10,0x6a,0x74,0x7, 0x7a,0xb3,0x10,0x6b,0x7e,0x34,0x10,0xff,0x7a,0x37, +0x10,0x6c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x10,0x6e,0x7e,0x34,0xf, 0x2e,0x7a,0x37, +0x10,0x70,0x12,0x42,0x8d,0x7e,0x34,0x11,0xe9,0x7a,0x37,0x10,0x72,0x7e,0x34,0xf, +0x88,0x7a,0x37,0x10,0x74,0x7e,0x34,0x11,0x17,0x7a,0x37,0x10,0x76,0x2, 0x6c,0x66, +0xca,0x69,0xca,0xf8,0x7d,0xb1,0x7d,0xf2,0x7d,0xe3,0x9f,0x0, 0x7f,0x60,0x7f,0x40, +0x6d,0x66,0x7a,0x67,0x13,0xb6,0x7f,0x10,0x7d,0xa6,0x75,0x21,0x0, 0x6c,0xaa,0x80, +0x4b,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0xa1,0x2d,0xae,0xb, 0xa8,0xa0,0x7c,0xba,0x20, +0xe0,0x1e,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a, +0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x60,0x5, 0x21,0x80,0x1a, +0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a,0x8, 0x2, +0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x40,0xb, 0xa0,0x7e,0xf3,0x10,0x2c, +0xbc,0xfa,0x38,0xad,0xe5,0x21,0xa, 0x1b,0x6d,0x0, 0x7f,0x16,0x12,0x48,0x91,0x7a, +0x37,0x13,0xb6,0xe5,0x21,0xa, 0x3b,0x6d,0x22,0xa, 0x1f,0x6d,0x0, 0x9f,0x1, 0x7f, +0x14,0x12,0x48,0x91,0x6c,0xaa,0x80,0x2f,0x7c,0xba,0x7e,0x30,0x2, 0x7c,0x9a,0x20, +0xe0,0xf, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x9e,0x7, 0x13,0xb6,0x80, +0xd, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x7d,0x13,0x9d,0x1, 0x7d,0x14, +0x2d,0x1f,0x1b,0x18,0x0, 0xb, 0xa0,0x7e,0xb3,0x10,0x2c,0xbc,0xba,0x38,0xc9,0x9f, +0x66,0x7a,0x67,0x13,0xb6,0x6c,0xaa,0x80,0x29,0x7e,0x70,0x2, 0xac,0x7a,0x7d,0xa3, +0x2d,0xae,0x49,0xaa,0x0, 0x30,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x33, +0x9d,0x3b,0xbd,0x3a,0x8, 0x2, 0x7d,0xa3,0x7d,0x3a,0x1a,0x26,0x1a,0x24,0x2f,0x61, +0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xcf,0xa, 0x16,0x6d,0x0, 0x7f,0x16, +0x12,0x48,0x91,0x7a,0x37,0x13,0xb6,0x6c,0xaa,0x80,0x1d,0x7e,0x70,0x2, 0x7c,0x5a, +0xac,0x57,0x7d,0x32,0x2d,0x3e,0x49,0x43,0x0, 0x30,0x9e,0x47,0x13,0xb6,0x7d,0x32, +0x2d,0x3f,0x59,0x43,0x0, 0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xdb, +0xda,0xf8,0xda,0x69,0x22,0x7e,0x50,0x1, 0xe4,0x7a,0xb3,0xe, 0xb, 0x74,0x1, 0x7a, +0xb3,0xe, 0xc, 0x7e,0xa3,0xd, 0xf7,0x4c,0xaa,0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x16, +0xba,0xe4,0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, +0x7e,0x43,0xd, 0xfc,0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43, +0xd, 0x17,0xbe,0x40,0x0, 0x28,0x6b,0x7e,0xb3,0x16,0xb4,0x70,0x65,0x7e,0xb3,0x16, +0xb6,0x70,0x5f,0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x6d,0x33,0x6c,0x44,0x7e,0x30,0x2, +0xac,0x34,0x2e,0x17,0xf, 0xd6,0xb, 0x18,0x10,0xbd,0x13,0x58,0x2, 0x7d,0x31,0xb, +0x40,0xa5,0xbc,0x25,0xe8,0xbe,0x34,0xf8,0xf8,0x58,0x5, 0x7e,0x50,0x5, 0x80,0x1f, +0xbe,0x34,0xfb,0x50,0x58,0x5, 0x7e,0x50,0x4, 0x80,0x14,0xbe,0x34,0xfc,0xe0,0x58, +0x5, 0x7e,0x50,0x3, 0x80,0x9, 0xbe,0x34,0xfe,0xd4,0x58,0x3, 0x7e,0x50,0x2, 0xbe, +0x34,0xfc,0x18,0x58,0x3c,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d, +0x80,0x2f,0x7e,0x43,0xd, 0x16,0xa5,0xbc,0x0, 0x1d,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0xb3,0x16,0xb4,0x70,0x12,0x7e,0xb3,0x16,0xb6,0x70,0xc, 0xbe,0x50,0x3, 0x50,0x3, +0x7e,0x50,0x3, 0x74,0x1, 0x80,0x6, 0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, +0xc, 0x7e,0x43,0x16,0xba,0xbc,0x45,0x50,0x4, 0x7a,0x53,0x16,0xba,0xbe,0x50,0x2, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x1b,0x7e,0xb3,0xd, +0x16,0x70,0x15,0x7e,0xb3,0x16,0xb4,0x70,0xf, 0x7e,0xb3,0x16,0xb6,0x70,0x9, 0xe4, +0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xb3,0x16,0xb6,0xb4,0x1, 0x18,0xe4, +0x7a,0xb3,0x16,0xb6,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x7a, +0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xa3,0x16,0xba,0x74,0x2, 0xa4,0x7a,0x57, +0xe, 0x5, 0x7a,0x57,0xe, 0x7, 0x22,0xca,0x79,0x7c,0xfb,0xe5,0x55,0xbe,0xb0,0x1, +0x68,0xf9,0xe5,0x55,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x3f,0xe7,0xa9,0xd7,0xea,0x7e, +0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x82,0x12,0x0, +0x6e,0x50,0x27,0xa9,0xc7,0xea,0x7e,0xe3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x4d,0x7e, +0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x67,0x82,0x7a,0xe3,0x10,0x4d, +0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x3, 0x12,0x6a,0xdf,0x74,0x1, 0x7a,0xb3,0xf, 0xd3, +0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0xa, 0x18,0x12,0x66,0x67,0x7e, +0x37,0xf, 0xd6,0x7e,0x27,0xf, 0xd4,0x7e,0x14,0xa, 0x62,0x12,0x66,0x67,0x6c,0xaa, +0x80,0x36,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0xa, 0x92,0xbe,0x34,0x13,0x88,0x40, +0xc, 0xbe,0x34,0x75,0x30,0x28,0x1a,0xbe,0x34,0x7e,0xf4,0x50,0x14,0x7e,0xb3,0x16, +0xb7,0x4, 0x7a,0xb3,0x16,0xb7,0xb4,0xa, 0xd, 0x74,0x1, 0x7a,0xb3,0x16,0xb6,0x80, +0xf, 0xe4,0x7a,0xb3,0x16,0xb7,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xc2, +0x7e,0xa3,0x16,0xb6,0xbe,0xa0,0x1, 0x78,0x7, 0x7e,0xb3,0x16,0xb5,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x16,0xb5,0xbe,0xb0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb4, +0x4c,0xaa,0x78,0xd, 0xe4,0x7a,0xb3,0x16,0xb5,0x7a,0xb3,0x16,0xb4,0x7a,0xb3,0x16, +0xb7,0x74,0x1, 0x7a,0xb3,0xf, 0xd2,0x12,0x66,0xa1,0x12,0x6b,0x8a,0x7e,0xb3,0x11, +0xc, 0xb4,0x1, 0x31,0xbe,0xf0,0x1, 0x78,0x2c,0x7e,0xb3,0xd, 0xfc,0x70,0x26,0x12, +0x46,0xe9,0x7e,0xb3,0xd, 0xf7,0x70,0x19,0x7e,0x73,0x11,0x95,0xa, 0x37,0x9, 0x73, +0xf, 0x29,0x7a,0x73,0x10,0x4a,0xe4,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0x11,0xc, 0x80, +0x6, 0x6c,0xff,0x80,0x2, 0x6c,0xff,0x12,0x65,0xf2,0x12,0x6b,0xec,0x7c,0xbf,0xda, +0x79,0x22,0xca,0x3b,0x75,0x21,0x0, 0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4, +0x12,0x6d,0xee,0xe4,0x7a,0xb3,0xd, 0x16,0x7a,0xb3,0xd, 0x17,0x7e,0xb3,0xf, 0xd2, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x41,0x68,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, +0x74,0xff,0x12,0x6d,0xee,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12, +0x6d,0xee,0x7e,0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4c,0x7e,0x14, +0x13,0xb6,0x6c,0x11,0x12,0x4f,0xf, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, +0x30,0x7e,0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4a,0x7e,0x14,0x13,0xc0,0x12,0x4f,0xf, +0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x51,0x6c,0xcc,0x80,0x47,0x7c,0xbf,0xc4,0x23, +0x54,0x1f,0x7c,0x6b,0x7a,0x61,0x21,0xa, 0x2a,0x9, 0x72,0x13,0xc0,0x7e,0x50,0x2, +0xac,0x5f,0x19,0x72,0xa, 0xb1,0xa, 0x1c,0x9, 0x71,0x13,0xb6,0x19,0x72,0xa, 0xb2, +0x7c,0xbf,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x79,0xa, 0x46,0x2e,0x44,0xb, 0x79,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, +0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xb5,0xb, 0xa0,0xbc,0xda,0x38,0xab,0x7a,0xf3,0xd, +0x16,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xee,0x7e,0x34, +0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xee,0x7e,0x37,0xf, 0xd6,0x7e, +0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xb6,0x7e,0x10,0x1, 0x12,0x4f, +0xf, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0x10,0x2b,0x7e, +0x27,0xf, 0x4e,0x7e,0x14,0x13,0xc0,0x12,0x4f,0xf, 0x7c,0xdb,0x6c,0xff,0x6c,0xaa, +0x80,0xe, 0x6c,0xcc,0x80,0x4, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xf8,0xb, 0xa0, +0xbc,0xda,0x38,0xee,0x7a,0xf3,0xd, 0x17,0xda,0x3b,0x22,0xca,0xf8,0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x74,0x1, 0x7a,0xb3,0x10, +0x3c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10,0xa5,0x7e,0xb3,0xf, 0x26,0x12,0x6e,0xaf, +0x12,0x63,0xec,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x42,0x84,0x6d, +0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0x0, 0x64,0x7a,0x37,0xa, 0xaf,0xe4,0x7a,0xb3, +0x0, 0xff,0x12,0x6c,0x48,0x12,0x45,0xdf,0x12,0x6b,0x2, 0x6c,0xff,0x1a,0x2f,0x7e, +0x34,0x0, 0x18,0xad,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b, +0x35,0xb, 0x38,0x30,0x1a,0x2f,0x3e,0x24,0x59,0x32,0x13,0x9c,0xb, 0xf0,0xbe,0xf0, +0xd, 0x78,0xda,0x12,0x6b,0x48,0x12,0x6c,0x9e,0x12,0x69,0x5, 0x6c,0xff,0x1a,0x3f, +0x3e,0x34,0x49,0x23,0x13,0x9c,0x1a,0xf, 0x7e,0x14,0x0, 0x18,0xad,0x10,0x7d,0x31, +0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, +0xf0,0xbe,0xf0,0xd, 0x78,0xd8,0x12,0x69,0xd8,0x12,0x48,0xe6,0x7e,0xb3,0xf, 0xd3, +0x70,0x9, 0x7e,0xb3,0xf, 0xd2,0x70,0x3, 0x2, 0x41,0x93,0x12,0x1f,0x7b,0x12,0x33, +0x70,0x7a,0xb3,0xf, 0x25,0x12,0x6e,0xd, 0x12,0x6d,0x4, 0x70,0x3, 0x2, 0x41,0x93, +0x12,0x44,0xc9,0x7e,0x37,0xf, 0xda,0x12,0x8, 0x6, 0x12,0x6e,0xb5,0x12,0x4e,0x65, +0x12,0x0, 0x6e,0x50,0x3, 0x12,0x2f,0xc6,0x7e,0xb3,0x11,0x15,0xb4,0x1, 0x4, 0xe4, +0x12,0x6e,0xa0,0x12,0x68,0xd8,0x12,0x66,0xda,0x12,0x19,0x6d,0x12,0x6, 0x11,0x12, +0x6e,0xd4,0x12,0x65,0x3a,0x12,0x36,0xb7,0x12,0x55,0xf2,0x12,0x1c,0x95,0x12,0x49, +0xd0,0x2, 0x41,0x93,0x12,0x0, 0x1e,0x12,0x6e,0x29,0xda,0xf8,0x22,0xca,0x79,0x7e, +0x34,0x0, 0x60,0x12,0x69,0x86,0x7c,0xab,0x7a,0xa1,0x6a,0xbe,0xa0,0x8, 0x40,0x3, +0x2, 0x43,0xab,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0xe0,0x6, 0x80,0x3, 0x7e,0xe0,0x5, +0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x42,0xbf,0x73,0x2, +0x42,0xd7,0x2, 0x42,0xdc,0x2, 0x42,0xe1,0x2, 0x42,0xe6,0x2, 0x42,0xeb,0x2, 0x42, +0xf0,0x2, 0x42,0xf5,0x2, 0x42,0xfa,0x7e,0xf0,0x5e,0x80,0x26,0x7e,0xf0,0x5f,0x80, +0x21,0x7e,0xf0,0x61,0x80,0x1c,0x7e,0xf0,0x63,0x80,0x17,0x7e,0xf0,0x65,0x80,0x12, +0x7e,0xf0,0x67,0x80,0xd, 0x7e,0xf0,0x69,0x80,0x8, 0x7e,0xf0,0x6a,0x80,0x3, 0x7e, +0xf0,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x11,0xe9,0xa, 0xb, 0x7e,0xb3,0x10,0xff, +0xa, 0x1b,0x2d,0x1, 0x7c,0xb1,0x7c,0x1a,0x2e,0x10,0x21,0xa5,0xf7,0x7c,0x9b,0xa, +0x9, 0x5e,0x4, 0x0, 0x1, 0xbe,0x4, 0x0, 0x1, 0x78,0x1c,0x7c,0x79,0xac,0x7f,0x7e, +0x50,0x3, 0xac,0x5f,0xe, 0x24,0xe, 0x24,0x2d,0x32,0x7c,0xba,0x3e,0xb0,0x24,0x25, +0xa, 0xb, 0x1b,0x8, 0x30,0x80,0xd, 0xac,0x9f,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, +0xb, 0x1b,0x8, 0x40,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, 0xb, 0xb, 0x8, 0xf0,0x7e, +0x4, 0x0, 0xa, 0x7d,0x3f,0x8d,0x30,0x8d,0x30,0x7c,0x75,0xbe,0x70,0x0, 0x40,0x14, +0xbc,0xe7,0x28,0x10,0x7e,0xc4,0x0, 0x64,0x7d,0xdf,0x8d,0xdc,0x7d,0xd, 0x9d,0x1, +0x7c,0x61,0x80,0x17,0xbc,0xe7,0x38,0x19,0xbe,0x70,0x9, 0x38,0x14,0x7e,0xe4,0x0, +0x64,0x8d,0xfe,0x7d,0x2f,0xb, 0x24,0x9d,0x21,0x7c,0x65,0xa, 0x2a,0x19,0x62,0x11, +0xe9,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x3, 0x2, 0x43,0x4, 0xda,0x79,0x22,0xca,0x3b, +0x7c,0xeb,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x38,0x3, 0x2, 0x44,0xc0,0x7c,0xbe, +0x12,0xd, 0x46,0x7e,0xb3,0xd, 0xfc,0x60,0x1e,0x7e,0xb3,0x15,0x54,0x70,0x8, 0x7e, +0xb3,0x15,0x55,0x70,0x2, 0x80,0x10,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x28,0xc, +0xe5,0x12,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x1e,0x7e,0xf0,0x1, 0xbe, +0x73,0xf, 0x1c,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x15,0x54,0xbe, +0x73,0xf, 0x1c,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c,0xbe, +0x12,0xd, 0x46,0xe5,0x10,0x7a,0xb3,0xd, 0xf7,0x7e,0x31,0x10,0x74,0x2, 0xac,0x3b, +0x7e,0x24,0x15,0x2b,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x4a,0x75,0x12,0x64,0x75,0x13, +0x64,0x6c,0xee,0x80,0x67,0x6c,0xdd,0x80,0x59,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, +0x18,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0xa, 0x37,0x9d,0x32,0x12, +0x6d,0xde,0x7c,0xb7,0xf5,0x21,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, 0x19,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x19,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xde,0x7c, +0xc7,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0xa, 0xe5,0x12,0xbe,0xb1,0x21,0x28,0x3, 0x85, +0x21,0x12,0xbe,0xc0,0x0, 0x28,0x9, 0xe5,0x13,0xbc,0xbc,0x28,0x3, 0x7a,0xc1,0x13, +0xb, 0xd0,0x7e,0x73,0xd, 0xf7,0xbc,0x7d,0x38,0x9f,0xb, 0xe0,0x7e,0x73,0xd, 0xf7, +0xbc,0x7e,0x38,0x91,0xe5,0x12,0xb4,0x64,0x3, 0x75,0x12,0x0, 0xe5,0x13,0xb4,0x64, +0x3, 0x75,0x13,0x0, 0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x85,0x13,0x12,0x80,0x6, +0x75,0x12,0x64,0x75,0x13,0x64,0xda,0x3b,0x22,0x12,0x59,0x54,0x70,0x3, 0x2, 0x45, +0x50,0x75,0x6f,0x14,0x75,0x6e,0x1, 0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, +0x3b,0x2e,0x34,0x6e,0x98,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e, +0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19, +0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb, +0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x98,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4, +0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22, +0xe5,0x6e,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x45,0xdc,0x15,0x6f,0xe5,0x6f,0x60,0x79, +0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x98,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, +0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54, +0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x98,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c, +0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79, +0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e, +0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22,0x75,0x6e,0x0, 0xe5,0x21,0x22,0xca, +0x79,0x7e,0x74,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x20,0xe0,0x3, 0x2, 0x46,0xe6,0x54, +0xfe,0x7a,0xb3,0x10,0xfe,0x9, 0x77,0x0, 0x2, 0xbe,0x73,0xf, 0x52,0x68,0x16,0x7a, +0x73,0xf, 0x52,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x7a,0x37,0xf, 0x48,0x7e,0x79,0x70,0xbe,0x73,0xf, 0x5c,0x68,0xe, 0x7a,0x73, +0xf, 0x5c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x54,0x9, 0x77,0x0, 0x1, +0xa, 0x37,0xbe,0x37,0xf, 0x56,0x68,0x4, 0x7a,0x37,0xf, 0x56,0x7e,0x27,0xf, 0x5d, +0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x9, 0x77,0x0, 0x5, 0xa, 0x37,0xbd,0x32, +0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x5d,0x9, 0x77, +0x0, 0x8, 0xbe,0x73,0x11,0x11,0x68,0x24,0x7a,0x73,0x11,0x11,0xbe,0x70,0xf, 0x40, +0x5, 0xe4,0x19,0xb7,0x0, 0x8, 0x9, 0x77,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6d,0xfe, +0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0x11,0x10,0x9, 0x77,0x0, 0x9, +0xbe,0x73,0x11,0x13,0x68,0x8, 0x7a,0x73,0x11,0x13,0x7a,0x73,0x11,0x12,0x9, 0x77, +0x0, 0x7, 0xbe,0x73,0x11,0x14,0x68,0x4, 0x7a,0x73,0x11,0x14,0x9, 0xb7,0x0, 0xb, +0xbe,0xb1,0x51,0x68,0x5, 0xf5,0x51,0x12,0x6c,0xec,0x9, 0x77,0x0, 0x25,0xa, 0x37, +0xbe,0x37,0x11,0xd, 0x68,0x4, 0x7a,0x37,0x11,0xd, 0x9, 0x77,0x0, 0x6, 0xbe,0x73, +0x11,0xf, 0x68,0x4, 0x7a,0x73,0x11,0xf, 0x9, 0x77,0x0, 0x24,0xbe,0x73,0x11,0x15, +0x68,0x4, 0x7a,0x73,0x11,0x15,0xda,0x79,0x22,0xca,0x79,0xe4,0x6c,0xaa,0xa, 0x4a, +0x19,0xb4,0xd, 0x68,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xf3,0xe4,0x7a,0xb3,0xd, 0xf7, +0x7a,0xb3,0xd, 0xf8,0x7a,0xb3,0xd, 0xf9,0x7a,0xb3,0xd, 0xfa,0x7e,0xb3,0xf, 0xd3, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x47,0xef,0x7e,0xb3,0x10,0x2b,0xf5,0x21,0x7e,0xb3, +0x10,0x2c,0xf5,0x22,0x7e,0x37,0xf, 0x56,0x7a,0x35,0x23,0x7e,0x37,0xf, 0x58,0x7a, +0x35,0x25,0x7e,0x37,0xf, 0x5a,0x7a,0x35,0x27,0x7e,0x34,0x0, 0x14,0x7a,0x35,0x2d, +0x7e,0x37,0xf, 0xda,0x7e,0x24,0x0, 0x21,0x7e,0x14,0x0, 0x29,0x7e,0x4, 0x9, 0xc8, +0x12,0x4d,0xb6,0xe5,0x29,0x7a,0xb3,0xd, 0xf7,0xe5,0x2a,0x7a,0xb3,0xd, 0xf8,0xe5, +0x2b,0x7a,0xb3,0xd, 0xf9,0xe5,0x2c,0x7a,0xb3,0xd, 0xfa,0x6c,0xaa,0x80,0x6c,0x7e, +0x53,0xd, 0xf7,0xbc,0x5a,0x28,0x44,0x7c,0xba,0xc4,0x23,0x54,0x1f,0x7c,0x7b,0x7c, +0xba,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0x69, +0x7e,0x30,0x2, 0xac,0x3a,0x49,0x71,0x9, 0xc8,0x7d,0x7, 0xa, 0x0, 0x7c,0x41,0x19, +0x41,0xd, 0x18,0x7d,0x7, 0x7c,0x41,0x19,0x41,0xd, 0x19,0xa, 0x47,0x2e,0x44,0xd, +0x68,0x7e,0x49,0xb0,0x4c,0xb6,0x7a,0x49,0xb0,0x80,0x1e,0xa, 0x15,0xa, 0x2a,0x9d, +0x21,0x3e,0x24,0x49,0x72,0x9, 0xf0,0x7d,0x17,0xa, 0x12,0x7c,0xb3,0x19,0xb2,0xd, +0x40,0x7d,0x17,0x7c,0xb3,0x19,0xb2,0xd, 0x41,0xb, 0xa0,0x7e,0xb3,0xd, 0xf8,0xa, +0x2b,0x7e,0xb3,0xd, 0xf7,0xa, 0x1b,0x2d,0x12,0xa, 0x2a,0xbd,0x21,0x48,0x80,0xda, +0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, +0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32, +0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff, +0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12, +0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, +0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22, +0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf, +0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34, +0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40, +0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, +0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, +0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x48,0x40, +0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x48,0x40,0x30,0xd5,0x6, 0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, +0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e, +0x39,0x40,0x7a,0x19,0x40,0x22,0xca,0x79,0x6c,0xee,0x12,0x65,0x79,0x7d,0x43,0x6c, +0xaa,0x6c,0x77,0x7e,0x30,0x6, 0xac,0x37,0x2e,0x14,0x6c,0x2a,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70,0x5, +0x40,0xe1,0xbe,0xa0,0x5, 0x78,0x3, 0x2, 0x49,0xb7,0x7e,0x63,0xd, 0xf7,0xbe,0x60, +0x0, 0x38,0x3, 0x2, 0x49,0xb7,0x6c,0x77,0x2, 0x49,0xac,0x6c,0xff,0x6c,0x66,0x80, +0x41,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27,0xf, +0xda,0xb, 0x28,0x20,0x7e,0x30,0x6, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6c,0x2c,0x7e, +0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x2, 0x18,0x14,0xb, 0xf0,0x2e,0x14,0x6c,0x2e, +0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x28,0xe, 0x80,0x2, 0x6c,0xff, +0xb, 0x60,0x7e,0xb3,0x10,0x2b,0xbc,0xb6,0x38,0xb7,0x7e,0x50,0x6, 0xac,0x5a,0x7d, +0x12,0x2e,0x14,0x6c,0x2e,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x38, +0x17,0xb, 0xe0,0x2e,0x24,0x6c,0x2f,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0xbc, +0xbe,0x38,0x7, 0x75,0x14,0x40,0x80,0xf, 0x6c,0xee,0xb, 0x70,0x7e,0xb3,0x10,0x2c, +0xbc,0xb7,0x28,0x3, 0x2, 0x49,0x2b,0xe5,0x15,0x25,0x14,0xf5,0x14,0xbe,0xb0,0x0, +0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0xda,0x79,0x22, +0xca,0x3b,0x7e,0x73,0xd, 0xfb,0x7a,0x73,0xd, 0xfc,0x7e,0xa3,0xf, 0x1b,0x7a,0xa3, +0xf, 0x1c,0xe4,0x7a,0xb3,0xf, 0x1f,0x7e,0x37,0x11,0xd, 0x4d,0x33,0x78,0x3f,0xbe, +0xa0,0x0, 0x28,0x8, 0xe4,0x7a,0xb3,0x16,0xae,0x2, 0x4a,0x97,0x7e,0xb3,0x11,0xf, +0x20,0xe0,0x3, 0x2, 0x4a,0x97,0x7e,0xb3,0x11,0x14,0xbe,0xb3,0x16,0xae,0x28,0x3, +0x2, 0x4a,0x97,0xe4,0x7a,0xb3,0x16,0xae,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x11,0xd, +0x74,0x1, 0x7a,0xb3,0x10,0xa3,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x80,0x69,0xbe,0x34, +0x0, 0x1, 0x78,0x22,0xbe,0xa0,0x0, 0x28,0x5e,0x6d,0x22,0x7a,0x27,0x11,0xd, 0xe4, +0x7a,0xb3,0x10,0xa3,0x7a,0xb3,0x16,0xae,0x74,0x23,0x7a,0xb3,0x16,0xb1,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x80,0x41,0xbe,0x34,0x0, 0x3, 0x78,0x3b,0x6d,0x66,0x7a,0x67, +0x10,0x1, 0x7e,0x74,0xd, 0xac,0x7a,0x77,0xa, 0xaf,0x12,0x6e,0xda,0x12,0x60,0x30, +0x12,0x58,0x71,0x6d,0x33,0x7a,0x37,0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x7a,0x67,0x10,0x1, 0x7a,0x77,0xa, 0xaf,0x75,0x9a,0x7f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x7e,0xb3,0x16,0xb0,0x70,0x6, 0x12,0x5b,0x77, +0x12,0x64,0x32,0xda,0x3b,0x22,0x7d,0x53,0x9f,0x11,0xbe,0x54,0x0, 0x0, 0x40,0x2d, +0xbe,0x54,0x0, 0x3f,0x38,0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x25,0x7e,0x34,0x1, 0x7c, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x30,0x48,0x4, +0x7e,0x18,0x0, 0x30,0x7e,0x8, 0x0, 0x30,0x9f,0x1, 0x7f,0x10,0x22,0xbe,0x54,0x5, +0x80,0x40,0x29,0xbe,0x54,0x5, 0xaa,0x38,0x23,0x7d,0x25,0x9e,0x24,0x5, 0x7f,0x7e, +0x34,0x1, 0x7c,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, +0x30,0x48,0x4, 0x7e,0x18,0x0, 0x2f,0x2e,0x18,0x4, 0xd0,0x22,0xbe,0x54,0x5, 0xaa, +0x28,0x19,0x7d,0x25,0x9e,0x24,0x5, 0x9f,0x7e,0x34,0x1, 0x7c,0xad,0x32,0x6d,0x22, +0x7c,0x76,0x7c,0x65,0x1a,0x24,0x2e,0x18,0x5, 0x0, 0x22,0xbe,0x54,0x2, 0xdf,0x38, +0x8, 0x7e,0x34,0x2, 0xdf,0x9d,0x35,0x80,0x6, 0x7d,0x35,0x9e,0x34,0x2, 0xe0,0x6d, +0x22,0x7e,0x14,0x0, 0xe2,0x12,0x48,0x35,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x54, +0x2, 0xdf,0x38,0xa, 0x7e,0x8, 0x2, 0x7f,0x9f,0x1, 0x7f,0x10,0x80,0x4, 0x2e,0x18, +0x2, 0x80,0xbe,0x18,0x0, 0x30,0x58,0x5, 0x7e,0x18,0x0, 0x30,0x22,0xbe,0x18,0x4, +0xd0,0x8, 0x4, 0x7e,0x18,0x4, 0xd0,0x22,0x7e,0x34,0x10,0x7e,0x7e,0x24,0x0, 0x81, +0xe4,0x12,0x6d,0xee,0x74,0xc, 0x7a,0xb3,0x10,0x80,0x7a,0xb3,0x10,0x81,0x74,0x7, +0x7a,0xb3,0x10,0x82,0x74,0xf, 0x7a,0xb3,0x10,0x7e,0x74,0x3c,0x7a,0xb3,0x10,0x7f, +0x74,0xa0,0x7a,0xb3,0x10,0x83,0x74,0x1e,0x7a,0xb3,0x10,0x85,0x74,0x9, 0x7a,0xb3, +0x10,0x86,0x74,0x1e,0x7a,0xb3,0x10,0x87,0xe4,0x7a,0xb3,0x10,0x88,0x7a,0xb3,0x10, +0x89,0xf5,0x52,0xf5,0x51,0x7a,0xb3,0x10,0xa3,0x74,0x1, 0x7a,0xb3,0x10,0x84,0x7a, +0xb3,0x10,0xa2,0x7a,0xb3,0x10,0xa5,0x74,0x2f,0x7a,0xb3,0x10,0xa4,0x74,0xf1,0x7a, +0xb3,0x10,0xa6,0x74,0xb, 0x7a,0xb3,0x10,0xad,0x12,0x6e,0xc7,0xa, 0x36,0x7a,0x73, +0x10,0xa7,0x12,0x6e,0xc7,0x7a,0x73,0x10,0xa8,0x12,0x6e,0xcc,0xa, 0x36,0x7a,0x73, +0x10,0x9f,0x12,0x6e,0xcc,0x7a,0x73,0x10,0xa0,0xe4,0x7a,0xb3,0x10,0xae,0x74,0x1f, +0x7a,0xb3,0x10,0xcf,0xe4,0x7a,0xb3,0x10,0xb0,0x12,0x6e,0x1b,0x7a,0xb3,0x10,0xaf, +0x12,0x6d,0x1c,0x7a,0xb3,0x10,0xa1,0x7e,0x34,0x10,0x8e,0x7e,0x24,0x0, 0x8, 0x74, +0xff,0x12,0x6d,0xee,0x74,0x2f,0x7a,0xb3,0x10,0x8e,0x74,0x1, 0x7a,0xb3,0x10,0x8f, +0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x0, 0x40,0x2d,0xbe,0xf4,0x0, 0x3f,0x38,0x27,0x7e, +0x44,0x0, 0x3f,0x9d,0x4f,0x7e,0x54,0x1, 0x8b,0xad,0x54,0x6d,0x44,0x7c,0xba,0x7c, +0xa9,0xbe,0x28,0x0, 0x2f,0x40,0x4, 0x7e,0x28,0x0, 0x2f,0x7e,0x18,0x0, 0x2f,0x9f, +0x12,0x7f,0x21,0x2, 0x4c,0xef,0xbe,0xf4,0x3, 0x0, 0x40,0x22,0x7d,0x4f,0x9e,0x44, +0x3, 0x0, 0x7e,0x54,0x1, 0x7c,0xad,0x54,0x6d,0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28, +0x0, 0x32,0x40,0x4, 0x7e,0x28,0x0, 0x31,0x2e,0x28,0x2, 0x9e,0x80,0x51,0xbe,0xf4, +0x1, 0x9f,0x38,0x8, 0x7e,0x54,0x1, 0x9f,0x9d,0x5f,0x80,0x6, 0x7d,0x5f,0x9e,0x54, +0x1, 0xa0,0x6d,0x44,0x7e,0x14,0x0, 0xe3,0x7f,0x12,0x12,0x48,0x35,0x7f,0x21,0x7c, +0xba,0x7c,0xa9,0xa, 0x48,0xbe,0xf4,0x1, 0x9f,0x38,0xa, 0x7e,0x18,0x1, 0x67,0x9f, +0x12,0x7f,0x21,0x80,0x4, 0x2e,0x28,0x1, 0x68,0xbe,0x28,0x0, 0x2f,0x50,0x6, 0x7e, +0x28,0x0, 0x2f,0x80,0xa, 0xbe,0x28,0x2, 0x9e,0x28,0x4, 0x7e,0x28,0x2, 0x9e,0x2e, +0x28,0x0, 0x8, 0xbe,0x28,0x2, 0xd0,0x40,0x4, 0x7e,0x28,0x2, 0xcf,0x7d,0x35,0x22, +0xca,0x3b,0x6d,0x11,0x7d,0x1, 0x7d,0x21,0x7e,0xa0,0x2, 0x7e,0x70,0x2, 0x6c,0x66, +0x80,0x39,0x6c,0x99,0x80,0x2b,0x7e,0xd0,0x30,0xac,0xd6,0x7e,0xf0,0x2, 0xac,0xf9, +0x7d,0xf7,0x2d,0xf6,0x2e,0xf7,0xf, 0xda,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, 0x14,0x8, +0x4, 0xb, 0x4, 0x80,0x8, 0xbe,0xf4,0xff,0xec,0x58,0x2, 0xb, 0x24,0xb, 0x14,0x2c, +0x97,0x7e,0xb3,0x10,0x2c,0xbc,0xb9,0x38,0xcd,0x2c,0x6a,0x7e,0xb3,0x10,0x2b,0xbc, +0xb6,0x38,0xbf,0x7e,0x54,0x0, 0x3, 0xad,0x51,0x7d,0x35,0x1e,0x34,0x1e,0x34,0xbd, +0x30,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb8,0x7e,0xb3,0x16,0xb9,0xbe,0xb0,0x5, 0x50, +0x7, 0x4, 0x7a,0xb3,0x16,0xb9,0x80,0x39,0xe4,0x7a,0xb3,0x16,0xb9,0x75,0x72,0x1, +0x80,0x2f,0xbd,0x32,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb9,0x7e,0xb3,0x16,0xb8,0xbe, +0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb8,0x80,0x16,0xe4,0x7a,0xb3,0x16,0xb8, +0x75,0x72,0x2, 0x80,0xc, 0xe4,0x7a,0xb3,0x16,0xb8,0x7a,0xb3,0x16,0xb9,0x75,0x72, +0x0, 0xe5,0x72,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x56,0xf5, +0xba,0x7e,0x55,0x2d,0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1, +0x9, 0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54,0xe0,0x4c, +0xba,0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c,0xb7,0xf5, +0xc6,0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, 0x4, 0x6e, +0x34,0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x4, +0x1a,0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, 0x6, 0x7c, +0xb1,0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, 0x4e,0x37, +0x43,0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5, +0xa, 0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1,0x0, 0x3, +0x75,0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19,0xb1,0x0, +0x1, 0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0xf, 0xd2,0x60,0x6, 0x7e, +0xb3,0xf, 0xd3,0x70,0x18,0x7e,0x34,0xd, 0x68,0x7e,0x24,0x0, 0x3, 0xe4,0x12,0x6d, +0xee,0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4,0x12,0x6d,0xee,0x6c,0xee,0x80, +0x6b,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0x7a,0x71,0x21,0x9, 0x65,0xd, 0x19, +0x7a,0x61,0x22,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xdb,0x7c,0xbe,0x54,0x7, 0x7e, +0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xc5,0x7e,0x50,0x30,0xac, +0x57,0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0xbe, +0x37,0xf, 0x54,0x48,0x25,0xa, 0x3d,0x9, 0xb3,0xd, 0x68,0x5c,0xbc,0x68,0x1b,0x7e, +0x50,0x7, 0xac,0x5e,0x2e,0x24,0xd, 0x6b,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xe, +0xd, 0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x4a,0xb, 0xf0,0xb, 0xe0,0x7e,0x73,0xd, 0xf7, +0xbc,0x7e,0x38,0x8d,0x7a,0x73,0xd, 0xfb,0x7a,0xf3,0xf, 0x1b,0xda,0x3b,0x22,0xca, +0xf8,0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x2, 0x4f,0xaa,0x7e,0x90, +0x2, 0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, 0x6e,0x44, +0xff,0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0xa, 0x50,0x6b,0x4c,0xff,0x78, +0x14,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd, +0xe4,0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd,0x1b,0xf5, +0xb, 0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd,0xf4,0x18, +0x37,0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd,0x1b,0xc5, +0xb, 0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff,0xff,0xb, +0xf4,0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18,0x9, 0xa, +0xda,0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x3, 0x2, 0x4f, +0x1e,0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x33,0x7d,0x73,0x75,0x25,0x0, 0x7e, +0x64,0x5, 0xe0,0x75,0x23,0x0, 0x80,0x3c,0x75,0x24,0x0, 0x7e,0x51,0x23,0x74,0x18, +0xac,0x5b,0x3e,0x24,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2d,0x36,0x7a, +0x35,0x21,0x49,0x23,0x0, 0x30,0xb, 0x38,0x30,0x9d,0x32,0x12,0x6d,0xde,0xe5,0x24, +0xb4,0x17,0x2, 0x1e,0x34,0xbd,0x37,0x28,0x2, 0x7d,0x73,0x5, 0x24,0xe5,0x24,0xb4, +0x18,0xc9,0x5, 0x23,0xe5,0x25,0xa, 0x2b,0x7e,0x33,0x10,0x7c,0xa, 0x13,0x9d,0x12, +0x1b,0x14,0xe5,0x23,0xa, 0x2b,0xbd,0x21,0x48,0xae,0xbe,0x74,0x0, 0x41,0x28,0x11, +0x7e,0x34,0x0, 0x73,0x7e,0xa3,0x16,0x54,0x74,0x12,0xa4,0x59,0x35,0x16,0x65,0x80, +0x26,0x7e,0x43,0x16,0x54,0x7e,0x50,0x12,0xac,0x45,0x49,0x32,0x16,0x65,0xbd,0x37, +0x50,0x6, 0x59,0x72,0x16,0x65,0x80,0xf, 0xbe,0x34,0x0, 0x0, 0x28,0x9, 0x2e,0x24, +0x16,0x65,0x1b,0x34,0x1b,0x28,0x30,0xda,0x3b,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b, +0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x0, +0x46,0x7e,0x35,0x1e,0xb, 0x34,0x7a,0x35,0x1e,0x7e,0xb3,0x0, 0xff,0x4, 0x7a,0xb3, +0x0, 0xff,0x7e,0x35,0x1e,0xbe,0x34,0x3, 0xe8,0x40,0x13,0x6d,0x33,0x7a,0x35,0x1e, +0x7e,0xb3,0x16,0xae,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x16,0xae,0x7e,0x73, +0x16,0xb2,0xbe,0x73,0x16,0xb1,0x28,0xb, 0x7e,0xb3,0x16,0xb1,0x4, 0x7a,0xb3,0x16, +0xb1,0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb0,0x7e,0xb3,0x16,0xb3,0x60,0x5, 0x14, +0x7a,0xb3,0x16,0xb3,0x7e,0x37,0x10,0x1, 0xb, 0x34,0x7a,0x37,0x10,0x1, 0x7e,0x37, +0xa, 0xaf,0xbe,0x37,0x10,0x1, 0x28,0x3, 0x12,0x6e,0xdd,0xd0,0x82,0xd0,0x83,0xd0, +0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32, +0x75,0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e, +0xf8,0x16,0xbc,0x75,0x6a,0x0, 0x75,0x8, 0x1, 0x75,0x9, 0x0, 0x75,0xa, 0x0, 0x75, +0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0xc2,0x0, 0x75,0x11,0x0, +0x75,0x12,0x64,0x75,0x13,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x16,0x0, 0x75, +0x19,0x1, 0x75,0x1e,0x0, 0x75,0x1f,0x0, 0x75,0x72,0x0, 0x75,0x6e,0x0, 0x75,0x73, +0x0, 0x75,0x74,0x1, 0x75,0x70,0x18,0x75,0x71,0x0, 0x75,0x75,0x0, 0x75,0x76,0x0, +0x75,0x6b,0x0, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x6e, +0xe4,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44, +0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2, +0x80,0xdf,0x2, 0x5b,0xdc,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, 0x78,0xc, +0x7e,0x34,0x10,0x2b,0x12,0x6b,0x25,0xa9,0xc7,0xea,0x80,0x27,0xbe,0xd0,0x5, 0x78, +0x1f,0xa9,0xd7,0xea,0x7e,0xe3,0x10,0x4a,0x7e,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10, +0x4d,0x12,0x66,0x2d,0x7a,0xb3,0x10,0x4a,0x74,0x1, 0x7a,0xb3,0x10,0x78,0x80,0x3, +0xe4,0x80,0x4e,0x7e,0xb3,0x11,0x96,0x7e,0x34,0x10,0x2b,0xb4,0x1, 0xa, 0x12,0x31, +0xbc,0xe4,0x7a,0xb3,0x11,0x96,0x80,0xa, 0x12,0x60,0xdc,0x7e,0x34,0x10,0x2b,0x12, +0x5d,0xcb,0x7e,0x34,0x10,0x2b,0x12,0x6a,0x72,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, +0x7e,0x73,0x11,0xe8,0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x69,0x31,0xbe,0xd0,0x5, +0x78,0xd, 0x7a,0xe3,0x10,0x4a,0x7a,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x78,0x74, +0x1, 0xda,0x79,0xda,0xd8,0x22,0x7e,0x34,0xe, 0xd, 0x7e,0x24,0x0, 0x46,0x74,0xff, +0x12,0x6d,0xee,0x7e,0x34,0xe, 0x53,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xee, +0x7e,0x34,0xe, 0x99,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xee,0x6c,0xaa,0x74, +0x3, 0xa, 0x4a,0x19,0xb4,0xe, 0xdf,0x19,0xb4,0xe, 0xe9,0x7e,0x44,0xff,0xff,0x7e, +0x70,0x2, 0xac,0x7a,0x59,0x43,0xe, 0xf3,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0xf, +0x7, 0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd7,0xe4,0x7a,0xb3,0xf, 0x1b,0x7a,0xb3,0xf, +0x1c,0x7a,0xb3,0xf, 0x1d,0x7a,0xb3,0xf, 0x1f,0x7a,0xb3,0xf, 0x20,0x7a,0xb3,0xf, +0x21,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, +0x25,0x12,0x6a,0xbb,0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a,0xb3,0xf, 0x27, +0xe4,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7c,0xab,0x6c,0x33,0x7c,0x27,0x80,0x73, +0x7e,0x90,0x7, 0xac,0x93,0x9, 0xf4,0xe, 0x57,0x7e,0x10,0x7, 0xac,0x12,0x9, 0xb0, +0xe, 0x11,0xbc,0xfb,0x78,0x5b,0xbe,0xf0,0xff,0x68,0x56,0x7e,0x10,0x7, 0xac,0x1a, +0x7d,0xf0,0x2d,0xf2,0x19,0xff,0x0, 0x4, 0x49,0x44,0xe, 0x53,0x2d,0x2, 0x1b,0x8, +0x40,0x7e,0x10,0x7, 0xac,0x13,0x49,0x0, 0xe, 0x55,0x7e,0x90,0x7, 0xac,0x9a,0x2d, +0x42,0x59,0x4, 0x0, 0x2, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x12,0x7e,0x90, +0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x5, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10, +0xe, 0x13,0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x6, 0xb, 0xa0,0x80, +0x6, 0xb, 0x20,0xbc,0x62,0x38,0x89,0xb, 0x30,0xbe,0x30,0xa, 0x50,0x3, 0x2, 0x52, +0xac,0x7c,0xba,0xda,0xf8,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x3b,0xbe,0xa0,0x3e, +0x38,0x36,0xbe,0xa0,0x4, 0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x0, 0x8b,0xbe,0xa0,0x1, +0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x0, 0x6, 0x7e, +0x34,0x15,0xca,0x80,0x4, 0x7e,0x34,0x16,0xc, 0x7a,0x37,0x16,0x51,0xa, 0x3a,0x2e, +0x37,0x16,0x51,0x9, 0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0xb, 0x22,0xbe, +0xa0,0x80,0x40,0xc, 0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0xf, 0xfe,0x22, +0xbe,0xa0,0xfc,0x78,0x5, 0x7e,0xb3,0x10,0xa5,0x22,0xbe,0xa0,0xfd,0x78,0x8, 0x7e, +0x37,0x10,0x46,0x7e,0x39,0xb0,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3,0x10,0x4a, +0x22,0xbe,0xa0,0xf9,0x78,0x5, 0x7e,0xb3,0x16,0xbc,0x22,0xbe,0xa0,0xfa,0x78,0x3, +0xe5,0x6a,0x22,0xe4,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x4d,0xf5, +0x24,0xe4,0x7a,0xb3,0x10,0x4d,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10, +0x2b,0x12,0x6a,0x72,0x75,0x21,0x0, 0x12,0x69,0x31,0x12,0x6e,0x86,0x60,0xfb,0xa9, +0xb7,0xea,0x7d,0x36,0x7d,0x27,0x7e,0x14,0x18,0x0, 0x12,0x67,0x82,0x75,0x22,0x0, +0x80,0x36,0x75,0x23,0x0, 0x80,0x26,0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23, +0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, +0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x23,0x7e,0x73,0x10, +0x2c,0xbe,0x71,0x23,0x38,0xd1,0x5, 0x22,0x7e,0x73,0x10,0x2b,0xbe,0x71,0x22,0x38, +0xc1,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x4, 0x40,0x9d,0xe5,0x24,0x7a,0xb3,0x10,0x4d, +0xda,0x3b,0x22,0xca,0xf8,0x30,0x90,0x58,0xc2,0x90,0x5, 0xa, 0xe5,0xa, 0xb4,0x1, +0x6, 0xe5,0x91,0xf5,0xf, 0x80,0x29,0xe5,0xb, 0xc4,0x7c,0xfb,0x5e,0xf0,0x7, 0x78, +0xe, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x56,0x7b,0x80,0x11,0xbe, +0xf0,0x4, 0x78,0xc, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x15,0xe2, +0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53, +0x36,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e,0xf5,0x91, +0x30,0x91,0x28,0xc2,0x91,0x5, 0x9, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5, +0xbd,0x0, 0xb, 0xe5,0x9, 0x25,0xf, 0x12,0x53,0x36,0xf5,0x91,0x80,0xd, 0xa5,0xbd, +0x4, 0x9, 0xe5,0x9, 0x25,0xf, 0x12,0x27,0x2e,0xf5,0x91,0xda,0xf8,0x22,0x6c,0x33, +0xbe,0x30,0x18,0x50,0x1e,0xa, 0x3, 0x2e,0x7, 0x10,0x35,0x7e,0x9, 0xa0,0x7c,0xba, +0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x16,0x1e, +0xa0,0x80,0x12,0xa, 0x3, 0x2e,0x7, 0x10,0x33,0x9, 0x20,0xff,0xe8,0xa, 0x52,0x2e, +0x54,0x0, 0x18,0x7c,0xab,0x7e,0x23,0x10,0x3a,0xbe,0x20,0x3, 0x28,0xe, 0x7e,0x10, +0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x21,0xa, 0x42,0x2e,0x44, +0x0, 0xc, 0x7e,0x4, 0x0, 0xf, 0x9d,0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac,0x1a,0x2d, +0x2, 0xb, 0x8, 0x0, 0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e,0x44,0x7f, +0xff,0x9d,0x40,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xbe, +0x30,0x25,0x50,0x3, 0x2, 0x54,0xe0,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d, +0x32,0x2e,0x37,0xf, 0xd6,0xb, 0x38,0x10,0xbe,0x17,0xe, 0x7, 0x8, 0x12,0x7d,0x2, +0x2e,0x7, 0xf, 0xd4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30,0x80,0x18, +0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x27,0xf, 0xd4,0xb, 0x28, +0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xbb,0x6c, +0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xe, 0x7, 0x8, 0x12, +0x7d,0x2, 0x2e,0x4, 0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30, +0x80,0x18,0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x24,0x8, 0xe4, +0xb, 0x28,0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40, +0xc0,0x22,0xca,0x69,0xca,0xf8,0x6c,0x11,0x7e,0xd0,0x7, 0xac,0xd1,0x9, 0x6, 0xe, +0x9d,0x5e,0x0, 0xf, 0x49,0xf6,0xe, 0x9b,0xbe,0xf4,0x5, 0xa, 0x40,0x3c,0x49,0x46, +0xe, 0x99,0x7d,0x34,0x12,0x6b,0xab,0x7c,0xfb,0xbe,0xf0,0x3, 0x40,0xe, 0x7e,0x14, +0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x3e,0x74,0x2, 0xac,0xbf, +0x49,0x45,0x0, 0xf8,0x74,0x7, 0xac,0xb1,0x59,0x45,0xe, 0x99,0x7e,0x14,0x7, 0xd0, +0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x25,0xbe,0xf4,0x5, 0x0, 0x40,0x1f, +0x7e,0x14,0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x74,0x7, 0xac,0xb1, +0x49,0x15,0xe, 0x9b,0xbe,0x14,0x5, 0xa, 0x40,0x5, 0x7c,0xb0,0x12,0x68,0x4b,0xb, +0x10,0xbe,0x10,0xa, 0x40,0x82,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x70,0x41,0x7e, +0x74,0x0, 0xb, 0x7a,0x79,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c,0x7b,0xa5, +0xbf,0x4, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80, +0x13,0x74,0x27,0x7e,0x70,0x3, 0x80,0x4b,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, 0x74, +0x1, 0x7e,0x70,0x1, 0x12,0x0, 0x5e,0x80,0x45,0x74,0x27,0x7e,0x70,0x1, 0x80,0x33, +0xbe,0xb0,0xfc,0x68,0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa,0x5, 0x7e,0x60,0x5, 0x80, +0x10,0xa5,0xbf,0x55,0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5,0xbf,0x66,0x20,0x7e,0x60, +0x7, 0x74,0x27,0x7c,0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0,0xdf,0x38, +0x7, 0x24,0x80,0x12,0x6d,0xad,0x80,0x6, 0xb4,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x79, +0x22,0x6c,0x77,0x6c,0xaa,0x80,0x3c,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27, +0xf, 0xda,0x2e,0x24,0x0, 0x30,0x7d,0x12,0x1b,0x16,0xb, 0x18,0x40,0xbe,0x44,0x0, +0x3c,0x8, 0x1e,0x7e,0x14,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb, +0x5e,0x14,0x4, 0x44,0x68,0xb, 0x1b,0x25,0xb, 0x28,0x20,0xbd,0x42,0x8, 0x2, 0xb, +0x70,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xbc,0xbe,0x70,0x1, 0x40,0x30, +0x6c,0xaa,0x80,0x24,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, 0xda,0x2e, +0x24,0x0, 0x30,0x1b,0x25,0xb, 0x28,0x30,0x7e,0x30,0x2, 0xac,0x3a,0x59,0x31,0x0, +0xd2,0x6d,0x33,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xd4, +0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x63,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c, +0xab,0x7c,0xbe,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0xa, 0x2a,0x9, 0xb2,0xd, 0x68,0x5c,0xb7,0x68,0x40,0x7e,0x50,0x2, 0xac,0x5e,0x2e, +0x24,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x34,0xd, 0x18,0x7e,0x14,0x0, 0x2, +0x12,0x6d,0x4a,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbf,0x54,0x7, 0x7e, +0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x4a,0x2e,0x44,0xd, 0x68, +0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xe0,0x7e,0x63,0xd, 0xf7, +0xbc,0x6e,0x38,0x95,0x7a,0xf3,0xd, 0xf7,0xda,0x79,0x22,0x6d,0x33,0x7a,0x37,0x10, +0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xdd,0x7e,0xb3,0x10,0xa5, +0x24,0xfa,0x68,0x17,0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x0, 0xfe,0xbe, +0xb0,0x5, 0x68,0x4c,0x74,0x5, 0x7a,0xb3,0x0, 0xfe,0x22,0x7e,0xb3,0x0, 0xfe,0xb4, +0x5, 0x3e,0x74,0x6, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x33,0x75,0x9a,0x80, +0x7e,0x34,0x77,0xf8,0x12,0x69,0xaf,0x7e,0x34,0x77,0xf8,0x74,0x66,0x12,0x59,0xc5, +0x7e,0x34,0x77,0xf9,0x74,0xbb,0x12,0x59,0xc5,0x80,0x12,0x7e,0xb3,0x0, 0xfe,0xb4, +0x5, 0xe, 0x74,0x7, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x33,0x75,0xe9,0xff, +0x22,0x0, 0x0, 0x0, 0x0, 0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x16,0xac,0xb4,0x1, +0x14,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xe4,0x7a, +0xb3,0x16,0xac,0x80,0xb, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20, +0xa9,0xd0,0xca,0xc2,0xa8,0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x16,0xb3,0x7e,0xb3,0x16, +0xb3,0x70,0xfa,0x12,0x6e,0x7d,0x12,0x61,0x32,0x12,0x6b,0xcc,0x6d,0x33,0x7a,0x37, +0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xdd,0x12,0x6a,0x26, +0x12,0x6a,0x4c,0x12,0x52,0x16,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d, +0x2, 0x6e,0xc1,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9, +0x7d,0x36,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6d,0xee,0x7d,0x37,0x7e,0x24,0x0, 0x4a, +0xe4,0x12,0x6d,0xee,0x75,0x21,0x1, 0x12,0x6b,0xec,0xe5,0x55,0xbe,0xb0,0x1, 0x68, +0xf9,0x75,0x22,0x0, 0x7e,0x51,0x22,0x74,0x2, 0xac,0x5b,0x49,0x2, 0xa, 0x62,0x1e, +0x4, 0x1e,0x4, 0x7d,0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d,0x30,0x1b,0x18,0x30,0x49, +0x12,0xa, 0x18,0x1e,0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28, +0x30,0x5, 0x22,0xe5,0x22,0xb4,0x25,0xcc,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x5, 0x40, +0xb6,0xda,0x3b,0x22,0x6c,0x77,0x7e,0x63,0xd, 0xfa,0xa, 0x16,0x7e,0x63,0xd, 0xf9, +0xa, 0x26,0x2d,0x21,0xbe,0x24,0x0, 0xa0,0x28,0x3, 0x74,0x1, 0x22,0x6c,0xaa,0x80, +0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0x9a,0xbe,0x24,0x5, 0xdc,0x8, 0x9, +0xb, 0x70,0xbe,0x70,0x10,0x68,0xe, 0x80,0x2, 0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10, +0x2c,0xbc,0x6a,0x38,0xdc,0xa5,0xbf,0x10,0x2a,0x6c,0x77,0x6c,0xaa,0x80,0x1c,0x7e, +0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0xca,0xbe,0x24,0x9, 0xc4,0x8, 0x9, 0xb, 0x70, +0xa5,0xbf,0x8, 0x5, 0x74,0x1, 0x22,0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc, +0x6a,0x38,0xdc,0xe4,0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb,0x75,0xfb, +0xa5,0x75,0xfb,0xf, 0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68,0x18,0xbe,0x34,0x73, +0xf9,0x68,0x12,0xbe,0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9, +0xa9,0xc5,0xcb,0xe4,0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c,0xb7,0x54,0xfe,0xf5, +0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75,0xf6,0xff, +0x7a,0xa1,0xf6,0x80,0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75,0xf5,0x80,0x74,0x1, +0x12,0x6d,0x33,0xa9,0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5, +0xcb,0x74,0x1, 0x22,0x74,0xa, 0x7a,0xb3,0xf, 0x46,0x74,0x14,0x7a,0xb3,0xf, 0x47, +0x7e,0x34,0x3, 0x20,0x7a,0x37,0xf, 0x48,0x7a,0x37,0xf, 0x4a,0x7e,0x24,0x1, 0xf4, +0x7a,0x27,0xf, 0x4c,0x7a,0x37,0xf, 0x4e,0x7a,0x37,0xf, 0x50,0x74,0xc, 0x7a,0xb3, +0xf, 0x52,0x74,0x8, 0x7a,0xb3,0xf, 0x53,0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, 0x54, +0x7a,0x37,0xf, 0x56,0x7a,0x37,0xf, 0x58,0x7e,0x34,0x0, 0x28,0x7a,0x37,0xf, 0x5a, +0x74,0xf, 0x7a,0xb3,0xf, 0x5c,0xe4,0x7a,0xb3,0xf, 0x5f,0x74,0x4, 0x7a,0xb3,0xf, +0x60,0x7e,0x34,0x0, 0x64,0x7a,0x37,0xf, 0x61,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0xf, +0x5d,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x3c,0xf5,0x1d,0xe4,0x7a, +0xb3,0x10,0x3c,0x7d,0x36,0x7d,0x27,0x12,0x6a,0x97,0x7e,0x34,0x10,0x2b,0x12,0x5b, +0x10,0x75,0x1b,0x0, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xb9,0x12,0x6e,0x8f,0x60,0xfb, +0x7d,0x36,0x7e,0x25,0x70,0x12,0x54,0xde,0x75,0x1c,0x0, 0x7e,0x51,0x1c,0x74,0x2, +0xac,0x5b,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, +0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x1c,0xe5,0x1c,0xb4,0x25,0xdd,0x5, 0x1b, +0xe5,0x1b,0xbe,0xb0,0x4, 0x40,0xbd,0xe5,0x1d,0x7a,0xb3,0x10,0x3c,0xda,0x3b,0x22, +0x7d,0x3, 0x75,0xcc,0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0,0xe5,0xca, +0x54,0x1, 0x4c,0xba,0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1,0xe1,0x9, +0x70,0x0, 0xe, 0x2e,0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c,0xba,0xc4, +0x33,0x54,0xe0,0x7c,0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, 0xb0,0x0, +0x13,0x54,0x3, 0xa, 0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5,0xe3,0x54, +0xe7,0x4c,0xba,0xf5,0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12,0x5d,0x9, +0x9, 0xb0,0x0, 0x14,0xf5,0xe7,0x22,0x7e,0xb3,0x16,0xac,0x70,0x17,0xe5,0xcc,0x7a, +0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xaf,0x74,0x1, +0x7a,0xb3,0x16,0xac,0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc,0xc2,0xca, +0xc2,0xc8,0xa9,0xc4,0xcb,0x80,0x2e,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0x23,0xe5,0x75, +0xb4,0x1, 0x1e,0xe5,0x76,0xb4,0x1, 0x19,0xa9,0xc3,0xcb,0x7e,0x24,0x0, 0x1, 0x7e, +0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2, +0xcd,0xe4,0x12,0x6d,0x77,0x7e,0xb3,0x16,0xb0,0x60,0xcc,0x22,0x6d,0x33,0x7a,0x37, +0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xda,0x12,0x6e,0x7d, +0x12,0x61,0x32,0x12,0x6e,0xe3,0x12,0x6d,0x89,0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x12, +0x6b,0xcc,0x12,0x6a,0x26,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x12, +0x6e,0xc1,0x7e,0xb3,0x10,0xa5,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14,0x68,0x16, +0x14,0x68,0x13,0x24,0x5, 0x78,0xeb,0x12,0x41,0x6b,0x80,0xe6,0x12,0x5e,0x7e,0x80, +0xe1,0x12,0x69,0xff,0x80,0xdc,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x12,0x57,0xfb,0x80, +0xd1,0x7c,0xa5,0x7c,0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7, +0xf5,0xba,0x7c,0xb5,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2,0x1e,0xb0, +0x1e,0xb0,0x54,0xf, 0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x1e,0x50, +0x1e,0x50,0x1e,0x50,0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50, +0xf5,0xc1,0x7c,0xb3,0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0,0x43,0xc2, +0x7, 0x80,0x7, 0x43,0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2, +0x0, 0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, 0xac,0x13, +0x2e,0x4, 0x1c,0x3a,0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c,0x33,0x80, +0x43,0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0,0xb, 0x2d, +0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, 0xb0,0x54, +0x1f,0xa, 0xfb,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c,0xb2,0x1e, +0xb0,0x7e,0x90,0x2, 0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d,0xf, 0x1b, +0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, 0x9, 0xb2, +0x0, 0xc, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54,0x7f,0xf5, +0xe5,0x75,0xe4,0x7, 0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4,0xb, 0x6c, +0xaa,0xa, 0x1a,0x49,0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5,0xb, 0xa0, +0xbe,0xa0,0x25,0x40,0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39,0xb0,0xf5, +0xe5,0x75,0xe4,0x31,0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xe5, +0x75,0xe4,0x32,0x5e,0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0xca,0x79,0x7e,0x71, +0x54,0x3e,0x70,0x3e,0x70,0x7c,0xb7,0x24,0x56,0xa, 0x2b,0xb, 0x28,0x50,0x7c,0xab, +0x7c,0xb7,0x24,0x58,0xa, 0x3b,0xb, 0x38,0x70,0x4d,0x77,0x68,0x1f,0xbe,0xa0,0x1, +0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34,0x10,0x2b, +0x12,0x6b,0x25,0x7d,0x37,0x7e,0x24,0x18,0x0, 0x12,0x54,0xde,0x5, 0x54,0xe5,0x53, +0xbe,0xb1,0x54,0x28,0x10,0x12,0x62,0x79,0xb4,0x1, 0x5, 0x75,0x55,0x1, 0x80,0x8, +0x75,0x55,0x3, 0x80,0x3, 0x75,0x55,0x2, 0xda,0x79,0x22,0x6d,0x11,0x7e,0x24,0x1c, +0x1c,0x1b,0x28,0x10,0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0xa3,0x0, +0x50,0x80,0x2, 0x7c,0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e,0x19,0x40, +0xa, 0x14,0x7e,0x4, 0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, 0x14,0x1b, +0x8, 0x10,0x49,0x13,0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10, +0x49,0x13,0x0, 0x43,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0xb, 0x50, +0xbe,0x50,0xd, 0x40,0xb1,0x22,0x75,0x9, 0x0, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50, +0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53,0x36,0xf5,0x91,0x80,0xb, 0xa5,0xbd, +0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e,0xf5,0x91,0x75,0xa, 0x0, 0xe4,0x7a,0xb3,0x16, +0x4e,0x7e,0x34,0x15,0xca,0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xee,0x7e,0x34, +0x16,0xc, 0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xee,0x74,0xaa,0x7a,0xb3,0x15, +0xca,0x7a,0xb3,0x15,0xcb,0x7a,0xb3,0x16,0xc, 0x7a,0xb3,0x16,0xd, 0x22,0xca,0xf8, +0x74,0x3, 0x7a,0xb3,0x16,0xa3,0xe4,0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x74, +0x3, 0x7a,0xb3,0x16,0xa3,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a, +0x37,0xa, 0xaf,0x7e,0xf3,0x16,0xa3,0xbe,0xf0,0x3, 0x78,0x1d,0xe5,0xb, 0x30,0xe7, +0xe4,0x12,0x6b,0x2, 0x7e,0x37,0xf, 0xd6,0x7a,0x37,0x16,0xa0,0x7e,0x37,0xf, 0xda, +0x7a,0x37,0x16,0x9e,0x53,0xb, 0x7f,0x80,0xcc,0x7a,0xf3,0x10,0xa5,0x12,0x0, 0x1e, +0x12,0x0, 0x6a,0xda,0xf8,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, +0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7c, +0xb3,0xf5,0xbd,0xa, 0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5,0xc3,0xe5, +0xc4,0x54,0xe0,0x4c,0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23,0x4e,0x24, +0x0, 0x1, 0x7c,0x15,0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2,0x0, 0x0, +0x0, 0x0, 0xa9,0x37,0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x6c,0xaa,0x6c, +0x77,0x7e,0x10,0x30,0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d,0x1, 0x2e, +0x7, 0xf, 0xda,0xb, 0x8, 0x20,0xbe,0x27,0xe, 0x5, 0x8, 0x12,0x7d,0x41,0x2e,0x47, +0xf, 0xd8,0xb, 0x48,0x0, 0x2e,0x7, 0xe, 0x5, 0x1b,0x48,0x0, 0x80,0x18,0x6d,0x0, +0x9e,0x7, 0xe, 0x5, 0xbd,0x20,0x58,0xe, 0x2e,0x17,0xf, 0xd8,0xb, 0x18,0x20,0x9e, +0x27,0xe, 0x5, 0x1b,0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0,0xbe,0xa0, +0xd, 0x40,0xac,0x22,0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, 0x31,0x7e, +0x79,0x50,0xa5,0xbd,0x0, 0xb, 0x7e,0xd, 0x31,0x7e,0xb, 0x40,0x7a,0x79,0x40,0x80, +0x36,0x7e,0xd, 0x31,0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12,0x6d,0xde, +0xa, 0x2c,0xbd,0x32,0x8, 0x18,0x7e,0x1d,0x31,0x7e,0x1b,0xb0,0x7e,0x79,0xa0,0xbc, +0xba,0x7c,0xba,0x28,0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0,0x7e,0x79, +0x30,0x7e,0x1d,0x31,0x7a,0x1b,0x30,0xda,0x3b,0x22,0x7e,0xb3,0x10,0x39,0xb4,0x1, +0x26,0x7e,0x73,0xa, 0xac,0x7a,0x73,0x10,0x37,0x7e,0x73,0xa, 0xad,0x7a,0x73,0x10, +0x38,0x7e,0x73,0xa, 0xae,0x7a,0x73,0x10,0x3a,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10, +0x46,0x7e,0x34,0xf, 0xdc,0x80,0x24,0x7e,0x73,0x11,0x16,0x7a,0x73,0x10,0x37,0x7e, +0x73,0x11,0x49,0x7a,0x73,0x10,0x38,0x7e,0x73,0x11,0x94,0x7a,0x73,0x10,0x3a,0x7e, +0x34,0x11,0x9d,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, 0x63,0x7a,0x37,0x10,0x48,0x22, +0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x75,0x60,0xfc,0xe5,0x76,0x60,0xfc,0x20, +0x93,0xfd,0xd2,0x96,0xd2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e,0xb3,0x16, +0xac,0x70,0x17,0xe5,0xcc,0x7a,0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30, +0x7a,0x73,0x16,0xaf,0x74,0x1, 0x7a,0xb3,0x16,0xac,0xa9,0xc0,0xca,0x7e,0x24,0x0, +0x1, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd, +0x75,0x87,0x2, 0x0, 0x0, 0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e, +0x37,0xf, 0xd6,0xb, 0x38,0x10,0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x12,0x9, 0x2e,0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30, +0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e,0x24,0x3, +0x70,0x74,0x18,0x7e,0x13,0x10,0x2b,0x6c,0x0, 0x2, 0x5e,0xd6,0x9, 0xa3,0x0, 0x24, +0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43,0xcc,0x8, +0x9, 0x53,0x0, 0x2, 0x3e,0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca,0xa9,0xd0, +0xca,0xd2,0xcd,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9,0xc0,0xc9, +0x7e,0x14,0x1d,0x0, 0xb, 0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20,0x9, 0xb3, +0x0, 0x3f,0xb4,0x1, 0xc, 0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54,0xf0,0xf5, +0xe5,0x22,0x12,0x4b,0x78,0x12,0x3b,0x1c,0x12,0x68,0xab,0x7e,0x34,0x8, 0x50,0x7a, +0x37,0xf, 0xd4,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x7e,0x34,0x8, 0x9a,0x7e, +0x27,0xf, 0xd4,0x12,0x6a,0x97,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xf, 0xd8,0x7e,0x34, +0x3, 0x70,0x7a,0x37,0xf, 0xda,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xf, 0xd8,0x12,0x67, +0xb5,0x12,0x64,0xfa,0x12,0x5a,0x34,0x12,0x6a,0x4c,0x12,0x52,0x16,0x12,0x6e,0x60, +0x74,0x1, 0x7a,0xb3,0x11,0x96,0x22,0xca,0xf8,0x7e,0xb3,0xf, 0xd2,0xb4,0x1, 0x48, +0x6c,0xff,0x80,0x3c,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xac,0xbf, +0x9, 0xb5,0xa, 0xb1,0x7e,0x53,0x10,0x2b,0x12,0x35,0x22,0x74,0x4, 0xac,0xbf,0x59, +0x35,0xb, 0x86,0x7e,0x37,0xf, 0xd6,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0xb2,0x7e, +0x53,0x10,0x2c,0x12,0x35,0x22,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x88,0xb, 0xf0, +0x7e,0x73,0xd, 0x16,0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0xca,0x69,0xca,0xf8,0x7c, +0xfb,0x7e,0x24,0x0, 0x4, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24,0x56,0xa, +0x3b,0x1b,0x38,0x20,0x6d,0x66,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38,0x60,0xb, +0xf0,0x12,0x0, 0x6e,0x50,0x1e,0x7e,0x24,0x0, 0x5, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0, +0x7c,0xba,0x24,0x56,0xa, 0x3b,0x1b,0x38,0x20,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b, +0x38,0x60,0xb, 0xf0,0x7c,0xbf,0xda,0xf8,0xda,0x69,0x22,0x7e,0x47,0x16,0x65,0x6c, +0x77,0x7e,0xa0,0xff,0x7e,0x43,0x16,0x54,0xa, 0x14,0x9, 0x51,0xf, 0x29,0xbe,0x53, +0x10,0x4a,0x78,0x32,0x7e,0x50,0x12,0xac,0x45,0x49,0x22,0x16,0x65,0xbe,0x24,0x0, +0x41,0x40,0x23,0x7e,0x60,0x1, 0xbe,0x44,0x0, 0x19,0x40,0x18,0x7e,0x30,0x12,0xac, +0x36,0x49,0x21,0x16,0x65,0xbd,0x24,0x50,0x4, 0x7d,0x42,0x7c,0x76,0xb, 0x60,0xbe, +0x60,0x4, 0x40,0xe2,0x7c,0xa7,0x7c,0xba,0x22,0xca,0x79,0xe5,0x53,0xbe,0xb1,0x54, +0x38,0x4, 0x6c,0xff,0x80,0x3a,0xe5,0x54,0x3e,0xb0,0x3e,0xb0,0x24,0x56,0xa, 0x3b, +0xb, 0x38,0x30,0x7c,0xe7,0xbe,0xe0,0x1, 0x68,0xe, 0xbe,0xe0,0x2, 0x68,0x9, 0xbe, +0xe0,0x3, 0x68,0x4, 0x4c,0xee,0x78,0x7, 0x7c,0xbe,0x12,0x63,0x10,0x7c,0xfb,0xbe, +0xe0,0x4, 0x68,0x5, 0xbe,0xe0,0x5, 0x78,0x7, 0x7c,0xbe,0x12,0x51,0x85,0x7c,0xfb, +0x7c,0xbf,0xda,0x79,0x22,0x7e,0xa3,0xd, 0xf7,0xbe,0xa0,0x0, 0x28,0x40,0x6c,0x77, +0x80,0x38,0x7e,0x50,0x2, 0xac,0x57,0x9, 0x62,0xd, 0x18,0x9, 0x52,0xd, 0x19,0x7e, +0x30,0x2, 0xac,0x36,0x49,0x1, 0x11,0xce,0x7e,0x17,0xf, 0x4a,0xe, 0x14,0xbd,0x1, +0x48,0x13,0x7e,0x30,0x2, 0xac,0x35,0x49,0x1, 0x11,0x9e,0x7e,0x17,0xf, 0x4c,0xe, +0x14,0xbd,0x1, 0x58,0x3, 0x74,0x1, 0x22,0xb, 0x70,0xbc,0xa7,0x38,0xc4,0xe4,0x22, +0xca,0xf8,0x7c,0xfb,0xbe,0xf0,0x1, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xf0,0x2, 0x68, +0x4, 0x4c,0xff,0x78,0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x39,0x80,0x3, 0xe4,0x80,0x28, +0x12,0x5f,0xda,0x4c,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x10,0x3a,0x74,0x1e,0x7a,0xb3, +0x10,0x37,0x74,0xa, 0x7a,0xb3,0x10,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x10,0x7e, +0x34,0x10,0x2b,0x12,0x64,0xb9,0x74,0x1, 0xda,0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75, +0x75,0x1, 0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x60,0x2, 0x1b,0x28,0x30,0xb, +0x28,0x30,0x4e,0x70,0x2, 0x1b,0x28,0x30,0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0x6c, +0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b, +0xda,0x6b,0xda,0x7b,0x32,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36, +0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7a,0xa1, +0xc3,0x75,0xc5,0x40,0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, +0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x3b,0xe5,0xc6, +0xa, 0x2b,0x7c,0x45,0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22,0xe4,0x7a,0xb3,0x15, +0x9f,0x7a,0xb3,0x15,0x53,0x7a,0xb3,0x15,0x9e,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15, +0xa1,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x48,0x12,0x6d,0xee,0x7e,0x34,0x14,0xe3, +0x7e,0x24,0x0, 0x48,0xe4,0x12,0x6d,0xee,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x46, +0x74,0xff,0x12,0x6d,0xee,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x46,0x74,0xff,0x2, +0x6d,0xee,0xd2,0xcd,0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e,0xb3,0x16, +0xac,0xb4,0x1, 0x15,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38, +0x20,0x7e,0xb3,0x16,0xad,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d, +0x8, 0x1b,0x38,0x20,0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0xe4,0x7a,0xb3,0x16,0xac,0x22,0x7c,0xab,0x6c,0x33,0x80,0x36,0xa, 0x3, +0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d,0x3, 0x7e, +0x9, 0x10,0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e,0x20,0x1e, +0x20,0x7e,0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d,0xf, 0x1b, +0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x75,0x76,0x0, 0x75,0xe4,0x3, 0x49, +0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, 0x5e,0x24, +0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5,0x75,0xe4, +0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9,0xd6,0xea, +0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1,0x22,0x7e,0x34,0x1, 0x90,0x7a,0x37, +0xd, 0xff,0x7e,0x34,0x0, 0x19,0x7a,0x37,0xe, 0x1, 0x7e,0x34,0x0, 0x9c,0x7a,0x37, +0xe, 0x3, 0x7e,0x34,0x0, 0x2, 0x7a,0x37,0xe, 0x5, 0x7a,0x37,0xe, 0x7, 0x74,0x1, +0x7a,0xb3,0xe, 0x9, 0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x7e,0x34, +0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x2, 0x6d,0xee,0xca,0xf8,0x7e,0x24,0xe, 0xd, +0x7e,0x34,0xe, 0x99,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x4a,0x6c,0xff,0x74,0x7, 0xac, +0xbf,0x49,0x35,0xe, 0xd, 0x12,0x4c,0x41,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x99, +0x49,0x35,0xe, 0xf, 0x12,0x4a,0xa6,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x9b,0xb, +0xf0,0xbe,0xf0,0xa, 0x40,0xd7,0xda,0xf8,0x22,0x6d,0x33,0x6c,0xaa,0x80,0x2e,0x7e, +0x30,0x2, 0xac,0x3a,0x9, 0x51,0xd, 0x18,0x9, 0x41,0xd, 0x19,0x7e,0x10,0x30,0xac, +0x15,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xf, 0xda,0xb, 0x18,0x40,0xbe, +0x44,0x0, 0x0, 0x8, 0x6, 0xbd,0x43,0x8, 0x2, 0x7d,0x34,0xb, 0xa0,0x7e,0xb3,0xd, +0xf7,0xbc,0xba,0x38,0xca,0x22,0xca,0x79,0x7d,0x41,0x7d,0x13,0x6d,0x0, 0x7e,0x34, +0x7f,0xff,0x6c,0xaa,0x80,0x1b,0x7e,0xf0,0x7, 0xac,0xfa,0x7d,0xe7,0x2d,0xe4,0x49, +0xfe,0x0, 0x2, 0xbd,0xf0,0x28,0x2, 0x7d,0xf, 0xbd,0xf3,0x50,0x2, 0x7d,0x3f,0xb, +0xa0,0x9, 0xb4,0x0, 0x46,0xbc,0xba,0x38,0xdd,0x1b,0x18,0x0, 0x1b,0x28,0x30,0xda, +0x79,0x22,0xca,0xf8,0x7e,0xb3,0x10,0x4e,0x60,0x3, 0xb4,0x1, 0x2d,0xa9,0xc6,0xea, +0x12,0x2b,0xa0,0x7c,0xfb,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x67,0xb5, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x53,0xc5,0xbe,0xf0,0x1, 0x78,0x4, +0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0x10,0x4e,0xda,0xf8,0x22,0x7e,0xb3,0x16, +0x54,0x4, 0x7a,0xb3,0x16,0x54,0x7e,0x73,0x16,0x54,0xbe,0x70,0x4, 0x40,0x5, 0xe4, +0x7a,0xb3,0x16,0x54,0x7e,0xa3,0x16,0x54,0xbe,0xa0,0x3, 0x78,0x13,0x7e,0xb3,0x16, +0x9d,0x4, 0x7a,0xb3,0x16,0x9d,0xbe,0xb0,0x8, 0x40,0x5, 0xe4,0x7a,0xb3,0x16,0x9d, +0xa, 0x3a,0x9, 0xb3,0xf, 0x29,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d,0x21,0x7d, +0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x4a,0x7e,0xb3,0x10,0x3c,0xb4,0x1, 0x1f,0x6c, +0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d,0x26,0xb, +0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3,0xda,0x3b, +0x22,0x7e,0xb3,0x10,0x3d,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3,0x10,0x39, +0x12,0x5f,0xda,0x12,0x2d,0xb5,0xe4,0x7a,0xb3,0x10,0x39,0x12,0x5f,0xda,0x12,0x2d, +0xb5,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x25,0x7e,0x37,0xf, 0xd4,0x7e,0x24,0x8, 0xe4, +0x12,0x58,0xe3,0x74,0x2, 0x7a,0xb3,0x10,0x3d,0x22,0x7e,0xa3,0xf, 0x1c,0xbe,0xa0, +0x0, 0x38,0x2f,0xbe,0xa3,0xf, 0x1b,0x50,0x19,0x7e,0xb3,0xf, 0x25,0xbe,0xb3,0x12, +0x33,0x28,0x14,0x7e,0xb3,0x12,0x33,0x4, 0x7a,0xb3,0x12,0x33,0x7a,0xa3,0xf, 0x1b, +0x80,0x5, 0xe4,0x7a,0xb3,0x12,0x33,0x7e,0xb3,0xf, 0x1b,0x70,0x5, 0xe4,0x7a,0xb3, +0xf, 0x24,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12,0x54,0x53, +0x74,0x1, 0x7a,0xb3,0x16,0x4e,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75, +0x76,0x1, 0x75,0xe6,0x0, 0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0x6c,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0xca,0xf8,0x7d,0x1, 0x7d,0x13,0x7e,0xf3,0x10,0x4d,0xbe,0xf0,0x1, 0x78, +0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x2, 0x80,0x11,0x4c,0xff, +0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x4, 0x12, +0x5e,0xd6,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0xf, 0xd3,0x6c,0xaa,0x6c,0x33,0x6d,0xff, +0x7e,0x10,0x18,0xac,0x1a,0xa, 0xe3,0x2d,0xe, 0x3e,0x4, 0x7d,0x40,0x2d,0x42,0x1b, +0x48,0xf0,0x6d,0x44,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x18,0xdf,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xd6,0x22,0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c,0x33,0x4c, +0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d,0x30,0x80, +0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe,0x30,0x3, +0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x2a,0x2d, +0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x7e,0x24,0xff,0xff, +0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x14,0x2d,0x13,0x59, +0x21,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd1,0x22,0x7c,0xab,0x7e,0x24,0xe, +0xdf,0xbe,0xa0,0xa, 0x50,0x25,0xa, 0x3a,0x7d,0x13,0x2d,0x12,0x7e,0x19,0xb0,0xb4, +0x2, 0xe, 0x74,0x1, 0x7a,0x19,0xb0,0x74,0x3, 0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x22, +0x74,0x3, 0x7a,0x19,0xb0,0x2d,0x32,0x19,0xb3,0x0, 0xa, 0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x6e,0x6a,0x53,0xb, 0xfd,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x6d,0x33,0x7a,0x37,0x11, +0xd, 0x74,0x1, 0x7a,0xb3,0x11,0xf, 0x74,0xb, 0x7a,0xb3,0x11,0x10,0x74,0x9, 0x7a, +0xb3,0x11,0x11,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x7a,0xb3,0x11,0x13,0x7a,0xb3,0x11, +0x14,0x74,0x1, 0x7a,0xb3,0x11,0x15,0x22,0x7e,0xb3,0xf, 0x1b,0x70,0x1e,0x7e,0xa3, +0xf, 0x1c,0xbe,0xa0,0x0, 0x28,0x15,0xe5,0x16,0x70,0xd, 0x7a,0xa3,0xf, 0x1b,0x74, +0x1, 0x7a,0xb3,0xf, 0x22,0x5, 0x16,0x22,0x75,0x16,0x0, 0x22,0x75,0x16,0x0, 0xe4, +0x7a,0xb3,0xf, 0x22,0x22,0x6c,0xaa,0x80,0x1f,0x7e,0x70,0x2, 0xac,0x7a,0x49,0x23, +0x0, 0xd2,0x7e,0x70,0x18,0xac,0x7a,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, +0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xd9, +0x22,0x75,0x75,0x0, 0xa9,0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34, +0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x2, 0x1b,0x28, +0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, 0x5e,0x0, 0xa, +0x0, 0x96,0x1, 0x2c,0x0, 0x8, 0x0, 0x78,0x0, 0xfa,0x0, 0x7, 0x0, 0x50,0x0, 0xc8, +0x0, 0x6, 0x0, 0x32,0x0, 0xa0,0x0, 0x4, 0x0, 0x1e,0x0, 0x78,0x0, 0x3, 0x0, 0xa, +0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0xf5,0xf1,0x7c, +0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9,0x37,0xf5,0xfc, +0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5,0xcb,0x22,0xc2, +0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54,0x1e,0x54,0x3e, +0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, 0x12,0x6d,0x33, +0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x12,0x22,0x20,0x12,0x3d,0xb5,0x12,0x4d, +0x0, 0x60,0x6, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x7e,0xb3,0xe, 0xb, 0x60,0x3, 0x12, +0x60,0x86,0x7e,0xb3,0xe, 0xc, 0x60,0x6, 0x12,0x55,0x68,0x2, 0x5f,0x2d,0x22,0xe4, +0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0xf, 0x28,0x12,0x6a,0x26,0xb4, +0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x53,0xb, 0x8f,0x74,0x2, 0x80,0x2, 0x74, +0xff,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x66,0xa1,0x7e,0xb3, +0x10,0x3d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x65,0xf2,0x7e,0xb3,0x10,0x4e, +0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x34,0xa, 0xb1, +0x7e,0x24,0x3, 0x4d,0xe4,0x12,0x6d,0xee,0x7e,0x34,0xb, 0x86,0x7e,0x24,0x1, 0x90, +0x74,0xff,0x12,0x6d,0xee,0x7e,0x34,0xd, 0x6b,0x7e,0x24,0x0, 0x8c,0x74,0xff,0x2, +0x6d,0xee,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51,0x80,0x3, 0x7e, +0x39,0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23,0x0, 0x3b,0x7e, +0x34,0x1d,0x6, 0x1b,0x38,0x20,0x22,0xe4,0x7a,0xb3,0xf, 0xd2,0x6c,0xaa,0x6d,0x44, +0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x2, 0x1b,0x8, 0x40,0x6d,0x0, 0x2d,0x13, +0x1b,0x18,0x0, 0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x22,0x7e,0x34,0x12,0x1, 0x7e, +0x24,0x0, 0x1e,0xe4,0x12,0x6d,0xee,0x7e,0x34,0x12,0x1f,0x7e,0x24,0x0, 0x14,0xe4, +0x12,0x6d,0xee,0x7e,0x34,0x11,0xed,0x7e,0x24,0x0, 0x14,0xe4,0x2, 0x6d,0xee,0x12, +0x0, 0x6e,0x50,0x1d,0x12,0x6e,0xbb,0x7c,0xab,0x7e,0xb3,0x11,0x95,0xbe,0xb0,0x4, +0x68,0xf, 0xbe,0xa0,0xff,0x68,0xa, 0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x7a,0xa3,0x11, +0x95,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb3,0x10,0x3d,0x70,0x3, 0x7e,0xf0,0x1, 0x74, +0x1, 0x12,0x3e,0xf7,0xbe,0xb0,0x1, 0x68,0x5, 0xbe,0xf0,0x1, 0x78,0x4, 0xe4,0x12, +0x3e,0xf7,0xda,0xf8,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5,0x0, 0x75,0xe4, +0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, 0x9, 0xb3,0x0, +0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x7e,0x34,0x8, 0x9a,0x7e,0x24,0x11,0x9e, +0x7e,0x14,0x1, 0x90,0x12,0x3c,0x70,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x11,0x4a,0x7e, +0x14,0x0, 0xc8,0x12,0x3c,0x70,0x2, 0x57,0x1, 0x74,0x1, 0x12,0x6e,0x4b,0xa9,0xc3, +0xea,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x75,0x9a,0x7f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xe5,0x52,0xb4,0x1, 0x18,0xe5, +0x51,0x70,0x14,0x7e,0xb3,0x11,0x95,0x60,0xb, 0xe4,0x7a,0xb3,0x11,0x95,0x74,0x1, +0x7a,0xb3,0x11,0xc, 0x12,0x6c,0x66,0x85,0x51,0x52,0x22,0x6c,0xaa,0x7e,0x50,0x4, +0xac,0x5a,0x49,0x12,0x0, 0xec,0xbd,0x13,0x38,0x8, 0x49,0x22,0x0, 0xee,0xbd,0x23, +0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe4,0x7c,0xba,0x22,0x7e,0x24,0x0, 0x2, +0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0x9b,0x12,0x6c,0xb9,0x7e,0x34,0x7, +0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x2e,0x75,0x55,0x0, 0x75, +0x73,0x0, 0x75,0x54,0x0, 0x12,0x6c,0xb, 0x12,0x61,0xdb,0xf5,0x53,0x12,0x62,0x79, +0xb4,0x1, 0x4, 0x75,0x55,0x1, 0x22,0x75,0x55,0x3, 0x22,0x7e,0x34,0x0, 0x1, 0x7a, +0x35,0x56,0x7e,0x34,0xa, 0x18,0x7a,0x35,0x58,0x7e,0x34,0x0, 0x2, 0x7a,0x35,0x5a, +0x7e,0x34,0xa, 0x62,0x7a,0x35,0x5c,0x74,0x2, 0x22,0x0, 0x50,0x0, 0xa, 0x6, 0x4, +0x0, 0x78,0x0, 0xc, 0x6, 0x4, 0x0, 0xc8,0x0, 0x1e,0x8, 0x5, 0x1, 0x40,0x0, 0x50, +0x8, 0x5, 0x1, 0xf4,0x0, 0x64,0xa, 0x6, 0xe4,0x7a,0xb3,0x16,0xb1,0x7a,0xb3,0x16, +0xb0,0x7e,0xb3,0x10,0xa3,0x70,0x6, 0x7e,0x73,0x11,0x10,0x80,0x4, 0x7e,0x73,0x11, +0x12,0x7a,0x73,0x16,0xb2,0x22,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x2, 0x7a,0xb3,0x10, +0x7b,0x74,0x4, 0x7a,0xb3,0x10,0x7c,0x7e,0x34,0x16,0x55,0x7e,0x24,0x0, 0x48,0xe4, +0x2, 0x6d,0xee,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x75,0x92,0x7c,0xd2,0xad,0xd2, +0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0x22,0xe4,0x7a, +0xb3,0xd, 0xfb,0x7e,0x34,0x11,0x9e,0x7a,0x37,0xf, 0xd6,0x12,0x40,0x32,0x7e,0x34, +0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x2, 0x46,0xe9,0x75,0x75,0x1, 0x7e,0x24,0x1d,0x0, +0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e,0x34,0x0, 0x1, +0x2, 0x6e,0x35,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0xe5,0x51,0xb4,0x1, +0x6, 0x7e,0x34,0x0, 0x5a,0x80,0x4, 0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, 0x54,0x7a, +0x37,0xf, 0x56,0x22,0xca,0xf8,0x12,0x6e,0x40,0x7c,0xfb,0x12,0x0, 0x6e,0x50,0x7, +0x4c,0xff,0x78,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0xda,0xf8,0x22,0x7e,0x34,0x0, 0x24, +0x12,0x69,0x86,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, 0x57,0x2e,0x54, +0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0x7d,0x3, 0x80,0xa, 0x7e,0x29, +0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d,0x55,0x78,0xee, +0x22,0x7e,0x53,0xf, 0x47,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x9d,0x32,0xbe,0x34,0x0, +0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4,0x1, 0x3, 0x43, +0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3,0x16,0xa3,0xe4, +0x7a,0xb3,0x16,0xaa,0x74,0xff,0x7a,0xb3,0x16,0xa2,0x22,0x75,0x76,0x1, 0xd2,0xee, +0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x6e,0x35,0xa, 0x2b,0x19, +0x72,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x44,0x1, 0x7a,0xb3,0x10,0xfe,0x22,0x7d,0x13, +0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31,0x22,0x14,0x1, +0xa, 0x1, 0x0, 0x2, 0xfb,0x4, 0xf6,0x5, 0xec,0x6, 0xe7,0x7, 0xe2,0x8, 0x7d,0x23, +0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22,0x7d,0x13, +0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5,0x22,0x10,0x10, +0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x12,0x0, 0x42, +0x12,0x57,0x81,0x74,0x3, 0x12,0x43,0xae,0x2, 0x24,0xb4,0x7e,0x34,0x0, 0x21,0x12, +0x69,0x86,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x7e,0xb3,0x11,0x15,0xb4,0x1, 0x4, +0xe4,0x2, 0x6e,0xa0,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32,0x38,0xfa,0x22, +0x12,0x62,0xc5,0xb4,0x1, 0x2, 0xe4,0x22,0x74,0x1, 0x22,0xd2,0xcf,0xa9,0xd4,0xc9, +0x75,0xcc,0x0, 0xc2,0xca,0x22,0xa9,0xc0,0x93,0x75,0x9, 0x0, 0x75,0xa, 0x0, 0x32, +0x75,0x53,0x0, 0x75,0x54,0x0, 0x75,0x55,0x0, 0x22,0xa9,0x32,0x99,0x5, 0xd2,0x9c, +0xa9,0xd6,0xdf,0x22,0x75,0xb, 0x0, 0x12,0x6e,0xd1,0x2, 0x5e,0x26,0x12,0x6b,0x69, +0x12,0x6e,0xd7,0x2, 0x6e,0x74,0xe5,0x75,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0xe5, +0x76,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20,0x40,0x80, +0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf,0x22,0xf5, +0x17,0x75,0x18,0x0, 0x22,0x12,0x61,0x87,0x2, 0x38,0x4a,0x12,0x4f,0xb6,0x2, 0x62, +0x2b,0x12,0x6e,0xe3,0x2, 0x6b,0xec,0x7e,0x34,0x1, 0x3, 0x22,0x7e,0x34,0x5, 0xb, +0x22,0x2, 0x6c,0x83,0x2, 0x0, 0x76,0x2, 0x6c,0xd3,0x2, 0x6e,0xa8,0x2, 0x6e,0x6a, +0xe5,0x6e,0x22,0x22,0x0, 0x1, 0x0, 0x8b,0x1, 0x0, 0x1, 0xa, 0xac,0x15,0x0, 0x1, +0xa, 0xad,0x17,0x0, 0x1, 0xa, 0xae,0x4, 0x0, 0x1, 0xd, 0xfe,0x30,0x0, 0x5, 0xf, +0x29,0x23,0x17,0x29,0x38,0x13,0x0, 0x18,0xf, 0x2e,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x3, 0x0, 0x25,0xf, 0x63,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x18,0xf, 0x88,0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xf, 0xa0,0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xf, 0xad,0x0, 0x1, 0x2, 0x3, +0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x17,0x16,0x15,0x14,0x13,0xc, 0xd, 0xe, +0xf, 0x10,0x11,0x12,0x0, 0xd, 0xf, 0xc5,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, +0x0, 0x9, 0xa, 0xb, 0xc, 0x0, 0x25,0xf, 0xdc,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0xd, +0x10,0xff,0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0x0, +0x1, 0x11,0xc, 0x0, 0x0, 0x1, 0x11,0x16,0x15,0x0, 0x32,0x11,0x17,0x0, 0x8, 0x0, +0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a,0x1, 0xbc,0x2, +0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, 0x7, 0xf9,0x8, +0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e,0xc, 0x83,0x0, +0x1, 0x11,0x49,0x17,0x0, 0x1, 0x11,0x94,0x2, 0x0, 0x1, 0x11,0x95,0x0, 0x0, 0x4, +0x11,0x97,0xff,0xff,0xff,0xff,0x0, 0x2, 0x11,0x9b,0xff,0x1f,0x0, 0x1, 0x11,0x9d, +0x30,0x0, 0x1, 0x11,0xe8,0x0, 0x0, 0x4, 0x11,0xe9,0x23,0x23,0x23,0x23,0x0, 0x1, +0x16,0x53,0x0, 0x0, 0x1, 0x15,0x53,0x0, 0x0, 0x1, 0x15,0x9e,0x0, 0x0, 0x1, 0x15, +0x9f,0x0, 0x0, 0x1, 0x15,0xa0,0x0, 0x0, 0x1, 0x15,0xa1,0x0, 0x0, 0x1, 0x12,0x33, +0x0, 0x0, 0x1, 0x16,0xac,0x0, 0x0, 0x1, 0x16,0xb4,0x0, 0x0, 0x1, 0x16,0xb5,0x0, +0x0, 0x1, 0x16,0xb6,0x0, 0x0, 0x1, 0x16,0xb7,0x0, 0x0, 0x1, 0x16,0xb8,0x0, 0x0, +0x1, 0x16,0xb9,0x0, 0x0, 0x1, 0x16,0xba,0x1, 0x0, 0x1, 0x16,0xbb,0x1, 0x0, 0xc, +0x0, 0xec,0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94,0x0, 0x6, +0x0, 0xf8,0x0, 0xb4,0x2, 0x1c,0x3, 0x84,0x0, 0x1, 0x16,0x54,0x3, 0x0, 0x1, 0x16, +0x9d,0x0, 0x0, 0x1, 0x0, 0xfe,0x0, 0x0, 0x1, 0x0, 0xff,0x0, 0x0, 0x1, 0x16,0xbc, +0x0, 0x0, 0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x70,0xd3,0x8f,0x2c,0x95,0x6a,0x2f, +0xf1, \ No newline at end of file diff --git a/drivers/input/touchscreen/ft5336/ft_app_ic_biel_ebbg_720p.txt b/drivers/input/touchscreen/ft5336/ft_app_ic_biel_ebbg_720p.txt new file mode 100644 index 0000000000000..94da926b7be7e --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft_app_ic_biel_ebbg_720p.txt @@ -0,0 +1,1810 @@ +0x2, 0x51,0x4f,0x2, 0x68,0xdc,0xe5,0x73,0x60,0x9, 0x74,0x1, 0x12,0x6e,0xd3,0x75, +0x73,0x0, 0x22,0xe4,0x12,0x6e,0xd3,0x75,0x73,0x1, 0x22,0x2, 0x50,0xb9,0xe5,0x55, +0xbe,0xb0,0x1, 0x68,0xf9,0x12,0x6e,0xb9,0x60,0xfb,0x22,0x2, 0x67,0x73,0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60, +0xfb,0x22,0x22,0x2, 0x6e,0x89,0xc2,0x8e,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0x22,0x32,0x2, 0x63,0xb7,0xbe,0xb0, +0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x16,0x9f,0x22,0x22,0x2, 0x0, 0x5a,0xe5,0x52, +0x24,0xff,0x22,0x2, 0x67,0xab,0xca,0x3b,0x7e,0xb3,0xf, 0x1b,0xf5,0x26,0x7e,0xd3, +0xf, 0x1c,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x33,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, +0xa, 0xe4,0x12,0x6e,0x21,0x6c,0xcc,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7c,0x19, +0xa3,0x13,0xba,0x7e,0x34,0x7f,0xff,0x74,0x7, 0xac,0xbc,0x59,0x35,0x13,0xb6,0x74, +0x7, 0xac,0xbc,0x59,0x35,0x13,0xb8,0xb, 0xc0,0xbe,0xc0,0xa, 0x78,0xd9,0xe5,0x26, +0x60,0x3, 0x2, 0x0, 0xef,0x12,0x6a,0xee,0xbe,0xd0,0x0, 0x38,0x3, 0x2, 0x0, 0xdf, +0x74,0x1, 0x7a,0xb3,0xf, 0x20,0xe4,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7e, +0x34,0x13,0x6, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x2, 0x1, 0x14,0x4c, +0xdd,0x68,0x3, 0x2, 0x1, 0x14,0x75,0x25,0x0, 0x7e,0xa0,0xff,0x7e,0x71,0x25,0x74, +0x7, 0xac,0x7b,0x19,0xa3,0xe, 0x57,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xeb,0x74,0x1, +0x7a,0xb3,0xf, 0x1f,0x75,0x25,0x0, 0x2, 0x1, 0x4c,0x7e,0x51,0x25,0x74,0x7, 0xac, +0x5b,0x2e,0x24,0xe, 0xd, 0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x51,0x25,0xac,0x5b,0x2e,0x24,0xe, 0xf, 0xb, 0x28,0x30,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x5, 0x25,0xe5,0x26,0xbe,0xb1, +0x25,0x38,0xc7,0xe4,0x6c,0x77,0x7e,0x61,0x26,0x7e,0x24,0x13,0xb6,0x12,0x53,0x2, +0x7e,0x71,0x26,0x7e,0x60,0xa, 0x7e,0x24,0x13,0xb6,0x12,0x53,0x2, 0x7c,0xcb,0x6c, +0xee,0x75,0x25,0x0, 0x2, 0x1, 0x92,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65,0x13, +0xba,0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x11,0xbc,0x76,0x78,0x3, 0x2, 0x1, 0x97, +0x5, 0x25,0xbe,0xc1,0x25,0x38,0xe0,0xbe,0xc1,0x25,0x68,0x3, 0x2, 0x1, 0xb8,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3c,0x2e,0x14,0x13, +0xb6,0x74,0x7, 0x12,0x49,0x26,0xb, 0xc0,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xb2,0x7e, +0x24,0x13,0xb6,0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x4c,0xdd, +0x68,0x3, 0x2, 0x1, 0xe7,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, +0x46,0x12,0x6d,0x7d,0x2, 0x4, 0x84,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x4, 0x84, +0x6c,0xee,0x2, 0x4, 0x7b,0x75,0x25,0x0, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65, +0xe, 0x57,0x7e,0x90,0x7, 0xac,0x9e,0x9, 0x74,0xe, 0x11,0xbc,0x67,0x78,0x3, 0x2, +0x2, 0x1b,0x5, 0x25,0xe5,0x25,0xbe,0xb0,0xa, 0x40,0xdd,0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x9, 0xf5,0xe, 0x57,0x49,0x34,0xe, 0xf, 0x49,0x25,0xe, 0x55,0x12,0x6d,0xf1, +0x7d,0x63,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, 0xa4, +0x49,0x25,0xe, 0x53,0x12,0x6d,0xf1,0x7d,0x13,0x2d,0x16,0x7a,0x15,0x21,0x7c,0x1f, +0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7,0xbe,0x14,0x0, 0x40,0x28,0x3, 0x2, 0x2, 0xd9, +0x7e,0x35,0x21,0xbe,0x34,0x0, 0x20,0x38,0x3, 0x2, 0x2, 0xae,0x7e,0x70,0x3, 0xac, +0x7f,0x9, 0xb3,0x12,0x2, 0x60,0x3, 0x2, 0x2, 0x97,0x9, 0xb3,0x12,0x3, 0xbe,0xb0, +0x0, 0x38,0x3, 0x2, 0x2, 0x89,0x2, 0x2, 0xbf,0x74,0x1, 0x19,0xb3,0x12,0x2, 0x6d, +0x22,0x7a,0x25,0x21,0x2, 0x2, 0xed,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0xa, 0x40,0x3, +0x2, 0x2, 0xed,0x2e,0x34,0x12,0x3, 0x4, 0x7a,0x39,0xb0,0x2, 0x2, 0xd1,0x7e,0x70, +0x3, 0xac,0x7f,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x2, 0xcc,0x7d, +0x23,0x2e,0x24,0x12,0x3, 0x14,0x7a,0x29,0xb0,0x2, 0x2, 0xed,0xe4,0x19,0xb3,0x12, +0x2, 0x6d,0x33,0x7a,0x35,0x21,0x2, 0x2, 0xed,0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7f, +0x19,0xa3,0x12,0x3, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x2, 0x7e,0x35,0x21, +0xbe,0x34,0x0, 0x20,0x28,0x3, 0x2, 0x3, 0x2e,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49, +0x35,0xe, 0x53,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x35,0xe, 0x55,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0x6d,0x33,0x7a, +0x35,0x21,0x7e,0xa0,0x1, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x1, 0x7e,0xf5, +0x21,0x7a,0xf5,0x23,0xa, 0xef,0x2e,0xe5,0x33,0x7e,0xe9,0xb0,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x3, 0x52,0x6d,0xee,0x74,0x2, 0xac,0xbf,0x59,0xe5,0x11,0xed,0x59,0xe5, +0x12,0x1f,0x7e,0x17,0xf, 0x5d,0xbe,0x15,0x23,0x28,0x3, 0x2, 0x3, 0x68,0x7e,0x4, +0x1, 0x0, 0x7a,0x5, 0x31,0x2, 0x3, 0x8b,0x7e,0x35,0x23,0x6d,0x22,0x7c,0x56,0x7c, +0x67,0x6c,0x77,0x12,0x48,0x9f,0x7d,0xe3,0x7a,0xe5,0x31,0xbe,0xe4,0x0, 0x10,0x40, +0x3, 0x2, 0x3, 0x8b,0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x31,0x74,0x2, 0xac,0xbf,0x49, +0x45,0x12,0x1f,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x3, 0xa5,0x49,0x45,0x11,0xed,0x7a, +0x45,0x31,0x2, 0x3, 0xac,0x7e,0x45,0x31,0x59,0x45,0x11,0xed,0x59,0xf5,0x12,0x1f, +0x7e,0x35,0x31,0xbe,0x34,0x1, 0x0, 0x38,0x3, 0x2, 0x3, 0xc3,0x7e,0x34,0x1, 0x0, +0x7a,0x35,0x31,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x25,0xe, 0x53,0x12,0x6d,0xf1,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31, +0xad,0x32,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, +0xac,0x5b,0x49,0x32,0xe, 0x53,0xac,0xbe,0x49,0x15,0xe, 0xd, 0xbd,0x13,0x38,0x3, +0x2, 0x4, 0x14,0x7d,0x2, 0x2e,0x4, 0xe, 0x53,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, +0x10,0x2, 0x4, 0x1e,0x2e,0x24,0xe, 0x53,0x9e,0x35,0x21,0x1b,0x28,0x30,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49,0x25,0xe, 0x55, +0x12,0x6d,0xf1,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31,0xad,0x32,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, 0xac,0x5b,0x49,0x32,0xe, +0x55,0xac,0xbe,0x49,0x15,0xe, 0xf, 0xbd,0x13,0x38,0x3, 0x2, 0x4, 0x6f,0x7d,0x2, +0x2e,0x4, 0xe, 0x55,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, 0x10,0x2, 0x4, 0x79,0x2e, +0x24,0xe, 0x55,0x9e,0x35,0x21,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x26,0xbc,0xbe,0x28, +0x3, 0x2, 0x1, 0xf5,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x49,0x45,0xe, 0x53,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x35,0x49,0x45,0xe, 0x55,0x1e,0x44,0x1e, +0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x37,0x9, 0xf5,0xe, 0x57,0x19,0xf5,0xe, 0x11, +0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x58,0x19,0x75,0xe, 0x12,0x74,0x7, 0xac,0xbe, +0x9, 0x75,0xe, 0x59,0x19,0x75,0xe, 0x13,0x7c,0xbf,0x54,0xf, 0xbe,0xb0,0xa, 0x40, +0x3, 0x2, 0x5, 0xd7,0x7c,0xfb,0xa, 0xf, 0x7d,0x10,0x2e,0x15,0x33,0x7e,0x19,0xb0, +0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x5, 0xf4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x4, 0xf9, +0x74,0xff,0x19,0xb0,0x13,0x6, 0x2, 0x5, 0xd7,0x9, 0x90,0x13,0x6, 0xbe,0x90,0xff, +0x68,0x3, 0x2, 0x5, 0x4b,0x74,0x1, 0x19,0xb0,0x13,0x6, 0x7e,0x15,0x35,0x74,0x7, +0xac,0xbe,0x59,0x15,0xe, 0xd, 0x7e,0x15,0x37,0x74,0x7, 0xac,0xbe,0x59,0x15,0xe, +0xf, 0x6c,0xdd,0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x50,0x7, 0xac, +0x5d,0x7e,0x30,0x15,0xac,0x3f,0x2d,0x12,0x2e,0x14,0x12,0x34,0x74,0x7, 0x12,0x49, +0x26,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xdb,0x2, 0x5, 0xd7,0xbe,0x90,0x3, 0x50,0x3, +0x2, 0x5, 0x58,0xe4,0x19,0xb0,0x13,0x6, 0x7e,0x25,0x35,0x9, 0x80,0x13,0x6, 0x7e, +0x90,0x7, 0xac,0x89,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x43,0x59,0x24,0x12,0x34,0x7e, +0x25,0x37,0x59,0x24,0x12,0x36,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x5, 0xa0,0xe4, +0x2e,0x34,0x12,0x34,0x12,0x68,0x47,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x74, +0x1, 0x7e,0x70,0x15,0xac,0x7f,0x2e,0x34,0x12,0x34,0x12,0x68,0x47,0x2, 0x5, 0xc2, +0x49,0x34,0x12,0x34,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0xa, 0x3f,0x9, 0x43, +0x13,0x6, 0x7e,0x50,0x7, 0xac,0x45,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x32,0x49,0x33, +0x12,0x36,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0xa, 0x3f,0x2e,0x34,0x13,0x6, +0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x7c,0x1e,0x2e,0x10,0x27,0xa5,0xe7,0x60,0x3, +0x2, 0x5, 0xf4,0x7e,0x70,0x3, 0xac,0x7e,0x2e,0x34,0x12,0x1, 0x7e,0x24,0x0, 0x3, +0xe4,0x12,0x6e,0x21,0xb, 0xe0,0xbe,0xe0,0xa, 0x68,0x3, 0x2, 0x4, 0x86,0xe5,0x26, +0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x6, 0xe, 0x74,0x1, 0x7a,0xb3,0xf, 0x24,0xda,0x3b, +0x22,0xca,0x3b,0x7e,0xe3,0xf, 0x1b,0x4c,0xee,0x78,0x27,0x6c,0xff,0x6d,0x11,0x74, +0x2, 0xac,0xbf,0x59,0x15,0x13,0x56,0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x19, +0xa1,0x13,0x14,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x13,0x6a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xdb,0x6c,0xff,0x2, 0x7, 0xac,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xe, 0x11,0x54, +0xf, 0xf5,0x22,0xbe,0xb0,0xa, 0x40,0x3, 0x2, 0x7, 0xaa,0xe5,0x22,0xa, 0x1b,0x9, +0xb1,0xe, 0xdf,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x7, 0x85,0x75,0x21,0x0, 0x7e,0x31, +0x21,0x74,0x7, 0xac,0x3b,0x9, 0x71,0x13,0x14,0x7a,0x71,0x23,0xbe,0x71,0x22,0x68, +0x3, 0x2, 0x7, 0x77,0x49,0x21,0x13,0x12,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xf, +0x9d,0x32,0x12,0x6e,0x11,0x7d,0x63,0x7e,0xa1,0x21,0x74,0x7, 0xa4,0x49,0x25,0x13, +0x10,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6e,0x11,0x7d,0x3, +0x2d,0x6, 0xe5,0x23,0xa, 0x1b,0x9, 0xa1,0x13,0x6a,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0x71,0x23,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x13,0x56,0x2e,0x14,0x13,0x6a,0x7c,0xba, +0x14,0x7a,0x19,0xb0,0x2, 0x7, 0xaa,0x7e,0xa1,0x23,0x74,0x2, 0xa4,0x49,0x15,0x13, +0x56,0xbe,0x14,0x0, 0x32,0x28,0x9, 0xbe,0x4, 0x0, 0x32,0x28,0x3, 0x2, 0x7, 0x71, +0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, +0x80,0x6f,0xbe,0x4, 0x0, 0x96,0x28,0x63,0xe5,0x22,0xa, 0x1b,0x9, 0xb1,0xe, 0xdf, +0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0xe, 0xdf,0x7e,0xa0,0x3, 0xe5, +0x22,0xa, 0x1b,0x19,0xa1,0xe, 0xe9,0x7e,0x71,0x21,0x74,0x7, 0xac,0x7b,0x2e,0x34, +0x13,0x10,0x7e,0x14,0x13,0xb6,0x12,0x49,0x26,0xbe,0xe0,0x0, 0x28,0x2d,0x1b,0xe0, +0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3f,0x2e,0x14, +0xe, 0xd, 0x74,0x7, 0x12,0x49,0x26,0x7e,0x34,0x13,0xb6,0x7e,0x30,0x7, 0xac,0x3e, +0x2e,0x14,0xe, 0xd, 0x74,0x7, 0x12,0x49,0x26,0x1b,0xf0,0x7e,0xa1,0x23,0x74,0x2, +0xa4,0x59,0x5, 0x13,0x56,0x80,0x33,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0xa, 0x50,0x3, +0x2, 0x6, 0x6e,0x80,0x25,0x6d,0x11,0x7e,0xa1,0x22,0x74,0x2, 0xa4,0x59,0x15,0x13, +0x56,0x7e,0xa0,0xff,0x7e,0x31,0x22,0x74,0x7, 0xac,0x3b,0x19,0xa1,0x13,0x14,0x7e, +0xa0,0x2, 0xe5,0x22,0xa, 0x1b,0x19,0xa1,0x13,0x6a,0xb, 0xf0,0xbc,0xef,0x28,0x3, +0x2, 0x6, 0x47,0x7a,0xe3,0xf, 0x1b,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0x10,0x7e, +0x14,0x0, 0x46,0x12,0x6d,0x7d,0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d, +0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x24,0xc, 0x75,0x25,0x0, +0x75,0x26,0x17,0x75,0x27,0x0, 0x7e,0x34,0x13,0xd0,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6e,0x21,0x6c,0x66,0x2, 0x8, 0xed,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xd, 0x18,0x7a, +0x71,0x23,0x9, 0xa5,0xd, 0x19,0x1a,0x17,0x7d,0x21,0x1b,0x25,0xb, 0x15,0x7c,0x43, +0x1a,0x1a,0x1b,0x15,0x1a,0xa, 0xb, 0x5, 0x7c,0x21,0xbe,0x50,0x0, 0x58,0x2, 0x6c, +0x55,0x7e,0x73,0x10,0x2b,0xa, 0x7, 0x1b,0x4, 0x1a,0x44,0xbd,0x40,0x8, 0x2, 0x7c, +0x41,0xbe,0x30,0x0, 0x58,0x2, 0x6c,0x33,0x7e,0x73,0x10,0x2c,0xa, 0x7, 0x1b,0x4, +0x1a,0x42,0xbd,0x40,0x8, 0x2, 0x7c,0x21,0xbe,0x51,0x24,0x58,0x3, 0x7a,0x51,0x24, +0xbe,0x41,0x25,0x8, 0x3, 0x7a,0x41,0x25,0xbe,0x31,0x26,0x58,0x3, 0x7a,0x31,0x26, +0xbe,0x21,0x27,0x8, 0x3, 0x7a,0x21,0x27,0x7c,0xf5,0x80,0x4b,0x7c,0xe3,0x80,0x41, +0x1a,0xef,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0xe, 0x2d,0xf, 0xe, 0x4, 0xe, 0x4, +0xe, 0x4, 0x7c,0x71,0x7a,0x71,0x21,0x7e,0x10,0x18,0xac,0x1f,0x7c,0xb1,0x2c,0xbe, +0x54,0x7, 0x7e,0x4, 0x0, 0x1, 0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7c,0xb1,0xf5, +0x22,0xa, 0x7, 0x2e,0x4, 0x13,0xd0,0x7e,0x9, 0xb0,0x45,0x22,0x7a,0x9, 0xb0,0xb, +0xe0,0xbc,0x2e,0x58,0xbb,0xb, 0xf0,0xbc,0x4f,0x58,0xb1,0xb, 0x60,0x7e,0x73,0xd, +0xf7,0xbc,0x76,0x28,0x3, 0x2, 0x8, 0x27,0xbe,0x70,0x0, 0x38,0x3, 0x2, 0xd, 0x43, +0x7e,0xe1,0x26,0x2, 0xd, 0x3a,0x6c,0xff,0x80,0x1f,0x1a,0x3e,0x3e,0x34,0x1a,0x2f, +0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36,0xb, 0x38,0x30,0xe, 0x34,0xe, +0x34,0x3e,0x24,0x59,0x32,0x13,0xb6,0xb, 0xf0,0x7e,0x73,0x10,0x2b,0xbc,0x7f,0x18, +0xd9,0x7e,0xf1,0x24,0x2, 0xd, 0x2f,0x1a,0x4f,0x7e,0x14,0x0, 0x18,0xad,0x14,0x1a, +0x3e,0x7d,0x51,0x2d,0x53,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7a,0xa1,0x21, +0x7e,0x50,0x18,0xac,0x5f,0x7c,0xb5,0x2c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x22,0xa, 0x2a,0x9, 0xb2,0x13,0xd0, +0x55,0x22,0x78,0x3, 0x2, 0xd, 0x2d,0xbe,0xf0,0x3, 0x58,0x3, 0x2, 0x9, 0xfe,0x7e, +0x53,0x10,0x2b,0xa, 0x25,0x1b,0x26,0xbd,0x42,0x18,0x73,0x7d,0xf4,0x3e,0xf4,0x49, +0x5f,0x13,0xba,0x49,0x2f,0x13,0xb2,0x2d,0x25,0x7d,0x52,0x3e,0x54,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x2d,0x25,0x49,0x5f,0x13,0xbc,0x49,0xef,0x13,0xb0,0x2d,0xe5,0x7d, +0x5e,0x3e,0x54,0x2d,0x5e,0x9d,0x25,0x49,0xef,0x13,0xb8,0x49,0x5f,0x13,0xb4,0x2d, +0x5e,0x7d,0xe5,0x3e,0xe4,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d, +0x5e,0x9d,0x25,0x49,0x5f,0x13,0xb6,0x7d,0x5, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x9d,0x10,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x2, 0xb, 0x55,0x4c,0xff, +0x78,0x5d,0x7d,0x24,0x3e,0x24,0x49,0x12,0x13,0xb6,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x3e,0x54,0x2d,0x50,0x7d,0x1, 0x3e,0x4, 0x2d,0x5, 0x2d,0x1, 0x49,0x12,0x13,0xb8, +0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5, 0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x9d,0x1, 0x49,0x12,0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x2d,0x50,0x9d,0x51,0x49,0x22,0x13,0xbc,0x3e,0x24,0x9d,0x52,0x2, 0xb, 0x55,0xbe, +0xf0,0x1, 0x78,0x69,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x49,0x20, +0x13,0xb6,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x25,0x9d,0x21,0x49,0x10, +0x13,0xb8,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x21,0x49,0x10, +0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10, +0x13,0xbc,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x52,0x2, 0xb, 0x55,0xbe,0xf0,0x2, +0x68,0x3, 0x2, 0xb, 0x75,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x50,0x13,0xb2,0x7d, +0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x15,0x9d,0x12,0x49,0x20,0x13,0xb6,0x7d, +0xf2,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5f,0x3e,0x24,0x3e,0x24,0x2d, +0x25,0x2d,0x21,0x49,0x50,0x13,0xb8,0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x2d,0x15,0x9d,0x21,0x49,0x50,0x13,0xba,0x7d,0x15,0x3e,0x14,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10,0x13,0xbc,0x7d,0x21,0x3e, +0x24,0x2d,0x21,0x9d,0x52,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7d,0x23,0x3e,0x24,0x7e,0x14,0x0, 0x30,0xad,0x14,0x2d,0x21,0x2d,0x26,0x1b, +0x28,0x50,0x2, 0xd, 0x11,0x7e,0xa3,0x10,0x2b,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x68, +0x3, 0x2, 0xc, 0x11,0x3e,0x44,0x49,0x24,0x13,0xb2,0x7d,0x12,0x3e,0x14,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x4, 0x13,0xb0,0x7d,0x10,0x3e,0x14,0x2d,0x10, +0x9d,0x21,0x49,0x4, 0x13,0xb4,0x7d,0x10,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x10,0x9d,0x21,0x49,0x14,0x13,0xb6,0x7d,0xf1,0x3e,0xf4,0x3e,0xf4, +0x3e,0xf4,0x3e,0xf4,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x9d,0xf, 0x3e,0x14,0x3e,0x14,0x2d,0x10,0x2d,0x12,0x49,0x4, +0x13,0xb8,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x20, +0x9d,0x12,0x49,0x4, 0x13,0xba,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x20, +0x2d,0x21,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x2, 0xd, +0x0, 0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x76,0x1a,0xf, 0x3e,0x4, 0x49,0x30,0x13, +0xb0,0x7d,0x23,0x3e,0x24,0x2d,0x23,0x49,0x10,0x13,0xb2,0x7d,0x31,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x2d,0x31,0x9d,0x32,0x49,0x20,0x13,0xb4,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x49,0x20,0x13,0xb6,0x7d,0x12,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x9d,0x21,0x2d,0x23,0x49,0x30,0x13,0xb8,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x31,0x9d,0x23,0xe, +0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e,0x80,0x71,0x7e, +0xb3,0x10,0x2b,0x14,0xbc,0xbf,0x78,0x79,0x1a,0x5f,0x3e,0x54,0x49,0x25,0x13,0xb2, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9d,0x32,0x49,0x25,0x13,0xb0,0x3e,0x24, +0x9d,0x32,0x49,0x25,0x13,0xb4,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x24,0x9d,0x32,0x49,0x15,0x13,0xb6,0x7d,0x21, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x2, 0x7d,0x21,0x3e,0x24,0x2d,0x20,0x2d,0x21, +0x2d,0x23,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e, +0x3e,0x34,0x1a,0xf, 0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d,0x31,0x2d,0x36,0x1b,0x38, +0x20,0x1a,0x1e,0x3e,0x14,0x1a,0x2f,0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x23,0x2d, +0x21,0x2d,0x26,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x25,0xbc,0xbf,0x48,0x3, 0x2, 0x9, 0x37,0xb, 0xe0,0xe5,0x27,0xbc,0xbe,0x48,0x3, +0x2, 0x9, 0x6, 0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7e,0xb3,0xd, 0xf7,0xf5,0x2c, +0x75,0x10,0x0, 0xe4,0x7a,0xb3,0x15,0x54,0x7a,0xb3,0x15,0x55,0x6d,0x22,0x7e,0x34, +0x7f,0xff,0x7e,0x67,0xf, 0xda,0x6c,0xee,0xe4,0xa, 0x1e,0x19,0xb1,0x13,0xb6,0x6c, +0xaa,0x7e,0x10,0x2, 0xac,0x1e,0x19,0xa0,0x15,0x2b,0x19,0xb0,0x15,0x2c,0xe5,0x2c, +0xbc,0xbe,0x28,0x24,0x9, 0x20,0xd, 0x18,0x7e,0x30,0x18,0xac,0x23,0x9, 0x10,0xd, +0x19,0xa, 0x1, 0x2d,0x10,0x3e,0x14,0x2d,0x16,0xb, 0x18,0x10,0xbd,0x12,0x48,0x2, +0x7d,0x21,0xbd,0x13,0x18,0x2, 0x7d,0x31,0xb, 0xe0,0xbe,0xe0,0x14,0x78,0xb9,0x2d, +0x32,0xe, 0x34,0xe5,0x2c,0xbe,0xb0,0x2, 0x50,0x3, 0x2, 0x11,0x9d,0x6c,0xee,0x7e, +0x30,0x6, 0xac,0x3e,0x7d,0x51,0x2e,0x54,0x69,0x8f,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x23,0x58,0x20,0x7d,0x51,0x2e,0x54,0x69,0x91,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0x7a,0x25,0x30,0x2e,0x14,0x69,0x93,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0x7a,0x25,0x32,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc3,0x6c,0xee,0x2, 0x11, +0x8b,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19, +0xf5,0x23,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x13,0xb6,0x70,0xa, 0xa, 0x3e, +0xb, 0x34,0xa, 0x2e,0x19,0x72,0x13,0xb6,0xe5,0x2c,0x14,0xbc,0xbe,0x78,0x3, 0x2, +0x11,0x94,0xa, 0x5e,0xb, 0x54,0xf5,0x2d,0x2, 0x11,0x7f,0x7e,0x71,0x2d,0x74,0x2, +0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a,0xa1,0x24,0x9, 0xb3,0xd, 0x19,0xf5,0x25,0xa, +0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x2a,0xe5,0x25, +0xa, 0x2b,0xe5,0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x2b,0x75, +0x3d,0x2, 0x75,0x2f,0x0, 0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b, +0x2d,0x23,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0x7a,0x25,0x34,0x7e,0x11,0x24,0x74, +0x18,0xac,0x1b,0xe5,0x25,0xa, 0x1b,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0x7a,0x25,0x36,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0xe, 0x54,0x7a,0x55,0x38,0xbe,0x25,0x34,0x8, 0x14,0x7e,0x25,0x34, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x7a,0x25, +0x38,0xe5,0x2a,0xbe,0xb0,0x1, 0x38,0x37,0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x30,0x7c, +0xbf,0x54,0x2, 0xb4,0x2, 0x29,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, 0x20,0x7e, +0x71,0x22,0x74,0x18,0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d, +0x32,0xbe,0x35,0x38,0x18,0x3, 0x2, 0x11,0x13,0x75,0x2f,0x1, 0x2, 0x11,0x13,0xe5, +0x2a,0xbe,0xb0,0x1, 0x38,0xa, 0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x3, 0x2, 0x11,0x13, +0xe5,0x2a,0xbe,0xb0,0x4, 0x40,0x3, 0x2, 0x11,0x13,0xe5,0x2b,0xbe,0xb0,0x4, 0x40, +0x3, 0x2, 0x11,0x13,0x7c,0xbf,0x54,0x1, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x11,0x13, +0x6d,0x33,0x7a,0x35,0x3a,0x75,0x3c,0x0, 0x85,0x22,0x26,0x85,0x24,0x28,0xe5,0x24, +0xbe,0xb1,0x22,0x50,0x6, 0x85,0x24,0x26,0x85,0x22,0x28,0x85,0x23,0x27,0x85,0x25, +0x29,0xe5,0x25,0xbe,0xb1,0x23,0x50,0x6, 0x85,0x25,0x27,0x85,0x23,0x29,0x75,0x40, +0x0, 0x75,0x41,0x0, 0xe5,0x28,0xbe,0xb1,0x26,0x78,0x21,0x75,0x40,0x1, 0xe5,0x26, +0x60,0x5, 0xe5,0x26,0xb4,0xc, 0x3, 0x75,0x41,0x1, 0xe5,0x26,0xbe,0xb0,0x0, 0x28, +0x2, 0x15,0x26,0xe5,0x28,0xbe,0xb0,0xc, 0x50,0x2, 0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x27,0x78,0x21,0x75,0x40,0x1, 0xe5,0x27,0x60,0x5, 0xe5,0x27,0xb4,0x17,0x3, 0x75, +0x41,0x1, 0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x27,0xe5,0x29,0xbe,0xb0,0x17, +0x50,0x2, 0x5, 0x29,0x85,0x26,0x3e,0x80,0x78,0x85,0x27,0x3f,0x80,0x6a,0xe5,0x26, +0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x28,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x27,0xbe,0xb1, +0x3f,0x68,0x7, 0xe5,0x29,0xbe,0xb1,0x3f,0x78,0x24,0x7e,0x51,0x3e,0x74,0x18,0xac, +0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0xbe,0x24, +0x0, 0x0, 0x8, 0x6, 0x2e,0x25,0x3a,0x7a,0x25,0x3a,0x5, 0x3c,0x80,0x28,0x7e,0x51, +0x3e,0x74,0x18,0xac,0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0xbe,0x25,0x32,0x8, 0xc, 0xe5,0x3d,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x3d, +0x1, 0x80,0x3, 0x75,0x3d,0x0, 0x5, 0x3f,0xe5,0x29,0xbe,0xb1,0x3f,0x50,0x8f,0x5, +0x3e,0xe5,0x28,0xbe,0xb1,0x3e,0x50,0x81,0x7e,0x51,0x28,0x74,0x18,0xac,0x5b,0xe5, +0x27,0xa, 0x4b,0x2d,0x24,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x50,0x7e,0x25,0x3a,0x9d, +0x25,0x7e,0x31,0x26,0x74,0x18,0xac,0x3b,0xe5,0x29,0xa, 0xb, 0x7d,0x51,0x2d,0x50, +0x3e,0x54,0x2d,0x56,0xb, 0x58,0x50,0x9d,0x25,0x2d,0x14,0x3e,0x14,0x2d,0x16,0xb, +0x18,0x10,0x9d,0x21,0x7e,0x31,0x28,0x74,0x18,0xac,0x3b,0x2d,0x10,0x3e,0x14,0x2d, +0x16,0xb, 0x18,0x10,0x9d,0x21,0x7a,0x25,0x3a,0x7e,0x25,0x36,0x2e,0x25,0x34,0x7a, +0x25,0x38,0xe5,0x40,0xb4,0x1, 0x11,0xe5,0x41,0x70,0xd, 0x7e,0x25,0x3a,0x9e,0x25, +0x38,0x7a,0x25,0x3a,0x15,0x3c,0x15,0x3c,0xe5,0x3c,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x3c,0x24,0xfc,0xf5,0x3c,0x7e,0x25,0x3a,0xbe,0x24,0x0, 0x0, 0x58,0x3, 0x7a,0x35, +0x3a,0x7e,0x15,0x38,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x30,0x1a,0x26,0x1a,0x24,0x12, +0x48,0x85,0xe5,0x3c,0xa, 0x1b,0x6d,0x0, 0x12,0x48,0x85,0x7f,0x21,0x7e,0x35,0x3a, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x48,0x96,0xbf,0x12,0x8, 0xa, 0xe5, +0x3d,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x2f,0x2, 0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, +0x75,0x2f,0x2, 0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x63,0xe5,0x2f,0xa, 0x3b,0x2e,0x34, +0x15,0x53,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2d,0xa, 0x3b,0x9, 0xb3,0x13, +0xb6,0x70,0xc, 0xa, 0x2e,0x9, 0x52,0x13,0xb6,0x19,0x53,0x13,0xb6,0x80,0x3e,0x75, +0x2e,0x0, 0x80,0x32,0x9, 0x33,0x13,0xb6,0xa, 0x2e,0x9, 0xa2,0x13,0xb6,0xbc,0xa3, +0x28,0x12,0xe5,0x2e,0xa, 0x2b,0x9, 0x22,0x13,0xb6,0xbc,0x2a,0x78,0x16,0x19,0x32, +0x13,0xb6,0x80,0x10,0xe5,0x2e,0xa, 0x2b,0x9, 0xb2,0x13,0xb6,0xbc,0xb3,0x78,0x4, +0x19,0xa2,0x13,0xb6,0x5, 0x2e,0xe5,0x2c,0xbe,0xb1,0x2e,0x38,0xc7,0x5, 0x2d,0xe5, +0x2c,0xbe,0xb1,0x2d,0x28,0x3, 0x2, 0xe, 0x3b,0xb, 0xe0,0xe5,0x2c,0xbc,0xbe,0x28, +0x3, 0x2, 0xe, 0x1, 0x7e,0x34,0x13,0xb6,0x12,0x3b,0x6a,0xf5,0x10,0xda,0x3b,0x22, +0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55, +0x7e,0x37,0xf, 0x61,0x7a,0x35,0x3e,0x6c,0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0xe4,0x19,0xb3,0xd, 0x71,0xa, 0x5d,0x3e,0x54,0xb, 0x54,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x39,0x9, 0xb3,0xd, 0x19,0xf5,0x3a, +0xbe,0xd1,0x3a,0x28,0x3, 0x2, 0x12,0xe, 0x7e,0xb3,0x10,0x2c,0xa, 0xb, 0x1b,0x4, +0xa, 0x3d,0x9d,0x3, 0xe5,0x3a,0xa, 0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0xe, 0x7c, +0x3a,0xa, 0x4d,0xe5,0x3a,0xa, 0xb, 0x9d,0x4, 0x7c,0x51,0x2, 0x12,0x59,0xbe,0xd1, +0x3a,0x38,0x3, 0x2, 0x12,0x27,0xe5,0x3a,0xa, 0xb, 0xa, 0x3d,0x2d,0x30,0xb, 0x34, +0x7c,0x37,0x6c,0x55,0x2, 0x12,0x59,0xa, 0xfd,0xe5,0x3a,0xa, 0x4b,0x2d,0xf4,0x7e, +0xb3,0x10,0x2c,0xa, 0xb, 0x7d,0x30,0x1b,0x34,0xbd,0xf3,0x18,0x3, 0x2, 0x12,0x59, +0xbd,0x43,0x8, 0x3, 0x2, 0x12,0x59,0xa, 0x3d,0x2d,0x30,0xe5,0x3a,0xa, 0xb, 0x9d, +0x30,0x7c,0x37,0xa, 0x3d,0x9d,0x3, 0x7c,0x51,0xbe,0xd1,0x39,0x28,0x3, 0x2, 0x12, +0x83,0x7e,0xb3,0x10,0x2b,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5,0x39,0xa, +0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0x83,0x7c,0x4a,0xa, 0xd, 0xe5,0x39,0xa, 0x3b, +0x2, 0x12,0xca,0xbe,0xd1,0x39,0x38,0x3, 0x2, 0x12,0x9c,0xe5,0x39,0xa, 0xb, 0xa, +0x3d,0x2d,0x30,0xb, 0x34,0x7c,0x47,0x6c,0x22,0x2, 0x12,0xce,0xa, 0x4d,0xe5,0x39, +0xa, 0x5b,0x2d,0x45,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7d,0x3, 0x1b,0x4, 0xbd,0x40, +0x18,0x3, 0x2, 0x12,0xce,0xbd,0x50,0x8, 0x3, 0x2, 0x12,0xce,0xa, 0xd, 0x2d,0x3, +0xe5,0x39,0xa, 0x3b,0x9d,0x3, 0x7c,0x41,0xa, 0xd, 0x9d,0x30,0x7c,0x27,0x7e,0x37, +0xf, 0xda,0x7c,0xb2,0x7e,0x23,0xf, 0x53,0x7e,0x4, 0x9, 0xc8,0x12,0x5c,0x9d,0x7e, +0x37,0x9, 0xc8,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xca,0x7d,0x20,0x7a,0x1d,0x28, +0x7e,0x37,0x9, 0xcc,0x7d,0x3, 0x7e,0x37,0x9, 0xce,0x7d,0x20,0x7a,0x1d,0x2c,0x7e, +0x37,0x9, 0xd0,0x7d,0x3, 0x7e,0x37,0x9, 0xd2,0x7d,0x20,0x7a,0x1d,0x30,0x7e,0x37, +0x9, 0xd4,0x7d,0x3, 0x7e,0x37,0x9, 0xd6,0x7d,0x20,0x7a,0x1d,0x34,0xa, 0x2d,0xe5, +0x39,0xa, 0x3b,0x9d,0x32,0x7c,0xc7,0x2, 0x15,0x24,0xa, 0x4d,0xe5,0x3a,0xa, 0x5b, +0x9d,0x54,0xf5,0x38,0x2, 0x15,0xd, 0xbe,0xc0,0x0, 0x58,0x3, 0x2, 0x15,0xb, 0x7e, +0x73,0x10,0x2b,0xbc,0x7c,0x18,0x3, 0x2, 0x15,0xb, 0xe5,0x38,0xbe,0xb0,0x0, 0x58, +0x3, 0x2, 0x15,0xb, 0x7e,0x73,0x10,0x2c,0xbe,0x71,0x38,0x18,0x3, 0x2, 0x15,0xb, +0xe5,0x38,0x1a,0x1b,0x3e,0x14,0x1a,0x2c,0x7e,0x34,0x0, 0x30,0xad,0x32,0x2d,0x31, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x7e,0x53,0xf, 0x53,0xa, 0x25,0x9d,0x32,0x7a, +0x35,0x3c,0xbe,0x34,0x0, 0x0, 0x18,0x3, 0x2, 0x15,0xb, 0x7e,0x35,0x3e,0xbe,0x35, +0x3c,0x28,0x3, 0x2, 0x13,0xa6,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xd, 0x71,0x7e, +0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x39,0xa, 0x2b,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x13,0xd0,0xe5,0x3a,0xa, 0x2b,0xe5,0x38, +0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x2, 0x15,0xb, +0x75,0x3b,0x0, 0x2, 0x14,0x60,0xbe,0xe1,0x3b,0x78,0x3, 0x2, 0x14,0x5e,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe, +0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0x75,0x3b,0xff,0x2, 0x14,0x6c,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe, +0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0x75,0x3b,0x0, 0x2, 0x14,0x6c,0x5, 0x3b, +0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x3b,0x8, 0x3, 0x2, 0x13,0xd6,0xe5,0x3b,0x60,0x3, +0x2, 0x14,0xc0,0x7e,0x35,0x3c,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x3c,0x7e, +0xf5,0x3c,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x85,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a, +0x2, 0x7f,0x17,0x12,0x48,0x85,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34, +0x7e,0x1d,0x28,0x9f,0x17,0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30, +0xe5,0x3b,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x15,0xb, 0x7e,0xf5,0x3c,0x7d,0x3f,0x1a, +0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48,0x85,0x7f,0x1, 0x7e,0x1d, +0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x85,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34,0x7e,0x1d,0x28,0x9f,0x17, +0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30,0x5, 0x38,0xa, 0x2d,0xe5, +0x3a,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x38,0x1a,0x3b,0xbd,0x32,0x18,0x3, 0x2, +0x13,0x37,0xb, 0xc0,0xa, 0x2d,0xe5,0x39,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0x1a,0x3c, +0xbd,0x32,0x18,0x3, 0x2, 0x13,0x2a,0x74,0x6, 0x7e,0x1d,0x2c,0x2f,0x11,0x14,0x78, +0xfb,0x7a,0x1d,0x2c,0x7e,0xd, 0x28,0x7e,0x1d,0x2c,0x12,0x48,0xa1,0x2e,0x34,0x0, +0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xd, 0x6b,0x74,0x6, 0x7e,0x1d,0x34,0x2f, +0x11,0x14,0x78,0xfb,0x7a,0x1d,0x34,0x7e,0x7d,0x30,0x7e,0x1d,0x34,0x7f,0x7, 0x12, +0x48,0xa1,0x2e,0x34,0x0, 0x20,0x59,0x36,0xd, 0x6d,0x7e,0xb3,0xf, 0x60,0x7f,0x17, +0x70,0x3, 0x2, 0x15,0x91,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7a,0x1d,0x30,0xbe,0x18,0x0, 0x7f,0x38,0x3, 0x2, 0x15,0xa4,0x7e,0x18,0x0, +0x7f,0x7a,0x1d,0x30,0x7e,0x2d,0x30,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0x71,0x7e,0x70,0x7, 0xac,0x7f,0x19, +0xa3,0xd, 0x71,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xd, 0x71,0xbe,0x70,0xf, 0x38,0x3, +0x2, 0x15,0xdf,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xd, 0x71,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x11, +0x96,0xa5,0xbe,0x1, 0x58,0x7e,0xa3,0x10,0x2b,0xbc,0xa7,0x28,0xd, 0x7a,0x71,0xd, +0x74,0x30,0xac,0x7b,0x2e,0x37,0x16,0x9b,0x80,0x3c,0x7a,0x71,0xd, 0xbc,0xa7,0x78, +0x6, 0x7e,0x34,0x8, 0x9a,0x80,0x2f,0xa, 0x2a,0x7d,0x2, 0xb, 0x4, 0xa, 0x17,0xbd, +0x10,0x78,0x6, 0x7e,0x34,0x8, 0xca,0x80,0x1d,0x7d,0x2, 0xb, 0x5, 0xbd,0x10,0x78, +0x6, 0x7e,0x34,0x9, 0x2e,0x80,0xf, 0x2e,0x24,0x0, 0x3, 0xbd,0x12,0x68,0x3, 0x2, +0x19,0x6a,0x7e,0x34,0x9, 0x5e,0x7a,0x37,0x0, 0xfb,0x2, 0x19,0x6a,0xa5,0xbe,0x0, +0x46,0x7e,0x64,0x0, 0xb, 0x7a,0x69,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf,0x1, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, +0x74,0x1, 0x7e,0x70,0x1, 0x80,0x36,0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3, +0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x21,0x74,0x27,0x7e,0x70, +0x3, 0x12,0x6d,0xe0,0x2, 0x19,0x6a,0xa5,0xbe,0x2, 0x23,0xa5,0xbf,0x4, 0x7, 0x74, +0x1, 0x7e,0x70,0x4, 0x80,0x7, 0xa5,0xbf,0x5, 0x9, 0xe4,0x6c,0x77,0x12,0x0, 0x5e, +0x2, 0x19,0x6a,0xbe,0x70,0x1, 0x50,0x3, 0x2, 0x19,0x6a,0x2, 0x19,0x6a,0xa5,0xbe, +0x3, 0x15,0xbe,0x70,0xd, 0x28,0x9, 0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x2, 0x19,0x6a, +0x7a,0x73,0x10,0x2b,0x2, 0x19,0x6a,0xa5,0xbe,0x4, 0x15,0xbe,0x70,0x18,0x28,0x9, +0x74,0x18,0x7a,0xb3,0x10,0x2c,0x2, 0x19,0x6a,0x7a,0x73,0x10,0x2c,0x2, 0x19,0x6a, +0xa5,0xbe,0x5, 0x7, 0x7a,0x73,0x10,0x2d,0x2, 0x19,0x6a,0xa5,0xbe,0x7, 0x1e,0x7a, +0x73,0x10,0x4b,0x7c,0xb7,0x54,0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0x10, +0x54,0x5e,0x70,0x3, 0x4d,0x32,0x7a,0x37,0x10,0x54,0x2, 0x19,0x6a,0xa5,0xbe,0x8, +0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xac,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x16,0x2, 0x19,0x6a,0xa5,0xbe,0x9, 0x1c,0xbe,0x70,0xa, 0x50,0x3, 0x7e,0x70, +0xa, 0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xad,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x49,0x2, 0x19,0x6a,0xa5,0xbe,0xa, 0x10,0xa5,0xbf,0x0, 0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x10,0x3b,0x2, 0x19,0x6a,0xa5,0xbe,0xb, 0x14,0x7e,0xb3,0x10, +0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xae,0x2, 0x19,0x6a,0x7a,0x73,0x11,0x94,0x2, 0x19, +0x6a,0xa5,0xbe,0xc, 0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xd, 0xfe,0x2, +0x19,0x6a,0x7a,0x73,0x11,0x9d,0x2, 0x19,0x6a,0xa5,0xbe,0x4c,0x7, 0x7a,0x73,0xf, +0x46,0x2, 0x19,0x6a,0xa5,0xbe,0xfb,0x29,0x7a,0x71,0x8, 0x7e,0x37,0x10,0x50,0x5e, +0x70,0xdf,0x7a,0x37,0x10,0x50,0xe5,0x8, 0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x4e,0x37,0x10,0x50,0x7a,0x37,0x10,0x50,0x2, 0x19, +0x6a,0xa5,0xbe,0x4e,0x7, 0x7a,0x73,0x10,0x4a,0x2, 0x19,0x6a,0xa5,0xbe,0x4f,0x6, +0x12,0x0, 0x6, 0x2, 0x19,0x6a,0xbe,0x60,0x50,0x40,0x12,0xbe,0x60,0x51,0x38,0xd, +0xa, 0x26,0x2e,0x27,0x10,0x2f,0x9e,0x24,0x0, 0x50,0x2, 0x19,0x54,0xbe,0x60,0x52, +0x40,0x12,0xbe,0x60,0x55,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x31,0x9e,0x24,0x0, +0x52,0x2, 0x19,0x54,0xbe,0x60,0x56,0x40,0x12,0xbe,0x60,0x62,0x38,0xd, 0xa, 0x26, +0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x56,0x2, 0x19,0x54,0xbe,0x60,0x63,0x40,0x12, +0xbe,0x60,0x7a,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x63,0x2, +0x19,0x54,0xbe,0x60,0x7b,0x50,0x3, 0x2, 0x18,0xe8,0xbe,0x60,0x9f,0x28,0x3, 0x2, +0x18,0xe8,0x7e,0xb3,0x10,0x3b,0x70,0x48,0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24, +0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29, +0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f,0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17, +0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29, +0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, 0x2f,0x19,0x72,0xf, 0xdc,0x2, 0x19,0x6a, +0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27, +0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29,0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f, +0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17,0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27, +0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29,0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, +0x2f,0x19,0x72,0xf, 0x63,0x2, 0x19,0x6a,0xbe,0x60,0xa0,0x40,0x11,0xbe,0x60,0xac, +0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6c,0x9e,0x24,0x0, 0xa0,0x80,0x56,0xbe,0x60, +0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6e,0x9e,0x24, +0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38,0xc, 0xa, 0x26, +0x2e,0x27,0x10,0x70,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2,0x40,0x11,0xbe, +0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x72,0x9e,0x24,0x0, 0xd2,0x80,0x14, +0xbe,0x60,0xd6,0x40,0x14,0xbe,0x60,0xed,0x38,0xf, 0xa, 0x26,0x2e,0x27,0x10,0x74, +0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x80,0x11,0xa5,0xbe,0xf8,0x6, 0x7a,0x73,0x11, +0xe8,0x80,0x7, 0xa5,0xbe,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x3b,0x22,0xca,0x3b,0xe4, +0x7a,0xb3,0x13,0xde,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x23,0x6c,0xee,0x7e,0xa0,0xff, +0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0xff,0xa, 0x3e,0x19,0xb3,0x13, +0xca,0x7e,0x34,0xff,0xff,0x74,0x2, 0xac,0xbe,0x59,0x35,0x13,0xb6,0xe4,0xa, 0x3e, +0x19,0xb3,0x13,0xd4,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xd2,0x7e,0xb3,0xf, 0x1b,0x60, +0x3, 0x2, 0x19,0xe5,0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0x2, 0x1c,0x18,0x6c,0xee,0x7e, +0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, +0x78,0xdd,0x2, 0x1c,0x18,0x7e,0xb3,0xf, 0x1c,0x60,0x3, 0x2, 0x1a,0x38,0x6c,0xee, +0x2, 0x1a,0x2d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5e, +0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19, +0xe5,0xe, 0x11,0x74,0x1, 0xa, 0x3e,0x19,0xb3,0x13,0xd4,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0xbe,0x2, 0x1c,0x18,0x6c,0xee,0x2, 0x1a,0xb7,0x6c,0xff,0xa, +0x3f,0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x1a,0xae, +0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x1a,0xae,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23, +0x49,0x23,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x9d,0x32,0x12,0x6e, +0x11,0x7d,0x63,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23,0x49,0x23,0x0, 0x14,0x74, +0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6e,0x11,0x2d,0x36,0x7a,0x35, +0x21,0x74,0x2, 0xac,0xbe,0x49,0x45,0x13,0xb6,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x1a, +0xae,0xa, 0x4e,0x19,0xf4,0x13,0xca,0x7e,0x35,0x21,0x59,0x35,0x13,0xb6,0xb, 0xf0, +0xbe,0xf0,0xa, 0x78,0x8a,0xb, 0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, +0x1a,0x3d,0x6c,0xee,0x2, 0x1b,0x6e,0x74,0x1, 0x7a,0xb3,0x13,0xde,0x6c,0xff,0x2, +0x1b,0xd, 0xbc,0xfe,0x78,0x3, 0x2, 0x1b,0xb, 0xa, 0x3f,0x9, 0x63,0x13,0xca,0xa, +0x2e,0x9, 0x72,0x13,0xca,0xbc,0x76,0x68,0x3, 0x2, 0x1b,0xb, 0x74,0x2, 0xac,0xbf, +0x49,0x25,0x13,0xb6,0x74,0x2, 0xac,0xbe,0x49,0x35,0x13,0xb6,0xbd,0x32,0x50,0x3, +0x2, 0x1b,0xb, 0xe4,0x7a,0xb3,0x13,0xde,0x2, 0x1b,0x15,0xb, 0xf0,0x7e,0x73,0xf, +0x1b,0xbc,0x7f,0x38,0xbd,0x7e,0xb3,0x13,0xde,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1b, +0x6c,0x74,0x1, 0xa, 0x3e,0x9, 0xa3,0x13,0xca,0xa, 0x4a,0x19,0xb4,0x13,0xd4,0x7e, +0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, +0xa, 0x2e,0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32, +0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0xa, 0x2e,0x9, 0x42,0x13,0xca, +0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0x7e,0x73, +0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, 0x1a,0xc7,0x6c,0xee,0x2, 0x1b,0xdd,0x74,0x7, +0xac,0xbe,0x9, 0xb5,0xe, 0x11,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x1b,0xdb,0x6c,0xff, +0xa, 0x3f,0x9, 0xb3,0x13,0xd4,0x60,0x3, 0x2, 0x1b,0xd4,0x74,0x1, 0x19,0xb3,0x13, +0xd4,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0x50,0x2, +0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19,0xf5,0xe, +0x11,0x2, 0x1b,0xdb,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xb5,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0x99,0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13,0xd4,0xbe,0xb0,0x1, +0x78,0x3, 0x2, 0x1c,0x11,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x14,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, +0x28,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xcf,0x7e,0xf3,0xf, 0x1b,0x6c,0xee,0xa, 0x3e, +0x9, 0xb3,0x13,0xd4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x6a,0xa, 0x3e,0x2e,0x35, +0x23,0x9, 0xb3,0x0, 0xa, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x43,0x74,0x3, 0x19, +0xb3,0x0, 0xa, 0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xa3,0x0, 0xa, 0xbe,0xa0,0x3, 0x68, +0x3, 0x2, 0x1c,0x5b,0xe4,0x7a,0x39,0xb0,0x2, 0x1c,0x98,0x4c,0xaa,0x68,0x3, 0x2, +0x1c,0x98,0x74,0x2, 0x7a,0x39,0xb0,0x2, 0x1c,0x98,0xa, 0x3e,0x2e,0x35,0x23,0x9, +0xb3,0x0, 0xa, 0xbe,0xb0,0x2, 0x78,0x3, 0x2, 0x1c,0x80,0x60,0x3, 0x2, 0x1c,0x93, +0x74,0x1, 0x7a,0x39,0xb0,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4,0x19,0xe5,0xe, 0x11, +0x2, 0x1c,0x98,0x74,0x3, 0x7a,0x39,0xb0,0xa, 0x2e,0x2e,0x25,0x23,0x7e,0x29,0x70, +0x19,0x72,0x0, 0xa, 0xb, 0xe0,0xbe,0xe0,0xa, 0x50,0x3, 0x2, 0x1c,0x1e,0xda,0x3b, +0x22,0xca,0x3b,0x75,0x24,0x0, 0x75,0x26,0x0, 0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e, +0x34,0xe, 0xdf,0x7a,0x35,0x2a,0x7e,0xa3,0xf, 0x24,0x4c,0xaa,0x78,0xf, 0x7e,0xb3, +0xf, 0x20,0x70,0x9, 0x7e,0xb3,0xf, 0x21,0x70,0x3, 0x2, 0x1f,0x70,0x4c,0xaa,0x78, +0x11,0x7e,0xb3,0xf, 0x20,0x60,0x16,0x80,0x9, 0x7e,0x73,0x16,0xba,0xbe,0x70,0xf, +0x38,0x6, 0x7e,0xb3,0x15,0xde,0x60,0xf1,0xe4,0x7a,0xb3,0x15,0xde,0x20,0x0, 0x6, +0x7e,0x74,0x0, 0x76,0x80,0x4, 0x7e,0x74,0x0, 0xb8,0x7d,0x37,0x7e,0x24,0x0, 0x42, +0x74,0xff,0x12,0x6e,0x21,0x74,0xaa,0x7a,0x79,0xb0,0x19,0xb7,0x0, 0x1, 0x7e,0x73, +0xf, 0x1d,0x19,0x77,0x0, 0x3, 0x75,0x25,0x0, 0x6c,0xdd,0x2, 0x1e,0xfd,0x7e,0x70, +0x7, 0xac,0x7d,0x9, 0xa3,0xe, 0x9d,0x7a,0xa1,0x29,0x7c,0xba,0x54,0xf, 0xa, 0x2b, +0x2e,0x25,0x2a,0x7e,0x29,0xc0,0x7c,0xba,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x13,0xb4, +0xb0,0x2, 0x80,0x3, 0x2, 0x1e,0xfb,0x53,0x29,0xf, 0xbe,0xc0,0x1, 0x68,0x3, 0x2, +0x1e,0xfb,0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x1e,0xfb,0x7e,0xa1,0x25,0x74,0x6, 0xa4, +0xf5,0x21,0x9, 0xb3,0xe, 0x9e,0xf5,0x27,0x74,0x7, 0xac,0xbd,0x9, 0xb5,0xe, 0x9f, +0xc4,0x54,0xf0,0xf5,0x28,0x7e,0x73,0xf, 0x46,0xbe,0x71,0x29,0x28,0x68,0x7e,0xb3, +0xf, 0x22,0x70,0x2a,0x7e,0x8, 0x0, 0x27,0xe5,0x29,0xa, 0x3b,0x2e,0x34,0x15,0xca, +0x74,0x1, 0x7e,0x50,0xf, 0x12,0x5f,0xe0,0x7e,0x8, 0x0, 0x28,0xe5,0x29,0xa, 0x3b, +0x2e,0x34,0x15,0xd4,0x74,0x10,0x7e,0x50,0x20,0x12,0x5f,0xe0,0x80,0x14,0xe5,0x29, +0xa, 0x3b,0x9, 0xb3,0x15,0xca,0xf5,0x27,0xe5,0x29,0xa, 0x3b,0x9, 0xb3,0x15,0xd4, +0xf5,0x28,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x2e,0x25,0x2a,0x7e,0x29,0xb0,0xb4,0x1, +0x15,0xe4,0x19,0xb3,0x15,0xca,0x6c,0xaa,0xe5,0x29,0xa, 0x3b,0x19,0xa3,0x15,0xd4, +0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0xf, 0x5f,0xb4,0xff,0x15,0x74,0x7, 0xac, +0xbd,0x9, 0xb5,0xe, 0x9d,0xbe,0xb0,0xff,0x68,0x5, 0x75,0x27,0x1, 0x80,0x3, 0x75, +0x27,0x0, 0x7e,0x90,0x7, 0xac,0x9d,0x49,0x54,0xe, 0x99,0x7a,0x55,0x2c,0x49,0x54, +0xe, 0x9b,0x7a,0x55,0x2e,0xbe,0xc0,0x1, 0x78,0x2e,0x75,0x30,0x0, 0x7e,0x71,0x30, +0x74,0x7, 0xac,0x7b,0x9, 0xb3,0x15,0xe3,0x54,0xf, 0xbe,0xb1,0x29,0x78,0x10,0x49, +0x23,0x15,0xdf,0x7a,0x25,0x2c,0x49,0x53,0x15,0xe1,0x7a,0x55,0x2e,0x80,0x9, 0x5, +0x30,0xe5,0x30,0xbe,0xb0,0xa, 0x40,0xd5,0x7e,0x25,0x2c,0x7a,0x25,0x22,0xa, 0x54, +0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x21,0xa, 0x3b,0x7d,0x13,0x2d,0x17,0x19,0xa1, +0x0, 0x5, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x6, 0x7e,0x25,0x2e,0x7a,0x25,0x22, +0xa, 0x14,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x57,0x19,0x35,0x0, 0x7, 0x7d,0x53, +0x2d,0x57,0x19,0x55,0x0, 0x8, 0xe5,0x27,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0x9, +0xe5,0x28,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0xa, 0x9, 0xa4,0xe, 0x9d,0x7c,0xba, +0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x27,0x2e,0x24,0x0, 0x7, 0x7e,0x29,0xb0, +0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x21,0xbe,0xc0,0x1, 0x68,0x2, 0x5, +0x24,0x5, 0x26,0x7c,0xbc,0x3, 0x3, 0x54,0xc0,0x7d,0x13,0x2d,0x17,0x2e,0x14,0x0, +0x5, 0x7e,0x19,0x50,0x2c,0x5b,0x7a,0x19,0x50,0x80,0xe, 0x2d,0x37,0x2e,0x34,0x0, +0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x25,0xb, 0xd0,0x7e,0x73,0xf, +0x46,0xbc,0x7d,0x28,0x3, 0x2, 0x1d,0x2e,0xe5,0x24,0x19,0xb7,0x0, 0x4, 0xe5,0x26, +0xbe,0xb0,0x0, 0x28,0x2d,0x74,0x42,0x19,0xb7,0x0, 0x2, 0xe4,0x19,0xb7,0x0, 0x41, +0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e,0x24,0x0, 0x41,0x7e, +0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x41,0x78,0xe4,0xb2,0x0, +0x80,0xe, 0x7e,0xb3,0xf, 0x21,0xb4,0x1, 0xc, 0x7e,0xb3,0x10,0xd1,0xb4,0x24,0x5, +0x74,0x1, 0x12,0x6e,0xd3,0x7e,0xb3,0xf, 0x20,0x60,0x6, 0x7e,0x35,0x2a,0x12,0x68, +0x79,0xe4,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x20,0x7a,0xb3,0xf, 0x21,0x80,0x4, +0xe4,0x12,0x6e,0xd3,0x7e,0x24,0xe, 0x99,0x7e,0x34,0x15,0xdf,0x7e,0x14,0x0, 0x46, +0x12,0x6d,0x7d,0xe5,0x26,0x70,0xd, 0x7e,0x34,0x15,0xdf,0x7e,0x24,0x0, 0x46,0x74, +0xff,0x12,0x6e,0x21,0xda,0x3b,0x22,0xca,0x79,0x75,0x26,0x17,0x7e,0xb3,0xd, 0xf7, +0xf5,0x21,0x70,0x3, 0x2, 0x22,0x39,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x1, 0x2b,0xe4, +0x12,0x6e,0x21,0x7e,0x34,0x14,0xe1,0x7e,0x24,0x0, 0x2, 0xe4,0x12,0x6e,0x21,0x6c, +0xaa,0x2, 0x20,0x4e,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, 0x18,0x9, 0x23,0xd, +0x19,0x1a,0x3, 0x1b,0x5, 0x80,0x69,0xbe,0x10,0x0, 0x48,0x62,0xbe,0x10,0xd, 0x58, +0x5d,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, +0x7e,0x74,0x0, 0x1, 0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x7c,0xef,0xa, 0x40,0x2e, +0x44,0x14,0xe1,0x7e,0x49,0xb0,0x4c,0xbe,0x7a,0x49,0xb0,0x1a,0x32,0x1b,0x35,0x7c, +0xf7,0x80,0x1f,0xbe,0xf0,0x0, 0x48,0x18,0xe5,0x26,0xbc,0xbf,0x8, 0x12,0x74,0x1, +0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0x4f,0x2d,0x43,0x19,0xb4,0x13,0xb6, +0xb, 0xf0,0x1a,0x22,0x2e,0x24,0x0, 0x3, 0x1a,0x3f,0xbd,0x32,0x48,0xd5,0xb, 0x10, +0x1a,0x23,0x2e,0x24,0x0, 0x3, 0x1a,0x31,0xbd,0x32,0x48,0x8b,0xb, 0xa0,0xe5,0x21, +0xbc,0xba,0x28,0x3, 0x2, 0x1f,0xc4,0x6c,0x11,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, +0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0xe9,0xa, 0x30,0x9, 0xb3,0x14,0xe1,0x5c,0xbe,0x78,0x3, 0x2, +0x21,0x15,0x6d,0x33,0x7a,0x35,0x22,0x75,0x24,0x0, 0x1a,0x21,0x7e,0x34,0x0, 0x30, +0xad,0x32,0x7d,0x43,0x2e,0x47,0xf, 0xda,0x6c,0x0, 0x80,0x26,0x1a,0xe1,0x7e,0xf4, +0x0, 0x17,0xad,0xfe,0xa, 0x30,0x2d,0x3f,0x9, 0xb3,0x13,0xb6,0x70,0x12,0x7e,0x70, +0x2, 0xac,0x70,0x2d,0x34,0xb, 0x38,0x30,0x2e,0x35,0x22,0x7a,0x35,0x22,0x5, 0x24, +0xb, 0x0, 0xe5,0x26,0xbc,0xb0,0x38,0xd4,0xe5,0x24,0x60,0x49,0xe5,0x24,0x1a,0x2b, +0x7e,0x35,0x22,0x12,0x48,0x53,0x7a,0x35,0x22,0x6c,0xff,0x80,0x32,0x1a,0x21,0x7e, +0x34,0x0, 0x17,0xad,0x32,0x1a,0xff,0x7d,0xe3,0x2d,0xef,0x9, 0xbe,0x13,0xb6,0xb4, +0x1, 0x1b,0x1a,0x21,0x7e,0x34,0x0, 0x18,0xad,0x32,0x7d,0x23,0x2d,0x2f,0x3e,0x24, +0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x9e,0x35,0x22,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x26,0xbc,0xbf,0x18,0xc8,0xb, 0x10,0xa5,0xb9,0xd, 0x2, 0x80,0x3, 0x2, 0x20,0x59, +0x6c,0xaa,0x2, 0x22,0x30,0x7e,0x10,0x2, 0xac,0x1a,0x9, 0x30,0xd, 0x18,0x9, 0x20, +0xd, 0x19,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xf5,0x25,0x7c,0xba,0x54,0x7, 0x7e,0x44, +0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa5,0xbb,0x0, 0x2c,0x1a, +0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, +0xda,0xb, 0x38,0x20,0x49,0x33,0x0, 0x30,0xbd,0x32,0x18,0x3, 0x2, 0x21,0xf5,0x1a, +0x33,0xb, 0x34,0x7c,0xb7,0x19,0xb0,0xd, 0x18,0x80,0x7a,0xa5,0xbb,0xc, 0x2c,0x1a, +0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x22,0x2d,0x23,0x3e,0x24,0x2e,0x27,0xf, +0xda,0xb, 0x28,0x30,0x49,0x2, 0xff,0xd0,0xbd,0x3, 0x8, 0x59,0x1a,0x33,0x1b,0x34, +0x7e,0x10,0x2, 0xac,0x1a,0x19,0x70,0xd, 0x18,0x80,0x4a,0x1a,0xe3,0x7e,0xf4,0x0, +0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x49,0x43,0x0, +0x30,0x49,0x3, 0xff,0xd0,0xbd,0x4, 0x8, 0x16,0xb, 0x38,0x20,0xbd,0x2, 0x8, 0x25, +0x1a,0x23,0x1b,0x24,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x50,0xd, 0x18,0x80,0x16,0xb, +0x38,0x0, 0xbd,0x40,0x8, 0xf, 0x1a,0x33,0xb, 0x34,0x7c,0x37,0x7e,0x10,0x2, 0xac, +0x1a,0x19,0x30,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, 0x18,0x1a,0x23, +0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x2, 0x2d,0x3, 0x3e,0x4, 0x2e,0x7, 0xf, 0xda, +0xb, 0x8, 0x0, 0xbe,0x4, 0x0, 0x3c,0x58,0x15,0x7c,0x7e,0x6e,0x70,0xff,0xe5,0x25, +0xa, 0x4b,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x5c,0xb7,0x7a,0x49,0xb0,0xb, 0xa0, +0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x21,0x25,0xda,0x79,0x22,0xca,0xd8,0xca,0x79, +0x6c,0xaa,0x7e,0x34,0x11,0x9e,0x7e,0x44,0x11,0x4a,0xe4,0x7a,0xb3,0x16,0xbb,0x7e, +0xb3,0xe, 0xa, 0x54,0xfe,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, 0x17,0xbe,0xb0,0x0, +0x28,0x4f,0x7e,0x53,0xd, 0xf8,0xbe,0x50,0x0, 0x28,0x46,0x6c,0xff,0x80,0x3c,0x7e, +0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x40,0x9, 0xe1,0xd, 0x41,0x7e,0x30,0x2, 0xac, +0x3e,0x2d,0x13,0xb, 0x18,0x0, 0x6d,0x11,0x9e,0x17,0xf, 0x4c,0xbd,0x1, 0x58,0x19, +0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x13,0x49,0x1, 0x0, 0x30,0x6d,0x11,0x9e,0x17,0xf, +0x4a,0xbd,0x1, 0x58,0x4, 0x5, 0x1d,0x80,0xb, 0xb, 0xf0,0xbc,0x5f,0x38,0xc0,0x80, +0x3, 0x75,0x1d,0x0, 0xe5,0x1d,0xbe,0xb0,0x3, 0x40,0x17,0x7e,0xb3,0xe, 0xa, 0x44, +0x1, 0x7a,0xb3,0xe, 0xa, 0x75,0x1d,0x0, 0x7e,0xb3,0x16,0xbb,0x44,0x1, 0x7a,0xb3, +0x16,0xbb,0x7e,0xb3,0xe, 0xa, 0x54,0xfd,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, 0x16, +0x70,0x59,0x7e,0x53,0xd, 0xf7,0xbe,0x50,0x0, 0x28,0x50,0x6c,0xff,0x80,0x48,0x7e, +0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x18,0x9, 0xe1,0xd, 0x19,0x7e,0x30,0x2, 0xac, +0x3d,0x2d,0x14,0x49,0x11,0x0, 0x30,0x6d,0x0, 0x9e,0x7, 0xd, 0xff,0xbd,0x10,0x48, +0xe, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x14,0xb, 0x18,0x10,0xbd,0x10,0x58,0x16,0x7e, +0xb3,0xe, 0xa, 0x44,0x2, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x2, 0x7a, +0xb3,0x16,0xbb,0x80,0x6, 0xb, 0xf0,0xbc,0x5f,0x38,0xb4,0x7e,0xb3,0xe, 0x9, 0xb4, +0x1, 0x2, 0x80,0x3, 0x2, 0x23,0xdf,0x7e,0xb3,0xd, 0x16,0x70,0x6d,0x6c,0xff,0x80, +0x61,0x7e,0x50,0x2, 0xac,0x5f,0x7d,0x12,0x2d,0x14,0xb, 0x18,0x10,0xbe,0x17,0xd, +0xff,0x8, 0x4d,0x2d,0x23,0xb, 0x28,0x20,0xbe,0x27,0xd, 0xff,0x58,0x42,0xbe,0xf1, +0x1e,0x68,0x6, 0x7a,0xf1,0x1e,0x75,0x1f,0x0, 0xbe,0xf1,0x1e,0x78,0x2, 0x5, 0x1f, +0xe5,0x1f,0xbe,0xb0,0x10,0x28,0x33,0x75,0x1f,0x10,0xe5,0x51,0x70,0x16,0x7e,0xb3, +0xe, 0xa, 0x44,0x4, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x4, 0x7a,0xb3, +0x16,0xbb,0x80,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x80,0xa, +0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0x97,0x6c,0xaa,0x6c,0xff,0x80,0x17, +0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x34,0xb, 0x38,0x30,0xbe,0x37,0xd, 0xff,0x8, 0x5, +0x7e,0xa0,0x1, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0xe1,0x4c, +0xaa,0x78,0x1a,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x75,0x1e,0xff, +0x75,0x1f,0x0, 0x7e,0xb3,0x16,0xbb,0x54,0xfb,0x7a,0xb3,0x16,0xbb,0x7e,0xb3,0xe, +0xa, 0x54,0xf7,0x7a,0xb3,0xe, 0xa, 0x7e,0x73,0xd, 0xfa,0xa, 0x27,0x7e,0x73,0xd, +0xf9,0xa, 0x37,0x2d,0x32,0xbe,0x37,0xe, 0x3, 0x28,0x14,0x7e,0xb3,0xe, 0xa, 0x44, +0x8, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x8, 0x7a,0xb3,0x16,0xbb,0x7e, +0xb3,0xe, 0xa, 0x44,0x10,0x7a,0xb3,0xe, 0xa, 0x6c,0xff,0x80,0x49,0x7e,0x50,0x2, +0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70,0x18,0xac,0x7d,0xa, +0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x49,0x22,0x10,0x3, +0x9d,0x32,0x7a,0x35,0x21,0x12,0x6e,0x11,0xbe,0x37,0xe, 0x1, 0x28,0x16,0x7e,0xb3, +0xe, 0xa, 0x54,0xef,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x10,0x7a,0xb3, +0x16,0xbb,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xaf,0x7e,0x34, +0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x12,0x6e,0x21,0x6c,0xff,0x80,0x25,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70,0x18,0xac,0x7d, +0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x59,0x32,0x10, +0x3, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xd3,0xda,0x79,0xda,0xd8,0x22, +0xca,0x3b,0x6d,0x33,0x7a,0x35,0x21,0x75,0x25,0x0, 0x75,0x26,0x0, 0x7e,0x23,0xd, +0xf7,0x7a,0x21,0x23,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x13,0xb6,0x7e,0x30,0x2, 0xac, +0x23,0x7e,0x24,0xd, 0x18,0x7e,0x34,0x13,0xb8,0x12,0x6d,0x7d,0xe5,0x23,0xbe,0xb0, +0xa, 0x38,0x3, 0x2, 0x26,0xd5,0x75,0x24,0x0, 0x6c,0xff,0x2, 0x25,0xe9,0x7e,0x34, +0x3, 0xff,0x7a,0x35,0x27,0x75,0x26,0xff,0x6c,0xee,0x80,0x7e,0x7e,0x70,0x2, 0xac, +0x7e,0x9, 0xb3,0x13,0xb8,0xbe,0xb0,0xff,0x68,0x6e,0x7c,0xbe,0xc4,0x23,0x54,0x1f, +0x7c,0xab,0x7a,0xa1,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e, +0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x2c,0xa, 0x2a,0x9, 0xb2,0xd, 0x68,0x55,0x2c, +0x68,0x46,0x9, 0x73,0x13,0xb9,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa3, +0xa, 0x37,0x9d,0x32,0x12,0x6e,0x11,0x7d,0x63,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x13, +0xb8,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa2,0xa, 0x37,0x9d,0x32,0x12, +0x6e,0x11,0x2d,0x36,0x7a,0x35,0x29,0x7e,0x35,0x27,0xbe,0x35,0x29,0x28,0x9, 0x7e, +0x35,0x29,0x7a,0x35,0x27,0x7a,0xe1,0x26,0xb, 0xe0,0xe5,0x23,0xbc,0xbe,0x28,0x3, +0x2, 0x25,0x1c,0xe5,0x26,0xbe,0xb0,0xff,0x68,0x3d,0x7e,0x71,0x26,0x74,0x2, 0xac, +0x7b,0x9, 0x33,0x13,0xb8,0x7e,0x50,0x18,0xac,0x53,0x9, 0xa3,0x13,0xb9,0xa, 0xa, +0x2d,0x20,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28,0x20,0xbe,0x24,0x0, 0x3c,0x48, +0x16,0xe5,0x24,0x1a,0x2b,0x3e,0x24,0x19,0x32,0x13,0xe0,0x19,0xa2,0x13,0xe1,0x74, +0xff,0x19,0xb3,0x13,0xb8,0x5, 0x24,0xb, 0xf0,0xe5,0x11,0xbc,0xbf,0x28,0x3, 0x2, +0x25,0xe, 0x7e,0xf1,0x24,0x2, 0x26,0xbb,0x6d,0x33,0x7a,0x35,0x21,0x7e,0xa0,0xff, +0x6c,0xee,0x2, 0x26,0x8d,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0x7b,0x7a,0x71,0x2b, +0x7c,0xbe,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0xb9,0xf5,0x2c,0xa, 0x37,0x9, 0xb3,0xd, 0x68,0x55,0x2c,0x68,0x5e,0x7e,0x90,0x2, +0xac,0x9e,0x9, 0x44,0x13,0xb8,0xbe,0x40,0xff,0x68,0x50,0x7e,0x50,0x18,0xac,0x45, +0x9, 0xb4,0x13,0xb9,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28, +0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac, +0x5e,0x9, 0x62,0x13,0xb8,0x7e,0x30,0x18,0xac,0x36,0x9, 0x72,0x13,0xb9,0xa, 0x7, +0x2d,0x10,0x3e,0x14,0x2e,0x17,0x13,0xb6,0xb, 0x18,0x40,0xbe,0x45,0x21,0x8, 0xb, +0x7a,0x61,0x25,0x7a,0x71,0x26,0x7a,0x45,0x21,0x7c,0xae,0xb, 0xe0,0xe5,0x23,0xbc, +0xbe,0x28,0x3, 0x2, 0x26,0x5, 0xbe,0xa0,0xff,0x68,0x1e,0x7e,0x71,0x25,0x7e,0x90, +0x2, 0xac,0x9f,0x19,0x74,0x13,0xe0,0xe5,0x26,0x19,0xb4,0x13,0xe1,0x7e,0x70,0xff, +0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x13,0xb8,0xb, 0xf0,0xbe,0xf0,0xa, 0x50,0x3, +0x2, 0x25,0xf8,0x7e,0x24,0x13,0xe0,0x7e,0x34,0x13,0xb8,0x7e,0x14,0x0, 0x28,0x12, +0x6d,0x7d,0x75,0x23,0xa, 0x7e,0x34,0x15,0xa2,0x7e,0x24,0x0, 0x14,0x74,0xff,0x12, +0x6e,0x21,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0x55,0x7e,0x31,0x23,0x74,0x2, 0xac,0x3b, +0x7e,0x24,0x13,0xb8,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x7d,0x7e,0x31,0x23,0x74,0x2, +0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0x15,0xa2,0x12,0x6d,0x7d,0x6c,0xff,0x80, +0x27,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24,0xd, 0x68,0x7e,0x29, +0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xf0,0xe5,0x23,0xbc,0xbf,0x38,0xd3,0x85,0x23, +0x11,0xe5,0x23,0x7a,0xb3,0xd, 0xf7,0xda,0x3b,0x22,0x7c,0x7b,0xbe,0x70,0x10,0x40, +0x12,0xbe,0x70,0x4b,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x0, 0xfb,0x9e,0x34,0x0, 0x10, +0x2, 0x29,0x85,0xa5,0xbf,0x0, 0x3, 0xe5,0xb, 0x22,0xa5,0xbf,0x1, 0x3, 0xe5,0xd, +0x22,0xa5,0xbf,0x2, 0x5, 0x7e,0xb3,0xf, 0x28,0x22,0xbe,0x70,0x3, 0x40,0x12,0xbe, +0x70,0x5, 0x38,0xd, 0xa, 0x37,0x2e,0x34,0x10,0x2b,0x9e,0x34,0x0, 0x3, 0x2, 0x29, +0x85,0xa5,0xbf,0x6, 0x3, 0x74,0x1, 0x22,0xa5,0xbf,0x7, 0x5, 0x7e,0xb3,0x10,0x4b, +0x22,0xa5,0xbf,0x8, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xac,0x22, +0x7e,0xb3,0x11,0x16,0x22,0xa5,0xbf,0x9, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e, +0xb3,0xa, 0xad,0x22,0x7e,0xb3,0x11,0x49,0x22,0xa5,0xbf,0xa, 0x5, 0x7e,0xb3,0x10, +0x3b,0x22,0xa5,0xbf,0xb, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xae, +0x22,0x7e,0xb3,0x11,0x94,0x22,0xa5,0xbf,0xc, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, +0x7e,0xb3,0xd, 0xfe,0x22,0x7e,0xb3,0x11,0x9d,0x22,0xa5,0xbf,0x4c,0x5, 0x7e,0xb3, +0xf, 0x46,0x22,0xa5,0xbf,0xfb,0x3, 0xe5,0x8, 0x22,0xa5,0xbf,0x4e,0x5, 0x7e,0xb3, +0x10,0x4a,0x22,0xbe,0x70,0x50,0x40,0x12,0xbe,0x70,0x51,0x38,0xd, 0xa, 0x37,0x2e, +0x37,0x10,0x2f,0x9e,0x34,0x0, 0x50,0x2, 0x29,0x85,0xbe,0x70,0x52,0x40,0x12,0xbe, +0x70,0x55,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x31,0x9e,0x34,0x0, 0x52,0x2, 0x29, +0x85,0xbe,0x70,0x56,0x40,0x12,0xbe,0x70,0x62,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10, +0x33,0x9e,0x34,0x0, 0x56,0x2, 0x29,0x85,0xbe,0x70,0x63,0x40,0x12,0xbe,0x70,0x7a, +0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x63,0x2, 0x29,0x85,0xbe, +0x70,0x7b,0x50,0x3, 0x2, 0x29,0x19,0xbe,0x70,0x9f,0x28,0x3, 0x2, 0x29,0x19,0x7e, +0xb3,0x10,0x3b,0x70,0x4a,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58, +0x22,0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba, +0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e, +0xa0,0x80,0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70, +0xa, 0x57,0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0xdc,0x22,0xa, +0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x22,0xa, 0x37,0x2e,0x37,0x10, +0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e, +0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e,0xa0,0x80,0x15,0xa, 0x37,0x2e, +0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70,0xa, 0x57,0x2e,0x54,0x0, 0x18, +0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0x63,0x22,0xbe,0x70,0xa0,0x40,0x11,0xbe,0x70, +0xac,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6c,0x9e,0x34,0x0, 0xa0,0x80,0x56,0xbe, +0x70,0xad,0x40,0x11,0xbe,0x70,0xb9,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6e,0x9e, +0x34,0x0, 0xad,0x80,0x40,0xbe,0x70,0xba,0x40,0x11,0xbe,0x70,0xd1,0x38,0xc, 0xa, +0x37,0x2e,0x37,0x10,0x70,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe,0x70,0xd2,0x40,0x11, +0xbe,0x70,0xd5,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x72,0x9e,0x34,0x0, 0xd2,0x80, +0x14,0xbe,0x70,0xd6,0x40,0x13,0xbe,0x70,0xed,0x38,0xe, 0xa, 0x37,0x2e,0x37,0x10, +0x74,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xa5,0xbf,0xf8,0x5, 0x7e,0xb3,0x11, +0xe8,0x22,0xa5,0xbf,0xfe,0x3, 0xe5,0xc, 0x22,0x74,0xff,0x22,0xca,0x3b,0x7e,0x34, +0x22,0xc4,0x7a,0x35,0x25,0x7e,0x34,0x13,0xff,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6e, +0x21,0x75,0x24,0x1, 0x7e,0x73,0x10,0x4d,0x7a,0x73,0x13,0xb6,0xe4,0x7a,0xb3,0x10, +0x4d,0x75,0x22,0x0, 0x6c,0xee,0x80,0x12,0xa, 0x3e,0x2e,0x37,0x10,0x6e,0x7e,0x39, +0xb0,0xbe,0xb1,0x22,0x40,0x2, 0xf5,0x22,0xb, 0xe0,0x7e,0x73,0x10,0x2b,0xbc,0x7e, +0x38,0xe6,0xe5,0x22,0xbe,0xb0,0x1f,0x50,0xe, 0xe5,0x22,0xa, 0x4b,0x7e,0x54,0x0, +0x1f,0x9d,0x54,0xf5,0x22,0x80,0x3, 0x75,0x22,0x0, 0x85,0x22,0x21,0x7e,0x34,0x10, +0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a,0xa5,0x2, 0x2b,0x9a,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x12, +0x69,0x64,0x12,0x6e,0xb9,0x60,0xfb,0xa9,0xb7,0xea,0x7e,0x37,0xf, 0xda,0x7e,0x27, +0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2,0x6c,0xee,0x80,0x78,0x6c,0xff,0x80, +0x6a,0x4c,0xee,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3,0x13,0xe7,0x6d,0x33,0x74,0x2, +0xac,0xbf,0x59,0x35,0x13,0xb7,0xbe,0xf0,0x17,0x78,0x13,0x7e,0x34,0x0, 0x1, 0x7c, +0xbe,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x5e,0x34,0x4, 0x44,0x68,0x3b,0x7e,0x50, +0x30,0xac,0x5e,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x10,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0x7e,0x50,0x2, 0xac,0x5f, +0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xa, 0x3f,0x2e,0x34, +0x13,0xe7,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc, +0x7f,0x38,0x8e,0xb, 0xe0,0x7e,0x73,0x10,0x2b,0xbc,0x7e,0x38,0x80,0x75,0x23,0x0, +0x6c,0xee,0x2, 0x2b,0x78,0xa, 0x3e,0x9, 0xa3,0x13,0xe7,0x4c,0xaa,0x78,0xf, 0x7e, +0x44,0x22,0xc4,0x7e,0x70,0x2, 0xac,0x7e,0x59,0x43,0x13,0xb7,0x80,0x25,0x7e,0x50, +0x2, 0xac,0x5e,0x49,0x12,0x13,0xb7,0xa, 0xa, 0x8d,0x10,0x59,0x12,0x13,0xb7,0x2e, +0x24,0x13,0xb7,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x34,0x22,0xc4,0x7a,0x35,0x25,0x7e,0x64,0x3, 0x20,0x7e,0x70, +0x2, 0xac,0x7e,0x49,0x23,0x13,0xb7,0x7e,0x15,0x25,0x9d,0x16,0xbd,0x21,0x50,0x23, +0xa, 0x1e,0x2e,0x14,0x13,0xff,0x7e,0x19,0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1e,0x2e, +0x17,0x10,0x74,0x7e,0x19,0xb0,0xbe,0xb1,0x22,0x50,0x32,0x4, 0x7a,0x19,0xb0,0x80, +0x35,0x80,0x2a,0x7d,0x36,0x2e,0x35,0x25,0xbd,0x23,0x28,0x28,0xa, 0x3e,0x2e,0x34, +0x13,0xff,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xa, 0x3e,0x2e,0x37,0x10,0x74,0x7e, +0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14,0x7a,0x39,0xb0,0x80,0x9, 0x5, 0x23,0x75, +0x24,0x0, 0x80,0x2, 0x5, 0x23,0xb, 0xe0,0x7e,0x73,0x10,0x2c,0xbc,0x7e,0x28,0x3, +0x2, 0x2a,0xc5,0x7e,0x34,0x10,0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a, +0xa5,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x23,0x68,0xf, 0x7e,0xa1,0x21,0x7c,0xba,0x14, +0xf5,0x21,0x4c,0xaa,0x68,0x3, 0x2, 0x2a,0xe, 0x7e,0x73,0x13,0xb6,0x7a,0x73,0x10, +0x4d,0x6c,0xff,0x80,0x12,0xa, 0x3f,0x9, 0x73,0x13,0xff,0xbe,0x71,0x22,0x78,0x5, +0x75,0x24,0x0, 0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0xe6,0xe5, +0x24,0xda,0x3b,0x22,0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20,0x0, 0x41, +0x0, 0x42,0x0, 0x22,0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40,0x0, 0xa3, +0x0, 0xa5,0x0, 0x44,0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60,0x0, 0xe5, +0x0, 0xe8,0x0, 0x66,0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80,0x1, 0x47, +0x1, 0x4b,0x0, 0x88,0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0,0x1, 0x89, +0x1, 0xad,0x0, 0xaa,0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xaa,0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0,0x1, 0x69, +0x1, 0x6c,0x0, 0x88,0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80,0x1, 0x27, +0x1, 0x9, 0x0, 0x66,0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60,0x0, 0xc5, +0x0, 0xc6,0x0, 0x44,0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40,0x0, 0x83, +0x0, 0x64,0x0, 0x22,0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20,0x0, 0x21, +0x0, 0x21,0x0, 0x0, 0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0xca,0x3b,0x7e,0xb3,0x10,0x3c,0xf5,0x21,0xe4,0x7a,0xb3,0x10, +0x3c,0x7e,0xb3,0x10,0x3a,0xf5,0x22,0x74,0x3, 0x7a,0xb3,0x10,0x3a,0x7e,0x37,0x10, +0x48,0x7e,0x24,0x0, 0x25,0xe4,0x12,0x6e,0x21,0x7e,0xe0,0x7, 0x6d,0x33,0x7a,0x37, +0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x6c,0xdd,0x7e, +0x14,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0xa, 0x2d,0x2e,0x27, +0x10,0x48,0x7e,0x29,0x70,0x4c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78, +0xde,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12, +0x6e,0xc2,0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x6f,0x12,0x55,0x3a,0x6c,0xdd, +0xbe,0xd0,0x18,0x50,0x1e,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf, +0x30,0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x16,0x1e, +0xf0,0x80,0x12,0xa, 0x3d,0x2e,0x37,0x10,0x33,0x9, 0x73,0xff,0xe8,0xa, 0x37,0x2e, +0x34,0x0, 0x18,0x7c,0xf7,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0xb, 0x38, +0x30,0xbe,0x34,0x25,0x80,0x18,0x21,0x7e,0x34,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7d,0x13,0x6e,0x14,0xff,0xff,0xa, 0x2f,0x2e,0x27,0x10,0x48, +0x7e,0x29,0x70,0x5c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78,0x91,0x1b, +0xe0,0xbe,0xe0,0x0, 0x48,0x3, 0x2, 0x2e,0x1c,0x7e,0xe0,0xa, 0x74,0x2, 0x7a,0xb3, +0x10,0x3a,0x2, 0x2f,0xeb,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a, +0x37,0xa, 0xaf,0x12,0x6f,0x10,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c, +0xa, 0x65,0x2d,0x63,0x7c,0xcd,0x6c,0xdd,0x2, 0x2f,0xb3,0x7e,0xa3,0x10,0x2c,0xbc, +0xad,0x28,0x27,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf,0x30,0xe0, +0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x2, 0x1e,0xf0,0x7e, +0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x80,0x27,0xa, 0x2a,0xa, 0x3d,0x9d,0x32, +0x2e,0x37,0x10,0x33,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34,0x0, 0x18,0x7c,0xf7,0x7e, +0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xa4,0x9d, +0x35,0xb, 0x38,0x30,0x7a,0x35,0x23,0xbe,0x34,0x2e,0xe0,0x8, 0x18,0x4c,0xee,0x68, +0x30,0xa, 0x2f,0x2e,0x27,0x10,0x48,0x7e,0x29,0xb0,0xbe,0xb0,0xfe,0x50,0x22,0x4, +0x7a,0x29,0xb0,0x80,0x1c,0xbe,0x34,0x17,0x70,0x58,0x14,0xa, 0x3f,0x2e,0x37,0x10, +0x48,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x7a,0x39,0xb0,0x80,0x2, 0x1b, +0xc0,0xb, 0xd0,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c,0xa, 0x25,0x2d, +0x23,0xa, 0x3d,0xbd,0x32,0x58,0x3, 0x2, 0x2f,0x1b,0x4c,0xcc,0x68,0x28,0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60, +0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x6f,0x12,0x55,0x3a,0x7c,0xae,0x1b,0xe0,0x4c, +0xaa,0x68,0x3, 0x2, 0x2e,0xf5,0xe5,0x21,0x7a,0xb3,0x10,0x3c,0xe5,0x22,0x7a,0xb3, +0x10,0x3a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x24,0x15,0x56,0x7e,0x34,0x13, +0xfe,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0xb6, +0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x13,0xfc,0x7e, +0x73,0xf, 0x1c,0x7a,0x73,0x13,0xfd,0x7e,0xa3,0x13,0xfc,0xbe,0xa0,0x1, 0x38,0x3, +0x7e,0xf0,0x1, 0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0xe4,0x80,0x10,0x7e,0xb3,0x15,0xa1, +0x4, 0x7a,0xb3,0x15,0xa1,0xbe,0xb0,0xc8,0x28,0x6, 0x74,0x14,0x7a,0xb3,0x15,0xa1, +0x7e,0xb3,0x15,0xa1,0xbe,0xb0,0x6, 0x50,0x3, 0x7e,0xf0,0x1, 0xbe,0xa0,0x1, 0x28, +0x3f,0x7e,0x34,0x0, 0x21,0x7e,0x24,0x0, 0x23,0x7e,0x14,0x13,0xfe,0x12,0x66,0x16, +0x7e,0x34,0x0, 0x25,0x7e,0x24,0x0, 0x27,0x7e,0x14,0x13,0xb6,0x12,0x66,0x16,0x7e, +0x35,0x25,0x9e,0x35,0x21,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x80,0x18,0xf, 0x7e,0x35, +0x27,0x9e,0x35,0x23,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x80,0x8, 0x3, 0x7e,0xf0,0x1, +0xbe,0xf0,0x0, 0x28,0x3, 0x2, 0x31,0x63,0x7e,0xf3,0x15,0x9f,0xbe,0xf3,0x15,0x29, +0x50,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73,0x13,0xfc,0x28,0x12,0x7e,0x24,0x15,0x56, +0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x2, 0x31,0x63,0x7e,0x73, +0x15,0x9e,0xbe,0x70,0x2, 0x58,0x22,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e, +0x14,0x0, 0x48,0x12,0x6d,0x7d,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15, +0x53,0x7e,0xb3,0x15,0x9e,0x4, 0x2, 0x31,0x9f,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4, +0x7a,0xb3,0x15,0x53,0x2, 0x31,0x9f,0xbe,0xf3,0x15,0x29,0x78,0x2d,0x7e,0xa3,0x15, +0x29,0xbe,0xa3,0x13,0xfc,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3, +0x15,0x53,0x80,0x6b,0xbe,0xa3,0x13,0xfc,0x28,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x7a, +0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0x80,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73, +0x13,0xfc,0x50,0x1a,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48, +0x12,0x6d,0x7d,0xe4,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0x53,0x80,0x31,0x7e,0x73, +0x15,0x53,0xbe,0x70,0x2, 0x58,0x1c,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e, +0x14,0x0, 0x48,0x12,0x6d,0x7d,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0x7e,0xb3,0x15,0x53, +0x4, 0x80,0x7, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0xe4,0x7a, +0xb3,0x15,0x9e,0x7e,0xb3,0x15,0xa0,0x14,0x68,0x9, 0x4, 0x78,0x15,0x7e,0x24,0x13, +0xb6,0x80,0x4, 0x7e,0x24,0x14,0xe3,0x7e,0x34,0x15,0x56,0x7e,0x14,0x0, 0x48,0x12, +0x6d,0x7d,0x7e,0x73,0x15,0x29,0x7a,0x73,0x15,0x9f,0x7e,0x24,0x13,0xb6,0x7e,0x34, +0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x7e,0x24,0x15,0x56,0x7e,0x34,0xe, +0xd, 0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x7e,0x73,0x15,0x9c,0x7a,0x73,0xf, 0x1b, +0x7e,0x73,0x15,0x9d,0x7a,0x73,0xf, 0x1c,0xda,0xf8,0x22,0xca,0x79,0x7d,0x73,0x12, +0x61,0x38,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27,0x0, +0x27,0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c,0xe, +0x1b,0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49,0x27, +0x0, 0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34,0x1c, +0x14,0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c,0x67, +0x6c,0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38,0x10, +0x9, 0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, 0x25, +0x4d,0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27,0x7e, +0x34,0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c, +0xaa,0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e,0x34, +0x1c,0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e,0x34, +0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, 0x4b, +0x2d,0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0, +0x19,0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70, +0x2, 0xac,0x7a,0x2e,0x34,0x2b,0xd4,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e,0x24, +0x1c,0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x2d,0xd2, +0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e,0x34, +0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x2d,0xd4, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, 0xa0, +0xbe,0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x5e,0x27,0x49,0x27,0x0, 0x39,0x7e,0x34, +0x1c,0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38,0x20, +0x49,0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33,0x7e, +0x34,0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, 0xb7, +0x0, 0x1, 0x12,0x65,0x18,0x49,0x37,0x0, 0x47,0x12,0x7, 0xc9,0x49,0x37,0x0, 0x49, +0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x5d,0x1, 0x49,0x27,0x0, 0x35,0x7e, +0x34,0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22,0xca, +0x3b,0x6d,0x33,0x7a,0x35,0x23,0x7e,0xb3,0xf, 0x1b,0x60,0x6, 0x7e,0xb3,0xf, 0x1c, +0x60,0x11,0xe5,0x22,0x60,0x5, 0x75,0x18,0x1, 0x80,0x3, 0x75,0x18,0x0, 0xe5,0x18, +0x2, 0x35,0x5e,0x7e,0xb3,0xd, 0x18,0xf5,0x21,0x7e,0x73,0xd, 0x19,0x7a,0x71,0x22, +0x6d,0x66,0x75,0x25,0x0, 0x75,0x26,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x3a,0x7e,0x51, +0x21,0x74,0x18,0xac,0x5b,0x2d,0x27,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x10, +0xbe,0x14,0x0, 0x32,0x8, 0x28,0x5, 0x25,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0x8, 0x49, +0x12,0xff,0xd0,0x2d,0x61,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, 0x50,0x8, 0x49,0x22, +0x0, 0x30,0x2d,0x62,0x5, 0x26,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc0,0x7d,0x73, +0x80,0x38,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0x2d,0x37,0x3e,0x34,0x2e,0x37,0xf, +0xda,0xb, 0x38,0x20,0xbe,0x24,0x0, 0x32,0x8, 0x2c,0x5, 0x25,0xe5,0x21,0xbe,0xb0, +0x0, 0x28,0x8, 0x49,0x23,0xff,0xd0,0x2d,0x62,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, +0x50,0x8, 0x49,0x33,0x0, 0x30,0x2d,0x63,0x5, 0x26,0x7d,0x37,0xb, 0x34,0x7d,0x73, +0xbe,0x34,0x0, 0x18,0x48,0xbc,0xe5,0x25,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12,0x7d, +0x36,0x12,0x6e,0x11,0xe5,0x26,0xa, 0x2b,0x12,0x48,0x53,0xbe,0x34,0x0, 0xf, 0x8, +0x8, 0x75,0x18,0x1, 0x74,0x1, 0x2, 0x35,0x5e,0x6d,0x33,0xe5,0x21,0xbe,0xb0,0x0, +0x28,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0xff,0xd0,0x2d,0x32,0xe5,0x21,0xbe,0xb0,0xc, +0x50,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0x0, 0x30,0x2d,0x32,0x7e,0xa0,0x8, 0x80,0x2d, +0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2e,0x14,0x6e,0x1, 0x7a,0x31,0x82,0x7a,0x21, +0x83,0xe4,0x93,0x1a,0x1b,0xbd,0x13,0x8, 0x14,0x2e,0x24,0x6e,0x2, 0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x1a,0x2b,0x2e,0x25,0x23,0x7a,0x25,0x23,0x7c,0x5a,0x1b, +0xa0,0xa5,0xbd,0x0, 0xcb,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0xe5,0x22,0xa, 0x2b, +0x2d,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x12,0x6e,0x11,0xbe,0x34, +0x3, 0xe8,0x8, 0xa, 0x7e,0x35,0x23,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x23,0x7e,0x35, +0x23,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x23,0xe5,0x18, +0xa, 0x3b,0xbe,0x35,0x23,0x50,0x5, 0x7e,0x55,0x23,0xf5,0x18,0xe5,0x18,0xda,0x3b, +0x22,0xca,0x3b,0x7c,0x9b,0x7d,0xa3,0xbe,0x90,0x1, 0x28,0x1e,0xa, 0x15,0x1b,0x15, +0xa, 0x39,0xbd,0x31,0x58,0x14,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6, +0xb, 0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x80,0x7, 0xbe,0x90,0x1, 0x78,0x15,0x6d, +0xbb,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x94, +0x7d,0xc3,0x80,0x8, 0x4c,0x99,0x78,0x38,0x6d,0xcc,0x7d,0xbc,0x74,0x2, 0xac,0xb9, +0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x7e,0x70,0x2, 0xac, +0x79,0x2d,0x3a,0x49,0x33,0x0, 0x2, 0x12,0x6d,0x94,0x7d,0xe3,0x74,0x2, 0xac,0xb9, +0x7d,0xf5,0x2d,0xfa,0x49,0x3f,0x0, 0x4, 0x12,0x6d,0x94,0x7d,0xf3,0x2, 0x36,0x6c, +0x7c,0xb5,0x24,0xfe,0xbc,0xb9,0x78,0x46,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba, +0x1b,0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d, +0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x94,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d, +0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x74,0x2, 0xac,0xb9,0x2d, +0xa5,0x49,0x3a,0x0, 0x2, 0x12,0x6d,0x94,0x7d,0xe3,0x6d,0xff,0x80,0x3e,0x7c,0xb5, +0x14,0xbc,0xb9,0x78,0x37,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6,0xb, +0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35, +0xb, 0x38,0x30,0x12,0x6d,0x94,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d,0xd5,0x2d,0xda, +0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x6d,0xff,0x7d,0xef,0xa, 0x79,0x6d,0x66, +0x7f,0x3, 0x1b,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x7f,0x41,0x7f, +0x3, 0x1b,0xd, 0x7d,0x3b,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x41,0x7d,0x3d, +0x1a,0x26,0x1a,0x24,0xa, 0x19,0x6d,0x0, 0x12,0x48,0x85,0x2f,0x41,0xa, 0x19,0x6d, +0x0, 0xb, 0xc, 0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x41,0xa, 0x19, +0x6d,0x0, 0xb, 0xd, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x14,0x7d, +0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x5b,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1d,0x1a, +0x2, 0x1a,0x0, 0x2f,0x2, 0x7d,0x5e,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1f,0x1a, +0x2, 0x1a,0x0, 0x2f,0x2, 0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x48,0xa1,0x2e, +0x34,0x0, 0x20,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xf, 0x1b,0x7e,0x64,0xe, 0xdf, +0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7, +0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x5, 0x80,0x2, +0x74,0x3, 0x7a,0xb3,0xf, 0x26,0x74,0x1, 0x7a,0xb3,0xf, 0x27,0x4c,0xff,0x78,0xd, +0x75,0x19,0x0, 0x7e,0xb3,0xf, 0x26,0x12,0x6e,0xe2,0x2, 0x38,0x85,0xe5,0x51,0xb4, +0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, +0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xb4,0x1, +0x9, 0xe5,0x19,0x70,0x5, 0x75,0x16,0x5, 0xf5,0x17,0xe5,0x51,0xb4,0x1, 0x1b,0x7e, +0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, +0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xf5,0x19,0x6c,0xee,0x7e, +0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xe, 0x9d,0xf5,0x21,0xbe,0xb0,0xff,0x78,0x3, 0x2, +0x38,0x7b,0xe5,0x21,0xa, 0x2b,0x2d,0x26,0x7e,0x29,0xb0,0xb4,0x2, 0x2, 0x80,0x3, +0x2, 0x38,0x7b,0x49,0x33,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13, +0x74,0x12,0x6d,0xf1,0x7a,0x35,0x22,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0x9b,0x7e, +0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x76,0x12,0x6d,0xf1,0x7a,0x35,0x24,0xe5, +0x16,0xa, 0x3b,0xbe,0x35,0x22,0x28,0x59,0xbe,0x35,0x24,0x28,0x54,0x7e,0xa1,0x21, +0x74,0x4, 0xa4,0x49,0x35,0x13,0x74,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0x99,0x7e, +0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x76,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, +0x9b,0xe5,0x21,0xa, 0x3b,0x2d,0x36,0x7e,0x39,0xb0,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, +0x28,0x2, 0x1b,0xf0,0x4c,0xff,0x78,0x53,0x5, 0x17,0xe5,0x17,0xbe,0xb0,0x32,0x40, +0x3, 0x75,0x17,0x0, 0x7e,0x73,0xf, 0x27,0xbe,0x71,0x16,0x28,0x3e,0x5, 0x16,0x80, +0x3a,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4, +0x59,0x35,0x13,0x74,0x49,0x34,0xe, 0x9b,0x59,0x35,0x13,0x76,0x7e,0x73,0xf, 0x26, +0xbe,0x71,0x16,0x50,0x8, 0x7e,0xb3,0xf, 0x27,0xf5,0x16,0x80,0xb, 0x7e,0x73,0xf, +0x27,0xbe,0x71,0x16,0x50,0x2, 0x15,0x16,0x75,0x17,0x0, 0xb, 0xe0,0xbe,0xe0,0xa, +0x68,0x3, 0x2, 0x37,0x8f,0xda,0x3b,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0x10,0x2b, +0xf5,0x24,0x7e,0xe3,0x10,0x2c,0x1b,0xe0,0x6c,0xdd,0x7e,0x70,0x30,0xac,0x7d,0x2e, +0x37,0xf, 0xda,0x49,0x33,0x0, 0x2e,0x74,0x2, 0xac,0xbd,0x59,0x35,0x13,0xb6,0xb, +0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0x7e,0xb3,0xf, 0xd3,0xb4,0x1, 0x2, 0x80,0x3, 0x2, +0x39,0xff,0x6c,0xcc,0x2, 0x39,0xf0,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0xd, 0x18, +0xf5,0x22,0x9, 0xb3,0xd, 0x19,0xf5,0x23,0x75,0x21,0x3, 0x7e,0x73,0xe, 0x12,0xbe, +0x70,0x20,0x50,0xa, 0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x3, 0x75,0x21,0x1, 0x7e,0xb3, +0xd, 0xfd,0xb4,0x1, 0x3, 0x75,0x21,0x2, 0x74,0x8, 0x7a,0xb3,0xf, 0x53,0xe5,0x22, +0xbe,0xb0,0x0, 0x28,0x21,0xe5,0x24,0xa, 0x2b,0x1b,0x24,0xe5,0x22,0xa, 0x3b,0xbd, +0x32,0x58,0x13,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2e,0x1b,0x24,0xe5,0x23, +0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x21,0x2, 0x75,0x25,0x0, 0x80,0x45,0xe5,0x25, +0xbc,0xbc,0x68,0x3d,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a, +0xa1,0x26,0x9, 0xb3,0xd, 0x19,0xf5,0x27,0xa, 0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32, +0x12,0x6e,0x11,0xbe,0x34,0x0, 0x3, 0x18,0x18,0xe5,0x27,0xa, 0x2b,0xe5,0x23,0xa, +0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x21,0x1, 0x80, +0xb, 0x5, 0x25,0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x25,0x38,0xb2,0xe5,0x51,0xb4,0x1, +0x20,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x19,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x12,0x7e, +0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x9, 0x75,0x21,0x3, 0x74,0x1e,0x7a,0xb3,0xf, +0x53,0xe5,0x23,0xbe,0xb0,0x17,0x50,0x1a,0x6c,0xdd,0x6d,0x33,0x7e,0x50,0x30,0xac, +0x5d,0x2e,0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xec, +0x80,0x3, 0x75,0x21,0x0, 0xe5,0x21,0x7c,0x7c,0x7c,0x6f,0x12,0x11,0xa0,0x6c,0xdd, +0x74,0x2, 0xac,0xbd,0x49,0x35,0x13,0xb6,0x7e,0x50,0x30,0xac,0x5d,0x2e,0x27,0xf, +0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0xb, 0xf0,0xb, 0xc0, +0x7e,0x73,0xd, 0xf7,0xbc,0x7c,0x28,0x3, 0x2, 0x38,0xc7,0x7a,0xf3,0xd, 0xf7,0xda, +0x3b,0x22,0x7e,0x50,0x1, 0xe4,0x7a,0xb3,0xe, 0xb, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, +0x7e,0xa3,0xd, 0xf7,0x4c,0xaa,0x78,0x1d,0x7e,0x43,0xd, 0xf8,0xbe,0x40,0x0, 0x28, +0x14,0x7e,0x43,0x16,0xb7,0xbe,0x40,0x1, 0x28,0xb, 0x74,0x1, 0x7a,0xb3,0xe, 0xb, +0xe4,0x7a,0xb3,0x10,0x3d,0x4c,0xaa,0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x16,0xb7,0xe4, +0x7a,0xb3,0x16,0xb8,0xbe,0xa0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43, +0xd, 0xfc,0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43,0xd, 0x17, +0xbe,0x40,0x0, 0x28,0x6b,0x7e,0xb3,0x16,0xb1,0x70,0x65,0x7e,0xb3,0x16,0xb3,0x70, +0x5f,0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x6d,0x33,0x6c,0x44,0x7e,0x30,0x2, 0xac,0x34, +0x2e,0x17,0xf, 0xd6,0xb, 0x18,0x10,0xbd,0x13,0x58,0x2, 0x7d,0x31,0xb, 0x40,0xa5, +0xbc,0x25,0xe8,0xbe,0x34,0xf8,0xf8,0x58,0x5, 0x7e,0x50,0x5, 0x80,0x1f,0xbe,0x34, +0xfb,0x50,0x58,0x5, 0x7e,0x50,0x4, 0x80,0x14,0xbe,0x34,0xfc,0xe0,0x58,0x5, 0x7e, +0x50,0x3, 0x80,0x9, 0xbe,0x34,0xfe,0xd4,0x58,0x3, 0x7e,0x50,0x2, 0xbe,0x34,0xfc, +0x18,0x58,0x3c,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x80,0x2f, +0x7e,0x43,0xd, 0x16,0xa5,0xbc,0x0, 0x1d,0xbe,0xa0,0x0, 0x28,0x18,0x7e,0xb3,0x16, +0xb1,0x70,0x12,0x7e,0xb3,0x16,0xb3,0x70,0xc, 0xbe,0x50,0x3, 0x50,0x3, 0x7e,0x50, +0x3, 0x74,0x1, 0x80,0x6, 0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e, +0x43,0x16,0xb7,0xbc,0x45,0x50,0x4, 0x7a,0x53,0x16,0xb7,0xbe,0x50,0x2, 0x28,0x6, +0x74,0x1, 0x7a,0xb3,0x16,0xb8,0xbe,0xa0,0x0, 0x28,0x1b,0x7e,0xb3,0xd, 0x16,0x70, +0x15,0x7e,0xb3,0x16,0xb1,0x70,0xf, 0x7e,0xb3,0x16,0xb3,0x70,0x9, 0xe4,0x7a,0xb3, +0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xb3,0x16,0xb3,0xb4,0x1, 0x18,0xe4,0x7a,0xb3, +0x16,0xb3,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0xf, +0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xa3,0x16,0xb7,0x7e,0x50,0x8, 0xac,0x5a,0x7a,0x27, +0xe, 0x5, 0x74,0x4, 0xa4,0x7a,0x57,0xe, 0x7, 0x22,0xca,0x3b,0x7d,0x73,0x7e,0xb3, +0xd, 0xf7,0xf5,0x4c,0x7e,0x37,0xf, 0xda,0x7a,0x35,0x4f,0x75,0x42,0x0, 0x7e,0xc0, +0x1, 0x80,0x19,0xe5,0x42,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0x60,0xa, 0x2c,0x2d,0x27, +0x7e,0x29,0x70,0xbc,0x76,0x40,0x3, 0x7a,0xc1,0x42,0xb, 0xc0,0xe5,0x4c,0xbc,0xbc, +0x38,0xe1,0xe5,0x42,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0xb0,0xf5,0x42,0x75,0x44,0x0, +0x7e,0xc0,0x1, 0x2, 0x3c,0xb4,0x75,0x4b,0x0, 0x6d,0x33,0x7a,0x35,0x4d,0x6c,0xdd, +0x75,0x45,0x0, 0x75,0x46,0x0, 0x75,0x43,0x0, 0x2, 0x3c,0x69,0x7e,0x71,0x43,0x74, +0x2, 0xac,0x7b,0x9, 0xb3,0xd, 0x18,0xf5,0x47,0x9, 0xb3,0xd, 0x19,0xf5,0x48,0xe5, +0x43,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0x70,0xbc,0x7c,0x78,0x7b,0xb, 0xd0,0xe5,0x47, +0x25,0x45,0xf5,0x45,0xe5,0x48,0x25,0x46,0xf5,0x46,0x7e,0x51,0x47,0xac,0x5d,0xe5, +0x45,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x49,0x7e,0x51,0x48,0xac, +0x5d,0xe5,0x46,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x4a,0x7e,0x51, +0x4b,0xac,0x5d,0xe5,0x49,0xa, 0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x48,0x53, +0x7c,0xb7,0xf5,0x4b,0x7e,0x51,0x4b,0xac,0x5d,0xe5,0x4a,0xa, 0x3b,0xbd,0x32,0x8, +0x9, 0xa, 0x2d,0x12,0x48,0x53,0x7c,0xb7,0xf5,0x4b,0x7e,0x71,0x47,0x74,0x18,0xac, +0x7b,0xe5,0x48,0xa, 0x2b,0x2d,0x32,0x3e,0x34,0x2e,0x35,0x4f,0xb, 0x38,0x30,0xbe, +0x35,0x4d,0x8, 0x3, 0x7a,0x35,0x4d,0x5, 0x43,0xe5,0x4c,0xbe,0xb1,0x43,0x28,0x3, +0x2, 0x3b,0xcc,0xbe,0xd0,0x0, 0x28,0x3a,0xe5,0x45,0x8c,0xbd,0xf5,0x45,0xe5,0x46, +0x8c,0xbd,0xf5,0x46,0x7e,0xa1,0x45,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x19,0xa3, +0x15,0x2b,0xe5,0x46,0x19,0xb3,0x15,0x2c,0x7e,0x25,0x4d,0x7e,0x71,0x45,0x74,0x18, +0xac,0x7b,0xe5,0x46,0xa, 0x1b,0x2d,0x31,0x3e,0x34,0x2e,0x35,0x4f,0x1b,0x38,0x20, +0x5, 0x44,0xb, 0xc0,0xe5,0x42,0xbc,0xbc,0x40,0x3, 0x2, 0x3b,0xb6,0xe5,0x44,0xda, +0x3b,0x22,0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x74,0x18,0x7a,0xb3,0x10,0x2c,0x74,0x4, +0x7a,0xb3,0x10,0x2d,0xe4,0x7a,0xb3,0x10,0x2e,0x7e,0x34,0x11,0x9b,0x7a,0x37,0x10, +0x2f,0x7e,0x34,0x11,0x97,0x7a,0x37,0x10,0x31,0x7e,0x34,0xf, 0xc5,0x7a,0x37,0x10, +0x33,0x7e,0x34,0xf, 0xad,0x7a,0x37,0x10,0x35,0x74,0x15,0x7a,0xb3,0x10,0x37,0x74, +0x17,0x7a,0xb3,0x10,0x38,0x74,0x4, 0x7a,0xb3,0x10,0x3a,0xe4,0x7a,0xb3,0x10,0x3b, +0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x3d,0x74,0x2, 0x7a,0xb3,0x10,0x3e,0x74,0x45, +0x7a,0xb3,0x10,0x3f,0x74,0x71,0x7a,0xb3,0x10,0x40,0x74,0x3, 0x7a,0xb3,0x10,0x41, +0x7e,0x34,0x1f,0xff,0x7a,0x37,0x10,0x42,0x6d,0x33,0x7a,0x37,0x10,0x44,0x7e,0x34, +0xd, 0xfe,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, 0xdc,0x7a,0x37,0x10,0x48,0x74,0x20, +0x7a,0xb3,0x10,0x4a,0x74,0xa, 0x7a,0xb3,0x10,0x4b,0xe4,0x7a,0xb3,0x10,0x4c,0x7a, +0xb3,0x10,0x4d,0x7a,0xb3,0x10,0x4e,0x74,0x2, 0x7a,0xb3,0x10,0x4f,0x7e,0x34,0x0, +0xf4,0x7a,0x37,0x10,0x52,0x7e,0x34,0x3f,0xe0,0x7a,0x37,0x10,0x50,0x7e,0x34,0x29, +0x28,0x7a,0x37,0x10,0x54,0x7e,0x34,0x10,0x91,0x7a,0x37,0x10,0x62,0x7e,0x34,0x0, +0x3d,0x7a,0x37,0x10,0x64,0x7e,0x34,0x0, 0x22,0x7a,0x37,0x10,0x66,0x7e,0x34,0x4c, +0x0, 0x7a,0x37,0x10,0x56,0x7e,0x34,0x3, 0xcf,0x7a,0x37,0x10,0x58,0x7e,0x34,0x7, +0x9a,0x7a,0x37,0x10,0x5a,0x7e,0x34,0x5, 0x84,0x7a,0x37,0x10,0x5c,0x7e,0x34,0x0, +0x9, 0x7a,0x37,0x10,0x5e,0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x10,0x60,0x7e,0x34,0x0, +0x5d,0x7a,0x37,0x10,0x68,0xe4,0x7a,0xb3,0x10,0x6a,0x74,0x7, 0x7a,0xb3,0x10,0x6b, +0x7e,0x34,0x10,0xff,0x7a,0x37,0x10,0x6c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x10,0x6e, +0x7e,0x34,0xf, 0x2e,0x7a,0x37,0x10,0x70,0x12,0x41,0xcf,0x7e,0x34,0x11,0xe9,0x7a, +0x37,0x10,0x72,0x7e,0x34,0xf, 0x88,0x7a,0x37,0x10,0x74,0x7e,0x34,0x11,0x17,0x7a, +0x37,0x10,0x76,0x2, 0x6c,0x99,0xca,0x69,0xca,0xf8,0x7d,0xb1,0x7d,0xf2,0x7d,0xe3, +0x9f,0x0, 0x7f,0x60,0x7f,0x40,0x6d,0x66,0x7a,0x67,0x13,0xb6,0x7f,0x10,0x7d,0xa6, +0x75,0x21,0x0, 0x6c,0xaa,0x80,0x4b,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0xa1,0x2d,0xae, +0xb, 0xa8,0xa0,0x7c,0xba,0x20,0xe0,0x1e,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, +0x6d,0x11,0x9d,0x1b,0xbd,0x1a,0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, +0x2f,0x60,0x5, 0x21,0x80,0x1a,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11, +0x9d,0x1b,0xbd,0x1a,0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x40, +0xb, 0xa0,0x7e,0xf3,0x10,0x2c,0xbc,0xfa,0x38,0xad,0xe5,0x21,0xa, 0x1b,0x6d,0x0, +0x7f,0x16,0x12,0x48,0xf2,0x7a,0x37,0x13,0xb6,0xe5,0x21,0xa, 0x3b,0x6d,0x22,0xa, +0x1f,0x6d,0x0, 0x9f,0x1, 0x7f,0x14,0x12,0x48,0xf2,0x6c,0xaa,0x80,0x2f,0x7c,0xba, +0x7e,0x30,0x2, 0x7c,0x9a,0x20,0xe0,0xf, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18, +0x0, 0x9e,0x7, 0x13,0xb6,0x80,0xd, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, +0x7d,0x13,0x9d,0x1, 0x7d,0x14,0x2d,0x1f,0x1b,0x18,0x0, 0xb, 0xa0,0x7e,0xb3,0x10, +0x2c,0xbc,0xba,0x38,0xc9,0x9f,0x66,0x7a,0x67,0x13,0xb6,0x6c,0xaa,0x80,0x29,0x7e, +0x70,0x2, 0xac,0x7a,0x7d,0xa3,0x2d,0xae,0x49,0xaa,0x0, 0x30,0xbd,0xab,0x8, 0x4, +0x7d,0xab,0x80,0xa, 0x6d,0x33,0x9d,0x3b,0xbd,0x3a,0x8, 0x2, 0x7d,0xa3,0x7d,0x3a, +0x1a,0x26,0x1a,0x24,0x2f,0x61,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xcf, +0xa, 0x16,0x6d,0x0, 0x7f,0x16,0x12,0x48,0xf2,0x7a,0x37,0x13,0xb6,0x6c,0xaa,0x80, +0x1d,0x7e,0x70,0x2, 0x7c,0x5a,0xac,0x57,0x7d,0x32,0x2d,0x3e,0x49,0x43,0x0, 0x30, +0x9e,0x47,0x13,0xb6,0x7d,0x32,0x2d,0x3f,0x59,0x43,0x0, 0x30,0xb, 0xa0,0x7e,0xb3, +0x10,0x2b,0xbc,0xba,0x38,0xdb,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x7c,0xfb,0xe5, +0x55,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x55,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x40,0x4b, +0xa9,0xd7,0xea,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12, +0x67,0xe2,0x12,0x0, 0x6e,0x50,0x27,0xa9,0xc7,0xea,0x7e,0xe3,0x10,0x4d,0xe4,0x7a, +0xb3,0x10,0x4d,0x7e,0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2, +0x7a,0xe3,0x10,0x4d,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x3, 0x12,0x6b,0x12,0x74,0x1, +0x7a,0xb3,0xf, 0xd3,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0xa, 0x18, +0x12,0x66,0xc7,0x7e,0x37,0xf, 0xd6,0x7e,0x27,0xf, 0xd4,0x7e,0x14,0xa, 0x62,0x12, +0x66,0xc7,0x6c,0xaa,0x80,0x36,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0xa, 0x92,0xbe, +0x34,0x13,0x88,0x40,0xc, 0xbe,0x34,0x75,0x30,0x28,0x1a,0xbe,0x34,0x7e,0xf4,0x50, +0x14,0x7e,0xb3,0x16,0xb4,0x4, 0x7a,0xb3,0x16,0xb4,0xb4,0xa, 0xd, 0x74,0x1, 0x7a, +0xb3,0x16,0xb3,0x80,0xf, 0xe4,0x7a,0xb3,0x16,0xb4,0xb, 0xa0,0x7e,0xb3,0x10,0x2b, +0xbc,0xba,0x38,0xc2,0x7e,0xa3,0x16,0xb3,0xbe,0xa0,0x1, 0x78,0x7, 0x7e,0xb3,0x16, +0xb2,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x16,0xb2,0xbe,0xb0,0x0, 0x28,0x6, 0x74,0x1, +0x7a,0xb3,0x16,0xb1,0x4c,0xaa,0x78,0xd, 0xe4,0x7a,0xb3,0x16,0xb2,0x7a,0xb3,0x16, +0xb1,0x7a,0xb3,0x16,0xb4,0x74,0x1, 0x7a,0xb3,0xf, 0xd2,0x12,0x67,0x1, 0x12,0x6b, +0xbd,0x7e,0xb3,0x11,0xc, 0xb4,0x1, 0x31,0xbe,0xf0,0x1, 0x78,0x2c,0x7e,0xb3,0xd, +0xfc,0x70,0x26,0x12,0x47,0x4a,0x7e,0xb3,0xd, 0xf7,0x70,0x19,0x7e,0x73,0x11,0x95, +0xa, 0x37,0x9, 0x73,0xf, 0x29,0x7a,0x73,0x10,0x4a,0xe4,0x7a,0xb3,0x10,0x4e,0x7a, +0xb3,0x11,0xc, 0x80,0x6, 0x6c,0xff,0x80,0x2, 0x6c,0xff,0x12,0x66,0x52,0x12,0x6c, +0x1f,0x7c,0xbf,0xda,0x79,0x22,0xca,0x3b,0x75,0x21,0x0, 0x7e,0x34,0xb, 0x79,0x7e, +0x24,0x0, 0xd, 0xe4,0x12,0x6e,0x21,0xe4,0x7a,0xb3,0xd, 0x16,0x7a,0xb3,0xd, 0x17, +0x7e,0xb3,0xf, 0xd2,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x41,0xcc,0x7e,0x34,0x13,0xb6, +0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, +0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e,0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27, +0xf, 0x4c,0x7e,0x14,0x13,0xb6,0x6c,0x11,0x12,0x4f,0x6e,0x7c,0xeb,0x7e,0x37,0xf, +0xd6,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4a,0x7e,0x14,0x13, +0xc0,0x12,0x4f,0x6e,0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x51,0x6c,0xcc,0x80,0x47, +0x7c,0xbf,0xc4,0x23,0x54,0x1f,0x7c,0x6b,0x7a,0x61,0x21,0xa, 0x2a,0x9, 0x72,0x13, +0xc0,0x7e,0x50,0x2, 0xac,0x5f,0x19,0x72,0xa, 0xb1,0xa, 0x1c,0x9, 0x71,0x13,0xb6, +0x19,0x72,0xa, 0xb2,0x7c,0xbf,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0x79,0xa, 0x46,0x2e,0x44,0xb, 0x79,0x7e,0x49,0xb0,0x4c,0xb7, +0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xb5,0xb, 0xa0,0xbc,0xda,0x38, +0xab,0x7a,0xf3,0xd, 0x16,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12, +0x6e,0x21,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e, +0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xb6,0x7e, +0x10,0x1, 0x12,0x4f,0x6e,0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x7e, +0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x6e,0x7c,0xdb, +0x6c,0xff,0x6c,0xaa,0x80,0xe, 0x6c,0xcc,0x80,0x4, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec, +0x38,0xf8,0xb, 0xa0,0xbc,0xda,0x38,0xee,0x7a,0xf3,0xd, 0x17,0xda,0x3b,0x22,0xca, +0x79,0x7e,0x34,0x0, 0x60,0x12,0x69,0xb9,0x7c,0xab,0x7a,0xa1,0x6a,0xbe,0xa0,0x8, +0x40,0x3, 0x2, 0x42,0xed,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0xe0,0x6, 0x80,0x3, 0x7e, +0xe0,0x5, 0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x42,0x1, +0x73,0x2, 0x42,0x19,0x2, 0x42,0x1e,0x2, 0x42,0x23,0x2, 0x42,0x28,0x2, 0x42,0x2d, +0x2, 0x42,0x32,0x2, 0x42,0x37,0x2, 0x42,0x3c,0x7e,0xf0,0x5e,0x80,0x26,0x7e,0xf0, +0x5f,0x80,0x21,0x7e,0xf0,0x61,0x80,0x1c,0x7e,0xf0,0x63,0x80,0x17,0x7e,0xf0,0x65, +0x80,0x12,0x7e,0xf0,0x67,0x80,0xd, 0x7e,0xf0,0x69,0x80,0x8, 0x7e,0xf0,0x6a,0x80, +0x3, 0x7e,0xf0,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x11,0xe9,0xa, 0xb, 0x7e,0xb3, +0x10,0xff,0xa, 0x1b,0x2d,0x1, 0x7c,0xb1,0x7c,0x1a,0x2e,0x10,0x21,0xa5,0xf7,0x7c, +0x9b,0xa, 0x9, 0x5e,0x4, 0x0, 0x1, 0xbe,0x4, 0x0, 0x1, 0x78,0x1c,0x7c,0x79,0xac, +0x7f,0x7e,0x50,0x3, 0xac,0x5f,0xe, 0x24,0xe, 0x24,0x2d,0x32,0x7c,0xba,0x3e,0xb0, +0x24,0x25,0xa, 0xb, 0x1b,0x8, 0x30,0x80,0xd, 0xac,0x9f,0x7c,0xba,0x3e,0xb0,0x24, +0x25,0xa, 0xb, 0x1b,0x8, 0x40,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, 0xb, 0xb, 0x8, +0xf0,0x7e,0x4, 0x0, 0xa, 0x7d,0x3f,0x8d,0x30,0x8d,0x30,0x7c,0x75,0xbe,0x70,0x0, +0x40,0x14,0xbc,0xe7,0x28,0x10,0x7e,0xc4,0x0, 0x64,0x7d,0xdf,0x8d,0xdc,0x7d,0xd, +0x9d,0x1, 0x7c,0x61,0x80,0x17,0xbc,0xe7,0x38,0x19,0xbe,0x70,0x9, 0x38,0x14,0x7e, +0xe4,0x0, 0x64,0x8d,0xfe,0x7d,0x2f,0xb, 0x24,0x9d,0x21,0x7c,0x65,0xa, 0x2a,0x19, +0x62,0x11,0xe9,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x3, 0x2, 0x42,0x46,0xda,0x79,0x22, +0xca,0xf8,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf, +0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10,0xa5,0x7e,0xb3, +0xf, 0x26,0x12,0x6e,0xe2,0x12,0x64,0x48,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x44,0x6, 0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0x0, 0x64,0x7a,0x37, +0xa, 0xaf,0xe4,0x7a,0xb3,0x16,0xba,0x12,0x6c,0x7b,0x12,0x46,0x40,0x12,0x6b,0x35, +0x6c,0xff,0x1a,0x2f,0x7e,0x34,0x0, 0x18,0xad,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda, +0x2e,0x34,0x0, 0x30,0x1b,0x35,0xb, 0x38,0x30,0x1a,0x2f,0x3e,0x24,0x59,0x32,0x13, +0x9c,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xda,0x12,0x6b,0x7b,0x12,0x6c,0xd1,0x12,0x69, +0x38,0x6c,0xff,0x1a,0x3f,0x3e,0x34,0x49,0x23,0x13,0x9c,0x1a,0xf, 0x7e,0x14,0x0, +0x18,0xad,0x10,0x7d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b, +0x35,0x1b,0x38,0x20,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xd8,0x12,0x6a,0xb, 0x12,0x49, +0x47,0x7e,0xb3,0xf, 0xd3,0x70,0x9, 0x7e,0xb3,0xf, 0xd2,0x70,0x3, 0x2, 0x43,0x18, +0x12,0x1f,0x97,0x12,0x33,0xaf,0x7a,0xb3,0xf, 0x25,0x12,0x6e,0x40,0x12,0x6d,0x37, +0x70,0x3, 0x2, 0x43,0x18,0x12,0x45,0x2a,0x7e,0x37,0xf, 0xda,0x12,0x8, 0x6, 0x12, +0x6e,0xe8,0x12,0x4e,0xc4,0x12,0x0, 0x6e,0x50,0x3, 0x12,0x30,0x5, 0x7e,0xb3,0x11, +0x15,0xb4,0x1, 0x4, 0xe4,0x12,0x6e,0xd3,0x12,0x67,0x3a,0x12,0x19,0x6d,0x12,0x6, +0x11,0x12,0x6f,0x7, 0x12,0x65,0x9a,0x12,0x36,0xf6,0x12,0x56,0x4e,0x12,0x1c,0xb1, +0x12,0x4b,0x9, 0x2, 0x43,0x18,0x12,0x0, 0x1e,0x12,0x6e,0x5c,0xda,0xf8,0x22,0xca, +0x3b,0x7c,0xeb,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x38,0x3, 0x2, 0x45,0x21,0x7c, +0xbe,0x12,0xd, 0x46,0x7e,0xb3,0xd, 0xfc,0x60,0x1e,0x7e,0xb3,0x15,0x54,0x70,0x8, +0x7e,0xb3,0x15,0x55,0x70,0x2, 0x80,0x10,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x28, +0xc, 0xe5,0x12,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x1e,0x7e,0xf0,0x1, +0xbe,0x73,0xf, 0x1c,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x15,0x54, +0xbe,0x73,0xf, 0x1c,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c, +0xbe,0x12,0xd, 0x46,0xe5,0x10,0x7a,0xb3,0xd, 0xf7,0x7e,0x31,0x10,0x74,0x2, 0xac, +0x3b,0x7e,0x24,0x15,0x2b,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x7d,0x75,0x12,0x64,0x75, +0x13,0x64,0x6c,0xee,0x80,0x67,0x6c,0xdd,0x80,0x59,0x74,0x2, 0xac,0xbd,0x9, 0x75, +0xd, 0x18,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0xa, 0x37,0x9d,0x32, +0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x21,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, 0x19,0xa, +0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x19,0xa, 0x37,0x9d,0x32,0x12,0x6e,0x11, +0x7c,0xc7,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0xa, 0xe5,0x12,0xbe,0xb1,0x21,0x28,0x3, +0x85,0x21,0x12,0xbe,0xc0,0x0, 0x28,0x9, 0xe5,0x13,0xbc,0xbc,0x28,0x3, 0x7a,0xc1, +0x13,0xb, 0xd0,0x7e,0x73,0xd, 0xf7,0xbc,0x7d,0x38,0x9f,0xb, 0xe0,0x7e,0x73,0xd, +0xf7,0xbc,0x7e,0x38,0x91,0xe5,0x12,0xb4,0x64,0x3, 0x75,0x12,0x0, 0xe5,0x13,0xb4, +0x64,0x3, 0x75,0x13,0x0, 0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x85,0x13,0x12,0x80, +0x6, 0x75,0x12,0x64,0x75,0x13,0x64,0xda,0x3b,0x22,0x12,0x59,0xb0,0x70,0x3, 0x2, +0x45,0xb1,0x75,0x6e,0x14,0x75,0x6d,0x1, 0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, +0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab, +0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e, +0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38, +0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a, +0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23, +0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, +0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4, +0x22,0xe5,0x6d,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x46,0x3d,0x15,0x6e,0xe5,0x6e,0x60, +0x79,0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a, +0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23, +0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, +0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1, +0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93, +0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, +0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10, +0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22,0x75,0x6d,0x0, 0xe5,0x21,0x22, +0xca,0x79,0x7e,0x74,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x20,0xe0,0x3, 0x2, 0x47,0x47, +0x54,0xfe,0x7a,0xb3,0x10,0xfe,0x9, 0x77,0x0, 0x2, 0xbe,0x73,0xf, 0x52,0x68,0x16, +0x7a,0x73,0xf, 0x52,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x7a,0x37,0xf, 0x48,0x7e,0x79,0x70,0xbe,0x73,0xf, 0x5c,0x68,0xe, 0x7a, +0x73,0xf, 0x5c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x54,0x9, 0x77,0x0, +0x1, 0xa, 0x37,0xbe,0x37,0xf, 0x56,0x68,0x4, 0x7a,0x37,0xf, 0x56,0x7e,0x27,0xf, +0x5d,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x9, 0x77,0x0, 0x5, 0xa, 0x37,0xbd, +0x32,0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x5d,0x9, +0x77,0x0, 0x8, 0xbe,0x73,0x11,0x11,0x68,0x24,0x7a,0x73,0x11,0x11,0xbe,0x70,0xf, +0x40,0x5, 0xe4,0x19,0xb7,0x0, 0x8, 0x9, 0x77,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6e, +0x31,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0x11,0x10,0x9, 0x77,0x0, +0x9, 0xbe,0x73,0x11,0x13,0x68,0x8, 0x7a,0x73,0x11,0x13,0x7a,0x73,0x11,0x12,0x9, +0x77,0x0, 0x7, 0xbe,0x73,0x11,0x14,0x68,0x4, 0x7a,0x73,0x11,0x14,0x9, 0xb7,0x0, +0xb, 0xbe,0xb1,0x51,0x68,0x5, 0xf5,0x51,0x12,0x6d,0x1f,0x9, 0x77,0x0, 0x25,0xa, +0x37,0xbe,0x37,0x11,0xd, 0x68,0x4, 0x7a,0x37,0x11,0xd, 0x9, 0x77,0x0, 0x6, 0xbe, +0x73,0x11,0xf, 0x68,0x4, 0x7a,0x73,0x11,0xf, 0x9, 0x77,0x0, 0x24,0xbe,0x73,0x11, +0x15,0x68,0x4, 0x7a,0x73,0x11,0x15,0xda,0x79,0x22,0xca,0x79,0xe4,0x6c,0xaa,0xa, +0x4a,0x19,0xb4,0xd, 0x68,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xf3,0xe4,0x7a,0xb3,0xd, +0xf7,0x7a,0xb3,0xd, 0xf8,0x7a,0xb3,0xd, 0xf9,0x7a,0xb3,0xd, 0xfa,0x7e,0xb3,0xf, +0xd3,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x48,0x50,0x7e,0xb3,0x10,0x2b,0xf5,0x21,0x7e, +0xb3,0x10,0x2c,0xf5,0x22,0x7e,0x37,0xf, 0x56,0x7a,0x35,0x23,0x7e,0x37,0xf, 0x58, +0x7a,0x35,0x25,0x7e,0x37,0xf, 0x5a,0x7a,0x35,0x27,0x7e,0x34,0x0, 0x14,0x7a,0x35, +0x2d,0x7e,0x37,0xf, 0xda,0x7e,0x24,0x0, 0x21,0x7e,0x14,0x0, 0x29,0x7e,0x4, 0x9, +0xc8,0x12,0x4e,0x15,0xe5,0x29,0x7a,0xb3,0xd, 0xf7,0xe5,0x2a,0x7a,0xb3,0xd, 0xf8, +0xe5,0x2b,0x7a,0xb3,0xd, 0xf9,0xe5,0x2c,0x7a,0xb3,0xd, 0xfa,0x6c,0xaa,0x80,0x6c, +0x7e,0x53,0xd, 0xf7,0xbc,0x5a,0x28,0x44,0x7c,0xba,0xc4,0x23,0x54,0x1f,0x7c,0x7b, +0x7c,0xba,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x69,0x7e,0x30,0x2, 0xac,0x3a,0x49,0x71,0x9, 0xc8,0x7d,0x7, 0xa, 0x0, 0x7c,0x41, +0x19,0x41,0xd, 0x18,0x7d,0x7, 0x7c,0x41,0x19,0x41,0xd, 0x19,0xa, 0x47,0x2e,0x44, +0xd, 0x68,0x7e,0x49,0xb0,0x4c,0xb6,0x7a,0x49,0xb0,0x80,0x1e,0xa, 0x15,0xa, 0x2a, +0x9d,0x21,0x3e,0x24,0x49,0x72,0x9, 0xf0,0x7d,0x17,0xa, 0x12,0x7c,0xb3,0x19,0xb2, +0xd, 0x40,0x7d,0x17,0x7c,0xb3,0x19,0xb2,0xd, 0x41,0xb, 0xa0,0x7e,0xb3,0xd, 0xf8, +0xa, 0x2b,0x7e,0xb3,0xd, 0xf7,0xa, 0x1b,0x2d,0x12,0xa, 0x2a,0xbd,0x21,0x48,0x80, +0xda,0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff, +0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d, +0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34, +0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d, +0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d, +0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d, +0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, +0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d, +0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, +0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d, +0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f, +0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x48, +0xa1,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x48,0xa1,0x30,0xd5,0x6, 0x9f, +0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, +0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, +0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0xca,0x79,0x6c,0xee,0x12,0x65,0xd9,0x7d,0x43, +0x6c,0xaa,0x6c,0x77,0x7e,0x30,0x6, 0xac,0x37,0x2e,0x14,0x6c,0x5d,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70, +0x5, 0x40,0xe1,0xbe,0xa0,0x5, 0x78,0x3, 0x2, 0x4a,0x18,0x7e,0x63,0xd, 0xf7,0xbe, +0x60,0x0, 0x38,0x3, 0x2, 0x4a,0x18,0x6c,0x77,0x2, 0x4a,0xd, 0x6c,0xff,0x6c,0x66, +0x80,0x41,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27, +0xf, 0xda,0xb, 0x28,0x20,0x7e,0x30,0x6, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6c,0x5f, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x2, 0x18,0x14,0xb, 0xf0,0x2e,0x14,0x6c, +0x61,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x28,0xe, 0x80,0x2, 0x6c, +0xff,0xb, 0x60,0x7e,0xb3,0x10,0x2b,0xbc,0xb6,0x38,0xb7,0x7e,0x50,0x6, 0xac,0x5a, +0x7d,0x12,0x2e,0x14,0x6c,0x61,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf, +0x38,0x17,0xb, 0xe0,0x2e,0x24,0x6c,0x62,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93, +0xbc,0xbe,0x38,0x7, 0x75,0x14,0x20,0x80,0xf, 0x6c,0xee,0xb, 0x70,0x7e,0xb3,0x10, +0x2c,0xbc,0xb7,0x28,0x3, 0x2, 0x49,0x8c,0xe5,0x15,0x25,0x14,0xf5,0x14,0xbe,0xb0, +0x0, 0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0xda,0x79, +0x22,0x7d,0x53,0x9f,0x11,0xbe,0x54,0x0, 0x0, 0x40,0x2d,0xbe,0x54,0x0, 0x3f,0x38, +0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x25,0x7e,0x34,0x1, 0xe1,0xad,0x32,0x6d,0x22,0x7c, +0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x39,0x48,0x4, 0x7e,0x18,0x0, 0x39,0x7e, +0x8, 0x0, 0x39,0x9f,0x1, 0x7f,0x10,0x22,0xbe,0x54,0x5, 0x80,0x40,0x29,0xbe,0x54, +0x5, 0xb8,0x38,0x23,0x7d,0x25,0x9e,0x24,0x5, 0x7f,0x7e,0x34,0x1, 0x7d,0xad,0x32, +0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x30,0x48,0x4, 0x7e,0x18, +0x0, 0x2f,0x2e,0x18,0x4, 0xd0,0x22,0xbe,0x54,0x5, 0xb8,0x28,0x19,0x7d,0x25,0x9e, +0x24,0x5, 0x9f,0x7e,0x34,0x1, 0x7d,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a, +0x24,0x2e,0x18,0x5, 0x0, 0x22,0xbe,0x54,0x2, 0xdf,0x38,0xe, 0x7e,0x34,0x2, 0xdf, +0x9d,0x35,0x6d,0x22,0x7e,0x14,0x0, 0xdd,0x80,0xc, 0x7d,0x35,0x9e,0x34,0x2, 0xe0, +0x6d,0x22,0x7e,0x14,0x0, 0xe3,0x12,0x48,0x96,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe, +0x54,0x2, 0xdf,0x38,0xa, 0x7e,0x8, 0x2, 0x7f,0x9f,0x1, 0x7f,0x10,0x80,0x4, 0x2e, +0x18,0x2, 0x80,0xbe,0x18,0x0, 0x39,0x58,0x5, 0x7e,0x18,0x0, 0x39,0x22,0xbe,0x18, +0x4, 0xd0,0x8, 0x4, 0x7e,0x18,0x4, 0xd0,0x22,0xca,0x3b,0x7e,0x73,0xd, 0xfb,0x7a, +0x73,0xd, 0xfc,0x7e,0xa3,0xf, 0x1b,0x7a,0xa3,0xf, 0x1c,0xe4,0x7a,0xb3,0xf, 0x1f, +0x7e,0x37,0x11,0xd, 0x4d,0x33,0x78,0x3f,0xbe,0xa0,0x0, 0x28,0x8, 0xe4,0x7a,0xb3, +0x16,0xab,0x2, 0x4b,0xd0,0x7e,0xb3,0x11,0xf, 0x20,0xe0,0x3, 0x2, 0x4b,0xd0,0x7e, +0xb3,0x11,0x14,0xbe,0xb3,0x16,0xab,0x28,0x3, 0x2, 0x4b,0xd0,0xe4,0x7a,0xb3,0x16, +0xab,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x11,0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa3,0x74, +0x1e,0x7a,0xb3,0x11,0x12,0x80,0x69,0xbe,0x34,0x0, 0x1, 0x78,0x22,0xbe,0xa0,0x0, +0x28,0x5e,0x6d,0x22,0x7a,0x27,0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x7a,0xb3,0x16, +0xab,0x74,0x25,0x7a,0xb3,0x16,0xae,0x74,0x1, 0x7a,0xb3,0x16,0xad,0x80,0x41,0xbe, +0x34,0x0, 0x3, 0x78,0x3b,0x6d,0x66,0x7a,0x67,0x10,0x1, 0x7e,0x74,0xd, 0xac,0x7a, +0x77,0xa, 0xaf,0x12,0x6f,0xd, 0x12,0x60,0x8c,0x12,0x58,0xcd,0x6d,0x33,0x7a,0x37, +0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x74,0x1, 0x7a,0xb3,0x16,0xad,0x7a,0x67,0x10, +0x1, 0x7a,0x77,0xa, 0xaf,0x75,0x9a,0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf, +0x7e,0xb3,0x16,0xad,0x70,0x6, 0x12,0x5b,0xd3,0x12,0x64,0x8e,0xda,0x3b,0x22,0x7e, +0x34,0x10,0x7e,0x7e,0x24,0x0, 0x81,0xe4,0x12,0x6e,0x21,0x74,0xc, 0x7a,0xb3,0x10, +0x80,0x7a,0xb3,0x10,0x81,0x74,0x9, 0x7a,0xb3,0x10,0x82,0x74,0xf, 0x7a,0xb3,0x10, +0x7e,0x74,0x3c,0x7a,0xb3,0x10,0x7f,0x74,0xa0,0x7a,0xb3,0x10,0x83,0x74,0x1e,0x7a, +0xb3,0x10,0x85,0x74,0xb, 0x7a,0xb3,0x10,0x86,0x74,0x1e,0x7a,0xb3,0x10,0x87,0xe4, +0x7a,0xb3,0x10,0x88,0x7a,0xb3,0x10,0x89,0xf5,0x52,0xf5,0x51,0x7a,0xb3,0x10,0xa3, +0x74,0x1, 0x7a,0xb3,0x10,0x84,0x7a,0xb3,0x10,0xa2,0x7a,0xb3,0x10,0xa5,0x74,0x5, +0x7a,0xb3,0x10,0xa4,0x74,0x3b,0x7a,0xb3,0x10,0xa6,0x74,0xb, 0x7a,0xb3,0x10,0xad, +0x12,0x6e,0xfa,0xa, 0x36,0x7a,0x73,0x10,0xa7,0x12,0x6e,0xfa,0x7a,0x73,0x10,0xa8, +0x12,0x6e,0xff,0xa, 0x36,0x7a,0x73,0x10,0x9f,0x12,0x6e,0xff,0x7a,0x73,0x10,0xa0, +0xe4,0x7a,0xb3,0x10,0xae,0x74,0x1f,0x7a,0xb3,0x10,0xcf,0xe4,0x7a,0xb3,0x10,0xb0, +0x12,0x6e,0x4e,0x7a,0xb3,0x10,0xaf,0x12,0x6d,0x4f,0x7a,0xb3,0x10,0xa1,0x7e,0x34, +0x10,0x8e,0x7e,0x24,0x0, 0x8, 0x74,0xff,0x12,0x6e,0x21,0x74,0x5, 0x7a,0xb3,0x10, +0x8e,0x74,0x1, 0x7a,0xb3,0x10,0x8f,0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x0, 0x40,0x2d, +0xbe,0xf4,0x0, 0x3f,0x38,0x27,0x7e,0x44,0x0, 0x3f,0x9d,0x4f,0x7e,0x54,0x1, 0x8c, +0xad,0x54,0x6d,0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x32,0x40,0x4, 0x7e,0x28, +0x0, 0x32,0x7e,0x18,0x0, 0x32,0x9f,0x12,0x7f,0x21,0x2, 0x4d,0x5c,0xbe,0xf4,0x3, +0x0, 0x40,0x22,0x7d,0x4f,0x9e,0x44,0x3, 0x0, 0x7e,0x54,0x1, 0x82,0xad,0x54,0x6d, +0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x2e,0x40,0x4, 0x7e,0x28,0x0, 0x2d,0x2e, +0x28,0x2, 0xa2,0x80,0x57,0xbe,0xf4,0x1, 0x9f,0x38,0xe, 0x7e,0x54,0x1, 0x9f,0x9d, +0x5f,0x6d,0x44,0x7e,0x14,0x0, 0xdd,0x80,0xc, 0x7d,0x5f,0x9e,0x54,0x1, 0xa0,0x6d, +0x44,0x7e,0x14,0x0, 0xe5,0x7f,0x12,0x12,0x48,0x96,0x7f,0x21,0x7c,0xba,0x7c,0xa9, +0xa, 0x48,0xbe,0xf4,0x1, 0x9f,0x38,0xa, 0x7e,0x18,0x1, 0x67,0x9f,0x12,0x7f,0x21, +0x80,0x4, 0x2e,0x28,0x1, 0x68,0xbe,0x28,0x0, 0x32,0x50,0x6, 0x7e,0x28,0x0, 0x32, +0x80,0xa, 0xbe,0x28,0x2, 0xa2,0x28,0x4, 0x7e,0x28,0x2, 0xa2,0x7d,0x35,0x22,0xca, +0x3b,0x6d,0x11,0x7d,0x1, 0x7d,0x21,0x7e,0xa0,0x2, 0x7e,0x70,0x2, 0x6c,0x66,0x80, +0x39,0x6c,0x99,0x80,0x2b,0x7e,0xd0,0x30,0xac,0xd6,0x7e,0xf0,0x2, 0xac,0xf9,0x7d, +0xf7,0x2d,0xf6,0x2e,0xf7,0xf, 0xda,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, 0x14,0x8, 0x4, +0xb, 0x4, 0x80,0x8, 0xbe,0xf4,0xff,0xec,0x58,0x2, 0xb, 0x24,0xb, 0x14,0x2c,0x97, +0x7e,0xb3,0x10,0x2c,0xbc,0xb9,0x38,0xcd,0x2c,0x6a,0x7e,0xb3,0x10,0x2b,0xbc,0xb6, +0x38,0xbf,0x7e,0x54,0x0, 0x3, 0xad,0x51,0x7d,0x35,0x1e,0x34,0x1e,0x34,0xbd,0x30, +0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb5,0x7e,0xb3,0x16,0xb6,0xbe,0xb0,0x5, 0x50,0x7, +0x4, 0x7a,0xb3,0x16,0xb6,0x80,0x39,0xe4,0x7a,0xb3,0x16,0xb6,0x75,0x71,0x1, 0x80, +0x2f,0xbd,0x32,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb6,0x7e,0xb3,0x16,0xb5,0xbe,0xb0, +0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb5,0x80,0x16,0xe4,0x7a,0xb3,0x16,0xb5,0x75, +0x71,0x2, 0x80,0xc, 0xe4,0x7a,0xb3,0x16,0xb5,0x7a,0xb3,0x16,0xb6,0x75,0x71,0x0, +0xe5,0x71,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x56,0xf5,0xba, +0x7e,0x55,0x2d,0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1,0x9, +0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54,0xe0,0x4c,0xba, +0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c,0xb7,0xf5,0xc6, +0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, 0x4, 0x6e,0x34, +0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x4, 0x1a, +0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, 0x6, 0x7c,0xb1, +0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, 0x4e,0x96,0x43, +0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xa, +0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1,0x0, 0x3, 0x75, +0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19,0xb1,0x0, 0x1, +0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0xf, 0xd2,0x60,0x6, 0x7e,0xb3, +0xf, 0xd3,0x70,0x18,0x7e,0x34,0xd, 0x68,0x7e,0x24,0x0, 0x3, 0xe4,0x12,0x6e,0x21, +0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4,0x12,0x6e,0x21,0x6c,0xee,0x80,0x6b, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0x7a,0x71,0x21,0x9, 0x65,0xd, 0x19,0x7a, +0x61,0x22,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xdb,0x7c,0xbe,0x54,0x7, 0x7e,0x24, +0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xc5,0x7e,0x50,0x30,0xac,0x57, +0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0xbe,0x37, +0xf, 0x54,0x48,0x25,0xa, 0x3d,0x9, 0xb3,0xd, 0x68,0x5c,0xbc,0x68,0x1b,0x7e,0x50, +0x7, 0xac,0x5e,0x2e,0x24,0xd, 0x6b,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xe, 0xd, +0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x7d,0xb, 0xf0,0xb, 0xe0,0x7e,0x73,0xd, 0xf7,0xbc, +0x7e,0x38,0x8d,0x7a,0x73,0xd, 0xfb,0x7a,0xf3,0xf, 0x1b,0xda,0x3b,0x22,0xca,0xf8, +0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x2, 0x50,0x9, 0x7e,0x90,0x2, +0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, 0x6e,0x44,0xff, +0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0xa, 0x50,0x6b,0x4c,0xff,0x78,0x14, +0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xe4, +0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd,0x1b,0xf5,0xb, +0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd,0xf4,0x18,0x37, +0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd,0x1b,0xc5,0xb, +0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff,0xff,0xb, 0xf4, +0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18,0x9, 0xa, 0xda, +0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x3, 0x2, 0x4f,0x7d, +0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x33,0x7d,0x73,0x75,0x25,0x0, 0x7e,0x64, +0x5, 0xe0,0x75,0x23,0x0, 0x80,0x3c,0x75,0x24,0x0, 0x7e,0x51,0x23,0x74,0x18,0xac, +0x5b,0x3e,0x24,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2d,0x36,0x7a,0x35, +0x21,0x49,0x23,0x0, 0x30,0xb, 0x38,0x30,0x9d,0x32,0x12,0x6e,0x11,0xe5,0x24,0xb4, +0x17,0x2, 0x1e,0x34,0xbd,0x37,0x28,0x2, 0x7d,0x73,0x5, 0x24,0xe5,0x24,0xb4,0x18, +0xc9,0x5, 0x23,0xe5,0x25,0xa, 0x2b,0x7e,0x33,0x10,0x7c,0xa, 0x13,0x9d,0x12,0x1b, +0x14,0xe5,0x23,0xa, 0x2b,0xbd,0x21,0x48,0xae,0xbe,0x74,0x0, 0x41,0x28,0x11,0x7e, +0x34,0x0, 0x73,0x7e,0xa3,0x16,0x25,0x74,0x12,0xa4,0x59,0x35,0x16,0x36,0x80,0x26, +0x7e,0x43,0x16,0x25,0x7e,0x50,0x12,0xac,0x45,0x49,0x32,0x16,0x36,0xbd,0x37,0x50, +0x6, 0x59,0x72,0x16,0x36,0x80,0xf, 0xbe,0x34,0x0, 0x0, 0x28,0x9, 0x2e,0x24,0x16, +0x36,0x1b,0x34,0x1b,0x28,0x30,0xda,0x3b,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca, +0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x0, 0x46, +0x7e,0x35,0x6b,0xb, 0x34,0x7a,0x35,0x6b,0x7e,0xb3,0x16,0xba,0x4, 0x7a,0xb3,0x16, +0xba,0x7e,0x35,0x6b,0xbe,0x34,0x3, 0xe8,0x40,0x13,0x6d,0x33,0x7a,0x35,0x6b,0x7e, +0xb3,0x16,0xab,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x16,0xab,0x7e,0x73,0x16, +0xaf,0xbe,0x73,0x16,0xae,0x28,0xb, 0x7e,0xb3,0x16,0xae,0x4, 0x7a,0xb3,0x16,0xae, +0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xad,0x7e,0xb3,0x16,0xb0,0x60,0x5, 0x14,0x7a, +0xb3,0x16,0xb0,0x7e,0x37,0x10,0x1, 0xb, 0x34,0x7a,0x37,0x10,0x1, 0x7e,0x37,0xa, +0xaf,0xbe,0x37,0x10,0x1, 0x28,0x3, 0x12,0x6f,0x10,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x75, +0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8, +0x16,0xbb,0x75,0x6a,0x0, 0x75,0x8, 0x1, 0x75,0x9, 0x0, 0x75,0xa, 0x0, 0x75,0xc, +0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0xc2,0x0, 0x75,0x11,0x0, 0x75, +0x12,0x64,0x75,0x13,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x18,0x1, 0x75,0x6b, +0x0, 0x75,0x6c,0x0, 0x75,0x71,0x0, 0x75,0x6d,0x0, 0x75,0x72,0x0, 0x75,0x73,0x1, +0x75,0x6f,0x18,0x75,0x70,0x0, 0x75,0x74,0x0, 0x75,0x75,0x0, 0x75,0x1d,0x0, 0x75, +0x1e,0xff,0x75,0x1f,0x0, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x6f,0x17,0xb, 0xa, 0x40, +0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, +0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x5c, +0x38,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, 0x78,0xc, 0x7e,0x34,0x10,0x2b, +0x12,0x6b,0x58,0xa9,0xc7,0xea,0x80,0x27,0xbe,0xd0,0x5, 0x78,0x1f,0xa9,0xd7,0xea, +0x7e,0xe3,0x10,0x4a,0x7e,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x4d,0x12,0x66,0x8d, +0x7a,0xb3,0x10,0x4a,0x74,0x1, 0x7a,0xb3,0x10,0x78,0x80,0x3, 0xe4,0x80,0x4e,0x7e, +0xb3,0x11,0x96,0x7e,0x34,0x10,0x2b,0xb4,0x1, 0xa, 0x12,0x31,0xfb,0xe4,0x7a,0xb3, +0x11,0x96,0x80,0xa, 0x12,0x61,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5e,0x27,0x7e,0x34, +0x10,0x2b,0x12,0x6a,0xa5,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, 0x7e,0x73,0x11,0xe8, +0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x69,0x64,0xbe,0xd0,0x5, 0x78,0xd, 0x7a,0xe3, +0x10,0x4a,0x7a,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x1, 0xda,0x79,0xda, +0xd8,0x22,0x7e,0x34,0xe, 0xd, 0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x7e, +0x34,0xe, 0x53,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0xe, 0x99, +0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x6c,0xaa,0x74,0x3, 0xa, 0x4a,0x19, +0xb4,0xe, 0xdf,0x19,0xb4,0xe, 0xe9,0x7e,0x44,0xff,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x59,0x43,0xe, 0xf3,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0xf, 0x7, 0xb, 0xa0,0xbe, +0xa0,0xa, 0x40,0xd7,0xe4,0x7a,0xb3,0xf, 0x1b,0x7a,0xb3,0xf, 0x1c,0x7a,0xb3,0xf, +0x1d,0x7a,0xb3,0xf, 0x1f,0x7a,0xb3,0xf, 0x20,0x7a,0xb3,0xf, 0x21,0x7a,0xb3,0xf, +0x22,0x7a,0xb3,0xf, 0x23,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x25,0x12,0x6a,0xee, +0x74,0x3, 0x7a,0xb3,0xf, 0x26,0x74,0x1, 0x7a,0xb3,0xf, 0x27,0xe4,0x7a,0xb3,0xf, +0x28,0x22,0xca,0xf8,0x7c,0xab,0x6c,0x33,0x7c,0x27,0x80,0x73,0x7e,0x90,0x7, 0xac, +0x93,0x9, 0xf4,0xe, 0x57,0x7e,0x10,0x7, 0xac,0x12,0x9, 0xb0,0xe, 0x11,0xbc,0xfb, +0x78,0x5b,0xbe,0xf0,0xff,0x68,0x56,0x7e,0x10,0x7, 0xac,0x1a,0x7d,0xf0,0x2d,0xf2, +0x19,0xff,0x0, 0x4, 0x49,0x44,0xe, 0x53,0x2d,0x2, 0x1b,0x8, 0x40,0x7e,0x10,0x7, +0xac,0x13,0x49,0x0, 0xe, 0x55,0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x59,0x4, 0x0, +0x2, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x12,0x7e,0x90,0x7, 0xac,0x9a,0x2d, +0x42,0x19,0x14,0x0, 0x5, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x13,0x7e,0x90, +0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x6, 0xb, 0xa0,0x80,0x6, 0xb, 0x20,0xbc, +0x62,0x38,0x89,0xb, 0x30,0xbe,0x30,0xa, 0x50,0x3, 0x2, 0x53,0x8, 0x7c,0xba,0xda, +0xf8,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x3b,0xbe,0xa0,0x3e,0x38,0x36,0xbe,0xa0, +0x4, 0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x15,0xde,0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0, +0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x0, 0x6, 0x7e,0x34,0x0, 0x76,0x80, +0x4, 0x7e,0x34,0x0, 0xb8,0x7a,0x37,0x0, 0xfd,0xa, 0x3a,0x2e,0x37,0x0, 0xfd,0x9, +0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0xb, 0x22,0xbe,0xa0,0x80,0x40,0xc, +0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0xf, 0xfe,0x22,0xbe,0xa0,0xfc,0x78, +0x5, 0x7e,0xb3,0x10,0xa5,0x22,0xbe,0xa0,0xfd,0x78,0x8, 0x7e,0x37,0x10,0x46,0x7e, +0x39,0xb0,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3,0x10,0x4a,0x22,0xbe,0xa0,0xf9, +0x78,0x5, 0x7e,0xb3,0x16,0xbb,0x22,0xbe,0xa0,0xfa,0x78,0x3, 0xe5,0x6a,0x22,0xe4, +0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x4d,0xf5,0x24,0xe4,0x7a,0xb3, +0x10,0x4d,0x7e,0x34,0x10,0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a,0xa5, +0x75,0x21,0x0, 0x12,0x69,0x64,0x12,0x6e,0xb9,0x60,0xfb,0xa9,0xb7,0xea,0x7d,0x36, +0x7d,0x27,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2,0x75,0x22,0x0, 0x80,0x36,0x75,0x23, +0x0, 0x80,0x26,0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b,0x2d,0x23, +0x3e,0x24,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, +0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x23,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x23, +0x38,0xd1,0x5, 0x22,0x7e,0x73,0x10,0x2b,0xbe,0x71,0x22,0x38,0xc1,0x5, 0x21,0xe5, +0x21,0xbe,0xb0,0x4, 0x40,0x9d,0xe5,0x24,0x7a,0xb3,0x10,0x4d,0xda,0x3b,0x22,0xca, +0xf8,0x30,0x90,0x58,0xc2,0x90,0x5, 0xa, 0xe5,0xa, 0xb4,0x1, 0x6, 0xe5,0x91,0xf5, +0xf, 0x80,0x29,0xe5,0xb, 0xc4,0x7c,0xfb,0x5e,0xf0,0x7, 0x78,0xe, 0xe5,0xa, 0x25, +0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x56,0xd7,0x80,0x11,0xbe,0xf0,0x4, 0x78,0xc, +0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x15,0xe2,0xe5,0xb, 0xc4,0x7c, +0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80, +0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x4a,0xf5,0x91,0x30,0x91,0x28,0xc2, +0x91,0x5, 0x9, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0xb, 0xe5, +0x9, 0x25,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80,0xd, 0xa5,0xbd,0x4, 0x9, 0xe5,0x9, +0x25,0xf, 0x12,0x27,0x4a,0xf5,0x91,0xda,0xf8,0x22,0x6c,0x33,0xbe,0x30,0x18,0x50, +0x1e,0xa, 0x3, 0x2e,0x7, 0x10,0x35,0x7e,0x9, 0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, +0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x16,0x1e,0xa0,0x80,0x12,0xa, +0x3, 0x2e,0x7, 0x10,0x33,0x9, 0x20,0xff,0xe8,0xa, 0x52,0x2e,0x54,0x0, 0x18,0x7c, +0xab,0x7e,0x23,0x10,0x3a,0xbe,0x20,0x3, 0x28,0xe, 0x7e,0x10,0x2, 0xac,0x1a,0x2d, +0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x21,0xa, 0x42,0x2e,0x44,0x0, 0xc, 0x7e,0x4, +0x0, 0xf, 0x9d,0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0x0, +0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e,0x44,0x7f,0xff,0x9d,0x40,0x7e, +0x10,0x2, 0xac,0x13,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xbe,0x30,0x25,0x50,0x3, +0x2, 0x55,0x3c,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e,0x37,0xf, +0xd6,0xb, 0x38,0x10,0xbe,0x17,0xe, 0x7, 0x8, 0x12,0x7d,0x2, 0x2e,0x7, 0xf, 0xd4, +0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30,0x80,0x18,0x6d,0x33,0x9e,0x37, +0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x9e,0x37,0xe, +0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xbb,0x6c,0xaa,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xe, 0x7, 0x8, 0x12,0x7d,0x2, 0x2e,0x4, +0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30,0x80,0x18,0x6d,0x33, +0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x9e, +0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xc0,0x22,0xca,0x69, +0xca,0xf8,0x6c,0x11,0x7e,0xd0,0x7, 0xac,0xd1,0x9, 0x6, 0xe, 0x9d,0x5e,0x0, 0xf, +0x49,0xf6,0xe, 0x9b,0xbe,0xf4,0x5, 0x18,0x40,0x3c,0x49,0x46,0xe, 0x99,0x7d,0x34, +0x12,0x6b,0xde,0x7c,0xfb,0xbe,0xf0,0x3, 0x40,0xe, 0x7e,0x14,0x4, 0xff,0x74,0x7, +0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x3e,0x74,0x2, 0xac,0xbf,0x49,0x45,0x16,0x95, +0x74,0x7, 0xac,0xb1,0x59,0x45,0xe, 0x99,0x7e,0x14,0x7, 0xd0,0x74,0x7, 0xac,0xb1, +0x59,0x15,0xe, 0x9b,0x80,0x25,0xbe,0xf4,0x5, 0x0, 0x40,0x1f,0x7e,0x14,0x4, 0xff, +0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x74,0x7, 0xac,0xb1,0x49,0x15,0xe, 0x9b, +0xbe,0x14,0x5, 0xa, 0x40,0x5, 0x7c,0xb0,0x12,0x68,0xab,0xb, 0x10,0xbe,0x10,0xa, +0x40,0x82,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x70,0x41,0x7e,0x74,0x0, 0xb, 0x7a, +0x79,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c,0x7b,0xa5,0xbf,0x4, 0x15,0x7e, +0xb3,0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x13,0x74,0x27,0x7e, +0x70,0x3, 0x80,0x4b,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, 0x74,0x1, 0x7e,0x70,0x1, +0x12,0x0, 0x5e,0x80,0x45,0x74,0x27,0x7e,0x70,0x1, 0x80,0x33,0xbe,0xb0,0xfc,0x68, +0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa,0x5, 0x7e,0x60,0x5, 0x80,0x10,0xa5,0xbf,0x55, +0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5,0xbf,0x66,0x20,0x7e,0x60,0x7, 0x74,0x27,0x7c, +0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0x24,0x80,0x12, +0x6d,0xe0,0x80,0x6, 0xb4,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x79,0x22,0x6c,0x77,0x6c, +0xaa,0x80,0x3c,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, 0xda,0x2e,0x24, +0x0, 0x30,0x7d,0x12,0x1b,0x16,0xb, 0x18,0x40,0xbe,0x44,0x0, 0x3c,0x8, 0x1e,0x7e, +0x14,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x5e,0x14,0x4, 0x44, +0x68,0xb, 0x1b,0x25,0xb, 0x28,0x20,0xbd,0x42,0x8, 0x2, 0xb, 0x70,0xb, 0xa0,0x7e, +0x63,0x10,0x2b,0xbc,0x6a,0x38,0xbc,0xbe,0x70,0x1, 0x40,0x30,0x6c,0xaa,0x80,0x24, +0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, 0xda,0x2e,0x24,0x0, 0x30,0x1b, +0x25,0xb, 0x28,0x30,0x7e,0x30,0x2, 0xac,0x3a,0x59,0x31,0x16,0x6f,0x6d,0x33,0x1b, +0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xd4,0x22,0xca,0x79,0x6c, +0xff,0x6c,0xee,0x80,0x63,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbe,0x54, +0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x2a,0x9, 0xb2, +0xd, 0x68,0x5c,0xb7,0x68,0x40,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x24,0xd, 0x18,0x7e, +0x70,0x2, 0xac,0x7f,0x2e,0x34,0xd, 0x18,0x7e,0x14,0x0, 0x2, 0x12,0x6d,0x7d,0x7c, +0xbf,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x4a,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x4c, +0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xe0,0x7e,0x63,0xd, 0xf7,0xbc,0x6e,0x38,0x95, +0x7a,0xf3,0xd, 0xf7,0xda,0x79,0x22,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, +0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x7e,0xb3,0x10,0xa5,0x24,0xfa,0x68,0x17, +0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x16,0xb9,0xbe,0xb0,0x5, 0x68,0x4c, +0x74,0x5, 0x7a,0xb3,0x16,0xb9,0x22,0x7e,0xb3,0x16,0xb9,0xb4,0x5, 0x3e,0x74,0x6, +0x7a,0xb3,0x16,0xb9,0x74,0xfa,0x12,0x6d,0x66,0x75,0x9a,0x80,0x7e,0x34,0x77,0xf8, +0x12,0x69,0xe2,0x7e,0x34,0x77,0xf8,0x74,0x66,0x12,0x5a,0x21,0x7e,0x34,0x77,0xf9, +0x74,0xbb,0x12,0x5a,0x21,0x80,0x12,0x7e,0xb3,0x16,0xb9,0xb4,0x5, 0xe, 0x74,0x7, +0x7a,0xb3,0x16,0xb9,0x74,0xfa,0x12,0x6d,0x66,0x75,0xe9,0xff,0x22,0x0, 0x0, 0x0, +0x0, 0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x16,0xa9,0xb4,0x1, 0x14,0x7e,0x73,0x16, +0xac,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xe4,0x7a,0xb3,0x16,0xa9,0x80, +0xb, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xd0,0xca,0xc2, +0xa8,0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x16,0xb0,0x7e,0xb3,0x16,0xb0,0x70,0xfa,0x12, +0x6e,0xb0,0x12,0x61,0x8e,0x12,0x6b,0xff,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34, +0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x12,0x6a,0x59,0x12,0x6a,0x7f,0x12, +0x52,0x72,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x2, 0x6e,0xf4,0xca, +0x3b,0x7d,0x72,0x7d,0x63,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0x7d,0x36,0x7e,0x24, +0x0, 0x4a,0xe4,0x12,0x6e,0x21,0x7d,0x37,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6e,0x21, +0x75,0x21,0x1, 0x12,0x6c,0x1f,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0x75,0x22,0x0, +0x7e,0x51,0x22,0x74,0x2, 0xac,0x5b,0x49,0x2, 0xa, 0x62,0x1e,0x4, 0x1e,0x4, 0x7d, +0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d,0x30,0x1b,0x18,0x30,0x49,0x12,0xa, 0x18,0x1e, +0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x22,0xe5, +0x22,0xb4,0x25,0xcc,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x5, 0x40,0xb6,0xda,0x3b,0x22, +0x6c,0x77,0x7e,0x63,0xd, 0xfa,0xa, 0x16,0x7e,0x63,0xd, 0xf9,0xa, 0x26,0x2d,0x21, +0xbe,0x24,0x0, 0xb4,0x28,0x3, 0x74,0x1, 0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x22,0x8, 0x9a,0xbe,0x24,0x3, 0xe8,0x8, 0x9, 0xb, 0x70,0xbe,0x70, +0x10,0x68,0xe, 0x80,0x2, 0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10,0x2c,0xbc,0x6a,0x38, +0xdc,0xa5,0xbf,0x10,0x2a,0x6c,0x77,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x22,0x8, 0xca,0xbe,0x24,0x7, 0xd0,0x8, 0x9, 0xb, 0x70,0xa5,0xbf,0x8, 0x5, +0x74,0x1, 0x22,0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xdc,0xe4, +0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb,0x75,0xfb,0xa5,0x75,0xfb,0xf, +0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68,0x18,0xbe,0x34,0x73,0xf9,0x68,0x12,0xbe, +0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0xe4, +0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c,0xb7,0x54,0xfe,0xf5,0xf2,0x75,0xf3,0x80, +0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75,0xf6,0xff,0x7a,0xa1,0xf6,0x80, +0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75,0xf5,0x80,0x74,0x1, 0x12,0x6d,0x66,0xa9, +0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0x74,0x1, 0x22, +0x74,0xa, 0x7a,0xb3,0xf, 0x46,0x74,0x14,0x7a,0xb3,0xf, 0x47,0x7e,0x34,0x3, 0x20, +0x7a,0x37,0xf, 0x48,0x7a,0x37,0xf, 0x4a,0x7e,0x24,0x2, 0x58,0x7a,0x27,0xf, 0x4c, +0x7a,0x37,0xf, 0x4e,0x7a,0x37,0xf, 0x50,0x74,0xc, 0x7a,0xb3,0xf, 0x52,0x74,0x8, +0x7a,0xb3,0xf, 0x53,0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, 0x54,0x7a,0x37,0xf, 0x56, +0x7a,0x37,0xf, 0x58,0x7e,0x34,0x0, 0x28,0x7a,0x37,0xf, 0x5a,0x74,0xf, 0x7a,0xb3, +0xf, 0x5c,0xe4,0x7a,0xb3,0xf, 0x5f,0x74,0x4, 0x7a,0xb3,0xf, 0x60,0x7e,0x34,0x0, +0x64,0x7a,0x37,0xf, 0x61,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0xf, 0x5d,0x22,0xca,0x3b, +0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x3c,0xf5,0x1c,0xe4,0x7a,0xb3,0x10,0x3c,0x7d, +0x36,0x7d,0x27,0x12,0x6a,0xca,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x75,0x1a,0x0, +0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60,0xfb,0x7d,0x36,0x7e,0x25, +0x6f,0x12,0x55,0x3a,0x75,0x1b,0x0, 0x7e,0x51,0x1b,0x74,0x2, 0xac,0x5b,0x7d,0x32, +0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31, +0x1b,0x28,0x30,0x5, 0x1b,0xe5,0x1b,0xb4,0x25,0xdd,0x5, 0x1a,0xe5,0x1a,0xbe,0xb0, +0x4, 0x40,0xbd,0xe5,0x1c,0x7a,0xb3,0x10,0x3c,0xda,0x3b,0x22,0x7d,0x3, 0x75,0xcc, +0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0,0xe5,0xca,0x54,0x1, 0x4c,0xba, +0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1,0xe1,0x9, 0x70,0x0, 0xe, 0x2e, +0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c,0xba,0xc4,0x33,0x54,0xe0,0x7c, +0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, 0xb0,0x0, 0x13,0x54,0x3, 0xa, +0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5,0xe3,0x54,0xe7,0x4c,0xba,0xf5, +0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12,0x5d,0x65,0x9, 0xb0,0x0, 0x14, +0xf5,0xe7,0x22,0x7e,0xb3,0x16,0xa9,0x70,0x17,0xe5,0xcc,0x7a,0xb3,0x16,0xaa,0x7e, +0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xac,0x74,0x1, 0x7a,0xb3,0x16,0xa9, +0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc,0xc2,0xca,0xc2,0xc8,0xa9,0xc4, +0xcb,0x80,0x2e,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0x23,0xe5,0x74,0xb4,0x1, 0x1e,0xe5, +0x75,0xb4,0x1, 0x19,0xa9,0xc3,0xcb,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0xe4,0x12,0x6d, +0xaa,0x7e,0xb3,0x16,0xad,0x60,0xcc,0x22,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34, +0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0xd, 0x12,0x6e,0xb0,0x12,0x61,0x8e,0x12, +0x6f,0x16,0x12,0x6d,0xbc,0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x12,0x6b,0xff,0x12,0x6a, +0x59,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x12,0x6e,0xf4,0x7e,0xb3, +0x10,0xa5,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14,0x68,0x16,0x14,0x68,0x13,0x24, +0x5, 0x78,0xeb,0x12,0x42,0xf0,0x80,0xe6,0x12,0x5e,0xda,0x80,0xe1,0x12,0x6a,0x32, +0x80,0xdc,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x12,0x58,0x57,0x80,0xd1,0x7c,0xa5,0x7c, +0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5, +0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2,0x1e,0xb0,0x1e,0xb0,0x54,0xf, +0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x1e,0x50,0x1e,0x50,0x1e,0x50, +0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1,0x7c,0xb3, +0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0,0x43,0xc2,0x7, 0x80,0x7, 0x43, +0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0xa9,0xc6,0xcb, +0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, 0xac,0x13,0x2e,0x4, 0x1c,0x3a, +0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c,0x33,0x80,0x43,0xa, 0x3, 0x2d, +0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0,0xb, 0x2d,0x3, 0x7e,0x9, 0xb0, +0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x3e, +0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c,0xb2,0x1e,0xb0,0x7e,0x90,0x2, +0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d,0xf, 0x1b,0x48,0x0, 0xb, 0x30, +0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, 0x9, 0xb2,0x0, 0xc, 0x54,0x7f, +0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x7, +0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4,0xb, 0x6c,0xaa,0xa, 0x1a,0x49, +0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5,0xb, 0xa0,0xbe,0xa0,0x25,0x40, +0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39,0xb0,0xf5,0xe5,0x75,0xe4,0x31, +0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x32,0x5e, +0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0xca,0x79,0x7e,0x71,0x54,0x3e,0x70,0x3e, +0x70,0x7c,0xb7,0x24,0x56,0xa, 0x2b,0xb, 0x28,0x50,0x7c,0xab,0x7c,0xb7,0x24,0x58, +0xa, 0x3b,0xb, 0x38,0x70,0x4d,0x77,0x68,0x1f,0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0, +0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x58,0x7d, +0x37,0x7e,0x24,0x18,0x0, 0x12,0x55,0x3a,0x5, 0x54,0xe5,0x53,0xbe,0xb1,0x54,0x28, +0x10,0x12,0x62,0xd5,0xb4,0x1, 0x5, 0x75,0x55,0x1, 0x80,0x8, 0x75,0x55,0x3, 0x80, +0x3, 0x75,0x55,0x2, 0xda,0x79,0x22,0x6d,0x11,0x7e,0x24,0x1c,0x1c,0x1b,0x28,0x10, +0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0xa3,0x0, 0x50,0x80,0x2, 0x7c, +0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x7e,0x4, +0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, 0x14,0x1b,0x8, 0x10,0x49,0x13, +0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0x49,0x13,0x0, 0x43, +0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0xb, 0x50,0xbe,0x50,0xd, 0x40, +0xb1,0x22,0x75,0x9, 0x0, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, +0x9, 0xe5,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, +0x12,0x27,0x4a,0xf5,0x91,0x75,0xa, 0x0, 0xe4,0x7a,0xb3,0x0, 0xfa,0x7e,0x34,0x0, +0x76,0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0x0, 0xb8,0x7e,0x24, +0x0, 0x42,0x74,0xff,0x12,0x6e,0x21,0x74,0xaa,0x7a,0xb3,0x0, 0x76,0x7a,0xb3,0x0, +0x77,0x7a,0xb3,0x0, 0xb8,0x7a,0xb3,0x0, 0xb9,0x22,0xca,0xf8,0x74,0x3, 0x7a,0xb3, +0x16,0xa0,0xe4,0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x74,0x3, 0x7a,0xb3,0x16, +0xa0,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x7e, +0xf3,0x16,0xa0,0xbe,0xf0,0x3, 0x78,0x1d,0xe5,0xb, 0x30,0xe7,0xe4,0x12,0x6b,0x35, +0x7e,0x37,0xf, 0xd6,0x7a,0x37,0x16,0x9d,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x16,0x9b, +0x53,0xb, 0x7f,0x80,0xcc,0x7a,0xf3,0x10,0xa5,0x12,0x0, 0x1e,0x12,0x0, 0x6a,0xda, +0xf8,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5, +0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7c,0xb3,0xf5,0xbd,0xa, +0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5,0xc3,0xe5,0xc4,0x54,0xe0,0x4c, +0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23,0x4e,0x24,0x0, 0x1, 0x7c,0x15, +0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2,0x0, 0x0, 0x0, 0x0, 0xa9,0x37, +0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x6c,0xaa,0x6c,0x77,0x7e,0x10,0x30, +0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d,0x1, 0x2e,0x7, 0xf, 0xda,0xb, +0x8, 0x20,0xbe,0x27,0xe, 0x5, 0x8, 0x12,0x7d,0x41,0x2e,0x47,0xf, 0xd8,0xb, 0x48, +0x0, 0x2e,0x7, 0xe, 0x5, 0x1b,0x48,0x0, 0x80,0x18,0x6d,0x0, 0x9e,0x7, 0xe, 0x5, +0xbd,0x20,0x58,0xe, 0x2e,0x17,0xf, 0xd8,0xb, 0x18,0x20,0x9e,0x27,0xe, 0x5, 0x1b, +0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0,0xbe,0xa0,0xd, 0x40,0xac,0x22, +0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, 0x31,0x7e,0x79,0x50,0xa5,0xbd, +0x0, 0xb, 0x7e,0xd, 0x31,0x7e,0xb, 0x40,0x7a,0x79,0x40,0x80,0x36,0x7e,0xd, 0x31, +0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12,0x6e,0x11,0xa, 0x2c,0xbd,0x32, +0x8, 0x18,0x7e,0x1d,0x31,0x7e,0x1b,0xb0,0x7e,0x79,0xa0,0xbc,0xba,0x7c,0xba,0x28, +0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0,0x7e,0x79,0x30,0x7e,0x1d,0x31, +0x7a,0x1b,0x30,0xda,0x3b,0x22,0x7e,0xb3,0x10,0x39,0xb4,0x1, 0x26,0x7e,0x73,0xa, +0xac,0x7a,0x73,0x10,0x37,0x7e,0x73,0xa, 0xad,0x7a,0x73,0x10,0x38,0x7e,0x73,0xa, +0xae,0x7a,0x73,0x10,0x3a,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, +0xdc,0x80,0x24,0x7e,0x73,0x11,0x16,0x7a,0x73,0x10,0x37,0x7e,0x73,0x11,0x49,0x7a, +0x73,0x10,0x38,0x7e,0x73,0x11,0x94,0x7a,0x73,0x10,0x3a,0x7e,0x34,0x11,0x9d,0x7a, +0x37,0x10,0x46,0x7e,0x34,0xf, 0x63,0x7a,0x37,0x10,0x48,0x22,0xe5,0x55,0xbe,0xb0, +0x1, 0x68,0xf9,0xe5,0x74,0x60,0xfc,0xe5,0x75,0x60,0xfc,0x20,0x93,0xfd,0xd2,0x96, +0xd2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e,0xb3,0x16,0xa9,0x70,0x17,0xe5, +0xcc,0x7a,0xb3,0x16,0xaa,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xac, +0x74,0x1, 0x7a,0xb3,0x16,0xa9,0xa9,0xc0,0xca,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d, +0x8, 0x1b,0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0x75,0x87,0x2, 0x0, +0x0, 0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e,0x37,0xf, 0xd6,0xb, +0x38,0x10,0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xa0, +0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e, +0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0, +0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e,0x24,0x3, 0x70,0x74,0x18,0x7e, +0x13,0x10,0x2b,0x6c,0x0, 0x2, 0x5f,0x32,0x9, 0xa3,0x0, 0x24,0xbe,0xa0,0x1, 0x78, +0x5, 0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43,0xcc,0x8, 0x9, 0x53,0x0, 0x2, +0x3e,0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca,0xa9,0xd0,0xca,0xd2,0xcd,0xbe, +0xa0,0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9,0xc0,0xc9,0x7e,0x14,0x1d,0x0, +0xb, 0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20,0x9, 0xb3,0x0, 0x3f,0xb4,0x1, +0xc, 0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54,0xf0,0xf5,0xe5,0x22,0x12,0x4b, +0xdf,0x12,0x3c,0xc2,0x12,0x69,0xb, 0x7e,0x34,0x8, 0x50,0x7a,0x37,0xf, 0xd4,0x7e, +0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x7e,0x34,0x8, 0x9a,0x7e,0x27,0xf, 0xd4,0x12, +0x6a,0xca,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xf, 0xd8,0x7e,0x34,0x3, 0x70,0x7a,0x37, +0xf, 0xda,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xf, 0xd8,0x12,0x68,0x15,0x12,0x64,0xd4, +0x12,0x5a,0x90,0x12,0x6a,0x7f,0x12,0x52,0x72,0x12,0x6e,0x93,0x74,0x1, 0x7a,0xb3, +0x11,0x96,0x22,0xca,0xf8,0x7e,0xb3,0xf, 0xd2,0xb4,0x1, 0x48,0x6c,0xff,0x80,0x3c, +0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0xb1, +0x7e,0x53,0x10,0x2b,0x12,0x35,0x61,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x86,0x7e, +0x37,0xf, 0xd6,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0xb2,0x7e,0x53,0x10,0x2c,0x12, +0x35,0x61,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x88,0xb, 0xf0,0x7e,0x73,0xd, 0x16, +0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0xca,0x69,0xca,0xf8,0x7c,0xfb,0x7e,0x24,0x0, +0x4, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24,0x56,0xa, 0x3b,0x1b,0x38,0x20, +0x6d,0x66,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38,0x60,0xb, 0xf0,0x12,0x0, 0x6e, +0x50,0x1e,0x7e,0x24,0x0, 0x5, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24,0x56, +0xa, 0x3b,0x1b,0x38,0x20,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38,0x60,0xb, 0xf0, +0x7c,0xbf,0xda,0xf8,0xda,0x69,0x22,0x7e,0x47,0x16,0x36,0x6c,0x77,0x7e,0xa0,0xff, +0x7e,0x43,0x16,0x25,0xa, 0x14,0x9, 0x51,0xf, 0x29,0xbe,0x53,0x10,0x4a,0x78,0x32, +0x7e,0x50,0x12,0xac,0x45,0x49,0x22,0x16,0x36,0xbe,0x24,0x0, 0x41,0x40,0x23,0x7e, +0x60,0x1, 0xbe,0x44,0x0, 0x19,0x40,0x18,0x7e,0x30,0x12,0xac,0x36,0x49,0x21,0x16, +0x36,0xbd,0x24,0x50,0x4, 0x7d,0x42,0x7c,0x76,0xb, 0x60,0xbe,0x60,0x4, 0x40,0xe2, +0x7c,0xa7,0x7c,0xba,0x22,0xca,0x79,0xe5,0x53,0xbe,0xb1,0x54,0x38,0x4, 0x6c,0xff, +0x80,0x3a,0xe5,0x54,0x3e,0xb0,0x3e,0xb0,0x24,0x56,0xa, 0x3b,0xb, 0x38,0x30,0x7c, +0xe7,0xbe,0xe0,0x1, 0x68,0xe, 0xbe,0xe0,0x2, 0x68,0x9, 0xbe,0xe0,0x3, 0x68,0x4, +0x4c,0xee,0x78,0x7, 0x7c,0xbe,0x12,0x63,0x6c,0x7c,0xfb,0xbe,0xe0,0x4, 0x68,0x5, +0xbe,0xe0,0x5, 0x78,0x7, 0x7c,0xbe,0x12,0x51,0xe1,0x7c,0xfb,0x7c,0xbf,0xda,0x79, +0x22,0x7e,0xa3,0xd, 0xf7,0xbe,0xa0,0x0, 0x28,0x40,0x6c,0x77,0x80,0x38,0x7e,0x50, +0x2, 0xac,0x57,0x9, 0x62,0xd, 0x18,0x9, 0x52,0xd, 0x19,0x7e,0x30,0x2, 0xac,0x36, +0x49,0x1, 0x11,0xce,0x7e,0x17,0xf, 0x4a,0xe, 0x14,0xbd,0x1, 0x48,0x13,0x7e,0x30, +0x2, 0xac,0x35,0x49,0x1, 0x11,0x9e,0x7e,0x17,0xf, 0x4c,0xe, 0x14,0xbd,0x1, 0x58, +0x3, 0x74,0x1, 0x22,0xb, 0x70,0xbc,0xa7,0x38,0xc4,0xe4,0x22,0xca,0xf8,0x7c,0xfb, +0xbe,0xf0,0x1, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xf0,0x2, 0x68,0x4, 0x4c,0xff,0x78, +0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x39,0x80,0x3, 0xe4,0x80,0x28,0x12,0x60,0x36,0x4c, +0xff,0x78,0x11,0xe4,0x7a,0xb3,0x10,0x3a,0x74,0x1e,0x7a,0xb3,0x10,0x37,0x74,0xa, +0x7a,0xb3,0x10,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12, +0x65,0x59,0x74,0x1, 0xda,0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca, +0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75,0x74,0x1, 0x7e,0x24, +0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x60,0x2, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x70, +0x2, 0x1b,0x28,0x30,0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0xc8,0xd0,0x82,0xd0,0x83, +0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b, +0x32,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba, +0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7a,0xa1,0xc3,0x75,0xc5,0x40, +0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5, +0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x3b,0xe5,0xc6,0xa, 0x2b,0x7c,0x45, +0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22,0xe4,0x7a,0xb3,0x15,0x9f,0x7a,0xb3,0x15, +0x53,0x7a,0xb3,0x15,0x9e,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0xa1,0x7e,0x34,0x15, +0x56,0x7e,0x24,0x0, 0x48,0x12,0x6e,0x21,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x48, +0xe4,0x12,0x6e,0x21,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e, +0x21,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x46,0x74,0xff,0x2, 0x6e,0x21,0xd2,0xcd, +0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e,0xb3,0x16,0xa9,0xb4,0x1, 0x15, +0x7e,0x73,0x16,0xac,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x7e,0xb3,0x16, +0xaa,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20, +0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a, +0xb3,0x16,0xa9,0x22,0x7e,0x34,0x1, 0x90,0x7a,0x37,0xd, 0xff,0x7e,0x34,0x0, 0x19, +0x7a,0x37,0xe, 0x1, 0x7e,0x34,0x0, 0x9c,0x7a,0x37,0xe, 0x3, 0x7e,0x34,0x0, 0x8, +0x7a,0x37,0xe, 0x5, 0x7e,0x34,0x0, 0x4, 0x7a,0x37,0xe, 0x7, 0x74,0x1, 0x7a,0xb3, +0xe, 0x9, 0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x7e,0x34,0x10,0x3, +0x7e,0x24,0x0, 0x28,0xe4,0x2, 0x6e,0x21,0x7c,0xab,0x6c,0x33,0x80,0x36,0xa, 0x3, +0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d,0x3, 0x7e, +0x9, 0x10,0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e,0x20,0x1e, +0x20,0x7e,0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d,0xf, 0x1b, +0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x75,0x75,0x0, 0x75,0xe4,0x3, 0x49, +0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, 0x5e,0x24, +0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5,0x75,0xe4, +0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9,0xd6,0xea, +0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1,0x22,0xca,0xf8,0x7e,0x24,0xe, 0xd, +0x7e,0x34,0xe, 0x99,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x6c,0xff,0x74,0x7, 0xac, +0xbf,0x49,0x35,0xe, 0xd, 0x12,0x4c,0xa8,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x99, +0x49,0x35,0xe, 0xf, 0x12,0x4a,0x31,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x9b,0xb, +0xf0,0xbe,0xf0,0xa, 0x40,0xd7,0xda,0xf8,0x22,0x6d,0x33,0x6c,0xaa,0x80,0x2e,0x7e, +0x30,0x2, 0xac,0x3a,0x9, 0x51,0xd, 0x18,0x9, 0x41,0xd, 0x19,0x7e,0x10,0x30,0xac, +0x15,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xf, 0xda,0xb, 0x18,0x40,0xbe, +0x44,0x0, 0x0, 0x8, 0x6, 0xbd,0x43,0x8, 0x2, 0x7d,0x34,0xb, 0xa0,0x7e,0xb3,0xd, +0xf7,0xbc,0xba,0x38,0xca,0x22,0xca,0x79,0x7d,0x41,0x7d,0x13,0x6d,0x0, 0x7e,0x34, +0x7f,0xff,0x6c,0xaa,0x80,0x1b,0x7e,0xf0,0x7, 0xac,0xfa,0x7d,0xe7,0x2d,0xe4,0x49, +0xfe,0x0, 0x2, 0xbd,0xf0,0x28,0x2, 0x7d,0xf, 0xbd,0xf3,0x50,0x2, 0x7d,0x3f,0xb, +0xa0,0x9, 0xb4,0x0, 0x46,0xbc,0xba,0x38,0xdd,0x1b,0x18,0x0, 0x1b,0x28,0x30,0xda, +0x79,0x22,0xca,0xf8,0x7e,0xb3,0x10,0x4e,0x60,0x3, 0xb4,0x1, 0x2d,0xa9,0xc6,0xea, +0x12,0x29,0x9c,0x7c,0xfb,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x68,0x15, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x54,0x21,0xbe,0xf0,0x1, 0x78,0x4, +0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0x10,0x4e,0xda,0xf8,0x22,0x7e,0xb3,0x16, +0x25,0x4, 0x7a,0xb3,0x16,0x25,0x7e,0x73,0x16,0x25,0xbe,0x70,0x4, 0x40,0x5, 0xe4, +0x7a,0xb3,0x16,0x25,0x7e,0xa3,0x16,0x25,0xbe,0xa0,0x3, 0x78,0x13,0x7e,0xb3,0x16, +0x6e,0x4, 0x7a,0xb3,0x16,0x6e,0xbe,0xb0,0x8, 0x40,0x5, 0xe4,0x7a,0xb3,0x16,0x6e, +0xa, 0x3a,0x9, 0xb3,0xf, 0x29,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d,0x21,0x7d, +0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x7d,0x7e,0xb3,0x10,0x3c,0xb4,0x1, 0x1f,0x6c, +0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d,0x26,0xb, +0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3,0xda,0x3b, +0x22,0x7e,0xb3,0x10,0x3d,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3,0x10,0x39, +0x12,0x60,0x36,0x12,0x2d,0xf4,0xe4,0x7a,0xb3,0x10,0x39,0x12,0x60,0x36,0x12,0x2d, +0xf4,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x58,0x7e,0x37,0xf, 0xd4,0x7e,0x24,0x8, 0xe4, +0x12,0x59,0x3f,0x74,0x2, 0x7a,0xb3,0x10,0x3d,0x22,0x7e,0xa3,0xf, 0x1c,0xbe,0xa0, +0x0, 0x38,0x2f,0xbe,0xa3,0xf, 0x1b,0x50,0x19,0x7e,0xb3,0xf, 0x25,0xbe,0xb3,0x12, +0x33,0x28,0x14,0x7e,0xb3,0x12,0x33,0x4, 0x7a,0xb3,0x12,0x33,0x7a,0xa3,0xf, 0x1b, +0x80,0x5, 0xe4,0x7a,0xb3,0x12,0x33,0x7e,0xb3,0xf, 0x1b,0x70,0x5, 0xe4,0x7a,0xb3, +0xf, 0x24,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12,0x54,0xaf, +0x74,0x1, 0x7a,0xb3,0x0, 0xfa,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75, +0x75,0x1, 0x75,0xe6,0x0, 0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0xc8,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0xca,0xf8,0x7d,0x1, 0x7d,0x13,0x7e,0xf3,0x10,0x4d,0xbe,0xf0,0x1, 0x78, +0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x2, 0x80,0x11,0x4c,0xff, +0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x4, 0x12, +0x5f,0x32,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0xf, 0xd3,0x6c,0xaa,0x6c,0x33,0x6d,0xff, +0x7e,0x10,0x18,0xac,0x1a,0xa, 0xe3,0x2d,0xe, 0x3e,0x4, 0x7d,0x40,0x2d,0x42,0x1b, +0x48,0xf0,0x6d,0x44,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x18,0xdf,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xd6,0x22,0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c,0x33,0x4c, +0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d,0x30,0x80, +0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe,0x30,0x3, +0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x2a,0x2d, +0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x7e,0x24,0xff,0xff, +0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x14,0x2d,0x13,0x59, +0x21,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd1,0x22,0x7c,0xab,0x7e,0x24,0xe, +0xdf,0xbe,0xa0,0xa, 0x50,0x25,0xa, 0x3a,0x7d,0x13,0x2d,0x12,0x7e,0x19,0xb0,0xb4, +0x2, 0xe, 0x74,0x1, 0x7a,0x19,0xb0,0x74,0x3, 0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x22, +0x74,0x3, 0x7a,0x19,0xb0,0x2d,0x32,0x19,0xb3,0x0, 0xa, 0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x6e,0x9d,0x53,0xb, 0xfd,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x6d,0x33,0x7a,0x37,0x11, +0xd, 0x74,0x1, 0x7a,0xb3,0x11,0xf, 0x74,0x9, 0x7a,0xb3,0x11,0x10,0x74,0xb, 0x7a, +0xb3,0x11,0x11,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x7a,0xb3,0x11,0x13,0x7a,0xb3,0x11, +0x14,0x74,0x1, 0x7a,0xb3,0x11,0x15,0x22,0x6c,0xaa,0x80,0x1f,0x7e,0x70,0x2, 0xac, +0x7a,0x49,0x23,0x16,0x6f,0x7e,0x70,0x18,0xac,0x7a,0x3e,0x34,0x2e,0x37,0xf, 0xda, +0x2e,0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc, +0xba,0x38,0xd9,0x22,0x75,0x74,0x0, 0xa9,0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28, +0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, +0x2, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, +0x5e,0x0, 0xa, 0x0, 0x96,0x1, 0x2c,0x0, 0x8, 0x0, 0x78,0x0, 0xfa,0x0, 0x7, 0x0, +0x50,0x0, 0xc8,0x0, 0x5, 0x0, 0x14,0x0, 0xa0,0x0, 0x3, 0x0, 0xa, 0x0, 0x78,0x0, +0x2, 0x0, 0x5, 0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56, +0xf5,0xf1,0x7c,0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9, +0x37,0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5, +0xcb,0x22,0xc2,0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54, +0x1e,0x54,0x3e,0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, +0x12,0x6d,0x66,0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x12,0x22,0x3c,0x12,0x3a, +0x2, 0x12,0x4d,0x5f,0x60,0x6, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x7e,0xb3,0xe, 0xb, +0x60,0x3, 0x12,0x60,0xe2,0x7e,0xb3,0xe, 0xc, 0x60,0x6, 0x12,0x55,0xc4,0x2, 0x5f, +0x89,0x22,0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0xf, 0x28,0x12, +0x6a,0x59,0xb4,0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x53,0xb, 0x8f,0x74,0x2, +0x80,0x2, 0x74,0xff,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x67, +0x1, 0x7e,0xb3,0x10,0x3d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x66,0x52,0x7e, +0xb3,0x10,0x4e,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0x7e, +0x34,0xa, 0xb1,0x7e,0x24,0x3, 0x4d,0xe4,0x12,0x6e,0x21,0x7e,0x34,0xb, 0x86,0x7e, +0x24,0x1, 0x90,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0xd, 0x6b,0x7e,0x24,0x0, 0x8c, +0x74,0xff,0x2, 0x6e,0x21,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51, +0x80,0x3, 0x7e,0x39,0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23, +0x0, 0x3b,0x7e,0x34,0x1d,0x6, 0x1b,0x38,0x20,0x22,0xe4,0x7a,0xb3,0xf, 0xd2,0x6c, +0xaa,0x6d,0x44,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x2, 0x1b,0x8, 0x40,0x6d, +0x0, 0x2d,0x13,0x1b,0x18,0x0, 0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x22,0x7e,0x34, +0x12,0x1, 0x7e,0x24,0x0, 0x1e,0xe4,0x12,0x6e,0x21,0x7e,0x34,0x12,0x1f,0x7e,0x24, +0x0, 0x14,0xe4,0x12,0x6e,0x21,0x7e,0x34,0x11,0xed,0x7e,0x24,0x0, 0x14,0xe4,0x2, +0x6e,0x21,0x12,0x0, 0x6e,0x50,0x1d,0x12,0x6e,0xee,0x7c,0xab,0x7e,0xb3,0x11,0x95, +0xbe,0xb0,0x4, 0x68,0xf, 0xbe,0xa0,0xff,0x68,0xa, 0x74,0x1, 0x7a,0xb3,0x11,0xc, +0x7a,0xa3,0x11,0x95,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb3,0x10,0x3d,0x70,0x3, 0x7e, +0xf0,0x1, 0x74,0x1, 0x12,0x3f,0x5b,0xbe,0xb0,0x1, 0x68,0x5, 0xbe,0xf0,0x1, 0x78, +0x4, 0xe4,0x12,0x3f,0x5b,0xda,0xf8,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5, +0x0, 0x75,0xe4,0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, +0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x7e,0x34,0x8, 0x9a,0x7e, +0x24,0x11,0x9e,0x7e,0x14,0x1, 0x90,0x12,0x3e,0x16,0x7e,0x34,0x9, 0x2e,0x7e,0x24, +0x11,0x4a,0x7e,0x14,0x0, 0xc8,0x12,0x3e,0x16,0x2, 0x57,0x5d,0x74,0x1, 0x12,0x6e, +0x7e,0xa9,0xc3,0xea,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x75, +0x9a,0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xe5,0x52,0xb4, +0x1, 0x18,0xe5,0x51,0x70,0x14,0x7e,0xb3,0x11,0x95,0x60,0xb, 0xe4,0x7a,0xb3,0x11, +0x95,0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x12,0x6c,0x99,0x85,0x51,0x52,0x22,0x6c,0xaa, +0x7e,0x50,0x4, 0xac,0x5a,0x49,0x12,0x16,0x89,0xbd,0x13,0x38,0x8, 0x49,0x22,0x16, +0x8b,0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe4,0x7c,0xba,0x22,0x7e, +0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0xce,0x12,0x6c,0xec, +0x7e,0x34,0x7, 0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x2e,0x75, +0x55,0x0, 0x75,0x72,0x0, 0x75,0x54,0x0, 0x12,0x6c,0x3e,0x12,0x62,0x37,0xf5,0x53, +0x12,0x62,0xd5,0xb4,0x1, 0x4, 0x75,0x55,0x1, 0x22,0x75,0x55,0x3, 0x22,0x7e,0x34, +0x0, 0x1, 0x7a,0x35,0x56,0x7e,0x34,0xa, 0x18,0x7a,0x35,0x58,0x7e,0x34,0x0, 0x2, +0x7a,0x35,0x5a,0x7e,0x34,0xa, 0x62,0x7a,0x35,0x5c,0x74,0x2, 0x22,0x0, 0x50,0x0, +0xc, 0x6, 0x4, 0x0, 0x78,0x0, 0xf, 0x6, 0x4, 0x0, 0xc8,0x0, 0x1e,0x8, 0x5, 0x1, +0x40,0x0, 0x50,0x8, 0x5, 0x1, 0xf4,0x0, 0x64,0xa, 0x6, 0xe4,0x7a,0xb3,0x16,0xae, +0x7a,0xb3,0x16,0xad,0x7e,0xb3,0x10,0xa3,0x70,0x6, 0x7e,0x73,0x11,0x10,0x80,0x4, +0x7e,0x73,0x11,0x12,0x7a,0x73,0x16,0xaf,0x22,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x2, +0x7a,0xb3,0x10,0x7b,0x74,0x4, 0x7a,0xb3,0x10,0x7c,0x7e,0x34,0x16,0x26,0x7e,0x24, +0x0, 0x48,0xe4,0x2, 0x6e,0x21,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x75,0x92,0x70, +0xd2,0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8, +0x22,0xe4,0x7a,0xb3,0xd, 0xfb,0x7e,0x34,0x11,0x9e,0x7a,0x37,0xf, 0xd6,0x12,0x40, +0x96,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x2, 0x47,0x4a,0x75,0x74,0x1, 0x7e, +0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e, +0x34,0x0, 0x1, 0x2, 0x6e,0x68,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34, +0xc9,0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0xe5, +0x51,0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0x5a,0x80,0x4, 0x7e,0x34,0x0, 0x3c,0x7a,0x37, +0xf, 0x54,0x7a,0x37,0xf, 0x56,0x22,0xca,0xf8,0x12,0x6e,0x73,0x7c,0xfb,0x12,0x0, +0x6e,0x50,0x7, 0x4c,0xff,0x78,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0xda,0xf8,0x22,0x7e, +0x34,0x0, 0x24,0x12,0x69,0xb9,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, +0x57,0x2e,0x54,0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0x7d,0x3, 0x80, +0xa, 0x7e,0x29,0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d, +0x55,0x78,0xee,0x22,0x7e,0x53,0xf, 0x47,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x9d,0x32, +0xbe,0x34,0x0, 0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4, +0x1, 0x3, 0x43,0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3, +0x16,0xa0,0xe4,0x7a,0xb3,0x16,0xa7,0x74,0xff,0x7a,0xb3,0x16,0x9f,0x22,0x75,0x75, +0x1, 0xd2,0xee,0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x6e,0x68, +0xa, 0x2b,0x19,0x72,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x44,0x1, 0x7a,0xb3,0x10,0xfe, +0x22,0x7d,0x13,0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31, +0x22,0x14,0x1, 0xa, 0x1, 0x0, 0x2, 0xfb,0x4, 0xf6,0x5, 0xec,0x6, 0xe7,0x7, 0xe2, +0x8, 0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32, +0x22,0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5, +0x22,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, +0x12,0x0, 0x42,0x12,0x57,0xdd,0x74,0x3, 0x12,0x44,0xf, 0x2, 0x24,0xd0,0x7e,0x34, +0x0, 0x21,0x12,0x69,0xb9,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x7e,0xb3,0x11,0x15, +0xb4,0x1, 0x4, 0xe4,0x2, 0x6e,0xd3,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32, +0x38,0xfa,0x22,0x12,0x63,0x21,0xb4,0x1, 0x2, 0xe4,0x22,0x74,0x1, 0x22,0xd2,0xcf, +0xa9,0xd4,0xc9,0x75,0xcc,0x0, 0xc2,0xca,0x22,0xa9,0xc0,0x93,0x75,0x9, 0x0, 0x75, +0xa, 0x0, 0x32,0x75,0x53,0x0, 0x75,0x54,0x0, 0x75,0x55,0x0, 0x22,0xa9,0x32,0x99, +0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x75,0xb, 0x0, 0x12,0x6f,0x4, 0x2, 0x5e,0x82, +0x12,0x6b,0x9c,0x12,0x6f,0xa, 0x2, 0x6e,0xa7,0xe5,0x74,0x60,0x3, 0x74,0x1, 0x22, +0xe4,0x22,0xe5,0x75,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x1, 0x2, 0x4, 0x8, 0x10, +0x20,0x40,0x80,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0xf5,0x16,0x75,0x17,0x0, 0x22,0x12,0x61,0xe3,0x2, 0x38,0x88,0x12,0x50, +0x15,0x2, 0x62,0x87,0x12,0x6f,0x16,0x2, 0x6c,0x1f,0x7e,0x34,0x1, 0x3, 0x22,0x7e, +0x34,0x5, 0xb, 0x22,0x2, 0x6c,0xb6,0x2, 0x0, 0x76,0x2, 0x6d,0x6, 0x2, 0x6e,0xdb, +0x2, 0x6e,0x9d,0xe5,0x6d,0x22,0x22,0x0, 0x1, 0x15,0xde,0x1, 0x0, 0x1, 0xa, 0xac, +0x15,0x0, 0x1, 0xa, 0xad,0x17,0x0, 0x1, 0xa, 0xae,0x4, 0x0, 0x1, 0xd, 0xfe,0x40, +0x0, 0x5, 0xf, 0x29,0x20,0x17,0x29,0x38,0x13,0x0, 0x18,0xf, 0x2e,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25,0xf, 0x63,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x18, +0xf, 0x88,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xf, 0xa0,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xf, 0xad,0x0, +0x1, 0x2, 0x3, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x17,0x16,0x15,0x14,0x13, +0xc, 0xd, 0xe, 0xf, 0x10,0x11,0x12,0x0, 0xd, 0xf, 0xc5,0x1, 0x2, 0x3, 0x4, 0x5, +0x6, 0x7, 0x8, 0x0, 0x9, 0xa, 0xb, 0xc, 0x0, 0x25,0xf, 0xdc,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x0, 0xd, 0x10,0xff,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0x0, 0x1, 0x11,0xc, 0x0, 0x0, 0x1, 0x11,0x16,0x15,0x0, 0x32,0x11,0x17, +0x0, 0x8, 0x0, 0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a, +0x1, 0xbc,0x2, 0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, +0x7, 0xf9,0x8, 0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e, +0xc, 0x83,0x0, 0x1, 0x11,0x49,0x17,0x0, 0x1, 0x11,0x94,0x2, 0x0, 0x1, 0x11,0x95, +0x0, 0x0, 0x4, 0x11,0x97,0xff,0xff,0xff,0xff,0x0, 0x2, 0x11,0x9b,0xff,0x1f,0x0, +0x1, 0x11,0x9d,0x40,0x0, 0x1, 0x11,0xe8,0x0, 0x0, 0x4, 0x11,0xe9,0x19,0x1e,0x1e, +0x1e,0x0, 0x1, 0x0, 0xff,0x0, 0x0, 0x1, 0x15,0x53,0x0, 0x0, 0x1, 0x15,0x9e,0x0, +0x0, 0x1, 0x15,0x9f,0x0, 0x0, 0x1, 0x15,0xa0,0x0, 0x0, 0x1, 0x15,0xa1,0x0, 0x0, +0x1, 0x12,0x33,0x0, 0x0, 0x1, 0x16,0xa9,0x0, 0x0, 0x1, 0x16,0xb1,0x0, 0x0, 0x1, +0x16,0xb2,0x0, 0x0, 0x1, 0x16,0xb3,0x0, 0x0, 0x1, 0x16,0xb4,0x0, 0x0, 0x1, 0x16, +0xb5,0x0, 0x0, 0x1, 0x16,0xb6,0x0, 0x0, 0x1, 0x16,0xb7,0x1, 0x0, 0x1, 0x16,0xb8, +0x1, 0x0, 0xc, 0x16,0x89,0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, +0x94,0x0, 0x6, 0x16,0x95,0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x1, 0x16,0x25,0x3, +0x0, 0x1, 0x16,0x6e,0x0, 0x0, 0x1, 0x16,0xb9,0x0, 0x0, 0x1, 0x16,0xba,0x0, 0x0, +0x1, 0x16,0xbb,0x0, 0x0, 0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x71,0x6, 0x8e,0xf9, +0x4d,0xb2,0x5, 0x3b, \ No newline at end of file diff --git a/drivers/input/touchscreen/ft5336/ft_app_ic_lens_tianma_720p.txt b/drivers/input/touchscreen/ft5336/ft_app_ic_lens_tianma_720p.txt new file mode 100644 index 0000000000000..8bee7390d71a3 --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft_app_ic_lens_tianma_720p.txt @@ -0,0 +1,1806 @@ +0x2, 0x50,0xe2,0x2, 0x68,0x6e,0xe5,0x74,0x60,0x9, 0x74,0x1, 0x12,0x6e,0x92,0x75, +0x74,0x0, 0x22,0xe4,0x12,0x6e,0x92,0x75,0x74,0x1, 0x22,0x2, 0x50,0x4c,0xe5,0x55, +0xbe,0xb0,0x1, 0x68,0xf9,0x12,0x6e,0x78,0x60,0xfb,0x22,0x2, 0x67,0x5, 0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81,0x60, +0xfb,0x22,0x22,0x2, 0x6e,0x48,0xc2,0x8e,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0x22,0x32,0x2, 0x63,0x4d,0xbe,0xb0, +0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x16,0xa2,0x22,0x22,0x2, 0x0, 0x5a,0xe5,0x52, +0x24,0xff,0x22,0x2, 0x67,0x3d,0xca,0x3b,0x7e,0xb3,0xf, 0x1b,0xf5,0x26,0x7e,0xd3, +0xf, 0x1c,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x33,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, +0xa, 0xe4,0x12,0x6d,0xe0,0x6c,0xcc,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7c,0x19, +0xa3,0x13,0xba,0x7e,0x34,0x7f,0xff,0x74,0x7, 0xac,0xbc,0x59,0x35,0x13,0xb6,0x74, +0x7, 0xac,0xbc,0x59,0x35,0x13,0xb8,0xb, 0xc0,0xbe,0xc0,0xa, 0x78,0xd9,0xe5,0x26, +0x60,0x3, 0x2, 0x0, 0xef,0x12,0x6a,0xad,0xbe,0xd0,0x0, 0x38,0x3, 0x2, 0x0, 0xdf, +0x74,0x1, 0x7a,0xb3,0xf, 0x20,0xe4,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7e, +0x34,0x13,0x6, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x2, 0x1, 0x14,0x4c, +0xdd,0x68,0x3, 0x2, 0x1, 0x14,0x75,0x25,0x0, 0x7e,0xa0,0xff,0x7e,0x71,0x25,0x74, +0x7, 0xac,0x7b,0x19,0xa3,0xe, 0x57,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xeb,0x74,0x1, +0x7a,0xb3,0xf, 0x1f,0x75,0x25,0x0, 0x2, 0x1, 0x4c,0x7e,0x51,0x25,0x74,0x7, 0xac, +0x5b,0x2e,0x24,0xe, 0xd, 0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x51,0x25,0xac,0x5b,0x2e,0x24,0xe, 0xf, 0xb, 0x28,0x30,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x5, 0x25,0xe5,0x26,0xbe,0xb1, +0x25,0x38,0xc7,0xe4,0x6c,0x77,0x7e,0x61,0x26,0x7e,0x24,0x13,0xb6,0x12,0x52,0x98, +0x7e,0x71,0x26,0x7e,0x60,0xa, 0x7e,0x24,0x13,0xb6,0x12,0x52,0x98,0x7c,0xcb,0x6c, +0xee,0x75,0x25,0x0, 0x2, 0x1, 0x92,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65,0x13, +0xba,0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x11,0xbc,0x76,0x78,0x3, 0x2, 0x1, 0x97, +0x5, 0x25,0xbe,0xc1,0x25,0x38,0xe0,0xbe,0xc1,0x25,0x68,0x3, 0x2, 0x1, 0xb8,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3c,0x2e,0x14,0x13, +0xb6,0x74,0x7, 0x12,0x48,0xc5,0xb, 0xc0,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xb2,0x7e, +0x24,0x13,0xb6,0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x4c,0xdd, +0x68,0x3, 0x2, 0x1, 0xe7,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, +0x46,0x12,0x6d,0x3c,0x2, 0x4, 0x84,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x4, 0x84, +0x6c,0xee,0x2, 0x4, 0x7b,0x75,0x25,0x0, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65, +0xe, 0x57,0x7e,0x90,0x7, 0xac,0x9e,0x9, 0x74,0xe, 0x11,0xbc,0x67,0x78,0x3, 0x2, +0x2, 0x1b,0x5, 0x25,0xe5,0x25,0xbe,0xb0,0xa, 0x40,0xdd,0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x9, 0xf5,0xe, 0x57,0x49,0x34,0xe, 0xf, 0x49,0x25,0xe, 0x55,0x12,0x6d,0xb0, +0x7d,0x63,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, 0xa4, +0x49,0x25,0xe, 0x53,0x12,0x6d,0xb0,0x7d,0x13,0x2d,0x16,0x7a,0x15,0x21,0x7c,0x1f, +0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7,0xbe,0x14,0x0, 0x40,0x28,0x3, 0x2, 0x2, 0xd9, +0x7e,0x35,0x21,0xbe,0x34,0x0, 0x20,0x38,0x3, 0x2, 0x2, 0xae,0x7e,0x70,0x3, 0xac, +0x7f,0x9, 0xb3,0x12,0x2, 0x60,0x3, 0x2, 0x2, 0x97,0x9, 0xb3,0x12,0x3, 0xbe,0xb0, +0x0, 0x38,0x3, 0x2, 0x2, 0x89,0x2, 0x2, 0xbf,0x74,0x1, 0x19,0xb3,0x12,0x2, 0x6d, +0x22,0x7a,0x25,0x21,0x2, 0x2, 0xed,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0xa, 0x40,0x3, +0x2, 0x2, 0xed,0x2e,0x34,0x12,0x3, 0x4, 0x7a,0x39,0xb0,0x2, 0x2, 0xd1,0x7e,0x70, +0x3, 0xac,0x7f,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x2, 0xcc,0x7d, +0x23,0x2e,0x24,0x12,0x3, 0x14,0x7a,0x29,0xb0,0x2, 0x2, 0xed,0xe4,0x19,0xb3,0x12, +0x2, 0x6d,0x33,0x7a,0x35,0x21,0x2, 0x2, 0xed,0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7f, +0x19,0xa3,0x12,0x3, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x2, 0x7e,0x35,0x21, +0xbe,0x34,0x0, 0x20,0x28,0x3, 0x2, 0x3, 0x2e,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49, +0x35,0xe, 0x53,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x35,0xe, 0x55,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0x6d,0x33,0x7a, +0x35,0x21,0x7e,0xa0,0x1, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x1, 0x7e,0xf5, +0x21,0x7a,0xf5,0x23,0xa, 0xef,0x2e,0xe5,0x33,0x7e,0xe9,0xb0,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x3, 0x52,0x6d,0xee,0x74,0x2, 0xac,0xbf,0x59,0xe5,0x11,0xed,0x59,0xe5, +0x12,0x1f,0x7e,0x17,0xf, 0x5d,0xbe,0x15,0x23,0x28,0x3, 0x2, 0x3, 0x68,0x7e,0x4, +0x1, 0x0, 0x7a,0x5, 0x31,0x2, 0x3, 0x8b,0x7e,0x35,0x23,0x6d,0x22,0x7c,0x56,0x7c, +0x67,0x6c,0x77,0x12,0x48,0x3e,0x7d,0xe3,0x7a,0xe5,0x31,0xbe,0xe4,0x0, 0x10,0x40, +0x3, 0x2, 0x3, 0x8b,0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x31,0x74,0x2, 0xac,0xbf,0x49, +0x45,0x12,0x1f,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x3, 0xa5,0x49,0x45,0x11,0xed,0x7a, +0x45,0x31,0x2, 0x3, 0xac,0x7e,0x45,0x31,0x59,0x45,0x11,0xed,0x59,0xf5,0x12,0x1f, +0x7e,0x35,0x31,0xbe,0x34,0x1, 0x0, 0x38,0x3, 0x2, 0x3, 0xc3,0x7e,0x34,0x1, 0x0, +0x7a,0x35,0x31,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x25,0xe, 0x53,0x12,0x6d,0xb0,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31, +0xad,0x32,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, +0xac,0x5b,0x49,0x32,0xe, 0x53,0xac,0xbe,0x49,0x15,0xe, 0xd, 0xbd,0x13,0x38,0x3, +0x2, 0x4, 0x14,0x7d,0x2, 0x2e,0x4, 0xe, 0x53,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, +0x10,0x2, 0x4, 0x1e,0x2e,0x24,0xe, 0x53,0x9e,0x35,0x21,0x1b,0x28,0x30,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49,0x25,0xe, 0x55, +0x12,0x6d,0xb0,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31,0xad,0x32,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, 0xac,0x5b,0x49,0x32,0xe, +0x55,0xac,0xbe,0x49,0x15,0xe, 0xf, 0xbd,0x13,0x38,0x3, 0x2, 0x4, 0x6f,0x7d,0x2, +0x2e,0x4, 0xe, 0x55,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, 0x10,0x2, 0x4, 0x79,0x2e, +0x24,0xe, 0x55,0x9e,0x35,0x21,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x26,0xbc,0xbe,0x28, +0x3, 0x2, 0x1, 0xf5,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x49,0x45,0xe, 0x53,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x35,0x49,0x45,0xe, 0x55,0x1e,0x44,0x1e, +0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x37,0x9, 0xf5,0xe, 0x57,0x19,0xf5,0xe, 0x11, +0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x58,0x19,0x75,0xe, 0x12,0x74,0x7, 0xac,0xbe, +0x9, 0x75,0xe, 0x59,0x19,0x75,0xe, 0x13,0x7c,0xbf,0x54,0xf, 0xbe,0xb0,0xa, 0x40, +0x3, 0x2, 0x5, 0xd7,0x7c,0xfb,0xa, 0xf, 0x7d,0x10,0x2e,0x15,0x33,0x7e,0x19,0xb0, +0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x5, 0xf4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x4, 0xf9, +0x74,0xff,0x19,0xb0,0x13,0x6, 0x2, 0x5, 0xd7,0x9, 0x90,0x13,0x6, 0xbe,0x90,0xff, +0x68,0x3, 0x2, 0x5, 0x4b,0x74,0x1, 0x19,0xb0,0x13,0x6, 0x7e,0x15,0x35,0x74,0x7, +0xac,0xbe,0x59,0x15,0xe, 0xd, 0x7e,0x15,0x37,0x74,0x7, 0xac,0xbe,0x59,0x15,0xe, +0xf, 0x6c,0xdd,0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x50,0x7, 0xac, +0x5d,0x7e,0x30,0x15,0xac,0x3f,0x2d,0x12,0x2e,0x14,0x12,0x34,0x74,0x7, 0x12,0x48, +0xc5,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xdb,0x2, 0x5, 0xd7,0xbe,0x90,0x3, 0x50,0x3, +0x2, 0x5, 0x58,0xe4,0x19,0xb0,0x13,0x6, 0x7e,0x25,0x35,0x9, 0x80,0x13,0x6, 0x7e, +0x90,0x7, 0xac,0x89,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x43,0x59,0x24,0x12,0x34,0x7e, +0x25,0x37,0x59,0x24,0x12,0x36,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x5, 0xa0,0xe4, +0x2e,0x34,0x12,0x34,0x12,0x67,0xd9,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x74, +0x1, 0x7e,0x70,0x15,0xac,0x7f,0x2e,0x34,0x12,0x34,0x12,0x67,0xd9,0x2, 0x5, 0xc2, +0x49,0x34,0x12,0x34,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0xa, 0x3f,0x9, 0x43, +0x13,0x6, 0x7e,0x50,0x7, 0xac,0x45,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x32,0x49,0x33, +0x12,0x36,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0xa, 0x3f,0x2e,0x34,0x13,0x6, +0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x7c,0x1e,0x2e,0x10,0x27,0xa5,0xe7,0x60,0x3, +0x2, 0x5, 0xf4,0x7e,0x70,0x3, 0xac,0x7e,0x2e,0x34,0x12,0x1, 0x7e,0x24,0x0, 0x3, +0xe4,0x12,0x6d,0xe0,0xb, 0xe0,0xbe,0xe0,0xa, 0x68,0x3, 0x2, 0x4, 0x86,0xe5,0x26, +0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x6, 0xe, 0x74,0x1, 0x7a,0xb3,0xf, 0x24,0xda,0x3b, +0x22,0xca,0x3b,0x7e,0xe3,0xf, 0x1b,0x4c,0xee,0x78,0x27,0x6c,0xff,0x6d,0x11,0x74, +0x2, 0xac,0xbf,0x59,0x15,0x13,0x56,0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x19, +0xa1,0x13,0x14,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x13,0x6a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xdb,0x6c,0xff,0x2, 0x7, 0xac,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xe, 0x11,0x54, +0xf, 0xf5,0x22,0xbe,0xb0,0xa, 0x40,0x3, 0x2, 0x7, 0xaa,0xe5,0x22,0xa, 0x1b,0x9, +0xb1,0xe, 0xdf,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x7, 0x85,0x75,0x21,0x0, 0x7e,0x31, +0x21,0x74,0x7, 0xac,0x3b,0x9, 0x71,0x13,0x14,0x7a,0x71,0x23,0xbe,0x71,0x22,0x68, +0x3, 0x2, 0x7, 0x77,0x49,0x21,0x13,0x12,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xf, +0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x7e,0xa1,0x21,0x74,0x7, 0xa4,0x49,0x25,0x13, +0x10,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x3, +0x2d,0x6, 0xe5,0x23,0xa, 0x1b,0x9, 0xa1,0x13,0x6a,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0x71,0x23,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x13,0x56,0x2e,0x14,0x13,0x6a,0x7c,0xba, +0x14,0x7a,0x19,0xb0,0x2, 0x7, 0xaa,0x7e,0xa1,0x23,0x74,0x2, 0xa4,0x49,0x15,0x13, +0x56,0xbe,0x14,0x0, 0x32,0x28,0x9, 0xbe,0x4, 0x0, 0x32,0x28,0x3, 0x2, 0x7, 0x71, +0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, +0x80,0x6f,0xbe,0x4, 0x0, 0x96,0x28,0x63,0xe5,0x22,0xa, 0x1b,0x9, 0xb1,0xe, 0xdf, +0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0xe, 0xdf,0x7e,0xa0,0x3, 0xe5, +0x22,0xa, 0x1b,0x19,0xa1,0xe, 0xe9,0x7e,0x71,0x21,0x74,0x7, 0xac,0x7b,0x2e,0x34, +0x13,0x10,0x7e,0x14,0x13,0xb6,0x12,0x48,0xc5,0xbe,0xe0,0x0, 0x28,0x2d,0x1b,0xe0, +0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3f,0x2e,0x14, +0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x7e,0x34,0x13,0xb6,0x7e,0x30,0x7, 0xac,0x3e, +0x2e,0x14,0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x1b,0xf0,0x7e,0xa1,0x23,0x74,0x2, +0xa4,0x59,0x5, 0x13,0x56,0x80,0x33,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0xa, 0x50,0x3, +0x2, 0x6, 0x6e,0x80,0x25,0x6d,0x11,0x7e,0xa1,0x22,0x74,0x2, 0xa4,0x59,0x15,0x13, +0x56,0x7e,0xa0,0xff,0x7e,0x31,0x22,0x74,0x7, 0xac,0x3b,0x19,0xa1,0x13,0x14,0x7e, +0xa0,0x2, 0xe5,0x22,0xa, 0x1b,0x19,0xa1,0x13,0x6a,0xb, 0xf0,0xbc,0xef,0x28,0x3, +0x2, 0x6, 0x47,0x7a,0xe3,0xf, 0x1b,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0x10,0x7e, +0x14,0x0, 0x46,0x12,0x6d,0x3c,0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d, +0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x24,0xc, 0x75,0x25,0x0, +0x75,0x26,0x17,0x75,0x27,0x0, 0x7e,0x34,0x13,0xd0,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6d,0xe0,0x6c,0x66,0x2, 0x8, 0xed,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xd, 0x18,0x7a, +0x71,0x23,0x9, 0xa5,0xd, 0x19,0x1a,0x17,0x7d,0x21,0x1b,0x25,0xb, 0x15,0x7c,0x43, +0x1a,0x1a,0x1b,0x15,0x1a,0xa, 0xb, 0x5, 0x7c,0x21,0xbe,0x50,0x0, 0x58,0x2, 0x6c, +0x55,0x7e,0x73,0x10,0x2b,0xa, 0x7, 0x1b,0x4, 0x1a,0x44,0xbd,0x40,0x8, 0x2, 0x7c, +0x41,0xbe,0x30,0x0, 0x58,0x2, 0x6c,0x33,0x7e,0x73,0x10,0x2c,0xa, 0x7, 0x1b,0x4, +0x1a,0x42,0xbd,0x40,0x8, 0x2, 0x7c,0x21,0xbe,0x51,0x24,0x58,0x3, 0x7a,0x51,0x24, +0xbe,0x41,0x25,0x8, 0x3, 0x7a,0x41,0x25,0xbe,0x31,0x26,0x58,0x3, 0x7a,0x31,0x26, +0xbe,0x21,0x27,0x8, 0x3, 0x7a,0x21,0x27,0x7c,0xf5,0x80,0x4b,0x7c,0xe3,0x80,0x41, +0x1a,0xef,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0xe, 0x2d,0xf, 0xe, 0x4, 0xe, 0x4, +0xe, 0x4, 0x7c,0x71,0x7a,0x71,0x21,0x7e,0x10,0x18,0xac,0x1f,0x7c,0xb1,0x2c,0xbe, +0x54,0x7, 0x7e,0x4, 0x0, 0x1, 0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7c,0xb1,0xf5, +0x22,0xa, 0x7, 0x2e,0x4, 0x13,0xd0,0x7e,0x9, 0xb0,0x45,0x22,0x7a,0x9, 0xb0,0xb, +0xe0,0xbc,0x2e,0x58,0xbb,0xb, 0xf0,0xbc,0x4f,0x58,0xb1,0xb, 0x60,0x7e,0x73,0xd, +0xf7,0xbc,0x76,0x28,0x3, 0x2, 0x8, 0x27,0xbe,0x70,0x0, 0x38,0x3, 0x2, 0xd, 0x43, +0x7e,0xe1,0x26,0x2, 0xd, 0x3a,0x6c,0xff,0x80,0x1f,0x1a,0x3e,0x3e,0x34,0x1a,0x2f, +0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36,0xb, 0x38,0x30,0xe, 0x34,0xe, +0x34,0x3e,0x24,0x59,0x32,0x13,0xb6,0xb, 0xf0,0x7e,0x73,0x10,0x2b,0xbc,0x7f,0x18, +0xd9,0x7e,0xf1,0x24,0x2, 0xd, 0x2f,0x1a,0x4f,0x7e,0x14,0x0, 0x18,0xad,0x14,0x1a, +0x3e,0x7d,0x51,0x2d,0x53,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7a,0xa1,0x21, +0x7e,0x50,0x18,0xac,0x5f,0x7c,0xb5,0x2c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x22,0xa, 0x2a,0x9, 0xb2,0x13,0xd0, +0x55,0x22,0x78,0x3, 0x2, 0xd, 0x2d,0xbe,0xf0,0x3, 0x58,0x3, 0x2, 0x9, 0xfe,0x7e, +0x53,0x10,0x2b,0xa, 0x25,0x1b,0x26,0xbd,0x42,0x18,0x73,0x7d,0xf4,0x3e,0xf4,0x49, +0x5f,0x13,0xba,0x49,0x2f,0x13,0xb2,0x2d,0x25,0x7d,0x52,0x3e,0x54,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x2d,0x25,0x49,0x5f,0x13,0xbc,0x49,0xef,0x13,0xb0,0x2d,0xe5,0x7d, +0x5e,0x3e,0x54,0x2d,0x5e,0x9d,0x25,0x49,0xef,0x13,0xb8,0x49,0x5f,0x13,0xb4,0x2d, +0x5e,0x7d,0xe5,0x3e,0xe4,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d, +0x5e,0x9d,0x25,0x49,0x5f,0x13,0xb6,0x7d,0x5, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x9d,0x10,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x2, 0xb, 0x55,0x4c,0xff, +0x78,0x5d,0x7d,0x24,0x3e,0x24,0x49,0x12,0x13,0xb6,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x3e,0x54,0x2d,0x50,0x7d,0x1, 0x3e,0x4, 0x2d,0x5, 0x2d,0x1, 0x49,0x12,0x13,0xb8, +0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5, 0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x9d,0x1, 0x49,0x12,0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x2d,0x50,0x9d,0x51,0x49,0x22,0x13,0xbc,0x3e,0x24,0x9d,0x52,0x2, 0xb, 0x55,0xbe, +0xf0,0x1, 0x78,0x69,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x49,0x20, +0x13,0xb6,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x25,0x9d,0x21,0x49,0x10, +0x13,0xb8,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x21,0x49,0x10, +0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10, +0x13,0xbc,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x52,0x2, 0xb, 0x55,0xbe,0xf0,0x2, +0x68,0x3, 0x2, 0xb, 0x75,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x50,0x13,0xb2,0x7d, +0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x15,0x9d,0x12,0x49,0x20,0x13,0xb6,0x7d, +0xf2,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5f,0x3e,0x24,0x3e,0x24,0x2d, +0x25,0x2d,0x21,0x49,0x50,0x13,0xb8,0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x2d,0x15,0x9d,0x21,0x49,0x50,0x13,0xba,0x7d,0x15,0x3e,0x14,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10,0x13,0xbc,0x7d,0x21,0x3e, +0x24,0x2d,0x21,0x9d,0x52,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7d,0x23,0x3e,0x24,0x7e,0x14,0x0, 0x30,0xad,0x14,0x2d,0x21,0x2d,0x26,0x1b, +0x28,0x50,0x2, 0xd, 0x11,0x7e,0xa3,0x10,0x2b,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x68, +0x3, 0x2, 0xc, 0x11,0x3e,0x44,0x49,0x24,0x13,0xb2,0x7d,0x12,0x3e,0x14,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x4, 0x13,0xb0,0x7d,0x10,0x3e,0x14,0x2d,0x10, +0x9d,0x21,0x49,0x4, 0x13,0xb4,0x7d,0x10,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x10,0x9d,0x21,0x49,0x14,0x13,0xb6,0x7d,0xf1,0x3e,0xf4,0x3e,0xf4, +0x3e,0xf4,0x3e,0xf4,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x9d,0xf, 0x3e,0x14,0x3e,0x14,0x2d,0x10,0x2d,0x12,0x49,0x4, +0x13,0xb8,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x20, +0x9d,0x12,0x49,0x4, 0x13,0xba,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x20, +0x2d,0x21,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x2, 0xd, +0x0, 0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x76,0x1a,0xf, 0x3e,0x4, 0x49,0x30,0x13, +0xb0,0x7d,0x23,0x3e,0x24,0x2d,0x23,0x49,0x10,0x13,0xb2,0x7d,0x31,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x2d,0x31,0x9d,0x32,0x49,0x20,0x13,0xb4,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x49,0x20,0x13,0xb6,0x7d,0x12,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x9d,0x21,0x2d,0x23,0x49,0x30,0x13,0xb8,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x31,0x9d,0x23,0xe, +0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e,0x80,0x71,0x7e, +0xb3,0x10,0x2b,0x14,0xbc,0xbf,0x78,0x79,0x1a,0x5f,0x3e,0x54,0x49,0x25,0x13,0xb2, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9d,0x32,0x49,0x25,0x13,0xb0,0x3e,0x24, +0x9d,0x32,0x49,0x25,0x13,0xb4,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x24,0x9d,0x32,0x49,0x15,0x13,0xb6,0x7d,0x21, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x2, 0x7d,0x21,0x3e,0x24,0x2d,0x20,0x2d,0x21, +0x2d,0x23,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e, +0x3e,0x34,0x1a,0xf, 0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d,0x31,0x2d,0x36,0x1b,0x38, +0x20,0x1a,0x1e,0x3e,0x14,0x1a,0x2f,0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x23,0x2d, +0x21,0x2d,0x26,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x25,0xbc,0xbf,0x48,0x3, 0x2, 0x9, 0x37,0xb, 0xe0,0xe5,0x27,0xbc,0xbe,0x48,0x3, +0x2, 0x9, 0x6, 0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7e,0xb3,0xd, 0xf7,0xf5,0x2c, +0x75,0x10,0x0, 0xe4,0x7a,0xb3,0x15,0x54,0x7a,0xb3,0x15,0x55,0x6d,0x22,0x7e,0x34, +0x7f,0xff,0x7e,0x67,0xf, 0xda,0x6c,0xee,0xe4,0xa, 0x1e,0x19,0xb1,0x13,0xb6,0x6c, +0xaa,0x7e,0x10,0x2, 0xac,0x1e,0x19,0xa0,0x15,0x2b,0x19,0xb0,0x15,0x2c,0xe5,0x2c, +0xbc,0xbe,0x28,0x24,0x9, 0x20,0xd, 0x18,0x7e,0x30,0x18,0xac,0x23,0x9, 0x10,0xd, +0x19,0xa, 0x1, 0x2d,0x10,0x3e,0x14,0x2d,0x16,0xb, 0x18,0x10,0xbd,0x12,0x48,0x2, +0x7d,0x21,0xbd,0x13,0x18,0x2, 0x7d,0x31,0xb, 0xe0,0xbe,0xe0,0x14,0x78,0xb9,0x2d, +0x32,0xe, 0x34,0xe5,0x2c,0xbe,0xb0,0x2, 0x50,0x3, 0x2, 0x11,0x9d,0x6c,0xee,0x7e, +0x30,0x6, 0xac,0x3e,0x7d,0x51,0x2e,0x54,0x69,0x4e,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x23,0x58,0x20,0x7d,0x51,0x2e,0x54,0x69,0x50,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0x7a,0x25,0x30,0x2e,0x14,0x69,0x52,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0x7a,0x25,0x32,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc3,0x6c,0xee,0x2, 0x11, +0x8b,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19, +0xf5,0x23,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x13,0xb6,0x70,0xa, 0xa, 0x3e, +0xb, 0x34,0xa, 0x2e,0x19,0x72,0x13,0xb6,0xe5,0x2c,0x14,0xbc,0xbe,0x78,0x3, 0x2, +0x11,0x94,0xa, 0x5e,0xb, 0x54,0xf5,0x2d,0x2, 0x11,0x7f,0x7e,0x71,0x2d,0x74,0x2, +0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a,0xa1,0x24,0x9, 0xb3,0xd, 0x19,0xf5,0x25,0xa, +0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x2a,0xe5,0x25, +0xa, 0x2b,0xe5,0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x2b,0x75, +0x3d,0x2, 0x75,0x2f,0x0, 0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b, +0x2d,0x23,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0x7a,0x25,0x34,0x7e,0x11,0x24,0x74, +0x18,0xac,0x1b,0xe5,0x25,0xa, 0x1b,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0x7a,0x25,0x36,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0xe, 0x54,0x7a,0x55,0x38,0xbe,0x25,0x34,0x8, 0x14,0x7e,0x25,0x34, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x7a,0x25, +0x38,0xe5,0x2a,0xbe,0xb0,0x1, 0x38,0x37,0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x30,0x7c, +0xbf,0x54,0x2, 0xb4,0x2, 0x29,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, 0x20,0x7e, +0x71,0x22,0x74,0x18,0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d, +0x32,0xbe,0x35,0x38,0x18,0x3, 0x2, 0x11,0x13,0x75,0x2f,0x1, 0x2, 0x11,0x13,0xe5, +0x2a,0xbe,0xb0,0x1, 0x38,0xa, 0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x3, 0x2, 0x11,0x13, +0xe5,0x2a,0xbe,0xb0,0x4, 0x40,0x3, 0x2, 0x11,0x13,0xe5,0x2b,0xbe,0xb0,0x4, 0x40, +0x3, 0x2, 0x11,0x13,0x7c,0xbf,0x54,0x1, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x11,0x13, +0x6d,0x33,0x7a,0x35,0x3a,0x75,0x3c,0x0, 0x85,0x22,0x26,0x85,0x24,0x28,0xe5,0x24, +0xbe,0xb1,0x22,0x50,0x6, 0x85,0x24,0x26,0x85,0x22,0x28,0x85,0x23,0x27,0x85,0x25, +0x29,0xe5,0x25,0xbe,0xb1,0x23,0x50,0x6, 0x85,0x25,0x27,0x85,0x23,0x29,0x75,0x40, +0x0, 0x75,0x41,0x0, 0xe5,0x28,0xbe,0xb1,0x26,0x78,0x21,0x75,0x40,0x1, 0xe5,0x26, +0x60,0x5, 0xe5,0x26,0xb4,0xc, 0x3, 0x75,0x41,0x1, 0xe5,0x26,0xbe,0xb0,0x0, 0x28, +0x2, 0x15,0x26,0xe5,0x28,0xbe,0xb0,0xc, 0x50,0x2, 0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x27,0x78,0x21,0x75,0x40,0x1, 0xe5,0x27,0x60,0x5, 0xe5,0x27,0xb4,0x17,0x3, 0x75, +0x41,0x1, 0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x27,0xe5,0x29,0xbe,0xb0,0x17, +0x50,0x2, 0x5, 0x29,0x85,0x26,0x3e,0x80,0x78,0x85,0x27,0x3f,0x80,0x6a,0xe5,0x26, +0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x28,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x27,0xbe,0xb1, +0x3f,0x68,0x7, 0xe5,0x29,0xbe,0xb1,0x3f,0x78,0x24,0x7e,0x51,0x3e,0x74,0x18,0xac, +0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0xbe,0x24, +0x0, 0x0, 0x8, 0x6, 0x2e,0x25,0x3a,0x7a,0x25,0x3a,0x5, 0x3c,0x80,0x28,0x7e,0x51, +0x3e,0x74,0x18,0xac,0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0xbe,0x25,0x32,0x8, 0xc, 0xe5,0x3d,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x3d, +0x1, 0x80,0x3, 0x75,0x3d,0x0, 0x5, 0x3f,0xe5,0x29,0xbe,0xb1,0x3f,0x50,0x8f,0x5, +0x3e,0xe5,0x28,0xbe,0xb1,0x3e,0x50,0x81,0x7e,0x51,0x28,0x74,0x18,0xac,0x5b,0xe5, +0x27,0xa, 0x4b,0x2d,0x24,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x50,0x7e,0x25,0x3a,0x9d, +0x25,0x7e,0x31,0x26,0x74,0x18,0xac,0x3b,0xe5,0x29,0xa, 0xb, 0x7d,0x51,0x2d,0x50, +0x3e,0x54,0x2d,0x56,0xb, 0x58,0x50,0x9d,0x25,0x2d,0x14,0x3e,0x14,0x2d,0x16,0xb, +0x18,0x10,0x9d,0x21,0x7e,0x31,0x28,0x74,0x18,0xac,0x3b,0x2d,0x10,0x3e,0x14,0x2d, +0x16,0xb, 0x18,0x10,0x9d,0x21,0x7a,0x25,0x3a,0x7e,0x25,0x36,0x2e,0x25,0x34,0x7a, +0x25,0x38,0xe5,0x40,0xb4,0x1, 0x11,0xe5,0x41,0x70,0xd, 0x7e,0x25,0x3a,0x9e,0x25, +0x38,0x7a,0x25,0x3a,0x15,0x3c,0x15,0x3c,0xe5,0x3c,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x3c,0x24,0xfc,0xf5,0x3c,0x7e,0x25,0x3a,0xbe,0x24,0x0, 0x0, 0x58,0x3, 0x7a,0x35, +0x3a,0x7e,0x15,0x38,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x30,0x1a,0x26,0x1a,0x24,0x12, +0x48,0x24,0xe5,0x3c,0xa, 0x1b,0x6d,0x0, 0x12,0x48,0x24,0x7f,0x21,0x7e,0x35,0x3a, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x48,0x35,0xbf,0x12,0x8, 0xa, 0xe5, +0x3d,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x2f,0x2, 0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, +0x75,0x2f,0x2, 0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x63,0xe5,0x2f,0xa, 0x3b,0x2e,0x34, +0x15,0x53,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2d,0xa, 0x3b,0x9, 0xb3,0x13, +0xb6,0x70,0xc, 0xa, 0x2e,0x9, 0x52,0x13,0xb6,0x19,0x53,0x13,0xb6,0x80,0x3e,0x75, +0x2e,0x0, 0x80,0x32,0x9, 0x33,0x13,0xb6,0xa, 0x2e,0x9, 0xa2,0x13,0xb6,0xbc,0xa3, +0x28,0x12,0xe5,0x2e,0xa, 0x2b,0x9, 0x22,0x13,0xb6,0xbc,0x2a,0x78,0x16,0x19,0x32, +0x13,0xb6,0x80,0x10,0xe5,0x2e,0xa, 0x2b,0x9, 0xb2,0x13,0xb6,0xbc,0xb3,0x78,0x4, +0x19,0xa2,0x13,0xb6,0x5, 0x2e,0xe5,0x2c,0xbe,0xb1,0x2e,0x38,0xc7,0x5, 0x2d,0xe5, +0x2c,0xbe,0xb1,0x2d,0x28,0x3, 0x2, 0xe, 0x3b,0xb, 0xe0,0xe5,0x2c,0xbc,0xbe,0x28, +0x3, 0x2, 0xe, 0x1, 0x7e,0x34,0x13,0xb6,0x12,0x39,0xc4,0xf5,0x10,0xda,0x3b,0x22, +0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55, +0x7e,0x37,0xf, 0x61,0x7a,0x35,0x3e,0x6c,0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0xe4,0x19,0xb3,0xd, 0x71,0xa, 0x5d,0x3e,0x54,0xb, 0x54,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x39,0x9, 0xb3,0xd, 0x19,0xf5,0x3a, +0xbe,0xd1,0x3a,0x28,0x3, 0x2, 0x12,0xe, 0x7e,0xb3,0x10,0x2c,0xa, 0xb, 0x1b,0x4, +0xa, 0x3d,0x9d,0x3, 0xe5,0x3a,0xa, 0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0xe, 0x7c, +0x3a,0xa, 0x4d,0xe5,0x3a,0xa, 0xb, 0x9d,0x4, 0x7c,0x51,0x2, 0x12,0x59,0xbe,0xd1, +0x3a,0x38,0x3, 0x2, 0x12,0x27,0xe5,0x3a,0xa, 0xb, 0xa, 0x3d,0x2d,0x30,0xb, 0x34, +0x7c,0x37,0x6c,0x55,0x2, 0x12,0x59,0xa, 0xfd,0xe5,0x3a,0xa, 0x4b,0x2d,0xf4,0x7e, +0xb3,0x10,0x2c,0xa, 0xb, 0x7d,0x30,0x1b,0x34,0xbd,0xf3,0x18,0x3, 0x2, 0x12,0x59, +0xbd,0x43,0x8, 0x3, 0x2, 0x12,0x59,0xa, 0x3d,0x2d,0x30,0xe5,0x3a,0xa, 0xb, 0x9d, +0x30,0x7c,0x37,0xa, 0x3d,0x9d,0x3, 0x7c,0x51,0xbe,0xd1,0x39,0x28,0x3, 0x2, 0x12, +0x83,0x7e,0xb3,0x10,0x2b,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5,0x39,0xa, +0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0x83,0x7c,0x4a,0xa, 0xd, 0xe5,0x39,0xa, 0x3b, +0x2, 0x12,0xca,0xbe,0xd1,0x39,0x38,0x3, 0x2, 0x12,0x9c,0xe5,0x39,0xa, 0xb, 0xa, +0x3d,0x2d,0x30,0xb, 0x34,0x7c,0x47,0x6c,0x22,0x2, 0x12,0xce,0xa, 0x4d,0xe5,0x39, +0xa, 0x5b,0x2d,0x45,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7d,0x3, 0x1b,0x4, 0xbd,0x40, +0x18,0x3, 0x2, 0x12,0xce,0xbd,0x50,0x8, 0x3, 0x2, 0x12,0xce,0xa, 0xd, 0x2d,0x3, +0xe5,0x39,0xa, 0x3b,0x9d,0x3, 0x7c,0x41,0xa, 0xd, 0x9d,0x30,0x7c,0x27,0x7e,0x37, +0xf, 0xda,0x7c,0xb2,0x7e,0x23,0xf, 0x53,0x7e,0x4, 0x9, 0xc8,0x12,0x5c,0x33,0x7e, +0x37,0x9, 0xc8,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xca,0x7d,0x20,0x7a,0x1d,0x28, +0x7e,0x37,0x9, 0xcc,0x7d,0x3, 0x7e,0x37,0x9, 0xce,0x7d,0x20,0x7a,0x1d,0x2c,0x7e, +0x37,0x9, 0xd0,0x7d,0x3, 0x7e,0x37,0x9, 0xd2,0x7d,0x20,0x7a,0x1d,0x30,0x7e,0x37, +0x9, 0xd4,0x7d,0x3, 0x7e,0x37,0x9, 0xd6,0x7d,0x20,0x7a,0x1d,0x34,0xa, 0x2d,0xe5, +0x39,0xa, 0x3b,0x9d,0x32,0x7c,0xc7,0x2, 0x15,0x24,0xa, 0x4d,0xe5,0x3a,0xa, 0x5b, +0x9d,0x54,0xf5,0x38,0x2, 0x15,0xd, 0xbe,0xc0,0x0, 0x58,0x3, 0x2, 0x15,0xb, 0x7e, +0x73,0x10,0x2b,0xbc,0x7c,0x18,0x3, 0x2, 0x15,0xb, 0xe5,0x38,0xbe,0xb0,0x0, 0x58, +0x3, 0x2, 0x15,0xb, 0x7e,0x73,0x10,0x2c,0xbe,0x71,0x38,0x18,0x3, 0x2, 0x15,0xb, +0xe5,0x38,0x1a,0x1b,0x3e,0x14,0x1a,0x2c,0x7e,0x34,0x0, 0x30,0xad,0x32,0x2d,0x31, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x7e,0x53,0xf, 0x53,0xa, 0x25,0x9d,0x32,0x7a, +0x35,0x3c,0xbe,0x34,0x0, 0x0, 0x18,0x3, 0x2, 0x15,0xb, 0x7e,0x35,0x3e,0xbe,0x35, +0x3c,0x28,0x3, 0x2, 0x13,0xa6,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xd, 0x71,0x7e, +0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x39,0xa, 0x2b,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x13,0xd0,0xe5,0x3a,0xa, 0x2b,0xe5,0x38, +0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x2, 0x15,0xb, +0x75,0x3b,0x0, 0x2, 0x14,0x60,0xbe,0xe1,0x3b,0x78,0x3, 0x2, 0x14,0x5e,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe, +0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0x75,0x3b,0xff,0x2, 0x14,0x6c,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe, +0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0x75,0x3b,0x0, 0x2, 0x14,0x6c,0x5, 0x3b, +0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x3b,0x8, 0x3, 0x2, 0x13,0xd6,0xe5,0x3b,0x60,0x3, +0x2, 0x14,0xc0,0x7e,0x35,0x3c,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x3c,0x7e, +0xf5,0x3c,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a, +0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34, +0x7e,0x1d,0x28,0x9f,0x17,0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30, +0xe5,0x3b,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x15,0xb, 0x7e,0xf5,0x3c,0x7d,0x3f,0x1a, +0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d, +0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34,0x7e,0x1d,0x28,0x9f,0x17, +0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30,0x5, 0x38,0xa, 0x2d,0xe5, +0x3a,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x38,0x1a,0x3b,0xbd,0x32,0x18,0x3, 0x2, +0x13,0x37,0xb, 0xc0,0xa, 0x2d,0xe5,0x39,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0x1a,0x3c, +0xbd,0x32,0x18,0x3, 0x2, 0x13,0x2a,0x74,0x6, 0x7e,0x1d,0x2c,0x2f,0x11,0x14,0x78, +0xfb,0x7a,0x1d,0x2c,0x7e,0xd, 0x28,0x7e,0x1d,0x2c,0x12,0x48,0x40,0x2e,0x34,0x0, +0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xd, 0x6b,0x74,0x6, 0x7e,0x1d,0x34,0x2f, +0x11,0x14,0x78,0xfb,0x7a,0x1d,0x34,0x7e,0x7d,0x30,0x7e,0x1d,0x34,0x7f,0x7, 0x12, +0x48,0x40,0x2e,0x34,0x0, 0x20,0x59,0x36,0xd, 0x6d,0x7e,0xb3,0xf, 0x60,0x7f,0x17, +0x70,0x3, 0x2, 0x15,0x91,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7a,0x1d,0x30,0xbe,0x18,0x0, 0x7f,0x38,0x3, 0x2, 0x15,0xa4,0x7e,0x18,0x0, +0x7f,0x7a,0x1d,0x30,0x7e,0x2d,0x30,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0x71,0x7e,0x70,0x7, 0xac,0x7f,0x19, +0xa3,0xd, 0x71,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xd, 0x71,0xbe,0x70,0xf, 0x38,0x3, +0x2, 0x15,0xdf,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xd, 0x71,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x11, +0x96,0xa5,0xbe,0x1, 0x58,0x7e,0xa3,0x10,0x2b,0xbc,0xa7,0x28,0xd, 0x7a,0x71,0xd, +0x74,0x30,0xac,0x7b,0x2e,0x37,0x16,0x9e,0x80,0x3c,0x7a,0x71,0xd, 0xbc,0xa7,0x78, +0x6, 0x7e,0x34,0x8, 0x9a,0x80,0x2f,0xa, 0x2a,0x7d,0x2, 0xb, 0x4, 0xa, 0x17,0xbd, +0x10,0x78,0x6, 0x7e,0x34,0x8, 0xca,0x80,0x1d,0x7d,0x2, 0xb, 0x5, 0xbd,0x10,0x78, +0x6, 0x7e,0x34,0x9, 0x2e,0x80,0xf, 0x2e,0x24,0x0, 0x3, 0xbd,0x12,0x68,0x3, 0x2, +0x19,0x6a,0x7e,0x34,0x9, 0x5e,0x7a,0x37,0x16,0x4f,0x2, 0x19,0x6a,0xa5,0xbe,0x0, +0x46,0x7e,0x64,0x0, 0xb, 0x7a,0x69,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf,0x1, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, +0x74,0x1, 0x7e,0x70,0x1, 0x80,0x36,0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3, +0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x21,0x74,0x27,0x7e,0x70, +0x3, 0x12,0x6d,0x9f,0x2, 0x19,0x6a,0xa5,0xbe,0x2, 0x23,0xa5,0xbf,0x4, 0x7, 0x74, +0x1, 0x7e,0x70,0x4, 0x80,0x7, 0xa5,0xbf,0x5, 0x9, 0xe4,0x6c,0x77,0x12,0x0, 0x5e, +0x2, 0x19,0x6a,0xbe,0x70,0x1, 0x50,0x3, 0x2, 0x19,0x6a,0x2, 0x19,0x6a,0xa5,0xbe, +0x3, 0x15,0xbe,0x70,0xd, 0x28,0x9, 0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x2, 0x19,0x6a, +0x7a,0x73,0x10,0x2b,0x2, 0x19,0x6a,0xa5,0xbe,0x4, 0x15,0xbe,0x70,0x18,0x28,0x9, +0x74,0x18,0x7a,0xb3,0x10,0x2c,0x2, 0x19,0x6a,0x7a,0x73,0x10,0x2c,0x2, 0x19,0x6a, +0xa5,0xbe,0x5, 0x7, 0x7a,0x73,0x10,0x2d,0x2, 0x19,0x6a,0xa5,0xbe,0x7, 0x1e,0x7a, +0x73,0x10,0x4b,0x7c,0xb7,0x54,0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0x10, +0x54,0x5e,0x70,0x3, 0x4d,0x32,0x7a,0x37,0x10,0x54,0x2, 0x19,0x6a,0xa5,0xbe,0x8, +0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xac,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x16,0x2, 0x19,0x6a,0xa5,0xbe,0x9, 0x1c,0xbe,0x70,0xa, 0x50,0x3, 0x7e,0x70, +0xa, 0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xad,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x49,0x2, 0x19,0x6a,0xa5,0xbe,0xa, 0x10,0xa5,0xbf,0x0, 0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x10,0x3b,0x2, 0x19,0x6a,0xa5,0xbe,0xb, 0x14,0x7e,0xb3,0x10, +0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xae,0x2, 0x19,0x6a,0x7a,0x73,0x11,0x94,0x2, 0x19, +0x6a,0xa5,0xbe,0xc, 0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xd, 0xfe,0x2, +0x19,0x6a,0x7a,0x73,0x11,0x9d,0x2, 0x19,0x6a,0xa5,0xbe,0x4c,0x7, 0x7a,0x73,0xf, +0x46,0x2, 0x19,0x6a,0xa5,0xbe,0xfb,0x29,0x7a,0x71,0x8, 0x7e,0x37,0x10,0x50,0x5e, +0x70,0xdf,0x7a,0x37,0x10,0x50,0xe5,0x8, 0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x4e,0x37,0x10,0x50,0x7a,0x37,0x10,0x50,0x2, 0x19, +0x6a,0xa5,0xbe,0x4e,0x7, 0x7a,0x73,0x10,0x4a,0x2, 0x19,0x6a,0xa5,0xbe,0x4f,0x6, +0x12,0x0, 0x6, 0x2, 0x19,0x6a,0xbe,0x60,0x50,0x40,0x12,0xbe,0x60,0x51,0x38,0xd, +0xa, 0x26,0x2e,0x27,0x10,0x2f,0x9e,0x24,0x0, 0x50,0x2, 0x19,0x54,0xbe,0x60,0x52, +0x40,0x12,0xbe,0x60,0x55,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x31,0x9e,0x24,0x0, +0x52,0x2, 0x19,0x54,0xbe,0x60,0x56,0x40,0x12,0xbe,0x60,0x62,0x38,0xd, 0xa, 0x26, +0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x56,0x2, 0x19,0x54,0xbe,0x60,0x63,0x40,0x12, +0xbe,0x60,0x7a,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x63,0x2, +0x19,0x54,0xbe,0x60,0x7b,0x50,0x3, 0x2, 0x18,0xe8,0xbe,0x60,0x9f,0x28,0x3, 0x2, +0x18,0xe8,0x7e,0xb3,0x10,0x3b,0x70,0x48,0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24, +0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29, +0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f,0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17, +0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29, +0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, 0x2f,0x19,0x72,0xf, 0xdc,0x2, 0x19,0x6a, +0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27, +0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29,0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f, +0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17,0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27, +0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29,0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, +0x2f,0x19,0x72,0xf, 0x63,0x2, 0x19,0x6a,0xbe,0x60,0xa0,0x40,0x11,0xbe,0x60,0xac, +0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6c,0x9e,0x24,0x0, 0xa0,0x80,0x56,0xbe,0x60, +0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6e,0x9e,0x24, +0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38,0xc, 0xa, 0x26, +0x2e,0x27,0x10,0x70,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2,0x40,0x11,0xbe, +0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x72,0x9e,0x24,0x0, 0xd2,0x80,0x14, +0xbe,0x60,0xd6,0x40,0x14,0xbe,0x60,0xed,0x38,0xf, 0xa, 0x26,0x2e,0x27,0x10,0x74, +0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x80,0x11,0xa5,0xbe,0xf8,0x6, 0x7a,0x73,0x11, +0xe8,0x80,0x7, 0xa5,0xbe,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x3b,0x22,0xca,0x3b,0xe4, +0x7a,0xb3,0x13,0xde,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x23,0x6c,0xee,0x7e,0xa0,0xff, +0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0xff,0xa, 0x3e,0x19,0xb3,0x13, +0xca,0x7e,0x34,0xff,0xff,0x74,0x2, 0xac,0xbe,0x59,0x35,0x13,0xb6,0xe4,0xa, 0x3e, +0x19,0xb3,0x13,0xd4,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xd2,0x7e,0xb3,0xf, 0x1b,0x60, +0x3, 0x2, 0x19,0xe5,0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0x2, 0x1b,0xfc,0x6c,0xee,0x7e, +0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, +0x78,0xdd,0x2, 0x1b,0xfc,0x7e,0xb3,0xf, 0x1c,0x60,0x3, 0x2, 0x1a,0x38,0x6c,0xee, +0x2, 0x1a,0x2d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5e, +0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19, +0xe5,0xe, 0x11,0x74,0x1, 0xa, 0x3e,0x19,0xb3,0x13,0xd4,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0xbe,0x2, 0x1b,0xfc,0x6c,0xee,0x2, 0x1a,0x9e,0x6c,0xff,0x7e, +0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23,0x49,0x23,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x49, +0x35,0xe, 0xf, 0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x7e,0x70,0x2, 0xac,0x7f,0x2e, +0x35,0x23,0x49,0x23,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x9d,0x32, +0x12,0x6d,0xd0,0x2d,0x36,0x7a,0x35,0x21,0x74,0x2, 0xac,0xbe,0x49,0x45,0x13,0xb6, +0xbe,0x45,0x21,0x38,0x3, 0x2, 0x1a,0x95,0xa, 0x4e,0x19,0xf4,0x13,0xca,0x7e,0x35, +0x21,0x59,0x35,0x13,0xb6,0xb, 0xf0,0xbe,0xf0,0xa, 0x78,0xa3,0xb, 0xe0,0x7e,0x73, +0xf, 0x1b,0xbc,0x7e,0x38,0x97,0x6c,0xee,0x2, 0x1b,0x52,0x74,0x1, 0x7a,0xb3,0x13, +0xde,0x6c,0xff,0x2, 0x1a,0xf1,0xbc,0xfe,0x78,0x3, 0x2, 0x1a,0xef,0xa, 0x3f,0x9, +0x63,0x13,0xca,0xa, 0x2e,0x9, 0x72,0x13,0xca,0xbc,0x76,0x68,0x3, 0x2, 0x1a,0xef, +0x74,0x2, 0xac,0xbf,0x49,0x25,0x13,0xb6,0x74,0x2, 0xac,0xbe,0x49,0x35,0x13,0xb6, +0xbd,0x32,0x50,0x3, 0x2, 0x1a,0xef,0xe4,0x7a,0xb3,0x13,0xde,0x2, 0x1a,0xf9,0xb, +0xf0,0x7e,0x73,0xf, 0x1b,0xbc,0x7f,0x38,0xbd,0x7e,0xb3,0x13,0xde,0xb4,0x1, 0x2, +0x80,0x3, 0x2, 0x1b,0x50,0x74,0x1, 0xa, 0x3e,0x9, 0xa3,0x13,0xca,0xa, 0x4a,0x19, +0xb4,0x13,0xd4,0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0x7, 0xac,0xbe, +0x49,0x35,0xe, 0xd, 0xa, 0x2e,0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e, +0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0xa, 0x2e, +0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28, +0xb, 0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, 0x1a,0xab,0x6c,0xee,0x2, +0x1b,0xc1,0x74,0x7, 0xac,0xbe,0x9, 0xb5,0xe, 0x11,0xb4,0xff,0x2, 0x80,0x3, 0x2, +0x1b,0xbf,0x6c,0xff,0xa, 0x3f,0x9, 0xb3,0x13,0xd4,0x60,0x3, 0x2, 0x1b,0xb8,0x74, +0x1, 0x19,0xb3,0x13,0xd4,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, +0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, +0xf, 0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac, +0xbe,0x19,0xf5,0xe, 0x11,0x2, 0x1b,0xbf,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xb5,0xb, +0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x38,0x99,0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13, +0xd4,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x1b,0xf5,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, +0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xcf,0x7e,0xf3,0xf, 0x1b, +0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13,0xd4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x4e, +0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c, +0x27,0x74,0x3, 0x19,0xb3,0x0, 0xa, 0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xa3,0x0, 0xa, +0xbe,0xa0,0x3, 0x68,0x3, 0x2, 0x1c,0x3f,0xe4,0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0x4c, +0xaa,0x68,0x3, 0x2, 0x1c,0x7c,0x74,0x2, 0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0xa, 0x3e, +0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xbe,0xb0,0x2, 0x78,0x3, 0x2, 0x1c,0x64,0x60, +0x3, 0x2, 0x1c,0x77,0x74,0x1, 0x7a,0x39,0xb0,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4, +0x19,0xe5,0xe, 0x11,0x2, 0x1c,0x7c,0x74,0x3, 0x7a,0x39,0xb0,0xa, 0x2e,0x2e,0x25, +0x23,0x7e,0x29,0x70,0x19,0x72,0x0, 0xa, 0xb, 0xe0,0xbe,0xe0,0xa, 0x50,0x3, 0x2, +0x1c,0x2, 0xda,0x3b,0x22,0xca,0x3b,0x75,0x24,0x0, 0x75,0x26,0x0, 0x75,0x27,0x0, +0x75,0x28,0x0, 0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x2a,0x7e,0xa3,0xf, 0x24,0x4c,0xaa, +0x78,0xf, 0x7e,0xb3,0xf, 0x20,0x70,0x9, 0x7e,0xb3,0xf, 0x21,0x70,0x3, 0x2, 0x1f, +0x54,0x4c,0xaa,0x78,0x11,0x7e,0xb3,0xf, 0x20,0x60,0x16,0x80,0x9, 0x7e,0x73,0x0, +0xff,0xbe,0x70,0xf, 0x38,0x6, 0x7e,0xb3,0x0, 0x8b,0x60,0xf1,0xe4,0x7a,0xb3,0x0, +0x8b,0x20,0x0, 0x6, 0x7e,0x74,0x15,0xca,0x80,0x4, 0x7e,0x74,0x16,0xc, 0x7d,0x37, +0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0,0x74,0xaa,0x7a,0x79,0xb0,0x19,0xb7, +0x0, 0x1, 0x7e,0x73,0xf, 0x1d,0x19,0x77,0x0, 0x3, 0x75,0x25,0x0, 0x6c,0xdd,0x2, +0x1e,0xe1,0x7e,0x70,0x7, 0xac,0x7d,0x9, 0xa3,0xe, 0x9d,0x7a,0xa1,0x29,0x7c,0xba, +0x54,0xf, 0xa, 0x2b,0x2e,0x25,0x2a,0x7e,0x29,0xc0,0x7c,0xba,0x54,0xf0,0xbe,0xb0, +0x0, 0x28,0x13,0xb4,0xb0,0x2, 0x80,0x3, 0x2, 0x1e,0xdf,0x53,0x29,0xf, 0xbe,0xc0, +0x1, 0x68,0x3, 0x2, 0x1e,0xdf,0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x1e,0xdf,0x7e,0xa1, +0x25,0x74,0x6, 0xa4,0xf5,0x21,0x9, 0xb3,0xe, 0x9e,0xf5,0x27,0x74,0x7, 0xac,0xbd, +0x9, 0xb5,0xe, 0x9f,0xc4,0x54,0xf0,0xf5,0x28,0x7e,0x73,0xf, 0x46,0xbe,0x71,0x29, +0x28,0x68,0x7e,0xb3,0xf, 0x22,0x70,0x2a,0x7e,0x8, 0x0, 0x27,0xe5,0x29,0xa, 0x3b, +0x2e,0x34,0x0, 0x77,0x74,0x1, 0x7e,0x50,0xf, 0x12,0x5f,0x76,0x7e,0x8, 0x0, 0x28, +0xe5,0x29,0xa, 0x3b,0x2e,0x34,0x0, 0x81,0x74,0x10,0x7e,0x50,0x20,0x12,0x5f,0x76, +0x80,0x14,0xe5,0x29,0xa, 0x3b,0x9, 0xb3,0x0, 0x77,0xf5,0x27,0xe5,0x29,0xa, 0x3b, +0x9, 0xb3,0x0, 0x81,0xf5,0x28,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x2e,0x25,0x2a,0x7e, +0x29,0xb0,0xb4,0x1, 0x15,0xe4,0x19,0xb3,0x0, 0x77,0x6c,0xaa,0xe5,0x29,0xa, 0x3b, +0x19,0xa3,0x0, 0x81,0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0xf, 0x5f,0xb4,0xff, +0x15,0x74,0x7, 0xac,0xbd,0x9, 0xb5,0xe, 0x9d,0xbe,0xb0,0xff,0x68,0x5, 0x75,0x27, +0x1, 0x80,0x3, 0x75,0x27,0x0, 0x7e,0x90,0x7, 0xac,0x9d,0x49,0x54,0xe, 0x99,0x7a, +0x55,0x2c,0x49,0x54,0xe, 0x9b,0x7a,0x55,0x2e,0xbe,0xc0,0x1, 0x78,0x2e,0x75,0x30, +0x0, 0x7e,0x71,0x30,0x74,0x7, 0xac,0x7b,0x9, 0xb3,0x0, 0x90,0x54,0xf, 0xbe,0xb1, +0x29,0x78,0x10,0x49,0x23,0x0, 0x8c,0x7a,0x25,0x2c,0x49,0x53,0x0, 0x8e,0x7a,0x55, +0x2e,0x80,0x9, 0x5, 0x30,0xe5,0x30,0xbe,0xb0,0xa, 0x40,0xd5,0x7e,0x25,0x2c,0x7a, +0x25,0x22,0xa, 0x54,0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x21,0xa, 0x3b,0x7d,0x13, +0x2d,0x17,0x19,0xa1,0x0, 0x5, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x6, 0x7e,0x25, +0x2e,0x7a,0x25,0x22,0xa, 0x14,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x57,0x19,0x35, +0x0, 0x7, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x8, 0xe5,0x27,0x7d,0x23,0x2d,0x27, +0x19,0xb2,0x0, 0x9, 0xe5,0x28,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0xa, 0x9, 0xa4, +0xe, 0x9d,0x7c,0xba,0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x27,0x2e,0x24,0x0, +0x7, 0x7e,0x29,0xb0,0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x21,0xbe,0xc0, +0x1, 0x68,0x2, 0x5, 0x24,0x5, 0x26,0x7c,0xbc,0x3, 0x3, 0x54,0xc0,0x7d,0x13,0x2d, +0x17,0x2e,0x14,0x0, 0x5, 0x7e,0x19,0x50,0x2c,0x5b,0x7a,0x19,0x50,0x80,0xe, 0x2d, +0x37,0x2e,0x34,0x0, 0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x25,0xb, +0xd0,0x7e,0x73,0xf, 0x46,0xbc,0x7d,0x28,0x3, 0x2, 0x1d,0x12,0xe5,0x24,0x19,0xb7, +0x0, 0x4, 0xe5,0x26,0xbe,0xb0,0x0, 0x28,0x2d,0x74,0x42,0x19,0xb7,0x0, 0x2, 0xe4, +0x19,0xb7,0x0, 0x41,0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e, +0x24,0x0, 0x41,0x7e,0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x41, +0x78,0xe4,0xb2,0x0, 0x80,0xe, 0x7e,0xb3,0xf, 0x21,0xb4,0x1, 0xc, 0x7e,0xb3,0x10, +0xd1,0xb4,0x24,0x5, 0x74,0x1, 0x12,0x6e,0x92,0x7e,0xb3,0xf, 0x20,0x60,0x6, 0x7e, +0x35,0x2a,0x12,0x68,0xb, 0xe4,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x20,0x7a,0xb3, +0xf, 0x21,0x80,0x4, 0xe4,0x12,0x6e,0x92,0x7e,0x24,0xe, 0x99,0x7e,0x34,0x0, 0x8c, +0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0xe5,0x26,0x70,0xd, 0x7e,0x34,0x0, 0x8c,0x7e, +0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0xda,0x3b,0x22,0xca,0x79,0x75,0x26,0x17, +0x7e,0xb3,0xd, 0xf7,0xf5,0x21,0x70,0x3, 0x2, 0x22,0x1d,0x7e,0x34,0x13,0xb6,0x7e, +0x24,0x1, 0x2b,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x14,0xe1,0x7e,0x24,0x0, 0x2, 0xe4, +0x12,0x6d,0xe0,0x6c,0xaa,0x2, 0x20,0x32,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, +0x18,0x9, 0x23,0xd, 0x19,0x1a,0x3, 0x1b,0x5, 0x80,0x69,0xbe,0x10,0x0, 0x48,0x62, +0xbe,0x10,0xd, 0x58,0x5d,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25, +0x7c,0xb1,0x54,0x7, 0x7e,0x74,0x0, 0x1, 0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x7c, +0xef,0xa, 0x40,0x2e,0x44,0x14,0xe1,0x7e,0x49,0xb0,0x4c,0xbe,0x7a,0x49,0xb0,0x1a, +0x32,0x1b,0x35,0x7c,0xf7,0x80,0x1f,0xbe,0xf0,0x0, 0x48,0x18,0xe5,0x26,0xbc,0xbf, +0x8, 0x12,0x74,0x1, 0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0x4f,0x2d,0x43, +0x19,0xb4,0x13,0xb6,0xb, 0xf0,0x1a,0x22,0x2e,0x24,0x0, 0x3, 0x1a,0x3f,0xbd,0x32, +0x48,0xd5,0xb, 0x10,0x1a,0x23,0x2e,0x24,0x0, 0x3, 0x1a,0x31,0xbd,0x32,0x48,0x8b, +0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x1f,0xa8,0x6c,0x11,0x7c,0x1, 0xe, +0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, 0x7e,0x44,0x0, 0x1, +0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa, 0x30,0x9, 0xb3,0x14,0xe1,0x5c, +0xbe,0x78,0x3, 0x2, 0x20,0xf9,0x6d,0x33,0x7a,0x35,0x22,0x75,0x24,0x0, 0x1a,0x21, +0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x43,0x2e,0x47,0xf, 0xda,0x6c,0x0, 0x80,0x26, +0x1a,0xe1,0x7e,0xf4,0x0, 0x17,0xad,0xfe,0xa, 0x30,0x2d,0x3f,0x9, 0xb3,0x13,0xb6, +0x70,0x12,0x7e,0x70,0x2, 0xac,0x70,0x2d,0x34,0xb, 0x38,0x30,0x2e,0x35,0x22,0x7a, +0x35,0x22,0x5, 0x24,0xb, 0x0, 0xe5,0x26,0xbc,0xb0,0x38,0xd4,0xe5,0x24,0x60,0x49, +0xe5,0x24,0x1a,0x2b,0x7e,0x35,0x22,0x12,0x47,0xf2,0x7a,0x35,0x22,0x6c,0xff,0x80, +0x32,0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0xff,0x7d,0xe3,0x2d,0xef,0x9, +0xbe,0x13,0xb6,0xb4,0x1, 0x1b,0x1a,0x21,0x7e,0x34,0x0, 0x18,0xad,0x32,0x7d,0x23, +0x2d,0x2f,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x9e,0x35,0x22,0x1b,0x28, +0x30,0xb, 0xf0,0xe5,0x26,0xbc,0xbf,0x18,0xc8,0xb, 0x10,0xa5,0xb9,0xd, 0x2, 0x80, +0x3, 0x2, 0x20,0x3d,0x6c,0xaa,0x2, 0x22,0x14,0x7e,0x10,0x2, 0xac,0x1a,0x9, 0x30, +0xd, 0x18,0x9, 0x20,0xd, 0x19,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xf5,0x25,0x7c,0xba, +0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa5, +0xbb,0x0, 0x2c,0x1a,0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e, +0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x20,0x49,0x33,0x0, 0x30,0xbd,0x32,0x18,0x3, +0x2, 0x21,0xd9,0x1a,0x33,0xb, 0x34,0x7c,0xb7,0x19,0xb0,0xd, 0x18,0x80,0x7a,0xa5, +0xbb,0xc, 0x2c,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x22,0x2d,0x23,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x49,0x2, 0xff,0xd0,0xbd,0x3, 0x8, 0x59, +0x1a,0x33,0x1b,0x34,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x70,0xd, 0x18,0x80,0x4a,0x1a, +0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, +0xda,0x49,0x43,0x0, 0x30,0x49,0x3, 0xff,0xd0,0xbd,0x4, 0x8, 0x16,0xb, 0x38,0x20, +0xbd,0x2, 0x8, 0x25,0x1a,0x23,0x1b,0x24,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x50,0xd, +0x18,0x80,0x16,0xb, 0x38,0x0, 0xbd,0x40,0x8, 0xf, 0x1a,0x33,0xb, 0x34,0x7c,0x37, +0x7e,0x10,0x2, 0xac,0x1a,0x19,0x30,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33, +0xd, 0x18,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x2, 0x2d,0x3, 0x3e,0x4, +0x2e,0x7, 0xf, 0xda,0xb, 0x8, 0x0, 0xbe,0x4, 0x0, 0x3c,0x58,0x15,0x7c,0x7e,0x6e, +0x70,0xff,0xe5,0x25,0xa, 0x4b,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x5c,0xb7,0x7a, +0x49,0xb0,0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x21,0x9, 0xda,0x79,0x22, +0xca,0xd8,0xca,0x79,0x6c,0xaa,0x7e,0x34,0x11,0x9e,0x7e,0x44,0x11,0x4a,0xe4,0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfe,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, +0x17,0xbe,0xb0,0x0, 0x28,0x4f,0x7e,0x53,0xd, 0xf8,0xbe,0x50,0x0, 0x28,0x46,0x6c, +0xff,0x80,0x3c,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x40,0x9, 0xe1,0xd, 0x41, +0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x13,0xb, 0x18,0x0, 0x6d,0x11,0x9e,0x17,0xf, 0x4c, +0xbd,0x1, 0x58,0x19,0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x13,0x49,0x1, 0x0, 0x30,0x6d, +0x11,0x9e,0x17,0xf, 0x4a,0xbd,0x1, 0x58,0x4, 0x5, 0x6b,0x80,0xb, 0xb, 0xf0,0xbc, +0x5f,0x38,0xc0,0x80,0x3, 0x75,0x6b,0x0, 0xe5,0x6b,0xbe,0xb0,0x3, 0x40,0x17,0x7e, +0xb3,0xe, 0xa, 0x44,0x1, 0x7a,0xb3,0xe, 0xa, 0x75,0x6b,0x0, 0x7e,0xb3,0x16,0xbc, +0x44,0x1, 0x7a,0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfd,0x7a,0xb3,0xe, 0xa, +0x7e,0xb3,0xd, 0x16,0x70,0x59,0x7e,0x53,0xd, 0xf7,0xbe,0x50,0x0, 0x28,0x50,0x6c, +0xff,0x80,0x48,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x18,0x9, 0xe1,0xd, 0x19, +0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x14,0x49,0x11,0x0, 0x30,0x6d,0x0, 0x9e,0x7, 0xd, +0xff,0xbd,0x10,0x48,0xe, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x14,0xb, 0x18,0x10,0xbd, +0x10,0x58,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x2, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16, +0xbc,0x44,0x2, 0x7a,0xb3,0x16,0xbc,0x80,0x6, 0xb, 0xf0,0xbc,0x5f,0x38,0xb4,0x7e, +0xb3,0xe, 0x9, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x23,0xc3,0x7e,0xb3,0xd, 0x16,0x70, +0x6d,0x6c,0xff,0x80,0x61,0x7e,0x50,0x2, 0xac,0x5f,0x7d,0x12,0x2d,0x14,0xb, 0x18, +0x10,0xbe,0x17,0xd, 0xff,0x8, 0x4d,0x2d,0x23,0xb, 0x28,0x20,0xbe,0x27,0xd, 0xff, +0x58,0x42,0xbe,0xf1,0x6c,0x68,0x6, 0x7a,0xf1,0x6c,0x75,0x6d,0x0, 0xbe,0xf1,0x6c, +0x78,0x2, 0x5, 0x6d,0xe5,0x6d,0xbe,0xb0,0x10,0x28,0x33,0x75,0x6d,0x10,0xe5,0x51, +0x70,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x4, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x4, 0x7a,0xb3,0x16,0xbc,0x80,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3, +0xe, 0xa, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0x97,0x6c,0xaa, +0x6c,0xff,0x80,0x17,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x34,0xb, 0x38,0x30,0xbe,0x37, +0xd, 0xff,0x8, 0x5, 0x7e,0xa0,0x1, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc, +0xbf,0x38,0xe1,0x4c,0xaa,0x78,0x1a,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, +0xa, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0xb3,0x16,0xbc,0x54,0xfb,0x7a,0xb3,0x16, +0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xf7,0x7a,0xb3,0xe, 0xa, 0x7e,0x73,0xd, 0xfa,0xa, +0x27,0x7e,0x73,0xd, 0xf9,0xa, 0x37,0x2d,0x32,0xbe,0x37,0xe, 0x3, 0x28,0x14,0x7e, +0xb3,0xe, 0xa, 0x44,0x8, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc,0x44,0x8, 0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x44,0x10,0x7a,0xb3,0xe, 0xa, 0x6c,0xff,0x80, +0x49,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70, +0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30, +0x49,0x22,0x10,0x3, 0x9d,0x32,0x7a,0x35,0x21,0x12,0x6d,0xd0,0xbe,0x37,0xe, 0x1, +0x28,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xef,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x10,0x7a,0xb3,0x16,0xbc,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f, +0x38,0xaf,0x7e,0x34,0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x12,0x6d,0xe0,0x6c,0xff, +0x80,0x25,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e, +0x70,0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x30,0x59,0x32,0x10,0x3, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xd3,0xda, +0x79,0xda,0xd8,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x21,0x75,0x25,0x0, 0x75,0x26, +0x0, 0x7e,0x23,0xd, 0xf7,0x7a,0x21,0x23,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x13,0xb6, +0x7e,0x30,0x2, 0xac,0x23,0x7e,0x24,0xd, 0x18,0x7e,0x34,0x13,0xb8,0x12,0x6d,0x3c, +0xe5,0x23,0xbe,0xb0,0xa, 0x38,0x3, 0x2, 0x26,0xb9,0x75,0x24,0x0, 0x6c,0xff,0x2, +0x25,0xcd,0x7e,0x34,0x3, 0xff,0x7a,0x35,0x27,0x75,0x26,0xff,0x6c,0xee,0x80,0x7e, +0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x13,0xb8,0xbe,0xb0,0xff,0x68,0x6e,0x7c,0xbe, +0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7a,0xa1,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x2c,0xa, 0x2a,0x9, 0xb2, +0xd, 0x68,0x55,0x2c,0x68,0x46,0x9, 0x73,0x13,0xb9,0xa, 0x27,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0x15,0xa3,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x74,0x2, 0xac, +0xbe,0x9, 0x75,0x13,0xb8,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa2,0xa, +0x37,0x9d,0x32,0x12,0x6d,0xd0,0x2d,0x36,0x7a,0x35,0x29,0x7e,0x35,0x27,0xbe,0x35, +0x29,0x28,0x9, 0x7e,0x35,0x29,0x7a,0x35,0x27,0x7a,0xe1,0x26,0xb, 0xe0,0xe5,0x23, +0xbc,0xbe,0x28,0x3, 0x2, 0x25,0x0, 0xe5,0x26,0xbe,0xb0,0xff,0x68,0x3d,0x7e,0x71, +0x26,0x74,0x2, 0xac,0x7b,0x9, 0x33,0x13,0xb8,0x7e,0x50,0x18,0xac,0x53,0x9, 0xa3, +0x13,0xb9,0xa, 0xa, 0x2d,0x20,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28,0x20,0xbe, +0x24,0x0, 0x3c,0x48,0x16,0xe5,0x24,0x1a,0x2b,0x3e,0x24,0x19,0x32,0x13,0xe0,0x19, +0xa2,0x13,0xe1,0x74,0xff,0x19,0xb3,0x13,0xb8,0x5, 0x24,0xb, 0xf0,0xe5,0x11,0xbc, +0xbf,0x28,0x3, 0x2, 0x24,0xf2,0x7e,0xf1,0x24,0x2, 0x26,0x9f,0x6d,0x33,0x7a,0x35, +0x21,0x7e,0xa0,0xff,0x6c,0xee,0x2, 0x26,0x71,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c, +0x7b,0x7a,0x71,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0xb9,0xf5,0x2c,0xa, 0x37,0x9, 0xb3,0xd, 0x68,0x55,0x2c,0x68, +0x5e,0x7e,0x90,0x2, 0xac,0x9e,0x9, 0x44,0x13,0xb8,0xbe,0x40,0xff,0x68,0x50,0x7e, +0x50,0x18,0xac,0x45,0x9, 0xb4,0x13,0xb9,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27, +0x13,0xb6,0xb, 0x28,0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30, +0x7e,0x50,0x2, 0xac,0x5e,0x9, 0x62,0x13,0xb8,0x7e,0x30,0x18,0xac,0x36,0x9, 0x72, +0x13,0xb9,0xa, 0x7, 0x2d,0x10,0x3e,0x14,0x2e,0x17,0x13,0xb6,0xb, 0x18,0x40,0xbe, +0x45,0x21,0x8, 0xb, 0x7a,0x61,0x25,0x7a,0x71,0x26,0x7a,0x45,0x21,0x7c,0xae,0xb, +0xe0,0xe5,0x23,0xbc,0xbe,0x28,0x3, 0x2, 0x25,0xe9,0xbe,0xa0,0xff,0x68,0x1e,0x7e, +0x71,0x25,0x7e,0x90,0x2, 0xac,0x9f,0x19,0x74,0x13,0xe0,0xe5,0x26,0x19,0xb4,0x13, +0xe1,0x7e,0x70,0xff,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x13,0xb8,0xb, 0xf0,0xbe, +0xf0,0xa, 0x50,0x3, 0x2, 0x25,0xdc,0x7e,0x24,0x13,0xe0,0x7e,0x34,0x13,0xb8,0x7e, +0x14,0x0, 0x28,0x12,0x6d,0x3c,0x75,0x23,0xa, 0x7e,0x34,0x15,0xa2,0x7e,0x24,0x0, +0x14,0x74,0xff,0x12,0x6d,0xe0,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0x55,0x7e,0x31,0x23, +0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x3c,0x7e, +0x31,0x23,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0x15,0xa2,0x12,0x6d, +0x3c,0x6c,0xff,0x80,0x27,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7c,0x67,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24, +0xd, 0x68,0x7e,0x29,0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xf0,0xe5,0x23,0xbc,0xbf, +0x38,0xd3,0x85,0x23,0x11,0xe5,0x23,0x7a,0xb3,0xd, 0xf7,0xda,0x3b,0x22,0x7c,0x7b, +0xbe,0x70,0x10,0x40,0x12,0xbe,0x70,0x4b,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x16,0x4f, +0x9e,0x34,0x0, 0x10,0x2, 0x29,0x69,0xa5,0xbf,0x0, 0x3, 0xe5,0xb, 0x22,0xa5,0xbf, +0x1, 0x3, 0xe5,0xd, 0x22,0xa5,0xbf,0x2, 0x5, 0x7e,0xb3,0xf, 0x28,0x22,0xbe,0x70, +0x3, 0x40,0x12,0xbe,0x70,0x5, 0x38,0xd, 0xa, 0x37,0x2e,0x34,0x10,0x2b,0x9e,0x34, +0x0, 0x3, 0x2, 0x29,0x69,0xa5,0xbf,0x6, 0x3, 0x74,0x1, 0x22,0xa5,0xbf,0x7, 0x5, +0x7e,0xb3,0x10,0x4b,0x22,0xa5,0xbf,0x8, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e, +0xb3,0xa, 0xac,0x22,0x7e,0xb3,0x11,0x16,0x22,0xa5,0xbf,0x9, 0x10,0x7e,0xb3,0x10, +0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xad,0x22,0x7e,0xb3,0x11,0x49,0x22,0xa5,0xbf,0xa, +0x5, 0x7e,0xb3,0x10,0x3b,0x22,0xa5,0xbf,0xb, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, +0x7e,0xb3,0xa, 0xae,0x22,0x7e,0xb3,0x11,0x94,0x22,0xa5,0xbf,0xc, 0x10,0x7e,0xb3, +0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xd, 0xfe,0x22,0x7e,0xb3,0x11,0x9d,0x22,0xa5,0xbf, +0x4c,0x5, 0x7e,0xb3,0xf, 0x46,0x22,0xa5,0xbf,0xfb,0x3, 0xe5,0x8, 0x22,0xa5,0xbf, +0x4e,0x5, 0x7e,0xb3,0x10,0x4a,0x22,0xbe,0x70,0x50,0x40,0x12,0xbe,0x70,0x51,0x38, +0xd, 0xa, 0x37,0x2e,0x37,0x10,0x2f,0x9e,0x34,0x0, 0x50,0x2, 0x29,0x69,0xbe,0x70, +0x52,0x40,0x12,0xbe,0x70,0x55,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x31,0x9e,0x34, +0x0, 0x52,0x2, 0x29,0x69,0xbe,0x70,0x56,0x40,0x12,0xbe,0x70,0x62,0x38,0xd, 0xa, +0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x56,0x2, 0x29,0x69,0xbe,0x70,0x63,0x40, +0x12,0xbe,0x70,0x7a,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x63, +0x2, 0x29,0x69,0xbe,0x70,0x7b,0x50,0x3, 0x2, 0x28,0xfd,0xbe,0x70,0x9f,0x28,0x3, +0x2, 0x28,0xfd,0x7e,0xb3,0x10,0x3b,0x70,0x4a,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe, +0x24,0x0, 0x18,0x58,0x22,0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e, +0x39,0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c, +0xab,0x80,0x19,0x1e,0xa0,0x80,0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, +0x93,0x7e,0x39,0x70,0xa, 0x57,0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3, +0xf, 0xdc,0x22,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x22,0xa, +0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba,0x30,0xe0, +0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e,0xa0,0x80, +0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70,0xa, 0x57, +0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0x63,0x22,0xbe,0x70,0xa0, +0x40,0x11,0xbe,0x70,0xac,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6c,0x9e,0x34,0x0, +0xa0,0x80,0x56,0xbe,0x70,0xad,0x40,0x11,0xbe,0x70,0xb9,0x38,0xc, 0xa, 0x37,0x2e, +0x37,0x10,0x6e,0x9e,0x34,0x0, 0xad,0x80,0x40,0xbe,0x70,0xba,0x40,0x11,0xbe,0x70, +0xd1,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x70,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe, +0x70,0xd2,0x40,0x11,0xbe,0x70,0xd5,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x72,0x9e, +0x34,0x0, 0xd2,0x80,0x14,0xbe,0x70,0xd6,0x40,0x13,0xbe,0x70,0xed,0x38,0xe, 0xa, +0x37,0x2e,0x37,0x10,0x74,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xa5,0xbf,0xf8, +0x5, 0x7e,0xb3,0x11,0xe8,0x22,0xa5,0xbf,0xfe,0x3, 0xe5,0xc, 0x22,0x74,0xff,0x22, +0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20,0x0, 0x41,0x0, 0x42,0x0, 0x22, +0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40,0x0, 0xa3,0x0, 0xa5,0x0, 0x44, +0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60,0x0, 0xe5,0x0, 0xe8,0x0, 0x66, +0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80,0x1, 0x47,0x1, 0x4b,0x0, 0x88, +0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0,0x1, 0x89,0x1, 0xad,0x0, 0xaa, +0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xaa, +0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0,0x1, 0x69,0x1, 0x6c,0x0, 0x88, +0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80,0x1, 0x27,0x1, 0x9, 0x0, 0x66, +0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60,0x0, 0xc5,0x0, 0xc6,0x0, 0x44, +0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40,0x0, 0x83,0x0, 0x64,0x0, 0x22, +0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20,0x0, 0x21,0x0, 0x21,0x0, 0x0, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0xca,0x3b,0x7e,0x34,0x13,0xff,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6d,0xe0,0x7e,0xe0, +0x1, 0x7e,0x73,0x10,0x4d,0x7a,0x73,0x13,0xb6,0xe4,0x7a,0xb3,0x10,0x4d,0x6c,0xdd, +0x6c,0xcc,0x80,0x11,0xa, 0x3c,0x2e,0x37,0x10,0x6e,0x7e,0x39,0x70,0xbc,0x7d,0x40, +0x2, 0x7c,0xd7,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc,0x7c,0x38,0xe7,0xbe,0xd0,0x1f, +0x50,0xc, 0xa, 0x2d,0x7e,0x34,0x0, 0x1f,0x9d,0x32,0x7c,0xd7,0x80,0x2, 0x6c,0xdd, +0x7a,0xd1,0x21,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10,0x2b,0x12,0x6a, +0x64,0x2, 0x2d,0x7d,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37, +0xa, 0xaf,0x12,0x6e,0xcf,0x12,0x69,0x23,0x12,0x6e,0x78,0x60,0xfb,0xa9,0xb7,0xea, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x6c, +0xcc,0x80,0x78,0x6c,0xff,0x80,0x6a,0x4c,0xcc,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3, +0x13,0xe7,0x6d,0x33,0x74,0x2, 0xac,0xbf,0x59,0x35,0x13,0xb7,0xbe,0xf0,0x17,0x78, +0x13,0x7e,0x34,0x0, 0x1, 0x7c,0xbc,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x5e,0x34, +0x4, 0x44,0x68,0x3b,0x7e,0x50,0x30,0xac,0x5c,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x32, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, +0x14,0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xa, 0x3f,0x2e,0x34,0x13,0xe7,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xb, +0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0x8e,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc, +0x7c,0x38,0x80,0x75,0x22,0x0, 0x6c,0xcc,0x2, 0x2d,0x5b,0xa, 0x3c,0x9, 0xa3,0x13, +0xe7,0x4c,0xaa,0x78,0xf, 0x7e,0x44,0x22,0xc4,0x7e,0x70,0x2, 0xac,0x7c,0x59,0x43, +0x13,0xb7,0x80,0x25,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x12,0x13,0xb7,0xa, 0xa, 0x8d, +0x10,0x59,0x12,0x13,0xb7,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x32, +0x13,0xb7,0xbe,0x34,0x1f,0xa4,0x50,0x22,0xa, 0x1c,0x2e,0x14,0x13,0xff,0x7e,0x19, +0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1c,0x2e,0x17,0x10,0x74,0x7e,0x19,0xb0,0xbc,0xbd, +0x50,0x2f,0x4, 0x7a,0x19,0xb0,0x80,0x31,0x80,0x27,0xbe,0x34,0x25,0xe4,0x28,0x27, +0xa, 0x3c,0x2e,0x34,0x13,0xff,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xa, 0x3c,0x2e, +0x37,0x10,0x74,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14,0x7a,0x39,0xb0,0x80, +0x8, 0x5, 0x22,0x6c,0xee,0x80,0x2, 0x5, 0x22,0xb, 0xc0,0x7e,0x73,0x10,0x2c,0xbc, +0x7c,0x28,0x3, 0x2, 0x2c,0xbb,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10, +0x2b,0x12,0x6a,0x64,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x22,0x68,0xf, 0x7e,0xa1,0x21, +0x7c,0xba,0x14,0xf5,0x21,0x4c,0xaa,0x68,0x3, 0x2, 0x2c,0x4, 0x7e,0x73,0x13,0xb6, +0x7a,0x73,0x10,0x4d,0x6c,0xff,0x80,0x10,0xa, 0x3f,0x9, 0x73,0x13,0xff,0xbc,0x7d, +0x78,0x4, 0x6c,0xee,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0xe8, +0x7c,0xbe,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xb3,0x10,0x3c,0xf5,0x21,0xe4,0x7a,0xb3, +0x10,0x3c,0x7e,0xb3,0x10,0x3a,0xf5,0x22,0x74,0x3, 0x7a,0xb3,0x10,0x3a,0x7e,0x37, +0x10,0x48,0x7e,0x24,0x0, 0x25,0xe4,0x12,0x6d,0xe0,0x7e,0xe0,0x7, 0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x6c,0xdd, +0x7e,0x14,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0xa, 0x2d,0x2e, +0x27,0x10,0x48,0x7e,0x29,0x70,0x4c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25, +0x78,0xde,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab, +0x12,0x6e,0x81,0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xd0,0x6c, +0xdd,0xbe,0xd0,0x18,0x50,0x1e,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c, +0xbf,0x30,0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x16, +0x1e,0xf0,0x80,0x12,0xa, 0x3d,0x2e,0x37,0x10,0x33,0x9, 0x73,0xff,0xe8,0xa, 0x37, +0x2e,0x34,0x0, 0x18,0x7c,0xf7,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0xb, +0x38,0x30,0xbe,0x34,0x25,0x80,0x18,0x21,0x7e,0x34,0x0, 0x1, 0x7c,0xbe,0x60,0x5, +0x3e,0x34,0x14,0x78,0xfb,0x7d,0x13,0x6e,0x14,0xff,0xff,0xa, 0x2f,0x2e,0x27,0x10, +0x48,0x7e,0x29,0x70,0x5c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78,0x91, +0x1b,0xe0,0xbe,0xe0,0x0, 0x48,0x3, 0x2, 0x2d,0xdd,0x7e,0xe0,0xa, 0x74,0x2, 0x7a, +0xb3,0x10,0x3a,0x2, 0x2f,0xac,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac, +0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10, +0x2c,0xa, 0x65,0x2d,0x63,0x7c,0xcd,0x6c,0xdd,0x2, 0x2f,0x74,0x7e,0xa3,0x10,0x2c, +0xbc,0xad,0x28,0x27,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf,0x30, +0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x2, 0x1e,0xf0, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x80,0x27,0xa, 0x2a,0xa, 0x3d,0x9d, +0x32,0x2e,0x37,0x10,0x33,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34,0x0, 0x18,0x7c,0xf7, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xa4, +0x9d,0x35,0xb, 0x38,0x30,0x7a,0x35,0x23,0xbe,0x34,0x2e,0xe0,0x8, 0x18,0x4c,0xee, +0x68,0x30,0xa, 0x2f,0x2e,0x27,0x10,0x48,0x7e,0x29,0xb0,0xbe,0xb0,0xfe,0x50,0x22, +0x4, 0x7a,0x29,0xb0,0x80,0x1c,0xbe,0x34,0x17,0x70,0x58,0x14,0xa, 0x3f,0x2e,0x37, +0x10,0x48,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x7a,0x39,0xb0,0x80,0x2, +0x1b,0xc0,0xb, 0xd0,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c,0xa, 0x25, +0x2d,0x23,0xa, 0x3d,0xbd,0x32,0x58,0x3, 0x2, 0x2e,0xdc,0x4c,0xcc,0x68,0x28,0x7e, +0x34,0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81, +0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xd0,0x7c,0xae,0x1b,0xe0, +0x4c,0xaa,0x68,0x3, 0x2, 0x2e,0xb6,0xe5,0x21,0x7a,0xb3,0x10,0x3c,0xe5,0x22,0x7a, +0xb3,0x10,0x3a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x24,0x15,0x56,0x7e,0x34, +0x13,0xfe,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13, +0xb6,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x13,0xfc, +0x7e,0x73,0xf, 0x1c,0x7a,0x73,0x13,0xfd,0x7e,0xa3,0x13,0xfc,0xbe,0xa0,0x1, 0x38, +0x3, 0x7e,0xf0,0x1, 0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0xe4,0x80,0x10,0x7e,0xb3,0x15, +0xa1,0x4, 0x7a,0xb3,0x15,0xa1,0xbe,0xb0,0xc8,0x28,0x6, 0x74,0x14,0x7a,0xb3,0x15, +0xa1,0x7e,0xb3,0x15,0xa1,0xbe,0xb0,0x6, 0x50,0x3, 0x7e,0xf0,0x1, 0xbe,0xa0,0x1, +0x28,0x3f,0x7e,0x34,0x0, 0x21,0x7e,0x24,0x0, 0x23,0x7e,0x14,0x13,0xfe,0x12,0x65, +0xa8,0x7e,0x34,0x0, 0x25,0x7e,0x24,0x0, 0x27,0x7e,0x14,0x13,0xb6,0x12,0x65,0xa8, +0x7e,0x35,0x25,0x9e,0x35,0x21,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x80,0x18,0xf, 0x7e, +0x35,0x27,0x9e,0x35,0x23,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x80,0x8, 0x3, 0x7e,0xf0, +0x1, 0xbe,0xf0,0x0, 0x28,0x3, 0x2, 0x31,0x24,0x7e,0xf3,0x15,0x9f,0xbe,0xf3,0x15, +0x29,0x50,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73,0x13,0xfc,0x28,0x12,0x7e,0x24,0x15, +0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x2, 0x31,0x24,0x7e, +0x73,0x15,0x9e,0xbe,0x70,0x2, 0x58,0x22,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3, +0x15,0x53,0x7e,0xb3,0x15,0x9e,0x4, 0x2, 0x31,0x60,0x74,0x1, 0x7a,0xb3,0x15,0xa0, +0xe4,0x7a,0xb3,0x15,0x53,0x2, 0x31,0x60,0xbe,0xf3,0x15,0x29,0x78,0x2d,0x7e,0xa3, +0x15,0x29,0xbe,0xa3,0x13,0xfc,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a, +0xb3,0x15,0x53,0x80,0x6b,0xbe,0xa3,0x13,0xfc,0x28,0x4, 0x74,0x1, 0x80,0x1, 0xe4, +0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0x80,0x55,0x7e,0x73,0x15,0x29,0xbe, +0x73,0x13,0xfc,0x50,0x1a,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, +0x48,0x12,0x6d,0x3c,0xe4,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0x53,0x80,0x31,0x7e, +0x73,0x15,0x53,0xbe,0x70,0x2, 0x58,0x1c,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0x7e,0xb3,0x15, +0x53,0x4, 0x80,0x7, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0xe4, +0x7a,0xb3,0x15,0x9e,0x7e,0xb3,0x15,0xa0,0x14,0x68,0x9, 0x4, 0x78,0x15,0x7e,0x24, +0x13,0xb6,0x80,0x4, 0x7e,0x24,0x14,0xe3,0x7e,0x34,0x15,0x56,0x7e,0x14,0x0, 0x48, +0x12,0x6d,0x3c,0x7e,0x73,0x15,0x29,0x7a,0x73,0x15,0x9f,0x7e,0x24,0x13,0xb6,0x7e, +0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x7e,0x24,0x15,0x56,0x7e,0x34, +0xe, 0xd, 0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x7e,0x73,0x15,0x9c,0x7a,0x73,0xf, +0x1b,0x7e,0x73,0x15,0x9d,0x7a,0x73,0xf, 0x1c,0xda,0xf8,0x22,0xca,0x79,0x7d,0x73, +0x12,0x60,0xce,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27, +0x0, 0x27,0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c, +0xe, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49, +0x27,0x0, 0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34, +0x1c,0x14,0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c, +0x67,0x6c,0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38, +0x10,0x9, 0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, +0x25,0x4d,0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27, +0x7e,0x34,0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20, +0x6c,0xaa,0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e, +0x34,0x1c,0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, +0x4b,0x2d,0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe, +0xa0,0x19,0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e, +0x70,0x2, 0xac,0x7a,0x2e,0x34,0x29,0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e, +0x24,0x1c,0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x2b, +0x7e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x2b, +0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, +0xa0,0xbe,0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x5d,0xbd,0x49,0x27,0x0, 0x39,0x7e, +0x34,0x1c,0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33, +0x7e,0x34,0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, +0xb7,0x0, 0x1, 0x12,0x64,0x6a,0x49,0x37,0x0, 0x47,0x12,0x7, 0xc9,0x49,0x37,0x0, +0x49,0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x5c,0x97,0x49,0x27,0x0, 0x35, +0x7e,0x34,0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b, +0x38,0x20,0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22, +0xca,0x3b,0x6d,0x33,0x7a,0x35,0x23,0x7e,0xb3,0xf, 0x1b,0x60,0x6, 0x7e,0xb3,0xf, +0x1c,0x60,0x11,0xe5,0x22,0x60,0x5, 0x75,0x19,0x1, 0x80,0x3, 0x75,0x19,0x0, 0xe5, +0x19,0x2, 0x35,0x1f,0x7e,0xb3,0xd, 0x18,0xf5,0x21,0x7e,0x73,0xd, 0x19,0x7a,0x71, +0x22,0x6d,0x66,0x75,0x25,0x0, 0x75,0x26,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x3a,0x7e, +0x51,0x21,0x74,0x18,0xac,0x5b,0x2d,0x27,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28, +0x10,0xbe,0x14,0x0, 0x32,0x8, 0x28,0x5, 0x25,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0x8, +0x49,0x12,0xff,0xd0,0x2d,0x61,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, 0x50,0x8, 0x49, +0x22,0x0, 0x30,0x2d,0x62,0x5, 0x26,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc0,0x7d, +0x73,0x80,0x38,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0x2d,0x37,0x3e,0x34,0x2e,0x37, +0xf, 0xda,0xb, 0x38,0x20,0xbe,0x24,0x0, 0x32,0x8, 0x2c,0x5, 0x25,0xe5,0x21,0xbe, +0xb0,0x0, 0x28,0x8, 0x49,0x23,0xff,0xd0,0x2d,0x62,0x5, 0x26,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x8, 0x49,0x33,0x0, 0x30,0x2d,0x63,0x5, 0x26,0x7d,0x37,0xb, 0x34,0x7d, +0x73,0xbe,0x34,0x0, 0x18,0x48,0xbc,0xe5,0x25,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12, +0x7d,0x36,0x12,0x6d,0xd0,0xe5,0x26,0xa, 0x2b,0x12,0x47,0xf2,0xbe,0x34,0x0, 0xf, +0x8, 0x8, 0x75,0x19,0x1, 0x74,0x1, 0x2, 0x35,0x1f,0x6d,0x33,0xe5,0x21,0xbe,0xb0, +0x0, 0x28,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0xff,0xd0,0x2d,0x32,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0x0, 0x30,0x2d,0x32,0x7e,0xa0,0x8, 0x80, +0x2d,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2e,0x14,0x6d,0xc0,0x7a,0x31,0x82,0x7a, +0x21,0x83,0xe4,0x93,0x1a,0x1b,0xbd,0x13,0x8, 0x14,0x2e,0x24,0x6d,0xc1,0x7a,0x51, +0x82,0x7a,0x41,0x83,0xe4,0x93,0x1a,0x2b,0x2e,0x25,0x23,0x7a,0x25,0x23,0x7c,0x5a, +0x1b,0xa0,0xa5,0xbd,0x0, 0xcb,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0xe5,0x22,0xa, +0x2b,0x2d,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x12,0x6d,0xd0,0xbe, +0x34,0x3, 0xe8,0x8, 0xa, 0x7e,0x35,0x23,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x23,0x7e, +0x35,0x23,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x23,0xe5, +0x19,0xa, 0x3b,0xbe,0x35,0x23,0x50,0x5, 0x7e,0x55,0x23,0xf5,0x19,0xe5,0x19,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x9b,0x7d,0xa3,0xbe,0x90,0x1, 0x28,0x1e,0xa, 0x15,0x1b, +0x15,0xa, 0x39,0xbd,0x31,0x58,0x14,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b, +0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x80,0x7, 0xbe,0x90,0x1, 0x78,0x15, +0x6d,0xbb,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d, +0x53,0x7d,0xc3,0x80,0x8, 0x4c,0x99,0x78,0x38,0x6d,0xcc,0x7d,0xbc,0x74,0x2, 0xac, +0xb9,0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x7e,0x70,0x2, +0xac,0x79,0x2d,0x3a,0x49,0x33,0x0, 0x2, 0x12,0x6d,0x53,0x7d,0xe3,0x74,0x2, 0xac, +0xb9,0x7d,0xf5,0x2d,0xfa,0x49,0x3f,0x0, 0x4, 0x12,0x6d,0x53,0x7d,0xf3,0x2, 0x36, +0x2d,0x7c,0xb5,0x24,0xfe,0xbc,0xb9,0x78,0x46,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d, +0xba,0x1b,0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79, +0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x53,0x7d,0xc3,0x74,0x2, 0xac,0xb9, +0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x74,0x2, 0xac,0xb9, +0x2d,0xa5,0x49,0x3a,0x0, 0x2, 0x12,0x6d,0x53,0x7d,0xe3,0x6d,0xff,0x80,0x3e,0x7c, +0xb5,0x14,0xbc,0xb9,0x78,0x37,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6, +0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b, +0x35,0xb, 0x38,0x30,0x12,0x6d,0x53,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d,0xd5,0x2d, +0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x6d,0xff,0x7d,0xef,0xa, 0x79,0x6d, +0x66,0x7f,0x3, 0x1b,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x7f,0x41, +0x7f,0x3, 0x1b,0xd, 0x7d,0x3b,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0x7d, +0x3d,0x1a,0x26,0x1a,0x24,0xa, 0x19,0x6d,0x0, 0x12,0x48,0x24,0x2f,0x41,0xa, 0x19, +0x6d,0x0, 0xb, 0xc, 0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0xa, +0x19,0x6d,0x0, 0xb, 0xd, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x14, +0x7d,0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x5b,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1d, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x7d,0x5e,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1f, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x48,0x40, +0x2e,0x34,0x0, 0x20,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xf, 0x1b,0x7e,0x64,0xe, +0xdf,0xe5,0x51,0xb4,0x1, 0x21,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x1a,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0x13,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0xa, 0x74,0x1e,0x7a, +0xb3,0xf, 0x26,0x74,0x14,0x80,0x8, 0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a, +0xb3,0xf, 0x27,0x4c,0xff,0x78,0xd, 0x75,0x1a,0x0, 0x7e,0xb3,0xf, 0x26,0x12,0x6e, +0xa1,0x2, 0x38,0x47,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14, +0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, +0x74,0x1, 0x80,0x1, 0xe4,0xb4,0x1, 0x9, 0xe5,0x1a,0x70,0x5, 0x75,0x17,0x1e,0xf5, +0x18,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80, +0x1, 0xe4,0xf5,0x1a,0x6c,0xee,0x7e,0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xe, 0x9d,0xf5, +0x21,0xbe,0xb0,0xff,0x78,0x3, 0x2, 0x38,0x3d,0xe5,0x21,0xa, 0x2b,0x2d,0x26,0x7e, +0x29,0xb0,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x38,0x3d,0x49,0x33,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x74,0x12,0x6d,0xb0,0x7a,0x35,0x22,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0x9b,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x76, +0x12,0x6d,0xb0,0x7a,0x35,0x24,0xe5,0x17,0xa, 0x3b,0xbe,0x35,0x22,0x28,0x56,0xbe, +0x35,0x24,0x28,0x51,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x74,0x74,0x7, +0xac,0xbe,0x59,0x35,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x76, +0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0x9b,0xe5,0x21,0xa, 0x3b,0x2d,0x36,0x7e,0x39, +0xb0,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, 0x28,0x2, 0x1b,0xf0,0x4c,0xff,0x78,0x4e,0x5, +0x18,0x7e,0x73,0xf, 0x27,0xbe,0x71,0x17,0x28,0x43,0xe5,0x18,0xbe,0xb0,0x32,0x40, +0x3c,0x5, 0x17,0x80,0x35,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x59,0x35,0x13,0x74,0x49,0x34,0xe, 0x9b,0x59,0x35,0x13,0x76, +0x7e,0x73,0xf, 0x26,0xbe,0x71,0x17,0x78,0x8, 0x7e,0xb3,0xf, 0x27,0xf5,0x17,0x80, +0x9, 0xe5,0x17,0xbe,0xb0,0x1, 0x28,0x2, 0x15,0x17,0x75,0x18,0x0, 0xb, 0xe0,0xbe, +0xe0,0xa, 0x68,0x3, 0x2, 0x37,0x56,0xda,0x3b,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3, +0x10,0x2b,0xf5,0x24,0x7e,0xe3,0x10,0x2c,0x1b,0xe0,0x6c,0xdd,0x7e,0x70,0x30,0xac, +0x7d,0x2e,0x37,0xf, 0xda,0x49,0x33,0x0, 0x2e,0x74,0x2, 0xac,0xbd,0x59,0x35,0x13, +0xb6,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0x7e,0xb3,0xf, 0xd3,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x39,0xc1,0x6c,0xcc,0x2, 0x39,0xb2,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3, +0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19,0xf5,0x23,0x75,0x21,0x3, 0x7e,0x73,0xe, +0x12,0xbe,0x70,0x20,0x50,0xa, 0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x3, 0x75,0x21,0x1, +0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, 0x75,0x21,0x2, 0x74,0x8, 0x7a,0xb3,0xf, 0x53, +0xe5,0x22,0xbe,0xb0,0x0, 0x28,0x21,0xe5,0x24,0xa, 0x2b,0x1b,0x24,0xe5,0x22,0xa, +0x3b,0xbd,0x32,0x58,0x13,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x23,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x21,0x2, 0x75,0x25,0x0, 0x80,0x45, +0xe5,0x25,0xbc,0xbc,0x68,0x3d,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xd, +0x18,0x7a,0xa1,0x26,0x9, 0xb3,0xd, 0x19,0xf5,0x27,0xa, 0x2a,0xe5,0x22,0xa, 0x3b, +0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x3, 0x18,0x18,0xe5,0x27,0xa, 0x2b,0xe5, +0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x21, +0x1, 0x80,0xb, 0x5, 0x25,0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x25,0x38,0xb2,0xe5,0x51, +0xb4,0x1, 0x20,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x19,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, +0x12,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x9, 0x75,0x21,0x3, 0x74,0x1e,0x7a, +0xb3,0xf, 0x53,0xe5,0x23,0xbe,0xb0,0x17,0x50,0x1a,0x6c,0xdd,0x6d,0x33,0x7e,0x50, +0x30,0xac,0x5d,0x2e,0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, +0x78,0xec,0x80,0x3, 0x75,0x21,0x0, 0xe5,0x21,0x7c,0x7c,0x7c,0x6f,0x12,0x11,0xa0, +0x6c,0xdd,0x74,0x2, 0xac,0xbd,0x49,0x35,0x13,0xb6,0x7e,0x50,0x30,0xac,0x5d,0x2e, +0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0xb, 0xf0, +0xb, 0xc0,0x7e,0x73,0xd, 0xf7,0xbc,0x7c,0x28,0x3, 0x2, 0x38,0x89,0x7a,0xf3,0xd, +0xf7,0xda,0x3b,0x22,0xca,0x3b,0x7d,0x73,0x7e,0xb3,0xd, 0xf7,0xf5,0x4c,0x7e,0x37, +0xf, 0xda,0x7a,0x35,0x4f,0x75,0x42,0x0, 0x7e,0xc0,0x1, 0x80,0x19,0xe5,0x42,0xa, +0x3b,0x2d,0x37,0x7e,0x39,0x60,0xa, 0x2c,0x2d,0x27,0x7e,0x29,0x70,0xbc,0x76,0x40, +0x3, 0x7a,0xc1,0x42,0xb, 0xc0,0xe5,0x4c,0xbc,0xbc,0x38,0xe1,0xe5,0x42,0xa, 0x3b, +0x2d,0x37,0x7e,0x39,0xb0,0xf5,0x42,0x75,0x44,0x0, 0x7e,0xc0,0x1, 0x2, 0x3b,0xe, +0x75,0x4b,0x0, 0x6d,0x33,0x7a,0x35,0x4d,0x6c,0xdd,0x75,0x45,0x0, 0x75,0x46,0x0, +0x75,0x43,0x0, 0x2, 0x3a,0xc3,0x7e,0x71,0x43,0x74,0x2, 0xac,0x7b,0x9, 0xb3,0xd, +0x18,0xf5,0x47,0x9, 0xb3,0xd, 0x19,0xf5,0x48,0xe5,0x43,0xa, 0x3b,0x2d,0x37,0x7e, +0x39,0x70,0xbc,0x7c,0x78,0x7b,0xb, 0xd0,0xe5,0x47,0x25,0x45,0xf5,0x45,0xe5,0x48, +0x25,0x46,0xf5,0x46,0x7e,0x51,0x47,0xac,0x5d,0xe5,0x45,0xa, 0x3b,0x9d,0x32,0x12, +0x6d,0xd0,0x7c,0xb7,0xf5,0x49,0x7e,0x51,0x48,0xac,0x5d,0xe5,0x46,0xa, 0x3b,0x9d, +0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x4a,0x7e,0x51,0x4b,0xac,0x5d,0xe5,0x49,0xa, +0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2,0x7c,0xb7,0xf5,0x4b,0x7e,0x51, +0x4b,0xac,0x5d,0xe5,0x4a,0xa, 0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2, +0x7c,0xb7,0xf5,0x4b,0x7e,0x71,0x47,0x74,0x18,0xac,0x7b,0xe5,0x48,0xa, 0x2b,0x2d, +0x32,0x3e,0x34,0x2e,0x35,0x4f,0xb, 0x38,0x30,0xbe,0x35,0x4d,0x8, 0x3, 0x7a,0x35, +0x4d,0x5, 0x43,0xe5,0x4c,0xbe,0xb1,0x43,0x28,0x3, 0x2, 0x3a,0x26,0xbe,0xd0,0x0, +0x28,0x3a,0xe5,0x45,0x8c,0xbd,0xf5,0x45,0xe5,0x46,0x8c,0xbd,0xf5,0x46,0x7e,0xa1, +0x45,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x19,0xa3,0x15,0x2b,0xe5,0x46,0x19,0xb3, +0x15,0x2c,0x7e,0x25,0x4d,0x7e,0x71,0x45,0x74,0x18,0xac,0x7b,0xe5,0x46,0xa, 0x1b, +0x2d,0x31,0x3e,0x34,0x2e,0x35,0x4f,0x1b,0x38,0x20,0x5, 0x44,0xb, 0xc0,0xe5,0x42, +0xbc,0xbc,0x40,0x3, 0x2, 0x3a,0x10,0xe5,0x44,0xda,0x3b,0x22,0x74,0xd, 0x7a,0xb3, +0x10,0x2b,0x74,0x18,0x7a,0xb3,0x10,0x2c,0x74,0x4, 0x7a,0xb3,0x10,0x2d,0xe4,0x7a, +0xb3,0x10,0x2e,0x7e,0x34,0x11,0x9b,0x7a,0x37,0x10,0x2f,0x7e,0x34,0x11,0x97,0x7a, +0x37,0x10,0x31,0x7e,0x34,0xf, 0xc5,0x7a,0x37,0x10,0x33,0x7e,0x34,0xf, 0xad,0x7a, +0x37,0x10,0x35,0x74,0x15,0x7a,0xb3,0x10,0x37,0x74,0x17,0x7a,0xb3,0x10,0x38,0x74, +0x4, 0x7a,0xb3,0x10,0x3a,0xe4,0x7a,0xb3,0x10,0x3b,0x7a,0xb3,0x10,0x3c,0x7a,0xb3, +0x10,0x3d,0x74,0x2, 0x7a,0xb3,0x10,0x3e,0x74,0x45,0x7a,0xb3,0x10,0x3f,0x74,0x71, +0x7a,0xb3,0x10,0x40,0x74,0x3, 0x7a,0xb3,0x10,0x41,0x7e,0x34,0x1f,0xff,0x7a,0x37, +0x10,0x42,0x6d,0x33,0x7a,0x37,0x10,0x44,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10,0x46, +0x7e,0x34,0xf, 0xdc,0x7a,0x37,0x10,0x48,0x74,0x20,0x7a,0xb3,0x10,0x4a,0x74,0xa, +0x7a,0xb3,0x10,0x4b,0xe4,0x7a,0xb3,0x10,0x4c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10, +0x4e,0x74,0x2, 0x7a,0xb3,0x10,0x4f,0x7e,0x34,0x0, 0xf4,0x7a,0x37,0x10,0x52,0x7e, +0x34,0x3f,0xe0,0x7a,0x37,0x10,0x50,0x7e,0x34,0x29,0x28,0x7a,0x37,0x10,0x54,0x7e, +0x34,0x10,0x91,0x7a,0x37,0x10,0x62,0x7e,0x34,0x0, 0x3d,0x7a,0x37,0x10,0x64,0x7e, +0x34,0x0, 0x22,0x7a,0x37,0x10,0x66,0x7e,0x34,0x4c,0x0, 0x7a,0x37,0x10,0x56,0x7e, +0x34,0x3, 0xcf,0x7a,0x37,0x10,0x58,0x7e,0x34,0x7, 0x9a,0x7a,0x37,0x10,0x5a,0x7e, +0x34,0x5, 0x84,0x7a,0x37,0x10,0x5c,0x7e,0x34,0x0, 0x9, 0x7a,0x37,0x10,0x5e,0x7e, +0x34,0x0, 0xf, 0x7a,0x37,0x10,0x60,0x7e,0x34,0x0, 0x5d,0x7a,0x37,0x10,0x68,0xe4, +0x7a,0xb3,0x10,0x6a,0x74,0x7, 0x7a,0xb3,0x10,0x6b,0x7e,0x34,0x10,0xff,0x7a,0x37, +0x10,0x6c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x10,0x6e,0x7e,0x34,0xf, 0x2e,0x7a,0x37, +0x10,0x70,0x12,0x42,0x8d,0x7e,0x34,0x11,0xe9,0x7a,0x37,0x10,0x72,0x7e,0x34,0xf, +0x88,0x7a,0x37,0x10,0x74,0x7e,0x34,0x11,0x17,0x7a,0x37,0x10,0x76,0x2, 0x6c,0x58, +0xca,0x69,0xca,0xf8,0x7d,0xb1,0x7d,0xf2,0x7d,0xe3,0x9f,0x0, 0x7f,0x60,0x7f,0x40, +0x6d,0x66,0x7a,0x67,0x13,0xb6,0x7f,0x10,0x7d,0xa6,0x75,0x21,0x0, 0x6c,0xaa,0x80, +0x4b,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0xa1,0x2d,0xae,0xb, 0xa8,0xa0,0x7c,0xba,0x20, +0xe0,0x1e,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a, +0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x60,0x5, 0x21,0x80,0x1a, +0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a,0x8, 0x2, +0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x40,0xb, 0xa0,0x7e,0xf3,0x10,0x2c, +0xbc,0xfa,0x38,0xad,0xe5,0x21,0xa, 0x1b,0x6d,0x0, 0x7f,0x16,0x12,0x48,0x91,0x7a, +0x37,0x13,0xb6,0xe5,0x21,0xa, 0x3b,0x6d,0x22,0xa, 0x1f,0x6d,0x0, 0x9f,0x1, 0x7f, +0x14,0x12,0x48,0x91,0x6c,0xaa,0x80,0x2f,0x7c,0xba,0x7e,0x30,0x2, 0x7c,0x9a,0x20, +0xe0,0xf, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x9e,0x7, 0x13,0xb6,0x80, +0xd, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x7d,0x13,0x9d,0x1, 0x7d,0x14, +0x2d,0x1f,0x1b,0x18,0x0, 0xb, 0xa0,0x7e,0xb3,0x10,0x2c,0xbc,0xba,0x38,0xc9,0x9f, +0x66,0x7a,0x67,0x13,0xb6,0x6c,0xaa,0x80,0x29,0x7e,0x70,0x2, 0xac,0x7a,0x7d,0xa3, +0x2d,0xae,0x49,0xaa,0x0, 0x30,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x33, +0x9d,0x3b,0xbd,0x3a,0x8, 0x2, 0x7d,0xa3,0x7d,0x3a,0x1a,0x26,0x1a,0x24,0x2f,0x61, +0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xcf,0xa, 0x16,0x6d,0x0, 0x7f,0x16, +0x12,0x48,0x91,0x7a,0x37,0x13,0xb6,0x6c,0xaa,0x80,0x1d,0x7e,0x70,0x2, 0x7c,0x5a, +0xac,0x57,0x7d,0x32,0x2d,0x3e,0x49,0x43,0x0, 0x30,0x9e,0x47,0x13,0xb6,0x7d,0x32, +0x2d,0x3f,0x59,0x43,0x0, 0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xdb, +0xda,0xf8,0xda,0x69,0x22,0x7e,0x50,0x1, 0xe4,0x7a,0xb3,0xe, 0xb, 0x74,0x1, 0x7a, +0xb3,0xe, 0xc, 0x7e,0xa3,0xd, 0xf7,0x4c,0xaa,0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x16, +0xba,0xe4,0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, +0x7e,0x43,0xd, 0xfc,0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43, +0xd, 0x17,0xbe,0x40,0x0, 0x28,0x6b,0x7e,0xb3,0x16,0xb4,0x70,0x65,0x7e,0xb3,0x16, +0xb6,0x70,0x5f,0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x6d,0x33,0x6c,0x44,0x7e,0x30,0x2, +0xac,0x34,0x2e,0x17,0xf, 0xd6,0xb, 0x18,0x10,0xbd,0x13,0x58,0x2, 0x7d,0x31,0xb, +0x40,0xa5,0xbc,0x25,0xe8,0xbe,0x34,0xf8,0xf8,0x58,0x5, 0x7e,0x50,0x5, 0x80,0x1f, +0xbe,0x34,0xfb,0x50,0x58,0x5, 0x7e,0x50,0x4, 0x80,0x14,0xbe,0x34,0xfc,0xe0,0x58, +0x5, 0x7e,0x50,0x3, 0x80,0x9, 0xbe,0x34,0xfe,0xd4,0x58,0x3, 0x7e,0x50,0x2, 0xbe, +0x34,0xfc,0x18,0x58,0x3c,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d, +0x80,0x2f,0x7e,0x43,0xd, 0x16,0xa5,0xbc,0x0, 0x1d,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0xb3,0x16,0xb4,0x70,0x12,0x7e,0xb3,0x16,0xb6,0x70,0xc, 0xbe,0x50,0x3, 0x50,0x3, +0x7e,0x50,0x3, 0x74,0x1, 0x80,0x6, 0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, +0xc, 0x7e,0x43,0x16,0xba,0xbc,0x45,0x50,0x4, 0x7a,0x53,0x16,0xba,0xbe,0x50,0x2, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x1b,0x7e,0xb3,0xd, +0x16,0x70,0x15,0x7e,0xb3,0x16,0xb4,0x70,0xf, 0x7e,0xb3,0x16,0xb6,0x70,0x9, 0xe4, +0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xb3,0x16,0xb6,0xb4,0x1, 0x18,0xe4, +0x7a,0xb3,0x16,0xb6,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x7a, +0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xa3,0x16,0xba,0x74,0x2, 0xa4,0x7a,0x57, +0xe, 0x5, 0x7a,0x57,0xe, 0x7, 0x22,0xca,0x79,0x7c,0xfb,0xe5,0x55,0xbe,0xb0,0x1, +0x68,0xf9,0xe5,0x55,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x3f,0xe7,0xa9,0xd7,0xea,0x7e, +0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x12,0x0, +0x6e,0x50,0x27,0xa9,0xc7,0xea,0x7e,0xe3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x4d,0x7e, +0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x7a,0xe3,0x10,0x4d, +0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x3, 0x12,0x6a,0xd1,0x74,0x1, 0x7a,0xb3,0xf, 0xd3, +0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0xa, 0x18,0x12,0x66,0x59,0x7e, +0x37,0xf, 0xd6,0x7e,0x27,0xf, 0xd4,0x7e,0x14,0xa, 0x62,0x12,0x66,0x59,0x6c,0xaa, +0x80,0x36,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0xa, 0x92,0xbe,0x34,0x13,0x88,0x40, +0xc, 0xbe,0x34,0x75,0x30,0x28,0x1a,0xbe,0x34,0x7e,0xf4,0x50,0x14,0x7e,0xb3,0x16, +0xb7,0x4, 0x7a,0xb3,0x16,0xb7,0xb4,0xa, 0xd, 0x74,0x1, 0x7a,0xb3,0x16,0xb6,0x80, +0xf, 0xe4,0x7a,0xb3,0x16,0xb7,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xc2, +0x7e,0xa3,0x16,0xb6,0xbe,0xa0,0x1, 0x78,0x7, 0x7e,0xb3,0x16,0xb5,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x16,0xb5,0xbe,0xb0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb4, +0x4c,0xaa,0x78,0xd, 0xe4,0x7a,0xb3,0x16,0xb5,0x7a,0xb3,0x16,0xb4,0x7a,0xb3,0x16, +0xb7,0x74,0x1, 0x7a,0xb3,0xf, 0xd2,0x12,0x66,0x93,0x12,0x6b,0x7c,0x7e,0xb3,0x11, +0xc, 0xb4,0x1, 0x31,0xbe,0xf0,0x1, 0x78,0x2c,0x7e,0xb3,0xd, 0xfc,0x70,0x26,0x12, +0x46,0xe9,0x7e,0xb3,0xd, 0xf7,0x70,0x19,0x7e,0x73,0x11,0x95,0xa, 0x37,0x9, 0x73, +0xf, 0x29,0x7a,0x73,0x10,0x4a,0xe4,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0x11,0xc, 0x80, +0x6, 0x6c,0xff,0x80,0x2, 0x6c,0xff,0x12,0x65,0xe4,0x12,0x6b,0xde,0x7c,0xbf,0xda, +0x79,0x22,0xca,0x3b,0x75,0x21,0x0, 0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4, +0x12,0x6d,0xe0,0xe4,0x7a,0xb3,0xd, 0x16,0x7a,0xb3,0xd, 0x17,0x7e,0xb3,0xf, 0xd2, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x41,0x68,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, +0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12, +0x6d,0xe0,0x7e,0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4c,0x7e,0x14, +0x13,0xb6,0x6c,0x11,0x12,0x4f,0x1, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, +0x30,0x7e,0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4a,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x1, +0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x51,0x6c,0xcc,0x80,0x47,0x7c,0xbf,0xc4,0x23, +0x54,0x1f,0x7c,0x6b,0x7a,0x61,0x21,0xa, 0x2a,0x9, 0x72,0x13,0xc0,0x7e,0x50,0x2, +0xac,0x5f,0x19,0x72,0xa, 0xb1,0xa, 0x1c,0x9, 0x71,0x13,0xb6,0x19,0x72,0xa, 0xb2, +0x7c,0xbf,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x79,0xa, 0x46,0x2e,0x44,0xb, 0x79,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, +0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xb5,0xb, 0xa0,0xbc,0xda,0x38,0xab,0x7a,0xf3,0xd, +0x16,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34, +0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x7e,0x37,0xf, 0xd6,0x7e, +0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xb6,0x7e,0x10,0x1, 0x12,0x4f, +0x1, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0x10,0x2b,0x7e, +0x27,0xf, 0x4e,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x1, 0x7c,0xdb,0x6c,0xff,0x6c,0xaa, +0x80,0xe, 0x6c,0xcc,0x80,0x4, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xf8,0xb, 0xa0, +0xbc,0xda,0x38,0xee,0x7a,0xf3,0xd, 0x17,0xda,0x3b,0x22,0xca,0xf8,0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x74,0x1, 0x7a,0xb3,0x10, +0x3c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10,0xa5,0x7e,0xb3,0xf, 0x26,0x12,0x6e,0xa1, +0x12,0x63,0xde,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x42,0x84,0x6d, +0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0x0, 0x64,0x7a,0x37,0xa, 0xaf,0xe4,0x7a,0xb3, +0x0, 0xff,0x12,0x6c,0x3a,0x12,0x45,0xdf,0x12,0x6a,0xf4,0x6c,0xff,0x1a,0x2f,0x7e, +0x34,0x0, 0x18,0xad,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b, +0x35,0xb, 0x38,0x30,0x1a,0x2f,0x3e,0x24,0x59,0x32,0x13,0x9c,0xb, 0xf0,0xbe,0xf0, +0xd, 0x78,0xda,0x12,0x6b,0x3a,0x12,0x6c,0x90,0x12,0x68,0xf7,0x6c,0xff,0x1a,0x3f, +0x3e,0x34,0x49,0x23,0x13,0x9c,0x1a,0xf, 0x7e,0x14,0x0, 0x18,0xad,0x10,0x7d,0x31, +0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, +0xf0,0xbe,0xf0,0xd, 0x78,0xd8,0x12,0x69,0xca,0x12,0x48,0xe6,0x7e,0xb3,0xf, 0xd3, +0x70,0x9, 0x7e,0xb3,0xf, 0xd2,0x70,0x3, 0x2, 0x41,0x93,0x12,0x1f,0x7b,0x12,0x33, +0x70,0x7a,0xb3,0xf, 0x25,0x12,0x6d,0xff,0x12,0x6c,0xf6,0x70,0x3, 0x2, 0x41,0x93, +0x12,0x44,0xc9,0x7e,0x37,0xf, 0xda,0x12,0x8, 0x6, 0x12,0x6e,0xa7,0x12,0x4e,0x57, +0x12,0x0, 0x6e,0x50,0x3, 0x12,0x2f,0xc6,0x7e,0xb3,0x11,0x15,0xb4,0x1, 0x4, 0xe4, +0x12,0x6e,0x92,0x12,0x68,0xca,0x12,0x66,0xcc,0x12,0x19,0x6d,0x12,0x6, 0x11,0x12, +0x6e,0xc6,0x12,0x65,0x2c,0x12,0x36,0xb7,0x12,0x55,0xe4,0x12,0x1c,0x95,0x12,0x49, +0xd0,0x2, 0x41,0x93,0x12,0x0, 0x1e,0x12,0x6e,0x1b,0xda,0xf8,0x22,0xca,0x79,0x7e, +0x34,0x0, 0x60,0x12,0x69,0x78,0x7c,0xab,0x7a,0xa1,0x6a,0xbe,0xa0,0x8, 0x40,0x3, +0x2, 0x43,0xab,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0xe0,0x6, 0x80,0x3, 0x7e,0xe0,0x5, +0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x42,0xbf,0x73,0x2, +0x42,0xd7,0x2, 0x42,0xdc,0x2, 0x42,0xe1,0x2, 0x42,0xe6,0x2, 0x42,0xeb,0x2, 0x42, +0xf0,0x2, 0x42,0xf5,0x2, 0x42,0xfa,0x7e,0xf0,0x5e,0x80,0x26,0x7e,0xf0,0x5f,0x80, +0x21,0x7e,0xf0,0x61,0x80,0x1c,0x7e,0xf0,0x63,0x80,0x17,0x7e,0xf0,0x65,0x80,0x12, +0x7e,0xf0,0x67,0x80,0xd, 0x7e,0xf0,0x69,0x80,0x8, 0x7e,0xf0,0x6a,0x80,0x3, 0x7e, +0xf0,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x11,0xe9,0xa, 0xb, 0x7e,0xb3,0x10,0xff, +0xa, 0x1b,0x2d,0x1, 0x7c,0xb1,0x7c,0x1a,0x2e,0x10,0x21,0xa5,0xf7,0x7c,0x9b,0xa, +0x9, 0x5e,0x4, 0x0, 0x1, 0xbe,0x4, 0x0, 0x1, 0x78,0x1c,0x7c,0x79,0xac,0x7f,0x7e, +0x50,0x3, 0xac,0x5f,0xe, 0x24,0xe, 0x24,0x2d,0x32,0x7c,0xba,0x3e,0xb0,0x24,0x25, +0xa, 0xb, 0x1b,0x8, 0x30,0x80,0xd, 0xac,0x9f,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, +0xb, 0x1b,0x8, 0x40,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, 0xb, 0xb, 0x8, 0xf0,0x7e, +0x4, 0x0, 0xa, 0x7d,0x3f,0x8d,0x30,0x8d,0x30,0x7c,0x75,0xbe,0x70,0x0, 0x40,0x14, +0xbc,0xe7,0x28,0x10,0x7e,0xc4,0x0, 0x64,0x7d,0xdf,0x8d,0xdc,0x7d,0xd, 0x9d,0x1, +0x7c,0x61,0x80,0x17,0xbc,0xe7,0x38,0x19,0xbe,0x70,0x9, 0x38,0x14,0x7e,0xe4,0x0, +0x64,0x8d,0xfe,0x7d,0x2f,0xb, 0x24,0x9d,0x21,0x7c,0x65,0xa, 0x2a,0x19,0x62,0x11, +0xe9,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x3, 0x2, 0x43,0x4, 0xda,0x79,0x22,0xca,0x3b, +0x7c,0xeb,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x38,0x3, 0x2, 0x44,0xc0,0x7c,0xbe, +0x12,0xd, 0x46,0x7e,0xb3,0xd, 0xfc,0x60,0x1e,0x7e,0xb3,0x15,0x54,0x70,0x8, 0x7e, +0xb3,0x15,0x55,0x70,0x2, 0x80,0x10,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x28,0xc, +0xe5,0x12,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x1e,0x7e,0xf0,0x1, 0xbe, +0x73,0xf, 0x1c,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x15,0x54,0xbe, +0x73,0xf, 0x1c,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c,0xbe, +0x12,0xd, 0x46,0xe5,0x10,0x7a,0xb3,0xd, 0xf7,0x7e,0x31,0x10,0x74,0x2, 0xac,0x3b, +0x7e,0x24,0x15,0x2b,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x3c,0x75,0x12,0x64,0x75,0x13, +0x64,0x6c,0xee,0x80,0x67,0x6c,0xdd,0x80,0x59,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, +0x18,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0xa, 0x37,0x9d,0x32,0x12, +0x6d,0xd0,0x7c,0xb7,0xf5,0x21,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, 0x19,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x19,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xd0,0x7c, +0xc7,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0xa, 0xe5,0x12,0xbe,0xb1,0x21,0x28,0x3, 0x85, +0x21,0x12,0xbe,0xc0,0x0, 0x28,0x9, 0xe5,0x13,0xbc,0xbc,0x28,0x3, 0x7a,0xc1,0x13, +0xb, 0xd0,0x7e,0x73,0xd, 0xf7,0xbc,0x7d,0x38,0x9f,0xb, 0xe0,0x7e,0x73,0xd, 0xf7, +0xbc,0x7e,0x38,0x91,0xe5,0x12,0xb4,0x64,0x3, 0x75,0x12,0x0, 0xe5,0x13,0xb4,0x64, +0x3, 0x75,0x13,0x0, 0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x85,0x13,0x12,0x80,0x6, +0x75,0x12,0x64,0x75,0x13,0x64,0xda,0x3b,0x22,0x12,0x59,0x46,0x70,0x3, 0x2, 0x45, +0x50,0x75,0x6f,0x14,0x75,0x6e,0x1, 0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, +0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e, +0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19, +0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb, +0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4, +0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22, +0xe5,0x6e,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x45,0xdc,0x15,0x6f,0xe5,0x6f,0x60,0x79, +0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, +0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54, +0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c, +0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79, +0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e, +0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22,0x75,0x6e,0x0, 0xe5,0x21,0x22,0xca, +0x79,0x7e,0x74,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x20,0xe0,0x3, 0x2, 0x46,0xe6,0x54, +0xfe,0x7a,0xb3,0x10,0xfe,0x9, 0x77,0x0, 0x2, 0xbe,0x73,0xf, 0x52,0x68,0x16,0x7a, +0x73,0xf, 0x52,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x7a,0x37,0xf, 0x48,0x7e,0x79,0x70,0xbe,0x73,0xf, 0x5c,0x68,0xe, 0x7a,0x73, +0xf, 0x5c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x54,0x9, 0x77,0x0, 0x1, +0xa, 0x37,0xbe,0x37,0xf, 0x56,0x68,0x4, 0x7a,0x37,0xf, 0x56,0x7e,0x27,0xf, 0x5d, +0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x9, 0x77,0x0, 0x5, 0xa, 0x37,0xbd,0x32, +0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x5d,0x9, 0x77, +0x0, 0x8, 0xbe,0x73,0x11,0x11,0x68,0x24,0x7a,0x73,0x11,0x11,0xbe,0x70,0xf, 0x40, +0x5, 0xe4,0x19,0xb7,0x0, 0x8, 0x9, 0x77,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6d,0xf0, +0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0x11,0x10,0x9, 0x77,0x0, 0x9, +0xbe,0x73,0x11,0x13,0x68,0x8, 0x7a,0x73,0x11,0x13,0x7a,0x73,0x11,0x12,0x9, 0x77, +0x0, 0x7, 0xbe,0x73,0x11,0x14,0x68,0x4, 0x7a,0x73,0x11,0x14,0x9, 0xb7,0x0, 0xb, +0xbe,0xb1,0x51,0x68,0x5, 0xf5,0x51,0x12,0x6c,0xde,0x9, 0x77,0x0, 0x25,0xa, 0x37, +0xbe,0x37,0x11,0xd, 0x68,0x4, 0x7a,0x37,0x11,0xd, 0x9, 0x77,0x0, 0x6, 0xbe,0x73, +0x11,0xf, 0x68,0x4, 0x7a,0x73,0x11,0xf, 0x9, 0x77,0x0, 0x24,0xbe,0x73,0x11,0x15, +0x68,0x4, 0x7a,0x73,0x11,0x15,0xda,0x79,0x22,0xca,0x79,0xe4,0x6c,0xaa,0xa, 0x4a, +0x19,0xb4,0xd, 0x68,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xf3,0xe4,0x7a,0xb3,0xd, 0xf7, +0x7a,0xb3,0xd, 0xf8,0x7a,0xb3,0xd, 0xf9,0x7a,0xb3,0xd, 0xfa,0x7e,0xb3,0xf, 0xd3, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x47,0xef,0x7e,0xb3,0x10,0x2b,0xf5,0x21,0x7e,0xb3, +0x10,0x2c,0xf5,0x22,0x7e,0x37,0xf, 0x56,0x7a,0x35,0x23,0x7e,0x37,0xf, 0x58,0x7a, +0x35,0x25,0x7e,0x37,0xf, 0x5a,0x7a,0x35,0x27,0x7e,0x34,0x0, 0x14,0x7a,0x35,0x2d, +0x7e,0x37,0xf, 0xda,0x7e,0x24,0x0, 0x21,0x7e,0x14,0x0, 0x29,0x7e,0x4, 0x9, 0xc8, +0x12,0x4d,0xa8,0xe5,0x29,0x7a,0xb3,0xd, 0xf7,0xe5,0x2a,0x7a,0xb3,0xd, 0xf8,0xe5, +0x2b,0x7a,0xb3,0xd, 0xf9,0xe5,0x2c,0x7a,0xb3,0xd, 0xfa,0x6c,0xaa,0x80,0x6c,0x7e, +0x53,0xd, 0xf7,0xbc,0x5a,0x28,0x44,0x7c,0xba,0xc4,0x23,0x54,0x1f,0x7c,0x7b,0x7c, +0xba,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0x69, +0x7e,0x30,0x2, 0xac,0x3a,0x49,0x71,0x9, 0xc8,0x7d,0x7, 0xa, 0x0, 0x7c,0x41,0x19, +0x41,0xd, 0x18,0x7d,0x7, 0x7c,0x41,0x19,0x41,0xd, 0x19,0xa, 0x47,0x2e,0x44,0xd, +0x68,0x7e,0x49,0xb0,0x4c,0xb6,0x7a,0x49,0xb0,0x80,0x1e,0xa, 0x15,0xa, 0x2a,0x9d, +0x21,0x3e,0x24,0x49,0x72,0x9, 0xf0,0x7d,0x17,0xa, 0x12,0x7c,0xb3,0x19,0xb2,0xd, +0x40,0x7d,0x17,0x7c,0xb3,0x19,0xb2,0xd, 0x41,0xb, 0xa0,0x7e,0xb3,0xd, 0xf8,0xa, +0x2b,0x7e,0xb3,0xd, 0xf7,0xa, 0x1b,0x2d,0x12,0xa, 0x2a,0xbd,0x21,0x48,0x80,0xda, +0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, +0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32, +0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff, +0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12, +0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, +0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22, +0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf, +0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34, +0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40, +0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, +0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, +0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x48,0x40, +0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x48,0x40,0x30,0xd5,0x6, 0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, +0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e, +0x39,0x40,0x7a,0x19,0x40,0x22,0xca,0x79,0x6c,0xee,0x12,0x65,0x6b,0x7d,0x43,0x6c, +0xaa,0x6c,0x77,0x7e,0x30,0x6, 0xac,0x37,0x2e,0x14,0x6c,0x1c,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70,0x5, +0x40,0xe1,0xbe,0xa0,0x5, 0x78,0x3, 0x2, 0x49,0xb7,0x7e,0x63,0xd, 0xf7,0xbe,0x60, +0x0, 0x38,0x3, 0x2, 0x49,0xb7,0x6c,0x77,0x2, 0x49,0xac,0x6c,0xff,0x6c,0x66,0x80, +0x41,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27,0xf, +0xda,0xb, 0x28,0x20,0x7e,0x30,0x6, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6c,0x1e,0x7e, +0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x2, 0x18,0x14,0xb, 0xf0,0x2e,0x14,0x6c,0x20, +0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x28,0xe, 0x80,0x2, 0x6c,0xff, +0xb, 0x60,0x7e,0xb3,0x10,0x2b,0xbc,0xb6,0x38,0xb7,0x7e,0x50,0x6, 0xac,0x5a,0x7d, +0x12,0x2e,0x14,0x6c,0x20,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x38, +0x17,0xb, 0xe0,0x2e,0x24,0x6c,0x21,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0xbc, +0xbe,0x38,0x7, 0x75,0x14,0x40,0x80,0xf, 0x6c,0xee,0xb, 0x70,0x7e,0xb3,0x10,0x2c, +0xbc,0xb7,0x28,0x3, 0x2, 0x49,0x2b,0xe5,0x15,0x25,0x14,0xf5,0x14,0xbe,0xb0,0x0, +0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0xda,0x79,0x22, +0xca,0x3b,0x7e,0x73,0xd, 0xfb,0x7a,0x73,0xd, 0xfc,0x7e,0xa3,0xf, 0x1b,0x7a,0xa3, +0xf, 0x1c,0xe4,0x7a,0xb3,0xf, 0x1f,0x7e,0x37,0x11,0xd, 0x4d,0x33,0x78,0x3f,0xbe, +0xa0,0x0, 0x28,0x8, 0xe4,0x7a,0xb3,0x16,0xae,0x2, 0x4a,0x97,0x7e,0xb3,0x11,0xf, +0x20,0xe0,0x3, 0x2, 0x4a,0x97,0x7e,0xb3,0x11,0x14,0xbe,0xb3,0x16,0xae,0x28,0x3, +0x2, 0x4a,0x97,0xe4,0x7a,0xb3,0x16,0xae,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x11,0xd, +0x74,0x1, 0x7a,0xb3,0x10,0xa3,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x80,0x69,0xbe,0x34, +0x0, 0x1, 0x78,0x22,0xbe,0xa0,0x0, 0x28,0x5e,0x6d,0x22,0x7a,0x27,0x11,0xd, 0xe4, +0x7a,0xb3,0x10,0xa3,0x7a,0xb3,0x16,0xae,0x74,0x23,0x7a,0xb3,0x16,0xb1,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x80,0x41,0xbe,0x34,0x0, 0x3, 0x78,0x3b,0x6d,0x66,0x7a,0x67, +0x10,0x1, 0x7e,0x74,0xd, 0xac,0x7a,0x77,0xa, 0xaf,0x12,0x6e,0xcc,0x12,0x60,0x22, +0x12,0x58,0x63,0x6d,0x33,0x7a,0x37,0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x7a,0x67,0x10,0x1, 0x7a,0x77,0xa, 0xaf,0x75,0x9a,0x7f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x7e,0xb3,0x16,0xb0,0x70,0x6, 0x12,0x5b,0x69, +0x12,0x64,0x24,0xda,0x3b,0x22,0x7d,0x53,0x9f,0x11,0xbe,0x54,0x0, 0x0, 0x40,0x2d, +0xbe,0x54,0x0, 0x3f,0x38,0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x25,0x7e,0x34,0x1, 0x92, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x32,0x48,0x4, +0x7e,0x18,0x0, 0x32,0x7e,0x8, 0x0, 0x32,0x9f,0x1, 0x7f,0x10,0x22,0xbe,0x54,0x5, +0x80,0x40,0x29,0xbe,0x54,0x5, 0xaa,0x38,0x23,0x7d,0x25,0x9e,0x24,0x5, 0x7f,0x7e, +0x34,0x1, 0x92,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, +0x32,0x48,0x4, 0x7e,0x18,0x0, 0x31,0x2e,0x18,0x4, 0xce,0x22,0xbe,0x54,0x5, 0xaa, +0x28,0x19,0x7d,0x25,0x9e,0x24,0x5, 0x9f,0x7e,0x34,0x1, 0x92,0xad,0x32,0x6d,0x22, +0x7c,0x76,0x7c,0x65,0x1a,0x24,0x2e,0x18,0x5, 0x0, 0x22,0xbe,0x54,0x2, 0xdf,0x38, +0x8, 0x7e,0x34,0x2, 0xdf,0x9d,0x35,0x80,0x6, 0x7d,0x35,0x9e,0x34,0x2, 0xe0,0x6d, +0x22,0x7e,0x14,0x0, 0xe1,0x12,0x48,0x35,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x54, +0x2, 0xdf,0x38,0xa, 0x7e,0x8, 0x2, 0x7f,0x9f,0x1, 0x7f,0x10,0x80,0x4, 0x2e,0x18, +0x2, 0x80,0xbe,0x18,0x0, 0x32,0x58,0x5, 0x7e,0x18,0x0, 0x32,0x22,0xbe,0x18,0x4, +0xce,0x8, 0x4, 0x7e,0x18,0x4, 0xce,0x22,0x7e,0x34,0x10,0x7e,0x7e,0x24,0x0, 0x81, +0xe4,0x12,0x6d,0xe0,0x74,0xc, 0x7a,0xb3,0x10,0x80,0x7a,0xb3,0x10,0x81,0x74,0x7, +0x7a,0xb3,0x10,0x82,0x74,0xf, 0x7a,0xb3,0x10,0x7e,0x74,0x3c,0x7a,0xb3,0x10,0x7f, +0x74,0xa0,0x7a,0xb3,0x10,0x83,0x74,0x1e,0x7a,0xb3,0x10,0x85,0x74,0x9, 0x7a,0xb3, +0x10,0x86,0x74,0x1e,0x7a,0xb3,0x10,0x87,0xe4,0x7a,0xb3,0x10,0x88,0x7a,0xb3,0x10, +0x89,0xf5,0x52,0xf5,0x51,0x7a,0xb3,0x10,0xa3,0x74,0x1, 0x7a,0xb3,0x10,0x84,0x7a, +0xb3,0x10,0xa2,0x7a,0xb3,0x10,0xa5,0x74,0x16,0x7a,0xb3,0x10,0xa4,0x74,0xf4,0x7a, +0xb3,0x10,0xa6,0x74,0xb, 0x7a,0xb3,0x10,0xad,0x12,0x6e,0xb9,0xa, 0x36,0x7a,0x73, +0x10,0xa7,0x12,0x6e,0xb9,0x7a,0x73,0x10,0xa8,0x12,0x6e,0xbe,0xa, 0x36,0x7a,0x73, +0x10,0x9f,0x12,0x6e,0xbe,0x7a,0x73,0x10,0xa0,0xe4,0x7a,0xb3,0x10,0xae,0x74,0x1f, +0x7a,0xb3,0x10,0xcf,0xe4,0x7a,0xb3,0x10,0xb0,0x12,0x6e,0xd, 0x7a,0xb3,0x10,0xaf, +0x12,0x6d,0xe, 0x7a,0xb3,0x10,0xa1,0x7e,0x34,0x10,0x8e,0x7e,0x24,0x0, 0x8, 0x74, +0xff,0x12,0x6d,0xe0,0x74,0x16,0x7a,0xb3,0x10,0x8e,0x74,0x1, 0x7a,0xb3,0x10,0x8f, +0x22,0xca,0x3b,0x6d,0x11,0x7d,0x1, 0x7d,0x21,0x7e,0xa0,0x2, 0x7e,0x70,0x2, 0x6c, +0x66,0x80,0x39,0x6c,0x99,0x80,0x2b,0x7e,0xd0,0x30,0xac,0xd6,0x7e,0xf0,0x2, 0xac, +0xf9,0x7d,0xf7,0x2d,0xf6,0x2e,0xf7,0xf, 0xda,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, 0x14, +0x8, 0x4, 0xb, 0x4, 0x80,0x8, 0xbe,0xf4,0xff,0xec,0x58,0x2, 0xb, 0x24,0xb, 0x14, +0x2c,0x97,0x7e,0xb3,0x10,0x2c,0xbc,0xb9,0x38,0xcd,0x2c,0x6a,0x7e,0xb3,0x10,0x2b, +0xbc,0xb6,0x38,0xbf,0x7e,0x54,0x0, 0x3, 0xad,0x51,0x7d,0x35,0x1e,0x34,0x1e,0x34, +0xbd,0x30,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb8,0x7e,0xb3,0x16,0xb9,0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb9,0x80,0x39,0xe4,0x7a,0xb3,0x16,0xb9,0x75,0x72, +0x1, 0x80,0x2f,0xbd,0x32,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb9,0x7e,0xb3,0x16,0xb8, +0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb8,0x80,0x16,0xe4,0x7a,0xb3,0x16, +0xb8,0x75,0x72,0x2, 0x80,0xc, 0xe4,0x7a,0xb3,0x16,0xb8,0x7a,0xb3,0x16,0xb9,0x75, +0x72,0x0, 0xe5,0x72,0xda,0x3b,0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x0, 0x40,0x2d,0xbe, +0xf4,0x0, 0x3f,0x38,0x27,0x7e,0x44,0x0, 0x3f,0x9d,0x4f,0x7e,0x54,0x1, 0x8e,0xad, +0x54,0x6d,0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x32,0x40,0x4, 0x7e,0x28,0x0, +0x32,0x7e,0x18,0x0, 0x32,0x9f,0x12,0x7f,0x21,0x2, 0x4d,0xa5,0xbe,0xf4,0x3, 0x0, +0x40,0x22,0x7d,0x4f,0x9e,0x44,0x3, 0x0, 0x7e,0x54,0x1, 0xc0,0xad,0x54,0x6d,0x44, +0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x32,0x40,0x4, 0x7e,0x28,0x0, 0x31,0x2e,0x28, +0x2, 0x9e,0x80,0x51,0xbe,0xf4,0x1, 0x9f,0x38,0x8, 0x7e,0x54,0x1, 0x9f,0x9d,0x5f, +0x80,0x6, 0x7d,0x5f,0x9e,0x54,0x1, 0xa0,0x6d,0x44,0x7e,0x14,0x0, 0xe2,0x7f,0x12, +0x12,0x48,0x35,0x7f,0x21,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0xbe,0xf4,0x1, 0x9f,0x38, +0xa, 0x7e,0x18,0x1, 0x67,0x9f,0x12,0x7f,0x21,0x80,0x4, 0x2e,0x28,0x1, 0x68,0xbe, +0x28,0x0, 0x32,0x50,0x6, 0x7e,0x28,0x0, 0x32,0x80,0xa, 0xbe,0x28,0x2, 0x9e,0x28, +0x4, 0x7e,0x28,0x2, 0x9e,0x7d,0x35,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, +0x56,0xf5,0xba,0x7e,0x55,0x2d,0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50, +0xf5,0xc1,0x9, 0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54, +0xe0,0x4c,0xba,0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c, +0xb7,0xf5,0xc6,0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, +0x4, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75, +0xc5,0x4, 0x1a,0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, +0x6, 0x7c,0xb1,0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, +0x4e,0x29,0x43,0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, +0x75,0xc5,0xa, 0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1, +0x0, 0x3, 0x75,0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19, +0xb1,0x0, 0x1, 0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0xf, 0xd2,0x60, +0x6, 0x7e,0xb3,0xf, 0xd3,0x70,0x18,0x7e,0x34,0xd, 0x68,0x7e,0x24,0x0, 0x3, 0xe4, +0x12,0x6d,0xe0,0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4,0x12,0x6d,0xe0,0x6c, +0xee,0x80,0x6b,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0x7a,0x71,0x21,0x9, 0x65, +0xd, 0x19,0x7a,0x61,0x22,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xdb,0x7c,0xbe,0x54, +0x7, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xc5,0x7e,0x50, +0x30,0xac,0x57,0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x30,0xbe,0x37,0xf, 0x54,0x48,0x25,0xa, 0x3d,0x9, 0xb3,0xd, 0x68,0x5c,0xbc,0x68, +0x1b,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0xd, 0x6b,0x7e,0x70,0x7, 0xac,0x7f,0x2e, +0x34,0xe, 0xd, 0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x3c,0xb, 0xf0,0xb, 0xe0,0x7e,0x73, +0xd, 0xf7,0xbc,0x7e,0x38,0x8d,0x7a,0x73,0xd, 0xfb,0x7a,0xf3,0xf, 0x1b,0xda,0x3b, +0x22,0xca,0xf8,0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x2, 0x4f,0x9c, +0x7e,0x90,0x2, 0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, +0x6e,0x44,0xff,0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0xa, 0x50,0x6b,0x4c, +0xff,0x78,0x14,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, +0xe4,0xbd,0xe4,0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd, +0x1b,0xf5,0xb, 0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0xf4,0x18,0x37,0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd, +0x1b,0xc5,0xb, 0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff, +0xff,0xb, 0xf4,0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18, +0x9, 0xa, 0xda,0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x3, +0x2, 0x4f,0x10,0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x33,0x7d,0x73,0x75,0x25, +0x0, 0x7e,0x64,0x5, 0xe0,0x75,0x23,0x0, 0x80,0x3c,0x75,0x24,0x0, 0x7e,0x51,0x23, +0x74,0x18,0xac,0x5b,0x3e,0x24,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2d, +0x36,0x7a,0x35,0x21,0x49,0x23,0x0, 0x30,0xb, 0x38,0x30,0x9d,0x32,0x12,0x6d,0xd0, +0xe5,0x24,0xb4,0x17,0x2, 0x1e,0x34,0xbd,0x37,0x28,0x2, 0x7d,0x73,0x5, 0x24,0xe5, +0x24,0xb4,0x18,0xc9,0x5, 0x23,0xe5,0x25,0xa, 0x2b,0x7e,0x33,0x10,0x7c,0xa, 0x13, +0x9d,0x12,0x1b,0x14,0xe5,0x23,0xa, 0x2b,0xbd,0x21,0x48,0xae,0xbe,0x74,0x0, 0x41, +0x28,0x11,0x7e,0x34,0x0, 0x73,0x7e,0xa3,0x16,0x54,0x74,0x12,0xa4,0x59,0x35,0x16, +0x65,0x80,0x26,0x7e,0x43,0x16,0x54,0x7e,0x50,0x12,0xac,0x45,0x49,0x32,0x16,0x65, +0xbd,0x37,0x50,0x6, 0x59,0x72,0x16,0x65,0x80,0xf, 0xbe,0x34,0x0, 0x0, 0x28,0x9, +0x2e,0x24,0x16,0x65,0x1b,0x34,0x1b,0x28,0x30,0xda,0x3b,0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x0, 0x46,0x7e,0x35,0x1e,0xb, 0x34,0x7a,0x35,0x1e,0x7e,0xb3,0x0, 0xff,0x4, +0x7a,0xb3,0x0, 0xff,0x7e,0x35,0x1e,0xbe,0x34,0x3, 0xe8,0x40,0x13,0x6d,0x33,0x7a, +0x35,0x1e,0x7e,0xb3,0x16,0xae,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x16,0xae, +0x7e,0x73,0x16,0xb2,0xbe,0x73,0x16,0xb1,0x28,0xb, 0x7e,0xb3,0x16,0xb1,0x4, 0x7a, +0xb3,0x16,0xb1,0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb0,0x7e,0xb3,0x16,0xb3,0x60, +0x5, 0x14,0x7a,0xb3,0x16,0xb3,0x7e,0x37,0x10,0x1, 0xb, 0x34,0x7a,0x37,0x10,0x1, +0x7e,0x37,0xa, 0xaf,0xbe,0x37,0x10,0x1, 0x28,0x3, 0x12,0x6e,0xcf,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x75,0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x16,0xbc,0x75,0x6a,0x0, 0x75,0x8, 0x1, 0x75,0x9, 0x0, 0x75,0xa, +0x0, 0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0xc2,0x0, 0x75, +0x11,0x0, 0x75,0x12,0x64,0x75,0x13,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x16, +0x0, 0x75,0x19,0x1, 0x75,0x1e,0x0, 0x75,0x1f,0x0, 0x75,0x72,0x0, 0x75,0x6e,0x0, +0x75,0x73,0x0, 0x75,0x74,0x1, 0x75,0x70,0x18,0x75,0x71,0x0, 0x75,0x75,0x0, 0x75, +0x76,0x0, 0x75,0x6b,0x0, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0x4, 0x0, 0xff,0x7e, +0x14,0x6e,0xd6,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, +0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44, +0x78,0xf2,0x80,0xdf,0x2, 0x5b,0xce,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, +0x78,0xc, 0x7e,0x34,0x10,0x2b,0x12,0x6b,0x17,0xa9,0xc7,0xea,0x80,0x27,0xbe,0xd0, +0x5, 0x78,0x1f,0xa9,0xd7,0xea,0x7e,0xe3,0x10,0x4a,0x7e,0xf3,0x10,0x4d,0xe4,0x7a, +0xb3,0x10,0x4d,0x12,0x66,0x1f,0x7a,0xb3,0x10,0x4a,0x74,0x1, 0x7a,0xb3,0x10,0x78, +0x80,0x3, 0xe4,0x80,0x4e,0x7e,0xb3,0x11,0x96,0x7e,0x34,0x10,0x2b,0xb4,0x1, 0xa, +0x12,0x31,0xbc,0xe4,0x7a,0xb3,0x11,0x96,0x80,0xa, 0x12,0x60,0xce,0x7e,0x34,0x10, +0x2b,0x12,0x5d,0xbd,0x7e,0x34,0x10,0x2b,0x12,0x6a,0x64,0x7e,0xb3,0x10,0xa5,0xb4, +0x3, 0xa, 0x7e,0x73,0x11,0xe8,0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x69,0x23,0xbe, +0xd0,0x5, 0x78,0xd, 0x7a,0xe3,0x10,0x4a,0x7a,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10, +0x78,0x74,0x1, 0xda,0x79,0xda,0xd8,0x22,0x7e,0x34,0xe, 0xd, 0x7e,0x24,0x0, 0x46, +0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0xe, 0x53,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12, +0x6d,0xe0,0x7e,0x34,0xe, 0x99,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0x6c, +0xaa,0x74,0x3, 0xa, 0x4a,0x19,0xb4,0xe, 0xdf,0x19,0xb4,0xe, 0xe9,0x7e,0x44,0xff, +0xff,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0xe, 0xf3,0x7e,0x70,0x2, 0xac,0x7a,0x59, +0x43,0xf, 0x7, 0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd7,0xe4,0x7a,0xb3,0xf, 0x1b,0x7a, +0xb3,0xf, 0x1c,0x7a,0xb3,0xf, 0x1d,0x7a,0xb3,0xf, 0x1f,0x7a,0xb3,0xf, 0x20,0x7a, +0xb3,0xf, 0x21,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7a,0xb3,0xf, 0x24,0x7a, +0xb3,0xf, 0x25,0x12,0x6a,0xad,0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a,0xb3, +0xf, 0x27,0xe4,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7c,0xab,0x6c,0x33,0x7c,0x27, +0x80,0x73,0x7e,0x90,0x7, 0xac,0x93,0x9, 0xf4,0xe, 0x57,0x7e,0x10,0x7, 0xac,0x12, +0x9, 0xb0,0xe, 0x11,0xbc,0xfb,0x78,0x5b,0xbe,0xf0,0xff,0x68,0x56,0x7e,0x10,0x7, +0xac,0x1a,0x7d,0xf0,0x2d,0xf2,0x19,0xff,0x0, 0x4, 0x49,0x44,0xe, 0x53,0x2d,0x2, +0x1b,0x8, 0x40,0x7e,0x10,0x7, 0xac,0x13,0x49,0x0, 0xe, 0x55,0x7e,0x90,0x7, 0xac, +0x9a,0x2d,0x42,0x59,0x4, 0x0, 0x2, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x12, +0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x5, 0x7e,0x10,0x7, 0xac,0x12, +0x9, 0x10,0xe, 0x13,0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x6, 0xb, +0xa0,0x80,0x6, 0xb, 0x20,0xbc,0x62,0x38,0x89,0xb, 0x30,0xbe,0x30,0xa, 0x50,0x3, +0x2, 0x52,0x9e,0x7c,0xba,0xda,0xf8,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x3b,0xbe, +0xa0,0x3e,0x38,0x36,0xbe,0xa0,0x4, 0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x0, 0x8b,0xbe, +0xa0,0x1, 0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x0, +0x6, 0x7e,0x34,0x15,0xca,0x80,0x4, 0x7e,0x34,0x16,0xc, 0x7a,0x37,0x16,0x51,0xa, +0x3a,0x2e,0x37,0x16,0x51,0x9, 0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0xb, +0x22,0xbe,0xa0,0x80,0x40,0xc, 0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0xf, +0xfe,0x22,0xbe,0xa0,0xfc,0x78,0x5, 0x7e,0xb3,0x10,0xa5,0x22,0xbe,0xa0,0xfd,0x78, +0x8, 0x7e,0x37,0x10,0x46,0x7e,0x39,0xb0,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3, +0x10,0x4a,0x22,0xbe,0xa0,0xf9,0x78,0x5, 0x7e,0xb3,0x16,0xbc,0x22,0xbe,0xa0,0xfa, +0x78,0x3, 0xe5,0x6a,0x22,0xe4,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10, +0x4d,0xf5,0x24,0xe4,0x7a,0xb3,0x10,0x4d,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e, +0x34,0x10,0x2b,0x12,0x6a,0x64,0x75,0x21,0x0, 0x12,0x69,0x23,0x12,0x6e,0x78,0x60, +0xfb,0xa9,0xb7,0xea,0x7d,0x36,0x7d,0x27,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x75, +0x22,0x0, 0x80,0x36,0x75,0x23,0x0, 0x80,0x26,0x7e,0x51,0x22,0x74,0x18,0xac,0x5b, +0xe5,0x23,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, +0x14,0xe, 0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x23,0x7e, +0x73,0x10,0x2c,0xbe,0x71,0x23,0x38,0xd1,0x5, 0x22,0x7e,0x73,0x10,0x2b,0xbe,0x71, +0x22,0x38,0xc1,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x4, 0x40,0x9d,0xe5,0x24,0x7a,0xb3, +0x10,0x4d,0xda,0x3b,0x22,0xca,0xf8,0x30,0x90,0x58,0xc2,0x90,0x5, 0xa, 0xe5,0xa, +0xb4,0x1, 0x6, 0xe5,0x91,0xf5,0xf, 0x80,0x29,0xe5,0xb, 0xc4,0x7c,0xfb,0x5e,0xf0, +0x7, 0x78,0xe, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x56,0x6d,0x80, +0x11,0xbe,0xf0,0x4, 0x78,0xc, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12, +0x15,0xe2,0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, +0x12,0x53,0x28,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e, +0xf5,0x91,0x30,0x91,0x28,0xc2,0x91,0x5, 0x9, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50, +0x7, 0xa5,0xbd,0x0, 0xb, 0xe5,0x9, 0x25,0xf, 0x12,0x53,0x28,0xf5,0x91,0x80,0xd, +0xa5,0xbd,0x4, 0x9, 0xe5,0x9, 0x25,0xf, 0x12,0x27,0x2e,0xf5,0x91,0xda,0xf8,0x22, +0x6c,0x33,0xbe,0x30,0x18,0x50,0x1e,0xa, 0x3, 0x2e,0x7, 0x10,0x35,0x7e,0x9, 0xa0, +0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80, +0x16,0x1e,0xa0,0x80,0x12,0xa, 0x3, 0x2e,0x7, 0x10,0x33,0x9, 0x20,0xff,0xe8,0xa, +0x52,0x2e,0x54,0x0, 0x18,0x7c,0xab,0x7e,0x23,0x10,0x3a,0xbe,0x20,0x3, 0x28,0xe, +0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x21,0xa, 0x42, +0x2e,0x44,0x0, 0xc, 0x7e,0x4, 0x0, 0xf, 0x9d,0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac, +0x1a,0x2d,0x2, 0xb, 0x8, 0x0, 0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e, +0x44,0x7f,0xff,0x9d,0x40,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x3, 0x1b,0x8, 0x40,0xb, +0x30,0xbe,0x30,0x25,0x50,0x3, 0x2, 0x54,0xd2,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac, +0x5a,0x7d,0x32,0x2e,0x37,0xf, 0xd6,0xb, 0x38,0x10,0xbe,0x17,0xe, 0x7, 0x8, 0x12, +0x7d,0x2, 0x2e,0x7, 0xf, 0xd4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30, +0x80,0x18,0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x27,0xf, 0xd4, +0xb, 0x28,0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78, +0xbb,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xe, 0x7, +0x8, 0x12,0x7d,0x2, 0x2e,0x4, 0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b, +0x8, 0x30,0x80,0x18,0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x24, +0x8, 0xe4,0xb, 0x28,0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0, +0x25,0x40,0xc0,0x22,0xca,0x69,0xca,0xf8,0x6c,0x11,0x7e,0xd0,0x7, 0xac,0xd1,0x9, +0x6, 0xe, 0x9d,0x5e,0x0, 0xf, 0x49,0xf6,0xe, 0x9b,0xbe,0xf4,0x5, 0xa, 0x40,0x3c, +0x49,0x46,0xe, 0x99,0x7d,0x34,0x12,0x6b,0x9d,0x7c,0xfb,0xbe,0xf0,0x3, 0x40,0xe, +0x7e,0x14,0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x3e,0x74,0x2, +0xac,0xbf,0x49,0x45,0x0, 0xf8,0x74,0x7, 0xac,0xb1,0x59,0x45,0xe, 0x99,0x7e,0x14, +0x7, 0xd0,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x25,0xbe,0xf4,0x5, 0x0, +0x40,0x1f,0x7e,0x14,0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x74,0x7, +0xac,0xb1,0x49,0x15,0xe, 0x9b,0xbe,0x14,0x5, 0xa, 0x40,0x5, 0x7c,0xb0,0x12,0x68, +0x3d,0xb, 0x10,0xbe,0x10,0xa, 0x40,0x82,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x70, +0x41,0x7e,0x74,0x0, 0xb, 0x7a,0x79,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0xa5,0xbf,0x4, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70, +0x3, 0x80,0x13,0x74,0x27,0x7e,0x70,0x3, 0x80,0x4b,0x7e,0xb3,0x10,0xa5,0xb4,0x3, +0xa, 0x74,0x1, 0x7e,0x70,0x1, 0x12,0x0, 0x5e,0x80,0x45,0x74,0x27,0x7e,0x70,0x1, +0x80,0x33,0xbe,0xb0,0xfc,0x68,0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa,0x5, 0x7e,0x60, +0x5, 0x80,0x10,0xa5,0xbf,0x55,0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5,0xbf,0x66,0x20, +0x7e,0x60,0x7, 0x74,0x27,0x7c,0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0, +0xdf,0x38,0x7, 0x24,0x80,0x12,0x6d,0x9f,0x80,0x6, 0xb4,0xfe,0x3, 0x7a,0x71,0xc, +0xda,0x79,0x22,0x6c,0x77,0x6c,0xaa,0x80,0x3c,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24, +0x2e,0x27,0xf, 0xda,0x2e,0x24,0x0, 0x30,0x7d,0x12,0x1b,0x16,0xb, 0x18,0x40,0xbe, +0x44,0x0, 0x3c,0x8, 0x1e,0x7e,0x14,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0x14,0x14, +0x78,0xfb,0x5e,0x14,0x4, 0x44,0x68,0xb, 0x1b,0x25,0xb, 0x28,0x20,0xbd,0x42,0x8, +0x2, 0xb, 0x70,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xbc,0xbe,0x70,0x1, +0x40,0x30,0x6c,0xaa,0x80,0x24,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, +0xda,0x2e,0x24,0x0, 0x30,0x1b,0x25,0xb, 0x28,0x30,0x7e,0x30,0x2, 0xac,0x3a,0x59, +0x31,0x0, 0xd2,0x6d,0x33,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba, +0x38,0xd4,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x63,0x7c,0xbe,0xc4,0x23,0x54, +0x1f,0x7c,0xab,0x7c,0xbe,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0xa, 0x2a,0x9, 0xb2,0xd, 0x68,0x5c,0xb7,0x68,0x40,0x7e,0x50,0x2, 0xac, +0x5e,0x2e,0x24,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x34,0xd, 0x18,0x7e,0x14, +0x0, 0x2, 0x12,0x6d,0x3c,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbf,0x54, +0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x4a,0x2e,0x44, +0xd, 0x68,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xe0,0x7e,0x63, +0xd, 0xf7,0xbc,0x6e,0x38,0x95,0x7a,0xf3,0xd, 0xf7,0xda,0x79,0x22,0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x7e,0xb3, +0x10,0xa5,0x24,0xfa,0x68,0x17,0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x0, +0xfe,0xbe,0xb0,0x5, 0x68,0x4c,0x74,0x5, 0x7a,0xb3,0x0, 0xfe,0x22,0x7e,0xb3,0x0, +0xfe,0xb4,0x5, 0x3e,0x74,0x6, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x25,0x75, +0x9a,0x80,0x7e,0x34,0x77,0xf8,0x12,0x69,0xa1,0x7e,0x34,0x77,0xf8,0x74,0x66,0x12, +0x59,0xb7,0x7e,0x34,0x77,0xf9,0x74,0xbb,0x12,0x59,0xb7,0x80,0x12,0x7e,0xb3,0x0, +0xfe,0xb4,0x5, 0xe, 0x74,0x7, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x25,0x75, +0xe9,0xff,0x22,0x0, 0x0, 0x0, 0x0, 0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x16,0xac, +0xb4,0x1, 0x14,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20, +0xe4,0x7a,0xb3,0x16,0xac,0x80,0xb, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xd0,0xca,0xc2,0xa8,0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x16,0xb3,0x7e, +0xb3,0x16,0xb3,0x70,0xfa,0x12,0x6e,0x6f,0x12,0x61,0x24,0x12,0x6b,0xbe,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x12, +0x6a,0x18,0x12,0x6a,0x3e,0x12,0x52,0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3, +0x10,0x4d,0x2, 0x6e,0xb3,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xe5,0x55,0xbe,0xb0,0x1, +0x68,0xf9,0x7d,0x36,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6d,0xe0,0x7d,0x37,0x7e,0x24, +0x0, 0x4a,0xe4,0x12,0x6d,0xe0,0x75,0x21,0x1, 0x12,0x6b,0xde,0xe5,0x55,0xbe,0xb0, +0x1, 0x68,0xf9,0x75,0x22,0x0, 0x7e,0x51,0x22,0x74,0x2, 0xac,0x5b,0x49,0x2, 0xa, +0x62,0x1e,0x4, 0x1e,0x4, 0x7d,0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d,0x30,0x1b,0x18, +0x30,0x49,0x12,0xa, 0x18,0x1e,0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31, +0x1b,0x28,0x30,0x5, 0x22,0xe5,0x22,0xb4,0x25,0xcc,0x5, 0x21,0xe5,0x21,0xbe,0xb0, +0x5, 0x40,0xb6,0xda,0x3b,0x22,0x6c,0x77,0x7e,0x63,0xd, 0xfa,0xa, 0x16,0x7e,0x63, +0xd, 0xf9,0xa, 0x26,0x2d,0x21,0xbe,0x24,0x0, 0xb4,0x28,0x3, 0x74,0x1, 0x22,0x6c, +0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0x9a,0xbe,0x24,0x3, 0x84, +0x8, 0x9, 0xb, 0x70,0xbe,0x70,0x10,0x68,0xe, 0x80,0x2, 0x6c,0x77,0xb, 0xa0,0x7e, +0x63,0x10,0x2c,0xbc,0x6a,0x38,0xdc,0xa5,0xbf,0x10,0x2a,0x6c,0x77,0x6c,0xaa,0x80, +0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0xca,0xbe,0x24,0x7, 0xd0,0x8, 0x9, +0xb, 0x70,0xa5,0xbf,0x8, 0x5, 0x74,0x1, 0x22,0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10, +0x2b,0xbc,0x6a,0x38,0xdc,0xe4,0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb, +0x75,0xfb,0xa5,0x75,0xfb,0xf, 0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68,0x18,0xbe, +0x34,0x73,0xf9,0x68,0x12,0xbe,0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, 0xd2,0xaf, +0xc2,0xc9,0xa9,0xc5,0xcb,0xe4,0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c,0xb7,0x54, +0xfe,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75, +0xf6,0xff,0x7a,0xa1,0xf6,0x80,0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75,0xf5,0x80, +0x74,0x1, 0x12,0x6d,0x25,0xa9,0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9, +0xa9,0xc5,0xcb,0x74,0x1, 0x22,0x74,0xa, 0x7a,0xb3,0xf, 0x46,0x74,0x14,0x7a,0xb3, +0xf, 0x47,0x7e,0x34,0x3, 0x20,0x7a,0x37,0xf, 0x48,0x7a,0x37,0xf, 0x4a,0x7e,0x24, +0x1, 0xf4,0x7a,0x27,0xf, 0x4c,0x7a,0x37,0xf, 0x4e,0x7a,0x37,0xf, 0x50,0x74,0xc, +0x7a,0xb3,0xf, 0x52,0x74,0x8, 0x7a,0xb3,0xf, 0x53,0x7e,0x34,0x0, 0x3c,0x7a,0x37, +0xf, 0x54,0x7a,0x37,0xf, 0x56,0x7a,0x37,0xf, 0x58,0x7e,0x34,0x0, 0x28,0x7a,0x37, +0xf, 0x5a,0x74,0xf, 0x7a,0xb3,0xf, 0x5c,0xe4,0x7a,0xb3,0xf, 0x5f,0x74,0x4, 0x7a, +0xb3,0xf, 0x60,0x7e,0x34,0x0, 0x64,0x7a,0x37,0xf, 0x61,0x7e,0x34,0xa, 0x0, 0x7a, +0x37,0xf, 0x5d,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x3c,0xf5,0x1d, +0xe4,0x7a,0xb3,0x10,0x3c,0x7d,0x36,0x7d,0x27,0x12,0x6a,0x89,0x7e,0x34,0x10,0x2b, +0x12,0x5b,0x2, 0x75,0x1b,0x0, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81, +0x60,0xfb,0x7d,0x36,0x7e,0x25,0x70,0x12,0x54,0xd0,0x75,0x1c,0x0, 0x7e,0x51,0x1c, +0x74,0x2, 0xac,0x5b,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d, +0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x1c,0xe5,0x1c,0xb4,0x25,0xdd, +0x5, 0x1b,0xe5,0x1b,0xbe,0xb0,0x4, 0x40,0xbd,0xe5,0x1d,0x7a,0xb3,0x10,0x3c,0xda, +0x3b,0x22,0x7d,0x3, 0x75,0xcc,0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0, +0xe5,0xca,0x54,0x1, 0x4c,0xba,0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1, +0xe1,0x9, 0x70,0x0, 0xe, 0x2e,0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c, +0xba,0xc4,0x33,0x54,0xe0,0x7c,0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, +0xb0,0x0, 0x13,0x54,0x3, 0xa, 0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5, +0xe3,0x54,0xe7,0x4c,0xba,0xf5,0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12, +0x5c,0xfb,0x9, 0xb0,0x0, 0x14,0xf5,0xe7,0x22,0x7e,0xb3,0x16,0xac,0x70,0x17,0xe5, +0xcc,0x7a,0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xaf, +0x74,0x1, 0x7a,0xb3,0x16,0xac,0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc, +0xc2,0xca,0xc2,0xc8,0xa9,0xc4,0xcb,0x80,0x2e,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0x23, +0xe5,0x75,0xb4,0x1, 0x1e,0xe5,0x76,0xb4,0x1, 0x19,0xa9,0xc3,0xcb,0x7e,0x24,0x0, +0x1, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3, +0xc9,0xc2,0xcd,0xe4,0x12,0x6d,0x69,0x7e,0xb3,0x16,0xb0,0x60,0xcc,0x22,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcc,0x12, +0x6e,0x6f,0x12,0x61,0x24,0x12,0x6e,0xd5,0x12,0x6d,0x7b,0x74,0x1, 0x7a,0xb3,0x10, +0xa5,0x12,0x6b,0xbe,0x12,0x6a,0x18,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10, +0x4d,0x12,0x6e,0xb3,0x7e,0xb3,0x10,0xa5,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14, +0x68,0x16,0x14,0x68,0x13,0x24,0x5, 0x78,0xeb,0x12,0x41,0x6b,0x80,0xe6,0x12,0x5e, +0x70,0x80,0xe1,0x12,0x69,0xf1,0x80,0xdc,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x12,0x57, +0xed,0x80,0xd1,0x7c,0xa5,0x7c,0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36, +0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2, +0x1e,0xb0,0x1e,0xb0,0x54,0xf, 0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44, +0x1e,0x50,0x1e,0x50,0x1e,0x50,0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd, +0xa, 0x50,0xf5,0xc1,0x7c,0xb3,0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0, +0x43,0xc2,0x7, 0x80,0x7, 0x43,0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5, +0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, +0xac,0x13,0x2e,0x4, 0x1c,0x3a,0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c, +0x33,0x80,0x43,0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0, +0xb, 0x2d,0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, +0xb0,0x54,0x1f,0xa, 0xfb,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c, +0xb2,0x1e,0xb0,0x7e,0x90,0x2, 0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d, +0xf, 0x1b,0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, +0x9, 0xb2,0x0, 0xc, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54, +0x7f,0xf5,0xe5,0x75,0xe4,0x7, 0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4, +0xb, 0x6c,0xaa,0xa, 0x1a,0x49,0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5, +0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39, +0xb0,0xf5,0xe5,0x75,0xe4,0x31,0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff, +0xf5,0xe5,0x75,0xe4,0x32,0x5e,0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0xca,0x79, +0x7e,0x71,0x54,0x3e,0x70,0x3e,0x70,0x7c,0xb7,0x24,0x56,0xa, 0x2b,0xb, 0x28,0x50, +0x7c,0xab,0x7c,0xb7,0x24,0x58,0xa, 0x3b,0xb, 0x38,0x70,0x4d,0x77,0x68,0x1f,0xbe, +0xa0,0x1, 0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34, +0x10,0x2b,0x12,0x6b,0x17,0x7d,0x37,0x7e,0x24,0x18,0x0, 0x12,0x54,0xd0,0x5, 0x54, +0xe5,0x53,0xbe,0xb1,0x54,0x28,0x10,0x12,0x62,0x6b,0xb4,0x1, 0x5, 0x75,0x55,0x1, +0x80,0x8, 0x75,0x55,0x3, 0x80,0x3, 0x75,0x55,0x2, 0xda,0x79,0x22,0x6d,0x11,0x7e, +0x24,0x1c,0x1c,0x1b,0x28,0x10,0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, +0xa3,0x0, 0x50,0x80,0x2, 0x7c,0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e, +0x19,0x40,0xa, 0x14,0x7e,0x4, 0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, +0x14,0x1b,0x8, 0x10,0x49,0x13,0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b, +0x8, 0x10,0x49,0x13,0x0, 0x43,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10, +0xb, 0x50,0xbe,0x50,0xd, 0x40,0xb1,0x22,0x75,0x9, 0x0, 0xe5,0xb, 0xc4,0x7c,0x5b, +0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53,0x28,0xf5,0x91,0x80,0xb, +0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e,0xf5,0x91,0x75,0xa, 0x0, 0xe4,0x7a, +0xb3,0x16,0x4e,0x7e,0x34,0x15,0xca,0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0, +0x7e,0x34,0x16,0xc, 0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0,0x74,0xaa,0x7a, +0xb3,0x15,0xca,0x7a,0xb3,0x15,0xcb,0x7a,0xb3,0x16,0xc, 0x7a,0xb3,0x16,0xd, 0x22, +0xca,0xf8,0x74,0x3, 0x7a,0xb3,0x16,0xa3,0xe4,0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10, +0x4d,0x74,0x3, 0x7a,0xb3,0x16,0xa3,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, +0xac,0x7a,0x37,0xa, 0xaf,0x7e,0xf3,0x16,0xa3,0xbe,0xf0,0x3, 0x78,0x1d,0xe5,0xb, +0x30,0xe7,0xe4,0x12,0x6a,0xf4,0x7e,0x37,0xf, 0xd6,0x7a,0x37,0x16,0xa0,0x7e,0x37, +0xf, 0xda,0x7a,0x37,0x16,0x9e,0x53,0xb, 0x7f,0x80,0xcc,0x7a,0xf3,0x10,0xa5,0x12, +0x0, 0x1e,0x12,0x0, 0x6a,0xda,0xf8,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5, +0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5, +0xbc,0x7c,0xb3,0xf5,0xbd,0xa, 0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5, +0xc3,0xe5,0xc4,0x54,0xe0,0x4c,0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23, +0x4e,0x24,0x0, 0x1, 0x7c,0x15,0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2, +0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x6c, +0xaa,0x6c,0x77,0x7e,0x10,0x30,0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d, +0x1, 0x2e,0x7, 0xf, 0xda,0xb, 0x8, 0x20,0xbe,0x27,0xe, 0x5, 0x8, 0x12,0x7d,0x41, +0x2e,0x47,0xf, 0xd8,0xb, 0x48,0x0, 0x2e,0x7, 0xe, 0x5, 0x1b,0x48,0x0, 0x80,0x18, +0x6d,0x0, 0x9e,0x7, 0xe, 0x5, 0xbd,0x20,0x58,0xe, 0x2e,0x17,0xf, 0xd8,0xb, 0x18, +0x20,0x9e,0x27,0xe, 0x5, 0x1b,0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0, +0xbe,0xa0,0xd, 0x40,0xac,0x22,0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, +0x31,0x7e,0x79,0x50,0xa5,0xbd,0x0, 0xb, 0x7e,0xd, 0x31,0x7e,0xb, 0x40,0x7a,0x79, +0x40,0x80,0x36,0x7e,0xd, 0x31,0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12, +0x6d,0xd0,0xa, 0x2c,0xbd,0x32,0x8, 0x18,0x7e,0x1d,0x31,0x7e,0x1b,0xb0,0x7e,0x79, +0xa0,0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0, +0x7e,0x79,0x30,0x7e,0x1d,0x31,0x7a,0x1b,0x30,0xda,0x3b,0x22,0x7e,0xb3,0x10,0x39, +0xb4,0x1, 0x26,0x7e,0x73,0xa, 0xac,0x7a,0x73,0x10,0x37,0x7e,0x73,0xa, 0xad,0x7a, +0x73,0x10,0x38,0x7e,0x73,0xa, 0xae,0x7a,0x73,0x10,0x3a,0x7e,0x34,0xd, 0xfe,0x7a, +0x37,0x10,0x46,0x7e,0x34,0xf, 0xdc,0x80,0x24,0x7e,0x73,0x11,0x16,0x7a,0x73,0x10, +0x37,0x7e,0x73,0x11,0x49,0x7a,0x73,0x10,0x38,0x7e,0x73,0x11,0x94,0x7a,0x73,0x10, +0x3a,0x7e,0x34,0x11,0x9d,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, 0x63,0x7a,0x37,0x10, +0x48,0x22,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x75,0x60,0xfc,0xe5,0x76,0x60, +0xfc,0x20,0x93,0xfd,0xd2,0x96,0xd2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e, +0xb3,0x16,0xac,0x70,0x17,0xe5,0xcc,0x7a,0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, +0x38,0x30,0x7a,0x73,0x16,0xaf,0x74,0x1, 0x7a,0xb3,0x16,0xac,0xa9,0xc0,0xca,0x7e, +0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9, +0xc2,0xcd,0x75,0x87,0x2, 0x0, 0x0, 0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d, +0x32,0x2e,0x37,0xf, 0xd6,0xb, 0x38,0x10,0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x2d, +0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x9, 0x2e,0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e, +0x24,0x3, 0x70,0x74,0x18,0x7e,0x13,0x10,0x2b,0x6c,0x0, 0x2, 0x5e,0xc8,0x9, 0xa3, +0x0, 0x24,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43, +0xcc,0x8, 0x9, 0x53,0x0, 0x2, 0x3e,0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca, +0xa9,0xd0,0xca,0xd2,0xcd,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9, +0xc0,0xc9,0x7e,0x14,0x1d,0x0, 0xb, 0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20, +0x9, 0xb3,0x0, 0x3f,0xb4,0x1, 0xc, 0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54, +0xf0,0xf5,0xe5,0x22,0x12,0x4b,0x78,0x12,0x3b,0x1c,0x12,0x68,0x9d,0x7e,0x34,0x8, +0x50,0x7a,0x37,0xf, 0xd4,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x7e,0x34,0x8, +0x9a,0x7e,0x27,0xf, 0xd4,0x12,0x6a,0x89,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xf, 0xd8, +0x7e,0x34,0x3, 0x70,0x7a,0x37,0xf, 0xda,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xf, 0xd8, +0x12,0x67,0xa7,0x12,0x64,0xec,0x12,0x5a,0x26,0x12,0x6a,0x3e,0x12,0x52,0x8, 0x12, +0x6e,0x52,0x74,0x1, 0x7a,0xb3,0x11,0x96,0x22,0xca,0xf8,0x7e,0xb3,0xf, 0xd2,0xb4, +0x1, 0x48,0x6c,0xff,0x80,0x3c,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, +0xac,0xbf,0x9, 0xb5,0xa, 0xb1,0x7e,0x53,0x10,0x2b,0x12,0x35,0x22,0x74,0x4, 0xac, +0xbf,0x59,0x35,0xb, 0x86,0x7e,0x37,0xf, 0xd6,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, +0xb2,0x7e,0x53,0x10,0x2c,0x12,0x35,0x22,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x88, +0xb, 0xf0,0x7e,0x73,0xd, 0x16,0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0xca,0x69,0xca, +0xf8,0x7c,0xfb,0x7e,0x24,0x0, 0x4, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24, +0x56,0xa, 0x3b,0x1b,0x38,0x20,0x6d,0x66,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38, +0x60,0xb, 0xf0,0x12,0x0, 0x6e,0x50,0x1e,0x7e,0x24,0x0, 0x5, 0x7c,0xaf,0x3e,0xa0, +0x3e,0xa0,0x7c,0xba,0x24,0x56,0xa, 0x3b,0x1b,0x38,0x20,0x7c,0xba,0x24,0x58,0xa, +0x3b,0x1b,0x38,0x60,0xb, 0xf0,0x7c,0xbf,0xda,0xf8,0xda,0x69,0x22,0x7e,0x47,0x16, +0x65,0x6c,0x77,0x7e,0xa0,0xff,0x7e,0x43,0x16,0x54,0xa, 0x14,0x9, 0x51,0xf, 0x29, +0xbe,0x53,0x10,0x4a,0x78,0x32,0x7e,0x50,0x12,0xac,0x45,0x49,0x22,0x16,0x65,0xbe, +0x24,0x0, 0x41,0x40,0x23,0x7e,0x60,0x1, 0xbe,0x44,0x0, 0x19,0x40,0x18,0x7e,0x30, +0x12,0xac,0x36,0x49,0x21,0x16,0x65,0xbd,0x24,0x50,0x4, 0x7d,0x42,0x7c,0x76,0xb, +0x60,0xbe,0x60,0x4, 0x40,0xe2,0x7c,0xa7,0x7c,0xba,0x22,0xca,0x79,0xe5,0x53,0xbe, +0xb1,0x54,0x38,0x4, 0x6c,0xff,0x80,0x3a,0xe5,0x54,0x3e,0xb0,0x3e,0xb0,0x24,0x56, +0xa, 0x3b,0xb, 0x38,0x30,0x7c,0xe7,0xbe,0xe0,0x1, 0x68,0xe, 0xbe,0xe0,0x2, 0x68, +0x9, 0xbe,0xe0,0x3, 0x68,0x4, 0x4c,0xee,0x78,0x7, 0x7c,0xbe,0x12,0x63,0x2, 0x7c, +0xfb,0xbe,0xe0,0x4, 0x68,0x5, 0xbe,0xe0,0x5, 0x78,0x7, 0x7c,0xbe,0x12,0x51,0x77, +0x7c,0xfb,0x7c,0xbf,0xda,0x79,0x22,0x7e,0xa3,0xd, 0xf7,0xbe,0xa0,0x0, 0x28,0x40, +0x6c,0x77,0x80,0x38,0x7e,0x50,0x2, 0xac,0x57,0x9, 0x62,0xd, 0x18,0x9, 0x52,0xd, +0x19,0x7e,0x30,0x2, 0xac,0x36,0x49,0x1, 0x11,0xce,0x7e,0x17,0xf, 0x4a,0xe, 0x14, +0xbd,0x1, 0x48,0x13,0x7e,0x30,0x2, 0xac,0x35,0x49,0x1, 0x11,0x9e,0x7e,0x17,0xf, +0x4c,0xe, 0x14,0xbd,0x1, 0x58,0x3, 0x74,0x1, 0x22,0xb, 0x70,0xbc,0xa7,0x38,0xc4, +0xe4,0x22,0xca,0xf8,0x7c,0xfb,0xbe,0xf0,0x1, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xf0, +0x2, 0x68,0x4, 0x4c,0xff,0x78,0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x39,0x80,0x3, 0xe4, +0x80,0x28,0x12,0x5f,0xcc,0x4c,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x10,0x3a,0x74,0x1e, +0x7a,0xb3,0x10,0x37,0x74,0xa, 0x7a,0xb3,0x10,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5b, +0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x74,0x1, 0xda,0xf8,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x75,0x75,0x1, 0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x60,0x2, 0x1b,0x28, +0x30,0xb, 0x28,0x30,0x4e,0x70,0x2, 0x1b,0x28,0x30,0xe5,0x55,0xb4,0x1, 0x3, 0x12, +0x5d,0x5e,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b, +0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9, +0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc, +0x7a,0xa1,0xc3,0x75,0xc5,0x40,0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, +0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x3b, +0xe5,0xc6,0xa, 0x2b,0x7c,0x45,0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22,0xe4,0x7a, +0xb3,0x15,0x9f,0x7a,0xb3,0x15,0x53,0x7a,0xb3,0x15,0x9e,0x7a,0xb3,0x15,0xa0,0x7a, +0xb3,0x15,0xa1,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x48,0x12,0x6d,0xe0,0x7e,0x34, +0x14,0xe3,0x7e,0x24,0x0, 0x48,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x15,0x56,0x7e,0x24, +0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x46,0x74, +0xff,0x2, 0x6d,0xe0,0xd2,0xcd,0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e, +0xb3,0x16,0xac,0xb4,0x1, 0x15,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, +0x1b,0x38,0x20,0x7e,0xb3,0x16,0xad,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e, +0x34,0x1d,0x8, 0x1b,0x38,0x20,0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x16,0xac,0x22,0x7c,0xab,0x6c,0x33,0x80,0x36, +0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d, +0x3, 0x7e,0x9, 0x10,0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e, +0x20,0x1e,0x20,0x7e,0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d, +0xf, 0x1b,0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x75,0x76,0x0, 0x75,0xe4, +0x3, 0x49,0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, +0x5e,0x24,0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5, +0x75,0xe4,0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9, +0xd6,0xea,0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1,0x22,0x7e,0x34,0x1, 0x90, +0x7a,0x37,0xd, 0xff,0x7e,0x34,0x0, 0x19,0x7a,0x37,0xe, 0x1, 0x7e,0x34,0x0, 0x9c, +0x7a,0x37,0xe, 0x3, 0x7e,0x34,0x0, 0x2, 0x7a,0x37,0xe, 0x5, 0x7a,0x37,0xe, 0x7, +0x74,0x1, 0x7a,0xb3,0xe, 0x9, 0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, +0x7e,0x34,0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x2, 0x6d,0xe0,0xca,0xf8,0x7e,0x24, +0xe, 0xd, 0x7e,0x34,0xe, 0x99,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x6c,0xff,0x74, +0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x12,0x4c,0xf7,0x74,0x7, 0xac,0xbf,0x59,0x35, +0xe, 0x99,0x49,0x35,0xe, 0xf, 0x12,0x4a,0xa6,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, +0x9b,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xd7,0xda,0xf8,0x22,0x6d,0x33,0x6c,0xaa,0x80, +0x2e,0x7e,0x30,0x2, 0xac,0x3a,0x9, 0x51,0xd, 0x18,0x9, 0x41,0xd, 0x19,0x7e,0x10, +0x30,0xac,0x15,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xf, 0xda,0xb, 0x18, +0x40,0xbe,0x44,0x0, 0x0, 0x8, 0x6, 0xbd,0x43,0x8, 0x2, 0x7d,0x34,0xb, 0xa0,0x7e, +0xb3,0xd, 0xf7,0xbc,0xba,0x38,0xca,0x22,0xca,0x79,0x7d,0x41,0x7d,0x13,0x6d,0x0, +0x7e,0x34,0x7f,0xff,0x6c,0xaa,0x80,0x1b,0x7e,0xf0,0x7, 0xac,0xfa,0x7d,0xe7,0x2d, +0xe4,0x49,0xfe,0x0, 0x2, 0xbd,0xf0,0x28,0x2, 0x7d,0xf, 0xbd,0xf3,0x50,0x2, 0x7d, +0x3f,0xb, 0xa0,0x9, 0xb4,0x0, 0x46,0xbc,0xba,0x38,0xdd,0x1b,0x18,0x0, 0x1b,0x28, +0x30,0xda,0x79,0x22,0xca,0xf8,0x7e,0xb3,0x10,0x4e,0x60,0x3, 0xb4,0x1, 0x2d,0xa9, +0xc6,0xea,0x12,0x2b,0xa0,0x7c,0xfb,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12, +0x67,0xa7,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x53,0xb7,0xbe,0xf0,0x1, +0x78,0x4, 0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0x10,0x4e,0xda,0xf8,0x22,0x7e, +0xb3,0x16,0x54,0x4, 0x7a,0xb3,0x16,0x54,0x7e,0x73,0x16,0x54,0xbe,0x70,0x4, 0x40, +0x5, 0xe4,0x7a,0xb3,0x16,0x54,0x7e,0xa3,0x16,0x54,0xbe,0xa0,0x3, 0x78,0x13,0x7e, +0xb3,0x16,0x9d,0x4, 0x7a,0xb3,0x16,0x9d,0xbe,0xb0,0x8, 0x40,0x5, 0xe4,0x7a,0xb3, +0x16,0x9d,0xa, 0x3a,0x9, 0xb3,0xf, 0x29,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d, +0x21,0x7d,0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x3c,0x7e,0xb3,0x10,0x3c,0xb4,0x1, +0x1f,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d, +0x26,0xb, 0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3, +0xda,0x3b,0x22,0x7e,0xb3,0x10,0x3d,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3, +0x10,0x39,0x12,0x5f,0xcc,0x12,0x2d,0xb5,0xe4,0x7a,0xb3,0x10,0x39,0x12,0x5f,0xcc, +0x12,0x2d,0xb5,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x17,0x7e,0x37,0xf, 0xd4,0x7e,0x24, +0x8, 0xe4,0x12,0x58,0xd5,0x74,0x2, 0x7a,0xb3,0x10,0x3d,0x22,0x7e,0xa3,0xf, 0x1c, +0xbe,0xa0,0x0, 0x38,0x2f,0xbe,0xa3,0xf, 0x1b,0x50,0x19,0x7e,0xb3,0xf, 0x25,0xbe, +0xb3,0x12,0x33,0x28,0x14,0x7e,0xb3,0x12,0x33,0x4, 0x7a,0xb3,0x12,0x33,0x7a,0xa3, +0xf, 0x1b,0x80,0x5, 0xe4,0x7a,0xb3,0x12,0x33,0x7e,0xb3,0xf, 0x1b,0x70,0x5, 0xe4, +0x7a,0xb3,0xf, 0x24,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca, +0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12, +0x54,0x45,0x74,0x1, 0x7a,0xb3,0x16,0x4e,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, +0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x75,0x76,0x1, 0x75,0xe6,0x0, 0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0x5e,0xd0, +0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda, +0x6b,0xda,0x7b,0x32,0xca,0xf8,0x7d,0x1, 0x7d,0x13,0x7e,0xf3,0x10,0x4d,0xbe,0xf0, +0x1, 0x78,0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x2, 0x80,0x11, +0x4c,0xff,0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, +0x4, 0x12,0x5e,0xc8,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0xf, 0xd3,0x6c,0xaa,0x6c,0x33, +0x6d,0xff,0x7e,0x10,0x18,0xac,0x1a,0xa, 0xe3,0x2d,0xe, 0x3e,0x4, 0x7d,0x40,0x2d, +0x42,0x1b,0x48,0xf0,0x6d,0x44,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x18, +0xdf,0xb, 0xa0,0xbe,0xa0,0xd, 0x40,0xd6,0x22,0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c, +0x33,0x4c,0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d, +0x30,0x80,0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe, +0x30,0x3, 0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, +0x2a,0x2d,0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x7e,0x24, +0xff,0xff,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x14,0x2d, +0x13,0x59,0x21,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd1,0x22,0x7c,0xab,0x7e, +0x24,0xe, 0xdf,0xbe,0xa0,0xa, 0x50,0x25,0xa, 0x3a,0x7d,0x13,0x2d,0x12,0x7e,0x19, +0xb0,0xb4,0x2, 0xe, 0x74,0x1, 0x7a,0x19,0xb0,0x74,0x3, 0x2d,0x23,0x19,0xb2,0x0, +0xa, 0x22,0x74,0x3, 0x7a,0x19,0xb0,0x2d,0x32,0x19,0xb3,0x0, 0xa, 0x22,0xca,0x7b, +0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83, +0xc0,0x82,0x12,0x6e,0x5c,0x53,0xb, 0xfd,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, +0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x6d,0x33,0x7a, +0x37,0x11,0xd, 0x74,0x1, 0x7a,0xb3,0x11,0xf, 0x74,0xb, 0x7a,0xb3,0x11,0x10,0x74, +0x9, 0x7a,0xb3,0x11,0x11,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x7a,0xb3,0x11,0x13,0x7a, +0xb3,0x11,0x14,0x74,0x1, 0x7a,0xb3,0x11,0x15,0x22,0x7e,0xb3,0xf, 0x1b,0x70,0x1e, +0x7e,0xa3,0xf, 0x1c,0xbe,0xa0,0x0, 0x28,0x15,0xe5,0x16,0x70,0xd, 0x7a,0xa3,0xf, +0x1b,0x74,0x1, 0x7a,0xb3,0xf, 0x22,0x5, 0x16,0x22,0x75,0x16,0x0, 0x22,0x75,0x16, +0x0, 0xe4,0x7a,0xb3,0xf, 0x22,0x22,0x6c,0xaa,0x80,0x1f,0x7e,0x70,0x2, 0xac,0x7a, +0x49,0x23,0x0, 0xd2,0x7e,0x70,0x18,0xac,0x7a,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e, +0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba, +0x38,0xd9,0x22,0x75,0x75,0x0, 0xa9,0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30, +0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x2, +0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, 0x5e, +0x0, 0xa, 0x0, 0x96,0x1, 0x2c,0x0, 0x8, 0x0, 0x78,0x0, 0xfa,0x0, 0x7, 0x0, 0x50, +0x0, 0xc8,0x0, 0x6, 0x0, 0x32,0x0, 0xa0,0x0, 0x4, 0x0, 0x1e,0x0, 0x78,0x0, 0x3, +0x0, 0xa, 0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0xf5, +0xf1,0x7c,0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9,0x37, +0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5,0xcb, +0x22,0xc2,0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x3e,0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, 0x12, +0x6d,0x25,0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x12,0x22,0x20,0x12,0x3d,0xb5, +0x12,0x4c,0x41,0x60,0x6, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x7e,0xb3,0xe, 0xb, 0x60, +0x3, 0x12,0x60,0x78,0x7e,0xb3,0xe, 0xc, 0x60,0x6, 0x12,0x55,0x5a,0x2, 0x5f,0x1f, +0x22,0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0xf, 0x28,0x12,0x6a, +0x18,0xb4,0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x53,0xb, 0x8f,0x74,0x2, 0x80, +0x2, 0x74,0xff,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x66,0x93, +0x7e,0xb3,0x10,0x3d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x65,0xe4,0x7e,0xb3, +0x10,0x4e,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x34, +0xa, 0xb1,0x7e,0x24,0x3, 0x4d,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0xb, 0x86,0x7e,0x24, +0x1, 0x90,0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0xd, 0x6b,0x7e,0x24,0x0, 0x8c,0x74, +0xff,0x2, 0x6d,0xe0,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51,0x80, +0x3, 0x7e,0x39,0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23,0x0, +0x3b,0x7e,0x34,0x1d,0x6, 0x1b,0x38,0x20,0x22,0xe4,0x7a,0xb3,0xf, 0xd2,0x6c,0xaa, +0x6d,0x44,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x2, 0x1b,0x8, 0x40,0x6d,0x0, +0x2d,0x13,0x1b,0x18,0x0, 0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x22,0x7e,0x34,0x12, +0x1, 0x7e,0x24,0x0, 0x1e,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x12,0x1f,0x7e,0x24,0x0, +0x14,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x11,0xed,0x7e,0x24,0x0, 0x14,0xe4,0x2, 0x6d, +0xe0,0x12,0x0, 0x6e,0x50,0x1d,0x12,0x6e,0xad,0x7c,0xab,0x7e,0xb3,0x11,0x95,0xbe, +0xb0,0x4, 0x68,0xf, 0xbe,0xa0,0xff,0x68,0xa, 0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x7a, +0xa3,0x11,0x95,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb3,0x10,0x3d,0x70,0x3, 0x7e,0xf0, +0x1, 0x74,0x1, 0x12,0x3e,0xf7,0xbe,0xb0,0x1, 0x68,0x5, 0xbe,0xf0,0x1, 0x78,0x4, +0xe4,0x12,0x3e,0xf7,0xda,0xf8,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5,0x0, +0x75,0xe4,0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, 0x9, +0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x7e,0x34,0x8, 0x9a,0x7e,0x24, +0x11,0x9e,0x7e,0x14,0x1, 0x90,0x12,0x3c,0x70,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x11, +0x4a,0x7e,0x14,0x0, 0xc8,0x12,0x3c,0x70,0x2, 0x56,0xf3,0x74,0x1, 0x12,0x6e,0x3d, +0xa9,0xc3,0xea,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x75,0x9a, +0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xe5,0x52,0xb4,0x1, +0x18,0xe5,0x51,0x70,0x14,0x7e,0xb3,0x11,0x95,0x60,0xb, 0xe4,0x7a,0xb3,0x11,0x95, +0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x12,0x6c,0x58,0x85,0x51,0x52,0x22,0x6c,0xaa,0x7e, +0x50,0x4, 0xac,0x5a,0x49,0x12,0x0, 0xec,0xbd,0x13,0x38,0x8, 0x49,0x22,0x0, 0xee, +0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe4,0x7c,0xba,0x22,0x7e,0x24, +0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0x8d,0x12,0x6c,0xab,0x7e, +0x34,0x7, 0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x2e,0x75,0x55, +0x0, 0x75,0x73,0x0, 0x75,0x54,0x0, 0x12,0x6b,0xfd,0x12,0x61,0xcd,0xf5,0x53,0x12, +0x62,0x6b,0xb4,0x1, 0x4, 0x75,0x55,0x1, 0x22,0x75,0x55,0x3, 0x22,0x7e,0x34,0x0, +0x1, 0x7a,0x35,0x56,0x7e,0x34,0xa, 0x18,0x7a,0x35,0x58,0x7e,0x34,0x0, 0x2, 0x7a, +0x35,0x5a,0x7e,0x34,0xa, 0x62,0x7a,0x35,0x5c,0x74,0x2, 0x22,0x0, 0x50,0x0, 0xa, +0x6, 0x4, 0x0, 0x78,0x0, 0xc, 0x6, 0x4, 0x0, 0xc8,0x0, 0x1e,0x8, 0x5, 0x1, 0x40, +0x0, 0x50,0x8, 0x5, 0x1, 0xf4,0x0, 0x64,0xa, 0x6, 0xe4,0x7a,0xb3,0x16,0xb1,0x7a, +0xb3,0x16,0xb0,0x7e,0xb3,0x10,0xa3,0x70,0x6, 0x7e,0x73,0x11,0x10,0x80,0x4, 0x7e, +0x73,0x11,0x12,0x7a,0x73,0x16,0xb2,0x22,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x2, 0x7a, +0xb3,0x10,0x7b,0x74,0x4, 0x7a,0xb3,0x10,0x7c,0x7e,0x34,0x16,0x55,0x7e,0x24,0x0, +0x48,0xe4,0x2, 0x6d,0xe0,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x75,0x92,0x7c,0xd2, +0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0x22, +0xe4,0x7a,0xb3,0xd, 0xfb,0x7e,0x34,0x11,0x9e,0x7a,0x37,0xf, 0xd6,0x12,0x40,0x32, +0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x2, 0x46,0xe9,0x75,0x75,0x1, 0x7e,0x24, +0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e,0x34, +0x0, 0x1, 0x2, 0x6e,0x27,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34,0xc9, +0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0xe5,0x51, +0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0x5a,0x80,0x4, 0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, +0x54,0x7a,0x37,0xf, 0x56,0x22,0xca,0xf8,0x12,0x6e,0x32,0x7c,0xfb,0x12,0x0, 0x6e, +0x50,0x7, 0x4c,0xff,0x78,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0xda,0xf8,0x22,0x7e,0x34, +0x0, 0x24,0x12,0x69,0x78,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, 0x57, +0x2e,0x54,0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0x7d,0x3, 0x80,0xa, +0x7e,0x29,0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d,0x55, +0x78,0xee,0x22,0x7e,0x53,0xf, 0x47,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x9d,0x32,0xbe, +0x34,0x0, 0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4,0x1, +0x3, 0x43,0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3,0x16, +0xa3,0xe4,0x7a,0xb3,0x16,0xaa,0x74,0xff,0x7a,0xb3,0x16,0xa2,0x22,0x75,0x76,0x1, +0xd2,0xee,0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x6e,0x27,0xa, +0x2b,0x19,0x72,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x44,0x1, 0x7a,0xb3,0x10,0xfe,0x22, +0x7d,0x13,0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31,0x22, +0x14,0x1, 0xa, 0x1, 0x0, 0x2, 0xfb,0x4, 0xf6,0x5, 0xec,0x6, 0xe7,0x7, 0xe2,0x8, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5,0x22, +0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x12, +0x0, 0x42,0x12,0x57,0x73,0x74,0x3, 0x12,0x43,0xae,0x2, 0x24,0xb4,0x7e,0x34,0x0, +0x21,0x12,0x69,0x78,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x7e,0xb3,0x11,0x15,0xb4, +0x1, 0x4, 0xe4,0x2, 0x6e,0x92,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32,0x38, +0xfa,0x22,0x12,0x62,0xb7,0xb4,0x1, 0x2, 0xe4,0x22,0x74,0x1, 0x22,0xd2,0xcf,0xa9, +0xd4,0xc9,0x75,0xcc,0x0, 0xc2,0xca,0x22,0xa9,0xc0,0x93,0x75,0x9, 0x0, 0x75,0xa, +0x0, 0x32,0x75,0x53,0x0, 0x75,0x54,0x0, 0x75,0x55,0x0, 0x22,0xa9,0x32,0x99,0x5, +0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x75,0xb, 0x0, 0x12,0x6e,0xc3,0x2, 0x5e,0x18,0x12, +0x6b,0x5b,0x12,0x6e,0xc9,0x2, 0x6e,0x66,0xe5,0x75,0x60,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xe5,0x76,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20, +0x40,0x80,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf, +0x22,0xf5,0x17,0x75,0x18,0x0, 0x22,0x12,0x61,0x79,0x2, 0x38,0x4a,0x12,0x4f,0xa8, +0x2, 0x62,0x1d,0x12,0x6e,0xd5,0x2, 0x6b,0xde,0x7e,0x34,0x1, 0x3, 0x22,0x7e,0x34, +0x5, 0xb, 0x22,0x2, 0x6c,0x75,0x2, 0x0, 0x76,0x2, 0x6c,0xc5,0x2, 0x6e,0x9a,0x2, +0x6e,0x5c,0xe5,0x6e,0x22,0x22,0x0, 0x1, 0x0, 0x8b,0x1, 0x0, 0x1, 0xa, 0xac,0x15, +0x0, 0x1, 0xa, 0xad,0x17,0x0, 0x1, 0xa, 0xae,0x4, 0x0, 0x1, 0xd, 0xfe,0x40,0x0, +0x5, 0xf, 0x29,0x20,0x17,0x29,0x38,0x13,0x0, 0x18,0xf, 0x2e,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x3, 0x0, 0x25,0xf, 0x63,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x18,0xf, +0x88,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xf, 0xa0,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xf, 0xad,0x0, 0x1, +0x2, 0x3, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x4, 0x17,0x16,0x15,0x14,0x13,0xc, +0xd, 0xe, 0xf, 0x10,0x11,0x12,0x0, 0xd, 0xf, 0xc5,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x0, 0x9, 0xa, 0xb, 0xc, 0x0, 0x25,0xf, 0xdc,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0xd, 0x10,0xff,0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, +0xa, 0x0, 0x1, 0x11,0xc, 0x0, 0x0, 0x1, 0x11,0x16,0x15,0x0, 0x32,0x11,0x17,0x0, +0x8, 0x0, 0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a,0x1, +0xbc,0x2, 0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, 0x7, +0xf9,0x8, 0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e,0xc, +0x83,0x0, 0x1, 0x11,0x49,0x17,0x0, 0x1, 0x11,0x94,0x2, 0x0, 0x1, 0x11,0x95,0x0, +0x0, 0x4, 0x11,0x97,0xff,0xff,0xff,0xff,0x0, 0x2, 0x11,0x9b,0xff,0x1f,0x0, 0x1, +0x11,0x9d,0x40,0x0, 0x1, 0x11,0xe8,0x0, 0x0, 0x4, 0x11,0xe9,0x23,0x23,0x23,0x23, +0x0, 0x1, 0x16,0x53,0x0, 0x0, 0x1, 0x15,0x53,0x0, 0x0, 0x1, 0x15,0x9e,0x0, 0x0, +0x1, 0x15,0x9f,0x0, 0x0, 0x1, 0x15,0xa0,0x0, 0x0, 0x1, 0x15,0xa1,0x0, 0x0, 0x1, +0x12,0x33,0x0, 0x0, 0x1, 0x16,0xac,0x0, 0x0, 0x1, 0x16,0xb4,0x0, 0x0, 0x1, 0x16, +0xb5,0x0, 0x0, 0x1, 0x16,0xb6,0x0, 0x0, 0x1, 0x16,0xb7,0x0, 0x0, 0x1, 0x16,0xb8, +0x0, 0x0, 0x1, 0x16,0xb9,0x0, 0x0, 0x1, 0x16,0xba,0x1, 0x0, 0x1, 0x16,0xbb,0x1, +0x0, 0xc, 0x0, 0xec,0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94, +0x0, 0x6, 0x0, 0xf8,0x0, 0xb4,0x2, 0x1c,0x3, 0x84,0x0, 0x1, 0x16,0x54,0x3, 0x0, +0x1, 0x16,0x9d,0x0, 0x0, 0x1, 0x0, 0xfe,0x0, 0x0, 0x1, 0x0, 0xff,0x0, 0x0, 0x1, +0x16,0xbc,0x0, 0x0, 0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x70,0xc5,0x8f,0x3a,0x20, +0xdf,0x16,0xf4, diff --git a/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_boe_720p.txt b/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_boe_720p.txt new file mode 100644 index 0000000000000..4c88fe0ccdace --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_boe_720p.txt @@ -0,0 +1,1810 @@ +0x2, 0x51,0x4f,0x2, 0x68,0xdc,0xe5,0x73,0x60,0x9, 0x74,0x1, 0x12,0x6e,0xd3,0x75, +0x73,0x0, 0x22,0xe4,0x12,0x6e,0xd3,0x75,0x73,0x1, 0x22,0x2, 0x50,0xb9,0xe5,0x55, +0xbe,0xb0,0x1, 0x68,0xf9,0x12,0x6e,0xb9,0x60,0xfb,0x22,0x2, 0x67,0x73,0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60, +0xfb,0x22,0x22,0x2, 0x6e,0x89,0xc2,0x8e,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0x22,0x32,0x2, 0x63,0xb7,0xbe,0xb0, +0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x16,0x9f,0x22,0x22,0x2, 0x0, 0x5a,0xe5,0x52, +0x24,0xff,0x22,0x2, 0x67,0xab,0xca,0x3b,0x7e,0xb3,0xf, 0x1b,0xf5,0x26,0x7e,0xd3, +0xf, 0x1c,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x33,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, +0xa, 0xe4,0x12,0x6e,0x21,0x6c,0xcc,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7c,0x19, +0xa3,0x13,0xba,0x7e,0x34,0x7f,0xff,0x74,0x7, 0xac,0xbc,0x59,0x35,0x13,0xb6,0x74, +0x7, 0xac,0xbc,0x59,0x35,0x13,0xb8,0xb, 0xc0,0xbe,0xc0,0xa, 0x78,0xd9,0xe5,0x26, +0x60,0x3, 0x2, 0x0, 0xef,0x12,0x6a,0xee,0xbe,0xd0,0x0, 0x38,0x3, 0x2, 0x0, 0xdf, +0x74,0x1, 0x7a,0xb3,0xf, 0x20,0xe4,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7e, +0x34,0x13,0x6, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x2, 0x1, 0x14,0x4c, +0xdd,0x68,0x3, 0x2, 0x1, 0x14,0x75,0x25,0x0, 0x7e,0xa0,0xff,0x7e,0x71,0x25,0x74, +0x7, 0xac,0x7b,0x19,0xa3,0xe, 0x57,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xeb,0x74,0x1, +0x7a,0xb3,0xf, 0x1f,0x75,0x25,0x0, 0x2, 0x1, 0x4c,0x7e,0x51,0x25,0x74,0x7, 0xac, +0x5b,0x2e,0x24,0xe, 0xd, 0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x51,0x25,0xac,0x5b,0x2e,0x24,0xe, 0xf, 0xb, 0x28,0x30,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x5, 0x25,0xe5,0x26,0xbe,0xb1, +0x25,0x38,0xc7,0xe4,0x6c,0x77,0x7e,0x61,0x26,0x7e,0x24,0x13,0xb6,0x12,0x53,0x2, +0x7e,0x71,0x26,0x7e,0x60,0xa, 0x7e,0x24,0x13,0xb6,0x12,0x53,0x2, 0x7c,0xcb,0x6c, +0xee,0x75,0x25,0x0, 0x2, 0x1, 0x92,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65,0x13, +0xba,0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x11,0xbc,0x76,0x78,0x3, 0x2, 0x1, 0x97, +0x5, 0x25,0xbe,0xc1,0x25,0x38,0xe0,0xbe,0xc1,0x25,0x68,0x3, 0x2, 0x1, 0xb8,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3c,0x2e,0x14,0x13, +0xb6,0x74,0x7, 0x12,0x49,0x26,0xb, 0xc0,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xb2,0x7e, +0x24,0x13,0xb6,0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x4c,0xdd, +0x68,0x3, 0x2, 0x1, 0xe7,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, +0x46,0x12,0x6d,0x7d,0x2, 0x4, 0x84,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x4, 0x84, +0x6c,0xee,0x2, 0x4, 0x7b,0x75,0x25,0x0, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65, +0xe, 0x57,0x7e,0x90,0x7, 0xac,0x9e,0x9, 0x74,0xe, 0x11,0xbc,0x67,0x78,0x3, 0x2, +0x2, 0x1b,0x5, 0x25,0xe5,0x25,0xbe,0xb0,0xa, 0x40,0xdd,0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x9, 0xf5,0xe, 0x57,0x49,0x34,0xe, 0xf, 0x49,0x25,0xe, 0x55,0x12,0x6d,0xf1, +0x7d,0x63,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, 0xa4, +0x49,0x25,0xe, 0x53,0x12,0x6d,0xf1,0x7d,0x13,0x2d,0x16,0x7a,0x15,0x21,0x7c,0x1f, +0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7,0xbe,0x14,0x0, 0x40,0x28,0x3, 0x2, 0x2, 0xd9, +0x7e,0x35,0x21,0xbe,0x34,0x0, 0x20,0x38,0x3, 0x2, 0x2, 0xae,0x7e,0x70,0x3, 0xac, +0x7f,0x9, 0xb3,0x12,0x2, 0x60,0x3, 0x2, 0x2, 0x97,0x9, 0xb3,0x12,0x3, 0xbe,0xb0, +0x0, 0x38,0x3, 0x2, 0x2, 0x89,0x2, 0x2, 0xbf,0x74,0x1, 0x19,0xb3,0x12,0x2, 0x6d, +0x22,0x7a,0x25,0x21,0x2, 0x2, 0xed,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0xa, 0x40,0x3, +0x2, 0x2, 0xed,0x2e,0x34,0x12,0x3, 0x4, 0x7a,0x39,0xb0,0x2, 0x2, 0xd1,0x7e,0x70, +0x3, 0xac,0x7f,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x2, 0xcc,0x7d, +0x23,0x2e,0x24,0x12,0x3, 0x14,0x7a,0x29,0xb0,0x2, 0x2, 0xed,0xe4,0x19,0xb3,0x12, +0x2, 0x6d,0x33,0x7a,0x35,0x21,0x2, 0x2, 0xed,0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7f, +0x19,0xa3,0x12,0x3, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x2, 0x7e,0x35,0x21, +0xbe,0x34,0x0, 0x20,0x28,0x3, 0x2, 0x3, 0x2e,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49, +0x35,0xe, 0x53,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x35,0xe, 0x55,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0x6d,0x33,0x7a, +0x35,0x21,0x7e,0xa0,0x1, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x1, 0x7e,0xf5, +0x21,0x7a,0xf5,0x23,0xa, 0xef,0x2e,0xe5,0x33,0x7e,0xe9,0xb0,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x3, 0x52,0x6d,0xee,0x74,0x2, 0xac,0xbf,0x59,0xe5,0x11,0xed,0x59,0xe5, +0x12,0x1f,0x7e,0x17,0xf, 0x5d,0xbe,0x15,0x23,0x28,0x3, 0x2, 0x3, 0x68,0x7e,0x4, +0x1, 0x0, 0x7a,0x5, 0x31,0x2, 0x3, 0x8b,0x7e,0x35,0x23,0x6d,0x22,0x7c,0x56,0x7c, +0x67,0x6c,0x77,0x12,0x48,0x9f,0x7d,0xe3,0x7a,0xe5,0x31,0xbe,0xe4,0x0, 0x10,0x40, +0x3, 0x2, 0x3, 0x8b,0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x31,0x74,0x2, 0xac,0xbf,0x49, +0x45,0x12,0x1f,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x3, 0xa5,0x49,0x45,0x11,0xed,0x7a, +0x45,0x31,0x2, 0x3, 0xac,0x7e,0x45,0x31,0x59,0x45,0x11,0xed,0x59,0xf5,0x12,0x1f, +0x7e,0x35,0x31,0xbe,0x34,0x1, 0x0, 0x38,0x3, 0x2, 0x3, 0xc3,0x7e,0x34,0x1, 0x0, +0x7a,0x35,0x31,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x25,0xe, 0x53,0x12,0x6d,0xf1,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31, +0xad,0x32,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, +0xac,0x5b,0x49,0x32,0xe, 0x53,0xac,0xbe,0x49,0x15,0xe, 0xd, 0xbd,0x13,0x38,0x3, +0x2, 0x4, 0x14,0x7d,0x2, 0x2e,0x4, 0xe, 0x53,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, +0x10,0x2, 0x4, 0x1e,0x2e,0x24,0xe, 0x53,0x9e,0x35,0x21,0x1b,0x28,0x30,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49,0x25,0xe, 0x55, +0x12,0x6d,0xf1,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31,0xad,0x32,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, 0xac,0x5b,0x49,0x32,0xe, +0x55,0xac,0xbe,0x49,0x15,0xe, 0xf, 0xbd,0x13,0x38,0x3, 0x2, 0x4, 0x6f,0x7d,0x2, +0x2e,0x4, 0xe, 0x55,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, 0x10,0x2, 0x4, 0x79,0x2e, +0x24,0xe, 0x55,0x9e,0x35,0x21,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x26,0xbc,0xbe,0x28, +0x3, 0x2, 0x1, 0xf5,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x49,0x45,0xe, 0x53,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x35,0x49,0x45,0xe, 0x55,0x1e,0x44,0x1e, +0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x37,0x9, 0xf5,0xe, 0x57,0x19,0xf5,0xe, 0x11, +0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x58,0x19,0x75,0xe, 0x12,0x74,0x7, 0xac,0xbe, +0x9, 0x75,0xe, 0x59,0x19,0x75,0xe, 0x13,0x7c,0xbf,0x54,0xf, 0xbe,0xb0,0xa, 0x40, +0x3, 0x2, 0x5, 0xd7,0x7c,0xfb,0xa, 0xf, 0x7d,0x10,0x2e,0x15,0x33,0x7e,0x19,0xb0, +0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x5, 0xf4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x4, 0xf9, +0x74,0xff,0x19,0xb0,0x13,0x6, 0x2, 0x5, 0xd7,0x9, 0x90,0x13,0x6, 0xbe,0x90,0xff, +0x68,0x3, 0x2, 0x5, 0x4b,0x74,0x1, 0x19,0xb0,0x13,0x6, 0x7e,0x15,0x35,0x74,0x7, +0xac,0xbe,0x59,0x15,0xe, 0xd, 0x7e,0x15,0x37,0x74,0x7, 0xac,0xbe,0x59,0x15,0xe, +0xf, 0x6c,0xdd,0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x50,0x7, 0xac, +0x5d,0x7e,0x30,0x15,0xac,0x3f,0x2d,0x12,0x2e,0x14,0x12,0x34,0x74,0x7, 0x12,0x49, +0x26,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xdb,0x2, 0x5, 0xd7,0xbe,0x90,0x3, 0x50,0x3, +0x2, 0x5, 0x58,0xe4,0x19,0xb0,0x13,0x6, 0x7e,0x25,0x35,0x9, 0x80,0x13,0x6, 0x7e, +0x90,0x7, 0xac,0x89,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x43,0x59,0x24,0x12,0x34,0x7e, +0x25,0x37,0x59,0x24,0x12,0x36,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x5, 0xa0,0xe4, +0x2e,0x34,0x12,0x34,0x12,0x68,0x47,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x74, +0x1, 0x7e,0x70,0x15,0xac,0x7f,0x2e,0x34,0x12,0x34,0x12,0x68,0x47,0x2, 0x5, 0xc2, +0x49,0x34,0x12,0x34,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0xa, 0x3f,0x9, 0x43, +0x13,0x6, 0x7e,0x50,0x7, 0xac,0x45,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x32,0x49,0x33, +0x12,0x36,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0xa, 0x3f,0x2e,0x34,0x13,0x6, +0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x7c,0x1e,0x2e,0x10,0x27,0xa5,0xe7,0x60,0x3, +0x2, 0x5, 0xf4,0x7e,0x70,0x3, 0xac,0x7e,0x2e,0x34,0x12,0x1, 0x7e,0x24,0x0, 0x3, +0xe4,0x12,0x6e,0x21,0xb, 0xe0,0xbe,0xe0,0xa, 0x68,0x3, 0x2, 0x4, 0x86,0xe5,0x26, +0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x6, 0xe, 0x74,0x1, 0x7a,0xb3,0xf, 0x24,0xda,0x3b, +0x22,0xca,0x3b,0x7e,0xe3,0xf, 0x1b,0x4c,0xee,0x78,0x27,0x6c,0xff,0x6d,0x11,0x74, +0x2, 0xac,0xbf,0x59,0x15,0x13,0x56,0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x19, +0xa1,0x13,0x14,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x13,0x6a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xdb,0x6c,0xff,0x2, 0x7, 0xac,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xe, 0x11,0x54, +0xf, 0xf5,0x22,0xbe,0xb0,0xa, 0x40,0x3, 0x2, 0x7, 0xaa,0xe5,0x22,0xa, 0x1b,0x9, +0xb1,0xe, 0xdf,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x7, 0x85,0x75,0x21,0x0, 0x7e,0x31, +0x21,0x74,0x7, 0xac,0x3b,0x9, 0x71,0x13,0x14,0x7a,0x71,0x23,0xbe,0x71,0x22,0x68, +0x3, 0x2, 0x7, 0x77,0x49,0x21,0x13,0x12,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xf, +0x9d,0x32,0x12,0x6e,0x11,0x7d,0x63,0x7e,0xa1,0x21,0x74,0x7, 0xa4,0x49,0x25,0x13, +0x10,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6e,0x11,0x7d,0x3, +0x2d,0x6, 0xe5,0x23,0xa, 0x1b,0x9, 0xa1,0x13,0x6a,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0x71,0x23,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x13,0x56,0x2e,0x14,0x13,0x6a,0x7c,0xba, +0x14,0x7a,0x19,0xb0,0x2, 0x7, 0xaa,0x7e,0xa1,0x23,0x74,0x2, 0xa4,0x49,0x15,0x13, +0x56,0xbe,0x14,0x0, 0x32,0x28,0x9, 0xbe,0x4, 0x0, 0x32,0x28,0x3, 0x2, 0x7, 0x71, +0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, +0x80,0x6f,0xbe,0x4, 0x0, 0x96,0x28,0x63,0xe5,0x22,0xa, 0x1b,0x9, 0xb1,0xe, 0xdf, +0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0xe, 0xdf,0x7e,0xa0,0x3, 0xe5, +0x22,0xa, 0x1b,0x19,0xa1,0xe, 0xe9,0x7e,0x71,0x21,0x74,0x7, 0xac,0x7b,0x2e,0x34, +0x13,0x10,0x7e,0x14,0x13,0xb6,0x12,0x49,0x26,0xbe,0xe0,0x0, 0x28,0x2d,0x1b,0xe0, +0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3f,0x2e,0x14, +0xe, 0xd, 0x74,0x7, 0x12,0x49,0x26,0x7e,0x34,0x13,0xb6,0x7e,0x30,0x7, 0xac,0x3e, +0x2e,0x14,0xe, 0xd, 0x74,0x7, 0x12,0x49,0x26,0x1b,0xf0,0x7e,0xa1,0x23,0x74,0x2, +0xa4,0x59,0x5, 0x13,0x56,0x80,0x33,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0xa, 0x50,0x3, +0x2, 0x6, 0x6e,0x80,0x25,0x6d,0x11,0x7e,0xa1,0x22,0x74,0x2, 0xa4,0x59,0x15,0x13, +0x56,0x7e,0xa0,0xff,0x7e,0x31,0x22,0x74,0x7, 0xac,0x3b,0x19,0xa1,0x13,0x14,0x7e, +0xa0,0x2, 0xe5,0x22,0xa, 0x1b,0x19,0xa1,0x13,0x6a,0xb, 0xf0,0xbc,0xef,0x28,0x3, +0x2, 0x6, 0x47,0x7a,0xe3,0xf, 0x1b,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0x10,0x7e, +0x14,0x0, 0x46,0x12,0x6d,0x7d,0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d, +0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x24,0xc, 0x75,0x25,0x0, +0x75,0x26,0x17,0x75,0x27,0x0, 0x7e,0x34,0x13,0xd0,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6e,0x21,0x6c,0x66,0x2, 0x8, 0xed,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xd, 0x18,0x7a, +0x71,0x23,0x9, 0xa5,0xd, 0x19,0x1a,0x17,0x7d,0x21,0x1b,0x25,0xb, 0x15,0x7c,0x43, +0x1a,0x1a,0x1b,0x15,0x1a,0xa, 0xb, 0x5, 0x7c,0x21,0xbe,0x50,0x0, 0x58,0x2, 0x6c, +0x55,0x7e,0x73,0x10,0x2b,0xa, 0x7, 0x1b,0x4, 0x1a,0x44,0xbd,0x40,0x8, 0x2, 0x7c, +0x41,0xbe,0x30,0x0, 0x58,0x2, 0x6c,0x33,0x7e,0x73,0x10,0x2c,0xa, 0x7, 0x1b,0x4, +0x1a,0x42,0xbd,0x40,0x8, 0x2, 0x7c,0x21,0xbe,0x51,0x24,0x58,0x3, 0x7a,0x51,0x24, +0xbe,0x41,0x25,0x8, 0x3, 0x7a,0x41,0x25,0xbe,0x31,0x26,0x58,0x3, 0x7a,0x31,0x26, +0xbe,0x21,0x27,0x8, 0x3, 0x7a,0x21,0x27,0x7c,0xf5,0x80,0x4b,0x7c,0xe3,0x80,0x41, +0x1a,0xef,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0xe, 0x2d,0xf, 0xe, 0x4, 0xe, 0x4, +0xe, 0x4, 0x7c,0x71,0x7a,0x71,0x21,0x7e,0x10,0x18,0xac,0x1f,0x7c,0xb1,0x2c,0xbe, +0x54,0x7, 0x7e,0x4, 0x0, 0x1, 0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7c,0xb1,0xf5, +0x22,0xa, 0x7, 0x2e,0x4, 0x13,0xd0,0x7e,0x9, 0xb0,0x45,0x22,0x7a,0x9, 0xb0,0xb, +0xe0,0xbc,0x2e,0x58,0xbb,0xb, 0xf0,0xbc,0x4f,0x58,0xb1,0xb, 0x60,0x7e,0x73,0xd, +0xf7,0xbc,0x76,0x28,0x3, 0x2, 0x8, 0x27,0xbe,0x70,0x0, 0x38,0x3, 0x2, 0xd, 0x43, +0x7e,0xe1,0x26,0x2, 0xd, 0x3a,0x6c,0xff,0x80,0x1f,0x1a,0x3e,0x3e,0x34,0x1a,0x2f, +0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36,0xb, 0x38,0x30,0xe, 0x34,0xe, +0x34,0x3e,0x24,0x59,0x32,0x13,0xb6,0xb, 0xf0,0x7e,0x73,0x10,0x2b,0xbc,0x7f,0x18, +0xd9,0x7e,0xf1,0x24,0x2, 0xd, 0x2f,0x1a,0x4f,0x7e,0x14,0x0, 0x18,0xad,0x14,0x1a, +0x3e,0x7d,0x51,0x2d,0x53,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7a,0xa1,0x21, +0x7e,0x50,0x18,0xac,0x5f,0x7c,0xb5,0x2c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x22,0xa, 0x2a,0x9, 0xb2,0x13,0xd0, +0x55,0x22,0x78,0x3, 0x2, 0xd, 0x2d,0xbe,0xf0,0x3, 0x58,0x3, 0x2, 0x9, 0xfe,0x7e, +0x53,0x10,0x2b,0xa, 0x25,0x1b,0x26,0xbd,0x42,0x18,0x73,0x7d,0xf4,0x3e,0xf4,0x49, +0x5f,0x13,0xba,0x49,0x2f,0x13,0xb2,0x2d,0x25,0x7d,0x52,0x3e,0x54,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x2d,0x25,0x49,0x5f,0x13,0xbc,0x49,0xef,0x13,0xb0,0x2d,0xe5,0x7d, +0x5e,0x3e,0x54,0x2d,0x5e,0x9d,0x25,0x49,0xef,0x13,0xb8,0x49,0x5f,0x13,0xb4,0x2d, +0x5e,0x7d,0xe5,0x3e,0xe4,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d, +0x5e,0x9d,0x25,0x49,0x5f,0x13,0xb6,0x7d,0x5, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x9d,0x10,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x2, 0xb, 0x55,0x4c,0xff, +0x78,0x5d,0x7d,0x24,0x3e,0x24,0x49,0x12,0x13,0xb6,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x3e,0x54,0x2d,0x50,0x7d,0x1, 0x3e,0x4, 0x2d,0x5, 0x2d,0x1, 0x49,0x12,0x13,0xb8, +0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5, 0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x9d,0x1, 0x49,0x12,0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x2d,0x50,0x9d,0x51,0x49,0x22,0x13,0xbc,0x3e,0x24,0x9d,0x52,0x2, 0xb, 0x55,0xbe, +0xf0,0x1, 0x78,0x69,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x49,0x20, +0x13,0xb6,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x25,0x9d,0x21,0x49,0x10, +0x13,0xb8,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x21,0x49,0x10, +0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10, +0x13,0xbc,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x52,0x2, 0xb, 0x55,0xbe,0xf0,0x2, +0x68,0x3, 0x2, 0xb, 0x75,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x50,0x13,0xb2,0x7d, +0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x15,0x9d,0x12,0x49,0x20,0x13,0xb6,0x7d, +0xf2,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5f,0x3e,0x24,0x3e,0x24,0x2d, +0x25,0x2d,0x21,0x49,0x50,0x13,0xb8,0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x2d,0x15,0x9d,0x21,0x49,0x50,0x13,0xba,0x7d,0x15,0x3e,0x14,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10,0x13,0xbc,0x7d,0x21,0x3e, +0x24,0x2d,0x21,0x9d,0x52,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7d,0x23,0x3e,0x24,0x7e,0x14,0x0, 0x30,0xad,0x14,0x2d,0x21,0x2d,0x26,0x1b, +0x28,0x50,0x2, 0xd, 0x11,0x7e,0xa3,0x10,0x2b,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x68, +0x3, 0x2, 0xc, 0x11,0x3e,0x44,0x49,0x24,0x13,0xb2,0x7d,0x12,0x3e,0x14,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x4, 0x13,0xb0,0x7d,0x10,0x3e,0x14,0x2d,0x10, +0x9d,0x21,0x49,0x4, 0x13,0xb4,0x7d,0x10,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x10,0x9d,0x21,0x49,0x14,0x13,0xb6,0x7d,0xf1,0x3e,0xf4,0x3e,0xf4, +0x3e,0xf4,0x3e,0xf4,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x9d,0xf, 0x3e,0x14,0x3e,0x14,0x2d,0x10,0x2d,0x12,0x49,0x4, +0x13,0xb8,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x20, +0x9d,0x12,0x49,0x4, 0x13,0xba,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x20, +0x2d,0x21,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x2, 0xd, +0x0, 0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x76,0x1a,0xf, 0x3e,0x4, 0x49,0x30,0x13, +0xb0,0x7d,0x23,0x3e,0x24,0x2d,0x23,0x49,0x10,0x13,0xb2,0x7d,0x31,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x2d,0x31,0x9d,0x32,0x49,0x20,0x13,0xb4,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x49,0x20,0x13,0xb6,0x7d,0x12,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x9d,0x21,0x2d,0x23,0x49,0x30,0x13,0xb8,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x31,0x9d,0x23,0xe, +0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e,0x80,0x71,0x7e, +0xb3,0x10,0x2b,0x14,0xbc,0xbf,0x78,0x79,0x1a,0x5f,0x3e,0x54,0x49,0x25,0x13,0xb2, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9d,0x32,0x49,0x25,0x13,0xb0,0x3e,0x24, +0x9d,0x32,0x49,0x25,0x13,0xb4,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x24,0x9d,0x32,0x49,0x15,0x13,0xb6,0x7d,0x21, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x2, 0x7d,0x21,0x3e,0x24,0x2d,0x20,0x2d,0x21, +0x2d,0x23,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e, +0x3e,0x34,0x1a,0xf, 0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d,0x31,0x2d,0x36,0x1b,0x38, +0x20,0x1a,0x1e,0x3e,0x14,0x1a,0x2f,0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x23,0x2d, +0x21,0x2d,0x26,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x25,0xbc,0xbf,0x48,0x3, 0x2, 0x9, 0x37,0xb, 0xe0,0xe5,0x27,0xbc,0xbe,0x48,0x3, +0x2, 0x9, 0x6, 0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7e,0xb3,0xd, 0xf7,0xf5,0x2c, +0x75,0x10,0x0, 0xe4,0x7a,0xb3,0x15,0x54,0x7a,0xb3,0x15,0x55,0x6d,0x22,0x7e,0x34, +0x7f,0xff,0x7e,0x67,0xf, 0xda,0x6c,0xee,0xe4,0xa, 0x1e,0x19,0xb1,0x13,0xb6,0x6c, +0xaa,0x7e,0x10,0x2, 0xac,0x1e,0x19,0xa0,0x15,0x2b,0x19,0xb0,0x15,0x2c,0xe5,0x2c, +0xbc,0xbe,0x28,0x24,0x9, 0x20,0xd, 0x18,0x7e,0x30,0x18,0xac,0x23,0x9, 0x10,0xd, +0x19,0xa, 0x1, 0x2d,0x10,0x3e,0x14,0x2d,0x16,0xb, 0x18,0x10,0xbd,0x12,0x48,0x2, +0x7d,0x21,0xbd,0x13,0x18,0x2, 0x7d,0x31,0xb, 0xe0,0xbe,0xe0,0x14,0x78,0xb9,0x2d, +0x32,0xe, 0x34,0xe5,0x2c,0xbe,0xb0,0x2, 0x50,0x3, 0x2, 0x11,0x9d,0x6c,0xee,0x7e, +0x30,0x6, 0xac,0x3e,0x7d,0x51,0x2e,0x54,0x69,0x8f,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x23,0x58,0x20,0x7d,0x51,0x2e,0x54,0x69,0x91,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0x7a,0x25,0x30,0x2e,0x14,0x69,0x93,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0x7a,0x25,0x32,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc3,0x6c,0xee,0x2, 0x11, +0x8b,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19, +0xf5,0x23,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x13,0xb6,0x70,0xa, 0xa, 0x3e, +0xb, 0x34,0xa, 0x2e,0x19,0x72,0x13,0xb6,0xe5,0x2c,0x14,0xbc,0xbe,0x78,0x3, 0x2, +0x11,0x94,0xa, 0x5e,0xb, 0x54,0xf5,0x2d,0x2, 0x11,0x7f,0x7e,0x71,0x2d,0x74,0x2, +0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a,0xa1,0x24,0x9, 0xb3,0xd, 0x19,0xf5,0x25,0xa, +0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x2a,0xe5,0x25, +0xa, 0x2b,0xe5,0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x2b,0x75, +0x3d,0x2, 0x75,0x2f,0x0, 0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b, +0x2d,0x23,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0x7a,0x25,0x34,0x7e,0x11,0x24,0x74, +0x18,0xac,0x1b,0xe5,0x25,0xa, 0x1b,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0x7a,0x25,0x36,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0xe, 0x54,0x7a,0x55,0x38,0xbe,0x25,0x34,0x8, 0x14,0x7e,0x25,0x34, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x7a,0x25, +0x38,0xe5,0x2a,0xbe,0xb0,0x1, 0x38,0x37,0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x30,0x7c, +0xbf,0x54,0x2, 0xb4,0x2, 0x29,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, 0x20,0x7e, +0x71,0x22,0x74,0x18,0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d, +0x32,0xbe,0x35,0x38,0x18,0x3, 0x2, 0x11,0x13,0x75,0x2f,0x1, 0x2, 0x11,0x13,0xe5, +0x2a,0xbe,0xb0,0x1, 0x38,0xa, 0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x3, 0x2, 0x11,0x13, +0xe5,0x2a,0xbe,0xb0,0x4, 0x40,0x3, 0x2, 0x11,0x13,0xe5,0x2b,0xbe,0xb0,0x4, 0x40, +0x3, 0x2, 0x11,0x13,0x7c,0xbf,0x54,0x1, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x11,0x13, +0x6d,0x33,0x7a,0x35,0x3a,0x75,0x3c,0x0, 0x85,0x22,0x26,0x85,0x24,0x28,0xe5,0x24, +0xbe,0xb1,0x22,0x50,0x6, 0x85,0x24,0x26,0x85,0x22,0x28,0x85,0x23,0x27,0x85,0x25, +0x29,0xe5,0x25,0xbe,0xb1,0x23,0x50,0x6, 0x85,0x25,0x27,0x85,0x23,0x29,0x75,0x40, +0x0, 0x75,0x41,0x0, 0xe5,0x28,0xbe,0xb1,0x26,0x78,0x21,0x75,0x40,0x1, 0xe5,0x26, +0x60,0x5, 0xe5,0x26,0xb4,0xc, 0x3, 0x75,0x41,0x1, 0xe5,0x26,0xbe,0xb0,0x0, 0x28, +0x2, 0x15,0x26,0xe5,0x28,0xbe,0xb0,0xc, 0x50,0x2, 0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x27,0x78,0x21,0x75,0x40,0x1, 0xe5,0x27,0x60,0x5, 0xe5,0x27,0xb4,0x17,0x3, 0x75, +0x41,0x1, 0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x27,0xe5,0x29,0xbe,0xb0,0x17, +0x50,0x2, 0x5, 0x29,0x85,0x26,0x3e,0x80,0x78,0x85,0x27,0x3f,0x80,0x6a,0xe5,0x26, +0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x28,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x27,0xbe,0xb1, +0x3f,0x68,0x7, 0xe5,0x29,0xbe,0xb1,0x3f,0x78,0x24,0x7e,0x51,0x3e,0x74,0x18,0xac, +0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0xbe,0x24, +0x0, 0x0, 0x8, 0x6, 0x2e,0x25,0x3a,0x7a,0x25,0x3a,0x5, 0x3c,0x80,0x28,0x7e,0x51, +0x3e,0x74,0x18,0xac,0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0xbe,0x25,0x32,0x8, 0xc, 0xe5,0x3d,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x3d, +0x1, 0x80,0x3, 0x75,0x3d,0x0, 0x5, 0x3f,0xe5,0x29,0xbe,0xb1,0x3f,0x50,0x8f,0x5, +0x3e,0xe5,0x28,0xbe,0xb1,0x3e,0x50,0x81,0x7e,0x51,0x28,0x74,0x18,0xac,0x5b,0xe5, +0x27,0xa, 0x4b,0x2d,0x24,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x50,0x7e,0x25,0x3a,0x9d, +0x25,0x7e,0x31,0x26,0x74,0x18,0xac,0x3b,0xe5,0x29,0xa, 0xb, 0x7d,0x51,0x2d,0x50, +0x3e,0x54,0x2d,0x56,0xb, 0x58,0x50,0x9d,0x25,0x2d,0x14,0x3e,0x14,0x2d,0x16,0xb, +0x18,0x10,0x9d,0x21,0x7e,0x31,0x28,0x74,0x18,0xac,0x3b,0x2d,0x10,0x3e,0x14,0x2d, +0x16,0xb, 0x18,0x10,0x9d,0x21,0x7a,0x25,0x3a,0x7e,0x25,0x36,0x2e,0x25,0x34,0x7a, +0x25,0x38,0xe5,0x40,0xb4,0x1, 0x11,0xe5,0x41,0x70,0xd, 0x7e,0x25,0x3a,0x9e,0x25, +0x38,0x7a,0x25,0x3a,0x15,0x3c,0x15,0x3c,0xe5,0x3c,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x3c,0x24,0xfc,0xf5,0x3c,0x7e,0x25,0x3a,0xbe,0x24,0x0, 0x0, 0x58,0x3, 0x7a,0x35, +0x3a,0x7e,0x15,0x38,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x30,0x1a,0x26,0x1a,0x24,0x12, +0x48,0x85,0xe5,0x3c,0xa, 0x1b,0x6d,0x0, 0x12,0x48,0x85,0x7f,0x21,0x7e,0x35,0x3a, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x48,0x96,0xbf,0x12,0x8, 0xa, 0xe5, +0x3d,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x2f,0x2, 0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, +0x75,0x2f,0x2, 0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x63,0xe5,0x2f,0xa, 0x3b,0x2e,0x34, +0x15,0x53,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2d,0xa, 0x3b,0x9, 0xb3,0x13, +0xb6,0x70,0xc, 0xa, 0x2e,0x9, 0x52,0x13,0xb6,0x19,0x53,0x13,0xb6,0x80,0x3e,0x75, +0x2e,0x0, 0x80,0x32,0x9, 0x33,0x13,0xb6,0xa, 0x2e,0x9, 0xa2,0x13,0xb6,0xbc,0xa3, +0x28,0x12,0xe5,0x2e,0xa, 0x2b,0x9, 0x22,0x13,0xb6,0xbc,0x2a,0x78,0x16,0x19,0x32, +0x13,0xb6,0x80,0x10,0xe5,0x2e,0xa, 0x2b,0x9, 0xb2,0x13,0xb6,0xbc,0xb3,0x78,0x4, +0x19,0xa2,0x13,0xb6,0x5, 0x2e,0xe5,0x2c,0xbe,0xb1,0x2e,0x38,0xc7,0x5, 0x2d,0xe5, +0x2c,0xbe,0xb1,0x2d,0x28,0x3, 0x2, 0xe, 0x3b,0xb, 0xe0,0xe5,0x2c,0xbc,0xbe,0x28, +0x3, 0x2, 0xe, 0x1, 0x7e,0x34,0x13,0xb6,0x12,0x3b,0x6a,0xf5,0x10,0xda,0x3b,0x22, +0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55, +0x7e,0x37,0xf, 0x61,0x7a,0x35,0x3e,0x6c,0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0xe4,0x19,0xb3,0xd, 0x71,0xa, 0x5d,0x3e,0x54,0xb, 0x54,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x39,0x9, 0xb3,0xd, 0x19,0xf5,0x3a, +0xbe,0xd1,0x3a,0x28,0x3, 0x2, 0x12,0xe, 0x7e,0xb3,0x10,0x2c,0xa, 0xb, 0x1b,0x4, +0xa, 0x3d,0x9d,0x3, 0xe5,0x3a,0xa, 0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0xe, 0x7c, +0x3a,0xa, 0x4d,0xe5,0x3a,0xa, 0xb, 0x9d,0x4, 0x7c,0x51,0x2, 0x12,0x59,0xbe,0xd1, +0x3a,0x38,0x3, 0x2, 0x12,0x27,0xe5,0x3a,0xa, 0xb, 0xa, 0x3d,0x2d,0x30,0xb, 0x34, +0x7c,0x37,0x6c,0x55,0x2, 0x12,0x59,0xa, 0xfd,0xe5,0x3a,0xa, 0x4b,0x2d,0xf4,0x7e, +0xb3,0x10,0x2c,0xa, 0xb, 0x7d,0x30,0x1b,0x34,0xbd,0xf3,0x18,0x3, 0x2, 0x12,0x59, +0xbd,0x43,0x8, 0x3, 0x2, 0x12,0x59,0xa, 0x3d,0x2d,0x30,0xe5,0x3a,0xa, 0xb, 0x9d, +0x30,0x7c,0x37,0xa, 0x3d,0x9d,0x3, 0x7c,0x51,0xbe,0xd1,0x39,0x28,0x3, 0x2, 0x12, +0x83,0x7e,0xb3,0x10,0x2b,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5,0x39,0xa, +0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0x83,0x7c,0x4a,0xa, 0xd, 0xe5,0x39,0xa, 0x3b, +0x2, 0x12,0xca,0xbe,0xd1,0x39,0x38,0x3, 0x2, 0x12,0x9c,0xe5,0x39,0xa, 0xb, 0xa, +0x3d,0x2d,0x30,0xb, 0x34,0x7c,0x47,0x6c,0x22,0x2, 0x12,0xce,0xa, 0x4d,0xe5,0x39, +0xa, 0x5b,0x2d,0x45,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7d,0x3, 0x1b,0x4, 0xbd,0x40, +0x18,0x3, 0x2, 0x12,0xce,0xbd,0x50,0x8, 0x3, 0x2, 0x12,0xce,0xa, 0xd, 0x2d,0x3, +0xe5,0x39,0xa, 0x3b,0x9d,0x3, 0x7c,0x41,0xa, 0xd, 0x9d,0x30,0x7c,0x27,0x7e,0x37, +0xf, 0xda,0x7c,0xb2,0x7e,0x23,0xf, 0x53,0x7e,0x4, 0x9, 0xc8,0x12,0x5c,0x9d,0x7e, +0x37,0x9, 0xc8,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xca,0x7d,0x20,0x7a,0x1d,0x28, +0x7e,0x37,0x9, 0xcc,0x7d,0x3, 0x7e,0x37,0x9, 0xce,0x7d,0x20,0x7a,0x1d,0x2c,0x7e, +0x37,0x9, 0xd0,0x7d,0x3, 0x7e,0x37,0x9, 0xd2,0x7d,0x20,0x7a,0x1d,0x30,0x7e,0x37, +0x9, 0xd4,0x7d,0x3, 0x7e,0x37,0x9, 0xd6,0x7d,0x20,0x7a,0x1d,0x34,0xa, 0x2d,0xe5, +0x39,0xa, 0x3b,0x9d,0x32,0x7c,0xc7,0x2, 0x15,0x24,0xa, 0x4d,0xe5,0x3a,0xa, 0x5b, +0x9d,0x54,0xf5,0x38,0x2, 0x15,0xd, 0xbe,0xc0,0x0, 0x58,0x3, 0x2, 0x15,0xb, 0x7e, +0x73,0x10,0x2b,0xbc,0x7c,0x18,0x3, 0x2, 0x15,0xb, 0xe5,0x38,0xbe,0xb0,0x0, 0x58, +0x3, 0x2, 0x15,0xb, 0x7e,0x73,0x10,0x2c,0xbe,0x71,0x38,0x18,0x3, 0x2, 0x15,0xb, +0xe5,0x38,0x1a,0x1b,0x3e,0x14,0x1a,0x2c,0x7e,0x34,0x0, 0x30,0xad,0x32,0x2d,0x31, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x7e,0x53,0xf, 0x53,0xa, 0x25,0x9d,0x32,0x7a, +0x35,0x3c,0xbe,0x34,0x0, 0x0, 0x18,0x3, 0x2, 0x15,0xb, 0x7e,0x35,0x3e,0xbe,0x35, +0x3c,0x28,0x3, 0x2, 0x13,0xa6,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xd, 0x71,0x7e, +0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x39,0xa, 0x2b,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x13,0xd0,0xe5,0x3a,0xa, 0x2b,0xe5,0x38, +0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x2, 0x15,0xb, +0x75,0x3b,0x0, 0x2, 0x14,0x60,0xbe,0xe1,0x3b,0x78,0x3, 0x2, 0x14,0x5e,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe, +0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0x75,0x3b,0xff,0x2, 0x14,0x6c,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6e, +0x11,0xbe,0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe, +0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0x75,0x3b,0x0, 0x2, 0x14,0x6c,0x5, 0x3b, +0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x3b,0x8, 0x3, 0x2, 0x13,0xd6,0xe5,0x3b,0x60,0x3, +0x2, 0x14,0xc0,0x7e,0x35,0x3c,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x3c,0x7e, +0xf5,0x3c,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x85,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a, +0x2, 0x7f,0x17,0x12,0x48,0x85,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34, +0x7e,0x1d,0x28,0x9f,0x17,0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30, +0xe5,0x3b,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x15,0xb, 0x7e,0xf5,0x3c,0x7d,0x3f,0x1a, +0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48,0x85,0x7f,0x1, 0x7e,0x1d, +0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x85,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34,0x7e,0x1d,0x28,0x9f,0x17, +0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30,0x5, 0x38,0xa, 0x2d,0xe5, +0x3a,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x38,0x1a,0x3b,0xbd,0x32,0x18,0x3, 0x2, +0x13,0x37,0xb, 0xc0,0xa, 0x2d,0xe5,0x39,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0x1a,0x3c, +0xbd,0x32,0x18,0x3, 0x2, 0x13,0x2a,0x74,0x6, 0x7e,0x1d,0x2c,0x2f,0x11,0x14,0x78, +0xfb,0x7a,0x1d,0x2c,0x7e,0xd, 0x28,0x7e,0x1d,0x2c,0x12,0x48,0xa1,0x2e,0x34,0x0, +0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xd, 0x6b,0x74,0x6, 0x7e,0x1d,0x34,0x2f, +0x11,0x14,0x78,0xfb,0x7a,0x1d,0x34,0x7e,0x7d,0x30,0x7e,0x1d,0x34,0x7f,0x7, 0x12, +0x48,0xa1,0x2e,0x34,0x0, 0x20,0x59,0x36,0xd, 0x6d,0x7e,0xb3,0xf, 0x60,0x7f,0x17, +0x70,0x3, 0x2, 0x15,0x91,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7a,0x1d,0x30,0xbe,0x18,0x0, 0x7f,0x38,0x3, 0x2, 0x15,0xa4,0x7e,0x18,0x0, +0x7f,0x7a,0x1d,0x30,0x7e,0x2d,0x30,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0x71,0x7e,0x70,0x7, 0xac,0x7f,0x19, +0xa3,0xd, 0x71,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xd, 0x71,0xbe,0x70,0xf, 0x38,0x3, +0x2, 0x15,0xdf,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xd, 0x71,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x11, +0x96,0xa5,0xbe,0x1, 0x58,0x7e,0xa3,0x10,0x2b,0xbc,0xa7,0x28,0xd, 0x7a,0x71,0xd, +0x74,0x30,0xac,0x7b,0x2e,0x37,0x16,0x9b,0x80,0x3c,0x7a,0x71,0xd, 0xbc,0xa7,0x78, +0x6, 0x7e,0x34,0x8, 0x9a,0x80,0x2f,0xa, 0x2a,0x7d,0x2, 0xb, 0x4, 0xa, 0x17,0xbd, +0x10,0x78,0x6, 0x7e,0x34,0x8, 0xca,0x80,0x1d,0x7d,0x2, 0xb, 0x5, 0xbd,0x10,0x78, +0x6, 0x7e,0x34,0x9, 0x2e,0x80,0xf, 0x2e,0x24,0x0, 0x3, 0xbd,0x12,0x68,0x3, 0x2, +0x19,0x6a,0x7e,0x34,0x9, 0x5e,0x7a,0x37,0x0, 0xfb,0x2, 0x19,0x6a,0xa5,0xbe,0x0, +0x46,0x7e,0x64,0x0, 0xb, 0x7a,0x69,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf,0x1, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, +0x74,0x1, 0x7e,0x70,0x1, 0x80,0x36,0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3, +0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x21,0x74,0x27,0x7e,0x70, +0x3, 0x12,0x6d,0xe0,0x2, 0x19,0x6a,0xa5,0xbe,0x2, 0x23,0xa5,0xbf,0x4, 0x7, 0x74, +0x1, 0x7e,0x70,0x4, 0x80,0x7, 0xa5,0xbf,0x5, 0x9, 0xe4,0x6c,0x77,0x12,0x0, 0x5e, +0x2, 0x19,0x6a,0xbe,0x70,0x1, 0x50,0x3, 0x2, 0x19,0x6a,0x2, 0x19,0x6a,0xa5,0xbe, +0x3, 0x15,0xbe,0x70,0xd, 0x28,0x9, 0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x2, 0x19,0x6a, +0x7a,0x73,0x10,0x2b,0x2, 0x19,0x6a,0xa5,0xbe,0x4, 0x15,0xbe,0x70,0x18,0x28,0x9, +0x74,0x18,0x7a,0xb3,0x10,0x2c,0x2, 0x19,0x6a,0x7a,0x73,0x10,0x2c,0x2, 0x19,0x6a, +0xa5,0xbe,0x5, 0x7, 0x7a,0x73,0x10,0x2d,0x2, 0x19,0x6a,0xa5,0xbe,0x7, 0x1e,0x7a, +0x73,0x10,0x4b,0x7c,0xb7,0x54,0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0x10, +0x54,0x5e,0x70,0x3, 0x4d,0x32,0x7a,0x37,0x10,0x54,0x2, 0x19,0x6a,0xa5,0xbe,0x8, +0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xac,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x16,0x2, 0x19,0x6a,0xa5,0xbe,0x9, 0x1c,0xbe,0x70,0xa, 0x50,0x3, 0x7e,0x70, +0xa, 0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xad,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x49,0x2, 0x19,0x6a,0xa5,0xbe,0xa, 0x10,0xa5,0xbf,0x0, 0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x10,0x3b,0x2, 0x19,0x6a,0xa5,0xbe,0xb, 0x14,0x7e,0xb3,0x10, +0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xae,0x2, 0x19,0x6a,0x7a,0x73,0x11,0x94,0x2, 0x19, +0x6a,0xa5,0xbe,0xc, 0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xd, 0xfe,0x2, +0x19,0x6a,0x7a,0x73,0x11,0x9d,0x2, 0x19,0x6a,0xa5,0xbe,0x4c,0x7, 0x7a,0x73,0xf, +0x46,0x2, 0x19,0x6a,0xa5,0xbe,0xfb,0x29,0x7a,0x71,0x8, 0x7e,0x37,0x10,0x50,0x5e, +0x70,0xdf,0x7a,0x37,0x10,0x50,0xe5,0x8, 0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x4e,0x37,0x10,0x50,0x7a,0x37,0x10,0x50,0x2, 0x19, +0x6a,0xa5,0xbe,0x4e,0x7, 0x7a,0x73,0x10,0x4a,0x2, 0x19,0x6a,0xa5,0xbe,0x4f,0x6, +0x12,0x0, 0x6, 0x2, 0x19,0x6a,0xbe,0x60,0x50,0x40,0x12,0xbe,0x60,0x51,0x38,0xd, +0xa, 0x26,0x2e,0x27,0x10,0x2f,0x9e,0x24,0x0, 0x50,0x2, 0x19,0x54,0xbe,0x60,0x52, +0x40,0x12,0xbe,0x60,0x55,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x31,0x9e,0x24,0x0, +0x52,0x2, 0x19,0x54,0xbe,0x60,0x56,0x40,0x12,0xbe,0x60,0x62,0x38,0xd, 0xa, 0x26, +0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x56,0x2, 0x19,0x54,0xbe,0x60,0x63,0x40,0x12, +0xbe,0x60,0x7a,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x63,0x2, +0x19,0x54,0xbe,0x60,0x7b,0x50,0x3, 0x2, 0x18,0xe8,0xbe,0x60,0x9f,0x28,0x3, 0x2, +0x18,0xe8,0x7e,0xb3,0x10,0x3b,0x70,0x48,0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24, +0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29, +0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f,0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17, +0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29, +0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, 0x2f,0x19,0x72,0xf, 0xdc,0x2, 0x19,0x6a, +0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27, +0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29,0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f, +0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17,0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27, +0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29,0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, +0x2f,0x19,0x72,0xf, 0x63,0x2, 0x19,0x6a,0xbe,0x60,0xa0,0x40,0x11,0xbe,0x60,0xac, +0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6c,0x9e,0x24,0x0, 0xa0,0x80,0x56,0xbe,0x60, +0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6e,0x9e,0x24, +0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38,0xc, 0xa, 0x26, +0x2e,0x27,0x10,0x70,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2,0x40,0x11,0xbe, +0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x72,0x9e,0x24,0x0, 0xd2,0x80,0x14, +0xbe,0x60,0xd6,0x40,0x14,0xbe,0x60,0xed,0x38,0xf, 0xa, 0x26,0x2e,0x27,0x10,0x74, +0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x80,0x11,0xa5,0xbe,0xf8,0x6, 0x7a,0x73,0x11, +0xe8,0x80,0x7, 0xa5,0xbe,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x3b,0x22,0xca,0x3b,0xe4, +0x7a,0xb3,0x13,0xde,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x23,0x6c,0xee,0x7e,0xa0,0xff, +0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0xff,0xa, 0x3e,0x19,0xb3,0x13, +0xca,0x7e,0x34,0xff,0xff,0x74,0x2, 0xac,0xbe,0x59,0x35,0x13,0xb6,0xe4,0xa, 0x3e, +0x19,0xb3,0x13,0xd4,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xd2,0x7e,0xb3,0xf, 0x1b,0x60, +0x3, 0x2, 0x19,0xe5,0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0x2, 0x1c,0x18,0x6c,0xee,0x7e, +0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, +0x78,0xdd,0x2, 0x1c,0x18,0x7e,0xb3,0xf, 0x1c,0x60,0x3, 0x2, 0x1a,0x38,0x6c,0xee, +0x2, 0x1a,0x2d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5e, +0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19, +0xe5,0xe, 0x11,0x74,0x1, 0xa, 0x3e,0x19,0xb3,0x13,0xd4,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0xbe,0x2, 0x1c,0x18,0x6c,0xee,0x2, 0x1a,0xb7,0x6c,0xff,0xa, +0x3f,0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x1a,0xae, +0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x1a,0xae,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23, +0x49,0x23,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x9d,0x32,0x12,0x6e, +0x11,0x7d,0x63,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23,0x49,0x23,0x0, 0x14,0x74, +0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6e,0x11,0x2d,0x36,0x7a,0x35, +0x21,0x74,0x2, 0xac,0xbe,0x49,0x45,0x13,0xb6,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x1a, +0xae,0xa, 0x4e,0x19,0xf4,0x13,0xca,0x7e,0x35,0x21,0x59,0x35,0x13,0xb6,0xb, 0xf0, +0xbe,0xf0,0xa, 0x78,0x8a,0xb, 0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, +0x1a,0x3d,0x6c,0xee,0x2, 0x1b,0x6e,0x74,0x1, 0x7a,0xb3,0x13,0xde,0x6c,0xff,0x2, +0x1b,0xd, 0xbc,0xfe,0x78,0x3, 0x2, 0x1b,0xb, 0xa, 0x3f,0x9, 0x63,0x13,0xca,0xa, +0x2e,0x9, 0x72,0x13,0xca,0xbc,0x76,0x68,0x3, 0x2, 0x1b,0xb, 0x74,0x2, 0xac,0xbf, +0x49,0x25,0x13,0xb6,0x74,0x2, 0xac,0xbe,0x49,0x35,0x13,0xb6,0xbd,0x32,0x50,0x3, +0x2, 0x1b,0xb, 0xe4,0x7a,0xb3,0x13,0xde,0x2, 0x1b,0x15,0xb, 0xf0,0x7e,0x73,0xf, +0x1b,0xbc,0x7f,0x38,0xbd,0x7e,0xb3,0x13,0xde,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1b, +0x6c,0x74,0x1, 0xa, 0x3e,0x9, 0xa3,0x13,0xca,0xa, 0x4a,0x19,0xb4,0x13,0xd4,0x7e, +0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, +0xa, 0x2e,0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32, +0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0xa, 0x2e,0x9, 0x42,0x13,0xca, +0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0x7e,0x73, +0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, 0x1a,0xc7,0x6c,0xee,0x2, 0x1b,0xdd,0x74,0x7, +0xac,0xbe,0x9, 0xb5,0xe, 0x11,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x1b,0xdb,0x6c,0xff, +0xa, 0x3f,0x9, 0xb3,0x13,0xd4,0x60,0x3, 0x2, 0x1b,0xd4,0x74,0x1, 0x19,0xb3,0x13, +0xd4,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0x50,0x2, +0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19,0xf5,0xe, +0x11,0x2, 0x1b,0xdb,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xb5,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0x99,0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13,0xd4,0xbe,0xb0,0x1, +0x78,0x3, 0x2, 0x1c,0x11,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x14,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, +0x28,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xcf,0x7e,0xf3,0xf, 0x1b,0x6c,0xee,0xa, 0x3e, +0x9, 0xb3,0x13,0xd4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x6a,0xa, 0x3e,0x2e,0x35, +0x23,0x9, 0xb3,0x0, 0xa, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x43,0x74,0x3, 0x19, +0xb3,0x0, 0xa, 0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xa3,0x0, 0xa, 0xbe,0xa0,0x3, 0x68, +0x3, 0x2, 0x1c,0x5b,0xe4,0x7a,0x39,0xb0,0x2, 0x1c,0x98,0x4c,0xaa,0x68,0x3, 0x2, +0x1c,0x98,0x74,0x2, 0x7a,0x39,0xb0,0x2, 0x1c,0x98,0xa, 0x3e,0x2e,0x35,0x23,0x9, +0xb3,0x0, 0xa, 0xbe,0xb0,0x2, 0x78,0x3, 0x2, 0x1c,0x80,0x60,0x3, 0x2, 0x1c,0x93, +0x74,0x1, 0x7a,0x39,0xb0,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4,0x19,0xe5,0xe, 0x11, +0x2, 0x1c,0x98,0x74,0x3, 0x7a,0x39,0xb0,0xa, 0x2e,0x2e,0x25,0x23,0x7e,0x29,0x70, +0x19,0x72,0x0, 0xa, 0xb, 0xe0,0xbe,0xe0,0xa, 0x50,0x3, 0x2, 0x1c,0x1e,0xda,0x3b, +0x22,0xca,0x3b,0x75,0x24,0x0, 0x75,0x26,0x0, 0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e, +0x34,0xe, 0xdf,0x7a,0x35,0x2a,0x7e,0xa3,0xf, 0x24,0x4c,0xaa,0x78,0xf, 0x7e,0xb3, +0xf, 0x20,0x70,0x9, 0x7e,0xb3,0xf, 0x21,0x70,0x3, 0x2, 0x1f,0x70,0x4c,0xaa,0x78, +0x11,0x7e,0xb3,0xf, 0x20,0x60,0x16,0x80,0x9, 0x7e,0x73,0x16,0xba,0xbe,0x70,0xf, +0x38,0x6, 0x7e,0xb3,0x15,0xde,0x60,0xf1,0xe4,0x7a,0xb3,0x15,0xde,0x20,0x0, 0x6, +0x7e,0x74,0x0, 0x76,0x80,0x4, 0x7e,0x74,0x0, 0xb8,0x7d,0x37,0x7e,0x24,0x0, 0x42, +0x74,0xff,0x12,0x6e,0x21,0x74,0xaa,0x7a,0x79,0xb0,0x19,0xb7,0x0, 0x1, 0x7e,0x73, +0xf, 0x1d,0x19,0x77,0x0, 0x3, 0x75,0x25,0x0, 0x6c,0xdd,0x2, 0x1e,0xfd,0x7e,0x70, +0x7, 0xac,0x7d,0x9, 0xa3,0xe, 0x9d,0x7a,0xa1,0x29,0x7c,0xba,0x54,0xf, 0xa, 0x2b, +0x2e,0x25,0x2a,0x7e,0x29,0xc0,0x7c,0xba,0x54,0xf0,0xbe,0xb0,0x0, 0x28,0x13,0xb4, +0xb0,0x2, 0x80,0x3, 0x2, 0x1e,0xfb,0x53,0x29,0xf, 0xbe,0xc0,0x1, 0x68,0x3, 0x2, +0x1e,0xfb,0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x1e,0xfb,0x7e,0xa1,0x25,0x74,0x6, 0xa4, +0xf5,0x21,0x9, 0xb3,0xe, 0x9e,0xf5,0x27,0x74,0x7, 0xac,0xbd,0x9, 0xb5,0xe, 0x9f, +0xc4,0x54,0xf0,0xf5,0x28,0x7e,0x73,0xf, 0x46,0xbe,0x71,0x29,0x28,0x68,0x7e,0xb3, +0xf, 0x22,0x70,0x2a,0x7e,0x8, 0x0, 0x27,0xe5,0x29,0xa, 0x3b,0x2e,0x34,0x15,0xca, +0x74,0x1, 0x7e,0x50,0xf, 0x12,0x5f,0xe0,0x7e,0x8, 0x0, 0x28,0xe5,0x29,0xa, 0x3b, +0x2e,0x34,0x15,0xd4,0x74,0x10,0x7e,0x50,0x20,0x12,0x5f,0xe0,0x80,0x14,0xe5,0x29, +0xa, 0x3b,0x9, 0xb3,0x15,0xca,0xf5,0x27,0xe5,0x29,0xa, 0x3b,0x9, 0xb3,0x15,0xd4, +0xf5,0x28,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x2e,0x25,0x2a,0x7e,0x29,0xb0,0xb4,0x1, +0x15,0xe4,0x19,0xb3,0x15,0xca,0x6c,0xaa,0xe5,0x29,0xa, 0x3b,0x19,0xa3,0x15,0xd4, +0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0xf, 0x5f,0xb4,0xff,0x15,0x74,0x7, 0xac, +0xbd,0x9, 0xb5,0xe, 0x9d,0xbe,0xb0,0xff,0x68,0x5, 0x75,0x27,0x1, 0x80,0x3, 0x75, +0x27,0x0, 0x7e,0x90,0x7, 0xac,0x9d,0x49,0x54,0xe, 0x99,0x7a,0x55,0x2c,0x49,0x54, +0xe, 0x9b,0x7a,0x55,0x2e,0xbe,0xc0,0x1, 0x78,0x2e,0x75,0x30,0x0, 0x7e,0x71,0x30, +0x74,0x7, 0xac,0x7b,0x9, 0xb3,0x15,0xe3,0x54,0xf, 0xbe,0xb1,0x29,0x78,0x10,0x49, +0x23,0x15,0xdf,0x7a,0x25,0x2c,0x49,0x53,0x15,0xe1,0x7a,0x55,0x2e,0x80,0x9, 0x5, +0x30,0xe5,0x30,0xbe,0xb0,0xa, 0x40,0xd5,0x7e,0x25,0x2c,0x7a,0x25,0x22,0xa, 0x54, +0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x21,0xa, 0x3b,0x7d,0x13,0x2d,0x17,0x19,0xa1, +0x0, 0x5, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x6, 0x7e,0x25,0x2e,0x7a,0x25,0x22, +0xa, 0x14,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x57,0x19,0x35,0x0, 0x7, 0x7d,0x53, +0x2d,0x57,0x19,0x55,0x0, 0x8, 0xe5,0x27,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0x9, +0xe5,0x28,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0xa, 0x9, 0xa4,0xe, 0x9d,0x7c,0xba, +0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x27,0x2e,0x24,0x0, 0x7, 0x7e,0x29,0xb0, +0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x21,0xbe,0xc0,0x1, 0x68,0x2, 0x5, +0x24,0x5, 0x26,0x7c,0xbc,0x3, 0x3, 0x54,0xc0,0x7d,0x13,0x2d,0x17,0x2e,0x14,0x0, +0x5, 0x7e,0x19,0x50,0x2c,0x5b,0x7a,0x19,0x50,0x80,0xe, 0x2d,0x37,0x2e,0x34,0x0, +0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x25,0xb, 0xd0,0x7e,0x73,0xf, +0x46,0xbc,0x7d,0x28,0x3, 0x2, 0x1d,0x2e,0xe5,0x24,0x19,0xb7,0x0, 0x4, 0xe5,0x26, +0xbe,0xb0,0x0, 0x28,0x2d,0x74,0x42,0x19,0xb7,0x0, 0x2, 0xe4,0x19,0xb7,0x0, 0x41, +0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e,0x24,0x0, 0x41,0x7e, +0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x41,0x78,0xe4,0xb2,0x0, +0x80,0xe, 0x7e,0xb3,0xf, 0x21,0xb4,0x1, 0xc, 0x7e,0xb3,0x10,0xd1,0xb4,0x24,0x5, +0x74,0x1, 0x12,0x6e,0xd3,0x7e,0xb3,0xf, 0x20,0x60,0x6, 0x7e,0x35,0x2a,0x12,0x68, +0x79,0xe4,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x20,0x7a,0xb3,0xf, 0x21,0x80,0x4, +0xe4,0x12,0x6e,0xd3,0x7e,0x24,0xe, 0x99,0x7e,0x34,0x15,0xdf,0x7e,0x14,0x0, 0x46, +0x12,0x6d,0x7d,0xe5,0x26,0x70,0xd, 0x7e,0x34,0x15,0xdf,0x7e,0x24,0x0, 0x46,0x74, +0xff,0x12,0x6e,0x21,0xda,0x3b,0x22,0xca,0x79,0x75,0x26,0x17,0x7e,0xb3,0xd, 0xf7, +0xf5,0x21,0x70,0x3, 0x2, 0x22,0x39,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x1, 0x2b,0xe4, +0x12,0x6e,0x21,0x7e,0x34,0x14,0xe1,0x7e,0x24,0x0, 0x2, 0xe4,0x12,0x6e,0x21,0x6c, +0xaa,0x2, 0x20,0x4e,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, 0x18,0x9, 0x23,0xd, +0x19,0x1a,0x3, 0x1b,0x5, 0x80,0x69,0xbe,0x10,0x0, 0x48,0x62,0xbe,0x10,0xd, 0x58, +0x5d,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, +0x7e,0x74,0x0, 0x1, 0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x7c,0xef,0xa, 0x40,0x2e, +0x44,0x14,0xe1,0x7e,0x49,0xb0,0x4c,0xbe,0x7a,0x49,0xb0,0x1a,0x32,0x1b,0x35,0x7c, +0xf7,0x80,0x1f,0xbe,0xf0,0x0, 0x48,0x18,0xe5,0x26,0xbc,0xbf,0x8, 0x12,0x74,0x1, +0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0x4f,0x2d,0x43,0x19,0xb4,0x13,0xb6, +0xb, 0xf0,0x1a,0x22,0x2e,0x24,0x0, 0x3, 0x1a,0x3f,0xbd,0x32,0x48,0xd5,0xb, 0x10, +0x1a,0x23,0x2e,0x24,0x0, 0x3, 0x1a,0x31,0xbd,0x32,0x48,0x8b,0xb, 0xa0,0xe5,0x21, +0xbc,0xba,0x28,0x3, 0x2, 0x1f,0xc4,0x6c,0x11,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, +0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0xe9,0xa, 0x30,0x9, 0xb3,0x14,0xe1,0x5c,0xbe,0x78,0x3, 0x2, +0x21,0x15,0x6d,0x33,0x7a,0x35,0x22,0x75,0x24,0x0, 0x1a,0x21,0x7e,0x34,0x0, 0x30, +0xad,0x32,0x7d,0x43,0x2e,0x47,0xf, 0xda,0x6c,0x0, 0x80,0x26,0x1a,0xe1,0x7e,0xf4, +0x0, 0x17,0xad,0xfe,0xa, 0x30,0x2d,0x3f,0x9, 0xb3,0x13,0xb6,0x70,0x12,0x7e,0x70, +0x2, 0xac,0x70,0x2d,0x34,0xb, 0x38,0x30,0x2e,0x35,0x22,0x7a,0x35,0x22,0x5, 0x24, +0xb, 0x0, 0xe5,0x26,0xbc,0xb0,0x38,0xd4,0xe5,0x24,0x60,0x49,0xe5,0x24,0x1a,0x2b, +0x7e,0x35,0x22,0x12,0x48,0x53,0x7a,0x35,0x22,0x6c,0xff,0x80,0x32,0x1a,0x21,0x7e, +0x34,0x0, 0x17,0xad,0x32,0x1a,0xff,0x7d,0xe3,0x2d,0xef,0x9, 0xbe,0x13,0xb6,0xb4, +0x1, 0x1b,0x1a,0x21,0x7e,0x34,0x0, 0x18,0xad,0x32,0x7d,0x23,0x2d,0x2f,0x3e,0x24, +0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x9e,0x35,0x22,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x26,0xbc,0xbf,0x18,0xc8,0xb, 0x10,0xa5,0xb9,0xd, 0x2, 0x80,0x3, 0x2, 0x20,0x59, +0x6c,0xaa,0x2, 0x22,0x30,0x7e,0x10,0x2, 0xac,0x1a,0x9, 0x30,0xd, 0x18,0x9, 0x20, +0xd, 0x19,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xf5,0x25,0x7c,0xba,0x54,0x7, 0x7e,0x44, +0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa5,0xbb,0x0, 0x2c,0x1a, +0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, +0xda,0xb, 0x38,0x20,0x49,0x33,0x0, 0x30,0xbd,0x32,0x18,0x3, 0x2, 0x21,0xf5,0x1a, +0x33,0xb, 0x34,0x7c,0xb7,0x19,0xb0,0xd, 0x18,0x80,0x7a,0xa5,0xbb,0xc, 0x2c,0x1a, +0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x22,0x2d,0x23,0x3e,0x24,0x2e,0x27,0xf, +0xda,0xb, 0x28,0x30,0x49,0x2, 0xff,0xd0,0xbd,0x3, 0x8, 0x59,0x1a,0x33,0x1b,0x34, +0x7e,0x10,0x2, 0xac,0x1a,0x19,0x70,0xd, 0x18,0x80,0x4a,0x1a,0xe3,0x7e,0xf4,0x0, +0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x49,0x43,0x0, +0x30,0x49,0x3, 0xff,0xd0,0xbd,0x4, 0x8, 0x16,0xb, 0x38,0x20,0xbd,0x2, 0x8, 0x25, +0x1a,0x23,0x1b,0x24,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x50,0xd, 0x18,0x80,0x16,0xb, +0x38,0x0, 0xbd,0x40,0x8, 0xf, 0x1a,0x33,0xb, 0x34,0x7c,0x37,0x7e,0x10,0x2, 0xac, +0x1a,0x19,0x30,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, 0x18,0x1a,0x23, +0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x2, 0x2d,0x3, 0x3e,0x4, 0x2e,0x7, 0xf, 0xda, +0xb, 0x8, 0x0, 0xbe,0x4, 0x0, 0x3c,0x58,0x15,0x7c,0x7e,0x6e,0x70,0xff,0xe5,0x25, +0xa, 0x4b,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x5c,0xb7,0x7a,0x49,0xb0,0xb, 0xa0, +0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x21,0x25,0xda,0x79,0x22,0xca,0xd8,0xca,0x79, +0x6c,0xaa,0x7e,0x34,0x11,0x9e,0x7e,0x44,0x11,0x4a,0xe4,0x7a,0xb3,0x16,0xbb,0x7e, +0xb3,0xe, 0xa, 0x54,0xfe,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, 0x17,0xbe,0xb0,0x0, +0x28,0x4f,0x7e,0x53,0xd, 0xf8,0xbe,0x50,0x0, 0x28,0x46,0x6c,0xff,0x80,0x3c,0x7e, +0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x40,0x9, 0xe1,0xd, 0x41,0x7e,0x30,0x2, 0xac, +0x3e,0x2d,0x13,0xb, 0x18,0x0, 0x6d,0x11,0x9e,0x17,0xf, 0x4c,0xbd,0x1, 0x58,0x19, +0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x13,0x49,0x1, 0x0, 0x30,0x6d,0x11,0x9e,0x17,0xf, +0x4a,0xbd,0x1, 0x58,0x4, 0x5, 0x1d,0x80,0xb, 0xb, 0xf0,0xbc,0x5f,0x38,0xc0,0x80, +0x3, 0x75,0x1d,0x0, 0xe5,0x1d,0xbe,0xb0,0x3, 0x40,0x17,0x7e,0xb3,0xe, 0xa, 0x44, +0x1, 0x7a,0xb3,0xe, 0xa, 0x75,0x1d,0x0, 0x7e,0xb3,0x16,0xbb,0x44,0x1, 0x7a,0xb3, +0x16,0xbb,0x7e,0xb3,0xe, 0xa, 0x54,0xfd,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, 0x16, +0x70,0x59,0x7e,0x53,0xd, 0xf7,0xbe,0x50,0x0, 0x28,0x50,0x6c,0xff,0x80,0x48,0x7e, +0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x18,0x9, 0xe1,0xd, 0x19,0x7e,0x30,0x2, 0xac, +0x3d,0x2d,0x14,0x49,0x11,0x0, 0x30,0x6d,0x0, 0x9e,0x7, 0xd, 0xff,0xbd,0x10,0x48, +0xe, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x14,0xb, 0x18,0x10,0xbd,0x10,0x58,0x16,0x7e, +0xb3,0xe, 0xa, 0x44,0x2, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x2, 0x7a, +0xb3,0x16,0xbb,0x80,0x6, 0xb, 0xf0,0xbc,0x5f,0x38,0xb4,0x7e,0xb3,0xe, 0x9, 0xb4, +0x1, 0x2, 0x80,0x3, 0x2, 0x23,0xdf,0x7e,0xb3,0xd, 0x16,0x70,0x6d,0x6c,0xff,0x80, +0x61,0x7e,0x50,0x2, 0xac,0x5f,0x7d,0x12,0x2d,0x14,0xb, 0x18,0x10,0xbe,0x17,0xd, +0xff,0x8, 0x4d,0x2d,0x23,0xb, 0x28,0x20,0xbe,0x27,0xd, 0xff,0x58,0x42,0xbe,0xf1, +0x1e,0x68,0x6, 0x7a,0xf1,0x1e,0x75,0x1f,0x0, 0xbe,0xf1,0x1e,0x78,0x2, 0x5, 0x1f, +0xe5,0x1f,0xbe,0xb0,0x10,0x28,0x33,0x75,0x1f,0x10,0xe5,0x51,0x70,0x16,0x7e,0xb3, +0xe, 0xa, 0x44,0x4, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x4, 0x7a,0xb3, +0x16,0xbb,0x80,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x80,0xa, +0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0x97,0x6c,0xaa,0x6c,0xff,0x80,0x17, +0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x34,0xb, 0x38,0x30,0xbe,0x37,0xd, 0xff,0x8, 0x5, +0x7e,0xa0,0x1, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0xe1,0x4c, +0xaa,0x78,0x1a,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x75,0x1e,0xff, +0x75,0x1f,0x0, 0x7e,0xb3,0x16,0xbb,0x54,0xfb,0x7a,0xb3,0x16,0xbb,0x7e,0xb3,0xe, +0xa, 0x54,0xf7,0x7a,0xb3,0xe, 0xa, 0x7e,0x73,0xd, 0xfa,0xa, 0x27,0x7e,0x73,0xd, +0xf9,0xa, 0x37,0x2d,0x32,0xbe,0x37,0xe, 0x3, 0x28,0x14,0x7e,0xb3,0xe, 0xa, 0x44, +0x8, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x8, 0x7a,0xb3,0x16,0xbb,0x7e, +0xb3,0xe, 0xa, 0x44,0x10,0x7a,0xb3,0xe, 0xa, 0x6c,0xff,0x80,0x49,0x7e,0x50,0x2, +0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70,0x18,0xac,0x7d,0xa, +0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x49,0x22,0x10,0x3, +0x9d,0x32,0x7a,0x35,0x21,0x12,0x6e,0x11,0xbe,0x37,0xe, 0x1, 0x28,0x16,0x7e,0xb3, +0xe, 0xa, 0x54,0xef,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbb,0x44,0x10,0x7a,0xb3, +0x16,0xbb,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xaf,0x7e,0x34, +0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x12,0x6e,0x21,0x6c,0xff,0x80,0x25,0x7e,0x50, +0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70,0x18,0xac,0x7d, +0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x59,0x32,0x10, +0x3, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xd3,0xda,0x79,0xda,0xd8,0x22, +0xca,0x3b,0x6d,0x33,0x7a,0x35,0x21,0x75,0x25,0x0, 0x75,0x26,0x0, 0x7e,0x23,0xd, +0xf7,0x7a,0x21,0x23,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x13,0xb6,0x7e,0x30,0x2, 0xac, +0x23,0x7e,0x24,0xd, 0x18,0x7e,0x34,0x13,0xb8,0x12,0x6d,0x7d,0xe5,0x23,0xbe,0xb0, +0xa, 0x38,0x3, 0x2, 0x26,0xd5,0x75,0x24,0x0, 0x6c,0xff,0x2, 0x25,0xe9,0x7e,0x34, +0x3, 0xff,0x7a,0x35,0x27,0x75,0x26,0xff,0x6c,0xee,0x80,0x7e,0x7e,0x70,0x2, 0xac, +0x7e,0x9, 0xb3,0x13,0xb8,0xbe,0xb0,0xff,0x68,0x6e,0x7c,0xbe,0xc4,0x23,0x54,0x1f, +0x7c,0xab,0x7a,0xa1,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e, +0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x2c,0xa, 0x2a,0x9, 0xb2,0xd, 0x68,0x55,0x2c, +0x68,0x46,0x9, 0x73,0x13,0xb9,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa3, +0xa, 0x37,0x9d,0x32,0x12,0x6e,0x11,0x7d,0x63,0x74,0x2, 0xac,0xbe,0x9, 0x75,0x13, +0xb8,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa2,0xa, 0x37,0x9d,0x32,0x12, +0x6e,0x11,0x2d,0x36,0x7a,0x35,0x29,0x7e,0x35,0x27,0xbe,0x35,0x29,0x28,0x9, 0x7e, +0x35,0x29,0x7a,0x35,0x27,0x7a,0xe1,0x26,0xb, 0xe0,0xe5,0x23,0xbc,0xbe,0x28,0x3, +0x2, 0x25,0x1c,0xe5,0x26,0xbe,0xb0,0xff,0x68,0x3d,0x7e,0x71,0x26,0x74,0x2, 0xac, +0x7b,0x9, 0x33,0x13,0xb8,0x7e,0x50,0x18,0xac,0x53,0x9, 0xa3,0x13,0xb9,0xa, 0xa, +0x2d,0x20,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28,0x20,0xbe,0x24,0x0, 0x3c,0x48, +0x16,0xe5,0x24,0x1a,0x2b,0x3e,0x24,0x19,0x32,0x13,0xe0,0x19,0xa2,0x13,0xe1,0x74, +0xff,0x19,0xb3,0x13,0xb8,0x5, 0x24,0xb, 0xf0,0xe5,0x11,0xbc,0xbf,0x28,0x3, 0x2, +0x25,0xe, 0x7e,0xf1,0x24,0x2, 0x26,0xbb,0x6d,0x33,0x7a,0x35,0x21,0x7e,0xa0,0xff, +0x6c,0xee,0x2, 0x26,0x8d,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0x7b,0x7a,0x71,0x2b, +0x7c,0xbe,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0xb9,0xf5,0x2c,0xa, 0x37,0x9, 0xb3,0xd, 0x68,0x55,0x2c,0x68,0x5e,0x7e,0x90,0x2, +0xac,0x9e,0x9, 0x44,0x13,0xb8,0xbe,0x40,0xff,0x68,0x50,0x7e,0x50,0x18,0xac,0x45, +0x9, 0xb4,0x13,0xb9,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28, +0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac, +0x5e,0x9, 0x62,0x13,0xb8,0x7e,0x30,0x18,0xac,0x36,0x9, 0x72,0x13,0xb9,0xa, 0x7, +0x2d,0x10,0x3e,0x14,0x2e,0x17,0x13,0xb6,0xb, 0x18,0x40,0xbe,0x45,0x21,0x8, 0xb, +0x7a,0x61,0x25,0x7a,0x71,0x26,0x7a,0x45,0x21,0x7c,0xae,0xb, 0xe0,0xe5,0x23,0xbc, +0xbe,0x28,0x3, 0x2, 0x26,0x5, 0xbe,0xa0,0xff,0x68,0x1e,0x7e,0x71,0x25,0x7e,0x90, +0x2, 0xac,0x9f,0x19,0x74,0x13,0xe0,0xe5,0x26,0x19,0xb4,0x13,0xe1,0x7e,0x70,0xff, +0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x13,0xb8,0xb, 0xf0,0xbe,0xf0,0xa, 0x50,0x3, +0x2, 0x25,0xf8,0x7e,0x24,0x13,0xe0,0x7e,0x34,0x13,0xb8,0x7e,0x14,0x0, 0x28,0x12, +0x6d,0x7d,0x75,0x23,0xa, 0x7e,0x34,0x15,0xa2,0x7e,0x24,0x0, 0x14,0x74,0xff,0x12, +0x6e,0x21,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0x55,0x7e,0x31,0x23,0x74,0x2, 0xac,0x3b, +0x7e,0x24,0x13,0xb8,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x7d,0x7e,0x31,0x23,0x74,0x2, +0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0x15,0xa2,0x12,0x6d,0x7d,0x6c,0xff,0x80, +0x27,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb, +0x7c,0x67,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24,0xd, 0x68,0x7e,0x29, +0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xf0,0xe5,0x23,0xbc,0xbf,0x38,0xd3,0x85,0x23, +0x11,0xe5,0x23,0x7a,0xb3,0xd, 0xf7,0xda,0x3b,0x22,0x7c,0x7b,0xbe,0x70,0x10,0x40, +0x12,0xbe,0x70,0x4b,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x0, 0xfb,0x9e,0x34,0x0, 0x10, +0x2, 0x29,0x85,0xa5,0xbf,0x0, 0x3, 0xe5,0xb, 0x22,0xa5,0xbf,0x1, 0x3, 0xe5,0xd, +0x22,0xa5,0xbf,0x2, 0x5, 0x7e,0xb3,0xf, 0x28,0x22,0xbe,0x70,0x3, 0x40,0x12,0xbe, +0x70,0x5, 0x38,0xd, 0xa, 0x37,0x2e,0x34,0x10,0x2b,0x9e,0x34,0x0, 0x3, 0x2, 0x29, +0x85,0xa5,0xbf,0x6, 0x3, 0x74,0x1, 0x22,0xa5,0xbf,0x7, 0x5, 0x7e,0xb3,0x10,0x4b, +0x22,0xa5,0xbf,0x8, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xac,0x22, +0x7e,0xb3,0x11,0x16,0x22,0xa5,0xbf,0x9, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e, +0xb3,0xa, 0xad,0x22,0x7e,0xb3,0x11,0x49,0x22,0xa5,0xbf,0xa, 0x5, 0x7e,0xb3,0x10, +0x3b,0x22,0xa5,0xbf,0xb, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xae, +0x22,0x7e,0xb3,0x11,0x94,0x22,0xa5,0xbf,0xc, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, +0x7e,0xb3,0xd, 0xfe,0x22,0x7e,0xb3,0x11,0x9d,0x22,0xa5,0xbf,0x4c,0x5, 0x7e,0xb3, +0xf, 0x46,0x22,0xa5,0xbf,0xfb,0x3, 0xe5,0x8, 0x22,0xa5,0xbf,0x4e,0x5, 0x7e,0xb3, +0x10,0x4a,0x22,0xbe,0x70,0x50,0x40,0x12,0xbe,0x70,0x51,0x38,0xd, 0xa, 0x37,0x2e, +0x37,0x10,0x2f,0x9e,0x34,0x0, 0x50,0x2, 0x29,0x85,0xbe,0x70,0x52,0x40,0x12,0xbe, +0x70,0x55,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x31,0x9e,0x34,0x0, 0x52,0x2, 0x29, +0x85,0xbe,0x70,0x56,0x40,0x12,0xbe,0x70,0x62,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10, +0x33,0x9e,0x34,0x0, 0x56,0x2, 0x29,0x85,0xbe,0x70,0x63,0x40,0x12,0xbe,0x70,0x7a, +0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x63,0x2, 0x29,0x85,0xbe, +0x70,0x7b,0x50,0x3, 0x2, 0x29,0x19,0xbe,0x70,0x9f,0x28,0x3, 0x2, 0x29,0x19,0x7e, +0xb3,0x10,0x3b,0x70,0x4a,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58, +0x22,0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba, +0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e, +0xa0,0x80,0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70, +0xa, 0x57,0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0xdc,0x22,0xa, +0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x22,0xa, 0x37,0x2e,0x37,0x10, +0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e, +0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e,0xa0,0x80,0x15,0xa, 0x37,0x2e, +0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70,0xa, 0x57,0x2e,0x54,0x0, 0x18, +0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0x63,0x22,0xbe,0x70,0xa0,0x40,0x11,0xbe,0x70, +0xac,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6c,0x9e,0x34,0x0, 0xa0,0x80,0x56,0xbe, +0x70,0xad,0x40,0x11,0xbe,0x70,0xb9,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6e,0x9e, +0x34,0x0, 0xad,0x80,0x40,0xbe,0x70,0xba,0x40,0x11,0xbe,0x70,0xd1,0x38,0xc, 0xa, +0x37,0x2e,0x37,0x10,0x70,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe,0x70,0xd2,0x40,0x11, +0xbe,0x70,0xd5,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x72,0x9e,0x34,0x0, 0xd2,0x80, +0x14,0xbe,0x70,0xd6,0x40,0x13,0xbe,0x70,0xed,0x38,0xe, 0xa, 0x37,0x2e,0x37,0x10, +0x74,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xa5,0xbf,0xf8,0x5, 0x7e,0xb3,0x11, +0xe8,0x22,0xa5,0xbf,0xfe,0x3, 0xe5,0xc, 0x22,0x74,0xff,0x22,0xca,0x3b,0x7e,0x34, +0x22,0xc4,0x7a,0x35,0x25,0x7e,0x34,0x13,0xff,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6e, +0x21,0x75,0x24,0x1, 0x7e,0x73,0x10,0x4d,0x7a,0x73,0x13,0xb6,0xe4,0x7a,0xb3,0x10, +0x4d,0x75,0x22,0x0, 0x6c,0xee,0x80,0x12,0xa, 0x3e,0x2e,0x37,0x10,0x6e,0x7e,0x39, +0xb0,0xbe,0xb1,0x22,0x40,0x2, 0xf5,0x22,0xb, 0xe0,0x7e,0x73,0x10,0x2b,0xbc,0x7e, +0x38,0xe6,0xe5,0x22,0xbe,0xb0,0x1f,0x50,0xe, 0xe5,0x22,0xa, 0x4b,0x7e,0x54,0x0, +0x1f,0x9d,0x54,0xf5,0x22,0x80,0x3, 0x75,0x22,0x0, 0x85,0x22,0x21,0x7e,0x34,0x10, +0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a,0xa5,0x2, 0x2b,0x9a,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x12, +0x69,0x64,0x12,0x6e,0xb9,0x60,0xfb,0xa9,0xb7,0xea,0x7e,0x37,0xf, 0xda,0x7e,0x27, +0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2,0x6c,0xee,0x80,0x78,0x6c,0xff,0x80, +0x6a,0x4c,0xee,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3,0x13,0xe7,0x6d,0x33,0x74,0x2, +0xac,0xbf,0x59,0x35,0x13,0xb7,0xbe,0xf0,0x17,0x78,0x13,0x7e,0x34,0x0, 0x1, 0x7c, +0xbe,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x5e,0x34,0x4, 0x44,0x68,0x3b,0x7e,0x50, +0x30,0xac,0x5e,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x10,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0x7e,0x50,0x2, 0xac,0x5f, +0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xa, 0x3f,0x2e,0x34, +0x13,0xe7,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc, +0x7f,0x38,0x8e,0xb, 0xe0,0x7e,0x73,0x10,0x2b,0xbc,0x7e,0x38,0x80,0x75,0x23,0x0, +0x6c,0xee,0x2, 0x2b,0x78,0xa, 0x3e,0x9, 0xa3,0x13,0xe7,0x4c,0xaa,0x78,0xf, 0x7e, +0x44,0x22,0xc4,0x7e,0x70,0x2, 0xac,0x7e,0x59,0x43,0x13,0xb7,0x80,0x25,0x7e,0x50, +0x2, 0xac,0x5e,0x49,0x12,0x13,0xb7,0xa, 0xa, 0x8d,0x10,0x59,0x12,0x13,0xb7,0x2e, +0x24,0x13,0xb7,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x34,0x22,0xc4,0x7a,0x35,0x25,0x7e,0x64,0x3, 0xe8,0x7e,0x70, +0x2, 0xac,0x7e,0x49,0x23,0x13,0xb7,0x7e,0x15,0x25,0x9d,0x16,0xbd,0x21,0x50,0x23, +0xa, 0x1e,0x2e,0x14,0x13,0xff,0x7e,0x19,0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1e,0x2e, +0x17,0x10,0x74,0x7e,0x19,0xb0,0xbe,0xb1,0x22,0x50,0x32,0x4, 0x7a,0x19,0xb0,0x80, +0x35,0x80,0x2a,0x7d,0x36,0x2e,0x35,0x25,0xbd,0x23,0x28,0x28,0xa, 0x3e,0x2e,0x34, +0x13,0xff,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xa, 0x3e,0x2e,0x37,0x10,0x74,0x7e, +0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14,0x7a,0x39,0xb0,0x80,0x9, 0x5, 0x23,0x75, +0x24,0x0, 0x80,0x2, 0x5, 0x23,0xb, 0xe0,0x7e,0x73,0x10,0x2c,0xbc,0x7e,0x28,0x3, +0x2, 0x2a,0xc5,0x7e,0x34,0x10,0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a, +0xa5,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x23,0x68,0xf, 0x7e,0xa1,0x21,0x7c,0xba,0x14, +0xf5,0x21,0x4c,0xaa,0x68,0x3, 0x2, 0x2a,0xe, 0x7e,0x73,0x13,0xb6,0x7a,0x73,0x10, +0x4d,0x6c,0xff,0x80,0x12,0xa, 0x3f,0x9, 0x73,0x13,0xff,0xbe,0x71,0x22,0x78,0x5, +0x75,0x24,0x0, 0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0xe6,0xe5, +0x24,0xda,0x3b,0x22,0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20,0x0, 0x41, +0x0, 0x42,0x0, 0x22,0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40,0x0, 0xa3, +0x0, 0xa5,0x0, 0x44,0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60,0x0, 0xe5, +0x0, 0xe8,0x0, 0x66,0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80,0x1, 0x47, +0x1, 0x4b,0x0, 0x88,0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0,0x1, 0x89, +0x1, 0xad,0x0, 0xaa,0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xaa,0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0,0x1, 0x69, +0x1, 0x6c,0x0, 0x88,0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80,0x1, 0x27, +0x1, 0x9, 0x0, 0x66,0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60,0x0, 0xc5, +0x0, 0xc6,0x0, 0x44,0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40,0x0, 0x83, +0x0, 0x64,0x0, 0x22,0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20,0x0, 0x21, +0x0, 0x21,0x0, 0x0, 0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb, +0x1, 0xcf,0x0, 0xcb,0xca,0x3b,0x7e,0xb3,0x10,0x3c,0xf5,0x21,0xe4,0x7a,0xb3,0x10, +0x3c,0x7e,0xb3,0x10,0x3a,0xf5,0x22,0x74,0x3, 0x7a,0xb3,0x10,0x3a,0x7e,0x37,0x10, +0x48,0x7e,0x24,0x0, 0x25,0xe4,0x12,0x6e,0x21,0x7e,0xe0,0x7, 0x6d,0x33,0x7a,0x37, +0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x6c,0xdd,0x7e, +0x14,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0xa, 0x2d,0x2e,0x27, +0x10,0x48,0x7e,0x29,0x70,0x4c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78, +0xde,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12, +0x6e,0xc2,0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x6f,0x12,0x55,0x3a,0x6c,0xdd, +0xbe,0xd0,0x18,0x50,0x1e,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf, +0x30,0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x16,0x1e, +0xf0,0x80,0x12,0xa, 0x3d,0x2e,0x37,0x10,0x33,0x9, 0x73,0xff,0xe8,0xa, 0x37,0x2e, +0x34,0x0, 0x18,0x7c,0xf7,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0xb, 0x38, +0x30,0xbe,0x34,0x25,0x80,0x18,0x21,0x7e,0x34,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7d,0x13,0x6e,0x14,0xff,0xff,0xa, 0x2f,0x2e,0x27,0x10,0x48, +0x7e,0x29,0x70,0x5c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78,0x91,0x1b, +0xe0,0xbe,0xe0,0x0, 0x48,0x3, 0x2, 0x2e,0x1c,0x7e,0xe0,0xa, 0x74,0x2, 0x7a,0xb3, +0x10,0x3a,0x2, 0x2f,0xeb,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a, +0x37,0xa, 0xaf,0x12,0x6f,0x10,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c, +0xa, 0x65,0x2d,0x63,0x7c,0xcd,0x6c,0xdd,0x2, 0x2f,0xb3,0x7e,0xa3,0x10,0x2c,0xbc, +0xad,0x28,0x27,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf,0x30,0xe0, +0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x2, 0x1e,0xf0,0x7e, +0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x80,0x27,0xa, 0x2a,0xa, 0x3d,0x9d,0x32, +0x2e,0x37,0x10,0x33,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34,0x0, 0x18,0x7c,0xf7,0x7e, +0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xa4,0x9d, +0x35,0xb, 0x38,0x30,0x7a,0x35,0x23,0xbe,0x34,0x2e,0xe0,0x8, 0x18,0x4c,0xee,0x68, +0x30,0xa, 0x2f,0x2e,0x27,0x10,0x48,0x7e,0x29,0xb0,0xbe,0xb0,0xfe,0x50,0x22,0x4, +0x7a,0x29,0xb0,0x80,0x1c,0xbe,0x34,0x17,0x70,0x58,0x14,0xa, 0x3f,0x2e,0x37,0x10, +0x48,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x7a,0x39,0xb0,0x80,0x2, 0x1b, +0xc0,0xb, 0xd0,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c,0xa, 0x25,0x2d, +0x23,0xa, 0x3d,0xbd,0x32,0x58,0x3, 0x2, 0x2f,0x1b,0x4c,0xcc,0x68,0x28,0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60, +0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x6f,0x12,0x55,0x3a,0x7c,0xae,0x1b,0xe0,0x4c, +0xaa,0x68,0x3, 0x2, 0x2e,0xf5,0xe5,0x21,0x7a,0xb3,0x10,0x3c,0xe5,0x22,0x7a,0xb3, +0x10,0x3a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x24,0x15,0x56,0x7e,0x34,0x13, +0xfe,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0xb6, +0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x13,0xfc,0x7e, +0x73,0xf, 0x1c,0x7a,0x73,0x13,0xfd,0x7e,0xa3,0x13,0xfc,0xbe,0xa0,0x1, 0x38,0x3, +0x7e,0xf0,0x1, 0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0xe4,0x80,0x10,0x7e,0xb3,0x15,0xa1, +0x4, 0x7a,0xb3,0x15,0xa1,0xbe,0xb0,0xc8,0x28,0x6, 0x74,0x14,0x7a,0xb3,0x15,0xa1, +0x7e,0xb3,0x15,0xa1,0xbe,0xb0,0x6, 0x50,0x3, 0x7e,0xf0,0x1, 0xbe,0xa0,0x1, 0x28, +0x3f,0x7e,0x34,0x0, 0x21,0x7e,0x24,0x0, 0x23,0x7e,0x14,0x13,0xfe,0x12,0x66,0x16, +0x7e,0x34,0x0, 0x25,0x7e,0x24,0x0, 0x27,0x7e,0x14,0x13,0xb6,0x12,0x66,0x16,0x7e, +0x35,0x25,0x9e,0x35,0x21,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x80,0x18,0xf, 0x7e,0x35, +0x27,0x9e,0x35,0x23,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x80,0x8, 0x3, 0x7e,0xf0,0x1, +0xbe,0xf0,0x0, 0x28,0x3, 0x2, 0x31,0x63,0x7e,0xf3,0x15,0x9f,0xbe,0xf3,0x15,0x29, +0x50,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73,0x13,0xfc,0x28,0x12,0x7e,0x24,0x15,0x56, +0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x2, 0x31,0x63,0x7e,0x73, +0x15,0x9e,0xbe,0x70,0x2, 0x58,0x22,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e, +0x14,0x0, 0x48,0x12,0x6d,0x7d,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15, +0x53,0x7e,0xb3,0x15,0x9e,0x4, 0x2, 0x31,0x9f,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4, +0x7a,0xb3,0x15,0x53,0x2, 0x31,0x9f,0xbe,0xf3,0x15,0x29,0x78,0x2d,0x7e,0xa3,0x15, +0x29,0xbe,0xa3,0x13,0xfc,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3, +0x15,0x53,0x80,0x6b,0xbe,0xa3,0x13,0xfc,0x28,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0x7a, +0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0x80,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73, +0x13,0xfc,0x50,0x1a,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48, +0x12,0x6d,0x7d,0xe4,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0x53,0x80,0x31,0x7e,0x73, +0x15,0x53,0xbe,0x70,0x2, 0x58,0x1c,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e, +0x14,0x0, 0x48,0x12,0x6d,0x7d,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0x7e,0xb3,0x15,0x53, +0x4, 0x80,0x7, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0xe4,0x7a, +0xb3,0x15,0x9e,0x7e,0xb3,0x15,0xa0,0x14,0x68,0x9, 0x4, 0x78,0x15,0x7e,0x24,0x13, +0xb6,0x80,0x4, 0x7e,0x24,0x14,0xe3,0x7e,0x34,0x15,0x56,0x7e,0x14,0x0, 0x48,0x12, +0x6d,0x7d,0x7e,0x73,0x15,0x29,0x7a,0x73,0x15,0x9f,0x7e,0x24,0x13,0xb6,0x7e,0x34, +0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x7d,0x7e,0x24,0x15,0x56,0x7e,0x34,0xe, +0xd, 0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x7e,0x73,0x15,0x9c,0x7a,0x73,0xf, 0x1b, +0x7e,0x73,0x15,0x9d,0x7a,0x73,0xf, 0x1c,0xda,0xf8,0x22,0xca,0x79,0x7d,0x73,0x12, +0x61,0x38,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27,0x0, +0x27,0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c,0xe, +0x1b,0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49,0x27, +0x0, 0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34,0x1c, +0x14,0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c,0x67, +0x6c,0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38,0x10, +0x9, 0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, 0x25, +0x4d,0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27,0x7e, +0x34,0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c, +0xaa,0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e,0x34, +0x1c,0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e,0x34, +0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, 0x4b, +0x2d,0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0, +0x19,0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70, +0x2, 0xac,0x7a,0x2e,0x34,0x2b,0xd4,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e,0x24, +0x1c,0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x2d,0xd2, +0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e,0x34, +0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x2d,0xd4, +0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, 0xa0, +0xbe,0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x5e,0x27,0x49,0x27,0x0, 0x39,0x7e,0x34, +0x1c,0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38,0x20, +0x49,0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33,0x7e, +0x34,0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, 0xb7, +0x0, 0x1, 0x12,0x65,0x18,0x49,0x37,0x0, 0x47,0x12,0x7, 0xc9,0x49,0x37,0x0, 0x49, +0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x5d,0x1, 0x49,0x27,0x0, 0x35,0x7e, +0x34,0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22,0xca, +0x3b,0x6d,0x33,0x7a,0x35,0x23,0x7e,0xb3,0xf, 0x1b,0x60,0x6, 0x7e,0xb3,0xf, 0x1c, +0x60,0x11,0xe5,0x22,0x60,0x5, 0x75,0x18,0x1, 0x80,0x3, 0x75,0x18,0x0, 0xe5,0x18, +0x2, 0x35,0x5e,0x7e,0xb3,0xd, 0x18,0xf5,0x21,0x7e,0x73,0xd, 0x19,0x7a,0x71,0x22, +0x6d,0x66,0x75,0x25,0x0, 0x75,0x26,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x3a,0x7e,0x51, +0x21,0x74,0x18,0xac,0x5b,0x2d,0x27,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x10, +0xbe,0x14,0x0, 0x32,0x8, 0x28,0x5, 0x25,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0x8, 0x49, +0x12,0xff,0xd0,0x2d,0x61,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, 0x50,0x8, 0x49,0x22, +0x0, 0x30,0x2d,0x62,0x5, 0x26,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc0,0x7d,0x73, +0x80,0x38,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0x2d,0x37,0x3e,0x34,0x2e,0x37,0xf, +0xda,0xb, 0x38,0x20,0xbe,0x24,0x0, 0x32,0x8, 0x2c,0x5, 0x25,0xe5,0x21,0xbe,0xb0, +0x0, 0x28,0x8, 0x49,0x23,0xff,0xd0,0x2d,0x62,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, +0x50,0x8, 0x49,0x33,0x0, 0x30,0x2d,0x63,0x5, 0x26,0x7d,0x37,0xb, 0x34,0x7d,0x73, +0xbe,0x34,0x0, 0x18,0x48,0xbc,0xe5,0x25,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12,0x7d, +0x36,0x12,0x6e,0x11,0xe5,0x26,0xa, 0x2b,0x12,0x48,0x53,0xbe,0x34,0x0, 0xf, 0x8, +0x8, 0x75,0x18,0x1, 0x74,0x1, 0x2, 0x35,0x5e,0x6d,0x33,0xe5,0x21,0xbe,0xb0,0x0, +0x28,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0xff,0xd0,0x2d,0x32,0xe5,0x21,0xbe,0xb0,0xc, +0x50,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0x0, 0x30,0x2d,0x32,0x7e,0xa0,0x8, 0x80,0x2d, +0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2e,0x14,0x6e,0x1, 0x7a,0x31,0x82,0x7a,0x21, +0x83,0xe4,0x93,0x1a,0x1b,0xbd,0x13,0x8, 0x14,0x2e,0x24,0x6e,0x2, 0x7a,0x51,0x82, +0x7a,0x41,0x83,0xe4,0x93,0x1a,0x2b,0x2e,0x25,0x23,0x7a,0x25,0x23,0x7c,0x5a,0x1b, +0xa0,0xa5,0xbd,0x0, 0xcb,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0xe5,0x22,0xa, 0x2b, +0x2d,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x12,0x6e,0x11,0xbe,0x34, +0x2, 0xbc,0x8, 0xa, 0x7e,0x35,0x23,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x23,0x7e,0x35, +0x23,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x23,0xe5,0x18, +0xa, 0x3b,0xbe,0x35,0x23,0x50,0x5, 0x7e,0x55,0x23,0xf5,0x18,0xe5,0x18,0xda,0x3b, +0x22,0xca,0x3b,0x7c,0x9b,0x7d,0xa3,0xbe,0x90,0x1, 0x28,0x1e,0xa, 0x15,0x1b,0x15, +0xa, 0x39,0xbd,0x31,0x58,0x14,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6, +0xb, 0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x80,0x7, 0xbe,0x90,0x1, 0x78,0x15,0x6d, +0xbb,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x94, +0x7d,0xc3,0x80,0x8, 0x4c,0x99,0x78,0x38,0x6d,0xcc,0x7d,0xbc,0x74,0x2, 0xac,0xb9, +0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x7e,0x70,0x2, 0xac, +0x79,0x2d,0x3a,0x49,0x33,0x0, 0x2, 0x12,0x6d,0x94,0x7d,0xe3,0x74,0x2, 0xac,0xb9, +0x7d,0xf5,0x2d,0xfa,0x49,0x3f,0x0, 0x4, 0x12,0x6d,0x94,0x7d,0xf3,0x2, 0x36,0x6c, +0x7c,0xb5,0x24,0xfe,0xbc,0xb9,0x78,0x46,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba, +0x1b,0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d, +0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x94,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d, +0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x74,0x2, 0xac,0xb9,0x2d, +0xa5,0x49,0x3a,0x0, 0x2, 0x12,0x6d,0x94,0x7d,0xe3,0x6d,0xff,0x80,0x3e,0x7c,0xb5, +0x14,0xbc,0xb9,0x78,0x37,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6,0xb, +0xb8,0x30,0x12,0x6d,0x94,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35, +0xb, 0x38,0x30,0x12,0x6d,0x94,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d,0xd5,0x2d,0xda, +0xb, 0xd8,0x30,0x12,0x6d,0x94,0x7d,0xd3,0x6d,0xff,0x7d,0xef,0xa, 0x79,0x6d,0x66, +0x7f,0x3, 0x1b,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x7f,0x41,0x7f, +0x3, 0x1b,0xd, 0x7d,0x3b,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x41,0x7d,0x3d, +0x1a,0x26,0x1a,0x24,0xa, 0x19,0x6d,0x0, 0x12,0x48,0x85,0x2f,0x41,0xa, 0x19,0x6d, +0x0, 0xb, 0xc, 0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x41,0xa, 0x19, +0x6d,0x0, 0xb, 0xd, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x12,0x48,0x85,0x2f,0x14,0x7d, +0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x5b,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1d,0x1a, +0x2, 0x1a,0x0, 0x2f,0x2, 0x7d,0x5e,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1f,0x1a, +0x2, 0x1a,0x0, 0x2f,0x2, 0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x48,0xa1,0x2e, +0x34,0x0, 0x20,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xf, 0x1b,0x7e,0x64,0xe, 0xdf, +0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7, +0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x5, 0x80,0x2, +0x74,0x3, 0x7a,0xb3,0xf, 0x26,0x74,0x1, 0x7a,0xb3,0xf, 0x27,0x4c,0xff,0x78,0xd, +0x75,0x19,0x0, 0x7e,0xb3,0xf, 0x26,0x12,0x6e,0xe2,0x2, 0x38,0x85,0xe5,0x51,0xb4, +0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, +0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xb4,0x1, +0x9, 0xe5,0x19,0x70,0x5, 0x75,0x16,0x5, 0xf5,0x17,0xe5,0x51,0xb4,0x1, 0x1b,0x7e, +0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, +0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80,0x1, 0xe4,0xf5,0x19,0x6c,0xee,0x7e, +0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xe, 0x9d,0xf5,0x21,0xbe,0xb0,0xff,0x78,0x3, 0x2, +0x38,0x7b,0xe5,0x21,0xa, 0x2b,0x2d,0x26,0x7e,0x29,0xb0,0xb4,0x2, 0x2, 0x80,0x3, +0x2, 0x38,0x7b,0x49,0x33,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13, +0x74,0x12,0x6d,0xf1,0x7a,0x35,0x22,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0x9b,0x7e, +0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x76,0x12,0x6d,0xf1,0x7a,0x35,0x24,0xe5, +0x16,0xa, 0x3b,0xbe,0x35,0x22,0x28,0x59,0xbe,0x35,0x24,0x28,0x54,0x7e,0xa1,0x21, +0x74,0x4, 0xa4,0x49,0x35,0x13,0x74,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0x99,0x7e, +0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x76,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, +0x9b,0xe5,0x21,0xa, 0x3b,0x2d,0x36,0x7e,0x39,0xb0,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, +0x28,0x2, 0x1b,0xf0,0x4c,0xff,0x78,0x53,0x5, 0x17,0xe5,0x17,0xbe,0xb0,0x32,0x40, +0x3, 0x75,0x17,0x0, 0x7e,0x73,0xf, 0x27,0xbe,0x71,0x16,0x28,0x3e,0x5, 0x16,0x80, +0x3a,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4, +0x59,0x35,0x13,0x74,0x49,0x34,0xe, 0x9b,0x59,0x35,0x13,0x76,0x7e,0x73,0xf, 0x26, +0xbe,0x71,0x16,0x50,0x8, 0x7e,0xb3,0xf, 0x27,0xf5,0x16,0x80,0xb, 0x7e,0x73,0xf, +0x27,0xbe,0x71,0x16,0x50,0x2, 0x15,0x16,0x75,0x17,0x0, 0xb, 0xe0,0xbe,0xe0,0xa, +0x68,0x3, 0x2, 0x37,0x8f,0xda,0x3b,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0x10,0x2b, +0xf5,0x24,0x7e,0xe3,0x10,0x2c,0x1b,0xe0,0x6c,0xdd,0x7e,0x70,0x30,0xac,0x7d,0x2e, +0x37,0xf, 0xda,0x49,0x33,0x0, 0x2e,0x74,0x2, 0xac,0xbd,0x59,0x35,0x13,0xb6,0xb, +0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0x7e,0xb3,0xf, 0xd3,0xb4,0x1, 0x2, 0x80,0x3, 0x2, +0x39,0xff,0x6c,0xcc,0x2, 0x39,0xf0,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3,0xd, 0x18, +0xf5,0x22,0x9, 0xb3,0xd, 0x19,0xf5,0x23,0x75,0x21,0x3, 0x7e,0x73,0xe, 0x12,0xbe, +0x70,0x20,0x50,0xa, 0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x3, 0x75,0x21,0x1, 0x7e,0xb3, +0xd, 0xfd,0xb4,0x1, 0x3, 0x75,0x21,0x2, 0x74,0x8, 0x7a,0xb3,0xf, 0x53,0xe5,0x22, +0xbe,0xb0,0x0, 0x28,0x21,0xe5,0x24,0xa, 0x2b,0x1b,0x24,0xe5,0x22,0xa, 0x3b,0xbd, +0x32,0x58,0x13,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2e,0x1b,0x24,0xe5,0x23, +0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x21,0x2, 0x75,0x25,0x0, 0x80,0x45,0xe5,0x25, +0xbc,0xbc,0x68,0x3d,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a, +0xa1,0x26,0x9, 0xb3,0xd, 0x19,0xf5,0x27,0xa, 0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32, +0x12,0x6e,0x11,0xbe,0x34,0x0, 0x3, 0x18,0x18,0xe5,0x27,0xa, 0x2b,0xe5,0x23,0xa, +0x3b,0x9d,0x32,0x12,0x6e,0x11,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x21,0x1, 0x80, +0xb, 0x5, 0x25,0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x25,0x38,0xb2,0xe5,0x51,0xb4,0x1, +0x20,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x19,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x12,0x7e, +0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x9, 0x75,0x21,0x3, 0x74,0x1e,0x7a,0xb3,0xf, +0x53,0xe5,0x23,0xbe,0xb0,0x17,0x50,0x1a,0x6c,0xdd,0x6d,0x33,0x7e,0x50,0x30,0xac, +0x5d,0x2e,0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xec, +0x80,0x3, 0x75,0x21,0x0, 0xe5,0x21,0x7c,0x7c,0x7c,0x6f,0x12,0x11,0xa0,0x6c,0xdd, +0x74,0x2, 0xac,0xbd,0x49,0x35,0x13,0xb6,0x7e,0x50,0x30,0xac,0x5d,0x2e,0x27,0xf, +0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0xb, 0xf0,0xb, 0xc0, +0x7e,0x73,0xd, 0xf7,0xbc,0x7c,0x28,0x3, 0x2, 0x38,0xc7,0x7a,0xf3,0xd, 0xf7,0xda, +0x3b,0x22,0x7e,0x50,0x1, 0xe4,0x7a,0xb3,0xe, 0xb, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, +0x7e,0xa3,0xd, 0xf7,0x4c,0xaa,0x78,0x1d,0x7e,0x43,0xd, 0xf8,0xbe,0x40,0x0, 0x28, +0x14,0x7e,0x43,0x16,0xb7,0xbe,0x40,0x1, 0x28,0xb, 0x74,0x1, 0x7a,0xb3,0xe, 0xb, +0xe4,0x7a,0xb3,0x10,0x3d,0x4c,0xaa,0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x16,0xb7,0xe4, +0x7a,0xb3,0x16,0xb8,0xbe,0xa0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43, +0xd, 0xfc,0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43,0xd, 0x17, +0xbe,0x40,0x0, 0x28,0x6b,0x7e,0xb3,0x16,0xb1,0x70,0x65,0x7e,0xb3,0x16,0xb3,0x70, +0x5f,0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x6d,0x33,0x6c,0x44,0x7e,0x30,0x2, 0xac,0x34, +0x2e,0x17,0xf, 0xd6,0xb, 0x18,0x10,0xbd,0x13,0x58,0x2, 0x7d,0x31,0xb, 0x40,0xa5, +0xbc,0x25,0xe8,0xbe,0x34,0xf8,0xf8,0x58,0x5, 0x7e,0x50,0x5, 0x80,0x1f,0xbe,0x34, +0xfb,0x50,0x58,0x5, 0x7e,0x50,0x4, 0x80,0x14,0xbe,0x34,0xfc,0xe0,0x58,0x5, 0x7e, +0x50,0x3, 0x80,0x9, 0xbe,0x34,0xfe,0xd4,0x58,0x3, 0x7e,0x50,0x2, 0xbe,0x34,0xfc, +0x18,0x58,0x3c,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x80,0x2f, +0x7e,0x43,0xd, 0x16,0xa5,0xbc,0x0, 0x1d,0xbe,0xa0,0x0, 0x28,0x18,0x7e,0xb3,0x16, +0xb1,0x70,0x12,0x7e,0xb3,0x16,0xb3,0x70,0xc, 0xbe,0x50,0x3, 0x50,0x3, 0x7e,0x50, +0x3, 0x74,0x1, 0x80,0x6, 0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e, +0x43,0x16,0xb7,0xbc,0x45,0x50,0x4, 0x7a,0x53,0x16,0xb7,0xbe,0x50,0x2, 0x28,0x6, +0x74,0x1, 0x7a,0xb3,0x16,0xb8,0xbe,0xa0,0x0, 0x28,0x1b,0x7e,0xb3,0xd, 0x16,0x70, +0x15,0x7e,0xb3,0x16,0xb1,0x70,0xf, 0x7e,0xb3,0x16,0xb3,0x70,0x9, 0xe4,0x7a,0xb3, +0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xb3,0x16,0xb3,0xb4,0x1, 0x18,0xe4,0x7a,0xb3, +0x16,0xb3,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0xf, +0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xa3,0x16,0xb7,0x7e,0x50,0x8, 0xac,0x5a,0x7a,0x27, +0xe, 0x5, 0x74,0x4, 0xa4,0x7a,0x57,0xe, 0x7, 0x22,0xca,0x3b,0x7d,0x73,0x7e,0xb3, +0xd, 0xf7,0xf5,0x4c,0x7e,0x37,0xf, 0xda,0x7a,0x35,0x4f,0x75,0x42,0x0, 0x7e,0xc0, +0x1, 0x80,0x19,0xe5,0x42,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0x60,0xa, 0x2c,0x2d,0x27, +0x7e,0x29,0x70,0xbc,0x76,0x40,0x3, 0x7a,0xc1,0x42,0xb, 0xc0,0xe5,0x4c,0xbc,0xbc, +0x38,0xe1,0xe5,0x42,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0xb0,0xf5,0x42,0x75,0x44,0x0, +0x7e,0xc0,0x1, 0x2, 0x3c,0xb4,0x75,0x4b,0x0, 0x6d,0x33,0x7a,0x35,0x4d,0x6c,0xdd, +0x75,0x45,0x0, 0x75,0x46,0x0, 0x75,0x43,0x0, 0x2, 0x3c,0x69,0x7e,0x71,0x43,0x74, +0x2, 0xac,0x7b,0x9, 0xb3,0xd, 0x18,0xf5,0x47,0x9, 0xb3,0xd, 0x19,0xf5,0x48,0xe5, +0x43,0xa, 0x3b,0x2d,0x37,0x7e,0x39,0x70,0xbc,0x7c,0x78,0x7b,0xb, 0xd0,0xe5,0x47, +0x25,0x45,0xf5,0x45,0xe5,0x48,0x25,0x46,0xf5,0x46,0x7e,0x51,0x47,0xac,0x5d,0xe5, +0x45,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x49,0x7e,0x51,0x48,0xac, +0x5d,0xe5,0x46,0xa, 0x3b,0x9d,0x32,0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x4a,0x7e,0x51, +0x4b,0xac,0x5d,0xe5,0x49,0xa, 0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x48,0x53, +0x7c,0xb7,0xf5,0x4b,0x7e,0x51,0x4b,0xac,0x5d,0xe5,0x4a,0xa, 0x3b,0xbd,0x32,0x8, +0x9, 0xa, 0x2d,0x12,0x48,0x53,0x7c,0xb7,0xf5,0x4b,0x7e,0x71,0x47,0x74,0x18,0xac, +0x7b,0xe5,0x48,0xa, 0x2b,0x2d,0x32,0x3e,0x34,0x2e,0x35,0x4f,0xb, 0x38,0x30,0xbe, +0x35,0x4d,0x8, 0x3, 0x7a,0x35,0x4d,0x5, 0x43,0xe5,0x4c,0xbe,0xb1,0x43,0x28,0x3, +0x2, 0x3b,0xcc,0xbe,0xd0,0x0, 0x28,0x3a,0xe5,0x45,0x8c,0xbd,0xf5,0x45,0xe5,0x46, +0x8c,0xbd,0xf5,0x46,0x7e,0xa1,0x45,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x19,0xa3, +0x15,0x2b,0xe5,0x46,0x19,0xb3,0x15,0x2c,0x7e,0x25,0x4d,0x7e,0x71,0x45,0x74,0x18, +0xac,0x7b,0xe5,0x46,0xa, 0x1b,0x2d,0x31,0x3e,0x34,0x2e,0x35,0x4f,0x1b,0x38,0x20, +0x5, 0x44,0xb, 0xc0,0xe5,0x42,0xbc,0xbc,0x40,0x3, 0x2, 0x3b,0xb6,0xe5,0x44,0xda, +0x3b,0x22,0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x74,0x18,0x7a,0xb3,0x10,0x2c,0x74,0x4, +0x7a,0xb3,0x10,0x2d,0xe4,0x7a,0xb3,0x10,0x2e,0x7e,0x34,0x11,0x9b,0x7a,0x37,0x10, +0x2f,0x7e,0x34,0x11,0x97,0x7a,0x37,0x10,0x31,0x7e,0x34,0xf, 0xc5,0x7a,0x37,0x10, +0x33,0x7e,0x34,0xf, 0xad,0x7a,0x37,0x10,0x35,0x74,0x15,0x7a,0xb3,0x10,0x37,0x74, +0x17,0x7a,0xb3,0x10,0x38,0x74,0x4, 0x7a,0xb3,0x10,0x3a,0xe4,0x7a,0xb3,0x10,0x3b, +0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x3d,0x74,0x2, 0x7a,0xb3,0x10,0x3e,0x74,0x45, +0x7a,0xb3,0x10,0x3f,0x74,0x71,0x7a,0xb3,0x10,0x40,0x74,0x3, 0x7a,0xb3,0x10,0x41, +0x7e,0x34,0x1f,0xff,0x7a,0x37,0x10,0x42,0x6d,0x33,0x7a,0x37,0x10,0x44,0x7e,0x34, +0xd, 0xfe,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, 0xdc,0x7a,0x37,0x10,0x48,0x74,0x20, +0x7a,0xb3,0x10,0x4a,0x74,0xa, 0x7a,0xb3,0x10,0x4b,0xe4,0x7a,0xb3,0x10,0x4c,0x7a, +0xb3,0x10,0x4d,0x7a,0xb3,0x10,0x4e,0x74,0x2, 0x7a,0xb3,0x10,0x4f,0x7e,0x34,0x0, +0xf4,0x7a,0x37,0x10,0x52,0x7e,0x34,0x3f,0xe0,0x7a,0x37,0x10,0x50,0x7e,0x34,0x29, +0x28,0x7a,0x37,0x10,0x54,0x7e,0x34,0x10,0x91,0x7a,0x37,0x10,0x62,0x7e,0x34,0x0, +0x3d,0x7a,0x37,0x10,0x64,0x7e,0x34,0x0, 0x22,0x7a,0x37,0x10,0x66,0x7e,0x34,0x4c, +0x0, 0x7a,0x37,0x10,0x56,0x7e,0x34,0x3, 0xcf,0x7a,0x37,0x10,0x58,0x7e,0x34,0x7, +0x9a,0x7a,0x37,0x10,0x5a,0x7e,0x34,0x5, 0x84,0x7a,0x37,0x10,0x5c,0x7e,0x34,0x0, +0x9, 0x7a,0x37,0x10,0x5e,0x7e,0x34,0x0, 0xf, 0x7a,0x37,0x10,0x60,0x7e,0x34,0x0, +0x5d,0x7a,0x37,0x10,0x68,0xe4,0x7a,0xb3,0x10,0x6a,0x74,0x7, 0x7a,0xb3,0x10,0x6b, +0x7e,0x34,0x10,0xff,0x7a,0x37,0x10,0x6c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x10,0x6e, +0x7e,0x34,0xf, 0x2e,0x7a,0x37,0x10,0x70,0x12,0x41,0xcf,0x7e,0x34,0x11,0xe9,0x7a, +0x37,0x10,0x72,0x7e,0x34,0xf, 0x88,0x7a,0x37,0x10,0x74,0x7e,0x34,0x11,0x17,0x7a, +0x37,0x10,0x76,0x2, 0x6c,0x99,0xca,0x69,0xca,0xf8,0x7d,0xb1,0x7d,0xf2,0x7d,0xe3, +0x9f,0x0, 0x7f,0x60,0x7f,0x40,0x6d,0x66,0x7a,0x67,0x13,0xb6,0x7f,0x10,0x7d,0xa6, +0x75,0x21,0x0, 0x6c,0xaa,0x80,0x4b,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0xa1,0x2d,0xae, +0xb, 0xa8,0xa0,0x7c,0xba,0x20,0xe0,0x1e,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, +0x6d,0x11,0x9d,0x1b,0xbd,0x1a,0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, +0x2f,0x60,0x5, 0x21,0x80,0x1a,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11, +0x9d,0x1b,0xbd,0x1a,0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x40, +0xb, 0xa0,0x7e,0xf3,0x10,0x2c,0xbc,0xfa,0x38,0xad,0xe5,0x21,0xa, 0x1b,0x6d,0x0, +0x7f,0x16,0x12,0x48,0xf2,0x7a,0x37,0x13,0xb6,0xe5,0x21,0xa, 0x3b,0x6d,0x22,0xa, +0x1f,0x6d,0x0, 0x9f,0x1, 0x7f,0x14,0x12,0x48,0xf2,0x6c,0xaa,0x80,0x2f,0x7c,0xba, +0x7e,0x30,0x2, 0x7c,0x9a,0x20,0xe0,0xf, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18, +0x0, 0x9e,0x7, 0x13,0xb6,0x80,0xd, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, +0x7d,0x13,0x9d,0x1, 0x7d,0x14,0x2d,0x1f,0x1b,0x18,0x0, 0xb, 0xa0,0x7e,0xb3,0x10, +0x2c,0xbc,0xba,0x38,0xc9,0x9f,0x66,0x7a,0x67,0x13,0xb6,0x6c,0xaa,0x80,0x29,0x7e, +0x70,0x2, 0xac,0x7a,0x7d,0xa3,0x2d,0xae,0x49,0xaa,0x0, 0x30,0xbd,0xab,0x8, 0x4, +0x7d,0xab,0x80,0xa, 0x6d,0x33,0x9d,0x3b,0xbd,0x3a,0x8, 0x2, 0x7d,0xa3,0x7d,0x3a, +0x1a,0x26,0x1a,0x24,0x2f,0x61,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xcf, +0xa, 0x16,0x6d,0x0, 0x7f,0x16,0x12,0x48,0xf2,0x7a,0x37,0x13,0xb6,0x6c,0xaa,0x80, +0x1d,0x7e,0x70,0x2, 0x7c,0x5a,0xac,0x57,0x7d,0x32,0x2d,0x3e,0x49,0x43,0x0, 0x30, +0x9e,0x47,0x13,0xb6,0x7d,0x32,0x2d,0x3f,0x59,0x43,0x0, 0x30,0xb, 0xa0,0x7e,0xb3, +0x10,0x2b,0xbc,0xba,0x38,0xdb,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x7c,0xfb,0xe5, +0x55,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x55,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x40,0x4b, +0xa9,0xd7,0xea,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12, +0x67,0xe2,0x12,0x0, 0x6e,0x50,0x27,0xa9,0xc7,0xea,0x7e,0xe3,0x10,0x4d,0xe4,0x7a, +0xb3,0x10,0x4d,0x7e,0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2, +0x7a,0xe3,0x10,0x4d,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x3, 0x12,0x6b,0x12,0x74,0x1, +0x7a,0xb3,0xf, 0xd3,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0xa, 0x18, +0x12,0x66,0xc7,0x7e,0x37,0xf, 0xd6,0x7e,0x27,0xf, 0xd4,0x7e,0x14,0xa, 0x62,0x12, +0x66,0xc7,0x6c,0xaa,0x80,0x36,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0xa, 0x92,0xbe, +0x34,0x13,0x88,0x40,0xc, 0xbe,0x34,0x75,0x30,0x28,0x1a,0xbe,0x34,0x7e,0xf4,0x50, +0x14,0x7e,0xb3,0x16,0xb4,0x4, 0x7a,0xb3,0x16,0xb4,0xb4,0xa, 0xd, 0x74,0x1, 0x7a, +0xb3,0x16,0xb3,0x80,0xf, 0xe4,0x7a,0xb3,0x16,0xb4,0xb, 0xa0,0x7e,0xb3,0x10,0x2b, +0xbc,0xba,0x38,0xc2,0x7e,0xa3,0x16,0xb3,0xbe,0xa0,0x1, 0x78,0x7, 0x7e,0xb3,0x16, +0xb2,0x4, 0x80,0x1, 0xe4,0x7a,0xb3,0x16,0xb2,0xbe,0xb0,0x0, 0x28,0x6, 0x74,0x1, +0x7a,0xb3,0x16,0xb1,0x4c,0xaa,0x78,0xd, 0xe4,0x7a,0xb3,0x16,0xb2,0x7a,0xb3,0x16, +0xb1,0x7a,0xb3,0x16,0xb4,0x74,0x1, 0x7a,0xb3,0xf, 0xd2,0x12,0x67,0x1, 0x12,0x6b, +0xbd,0x7e,0xb3,0x11,0xc, 0xb4,0x1, 0x31,0xbe,0xf0,0x1, 0x78,0x2c,0x7e,0xb3,0xd, +0xfc,0x70,0x26,0x12,0x47,0x4a,0x7e,0xb3,0xd, 0xf7,0x70,0x19,0x7e,0x73,0x11,0x95, +0xa, 0x37,0x9, 0x73,0xf, 0x29,0x7a,0x73,0x10,0x4a,0xe4,0x7a,0xb3,0x10,0x4e,0x7a, +0xb3,0x11,0xc, 0x80,0x6, 0x6c,0xff,0x80,0x2, 0x6c,0xff,0x12,0x66,0x52,0x12,0x6c, +0x1f,0x7c,0xbf,0xda,0x79,0x22,0xca,0x3b,0x75,0x21,0x0, 0x7e,0x34,0xb, 0x79,0x7e, +0x24,0x0, 0xd, 0xe4,0x12,0x6e,0x21,0xe4,0x7a,0xb3,0xd, 0x16,0x7a,0xb3,0xd, 0x17, +0x7e,0xb3,0xf, 0xd2,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x41,0xcc,0x7e,0x34,0x13,0xb6, +0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, +0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e,0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27, +0xf, 0x4c,0x7e,0x14,0x13,0xb6,0x6c,0x11,0x12,0x4f,0x6e,0x7c,0xeb,0x7e,0x37,0xf, +0xd6,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4a,0x7e,0x14,0x13, +0xc0,0x12,0x4f,0x6e,0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x51,0x6c,0xcc,0x80,0x47, +0x7c,0xbf,0xc4,0x23,0x54,0x1f,0x7c,0x6b,0x7a,0x61,0x21,0xa, 0x2a,0x9, 0x72,0x13, +0xc0,0x7e,0x50,0x2, 0xac,0x5f,0x19,0x72,0xa, 0xb1,0xa, 0x1c,0x9, 0x71,0x13,0xb6, +0x19,0x72,0xa, 0xb2,0x7c,0xbf,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0x79,0xa, 0x46,0x2e,0x44,0xb, 0x79,0x7e,0x49,0xb0,0x4c,0xb7, +0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xb5,0xb, 0xa0,0xbc,0xda,0x38, +0xab,0x7a,0xf3,0xd, 0x16,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12, +0x6e,0x21,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6e,0x21,0x7e, +0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xb6,0x7e, +0x10,0x1, 0x12,0x4f,0x6e,0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x7e, +0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x6e,0x7c,0xdb, +0x6c,0xff,0x6c,0xaa,0x80,0xe, 0x6c,0xcc,0x80,0x4, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec, +0x38,0xf8,0xb, 0xa0,0xbc,0xda,0x38,0xee,0x7a,0xf3,0xd, 0x17,0xda,0x3b,0x22,0xca, +0x79,0x7e,0x34,0x0, 0x60,0x12,0x69,0xb9,0x7c,0xab,0x7a,0xa1,0x6a,0xbe,0xa0,0x8, +0x40,0x3, 0x2, 0x42,0xed,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0xe0,0x6, 0x80,0x3, 0x7e, +0xe0,0x5, 0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x42,0x1, +0x73,0x2, 0x42,0x19,0x2, 0x42,0x1e,0x2, 0x42,0x23,0x2, 0x42,0x28,0x2, 0x42,0x2d, +0x2, 0x42,0x32,0x2, 0x42,0x37,0x2, 0x42,0x3c,0x7e,0xf0,0x5e,0x80,0x26,0x7e,0xf0, +0x5f,0x80,0x21,0x7e,0xf0,0x61,0x80,0x1c,0x7e,0xf0,0x63,0x80,0x17,0x7e,0xf0,0x65, +0x80,0x12,0x7e,0xf0,0x67,0x80,0xd, 0x7e,0xf0,0x69,0x80,0x8, 0x7e,0xf0,0x6a,0x80, +0x3, 0x7e,0xf0,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x11,0xe9,0xa, 0xb, 0x7e,0xb3, +0x10,0xff,0xa, 0x1b,0x2d,0x1, 0x7c,0xb1,0x7c,0x1a,0x2e,0x10,0x21,0xa5,0xf7,0x7c, +0x9b,0xa, 0x9, 0x5e,0x4, 0x0, 0x1, 0xbe,0x4, 0x0, 0x1, 0x78,0x1c,0x7c,0x79,0xac, +0x7f,0x7e,0x50,0x3, 0xac,0x5f,0xe, 0x24,0xe, 0x24,0x2d,0x32,0x7c,0xba,0x3e,0xb0, +0x24,0x25,0xa, 0xb, 0x1b,0x8, 0x30,0x80,0xd, 0xac,0x9f,0x7c,0xba,0x3e,0xb0,0x24, +0x25,0xa, 0xb, 0x1b,0x8, 0x40,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, 0xb, 0xb, 0x8, +0xf0,0x7e,0x4, 0x0, 0xa, 0x7d,0x3f,0x8d,0x30,0x8d,0x30,0x7c,0x75,0xbe,0x70,0x0, +0x40,0x14,0xbc,0xe7,0x28,0x10,0x7e,0xc4,0x0, 0x64,0x7d,0xdf,0x8d,0xdc,0x7d,0xd, +0x9d,0x1, 0x7c,0x61,0x80,0x17,0xbc,0xe7,0x38,0x19,0xbe,0x70,0x9, 0x38,0x14,0x7e, +0xe4,0x0, 0x64,0x8d,0xfe,0x7d,0x2f,0xb, 0x24,0x9d,0x21,0x7c,0x65,0xa, 0x2a,0x19, +0x62,0x11,0xe9,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x3, 0x2, 0x42,0x46,0xda,0x79,0x22, +0xca,0xf8,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf, +0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10,0xa5,0x7e,0xb3, +0xf, 0x26,0x12,0x6e,0xe2,0x12,0x64,0x48,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x44,0x6, 0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0x0, 0x64,0x7a,0x37, +0xa, 0xaf,0xe4,0x7a,0xb3,0x16,0xba,0x12,0x6c,0x7b,0x12,0x46,0x40,0x12,0x6b,0x35, +0x6c,0xff,0x1a,0x2f,0x7e,0x34,0x0, 0x18,0xad,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda, +0x2e,0x34,0x0, 0x30,0x1b,0x35,0xb, 0x38,0x30,0x1a,0x2f,0x3e,0x24,0x59,0x32,0x13, +0x9c,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xda,0x12,0x6b,0x7b,0x12,0x6c,0xd1,0x12,0x69, +0x38,0x6c,0xff,0x1a,0x3f,0x3e,0x34,0x49,0x23,0x13,0x9c,0x1a,0xf, 0x7e,0x14,0x0, +0x18,0xad,0x10,0x7d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b, +0x35,0x1b,0x38,0x20,0xb, 0xf0,0xbe,0xf0,0xd, 0x78,0xd8,0x12,0x6a,0xb, 0x12,0x49, +0x47,0x7e,0xb3,0xf, 0xd3,0x70,0x9, 0x7e,0xb3,0xf, 0xd2,0x70,0x3, 0x2, 0x43,0x18, +0x12,0x1f,0x97,0x12,0x33,0xaf,0x7a,0xb3,0xf, 0x25,0x12,0x6e,0x40,0x12,0x6d,0x37, +0x70,0x3, 0x2, 0x43,0x18,0x12,0x45,0x2a,0x7e,0x37,0xf, 0xda,0x12,0x8, 0x6, 0x12, +0x6e,0xe8,0x12,0x4e,0xc4,0x12,0x0, 0x6e,0x50,0x3, 0x12,0x30,0x5, 0x7e,0xb3,0x11, +0x15,0xb4,0x1, 0x4, 0xe4,0x12,0x6e,0xd3,0x12,0x67,0x3a,0x12,0x19,0x6d,0x12,0x6, +0x11,0x12,0x6f,0x7, 0x12,0x65,0x9a,0x12,0x36,0xf6,0x12,0x56,0x4e,0x12,0x1c,0xb1, +0x12,0x4b,0x9, 0x2, 0x43,0x18,0x12,0x0, 0x1e,0x12,0x6e,0x5c,0xda,0xf8,0x22,0xca, +0x3b,0x7c,0xeb,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x38,0x3, 0x2, 0x45,0x21,0x7c, +0xbe,0x12,0xd, 0x46,0x7e,0xb3,0xd, 0xfc,0x60,0x1e,0x7e,0xb3,0x15,0x54,0x70,0x8, +0x7e,0xb3,0x15,0x55,0x70,0x2, 0x80,0x10,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x28, +0xc, 0xe5,0x12,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x1e,0x7e,0xf0,0x1, +0xbe,0x73,0xf, 0x1c,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x15,0x54, +0xbe,0x73,0xf, 0x1c,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c, +0xbe,0x12,0xd, 0x46,0xe5,0x10,0x7a,0xb3,0xd, 0xf7,0x7e,0x31,0x10,0x74,0x2, 0xac, +0x3b,0x7e,0x24,0x15,0x2b,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x7d,0x75,0x12,0x64,0x75, +0x13,0x64,0x6c,0xee,0x80,0x67,0x6c,0xdd,0x80,0x59,0x74,0x2, 0xac,0xbd,0x9, 0x75, +0xd, 0x18,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0xa, 0x37,0x9d,0x32, +0x12,0x6e,0x11,0x7c,0xb7,0xf5,0x21,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, 0x19,0xa, +0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x19,0xa, 0x37,0x9d,0x32,0x12,0x6e,0x11, +0x7c,0xc7,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0xa, 0xe5,0x12,0xbe,0xb1,0x21,0x28,0x3, +0x85,0x21,0x12,0xbe,0xc0,0x0, 0x28,0x9, 0xe5,0x13,0xbc,0xbc,0x28,0x3, 0x7a,0xc1, +0x13,0xb, 0xd0,0x7e,0x73,0xd, 0xf7,0xbc,0x7d,0x38,0x9f,0xb, 0xe0,0x7e,0x73,0xd, +0xf7,0xbc,0x7e,0x38,0x91,0xe5,0x12,0xb4,0x64,0x3, 0x75,0x12,0x0, 0xe5,0x13,0xb4, +0x64,0x3, 0x75,0x13,0x0, 0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x85,0x13,0x12,0x80, +0x6, 0x75,0x12,0x64,0x75,0x13,0x64,0xda,0x3b,0x22,0x12,0x59,0xb0,0x70,0x3, 0x2, +0x45,0xb1,0x75,0x6e,0x14,0x75,0x6d,0x1, 0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, +0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab, +0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e, +0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38, +0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a, +0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23, +0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, +0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4, +0x22,0xe5,0x6d,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x46,0x3d,0x15,0x6e,0xe5,0x6e,0x60, +0x79,0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a, +0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23, +0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, +0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1, +0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0xcb,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93, +0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, +0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10, +0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22,0x75,0x6d,0x0, 0xe5,0x21,0x22, +0xca,0x79,0x7e,0x74,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x20,0xe0,0x3, 0x2, 0x47,0x47, +0x54,0xfe,0x7a,0xb3,0x10,0xfe,0x9, 0x77,0x0, 0x2, 0xbe,0x73,0xf, 0x52,0x68,0x16, +0x7a,0x73,0xf, 0x52,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x7a,0x37,0xf, 0x48,0x7e,0x79,0x70,0xbe,0x73,0xf, 0x5c,0x68,0xe, 0x7a, +0x73,0xf, 0x5c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x54,0x9, 0x77,0x0, +0x1, 0xa, 0x37,0xbe,0x37,0xf, 0x56,0x68,0x4, 0x7a,0x37,0xf, 0x56,0x7e,0x27,0xf, +0x5d,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x9, 0x77,0x0, 0x5, 0xa, 0x37,0xbd, +0x32,0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x5d,0x9, +0x77,0x0, 0x8, 0xbe,0x73,0x11,0x11,0x68,0x24,0x7a,0x73,0x11,0x11,0xbe,0x70,0xf, +0x40,0x5, 0xe4,0x19,0xb7,0x0, 0x8, 0x9, 0x77,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6e, +0x31,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0x11,0x10,0x9, 0x77,0x0, +0x9, 0xbe,0x73,0x11,0x13,0x68,0x8, 0x7a,0x73,0x11,0x13,0x7a,0x73,0x11,0x12,0x9, +0x77,0x0, 0x7, 0xbe,0x73,0x11,0x14,0x68,0x4, 0x7a,0x73,0x11,0x14,0x9, 0xb7,0x0, +0xb, 0xbe,0xb1,0x51,0x68,0x5, 0xf5,0x51,0x12,0x6d,0x1f,0x9, 0x77,0x0, 0x25,0xa, +0x37,0xbe,0x37,0x11,0xd, 0x68,0x4, 0x7a,0x37,0x11,0xd, 0x9, 0x77,0x0, 0x6, 0xbe, +0x73,0x11,0xf, 0x68,0x4, 0x7a,0x73,0x11,0xf, 0x9, 0x77,0x0, 0x24,0xbe,0x73,0x11, +0x15,0x68,0x4, 0x7a,0x73,0x11,0x15,0xda,0x79,0x22,0xca,0x79,0xe4,0x6c,0xaa,0xa, +0x4a,0x19,0xb4,0xd, 0x68,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xf3,0xe4,0x7a,0xb3,0xd, +0xf7,0x7a,0xb3,0xd, 0xf8,0x7a,0xb3,0xd, 0xf9,0x7a,0xb3,0xd, 0xfa,0x7e,0xb3,0xf, +0xd3,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x48,0x50,0x7e,0xb3,0x10,0x2b,0xf5,0x21,0x7e, +0xb3,0x10,0x2c,0xf5,0x22,0x7e,0x37,0xf, 0x56,0x7a,0x35,0x23,0x7e,0x37,0xf, 0x58, +0x7a,0x35,0x25,0x7e,0x37,0xf, 0x5a,0x7a,0x35,0x27,0x7e,0x34,0x0, 0x14,0x7a,0x35, +0x2d,0x7e,0x37,0xf, 0xda,0x7e,0x24,0x0, 0x21,0x7e,0x14,0x0, 0x29,0x7e,0x4, 0x9, +0xc8,0x12,0x4e,0x15,0xe5,0x29,0x7a,0xb3,0xd, 0xf7,0xe5,0x2a,0x7a,0xb3,0xd, 0xf8, +0xe5,0x2b,0x7a,0xb3,0xd, 0xf9,0xe5,0x2c,0x7a,0xb3,0xd, 0xfa,0x6c,0xaa,0x80,0x6c, +0x7e,0x53,0xd, 0xf7,0xbc,0x5a,0x28,0x44,0x7c,0xba,0xc4,0x23,0x54,0x1f,0x7c,0x7b, +0x7c,0xba,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x69,0x7e,0x30,0x2, 0xac,0x3a,0x49,0x71,0x9, 0xc8,0x7d,0x7, 0xa, 0x0, 0x7c,0x41, +0x19,0x41,0xd, 0x18,0x7d,0x7, 0x7c,0x41,0x19,0x41,0xd, 0x19,0xa, 0x47,0x2e,0x44, +0xd, 0x68,0x7e,0x49,0xb0,0x4c,0xb6,0x7a,0x49,0xb0,0x80,0x1e,0xa, 0x15,0xa, 0x2a, +0x9d,0x21,0x3e,0x24,0x49,0x72,0x9, 0xf0,0x7d,0x17,0xa, 0x12,0x7c,0xb3,0x19,0xb2, +0xd, 0x40,0x7d,0x17,0x7c,0xb3,0x19,0xb2,0xd, 0x41,0xb, 0xa0,0x7e,0xb3,0xd, 0xf8, +0xa, 0x2b,0x7e,0xb3,0xd, 0xf7,0xa, 0x1b,0x2d,0x12,0xa, 0x2a,0xbd,0x21,0x48,0x80, +0xda,0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff, +0xb, 0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d, +0x32,0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34, +0xff,0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d, +0x12,0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d, +0x0, 0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d, +0x22,0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, +0xbf,0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d, +0x34,0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, +0x40,0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d, +0x0, 0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f, +0x2, 0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x48, +0xa1,0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x48,0xa1,0x30,0xd5,0x6, 0x9f, +0x22,0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, +0xb, 0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, +0x7e,0x39,0x40,0x7a,0x19,0x40,0x22,0xca,0x79,0x6c,0xee,0x12,0x65,0xd9,0x7d,0x43, +0x6c,0xaa,0x6c,0x77,0x7e,0x30,0x6, 0xac,0x37,0x2e,0x14,0x6c,0x5d,0x7e,0x4, 0x0, +0xff,0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70, +0x5, 0x40,0xe1,0xbe,0xa0,0x5, 0x78,0x3, 0x2, 0x4a,0x18,0x7e,0x63,0xd, 0xf7,0xbe, +0x60,0x0, 0x38,0x3, 0x2, 0x4a,0x18,0x6c,0x77,0x2, 0x4a,0xd, 0x6c,0xff,0x6c,0x66, +0x80,0x41,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27, +0xf, 0xda,0xb, 0x28,0x20,0x7e,0x30,0x6, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6c,0x5f, +0x7e,0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x2, 0x18,0x14,0xb, 0xf0,0x2e,0x14,0x6c, +0x61,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x28,0xe, 0x80,0x2, 0x6c, +0xff,0xb, 0x60,0x7e,0xb3,0x10,0x2b,0xbc,0xb6,0x38,0xb7,0x7e,0x50,0x6, 0xac,0x5a, +0x7d,0x12,0x2e,0x14,0x6c,0x61,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf, +0x38,0x17,0xb, 0xe0,0x2e,0x24,0x6c,0x62,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93, +0xbc,0xbe,0x38,0x7, 0x75,0x14,0x40,0x80,0xf, 0x6c,0xee,0xb, 0x70,0x7e,0xb3,0x10, +0x2c,0xbc,0xb7,0x28,0x3, 0x2, 0x49,0x8c,0xe5,0x15,0x25,0x14,0xf5,0x14,0xbe,0xb0, +0x0, 0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0xda,0x79, +0x22,0x7d,0x53,0x9f,0x11,0xbe,0x54,0x0, 0x0, 0x40,0x2d,0xbe,0x54,0x0, 0x3f,0x38, +0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x25,0x7e,0x34,0x1, 0x8e,0xad,0x32,0x6d,0x22,0x7c, +0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x34,0x48,0x4, 0x7e,0x18,0x0, 0x34,0x7e, +0x8, 0x0, 0x34,0x9f,0x1, 0x7f,0x10,0x22,0xbe,0x54,0x5, 0x80,0x40,0x29,0xbe,0x54, +0x5, 0xb8,0x38,0x23,0x7d,0x25,0x9e,0x24,0x5, 0x7f,0x7e,0x34,0x1, 0x8e,0xad,0x32, +0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x32,0x48,0x4, 0x7e,0x18, +0x0, 0x31,0x2e,0x18,0x4, 0xce,0x22,0xbe,0x54,0x5, 0xb8,0x28,0x19,0x7d,0x25,0x9e, +0x24,0x5, 0x9f,0x7e,0x34,0x1, 0x8e,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a, +0x24,0x2e,0x18,0x5, 0x0, 0x22,0xbe,0x54,0x2, 0xdf,0x38,0xe, 0x7e,0x34,0x2, 0xdf, +0x9d,0x35,0x6d,0x22,0x7e,0x14,0x0, 0xdf,0x80,0xc, 0x7d,0x35,0x9e,0x34,0x2, 0xe0, +0x6d,0x22,0x7e,0x14,0x0, 0xe1,0x12,0x48,0x96,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe, +0x54,0x2, 0xdf,0x38,0xa, 0x7e,0x8, 0x2, 0x7f,0x9f,0x1, 0x7f,0x10,0x80,0x4, 0x2e, +0x18,0x2, 0x80,0xbe,0x18,0x0, 0x34,0x58,0x5, 0x7e,0x18,0x0, 0x34,0x22,0xbe,0x18, +0x4, 0xce,0x8, 0x4, 0x7e,0x18,0x4, 0xce,0x22,0xca,0x3b,0x7e,0x73,0xd, 0xfb,0x7a, +0x73,0xd, 0xfc,0x7e,0xa3,0xf, 0x1b,0x7a,0xa3,0xf, 0x1c,0xe4,0x7a,0xb3,0xf, 0x1f, +0x7e,0x37,0x11,0xd, 0x4d,0x33,0x78,0x3f,0xbe,0xa0,0x0, 0x28,0x8, 0xe4,0x7a,0xb3, +0x16,0xab,0x2, 0x4b,0xd0,0x7e,0xb3,0x11,0xf, 0x20,0xe0,0x3, 0x2, 0x4b,0xd0,0x7e, +0xb3,0x11,0x14,0xbe,0xb3,0x16,0xab,0x28,0x3, 0x2, 0x4b,0xd0,0xe4,0x7a,0xb3,0x16, +0xab,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x11,0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa3,0x74, +0x1e,0x7a,0xb3,0x11,0x12,0x80,0x69,0xbe,0x34,0x0, 0x1, 0x78,0x22,0xbe,0xa0,0x0, +0x28,0x5e,0x6d,0x22,0x7a,0x27,0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x7a,0xb3,0x16, +0xab,0x74,0x23,0x7a,0xb3,0x16,0xae,0x74,0x1, 0x7a,0xb3,0x16,0xad,0x80,0x41,0xbe, +0x34,0x0, 0x3, 0x78,0x3b,0x6d,0x66,0x7a,0x67,0x10,0x1, 0x7e,0x74,0xd, 0xac,0x7a, +0x77,0xa, 0xaf,0x12,0x6f,0xd, 0x12,0x60,0x8c,0x12,0x58,0xcd,0x6d,0x33,0x7a,0x37, +0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x74,0x1, 0x7a,0xb3,0x16,0xad,0x7a,0x67,0x10, +0x1, 0x7a,0x77,0xa, 0xaf,0x75,0x9a,0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf, +0x7e,0xb3,0x16,0xad,0x70,0x6, 0x12,0x5b,0xd3,0x12,0x64,0x8e,0xda,0x3b,0x22,0x7e, +0x34,0x10,0x7e,0x7e,0x24,0x0, 0x81,0xe4,0x12,0x6e,0x21,0x74,0xc, 0x7a,0xb3,0x10, +0x80,0x7a,0xb3,0x10,0x81,0x74,0x9, 0x7a,0xb3,0x10,0x82,0x74,0xf, 0x7a,0xb3,0x10, +0x7e,0x74,0x3c,0x7a,0xb3,0x10,0x7f,0x74,0xa0,0x7a,0xb3,0x10,0x83,0x74,0x1e,0x7a, +0xb3,0x10,0x85,0x74,0x9, 0x7a,0xb3,0x10,0x86,0x74,0x1e,0x7a,0xb3,0x10,0x87,0xe4, +0x7a,0xb3,0x10,0x88,0x7a,0xb3,0x10,0x89,0xf5,0x52,0xf5,0x51,0x7a,0xb3,0x10,0xa3, +0x74,0x1, 0x7a,0xb3,0x10,0x84,0x7a,0xb3,0x10,0xa2,0x7a,0xb3,0x10,0xa5,0x74,0x4, +0x7a,0xb3,0x10,0xa4,0x74,0x51,0x7a,0xb3,0x10,0xa6,0x74,0xb, 0x7a,0xb3,0x10,0xad, +0x12,0x6e,0xfa,0xa, 0x36,0x7a,0x73,0x10,0xa7,0x12,0x6e,0xfa,0x7a,0x73,0x10,0xa8, +0x12,0x6e,0xff,0xa, 0x36,0x7a,0x73,0x10,0x9f,0x12,0x6e,0xff,0x7a,0x73,0x10,0xa0, +0xe4,0x7a,0xb3,0x10,0xae,0x74,0x1f,0x7a,0xb3,0x10,0xcf,0xe4,0x7a,0xb3,0x10,0xb0, +0x12,0x6e,0x4e,0x7a,0xb3,0x10,0xaf,0x12,0x6d,0x4f,0x7a,0xb3,0x10,0xa1,0x7e,0x34, +0x10,0x8e,0x7e,0x24,0x0, 0x8, 0x74,0xff,0x12,0x6e,0x21,0x74,0x4, 0x7a,0xb3,0x10, +0x8e,0x74,0x1, 0x7a,0xb3,0x10,0x8f,0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x0, 0x40,0x2d, +0xbe,0xf4,0x0, 0x3f,0x38,0x27,0x7e,0x44,0x0, 0x3f,0x9d,0x4f,0x7e,0x54,0x1, 0x8c, +0xad,0x54,0x6d,0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x32,0x40,0x4, 0x7e,0x28, +0x0, 0x32,0x7e,0x18,0x0, 0x32,0x9f,0x12,0x7f,0x21,0x2, 0x4d,0x5c,0xbe,0xf4,0x3, +0x0, 0x40,0x22,0x7d,0x4f,0x9e,0x44,0x3, 0x0, 0x7e,0x54,0x1, 0xbe,0xad,0x54,0x6d, +0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x32,0x40,0x4, 0x7e,0x28,0x0, 0x31,0x2e, +0x28,0x2, 0x9e,0x80,0x57,0xbe,0xf4,0x1, 0x9f,0x38,0xe, 0x7e,0x54,0x1, 0x9f,0x9d, +0x5f,0x6d,0x44,0x7e,0x14,0x0, 0xe0,0x80,0xc, 0x7d,0x5f,0x9e,0x54,0x1, 0xa0,0x6d, +0x44,0x7e,0x14,0x0, 0xe2,0x7f,0x12,0x12,0x48,0x96,0x7f,0x21,0x7c,0xba,0x7c,0xa9, +0xa, 0x48,0xbe,0xf4,0x1, 0x9f,0x38,0xa, 0x7e,0x18,0x1, 0x67,0x9f,0x12,0x7f,0x21, +0x80,0x4, 0x2e,0x28,0x1, 0x68,0xbe,0x28,0x0, 0x32,0x50,0x6, 0x7e,0x28,0x0, 0x32, +0x80,0xa, 0xbe,0x28,0x2, 0x9e,0x28,0x4, 0x7e,0x28,0x2, 0x9e,0x7d,0x35,0x22,0xca, +0x3b,0x6d,0x11,0x7d,0x1, 0x7d,0x21,0x7e,0xa0,0x2, 0x7e,0x70,0x2, 0x6c,0x66,0x80, +0x39,0x6c,0x99,0x80,0x2b,0x7e,0xd0,0x30,0xac,0xd6,0x7e,0xf0,0x2, 0xac,0xf9,0x7d, +0xf7,0x2d,0xf6,0x2e,0xf7,0xf, 0xda,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, 0x14,0x8, 0x4, +0xb, 0x4, 0x80,0x8, 0xbe,0xf4,0xff,0xec,0x58,0x2, 0xb, 0x24,0xb, 0x14,0x2c,0x97, +0x7e,0xb3,0x10,0x2c,0xbc,0xb9,0x38,0xcd,0x2c,0x6a,0x7e,0xb3,0x10,0x2b,0xbc,0xb6, +0x38,0xbf,0x7e,0x54,0x0, 0x3, 0xad,0x51,0x7d,0x35,0x1e,0x34,0x1e,0x34,0xbd,0x30, +0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb5,0x7e,0xb3,0x16,0xb6,0xbe,0xb0,0x5, 0x50,0x7, +0x4, 0x7a,0xb3,0x16,0xb6,0x80,0x39,0xe4,0x7a,0xb3,0x16,0xb6,0x75,0x71,0x1, 0x80, +0x2f,0xbd,0x32,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb6,0x7e,0xb3,0x16,0xb5,0xbe,0xb0, +0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb5,0x80,0x16,0xe4,0x7a,0xb3,0x16,0xb5,0x75, +0x71,0x2, 0x80,0xc, 0xe4,0x7a,0xb3,0x16,0xb5,0x7a,0xb3,0x16,0xb6,0x75,0x71,0x0, +0xe5,0x71,0xda,0x3b,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x56,0xf5,0xba, +0x7e,0x55,0x2d,0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1,0x9, +0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54,0xe0,0x4c,0xba, +0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c,0xb7,0xf5,0xc6, +0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, 0x4, 0x6e,0x34, +0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x4, 0x1a, +0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, 0x6, 0x7c,0xb1, +0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, 0x4e,0x96,0x43, +0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xa, +0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1,0x0, 0x3, 0x75, +0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19,0xb1,0x0, 0x1, +0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0xf, 0xd2,0x60,0x6, 0x7e,0xb3, +0xf, 0xd3,0x70,0x18,0x7e,0x34,0xd, 0x68,0x7e,0x24,0x0, 0x3, 0xe4,0x12,0x6e,0x21, +0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4,0x12,0x6e,0x21,0x6c,0xee,0x80,0x6b, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0x7a,0x71,0x21,0x9, 0x65,0xd, 0x19,0x7a, +0x61,0x22,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xdb,0x7c,0xbe,0x54,0x7, 0x7e,0x24, +0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xc5,0x7e,0x50,0x30,0xac,0x57, +0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0xbe,0x37, +0xf, 0x54,0x48,0x25,0xa, 0x3d,0x9, 0xb3,0xd, 0x68,0x5c,0xbc,0x68,0x1b,0x7e,0x50, +0x7, 0xac,0x5e,0x2e,0x24,0xd, 0x6b,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xe, 0xd, +0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x7d,0xb, 0xf0,0xb, 0xe0,0x7e,0x73,0xd, 0xf7,0xbc, +0x7e,0x38,0x8d,0x7a,0x73,0xd, 0xfb,0x7a,0xf3,0xf, 0x1b,0xda,0x3b,0x22,0xca,0xf8, +0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x2, 0x50,0x9, 0x7e,0x90,0x2, +0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, 0x6e,0x44,0xff, +0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0xa, 0x50,0x6b,0x4c,0xff,0x78,0x14, +0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xe4, +0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd,0x1b,0xf5,0xb, +0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd,0xf4,0x18,0x37, +0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd,0x1b,0xc5,0xb, +0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff,0xff,0xb, 0xf4, +0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18,0x9, 0xa, 0xda, +0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x3, 0x2, 0x4f,0x7d, +0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x33,0x7d,0x73,0x75,0x25,0x0, 0x7e,0x64, +0x5, 0xe0,0x75,0x23,0x0, 0x80,0x3c,0x75,0x24,0x0, 0x7e,0x51,0x23,0x74,0x18,0xac, +0x5b,0x3e,0x24,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2d,0x36,0x7a,0x35, +0x21,0x49,0x23,0x0, 0x30,0xb, 0x38,0x30,0x9d,0x32,0x12,0x6e,0x11,0xe5,0x24,0xb4, +0x17,0x2, 0x1e,0x34,0xbd,0x37,0x28,0x2, 0x7d,0x73,0x5, 0x24,0xe5,0x24,0xb4,0x18, +0xc9,0x5, 0x23,0xe5,0x25,0xa, 0x2b,0x7e,0x33,0x10,0x7c,0xa, 0x13,0x9d,0x12,0x1b, +0x14,0xe5,0x23,0xa, 0x2b,0xbd,0x21,0x48,0xae,0xbe,0x74,0x0, 0x41,0x28,0x11,0x7e, +0x34,0x0, 0x73,0x7e,0xa3,0x16,0x25,0x74,0x12,0xa4,0x59,0x35,0x16,0x36,0x80,0x26, +0x7e,0x43,0x16,0x25,0x7e,0x50,0x12,0xac,0x45,0x49,0x32,0x16,0x36,0xbd,0x37,0x50, +0x6, 0x59,0x72,0x16,0x36,0x80,0xf, 0xbe,0x34,0x0, 0x0, 0x28,0x9, 0x2e,0x24,0x16, +0x36,0x1b,0x34,0x1b,0x28,0x30,0xda,0x3b,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca, +0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x12,0x0, 0x46, +0x7e,0x35,0x6b,0xb, 0x34,0x7a,0x35,0x6b,0x7e,0xb3,0x16,0xba,0x4, 0x7a,0xb3,0x16, +0xba,0x7e,0x35,0x6b,0xbe,0x34,0x3, 0xe8,0x40,0x13,0x6d,0x33,0x7a,0x35,0x6b,0x7e, +0xb3,0x16,0xab,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x16,0xab,0x7e,0x73,0x16, +0xaf,0xbe,0x73,0x16,0xae,0x28,0xb, 0x7e,0xb3,0x16,0xae,0x4, 0x7a,0xb3,0x16,0xae, +0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xad,0x7e,0xb3,0x16,0xb0,0x60,0x5, 0x14,0x7a, +0xb3,0x16,0xb0,0x7e,0x37,0x10,0x1, 0xb, 0x34,0x7a,0x37,0x10,0x1, 0x7e,0x37,0xa, +0xaf,0xbe,0x37,0x10,0x1, 0x28,0x3, 0x12,0x6f,0x10,0xd0,0x82,0xd0,0x83,0xd0,0xd0, +0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x75, +0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78,0xf9,0x7e,0xf8, +0x16,0xbb,0x75,0x6a,0x0, 0x75,0x8, 0x1, 0x75,0x9, 0x0, 0x75,0xa, 0x0, 0x75,0xc, +0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0xc2,0x0, 0x75,0x11,0x0, 0x75, +0x12,0x64,0x75,0x13,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x18,0x1, 0x75,0x6b, +0x0, 0x75,0x6c,0x0, 0x75,0x71,0x0, 0x75,0x6d,0x0, 0x75,0x72,0x0, 0x75,0x73,0x1, +0x75,0x6f,0x18,0x75,0x70,0x0, 0x75,0x74,0x0, 0x75,0x75,0x0, 0x75,0x1d,0x0, 0x75, +0x1e,0xff,0x75,0x1f,0x0, 0x7e,0x4, 0x0, 0xff,0x7e,0x14,0x6f,0x17,0xb, 0xa, 0x40, +0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, 0xb, 0x44,0x80,0xa, 0x7e,0xb, +0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44,0x78,0xf2,0x80,0xdf,0x2, 0x5c, +0x38,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, 0x78,0xc, 0x7e,0x34,0x10,0x2b, +0x12,0x6b,0x58,0xa9,0xc7,0xea,0x80,0x27,0xbe,0xd0,0x5, 0x78,0x1f,0xa9,0xd7,0xea, +0x7e,0xe3,0x10,0x4a,0x7e,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x4d,0x12,0x66,0x8d, +0x7a,0xb3,0x10,0x4a,0x74,0x1, 0x7a,0xb3,0x10,0x78,0x80,0x3, 0xe4,0x80,0x4e,0x7e, +0xb3,0x11,0x96,0x7e,0x34,0x10,0x2b,0xb4,0x1, 0xa, 0x12,0x31,0xfb,0xe4,0x7a,0xb3, +0x11,0x96,0x80,0xa, 0x12,0x61,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5e,0x27,0x7e,0x34, +0x10,0x2b,0x12,0x6a,0xa5,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, 0x7e,0x73,0x11,0xe8, +0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x69,0x64,0xbe,0xd0,0x5, 0x78,0xd, 0x7a,0xe3, +0x10,0x4a,0x7a,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x1, 0xda,0x79,0xda, +0xd8,0x22,0x7e,0x34,0xe, 0xd, 0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x7e, +0x34,0xe, 0x53,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0xe, 0x99, +0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e,0x21,0x6c,0xaa,0x74,0x3, 0xa, 0x4a,0x19, +0xb4,0xe, 0xdf,0x19,0xb4,0xe, 0xe9,0x7e,0x44,0xff,0xff,0x7e,0x70,0x2, 0xac,0x7a, +0x59,0x43,0xe, 0xf3,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0xf, 0x7, 0xb, 0xa0,0xbe, +0xa0,0xa, 0x40,0xd7,0xe4,0x7a,0xb3,0xf, 0x1b,0x7a,0xb3,0xf, 0x1c,0x7a,0xb3,0xf, +0x1d,0x7a,0xb3,0xf, 0x1f,0x7a,0xb3,0xf, 0x20,0x7a,0xb3,0xf, 0x21,0x7a,0xb3,0xf, +0x22,0x7a,0xb3,0xf, 0x23,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x25,0x12,0x6a,0xee, +0x74,0x3, 0x7a,0xb3,0xf, 0x26,0x74,0x1, 0x7a,0xb3,0xf, 0x27,0xe4,0x7a,0xb3,0xf, +0x28,0x22,0xca,0xf8,0x7c,0xab,0x6c,0x33,0x7c,0x27,0x80,0x73,0x7e,0x90,0x7, 0xac, +0x93,0x9, 0xf4,0xe, 0x57,0x7e,0x10,0x7, 0xac,0x12,0x9, 0xb0,0xe, 0x11,0xbc,0xfb, +0x78,0x5b,0xbe,0xf0,0xff,0x68,0x56,0x7e,0x10,0x7, 0xac,0x1a,0x7d,0xf0,0x2d,0xf2, +0x19,0xff,0x0, 0x4, 0x49,0x44,0xe, 0x53,0x2d,0x2, 0x1b,0x8, 0x40,0x7e,0x10,0x7, +0xac,0x13,0x49,0x0, 0xe, 0x55,0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x59,0x4, 0x0, +0x2, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x12,0x7e,0x90,0x7, 0xac,0x9a,0x2d, +0x42,0x19,0x14,0x0, 0x5, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x13,0x7e,0x90, +0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x6, 0xb, 0xa0,0x80,0x6, 0xb, 0x20,0xbc, +0x62,0x38,0x89,0xb, 0x30,0xbe,0x30,0xa, 0x50,0x3, 0x2, 0x53,0x8, 0x7c,0xba,0xda, +0xf8,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x3b,0xbe,0xa0,0x3e,0x38,0x36,0xbe,0xa0, +0x4, 0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x15,0xde,0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0, +0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x0, 0x6, 0x7e,0x34,0x0, 0x76,0x80, +0x4, 0x7e,0x34,0x0, 0xb8,0x7a,0x37,0x0, 0xfd,0xa, 0x3a,0x2e,0x37,0x0, 0xfd,0x9, +0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0xb, 0x22,0xbe,0xa0,0x80,0x40,0xc, +0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0xf, 0xfe,0x22,0xbe,0xa0,0xfc,0x78, +0x5, 0x7e,0xb3,0x10,0xa5,0x22,0xbe,0xa0,0xfd,0x78,0x8, 0x7e,0x37,0x10,0x46,0x7e, +0x39,0xb0,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3,0x10,0x4a,0x22,0xbe,0xa0,0xf9, +0x78,0x5, 0x7e,0xb3,0x16,0xbb,0x22,0xbe,0xa0,0xfa,0x78,0x3, 0xe5,0x6a,0x22,0xe4, +0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x4d,0xf5,0x24,0xe4,0x7a,0xb3, +0x10,0x4d,0x7e,0x34,0x10,0x2b,0x12,0x31,0xfb,0x7e,0x34,0x10,0x2b,0x12,0x6a,0xa5, +0x75,0x21,0x0, 0x12,0x69,0x64,0x12,0x6e,0xb9,0x60,0xfb,0xa9,0xb7,0xea,0x7d,0x36, +0x7d,0x27,0x7e,0x14,0x18,0x0, 0x12,0x67,0xe2,0x75,0x22,0x0, 0x80,0x36,0x75,0x23, +0x0, 0x80,0x26,0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b,0x2d,0x23, +0x3e,0x24,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, +0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x23,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x23, +0x38,0xd1,0x5, 0x22,0x7e,0x73,0x10,0x2b,0xbe,0x71,0x22,0x38,0xc1,0x5, 0x21,0xe5, +0x21,0xbe,0xb0,0x4, 0x40,0x9d,0xe5,0x24,0x7a,0xb3,0x10,0x4d,0xda,0x3b,0x22,0xca, +0xf8,0x30,0x90,0x58,0xc2,0x90,0x5, 0xa, 0xe5,0xa, 0xb4,0x1, 0x6, 0xe5,0x91,0xf5, +0xf, 0x80,0x29,0xe5,0xb, 0xc4,0x7c,0xfb,0x5e,0xf0,0x7, 0x78,0xe, 0xe5,0xa, 0x25, +0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x56,0xd7,0x80,0x11,0xbe,0xf0,0x4, 0x78,0xc, +0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x15,0xe2,0xe5,0xb, 0xc4,0x7c, +0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80, +0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x4a,0xf5,0x91,0x30,0x91,0x28,0xc2, +0x91,0x5, 0x9, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0xb, 0xe5, +0x9, 0x25,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80,0xd, 0xa5,0xbd,0x4, 0x9, 0xe5,0x9, +0x25,0xf, 0x12,0x27,0x4a,0xf5,0x91,0xda,0xf8,0x22,0x6c,0x33,0xbe,0x30,0x18,0x50, +0x1e,0xa, 0x3, 0x2e,0x7, 0x10,0x35,0x7e,0x9, 0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, +0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x16,0x1e,0xa0,0x80,0x12,0xa, +0x3, 0x2e,0x7, 0x10,0x33,0x9, 0x20,0xff,0xe8,0xa, 0x52,0x2e,0x54,0x0, 0x18,0x7c, +0xab,0x7e,0x23,0x10,0x3a,0xbe,0x20,0x3, 0x28,0xe, 0x7e,0x10,0x2, 0xac,0x1a,0x2d, +0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x21,0xa, 0x42,0x2e,0x44,0x0, 0xc, 0x7e,0x4, +0x0, 0xf, 0x9d,0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0x0, +0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e,0x44,0x7f,0xff,0x9d,0x40,0x7e, +0x10,0x2, 0xac,0x13,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xbe,0x30,0x25,0x50,0x3, +0x2, 0x55,0x3c,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e,0x37,0xf, +0xd6,0xb, 0x38,0x10,0xbe,0x17,0xe, 0x7, 0x8, 0x12,0x7d,0x2, 0x2e,0x7, 0xf, 0xd4, +0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30,0x80,0x18,0x6d,0x33,0x9e,0x37, +0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x9e,0x37,0xe, +0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xbb,0x6c,0xaa,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xe, 0x7, 0x8, 0x12,0x7d,0x2, 0x2e,0x4, +0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30,0x80,0x18,0x6d,0x33, +0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x9e, +0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xc0,0x22,0xca,0x69, +0xca,0xf8,0x6c,0x11,0x7e,0xd0,0x7, 0xac,0xd1,0x9, 0x6, 0xe, 0x9d,0x5e,0x0, 0xf, +0x49,0xf6,0xe, 0x9b,0xbe,0xf4,0x5, 0x18,0x40,0x3c,0x49,0x46,0xe, 0x99,0x7d,0x34, +0x12,0x6b,0xde,0x7c,0xfb,0xbe,0xf0,0x3, 0x40,0xe, 0x7e,0x14,0x4, 0xff,0x74,0x7, +0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x3e,0x74,0x2, 0xac,0xbf,0x49,0x45,0x16,0x95, +0x74,0x7, 0xac,0xb1,0x59,0x45,0xe, 0x99,0x7e,0x14,0x7, 0xd0,0x74,0x7, 0xac,0xb1, +0x59,0x15,0xe, 0x9b,0x80,0x25,0xbe,0xf4,0x5, 0x0, 0x40,0x1f,0x7e,0x14,0x4, 0xff, +0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x74,0x7, 0xac,0xb1,0x49,0x15,0xe, 0x9b, +0xbe,0x14,0x5, 0xa, 0x40,0x5, 0x7c,0xb0,0x12,0x68,0xab,0xb, 0x10,0xbe,0x10,0xa, +0x40,0x82,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x70,0x41,0x7e,0x74,0x0, 0xb, 0x7a, +0x79,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c,0x7b,0xa5,0xbf,0x4, 0x15,0x7e, +0xb3,0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x13,0x74,0x27,0x7e, +0x70,0x3, 0x80,0x4b,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0xa, 0x74,0x1, 0x7e,0x70,0x1, +0x12,0x0, 0x5e,0x80,0x45,0x74,0x27,0x7e,0x70,0x1, 0x80,0x33,0xbe,0xb0,0xfc,0x68, +0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa,0x5, 0x7e,0x60,0x5, 0x80,0x10,0xa5,0xbf,0x55, +0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5,0xbf,0x66,0x20,0x7e,0x60,0x7, 0x74,0x27,0x7c, +0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0,0xdf,0x38,0x7, 0x24,0x80,0x12, +0x6d,0xe0,0x80,0x6, 0xb4,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x79,0x22,0x6c,0x77,0x6c, +0xaa,0x80,0x3c,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, 0xda,0x2e,0x24, +0x0, 0x30,0x7d,0x12,0x1b,0x16,0xb, 0x18,0x40,0xbe,0x44,0x0, 0x3c,0x8, 0x1e,0x7e, +0x14,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0x5e,0x14,0x4, 0x44, +0x68,0xb, 0x1b,0x25,0xb, 0x28,0x20,0xbd,0x42,0x8, 0x2, 0xb, 0x70,0xb, 0xa0,0x7e, +0x63,0x10,0x2b,0xbc,0x6a,0x38,0xbc,0xbe,0x70,0x1, 0x40,0x30,0x6c,0xaa,0x80,0x24, +0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, 0xda,0x2e,0x24,0x0, 0x30,0x1b, +0x25,0xb, 0x28,0x30,0x7e,0x30,0x2, 0xac,0x3a,0x59,0x31,0x16,0x6f,0x6d,0x33,0x1b, +0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xd4,0x22,0xca,0x79,0x6c, +0xff,0x6c,0xee,0x80,0x63,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbe,0x54, +0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x2a,0x9, 0xb2, +0xd, 0x68,0x5c,0xb7,0x68,0x40,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x24,0xd, 0x18,0x7e, +0x70,0x2, 0xac,0x7f,0x2e,0x34,0xd, 0x18,0x7e,0x14,0x0, 0x2, 0x12,0x6d,0x7d,0x7c, +0xbf,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60, +0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x4a,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x4c, +0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xe0,0x7e,0x63,0xd, 0xf7,0xbc,0x6e,0x38,0x95, +0x7a,0xf3,0xd, 0xf7,0xda,0x79,0x22,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, +0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x7e,0xb3,0x10,0xa5,0x24,0xfa,0x68,0x17, +0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x16,0xb9,0xbe,0xb0,0x5, 0x68,0x4c, +0x74,0x5, 0x7a,0xb3,0x16,0xb9,0x22,0x7e,0xb3,0x16,0xb9,0xb4,0x5, 0x3e,0x74,0x6, +0x7a,0xb3,0x16,0xb9,0x74,0xfa,0x12,0x6d,0x66,0x75,0x9a,0x80,0x7e,0x34,0x77,0xf8, +0x12,0x69,0xe2,0x7e,0x34,0x77,0xf8,0x74,0x66,0x12,0x5a,0x21,0x7e,0x34,0x77,0xf9, +0x74,0xbb,0x12,0x5a,0x21,0x80,0x12,0x7e,0xb3,0x16,0xb9,0xb4,0x5, 0xe, 0x74,0x7, +0x7a,0xb3,0x16,0xb9,0x74,0xfa,0x12,0x6d,0x66,0x75,0xe9,0xff,0x22,0x0, 0x0, 0x0, +0x0, 0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x16,0xa9,0xb4,0x1, 0x14,0x7e,0x73,0x16, +0xac,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xe4,0x7a,0xb3,0x16,0xa9,0x80, +0xb, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xd0,0xca,0xc2, +0xa8,0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x16,0xb0,0x7e,0xb3,0x16,0xb0,0x70,0xfa,0x12, +0x6e,0xb0,0x12,0x61,0x8e,0x12,0x6b,0xff,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34, +0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0x10,0x12,0x6a,0x59,0x12,0x6a,0x7f,0x12, +0x52,0x72,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x2, 0x6e,0xf4,0xca, +0x3b,0x7d,0x72,0x7d,0x63,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0x7d,0x36,0x7e,0x24, +0x0, 0x4a,0xe4,0x12,0x6e,0x21,0x7d,0x37,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6e,0x21, +0x75,0x21,0x1, 0x12,0x6c,0x1f,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0x75,0x22,0x0, +0x7e,0x51,0x22,0x74,0x2, 0xac,0x5b,0x49,0x2, 0xa, 0x62,0x1e,0x4, 0x1e,0x4, 0x7d, +0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d,0x30,0x1b,0x18,0x30,0x49,0x12,0xa, 0x18,0x1e, +0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x22,0xe5, +0x22,0xb4,0x25,0xcc,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x5, 0x40,0xb6,0xda,0x3b,0x22, +0x6c,0x77,0x7e,0x63,0xd, 0xfa,0xa, 0x16,0x7e,0x63,0xd, 0xf9,0xa, 0x26,0x2d,0x21, +0xbe,0x24,0x0, 0x96,0x28,0x3, 0x74,0x1, 0x22,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x22,0x8, 0x9a,0xbe,0x24,0x3, 0xe8,0x8, 0x9, 0xb, 0x70,0xbe,0x70, +0x10,0x68,0xe, 0x80,0x2, 0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10,0x2c,0xbc,0x6a,0x38, +0xdc,0xa5,0xbf,0x10,0x2a,0x6c,0x77,0x6c,0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a, +0x49,0x22,0x8, 0xca,0xbe,0x24,0x7, 0xd0,0x8, 0x9, 0xb, 0x70,0xa5,0xbf,0x8, 0x5, +0x74,0x1, 0x22,0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xdc,0xe4, +0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb,0x75,0xfb,0xa5,0x75,0xfb,0xf, +0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68,0x18,0xbe,0x34,0x73,0xf9,0x68,0x12,0xbe, +0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0xe4, +0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c,0xb7,0x54,0xfe,0xf5,0xf2,0x75,0xf3,0x80, +0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75,0xf6,0xff,0x7a,0xa1,0xf6,0x80, +0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75,0xf5,0x80,0x74,0x1, 0x12,0x6d,0x66,0xa9, +0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9,0xa9,0xc5,0xcb,0x74,0x1, 0x22, +0x74,0xa, 0x7a,0xb3,0xf, 0x46,0x74,0x14,0x7a,0xb3,0xf, 0x47,0x7e,0x34,0x3, 0x20, +0x7a,0x37,0xf, 0x48,0x7a,0x37,0xf, 0x4a,0x7e,0x24,0x2, 0x58,0x7a,0x27,0xf, 0x4c, +0x7a,0x37,0xf, 0x4e,0x7a,0x37,0xf, 0x50,0x74,0xc, 0x7a,0xb3,0xf, 0x52,0x74,0x8, +0x7a,0xb3,0xf, 0x53,0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, 0x54,0x7a,0x37,0xf, 0x56, +0x7a,0x37,0xf, 0x58,0x7e,0x34,0x0, 0x28,0x7a,0x37,0xf, 0x5a,0x74,0xf, 0x7a,0xb3, +0xf, 0x5c,0xe4,0x7a,0xb3,0xf, 0x5f,0x74,0x4, 0x7a,0xb3,0xf, 0x60,0x7e,0x34,0x0, +0x64,0x7a,0x37,0xf, 0x61,0x7e,0x34,0xa, 0x0, 0x7a,0x37,0xf, 0x5d,0x22,0xca,0x3b, +0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x3c,0xf5,0x1c,0xe4,0x7a,0xb3,0x10,0x3c,0x7d, +0x36,0x7d,0x27,0x12,0x6a,0xca,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x75,0x1a,0x0, +0x7e,0x34,0x10,0x2b,0x12,0x65,0x59,0x12,0x6e,0xc2,0x60,0xfb,0x7d,0x36,0x7e,0x25, +0x6f,0x12,0x55,0x3a,0x75,0x1b,0x0, 0x7e,0x51,0x1b,0x74,0x2, 0xac,0x5b,0x7d,0x32, +0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31, +0x1b,0x28,0x30,0x5, 0x1b,0xe5,0x1b,0xb4,0x25,0xdd,0x5, 0x1a,0xe5,0x1a,0xbe,0xb0, +0x4, 0x40,0xbd,0xe5,0x1c,0x7a,0xb3,0x10,0x3c,0xda,0x3b,0x22,0x7d,0x3, 0x75,0xcc, +0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0,0xe5,0xca,0x54,0x1, 0x4c,0xba, +0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1,0xe1,0x9, 0x70,0x0, 0xe, 0x2e, +0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c,0xba,0xc4,0x33,0x54,0xe0,0x7c, +0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, 0xb0,0x0, 0x13,0x54,0x3, 0xa, +0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5,0xe3,0x54,0xe7,0x4c,0xba,0xf5, +0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12,0x5d,0x65,0x9, 0xb0,0x0, 0x14, +0xf5,0xe7,0x22,0x7e,0xb3,0x16,0xa9,0x70,0x17,0xe5,0xcc,0x7a,0xb3,0x16,0xaa,0x7e, +0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xac,0x74,0x1, 0x7a,0xb3,0x16,0xa9, +0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc,0xc2,0xca,0xc2,0xc8,0xa9,0xc4, +0xcb,0x80,0x2e,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0x23,0xe5,0x74,0xb4,0x1, 0x1e,0xe5, +0x75,0xb4,0x1, 0x19,0xa9,0xc3,0xcb,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0xe4,0x12,0x6d, +0xaa,0x7e,0xb3,0x16,0xad,0x60,0xcc,0x22,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34, +0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6f,0xd, 0x12,0x6e,0xb0,0x12,0x61,0x8e,0x12, +0x6f,0x16,0x12,0x6d,0xbc,0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x12,0x6b,0xff,0x12,0x6a, +0x59,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x12,0x6e,0xf4,0x7e,0xb3, +0x10,0xa5,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14,0x68,0x16,0x14,0x68,0x13,0x24, +0x5, 0x78,0xeb,0x12,0x42,0xf0,0x80,0xe6,0x12,0x5e,0xda,0x80,0xe1,0x12,0x6a,0x32, +0x80,0xdc,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x12,0x58,0x57,0x80,0xd1,0x7c,0xa5,0x7c, +0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5, +0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2,0x1e,0xb0,0x1e,0xb0,0x54,0xf, +0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x1e,0x50,0x1e,0x50,0x1e,0x50, +0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50,0xf5,0xc1,0x7c,0xb3, +0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0,0x43,0xc2,0x7, 0x80,0x7, 0x43, +0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0xa9,0xc6,0xcb, +0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, 0xac,0x13,0x2e,0x4, 0x1c,0x3a, +0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c,0x33,0x80,0x43,0xa, 0x3, 0x2d, +0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0,0xb, 0x2d,0x3, 0x7e,0x9, 0xb0, +0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x3e, +0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c,0xb2,0x1e,0xb0,0x7e,0x90,0x2, +0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d,0xf, 0x1b,0x48,0x0, 0xb, 0x30, +0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, 0x9, 0xb2,0x0, 0xc, 0x54,0x7f, +0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x7, +0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4,0xb, 0x6c,0xaa,0xa, 0x1a,0x49, +0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5,0xb, 0xa0,0xbe,0xa0,0x25,0x40, +0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39,0xb0,0xf5,0xe5,0x75,0xe4,0x31, +0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x32,0x5e, +0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0xca,0x79,0x7e,0x71,0x54,0x3e,0x70,0x3e, +0x70,0x7c,0xb7,0x24,0x56,0xa, 0x2b,0xb, 0x28,0x50,0x7c,0xab,0x7c,0xb7,0x24,0x58, +0xa, 0x3b,0xb, 0x38,0x70,0x4d,0x77,0x68,0x1f,0xbe,0xa0,0x1, 0x68,0xa, 0xbe,0xa0, +0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x58,0x7d, +0x37,0x7e,0x24,0x18,0x0, 0x12,0x55,0x3a,0x5, 0x54,0xe5,0x53,0xbe,0xb1,0x54,0x28, +0x10,0x12,0x62,0xd5,0xb4,0x1, 0x5, 0x75,0x55,0x1, 0x80,0x8, 0x75,0x55,0x3, 0x80, +0x3, 0x75,0x55,0x2, 0xda,0x79,0x22,0x6d,0x11,0x7e,0x24,0x1c,0x1c,0x1b,0x28,0x10, +0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0xa3,0x0, 0x50,0x80,0x2, 0x7c, +0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x7e,0x4, +0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, 0x14,0x1b,0x8, 0x10,0x49,0x13, +0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0x49,0x13,0x0, 0x43, +0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10,0xb, 0x50,0xbe,0x50,0xd, 0x40, +0xb1,0x22,0x75,0x9, 0x0, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, +0x9, 0xe5,0xf, 0x12,0x53,0x92,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, +0x12,0x27,0x4a,0xf5,0x91,0x75,0xa, 0x0, 0xe4,0x7a,0xb3,0x0, 0xfa,0x7e,0x34,0x0, +0x76,0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0x0, 0xb8,0x7e,0x24, +0x0, 0x42,0x74,0xff,0x12,0x6e,0x21,0x74,0xaa,0x7a,0xb3,0x0, 0x76,0x7a,0xb3,0x0, +0x77,0x7a,0xb3,0x0, 0xb8,0x7a,0xb3,0x0, 0xb9,0x22,0xca,0xf8,0x74,0x3, 0x7a,0xb3, +0x16,0xa0,0xe4,0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10,0x4d,0x74,0x3, 0x7a,0xb3,0x16, +0xa0,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x7e, +0xf3,0x16,0xa0,0xbe,0xf0,0x3, 0x78,0x1d,0xe5,0xb, 0x30,0xe7,0xe4,0x12,0x6b,0x35, +0x7e,0x37,0xf, 0xd6,0x7a,0x37,0x16,0x9d,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x16,0x9b, +0x53,0xb, 0x7f,0x80,0xcc,0x7a,0xf3,0x10,0xa5,0x12,0x0, 0x1e,0x12,0x0, 0x6a,0xda, +0xf8,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5, +0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7c,0xb3,0xf5,0xbd,0xa, +0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5,0xc3,0xe5,0xc4,0x54,0xe0,0x4c, +0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23,0x4e,0x24,0x0, 0x1, 0x7c,0x15, +0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2,0x0, 0x0, 0x0, 0x0, 0xa9,0x37, +0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x6c,0xaa,0x6c,0x77,0x7e,0x10,0x30, +0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d,0x1, 0x2e,0x7, 0xf, 0xda,0xb, +0x8, 0x20,0xbe,0x27,0xe, 0x5, 0x8, 0x12,0x7d,0x41,0x2e,0x47,0xf, 0xd8,0xb, 0x48, +0x0, 0x2e,0x7, 0xe, 0x5, 0x1b,0x48,0x0, 0x80,0x18,0x6d,0x0, 0x9e,0x7, 0xe, 0x5, +0xbd,0x20,0x58,0xe, 0x2e,0x17,0xf, 0xd8,0xb, 0x18,0x20,0x9e,0x27,0xe, 0x5, 0x1b, +0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0,0xbe,0xa0,0xd, 0x40,0xac,0x22, +0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, 0x31,0x7e,0x79,0x50,0xa5,0xbd, +0x0, 0xb, 0x7e,0xd, 0x31,0x7e,0xb, 0x40,0x7a,0x79,0x40,0x80,0x36,0x7e,0xd, 0x31, +0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12,0x6e,0x11,0xa, 0x2c,0xbd,0x32, +0x8, 0x18,0x7e,0x1d,0x31,0x7e,0x1b,0xb0,0x7e,0x79,0xa0,0xbc,0xba,0x7c,0xba,0x28, +0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0,0x7e,0x79,0x30,0x7e,0x1d,0x31, +0x7a,0x1b,0x30,0xda,0x3b,0x22,0x7e,0xb3,0x10,0x39,0xb4,0x1, 0x26,0x7e,0x73,0xa, +0xac,0x7a,0x73,0x10,0x37,0x7e,0x73,0xa, 0xad,0x7a,0x73,0x10,0x38,0x7e,0x73,0xa, +0xae,0x7a,0x73,0x10,0x3a,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, +0xdc,0x80,0x24,0x7e,0x73,0x11,0x16,0x7a,0x73,0x10,0x37,0x7e,0x73,0x11,0x49,0x7a, +0x73,0x10,0x38,0x7e,0x73,0x11,0x94,0x7a,0x73,0x10,0x3a,0x7e,0x34,0x11,0x9d,0x7a, +0x37,0x10,0x46,0x7e,0x34,0xf, 0x63,0x7a,0x37,0x10,0x48,0x22,0xe5,0x55,0xbe,0xb0, +0x1, 0x68,0xf9,0xe5,0x74,0x60,0xfc,0xe5,0x75,0x60,0xfc,0x20,0x93,0xfd,0xd2,0x96, +0xd2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e,0xb3,0x16,0xa9,0x70,0x17,0xe5, +0xcc,0x7a,0xb3,0x16,0xaa,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xac, +0x74,0x1, 0x7a,0xb3,0x16,0xa9,0xa9,0xc0,0xca,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1d, +0x8, 0x1b,0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9,0xc2,0xcd,0x75,0x87,0x2, 0x0, +0x0, 0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2e,0x37,0xf, 0xd6,0xb, +0x38,0x10,0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xa0, +0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e, +0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0, +0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e,0x24,0x3, 0x70,0x74,0x18,0x7e, +0x13,0x10,0x2b,0x6c,0x0, 0x2, 0x5f,0x32,0x9, 0xa3,0x0, 0x24,0xbe,0xa0,0x1, 0x78, +0x5, 0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43,0xcc,0x8, 0x9, 0x53,0x0, 0x2, +0x3e,0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca,0xa9,0xd0,0xca,0xd2,0xcd,0xbe, +0xa0,0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9,0xc0,0xc9,0x7e,0x14,0x1d,0x0, +0xb, 0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20,0x9, 0xb3,0x0, 0x3f,0xb4,0x1, +0xc, 0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54,0xf0,0xf5,0xe5,0x22,0x12,0x4b, +0xdf,0x12,0x3c,0xc2,0x12,0x69,0xb, 0x7e,0x34,0x8, 0x50,0x7a,0x37,0xf, 0xd4,0x7e, +0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x7e,0x34,0x8, 0x9a,0x7e,0x27,0xf, 0xd4,0x12, +0x6a,0xca,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xf, 0xd8,0x7e,0x34,0x3, 0x70,0x7a,0x37, +0xf, 0xda,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xf, 0xd8,0x12,0x68,0x15,0x12,0x64,0xd4, +0x12,0x5a,0x90,0x12,0x6a,0x7f,0x12,0x52,0x72,0x12,0x6e,0x93,0x74,0x1, 0x7a,0xb3, +0x11,0x96,0x22,0xca,0xf8,0x7e,0xb3,0xf, 0xd2,0xb4,0x1, 0x48,0x6c,0xff,0x80,0x3c, +0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0xb1, +0x7e,0x53,0x10,0x2b,0x12,0x35,0x61,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x86,0x7e, +0x37,0xf, 0xd6,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, 0xb2,0x7e,0x53,0x10,0x2c,0x12, +0x35,0x61,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x88,0xb, 0xf0,0x7e,0x73,0xd, 0x16, +0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0xca,0x69,0xca,0xf8,0x7c,0xfb,0x7e,0x24,0x0, +0x4, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24,0x56,0xa, 0x3b,0x1b,0x38,0x20, +0x6d,0x66,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38,0x60,0xb, 0xf0,0x12,0x0, 0x6e, +0x50,0x1e,0x7e,0x24,0x0, 0x5, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24,0x56, +0xa, 0x3b,0x1b,0x38,0x20,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38,0x60,0xb, 0xf0, +0x7c,0xbf,0xda,0xf8,0xda,0x69,0x22,0x7e,0x47,0x16,0x36,0x6c,0x77,0x7e,0xa0,0xff, +0x7e,0x43,0x16,0x25,0xa, 0x14,0x9, 0x51,0xf, 0x29,0xbe,0x53,0x10,0x4a,0x78,0x32, +0x7e,0x50,0x12,0xac,0x45,0x49,0x22,0x16,0x36,0xbe,0x24,0x0, 0x41,0x40,0x23,0x7e, +0x60,0x1, 0xbe,0x44,0x0, 0x19,0x40,0x18,0x7e,0x30,0x12,0xac,0x36,0x49,0x21,0x16, +0x36,0xbd,0x24,0x50,0x4, 0x7d,0x42,0x7c,0x76,0xb, 0x60,0xbe,0x60,0x4, 0x40,0xe2, +0x7c,0xa7,0x7c,0xba,0x22,0xca,0x79,0xe5,0x53,0xbe,0xb1,0x54,0x38,0x4, 0x6c,0xff, +0x80,0x3a,0xe5,0x54,0x3e,0xb0,0x3e,0xb0,0x24,0x56,0xa, 0x3b,0xb, 0x38,0x30,0x7c, +0xe7,0xbe,0xe0,0x1, 0x68,0xe, 0xbe,0xe0,0x2, 0x68,0x9, 0xbe,0xe0,0x3, 0x68,0x4, +0x4c,0xee,0x78,0x7, 0x7c,0xbe,0x12,0x63,0x6c,0x7c,0xfb,0xbe,0xe0,0x4, 0x68,0x5, +0xbe,0xe0,0x5, 0x78,0x7, 0x7c,0xbe,0x12,0x51,0xe1,0x7c,0xfb,0x7c,0xbf,0xda,0x79, +0x22,0x7e,0xa3,0xd, 0xf7,0xbe,0xa0,0x0, 0x28,0x40,0x6c,0x77,0x80,0x38,0x7e,0x50, +0x2, 0xac,0x57,0x9, 0x62,0xd, 0x18,0x9, 0x52,0xd, 0x19,0x7e,0x30,0x2, 0xac,0x36, +0x49,0x1, 0x11,0xce,0x7e,0x17,0xf, 0x4a,0xe, 0x14,0xbd,0x1, 0x48,0x13,0x7e,0x30, +0x2, 0xac,0x35,0x49,0x1, 0x11,0x9e,0x7e,0x17,0xf, 0x4c,0xe, 0x14,0xbd,0x1, 0x58, +0x3, 0x74,0x1, 0x22,0xb, 0x70,0xbc,0xa7,0x38,0xc4,0xe4,0x22,0xca,0xf8,0x7c,0xfb, +0xbe,0xf0,0x1, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xf0,0x2, 0x68,0x4, 0x4c,0xff,0x78, +0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x39,0x80,0x3, 0xe4,0x80,0x28,0x12,0x60,0x36,0x4c, +0xff,0x78,0x11,0xe4,0x7a,0xb3,0x10,0x3a,0x74,0x1e,0x7a,0xb3,0x10,0x37,0x74,0xa, +0x7a,0xb3,0x10,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x6c,0x7e,0x34,0x10,0x2b,0x12, +0x65,0x59,0x74,0x1, 0xda,0xf8,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca, +0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75,0x74,0x1, 0x7e,0x24, +0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x60,0x2, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x70, +0x2, 0x1b,0x28,0x30,0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0xc8,0xd0,0x82,0xd0,0x83, +0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b, +0x32,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba, +0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc,0x7a,0xa1,0xc3,0x75,0xc5,0x40, +0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5, +0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x3b,0xe5,0xc6,0xa, 0x2b,0x7c,0x45, +0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22,0xe4,0x7a,0xb3,0x15,0x9f,0x7a,0xb3,0x15, +0x53,0x7a,0xb3,0x15,0x9e,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0xa1,0x7e,0x34,0x15, +0x56,0x7e,0x24,0x0, 0x48,0x12,0x6e,0x21,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x48, +0xe4,0x12,0x6e,0x21,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6e, +0x21,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x46,0x74,0xff,0x2, 0x6e,0x21,0xd2,0xcd, +0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e,0xb3,0x16,0xa9,0xb4,0x1, 0x15, +0x7e,0x73,0x16,0xac,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x7e,0xb3,0x16, +0xaa,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20, +0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4,0x7a, +0xb3,0x16,0xa9,0x22,0x7e,0x34,0x1, 0x90,0x7a,0x37,0xd, 0xff,0x7e,0x34,0x0, 0x19, +0x7a,0x37,0xe, 0x1, 0x7e,0x34,0x0, 0x9c,0x7a,0x37,0xe, 0x3, 0x7e,0x34,0x0, 0x8, +0x7a,0x37,0xe, 0x5, 0x7e,0x34,0x0, 0x4, 0x7a,0x37,0xe, 0x7, 0x74,0x1, 0x7a,0xb3, +0xe, 0x9, 0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, 0x7e,0x34,0x10,0x3, +0x7e,0x24,0x0, 0x28,0xe4,0x2, 0x6e,0x21,0x7c,0xab,0x6c,0x33,0x80,0x36,0xa, 0x3, +0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d,0x3, 0x7e, +0x9, 0x10,0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e,0x20,0x1e, +0x20,0x7e,0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d,0xf, 0x1b, +0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x75,0x75,0x0, 0x75,0xe4,0x3, 0x49, +0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, 0x5e,0x24, +0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5,0x75,0xe4, +0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9,0xd6,0xea, +0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1,0x22,0xca,0xf8,0x7e,0x24,0xe, 0xd, +0x7e,0x34,0xe, 0x99,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x7d,0x6c,0xff,0x74,0x7, 0xac, +0xbf,0x49,0x35,0xe, 0xd, 0x12,0x4c,0xa8,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x99, +0x49,0x35,0xe, 0xf, 0x12,0x4a,0x31,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, 0x9b,0xb, +0xf0,0xbe,0xf0,0xa, 0x40,0xd7,0xda,0xf8,0x22,0x6d,0x33,0x6c,0xaa,0x80,0x2e,0x7e, +0x30,0x2, 0xac,0x3a,0x9, 0x51,0xd, 0x18,0x9, 0x41,0xd, 0x19,0x7e,0x10,0x30,0xac, +0x15,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xf, 0xda,0xb, 0x18,0x40,0xbe, +0x44,0x0, 0x0, 0x8, 0x6, 0xbd,0x43,0x8, 0x2, 0x7d,0x34,0xb, 0xa0,0x7e,0xb3,0xd, +0xf7,0xbc,0xba,0x38,0xca,0x22,0xca,0x79,0x7d,0x41,0x7d,0x13,0x6d,0x0, 0x7e,0x34, +0x7f,0xff,0x6c,0xaa,0x80,0x1b,0x7e,0xf0,0x7, 0xac,0xfa,0x7d,0xe7,0x2d,0xe4,0x49, +0xfe,0x0, 0x2, 0xbd,0xf0,0x28,0x2, 0x7d,0xf, 0xbd,0xf3,0x50,0x2, 0x7d,0x3f,0xb, +0xa0,0x9, 0xb4,0x0, 0x46,0xbc,0xba,0x38,0xdd,0x1b,0x18,0x0, 0x1b,0x28,0x30,0xda, +0x79,0x22,0xca,0xf8,0x7e,0xb3,0x10,0x4e,0x60,0x3, 0xb4,0x1, 0x2d,0xa9,0xc6,0xea, +0x12,0x29,0x9c,0x7c,0xfb,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x68,0x15, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x54,0x21,0xbe,0xf0,0x1, 0x78,0x4, +0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0x10,0x4e,0xda,0xf8,0x22,0x7e,0xb3,0x16, +0x25,0x4, 0x7a,0xb3,0x16,0x25,0x7e,0x73,0x16,0x25,0xbe,0x70,0x4, 0x40,0x5, 0xe4, +0x7a,0xb3,0x16,0x25,0x7e,0xa3,0x16,0x25,0xbe,0xa0,0x3, 0x78,0x13,0x7e,0xb3,0x16, +0x6e,0x4, 0x7a,0xb3,0x16,0x6e,0xbe,0xb0,0x8, 0x40,0x5, 0xe4,0x7a,0xb3,0x16,0x6e, +0xa, 0x3a,0x9, 0xb3,0xf, 0x29,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d,0x21,0x7d, +0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x7d,0x7e,0xb3,0x10,0x3c,0xb4,0x1, 0x1f,0x6c, +0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d,0x26,0xb, +0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3,0xda,0x3b, +0x22,0x7e,0xb3,0x10,0x3d,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3,0x10,0x39, +0x12,0x60,0x36,0x12,0x2d,0xf4,0xe4,0x7a,0xb3,0x10,0x39,0x12,0x60,0x36,0x12,0x2d, +0xf4,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x58,0x7e,0x37,0xf, 0xd4,0x7e,0x24,0x8, 0xe4, +0x12,0x59,0x3f,0x74,0x2, 0x7a,0xb3,0x10,0x3d,0x22,0x7e,0xa3,0xf, 0x1c,0xbe,0xa0, +0x0, 0x38,0x2f,0xbe,0xa3,0xf, 0x1b,0x50,0x19,0x7e,0xb3,0xf, 0x25,0xbe,0xb3,0x12, +0x33,0x28,0x14,0x7e,0xb3,0x12,0x33,0x4, 0x7a,0xb3,0x12,0x33,0x7a,0xa3,0xf, 0x1b, +0x80,0x5, 0xe4,0x7a,0xb3,0x12,0x33,0x7e,0xb3,0xf, 0x1b,0x70,0x5, 0xe4,0x7a,0xb3, +0xf, 0x24,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca, +0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12,0x54,0xaf, +0x74,0x1, 0x7a,0xb3,0x0, 0xfa,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0x7b,0xca,0x6b,0xca, +0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x75, +0x75,0x1, 0x75,0xe6,0x0, 0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0xc8,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0xca,0xf8,0x7d,0x1, 0x7d,0x13,0x7e,0xf3,0x10,0x4d,0xbe,0xf0,0x1, 0x78, +0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x2, 0x80,0x11,0x4c,0xff, +0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x4, 0x12, +0x5f,0x32,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0xf, 0xd3,0x6c,0xaa,0x6c,0x33,0x6d,0xff, +0x7e,0x10,0x18,0xac,0x1a,0xa, 0xe3,0x2d,0xe, 0x3e,0x4, 0x7d,0x40,0x2d,0x42,0x1b, +0x48,0xf0,0x6d,0x44,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x18,0xdf,0xb, +0xa0,0xbe,0xa0,0xd, 0x40,0xd6,0x22,0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c,0x33,0x4c, +0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d,0x30,0x80, +0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe,0x30,0x3, +0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, 0x2a,0x2d, +0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x7e,0x24,0xff,0xff, +0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x14,0x2d,0x13,0x59, +0x21,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd1,0x22,0x7c,0xab,0x7e,0x24,0xe, +0xdf,0xbe,0xa0,0xa, 0x50,0x25,0xa, 0x3a,0x7d,0x13,0x2d,0x12,0x7e,0x19,0xb0,0xb4, +0x2, 0xe, 0x74,0x1, 0x7a,0x19,0xb0,0x74,0x3, 0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x22, +0x74,0x3, 0x7a,0x19,0xb0,0x2d,0x32,0x19,0xb3,0x0, 0xa, 0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x6e,0x9d,0x53,0xb, 0xfd,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b, +0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x6d,0x33,0x7a,0x37,0x11, +0xd, 0x74,0x1, 0x7a,0xb3,0x11,0xf, 0x74,0xb, 0x7a,0xb3,0x11,0x10,0x74,0x9, 0x7a, +0xb3,0x11,0x11,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x7a,0xb3,0x11,0x13,0x7a,0xb3,0x11, +0x14,0x74,0x1, 0x7a,0xb3,0x11,0x15,0x22,0x6c,0xaa,0x80,0x1f,0x7e,0x70,0x2, 0xac, +0x7a,0x49,0x23,0x16,0x6f,0x7e,0x70,0x18,0xac,0x7a,0x3e,0x34,0x2e,0x37,0xf, 0xda, +0x2e,0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc, +0xba,0x38,0xd9,0x22,0x75,0x74,0x0, 0xa9,0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28, +0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, +0x2, 0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, +0x5e,0x0, 0xf, 0x0, 0x96,0x1, 0x2c,0x0, 0xc, 0x0, 0x78,0x0, 0xfa,0x0, 0xa, 0x0, +0x64,0x0, 0xc8,0x0, 0x6, 0x0, 0x32,0x0, 0xa0,0x0, 0x3, 0x0, 0xf, 0x0, 0x78,0x0, +0x2, 0x0, 0xa, 0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56, +0xf5,0xf1,0x7c,0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9, +0x37,0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5, +0xcb,0x22,0xc2,0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54, +0x1e,0x54,0x3e,0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, +0x12,0x6d,0x66,0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x12,0x22,0x3c,0x12,0x3a, +0x2, 0x12,0x4d,0x5f,0x60,0x6, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x7e,0xb3,0xe, 0xb, +0x60,0x3, 0x12,0x60,0xe2,0x7e,0xb3,0xe, 0xc, 0x60,0x6, 0x12,0x55,0xc4,0x2, 0x5f, +0x89,0x22,0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0xf, 0x28,0x12, +0x6a,0x59,0xb4,0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x53,0xb, 0x8f,0x74,0x2, +0x80,0x2, 0x74,0xff,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x67, +0x1, 0x7e,0xb3,0x10,0x3d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x66,0x52,0x7e, +0xb3,0x10,0x4e,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0x7e, +0x34,0xa, 0xb1,0x7e,0x24,0x3, 0x4d,0xe4,0x12,0x6e,0x21,0x7e,0x34,0xb, 0x86,0x7e, +0x24,0x1, 0x90,0x74,0xff,0x12,0x6e,0x21,0x7e,0x34,0xd, 0x6b,0x7e,0x24,0x0, 0x8c, +0x74,0xff,0x2, 0x6e,0x21,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51, +0x80,0x3, 0x7e,0x39,0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23, +0x0, 0x3b,0x7e,0x34,0x1d,0x6, 0x1b,0x38,0x20,0x22,0xe4,0x7a,0xb3,0xf, 0xd2,0x6c, +0xaa,0x6d,0x44,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x2, 0x1b,0x8, 0x40,0x6d, +0x0, 0x2d,0x13,0x1b,0x18,0x0, 0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x22,0x7e,0x34, +0x12,0x1, 0x7e,0x24,0x0, 0x1e,0xe4,0x12,0x6e,0x21,0x7e,0x34,0x12,0x1f,0x7e,0x24, +0x0, 0x14,0xe4,0x12,0x6e,0x21,0x7e,0x34,0x11,0xed,0x7e,0x24,0x0, 0x14,0xe4,0x2, +0x6e,0x21,0x12,0x0, 0x6e,0x50,0x1d,0x12,0x6e,0xee,0x7c,0xab,0x7e,0xb3,0x11,0x95, +0xbe,0xb0,0x4, 0x68,0xf, 0xbe,0xa0,0xff,0x68,0xa, 0x74,0x1, 0x7a,0xb3,0x11,0xc, +0x7a,0xa3,0x11,0x95,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb3,0x10,0x3d,0x70,0x3, 0x7e, +0xf0,0x1, 0x74,0x1, 0x12,0x3f,0x5b,0xbe,0xb0,0x1, 0x68,0x5, 0xbe,0xf0,0x1, 0x78, +0x4, 0xe4,0x12,0x3f,0x5b,0xda,0xf8,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5, +0x0, 0x75,0xe4,0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, +0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x7e,0x34,0x8, 0x9a,0x7e, +0x24,0x11,0x9e,0x7e,0x14,0x1, 0x90,0x12,0x3e,0x16,0x7e,0x34,0x9, 0x2e,0x7e,0x24, +0x11,0x4a,0x7e,0x14,0x0, 0xc8,0x12,0x3e,0x16,0x2, 0x57,0x5d,0x74,0x1, 0x12,0x6e, +0x7e,0xa9,0xc3,0xea,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x75, +0x9a,0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xe5,0x52,0xb4, +0x1, 0x18,0xe5,0x51,0x70,0x14,0x7e,0xb3,0x11,0x95,0x60,0xb, 0xe4,0x7a,0xb3,0x11, +0x95,0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x12,0x6c,0x99,0x85,0x51,0x52,0x22,0x6c,0xaa, +0x7e,0x50,0x4, 0xac,0x5a,0x49,0x12,0x16,0x89,0xbd,0x13,0x38,0x8, 0x49,0x22,0x16, +0x8b,0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe4,0x7c,0xba,0x22,0x7e, +0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0xce,0x12,0x6c,0xec, +0x7e,0x34,0x7, 0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x2e,0x75, +0x55,0x0, 0x75,0x72,0x0, 0x75,0x54,0x0, 0x12,0x6c,0x3e,0x12,0x62,0x37,0xf5,0x53, +0x12,0x62,0xd5,0xb4,0x1, 0x4, 0x75,0x55,0x1, 0x22,0x75,0x55,0x3, 0x22,0x7e,0x34, +0x0, 0x1, 0x7a,0x35,0x56,0x7e,0x34,0xa, 0x18,0x7a,0x35,0x58,0x7e,0x34,0x0, 0x2, +0x7a,0x35,0x5a,0x7e,0x34,0xa, 0x62,0x7a,0x35,0x5c,0x74,0x2, 0x22,0x0, 0x50,0x0, +0xa, 0x6, 0x4, 0x0, 0x78,0x0, 0xc, 0x6, 0x4, 0x0, 0xc8,0x0, 0x1e,0x8, 0x5, 0x1, +0x40,0x0, 0x50,0x8, 0x5, 0x1, 0xf4,0x0, 0x64,0xa, 0x6, 0xe4,0x7a,0xb3,0x16,0xae, +0x7a,0xb3,0x16,0xad,0x7e,0xb3,0x10,0xa3,0x70,0x6, 0x7e,0x73,0x11,0x10,0x80,0x4, +0x7e,0x73,0x11,0x12,0x7a,0x73,0x16,0xaf,0x22,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x2, +0x7a,0xb3,0x10,0x7b,0x74,0x4, 0x7a,0xb3,0x10,0x7c,0x7e,0x34,0x16,0x26,0x7e,0x24, +0x0, 0x48,0xe4,0x2, 0x6e,0x21,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x75,0x92,0x70, +0xd2,0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8, +0x22,0xe4,0x7a,0xb3,0xd, 0xfb,0x7e,0x34,0x11,0x9e,0x7a,0x37,0xf, 0xd6,0x12,0x40, +0x96,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x2, 0x47,0x4a,0x75,0x74,0x1, 0x7e, +0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e, +0x34,0x0, 0x1, 0x2, 0x6e,0x68,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34, +0xc9,0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0xe5, +0x51,0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0x5a,0x80,0x4, 0x7e,0x34,0x0, 0x3c,0x7a,0x37, +0xf, 0x54,0x7a,0x37,0xf, 0x56,0x22,0xca,0xf8,0x12,0x6e,0x73,0x7c,0xfb,0x12,0x0, +0x6e,0x50,0x7, 0x4c,0xff,0x78,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0xda,0xf8,0x22,0x7e, +0x34,0x0, 0x24,0x12,0x69,0xb9,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, +0x57,0x2e,0x54,0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0x7d,0x3, 0x80, +0xa, 0x7e,0x29,0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d, +0x55,0x78,0xee,0x22,0x7e,0x53,0xf, 0x47,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x9d,0x32, +0xbe,0x34,0x0, 0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4, +0x1, 0x3, 0x43,0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3, +0x16,0xa0,0xe4,0x7a,0xb3,0x16,0xa7,0x74,0xff,0x7a,0xb3,0x16,0x9f,0x22,0x75,0x75, +0x1, 0xd2,0xee,0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x6e,0x68, +0xa, 0x2b,0x19,0x72,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x44,0x1, 0x7a,0xb3,0x10,0xfe, +0x22,0x7d,0x13,0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31, +0x22,0x32,0x1, 0x19,0x1, 0x0, 0x2, 0xf8,0x4, 0xe7,0x5, 0xce,0x6, 0xc2,0x7, 0xb5, +0x8, 0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32, +0x22,0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5, +0x22,0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, +0x12,0x0, 0x42,0x12,0x57,0xdd,0x74,0x3, 0x12,0x44,0xf, 0x2, 0x24,0xd0,0x7e,0x34, +0x0, 0x21,0x12,0x69,0xb9,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x7e,0xb3,0x11,0x15, +0xb4,0x1, 0x4, 0xe4,0x2, 0x6e,0xd3,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32, +0x38,0xfa,0x22,0x12,0x63,0x21,0xb4,0x1, 0x2, 0xe4,0x22,0x74,0x1, 0x22,0xd2,0xcf, +0xa9,0xd4,0xc9,0x75,0xcc,0x0, 0xc2,0xca,0x22,0xa9,0xc0,0x93,0x75,0x9, 0x0, 0x75, +0xa, 0x0, 0x32,0x75,0x53,0x0, 0x75,0x54,0x0, 0x75,0x55,0x0, 0x22,0xa9,0x32,0x99, +0x5, 0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x75,0xb, 0x0, 0x12,0x6f,0x4, 0x2, 0x5e,0x82, +0x12,0x6b,0x9c,0x12,0x6f,0xa, 0x2, 0x6e,0xa7,0xe5,0x74,0x60,0x3, 0x74,0x1, 0x22, +0xe4,0x22,0xe5,0x75,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x1, 0x2, 0x4, 0x8, 0x10, +0x20,0x40,0x80,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xa9,0xd0,0x99,0xa9,0xc6, +0xdf,0x22,0xf5,0x16,0x75,0x17,0x0, 0x22,0x12,0x61,0xe3,0x2, 0x38,0x88,0x12,0x50, +0x15,0x2, 0x62,0x87,0x12,0x6f,0x16,0x2, 0x6c,0x1f,0x7e,0x34,0x1, 0x3, 0x22,0x7e, +0x34,0x5, 0xb, 0x22,0x2, 0x6c,0xb6,0x2, 0x0, 0x76,0x2, 0x6d,0x6, 0x2, 0x6e,0xdb, +0x2, 0x6e,0x9d,0xe5,0x6d,0x22,0x22,0x0, 0x1, 0x15,0xde,0x1, 0x0, 0x1, 0xa, 0xac, +0x15,0x0, 0x1, 0xa, 0xad,0x17,0x0, 0x1, 0xa, 0xae,0x4, 0x0, 0x1, 0xd, 0xfe,0x40, +0x0, 0x5, 0xf, 0x29,0x20,0x17,0x29,0x38,0x13,0x0, 0x18,0xf, 0x2e,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x25,0xf, 0x63,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x18, +0xf, 0x88,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xf, 0xa0,0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xf, 0xad,0xc, +0xd, 0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, +0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x0, 0xd, 0xf, 0xc5,0x1, 0x2, 0x3, 0x4, 0x5, +0x6, 0x7, 0x8, 0x0, 0x9, 0xa, 0xb, 0xc, 0x0, 0x25,0xf, 0xdc,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x0, 0xd, 0x10,0xff,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0x0, 0x1, 0x11,0xc, 0x0, 0x0, 0x1, 0x11,0x16,0x15,0x0, 0x32,0x11,0x17, +0x0, 0x8, 0x0, 0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a, +0x1, 0xbc,0x2, 0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, +0x7, 0xf9,0x8, 0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e, +0xc, 0x83,0x0, 0x1, 0x11,0x49,0x17,0x0, 0x1, 0x11,0x94,0x2, 0x0, 0x1, 0x11,0x95, +0x0, 0x0, 0x4, 0x11,0x97,0xff,0xff,0xff,0xff,0x0, 0x2, 0x11,0x9b,0xff,0x1f,0x0, +0x1, 0x11,0x9d,0x40,0x0, 0x1, 0x11,0xe8,0x0, 0x0, 0x4, 0x11,0xe9,0x19,0x1e,0x1e, +0x1e,0x0, 0x1, 0x0, 0xff,0x0, 0x0, 0x1, 0x15,0x53,0x0, 0x0, 0x1, 0x15,0x9e,0x0, +0x0, 0x1, 0x15,0x9f,0x0, 0x0, 0x1, 0x15,0xa0,0x0, 0x0, 0x1, 0x15,0xa1,0x0, 0x0, +0x1, 0x12,0x33,0x0, 0x0, 0x1, 0x16,0xa9,0x0, 0x0, 0x1, 0x16,0xb1,0x0, 0x0, 0x1, +0x16,0xb2,0x0, 0x0, 0x1, 0x16,0xb3,0x0, 0x0, 0x1, 0x16,0xb4,0x0, 0x0, 0x1, 0x16, +0xb5,0x0, 0x0, 0x1, 0x16,0xb6,0x0, 0x0, 0x1, 0x16,0xb7,0x1, 0x0, 0x1, 0x16,0xb8, +0x1, 0x0, 0xc, 0x16,0x89,0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, +0x94,0x0, 0x6, 0x16,0x95,0x0, 0x8c,0x1, 0x68,0x2, 0x44,0x0, 0x1, 0x16,0x25,0x3, +0x0, 0x1, 0x16,0x6e,0x0, 0x0, 0x1, 0x16,0xb9,0x0, 0x0, 0x1, 0x16,0xba,0x0, 0x0, +0x1, 0x16,0xbb,0x0, 0x0, 0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x71,0x6, 0x8e,0xf9, +0xc3,0x3c,0x4, 0x51, \ No newline at end of file diff --git a/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_tianma_720p.txt b/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_tianma_720p.txt new file mode 100644 index 0000000000000..d475004e5121e --- /dev/null +++ b/drivers/input/touchscreen/ft5336/ft_app_ic_oufei_tianma_720p.txt @@ -0,0 +1,1806 @@ +0x2, 0x50,0xe2,0x2, 0x68,0x6e,0xe5,0x74,0x60,0x9, 0x74,0x1, 0x12,0x6e,0x92,0x75, +0x74,0x0, 0x22,0xe4,0x12,0x6e,0x92,0x75,0x74,0x1, 0x22,0x2, 0x50,0x4c,0xe5,0x55, +0xbe,0xb0,0x1, 0x68,0xf9,0x12,0x6e,0x78,0x60,0xfb,0x22,0x2, 0x67,0x5, 0x7e,0x34, +0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81,0x60, +0xfb,0x22,0x22,0x2, 0x6e,0x48,0xc2,0x8e,0x75,0x8d,0x0, 0xa9,0x34,0xc9,0x5, 0x75, +0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0x22,0x32,0x2, 0x63,0x4d,0xbe,0xb0, +0xa, 0x50,0x6, 0xa, 0x2b,0x19,0x72,0x16,0xa2,0x22,0x22,0x2, 0x0, 0x5a,0xe5,0x52, +0x24,0xff,0x22,0x2, 0x67,0x3d,0xca,0x3b,0x7e,0xb3,0xf, 0x1b,0xf5,0x26,0x7e,0xd3, +0xf, 0x1c,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x33,0x7e,0x34,0x0, 0x27,0x7e,0x24,0x0, +0xa, 0xe4,0x12,0x6d,0xe0,0x6c,0xcc,0x7e,0xa0,0xff,0x7e,0x70,0x7, 0xac,0x7c,0x19, +0xa3,0x13,0xba,0x7e,0x34,0x7f,0xff,0x74,0x7, 0xac,0xbc,0x59,0x35,0x13,0xb6,0x74, +0x7, 0xac,0xbc,0x59,0x35,0x13,0xb8,0xb, 0xc0,0xbe,0xc0,0xa, 0x78,0xd9,0xe5,0x26, +0x60,0x3, 0x2, 0x0, 0xef,0x12,0x6a,0xad,0xbe,0xd0,0x0, 0x38,0x3, 0x2, 0x0, 0xdf, +0x74,0x1, 0x7a,0xb3,0xf, 0x20,0xe4,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7e, +0x34,0x13,0x6, 0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x2, 0x1, 0x14,0x4c, +0xdd,0x68,0x3, 0x2, 0x1, 0x14,0x75,0x25,0x0, 0x7e,0xa0,0xff,0x7e,0x71,0x25,0x74, +0x7, 0xac,0x7b,0x19,0xa3,0xe, 0x57,0x5, 0x25,0xe5,0x25,0xb4,0xa, 0xeb,0x74,0x1, +0x7a,0xb3,0xf, 0x1f,0x75,0x25,0x0, 0x2, 0x1, 0x4c,0x7e,0x51,0x25,0x74,0x7, 0xac, +0x5b,0x2e,0x24,0xe, 0xd, 0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34, +0x1b,0x28,0x30,0x7e,0x51,0x25,0xac,0x5b,0x2e,0x24,0xe, 0xf, 0xb, 0x28,0x30,0x3e, +0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x5, 0x25,0xe5,0x26,0xbe,0xb1, +0x25,0x38,0xc7,0xe4,0x6c,0x77,0x7e,0x61,0x26,0x7e,0x24,0x13,0xb6,0x12,0x52,0x98, +0x7e,0x71,0x26,0x7e,0x60,0xa, 0x7e,0x24,0x13,0xb6,0x12,0x52,0x98,0x7c,0xcb,0x6c, +0xee,0x75,0x25,0x0, 0x2, 0x1, 0x92,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65,0x13, +0xba,0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x11,0xbc,0x76,0x78,0x3, 0x2, 0x1, 0x97, +0x5, 0x25,0xbe,0xc1,0x25,0x38,0xe0,0xbe,0xc1,0x25,0x68,0x3, 0x2, 0x1, 0xb8,0x7e, +0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3c,0x2e,0x14,0x13, +0xb6,0x74,0x7, 0x12,0x48,0xc5,0xb, 0xc0,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xb2,0x7e, +0x24,0x13,0xb6,0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x4c,0xdd, +0x68,0x3, 0x2, 0x1, 0xe7,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0xe, 0x53,0x7e,0x14,0x0, +0x46,0x12,0x6d,0x3c,0x2, 0x4, 0x84,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x4, 0x84, +0x6c,0xee,0x2, 0x4, 0x7b,0x75,0x25,0x0, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x9, 0x65, +0xe, 0x57,0x7e,0x90,0x7, 0xac,0x9e,0x9, 0x74,0xe, 0x11,0xbc,0x67,0x78,0x3, 0x2, +0x2, 0x1b,0x5, 0x25,0xe5,0x25,0xbe,0xb0,0xa, 0x40,0xdd,0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x9, 0xf5,0xe, 0x57,0x49,0x34,0xe, 0xf, 0x49,0x25,0xe, 0x55,0x12,0x6d,0xb0, +0x7d,0x63,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, 0xa4, +0x49,0x25,0xe, 0x53,0x12,0x6d,0xb0,0x7d,0x13,0x2d,0x16,0x7a,0x15,0x21,0x7c,0x1f, +0x2e,0x10,0x27,0x74,0x1, 0xa5,0xf7,0xbe,0x14,0x0, 0x40,0x28,0x3, 0x2, 0x2, 0xd9, +0x7e,0x35,0x21,0xbe,0x34,0x0, 0x20,0x38,0x3, 0x2, 0x2, 0xae,0x7e,0x70,0x3, 0xac, +0x7f,0x9, 0xb3,0x12,0x2, 0x60,0x3, 0x2, 0x2, 0x97,0x9, 0xb3,0x12,0x3, 0xbe,0xb0, +0x0, 0x38,0x3, 0x2, 0x2, 0x89,0x2, 0x2, 0xbf,0x74,0x1, 0x19,0xb3,0x12,0x2, 0x6d, +0x22,0x7a,0x25,0x21,0x2, 0x2, 0xed,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0xa, 0x40,0x3, +0x2, 0x2, 0xed,0x2e,0x34,0x12,0x3, 0x4, 0x7a,0x39,0xb0,0x2, 0x2, 0xd1,0x7e,0x70, +0x3, 0xac,0x7f,0x9, 0xb3,0x12,0x3, 0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x2, 0xcc,0x7d, +0x23,0x2e,0x24,0x12,0x3, 0x14,0x7a,0x29,0xb0,0x2, 0x2, 0xed,0xe4,0x19,0xb3,0x12, +0x2, 0x6d,0x33,0x7a,0x35,0x21,0x2, 0x2, 0xed,0x6c,0xaa,0x7e,0x70,0x3, 0xac,0x7f, +0x19,0xa3,0x12,0x3, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x2, 0x7e,0x35,0x21, +0xbe,0x34,0x0, 0x20,0x28,0x3, 0x2, 0x3, 0x2e,0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49, +0x35,0xe, 0x53,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x35,0xe, 0x55,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0x6d,0x33,0x7a, +0x35,0x21,0x7e,0xa0,0x1, 0x7e,0x70,0x3, 0xac,0x7f,0x19,0xa3,0x12,0x1, 0x7e,0xf5, +0x21,0x7a,0xf5,0x23,0xa, 0xef,0x2e,0xe5,0x33,0x7e,0xe9,0xb0,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x3, 0x52,0x6d,0xee,0x74,0x2, 0xac,0xbf,0x59,0xe5,0x11,0xed,0x59,0xe5, +0x12,0x1f,0x7e,0x17,0xf, 0x5d,0xbe,0x15,0x23,0x28,0x3, 0x2, 0x3, 0x68,0x7e,0x4, +0x1, 0x0, 0x7a,0x5, 0x31,0x2, 0x3, 0x8b,0x7e,0x35,0x23,0x6d,0x22,0x7c,0x56,0x7c, +0x67,0x6c,0x77,0x12,0x48,0x3e,0x7d,0xe3,0x7a,0xe5,0x31,0xbe,0xe4,0x0, 0x10,0x40, +0x3, 0x2, 0x3, 0x8b,0x7e,0xe4,0x0, 0x10,0x7a,0xe5,0x31,0x74,0x2, 0xac,0xbf,0x49, +0x45,0x12,0x1f,0xbe,0x45,0x21,0x38,0x3, 0x2, 0x3, 0xa5,0x49,0x45,0x11,0xed,0x7a, +0x45,0x31,0x2, 0x3, 0xac,0x7e,0x45,0x31,0x59,0x45,0x11,0xed,0x59,0xf5,0x12,0x1f, +0x7e,0x35,0x31,0xbe,0x34,0x1, 0x0, 0x38,0x3, 0x2, 0x3, 0xc3,0x7e,0x34,0x1, 0x0, +0x7a,0x35,0x31,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0xa1,0x25,0x74,0x7, +0xa4,0x49,0x25,0xe, 0x53,0x12,0x6d,0xb0,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31, +0xad,0x32,0x7c,0x76,0x7c,0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, +0xac,0x5b,0x49,0x32,0xe, 0x53,0xac,0xbe,0x49,0x15,0xe, 0xd, 0xbd,0x13,0x38,0x3, +0x2, 0x4, 0x14,0x7d,0x2, 0x2e,0x4, 0xe, 0x53,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, +0x10,0x2, 0x4, 0x1e,0x2e,0x24,0xe, 0x53,0x9e,0x35,0x21,0x1b,0x28,0x30,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e,0xa1,0x25,0x74,0x7, 0xa4,0x49,0x25,0xe, 0x55, +0x12,0x6d,0xb0,0x7d,0x23,0x7a,0x25,0x21,0x7e,0x35,0x31,0xad,0x32,0x7c,0x76,0x7c, +0x65,0xa, 0x24,0x7a,0x35,0x21,0x7e,0x51,0x25,0x74,0x7, 0xac,0x5b,0x49,0x32,0xe, +0x55,0xac,0xbe,0x49,0x15,0xe, 0xf, 0xbd,0x13,0x38,0x3, 0x2, 0x4, 0x6f,0x7d,0x2, +0x2e,0x4, 0xe, 0x55,0x7d,0x13,0x2e,0x15,0x21,0x1b,0x8, 0x10,0x2, 0x4, 0x79,0x2e, +0x24,0xe, 0x55,0x9e,0x35,0x21,0x1b,0x28,0x30,0xb, 0xe0,0xe5,0x26,0xbc,0xbe,0x28, +0x3, 0x2, 0x1, 0xf5,0x6c,0xee,0x74,0x7, 0xac,0xbe,0x49,0x45,0xe, 0x53,0x1e,0x44, +0x1e,0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x35,0x49,0x45,0xe, 0x55,0x1e,0x44,0x1e, +0x44,0x1e,0x44,0x1e,0x44,0x7a,0x45,0x37,0x9, 0xf5,0xe, 0x57,0x19,0xf5,0xe, 0x11, +0x74,0x7, 0xac,0xbe,0x9, 0x75,0xe, 0x58,0x19,0x75,0xe, 0x12,0x74,0x7, 0xac,0xbe, +0x9, 0x75,0xe, 0x59,0x19,0x75,0xe, 0x13,0x7c,0xbf,0x54,0xf, 0xbe,0xb0,0xa, 0x40, +0x3, 0x2, 0x5, 0xd7,0x7c,0xfb,0xa, 0xf, 0x7d,0x10,0x2e,0x15,0x33,0x7e,0x19,0xb0, +0xbe,0xb0,0x3, 0x78,0x3, 0x2, 0x5, 0xf4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x4, 0xf9, +0x74,0xff,0x19,0xb0,0x13,0x6, 0x2, 0x5, 0xd7,0x9, 0x90,0x13,0x6, 0xbe,0x90,0xff, +0x68,0x3, 0x2, 0x5, 0x4b,0x74,0x1, 0x19,0xb0,0x13,0x6, 0x7e,0x15,0x35,0x74,0x7, +0xac,0xbe,0x59,0x15,0xe, 0xd, 0x7e,0x15,0x37,0x74,0x7, 0xac,0xbe,0x59,0x15,0xe, +0xf, 0x6c,0xdd,0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x50,0x7, 0xac, +0x5d,0x7e,0x30,0x15,0xac,0x3f,0x2d,0x12,0x2e,0x14,0x12,0x34,0x74,0x7, 0x12,0x48, +0xc5,0xb, 0xd0,0xbe,0xd0,0x3, 0x78,0xdb,0x2, 0x5, 0xd7,0xbe,0x90,0x3, 0x50,0x3, +0x2, 0x5, 0x58,0xe4,0x19,0xb0,0x13,0x6, 0x7e,0x25,0x35,0x9, 0x80,0x13,0x6, 0x7e, +0x90,0x7, 0xac,0x89,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x43,0x59,0x24,0x12,0x34,0x7e, +0x25,0x37,0x59,0x24,0x12,0x36,0x7e,0xb3,0xf, 0x22,0x60,0x3, 0x2, 0x5, 0xa0,0xe4, +0x2e,0x34,0x12,0x34,0x12,0x67,0xd9,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0x74, +0x1, 0x7e,0x70,0x15,0xac,0x7f,0x2e,0x34,0x12,0x34,0x12,0x67,0xd9,0x2, 0x5, 0xc2, +0x49,0x34,0x12,0x34,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xd, 0xa, 0x3f,0x9, 0x43, +0x13,0x6, 0x7e,0x50,0x7, 0xac,0x45,0x7e,0x70,0x15,0xac,0x7f,0x2d,0x32,0x49,0x33, +0x12,0x36,0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0xf, 0xa, 0x3f,0x2e,0x34,0x13,0x6, +0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0x7c,0x1e,0x2e,0x10,0x27,0xa5,0xe7,0x60,0x3, +0x2, 0x5, 0xf4,0x7e,0x70,0x3, 0xac,0x7e,0x2e,0x34,0x12,0x1, 0x7e,0x24,0x0, 0x3, +0xe4,0x12,0x6d,0xe0,0xb, 0xe0,0xbe,0xe0,0xa, 0x68,0x3, 0x2, 0x4, 0x86,0xe5,0x26, +0xbe,0xb0,0x0, 0x38,0x3, 0x2, 0x6, 0xe, 0x74,0x1, 0x7a,0xb3,0xf, 0x24,0xda,0x3b, +0x22,0xca,0x3b,0x7e,0xe3,0xf, 0x1b,0x4c,0xee,0x78,0x27,0x6c,0xff,0x6d,0x11,0x74, +0x2, 0xac,0xbf,0x59,0x15,0x13,0x56,0x7e,0xa0,0xff,0x7e,0x30,0x7, 0xac,0x3f,0x19, +0xa1,0x13,0x14,0x74,0x2, 0xa, 0x1f,0x19,0xb1,0x13,0x6a,0xb, 0xf0,0xbe,0xf0,0xa, +0x78,0xdb,0x6c,0xff,0x2, 0x7, 0xac,0x74,0x7, 0xac,0xbf,0x9, 0xb5,0xe, 0x11,0x54, +0xf, 0xf5,0x22,0xbe,0xb0,0xa, 0x40,0x3, 0x2, 0x7, 0xaa,0xe5,0x22,0xa, 0x1b,0x9, +0xb1,0xe, 0xdf,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x7, 0x85,0x75,0x21,0x0, 0x7e,0x31, +0x21,0x74,0x7, 0xac,0x3b,0x9, 0x71,0x13,0x14,0x7a,0x71,0x23,0xbe,0x71,0x22,0x68, +0x3, 0x2, 0x7, 0x77,0x49,0x21,0x13,0x12,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xf, +0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x7e,0xa1,0x21,0x74,0x7, 0xa4,0x49,0x25,0x13, +0x10,0x74,0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x3, +0x2d,0x6, 0xe5,0x23,0xa, 0x1b,0x9, 0xa1,0x13,0x6a,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0x71,0x23,0x74,0x2, 0xac,0x7b,0x59,0x3, 0x13,0x56,0x2e,0x14,0x13,0x6a,0x7c,0xba, +0x14,0x7a,0x19,0xb0,0x2, 0x7, 0xaa,0x7e,0xa1,0x23,0x74,0x2, 0xa4,0x49,0x15,0x13, +0x56,0xbe,0x14,0x0, 0x32,0x28,0x9, 0xbe,0x4, 0x0, 0x32,0x28,0x3, 0x2, 0x7, 0x71, +0x7d,0x41,0x2e,0x44,0x0, 0x32,0xbd,0x40,0x50,0x8, 0xbe,0x14,0x0, 0x32,0x28,0x2, +0x80,0x6f,0xbe,0x4, 0x0, 0x96,0x28,0x63,0xe5,0x22,0xa, 0x1b,0x9, 0xb1,0xe, 0xdf, +0x70,0x4, 0x74,0x3, 0x80,0x2, 0x74,0x1, 0x19,0xb1,0xe, 0xdf,0x7e,0xa0,0x3, 0xe5, +0x22,0xa, 0x1b,0x19,0xa1,0xe, 0xe9,0x7e,0x71,0x21,0x74,0x7, 0xac,0x7b,0x2e,0x34, +0x13,0x10,0x7e,0x14,0x13,0xb6,0x12,0x48,0xc5,0xbe,0xe0,0x0, 0x28,0x2d,0x1b,0xe0, +0x7e,0x70,0x7, 0xac,0x7e,0x2e,0x34,0xe, 0xd, 0x7e,0x30,0x7, 0xac,0x3f,0x2e,0x14, +0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x7e,0x34,0x13,0xb6,0x7e,0x30,0x7, 0xac,0x3e, +0x2e,0x14,0xe, 0xd, 0x74,0x7, 0x12,0x48,0xc5,0x1b,0xf0,0x7e,0xa1,0x23,0x74,0x2, +0xa4,0x59,0x5, 0x13,0x56,0x80,0x33,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0xa, 0x50,0x3, +0x2, 0x6, 0x6e,0x80,0x25,0x6d,0x11,0x7e,0xa1,0x22,0x74,0x2, 0xa4,0x59,0x15,0x13, +0x56,0x7e,0xa0,0xff,0x7e,0x31,0x22,0x74,0x7, 0xac,0x3b,0x19,0xa1,0x13,0x14,0x7e, +0xa0,0x2, 0xe5,0x22,0xa, 0x1b,0x19,0xa1,0x13,0x6a,0xb, 0xf0,0xbc,0xef,0x28,0x3, +0x2, 0x6, 0x47,0x7a,0xe3,0xf, 0x1b,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13,0x10,0x7e, +0x14,0x0, 0x46,0x12,0x6d,0x3c,0xda,0x3b,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a, +0x7d,0x12,0x2d,0x13,0x9, 0xb1,0x0, 0x1, 0x54,0x3f,0xa, 0xb, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x7e,0x19,0xb0,0x54,0x3f,0xa, 0x1b,0x4d, +0x10,0x2e,0x24,0x1c,0x36,0x1b,0x28,0x10,0xb, 0xa0,0xbe,0xa0,0x2, 0x40,0xcc,0x22, +0xd2,0x9f,0x6d,0x33,0x89,0x34,0xca,0x3b,0x7d,0x63,0x75,0x24,0xc, 0x75,0x25,0x0, +0x75,0x26,0x17,0x75,0x27,0x0, 0x7e,0x34,0x13,0xd0,0x7e,0x24,0x0, 0x28,0xe4,0x12, +0x6d,0xe0,0x6c,0x66,0x2, 0x8, 0xed,0x74,0x2, 0xac,0xb6,0x9, 0x75,0xd, 0x18,0x7a, +0x71,0x23,0x9, 0xa5,0xd, 0x19,0x1a,0x17,0x7d,0x21,0x1b,0x25,0xb, 0x15,0x7c,0x43, +0x1a,0x1a,0x1b,0x15,0x1a,0xa, 0xb, 0x5, 0x7c,0x21,0xbe,0x50,0x0, 0x58,0x2, 0x6c, +0x55,0x7e,0x73,0x10,0x2b,0xa, 0x7, 0x1b,0x4, 0x1a,0x44,0xbd,0x40,0x8, 0x2, 0x7c, +0x41,0xbe,0x30,0x0, 0x58,0x2, 0x6c,0x33,0x7e,0x73,0x10,0x2c,0xa, 0x7, 0x1b,0x4, +0x1a,0x42,0xbd,0x40,0x8, 0x2, 0x7c,0x21,0xbe,0x51,0x24,0x58,0x3, 0x7a,0x51,0x24, +0xbe,0x41,0x25,0x8, 0x3, 0x7a,0x41,0x25,0xbe,0x31,0x26,0x58,0x3, 0x7a,0x31,0x26, +0xbe,0x21,0x27,0x8, 0x3, 0x7a,0x21,0x27,0x7c,0xf5,0x80,0x4b,0x7c,0xe3,0x80,0x41, +0x1a,0xef,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0xe, 0x2d,0xf, 0xe, 0x4, 0xe, 0x4, +0xe, 0x4, 0x7c,0x71,0x7a,0x71,0x21,0x7e,0x10,0x18,0xac,0x1f,0x7c,0xb1,0x2c,0xbe, +0x54,0x7, 0x7e,0x4, 0x0, 0x1, 0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7c,0xb1,0xf5, +0x22,0xa, 0x7, 0x2e,0x4, 0x13,0xd0,0x7e,0x9, 0xb0,0x45,0x22,0x7a,0x9, 0xb0,0xb, +0xe0,0xbc,0x2e,0x58,0xbb,0xb, 0xf0,0xbc,0x4f,0x58,0xb1,0xb, 0x60,0x7e,0x73,0xd, +0xf7,0xbc,0x76,0x28,0x3, 0x2, 0x8, 0x27,0xbe,0x70,0x0, 0x38,0x3, 0x2, 0xd, 0x43, +0x7e,0xe1,0x26,0x2, 0xd, 0x3a,0x6c,0xff,0x80,0x1f,0x1a,0x3e,0x3e,0x34,0x1a,0x2f, +0x7e,0x14,0x0, 0x30,0xad,0x12,0x2d,0x31,0x2d,0x36,0xb, 0x38,0x30,0xe, 0x34,0xe, +0x34,0x3e,0x24,0x59,0x32,0x13,0xb6,0xb, 0xf0,0x7e,0x73,0x10,0x2b,0xbc,0x7f,0x18, +0xd9,0x7e,0xf1,0x24,0x2, 0xd, 0x2f,0x1a,0x4f,0x7e,0x14,0x0, 0x18,0xad,0x14,0x1a, +0x3e,0x7d,0x51,0x2d,0x53,0xe, 0x54,0xe, 0x54,0xe, 0x54,0x7c,0xab,0x7a,0xa1,0x21, +0x7e,0x50,0x18,0xac,0x5f,0x7c,0xb5,0x2c,0xbe,0x54,0x7, 0x7e,0x24,0x0, 0x1, 0x60, +0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x22,0xa, 0x2a,0x9, 0xb2,0x13,0xd0, +0x55,0x22,0x78,0x3, 0x2, 0xd, 0x2d,0xbe,0xf0,0x3, 0x58,0x3, 0x2, 0x9, 0xfe,0x7e, +0x53,0x10,0x2b,0xa, 0x25,0x1b,0x26,0xbd,0x42,0x18,0x73,0x7d,0xf4,0x3e,0xf4,0x49, +0x5f,0x13,0xba,0x49,0x2f,0x13,0xb2,0x2d,0x25,0x7d,0x52,0x3e,0x54,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x2d,0x25,0x49,0x5f,0x13,0xbc,0x49,0xef,0x13,0xb0,0x2d,0xe5,0x7d, +0x5e,0x3e,0x54,0x2d,0x5e,0x9d,0x25,0x49,0xef,0x13,0xb8,0x49,0x5f,0x13,0xb4,0x2d, +0x5e,0x7d,0xe5,0x3e,0xe4,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d, +0x5e,0x9d,0x25,0x49,0x5f,0x13,0xb6,0x7d,0x5, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e, +0x4, 0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x9d,0x10,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x2, 0xb, 0x55,0x4c,0xff, +0x78,0x5d,0x7d,0x24,0x3e,0x24,0x49,0x12,0x13,0xb6,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x3e,0x54,0x2d,0x50,0x7d,0x1, 0x3e,0x4, 0x2d,0x5, 0x2d,0x1, 0x49,0x12,0x13,0xb8, +0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5, 0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x9d,0x1, 0x49,0x12,0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54, +0x2d,0x50,0x9d,0x51,0x49,0x22,0x13,0xbc,0x3e,0x24,0x9d,0x52,0x2, 0xb, 0x55,0xbe, +0xf0,0x1, 0x78,0x69,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x2d,0x12,0x49,0x20, +0x13,0xb6,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x24,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x25,0x9d,0x21,0x49,0x10, +0x13,0xb8,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x21,0x49,0x10, +0x13,0xba,0x7d,0x51,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10, +0x13,0xbc,0x7d,0x21,0x3e,0x24,0x2d,0x21,0x9d,0x52,0x2, 0xb, 0x55,0xbe,0xf0,0x2, +0x68,0x3, 0x2, 0xb, 0x75,0x7d,0x4, 0x3e,0x4, 0x49,0x10,0x13,0xb4,0x7d,0x21,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x50,0x13,0xb2,0x7d, +0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x9d,0x15,0x9d,0x12,0x49,0x20,0x13,0xb6,0x7d, +0xf2,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x9d,0x5f,0x3e,0x24,0x3e,0x24,0x2d, +0x25,0x2d,0x21,0x49,0x50,0x13,0xb8,0x7d,0x15,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x2d,0x15,0x9d,0x21,0x49,0x50,0x13,0xba,0x7d,0x15,0x3e,0x14,0x3e, +0x54,0x3e,0x54,0x3e,0x54,0x2d,0x51,0x2d,0x52,0x49,0x10,0x13,0xbc,0x7d,0x21,0x3e, +0x24,0x2d,0x21,0x9d,0x52,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, 0x54,0xe, +0x54,0x7d,0x23,0x3e,0x24,0x7e,0x14,0x0, 0x30,0xad,0x14,0x2d,0x21,0x2d,0x26,0x1b, +0x28,0x50,0x2, 0xd, 0x11,0x7e,0xa3,0x10,0x2b,0x7c,0xba,0x24,0xfd,0xbc,0xbf,0x68, +0x3, 0x2, 0xc, 0x11,0x3e,0x44,0x49,0x24,0x13,0xb2,0x7d,0x12,0x3e,0x14,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x2d,0x21,0x49,0x4, 0x13,0xb0,0x7d,0x10,0x3e,0x14,0x2d,0x10, +0x9d,0x21,0x49,0x4, 0x13,0xb4,0x7d,0x10,0x3e,0x14,0x3e,0x14,0x3e,0x14,0x3e,0x14, +0x3e,0x14,0x2d,0x10,0x9d,0x21,0x49,0x14,0x13,0xb6,0x7d,0xf1,0x3e,0xf4,0x3e,0xf4, +0x3e,0xf4,0x3e,0xf4,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x9d,0xf, 0x3e,0x14,0x3e,0x14,0x2d,0x10,0x2d,0x12,0x49,0x4, +0x13,0xb8,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x20, +0x9d,0x12,0x49,0x4, 0x13,0xba,0x7d,0x20,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x9d,0x20, +0x2d,0x21,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x2, 0xd, +0x0, 0x7c,0xba,0x24,0xfe,0xbc,0xbf,0x78,0x76,0x1a,0xf, 0x3e,0x4, 0x49,0x30,0x13, +0xb0,0x7d,0x23,0x3e,0x24,0x2d,0x23,0x49,0x10,0x13,0xb2,0x7d,0x31,0x3e,0x34,0x3e, +0x34,0x3e,0x34,0x2d,0x31,0x9d,0x32,0x49,0x20,0x13,0xb4,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x3e,0x24,0x9d,0x32,0x49,0x20,0x13,0xb6,0x7d,0x12,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x14,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e, +0x24,0x3e,0x24,0x9d,0x21,0x2d,0x23,0x49,0x30,0x13,0xb8,0x7d,0x13,0x3e,0x14,0x3e, +0x14,0x3e,0x14,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x2d,0x31,0x9d,0x23,0xe, +0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e,0x80,0x71,0x7e, +0xb3,0x10,0x2b,0x14,0xbc,0xbf,0x78,0x79,0x1a,0x5f,0x3e,0x54,0x49,0x25,0x13,0xb2, +0x7d,0x32,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x9d,0x32,0x49,0x25,0x13,0xb0,0x3e,0x24, +0x9d,0x32,0x49,0x25,0x13,0xb4,0x7d,0x42,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x24, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x2d,0x24,0x9d,0x32,0x49,0x15,0x13,0xb6,0x7d,0x21, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0x3e,0x24,0x7d,0x1, 0x3e,0x4, 0x3e,0x4, 0x3e,0x4, +0x3e,0x4, 0x3e,0x4, 0x3e,0x4, 0x2d,0x2, 0x7d,0x21,0x3e,0x24,0x2d,0x20,0x2d,0x21, +0x2d,0x23,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x1a,0x3e, +0x3e,0x34,0x1a,0xf, 0x7e,0x14,0x0, 0x30,0xad,0x10,0x2d,0x31,0x2d,0x36,0x1b,0x38, +0x20,0x1a,0x1e,0x3e,0x14,0x1a,0x2f,0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x23,0x2d, +0x21,0x2d,0x26,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0xb, 0xf0,0xe5, +0x25,0xbc,0xbf,0x48,0x3, 0x2, 0x9, 0x37,0xb, 0xe0,0xe5,0x27,0xbc,0xbe,0x48,0x3, +0x2, 0x9, 0x6, 0xda,0x3b,0x22,0xca,0x3b,0x7c,0xfb,0x7e,0xb3,0xd, 0xf7,0xf5,0x2c, +0x75,0x10,0x0, 0xe4,0x7a,0xb3,0x15,0x54,0x7a,0xb3,0x15,0x55,0x6d,0x22,0x7e,0x34, +0x7f,0xff,0x7e,0x67,0xf, 0xda,0x6c,0xee,0xe4,0xa, 0x1e,0x19,0xb1,0x13,0xb6,0x6c, +0xaa,0x7e,0x10,0x2, 0xac,0x1e,0x19,0xa0,0x15,0x2b,0x19,0xb0,0x15,0x2c,0xe5,0x2c, +0xbc,0xbe,0x28,0x24,0x9, 0x20,0xd, 0x18,0x7e,0x30,0x18,0xac,0x23,0x9, 0x10,0xd, +0x19,0xa, 0x1, 0x2d,0x10,0x3e,0x14,0x2d,0x16,0xb, 0x18,0x10,0xbd,0x12,0x48,0x2, +0x7d,0x21,0xbd,0x13,0x18,0x2, 0x7d,0x31,0xb, 0xe0,0xbe,0xe0,0x14,0x78,0xb9,0x2d, +0x32,0xe, 0x34,0xe5,0x2c,0xbe,0xb0,0x2, 0x50,0x3, 0x2, 0x11,0x9d,0x6c,0xee,0x7e, +0x30,0x6, 0xac,0x3e,0x7d,0x51,0x2e,0x54,0x69,0x4e,0x7e,0x44,0x0, 0xff,0xb, 0x2a, +0x20,0xbd,0x23,0x58,0x20,0x7d,0x51,0x2e,0x54,0x69,0x50,0x7e,0x44,0x0, 0xff,0xb, +0x2a,0x20,0x7a,0x25,0x30,0x2e,0x14,0x69,0x52,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x20, +0x7a,0x25,0x32,0x80,0x7, 0xb, 0xe0,0xbe,0xe0,0x7, 0x40,0xc3,0x6c,0xee,0x2, 0x11, +0x8b,0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19, +0xf5,0x23,0x4c,0xee,0x68,0x8, 0xa, 0x3e,0x9, 0xb3,0x13,0xb6,0x70,0xa, 0xa, 0x3e, +0xb, 0x34,0xa, 0x2e,0x19,0x72,0x13,0xb6,0xe5,0x2c,0x14,0xbc,0xbe,0x78,0x3, 0x2, +0x11,0x94,0xa, 0x5e,0xb, 0x54,0xf5,0x2d,0x2, 0x11,0x7f,0x7e,0x71,0x2d,0x74,0x2, +0xac,0x7b,0x9, 0xa3,0xd, 0x18,0x7a,0xa1,0x24,0x9, 0xb3,0xd, 0x19,0xf5,0x25,0xa, +0x2a,0xe5,0x22,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x2a,0xe5,0x25, +0xa, 0x2b,0xe5,0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x2b,0x75, +0x3d,0x2, 0x75,0x2f,0x0, 0x7e,0x51,0x22,0x74,0x18,0xac,0x5b,0xe5,0x23,0xa, 0x3b, +0x2d,0x23,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0x7a,0x25,0x34,0x7e,0x11,0x24,0x74, +0x18,0xac,0x1b,0xe5,0x25,0xa, 0x1b,0x7d,0x20,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0x7a,0x25,0x36,0x7d,0x52,0x3e,0x54,0x3e,0x54,0x3e,0x54,0xe, 0x54,0xe, +0x54,0xe, 0x54,0xe, 0x54,0x7a,0x55,0x38,0xbe,0x25,0x34,0x8, 0x14,0x7e,0x25,0x34, +0x3e,0x24,0x3e,0x24,0x3e,0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0xe, 0x24,0x7a,0x25, +0x38,0xe5,0x2a,0xbe,0xb0,0x1, 0x38,0x37,0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x30,0x7c, +0xbf,0x54,0x2, 0xb4,0x2, 0x29,0x2d,0x3, 0x3e,0x4, 0x2d,0x6, 0xb, 0x8, 0x20,0x7e, +0x71,0x22,0x74,0x18,0xac,0x7b,0x2d,0x31,0x3e,0x34,0x2d,0x36,0xb, 0x38,0x30,0x2d, +0x32,0xbe,0x35,0x38,0x18,0x3, 0x2, 0x11,0x13,0x75,0x2f,0x1, 0x2, 0x11,0x13,0xe5, +0x2a,0xbe,0xb0,0x1, 0x38,0xa, 0xe5,0x2b,0xbe,0xb0,0x1, 0x38,0x3, 0x2, 0x11,0x13, +0xe5,0x2a,0xbe,0xb0,0x4, 0x40,0x3, 0x2, 0x11,0x13,0xe5,0x2b,0xbe,0xb0,0x4, 0x40, +0x3, 0x2, 0x11,0x13,0x7c,0xbf,0x54,0x1, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x11,0x13, +0x6d,0x33,0x7a,0x35,0x3a,0x75,0x3c,0x0, 0x85,0x22,0x26,0x85,0x24,0x28,0xe5,0x24, +0xbe,0xb1,0x22,0x50,0x6, 0x85,0x24,0x26,0x85,0x22,0x28,0x85,0x23,0x27,0x85,0x25, +0x29,0xe5,0x25,0xbe,0xb1,0x23,0x50,0x6, 0x85,0x25,0x27,0x85,0x23,0x29,0x75,0x40, +0x0, 0x75,0x41,0x0, 0xe5,0x28,0xbe,0xb1,0x26,0x78,0x21,0x75,0x40,0x1, 0xe5,0x26, +0x60,0x5, 0xe5,0x26,0xb4,0xc, 0x3, 0x75,0x41,0x1, 0xe5,0x26,0xbe,0xb0,0x0, 0x28, +0x2, 0x15,0x26,0xe5,0x28,0xbe,0xb0,0xc, 0x50,0x2, 0x5, 0x28,0xe5,0x29,0xbe,0xb1, +0x27,0x78,0x21,0x75,0x40,0x1, 0xe5,0x27,0x60,0x5, 0xe5,0x27,0xb4,0x17,0x3, 0x75, +0x41,0x1, 0xe5,0x27,0xbe,0xb0,0x0, 0x28,0x2, 0x15,0x27,0xe5,0x29,0xbe,0xb0,0x17, +0x50,0x2, 0x5, 0x29,0x85,0x26,0x3e,0x80,0x78,0x85,0x27,0x3f,0x80,0x6a,0xe5,0x26, +0xbe,0xb1,0x3e,0x68,0x15,0xe5,0x28,0xbe,0xb1,0x3e,0x68,0xe, 0xe5,0x27,0xbe,0xb1, +0x3f,0x68,0x7, 0xe5,0x29,0xbe,0xb1,0x3f,0x78,0x24,0x7e,0x51,0x3e,0x74,0x18,0xac, +0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x20,0xbe,0x24, +0x0, 0x0, 0x8, 0x6, 0x2e,0x25,0x3a,0x7a,0x25,0x3a,0x5, 0x3c,0x80,0x28,0x7e,0x51, +0x3e,0x74,0x18,0xac,0x5b,0xe5,0x3f,0xa, 0x1b,0x2d,0x21,0x3e,0x24,0x2d,0x26,0xb, +0x28,0x20,0xbe,0x25,0x32,0x8, 0xc, 0xe5,0x3d,0xbe,0xb0,0x0, 0x28,0x5, 0x75,0x3d, +0x1, 0x80,0x3, 0x75,0x3d,0x0, 0x5, 0x3f,0xe5,0x29,0xbe,0xb1,0x3f,0x50,0x8f,0x5, +0x3e,0xe5,0x28,0xbe,0xb1,0x3e,0x50,0x81,0x7e,0x51,0x28,0x74,0x18,0xac,0x5b,0xe5, +0x27,0xa, 0x4b,0x2d,0x24,0x3e,0x24,0x2d,0x26,0xb, 0x28,0x50,0x7e,0x25,0x3a,0x9d, +0x25,0x7e,0x31,0x26,0x74,0x18,0xac,0x3b,0xe5,0x29,0xa, 0xb, 0x7d,0x51,0x2d,0x50, +0x3e,0x54,0x2d,0x56,0xb, 0x58,0x50,0x9d,0x25,0x2d,0x14,0x3e,0x14,0x2d,0x16,0xb, +0x18,0x10,0x9d,0x21,0x7e,0x31,0x28,0x74,0x18,0xac,0x3b,0x2d,0x10,0x3e,0x14,0x2d, +0x16,0xb, 0x18,0x10,0x9d,0x21,0x7a,0x25,0x3a,0x7e,0x25,0x36,0x2e,0x25,0x34,0x7a, +0x25,0x38,0xe5,0x40,0xb4,0x1, 0x11,0xe5,0x41,0x70,0xd, 0x7e,0x25,0x3a,0x9e,0x25, +0x38,0x7a,0x25,0x3a,0x15,0x3c,0x15,0x3c,0xe5,0x3c,0xbe,0xb0,0x4, 0x28,0x6, 0xe5, +0x3c,0x24,0xfc,0xf5,0x3c,0x7e,0x25,0x3a,0xbe,0x24,0x0, 0x0, 0x58,0x3, 0x7a,0x35, +0x3a,0x7e,0x15,0x38,0x1a,0x2, 0x1a,0x0, 0x7e,0x35,0x30,0x1a,0x26,0x1a,0x24,0x12, +0x48,0x24,0xe5,0x3c,0xa, 0x1b,0x6d,0x0, 0x12,0x48,0x24,0x7f,0x21,0x7e,0x35,0x3a, +0x1a,0x26,0x1a,0x24,0x7e,0x14,0x0, 0x28,0x12,0x48,0x35,0xbf,0x12,0x8, 0xa, 0xe5, +0x3d,0xbe,0xb0,0x0, 0x28,0x3, 0x75,0x2f,0x2, 0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, +0x75,0x2f,0x2, 0xe5,0x2f,0xbe,0xb0,0x0, 0x28,0x63,0xe5,0x2f,0xa, 0x3b,0x2e,0x34, +0x15,0x53,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x2d,0xa, 0x3b,0x9, 0xb3,0x13, +0xb6,0x70,0xc, 0xa, 0x2e,0x9, 0x52,0x13,0xb6,0x19,0x53,0x13,0xb6,0x80,0x3e,0x75, +0x2e,0x0, 0x80,0x32,0x9, 0x33,0x13,0xb6,0xa, 0x2e,0x9, 0xa2,0x13,0xb6,0xbc,0xa3, +0x28,0x12,0xe5,0x2e,0xa, 0x2b,0x9, 0x22,0x13,0xb6,0xbc,0x2a,0x78,0x16,0x19,0x32, +0x13,0xb6,0x80,0x10,0xe5,0x2e,0xa, 0x2b,0x9, 0xb2,0x13,0xb6,0xbc,0xb3,0x78,0x4, +0x19,0xa2,0x13,0xb6,0x5, 0x2e,0xe5,0x2c,0xbe,0xb1,0x2e,0x38,0xc7,0x5, 0x2d,0xe5, +0x2c,0xbe,0xb1,0x2d,0x28,0x3, 0x2, 0xe, 0x3b,0xb, 0xe0,0xe5,0x2c,0xbc,0xbe,0x28, +0x3, 0x2, 0xe, 0x1, 0x7e,0x34,0x13,0xb6,0x12,0x39,0xc4,0xf5,0x10,0xda,0x3b,0x22, +0xca,0x3b,0x7c,0xf6,0x7c,0xe7,0x7c,0xdb,0x6c,0x33,0x6c,0x44,0x6c,0x22,0x6c,0x55, +0x7e,0x37,0xf, 0x61,0x7a,0x35,0x3e,0x6c,0xaa,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0xe4,0x19,0xb3,0xd, 0x71,0xa, 0x5d,0x3e,0x54,0xb, 0x54,0x7c,0xab,0x7e, +0x70,0x2, 0xac,0x7e,0x9, 0xb3,0xd, 0x18,0xf5,0x39,0x9, 0xb3,0xd, 0x19,0xf5,0x3a, +0xbe,0xd1,0x3a,0x28,0x3, 0x2, 0x12,0xe, 0x7e,0xb3,0x10,0x2c,0xa, 0xb, 0x1b,0x4, +0xa, 0x3d,0x9d,0x3, 0xe5,0x3a,0xa, 0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0xe, 0x7c, +0x3a,0xa, 0x4d,0xe5,0x3a,0xa, 0xb, 0x9d,0x4, 0x7c,0x51,0x2, 0x12,0x59,0xbe,0xd1, +0x3a,0x38,0x3, 0x2, 0x12,0x27,0xe5,0x3a,0xa, 0xb, 0xa, 0x3d,0x2d,0x30,0xb, 0x34, +0x7c,0x37,0x6c,0x55,0x2, 0x12,0x59,0xa, 0xfd,0xe5,0x3a,0xa, 0x4b,0x2d,0xf4,0x7e, +0xb3,0x10,0x2c,0xa, 0xb, 0x7d,0x30,0x1b,0x34,0xbd,0xf3,0x18,0x3, 0x2, 0x12,0x59, +0xbd,0x43,0x8, 0x3, 0x2, 0x12,0x59,0xa, 0x3d,0x2d,0x30,0xe5,0x3a,0xa, 0xb, 0x9d, +0x30,0x7c,0x37,0xa, 0x3d,0x9d,0x3, 0x7c,0x51,0xbe,0xd1,0x39,0x28,0x3, 0x2, 0x12, +0x83,0x7e,0xb3,0x10,0x2b,0xa, 0xb, 0x1b,0x4, 0xa, 0x3d,0x9d,0x3, 0xe5,0x39,0xa, +0x3b,0xbd,0x30,0x8, 0x3, 0x2, 0x12,0x83,0x7c,0x4a,0xa, 0xd, 0xe5,0x39,0xa, 0x3b, +0x2, 0x12,0xca,0xbe,0xd1,0x39,0x38,0x3, 0x2, 0x12,0x9c,0xe5,0x39,0xa, 0xb, 0xa, +0x3d,0x2d,0x30,0xb, 0x34,0x7c,0x47,0x6c,0x22,0x2, 0x12,0xce,0xa, 0x4d,0xe5,0x39, +0xa, 0x5b,0x2d,0x45,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7d,0x3, 0x1b,0x4, 0xbd,0x40, +0x18,0x3, 0x2, 0x12,0xce,0xbd,0x50,0x8, 0x3, 0x2, 0x12,0xce,0xa, 0xd, 0x2d,0x3, +0xe5,0x39,0xa, 0x3b,0x9d,0x3, 0x7c,0x41,0xa, 0xd, 0x9d,0x30,0x7c,0x27,0x7e,0x37, +0xf, 0xda,0x7c,0xb2,0x7e,0x23,0xf, 0x53,0x7e,0x4, 0x9, 0xc8,0x12,0x5c,0x33,0x7e, +0x37,0x9, 0xc8,0x7d,0x3, 0x6d,0x11,0x7e,0x37,0x9, 0xca,0x7d,0x20,0x7a,0x1d,0x28, +0x7e,0x37,0x9, 0xcc,0x7d,0x3, 0x7e,0x37,0x9, 0xce,0x7d,0x20,0x7a,0x1d,0x2c,0x7e, +0x37,0x9, 0xd0,0x7d,0x3, 0x7e,0x37,0x9, 0xd2,0x7d,0x20,0x7a,0x1d,0x30,0x7e,0x37, +0x9, 0xd4,0x7d,0x3, 0x7e,0x37,0x9, 0xd6,0x7d,0x20,0x7a,0x1d,0x34,0xa, 0x2d,0xe5, +0x39,0xa, 0x3b,0x9d,0x32,0x7c,0xc7,0x2, 0x15,0x24,0xa, 0x4d,0xe5,0x3a,0xa, 0x5b, +0x9d,0x54,0xf5,0x38,0x2, 0x15,0xd, 0xbe,0xc0,0x0, 0x58,0x3, 0x2, 0x15,0xb, 0x7e, +0x73,0x10,0x2b,0xbc,0x7c,0x18,0x3, 0x2, 0x15,0xb, 0xe5,0x38,0xbe,0xb0,0x0, 0x58, +0x3, 0x2, 0x15,0xb, 0x7e,0x73,0x10,0x2c,0xbe,0x71,0x38,0x18,0x3, 0x2, 0x15,0xb, +0xe5,0x38,0x1a,0x1b,0x3e,0x14,0x1a,0x2c,0x7e,0x34,0x0, 0x30,0xad,0x32,0x2d,0x31, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x7e,0x53,0xf, 0x53,0xa, 0x25,0x9d,0x32,0x7a, +0x35,0x3c,0xbe,0x34,0x0, 0x0, 0x18,0x3, 0x2, 0x15,0xb, 0x7e,0x35,0x3e,0xbe,0x35, +0x3c,0x28,0x3, 0x2, 0x13,0xa6,0x7e,0x70,0x7, 0xac,0x7f,0x2e,0x34,0xd, 0x71,0x7e, +0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xe5,0x39,0xa, 0x2b,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x13,0xd0,0xe5,0x3a,0xa, 0x2b,0xe5,0x38, +0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x1, 0x18,0x3, 0x2, 0x15,0xb, +0x75,0x3b,0x0, 0x2, 0x14,0x60,0xbe,0xe1,0x3b,0x78,0x3, 0x2, 0x14,0x5e,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe, +0x34,0x0, 0x1, 0x8, 0x3, 0x2, 0x14,0x1e,0x75,0x3b,0xff,0x2, 0x14,0x6c,0xe5,0x3b, +0x1a,0x3b,0x3e,0x34,0x9, 0x73,0xd, 0x18,0xa, 0x27,0x1a,0x3c,0x9d,0x32,0x12,0x6d, +0xd0,0xbe,0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0xe5,0x3b,0x1a,0x3b,0x3e,0x34, +0x9, 0x73,0xd, 0x19,0xa, 0x27,0xe5,0x38,0x1a,0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe, +0x34,0x0, 0x2, 0x8, 0x3, 0x2, 0x14,0x5e,0x75,0x3b,0x0, 0x2, 0x14,0x6c,0x5, 0x3b, +0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x3b,0x8, 0x3, 0x2, 0x13,0xd6,0xe5,0x3b,0x60,0x3, +0x2, 0x14,0xc0,0x7e,0x35,0x3c,0x7d,0x23,0xe, 0x24,0x9d,0x32,0x7a,0x35,0x3c,0x7e, +0xf5,0x3c,0x7d,0x3f,0x1a,0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a, +0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34, +0x7e,0x1d,0x28,0x9f,0x17,0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30, +0xe5,0x3b,0xb4,0xff,0x2, 0x80,0x3, 0x2, 0x15,0xb, 0x7e,0xf5,0x3c,0x7d,0x3f,0x1a, +0x36,0x1a,0xe6,0x1a,0x1c,0x1a,0x2, 0x7f,0x17,0x12,0x48,0x24,0x7f,0x1, 0x7e,0x1d, +0x2c,0x9f,0x10,0x7a,0x1d,0x2c,0xe5,0x38,0x1a,0x1b,0x1a,0x2, 0x7f,0x17,0x12,0x48, +0x24,0x7f,0x1, 0x7e,0x1d,0x34,0x9f,0x10,0x7a,0x1d,0x34,0x7e,0x1d,0x28,0x9f,0x17, +0x7a,0x1d,0x28,0x7e,0x1d,0x30,0x9f,0x17,0x7a,0x1d,0x30,0x5, 0x38,0xa, 0x2d,0xe5, +0x3a,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0xe5,0x38,0x1a,0x3b,0xbd,0x32,0x18,0x3, 0x2, +0x13,0x37,0xb, 0xc0,0xa, 0x2d,0xe5,0x39,0xa, 0x3b,0x2d,0x32,0x1a,0x27,0x1a,0x3c, +0xbd,0x32,0x18,0x3, 0x2, 0x13,0x2a,0x74,0x6, 0x7e,0x1d,0x2c,0x2f,0x11,0x14,0x78, +0xfb,0x7a,0x1d,0x2c,0x7e,0xd, 0x28,0x7e,0x1d,0x2c,0x12,0x48,0x40,0x2e,0x34,0x0, +0x20,0x7e,0xd0,0x7, 0xac,0xdf,0x59,0x36,0xd, 0x6b,0x74,0x6, 0x7e,0x1d,0x34,0x2f, +0x11,0x14,0x78,0xfb,0x7a,0x1d,0x34,0x7e,0x7d,0x30,0x7e,0x1d,0x34,0x7f,0x7, 0x12, +0x48,0x40,0x2e,0x34,0x0, 0x20,0x59,0x36,0xd, 0x6d,0x7e,0xb3,0xf, 0x60,0x7f,0x17, +0x70,0x3, 0x2, 0x15,0x91,0x1e,0x34,0x1e,0x24,0x50,0x3, 0x4e,0x60,0x80,0x14,0x78, +0xf4,0x7a,0x1d,0x30,0xbe,0x18,0x0, 0x7f,0x38,0x3, 0x2, 0x15,0xa4,0x7e,0x18,0x0, +0x7f,0x7a,0x1d,0x30,0x7e,0x2d,0x30,0x7c,0xab,0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3, +0xd, 0x70,0x74,0x7, 0xac,0xbe,0x9, 0xa5,0xd, 0x71,0x7e,0x70,0x7, 0xac,0x7f,0x19, +0xa3,0xd, 0x71,0x74,0x7, 0xac,0xbf,0x9, 0x75,0xd, 0x71,0xbe,0x70,0xf, 0x38,0x3, +0x2, 0x15,0xdf,0x7e,0xa0,0xf, 0x7e,0x70,0x7, 0xac,0x7f,0x19,0xa3,0xd, 0x71,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x6b,0xbe,0x60,0x3, 0x40,0x6, 0x74,0x1, 0x7a,0xb3,0x11, +0x96,0xa5,0xbe,0x1, 0x58,0x7e,0xa3,0x10,0x2b,0xbc,0xa7,0x28,0xd, 0x7a,0x71,0xd, +0x74,0x30,0xac,0x7b,0x2e,0x37,0x16,0x9e,0x80,0x3c,0x7a,0x71,0xd, 0xbc,0xa7,0x78, +0x6, 0x7e,0x34,0x8, 0x9a,0x80,0x2f,0xa, 0x2a,0x7d,0x2, 0xb, 0x4, 0xa, 0x17,0xbd, +0x10,0x78,0x6, 0x7e,0x34,0x8, 0xca,0x80,0x1d,0x7d,0x2, 0xb, 0x5, 0xbd,0x10,0x78, +0x6, 0x7e,0x34,0x9, 0x2e,0x80,0xf, 0x2e,0x24,0x0, 0x3, 0xbd,0x12,0x68,0x3, 0x2, +0x19,0x6a,0x7e,0x34,0x9, 0x5e,0x7a,0x37,0x16,0x4f,0x2, 0x19,0x6a,0xa5,0xbe,0x0, +0x46,0x7e,0x64,0x0, 0xb, 0x7a,0x69,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0x4c,0x77,0x68,0x4, 0xa5,0xbf,0x1, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, +0x74,0x1, 0x7e,0x70,0x1, 0x80,0x36,0x74,0x27,0x7e,0x70,0x1, 0x80,0x13,0x7e,0xb3, +0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70,0x3, 0x80,0x21,0x74,0x27,0x7e,0x70, +0x3, 0x12,0x6d,0x9f,0x2, 0x19,0x6a,0xa5,0xbe,0x2, 0x23,0xa5,0xbf,0x4, 0x7, 0x74, +0x1, 0x7e,0x70,0x4, 0x80,0x7, 0xa5,0xbf,0x5, 0x9, 0xe4,0x6c,0x77,0x12,0x0, 0x5e, +0x2, 0x19,0x6a,0xbe,0x70,0x1, 0x50,0x3, 0x2, 0x19,0x6a,0x2, 0x19,0x6a,0xa5,0xbe, +0x3, 0x15,0xbe,0x70,0xd, 0x28,0x9, 0x74,0xd, 0x7a,0xb3,0x10,0x2b,0x2, 0x19,0x6a, +0x7a,0x73,0x10,0x2b,0x2, 0x19,0x6a,0xa5,0xbe,0x4, 0x15,0xbe,0x70,0x18,0x28,0x9, +0x74,0x18,0x7a,0xb3,0x10,0x2c,0x2, 0x19,0x6a,0x7a,0x73,0x10,0x2c,0x2, 0x19,0x6a, +0xa5,0xbe,0x5, 0x7, 0x7a,0x73,0x10,0x2d,0x2, 0x19,0x6a,0xa5,0xbe,0x7, 0x1e,0x7a, +0x73,0x10,0x4b,0x7c,0xb7,0x54,0x3f,0xa, 0x2b,0x3e,0x24,0x3e,0x24,0x7e,0x37,0x10, +0x54,0x5e,0x70,0x3, 0x4d,0x32,0x7a,0x37,0x10,0x54,0x2, 0x19,0x6a,0xa5,0xbe,0x8, +0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xac,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x16,0x2, 0x19,0x6a,0xa5,0xbe,0x9, 0x1c,0xbe,0x70,0xa, 0x50,0x3, 0x7e,0x70, +0xa, 0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xad,0x2, 0x19,0x6a,0x7a,0x73, +0x11,0x49,0x2, 0x19,0x6a,0xa5,0xbe,0xa, 0x10,0xa5,0xbf,0x0, 0x3, 0xe4,0x80,0x2, +0x74,0x1, 0x7a,0xb3,0x10,0x3b,0x2, 0x19,0x6a,0xa5,0xbe,0xb, 0x14,0x7e,0xb3,0x10, +0x3b,0x70,0x7, 0x7a,0x73,0xa, 0xae,0x2, 0x19,0x6a,0x7a,0x73,0x11,0x94,0x2, 0x19, +0x6a,0xa5,0xbe,0xc, 0x14,0x7e,0xb3,0x10,0x3b,0x70,0x7, 0x7a,0x73,0xd, 0xfe,0x2, +0x19,0x6a,0x7a,0x73,0x11,0x9d,0x2, 0x19,0x6a,0xa5,0xbe,0x4c,0x7, 0x7a,0x73,0xf, +0x46,0x2, 0x19,0x6a,0xa5,0xbe,0xfb,0x29,0x7a,0x71,0x8, 0x7e,0x37,0x10,0x50,0x5e, +0x70,0xdf,0x7a,0x37,0x10,0x50,0xe5,0x8, 0x54,0x1, 0xa, 0x3b,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x4e,0x37,0x10,0x50,0x7a,0x37,0x10,0x50,0x2, 0x19, +0x6a,0xa5,0xbe,0x4e,0x7, 0x7a,0x73,0x10,0x4a,0x2, 0x19,0x6a,0xa5,0xbe,0x4f,0x6, +0x12,0x0, 0x6, 0x2, 0x19,0x6a,0xbe,0x60,0x50,0x40,0x12,0xbe,0x60,0x51,0x38,0xd, +0xa, 0x26,0x2e,0x27,0x10,0x2f,0x9e,0x24,0x0, 0x50,0x2, 0x19,0x54,0xbe,0x60,0x52, +0x40,0x12,0xbe,0x60,0x55,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x31,0x9e,0x24,0x0, +0x52,0x2, 0x19,0x54,0xbe,0x60,0x56,0x40,0x12,0xbe,0x60,0x62,0x38,0xd, 0xa, 0x26, +0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x56,0x2, 0x19,0x54,0xbe,0x60,0x63,0x40,0x12, +0xbe,0x60,0x7a,0x38,0xd, 0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x63,0x2, +0x19,0x54,0xbe,0x60,0x7b,0x50,0x3, 0x2, 0x18,0xe8,0xbe,0x60,0x9f,0x28,0x3, 0x2, +0x18,0xe8,0x7e,0xb3,0x10,0x3b,0x70,0x48,0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24, +0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27,0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29, +0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f,0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17, +0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27,0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29, +0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, 0x2f,0x19,0x72,0xf, 0xdc,0x2, 0x19,0x6a, +0xa, 0x26,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x20,0xa, 0x26,0x2e,0x27, +0x10,0x35,0x9e,0x24,0x0, 0x7b,0x7e,0x29,0xf0,0x7c,0xbf,0x30,0xe0,0xa, 0xa, 0x7f, +0x2e,0x74,0x0, 0x18,0xe, 0x74,0x80,0x17,0x1e,0xf0,0x80,0x13,0xa, 0x26,0x2e,0x27, +0x10,0x33,0x9e,0x24,0x0, 0x93,0x7e,0x29,0x60,0xa, 0x76,0x2e,0x74,0x0, 0x18,0xa, +0x2f,0x19,0x72,0xf, 0x63,0x2, 0x19,0x6a,0xbe,0x60,0xa0,0x40,0x11,0xbe,0x60,0xac, +0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6c,0x9e,0x24,0x0, 0xa0,0x80,0x56,0xbe,0x60, +0xad,0x40,0x11,0xbe,0x60,0xb9,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x6e,0x9e,0x24, +0x0, 0xad,0x80,0x40,0xbe,0x60,0xba,0x40,0x11,0xbe,0x60,0xd1,0x38,0xc, 0xa, 0x26, +0x2e,0x27,0x10,0x70,0x9e,0x24,0x0, 0xba,0x80,0x2a,0xbe,0x60,0xd2,0x40,0x11,0xbe, +0x60,0xd5,0x38,0xc, 0xa, 0x26,0x2e,0x27,0x10,0x72,0x9e,0x24,0x0, 0xd2,0x80,0x14, +0xbe,0x60,0xd6,0x40,0x14,0xbe,0x60,0xed,0x38,0xf, 0xa, 0x26,0x2e,0x27,0x10,0x74, +0x9e,0x24,0x0, 0xd6,0x7a,0x29,0x70,0x80,0x11,0xa5,0xbe,0xf8,0x6, 0x7a,0x73,0x11, +0xe8,0x80,0x7, 0xa5,0xbe,0xfe,0x3, 0x7a,0x71,0xc, 0xda,0x3b,0x22,0xca,0x3b,0xe4, +0x7a,0xb3,0x13,0xde,0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x23,0x6c,0xee,0x7e,0xa0,0xff, +0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0xff,0xa, 0x3e,0x19,0xb3,0x13, +0xca,0x7e,0x34,0xff,0xff,0x74,0x2, 0xac,0xbe,0x59,0x35,0x13,0xb6,0xe4,0xa, 0x3e, +0x19,0xb3,0x13,0xd4,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xd2,0x7e,0xb3,0xf, 0x1b,0x60, +0x3, 0x2, 0x19,0xe5,0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0x2, 0x1b,0xfc,0x6c,0xee,0x7e, +0x34,0xff,0xff,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, +0x78,0xdd,0x2, 0x1b,0xfc,0x7e,0xb3,0xf, 0x1c,0x60,0x3, 0x2, 0x1a,0x38,0x6c,0xee, +0x2, 0x1a,0x2d,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, 0xac,0x5e, +0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0x7e, +0x50,0x2, 0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x19, +0xe5,0xe, 0x11,0x74,0x1, 0xa, 0x3e,0x19,0xb3,0x13,0xd4,0xb, 0xe0,0x7e,0x73,0xf, +0x1b,0xbc,0x7e,0x38,0xbe,0x2, 0x1b,0xfc,0x6c,0xee,0x2, 0x1a,0x9e,0x6c,0xff,0x7e, +0x70,0x2, 0xac,0x7f,0x2e,0x35,0x23,0x49,0x23,0x0, 0x28,0x74,0x7, 0xac,0xbe,0x49, +0x35,0xe, 0xf, 0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x7e,0x70,0x2, 0xac,0x7f,0x2e, +0x35,0x23,0x49,0x23,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x9d,0x32, +0x12,0x6d,0xd0,0x2d,0x36,0x7a,0x35,0x21,0x74,0x2, 0xac,0xbe,0x49,0x45,0x13,0xb6, +0xbe,0x45,0x21,0x38,0x3, 0x2, 0x1a,0x95,0xa, 0x4e,0x19,0xf4,0x13,0xca,0x7e,0x35, +0x21,0x59,0x35,0x13,0xb6,0xb, 0xf0,0xbe,0xf0,0xa, 0x78,0xa3,0xb, 0xe0,0x7e,0x73, +0xf, 0x1b,0xbc,0x7e,0x38,0x97,0x6c,0xee,0x2, 0x1b,0x52,0x74,0x1, 0x7a,0xb3,0x13, +0xde,0x6c,0xff,0x2, 0x1a,0xf1,0xbc,0xfe,0x78,0x3, 0x2, 0x1a,0xef,0xa, 0x3f,0x9, +0x63,0x13,0xca,0xa, 0x2e,0x9, 0x72,0x13,0xca,0xbc,0x76,0x68,0x3, 0x2, 0x1a,0xef, +0x74,0x2, 0xac,0xbf,0x49,0x25,0x13,0xb6,0x74,0x2, 0xac,0xbe,0x49,0x35,0x13,0xb6, +0xbd,0x32,0x50,0x3, 0x2, 0x1a,0xef,0xe4,0x7a,0xb3,0x13,0xde,0x2, 0x1a,0xf9,0xb, +0xf0,0x7e,0x73,0xf, 0x1b,0xbc,0x7f,0x38,0xbd,0x7e,0xb3,0x13,0xde,0xb4,0x1, 0x2, +0x80,0x3, 0x2, 0x1b,0x50,0x74,0x1, 0xa, 0x3e,0x9, 0xa3,0x13,0xca,0xa, 0x4a,0x19, +0xb4,0x13,0xd4,0x7e,0x70,0x7, 0xac,0x7e,0x19,0xa3,0xe, 0x11,0x74,0x7, 0xac,0xbe, +0x49,0x35,0xe, 0xd, 0xa, 0x2e,0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e, +0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xf, 0xa, 0x2e, +0x9, 0x42,0x13,0xca,0x7e,0x50,0x2, 0xac,0x45,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28, +0xb, 0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x28,0x3, 0x2, 0x1a,0xab,0x6c,0xee,0x2, +0x1b,0xc1,0x74,0x7, 0xac,0xbe,0x9, 0xb5,0xe, 0x11,0xb4,0xff,0x2, 0x80,0x3, 0x2, +0x1b,0xbf,0x6c,0xff,0xa, 0x3f,0x9, 0xb3,0x13,0xd4,0x60,0x3, 0x2, 0x1b,0xb8,0x74, +0x1, 0x19,0xb3,0x13,0xd4,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, 0xd, 0x7e,0x50,0x2, +0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x74,0x7, 0xac,0xbe,0x49,0x35,0xe, +0xf, 0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x25,0x23,0x59,0x32,0x0, 0x28,0x74,0x7, 0xac, +0xbe,0x19,0xf5,0xe, 0x11,0x2, 0x1b,0xbf,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xb5,0xb, +0xe0,0x7e,0x73,0xf, 0x1b,0xbc,0x7e,0x38,0x99,0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13, +0xd4,0xbe,0xb0,0x1, 0x78,0x3, 0x2, 0x1b,0xf5,0x7e,0x34,0xff,0xff,0x7e,0x50,0x2, +0xac,0x5e,0x2e,0x25,0x23,0x59,0x32,0x0, 0x14,0x7e,0x50,0x2, 0xac,0x5e,0x2e,0x25, +0x23,0x59,0x32,0x0, 0x28,0xb, 0xe0,0xbe,0xe0,0xa, 0x78,0xcf,0x7e,0xf3,0xf, 0x1b, +0x6c,0xee,0xa, 0x3e,0x9, 0xb3,0x13,0xd4,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c,0x4e, +0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x1c, +0x27,0x74,0x3, 0x19,0xb3,0x0, 0xa, 0xa, 0x3e,0x2e,0x35,0x23,0x9, 0xa3,0x0, 0xa, +0xbe,0xa0,0x3, 0x68,0x3, 0x2, 0x1c,0x3f,0xe4,0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0x4c, +0xaa,0x68,0x3, 0x2, 0x1c,0x7c,0x74,0x2, 0x7a,0x39,0xb0,0x2, 0x1c,0x7c,0xa, 0x3e, +0x2e,0x35,0x23,0x9, 0xb3,0x0, 0xa, 0xbe,0xb0,0x2, 0x78,0x3, 0x2, 0x1c,0x64,0x60, +0x3, 0x2, 0x1c,0x77,0x74,0x1, 0x7a,0x39,0xb0,0x7c,0xaf,0xb, 0xf0,0x74,0x7, 0xa4, +0x19,0xe5,0xe, 0x11,0x2, 0x1c,0x7c,0x74,0x3, 0x7a,0x39,0xb0,0xa, 0x2e,0x2e,0x25, +0x23,0x7e,0x29,0x70,0x19,0x72,0x0, 0xa, 0xb, 0xe0,0xbe,0xe0,0xa, 0x50,0x3, 0x2, +0x1c,0x2, 0xda,0x3b,0x22,0xca,0x3b,0x75,0x24,0x0, 0x75,0x26,0x0, 0x75,0x27,0x0, +0x75,0x28,0x0, 0x7e,0x34,0xe, 0xdf,0x7a,0x35,0x2a,0x7e,0xa3,0xf, 0x24,0x4c,0xaa, +0x78,0xf, 0x7e,0xb3,0xf, 0x20,0x70,0x9, 0x7e,0xb3,0xf, 0x21,0x70,0x3, 0x2, 0x1f, +0x54,0x4c,0xaa,0x78,0x11,0x7e,0xb3,0xf, 0x20,0x60,0x16,0x80,0x9, 0x7e,0x73,0x0, +0xff,0xbe,0x70,0xf, 0x38,0x6, 0x7e,0xb3,0x0, 0x8b,0x60,0xf1,0xe4,0x7a,0xb3,0x0, +0x8b,0x20,0x0, 0x6, 0x7e,0x74,0x15,0xca,0x80,0x4, 0x7e,0x74,0x16,0xc, 0x7d,0x37, +0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0,0x74,0xaa,0x7a,0x79,0xb0,0x19,0xb7, +0x0, 0x1, 0x7e,0x73,0xf, 0x1d,0x19,0x77,0x0, 0x3, 0x75,0x25,0x0, 0x6c,0xdd,0x2, +0x1e,0xe1,0x7e,0x70,0x7, 0xac,0x7d,0x9, 0xa3,0xe, 0x9d,0x7a,0xa1,0x29,0x7c,0xba, +0x54,0xf, 0xa, 0x2b,0x2e,0x25,0x2a,0x7e,0x29,0xc0,0x7c,0xba,0x54,0xf0,0xbe,0xb0, +0x0, 0x28,0x13,0xb4,0xb0,0x2, 0x80,0x3, 0x2, 0x1e,0xdf,0x53,0x29,0xf, 0xbe,0xc0, +0x1, 0x68,0x3, 0x2, 0x1e,0xdf,0xbe,0xc0,0x3, 0x78,0x3, 0x2, 0x1e,0xdf,0x7e,0xa1, +0x25,0x74,0x6, 0xa4,0xf5,0x21,0x9, 0xb3,0xe, 0x9e,0xf5,0x27,0x74,0x7, 0xac,0xbd, +0x9, 0xb5,0xe, 0x9f,0xc4,0x54,0xf0,0xf5,0x28,0x7e,0x73,0xf, 0x46,0xbe,0x71,0x29, +0x28,0x68,0x7e,0xb3,0xf, 0x22,0x70,0x2a,0x7e,0x8, 0x0, 0x27,0xe5,0x29,0xa, 0x3b, +0x2e,0x34,0x0, 0x77,0x74,0x1, 0x7e,0x50,0xf, 0x12,0x5f,0x76,0x7e,0x8, 0x0, 0x28, +0xe5,0x29,0xa, 0x3b,0x2e,0x34,0x0, 0x81,0x74,0x10,0x7e,0x50,0x20,0x12,0x5f,0x76, +0x80,0x14,0xe5,0x29,0xa, 0x3b,0x9, 0xb3,0x0, 0x77,0xf5,0x27,0xe5,0x29,0xa, 0x3b, +0x9, 0xb3,0x0, 0x81,0xf5,0x28,0xe5,0x29,0xa, 0x3b,0x7d,0x23,0x2e,0x25,0x2a,0x7e, +0x29,0xb0,0xb4,0x1, 0x15,0xe4,0x19,0xb3,0x0, 0x77,0x6c,0xaa,0xe5,0x29,0xa, 0x3b, +0x19,0xa3,0x0, 0x81,0x75,0x27,0x0, 0x75,0x28,0x0, 0x7e,0xb3,0xf, 0x5f,0xb4,0xff, +0x15,0x74,0x7, 0xac,0xbd,0x9, 0xb5,0xe, 0x9d,0xbe,0xb0,0xff,0x68,0x5, 0x75,0x27, +0x1, 0x80,0x3, 0x75,0x27,0x0, 0x7e,0x90,0x7, 0xac,0x9d,0x49,0x54,0xe, 0x99,0x7a, +0x55,0x2c,0x49,0x54,0xe, 0x9b,0x7a,0x55,0x2e,0xbe,0xc0,0x1, 0x78,0x2e,0x75,0x30, +0x0, 0x7e,0x71,0x30,0x74,0x7, 0xac,0x7b,0x9, 0xb3,0x0, 0x90,0x54,0xf, 0xbe,0xb1, +0x29,0x78,0x10,0x49,0x23,0x0, 0x8c,0x7a,0x25,0x2c,0x49,0x53,0x0, 0x8e,0x7a,0x55, +0x2e,0x80,0x9, 0x5, 0x30,0xe5,0x30,0xbe,0xb0,0xa, 0x40,0xd5,0x7e,0x25,0x2c,0x7a, +0x25,0x22,0xa, 0x54,0x5e,0x54,0x0, 0xf, 0x7c,0xab,0xe5,0x21,0xa, 0x3b,0x7d,0x13, +0x2d,0x17,0x19,0xa1,0x0, 0x5, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x6, 0x7e,0x25, +0x2e,0x7a,0x25,0x22,0xa, 0x14,0x5e,0x14,0x0, 0xf, 0x7d,0x53,0x2d,0x57,0x19,0x35, +0x0, 0x7, 0x7d,0x53,0x2d,0x57,0x19,0x55,0x0, 0x8, 0xe5,0x27,0x7d,0x23,0x2d,0x27, +0x19,0xb2,0x0, 0x9, 0xe5,0x28,0x7d,0x23,0x2d,0x27,0x19,0xb2,0x0, 0xa, 0x9, 0xa4, +0xe, 0x9d,0x7c,0xba,0xc4,0x54,0xf0,0x7c,0x3b,0x7d,0x23,0x2d,0x27,0x2e,0x24,0x0, +0x7, 0x7e,0x29,0xb0,0x2c,0xb3,0x7a,0x29,0xb0,0xbe,0xa0,0xff,0x68,0x21,0xbe,0xc0, +0x1, 0x68,0x2, 0x5, 0x24,0x5, 0x26,0x7c,0xbc,0x3, 0x3, 0x54,0xc0,0x7d,0x13,0x2d, +0x17,0x2e,0x14,0x0, 0x5, 0x7e,0x19,0x50,0x2c,0x5b,0x7a,0x19,0x50,0x80,0xe, 0x2d, +0x37,0x2e,0x34,0x0, 0x5, 0x7e,0x39,0xb0,0x24,0xc0,0x7a,0x39,0xb0,0x5, 0x25,0xb, +0xd0,0x7e,0x73,0xf, 0x46,0xbc,0x7d,0x28,0x3, 0x2, 0x1d,0x12,0xe5,0x24,0x19,0xb7, +0x0, 0x4, 0xe5,0x26,0xbe,0xb0,0x0, 0x28,0x2d,0x74,0x42,0x19,0xb7,0x0, 0x2, 0xe4, +0x19,0xb7,0x0, 0x41,0x6c,0xdd,0xa, 0x3d,0x2d,0x37,0x7e,0x39,0x60,0x7d,0x27,0x2e, +0x24,0x0, 0x41,0x7e,0x29,0x70,0x6c,0x76,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x41, +0x78,0xe4,0xb2,0x0, 0x80,0xe, 0x7e,0xb3,0xf, 0x21,0xb4,0x1, 0xc, 0x7e,0xb3,0x10, +0xd1,0xb4,0x24,0x5, 0x74,0x1, 0x12,0x6e,0x92,0x7e,0xb3,0xf, 0x20,0x60,0x6, 0x7e, +0x35,0x2a,0x12,0x68,0xb, 0xe4,0x7a,0xb3,0xf, 0x24,0x7a,0xb3,0xf, 0x20,0x7a,0xb3, +0xf, 0x21,0x80,0x4, 0xe4,0x12,0x6e,0x92,0x7e,0x24,0xe, 0x99,0x7e,0x34,0x0, 0x8c, +0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0xe5,0x26,0x70,0xd, 0x7e,0x34,0x0, 0x8c,0x7e, +0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0xda,0x3b,0x22,0xca,0x79,0x75,0x26,0x17, +0x7e,0xb3,0xd, 0xf7,0xf5,0x21,0x70,0x3, 0x2, 0x22,0x1d,0x7e,0x34,0x13,0xb6,0x7e, +0x24,0x1, 0x2b,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x14,0xe1,0x7e,0x24,0x0, 0x2, 0xe4, +0x12,0x6d,0xe0,0x6c,0xaa,0x2, 0x20,0x32,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33,0xd, +0x18,0x9, 0x23,0xd, 0x19,0x1a,0x3, 0x1b,0x5, 0x80,0x69,0xbe,0x10,0x0, 0x48,0x62, +0xbe,0x10,0xd, 0x58,0x5d,0x7c,0x1, 0xe, 0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25, +0x7c,0xb1,0x54,0x7, 0x7e,0x74,0x0, 0x1, 0x60,0x5, 0x3e,0x74,0x14,0x78,0xfb,0x7c, +0xef,0xa, 0x40,0x2e,0x44,0x14,0xe1,0x7e,0x49,0xb0,0x4c,0xbe,0x7a,0x49,0xb0,0x1a, +0x32,0x1b,0x35,0x7c,0xf7,0x80,0x1f,0xbe,0xf0,0x0, 0x48,0x18,0xe5,0x26,0xbc,0xbf, +0x8, 0x12,0x74,0x1, 0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0x4f,0x2d,0x43, +0x19,0xb4,0x13,0xb6,0xb, 0xf0,0x1a,0x22,0x2e,0x24,0x0, 0x3, 0x1a,0x3f,0xbd,0x32, +0x48,0xd5,0xb, 0x10,0x1a,0x23,0x2e,0x24,0x0, 0x3, 0x1a,0x31,0xbd,0x32,0x48,0x8b, +0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x1f,0xa8,0x6c,0x11,0x7c,0x1, 0xe, +0x0, 0xe, 0x0, 0xe, 0x0, 0x7a,0x1, 0x25,0x7c,0xb1,0x54,0x7, 0x7e,0x44,0x0, 0x1, +0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa, 0x30,0x9, 0xb3,0x14,0xe1,0x5c, +0xbe,0x78,0x3, 0x2, 0x20,0xf9,0x6d,0x33,0x7a,0x35,0x22,0x75,0x24,0x0, 0x1a,0x21, +0x7e,0x34,0x0, 0x30,0xad,0x32,0x7d,0x43,0x2e,0x47,0xf, 0xda,0x6c,0x0, 0x80,0x26, +0x1a,0xe1,0x7e,0xf4,0x0, 0x17,0xad,0xfe,0xa, 0x30,0x2d,0x3f,0x9, 0xb3,0x13,0xb6, +0x70,0x12,0x7e,0x70,0x2, 0xac,0x70,0x2d,0x34,0xb, 0x38,0x30,0x2e,0x35,0x22,0x7a, +0x35,0x22,0x5, 0x24,0xb, 0x0, 0xe5,0x26,0xbc,0xb0,0x38,0xd4,0xe5,0x24,0x60,0x49, +0xe5,0x24,0x1a,0x2b,0x7e,0x35,0x22,0x12,0x47,0xf2,0x7a,0x35,0x22,0x6c,0xff,0x80, +0x32,0x1a,0x21,0x7e,0x34,0x0, 0x17,0xad,0x32,0x1a,0xff,0x7d,0xe3,0x2d,0xef,0x9, +0xbe,0x13,0xb6,0xb4,0x1, 0x1b,0x1a,0x21,0x7e,0x34,0x0, 0x18,0xad,0x32,0x7d,0x23, +0x2d,0x2f,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x9e,0x35,0x22,0x1b,0x28, +0x30,0xb, 0xf0,0xe5,0x26,0xbc,0xbf,0x18,0xc8,0xb, 0x10,0xa5,0xb9,0xd, 0x2, 0x80, +0x3, 0x2, 0x20,0x3d,0x6c,0xaa,0x2, 0x22,0x14,0x7e,0x10,0x2, 0xac,0x1a,0x9, 0x30, +0xd, 0x18,0x9, 0x20,0xd, 0x19,0x7c,0xba,0xc4,0x23,0x54,0x1f,0xf5,0x25,0x7c,0xba, +0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0xe9,0xa5, +0xbb,0x0, 0x2c,0x1a,0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e, +0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x20,0x49,0x33,0x0, 0x30,0xbd,0x32,0x18,0x3, +0x2, 0x21,0xd9,0x1a,0x33,0xb, 0x34,0x7c,0xb7,0x19,0xb0,0xd, 0x18,0x80,0x7a,0xa5, +0xbb,0xc, 0x2c,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x22,0x2d,0x23,0x3e, +0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28,0x30,0x49,0x2, 0xff,0xd0,0xbd,0x3, 0x8, 0x59, +0x1a,0x33,0x1b,0x34,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x70,0xd, 0x18,0x80,0x4a,0x1a, +0xe3,0x7e,0xf4,0x0, 0x18,0xad,0xfe,0x1a,0x32,0x2d,0x3f,0x3e,0x34,0x2e,0x37,0xf, +0xda,0x49,0x43,0x0, 0x30,0x49,0x3, 0xff,0xd0,0xbd,0x4, 0x8, 0x16,0xb, 0x38,0x20, +0xbd,0x2, 0x8, 0x25,0x1a,0x23,0x1b,0x24,0x7e,0x10,0x2, 0xac,0x1a,0x19,0x50,0xd, +0x18,0x80,0x16,0xb, 0x38,0x0, 0xbd,0x40,0x8, 0xf, 0x1a,0x33,0xb, 0x34,0x7c,0x37, +0x7e,0x10,0x2, 0xac,0x1a,0x19,0x30,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7a,0x9, 0x33, +0xd, 0x18,0x1a,0x23,0x7e,0x34,0x0, 0x18,0xad,0x32,0x1a,0x2, 0x2d,0x3, 0x3e,0x4, +0x2e,0x7, 0xf, 0xda,0xb, 0x8, 0x0, 0xbe,0x4, 0x0, 0x3c,0x58,0x15,0x7c,0x7e,0x6e, +0x70,0xff,0xe5,0x25,0xa, 0x4b,0x2e,0x44,0xd, 0x68,0x7e,0x49,0xb0,0x5c,0xb7,0x7a, +0x49,0xb0,0xb, 0xa0,0xe5,0x21,0xbc,0xba,0x28,0x3, 0x2, 0x21,0x9, 0xda,0x79,0x22, +0xca,0xd8,0xca,0x79,0x6c,0xaa,0x7e,0x34,0x11,0x9e,0x7e,0x44,0x11,0x4a,0xe4,0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfe,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0xd, +0x17,0xbe,0xb0,0x0, 0x28,0x4f,0x7e,0x53,0xd, 0xf8,0xbe,0x50,0x0, 0x28,0x46,0x6c, +0xff,0x80,0x3c,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x40,0x9, 0xe1,0xd, 0x41, +0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x13,0xb, 0x18,0x0, 0x6d,0x11,0x9e,0x17,0xf, 0x4c, +0xbd,0x1, 0x58,0x19,0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x13,0x49,0x1, 0x0, 0x30,0x6d, +0x11,0x9e,0x17,0xf, 0x4a,0xbd,0x1, 0x58,0x4, 0x5, 0x6b,0x80,0xb, 0xb, 0xf0,0xbc, +0x5f,0x38,0xc0,0x80,0x3, 0x75,0x6b,0x0, 0xe5,0x6b,0xbe,0xb0,0x3, 0x40,0x17,0x7e, +0xb3,0xe, 0xa, 0x44,0x1, 0x7a,0xb3,0xe, 0xa, 0x75,0x6b,0x0, 0x7e,0xb3,0x16,0xbc, +0x44,0x1, 0x7a,0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xfd,0x7a,0xb3,0xe, 0xa, +0x7e,0xb3,0xd, 0x16,0x70,0x59,0x7e,0x53,0xd, 0xf7,0xbe,0x50,0x0, 0x28,0x50,0x6c, +0xff,0x80,0x48,0x7e,0x30,0x2, 0xac,0x3f,0x9, 0xd1,0xd, 0x18,0x9, 0xe1,0xd, 0x19, +0x7e,0x30,0x2, 0xac,0x3d,0x2d,0x14,0x49,0x11,0x0, 0x30,0x6d,0x0, 0x9e,0x7, 0xd, +0xff,0xbd,0x10,0x48,0xe, 0x7e,0x30,0x2, 0xac,0x3e,0x2d,0x14,0xb, 0x18,0x10,0xbd, +0x10,0x58,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x2, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16, +0xbc,0x44,0x2, 0x7a,0xb3,0x16,0xbc,0x80,0x6, 0xb, 0xf0,0xbc,0x5f,0x38,0xb4,0x7e, +0xb3,0xe, 0x9, 0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x23,0xc3,0x7e,0xb3,0xd, 0x16,0x70, +0x6d,0x6c,0xff,0x80,0x61,0x7e,0x50,0x2, 0xac,0x5f,0x7d,0x12,0x2d,0x14,0xb, 0x18, +0x10,0xbe,0x17,0xd, 0xff,0x8, 0x4d,0x2d,0x23,0xb, 0x28,0x20,0xbe,0x27,0xd, 0xff, +0x58,0x42,0xbe,0xf1,0x6c,0x68,0x6, 0x7a,0xf1,0x6c,0x75,0x6d,0x0, 0xbe,0xf1,0x6c, +0x78,0x2, 0x5, 0x6d,0xe5,0x6d,0xbe,0xb0,0x10,0x28,0x33,0x75,0x6d,0x10,0xe5,0x51, +0x70,0x16,0x7e,0xb3,0xe, 0xa, 0x44,0x4, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x4, 0x7a,0xb3,0x16,0xbc,0x80,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3, +0xe, 0xa, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc,0xbf,0x38,0x97,0x6c,0xaa, +0x6c,0xff,0x80,0x17,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x34,0xb, 0x38,0x30,0xbe,0x37, +0xd, 0xff,0x8, 0x5, 0x7e,0xa0,0x1, 0x80,0xa, 0xb, 0xf0,0x7e,0xb3,0x10,0x2c,0xbc, +0xbf,0x38,0xe1,0x4c,0xaa,0x78,0x1a,0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, +0xa, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0xb3,0x16,0xbc,0x54,0xfb,0x7a,0xb3,0x16, +0xbc,0x7e,0xb3,0xe, 0xa, 0x54,0xf7,0x7a,0xb3,0xe, 0xa, 0x7e,0x73,0xd, 0xfa,0xa, +0x27,0x7e,0x73,0xd, 0xf9,0xa, 0x37,0x2d,0x32,0xbe,0x37,0xe, 0x3, 0x28,0x14,0x7e, +0xb3,0xe, 0xa, 0x44,0x8, 0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc,0x44,0x8, 0x7a, +0xb3,0x16,0xbc,0x7e,0xb3,0xe, 0xa, 0x44,0x10,0x7a,0xb3,0xe, 0xa, 0x6c,0xff,0x80, +0x49,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e,0x70, +0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30, +0x49,0x22,0x10,0x3, 0x9d,0x32,0x7a,0x35,0x21,0x12,0x6d,0xd0,0xbe,0x37,0xe, 0x1, +0x28,0x16,0x7e,0xb3,0xe, 0xa, 0x54,0xef,0x7a,0xb3,0xe, 0xa, 0x7e,0xb3,0x16,0xbc, +0x44,0x10,0x7a,0xb3,0x16,0xbc,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f, +0x38,0xaf,0x7e,0x34,0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x12,0x6d,0xe0,0x6c,0xff, +0x80,0x25,0x7e,0x50,0x2, 0xac,0x5f,0x9, 0xd2,0xd, 0x18,0x9, 0xe2,0xd, 0x19,0x7e, +0x70,0x18,0xac,0x7d,0xa, 0x1e,0x2d,0x31,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x30,0x59,0x32,0x10,0x3, 0xb, 0xf0,0x7e,0x73,0xd, 0xf7,0xbc,0x7f,0x38,0xd3,0xda, +0x79,0xda,0xd8,0x22,0xca,0x3b,0x6d,0x33,0x7a,0x35,0x21,0x75,0x25,0x0, 0x75,0x26, +0x0, 0x7e,0x23,0xd, 0xf7,0x7a,0x21,0x23,0x7e,0x37,0xf, 0xda,0x7a,0x37,0x13,0xb6, +0x7e,0x30,0x2, 0xac,0x23,0x7e,0x24,0xd, 0x18,0x7e,0x34,0x13,0xb8,0x12,0x6d,0x3c, +0xe5,0x23,0xbe,0xb0,0xa, 0x38,0x3, 0x2, 0x26,0xb9,0x75,0x24,0x0, 0x6c,0xff,0x2, +0x25,0xcd,0x7e,0x34,0x3, 0xff,0x7a,0x35,0x27,0x75,0x26,0xff,0x6c,0xee,0x80,0x7e, +0x7e,0x70,0x2, 0xac,0x7e,0x9, 0xb3,0x13,0xb8,0xbe,0xb0,0xff,0x68,0x6e,0x7c,0xbe, +0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7a,0xa1,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x24,0x0, +0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xb5,0xf5,0x2c,0xa, 0x2a,0x9, 0xb2, +0xd, 0x68,0x55,0x2c,0x68,0x46,0x9, 0x73,0x13,0xb9,0xa, 0x27,0x74,0x2, 0xac,0xbf, +0x9, 0x75,0x15,0xa3,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xd0,0x7d,0x63,0x74,0x2, 0xac, +0xbe,0x9, 0x75,0x13,0xb8,0xa, 0x27,0x74,0x2, 0xac,0xbf,0x9, 0x75,0x15,0xa2,0xa, +0x37,0x9d,0x32,0x12,0x6d,0xd0,0x2d,0x36,0x7a,0x35,0x29,0x7e,0x35,0x27,0xbe,0x35, +0x29,0x28,0x9, 0x7e,0x35,0x29,0x7a,0x35,0x27,0x7a,0xe1,0x26,0xb, 0xe0,0xe5,0x23, +0xbc,0xbe,0x28,0x3, 0x2, 0x25,0x0, 0xe5,0x26,0xbe,0xb0,0xff,0x68,0x3d,0x7e,0x71, +0x26,0x74,0x2, 0xac,0x7b,0x9, 0x33,0x13,0xb8,0x7e,0x50,0x18,0xac,0x53,0x9, 0xa3, +0x13,0xb9,0xa, 0xa, 0x2d,0x20,0x3e,0x24,0x2e,0x27,0x13,0xb6,0xb, 0x28,0x20,0xbe, +0x24,0x0, 0x3c,0x48,0x16,0xe5,0x24,0x1a,0x2b,0x3e,0x24,0x19,0x32,0x13,0xe0,0x19, +0xa2,0x13,0xe1,0x74,0xff,0x19,0xb3,0x13,0xb8,0x5, 0x24,0xb, 0xf0,0xe5,0x11,0xbc, +0xbf,0x28,0x3, 0x2, 0x24,0xf2,0x7e,0xf1,0x24,0x2, 0x26,0x9f,0x6d,0x33,0x7a,0x35, +0x21,0x7e,0xa0,0xff,0x6c,0xee,0x2, 0x26,0x71,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c, +0x7b,0x7a,0x71,0x2b,0x7c,0xbe,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44, +0x14,0x78,0xfb,0x7c,0xb9,0xf5,0x2c,0xa, 0x37,0x9, 0xb3,0xd, 0x68,0x55,0x2c,0x68, +0x5e,0x7e,0x90,0x2, 0xac,0x9e,0x9, 0x44,0x13,0xb8,0xbe,0x40,0xff,0x68,0x50,0x7e, +0x50,0x18,0xac,0x45,0x9, 0xb4,0x13,0xb9,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x2e,0x27, +0x13,0xb6,0xb, 0x28,0x30,0xbe,0x34,0x0, 0x0, 0x58,0x5, 0x6d,0x33,0x1b,0x28,0x30, +0x7e,0x50,0x2, 0xac,0x5e,0x9, 0x62,0x13,0xb8,0x7e,0x30,0x18,0xac,0x36,0x9, 0x72, +0x13,0xb9,0xa, 0x7, 0x2d,0x10,0x3e,0x14,0x2e,0x17,0x13,0xb6,0xb, 0x18,0x40,0xbe, +0x45,0x21,0x8, 0xb, 0x7a,0x61,0x25,0x7a,0x71,0x26,0x7a,0x45,0x21,0x7c,0xae,0xb, +0xe0,0xe5,0x23,0xbc,0xbe,0x28,0x3, 0x2, 0x25,0xe9,0xbe,0xa0,0xff,0x68,0x1e,0x7e, +0x71,0x25,0x7e,0x90,0x2, 0xac,0x9f,0x19,0x74,0x13,0xe0,0xe5,0x26,0x19,0xb4,0x13, +0xe1,0x7e,0x70,0xff,0x7e,0x50,0x2, 0xac,0x5a,0x19,0x72,0x13,0xb8,0xb, 0xf0,0xbe, +0xf0,0xa, 0x50,0x3, 0x2, 0x25,0xdc,0x7e,0x24,0x13,0xe0,0x7e,0x34,0x13,0xb8,0x7e, +0x14,0x0, 0x28,0x12,0x6d,0x3c,0x75,0x23,0xa, 0x7e,0x34,0x15,0xa2,0x7e,0x24,0x0, +0x14,0x74,0xff,0x12,0x6d,0xe0,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0x55,0x7e,0x31,0x23, +0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x3c,0x7e, +0x31,0x23,0x74,0x2, 0xac,0x3b,0x7e,0x24,0x13,0xb8,0x7e,0x34,0x15,0xa2,0x12,0x6d, +0x3c,0x6c,0xff,0x80,0x27,0x7c,0xbf,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e, +0x34,0x14,0x78,0xfb,0x7c,0x67,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0xa, 0x2b,0x2e,0x24, +0xd, 0x68,0x7e,0x29,0x70,0x4c,0x76,0x7a,0x29,0x70,0xb, 0xf0,0xe5,0x23,0xbc,0xbf, +0x38,0xd3,0x85,0x23,0x11,0xe5,0x23,0x7a,0xb3,0xd, 0xf7,0xda,0x3b,0x22,0x7c,0x7b, +0xbe,0x70,0x10,0x40,0x12,0xbe,0x70,0x4b,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x16,0x4f, +0x9e,0x34,0x0, 0x10,0x2, 0x29,0x69,0xa5,0xbf,0x0, 0x3, 0xe5,0xb, 0x22,0xa5,0xbf, +0x1, 0x3, 0xe5,0xd, 0x22,0xa5,0xbf,0x2, 0x5, 0x7e,0xb3,0xf, 0x28,0x22,0xbe,0x70, +0x3, 0x40,0x12,0xbe,0x70,0x5, 0x38,0xd, 0xa, 0x37,0x2e,0x34,0x10,0x2b,0x9e,0x34, +0x0, 0x3, 0x2, 0x29,0x69,0xa5,0xbf,0x6, 0x3, 0x74,0x1, 0x22,0xa5,0xbf,0x7, 0x5, +0x7e,0xb3,0x10,0x4b,0x22,0xa5,0xbf,0x8, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, 0x7e, +0xb3,0xa, 0xac,0x22,0x7e,0xb3,0x11,0x16,0x22,0xa5,0xbf,0x9, 0x10,0x7e,0xb3,0x10, +0x3b,0x70,0x5, 0x7e,0xb3,0xa, 0xad,0x22,0x7e,0xb3,0x11,0x49,0x22,0xa5,0xbf,0xa, +0x5, 0x7e,0xb3,0x10,0x3b,0x22,0xa5,0xbf,0xb, 0x10,0x7e,0xb3,0x10,0x3b,0x70,0x5, +0x7e,0xb3,0xa, 0xae,0x22,0x7e,0xb3,0x11,0x94,0x22,0xa5,0xbf,0xc, 0x10,0x7e,0xb3, +0x10,0x3b,0x70,0x5, 0x7e,0xb3,0xd, 0xfe,0x22,0x7e,0xb3,0x11,0x9d,0x22,0xa5,0xbf, +0x4c,0x5, 0x7e,0xb3,0xf, 0x46,0x22,0xa5,0xbf,0xfb,0x3, 0xe5,0x8, 0x22,0xa5,0xbf, +0x4e,0x5, 0x7e,0xb3,0x10,0x4a,0x22,0xbe,0x70,0x50,0x40,0x12,0xbe,0x70,0x51,0x38, +0xd, 0xa, 0x37,0x2e,0x37,0x10,0x2f,0x9e,0x34,0x0, 0x50,0x2, 0x29,0x69,0xbe,0x70, +0x52,0x40,0x12,0xbe,0x70,0x55,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x31,0x9e,0x34, +0x0, 0x52,0x2, 0x29,0x69,0xbe,0x70,0x56,0x40,0x12,0xbe,0x70,0x62,0x38,0xd, 0xa, +0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x56,0x2, 0x29,0x69,0xbe,0x70,0x63,0x40, +0x12,0xbe,0x70,0x7a,0x38,0xd, 0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x63, +0x2, 0x29,0x69,0xbe,0x70,0x7b,0x50,0x3, 0x2, 0x28,0xfd,0xbe,0x70,0x9f,0x28,0x3, +0x2, 0x28,0xfd,0x7e,0xb3,0x10,0x3b,0x70,0x4a,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe, +0x24,0x0, 0x18,0x58,0x22,0xa, 0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e, +0x39,0xa0,0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c, +0xab,0x80,0x19,0x1e,0xa0,0x80,0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, +0x93,0x7e,0x39,0x70,0xa, 0x57,0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3, +0xf, 0xdc,0x22,0xa, 0x27,0x9e,0x24,0x0, 0x7b,0xbe,0x24,0x0, 0x18,0x58,0x22,0xa, +0x37,0x2e,0x37,0x10,0x35,0x9e,0x34,0x0, 0x7b,0x7e,0x39,0xa0,0x7c,0xba,0x30,0xe0, +0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80,0x19,0x1e,0xa0,0x80, +0x15,0xa, 0x37,0x2e,0x37,0x10,0x33,0x9e,0x34,0x0, 0x93,0x7e,0x39,0x70,0xa, 0x57, +0x2e,0x54,0x0, 0x18,0x7c,0xab,0xa, 0x3a,0x9, 0xb3,0xf, 0x63,0x22,0xbe,0x70,0xa0, +0x40,0x11,0xbe,0x70,0xac,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x6c,0x9e,0x34,0x0, +0xa0,0x80,0x56,0xbe,0x70,0xad,0x40,0x11,0xbe,0x70,0xb9,0x38,0xc, 0xa, 0x37,0x2e, +0x37,0x10,0x6e,0x9e,0x34,0x0, 0xad,0x80,0x40,0xbe,0x70,0xba,0x40,0x11,0xbe,0x70, +0xd1,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x70,0x9e,0x34,0x0, 0xba,0x80,0x2a,0xbe, +0x70,0xd2,0x40,0x11,0xbe,0x70,0xd5,0x38,0xc, 0xa, 0x37,0x2e,0x37,0x10,0x72,0x9e, +0x34,0x0, 0xd2,0x80,0x14,0xbe,0x70,0xd6,0x40,0x13,0xbe,0x70,0xed,0x38,0xe, 0xa, +0x37,0x2e,0x37,0x10,0x74,0x9e,0x34,0x0, 0xd6,0x7e,0x39,0xb0,0x22,0xa5,0xbf,0xf8, +0x5, 0x7e,0xb3,0x11,0xe8,0x22,0xa5,0xbf,0xfe,0x3, 0xe5,0xc, 0x22,0x74,0xff,0x22, +0x0, 0x0, 0x3, 0xe0,0x3, 0xff,0x3, 0xff,0x0, 0x20,0x0, 0x41,0x0, 0x42,0x0, 0x22, +0x3, 0xe0,0x3, 0xbe,0x3, 0x9c,0x3, 0xdd,0x0, 0x40,0x0, 0xa3,0x0, 0xa5,0x0, 0x44, +0x3, 0xc0,0x3, 0x5c,0x3, 0x5a,0x3, 0xbb,0x0, 0x60,0x0, 0xe5,0x0, 0xe8,0x0, 0x66, +0x3, 0xa0,0x3, 0x1a,0x2, 0xf7,0x3, 0x99,0x0, 0x80,0x1, 0x47,0x1, 0x4b,0x0, 0x88, +0x3, 0x80,0x2, 0xb8,0x2, 0xb4,0x3, 0x77,0x0, 0xa0,0x1, 0x89,0x1, 0xad,0x0, 0xaa, +0x3, 0x60,0x2, 0x56,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xaa, +0x3, 0x60,0x2, 0x76,0x2, 0x93,0x3, 0x77,0x0, 0xa0,0x1, 0x69,0x1, 0x6c,0x0, 0x88, +0x3, 0x80,0x2, 0xd8,0x2, 0xd5,0x3, 0x99,0x0, 0x80,0x1, 0x27,0x1, 0x9, 0x0, 0x66, +0x3, 0xa0,0x3, 0x3a,0x3, 0x38,0x3, 0xbb,0x0, 0x60,0x0, 0xc5,0x0, 0xc6,0x0, 0x44, +0x3, 0xc0,0x3, 0x7c,0x3, 0x7b,0x3, 0xdd,0x0, 0x40,0x0, 0x83,0x0, 0x64,0x0, 0x22, +0x3, 0xe0,0x3, 0xde,0x3, 0xde,0x3, 0xff,0x0, 0x20,0x0, 0x21,0x0, 0x21,0x0, 0x0, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0x3, 0x40,0x2, 0x55,0x2, 0x51,0x3, 0x55,0x0, 0xc0,0x1, 0xcb,0x1, 0xcf,0x0, 0xcb, +0xca,0x3b,0x7e,0x34,0x13,0xff,0x7e,0x24,0x0, 0x18,0xe4,0x12,0x6d,0xe0,0x7e,0xe0, +0x1, 0x7e,0x73,0x10,0x4d,0x7a,0x73,0x13,0xb6,0xe4,0x7a,0xb3,0x10,0x4d,0x6c,0xdd, +0x6c,0xcc,0x80,0x11,0xa, 0x3c,0x2e,0x37,0x10,0x6e,0x7e,0x39,0x70,0xbc,0x7d,0x40, +0x2, 0x7c,0xd7,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc,0x7c,0x38,0xe7,0xbe,0xd0,0x1f, +0x50,0xc, 0xa, 0x2d,0x7e,0x34,0x0, 0x1f,0x9d,0x32,0x7c,0xd7,0x80,0x2, 0x6c,0xdd, +0x7a,0xd1,0x21,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10,0x2b,0x12,0x6a, +0x64,0x2, 0x2d,0x7d,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37, +0xa, 0xaf,0x12,0x6e,0xcf,0x12,0x69,0x23,0x12,0x6e,0x78,0x60,0xfb,0xa9,0xb7,0xea, +0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x6c, +0xcc,0x80,0x78,0x6c,0xff,0x80,0x6a,0x4c,0xcc,0x78,0x11,0xe4,0xa, 0x3f,0x19,0xb3, +0x13,0xe7,0x6d,0x33,0x74,0x2, 0xac,0xbf,0x59,0x35,0x13,0xb7,0xbe,0xf0,0x17,0x78, +0x13,0x7e,0x34,0x0, 0x1, 0x7c,0xbc,0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0x5e,0x34, +0x4, 0x44,0x68,0x3b,0x7e,0x50,0x30,0xac,0x5c,0x7e,0x70,0x2, 0xac,0x7f,0x2d,0x32, +0x2e,0x37,0xf, 0xda,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, 0x14,0xe, +0x14,0x7e,0x50,0x2, 0xac,0x5f,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xa, 0x3f,0x2e,0x34,0x13,0xe7,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xb, +0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0x8e,0xb, 0xc0,0x7e,0x73,0x10,0x2b,0xbc, +0x7c,0x38,0x80,0x75,0x22,0x0, 0x6c,0xcc,0x2, 0x2d,0x5b,0xa, 0x3c,0x9, 0xa3,0x13, +0xe7,0x4c,0xaa,0x78,0xf, 0x7e,0x44,0x22,0xc4,0x7e,0x70,0x2, 0xac,0x7c,0x59,0x43, +0x13,0xb7,0x80,0x25,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x12,0x13,0xb7,0xa, 0xa, 0x8d, +0x10,0x59,0x12,0x13,0xb7,0x2e,0x24,0x13,0xb7,0xb, 0x28,0x30,0x3e,0x34,0x3e,0x34, +0x3e,0x34,0x3e,0x34,0x3e,0x34,0x1b,0x28,0x30,0x7e,0x50,0x2, 0xac,0x5c,0x49,0x32, +0x13,0xb7,0xbe,0x34,0x1e,0xdc,0x50,0x22,0xa, 0x1c,0x2e,0x14,0x13,0xff,0x7e,0x19, +0xb0,0x4, 0x7a,0x19,0xb0,0xa, 0x1c,0x2e,0x17,0x10,0x74,0x7e,0x19,0xb0,0xbc,0xbd, +0x50,0x2f,0x4, 0x7a,0x19,0xb0,0x80,0x31,0x80,0x27,0xbe,0x34,0x26,0xac,0x28,0x27, +0xa, 0x3c,0x2e,0x34,0x13,0xff,0x7e,0x39,0xb0,0x4, 0x7a,0x39,0xb0,0xa, 0x3c,0x2e, +0x37,0x10,0x74,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x6, 0x14,0x7a,0x39,0xb0,0x80, +0x8, 0x5, 0x22,0x6c,0xee,0x80,0x2, 0x5, 0x22,0xb, 0xc0,0x7e,0x73,0x10,0x2c,0xbc, +0x7c,0x28,0x3, 0x2, 0x2c,0xbb,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e,0x34,0x10, +0x2b,0x12,0x6a,0x64,0x7e,0x73,0x10,0x2c,0xbe,0x71,0x22,0x68,0xf, 0x7e,0xa1,0x21, +0x7c,0xba,0x14,0xf5,0x21,0x4c,0xaa,0x68,0x3, 0x2, 0x2c,0x4, 0x7e,0x73,0x13,0xb6, +0x7a,0x73,0x10,0x4d,0x6c,0xff,0x80,0x10,0xa, 0x3f,0x9, 0x73,0x13,0xff,0xbc,0x7d, +0x78,0x4, 0x6c,0xee,0x80,0xa, 0xb, 0xf0,0x7e,0x73,0x10,0x2c,0xbc,0x7f,0x38,0xe8, +0x7c,0xbe,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xb3,0x10,0x3c,0xf5,0x21,0xe4,0x7a,0xb3, +0x10,0x3c,0x7e,0xb3,0x10,0x3a,0xf5,0x22,0x74,0x3, 0x7a,0xb3,0x10,0x3a,0x7e,0x37, +0x10,0x48,0x7e,0x24,0x0, 0x25,0xe4,0x12,0x6d,0xe0,0x7e,0xe0,0x7, 0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x6c,0xdd, +0x7e,0x14,0x0, 0x1, 0x7c,0xbe,0x60,0x5, 0x3e,0x14,0x14,0x78,0xfb,0xa, 0x2d,0x2e, +0x27,0x10,0x48,0x7e,0x29,0x70,0x4c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25, +0x78,0xde,0x7e,0x34,0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab, +0x12,0x6e,0x81,0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xd0,0x6c, +0xdd,0xbe,0xd0,0x18,0x50,0x1e,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c, +0xbf,0x30,0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x16, +0x1e,0xf0,0x80,0x12,0xa, 0x3d,0x2e,0x37,0x10,0x33,0x9, 0x73,0xff,0xe8,0xa, 0x37, +0x2e,0x34,0x0, 0x18,0x7c,0xf7,0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0xb, +0x38,0x30,0xbe,0x34,0x25,0x80,0x18,0x21,0x7e,0x34,0x0, 0x1, 0x7c,0xbe,0x60,0x5, +0x3e,0x34,0x14,0x78,0xfb,0x7d,0x13,0x6e,0x14,0xff,0xff,0xa, 0x2f,0x2e,0x27,0x10, +0x48,0x7e,0x29,0x70,0x5c,0x73,0x7a,0x29,0x70,0xb, 0xd0,0xbe,0xd0,0x25,0x78,0x91, +0x1b,0xe0,0xbe,0xe0,0x0, 0x48,0x3, 0x2, 0x2d,0xdd,0x7e,0xe0,0xa, 0x74,0x2, 0x7a, +0xb3,0x10,0x3a,0x2, 0x2f,0xac,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac, +0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10, +0x2c,0xa, 0x65,0x2d,0x63,0x7c,0xcd,0x6c,0xdd,0x2, 0x2f,0x74,0x7e,0xa3,0x10,0x2c, +0xbc,0xad,0x28,0x27,0xa, 0x3d,0x2e,0x37,0x10,0x35,0x7e,0x39,0xf0,0x7c,0xbf,0x30, +0xe0,0xc, 0xa, 0x3f,0x2e,0x34,0x0, 0x18,0xe, 0x34,0x7c,0xf7,0x80,0x2, 0x1e,0xf0, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x80,0x27,0xa, 0x2a,0xa, 0x3d,0x9d, +0x32,0x2e,0x37,0x10,0x33,0x7e,0x39,0xb0,0xa, 0x3b,0x2e,0x34,0x0, 0x18,0x7c,0xf7, +0x7e,0x70,0x2, 0xac,0x7d,0x2e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, 0xa4, +0x9d,0x35,0xb, 0x38,0x30,0x7a,0x35,0x23,0xbe,0x34,0x2e,0xe0,0x8, 0x18,0x4c,0xee, +0x68,0x30,0xa, 0x2f,0x2e,0x27,0x10,0x48,0x7e,0x29,0xb0,0xbe,0xb0,0xfe,0x50,0x22, +0x4, 0x7a,0x29,0xb0,0x80,0x1c,0xbe,0x34,0x17,0x70,0x58,0x14,0xa, 0x3f,0x2e,0x37, +0x10,0x48,0x7e,0x39,0xb0,0xbe,0xb0,0x0, 0x28,0x8, 0x14,0x7a,0x39,0xb0,0x80,0x2, +0x1b,0xc0,0xb, 0xd0,0x7e,0x73,0x10,0x2b,0xa, 0x37,0x7e,0x53,0x10,0x2c,0xa, 0x25, +0x2d,0x23,0xa, 0x3d,0xbd,0x32,0x58,0x3, 0x2, 0x2e,0xdc,0x4c,0xcc,0x68,0x28,0x7e, +0x34,0x10,0x2b,0x12,0x5b,0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81, +0x60,0xfb,0x7e,0x37,0xf, 0xd6,0x7e,0x25,0x70,0x12,0x54,0xd0,0x7c,0xae,0x1b,0xe0, +0x4c,0xaa,0x68,0x3, 0x2, 0x2e,0xb6,0xe5,0x21,0x7a,0xb3,0x10,0x3c,0xe5,0x22,0x7a, +0xb3,0x10,0x3a,0xda,0x3b,0x22,0xca,0xf8,0x6c,0xff,0x7e,0x24,0x15,0x56,0x7e,0x34, +0x13,0xfe,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x7e,0x24,0xe, 0xd, 0x7e,0x34,0x13, +0xb6,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x7e,0x73,0xf, 0x1b,0x7a,0x73,0x13,0xfc, +0x7e,0x73,0xf, 0x1c,0x7a,0x73,0x13,0xfd,0x7e,0xa3,0x13,0xfc,0xbe,0xa0,0x1, 0x38, +0x3, 0x7e,0xf0,0x1, 0x7e,0xb3,0xf, 0x1c,0x70,0x3, 0xe4,0x80,0x10,0x7e,0xb3,0x15, +0xa1,0x4, 0x7a,0xb3,0x15,0xa1,0xbe,0xb0,0xc8,0x28,0x6, 0x74,0x14,0x7a,0xb3,0x15, +0xa1,0x7e,0xb3,0x15,0xa1,0xbe,0xb0,0x6, 0x50,0x3, 0x7e,0xf0,0x1, 0xbe,0xa0,0x1, +0x28,0x3f,0x7e,0x34,0x0, 0x21,0x7e,0x24,0x0, 0x23,0x7e,0x14,0x13,0xfe,0x12,0x65, +0xa8,0x7e,0x34,0x0, 0x25,0x7e,0x24,0x0, 0x27,0x7e,0x14,0x13,0xb6,0x12,0x65,0xa8, +0x7e,0x35,0x25,0x9e,0x35,0x21,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x80,0x18,0xf, 0x7e, +0x35,0x27,0x9e,0x35,0x23,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x80,0x8, 0x3, 0x7e,0xf0, +0x1, 0xbe,0xf0,0x0, 0x28,0x3, 0x2, 0x31,0x24,0x7e,0xf3,0x15,0x9f,0xbe,0xf3,0x15, +0x29,0x50,0x55,0x7e,0x73,0x15,0x29,0xbe,0x73,0x13,0xfc,0x28,0x12,0x7e,0x24,0x15, +0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x2, 0x31,0x24,0x7e, +0x73,0x15,0x9e,0xbe,0x70,0x2, 0x58,0x22,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3, +0x15,0x53,0x7e,0xb3,0x15,0x9e,0x4, 0x2, 0x31,0x60,0x74,0x1, 0x7a,0xb3,0x15,0xa0, +0xe4,0x7a,0xb3,0x15,0x53,0x2, 0x31,0x60,0xbe,0xf3,0x15,0x29,0x78,0x2d,0x7e,0xa3, +0x15,0x29,0xbe,0xa3,0x13,0xfc,0x50,0xd, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a, +0xb3,0x15,0x53,0x80,0x6b,0xbe,0xa3,0x13,0xfc,0x28,0x4, 0x74,0x1, 0x80,0x1, 0xe4, +0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0x80,0x55,0x7e,0x73,0x15,0x29,0xbe, +0x73,0x13,0xfc,0x50,0x1a,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3,0x7e,0x14,0x0, +0x48,0x12,0x6d,0x3c,0xe4,0x7a,0xb3,0x15,0xa0,0x7a,0xb3,0x15,0x53,0x80,0x31,0x7e, +0x73,0x15,0x53,0xbe,0x70,0x2, 0x58,0x1c,0x7e,0x24,0x15,0x56,0x7e,0x34,0x14,0xe3, +0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x74,0x1, 0x7a,0xb3,0x15,0xa0,0x7e,0xb3,0x15, +0x53,0x4, 0x80,0x7, 0x74,0x1, 0x7a,0xb3,0x15,0xa0,0xe4,0x7a,0xb3,0x15,0x53,0xe4, +0x7a,0xb3,0x15,0x9e,0x7e,0xb3,0x15,0xa0,0x14,0x68,0x9, 0x4, 0x78,0x15,0x7e,0x24, +0x13,0xb6,0x80,0x4, 0x7e,0x24,0x14,0xe3,0x7e,0x34,0x15,0x56,0x7e,0x14,0x0, 0x48, +0x12,0x6d,0x3c,0x7e,0x73,0x15,0x29,0x7a,0x73,0x15,0x9f,0x7e,0x24,0x13,0xb6,0x7e, +0x34,0x14,0xe3,0x7e,0x14,0x0, 0x48,0x12,0x6d,0x3c,0x7e,0x24,0x15,0x56,0x7e,0x34, +0xe, 0xd, 0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x7e,0x73,0x15,0x9c,0x7a,0x73,0xf, +0x1b,0x7e,0x73,0x15,0x9d,0x7a,0x73,0xf, 0x1c,0xda,0xf8,0x22,0xca,0x79,0x7d,0x73, +0x12,0x60,0xce,0x49,0x27,0x0, 0x25,0x7e,0x34,0x1c,0xa, 0x1b,0x38,0x20,0x49,0x27, +0x0, 0x27,0x7e,0x34,0x1c,0xc, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x29,0x7e,0x34,0x1c, +0xe, 0x1b,0x38,0x20,0x49,0x27,0x0, 0x2b,0x7e,0x34,0x1c,0x10,0x1b,0x38,0x20,0x49, +0x27,0x0, 0x2d,0x7e,0x34,0x1c,0x12,0x1b,0x38,0x20,0x49,0x27,0x0, 0x2f,0x7e,0x34, +0x1c,0x14,0x1b,0x38,0x20,0x49,0x27,0x0, 0x6, 0x9, 0x72,0x0, 0x1, 0xa, 0x37,0x7c, +0x67,0x6c,0x77,0x7e,0x29,0x30,0xa, 0x13,0x4d,0x13,0x7e,0x34,0x1c,0x18,0x1b,0x38, +0x10,0x9, 0x72,0x0, 0x3, 0xa, 0x37,0x7c,0x67,0x6c,0x77,0x9, 0x52,0x0, 0x2, 0xa, +0x25,0x4d,0x23,0x7e,0x34,0x1c,0x1a,0x1b,0x38,0x20,0x9, 0x77,0x0, 0x1, 0xa, 0x27, +0x7e,0x34,0x1c,0x16,0x1b,0x38,0x20,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20, +0x6c,0xaa,0xa, 0x2a,0x49,0x37,0x0, 0xa, 0x2d,0x32,0x7e,0x39,0xb0,0xa, 0x2b,0x7e, +0x34,0x1c,0x1e,0x1b,0x38,0x20,0xb, 0xa0,0xbe,0xa0,0x18,0x78,0xe5,0x6d,0x22,0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x37,0x0, +0x4b,0x2d,0x32,0xb, 0x38,0x20,0x7e,0x34,0x1c,0x20,0x1b,0x38,0x20,0xb, 0xa0,0xbe, +0xa0,0x19,0x78,0xe4,0x6d,0x22,0x7e,0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e, +0x70,0x2, 0xac,0x7a,0x2e,0x34,0x29,0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x30,0x7e, +0x24,0x1c,0x22,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0xff,0x78,0xe2,0x7e,0x14,0x2b, +0x7e,0x7e,0x4, 0x0, 0xff,0xb, 0xa, 0x30,0x1b,0x28,0x30,0x7e,0x24,0x1, 0x0, 0x7e, +0x34,0x1c,0x1c,0x1b,0x38,0x20,0x6c,0xaa,0x7e,0x70,0x2, 0xac,0x7a,0x2e,0x34,0x2b, +0x80,0x7e,0x24,0x0, 0xff,0xb, 0x1a,0x20,0x7e,0x34,0x1c,0x22,0x1b,0x38,0x20,0xb, +0xa0,0xbe,0xa0,0x10,0x40,0xe2,0x7d,0x37,0x12,0x5d,0xbd,0x49,0x27,0x0, 0x39,0x7e, +0x34,0x1c,0x28,0x1b,0x38,0x20,0x7e,0x24,0x0, 0x1, 0x7e,0x34,0x1c,0x2a,0x1b,0x38, +0x20,0x49,0x27,0x0, 0x31,0x7e,0x34,0x1c,0x2c,0x1b,0x38,0x20,0x49,0x27,0x0, 0x33, +0x7e,0x34,0x1c,0x2e,0x1b,0x38,0x20,0x49,0x37,0x0, 0x45,0x49,0x27,0x0, 0xa, 0x9, +0xb7,0x0, 0x1, 0x12,0x64,0x6a,0x49,0x37,0x0, 0x47,0x12,0x7, 0xc9,0x49,0x37,0x0, +0x49,0x49,0x27,0x0, 0xa, 0x9, 0xb7,0x0, 0x1, 0x12,0x5c,0x97,0x49,0x27,0x0, 0x35, +0x7e,0x34,0x1c,0x52,0x1b,0x38,0x20,0x49,0x27,0x0, 0x3d,0x7e,0x34,0x1c,0x54,0x1b, +0x38,0x20,0x49,0x27,0x0, 0x37,0x7e,0x34,0x1c,0x56,0x1b,0x38,0x20,0xda,0x79,0x22, +0xca,0x3b,0x6d,0x33,0x7a,0x35,0x23,0x7e,0xb3,0xf, 0x1b,0x60,0x6, 0x7e,0xb3,0xf, +0x1c,0x60,0x11,0xe5,0x22,0x60,0x5, 0x75,0x19,0x1, 0x80,0x3, 0x75,0x19,0x0, 0xe5, +0x19,0x2, 0x35,0x1f,0x7e,0xb3,0xd, 0x18,0xf5,0x21,0x7e,0x73,0xd, 0x19,0x7a,0x71, +0x22,0x6d,0x66,0x75,0x25,0x0, 0x75,0x26,0x0, 0xa, 0x37,0x7d,0x73,0x80,0x3a,0x7e, +0x51,0x21,0x74,0x18,0xac,0x5b,0x2d,0x27,0x3e,0x24,0x2e,0x27,0xf, 0xda,0xb, 0x28, +0x10,0xbe,0x14,0x0, 0x32,0x8, 0x28,0x5, 0x25,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0x8, +0x49,0x12,0xff,0xd0,0x2d,0x61,0x5, 0x26,0xe5,0x21,0xbe,0xb0,0xc, 0x50,0x8, 0x49, +0x22,0x0, 0x30,0x2d,0x62,0x5, 0x26,0x1b,0x74,0xbe,0x74,0x0, 0x0, 0x58,0xc0,0x7d, +0x73,0x80,0x38,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0x2d,0x37,0x3e,0x34,0x2e,0x37, +0xf, 0xda,0xb, 0x38,0x20,0xbe,0x24,0x0, 0x32,0x8, 0x2c,0x5, 0x25,0xe5,0x21,0xbe, +0xb0,0x0, 0x28,0x8, 0x49,0x23,0xff,0xd0,0x2d,0x62,0x5, 0x26,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x8, 0x49,0x33,0x0, 0x30,0x2d,0x63,0x5, 0x26,0x7d,0x37,0xb, 0x34,0x7d, +0x73,0xbe,0x34,0x0, 0x18,0x48,0xbc,0xe5,0x25,0xbe,0xb0,0x3, 0x50,0x2, 0x80,0x12, +0x7d,0x36,0x12,0x6d,0xd0,0xe5,0x26,0xa, 0x2b,0x12,0x47,0xf2,0xbe,0x34,0x0, 0xf, +0x8, 0x8, 0x75,0x19,0x1, 0x74,0x1, 0x2, 0x35,0x1f,0x6d,0x33,0xe5,0x21,0xbe,0xb0, +0x0, 0x28,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0xff,0xd0,0x2d,0x32,0xe5,0x21,0xbe,0xb0, +0xc, 0x50,0x19,0x7e,0x51,0x21,0x74,0x18,0xac,0x5b,0xe5,0x22,0xa, 0x1b,0x2d,0x21, +0x3e,0x24,0x2e,0x27,0xf, 0xda,0x49,0x22,0x0, 0x30,0x2d,0x32,0x7e,0xa0,0x8, 0x80, +0x2d,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x12,0x2e,0x14,0x6d,0xc0,0x7a,0x31,0x82,0x7a, +0x21,0x83,0xe4,0x93,0x1a,0x1b,0xbd,0x13,0x8, 0x14,0x2e,0x24,0x6d,0xc1,0x7a,0x51, +0x82,0x7a,0x41,0x83,0xe4,0x93,0x1a,0x2b,0x2e,0x25,0x23,0x7a,0x25,0x23,0x7c,0x5a, +0x1b,0xa0,0xa5,0xbd,0x0, 0xcb,0x7e,0x71,0x21,0x74,0x18,0xac,0x7b,0xe5,0x22,0xa, +0x2b,0x2d,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0xb, 0x38,0x30,0x12,0x6d,0xd0,0xbe, +0x34,0x3, 0xe8,0x8, 0xa, 0x7e,0x35,0x23,0x2e,0x34,0x0, 0x28,0x7a,0x35,0x23,0x7e, +0x35,0x23,0xbe,0x34,0x0, 0xfa,0x28,0x7, 0x7e,0x34,0x0, 0xfa,0x7a,0x35,0x23,0xe5, +0x19,0xa, 0x3b,0xbe,0x35,0x23,0x50,0x5, 0x7e,0x55,0x23,0xf5,0x19,0xe5,0x19,0xda, +0x3b,0x22,0xca,0x3b,0x7c,0x9b,0x7d,0xa3,0xbe,0x90,0x1, 0x28,0x1e,0xa, 0x15,0x1b, +0x15,0xa, 0x39,0xbd,0x31,0x58,0x14,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b, +0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x80,0x7, 0xbe,0x90,0x1, 0x78,0x15, +0x6d,0xbb,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d, +0x53,0x7d,0xc3,0x80,0x8, 0x4c,0x99,0x78,0x38,0x6d,0xcc,0x7d,0xbc,0x74,0x2, 0xac, +0xb9,0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x7e,0x70,0x2, +0xac,0x79,0x2d,0x3a,0x49,0x33,0x0, 0x2, 0x12,0x6d,0x53,0x7d,0xe3,0x74,0x2, 0xac, +0xb9,0x7d,0xf5,0x2d,0xfa,0x49,0x3f,0x0, 0x4, 0x12,0x6d,0x53,0x7d,0xf3,0x2, 0x36, +0x2d,0x7c,0xb5,0x24,0xfe,0xbc,0xb9,0x78,0x46,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d, +0xba,0x1b,0xb6,0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79, +0x2d,0x3a,0x1b,0x35,0xb, 0x38,0x30,0x12,0x6d,0x53,0x7d,0xc3,0x74,0x2, 0xac,0xb9, +0x7d,0xd5,0x2d,0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x74,0x2, 0xac,0xb9, +0x2d,0xa5,0x49,0x3a,0x0, 0x2, 0x12,0x6d,0x53,0x7d,0xe3,0x6d,0xff,0x80,0x3e,0x7c, +0xb5,0x14,0xbc,0xb9,0x78,0x37,0x74,0x2, 0xac,0xb9,0x7d,0xb5,0x2d,0xba,0x1b,0xb6, +0xb, 0xb8,0x30,0x12,0x6d,0x53,0x7d,0xb3,0x7e,0x70,0x2, 0xac,0x79,0x2d,0x3a,0x1b, +0x35,0xb, 0x38,0x30,0x12,0x6d,0x53,0x7d,0xc3,0x74,0x2, 0xac,0xb9,0x7d,0xd5,0x2d, +0xda,0xb, 0xd8,0x30,0x12,0x6d,0x53,0x7d,0xd3,0x6d,0xff,0x7d,0xef,0xa, 0x79,0x6d, +0x66,0x7f,0x3, 0x1b,0xc, 0x7d,0x3c,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x7f,0x41, +0x7f,0x3, 0x1b,0xd, 0x7d,0x3b,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0x7d, +0x3d,0x1a,0x26,0x1a,0x24,0xa, 0x19,0x6d,0x0, 0x12,0x48,0x24,0x2f,0x41,0xa, 0x19, +0x6d,0x0, 0xb, 0xc, 0x7d,0x3e,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x41,0xa, +0x19,0x6d,0x0, 0xb, 0xd, 0x7d,0x3f,0x1a,0x26,0x1a,0x24,0x12,0x48,0x24,0x2f,0x14, +0x7d,0x1c,0x1a,0x2, 0x1a,0x0, 0x7d,0x5b,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1d, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x7d,0x5e,0x1a,0x4a,0x1a,0x48,0x2f,0x20,0x7d,0x1f, +0x1a,0x2, 0x1a,0x0, 0x2f,0x2, 0x74,0x6, 0x2f,0x11,0x14,0x78,0xfb,0x12,0x48,0x40, +0x2e,0x34,0x0, 0x20,0xda,0x3b,0x22,0xca,0x3b,0x7e,0xf3,0xf, 0x1b,0x7e,0x64,0xe, +0xdf,0xe5,0x51,0xb4,0x1, 0x21,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x1a,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0x13,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0xa, 0x74,0x1e,0x7a, +0xb3,0xf, 0x26,0x74,0x14,0x80,0x8, 0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a, +0xb3,0xf, 0x27,0x4c,0xff,0x78,0xd, 0x75,0x1a,0x0, 0x7e,0xb3,0xf, 0x26,0x12,0x6e, +0xa1,0x2, 0x38,0x47,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14, +0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, +0x74,0x1, 0x80,0x1, 0xe4,0xb4,0x1, 0x9, 0xe5,0x1a,0x70,0x5, 0x75,0x17,0x1e,0xf5, +0x18,0xe5,0x51,0xb4,0x1, 0x1b,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x14,0x7e,0xb3,0xd, +0xf7,0xb4,0x1, 0xd, 0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x4, 0x74,0x1, 0x80, +0x1, 0xe4,0xf5,0x1a,0x6c,0xee,0x7e,0x70,0x7, 0xac,0x7e,0x9, 0xb3,0xe, 0x9d,0xf5, +0x21,0xbe,0xb0,0xff,0x78,0x3, 0x2, 0x38,0x3d,0xe5,0x21,0xa, 0x2b,0x2d,0x26,0x7e, +0x29,0xb0,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x38,0x3d,0x49,0x33,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x74,0x12,0x6d,0xb0,0x7a,0x35,0x22,0x74,0x7, +0xac,0xbe,0x49,0x35,0xe, 0x9b,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x25,0x13,0x76, +0x12,0x6d,0xb0,0x7a,0x35,0x24,0xe5,0x17,0xa, 0x3b,0xbe,0x35,0x22,0x28,0x56,0xbe, +0x35,0x24,0x28,0x51,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x74,0x74,0x7, +0xac,0xbe,0x59,0x35,0xe, 0x99,0x7e,0xa1,0x21,0x74,0x4, 0xa4,0x49,0x35,0x13,0x76, +0x74,0x7, 0xac,0xbe,0x59,0x35,0xe, 0x9b,0xe5,0x21,0xa, 0x3b,0x2d,0x36,0x7e,0x39, +0xb0,0xb4,0x2, 0x7, 0xbe,0xf0,0x0, 0x28,0x2, 0x1b,0xf0,0x4c,0xff,0x78,0x4e,0x5, +0x18,0x7e,0x73,0xf, 0x27,0xbe,0x71,0x17,0x28,0x43,0xe5,0x18,0xbe,0xb0,0x32,0x40, +0x3c,0x5, 0x17,0x80,0x35,0x7e,0x90,0x7, 0xac,0x9e,0x49,0x34,0xe, 0x99,0x7e,0xa1, +0x21,0x74,0x4, 0xa4,0x59,0x35,0x13,0x74,0x49,0x34,0xe, 0x9b,0x59,0x35,0x13,0x76, +0x7e,0x73,0xf, 0x26,0xbe,0x71,0x17,0x78,0x8, 0x7e,0xb3,0xf, 0x27,0xf5,0x17,0x80, +0x9, 0xe5,0x17,0xbe,0xb0,0x1, 0x28,0x2, 0x15,0x17,0x75,0x18,0x0, 0xb, 0xe0,0xbe, +0xe0,0xa, 0x68,0x3, 0x2, 0x37,0x56,0xda,0x3b,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3, +0x10,0x2b,0xf5,0x24,0x7e,0xe3,0x10,0x2c,0x1b,0xe0,0x6c,0xdd,0x7e,0x70,0x30,0xac, +0x7d,0x2e,0x37,0xf, 0xda,0x49,0x33,0x0, 0x2e,0x74,0x2, 0xac,0xbd,0x59,0x35,0x13, +0xb6,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0x7e,0xb3,0xf, 0xd3,0xb4,0x1, 0x2, 0x80, +0x3, 0x2, 0x39,0xc1,0x6c,0xcc,0x2, 0x39,0xb2,0x7e,0x70,0x2, 0xac,0x7c,0x9, 0xb3, +0xd, 0x18,0xf5,0x22,0x9, 0xb3,0xd, 0x19,0xf5,0x23,0x75,0x21,0x3, 0x7e,0x73,0xe, +0x12,0xbe,0x70,0x20,0x50,0xa, 0x7e,0xb3,0xd, 0xf7,0xb4,0x1, 0x3, 0x75,0x21,0x1, +0x7e,0xb3,0xd, 0xfd,0xb4,0x1, 0x3, 0x75,0x21,0x2, 0x74,0x8, 0x7a,0xb3,0xf, 0x53, +0xe5,0x22,0xbe,0xb0,0x0, 0x28,0x21,0xe5,0x24,0xa, 0x2b,0x1b,0x24,0xe5,0x22,0xa, +0x3b,0xbd,0x32,0x58,0x13,0xe5,0x23,0xbe,0xb0,0x0, 0x28,0xc, 0xa, 0x2e,0x1b,0x24, +0xe5,0x23,0xa, 0x3b,0xbd,0x32,0x48,0x3, 0x75,0x21,0x2, 0x75,0x25,0x0, 0x80,0x45, +0xe5,0x25,0xbc,0xbc,0x68,0x3d,0x7e,0x71,0x25,0x74,0x2, 0xac,0x7b,0x9, 0xa3,0xd, +0x18,0x7a,0xa1,0x26,0x9, 0xb3,0xd, 0x19,0xf5,0x27,0xa, 0x2a,0xe5,0x22,0xa, 0x3b, +0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x3, 0x18,0x18,0xe5,0x27,0xa, 0x2b,0xe5, +0x23,0xa, 0x3b,0x9d,0x32,0x12,0x6d,0xd0,0xbe,0x34,0x0, 0x3, 0x18,0x5, 0x75,0x21, +0x1, 0x80,0xb, 0x5, 0x25,0x7e,0x73,0xd, 0xf7,0xbe,0x71,0x25,0x38,0xb2,0xe5,0x51, +0xb4,0x1, 0x20,0x7e,0xb3,0xf, 0x1c,0xb4,0x1, 0x19,0x7e,0xb3,0xd, 0xf7,0xb4,0x1, +0x12,0x7e,0x73,0xd, 0xf9,0xbe,0x70,0x15,0x40,0x9, 0x75,0x21,0x3, 0x74,0x1e,0x7a, +0xb3,0xf, 0x53,0xe5,0x23,0xbe,0xb0,0x17,0x50,0x1a,0x6c,0xdd,0x6d,0x33,0x7e,0x50, +0x30,0xac,0x5d,0x2e,0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, +0x78,0xec,0x80,0x3, 0x75,0x21,0x0, 0xe5,0x21,0x7c,0x7c,0x7c,0x6f,0x12,0x11,0xa0, +0x6c,0xdd,0x74,0x2, 0xac,0xbd,0x49,0x35,0x13,0xb6,0x7e,0x50,0x30,0xac,0x5d,0x2e, +0x27,0xf, 0xda,0x59,0x32,0x0, 0x2e,0xb, 0xd0,0xbe,0xd0,0xd, 0x78,0xe4,0xb, 0xf0, +0xb, 0xc0,0x7e,0x73,0xd, 0xf7,0xbc,0x7c,0x28,0x3, 0x2, 0x38,0x89,0x7a,0xf3,0xd, +0xf7,0xda,0x3b,0x22,0xca,0x3b,0x7d,0x73,0x7e,0xb3,0xd, 0xf7,0xf5,0x4c,0x7e,0x37, +0xf, 0xda,0x7a,0x35,0x4f,0x75,0x42,0x0, 0x7e,0xc0,0x1, 0x80,0x19,0xe5,0x42,0xa, +0x3b,0x2d,0x37,0x7e,0x39,0x60,0xa, 0x2c,0x2d,0x27,0x7e,0x29,0x70,0xbc,0x76,0x40, +0x3, 0x7a,0xc1,0x42,0xb, 0xc0,0xe5,0x4c,0xbc,0xbc,0x38,0xe1,0xe5,0x42,0xa, 0x3b, +0x2d,0x37,0x7e,0x39,0xb0,0xf5,0x42,0x75,0x44,0x0, 0x7e,0xc0,0x1, 0x2, 0x3b,0xe, +0x75,0x4b,0x0, 0x6d,0x33,0x7a,0x35,0x4d,0x6c,0xdd,0x75,0x45,0x0, 0x75,0x46,0x0, +0x75,0x43,0x0, 0x2, 0x3a,0xc3,0x7e,0x71,0x43,0x74,0x2, 0xac,0x7b,0x9, 0xb3,0xd, +0x18,0xf5,0x47,0x9, 0xb3,0xd, 0x19,0xf5,0x48,0xe5,0x43,0xa, 0x3b,0x2d,0x37,0x7e, +0x39,0x70,0xbc,0x7c,0x78,0x7b,0xb, 0xd0,0xe5,0x47,0x25,0x45,0xf5,0x45,0xe5,0x48, +0x25,0x46,0xf5,0x46,0x7e,0x51,0x47,0xac,0x5d,0xe5,0x45,0xa, 0x3b,0x9d,0x32,0x12, +0x6d,0xd0,0x7c,0xb7,0xf5,0x49,0x7e,0x51,0x48,0xac,0x5d,0xe5,0x46,0xa, 0x3b,0x9d, +0x32,0x12,0x6d,0xd0,0x7c,0xb7,0xf5,0x4a,0x7e,0x51,0x4b,0xac,0x5d,0xe5,0x49,0xa, +0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2,0x7c,0xb7,0xf5,0x4b,0x7e,0x51, +0x4b,0xac,0x5d,0xe5,0x4a,0xa, 0x3b,0xbd,0x32,0x8, 0x9, 0xa, 0x2d,0x12,0x47,0xf2, +0x7c,0xb7,0xf5,0x4b,0x7e,0x71,0x47,0x74,0x18,0xac,0x7b,0xe5,0x48,0xa, 0x2b,0x2d, +0x32,0x3e,0x34,0x2e,0x35,0x4f,0xb, 0x38,0x30,0xbe,0x35,0x4d,0x8, 0x3, 0x7a,0x35, +0x4d,0x5, 0x43,0xe5,0x4c,0xbe,0xb1,0x43,0x28,0x3, 0x2, 0x3a,0x26,0xbe,0xd0,0x0, +0x28,0x3a,0xe5,0x45,0x8c,0xbd,0xf5,0x45,0xe5,0x46,0x8c,0xbd,0xf5,0x46,0x7e,0xa1, +0x45,0x7e,0x71,0x44,0x74,0x2, 0xac,0x7b,0x19,0xa3,0x15,0x2b,0xe5,0x46,0x19,0xb3, +0x15,0x2c,0x7e,0x25,0x4d,0x7e,0x71,0x45,0x74,0x18,0xac,0x7b,0xe5,0x46,0xa, 0x1b, +0x2d,0x31,0x3e,0x34,0x2e,0x35,0x4f,0x1b,0x38,0x20,0x5, 0x44,0xb, 0xc0,0xe5,0x42, +0xbc,0xbc,0x40,0x3, 0x2, 0x3a,0x10,0xe5,0x44,0xda,0x3b,0x22,0x74,0xd, 0x7a,0xb3, +0x10,0x2b,0x74,0x18,0x7a,0xb3,0x10,0x2c,0x74,0x4, 0x7a,0xb3,0x10,0x2d,0xe4,0x7a, +0xb3,0x10,0x2e,0x7e,0x34,0x11,0x9b,0x7a,0x37,0x10,0x2f,0x7e,0x34,0x11,0x97,0x7a, +0x37,0x10,0x31,0x7e,0x34,0xf, 0xc5,0x7a,0x37,0x10,0x33,0x7e,0x34,0xf, 0xad,0x7a, +0x37,0x10,0x35,0x74,0x15,0x7a,0xb3,0x10,0x37,0x74,0x17,0x7a,0xb3,0x10,0x38,0x74, +0x4, 0x7a,0xb3,0x10,0x3a,0xe4,0x7a,0xb3,0x10,0x3b,0x7a,0xb3,0x10,0x3c,0x7a,0xb3, +0x10,0x3d,0x74,0x2, 0x7a,0xb3,0x10,0x3e,0x74,0x45,0x7a,0xb3,0x10,0x3f,0x74,0x71, +0x7a,0xb3,0x10,0x40,0x74,0x3, 0x7a,0xb3,0x10,0x41,0x7e,0x34,0x1f,0xff,0x7a,0x37, +0x10,0x42,0x6d,0x33,0x7a,0x37,0x10,0x44,0x7e,0x34,0xd, 0xfe,0x7a,0x37,0x10,0x46, +0x7e,0x34,0xf, 0xdc,0x7a,0x37,0x10,0x48,0x74,0x20,0x7a,0xb3,0x10,0x4a,0x74,0xa, +0x7a,0xb3,0x10,0x4b,0xe4,0x7a,0xb3,0x10,0x4c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10, +0x4e,0x74,0x2, 0x7a,0xb3,0x10,0x4f,0x7e,0x34,0x0, 0xf4,0x7a,0x37,0x10,0x52,0x7e, +0x34,0x3f,0xe0,0x7a,0x37,0x10,0x50,0x7e,0x34,0x29,0x28,0x7a,0x37,0x10,0x54,0x7e, +0x34,0x10,0x91,0x7a,0x37,0x10,0x62,0x7e,0x34,0x0, 0x3d,0x7a,0x37,0x10,0x64,0x7e, +0x34,0x0, 0x22,0x7a,0x37,0x10,0x66,0x7e,0x34,0x4c,0x0, 0x7a,0x37,0x10,0x56,0x7e, +0x34,0x3, 0xcf,0x7a,0x37,0x10,0x58,0x7e,0x34,0x7, 0x9a,0x7a,0x37,0x10,0x5a,0x7e, +0x34,0x5, 0x84,0x7a,0x37,0x10,0x5c,0x7e,0x34,0x0, 0x9, 0x7a,0x37,0x10,0x5e,0x7e, +0x34,0x0, 0xf, 0x7a,0x37,0x10,0x60,0x7e,0x34,0x0, 0x5d,0x7a,0x37,0x10,0x68,0xe4, +0x7a,0xb3,0x10,0x6a,0x74,0x7, 0x7a,0xb3,0x10,0x6b,0x7e,0x34,0x10,0xff,0x7a,0x37, +0x10,0x6c,0x7e,0x34,0xf, 0xa0,0x7a,0x37,0x10,0x6e,0x7e,0x34,0xf, 0x2e,0x7a,0x37, +0x10,0x70,0x12,0x42,0x8d,0x7e,0x34,0x11,0xe9,0x7a,0x37,0x10,0x72,0x7e,0x34,0xf, +0x88,0x7a,0x37,0x10,0x74,0x7e,0x34,0x11,0x17,0x7a,0x37,0x10,0x76,0x2, 0x6c,0x58, +0xca,0x69,0xca,0xf8,0x7d,0xb1,0x7d,0xf2,0x7d,0xe3,0x9f,0x0, 0x7f,0x60,0x7f,0x40, +0x6d,0x66,0x7a,0x67,0x13,0xb6,0x7f,0x10,0x7d,0xa6,0x75,0x21,0x0, 0x6c,0xaa,0x80, +0x4b,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0xa1,0x2d,0xae,0xb, 0xa8,0xa0,0x7c,0xba,0x20, +0xe0,0x1e,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a, +0x8, 0x2, 0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x60,0x5, 0x21,0x80,0x1a, +0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x11,0x9d,0x1b,0xbd,0x1a,0x8, 0x2, +0x7d,0xa1,0x7d,0x1a,0x1a,0x2, 0x1a,0x0, 0x2f,0x40,0xb, 0xa0,0x7e,0xf3,0x10,0x2c, +0xbc,0xfa,0x38,0xad,0xe5,0x21,0xa, 0x1b,0x6d,0x0, 0x7f,0x16,0x12,0x48,0x91,0x7a, +0x37,0x13,0xb6,0xe5,0x21,0xa, 0x3b,0x6d,0x22,0xa, 0x1f,0x6d,0x0, 0x9f,0x1, 0x7f, +0x14,0x12,0x48,0x91,0x6c,0xaa,0x80,0x2f,0x7c,0xba,0x7e,0x30,0x2, 0x7c,0x9a,0x20, +0xe0,0xf, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x9e,0x7, 0x13,0xb6,0x80, +0xd, 0xac,0x93,0x7d,0x14,0x2d,0x1e,0xb, 0x18,0x0, 0x7d,0x13,0x9d,0x1, 0x7d,0x14, +0x2d,0x1f,0x1b,0x18,0x0, 0xb, 0xa0,0x7e,0xb3,0x10,0x2c,0xbc,0xba,0x38,0xc9,0x9f, +0x66,0x7a,0x67,0x13,0xb6,0x6c,0xaa,0x80,0x29,0x7e,0x70,0x2, 0xac,0x7a,0x7d,0xa3, +0x2d,0xae,0x49,0xaa,0x0, 0x30,0xbd,0xab,0x8, 0x4, 0x7d,0xab,0x80,0xa, 0x6d,0x33, +0x9d,0x3b,0xbd,0x3a,0x8, 0x2, 0x7d,0xa3,0x7d,0x3a,0x1a,0x26,0x1a,0x24,0x2f,0x61, +0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xcf,0xa, 0x16,0x6d,0x0, 0x7f,0x16, +0x12,0x48,0x91,0x7a,0x37,0x13,0xb6,0x6c,0xaa,0x80,0x1d,0x7e,0x70,0x2, 0x7c,0x5a, +0xac,0x57,0x7d,0x32,0x2d,0x3e,0x49,0x43,0x0, 0x30,0x9e,0x47,0x13,0xb6,0x7d,0x32, +0x2d,0x3f,0x59,0x43,0x0, 0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xdb, +0xda,0xf8,0xda,0x69,0x22,0x7e,0x50,0x1, 0xe4,0x7a,0xb3,0xe, 0xb, 0x74,0x1, 0x7a, +0xb3,0xe, 0xc, 0x7e,0xa3,0xd, 0xf7,0x4c,0xaa,0x78,0xb, 0x74,0x1, 0x7a,0xb3,0x16, +0xba,0xe4,0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, +0x7e,0x43,0xd, 0xfc,0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, 0xc, 0x7e,0x43, +0xd, 0x17,0xbe,0x40,0x0, 0x28,0x6b,0x7e,0xb3,0x16,0xb4,0x70,0x65,0x7e,0xb3,0x16, +0xb6,0x70,0x5f,0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x6d,0x33,0x6c,0x44,0x7e,0x30,0x2, +0xac,0x34,0x2e,0x17,0xf, 0xd6,0xb, 0x18,0x10,0xbd,0x13,0x58,0x2, 0x7d,0x31,0xb, +0x40,0xa5,0xbc,0x25,0xe8,0xbe,0x34,0xf8,0xf8,0x58,0x5, 0x7e,0x50,0x5, 0x80,0x1f, +0xbe,0x34,0xfb,0x50,0x58,0x5, 0x7e,0x50,0x4, 0x80,0x14,0xbe,0x34,0xfc,0xe0,0x58, +0x5, 0x7e,0x50,0x3, 0x80,0x9, 0xbe,0x34,0xfe,0xd4,0x58,0x3, 0x7e,0x50,0x2, 0xbe, +0x34,0xfc,0x18,0x58,0x3c,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d, +0x80,0x2f,0x7e,0x43,0xd, 0x16,0xa5,0xbc,0x0, 0x1d,0xbe,0xa0,0x0, 0x28,0x18,0x7e, +0xb3,0x16,0xb4,0x70,0x12,0x7e,0xb3,0x16,0xb6,0x70,0xc, 0xbe,0x50,0x3, 0x50,0x3, +0x7e,0x50,0x3, 0x74,0x1, 0x80,0x6, 0xbe,0x40,0x0, 0x28,0x5, 0xe4,0x7a,0xb3,0xe, +0xc, 0x7e,0x43,0x16,0xba,0xbc,0x45,0x50,0x4, 0x7a,0x53,0x16,0xba,0xbe,0x50,0x2, +0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xbb,0xbe,0xa0,0x0, 0x28,0x1b,0x7e,0xb3,0xd, +0x16,0x70,0x15,0x7e,0xb3,0x16,0xb4,0x70,0xf, 0x7e,0xb3,0x16,0xb6,0x70,0x9, 0xe4, +0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xb3,0x16,0xb6,0xb4,0x1, 0x18,0xe4, +0x7a,0xb3,0x16,0xb6,0x74,0x1, 0x7a,0xb3,0xe, 0xb, 0xe4,0x7a,0xb3,0x10,0x3d,0x7a, +0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0x7e,0xa3,0x16,0xba,0x74,0x2, 0xa4,0x7a,0x57, +0xe, 0x5, 0x7a,0x57,0xe, 0x7, 0x22,0xca,0x79,0x7c,0xfb,0xe5,0x55,0xbe,0xb0,0x1, +0x68,0xf9,0xe5,0x55,0xb4,0x2, 0x2, 0x80,0x3, 0x2, 0x3f,0xe7,0xa9,0xd7,0xea,0x7e, +0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x12,0x0, +0x6e,0x50,0x27,0xa9,0xc7,0xea,0x7e,0xe3,0x10,0x4d,0xe4,0x7a,0xb3,0x10,0x4d,0x7e, +0x24,0x5, 0xe0,0x7d,0x32,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x7a,0xe3,0x10,0x4d, +0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x3, 0x12,0x6a,0xd1,0x74,0x1, 0x7a,0xb3,0xf, 0xd3, +0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x8, 0xe4,0x7e,0x14,0xa, 0x18,0x12,0x66,0x59,0x7e, +0x37,0xf, 0xd6,0x7e,0x27,0xf, 0xd4,0x7e,0x14,0xa, 0x62,0x12,0x66,0x59,0x6c,0xaa, +0x80,0x36,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x32,0xa, 0x92,0xbe,0x34,0x13,0x88,0x40, +0xc, 0xbe,0x34,0x75,0x30,0x28,0x1a,0xbe,0x34,0x7e,0xf4,0x50,0x14,0x7e,0xb3,0x16, +0xb7,0x4, 0x7a,0xb3,0x16,0xb7,0xb4,0xa, 0xd, 0x74,0x1, 0x7a,0xb3,0x16,0xb6,0x80, +0xf, 0xe4,0x7a,0xb3,0x16,0xb7,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba,0x38,0xc2, +0x7e,0xa3,0x16,0xb6,0xbe,0xa0,0x1, 0x78,0x7, 0x7e,0xb3,0x16,0xb5,0x4, 0x80,0x1, +0xe4,0x7a,0xb3,0x16,0xb5,0xbe,0xb0,0x0, 0x28,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb4, +0x4c,0xaa,0x78,0xd, 0xe4,0x7a,0xb3,0x16,0xb5,0x7a,0xb3,0x16,0xb4,0x7a,0xb3,0x16, +0xb7,0x74,0x1, 0x7a,0xb3,0xf, 0xd2,0x12,0x66,0x93,0x12,0x6b,0x7c,0x7e,0xb3,0x11, +0xc, 0xb4,0x1, 0x31,0xbe,0xf0,0x1, 0x78,0x2c,0x7e,0xb3,0xd, 0xfc,0x70,0x26,0x12, +0x46,0xe9,0x7e,0xb3,0xd, 0xf7,0x70,0x19,0x7e,0x73,0x11,0x95,0xa, 0x37,0x9, 0x73, +0xf, 0x29,0x7a,0x73,0x10,0x4a,0xe4,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0x11,0xc, 0x80, +0x6, 0x6c,0xff,0x80,0x2, 0x6c,0xff,0x12,0x65,0xe4,0x12,0x6b,0xde,0x7c,0xbf,0xda, +0x79,0x22,0xca,0x3b,0x75,0x21,0x0, 0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4, +0x12,0x6d,0xe0,0xe4,0x7a,0xb3,0xd, 0x16,0x7a,0xb3,0xd, 0x17,0x7e,0xb3,0xf, 0xd2, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x41,0x68,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, +0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12, +0x6d,0xe0,0x7e,0x37,0xf, 0xd6,0x7e,0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4c,0x7e,0x14, +0x13,0xb6,0x6c,0x11,0x12,0x4f,0x1, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, +0x30,0x7e,0xb3,0x10,0x2b,0x7e,0x27,0xf, 0x4a,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x1, +0x7c,0xdb,0x6c,0xff,0x6c,0xaa,0x80,0x51,0x6c,0xcc,0x80,0x47,0x7c,0xbf,0xc4,0x23, +0x54,0x1f,0x7c,0x6b,0x7a,0x61,0x21,0xa, 0x2a,0x9, 0x72,0x13,0xc0,0x7e,0x50,0x2, +0xac,0x5f,0x19,0x72,0xa, 0xb1,0xa, 0x1c,0x9, 0x71,0x13,0xb6,0x19,0x72,0xa, 0xb2, +0x7c,0xbf,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c, +0x79,0xa, 0x46,0x2e,0x44,0xb, 0x79,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, +0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xb5,0xb, 0xa0,0xbc,0xda,0x38,0xab,0x7a,0xf3,0xd, +0x16,0x7e,0x34,0x13,0xb6,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34, +0x13,0xc0,0x7e,0x24,0x0, 0xa, 0x74,0xff,0x12,0x6d,0xe0,0x7e,0x37,0xf, 0xd6,0x7e, +0xb3,0x10,0x2c,0x7e,0x27,0xf, 0x4e,0x7e,0x14,0x13,0xb6,0x7e,0x10,0x1, 0x12,0x4f, +0x1, 0x7c,0xeb,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x7e,0xb3,0x10,0x2b,0x7e, +0x27,0xf, 0x4e,0x7e,0x14,0x13,0xc0,0x12,0x4f,0x1, 0x7c,0xdb,0x6c,0xff,0x6c,0xaa, +0x80,0xe, 0x6c,0xcc,0x80,0x4, 0xb, 0xf0,0xb, 0xc0,0xbc,0xec,0x38,0xf8,0xb, 0xa0, +0xbc,0xda,0x38,0xee,0x7a,0xf3,0xd, 0x17,0xda,0x3b,0x22,0xca,0xf8,0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x74,0x1, 0x7a,0xb3,0x10, +0x3c,0x7a,0xb3,0x10,0x4d,0x7a,0xb3,0x10,0xa5,0x7e,0xb3,0xf, 0x26,0x12,0x6e,0xa1, +0x12,0x63,0xde,0x7e,0xb3,0x10,0xa5,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x42,0x84,0x6d, +0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0x0, 0x64,0x7a,0x37,0xa, 0xaf,0xe4,0x7a,0xb3, +0x0, 0xff,0x12,0x6c,0x3a,0x12,0x45,0xdf,0x12,0x6a,0xf4,0x6c,0xff,0x1a,0x2f,0x7e, +0x34,0x0, 0x18,0xad,0x32,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b, +0x35,0xb, 0x38,0x30,0x1a,0x2f,0x3e,0x24,0x59,0x32,0x13,0x9c,0xb, 0xf0,0xbe,0xf0, +0xd, 0x78,0xda,0x12,0x6b,0x3a,0x12,0x6c,0x90,0x12,0x68,0xf7,0x6c,0xff,0x1a,0x3f, +0x3e,0x34,0x49,0x23,0x13,0x9c,0x1a,0xf, 0x7e,0x14,0x0, 0x18,0xad,0x10,0x7d,0x31, +0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e,0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, +0xf0,0xbe,0xf0,0xd, 0x78,0xd8,0x12,0x69,0xca,0x12,0x48,0xe6,0x7e,0xb3,0xf, 0xd3, +0x70,0x9, 0x7e,0xb3,0xf, 0xd2,0x70,0x3, 0x2, 0x41,0x93,0x12,0x1f,0x7b,0x12,0x33, +0x70,0x7a,0xb3,0xf, 0x25,0x12,0x6d,0xff,0x12,0x6c,0xf6,0x70,0x3, 0x2, 0x41,0x93, +0x12,0x44,0xc9,0x7e,0x37,0xf, 0xda,0x12,0x8, 0x6, 0x12,0x6e,0xa7,0x12,0x4e,0x57, +0x12,0x0, 0x6e,0x50,0x3, 0x12,0x2f,0xc6,0x7e,0xb3,0x11,0x15,0xb4,0x1, 0x4, 0xe4, +0x12,0x6e,0x92,0x12,0x68,0xca,0x12,0x66,0xcc,0x12,0x19,0x6d,0x12,0x6, 0x11,0x12, +0x6e,0xc6,0x12,0x65,0x2c,0x12,0x36,0xb7,0x12,0x55,0xe4,0x12,0x1c,0x95,0x12,0x49, +0xd0,0x2, 0x41,0x93,0x12,0x0, 0x1e,0x12,0x6e,0x1b,0xda,0xf8,0x22,0xca,0x79,0x7e, +0x34,0x0, 0x60,0x12,0x69,0x78,0x7c,0xab,0x7a,0xa1,0x6a,0xbe,0xa0,0x8, 0x40,0x3, +0x2, 0x43,0xab,0xbe,0xa0,0x4, 0x50,0x5, 0x7e,0xe0,0x6, 0x80,0x3, 0x7e,0xe0,0x5, +0x7c,0xba,0xbe,0xb0,0x8, 0x50,0x48,0x7e,0xa0,0x3, 0xa4,0x90,0x42,0xbf,0x73,0x2, +0x42,0xd7,0x2, 0x42,0xdc,0x2, 0x42,0xe1,0x2, 0x42,0xe6,0x2, 0x42,0xeb,0x2, 0x42, +0xf0,0x2, 0x42,0xf5,0x2, 0x42,0xfa,0x7e,0xf0,0x5e,0x80,0x26,0x7e,0xf0,0x5f,0x80, +0x21,0x7e,0xf0,0x61,0x80,0x1c,0x7e,0xf0,0x63,0x80,0x17,0x7e,0xf0,0x65,0x80,0x12, +0x7e,0xf0,0x67,0x80,0xd, 0x7e,0xf0,0x69,0x80,0x8, 0x7e,0xf0,0x6a,0x80,0x3, 0x7e, +0xf0,0x64,0x6c,0xaa,0xa, 0x3a,0x9, 0xb3,0x11,0xe9,0xa, 0xb, 0x7e,0xb3,0x10,0xff, +0xa, 0x1b,0x2d,0x1, 0x7c,0xb1,0x7c,0x1a,0x2e,0x10,0x21,0xa5,0xf7,0x7c,0x9b,0xa, +0x9, 0x5e,0x4, 0x0, 0x1, 0xbe,0x4, 0x0, 0x1, 0x78,0x1c,0x7c,0x79,0xac,0x7f,0x7e, +0x50,0x3, 0xac,0x5f,0xe, 0x24,0xe, 0x24,0x2d,0x32,0x7c,0xba,0x3e,0xb0,0x24,0x25, +0xa, 0xb, 0x1b,0x8, 0x30,0x80,0xd, 0xac,0x9f,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, +0xb, 0x1b,0x8, 0x40,0x7c,0xba,0x3e,0xb0,0x24,0x25,0xa, 0xb, 0xb, 0x8, 0xf0,0x7e, +0x4, 0x0, 0xa, 0x7d,0x3f,0x8d,0x30,0x8d,0x30,0x7c,0x75,0xbe,0x70,0x0, 0x40,0x14, +0xbc,0xe7,0x28,0x10,0x7e,0xc4,0x0, 0x64,0x7d,0xdf,0x8d,0xdc,0x7d,0xd, 0x9d,0x1, +0x7c,0x61,0x80,0x17,0xbc,0xe7,0x38,0x19,0xbe,0x70,0x9, 0x38,0x14,0x7e,0xe4,0x0, +0x64,0x8d,0xfe,0x7d,0x2f,0xb, 0x24,0x9d,0x21,0x7c,0x65,0xa, 0x2a,0x19,0x62,0x11, +0xe9,0xb, 0xa0,0xbe,0xa0,0x4, 0x68,0x3, 0x2, 0x43,0x4, 0xda,0x79,0x22,0xca,0x3b, +0x7c,0xeb,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x38,0x3, 0x2, 0x44,0xc0,0x7c,0xbe, +0x12,0xd, 0x46,0x7e,0xb3,0xd, 0xfc,0x60,0x1e,0x7e,0xb3,0x15,0x54,0x70,0x8, 0x7e, +0xb3,0x15,0x55,0x70,0x2, 0x80,0x10,0x7e,0x73,0xd, 0xf7,0xbe,0x70,0x1, 0x28,0xc, +0xe5,0x12,0xbe,0xb0,0x8, 0x28,0x5, 0x7e,0xf0,0x1, 0x80,0x1e,0x7e,0xf0,0x1, 0xbe, +0x73,0xf, 0x1c,0x78,0x6, 0x6c,0xee,0x6c,0xff,0x80,0xf, 0x9e,0x73,0x15,0x54,0xbe, +0x73,0xf, 0x1c,0x78,0x5, 0x7e,0xe0,0x2, 0x6c,0xff,0x4c,0xff,0x78,0x5, 0x7c,0xbe, +0x12,0xd, 0x46,0xe5,0x10,0x7a,0xb3,0xd, 0xf7,0x7e,0x31,0x10,0x74,0x2, 0xac,0x3b, +0x7e,0x24,0x15,0x2b,0x7e,0x34,0xd, 0x18,0x12,0x6d,0x3c,0x75,0x12,0x64,0x75,0x13, +0x64,0x6c,0xee,0x80,0x67,0x6c,0xdd,0x80,0x59,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, +0x18,0xa, 0x27,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0xa, 0x37,0x9d,0x32,0x12, +0x6d,0xd0,0x7c,0xb7,0xf5,0x21,0x74,0x2, 0xac,0xbd,0x9, 0x75,0xd, 0x19,0xa, 0x27, +0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x19,0xa, 0x37,0x9d,0x32,0x12,0x6d,0xd0,0x7c, +0xc7,0xe5,0x21,0xbe,0xb0,0x0, 0x28,0xa, 0xe5,0x12,0xbe,0xb1,0x21,0x28,0x3, 0x85, +0x21,0x12,0xbe,0xc0,0x0, 0x28,0x9, 0xe5,0x13,0xbc,0xbc,0x28,0x3, 0x7a,0xc1,0x13, +0xb, 0xd0,0x7e,0x73,0xd, 0xf7,0xbc,0x7d,0x38,0x9f,0xb, 0xe0,0x7e,0x73,0xd, 0xf7, +0xbc,0x7e,0x38,0x91,0xe5,0x12,0xb4,0x64,0x3, 0x75,0x12,0x0, 0xe5,0x13,0xb4,0x64, +0x3, 0x75,0x13,0x0, 0xe5,0x13,0xbe,0xb1,0x12,0x28,0xb, 0x85,0x13,0x12,0x80,0x6, +0x75,0x12,0x64,0x75,0x13,0x64,0xda,0x3b,0x22,0x12,0x59,0x46,0x70,0x3, 0x2, 0x45, +0x50,0x75,0x6f,0x14,0x75,0x6e,0x1, 0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, +0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e, +0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19, +0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, 0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb, +0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4, +0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e,0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22, +0xe5,0x6e,0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x45,0xdc,0x15,0x6f,0xe5,0x6f,0x60,0x79, +0x6c,0x11,0x80,0x2d,0x7c,0xb1,0x54,0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71, +0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c,0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54, +0x1f,0xa, 0x1b,0x2e,0x14,0xd, 0x68,0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xb, +0x10,0x7e,0x3, 0xd, 0xf7,0xbc,0x1, 0x38,0xcb,0x6c,0x11,0x80,0x32,0x7c,0xb1,0x54, +0x7, 0xa, 0x3b,0x2e,0x34,0x6e,0x8a,0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7c, +0xab,0x6e,0xa0,0xff,0x7c,0xb1,0xc4,0x23,0x54,0x1f,0xa, 0x1b,0x2e,0x14,0xb, 0x79, +0x7e,0x19,0x0, 0x5c,0xa, 0x7a,0x19,0x0, 0xe4,0x7a,0xb3,0xd, 0x16,0xb, 0x10,0x7e, +0x3, 0xd, 0x16,0xbc,0x1, 0x38,0xc6,0xe4,0x22,0x75,0x6e,0x0, 0xe5,0x21,0x22,0xca, +0x79,0x7e,0x74,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x20,0xe0,0x3, 0x2, 0x46,0xe6,0x54, +0xfe,0x7a,0xb3,0x10,0xfe,0x9, 0x77,0x0, 0x2, 0xbe,0x73,0xf, 0x52,0x68,0x16,0x7a, +0x73,0xf, 0x52,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e, +0x34,0x7a,0x37,0xf, 0x48,0x7e,0x79,0x70,0xbe,0x73,0xf, 0x5c,0x68,0xe, 0x7a,0x73, +0xf, 0x5c,0xa, 0x37,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x54,0x9, 0x77,0x0, 0x1, +0xa, 0x37,0xbe,0x37,0xf, 0x56,0x68,0x4, 0x7a,0x37,0xf, 0x56,0x7e,0x27,0xf, 0x5d, +0x1e,0x24,0x1e,0x24,0x1e,0x24,0x1e,0x24,0x9, 0x77,0x0, 0x5, 0xa, 0x37,0xbd,0x32, +0x68,0xc, 0x3e,0x34,0x3e,0x34,0x3e,0x34,0x3e,0x34,0x7a,0x37,0xf, 0x5d,0x9, 0x77, +0x0, 0x8, 0xbe,0x73,0x11,0x11,0x68,0x24,0x7a,0x73,0x11,0x11,0xbe,0x70,0xf, 0x40, +0x5, 0xe4,0x19,0xb7,0x0, 0x8, 0x9, 0x77,0x0, 0x8, 0xa, 0x37,0x2e,0x34,0x6d,0xf0, +0x7a,0x71,0x82,0x7a,0x61,0x83,0xe4,0x93,0x7a,0xb3,0x11,0x10,0x9, 0x77,0x0, 0x9, +0xbe,0x73,0x11,0x13,0x68,0x8, 0x7a,0x73,0x11,0x13,0x7a,0x73,0x11,0x12,0x9, 0x77, +0x0, 0x7, 0xbe,0x73,0x11,0x14,0x68,0x4, 0x7a,0x73,0x11,0x14,0x9, 0xb7,0x0, 0xb, +0xbe,0xb1,0x51,0x68,0x5, 0xf5,0x51,0x12,0x6c,0xde,0x9, 0x77,0x0, 0x25,0xa, 0x37, +0xbe,0x37,0x11,0xd, 0x68,0x4, 0x7a,0x37,0x11,0xd, 0x9, 0x77,0x0, 0x6, 0xbe,0x73, +0x11,0xf, 0x68,0x4, 0x7a,0x73,0x11,0xf, 0x9, 0x77,0x0, 0x24,0xbe,0x73,0x11,0x15, +0x68,0x4, 0x7a,0x73,0x11,0x15,0xda,0x79,0x22,0xca,0x79,0xe4,0x6c,0xaa,0xa, 0x4a, +0x19,0xb4,0xd, 0x68,0xb, 0xa0,0xbe,0xa0,0x3, 0x78,0xf3,0xe4,0x7a,0xb3,0xd, 0xf7, +0x7a,0xb3,0xd, 0xf8,0x7a,0xb3,0xd, 0xf9,0x7a,0xb3,0xd, 0xfa,0x7e,0xb3,0xf, 0xd3, +0xb4,0x1, 0x2, 0x80,0x3, 0x2, 0x47,0xef,0x7e,0xb3,0x10,0x2b,0xf5,0x21,0x7e,0xb3, +0x10,0x2c,0xf5,0x22,0x7e,0x37,0xf, 0x56,0x7a,0x35,0x23,0x7e,0x37,0xf, 0x58,0x7a, +0x35,0x25,0x7e,0x37,0xf, 0x5a,0x7a,0x35,0x27,0x7e,0x34,0x0, 0x14,0x7a,0x35,0x2d, +0x7e,0x37,0xf, 0xda,0x7e,0x24,0x0, 0x21,0x7e,0x14,0x0, 0x29,0x7e,0x4, 0x9, 0xc8, +0x12,0x4d,0xa8,0xe5,0x29,0x7a,0xb3,0xd, 0xf7,0xe5,0x2a,0x7a,0xb3,0xd, 0xf8,0xe5, +0x2b,0x7a,0xb3,0xd, 0xf9,0xe5,0x2c,0x7a,0xb3,0xd, 0xfa,0x6c,0xaa,0x80,0x6c,0x7e, +0x53,0xd, 0xf7,0xbc,0x5a,0x28,0x44,0x7c,0xba,0xc4,0x23,0x54,0x1f,0x7c,0x7b,0x7c, +0xba,0x54,0x7, 0x7e,0x44,0x0, 0x1, 0x60,0x5, 0x3e,0x44,0x14,0x78,0xfb,0x7c,0x69, +0x7e,0x30,0x2, 0xac,0x3a,0x49,0x71,0x9, 0xc8,0x7d,0x7, 0xa, 0x0, 0x7c,0x41,0x19, +0x41,0xd, 0x18,0x7d,0x7, 0x7c,0x41,0x19,0x41,0xd, 0x19,0xa, 0x47,0x2e,0x44,0xd, +0x68,0x7e,0x49,0xb0,0x4c,0xb6,0x7a,0x49,0xb0,0x80,0x1e,0xa, 0x15,0xa, 0x2a,0x9d, +0x21,0x3e,0x24,0x49,0x72,0x9, 0xf0,0x7d,0x17,0xa, 0x12,0x7c,0xb3,0x19,0xb2,0xd, +0x40,0x7d,0x17,0x7c,0xb3,0x19,0xb2,0xd, 0x41,0xb, 0xa0,0x7e,0xb3,0xd, 0xf8,0xa, +0x2b,0x7e,0xb3,0xd, 0xf7,0xa, 0x1b,0x2d,0x12,0xa, 0x2a,0xbd,0x21,0x48,0x80,0xda, +0x79,0x22,0xc2,0xd5,0x7c,0xb4,0x30,0xe7,0x8, 0xb2,0xd5,0x6e,0x24,0xff,0xff,0xb, +0x24,0x7c,0xb6,0x30,0xe7,0x12,0xb2,0xd5,0x6e,0x34,0xff,0xff,0xb, 0x34,0x8d,0x32, +0x6e,0x24,0xff,0xff,0xb, 0x24,0x80,0x2, 0x8d,0x32,0x30,0xd5,0x6, 0x6e,0x34,0xff, +0xff,0xb, 0x34,0x22,0x7d,0x51,0xad,0x3, 0x7d,0x2, 0x7d,0x21,0xad,0x5, 0x2d,0x12, +0xad,0x35,0x2d,0x21,0x22,0x7d,0x2, 0xad,0x31,0xad,0x10,0x2d,0x21,0x22,0x6d,0x0, +0x74,0x10,0x4d,0x0, 0x78,0xb, 0x4d,0x22,0x78,0x27,0x8d,0x31,0x7d,0x12,0x6d,0x22, +0x22,0x7d,0x43,0x7d,0x32,0x6d,0x22,0x2f,0x11,0x2d,0x44,0x50,0x2, 0xa5,0xf, 0xbf, +0x10,0x40,0x4, 0x9f,0x10,0xb, 0x90,0x14,0x78,0xed,0x7f,0x1, 0x6d,0x22,0x7d,0x34, +0x22,0x7d,0x41,0x7d,0x13,0x8d,0x24,0x7d,0x2, 0x2f,0x0, 0x40,0x4, 0xbd,0x4, 0x40, +0x4, 0x9d,0x4, 0xb, 0x14,0x14,0x78,0xf1,0x7d,0x23,0x7d,0x31,0x7d,0x10,0x6d,0x0, +0x22,0xc2,0xd5,0x7c,0xb0,0x30,0xe7,0x8, 0xb2,0xd5,0x9f,0x22,0x9f,0x20,0x7f,0x2, +0x7c,0xb4,0x30,0xe7,0x13,0xb2,0xd5,0x9f,0x22,0x9f,0x21,0x7f,0x12,0x12,0x48,0x40, +0x9f,0x22,0x9f,0x20,0x7f,0x2, 0x80,0x3, 0x12,0x48,0x40,0x30,0xd5,0x6, 0x9f,0x22, +0x9f,0x21,0x7f,0x12,0x22,0x6c,0xaa,0x4d,0x11,0x68,0x1a,0x1e,0x54,0x68,0xe, 0xb, +0x38,0x20,0x1b,0x18,0x20,0xb, 0x35,0xb, 0x15,0x1b,0x54,0x78,0xf2,0x50,0x6, 0x7e, +0x39,0x40,0x7a,0x19,0x40,0x22,0xca,0x79,0x6c,0xee,0x12,0x65,0x6b,0x7d,0x43,0x6c, +0xaa,0x6c,0x77,0x7e,0x30,0x6, 0xac,0x37,0x2e,0x14,0x6c,0x1c,0x7e,0x4, 0x0, 0xff, +0xb, 0xa, 0x20,0xbd,0x24,0x48,0x4, 0x7c,0xa7,0x80,0x7, 0xb, 0x70,0xbe,0x70,0x5, +0x40,0xe1,0xbe,0xa0,0x5, 0x78,0x3, 0x2, 0x49,0xb7,0x7e,0x63,0xd, 0xf7,0xbe,0x60, +0x0, 0x38,0x3, 0x2, 0x49,0xb7,0x6c,0x77,0x2, 0x49,0xac,0x6c,0xff,0x6c,0x66,0x80, +0x41,0x7e,0x90,0x30,0xac,0x96,0x7e,0x50,0x2, 0xac,0x57,0x2d,0x24,0x2e,0x27,0xf, +0xda,0xb, 0x28,0x20,0x7e,0x30,0x6, 0xac,0x3a,0x7d,0xf1,0x2e,0xf4,0x6c,0x1e,0x7e, +0xe4,0x0, 0xff,0xb, 0x7a,0x0, 0xbd,0x2, 0x18,0x14,0xb, 0xf0,0x2e,0x14,0x6c,0x20, +0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x28,0xe, 0x80,0x2, 0x6c,0xff, +0xb, 0x60,0x7e,0xb3,0x10,0x2b,0xbc,0xb6,0x38,0xb7,0x7e,0x50,0x6, 0xac,0x5a,0x7d, +0x12,0x2e,0x14,0x6c,0x20,0x7a,0x31,0x82,0x7a,0x21,0x83,0xe4,0x93,0xbc,0xbf,0x38, +0x17,0xb, 0xe0,0x2e,0x24,0x6c,0x21,0x7a,0x51,0x82,0x7a,0x41,0x83,0xe4,0x93,0xbc, +0xbe,0x38,0x7, 0x75,0x14,0x40,0x80,0xf, 0x6c,0xee,0xb, 0x70,0x7e,0xb3,0x10,0x2c, +0xbc,0xb7,0x28,0x3, 0x2, 0x49,0x2b,0xe5,0x15,0x25,0x14,0xf5,0x14,0xbe,0xb0,0x0, +0x28,0xb, 0x15,0x14,0xe4,0x7a,0xb3,0xf, 0xd3,0x7a,0xb3,0xf, 0xd2,0xda,0x79,0x22, +0xca,0x3b,0x7e,0x73,0xd, 0xfb,0x7a,0x73,0xd, 0xfc,0x7e,0xa3,0xf, 0x1b,0x7a,0xa3, +0xf, 0x1c,0xe4,0x7a,0xb3,0xf, 0x1f,0x7e,0x37,0x11,0xd, 0x4d,0x33,0x78,0x3f,0xbe, +0xa0,0x0, 0x28,0x8, 0xe4,0x7a,0xb3,0x16,0xae,0x2, 0x4a,0x97,0x7e,0xb3,0x11,0xf, +0x20,0xe0,0x3, 0x2, 0x4a,0x97,0x7e,0xb3,0x11,0x14,0xbe,0xb3,0x16,0xae,0x28,0x3, +0x2, 0x4a,0x97,0xe4,0x7a,0xb3,0x16,0xae,0x7e,0x24,0x0, 0x1, 0x7a,0x27,0x11,0xd, +0x74,0x1, 0x7a,0xb3,0x10,0xa3,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x80,0x69,0xbe,0x34, +0x0, 0x1, 0x78,0x22,0xbe,0xa0,0x0, 0x28,0x5e,0x6d,0x22,0x7a,0x27,0x11,0xd, 0xe4, +0x7a,0xb3,0x10,0xa3,0x7a,0xb3,0x16,0xae,0x74,0x23,0x7a,0xb3,0x16,0xb1,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x80,0x41,0xbe,0x34,0x0, 0x3, 0x78,0x3b,0x6d,0x66,0x7a,0x67, +0x10,0x1, 0x7e,0x74,0xd, 0xac,0x7a,0x77,0xa, 0xaf,0x12,0x6e,0xcc,0x12,0x60,0x22, +0x12,0x58,0x63,0x6d,0x33,0x7a,0x37,0x11,0xd, 0xe4,0x7a,0xb3,0x10,0xa3,0x74,0x1, +0x7a,0xb3,0x16,0xb0,0x7a,0x67,0x10,0x1, 0x7a,0x77,0xa, 0xaf,0x75,0x9a,0x7f,0xa9, +0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0x7e,0xb3,0x16,0xb0,0x70,0x6, 0x12,0x5b,0x69, +0x12,0x64,0x24,0xda,0x3b,0x22,0x7d,0x53,0x9f,0x11,0xbe,0x54,0x0, 0x0, 0x40,0x2d, +0xbe,0x54,0x0, 0x3f,0x38,0x27,0x7e,0x24,0x0, 0x3f,0x9d,0x25,0x7e,0x34,0x1, 0x7c, +0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, 0x30,0x48,0x4, +0x7e,0x18,0x0, 0x30,0x7e,0x8, 0x0, 0x30,0x9f,0x1, 0x7f,0x10,0x22,0xbe,0x54,0x5, +0x80,0x40,0x29,0xbe,0x54,0x5, 0xaa,0x38,0x23,0x7d,0x25,0x9e,0x24,0x5, 0x7f,0x7e, +0x34,0x1, 0x7c,0xad,0x32,0x6d,0x22,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x18,0x0, +0x30,0x48,0x4, 0x7e,0x18,0x0, 0x2f,0x2e,0x18,0x4, 0xd0,0x22,0xbe,0x54,0x5, 0xaa, +0x28,0x19,0x7d,0x25,0x9e,0x24,0x5, 0x9f,0x7e,0x34,0x1, 0x7c,0xad,0x32,0x6d,0x22, +0x7c,0x76,0x7c,0x65,0x1a,0x24,0x2e,0x18,0x5, 0x0, 0x22,0xbe,0x54,0x2, 0xdf,0x38, +0x8, 0x7e,0x34,0x2, 0xdf,0x9d,0x35,0x80,0x6, 0x7d,0x35,0x9e,0x34,0x2, 0xe0,0x6d, +0x22,0x7e,0x14,0x0, 0xe2,0x12,0x48,0x35,0x7c,0x76,0x7c,0x65,0x1a,0x24,0xbe,0x54, +0x2, 0xdf,0x38,0xa, 0x7e,0x8, 0x2, 0x7f,0x9f,0x1, 0x7f,0x10,0x80,0x4, 0x2e,0x18, +0x2, 0x80,0xbe,0x18,0x0, 0x30,0x58,0x5, 0x7e,0x18,0x0, 0x30,0x22,0xbe,0x18,0x4, +0xd0,0x8, 0x4, 0x7e,0x18,0x4, 0xd0,0x22,0x7e,0x34,0x10,0x7e,0x7e,0x24,0x0, 0x81, +0xe4,0x12,0x6d,0xe0,0x74,0xc, 0x7a,0xb3,0x10,0x80,0x7a,0xb3,0x10,0x81,0x74,0x7, +0x7a,0xb3,0x10,0x82,0x74,0xf, 0x7a,0xb3,0x10,0x7e,0x74,0x3c,0x7a,0xb3,0x10,0x7f, +0x74,0xa0,0x7a,0xb3,0x10,0x83,0x74,0x1e,0x7a,0xb3,0x10,0x85,0x74,0x9, 0x7a,0xb3, +0x10,0x86,0x74,0x1e,0x7a,0xb3,0x10,0x87,0xe4,0x7a,0xb3,0x10,0x88,0x7a,0xb3,0x10, +0x89,0xf5,0x52,0xf5,0x51,0x7a,0xb3,0x10,0xa3,0x74,0x1, 0x7a,0xb3,0x10,0x84,0x7a, +0xb3,0x10,0xa2,0x7a,0xb3,0x10,0xa5,0x74,0x9, 0x7a,0xb3,0x10,0xa4,0x74,0xf3,0x7a, +0xb3,0x10,0xa6,0x74,0xb, 0x7a,0xb3,0x10,0xad,0x12,0x6e,0xb9,0xa, 0x36,0x7a,0x73, +0x10,0xa7,0x12,0x6e,0xb9,0x7a,0x73,0x10,0xa8,0x12,0x6e,0xbe,0xa, 0x36,0x7a,0x73, +0x10,0x9f,0x12,0x6e,0xbe,0x7a,0x73,0x10,0xa0,0xe4,0x7a,0xb3,0x10,0xae,0x74,0x1f, +0x7a,0xb3,0x10,0xcf,0xe4,0x7a,0xb3,0x10,0xb0,0x12,0x6e,0xd, 0x7a,0xb3,0x10,0xaf, +0x12,0x6d,0xe, 0x7a,0xb3,0x10,0xa1,0x7e,0x34,0x10,0x8e,0x7e,0x24,0x0, 0x8, 0x74, +0xff,0x12,0x6d,0xe0,0x74,0x9, 0x7a,0xb3,0x10,0x8e,0x74,0x1, 0x7a,0xb3,0x10,0x8f, +0x22,0xca,0x3b,0x6d,0x11,0x7d,0x1, 0x7d,0x21,0x7e,0xa0,0x2, 0x7e,0x70,0x2, 0x6c, +0x66,0x80,0x39,0x6c,0x99,0x80,0x2b,0x7e,0xd0,0x30,0xac,0xd6,0x7e,0xf0,0x2, 0xac, +0xf9,0x7d,0xf7,0x2d,0xf6,0x2e,0xf7,0xf, 0xda,0xb, 0xf8,0xf0,0xbe,0xf4,0x0, 0x14, +0x8, 0x4, 0xb, 0x4, 0x80,0x8, 0xbe,0xf4,0xff,0xec,0x58,0x2, 0xb, 0x24,0xb, 0x14, +0x2c,0x97,0x7e,0xb3,0x10,0x2c,0xbc,0xb9,0x38,0xcd,0x2c,0x6a,0x7e,0xb3,0x10,0x2b, +0xbc,0xb6,0x38,0xbf,0x7e,0x54,0x0, 0x3, 0xad,0x51,0x7d,0x35,0x1e,0x34,0x1e,0x34, +0xbd,0x30,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb8,0x7e,0xb3,0x16,0xb9,0xbe,0xb0,0x5, +0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb9,0x80,0x39,0xe4,0x7a,0xb3,0x16,0xb9,0x75,0x72, +0x1, 0x80,0x2f,0xbd,0x32,0x50,0x1f,0xe4,0x7a,0xb3,0x16,0xb9,0x7e,0xb3,0x16,0xb8, +0xbe,0xb0,0x5, 0x50,0x7, 0x4, 0x7a,0xb3,0x16,0xb8,0x80,0x16,0xe4,0x7a,0xb3,0x16, +0xb8,0x75,0x72,0x2, 0x80,0xc, 0xe4,0x7a,0xb3,0x16,0xb8,0x7a,0xb3,0x16,0xb9,0x75, +0x72,0x0, 0xe5,0x72,0xda,0x3b,0x22,0x7d,0xf3,0xbe,0xf4,0x0, 0x0, 0x40,0x2d,0xbe, +0xf4,0x0, 0x3f,0x38,0x27,0x7e,0x44,0x0, 0x3f,0x9d,0x4f,0x7e,0x54,0x1, 0x7c,0xad, +0x54,0x6d,0x44,0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x2f,0x40,0x4, 0x7e,0x28,0x0, +0x2f,0x7e,0x18,0x0, 0x2f,0x9f,0x12,0x7f,0x21,0x2, 0x4d,0xa5,0xbe,0xf4,0x3, 0x0, +0x40,0x22,0x7d,0x4f,0x9e,0x44,0x3, 0x0, 0x7e,0x54,0x1, 0x7c,0xad,0x54,0x6d,0x44, +0x7c,0xba,0x7c,0xa9,0xbe,0x28,0x0, 0x2f,0x40,0x4, 0x7e,0x28,0x0, 0x2e,0x2e,0x28, +0x2, 0xa1,0x80,0x51,0xbe,0xf4,0x1, 0x9f,0x38,0x8, 0x7e,0x54,0x1, 0x9f,0x9d,0x5f, +0x80,0x6, 0x7d,0x5f,0x9e,0x54,0x1, 0xa0,0x6d,0x44,0x7e,0x14,0x0, 0xe4,0x7f,0x12, +0x12,0x48,0x35,0x7f,0x21,0x7c,0xba,0x7c,0xa9,0xa, 0x48,0xbe,0xf4,0x1, 0x9f,0x38, +0xa, 0x7e,0x18,0x1, 0x67,0x9f,0x12,0x7f,0x21,0x80,0x4, 0x2e,0x28,0x1, 0x68,0xbe, +0x28,0x0, 0x2f,0x50,0x6, 0x7e,0x28,0x0, 0x2f,0x80,0xa, 0xbe,0x28,0x2, 0xa1,0x28, +0x4, 0x7e,0x28,0x2, 0xa1,0x7d,0x35,0x22,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, +0x56,0xf5,0xba,0x7e,0x55,0x2d,0xf5,0xbb,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd,0xa, 0x50, +0xf5,0xc1,0x9, 0xb2,0x0, 0x1, 0x44,0xa0,0xf5,0xc3,0x7e,0x29,0xa0,0xe5,0xc4,0x54, +0xe0,0x4c,0xba,0xf5,0xc4,0x75,0xc5,0x40,0x75,0xc5,0x1, 0x49,0x32,0x0, 0x2, 0x7c, +0xb7,0xf5,0xc6,0x75,0xc5,0x2, 0xa, 0x56,0xf5,0xc6,0x75,0xc5,0x3, 0x49,0x32,0x0, +0x4, 0x6e,0x34,0xff,0xff,0xb, 0x34,0x7d,0x53,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75, +0xc5,0x4, 0x1a,0x56,0x5e,0x54,0x0, 0xff,0xf5,0xc6,0x75,0xc5,0x5, 0x49,0x2, 0x0, +0x6, 0x7c,0xb1,0xf5,0xc6,0x75,0xc5,0x6, 0xa, 0x50,0xf5,0xc6,0x43,0xc2,0x9, 0x2, +0x4e,0x29,0x43,0xc2,0x9, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, +0x75,0xc5,0xa, 0xe5,0xc6,0x19,0xb1,0x0, 0x2, 0x75,0xc5,0xb, 0xe5,0xc6,0x19,0xb1, +0x0, 0x3, 0x75,0xc5,0xc, 0xe5,0xc6,0x7a,0x19,0xb0,0x75,0xc5,0xd, 0xe5,0xc6,0x19, +0xb1,0x0, 0x1, 0xa9,0xc6,0xcb,0x22,0xca,0x3b,0x6c,0xff,0x7e,0xb3,0xf, 0xd2,0x60, +0x6, 0x7e,0xb3,0xf, 0xd3,0x70,0x18,0x7e,0x34,0xd, 0x68,0x7e,0x24,0x0, 0x3, 0xe4, +0x12,0x6d,0xe0,0x7e,0x34,0xb, 0x79,0x7e,0x24,0x0, 0xd, 0xe4,0x12,0x6d,0xe0,0x6c, +0xee,0x80,0x6b,0x74,0x2, 0xac,0xbe,0x9, 0x75,0xd, 0x18,0x7a,0x71,0x21,0x9, 0x65, +0xd, 0x19,0x7a,0x61,0x22,0x7c,0xbe,0xc4,0x23,0x54,0x1f,0x7c,0xdb,0x7c,0xbe,0x54, +0x7, 0x7e,0x24,0x0, 0x1, 0x60,0x5, 0x3e,0x24,0x14,0x78,0xfb,0x7c,0xc5,0x7e,0x50, +0x30,0xac,0x57,0x7e,0x70,0x2, 0xac,0x67,0x2d,0x32,0x2e,0x37,0xf, 0xda,0xb, 0x38, +0x30,0xbe,0x37,0xf, 0x54,0x48,0x25,0xa, 0x3d,0x9, 0xb3,0xd, 0x68,0x5c,0xbc,0x68, +0x1b,0x7e,0x50,0x7, 0xac,0x5e,0x2e,0x24,0xd, 0x6b,0x7e,0x70,0x7, 0xac,0x7f,0x2e, +0x34,0xe, 0xd, 0x7e,0x14,0x0, 0x7, 0x12,0x6d,0x3c,0xb, 0xf0,0xb, 0xe0,0x7e,0x73, +0xd, 0xf7,0xbc,0x7e,0x38,0x8d,0x7a,0x73,0xd, 0xfb,0x7a,0xf3,0xf, 0x1b,0xda,0x3b, +0x22,0xca,0xf8,0x7c,0xb, 0x6c,0xaa,0x6d,0xee,0x7d,0xfe,0x6c,0xff,0x2, 0x4f,0x9c, +0x7e,0x90,0x2, 0xac,0x9f,0x7d,0xd4,0x2d,0xd3,0xb, 0xd8,0x40,0x4c,0x11,0x68,0x6, +0x6e,0x44,0xff,0xff,0xb, 0x44,0xbd,0x24,0x58,0x70,0xbe,0xa0,0xa, 0x50,0x6b,0x4c, +0xff,0x78,0x14,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0x6, 0x6e,0xe4,0xff,0xff,0xb, +0xe4,0xbd,0xe4,0x18,0x55,0x80,0x1c,0x7c,0xb0,0x14,0xbc,0xbf,0x78,0x20,0x7d,0xfd, +0x1b,0xf5,0xb, 0xf8,0xf0,0x4c,0x11,0x68,0x6, 0x6e,0xf4,0xff,0xff,0xb, 0xf4,0xbd, +0xf4,0x18,0x37,0xa, 0xca,0x2d,0xc1,0x7a,0xc9,0xf0,0xb, 0xa0,0x80,0x2c,0x7d,0xcd, +0x1b,0xc5,0xb, 0xc8,0xf0,0x49,0xed,0x0, 0x2, 0x4c,0x11,0x68,0xc, 0x6e,0xf4,0xff, +0xff,0xb, 0xf4,0x6e,0xe4,0xff,0xff,0xb, 0xe4,0xbd,0xf4,0x18,0xd, 0xbd,0xe4,0x18, +0x9, 0xa, 0xda,0x2d,0xd1,0x7a,0xd9,0xf0,0xb, 0xa0,0xb, 0xf0,0xbc,0xf, 0x28,0x3, +0x2, 0x4f,0x10,0x7c,0xba,0xda,0xf8,0x22,0xca,0x3b,0x6d,0x33,0x7d,0x73,0x75,0x25, +0x0, 0x7e,0x64,0x5, 0xe0,0x75,0x23,0x0, 0x80,0x3c,0x75,0x24,0x0, 0x7e,0x51,0x23, +0x74,0x18,0xac,0x5b,0x3e,0x24,0x7e,0x71,0x24,0x74,0x2, 0xac,0x7b,0x2d,0x32,0x2d, +0x36,0x7a,0x35,0x21,0x49,0x23,0x0, 0x30,0xb, 0x38,0x30,0x9d,0x32,0x12,0x6d,0xd0, +0xe5,0x24,0xb4,0x17,0x2, 0x1e,0x34,0xbd,0x37,0x28,0x2, 0x7d,0x73,0x5, 0x24,0xe5, +0x24,0xb4,0x18,0xc9,0x5, 0x23,0xe5,0x25,0xa, 0x2b,0x7e,0x33,0x10,0x7c,0xa, 0x13, +0x9d,0x12,0x1b,0x14,0xe5,0x23,0xa, 0x2b,0xbd,0x21,0x48,0xae,0xbe,0x74,0x0, 0x41, +0x28,0x11,0x7e,0x34,0x0, 0x73,0x7e,0xa3,0x16,0x54,0x74,0x12,0xa4,0x59,0x35,0x16, +0x65,0x80,0x26,0x7e,0x43,0x16,0x54,0x7e,0x50,0x12,0xac,0x45,0x49,0x32,0x16,0x65, +0xbd,0x37,0x50,0x6, 0x59,0x72,0x16,0x65,0x80,0xf, 0xbe,0x34,0x0, 0x0, 0x28,0x9, +0x2e,0x24,0x16,0x65,0x1b,0x34,0x1b,0x28,0x30,0xda,0x3b,0x22,0xca,0x7b,0xca,0x6b, +0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82, +0x12,0x0, 0x46,0x7e,0x35,0x1e,0xb, 0x34,0x7a,0x35,0x1e,0x7e,0xb3,0x0, 0xff,0x4, +0x7a,0xb3,0x0, 0xff,0x7e,0x35,0x1e,0xbe,0x34,0x3, 0xe8,0x40,0x13,0x6d,0x33,0x7a, +0x35,0x1e,0x7e,0xb3,0x16,0xae,0xbe,0xb0,0x64,0x50,0x5, 0x4, 0x7a,0xb3,0x16,0xae, +0x7e,0x73,0x16,0xb2,0xbe,0x73,0x16,0xb1,0x28,0xb, 0x7e,0xb3,0x16,0xb1,0x4, 0x7a, +0xb3,0x16,0xb1,0x80,0x6, 0x74,0x1, 0x7a,0xb3,0x16,0xb0,0x7e,0xb3,0x16,0xb3,0x60, +0x5, 0x14,0x7a,0xb3,0x16,0xb3,0x7e,0x37,0x10,0x1, 0xb, 0x34,0x7a,0x37,0x10,0x1, +0x7e,0x37,0xa, 0xaf,0xbe,0x37,0x10,0x1, 0x28,0x3, 0x12,0x6e,0xcf,0xd0,0x82,0xd0, +0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda, +0x7b,0x32,0x75,0x84,0x1, 0x7e,0x44,0x4, 0x1f,0xe4,0x7a,0x49,0xb0,0x1b,0x44,0x78, +0xf9,0x7e,0xf8,0x16,0xbc,0x75,0x6a,0x0, 0x75,0x8, 0x1, 0x75,0x9, 0x0, 0x75,0xa, +0x0, 0x75,0xc, 0x0, 0x75,0xd, 0x0, 0x75,0xe, 0x0, 0x75,0xf, 0x0, 0xc2,0x0, 0x75, +0x11,0x0, 0x75,0x12,0x64,0x75,0x13,0x64,0x75,0x14,0x0, 0x75,0x15,0x0, 0x75,0x16, +0x0, 0x75,0x19,0x1, 0x75,0x1e,0x0, 0x75,0x1f,0x0, 0x75,0x72,0x0, 0x75,0x6e,0x0, +0x75,0x73,0x0, 0x75,0x74,0x1, 0x75,0x70,0x18,0x75,0x71,0x0, 0x75,0x75,0x0, 0x75, +0x76,0x0, 0x75,0x6b,0x0, 0x75,0x6c,0xff,0x75,0x6d,0x0, 0x7e,0x4, 0x0, 0xff,0x7e, +0x14,0x6e,0xd6,0xb, 0xa, 0x40,0x5d,0x44,0x68,0x1a,0x69,0x20,0x0, 0x2, 0xb, 0xe, +0xb, 0x44,0x80,0xa, 0x7e,0xb, 0xb0,0x7a,0x29,0xb0,0xb, 0x24,0xb, 0xc, 0x1b,0x44, +0x78,0xf2,0x80,0xdf,0x2, 0x5b,0xce,0xca,0xd8,0xca,0x79,0x7c,0xdb,0xbe,0xd0,0x4, +0x78,0xc, 0x7e,0x34,0x10,0x2b,0x12,0x6b,0x17,0xa9,0xc7,0xea,0x80,0x27,0xbe,0xd0, +0x5, 0x78,0x1f,0xa9,0xd7,0xea,0x7e,0xe3,0x10,0x4a,0x7e,0xf3,0x10,0x4d,0xe4,0x7a, +0xb3,0x10,0x4d,0x12,0x66,0x1f,0x7a,0xb3,0x10,0x4a,0x74,0x1, 0x7a,0xb3,0x10,0x78, +0x80,0x3, 0xe4,0x80,0x4e,0x7e,0xb3,0x11,0x96,0x7e,0x34,0x10,0x2b,0xb4,0x1, 0xa, +0x12,0x31,0xbc,0xe4,0x7a,0xb3,0x11,0x96,0x80,0xa, 0x12,0x60,0xce,0x7e,0x34,0x10, +0x2b,0x12,0x5d,0xbd,0x7e,0x34,0x10,0x2b,0x12,0x6a,0x64,0x7e,0xb3,0x10,0xa5,0xb4, +0x3, 0xa, 0x7e,0x73,0x11,0xe8,0x2e,0x70,0xff,0xa9,0x94,0xca,0x12,0x69,0x23,0xbe, +0xd0,0x5, 0x78,0xd, 0x7a,0xe3,0x10,0x4a,0x7a,0xf3,0x10,0x4d,0xe4,0x7a,0xb3,0x10, +0x78,0x74,0x1, 0xda,0x79,0xda,0xd8,0x22,0x7e,0x34,0xe, 0xd, 0x7e,0x24,0x0, 0x46, +0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0xe, 0x53,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12, +0x6d,0xe0,0x7e,0x34,0xe, 0x99,0x7e,0x24,0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0x6c, +0xaa,0x74,0x3, 0xa, 0x4a,0x19,0xb4,0xe, 0xdf,0x19,0xb4,0xe, 0xe9,0x7e,0x44,0xff, +0xff,0x7e,0x70,0x2, 0xac,0x7a,0x59,0x43,0xe, 0xf3,0x7e,0x70,0x2, 0xac,0x7a,0x59, +0x43,0xf, 0x7, 0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd7,0xe4,0x7a,0xb3,0xf, 0x1b,0x7a, +0xb3,0xf, 0x1c,0x7a,0xb3,0xf, 0x1d,0x7a,0xb3,0xf, 0x1f,0x7a,0xb3,0xf, 0x20,0x7a, +0xb3,0xf, 0x21,0x7a,0xb3,0xf, 0x22,0x7a,0xb3,0xf, 0x23,0x7a,0xb3,0xf, 0x24,0x7a, +0xb3,0xf, 0x25,0x12,0x6a,0xad,0x74,0x5, 0x7a,0xb3,0xf, 0x26,0x74,0x4, 0x7a,0xb3, +0xf, 0x27,0xe4,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7c,0xab,0x6c,0x33,0x7c,0x27, +0x80,0x73,0x7e,0x90,0x7, 0xac,0x93,0x9, 0xf4,0xe, 0x57,0x7e,0x10,0x7, 0xac,0x12, +0x9, 0xb0,0xe, 0x11,0xbc,0xfb,0x78,0x5b,0xbe,0xf0,0xff,0x68,0x56,0x7e,0x10,0x7, +0xac,0x1a,0x7d,0xf0,0x2d,0xf2,0x19,0xff,0x0, 0x4, 0x49,0x44,0xe, 0x53,0x2d,0x2, +0x1b,0x8, 0x40,0x7e,0x10,0x7, 0xac,0x13,0x49,0x0, 0xe, 0x55,0x7e,0x90,0x7, 0xac, +0x9a,0x2d,0x42,0x59,0x4, 0x0, 0x2, 0x7e,0x10,0x7, 0xac,0x12,0x9, 0x10,0xe, 0x12, +0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x5, 0x7e,0x10,0x7, 0xac,0x12, +0x9, 0x10,0xe, 0x13,0x7e,0x90,0x7, 0xac,0x9a,0x2d,0x42,0x19,0x14,0x0, 0x6, 0xb, +0xa0,0x80,0x6, 0xb, 0x20,0xbc,0x62,0x38,0x89,0xb, 0x30,0xbe,0x30,0xa, 0x50,0x3, +0x2, 0x52,0x9e,0x7c,0xba,0xda,0xf8,0x22,0x7c,0xab,0xbe,0xa0,0x1, 0x40,0x3b,0xbe, +0xa0,0x3e,0x38,0x36,0xbe,0xa0,0x4, 0x78,0x6, 0x74,0x1, 0x7a,0xb3,0x0, 0x8b,0xbe, +0xa0,0x1, 0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x11,0x30,0x0, +0x6, 0x7e,0x34,0x15,0xca,0x80,0x4, 0x7e,0x34,0x16,0xc, 0x7a,0x37,0x16,0x51,0xa, +0x3a,0x2e,0x37,0x16,0x51,0x9, 0xb3,0x0, 0x2, 0x22,0x4c,0xaa,0x78,0x3, 0xe5,0xb, +0x22,0xbe,0xa0,0x80,0x40,0xc, 0xbe,0xa0,0xdf,0x38,0x7, 0xa, 0x3a,0x9, 0xb3,0xf, +0xfe,0x22,0xbe,0xa0,0xfc,0x78,0x5, 0x7e,0xb3,0x10,0xa5,0x22,0xbe,0xa0,0xfd,0x78, +0x8, 0x7e,0x37,0x10,0x46,0x7e,0x39,0xb0,0x22,0xbe,0xa0,0xfe,0x78,0x5, 0x7e,0xb3, +0x10,0x4a,0x22,0xbe,0xa0,0xf9,0x78,0x5, 0x7e,0xb3,0x16,0xbc,0x22,0xbe,0xa0,0xfa, +0x78,0x3, 0xe5,0x6a,0x22,0xe4,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10, +0x4d,0xf5,0x24,0xe4,0x7a,0xb3,0x10,0x4d,0x7e,0x34,0x10,0x2b,0x12,0x31,0xbc,0x7e, +0x34,0x10,0x2b,0x12,0x6a,0x64,0x75,0x21,0x0, 0x12,0x69,0x23,0x12,0x6e,0x78,0x60, +0xfb,0xa9,0xb7,0xea,0x7d,0x36,0x7d,0x27,0x7e,0x14,0x18,0x0, 0x12,0x67,0x74,0x75, +0x22,0x0, 0x80,0x36,0x75,0x23,0x0, 0x80,0x26,0x7e,0x51,0x22,0x74,0x18,0xac,0x5b, +0xe5,0x23,0xa, 0x3b,0x2d,0x23,0x3e,0x24,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, +0x14,0xe, 0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x23,0x7e, +0x73,0x10,0x2c,0xbe,0x71,0x23,0x38,0xd1,0x5, 0x22,0x7e,0x73,0x10,0x2b,0xbe,0x71, +0x22,0x38,0xc1,0x5, 0x21,0xe5,0x21,0xbe,0xb0,0x4, 0x40,0x9d,0xe5,0x24,0x7a,0xb3, +0x10,0x4d,0xda,0x3b,0x22,0xca,0xf8,0x30,0x90,0x58,0xc2,0x90,0x5, 0xa, 0xe5,0xa, +0xb4,0x1, 0x6, 0xe5,0x91,0xf5,0xf, 0x80,0x29,0xe5,0xb, 0xc4,0x7c,0xfb,0x5e,0xf0, +0x7, 0x78,0xe, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12,0x56,0x6d,0x80, +0x11,0xbe,0xf0,0x4, 0x78,0xc, 0xe5,0xa, 0x25,0xf, 0x24,0xfe,0x7e,0x71,0x91,0x12, +0x15,0xe2,0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, +0x12,0x53,0x28,0xf5,0x91,0x80,0xb, 0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e, +0xf5,0x91,0x30,0x91,0x28,0xc2,0x91,0x5, 0x9, 0xe5,0xb, 0xc4,0x7c,0x5b,0x5e,0x50, +0x7, 0xa5,0xbd,0x0, 0xb, 0xe5,0x9, 0x25,0xf, 0x12,0x53,0x28,0xf5,0x91,0x80,0xd, +0xa5,0xbd,0x4, 0x9, 0xe5,0x9, 0x25,0xf, 0x12,0x27,0x2e,0xf5,0x91,0xda,0xf8,0x22, +0x6c,0x33,0xbe,0x30,0x18,0x50,0x1e,0xa, 0x3, 0x2e,0x7, 0x10,0x35,0x7e,0x9, 0xa0, +0x7c,0xba,0x30,0xe0,0xc, 0xa, 0x5a,0x2e,0x54,0x0, 0x18,0xe, 0x54,0x7c,0xab,0x80, +0x16,0x1e,0xa0,0x80,0x12,0xa, 0x3, 0x2e,0x7, 0x10,0x33,0x9, 0x20,0xff,0xe8,0xa, +0x52,0x2e,0x54,0x0, 0x18,0x7c,0xab,0x7e,0x23,0x10,0x3a,0xbe,0x20,0x3, 0x28,0xe, +0x7e,0x10,0x2, 0xac,0x1a,0x2d,0x2, 0xb, 0x8, 0x0, 0x1e,0x4, 0x80,0x21,0xa, 0x42, +0x2e,0x44,0x0, 0xc, 0x7e,0x4, 0x0, 0xf, 0x9d,0x4, 0x7c,0x21,0x7e,0x10,0x2, 0xac, +0x1a,0x2d,0x2, 0xb, 0x8, 0x0, 0x7c,0xb2,0x60,0x5, 0x3e,0x4, 0x14,0x78,0xfb,0x7e, +0x44,0x7f,0xff,0x9d,0x40,0x7e,0x10,0x2, 0xac,0x13,0x2d,0x3, 0x1b,0x8, 0x40,0xb, +0x30,0xbe,0x30,0x25,0x50,0x3, 0x2, 0x54,0xd2,0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac, +0x5a,0x7d,0x32,0x2e,0x37,0xf, 0xd6,0xb, 0x38,0x10,0xbe,0x17,0xe, 0x7, 0x8, 0x12, +0x7d,0x2, 0x2e,0x7, 0xf, 0xd4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b,0x8, 0x30, +0x80,0x18,0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x27,0xf, 0xd4, +0xb, 0x28,0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78, +0xbb,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x12,0x9, 0x2e,0xbe,0x17,0xe, 0x7, +0x8, 0x12,0x7d,0x2, 0x2e,0x4, 0x8, 0xe4,0xb, 0x8, 0x30,0x2e,0x37,0xe, 0x7, 0x1b, +0x8, 0x30,0x80,0x18,0x6d,0x33,0x9e,0x37,0xe, 0x7, 0xbd,0x13,0x58,0xe, 0x2e,0x24, +0x8, 0xe4,0xb, 0x28,0x30,0x9e,0x37,0xe, 0x7, 0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0, +0x25,0x40,0xc0,0x22,0xca,0x69,0xca,0xf8,0x6c,0x11,0x7e,0xd0,0x7, 0xac,0xd1,0x9, +0x6, 0xe, 0x9d,0x5e,0x0, 0xf, 0x49,0xf6,0xe, 0x9b,0xbe,0xf4,0x5, 0xa, 0x40,0x3c, +0x49,0x46,0xe, 0x99,0x7d,0x34,0x12,0x6b,0x9d,0x7c,0xfb,0xbe,0xf0,0x3, 0x40,0xe, +0x7e,0x14,0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x3e,0x74,0x2, +0xac,0xbf,0x49,0x45,0x0, 0xf8,0x74,0x7, 0xac,0xb1,0x59,0x45,0xe, 0x99,0x7e,0x14, +0x7, 0xd0,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x80,0x25,0xbe,0xf4,0x5, 0x0, +0x40,0x1f,0x7e,0x14,0x4, 0xff,0x74,0x7, 0xac,0xb1,0x59,0x15,0xe, 0x9b,0x74,0x7, +0xac,0xb1,0x49,0x15,0xe, 0x9b,0xbe,0x14,0x5, 0xa, 0x40,0x5, 0x7c,0xb0,0x12,0x68, +0x3d,0xb, 0x10,0xbe,0x10,0xa, 0x40,0x82,0xda,0xf8,0xda,0x69,0x22,0xca,0x79,0x70, +0x41,0x7e,0x74,0x0, 0xb, 0x7a,0x79,0x70,0x7c,0xb7,0x54,0x70,0xc4,0x54,0xf, 0x7c, +0x7b,0xa5,0xbf,0x4, 0x15,0x7e,0xb3,0x10,0xa5,0xb4,0x3, 0x7, 0x74,0x1, 0x7e,0x70, +0x3, 0x80,0x13,0x74,0x27,0x7e,0x70,0x3, 0x80,0x4b,0x7e,0xb3,0x10,0xa5,0xb4,0x3, +0xa, 0x74,0x1, 0x7e,0x70,0x1, 0x12,0x0, 0x5e,0x80,0x45,0x74,0x27,0x7e,0x70,0x1, +0x80,0x33,0xbe,0xb0,0xfc,0x68,0x3, 0xb4,0x3c,0x1f,0xa5,0xbf,0xaa,0x5, 0x7e,0x60, +0x5, 0x80,0x10,0xa5,0xbf,0x55,0x5, 0x7e,0x60,0x6, 0x80,0x7, 0xa5,0xbf,0x66,0x20, +0x7e,0x60,0x7, 0x74,0x27,0x7c,0x76,0x80,0xc, 0xbe,0xb0,0x80,0x40,0xc, 0xbe,0xb0, +0xdf,0x38,0x7, 0x24,0x80,0x12,0x6d,0x9f,0x80,0x6, 0xb4,0xfe,0x3, 0x7a,0x71,0xc, +0xda,0x79,0x22,0x6c,0x77,0x6c,0xaa,0x80,0x3c,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24, +0x2e,0x27,0xf, 0xda,0x2e,0x24,0x0, 0x30,0x7d,0x12,0x1b,0x16,0xb, 0x18,0x40,0xbe, +0x44,0x0, 0x3c,0x8, 0x1e,0x7e,0x14,0x0, 0x1, 0x7c,0xba,0x60,0x5, 0x3e,0x14,0x14, +0x78,0xfb,0x5e,0x14,0x4, 0x44,0x68,0xb, 0x1b,0x25,0xb, 0x28,0x20,0xbd,0x42,0x8, +0x2, 0xb, 0x70,0xb, 0xa0,0x7e,0x63,0x10,0x2b,0xbc,0x6a,0x38,0xbc,0xbe,0x70,0x1, +0x40,0x30,0x6c,0xaa,0x80,0x24,0x7e,0x50,0x18,0xac,0x5a,0x3e,0x24,0x2e,0x27,0xf, +0xda,0x2e,0x24,0x0, 0x30,0x1b,0x25,0xb, 0x28,0x30,0x7e,0x30,0x2, 0xac,0x3a,0x59, +0x31,0x0, 0xd2,0x6d,0x33,0x1b,0x28,0x30,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba, +0x38,0xd4,0x22,0xca,0x79,0x6c,0xff,0x6c,0xee,0x80,0x63,0x7c,0xbe,0xc4,0x23,0x54, +0x1f,0x7c,0xab,0x7c,0xbe,0x54,0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14, +0x78,0xfb,0xa, 0x2a,0x9, 0xb2,0xd, 0x68,0x5c,0xb7,0x68,0x40,0x7e,0x50,0x2, 0xac, +0x5e,0x2e,0x24,0xd, 0x18,0x7e,0x70,0x2, 0xac,0x7f,0x2e,0x34,0xd, 0x18,0x7e,0x14, +0x0, 0x2, 0x12,0x6d,0x3c,0x7c,0xbf,0xc4,0x23,0x54,0x1f,0x7c,0xab,0x7c,0xbf,0x54, +0x7, 0x7e,0x34,0x0, 0x1, 0x60,0x5, 0x3e,0x34,0x14,0x78,0xfb,0xa, 0x4a,0x2e,0x44, +0xd, 0x68,0x7e,0x49,0xb0,0x4c,0xb7,0x7a,0x49,0xb0,0xb, 0xf0,0xb, 0xe0,0x7e,0x63, +0xd, 0xf7,0xbc,0x6e,0x38,0x95,0x7a,0xf3,0xd, 0xf7,0xda,0x79,0x22,0x6d,0x33,0x7a, +0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x7e,0xb3, +0x10,0xa5,0x24,0xfa,0x68,0x17,0x14,0x68,0x44,0xb, 0xb1,0x78,0x55,0x7e,0xb3,0x0, +0xfe,0xbe,0xb0,0x5, 0x68,0x4c,0x74,0x5, 0x7a,0xb3,0x0, 0xfe,0x22,0x7e,0xb3,0x0, +0xfe,0xb4,0x5, 0x3e,0x74,0x6, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x25,0x75, +0x9a,0x80,0x7e,0x34,0x77,0xf8,0x12,0x69,0xa1,0x7e,0x34,0x77,0xf8,0x74,0x66,0x12, +0x59,0xb7,0x7e,0x34,0x77,0xf9,0x74,0xbb,0x12,0x59,0xb7,0x80,0x12,0x7e,0xb3,0x0, +0xfe,0xb4,0x5, 0xe, 0x74,0x7, 0x7a,0xb3,0x0, 0xfe,0x74,0xfa,0x12,0x6d,0x25,0x75, +0xe9,0xff,0x22,0x0, 0x0, 0x0, 0x0, 0xd2,0xcd,0xa9,0xd1,0xc9,0x7e,0xb3,0x16,0xac, +0xb4,0x1, 0x14,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20, +0xe4,0x7a,0xb3,0x16,0xac,0x80,0xb, 0x7e,0x24,0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b, +0x38,0x20,0xa9,0xd0,0xca,0xc2,0xa8,0xc2,0x95,0x74,0x2, 0x7a,0xb3,0x16,0xb3,0x7e, +0xb3,0x16,0xb3,0x70,0xfa,0x12,0x6e,0x6f,0x12,0x61,0x24,0x12,0x6b,0xbe,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcf,0x12, +0x6a,0x18,0x12,0x6a,0x3e,0x12,0x52,0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3, +0x10,0x4d,0x2, 0x6e,0xb3,0xca,0x3b,0x7d,0x72,0x7d,0x63,0xe5,0x55,0xbe,0xb0,0x1, +0x68,0xf9,0x7d,0x36,0x7e,0x24,0x0, 0x4a,0xe4,0x12,0x6d,0xe0,0x7d,0x37,0x7e,0x24, +0x0, 0x4a,0xe4,0x12,0x6d,0xe0,0x75,0x21,0x1, 0x12,0x6b,0xde,0xe5,0x55,0xbe,0xb0, +0x1, 0x68,0xf9,0x75,0x22,0x0, 0x7e,0x51,0x22,0x74,0x2, 0xac,0x5b,0x49,0x2, 0xa, +0x62,0x1e,0x4, 0x1e,0x4, 0x7d,0x12,0x2d,0x16,0xb, 0x18,0x30,0x2d,0x30,0x1b,0x18, +0x30,0x49,0x12,0xa, 0x18,0x1e,0x14,0x1e,0x14,0x2d,0x27,0xb, 0x28,0x30,0x2d,0x31, +0x1b,0x28,0x30,0x5, 0x22,0xe5,0x22,0xb4,0x25,0xcc,0x5, 0x21,0xe5,0x21,0xbe,0xb0, +0x5, 0x40,0xb6,0xda,0x3b,0x22,0x6c,0x77,0x7e,0x63,0xd, 0xfa,0xa, 0x16,0x7e,0x63, +0xd, 0xf9,0xa, 0x26,0x2d,0x21,0xbe,0x24,0x0, 0xa0,0x28,0x3, 0x74,0x1, 0x22,0x6c, +0xaa,0x80,0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0x9a,0xbe,0x24,0x3, 0xe8, +0x8, 0x9, 0xb, 0x70,0xbe,0x70,0x10,0x68,0xe, 0x80,0x2, 0x6c,0x77,0xb, 0xa0,0x7e, +0x63,0x10,0x2c,0xbc,0x6a,0x38,0xdc,0xa5,0xbf,0x10,0x2a,0x6c,0x77,0x6c,0xaa,0x80, +0x1c,0x7e,0x50,0x2, 0xac,0x5a,0x49,0x22,0x8, 0xca,0xbe,0x24,0x7, 0xd0,0x8, 0x9, +0xb, 0x70,0xa5,0xbf,0x8, 0x5, 0x74,0x1, 0x22,0x6c,0x77,0xb, 0xa0,0x7e,0x63,0x10, +0x2b,0xbc,0x6a,0x38,0xdc,0xe4,0x22,0x7c,0xab,0xc2,0xaf,0xd2,0xc9,0xa9,0xd5,0xcb, +0x75,0xfb,0xa5,0x75,0xfb,0xf, 0x75,0xfb,0x6a,0xbe,0x34,0x73,0xf8,0x68,0x18,0xbe, +0x34,0x73,0xf9,0x68,0x12,0xbe,0x34,0x74,0x0, 0x50,0xc, 0x75,0xfb,0x0, 0xd2,0xaf, +0xc2,0xc9,0xa9,0xc5,0xcb,0xe4,0x22,0xa, 0x26,0x7c,0xb5,0xf5,0xf1,0x7c,0xb7,0x54, +0xfe,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x5e,0x34,0x0, 0x1, 0x68,0x8, 0x75, +0xf6,0xff,0x7a,0xa1,0xf6,0x80,0x6, 0x7a,0xa1,0xf6,0x75,0xf6,0xff,0x75,0xf5,0x80, +0x74,0x1, 0x12,0x6d,0x25,0xa9,0x36,0xf5,0xfc,0x75,0xfb,0x0, 0xd2,0xaf,0xc2,0xc9, +0xa9,0xc5,0xcb,0x74,0x1, 0x22,0x74,0xa, 0x7a,0xb3,0xf, 0x46,0x74,0x14,0x7a,0xb3, +0xf, 0x47,0x7e,0x34,0x3, 0x20,0x7a,0x37,0xf, 0x48,0x7a,0x37,0xf, 0x4a,0x7e,0x24, +0x1, 0xf4,0x7a,0x27,0xf, 0x4c,0x7a,0x37,0xf, 0x4e,0x7a,0x37,0xf, 0x50,0x74,0xc, +0x7a,0xb3,0xf, 0x52,0x74,0x8, 0x7a,0xb3,0xf, 0x53,0x7e,0x34,0x0, 0x3c,0x7a,0x37, +0xf, 0x54,0x7a,0x37,0xf, 0x56,0x7a,0x37,0xf, 0x58,0x7e,0x34,0x0, 0x28,0x7a,0x37, +0xf, 0x5a,0x74,0xf, 0x7a,0xb3,0xf, 0x5c,0xe4,0x7a,0xb3,0xf, 0x5f,0x74,0x4, 0x7a, +0xb3,0xf, 0x60,0x7e,0x34,0x0, 0x64,0x7a,0x37,0xf, 0x61,0x7e,0x34,0xa, 0x0, 0x7a, +0x37,0xf, 0x5d,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7e,0xb3,0x10,0x3c,0xf5,0x1d, +0xe4,0x7a,0xb3,0x10,0x3c,0x7d,0x36,0x7d,0x27,0x12,0x6a,0x89,0x7e,0x34,0x10,0x2b, +0x12,0x5b,0x2, 0x75,0x1b,0x0, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x12,0x6e,0x81, +0x60,0xfb,0x7d,0x36,0x7e,0x25,0x70,0x12,0x54,0xd0,0x75,0x1c,0x0, 0x7e,0x51,0x1c, +0x74,0x2, 0xac,0x5b,0x7d,0x32,0x2d,0x36,0xb, 0x38,0x10,0xe, 0x14,0xe, 0x14,0x2d, +0x27,0xb, 0x28,0x30,0x2d,0x31,0x1b,0x28,0x30,0x5, 0x1c,0xe5,0x1c,0xb4,0x25,0xdd, +0x5, 0x1b,0xe5,0x1b,0xbe,0xb0,0x4, 0x40,0xbd,0xe5,0x1d,0x7a,0xb3,0x10,0x3c,0xda, +0x3b,0x22,0x7d,0x3, 0x75,0xcc,0x18,0x75,0xcd,0x7, 0x9, 0xa0,0x0, 0x2, 0x3e,0xa0, +0xe5,0xca,0x54,0x1, 0x4c,0xba,0xf5,0xca,0xa9,0xd0,0xca,0xa9,0xd3,0xe1,0xa9,0xd1, +0xe1,0x9, 0x70,0x0, 0xe, 0x2e,0x70,0xff,0xa9,0x94,0xe1,0x9, 0xa0,0x0, 0xf, 0x7c, +0xba,0xc4,0x33,0x54,0xe0,0x7c,0xab,0xe5,0xe3,0x54,0x1f,0x4c,0xba,0xf5,0xe3,0x9, +0xb0,0x0, 0x13,0x54,0x3, 0xa, 0x5b,0x3e,0x54,0x3e,0x54,0x3e,0x54,0x7c,0xab,0xe5, +0xe3,0x54,0xe7,0x4c,0xba,0xf5,0xe3,0xa9,0xc1,0xe3,0xa9,0xc0,0xe3,0x7d,0x30,0x12, +0x5c,0xfb,0x9, 0xb0,0x0, 0x14,0xf5,0xe7,0x22,0x7e,0xb3,0x16,0xac,0x70,0x17,0xe5, +0xcc,0x7a,0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, 0x38,0x30,0x7a,0x73,0x16,0xaf, +0x74,0x1, 0x7a,0xb3,0x16,0xac,0xc2,0xc9,0xa9,0xc6,0xcb,0xa9,0xc5,0xcb,0xc2,0xcc, +0xc2,0xca,0xc2,0xc8,0xa9,0xc4,0xcb,0x80,0x2e,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0x23, +0xe5,0x75,0xb4,0x1, 0x1e,0xe5,0x76,0xb4,0x1, 0x19,0xa9,0xc3,0xcb,0x7e,0x24,0x0, +0x1, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc7,0xcb,0xa9,0xc1,0xc9,0xa9,0xc3, +0xc9,0xc2,0xcd,0xe4,0x12,0x6d,0x69,0x7e,0xb3,0x16,0xb0,0x60,0xcc,0x22,0x6d,0x33, +0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, 0xac,0x7a,0x37,0xa, 0xaf,0x12,0x6e,0xcc,0x12, +0x6e,0x6f,0x12,0x61,0x24,0x12,0x6e,0xd5,0x12,0x6d,0x7b,0x74,0x1, 0x7a,0xb3,0x10, +0xa5,0x12,0x6b,0xbe,0x12,0x6a,0x18,0x74,0x1, 0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10, +0x4d,0x12,0x6e,0xb3,0x7e,0xb3,0x10,0xa5,0x24,0xfd,0x68,0x12,0x14,0x68,0x14,0x14, +0x68,0x16,0x14,0x68,0x13,0x24,0x5, 0x78,0xeb,0x12,0x41,0x6b,0x80,0xe6,0x12,0x5e, +0x70,0x80,0xe1,0x12,0x69,0xf1,0x80,0xdc,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x12,0x57, +0xed,0x80,0xd1,0x7c,0xa5,0x7c,0x5b,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9,0xa, 0x36, +0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xbb,0x7c,0xb2, +0x1e,0xb0,0x1e,0xb0,0x54,0xf, 0xa, 0x4b,0x3e,0x44,0x3e,0x44,0x3e,0x44,0x3e,0x44, +0x1e,0x50,0x1e,0x50,0x1e,0x50,0xa, 0x55,0x4d,0x54,0xf5,0xbc,0x7c,0xb1,0xf5,0xbd, +0xa, 0x50,0xf5,0xc1,0x7c,0xb3,0x44,0xa0,0xf5,0xc3,0x7a,0x41,0xc4,0x75,0xc5,0xc0, +0x43,0xc2,0x7, 0x80,0x7, 0x43,0xc2,0x7, 0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf5, +0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x7c,0xab,0x6c,0x33,0x6d,0x44,0x7e,0x10,0x2, +0xac,0x13,0x2e,0x4, 0x1c,0x3a,0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0xc, 0xec,0x6c, +0x33,0x80,0x43,0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0xa, 0x3, 0x20,0xe0, +0xb, 0x2d,0x3, 0x7e,0x9, 0xb0,0x54,0x1f,0xa, 0xfb,0x80,0x13,0x2d,0x3, 0x7e,0x9, +0xb0,0x54,0x1f,0xa, 0xfb,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x3e,0xf4,0x7c, +0xb2,0x1e,0xb0,0x7e,0x90,0x2, 0xac,0x9b,0x2e,0x44,0x1c,0x3a,0xb, 0x48,0x0, 0x4d, +0xf, 0x1b,0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xb9,0x22,0x7d,0x23,0x75,0xe4,0x1, +0x9, 0xb2,0x0, 0xc, 0x54,0x7f,0xf5,0xe5,0x75,0xe4,0x2, 0x9, 0xb2,0x0, 0xd, 0x54, +0x7f,0xf5,0xe5,0x75,0xe4,0x7, 0x9, 0xb2,0x0, 0x15,0x54,0x7f,0xf5,0xe5,0x75,0xe4, +0xb, 0x6c,0xaa,0xa, 0x1a,0x49,0x32,0x0, 0x1d,0x2d,0x31,0x7e,0x39,0xb0,0xf5,0xe5, +0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xec,0x75,0xe4,0x30,0x49,0x32,0x0, 0x1b,0x7e,0x39, +0xb0,0xf5,0xe5,0x75,0xe4,0x31,0x49,0x32,0x0, 0x19,0x7d,0x53,0x5e,0x54,0x0, 0xff, +0xf5,0xe5,0x75,0xe4,0x32,0x5e,0x34,0xff,0x0, 0xa, 0x56,0xf5,0xe5,0x22,0xca,0x79, +0x7e,0x71,0x54,0x3e,0x70,0x3e,0x70,0x7c,0xb7,0x24,0x56,0xa, 0x2b,0xb, 0x28,0x50, +0x7c,0xab,0x7c,0xb7,0x24,0x58,0xa, 0x3b,0xb, 0x38,0x70,0x4d,0x77,0x68,0x1f,0xbe, +0xa0,0x1, 0x68,0xa, 0xbe,0xa0,0x2, 0x68,0x5, 0xbe,0xa0,0x3, 0x78,0x10,0x7e,0x34, +0x10,0x2b,0x12,0x6b,0x17,0x7d,0x37,0x7e,0x24,0x18,0x0, 0x12,0x54,0xd0,0x5, 0x54, +0xe5,0x53,0xbe,0xb1,0x54,0x28,0x10,0x12,0x62,0x6b,0xb4,0x1, 0x5, 0x75,0x55,0x1, +0x80,0x8, 0x75,0x55,0x3, 0x80,0x3, 0x75,0x55,0x2, 0xda,0x79,0x22,0x6d,0x11,0x7e, +0x24,0x1c,0x1c,0x1b,0x28,0x10,0x6c,0x55,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, +0xa3,0x0, 0x50,0x80,0x2, 0x7c,0xa5,0xa, 0x4a,0x49,0x13,0x0, 0x8, 0x2d,0x14,0x7e, +0x19,0x40,0xa, 0x14,0x7e,0x4, 0x1c,0x24,0x1b,0x8, 0x10,0x9, 0x43,0x0, 0x1f,0xa, +0x14,0x1b,0x8, 0x10,0x49,0x13,0x0, 0x41,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b, +0x8, 0x10,0x49,0x13,0x0, 0x43,0x2d,0x14,0x7e,0x19,0x40,0xa, 0x14,0x1b,0x8, 0x10, +0xb, 0x50,0xbe,0x50,0xd, 0x40,0xb1,0x22,0x75,0x9, 0x0, 0xe5,0xb, 0xc4,0x7c,0x5b, +0x5e,0x50,0x7, 0xa5,0xbd,0x0, 0x9, 0xe5,0xf, 0x12,0x53,0x28,0xf5,0x91,0x80,0xb, +0xa5,0xbd,0x4, 0x7, 0xe5,0xf, 0x12,0x27,0x2e,0xf5,0x91,0x75,0xa, 0x0, 0xe4,0x7a, +0xb3,0x16,0x4e,0x7e,0x34,0x15,0xca,0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0, +0x7e,0x34,0x16,0xc, 0x7e,0x24,0x0, 0x42,0x74,0xff,0x12,0x6d,0xe0,0x74,0xaa,0x7a, +0xb3,0x15,0xca,0x7a,0xb3,0x15,0xcb,0x7a,0xb3,0x16,0xc, 0x7a,0xb3,0x16,0xd, 0x22, +0xca,0xf8,0x74,0x3, 0x7a,0xb3,0x16,0xa3,0xe4,0x7a,0xb3,0x10,0x3c,0x7a,0xb3,0x10, +0x4d,0x74,0x3, 0x7a,0xb3,0x16,0xa3,0x6d,0x33,0x7a,0x37,0x10,0x1, 0x7e,0x34,0xd, +0xac,0x7a,0x37,0xa, 0xaf,0x7e,0xf3,0x16,0xa3,0xbe,0xf0,0x3, 0x78,0x1d,0xe5,0xb, +0x30,0xe7,0xe4,0x12,0x6a,0xf4,0x7e,0x37,0xf, 0xd6,0x7a,0x37,0x16,0xa0,0x7e,0x37, +0xf, 0xda,0x7a,0x37,0x16,0x9e,0x53,0xb, 0x7f,0x80,0xcc,0x7a,0xf3,0x10,0xa5,0x12, +0x0, 0x1e,0x12,0x0, 0x6a,0xda,0xf8,0x22,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5, +0xb9,0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5, +0xbc,0x7c,0xb3,0xf5,0xbd,0xa, 0x12,0x7c,0xb3,0xf5,0xc1,0x7c,0xba,0x44,0xa0,0xf5, +0xc3,0xe5,0xc4,0x54,0xe0,0x4c,0xb1,0xf5,0xc4,0x75,0xc5,0xc0,0xa, 0x30,0x7d,0x23, +0x4e,0x24,0x0, 0x1, 0x7c,0x15,0x7c,0xb1,0x42,0xc2,0x80,0x8, 0x7c,0xb1,0x42,0xc2, +0x0, 0x0, 0x0, 0x0, 0xa9,0x37,0xc2,0xf4,0x75,0xc2,0x0, 0xa9,0xc6,0xcb,0x22,0x6c, +0xaa,0x6c,0x77,0x7e,0x10,0x30,0xac,0x1a,0x7e,0x30,0x2, 0xac,0x37,0x2d,0x10,0x7d, +0x1, 0x2e,0x7, 0xf, 0xda,0xb, 0x8, 0x20,0xbe,0x27,0xe, 0x5, 0x8, 0x12,0x7d,0x41, +0x2e,0x47,0xf, 0xd8,0xb, 0x48,0x0, 0x2e,0x7, 0xe, 0x5, 0x1b,0x48,0x0, 0x80,0x18, +0x6d,0x0, 0x9e,0x7, 0xe, 0x5, 0xbd,0x20,0x58,0xe, 0x2e,0x17,0xf, 0xd8,0xb, 0x18, +0x20,0x9e,0x27,0xe, 0x5, 0x1b,0x18,0x20,0xb, 0x70,0xa5,0xbf,0x18,0xb5,0xb, 0xa0, +0xbe,0xa0,0xd, 0x40,0xac,0x22,0xca,0x3b,0x7c,0xc5,0x7c,0xdb,0x7d,0x73,0x7a,0xd, +0x31,0x7e,0x79,0x50,0xa5,0xbd,0x0, 0xb, 0x7e,0xd, 0x31,0x7e,0xb, 0x40,0x7a,0x79, +0x40,0x80,0x36,0x7e,0xd, 0x31,0x7e,0xb, 0x40,0xa, 0x34,0xa, 0x25,0x9d,0x32,0x12, +0x6d,0xd0,0xa, 0x2c,0xbd,0x32,0x8, 0x18,0x7e,0x1d,0x31,0x7e,0x1b,0xb0,0x7e,0x79, +0xa0,0xbc,0xba,0x7c,0xba,0x28,0x4, 0x2c,0xbd,0x80,0x2, 0x9c,0xbd,0x7a,0x79,0xb0, +0x7e,0x79,0x30,0x7e,0x1d,0x31,0x7a,0x1b,0x30,0xda,0x3b,0x22,0x7e,0xb3,0x10,0x39, +0xb4,0x1, 0x26,0x7e,0x73,0xa, 0xac,0x7a,0x73,0x10,0x37,0x7e,0x73,0xa, 0xad,0x7a, +0x73,0x10,0x38,0x7e,0x73,0xa, 0xae,0x7a,0x73,0x10,0x3a,0x7e,0x34,0xd, 0xfe,0x7a, +0x37,0x10,0x46,0x7e,0x34,0xf, 0xdc,0x80,0x24,0x7e,0x73,0x11,0x16,0x7a,0x73,0x10, +0x37,0x7e,0x73,0x11,0x49,0x7a,0x73,0x10,0x38,0x7e,0x73,0x11,0x94,0x7a,0x73,0x10, +0x3a,0x7e,0x34,0x11,0x9d,0x7a,0x37,0x10,0x46,0x7e,0x34,0xf, 0x63,0x7a,0x37,0x10, +0x48,0x22,0xe5,0x55,0xbe,0xb0,0x1, 0x68,0xf9,0xe5,0x75,0x60,0xfc,0xe5,0x76,0x60, +0xfc,0x20,0x93,0xfd,0xd2,0x96,0xd2,0x95,0xd2,0xb8,0xa9,0xd0,0xb7,0xd2,0xa8,0x7e, +0xb3,0x16,0xac,0x70,0x17,0xe5,0xcc,0x7a,0xb3,0x16,0xad,0x7e,0x34,0x1d,0x8, 0xb, +0x38,0x30,0x7a,0x73,0x16,0xaf,0x74,0x1, 0x7a,0xb3,0x16,0xac,0xa9,0xc0,0xca,0x7e, +0x24,0x0, 0x1, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0xa9,0xc1,0xc9,0xa9,0xc3,0xc9, +0xc2,0xcd,0x75,0x87,0x2, 0x0, 0x0, 0x22,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d, +0x32,0x2e,0x37,0xf, 0xd6,0xb, 0x38,0x10,0x2e,0x27,0xf, 0xd4,0xb, 0x28,0x30,0x2d, +0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xdf,0x6c,0xaa,0x7e,0x50,0x2, +0xac,0x5a,0x49,0x12,0x9, 0x2e,0x2e,0x24,0x8, 0xe4,0xb, 0x28,0x30,0x2d,0x31,0x1b, +0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x7e,0x14,0x1, 0x0, 0x7d,0x31,0x7e, +0x24,0x3, 0x70,0x74,0x18,0x7e,0x13,0x10,0x2b,0x6c,0x0, 0x2, 0x5e,0xc8,0x9, 0xa3, +0x0, 0x24,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xc1,0xc9,0x80,0x3, 0xa9,0xd1,0xc9,0x43, +0xcc,0x8, 0x9, 0x53,0x0, 0x2, 0x3e,0x50,0xe5,0xca,0x54,0x1, 0x4c,0xb5,0xf5,0xca, +0xa9,0xd0,0xca,0xd2,0xcd,0xbe,0xa0,0x1, 0x78,0x5, 0xa9,0xd0,0xc9,0x80,0x3, 0xa9, +0xc0,0xc9,0x7e,0x14,0x1d,0x0, 0xb, 0x18,0x20,0x5e,0x24,0xff,0xfd,0x1b,0x18,0x20, +0x9, 0xb3,0x0, 0x3f,0xb4,0x1, 0xc, 0x75,0xe4,0x32,0x9, 0xb3,0x0, 0x40,0xc4,0x54, +0xf0,0xf5,0xe5,0x22,0x12,0x4b,0x78,0x12,0x3b,0x1c,0x12,0x68,0x9d,0x7e,0x34,0x8, +0x50,0x7a,0x37,0xf, 0xd4,0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x7e,0x34,0x8, +0x9a,0x7e,0x27,0xf, 0xd4,0x12,0x6a,0x89,0x7e,0x34,0x1, 0x0, 0x7a,0x37,0xf, 0xd8, +0x7e,0x34,0x3, 0x70,0x7a,0x37,0xf, 0xda,0x7e,0x34,0x3, 0x70,0x7e,0x27,0xf, 0xd8, +0x12,0x67,0xa7,0x12,0x64,0xec,0x12,0x5a,0x26,0x12,0x6a,0x3e,0x12,0x52,0x8, 0x12, +0x6e,0x52,0x74,0x1, 0x7a,0xb3,0x11,0x96,0x22,0xca,0xf8,0x7e,0xb3,0xf, 0xd2,0xb4, +0x1, 0x48,0x6c,0xff,0x80,0x3c,0x7e,0x37,0xf, 0xd6,0x2e,0x34,0x0, 0x30,0x74,0x2, +0xac,0xbf,0x9, 0xb5,0xa, 0xb1,0x7e,0x53,0x10,0x2b,0x12,0x35,0x22,0x74,0x4, 0xac, +0xbf,0x59,0x35,0xb, 0x86,0x7e,0x37,0xf, 0xd6,0x74,0x2, 0xac,0xbf,0x9, 0xb5,0xa, +0xb2,0x7e,0x53,0x10,0x2c,0x12,0x35,0x22,0x74,0x4, 0xac,0xbf,0x59,0x35,0xb, 0x88, +0xb, 0xf0,0x7e,0x73,0xd, 0x16,0xbc,0x7f,0x38,0xbc,0xda,0xf8,0x22,0xca,0x69,0xca, +0xf8,0x7c,0xfb,0x7e,0x24,0x0, 0x4, 0x7c,0xaf,0x3e,0xa0,0x3e,0xa0,0x7c,0xba,0x24, +0x56,0xa, 0x3b,0x1b,0x38,0x20,0x6d,0x66,0x7c,0xba,0x24,0x58,0xa, 0x3b,0x1b,0x38, +0x60,0xb, 0xf0,0x12,0x0, 0x6e,0x50,0x1e,0x7e,0x24,0x0, 0x5, 0x7c,0xaf,0x3e,0xa0, +0x3e,0xa0,0x7c,0xba,0x24,0x56,0xa, 0x3b,0x1b,0x38,0x20,0x7c,0xba,0x24,0x58,0xa, +0x3b,0x1b,0x38,0x60,0xb, 0xf0,0x7c,0xbf,0xda,0xf8,0xda,0x69,0x22,0x7e,0x47,0x16, +0x65,0x6c,0x77,0x7e,0xa0,0xff,0x7e,0x43,0x16,0x54,0xa, 0x14,0x9, 0x51,0xf, 0x29, +0xbe,0x53,0x10,0x4a,0x78,0x32,0x7e,0x50,0x12,0xac,0x45,0x49,0x22,0x16,0x65,0xbe, +0x24,0x0, 0x41,0x40,0x23,0x7e,0x60,0x1, 0xbe,0x44,0x0, 0x19,0x40,0x18,0x7e,0x30, +0x12,0xac,0x36,0x49,0x21,0x16,0x65,0xbd,0x24,0x50,0x4, 0x7d,0x42,0x7c,0x76,0xb, +0x60,0xbe,0x60,0x4, 0x40,0xe2,0x7c,0xa7,0x7c,0xba,0x22,0xca,0x79,0xe5,0x53,0xbe, +0xb1,0x54,0x38,0x4, 0x6c,0xff,0x80,0x3a,0xe5,0x54,0x3e,0xb0,0x3e,0xb0,0x24,0x56, +0xa, 0x3b,0xb, 0x38,0x30,0x7c,0xe7,0xbe,0xe0,0x1, 0x68,0xe, 0xbe,0xe0,0x2, 0x68, +0x9, 0xbe,0xe0,0x3, 0x68,0x4, 0x4c,0xee,0x78,0x7, 0x7c,0xbe,0x12,0x63,0x2, 0x7c, +0xfb,0xbe,0xe0,0x4, 0x68,0x5, 0xbe,0xe0,0x5, 0x78,0x7, 0x7c,0xbe,0x12,0x51,0x77, +0x7c,0xfb,0x7c,0xbf,0xda,0x79,0x22,0x7e,0xa3,0xd, 0xf7,0xbe,0xa0,0x0, 0x28,0x40, +0x6c,0x77,0x80,0x38,0x7e,0x50,0x2, 0xac,0x57,0x9, 0x62,0xd, 0x18,0x9, 0x52,0xd, +0x19,0x7e,0x30,0x2, 0xac,0x36,0x49,0x1, 0x11,0xce,0x7e,0x17,0xf, 0x4a,0xe, 0x14, +0xbd,0x1, 0x48,0x13,0x7e,0x30,0x2, 0xac,0x35,0x49,0x1, 0x11,0x9e,0x7e,0x17,0xf, +0x4c,0xe, 0x14,0xbd,0x1, 0x58,0x3, 0x74,0x1, 0x22,0xb, 0x70,0xbc,0xa7,0x38,0xc4, +0xe4,0x22,0xca,0xf8,0x7c,0xfb,0xbe,0xf0,0x1, 0x78,0x3, 0xe4,0x80,0xb, 0xbe,0xf0, +0x2, 0x68,0x4, 0x4c,0xff,0x78,0x8, 0x74,0x1, 0x7a,0xb3,0x10,0x39,0x80,0x3, 0xe4, +0x80,0x28,0x12,0x5f,0xcc,0x4c,0xff,0x78,0x11,0xe4,0x7a,0xb3,0x10,0x3a,0x74,0x1e, +0x7a,0xb3,0x10,0x37,0x74,0xa, 0x7a,0xb3,0x10,0x38,0x7e,0x34,0x10,0x2b,0x12,0x5b, +0x2, 0x7e,0x34,0x10,0x2b,0x12,0x64,0xab,0x74,0x1, 0xda,0xf8,0x22,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x75,0x75,0x1, 0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x60,0x2, 0x1b,0x28, +0x30,0xb, 0x28,0x30,0x4e,0x70,0x2, 0x1b,0x28,0x30,0xe5,0x55,0xb4,0x1, 0x3, 0x12, +0x5d,0x5e,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b, +0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x7c,0xab,0xa9,0xd6,0xcb,0x7c,0xb7,0xf5,0xb9, +0xa, 0x36,0x7c,0xb7,0xf5,0xba,0x7c,0xb5,0xf5,0xbb,0xa, 0x34,0x7c,0xb7,0xf5,0xbc, +0x7a,0xa1,0xc3,0x75,0xc5,0x40,0x75,0xc2,0x2b,0x80,0x3, 0x43,0xc2,0x1, 0x0, 0x0, +0x0, 0x0, 0xa9,0x37,0xc2,0xf5,0x75,0xc2,0x0, 0x75,0xc5,0xe, 0xe5,0xc6,0xa, 0x3b, +0xe5,0xc6,0xa, 0x2b,0x7c,0x45,0x6c,0x55,0x4d,0x32,0xa9,0xc6,0xcb,0x22,0xe4,0x7a, +0xb3,0x15,0x9f,0x7a,0xb3,0x15,0x53,0x7a,0xb3,0x15,0x9e,0x7a,0xb3,0x15,0xa0,0x7a, +0xb3,0x15,0xa1,0x7e,0x34,0x15,0x56,0x7e,0x24,0x0, 0x48,0x12,0x6d,0xe0,0x7e,0x34, +0x14,0xe3,0x7e,0x24,0x0, 0x48,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x15,0x56,0x7e,0x24, +0x0, 0x46,0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0x14,0xe3,0x7e,0x24,0x0, 0x46,0x74, +0xff,0x2, 0x6d,0xe0,0xd2,0xcd,0xa9,0xd1,0xc9,0xa9,0xd3,0xcb,0xa9,0xd7,0xcb,0x7e, +0xb3,0x16,0xac,0xb4,0x1, 0x15,0x7e,0x73,0x16,0xaf,0xa, 0x27,0x7e,0x34,0x1d,0x8, +0x1b,0x38,0x20,0x7e,0xb3,0x16,0xad,0xf5,0xcc,0x80,0xe, 0x7e,0x24,0x0, 0x2, 0x7e, +0x34,0x1d,0x8, 0x1b,0x38,0x20,0x75,0xcc,0x0, 0xa9,0xd4,0xc9,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0xe4,0x7a,0xb3,0x16,0xac,0x22,0x7c,0xab,0x6c,0x33,0x80,0x36, +0xa, 0x3, 0x2d,0x2, 0x7e,0x9, 0x20,0x7c,0xb2,0x54,0x7, 0x3e,0xb0,0xa, 0x3, 0x2d, +0x3, 0x7e,0x9, 0x10,0xa, 0xf1,0x60,0x5, 0x3e,0xf4,0x14,0x78,0xfb,0x1e,0x20,0x1e, +0x20,0x1e,0x20,0x7e,0x90,0x2, 0xac,0x92,0x2e,0x44,0x1c,0x30,0xb, 0x48,0x0, 0x4d, +0xf, 0x1b,0x48,0x0, 0xb, 0x30,0xbc,0xa3,0x38,0xc6,0x22,0x75,0x76,0x0, 0x75,0xe4, +0x3, 0x49,0x23,0x0, 0x17,0x7d,0x52,0x5e,0x54,0x0, 0xff,0xf5,0xe5,0x75,0xe4,0x4, +0x5e,0x24,0x1f,0x0, 0xa, 0x24,0x7c,0xa5,0x7a,0xa1,0xe5,0x75,0xe4,0x5, 0xf5,0xe5, +0x75,0xe4,0x6, 0x9, 0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0x4c,0xba,0xf5,0xe5,0xa9, +0xd6,0xea,0x75,0xe6,0x0, 0xa9,0xd1,0xe1,0xa9,0xd0,0xe1,0x22,0x7e,0x34,0x1, 0x90, +0x7a,0x37,0xd, 0xff,0x7e,0x34,0x0, 0x19,0x7a,0x37,0xe, 0x1, 0x7e,0x34,0x0, 0x9c, +0x7a,0x37,0xe, 0x3, 0x7e,0x34,0x0, 0x2, 0x7a,0x37,0xe, 0x5, 0x7a,0x37,0xe, 0x7, +0x74,0x1, 0x7a,0xb3,0xe, 0x9, 0x7e,0xb3,0xe, 0xa, 0x54,0xfb,0x7a,0xb3,0xe, 0xa, +0x7e,0x34,0x10,0x3, 0x7e,0x24,0x0, 0x28,0xe4,0x2, 0x6d,0xe0,0xca,0xf8,0x7e,0x24, +0xe, 0xd, 0x7e,0x34,0xe, 0x99,0x7e,0x14,0x0, 0x46,0x12,0x6d,0x3c,0x6c,0xff,0x74, +0x7, 0xac,0xbf,0x49,0x35,0xe, 0xd, 0x12,0x4c,0xf7,0x74,0x7, 0xac,0xbf,0x59,0x35, +0xe, 0x99,0x49,0x35,0xe, 0xf, 0x12,0x4a,0xa6,0x74,0x7, 0xac,0xbf,0x59,0x35,0xe, +0x9b,0xb, 0xf0,0xbe,0xf0,0xa, 0x40,0xd7,0xda,0xf8,0x22,0x6d,0x33,0x6c,0xaa,0x80, +0x2e,0x7e,0x30,0x2, 0xac,0x3a,0x9, 0x51,0xd, 0x18,0x9, 0x41,0xd, 0x19,0x7e,0x10, +0x30,0xac,0x15,0x7e,0x30,0x2, 0xac,0x34,0x2d,0x10,0x2e,0x17,0xf, 0xda,0xb, 0x18, +0x40,0xbe,0x44,0x0, 0x0, 0x8, 0x6, 0xbd,0x43,0x8, 0x2, 0x7d,0x34,0xb, 0xa0,0x7e, +0xb3,0xd, 0xf7,0xbc,0xba,0x38,0xca,0x22,0xca,0x79,0x7d,0x41,0x7d,0x13,0x6d,0x0, +0x7e,0x34,0x7f,0xff,0x6c,0xaa,0x80,0x1b,0x7e,0xf0,0x7, 0xac,0xfa,0x7d,0xe7,0x2d, +0xe4,0x49,0xfe,0x0, 0x2, 0xbd,0xf0,0x28,0x2, 0x7d,0xf, 0xbd,0xf3,0x50,0x2, 0x7d, +0x3f,0xb, 0xa0,0x9, 0xb4,0x0, 0x46,0xbc,0xba,0x38,0xdd,0x1b,0x18,0x0, 0x1b,0x28, +0x30,0xda,0x79,0x22,0xca,0xf8,0x7e,0xb3,0x10,0x4e,0x60,0x3, 0xb4,0x1, 0x2d,0xa9, +0xc6,0xea,0x12,0x2b,0xa0,0x7c,0xfb,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12, +0x67,0xa7,0x7e,0x37,0xf, 0xda,0x7e,0x27,0xf, 0xd8,0x12,0x53,0xb7,0xbe,0xf0,0x1, +0x78,0x4, 0x74,0x2, 0x80,0x2, 0x74,0xff,0x7a,0xb3,0x10,0x4e,0xda,0xf8,0x22,0x7e, +0xb3,0x16,0x54,0x4, 0x7a,0xb3,0x16,0x54,0x7e,0x73,0x16,0x54,0xbe,0x70,0x4, 0x40, +0x5, 0xe4,0x7a,0xb3,0x16,0x54,0x7e,0xa3,0x16,0x54,0xbe,0xa0,0x3, 0x78,0x13,0x7e, +0xb3,0x16,0x9d,0x4, 0x7a,0xb3,0x16,0x9d,0xbe,0xb0,0x8, 0x40,0x5, 0xe4,0x7a,0xb3, +0x16,0x9d,0xa, 0x3a,0x9, 0xb3,0xf, 0x29,0x22,0xca,0x3b,0x7d,0x72,0x7d,0x63,0x7d, +0x21,0x7d,0x36,0x7e,0x14,0x0, 0x4a,0x12,0x6d,0x3c,0x7e,0xb3,0x10,0x3c,0xb4,0x1, +0x1f,0x6c,0xaa,0x7e,0x50,0x2, 0xac,0x5a,0x7d,0x32,0x2d,0x37,0xb, 0x38,0x10,0x2d, +0x26,0xb, 0x28,0x30,0x9d,0x31,0x1b,0x28,0x30,0xb, 0xa0,0xbe,0xa0,0x25,0x78,0xe3, +0xda,0x3b,0x22,0x7e,0xb3,0x10,0x3d,0x70,0x32,0xa9,0xd6,0xea,0x74,0x1, 0x7a,0xb3, +0x10,0x39,0x12,0x5f,0xcc,0x12,0x2d,0xb5,0xe4,0x7a,0xb3,0x10,0x39,0x12,0x5f,0xcc, +0x12,0x2d,0xb5,0x7e,0x34,0x10,0x2b,0x12,0x6b,0x17,0x7e,0x37,0xf, 0xd4,0x7e,0x24, +0x8, 0xe4,0x12,0x58,0xd5,0x74,0x2, 0x7a,0xb3,0x10,0x3d,0x22,0x7e,0xa3,0xf, 0x1c, +0xbe,0xa0,0x0, 0x38,0x2f,0xbe,0xa3,0xf, 0x1b,0x50,0x19,0x7e,0xb3,0xf, 0x25,0xbe, +0xb3,0x12,0x33,0x28,0x14,0x7e,0xb3,0x12,0x33,0x4, 0x7a,0xb3,0x12,0x33,0x7a,0xa3, +0xf, 0x1b,0x80,0x5, 0xe4,0x7a,0xb3,0x12,0x33,0x7e,0xb3,0xf, 0x1b,0x70,0x5, 0xe4, +0x7a,0xb3,0xf, 0x24,0x22,0xca,0x7b,0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca, +0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0,0x82,0x53,0xcc,0xf8,0x43,0xcc,0x1, 0x12, +0x54,0x45,0x74,0x1, 0x7a,0xb3,0x16,0x4e,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, +0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0xca,0x7b,0xca, +0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83,0xc0, +0x82,0x75,0x76,0x1, 0x75,0xe6,0x0, 0xe5,0x55,0xb4,0x1, 0x3, 0x12,0x5d,0x5e,0xd0, +0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, 0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda, +0x6b,0xda,0x7b,0x32,0xca,0xf8,0x7d,0x1, 0x7d,0x13,0x7e,0xf3,0x10,0x4d,0xbe,0xf0, +0x1, 0x78,0xd, 0x7d,0x30,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, 0x2, 0x80,0x11, +0x4c,0xff,0x78,0x10,0x7d,0x30,0x6d,0x22,0x74,0x18,0x7e,0x13,0x10,0x2b,0x7e,0x0, +0x4, 0x12,0x5e,0xc8,0xda,0xf8,0x22,0xe4,0x7a,0xb3,0xf, 0xd3,0x6c,0xaa,0x6c,0x33, +0x6d,0xff,0x7e,0x10,0x18,0xac,0x1a,0xa, 0xe3,0x2d,0xe, 0x3e,0x4, 0x7d,0x40,0x2d, +0x42,0x1b,0x48,0xf0,0x6d,0x44,0x2d,0x3, 0x1b,0x8, 0x40,0xb, 0x30,0xa5,0xbb,0x18, +0xdf,0xb, 0xa0,0xbe,0xa0,0xd, 0x40,0xd6,0x22,0x7d,0x23,0x7c,0xab,0x6d,0x33,0x6c, +0x33,0x4c,0xaa,0x7e,0x10,0x7, 0x78,0xb, 0xac,0x13,0x2d,0x2, 0xb, 0x8, 0x0, 0x2d, +0x30,0x80,0xa, 0xac,0x13,0x2d,0x2, 0x49,0x0, 0x0, 0x2, 0x2d,0x30,0xb, 0x30,0xbe, +0x30,0x3, 0x40,0xdd,0x7e,0x24,0x0, 0x3, 0x8d,0x32,0x22,0x6c,0xaa,0x74,0x3, 0xa, +0x2a,0x2d,0x23,0x7a,0x29,0xb0,0xa, 0x2a,0x2d,0x23,0x19,0xb2,0x0, 0xa, 0x7e,0x24, +0xff,0xff,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x3, 0x59,0x20,0x0, 0x14,0x2d, +0x13,0x59,0x21,0x0, 0x28,0xb, 0xa0,0xbe,0xa0,0xa, 0x40,0xd1,0x22,0x7c,0xab,0x7e, +0x24,0xe, 0xdf,0xbe,0xa0,0xa, 0x50,0x25,0xa, 0x3a,0x7d,0x13,0x2d,0x12,0x7e,0x19, +0xb0,0xb4,0x2, 0xe, 0x74,0x1, 0x7a,0x19,0xb0,0x74,0x3, 0x2d,0x23,0x19,0xb2,0x0, +0xa, 0x22,0x74,0x3, 0x7a,0x19,0xb0,0x2d,0x32,0x19,0xb3,0x0, 0xa, 0x22,0xca,0x7b, +0xca,0x6b,0xca,0x5b,0xca,0x4b,0xca,0x2b,0xca,0x1b,0xca,0xb, 0xc0,0xd0,0xc0,0x83, +0xc0,0x82,0x12,0x6e,0x5c,0x53,0xb, 0xfd,0xd0,0x82,0xd0,0x83,0xd0,0xd0,0xda,0xb, +0xda,0x1b,0xda,0x2b,0xda,0x4b,0xda,0x5b,0xda,0x6b,0xda,0x7b,0x32,0x6d,0x33,0x7a, +0x37,0x11,0xd, 0x74,0x1, 0x7a,0xb3,0x11,0xf, 0x74,0xb, 0x7a,0xb3,0x11,0x10,0x74, +0x9, 0x7a,0xb3,0x11,0x11,0x74,0x1e,0x7a,0xb3,0x11,0x12,0x7a,0xb3,0x11,0x13,0x7a, +0xb3,0x11,0x14,0x74,0x1, 0x7a,0xb3,0x11,0x15,0x22,0x7e,0xb3,0xf, 0x1b,0x70,0x1e, +0x7e,0xa3,0xf, 0x1c,0xbe,0xa0,0x0, 0x28,0x15,0xe5,0x16,0x70,0xd, 0x7a,0xa3,0xf, +0x1b,0x74,0x1, 0x7a,0xb3,0xf, 0x22,0x5, 0x16,0x22,0x75,0x16,0x0, 0x22,0x75,0x16, +0x0, 0xe4,0x7a,0xb3,0xf, 0x22,0x22,0x6c,0xaa,0x80,0x1f,0x7e,0x70,0x2, 0xac,0x7a, +0x49,0x23,0x0, 0xd2,0x7e,0x70,0x18,0xac,0x7a,0x3e,0x34,0x2e,0x37,0xf, 0xda,0x2e, +0x34,0x0, 0x30,0x1b,0x35,0x1b,0x38,0x20,0xb, 0xa0,0x7e,0xb3,0x10,0x2b,0xbc,0xba, +0x38,0xd9,0x22,0x75,0x75,0x0, 0xa9,0xc6,0xea,0x7e,0x24,0x1d,0x0, 0xb, 0x28,0x30, +0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x2, +0x1b,0x28,0x30,0xb, 0x28,0x30,0x4e,0x34,0x0, 0x1, 0x1b,0x28,0x30,0x22,0x1, 0x5e, +0x0, 0xa, 0x0, 0x96,0x1, 0x2c,0x0, 0x9, 0x0, 0x50,0x0, 0xfa,0x0, 0x8, 0x0, 0x3c, +0x0, 0xc8,0x0, 0x6, 0x0, 0x32,0x0, 0xa0,0x0, 0x4, 0x0, 0x1e,0x0, 0x78,0x0, 0x3, +0x0, 0xa, 0x0, 0x3c,0x0, 0x2, 0x0, 0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0xf5, +0xf1,0x7c,0xb7,0xf5,0xf2,0x75,0xf3,0x80,0x75,0xf4,0x0, 0x75,0xf5,0x83,0xa9,0x37, +0xf5,0xfc,0xa9,0x36,0xf5,0xfc,0xe5,0xf6,0x43,0xfa,0x80,0xc2,0xc9,0xa9,0xc5,0xcb, +0x22,0xc2,0xaf,0x75,0xfb,0x0, 0xd2,0xc9,0xa9,0xd5,0xcb,0xa, 0x56,0x1e,0x54,0x1e, +0x54,0x3e,0x54,0x3e,0x54,0xf5,0xf1,0x75,0xf2,0x0, 0x75,0xf5,0x90,0x74,0xa, 0x12, +0x6d,0x25,0xc2,0xc9,0xa9,0xc5,0xcb,0xd2,0xaf,0x22,0x12,0x22,0x20,0x12,0x3d,0xb5, +0x12,0x4c,0x41,0x60,0x6, 0x74,0x1, 0x7a,0xb3,0xe, 0xc, 0x7e,0xb3,0xe, 0xb, 0x60, +0x3, 0x12,0x60,0x78,0x7e,0xb3,0xe, 0xc, 0x60,0x6, 0x12,0x55,0x5a,0x2, 0x5f,0x1f, +0x22,0xe4,0x7a,0xb3,0x10,0x3d,0x7a,0xb3,0x10,0x4e,0x7a,0xb3,0xf, 0x28,0x12,0x6a, +0x18,0xb4,0x1, 0xd, 0x74,0x1, 0x7a,0xb3,0x10,0xa5,0x53,0xb, 0x8f,0x74,0x2, 0x80, +0x2, 0x74,0xff,0x7a,0xb3,0xf, 0x28,0x22,0xca,0xf8,0x7e,0xf0,0x1, 0x12,0x66,0x93, +0x7e,0xb3,0x10,0x3d,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x12,0x65,0xe4,0x7e,0xb3, +0x10,0x4e,0xbe,0xb0,0x2, 0x68,0x2, 0x6c,0xff,0x7c,0xbf,0xda,0xf8,0x22,0x7e,0x34, +0xa, 0xb1,0x7e,0x24,0x3, 0x4d,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0xb, 0x86,0x7e,0x24, +0x1, 0x90,0x74,0xff,0x12,0x6d,0xe0,0x7e,0x34,0xd, 0x6b,0x7e,0x24,0x0, 0x8c,0x74, +0xff,0x2, 0x6d,0xe0,0x9, 0xb3,0x0, 0x4d,0xb4,0x1, 0x6, 0x9, 0x53,0x0, 0x51,0x80, +0x3, 0x7e,0x39,0x50,0xa, 0x15,0x7e,0x24,0x1d,0x2, 0x1b,0x28,0x10,0x49,0x23,0x0, +0x3b,0x7e,0x34,0x1d,0x6, 0x1b,0x38,0x20,0x22,0xe4,0x7a,0xb3,0xf, 0xd2,0x6c,0xaa, +0x6d,0x44,0x7e,0x30,0x2, 0xac,0x3a,0x7d,0x1, 0x2d,0x2, 0x1b,0x8, 0x40,0x6d,0x0, +0x2d,0x13,0x1b,0x18,0x0, 0xb, 0xa0,0xbe,0xa0,0x25,0x40,0xe4,0x22,0x7e,0x34,0x12, +0x1, 0x7e,0x24,0x0, 0x1e,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x12,0x1f,0x7e,0x24,0x0, +0x14,0xe4,0x12,0x6d,0xe0,0x7e,0x34,0x11,0xed,0x7e,0x24,0x0, 0x14,0xe4,0x2, 0x6d, +0xe0,0x12,0x0, 0x6e,0x50,0x1d,0x12,0x6e,0xad,0x7c,0xab,0x7e,0xb3,0x11,0x95,0xbe, +0xb0,0x4, 0x68,0xf, 0xbe,0xa0,0xff,0x68,0xa, 0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x7a, +0xa3,0x11,0x95,0x22,0xca,0xf8,0x6c,0xff,0x7e,0xb3,0x10,0x3d,0x70,0x3, 0x7e,0xf0, +0x1, 0x74,0x1, 0x12,0x3e,0xf7,0xbe,0xb0,0x1, 0x68,0x5, 0xbe,0xf0,0x1, 0x78,0x4, +0xe4,0x12,0x3e,0xf7,0xda,0xf8,0x22,0xa9,0xc3,0xe1,0x75,0xe4,0x3, 0x75,0xe5,0x0, +0x75,0xe4,0x4, 0x75,0xe5,0x0, 0x75,0xe4,0x5, 0x75,0xe5,0x0, 0x75,0xe4,0x6, 0x9, +0xb3,0x0, 0x16,0xc4,0x33,0x54,0xe0,0xf5,0xe5,0x22,0x7e,0x34,0x8, 0x9a,0x7e,0x24, +0x11,0x9e,0x7e,0x14,0x1, 0x90,0x12,0x3c,0x70,0x7e,0x34,0x9, 0x2e,0x7e,0x24,0x11, +0x4a,0x7e,0x14,0x0, 0xc8,0x12,0x3c,0x70,0x2, 0x56,0xf3,0x74,0x1, 0x12,0x6e,0x3d, +0xa9,0xc3,0xea,0xa9,0xc6,0xeb,0xa9,0xd6,0xac,0xa9,0xd6,0xec,0xd2,0x86,0x75,0x9a, +0x7f,0xa9,0xd1,0x99,0xd2,0x9c,0xa9,0xd6,0xdf,0xd2,0xaf,0x22,0xe5,0x52,0xb4,0x1, +0x18,0xe5,0x51,0x70,0x14,0x7e,0xb3,0x11,0x95,0x60,0xb, 0xe4,0x7a,0xb3,0x11,0x95, +0x74,0x1, 0x7a,0xb3,0x11,0xc, 0x12,0x6c,0x58,0x85,0x51,0x52,0x22,0x6c,0xaa,0x7e, +0x50,0x4, 0xac,0x5a,0x49,0x12,0x0, 0xec,0xbd,0x13,0x38,0x8, 0x49,0x22,0x0, 0xee, +0xbd,0x23,0x50,0x7, 0xb, 0xa0,0xbe,0xa0,0x3, 0x40,0xe4,0x7c,0xba,0x22,0x7e,0x24, +0x0, 0x2, 0x7e,0x34,0x1d,0x8, 0x1b,0x38,0x20,0x12,0x6d,0x8d,0x12,0x6c,0xab,0x7e, +0x34,0x7, 0xd0,0x7d,0x23,0x1b,0x34,0x4d,0x22,0x78,0xf8,0x2, 0x0, 0x2e,0x75,0x55, +0x0, 0x75,0x73,0x0, 0x75,0x54,0x0, 0x12,0x6b,0xfd,0x12,0x61,0xcd,0xf5,0x53,0x12, +0x62,0x6b,0xb4,0x1, 0x4, 0x75,0x55,0x1, 0x22,0x75,0x55,0x3, 0x22,0x7e,0x34,0x0, +0x1, 0x7a,0x35,0x56,0x7e,0x34,0xa, 0x18,0x7a,0x35,0x58,0x7e,0x34,0x0, 0x2, 0x7a, +0x35,0x5a,0x7e,0x34,0xa, 0x62,0x7a,0x35,0x5c,0x74,0x2, 0x22,0x0, 0x50,0x0, 0xa, +0x6, 0x4, 0x0, 0x78,0x0, 0xc, 0x6, 0x4, 0x0, 0xc8,0x0, 0x1e,0x8, 0x5, 0x1, 0x40, +0x0, 0x50,0x8, 0x5, 0x1, 0xf4,0x0, 0x64,0xa, 0x6, 0xe4,0x7a,0xb3,0x16,0xb1,0x7a, +0xb3,0x16,0xb0,0x7e,0xb3,0x10,0xa3,0x70,0x6, 0x7e,0x73,0x11,0x10,0x80,0x4, 0x7e, +0x73,0x11,0x12,0x7a,0x73,0x16,0xb2,0x22,0xe4,0x7a,0xb3,0x10,0x78,0x74,0x2, 0x7a, +0xb3,0x10,0x7b,0x74,0x4, 0x7a,0xb3,0x10,0x7c,0x7e,0x34,0x16,0x55,0x7e,0x24,0x0, +0x48,0xe4,0x2, 0x6d,0xe0,0x75,0x91,0x0, 0xc2,0x90,0xc2,0x91,0x75,0x92,0x7c,0xd2, +0xad,0xd2,0xe8,0xc2,0xc0,0xa9,0xd5,0xb7,0xd2,0xbd,0xa9,0xd0,0xf7,0xd2,0xf8,0x22, +0xe4,0x7a,0xb3,0xd, 0xfb,0x7e,0x34,0x11,0x9e,0x7a,0x37,0xf, 0xd6,0x12,0x40,0x32, +0x7e,0x34,0x8, 0x9a,0x7a,0x37,0xf, 0xd6,0x2, 0x46,0xe9,0x75,0x75,0x1, 0x7e,0x24, +0x1d,0x0, 0xb, 0x28,0x30,0x4e,0x34,0x2, 0x0, 0x1b,0x28,0x30,0xd2,0xeb,0x7e,0x34, +0x0, 0x1, 0x2, 0x6e,0x27,0xc2,0x8e,0x43,0x89,0x20,0x75,0x8d,0x0, 0xa9,0x34,0xc9, +0x5, 0x75,0x8b,0xe6,0x80,0x3, 0x75,0x8b,0x78,0xd2,0x8e,0xd2,0xab,0x22,0xe5,0x51, +0xb4,0x1, 0x6, 0x7e,0x34,0x0, 0x5a,0x80,0x4, 0x7e,0x34,0x0, 0x3c,0x7a,0x37,0xf, +0x54,0x7a,0x37,0xf, 0x56,0x22,0xca,0xf8,0x12,0x6e,0x32,0x7c,0xfb,0x12,0x0, 0x6e, +0x50,0x7, 0x4c,0xff,0x78,0x3, 0xe4,0x80,0x2, 0x74,0x1, 0xda,0xf8,0x22,0x7e,0x34, +0x0, 0x24,0x12,0x69,0x78,0x7c,0x7b,0xa5,0xbf,0xff,0x3, 0x7e,0x70,0x4, 0xa, 0x57, +0x2e,0x54,0x0, 0x10,0x22,0x7c,0xab,0x80,0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x7c,0x7a,0x1b,0xa0,0xa5,0xbf,0x0, 0xee,0x22,0x7d,0x3, 0x80,0xa, +0x7e,0x29,0xb0,0x7a,0x9, 0xb0,0xb, 0x24,0xb, 0x4, 0x7d,0x51,0x1b,0x14,0x4d,0x55, +0x78,0xee,0x22,0x7e,0x53,0xf, 0x47,0xa, 0x25,0x3e,0x24,0x3e,0x24,0x9d,0x32,0xbe, +0x34,0x0, 0x0, 0x8, 0x1, 0x22,0x6d,0x33,0x22,0x70,0x3, 0x43,0x87,0x1, 0xb4,0x1, +0x3, 0x43,0x87,0x2, 0xb4,0x2, 0x3, 0x43,0x87,0x2, 0x22,0x74,0x3, 0x7a,0xb3,0x16, +0xa3,0xe4,0x7a,0xb3,0x16,0xaa,0x74,0xff,0x7a,0xb3,0x16,0xa2,0x22,0x75,0x76,0x1, +0xd2,0xee,0x75,0xe6,0x0, 0xa9,0xd3,0xe1,0x7e,0x34,0x0, 0x1, 0x2, 0x6e,0x27,0xa, +0x2b,0x19,0x72,0x10,0x7e,0x7e,0xb3,0x10,0xfe,0x44,0x1, 0x7a,0xb3,0x10,0xfe,0x22, +0x7d,0x13,0xbd,0x21,0x50,0x5, 0x7d,0x31,0x9d,0x32,0x22,0x7d,0x32,0x9d,0x31,0x22, +0x14,0x1, 0xa, 0x1, 0x0, 0x2, 0xfb,0x4, 0xf6,0x5, 0xec,0x6, 0xe7,0x7, 0xe2,0x8, +0x7d,0x23,0xbe,0x24,0x0, 0x0, 0x48,0x3, 0x7d,0x32,0x22,0x6d,0x33,0x9d,0x32,0x22, +0x7d,0x13,0x80,0x7, 0x1b,0x24,0x7a,0x19,0xb0,0xb, 0x14,0x4d,0x22,0x78,0xf5,0x22, +0x10,0x10,0x10,0x1c,0x19,0x14,0x10,0xe, 0xc, 0xb, 0xa, 0x9, 0x8, 0x7, 0x6, 0x12, +0x0, 0x42,0x12,0x57,0x73,0x74,0x3, 0x12,0x43,0xae,0x2, 0x24,0xb4,0x7e,0x34,0x0, +0x21,0x12,0x69,0x78,0xb4,0xff,0x3, 0x74,0x1, 0x22,0x22,0x7e,0xb3,0x11,0x15,0xb4, +0x1, 0x4, 0xe4,0x2, 0x6e,0x92,0x22,0x6d,0x22,0x80,0x2, 0xb, 0x24,0xbd,0x32,0x38, +0xfa,0x22,0x12,0x62,0xb7,0xb4,0x1, 0x2, 0xe4,0x22,0x74,0x1, 0x22,0xd2,0xcf,0xa9, +0xd4,0xc9,0x75,0xcc,0x0, 0xc2,0xca,0x22,0xa9,0xc0,0x93,0x75,0x9, 0x0, 0x75,0xa, +0x0, 0x32,0x75,0x53,0x0, 0x75,0x54,0x0, 0x75,0x55,0x0, 0x22,0xa9,0x32,0x99,0x5, +0xd2,0x9c,0xa9,0xd6,0xdf,0x22,0x75,0xb, 0x0, 0x12,0x6e,0xc3,0x2, 0x5e,0x18,0x12, +0x6b,0x5b,0x12,0x6e,0xc9,0x2, 0x6e,0x66,0xe5,0x75,0x60,0x3, 0x74,0x1, 0x22,0xe4, +0x22,0xe5,0x76,0x60,0x3, 0x74,0x1, 0x22,0xe4,0x22,0x1, 0x2, 0x4, 0x8, 0x10,0x20, +0x40,0x80,0x70,0x3, 0xd2,0x86,0x22,0xc2,0x86,0x22,0xa9,0xd0,0x99,0xa9,0xc6,0xdf, +0x22,0xf5,0x17,0x75,0x18,0x0, 0x22,0x12,0x61,0x79,0x2, 0x38,0x4a,0x12,0x4f,0xa8, +0x2, 0x62,0x1d,0x12,0x6e,0xd5,0x2, 0x6b,0xde,0x7e,0x34,0x1, 0x3, 0x22,0x7e,0x34, +0x5, 0xb, 0x22,0x2, 0x6c,0x75,0x2, 0x0, 0x76,0x2, 0x6c,0xc5,0x2, 0x6e,0x9a,0x2, +0x6e,0x5c,0xe5,0x6e,0x22,0x22,0x0, 0x1, 0x0, 0x8b,0x1, 0x0, 0x1, 0xa, 0xac,0x15, +0x0, 0x1, 0xa, 0xad,0x17,0x0, 0x1, 0xa, 0xae,0x4, 0x0, 0x1, 0xd, 0xfe,0x30,0x0, +0x5, 0xf, 0x29,0x20,0x17,0x29,0x38,0x13,0x0, 0x18,0xf, 0x2e,0x0, 0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, +0x0, 0x3, 0x0, 0x0, 0x0, 0x25,0xf, 0x63,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0, 0x18,0xf, +0x88,0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, +0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x0, 0xd, 0xf, 0xa0,0x0, 0x0, 0x0, +0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18,0xf, 0xad,0xc, 0xd, +0xe, 0xf, 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x0, 0x1, 0x2, 0x3, 0x4, 0xb, +0xa, 0x9, 0x8, 0x7, 0x6, 0x5, 0x0, 0xd, 0xf, 0xc5,0x1, 0x2, 0x3, 0x4, 0x5, 0x6, +0x7, 0x8, 0x0, 0x9, 0xa, 0xb, 0xc, 0x0, 0x25,0xf, 0xdc,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0x0, 0xd, 0x10,0xff,0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, +0xa, 0x0, 0x1, 0x11,0xc, 0x0, 0x0, 0x1, 0x11,0x16,0x15,0x0, 0x32,0x11,0x17,0x0, +0x8, 0x0, 0x13,0x0, 0x26,0x0, 0x43,0x0, 0x6c,0x0, 0xa4,0x0, 0xed,0x1, 0x4a,0x1, +0xbc,0x2, 0x45,0x2, 0xe4,0x3, 0x99,0x4, 0x61,0x5, 0x3a,0x6, 0x1f,0x7, 0xc, 0x7, +0xf9,0x8, 0xe1,0x9, 0xbd,0xa, 0x86,0xb, 0x34,0xb, 0xc3,0xc, 0x2d,0xc, 0x6e,0xc, +0x83,0x0, 0x1, 0x11,0x49,0x17,0x0, 0x1, 0x11,0x94,0x2, 0x0, 0x1, 0x11,0x95,0x0, +0x0, 0x4, 0x11,0x97,0xff,0xff,0xff,0xff,0x0, 0x2, 0x11,0x9b,0xff,0x1f,0x0, 0x1, +0x11,0x9d,0x30,0x0, 0x1, 0x11,0xe8,0x0, 0x0, 0x4, 0x11,0xe9,0x23,0x23,0x23,0x23, +0x0, 0x1, 0x16,0x53,0x0, 0x0, 0x1, 0x15,0x53,0x0, 0x0, 0x1, 0x15,0x9e,0x0, 0x0, +0x1, 0x15,0x9f,0x0, 0x0, 0x1, 0x15,0xa0,0x0, 0x0, 0x1, 0x15,0xa1,0x0, 0x0, 0x1, +0x12,0x33,0x0, 0x0, 0x1, 0x16,0xac,0x0, 0x0, 0x1, 0x16,0xb4,0x0, 0x0, 0x1, 0x16, +0xb5,0x0, 0x0, 0x1, 0x16,0xb6,0x0, 0x0, 0x1, 0x16,0xb7,0x0, 0x0, 0x1, 0x16,0xb8, +0x0, 0x0, 0x1, 0x16,0xb9,0x0, 0x0, 0x1, 0x16,0xba,0x1, 0x0, 0x1, 0x16,0xbb,0x1, +0x0, 0xc, 0x0, 0xec,0x0, 0x46,0x0, 0xe6,0x1, 0x18,0x1, 0xb8,0x1, 0xf4,0x2, 0x94, +0x0, 0x6, 0x0, 0xf8,0x0, 0xb4,0x2, 0x1c,0x3, 0x84,0x0, 0x1, 0x16,0x54,0x3, 0x0, +0x1, 0x16,0x9d,0x0, 0x0, 0x1, 0x0, 0xfe,0x0, 0x0, 0x1, 0x0, 0xff,0x0, 0x0, 0x1, +0x16,0xbc,0x0, 0x0, 0x0, 0x53,0x5a,0x1e,0xe1,0xff,0xff,0x70,0xc5,0x8f,0x3a,0xa2, +0x5d,0x9, 0xf3, \ No newline at end of file diff --git a/drivers/input/touchscreen/gen_vkeys.c b/drivers/input/touchscreen/gen_vkeys.c index dde582f4f8bff..d26eb4d28a818 100644 --- a/drivers/input/touchscreen/gen_vkeys.c +++ b/drivers/input/touchscreen/gen_vkeys.c @@ -30,7 +30,7 @@ #define BORDER_ADJUST_NUM 3 #define BORDER_ADJUST_DENOM 4 -static struct kobject *vkey_obj; +struct kobject *vkey_obj; static char *vkey_buf; static ssize_t vkey_show(struct kobject *obj, diff --git a/drivers/input/touchscreen/gen_vkeys_gt.c b/drivers/input/touchscreen/gen_vkeys_gt.c new file mode 100644 index 0000000000000..539b5e50f8655 --- /dev/null +++ b/drivers/input/touchscreen/gen_vkeys_gt.c @@ -0,0 +1,229 @@ +/* Copyright (c) 2013, 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 +#include +#include +#include +#include +#include +#include + +#define MAX_BUF_SIZE 256 +#define VKEY_VER_CODE "0x01" + +#define HEIGHT_SCALE_NUM 8 +#define HEIGHT_SCALE_DENOM 10 + +#define VKEY_Y_OFFSET_DEFAULT 0 + +/* numerator and denomenator for border equations */ +#define BORDER_ADJUST_NUM 3 +#define BORDER_ADJUST_DENOM 4 + +extern struct kobject *vkey_obj; +static char *vkey_buf; + +static ssize_t vkey_show(struct kobject *obj, + struct kobj_attribute *attr, char *buf) +{ + strlcpy(buf, vkey_buf, MAX_BUF_SIZE); + return strnlen(buf, MAX_BUF_SIZE); +} + +static struct kobj_attribute vkey_obj_attr = { + .attr = { + .mode = S_IRUGO, + }, + .show = vkey_show, +}; + +static struct attribute *vkey_attr[] = { + &vkey_obj_attr.attr, + NULL, +}; + +static struct attribute_group vkey_grp = { + .attrs = vkey_attr, +}; + +static int vkey_parse_dt(struct device *dev, + struct vkeys_platform_data *pdata) +{ + struct device_node *np = dev->of_node; + struct property *prop; + int rc, val; + + rc = of_property_read_string(np, "label", &pdata->name); + if (rc) { + dev_err(dev, "Failed to read label\n"); + return -EINVAL; + } + + rc = of_property_read_u32(np, "qcom,disp-maxx", &pdata->disp_maxx); + if (rc) { + dev_err(dev, "Failed to read display max x\n"); + return -EINVAL; + } + + rc = of_property_read_u32(np, "qcom,disp-maxy", &pdata->disp_maxy); + if (rc) { + dev_err(dev, "Failed to read display max y\n"); + return -EINVAL; + } + + rc = of_property_read_u32(np, "qcom,panel-maxx", &pdata->panel_maxx); + if (rc) { + dev_err(dev, "Failed to read panel max x\n"); + return -EINVAL; + } + + rc = of_property_read_u32(np, "qcom,panel-maxy", &pdata->panel_maxy); + if (rc) { + dev_err(dev, "Failed to read panel max y\n"); + return -EINVAL; + } + + prop = of_find_property(np, "qcom,key-codes", NULL); + if (prop) { + pdata->num_keys = prop->length / sizeof(u32); + pdata->keycodes = devm_kzalloc(dev, + sizeof(u32) * pdata->num_keys, GFP_KERNEL); + if (!pdata->keycodes) + return -ENOMEM; + rc = of_property_read_u32_array(np, "qcom,key-codes", + pdata->keycodes, pdata->num_keys); + if (rc) { + dev_err(dev, "Failed to read key codes\n"); + return -EINVAL; + } + } + + pdata->y_offset = VKEY_Y_OFFSET_DEFAULT; + rc = of_property_read_u32(np, "qcom,y-offset", &val); + if (!rc) + pdata->y_offset = val; + else if (rc != -EINVAL) { + dev_err(dev, "Failed to read y position offset\n"); + return rc; + } + return 0; +} + +static int vkeys_probe(struct platform_device *pdev) +{ + struct vkeys_platform_data *pdata; + int width, height, center_x, center_y; + int x1 = 0, x2 = 0, i, c = 0, ret, border; + char *name; + + vkey_buf = devm_kzalloc(&pdev->dev, MAX_BUF_SIZE, GFP_KERNEL); + if (!vkey_buf) { + dev_err(&pdev->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + if (pdev->dev.of_node) { + pdata = devm_kzalloc(&pdev->dev, + sizeof(struct vkeys_platform_data), GFP_KERNEL); + if (!pdata) { + dev_err(&pdev->dev, "Failed to allocate memory\n"); + return -ENOMEM; + } + + ret = vkey_parse_dt(&pdev->dev, pdata); + if (ret) { + dev_err(&pdev->dev, "Parsing DT failed(%d)", ret); + return ret; + } + } else + pdata = pdev->dev.platform_data; + + if (!pdata || !pdata->name || !pdata->keycodes || !pdata->num_keys || + !pdata->disp_maxx || !pdata->disp_maxy || !pdata->panel_maxy) { + dev_err(&pdev->dev, "pdata is invalid\n"); + return -EINVAL; + } + + border = (pdata->panel_maxx - pdata->disp_maxx) * 2; + width = ((pdata->disp_maxx - (border * (pdata->num_keys - 1))) + / pdata->num_keys); + height = (pdata->panel_maxy - pdata->disp_maxy); + center_y = pdata->disp_maxy + (height / 2) + pdata->y_offset; + height = height * HEIGHT_SCALE_NUM / HEIGHT_SCALE_DENOM; + + x2 -= border * BORDER_ADJUST_NUM / BORDER_ADJUST_DENOM; + + for (i = 0; i < pdata->num_keys; i++) { + x1 = x2 + border; + x2 = x2 + border + width; + center_x = x1 + (x2 - x1) / 2; + c += snprintf(vkey_buf + c, MAX_BUF_SIZE - c, + "%s:%d:%d:%d:%d:%d\n", + VKEY_VER_CODE, pdata->keycodes[i], + center_x, center_y, width, height); + } + + vkey_buf[c] = '\0'; + + name = devm_kzalloc(&pdev->dev, sizeof(*name) * MAX_BUF_SIZE, + GFP_KERNEL); + if (!name) + return -ENOMEM; + + snprintf(name, MAX_BUF_SIZE, + "virtualkeys.%s", pdata->name); + vkey_obj_attr.attr.name = name; + + + if (!vkey_obj) { + vkey_obj = kobject_create_and_add("board_properties", NULL); + } + + ret = sysfs_create_group(vkey_obj, &vkey_grp); + if (ret) { + dev_err(&pdev->dev, "failed to create attributes\n"); + goto destroy_kobj; + } + return 0; + +destroy_kobj: + kobject_put(vkey_obj); + + return ret; +} + +static int vkeys_remove(struct platform_device *pdev) +{ + sysfs_remove_group(vkey_obj, &vkey_grp); + kobject_put(vkey_obj); + + return 0; +} + +static struct of_device_id vkey_match_table[] = { + { .compatible = "qcom,gen-vkeys_gt",}, + { }, +}; + +static struct platform_driver vkeys_driver = { + .probe = vkeys_probe, + .remove = vkeys_remove, + .driver = { + .owner = THIS_MODULE, + .name = "gen_vkeys_gt", + .of_match_table = vkey_match_table, + }, +}; + +module_platform_driver(vkeys_driver); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/gt9xx/goodix_tool.c b/drivers/input/touchscreen/gt9xx/goodix_tool.c index 898110fe882c8..55f257d2ad702 100644 --- a/drivers/input/touchscreen/gt9xx/goodix_tool.c +++ b/drivers/input/touchscreen/gt9xx/goodix_tool.c @@ -1,7 +1,7 @@ /* drivers/input/touchscreen/goodix_tool.c * * 2010 - 2012 Goodix Technology. - * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-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 as published by @@ -27,7 +27,7 @@ #include #define DATA_LENGTH_UINT 512 -#define CMD_HEAD_LENGTH (sizeof(struct st_cmd_head) - sizeof(u8 *)) +#define CMD_HEAD_LENGTH (sizeof(struct st_cmd_head)) static char procname[20] = {0}; struct st_cmd_head { @@ -44,10 +44,10 @@ struct st_cmd_head { u8 addr_len; /* address length */ u8 addr[2]; /* address */ u8 res[3]; /* reserved */ - u8 *data; /* data pointer */ } __packed; static struct st_cmd_head cmd_head; +static u8 *cmd_data; static struct i2c_client *gt_client; @@ -192,7 +192,7 @@ static void unregister_i2c_func(void) void uninit_wr_node(void) { - cmd_head.data = NULL; + cmd_data = NULL; unregister_i2c_func(); proc_remove(goodix_proc_entry); } @@ -340,14 +340,14 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, } if (cmd_head.wr == GTP_RW_WRITE) { - ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], + ret = copy_from_user(&cmd_data[GTP_ADDR_LENGTH], &userbuf[CMD_HEAD_LENGTH], cmd_head.data_len); if (ret) { dev_err(>_client->dev, "copy_from_user failed."); goto exit; } - memcpy(&cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + memcpy(&cmd_data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.addr, cmd_head.addr_len); if (cmd_head.flag == GTP_NEED_FLAG) { @@ -360,7 +360,7 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, /* Need interrupt! */ } if (tool_i2c_write( - &cmd_head.data[GTP_ADDR_LENGTH - cmd_head.addr_len], + &cmd_data[GTP_ADDR_LENGTH - cmd_head.addr_len], cmd_head.data_len + cmd_head.addr_len) <= 0) { dev_err(>_client->dev, "Write data failed!"); ret = -EIO; @@ -373,7 +373,7 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, ret = cmd_head.data_len + CMD_HEAD_LENGTH; goto exit; } else if (cmd_head.wr == GTP_RW_WRITE_IC_TYPE) { /* Write ic type */ - ret = copy_from_user(&cmd_head.data[0], + ret = copy_from_user(&cmd_data[0], &userbuf[CMD_HEAD_LENGTH], cmd_head.data_len); if (ret) { @@ -388,7 +388,7 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, ret = -EINVAL; goto exit; } - memcpy(ic_type, cmd_head.data, cmd_head.data_len); + memcpy(ic_type, cmd_data, cmd_head.data_len); register_i2c_func(); @@ -416,13 +416,13 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, } else if (cmd_head.wr == GTP_RW_CHECK_RAWDIFF_MODE) { struct goodix_ts_data *ts = i2c_get_clientdata(gt_client); - ret = copy_from_user(&cmd_head.data[GTP_ADDR_LENGTH], + ret = copy_from_user(&cmd_data[GTP_ADDR_LENGTH], &userbuf[CMD_HEAD_LENGTH], cmd_head.data_len); if (ret) { pr_debug("copy_from_user failed."); goto exit; } - if (cmd_head.data[GTP_ADDR_LENGTH]) { + if (cmd_data[GTP_ADDR_LENGTH]) { pr_debug("gtp enter rawdiff."); ts->gtp_rawdiff_mode = true; } else { @@ -450,11 +450,11 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, ret = -EINVAL; goto exit; } - memset(cmd_head.data, 0, cmd_head.data_len + 1); - memcpy(cmd_head.data, &userbuf[CMD_HEAD_LENGTH], + memset(cmd_data, 0, cmd_head.data_len + 1); + memcpy(cmd_data, &userbuf[CMD_HEAD_LENGTH], cmd_head.data_len); - if (gup_update_proc((void *)cmd_head.data) == FAIL) { + if (gup_update_proc((void *)cmd_data) == FAIL) { ret = -EBUSY; goto exit; } @@ -462,6 +462,9 @@ static s32 goodix_tool_write(struct file *filp, const char __user *userbuf, ret = CMD_HEAD_LENGTH; exit: + memset(&cmd_head, 0, sizeof(cmd_head)); + cmd_head.wr = 0xFF; + mutex_unlock(&lock); return ret; } @@ -500,10 +503,10 @@ static s32 goodix_tool_read(struct file *file, char __user *user_buf, /* Need interrupt! */ } - memcpy(cmd_head.data, cmd_head.addr, cmd_head.addr_len); + memcpy(cmd_data, cmd_head.addr, cmd_head.addr_len); - pr_debug("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_head.data[0], - cmd_head.data[1]); + pr_debug("[CMD HEAD DATA] ADDR:0x%02x%02x.", cmd_data[0], + cmd_data[1]); pr_debug("[CMD HEAD ADDR] ADDR:0x%02x%02x.", cmd_head.addr[0], cmd_head.addr[1]); @@ -520,13 +523,13 @@ static s32 goodix_tool_read(struct file *file, char __user *user_buf, if (data_len > count) data_len = count; - if (tool_i2c_read(cmd_head.data, data_len) <= 0) { + if (tool_i2c_read(cmd_data, data_len) <= 0) { dev_err(>_client->dev, "Read data failed!\n"); ret = -EIO; goto exit; } ret = simple_read_from_buffer(user_buf, count, ppos, - &cmd_head.data[GTP_ADDR_LENGTH], data_len); + &cmd_data[GTP_ADDR_LENGTH], data_len); break; case GTP_RW_FILL_INFO: ret = fill_update_info(user_buf, count, ppos); @@ -561,13 +564,13 @@ s32 init_wr_node(struct i2c_client *client) gt_client = client; memset(&cmd_head, 0, sizeof(cmd_head)); - cmd_head.data = NULL; + cmd_data = NULL; i = GTP_I2C_RETRY_5; - while ((!cmd_head.data) && i) { - cmd_head.data = devm_kzalloc(&client->dev, + while ((!cmd_data) && i) { + cmd_data = devm_kzalloc(&client->dev, i * DATA_LENGTH_UINT, GFP_KERNEL); - if (cmd_head.data) + if (cmd_data) break; i--; } diff --git a/drivers/input/touchscreen/gt9xx/gt9xx.c b/drivers/input/touchscreen/gt9xx/gt9xx.c index d4dc15cea38ab..4d93bb8e05914 100644 --- a/drivers/input/touchscreen/gt9xx/gt9xx.c +++ b/drivers/input/touchscreen/gt9xx/gt9xx.c @@ -973,7 +973,8 @@ static int gtp_init_panel(struct goodix_ts_data *ts) } } /* !DRIVER NOT SEND CONFIG */ - if ((ts->abs_x_max == 0) && (ts->abs_y_max == 0)) { + if ((ts->abs_x_max == 0) && (ts->abs_y_max == 0) && + (config_data != NULL)) { ts->abs_x_max = (config_data[RESOLUTION_LOC + 1] << 8) + config_data[RESOLUTION_LOC]; ts->abs_y_max = (config_data[RESOLUTION_LOC + 3] << 8) @@ -2120,8 +2121,8 @@ static int goodix_ts_probe(struct i2c_client *client, flush_workqueue(ts->goodix_wq); destroy_workqueue(ts->goodix_wq); - input_unregister_device(ts->input_dev); if (ts->input_dev) { + input_unregister_device(ts->input_dev); input_free_device(ts->input_dev); ts->input_dev = NULL; } @@ -2155,28 +2156,26 @@ static int goodix_ts_remove(struct i2c_client *client) { struct goodix_ts_data *ts = i2c_get_clientdata(client); - sysfs_remove_group(&ts->input_dev->dev.kobj, >p_attr_grp); + if (ts) { + sysfs_remove_group(&ts->input_dev->dev.kobj, >p_attr_grp); #if defined(CONFIG_FB) - if (fb_unregister_client(&ts->fb_notif)) - dev_err(&client->dev, - "Error occurred while unregistering fb_notifier.\n"); + fb_unregister_client(&ts->fb_notif); #elif defined(CONFIG_HAS_EARLYSUSPEND) - unregister_early_suspend(&ts->early_suspend); + unregister_early_suspend(&ts->early_suspend); #endif - mutex_destroy(&ts->lock); + mutex_destroy(&ts->lock); #ifdef CONFIG_GT9XX_TOUCHPANEL_DEBUG - uninit_wr_node(); + uninit_wr_node(); #endif #if GTP_ESD_PROTECT - cancel_work_sync(gtp_esd_check_workqueue); - flush_workqueue(gtp_esd_check_workqueue); - destroy_workqueue(gtp_esd_check_workqueue); + cancel_work_sync(gtp_esd_check_workqueue); + flush_workqueue(gtp_esd_check_workqueue); + destroy_workqueue(gtp_esd_check_workqueue); #endif - if (ts) { if (ts->use_irq) free_irq(client->irq, ts); @@ -2184,8 +2183,8 @@ static int goodix_ts_remove(struct i2c_client *client) flush_workqueue(ts->goodix_wq); destroy_workqueue(ts->goodix_wq); - input_unregister_device(ts->input_dev); if (ts->input_dev) { + input_unregister_device(ts->input_dev); input_free_device(ts->input_dev); ts->input_dev = NULL; } @@ -2198,8 +2197,8 @@ static int goodix_ts_remove(struct i2c_client *client) goodix_power_off(ts); goodix_power_deinit(ts); i2c_set_clientdata(client, NULL); + debugfs_remove_recursive(ts->debug_base); } - debugfs_remove_recursive(ts->debug_base); return 0; } diff --git a/drivers/input/touchscreen/gt9xx/gt9xx_update.c b/drivers/input/touchscreen/gt9xx/gt9xx_update.c index 98f537b7a9b55..a9eee67342cac 100644 --- a/drivers/input/touchscreen/gt9xx/gt9xx_update.c +++ b/drivers/input/touchscreen/gt9xx/gt9xx_update.c @@ -953,27 +953,14 @@ static u8 gup_burn_dsp_isp(struct i2c_client *client) { s32 ret = 0; u8 *fw_dsp_isp = NULL; - u8 retry = 0; pr_debug("Begin burn dsp isp."); /* step1:alloc memory */ pr_debug("step1:alloc memory"); - while (retry++ < 5) { - fw_dsp_isp = devm_kzalloc(&client->dev, FW_DSP_ISP_LENGTH, - GFP_KERNEL); - if (fw_dsp_isp == NULL) { - continue; - } else { - pr_info("Alloc %dk byte memory success.", - (FW_DSP_ISP_LENGTH/1024)); - break; - } - } - if (retry == 5) { - pr_err("Alloc memory fail,exit."); + fw_dsp_isp = devm_kzalloc(&client->dev, FW_DSP_ISP_LENGTH, GFP_KERNEL); + if (fw_dsp_isp == NULL) return FAIL; - } /* step2:load dsp isp file data */ pr_debug("step2:load dsp isp file data"); @@ -1059,28 +1046,15 @@ static u8 gup_burn_dsp_isp(struct i2c_client *client) static u8 gup_burn_fw_ss51(struct i2c_client *client) { u8 *fw_ss51 = NULL; - u8 retry = 0; s32 ret = 0; pr_debug("Begin burn ss51 firmware."); /* step1:alloc memory */ pr_debug("step1:alloc memory"); - while (retry++ < 5) { - fw_ss51 = devm_kzalloc(&client->dev, FW_SECTION_LENGTH, - GFP_KERNEL); - if (fw_ss51 == NULL) { - continue; - } else { - pr_info("Alloc %dk byte memory success.", - (FW_SECTION_LENGTH/1024)); - break; - } - } - if (retry == 5) { - pr_err("Alloc memory fail,exit."); + fw_ss51 = devm_kzalloc(&client->dev, FW_SECTION_LENGTH, GFP_KERNEL); + if (fw_ss51 == NULL) return FAIL; - } /* step2:load ss51 firmware section 1 file data */ pr_debug("step2:load ss51 firmware section 1 file data"); @@ -1164,27 +1138,14 @@ static u8 gup_burn_fw_dsp(struct i2c_client *client) { s32 ret = 0; u8 *fw_dsp = NULL; - u8 retry = 0; u8 rd_buf[5]; pr_debug("Begin burn dsp firmware."); /* step1:alloc memory */ pr_debug("step1:alloc memory"); - while (retry++ < 5) { - fw_dsp = devm_kzalloc(&client->dev, FW_DSP_LENGTH, - GFP_KERNEL); - if (fw_dsp == NULL) { - continue; - } else { - pr_info("Alloc %dk byte memory success.", - (FW_SECTION_LENGTH/1024)); - break; - } - } - if (retry == 5) { - pr_err("Alloc memory fail,exit."); + fw_dsp = devm_kzalloc(&client->dev, FW_DSP_LENGTH, GFP_KERNEL); + if (fw_dsp == NULL) return FAIL; - } /* step2:load firmware dsp */ pr_debug("step2:load firmware dsp"); @@ -1268,28 +1229,15 @@ static u8 gup_burn_fw_boot(struct i2c_client *client) { s32 ret = 0; u8 *fw_boot = NULL; - u8 retry = 0; u8 rd_buf[5]; pr_debug("Begin burn bootloader firmware."); /* step1:Alloc memory */ pr_debug("step1:Alloc memory"); - while (retry++ < 5) { - fw_boot = devm_kzalloc(&client->dev, FW_BOOT_LENGTH, - GFP_KERNEL); - if (fw_boot == NULL) { - continue; - } else { - pr_info("Alloc %dk byte memory success.", - (FW_BOOT_LENGTH/1024)); - break; - } - } - if (retry == 5) { - pr_err("Alloc memory fail,exit."); + fw_boot = devm_kzalloc(&client->dev, FW_BOOT_LENGTH, GFP_KERNEL); + if (fw_boot == NULL) return FAIL; - } /* step2:load firmware bootloader */ pr_debug("step2:load firmware bootloader"); diff --git a/drivers/input/touchscreen/msg21xx_ts.c b/drivers/input/touchscreen/msg21xx_ts.c deleted file mode 100644 index 8e8d9ec6b15cc..0000000000000 --- a/drivers/input/touchscreen/msg21xx_ts.c +++ /dev/null @@ -1,2168 +0,0 @@ -/* - * MStar MSG21XX touchscreen driver - * - * Copyright (c) 2006-2012 MStar Semiconductor, Inc. - * - * Copyright (C) 2012 Bruce Ding - * - * Copyright (c) 2014-2015, 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 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. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#if defined(CONFIG_FB) -#include -#include -#endif -#ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR -#include -#endif - -/* Constant Value & Variable Definition*/ - -#define MSTAR_VTG_MIN_UV 2800000 -#define MSTAR_VTG_MAX_UV 3300000 -#define MSTAR_I2C_VTG_MIN_UV 1800000 -#define MSTAR_I2C_VTG_MAX_UV 1800000 - -#define MAX_BUTTONS 4 -#define FT_COORDS_ARR_SIZE 4 -#define MSTAR_FW_NAME_MAX_LEN 50 - -#define MSTAR_CHIPTOP_REGISTER_BANK 0x1E -#define MSTAR_CHIPTOP_REGISTER_ICTYPE 0xCC -#define MSTAR_INIT_SW_ID 0x7FF -#define MSTAR_DEBUG_DIR_NAME "ts_debug" - -#define MSG_FW_FILE_MAJOR_VERSION(x) \ - (((x)->data[0x7f4f] << 8) + ((x)->data[0x7f4e])) - -#define MSG_FW_FILE_MINOR_VERSION(x) \ - (((x)->data[0x7f51] << 8) + ((x)->data[0x7f50])) - -/* - * Note. - * Please do not change the below setting. - */ -#define TPD_WIDTH (2048) -#define TPD_HEIGHT (2048) - -#define PINCTRL_STATE_ACTIVE "pmx_ts_active" -#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" -#define PINCTRL_STATE_RELEASE "pmx_ts_release" - -#define SLAVE_I2C_ID_DBBUS (0xC4>>1) - -#define DEMO_MODE_PACKET_LENGTH (8) - -#define TP_PRINT - -/*store the frimware binary data*/ -static unsigned char fw_bin_data[94][1024]; -static unsigned int crc32_table[256]; - -static unsigned short fw_file_major, fw_file_minor; -static unsigned short main_sw_id = MSTAR_INIT_SW_ID; -static unsigned short info_sw_id = MSTAR_INIT_SW_ID; -static unsigned int bin_conf_crc32; - -struct msg21xx_ts_platform_data { - const char *name; - char fw_name[MSTAR_FW_NAME_MAX_LEN]; - u8 fw_version_major; - u8 fw_version_minor; - u32 irq_gpio; - u32 irq_gpio_flags; - u32 reset_gpio; - u32 reset_gpio_flags; - u32 x_max; - u32 y_max; - u32 x_min; - u32 y_min; - u32 panel_minx; - u32 panel_miny; - u32 panel_maxx; - u32 panel_maxy; - u32 num_max_touches; - u8 ic_type; - u32 button_map[MAX_BUTTONS]; - u32 num_buttons; - u32 hard_reset_delay_ms; - u32 post_hard_reset_delay_ms; - bool updating_fw; -}; - -/* Touch Data Type Definition */ -struct touchPoint_t { - unsigned short x; - unsigned short y; -}; - -struct touchInfo_t { - struct touchPoint_t *point; - unsigned char count; - unsigned char keycode; -}; - -struct msg21xx_ts_data { - struct i2c_client *client; - struct input_dev *input_dev; - struct msg21xx_ts_platform_data *pdata; - struct regulator *vdd; - struct regulator *vcc_i2c; - bool suspended; -#if defined(CONFIG_FB) - struct notifier_block fb_notif; -#endif - struct pinctrl *ts_pinctrl; - struct pinctrl_state *pinctrl_state_active; - struct pinctrl_state *pinctrl_state_suspend; - struct pinctrl_state *pinctrl_state_release; - struct mutex ts_mutex; - struct touchInfo_t info; -}; - -#if defined(CONFIG_FB) -static int fb_notifier_callback(struct notifier_block *self, - unsigned long event, void *data); -#endif - -#ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR -static unsigned char bEnableTpProximity; -static unsigned char bFaceClosingTp; -#endif - -#ifdef TP_PRINT -static int tp_print_proc_read(struct msg21xx_ts_data *ts_data); -static void tp_print_create_entry(struct msg21xx_ts_data *ts_data); -#endif - -static void _ReadBinConfig(struct msg21xx_ts_data *ts_data); -static unsigned int _CalMainCRC32(struct msg21xx_ts_data *ts_data); - -static struct mutex msg21xx_mutex; - -enum EMEM_TYPE_t { - EMEM_ALL = 0, - EMEM_MAIN, - EMEM_INFO, -}; - -/* Function Definition */ - -static unsigned int _CRC_doReflect(unsigned int ref, signed char ch) -{ - unsigned int value = 0; - unsigned int i = 0; - - for (i = 1; i < (ch + 1); i++) { - if (ref & 1) - value |= 1 << (ch - i); - ref >>= 1; - } - - return value; -} - -static unsigned int _CRC_getValue(unsigned int text, unsigned int prevCRC) -{ - unsigned int ulCRC = prevCRC; - - ulCRC = (ulCRC >> 8) ^ crc32_table[(ulCRC & 0xFF) ^ text]; - - return ulCRC; -} - -static void _CRC_initTable(void) -{ - unsigned int magic_number = 0x04c11db7; - unsigned int i, j; - - for (i = 0; i <= 0xFF; i++) { - crc32_table[i] = _CRC_doReflect(i, 8) << 24; - for (j = 0; j < 8; j++) - crc32_table[i] = (crc32_table[i] << 1) ^ - (crc32_table[i] & (0x80000000L) ? - magic_number : 0); - crc32_table[i] = _CRC_doReflect(crc32_table[i], 32); - } -} - -static void msg21xx_reset_hw(struct msg21xx_ts_platform_data *pdata) -{ - unsigned int delay; - - gpio_direction_output(pdata->reset_gpio, 1); - gpio_set_value_cansleep(pdata->reset_gpio, 0); - /* Note that the RST must be in LOW 10ms at least */ - delay = pdata->hard_reset_delay_ms * 1000; - usleep_range(delay, delay + 1); - gpio_set_value_cansleep(pdata->reset_gpio, 1); - /* Enable the interrupt service thread/routine for INT after 50ms */ - delay = pdata->post_hard_reset_delay_ms * 1000; - usleep_range(delay, delay + 1); -} - -static int read_i2c_seq(struct msg21xx_ts_data *ts_data, unsigned char addr, - unsigned char *buf, unsigned short size) -{ - int rc = 0; - struct i2c_msg msgs[] = { - { - .addr = addr, - .flags = I2C_M_RD, /* read flag */ - .len = size, - .buf = buf, - }, - }; - - /* If everything went ok (i.e. 1 msg transmitted), return #bytes - transmitted, else error code. */ - if (ts_data->client != NULL) { - rc = i2c_transfer(ts_data->client->adapter, msgs, 1); - if (rc < 0) - dev_err(&ts_data->client->dev, - "%s error %d\n", __func__, rc); - } else { - dev_err(&ts_data->client->dev, "ts_data->client is NULL\n"); - } - - return rc; -} - -static int write_i2c_seq(struct msg21xx_ts_data *ts_data, unsigned char addr, - unsigned char *buf, unsigned short size) -{ - int rc = 0; - struct i2c_msg msgs[] = { - { - .addr = addr, - /* - * if read flag is undefined, - * then it means write flag. - */ - .flags = 0, - .len = size, - .buf = buf, - }, - }; - - /* - * If everything went ok (i.e. 1 msg transmitted), return #bytes - * transmitted, else error code. - */ - if (ts_data->client != NULL) { - rc = i2c_transfer(ts_data->client->adapter, msgs, 1); - if (rc < 0) - dev_err(&ts_data->client->dev, - "%s error %d\n", __func__, rc); - } else { - dev_err(&ts_data->client->dev, "ts_data->client is NULL\n"); - } - - return rc; -} - -static unsigned short read_reg(struct msg21xx_ts_data *ts_data, - unsigned char bank, unsigned char addr) -{ - unsigned char tx_data[3] = {0x10, bank, addr}; - unsigned char rx_data[2] = {0}; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, tx_data, sizeof(tx_data)); - read_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, rx_data, sizeof(rx_data)); - - return rx_data[1] << 8 | rx_data[0]; -} - -static void write_reg(struct msg21xx_ts_data *ts_data, unsigned char bank, - unsigned char addr, - unsigned short data) -{ - unsigned char tx_data[5] = {0x10, bank, addr, data & 0xFF, data >> 8}; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, tx_data, sizeof(tx_data)); -} - -static void write_reg_8bit(struct msg21xx_ts_data *ts_data, unsigned char bank, - unsigned char addr, - unsigned char data) -{ - unsigned char tx_data[4] = {0x10, bank, addr, data}; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, tx_data, sizeof(tx_data)); -} - -static void dbbusDWIICEnterSerialDebugMode(struct msg21xx_ts_data *ts_data) -{ - unsigned char data[5]; - - /* Enter the Serial Debug Mode */ - data[0] = 0x53; - data[1] = 0x45; - data[2] = 0x52; - data[3] = 0x44; - data[4] = 0x42; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, data, sizeof(data)); -} - -static void dbbusDWIICStopMCU(struct msg21xx_ts_data *ts_data) -{ - unsigned char data[1]; - - /* Stop the MCU */ - data[0] = 0x37; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, data, sizeof(data)); -} - -static void dbbusDWIICIICUseBus(struct msg21xx_ts_data *ts_data) -{ - unsigned char data[1]; - - /* IIC Use Bus */ - data[0] = 0x35; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, data, sizeof(data)); -} - -static void dbbusDWIICIICReshape(struct msg21xx_ts_data *ts_data) -{ - unsigned char data[1]; - - /* IIC Re-shape */ - data[0] = 0x71; - - write_i2c_seq(ts_data, SLAVE_I2C_ID_DBBUS, data, sizeof(data)); -} - -static unsigned char msg21xx_get_ic_type(struct msg21xx_ts_data *ts_data) -{ - unsigned char ic_type = 0; - unsigned char bank; - unsigned char addr; - - msg21xx_reset_hw(ts_data->pdata); - dbbusDWIICEnterSerialDebugMode(ts_data); - dbbusDWIICStopMCU(ts_data); - dbbusDWIICIICUseBus(ts_data); - dbbusDWIICIICReshape(ts_data); - msleep(300); - - /* stop mcu */ - write_reg_8bit(ts_data, 0x0F, 0xE6, 0x01); - /* disable watch dog */ - write_reg(ts_data, 0x3C, 0x60, 0xAA55); - /* get ic type */ - bank = MSTAR_CHIPTOP_REGISTER_BANK; - addr = MSTAR_CHIPTOP_REGISTER_ICTYPE; - ic_type = (0xff)&(read_reg(ts_data, bank, addr)); - - if (ic_type != ts_data->pdata->ic_type) - ic_type = 0; - - msg21xx_reset_hw(ts_data->pdata); - - return ic_type; -} - -static int msg21xx_read_firmware_id(struct msg21xx_ts_data *ts_data) -{ - unsigned char command[3] = { 0x53, 0x00, 0x2A}; - unsigned char response[4] = { 0 }; - - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data, ts_data->client->addr, command, sizeof(command)); - read_i2c_seq(ts_data, ts_data->client->addr, response, - sizeof(response)); - mutex_unlock(&msg21xx_mutex); - ts_data->pdata->fw_version_major = (response[1]<<8) + response[0]; - ts_data->pdata->fw_version_minor = (response[3]<<8) + response[2]; - - dev_info(&ts_data->client->dev, "major num = %d, minor num = %d\n", - ts_data->pdata->fw_version_major, - ts_data->pdata->fw_version_minor); - - return 0; -} - -static int firmware_erase_c33(struct msg21xx_ts_data *ts_data, - enum EMEM_TYPE_t emem_type) -{ - /* stop mcu */ - write_reg(ts_data, 0x0F, 0xE6, 0x0001); - - /* disable watch dog */ - write_reg_8bit(ts_data, 0x3C, 0x60, 0x55); - write_reg_8bit(ts_data, 0x3C, 0x61, 0xAA); - - /* set PROGRAM password */ - write_reg_8bit(ts_data, 0x16, 0x1A, 0xBA); - write_reg_8bit(ts_data, 0x16, 0x1B, 0xAB); - - write_reg_8bit(ts_data, 0x16, 0x18, 0x80); - - if (emem_type == EMEM_ALL) - write_reg_8bit(ts_data, 0x16, 0x08, 0x10); - - write_reg_8bit(ts_data, 0x16, 0x18, 0x40); - msleep(20); - - /* clear pce */ - write_reg_8bit(ts_data, 0x16, 0x18, 0x80); - - /* erase trigger */ - if (emem_type == EMEM_MAIN) - write_reg_8bit(ts_data, 0x16, 0x0E, 0x04); /* erase main */ - else - write_reg_8bit(ts_data, 0x16, 0x0E, 0x08); /* erase all block */ - - return 0; -} - -static ssize_t firmware_update_c33(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size, - enum EMEM_TYPE_t emem_type, - bool isForce) { - unsigned int i, j; - unsigned int crc_main, crc_main_tp; - unsigned int crc_info, crc_info_tp; - unsigned short reg_data = 0; - int update_pass = 1; - bool fw_upgrade = false; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - crc_main = 0xffffffff; - crc_info = 0xffffffff; - - msg21xx_reset_hw(ts_data->pdata); - - msg21xx_read_firmware_id(ts_data); - _ReadBinConfig(ts_data); - if ((main_sw_id == info_sw_id) && - (_CalMainCRC32(ts_data) == bin_conf_crc32) && - (fw_file_major == ts_data->pdata->fw_version_major) && - (fw_file_minor > ts_data->pdata->fw_version_minor)) { - fw_upgrade = true; - } - - if (!fw_upgrade && !isForce) { - dev_dbg(dev, "no need to update\n"); - msg21xx_reset_hw(ts_data->pdata); - return size; - } - msg21xx_reset_hw(ts_data->pdata); - msleep(300); - - dbbusDWIICEnterSerialDebugMode(ts_data); - dbbusDWIICStopMCU(ts_data); - dbbusDWIICIICUseBus(ts_data); - dbbusDWIICIICReshape(ts_data); - msleep(300); - - /* erase main */ - firmware_erase_c33(ts_data, EMEM_MAIN); - msleep(1000); - - msg21xx_reset_hw(ts_data->pdata); - dbbusDWIICEnterSerialDebugMode(ts_data); - dbbusDWIICStopMCU(ts_data); - dbbusDWIICIICUseBus(ts_data); - dbbusDWIICIICReshape(ts_data); - msleep(300); - - /* - * Program - */ - - /* polling 0x3CE4 is 0x1C70 */ - if ((emem_type == EMEM_ALL) || (emem_type == EMEM_MAIN)) { - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0x1C70); - } - - switch (emem_type) { - case EMEM_ALL: - write_reg(ts_data, 0x3C, 0xE4, 0xE38F); /* for all-blocks */ - break; - case EMEM_MAIN: - write_reg(ts_data, 0x3C, 0xE4, 0x7731); /* for main block */ - break; - case EMEM_INFO: - write_reg(ts_data, 0x3C, 0xE4, 0x7731); /* for info block */ - - write_reg_8bit(ts_data, 0x0F, 0xE6, 0x01); - - write_reg_8bit(ts_data, 0x3C, 0xE4, 0xC5); - write_reg_8bit(ts_data, 0x3C, 0xE5, 0x78); - - write_reg_8bit(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, - 0x04, 0x9F); - write_reg_8bit(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, - 0x05, 0x82); - - write_reg_8bit(ts_data, 0x0F, 0xE6, 0x00); - msleep(100); - break; - } - - /* polling 0x3CE4 is 0x2F43 */ - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0x2F43); - - /* calculate CRC 32 */ - _CRC_initTable(); - - /* total 32 KB : 2 byte per R/W */ - for (i = 0; i < 32; i++) { - if (i == 31) { - fw_bin_data[i][1014] = 0x5A; - fw_bin_data[i][1015] = 0xA5; - - for (j = 0; j < 1016; j++) - crc_main = _CRC_getValue(fw_bin_data[i][j], - crc_main); - } else { - for (j = 0; j < 1024; j++) - crc_main = _CRC_getValue(fw_bin_data[i][j], - crc_main); - } - - for (j = 0; j < 8; j++) - write_i2c_seq(ts_data, ts_data->client->addr, - &fw_bin_data[i][j * 128], 128); - msleep(100); - - /* polling 0x3CE4 is 0xD0BC */ - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0xD0BC); - - write_reg(ts_data, 0x3C, 0xE4, 0x2F43); - } - - if ((emem_type == EMEM_ALL) || (emem_type == EMEM_MAIN)) { - /* write file done and check crc */ - write_reg(ts_data, 0x3C, 0xE4, 0x1380); - } - msleep(20); - - if ((emem_type == EMEM_ALL) || (emem_type == EMEM_MAIN)) { - /* polling 0x3CE4 is 0x9432 */ - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0x9432); - } - - crc_main = crc_main ^ 0xffffffff; - crc_info = crc_info ^ 0xffffffff; - - if ((emem_type == EMEM_ALL) || (emem_type == EMEM_MAIN)) { - /* CRC Main from TP */ - crc_main_tp = read_reg(ts_data, 0x3C, 0x80); - crc_main_tp = (crc_main_tp << 16) | - read_reg(ts_data, 0x3C, 0x82); - - /* CRC Info from TP */ - crc_info_tp = read_reg(ts_data, 0x3C, 0xA0); - crc_info_tp = (crc_info_tp << 16) | - read_reg(ts_data, 0x3C, 0xA2); - } - - update_pass = 1; - if ((emem_type == EMEM_ALL) || (emem_type == EMEM_MAIN)) { - if (crc_main_tp != crc_main) - update_pass = 0; - } - - if (!update_pass) { - dev_err(dev, "update_C33 failed\n"); - msg21xx_reset_hw(ts_data->pdata); - return 0; - } - - dev_dbg(dev, "update_C33 OK\n"); - msg21xx_reset_hw(ts_data->pdata); - return size; -} - -static unsigned int _CalMainCRC32(struct msg21xx_ts_data *ts_data) -{ - unsigned int ret = 0; - unsigned short reg_data = 0; - - msg21xx_reset_hw(ts_data->pdata); - - dbbusDWIICEnterSerialDebugMode(ts_data); - dbbusDWIICStopMCU(ts_data); - dbbusDWIICIICUseBus(ts_data); - dbbusDWIICIICReshape(ts_data); - msleep(100); - - /* Stop MCU */ - write_reg(ts_data, 0x0F, 0xE6, 0x0001); - - /* Stop Watchdog */ - write_reg_8bit(ts_data, 0x3C, 0x60, 0x55); - write_reg_8bit(ts_data, 0x3C, 0x61, 0xAA); - - /* cmd */ - write_reg(ts_data, 0x3C, 0xE4, 0xDF4C); - write_reg(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, 0x04, 0x7d60); - /* TP SW reset */ - write_reg(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, 0x04, 0x829F); - - /* MCU run */ - write_reg(ts_data, 0x0F, 0xE6, 0x0000); - - /* polling 0x3CE4 */ - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0x9432); - - /* Cal CRC Main from TP */ - ret = read_reg(ts_data, 0x3C, 0x80); - ret = (ret << 16) | read_reg(ts_data, 0x3C, 0x82); - - dev_dbg(&ts_data->client->dev, - "[21xxA]:Current main crc32=0x%x\n", ret); - return ret; -} - -static void _ReadBinConfig(struct msg21xx_ts_data *ts_data) -{ - unsigned char dbbus_tx_data[5] = {0}; - unsigned char dbbus_rx_data[4] = {0}; - unsigned short reg_data = 0; - - msg21xx_reset_hw(ts_data->pdata); - - dbbusDWIICEnterSerialDebugMode(ts_data); - dbbusDWIICStopMCU(ts_data); - dbbusDWIICIICUseBus(ts_data); - dbbusDWIICIICReshape(ts_data); - msleep(100); - - /* Stop MCU */ - write_reg(ts_data, 0x0F, 0xE6, 0x0001); - - /* Stop Watchdog */ - write_reg_8bit(ts_data, 0x3C, 0x60, 0x55); - write_reg_8bit(ts_data, 0x3C, 0x61, 0xAA); - - /* cmd */ - write_reg(ts_data, 0x3C, 0xE4, 0xA4AB); - write_reg(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, 0x04, 0x7d60); - - /* TP SW reset */ - write_reg(ts_data, MSTAR_CHIPTOP_REGISTER_BANK, 0x04, 0x829F); - - /* MCU run */ - write_reg(ts_data, 0x0F, 0xE6, 0x0000); - - /* polling 0x3CE4 */ - do { - reg_data = read_reg(ts_data, 0x3C, 0xE4); - } while (reg_data != 0x5B58); - - dbbus_tx_data[0] = 0x72; - dbbus_tx_data[1] = 0x7F; - dbbus_tx_data[2] = 0x55; - dbbus_tx_data[3] = 0x00; - dbbus_tx_data[4] = 0x04; - write_i2c_seq(ts_data, ts_data->client->addr, &dbbus_tx_data[0], 5); - read_i2c_seq(ts_data, ts_data->client->addr, &dbbus_rx_data[0], 4); - if ((dbbus_rx_data[0] >= 0x30 && dbbus_rx_data[0] <= 0x39) - && (dbbus_rx_data[1] >= 0x30 && dbbus_rx_data[1] <= 0x39) - && (dbbus_rx_data[2] >= 0x31 && dbbus_rx_data[2] <= 0x39)) { - main_sw_id = (dbbus_rx_data[0] - 0x30) * 100 + - (dbbus_rx_data[1] - 0x30) * 10 + - (dbbus_rx_data[2] - 0x30); - } - - dbbus_tx_data[0] = 0x72; - dbbus_tx_data[1] = 0x7F; - dbbus_tx_data[2] = 0xFC; - dbbus_tx_data[3] = 0x00; - dbbus_tx_data[4] = 0x04; - write_i2c_seq(ts_data, ts_data->client->addr, &dbbus_tx_data[0], 5); - read_i2c_seq(ts_data, ts_data->client->addr, &dbbus_rx_data[0], 4); - bin_conf_crc32 = (dbbus_rx_data[0] << 24) | - (dbbus_rx_data[1] << 16) | - (dbbus_rx_data[2] << 8) | - (dbbus_rx_data[3]); - - dbbus_tx_data[0] = 0x72; - dbbus_tx_data[1] = 0x83; - dbbus_tx_data[2] = 0x00; - dbbus_tx_data[3] = 0x00; - dbbus_tx_data[4] = 0x04; - write_i2c_seq(ts_data, ts_data->client->addr, &dbbus_tx_data[0], 5); - read_i2c_seq(ts_data, ts_data->client->addr, &dbbus_rx_data[0], 4); - if ((dbbus_rx_data[0] >= 0x30 && dbbus_rx_data[0] <= 0x39) - && (dbbus_rx_data[1] >= 0x30 && dbbus_rx_data[1] <= 0x39) - && (dbbus_rx_data[2] >= 0x31 && dbbus_rx_data[2] <= 0x39)) { - info_sw_id = (dbbus_rx_data[0] - 0x30) * 100 + - (dbbus_rx_data[1] - 0x30) * 10 + - (dbbus_rx_data[2] - 0x30); - } - - dev_dbg(&ts_data->client->dev, - "[21xxA]:main_sw_id = %d, info_sw_id = %d, bin_conf_crc32 = 0x%x\n", - main_sw_id, info_sw_id, bin_conf_crc32); -} - -static ssize_t firmware_update_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - return snprintf(buf, 3, "%d\n", ts_data->pdata->updating_fw); -} - -static ssize_t firmware_update_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t size) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - ts_data->pdata->updating_fw = true; - disable_irq(ts_data->client->irq); - - size = firmware_update_c33(dev, attr, buf, size, EMEM_MAIN, false); - - enable_irq(ts_data->client->irq); - ts_data->pdata->updating_fw = false; - - return size; -} - -static DEVICE_ATTR(update, (S_IRUGO | S_IWUSR), - firmware_update_show, - firmware_update_store); - -static int prepare_fw_data(struct device *dev) -{ - int count; - int i; - int ret; - const struct firmware *fw = NULL; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - ret = request_firmware(&fw, ts_data->pdata->fw_name, dev); - if (ret < 0) { - dev_err(dev, "Request firmware failed - %s (%d)\n", - ts_data->pdata->fw_name, ret); - return ret; - } - - count = fw->size / 1024; - - for (i = 0; i < count; i++) - memcpy(fw_bin_data[i], fw->data + (i * 1024), 1024); - - fw_file_major = MSG_FW_FILE_MAJOR_VERSION(fw); - fw_file_minor = MSG_FW_FILE_MINOR_VERSION(fw); - dev_dbg(dev, "New firmware: %d.%d", - fw_file_major, fw_file_minor); - - return fw->size; -} - -static ssize_t firmware_update_smart_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t size) -{ - int ret; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - ret = prepare_fw_data(dev); - if (ret < 0) { - dev_err(dev, "Request firmware failed -(%d)\n", ret); - return ret; - } - ts_data->pdata->updating_fw = true; - disable_irq(ts_data->client->irq); - - ret = firmware_update_c33(dev, attr, buf, size, EMEM_MAIN, false); - if (ret == 0) - dev_err(dev, "firmware_update_c33 ret = %d\n", ret); - - enable_irq(ts_data->client->irq); - ts_data->pdata->updating_fw = false; - - return ret; -} - -static ssize_t firmware_force_update_smart_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t size) -{ - int ret; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - ret = prepare_fw_data(dev); - if (ret < 0) { - dev_err(dev, "Request firmware failed -(%d)\n", ret); - return ret; - } - ts_data->pdata->updating_fw = true; - disable_irq(ts_data->client->irq); - - ret = firmware_update_c33(dev, attr, buf, size, EMEM_MAIN, true); - if (ret == 0) - dev_err(dev, "firmware_update_c33 et = %d\n", ret); - - enable_irq(ts_data->client->irq); - ts_data->pdata->updating_fw = false; - - return ret; -} - -static DEVICE_ATTR(update_fw, (S_IRUGO | S_IWUSR), - firmware_update_show, - firmware_update_smart_store); - -static DEVICE_ATTR(force_update_fw, (S_IRUGO | S_IWUSR), - firmware_update_show, - firmware_force_update_smart_store); - -static ssize_t firmware_version_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - msg21xx_read_firmware_id(ts_data); - return snprintf(buf, sizeof(char) * 8, "%03d%03d\n", - ts_data->pdata->fw_version_major, - ts_data->pdata->fw_version_minor); -} - -static DEVICE_ATTR(version, S_IRUGO, - firmware_version_show, - NULL); - - -static ssize_t msg21xx_fw_name_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - return snprintf(buf, MSTAR_FW_NAME_MAX_LEN - 1, - "%s\n", ts_data->pdata->fw_name); -} - -static ssize_t msg21xx_fw_name_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t size) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - if (size > MSTAR_FW_NAME_MAX_LEN - 1) - return -EINVAL; - - strlcpy(ts_data->pdata->fw_name, buf, size); - if (ts_data->pdata->fw_name[size - 1] == '\n') - ts_data->pdata->fw_name[size - 1] = 0; - - return size; -} - -static DEVICE_ATTR(fw_name, (S_IRUGO | S_IWUSR), - msg21xx_fw_name_show, msg21xx_fw_name_store); - -static ssize_t firmware_data_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t size) -{ - int count = size / 1024; - int i; - - for (i = 0; i < count; i++) - memcpy(fw_bin_data[i], buf + (i * 1024), 1024); - - if (buf != NULL) - dev_dbg(dev, "buf[0] = %c\n", buf[0]); - - return size; -} - -static DEVICE_ATTR(data, S_IWUSR, NULL, firmware_data_store); - -static ssize_t tp_print_show(struct device *dev, - struct device_attribute *attr, - char *buf) -{ - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - tp_print_proc_read(ts_data); - - return snprintf(buf, 3, "%d\n", ts_data->suspended); -} - -static ssize_t tp_print_store(struct device *dev, - struct device_attribute *attr, - const char *buf, - size_t size) -{ - return size; -} - -static DEVICE_ATTR(tpp, (S_IRUGO | S_IWUSR), - tp_print_show, tp_print_store); - -#ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR -static void _msg_enable_proximity(void) -{ - unsigned char tx_data[4] = {0}; - - tx_data[0] = 0x52; - tx_data[1] = 0x00; - tx_data[2] = 0x47; - tx_data[3] = 0xa0; - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data->client->addr, &tx_data[0], 4); - mutex_unlock(&msg21xx_mutex); - - bEnableTpProximity = 1; -} - -static void _msg_disable_proximity(void) -{ - unsigned char tx_data[4] = {0}; - - tx_data[0] = 0x52; - tx_data[1] = 0x00; - tx_data[2] = 0x47; - tx_data[3] = 0xa1; - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data->client->addr, &tx_data[0], 4); - mutex_unlock(&msg21xx_mutex); - - bEnableTpProximity = 0; - bFaceClosingTp = 0; -} - -static void tsps_msg21xx_enable(int en) -{ - if (en) - _msg_enable_proximity(); - else - _msg_disable_proximity(); -} - -static int tsps_msg21xx_data(void) -{ - return bFaceClosingTp; -} -#endif - -static int msg21xx_pinctrl_init(struct msg21xx_ts_data *ts_data) -{ - int retval; - - /* Get pinctrl if target uses pinctrl */ - ts_data->ts_pinctrl = devm_pinctrl_get(&(ts_data->client->dev)); - if (IS_ERR_OR_NULL(ts_data->ts_pinctrl)) { - retval = PTR_ERR(ts_data->ts_pinctrl); - dev_dbg(&ts_data->client->dev, - "Target does not use pinctrl %d\n", retval); - goto err_pinctrl_get; - } - - ts_data->pinctrl_state_active = pinctrl_lookup_state( - ts_data->ts_pinctrl, PINCTRL_STATE_ACTIVE); - if (IS_ERR_OR_NULL(ts_data->pinctrl_state_active)) { - retval = PTR_ERR(ts_data->pinctrl_state_active); - dev_dbg(&ts_data->client->dev, - "Can't lookup %s pinstate %d\n", - PINCTRL_STATE_ACTIVE, retval); - goto err_pinctrl_lookup; - } - - ts_data->pinctrl_state_suspend = pinctrl_lookup_state( - ts_data->ts_pinctrl, PINCTRL_STATE_SUSPEND); - if (IS_ERR_OR_NULL(ts_data->pinctrl_state_suspend)) { - retval = PTR_ERR(ts_data->pinctrl_state_suspend); - dev_dbg(&ts_data->client->dev, - "Can't lookup %s pinstate %d\n", - PINCTRL_STATE_SUSPEND, retval); - goto err_pinctrl_lookup; - } - - ts_data->pinctrl_state_release = pinctrl_lookup_state( - ts_data->ts_pinctrl, PINCTRL_STATE_RELEASE); - if (IS_ERR_OR_NULL(ts_data->pinctrl_state_release)) { - retval = PTR_ERR(ts_data->pinctrl_state_release); - dev_dbg(&ts_data->client->dev, - "Can't lookup %s pinstate %d\n", - PINCTRL_STATE_RELEASE, retval); - } - - return 0; - -err_pinctrl_lookup: - devm_pinctrl_put(ts_data->ts_pinctrl); -err_pinctrl_get: - ts_data->ts_pinctrl = NULL; - return retval; -} - -static unsigned char calculate_checksum(unsigned char *msg, int length) -{ - int checksum = 0, i; - - for (i = 0; i < length; i++) - checksum += msg[i]; - - return (unsigned char)((-checksum) & 0xFF); -} - -static int parse_info(struct msg21xx_ts_data *ts_data) -{ - unsigned char data[DEMO_MODE_PACKET_LENGTH] = {0}; - unsigned char checksum = 0; - unsigned int x = 0, y = 0; - unsigned int x2 = 0, y2 = 0; - unsigned int delta_x = 0, delta_y = 0; - - mutex_lock(&msg21xx_mutex); - read_i2c_seq(ts_data, ts_data->client->addr, &data[0], - DEMO_MODE_PACKET_LENGTH); - mutex_unlock(&msg21xx_mutex); - checksum = calculate_checksum(&data[0], (DEMO_MODE_PACKET_LENGTH-1)); - dev_dbg(&ts_data->client->dev, "check sum: [%x] == [%x]?\n", - data[DEMO_MODE_PACKET_LENGTH-1], checksum); - - if (data[DEMO_MODE_PACKET_LENGTH-1] != checksum) { - dev_err(&ts_data->client->dev, "WRONG CHECKSUM\n"); - return -EINVAL; - } - - if (data[0] != 0x52) { - dev_err(&ts_data->client->dev, "WRONG HEADER\n"); - return -EINVAL; - } - - ts_data->info.keycode = 0xFF; - if ((data[1] == 0xFF) && (data[2] == 0xFF) && - (data[3] == 0xFF) && (data[4] == 0xFF) && - (data[6] == 0xFF)) { - if ((data[5] == 0xFF) || (data[5] == 0)) { - ts_data->info.keycode = 0xFF; - } else if ((data[5] == 1) || (data[5] == 2) || - (data[5] == 4) || (data[5] == 8)) { - ts_data->info.keycode = data[5] >> 1; - - dev_dbg(&ts_data->client->dev, - "ts_data->info.keycode index %d\n", - ts_data->info.keycode); - } - #ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR - else if (bEnableTpProximity && ((data[5] == 0x80) || - (data[5] == 0x40))) { - if (data[5] == 0x80) - bFaceClosingTp = 1; - else if (data[5] == 0x40) - bFaceClosingTp = 0; - - return -EINVAL; - } - #endif - else { - dev_err(&ts_data->client->dev, "WRONG KEY\n"); - return -EINVAL; - } - } else { - x = (((data[1] & 0xF0) << 4) | data[2]); - y = (((data[1] & 0x0F) << 8) | data[3]); - delta_x = (((data[4] & 0xF0) << 4) | data[5]); - delta_y = (((data[4] & 0x0F) << 8) | data[6]); - - if ((delta_x == 0) && (delta_y == 0)) { - ts_data->info.point[0].x = - x * ts_data->pdata->x_max / TPD_WIDTH; - ts_data->info.point[0].y = - y * ts_data->pdata->y_max / TPD_HEIGHT; - ts_data->info.count = 1; - } else { - if (delta_x > 2048) - delta_x -= 4096; - - if (delta_y > 2048) - delta_y -= 4096; - - x2 = (unsigned int)((signed short)x + - (signed short)delta_x); - y2 = (unsigned int)((signed short)y + - (signed short)delta_y); - ts_data->info.point[0].x = - x * ts_data->pdata->x_max / TPD_WIDTH; - ts_data->info.point[0].y = - y * ts_data->pdata->y_max / TPD_HEIGHT; - ts_data->info.point[1].x = - x2 * ts_data->pdata->x_max / TPD_WIDTH; - ts_data->info.point[1].y = - y2 * ts_data->pdata->y_max / TPD_HEIGHT; - ts_data->info.count = ts_data->pdata->num_max_touches; - } - } - - return 0; -} - -static void touch_driver_touch_released(struct msg21xx_ts_data *ts_data) -{ - int i; - - for (i = 0; i < ts_data->pdata->num_max_touches; i++) { - input_mt_slot(ts_data->input_dev, i); - input_mt_report_slot_state(ts_data->input_dev, - MT_TOOL_FINGER, 0); - } - - input_report_key(ts_data->input_dev, BTN_TOUCH, 0); - input_report_key(ts_data->input_dev, BTN_TOOL_FINGER, 0); - input_sync(ts_data->input_dev); -} - -/* read data through I2C then report data to input -sub-system when interrupt occurred */ -static irqreturn_t msg21xx_ts_interrupt(int irq, void *dev_id) -{ - int i = 0; - static int last_keycode = 0xFF; - static int last_count; - struct msg21xx_ts_data *ts_data = dev_id; - - ts_data->info.count = 0; - if (0 == parse_info(ts_data)) { - if (ts_data->info.keycode != 0xFF) { /* key touch pressed */ - if (ts_data->info.keycode < - ts_data->pdata->num_buttons) { - if (ts_data->info.keycode != last_keycode) { - dev_dbg(&ts_data->client->dev, - "key touch pressed"); - - input_report_key(ts_data->input_dev, - BTN_TOUCH, 1); - input_report_key(ts_data->input_dev, - ts_data->pdata->button_map[ - ts_data->info.keycode], 1); - - last_keycode = ts_data->info.keycode; - } else { - /* pass duplicate key-pressing */ - dev_dbg(&ts_data->client->dev, - "REPEATED KEY\n"); - } - } else { - dev_dbg(&ts_data->client->dev, "WRONG KEY\n"); - } - } else { /* key touch released */ - if (last_keycode != 0xFF) { - dev_dbg(&ts_data->client->dev, "key touch released"); - - input_report_key(ts_data->input_dev, - BTN_TOUCH, 0); - input_report_key(ts_data->input_dev, - ts_data->pdata->button_map[last_keycode], - 0); - - last_keycode = 0xFF; - } - } - - if (ts_data->info.count > 0) { /* point touch pressed */ - for (i = 0; i < ts_data->info.count; i++) { - input_mt_slot(ts_data->input_dev, i); - input_mt_report_slot_state(ts_data->input_dev, - MT_TOOL_FINGER, 1); - input_report_abs(ts_data->input_dev, - ABS_MT_TOUCH_MAJOR, 1); - input_report_abs(ts_data->input_dev, - ABS_MT_POSITION_X, - ts_data->info.point[i].x); - input_report_abs(ts_data->input_dev, - ABS_MT_POSITION_Y, - ts_data->info.point[i].y); - } - } - - if (last_count > ts_data->info.count) { - for (i = ts_data->info.count; - i < ts_data->pdata->num_max_touches; - i++) { - input_mt_slot(ts_data->input_dev, i); - input_mt_report_slot_state(ts_data->input_dev, - MT_TOOL_FINGER, 0); - } - } - last_count = ts_data->info.count; - - input_report_key(ts_data->input_dev, BTN_TOUCH, - ts_data->info.count > 0); - input_report_key(ts_data->input_dev, BTN_TOOL_FINGER, - ts_data->info.count > 0); - - input_sync(ts_data->input_dev); - } - - return IRQ_HANDLED; -} - -static int msg21xx_ts_power_init(struct msg21xx_ts_data *ts_data, bool init) -{ - int rc; - - if (init) { - ts_data->vdd = regulator_get(&ts_data->client->dev, - "vdd"); - if (IS_ERR(ts_data->vdd)) { - rc = PTR_ERR(ts_data->vdd); - dev_err(&ts_data->client->dev, - "Regulator get failed vdd rc=%d\n", rc); - return rc; - } - - if (regulator_count_voltages(ts_data->vdd) > 0) { - rc = regulator_set_voltage(ts_data->vdd, - MSTAR_VTG_MIN_UV, - MSTAR_VTG_MAX_UV); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator set_vtg failed vdd rc=%d\n", - rc); - goto reg_vdd_put; - } - } - - ts_data->vcc_i2c = regulator_get(&ts_data->client->dev, - "vcc_i2c"); - if (IS_ERR(ts_data->vcc_i2c)) { - rc = PTR_ERR(ts_data->vcc_i2c); - dev_err(&ts_data->client->dev, - "Regulator get failed vcc_i2c rc=%d\n", rc); - goto reg_vdd_set_vtg; - } - - if (regulator_count_voltages(ts_data->vcc_i2c) > 0) { - rc = regulator_set_voltage(ts_data->vcc_i2c, - MSTAR_I2C_VTG_MIN_UV, - MSTAR_I2C_VTG_MAX_UV); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator set_vtg failed vcc_i2c rc=%d\n", rc); - goto reg_vcc_i2c_put; - } - } - } else { - if (regulator_count_voltages(ts_data->vdd) > 0) - regulator_set_voltage(ts_data->vdd, 0, - MSTAR_VTG_MAX_UV); - - regulator_put(ts_data->vdd); - - if (regulator_count_voltages(ts_data->vcc_i2c) > 0) - regulator_set_voltage(ts_data->vcc_i2c, 0, - MSTAR_I2C_VTG_MAX_UV); - - regulator_put(ts_data->vcc_i2c); - } - - return 0; - -reg_vcc_i2c_put: - regulator_put(ts_data->vcc_i2c); -reg_vdd_set_vtg: - if (regulator_count_voltages(ts_data->vdd) > 0) - regulator_set_voltage(ts_data->vdd, 0, MSTAR_VTG_MAX_UV); -reg_vdd_put: - regulator_put(ts_data->vdd); - return rc; -} - -static int msg21xx_ts_power_on(struct msg21xx_ts_data *ts_data, bool on) -{ - int rc; - - if (!on) - goto power_off; - - rc = regulator_enable(ts_data->vdd); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator vdd enable failed rc=%d\n", rc); - return rc; - } - - rc = regulator_enable(ts_data->vcc_i2c); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator vcc_i2c enable failed rc=%d\n", rc); - regulator_disable(ts_data->vdd); - } - - return rc; - -power_off: - rc = regulator_disable(ts_data->vdd); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator vdd disable failed rc=%d\n", rc); - return rc; - } - - rc = regulator_disable(ts_data->vcc_i2c); - if (rc) { - dev_err(&ts_data->client->dev, - "Regulator vcc_i2c disable failed rc=%d\n", rc); - rc = regulator_enable(ts_data->vdd); - } - - return rc; -} - -static int msg21xx_ts_gpio_configure(struct msg21xx_ts_data *ts_data, bool on) -{ - int ret = 0; - - if (!on) - goto pwr_deinit; - - if (gpio_is_valid(ts_data->pdata->irq_gpio)) { - ret = gpio_request(ts_data->pdata->irq_gpio, - "msg21xx_irq_gpio"); - if (ret) { - dev_err(&ts_data->client->dev, - "Failed to request GPIO[%d], %d\n", - ts_data->pdata->irq_gpio, ret); - goto err_irq_gpio_req; - } - ret = gpio_direction_input(ts_data->pdata->irq_gpio); - if (ret) { - dev_err(&ts_data->client->dev, - "Failed to set direction for gpio[%d], %d\n", - ts_data->pdata->irq_gpio, ret); - goto err_irq_gpio_dir; - } - gpio_set_value_cansleep(ts_data->pdata->irq_gpio, 1); - } else { - dev_err(&ts_data->client->dev, "irq gpio not provided\n"); - goto err_irq_gpio_req; - } - - if (gpio_is_valid(ts_data->pdata->reset_gpio)) { - ret = gpio_request(ts_data->pdata->reset_gpio, - "msg21xx_reset_gpio"); - if (ret) { - dev_err(&ts_data->client->dev, - "Failed to request GPIO[%d], %d\n", - ts_data->pdata->reset_gpio, ret); - goto err_reset_gpio_req; - } - - /* power on TP */ - ret = gpio_direction_output( - ts_data->pdata->reset_gpio, 1); - if (ret) { - dev_err(&ts_data->client->dev, - "Failed to set direction for GPIO[%d], %d\n", - ts_data->pdata->reset_gpio, ret); - goto err_reset_gpio_dir; - } - msleep(100); - gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); - msleep(20); - gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 1); - msleep(200); - } else { - dev_err(&ts_data->client->dev, "reset gpio not provided\n"); - goto err_reset_gpio_req; - } - - return 0; - -err_reset_gpio_dir: - if (gpio_is_valid(ts_data->pdata->reset_gpio)) - gpio_free(ts_data->pdata->irq_gpio); -err_reset_gpio_req: -err_irq_gpio_dir: - if (gpio_is_valid(ts_data->pdata->irq_gpio)) - gpio_free(ts_data->pdata->irq_gpio); -err_irq_gpio_req: - return ret; - -pwr_deinit: - if (gpio_is_valid(ts_data->pdata->irq_gpio)) - gpio_free(ts_data->pdata->irq_gpio); - if (gpio_is_valid(ts_data->pdata->reset_gpio)) { - gpio_set_value_cansleep(ts_data->pdata->reset_gpio, 0); - ret = gpio_direction_input(ts_data->pdata->reset_gpio); - if (ret) - dev_err(&ts_data->client->dev, - "Unable to set direction for gpio [%d]\n", - ts_data->pdata->reset_gpio); - gpio_free(ts_data->pdata->reset_gpio); - } - return 0; -} - -#ifdef CONFIG_PM -static int msg21xx_ts_resume(struct device *dev) -{ - int retval; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - if (!ts_data->suspended) { - dev_info(dev, "msg21xx_ts already in resume\n"); - return 0; - } - - mutex_lock(&ts_data->ts_mutex); - - retval = msg21xx_ts_power_on(ts_data, true); - if (retval) { - dev_err(dev, "msg21xx_ts power on failed"); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - - if (ts_data->ts_pinctrl) { - retval = pinctrl_select_state(ts_data->ts_pinctrl, - ts_data->pinctrl_state_active); - if (retval < 0) { - dev_err(dev, "Cannot get active pinctrl state\n"); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - } - - retval = msg21xx_ts_gpio_configure(ts_data, true); - if (retval) { - dev_err(dev, "Failed to put gpios in active state %d", - retval); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - - enable_irq(ts_data->client->irq); - ts_data->suspended = false; - - mutex_unlock(&ts_data->ts_mutex); - - return 0; -} - -static int msg21xx_ts_suspend(struct device *dev) -{ - int retval; - struct msg21xx_ts_data *ts_data = dev_get_drvdata(dev); - - if (ts_data->pdata->updating_fw) { - dev_info(dev, "Firmware loading in progress\n"); - return 0; - } - - if (ts_data->suspended) { - dev_info(dev, "msg21xx_ts already in suspend\n"); - return 0; - } - -#ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR - if (bEnableTpProximity) { - dev_dbg(dev, "suspend bEnableTpProximity=%d\n", - bEnableTpProximity); - return 0; - } -#endif - - mutex_lock(&ts_data->ts_mutex); - - disable_irq(ts_data->client->irq); - - touch_driver_touch_released(ts_data); - - if (ts_data->ts_pinctrl) { - retval = pinctrl_select_state(ts_data->ts_pinctrl, - ts_data->pinctrl_state_suspend); - if (retval < 0) { - dev_err(dev, "Cannot get idle pinctrl state %d\n", - retval); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - } - - retval = msg21xx_ts_gpio_configure(ts_data, false); - if (retval) { - dev_err(dev, "Failed to put gpios in idle state %d", - retval); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - - retval = msg21xx_ts_power_on(ts_data, false); - if (retval) { - dev_err(dev, "msg21xx_ts power off failed"); - mutex_unlock(&ts_data->ts_mutex); - return retval; - } - - ts_data->suspended = true; - - mutex_unlock(&ts_data->ts_mutex); - - return 0; -} -#else -static int msg21xx_ts_resume(struct device *dev) -{ - return 0; -} -static int msg21xx_ts_suspend(struct device *dev) -{ - return 0; -} -#endif - -static int msg21xx_debug_suspend_set(void *_data, u64 val) -{ - struct msg21xx_ts_data *data = _data; - - mutex_lock(&data->input_dev->mutex); - - if (val) - msg21xx_ts_suspend(&data->client->dev); - else - msg21xx_ts_resume(&data->client->dev); - - mutex_unlock(&data->input_dev->mutex); - - return 0; -} - -static int msg21xx_debug_suspend_get(void *_data, u64 *val) -{ - struct msg21xx_ts_data *data = _data; - - mutex_lock(&data->input_dev->mutex); - *val = data->suspended; - mutex_unlock(&data->input_dev->mutex); - - return 0; -} - -DEFINE_SIMPLE_ATTRIBUTE(debug_suspend_fops, msg21xx_debug_suspend_get, - msg21xx_debug_suspend_set, "%lld\n"); - - -#if defined(CONFIG_FB) -static int fb_notifier_callback(struct notifier_block *self, - unsigned long event, void *data) -{ - struct fb_event *evdata = data; - int *blank; - struct msg21xx_ts_data *ts_data = - container_of(self, struct msg21xx_ts_data, fb_notif); - - if (evdata && evdata->data && event == FB_EVENT_BLANK) { - blank = evdata->data; - if (*blank == FB_BLANK_UNBLANK) - msg21xx_ts_resume(&ts_data->client->dev); - else if (*blank == FB_BLANK_POWERDOWN) - msg21xx_ts_suspend(&ts_data->client->dev); - } - - return 0; -} -#endif - -static int msg21xx_get_dt_coords(struct device *dev, char *name, - struct msg21xx_ts_platform_data *pdata) -{ - u32 coords[FT_COORDS_ARR_SIZE]; - struct property *prop; - struct device_node *np = dev->of_node; - int coords_size, rc; - - prop = of_find_property(np, name, NULL); - if (!prop) - return -EINVAL; - if (!prop->value) - return -ENODATA; - - coords_size = prop->length / sizeof(u32); - if (coords_size != FT_COORDS_ARR_SIZE) { - dev_err(dev, "invalid %s\n", name); - return -EINVAL; - } - - rc = of_property_read_u32_array(np, name, coords, coords_size); - if (rc && (rc != -EINVAL)) { - dev_err(dev, "Unable to read %s\n", name); - return rc; - } - - if (!strcmp(name, "mstar,panel-coords")) { - pdata->panel_minx = coords[0]; - pdata->panel_miny = coords[1]; - pdata->panel_maxx = coords[2]; - pdata->panel_maxy = coords[3]; - } else if (!strcmp(name, "mstar,display-coords")) { - pdata->x_min = coords[0]; - pdata->y_min = coords[1]; - pdata->x_max = coords[2]; - pdata->y_max = coords[3]; - } else { - dev_err(dev, "unsupported property %s\n", name); - return -EINVAL; - } - - return 0; -} - -static int msg21xx_parse_dt(struct device *dev, - struct msg21xx_ts_platform_data *pdata) -{ - int rc; - struct device_node *np = dev->of_node; - struct property *prop; - u32 temp_val; - - rc = msg21xx_get_dt_coords(dev, "mstar,panel-coords", pdata); - if (rc && (rc != -EINVAL)) - return rc; - - rc = msg21xx_get_dt_coords(dev, "mstar,display-coords", pdata); - if (rc) - return rc; - - rc = of_property_read_u32(np, "mstar,hard-reset-delay-ms", - &temp_val); - if (!rc) - pdata->hard_reset_delay_ms = temp_val; - else - return rc; - - rc = of_property_read_u32(np, "mstar,post-hard-reset-delay-ms", - &temp_val); - if (!rc) - pdata->post_hard_reset_delay_ms = temp_val; - else - return rc; - - /* reset, irq gpio info */ - pdata->reset_gpio = of_get_named_gpio_flags(np, "mstar,reset-gpio", - 0, &pdata->reset_gpio_flags); - if (pdata->reset_gpio < 0) - return pdata->reset_gpio; - - pdata->irq_gpio = of_get_named_gpio_flags(np, "mstar,irq-gpio", - 0, &pdata->irq_gpio_flags); - if (pdata->irq_gpio < 0) - return pdata->irq_gpio; - - rc = of_property_read_u32(np, "mstar,ic-type", &temp_val); - if (rc && (rc != -EINVAL)) - return rc; - - pdata->ic_type = temp_val; - - rc = of_property_read_u32(np, "mstar,num-max-touches", &temp_val); - if (!rc) - pdata->num_max_touches = temp_val; - else - return rc; - - prop = of_find_property(np, "mstar,button-map", NULL); - if (prop) { - pdata->num_buttons = prop->length / sizeof(temp_val); - if (pdata->num_buttons > MAX_BUTTONS) - return -EINVAL; - - rc = of_property_read_u32_array(np, - "mstar,button-map", pdata->button_map, - pdata->num_buttons); - if (rc) { - dev_err(dev, "Unable to read key codes\n"); - return rc; - } - } - - return 0; -} - -/* probe function is used for matching and initializing input device */ -static int msg21xx_ts_probe(struct i2c_client *client, - const struct i2c_device_id *id) { - - int ret = 0, i; - struct dentry *temp, *dir; - struct input_dev *input_dev; - struct msg21xx_ts_data *ts_data; - struct msg21xx_ts_platform_data *pdata; - - if (client->dev.of_node) { - pdata = devm_kzalloc(&client->dev, - sizeof(struct msg21xx_ts_platform_data), GFP_KERNEL); - if (!pdata) - return -ENOMEM; - - ret = msg21xx_parse_dt(&client->dev, pdata); - if (ret) { - dev_err(&client->dev, "DT parsing failed\n"); - return ret; - } - } else - pdata = client->dev.platform_data; - - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { - dev_err(&client->dev, "I2C not supported\n"); - return -ENODEV; - } - - ts_data = devm_kzalloc(&client->dev, - sizeof(struct msg21xx_ts_data), GFP_KERNEL); - if (!ts_data) - return -ENOMEM; - - ts_data->client = client; - ts_data->info.point = devm_kzalloc(&client->dev, - sizeof(struct touchPoint_t) * pdata->num_max_touches, - GFP_KERNEL); - if (!ts_data->info.point) { - dev_err(&client->dev, "Not enough memory\n"); - return -ENOMEM; - } - - /* allocate an input device */ - input_dev = input_allocate_device(); - if (!input_dev) { - ret = -ENOMEM; - dev_err(&client->dev, "input device allocation failed\n"); - goto err_input_allocate_dev; - } - - input_dev->name = client->name; - input_dev->phys = "I2C"; - input_dev->dev.parent = &client->dev; - input_dev->id.bustype = BUS_I2C; - - ts_data->input_dev = input_dev; - ts_data->client = client; - ts_data->pdata = pdata; - - input_set_drvdata(input_dev, ts_data); - i2c_set_clientdata(client, ts_data); - - ret = msg21xx_ts_power_init(ts_data, true); - if (ret) { - dev_err(&client->dev, "Mstar power init failed\n"); - return ret; - } - - ret = msg21xx_ts_power_on(ts_data, true); - if (ret) { - dev_err(&client->dev, "Mstar power on failed\n"); - goto exit_deinit_power; - } - - ret = msg21xx_pinctrl_init(ts_data); - if (!ret && ts_data->ts_pinctrl) { - /* - * Pinctrl handle is optional. If pinctrl handle is found - * let pins to be configured in active state. If not - * found continue further without error. - */ - ret = pinctrl_select_state(ts_data->ts_pinctrl, - ts_data->pinctrl_state_active); - if (ret < 0) - dev_err(&client->dev, - "Failed to select %s pinatate %d\n", - PINCTRL_STATE_ACTIVE, ret); - } - - ret = msg21xx_ts_gpio_configure(ts_data, true); - if (ret) { - dev_err(&client->dev, "Failed to configure gpio %d\n", ret); - goto exit_gpio_config; - } - - if (msg21xx_get_ic_type(ts_data) == 0) { - dev_err(&client->dev, "The current IC is not Mstar\n"); - ret = -1; - goto err_wrong_ic_type; - } - - mutex_init(&msg21xx_mutex); - mutex_init(&ts_data->ts_mutex); - - /* set the supported event type for input device */ - set_bit(EV_ABS, input_dev->evbit); - set_bit(EV_SYN, input_dev->evbit); - set_bit(EV_KEY, input_dev->evbit); - set_bit(BTN_TOUCH, input_dev->keybit); - set_bit(BTN_TOOL_FINGER, input_dev->keybit); - set_bit(INPUT_PROP_DIRECT, input_dev->propbit); - - for (i = 0; i < pdata->num_buttons; i++) - input_set_capability(input_dev, EV_KEY, pdata->button_map[i]); - - input_set_abs_params(input_dev, ABS_MT_TOUCH_MAJOR, 0, 2, 0, 0); - input_set_abs_params(input_dev, ABS_MT_POSITION_X, - 0, pdata->x_max, 0, 0); - input_set_abs_params(input_dev, ABS_MT_POSITION_Y, - 0, pdata->y_max, 0, 0); - ret = input_mt_init_slots(input_dev, pdata->num_max_touches, 0); - if (ret) { - dev_err(&client->dev, - "Error %d initialising slots\n", ret); - goto err_free_mem; - } - - /* register the input device to input sub-system */ - ret = input_register_device(input_dev); - if (ret < 0) { - dev_err(&client->dev, - "Unable to register ms-touchscreen input device\n"); - goto err_input_reg_dev; - } - - /* version */ - if (device_create_file(&client->dev, &dev_attr_version) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_version.attr.name); - goto err_create_fw_ver_file; - } - /* update */ - if (device_create_file(&client->dev, &dev_attr_update) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_update.attr.name); - goto err_create_fw_update_file; - } - /* data */ - if (device_create_file(&client->dev, &dev_attr_data) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_data.attr.name); - goto err_create_fw_data_file; - } - /* fw name */ - if (device_create_file(&client->dev, &dev_attr_fw_name) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_fw_name.attr.name); - goto err_create_fw_name_file; - } - /* smart fw update */ - if (device_create_file(&client->dev, &dev_attr_update_fw) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_update_fw.attr.name); - goto err_create_update_fw_file; - } - /* smart fw force update */ - if (device_create_file(&client->dev, - &dev_attr_force_update_fw) < 0) { - dev_err(&client->dev, - "Failed to create device file(%s)!\n", - dev_attr_force_update_fw.attr.name); - goto err_create_force_update_fw_file; - } - dir = debugfs_create_dir(MSTAR_DEBUG_DIR_NAME, NULL); - temp = debugfs_create_file("suspend", S_IRUSR | S_IWUSR, dir, - ts_data, &debug_suspend_fops); - if (temp == NULL || IS_ERR(temp)) { - dev_err(&client->dev, - "debugfs_create_file failed: rc=%ld\n", PTR_ERR(temp)); - goto free_debug_dir; - } - -#ifdef TP_PRINT - tp_print_create_entry(ts_data); -#endif - - ret = request_threaded_irq(client->irq, NULL, - msg21xx_ts_interrupt, - pdata->irq_gpio_flags | IRQF_ONESHOT, - "msg21xx", ts_data); - if (ret) - goto err_req_irq; - - disable_irq(client->irq); - -#if defined(CONFIG_FB) - ts_data->fb_notif.notifier_call = fb_notifier_callback; - ret = fb_register_client(&ts_data->fb_notif); -#endif - -#ifdef CONFIG_TOUCHSCREEN_PROXIMITY_SENSOR - tsps_assist_register_callback("msg21xx", &tsps_msg21xx_enable, - &tsps_msg21xx_data); -#endif - - dev_dbg(&client->dev, "mstar touch screen registered\n"); - enable_irq(client->irq); - return 0; - -err_req_irq: - free_irq(client->irq, ts_data); - device_remove_file(&client->dev, &dev_attr_data); -free_debug_dir: - debugfs_remove_recursive(dir); -err_create_fw_data_file: - device_remove_file(&client->dev, &dev_attr_update); -err_create_fw_update_file: - device_remove_file(&client->dev, &dev_attr_version); -err_create_fw_name_file: - device_remove_file(&client->dev, &dev_attr_fw_name); -err_create_update_fw_file: - device_remove_file(&client->dev, &dev_attr_update_fw); -err_create_force_update_fw_file: - device_remove_file(&client->dev, &dev_attr_force_update_fw); -err_create_fw_ver_file: - input_unregister_device(input_dev); - -err_input_reg_dev: - input_free_device(input_dev); - input_dev = NULL; -err_input_allocate_dev: - mutex_destroy(&msg21xx_mutex); - mutex_destroy(&ts_data->ts_mutex); - -err_wrong_ic_type: - msg21xx_ts_gpio_configure(ts_data, false); -exit_gpio_config: - if (ts_data->ts_pinctrl) { - if (IS_ERR_OR_NULL(ts_data->pinctrl_state_release)) { - devm_pinctrl_put(ts_data->ts_pinctrl); - ts_data->ts_pinctrl = NULL; - } else { - ret = pinctrl_select_state(ts_data->ts_pinctrl, - ts_data->pinctrl_state_release); - if (ret < 0) - dev_err(&ts_data->client->dev, - "Cannot get release pinctrl state\n"); - } - } - msg21xx_ts_power_on(ts_data, false); -exit_deinit_power: - msg21xx_ts_power_init(ts_data, false); -err_free_mem: - input_free_device(input_dev); - - return ret; -} - -/* remove function is triggered when the input device is removed -from input sub-system */ -static int touch_driver_remove(struct i2c_client *client) -{ - int retval = 0; - struct msg21xx_ts_data *ts_data = i2c_get_clientdata(client); - - free_irq(ts_data->client->irq, ts_data); - gpio_free(ts_data->pdata->irq_gpio); - gpio_free(ts_data->pdata->reset_gpio); - - if (ts_data->ts_pinctrl) { - if (IS_ERR_OR_NULL(ts_data->pinctrl_state_release)) { - devm_pinctrl_put(ts_data->ts_pinctrl); - ts_data->ts_pinctrl = NULL; - } else { - retval = pinctrl_select_state(ts_data->ts_pinctrl, - ts_data->pinctrl_state_release); - if (retval < 0) - dev_err(&ts_data->client->dev, - "Cannot get release pinctrl state\n"); - } - } - - input_unregister_device(ts_data->input_dev); - mutex_destroy(&msg21xx_mutex); - mutex_destroy(&ts_data->ts_mutex); - - return retval; -} - -/* The I2C device list is used for matching I2C device -and I2C device driver. */ -static const struct i2c_device_id touch_device_id[] = { - {"msg21xx", 0}, - {}, /* should not omitted */ -}; - -static struct of_device_id msg21xx_match_table[] = { - { .compatible = "mstar,msg21xx", }, - { }, -}; - -MODULE_DEVICE_TABLE(i2c, touch_device_id); - -static struct i2c_driver touch_device_driver = { - .driver = { - .name = "ms-msg21xx", - .owner = THIS_MODULE, - .of_match_table = msg21xx_match_table, - }, - .probe = msg21xx_ts_probe, - .remove = touch_driver_remove, - .id_table = touch_device_id, -}; - -module_i2c_driver(touch_device_driver); - -#ifdef TP_PRINT -#include - -static unsigned short InfoAddr = 0x0F, PoolAddr = 0x10, TransLen = 256; -static unsigned char row, units, cnt; - -static int tp_print_proc_read(struct msg21xx_ts_data *ts_data) -{ - unsigned short i, j; - unsigned short left, offset = 0; - unsigned char dbbus_tx_data[3] = {0}; - unsigned char u8Data; - signed short s16Data; - int s32Data; - char *buf = NULL; - - left = cnt*row*units; - if ((ts_data->suspended == 0) && - (InfoAddr != 0x0F) && - (PoolAddr != 0x10) && - (left > 0)) { - buf = kmalloc(left, GFP_KERNEL); - if (buf != NULL) { - - while (left > 0) { - dbbus_tx_data[0] = 0x53; - dbbus_tx_data[1] = ((PoolAddr + offset) >> 8) - & 0xFF; - dbbus_tx_data[2] = (PoolAddr + offset) & 0xFF; - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data, ts_data->client->addr, - &dbbus_tx_data[0], 3); - read_i2c_seq(ts_data, ts_data->client->addr, - &buf[offset], - left > TransLen ? TransLen : left); - mutex_unlock(&msg21xx_mutex); - - if (left > TransLen) { - left -= TransLen; - offset += TransLen; - } else { - left = 0; - } - } - - for (i = 0; i < cnt; i++) { - for (j = 0; j < row; j++) { - if (units == 1) { - u8Data = buf[i * row * units + - j * units]; - } else if (units == 2) { - s16Data = buf[i * row * units + - j * units] + - (buf[i * row * units + - j * units + 1] << 8); - } else if (units == 4) { - s32Data = buf[i * row * units + - j * units] + - (buf[i * row * units + - j * units + 1] << 8) + - (buf[i * row * units + - j * units + 2] << 16) + - (buf[i * row * units + - j * units + 3] << 24); - } - } - } - - kfree(buf); - } - } - - return 0; -} - -static void tp_print_create_entry(struct msg21xx_ts_data *ts_data) -{ - unsigned char dbbus_tx_data[3] = {0}; - unsigned char dbbus_rx_data[8] = {0}; - - dbbus_tx_data[0] = 0x53; - dbbus_tx_data[1] = 0x00; - dbbus_tx_data[2] = 0x58; - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data, ts_data->client->addr, &dbbus_tx_data[0], 3); - read_i2c_seq(ts_data, ts_data->client->addr, &dbbus_rx_data[0], 4); - mutex_unlock(&msg21xx_mutex); - InfoAddr = (dbbus_rx_data[1]<<8) + dbbus_rx_data[0]; - PoolAddr = (dbbus_rx_data[3]<<8) + dbbus_rx_data[2]; - - if ((InfoAddr != 0x0F) && (PoolAddr != 0x10)) { - msleep(20); - dbbus_tx_data[0] = 0x53; - dbbus_tx_data[1] = (InfoAddr >> 8) & 0xFF; - dbbus_tx_data[2] = InfoAddr & 0xFF; - mutex_lock(&msg21xx_mutex); - write_i2c_seq(ts_data, ts_data->client->addr, - &dbbus_tx_data[0], 3); - read_i2c_seq(ts_data, ts_data->client->addr, - &dbbus_rx_data[0], 8); - mutex_unlock(&msg21xx_mutex); - - units = dbbus_rx_data[0]; - row = dbbus_rx_data[1]; - cnt = dbbus_rx_data[2]; - TransLen = (dbbus_rx_data[7]<<8) + dbbus_rx_data[6]; - - if (device_create_file(&ts_data->client->dev, - &dev_attr_tpp) < 0) - dev_err(&ts_data->client->dev, "Failed to create device file(%s)!\n", - dev_attr_tpp.attr.name); - } -} -#endif - -MODULE_AUTHOR("MStar Semiconductor, Inc."); -MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_dsx/Kconfig b/drivers/input/touchscreen/synaptics_dsx/Kconfig index 86263fddaceac..18d473969261d 100644 --- a/drivers/input/touchscreen/synaptics_dsx/Kconfig +++ b/drivers/input/touchscreen/synaptics_dsx/Kconfig @@ -50,17 +50,6 @@ config TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21 To compile this driver as a module, choose M here: the module will be called synaptics_dsx_core. -config TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21 - tristate "Synaptics DSX touchscreen RMI device module" - depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21 - help - Say Y here to enable support for direct RMI register access. - - If unsure, say N. - - To compile this driver as a module, choose M here: the - module will be called synaptics_dsx_rmi_dev. - config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21 tristate "Synaptics DSX touchscreen firmware update module" depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21 @@ -72,15 +61,4 @@ config TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21 To compile this driver as a module, choose M here: the module will be called synaptics_dsx_fw_update. -config TOUCHSCREEN_SYNAPTICS_DSX_PROXIMITY_v21 - tristate "Synaptics DSX touchscreen proximity module" - depends on TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21 - help - Say Y here to enable support for proximity functionalities. - - If unsure, say N. - - To compile this driver as a module, choose M here: the - module will be called synaptics_dsx_proximity. - endif diff --git a/drivers/input/touchscreen/synaptics_dsx/Makefile b/drivers/input/touchscreen/synaptics_dsx/Makefile index b35b222d5ae24..0bffb8da94eae 100644 --- a/drivers/input/touchscreen/synaptics_dsx/Makefile +++ b/drivers/input/touchscreen/synaptics_dsx/Makefile @@ -7,6 +7,4 @@ obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_I2C_v21) += synaptics_dsx_i2c.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_SPI_v21) += synaptics_dsx_spi.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_CORE_v21) += synaptics_dsx_core.o -obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_RMI_DEV_v21) += synaptics_dsx_rmi_dev.o obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_v21) += synaptics_dsx_fw_update.o -obj-$(CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_PROXIMITY_v21) += synaptics_dsx_proximity.o diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c index f7d0defafcdb5..06394c6b7a97a 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_core.c @@ -1503,7 +1503,7 @@ static int synaptics_rmi4_irq_enable(struct synaptics_rmi4_data *rmi4_data, return retval; } -static void synaptics_rmi4_set_intr_mask(struct synaptics_rmi4_fn *fhandler, +static int synaptics_rmi4_set_intr_mask(struct synaptics_rmi4_fn *fhandler, struct synaptics_rmi4_fn_desc *fd, unsigned int intr_count) { @@ -1511,6 +1511,12 @@ static void synaptics_rmi4_set_intr_mask(struct synaptics_rmi4_fn *fhandler, unsigned char intr_offset; fhandler->intr_reg_num = (intr_count + 7) / 8; + if (fhandler->intr_reg_num >= MAX_INTR_REGISTERS) { + fhandler->intr_reg_num = 0; + fhandler->num_of_data_sources = 0; + fhandler->intr_mask = 0; + return -EINVAL; + } if (fhandler->intr_reg_num != 0) fhandler->intr_reg_num -= 1; @@ -1523,7 +1529,7 @@ static void synaptics_rmi4_set_intr_mask(struct synaptics_rmi4_fn *fhandler, ii++) fhandler->intr_mask |= 1 << ii; - return; + return 0; } static int synaptics_rmi4_f01_init(struct synaptics_rmi4_data *rmi4_data, @@ -1531,12 +1537,17 @@ static int synaptics_rmi4_f01_init(struct synaptics_rmi4_data *rmi4_data, struct synaptics_rmi4_fn_desc *fd, unsigned int intr_count) { + int retval; + fhandler->fn_number = fd->fn_number; fhandler->num_of_data_sources = fd->intr_src_count; fhandler->data = NULL; fhandler->extra = NULL; - synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + retval = synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + if (retval < 0) + return retval; + rmi4_data->f01_query_base_addr = fd->query_base_addr; rmi4_data->f01_ctrl_base_addr = fd->ctrl_base_addr; @@ -1661,7 +1672,9 @@ static int synaptics_rmi4_f11_init(struct synaptics_rmi4_data *rmi4_data, if (retval < 0) return retval; - synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + retval = synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + if (retval < 0) + return retval; abs_data_size = query[5] & MASK_2BIT; abs_data_blk_size = 3 + (2 * (abs_data_size == 0 ? 1 : 0)); @@ -1942,7 +1955,9 @@ static int synaptics_rmi4_f12_init(struct synaptics_rmi4_data *rmi4_data, if (retval < 0) goto free_function_handler_mem; - synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + retval = synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + if (retval < 0) + return retval; /* Allocate memory for finger data storage space */ fhandler->data_size = num_of_fingers * size_of_2d_data; @@ -2100,7 +2115,9 @@ static int synaptics_rmi4_f1a_init(struct synaptics_rmi4_data *rmi4_data, fhandler->fn_number = fd->fn_number; fhandler->num_of_data_sources = fd->intr_src_count; - synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + retval = synaptics_rmi4_set_intr_mask(fhandler, fd, intr_count); + if (retval < 0) + return retval; retval = synaptics_rmi4_f1a_alloc_mem(rmi4_data, fhandler); if (retval < 0) @@ -2499,6 +2516,8 @@ static int synaptics_rmi4_query_device(struct synaptics_rmi4_data *rmi4_data) dev_dbg(rmi4_data->pdev->dev.parent, "%s: Number of interrupt registers = %d\n", __func__, rmi4_data->num_of_intr_regs); + if (rmi4_data->num_of_intr_regs >= MAX_INTR_REGISTERS) + return -EINVAL; retval = synaptics_rmi4_reg_read(rmi4_data, rmi4_data->f01_query_base_addr, diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c index 2282fe005bc7e..4787f2bcd768f 100644 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c +++ b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_fw_update.c @@ -102,6 +102,7 @@ (fwu->config_data[2] == config_id[2]) && \ (fwu->config_data[3] == config_id[3])) +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static ssize_t fwu_sysfs_show_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count); @@ -157,6 +158,7 @@ static ssize_t fwu_sysfs_config_id_show(struct device *dev, static ssize_t fwu_sysfs_package_id_show(struct device *dev, struct device_attribute *attr, char *buf); +#endif enum bl_version { V5 = 5, @@ -296,6 +298,7 @@ struct synaptics_rmi4_fwu_handle { struct synaptics_rmi4_data *rmi4_data; }; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static struct bin_attribute dev_attr_data = { .attr = { .name = "data", @@ -305,9 +308,11 @@ static struct bin_attribute dev_attr_data = { .read = fwu_sysfs_show_image, .write = fwu_sysfs_store_image, }; +#endif static struct device_attribute attrs[] = { +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS __ATTR(force_update_fw, S_IWUSR | S_IWGRP, NULL, fwu_sysfs_force_reflash_store), @@ -353,11 +358,13 @@ static struct device_attribute attrs[] = { __ATTR(package_id, S_IRUGO, fwu_sysfs_package_id_show, synaptics_rmi4_store_error), +#endif }; static struct synaptics_rmi4_fwu_handle *fwu; DECLARE_COMPLETION(fwu_dsx_remove_complete); +DEFINE_MUTEX(dsx_fwu_sysfs_mutex); static unsigned int extract_uint_le(const unsigned char *ptr) { @@ -1219,6 +1226,7 @@ static int fwu_do_write_config(void) return retval; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_start_write_config(void) { int retval; @@ -1394,6 +1402,7 @@ static int fwu_do_read_config(void) return retval; } +#endif static int fwu_do_lockdown(void) { @@ -1584,44 +1593,78 @@ int synaptics_dsx_fw_updater(unsigned char *fw_data) } EXPORT_SYMBOL(synaptics_dsx_fw_updater); +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static ssize_t fwu_sysfs_show_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) { struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + ssize_t retval; + + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; if (count < fwu->config_size) { dev_err(rmi4_data->pdev->dev.parent, "%s: Not enough space (%zu bytes) in buffer\n", __func__, count); - return -EINVAL; + retval = -EINVAL; + goto show_image_exit; } memcpy(buf, fwu->read_config_buf, fwu->config_size); - - return fwu->config_size; + retval = fwu->config_size; +show_image_exit: + mutex_unlock(&dsx_fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_store_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) { + ssize_t retval; + + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + + if (count > (fwu->image_size - fwu->data_pos)) { + dev_err(fwu->rmi4_data->pdev->dev.parent, + "%s: Not enough space in buffer\n", + __func__); + retval = -EINVAL; + goto exit; + } + + if (!fwu->ext_data_source) { + dev_err(fwu->rmi4_data->pdev->dev.parent, + "%s: Need to set imagesize\n", + __func__); + retval = -EINVAL; + goto exit; + } + memcpy((void *)(&fwu->ext_data_source[fwu->data_pos]), (const void *)buf, count); fwu->data_pos += count; +exit: + mutex_unlock(&dsx_fwu_sysfs_mutex); return count; } static ssize_t fwu_sysfs_force_reflash_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - int retval; + ssize_t retval; unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + if (sscanf(buf, "%u", &input) != 1) { retval = -EINVAL; goto exit; @@ -1650,6 +1693,9 @@ static ssize_t fwu_sysfs_force_reflash_store(struct device *dev, fwu->ext_data_source = NULL; fwu->force_update = FORCE_UPDATE; fwu->do_lockdown = DO_LOCKDOWN; + fwu->data_pos = 0; + fwu->image_size = 0; + mutex_unlock(&dsx_fwu_sysfs_mutex); return retval; } @@ -1660,6 +1706,9 @@ static ssize_t fwu_sysfs_do_reflash_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + if (sscanf(buf, "%u", &input) != 1) { retval = -EINVAL; goto exit; @@ -1693,6 +1742,9 @@ static ssize_t fwu_sysfs_do_reflash_store(struct device *dev, fwu->ext_data_source = NULL; fwu->force_update = FORCE_UPDATE; fwu->do_lockdown = DO_LOCKDOWN; + fwu->data_pos = 0; + fwu->image_size = 0; + mutex_unlock(&dsx_fwu_sysfs_mutex); return retval; } @@ -1703,6 +1755,9 @@ static ssize_t fwu_sysfs_write_config_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + if (sscanf(buf, "%u", &input) != 1) { retval = -EINVAL; goto exit; @@ -1726,6 +1781,9 @@ static ssize_t fwu_sysfs_write_config_store(struct device *dev, exit: kfree(fwu->ext_data_source); fwu->ext_data_source = NULL; + fwu->data_pos = 0; + fwu->image_size = 0; + mutex_unlock(&dsx_fwu_sysfs_mutex); return retval; } @@ -1742,7 +1800,11 @@ static ssize_t fwu_sysfs_read_config_store(struct device *dev, if (input != 1) return -EINVAL; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; retval = fwu_do_read_config(); + mutex_unlock(&dsx_fwu_sysfs_mutex); + if (retval < 0) { dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to read config\n", @@ -1763,7 +1825,10 @@ static ssize_t fwu_sysfs_config_area_store(struct device *dev, if (retval) return retval; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; fwu->config_area = config_area; + mutex_unlock(&dsx_fwu_sysfs_mutex); return count; } @@ -1771,17 +1836,30 @@ static ssize_t fwu_sysfs_config_area_store(struct device *dev, static ssize_t fwu_sysfs_image_name_show(struct device *dev, struct device_attribute *attr, char *buf) { + ssize_t retval; + + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; if (strnlen(fwu->rmi4_data->fw_name, SYNA_FW_NAME_MAX_LEN) > 0) - return snprintf(buf, PAGE_SIZE, "%s\n", + retval = snprintf(buf, PAGE_SIZE, "%s\n", fwu->rmi4_data->fw_name); else - return snprintf(buf, PAGE_SIZE, "No firmware name given\n"); + retval = snprintf(buf, PAGE_SIZE, "No firmware name given\n"); + mutex_unlock(&dsx_fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_image_name_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - if (sscanf(buf, "%s", fwu->image_name) != 1) + ssize_t retval; + + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + retval = sscanf(buf, "%49s", fwu->image_name); + mutex_unlock(&dsx_fwu_sysfs_mutex); + + if (retval != 1) return -EINVAL; return count; @@ -1794,9 +1872,12 @@ static ssize_t fwu_sysfs_image_size_store(struct device *dev, unsigned long size; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&dsx_fwu_sysfs_mutex)) + return -EBUSY; + retval = sstrtoul(buf, 10, &size); if (retval) - return retval; + goto exit; fwu->image_size = size; fwu->data_pos = 0; @@ -1807,10 +1888,14 @@ static ssize_t fwu_sysfs_image_size_store(struct device *dev, dev_err(rmi4_data->pdev->dev.parent, "%s: Failed to alloc mem for image data\n", __func__); - return -ENOMEM; + retval = -ENOMEM; + goto exit; } - return count; + retval = count; +exit: + mutex_unlock(&dsx_fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_block_size_show(struct device *dev, @@ -1896,6 +1981,7 @@ static ssize_t fwu_sysfs_package_id_show(struct device *dev, (package_id[1] << 8) | package_id[0], (package_id[3] << 8) | package_id[2]); } +#endif static void synaptics_rmi4_fwu_attn(struct synaptics_rmi4_data *rmi4_data, unsigned char intr_mask) @@ -1969,6 +2055,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) fwu->do_lockdown = DO_LOCKDOWN; fwu->initialized = true; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS retval = sysfs_create_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); if (retval < 0) { @@ -1977,6 +2064,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) __func__); goto exit_free_fwu; } +#endif for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj, @@ -1998,7 +2086,9 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) &attrs[attr_count].attr); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif exit_free_fwu: kfree(fwu); @@ -2020,7 +2110,9 @@ static void synaptics_rmi4_fwu_remove(struct synaptics_rmi4_data *rmi4_data) &attrs[attr_count].attr); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif kfree(fwu->read_config_buf); kfree(fwu); diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_proximity.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_proximity.c deleted file mode 100755 index 99c05e6845c05..0000000000000 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_proximity.c +++ /dev/null @@ -1,671 +0,0 @@ -/* - * Synaptics DSX touchscreen driver - * - * Copyright (C) 2012 Synaptics Incorporated - * - * Copyright (C) 2012 Alexandra Chin - * Copyright (C) 2012 Scott Lin - * - * 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. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include "synaptics_dsx_core.h" - -#define PROX_PHYS_NAME "synaptics_dsx/input1" - -#define HOVER_Z_MAX (255) - -#define HOVERING_FINGER_EN (1 << 4) - -static ssize_t synaptics_rmi4_hover_finger_en_show(struct device *dev, - struct device_attribute *attr, char *buf); - -static ssize_t synaptics_rmi4_hover_finger_en_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count); - -static struct device_attribute attrs[] = { - __ATTR(hover_finger_en, (S_IRUGO | S_IWUGO), - synaptics_rmi4_hover_finger_en_show, - synaptics_rmi4_hover_finger_en_store), -}; - -struct synaptics_rmi4_f12_query_5 { - union { - struct { - unsigned char size_of_query6; - struct { - unsigned char ctrl0_is_present:1; - unsigned char ctrl1_is_present:1; - unsigned char ctrl2_is_present:1; - unsigned char ctrl3_is_present:1; - unsigned char ctrl4_is_present:1; - unsigned char ctrl5_is_present:1; - unsigned char ctrl6_is_present:1; - unsigned char ctrl7_is_present:1; - } __packed; - struct { - unsigned char ctrl8_is_present:1; - unsigned char ctrl9_is_present:1; - unsigned char ctrl10_is_present:1; - unsigned char ctrl11_is_present:1; - unsigned char ctrl12_is_present:1; - unsigned char ctrl13_is_present:1; - unsigned char ctrl14_is_present:1; - unsigned char ctrl15_is_present:1; - } __packed; - struct { - unsigned char ctrl16_is_present:1; - unsigned char ctrl17_is_present:1; - unsigned char ctrl18_is_present:1; - unsigned char ctrl19_is_present:1; - unsigned char ctrl20_is_present:1; - unsigned char ctrl21_is_present:1; - unsigned char ctrl22_is_present:1; - unsigned char ctrl23_is_present:1; - } __packed; - }; - unsigned char data[4]; - }; -}; - -struct synaptics_rmi4_f12_query_8 { - union { - struct { - unsigned char size_of_query9; - struct { - unsigned char data0_is_present:1; - unsigned char data1_is_present:1; - unsigned char data2_is_present:1; - unsigned char data3_is_present:1; - unsigned char data4_is_present:1; - unsigned char data5_is_present:1; - unsigned char data6_is_present:1; - unsigned char data7_is_present:1; - } __packed; - }; - unsigned char data[2]; - }; -}; - -struct prox_finger_data { - union { - struct { - unsigned char object_type_and_status; - unsigned char x_lsb; - unsigned char x_msb; - unsigned char y_lsb; - unsigned char y_msb; - unsigned char z; - } __packed; - unsigned char proximity_data[6]; - }; -}; - -struct synaptics_rmi4_prox_handle { - bool hover_finger_present; - bool hover_finger_en; - unsigned char intr_mask; - unsigned short query_base_addr; - unsigned short control_base_addr; - unsigned short data_base_addr; - unsigned short command_base_addr; - unsigned short hover_finger_en_addr; - unsigned short hover_finger_data_addr; - struct input_dev *prox_dev; - struct prox_finger_data *finger_data; - struct synaptics_rmi4_data *rmi4_data; -}; - -static struct synaptics_rmi4_prox_handle *prox; - -DECLARE_COMPLETION(prox_remove_complete); - -static void prox_hover_finger_lift(void) -{ - input_report_key(prox->prox_dev, BTN_TOUCH, 0); - input_report_key(prox->prox_dev, BTN_TOOL_FINGER, 0); - input_sync(prox->prox_dev); - prox->hover_finger_present = false; - - return; -} - -static void prox_hover_finger_report(void) -{ - int retval; - int x; - int y; - int z; - struct prox_finger_data *data; - struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; - - data = prox->finger_data; - - retval = synaptics_rmi4_reg_read(rmi4_data, - prox->hover_finger_data_addr, - data->proximity_data, - sizeof(data->proximity_data)); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to read hovering finger data\n", - __func__); - return; - } - - if (data->object_type_and_status != F12_HOVERING_FINGER_STATUS) { - if (prox->hover_finger_present) - prox_hover_finger_lift(); - - return; - } - - x = (data->x_msb << 8) | (data->x_lsb); - y = (data->y_msb << 8) | (data->y_lsb); - z = HOVER_Z_MAX - data->z; - - input_report_key(prox->prox_dev, BTN_TOUCH, 0); - input_report_key(prox->prox_dev, BTN_TOOL_FINGER, 1); - input_report_abs(prox->prox_dev, ABS_X, x); - input_report_abs(prox->prox_dev, ABS_Y, y); - input_report_abs(prox->prox_dev, ABS_DISTANCE, z); - - input_sync(prox->prox_dev); - - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: x = %d y = %d z = %d\n", - __func__, x, y, z); - - prox->hover_finger_present = true; - - return; -} - -static int prox_set_hover_finger_en(void) -{ - int retval; - unsigned char object_report_enable; - struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; - - retval = synaptics_rmi4_reg_read(rmi4_data, - prox->hover_finger_en_addr, - &object_report_enable, - sizeof(object_report_enable)); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to read from object report enable register\n", - __func__); - return retval; - } - - if (prox->hover_finger_en) - object_report_enable |= HOVERING_FINGER_EN; - else - object_report_enable &= ~HOVERING_FINGER_EN; - - retval = synaptics_rmi4_reg_write(rmi4_data, - prox->hover_finger_en_addr, - &object_report_enable, - sizeof(object_report_enable)); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to write to object report enable register\n", - __func__); - return retval; - } - - return 0; -} - -static void prox_set_params(void) -{ - input_set_abs_params(prox->prox_dev, ABS_X, 0, - prox->rmi4_data->sensor_max_x, 0, 0); - input_set_abs_params(prox->prox_dev, ABS_Y, 0, - prox->rmi4_data->sensor_max_y, 0, 0); - input_set_abs_params(prox->prox_dev, ABS_DISTANCE, 0, - HOVER_Z_MAX, 0, 0); - - return; -} - -static int prox_reg_init(void) -{ - int retval; - unsigned char ctrl_23_offset; - unsigned char data_1_offset; - struct synaptics_rmi4_f12_query_5 query_5; - struct synaptics_rmi4_f12_query_8 query_8; - struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; - - retval = synaptics_rmi4_reg_read(rmi4_data, - prox->query_base_addr + 5, - query_5.data, - sizeof(query_5.data)); - if (retval < 0) - return retval; - - ctrl_23_offset = query_5.ctrl0_is_present + - query_5.ctrl1_is_present + - query_5.ctrl2_is_present + - query_5.ctrl3_is_present + - query_5.ctrl4_is_present + - query_5.ctrl5_is_present + - query_5.ctrl6_is_present + - query_5.ctrl7_is_present + - query_5.ctrl8_is_present + - query_5.ctrl9_is_present + - query_5.ctrl10_is_present + - query_5.ctrl11_is_present + - query_5.ctrl12_is_present + - query_5.ctrl13_is_present + - query_5.ctrl14_is_present + - query_5.ctrl15_is_present + - query_5.ctrl16_is_present + - query_5.ctrl17_is_present + - query_5.ctrl18_is_present + - query_5.ctrl19_is_present + - query_5.ctrl20_is_present + - query_5.ctrl21_is_present + - query_5.ctrl22_is_present; - - prox->hover_finger_en_addr = prox->control_base_addr + ctrl_23_offset; - - retval = synaptics_rmi4_reg_read(rmi4_data, - prox->query_base_addr + 8, - query_8.data, - sizeof(query_8.data)); - if (retval < 0) - return retval; - - data_1_offset = query_8.data0_is_present; - prox->hover_finger_data_addr = prox->data_base_addr + data_1_offset; - - return retval; -} - -static int prox_scan_pdt(void) -{ - int retval; - unsigned char ii; - unsigned char page; - unsigned char intr_count = 0; - unsigned char intr_off; - unsigned char intr_src; - unsigned short addr; - struct synaptics_rmi4_fn_desc fd; - struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; - - for (page = 0; page < PAGES_TO_SERVICE; page++) { - for (addr = PDT_START; addr > PDT_END; addr -= PDT_ENTRY_SIZE) { - addr |= (page << 8); - - retval = synaptics_rmi4_reg_read(rmi4_data, - addr, - (unsigned char *)&fd, - sizeof(fd)); - if (retval < 0) - return retval; - - addr &= ~(MASK_8BIT << 8); - - if (fd.fn_number) { - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Found F%02x\n", - __func__, fd.fn_number); - switch (fd.fn_number) { - case SYNAPTICS_RMI4_F12: - goto f12_found; - break; - } - } else { - break; - } - - intr_count += (fd.intr_src_count & MASK_3BIT); - } - } - - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to find F12\n", - __func__); - return -EINVAL; - -f12_found: - prox->query_base_addr = fd.query_base_addr | (page << 8); - prox->control_base_addr = fd.ctrl_base_addr | (page << 8); - prox->data_base_addr = fd.data_base_addr | (page << 8); - prox->command_base_addr = fd.cmd_base_addr | (page << 8); - - retval = prox_reg_init(); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to initialize proximity registers\n", - __func__); - return retval; - } - - prox->intr_mask = 0; - intr_src = fd.intr_src_count; - intr_off = intr_count % 8; - for (ii = intr_off; - ii < ((intr_src & MASK_3BIT) + - intr_off); - ii++) { - prox->intr_mask |= 1 << ii; - } - - rmi4_data->intr_mask[0] |= prox->intr_mask; - - addr = rmi4_data->f01_ctrl_base_addr + 1; - - retval = synaptics_rmi4_reg_write(rmi4_data, - addr, - &(rmi4_data->intr_mask[0]), - sizeof(rmi4_data->intr_mask[0])); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to set interrupt enable bit\n", - __func__); - return retval; - } - - return 0; -} - -static ssize_t synaptics_rmi4_hover_finger_en_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - if (!prox) - return -ENODEV; - - return snprintf(buf, PAGE_SIZE, "%u\n", - prox->hover_finger_en); -} - -static ssize_t synaptics_rmi4_hover_finger_en_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - int retval; - unsigned int input; - struct synaptics_rmi4_data *rmi4_data = prox->rmi4_data; - - if (!prox) - return -ENODEV; - - if (sscanf(buf, "%x", &input) != 1) - return -EINVAL; - - if (input == 1) - prox->hover_finger_en = true; - else if (input == 0) - prox->hover_finger_en = false; - else - return -EINVAL; - - retval = prox_set_hover_finger_en(); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to change hovering finger enable setting\n", - __func__); - return retval; - } - - return count; -} - -int synaptics_rmi4_prox_hover_finger_en(bool enable) -{ - int retval; - - if (!prox) - return -ENODEV; - - prox->hover_finger_en = enable; - - retval = prox_set_hover_finger_en(); - if (retval < 0) - return retval; - - return 0; -} -EXPORT_SYMBOL(synaptics_rmi4_prox_hover_finger_en); - -static void synaptics_rmi4_prox_attn(struct synaptics_rmi4_data *rmi4_data, - unsigned char intr_mask) -{ - if (!prox) - return; - - if (prox->intr_mask & intr_mask) - prox_hover_finger_report(); - - return; -} - -static int synaptics_rmi4_prox_init(struct synaptics_rmi4_data *rmi4_data) -{ - int retval; - unsigned char attr_count; - - prox = kzalloc(sizeof(*prox), GFP_KERNEL); - if (!prox) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to alloc mem for prox\n", - __func__); - retval = -ENOMEM; - goto exit; - } - - prox->finger_data = kzalloc(sizeof(*(prox->finger_data)), GFP_KERNEL); - if (!prox->finger_data) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to alloc mem for finger_data\n", - __func__); - retval = -ENOMEM; - goto exit_free_prox; - } - - prox->rmi4_data = rmi4_data; - - retval = prox_scan_pdt(); - if (retval < 0) - goto exit_free_finger_data; - - prox->hover_finger_en = true; - - retval = prox_set_hover_finger_en(); - if (retval < 0) - return retval; - - prox->prox_dev = input_allocate_device(); - if (prox->prox_dev == NULL) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to allocate proximity device\n", - __func__); - retval = -ENOMEM; - goto exit_free_finger_data; - } - - prox->prox_dev->name = PLATFORM_DRIVER_NAME; - prox->prox_dev->phys = PROX_PHYS_NAME; - prox->prox_dev->id.product = SYNAPTICS_DSX_DRIVER_PRODUCT; - prox->prox_dev->id.version = SYNAPTICS_DSX_DRIVER_VERSION; - prox->prox_dev->dev.parent = rmi4_data->pdev->dev.parent; - input_set_drvdata(prox->prox_dev, rmi4_data); - - set_bit(EV_KEY, prox->prox_dev->evbit); - set_bit(EV_ABS, prox->prox_dev->evbit); - set_bit(BTN_TOUCH, prox->prox_dev->keybit); - set_bit(BTN_TOOL_FINGER, prox->prox_dev->keybit); -#ifdef INPUT_PROP_DIRECT - set_bit(INPUT_PROP_DIRECT, prox->prox_dev->propbit); -#endif - - prox_set_params(); - - retval = input_register_device(prox->prox_dev); - if (retval) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to register proximity device\n", - __func__); - goto exit_free_input_device; - } - - for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { - retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj, - &attrs[attr_count].attr); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create sysfs attributes\n", - __func__); - goto exit_free_sysfs; - } - } - - return 0; - -exit_free_sysfs: - for (attr_count--; attr_count >= 0; attr_count--) { - sysfs_remove_file(&rmi4_data->input_dev->dev.kobj, - &attrs[attr_count].attr); - } - - input_unregister_device(prox->prox_dev); - prox->prox_dev = NULL; - -exit_free_input_device: - if (prox->prox_dev) - input_free_device(prox->prox_dev); - -exit_free_finger_data: - kfree(prox->finger_data); - -exit_free_prox: - kfree(prox); - prox = NULL; - -exit: - return retval; -} - -static void synaptics_rmi4_prox_remove(struct synaptics_rmi4_data *rmi4_data) -{ - unsigned char attr_count; - - if (!prox) - goto exit; - - for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { - sysfs_remove_file(&rmi4_data->input_dev->dev.kobj, - &attrs[attr_count].attr); - } - - input_unregister_device(prox->prox_dev); - kfree(prox->finger_data); - kfree(prox); - prox = NULL; - -exit: - complete(&prox_remove_complete); - - return; -} - -static void synaptics_rmi4_prox_reset(struct synaptics_rmi4_data *rmi4_data) -{ - if (!prox) - return; - - prox_hover_finger_lift(); - - prox_scan_pdt(); - - prox_set_hover_finger_en(); - - prox_set_params(); - - return; -} - -static void synaptics_rmi4_prox_reinit(struct synaptics_rmi4_data *rmi4_data) -{ - if (!prox) - return; - - prox_hover_finger_lift(); - - prox_set_hover_finger_en(); - - return; -} - -static void synaptics_rmi4_prox_e_suspend(struct synaptics_rmi4_data *rmi4_data) -{ - if (!prox) - return; - - prox_hover_finger_lift(); - - return; -} - -static void synaptics_rmi4_prox_suspend(struct synaptics_rmi4_data *rmi4_data) -{ - if (!prox) - return; - - prox_hover_finger_lift(); - - return; -} - -static struct synaptics_rmi4_exp_fn proximity_module = { - .fn_type = RMI_PROXIMITY, - .init = synaptics_rmi4_prox_init, - .remove = synaptics_rmi4_prox_remove, - .reset = synaptics_rmi4_prox_reset, - .reinit = synaptics_rmi4_prox_reinit, - .early_suspend = synaptics_rmi4_prox_e_suspend, - .suspend = synaptics_rmi4_prox_suspend, - .resume = NULL, - .late_resume = NULL, - .attn = synaptics_rmi4_prox_attn, -}; - -static int __init rmi4_proximity_module_init(void) -{ - synaptics_rmi4_dsx_new_function(&proximity_module, true); - - return 0; -} - -static void __exit rmi4_proximity_module_exit(void) -{ - synaptics_rmi4_dsx_new_function(&proximity_module, false); - - wait_for_completion(&prox_remove_complete); - - return; -} - -module_init(rmi4_proximity_module_init); -module_exit(rmi4_proximity_module_exit); - -MODULE_AUTHOR("Synaptics, Inc."); -MODULE_DESCRIPTION("Synaptics DSX Proximity Module"); -MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c b/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c deleted file mode 100644 index 4c341ffb60940..0000000000000 --- a/drivers/input/touchscreen/synaptics_dsx/synaptics_dsx_rmi_dev.c +++ /dev/null @@ -1,781 +0,0 @@ -/* - * Synaptics DSX touchscreen driver - * - * Copyright (C) 2012 Synaptics Incorporated - * - * Copyright (C) 2012 Alexandra Chin - * Copyright (C) 2012 Scott Lin - * - * 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. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "synaptics_dsx_core.h" - -#define CHAR_DEVICE_NAME "rmi" -#define DEVICE_CLASS_NAME "rmidev" -#define SYSFS_FOLDER_NAME "rmidev" -#define DEV_NUMBER 1 -#define REG_ADDR_LIMIT 0xFFFF - -static ssize_t rmidev_sysfs_data_show(struct file *data_file, - struct kobject *kobj, struct bin_attribute *attributes, - char *buf, loff_t pos, size_t count); - -static ssize_t rmidev_sysfs_data_store(struct file *data_file, - struct kobject *kobj, struct bin_attribute *attributes, - char *buf, loff_t pos, size_t count); - -static ssize_t rmidev_sysfs_open_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count); - -static ssize_t rmidev_sysfs_release_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count); - -static ssize_t rmidev_sysfs_attn_state_show(struct device *dev, - struct device_attribute *attr, char *buf); - -struct rmidev_handle { - dev_t dev_no; - struct device dev; - struct synaptics_rmi4_data *rmi4_data; - struct kobject *sysfs_dir; - void *data; - bool irq_enabled; -}; - -struct rmidev_data { - int ref_count; - struct cdev main_dev; - struct class *device_class; - struct mutex file_mutex; - struct rmidev_handle *rmi_dev; -}; - -static struct bin_attribute attr_data = { - .attr = { - .name = "data", - .mode = (S_IRUGO | S_IWUSR), - }, - .size = 0, - .read = rmidev_sysfs_data_show, - .write = rmidev_sysfs_data_store, -}; - -static struct device_attribute attrs[] = { - __ATTR(open, S_IWUSR | S_IWGRP, - NULL, - rmidev_sysfs_open_store), - __ATTR(release, S_IWUSR | S_IWGRP, - NULL, - rmidev_sysfs_release_store), - __ATTR(attn_state, S_IRUGO, - rmidev_sysfs_attn_state_show, - synaptics_rmi4_store_error), -}; - -static int rmidev_major_num; - -static struct class *rmidev_device_class; - -static struct rmidev_handle *rmidev; - -DECLARE_COMPLETION(rmidev_remove_complete); - -static irqreturn_t rmidev_sysfs_irq(int irq, void *data) -{ - struct synaptics_rmi4_data *rmi4_data = data; - - sysfs_notify(&rmi4_data->input_dev->dev.kobj, - SYSFS_FOLDER_NAME, "attn_state"); - - return IRQ_HANDLED; -} - -static int rmidev_sysfs_irq_enable(struct synaptics_rmi4_data *rmi4_data, - bool enable) -{ - int retval = 0; - unsigned char intr_status[MAX_INTR_REGISTERS]; - unsigned long irq_flags = IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING; - - if (enable) { - if (rmidev->irq_enabled) - return retval; - - /* Clear interrupts first */ - retval = synaptics_rmi4_reg_read(rmi4_data, - rmi4_data->f01_data_base_addr + 1, - intr_status, - rmi4_data->num_of_intr_regs); - if (retval < 0) - return retval; - - retval = request_threaded_irq(rmi4_data->irq, NULL, - rmidev_sysfs_irq, irq_flags, - "synaptics_dsx_rmidev", rmi4_data); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create irq thread\n", - __func__); - return retval; - } - - rmidev->irq_enabled = true; - } else { - if (rmidev->irq_enabled) { - disable_irq(rmi4_data->irq); - free_irq(rmi4_data->irq, rmi4_data); - rmidev->irq_enabled = false; - } - } - - return retval; -} - -static ssize_t rmidev_sysfs_data_show(struct file *data_file, - struct kobject *kobj, struct bin_attribute *attributes, - char *buf, loff_t pos, size_t count) -{ - int retval; - unsigned int length = (unsigned int)count; - unsigned short address = (unsigned short)pos; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (length > (REG_ADDR_LIMIT - address)) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Out of register map limit\n", - __func__); - return -EINVAL; - } - - if (length) { - retval = synaptics_rmi4_reg_read(rmi4_data, - address, - (unsigned char *)buf, - length); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to read data\n", - __func__); - return retval; - } - } else { - return -EINVAL; - } - - return length; -} - -static ssize_t rmidev_sysfs_data_store(struct file *data_file, - struct kobject *kobj, struct bin_attribute *attributes, - char *buf, loff_t pos, size_t count) -{ - int retval; - unsigned int length = (unsigned int)count; - unsigned short address = (unsigned short)pos; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (length > (REG_ADDR_LIMIT - address)) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Out of register map limit\n", - __func__); - return -EINVAL; - } - - if (length) { - retval = synaptics_rmi4_reg_write(rmi4_data, - address, - (unsigned char *)buf, - length); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to write data\n", - __func__); - return retval; - } - } else { - return -EINVAL; - } - - return length; -} - -static ssize_t rmidev_sysfs_open_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - unsigned int input; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (sscanf(buf, "%u", &input) != 1) - return -EINVAL; - - if (input != 1) - return -EINVAL; - - rmi4_data->irq_enable(rmi4_data, false); - rmidev_sysfs_irq_enable(rmi4_data, true); - - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Attention interrupt disabled\n", - __func__); - - return count; -} - -static ssize_t rmidev_sysfs_release_store(struct device *dev, - struct device_attribute *attr, const char *buf, size_t count) -{ - unsigned int input; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (sscanf(buf, "%u", &input) != 1) - return -EINVAL; - - if (input != 1) - return -EINVAL; - - rmi4_data->reset_device(rmi4_data); - - rmidev_sysfs_irq_enable(rmi4_data, false); - rmi4_data->irq_enable(rmi4_data, true); - - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Attention interrupt enabled\n", - __func__); - - return count; -} - -static ssize_t rmidev_sysfs_attn_state_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - int attn_state; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - const struct synaptics_dsx_board_data *bdata = - rmi4_data->hw_if->board_data; - - attn_state = gpio_get_value(bdata->irq_gpio); - - return snprintf(buf, PAGE_SIZE, "%u\n", attn_state); -} - -/* - * rmidev_llseek - used to set up register address - * - * @filp: file structure for seek - * @off: offset - * if whence == SEEK_SET, - * high 16 bits: page address - * low 16 bits: register address - * if whence == SEEK_CUR, - * offset from current position - * if whence == SEEK_END, - * offset from end position (0xFFFF) - * @whence: SEEK_SET, SEEK_CUR, or SEEK_END - */ -static loff_t rmidev_llseek(struct file *filp, loff_t off, int whence) -{ - loff_t newpos; - struct rmidev_data *dev_data = filp->private_data; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (IS_ERR(dev_data)) { - pr_err("%s: Pointer of char device data is invalid", __func__); - return -EBADF; - } - - mutex_lock(&(dev_data->file_mutex)); - - switch (whence) { - case SEEK_SET: - newpos = off; - break; - case SEEK_CUR: - newpos = filp->f_pos + off; - break; - case SEEK_END: - newpos = REG_ADDR_LIMIT + off; - break; - default: - newpos = -EINVAL; - goto clean_up; - } - - if (newpos < 0 || newpos > REG_ADDR_LIMIT) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: New position 0x%04x is invalid\n", - __func__, (unsigned int)newpos); - newpos = -EINVAL; - goto clean_up; - } - - filp->f_pos = newpos; - -clean_up: - mutex_unlock(&(dev_data->file_mutex)); - - return newpos; -} - -/* - * rmidev_read: - use to read data from rmi device - * - * @filp: file structure for read - * @buf: user space buffer pointer - * @count: number of bytes to read - * @f_pos: offset (starting register address) - */ -static ssize_t rmidev_read(struct file *filp, char __user *buf, - size_t count, loff_t *f_pos) -{ - ssize_t retval; - unsigned char tmpbuf[count + 1]; - struct rmidev_data *dev_data = filp->private_data; - - if (IS_ERR(dev_data)) { - pr_err("%s: Pointer of char device data is invalid", __func__); - return -EBADF; - } - - if (count == 0) - return 0; - - if (count > (REG_ADDR_LIMIT - *f_pos)) - count = REG_ADDR_LIMIT - *f_pos; - - mutex_lock(&(dev_data->file_mutex)); - - retval = synaptics_rmi4_reg_read(rmidev->rmi4_data, - *f_pos, - tmpbuf, - count); - if (retval < 0) - goto clean_up; - - if (copy_to_user(buf, tmpbuf, count)) - retval = -EFAULT; - else - *f_pos += retval; - -clean_up: - mutex_unlock(&(dev_data->file_mutex)); - - return retval; -} - -/* - * rmidev_write: - used to write data to rmi device - * - * @filep: file structure for write - * @buf: user space buffer pointer - * @count: number of bytes to write - * @f_pos: offset (starting register address) - */ -static ssize_t rmidev_write(struct file *filp, const char __user *buf, - size_t count, loff_t *f_pos) -{ - ssize_t retval; - unsigned char tmpbuf[count + 1]; - struct rmidev_data *dev_data = filp->private_data; - - if (IS_ERR(dev_data)) { - pr_err("%s: Pointer of char device data is invalid", __func__); - return -EBADF; - } - - if (count == 0) - return 0; - - if (count > (REG_ADDR_LIMIT - *f_pos)) - count = REG_ADDR_LIMIT - *f_pos; - - if (copy_from_user(tmpbuf, buf, count)) - return -EFAULT; - - mutex_lock(&(dev_data->file_mutex)); - - retval = synaptics_rmi4_reg_write(rmidev->rmi4_data, - *f_pos, - tmpbuf, - count); - if (retval >= 0) - *f_pos += retval; - - mutex_unlock(&(dev_data->file_mutex)); - - return retval; -} - -/* - * rmidev_open: enable access to rmi device - * @inp: inode struture - * @filp: file structure - */ -static int rmidev_open(struct inode *inp, struct file *filp) -{ - int retval = 0; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - struct rmidev_data *dev_data = - container_of(inp->i_cdev, struct rmidev_data, main_dev); - - if (!dev_data) - return -EACCES; - - filp->private_data = dev_data; - - mutex_lock(&(dev_data->file_mutex)); - - rmi4_data->irq_enable(rmi4_data, false); - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Attention interrupt disabled\n", - __func__); - - if (dev_data->ref_count < 1) - dev_data->ref_count++; - else - retval = -EACCES; - - mutex_unlock(&(dev_data->file_mutex)); - - return retval; -} - -/* - * rmidev_release: - release access to rmi device - * @inp: inode structure - * @filp: file structure - */ -static int rmidev_release(struct inode *inp, struct file *filp) -{ - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - struct rmidev_data *dev_data = - container_of(inp->i_cdev, struct rmidev_data, main_dev); - - if (!dev_data) - return -EACCES; - - rmi4_data->reset_device(rmi4_data); - - mutex_lock(&(dev_data->file_mutex)); - - dev_data->ref_count--; - if (dev_data->ref_count < 0) - dev_data->ref_count = 0; - - rmi4_data->irq_enable(rmi4_data, true); - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Attention interrupt enabled\n", - __func__); - - mutex_unlock(&(dev_data->file_mutex)); - - return 0; -} - -static const struct file_operations rmidev_fops = { - .owner = THIS_MODULE, - .llseek = rmidev_llseek, - .read = rmidev_read, - .write = rmidev_write, - .open = rmidev_open, - .release = rmidev_release, -}; - -static void rmidev_device_cleanup(struct rmidev_data *dev_data) -{ - dev_t devno; - struct synaptics_rmi4_data *rmi4_data = rmidev->rmi4_data; - - if (dev_data) { - devno = dev_data->main_dev.dev; - - if (dev_data->device_class) - device_destroy(dev_data->device_class, devno); - - cdev_del(&dev_data->main_dev); - - unregister_chrdev_region(devno, 1); - - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: rmidev device removed\n", - __func__); - } - - return; -} - -static char *rmi_char_devnode(struct device *dev, umode_t *mode) -{ - if (!mode) - return NULL; - - *mode = (S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); - - return kasprintf(GFP_KERNEL, "rmi/%s", dev_name(dev)); -} - -static int rmidev_create_device_class(void) -{ - rmidev_device_class = class_create(THIS_MODULE, DEVICE_CLASS_NAME); - - if (IS_ERR(rmidev_device_class)) { - pr_err("%s: Failed to create /dev/%s\n", - __func__, CHAR_DEVICE_NAME); - return -ENODEV; - } - - rmidev_device_class->devnode = rmi_char_devnode; - - return 0; -} - -static int rmidev_init_device(struct synaptics_rmi4_data *rmi4_data) -{ - int retval; - dev_t dev_no; - unsigned char attr_count; - struct rmidev_data *dev_data; - struct device *device_ptr; - const struct synaptics_dsx_board_data *bdata = - rmi4_data->hw_if->board_data; - - rmidev = kzalloc(sizeof(*rmidev), GFP_KERNEL); - if (!rmidev) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to alloc mem for rmidev\n", - __func__); - retval = -ENOMEM; - goto err_rmidev; - } - - rmidev->rmi4_data = rmi4_data; - - retval = rmidev_create_device_class(); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create device class\n", - __func__); - goto err_device_class; - } - - if (rmidev_major_num) { - dev_no = MKDEV(rmidev_major_num, DEV_NUMBER); - retval = register_chrdev_region(dev_no, 1, CHAR_DEVICE_NAME); - } else { - retval = alloc_chrdev_region(&dev_no, 0, 1, CHAR_DEVICE_NAME); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to allocate char device region\n", - __func__); - goto err_device_region; - } - - rmidev_major_num = MAJOR(dev_no); - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Major number of rmidev = %d\n", - __func__, rmidev_major_num); - } - - dev_data = kzalloc(sizeof(*dev_data), GFP_KERNEL); - if (!dev_data) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to alloc mem for dev_data\n", - __func__); - retval = -ENOMEM; - goto err_dev_data; - } - - mutex_init(&dev_data->file_mutex); - dev_data->rmi_dev = rmidev; - rmidev->data = dev_data; - - cdev_init(&dev_data->main_dev, &rmidev_fops); - - retval = cdev_add(&dev_data->main_dev, dev_no, 1); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to add rmi char device\n", - __func__); - goto err_char_device; - } - - dev_set_name(&rmidev->dev, "rmidev%d", MINOR(dev_no)); - dev_data->device_class = rmidev_device_class; - - device_ptr = device_create(dev_data->device_class, NULL, dev_no, - NULL, CHAR_DEVICE_NAME"%d", MINOR(dev_no)); - if (IS_ERR(device_ptr)) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create rmi char device\n", - __func__); - retval = -ENODEV; - goto err_char_device; - } - - retval = gpio_export(bdata->irq_gpio, false); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to export attention gpio\n", - __func__); - } else { - retval = gpio_export_link(&(rmi4_data->input_dev->dev), - "attn", bdata->irq_gpio); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s Failed to create gpio symlink\n", - __func__); - } else { - dev_dbg(rmi4_data->pdev->dev.parent, - "%s: Exported attention gpio %d\n", - __func__, bdata->irq_gpio); - } - } - - rmidev->sysfs_dir = kobject_create_and_add(SYSFS_FOLDER_NAME, - &rmi4_data->input_dev->dev.kobj); - if (!rmidev->sysfs_dir) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create sysfs directory\n", - __func__); - retval = -ENODEV; - goto err_sysfs_dir; - } - - retval = sysfs_create_bin_file(rmidev->sysfs_dir, - &attr_data); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create sysfs bin file\n", - __func__); - goto err_sysfs_bin; - } - - for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { - retval = sysfs_create_file(rmidev->sysfs_dir, - &attrs[attr_count].attr); - if (retval < 0) { - dev_err(rmi4_data->pdev->dev.parent, - "%s: Failed to create sysfs attributes\n", - __func__); - retval = -ENODEV; - goto err_sysfs_attrs; - } - } - - return 0; - -err_sysfs_attrs: - for (attr_count--; attr_count >= 0; attr_count--) - sysfs_remove_file(rmidev->sysfs_dir, &attrs[attr_count].attr); - - sysfs_remove_bin_file(rmidev->sysfs_dir, &attr_data); - -err_sysfs_bin: - kobject_put(rmidev->sysfs_dir); - -err_sysfs_dir: -err_char_device: - rmidev_device_cleanup(dev_data); - kfree(dev_data); - -err_dev_data: - unregister_chrdev_region(dev_no, 1); - -err_device_region: - class_destroy(rmidev_device_class); - -err_device_class: - kfree(rmidev); - rmidev = NULL; - -err_rmidev: - return retval; -} - -static void rmidev_remove_device(struct synaptics_rmi4_data *rmi4_data) -{ - unsigned char attr_count; - struct rmidev_data *dev_data; - - if (!rmidev) - goto exit; - - for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) - sysfs_remove_file(rmidev->sysfs_dir, &attrs[attr_count].attr); - - sysfs_remove_bin_file(rmidev->sysfs_dir, &attr_data); - - kobject_put(rmidev->sysfs_dir); - - dev_data = rmidev->data; - if (dev_data) { - rmidev_device_cleanup(dev_data); - kfree(dev_data); - } - - unregister_chrdev_region(rmidev->dev_no, 1); - - class_destroy(rmidev_device_class); - - kfree(rmidev); - rmidev = NULL; - -exit: - complete(&rmidev_remove_complete); - - return; -} - -static struct synaptics_rmi4_exp_fn rmidev_module = { - .fn_type = RMI_DEV, - .init = rmidev_init_device, - .remove = rmidev_remove_device, - .reset = NULL, - .reinit = NULL, - .early_suspend = NULL, - .suspend = NULL, - .resume = NULL, - .late_resume = NULL, - .attn = NULL, -}; - -static int __init rmidev_module_init(void) -{ - synaptics_rmi4_dsx_new_function(&rmidev_module, true); - - return 0; -} - -static void __exit rmidev_module_exit(void) -{ - synaptics_rmi4_dsx_new_function(&rmidev_module, false); - - wait_for_completion(&rmidev_remove_complete); - - return; -} - -module_init(rmidev_module_init); -module_exit(rmidev_module_exit); - -MODULE_AUTHOR("Synaptics, Inc."); -MODULE_DESCRIPTION("Synaptics DSX RMI Dev Module"); -MODULE_LICENSE("GPL v2"); diff --git a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c index 52bd5cfc37c82..f4854a93a4460 100644 --- a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c +++ b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_fw_update.c @@ -127,6 +127,7 @@ static int fwu_do_reflash(void); static int fwu_recovery_check_status(void); +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static ssize_t fwu_sysfs_show_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count); @@ -179,6 +180,7 @@ static ssize_t fwu_sysfs_guest_code_block_count_show(struct device *dev, static ssize_t fwu_sysfs_write_guest_code_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count); +#endif enum f34_version { F34_V0 = 0, @@ -650,6 +652,7 @@ struct synaptics_rmi4_fwu_handle { struct work_struct fwu_work; }; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static struct bin_attribute dev_attr_data = { .attr = { .name = "data", @@ -659,8 +662,10 @@ static struct bin_attribute dev_attr_data = { .read = fwu_sysfs_show_image, .write = fwu_sysfs_store_image, }; +#endif static struct device_attribute attrs[] = { +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS __ATTR(dorecovery, S_IWUSR | S_IWGRP, NULL, fwu_sysfs_do_recovery_store), @@ -706,6 +711,7 @@ static struct device_attribute attrs[] = { __ATTR(writeguestcode, S_IWUSR | S_IWGRP, NULL, fwu_sysfs_write_guest_code_store), +#endif }; static struct synaptics_rmi4_fwu_handle *fwu; @@ -2218,10 +2224,12 @@ static int fwu_get_image_firmware_id(unsigned int *fw_id) __func__); return -ENOMEM; } - while (strptr[index] >= '0' && strptr[index] <= '9') { + while ((index < MAX_FIRMWARE_ID_LEN - 1) && strptr[index] >= '0' + && strptr[index] <= '9') { firmware_id[index] = strptr[index]; index++; } + firmware_id[index] = '\0'; retval = sstrtoul(firmware_id, 10, (unsigned long *)fw_id); kfree(firmware_id); @@ -2608,6 +2616,7 @@ static int fwu_check_dp_configuration_size(void) return 0; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_check_pm_configuration_size(void) { unsigned short block_count; @@ -2624,6 +2633,7 @@ static int fwu_check_pm_configuration_size(void) return 0; } +#endif static int fwu_check_bl_configuration_size(void) { @@ -2823,6 +2833,7 @@ static int fwu_write_dp_configuration(void) return fwu_write_configuration(); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_write_pm_configuration(void) { fwu->config_area = PM_CONFIG_AREA; @@ -2832,6 +2843,7 @@ static int fwu_write_pm_configuration(void) return fwu_write_configuration(); } +#endif static int fwu_write_flash_configuration(void) { @@ -3039,6 +3051,7 @@ static int fwu_do_reflash(void) return retval; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_do_read_config(void) { int retval; @@ -3116,6 +3129,7 @@ static int fwu_do_read_config(void) return retval; } +#endif static int fwu_do_lockdown_v7(void) { @@ -3190,6 +3204,7 @@ static int fwu_do_lockdown_v5v6(void) return retval; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_start_write_guest_code(void) { int retval; @@ -3395,6 +3410,7 @@ static int fwu_start_write_config(void) return retval; } +#endif static int fwu_start_reflash(void) { @@ -3596,6 +3612,7 @@ static int fwu_recovery_check_status(void) return 0; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_recovery_erase_all(void) { int retval; @@ -3789,6 +3806,7 @@ static int fwu_start_recovery(void) return retval; } +#endif int synaptics_fw_updater(const unsigned char *fw_data) { @@ -3847,6 +3865,7 @@ static void fwu_startup_fw_update_work(struct work_struct *work) } #endif +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static ssize_t fwu_sysfs_show_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) @@ -4218,6 +4237,7 @@ static ssize_t fwu_sysfs_write_guest_code_store(struct device *dev, fwu->image = NULL; return retval; } +#endif static void synaptics_rmi4_fwu_attn(struct synaptics_rmi4_data *rmi4_data, unsigned char intr_mask) @@ -4302,6 +4322,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) fwu->do_lockdown = DO_LOCKDOWN; fwu->initialized = true; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS retval = sysfs_create_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); if (retval < 0) { @@ -4310,6 +4331,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) __func__); goto exit_free_mem; } +#endif for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { retval = sysfs_create_file(&rmi4_data->input_dev->dev.kobj, @@ -4338,7 +4360,9 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) &attrs[attr_count].attr); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif exit_free_mem: kfree(fwu->image_name); @@ -4369,7 +4393,9 @@ static void synaptics_rmi4_fwu_remove(struct synaptics_rmi4_data *rmi4_data) &attrs[attr_count].attr); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif kfree(fwu->read_config_buf); kfree(fwu->image_name); diff --git a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_i2c.c b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_i2c.c index f936f3c2ebb1c..563ce16885b32 100644 --- a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_i2c.c +++ b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_i2c.c @@ -445,11 +445,11 @@ static int synaptics_rmi4_i2c_write(struct synaptics_rmi4_data *rmi4_data, struct i2c_client *i2c = to_i2c_client(rmi4_data->pdev->dev.parent); struct i2c_msg msg[1]; + mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex); + retval = synaptics_rmi4_i2c_alloc_buf(rmi4_data, length + 1); if (retval < 0) - return retval; - - mutex_lock(&rmi4_data->rmi4_io_ctrl_mutex); + goto exit; retval = synaptics_rmi4_i2c_set_page(rmi4_data, addr); if (retval != PAGE_SELECT_LEN) { diff --git a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_rmi_dev.c b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_rmi_dev.c index 111b26c7b7597..1cea2fc415f18 100644 --- a/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_rmi_dev.c +++ b/drivers/input/touchscreen/synaptics_dsx_2.6/synaptics_dsx_rmi_dev.c @@ -562,18 +562,24 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, return -EBADF; } - if (count == 0) - return 0; + mutex_lock(&(dev_data->file_mutex)); + + if (*f_pos > REG_ADDR_LIMIT) { + retval = -EFAULT; + goto clean_up; + } if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; + if (count == 0) { + retval = 0; + goto clean_up; + } address = (unsigned short)(*f_pos); rmidev_allocate_buffer(count); - mutex_lock(&(dev_data->file_mutex)); - retval = synaptics_rmi4_reg_read(rmidev->rmi4_data, *f_pos, rmidev->tmpbuf, @@ -633,18 +639,26 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, return -EBADF; } - if (count == 0) - return 0; + mutex_lock(&(dev_data->file_mutex)); + + if (*f_pos > REG_ADDR_LIMIT) { + retval = -EFAULT; + goto unlock; + } if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; + if (count == 0) { + retval = 0; + goto unlock; + } rmidev_allocate_buffer(count); - if (copy_from_user(rmidev->tmpbuf, buf, count)) + if (copy_from_user(rmidev->tmpbuf, buf, count)) { return -EFAULT; - - mutex_lock(&(dev_data->file_mutex)); + goto unlock; + } retval = synaptics_rmi4_reg_write(rmidev->rmi4_data, *f_pos, @@ -653,6 +667,7 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, if (retval >= 0) *f_pos += retval; +unlock: mutex_unlock(&(dev_data->file_mutex)); return retval; diff --git a/drivers/input/touchscreen/synaptics_fw_update.c b/drivers/input/touchscreen/synaptics_fw_update.c index f4abf16d28374..98e25339c0b72 100644 --- a/drivers/input/touchscreen/synaptics_fw_update.c +++ b/drivers/input/touchscreen/synaptics_fw_update.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -259,6 +260,7 @@ struct synaptics_rmi4_fwu_handle { bool interrupt_flag; bool polling_mode; char product_id[SYNAPTICS_RMI4_PRODUCT_ID_SIZE + 1]; + unsigned int full_update_size; unsigned int image_size; unsigned int data_pos; unsigned char intr_mask; @@ -296,6 +298,23 @@ struct synaptics_rmi4_fwu_handle { static struct synaptics_rmi4_fwu_handle *fwu; DECLARE_COMPLETION(fwu_remove_complete); +DEFINE_MUTEX(fwu_sysfs_mutex); + +/* Check offset + size <= bound. 1 if in bounds, 0 otherwise. */ +static bool in_bounds(unsigned long offset, + unsigned long size, + unsigned long bound) +{ + if (offset > bound || size > bound) { + pr_err("%s: %lu or %lu > %lu\n", __func__, offset, size, bound); + return 0; + } + if (offset > (bound - size)) { + pr_err("%s: %lu > %lu - %lu\n", __func__, offset, size, bound); + return 0; + } + return 1; +} static unsigned int extract_uint(const unsigned char *ptr) { @@ -333,11 +352,17 @@ static void synaptics_rmi4_update_debug_info(void) pkg_id[3] << 8 | pkg_id[2], build_id); } -static void parse_header(void) +static int parse_header(void) { struct image_content *img = &fwu->image_content; struct image_header_data *data = (struct image_header_data *)fwu->data_buffer; + if (fwu->full_update_size < sizeof(*data)) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "Provided update too small"); + return -EINVAL; + } + img->checksum = extract_uint(data->file_checksum); img->bootloader_version = data->bootloader_version; img->image_size = extract_uint(data->firmware_size); @@ -374,12 +399,29 @@ static void parse_header(void) img->config_size); /* get UI firmware offset */ - if (img->image_size) + if (img->image_size) { + if (!in_bounds(FW_IMAGE_OFFSET, img->image_size, + fwu->full_update_size)) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "%s: image size out of bounds\n", + __func__); + return -EINVAL; + } img->firmware_data = fwu->data_buffer + FW_IMAGE_OFFSET; + } /* get config offset*/ - if (img->config_size) + if (img->config_size) { + // FW_IMAGE_OFFSET + image_size was ok as above + if (!in_bounds(FW_IMAGE_OFFSET + img->image_size, + img->config_size, fwu->full_update_size)) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "%s: config size out of bounds\n", + __func__); + return -EINVAL; + } img->config_data = fwu->data_buffer + FW_IMAGE_OFFSET + img->image_size; + } /* get lockdown offset*/ switch (img->bootloader_version) { case 3: @@ -398,6 +440,14 @@ static void parse_header(void) img->lockdown_data = NULL; } + if (img->lockdown_block_count * fwu->block_size > FW_IMAGE_OFFSET) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "%s: lockdown size too big\n", + __func__); + return -EINVAL; + } + if (fwu->full_update_size < FW_IMAGE_OFFSET) + return -EINVAL; img->lockdown_data = fwu->data_buffer + FW_IMAGE_OFFSET - img->lockdown_block_count * fwu->block_size; @@ -406,7 +456,7 @@ static void parse_header(void) fwu->lockdown_data = img->lockdown_data; fwu->config_data = img->config_data; fwu->firmware_data = img->firmware_data; - return; + return 0; } static int fwu_read_f01_device_status(struct f01_device_status *status) @@ -1255,6 +1305,7 @@ static int fwu_do_write_config(void) return retval; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_start_write_config(void) { int retval; @@ -1288,8 +1339,8 @@ static int fwu_start_write_config(void) "%s: write config from config file\n", __func__); fwu->config_data = fwu->data_buffer; - } else { - parse_header(); + } else if (parse_header()) { + return -EINVAL; } pr_notice("%s: Start of write config process\n", __func__); @@ -1307,6 +1358,7 @@ static int fwu_start_write_config(void) return retval; } +#endif static int fwu_do_write_lockdown(bool reset) { @@ -1354,9 +1406,11 @@ static int fwu_do_write_lockdown(bool reset) return retval; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static int fwu_start_write_lockdown(void) { - parse_header(); + if (parse_header()) + return -EINVAL; return fwu_do_write_lockdown(true); } @@ -1454,6 +1508,7 @@ static int fwu_do_read_config(void) exit: return retval; } +#endif static int fwu_do_reflash(void) { @@ -1576,9 +1631,13 @@ static int fwu_start_reflash(void) __func__, fw_entry->size); fwu->data_buffer = fw_entry->data; + fwu->full_update_size = fw_entry->size; } - parse_header(); + if (parse_header()) { + retval = -EINVAL; + goto exit; + } flash_area = fwu_go_nogo(); if (fwu->rmi4_data->sensor_sleep) { @@ -1675,36 +1734,65 @@ int synaptics_fw_updater(void) } EXPORT_SYMBOL(synaptics_fw_updater); +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static ssize_t fwu_sysfs_show_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) { struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + ssize_t retval; + + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; if (count < fwu->config_size) { dev_err(&rmi4_data->i2c_client->dev, "%s: Not enough space (%zu bytes) in buffer\n", __func__, count); - return -EINVAL; + retval = -EINVAL; + goto show_image_exit; } memcpy(buf, fwu->read_config_buf, fwu->config_size); - - return fwu->config_size; + retval = fwu->config_size; +show_image_exit: + mutex_unlock(&fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_store_image(struct file *data_file, struct kobject *kobj, struct bin_attribute *attributes, char *buf, loff_t pos, size_t count) { + ssize_t retval; + + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + if (!fwu->ext_data_source) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "Cannot use this without setting imagesize!\n"); + retval = -EAGAIN; + goto exit; + } + if (count > fwu->image_size - fwu->data_pos) { + dev_err(&fwu->rmi4_data->i2c_client->dev, + "%s: Not enough space in buffer\n", + __func__); + + retval = -EINVAL; + goto exit; + } + memcpy((void *)(&fwu->ext_data_source[fwu->data_pos]), (const void *)buf, count); fwu->data_buffer = fwu->ext_data_source; fwu->data_pos += count; - - return count; + retval = count; +exit: + mutex_unlock(&fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_image_name_store(struct device *dev, @@ -1727,18 +1815,29 @@ static ssize_t fwu_sysfs_image_name_store(struct device *dev, return -EINVAL; } + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; strlcpy(rmi4_data->fw_image_name, buf, count); + mutex_unlock(&fwu_sysfs_mutex); + return count; } static ssize_t fwu_sysfs_image_name_show(struct device *dev, struct device_attribute *attr, char *buf) { + ssize_t retval; + + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + if (strnlen(fwu->rmi4_data->fw_image_name, NAME_BUFFER_SIZE) > 0) - return snprintf(buf, PAGE_SIZE, "%s\n", + retval = snprintf(buf, PAGE_SIZE, "%s\n", fwu->rmi4_data->fw_image_name); else - return snprintf(buf, PAGE_SIZE, "No firmware name given\n"); + retval = snprintf(buf, PAGE_SIZE, "No firmware name given\n"); + mutex_unlock(&fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_force_reflash_store(struct device *dev, @@ -1748,6 +1847,9 @@ static ssize_t fwu_sysfs_force_reflash_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + retval = kstrtouint(buf, 10, &input); if (retval) goto exit; @@ -1774,7 +1876,10 @@ static ssize_t fwu_sysfs_force_reflash_store(struct device *dev, kfree(fwu->ext_data_source); fwu->ext_data_source = NULL; fwu->force_update = FORCE_UPDATE; + fwu->image_size = 0; + fwu->data_pos = 0; fwu->do_lockdown = rmi4_data->board->do_lockdown; + mutex_unlock(&fwu_sysfs_mutex); return retval; } @@ -1785,6 +1890,9 @@ static ssize_t fwu_sysfs_do_reflash_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + retval = kstrtouint(buf, 10, &input); if (retval) goto exit; @@ -1815,8 +1923,11 @@ static ssize_t fwu_sysfs_do_reflash_store(struct device *dev, exit: kfree(fwu->ext_data_source); fwu->ext_data_source = NULL; + fwu->image_size = 0; + fwu->data_pos = 0; fwu->force_update = FORCE_UPDATE; fwu->do_lockdown = rmi4_data->board->do_lockdown; + mutex_unlock(&fwu_sysfs_mutex); return retval; } @@ -1827,6 +1938,9 @@ static ssize_t fwu_sysfs_write_lockdown_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + if (sscanf(buf, "%u", &input) != 1) { retval = -EINVAL; goto exit; @@ -1852,6 +1966,9 @@ static ssize_t fwu_sysfs_write_lockdown_store(struct device *dev, fwu->ext_data_source = NULL; fwu->force_update = FORCE_UPDATE; fwu->do_lockdown = rmi4_data->board->do_lockdown; + fwu->image_size = 0; + fwu->data_pos = 0; + mutex_unlock(&fwu_sysfs_mutex); return retval; } @@ -1862,6 +1979,9 @@ static ssize_t fwu_sysfs_write_config_store(struct device *dev, unsigned int input; struct synaptics_rmi4_data *rmi4_data = fwu->rmi4_data; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + retval = kstrtouint(buf, 10, &input); if (retval) goto exit; @@ -1884,6 +2004,9 @@ static ssize_t fwu_sysfs_write_config_store(struct device *dev, exit: kfree(fwu->ext_data_source); fwu->ext_data_source = NULL; + fwu->image_size = 0; + fwu->data_pos = 0; + mutex_unlock(&fwu_sysfs_mutex); return retval; } @@ -1901,7 +2024,11 @@ static ssize_t fwu_sysfs_read_config_store(struct device *dev, if (input != 1) return -EINVAL; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; retval = fwu_do_read_config(); + mutex_unlock(&fwu_sysfs_mutex); + if (retval < 0) { dev_err(&rmi4_data->i2c_client->dev, "%s: Failed to read config\n", @@ -1930,7 +2057,10 @@ static ssize_t fwu_sysfs_config_area_store(struct device *dev, return -EINVAL; } + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; fwu->config_area = config_area; + mutex_unlock(&fwu_sysfs_mutex); return count; } @@ -1945,15 +2075,24 @@ static ssize_t fwu_sysfs_image_size_store(struct device *dev, if (retval) return retval; + if (!mutex_trylock(&fwu_sysfs_mutex)) + return -EBUSY; + + fwu->full_update_size = size; fwu->image_size = size; fwu->data_pos = 0; kfree(fwu->ext_data_source); fwu->ext_data_source = kzalloc(fwu->image_size, GFP_KERNEL); - if (!fwu->ext_data_source) - return -ENOMEM; + if (!fwu->ext_data_source) { + retval = -ENOMEM; + goto exit; + } - return count; + retval = count; +exit: + mutex_unlock(&fwu_sysfs_mutex); + return retval; } static ssize_t fwu_sysfs_block_size_show(struct device *dev, @@ -2020,6 +2159,7 @@ static ssize_t fwu_sysfs_package_id_show(struct device *dev, (pkg_id[1] << 8) | pkg_id[0], (pkg_id[3] << 8) | pkg_id[2]); } +#endif static int synaptics_rmi4_debug_dump_info(struct seq_file *m, void *v) { @@ -2053,6 +2193,7 @@ static void synaptics_rmi4_fwu_attn(struct synaptics_rmi4_data *rmi4_data, return; } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS static struct bin_attribute dev_attr_data = { .attr = { .name = "data", @@ -2062,8 +2203,10 @@ static struct bin_attribute dev_attr_data = { .read = fwu_sysfs_show_image, .write = fwu_sysfs_store_image, }; +#endif static struct device_attribute attrs[] = { +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS __ATTR(fw_name, S_IRUGO | S_IWUSR | S_IWGRP, fwu_sysfs_image_name_show, fwu_sysfs_image_name_store), @@ -2112,12 +2255,15 @@ static struct device_attribute attrs[] = { __ATTR(package_id, S_IRUGO, fwu_sysfs_package_id_show, synaptics_rmi4_store_error), +#endif }; static void synaptics_rmi4_fwu_work(struct work_struct *work) { + mutex_lock(&fwu_sysfs_mutex); fwu_start_reflash(); + mutex_unlock(&fwu_sysfs_mutex); } static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) @@ -2189,6 +2335,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) fwu->initialized = true; fwu->polling_mode = false; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS retval = sysfs_create_bin_file(&rmi4_data->i2c_client->dev.kobj, &dev_attr_data); if (retval < 0) { @@ -2197,6 +2344,7 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) __func__); goto exit_free_mem; } +#endif for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { retval = sysfs_create_file(&rmi4_data->i2c_client->dev.kobj, @@ -2244,7 +2392,9 @@ static int synaptics_rmi4_fwu_init(struct synaptics_rmi4_data *rmi4_data) &attrs[attr_count].attr); } +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif exit_free_mem: kfree(fwu->fn_ptr); @@ -2261,7 +2411,9 @@ static void synaptics_rmi4_fwu_remove(struct synaptics_rmi4_data *rmi4_data) { unsigned char attr_count; +#ifdef CONFIG_TOUCHSCREEN_SYNAPTICS_DSX_FW_UPDATE_EXTRA_SYSFS sysfs_remove_bin_file(&rmi4_data->input_dev->dev.kobj, &dev_attr_data); +#endif for (attr_count = 0; attr_count < ARRAY_SIZE(attrs); attr_count++) { sysfs_remove_file(&rmi4_data->input_dev->dev.kobj, diff --git a/drivers/input/touchscreen/synaptics_i2c_rmi4.c b/drivers/input/touchscreen/synaptics_i2c_rmi4.c index bb474701c80cb..432b70f9e4314 100644 --- a/drivers/input/touchscreen/synaptics_i2c_rmi4.c +++ b/drivers/input/touchscreen/synaptics_i2c_rmi4.c @@ -2085,6 +2085,12 @@ static int synaptics_rmi4_f11_init(struct synaptics_rmi4_data *rmi4_data, rmi4_data->max_touch_width = MAX_F11_TOUCH_WIDTH; fhandler->intr_reg_num = (intr_count + 7) / 8; + if (fhandler->intr_reg_num >= MAX_INTR_REGISTERS) { + fhandler->intr_reg_num = 0; + fhandler->num_of_data_sources = 0; + fhandler->intr_mask = 0; + return -EINVAL; + } if (fhandler->intr_reg_num != 0) fhandler->intr_reg_num -= 1; @@ -2356,6 +2362,13 @@ static int synaptics_rmi4_f12_init(struct synaptics_rmi4_data *rmi4_data, rmi4_data->num_of_tx); fhandler->intr_reg_num = (intr_count + 7) / 8; + if (fhandler->intr_reg_num >= MAX_INTR_REGISTERS) { + fhandler->intr_reg_num = 0; + fhandler->num_of_data_sources = 0; + fhandler->intr_mask = 0; + retval = -EINVAL; + goto free_function_handler_mem; + } if (fhandler->intr_reg_num != 0) fhandler->intr_reg_num -= 1; @@ -2485,6 +2498,13 @@ static int synaptics_rmi4_f1a_init(struct synaptics_rmi4_data *rmi4_data, fhandler->num_of_data_sources = fd->intr_src_count; fhandler->intr_reg_num = (intr_count + 7) / 8; + if (fhandler->intr_reg_num >= MAX_INTR_REGISTERS) { + fhandler->intr_reg_num = 0; + fhandler->num_of_data_sources = 0; + fhandler->intr_mask = 0; + retval = -EINVAL; + goto error_exit; + } if (fhandler->intr_reg_num != 0) fhandler->intr_reg_num -= 1; @@ -2835,7 +2855,8 @@ static int synaptics_rmi4_query_device(struct synaptics_rmi4_data *rmi4_data) dev_dbg(&rmi4_data->i2c_client->dev, "%s: Number of interrupt registers = %d\n", __func__, rmi4_data->num_of_intr_regs); - + if (rmi4_data->num_of_intr_regs >= MAX_INTR_REGISTERS) + return -EINVAL; memset(rmi4_data->intr_mask, 0x00, sizeof(rmi4_data->intr_mask)); /* @@ -3712,6 +3733,7 @@ static int synaptics_rmi4_probe(struct i2c_client *client, input_unregister_device(rmi4_data->input_dev); err_register_input: +err_free_gpios: mutex_lock(&rmi->support_fn_list_mutex); if (!list_empty(&rmi->support_fn_list)) { list_for_each_entry_safe(fhandler, next_fhandler, @@ -3719,14 +3741,15 @@ static int synaptics_rmi4_probe(struct i2c_client *client, if (fhandler->fn_number == SYNAPTICS_RMI4_F1A) synaptics_rmi4_f1a_kfree(fhandler); else { - kfree(fhandler->data); - kfree(fhandler->extra); + if (fhandler->data != NULL) + kfree(fhandler->data); + if (fhandler->extra != NULL) + kfree(fhandler->extra); } kfree(fhandler); } } mutex_unlock(&rmi->support_fn_list_mutex); -err_free_gpios: if (gpio_is_valid(rmi4_data->board->reset_gpio)) gpio_free(rmi4_data->board->reset_gpio); if (gpio_is_valid(rmi4_data->board->irq_gpio)) diff --git a/drivers/input/touchscreen/synaptics_rmi_dev.c b/drivers/input/touchscreen/synaptics_rmi_dev.c index 839635d093063..d83912664865e 100644 --- a/drivers/input/touchscreen/synaptics_rmi_dev.c +++ b/drivers/input/touchscreen/synaptics_rmi_dev.c @@ -73,19 +73,19 @@ struct rmidev_data { }; static struct device_attribute attrs[] = { - __ATTR(open, S_IWUSR | S_IWGRP, + __ATTR(open, S_IWUSR, NULL, rmidev_sysfs_open_store), - __ATTR(release, S_IWUSR | S_IWGRP, + __ATTR(release, S_IWUSR, NULL, rmidev_sysfs_release_store), - __ATTR(address, S_IWUSR | S_IWGRP, + __ATTR(address, S_IWUSR, NULL, rmidev_sysfs_address_store), - __ATTR(length, S_IWUSR | S_IWGRP, + __ATTR(length, S_IWUSR, NULL, rmidev_sysfs_length_store), - __ATTR(data, (S_IWUSR | S_IWGRP), + __ATTR(data, S_IWUSR, rmidev_sysfs_data_show, rmidev_sysfs_data_store), }; @@ -299,7 +299,7 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, size_t count, loff_t *f_pos) { ssize_t retval; - unsigned char tmpbuf[count + 1]; + unsigned char *tmpbuf; struct rmidev_data *dev_data = filp->private_data; if (IS_ERR(dev_data)) { @@ -307,14 +307,26 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, return -EBADF; } - if (count == 0) - return 0; + mutex_lock(&(dev_data->file_mutex)); if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; - mutex_lock(&(dev_data->file_mutex)); + if (count == 0) { + retval = 0; + goto unlock; + } + + if (*f_pos > REG_ADDR_LIMIT) { + retval = -EFAULT; + goto unlock; + } + tmpbuf = kzalloc(count + 1, GFP_KERNEL); + if (!tmpbuf) { + retval = -ENOMEM; + goto unlock; + } retval = rmidev->fn_ptr->read(rmidev->rmi4_data, *f_pos, tmpbuf, @@ -328,8 +340,9 @@ static ssize_t rmidev_read(struct file *filp, char __user *buf, *f_pos += retval; clean_up: + kfree(tmpbuf); +unlock: mutex_unlock(&(dev_data->file_mutex)); - return retval; } @@ -345,7 +358,7 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, size_t count, loff_t *f_pos) { ssize_t retval; - unsigned char tmpbuf[count + 1]; + unsigned char *tmpbuf; struct rmidev_data *dev_data = filp->private_data; if (IS_ERR(dev_data)) { @@ -353,16 +366,31 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, return -EBADF; } - if (count == 0) - return 0; + mutex_lock(&(dev_data->file_mutex)); + + if (*f_pos > REG_ADDR_LIMIT) { + retval = -EFAULT; + goto unlock; + } if (count > (REG_ADDR_LIMIT - *f_pos)) count = REG_ADDR_LIMIT - *f_pos; - if (copy_from_user(tmpbuf, buf, count)) - return -EFAULT; + if (count == 0) { + retval = 0; + goto unlock; + } - mutex_lock(&(dev_data->file_mutex)); + tmpbuf = kzalloc(count + 1, GFP_KERNEL); + if (!tmpbuf) { + retval = -ENOMEM; + goto unlock; + } + + if (copy_from_user(tmpbuf, buf, count)) { + retval = -EFAULT; + goto clean_up; + } retval = rmidev->fn_ptr->write(rmidev->rmi4_data, *f_pos, @@ -371,8 +399,10 @@ static ssize_t rmidev_write(struct file *filp, const char __user *buf, if (retval >= 0) *f_pos += retval; +clean_up: + kfree(tmpbuf); +unlock: mutex_unlock(&(dev_data->file_mutex)); - return retval; } diff --git a/drivers/iommu/iommu-debug.c b/drivers/iommu/iommu-debug.c index 65c46aa197292..f7c5588dda661 100644 --- a/drivers/iommu/iommu-debug.c +++ b/drivers/iommu/iommu-debug.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -27,6 +27,7 @@ #include #include #include +#include "iommu-debug.h" #if defined(CONFIG_IOMMU_DEBUG_TRACKING) || defined(CONFIG_IOMMU_TESTS) @@ -81,380 +82,58 @@ static const char *iommu_debug_attr_to_string(enum iommu_attr attr) static DEFINE_MUTEX(iommu_debug_attachments_lock); static LIST_HEAD(iommu_debug_attachments); -static struct dentry *debugfs_attachments_dir; +/* + * Each group may have more than one domain; but each domain may + * only have one group. + * Used by debug tools to display the name of the device(s) associated + * with a particular domain. + */ struct iommu_debug_attachment { struct iommu_domain *domain; - struct device *dev; - struct dentry *dentry; + struct iommu_group *group; struct list_head list; - unsigned long reg_offset; }; -static int iommu_debug_attachment_info_show(struct seq_file *s, void *ignored) -{ - struct iommu_debug_attachment *attach = s->private; - phys_addr_t pt_phys; - int coherent_htw_disable; - int secure_vmid; - - seq_printf(s, "Domain: 0x%p\n", attach->domain); - if (iommu_domain_get_attr(attach->domain, DOMAIN_ATTR_PT_BASE_ADDR, - &pt_phys)) { - seq_puts(s, "PT_BASE_ADDR: (Unknown)\n"); - } else { - void *pt_virt = phys_to_virt(pt_phys); - - seq_printf(s, "PT_BASE_ADDR: virt=0x%p phys=%pa\n", - pt_virt, &pt_phys); - } - - seq_puts(s, "COHERENT_HTW_DISABLE: "); - if (iommu_domain_get_attr(attach->domain, - DOMAIN_ATTR_COHERENT_HTW_DISABLE, - &coherent_htw_disable)) - seq_puts(s, "(Unknown)\n"); - else - seq_printf(s, "%d\n", coherent_htw_disable); - - seq_puts(s, "SECURE_VMID: "); - if (iommu_domain_get_attr(attach->domain, - DOMAIN_ATTR_SECURE_VMID, - &secure_vmid)) - seq_puts(s, "(Unknown)\n"); - else - seq_printf(s, "%s (0x%x)\n", - msm_secure_vmid_to_string(secure_vmid), secure_vmid); - - return 0; -} - -static int iommu_debug_attachment_info_open(struct inode *inode, - struct file *file) -{ - return single_open(file, iommu_debug_attachment_info_show, - inode->i_private); -} - -static const struct file_operations iommu_debug_attachment_info_fops = { - .open = iommu_debug_attachment_info_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - -static ssize_t iommu_debug_attachment_trigger_fault_write( - struct file *file, const char __user *ubuf, size_t count, - loff_t *offset) -{ - struct iommu_debug_attachment *attach = file->private_data; - unsigned long flags; - - if (kstrtoul_from_user(ubuf, count, 0, &flags)) { - pr_err("Invalid flags format\n"); - return -EFAULT; - } - - iommu_trigger_fault(attach->domain, flags); - - return count; -} - -static const struct file_operations -iommu_debug_attachment_trigger_fault_fops = { - .open = simple_open, - .write = iommu_debug_attachment_trigger_fault_write, -}; - -static ssize_t iommu_debug_attachment_reg_offset_write( - struct file *file, const char __user *ubuf, size_t count, - loff_t *offset) -{ - struct iommu_debug_attachment *attach = file->private_data; - unsigned long reg_offset; - - if (kstrtoul_from_user(ubuf, count, 0, ®_offset)) { - pr_err("Invalid reg_offset format\n"); - return -EFAULT; - } - - attach->reg_offset = reg_offset; - - return count; -} - -static const struct file_operations iommu_debug_attachment_reg_offset_fops = { - .open = simple_open, - .write = iommu_debug_attachment_reg_offset_write, -}; - -static ssize_t iommu_debug_attachment_reg_read_read( - struct file *file, char __user *ubuf, size_t count, loff_t *offset) -{ - struct iommu_debug_attachment *attach = file->private_data; - unsigned long val; - char *val_str; - ssize_t val_str_len; - - if (*offset) - return 0; - - val = iommu_reg_read(attach->domain, attach->reg_offset); - val_str = kasprintf(GFP_KERNEL, "0x%lx\n", val); - if (!val_str) - return -ENOMEM; - val_str_len = strlen(val_str); - - if (copy_to_user(ubuf, val_str, val_str_len)) { - pr_err("copy_to_user failed\n"); - val_str_len = -EFAULT; - goto out; - } - *offset = 1; /* non-zero means we're done */ - -out: - kfree(val_str); - return val_str_len; -} - -static const struct file_operations iommu_debug_attachment_reg_read_fops = { - .open = simple_open, - .read = iommu_debug_attachment_reg_read_read, -}; - -static ssize_t iommu_debug_attachment_reg_write_write( - struct file *file, const char __user *ubuf, size_t count, - loff_t *offset) -{ - struct iommu_debug_attachment *attach = file->private_data; - unsigned long val; - - if (kstrtoul_from_user(ubuf, count, 0, &val)) { - pr_err("Invalid val format\n"); - return -EFAULT; - } - - iommu_reg_write(attach->domain, attach->reg_offset, val); - - return count; -} - -static const struct file_operations iommu_debug_attachment_reg_write_fops = { - .open = simple_open, - .write = iommu_debug_attachment_reg_write_write, -}; - -/* should be called with iommu_debug_attachments_lock locked */ -static int iommu_debug_attach_add_debugfs( - struct iommu_debug_attachment *attach) -{ - const char *attach_name; - struct device *dev = attach->dev; - struct iommu_domain *domain = attach->domain; - int is_dynamic; - - if (iommu_domain_get_attr(domain, DOMAIN_ATTR_DYNAMIC, &is_dynamic)) - is_dynamic = 0; - - if (is_dynamic) { - uuid_le uuid; - - uuid_le_gen(&uuid); - attach_name = kasprintf(GFP_KERNEL, "%s-%pUl", dev_name(dev), - uuid.b); - if (!attach_name) - return -ENOMEM; - } else { - attach_name = dev_name(dev); - } - - attach->dentry = debugfs_create_dir(attach_name, - debugfs_attachments_dir); - if (!attach->dentry) { - pr_err("Couldn't create iommu/attachments/%s debugfs directory for domain 0x%p\n", - attach_name, domain); - if (is_dynamic) - kfree(attach_name); - return -EIO; - } - - if (is_dynamic) - kfree(attach_name); - - if (!debugfs_create_file( - "info", S_IRUSR, attach->dentry, attach, - &iommu_debug_attachment_info_fops)) { - pr_err("Couldn't create iommu/attachments/%s/info debugfs file for domain 0x%p\n", - dev_name(dev), domain); - goto err_rmdir; - } - - if (!debugfs_create_file( - "trigger_fault", S_IRUSR, attach->dentry, attach, - &iommu_debug_attachment_trigger_fault_fops)) { - pr_err("Couldn't create iommu/attachments/%s/trigger_fault debugfs file for domain 0x%p\n", - dev_name(dev), domain); - goto err_rmdir; - } - - if (!debugfs_create_file( - "reg_offset", S_IRUSR, attach->dentry, attach, - &iommu_debug_attachment_reg_offset_fops)) { - pr_err("Couldn't create iommu/attachments/%s/reg_offset debugfs file for domain 0x%p\n", - dev_name(dev), domain); - goto err_rmdir; - } - - if (!debugfs_create_file( - "reg_read", S_IRUSR, attach->dentry, attach, - &iommu_debug_attachment_reg_read_fops)) { - pr_err("Couldn't create iommu/attachments/%s/reg_read debugfs file for domain 0x%p\n", - dev_name(dev), domain); - goto err_rmdir; - } - - if (!debugfs_create_file( - "reg_write", S_IRUSR, attach->dentry, attach, - &iommu_debug_attachment_reg_write_fops)) { - pr_err("Couldn't create iommu/attachments/%s/reg_write debugfs file for domain 0x%p\n", - dev_name(dev), domain); - goto err_rmdir; - } - - return 0; - -err_rmdir: - debugfs_remove_recursive(attach->dentry); - return -EIO; -} - -void iommu_debug_domain_add(struct iommu_domain *domain) +void iommu_debug_attach_device(struct iommu_domain *domain, + struct device *dev) { struct iommu_debug_attachment *attach; + struct iommu_group *group; - mutex_lock(&iommu_debug_attachments_lock); + group = iommu_group_get(dev); + if (!group) + return; - attach = kmalloc(sizeof(*attach), GFP_KERNEL); + attach = kzalloc(sizeof(*attach), GFP_KERNEL); if (!attach) - goto out_unlock; + return; attach->domain = domain; - attach->dev = NULL; - list_add(&attach->list, &iommu_debug_attachments); + attach->group = group; + INIT_LIST_HEAD(&attach->list); -out_unlock: + mutex_lock(&iommu_debug_attachments_lock); + list_add(&attach->list, &iommu_debug_attachments); mutex_unlock(&iommu_debug_attachments_lock); } void iommu_debug_domain_remove(struct iommu_domain *domain) { - struct iommu_debug_attachment *it; + struct iommu_debug_attachment *it, *tmp; mutex_lock(&iommu_debug_attachments_lock); - list_for_each_entry(it, &iommu_debug_attachments, list) - if (it->domain == domain && it->dev == NULL) - break; - - if (&it->list == &iommu_debug_attachments) { - WARN(1, "Couldn't find debug attachment for domain=0x%p", - domain); - } else { + list_for_each_entry_safe(it, tmp, &iommu_debug_attachments, list) { + if (it->domain != domain) + continue; list_del(&it->list); + iommu_group_put(it->group); kfree(it); } - mutex_unlock(&iommu_debug_attachments_lock); -} - -void iommu_debug_attach_device(struct iommu_domain *domain, - struct device *dev) -{ - struct iommu_debug_attachment *attach; - - mutex_lock(&iommu_debug_attachments_lock); - - list_for_each_entry(attach, &iommu_debug_attachments, list) - if (attach->domain == domain && attach->dev == NULL) - break; - - if (&attach->list == &iommu_debug_attachments) { - WARN(1, "Couldn't find debug attachment for domain=0x%p dev=%s", - domain, dev_name(dev)); - } else { - attach->dev = dev; - - /* - * we might not init until after other drivers start calling - * iommu_attach_device. Only set up the debugfs nodes if we've - * already init'd to avoid polluting the top-level debugfs - * directory (by calling debugfs_create_dir with a NULL - * parent). These will be flushed out later once we init. - */ - - if (debugfs_attachments_dir) - iommu_debug_attach_add_debugfs(attach); - } - - mutex_unlock(&iommu_debug_attachments_lock); -} - -void iommu_debug_detach_device(struct iommu_domain *domain, - struct device *dev) -{ - struct iommu_debug_attachment *it; - - mutex_lock(&iommu_debug_attachments_lock); - list_for_each_entry(it, &iommu_debug_attachments, list) - if (it->domain == domain && it->dev == dev) - break; - - if (&it->list == &iommu_debug_attachments) { - WARN(1, "Couldn't find debug attachment for domain=0x%p dev=%s", - domain, dev_name(dev)); - } else { - /* - * Just remove debugfs entry and mark dev as NULL on - * iommu_detach call. We would remove the actual - * attachment entry from the list only on domain_free call. - * This is to ensure we keep track of unattached domains too. - */ - - debugfs_remove_recursive(it->dentry); - it->dev = NULL; - } - mutex_unlock(&iommu_debug_attachments_lock); -} - -static int iommu_debug_init_tracking(void) -{ - int ret = 0; - struct iommu_debug_attachment *attach; - - mutex_lock(&iommu_debug_attachments_lock); - debugfs_attachments_dir = debugfs_create_dir("attachments", - iommu_debugfs_top); - if (!debugfs_attachments_dir) { - pr_err("Couldn't create iommu/attachments debugfs directory\n"); - ret = -ENODEV; - goto out_unlock; - } - - /* set up debugfs entries for attachments made during early boot */ - list_for_each_entry(attach, &iommu_debug_attachments, list) - if (attach->dev) - iommu_debug_attach_add_debugfs(attach); -out_unlock: mutex_unlock(&iommu_debug_attachments_lock); - return ret; } -static void iommu_debug_destroy_tracking(void) -{ - debugfs_remove_recursive(debugfs_attachments_dir); -} -#else -static inline int iommu_debug_init_tracking(void) { return 0; } -static inline void iommu_debug_destroy_tracking(void) { } #endif #ifdef CONFIG_IOMMU_TESTS @@ -484,6 +163,8 @@ struct iommu_debug_device { u64 phys; size_t len; struct list_head list; + struct mutex clk_lock; + unsigned int clk_count; }; static int iommu_debug_build_phoney_sg_table(struct device *dev, @@ -1522,6 +1203,7 @@ static int iommu_debug_attach_do_attach(struct iommu_debug_device *ddev, goto out_domain_free; } + val = VMID_CP_CAMERA; if (is_secure && iommu_domain_set_attr(ddev->domain, DOMAIN_ATTR_SECURE_VMID, &val)) { @@ -1667,6 +1349,10 @@ static ssize_t iommu_debug_atos_read(struct file *file, char __user *ubuf, ssize_t retval; size_t buflen; + if (kptr_restrict != 0) { + pr_err("kptr_restrict needs to be disabled.\n"); + return -EPERM; + } if (!ddev->domain) { pr_err("No domain. Did you already attach?\n"); return -EINVAL; @@ -1874,20 +1560,34 @@ static ssize_t iommu_debug_config_clocks_write(struct file *file, return -EFAULT; } + mutex_lock(&ddev->clk_lock); switch (buf) { case '0': + if (ddev->clk_count == 0) { + dev_err(dev, "Config clocks already disabled\n"); + break; + } + + if (--ddev->clk_count > 0) + break; + dev_err(dev, "Disabling config clocks\n"); iommu_disable_config_clocks(ddev->domain); break; case '1': + if (ddev->clk_count++ > 0) + break; + dev_err(dev, "Enabling config clocks\n"); if (iommu_enable_config_clocks(ddev->domain)) dev_err(dev, "Failed!\n"); break; default: dev_err(dev, "Invalid value. Should be 0 or 1.\n"); + mutex_unlock(&ddev->clk_lock); return -EINVAL; } + mutex_unlock(&ddev->clk_lock); return count; } @@ -1913,6 +1613,7 @@ static int snarf_iommu_devices(struct device *dev, const char *name) ddev = kzalloc(sizeof(*ddev), GFP_KERNEL); if (!ddev) return -ENODEV; + mutex_init(&ddev->clk_lock); ddev->dev = dev; dir = debugfs_create_dir(name, debugfs_tests_dir); if (!dir) { @@ -2024,6 +1725,9 @@ static int snarf_iommu_devices(struct device *dev, const char *name) static int pass_iommu_devices(struct device *dev, void *ignored) { + if (!of_device_is_compatible(dev->of_node, "iommu-debug-test")) + return 0; + if (!of_find_property(dev->of_node, "iommus", NULL)) return 0; @@ -2037,6 +1741,9 @@ static int iommu_debug_populate_devices(void) const char *cb_name; for_each_compatible_node(np, NULL, "qcom,msm-smmu-v2-ctx") { + if (!of_device_is_compatible(np, "iommu-debug-test")) + continue; + ret = of_property_read_string(np, "label", &cb_name); if (ret) return ret; @@ -2073,9 +1780,6 @@ static inline void iommu_debug_destroy_tests(void) { } static int iommu_debug_init(void) { - if (iommu_debug_init_tracking()) - return -ENODEV; - if (iommu_debug_init_tests()) return -ENODEV; @@ -2084,7 +1788,6 @@ static int iommu_debug_init(void) static void iommu_debug_exit(void) { - iommu_debug_destroy_tracking(); iommu_debug_destroy_tests(); } diff --git a/drivers/iommu/iommu-debug.h b/drivers/iommu/iommu-debug.h index 3dc87032f2a05..91c418d9e37fa 100644 --- a/drivers/iommu/iommu-debug.h +++ b/drivers/iommu/iommu-debug.h @@ -1,11 +1,21 @@ +/* Copyright (c) 2015-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. + */ + #ifndef IOMMU_DEBUG_H #define IOMMU_DEBUG_H #ifdef CONFIG_IOMMU_DEBUG_TRACKING void iommu_debug_attach_device(struct iommu_domain *domain, struct device *dev); -void iommu_debug_detach_device(struct iommu_domain *domain, struct device *dev); -void iommu_debug_domain_add(struct iommu_domain *domain); void iommu_debug_domain_remove(struct iommu_domain *domain); #else /* !CONFIG_IOMMU_DEBUG_TRACKING */ @@ -15,15 +25,6 @@ static inline void iommu_debug_attach_device(struct iommu_domain *domain, { } -static inline void iommu_debug_detach_device(struct iommu_domain *domain, - struct device *dev) -{ -} - -static inline void iommu_debug_domain_add(struct iommu_domain *domain) -{ -} - static inline void iommu_debug_domain_remove(struct iommu_domain *domain) { } diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c index 2ee174b74e2c3..3dd49d2de6760 100644 --- a/drivers/iommu/iommu.c +++ b/drivers/iommu/iommu.c @@ -977,8 +977,6 @@ struct iommu_domain *iommu_domain_alloc(struct bus_type *bus) if (ret) goto out_free; - iommu_debug_domain_add(domain); - return domain; out_free: @@ -1019,7 +1017,6 @@ void iommu_detach_device(struct iommu_domain *domain, struct device *dev) if (unlikely(domain->ops->detach_dev == NULL)) return; - iommu_debug_detach_device(domain, dev); domain->ops->detach_dev(domain, dev); trace_detach_device_from_domain(dev); } diff --git a/drivers/irqchip/msm_show_resume_irq.c b/drivers/irqchip/msm_show_resume_irq.c index 4a796207738fd..bdb76fd910e5c 100644 --- a/drivers/irqchip/msm_show_resume_irq.c +++ b/drivers/irqchip/msm_show_resume_irq.c @@ -15,7 +15,7 @@ #include #include -int msm_show_resume_irq_mask; +int msm_show_resume_irq_mask = 1; module_param_named( debug_mask, msm_show_resume_irq_mask, int, S_IRUGO | S_IWUSR | S_IWGRP diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig index 7e3e74ce82e34..1018fbcbbdccf 100644 --- a/drivers/leds/Kconfig +++ b/drivers/leds/Kconfig @@ -542,7 +542,23 @@ config LEDS_AW2013 This option enables support for the AW2013 RGB LED connected through I2C. Say Y to enable support for the AW2013 LED. +config DIFFERENT_TP_COLOR + tristate "TP support for different color" + help + This option enables support for different color. + +config COLOFUL_RGB_FOR_PROJECT + tristate "different colorful rgb_control for project" + help + This option enables colorful rgb_control for project. + comment "LED Triggers" source "drivers/leds/trigger/Kconfig" endif # NEW_LEDS + +config VIB_GPIO + tristate "LED support for LM3533" + help + This option enables support for the LEDs on National Semiconductor / + TI LM3533 Lighting Power chips diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile index c5178d9dbf19c..93ec56b84b6a8 100644 --- a/drivers/leds/Makefile +++ b/drivers/leds/Makefile @@ -60,9 +60,7 @@ obj-$(CONFIG_LEDS_SYSCON) += leds-syscon.o obj-$(CONFIG_LEDS_VERSATILE) += leds-versatile.o obj-$(CONFIG_LEDS_MENF21BMC) += leds-menf21bmc.o obj-$(CONFIG_LEDS_AW2013) += leds-aw2013.o - -# LED SPI Drivers +obj-$(CONFIG_VIB_GPIO) += gpio_vib.o obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o - -# LED Triggers +obj-y +=leds-msm-gpio-flash.o obj-$(CONFIG_LEDS_TRIGGERS) += trigger/ diff --git a/drivers/leds/gpio_vib.c b/drivers/leds/gpio_vib.c new file mode 100644 index 0000000000000..293d130d3c10d --- /dev/null +++ b/drivers/leds/gpio_vib.c @@ -0,0 +1,224 @@ +/* drivers/misc/timed_gpio.c + * + * Copyright (C) 2008 Google, Inc. + * Author: Mike Lockwood + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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 +#include +#include +#include +#include +#include +#include "../staging/android/timed_output.h" +#include "../staging/android/timed_gpio.h" +#include +#include +#define GPIO_VIB_NAME "gpio-vibrator" + +struct timed_gpio_data { + struct timed_output_dev dev; + struct hrtimer timer; + spinlock_t lock; + unsigned gpio; + int max_timeout; + u8 active_low; +}; +struct gpio_vib { + const char *name; + unsigned gpio; + int max_timeout; + unsigned active_low:1; +}; +static void delete_gpio_vib(struct timed_gpio_data *vib) +{ + if (!gpio_is_valid(vib->gpio)) + return; + timed_output_dev_unregister(&vib->dev); + gpio_free(vib->gpio); +} +static enum hrtimer_restart gpio_timer_func(struct hrtimer *timer) +{ + struct timed_gpio_data *data = + container_of(timer, struct timed_gpio_data, timer); + + gpio_direction_output(data->gpio, data->active_low ? 1 : 0); + return HRTIMER_NORESTART; +} + +static int gpio_get_time(struct timed_output_dev *dev) +{ + struct timed_gpio_data *data; + struct timeval t; + + data = container_of(dev, struct timed_gpio_data, dev); + + if (!hrtimer_active(&data->timer)) + return 0; + + t = ktime_to_timeval(hrtimer_get_remaining(&data->timer)); + + return t.tv_sec * 1000 + t.tv_usec / 1000; +} + +static void gpio_enable(struct timed_output_dev *dev, int value) +{ + struct timed_gpio_data *data = + container_of(dev, struct timed_gpio_data, dev); + unsigned long flags; + + spin_lock_irqsave(&data->lock, flags); + + /* cancel previous timer and set GPIO according to value */ + hrtimer_cancel(&data->timer); + gpio_direction_output(data->gpio, data->active_low ? !value : !!value); + + if (value > 0) { + if (value > data->max_timeout) + value = data->max_timeout; + printk("max_timeout is %d\n", data->max_timeout); + hrtimer_start(&data->timer, + ktime_set(value / 1000, (value % 1000) * 1000000), + HRTIMER_MODE_REL); + } + + spin_unlock_irqrestore(&data->lock, flags); +} +static int create_gpio_vib(const struct gpio_vib *template, + struct timed_gpio_data *gpio_dat, struct device *parent) +{ + int ret; + gpio_dat->gpio = template->gpio; + hrtimer_init(&gpio_dat->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); + gpio_dat->timer.function = gpio_timer_func; + spin_lock_init(&gpio_dat->lock); + gpio_dat->dev.name = template->name; + gpio_dat->dev.get_time = gpio_get_time; + gpio_dat->dev.enable = gpio_enable; + ret = gpio_request(gpio_dat->gpio, gpio_dat->dev.name); + if (ret < 0) + return 0; + ret = timed_output_dev_register(&gpio_dat->dev); + if (ret < 0) { + gpio_free(gpio_dat->gpio); + return 0; + } + gpio_dat->max_timeout = template->max_timeout; + gpio_dat->active_low = template->active_low; + gpio_direction_output(gpio_dat->gpio, gpio_dat->active_low); + return 0; +} +struct gpio_vibs_priv { + int num_vibs; + struct timed_gpio_data vibs[]; +}; + +static inline int sizeof_gpio_vibs_priv(int num_vibs) +{ + return sizeof(struct gpio_vibs_priv) + + (sizeof(struct timed_gpio_data) * num_vibs); +} + +#define DEFAULT_TIME_MAX_MS 50000 +static struct gpio_vibs_priv *gpio_vibs_create_of(struct platform_device *pdev) +{ + struct device_node *np = pdev->dev.of_node, *child; + int count, ret; + unsigned timerv; + struct gpio_vibs_priv *priv; + count = of_get_child_count(np); + if (!count) + return ERR_PTR(-ENODEV); + + for_each_child_of_node(np, child) + if (of_get_gpio(child, 0) == -EPROBE_DEFER) + return ERR_PTR(-EPROBE_DEFER); + + priv = devm_kzalloc(&pdev->dev, sizeof_gpio_vibs_priv(count), + GFP_KERNEL); + if (!priv) + return ERR_PTR(-ENOMEM); + + for_each_child_of_node(np, child) { + struct gpio_vib vib = {}; + enum of_gpio_flags flags; + vib.gpio = of_get_gpio_flags(child, 0, &flags); + vib.active_low = flags & OF_GPIO_ACTIVE_LOW; + vib.name = of_get_property(child, "label", NULL) ? : child->name; + ret = of_property_read_u32(child, "max_timeout", &timerv); + if (!ret) { + vib.max_timeout = timerv; + printk("wingtech vib.max_timeout = %d\n", vib.max_timeout); + } else{ + vib.max_timeout = DEFAULT_TIME_MAX_MS; + printk("wingtech vib.max_timeout used default = %d, ret=%d\n", vib.max_timeout, ret); + } + + ret = create_gpio_vib(&vib, &priv->vibs[priv->num_vibs++], + &pdev->dev); + if (ret < 0) { + of_node_put(child); + goto err; + } + } + return priv; + err: + for (count = priv->num_vibs - 2; count >= 0; count--) + delete_gpio_vib(&priv->vibs[count]); + return ERR_PTR(-ENODEV); +} + +static int timed_gpio_probe(struct platform_device *pdev) +{ + struct gpio_vibs_priv *priv; + priv = gpio_vibs_create_of(pdev); + if (IS_ERR(priv)) + return PTR_ERR(priv); + platform_set_drvdata(pdev, priv); + return 0; +} + +static int timed_gpio_remove(struct platform_device *pdev) +{ + struct timed_gpio_platform_data *pdata = pdev->dev.platform_data; + struct timed_gpio_data *gpio_data = platform_get_drvdata(pdev); + int i; + + for (i = 0; i < pdata->num_gpios; i++) { + timed_output_dev_unregister(&gpio_data[i].dev); + gpio_free(gpio_data[i].gpio); + } + + return 0; +} +static struct of_device_id vib_match_table[] = { + { .compatible = "gpio-vibrator", + }, + {} +}; +static struct platform_driver timed_gpio_driver = { + .probe = timed_gpio_probe, + .remove = timed_gpio_remove, + .driver = { + .name = GPIO_VIB_NAME, + .owner = THIS_MODULE, + .of_match_table = vib_match_table, + }, +}; + +module_platform_driver(timed_gpio_driver); + +MODULE_AUTHOR("Mike Lockwood "); +MODULE_DESCRIPTION("timed gpio driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c index e8b1120f486d6..b32cb63dc5c34 100644 --- a/drivers/leds/led-triggers.c +++ b/drivers/leds/led-triggers.c @@ -2,6 +2,7 @@ * LED Triggers Core * * Copyright 2005-2007 Openedhand Ltd. + * Copyright (C) 2018 XiaoMi, Inc. * * Author: Richard Purdie * @@ -305,6 +306,23 @@ void led_trigger_blink_oneshot(struct led_trigger *trig, } EXPORT_SYMBOL_GPL(led_trigger_blink_oneshot); +struct led_trigger *led_trigger_get(const char *name) +{ + struct led_trigger *_trig; + + down_write(&triggers_list_lock); + /* Make sure the trigger's name isn't already in use */ + list_for_each_entry(_trig, &trigger_list, next_trig) { + if (!strcmp(_trig->name, name)) { + up_write(&triggers_list_lock); + return _trig; + } + } + up_write(&triggers_list_lock); + return NULL; +} + + void led_trigger_register_simple(const char *name, struct led_trigger **tp) { struct led_trigger *trig; @@ -325,6 +343,9 @@ void led_trigger_register_simple(const char *name, struct led_trigger **tp) pr_warn("LED trigger %s failed to register (no memory)\n", name); } + if (!strcmp("switch_trigger", name) && trig == NULL) { + trig = led_trigger_get(name); + } *tp = trig; } EXPORT_SYMBOL_GPL(led_trigger_register_simple); diff --git a/drivers/leds/leds-aw2013.c b/drivers/leds/leds-aw2013.c index d0a39fab2821c..e30d8c983c5d8 100644 --- a/drivers/leds/leds-aw2013.c +++ b/drivers/leds/leds-aw2013.c @@ -1,656 +1,756 @@ -/* - * Copyright (c) 2015, 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 #include -#include -#include +#include +#include #include -#include #include +#include #include -#include - -/* register address */ -#define AW_REG_RESET 0x00 -#define AW_REG_GLOBAL_CONTROL 0x01 -#define AW_REG_LED_STATUS 0x02 -#define AW_REG_LED_ENABLE 0x30 -#define AW_REG_LED_CONFIG_BASE 0x31 -#define AW_REG_LED_BRIGHTNESS_BASE 0x34 -#define AW_REG_TIMESET0_BASE 0x37 -#define AW_REG_TIMESET1_BASE 0x38 - -/* register bits */ -#define AW2013_CHIPID 0x33 -#define AW_LED_MOUDLE_ENABLE_MASK 0x01 -#define AW_LED_FADE_OFF_MASK 0x40 -#define AW_LED_FADE_ON_MASK 0x20 -#define AW_LED_BREATHE_MODE_MASK 0x10 -#define AW_LED_RESET_MASK 0x55 - -#define AW_LED_RESET_DELAY 8 -#define AW2013_VDD_MIN_UV 2600000 -#define AW2013_VDD_MAX_UV 3300000 -#define AW2013_VI2C_MIN_UV 1800000 -#define AW2013_VI2C_MAX_UV 1800000 - -#define MAX_RISE_TIME_MS 7 -#define MAX_HOLD_TIME_MS 5 -#define MAX_FALL_TIME_MS 7 -#define MAX_OFF_TIME_MS 5 - -struct aw2013_led { - struct i2c_client *client; +#include +#include +#include + +#include + +enum led_colors{ + LED_RED = 0, + LED_GREEN, + LED_BLUE, + LED_WHITE, + LED_YELLOW, + LED_CYAN, + LED_PURPLE, + LED_COLORS_MAX +}; + +struct rgb_info{ +int blinking; +int brightness; +int on_time; +int off_time; +}; + +struct aw2013_led_data { struct led_classdev cdev; - struct aw2013_platform_data *pdata; - struct work_struct brightness_work; - struct mutex lock; - struct regulator *vdd; - struct regulator *vcc; + enum led_colors color; +}; + + +struct aw2013_leds_priv { int num_leds; - int id; - bool poweron; + struct aw2013_led_data leds[]; }; -static int aw2013_write(struct aw2013_led *led, u8 reg, u8 val) +struct aw2013_dev_data { + struct i2c_client *i2c; + struct regulator *regulator; + struct aw2013_leds_priv *leds_priv; + struct rgb_info leds[LED_COLORS_MAX]; + enum led_colors current_color; + struct mutex led_lock; + struct work_struct set_color_work; +}; + + +struct aw2013_led{ + const char *name; + const char *default_trigger; + unsigned retain_state_suspended:1; + unsigned default_state:2; + +}; + +static inline int sizeof_aw2013_leds_priv(int num_leds) { - return i2c_smbus_write_byte_data(led->client, reg, val); + return sizeof(struct aw2013_leds_priv) + + (sizeof(struct aw2013_led_data) * num_leds); } -static int aw2013_read(struct aw2013_led *led, u8 reg, u8 *val) + + +static struct aw2013_dev_data *s_aw2013; +bool blink_frequency_adjust; + +#define AW2013_I2C_NAME "aw2013" +#if 1 + +#define AW2013_RSTR 0x0 +#define AW2013_GCR 0x01 +#define AW2013_STATUS 0x02 +#define AW2013_LEDE 0x30 +#define AW2013_LCFG0 0x31 +#define AW2013_LCFG1 0x32 +#define AW2013_LCFG2 0x33 +#define AW2013_PWM0 0x34 +#define AW2013_PWM1 0x35 +#define AW2013_PWM2 0x36 +#define AW2013_LED0_T0 0x37 +#define AW2013_LED0_T1 0x38 +#define AW2013_LED0_T2 0x39 +#define AW2013_LED1_T0 0x3A +#define AW2013_LED1_T1 0x3B +#define AW2013_LED1_T2 0x3C +#define AW2013_LED2_T0 0x3D +#define AW2013_LED2_T1 0x3E +#define AW2013_LED2_T2 0x3F +#define AW2013_ASR 0x77 + +#define Bre_Imax 0x72 +#define Rise_t 0x02 +#define Fall_t 0x02 +#define Hold_time 0x03 +#define Off_time 0x03 +#define Delay_time 0x00 +#define Period_Num 0x00 +#define Imax_R 0x62 +#define Imax_G 0x62 +#define Imax_B 0x62 + +#define MAX_BRIGHTNESS_RED 255 +#define MAX_BRIGHTNESS_GREEN 255 +#define MAX_BRIGHTNESS_BLUE 255 +u8 tp_color; + + +#if defined(CONFIG_DIFFERENT_TP_COLOR) + extern u8 tp_rgb_color; +#else + static u8 tp_rgb_color; +#endif + + +typedef unsigned char U8; +static int aw2013_debug_enable; +#define AW2013_DEBUG(format, args...) do { \ + if (aw2013_debug_enable) \ + {\ + printk(format, ##args);\ + } \ +} while (0) +struct i2c_client *aw2013_client; +static int aw2013_pdata; +struct i2c_board_info aw2013_info = { + .type = "aw2013", + .addr = 0x45, + .platform_data = &aw2013_pdata, + }; + + +static int aw2013_has_inited; + + + +#endif + +static int aw2013_i2c_write(unsigned char cmd, unsigned char data) { - s32 ret; + int ret; + ret = i2c_smbus_write_byte_data(s_aw2013->i2c, cmd, data); - ret = i2c_smbus_read_byte_data(led->client, reg); - if (ret < 0) - return ret; + return ret; +} - *val = ret; - return 0; +enum led_colors devname_to_color(const char *dev_name) +{ + if (!strcmp(dev_name, "red")) { + return LED_RED; + } else if (!strcmp(dev_name, "green")) { + return LED_GREEN; + } else if (!strcmp(dev_name, "blue")) { + return LED_BLUE; + } else if (!strcmp(dev_name, "white")) { + return LED_WHITE; + } else if (!strcmp(dev_name, "yellow")) { + return LED_YELLOW; + } else if (!strcmp(dev_name, "cyan")) { + return LED_CYAN; + } else if (!strcmp(dev_name, "purple")) { + return LED_PURPLE; + } + + return LED_COLORS_MAX; } -static int aw2013_power_on(struct aw2013_led *led, bool on) +int aw2013_set_color_singlecolor(struct aw2013_dev_data *aw2013, enum led_colors color) { - int rc; - - if (on) { - rc = regulator_enable(led->vdd); - if (rc) { - dev_err(&led->client->dev, - "Regulator vdd enable failed rc=%d\n", rc); - return rc; + unsigned char red_on = 0, green_on = 0, blue_on = 0; + unsigned char blink_flag = 0; + + switch (color) { + case LED_RED: + red_on = 1; + aw2013->leds[LED_GREEN].brightness = 0; + aw2013->leds[LED_BLUE].brightness = 0; + if (aw2013->leds[LED_RED].brightness == 0) { + red_on = 0; + } + if (aw2013->leds[LED_RED].blinking) { + blink_flag = 0x10; + aw2013_i2c_write(0x0, 0x54); + } else + blink_flag = 0x0; + break; + case LED_GREEN: + green_on = 1; + aw2013->leds[LED_RED].brightness = 0; + aw2013->leds[LED_BLUE].brightness = 0; + if (aw2013->leds[LED_GREEN].brightness == 0) { + green_on = 0; + } + if (aw2013->leds[LED_GREEN].blinking) { + blink_flag = 0x10; + aw2013_i2c_write(0x0, 0x54); + } else + blink_flag = 0x0; + break; + case LED_BLUE: + blue_on = 1; + aw2013->leds[LED_RED].brightness = 0; + aw2013->leds[LED_GREEN].brightness = 0; + if (aw2013->leds[LED_BLUE].brightness == 0) { + blue_on = 0; + } + if (aw2013->leds[LED_BLUE].blinking) { + blink_flag = 0x10; + aw2013_i2c_write(0x0, 0x54); + } else + blink_flag = 0x0; + break; + default: + goto rgb_exit; + } + if (red_on || green_on || blue_on) { + if (0 == aw2013_has_inited) { + aw2013_i2c_write(0x0, 0x55); + aw2013_i2c_write(0x01, 0x1); + mdelay(1); + aw2013_has_inited = 1; } - rc = regulator_enable(led->vcc); - if (rc) { - dev_err(&led->client->dev, - "Regulator vcc enable failed rc=%d\n", rc); - goto fail_enable_reg; + aw2013_i2c_write(0x01, 0xe1); +#if defined(CONFIG_COLOFUL_RGB_FOR_PROJECT) + switch (tp_rgb_color) { + case 0x32: + aw2013_i2c_write(0x31, blink_flag|0x62); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, aw2013->leds[LED_RED].brightness); + aw2013_i2c_write(0x35, aw2013->leds[LED_GREEN].brightness); + aw2013_i2c_write(0x36, aw2013->leds[LED_BLUE].brightness); + break; + default: + aw2013_i2c_write(0x31, blink_flag|0x61); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, aw2013->leds[LED_RED].brightness); + aw2013_i2c_write(0x35, aw2013->leds[LED_GREEN].brightness); + aw2013_i2c_write(0x36, aw2013->leds[LED_BLUE].brightness); + break; } - led->poweron = true; - } else { - rc = regulator_disable(led->vdd); - if (rc) { - dev_err(&led->client->dev, - "Regulator vdd disable failed rc=%d\n", rc); - return rc; +#else + switch (tp_rgb_color) { + case 0x32: + aw2013_i2c_write(0x31, blink_flag|0x62); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + break; + default: + aw2013_i2c_write(0x31, blink_flag|0x61); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + break; } +#endif + + if (blink_frequency_adjust) { + aw2013_i2c_write(0x37, Rise_t<<4 | blink_flag); + aw2013_i2c_write(0x38, Fall_t<<4 | blink_flag); + aw2013_i2c_write(0x39, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3a, Rise_t<<4 | blink_flag); + aw2013_i2c_write(0x3b, Fall_t<<4 | blink_flag); + aw2013_i2c_write(0x3c, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3d, Rise_t<<4 | blink_flag); + aw2013_i2c_write(0x3e, Fall_t<<4 | blink_flag); + aw2013_i2c_write(0x3f, Delay_time<<4 | Period_Num); + } else { + aw2013_i2c_write(0x37, Rise_t<<4 | Hold_time); + aw2013_i2c_write(0x38, Fall_t<<4 | Off_time); + aw2013_i2c_write(0x39, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3a, Rise_t<<4 | Hold_time); + aw2013_i2c_write(0x3b, Fall_t<<4 | Off_time); + aw2013_i2c_write(0x3c, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3d, Rise_t<<4 | Hold_time); + aw2013_i2c_write(0x3e, Fall_t<<4 | Off_time); + aw2013_i2c_write(0x3f, Delay_time<<4 | Period_Num); + } + aw2013_i2c_write(0x30, 0x7); + mdelay(1); + } else{ + aw2013_i2c_write(0x01, 0); + mdelay(1); + aw2013_i2c_write(0x30, 0); + aw2013_i2c_write(0x34, 0); + aw2013_i2c_write(0x35, 0); + aw2013_i2c_write(0x36, 0); + mdelay(1); + aw2013_has_inited = 0; + } +rgb_exit: + return 0; - rc = regulator_disable(led->vcc); - if (rc) { - dev_err(&led->client->dev, - "Regulator vcc disable failed rc=%d\n", rc); - goto fail_disable_reg; +} + + +int aw2013_set_color_multicolor(struct aw2013_dev_data *aw2013, enum led_colors color) +{ + unsigned char blink_flag = 0; + + if (aw2013->leds[color].brightness) { + if (aw2013->leds[color].blinking) + blink_flag = 0x10; + aw2013_i2c_write(0x01, 0); + aw2013_i2c_write(0x0, 0x55); + mdelay(1); + if (0 == aw2013_has_inited) { + aw2013_has_inited = 1; } - led->poweron = false; + aw2013_i2c_write(0x01, 0x1); +#if defined(CONFIG_COLOFUL_RGB_FOR_PROJECT) + switch (color) { + case LED_WHITE: + aw2013_i2c_write(0x0, 0x54); + aw2013_i2c_write(0x01, 0xe1); + if (0x32 == tp_rgb_color) + aw2013_i2c_write(0x31, blink_flag|0x62); + else + aw2013_i2c_write(0x31, blink_flag|0x61); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + aw2013_i2c_write(0x30, 0x7); + break; + case LED_YELLOW: + + aw2013_i2c_write(0x0, 0x54); + aw2013_i2c_write(0x01, 0xe1); + aw2013_i2c_write(0x31, blink_flag|0x62); + aw2013_i2c_write(0x32, blink_flag|0x62); + aw2013_i2c_write(0x33, 0); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, 0); + aw2013_i2c_write(0x30, 0x3); + break; + case LED_PURPLE: + + aw2013_i2c_write(0x0, 0x54); + aw2013_i2c_write(0x01, 0xe1); + aw2013_i2c_write(0x31, blink_flag|0x62); + aw2013_i2c_write(0x32, 0); + aw2013_i2c_write(0x33, blink_flag|0x62); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, 0); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + aw2013_i2c_write(0x30, 0x5); + + break; + case LED_CYAN: + + aw2013_i2c_write(0x0, 0x54); + aw2013_i2c_write(0x01, 0xe1); + aw2013_i2c_write(0x31, 0); + aw2013_i2c_write(0x32, blink_flag|0x62); + aw2013_i2c_write(0x33, blink_flag|0x62); + aw2013_i2c_write(0x34, 0); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + aw2013_i2c_write(0x30, 0x6); + + break; + default: + break; + } +#else + switch (tp_rgb_color) { + case 0x32: + aw2013_i2c_write(0x31, blink_flag|0x62); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + break; + default: + aw2013_i2c_write(0x31, blink_flag|0x61); + aw2013_i2c_write(0x32, blink_flag|0x61); + aw2013_i2c_write(0x33, blink_flag|0x61); + aw2013_i2c_write(0x34, MAX_BRIGHTNESS_RED); + aw2013_i2c_write(0x35, MAX_BRIGHTNESS_GREEN); + aw2013_i2c_write(0x36, MAX_BRIGHTNESS_BLUE); + break; + } + aw2013_i2c_write(0x30, 0x7); +#endif + aw2013_i2c_write(0x37, Rise_t<<4 | Hold_time); + aw2013_i2c_write(0x3a, Rise_t<<4 | Hold_time); + aw2013_i2c_write(0x3d, Rise_t<<4 | Hold_time); + + aw2013_i2c_write(0x38, Fall_t<<4 | Off_time); + aw2013_i2c_write(0x3b, Fall_t<<4 | Off_time); + aw2013_i2c_write(0x3e, Fall_t<<4 | Off_time); + + aw2013_i2c_write(0x39, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3c, Delay_time<<4 | Period_Num); + aw2013_i2c_write(0x3f, Delay_time<<4 | Period_Num); + } else { + aw2013_i2c_write(0x01, 0); + mdelay(1); + aw2013_i2c_write(0x30, 0); + aw2013_i2c_write(0x34, 0); + aw2013_i2c_write(0x35, 0); + aw2013_i2c_write(0x36, 0); + mdelay(1); + aw2013_has_inited = 0; } - return rc; + return 0; +} -fail_enable_reg: - rc = regulator_disable(led->vdd); - if (rc) - dev_err(&led->client->dev, - "Regulator vdd disable failed rc=%d\n", rc); - return rc; +static void set_color_delayed(struct work_struct *ws) +{ + enum led_colors color; + struct aw2013_dev_data *aw2013 = + container_of(ws, struct aw2013_dev_data, set_color_work); -fail_disable_reg: - rc = regulator_enable(led->vdd); - if (rc) - dev_err(&led->client->dev, - "Regulator vdd enable failed rc=%d\n", rc); + mutex_lock(&s_aw2013->led_lock); + color = aw2013->current_color; + AW2013_DEBUG("aw2013 set_color_delayed color = %d, brightness = %d, blink = %d \n", color, aw2013->leds[color].brightness, aw2013->leds[color].blinking); - return rc; + if (color == LED_RED || color == LED_GREEN || color == LED_BLUE) { + aw2013_set_color_singlecolor(aw2013, color); + } else { + aw2013_set_color_multicolor(aw2013, color); + } + mutex_unlock(&s_aw2013->led_lock); } -static int aw2013_power_init(struct aw2013_led *led, bool on) + + +int aw2013_set_color(struct aw2013_dev_data *aw2013, enum led_colors color) { - int rc; - - if (on) { - led->vdd = regulator_get(&led->client->dev, "vdd"); - if (IS_ERR(led->vdd)) { - rc = PTR_ERR(led->vdd); - dev_err(&led->client->dev, - "Regulator get failed vdd rc=%d\n", rc); - return rc; - } - if (regulator_count_voltages(led->vdd) > 0) { - rc = regulator_set_voltage(led->vdd, AW2013_VDD_MIN_UV, - AW2013_VDD_MAX_UV); - if (rc) { - dev_err(&led->client->dev, - "Regulator set_vtg failed vdd rc=%d\n", - rc); - goto reg_vdd_put; - } - } + aw2013->current_color = color; + schedule_work(&s_aw2013->set_color_work); - led->vcc = regulator_get(&led->client->dev, "vcc"); - if (IS_ERR(led->vcc)) { - rc = PTR_ERR(led->vcc); - dev_err(&led->client->dev, - "Regulator get failed vcc rc=%d\n", rc); - goto reg_vdd_set_vtg; - } + return 0; - if (regulator_count_voltages(led->vcc) > 0) { - rc = regulator_set_voltage(led->vcc, AW2013_VI2C_MIN_UV, - AW2013_VI2C_MAX_UV); - if (rc) { - dev_err(&led->client->dev, - "Regulator set_vtg failed vcc rc=%d\n", rc); - goto reg_vcc_put; - } - } - } else { - if (regulator_count_voltages(led->vdd) > 0) - regulator_set_voltage(led->vdd, 0, AW2013_VDD_MAX_UV); +} - regulator_put(led->vdd); +static void aw2013_led_set(struct led_classdev *led_cdev, + enum led_brightness value) +{ + enum led_colors color; + color = devname_to_color(led_cdev->name); + s_aw2013->leds[color].brightness = value; + s_aw2013->leds[color].blinking = 0; + aw2013_set_color(s_aw2013, color); +} - if (regulator_count_voltages(led->vcc) > 0) - regulator_set_voltage(led->vcc, 0, AW2013_VI2C_MAX_UV); +static int aw2013_led_blink_set(struct led_classdev *led_cdev, + unsigned long *delay_on, unsigned long *delay_off) +{ + enum led_colors color; - regulator_put(led->vcc); - } - return 0; + color = devname_to_color(led_cdev->name); + s_aw2013->leds[color].blinking = 1; + s_aw2013->leds[color].brightness = 255; + s_aw2013->leds[color].on_time = *delay_on; + s_aw2013->leds[color].off_time = *delay_off; -reg_vcc_put: - regulator_put(led->vcc); -reg_vdd_set_vtg: - if (regulator_count_voltages(led->vdd) > 0) - regulator_set_voltage(led->vdd, 0, AW2013_VDD_MAX_UV); -reg_vdd_put: - regulator_put(led->vdd); - return rc; + led_cdev->brightness = s_aw2013->leds[color].brightness; + aw2013_set_color(s_aw2013, color); + + return 0; } -static void aw2013_brightness_work(struct work_struct *work) + +static int aw2013_i2c_check_device( + struct i2c_client *client) { - struct aw2013_led *led = container_of(work, struct aw2013_led, - brightness_work); - u8 val; - - mutex_lock(&led->pdata->led->lock); - - /* enable regulators if they are disabled */ - if (!led->pdata->led->poweron) { - if (aw2013_power_on(led->pdata->led, true)) { - dev_err(&led->pdata->led->client->dev, "power on failed"); - mutex_unlock(&led->pdata->led->lock); - return; - } + int err; + int retreive_count = 0; + while (retreive_count++ < 5) { + msleep(10); + err = aw2013_i2c_write(AW2013_RSTR, 0x55); + if (err == 0) + break; } - if (led->cdev.brightness > 0) { - if (led->cdev.brightness > led->cdev.max_brightness) - led->cdev.brightness = led->cdev.max_brightness; - aw2013_write(led, AW_REG_GLOBAL_CONTROL, - AW_LED_MOUDLE_ENABLE_MASK); - aw2013_write(led, AW_REG_LED_CONFIG_BASE + led->id, - led->pdata->max_current); - aw2013_write(led, AW_REG_LED_BRIGHTNESS_BASE + led->id, - led->cdev.brightness); - aw2013_read(led, AW_REG_LED_ENABLE, &val); - aw2013_write(led, AW_REG_LED_ENABLE, val | (1 << led->id)); - } else { - aw2013_read(led, AW_REG_LED_ENABLE, &val); - aw2013_write(led, AW_REG_LED_ENABLE, val & (~(1 << led->id))); - } - aw2013_read(led, AW_REG_LED_ENABLE, &val); - /* - * If value in AW_REG_LED_ENABLE is 0, it means the RGB leds are - * all off. So we need to power it off. - */ - if (val == 0) { - if (aw2013_power_on(led->pdata->led, false)) { - dev_err(&led->pdata->led->client->dev, - "power off failed"); - mutex_unlock(&led->pdata->led->lock); - return; - } - } - mutex_unlock(&led->pdata->led->lock); + return err; } -static void aw2013_led_blink_set(struct aw2013_led *led, unsigned long blinking) +static int aw2013_power_up(struct aw2013_dev_data *pdata, struct i2c_client *client, bool enable) { - u8 val; - - /* enable regulators if they are disabled */ - if (!led->pdata->led->poweron) { - if (aw2013_power_on(led->pdata->led, true)) { - dev_err(&led->pdata->led->client->dev, "power on failed"); - return; - } + int err = -1; + + pdata->regulator = devm_regulator_get(&client->dev, "rgb_led"); + if (IS_ERR(pdata->regulator)) { + dev_err(&client->dev, "regulator get failed\n"); + err = PTR_ERR(pdata->regulator); + pdata->regulator = NULL; + return err; } - led->cdev.brightness = blinking ? led->cdev.max_brightness : 0; - - if (blinking > 0) { - aw2013_write(led, AW_REG_GLOBAL_CONTROL, - AW_LED_MOUDLE_ENABLE_MASK); - aw2013_write(led, AW_REG_LED_CONFIG_BASE + led->id, - AW_LED_FADE_OFF_MASK | AW_LED_FADE_ON_MASK | - AW_LED_BREATHE_MODE_MASK | led->pdata->max_current); - aw2013_write(led, AW_REG_LED_BRIGHTNESS_BASE + led->id, - led->cdev.brightness); - aw2013_write(led, AW_REG_TIMESET0_BASE + led->id * 3, - led->pdata->rise_time_ms << 4 | - led->pdata->hold_time_ms); - aw2013_write(led, AW_REG_TIMESET1_BASE + led->id * 3, - led->pdata->fall_time_ms << 4 | - led->pdata->off_time_ms); - aw2013_read(led, AW_REG_LED_ENABLE, &val); - aw2013_write(led, AW_REG_LED_ENABLE, val | (1 << led->id)); + if (enable) { + + err = regulator_enable(pdata->regulator); + msleep(100); } else { - aw2013_read(led, AW_REG_LED_ENABLE, &val); - aw2013_write(led, AW_REG_LED_ENABLE, val & (~(1 << led->id))); + err = regulator_disable(pdata->regulator); } - aw2013_read(led, AW_REG_LED_ENABLE, &val); - /* - * If value in AW_REG_LED_ENABLE is 0, it means the RGB leds are - * all off. So we need to power it off. - */ - if (val == 0) { - if (aw2013_power_on(led->pdata->led, false)) { - dev_err(&led->pdata->led->client->dev, - "power off failed"); - return; - } - } + return err; } -static void aw2013_set_brightness(struct led_classdev *cdev, - enum led_brightness brightness) -{ - struct aw2013_led *led = container_of(cdev, struct aw2013_led, cdev); - led->cdev.brightness = brightness; - schedule_work(&led->brightness_work); +static ssize_t blink_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct led_classdev *led_cdev = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", led_cdev->brightness); } -static ssize_t aw2013_store_blink(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) + +static ssize_t blink_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) { unsigned long blinking; struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct aw2013_led *led = - container_of(led_cdev, struct aw2013_led, cdev); ssize_t ret = -EINVAL; + enum led_colors color; ret = kstrtoul(buf, 10, &blinking); if (ret) return ret; - mutex_lock(&led->pdata->led->lock); - aw2013_led_blink_set(led, blinking); - mutex_unlock(&led->pdata->led->lock); - return len; -} + color = devname_to_color(led_cdev->name); + led_cdev->brightness = + s_aw2013->leds[color].brightness = blinking ? 255 : 0; + s_aw2013->leds[color].blinking = blinking; -static ssize_t aw2013_led_time_show(struct device *dev, - struct device_attribute *attr, char *buf) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct aw2013_led *led = - container_of(led_cdev, struct aw2013_led, cdev); + led_cdev->brightness = s_aw2013->leds[color].brightness; - return snprintf(buf, PAGE_SIZE, "%d %d %d %d\n", - led->pdata->rise_time_ms, led->pdata->hold_time_ms, - led->pdata->fall_time_ms, led->pdata->off_time_ms); -} + aw2013_set_color(s_aw2013, color); -static ssize_t aw2013_led_time_store(struct device *dev, - struct device_attribute *attr, - const char *buf, size_t len) -{ - struct led_classdev *led_cdev = dev_get_drvdata(dev); - struct aw2013_led *led = - container_of(led_cdev, struct aw2013_led, cdev); - int rc, rise_time_ms, hold_time_ms, fall_time_ms, off_time_ms; - - rc = sscanf(buf, "%d %d %d %d", - &rise_time_ms, &hold_time_ms, - &fall_time_ms, &off_time_ms); - - mutex_lock(&led->pdata->led->lock); - led->pdata->rise_time_ms = (rise_time_ms > MAX_RISE_TIME_MS) ? - MAX_RISE_TIME_MS : rise_time_ms; - led->pdata->hold_time_ms = (hold_time_ms > MAX_HOLD_TIME_MS) ? - MAX_HOLD_TIME_MS : hold_time_ms; - led->pdata->fall_time_ms = (fall_time_ms > MAX_FALL_TIME_MS) ? - MAX_FALL_TIME_MS : fall_time_ms; - led->pdata->off_time_ms = (off_time_ms > MAX_OFF_TIME_MS) ? - MAX_OFF_TIME_MS : off_time_ms; - aw2013_led_blink_set(led, 1); - mutex_unlock(&led->pdata->led->lock); - return len; + return count; } +static DEVICE_ATTR(blink, 0664, blink_show, blink_store); -static DEVICE_ATTR(blink, 0664, NULL, aw2013_store_blink); -static DEVICE_ATTR(led_time, 0664, aw2013_led_time_show, aw2013_led_time_store); -static struct attribute *aw2013_led_attributes[] = { - &dev_attr_blink.attr, - &dev_attr_led_time.attr, - NULL, -}; - -static struct attribute_group aw2013_led_attr_group = { - .attrs = aw2013_led_attributes -}; - -static int aw_2013_check_chipid(struct aw2013_led *led) +static int create_aw2013_led(const struct aw2013_led *template, + struct aw2013_led_data *led_dat, struct device *parent, + int (*blink_set)(unsigned, int, unsigned long *, unsigned long *)) { - u8 val; - - aw2013_write(led, AW_REG_RESET, AW_LED_RESET_MASK); - usleep(AW_LED_RESET_DELAY); - aw2013_read(led, AW_REG_RESET, &val); - if (val == AW2013_CHIPID) - return 0; - else - return -EINVAL; -} + int ret; -static int aw2013_led_err_handle(struct aw2013_led *led_array, - int parsed_leds) -{ - int i; - /* - * If probe fails, cannot free resource of all LEDs, only free - * resources of LEDs which have allocated these resource really. - */ - for (i = 0; i < parsed_leds; i++) { - sysfs_remove_group(&led_array[i].cdev.dev->kobj, - &aw2013_led_attr_group); - led_classdev_unregister(&led_array[i].cdev); - cancel_work_sync(&led_array[i].brightness_work); - devm_kfree(&led_array->client->dev, led_array[i].pdata); - led_array[i].pdata = NULL; - } - return i; -} - -static int aw2013_led_parse_child_node(struct aw2013_led *led_array, - struct device_node *node) -{ - struct aw2013_led *led; - struct device_node *temp; - struct aw2013_platform_data *pdata; - int rc = 0, parsed_leds = 0; - - for_each_child_of_node(node, temp) { - led = &led_array[parsed_leds]; - led->client = led_array->client; - - pdata = devm_kzalloc(&led->client->dev, - sizeof(struct aw2013_platform_data), - GFP_KERNEL); - if (!pdata) { - dev_err(&led->client->dev, - "Failed to allocate memory\n"); - goto free_err; - } - pdata->led = led_array; - led->pdata = pdata; - - rc = of_property_read_string(temp, "aw2013,name", - &led->cdev.name); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading led name, rc = %d\n", rc); - goto free_pdata; - } + led_dat->cdev.name = template->name; + led_dat->cdev.default_trigger = template->default_trigger; + led_dat->color = devname_to_color(template->name); + led_dat->cdev.brightness = 0; + if (!template->retain_state_suspended) + led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; - rc = of_property_read_u32(temp, "aw2013,id", - &led->id); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading id, rc = %d\n", rc); - goto free_pdata; - } + led_dat->cdev.blink_set = aw2013_led_blink_set; + led_dat->cdev.brightness_set = aw2013_led_set; - rc = of_property_read_u32(temp, "aw2013,max-brightness", - &led->cdev.max_brightness); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading max-brightness, rc = %d\n", - rc); - goto free_pdata; - } + ret = led_classdev_register(parent, &led_dat->cdev); - rc = of_property_read_u32(temp, "aw2013,max-current", - &led->pdata->max_current); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading max-current, rc = %d\n", rc); - goto free_pdata; - } + device_create_file(led_dat->cdev.dev, &dev_attr_blink); - rc = of_property_read_u32(temp, "aw2013,rise-time-ms", - &led->pdata->rise_time_ms); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading rise-time-ms, rc = %d\n", rc); - goto free_pdata; - } + if (ret < 0) + return ret; - rc = of_property_read_u32(temp, "aw2013,hold-time-ms", - &led->pdata->hold_time_ms); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading hold-time-ms, rc = %d\n", rc); - goto free_pdata; - } + return 0; +} - rc = of_property_read_u32(temp, "aw2013,fall-time-ms", - &led->pdata->fall_time_ms); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading fall-time-ms, rc = %d\n", rc); - goto free_pdata; - } +static void delete_aw2013_led(struct aw2013_led_data *led) +{ + device_remove_file(led->cdev.dev, &dev_attr_blink); + led_classdev_unregister(&led->cdev); +} - rc = of_property_read_u32(temp, "aw2013,off-time-ms", - &led->pdata->off_time_ms); - if (rc < 0) { - dev_err(&led->client->dev, - "Failure reading off-time-ms, rc = %d\n", rc); - goto free_pdata; +static struct aw2013_leds_priv *aw2013_leds_create_of(struct i2c_client *client) +{ + struct device_node *np = client->dev.of_node; + struct device_node *child; + struct aw2013_leds_priv *priv; + int count, ret; + + /* count LEDs in this device, so we know how much to allocate */ + count = of_get_child_count(np); + if (!count) + return ERR_PTR(-ENODEV); + + priv = devm_kzalloc(&client->dev, sizeof_aw2013_leds_priv(count), + GFP_KERNEL); + if (!priv) + return ERR_PTR(-ENOMEM); + + for_each_child_of_node(np, child) { + struct aw2013_led led = {}; + + led.name = of_get_property(child, "label", NULL) ? : child->name; + led.default_trigger = + of_get_property(child, "linux,default-trigger", NULL); + led.retain_state_suspended = + (unsigned)of_property_read_bool(child, + "retain-state-suspended"); + + ret = create_aw2013_led(&led, &priv->leds[priv->num_leds++], + &client->dev, NULL); + if (ret < 0) { + of_node_put(child); + goto err; } + } - INIT_WORK(&led->brightness_work, aw2013_brightness_work); + return priv; - led->cdev.brightness_set = aw2013_set_brightness; +err: + for (count = priv->num_leds - 2; count >= 0; count--) + delete_aw2013_led(&priv->leds[count]); - rc = led_classdev_register(&led->client->dev, &led->cdev); - if (rc) { - dev_err(&led->client->dev, - "unable to register led %d,rc=%d\n", - led->id, rc); - goto free_pdata; - } + devm_kfree(&client->dev, priv); - rc = sysfs_create_group(&led->cdev.dev->kobj, - &aw2013_led_attr_group); - if (rc) { - dev_err(&led->client->dev, "led sysfs rc: %d\n", rc); - goto free_class; - } - parsed_leds++; - } - - return 0; - -free_class: - aw2013_led_err_handle(led_array, parsed_leds); - led_classdev_unregister(&led_array[parsed_leds].cdev); - cancel_work_sync(&led_array[parsed_leds].brightness_work); - devm_kfree(&led->client->dev, led_array[parsed_leds].pdata); - led_array[parsed_leds].pdata = NULL; - return rc; - -free_pdata: - aw2013_led_err_handle(led_array, parsed_leds); - devm_kfree(&led->client->dev, led_array[parsed_leds].pdata); - return rc; - -free_err: - aw2013_led_err_handle(led_array, parsed_leds); - return rc; + return ERR_PTR(-ENODEV); } -static int aw2013_led_probe(struct i2c_client *client, - const struct i2c_device_id *id) -{ - struct aw2013_led *led_array; - struct device_node *node; - int ret, num_leds = 0; - node = client->dev.of_node; - if (node == NULL) - return -EINVAL; +static int aw2013_led_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ - num_leds = of_get_child_count(node); + int err = 0; + struct aw2013_leds_priv *priv; + printk("aw2013_led_probe start\n"); + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, + "%s: check_functionality failed.", __func__); + err = -ENODEV; + goto exit0; + } - if (!num_leds) - return -EINVAL; + /* Allocate memory for driver data */ + s_aw2013 = kzalloc(sizeof(struct aw2013_dev_data), GFP_KERNEL); + if (!s_aw2013) { + dev_err(&client->dev, + "%s: memory allocation failed.", __func__); + err = -ENOMEM; + goto exit1; + } - led_array = devm_kzalloc(&client->dev, - (sizeof(struct aw2013_led) * num_leds), GFP_KERNEL); - if (!led_array) - return -ENOMEM; + /***** I2C initialization *****/ + s_aw2013->i2c = client; + /* set client data */ + i2c_set_clientdata(client, s_aw2013); - led_array->client = client; - led_array->num_leds = num_leds; + mutex_init(&s_aw2013->led_lock); - mutex_init(&led_array->lock); + INIT_WORK(&s_aw2013->set_color_work, set_color_delayed); - ret = aw_2013_check_chipid(led_array); - if (ret) { - dev_err(&client->dev, "Check chip id error\n"); - goto free_led_arry; + if (0 != aw2013_power_up(s_aw2013, client, true)) { + goto exit2; } - - ret = aw2013_led_parse_child_node(led_array, node); - if (ret) { - dev_err(&client->dev, "parsed node error\n"); - goto free_led_arry; + if (0 != aw2013_i2c_check_device(client)) { + dev_err(&client->dev, + "%s: aw2013_i2c_check_device failed.", __func__); + goto exit2; } - i2c_set_clientdata(client, led_array); + blink_frequency_adjust = of_property_read_bool(client->dev.of_node, "blink-frequency-adjustable"); - ret = aw2013_power_init(led_array, true); - if (ret) { - dev_err(&client->dev, "power init failed"); - goto fail_parsed_node; - } + priv = aw2013_leds_create_of(client); + + if (IS_ERR(priv)) + goto exit3; + + s_aw2013->leds_priv = priv; return 0; -fail_parsed_node: - aw2013_led_err_handle(led_array, num_leds); -free_led_arry: - mutex_destroy(&led_array->lock); - devm_kfree(&client->dev, led_array); - led_array = NULL; - return ret; +exit3: +exit2: + kfree(s_aw2013); +exit1: +exit0: + return err; } static int aw2013_led_remove(struct i2c_client *client) { - struct aw2013_led *led_array = i2c_get_clientdata(client); - int i, parsed_leds = led_array->num_leds; - - for (i = 0; i < parsed_leds; i++) { - sysfs_remove_group(&led_array[i].cdev.dev->kobj, - &aw2013_led_attr_group); - led_classdev_unregister(&led_array[i].cdev); - cancel_work_sync(&led_array[i].brightness_work); - devm_kfree(&client->dev, led_array[i].pdata); - led_array[i].pdata = NULL; - } - mutex_destroy(&led_array->lock); - devm_kfree(&client->dev, led_array); - led_array = NULL; + int count = 0; + struct aw2013_dev_data *aw2013 = i2c_get_clientdata(client); + + for (count = aw2013->leds_priv->num_leds - 2; count >= 0; count--) + delete_aw2013_led(&(aw2013->leds_priv->leds[count])); + + devm_kfree(&client->dev, aw2013->leds_priv); + + kfree(aw2013); + dev_info(&client->dev, "successfully removed."); return 0; } static const struct i2c_device_id aw2013_led_id[] = { - {"aw2013_led", 0}, - {}, + {AW2013_I2C_NAME, 0 }, + { } }; -MODULE_DEVICE_TABLE(i2c, aw2013_led_id); - -static struct of_device_id aw2013_match_table[] = { - { .compatible = "awinic,aw2013",}, +static struct of_device_id aw2013_led_match_table[] = { + { .compatible = "awinc,aw2013", }, { }, }; static struct i2c_driver aw2013_led_driver = { - .probe = aw2013_led_probe, - .remove = aw2013_led_remove, + .probe = aw2013_led_probe, + .remove = aw2013_led_remove, + .id_table = aw2013_led_id, .driver = { - .name = "aw2013_led", - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(aw2013_match_table), + .name = AW2013_I2C_NAME, + .owner = THIS_MODULE, + .of_match_table = aw2013_led_match_table, + }, - .id_table = aw2013_led_id, }; static int __init aw2013_led_init(void) { + pr_info("aw2013 led driver: initialize."); return i2c_add_driver(&aw2013_led_driver); } -module_init(aw2013_led_init); static void __exit aw2013_led_exit(void) { + pr_info("aw2013 led driver: release."); i2c_del_driver(&aw2013_led_driver); } + +subsys_initcall(aw2013_led_init); module_exit(aw2013_led_exit); -MODULE_DESCRIPTION("AWINIC aw2013 LED driver"); -MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("ming he "); +MODULE_DESCRIPTION("aw2013 driver"); +MODULE_LICENSE("GPL"); + + diff --git a/drivers/leds/leds-gpio.c b/drivers/leds/leds-gpio.c index b4518c8751c8d..a264998fb5c9c 100644 --- a/drivers/leds/leds-gpio.c +++ b/drivers/leds/leds-gpio.c @@ -2,25 +2,65 @@ * LEDs driver for GPIOs * * Copyright (C) 2007 8D Technologies inc. + * Copyright (C) 2018 XiaoMi, Inc. * Raphael Assenat * Copyright (C) 2008 Freescale Semiconductor, Inc. + * Copyright (C) 2018 XiaoMi, 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. * */ -#include -#include #include +#include +#include +#include +#include #include -#include -#include -#include #include -#include +#include #include #include +#include +#include +#include +#include +#include + +#define DUTY_CLCLE 50 +#define ADJUST_NUM 15 +#define JUSTTIMES 6 +#define JUST_DELAY 6 + +#define HRTIME_JUST_DELAY 9000 + + + +#ifndef USE_HRTIMER_SIMULATION +static s64 dealt; +#else +static s64 adjust_dealt; + +#endif + +static DEFINE_SPINLOCK(infrared_lock); +struct pm_qos_request infrared_qos_req; + + +struct gpio_ir_tx_packet { + struct completion done; + struct hrtimer timer; + unsigned int gpio_nr; + bool high_active; + u32 pulse; + u32 space; + unsigned int *buffer; + unsigned int length; + unsigned int next; + bool on; + bool abort; +}; struct gpio_led_data { struct led_classdev cdev; @@ -34,9 +74,16 @@ struct gpio_led_data { unsigned long *delay_on, unsigned long *delay_off); }; +struct mutex ir_lock; + + +#if defined (WT_USE_FAN54015) +extern int fan54015_getcharge_stat(void); +#endif + static void gpio_led_work(struct work_struct *work) { - struct gpio_led_data *led_dat = + struct gpio_led_data *led_dat = container_of(work, struct gpio_led_data, work); if (led_dat->blinking) { @@ -46,6 +93,7 @@ static void gpio_led_work(struct work_struct *work) led_dat->blinking = 0; } else gpio_set_value_cansleep(led_dat->gpio, led_dat->new_level); + printk("infr has been end"); } static void gpio_led_set(struct led_classdev *led_cdev, @@ -53,8 +101,8 @@ static void gpio_led_set(struct led_classdev *led_cdev, { struct gpio_led_data *led_dat = container_of(led_cdev, struct gpio_led_data, cdev); - int level; - + int level, ret = 0; + printk("infr has been start"); if (value == LED_OFF) level = 0; else @@ -76,7 +124,11 @@ static void gpio_led_set(struct led_classdev *led_cdev, NULL, NULL); led_dat->blinking = 0; } else - gpio_set_value(led_dat->gpio, level); + ret = gpio_direction_output(led_dat->gpio, level); + if (ret) { + printk("infrared unable to set dir for gpio [%d]\n", led_dat->gpio); + } + } } @@ -91,11 +143,291 @@ static int gpio_blink_set(struct led_classdev *led_cdev, delay_on, delay_off); } +static void gpio_ir_tx_set(struct gpio_ir_tx_packet *gpkt, bool on) +{ + if (gpkt->high_active) + gpio_set_value(gpkt->gpio_nr, on); + else + gpio_set_value(gpkt->gpio_nr, !on); +} + +#if defined(USE_HRTIMER_SIMULATION) +static s64 hrtime_adjust(struct gpio_ir_tx_packet *gpkt) +{ + s64 now; + int i; + unsigned long flags; + + spin_lock_irqsave(&infrared_lock, flags); + + now = ktime_to_ns(ktime_get()); + for (i = 0; i < ADJUST_NUM; i++) { + gpio_ir_tx_set(gpkt, false); + } + spin_unlock_irqrestore(&infrared_lock, flags); + + return (ktime_to_ns(ktime_get())-now)/ADJUST_NUM; +} + +static enum hrtimer_restart gpio_ir_tx_timer(struct hrtimer *timer) +{ + s64 delay_ns = 0, dealt_t = 0; + ktime_t start = ktime_get(); + + struct gpio_ir_tx_packet *gpkt = container_of(timer, struct gpio_ir_tx_packet, timer); + enum hrtimer_restart restart = HRTIMER_RESTART; + + if (!gpkt->abort && gpkt->next < gpkt->length) { + if (gpkt->next & 0x01) { /* space */ + gpio_ir_tx_set(gpkt, false); + + delay_ns = gpkt->buffer[gpkt->next++] * NSEC_PER_USEC; + } else if (!gpkt->pulse || !gpkt->space) { + gpio_ir_tx_set(gpkt, true); + + + delay_ns = gpkt->buffer[gpkt->next++] * NSEC_PER_USEC; + } else { /* pulse with soft carrier */ + + +#if 1 + unsigned int usecs; + + usecs = gpkt->on ? gpkt->pulse : gpkt->space; + usecs = min(usecs, gpkt->buffer[gpkt->next]); + + gpio_ir_tx_set(gpkt, gpkt->on); + + + + delay_ns = usecs * NSEC_PER_USEC; + + gpkt->buffer[gpkt->next] -= usecs; + gpkt->on = !gpkt->on; + + if (!gpkt->buffer[gpkt->next]) + gpkt->next++; +#endif + } + } else { + restart = HRTIMER_NORESTART; + gpio_ir_tx_set(gpkt, false); + complete(&gpkt->done); + } + + dealt_t = ktime_to_ns(ktime_sub(ktime_get(), start)) + adjust_dealt; + + if (delay_ns >= dealt_t) + delay_ns -= dealt_t; + + hrtimer_forward_now(&gpkt->timer, ns_to_ktime(delay_ns)); + + return restart; +} + +static int gpio_ir_tx_transmit_with_timer(struct gpio_ir_tx_packet *gpkt) +{ + int rc = 0, hrtimer = 0, i = 0; + + init_completion(&gpkt->done); + + adjust_dealt = hrtime_adjust(gpkt); + if (adjust_dealt > HRTIME_JUST_DELAY) { + for (i = 0; i < JUSTTIMES; i++) { + adjust_dealt = hrtime_adjust(gpkt); + } + printk("infrared time_adjust fail!! adjust_dealt=%lld\n", adjust_dealt); + if (adjust_dealt > HRTIME_JUST_DELAY) + adjust_dealt = HRTIME_JUST_DELAY; + } + + hrtimer_init(&gpkt->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_PINNED); + gpkt->timer.function = gpio_ir_tx_timer; + + + + + hrtimer = hrtimer_is_hres_active(&gpkt->timer); + + if (!hrtimer) { + printk("unable to use High-Resolution timer\n"); + } + + hrtimer_start(&gpkt->timer, ns_to_ktime(0), HRTIMER_MODE_REL_PINNED); + + rc = wait_for_completion_interruptible(&gpkt->done); + if (rc != 0) { /* signal exit immediately */ + gpkt->abort = true; + wait_for_completion(&gpkt->done); + } + + return gpkt->next ? : -ERESTARTSYS; +} + +#else +static s64 time_adjust(struct gpio_ir_tx_packet *gpkt) +{ + s64 now; + int i; + unsigned long flags; + + spin_lock_irqsave(&infrared_lock, flags); + + now = ktime_to_us(ktime_get()); + for (i = 0; i < ADJUST_NUM; i++) { + gpio_ir_tx_set(gpkt, false); + } + spin_unlock_irqrestore(&infrared_lock, flags); + + return (ktime_to_us(ktime_get())-now)/ADJUST_NUM; +} + +static long pwm_ir_tx_work(void *arg) +{ + struct gpio_ir_tx_packet *gpkt = arg; + unsigned long flags; + + /* disable irq for acurracy timing */ + spin_lock_irqsave(&infrared_lock, flags); + for (; gpkt->next < gpkt->length; gpkt->next++) { + + + if (gpkt->next & 0x01) { /* space */ + gpio_ir_tx_set(gpkt, false); + if (gpkt->buffer[gpkt->next] >= dealt) + udelay(gpkt->buffer[gpkt->next] - dealt); + } else if (!gpkt->pulse || !gpkt->space) { + gpio_ir_tx_set(gpkt, true); + if (gpkt->buffer[gpkt->next] >= dealt) + udelay(gpkt->buffer[gpkt->next] - dealt); + } else { /* pulse with soft carrier */ + while (gpkt->buffer[gpkt->next]) { + unsigned int usecs; + usecs = gpkt->on ? gpkt->pulse : gpkt->space; + usecs = min(usecs, gpkt->buffer[gpkt->next]); + + gpio_ir_tx_set(gpkt, gpkt->on); + + if (usecs >= dealt) + udelay(usecs - dealt); + + gpkt->buffer[gpkt->next] -= usecs; + gpkt->on = !gpkt->on; + } + } + } + + gpio_ir_tx_set(gpkt, false); + + spin_unlock_irqrestore(&infrared_lock, flags); + + return gpkt->next ? : -ERESTARTSYS; +} + +static int gpio_ir_tx_transmit_with_delay(struct gpio_ir_tx_packet *gpkt) +{ + + + int cpu, rc = -ENODEV; + int try_again = JUSTTIMES; + + dealt = time_adjust(gpkt); + + while (try_again && (dealt > JUST_DELAY)) { + try_again--; + dealt = time_adjust(gpkt); + printk("jeft time_adjust again!! dealt=%lld\n", dealt); + } + + if (dealt > JUST_DELAY) + goto out; + + + + + + for_each_online_cpu(cpu) + { + + if (cpu != 0) { + rc = work_on_cpu(cpu, pwm_ir_tx_work, gpkt); + break; + } + } + + if (rc == -ENODEV) { + pr_warn("pwm-ir: can't ron on the auxilliary cpu\n"); + + } + + return rc; + +out: + printk("jeft cpu too low infrared send fail dealt =%lld\n", dealt); + return rc; +} +#endif +static ssize_t transmit_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct led_classdev *led_cdev = dev_get_drvdata(dev); + + return sprintf(buf, "%d\n", led_cdev->brightness); +} + +static ssize_t transmit_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int *temp_buf = (int *)buf; + int rc = 0; + u32 carrier, period; + + struct gpio_ir_tx_packet gpkt = {}; + struct led_classdev *led_cdev = dev_get_drvdata(dev); + struct gpio_led_data *led_dat = + container_of(led_cdev, struct gpio_led_data, cdev); + + + mutex_lock(&ir_lock); + + carrier = temp_buf[0]; + period = NSEC_PER_MSEC / carrier; + + gpkt.pulse = period * DUTY_CLCLE / 100; + gpkt.space = period - gpkt.pulse; + + gpkt.gpio_nr = led_dat->gpio; + gpkt.high_active = 1/*gdata->tx_high_active*/; + gpkt.buffer = (unsigned int *)&temp_buf[1]; + gpkt.length = ((int)count/4 - 1); + + pm_qos_update_request(&infrared_qos_req, 1); +#if defined(USE_HRTIMER_SIMULATION) + rc = gpio_ir_tx_transmit_with_timer(&gpkt); +#else + if (gpkt.high_active) { + gpio_direction_output(gpkt.gpio_nr, 0); + } + rc = gpio_ir_tx_transmit_with_delay(&gpkt); +#endif + pm_qos_update_request(&infrared_qos_req, PM_QOS_DEFAULT_VALUE); + + + mutex_unlock(&ir_lock); + + return rc; +} +static DEVICE_ATTR(transmit, 0664, transmit_show, transmit_store); + static int create_gpio_led(const struct gpio_led *template, struct gpio_led_data *led_dat, struct device *parent, int (*blink_set)(unsigned, int, unsigned long *, unsigned long *)) { int ret, state; +#if defined (WT_USE_FAN54015) + int chg_status; +#endif led_dat->gpio = -1; @@ -105,7 +437,6 @@ static int create_gpio_led(const struct gpio_led *template, template->gpio, template->name); return 0; } - ret = devm_gpio_request(parent, template->gpio, template->name); if (ret < 0) return ret; @@ -129,16 +460,30 @@ static int create_gpio_led(const struct gpio_led *template, if (!template->retain_state_suspended) led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; +#if defined (WT_USE_FAN54015) + chg_status = fan54015_getcharge_stat(); + if (!strcmp(template->name, "red")) { + if ((chg_status & 0x1) != 0x1) { + ret = gpio_direction_output(led_dat->gpio, led_dat->active_low ^ state); + if (ret < 0) + return ret; + } + } +#else ret = gpio_direction_output(led_dat->gpio, led_dat->active_low ^ state); if (ret < 0) return ret; - +#endif INIT_WORK(&led_dat->work, gpio_led_work); ret = led_classdev_register(parent, &led_dat->cdev); if (ret < 0) return ret; + if (strcmp(led_dat->cdev.name, "infrared") == 0) { + device_create_file(led_dat->cdev.dev, &dev_attr_transmit); + } + return 0; } @@ -170,11 +515,11 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) int count, ret; /* count LEDs in this device, so we know how much to allocate */ - count = of_get_available_child_count(np); + count = of_get_child_count(np); if (!count) return ERR_PTR(-ENODEV); - for_each_available_child_of_node(np, child) + for_each_child_of_node(np, child) if (of_get_gpio(child, 0) == -EPROBE_DEFER) return ERR_PTR(-EPROBE_DEFER); @@ -183,7 +528,7 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) if (!priv) return ERR_PTR(-ENOMEM); - for_each_available_child_of_node(np, child) { + for_each_child_of_node(np, child) { struct gpio_led led = {}; enum of_gpio_flags flags; const char *state; @@ -203,8 +548,9 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) led.default_state = LEDS_GPIO_DEFSTATE_OFF; } - if (of_get_property(child, "retain-state-suspended", NULL)) - led.retain_state_suspended = 1; + led.retain_state_suspended = + (unsigned)of_property_read_bool(child, + "retain-state-suspended"); ret = create_gpio_led(&led, &priv->leds[priv->num_leds++], &pdev->dev, NULL); @@ -226,8 +572,6 @@ static const struct of_device_id of_gpio_leds_match[] = { { .compatible = "gpio-leds", }, {}, }; - -MODULE_DEVICE_TABLE(of, of_gpio_leds_match); #else /* CONFIG_OF_GPIO */ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) { @@ -235,12 +579,19 @@ static struct gpio_leds_priv *gpio_leds_create_of(struct platform_device *pdev) } #endif /* CONFIG_OF_GPIO */ + static int gpio_led_probe(struct platform_device *pdev) { - struct gpio_led_platform_data *pdata = dev_get_platdata(&pdev->dev); + struct gpio_led_platform_data *pdata = pdev->dev.platform_data; struct gpio_leds_priv *priv; + struct pinctrl *pinctrl; int i, ret = 0; + pinctrl = devm_pinctrl_get_select_default(&pdev->dev); + if (IS_ERR(pinctrl)) + dev_warn(&pdev->dev, + "pins are not configured from the driver\n"); + if (pdata && pdata->num_leds) { priv = devm_kzalloc(&pdev->dev, sizeof_gpio_leds_priv(pdata->num_leds), @@ -267,6 +618,9 @@ static int gpio_led_probe(struct platform_device *pdev) } platform_set_drvdata(pdev, priv); + pm_qos_add_request(&infrared_qos_req, + PM_QOS_CPU_DMA_LATENCY, PM_QOS_DEFAULT_VALUE); + mutex_init(&ir_lock); return 0; } @@ -279,6 +633,8 @@ static int gpio_led_remove(struct platform_device *pdev) for (i = 0; i < priv->num_leds; i++) delete_gpio_led(&priv->leds[i]); + platform_set_drvdata(pdev, NULL); + pm_qos_remove_request(&infrared_qos_req); return 0; } diff --git a/drivers/leds/leds-msm-gpio-flash.c b/drivers/leds/leds-msm-gpio-flash.c new file mode 100644 index 0000000000000..e72d0c98c0c50 --- /dev/null +++ b/drivers/leds/leds-msm-gpio-flash.c @@ -0,0 +1,325 @@ + +/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* #define CONFIG_GPIO_FLASH_DEBUG */ +#undef CDBG +#define CDBG(fmt, args...) pr_err(fmt, ##args) + +#define LED_GPIO_FLASH_DRIVER_NAME "qcom,leds-gpio-flash" +#define LED_TRIGGER_DEFAULT "none" + +#define GPIO_OUT_LOW (0 << 1) +#define GPIO_OUT_HIGH (1 << 1) + +enum msm_flash_seq_type_t { + FLASH_EN, + FLASH_NOW, +}; + +struct msm_flash_ctrl_seq { + enum msm_flash_seq_type_t seq_type; + uint8_t flash_on_val; + uint8_t torch_on_val; + uint8_t flash_off_val; +}; + +struct led_gpio_flash_data { + int flash_en; + int flash_now; + int brightness; + struct led_classdev cdev; + struct pinctrl *pinctrl; + struct pinctrl_state *gpio_state_default; + struct msm_flash_ctrl_seq ctrl_seq[2]; +}; + +static struct of_device_id led_gpio_flash_of_match[] = { + {.compatible = LED_GPIO_FLASH_DRIVER_NAME,}, + {}, +}; + +static void led_gpio_brightness_set(struct led_classdev *led_cdev, + enum led_brightness value) +{ + int rc = 0; + struct led_gpio_flash_data *flash_led = + container_of(led_cdev, struct led_gpio_flash_data, cdev); + + int brightness = value; + int flash_en = 0, flash_now = 0; + + if (brightness > LED_HALF) { + flash_en = + flash_led->ctrl_seq[FLASH_EN].flash_on_val; + flash_now = + flash_led->ctrl_seq[FLASH_NOW].flash_on_val; + } else if (brightness > LED_OFF) { + flash_en = + flash_led->ctrl_seq[FLASH_EN].torch_on_val; + flash_now = + flash_led->ctrl_seq[FLASH_NOW].torch_on_val; + } else { + flash_en = 0; + flash_now = 0; + } + CDBG("%s:flash_en=%d, flash_now=%d\n", __func__, flash_en, flash_now); + + rc = gpio_direction_output(93/*flash_led->flash_en*/, flash_en); + if (rc) { + pr_err("%s: Failed to set gpio %d\n", __func__, + flash_led->flash_en); + goto err; + } + rc = gpio_direction_output(90/*flash_led->flash_now*/, flash_now); + if (rc) { + pr_err("%s: Failed to set gpio %d\n", __func__, + flash_led->flash_now); + goto err; + } + flash_led->brightness = brightness; +err: + return; +} + +static enum led_brightness led_gpio_brightness_get(struct led_classdev + *led_cdev) +{ + struct led_gpio_flash_data *flash_led = + container_of(led_cdev, struct led_gpio_flash_data, cdev); + return flash_led->brightness; +} + +int led_gpio_flash_probe(struct platform_device *pdev) +{ + int rc = 0; + const char *temp_str; + struct led_gpio_flash_data *flash_led = NULL; + struct device_node *node = pdev->dev.of_node; + const char *seq_name = NULL; + uint32_t array_flash_seq[2]; + uint32_t array_torch_seq[2]; + int i = 0; + uint32_t flash_gpio_en, flash_gpio_now; + + flash_led = devm_kzalloc(&pdev->dev, sizeof(struct led_gpio_flash_data), + GFP_KERNEL); + if (flash_led == NULL) { + dev_err(&pdev->dev, "%s:%d Unable to allocate memory\n", + __func__, __LINE__); + return -ENOMEM; + } + + flash_led->cdev.default_trigger = LED_TRIGGER_DEFAULT; + rc = of_property_read_string(node, "linux,default-trigger", &temp_str); + if (!rc) + flash_led->cdev.default_trigger = temp_str; + + flash_led->pinctrl = devm_pinctrl_get(&pdev->dev); + if (IS_ERR(flash_led->pinctrl)) { + pr_err("%s:failed to get pinctrl\n", __func__); + return PTR_ERR(flash_led->pinctrl); + } + + flash_led->gpio_state_default = pinctrl_lookup_state(flash_led->pinctrl, + "flash_default"); + if (IS_ERR(flash_led->gpio_state_default)) { + pr_err("%s:can not get active pinstate\n", __func__); + return -EINVAL; + } + + rc = pinctrl_select_state(flash_led->pinctrl, + flash_led->gpio_state_default); + if (rc) + pr_err("%s:set state failed!\n", __func__); + + + flash_led->flash_en = of_property_read_u32(node, "qcom,flash-en", &flash_gpio_en); + if (flash_led->flash_en < 0) { + dev_err(&pdev->dev, + "Looking up %s property in node %s failed. rc = %d\n", + "flash-en", node->full_name, flash_led->flash_en); + goto error; + } else { + rc = gpio_request(flash_gpio_en, "FLASH_EN"); + if (rc) { + dev_err(&pdev->dev, + "%s: Failed to request gpio %d,rc = %d\n", + __func__, flash_gpio_en, rc); + + goto error; + } + } + + + flash_led->flash_now = of_property_read_u32(node, "qcom,flash-now", &flash_gpio_now); + if (flash_led->flash_now < 0) { + dev_err(&pdev->dev, + "Looking up %s property in node %s failed. rc = %d\n", + "flash-now", node->full_name, flash_led->flash_now); + goto error; + } else { + rc = gpio_request(flash_gpio_now, "FLASH_NOW"); + if (rc) { + dev_err(&pdev->dev, + "%s: Failed to request gpio %d,rc = %d\n", + __func__, flash_gpio_now, rc); + goto error; + } + } + + rc = of_property_read_string(node, "linux,name", &flash_led->cdev.name); + if (rc) { + dev_err(&pdev->dev, "%s: Failed to read linux name. rc = %d\n", + __func__, rc); + goto error; + } + + rc = of_property_read_u32_array(node, "qcom,flash-seq-val", + array_flash_seq, 2); + + if (rc < 0) { + pr_err("%s get flash op seq failed %d\n", + __func__, __LINE__); + goto error; + } + + rc = of_property_read_u32_array(node, "qcom,torch-seq-val", + array_torch_seq, 2); + + if (rc < 0) { + pr_err("%s get torch op seq failed %d\n", + __func__, __LINE__); + goto error; + } + + for (i = 0; i < 2; i++) { + rc = of_property_read_string_index(node, + "qcom,op-seq", i, + &seq_name); + CDBG("%s seq_name[%d] = %s\n", __func__, i, + seq_name); + if (rc < 0) + dev_err(&pdev->dev, "%s failed %d\n", + __func__, __LINE__); + + if (!strcmp(seq_name, "flash_en")) { + flash_led->ctrl_seq[FLASH_EN].seq_type = + FLASH_EN; + CDBG("%s:%d seq_type[%d] %d\n", __func__, __LINE__, + i, flash_led->ctrl_seq[FLASH_EN].seq_type); + if (array_flash_seq[i] == 0) + flash_led->ctrl_seq[FLASH_EN].flash_on_val = + GPIO_OUT_LOW; + else + flash_led->ctrl_seq[FLASH_EN].flash_on_val = + GPIO_OUT_HIGH; + + if (array_torch_seq[i] == 0) + flash_led->ctrl_seq[FLASH_EN].torch_on_val = + GPIO_OUT_LOW; + else + flash_led->ctrl_seq[FLASH_EN].torch_on_val = + GPIO_OUT_HIGH; + } else if (!strcmp(seq_name, "flash_now")) { + flash_led->ctrl_seq[FLASH_NOW].seq_type = + FLASH_NOW; + CDBG("%s:%d seq_type[%d] %d\n", __func__, __LINE__, + i, flash_led->ctrl_seq[i].seq_type); + if (array_flash_seq[i] == 0) + flash_led->ctrl_seq[FLASH_NOW].flash_on_val = + GPIO_OUT_LOW; + else + flash_led->ctrl_seq[FLASH_NOW].flash_on_val = + GPIO_OUT_HIGH; + + if (array_torch_seq[i] == 0) + flash_led->ctrl_seq[FLASH_NOW].torch_on_val = + GPIO_OUT_LOW; + else + flash_led->ctrl_seq[FLASH_NOW].torch_on_val = + GPIO_OUT_HIGH; + } + + } + + platform_set_drvdata(pdev, flash_led); + flash_led->cdev.max_brightness = LED_FULL; + flash_led->cdev.brightness_set = led_gpio_brightness_set; + flash_led->cdev.brightness_get = led_gpio_brightness_get; + + rc = led_classdev_register(&pdev->dev, &flash_led->cdev); + if (rc) { + dev_err(&pdev->dev, "%s: Failed to register led dev. rc = %d\n", + __func__, rc); + goto error; + } + pr_err("%s:probe successfully!\n", __func__); + return 0; + +error: + if (IS_ERR(flash_led->pinctrl)) + devm_pinctrl_put(flash_led->pinctrl); + devm_kfree(&pdev->dev, flash_led); + return rc; +} + +int led_gpio_flash_remove(struct platform_device *pdev) +{ + struct led_gpio_flash_data *flash_led = + (struct led_gpio_flash_data *)platform_get_drvdata(pdev); + if (IS_ERR(flash_led->pinctrl)) + devm_pinctrl_put(flash_led->pinctrl); + led_classdev_unregister(&flash_led->cdev); + devm_kfree(&pdev->dev, flash_led); + return 0; +} + +static struct platform_driver led_gpio_flash_driver = { + .probe = led_gpio_flash_probe, + .remove = led_gpio_flash_remove, + .driver = { + .name = LED_GPIO_FLASH_DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = led_gpio_flash_of_match, + } +}; + +static int __init led_gpio_flash_init(void) +{ + return platform_driver_register(&led_gpio_flash_driver); +} + +static void __exit led_gpio_flash_exit(void) +{ + return platform_driver_unregister(&led_gpio_flash_driver); +} + +late_initcall(led_gpio_flash_init); +module_exit(led_gpio_flash_exit); + +MODULE_DESCRIPTION("QCOM GPIO LEDs driver"); +MODULE_LICENSE("GPL v2"); +MODULE_ALIAS("leds:leds-msm-gpio-flash"); diff --git a/drivers/leds/leds-qpnp-flash.c b/drivers/leds/leds-qpnp-flash.c index 63f7cdf7ff7c2..a0b502aa35793 100644 --- a/drivers/leds/leds-qpnp-flash.c +++ b/drivers/leds/leds-qpnp-flash.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -29,6 +30,8 @@ #include "leds.h" #include #include +#include + #define FLASH_LED_PERIPHERAL_SUBTYPE(base) (base + 0x05) #define FLASH_SAFETY_TIMER(base) (base + 0x40) @@ -222,10 +225,13 @@ struct flash_led_platform_data { }; struct qpnp_flash_led_buffer { - size_t rpos; - size_t wpos; - size_t len; - char data[0]; + struct mutex debugfs_lock; /* Prevent thread concurrency */ + size_t rpos; + size_t wpos; + size_t len; + struct qpnp_flash_led *led; + u32 buffer_cnt; + char data[0]; }; /* @@ -243,10 +249,10 @@ struct qpnp_flash_led { struct workqueue_struct *ordered_workq; struct qpnp_vadc_chip *vadc_dev; struct mutex flash_led_lock; + struct wake_lock flashlight_led_lock; struct qpnp_flash_led_buffer *log; struct dentry *dbgfs_root; int num_leds; - u32 buffer_cnt; u16 base; u16 current_addr; u16 current2_addr; @@ -277,10 +283,11 @@ static int flash_led_dbgfs_file_open(struct qpnp_flash_led *led, log->rpos = 0; log->wpos = 0; log->len = logbufsize - sizeof(*log); - led->log = log; + mutex_init(&log->debugfs_lock); + log->led = led; - led->buffer_cnt = 1; - file->private_data = led; + log->buffer_cnt = 1; + file->private_data = log; return 0; } @@ -294,24 +301,30 @@ static int flash_led_dfs_open(struct inode *inode, struct file *file) static int flash_led_dfs_close(struct inode *inode, struct file *file) { - struct qpnp_flash_led *led = file->private_data; + struct qpnp_flash_led_buffer *log = file->private_data; - if (led && led->log) { + if (log) { file->private_data = NULL; - kfree(led->log); + mutex_destroy(&log->debugfs_lock); + kfree(log); } return 0; } +#define MIN_BUFFER_WRITE_LEN 20 static int print_to_log(struct qpnp_flash_led_buffer *log, const char *fmt, ...) { va_list args; int cnt; - char *log_buf = &log->data[log->wpos]; + char *log_buf; size_t size = log->len - log->wpos; + if (size < MIN_BUFFER_WRITE_LEN) + return 0; /* not enough buffer left */ + + log_buf = &log->data[log->wpos]; va_start(args, fmt); cnt = vscnprintf(log_buf, size, fmt, args); va_end(args); @@ -322,15 +335,23 @@ static int print_to_log(struct qpnp_flash_led_buffer *log, static ssize_t flash_led_dfs_latched_reg_read(struct file *fp, char __user *buf, size_t count, loff_t *ppos) { - struct qpnp_flash_led *led = fp->private_data; - struct qpnp_flash_led_buffer *log = led->log; + struct qpnp_flash_led_buffer *log = fp->private_data; + struct qpnp_flash_led *led; u8 val; - int rc; + int rc = 0; size_t len; size_t ret; - if (log->rpos >= log->wpos && led->buffer_cnt == 0) - return 0; + if (!log) { + pr_err("error: file private data is NULL\n"); + return -EFAULT; + } + led = log->led; + + mutex_lock(&log->debugfs_lock); + if ((log->rpos >= log->wpos && log->buffer_cnt == 0) || + ((log->len - log->wpos) < MIN_BUFFER_WRITE_LEN)) + goto unlock_mutex; rc = spmi_ext_register_readl(led->spmi_dev->ctrl, led->spmi_dev->sid, INT_LATCHED_STS(led->base), &val, 1); @@ -338,17 +359,17 @@ static ssize_t flash_led_dfs_latched_reg_read(struct file *fp, char __user *buf, dev_err(&led->spmi_dev->dev, "Unable to read from address %x, rc(%d)\n", INT_LATCHED_STS(led->base), rc); - return -EINVAL; + goto unlock_mutex; } - led->buffer_cnt--; + log->buffer_cnt--; rc = print_to_log(log, "0x%05X ", INT_LATCHED_STS(led->base)); if (rc == 0) - return rc; + goto unlock_mutex; rc = print_to_log(log, "0x%02X ", val); if (rc == 0) - return rc; + goto unlock_mutex; if (log->wpos > 0 && log->data[log->wpos - 1] == ' ') log->data[log->wpos - 1] = '\n'; @@ -358,36 +379,49 @@ static ssize_t flash_led_dfs_latched_reg_read(struct file *fp, char __user *buf, ret = copy_to_user(buf, &log->data[log->rpos], len); if (ret) { pr_err("error copy register value to user\n"); - return -EFAULT; + rc = -EFAULT; + goto unlock_mutex; } len -= ret; *ppos += len; log->rpos += len; - return len; + rc = len; + +unlock_mutex: + mutex_unlock(&log->debugfs_lock); + return rc; } static ssize_t flash_led_dfs_fault_reg_read(struct file *fp, char __user *buf, size_t count, loff_t *ppos) { - struct qpnp_flash_led *led = fp->private_data; - struct qpnp_flash_led_buffer *log = led->log; - int rc; + struct qpnp_flash_led_buffer *log = fp->private_data; + struct qpnp_flash_led *led; + int rc = 0; size_t len; size_t ret; - if (log->rpos >= log->wpos && led->buffer_cnt == 0) - return 0; + if (!log) { + pr_err("error: file private data is NULL\n"); + return -EFAULT; + } + led = log->led; + + mutex_lock(&log->debugfs_lock); + if ((log->rpos >= log->wpos && log->buffer_cnt == 0) || + ((log->len - log->wpos) < MIN_BUFFER_WRITE_LEN)) + goto unlock_mutex; - led->buffer_cnt--; + log->buffer_cnt--; rc = print_to_log(log, "0x%05X ", FLASH_LED_FAULT_STATUS(led->base)); if (rc == 0) - return rc; + goto unlock_mutex; rc = print_to_log(log, "0x%02X ", led->fault_reg); if (rc == 0) - return rc; + goto unlock_mutex; if (log->wpos > 0 && log->data[log->wpos - 1] == ' ') log->data[log->wpos - 1] = '\n'; @@ -397,14 +431,19 @@ static ssize_t flash_led_dfs_fault_reg_read(struct file *fp, char __user *buf, ret = copy_to_user(buf, &log->data[log->rpos], len); if (ret) { pr_err("error copy register value to user\n"); - return -EFAULT; + rc = -EFAULT; + goto unlock_mutex; } len -= ret; *ppos += len; log->rpos += len; - return len; + rc = len; + +unlock_mutex: + mutex_unlock(&log->debugfs_lock); + return rc; } static ssize_t flash_led_dfs_fault_reg_enable(struct file *file, @@ -416,11 +455,22 @@ static ssize_t flash_led_dfs_fault_reg_enable(struct file *file, int data; size_t ret = 0; - struct qpnp_flash_led *led = file->private_data; - char *kbuf = kmalloc(count + 1, GFP_KERNEL); + struct qpnp_flash_led_buffer *log = file->private_data; + struct qpnp_flash_led *led; + char *kbuf; - if (!kbuf) - return -ENOMEM; + if (!log) { + pr_err("error: file private data is NULL\n"); + return -EFAULT; + } + led = log->led; + + mutex_lock(&log->debugfs_lock); + kbuf = kmalloc(count + 1, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + goto unlock_mutex; + } ret = copy_from_user(kbuf, buf, count); if (!ret) { @@ -449,6 +499,8 @@ static ssize_t flash_led_dfs_fault_reg_enable(struct file *file, free_buf: kfree(kbuf); +unlock_mutex: + mutex_unlock(&log->debugfs_lock); return ret; } @@ -460,11 +512,22 @@ static ssize_t flash_led_dfs_dbg_enable(struct file *file, int cnt = 0; int data; size_t ret = 0; - struct qpnp_flash_led *led = file->private_data; - char *kbuf = kmalloc(count + 1, GFP_KERNEL); + struct qpnp_flash_led_buffer *log = file->private_data; + struct qpnp_flash_led *led; + char *kbuf; - if (!kbuf) - return -ENOMEM; + if (!log) { + pr_err("error: file private data is NULL\n"); + return -EFAULT; + } + led = log->led; + + mutex_lock(&log->debugfs_lock); + kbuf = kmalloc(count + 1, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + goto unlock_mutex; + } ret = copy_from_user(kbuf, buf, count); if (ret == count) { @@ -492,6 +555,8 @@ static ssize_t flash_led_dfs_dbg_enable(struct file *file, free_buf: kfree(kbuf); +unlock_mutex: + mutex_unlock(&log->debugfs_lock); return ret; } @@ -1186,6 +1251,8 @@ static void qpnp_flash_led_work(struct work_struct *work) /* Global lock is to synchronize between the flash leds and torch */ mutex_lock(&led->flash_led_lock); + + dev_dbg(&led->spmi_dev->dev, "wt flash_node.cdev.name=%s\n", flash_node->cdev.name); /* Local lock is to synchronize for one led instance */ mutex_lock(&flash_node->cdev.led_access); @@ -1741,6 +1808,8 @@ static void qpnp_flash_led_work(struct work_struct *work) return; } + +extern int32_t wt_flash_flashlight(bool boolean); static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev, enum led_brightness value) { @@ -1758,6 +1827,22 @@ static void qpnp_flash_led_brightness_set(struct led_classdev *led_cdev, value = flash_node->cdev.max_brightness; flash_node->cdev.brightness = value; + + + pr_debug("WT flash_node.cdev.name=%s, brightness=%d, id=%d, flash_node->type=%d\n", flash_node->cdev.name, + flash_node->cdev.brightness, flash_node->id, flash_node->type); + + if (!strcmp(flash_node->cdev.name, "flashlight")) { + pr_info("wt_flash_flashlight enter value=%d\n", value); + if (value > 0) { + wt_flash_flashlight(true); + wake_lock(&led->flashlight_led_lock); + } else{ + wt_flash_flashlight(false); + wake_unlock(&led->flashlight_led_lock); + } + } + if (led->flash_node[led->num_leds - 1].id == FLASH_LED_SWITCH) { if (flash_node->type == TORCH) @@ -2446,6 +2531,8 @@ static int qpnp_flash_led_probe(struct spmi_device *spmi) } mutex_init(&led->flash_led_lock); + wake_lock_init(&led->flashlight_led_lock, WAKE_LOCK_SUSPEND, + "flashlight_led_lock_wt"); led->ordered_workq = alloc_ordered_workqueue("flash_led_workqueue", 0); if (!led->ordered_workq) { @@ -2585,6 +2672,7 @@ static int qpnp_flash_led_probe(struct spmi_device *spmi) led_classdev_unregister(&led->flash_node[i].cdev); } mutex_destroy(&led->flash_led_lock); + wake_lock_destroy(&led->flashlight_led_lock); destroy_workqueue(led->ordered_workq); return rc; @@ -2610,6 +2698,7 @@ static int qpnp_flash_led_remove(struct spmi_device *spmi) } debugfs_remove_recursive(led->dbgfs_root); mutex_destroy(&led->flash_led_lock); + wake_lock_destroy(&led->flashlight_led_lock); destroy_workqueue(led->ordered_workq); return 0; diff --git a/drivers/leds/leds-qpnp-wled.c b/drivers/leds/leds-qpnp-wled.c index 9fcee2a9bc6dd..cbe114cb36bbb 100644 --- a/drivers/leds/leds-qpnp-wled.c +++ b/drivers/leds/leds-qpnp-wled.c @@ -91,10 +91,10 @@ #define QPNP_WLED_BOOST_DUTY_MAX_NS 156 #define QPNP_WLED_DEF_BOOST_DUTY_NS 104 #define QPNP_WLED_SWITCH_FREQ_MASK 0x70 -#define QPNP_WLED_SWITCH_FREQ_800_KHZ 800 +#define QPNP_WLED_SWITCH_FREQ_600_KHZ 600 #define QPNP_WLED_SWITCH_FREQ_1600_KHZ 1600 #define QPNP_WLED_SWITCH_FREQ_OVERWRITE 0x80 -#define QPNP_WLED_OVP_MASK 0xFC +#define QPNP_WLED_OVP_MASK GENMASK(1, 0) #define QPNP_WLED_OVP_17800_MV 17800 #define QPNP_WLED_OVP_19400_MV 19400 #define QPNP_WLED_OVP_29500_MV 29500 @@ -161,7 +161,7 @@ #define QPNP_WLED_SINK_TEST5_HYB 0x14 #define QPNP_WLED_SINK_TEST5_DIG 0x1E -#define QPNP_WLED_SWITCH_FREQ_800_KHZ_CODE 0x0B +#define QPNP_WLED_SWITCH_FREQ_600_KHZ_CODE 0x0B #define QPNP_WLED_SWITCH_FREQ_1600_KHZ_CODE 0x05 #define QPNP_WLED_DISP_SEL_REG(b) (b + 0x44) @@ -1087,7 +1087,7 @@ static int qpnp_wled_config(struct qpnp_wled *wled) if (wled->switch_freq_khz == QPNP_WLED_SWITCH_FREQ_1600_KHZ) temp = QPNP_WLED_SWITCH_FREQ_1600_KHZ_CODE; else - temp = QPNP_WLED_SWITCH_FREQ_800_KHZ_CODE; + temp = QPNP_WLED_SWITCH_FREQ_600_KHZ_CODE; rc = qpnp_wled_read_reg(wled, ®, QPNP_WLED_SWITCH_FREQ_REG(wled->ctrl_base)); @@ -1100,31 +1100,28 @@ static int qpnp_wled_config(struct qpnp_wled *wled) if (rc) return rc; - /* Configure the OVP register */ - if (wled->ovp_mv <= QPNP_WLED_OVP_17800_MV) { - wled->ovp_mv = QPNP_WLED_OVP_17800_MV; - temp = 3; - } else if (wled->ovp_mv <= QPNP_WLED_OVP_19400_MV) { - wled->ovp_mv = QPNP_WLED_OVP_19400_MV; - temp = 2; - } else if (wled->ovp_mv <= QPNP_WLED_OVP_29500_MV) { - wled->ovp_mv = QPNP_WLED_OVP_29500_MV; - temp = 1; - } else { - wled->ovp_mv = QPNP_WLED_OVP_31000_MV; - temp = 0; - } + /* Configure the OVP register only if display type is not AMOLED */ + if (!wled->disp_type_amoled) { + if (wled->ovp_mv <= QPNP_WLED_OVP_17800_MV) { + wled->ovp_mv = QPNP_WLED_OVP_17800_MV; + temp = 3; + } else if (wled->ovp_mv <= QPNP_WLED_OVP_19400_MV) { + wled->ovp_mv = QPNP_WLED_OVP_19400_MV; + temp = 2; + } else if (wled->ovp_mv <= QPNP_WLED_OVP_29500_MV) { + wled->ovp_mv = QPNP_WLED_OVP_29500_MV; + temp = 1; + } else { + wled->ovp_mv = QPNP_WLED_OVP_31000_MV; + temp = 0; + } - rc = qpnp_wled_read_reg(wled, ®, - QPNP_WLED_OVP_REG(wled->ctrl_base)); - if (rc < 0) - return rc; - reg &= QPNP_WLED_OVP_MASK; - reg |= temp; - rc = qpnp_wled_write_reg(wled, ®, - QPNP_WLED_OVP_REG(wled->ctrl_base)); - if (rc) - return rc; + reg = (u8)temp; + rc = qpnp_wled_masked_write_reg(wled, QPNP_WLED_OVP_MASK, ®, + QPNP_WLED_OVP_REG(wled->ctrl_base)); + if (rc) + return rc; + } rc = qpnp_wled_read_reg(wled, ®, QPNP_WLED_CTRL_SPARE_REG(wled->ctrl_base)); @@ -1150,8 +1147,8 @@ static int qpnp_wled_config(struct qpnp_wled *wled) /* Update WLED_OVP register based on desired target voltage */ reg = qpnp_wled_ovp_reg_settings[i]; - rc = qpnp_wled_write_reg(wled, ®, - QPNP_WLED_OVP_REG(wled->ctrl_base)); + rc = qpnp_wled_masked_write_reg(wled, QPNP_WLED_OVP_MASK, ®, + QPNP_WLED_OVP_REG(wled->ctrl_base)); if (rc) return rc; @@ -1558,7 +1555,7 @@ static int qpnp_wled_parse_dt(struct qpnp_wled *wled) return rc; } - wled->switch_freq_khz = QPNP_WLED_SWITCH_FREQ_800_KHZ; + wled->switch_freq_khz = QPNP_WLED_SWITCH_FREQ_600_KHZ; rc = of_property_read_u32(spmi->dev.of_node, "qcom,switch-freq-khz", &temp_val); if (!rc) { @@ -1574,7 +1571,7 @@ static int qpnp_wled_parse_dt(struct qpnp_wled *wled) if (!rc) { wled->ovp_mv = temp_val; } else if (rc != -EINVAL) { - dev_err(&spmi->dev, "Unable to read vref\n"); + dev_err(&spmi->dev, "Unable to read ovp\n"); return rc; } diff --git a/drivers/md/Kconfig b/drivers/md/Kconfig index e526f3707ac91..92254ab12ef9d 100644 --- a/drivers/md/Kconfig +++ b/drivers/md/Kconfig @@ -435,6 +435,35 @@ config DM_VERITY If unsure, say N. +config DM_ANDROID_VERITY + bool "Android verity target support" + depends on DM_VERITY + depends on X509_CERTIFICATE_PARSER + depends on SYSTEM_TRUSTED_KEYRING + depends on PUBLIC_KEY_ALGO_RSA + depends on KEYS + depends on ASYMMETRIC_KEY_TYPE + depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE + ---help--- + This device-mapper target is virtually a VERITY target. This + target is setup by reading the metadata contents piggybacked + to the actual data blocks in the block device. The signature + of the metadata contents are verified against the key included + in the system keyring. Upon success, the underlying verity + target is setup. + +config DM_VERITY_FEC + bool "Verity forward error correction support" + depends on DM_VERITY + select REED_SOLOMON + select REED_SOLOMON_DEC8 + ---help--- + Add forward error correction support to dm-verity. This option + makes it possible to use pre-generated error correction data to + recover from corrupted blocks. + + If unsure, say N. + config DM_SWITCH tristate "Switch target support (EXPERIMENTAL)" depends on BLK_DEV_DM @@ -449,4 +478,19 @@ config DM_SWITCH If unsure, say N. +config DM_LOG_WRITES + tristate "Log writes target support" + depends on BLK_DEV_DM + ---help--- + This device-mapper target takes two devices, one device to use + normally, one to log all write operations done to the first device. + This is for use by file system developers wishing to verify that + their fs is writing a consitent file system at all times by allowing + them to replay the log in a variety of ways and to check the + contents. + + To compile this code as a module, choose M here: the module will + be called dm-log-writes. + + If unsure, say N. endif # MD diff --git a/drivers/md/Makefile b/drivers/md/Makefile index 9f2950b873068..1f3509d0719a4 100644 --- a/drivers/md/Makefile +++ b/drivers/md/Makefile @@ -15,6 +15,7 @@ dm-cache-y += dm-cache-target.o dm-cache-metadata.o dm-cache-policy.o dm-cache-mq-y += dm-cache-policy-mq.o dm-cache-cleaner-y += dm-cache-policy-cleaner.o dm-era-y += dm-era-target.o +dm-verity-y += dm-verity-target.o md-mod-y += md.o bitmap.o raid456-y += raid5.o @@ -60,3 +61,11 @@ obj-$(CONFIG_DM_REQ_CRYPT) += dm-req-crypt.o ifeq ($(CONFIG_DM_UEVENT),y) dm-mod-objs += dm-uevent.o endif + +ifeq ($(CONFIG_DM_VERITY_FEC),y) +dm-verity-objs += dm-verity-fec.o +endif + +ifeq ($(CONFIG_DM_ANDROID_VERITY),y) +dm-verity-objs += dm-android-verity.o +endif diff --git a/drivers/md/dm-android-verity.c b/drivers/md/dm-android-verity.c new file mode 100644 index 0000000000000..b7e059595f75d --- /dev/null +++ b/drivers/md/dm-android-verity.c @@ -0,0 +1,855 @@ +/* + * Copyright (C) 2015 Google, Inc. + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "dm-verity.h" +#include "dm-android-verity.h" + +static char verifiedbootstate[VERITY_COMMANDLINE_PARAM_LENGTH]; +static char veritymode[VERITY_COMMANDLINE_PARAM_LENGTH]; + +static bool target_added; +static bool verity_enabled = true; +struct dentry *debug_dir; +static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv); + +static struct target_type android_verity_target = { + .name = "android-verity", + .version = {1, 0, 0}, + .module = THIS_MODULE, + .ctr = android_verity_ctr, + .dtr = verity_dtr, + .map = verity_map, + .status = verity_status, + .ioctl = verity_ioctl, + .merge = verity_merge, + .iterate_devices = verity_iterate_devices, + .io_hints = verity_io_hints, +}; + +static int __init verified_boot_state_param(char *line) +{ + strlcpy(verifiedbootstate, line, sizeof(verifiedbootstate)); + return 1; +} + +__setup("androidboot.verifiedbootstate=", verified_boot_state_param); + +static int __init verity_mode_param(char *line) +{ + strlcpy(veritymode, line, sizeof(veritymode)); + return 1; +} + +__setup("androidboot.veritymode=", verity_mode_param); + +static int table_extract_mpi_array(struct public_key_signature *pks, + const void *data, size_t len) +{ + MPI mpi = mpi_read_raw_data(data, len); + + if (!mpi) { + DMERR("Error while allocating mpi array"); + return -ENOMEM; + } + + pks->mpi[0] = mpi; + pks->nr_mpi = 1; + return 0; +} + +static struct public_key_signature *table_make_digest( + enum hash_algo hash, + const void *table, + unsigned long table_len) +{ + struct public_key_signature *pks = NULL; + struct crypto_shash *tfm; + struct shash_desc *desc; + size_t digest_size, desc_size; + int ret; + + /* Allocate the hashing algorithm we're going to need and find out how + * big the hash operational data will be. + */ + tfm = crypto_alloc_shash(hash_algo_name[hash], 0, 0); + if (IS_ERR(tfm)) + return ERR_CAST(tfm); + + desc_size = crypto_shash_descsize(tfm) + sizeof(*desc); + digest_size = crypto_shash_digestsize(tfm); + + /* We allocate the hash operational data storage on the end of out + * context data and the digest output buffer on the end of that. + */ + ret = -ENOMEM; + pks = kzalloc(digest_size + sizeof(*pks) + desc_size, GFP_KERNEL); + if (!pks) + goto error; + + pks->pkey_hash_algo = hash; + pks->digest = (u8 *)pks + sizeof(*pks) + desc_size; + pks->digest_size = digest_size; + + desc = (struct shash_desc *)(pks + 1); + desc->tfm = tfm; + desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; + + ret = crypto_shash_init(desc); + if (ret < 0) + goto error; + + ret = crypto_shash_finup(desc, table, table_len, pks->digest); + if (ret < 0) + goto error; + + crypto_free_shash(tfm); + return pks; + +error: + kfree(pks); + crypto_free_shash(tfm); + return ERR_PTR(ret); +} + +static int read_block_dev(struct bio_read *payload, struct block_device *bdev, + sector_t offset, int length) +{ + struct bio *bio; + int err = 0, i; + + payload->number_of_pages = DIV_ROUND_UP(length, PAGE_SIZE); + + bio = bio_alloc(GFP_KERNEL, payload->number_of_pages); + if (!bio) { + DMERR("Error while allocating bio"); + return -ENOMEM; + } + + bio->bi_bdev = bdev; + bio->bi_iter.bi_sector = offset; + + payload->page_io = kzalloc(sizeof(struct page *) * + payload->number_of_pages, GFP_KERNEL); + if (!payload->page_io) { + DMERR("page_io array alloc failed"); + err = -ENOMEM; + goto free_bio; + } + + for (i = 0; i < payload->number_of_pages; i++) { + payload->page_io[i] = alloc_page(GFP_KERNEL); + if (!payload->page_io[i]) { + DMERR("alloc_page failed"); + err = -ENOMEM; + goto free_pages; + } + if (!bio_add_page(bio, payload->page_io[i], PAGE_SIZE, 0)) { + DMERR("bio_add_page error"); + err = -EIO; + goto free_pages; + } + } + + if (!submit_bio_wait(READ, bio)) + /* success */ + goto free_bio; + DMERR("bio read failed"); + err = -EIO; + +free_pages: + for (i = 0; i < payload->number_of_pages; i++) + if (payload->page_io[i]) + __free_page(payload->page_io[i]); + kfree(payload->page_io); +free_bio: + bio_put(bio); + return err; +} + +static inline u64 fec_div_round_up(u64 x, u64 y) +{ + u64 remainder; + + return div64_u64_rem(x, y, &remainder) + + (remainder > 0 ? 1 : 0); +} + +static inline void populate_fec_metadata(struct fec_header *header, + struct fec_ecc_metadata *ecc) +{ + ecc->blocks = fec_div_round_up(le64_to_cpu(header->inp_size), + FEC_BLOCK_SIZE); + ecc->roots = le32_to_cpu(header->roots); + ecc->start = le64_to_cpu(header->inp_size); +} + +static inline int validate_fec_header(struct fec_header *header, u64 offset) +{ + /* move offset to make the sanity check work for backup header + * as well. */ + offset -= offset % FEC_BLOCK_SIZE; + if (le32_to_cpu(header->magic) != FEC_MAGIC || + le32_to_cpu(header->version) != FEC_VERSION || + le32_to_cpu(header->size) != sizeof(struct fec_header) || + le32_to_cpu(header->roots) == 0 || + le32_to_cpu(header->roots) >= FEC_RSM || + offset < le32_to_cpu(header->fec_size) || + offset - le32_to_cpu(header->fec_size) != + le64_to_cpu(header->inp_size)) + return -EINVAL; + + return 0; +} + +static int extract_fec_header(dev_t dev, struct fec_header *fec, + struct fec_ecc_metadata *ecc) +{ + u64 device_size; + struct bio_read payload; + int i, err = 0; + struct block_device *bdev; + + bdev = blkdev_get_by_dev(dev, FMODE_READ, NULL); + + if (IS_ERR(bdev)) { + DMERR("bdev get error"); + return PTR_ERR(bdev); + } + + device_size = i_size_read(bdev->bd_inode); + + /* fec metadata size is a power of 2 and PAGE_SIZE + * is a power of 2 as well. + */ + BUG_ON(FEC_BLOCK_SIZE > PAGE_SIZE); + /* 512 byte sector alignment */ + BUG_ON(((device_size - FEC_BLOCK_SIZE) % (1 << SECTOR_SHIFT)) != 0); + + err = read_block_dev(&payload, bdev, (device_size - + FEC_BLOCK_SIZE) / (1 << SECTOR_SHIFT), FEC_BLOCK_SIZE); + if (err) { + DMERR("Error while reading verity metadata"); + goto error; + } + + BUG_ON(sizeof(struct fec_header) > PAGE_SIZE); + memcpy(fec, page_address(payload.page_io[0]), + sizeof(*fec)); + + ecc->valid = true; + if (validate_fec_header(fec, device_size - FEC_BLOCK_SIZE)) { + /* Try the backup header */ + memcpy(fec, page_address(payload.page_io[0]) + FEC_BLOCK_SIZE + - sizeof(*fec) , + sizeof(*fec)); + if (validate_fec_header(fec, device_size - + sizeof(struct fec_header))) + ecc->valid = false; + } + + if (ecc->valid) + populate_fec_metadata(fec, ecc); + + for (i = 0; i < payload.number_of_pages; i++) + __free_page(payload.page_io[i]); + kfree(payload.page_io); + +error: + blkdev_put(bdev, FMODE_READ); + return err; +} +static void find_metadata_offset(struct fec_header *fec, + struct block_device *bdev, u64 *metadata_offset) +{ + u64 device_size; + + device_size = i_size_read(bdev->bd_inode); + + if (le32_to_cpu(fec->magic) == FEC_MAGIC) + *metadata_offset = le64_to_cpu(fec->inp_size) - + VERITY_METADATA_SIZE; + else + *metadata_offset = device_size - VERITY_METADATA_SIZE; +} + +static struct android_metadata *extract_metadata(dev_t dev, + struct fec_header *fec) +{ + struct block_device *bdev; + struct android_metadata_header *header; + struct android_metadata *uninitialized_var(metadata); + int i; + u32 table_length, copy_length, offset; + u64 metadata_offset; + struct bio_read payload; + int err = 0; + + bdev = blkdev_get_by_dev(dev, FMODE_READ, NULL); + + if (IS_ERR(bdev)) { + DMERR("blkdev_get_by_dev failed"); + return ERR_CAST(bdev); + } + + find_metadata_offset(fec, bdev, &metadata_offset); + + /* Verity metadata size is a power of 2 and PAGE_SIZE + * is a power of 2 as well. + * PAGE_SIZE is also a multiple of 512 bytes. + */ + if (VERITY_METADATA_SIZE > PAGE_SIZE) + BUG_ON(VERITY_METADATA_SIZE % PAGE_SIZE != 0); + /* 512 byte sector alignment */ + BUG_ON(metadata_offset % (1 << SECTOR_SHIFT) != 0); + + err = read_block_dev(&payload, bdev, metadata_offset / + (1 << SECTOR_SHIFT), VERITY_METADATA_SIZE); + if (err) { + DMERR("Error while reading verity metadata"); + metadata = ERR_PTR(err); + goto blkdev_release; + } + + header = kzalloc(sizeof(*header), GFP_KERNEL); + if (!header) { + DMERR("kzalloc failed for header"); + err = -ENOMEM; + goto free_payload; + } + + memcpy(header, page_address(payload.page_io[0]), + sizeof(*header)); + + DMINFO("bio magic_number:%u protocol_version:%d table_length:%u", + le32_to_cpu(header->magic_number), + le32_to_cpu(header->protocol_version), + le32_to_cpu(header->table_length)); + + metadata = kzalloc(sizeof(*metadata), GFP_KERNEL); + if (!metadata) { + DMERR("kzalloc for metadata failed"); + err = -ENOMEM; + goto free_header; + } + + metadata->header = header; + table_length = le32_to_cpu(header->table_length); + + if (table_length == 0 || + table_length > (VERITY_METADATA_SIZE - + sizeof(struct android_metadata_header))) + goto free_metadata; + + metadata->verity_table = kzalloc(table_length + 1, GFP_KERNEL); + + if (!metadata->verity_table) { + DMERR("kzalloc verity_table failed"); + err = -ENOMEM; + goto free_metadata; + } + + if (sizeof(struct android_metadata_header) + + table_length <= PAGE_SIZE) { + memcpy(metadata->verity_table, page_address(payload.page_io[0]) + + sizeof(struct android_metadata_header), + table_length); + } else { + copy_length = PAGE_SIZE - + sizeof(struct android_metadata_header); + memcpy(metadata->verity_table, page_address(payload.page_io[0]) + + sizeof(struct android_metadata_header), + copy_length); + table_length -= copy_length; + offset = copy_length; + i = 1; + while (table_length != 0) { + if (table_length > PAGE_SIZE) { + memcpy(metadata->verity_table + offset, + page_address(payload.page_io[i]), + PAGE_SIZE); + offset += PAGE_SIZE; + table_length -= PAGE_SIZE; + } else { + memcpy(metadata->verity_table + offset, + page_address(payload.page_io[i]), + table_length); + table_length = 0; + } + i++; + } + } + metadata->verity_table[table_length] = '\0'; + + goto free_payload; + +free_metadata: + kfree(metadata); +free_header: + kfree(header); + metadata = ERR_PTR(err); +free_payload: + for (i = 0; i < payload.number_of_pages; i++) + if (payload.page_io[i]) + __free_page(payload.page_io[i]); + kfree(payload.page_io); + + DMINFO("verity_table: %s", metadata->verity_table); +blkdev_release: + blkdev_put(bdev, FMODE_READ); + return metadata; +} + +/* helper functions to extract properties from dts */ +const char *find_dt_value(const char *name) +{ + struct device_node *firmware; + const char *value; + + firmware = of_find_node_by_path("/firmware/android"); + if (!firmware) + return NULL; + value = of_get_property(firmware, name, NULL); + of_node_put(firmware); + + return value; +} + +static bool is_unlocked(void) +{ + static const char unlocked[] = "orange"; + static const char verified_boot_prop[] = "verifiedbootstate"; + const char *value; + + value = find_dt_value(verified_boot_prop); + if (!value) + value = verifiedbootstate; + + return !strncmp(value, unlocked, sizeof(unlocked) - 1); +} + +static int verity_mode(void) +{ + static const char enforcing[] = "enforcing"; + static const char verified_mode_prop[] = "veritymode"; + const char *value; + + value = find_dt_value(verified_mode_prop); + if (!value) + value = veritymode; + if (!strncmp(value, enforcing, sizeof(enforcing) - 1)) + return DM_VERITY_MODE_RESTART; + + return DM_VERITY_MODE_EIO; +} + +static int verify_header(struct android_metadata_header *header) +{ + int retval = -EINVAL; + + if (is_unlocked() && le32_to_cpu(header->magic_number) == + VERITY_METADATA_MAGIC_DISABLE) { + retval = VERITY_STATE_DISABLE; + return retval; + } + + if (!(le32_to_cpu(header->magic_number) == + VERITY_METADATA_MAGIC_NUMBER) || + (le32_to_cpu(header->magic_number) == + VERITY_METADATA_MAGIC_DISABLE)) { + DMERR("Incorrect magic number"); + return retval; + } + + if (le32_to_cpu(header->protocol_version) != + VERITY_METADATA_VERSION) { + DMERR("Unsupported version %u", + le32_to_cpu(header->protocol_version)); + return retval; + } + + return 0; +} + +static int verify_verity_signature(char *key_id, + struct android_metadata *metadata) +{ + key_ref_t key_ref; + struct key *key; + struct public_key_signature *pks = NULL; + int retval = -EINVAL; + + key_ref = keyring_search(make_key_ref(system_trusted_keyring, 1), + &key_type_asymmetric, key_id); + + if (IS_ERR(key_ref)) { + DMERR("keyring: key not found"); + return -ENOKEY; + } + + key = key_ref_to_ptr(key_ref); + + pks = table_make_digest(HASH_ALGO_SHA256, + (const void *)metadata->verity_table, + le32_to_cpu(metadata->header->table_length)); + + if (IS_ERR(pks)) { + DMERR("hashing failed"); + goto error; + } + + retval = table_extract_mpi_array(pks, &metadata->header->signature[0], + RSANUMBYTES); + if (retval < 0) { + DMERR("Error extracting mpi %d", retval); + goto error; + } + + retval = verify_signature(key, pks); + mpi_free(pks->rsa.s); +error: + kfree(pks); + key_put(key); + + return retval; +} + +static void handle_error(void) +{ + int mode = verity_mode(); + if (mode == DM_VERITY_MODE_RESTART) { + DMERR("triggering restart"); + kernel_restart("dm-verity device corrupted"); + } else { + DMERR("Mounting verity root failed"); + } +} + +static inline bool test_mult_overflow(sector_t a, u32 b) +{ + sector_t r = (sector_t)~0ULL; + + sector_div(r, b); + return a > r; +} + +static int add_as_linear_device(struct dm_target *ti, char *dev) +{ + /*Move to linear mapping defines*/ + char *linear_table_args[DM_LINEAR_ARGS] = {dev, + DM_LINEAR_TARGET_OFFSET}; + int err = 0; + + android_verity_target.dtr = dm_linear_dtr, + android_verity_target.map = dm_linear_map, + android_verity_target.status = dm_linear_status, + android_verity_target.ioctl = dm_linear_ioctl, + android_verity_target.merge = dm_linear_merge, + android_verity_target.iterate_devices = dm_linear_iterate_devices, + android_verity_target.io_hints = NULL; + + err = dm_linear_ctr(ti, DM_LINEAR_ARGS, linear_table_args); + + if (!err) { + DMINFO("Added android-verity as a linear target"); + target_added = true; + } else + DMERR("Failed to add android-verity as linear target"); + + return err; +} + +/* + * Target parameters: + * Key id of the public key in the system keyring. + * Verity metadata's signature would be verified against + * this. If the key id contains spaces, replace them + * with '#'. + * The block device for which dm-verity is being setup. + */ +static int android_verity_ctr(struct dm_target *ti, unsigned argc, char **argv) +{ + dev_t uninitialized_var(dev); + struct android_metadata *uninitialized_var(metadata); + int err = 0, i, mode; + char *key_id, *table_ptr, dummy, + *verity_table_args[VERITY_TABLE_ARGS + 2 + VERITY_TABLE_OPT_FEC_ARGS]; + /* One for specifying number of opt args and one for mode */ + sector_t data_sectors; + u32 data_block_size; + unsigned int major, minor, + no_of_args = VERITY_TABLE_ARGS + 2 + VERITY_TABLE_OPT_FEC_ARGS; + struct fec_header uninitialized_var(fec); + struct fec_ecc_metadata uninitialized_var(ecc); + char buf[FEC_ARG_LENGTH], *buf_ptr; + unsigned long long tmpll; + + if (argc != 2) { + DMERR("Incorrect number of arguments"); + handle_error(); + return -EINVAL; + } + + /* should come as one of the arguments for the verity target */ + key_id = argv[0]; + strreplace(argv[0], '#', ' '); + + if (sscanf(argv[1], "%u:%u%c", &major, &minor, &dummy) == 2) { + dev = MKDEV(major, minor); + if (MAJOR(dev) != major || MINOR(dev) != minor) { + DMERR("Incorrect bdev major minor number"); + handle_error(); + return -EOVERFLOW; + } + } + + DMINFO("key:%s dev:%s", argv[0], argv[1]); + + if (extract_fec_header(dev, &fec, &ecc)) { + DMERR("Error while extracting fec header"); + handle_error(); + return -EINVAL; + } + + metadata = extract_metadata(dev, &fec); + + if (IS_ERR(metadata)) { + DMERR("Error while extracting metadata"); + handle_error(); + return -EINVAL; + } + + err = verify_header(metadata->header); + + if (err == VERITY_STATE_DISABLE) { + DMERR("Mounting root with verity disabled"); + verity_enabled = false; + /* we would still have to parse the args to figure out + * the data blocks size. Or may be could map the entire + * partition similar to mounting the device. + */ + } else if (err) { + DMERR("Verity header handle error"); + handle_error(); + goto free_metadata; + } + + if (!verity_enabled) { + err = verify_verity_signature(key_id, metadata); + + if (err) { + DMERR("Signature verification failed"); + handle_error(); + goto free_metadata; + } else + DMINFO("Signature verification success"); + } + + table_ptr = metadata->verity_table; + + for (i = 0; i < VERITY_TABLE_ARGS; i++) { + verity_table_args[i] = strsep(&table_ptr, " "); + if (verity_table_args[i] == NULL) + break; + } + + if (i != VERITY_TABLE_ARGS) { + DMERR("Verity table not in the expected format"); + err = -EINVAL; + handle_error(); + goto free_metadata; + } + + if (sscanf(verity_table_args[5], "%llu%c", &tmpll, &dummy) + != 1) { + DMERR("Verity table not in the expected format"); + handle_error(); + err = -EINVAL; + goto free_metadata; + } + + if (tmpll > ULONG_MAX) { + DMERR(" too large. Forgot to turn on CONFIG_LBDAF?"); + handle_error(); + err = -EINVAL; + goto free_metadata; + } + + data_sectors = tmpll; + + if (sscanf(verity_table_args[3], "%u%c", &data_block_size, &dummy) + != 1) { + DMERR("Verity table not in the expected format"); + handle_error(); + err = -EINVAL; + goto free_metadata; + } + + if (test_mult_overflow(data_sectors, data_block_size >> + SECTOR_SHIFT)) { + DMERR("data_sectors too large"); + handle_error(); + err = -EOVERFLOW; + goto free_metadata; + } + + data_sectors *= data_block_size >> SECTOR_SHIFT; + DMINFO("Data sectors %llu", (unsigned long long)data_sectors); + + /* update target length */ + ti->len = data_sectors; + + /* Setup linear target and free */ + if (!verity_enabled) { + err = add_as_linear_device(ti, argv[1]); + goto free_metadata; + } + + /*substitute data_dev and hash_dev*/ + verity_table_args[1] = argv[1]; + verity_table_args[2] = argv[1]; + + mode = verity_mode(); + + if (ecc.valid && IS_BUILTIN(CONFIG_DM_VERITY_FEC)) { + if (mode) { + err = snprintf(buf, FEC_ARG_LENGTH, + "%u %s " VERITY_TABLE_OPT_FEC_FORMAT, + 1 + VERITY_TABLE_OPT_FEC_ARGS, + mode == DM_VERITY_MODE_RESTART ? + VERITY_TABLE_OPT_RESTART : VERITY_TABLE_OPT_LOGGING, + argv[1], ecc.start / FEC_BLOCK_SIZE, ecc.blocks, + ecc.roots); + } else { + err = snprintf(buf, FEC_ARG_LENGTH, + "%u " VERITY_TABLE_OPT_FEC_FORMAT, + VERITY_TABLE_OPT_FEC_ARGS, argv[1], + ecc.start / FEC_BLOCK_SIZE, ecc.blocks, ecc.roots); + } + } else if (mode) { + err = snprintf(buf, FEC_ARG_LENGTH, + "2 " VERITY_TABLE_OPT_IGNZERO " %s", + mode == DM_VERITY_MODE_RESTART ? + VERITY_TABLE_OPT_RESTART : VERITY_TABLE_OPT_LOGGING); + } else { + err = snprintf(buf, FEC_ARG_LENGTH, "1 %s", + "ignore_zero_blocks"); + } + + if (err < 0 || err >= FEC_ARG_LENGTH) + goto free_metadata; + + buf_ptr = buf; + + for (i = VERITY_TABLE_ARGS; i < (VERITY_TABLE_ARGS + + VERITY_TABLE_OPT_FEC_ARGS + 2); i++) { + verity_table_args[i] = strsep(&buf_ptr, " "); + if (verity_table_args[i] == NULL) { + no_of_args = i; + break; + } + } + + err = verity_ctr(ti, no_of_args, verity_table_args); + + if (err) + DMERR("android-verity failed to mount as verity target"); + else { + target_added = true; + DMINFO("android-verity mounted as verity target"); + } + +free_metadata: + kfree(metadata->header); + kfree(metadata->verity_table); + kfree(metadata); + return err; +} + +static int __init dm_android_verity_init(void) +{ + int r; + struct dentry *file; + + r = dm_register_target(&android_verity_target); + if (r < 0) + DMERR("register failed %d", r); + + /* Tracks the status of the last added target */ + debug_dir = debugfs_create_dir("android_verity", NULL); + + if (IS_ERR_OR_NULL(debug_dir)) { + DMERR("Cannot create android_verity debugfs directory: %ld", + PTR_ERR(debug_dir)); + goto end; + } + + file = debugfs_create_bool("target_added", S_IRUGO, debug_dir, + (u32 *)&target_added); + + if (IS_ERR_OR_NULL(file)) { + DMERR("Cannot create android_verity debugfs directory: %ld", + PTR_ERR(debug_dir)); + debugfs_remove_recursive(debug_dir); + goto end; + } + + file = debugfs_create_bool("verity_enabled", S_IRUGO, debug_dir, + (u32 *)&verity_enabled); + + if (IS_ERR_OR_NULL(file)) { + DMERR("Cannot create android_verity debugfs directory: %ld", + PTR_ERR(debug_dir)); + debugfs_remove_recursive(debug_dir); + } + +end: + return r; +} + +static void __exit dm_android_verity_exit(void) +{ + if (!IS_ERR_OR_NULL(debug_dir)) + debugfs_remove_recursive(debug_dir); + + dm_unregister_target(&android_verity_target); +} + +module_init(dm_android_verity_init); +module_exit(dm_android_verity_exit); diff --git a/drivers/md/dm-android-verity.h b/drivers/md/dm-android-verity.h new file mode 100644 index 0000000000000..efb7965248968 --- /dev/null +++ b/drivers/md/dm-android-verity.h @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2015 Google, Inc. + * + * 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. + * + */ + +#ifndef DM_ANDROID_VERITY_H +#define DM_ANDROID_VERITY_H + +#include + +#define RSANUMBYTES 256 +#define VERITY_METADATA_MAGIC_NUMBER 0xb001b001 +#define VERITY_METADATA_MAGIC_DISABLE 0x46464f56 +#define VERITY_METADATA_VERSION 0 +#define VERITY_STATE_DISABLE 1 +#define DATA_BLOCK_SIZE (4 * 1024) +#define VERITY_METADATA_SIZE (8 * DATA_BLOCK_SIZE) +#define VERITY_TABLE_ARGS 10 +#define VERITY_COMMANDLINE_PARAM_LENGTH 20 + +#define FEC_MAGIC 0xFECFECFE +#define FEC_BLOCK_SIZE (4 * 1024) +#define FEC_VERSION 0 +#define FEC_RSM 255 +#define FEC_ARG_LENGTH 300 + +#define VERITY_TABLE_OPT_RESTART "restart_on_corruption" +#define VERITY_TABLE_OPT_LOGGING "ignore_corruption" +#define VERITY_TABLE_OPT_IGNZERO "ignore_zero_blocks" + +#define VERITY_TABLE_OPT_FEC_FORMAT \ + "use_fec_from_device %s fec_start %llu fec_blocks %llu fec_roots %u ignore_zero_blocks" +#define VERITY_TABLE_OPT_FEC_ARGS 9 + +#define VERITY_DEBUG 0 + +#define DM_MSG_PREFIX "android-verity" + +#define DM_LINEAR_ARGS 2 +#define DM_LINEAR_TARGET_OFFSET "0" + +/* + * There can be two formats. + * if fec is present + * + * if fec is not present + * + */ +/* TODO: rearrange structure to reduce memory holes + * depends on userspace change. + */ +struct fec_header { + __le32 magic; + __le32 version; + __le32 size; + __le32 roots; + __le32 fec_size; + __le64 inp_size; + u8 hash[SHA256_DIGEST_SIZE]; +}; + +struct android_metadata_header { + __le32 magic_number; + __le32 protocol_version; + char signature[RSANUMBYTES]; + __le32 table_length; +}; + +struct android_metadata { + struct android_metadata_header *header; + char *verity_table; +}; + +struct fec_ecc_metadata { + bool valid; + u32 roots; + u64 blocks; + u64 rounds; + u64 start; +}; + +struct bio_read { + struct page **page_io; + int number_of_pages; +}; + +extern struct target_type linear_target; + +extern void dm_linear_dtr(struct dm_target *ti); +extern int dm_linear_map(struct dm_target *ti, struct bio *bio); +extern void dm_linear_status(struct dm_target *ti, status_type_t type, + unsigned status_flags, char *result, unsigned maxlen); +extern int dm_linear_ioctl(struct dm_target *ti, unsigned int cmd, + unsigned long arg); +extern int dm_linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, + struct bio_vec *biovec, int max_size); +extern int dm_linear_iterate_devices(struct dm_target *ti, + iterate_devices_callout_fn fn, void *data); +extern int dm_linear_ctr(struct dm_target *ti, unsigned int argc, char **argv); +#endif /* DM_ANDROID_VERITY_H */ diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 1d9628bc8c92e..755050e5587fd 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c @@ -1839,7 +1839,7 @@ static int ctl_ioctl(uint command, struct dm_ioctl __user *user) if (r) goto out; - param->data_size = sizeof(*param); + param->data_size = offsetof(struct dm_ioctl, data); r = fn(param, input_param_size); if (unlikely(param->flags & DM_BUFFER_FULL_FLAG) && diff --git a/drivers/md/dm-linear.c b/drivers/md/dm-linear.c index 53e848c109393..d42f1093ad60f 100644 --- a/drivers/md/dm-linear.c +++ b/drivers/md/dm-linear.c @@ -25,7 +25,7 @@ struct linear_c { /* * Construct a linear mapping: */ -static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv) +int dm_linear_ctr(struct dm_target *ti, unsigned int argc, char **argv) { struct linear_c *lc; unsigned long long tmp; @@ -64,7 +64,7 @@ static int linear_ctr(struct dm_target *ti, unsigned int argc, char **argv) return -EINVAL; } -static void linear_dtr(struct dm_target *ti) +void dm_linear_dtr(struct dm_target *ti) { struct linear_c *lc = (struct linear_c *) ti->private; @@ -89,14 +89,14 @@ static void linear_map_bio(struct dm_target *ti, struct bio *bio) linear_map_sector(ti, bio->bi_iter.bi_sector); } -static int linear_map(struct dm_target *ti, struct bio *bio) +int dm_linear_map(struct dm_target *ti, struct bio *bio) { linear_map_bio(ti, bio); return DM_MAPIO_REMAPPED; } -static void linear_status(struct dm_target *ti, status_type_t type, +void dm_linear_status(struct dm_target *ti, status_type_t type, unsigned status_flags, char *result, unsigned maxlen) { struct linear_c *lc = (struct linear_c *) ti->private; @@ -113,7 +113,7 @@ static void linear_status(struct dm_target *ti, status_type_t type, } } -static int linear_ioctl(struct dm_target *ti, unsigned int cmd, +int dm_linear_ioctl(struct dm_target *ti, unsigned int cmd, unsigned long arg) { struct linear_c *lc = (struct linear_c *) ti->private; @@ -130,7 +130,7 @@ static int linear_ioctl(struct dm_target *ti, unsigned int cmd, return r ? : __blkdev_driver_ioctl(dev->bdev, dev->mode, cmd, arg); } -static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, +int dm_linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, struct bio_vec *biovec, int max_size) { struct linear_c *lc = ti->private; @@ -145,7 +145,7 @@ static int linear_merge(struct dm_target *ti, struct bvec_merge_data *bvm, return min(max_size, q->merge_bvec_fn(q, bvm, biovec)); } -static int linear_iterate_devices(struct dm_target *ti, +int dm_linear_iterate_devices(struct dm_target *ti, iterate_devices_callout_fn fn, void *data) { struct linear_c *lc = ti->private; @@ -157,13 +157,13 @@ static struct target_type linear_target = { .name = "linear", .version = {1, 2, 1}, .module = THIS_MODULE, - .ctr = linear_ctr, - .dtr = linear_dtr, - .map = linear_map, - .status = linear_status, - .ioctl = linear_ioctl, - .merge = linear_merge, - .iterate_devices = linear_iterate_devices, + .ctr = dm_linear_ctr, + .dtr = dm_linear_dtr, + .map = dm_linear_map, + .status = dm_linear_status, + .ioctl = dm_linear_ioctl, + .merge = dm_linear_merge, + .iterate_devices = dm_linear_iterate_devices, }; int __init dm_linear_init(void) diff --git a/drivers/md/dm-verity-fec.c b/drivers/md/dm-verity-fec.c new file mode 100644 index 0000000000000..ad10d6d8ed28d --- /dev/null +++ b/drivers/md/dm-verity-fec.c @@ -0,0 +1,861 @@ +/* + * Copyright (C) 2015 Google, Inc. + * + * Author: Sami Tolvanen + * + * 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 "dm-verity-fec.h" +#include +#include + +#define DM_MSG_PREFIX "verity-fec" + +/* + * If error correction has been configured, returns true. + */ +bool verity_fec_is_enabled(struct dm_verity *v) +{ + return v->fec && v->fec->dev; +} + +/* + * Return a pointer to dm_verity_fec_io after dm_verity_io and its variable + * length fields. + */ +static inline struct dm_verity_fec_io *fec_io(struct dm_verity_io *io) +{ + return (struct dm_verity_fec_io *) verity_io_digest_end(io->v, io); +} + +/* + * Return an interleaved offset for a byte in RS block. + */ +static inline u64 fec_interleave(struct dm_verity *v, u64 offset) +{ + u32 mod; + + mod = do_div(offset, v->fec->rsn); + return offset + mod * (v->fec->rounds << v->data_dev_block_bits); +} + +/* + * Decode an RS block using Reed-Solomon. + */ +static int fec_decode_rs8(struct dm_verity *v, struct dm_verity_fec_io *fio, + u8 *data, u8 *fec, int neras) +{ + int i; + uint16_t par[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN]; + + for (i = 0; i < v->fec->roots; i++) + par[i] = fec[i]; + + return decode_rs8(fio->rs, data, par, v->fec->rsn, NULL, neras, + fio->erasures, 0, NULL); +} + +/* + * Read error-correcting codes for the requested RS block. Returns a pointer + * to the data block. Caller is responsible for releasing buf. + */ +static u8 *fec_read_parity(struct dm_verity *v, u64 rsb, int index, + unsigned *offset, struct dm_buffer **buf) +{ + u64 position, block; + u8 *res; + + position = (index + rsb) * v->fec->roots; + block = position >> v->data_dev_block_bits; + *offset = (unsigned)(position - (block << v->data_dev_block_bits)); + + res = dm_bufio_read(v->fec->bufio, v->fec->start + block, buf); + if (unlikely(IS_ERR(res))) { + DMERR("%s: FEC %llu: parity read failed (block %llu): %ld", + v->data_dev->name, (unsigned long long)rsb, + (unsigned long long)(v->fec->start + block), + PTR_ERR(res)); + *buf = NULL; + } + + return res; +} + +/* Loop over each preallocated buffer slot. */ +#define fec_for_each_prealloc_buffer(__i) \ + for (__i = 0; __i < DM_VERITY_FEC_BUF_PREALLOC; __i++) + +/* Loop over each extra buffer slot. */ +#define fec_for_each_extra_buffer(io, __i) \ + for (__i = DM_VERITY_FEC_BUF_PREALLOC; __i < DM_VERITY_FEC_BUF_MAX; __i++) + +/* Loop over each allocated buffer. */ +#define fec_for_each_buffer(io, __i) \ + for (__i = 0; __i < (io)->nbufs; __i++) + +/* Loop over each RS block in each allocated buffer. */ +#define fec_for_each_buffer_rs_block(io, __i, __j) \ + fec_for_each_buffer(io, __i) \ + for (__j = 0; __j < 1 << DM_VERITY_FEC_BUF_RS_BITS; __j++) + +/* + * Return a pointer to the current RS block when called inside + * fec_for_each_buffer_rs_block. + */ +static inline u8 *fec_buffer_rs_block(struct dm_verity *v, + struct dm_verity_fec_io *fio, + unsigned i, unsigned j) +{ + return &fio->bufs[i][j * v->fec->rsn]; +} + +/* + * Return an index to the current RS block when called inside + * fec_for_each_buffer_rs_block. + */ +static inline unsigned fec_buffer_rs_index(unsigned i, unsigned j) +{ + return (i << DM_VERITY_FEC_BUF_RS_BITS) + j; +} + +/* + * Decode all RS blocks from buffers and copy corrected bytes into fio->output + * starting from block_offset. + */ +static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio, + u64 rsb, int byte_index, unsigned block_offset, + int neras) +{ + int r, corrected = 0, res; + struct dm_buffer *buf; + unsigned n, i, offset; + u8 *par, *block; + + par = fec_read_parity(v, rsb, block_offset, &offset, &buf); + if (IS_ERR(par)) + return PTR_ERR(par); + + /* + * Decode the RS blocks we have in bufs. Each RS block results in + * one corrected target byte and consumes fec->roots parity bytes. + */ + fec_for_each_buffer_rs_block(fio, n, i) { + block = fec_buffer_rs_block(v, fio, n, i); + res = fec_decode_rs8(v, fio, block, &par[offset], neras); + if (res < 0) { + dm_bufio_release(buf); + + r = res; + goto error; + } + + corrected += res; + fio->output[block_offset] = block[byte_index]; + + block_offset++; + if (block_offset >= 1 << v->data_dev_block_bits) + goto done; + + /* read the next block when we run out of parity bytes */ + offset += v->fec->roots; + if (offset >= 1 << v->data_dev_block_bits) { + dm_bufio_release(buf); + + par = fec_read_parity(v, rsb, block_offset, &offset, &buf); + if (unlikely(IS_ERR(par))) + return PTR_ERR(par); + } + } +done: + r = corrected; +error: + if (r < 0 && neras) + DMERR_LIMIT("%s: FEC %llu: failed to correct: %d", + v->data_dev->name, (unsigned long long)rsb, r); + else if (r > 0) { + DMWARN_LIMIT("%s: FEC %llu: corrected %d errors", + v->data_dev->name, (unsigned long long)rsb, r); + atomic_add_unless(&v->fec->corrected, 1, INT_MAX); + } + + return r; +} + +/* + * Locate data block erasures using verity hashes. + */ +static int fec_is_erasure(struct dm_verity *v, struct dm_verity_io *io, + u8 *want_digest, u8 *data) +{ + if (unlikely(verity_hash(v, verity_io_hash_desc(v, io), + data, 1 << v->data_dev_block_bits, + verity_io_real_digest(v, io)))) + return 0; + + return memcmp(verity_io_real_digest(v, io), want_digest, + v->digest_size) != 0; +} + +/* + * Read data blocks that are part of the RS block and deinterleave as much as + * fits into buffers. Check for erasure locations if @neras is non-NULL. + */ +static int fec_read_bufs(struct dm_verity *v, struct dm_verity_io *io, + u64 rsb, u64 target, unsigned block_offset, + int *neras) +{ + bool is_zero; + int i, j, target_index = -1; + struct dm_buffer *buf; + struct dm_bufio_client *bufio; + struct dm_verity_fec_io *fio = fec_io(io); + u64 block, ileaved; + u8 *bbuf, *rs_block; + u8 want_digest[v->digest_size]; + unsigned n, k; + + if (neras) + *neras = 0; + + /* + * read each of the rsn data blocks that are part of the RS block, and + * interleave contents to available bufs + */ + for (i = 0; i < v->fec->rsn; i++) { + ileaved = fec_interleave(v, rsb * v->fec->rsn + i); + + /* + * target is the data block we want to correct, target_index is + * the index of this block within the rsn RS blocks + */ + if (ileaved == target) + target_index = i; + + block = ileaved >> v->data_dev_block_bits; + bufio = v->fec->data_bufio; + + if (block >= v->data_blocks) { + block -= v->data_blocks; + + /* + * blocks outside the area were assumed to contain + * zeros when encoding data was generated + */ + if (unlikely(block >= v->fec->hash_blocks)) + continue; + + block += v->hash_start; + bufio = v->bufio; + } + + bbuf = dm_bufio_read(bufio, block, &buf); + if (unlikely(IS_ERR(bbuf))) { + DMWARN_LIMIT("%s: FEC %llu: read failed (%llu): %ld", + v->data_dev->name, + (unsigned long long)rsb, + (unsigned long long)block, PTR_ERR(bbuf)); + + /* assume the block is corrupted */ + if (neras && *neras <= v->fec->roots) + fio->erasures[(*neras)++] = i; + + continue; + } + + /* locate erasures if the block is on the data device */ + if (bufio == v->fec->data_bufio && + verity_hash_for_block(v, io, block, want_digest, + &is_zero) == 0) { + /* skip known zero blocks entirely */ + if (is_zero) + continue; + + /* + * skip if we have already found the theoretical + * maximum number (i.e. fec->roots) of erasures + */ + if (neras && *neras <= v->fec->roots && + fec_is_erasure(v, io, want_digest, bbuf)) + fio->erasures[(*neras)++] = i; + } + + /* + * deinterleave and copy the bytes that fit into bufs, + * starting from block_offset + */ + fec_for_each_buffer_rs_block(fio, n, j) { + k = fec_buffer_rs_index(n, j) + block_offset; + + if (k >= 1 << v->data_dev_block_bits) + goto done; + + rs_block = fec_buffer_rs_block(v, fio, n, j); + rs_block[i] = bbuf[k]; + } +done: + dm_bufio_release(buf); + } + + return target_index; +} + +/* + * Allocate RS control structure and FEC buffers from preallocated mempools, + * and attempt to allocate as many extra buffers as available. + */ +static int fec_alloc_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio) +{ + unsigned n; + + if (!fio->rs) { + fio->rs = mempool_alloc(v->fec->rs_pool, 0); + if (unlikely(!fio->rs)) { + DMERR("failed to allocate RS"); + return -ENOMEM; + } + } + + fec_for_each_prealloc_buffer(n) { + if (fio->bufs[n]) + continue; + + fio->bufs[n] = mempool_alloc(v->fec->prealloc_pool, GFP_NOIO); + if (unlikely(!fio->bufs[n])) { + DMERR("failed to allocate FEC buffer"); + return -ENOMEM; + } + } + + /* try to allocate the maximum number of buffers */ + fec_for_each_extra_buffer(fio, n) { + if (fio->bufs[n]) + continue; + + fio->bufs[n] = mempool_alloc(v->fec->extra_pool, GFP_NOIO); + /* we can manage with even one buffer if necessary */ + if (unlikely(!fio->bufs[n])) + break; + } + fio->nbufs = n; + + if (!fio->output) { + fio->output = mempool_alloc(v->fec->output_pool, GFP_NOIO); + + if (!fio->output) { + DMERR("failed to allocate FEC page"); + return -ENOMEM; + } + } + + return 0; +} + +/* + * Initialize buffers and clear erasures. fec_read_bufs() assumes buffers are + * zeroed before deinterleaving. + */ +static void fec_init_bufs(struct dm_verity *v, struct dm_verity_fec_io *fio) +{ + unsigned n; + + fec_for_each_buffer(fio, n) + memset(fio->bufs[n], 0, v->fec->rsn << DM_VERITY_FEC_BUF_RS_BITS); + + memset(fio->erasures, 0, sizeof(fio->erasures)); +} + +/* + * Decode all RS blocks in a single data block and return the target block + * (indicated by @offset) in fio->output. If @use_erasures is non-zero, uses + * hashes to locate erasures. + */ +static int fec_decode_rsb(struct dm_verity *v, struct dm_verity_io *io, + struct dm_verity_fec_io *fio, u64 rsb, u64 offset, + bool use_erasures) +{ + int r, neras = 0; + unsigned pos; + + r = fec_alloc_bufs(v, fio); + if (unlikely(r < 0)) + return r; + + for (pos = 0; pos < 1 << v->data_dev_block_bits; ) { + fec_init_bufs(v, fio); + + r = fec_read_bufs(v, io, rsb, offset, pos, + use_erasures ? &neras : NULL); + if (unlikely(r < 0)) + return r; + + r = fec_decode_bufs(v, fio, rsb, r, pos, neras); + if (r < 0) + return r; + + pos += fio->nbufs << DM_VERITY_FEC_BUF_RS_BITS; + } + + /* Always re-validate the corrected block against the expected hash */ + r = verity_hash(v, verity_io_hash_desc(v, io), fio->output, + 1 << v->data_dev_block_bits, + verity_io_real_digest(v, io)); + if (unlikely(r < 0)) + return r; + + if (memcmp(verity_io_real_digest(v, io), verity_io_want_digest(v, io), + v->digest_size)) { + DMERR_LIMIT("%s: FEC %llu: failed to correct (%d erasures)", + v->data_dev->name, (unsigned long long)rsb, neras); + return -EILSEQ; + } + + return 0; +} + +static int fec_bv_copy(struct dm_verity *v, struct dm_verity_io *io, u8 *data, + size_t len) +{ + struct dm_verity_fec_io *fio = fec_io(io); + + memcpy(data, &fio->output[fio->output_pos], len); + fio->output_pos += len; + + return 0; +} + +/* + * Correct errors in a block. Copies corrected block to dest if non-NULL, + * otherwise to a bio_vec starting from iter. + */ +int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io, + enum verity_block_type type, sector_t block, u8 *dest, + struct bvec_iter *iter) +{ + int r; + struct dm_verity_fec_io *fio = fec_io(io); + u64 offset, res, rsb; + + if (!verity_fec_is_enabled(v)) + return -EOPNOTSUPP; + + if (type == DM_VERITY_BLOCK_TYPE_METADATA) + block += v->data_blocks; + + /* + * For RS(M, N), the continuous FEC data is divided into blocks of N + * bytes. Since block size may not be divisible by N, the last block + * is zero padded when decoding. + * + * Each byte of the block is covered by a different RS(M, N) code, + * and each code is interleaved over N blocks to make it less likely + * that bursty corruption will leave us in unrecoverable state. + */ + + offset = block << v->data_dev_block_bits; + + res = offset; + div64_u64(res, v->fec->rounds << v->data_dev_block_bits); + + /* + * The base RS block we can feed to the interleaver to find out all + * blocks required for decoding. + */ + rsb = offset - res * (v->fec->rounds << v->data_dev_block_bits); + + /* + * Locating erasures is slow, so attempt to recover the block without + * them first. Do a second attempt with erasures if the corruption is + * bad enough. + */ + r = fec_decode_rsb(v, io, fio, rsb, offset, false); + if (r < 0) { + r = fec_decode_rsb(v, io, fio, rsb, offset, true); + if (r < 0) + return r; + } + + if (dest) + memcpy(dest, fio->output, 1 << v->data_dev_block_bits); + else if (iter) { + fio->output_pos = 0; + r = verity_for_bv_block(v, io, iter, fec_bv_copy); + } + + return r; +} + +/* + * Clean up per-bio data. + */ +void verity_fec_finish_io(struct dm_verity_io *io) +{ + unsigned n; + struct dm_verity_fec *f = io->v->fec; + struct dm_verity_fec_io *fio = fec_io(io); + + if (!verity_fec_is_enabled(io->v)) + return; + + mempool_free(fio->rs, f->rs_pool); + + fec_for_each_prealloc_buffer(n) + mempool_free(fio->bufs[n], f->prealloc_pool); + + fec_for_each_extra_buffer(fio, n) + mempool_free(fio->bufs[n], f->extra_pool); + + mempool_free(fio->output, f->output_pool); +} + +/* + * Initialize per-bio data. + */ +void verity_fec_init_io(struct dm_verity_io *io) +{ + struct dm_verity_fec_io *fio = fec_io(io); + + if (!verity_fec_is_enabled(io->v)) + return; + + fio->rs = NULL; + memset(fio->bufs, 0, sizeof(fio->bufs)); + fio->nbufs = 0; + fio->output = NULL; +} + +/* + * Append feature arguments and values to the status table. + */ +unsigned verity_fec_status_table(struct dm_verity *v, unsigned sz, + char *result, unsigned maxlen) +{ + if (!verity_fec_is_enabled(v)) + return sz; + + DMEMIT(" " DM_VERITY_OPT_FEC_DEV " %s " + DM_VERITY_OPT_FEC_BLOCKS " %llu " + DM_VERITY_OPT_FEC_START " %llu " + DM_VERITY_OPT_FEC_ROOTS " %d", + v->fec->dev->name, + (unsigned long long)v->fec->blocks, + (unsigned long long)v->fec->start, + v->fec->roots); + + return sz; +} + +void verity_fec_dtr(struct dm_verity *v) +{ + struct dm_verity_fec *f = v->fec; + struct kobject *kobj = &f->kobj_holder.kobj; + + if (!verity_fec_is_enabled(v)) + goto out; + + mempool_destroy(f->rs_pool); + mempool_destroy(f->prealloc_pool); + mempool_destroy(f->extra_pool); + kmem_cache_destroy(f->cache); + + if (f->data_bufio) + dm_bufio_client_destroy(f->data_bufio); + if (f->bufio) + dm_bufio_client_destroy(f->bufio); + + if (f->dev) + dm_put_device(v->ti, f->dev); + + if (kobj->state_initialized) { + kobject_put(kobj); + wait_for_completion(dm_get_completion_from_kobject(kobj)); + } + +out: + kfree(f); + v->fec = NULL; +} + +static void *fec_rs_alloc(gfp_t gfp_mask, void *pool_data) +{ + struct dm_verity *v = (struct dm_verity *)pool_data; + + return init_rs(8, 0x11d, 0, 1, v->fec->roots); +} + +static void fec_rs_free(void *element, void *pool_data) +{ + struct rs_control *rs = (struct rs_control *)element; + + if (rs) + free_rs(rs); +} + +bool verity_is_fec_opt_arg(const char *arg_name) +{ + return (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_DEV) || + !strcasecmp(arg_name, DM_VERITY_OPT_FEC_BLOCKS) || + !strcasecmp(arg_name, DM_VERITY_OPT_FEC_START) || + !strcasecmp(arg_name, DM_VERITY_OPT_FEC_ROOTS)); +} + +int verity_fec_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v, + unsigned *argc, const char *arg_name) +{ + int r; + struct dm_target *ti = v->ti; + const char *arg_value; + unsigned long long num_ll; + unsigned char num_c; + char dummy; + + if (!*argc) { + ti->error = "FEC feature arguments require a value"; + return -EINVAL; + } + + arg_value = dm_shift_arg(as); + (*argc)--; + + if (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_DEV)) { + r = dm_get_device(ti, arg_value, FMODE_READ, &v->fec->dev); + if (r) { + ti->error = "FEC device lookup failed"; + return r; + } + + } else if (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_BLOCKS)) { + if (sscanf(arg_value, "%llu%c", &num_ll, &dummy) != 1 || + ((sector_t)(num_ll << (v->data_dev_block_bits - SECTOR_SHIFT)) + >> (v->data_dev_block_bits - SECTOR_SHIFT) != num_ll)) { + ti->error = "Invalid " DM_VERITY_OPT_FEC_BLOCKS; + return -EINVAL; + } + v->fec->blocks = num_ll; + + } else if (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_START)) { + if (sscanf(arg_value, "%llu%c", &num_ll, &dummy) != 1 || + ((sector_t)(num_ll << (v->data_dev_block_bits - SECTOR_SHIFT)) >> + (v->data_dev_block_bits - SECTOR_SHIFT) != num_ll)) { + ti->error = "Invalid " DM_VERITY_OPT_FEC_START; + return -EINVAL; + } + v->fec->start = num_ll; + + } else if (!strcasecmp(arg_name, DM_VERITY_OPT_FEC_ROOTS)) { + if (sscanf(arg_value, "%hhu%c", &num_c, &dummy) != 1 || !num_c || + num_c < (DM_VERITY_FEC_RSM - DM_VERITY_FEC_MAX_RSN) || + num_c > (DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN)) { + ti->error = "Invalid " DM_VERITY_OPT_FEC_ROOTS; + return -EINVAL; + } + v->fec->roots = num_c; + + } else { + ti->error = "Unrecognized verity FEC feature request"; + return -EINVAL; + } + + return 0; +} + +static ssize_t corrected_show(struct kobject *kobj, struct kobj_attribute *attr, + char *buf) +{ + struct dm_verity_fec *f = container_of(kobj, struct dm_verity_fec, + kobj_holder.kobj); + + return sprintf(buf, "%d\n", atomic_read(&f->corrected)); +} + +static struct kobj_attribute attr_corrected = __ATTR_RO(corrected); + +static struct attribute *fec_attrs[] = { + &attr_corrected.attr, + NULL +}; + +static struct kobj_type fec_ktype = { + .sysfs_ops = &kobj_sysfs_ops, + .default_attrs = fec_attrs +}; + +/* + * Allocate dm_verity_fec for v->fec. Must be called before verity_fec_ctr. + */ +int verity_fec_ctr_alloc(struct dm_verity *v) +{ + struct dm_verity_fec *f; + + f = kzalloc(sizeof(struct dm_verity_fec), GFP_KERNEL); + if (!f) { + v->ti->error = "Cannot allocate FEC structure"; + return -ENOMEM; + } + v->fec = f; + + return 0; +} + +/* + * Validate arguments and preallocate memory. Must be called after arguments + * have been parsed using verity_fec_parse_opt_args. + */ +int verity_fec_ctr(struct dm_verity *v) +{ + int r; + struct dm_verity_fec *f = v->fec; + struct dm_target *ti = v->ti; + struct mapped_device *md = dm_table_get_md(ti->table); + u64 hash_blocks; + + if (!verity_fec_is_enabled(v)) { + verity_fec_dtr(v); + return 0; + } + + /* Create a kobject and sysfs attributes */ + init_completion(&f->kobj_holder.completion); + + r = kobject_init_and_add(&f->kobj_holder.kobj, &fec_ktype, + &disk_to_dev(dm_disk(md))->kobj, "%s", "fec"); + if (r) { + ti->error = "Cannot create kobject"; + return r; + } + + /* + * FEC is computed over data blocks, possible metadata, and + * hash blocks. In other words, FEC covers total of fec_blocks + * blocks consisting of the following: + * + * data blocks | hash blocks | metadata (optional) + * + * We allow metadata after hash blocks to support a use case + * where all data is stored on the same device and FEC covers + * the entire area. + * + * If metadata is included, we require it to be available on the + * hash device after the hash blocks. + */ + + hash_blocks = v->hash_blocks - v->hash_start; + + /* + * Require matching block sizes for data and hash devices for + * simplicity. + */ + if (v->data_dev_block_bits != v->hash_dev_block_bits) { + ti->error = "Block sizes must match to use FEC"; + return -EINVAL; + } + + if (!f->roots) { + ti->error = "Missing " DM_VERITY_OPT_FEC_ROOTS; + return -EINVAL; + } + f->rsn = DM_VERITY_FEC_RSM - f->roots; + + if (!f->blocks) { + ti->error = "Missing " DM_VERITY_OPT_FEC_BLOCKS; + return -EINVAL; + } + + f->rounds = f->blocks; + if (sector_div(f->rounds, f->rsn)) + f->rounds++; + + /* + * Due to optional metadata, f->blocks can be larger than + * data_blocks and hash_blocks combined. + */ + if (f->blocks < v->data_blocks + hash_blocks || !f->rounds) { + ti->error = "Invalid " DM_VERITY_OPT_FEC_BLOCKS; + return -EINVAL; + } + + /* + * Metadata is accessed through the hash device, so we require + * it to be large enough. + */ + f->hash_blocks = f->blocks - v->data_blocks; + if (dm_bufio_get_device_size(v->bufio) < f->hash_blocks) { + ti->error = "Hash device is too small for " + DM_VERITY_OPT_FEC_BLOCKS; + return -E2BIG; + } + + f->bufio = dm_bufio_client_create(f->dev->bdev, + 1 << v->data_dev_block_bits, + 1, 0, NULL, NULL); + if (IS_ERR(f->bufio)) { + ti->error = "Cannot initialize FEC bufio client"; + return PTR_ERR(f->bufio); + } + + if (dm_bufio_get_device_size(f->bufio) < + ((f->start + f->rounds * f->roots) >> v->data_dev_block_bits)) { + ti->error = "FEC device is too small"; + return -E2BIG; + } + + f->data_bufio = dm_bufio_client_create(v->data_dev->bdev, + 1 << v->data_dev_block_bits, + 1, 0, NULL, NULL); + if (IS_ERR(f->data_bufio)) { + ti->error = "Cannot initialize FEC data bufio client"; + return PTR_ERR(f->data_bufio); + } + + if (dm_bufio_get_device_size(f->data_bufio) < v->data_blocks) { + ti->error = "Data device is too small"; + return -E2BIG; + } + + /* Preallocate an rs_control structure for each worker thread */ + f->rs_pool = mempool_create(num_online_cpus(), fec_rs_alloc, + fec_rs_free, (void *) v); + if (!f->rs_pool) { + ti->error = "Cannot allocate RS pool"; + return -ENOMEM; + } + + f->cache = kmem_cache_create("dm_verity_fec_buffers", + f->rsn << DM_VERITY_FEC_BUF_RS_BITS, + 0, 0, NULL); + if (!f->cache) { + ti->error = "Cannot create FEC buffer cache"; + return -ENOMEM; + } + + /* Preallocate DM_VERITY_FEC_BUF_PREALLOC buffers for each thread */ + f->prealloc_pool = mempool_create_slab_pool(num_online_cpus() * + DM_VERITY_FEC_BUF_PREALLOC, + f->cache); + if (!f->prealloc_pool) { + ti->error = "Cannot allocate FEC buffer prealloc pool"; + return -ENOMEM; + } + + f->extra_pool = mempool_create_slab_pool(0, f->cache); + if (!f->extra_pool) { + ti->error = "Cannot allocate FEC buffer extra pool"; + return -ENOMEM; + } + + /* Preallocate an output buffer for each thread */ + f->output_pool = mempool_create_kmalloc_pool(num_online_cpus(), + 1 << v->data_dev_block_bits); + if (!f->output_pool) { + ti->error = "Cannot allocate FEC output pool"; + return -ENOMEM; + } + + /* Reserve space for our per-bio data */ + ti->per_bio_data_size += sizeof(struct dm_verity_fec_io); + + return 0; +} diff --git a/drivers/md/dm-verity-fec.h b/drivers/md/dm-verity-fec.h new file mode 100644 index 0000000000000..8c4bee052a735 --- /dev/null +++ b/drivers/md/dm-verity-fec.h @@ -0,0 +1,155 @@ +/* + * Copyright (C) 2015 Google, Inc. + * + * Author: Sami Tolvanen + * + * 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 DM_VERITY_FEC_H +#define DM_VERITY_FEC_H + +#include "dm.h" +#include "dm-verity.h" +#include + +/* Reed-Solomon(M, N) parameters */ +#define DM_VERITY_FEC_RSM 255 +#define DM_VERITY_FEC_MAX_RSN 253 +#define DM_VERITY_FEC_MIN_RSN 231 /* ~10% space overhead */ + +/* buffers for deinterleaving and decoding */ +#define DM_VERITY_FEC_BUF_PREALLOC 1 /* buffers to preallocate */ +#define DM_VERITY_FEC_BUF_RS_BITS 4 /* 1 << RS blocks per buffer */ +/* we need buffers for at most 1 << block size RS blocks */ +#define DM_VERITY_FEC_BUF_MAX \ + (1 << (PAGE_SHIFT - DM_VERITY_FEC_BUF_RS_BITS)) + +#define DM_VERITY_OPT_FEC_DEV "use_fec_from_device" +#define DM_VERITY_OPT_FEC_BLOCKS "fec_blocks" +#define DM_VERITY_OPT_FEC_START "fec_start" +#define DM_VERITY_OPT_FEC_ROOTS "fec_roots" + +/* configuration */ +struct dm_verity_fec { + struct dm_dev *dev; /* parity data device */ + struct dm_bufio_client *data_bufio; /* for data dev access */ + struct dm_bufio_client *bufio; /* for parity data access */ + sector_t start; /* parity data start in blocks */ + sector_t blocks; /* number of blocks covered */ + sector_t rounds; /* number of interleaving rounds */ + sector_t hash_blocks; /* blocks covered after v->hash_start */ + unsigned char roots; /* number of parity bytes, M-N of RS(M, N) */ + unsigned char rsn; /* N of RS(M, N) */ + mempool_t *rs_pool; /* mempool for fio->rs */ + mempool_t *prealloc_pool; /* mempool for preallocated buffers */ + mempool_t *extra_pool; /* mempool for extra buffers */ + mempool_t *output_pool; /* mempool for output */ + struct kmem_cache *cache; /* cache for buffers */ + atomic_t corrected; /* corrected errors */ + struct dm_kobject_holder kobj_holder; /* for sysfs attributes */ +}; + +/* per-bio data */ +struct dm_verity_fec_io { + struct rs_control *rs; /* Reed-Solomon state */ + int erasures[DM_VERITY_FEC_MAX_RSN]; /* erasures for decode_rs8 */ + u8 *bufs[DM_VERITY_FEC_BUF_MAX]; /* bufs for deinterleaving */ + unsigned nbufs; /* number of buffers allocated */ + u8 *output; /* buffer for corrected output */ + size_t output_pos; +}; + +#ifdef CONFIG_DM_VERITY_FEC + +/* each feature parameter requires a value */ +#define DM_VERITY_OPTS_FEC 8 + +extern bool verity_fec_is_enabled(struct dm_verity *v); + +extern int verity_fec_decode(struct dm_verity *v, struct dm_verity_io *io, + enum verity_block_type type, sector_t block, + u8 *dest, struct bvec_iter *iter); + +extern unsigned verity_fec_status_table(struct dm_verity *v, unsigned sz, + char *result, unsigned maxlen); + +extern void verity_fec_finish_io(struct dm_verity_io *io); +extern void verity_fec_init_io(struct dm_verity_io *io); + +extern bool verity_is_fec_opt_arg(const char *arg_name); +extern int verity_fec_parse_opt_args(struct dm_arg_set *as, + struct dm_verity *v, unsigned *argc, + const char *arg_name); + +extern void verity_fec_dtr(struct dm_verity *v); + +extern int verity_fec_ctr_alloc(struct dm_verity *v); +extern int verity_fec_ctr(struct dm_verity *v); + +#else /* !CONFIG_DM_VERITY_FEC */ + +#define DM_VERITY_OPTS_FEC 0 + +static inline bool verity_fec_is_enabled(struct dm_verity *v) +{ + return false; +} + +static inline int verity_fec_decode(struct dm_verity *v, + struct dm_verity_io *io, + enum verity_block_type type, + sector_t block, u8 *dest, + struct bvec_iter *iter) +{ + return -EOPNOTSUPP; +} + +static inline unsigned verity_fec_status_table(struct dm_verity *v, + unsigned sz, char *result, + unsigned maxlen) +{ + return sz; +} + +static inline void verity_fec_finish_io(struct dm_verity_io *io) +{ +} + +static inline void verity_fec_init_io(struct dm_verity_io *io) +{ +} + +static inline bool verity_is_fec_opt_arg(const char *arg_name) +{ + return false; +} + +static inline int verity_fec_parse_opt_args(struct dm_arg_set *as, + struct dm_verity *v, + unsigned *argc, + const char *arg_name) +{ + return -EINVAL; +} + +static inline void verity_fec_dtr(struct dm_verity *v) +{ +} + +static inline int verity_fec_ctr_alloc(struct dm_verity *v) +{ + return 0; +} + +static inline int verity_fec_ctr(struct dm_verity *v) +{ + return 0; +} + +#endif /* CONFIG_DM_VERITY_FEC */ + +#endif /* DM_VERITY_FEC_H */ diff --git a/drivers/md/dm-verity.c b/drivers/md/dm-verity-target.c similarity index 63% rename from drivers/md/dm-verity.c rename to drivers/md/dm-verity-target.c index 32a6a81305572..66d2ab3ec9b83 100644 --- a/drivers/md/dm-verity.c +++ b/drivers/md/dm-verity-target.c @@ -14,97 +14,30 @@ * access behavior. */ -#include "dm-bufio.h" +#include "dm-verity.h" +#include "dm-verity-fec.h" #include -#include #include -#include #define DM_MSG_PREFIX "verity" #define DM_VERITY_ENV_LENGTH 42 -#define DM_VERITY_ENV_VAR_NAME "VERITY_ERR_BLOCK_NR" +#define DM_VERITY_ENV_VAR_NAME "DM_VERITY_ERR_BLOCK_NR" -#define DM_VERITY_IO_VEC_INLINE 16 -#define DM_VERITY_MEMPOOL_SIZE 4 #define DM_VERITY_DEFAULT_PREFETCH_SIZE 262144 -#define DM_VERITY_MAX_LEVELS 63 #define DM_VERITY_MAX_CORRUPTED_ERRS 100 -static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE; - -module_param_named(prefetch_cluster, dm_verity_prefetch_cluster, uint, S_IRUGO | S_IWUSR); - -enum verity_mode { - DM_VERITY_MODE_EIO = 0, - DM_VERITY_MODE_LOGGING = 1, - DM_VERITY_MODE_RESTART = 2 -}; - -enum verity_block_type { - DM_VERITY_BLOCK_TYPE_DATA, - DM_VERITY_BLOCK_TYPE_METADATA -}; +#define DM_VERITY_OPT_LOGGING "ignore_corruption" +#define DM_VERITY_OPT_RESTART "restart_on_corruption" +#define DM_VERITY_OPT_IGN_ZEROES "ignore_zero_blocks" -struct dm_verity { - struct dm_dev *data_dev; - struct dm_dev *hash_dev; - struct dm_target *ti; - struct dm_bufio_client *bufio; - char *alg_name; - struct crypto_shash *tfm; - u8 *root_digest; /* digest of the root block */ - u8 *salt; /* salt: its size is salt_size */ - unsigned salt_size; - sector_t data_start; /* data offset in 512-byte sectors */ - sector_t hash_start; /* hash start in blocks */ - sector_t data_blocks; /* the number of data blocks */ - sector_t hash_blocks; /* the number of hash blocks */ - unsigned char data_dev_block_bits; /* log2(data blocksize) */ - unsigned char hash_dev_block_bits; /* log2(hash blocksize) */ - unsigned char hash_per_block_bits; /* log2(hashes in hash block) */ - unsigned char levels; /* the number of tree levels */ - unsigned char version; - unsigned digest_size; /* digest size for the current hash algorithm */ - unsigned shash_descsize;/* the size of temporary space for crypto */ - int hash_failed; /* set to 1 if hash of any block failed */ - enum verity_mode mode; /* mode for handling verification errors */ - unsigned corrupted_errs;/* Number of errors for corrupted blocks */ - - mempool_t *vec_mempool; /* mempool of bio vector */ - - struct workqueue_struct *verify_wq; - - /* starting blocks for each tree level. 0 is the lowest level. */ - sector_t hash_level_block[DM_VERITY_MAX_LEVELS]; -}; - -struct dm_verity_io { - struct dm_verity *v; - - /* original values of bio->bi_end_io and bio->bi_private */ - bio_end_io_t *orig_bi_end_io; - void *orig_bi_private; - - sector_t block; - unsigned n_blocks; +#define DM_VERITY_OPTS_MAX (2 + DM_VERITY_OPTS_FEC) - struct bvec_iter iter; - - struct work_struct work; +static unsigned dm_verity_prefetch_cluster = DM_VERITY_DEFAULT_PREFETCH_SIZE; - /* - * Three variably-size fields follow this struct: - * - * u8 hash_desc[v->shash_descsize]; - * u8 real_digest[v->digest_size]; - * u8 want_digest[v->digest_size]; - * - * To access them use: io_hash_desc(), io_real_digest() and io_want_digest(). - */ -}; +module_param_named(prefetch_cluster, dm_verity_prefetch_cluster, uint, S_IRUGO | S_IWUSR); struct dm_verity_prefetch_work { struct work_struct work; @@ -113,21 +46,6 @@ struct dm_verity_prefetch_work { unsigned n_blocks; }; -static struct shash_desc *io_hash_desc(struct dm_verity *v, struct dm_verity_io *io) -{ - return (struct shash_desc *)(io + 1); -} - -static u8 *io_real_digest(struct dm_verity *v, struct dm_verity_io *io) -{ - return (u8 *)(io + 1) + v->shash_descsize; -} - -static u8 *io_want_digest(struct dm_verity *v, struct dm_verity_io *io) -{ - return (u8 *)(io + 1) + v->shash_descsize + v->digest_size; -} - /* * Auxiliary structure appended to each dm-bufio buffer. If the value * hash_verified is nonzero, hash of the block has been verified. @@ -174,6 +92,84 @@ static sector_t verity_position_at_level(struct dm_verity *v, sector_t block, return block >> (level * v->hash_per_block_bits); } +/* + * Wrapper for crypto_shash_init, which handles verity salting. + */ +static int verity_hash_init(struct dm_verity *v, struct shash_desc *desc) +{ + int r; + + desc->tfm = v->tfm; + desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; + + r = crypto_shash_init(desc); + + if (unlikely(r < 0)) { + DMERR("crypto_shash_init failed: %d", r); + return r; + } + + if (likely(v->version >= 1)) { + r = crypto_shash_update(desc, v->salt, v->salt_size); + + if (unlikely(r < 0)) { + DMERR("crypto_shash_update failed: %d", r); + return r; + } + } + + return 0; +} + +static int verity_hash_update(struct dm_verity *v, struct shash_desc *desc, + const u8 *data, size_t len) +{ + int r = crypto_shash_update(desc, data, len); + + if (unlikely(r < 0)) + DMERR("crypto_shash_update failed: %d", r); + + return r; +} + +static int verity_hash_final(struct dm_verity *v, struct shash_desc *desc, + u8 *digest) +{ + int r; + + if (unlikely(!v->version)) { + r = crypto_shash_update(desc, v->salt, v->salt_size); + + if (r < 0) { + DMERR("crypto_shash_update failed: %d", r); + return r; + } + } + + r = crypto_shash_final(desc, digest); + + if (unlikely(r < 0)) + DMERR("crypto_shash_final failed: %d", r); + + return r; +} + +int verity_hash(struct dm_verity *v, struct shash_desc *desc, + const u8 *data, size_t len, u8 *digest) +{ + int r; + + r = verity_hash_init(v, desc); + if (unlikely(r < 0)) + return r; + + r = verity_hash_update(v, desc, data, len); + if (unlikely(r < 0)) + return r; + + return verity_hash_final(v, desc, digest); +} + static void verity_hash_at_level(struct dm_verity *v, sector_t block, int level, sector_t *hash_block, unsigned *offset) { @@ -196,17 +192,20 @@ static void verity_hash_at_level(struct dm_verity *v, sector_t block, int level, * Handle verification errors. */ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, - unsigned long long block) + unsigned long long block) { char verity_env[DM_VERITY_ENV_LENGTH]; char *envp[] = { verity_env, NULL }; const char *type_str = ""; struct mapped_device *md = dm_table_get_md(v->ti->table); + /* Corruption should be visible in device status in all modes */ + v->hash_failed = 1; + if (v->corrupted_errs >= DM_VERITY_MAX_CORRUPTED_ERRS) goto out; - ++v->corrupted_errs; + v->corrupted_errs++; switch (type) { case DM_VERITY_BLOCK_TYPE_DATA: @@ -219,8 +218,8 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, BUG(); } - DMERR_LIMIT("%s: %s block %llu is corrupted", v->data_dev->name, - type_str, block); + DMERR("%s: %s block %llu is corrupted", v->data_dev->name, type_str, + block); if (v->corrupted_errs == DM_VERITY_MAX_CORRUPTED_ERRS) DMERR("%s: reached maximum errors", v->data_dev->name); @@ -234,7 +233,7 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, if (v->mode == DM_VERITY_MODE_LOGGING) return 0; - if (v->mode == DM_VERITY_MODE_RESTART) + if (v->mode == DM_VERITY_MODE_RESTART && system_state != SYSTEM_POWER_OFF) kernel_restart("dm-verity device corrupted"); return 1; @@ -244,17 +243,17 @@ static int verity_handle_err(struct dm_verity *v, enum verity_block_type type, * Verify hash of a metadata block pertaining to the specified data block * ("block" argument) at a specified level ("level" argument). * - * On successful return, io_want_digest(v, io) contains the hash value for - * a lower tree level or for the data block (if we're at the lowest leve). + * On successful return, verity_io_want_digest(v, io) contains the hash value + * for a lower tree level or for the data block (if we're at the lowest level). * * If "skip_unverified" is true, unverified buffer is skipped and 1 is returned. * If "skip_unverified" is false, unverified buffer is hashed and verified - * against current value of io_want_digest(v, io). + * against current value of verity_io_want_digest(v, io). */ -static int verity_verify_level(struct dm_verity_io *io, sector_t block, - int level, bool skip_unverified) +static int verity_verify_level(struct dm_verity *v, struct dm_verity_io *io, + sector_t block, int level, bool skip_unverified, + u8 *want_digest) { - struct dm_verity *v = io->v; struct dm_buffer *buf; struct buffer_aux *aux; u8 *data; @@ -265,80 +264,134 @@ static int verity_verify_level(struct dm_verity_io *io, sector_t block, verity_hash_at_level(v, block, level, &hash_block, &offset); data = dm_bufio_read(v->bufio, hash_block, &buf); - if (unlikely(IS_ERR(data))) + if (IS_ERR(data)) return PTR_ERR(data); aux = dm_bufio_get_aux_data(buf); if (!aux->hash_verified) { - struct shash_desc *desc; - u8 *result; - if (skip_unverified) { r = 1; goto release_ret_r; } - desc = io_hash_desc(v, io); - desc->tfm = v->tfm; - desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; - r = crypto_shash_init(desc); - if (r < 0) { - DMERR("crypto_shash_init failed: %d", r); + r = verity_hash(v, verity_io_hash_desc(v, io), + data, 1 << v->hash_dev_block_bits, + verity_io_real_digest(v, io)); + if (unlikely(r < 0)) goto release_ret_r; - } - if (likely(v->version >= 1)) { - r = crypto_shash_update(desc, v->salt, v->salt_size); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); - goto release_ret_r; - } - } - - r = crypto_shash_update(desc, data, 1 << v->hash_dev_block_bits); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); + if (likely(memcmp(verity_io_real_digest(v, io), want_digest, + v->digest_size) == 0)) + aux->hash_verified = 1; + else if (verity_fec_decode(v, io, + DM_VERITY_BLOCK_TYPE_METADATA, + hash_block, data, NULL) == 0) + aux->hash_verified = 1; + else if (verity_handle_err(v, + DM_VERITY_BLOCK_TYPE_METADATA, + hash_block)) { + r = -EIO; goto release_ret_r; } + } - if (!v->version) { - r = crypto_shash_update(desc, v->salt, v->salt_size); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); - goto release_ret_r; - } - } + data += offset; + memcpy(want_digest, data, v->digest_size); + r = 0; - result = io_real_digest(v, io); - r = crypto_shash_final(desc, result); - if (r < 0) { - DMERR("crypto_shash_final failed: %d", r); - goto release_ret_r; - } - if (unlikely(memcmp(result, io_want_digest(v, io), v->digest_size))) { - v->hash_failed = 1; +release_ret_r: + dm_bufio_release(buf); + return r; +} - if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_METADATA, - hash_block)) { - r = -EIO; - goto release_ret_r; - } - } else - aux->hash_verified = 1; +/* + * Find a hash for a given block, write it to digest and verify the integrity + * of the hash tree if necessary. + */ +int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, + sector_t block, u8 *digest, bool *is_zero) +{ + int r = 0, i; + + if (likely(v->levels)) { + /* + * First, we try to get the requested hash for + * the current block. If the hash block itself is + * verified, zero is returned. If it isn't, this + * function returns 1 and we fall back to whole + * chain verification. + */ + r = verity_verify_level(v, io, block, 0, true, digest); + if (likely(r <= 0)) + goto out; } - data += offset; + memcpy(digest, v->root_digest, v->digest_size); + + for (i = v->levels - 1; i >= 0; i--) { + r = verity_verify_level(v, io, block, i, false, digest); + if (unlikely(r)) + goto out; + } +out: + if (!r && v->zero_digest) + *is_zero = !memcmp(v->zero_digest, digest, v->digest_size); + else + *is_zero = false; - memcpy(io_want_digest(v, io), data, v->digest_size); + return r; +} + +/* + * Calls function process for 1 << v->data_dev_block_bits bytes in the bio_vec + * starting from iter. + */ +int verity_for_bv_block(struct dm_verity *v, struct dm_verity_io *io, + struct bvec_iter *iter, + int (*process)(struct dm_verity *v, + struct dm_verity_io *io, u8 *data, + size_t len)) +{ + unsigned todo = 1 << v->data_dev_block_bits; + struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_bio_data_size); + + do { + int r; + u8 *page; + unsigned len; + struct bio_vec bv = bio_iter_iovec(bio, *iter); + + page = kmap_atomic(bv.bv_page); + len = bv.bv_len; + + if (likely(len >= todo)) + len = todo; + + r = process(v, io, page + bv.bv_offset, len); + kunmap_atomic(page); + + if (r < 0) + return r; + + bio_advance_iter(bio, iter, len); + todo -= len; + } while (todo); - dm_bufio_release(buf); return 0; +} -release_ret_r: - dm_bufio_release(buf); +static int verity_bv_hash_update(struct dm_verity *v, struct dm_verity_io *io, + u8 *data, size_t len) +{ + return verity_hash_update(v, verity_io_hash_desc(v, io), data, len); +} - return r; +static int verity_bv_zero(struct dm_verity *v, struct dm_verity_io *io, + u8 *data, size_t len) +{ + memset(data, 0, len); + return 0; } /* @@ -346,101 +399,56 @@ static int verity_verify_level(struct dm_verity_io *io, sector_t block, */ static int verity_verify_io(struct dm_verity_io *io) { + bool is_zero; struct dm_verity *v = io->v; - struct bio *bio = dm_bio_from_per_bio_data(io, - v->ti->per_bio_data_size); + struct bvec_iter start; unsigned b; - int i; for (b = 0; b < io->n_blocks; b++) { - struct shash_desc *desc; - u8 *result; int r; - unsigned todo; + struct shash_desc *desc = verity_io_hash_desc(v, io); + + r = verity_hash_for_block(v, io, io->block + b, + verity_io_want_digest(v, io), + &is_zero); + if (unlikely(r < 0)) + return r; - if (likely(v->levels)) { + if (is_zero) { /* - * First, we try to get the requested hash for - * the current block. If the hash block itself is - * verified, zero is returned. If it isn't, this - * function returns 0 and we fall back to whole - * chain verification. + * If we expect a zero block, don't validate, just + * return zeros. */ - int r = verity_verify_level(io, io->block + b, 0, true); - if (likely(!r)) - goto test_block_hash; - if (r < 0) + r = verity_for_bv_block(v, io, &io->iter, + verity_bv_zero); + if (unlikely(r < 0)) return r; - } - memcpy(io_want_digest(v, io), v->root_digest, v->digest_size); - - for (i = v->levels - 1; i >= 0; i--) { - int r = verity_verify_level(io, io->block + b, i, false); - if (unlikely(r)) - return r; + continue; } -test_block_hash: - desc = io_hash_desc(v, io); - desc->tfm = v->tfm; - desc->flags = CRYPTO_TFM_REQ_MAY_SLEEP; - r = crypto_shash_init(desc); - if (r < 0) { - DMERR("crypto_shash_init failed: %d", r); + r = verity_hash_init(v, desc); + if (unlikely(r < 0)) return r; - } - - if (likely(v->version >= 1)) { - r = crypto_shash_update(desc, v->salt, v->salt_size); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); - return r; - } - } - todo = 1 << v->data_dev_block_bits; - do { - u8 *page; - unsigned len; - struct bio_vec bv = bio_iter_iovec(bio, io->iter); - - page = kmap_atomic(bv.bv_page); - len = bv.bv_len; - if (likely(len >= todo)) - len = todo; - r = crypto_shash_update(desc, page + bv.bv_offset, len); - kunmap_atomic(page); - - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); - return r; - } - - bio_advance_iter(bio, &io->iter, len); - todo -= len; - } while (todo); - if (!v->version) { - r = crypto_shash_update(desc, v->salt, v->salt_size); - if (r < 0) { - DMERR("crypto_shash_update failed: %d", r); - return r; - } - } + start = io->iter; + r = verity_for_bv_block(v, io, &io->iter, verity_bv_hash_update); + if (unlikely(r < 0)) + return r; - result = io_real_digest(v, io); - r = crypto_shash_final(desc, result); - if (r < 0) { - DMERR("crypto_shash_final failed: %d", r); + r = verity_hash_final(v, desc, verity_io_real_digest(v, io)); + if (unlikely(r < 0)) return r; - } - if (unlikely(memcmp(result, io_want_digest(v, io), v->digest_size))) { - v->hash_failed = 1; - if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, - io->block + b)) - return -EIO; - } + if (likely(memcmp(verity_io_real_digest(v, io), + verity_io_want_digest(v, io), v->digest_size) == 0)) + continue; + else if (verity_fec_decode(v, io, DM_VERITY_BLOCK_TYPE_DATA, + io->block + b, NULL, &start) == 0) + continue; + else if (verity_handle_err(v, DM_VERITY_BLOCK_TYPE_DATA, + io->block + b)) + return -EIO; } return 0; @@ -457,6 +465,8 @@ static void verity_finish_io(struct dm_verity_io *io, int error) bio->bi_end_io = io->orig_bi_end_io; bio->bi_private = io->orig_bi_private; + verity_fec_finish_io(io); + bio_endio_nodec(bio, error); } @@ -471,7 +481,7 @@ static void verity_end_io(struct bio *bio, int error) { struct dm_verity_io *io = bio->bi_private; - if (error) { + if (error && !verity_fec_is_enabled(io->v)) { verity_finish_io(io, error); return; } @@ -541,7 +551,7 @@ static void verity_submit_prefetch(struct dm_verity *v, struct dm_verity_io *io) * Bio map function. It allocates dm_verity_io structure and bio vector and * fills them. Then it issues prefetches and the I/O. */ -static int verity_map(struct dm_target *ti, struct bio *bio) +int verity_map(struct dm_target *ti, struct bio *bio) { struct dm_verity *v = ti->private; struct dm_verity_io *io; @@ -575,6 +585,8 @@ static int verity_map(struct dm_target *ti, struct bio *bio) bio->bi_private = io; io->iter = bio->bi_iter; + verity_fec_init_io(io); + verity_submit_prefetch(v, io); generic_make_request(bio); @@ -585,10 +597,11 @@ static int verity_map(struct dm_target *ti, struct bio *bio) /* * Status: V (valid) or C (corruption found) */ -static void verity_status(struct dm_target *ti, status_type_t type, +void verity_status(struct dm_target *ti, status_type_t type, unsigned status_flags, char *result, unsigned maxlen) { struct dm_verity *v = ti->private; + unsigned args = 0; unsigned sz = 0; unsigned x; @@ -615,11 +628,36 @@ static void verity_status(struct dm_target *ti, status_type_t type, else for (x = 0; x < v->salt_size; x++) DMEMIT("%02x", v->salt[x]); + if (v->mode != DM_VERITY_MODE_EIO) + args++; + if (verity_fec_is_enabled(v)) + args += DM_VERITY_OPTS_FEC; + if (v->zero_digest) + args++; + if (!args) + return; + DMEMIT(" %u", args); + if (v->mode != DM_VERITY_MODE_EIO) { + DMEMIT(" "); + switch (v->mode) { + case DM_VERITY_MODE_LOGGING: + DMEMIT(DM_VERITY_OPT_LOGGING); + break; + case DM_VERITY_MODE_RESTART: + DMEMIT(DM_VERITY_OPT_RESTART); + break; + default: + BUG(); + } + } + if (v->zero_digest) + DMEMIT(" " DM_VERITY_OPT_IGN_ZEROES); + sz = verity_fec_status_table(v, sz, result, maxlen); break; } } -static int verity_ioctl(struct dm_target *ti, unsigned cmd, +int verity_ioctl(struct dm_target *ti, unsigned cmd, unsigned long arg) { struct dm_verity *v = ti->private; @@ -633,7 +671,7 @@ static int verity_ioctl(struct dm_target *ti, unsigned cmd, cmd, arg); } -static int verity_merge(struct dm_target *ti, struct bvec_merge_data *bvm, +int verity_merge(struct dm_target *ti, struct bvec_merge_data *bvm, struct bio_vec *biovec, int max_size) { struct dm_verity *v = ti->private; @@ -648,7 +686,7 @@ static int verity_merge(struct dm_target *ti, struct bvec_merge_data *bvm, return min(max_size, q->merge_bvec_fn(q, bvm, biovec)); } -static int verity_iterate_devices(struct dm_target *ti, +int verity_iterate_devices(struct dm_target *ti, iterate_devices_callout_fn fn, void *data) { struct dm_verity *v = ti->private; @@ -656,7 +694,7 @@ static int verity_iterate_devices(struct dm_target *ti, return fn(ti, v->data_dev, v->data_start, ti->len, data); } -static void verity_io_hints(struct dm_target *ti, struct queue_limits *limits) +void verity_io_hints(struct dm_target *ti, struct queue_limits *limits) { struct dm_verity *v = ti->private; @@ -669,21 +707,19 @@ static void verity_io_hints(struct dm_target *ti, struct queue_limits *limits) blk_limits_io_min(limits, limits->logical_block_size); } -static void verity_dtr(struct dm_target *ti) +void verity_dtr(struct dm_target *ti) { struct dm_verity *v = ti->private; if (v->verify_wq) destroy_workqueue(v->verify_wq); - if (v->vec_mempool) - mempool_destroy(v->vec_mempool); - if (v->bufio) dm_bufio_client_destroy(v->bufio); kfree(v->salt); kfree(v->root_digest); + kfree(v->zero_digest); if (v->tfm) crypto_free_shash(v->tfm); @@ -696,9 +732,94 @@ static void verity_dtr(struct dm_target *ti) if (v->data_dev) dm_put_device(ti, v->data_dev); + verity_fec_dtr(v); + kfree(v); } +static int verity_alloc_zero_digest(struct dm_verity *v) +{ + int r = -ENOMEM; + struct shash_desc *desc; + u8 *zero_data; + + v->zero_digest = kmalloc(v->digest_size, GFP_KERNEL); + + if (!v->zero_digest) + return r; + + desc = kmalloc(v->shash_descsize, GFP_KERNEL); + + if (!desc) + return r; /* verity_dtr will free zero_digest */ + + zero_data = kzalloc(1 << v->data_dev_block_bits, GFP_KERNEL); + + if (!zero_data) + goto out; + + r = verity_hash(v, desc, zero_data, 1 << v->data_dev_block_bits, + v->zero_digest); + +out: + kfree(desc); + kfree(zero_data); + + return r; +} + +static int verity_parse_opt_args(struct dm_arg_set *as, struct dm_verity *v) +{ + int r; + unsigned argc; + struct dm_target *ti = v->ti; + const char *arg_name; + + static struct dm_arg _args[] = { + {0, DM_VERITY_OPTS_MAX, "Invalid number of feature args"}, + }; + + r = dm_read_arg_group(_args, as, &argc, &ti->error); + if (r) + return -EINVAL; + + if (!argc) + return 0; + + do { + arg_name = dm_shift_arg(as); + argc--; + + if (!strcasecmp(arg_name, DM_VERITY_OPT_LOGGING)) { + v->mode = DM_VERITY_MODE_LOGGING; + continue; + + } else if (!strcasecmp(arg_name, DM_VERITY_OPT_RESTART)) { + v->mode = DM_VERITY_MODE_RESTART; + continue; + + } else if (!strcasecmp(arg_name, DM_VERITY_OPT_IGN_ZEROES)) { + r = verity_alloc_zero_digest(v); + if (r) { + ti->error = "Cannot allocate zero digest"; + return r; + } + continue; + + } else if (verity_is_fec_opt_arg(arg_name)) { + r = verity_fec_parse_opt_args(as, v, &argc, arg_name); + if (r) + return r; + continue; + } + + ti->error = "Unrecognized verity feature request"; + return -EINVAL; + } while (argc && !r); + + return r; +} + /* * Target parameters: * The current format is version 1. @@ -713,10 +834,11 @@ static void verity_dtr(struct dm_target *ti) * * Hex string or "-" if no salt. */ -static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) +int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) { struct dm_verity *v; - unsigned num; + struct dm_arg_set as; + unsigned int num; unsigned long long num_ll; int r; int i; @@ -731,20 +853,24 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) ti->private = v; v->ti = ti; + r = verity_fec_ctr_alloc(v); + if (r) + goto bad; + if ((dm_table_get_mode(ti->table) & ~FMODE_READ)) { ti->error = "Device must be readonly"; r = -EINVAL; goto bad; } - if (argc < 10 || argc > 11) { - ti->error = "Invalid argument count: 10-11 arguments required"; + if (argc < 10) { + ti->error = "Not enough arguments"; r = -EINVAL; goto bad; } - if (sscanf(argv[0], "%d%c", &num, &dummy) != 1 || - num < 0 || num > 1) { + if (sscanf(argv[0], "%u%c", &num, &dummy) != 1 || + num > 1) { ti->error = "Invalid version"; r = -EINVAL; goto bad; @@ -859,15 +985,17 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) } } - if (argc > 10) { - if (sscanf(argv[10], "%d%c", &num, &dummy) != 1 || - num < DM_VERITY_MODE_EIO || - num > DM_VERITY_MODE_RESTART) { - ti->error = "Invalid mode"; - r = -EINVAL; + argv += 10; + argc -= 10; + + /* Optional parameters */ + if (argc) { + as.argc = argc; + as.argv = argv; + + r = verity_parse_opt_args(&as, v); + if (r < 0) goto bad; - } - v->mode = num; } v->hash_per_block_bits = @@ -917,24 +1045,26 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) goto bad; } - ti->per_bio_data_size = roundup(sizeof(struct dm_verity_io) + v->shash_descsize + v->digest_size * 2, __alignof__(struct dm_verity_io)); - - v->vec_mempool = mempool_create_kmalloc_pool(DM_VERITY_MEMPOOL_SIZE, - BIO_MAX_PAGES * sizeof(struct bio_vec)); - if (!v->vec_mempool) { - ti->error = "Cannot allocate vector mempool"; - r = -ENOMEM; - goto bad; - } - /* WQ_UNBOUND greatly improves performance when running on ramdisk */ - v->verify_wq = alloc_workqueue("kverityd", WQ_CPU_INTENSIVE | WQ_MEM_RECLAIM | WQ_UNBOUND, num_online_cpus()); + v->verify_wq = alloc_workqueue("kverityd", + WQ_HIGHPRI | WQ_MEM_RECLAIM | WQ_UNBOUND, + num_online_cpus()); if (!v->verify_wq) { ti->error = "Cannot allocate workqueue"; r = -ENOMEM; goto bad; } + ti->per_bio_data_size = sizeof(struct dm_verity_io) + + v->shash_descsize + v->digest_size * 2; + + r = verity_fec_ctr(v); + if (r) + goto bad; + + ti->per_bio_data_size = roundup(ti->per_bio_data_size, + __alignof__(struct dm_verity_io)); + return 0; bad: @@ -945,7 +1075,7 @@ static int verity_ctr(struct dm_target *ti, unsigned argc, char **argv) static struct target_type verity_target = { .name = "verity", - .version = {1, 2, 0}, + .version = {1, 3, 0}, .module = THIS_MODULE, .ctr = verity_ctr, .dtr = verity_dtr, diff --git a/drivers/md/dm-verity.h b/drivers/md/dm-verity.h new file mode 100644 index 0000000000000..47a96a56794bc --- /dev/null +++ b/drivers/md/dm-verity.h @@ -0,0 +1,142 @@ +/* + * Copyright (C) 2012 Red Hat, Inc. + * Copyright (C) 2015 Google, Inc. + * + * Author: Mikulas Patocka + * + * Based on Chromium dm-verity driver (C) 2011 The Chromium OS Authors + * + * This file is released under the GPLv2. + */ + +#ifndef DM_VERITY_H +#define DM_VERITY_H + +#include "dm-bufio.h" +#include +#include + +#define DM_VERITY_MAX_LEVELS 63 + +enum verity_mode { + DM_VERITY_MODE_EIO, + DM_VERITY_MODE_LOGGING, + DM_VERITY_MODE_RESTART +}; + +enum verity_block_type { + DM_VERITY_BLOCK_TYPE_DATA, + DM_VERITY_BLOCK_TYPE_METADATA +}; + +struct dm_verity_fec; + +struct dm_verity { + struct dm_dev *data_dev; + struct dm_dev *hash_dev; + struct dm_target *ti; + struct dm_bufio_client *bufio; + char *alg_name; + struct crypto_shash *tfm; + u8 *root_digest; /* digest of the root block */ + u8 *salt; /* salt: its size is salt_size */ + u8 *zero_digest; /* digest for a zero block */ + unsigned salt_size; + sector_t data_start; /* data offset in 512-byte sectors */ + sector_t hash_start; /* hash start in blocks */ + sector_t data_blocks; /* the number of data blocks */ + sector_t hash_blocks; /* the number of hash blocks */ + unsigned char data_dev_block_bits; /* log2(data blocksize) */ + unsigned char hash_dev_block_bits; /* log2(hash blocksize) */ + unsigned char hash_per_block_bits; /* log2(hashes in hash block) */ + unsigned char levels; /* the number of tree levels */ + unsigned char version; + unsigned digest_size; /* digest size for the current hash algorithm */ + unsigned shash_descsize;/* the size of temporary space for crypto */ + int hash_failed; /* set to 1 if hash of any block failed */ + enum verity_mode mode; /* mode for handling verification errors */ + unsigned corrupted_errs;/* Number of errors for corrupted blocks */ + + struct workqueue_struct *verify_wq; + + /* starting blocks for each tree level. 0 is the lowest level. */ + sector_t hash_level_block[DM_VERITY_MAX_LEVELS]; + + struct dm_verity_fec *fec; /* forward error correction */ +}; + +struct dm_verity_io { + struct dm_verity *v; + + /* original values of bio->bi_end_io and bio->bi_private */ + bio_end_io_t *orig_bi_end_io; + void *orig_bi_private; + + sector_t block; + unsigned n_blocks; + + struct bvec_iter iter; + + struct work_struct work; + + /* + * Three variably-size fields follow this struct: + * + * u8 hash_desc[v->shash_descsize]; + * u8 real_digest[v->digest_size]; + * u8 want_digest[v->digest_size]; + * + * To access them use: verity_io_hash_desc(), verity_io_real_digest() + * and verity_io_want_digest(). + */ +}; + +static inline struct shash_desc *verity_io_hash_desc(struct dm_verity *v, + struct dm_verity_io *io) +{ + return (struct shash_desc *)(io + 1); +} + +static inline u8 *verity_io_real_digest(struct dm_verity *v, + struct dm_verity_io *io) +{ + return (u8 *)(io + 1) + v->shash_descsize; +} + +static inline u8 *verity_io_want_digest(struct dm_verity *v, + struct dm_verity_io *io) +{ + return (u8 *)(io + 1) + v->shash_descsize + v->digest_size; +} + +static inline u8 *verity_io_digest_end(struct dm_verity *v, + struct dm_verity_io *io) +{ + return verity_io_want_digest(v, io) + v->digest_size; +} + +extern int verity_for_bv_block(struct dm_verity *v, struct dm_verity_io *io, + struct bvec_iter *iter, + int (*process)(struct dm_verity *v, + struct dm_verity_io *io, + u8 *data, size_t len)); + +extern int verity_hash(struct dm_verity *v, struct shash_desc *desc, + const u8 *data, size_t len, u8 *digest); + +extern int verity_hash_for_block(struct dm_verity *v, struct dm_verity_io *io, + sector_t block, u8 *digest, bool *is_zero); + +extern void verity_status(struct dm_target *ti, status_type_t type, + unsigned status_flags, char *result, unsigned maxlen); +extern int verity_ioctl(struct dm_target *ti, unsigned cmd, + unsigned long arg); +extern int verity_merge(struct dm_target *ti, struct bvec_merge_data *bvm, + struct bio_vec *biovec, int max_size); +extern int verity_iterate_devices(struct dm_target *ti, + iterate_devices_callout_fn fn, void *data); +extern void verity_io_hints(struct dm_target *ti, struct queue_limits *limits); +extern void verity_dtr(struct dm_target *ti); +extern int verity_ctr(struct dm_target *ti, unsigned argc, char **argv); +extern int verity_map(struct dm_target *ti, struct bio *bio); +#endif /* DM_VERITY_H */ diff --git a/drivers/media/platform/msm/camera_v2/camera/camera.c b/drivers/media/platform/msm/camera_v2/camera/camera.c index 1ec55bf8244de..5bfcf282f5630 100644 --- a/drivers/media/platform/msm/camera_v2/camera/camera.c +++ b/drivers/media/platform/msm/camera_v2/camera/camera.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -485,6 +485,9 @@ static long camera_v4l2_vidioc_private_ioctl(struct file *filep, void *fh, if (WARN_ON(!k_ioctl || !pvdev)) return -EIO; + if (cmd != VIDIOC_MSM_CAMERA_PRIVATE_IOCTL_CMD) + return -EINVAL; + switch (k_ioctl->id) { case MSM_CAMERA_PRIV_IOCTL_ID_RETURN_BUF: { struct msm_camera_return_buf ptr, *tmp = NULL; diff --git a/drivers/media/platform/msm/camera_v2/common/msm_camera_io_util.c b/drivers/media/platform/msm/camera_v2/common/msm_camera_io_util.c index 51a9ea85d1f30..d82b2eb602f9a 100644 --- a/drivers/media/platform/msm/camera_v2/common/msm_camera_io_util.c +++ b/drivers/media/platform/msm/camera_v2/common/msm_camera_io_util.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2014, The Linux Foundataion. All rights reserved. +/* Copyright (c) 2011-2014, 2017 The Linux Foundataion. 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 @@ -394,9 +394,15 @@ int msm_camera_config_vreg(struct device *dev, struct camera_vreg_t *cam_vreg, pr_err("%s:%d vreg sequence invalid\n", __func__, __LINE__); return -EINVAL; } + if (!num_vreg_seq) num_vreg_seq = num_vreg; + if ((cam_vreg == NULL) && num_vreg_seq) { + pr_err("%s:%d cam_vreg NULL\n", __func__, __LINE__); + return -EINVAL; + } + if (config) { for (i = 0; i < num_vreg_seq; i++) { if (vreg_seq) { diff --git a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c index a6529a2e67a4e..1b6cc3e24dcdb 100644 --- a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c +++ b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.c @@ -432,6 +432,7 @@ static int msm_fd_open(struct file *file) ctx->vb2_q.type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ctx->vb2_q.io_modes = VB2_USERPTR; ctx->vb2_q.timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY; + mutex_init(&ctx->lock); ret = vb2_queue_init(&ctx->vb2_q); if (ret < 0) { dev_err(device->dev, "Error queue init\n"); @@ -482,7 +483,9 @@ static int msm_fd_release(struct file *file) msm_cpp_vbif_register_error_handler((void *)ctx, VBIF_CLIENT_FD, NULL); + mutex_lock(&ctx->lock); vb2_queue_release(&ctx->vb2_q); + mutex_unlock(&ctx->lock); vfree(ctx->stats); @@ -512,7 +515,9 @@ static unsigned int msm_fd_poll(struct file *file, struct fd_ctx *ctx = msm_fd_ctx_from_fh(file->private_data); unsigned int ret; + mutex_lock(&ctx->lock); ret = vb2_poll(&ctx->vb2_q, file, wait); + mutex_unlock(&ctx->lock); if (atomic_read(&ctx->subscribed_for_event)) { poll_wait(file, &ctx->fh.wait, wait); @@ -747,9 +752,13 @@ static int msm_fd_s_fmt_vid_out(struct file *file, static int msm_fd_reqbufs(struct file *file, void *fh, struct v4l2_requestbuffers *req) { + int ret; struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); - return vb2_reqbufs(&ctx->vb2_q, req); + mutex_lock(&ctx->lock); + ret = vb2_reqbufs(&ctx->vb2_q, req); + mutex_unlock(&ctx->lock); + return ret; } /* @@ -761,9 +770,14 @@ static int msm_fd_reqbufs(struct file *file, static int msm_fd_qbuf(struct file *file, void *fh, struct v4l2_buffer *pb) { + int ret; struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); - return vb2_qbuf(&ctx->vb2_q, pb); + mutex_lock(&ctx->lock); + ret = vb2_qbuf(&ctx->vb2_q, pb); + mutex_unlock(&ctx->lock); + return ret; + } /* @@ -775,9 +789,13 @@ static int msm_fd_qbuf(struct file *file, void *fh, static int msm_fd_dqbuf(struct file *file, void *fh, struct v4l2_buffer *pb) { + int ret; struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); - return vb2_dqbuf(&ctx->vb2_q, pb, file->f_flags & O_NONBLOCK); + mutex_lock(&ctx->lock); + ret = vb2_dqbuf(&ctx->vb2_q, pb, file->f_flags & O_NONBLOCK); + mutex_unlock(&ctx->lock); + return ret; } /* @@ -792,7 +810,9 @@ static int msm_fd_streamon(struct file *file, struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); int ret; + mutex_lock(&ctx->lock); ret = vb2_streamon(&ctx->vb2_q, buf_type); + mutex_unlock(&ctx->lock); if (ret < 0) dev_err(ctx->fd_device->dev, "Stream on fails\n"); @@ -811,7 +831,9 @@ static int msm_fd_streamoff(struct file *file, struct fd_ctx *ctx = msm_fd_ctx_from_fh(fh); int ret; + mutex_lock(&ctx->lock); ret = vb2_streamoff(&ctx->vb2_q, buf_type); + mutex_unlock(&ctx->lock); if (ret < 0) dev_err(ctx->fd_device->dev, "Stream off fails\n"); @@ -1042,14 +1064,18 @@ static int msm_fd_s_ctrl(struct file *file, void *fh, struct v4l2_control *a) a->value = ctx->format.size->work_size; break; case V4L2_CID_FD_WORK_MEMORY_FD: + mutex_lock(&ctx->fd_device->recovery_lock); if (ctx->work_buf.fd != -1) msm_fd_hw_unmap_buffer(&ctx->work_buf); if (a->value >= 0) { ret = msm_fd_hw_map_buffer(&ctx->mem_pool, a->value, &ctx->work_buf); - if (ret < 0) + if (ret < 0) { + mutex_unlock(&ctx->fd_device->recovery_lock); return ret; + } } + mutex_unlock(&ctx->fd_device->recovery_lock); break; default: return -EINVAL; diff --git a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.h b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.h index 4155eb8a6fafc..a7615a65d2fcf 100644 --- a/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.h +++ b/drivers/media/platform/msm/camera_v2/fd/msm_fd_dev.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -161,6 +161,7 @@ struct fd_ctx { struct msm_fd_mem_pool mem_pool; struct msm_fd_stats *stats; struct msm_fd_buf_handle work_buf; + struct mutex lock; }; /* diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c index 94e974529e568..7bc8f9cd5ebfe 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -86,7 +86,7 @@ struct msm_isp_bufq *msm_isp_get_bufq( /* bufq_handle cannot be 0 */ if ((bufq_handle == 0) || bufq_index >= BUF_MGR_NUM_BUF_Q || - (bufq_index > buf_mgr->num_buf_q)) + (bufq_index >= buf_mgr->num_buf_q)) return NULL; bufq = &buf_mgr->bufq[bufq_index]; @@ -189,6 +189,12 @@ static int msm_isp_prepare_v4l2_buf(struct msm_isp_buf_mgr *buf_mgr, struct msm_isp_buffer_mapped_info *mapped_info; uint32_t accu_length = 0; + if (qbuf_buf->num_planes > MAX_PLANES_PER_STREAM) { + pr_err("%s: Invalid num_planes %d , stream id %x\n", + __func__, qbuf_buf->num_planes, stream_id); + return -EINVAL; + } + for (i = 0; i < qbuf_buf->num_planes; i++) { mapped_info = &buf_info->mapped_info[i]; mapped_info->buf_fd = qbuf_buf->planes[i].addr; @@ -206,8 +212,8 @@ static int msm_isp_prepare_v4l2_buf(struct msm_isp_buf_mgr *buf_mgr, mapped_info->paddr += accu_length; accu_length += qbuf_buf->planes[i].length; - CDBG("%s: plane: %d addr:%lu\n", - __func__, i, (unsigned long)mapped_info->paddr); + CDBG("%s: plane: %d addr:%pK\n", + __func__, i, (void *)mapped_info->paddr); } buf_info->num_planes = qbuf_buf->num_planes; @@ -233,6 +239,12 @@ static void msm_isp_unprepare_v4l2_buf( return; } + if (buf_info->num_planes > VIDEO_MAX_PLANES) { + pr_err("%s: Invalid num_planes %d , stream id %x\n", + __func__, buf_info->num_planes, stream_id); + return; + } + bufq = msm_isp_get_bufq(buf_mgr, buf_info->bufq_handle); if (!bufq) { pr_err("%s: Invalid bufq, stream id %x\n", @@ -270,8 +282,8 @@ static int msm_isp_map_buf(struct msm_isp_buf_mgr *buf_mgr, pr_err_ratelimited("%s: cannot map address", __func__); goto smmu_map_error; } - CDBG("%s: addr:%lu\n", - __func__, (unsigned long)mapped_info->paddr); + CDBG("%s: addr:%pK\n", + __func__, (void *)mapped_info->paddr); return rc; smmu_map_error: @@ -461,7 +473,8 @@ static int msm_isp_buf_unprepare(struct msm_isp_buf_mgr *buf_mgr, static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, - uint32_t bufq_handle, struct msm_isp_buffer **buf_info) + uint32_t bufq_handle, uint32_t buf_index, + struct msm_isp_buffer **buf_info) { int rc = -1; unsigned long flags; @@ -511,8 +524,12 @@ static int msm_isp_get_buf(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, } break; case MSM_ISP_BUFFER_SRC_HAL: - vb2_buf = buf_mgr->vb2_ops->get_buf( - bufq->session_id, bufq->stream_id); + if (MSM_ISP_INVALID_BUF_INDEX == buf_index) + vb2_buf = buf_mgr->vb2_ops->get_buf( + bufq->session_id, bufq->stream_id); + else + vb2_buf = buf_mgr->vb2_ops->get_buf_by_idx( + bufq->session_id, bufq->stream_id, buf_index); if (vb2_buf) { if (vb2_buf->v4l2_buf.index < bufq->num_bufs) { *buf_info = &bufq->bufs[vb2_buf @@ -1309,16 +1326,17 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr, struct msm_isp_buffer *bufs = NULL; uint32_t i = 0, j = 0, k = 0, rc = 0; char *print_buf = NULL, temp_buf[100]; - uint32_t start_addr = 0, end_addr = 0, print_buf_size = 2000; + uint32_t print_buf_size = 2000; + unsigned long start_addr = 0, end_addr = 0; int buf_addr_delta = -1; int temp_delta = 0; uint32_t debug_stream_id = 0; uint32_t debug_buf_idx = 0; uint32_t debug_buf_plane = 0; - uint32_t debug_start_addr = 0; - uint32_t debug_end_addr = 0; + unsigned long debug_start_addr = 0; + unsigned long debug_end_addr = 0; uint32_t debug_frame_id = 0; - enum msm_isp_buffer_state debug_state; + enum msm_isp_buffer_state debug_state = MSM_ISP_BUFFER_STATE_UNUSED; unsigned long flags; struct msm_isp_bufq *bufq = NULL; @@ -1375,8 +1393,8 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr, debug_stream_id, debug_frame_id); pr_err("%s: nearby buf index %d, plane %d, state %d\n", __func__, debug_buf_idx, debug_buf_plane, debug_state); - pr_err("%s: buf address 0x%x -- 0x%x\n", __func__, - debug_start_addr, debug_end_addr); + pr_err("%s: buf address %pK -- %pK\n", __func__, + (void *)debug_start_addr, (void *)debug_end_addr); if (BUF_DEBUG_FULL) { print_buf = kzalloc(print_buf_size, GFP_ATOMIC); @@ -1411,9 +1429,10 @@ static int msm_isp_buf_mgr_debug(struct msm_isp_buf_mgr *buf_mgr, mapped_info[k].len; snprintf(temp_buf, sizeof(temp_buf), - " buf %d plane %d start_addr %x end_addr %x\n", - j, k, start_addr, - end_addr); + " buf %d plane %d start_addr %pK end_addr %pK\n", + j, k, + (void *)start_addr, + (void *)end_addr); strlcat(print_buf, temp_buf, print_buf_size); } diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h index eea7d2eaea3cc..0bbd480012c35 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_buf_mgr.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2016, 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 @@ -32,6 +32,8 @@ #define BUF_MGR_NUM_BUF_Q 28 #define MAX_IOMMU_CTX 2 +#define MSM_ISP_INVALID_BUF_INDEX 0xFFFFFFFF + struct msm_isp_buf_mgr; enum msm_isp_buffer_src_t { @@ -140,7 +142,8 @@ struct msm_isp_buf_ops { uint32_t bufq_handle, uint32_t *buf_src); int (*get_buf)(struct msm_isp_buf_mgr *buf_mgr, uint32_t id, - uint32_t bufq_handle, struct msm_isp_buffer **buf_info); + uint32_t bufq_handle, uint32_t buf_index, + struct msm_isp_buffer **buf_info); int (*get_buf_by_index)(struct msm_isp_buf_mgr *buf_mgr, uint32_t bufq_handle, uint32_t buf_index, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp.c index d3c2d77b01077..608805569f28b 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -499,6 +499,7 @@ static int vfe_probe(struct platform_device *pdev) vfe_parent_dev->common_sd->common_data = &vfe_common_data; memset(&vfe_common_data, 0, sizeof(vfe_common_data)); spin_lock_init(&vfe_common_data.common_dev_data_lock); + spin_lock_init(&vfe_common_data.common_dev_axi_lock); of_property_read_u32(pdev->dev.of_node, "num_child", &vfe_parent_dev->num_hw_sd); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h index 6b82ee95dda65..63a36a1b23989 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp.h @@ -64,6 +64,7 @@ #define MAX_BUFFERS_IN_HW 2 #define MAX_VFE 2 +#define MAX_RECOVERY_THRESHOLD 5 struct vfe_device; struct msm_vfe_axi_stream; @@ -159,6 +160,8 @@ struct msm_vfe_irq_ops { void (*config_irq)(struct vfe_device *vfe_dev, uint32_t irq_status0, uint32_t irq_status1, enum msm_isp_irq_operation); + void (*process_eof_irq)(struct vfe_device *vfe_dev, + uint32_t irq_status0); }; struct msm_vfe_axi_ops { @@ -194,15 +197,12 @@ struct msm_vfe_axi_ops { uint8_t plane_idx); void (*clear_wm_xbar_reg)(struct vfe_device *vfe_dev, struct msm_vfe_axi_stream *stream_info, uint8_t plane_idx); - - void (*cfg_ub)(struct vfe_device *vfe_dev); - + void (*cfg_ub)(struct vfe_device *vfe_dev, + enum msm_vfe_input_src frame_src); void (*read_wm_ping_pong_addr)(struct vfe_device *vfe_dev); - void (*update_ping_pong_addr)(void __iomem *vfe_base, uint8_t wm_idx, uint32_t pingpong_bit, dma_addr_t paddr, int32_t buf_size); - uint32_t (*get_wm_mask)(uint32_t irq_status0, uint32_t irq_status1); uint32_t (*get_comp_mask)(uint32_t irq_status0, uint32_t irq_status1); uint32_t (*get_pingpong_status)(struct vfe_device *vfe_dev); @@ -211,6 +211,8 @@ struct msm_vfe_axi_ops { uint32_t enable_camif); void (*update_cgc_override)(struct vfe_device *vfe_dev, uint8_t wm_idx, uint8_t cgc_override); + uint32_t (*ub_reg_offset)(struct vfe_device *vfe_dev, int idx); + uint32_t (*get_ub_size)(struct vfe_device *vfe_dev); }; struct msm_vfe_core_ops { @@ -397,6 +399,7 @@ enum msm_vfe_axi_stream_type { struct msm_vfe_frame_request_queue { struct list_head list; enum msm_vfe_buff_queue_id buff_queue_id; + uint32_t buf_index; uint8_t cmd_used; }; @@ -463,6 +466,7 @@ struct msm_vfe_src_info { uint32_t frame_id; uint32_t reg_update_frame_id; uint8_t active; + uint8_t flag; uint8_t pix_stream_count; uint8_t raw_stream_count; enum msm_vfe_inputmux input_mux; @@ -474,6 +478,7 @@ struct msm_vfe_src_info { struct timeval time_stamp; enum msm_vfe_dual_hw_type dual_hw_type; struct msm_vfe_dual_hw_ms_info dual_hw_ms_info; + uint32_t eof_id; }; struct msm_vfe_fetch_engine_info { @@ -514,6 +519,7 @@ struct msm_vfe_axi_shared_data { uint32_t event_mask; uint8_t enable_frameid_recovery; enum msm_vfe_camif_state camif_state; + uint32_t recovery_count; }; struct msm_vfe_stats_hardware_info { @@ -673,6 +679,7 @@ struct master_slave_resource_info { struct msm_vfe_common_dev_data { spinlock_t common_dev_data_lock; + spinlock_t common_dev_axi_lock; struct dual_vfe_resource *dual_vfe_res; struct master_slave_resource_info ms_resource; }; @@ -753,6 +760,7 @@ struct vfe_device { uint32_t is_split; uint32_t dual_vfe_enable; unsigned long page_fault_addr; + uint32_t vfe_hw_limit; /* Debug variables */ int dump_reg; @@ -769,6 +777,10 @@ struct vfe_device { /* irq info */ uint32_t irq0_mask; uint32_t irq1_mask; + /* before halt irq info */ + uint32_t recovery_irq0_mask; + uint32_t recovery_irq1_mask; + uint32_t ms_frame_id; }; struct vfe_parent_device { diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c index 9481bede6417c..a0195a934c83e 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp32.c @@ -60,6 +60,16 @@ static struct msm_cam_clk_info msm_vfe32_2_clk_info[] = { {"csi_vfe_clk", -1}, }; +static uint32_t msm_vfe32_ub_reg_offset(struct vfe_device *vfe_dev, int idx) +{ + return (VFE32_WM_BASE(idx) + 0xC); +} + +static uint32_t msm_vfe32_get_ub_size(struct vfe_device *vfe_dev) +{ + return MSM_ISP32_TOTAL_WM_UB; +} + static int32_t msm_vfe32_init_qos_parms(struct vfe_device *vfe_dev, struct msm_vfe_hw_init_parms *qos_parms, struct msm_vfe_hw_init_parms *ds_parms) @@ -1088,75 +1098,6 @@ static void msm_vfe32_axi_clear_wm_xbar_reg( msm_camera_io_w(xbar_reg_cfg, vfe_dev->vfe_base + VFE32_XBAR_BASE(wm)); } -static void msm_vfe32_cfg_axi_ub_equal_default(struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - uint32_t total_image_size = 0; - uint32_t num_used_wms = 0; - uint32_t prop_size = 0; - uint32_t wm_ub_size; - uint64_t delta; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i] > 0) { - num_used_wms++; - total_image_size += axi_data->wm_image_size[i]; - } - } - prop_size = MSM_ISP32_TOTAL_WM_UB - - axi_data->hw_info->min_wm_ub * num_used_wms; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i]) { - delta = - (uint64_t)(axi_data->wm_image_size[i] * - prop_size); - do_div(delta, total_image_size); - wm_ub_size = axi_data->hw_info->min_wm_ub + - (uint32_t)delta; - msm_camera_io_w(ub_offset << 16 | - (wm_ub_size - 1), vfe_dev->vfe_base + - VFE32_WM_BASE(i) + 0xC); - ub_offset += wm_ub_size; - } else { - msm_camera_io_w(0, - vfe_dev->vfe_base + VFE32_WM_BASE(i) + 0xC); - } - } -} - -static void msm_vfe32_cfg_axi_ub_equal_slicing(struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - uint32_t final_ub_slice_size; - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (ub_offset + VFE32_EQUAL_SLICE_UB > VFE32_AXI_SLICE_UB) { - final_ub_slice_size = VFE32_AXI_SLICE_UB - ub_offset; - msm_camera_io_w(ub_offset << 16 | - (final_ub_slice_size - 1), vfe_dev->vfe_base + - VFE32_WM_BASE(i) + 0xC); - ub_offset += final_ub_slice_size; - } else { - msm_camera_io_w(ub_offset << 16 | - (VFE32_EQUAL_SLICE_UB - 1), vfe_dev->vfe_base + - VFE32_WM_BASE(i) + 0xC); - ub_offset += VFE32_EQUAL_SLICE_UB; - } - } -} - -static void msm_vfe32_cfg_axi_ub(struct vfe_device *vfe_dev) -{ - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - axi_data->wm_ub_cfg_policy = MSM_WM_UB_CFG_DEFAULT; - if (axi_data->wm_ub_cfg_policy == MSM_WM_UB_EQUAL_SLICING) - msm_vfe32_cfg_axi_ub_equal_slicing(vfe_dev); - else - msm_vfe32_cfg_axi_ub_equal_default(vfe_dev); -} - static void msm_vfe32_update_ping_pong_addr(void __iomem *vfe_base, uint8_t wm_idx, uint32_t pingpong_bit, dma_addr_t paddr, int32_t buf_size) @@ -1489,13 +1430,15 @@ struct msm_vfe_hardware_info vfe32_hw_info = { .clear_wm_reg = msm_vfe32_axi_clear_wm_reg, .cfg_wm_xbar_reg = msm_vfe32_axi_cfg_wm_xbar_reg, .clear_wm_xbar_reg = msm_vfe32_axi_clear_wm_xbar_reg, - .cfg_ub = msm_vfe32_cfg_axi_ub, + .cfg_ub = msm_vfe47_cfg_axi_ub, .update_ping_pong_addr = msm_vfe32_update_ping_pong_addr, .get_comp_mask = msm_vfe32_get_comp_mask, .get_wm_mask = msm_vfe32_get_wm_mask, .get_pingpong_status = msm_vfe32_get_pingpong_status, .halt = msm_vfe32_axi_halt, + .ub_reg_offset = msm_vfe32_ub_reg_offset, + .get_ub_size = msm_vfe32_get_ub_size, }, .core_ops = { .reg_update = msm_vfe32_reg_update, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c index 18982f5230d64..9764f57e4eb69 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp40.c @@ -34,12 +34,13 @@ #define VFE40_STATS_BURST_LEN_8916_VERSION 2 #define VFE40_FETCH_BURST_LEN 3 #define VFE40_UB_SIZE 1536 /* 1536 * 128 bits = 24KB */ +#define VFE40_STATS_SIZE 392 #define VFE40_UB_SIZE_8952 2048 /* 2048 * 128 bits = 32KB */ #define VFE40_UB_SIZE_8916 3072 /* 3072 * 128 bits = 48KB */ #define VFE40_EQUAL_SLICE_UB 190 /* (UB_SIZE - STATS SIZE)/6 */ #define VFE40_EQUAL_SLICE_UB_8916 236 #define VFE40_TOTAL_WM_UB 1144 /* UB_SIZE - STATS SIZE */ -#define VFE40_TOTAL_WM_UB_8916 1656 +#define VFE40_TOTAL_WM_UB_8916 2680 #define VFE40_WM_BASE(idx) (0x6C + 0x24 * idx) #define VFE40_RDI_BASE(idx) (0x2E8 + 0x4 * idx) #define VFE40_XBAR_BASE(idx) (0x58 + 0x4 * (idx / 2)) @@ -96,6 +97,24 @@ static uint8_t stats_pingpong_offset_map[] = { #define VFE40_CLK_IDX 2 +static uint32_t msm_vfe40_ub_reg_offset(struct vfe_device *vfe_dev, int idx) +{ + return (VFE40_WM_BASE(idx) + 0x10); +} + +static uint32_t msm_vfe40_get_ub_size(struct vfe_device *vfe_dev) +{ + if (vfe_dev->vfe_hw_version == VFE40_8916_VERSION || + vfe_dev->vfe_hw_version == VFE40_8939_VERSION || + vfe_dev->vfe_hw_version == VFE40_8937_VERSION || + vfe_dev->vfe_hw_version == VFE40_8953_VERSION || + vfe_dev->vfe_hw_version == VFE40_8917_VERSION) { + vfe_dev->ub_info->wm_ub = VFE40_TOTAL_WM_UB_8916; + return VFE40_TOTAL_WM_UB_8916; + } + return VFE40_TOTAL_WM_UB; +} + static void msm_vfe40_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, enum msm_isp_irq_operation oper) @@ -572,6 +591,11 @@ static void msm_vfe40_read_irq_status(struct vfe_device *vfe_dev, *irq_status0 &= vfe_dev->irq0_mask; *irq_status1 &= vfe_dev->irq1_mask; + if (*irq_status0 && + (*irq_status0 == msm_camera_io_r(vfe_dev->vfe_base + 0x38))) { + msm_camera_io_w(*irq_status0, vfe_dev->vfe_base + 0x30); + msm_camera_io_w_mb(1, vfe_dev->vfe_base + 0x24); + } if (*irq_status1 & (1 << 0)) { vfe_dev->error_info.camif_status = @@ -686,6 +710,12 @@ static void msm_vfe40_reg_update(struct vfe_device *vfe_dev, vfe_dev->reg_update_requested; if ((vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) && ((frame_src == VFE_PIX_0) || (frame_src == VFE_SRC_MAX))) { + if (!vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]) { + pr_err("%s vfe_base for ISP_VFE0 is NULL\n", __func__); + spin_unlock_irqrestore(&vfe_dev->reg_update_lock, + flags); + return; + } msm_camera_io_w_mb(update_mask, vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0] + 0x378); @@ -1015,8 +1045,8 @@ static int msm_vfe40_start_fetch_engine(struct vfe_device *vfe_dev, rc = vfe_dev->buf_mgr->ops->get_buf_by_index( vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf); if (rc < 0 || !buf) { - pr_err("%s: No fetch buffer rc= %d buf= %p\n", - __func__, rc, buf); + pr_err("%s: No fetch buffer rc= %d\n", + __func__, rc); return -EINVAL; } mapped_info = buf->mapped_info[0]; @@ -1072,7 +1102,7 @@ static int msm_vfe40_start_fetch_engine_multi_pass(struct vfe_device *vfe_dev, rc = vfe_dev->buf_mgr->ops->get_buf_by_index( vfe_dev->buf_mgr, bufq_handle, fe_cfg->buf_idx, &buf); if (rc < 0 || !buf) { - pr_err("%s: No fetch buffer rc= %d buf= %p\n", + pr_err("%s: No fetch buffer rc= %d buf= %pK\n", __func__, rc, buf); return -EINVAL; } @@ -1439,7 +1469,7 @@ static void msm_vfe40_update_camif_state(struct vfe_device *vfe_dev, msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x30); msm_camera_io_w_mb(0x81, vfe_dev->vfe_base + 0x34); msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24); - msm_vfe40_config_irq(vfe_dev, 0xF7, 0x81, + msm_vfe40_config_irq(vfe_dev, 0x17, 0x81, MSM_ISP_IRQ_ENABLE); msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318); @@ -1654,104 +1684,6 @@ static void msm_vfe40_axi_clear_wm_xbar_reg( vfe_dev->vfe_base + VFE40_XBAR_BASE(wm)); } -static void msm_vfe40_cfg_axi_ub_equal_default( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = - &vfe_dev->axi_data; - uint32_t total_image_size = 0; - uint8_t num_used_wms = 0; - uint32_t prop_size = 0; - uint32_t wm_ub_size; - uint32_t total_wm_ub; - - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i] > 0) { - num_used_wms++; - total_image_size += axi_data->wm_image_size[i]; - } - } - - if (vfe_dev->vfe_hw_version == VFE40_8916_VERSION) { - vfe_dev->ub_info->wm_ub = VFE40_TOTAL_WM_UB_8916; - total_wm_ub = VFE40_TOTAL_WM_UB_8916; - } else { - vfe_dev->ub_info->wm_ub = VFE40_TOTAL_WM_UB; - total_wm_ub = VFE40_TOTAL_WM_UB; - } - vfe_dev->ub_info->num_wm = axi_data->hw_info->num_wm; - prop_size = total_wm_ub - - axi_data->hw_info->min_wm_ub * num_used_wms; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i]) { - uint64_t delta = 0; - uint64_t temp = (uint64_t)axi_data->wm_image_size[i] * - (uint64_t)prop_size; - do_div(temp, total_image_size); - delta = temp; - wm_ub_size = axi_data->hw_info->min_wm_ub + delta; - msm_camera_io_w(ub_offset << 16 | (wm_ub_size - 1), - vfe_dev->vfe_base + VFE40_WM_BASE(i) + 0x10); - - vfe_dev->ub_info->data[i] = - ub_offset << 16 | (wm_ub_size - 1); - vfe_dev->ub_info->addr[i] = VFE40_WM_BASE(i) + 0x10; - ub_offset += wm_ub_size; - } else { - msm_camera_io_w(0, - vfe_dev->vfe_base + VFE40_WM_BASE(i) + 0x10); - vfe_dev->ub_info->data[i] = 0; - vfe_dev->ub_info->addr[i] = VFE40_WM_BASE(i) + 0x10; - } - } -} - -static void msm_vfe40_cfg_axi_ub_equal_slicing( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - uint32_t equal_slice_ub; - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - - if (vfe_dev->vfe_hw_version == VFE40_8916_VERSION || - vfe_dev->vfe_hw_version == VFE40_8952_VERSION) { - vfe_dev->ub_info->wm_ub = VFE40_EQUAL_SLICE_UB_8916; - equal_slice_ub = VFE40_EQUAL_SLICE_UB_8916; - } else { - vfe_dev->ub_info->wm_ub = VFE40_EQUAL_SLICE_UB; - equal_slice_ub = VFE40_EQUAL_SLICE_UB; - } - - vfe_dev->ub_info->num_wm = axi_data->hw_info->num_wm; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - msm_camera_io_w(ub_offset << 16 | (equal_slice_ub - 1), - vfe_dev->vfe_base + VFE40_WM_BASE(i) + 0x10); - vfe_dev->ub_info->data[i] = - ub_offset << 16 | (equal_slice_ub - 1); - vfe_dev->ub_info->addr[i] = VFE40_WM_BASE(i) + 0x10; - ub_offset += equal_slice_ub; - } -} - -static void msm_vfe40_cfg_axi_ub(struct vfe_device *vfe_dev) -{ - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - axi_data->wm_ub_cfg_policy = - (enum msm_wm_ub_cfg_type)vfe_dev->vfe_ub_policy; - ISP_DBG("%s: ub_policy %d\n", __func__, axi_data->wm_ub_cfg_policy); - - if (axi_data->wm_ub_cfg_policy == MSM_WM_UB_EQUAL_SLICING) { - vfe_dev->ub_info->policy = MSM_WM_UB_EQUAL_SLICING; - msm_vfe40_cfg_axi_ub_equal_slicing(vfe_dev); - } else { - vfe_dev->ub_info->policy = MSM_WM_UB_CFG_DEFAULT; - msm_vfe40_cfg_axi_ub_equal_default(vfe_dev); - } -} - static void msm_vfe40_read_wm_ping_pong_addr( struct vfe_device *vfe_dev) { @@ -1841,8 +1773,8 @@ static int msm_vfe40_axi_restart(struct vfe_device *vfe_dev, /* Start AXI */ msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x2C0); - msm_vfe40_config_irq(vfe_dev, vfe_dev->irq0_mask, - vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); + msm_vfe40_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); memset(&vfe_dev->error_info, 0, sizeof(vfe_dev->error_info)); @@ -2225,7 +2157,7 @@ static struct msm_vfe_axi_hardware_info msm_vfe40_axi_hw_info = { .num_comp_mask = 3, .num_rdi = 3, .num_rdi_master = 3, - .min_wm_ub = 64, + .min_wm_ub = 96, .scratch_buf_range = SZ_32M + SZ_4M, }; @@ -2259,6 +2191,7 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe40_process_epoch_irq, .config_irq = msm_vfe40_config_irq, + .process_eof_irq = msm_isp47_process_eof_irq, }, .axi_ops = { .reload_wm = msm_vfe40_axi_reload_wm, @@ -2274,7 +2207,7 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .clear_wm_reg = msm_vfe40_axi_clear_wm_reg, .cfg_wm_xbar_reg = msm_vfe40_axi_cfg_wm_xbar_reg, .clear_wm_xbar_reg = msm_vfe40_axi_clear_wm_xbar_reg, - .cfg_ub = msm_vfe40_cfg_axi_ub, + .cfg_ub = msm_vfe47_cfg_axi_ub, .read_wm_ping_pong_addr = msm_vfe40_read_wm_ping_pong_addr, .update_ping_pong_addr = @@ -2286,6 +2219,8 @@ struct msm_vfe_hardware_info vfe40_hw_info = { .restart = msm_vfe40_axi_restart, .update_cgc_override = msm_vfe40_axi_update_cgc_override, + .ub_reg_offset = msm_vfe40_ub_reg_offset, + .get_ub_size = msm_vfe40_get_ub_size, }, .core_ops = { .reg_update = msm_vfe40_reg_update, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c index debd2f4714d3b..cbb9b89661dcf 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp44.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -65,6 +65,16 @@ static uint8_t stats_pingpong_offset_map[] = { #define VFE44_CLK_IDX 2 +static uint32_t msm_vfe44_ub_reg_offset(struct vfe_device *vfe_dev, int wm_idx) +{ + return (VFE44_WM_BASE(wm_idx) + 0x10); +} + +static uint32_t msm_vfe44_get_ub_size(struct vfe_device *vfe_dev) +{ + return MSM_ISP44_TOTAL_IMAGE_UB; +} + static void msm_vfe44_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, enum msm_isp_irq_operation oper) @@ -541,6 +551,12 @@ static void msm_vfe44_reg_update(struct vfe_device *vfe_dev, vfe_dev->reg_update_requested; if ((vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) && ((frame_src == VFE_PIX_0) || (frame_src == VFE_SRC_MAX))) { + if (!vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]) { + pr_err("%s vfe_base for ISP_VFE0 is NULL\n", __func__); + spin_unlock_irqrestore(&vfe_dev->reg_update_lock, + flags); + return; + } msm_camera_io_w_mb(update_mask, vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0] + 0x378); @@ -1028,7 +1044,7 @@ static void msm_vfe44_update_camif_state(struct vfe_device *vfe_dev, msm_camera_io_w_mb(0x81, vfe_dev->vfe_base + 0x34); msm_camera_io_w_mb(0x1, vfe_dev->vfe_base + 0x24); - msm_vfe44_config_irq(vfe_dev, 0xF7, 0x81, + msm_vfe44_config_irq(vfe_dev, 0x17, 0x81, MSM_ISP_IRQ_ENABLE); msm_camera_io_w_mb(0x140000, vfe_dev->vfe_base + 0x318); @@ -1218,67 +1234,6 @@ static void msm_vfe44_axi_clear_wm_xbar_reg( vfe_dev->vfe_base + VFE44_XBAR_BASE(wm)); } -static void msm_vfe44_cfg_axi_ub_equal_default( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = - &vfe_dev->axi_data; - uint32_t total_image_size = 0; - uint8_t num_used_wms = 0; - uint32_t prop_size = 0; - uint32_t wm_ub_size; - uint64_t delta; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i] > 0) { - num_used_wms++; - total_image_size += axi_data->wm_image_size[i]; - } - } - prop_size = MSM_ISP44_TOTAL_IMAGE_UB - - axi_data->hw_info->min_wm_ub * num_used_wms; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i]) { - delta = (uint64_t)axi_data->wm_image_size[i] * - (uint64_t)prop_size; - do_div(delta, total_image_size); - wm_ub_size = axi_data->hw_info->min_wm_ub + - (uint32_t)delta; - msm_camera_io_w(ub_offset << 16 | (wm_ub_size - 1), - vfe_dev->vfe_base + VFE44_WM_BASE(i) + 0x10); - ub_offset += wm_ub_size; - } else - msm_camera_io_w(0, - vfe_dev->vfe_base + VFE44_WM_BASE(i) + 0x10); - } -} - -static void msm_vfe44_cfg_axi_ub_equal_slicing( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - uint32_t ub_equal_slice = MSM_ISP44_TOTAL_IMAGE_UB / - axi_data->hw_info->num_wm; - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - msm_camera_io_w(ub_offset << 16 | (ub_equal_slice - 1), - vfe_dev->vfe_base + VFE44_WM_BASE(i) + 0x10); - ub_offset += ub_equal_slice; - } -} - -static void msm_vfe44_cfg_axi_ub(struct vfe_device *vfe_dev) -{ - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - axi_data->wm_ub_cfg_policy = MSM_WM_UB_CFG_DEFAULT; - if (axi_data->wm_ub_cfg_policy == MSM_WM_UB_EQUAL_SLICING) - msm_vfe44_cfg_axi_ub_equal_slicing(vfe_dev); - else - msm_vfe44_cfg_axi_ub_equal_default(vfe_dev); -} - static void msm_vfe44_read_wm_ping_pong_addr( struct vfe_device *vfe_dev) { @@ -1376,8 +1331,8 @@ static int msm_vfe44_axi_restart(struct vfe_device *vfe_dev, /* Start AXI */ msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x2C0); - msm_vfe44_config_irq(vfe_dev, vfe_dev->irq0_mask, vfe_dev->irq1_mask, - MSM_ISP_IRQ_SET); + msm_vfe44_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); memset(&vfe_dev->error_info, 0, sizeof(vfe_dev->error_info)); @@ -1832,6 +1787,7 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe44_process_epoch_irq, .config_irq = msm_vfe44_config_irq, + .process_eof_irq = msm_isp47_process_eof_irq, }, .axi_ops = { .reload_wm = msm_vfe44_axi_reload_wm, @@ -1847,7 +1803,7 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .clear_wm_reg = msm_vfe44_axi_clear_wm_reg, .cfg_wm_xbar_reg = msm_vfe44_axi_cfg_wm_xbar_reg, .clear_wm_xbar_reg = msm_vfe44_axi_clear_wm_xbar_reg, - .cfg_ub = msm_vfe44_cfg_axi_ub, + .cfg_ub = msm_vfe47_cfg_axi_ub, .read_wm_ping_pong_addr = msm_vfe44_read_wm_ping_pong_addr, .update_ping_pong_addr = @@ -1859,6 +1815,8 @@ struct msm_vfe_hardware_info vfe44_hw_info = { .restart = msm_vfe44_axi_restart, .update_cgc_override = msm_vfe44_axi_update_cgc_override, + .ub_reg_offset = msm_vfe44_ub_reg_offset, + .get_ub_size = msm_vfe44_get_ub_size, }, .core_ops = { .reg_update = msm_vfe44_reg_update, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c index ca75a47eddb28..a785b164f0bdd 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp46.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -87,6 +87,18 @@ static uint8_t stats_pingpong_offset_map[] = { #define VFE46_CLK_IDX 2 +uint32_t msm_vfe46_ub_reg_offset(struct vfe_device *vfe_dev, int wm_idx) +{ + return (VFE46_WM_BASE(wm_idx) + 0x10); +} + +uint32_t msm_vfe46_get_ub_size(struct vfe_device *vfe_dev) +{ + if (vfe_dev->pdev->id == ISP_VFE0) + return MSM_ISP46_TOTAL_IMAGE_UB_VFE0; + return MSM_ISP46_TOTAL_IMAGE_UB_VFE1; +} + static void msm_vfe46_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, enum msm_isp_irq_operation oper) @@ -479,6 +491,12 @@ static void msm_vfe46_reg_update(struct vfe_device *vfe_dev, vfe_dev->reg_update_requested; if ((vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) && ((frame_src == VFE_PIX_0) || (frame_src == VFE_SRC_MAX))) { + if (!vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]) { + pr_err("%s vfe_base for ISP_VFE0 is NULL\n", __func__); + spin_unlock_irqrestore(&vfe_dev->reg_update_lock, + flags); + return; + } msm_camera_io_w_mb(update_mask, vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0] + 0x3D8); @@ -1104,7 +1122,7 @@ static void msm_vfe46_update_camif_state(struct vfe_device *vfe_dev, msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x64); msm_camera_io_w(0x81, vfe_dev->vfe_base + 0x68); msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58); - msm_vfe46_config_irq(vfe_dev, 0x15, 0x81, + msm_vfe46_config_irq(vfe_dev, 0x17, 0x81, MSM_ISP_IRQ_ENABLE); bus_en = @@ -1290,85 +1308,6 @@ static void msm_vfe46_axi_clear_wm_xbar_reg( vfe_dev->vfe_base + VFE46_XBAR_BASE(wm)); } - -static void msm_vfe46_cfg_axi_ub_equal_default( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = - &vfe_dev->axi_data; - uint32_t total_image_size = 0; - uint8_t num_used_wms = 0; - uint32_t prop_size = 0; - uint32_t wm_ub_size; - uint64_t delta; - - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i] > 0) { - num_used_wms++; - total_image_size += axi_data->wm_image_size[i]; - } - } - if (vfe_dev->pdev->id == ISP_VFE0) { - prop_size = MSM_ISP46_TOTAL_IMAGE_UB_VFE0 - - axi_data->hw_info->min_wm_ub * num_used_wms; - } else if (vfe_dev->pdev->id == ISP_VFE1) { - prop_size = MSM_ISP46_TOTAL_IMAGE_UB_VFE1 - - axi_data->hw_info->min_wm_ub * num_used_wms; - } else { - pr_err("%s: incorrect VFE device\n", __func__); - } - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i]) { - delta = (uint64_t)axi_data->wm_image_size[i] * - (uint64_t)prop_size; - do_div(delta, total_image_size); - wm_ub_size = axi_data->hw_info->min_wm_ub + - (uint32_t)delta; - msm_camera_io_w(ub_offset << 16 | (wm_ub_size - 1), - vfe_dev->vfe_base + VFE46_WM_BASE(i) + 0x10); - ub_offset += wm_ub_size; - } else - msm_camera_io_w(0, - vfe_dev->vfe_base + VFE46_WM_BASE(i) + 0x10); - } -} - -static void msm_vfe46_cfg_axi_ub_equal_slicing( - struct vfe_device *vfe_dev) -{ - int i; - uint32_t ub_offset = 0; - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - uint32_t ub_equal_slice = 0; - if (vfe_dev->pdev->id == ISP_VFE0) { - ub_equal_slice = MSM_ISP46_TOTAL_IMAGE_UB_VFE0 / - axi_data->hw_info->num_wm; - } else if (vfe_dev->pdev->id == ISP_VFE1) { - ub_equal_slice = MSM_ISP46_TOTAL_IMAGE_UB_VFE1 / - axi_data->hw_info->num_wm; - } else { - pr_err("%s: incorrect VFE device\n ", __func__); - } - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - msm_camera_io_w(ub_offset << 16 | (ub_equal_slice - 1), - vfe_dev->vfe_base + VFE46_WM_BASE(i) + 0x10); - ub_offset += ub_equal_slice; - } -} - -static void msm_vfe46_cfg_axi_ub(struct vfe_device *vfe_dev) -{ - struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - - axi_data->wm_ub_cfg_policy = MSM_WM_UB_CFG_DEFAULT; - if (axi_data->wm_ub_cfg_policy == MSM_WM_UB_EQUAL_SLICING) - msm_vfe46_cfg_axi_ub_equal_slicing(vfe_dev); - else - msm_vfe46_cfg_axi_ub_equal_default(vfe_dev); -} - static void msm_vfe46_read_wm_ping_pong_addr( struct vfe_device *vfe_dev) { @@ -1470,8 +1409,8 @@ static int msm_vfe46_axi_restart(struct vfe_device *vfe_dev, memset(&vfe_dev->error_info, 0, sizeof(vfe_dev->error_info)); atomic_set(&vfe_dev->error_info.overflow_state, NO_OVERFLOW); - msm_vfe46_config_irq(vfe_dev, vfe_dev->irq0_mask, - vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); + msm_vfe46_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); @@ -1936,6 +1875,7 @@ struct msm_vfe_hardware_info vfe46_hw_info = { .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe46_process_epoch_irq, .config_irq = msm_vfe46_config_irq, + .process_eof_irq = msm_isp47_process_eof_irq, }, .axi_ops = { .reload_wm = msm_vfe46_axi_reload_wm, @@ -1951,7 +1891,7 @@ struct msm_vfe_hardware_info vfe46_hw_info = { .clear_wm_reg = msm_vfe46_axi_clear_wm_reg, .cfg_wm_xbar_reg = msm_vfe46_axi_cfg_wm_xbar_reg, .clear_wm_xbar_reg = msm_vfe46_axi_clear_wm_xbar_reg, - .cfg_ub = msm_vfe46_cfg_axi_ub, + .cfg_ub = msm_vfe47_cfg_axi_ub, .read_wm_ping_pong_addr = msm_vfe46_read_wm_ping_pong_addr, .update_ping_pong_addr = @@ -1963,6 +1903,8 @@ struct msm_vfe_hardware_info vfe46_hw_info = { .restart = msm_vfe46_axi_restart, .update_cgc_override = msm_vfe46_axi_update_cgc_override, + .ub_reg_offset = msm_vfe46_ub_reg_offset, + .get_ub_size = msm_vfe46_get_ub_size, }, .core_ops = { .reg_update = msm_vfe46_reg_update, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c index f08d6ededa94e..e45d049fe5be5 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -98,6 +98,7 @@ static uint8_t stats_irq_map_comp_mask[] = { (~(ping_pong >> (stats_pingpong_offset_map[idx])) & 0x1) * 2) #define VFE47_SRC_CLK_DTSI_IDX 5 +#define HANDLE_TO_IDX(handle) (handle & 0xFF) static struct msm_bus_vectors msm_isp_init_vectors[] = { { @@ -151,6 +152,18 @@ static struct msm_bus_scale_pdata msm_isp_bus_client_pdata = { .name = "msm_camera_isp", }; +uint32_t msm_vfe47_ub_reg_offset(struct vfe_device *vfe_dev, int wm_idx) +{ + return (VFE47_WM_BASE(wm_idx) + 0x18); +} + +uint32_t msm_vfe47_get_ub_size(struct vfe_device *vfe_dev) +{ + if (vfe_dev->pdev->id == ISP_VFE0) + return MSM_ISP47_TOTAL_IMAGE_UB_VFE0; + return MSM_ISP47_TOTAL_IMAGE_UB_VFE1; +} + void msm_vfe47_config_irq(struct vfe_device *vfe_dev, uint32_t irq0_mask, uint32_t irq1_mask, enum msm_isp_irq_operation oper) @@ -179,7 +192,7 @@ static int32_t msm_vfe47_init_dt_parms(struct vfe_device *vfe_dev, struct msm_vfe_hw_init_parms *dt_parms, void __iomem *dev_mem_base) { struct device_node *of_node; - int32_t i = 0 , rc = 0; + int32_t i = 0, rc = 0; uint32_t *dt_settings = NULL, *dt_regs = NULL, num_dt_entries = 0; of_node = vfe_dev->pdev->dev.of_node; @@ -655,6 +668,13 @@ void msm_vfe47_process_epoch_irq(struct vfe_device *vfe_dev, } } +void msm_isp47_process_eof_irq(struct vfe_device *vfe_dev, + uint32_t irq_status0) +{ + if (irq_status0 & BIT(1)) + vfe_dev->axi_data.src_info[VFE_PIX_0].eof_id++; +} + void msm_vfe47_reg_update(struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src) { @@ -685,6 +705,12 @@ void msm_vfe47_reg_update(struct vfe_device *vfe_dev, vfe_dev->reg_update_requested; if ((vfe_dev->is_split && vfe_dev->pdev->id == ISP_VFE1) && ((frame_src == VFE_PIX_0) || (frame_src == VFE_SRC_MAX))) { + if (!vfe_dev->common_data->dual_vfe_res->vfe_base[ISP_VFE0]) { + pr_err("%s vfe_base for ISP_VFE0 is NULL\n", __func__); + spin_unlock_irqrestore(&vfe_dev->reg_update_lock, + flags); + return; + } msm_camera_io_w_mb(update_mask, vfe_dev->common_data->dual_vfe_res-> vfe_base[ISP_VFE0] + 0x4AC); @@ -1456,7 +1482,7 @@ void msm_vfe47_update_camif_state(struct vfe_device *vfe_dev, msm_camera_io_w(0x0, vfe_dev->vfe_base + 0x64); msm_camera_io_w(0x81, vfe_dev->vfe_base + 0x68); msm_camera_io_w(0x1, vfe_dev->vfe_base + 0x58); - msm_vfe47_config_irq(vfe_dev, 0x15, 0x81, + msm_vfe47_config_irq(vfe_dev, 0x17, 0x81, MSM_ISP_IRQ_ENABLE); if ((vfe_dev->hvx_cmd > HVX_DISABLE) && @@ -1494,6 +1520,7 @@ void msm_vfe47_update_camif_state(struct vfe_device *vfe_dev, msm_camera_io_w_mb((update_state == DISABLE_CAMIF ? 0x0 : 0x6), vfe_dev->vfe_base + 0x478); vfe_dev->axi_data.src_info[VFE_PIX_0].active = 0; + vfe_dev->axi_data.src_info[VFE_PIX_0].flag = 0; /* testgen OFF*/ if (vfe_dev->axi_data.src_info[VFE_PIX_0].input_mux == TESTGEN) msm_camera_io_w(1 << 1, vfe_dev->vfe_base + 0xC58); @@ -1653,7 +1680,7 @@ void msm_vfe47_axi_clear_wm_xbar_reg( void msm_vfe47_cfg_axi_ub_equal_default( - struct vfe_device *vfe_dev) + struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src) { int i; uint32_t ub_offset = 0; @@ -1664,35 +1691,61 @@ void msm_vfe47_cfg_axi_ub_equal_default( uint32_t prop_size = 0; uint32_t wm_ub_size; uint64_t delta; - - for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i] > 0) { - num_used_wms++; - total_image_size += axi_data->wm_image_size[i]; + uint32_t rdi_ub_offset; + + if (frame_src == VFE_PIX_0) { + for (i = 0; i < axi_data->hw_info->num_wm; i++) { + if (axi_data->free_wm[i] && + SRC_TO_INTF( + HANDLE_TO_IDX(axi_data->free_wm[i])) == + VFE_PIX_0) { + num_used_wms++; + total_image_size += + axi_data->wm_image_size[i]; + } } - } - if (vfe_dev->pdev->id == ISP_VFE0) { - prop_size = MSM_ISP47_TOTAL_IMAGE_UB_VFE0 - - axi_data->hw_info->min_wm_ub * num_used_wms; - } else if (vfe_dev->pdev->id == ISP_VFE1) { - prop_size = MSM_ISP47_TOTAL_IMAGE_UB_VFE1 - - axi_data->hw_info->min_wm_ub * num_used_wms; - } else { - pr_err("%s: incorrect VFE device\n", __func__); + ub_offset = (axi_data->hw_info->num_rdi * 2) * + axi_data->hw_info->min_wm_ub; + prop_size = vfe_dev->hw_info->vfe_ops.axi_ops. + get_ub_size(vfe_dev) - + axi_data->hw_info->min_wm_ub * (num_used_wms + + axi_data->hw_info->num_rdi * 2); } for (i = 0; i < axi_data->hw_info->num_wm; i++) { - if (axi_data->free_wm[i]) { + if (!axi_data->free_wm[i]) { + msm_camera_io_w(0, + vfe_dev->vfe_base + + vfe_dev->hw_info->vfe_ops.axi_ops. + ub_reg_offset(vfe_dev, i)); + } + if (!axi_data->free_wm[i] || frame_src != SRC_TO_INTF( + HANDLE_TO_IDX(axi_data->free_wm[i]))) + continue; + + if (frame_src == VFE_PIX_0) { delta = (uint64_t)axi_data->wm_image_size[i] * - (uint64_t)prop_size; - do_div(delta, total_image_size); - wm_ub_size = axi_data->hw_info->min_wm_ub + + (uint64_t)prop_size; + do_div(delta, total_image_size); + wm_ub_size = axi_data->hw_info->min_wm_ub + (uint32_t)delta; msm_camera_io_w(ub_offset << 16 | (wm_ub_size - 1), - vfe_dev->vfe_base + VFE47_WM_BASE(i) + 0x18); + vfe_dev->vfe_base + + vfe_dev->hw_info->vfe_ops.axi_ops. + ub_reg_offset(vfe_dev, i)); ub_offset += wm_ub_size; - } else - msm_camera_io_w(0, - vfe_dev->vfe_base + VFE47_WM_BASE(i) + 0x18); + } else { + + rdi_ub_offset = (SRC_TO_INTF( + HANDLE_TO_IDX(axi_data->free_wm[i])) - + VFE_RAW_0) * 2 * + axi_data->hw_info->min_wm_ub; + wm_ub_size = axi_data->hw_info->min_wm_ub * 2; + msm_camera_io_w((rdi_ub_offset << 16 | + (wm_ub_size - 1)), + vfe_dev->vfe_base + + vfe_dev->hw_info->vfe_ops.axi_ops. + ub_reg_offset(vfe_dev, i)); + } } } @@ -1703,31 +1756,29 @@ void msm_vfe47_cfg_axi_ub_equal_slicing( uint32_t ub_offset = 0; struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; uint32_t ub_equal_slice = 0; - if (vfe_dev->pdev->id == ISP_VFE0) { - ub_equal_slice = MSM_ISP47_TOTAL_IMAGE_UB_VFE0 / - axi_data->hw_info->num_wm; - } else if (vfe_dev->pdev->id == ISP_VFE1) { - ub_equal_slice = MSM_ISP47_TOTAL_IMAGE_UB_VFE1 / - axi_data->hw_info->num_wm; - } else { - pr_err("%s: incorrect VFE device\n ", __func__); - } + + ub_equal_slice = vfe_dev->hw_info->vfe_ops.axi_ops. + get_ub_size(vfe_dev) / + axi_data->hw_info->num_wm; for (i = 0; i < axi_data->hw_info->num_wm; i++) { msm_camera_io_w(ub_offset << 16 | (ub_equal_slice - 1), - vfe_dev->vfe_base + VFE47_WM_BASE(i) + 0x18); + vfe_dev->vfe_base + + vfe_dev->hw_info->vfe_ops.axi_ops. + ub_reg_offset(vfe_dev, i)); ub_offset += ub_equal_slice; } } -void msm_vfe47_cfg_axi_ub(struct vfe_device *vfe_dev) +void msm_vfe47_cfg_axi_ub(struct vfe_device *vfe_dev, + enum msm_vfe_input_src frame_src) { struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; - axi_data->wm_ub_cfg_policy = UB_CFG_POLICY; + axi_data->wm_ub_cfg_policy = MSM_WM_UB_CFG_DEFAULT; if (axi_data->wm_ub_cfg_policy == MSM_WM_UB_EQUAL_SLICING) msm_vfe47_cfg_axi_ub_equal_slicing(vfe_dev); else - msm_vfe47_cfg_axi_ub_equal_default(vfe_dev); + msm_vfe47_cfg_axi_ub_equal_default(vfe_dev, frame_src); } void msm_vfe47_read_wm_ping_pong_addr( @@ -1847,8 +1898,8 @@ int msm_vfe47_axi_restart(struct vfe_device *vfe_dev, atomic_set(&vfe_dev->error_info.overflow_state, NO_OVERFLOW); /* reset the irq masks without camif violation and errors */ - msm_vfe47_config_irq(vfe_dev, vfe_dev->irq0_mask, - vfe_dev->irq1_mask, MSM_ISP_IRQ_SET); + msm_vfe47_config_irq(vfe_dev, vfe_dev->recovery_irq0_mask, + vfe_dev->recovery_irq1_mask, MSM_ISP_IRQ_SET); vfe_dev->hw_info->vfe_ops.core_ops.reg_update(vfe_dev, VFE_SRC_MAX); @@ -2530,6 +2581,8 @@ int msm_vfe47_enable_regulators(struct vfe_device *vfe_dev, int enable) int msm_vfe47_get_platform_data(struct vfe_device *vfe_dev) { int rc = 0; + void __iomem *vfe_fuse_base; + uint32_t vfe_fuse_base_size; vfe_dev->vfe_base = msm_camera_get_reg_base(vfe_dev->pdev, "vfe", 0); if (!vfe_dev->vfe_base) @@ -2554,7 +2607,18 @@ int msm_vfe47_get_platform_data(struct vfe_device *vfe_dev) rc = -ENOMEM; goto get_res_fail; } - + vfe_dev->vfe_hw_limit = 0; + vfe_fuse_base = msm_camera_get_reg_base(vfe_dev->pdev, + "vfe_fuse", 0); + vfe_fuse_base_size = msm_camera_get_res_size(vfe_dev->pdev, + "vfe_fuse"); + if (vfe_fuse_base) { + if (vfe_fuse_base_size) + vfe_dev->vfe_hw_limit = + (msm_camera_io_r(vfe_fuse_base) >> 7) & 0x3; + msm_camera_put_reg_base(vfe_dev->pdev, vfe_fuse_base, + "vfe_fuse", 0); + } rc = vfe_dev->hw_info->vfe_ops.platform_ops.get_regulators(vfe_dev); if (rc) goto get_regulator_fail; @@ -2667,6 +2731,7 @@ struct msm_vfe_hardware_info vfe47_hw_info = { .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe47_process_epoch_irq, .config_irq = msm_vfe47_config_irq, + .process_eof_irq = msm_isp47_process_eof_irq, }, .axi_ops = { .reload_wm = msm_vfe47_axi_reload_wm, @@ -2694,6 +2759,8 @@ struct msm_vfe_hardware_info vfe47_hw_info = { .restart = msm_vfe47_axi_restart, .update_cgc_override = msm_vfe47_axi_update_cgc_override, + .ub_reg_offset = msm_vfe47_ub_reg_offset, + .get_ub_size = msm_vfe47_get_ub_size, }, .core_ops = { .reg_update = msm_vfe47_reg_update, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h index 58d4894398f50..282808250193c 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp47.h @@ -40,6 +40,8 @@ void msm_vfe47_process_reg_update(struct vfe_device *vfe_dev, void msm_vfe47_process_epoch_irq(struct vfe_device *vfe_dev, uint32_t irq_status0, uint32_t irq_status1, struct msm_isp_timestamp *ts); +void msm_isp47_process_eof_irq(struct vfe_device *vfe_dev, + uint32_t irq_status0); void msm_vfe47_reg_update(struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src); long msm_vfe47_reset_hardware(struct vfe_device *vfe_dev, @@ -95,10 +97,11 @@ void msm_vfe47_axi_clear_wm_xbar_reg( struct vfe_device *vfe_dev, struct msm_vfe_axi_stream *stream_info, uint8_t plane_idx); void msm_vfe47_cfg_axi_ub_equal_default( - struct vfe_device *vfe_dev); + struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src); void msm_vfe47_cfg_axi_ub_equal_slicing( struct vfe_device *vfe_dev); -void msm_vfe47_cfg_axi_ub(struct vfe_device *vfe_dev); +void msm_vfe47_cfg_axi_ub(struct vfe_device *vfe_dev, + enum msm_vfe_input_src frame_src); void msm_vfe47_read_wm_ping_pong_addr( struct vfe_device *vfe_dev); void msm_vfe47_update_ping_pong_addr( diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp48.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp48.c index be7c97fd34087..8f058a86b6155 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp48.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp48.c @@ -236,6 +236,7 @@ struct msm_vfe_hardware_info vfe48_hw_info = { .process_stats_irq = msm_isp_process_stats_irq, .process_epoch_irq = msm_vfe47_process_epoch_irq, .config_irq = msm_vfe47_config_irq, + .process_eof_irq = msm_isp47_process_eof_irq, }, .axi_ops = { .reload_wm = msm_vfe47_axi_reload_wm, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c index f3a6e6c074a43..1e1b5af4b12f3 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.c @@ -17,10 +17,10 @@ #define HANDLE_TO_IDX(handle) (handle & 0xFF) #define ISP_SOF_DEBUG_COUNT 0 - static int msm_isp_update_dual_HW_ms_info_at_start( struct vfe_device *vfe_dev, - enum msm_vfe_input_src stream_src); + enum msm_vfe_input_src stream_src, + struct msm_isp_timestamp *ts); static int msm_isp_update_dual_HW_axi( struct vfe_device *vfe_dev, @@ -452,6 +452,8 @@ int msm_isp_axi_check_stream_state( } stream_info = &axi_data->stream_info[ HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])]; + if (stream_info->state == AVAILABLE) + continue; spin_lock_irqsave(&stream_info->lock, flags); if (stream_info->state != valid_state) { if ((stream_info->state == PAUSING || @@ -816,12 +818,14 @@ void msm_isp_increment_frame_id(struct vfe_device *vfe_dev, struct msm_vfe_sof_info *master_sof_info = NULL; int32_t time, master_time, delta; uint32_t sof_incr = 0; + uint32_t master_last_slave_diff = 0; + uint32_t last_curr_diff = 0; unsigned long flags; - if (vfe_dev->axi_data.src_info[frame_src].frame_id == 0) - msm_isp_update_dual_HW_ms_info_at_start(vfe_dev, frame_src); - spin_lock_irqsave(&vfe_dev->common_data->common_dev_data_lock, flags); + if (vfe_dev->axi_data.src_info[frame_src].frame_id == 0) + msm_isp_update_dual_HW_ms_info_at_start(vfe_dev, frame_src, + ts); dual_hw_type = vfe_dev->axi_data.src_info[frame_src].dual_hw_type; ms_type = @@ -863,6 +867,25 @@ void msm_isp_increment_frame_id(struct vfe_device *vfe_dev, */ vfe_dev->axi_data.src_info[frame_src].frame_id = master_sof_info->frame_id + sof_incr; + /* handle frame id out of sync */ + if (sof_incr) { + last_curr_diff = + vfe_dev->axi_data.src_info[frame_src].frame_id - + vfe_dev->ms_frame_id; + master_last_slave_diff = master_sof_info->frame_id - + vfe_dev->ms_frame_id; + if (last_curr_diff > 1 && + master_last_slave_diff == 1) { + pr_err("%s: frame id %d out of sync !!!\n", + __func__, + vfe_dev->axi_data.src_info[frame_src]. + frame_id - sof_incr); + vfe_dev->axi_data.src_info[frame_src]. + frame_id = master_sof_info->frame_id; + } + } + vfe_dev->ms_frame_id = + vfe_dev->axi_data.src_info[frame_src].frame_id; } else { if (frame_src == VFE_PIX_0) { vfe_dev->axi_data.src_info[frame_src].frame_id += @@ -892,7 +915,6 @@ void msm_isp_increment_frame_id(struct vfe_device *vfe_dev, } else vfe_dev->axi_data.src_info[frame_src].frame_id++; } - sof_info = vfe_dev->axi_data.src_info[frame_src]. dual_hw_ms_info.sof_info; if (dual_hw_type == DUAL_HW_MASTER_SLAVE && @@ -997,7 +1019,7 @@ void msm_isp_notify(struct vfe_device *vfe_dev, uint32_t event_type, spin_unlock_irqrestore(&vfe_dev->common_data-> common_dev_data_lock, flags); } else { - if (frame_src == VFE_PIX_0) { + if (frame_src <= VFE_RAW_2) { msm_isp_check_for_output_error(vfe_dev, ts, &event_data.u.sof_info); } @@ -1449,7 +1471,7 @@ void msm_isp_axi_cfg_update(struct vfe_device *vfe_dev, { int i, j; uint32_t update_state; - unsigned long flags; + unsigned long flags, flags1; struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; struct msm_vfe_axi_stream *stream_info; int num_stream = 0; @@ -1462,11 +1484,13 @@ void msm_isp_axi_cfg_update(struct vfe_device *vfe_dev, } num_stream++; stream_info = &axi_data->stream_info[i]; + if (stream_info->state == INACTIVE) + continue; if ((stream_info->stream_type == BURST_STREAM && !stream_info->controllable_output) || stream_info->state == AVAILABLE) continue; - spin_lock_irqsave(&stream_info->lock, flags); + spin_lock_irqsave(&stream_info->lock, flags1); if (stream_info->state == PAUSING) { /*AXI Stopped, apply update*/ stream_info->state = PAUSED; @@ -1480,7 +1504,7 @@ void msm_isp_axi_cfg_update(struct vfe_device *vfe_dev, } else if (stream_info->state == RESUMING) { msm_isp_update_dual_HW_axi(vfe_dev, stream_info); } - spin_unlock_irqrestore(&stream_info->lock, flags); + spin_unlock_irqrestore(&stream_info->lock, flags1); } spin_unlock_irqrestore(&vfe_dev->common_data->common_dev_data_lock, flags); @@ -1526,6 +1550,27 @@ void msm_isp_halt_send_error(struct vfe_device *vfe_dev, uint32_t event) uint32_t i = 0; struct msm_isp_event_data error_event; struct msm_vfe_axi_halt_cmd halt_cmd; + uint32_t irq_status0, irq_status1; + + if (atomic_read(&vfe_dev->error_info.overflow_state) != + NO_OVERFLOW) + /* Recovery is already in Progress */ + return; + + if (ISP_EVENT_PING_PONG_MISMATCH == event && + vfe_dev->axi_data.recovery_count < MAX_RECOVERY_THRESHOLD) { + vfe_dev->hw_info->vfe_ops.irq_ops. + read_irq_status(vfe_dev, &irq_status0, &irq_status1); + pr_err("%s:pingpong mismatch from vfe%d, core%d, recovery_count %d\n", + __func__, vfe_dev->pdev->id, smp_processor_id(), + vfe_dev->axi_data.recovery_count); + + vfe_dev->axi_data.recovery_count++; + + msm_isp_process_overflow_irq(vfe_dev, + &irq_status0, &irq_status1, 1); + return; + } memset(&halt_cmd, 0, sizeof(struct msm_vfe_axi_halt_cmd)); memset(&error_event, 0, sizeof(struct msm_isp_event_data)); @@ -1533,7 +1578,7 @@ void msm_isp_halt_send_error(struct vfe_device *vfe_dev, uint32_t event) halt_cmd.overflow_detected = 0; halt_cmd.blocking_halt = 0; - pr_err("%s: vfe%d fatal error!\n", __func__, vfe_dev->pdev->id); + pr_err("%s: vfe%d exiting camera!\n", __func__, vfe_dev->pdev->id); atomic_set(&vfe_dev->error_info.overflow_state, HALT_ENFORCED); @@ -1599,6 +1644,7 @@ static struct msm_isp_buffer *msm_isp_get_stream_buffer( struct msm_isp_buffer *buf = NULL; struct msm_vfe_axi_stream *temp_stream_info = NULL; struct msm_vfe_frame_request_queue *queue_req; + uint32_t buf_index = MSM_ISP_INVALID_BUF_INDEX; if (!stream_info->controllable_output) { bufq_handle = stream_info->bufq_handle @@ -1621,12 +1667,13 @@ static struct msm_isp_buffer *msm_isp_get_stream_buffer( __func__); return buf; } + buf_index = queue_req->buf_index; queue_req->cmd_used = 0; list_del(&queue_req->list); temp_stream_info->request_q_cnt--; } rc = vfe_dev->buf_mgr->ops->get_buf(vfe_dev->buf_mgr, - vfe_dev->pdev->id, bufq_handle, &buf); + vfe_dev->pdev->id, bufq_handle, buf_index, &buf); if (rc == -EFAULT) { msm_isp_halt_send_error(vfe_dev, @@ -1670,8 +1717,8 @@ int msm_isp_cfg_offline_ping_pong_address(struct vfe_device *vfe_dev, rc = vfe_dev->buf_mgr->ops->get_buf_by_index( vfe_dev->buf_mgr, bufq_handle, buf_idx, &buf); if (rc < 0 || !buf) { - pr_err("%s: No fetch buffer rc= %d buf= %p\n", - __func__, rc, buf); + pr_err("%s: No fetch buffer rc= %d\n", + __func__, rc); return -EINVAL; } @@ -1803,10 +1850,8 @@ static int msm_isp_cfg_ping_pong_address(struct vfe_device *vfe_dev, for (vfe_id = 0; vfe_id < MAX_VFE; vfe_id++) { if (vfe_id != vfe_dev->pdev->id) spin_lock_irqsave( - &dual_vfe_res-> - axi_data[vfe_id]-> - stream_info[stream_idx]. - lock, flags); + &vfe_dev->common_data-> + common_dev_axi_lock, flags); if (buf) vfe_dev->hw_info->vfe_ops.axi_ops. @@ -1835,10 +1880,8 @@ static int msm_isp_cfg_ping_pong_address(struct vfe_device *vfe_dev, } if (vfe_id != vfe_dev->pdev->id) spin_unlock_irqrestore( - &dual_vfe_res-> - axi_data[vfe_id]-> - stream_info[stream_idx]. - lock, flags); + &vfe_dev->common_data-> + common_dev_axi_lock, flags); } } else { if (buf) @@ -2111,8 +2154,7 @@ static void msm_isp_get_camif_update_state_and_halt( *camif_update = DISABLE_CAMIF_IMMEDIATELY; else *camif_update = DISABLE_CAMIF; - } - else + } else *camif_update = NO_UPDATE; } else *camif_update = NO_UPDATE; @@ -2137,25 +2179,31 @@ static void msm_isp_update_camif_output_count( stream_info = &axi_data->stream_info[ HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])]; - if (stream_info->stream_src >= RDI_INTF_0) - continue; if (stream_info->stream_src == PIX_ENCODER || stream_info->stream_src == PIX_VIEWFINDER || stream_info->stream_src == PIX_VIDEO || stream_info->stream_src == IDEAL_RAW) { if (stream_cfg_cmd->cmd == START_STREAM) - vfe_dev->axi_data.src_info[VFE_PIX_0]. - pix_stream_count++; + vfe_dev->axi_data.src_info[ + SRC_TO_INTF(stream_info->stream_src)]. + pix_stream_count++; else - vfe_dev->axi_data.src_info[VFE_PIX_0]. - pix_stream_count--; - } else if (stream_info->stream_src == CAMIF_RAW) { + vfe_dev->axi_data.src_info[ + SRC_TO_INTF(stream_info->stream_src)]. + pix_stream_count--; + } else if (stream_info->stream_src == CAMIF_RAW || + stream_info->stream_src == RDI_INTF_0 || + stream_info->stream_src == RDI_INTF_1 || + stream_info->stream_src == RDI_INTF_2) { if (stream_cfg_cmd->cmd == START_STREAM) - vfe_dev->axi_data.src_info[VFE_PIX_0]. - raw_stream_count++; + vfe_dev->axi_data.src_info[ + SRC_TO_INTF(stream_info->stream_src)]. + raw_stream_count++; else - vfe_dev->axi_data.src_info[VFE_PIX_0]. - raw_stream_count--; + vfe_dev->axi_data.src_info[ + SRC_TO_INTF(stream_info->stream_src)]. + raw_stream_count--; + } } } @@ -2163,9 +2211,10 @@ static void msm_isp_update_camif_output_count( /*Factor in Q2 format*/ #define ISP_DEFAULT_FORMAT_FACTOR 6 #define ISP_BUS_UTILIZATION_FACTOR 6 -static int msm_isp_update_stream_bandwidth(struct vfe_device *vfe_dev) +int msm_isp_update_stream_bandwidth(struct vfe_device *vfe_dev, + enum msm_vfe_hw_state hw_state) { - int i, rc = 0; + int i, rc = 0, frame_src, ms_type; struct msm_vfe_axi_stream *stream_info; struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; uint64_t total_pix_bandwidth = 0, total_rdi_bandwidth = 0; @@ -2174,6 +2223,15 @@ static int msm_isp_update_stream_bandwidth(struct vfe_device *vfe_dev) for (i = 0; i < VFE_AXI_SRC_MAX; i++) { stream_info = &axi_data->stream_info[i]; + frame_src = SRC_TO_INTF(stream_info->stream_src); + ms_type = vfe_dev->axi_data.src_info[frame_src]. + dual_hw_ms_info.dual_hw_ms_type; + if (hw_state == HW_STATE_SLEEP) { + rc = msm_isp_update_bandwidth( + ISP_VFE0 + vfe_dev->pdev->id, 0, 0); + return rc; + } + if (stream_info->state == ACTIVE || stream_info->state == START_PENDING) { if (stream_info->stream_src < RDI_INTF_0) { @@ -2184,11 +2242,11 @@ static int msm_isp_update_stream_bandwidth(struct vfe_device *vfe_dev) } } } - total_bandwidth = total_pix_bandwidth + total_rdi_bandwidth; - rc = msm_isp_update_bandwidth(ISP_VFE0 + vfe_dev->pdev->id, - (total_bandwidth + vfe_dev->hw_info->min_ab), - (total_bandwidth + vfe_dev->hw_info->min_ib)); + total_bandwidth = total_pix_bandwidth + total_rdi_bandwidth; + rc = msm_isp_update_bandwidth(ISP_VFE0 + vfe_dev->pdev->id, + (total_bandwidth + vfe_dev->hw_info->min_ab), + (total_bandwidth + vfe_dev->hw_info->min_ib)); if (rc < 0) pr_err("%s: update failed\n", __func__); @@ -2468,15 +2526,16 @@ static int msm_isp_axi_update_cgc_override(struct vfe_device *vfe_dev, static int msm_isp_update_dual_HW_ms_info_at_start( struct vfe_device *vfe_dev, - enum msm_vfe_input_src stream_src) + enum msm_vfe_input_src stream_src, + struct msm_isp_timestamp *ts) { int rc = 0; - uint32_t j, k, max_sof = 0; + uint32_t j, k, max_sof = 0, timestamp_ms = 0, cur_timestamp_ms = 0; + uint32_t delta; uint8_t slave_id; struct msm_vfe_axi_shared_data *axi_data = &vfe_dev->axi_data; struct msm_vfe_src_info *src_info = NULL; uint32_t vfe_id = 0; - unsigned long flags; if (stream_src >= VFE_SRC_MAX) { pr_err("%s: Error! Invalid src %u\n", __func__, stream_src); @@ -2487,12 +2546,9 @@ static int msm_isp_update_dual_HW_ms_info_at_start( if (src_info->dual_hw_type != DUAL_HW_MASTER_SLAVE) return rc; - spin_lock_irqsave(&vfe_dev->common_data->common_dev_data_lock, flags); if (src_info->dual_hw_ms_info.dual_hw_ms_type == MS_TYPE_MASTER) { if (vfe_dev->common_data->ms_resource.master_active == 1) { - spin_unlock_irqrestore(&vfe_dev->common_data-> - common_dev_data_lock, flags); return rc; } @@ -2505,11 +2561,10 @@ static int msm_isp_update_dual_HW_ms_info_at_start( * without repeating. */ if (!vfe_dev->common_data->ms_resource.slave_active_mask) { - spin_unlock_irqrestore(&vfe_dev->common_data-> - common_dev_data_lock, flags); return rc; } - + cur_timestamp_ms = ts->buf_time.tv_sec * 1000 + + ts->buf_time.tv_usec / 1000; for (j = 0, k = 0; k < MS_NUM_SLAVE_MAX; k++) { if (!(vfe_dev->common_data->ms_resource. reserved_slave_mask & (1 << k))) @@ -2521,13 +2576,26 @@ static int msm_isp_update_dual_HW_ms_info_at_start( slave_sof_info[k].frame_id > max_sof)) { max_sof = vfe_dev->common_data->ms_resource. slave_sof_info[k].frame_id; + timestamp_ms = vfe_dev->common_data->ms_resource + .slave_sof_info[k].mono_timestamp_ms; } j++; if (j == vfe_dev->common_data->ms_resource.num_slave) break; } - vfe_dev->axi_data.src_info[stream_src].frame_id = - max_sof + 1; + if (cur_timestamp_ms > timestamp_ms) + delta = cur_timestamp_ms - timestamp_ms; + else + delta = timestamp_ms - cur_timestamp_ms; + if (delta > vfe_dev->common_data->ms_resource. + sof_delta_threshold) { + vfe_dev->axi_data.src_info[stream_src].frame_id = + max_sof; + } else { + vfe_dev->axi_data.src_info[stream_src].frame_id = + max_sof - vfe_dev->axi_data.src_info[ + stream_src].sof_counter_step; + } if (vfe_dev->is_split) { vfe_id = vfe_dev->pdev->id; vfe_id = (vfe_id == 0) ? 1 : 0; @@ -2544,9 +2612,6 @@ static int msm_isp_update_dual_HW_ms_info_at_start( (1 << slave_id); } } - spin_unlock_irqrestore(&vfe_dev->common_data->common_dev_data_lock, - flags); - return rc; } @@ -2699,6 +2764,7 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev, ISP_DBG("%s: vfe %d camif enable\n", __func__, vfe_dev->pdev->id); vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id = 0; + vfe_dev->axi_data.src_info[VFE_PIX_0].eof_id = 0; } for (i = 0; i < stream_cfg_cmd->num_streams; i++) { @@ -2782,11 +2848,22 @@ static int msm_isp_start_axi_stream(struct vfe_device *vfe_dev, } } } - msm_isp_update_stream_bandwidth(vfe_dev); + msm_isp_update_stream_bandwidth(vfe_dev, stream_cfg_cmd->hw_state); vfe_dev->hw_info->vfe_ops.axi_ops.reload_wm(vfe_dev, vfe_dev->vfe_base, wm_reload_mask); msm_isp_update_camif_output_count(vfe_dev, stream_cfg_cmd); - + for (i = 0; i < VFE_SRC_MAX; i++) { + if ((vfe_dev->axi_data.src_info[i].pix_stream_count || + vfe_dev->axi_data.src_info[i].raw_stream_count) && + !vfe_dev->axi_data.src_info[i].flag) { + /*Configure UB*/ + vfe_dev->hw_info->vfe_ops.axi_ops.cfg_ub(vfe_dev, i); + /*when start reset overflow state*/ + atomic_set(&vfe_dev->error_info.overflow_state, + NO_OVERFLOW); + vfe_dev->axi_data.src_info[i].flag = 1; + } + } if (camif_update == ENABLE_CAMIF) { vfe_dev->hw_info->vfe_ops.core_ops. update_camif_state(vfe_dev, camif_update); @@ -2844,6 +2921,8 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev, } stream_info = &axi_data->stream_info[ HANDLE_TO_IDX(stream_cfg_cmd->stream_handle[i])]; + if (stream_info->state == AVAILABLE) + continue; /* set ping pong address to scratch before stream stop */ spin_lock_irqsave(&stream_info->lock, flags); msm_isp_cfg_stream_scratch(vfe_dev, stream_info, VFE_PING_FLAG); @@ -2859,7 +2938,6 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev, clear_wm_irq_mask(vfe_dev, stream_info); stream_info->state = STOP_PENDING; - if (!halt && !ext_read && !(stream_info->stream_type == BURST_STREAM && stream_info->runtime_num_burst_capture == 0)) @@ -2891,6 +2969,8 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev, if (intf >= VFE_RAW_0 && intf < VFE_SRC_MAX) { vfe_dev->axi_data.src_info[intf].active = 0; + vfe_dev->axi_data.src_info[intf].flag = 0; + } } else src_mask |= (1 << intf); @@ -2935,6 +3015,7 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev, for (i = VFE_RAW_0; i < VFE_SRC_MAX; i++) { if (src_mask & (1 << i)) { vfe_dev->axi_data.src_info[i].active = 0; + vfe_dev->axi_data.src_info[i].flag = 0; } } } @@ -2959,7 +3040,7 @@ static int msm_isp_stop_axi_stream(struct vfe_device *vfe_dev, } msm_isp_update_camif_output_count(vfe_dev, stream_cfg_cmd); - msm_isp_update_stream_bandwidth(vfe_dev); + msm_isp_update_stream_bandwidth(vfe_dev, stream_cfg_cmd->hw_state); for (i = 0; i < stream_cfg_cmd->num_streams; i++) { stream_info = &axi_data->stream_info[ @@ -3000,14 +3081,6 @@ int msm_isp_cfg_axi_stream(struct vfe_device *vfe_dev, void *arg) pr_err("%s: Invalid stream state\n", __func__); return rc; } - - if (axi_data->num_active_stream == 0) { - /*Configure UB*/ - vfe_dev->hw_info->vfe_ops.axi_ops.cfg_ub(vfe_dev); - /*when start reset overflow state*/ - atomic_set(&vfe_dev->error_info.overflow_state, - NO_OVERFLOW); - } msm_isp_get_camif_update_state_and_halt(vfe_dev, stream_cfg_cmd, &camif_update, &halt); if (camif_update == DISABLE_CAMIF) @@ -3046,7 +3119,8 @@ int msm_isp_cfg_axi_stream(struct vfe_device *vfe_dev, void *arg) static int msm_isp_return_empty_buffer(struct vfe_device *vfe_dev, struct msm_vfe_axi_stream *stream_info, uint32_t user_stream_id, - uint32_t frame_id, enum msm_vfe_input_src frame_src) + uint32_t frame_id, uint32_t buf_index, + enum msm_vfe_input_src frame_src) { int rc = -1; struct msm_isp_buffer *buf = NULL; @@ -3082,7 +3156,7 @@ static int msm_isp_return_empty_buffer(struct vfe_device *vfe_dev, rc = vfe_dev->buf_mgr->ops->get_buf(vfe_dev->buf_mgr, - vfe_dev->pdev->id, bufq_handle, &buf); + vfe_dev->pdev->id, bufq_handle, buf_index, &buf); if (rc == -EFAULT) { msm_isp_halt_send_error(vfe_dev, ISP_EVENT_BUF_FATAL_ERROR); return rc; @@ -3120,7 +3194,7 @@ static int msm_isp_return_empty_buffer(struct vfe_device *vfe_dev, static int msm_isp_request_frame(struct vfe_device *vfe_dev, struct msm_vfe_axi_stream *stream_info, uint32_t user_stream_id, - uint32_t frame_id) + uint32_t frame_id, uint32_t buf_index) { struct msm_vfe_axi_stream_request_cmd stream_cfg_cmd; struct msm_vfe_frame_request_queue *queue_req; @@ -3157,15 +3231,25 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, } frame_src = SRC_TO_INTF(stream_info->stream_src); + pingpong_status = + vfe_dev->hw_info->vfe_ops.axi_ops.get_pingpong_status( + vfe_dev); /* * If PIX stream is active then RDI path uses SOF frame ID of PIX * In case of standalone RDI streaming, SOF are used from * individual intf. */ - if (((vfe_dev->axi_data.src_info[VFE_PIX_0].active) && (frame_id <= - vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id)) || - ((!vfe_dev->axi_data.src_info[VFE_PIX_0].active) && (frame_id <= - vfe_dev->axi_data.src_info[frame_src].frame_id)) || + /* + * If frame_id = 1 then no eof check is needed + */ + if (((vfe_dev->axi_data.src_info[VFE_PIX_0].active) && ((frame_id != + vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id + vfe_dev-> + axi_data.src_info[VFE_PIX_0].sof_counter_step) || + (frame_id <= vfe_dev-> + axi_data.src_info[VFE_PIX_0].eof_id + 1))) || + ((!vfe_dev->axi_data.src_info[VFE_PIX_0].active) && (frame_id != + vfe_dev->axi_data.src_info[frame_src].frame_id + vfe_dev-> + axi_data.src_info[frame_src].sof_counter_step)) || stream_info->undelivered_request_cnt >= MAX_BUFFERS_IN_HW) { pr_debug("%s:%d invalid request_frame %d cur frame id %d pix %d\n", __func__, __LINE__, frame_id, @@ -3173,7 +3257,7 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, vfe_dev->axi_data.src_info[VFE_PIX_0].active); rc = msm_isp_return_empty_buffer(vfe_dev, stream_info, - user_stream_id, frame_id, frame_src); + user_stream_id, frame_id, buf_index, frame_src); if (rc < 0) pr_err("%s:%d failed: return_empty_buffer src %d\n", __func__, __LINE__, frame_src); @@ -3188,7 +3272,7 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, stream_info->stream_id); rc = msm_isp_return_empty_buffer(vfe_dev, stream_info, - user_stream_id, frame_id, frame_src); + user_stream_id, frame_id, buf_index, frame_src); if (rc < 0) pr_err("%s:%d failed: return_empty_buffer src %d\n", __func__, __LINE__, frame_src); @@ -3218,6 +3302,7 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, user_stream_id, queue_req->buff_queue_id); return 0; } + queue_req->buf_index = buf_index; queue_req->cmd_used = 1; stream_info->request_q_idx = @@ -3271,9 +3356,6 @@ static int msm_isp_request_frame(struct vfe_device *vfe_dev, } stream_info->sw_ping_pong_bit = 0; } else if (stream_info->undelivered_request_cnt == 2) { - pingpong_status = - vfe_dev->hw_info->vfe_ops.axi_ops.get_pingpong_status( - vfe_dev); rc = msm_isp_cfg_ping_pong_address(vfe_dev, stream_info, pingpong_status, 0); if (rc) { @@ -3555,7 +3637,8 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) update_info->stream_handle)]; rc = msm_isp_request_frame(vfe_dev, stream_info, update_info->user_stream_id, - update_info->frame_id); + update_info->frame_id, + MSM_ISP_INVALID_BUF_INDEX); if (rc) pr_err("%s failed to request frame!\n", __func__); @@ -3617,6 +3700,25 @@ int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg) } break; } + case UPDATE_STREAM_REQUEST_FRAMES_VER2: { + struct msm_vfe_axi_stream_cfg_update_info_req_frm *req_frm = + &update_cmd->req_frm_ver2; + if (HANDLE_TO_IDX(req_frm->stream_handle) >= VFE_AXI_SRC_MAX) { + pr_err("%s: Invalid stream handle\n", __func__); + rc = -EINVAL; + break; + } + stream_info = &axi_data->stream_info[HANDLE_TO_IDX( + req_frm->stream_handle)]; + rc = msm_isp_request_frame(vfe_dev, stream_info, + req_frm->user_stream_id, + req_frm->frame_id, + req_frm->buf_index); + if (rc) + pr_err("%s failed to request frame!\n", + __func__); + break; + } default: pr_err("%s: Invalid update type\n", __func__); return -EINVAL; @@ -3704,7 +3806,7 @@ void msm_isp_process_axi_irq_stream(struct vfe_device *vfe_dev, if (rc < 0) { spin_unlock_irqrestore(&stream_info->lock, flags); /* this usually means a serious scheduling error */ - msm_isp_halt_send_error(vfe_dev, ISP_EVENT_BUF_FATAL_ERROR); + msm_isp_halt_send_error(vfe_dev, ISP_EVENT_PING_PONG_MISMATCH); return; } /* diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.h index 4f036374a8b1c..1fb9f4e0b49a7 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_axi_util.h @@ -51,6 +51,8 @@ void msm_isp_reset_framedrop(struct vfe_device *vfe_dev, int msm_isp_request_axi_stream(struct vfe_device *vfe_dev, void *arg); void msm_isp_get_avtimer_ts(struct msm_isp_timestamp *time_stamp); int msm_isp_cfg_axi_stream(struct vfe_device *vfe_dev, void *arg); +int msm_isp_update_stream_bandwidth(struct vfe_device *vfe_dev, + enum msm_vfe_hw_state hw_state); int msm_isp_release_axi_stream(struct vfe_device *vfe_dev, void *arg); int msm_isp_update_axi_stream(struct vfe_device *vfe_dev, void *arg); void msm_isp_axi_cfg_update(struct vfe_device *vfe_dev, diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c old mode 100644 new mode 100755 index 92ff59ca1468b..7e3f29198e42e --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_stats_util.c @@ -68,7 +68,8 @@ static int msm_isp_stats_cfg_ping_pong_address(struct vfe_device *vfe_dev, pingpong_bit = (~(pingpong_status >> stats_pingpong_offset) & 0x1); rc = vfe_dev->buf_mgr->ops->get_buf(vfe_dev->buf_mgr, - vfe_dev->pdev->id, bufq_handle, &buf); + vfe_dev->pdev->id, bufq_handle, + MSM_ISP_INVALID_BUF_INDEX, &buf); if (rc == -EFAULT) { msm_isp_halt_send_error(vfe_dev, ISP_EVENT_BUF_FATAL_ERROR); return rc; @@ -202,7 +203,7 @@ static int32_t msm_isp_stats_buf_divert(struct vfe_device *vfe_dev, if (rc < 0) { if (rc == -EFAULT) msm_isp_halt_send_error(vfe_dev, - ISP_EVENT_BUF_FATAL_ERROR); + ISP_EVENT_PING_PONG_MISMATCH); pr_err("stats_buf_divert: update put buf cnt fail\n"); return rc; } @@ -597,6 +598,12 @@ static int msm_isp_stats_update_cgc_override(struct vfe_device *vfe_dev, int i; uint32_t stats_mask = 0, idx; + if (stream_cfg_cmd->num_streams > MSM_ISP_STATS_MAX) { + pr_err("%s invalid num_streams %d\n", __func__, + stream_cfg_cmd->num_streams); + return -EINVAL; + } + for (i = 0; i < stream_cfg_cmd->num_streams; i++) { idx = STATS_IDX(stream_cfg_cmd->stream_handle[i]); @@ -667,12 +674,19 @@ static int msm_isp_start_stats_stream(struct vfe_device *vfe_dev, uint32_t num_stats_comp_mask = 0; struct msm_vfe_stats_stream *stream_info; struct msm_vfe_stats_shared_data *stats_data = &vfe_dev->stats_data; + + if (stream_cfg_cmd->num_streams > MSM_ISP_STATS_MAX) { + pr_err("%s invalid num_streams %d\n", __func__, + stream_cfg_cmd->num_streams); + return -EINVAL; + } num_stats_comp_mask = vfe_dev->hw_info->stats_hw_info->num_stats_comp_mask; rc = vfe_dev->hw_info->vfe_ops.stats_ops.check_streams( stats_data->stream_info); if (rc < 0) return rc; + for (i = 0; i < stream_cfg_cmd->num_streams; i++) { idx = STATS_IDX(stream_cfg_cmd->stream_handle[i]); @@ -843,6 +857,12 @@ int msm_isp_cfg_stats_stream(struct vfe_device *vfe_dev, void *arg) if (vfe_dev->stats_data.num_active_stream == 0) vfe_dev->hw_info->vfe_ops.stats_ops.cfg_ub(vfe_dev); + if (stream_cfg_cmd->num_streams > MSM_ISP_STATS_MAX) { + pr_err("%s invalid num_streams %d\n", __func__, + stream_cfg_cmd->num_streams); + return -EINVAL; + } + if (stream_cfg_cmd->enable) { msm_isp_stats_update_cgc_override(vfe_dev, stream_cfg_cmd); @@ -865,13 +885,19 @@ int msm_isp_update_stats_stream(struct vfe_device *vfe_dev, void *arg) struct msm_vfe_axi_stream_cfg_update_info *update_info = NULL; struct msm_isp_sw_framskip *sw_skip_info = NULL; + if (update_cmd->num_streams > MSM_ISP_STATS_MAX) { + pr_err("%s: Invalid num_streams %d\n", + __func__, update_cmd->num_streams); + return -EINVAL; + } + /*validate request*/ for (i = 0; i < update_cmd->num_streams; i++) { update_info = (struct msm_vfe_axi_stream_cfg_update_info *) &update_cmd->update_info[i]; /*check array reference bounds*/ if (STATS_IDX(update_info->stream_handle) - > vfe_dev->hw_info->stats_hw_info->num_stats_type) { + >= vfe_dev->hw_info->stats_hw_info->num_stats_type) { pr_err("%s: stats idx %d out of bound!", __func__, STATS_IDX(update_info->stream_handle)); return -EINVAL; diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c index 6e92463683cd6..7d1882c2c271c 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -22,6 +22,7 @@ #include "cam_smmu_api.h" #define MAX_ISP_V4l2_EVENTS 100 +#define MAX_ISP_REG_LIST 100 static DEFINE_MUTEX(bandwidth_mgr_mutex); static struct msm_isp_bandwidth_mgr isp_bandwidth_mgr; @@ -384,7 +385,8 @@ static int msm_isp_start_fetch_engine_multi_pass(struct vfe_device *vfe_dev, fe_cfg->output_stream_id); return -EINVAL; } - + vfe_dev->hw_info->vfe_ops.core_ops.reset_hw(vfe_dev, + 0, 1); msm_isp_reset_framedrop(vfe_dev, stream_info); rc = msm_isp_cfg_offline_ping_pong_address(vfe_dev, stream_info, @@ -412,9 +414,6 @@ void msm_isp_fetch_engine_done_notify(struct vfe_device *vfe_dev, struct msm_vfe_fetch_engine_info *fetch_engine_info) { struct msm_isp_event_data fe_rd_done_event; - if (!fetch_engine_info->is_busy) - return; - memset(&fe_rd_done_event, 0, sizeof(struct msm_isp_event_data)); fe_rd_done_event.frame_id = vfe_dev->axi_data.src_info[VFE_PIX_0].frame_id; @@ -566,6 +565,14 @@ static int msm_isp_set_dual_HW_master_slave_mode( } /* No lock needed here since ioctl lock protects 2 session from race */ + /* reset master SOF which refer slave in increment_frame_id function + * + */ + vfe_dev->common_data->ms_resource.master_sof_info.frame_id = 0; + vfe_dev->common_data->ms_resource.master_sof_info.mono_timestamp_ms = 0; + /* we have only 1 slave so reset it frame_id so that master will + * not jump*/ + vfe_dev->common_data->ms_resource.slave_sof_info[0].frame_id = 0; if (src_info != NULL && dual_hw_ms_cmd->dual_hw_ms_type == MS_TYPE_MASTER) { src_info->dual_hw_type = DUAL_HW_MASTER_SLAVE; @@ -609,6 +616,11 @@ static int msm_isp_set_dual_HW_master_slave_mode( } ISP_DBG("%s: vfe %d num_src %d\n", __func__, vfe_dev->pdev->id, dual_hw_ms_cmd->num_src); + if (dual_hw_ms_cmd->num_src > VFE_SRC_MAX) { + pr_err("%s: Error! Invalid num_src %d\n", __func__, + dual_hw_ms_cmd->num_src); + return -EINVAL; + } /* This for loop is for non-primary intf to be marked with Master/Slave * in order for frame id sync. But their timestamp is not saved. * So no sof_info resource is allocated */ @@ -634,6 +646,7 @@ static int msm_isp_set_dual_HW_master_slave_mode( static int msm_isp_proc_cmd_list_unlocked(struct vfe_device *vfe_dev, void *arg) { int rc = 0; + uint32_t count = 0; struct msm_vfe_cfg_cmd_list *proc_cmd = (struct msm_vfe_cfg_cmd_list *)arg; struct msm_vfe_cfg_cmd_list cmd, cmd_next; @@ -657,6 +670,12 @@ static int msm_isp_proc_cmd_list_unlocked(struct vfe_device *vfe_dev, void *arg) sizeof(struct msm_vfe_cfg_cmd_list)); break; } + if (++count >= MAX_ISP_REG_LIST) { + pr_err("%s:%d Error exceeding the max register count:%u\n", + __func__, __LINE__, count); + rc = -EFAULT; + break; + } if (copy_from_user(&cmd_next, (void __user *)cmd.next, sizeof(struct msm_vfe_cfg_cmd_list))) { rc = -EFAULT; @@ -703,6 +722,7 @@ static void msm_isp_compat_to_proc_cmd(struct msm_vfe_cfg_cmd2 *proc_cmd, static int msm_isp_proc_cmd_list_compat(struct vfe_device *vfe_dev, void *arg) { int rc = 0; + uint32_t count = 0; struct msm_vfe_cfg_cmd_list_32 *proc_cmd = (struct msm_vfe_cfg_cmd_list_32 *)arg; struct msm_vfe_cfg_cmd_list_32 cmd, cmd_next; @@ -727,6 +747,12 @@ static int msm_isp_proc_cmd_list_compat(struct vfe_device *vfe_dev, void *arg) sizeof(struct msm_vfe_cfg_cmd_list)); break; } + if (++count >= MAX_ISP_REG_LIST) { + pr_err("%s:%d Error exceeding the max register count:%u\n", + __func__, __LINE__, count); + rc = -EFAULT; + break; + } if (copy_from_user(&cmd_next, compat_ptr(cmd.next), sizeof(struct msm_vfe_cfg_cmd_list_32))) { rc = -EFAULT; @@ -831,6 +857,12 @@ static long msm_isp_ioctl_unlocked(struct v4l2_subdev *sd, rc = msm_isp_cfg_axi_stream(vfe_dev, arg); mutex_unlock(&vfe_dev->core_mutex); break; + case VIDIOC_MSM_ISP_CFG_HW_STATE: + mutex_lock(&vfe_dev->core_mutex); + rc = msm_isp_update_stream_bandwidth(vfe_dev, + *(enum msm_vfe_hw_state *)arg); + mutex_unlock(&vfe_dev->core_mutex); + break; case VIDIOC_MSM_ISP_AXI_HALT: mutex_lock(&vfe_dev->core_mutex); rc = msm_isp_axi_halt(vfe_dev, arg); @@ -1348,6 +1380,20 @@ static int msm_isp_send_hw_cmd(struct vfe_device *vfe_dev, vfe_dev->vfe_ub_policy = *cfg_data; break; } + case GET_VFE_HW_LIMIT: { + uint32_t *hw_limit = NULL; + + if (cmd_len < sizeof(uint32_t)) { + pr_err("%s:%d failed: invalid cmd len %u exp %zu\n", + __func__, __LINE__, cmd_len, + sizeof(uint32_t)); + return -EINVAL; + } + + hw_limit = (uint32_t *)cfg_data; + *hw_limit = vfe_dev->vfe_hw_limit; + break; + } } return 0; } @@ -1739,9 +1785,10 @@ static inline void msm_isp_update_error_info(struct vfe_device *vfe_dev, vfe_dev->error_info.error_count++; } -static void msm_isp_process_overflow_irq( +void msm_isp_process_overflow_irq( struct vfe_device *vfe_dev, - uint32_t *irq_status0, uint32_t *irq_status1) + uint32_t *irq_status0, uint32_t *irq_status1, + uint32_t force_overflow) { uint32_t overflow_mask; @@ -1764,7 +1811,8 @@ static void msm_isp_process_overflow_irq( /*Check if any overflow bit is set*/ vfe_dev->hw_info->vfe_ops.core_ops. get_overflow_mask(&overflow_mask); - overflow_mask &= *irq_status1; + if (!force_overflow) + overflow_mask &= *irq_status1; if (overflow_mask) { struct msm_isp_event_data error_event; @@ -1783,15 +1831,27 @@ static void msm_isp_process_overflow_irq( /* maks off irq for current vfe */ atomic_cmpxchg(&vfe_dev->error_info.overflow_state, NO_OVERFLOW, OVERFLOW_DETECTED); + vfe_dev->recovery_irq0_mask = vfe_dev->irq0_mask; + vfe_dev->recovery_irq1_mask = vfe_dev->irq1_mask; + vfe_dev->hw_info->vfe_ops.core_ops. set_halt_restart_mask(vfe_dev); /* mask off other vfe if dual vfe is used */ if (vfe_dev->is_split) { uint32_t other_vfe_id; + struct vfe_device *other_vfe_dev; other_vfe_id = (vfe_dev->pdev->id == ISP_VFE0) ? ISP_VFE1 : ISP_VFE0; + other_vfe_dev = vfe_dev->common_data-> + dual_vfe_res->vfe_dev[other_vfe_id]; + if (other_vfe_dev) { + other_vfe_dev->recovery_irq0_mask = + other_vfe_dev->irq0_mask; + other_vfe_dev->recovery_irq1_mask = + other_vfe_dev->irq1_mask; + } atomic_cmpxchg(&(vfe_dev->common_data->dual_vfe_res-> vfe_dev[other_vfe_id]-> @@ -1876,8 +1936,12 @@ irqreturn_t msm_isp_process_irq(int irq_num, void *data) } ping_pong_status = vfe_dev->hw_info->vfe_ops.axi_ops. get_pingpong_status(vfe_dev); + if (vfe_dev->hw_info->vfe_ops.irq_ops.process_eof_irq) { + vfe_dev->hw_info->vfe_ops.irq_ops.process_eof_irq(vfe_dev, + irq_status0); + } msm_isp_process_overflow_irq(vfe_dev, - &irq_status0, &irq_status1); + &irq_status0, &irq_status1, 0); vfe_dev->hw_info->vfe_ops.core_ops. get_error_mask(&error_mask0, &error_mask1); @@ -2108,6 +2172,7 @@ int msm_isp_close_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) { long rc = 0; int wm; + unsigned long flags; struct vfe_device *vfe_dev = v4l2_get_subdevdata(sd); ISP_DBG("%s E open_cnt %u\n", __func__, vfe_dev->vfe_open_cnt); mutex_lock(&vfe_dev->realtime_mutex); @@ -2121,6 +2186,27 @@ int msm_isp_close_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) return -EINVAL; } + /* reset master and slave mask in case daemon died */ + if (vfe_dev->axi_data.src_info[VFE_PIX_0].dual_hw_ms_info. + dual_hw_ms_type == MS_TYPE_MASTER) { + spin_lock_irqsave( + &vfe_dev->common_data->common_dev_data_lock, + flags); + vfe_dev->common_data->ms_resource.master_active = 0; + spin_unlock_irqrestore( + &vfe_dev->common_data->common_dev_data_lock, + flags); + } else if (vfe_dev->axi_data.src_info[VFE_PIX_0].dual_hw_ms_info. + dual_hw_ms_type == MS_TYPE_SLAVE) { + spin_lock_irqsave( + &vfe_dev->common_data->common_dev_data_lock, + flags); + vfe_dev->common_data->ms_resource.slave_active_mask = 0; + vfe_dev->common_data->ms_resource.reserved_slave_mask = 0; + spin_unlock_irqrestore( + &vfe_dev->common_data->common_dev_data_lock, + flags); + } if (vfe_dev->vfe_open_cnt > 1) { vfe_dev->vfe_open_cnt--; mutex_unlock(&vfe_dev->core_mutex); diff --git a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h index a7b36c561f367..9d68fecafaa0a 100644 --- a/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h +++ b/drivers/media/platform/msm/camera_v2/isp/msm_isp_util.h @@ -74,4 +74,8 @@ void msm_isp_save_framedrop_values(struct vfe_device *vfe_dev, enum msm_vfe_input_src frame_src); void msm_isp_get_timestamp(struct msm_isp_timestamp *time_stamp, struct vfe_device *vfe_dev); +void msm_isp_process_overflow_irq( + struct vfe_device *vfe_dev, + uint32_t *irq_status0, uint32_t *irq_status1, + uint32_t force_overflow); #endif /* __MSM_ISP_UTIL_H__ */ diff --git a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c old mode 100644 new mode 100755 index a01dc9f04307e..5ea58c9806900 --- a/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c +++ b/drivers/media/platform/msm/camera_v2/ispif/msm_ispif.c @@ -68,12 +68,18 @@ static void msm_ispif_io_dump_reg(struct ispif_device *ispif) { if (!ispif->enb_dump_reg) return; + + if (!ispif->base) { + pr_err("%s: null pointer for the ispif base\n", __func__); + return; + } + msm_camera_io_dump(ispif->base, 0x250, 0); } static inline int msm_ispif_is_intf_valid(uint32_t csid_version, - uint8_t intf_type) + enum msm_ispif_vfe_intf intf_type) { return ((csid_version <= CSID_VERSION_V22 && intf_type != VFE0) || (intf_type >= VFE_MAX)) ? false : true; @@ -132,7 +138,7 @@ static void msm_ispif_get_pack_mask_from_cfg( pack_mask[0] |= temp; CDBG("%s:num %d cid %d mode %d pack_mask %x %x\n", __func__, entry->num_cids, entry->cids[i], - pack_cfg[i].pack_mode, + pack_cfg[entry->cids[i]].pack_mode, pack_mask[0], pack_mask[1]); } @@ -164,6 +170,16 @@ static int msm_ispif_config2(struct ispif_device *ispif, return rc; } + for (i = 0; i < params->num; i++) { + int j; + + if (params->entries[i].num_cids > MAX_CID_CH_v2) + return -EINVAL; + for (j = 0; j < params->entries[i].num_cids; j++) + if (params->entries[i].cids[j] >= CID_MAX) + return -EINVAL; + } + for (i = 0; i < params->num; i++) { intftype = params->entries[i].intftype; vfe_intf = params->entries[i].vfe_intf; @@ -599,7 +615,7 @@ static int msm_ispif_reset(struct ispif_device *ispif) ispif->base + ISPIF_VFE_m_INTF_CMD_0(i)); msm_camera_io_w(ISPIF_STOP_INTF_IMMEDIATELY, ispif->base + ISPIF_VFE_m_INTF_CMD_1(i)); - pr_debug("%s: base %lx", __func__, (unsigned long)ispif->base); + pr_debug("%s: base %pK", __func__, ispif->base); msm_camera_io_w(0, ispif->base + ISPIF_VFE_m_PIX_INTF_n_CID_MASK(i, 0)); msm_camera_io_w(0, ispif->base + @@ -837,7 +853,7 @@ static uint16_t msm_ispif_get_cids_mask_from_cfg( uint16_t cids_mask = 0; BUG_ON(!entry); - for (i = 0; i < entry->num_cids; i++) + for (i = 0; i < entry->num_cids && i < MAX_CID_CH_v2; i++) cids_mask |= (1 << entry->cids[i]); return cids_mask; @@ -967,7 +983,7 @@ static void msm_ispif_intf_cmd(struct ispif_device *ispif, uint32_t cmd_bits, pr_err("%s: invalid interface type\n", __func__); return; } - if (params->entries[i].num_cids > MAX_CID_CH) { + if (params->entries[i].num_cids > MAX_CID_CH_v2) { pr_err("%s: out of range of cid_num %d\n", __func__, params->entries[i].num_cids); return; @@ -1069,21 +1085,142 @@ static int msm_ispif_start_frame_boundary(struct ispif_device *ispif, static int msm_ispif_restart_frame_boundary(struct ispif_device *ispif, struct msm_ispif_param_data *params) { - int rc = 0; + int rc = 0, i; + long timeout = 0; + uint16_t cid_mask; + enum msm_ispif_intftype intftype; + enum msm_ispif_vfe_intf vfe_intf; + uint32_t vfe_mask = 0; + uint32_t intf_addr; - rc = msm_ispif_reset_hw(ispif); - if (!rc) - rc = msm_ispif_reset(ispif); - if (!rc) - rc = msm_ispif_config(ispif, params); - if (!rc) - rc = msm_ispif_start_frame_boundary(ispif, params); - - if (!rc) - pr_info("ISPIF restart Successful\n"); - else - pr_info("ISPIF restart Failed\n"); + if (ispif->ispif_state != ISPIF_POWER_UP) { + pr_err("%s: ispif invalid state %d\n", __func__, + ispif->ispif_state); + rc = -EPERM; + return rc; + } + if (params->num > MAX_PARAM_ENTRIES) { + pr_err("%s: invalid param entries %d\n", __func__, + params->num); + rc = -EINVAL; + return rc; + } + + for (i = 0; i < params->num; i++) { + vfe_intf = params->entries[i].vfe_intf; + if (vfe_intf >= VFE_MAX) { + pr_err("%s: %d invalid i %d vfe_intf %d\n", __func__, + __LINE__, i, vfe_intf); + return -EINVAL; + } + vfe_mask |= (1 << vfe_intf); + } + + /* Turn ON regulators before enabling the clocks*/ + rc = msm_ispif_set_regulators(ispif->vfe_vdd, + ispif->vfe_vdd_count, 1); + if (rc < 0) + return -EFAULT; + + rc = msm_camera_clk_enable(&ispif->pdev->dev, + ispif->clk_info, ispif->clks, + ispif->num_clk, 1); + if (rc < 0) + goto disable_regulator; + + if (vfe_mask & (1 << VFE0)) { + atomic_set(&ispif->reset_trig[VFE0], 1); + /* initiate reset of ISPIF */ + msm_camera_io_w(ISPIF_RST_CMD_MASK_RESTART, + ispif->base + ISPIF_RST_CMD_ADDR); + timeout = wait_for_completion_timeout( + &ispif->reset_complete[VFE0], msecs_to_jiffies(500)); + if (timeout <= 0) { + pr_err("%s: VFE0 reset wait timeout\n", __func__); + rc = -ETIMEDOUT; + goto disable_clk; + } + } + + if (ispif->hw_num_isps > 1 && (vfe_mask & (1 << VFE1))) { + atomic_set(&ispif->reset_trig[VFE1], 1); + msm_camera_io_w(ISPIF_RST_CMD_1_MASK_RESTART, + ispif->base + ISPIF_RST_CMD_1_ADDR); + timeout = wait_for_completion_timeout( + &ispif->reset_complete[VFE1], + msecs_to_jiffies(500)); + if (timeout <= 0) { + pr_err("%s: VFE1 reset wait timeout\n", __func__); + rc = -ETIMEDOUT; + goto disable_clk; + } + } + + pr_info("%s: ISPIF reset hw done, Restarting", __func__); + rc = msm_camera_clk_enable(&ispif->pdev->dev, + ispif->clk_info, ispif->clks, + ispif->num_clk, 0); + if (rc < 0) + goto disable_regulator; + + /* Turn OFF regulators after disabling clocks */ + rc = msm_ispif_set_regulators(ispif->vfe_vdd, ispif->vfe_vdd_count, 0); + if (rc < 0) + goto end; + + for (i = 0; i < params->num; i++) { + intftype = params->entries[i].intftype; + vfe_intf = params->entries[i].vfe_intf; + + switch (params->entries[0].intftype) { + case PIX0: + intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 0); + break; + case RDI0: + intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 0); + break; + case PIX1: + intf_addr = ISPIF_VFE_m_PIX_INTF_n_STATUS(vfe_intf, 1); + break; + case RDI1: + intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 1); + break; + case RDI2: + intf_addr = ISPIF_VFE_m_RDI_INTF_n_STATUS(vfe_intf, 2); + break; + default: + pr_err("%s: invalid intftype=%d\n", __func__, + params->entries[i].intftype); + rc = -EPERM; + goto end; + } + + msm_ispif_intf_cmd(ispif, + ISPIF_INTF_CMD_ENABLE_FRAME_BOUNDARY, params); + } + + for (i = 0; i < params->num; i++) { + intftype = params->entries[i].intftype; + + vfe_intf = params->entries[i].vfe_intf; + + + cid_mask = msm_ispif_get_cids_mask_from_cfg( + ¶ms->entries[i]); + msm_ispif_enable_intf_cids(ispif, intftype, + cid_mask, vfe_intf, 1); + } + return rc; + +disable_clk: + msm_camera_clk_enable(&ispif->pdev->dev, + ispif->clk_info, ispif->clks, + ispif->num_clk, 0); +disable_regulator: + /* Turn OFF regulators */ + msm_ispif_set_regulators(ispif->vfe_vdd, ispif->vfe_vdd_count, 0); +end: return rc; } @@ -1320,8 +1457,15 @@ static inline void msm_ispif_read_irq_status(struct ispif_irq_status *out, } if (fatal_err == true) { - pr_err("%s: fatal error, stop ispif immediately\n", __func__); + pr_err_ratelimited("%s: fatal error, stop ispif immediately\n", + __func__); for (i = 0; i < ispif->vfe_info.num_vfe; i++) { + msm_camera_io_w(0x0, + ispif->base + ISPIF_VFE_m_IRQ_MASK_0(i)); + msm_camera_io_w(0x0, + ispif->base + ISPIF_VFE_m_IRQ_MASK_1(i)); + msm_camera_io_w(0x0, + ispif->base + ISPIF_VFE_m_IRQ_MASK_2(i)); msm_camera_io_w(ISPIF_STOP_INTF_IMMEDIATELY, ispif->base + ISPIF_VFE_m_INTF_CMD_0(i)); msm_camera_io_w(ISPIF_STOP_INTF_IMMEDIATELY, diff --git a/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_dev.c b/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_dev.c index 437af72a6a556..de27e585f63df 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_dev.c +++ b/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_dev.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, 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 @@ -71,8 +71,8 @@ static long msm_jpeg_compat_ioctl(struct file *filp, unsigned int cmd, int rc; struct msm_jpeg_device *pgmn_dev = filp->private_data; - JPEG_DBG("%s:%d] cmd=%d pgmn_dev=0x%lx arg=0x%lx\n", __func__, - __LINE__, _IOC_NR(cmd), (unsigned long)pgmn_dev, + JPEG_DBG("%s:%d] cmd=%d pgmn_dev=0x%pK arg=0x%lx\n", __func__, + __LINE__, _IOC_NR(cmd), pgmn_dev, (unsigned long)arg); rc = __msm_jpeg_compat_ioctl(pgmn_dev, cmd, arg); @@ -87,8 +87,8 @@ static long msm_jpeg_ioctl(struct file *filp, unsigned int cmd, int rc; struct msm_jpeg_device *pgmn_dev = filp->private_data; - JPEG_DBG("%s:%d] cmd=%d pgmn_dev=0x%lx arg=0x%lx\n", __func__, - __LINE__, _IOC_NR(cmd), (unsigned long)pgmn_dev, + JPEG_DBG("%s:%d] cmd=%d pgmn_dev=0x%pK arg=0x%lx\n", __func__, + __LINE__, _IOC_NR(cmd), pgmn_dev, (unsigned long)arg); rc = __msm_jpeg_ioctl(pgmn_dev, cmd, arg); @@ -114,9 +114,9 @@ int msm_jpeg_subdev_init(struct v4l2_subdev *jpeg_sd) struct msm_jpeg_device *pgmn_dev = (struct msm_jpeg_device *)jpeg_sd->host_priv; - JPEG_DBG("%s:%d: jpeg_sd=0x%lx pgmn_dev=0x%lx\n", + JPEG_DBG("%s:%d: jpeg_sd=0x%lx pgmn_dev=0x%pK\n", __func__, __LINE__, (unsigned long)jpeg_sd, - (unsigned long)pgmn_dev); + pgmn_dev); rc = __msm_jpeg_open(pgmn_dev); JPEG_DBG("%s:%d: rc=%d\n", __func__, __LINE__, rc); @@ -132,7 +132,7 @@ static long msm_jpeg_subdev_ioctl(struct v4l2_subdev *sd, JPEG_DBG("%s: cmd=%d\n", __func__, cmd); - JPEG_DBG("%s: pgmn_dev 0x%lx", __func__, (unsigned long)pgmn_dev); + JPEG_DBG("%s: pgmn_dev 0x%pK", __func__, pgmn_dev); JPEG_DBG("%s: Calling __msm_jpeg_ioctl\n", __func__); @@ -146,7 +146,7 @@ void msm_jpeg_subdev_release(struct v4l2_subdev *jpeg_sd) int rc; struct msm_jpeg_device *pgmn_dev = (struct msm_jpeg_device *)jpeg_sd->host_priv; - JPEG_DBG("%s:pgmn_dev=0x%lx", __func__, (unsigned long)pgmn_dev); + JPEG_DBG("%s:pgmn_dev=0x%pK", __func__, pgmn_dev); rc = __msm_jpeg_release(pgmn_dev); JPEG_DBG("%s:rc=%d", __func__, rc); } diff --git a/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_hw.c b/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_hw.c index 071ce0a41ed9b..e40869d41a5d0 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_hw.c +++ b/drivers/media/platform/msm/camera_v2/jpeg_10/msm_jpeg_hw.c @@ -847,7 +847,7 @@ int msm_jpeg_hw_exec_cmds(struct msm_jpeg_hw_cmd *hw_cmd_p, uint32_t m_cmds, uint32_t data; while (m_cmds--) { - if (hw_cmd_p->offset > max_size) { + if (hw_cmd_p->offset >= max_size) { JPEG_PR_ERR("%s:%d] %d exceed hw region %d\n", __func__, __LINE__, hw_cmd_p->offset, max_size); return -EFAULT; diff --git a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c index 080eb2ca43a9b..2e641bcea09b8 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c +++ b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.c @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include #include #include @@ -70,18 +72,31 @@ static struct msm_jpegdma_format formats[] = { .planes[1] = JPEGDMA_PLANE_TYPE_CBCR, }, { - .name = "YUV 4:2:0 planar, YCbCr", - .fourcc = V4L2_PIX_FMT_YUV420, + .name = "YVU 4:2:0 planar, YCrCb", + .fourcc = V4L2_PIX_FMT_YVU420, .depth = 12, .num_planes = 3, - .colplane_h = 2, - .colplane_v = 2, + .colplane_h = 1, + .colplane_v = 4, .h_align = 2, .v_align = 2, .planes[0] = JPEGDMA_PLANE_TYPE_Y, .planes[1] = JPEGDMA_PLANE_TYPE_CR, .planes[2] = JPEGDMA_PLANE_TYPE_CB, }, + { + .name = "YUV 4:2:0 planar, YCbCr", + .fourcc = V4L2_PIX_FMT_YUV420, + .depth = 12, + .num_planes = 3, + .colplane_h = 1, + .colplane_v = 4, + .h_align = 2, + .v_align = 2, + .planes[0] = JPEGDMA_PLANE_TYPE_Y, + .planes[1] = JPEGDMA_PLANE_TYPE_CB, + .planes[2] = JPEGDMA_PLANE_TYPE_CR, + }, }; /* @@ -111,6 +126,21 @@ static inline void msm_jpegdma_schedule_next_config(struct jpegdma_ctx *ctx) ctx->config_idx = (ctx->config_idx + 1) % MSM_JPEGDMA_MAX_CONFIGS; } +/* + * msm_jpegdma_cast_long_to_buff_ptr - Cast long to buffer pointer. + * @vaddr: vaddr as long + * @buff_ptr_head: buffer pointer head + */ +static inline void msm_jpegdma_cast_long_to_buff_ptr(unsigned long vaddr, + struct msm_jpeg_dma_buff **buff_ptr_head) +{ +#ifdef CONFIG_COMPAT + *buff_ptr_head = compat_ptr(vaddr); +#else + *buff_ptr_head = (struct msm_jpeg_dma_buff *) vaddr; +#endif +} + /* * msm_jpegdma_get_format_idx - Get jpeg dma format lookup index. * @ctx: Pointer to dma ctx. @@ -196,7 +226,8 @@ static void msm_jpegdma_align_format(struct v4l2_format *f, int format_idx) if (formats[format_idx].num_planes > 1) for (i = 1; i < formats[format_idx].num_planes; i++) size_image += (f->fmt.pix.bytesperline * - (f->fmt.pix.height / formats[format_idx].colplane_v)); + (f->fmt.pix.height / + formats[format_idx].colplane_v)); f->fmt.pix.sizeimage = size_image; f->fmt.pix.field = V4L2_FIELD_NONE; @@ -250,6 +281,9 @@ static int msm_jpegdma_update_hw_config(struct jpegdma_ctx *ctx) size.fps = ctx->timeperframe.denominator / ctx->timeperframe.numerator; + size.in_offset = ctx->in_offset; + size.out_offset = ctx->out_offset; + size.format = formats[ctx->format_idx]; msm_jpegdma_fill_size_from_ctx(ctx, &size); @@ -362,7 +396,9 @@ static void msm_jpegdma_stop_streaming(struct vb2_queue *q) dev_err(ctx->jdma_device->dev, "Ctx wait timeout\n"); ret = -ETIME; } - msm_jpegdma_hw_put(ctx->jdma_device); + + if (ctx->jdma_device->ref_count > 0) + msm_jpegdma_hw_put(ctx->jdma_device); } /* Videobuf2 queue callbacks. */ @@ -385,13 +421,31 @@ static void *msm_jpegdma_get_userptr(void *alloc_ctx, { struct msm_jpegdma_device *dma = alloc_ctx; struct msm_jpegdma_buf_handle *buf; + struct msm_jpeg_dma_buff __user *up_buff; + struct msm_jpeg_dma_buff kp_buff; int ret; + msm_jpegdma_cast_long_to_buff_ptr(vaddr, &up_buff); + + if (!access_ok(VERIFY_READ, up_buff, + sizeof(struct msm_jpeg_dma_buff)) || + get_user(kp_buff.fd, &up_buff->fd)) { + dev_err(dma->dev, "Error getting user data\n"); + return ERR_PTR(-ENOMEM); + } + + if (!access_ok(VERIFY_WRITE, up_buff, + sizeof(struct msm_jpeg_dma_buff)) || + put_user(kp_buff.fd, &up_buff->fd)) { + dev_err(dma->dev, "Error putting user data\n"); + return ERR_PTR(-ENOMEM); + } + buf = kzalloc(sizeof(*buf), GFP_KERNEL); if (!buf) return ERR_PTR(-ENOMEM); - ret = msm_jpegdma_hw_map_buffer(dma, vaddr, buf); + ret = msm_jpegdma_hw_map_buffer(dma, kp_buff.fd, buf); if (ret < 0 || buf->size < size) goto error; @@ -528,7 +582,9 @@ static int msm_jpegdma_release(struct file *file) struct jpegdma_ctx *ctx = msm_jpegdma_ctx_from_fh(file->private_data); /* release all the resources */ - msm_jpegdma_hw_put(ctx->jdma_device); + if (ctx->jdma_device->ref_count > 0) + msm_jpegdma_hw_put(ctx->jdma_device); + atomic_set(&ctx->active, 0); complete_all(&ctx->completion); v4l2_m2m_ctx_release(ctx->m2m_ctx); @@ -771,16 +827,50 @@ static int msm_jpegdma_qbuf(struct file *file, void *fh, struct v4l2_buffer *buf) { struct jpegdma_ctx *ctx = msm_jpegdma_ctx_from_fh(fh); + struct msm_jpeg_dma_buff __user *up_buff; + struct msm_jpeg_dma_buff kp_buff; int ret; + msm_jpegdma_cast_long_to_buff_ptr(buf->m.userptr, &up_buff); mutex_lock(&ctx->lock); + if (!access_ok(VERIFY_READ, up_buff, + sizeof(struct msm_jpeg_dma_buff)) || + get_user(kp_buff.fd, &up_buff->fd) || + get_user(kp_buff.offset, &up_buff->offset)) { + dev_err(ctx->jdma_device->dev, "Error getting user data\n"); + mutex_unlock(&ctx->lock); + return -EFAULT; + } + + if (!access_ok(VERIFY_WRITE, up_buff, + sizeof(struct msm_jpeg_dma_buff)) || + put_user(kp_buff.fd, &up_buff->fd) || + put_user(kp_buff.offset, &up_buff->offset)) { + dev_err(ctx->jdma_device->dev, "Error putting user data\n"); + mutex_unlock(&ctx->lock); + return -EFAULT; + } + + switch (buf->type) { + case V4L2_BUF_TYPE_VIDEO_OUTPUT: + ctx->in_offset = kp_buff.offset; + dev_dbg(ctx->jdma_device->dev, "input buf offset %d\n", + ctx->in_offset); + break; + case V4L2_BUF_TYPE_VIDEO_CAPTURE: + ctx->out_offset = kp_buff.offset; + dev_dbg(ctx->jdma_device->dev, "output buf offset %d\n", + ctx->out_offset); + break; + } + + if (atomic_read(&ctx->active)) + ret = msm_jpegdma_update_hw_config(ctx); ret = v4l2_m2m_qbuf(file, ctx->m2m_ctx, buf); if (ret < 0) dev_err(ctx->jdma_device->dev, "QBuf fail\n"); - mutex_unlock(&ctx->lock); - return ret; } @@ -813,14 +903,10 @@ static int msm_jpegdma_streamon(struct file *file, if (!msm_jpegdma_config_ok(ctx)) return -EINVAL; - mutex_lock(&ctx->lock); - ret = v4l2_m2m_streamon(file, ctx->m2m_ctx, buf_type); if (ret < 0) dev_err(ctx->jdma_device->dev, "Stream on fail\n"); - mutex_unlock(&ctx->lock); - return ret; } @@ -952,13 +1038,10 @@ static int msm_jpegdma_s_crop(struct file *file, void *fh, return -EINVAL; mutex_lock(&ctx->lock); - ctx->crop = crop->c; if (atomic_read(&ctx->active)) ret = msm_jpegdma_update_hw_config(ctx); - mutex_unlock(&ctx->lock); - return ret; } @@ -1001,7 +1084,7 @@ static int msm_jpegdma_s_parm(struct file *file, void *fh, return -EINVAL; if (!a->parm.output.timeperframe.numerator || - !a->parm.output.timeperframe.denominator) + !a->parm.output.timeperframe.denominator) return -EINVAL; /* Frame rate is not supported during streaming */ @@ -1135,6 +1218,7 @@ void msm_jpegdma_isr_processing_done(struct msm_jpegdma_device *dma) struct jpegdma_ctx *ctx; mutex_lock(&dma->lock); + ctx = v4l2_m2m_get_curr_priv(dma->m2m_dev); if (ctx) { mutex_lock(&ctx->lock); diff --git a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h index adb8b94f098c2..98ae6977d8960 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h +++ b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_dev.h @@ -22,7 +22,7 @@ /* Max number of clocks defined in device tree */ #define MSM_JPEGDMA_MAX_CLK 10 /* Core clock index */ -#define MSM_JPEGDMA_CORE_CLK 0 +#define MSM_JPEGDMA_CORE_CLK "core_clk" /* Max number of regulators defined in device tree */ #define MSM_JPEGDMA_MAX_REGULATOR_NUM 3 /* Max number of planes supported */ @@ -109,6 +109,8 @@ struct msm_jpegdma_size_config { struct msm_jpegdma_size out_size; struct msm_jpegdma_format format; unsigned int fps; + unsigned int in_offset; + unsigned int out_offset; }; /* @@ -262,6 +264,8 @@ struct jpegdma_ctx { struct v4l2_format format_out; struct v4l2_rect crop; struct v4l2_fract timeperframe; + unsigned int in_offset; + unsigned int out_offset; unsigned int config_idx; struct msm_jpegdma_plane_config plane_config[MSM_JPEGDMA_MAX_CONFIGS]; diff --git a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_hw.c b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_hw.c index f3ceaad21bf5a..a1b814b5f4756 100644 --- a/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_hw.c +++ b/drivers/media/platform/msm/camera_v2/jpeg_dma/msm_jpeg_dma_hw.c @@ -165,6 +165,23 @@ static int msm_jpegdma_hw_get_num_pipes(struct msm_jpegdma_device *dma) return num_pipes; } +/* + * msm_jpegdma_hw_get_clock_index - Get clock index by name + * @dma: Pointer to dma device. + * @clk_name: clock name. + */ +int msm_jpegdma_hw_get_clock_index(struct msm_jpegdma_device *dma, + const char *clk_name) +{ + uint32_t i = 0; + + for (i = 0; i < dma->num_clk; i++) { + if (!strcmp(clk_name, dma->jpeg_clk_info[i].clk_name)) + return i; + } + return -EINVAL; +} + /* * msm_jpegdma_hw_reset - Reset jpeg dma core. * @dma: Pointer to dma device. @@ -782,12 +799,20 @@ static int msm_jpegdma_hw_calc_speed(struct msm_jpegdma_device *dma, u64 height; u64 real_clock; u64 calc_rate; + int core_clk_idx; width = size->in_size.width + size->in_size.left; height = size->in_size.height + size->in_size.top; calc_rate = (width * height * size->format.depth * size->fps) / 16; - real_clock = clk_round_rate(dma->clk[MSM_JPEGDMA_CORE_CLK], calc_rate); + core_clk_idx = msm_jpegdma_hw_get_clock_index(dma, + MSM_JPEGDMA_CORE_CLK); + if (core_clk_idx < 0) { + dev_err(dma->dev, "Can get clock index for dma %s\n", + MSM_JPEGDMA_CORE_CLK); + } + + real_clock = clk_round_rate(dma->clk[core_clk_idx], calc_rate); if (real_clock < 0) { dev_err(dma->dev, "Can not round core clock\n"); return -EINVAL; @@ -817,6 +842,7 @@ static int msm_jpegdma_hw_set_speed(struct msm_jpegdma_device *dma, struct msm_jpegdma_speed new_sp; struct msm_jpegdma_size_config new_size; int ret; + int core_clk_idx; if (dma->active_clock_rate >= speed->core_clock) return 0; @@ -830,7 +856,14 @@ static int msm_jpegdma_hw_set_speed(struct msm_jpegdma_device *dma, return -EINVAL; } - ret = clk_set_rate(dma->clk[MSM_JPEGDMA_CORE_CLK], new_sp.core_clock); + core_clk_idx = msm_jpegdma_hw_get_clock_index(dma, + MSM_JPEGDMA_CORE_CLK); + if (core_clk_idx < 0) { + dev_err(dma->dev, "Can get clock index for dma %s\n", + MSM_JPEGDMA_CORE_CLK); + } + + ret = clk_set_rate(dma->clk[core_clk_idx], new_sp.core_clock); if (ret < 0) { dev_err(dma->dev, "Fail Core clock rate %d\n", ret); return -EINVAL; @@ -1022,13 +1055,20 @@ int msm_jpegdma_hw_set_config(struct msm_jpegdma_device *dma, plane_cfg->plane[0].active_pipes = dma->hw_num_pipes; plane_cfg->plane[0].type = size_cfg->format.planes[0]; msm_jpegdma_hw_calc_config(size_cfg, &plane_cfg->plane[0]); + + in_offset = size_cfg->in_offset; + out_offset = size_cfg->out_offset; + + msm_jpegdma_hw_add_plane_offset(&plane_cfg->plane[0], + in_offset, out_offset); + if (size_cfg->format.num_planes == 1) return 0; - in_offset = size_cfg->in_size.scanline * - size_cfg->in_size.stride; - out_offset = size_cfg->out_size.scanline * - size_cfg->out_size.stride; + in_offset += (size_cfg->in_size.scanline * + size_cfg->in_size.stride); + out_offset += (size_cfg->out_size.scanline * + size_cfg->out_size.stride); memset(&plane_size, 0x00, sizeof(plane_size)); for (i = 1; i < size_cfg->format.num_planes; i++) { @@ -1336,7 +1376,8 @@ int msm_jpegdma_hw_get_qos(struct msm_jpegdma_device *dma) unsigned int cnt; const void *property; - property = of_get_property(dma->dev->of_node, "qcom,qos-regs", &cnt); + property = of_get_property(dma->dev->of_node, + "qcom,qos-reg-settings", &cnt); if (!property || !cnt) { dev_dbg(dma->dev, "Missing qos settings\n"); return 0; @@ -1347,9 +1388,9 @@ int msm_jpegdma_hw_get_qos(struct msm_jpegdma_device *dma) if (!dma->qos_regs) return -ENOMEM; - for (i = 0; i < cnt; i++) { + for (i = 0; i < cnt; i = i + 2) { ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,qos-regs", i, + "qcom,qos-reg-settings", i, &dma->qos_regs[i].reg); if (ret < 0) { dev_err(dma->dev, "can not read qos reg %d\n", i); @@ -1357,7 +1398,7 @@ int msm_jpegdma_hw_get_qos(struct msm_jpegdma_device *dma) } ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,qos-settings", i, + "qcom,qos-reg-settings", i + 1, &dma->qos_regs[i].val); if (ret < 0) { dev_err(dma->dev, "can not read qos setting %d\n", i); @@ -1397,7 +1438,8 @@ int msm_jpegdma_hw_get_vbif(struct msm_jpegdma_device *dma) unsigned int cnt; const void *property; - property = of_get_property(dma->dev->of_node, "qcom,vbif-regs", &cnt); + property = of_get_property(dma->dev->of_node, "qcom,vbif-reg-settings", + &cnt); if (!property || !cnt) { dev_dbg(dma->dev, "Missing vbif settings\n"); return 0; @@ -1408,9 +1450,9 @@ int msm_jpegdma_hw_get_vbif(struct msm_jpegdma_device *dma) if (!dma->vbif_regs) return -ENOMEM; - for (i = 0; i < cnt; i++) { + for (i = 0; i < cnt; i = i + 2) { ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,vbif-regs", i, + "qcom,vbif-reg-settings", i, &dma->vbif_regs[i].reg); if (ret < 0) { dev_err(dma->dev, "can not read vbif reg %d\n", i); @@ -1418,7 +1460,7 @@ int msm_jpegdma_hw_get_vbif(struct msm_jpegdma_device *dma) } ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,vbif-settings", i, + "qcom,vbif-reg-settings", i + 1, &dma->vbif_regs[i].val); if (ret < 0) { dev_err(dma->dev, "can not read vbif setting %d\n", i); @@ -1459,8 +1501,8 @@ int msm_jpegdma_hw_get_prefetch(struct msm_jpegdma_device *dma) unsigned int cnt; const void *property; - property = of_get_property(dma->dev->of_node, "qcom,prefetch-regs", - &cnt); + property = of_get_property(dma->dev->of_node, + "qcom,prefetch-reg-settings", &cnt); if (!property || !cnt) { dev_dbg(dma->dev, "Missing prefetch settings\n"); return 0; @@ -1472,9 +1514,9 @@ int msm_jpegdma_hw_get_prefetch(struct msm_jpegdma_device *dma) if (!dma->prefetch_regs) return -ENOMEM; - for (i = 0; i < cnt; i++) { + for (i = 0; i < cnt; i = i + 2) { ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,prefetch-regs", i, + "qcom,prefetch-reg-settings", i, &dma->prefetch_regs[i].reg); if (ret < 0) { dev_err(dma->dev, "can not read prefetch reg %d\n", i); @@ -1482,7 +1524,7 @@ int msm_jpegdma_hw_get_prefetch(struct msm_jpegdma_device *dma) } ret = of_property_read_u32_index(dma->dev->of_node, - "qcom,prefetch-settings", i, + "qcom,prefetch-reg-settings", i + 1, &dma->prefetch_regs[i].val); if (ret < 0) { dev_err(dma->dev, "can not read prefetch setting %d\n", @@ -1598,6 +1640,9 @@ int msm_jpegdma_hw_get(struct msm_jpegdma_device *dma) msm_jpegdma_hw_config_qos(dma); msm_jpegdma_hw_config_vbif(dma); + msm_camera_register_threaded_irq(dma->pdev, dma->irq, NULL, + msm_jpegdma_hw_irq, IRQF_ONESHOT | IRQF_TRIGGER_RISING, + dev_name(&dma->pdev->dev), dma); msm_jpegdma_hw_enable_irq(dma); ret = msm_jpegdma_hw_reset(dma); @@ -1710,6 +1755,7 @@ static int msm_jpegdma_hw_attach_iommu(struct msm_jpegdma_device *dma) static void msm_jpegdma_hw_detach_iommu(struct msm_jpegdma_device *dma) { mutex_lock(&dma->lock); + if (dma->iommu_attached_cnt == 0) { dev_err(dma->dev, "There is no attached device\n"); mutex_unlock(&dma->lock); @@ -1720,6 +1766,7 @@ static void msm_jpegdma_hw_detach_iommu(struct msm_jpegdma_device *dma) cam_smmu_ops(dma->iommu_hndl, CAM_SMMU_DETACH); cam_smmu_destroy_handle(dma->iommu_hndl); } + mutex_unlock(&dma->lock); } diff --git a/drivers/media/platform/msm/camera_v2/msm.c b/drivers/media/platform/msm/camera_v2/msm.c index 4126818776772..f40b1fe9b4556 100644 --- a/drivers/media/platform/msm/camera_v2/msm.c +++ b/drivers/media/platform/msm/camera_v2/msm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -32,7 +32,6 @@ #include "cam_hw_ops.h" #include - static struct v4l2_device *msm_v4l2_dev; static struct list_head ordered_sd_list; @@ -147,7 +146,7 @@ typedef int (*msm_queue_find_func)(void *d1, void *d2); #define msm_queue_find(queue, type, member, func, data) ({\ unsigned long flags; \ struct msm_queue_head *__q = (queue); \ - type *node = 0; \ + type *node = NULL; \ typeof(node) __ret = NULL; \ msm_queue_find_func __f = (func); \ spin_lock_irqsave(&__q->lock, flags); \ @@ -277,22 +276,50 @@ void msm_delete_stream(unsigned int session_id, unsigned int stream_id) struct msm_session *session = NULL; struct msm_stream *stream = NULL; unsigned long flags; + int try_count = 0; session = msm_queue_find(msm_session_q, struct msm_session, list, __msm_queue_find_session, &session_id); + if (!session) return; - stream = msm_queue_find(&session->stream_q, struct msm_stream, - list, __msm_queue_find_stream, &stream_id); - if (!stream) - return; - spin_lock_irqsave(&(session->stream_q.lock), flags); - list_del_init(&stream->list); - session->stream_q.len--; - kfree(stream); - stream = NULL; - spin_unlock_irqrestore(&(session->stream_q.lock), flags); + while (1) { + unsigned long wl_flags; + + if (try_count > 5) { + pr_err("%s : not able to delete stream %d\n", + __func__, __LINE__); + break; + } + + write_lock_irqsave(&session->stream_rwlock, wl_flags); + try_count++; + stream = msm_queue_find(&session->stream_q, struct msm_stream, + list, __msm_queue_find_stream, &stream_id); + + if (!stream) { + write_unlock_irqrestore(&session->stream_rwlock, + wl_flags); + return; + } + + if (msm_vb2_get_stream_state(stream) != 1) { + write_unlock_irqrestore(&session->stream_rwlock, + wl_flags); + continue; + } + + spin_lock_irqsave(&(session->stream_q.lock), flags); + list_del_init(&stream->list); + session->stream_q.len--; + kfree(stream); + stream = NULL; + spin_unlock_irqrestore(&(session->stream_q.lock), flags); + write_unlock_irqrestore(&session->stream_rwlock, wl_flags); + break; + } + } EXPORT_SYMBOL(msm_delete_stream); @@ -359,6 +386,11 @@ static void msm_add_sd_in_position(struct msm_sd_subdev *msm_subdev, struct msm_sd_subdev *temp_sd; list_for_each_entry(temp_sd, sd_list, list) { + if (temp_sd == msm_subdev) { + pr_err("%s :Fail to add the same sd %d\n", + __func__, __LINE__); + return; + } if (msm_subdev->close_seq < temp_sd->close_seq) { list_add_tail(&msm_subdev->list, &temp_sd->list); return; @@ -442,6 +474,7 @@ int msm_create_session(unsigned int session_id, struct video_device *vdev) mutex_init(&session->lock); mutex_init(&session->lock_q); mutex_init(&session->close_lock); + rwlock_init(&session->stream_rwlock); return 0; } EXPORT_SYMBOL(msm_create_session); @@ -692,6 +725,19 @@ static long msm_private_ioctl(struct file *file, void *fh, return 0; } + if (!event_data) + return -EINVAL; + + switch (cmd) { + case MSM_CAM_V4L2_IOCTL_NOTIFY: + case MSM_CAM_V4L2_IOCTL_CMD_ACK: + case MSM_CAM_V4L2_IOCTL_NOTIFY_DEBUG: + case MSM_CAM_V4L2_IOCTL_NOTIFY_ERROR: + break; + default: + return -ENOTTY; + } + memset(&event, 0, sizeof(struct v4l2_event)); session_id = event_data->session_id; stream_id = event_data->stream_id; @@ -997,11 +1043,9 @@ static int msm_open(struct file *filep) BUG_ON(!pvdev); /* !!! only ONE open is allowed !!! */ - if (atomic_read(&pvdev->opened)) + if (atomic_cmpxchg(&pvdev->opened, 0, 1)) return -EBUSY; - atomic_set(&pvdev->opened, 1); - spin_lock_irqsave(&msm_pid_lock, flags); msm_pid = get_pid(task_pid(current)); spin_unlock_irqrestore(&msm_pid_lock, flags); @@ -1032,17 +1076,25 @@ static struct v4l2_file_operations msm_fops = { #endif }; -struct msm_stream *msm_get_stream(unsigned int session_id, - unsigned int stream_id) +struct msm_session *msm_get_session(unsigned int session_id) { struct msm_session *session; - struct msm_stream *stream; session = msm_queue_find(msm_session_q, struct msm_session, list, __msm_queue_find_session, &session_id); if (!session) return ERR_PTR(-EINVAL); + return session; +} +EXPORT_SYMBOL(msm_get_session); + + +struct msm_stream *msm_get_stream(struct msm_session *session, + unsigned int stream_id) +{ + struct msm_stream *stream; + stream = msm_queue_find(&session->stream_q, struct msm_stream, list, __msm_queue_find_stream, &stream_id); @@ -1099,22 +1151,54 @@ struct msm_stream *msm_get_stream_from_vb2q(struct vb2_queue *q) } EXPORT_SYMBOL(msm_get_stream_from_vb2q); +struct msm_session *msm_get_session_from_vb2q(struct vb2_queue *q) +{ + struct msm_session *session; + struct msm_stream *stream; + unsigned long flags1; + unsigned long flags2; + + spin_lock_irqsave(&msm_session_q->lock, flags1); + list_for_each_entry(session, &(msm_session_q->list), list) { + spin_lock_irqsave(&(session->stream_q.lock), flags2); + list_for_each_entry( + stream, &(session->stream_q.list), list) { + if (stream->vb2_q == q) { + spin_unlock_irqrestore + (&(session->stream_q.lock), flags2); + spin_unlock_irqrestore + (&msm_session_q->lock, flags1); + return session; + } + } + spin_unlock_irqrestore(&(session->stream_q.lock), flags2); + } + spin_unlock_irqrestore(&msm_session_q->lock, flags1); + return NULL; +} +EXPORT_SYMBOL(msm_get_session_from_vb2q); + + #ifdef CONFIG_COMPAT long msm_copy_camera_private_ioctl_args(unsigned long arg, struct msm_camera_private_ioctl_arg *k_ioctl, void __user **tmp_compat_ioctl_ptr) { - struct msm_camera_private_ioctl_arg *up_ioctl_ptr = - (struct msm_camera_private_ioctl_arg *)arg; + struct msm_camera_private_ioctl_arg up_ioctl; if (WARN_ON(!arg || !k_ioctl || !tmp_compat_ioctl_ptr)) return -EIO; - k_ioctl->id = up_ioctl_ptr->id; - k_ioctl->size = up_ioctl_ptr->size; - k_ioctl->result = up_ioctl_ptr->result; - k_ioctl->reserved = up_ioctl_ptr->reserved; - *tmp_compat_ioctl_ptr = compat_ptr(up_ioctl_ptr->ioctl_ptr); + if (copy_from_user(&up_ioctl, + (struct msm_camera_private_ioctl_arg *)arg, + sizeof(struct msm_camera_private_ioctl_arg))) + return -EFAULT; + + k_ioctl->id = up_ioctl.id; + k_ioctl->size = up_ioctl.size; + k_ioctl->result = up_ioctl.result; + k_ioctl->reserved = up_ioctl.reserved; + *tmp_compat_ioctl_ptr = compat_ptr(up_ioctl.ioctl_ptr); return 0; } diff --git a/drivers/media/platform/msm/camera_v2/msm.h b/drivers/media/platform/msm/camera_v2/msm.h index 2b3576b8edd26..39797de41cce5 100644 --- a/drivers/media/platform/msm/camera_v2/msm.h +++ b/drivers/media/platform/msm/camera_v2/msm.h @@ -110,6 +110,7 @@ struct msm_session { struct mutex lock; struct mutex lock_q; struct mutex close_lock; + rwlock_t stream_rwlock; }; static inline bool msm_is_daemon_present(void) @@ -127,11 +128,13 @@ int msm_create_stream(unsigned int session_id, void msm_delete_stream(unsigned int session_id, unsigned int stream_id); int msm_create_command_ack_q(unsigned int session_id, unsigned int stream_id); void msm_delete_command_ack_q(unsigned int session_id, unsigned int stream_id); -struct msm_stream *msm_get_stream(unsigned int session_id, +struct msm_session *msm_get_session(unsigned int session_id); +struct msm_stream *msm_get_stream(struct msm_session *session, unsigned int stream_id); struct vb2_queue *msm_get_stream_vb2q(unsigned int session_id, unsigned int stream_id); struct msm_stream *msm_get_stream_from_vb2q(struct vb2_queue *q); +struct msm_session *msm_get_session_from_vb2q(struct vb2_queue *q); struct msm_session *msm_session_find(unsigned int session_id); #ifdef CONFIG_COMPAT long msm_copy_camera_private_ioctl_args(unsigned long arg, diff --git a/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c b/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c index 6b07f16ccec73..d0b265a787979 100644 --- a/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c +++ b/drivers/media/platform/msm/camera_v2/msm_buf_mgr/msm_generic_buf_mgr.c @@ -297,8 +297,8 @@ static void msm_buf_mngr_sd_shutdown(struct msm_buf_mngr_device *dev, if (!list_empty(&dev->buf_qhead)) { list_for_each_entry_safe(bufs, save, &dev->buf_qhead, entry) { - pr_info("%s: Delete invalid bufs =%lx, session_id=%u, bufs->ses_id=%d, str_id=%d, idx=%d\n", - __func__, (unsigned long)bufs, session->session, + pr_info("%s: Delete invalid bufs =%pK, session_id=%u, bufs->ses_id=%d, str_id=%d, idx=%d\n", + __func__, (void *)bufs, session->session, bufs->session_id, bufs->stream_id, bufs->index); if (session->session == bufs->session_id) { @@ -554,8 +554,7 @@ static long msm_buf_mngr_subdev_ioctl(struct v4l2_subdev *sd, sizeof(struct msm_buf_mngr_info))) { return -EFAULT; } - MSM_CAM_GET_IOCTL_ARG_PTR(&k_ioctl.ioctl_ptr, - &buf_info, sizeof(void *)); + k_ioctl.ioctl_ptr = (uintptr_t)&buf_info; argp = &k_ioctl; rc = msm_cam_buf_mgr_ops(cmd, argp); } diff --git a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c index 8bea9efc292bb..a1e37b3c81621 100644 --- a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c +++ b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -44,16 +44,25 @@ static int msm_vb2_queue_setup(struct vb2_queue *q, int msm_vb2_buf_init(struct vb2_buffer *vb) { struct msm_stream *stream; + struct msm_session *session; struct msm_vb2_buffer *msm_vb2_buf; + unsigned long rl_flags; + + session = msm_get_session_from_vb2q(vb->vb2_queue); + if (IS_ERR_OR_NULL(session)) + return -EINVAL; + + read_lock_irqsave(&session->stream_rwlock, rl_flags); stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s: Couldn't find stream\n", __func__); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; } msm_vb2_buf = container_of(vb, struct msm_vb2_buffer, vb2_buf); msm_vb2_buf->in_freeq = 0; - + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return 0; } @@ -61,7 +70,8 @@ static void msm_vb2_buf_queue(struct vb2_buffer *vb) { struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; - unsigned long flags; + struct msm_session *session; + unsigned long flags, rl_flags; msm_vb2 = container_of(vb, struct msm_vb2_buffer, vb2_buf); @@ -70,34 +80,50 @@ static void msm_vb2_buf_queue(struct vb2_buffer *vb) return; } + session = msm_get_session_from_vb2q(vb->vb2_queue); + if (IS_ERR_OR_NULL(session)) + return; + + read_lock_irqsave(&session->stream_rwlock, rl_flags); + stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s:%d] NULL stream", __func__, __LINE__); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } spin_lock_irqsave(&stream->stream_lock, flags); list_add_tail(&msm_vb2->list, &stream->queued_list); spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); } static void msm_vb2_buf_finish(struct vb2_buffer *vb) { struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; - unsigned long flags; + struct msm_session *session; + unsigned long flags, rl_flags; struct msm_vb2_buffer *msm_vb2_entry, *temp; msm_vb2 = container_of(vb, struct msm_vb2_buffer, vb2_buf); if (!msm_vb2) { pr_err("%s:%d] vb2_buf NULL", __func__, __LINE__); - return; + return; } + session = msm_get_session_from_vb2q(vb->vb2_queue); + if (IS_ERR_OR_NULL(session)) + return; + + read_lock_irqsave(&session->stream_rwlock, rl_flags); + stream = msm_get_stream_from_vb2q(vb->vb2_queue); if (!stream) { pr_err("%s:%d] NULL stream", __func__, __LINE__); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } @@ -110,6 +136,7 @@ static void msm_vb2_buf_finish(struct vb2_buffer *vb) } } spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } @@ -117,12 +144,20 @@ static void msm_vb2_stop_stream(struct vb2_queue *q) { struct msm_vb2_buffer *msm_vb2, *temp; struct msm_stream *stream; - unsigned long flags; + struct msm_session *session; + unsigned long flags, rl_flags; struct vb2_buffer *vb2_buf; + session = msm_get_session_from_vb2q(q); + if (IS_ERR_OR_NULL(session)) + return; + + read_lock_irqsave(&session->stream_rwlock, rl_flags); + stream = msm_get_stream_from_vb2q(q); if (!stream) { pr_err_ratelimited("%s:%d] NULL stream", __func__, __LINE__); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return; } @@ -141,8 +176,28 @@ static void msm_vb2_stop_stream(struct vb2_queue *q) msm_vb2->in_freeq = 0; } spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); } +int msm_vb2_get_stream_state(struct msm_stream *stream) +{ + struct msm_vb2_buffer *msm_vb2, *temp; + unsigned long flags; + int rc = 1; + + spin_lock_irqsave(&stream->stream_lock, flags); + list_for_each_entry_safe(msm_vb2, temp, &(stream->queued_list), list) { + if (msm_vb2->in_freeq != 0) { + rc = 0; + break; + } + } + spin_unlock_irqrestore(&stream->stream_lock, flags); + return rc; +} +EXPORT_SYMBOL(msm_vb2_get_stream_state); + + static struct vb2_ops msm_vb2_get_q_op = { .queue_setup = msm_vb2_queue_setup, .buf_init = msm_vb2_buf_init, @@ -196,12 +251,21 @@ static struct vb2_buffer *msm_vb2_get_buf(int session_id, { struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; + struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; - unsigned long flags; + unsigned long flags, rl_flags; + + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) + return NULL; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + read_lock_irqsave(&session->stream_rwlock, rl_flags); + + stream = msm_get_stream(session, stream_id); + if (IS_ERR_OR_NULL(stream)) { + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return NULL; + } spin_lock_irqsave(&stream->stream_lock, flags); @@ -225,6 +289,8 @@ static struct vb2_buffer *msm_vb2_get_buf(int session_id, vb2_buf = NULL; end: spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); + return vb2_buf; } @@ -233,13 +299,23 @@ static struct vb2_buffer *msm_vb2_get_buf_by_idx(int session_id, { struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; + struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; - unsigned long flags; + unsigned long flags, rl_flags; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) return NULL; + read_lock_irqsave(&session->stream_rwlock, rl_flags); + + stream = msm_get_stream(session, stream_id); + + if (IS_ERR_OR_NULL(stream)) { + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); + return NULL; + } + spin_lock_irqsave(&stream->stream_lock, flags); if (!stream->vb2_q) { @@ -260,21 +336,34 @@ static struct vb2_buffer *msm_vb2_get_buf_by_idx(int session_id, vb2_buf = NULL; end: spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); + return vb2_buf; } + static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, unsigned int stream_id) { struct msm_stream *stream; + struct msm_session *session; struct msm_vb2_buffer *msm_vb2; struct vb2_buffer *vb2_buf = NULL; int rc = 0; - unsigned long flags; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + unsigned long flags, rl_flags; + + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) return -EINVAL; + read_lock_irqsave(&session->stream_rwlock, rl_flags); + + stream = msm_get_stream(session, stream_id); + if (IS_ERR_OR_NULL(stream)) { + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); + return -EINVAL; + } + spin_lock_irqsave(&stream->stream_lock, flags); if (vb) { list_for_each_entry(msm_vb2, &(stream->queued_list), list) { @@ -286,6 +375,8 @@ static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, pr_err("VB buffer is INVALID vb=%pK, ses_id=%d, str_id=%d\n", vb, session_id, stream_id); spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, + rl_flags); return -EINVAL; } msm_vb2 = @@ -301,6 +392,7 @@ static int msm_vb2_put_buf(struct vb2_buffer *vb, int session_id, rc = -EINVAL; } spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return rc; } @@ -308,15 +400,25 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, unsigned int stream_id, uint32_t sequence, struct timeval *ts, uint32_t reserved) { - unsigned long flags; + unsigned long flags, rl_flags; struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; + struct msm_session *session; int rc = 0; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) return -EINVAL; + + read_lock_irqsave(&session->stream_rwlock, rl_flags); + + stream = msm_get_stream(session, stream_id); + if (IS_ERR_OR_NULL(stream)) { + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); + return -EINVAL; + } + spin_lock_irqsave(&stream->stream_lock, flags); if (vb) { list_for_each_entry(msm_vb2, &(stream->queued_list), list) { @@ -328,6 +430,8 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, pr_err("VB buffer is INVALID ses_id=%d, str_id=%d, vb=%pK\n", session_id, stream_id, vb); spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, + rl_flags); return -EINVAL; } msm_vb2 = @@ -348,6 +452,7 @@ static int msm_vb2_buf_done(struct vb2_buffer *vb, int session_id, rc = -EINVAL; } spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return rc; } @@ -356,14 +461,23 @@ long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id, { struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; + struct msm_session *session; struct msm_vb2_buffer *msm_vb2 = NULL; - unsigned long flags; + unsigned long flags, rl_flags; long rc = -EINVAL; - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) return rc; + read_lock_irqsave(&session->stream_rwlock, rl_flags); + + stream = msm_get_stream(session, stream_id); + if (IS_ERR_OR_NULL(stream)) { + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); + return -EINVAL; + } + spin_lock_irqsave(&stream->stream_lock, flags); if (!stream->vb2_q) { @@ -388,20 +502,31 @@ long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id, end: spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return rc; } EXPORT_SYMBOL(msm_vb2_return_buf_by_idx); static int msm_vb2_flush_buf(int session_id, unsigned int stream_id) { - unsigned long flags; + unsigned long flags, rl_flags; struct msm_vb2_buffer *msm_vb2; struct msm_stream *stream; struct vb2_buffer *vb2_buf = NULL; + struct msm_session *session; + + session = msm_get_session(session_id); + if (IS_ERR_OR_NULL(session)) + return -EINVAL; + + read_lock_irqsave(&session->stream_rwlock, rl_flags); - stream = msm_get_stream(session_id, stream_id); - if (IS_ERR_OR_NULL(stream)) + stream = msm_get_stream(session, stream_id); + if (IS_ERR_OR_NULL(stream)) { + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return -EINVAL; + } + spin_lock_irqsave(&stream->stream_lock, flags); list_for_each_entry(msm_vb2, &(stream->queued_list), list) { vb2_buf = &(msm_vb2->vb2_buf); @@ -410,6 +535,7 @@ static int msm_vb2_flush_buf(int session_id, unsigned int stream_id) msm_vb2->in_freeq = 0; } spin_unlock_irqrestore(&stream->stream_lock, flags); + read_unlock_irqrestore(&session->stream_rwlock, rl_flags); return 0; } diff --git a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.h b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.h index 066206c62f5f3..1da89e057b844 100644 --- a/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.h +++ b/drivers/media/platform/msm/camera_v2/msm_vb2/msm_vb2.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -67,5 +67,6 @@ struct vb2_mem_ops *msm_vb2_get_q_mem_ops(void); int msm_vb2_request_cb(struct msm_sd_req_vb2_q *req_sd); long msm_vb2_return_buf_by_idx(int session_id, unsigned int stream_id, uint32_t index); +int msm_vb2_get_stream_state(struct msm_stream *stream); #endif /*_MSM_VB_H */ diff --git a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c index a4d1b667ccc5f..18daac6ab23d8 100644 --- a/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c +++ b/drivers/media/platform/msm/camera_v2/pproc/cpp/msm_cpp.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -115,6 +116,12 @@ static int msm_cpp_update_gdscr_status(struct cpp_device *cpp_dev, bool status); static int msm_cpp_buffer_private_ops(struct cpp_device *cpp_dev, uint32_t buff_mgr_ops, uint32_t id, void *arg); +static void msm_cpp_set_micro_irq_mask(struct cpp_device *cpp_dev, + uint8_t enable, uint32_t irq_mask); +static void msm_cpp_flush_queue_and_release_buffer(struct cpp_device *cpp_dev, + int queue_len); +static int msm_cpp_dump_frame_cmd(struct msm_cpp_frame_info_t *frame_info); +static int32_t msm_cpp_reset_vbif_and_load_fw(struct cpp_device *cpp_dev); #if CONFIG_MSM_CPP_DBG #define CPP_DBG(fmt, args...) pr_err(fmt, ##args) @@ -656,8 +663,139 @@ static int32_t msm_cpp_poll_rx_empty(void __iomem *cpp_base) } return rc; } +static int msm_cpp_dump_addr(struct cpp_device *cpp_dev, + struct msm_cpp_frame_info_t *frame_info) +{ + int32_t s_base, p_base; + uint32_t rd_off, wr0_off, wr1_off, wr2_off, wr3_off; + uint32_t wr0_mdata_off, wr1_mdata_off, wr2_mdata_off, wr3_mdata_off; + uint32_t rd_ref_off, wr_ref_off; + uint32_t s_size, p_size; + uint8_t tnr_enabled, ubwc_enabled, cds_en; + int32_t i = 0; + uint32_t *cpp_frame_msg; + + cpp_frame_msg = frame_info->cpp_cmd_msg; + + /* Update stripe/plane size and base offsets */ + s_base = cpp_dev->payload_params.stripe_base; + s_size = cpp_dev->payload_params.stripe_size; + p_base = cpp_dev->payload_params.plane_base; + p_size = cpp_dev->payload_params.plane_size; + + /* Fetch engine Offset */ + rd_off = cpp_dev->payload_params.rd_pntr_off; + /* Write engine offsets */ + wr0_off = cpp_dev->payload_params.wr_0_pntr_off; + wr1_off = wr0_off + 1; + wr2_off = wr1_off + 1; + wr3_off = wr2_off + 1; + /* Reference engine offsets */ + rd_ref_off = cpp_dev->payload_params.rd_ref_pntr_off; + wr_ref_off = cpp_dev->payload_params.wr_ref_pntr_off; + /* Meta data offsets */ + wr0_mdata_off = + cpp_dev->payload_params.wr_0_meta_data_wr_pntr_off; + wr1_mdata_off = (wr0_mdata_off + 1); + wr2_mdata_off = (wr1_mdata_off + 1); + wr3_mdata_off = (wr2_mdata_off + 1); + + tnr_enabled = ((frame_info->feature_mask & TNR_MASK) >> 2); + ubwc_enabled = ((frame_info->feature_mask & UBWC_MASK) >> 5); + cds_en = ((frame_info->feature_mask & CDS_MASK) >> 6); + + for (i = 0; i < frame_info->num_strips; i++) { + pr_err("stripe %d: in %x, out1 %x out2 %x, out3 %x, out4 %x\n", + i, cpp_frame_msg[s_base + rd_off + i * s_size], + cpp_frame_msg[s_base + wr0_off + i * s_size], + cpp_frame_msg[s_base + wr1_off + i * s_size], + cpp_frame_msg[s_base + wr2_off + i * s_size], + cpp_frame_msg[s_base + wr3_off + i * s_size]); + + if (tnr_enabled) { + pr_err("stripe %d: read_ref %x, write_ref %x\n", i, + cpp_frame_msg[s_base + rd_ref_off + i * s_size], + cpp_frame_msg[s_base + wr_ref_off + i * s_size] + ); + } + if (cds_en) { + pr_err("stripe %d:, dsdn_off %x\n", i, + cpp_frame_msg[s_base + rd_ref_off + i * s_size] + ); + } + if (ubwc_enabled) { + pr_err("stripe %d: metadata %x, %x, %x, %x\n", i, + cpp_frame_msg[s_base + wr0_mdata_off + + i * s_size], + cpp_frame_msg[s_base + wr1_mdata_off + + i * s_size], + cpp_frame_msg[s_base + wr2_mdata_off + + i * s_size], + cpp_frame_msg[s_base + wr3_mdata_off + + i * s_size] + ); + } + + } + return 0; +} + +static void msm_cpp_iommu_fault_handler(struct iommu_domain *domain, + struct device *dev, unsigned long iova, int flags, void *token) +{ + struct cpp_device *cpp_dev = NULL; + struct msm_cpp_frame_info_t *processed_frame[MAX_CPP_PROCESSING_FRAME]; + int32_t i = 0, queue_len = 0; + struct msm_device_queue *queue = NULL; + int32_t rc = 0; + + if (token) { + cpp_dev = token; + disable_irq(cpp_dev->irq->start); + if (atomic_read(&cpp_timer.used)) { + atomic_set(&cpp_timer.used, 0); + del_timer_sync(&cpp_timer.cpp_timer); + } + mutex_lock(&cpp_dev->mutex); + tasklet_kill(&cpp_dev->cpp_tasklet); + + rc = cpp_load_fw(cpp_dev, cpp_dev->fw_name_bin); + + if (rc < 0) { + pr_err("load fw failure %d-retry\n", rc); + rc = msm_cpp_reset_vbif_and_load_fw(cpp_dev); + if (rc < 0) { + msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8); + mutex_unlock(&cpp_dev->mutex); + return; + } + } + queue = &cpp_timer.data.cpp_dev->processing_q; + queue_len = queue->len; + if (!queue_len) { + pr_err("%s:%d: Invalid queuelen\n", __func__, __LINE__); + msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8); + mutex_unlock(&cpp_dev->mutex); + return; + } + for (i = 0; i < queue_len; i++) { + if (cpp_timer.data.processed_frame[i]) { + processed_frame[i] = + cpp_timer.data.processed_frame[i]; + pr_err("Fault on identity=0x%x, frame_id=%03d\n", + processed_frame[i]->identity, + processed_frame[i]->frame_id); + msm_cpp_dump_addr(cpp_dev, processed_frame[i]); + msm_cpp_dump_frame_cmd(processed_frame[i]); + } + } + msm_cpp_flush_queue_and_release_buffer(cpp_dev, queue_len); + msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8); + mutex_unlock(&cpp_dev->mutex); + } +} static int cpp_init_mem(struct cpp_device *cpp_dev) { int rc = 0; @@ -673,6 +811,12 @@ static int cpp_init_mem(struct cpp_device *cpp_dev) return -ENODEV; cpp_dev->iommu_hdl = iommu_hdl; + + cam_smmu_reg_client_page_fault_handler( + cpp_dev->iommu_hdl, + msm_cpp_iommu_fault_handler, cpp_dev); + + return 0; } @@ -883,11 +1027,16 @@ static int cpp_init_hardware(struct cpp_device *cpp_dev) if (cpp_dev->fw_name_bin) { msm_camera_enable_irq(cpp_dev->irq, false); rc = cpp_load_fw(cpp_dev, cpp_dev->fw_name_bin); - msm_camera_enable_irq(cpp_dev->irq, true); if (rc < 0) { - pr_err("%s: load firmware failure %d\n", __func__, rc); - goto pwr_collapse_reset; + pr_err("%s: load firmware failure %d-retry\n", + __func__, rc); + rc = msm_cpp_reset_vbif_and_load_fw(cpp_dev); + if (rc < 0) { + msm_camera_enable_irq(cpp_dev->irq, true); + goto pwr_collapse_reset; + } } + msm_camera_enable_irq(cpp_dev->irq, true); msm_camera_io_w_mb(0x7C8, cpp_dev->base + MSM_CPP_MICRO_IRQGEN_MASK); msm_camera_io_w_mb(0xFFFF, cpp_dev->base + @@ -899,6 +1048,7 @@ static int cpp_init_hardware(struct cpp_device *cpp_dev) pwr_collapse_reset: msm_cpp_update_gdscr_status(cpp_dev, false); + msm_camera_unregister_irq(cpp_dev->pdev, cpp_dev->irq, cpp_dev); req_irq_fail: msm_camera_clk_enable(&cpp_dev->pdev->dev, cpp_dev->clk_info, cpp_dev->cpp_clk, cpp_dev->num_clks, false); @@ -1063,6 +1213,34 @@ static int32_t cpp_load_fw(struct cpp_device *cpp_dev, char *fw_name_bin) return rc; } +int32_t msm_cpp_reset_vbif_clients(struct cpp_device *cpp_dev) +{ + uint32_t i; + + pr_warn("%s: handle vbif hang...\n", __func__); + for (i = 0; i < VBIF_CLIENT_MAX; i++) { + if (cpp_dev->vbif_data->err_handler[i] == NULL) + continue; + + cpp_dev->vbif_data->err_handler[i]( + cpp_dev->vbif_data->dev[i], CPP_VBIF_ERROR_HANG); + } + return 0; +} + +int32_t msm_cpp_reset_vbif_and_load_fw(struct cpp_device *cpp_dev) +{ + int32_t rc = 0; + + msm_cpp_reset_vbif_clients(cpp_dev); + + rc = cpp_load_fw(cpp_dev, cpp_dev->fw_name_bin); + if (rc < 0) + pr_err("Reset and load fw failed %d\n", rc); + + return rc; +} + int cpp_vbif_error_handler(void *dev, uint32_t vbif_error) { struct cpp_device *cpp_dev = NULL; @@ -1128,6 +1306,10 @@ static int cpp_open_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) CPP_DBG("open %d %pK\n", i, &fh->vfh); cpp_dev->cpp_open_cnt++; + + msm_cpp_vbif_register_error_handler(cpp_dev, + VBIF_CLIENT_CPP, cpp_vbif_error_handler); + if (cpp_dev->cpp_open_cnt == 1) { rc = cpp_init_hardware(cpp_dev); if (rc < 0) { @@ -1150,9 +1332,6 @@ static int cpp_open_node(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) cpp_dev->state = CPP_STATE_IDLE; } - msm_cpp_vbif_register_error_handler(cpp_dev, - VBIF_CLIENT_CPP, cpp_vbif_error_handler); - mutex_unlock(&cpp_dev->mutex); return 0; } @@ -1501,21 +1680,16 @@ static void msm_cpp_do_timeout_work(struct work_struct *work) goto end; } - pr_err("%s: handle vbif hang...\n", __func__); - for (i = 0; i < VBIF_CLIENT_MAX; i++) { - if (cpp_dev->vbif_data->err_handler[i] == NULL) - continue; - - cpp_dev->vbif_data->err_handler[i]( - cpp_dev->vbif_data->dev[i], CPP_VBIF_ERROR_HANG); - } - pr_debug("Reloading firmware %d\n", queue_len); rc = cpp_load_fw(cpp_timer.data.cpp_dev, cpp_timer.data.cpp_dev->fw_name_bin); if (rc) { - pr_warn("Firmware loading failed\n"); - goto error; + pr_warn("Firmware loading failed-retry\n"); + rc = msm_cpp_reset_vbif_and_load_fw(cpp_dev); + if (rc < 0) { + pr_err("Firmware loading failed\n"); + goto error; + } } else { pr_debug("Firmware loading done\n"); } @@ -1536,6 +1710,17 @@ static void msm_cpp_do_timeout_work(struct work_struct *work) goto end; } + for (i = 0; i < queue_len; i++) { + processed_frame[i] = cpp_timer.data.processed_frame[i]; + if (!processed_frame[i]) { + pr_warn("process frame null , queue len %d", queue_len); + msm_cpp_flush_queue_and_release_buffer(cpp_dev, + queue_len); + msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8); + goto end; + } + } + atomic_set(&cpp_timer.used, 1); pr_warn("Starting timer to fire in %d ms. (jiffies=%lu)\n", CPP_CMD_TIMEOUT_MS, jiffies); @@ -1544,9 +1729,6 @@ static void msm_cpp_do_timeout_work(struct work_struct *work) msm_cpp_set_micro_irq_mask(cpp_dev, 1, 0x8); - for (i = 0; i < MAX_CPP_PROCESSING_FRAME; i++) - processed_frame[i] = cpp_timer.data.processed_frame[i]; - for (i = 0; i < queue_len; i++) { pr_warn("Rescheduling for identity=0x%x, frame_id=%03d\n", processed_frame[i]->identity, @@ -1865,6 +2047,8 @@ static int msm_cpp_check_buf_type(struct msm_buf_mngr_info *buff_mgr_info, /* More or equal bufs as Input buffer */ num_output_bufs = new_frame->batch_info.batch_size; } + if (num_output_bufs > MSM_OUTPUT_BUF_CNT) + return 0; for (i = 0; i < num_output_bufs; i++) { new_frame->output_buffer_info[i].index = buff_mgr_info->user_buf.buf_idx[i]; @@ -2245,7 +2429,7 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev, struct msm_buf_mngr_info buff_mgr_info, dup_buff_mgr_info; int32_t in_fd; int32_t num_output_bufs = 1; - int32_t stripe_base = 0; + uint32_t stripe_base = 0; uint32_t stripe_size; uint8_t tnr_enabled; enum msm_camera_buf_mngr_buf_type buf_type = @@ -2274,21 +2458,46 @@ static int msm_cpp_cfg_frame(struct cpp_device *cpp_dev, return -EINVAL; } - if (!new_frame->partial_frame_indicator) { - if (cpp_frame_msg[new_frame->msg_len - 1] != - MSM_CPP_MSG_ID_TRAILER) { - pr_err("Invalid frame message\n"); - return -EINVAL; - } + if (cpp_frame_msg[new_frame->msg_len - 1] != + MSM_CPP_MSG_ID_TRAILER) { + pr_err("Invalid frame message\n"); + return -EINVAL; + } - if ((stripe_base + new_frame->num_strips * stripe_size + 1) != - new_frame->msg_len) { - pr_err("Invalid frame message,len=%d,expected=%d\n", - new_frame->msg_len, - (stripe_base + - new_frame->num_strips * stripe_size + 1)); - return -EINVAL; - } + /* Stripe index starts at zero */ + if ((!new_frame->num_strips) || + (new_frame->first_stripe_index >= new_frame->num_strips) || + (new_frame->last_stripe_index >= new_frame->num_strips) || + (new_frame->first_stripe_index > + new_frame->last_stripe_index)) { + pr_err("Invalid frame message, #stripes=%d, stripe indices=[%d,%d]\n", + new_frame->num_strips, + new_frame->first_stripe_index, + new_frame->last_stripe_index); + return -EINVAL; + } + + if (!stripe_size) { + pr_err("Invalid frame message, invalid stripe_size (%d)!\n", + stripe_size); + return -EINVAL; + } + + if ((stripe_base == UINT_MAX) || + (new_frame->num_strips > + (UINT_MAX - 1 - stripe_base) / stripe_size)) { + pr_err("Invalid frame message, num_strips %d is large\n", + new_frame->num_strips); + return -EINVAL; + } + + if ((stripe_base + new_frame->num_strips * stripe_size + 1) != + new_frame->msg_len) { + pr_err("Invalid frame message,len=%d,expected=%d\n", + new_frame->msg_len, + (stripe_base + + new_frame->num_strips * stripe_size + 1)); + return -EINVAL; } if (cpp_dev->iommu_state != CPP_IOMMU_STATE_ATTACHED) { @@ -2517,13 +2726,14 @@ static int msm_cpp_cfg(struct cpp_device *cpp_dev, struct msm_cpp_frame_info_t *frame = NULL; struct msm_cpp_frame_info_t k_frame_info; int32_t rc = 0; - int32_t i = 0; - int32_t num_buff = sizeof(k_frame_info.output_buffer_info)/ - sizeof(struct msm_cpp_buffer_info_t); + uint32_t i = 0; + uint32_t num_buff = sizeof(k_frame_info.output_buffer_info) / + sizeof(struct msm_cpp_buffer_info_t); + if (copy_from_user(&k_frame_info, (void __user *)ioctl_ptr->ioctl_ptr, sizeof(k_frame_info))) - return -EFAULT; + return -EFAULT; frame = msm_cpp_get_frame(ioctl_ptr); if (!frame) { @@ -2668,24 +2878,27 @@ static int32_t msm_cpp_fw_version(struct cpp_device *cpp_dev) return rc; } -static int msm_cpp_validate_input(unsigned int cmd, void *arg, +static int msm_cpp_validate_ioctl_input(unsigned int cmd, void *arg, struct msm_camera_v4l2_ioctl_t **ioctl_ptr) { switch (cmd) { case MSM_SD_SHUTDOWN: case MSM_SD_NOTIFY_FREEZE: case MSM_SD_UNNOTIFY_FREEZE: + case VIDIOC_MSM_CPP_IOMMU_ATTACH: + case VIDIOC_MSM_CPP_IOMMU_DETACH: break; default: { if (ioctl_ptr == NULL) { - pr_err("Wrong ioctl_ptr %pK\n", ioctl_ptr); + pr_err("Wrong ioctl_ptr for cmd %u\n", cmd); return -EINVAL; } *ioctl_ptr = arg; - if ((*ioctl_ptr == NULL) || - ((*ioctl_ptr)->ioctl_ptr == NULL)) { - pr_err("Wrong arg %pK\n", arg); + if (((*ioctl_ptr) == NULL) || + ((*ioctl_ptr)->ioctl_ptr == NULL) || + ((*ioctl_ptr)->len == 0)) { + pr_err("Error invalid ioctl argument cmd %u", cmd); return -EINVAL; } break; @@ -2710,7 +2923,13 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, pr_err("cpp_dev is null\n"); return -EINVAL; } - rc = msm_cpp_validate_input(cmd, arg, &ioctl_ptr); + + if (_IOC_DIR(cmd) == _IOC_NONE) { + pr_err("Invalid ioctl/subdev cmd %u", cmd); + return -EINVAL; + } + + rc = msm_cpp_validate_ioctl_input(cmd, arg, &ioctl_ptr); if (rc != 0) { pr_err("input validation failed\n"); return rc; @@ -2790,11 +3009,14 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, msm_camera_enable_irq(cpp_dev->irq, false); rc = cpp_load_fw(cpp_dev, cpp_dev->fw_name_bin); if (rc < 0) { - pr_err("%s: load firmware failure %d\n", + pr_err("%s: load firmware failure %d-retry\n", __func__, rc); - enable_irq(cpp_dev->irq->start); - mutex_unlock(&cpp_dev->mutex); - return rc; + rc = msm_cpp_reset_vbif_and_load_fw(cpp_dev); + if (rc < 0) { + enable_irq(cpp_dev->irq->start); + mutex_unlock(&cpp_dev->mutex); + return rc; + } } rc = msm_cpp_fw_version(cpp_dev); if (rc < 0) { @@ -2945,8 +3167,7 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, uint32_t identity; struct msm_cpp_buff_queue_info_t *buff_queue_info; CPP_DBG("VIDIOC_MSM_CPP_DEQUEUE_STREAM_BUFF_INFO\n"); - if ((ioctl_ptr->len == 0) || - (ioctl_ptr->len > sizeof(uint32_t))) { + if (ioctl_ptr->len != sizeof(uint32_t)) { mutex_unlock(&cpp_dev->mutex); return -EINVAL; } @@ -3201,7 +3422,7 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, (cpp_dev->stream_cnt == 0)) { rc = cam_smmu_ops(cpp_dev->iommu_hdl, CAM_SMMU_DETACH); if (rc < 0) { - pr_err("%s:%dError iommu atach failed\n", + pr_err("%s:%dError iommu detach failed\n", __func__, __LINE__); rc = -EINVAL; break; @@ -3210,6 +3431,7 @@ long msm_cpp_subdev_ioctl(struct v4l2_subdev *sd, } else { pr_err("%s:%d IOMMMU attach triggered in invalid state\n", __func__, __LINE__); + rc = -EINVAL; } break; } @@ -3525,6 +3747,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, struct msm_cpp_frame_info32_t k32_frame_info; struct msm_cpp_frame_info_t k64_frame_info; uint32_t identity_k = 0; + bool is_copytouser_req = true; void __user *up = (void __user *)arg; if (sd == NULL) { @@ -3658,9 +3881,8 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, break; } } - if (copy_to_user( - (void __user *)kp_ioctl.ioctl_ptr, &inst_info, - sizeof(struct msm_cpp_frame_info32_t))) { + if (copy_to_user((void __user *)kp_ioctl.ioctl_ptr, + &inst_info, sizeof(struct msm_cpp_frame_info32_t))) { mutex_unlock(&cpp_dev->mutex); return -EFAULT; } @@ -3696,6 +3918,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, sizeof(struct msm_cpp_stream_buff_info_t); } } + is_copytouser_req = false; if (cmd == VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO32) cmd = VIDIOC_MSM_CPP_ENQUEUE_STREAM_BUFF_INFO; else if (cmd == VIDIOC_MSM_CPP_DELETE_STREAM_BUFF32) @@ -3710,6 +3933,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, get_user(identity_k, identity_u); kp_ioctl.ioctl_ptr = (void *)&identity_k; kp_ioctl.len = sizeof(uint32_t); + is_copytouser_req = false; cmd = VIDIOC_MSM_CPP_DEQUEUE_STREAM_BUFF_INFO; break; } @@ -3768,6 +3992,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, sizeof(struct msm_cpp_clock_settings_t); } } + is_copytouser_req = false; cmd = VIDIOC_MSM_CPP_SET_CLOCK; break; } @@ -3793,6 +4018,7 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, kp_ioctl.ioctl_ptr = (void *)&k_queue_buf; kp_ioctl.len = sizeof(struct msm_pproc_queue_buf_info); + is_copytouser_req = false; cmd = VIDIOC_MSM_CPP_QUEUE_BUF; break; } @@ -3817,6 +4043,8 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, k64_frame_info.frame_id = k32_frame_info.frame_id; kp_ioctl.ioctl_ptr = (void *)&k64_frame_info; + + is_copytouser_req = false; cmd = VIDIOC_MSM_CPP_POP_STREAM_BUFFER; break; } @@ -3836,7 +4064,8 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, default: pr_err_ratelimited("%s: unsupported compat type :%x LOAD %lu\n", __func__, cmd, VIDIOC_MSM_CPP_LOAD_FIRMWARE); - break; + mutex_unlock(&cpp_dev->mutex); + return -EINVAL; } mutex_unlock(&cpp_dev->mutex); @@ -3867,16 +4096,19 @@ static long msm_cpp_subdev_fops_compat_ioctl(struct file *file, default: pr_err_ratelimited("%s: unsupported compat type :%d\n", __func__, cmd); - break; + return -EINVAL; } - up32_ioctl.id = kp_ioctl.id; - up32_ioctl.len = kp_ioctl.len; - up32_ioctl.trans_code = kp_ioctl.trans_code; - up32_ioctl.ioctl_ptr = ptr_to_compat(kp_ioctl.ioctl_ptr); + if (is_copytouser_req) { + up32_ioctl.id = kp_ioctl.id; + up32_ioctl.len = kp_ioctl.len; + up32_ioctl.trans_code = kp_ioctl.trans_code; + up32_ioctl.ioctl_ptr = ptr_to_compat(kp_ioctl.ioctl_ptr); - if (copy_to_user((void __user *)up, &up32_ioctl, sizeof(up32_ioctl))) - return -EFAULT; + if (copy_to_user((void __user *)up, &up32_ioctl, + sizeof(up32_ioctl))) + return -EFAULT; + } return rc; } diff --git a/drivers/media/platform/msm/camera_v2/sensor/Makefile b/drivers/media/platform/msm/camera_v2/sensor/Makefile index 539ba24e109b3..872dc59d218e0 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/Makefile +++ b/drivers/media/platform/msm/camera_v2/sensor/Makefile @@ -4,5 +4,5 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2/msm_vb2 ccflags-y += -Idrivers/media/platform/msm/camera_v2/camera ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/cci -obj-$(CONFIG_MSMB_CAMERA) += cci/ io/ csiphy/ csid/ actuator/ eeprom/ ois/ flash/ +obj-$(CONFIG_MSMB_CAMERA) += cci/ io/ csiphy/ csid/ actuator/ eeprom/ ois/ flash/ ir_led/ ir_cut/ obj-$(CONFIG_MSM_CAMERA_SENSOR) += msm_sensor_init.o msm_sensor_driver.o msm_sensor.o diff --git a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c old mode 100644 new mode 100755 index 0b3e4e1fcf049..f22eea05a38f1 --- a/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c +++ b/drivers/media/platform/msm/camera_v2/sensor/actuator/msm_actuator.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -101,11 +102,6 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl, i2c_tbl = a_ctrl->i2c_reg_tbl; for (i = 0; i < size; i++) { - /* check that the index into i2c_tbl cannot grow larger that - the allocated size of i2c_tbl */ - if ((a_ctrl->total_steps + 1) < (a_ctrl->i2c_tbl_index)) - break; - if (write_arr[i].reg_write_type == MSM_ACTUATOR_WRITE_DAC) { value = (next_lens_position << write_arr[i].data_shift) | @@ -119,6 +115,11 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl, i2c_byte2 = value & 0xFF; CDBG("byte1:0x%x, byte2:0x%x\n", i2c_byte1, i2c_byte2); + if (a_ctrl->i2c_tbl_index > + a_ctrl->total_steps) { + pr_err("failed:i2c table index out of bound\n"); + break; + } i2c_tbl[a_ctrl->i2c_tbl_index]. reg_addr = i2c_byte1; i2c_tbl[a_ctrl->i2c_tbl_index]. @@ -139,6 +140,10 @@ static void msm_actuator_parse_i2c_params(struct msm_actuator_ctrl_t *a_ctrl, i2c_byte2 = (hw_dword & write_arr[i].hw_mask) >> write_arr[i].hw_shift; } + if (a_ctrl->i2c_tbl_index > a_ctrl->total_steps) { + pr_err("failed: i2c table index out of bound\n"); + break; + } CDBG("i2c_byte1:0x%x, i2c_byte2:0x%x\n", i2c_byte1, i2c_byte2); i2c_tbl[a_ctrl->i2c_tbl_index].reg_addr = i2c_byte1; i2c_tbl[a_ctrl->i2c_tbl_index].reg_data = i2c_byte2; @@ -524,6 +529,12 @@ static int32_t msm_actuator_piezo_move_focus( return -EFAULT; } + if (dest_step_position > a_ctrl->total_steps) { + pr_err("Step pos greater than total steps = %d\n", + dest_step_position); + return -EFAULT; + } + a_ctrl->i2c_tbl_index = 0; a_ctrl->func_tbl->actuator_parse_i2c_params(a_ctrl, (num_steps * @@ -563,7 +574,11 @@ static int32_t msm_actuator_move_focus( CDBG("called, dir %d, num_steps %d\n", dir, num_steps); - if (dest_step_pos == a_ctrl->curr_step_pos) + + if ((dest_step_pos == a_ctrl->curr_step_pos) || + ((dest_step_pos <= a_ctrl->total_steps) && + (a_ctrl->step_position_table[dest_step_pos] == + a_ctrl->step_position_table[a_ctrl->curr_step_pos]))) return rc; if ((sign_dir > MSM_ACTUATOR_MOVE_SIGNED_NEAR) || @@ -802,27 +817,37 @@ static int32_t msm_actuator_park_lens(struct msm_actuator_ctrl_t *a_ctrl) next_lens_pos = a_ctrl->step_position_table[a_ctrl->curr_step_pos]; while (next_lens_pos) { /* conditions which help to reduce park lens time */ - if (next_lens_pos > (a_ctrl->park_lens.max_step * - PARK_LENS_LONG_STEP)) { - next_lens_pos = next_lens_pos - - (a_ctrl->park_lens.max_step * - PARK_LENS_LONG_STEP); - } else if (next_lens_pos > (a_ctrl->park_lens.max_step * - PARK_LENS_MID_STEP)) { - next_lens_pos = next_lens_pos - - (a_ctrl->park_lens.max_step * - PARK_LENS_MID_STEP); - } else if (next_lens_pos > (a_ctrl->park_lens.max_step * - PARK_LENS_SMALL_STEP)) { - next_lens_pos = next_lens_pos - - (a_ctrl->park_lens.max_step * - PARK_LENS_SMALL_STEP); - } else { - next_lens_pos = (next_lens_pos > - a_ctrl->park_lens.max_step) ? - (next_lens_pos - a_ctrl->park_lens. - max_step) : 0; - } + #if defined(CONFIG_D1_ROSY) + if (next_lens_pos > 400) { + next_lens_pos = 400; + } else if (next_lens_pos > 25) { + next_lens_pos = next_lens_pos - 25; + } else{ + next_lens_pos = 0; + } + #else + if (next_lens_pos > (a_ctrl->park_lens.max_step * + PARK_LENS_LONG_STEP)) { + next_lens_pos = next_lens_pos - + (a_ctrl->park_lens.max_step * + PARK_LENS_LONG_STEP); + } else if (next_lens_pos > (a_ctrl->park_lens.max_step * + PARK_LENS_MID_STEP)) { + next_lens_pos = next_lens_pos - + (a_ctrl->park_lens.max_step * + PARK_LENS_MID_STEP); + } else if (next_lens_pos > (a_ctrl->park_lens.max_step * + PARK_LENS_SMALL_STEP)) { + next_lens_pos = next_lens_pos - + (a_ctrl->park_lens.max_step * + PARK_LENS_SMALL_STEP); + } else { + next_lens_pos = (next_lens_pos > + a_ctrl->park_lens.max_step) ? + (next_lens_pos - a_ctrl->park_lens. + max_step) : 0; + } + #endif a_ctrl->func_tbl->actuator_parse_i2c_params(a_ctrl, next_lens_pos, a_ctrl->park_lens.hw_params, a_ctrl->park_lens.damping_delay); @@ -841,7 +866,11 @@ static int32_t msm_actuator_park_lens(struct msm_actuator_ctrl_t *a_ctrl) } a_ctrl->i2c_tbl_index = 0; /* Use typical damping time delay to avoid tick sound */ - usleep_range(10000, 12000); + #if defined(CONFIG_D1_ROSY) + usleep_range(13000, 14000); + #else + usleep_range(10000, 12000); + #endif } return 0; @@ -1392,7 +1421,7 @@ static int32_t msm_actuator_config(struct msm_actuator_ctrl_t *a_ctrl, { struct msm_actuator_cfg_data *cdata = (struct msm_actuator_cfg_data *)argp; - int32_t rc = 0; + int32_t rc = -EINVAL; mutex_lock(a_ctrl->actuator_mutex); CDBG("Enter\n"); CDBG("%s type %d\n", __func__, cdata->cfgtype); @@ -1402,7 +1431,7 @@ static int32_t msm_actuator_config(struct msm_actuator_ctrl_t *a_ctrl, a_ctrl->actuator_state == ACT_DISABLE_STATE) { pr_err("actuator disabled %d\n", rc); mutex_unlock(a_ctrl->actuator_mutex); - return -EINVAL; + return rc; } switch (cdata->cfgtype) { @@ -1414,6 +1443,7 @@ static int32_t msm_actuator_config(struct msm_actuator_ctrl_t *a_ctrl, case CFG_GET_ACTUATOR_INFO: cdata->is_af_supported = 1; cdata->cfg.cam_name = a_ctrl->cam_name; + rc = 0; break; case CFG_SET_ACTUATOR_INFO: @@ -1423,15 +1453,19 @@ static int32_t msm_actuator_config(struct msm_actuator_ctrl_t *a_ctrl, break; case CFG_SET_DEFAULT_FOCUS: - rc = a_ctrl->func_tbl->actuator_set_default_focus(a_ctrl, - &cdata->cfg.move); + if (a_ctrl->func_tbl && + a_ctrl->func_tbl->actuator_set_default_focus) + rc = a_ctrl->func_tbl->actuator_set_default_focus( + a_ctrl, &cdata->cfg.move); if (rc < 0) pr_err("move focus failed %d\n", rc); break; case CFG_MOVE_FOCUS: - rc = a_ctrl->func_tbl->actuator_move_focus(a_ctrl, - &cdata->cfg.move); + if (a_ctrl->func_tbl && + a_ctrl->func_tbl->actuator_move_focus) + rc = a_ctrl->func_tbl->actuator_move_focus(a_ctrl, + &cdata->cfg.move); if (rc < 0) pr_err("move focus failed %d\n", rc); break; @@ -1442,8 +1476,10 @@ static int32_t msm_actuator_config(struct msm_actuator_ctrl_t *a_ctrl, break; case CFG_SET_POSITION: - rc = a_ctrl->func_tbl->actuator_set_position(a_ctrl, - &cdata->cfg.setpos); + if (a_ctrl->func_tbl && + a_ctrl->func_tbl->actuator_set_position) + rc = a_ctrl->func_tbl->actuator_set_position(a_ctrl, + &cdata->cfg.setpos); if (rc < 0) pr_err("actuator_set_position failed %d\n", rc); break; @@ -1555,11 +1591,13 @@ static long msm_actuator_subdev_ioctl(struct v4l2_subdev *sd, pr_err("a_ctrl->i2c_client.i2c_func_tbl NULL\n"); return -EINVAL; } + mutex_lock(a_ctrl->actuator_mutex); rc = msm_actuator_power_down(a_ctrl); if (rc < 0) { pr_err("%s:%d Actuator Power down failed\n", __func__, __LINE__); } + mutex_unlock(a_ctrl->actuator_mutex); return msm_actuator_close(sd, NULL); default: return -ENOIOCTLCMD; @@ -1685,6 +1723,10 @@ static long msm_actuator_subdev_do_ioctl( parg = &actuator_data; break; } + break; + case VIDIOC_MSM_ACTUATOR_CFG: + pr_err("%s: invalid cmd 0x%x received\n", __func__, cmd); + return -EINVAL; } rc = msm_actuator_subdev_ioctl(sd, cmd, parg); diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c index df12fa3066ce6..3fce5d8441d47 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c +++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.c @@ -115,15 +115,16 @@ static int32_t msm_cci_set_clk_param(struct cci_device *cci_dev, enum cci_i2c_master_t master = c_ctrl->cci_info->cci_i2c_master; enum i2c_freq_mode_t i2c_freq_mode = c_ctrl->cci_info->i2c_freq_mode; - clk_params = &cci_dev->cci_clk_params[i2c_freq_mode]; - if ((i2c_freq_mode >= I2C_MAX_MODES) || (i2c_freq_mode < 0)) { pr_err("%s:%d invalid i2c_freq_mode = %d", __func__, __LINE__, i2c_freq_mode); return -EINVAL; } + if (cci_dev->i2c_freq_mode[master] == i2c_freq_mode) return 0; + + clk_params = &cci_dev->cci_clk_params[i2c_freq_mode]; if (MASTER_0 == master) { msm_camera_io_w_mb(clk_params->hw_thigh << 16 | clk_params->hw_tlow, @@ -200,6 +201,7 @@ static int32_t msm_cci_validate_queue(struct cci_device *cci_dev, enum cci_i2c_queue_t queue) { int32_t rc = 0; + unsigned long flags; uint32_t read_val = 0; uint32_t reg_offset = master * 0x200 + queue * 0x100; read_val = msm_camera_io_r_mb(cci_dev->base + @@ -222,6 +224,8 @@ static int32_t msm_cci_validate_queue(struct cci_device *cci_dev, CCI_I2C_M0_Q0_EXEC_WORD_CNT_ADDR + reg_offset); reg_val = 1 << ((master * 2) + queue); CDBG("%s:%d CCI_QUEUE_START_ADDR\n", __func__, __LINE__); + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); atomic_set(&cci_dev->cci_master_info[master]. done_pending[queue], 1); msm_camera_io_w_mb(reg_val, cci_dev->base + @@ -229,6 +233,8 @@ static int32_t msm_cci_validate_queue(struct cci_device *cci_dev, CDBG("%s line %d wait_for_completion_timeout\n", __func__, __LINE__); atomic_set(&cci_dev->cci_master_info[master].q_free[queue], 1); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); rc = wait_for_completion_timeout(&cci_dev-> cci_master_info[master].report_q[queue], CCI_TIMEOUT); if (rc <= 0) { @@ -438,10 +444,17 @@ static int32_t msm_cci_wait_report_cmd(struct cci_device *cci_dev, enum cci_i2c_master_t master, enum cci_i2c_queue_t queue) { + unsigned long flags; uint32_t reg_val = 1 << ((master * 2) + queue); msm_cci_load_report_cmd(cci_dev, master, queue); + + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); atomic_set(&cci_dev->cci_master_info[master].q_free[queue], 1); atomic_set(&cci_dev->cci_master_info[master].done_pending[queue], 1); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); + msm_camera_io_w_mb(reg_val, cci_dev->base + CCI_QUEUE_START_ADDR); return msm_cci_wait(cci_dev, master, queue); @@ -451,12 +464,21 @@ static void msm_cci_process_half_q(struct cci_device *cci_dev, enum cci_i2c_master_t master, enum cci_i2c_queue_t queue) { + unsigned long flags; uint32_t reg_val = 1 << ((master * 2) + queue); + + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); if (0 == atomic_read(&cci_dev->cci_master_info[master].q_free[queue])) { msm_cci_load_report_cmd(cci_dev, master, queue); atomic_set(&cci_dev->cci_master_info[master].q_free[queue], 1); msm_camera_io_w_mb(reg_val, cci_dev->base + CCI_QUEUE_START_ADDR); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); + } else { + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); } } @@ -465,15 +487,23 @@ static int32_t msm_cci_process_full_q(struct cci_device *cci_dev, enum cci_i2c_queue_t queue) { int32_t rc = 0; + unsigned long flags; + + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); if (1 == atomic_read(&cci_dev->cci_master_info[master].q_free[queue])) { atomic_set(&cci_dev->cci_master_info[master]. done_pending[queue], 1); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); rc = msm_cci_wait(cci_dev, master, queue); if (rc < 0) { pr_err("%s: %d failed rc %d\n", __func__, __LINE__, rc); return rc; } } else { + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); rc = msm_cci_wait_report_cmd(cci_dev, master, queue); if (rc < 0) { pr_err("%s: %d failed rc %d\n", __func__, __LINE__, rc); @@ -501,8 +531,13 @@ static int32_t msm_cci_transfer_end(struct cci_device *cci_dev, enum cci_i2c_queue_t queue) { int32_t rc = 0; + unsigned long flags; + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); if (0 == atomic_read(&cci_dev->cci_master_info[master].q_free[queue])) { + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); rc = msm_cci_lock_queue(cci_dev, master, queue, 0); if (rc < 0) { pr_err("%s failed line %d\n", __func__, __LINE__); @@ -516,6 +551,8 @@ static int32_t msm_cci_transfer_end(struct cci_device *cci_dev, } else { atomic_set(&cci_dev->cci_master_info[master]. done_pending[queue], 1); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); rc = msm_cci_wait(cci_dev, master, queue); if (rc < 0) { pr_err("%s: %d failed rc %d\n", __func__, __LINE__, rc); @@ -570,6 +607,7 @@ static int32_t msm_cci_data_queue(struct cci_device *cci_dev, uint32_t reg_offset; uint32_t val = 0; uint32_t max_queue_size, queue_size = 0; + unsigned long flags; if (i2c_cmd == NULL) { pr_err("%s:%d Failed line\n", __func__, @@ -613,7 +651,11 @@ static int32_t msm_cci_data_queue(struct cci_device *cci_dev, msm_camera_io_w_mb(val, cci_dev->base + CCI_I2C_M0_Q0_LOAD_DATA_ADDR + reg_offset); + spin_lock_irqsave(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); atomic_set(&cci_dev->cci_master_info[master].q_free[queue], 0); + spin_unlock_irqrestore(&cci_dev->cci_master_info[master]. + lock_q[queue], flags); max_queue_size = cci_dev->cci_i2c_queue_info[master][queue]. max_queue_size; @@ -781,10 +823,18 @@ static int32_t msm_cci_i2c_read(struct v4l2_subdev *sd, enum cci_i2c_queue_t queue = QUEUE_1; struct cci_device *cci_dev = NULL; struct msm_camera_cci_i2c_read_cfg *read_cfg = NULL; + CDBG("%s line %d\n", __func__, __LINE__); cci_dev = v4l2_get_subdevdata(sd); master = c_ctrl->cci_info->cci_i2c_master; read_cfg = &c_ctrl->cfg.cci_i2c_read_cfg; + + if (master >= MASTER_MAX || master < 0) { + pr_err("%s:%d Invalid I2C master %d\n", + __func__, __LINE__, master); + return -EINVAL; + } + mutex_lock(&cci_dev->cci_master_info[master].mutex_q[queue]); /* Set the I2C Frequency */ @@ -1009,11 +1059,6 @@ static int32_t msm_cci_i2c_write(struct v4l2_subdev *sd, enum cci_i2c_master_t master; cci_dev = v4l2_get_subdevdata(sd); - if (c_ctrl->cci_info->cci_i2c_master >= MASTER_MAX - || c_ctrl->cci_info->cci_i2c_master < 0) { - pr_err("%s:%d Invalid I2C master addr\n", __func__, __LINE__); - return -EINVAL; - } if (cci_dev->cci_state != CCI_STATE_ENABLED) { pr_err("%s invalid cci state %d\n", __func__, cci_dev->cci_state); @@ -1201,6 +1246,13 @@ static uint32_t *msm_cci_get_clk_rates(struct cci_device *cci_dev, struct msm_cci_clk_params_t *clk_params = NULL; enum i2c_freq_mode_t i2c_freq_mode = c_ctrl->cci_info->i2c_freq_mode; struct device_node *of_node = cci_dev->pdev->dev.of_node; + + if ((i2c_freq_mode >= I2C_MAX_MODES) || (i2c_freq_mode < 0)) { + pr_err("%s:%d invalid i2c_freq_mode %d\n", + __func__, __LINE__, i2c_freq_mode); + return NULL; + } + clk_params = &cci_dev->cci_clk_params[i2c_freq_mode]; cci_clk_src = clk_params->cci_clk_src; @@ -1361,10 +1413,15 @@ static int32_t msm_cci_init(struct v4l2_subdev *sd, } /* Re-initialize the completion */ - reinit_completion(&cci_dev->cci_master_info[master].reset_complete); + reinit_completion(&cci_dev->cci_master_info[MASTER_0].reset_complete); + for (i = 0; i < NUM_QUEUES; i++) + reinit_completion(&cci_dev->cci_master_info[MASTER_0]. + report_q[i]); + reinit_completion(&cci_dev->cci_master_info[MASTER_1].reset_complete); for (i = 0; i < NUM_QUEUES; i++) - reinit_completion(&cci_dev->cci_master_info[master]. + reinit_completion(&cci_dev->cci_master_info[MASTER_1]. report_q[i]); + rc = msm_camera_enable_irq(cci_dev->irq, true); if (rc < 0) pr_err("%s: irq enable failed\n", __func__); @@ -1544,6 +1601,11 @@ static int32_t msm_cci_write(struct v4l2_subdev *sd, return rc; } + if (c_ctrl->cci_info->cci_i2c_master >= MASTER_MAX + || c_ctrl->cci_info->cci_i2c_master < 0) { + pr_err("%s:%d Invalid I2C master addr\n", __func__, __LINE__); + return -EINVAL; + } master = c_ctrl->cci_info->cci_i2c_master; cci_master_info = &cci_dev->cci_master_info[master]; @@ -1623,6 +1685,7 @@ static int32_t msm_cci_config(struct v4l2_subdev *sd, static irqreturn_t msm_cci_irq(int irq_num, void *data) { uint32_t irq; + unsigned long flags; struct cci_device *cci_dev = data; irq = msm_camera_io_r_mb(cci_dev->base + CCI_IRQ_STATUS_0_ADDR); msm_camera_io_w_mb(irq, cci_dev->base + CCI_IRQ_CLEAR_0_ADDR); @@ -1649,22 +1712,30 @@ static irqreturn_t msm_cci_irq(int irq_num, void *data) if (irq & CCI_IRQ_STATUS_0_I2C_M0_Q0_REPORT_BMSK) { struct msm_camera_cci_master_info *cci_master_info; cci_master_info = &cci_dev->cci_master_info[MASTER_0]; + spin_lock_irqsave(&cci_dev->cci_master_info[MASTER_0]. + lock_q[QUEUE_0], flags); atomic_set(&cci_master_info->q_free[QUEUE_0], 0); cci_master_info->status = 0; if (atomic_read(&cci_master_info->done_pending[QUEUE_0]) == 1) { complete(&cci_master_info->report_q[QUEUE_0]); atomic_set(&cci_master_info->done_pending[QUEUE_0], 0); } + spin_unlock_irqrestore(&cci_dev->cci_master_info[MASTER_0]. + lock_q[QUEUE_0], flags); } if (irq & CCI_IRQ_STATUS_0_I2C_M0_Q1_REPORT_BMSK) { struct msm_camera_cci_master_info *cci_master_info; cci_master_info = &cci_dev->cci_master_info[MASTER_0]; + spin_lock_irqsave(&cci_dev->cci_master_info[MASTER_0]. + lock_q[QUEUE_1], flags); atomic_set(&cci_master_info->q_free[QUEUE_1], 0); cci_master_info->status = 0; if (atomic_read(&cci_master_info->done_pending[QUEUE_1]) == 1) { complete(&cci_master_info->report_q[QUEUE_1]); atomic_set(&cci_master_info->done_pending[QUEUE_1], 0); } + spin_unlock_irqrestore(&cci_dev->cci_master_info[MASTER_0]. + lock_q[QUEUE_1], flags); } if (irq & CCI_IRQ_STATUS_0_I2C_M1_RD_DONE_BMSK) { cci_dev->cci_master_info[MASTER_1].status = 0; @@ -1673,22 +1744,30 @@ static irqreturn_t msm_cci_irq(int irq_num, void *data) if (irq & CCI_IRQ_STATUS_0_I2C_M1_Q0_REPORT_BMSK) { struct msm_camera_cci_master_info *cci_master_info; cci_master_info = &cci_dev->cci_master_info[MASTER_1]; + spin_lock_irqsave(&cci_dev->cci_master_info[MASTER_1]. + lock_q[QUEUE_0], flags); atomic_set(&cci_master_info->q_free[QUEUE_0], 0); cci_master_info->status = 0; if (atomic_read(&cci_master_info->done_pending[QUEUE_0]) == 1) { complete(&cci_master_info->report_q[QUEUE_0]); atomic_set(&cci_master_info->done_pending[QUEUE_0], 0); } + spin_unlock_irqrestore(&cci_dev->cci_master_info[MASTER_1]. + lock_q[QUEUE_0], flags); } if (irq & CCI_IRQ_STATUS_0_I2C_M1_Q1_REPORT_BMSK) { struct msm_camera_cci_master_info *cci_master_info; cci_master_info = &cci_dev->cci_master_info[MASTER_1]; + spin_lock_irqsave(&cci_dev->cci_master_info[MASTER_1]. + lock_q[QUEUE_1], flags); atomic_set(&cci_master_info->q_free[QUEUE_1], 0); cci_master_info->status = 0; if (atomic_read(&cci_master_info->done_pending[QUEUE_1]) == 1) { complete(&cci_master_info->report_q[QUEUE_1]); atomic_set(&cci_master_info->done_pending[QUEUE_1], 0); } + spin_unlock_irqrestore(&cci_dev->cci_master_info[MASTER_1]. + lock_q[QUEUE_1], flags); } if (irq & CCI_IRQ_STATUS_0_I2C_M0_Q0Q1_HALT_ACK_BMSK) { cci_dev->cci_master_info[MASTER_0].reset_pending = TRUE; @@ -1777,7 +1856,9 @@ static void msm_cci_init_cci_params(struct cci_device *new_cci_dev) mutex_init(&new_cci_dev->cci_master_info[i].mutex_q[j]); init_completion(&new_cci_dev-> cci_master_info[i].report_q[j]); - } + spin_lock_init(&new_cci_dev-> + cci_master_info[i].lock_q[j]); + } } return; } diff --git a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h index 6e39d814bd731..eb615cc7a62c1 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h +++ b/drivers/media/platform/msm/camera_v2/sensor/cci/msm_cci.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -125,6 +125,7 @@ struct msm_camera_cci_master_info { struct mutex mutex_q[NUM_QUEUES]; struct completion report_q[NUM_QUEUES]; atomic_t done_pending[NUM_QUEUES]; + spinlock_t lock_q[NUM_QUEUES]; }; struct msm_cci_clk_params_t { diff --git a/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c b/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c index 1c30b105ef98d..bcac5592c193f 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c +++ b/drivers/media/platform/msm/camera_v2/sensor/csid/msm_csid.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -61,6 +61,7 @@ #define TRUE 1 #define FALSE 0 +#define MAX_LANE_COUNT 4 #define CSID_TIMEOUT msecs_to_jiffies(100) #undef CDBG @@ -287,6 +288,12 @@ static int msm_csid_config(struct csid_device *csid_dev, csid_params->lane_assign); CDBG("%s csid_params phy_sel = %d\n", __func__, csid_params->phy_sel); + if ((csid_params->lane_cnt == 0) || + (csid_params->lane_cnt > MAX_LANE_COUNT)) { + pr_err("%s:%d invalid lane count = %d\n", + __func__, __LINE__, csid_params->lane_cnt); + return -EINVAL; + } csid_dev->csid_lane_cnt = csid_params->lane_cnt; rc = msm_csid_reset(csid_dev); diff --git a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c index 03ecc26fc4815..d1bb9af3d8da2 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c +++ b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -295,6 +295,11 @@ static int msm_csiphy_2phase_lane_config( csiphybase = csiphy_dev->base; lane_mask = csiphy_params->lane_mask & 0x1f; + + lane_enable = msm_camera_io_r(csiphybase + + csiphy_dev->ctrl_reg->csiphy_3ph_reg. + mipi_csiphy_3ph_cmn_ctrl5.addr); + for (i = 0; i < MAX_LANES; i++) { if (mask == 0x2) { if (lane_mask & mask) @@ -332,7 +337,11 @@ static int msm_csiphy_2phase_lane_config( clk_lane = 0; } - if (csiphy_params->combo_mode == 1) { + /* In combo mode setting the 4th lane + * as clk_lane for 1 lane sensor, checking + * the lane_mask == 0x18 for one lane sensor + */ + if ((csiphy_params->combo_mode == 1) && (lane_mask == 0x18)) { val |= 0xA; if (mask == csiphy_dev->ctrl_reg-> csiphy_reg.combo_clk_mask) { @@ -378,6 +387,12 @@ static int msm_csiphy_2phase_lane_config( mipi_csiphy_2ph_lnn_cfg4.data, csiphybase + csiphy_dev->ctrl_reg->csiphy_3ph_reg. mipi_csiphy_2ph_lnn_cfg4.addr + offset); + if (lane_mask == 0x18) + msm_camera_io_w(0x80, + csiphybase + + csiphy_dev->ctrl_reg->csiphy_3ph_reg. + mipi_csiphy_2ph_lnn_cfg1.addr + offset); + } else { msm_camera_io_w(csiphy_dev->ctrl_reg->csiphy_3ph_reg. mipi_csiphy_2ph_lnn_cfg1.data, @@ -399,7 +414,7 @@ static int msm_csiphy_2phase_lane_config( csiphy_dev->ctrl_reg->csiphy_3ph_reg. mipi_csiphy_2ph_lnn_cfg5.addr + offset); } - if (clk_lane == 1 && + if (clk_lane == 1 && lane_mask != 0x18 && (csiphy_dev->hw_version == CSIPHY_VERSION_V342 || csiphy_dev->hw_version == CSIPHY_VERSION_V342_1)) { msm_camera_io_w(0x1f, @@ -742,17 +757,17 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) } CDBG("%s:%d called\n", __func__, __LINE__); - if (csiphy_dev->csiphy_state == CSIPHY_POWER_UP) { - pr_err("%s: csiphy invalid state %d\n", __func__, - csiphy_dev->csiphy_state); - rc = -EINVAL; + if (csiphy_dev->ref_count++) { + CDBG("%s csiphy refcount = %d\n", __func__, + csiphy_dev->ref_count); return rc; } CDBG("%s:%d called\n", __func__, __LINE__); - if (csiphy_dev->ref_count++) { - CDBG("%s csiphy refcount = %d\n", __func__, - csiphy_dev->ref_count); + if (csiphy_dev->csiphy_state == CSIPHY_POWER_UP) { + pr_err("%s: csiphy invalid state %d\n", __func__, + csiphy_dev->csiphy_state); + rc = -EINVAL; return rc; } CDBG("%s:%d called\n", __func__, __LINE__); @@ -767,6 +782,25 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) CDBG("%s:%d called\n", __func__, __LINE__); + rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy config_vreg failed\n", + __func__, __LINE__); + goto csiphy_vreg_config_fail; + } + rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy enable_vreg failed\n", + __func__, __LINE__); + goto top_vreg_enable_failed; + } + rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev, csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk, csiphy_dev->num_clk, true); @@ -775,7 +809,7 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) if (rc < 0) { pr_err("%s: csiphy clk enable failed\n", __func__); csiphy_dev->ref_count--; - goto csiphy_resource_fail; + goto csiphy_enable_clk_fail; } CDBG("%s:%d called\n", __func__, __LINE__); @@ -803,7 +837,17 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) csiphy_dev->csiphy_state = CSIPHY_POWER_UP; return 0; -csiphy_resource_fail: +csiphy_enable_clk_fail: + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +top_vreg_enable_failed: + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +csiphy_vreg_config_fail: if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, CAM_AHB_SUSPEND_VOTE) < 0) pr_err("%s: failed to vote for AHB\n", __func__); @@ -820,6 +864,12 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) } csiphy_dev->csiphy_sof_debug_count = 0; CDBG("%s:%d called\n", __func__, __LINE__); + if (csiphy_dev->ref_count++) { + CDBG("%s csiphy refcount = %d\n", __func__, + csiphy_dev->ref_count); + return rc; + } + CDBG("%s:%d called\n", __func__, __LINE__); if (csiphy_dev->csiphy_state == CSIPHY_POWER_UP) { pr_err("%s: csiphy invalid state %d\n", __func__, csiphy_dev->csiphy_state); @@ -828,12 +878,6 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) } CDBG("%s:%d called\n", __func__, __LINE__); - if (csiphy_dev->ref_count++) { - CDBG("%s csiphy refcount = %d\n", __func__, - csiphy_dev->ref_count); - return rc; - } - CDBG("%s:%d called\n", __func__, __LINE__); rc = cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, CAM_AHB_SVS_VOTE); if (rc < 0) { @@ -841,6 +885,24 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) pr_err("%s: failed to vote for AHB\n", __func__); return rc; } + rc = msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy config_vreg failed\n", + __func__, __LINE__); + goto csiphy_vreg_config_fail; + } + rc = msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 1); + if (rc < 0) { + pr_err("%s:%d csiphy enable_vreg failed\n", + __func__, __LINE__); + goto top_vreg_enable_failed; + } rc = msm_camera_clk_enable(&csiphy_dev->pdev->dev, csiphy_dev->csiphy_clk_info, csiphy_dev->csiphy_clk, @@ -850,9 +912,9 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) if (rc < 0) { pr_err("%s: csiphy clk enable failed\n", __func__); csiphy_dev->ref_count--; - goto csiphy_resource_fail; + goto csiphy_enable_clk_fail; } - CDBG("%s:%d called\n", __func__, __LINE__); + CDBG("%s:%d clk enable success\n", __func__, __LINE__); if (csiphy_dev->csiphy_3phase == CSI_3PHASE_HW) msm_csiphy_3ph_reset(csiphy_dev); @@ -875,7 +937,17 @@ static int msm_csiphy_init(struct csiphy_device *csiphy_dev) csiphy_dev->csiphy_state = CSIPHY_POWER_UP; return 0; -csiphy_resource_fail: +csiphy_enable_clk_fail: + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +top_vreg_enable_failed: + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); +csiphy_vreg_config_fail: if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, CAM_AHB_SUSPEND_VOTE) < 0) pr_err("%s: failed to vote for AHB\n", __func__); @@ -983,6 +1055,14 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg) csiphy_dev->csiphy_3p_clk, 2, false); } + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, + csiphy_dev->regulator_count, NULL, 0, + &csiphy_dev->csiphy_reg_ptr[0], 0); + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count, + NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0); + csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN; if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, @@ -1089,6 +1169,13 @@ static int msm_csiphy_release(struct csiphy_device *csiphy_dev, void *arg) csiphy_dev->csiphy_3p_clk, 2, false); } + msm_camera_enable_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count, + NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0); + msm_camera_config_vreg(&csiphy_dev->pdev->dev, + csiphy_dev->csiphy_vreg, csiphy_dev->regulator_count, + NULL, 0, &csiphy_dev->csiphy_reg_ptr[0], 0); + csiphy_dev->csiphy_state = CSIPHY_POWER_DOWN; if (cam_config_ahb_clk(NULL, 0, CAM_AHB_CLIENT_CSIPHY, @@ -1404,6 +1491,14 @@ static int csiphy_probe(struct platform_device *pdev) goto csiphy_no_resource; } + rc = msm_camera_get_dt_vreg_data(pdev->dev.of_node, + &(new_csiphy_dev->csiphy_vreg), + &(new_csiphy_dev->regulator_count)); + if (rc < 0) { + pr_err("%s: get vreg data from dtsi fail\n", __func__); + rc = -EFAULT; + goto csiphy_no_resource; + } /* ToDo: Enable 3phase clock for dynamic clock enable/disable */ rc = msm_csiphy_get_clk_info(new_csiphy_dev, pdev); if (rc < 0) { @@ -1478,7 +1573,7 @@ static int msm_csiphy_exit(struct platform_device *pdev) &csiphy_dev->csiphy_all_clk, csiphy_dev->num_all_clk); - msm_camera_put_reg_base(pdev, csiphy_dev->base, "csid", true); + msm_camera_put_reg_base(pdev, csiphy_dev->base, "csiphy", true); if (csiphy_dev->hw_dts_version >= CSIPHY_VERSION_V30) { msm_camera_put_reg_base(pdev, csiphy_dev->clk_mux_base, "csiphy_clk_mux", true); diff --git a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h index 4b3c40772517a..07a08110885b4 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h +++ b/drivers/media/platform/msm/camera_v2/sensor/csiphy/msm_csiphy.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -20,6 +20,7 @@ #include #include "msm_sd.h" #include "msm_camera_io_util.h" +#include "msm_camera_dt_util.h" #include "cam_soc_api.h" #define MAX_CSIPHY 3 @@ -168,6 +169,9 @@ struct csiphy_device { uint8_t num_irq_registers; uint32_t csiphy_sof_debug; uint32_t csiphy_sof_debug_count; + struct camera_vreg_t *csiphy_vreg; + struct regulator *csiphy_reg_ptr[MAX_REGULATOR]; + int32_t regulator_count; }; #define VIDIOC_MSM_CSIPHY_RELEASE \ diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/Makefile b/drivers/media/platform/msm/camera_v2/sensor/eeprom/Makefile index ba78a650b4ba8..eee3727adcfc9 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/Makefile +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/Makefile @@ -3,3 +3,4 @@ ccflags-y += -Idrivers/media/platform/msm/camera_v2/common ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/cci obj-$(CONFIG_MSM_EEPROM) += msm_eeprom.o +obj-y += msm_eeprom_insensor_ov13850.o diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c index 1f891ac76c965..85e2b8f939302 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.c @@ -1,4 +1,5 @@ /* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -17,9 +18,16 @@ #include "msm_sd.h" #include "msm_cci.h" #include "msm_eeprom.h" +#if defined(CONFIG_D1_ROSY) +#include "msm_eeprom_otp_interface.h" +#endif #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) +char fusionid_back_d1[64] = { 0 }; +char fusionid_front_d1[64] = { 0 }; +extern char fusionid_front[]; +extern char fusionid_back[]; DEFINE_MSM_MUTEX(msm_eeprom_mutex); #ifdef CONFIG_COMPAT @@ -617,6 +625,7 @@ static int msm_eeprom_config(struct msm_eeprom_ctrl_t *e_ctrl, struct msm_eeprom_cfg_data *cdata = (struct msm_eeprom_cfg_data *)argp; int rc = 0; + size_t length = 0; CDBG("%s E\n", __func__); switch (cdata->cfgtype) { @@ -629,9 +638,15 @@ static int msm_eeprom_config(struct msm_eeprom_ctrl_t *e_ctrl, } CDBG("%s E CFG_EEPROM_GET_INFO\n", __func__); cdata->is_supported = e_ctrl->is_supported; + length = strlen(e_ctrl->eboard_info->eeprom_name) + 1; + if (length > MAX_EEPROM_NAME) { + pr_err("%s:%d invalid eeprom_name length %d\n", + __func__, __LINE__, (int)length); + rc = -EINVAL; + break; + } memcpy(cdata->cfg.eeprom_name, - e_ctrl->eboard_info->eeprom_name, - sizeof(cdata->cfg.eeprom_name)); + e_ctrl->eboard_info->eeprom_name, length); break; case CFG_EEPROM_GET_CAL_DATA: CDBG("%s E CFG_EEPROM_GET_CAL_DATA\n", __func__); @@ -1402,6 +1417,16 @@ static int eeprom_init_config32(struct msm_eeprom_ctrl_t *e_ctrl, power_info = &(e_ctrl->eboard_info->power_info); + if ((power_setting_array32->size > MAX_POWER_CONFIG) || + (power_setting_array32->size_down > MAX_POWER_CONFIG) || + (!power_setting_array32->size) || + (!power_setting_array32->size_down)) { + pr_err("%s:%d invalid power setting size=%d size_down=%d\n", + __func__, __LINE__, power_setting_array32->size, + power_setting_array32->size_down); + rc = -EINVAL; + goto free_mem; + } msm_eeprom_copy_power_settings_compat( power_setting_array, power_setting_array32); @@ -1416,20 +1441,6 @@ static int eeprom_init_config32(struct msm_eeprom_ctrl_t *e_ctrl, power_info->power_down_setting_size = power_setting_array->size_down; - if ((power_info->power_setting_size > - MAX_POWER_CONFIG) || - (power_info->power_down_setting_size > - MAX_POWER_CONFIG) || - (!power_info->power_down_setting_size) || - (!power_info->power_setting_size)) { - rc = -EINVAL; - pr_err("%s:%d Invalid power setting size :%d, %d\n", - __func__, __LINE__, - power_info->power_setting_size, - power_info->power_down_setting_size); - goto free_mem; - } - if (e_ctrl->i2c_client.cci_client) { e_ctrl->i2c_client.cci_client->i2c_freq_mode = cdata32->cfg.eeprom_info.i2c_freq_mode; @@ -1479,6 +1490,7 @@ static int msm_eeprom_config32(struct msm_eeprom_ctrl_t *e_ctrl, struct msm_eeprom_cfg_data32 *cdata = (struct msm_eeprom_cfg_data32 *)argp; int rc = 0; + size_t length = 0; CDBG("%s E\n", __func__); switch (cdata->cfgtype) { @@ -1491,9 +1503,15 @@ static int msm_eeprom_config32(struct msm_eeprom_ctrl_t *e_ctrl, } CDBG("%s E CFG_EEPROM_GET_INFO\n", __func__); cdata->is_supported = e_ctrl->is_supported; + length = strlen(e_ctrl->eboard_info->eeprom_name) + 1; + if (length > MAX_EEPROM_NAME) { + pr_err("%s:%d invalid eeprom_name length %d\n", + __func__, __LINE__, (int)length); + rc = -EINVAL; + break; + } memcpy(cdata->cfg.eeprom_name, - e_ctrl->eboard_info->eeprom_name, - sizeof(cdata->cfg.eeprom_name)); + e_ctrl->eboard_info->eeprom_name, length); break; case CFG_EEPROM_GET_CAL_DATA: CDBG("%s E CFG_EEPROM_GET_CAL_DATA\n", __func__); @@ -1505,12 +1523,6 @@ static int msm_eeprom_config32(struct msm_eeprom_ctrl_t *e_ctrl, rc = eeprom_config_read_cal_data32(e_ctrl, argp); break; case CFG_EEPROM_INIT: - if (e_ctrl->userspace_probe == 0) { - pr_err("%s:%d Eeprom already probed at kernel boot", - __func__, __LINE__); - rc = -EINVAL; - break; - } if (e_ctrl->cal_data.num_data == 0) { rc = eeprom_init_config32(e_ctrl, argp); if (rc < 0) @@ -1566,6 +1578,35 @@ static long msm_eeprom_subdev_fops_ioctl32(struct file *file, unsigned int cmd, #endif +static uint16_t fusion_read_id_D1_back(uint8_t *data) +{ + uint16_t i; + uint8_t *fusion_id = data; + memset(fusionid_back_d1, 0, sizeof(fusionid_back_d1)); + for (i = 0; i < 16; i++) { + sprintf(fusionid_back_d1 + strlen(fusionid_back_d1), "%u", fusion_id[i]); + } + CDBG("fusionid_back: %s\n", fusionid_back_d1); + return 0; +} + +static uint16_t fusion_read_id_D1_front(uint8_t *data) +{ + uint16_t i; + uint8_t *fusion_id = data; + memset(fusionid_front_d1, 0, sizeof(fusionid_front_d1)); + for (i = 0; i < 16; i++) { + sprintf(fusionid_front_d1 + strlen(fusionid_front_d1), "%u", fusion_id[i]); + } + CDBG("fusionid_front: %s\n", fusionid_front_d1); + return 0; +} + + +static int module_id = -1; +int main_module_id = -1; +int sub_module_id = -1; + static int msm_eeprom_platform_probe(struct platform_device *pdev) { int rc = 0; @@ -1659,6 +1700,8 @@ static int msm_eeprom_platform_probe(struct platform_device *pdev) &eb_info->eeprom_name); CDBG("%s qcom,eeprom-name %s, rc %d\n", __func__, eb_info->eeprom_name, rc); + printk("%s qcom,eeprom-name %s, rc %d\n", __func__, + eb_info->eeprom_name, rc); if (rc < 0) { pr_err("%s failed %d\n", __func__, __LINE__); e_ctrl->userspace_probe = 1; @@ -1706,6 +1749,57 @@ static int msm_eeprom_platform_probe(struct platform_device *pdev) pr_err("failed rc %d\n", rc); goto memdata_free; } + + + if (!strcmp(eb_info->eeprom_name, "ov13850")) { + eeprom_init_ov13850_reg_otp(e_ctrl); + } + + +#if defined(CONFIG_D1_ROSY) + /* 1. init insensor otp */ + if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_i")) { + printk("insensor eeprom todo init the otp register!\n"); + eeprom_init_ov5675_reg_otp(e_ctrl, 0x20); + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_ii")) { + printk("insensor eeprom todo init the otp register!\n"); + eeprom_init_ov5675_reg_otp(e_ctrl, 0x6c); + } else { + printk("the eeprom is not insensor!\n"); + } + + if (!strcmp(eb_info->eeprom_name, "ovt_ov12a10_i")) { + module_id = sensor_eeprom_match_crc_id(e_ctrl, 0x00); + pr_err("eeprom %s read module id %d", eb_info->eeprom_name, module_id); + if (7 != module_id) { + pr_err("%s match id for ovt_ov12a10_i failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "sony_imx486_ii")) { + module_id = sensor_eeprom_match_crc_id(e_ctrl, 0x00); + pr_err("eeprom %s read module id %d\n", eb_info->eeprom_name, module_id); + if (1 != module_id) { + pr_err("%s match id for sony_imx486_ii failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_i")) { + module_id = sensor_eeprom_match_crc_id(e_ctrl, 0x7010); + pr_err("eeprom %s read module id %d\n", eb_info->eeprom_name, module_id); + if (6 != module_id) { + pr_err("%s match id for ovt_ov5675_i failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_ii")) { + module_id = sensor_eeprom_match_crc_id(e_ctrl, 0x7010); + pr_err("eeprom %s read module id %d\n", eb_info->eeprom_name, module_id); + if (7 != module_id) { + pr_err("%s match id for ovt_ov5675_ii failed\n", __func__); + goto power_down; + } + } +#endif + + rc = read_eeprom_memory(e_ctrl, &e_ctrl->cal_data); if (rc < 0) { pr_err("%s read_eeprom_memory failed\n", __func__); @@ -1715,6 +1809,314 @@ static int msm_eeprom_platform_probe(struct platform_device *pdev) CDBG("memory_data[%d] = 0x%X\n", j, e_ctrl->cal_data.mapdata[j]); + if (!strcmp(eb_info->eeprom_name, "s5k3l8_ofilm")) { + CDBG("match id for s5k3l8_ofilm\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for s5k3l8_ofilm module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for s5k3l8_ofilm success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for s5k3l8_ofilm failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k3l8_ofilm_riva")) { + CDBG("match id for s5k3l8_ofilm_riva\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for s5k3l8_ofilm_riva module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for s5k3l8_ofilm_riva success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for s5k3l8_ofilm_riva failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k3l8_sunny")) { + CDBG("match id for s5k3l8_sunny\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for s5k3l8_sunny module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for s5k3l8_sunny success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for s5k3l8_sunny failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ov13855_qtech")) { + CDBG("match id for ov13855_qtech\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for ov13855_qtech module_id=%d\n", module_id); + if (module_id == 11) { + CDBG("match id for ov13855_qtech success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for ov13855_qtech failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ov13855_sunny")) { + CDBG("match id for ov13855_sunny\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for ov13855_sunny module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for ov13855_sunny success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for ov13855_sunny failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ov13850")) { + + printk("match id for ov13850 AWB:[mapdata[8]:0x%x, mapdata[9]:0x%x; mapdata[0]:0x%x, mapdata[1]:0x%x] AF:[mapdata[16]:0x%x mapdata[24]:0x%x] LSC:[mapdata[32]:0x%x mapdata[221]:0x%x]\n", + e_ctrl->cal_data.mapdata[8], e_ctrl->cal_data.mapdata[9]&0x1f, e_ctrl->cal_data.mapdata[0], e_ctrl->cal_data.mapdata[1]&0x1f, + e_ctrl->cal_data.mapdata[16], e_ctrl->cal_data.mapdata[24], e_ctrl->cal_data.mapdata[32], e_ctrl->cal_data.mapdata[221]); + if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for ov13850 module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for ov13850 success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for ov13850 failed\n", __func__); + goto power_down; + } + ov13850_eeprom_sensor_writereg(e_ctrl, 0x0100, 0x00, 1); + + } else if (!strcmp(eb_info->eeprom_name, "s5k3l2")) { + CDBG("match id for s5k3l2\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for s5k3l2 module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for s5k3l2 success\n"); + main_module_id = module_id; + } else { + pr_err("%s match id for s5k3l2 failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ov5675_ofilm")) { + CDBG("match id for ov5675_ofilm\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for ov5675_ofilm module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for ov5670_ofilm success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for ov5670_ofilm failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_i")) { + CDBG("match id for ovt_ov5675_i\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + + } else if (e_ctrl->cal_data.mapdata[80] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[81] & 0x1f; + + } else { + module_id = -1; + } + printk("match id for ovt_ov5675_i module_id=%d\n", module_id); + if (module_id == 6) { + CDBG("match id for ovt_ov5675_i success\n"); + sub_module_id = module_id; + fusion_read_id_D1_front(&e_ctrl->cal_data.mapdata[16]); + strcpy(fusionid_front, fusionid_front_d1 + strlen(fusionid_front_d1)); + } else { + pr_err("%s match id for ovt_ov5675_i failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov5675_ii")) { + CDBG("match id for ovt_ov5675_ii\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + + } else if (e_ctrl->cal_data.mapdata[80] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[81] & 0x1f; + + } else { + module_id = -1; + } + printk("match id for ovt_ov5675_ii module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for ovt_ov5675_ii success\n"); + sub_module_id = module_id; + fusion_read_id_D1_front(&e_ctrl->cal_data.mapdata[16]); + strcpy(fusionid_front, fusionid_front_d1 + strlen(fusionid_front_d1)); + } else { + pr_err("%s match id for ovt_ov5675_ii failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k5e8_sunny")) { + CDBG("match id for s5k5e8_sunny\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for s5k5e8_sunny module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for s5k5e8_sunny success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for s5k5e8_sunny failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k5e8_ofilm_riva")) { + CDBG("match id for s5k5e8_ofilm_riva\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for s5k5e8_ofilm_riva module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for s5k5e8_ofilm_riva success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for s5k5e8_ofilm_riva failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ov5675")) { + CDBG("match id for ov5675\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for ov5675 module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for ov5675 success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for ov5670 failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k5e8_qtech_riva")) { + CDBG("match id for s5k5e8_qtech_riva\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for s5k5e8_qtech_riva module_id=%d\n", module_id); + if (module_id == 11) { + CDBG("match id for s5k5e8_qtech_riva success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for s5k5e8_qtech_riva failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "s5k5e8_ofilm")) { + CDBG("match id for s5k5e8_ofilm\n"); + if (e_ctrl->cal_data.mapdata[16] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[17] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[8] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[9] & 0x1f; + } else if (e_ctrl->cal_data.mapdata[0] == 0x55) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else { + module_id = -1; + } + printk("match id for s5k5e8_ofilm module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for s5k5e8_ofilm success\n"); + sub_module_id = module_id; + } else { + pr_err("%s match id for s5k5e8_ofilm failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "ovt_ov12a10_i")) { + CDBG("match id for ovt_ov12a10_i\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for ovt_ov12a10_i module_id=%d\n", module_id); + if (module_id == 7) { + CDBG("match id for ovt_ov12a10_i success\n"); + main_module_id = module_id; + fusion_read_id_D1_back(&e_ctrl->cal_data.mapdata[16]); + strcpy(fusionid_back, fusionid_back_d1 + strlen(fusionid_back_d1)); + } else { + pr_err("%s match id for ovt_ov12a10_i failed\n", __func__); + goto power_down; + } + } else if (!strcmp(eb_info->eeprom_name, "sony_imx486_ii")) { + CDBG("match id for sony_imx486_ii\n"); + if (e_ctrl->cal_data.mapdata[0] == 0x01) { + module_id = e_ctrl->cal_data.mapdata[1] & 0x1f; + } else{ + module_id = -1; + } + printk("match id for sony_imx486_ii module_id=%d\n", module_id); + if (module_id == 1) { + CDBG("match id for sony_imx486_ii success\n"); + main_module_id = module_id; + fusion_read_id_D1_back(&e_ctrl->cal_data.mapdata[16]); + strcpy(fusionid_back, fusionid_back_d1 + strlen(fusionid_back_d1)); + } else { + pr_err("%s match id for sony_imx486_ii failed\n", __func__); + goto power_down; + } + } else { + pr_err("%s eeprom name match failed\n", __func__); + goto power_down; + } + CDBG("%s eeprom module id: main_module_id=%d sub_module_id=%d\n", __func__, main_module_id, sub_module_id); + e_ctrl->is_supported |= msm_eeprom_match_crc(&e_ctrl->cal_data); rc = msm_camera_power_down(power_info, diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.h b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.h index 5e348a8001a6a..fdd8a80e653ae 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.h +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom.h @@ -1,4 +1,5 @@ /* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -48,4 +49,7 @@ struct msm_eeprom_ctrl_t { uint8_t is_supported; }; +extern int ov13850_eeprom_sensor_writereg(struct msm_eeprom_ctrl_t *s_ctrl, uint32_t reg_addr, uint32_t reg_value, uint32_t delay); +extern int eeprom_init_ov13850_reg_otp(struct msm_eeprom_ctrl_t *e_ctrl); + #endif diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_insensor_ov13850.c b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_insensor_ov13850.c new file mode 100644 index 0000000000000..1dfed860b65a1 --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_insensor_ov13850.c @@ -0,0 +1,62 @@ +#include "msm_sd.h" +#include "msm_eeprom.h" +#include "msm_cci.h" +#include "msm_camera_io_util.h" +#include "msm_camera_i2c_mux.h" +#include + +static uint16_t ov13850_eeprom_sensor_readreg( + struct msm_eeprom_ctrl_t *s_ctrl, uint32_t reg_addr) +{ + uint16_t reg_value = 0; + s_ctrl->i2c_client.i2c_func_tbl->i2c_read( + &(s_ctrl->i2c_client), + reg_addr, + ®_value, MSM_CAMERA_I2C_BYTE_DATA); + return reg_value ; +} + +int ov13850_eeprom_sensor_writereg( + struct msm_eeprom_ctrl_t *s_ctrl, uint32_t reg_addr, uint32_t reg_value, uint32_t delay) +{ + int rc = 0; + rc = s_ctrl->i2c_client.i2c_func_tbl->i2c_write( + &(s_ctrl->i2c_client), reg_addr, reg_value, MSM_CAMERA_I2C_BYTE_DATA); + msleep(delay); + return rc; +} + +int eeprom_init_ov13850_reg_otp(struct msm_eeprom_ctrl_t *e_ctrl) +{ + int rc = 0, temp = 0; + if (!e_ctrl) { + pr_err("%s e_ctrl is NULL\n", __func__); + return -EINVAL; + } + + e_ctrl->i2c_client.addr_type = MSM_CAMERA_I2C_WORD_ADDR; + e_ctrl->i2c_client.cci_client->sid = 0x20 >> 1; + + + rc = ov13850_eeprom_sensor_writereg(e_ctrl, 0x0100, 0x01, 1); + + + temp = ov13850_eeprom_sensor_readreg(e_ctrl, 0x5002); + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x5002, (temp&(~0x02)), 0); + printk("%s %d E temp=0x%x\n", __func__, __LINE__, temp); + + + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x3d88, 0x72, 0); + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x3d89, 0x20, 0); + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x3d8a, 0x73, 0); + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x3d8b, 0xb9, 0); + rc += ov13850_eeprom_sensor_writereg(e_ctrl, 0x3d81, 0x01, 10); + + if (rc < 0) { + pr_err("i2c write faild\n"); + return rc; + } + + return rc; +} + diff --git a/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_otp_interface.h b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_otp_interface.h new file mode 100644 index 0000000000000..4ee86280bb9aa --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/eeprom/msm_eeprom_otp_interface.h @@ -0,0 +1,90 @@ +/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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 MSM_EEPROM_INSENSOR_H +#define MSM_EEPROM_INSENSOR_H + +static uint16_t eeprom_sensor_readreg( + struct msm_eeprom_ctrl_t *s_ctrl, uint32_t reg_addr) +{ + uint16_t reg_value = 0; + s_ctrl->i2c_client.i2c_func_tbl->i2c_read( + &(s_ctrl->i2c_client), + reg_addr, + ®_value, MSM_CAMERA_I2C_BYTE_DATA); + return reg_value ; +} + +static int eeprom_sensor_writereg( + struct msm_eeprom_ctrl_t *s_ctrl, uint32_t reg_addr, uint32_t reg_value, uint32_t delay) +{ + int rc = 0; + rc = s_ctrl->i2c_client.i2c_func_tbl->i2c_write( + &(s_ctrl->i2c_client), reg_addr, reg_value, MSM_CAMERA_I2C_BYTE_DATA); + msleep(delay); + return rc; +} + +static int eeprom_init_ov5675_reg_otp(struct msm_eeprom_ctrl_t *e_ctrl, uint16_t addr) +{ + int rc = 0; + if (!e_ctrl) { + pr_err("%s e_ctrl is NULL\n", __func__); + return -EINVAL; + } + + printk("%s %d E\n", __func__, __LINE__); + + e_ctrl->i2c_client.addr_type = MSM_CAMERA_I2C_WORD_ADDR; + e_ctrl->i2c_client.cci_client->sid = addr >> 1; + rc = eeprom_sensor_writereg(e_ctrl, 0x3d88, 0x7010, 1); + if (rc < 0) { + pr_err("i2c write faild\n"); + return rc; + } + rc = eeprom_sensor_writereg(e_ctrl, 0x3d8a, 0x70a4, 1); + if (rc < 0) { + pr_err("i2c write faild\n"); + return rc; + } + rc = eeprom_sensor_writereg(e_ctrl, 0x3d81, 0x01, 1); + if (rc < 0) { + pr_err("i2c write faild\n"); + return rc; + } + rc = eeprom_sensor_writereg(e_ctrl, 0x0100, 0x01, 1); + if (rc < 0) { + pr_err("i2c write faild\n"); + return rc; + } + + printk("%s : %d X\n", __func__, __LINE__); + + return 0; +} + +static uint16_t sensor_eeprom_match_crc_id(struct msm_eeprom_ctrl_t *e_ctrl, uint32_t addr) +{ + uint16_t data = 0; + e_ctrl->i2c_client.addr_type = MSM_CAMERA_I2C_WORD_ADDR; + + data = eeprom_sensor_readreg(e_ctrl, addr); + + if (0x01 != data) { + pr_err("eeprom match otp id failed! map valid data is %x !\n", data); + return -EPERM; + } + data = eeprom_sensor_readreg(e_ctrl, addr+1); + + return data; +} +#endif diff --git a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c index e9326741c9bfd..075f342a113a1 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c +++ b/drivers/media/platform/msm/camera_v2/sensor/flash/msm_flash.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2009-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -23,7 +24,7 @@ #define CDBG(fmt, args...) pr_debug(fmt, ##args) DEFINE_MSM_MUTEX(msm_flash_mutex); - +struct msm_flash_ctrl_t *flash_ctrl_wt = NULL; static struct v4l2_file_operations msm_flash_v4l2_subdev_fops; static struct led_trigger *torch_trigger; @@ -61,13 +62,16 @@ void msm_torch_brightness_set(struct led_classdev *led_cdev, pr_err("No torch trigger found, can't set brightness\n"); return; } - led_trigger_event(torch_trigger, value); + if (value == LED_OFF) { + led_trigger_event(flash_ctrl_wt->switch_trigger, 0); + } else + led_trigger_event(flash_ctrl_wt->switch_trigger, 1); }; static struct led_classdev msm_torch_led[MAX_LED_TRIGGERS] = { { - .name = "torch-light0", + .name = "flashlight", .brightness_set = msm_torch_brightness_set, .brightness = LED_OFF, }, @@ -151,6 +155,12 @@ static int32_t msm_flash_i2c_write_table( conf_array.reg_setting = settings->reg_setting_a; conf_array.size = settings->size; + /* Validate the settings size */ + if((!conf_array.size) || (conf_array.size > MAX_I2C_REG_SET)) { + pr_err("failed: invalid size %d", conf_array.size); + return -EINVAL; + } + return flash_ctrl->flash_i2c_client.i2c_func_tbl->i2c_write_table( &flash_ctrl->flash_i2c_client, &conf_array); } @@ -268,6 +278,16 @@ static int32_t msm_flash_i2c_init( flash_ctrl->power_info.power_down_setting_size = flash_ctrl->power_setting_array.size_down; + if ((flash_ctrl->power_info.power_setting_size > MAX_POWER_CONFIG) || + (flash_ctrl->power_info.power_down_setting_size > MAX_POWER_CONFIG)) { + pr_err("%s:%d invalid power setting size=%d size_down=%d\n", + __func__, __LINE__, + flash_ctrl->power_info.power_setting_size, + flash_ctrl->power_info.power_down_setting_size); + rc = -EINVAL; + goto msm_flash_i2c_init_fail; + } + rc = msm_camera_power_up(&flash_ctrl->power_info, flash_ctrl->flash_device_type, &flash_ctrl->flash_i2c_client); @@ -491,6 +511,64 @@ static int32_t msm_flash_init( return 0; } +static int32_t msm_flash_init_prepare( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ +#ifdef CONFIG_COMPAT + struct msm_flash_cfg_data_t flash_data_k; + struct msm_flash_init_info_t flash_init_info; + int32_t i = 0; + if(!is_compat_task()) { + /*for 64-bit usecase,it need copy the data to local memory*/ + flash_data_k.cfg_type = flash_data->cfg_type; + for (i = 0; i < MAX_LED_TRIGGERS; i++) { + flash_data_k.flash_current[i] = + flash_data->flash_current[i]; + flash_data_k.flash_duration[i] = + flash_data->flash_duration[i]; + } + + flash_data_k.cfg.flash_init_info = &flash_init_info; + if (copy_from_user(&flash_init_info, + (void *)(flash_data->cfg.flash_init_info), + sizeof(struct msm_flash_init_info_t))) { + pr_err("%s copy_from_user failed %d\n", + __func__, __LINE__); + return -EFAULT; + } + return msm_flash_init(flash_ctrl, &flash_data_k); + } + /* + * for 32-bit usecase,it already copy the userspace + * data to local memory in msm_flash_subdev_do_ioctl() + * so here do not need copy from user + */ + return msm_flash_init(flash_ctrl, flash_data); +#else + struct msm_flash_cfg_data_t flash_data_k; + struct msm_flash_init_info_t flash_init_info; + int32_t i = 0; + flash_data_k.cfg_type = flash_data->cfg_type; + for (i = 0; i < MAX_LED_TRIGGERS; i++) { + flash_data_k.flash_current[i] = + flash_data->flash_current[i]; + flash_data_k.flash_duration[i] = + flash_data->flash_duration[i]; + } + + flash_data_k.cfg.flash_init_info = &flash_init_info; + if (copy_from_user(&flash_init_info, + (void *)(flash_data->cfg.flash_init_info), + sizeof(struct msm_flash_init_info_t))) { + pr_err("%s copy_from_user failed %d\n", + __func__, __LINE__); + return -EFAULT; + } + return msm_flash_init(flash_ctrl, &flash_data_k); +#endif +} + static int32_t msm_flash_low( struct msm_flash_ctrl_t *flash_ctrl, struct msm_flash_cfg_data_t *flash_data) @@ -505,7 +583,11 @@ static int32_t msm_flash_low( led_trigger_event(flash_ctrl->flash_trigger[i], 0); /* Turn on flash triggers */ + #if defined(CONFIG_D1_ROSY) for (i = 0; i < flash_ctrl->torch_num_sources; i++) { + #else + for (i = 0; i < flash_ctrl->torch_num_sources - 1; i++) { + #endif if (flash_ctrl->torch_trigger[i]) { max_current = flash_ctrl->torch_max_current[i]; if (flash_data->flash_current[i] >= 0 && @@ -528,6 +610,69 @@ static int32_t msm_flash_low( return 0; } +static int32_t msm_gpio_flash_low( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ + CDBG("Enter\n"); + gpio_direction_output(93, 1); + return 0; +} + +static int32_t msm_gpio_flash_high( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ + CDBG("Enter\n"); + gpio_direction_output(90, 1); + return 0; +} + +static int32_t msm_gpio_flash_off( + struct msm_flash_ctrl_t *flash_ctrl, + struct msm_flash_cfg_data_t *flash_data) +{ + CDBG("Enter\n"); + gpio_direction_output(90, 0); + gpio_direction_output(93, 0); + return 0; +} + + +int flag_led = 0; + +int32_t wt_flash_flashlight(bool boolean) +{ + uint32_t curr = 0; + int32_t i = 0; + + if (boolean) + curr = 100; + else + curr = 0; + + if (flag_led > 0 && boolean == 0) { + return 0; + } + + if (flash_ctrl_wt) { + CDBG("WT Enter\n"); + /* Turn on flash triggers */ + CDBG("WT_XJB flash_ctrl_wt->torch_num_sources = %d", flash_ctrl_wt->torch_num_sources); + for (i = 0; i < flash_ctrl_wt->torch_num_sources - 1; i++) { + CDBG("WT low_flash_current[%d] = %d\n", i, curr); + if (flash_ctrl_wt->torch_trigger[i]) { + led_trigger_event(flash_ctrl_wt->torch_trigger[i], + curr); + } + } + if (flash_ctrl_wt->switch_trigger) + led_trigger_event(flash_ctrl_wt->switch_trigger, 1); + CDBG("WT Exit\n"); + } + return 0; +} + static int32_t msm_flash_high( struct msm_flash_ctrl_t *flash_ctrl, struct msm_flash_cfg_data_t *flash_data) @@ -537,10 +682,14 @@ static int32_t msm_flash_high( int32_t i = 0; /* Turn off torch triggers */ - for (i = 0; i < flash_ctrl->torch_num_sources; i++) + #if defined(CONIFG_D1_ROSY) + for (i = 0; i < flash_ctrl->torch_num_sources; i++) { + #else + for (i = 0; i < flash_ctrl->torch_num_sources - 1; i++) { + #endif if (flash_ctrl->torch_trigger[i]) led_trigger_event(flash_ctrl->torch_trigger[i], 0); - + } /* Turn on flash triggers */ for (i = 0; i < flash_ctrl->flash_num_sources; i++) { if (flash_ctrl->flash_trigger[i]) { @@ -595,9 +744,17 @@ static int32_t msm_flash_config(struct msm_flash_ctrl_t *flash_ctrl, CDBG("Enter %s type %d\n", __func__, flash_data->cfg_type); + if (flash_data->cfg_type == 2 && flag_led > 0) { + flag_led--; + } else if (flash_data->cfg_type == 3) { + flag_led++; + } else if (flash_data->cfg_type == 1) { + flag_led = 0; + } + switch (flash_data->cfg_type) { case CFG_FLASH_INIT: - rc = msm_flash_init(flash_ctrl, flash_data); + rc = msm_flash_init_prepare(flash_ctrl, flash_data); break; case CFG_FLASH_RELEASE: if (flash_ctrl->flash_state == MSM_CAMERA_FLASH_INIT) @@ -873,6 +1030,7 @@ static int32_t msm_flash_get_dt_data(struct device_node *of_node, struct msm_flash_ctrl_t *fctrl) { int32_t rc = 0; + struct device_node *switch_src_node_pmic = NULL; CDBG("called\n"); @@ -906,13 +1064,15 @@ static int32_t msm_flash_get_dt_data(struct device_node *of_node, } /* Read the flash and torch source info from device tree node */ + switch_src_node_pmic = of_parse_phandle(of_node, "qcom,switch-source", 0); + if (switch_src_node_pmic) { rc = msm_flash_get_pmic_source_info(of_node, fctrl); if (rc < 0) { pr_err("%s:%d msm_flash_get_pmic_source_info failed rc %d\n", __func__, __LINE__, rc); return rc; + } } - /* Read the gpio information from device tree */ rc = msm_sensor_driver_get_gpio_data( &(fctrl->power_info.gpio_conf), of_node); @@ -953,13 +1113,13 @@ static long msm_flash_subdev_do_ioctl( sd = vdev_to_v4l2_subdev(vdev); u32 = (struct msm_flash_cfg_data_t32 *)arg; - flash_data.cfg_type = u32->cfg_type; - for (i = 0; i < MAX_LED_TRIGGERS; i++) { - flash_data.flash_current[i] = u32->flash_current[i]; - flash_data.flash_duration[i] = u32->flash_duration[i]; - } switch (cmd) { case VIDIOC_MSM_FLASH_CFG32: + flash_data.cfg_type = u32->cfg_type; + for (i = 0; i < MAX_LED_TRIGGERS; i++) { + flash_data.flash_current[i] = u32->flash_current[i]; + flash_data.flash_duration[i] = u32->flash_duration[i]; + } cmd = VIDIOC_MSM_FLASH_CFG; switch (flash_data.cfg_type) { case CFG_FLASH_OFF: @@ -1081,7 +1241,7 @@ static int32_t msm_flash_platform_probe(struct platform_device *pdev) msm_flash_subdev_fops_ioctl; #endif flash_ctrl->msm_sd.sd.devnode->fops = &msm_flash_v4l2_subdev_fops; - + flash_ctrl_wt = flash_ctrl; if (flash_ctrl->flash_driver_type == FLASH_DRIVER_PMIC) rc = msm_torch_create_classdev(pdev, flash_ctrl); @@ -1133,9 +1293,9 @@ static struct msm_flash_table msm_gpio_flash_table = { .func_tbl = { .camera_flash_init = msm_flash_gpio_init, .camera_flash_release = msm_flash_release, - .camera_flash_off = msm_flash_off, - .camera_flash_low = msm_flash_low, - .camera_flash_high = msm_flash_high, + .camera_flash_off = msm_gpio_flash_off, + .camera_flash_low = msm_gpio_flash_low, + .camera_flash_high = msm_gpio_flash_high, }, }; diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c index 8f911d3624773..f76c6cceb3e03 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_cci_i2c.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -17,13 +17,15 @@ #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) #define S_I2C_DBG(fmt, args...) pr_debug(fmt, ##args) +#define MAX_I2C_ADDR_TYPE_SIZE (MSM_CAMERA_I2C_3B_ADDR + 1) +#define MAX_I2C_DATA_TYPE_SIZE (MSM_CAMERA_I2C_SET_BYTE_WRITE_MASK_DATA + 1) int32_t msm_camera_cci_i2c_read(struct msm_camera_i2c_client *client, uint32_t addr, uint16_t *data, enum msm_camera_i2c_data_type data_type) { int32_t rc = -EFAULT; - unsigned char buf[client->addr_type+data_type]; + unsigned char buf[MAX_I2C_ADDR_TYPE_SIZE + MAX_I2C_DATA_TYPE_SIZE]; struct msm_camera_cci_ctrl cci_ctrl; if ((client->addr_type != MSM_CAMERA_I2C_BYTE_ADDR @@ -69,6 +71,12 @@ int32_t msm_camera_cci_i2c_read_seq(struct msm_camera_i2c_client *client, || num_byte == 0) return rc; + if (num_byte > I2C_REG_DATA_MAX) { + pr_err("%s: Error num_byte:0x%x exceeds 8K max supported:0x%x\n", + __func__, num_byte, I2C_REG_DATA_MAX); + return rc; + } + buf = kzalloc(num_byte, GFP_KERNEL); if (!buf) { pr_err("%s:%d no memory\n", __func__, __LINE__); @@ -276,6 +284,12 @@ int32_t msm_camera_cci_i2c_write_seq_table( client_addr_type = client->addr_type; client->addr_type = write_setting->addr_type; + if (reg_setting->reg_data_size > I2C_SEQ_REG_DATA_MAX) { + pr_err("%s: number of bytes %u exceeding the max supported %d\n", + __func__, reg_setting->reg_data_size, I2C_SEQ_REG_DATA_MAX); + return rc; + } + for (i = 0; i < write_setting->size; i++) { rc = msm_camera_cci_i2c_write_seq(client, reg_setting->reg_addr, reg_setting->reg_data, reg_setting->reg_data_size); diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c index 34245063c0ba1..8b2db504295ee 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_dt_util.c @@ -282,6 +282,38 @@ int msm_sensor_get_sub_module_index(struct device_node *of_node, src_node = NULL; } + src_node = of_parse_phandle(of_node, "qcom,ir-led-src", 0); + if (!src_node) { + CDBG("%s:%d src_node NULL\n", __func__, __LINE__); + } else { + rc = of_property_read_u32(src_node, "cell-index", &val); + CDBG("%s qcom,ir led cell index %d, rc %d\n", __func__, + val, rc); + if (rc < 0) { + pr_err("%s:%d failed %d\n", __func__, __LINE__, rc); + goto ERROR; + } + sensor_info->subdev_id[SUB_MODULE_IR_LED] = val; + of_node_put(src_node); + src_node = NULL; + } + + src_node = of_parse_phandle(of_node, "qcom,ir-cut-src", 0); + if (!src_node) { + CDBG("%s:%d src_node NULL\n", __func__, __LINE__); + } else { + rc = of_property_read_u32(src_node, "cell-index", &val); + CDBG("%s qcom,ir cut cell index %d, rc %d\n", __func__, + val, rc); + if (rc < 0) { + pr_err("%s:%d failed %d\n", __func__, __LINE__, rc); + goto ERROR; + } + sensor_info->subdev_id[SUB_MODULE_IR_CUT] = val; + of_node_put(src_node); + src_node = NULL; + } + rc = of_property_read_u32(of_node, "qcom,strobe-flash-sd-index", &val); if (rc != -EINVAL) { CDBG("%s qcom,strobe-flash-sd-index %d, rc %d\n", __func__, @@ -760,6 +792,54 @@ int msm_camera_init_gpio_pin_tbl(struct device_node *of_node, rc = -ENOMEM; return rc; } + + rc = of_property_read_u32(of_node, "qcom,gpio-ir-p", &val); + if (rc != -EINVAL) { + if (rc < 0) { + pr_err("%s:%d read qcom,gpio-ir-p failed rc %d\n", + __func__, __LINE__, rc); + goto ERROR; + } else if (val >= gpio_array_size) { + pr_err("%s:%d qcom,gpio-ir-p invalid %d\n", + __func__, __LINE__, val); + rc = -EINVAL; + goto ERROR; + } + + gconf->gpio_num_info->gpio_num[IR_CUT_FILTER_GPIO_P] = + gpio_array[val]; + gconf->gpio_num_info->valid[IR_CUT_FILTER_GPIO_P] = 1; + + CDBG("%s qcom,gpio-ir-p %d\n", __func__, + gconf->gpio_num_info->gpio_num[IR_CUT_FILTER_GPIO_P]); + } else { + rc = 0; + } + + rc = of_property_read_u32(of_node, "qcom,gpio-ir-m", &val); + if (rc != -EINVAL) { + if (rc < 0) { + pr_err("%s:%d read qcom,gpio-ir-m failed rc %d\n", + __func__, __LINE__, rc); + goto ERROR; + } else if (val >= gpio_array_size) { + pr_err("%s:%d qcom,gpio-ir-m invalid %d\n", + __func__, __LINE__, val); + rc = -EINVAL; + goto ERROR; + } + + gconf->gpio_num_info->gpio_num[IR_CUT_FILTER_GPIO_M] = + gpio_array[val]; + + gconf->gpio_num_info->valid[IR_CUT_FILTER_GPIO_M] = 1; + + CDBG("%s qcom,gpio-ir-m %d\n", __func__, + gconf->gpio_num_info->gpio_num[IR_CUT_FILTER_GPIO_M]); + } else { + rc = 0; + } + rc = of_property_read_u32(of_node, "qcom,gpio-vana", &val); if (rc != -EINVAL) { if (rc < 0) { diff --git a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c index 3b101798edac2..7d218662215e3 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c +++ b/drivers/media/platform/msm/camera_v2/sensor/io/msm_camera_qup_i2c.c @@ -73,7 +73,7 @@ int32_t msm_camera_qup_i2c_read(struct msm_camera_i2c_client *client, enum msm_camera_i2c_data_type data_type) { int32_t rc = -EFAULT; - unsigned char buf[client->addr_type+data_type]; + unsigned char *buf = NULL; if ((client->addr_type != MSM_CAMERA_I2C_BYTE_ADDR && client->addr_type != MSM_CAMERA_I2C_WORD_ADDR) @@ -81,6 +81,17 @@ int32_t msm_camera_qup_i2c_read(struct msm_camera_i2c_client *client, && data_type != MSM_CAMERA_I2C_WORD_DATA)) return rc; + if (client->addr_type > UINT_MAX - data_type) { + pr_err("%s: integer overflow prevented\n", __func__); + return rc; + } + + buf = kzalloc(client->addr_type+data_type, GFP_KERNEL); + if (!buf) { + pr_err("%s:%d no memory\n", __func__, __LINE__); + return -ENOMEM; + } + if (client->addr_type == MSM_CAMERA_I2C_BYTE_ADDR) { buf[0] = addr; } else if (client->addr_type == MSM_CAMERA_I2C_WORD_ADDR) { @@ -90,6 +101,8 @@ int32_t msm_camera_qup_i2c_read(struct msm_camera_i2c_client *client, rc = msm_camera_qup_i2c_rxdata(client, buf, data_type); if (rc < 0) { S_I2C_DBG("%s fail\n", __func__); + kfree(buf); + buf = NULL; return rc; } @@ -99,6 +112,8 @@ int32_t msm_camera_qup_i2c_read(struct msm_camera_i2c_client *client, *data = buf[0] << 8 | buf[1]; S_I2C_DBG("%s addr = 0x%x data: 0x%x\n", __func__, addr, *data); + kfree(buf); + buf = NULL; return rc; } @@ -106,7 +121,7 @@ int32_t msm_camera_qup_i2c_read_seq(struct msm_camera_i2c_client *client, uint32_t addr, uint8_t *data, uint32_t num_byte) { int32_t rc = -EFAULT; - unsigned char buf[client->addr_type+num_byte]; + unsigned char *buf = NULL; int i; if ((client->addr_type != MSM_CAMERA_I2C_BYTE_ADDR @@ -114,6 +129,22 @@ int32_t msm_camera_qup_i2c_read_seq(struct msm_camera_i2c_client *client, || num_byte == 0) return rc; + if (num_byte > I2C_REG_DATA_MAX) { + pr_err("%s: Error num_byte:0x%x exceeds 8K max supported:0x%x\n", + __func__, num_byte, I2C_REG_DATA_MAX); + return rc; + } + if (client->addr_type > UINT_MAX - num_byte) { + pr_err("%s: integer overflow prevented\n", __func__); + return rc; + } + + buf = kzalloc(client->addr_type+num_byte, GFP_KERNEL); + if (!buf) { + pr_err("%s:%d no memory\n", __func__, __LINE__); + return -ENOMEM; + } + if (client->addr_type == MSM_CAMERA_I2C_BYTE_ADDR) { buf[0] = addr; } else if (client->addr_type == MSM_CAMERA_I2C_WORD_ADDR) { @@ -123,6 +154,8 @@ int32_t msm_camera_qup_i2c_read_seq(struct msm_camera_i2c_client *client, rc = msm_camera_qup_i2c_rxdata(client, buf, num_byte); if (rc < 0) { S_I2C_DBG("%s fail\n", __func__); + kfree(buf); + buf = NULL; return rc; } @@ -132,6 +165,8 @@ int32_t msm_camera_qup_i2c_read_seq(struct msm_camera_i2c_client *client, S_I2C_DBG("Byte %d: 0x%x\n", i, buf[i]); S_I2C_DBG("Data: 0x%x\n", data[i]); } + kfree(buf); + buf = NULL; return rc; } @@ -290,6 +325,12 @@ int32_t msm_camera_qup_i2c_write_seq_table(struct msm_camera_i2c_client *client, client_addr_type = client->addr_type; client->addr_type = write_setting->addr_type; + if (reg_setting->reg_data_size > I2C_SEQ_REG_DATA_MAX) { + pr_err("%s: number of bytes %u exceeding the max supported %d\n", + __func__, reg_setting->reg_data_size, I2C_SEQ_REG_DATA_MAX); + return rc; + } + for (i = 0; i < write_setting->size; i++) { rc = msm_camera_qup_i2c_write_seq(client, reg_setting->reg_addr, reg_setting->reg_data, reg_setting->reg_data_size); diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_cut/Makefile b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/Makefile new file mode 100644 index 0000000000000..8950c1c83763f --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/Makefile @@ -0,0 +1,4 @@ +ccflags-y += -Idrivers/media/platform/msm/camera_v2 +ccflags-y += -Idrivers/media/platform/msm/camera_v2/common +ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io +obj-$(CONFIG_MSMB_CAMERA) += msm_ir_cut.o diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.c b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.c new file mode 100644 index 0000000000000..e8f74f8beb1bb --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.c @@ -0,0 +1,665 @@ +/* Copyright (c) 2016, 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. + * + */ + +#define pr_fmt(fmt) "%s:%d " fmt, __func__, __LINE__ + +#include +#include +#include "msm_ir_cut.h" +#include "msm_camera_dt_util.h" + +#undef CDBG +#define CDBG(fmt, args...) pr_debug(fmt, ##args) + +DEFINE_MSM_MUTEX(msm_ir_cut_mutex); + +static struct v4l2_file_operations msm_ir_cut_v4l2_subdev_fops; + +static const struct of_device_id msm_ir_cut_dt_match[] = { + {.compatible = "qcom,ir-cut", .data = NULL}, + {} +}; + +static struct msm_ir_cut_table msm_gpio_ir_cut_table; + +static struct msm_ir_cut_table *ir_cut_table[] = { + &msm_gpio_ir_cut_table, +}; + +static int32_t msm_ir_cut_get_subdev_id( + struct msm_ir_cut_ctrl_t *ir_cut_ctrl, void *arg) +{ + uint32_t *subdev_id = (uint32_t *)arg; + + CDBG("Enter\n"); + if (!subdev_id) { + pr_err("failed\n"); + return -EINVAL; + } + if (MSM_CAMERA_PLATFORM_DEVICE != ir_cut_ctrl->ir_cut_device_type) { + pr_err("failed\n"); + return -EINVAL; + } + + *subdev_id = ir_cut_ctrl->pdev->id; + + CDBG("subdev_id %d\n", *subdev_id); + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_cut_init( + struct msm_ir_cut_ctrl_t *ir_cut_ctrl, + struct msm_ir_cut_cfg_data_t *ir_cut_data) +{ + int32_t rc = 0; + + CDBG("Enter"); + + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_on(ir_cut_ctrl, ir_cut_data); + + CDBG("Exit"); + return rc; +} + +static int32_t msm_ir_cut_release( + struct msm_ir_cut_ctrl_t *ir_cut_ctrl) +{ + int32_t rc = 0; + + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_RELEASE) { + pr_err("%s:%d Invalid ir_cut state = %d", + __func__, __LINE__, ir_cut_ctrl->ir_cut_state); + return 0; + } + + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_on(ir_cut_ctrl, NULL); + if (rc < 0) { + pr_err("%s:%d camera_ir_cut_on failed rc = %d", + __func__, __LINE__, rc); + return rc; + } + ir_cut_ctrl->ir_cut_state = MSM_CAMERA_IR_CUT_RELEASE; + return 0; +} + +static int32_t msm_ir_cut_off(struct msm_ir_cut_ctrl_t *ir_cut_ctrl, + struct msm_ir_cut_cfg_data_t *ir_cut_data) +{ + int rc = 0; + + CDBG("Enter cut off\n"); + + if (ir_cut_ctrl->gconf) { + rc = msm_camera_request_gpio_table( + ir_cut_ctrl->gconf->cam_gpio_req_tbl, + ir_cut_ctrl->gconf->cam_gpio_req_tbl_size, 1); + + if (rc < 0) { + pr_err("ERR:%s:Failed in selecting state: %d\n", + __func__, rc); + + return rc; + } + } else { + pr_err("%s: No IR CUT GPIOs\n", __func__); + return 0; + } + + if (ir_cut_ctrl->cam_pinctrl_status) { + rc = pinctrl_select_state( + ir_cut_ctrl->pinctrl_info.pinctrl, + ir_cut_ctrl->pinctrl_info.gpio_state_active); + + if (rc < 0) + pr_err("ERR:%s:%d cannot set pin to active state: %d", + __func__, __LINE__, rc); + } + + CDBG("ERR:%s:gpio_conf->gpio_num_info->gpio_num[0] = %d", + __func__, + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_P]); + + CDBG("ERR:%s:gpio_conf->gpio_num_info->gpio_num[1] = %d", + __func__, + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_M]); + + gpio_set_value_cansleep( + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_P], + 0); + + gpio_set_value_cansleep( + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_M], + 1); + + if (ir_cut_ctrl->gconf) { + rc = msm_camera_request_gpio_table( + ir_cut_ctrl->gconf->cam_gpio_req_tbl, + ir_cut_ctrl->gconf->cam_gpio_req_tbl_size, 0); + + if (rc < 0) { + pr_err("ERR:%s:Failed in selecting state: %d\n", + __func__, rc); + + return rc; + } + } else { + pr_err("%s: No IR CUT GPIOs\n", __func__); + return 0; + } + + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_cut_on( + struct msm_ir_cut_ctrl_t *ir_cut_ctrl, + struct msm_ir_cut_cfg_data_t *ir_cut_data) +{ + int rc = 0; + + CDBG("Enter ir cut on\n"); + + if (ir_cut_ctrl->gconf) { + rc = msm_camera_request_gpio_table( + ir_cut_ctrl->gconf->cam_gpio_req_tbl, + ir_cut_ctrl->gconf->cam_gpio_req_tbl_size, 1); + + if (rc < 0) { + pr_err("ERR:%s:Failed in selecting state: %d\n", + __func__, rc); + + return rc; + } + } else { + pr_err("%s: No IR CUT GPIOs\n", __func__); + return 0; + } + + if (ir_cut_ctrl->cam_pinctrl_status) { + rc = pinctrl_select_state( + ir_cut_ctrl->pinctrl_info.pinctrl, + ir_cut_ctrl->pinctrl_info.gpio_state_active); + + if (rc < 0) + pr_err("ERR:%s:%d cannot set pin to active state: %d", + __func__, __LINE__, rc); + } + + CDBG("ERR:%s: gpio_conf->gpio_num_info->gpio_num[0] = %d", + __func__, + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_P]); + + CDBG("ERR:%s: gpio_conf->gpio_num_info->gpio_num[1] = %d", + __func__, + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_M]); + + gpio_set_value_cansleep( + ir_cut_ctrl->gconf->gpio_num_info-> + gpio_num[IR_CUT_FILTER_GPIO_P], + 1); + + gpio_set_value_cansleep( + ir_cut_ctrl->gconf-> + gpio_num_info->gpio_num[IR_CUT_FILTER_GPIO_M], + 1); + + if (ir_cut_ctrl->gconf) { + rc = msm_camera_request_gpio_table( + ir_cut_ctrl->gconf->cam_gpio_req_tbl, + ir_cut_ctrl->gconf->cam_gpio_req_tbl_size, 0); + + if (rc < 0) { + pr_err("ERR:%s:Failed in selecting state: %d\n", + __func__, rc); + + return rc; + } + } else { + pr_err("%s: No IR CUT GPIOs\n", __func__); + return 0; + } + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_cut_handle_init( + struct msm_ir_cut_ctrl_t *ir_cut_ctrl, + struct msm_ir_cut_cfg_data_t *ir_cut_data) +{ + uint32_t i = 0; + int32_t rc = -EFAULT; + enum msm_ir_cut_driver_type ir_cut_driver_type = + ir_cut_ctrl->ir_cut_driver_type; + + CDBG("Enter"); + + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_INIT) { + pr_err("%s:%d Invalid ir_cut state = %d", + __func__, __LINE__, ir_cut_ctrl->ir_cut_state); + return 0; + } + + for (i = 0; i < ARRAY_SIZE(ir_cut_table); i++) { + if (ir_cut_driver_type == ir_cut_table[i]->ir_cut_driver_type) { + ir_cut_ctrl->func_tbl = &ir_cut_table[i]->func_tbl; + rc = 0; + break; + } + } + + if (rc < 0) { + pr_err("%s:%d failed invalid ir_cut_driver_type %d\n", + __func__, __LINE__, ir_cut_driver_type); + return -EINVAL; + } + + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_init( + ir_cut_ctrl, ir_cut_data); + if (rc < 0) { + pr_err("%s:%d camera_ir_cut_init failed rc = %d", + __func__, __LINE__, rc); + return rc; + } + + ir_cut_ctrl->ir_cut_state = MSM_CAMERA_IR_CUT_INIT; + + CDBG("Exit"); + return 0; +} + +static int32_t msm_ir_cut_config(struct msm_ir_cut_ctrl_t *ir_cut_ctrl, + void __user *argp) +{ + int32_t rc = -EINVAL; + struct msm_ir_cut_cfg_data_t *ir_cut_data = + (struct msm_ir_cut_cfg_data_t *) argp; + + mutex_lock(ir_cut_ctrl->ir_cut_mutex); + + CDBG("Enter %s type %d\n", __func__, ir_cut_data->cfg_type); + + switch (ir_cut_data->cfg_type) { + case CFG_IR_CUT_INIT: + rc = msm_ir_cut_handle_init(ir_cut_ctrl, ir_cut_data); + break; + case CFG_IR_CUT_RELEASE: + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_INIT) + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_release( + ir_cut_ctrl); + break; + case CFG_IR_CUT_OFF: + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_INIT) + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_off( + ir_cut_ctrl, ir_cut_data); + break; + case CFG_IR_CUT_ON: + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_INIT) + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_on( + ir_cut_ctrl, ir_cut_data); + break; + default: + rc = -EFAULT; + break; + } + + mutex_unlock(ir_cut_ctrl->ir_cut_mutex); + + CDBG("Exit %s type %d\n", __func__, ir_cut_data->cfg_type); + + return rc; +} + +static long msm_ir_cut_subdev_ioctl(struct v4l2_subdev *sd, + unsigned int cmd, void *arg) +{ + struct msm_ir_cut_ctrl_t *fctrl = NULL; + void __user *argp = (void __user *)arg; + + CDBG("Enter\n"); + + if (!sd) { + pr_err("sd NULL\n"); + return -EINVAL; + } + fctrl = v4l2_get_subdevdata(sd); + if (!fctrl) { + pr_err("fctrl NULL\n"); + return -EINVAL; + } + switch (cmd) { + case VIDIOC_MSM_SENSOR_GET_SUBDEV_ID: + return msm_ir_cut_get_subdev_id(fctrl, argp); + case VIDIOC_MSM_IR_CUT_CFG: + return msm_ir_cut_config(fctrl, argp); + case MSM_SD_NOTIFY_FREEZE: + return 0; + case MSM_SD_SHUTDOWN: + if (!fctrl->func_tbl) { + pr_err("fctrl->func_tbl NULL\n"); + return -EINVAL; + } else { + return fctrl->func_tbl->camera_ir_cut_release(fctrl); + } + default: + pr_err_ratelimited("invalid cmd %d\n", cmd); + return -ENOIOCTLCMD; + } + CDBG("Exit\n"); +} + +static struct v4l2_subdev_core_ops msm_ir_cut_subdev_core_ops = { + .ioctl = msm_ir_cut_subdev_ioctl, +}; + +static struct v4l2_subdev_ops msm_ir_cut_subdev_ops = { + .core = &msm_ir_cut_subdev_core_ops, +}; +static int msm_ir_cut_close(struct v4l2_subdev *sd, + struct v4l2_subdev_fh *fh) { + + int rc = 0; + struct msm_ir_cut_ctrl_t *ir_cut_ctrl = v4l2_get_subdevdata(sd); + + CDBG("Enter\n"); + + if (!ir_cut_ctrl) { + pr_err("%s: failed\n", __func__); + return -EINVAL; + } + + if (ir_cut_ctrl->ir_cut_state == MSM_CAMERA_IR_CUT_INIT) + rc = ir_cut_ctrl->func_tbl->camera_ir_cut_release( + ir_cut_ctrl); + + CDBG("Exit\n"); + + return rc; +}; + +static const struct v4l2_subdev_internal_ops msm_ir_cut_internal_ops = { + .close = msm_ir_cut_close, +}; + +static int32_t msm_ir_cut_get_gpio_dt_data(struct device_node *of_node, + struct msm_ir_cut_ctrl_t *fctrl) +{ + int32_t rc = 0, i = 0; + uint16_t *gpio_array = NULL; + int16_t gpio_array_size = 0; + struct msm_camera_gpio_conf *gconf = NULL; + + gpio_array_size = of_gpio_count(of_node); + CDBG("%s gpio count %d\n", __func__, gpio_array_size); + + if (gpio_array_size > 0) { + fctrl->power_info.gpio_conf = + kzalloc(sizeof(struct msm_camera_gpio_conf), + GFP_KERNEL); + if (!fctrl->power_info.gpio_conf) { + pr_err("%s failed %d\n", __func__, __LINE__); + rc = -ENOMEM; + return rc; + } + gconf = fctrl->power_info.gpio_conf; + + gpio_array = kcalloc(gpio_array_size, sizeof(uint16_t), + GFP_KERNEL); + if (!gpio_array) + return -ENOMEM; + for (i = 0; i < gpio_array_size; i++) { + gpio_array[i] = of_get_gpio(of_node, i); + if (((int16_t)gpio_array[i]) < 0) { + pr_err("%s failed %d\n", __func__, __LINE__); + rc = -EINVAL; + goto free_gpio_array; + } + CDBG("%s gpio_array[%d] = %d\n", __func__, i, + gpio_array[i]); + } + + rc = msm_camera_get_dt_gpio_req_tbl(of_node, gconf, + gpio_array, gpio_array_size); + if (rc < 0) { + pr_err("%s failed %d\n", __func__, __LINE__); + goto free_gpio_array; + } + kfree(gpio_array); + + if (fctrl->ir_cut_driver_type == IR_CUT_DRIVER_DEFAULT) + fctrl->ir_cut_driver_type = IR_CUT_DRIVER_GPIO; + CDBG("%s:%d fctrl->ir_cut_driver_type = %d", __func__, __LINE__, + fctrl->ir_cut_driver_type); + } + + return rc; + +free_gpio_array: + kfree(gpio_array); + return rc; +} + +static int32_t msm_ir_cut_get_dt_data(struct device_node *of_node, + struct msm_ir_cut_ctrl_t *fctrl) +{ + int32_t rc = 0; + + CDBG("called\n"); + + if (!of_node) { + pr_err("of_node NULL\n"); + return -EINVAL; + } + + /* Read the sub device */ + rc = of_property_read_u32(of_node, "cell-index", &fctrl->pdev->id); + if (rc < 0) { + pr_err("failed rc %d\n", rc); + return rc; + } + + fctrl->ir_cut_driver_type = IR_CUT_DRIVER_DEFAULT; + + /* Read the gpio information from device tree */ + rc = msm_ir_cut_get_gpio_dt_data(of_node, fctrl); + if (rc < 0) { + pr_err("%s:%d msm_ir_cut_get_gpio_dt_data failed rc %d\n", + __func__, __LINE__, rc); + return rc; + } + + return rc; +} + +#ifdef CONFIG_COMPAT +static long msm_ir_cut_subdev_do_ioctl( + struct file *file, unsigned int cmd, void *arg) +{ + int32_t rc = 0; + struct video_device *vdev = video_devdata(file); + struct v4l2_subdev *sd = vdev_to_v4l2_subdev(vdev); + struct msm_ir_cut_cfg_data_t32 *u32 = + (struct msm_ir_cut_cfg_data_t32 *)arg; + struct msm_ir_cut_cfg_data_t ir_cut_data; + + CDBG("Enter"); + ir_cut_data.cfg_type = u32->cfg_type; + + switch (cmd) { + case VIDIOC_MSM_IR_CUT_CFG32: + cmd = VIDIOC_MSM_IR_CUT_CFG; + break; + default: + return msm_ir_cut_subdev_ioctl(sd, cmd, arg); + } + + rc = msm_ir_cut_subdev_ioctl(sd, cmd, &ir_cut_data); + + CDBG("Exit"); + return rc; +} + +static long msm_ir_cut_subdev_fops_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + return video_usercopy(file, cmd, arg, msm_ir_cut_subdev_do_ioctl); +} +#endif + +static int32_t msm_ir_cut_platform_probe(struct platform_device *pdev) +{ + int32_t rc = 0, i = 0; + struct msm_ir_cut_ctrl_t *ir_cut_ctrl = NULL; + + CDBG("Enter"); + if (!pdev->dev.of_node) { + pr_err("of_node NULL\n"); + return -EINVAL; + } + + ir_cut_ctrl = kzalloc(sizeof(struct msm_ir_cut_ctrl_t), GFP_KERNEL); + if (!ir_cut_ctrl) + return -ENOMEM; + + memset(ir_cut_ctrl, 0, sizeof(struct msm_ir_cut_ctrl_t)); + + ir_cut_ctrl->pdev = pdev; + + rc = msm_ir_cut_get_dt_data(pdev->dev.of_node, ir_cut_ctrl); + + if (rc < 0) { + pr_err("%s:%d msm_ir_cut_get_dt_data failed\n", + __func__, __LINE__); + kfree(ir_cut_ctrl); + return -EINVAL; + } + + rc = msm_sensor_driver_get_gpio_data(&(ir_cut_ctrl->gconf), + (&pdev->dev)->of_node); + + if ((rc < 0) || (ir_cut_ctrl->gconf == NULL)) { + pr_err("%s: No IR CUT GPIOs\n", __func__); + + kfree(ir_cut_ctrl); + return -EINVAL; + } + + CDBG("%s: gpio_request_table_size = %d\n", + __func__, + ir_cut_ctrl->gconf->cam_gpio_req_tbl_size); + + for (i = 0; + i < ir_cut_ctrl->gconf->cam_gpio_req_tbl_size; i++) { + CDBG("%s: gpio = %d\n", __func__, + ir_cut_ctrl->gconf->cam_gpio_req_tbl[i].gpio); + CDBG("%s: gpio-flags = %lu\n", __func__, + ir_cut_ctrl->gconf->cam_gpio_req_tbl[i].flags); + CDBG("%s: gconf->gpio_num_info->gpio_num[%d] = %d\n", + __func__, i, + ir_cut_ctrl->gconf->gpio_num_info->gpio_num[i]); + } + + ir_cut_ctrl->cam_pinctrl_status = 1; + + rc = msm_camera_pinctrl_init( + &(ir_cut_ctrl->pinctrl_info), &(pdev->dev)); + + if (rc < 0) { + pr_err("ERR:%s: Error in reading IR CUT pinctrl\n", + __func__); + ir_cut_ctrl->cam_pinctrl_status = 0; + } + + ir_cut_ctrl->ir_cut_state = MSM_CAMERA_IR_CUT_RELEASE; + ir_cut_ctrl->power_info.dev = &ir_cut_ctrl->pdev->dev; + ir_cut_ctrl->ir_cut_device_type = MSM_CAMERA_PLATFORM_DEVICE; + ir_cut_ctrl->ir_cut_mutex = &msm_ir_cut_mutex; + + /* Initialize sub device */ + v4l2_subdev_init(&ir_cut_ctrl->msm_sd.sd, &msm_ir_cut_subdev_ops); + v4l2_set_subdevdata(&ir_cut_ctrl->msm_sd.sd, ir_cut_ctrl); + + ir_cut_ctrl->msm_sd.sd.internal_ops = &msm_ir_cut_internal_ops; + ir_cut_ctrl->msm_sd.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; + snprintf(ir_cut_ctrl->msm_sd.sd.name, + ARRAY_SIZE(ir_cut_ctrl->msm_sd.sd.name), + "msm_camera_ir_cut"); + media_entity_init(&ir_cut_ctrl->msm_sd.sd.entity, 0, NULL, 0); + ir_cut_ctrl->msm_sd.sd.entity.type = MEDIA_ENT_T_V4L2_SUBDEV; + ir_cut_ctrl->msm_sd.sd.entity.group_id = MSM_CAMERA_SUBDEV_IR_CUT; + ir_cut_ctrl->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x1; + msm_sd_register(&ir_cut_ctrl->msm_sd); + + CDBG("%s:%d ir_cut sd name = %s", __func__, __LINE__, + ir_cut_ctrl->msm_sd.sd.entity.name); + msm_ir_cut_v4l2_subdev_fops = v4l2_subdev_fops; +#ifdef CONFIG_COMPAT + msm_ir_cut_v4l2_subdev_fops.compat_ioctl32 = + msm_ir_cut_subdev_fops_ioctl; +#endif + ir_cut_ctrl->msm_sd.sd.devnode->fops = &msm_ir_cut_v4l2_subdev_fops; + + CDBG("probe success\n"); + return rc; +} + +MODULE_DEVICE_TABLE(of, msm_ir_cut_dt_match); + +static struct platform_driver msm_ir_cut_platform_driver = { + .probe = msm_ir_cut_platform_probe, + .driver = { + .name = "qcom,ir-cut", + .owner = THIS_MODULE, + .of_match_table = msm_ir_cut_dt_match, + }, +}; + +static int __init msm_ir_cut_init_module(void) +{ + int32_t rc = 0; + + CDBG("Enter\n"); + rc = platform_driver_register(&msm_ir_cut_platform_driver); + if (!rc) + return rc; + + pr_err("platform probe for ir_cut failed"); + + return rc; +} + +static void __exit msm_ir_cut_exit_module(void) +{ + platform_driver_unregister(&msm_ir_cut_platform_driver); +} + +static struct msm_ir_cut_table msm_gpio_ir_cut_table = { + .ir_cut_driver_type = IR_CUT_DRIVER_GPIO, + .func_tbl = { + .camera_ir_cut_init = msm_ir_cut_init, + .camera_ir_cut_release = msm_ir_cut_release, + .camera_ir_cut_off = msm_ir_cut_off, + .camera_ir_cut_on = msm_ir_cut_on, + }, +}; + +module_init(msm_ir_cut_init_module); +module_exit(msm_ir_cut_exit_module); +MODULE_DESCRIPTION("MSM IR CUT"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.h b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.h new file mode 100644 index 0000000000000..23fd239525230 --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_cut/msm_ir_cut.h @@ -0,0 +1,72 @@ +/* Copyright (c) 2016, 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. + * + */ + +#ifndef MSM_IR_CUT_H +#define MSM_IR_CUT_H + +#include +#include "msm_camera_dt_util.h" +#include "msm_camera_io_util.h" +#include "msm_sd.h" + +#define DEFINE_MSM_MUTEX(mutexname) \ + static struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) + +enum msm_camera_ir_cut_state_t { + MSM_CAMERA_IR_CUT_INIT, + MSM_CAMERA_IR_CUT_RELEASE, +}; + +enum msm_ir_cut_driver_type { + IR_CUT_DRIVER_GPIO, + IR_CUT_DRIVER_DEFAULT, +}; + +struct msm_ir_cut_ctrl_t; + +struct msm_ir_cut_func_t { + int32_t (*camera_ir_cut_init)(struct msm_ir_cut_ctrl_t *, + struct msm_ir_cut_cfg_data_t *); + int32_t (*camera_ir_cut_release)(struct msm_ir_cut_ctrl_t *); + int32_t (*camera_ir_cut_off)(struct msm_ir_cut_ctrl_t *, + struct msm_ir_cut_cfg_data_t *); + int32_t (*camera_ir_cut_on)(struct msm_ir_cut_ctrl_t *, + struct msm_ir_cut_cfg_data_t *); +}; + +struct msm_ir_cut_table { + enum msm_ir_cut_driver_type ir_cut_driver_type; + struct msm_ir_cut_func_t func_tbl; +}; + +struct msm_ir_cut_ctrl_t { + struct msm_sd_subdev msm_sd; + struct platform_device *pdev; + struct msm_ir_cut_func_t *func_tbl; + struct msm_camera_power_ctrl_t power_info; + + enum msm_camera_device_type_t ir_cut_device_type; + struct mutex *ir_cut_mutex; + + /* ir_cut driver type */ + enum msm_ir_cut_driver_type ir_cut_driver_type; + + /* ir_cut state */ + enum msm_camera_ir_cut_state_t ir_cut_state; + + struct msm_camera_gpio_conf *gconf; + struct msm_pinctrl_info pinctrl_info; + uint8_t cam_pinctrl_status; +}; + +#endif diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_led/Makefile b/drivers/media/platform/msm/camera_v2/sensor/ir_led/Makefile new file mode 100644 index 0000000000000..6e99ecc2c78d9 --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_led/Makefile @@ -0,0 +1,4 @@ +ccflags-y += -Idrivers/media/platform/msm/camera_v2 +ccflags-y += -Idrivers/media/platform/msm/camera_v2/common +ccflags-y += -Idrivers/media/platform/msm/camera_v2/sensor/io +obj-$(CONFIG_MSMB_CAMERA) += msm_ir_led.o diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.c b/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.c new file mode 100644 index 0000000000000..cfcdb124f44f3 --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.c @@ -0,0 +1,462 @@ +/* Copyright (c) 2016, 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. + * + */ + +#define pr_fmt(fmt) "%s:%d " fmt, __func__, __LINE__ + +#include +#include +#include "msm_ir_led.h" +#include "msm_camera_dt_util.h" + +#undef CDBG +#define CDBG(fmt, args...) pr_debug(fmt, ##args) + +DEFINE_MSM_MUTEX(msm_ir_led_mutex); + +static struct v4l2_file_operations msm_ir_led_v4l2_subdev_fops; + +static const struct of_device_id msm_ir_led_dt_match[] = { + {.compatible = "qcom,ir-led", .data = NULL}, + {} +}; + +static struct msm_ir_led_table msm_default_ir_led_table; + +static struct msm_ir_led_table *ir_led_table[] = { + &msm_default_ir_led_table, +}; + +static int32_t msm_ir_led_get_subdev_id( + struct msm_ir_led_ctrl_t *ir_led_ctrl, void *arg) +{ + uint32_t *subdev_id = (uint32_t *)arg; + + CDBG("Enter\n"); + if (!subdev_id) { + pr_err("subdevice ID is not valid\n"); + return -EINVAL; + } + if (MSM_CAMERA_PLATFORM_DEVICE != ir_led_ctrl->ir_led_device_type) { + pr_err("device type is not matching\n"); + return -EINVAL; + } + + *subdev_id = ir_led_ctrl->pdev->id; + + CDBG("subdev_id %d\n", *subdev_id); + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_led_init( + struct msm_ir_led_ctrl_t *ir_led_ctrl, + struct msm_ir_led_cfg_data_t *ir_led_data) +{ + int32_t rc = 0; + + CDBG("Enter\n"); + + rc = ir_led_ctrl->func_tbl->camera_ir_led_off(ir_led_ctrl, ir_led_data); + + CDBG("Exit\n"); + return rc; +} + +static int32_t msm_ir_led_release( + struct msm_ir_led_ctrl_t *ir_led_ctrl) +{ + int32_t rc = 0; + + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_RELEASE) { + pr_err("Invalid ir_led state = %d\n", + ir_led_ctrl->ir_led_state); + return 0; + } + + rc = ir_led_ctrl->func_tbl->camera_ir_led_off(ir_led_ctrl, NULL); + if (rc < 0) { + pr_err("camera_ir_led_off failed (%d)\n", rc); + return rc; + } + ir_led_ctrl->ir_led_state = MSM_CAMERA_IR_LED_RELEASE; + return 0; +} + +static int32_t msm_ir_led_off(struct msm_ir_led_ctrl_t *ir_led_ctrl, + struct msm_ir_led_cfg_data_t *ir_led_data) +{ + CDBG("Enter\n"); + + if (ir_led_ctrl->pwm_dev) + pwm_disable(ir_led_ctrl->pwm_dev); + else + pr_err("pwm device is null\n"); + + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_led_on( + struct msm_ir_led_ctrl_t *ir_led_ctrl, + struct msm_ir_led_cfg_data_t *ir_led_data) +{ + int rc; + + CDBG("pwm duty on(ns) %d, pwm period(ns) %d\n", + ir_led_data->pwm_duty_on_ns, ir_led_data->pwm_period_ns); + + if (ir_led_ctrl->pwm_dev) { + rc = pwm_config(ir_led_ctrl->pwm_dev, + ir_led_data->pwm_duty_on_ns, + ir_led_data->pwm_period_ns); + if (rc) { + pr_err("PWM config failed (%d)\n", rc); + return rc; + } + + rc = pwm_enable(ir_led_ctrl->pwm_dev); + if (rc) { + pr_err("PWM enable failed(%d)\n", rc); + return rc; + } + } else + pr_err("pwm device is null\n"); + + return 0; +} + +static int32_t msm_ir_led_handle_init( + struct msm_ir_led_ctrl_t *ir_led_ctrl, + struct msm_ir_led_cfg_data_t *ir_led_data) +{ + uint32_t i = 0; + int32_t rc = -EFAULT; + enum msm_ir_led_driver_type ir_led_driver_type = + ir_led_ctrl->ir_led_driver_type; + + CDBG("Enter\n"); + + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_INIT) { + pr_err("Invalid ir_led state = %d\n", + ir_led_ctrl->ir_led_state); + return 0; + } + + for (i = 0; i < ARRAY_SIZE(ir_led_table); i++) { + if (ir_led_driver_type == ir_led_table[i]->ir_led_driver_type) { + ir_led_ctrl->func_tbl = &ir_led_table[i]->func_tbl; + rc = 0; + break; + } + } + + if (rc < 0) { + pr_err("failed invalid ir_led_driver_type %d\n", + ir_led_driver_type); + return -EINVAL; + } + + rc = ir_led_ctrl->func_tbl->camera_ir_led_init( + ir_led_ctrl, ir_led_data); + if (rc < 0) { + pr_err("camera_ir_led_init failed (%d)\n", rc); + return rc; + } + + ir_led_ctrl->ir_led_state = MSM_CAMERA_IR_LED_INIT; + + CDBG("Exit\n"); + return 0; +} + +static int32_t msm_ir_led_config(struct msm_ir_led_ctrl_t *ir_led_ctrl, + void __user *argp) +{ + int32_t rc = -EINVAL; + struct msm_ir_led_cfg_data_t *ir_led_data = + (struct msm_ir_led_cfg_data_t *) argp; + + mutex_lock(ir_led_ctrl->ir_led_mutex); + + CDBG("type %d\n", ir_led_data->cfg_type); + + switch (ir_led_data->cfg_type) { + case CFG_IR_LED_INIT: + rc = msm_ir_led_handle_init(ir_led_ctrl, ir_led_data); + break; + case CFG_IR_LED_RELEASE: + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_INIT) + rc = ir_led_ctrl->func_tbl->camera_ir_led_release( + ir_led_ctrl); + break; + case CFG_IR_LED_OFF: + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_INIT) + rc = ir_led_ctrl->func_tbl->camera_ir_led_off( + ir_led_ctrl, ir_led_data); + break; + case CFG_IR_LED_ON: + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_INIT) + rc = ir_led_ctrl->func_tbl->camera_ir_led_on( + ir_led_ctrl, ir_led_data); + break; + default: + rc = -EFAULT; + break; + } + + mutex_unlock(ir_led_ctrl->ir_led_mutex); + + CDBG("Exit: type %d\n", ir_led_data->cfg_type); + + return rc; +} + +static long msm_ir_led_subdev_ioctl(struct v4l2_subdev *sd, + unsigned int cmd, void *arg) +{ + struct msm_ir_led_ctrl_t *fctrl = NULL; + void __user *argp = (void __user *)arg; + + CDBG("Enter\n"); + + if (!sd) { + pr_err(" v4l2 ir led subdevice is NULL\n"); + return -EINVAL; + } + fctrl = v4l2_get_subdevdata(sd); + if (!fctrl) { + pr_err("fctrl NULL\n"); + return -EINVAL; + } + switch (cmd) { + case VIDIOC_MSM_SENSOR_GET_SUBDEV_ID: + return msm_ir_led_get_subdev_id(fctrl, argp); + case VIDIOC_MSM_IR_LED_CFG: + return msm_ir_led_config(fctrl, argp); + case MSM_SD_NOTIFY_FREEZE: + return 0; + case MSM_SD_SHUTDOWN: + if (!fctrl->func_tbl) { + pr_err("No call back funcions\n"); + return -EINVAL; + } else { + return fctrl->func_tbl->camera_ir_led_release(fctrl); + } + default: + pr_err_ratelimited("invalid cmd %d\n", cmd); + return -ENOIOCTLCMD; + } + CDBG("Exit\n"); +} + +static struct v4l2_subdev_core_ops msm_ir_led_subdev_core_ops = { + .ioctl = msm_ir_led_subdev_ioctl, +}; + +static struct v4l2_subdev_ops msm_ir_led_subdev_ops = { + .core = &msm_ir_led_subdev_core_ops, +}; + +static int msm_ir_led_close(struct v4l2_subdev *sd, + struct v4l2_subdev_fh *fh) { + + int rc = 0; + struct msm_ir_led_ctrl_t *ir_led_ctrl = v4l2_get_subdevdata(sd); + + if (!ir_led_ctrl) { + pr_err("v4l2 subdevice data read failed\n"); + return -EINVAL; + } + + CDBG("Enter\n"); + + if (ir_led_ctrl->ir_led_state == MSM_CAMERA_IR_LED_INIT) + rc = ir_led_ctrl->func_tbl->camera_ir_led_release( + ir_led_ctrl); + + CDBG("Exit (%d)\n", rc); + + return rc; +} + +static const struct v4l2_subdev_internal_ops msm_ir_led_internal_ops = { + .close = msm_ir_led_close, +}; + +static int32_t msm_ir_led_get_dt_data(struct device_node *of_node, + struct msm_ir_led_ctrl_t *fctrl) +{ + int32_t rc = 0; + + CDBG("called\n"); + + /* Read the sub device */ + rc = of_property_read_u32(of_node, "cell-index", &fctrl->pdev->id); + if (rc < 0) { + pr_err("reading cell-index for ir-led node is failed(rc) %d\n", + rc); + return rc; + } + + fctrl->ir_led_driver_type = IR_LED_DRIVER_DEFAULT; + return rc; +} + +#ifdef CONFIG_COMPAT +static long msm_ir_led_subdev_do_ioctl( + struct file *file, unsigned int cmd, void *arg) +{ + int32_t rc = 0; + struct video_device *vdev = video_devdata(file); + struct v4l2_subdev *sd = vdev_to_v4l2_subdev(vdev); + struct msm_ir_led_cfg_data_t32 *u32 = + (struct msm_ir_led_cfg_data_t32 *)arg; + struct msm_ir_led_cfg_data_t ir_led_data; + + CDBG("Enter\n"); + ir_led_data.cfg_type = u32->cfg_type; + ir_led_data.pwm_duty_on_ns = u32->pwm_duty_on_ns; + ir_led_data.pwm_period_ns = u32->pwm_period_ns; + + switch (cmd) { + case VIDIOC_MSM_IR_LED_CFG32: + cmd = VIDIOC_MSM_IR_LED_CFG; + break; + default: + return msm_ir_led_subdev_ioctl(sd, cmd, arg); + } + + rc = msm_ir_led_subdev_ioctl(sd, cmd, &ir_led_data); + + CDBG("Exit\n"); + return rc; +} + +static long msm_ir_led_subdev_fops_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + return video_usercopy(file, cmd, arg, msm_ir_led_subdev_do_ioctl); +} +#endif + +static int32_t msm_ir_led_platform_probe(struct platform_device *pdev) +{ + int32_t rc = 0; + struct msm_ir_led_ctrl_t *ir_led_ctrl = NULL; + + CDBG("Enter\n"); + if (!pdev->dev.of_node) { + pr_err("IR LED device node is not present in device tree\n"); + return -EINVAL; + } + + ir_led_ctrl = devm_kzalloc(&pdev->dev, sizeof(struct msm_ir_led_ctrl_t), + GFP_KERNEL); + if (!ir_led_ctrl) + return -ENOMEM; + + ir_led_ctrl->pdev = pdev; + + /* Reading PWM device node */ + ir_led_ctrl->pwm_dev = of_pwm_get(pdev->dev.of_node, NULL); + + if (IS_ERR(ir_led_ctrl->pwm_dev)) { + rc = PTR_ERR(ir_led_ctrl->pwm_dev); + pr_err("Cannot get PWM device (%d)\n", rc); + ir_led_ctrl->pwm_dev = NULL; + } + + rc = msm_ir_led_get_dt_data(pdev->dev.of_node, ir_led_ctrl); + if (rc < 0) { + pr_err("msm_ir_led_get_dt_data failed\n"); + devm_kfree(&pdev->dev, ir_led_ctrl); + return -EINVAL; + } + + ir_led_ctrl->ir_led_state = MSM_CAMERA_IR_LED_RELEASE; + ir_led_ctrl->power_info.dev = &ir_led_ctrl->pdev->dev; + ir_led_ctrl->ir_led_device_type = MSM_CAMERA_PLATFORM_DEVICE; + ir_led_ctrl->ir_led_mutex = &msm_ir_led_mutex; + + /* Initialize sub device */ + v4l2_subdev_init(&ir_led_ctrl->msm_sd.sd, &msm_ir_led_subdev_ops); + v4l2_set_subdevdata(&ir_led_ctrl->msm_sd.sd, ir_led_ctrl); + + ir_led_ctrl->msm_sd.sd.internal_ops = &msm_ir_led_internal_ops; + ir_led_ctrl->msm_sd.sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; + snprintf(ir_led_ctrl->msm_sd.sd.name, + ARRAY_SIZE(ir_led_ctrl->msm_sd.sd.name), + "msm_camera_ir_led"); + media_entity_init(&ir_led_ctrl->msm_sd.sd.entity, 0, NULL, 0); + ir_led_ctrl->msm_sd.sd.entity.type = MEDIA_ENT_T_V4L2_SUBDEV; + ir_led_ctrl->msm_sd.sd.entity.group_id = MSM_CAMERA_SUBDEV_IR_LED; + ir_led_ctrl->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x1; + msm_sd_register(&ir_led_ctrl->msm_sd); + + CDBG("ir_led sd name = %s\n", + ir_led_ctrl->msm_sd.sd.entity.name); + msm_ir_led_v4l2_subdev_fops = v4l2_subdev_fops; +#ifdef CONFIG_COMPAT + msm_ir_led_v4l2_subdev_fops.compat_ioctl32 = + msm_ir_led_subdev_fops_ioctl; +#endif + ir_led_ctrl->msm_sd.sd.devnode->fops = &msm_ir_led_v4l2_subdev_fops; + + CDBG("probe success\n"); + return rc; +} + +MODULE_DEVICE_TABLE(of, msm_ir_led_dt_match); + +static struct platform_driver msm_ir_led_platform_driver = { + .probe = msm_ir_led_platform_probe, + .driver = { + .name = "qcom,ir-led", + .owner = THIS_MODULE, + .of_match_table = msm_ir_led_dt_match, + }, +}; + +static int __init msm_ir_led_init_module(void) +{ + int32_t rc = 0; + + CDBG("Enter\n"); + rc = platform_driver_register(&msm_ir_led_platform_driver); + if (!rc) + return rc; + + pr_err("ir-led driver register failed (%d)\n", rc); + + return rc; +} + +static void __exit msm_ir_led_exit_module(void) +{ + platform_driver_unregister(&msm_ir_led_platform_driver); +} + +static struct msm_ir_led_table msm_default_ir_led_table = { + .ir_led_driver_type = IR_LED_DRIVER_DEFAULT, + .func_tbl = { + .camera_ir_led_init = msm_ir_led_init, + .camera_ir_led_release = msm_ir_led_release, + .camera_ir_led_off = msm_ir_led_off, + .camera_ir_led_on = msm_ir_led_on, + }, +}; + +module_init(msm_ir_led_init_module); +module_exit(msm_ir_led_exit_module); +MODULE_DESCRIPTION("MSM IR LED"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.h b/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.h new file mode 100644 index 0000000000000..a0923ffc81dad --- /dev/null +++ b/drivers/media/platform/msm/camera_v2/sensor/ir_led/msm_ir_led.h @@ -0,0 +1,71 @@ +/* Copyright (c) 2016, 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. + * + */ + +#ifndef MSM_IR_LED_H +#define MSM_IR_LED_H + +#include +#include +#include +#include +#include +#include "msm_sd.h" + +#define DEFINE_MSM_MUTEX(mutexname) \ + static struct mutex mutexname = __MUTEX_INITIALIZER(mutexname) + +enum msm_camera_ir_led_state_t { + MSM_CAMERA_IR_LED_INIT, + MSM_CAMERA_IR_LED_RELEASE, +}; + +enum msm_ir_led_driver_type { + IR_LED_DRIVER_GPIO, + IR_LED_DRIVER_DEFAULT, +}; + +struct msm_ir_led_ctrl_t; + +struct msm_ir_led_func_t { + int32_t (*camera_ir_led_init)(struct msm_ir_led_ctrl_t *, + struct msm_ir_led_cfg_data_t *); + int32_t (*camera_ir_led_release)(struct msm_ir_led_ctrl_t *); + int32_t (*camera_ir_led_off)(struct msm_ir_led_ctrl_t *, + struct msm_ir_led_cfg_data_t *); + int32_t (*camera_ir_led_on)(struct msm_ir_led_ctrl_t *, + struct msm_ir_led_cfg_data_t *); +}; + +struct msm_ir_led_table { + enum msm_ir_led_driver_type ir_led_driver_type; + struct msm_ir_led_func_t func_tbl; +}; + +struct msm_ir_led_ctrl_t { + struct msm_sd_subdev msm_sd; + struct platform_device *pdev; + struct pwm_device *pwm_dev; + struct msm_ir_led_func_t *func_tbl; + struct msm_camera_power_ctrl_t power_info; + + enum msm_camera_device_type_t ir_led_device_type; + struct mutex *ir_led_mutex; + + /* ir_led driver type */ + enum msm_ir_led_driver_type ir_led_driver_type; + + /* ir_led state */ + enum msm_camera_ir_led_state_t ir_led_state; +}; + +#endif diff --git a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c index a21f3956c518b..6cf75928d463d 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c +++ b/drivers/media/platform/msm/camera_v2/sensor/msm_sensor_driver.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -17,12 +18,15 @@ #include "camera.h" #include "msm_cci.h" #include "msm_camera_dt_util.h" +#include /* Logging macro */ #undef CDBG #define CDBG(fmt, args...) pr_debug(fmt, ##args) #define SENSOR_MAX_MOUNTANGLE (360) +char fusionid_back[64] = { 0 }; +char fusionid_front[64] = { 0 }; static struct v4l2_file_operations msm_sensor_v4l2_subdev_fops; static int32_t msm_sensor_driver_platform_probe(struct platform_device *pdev); @@ -105,7 +109,11 @@ static int32_t msm_sensor_driver_create_i2c_v4l_subdev s_ctrl->msm_sd.sd.entity.name = s_ctrl->msm_sd.sd.name; s_ctrl->sensordata->sensor_info->session_id = session_id; s_ctrl->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x3; - msm_sd_register(&s_ctrl->msm_sd); + rc = msm_sd_register(&s_ctrl->msm_sd); + if (rc < 0) { + pr_err("failed: msm_sd_register rc %d", rc); + return rc; + } msm_sensor_v4l2_subdev_fops = v4l2_subdev_fops; #ifdef CONFIG_COMPAT msm_sensor_v4l2_subdev_fops.compat_ioctl32 = @@ -142,7 +150,11 @@ static int32_t msm_sensor_driver_create_v4l_subdev s_ctrl->msm_sd.sd.entity.group_id = MSM_CAMERA_SUBDEV_SENSOR; s_ctrl->msm_sd.sd.entity.name = s_ctrl->msm_sd.sd.name; s_ctrl->msm_sd.close_seq = MSM_SD_CLOSE_2ND_CATEGORY | 0x3; - msm_sd_register(&s_ctrl->msm_sd); + rc = msm_sd_register(&s_ctrl->msm_sd); + if (rc < 0) { + pr_err("failed: msm_sd_register rc %d", rc); + return rc; + } msm_cam_copy_v4l2_subdev_fops(&msm_sensor_v4l2_subdev_fops); #ifdef CONFIG_COMPAT msm_sensor_v4l2_subdev_fops.compat_ioctl32 = @@ -420,17 +432,11 @@ static int32_t msm_sensor_create_pd_settings(void *setting, #ifdef CONFIG_COMPAT if (is_compat_task()) { - int i = 0; - struct msm_sensor_power_setting32 *power_setting_iter = - (struct msm_sensor_power_setting32 *)compat_ptr(( - (struct msm_camera_sensor_slave_info32 *)setting)-> - power_setting_array.power_setting); - - for (i = 0; i < size_down; i++) { - pd[i].config_val = power_setting_iter[i].config_val; - pd[i].delay = power_setting_iter[i].delay; - pd[i].seq_type = power_setting_iter[i].seq_type; - pd[i].seq_val = power_setting_iter[i].seq_val; + rc = msm_sensor_get_pw_settings_compat( + pd, pu, size_down); + if (rc < 0) { + pr_err("failed"); + return -EFAULT; } } else #endif @@ -633,6 +639,224 @@ static void msm_sensor_fill_sensor_info(struct msm_sensor_ctrl_t *s_ctrl, strlcpy(entity_name, s_ctrl->msm_sd.sd.entity.name, MAX_SENSOR_NAME); } +extern int main_module_id; +extern int sub_module_id; + +#if defined(CONFIG_D1_ROSY) +static const char *module_info[] = { + "Unkonw", + "Sunny", + "Unkonw", + "Semco", + "Unkonw", + "Unkonw", + "Qtech", + "Ofilm", + "Unkonw", + "Unkonw", + "Unkonw", + "Unkonw", + "Unknow", + "Unknow", + "Unknow", + "Liteon", +}; +#else +static const char *module_info[] = { + "Unkonw", + "Sunny", + "Huaquan", + "Fushikang", + "Guangzhen", + "Daling", + "Xinli", + "O-film", + "Boyi", + "Sanglaishi", + "Qunhui", + "Q-Tech", + "Unknow", + "Unknow", + "Unknow", + "Unknow", +}; +#endif +ssize_t kobj_fusion_id_show_back(struct kobject *kobject, struct attribute *attr, char *buf); +struct attribute camera_attr_back = { + .name = "fusion_id_back", + .mode = S_IRWXUGO, +}; + +static struct attribute *def_attrs_back[] = { + &camera_attr_back, + NULL, +}; + +struct sysfs_ops obj_camera_sysops_back = { + .show = kobj_fusion_id_show_back, + .store = NULL, +}; + +struct kobj_type ktype_back = { + .release = NULL, + .sysfs_ops = &obj_camera_sysops_back, + .default_attrs = def_attrs_back, +}; + + +ssize_t kobj_fusion_id_show_back(struct kobject *kobject, struct attribute *attr, char *buf) +{ + CDBG("back_attrname:%s", attr->name); + return sprintf(buf, "%s", fusionid_back); +} + +struct kobject kobj_back; +ssize_t kobj_fusion_id_show_front(struct kobject *kobject, struct attribute *attr, char *buf); +struct attribute camera_attr_front = { + .name = "fusion_id_front", + .mode = S_IRWXUGO, +}; + +static struct attribute *def_attrs_front[] = { + &camera_attr_front, + NULL, +}; + +struct sysfs_ops obj_camera_sysops_front = { + .show = kobj_fusion_id_show_front, + .store = NULL, +}; + +struct kobj_type ktype_front = { + .release = NULL, + .sysfs_ops = &obj_camera_sysops_front, + .default_attrs = def_attrs_front, +}; + + +ssize_t kobj_fusion_id_show_front(struct kobject *kobject, struct attribute *attr, char *buf) +{ + CDBG("front_attrname:%s", attr->name); + return sprintf(buf, "%s", fusionid_front); +} + +struct kobject kobj_front; + +static uint16_t fusion_read_id_s5k3l8(struct msm_sensor_ctrl_t *s_ctrl) +{ + uint16_t value1, value3, value5; + + struct msm_camera_i2c_client *sensor_i2c_client; + sensor_i2c_client = s_ctrl->sensor_i2c_client; + + memset(fusionid_back, 0, sizeof(fusionid_back)); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0100, 0x0100, 2); + mdelay(10); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0a02, 0x0000, 2); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0a00, 0x0100, 2); + mdelay(10); + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x0a24, &value1, 2); + CDBG(" s5k3l8 fusion_sensor_readreg value1 =%d\n", value1); + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x0a26, &value3, 2); + CDBG(" s5k3l8 fusion_sensor_readreg value3 =%d\n", value3); + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x0a28, &value5, 1); + CDBG(" s5k3l8 fusion_sensor_readreg value5 =%d\n", value5); + sprintf(fusionid_back, "%d%d%d", value1, value3, value5); + CDBG(" s5k3l8 fusion_sensor_readreg fusionid=%s\n", fusionid_back); + return 0; +} + +static uint16_t fusion_read_id_ov5675(struct msm_sensor_ctrl_t *s_ctrl) +{ + uint16_t data[15] = {0}; + uint16_t *p = NULL; + uint8_t i; + struct msm_camera_i2c_client *sensor_i2c_client; + sensor_i2c_client = s_ctrl->sensor_i2c_client; + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0100, 0x01, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x5001, 0x02, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d84, 0xC0, 1); + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d88, 0x70, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d89, 0x00, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d8a, 0x70, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d8b, 0x0f, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d81, 0x01, 1); + mdelay(10); + + p = data; + + memset(fusionid_front, 0, sizeof(fusionid_front)); + for (i = 0; i < 15; i++) { + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x7000+i, p+i, 1); + CDBG("data[%d]=%x\n", i, data[i]); + sprintf(fusionid_front + strlen(fusionid_front), "%u", data[i]); + } + CDBG("fusionid_front=%s\n", fusionid_front); + return 0; +} + +static uint16_t fusion_read_id_s5k5e8(struct msm_sensor_ctrl_t *s_ctrl) +{ + uint16_t data[8] = {0}; + uint16_t *p = NULL; + uint8_t i; + struct msm_camera_i2c_client *sensor_i2c_client; + sensor_i2c_client = s_ctrl->sensor_i2c_client; + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0a00, 0x04&0x00ff, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0a02, 0x00&0x00ff, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0a00, 0x01&0x00ff, 1); + mdelay(10); + p = data; + + memset(fusionid_front, 0, sizeof(fusionid_front)); + for (i = 0; i < 8; i++) { + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x0a04+i, p+i, 1); + CDBG("data[%d]=%x\n", i, data[i]); + sprintf(fusionid_front + strlen(fusionid_front), "%u", data[i]); + } + CDBG("fusionid_front=%s\n", fusionid_front); + + return 0; +} + +static uint16_t fusion_read_id_ov13855(struct msm_sensor_ctrl_t *s_ctrl) +{ + uint16_t data[16] = {0}; + uint16_t *p = NULL; + uint16_t temp1 = 0x0; + uint8_t i; + struct msm_camera_i2c_client *sensor_i2c_client; + sensor_i2c_client = s_ctrl->sensor_i2c_client; + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x0100, 0x01, 1); + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x5000, &temp1, 1); + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x5000, (0x00 & 0x10) | (temp1 & (~0x10)), 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d84, 0xC0, 1); + + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d88, 0x70, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d89, 0x00, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d8a, 0x70, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d8b, 0x0f, 1); + sensor_i2c_client->i2c_func_tbl->i2c_write(sensor_i2c_client, 0x3d81, 0x01, 1); + mdelay(10); + + p = data; + + memset(fusionid_back, 0, sizeof(fusionid_back)); + for (i = 0; i < 15; i++) { + sensor_i2c_client->i2c_func_tbl->i2c_read(sensor_i2c_client, 0x7000+i, p+i, 1); + CDBG("data[%d]=%x\n", i, data[i]); + sprintf(fusionid_back + strlen(fusionid_back), "%u", data[i]); + } + CDBG("fusionid_back=%s\n", fusionid_back); + return 0; +} + + /* static function definition */ int32_t msm_sensor_driver_probe(void *setting, struct msm_sensor_info_t *probed_info, char *entity_name) @@ -748,6 +972,119 @@ int32_t msm_sensor_driver_probe(void *setting, goto free_slave_info; } + + if (!strcmp(slave_info->sensor_name, "s5k3l8_ofilm")) { + if (main_module_id != 7) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k3l8_ofilm_riva")) { + if (main_module_id != 7) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k3l8_sunny")) { + if (main_module_id != 1) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ov13855_sunny")) { + if (main_module_id != 1) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ov13855_qtech")) { + if (main_module_id != 11) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ov13850_q13v06k")) { + if (main_module_id != 1) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k3l2")) { + if (main_module_id != 7) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ov5675_ofilm")) { + if (sub_module_id != 7) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ovt_ov5675_i")) { + if (sub_module_id != 6) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ovt_ov5675_ii")) { + if (sub_module_id != 7) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "sony_imx486_ii")) { + if (main_module_id != 1) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k5e8_sunny")) { + if (sub_module_id != 1) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ov5675")) { + if (sub_module_id != 1) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k5e8_ofilm")) { + if (sub_module_id != 7) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k5e8_qtech_riva")) { + if (sub_module_id != 11) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "s5k5e8_ofilm_riva")) { + if (sub_module_id != 7) { + pr_err("failed: sub_module_id %d, sensor is not %s", sub_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else if (!strcmp(slave_info->sensor_name, "ovt_ov12a10_i")) { + if (main_module_id != 7) { + pr_err("failed: main_module_id %d, sensor is not %s", main_module_id, slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + } else { + pr_err("sensor name is %s, is nothing to do", slave_info->sensor_name); + rc = -EINVAL; + goto free_slave_info; + } + + pr_err("%s:%d camera sensor probe %s", __func__, __LINE__, slave_info->sensor_name); + + rc = kobject_init_and_add(&kobj_back, &ktype_back, NULL, "camera_fusion_id_back"); + rc = kobject_init_and_add(&kobj_front, &ktype_front, NULL, "camera_fusion_id_front"); /* Extract s_ctrl from camera id */ s_ctrl = g_sctrl[slave_info->camera_id]; if (!s_ctrl) { @@ -767,9 +1104,12 @@ int32_t msm_sensor_driver_probe(void *setting, */ if (slave_info->sensor_id_info.sensor_id == s_ctrl->sensordata->cam_slave_info-> - sensor_id_info.sensor_id) { - pr_err("slot%d: sensor id%d already probed\n", + sensor_id_info.sensor_id && + !(strcmp(slave_info->sensor_name, + s_ctrl->sensordata->cam_slave_info->sensor_name))) { + pr_err("slot%d: sensor name: %s sensor id%d already probed\n", slave_info->camera_id, + slave_info->sensor_name, s_ctrl->sensordata->cam_slave_info-> sensor_id_info.sensor_id); msm_sensor_fill_sensor_info(s_ctrl, @@ -893,14 +1233,19 @@ int32_t msm_sensor_driver_probe(void *setting, pr_err("%s power up failed", slave_info->sensor_name); goto free_camera_info; } + if (!strcmp(slave_info->sensor_name, "ov13855_qtech")) { + fusion_read_id_ov13855(s_ctrl); + } else if (!strcmp(slave_info->sensor_name, "s5k3l8_ofilm_riva")) { + fusion_read_id_s5k3l8(s_ctrl); + } else if (!strcmp(slave_info->sensor_name, "ov5675_ofilm")) { + fusion_read_id_ov5675(s_ctrl); + } else if ((!strcmp(slave_info->sensor_name, "s5k5e8_qtech_riva")) || (!strcmp(slave_info->sensor_name, "s5k5e8_ofilm_riva"))) { + fusion_read_id_s5k5e8(s_ctrl); + } else { + printk("read fusion id fail\n"); + } - pr_err("%s probe succeeded", slave_info->sensor_name); - - /* - Set probe succeeded flag to 1 so that no other camera shall - * probed on this slot - */ - s_ctrl->is_probe_succeed = 1; + printk("camera sensor probe %s succeeded\n", slave_info->sensor_name); /* * Update the subdevice id of flash-src based on availability in kernel. @@ -954,6 +1299,24 @@ int32_t msm_sensor_driver_probe(void *setting, msm_sensor_fill_sensor_info(s_ctrl, probed_info, entity_name); + hardwareinfo_set_prop(probed_info->position == BACK_CAMERA_B + ? HARDWARE_BACK_CAM:HARDWARE_FRONT_CAM, probed_info->sensor_name); + if (main_module_id > 0) { + hardwareinfo_set_prop(HARDWARE_BACK_CAM_MOUDULE_ID, module_info[main_module_id]); + } else{ + hardwareinfo_set_prop(HARDWARE_BACK_CAM_MOUDULE_ID, module_info[0]); + } + if (sub_module_id > 0) { + hardwareinfo_set_prop(HARDWARE_FRONT_CAM_MOUDULE_ID, module_info[sub_module_id]); + } else{ + hardwareinfo_set_prop(HARDWARE_FRONT_CAM_MOUDULE_ID, module_info[0]); + } + + /* + * Set probe succeeded flag to 1 so that no other camera shall + * probed on this slot + */ + s_ctrl->is_probe_succeed = 1; return rc; camera_power_down: @@ -1107,6 +1470,7 @@ static int32_t msm_sensor_driver_parse(struct msm_sensor_ctrl_t *s_ctrl) if (!s_ctrl->msm_sensor_mutex) { pr_err("failed: no memory msm_sensor_mutex %pK", s_ctrl->msm_sensor_mutex); + rc = -ENOMEM; goto FREE_SENSOR_I2C_CLIENT; } @@ -1231,16 +1595,18 @@ static int32_t msm_sensor_driver_i2c_probe(struct i2c_client *client, if (s_ctrl->sensor_i2c_client != NULL) { s_ctrl->sensor_i2c_client->client = client; s_ctrl->sensordata->power_info.dev = &client->dev; - } - /* Get clocks information */ - rc = msm_camera_i2c_dev_get_clk_info( - &s_ctrl->sensor_i2c_client->client->dev, - &s_ctrl->sensordata->power_info.clk_info, - &s_ctrl->sensordata->power_info.clk_ptr, - &s_ctrl->sensordata->power_info.clk_info_size); - if (rc < 0) { - pr_err("failed: msm_camera_i2c_dev_get_clk_info rc %d", rc); - goto FREE_S_CTRL; + + /* Get clocks information */ + rc = msm_camera_i2c_dev_get_clk_info( + &s_ctrl->sensor_i2c_client->client->dev, + &s_ctrl->sensordata->power_info.clk_info, + &s_ctrl->sensordata->power_info.clk_ptr, + &s_ctrl->sensordata->power_info.clk_info_size); + if (rc < 0) { + pr_err("failed: msm_camera_i2c_dev_get_clk_info rc %d", + rc); + goto FREE_S_CTRL; + } } return rc; FREE_S_CTRL: diff --git a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c index 3f4fb9be51d29..40fb78b6dbfc7 100644 --- a/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c +++ b/drivers/media/platform/msm/camera_v2/sensor/ois/msm_ois.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014 - 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -452,7 +452,8 @@ static int32_t msm_ois_config(struct msm_ois_ctrl_t *o_ctrl, break; } - if (!conf_array.size) { + if (!conf_array.size || + conf_array.size > I2C_SEQ_REG_DATA_MAX) { pr_err("%s:%d failed\n", __func__, __LINE__); rc = -EFAULT; break; @@ -614,11 +615,13 @@ static long msm_ois_subdev_ioctl(struct v4l2_subdev *sd, pr_err("o_ctrl->i2c_client.i2c_func_tbl NULL\n"); return -EINVAL; } + mutex_lock(o_ctrl->ois_mutex); rc = msm_ois_power_down(o_ctrl); if (rc < 0) { pr_err("%s:%d OIS Power down failed\n", __func__, __LINE__); } + mutex_unlock(o_ctrl->ois_mutex); return msm_ois_close(sd, NULL); default: return -ENOIOCTLCMD; @@ -773,11 +776,10 @@ static long msm_ois_subdev_do_ioctl( u32 = (struct msm_ois_cfg_data32 *)arg; parg = arg; - ois_data.cfgtype = u32->cfgtype; - switch (cmd) { case VIDIOC_MSM_OIS_CFG32: cmd = VIDIOC_MSM_OIS_CFG; + ois_data.cfgtype = u32->cfgtype; switch (u32->cfgtype) { case CFG_OIS_CONTROL: @@ -811,7 +813,6 @@ static long msm_ois_subdev_do_ioctl( settings.reg_setting = compat_ptr(settings32.reg_setting); - ois_data.cfgtype = u32->cfgtype; ois_data.cfg.settings = &settings; parg = &ois_data; break; @@ -819,6 +820,10 @@ static long msm_ois_subdev_do_ioctl( parg = &ois_data; break; } + break; + case VIDIOC_MSM_OIS_CFG: + pr_err("%s: invalid cmd 0x%x received\n", __func__, cmd); + return -EINVAL; } rc = msm_ois_subdev_ioctl(sd, cmd, parg); diff --git a/drivers/media/platform/msm/vidc/governors/msm_vidc_dyn_gov.c b/drivers/media/platform/msm/vidc/governors/msm_vidc_dyn_gov.c index 782b0eaa3648e..78d3dd9d752aa 100644 --- a/drivers/media/platform/msm/vidc/governors/msm_vidc_dyn_gov.c +++ b/drivers/media/platform/msm/vidc/governors/msm_vidc_dyn_gov.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015, 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 @@ -298,7 +298,7 @@ static unsigned long __calculate_vmem_plus_ab(struct vidc_bus_vote_data *d) vmem_plus = 1; dprintk(VIDC_WARN, "could not calculate vmem ab value due to core freq mismatch\n"); - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); } exit: diff --git a/drivers/media/platform/msm/vidc/hfi_packetization.c b/drivers/media/platform/msm/vidc/hfi_packetization.c index c62ea5fd6adcf..b3eeb22214480 100644 --- a/drivers/media/platform/msm/vidc/hfi_packetization.c +++ b/drivers/media/platform/msm/vidc/hfi_packetization.c @@ -2153,6 +2153,33 @@ int create_pkt_cmd_session_set_property( pkt->size += sizeof(u32) + sizeof(struct hfi_enable); break; } + case HAL_PARAM_VENC_IFRAMESIZE_TYPE: + { + enum hal_iframesize_type hal = + *(enum hal_iframesize_type *)pdata; + struct hfi_iframe_size *hfi = (struct hfi_iframe_size *) + &pkt->rg_property_data[1]; + + switch (hal) { + case HAL_IFRAMESIZE_TYPE_DEFAULT: + hfi->type = HFI_IFRAME_SIZE_DEFAULT; + break; + case HAL_IFRAMESIZE_TYPE_MEDIUM: + hfi->type = HFI_IFRAME_SIZE_MEDIUM; + break; + case HAL_IFRAMESIZE_TYPE_HUGE: + hfi->type = HFI_IFRAME_SIZE_HIGH; + break; + case HAL_IFRAMESIZE_TYPE_UNLIMITED: + hfi->type = HFI_IFRAME_SIZE_UNLIMITED; + break; + default: + return -ENOTSUPP; + } + pkt->rg_property_data[0] = HFI_PROPERTY_PARAM_VENC_IFRAMESIZE; + pkt->size += sizeof(u32) + sizeof(struct hfi_iframe_size); + break; + } /* FOLLOWING PROPERTIES ARE NOT IMPLEMENTED IN CORE YET */ case HAL_CONFIG_BUFFER_REQUIREMENTS: case HAL_CONFIG_PRIORITY: diff --git a/drivers/media/platform/msm/vidc/hfi_response_handler.c b/drivers/media/platform/msm/vidc/hfi_response_handler.c index b4bcf2a614351..a3063818ef99b 100644 --- a/drivers/media/platform/msm/vidc/hfi_response_handler.c +++ b/drivers/media/platform/msm/vidc/hfi_response_handler.c @@ -112,6 +112,7 @@ static int hfi_process_sess_evt_seq_changed(u32 device_id, u8 *data_ptr; int prop_id; enum msm_vidc_pixel_depth luma_bit_depth, chroma_bit_depth; + struct hfi_colour_space *colour_info; if (sizeof(struct hfi_msg_event_notify_packet) > pkt->size) { dprintk(VIDC_ERR, @@ -205,6 +206,18 @@ static int hfi_process_sess_evt_seq_changed(u32 device_id, data_ptr += sizeof(struct hfi_pic_struct); break; + case HFI_PROPERTY_PARAM_VDEC_COLOUR_SPACE: + data_ptr = data_ptr + sizeof(u32); + colour_info = + (struct hfi_colour_space *) data_ptr; + event_notify.colour_space = + colour_info->colour_space; + dprintk(VIDC_DBG, + "Colour space value is: %d\n", + colour_info->colour_space); + data_ptr += + sizeof(struct hfi_colour_space); + break; default: dprintk(VIDC_ERR, "%s cmd: %#x not supported\n", diff --git a/drivers/media/platform/msm/vidc/msm_smem.c b/drivers/media/platform/msm/vidc/msm_smem.c index bb2715654f45d..c97b1e59a423e 100644 --- a/drivers/media/platform/msm/vidc/msm_smem.c +++ b/drivers/media/platform/msm/vidc/msm_smem.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -75,6 +75,14 @@ static int get_device_address(struct smem_client *smem_client, goto mem_map_failed; } + /* Check if the dmabuf size matches expected size */ + if (buf->size < *buffer_size) { + rc = -EINVAL; + dprintk(VIDC_ERR, + "Size mismatch! Dmabuf size: %zu Expected Size: %lu", + buf->size, *buffer_size); + goto mem_buf_size_mismatch; + } /* Prepare a dma buf for dma on the given device */ attach = dma_buf_attach(buf, cb->dev); if (IS_ERR_OR_NULL(attach)) { @@ -143,6 +151,7 @@ static int get_device_address(struct smem_client *smem_client, dma_buf_unmap_attachment(attach, table, DMA_BIDIRECTIONAL); mem_map_table_failed: dma_buf_detach(buf, attach); +mem_buf_size_mismatch: mem_buf_attach_failed: dma_buf_put(buf); mem_map_failed: @@ -193,12 +202,12 @@ static void put_device_address(struct smem_client *smem_client, } } -static int ion_user_to_kernel(struct smem_client *client, int fd, u32 offset, +static int ion_user_to_kernel(struct smem_client *client, int fd, u32 size, struct msm_smem *mem, enum hal_buffer buffer_type) { struct ion_handle *hndl; ion_phys_addr_t iova = 0; - unsigned long buffer_size = 0; + unsigned long buffer_size = size; int rc = 0; unsigned long align = SZ_4K; unsigned long ion_flags = 0; @@ -207,10 +216,11 @@ static int ion_user_to_kernel(struct smem_client *client, int fd, u32 offset, dprintk(VIDC_DBG, "%s ion handle: %pK\n", __func__, hndl); if (IS_ERR_OR_NULL(hndl)) { dprintk(VIDC_ERR, "Failed to get handle: %pK, %d, %d, %pK\n", - client, fd, offset, hndl); + client, fd, size, hndl); rc = -ENOMEM; goto fail_import_fd; } + mem->kvaddr = NULL; rc = ion_handle_get_flags(client->clnt, hndl, &ion_flags); if (rc) { @@ -430,7 +440,7 @@ static void ion_delete_client(struct smem_client *client) ion_client_destroy(client->clnt); } -struct msm_smem *msm_smem_user_to_kernel(void *clt, int fd, u32 offset, +struct msm_smem *msm_smem_user_to_kernel(void *clt, int fd, u32 size, enum hal_buffer buffer_type) { struct smem_client *client = clt; @@ -447,7 +457,7 @@ struct msm_smem *msm_smem_user_to_kernel(void *clt, int fd, u32 offset, } switch (client->mem_type) { case SMEM_ION: - rc = ion_user_to_kernel(clt, fd, offset, mem, buffer_type); + rc = ion_user_to_kernel(clt, fd, size, mem, buffer_type); break; default: dprintk(VIDC_ERR, "Mem type not supported\n"); @@ -475,7 +485,7 @@ bool msm_smem_compare_buffers(void *clt, int fd, void *priv) } handle = ion_import_dma_buf(client->clnt, fd); ret = handle == priv; - handle ? ion_free(client->clnt, handle) : 0; + (!IS_ERR_OR_NULL(handle)) ? ion_free(client->clnt, handle) : 0; return ret; } diff --git a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c index 9d6f325d5a367..9c897d3458b10 100644 --- a/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_v4l2_vidc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -416,10 +416,29 @@ static ssize_t store_platform_version(struct device *dev, static DEVICE_ATTR(platform_version, S_IRUGO, show_platform_version, store_platform_version); +static ssize_t show_capability_version(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%d", + vidc_driver->capability_version); +} + +static ssize_t store_capability_version(struct device *dev, + struct device_attribute *attr, const char *buf, + size_t count) +{ + dprintk(VIDC_WARN, "store capability version is not allowed\n"); + return count; +} + +static DEVICE_ATTR(capability_version, S_IRUGO, show_capability_version, + store_capability_version); + static struct attribute *msm_vidc_core_attrs[] = { &dev_attr_pwr_collapse_delay.attr, &dev_attr_thermal_level.attr, &dev_attr_platform_version.attr, + &dev_attr_capability_version.attr, NULL }; @@ -434,11 +453,38 @@ static const struct of_device_id msm_vidc_dt_match[] = { {} }; -static int msm_vidc_probe_vidc_device(struct platform_device *pdev) +static u32 msm_vidc_read_efuse_version(struct platform_device *pdev, + struct version_table *table, const char *fuse_name) { - int rc = 0; void __iomem *base; struct resource *res; + u32 ret = 0; + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, fuse_name); + if (!res) { + dprintk(VIDC_DBG, "Failed to get resource %s\n", fuse_name); + goto exit; + } + base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); + if (!base) { + dprintk(VIDC_ERR, + "failed ioremap: res->start %#x, size %d\n", + (u32)res->start, (u32)resource_size(res)); + goto exit; + } else { + ret = readl_relaxed(base); + ret = (ret & table->version_mask) >> + table->version_shift; + + devm_iounmap(&pdev->dev, base); + } +exit: + return ret; +} + +static int msm_vidc_probe_vidc_device(struct platform_device *pdev) +{ + int rc = 0; struct msm_vidc_core *core; struct device *dev; int nr = BASE_DEVICE_NUMBER; @@ -553,32 +599,13 @@ static int msm_vidc_probe_vidc_device(struct platform_device *pdev) core->debugfs_root = msm_vidc_debugfs_init_core( core, vidc_driver->debugfs_root); - vidc_driver->platform_version = 0; - res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "efuse"); - if (!res) { - dprintk(VIDC_DBG, "failed to get efuse resource\n"); - } else { - base = devm_ioremap(&pdev->dev, res->start, resource_size(res)); - if (!base) { - dprintk(VIDC_ERR, - "failed efuse ioremap: res->start %#x, size %d\n", - (u32)res->start, (u32)resource_size(res)); - } else { - u32 efuse = 0; - struct platform_version_table *pf_ver_tbl = - core->resources.pf_ver_tbl; - - efuse = readl_relaxed(base); - vidc_driver->platform_version = - (efuse & pf_ver_tbl->version_mask) >> - pf_ver_tbl->version_shift; - dprintk(VIDC_DBG, - "efuse 0x%x, platform version 0x%x\n", - efuse, vidc_driver->platform_version); - - devm_iounmap(&pdev->dev, base); - } - } + vidc_driver->platform_version = + msm_vidc_read_efuse_version(pdev, + core->resources.pf_ver_tbl, "efuse"); + + vidc_driver->capability_version = + msm_vidc_read_efuse_version( + pdev, core->resources.pf_cap_tbl, "efuse2"); dprintk(VIDC_DBG, "populating sub devices\n"); /* @@ -762,6 +789,7 @@ static int __init msm_vidc_init(void) if (rc) { dprintk(VIDC_ERR, "Failed to register platform driver\n"); + debugfs_remove_recursive(vidc_driver->debugfs_root); kfree(vidc_driver); vidc_driver = NULL; } diff --git a/drivers/media/platform/msm/vidc/msm_vdec.c b/drivers/media/platform/msm/vidc/msm_vdec.c index 9ba4c16e179db..d3a18f61daef6 100644 --- a/drivers/media/platform/msm/vidc/msm_vdec.c +++ b/drivers/media/platform/msm/vidc/msm_vdec.c @@ -28,6 +28,8 @@ #define MB_SIZE_IN_PIXEL (16 * 16) #define MAX_OPERATING_FRAME_RATE (300 << 16) #define OPERATING_FRAME_RATE_STEP (1 << 16) +#define SLAVE_SIDE_CP_ALIGNMENT 0x100000 +#define MASTER_SIDE_CP_ALIGNMENT 0x1000 static const char *const mpeg_video_vidc_divx_format[] = { "DIVX Format 3", @@ -650,6 +652,20 @@ static u32 get_frame_size(struct msm_vidc_inst *inst, return frame_size; } +static u32 get_output_frame_size(struct msm_vidc_inst *inst, + const struct msm_vidc_format *fmt, + u32 height, u32 width, int plane) +{ + u32 frame_size = fmt->get_frame_size(plane, + height, width); + if (inst->flags & VIDC_SECURE) { + u32 alignment = inst->core->resources.slave_side_cp ? + SLAVE_SIDE_CP_ALIGNMENT : MASTER_SIDE_CP_ALIGNMENT; + frame_size = MSM_MEDIA_ALIGN(frame_size, alignment); + } + return frame_size; +} + static int is_ctrl_valid_for_codec(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) { @@ -1071,7 +1087,6 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) struct hfi_device *hdev; int rc = 0, i = 0, stride = 0, scanlines = 0, color_format = 0; unsigned int *plane_sizes = NULL, extra_idx = 0; - struct hal_buffer_requirements *bufreq; if (!inst || !f || !inst->core || !inst->core->device) { dprintk(VIDC_ERR, @@ -1156,15 +1171,15 @@ int msm_vdec_g_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) inst->prop.height[CAPTURE_PORT]); f->fmt.pix_mp.plane_fmt[0].sizeimage = - fmt->get_frame_size(0, - f->fmt.pix_mp.height, f->fmt.pix_mp.width); + get_output_frame_size(inst, fmt, + f->fmt.pix_mp.height, f->fmt.pix_mp.width, 0); extra_idx = EXTRADATA_IDX(fmt->num_planes); if (extra_idx && extra_idx < VIDEO_MAX_PLANES) { - bufreq = get_buff_req_buffer(inst, - HAL_BUFFER_EXTRADATA_OUTPUT); f->fmt.pix_mp.plane_fmt[extra_idx].sizeimage = - bufreq ? bufreq->buffer_size : 0; + VENUS_EXTRADATA_SIZE( + inst->prop.height[CAPTURE_PORT], + inst->prop.width[CAPTURE_PORT]); } for (i = 0; i < fmt->num_planes; ++i) @@ -1242,9 +1257,8 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) int ret = 0; int i; int max_input_size = 0; - struct hal_buffer_requirements *bufreq; - if (!inst || !f) { + if (!inst || !inst->core || !f) { dprintk(VIDC_ERR, "%s invalid parameters\n", __func__); return -EINVAL; } @@ -1288,21 +1302,17 @@ int msm_vdec_s_fmt(struct msm_vidc_inst *inst, struct v4l2_format *f) } f->fmt.pix_mp.plane_fmt[0].sizeimage = - fmt->get_frame_size(0, - f->fmt.pix_mp.height, f->fmt.pix_mp.width); + get_output_frame_size(inst, fmt, + f->fmt.pix_mp.height, f->fmt.pix_mp.width, 0); extra_idx = EXTRADATA_IDX(fmt->num_planes); if (extra_idx && extra_idx < VIDEO_MAX_PLANES) { - bufreq = get_buff_req_buffer(inst, - HAL_BUFFER_EXTRADATA_OUTPUT); f->fmt.pix_mp.plane_fmt[extra_idx].sizeimage = - bufreq ? bufreq->buffer_size : 0; + VENUS_EXTRADATA_SIZE( + inst->prop.height[CAPTURE_PORT], + inst->prop.width[CAPTURE_PORT]); } - for (i = 0; i < fmt->num_planes; ++i) - inst->bufq[CAPTURE_PORT].vb2_bufq.plane_sizes[i] = - f->fmt.pix_mp.plane_fmt[i].sizeimage; - f->fmt.pix_mp.num_planes = fmt->num_planes; for (i = 0; i < fmt->num_planes; ++i) { inst->bufq[CAPTURE_PORT].vb2_bufq.plane_sizes[i] = @@ -1590,12 +1600,10 @@ static int msm_vdec_queue_setup(struct vb2_queue *q, extra_idx = EXTRADATA_IDX(inst->fmts[CAPTURE_PORT]->num_planes); if (extra_idx && extra_idx < VIDEO_MAX_PLANES) { - bufreq = get_buff_req_buffer(inst, - HAL_BUFFER_EXTRADATA_OUTPUT); - if (bufreq) - sizes[extra_idx] = bufreq->buffer_size; - else - sizes[extra_idx] = 0; + sizes[extra_idx] = + VENUS_EXTRADATA_SIZE( + inst->prop.height[CAPTURE_PORT], + inst->prop.width[CAPTURE_PORT]); } break; default: @@ -1692,9 +1700,9 @@ static inline int start_streaming(struct msm_vidc_inst *inst) struct msm_vidc_format *fmt = NULL; fmt = inst->fmts[CAPTURE_PORT]; - buffer_size = fmt->get_frame_size(0, + buffer_size = get_output_frame_size(inst, fmt, inst->prop.height[CAPTURE_PORT], - inst->prop.width[CAPTURE_PORT]); + inst->prop.width[CAPTURE_PORT], 0); hdev = inst->core->device; if (msm_comm_get_stream_output_mode(inst) == diff --git a/drivers/media/platform/msm/vidc/msm_venc.c b/drivers/media/platform/msm/vidc/msm_venc.c index ec17a60f33047..c2de902779650 100644 --- a/drivers/media/platform/msm/vidc/msm_venc.c +++ b/drivers/media/platform/msm/vidc/msm_venc.c @@ -185,6 +185,13 @@ static const char *const timestamp_mode[] = { "Ignore", }; +static const char *const iframe_sizes[] = { + "Default", + "Medium", + "Huge", + "Unlimited" +}; + static struct msm_vidc_ctrl msm_venc_ctrls[] = { { .id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD, @@ -1300,6 +1307,20 @@ static struct msm_vidc_ctrl msm_venc_ctrls[] = { .default_value = V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE, .step = 1, }, + { + .id = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE, + .name = "Bounds of I-frame size", + .type = V4L2_CTRL_TYPE_MENU, + .minimum = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT, + .maximum = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED, + .default_value = V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT, + .menu_skip_mask = ~( + (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT) | + (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM) | + (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE) | + (1 << V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED)), + .qmenu = iframe_sizes, + }, }; static struct v4l2_ctrl *get_ctrl_from_cluster(int id, @@ -2142,6 +2163,19 @@ static inline int venc_v4l2_to_hal(int id, int value) default: goto unknown_value; } + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE: + switch (value) { + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT: + return HAL_IFRAMESIZE_TYPE_DEFAULT; + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM: + return HAL_IFRAMESIZE_TYPE_MEDIUM; + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE: + return HAL_IFRAMESIZE_TYPE_HUGE; + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED: + return HAL_IFRAMESIZE_TYPE_UNLIMITED; + default: + goto unknown_value; + } } unknown_value: @@ -2230,6 +2264,7 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) int frameqp = 0; int pic_order_cnt = 0; struct hal_video_signal_info signal_info = {0}; + enum hal_iframesize_type iframesize_type = HAL_IFRAMESIZE_TYPE_DEFAULT; if (!inst || !inst->core || !inst->core->device) { dprintk(VIDC_ERR, "%s invalid parameters\n", __func__); @@ -3005,7 +3040,10 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) case V4L2_CID_MPEG_VIDC_SET_PERF_LEVEL: switch (ctrl->val) { case V4L2_CID_MPEG_VIDC_PERF_LEVEL_NOMINAL: - inst->flags &= ~VIDC_TURBO; + if (inst->flags & VIDC_TURBO) { + inst->flags &= ~VIDC_TURBO; + msm_dcvs_init_load(inst); + } break; case V4L2_CID_MPEG_VIDC_PERF_LEVEL_TURBO: inst->flags |= VIDC_TURBO; @@ -3016,7 +3054,6 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) rc = -ENOTSUPP; break; } - msm_comm_scale_clocks_and_bus(inst); break; case V4L2_CID_MPEG_VIDC_VIDEO_H264_VUI_BITSTREAM_RESTRICT: @@ -3317,6 +3354,13 @@ static int try_set_ctrl(struct msm_vidc_inst *inst, struct v4l2_ctrl *ctrl) } pdata = &enable; break; + case V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE: + property_id = HAL_PARAM_VENC_IFRAMESIZE_TYPE; + iframesize_type = venc_v4l2_to_hal( + V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE, + ctrl->val); + pdata = &iframesize_type; + break; default: dprintk(VIDC_ERR, "Unsupported index: %x\n", ctrl->id); rc = -ENOTSUPP; diff --git a/drivers/media/platform/msm/vidc/msm_vidc.c b/drivers/media/platform/msm/vidc/msm_vidc.c index 0cab4cc3ef11c..f01590807d2f9 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc.c +++ b/drivers/media/platform/msm/vidc/msm_vidc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -316,6 +316,10 @@ struct buffer_info *device_to_uvaddr(struct msm_vidc_list *buf_list, static inline void populate_buf_info(struct buffer_info *binfo, struct v4l2_buffer *b, u32 i) { + if (i >= VIDEO_MAX_PLANES) { + dprintk(VIDC_ERR, "%s: Invalid input\n", __func__); + return; + } binfo->type = b->type; binfo->fd[i] = b->m.planes[i].reserved[0]; binfo->buff_off[i] = b->m.planes[i].reserved[1]; @@ -358,7 +362,7 @@ static struct msm_smem *map_buffer(struct msm_vidc_inst *inst, struct msm_smem *handle = NULL; handle = msm_comm_smem_user_to_kernel(inst, p->reserved[0], - p->reserved[1], + p->length, buffer_type); if (!handle) { dprintk(VIDC_ERR, @@ -434,8 +438,10 @@ int map_and_register_buf(struct msm_vidc_inst *inst, struct v4l2_buffer *b) goto exit; } - dprintk(VIDC_DBG, "[MAP] Create binfo = %pK fd = %d type = %d\n", - binfo, b->m.planes[0].reserved[0], b->type); + dprintk(VIDC_DBG, + "[MAP] Create binfo = %pK fd = %d size = %d type = %d\n", + binfo, b->m.planes[0].reserved[0], + b->m.planes[0].length, b->type); for (i = 0; i < b->length; ++i) { rc = 0; @@ -1186,6 +1192,7 @@ void *msm_vidc_open(int core_id, int session_type) inst->bit_depth = MSM_VIDC_BIT_DEPTH_8; inst->instant_bitrate = 0; inst->pic_struct = MSM_VIDC_PIC_STRUCT_PROGRESSIVE; + inst->colour_space = MSM_VIDC_BT601_6_525; for (i = SESSION_MSG_INDEX(SESSION_MSG_START); i <= SESSION_MSG_INDEX(SESSION_MSG_END); i++) { @@ -1300,10 +1307,12 @@ static void cleanup_instance(struct msm_vidc_inst *inst) if (inst->extradata_handle) msm_comm_smem_free(inst, inst->extradata_handle); - debugfs_remove_recursive(inst->debugfs_root); - mutex_lock(&inst->pending_getpropq.lock); - WARN_ON(!list_empty(&inst->pending_getpropq.list)); + if (!list_empty(&inst->pending_getpropq.list)) { + dprintk(VIDC_ERR, + "pending_getpropq not empty\n"); + WARN_ON(VIDC_DBG_WARN_ENABLE); + } mutex_unlock(&inst->pending_getpropq.lock); } } @@ -1331,6 +1340,7 @@ int msm_vidc_destroy(struct msm_vidc_inst *inst) for (i = 0; i < MAX_PORT_NUM; i++) vb2_queue_release(&inst->bufq[i].vb2_bufq); + msm_vidc_debugfs_deinit_inst(inst); pr_info(VIDC_DBG_TAG "Closed video instance: %pK\n", VIDC_MSG_PRIO2STRING(VIDC_INFO), inst); kfree(inst); diff --git a/drivers/media/platform/msm/vidc/msm_vidc_common.c b/drivers/media/platform/msm/vidc/msm_vidc_common.c index fb1851a239a2e..405b285119e37 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_common.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_common.c @@ -1194,12 +1194,14 @@ static void handle_event_change(enum hal_command_response cmd, void *data) * ptr[2] = flag to indicate bit depth or/and pic struct changed * ptr[3] = bit depth * ptr[4] = pic struct (progressive or interlaced) + * ptr[5] = colour space */ ptr = (u32 *)seq_changed_event.u.data; ptr[2] = 0x0; ptr[3] = inst->bit_depth; ptr[4] = inst->pic_struct; + ptr[5] = inst->colour_space; if (inst->bit_depth != event_notify->bit_depth) { inst->bit_depth = event_notify->bit_depth; @@ -1207,7 +1209,7 @@ static void handle_event_change(enum hal_command_response cmd, void *data) ptr[3] = inst->bit_depth; event = V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT; dprintk(VIDC_DBG, - "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to bit-depth change\n"); + "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to bit-depth change\n"); } if (inst->fmts[CAPTURE_PORT]->fourcc == V4L2_PIX_FMT_NV12 && @@ -1217,7 +1219,18 @@ static void handle_event_change(enum hal_command_response cmd, void *data) ptr[2] |= V4L2_EVENT_PICSTRUCT_FLAG; ptr[4] = inst->pic_struct; dprintk(VIDC_DBG, - "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to pic-struct change\n"); + "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to pic-struct change\n"); + } + + if (inst->bit_depth == MSM_VIDC_BIT_DEPTH_10 + && inst->colour_space != + event_notify->colour_space) { + inst->colour_space = event_notify->colour_space; + event = V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT; + ptr[2] |= V4L2_EVENT_COLOUR_SPACE_FLAG; + ptr[5] = inst->colour_space; + dprintk(VIDC_DBG, + "V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT due to colour space change\n"); } if (event == V4L2_EVENT_SEQ_CHANGED_INSUFFICIENT) { diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.c b/drivers/media/platform/msm/vidc/msm_vidc_debug.c index 8b87cac2ff243..559988b62ebc5 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_debug.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -12,6 +12,7 @@ */ #define CREATE_TRACE_POINTS +#define MAX_SSR_STRING_LEN 10 #include "msm_vidc_common.h" #include "msm_vidc_debug.h" #include "vidc_hfi_api.h" @@ -33,39 +34,31 @@ int msm_vidc_debug_timeout = 0; #define MAX_DBG_BUF_SIZE 4096 -struct debug_buffer { - char ptr[MAX_DBG_BUF_SIZE]; - char *curr; - u32 filled_size; -}; - -static struct debug_buffer dbg_buf; - -#define INIT_DBG_BUF(__buf) ({ \ - __buf.curr = __buf.ptr;\ - __buf.filled_size = 0; \ -}) - #define DYNAMIC_BUF_OWNER(__binfo) ({ \ atomic_read(&__binfo->ref_count) == 2 ? "video driver" : "firmware";\ }) +struct core_inst_pair { + struct msm_vidc_core *core; + struct msm_vidc_inst *inst; +}; + static int core_info_open(struct inode *inode, struct file *file) { file->private_data = inode->i_private; return 0; } -static u32 write_str(struct debug_buffer *buffer, const char *fmt, ...) +static u32 write_str(char *buffer, + size_t size, const char *fmt, ...) { va_list args; - u32 size; + u32 len; + va_start(args, fmt); - size = vscnprintf(buffer->curr, MAX_DBG_BUF_SIZE - 1, fmt, args); + len = vscnprintf(buffer, size, fmt, args); va_end(args); - buffer->curr += size; - buffer->filled_size += size; - return size; + return len; } static ssize_t core_info_read(struct file *file, char __user *buf, @@ -74,38 +67,55 @@ static ssize_t core_info_read(struct file *file, char __user *buf, struct msm_vidc_core *core = file->private_data; struct hfi_device *hdev; struct hal_fw_info fw_info = { {0} }; + char *dbuf, *cur, *end; int i = 0, rc = 0; + ssize_t len = 0; if (!core || !core->device) { dprintk(VIDC_ERR, "Invalid params, core: %pK\n", core); return 0; } + + dbuf = kzalloc(MAX_DBG_BUF_SIZE, GFP_KERNEL); + if (!dbuf) { + dprintk(VIDC_ERR, "%s: Allocation failed!\n", __func__); + return -ENOMEM; + } + cur = dbuf; + end = cur + MAX_DBG_BUF_SIZE; hdev = core->device; - INIT_DBG_BUF(dbg_buf); - write_str(&dbg_buf, "===============================\n"); - write_str(&dbg_buf, "CORE %d: %pK\n", core->id, core); - write_str(&dbg_buf, "===============================\n"); - write_str(&dbg_buf, "Core state: %d\n", core->state); + + cur += write_str(cur, end - cur, "===============================\n"); + cur += write_str(cur, end - cur, "CORE %d: %pK\n", core->id, core); + cur += write_str(cur, end - cur, "===============================\n"); + cur += write_str(cur, end - cur, "Core state: %d\n", core->state); rc = call_hfi_op(hdev, get_fw_info, hdev->hfi_device_data, &fw_info); if (rc) { dprintk(VIDC_WARN, "Failed to read FW info\n"); goto err_fw_info; } - write_str(&dbg_buf, "FW version : %s\n", &fw_info.version); - write_str(&dbg_buf, "base addr: 0x%x\n", fw_info.base_addr); - write_str(&dbg_buf, "register_base: 0x%x\n", fw_info.register_base); - write_str(&dbg_buf, "register_size: %u\n", fw_info.register_size); - write_str(&dbg_buf, "irq: %u\n", fw_info.irq); + cur += write_str(cur, end - cur, + "FW version : %s\n", &fw_info.version); + cur += write_str(cur, end - cur, + "base addr: 0x%x\n", fw_info.base_addr); + cur += write_str(cur, end - cur, + "register_base: 0x%x\n", fw_info.register_base); + cur += write_str(cur, end - cur, + "register_size: %u\n", fw_info.register_size); + cur += write_str(cur, end - cur, "irq: %u\n", fw_info.irq); err_fw_info: for (i = SYS_MSG_START; i < SYS_MSG_END; i++) { - write_str(&dbg_buf, "completions[%d]: %s\n", i, + cur += write_str(cur, end - cur, "completions[%d]: %s\n", i, completion_done(&core->completions[SYS_MSG_INDEX(i)]) ? "pending" : "done"); } - return simple_read_from_buffer(buf, count, ppos, - dbg_buf.ptr, dbg_buf.filled_size); + len = simple_read_from_buffer(buf, count, ppos, + dbuf, cur - dbuf); + + kfree(dbuf); + return len; } static const struct file_operations core_info_fops = { @@ -121,17 +131,33 @@ static int trigger_ssr_open(struct inode *inode, struct file *file) static ssize_t trigger_ssr_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos) { - u32 ssr_trigger_val; - int rc; + unsigned long ssr_trigger_val = 0; + int rc = 0; struct msm_vidc_core *core = filp->private_data; - rc = sscanf(buf, "%d", &ssr_trigger_val); - if (rc < 0) { + size_t size = MAX_SSR_STRING_LEN; + char kbuf[MAX_SSR_STRING_LEN + 1] = {0}; + + if (!count) + goto exit; + + if (count < size) + size = count; + + if (copy_from_user(kbuf, buf, size)) { + dprintk(VIDC_WARN, "%s User memory fault\n", __func__); + rc = -EFAULT; + goto exit; + } + + rc = kstrtoul(kbuf, 0, &ssr_trigger_val); + if (rc) { dprintk(VIDC_WARN, "returning error err %d\n", rc); rc = -EINVAL; } else { msm_vidc_trigger_ssr(core, ssr_trigger_val); rc = count; } +exit: return rc; } @@ -143,7 +169,9 @@ static const struct file_operations ssr_fops = { struct dentry *msm_vidc_debugfs_init_drv(void) { bool ok = false; - struct dentry *dir = debugfs_create_dir("msm_vidc", NULL); + struct dentry *dir = NULL; + + dir = debugfs_create_dir("msm_vidc", NULL); if (IS_ERR_OR_NULL(dir)) { dir = NULL; goto failed_create_dir; @@ -153,7 +181,7 @@ struct dentry *msm_vidc_debugfs_init_drv(void) struct dentry *f = debugfs_create_##__type(__name, S_IRUGO | S_IWUSR, \ dir, __value); \ if (IS_ERR_OR_NULL(f)) { \ - dprintk(VIDC_ERR, "Failed creating debugfs file '%pKd/%s'\n", \ + dprintk(VIDC_ERR, "Failed creating debugfs file '%pd/%s'\n", \ dir, __name); \ f = NULL; \ } \ @@ -212,6 +240,7 @@ struct dentry *msm_vidc_debugfs_init_core(struct msm_vidc_core *core, dprintk(VIDC_ERR, "Failed to create debugfs for msm_vidc\n"); goto failed_create_dir; } + if (!debugfs_create_file("info", S_IRUGO, dir, core, &core_info_fops)) { dprintk(VIDC_ERR, "debugfs_create_file: fail\n"); goto failed_create_dir; @@ -227,12 +256,15 @@ struct dentry *msm_vidc_debugfs_init_core(struct msm_vidc_core *core, static int inst_info_open(struct inode *inode, struct file *file) { + dprintk(VIDC_INFO, "Open inode ptr: %pK\n", inode->i_private); file->private_data = inode->i_private; return 0; } -static int publish_unreleased_reference(struct msm_vidc_inst *inst) +static int publish_unreleased_reference(struct msm_vidc_inst *inst, + char **dbuf, char *end) { + char *cur = *dbuf; struct buffer_info *temp = NULL; if (!inst) { @@ -241,132 +273,206 @@ static int publish_unreleased_reference(struct msm_vidc_inst *inst) } if (inst->buffer_mode_set[CAPTURE_PORT] == HAL_BUFFER_MODE_DYNAMIC) { - write_str(&dbg_buf, "Pending buffer references:\n"); + cur += write_str(cur, end - cur, "Pending buffer references\n"); mutex_lock(&inst->registeredbufs.lock); list_for_each_entry(temp, &inst->registeredbufs.list, list) { if (temp->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE && !temp->inactive && atomic_read(&temp->ref_count)) { - write_str(&dbg_buf, - "\tpending buffer: %#lx fd[0] = %d ref_count = %d held by: %s\n", - temp->device_addr[0], - temp->fd[0], - atomic_read(&temp->ref_count), - DYNAMIC_BUF_OWNER(temp)); + cur += write_str(cur, end - cur, + "\tpending buffer: %#lx fd[0] = %d ref_count = %d held by: %s\n", + temp->device_addr[0], + temp->fd[0], + atomic_read(&temp->ref_count), + DYNAMIC_BUF_OWNER(temp)); } } mutex_unlock(&inst->registeredbufs.lock); } + + *dbuf = cur; return 0; } +void put_inst_helper(struct kref *kref) +{ + struct msm_vidc_inst *inst = container_of(kref, + struct msm_vidc_inst, kref); + msm_vidc_destroy(inst); +} static ssize_t inst_info_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { - struct msm_vidc_inst *inst = file->private_data; - struct msm_vidc_core *core = inst ? inst->core : NULL; + struct core_inst_pair *idata = file->private_data; + struct msm_vidc_core *core; + struct msm_vidc_inst *inst, *temp = NULL; + char *dbuf, *cur, *end; int i, j; + ssize_t len = 0; - if (!inst || !core) { - dprintk(VIDC_ERR, "Invalid params, core: %pK inst %pK\n", - core, inst); + if (!idata || !idata->core || !idata->inst) { + dprintk(VIDC_ERR, "%s: Invalid params\n", __func__); return 0; } - if (!get_inst(core, inst)) { - dprintk(VIDC_ERR, "%s inactive session\n", __func__); + + core = idata->core; + inst = idata->inst; + + mutex_lock(&core->lock); + list_for_each_entry(temp, &core->instances, list) { + if (temp == inst) + break; + } + inst = ((temp == inst) && kref_get_unless_zero(&inst->kref)) ? + inst : NULL; + mutex_unlock(&core->lock); + + if (!inst) { + dprintk(VIDC_ERR, "%s: Instance has become obsolete", __func__); return 0; } - INIT_DBG_BUF(dbg_buf); - write_str(&dbg_buf, "===============================\n"); - write_str(&dbg_buf, "INSTANCE: %pK (%s)\n", inst, + dbuf = kzalloc(MAX_DBG_BUF_SIZE, GFP_KERNEL); + if (!dbuf) { + dprintk(VIDC_ERR, "%s: Allocation failed!\n", __func__); + len = -ENOMEM; + goto failed_alloc; + } + cur = dbuf; + end = cur + MAX_DBG_BUF_SIZE; + + cur += write_str(cur, end - cur, "==============================\n"); + cur += write_str(cur, end - cur, "INSTANCE: %pK (%s)\n", inst, inst->session_type == MSM_VIDC_ENCODER ? "Encoder" : "Decoder"); - write_str(&dbg_buf, "===============================\n"); - write_str(&dbg_buf, "core: %pK\n", inst->core); - write_str(&dbg_buf, "height: %d\n", inst->prop.height[CAPTURE_PORT]); - write_str(&dbg_buf, "width: %d\n", inst->prop.width[CAPTURE_PORT]); - write_str(&dbg_buf, "fps: %d\n", inst->prop.fps); - write_str(&dbg_buf, "state: %d\n", inst->state); - write_str(&dbg_buf, "secure: %d\n", !!(inst->flags & VIDC_SECURE)); - write_str(&dbg_buf, "-----------Formats-------------\n"); + cur += write_str(cur, end - cur, "==============================\n"); + cur += write_str(cur, end - cur, "core: %pK\n", inst->core); + cur += write_str(cur, end - cur, "height: %d\n", + inst->prop.height[CAPTURE_PORT]); + cur += write_str(cur, end - cur, "width: %d\n", + inst->prop.width[CAPTURE_PORT]); + cur += write_str(cur, end - cur, "fps: %d\n", inst->prop.fps); + cur += write_str(cur, end - cur, "state: %d\n", inst->state); + cur += write_str(cur, end - cur, "secure: %d\n", + !!(inst->flags & VIDC_SECURE)); + cur += write_str(cur, end - cur, "-----------Formats-------------\n"); for (i = 0; i < MAX_PORT_NUM; i++) { - write_str(&dbg_buf, "capability: %s\n", i == OUTPUT_PORT ? + cur += write_str(cur, end - cur, "capability: %s\n", + i == OUTPUT_PORT ? "Output" : "Capture"); + cur += write_str(cur, end - cur, "name : %s\n", + inst->fmts[i]->name); + cur += write_str(cur, end - cur, "planes : %d\n", + inst->fmts[i]->num_planes); + cur += write_str(cur, end - cur, + "type: %s\n", i == OUTPUT_PORT ? "Output" : "Capture"); - write_str(&dbg_buf, "name : %s\n", inst->fmts[i]->name); - write_str(&dbg_buf, "planes : %d\n", inst->fmts[i]->num_planes); - write_str( - &dbg_buf, "type: %s\n", inst->fmts[i]->type == OUTPUT_PORT ? - "Output" : "Capture"); - switch (inst->buffer_mode_set[i]) { - case HAL_BUFFER_MODE_STATIC: - write_str(&dbg_buf, "buffer mode : %s\n", "static"); - break; - case HAL_BUFFER_MODE_RING: - write_str(&dbg_buf, "buffer mode : %s\n", "ring"); - break; - case HAL_BUFFER_MODE_DYNAMIC: - write_str(&dbg_buf, "buffer mode : %s\n", "dynamic"); - break; - default: - write_str(&dbg_buf, "buffer mode : unsupported\n"); - } - - write_str(&dbg_buf, "count: %u\n", - inst->bufq[i].vb2_bufq.num_buffers); - for (j = 0; j < inst->fmts[i]->num_planes; j++) - write_str(&dbg_buf, "size for plane %d: %u\n", j, + cur += write_str(cur, end - cur, + "size for plane %d: %u\n", j, inst->bufq[i].vb2_bufq.plane_sizes[j]); if (i < MAX_PORT_NUM - 1) - write_str(&dbg_buf, "\n"); + cur += write_str(cur, end - cur, "\n"); } - write_str(&dbg_buf, "-------------------------------\n"); + cur += write_str(cur, end - cur, "-------------------------------\n"); for (i = SESSION_MSG_START; i < SESSION_MSG_END; i++) { - write_str(&dbg_buf, "completions[%d]: %s\n", i, + cur += write_str(cur, end - cur, "completions[%d]: %s\n", i, completion_done(&inst->completions[SESSION_MSG_INDEX(i)]) ? "pending" : "done"); } - write_str(&dbg_buf, "ETB Count: %d\n", inst->count.etb); - write_str(&dbg_buf, "EBD Count: %d\n", inst->count.ebd); - write_str(&dbg_buf, "FTB Count: %d\n", inst->count.ftb); - write_str(&dbg_buf, "FBD Count: %d\n", inst->count.fbd); - - publish_unreleased_reference(inst); - put_inst(inst); - return simple_read_from_buffer(buf, count, ppos, - dbg_buf.ptr, dbg_buf.filled_size); + + cur += write_str(cur, end - cur, "ETB Count: %d\n", inst->count.etb); + cur += write_str(cur, end - cur, "EBD Count: %d\n", inst->count.ebd); + cur += write_str(cur, end - cur, "FTB Count: %d\n", inst->count.ftb); + cur += write_str(cur, end - cur, "FBD Count: %d\n", inst->count.fbd); + + publish_unreleased_reference(inst, &cur, end); + len = simple_read_from_buffer(buf, count, ppos, + dbuf, cur - dbuf); + + kfree(dbuf); +failed_alloc: + kref_put(&inst->kref, put_inst_helper); + return len; +} + +static int inst_info_release(struct inode *inode, struct file *file) +{ + dprintk(VIDC_INFO, "Release inode ptr: %pK\n", inode->i_private); + file->private_data = NULL; + return 0; } static const struct file_operations inst_info_fops = { .open = inst_info_open, .read = inst_info_read, + .release = inst_info_release, }; struct dentry *msm_vidc_debugfs_init_inst(struct msm_vidc_inst *inst, struct dentry *parent) { - struct dentry *dir = NULL; + struct dentry *dir = NULL, *info = NULL; char debugfs_name[MAX_DEBUGFS_NAME]; + struct core_inst_pair *idata = NULL; + if (!inst) { dprintk(VIDC_ERR, "Invalid params, inst: %pK\n", inst); - goto failed_create_dir; + goto exit; } - snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%pK", inst); + snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%p", inst); + + idata = kzalloc(sizeof(struct core_inst_pair), GFP_KERNEL); + if (!idata) { + dprintk(VIDC_ERR, "%s: Allocation failed!\n", __func__); + goto exit; + } + + idata->core = inst->core; + idata->inst = inst; + dir = debugfs_create_dir(debugfs_name, parent); if (!dir) { dprintk(VIDC_ERR, "Failed to create debugfs for msm_vidc\n"); goto failed_create_dir; } - if (!debugfs_create_file("info", S_IRUGO, dir, inst, &inst_info_fops)) { + + info = debugfs_create_file("info", S_IRUGO, dir, + idata, &inst_info_fops); + if (!info) { dprintk(VIDC_ERR, "debugfs_create_file: fail\n"); - goto failed_create_dir; + goto failed_create_file; } + + dir->d_inode->i_private = info->d_inode->i_private; inst->debug.pdata[FRAME_PROCESSING].sampling = true; + return dir; + +failed_create_file: + debugfs_remove_recursive(dir); + dir = NULL; failed_create_dir: + kfree(idata); +exit: return dir; } +void msm_vidc_debugfs_deinit_inst(struct msm_vidc_inst *inst) +{ + struct dentry *dentry = NULL; + + if (!inst || !inst->debugfs_root) + return; + + dentry = inst->debugfs_root; + if (dentry->d_inode) { + dprintk(VIDC_INFO, "Destroy %pK\n", dentry->d_inode->i_private); + kfree(dentry->d_inode->i_private); + dentry->d_inode->i_private = NULL; + } + debugfs_remove_recursive(dentry); + inst->debugfs_root = NULL; +} + void msm_vidc_debugfs_update(struct msm_vidc_inst *inst, enum msm_vidc_debugfs_event e) { diff --git a/drivers/media/platform/msm/vidc/msm_vidc_debug.h b/drivers/media/platform/msm/vidc/msm_vidc_debug.h index 557ecee1b4709..ec9ec267a92e5 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_debug.h +++ b/drivers/media/platform/msm/vidc/msm_vidc_debug.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2015, 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 @@ -23,6 +23,7 @@ #endif #define VIDC_DBG_TAG VIDC_DBG_LABEL ": %4s: " +#define VIDC_DBG_WARN_ENABLE (msm_vidc_debug & VIDC_INFO) /* To enable messages OR these values and * echo the result to debugfs file. @@ -123,6 +124,7 @@ struct dentry *msm_vidc_debugfs_init_core(struct msm_vidc_core *core, struct dentry *parent); struct dentry *msm_vidc_debugfs_init_inst(struct msm_vidc_inst *inst, struct dentry *parent); +void msm_vidc_debugfs_deinit_inst(struct msm_vidc_inst *inst); void msm_vidc_debugfs_update(struct msm_vidc_inst *inst, enum msm_vidc_debugfs_event e); diff --git a/drivers/media/platform/msm/vidc/msm_vidc_internal.h b/drivers/media/platform/msm/vidc/msm_vidc_internal.h index f83234ccfec4b..22ab79eef75f3 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_internal.h +++ b/drivers/media/platform/msm/vidc/msm_vidc_internal.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -149,6 +149,7 @@ struct msm_vidc_drv { struct dentry *debugfs_root; int thermal_level; u32 platform_version; + u32 capability_version; }; struct msm_video_device { @@ -292,6 +293,7 @@ struct msm_vidc_inst { u32 buffers_held_in_driver; atomic_t in_flush; u32 pic_struct; + u32 colour_space; }; extern struct msm_vidc_drv *vidc_driver; diff --git a/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c b/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c index cddcb6fb045e5..b40eb827fe3c0 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c +++ b/drivers/media/platform/msm/vidc/msm_vidc_res_parse.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -83,6 +83,12 @@ static inline void msm_vidc_free_platform_version_table( res->pf_ver_tbl = NULL; } +static inline void msm_vidc_free_capability_version_table( + struct msm_vidc_platform_resources *res) +{ + res->pf_cap_tbl = NULL; +} + static inline void msm_vidc_free_freq_table( struct msm_vidc_platform_resources *res) { @@ -162,6 +168,7 @@ void msm_vidc_free_platform_resources( msm_vidc_free_regulator_table(res); msm_vidc_free_freq_table(res); msm_vidc_free_platform_version_table(res); + msm_vidc_free_capability_version_table(res); msm_vidc_free_dcvs_table(res); msm_vidc_free_dcvs_limit(res); msm_vidc_free_cycles_per_mb_table(res); @@ -392,6 +399,33 @@ static int msm_vidc_load_platform_version_table( return 0; } +static int msm_vidc_load_capability_version_table( + struct msm_vidc_platform_resources *res) +{ + int rc = 0; + struct platform_device *pdev = res->pdev; + + if (!of_find_property(pdev->dev.of_node, + "qcom,capability-version", NULL)) { + dprintk(VIDC_DBG, "qcom,capability-version not found\n"); + return 0; + } + + rc = msm_vidc_load_u32_table(pdev, pdev->dev.of_node, + "qcom,capability-version", + sizeof(*res->pf_cap_tbl), + (u32 **)&res->pf_cap_tbl, + NULL); + if (rc) { + dprintk(VIDC_ERR, + "%s: failed to read platform version table\n", + __func__); + return rc; + } + + return 0; +} + static int msm_vidc_load_allowed_clocks_table( struct msm_vidc_platform_resources *res) { @@ -1007,6 +1041,11 @@ int read_platform_resources_from_dt( if (rc) dprintk(VIDC_ERR, "Failed to load pf version table: %d\n", rc); + rc = msm_vidc_load_capability_version_table(res); + if (rc) + dprintk(VIDC_ERR, + "Failed to load pf capability table: %d\n", rc); + rc = msm_vidc_load_freq_table(res); if (rc) { dprintk(VIDC_ERR, "Failed to load freq table: %d\n", rc); diff --git a/drivers/media/platform/msm/vidc/msm_vidc_resources.h b/drivers/media/platform/msm/vidc/msm_vidc_resources.h index 1fc1888e81c62..792091a6f3804 100644 --- a/drivers/media/platform/msm/vidc/msm_vidc_resources.h +++ b/drivers/media/platform/msm/vidc/msm_vidc_resources.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -19,7 +19,7 @@ #include #define MAX_BUFFER_TYPES 32 -struct platform_version_table { +struct version_table { u32 version_mask; u32 version_shift; }; @@ -155,7 +155,8 @@ struct msm_vidc_platform_resources { phys_addr_t register_base; uint32_t register_size; uint32_t irq; - struct platform_version_table *pf_ver_tbl; + struct version_table *pf_ver_tbl; + struct version_table *pf_cap_tbl; struct allowed_clock_rates_table *allowed_clks_tbl; u32 allowed_clks_tbl_size; struct clock_freq_table clock_freq_tbl; diff --git a/drivers/media/platform/msm/vidc/venus_hfi.c b/drivers/media/platform/msm/vidc/venus_hfi.c index 5ff5b17ac8f2d..081459df9016c 100644 --- a/drivers/media/platform/msm/vidc/venus_hfi.c +++ b/drivers/media/platform/msm/vidc/venus_hfi.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -105,7 +105,11 @@ static int __tzbsp_set_video_state(enum tzbsp_video_state state); */ static inline void __strict_check(struct venus_hfi_device *device) { - WARN_ON(!mutex_is_locked(&device->lock)); + if (!mutex_is_locked(&device->lock)) { + dprintk(VIDC_WARN, + "device->lock mutex is not locked\n"); + WARN_ON(VIDC_DBG_WARN_ENABLE); + } } static inline void __set_state(struct venus_hfi_device *device, @@ -267,7 +271,7 @@ static int __acquire_regulator(struct regulator_info *rinfo) if (!regulator_is_enabled(rinfo->regulator)) { dprintk(VIDC_WARN, "Regulator is not enabled %s\n", rinfo->name); - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); } return rc; @@ -617,7 +621,7 @@ static void __write_register(struct venus_hfi_device *device, if (!device->power_enabled) { dprintk(VIDC_WARN, "HFI Write register failed : Power is OFF\n"); - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); return; } @@ -643,7 +647,7 @@ static int __read_register(struct venus_hfi_device *device, u32 reg) if (!device->power_enabled) { dprintk(VIDC_WARN, "HFI Read register failed : Power is OFF\n"); - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); return -EINVAL; } @@ -1346,7 +1350,7 @@ static int __halt_axi(struct venus_hfi_device *device) if (!device->power_enabled) { dprintk(VIDC_WARN, "Clocks are OFF, skipping AXI HALT\n"); - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); return -EINVAL; } @@ -3532,7 +3536,11 @@ static int __response_handler(struct venus_hfi_device *device) if (session_id) { struct hal_session *session = NULL; - WARN_ON(upper_32_bits((uintptr_t)*session_id) != 0); + if (upper_32_bits((uintptr_t)*session_id) != 0) { + dprintk(VIDC_WARN, + "Upper 32 bits of session_id != 0\n"); + WARN_ON(VIDC_DBG_WARN_ENABLE); + } session = __get_session(device, (u32)(uintptr_t)*session_id); if (!session) { @@ -4072,7 +4080,7 @@ static int __disable_regulator(struct regulator_info *rinfo) disable_regulator_failed: /* Bring attention to this issue */ - WARN_ON(1); + WARN_ON(VIDC_DBG_WARN_ENABLE); return rc; } diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_api.h b/drivers/media/platform/msm/vidc/vidc_hfi_api.h index 57a49c66c7da5..e2e47b9d6412e 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_api.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_api.h @@ -242,6 +242,7 @@ enum hal_property { HAL_PARAM_VENC_VIDEO_SIGNAL_INFO, HAL_PARAM_VENC_SESSION_QP_RANGE_PACKED, HAL_PARAM_VENC_H264_TRANSFORM_8x8, + HAL_PARAM_VENC_IFRAMESIZE_TYPE, }; enum hal_domain { @@ -1002,6 +1003,13 @@ struct hal_video_signal_info { bool full_range; }; +enum hal_iframesize_type { + HAL_IFRAMESIZE_TYPE_DEFAULT, + HAL_IFRAMESIZE_TYPE_MEDIUM, + HAL_IFRAMESIZE_TYPE_HUGE, + HAL_IFRAMESIZE_TYPE_UNLIMITED, +}; + enum vidc_resource_id { VIDC_RESOURCE_NONE, VIDC_RESOURCE_OCMEM, @@ -1357,6 +1365,7 @@ struct msm_vidc_cb_event { ion_phys_addr_t packet_buffer; ion_phys_addr_t extra_data_buffer; u32 pic_struct; + u32 colour_space; }; struct msm_vidc_cb_data_done { diff --git a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h index 23240746baf16..bb9958b0a819a 100644 --- a/drivers/media/platform/msm/vidc/vidc_hfi_helper.h +++ b/drivers/media/platform/msm/vidc/vidc_hfi_helper.h @@ -293,6 +293,8 @@ struct hfi_buffer_info { (HFI_PROPERTY_PARAM_VDEC_COMMON_START + 0x007) #define HFI_PROPERTY_PARAM_VDEC_PIC_STRUCT \ (HFI_PROPERTY_PARAM_VDEC_COMMON_START + 0x009) +#define HFI_PROPERTY_PARAM_VDEC_COLOUR_SPACE \ + (HFI_PROPERTY_PARAM_VDEC_COMMON_START + 0x00A) #define HFI_PROPERTY_CONFIG_VDEC_COMMON_START \ @@ -384,6 +386,8 @@ struct hfi_buffer_info { (HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x031) #define HFI_PROPERTY_PARAM_VENC_VQZIP_SEI_TYPE \ (HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x033) +#define HFI_PROPERTY_PARAM_VENC_IFRAMESIZE \ + (HFI_PROPERTY_PARAM_VENC_COMMON_START + 0x034) #define HFI_PROPERTY_CONFIG_VENC_COMMON_START \ (HFI_DOMAIN_BASE_VENC + HFI_ARCH_COMMON_OFFSET + 0x6000) @@ -435,6 +439,10 @@ struct hfi_bitrate { u32 layer_id; }; +struct hfi_colour_space { + u32 colour_space; +}; + #define HFI_CAPABILITY_FRAME_WIDTH (HFI_COMMON_BASE + 0x1) #define HFI_CAPABILITY_FRAME_HEIGHT (HFI_COMMON_BASE + 0x2) #define HFI_CAPABILITY_MBS_PER_FRAME (HFI_COMMON_BASE + 0x3) @@ -882,6 +890,14 @@ struct hfi_aspect_ratio { u32 aspect_height; }; +#define HFI_IFRAME_SIZE_DEFAULT (HFI_COMMON_BASE + 0x1) +#define HFI_IFRAME_SIZE_MEDIUM (HFI_COMMON_BASE + 0x2) +#define HFI_IFRAME_SIZE_HIGH (HFI_COMMON_BASE + 0x3) +#define HFI_IFRAME_SIZE_UNLIMITED (HFI_COMMON_BASE + 0x4) +struct hfi_iframe_size { + u32 type; +}; + #define HFI_MVC_BUFFER_LAYOUT_TOP_BOTTOM (0) #define HFI_MVC_BUFFER_LAYOUT_SIDEBYSIDE (1) #define HFI_MVC_BUFFER_LAYOUT_SEQ (2) diff --git a/drivers/media/radio/radio-iris-transport.c b/drivers/media/radio/radio-iris-transport.c index c6e432fdd27de..1f5efc022b467 100644 --- a/drivers/media/radio/radio-iris-transport.c +++ b/drivers/media/radio/radio-iris-transport.c @@ -9,6 +9,7 @@ * * Copyright (C) 2002-2003 Maxim Krasnyansky * Copyright (C) 2004-2006 Marcel Holtmann + * Copyright (C) 2018 XiaoMi, 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 @@ -210,6 +211,9 @@ static void radio_hci_smd_deregister(void) { FMDBG(""); + /* may deregistered by hcismd_fm_set_enable already */ + if (hs.hdev == NULL) + return; radio_hci_unregister_dev(); kfree(hs.hdev); hs.hdev = NULL; diff --git a/drivers/media/radio/radio-iris.c b/drivers/media/radio/radio-iris.c index f2b430946e899..f9e60653087f7 100644 --- a/drivers/media/radio/radio-iris.c +++ b/drivers/media/radio/radio-iris.c @@ -628,11 +628,15 @@ int radio_hci_unregister_dev(void) struct iris_device *radio = video_get_drvdata(video_get_dev()); struct radio_hci_dev *hdev = NULL; - if (!radio && !radio->fm_hdev) { - FMDERR("radio/hdev is null"); + if (!radio) { + FMDERR("radio is null"); return -EINVAL; } hdev = radio->fm_hdev; + if (!hdev) { + FMDERR("hdev is null"); + return -EINVAL; + } tasklet_kill(&hdev->rx_task); tasklet_kill(&hdev->cmd_task); @@ -3340,6 +3344,7 @@ static int iris_vidioc_g_ctrl(struct file *file, void *priv, struct hci_fm_def_data_rd_req rd; int lsb, msb; + mutex_lock(&fm_smd_enable); if (unlikely(radio == NULL)) { FMDERR(":radio is null"); retval = -EINVAL; @@ -3677,6 +3682,7 @@ static int iris_vidioc_g_ctrl(struct file *file, void *priv, } END: + mutex_unlock(&fm_smd_enable); if (retval > 0) retval = -EINVAL; if (ctrl != NULL && retval < 0) @@ -3693,6 +3699,7 @@ static int iris_vidioc_g_ext_ctrls(struct file *file, void *priv, struct iris_device *radio = video_get_drvdata(video_devdata(file)); struct hci_fm_def_data_rd_req default_data_rd; + mutex_lock(&fm_smd_enable); if (unlikely(radio == NULL)) { FMDERR(":radio is null"); retval = -EINVAL; @@ -3724,6 +3731,7 @@ static int iris_vidioc_g_ext_ctrls(struct file *file, void *priv, } END: + mutex_unlock(&fm_smd_enable); if (retval > 0) retval = -EINVAL; @@ -3741,10 +3749,12 @@ static int iris_vidioc_s_ext_ctrls(struct file *file, void *priv, struct hci_fm_set_cal_req_proc proc_cal_req; struct hci_fm_set_spur_table_req spur_tbl_req; char *spur_data; + char tmp_buf[2]; struct iris_device *radio = video_get_drvdata(video_devdata(file)); char *data = NULL; + mutex_lock(&fm_smd_enable); if (unlikely(radio == NULL)) { FMDERR(":radio is null"); retval = -EINVAL; @@ -3877,11 +3887,32 @@ static int iris_vidioc_s_ext_ctrls(struct file *file, void *priv, case V4L2_CID_PRIVATE_IRIS_SET_SPURTABLE: memset(&spur_tbl_req, 0, sizeof(spur_tbl_req)); data = (ctrl->controls[0]).string; - bytes_to_copy = (ctrl->controls[0]).size; - spur_tbl_req.mode = data[0]; - spur_tbl_req.no_of_freqs_entries = data[1]; - spur_data = kmalloc((data[1] * SPUR_DATA_LEN) + 2, - GFP_ATOMIC); + if (copy_from_user(&bytes_to_copy, &((ctrl->controls[0]).size), + sizeof(bytes_to_copy))) { + retval = -EFAULT; + goto END; + } + if (copy_from_user(&tmp_buf[0], &data[0], + sizeof(tmp_buf))) { + retval = -EFAULT; + goto END; + } + spur_tbl_req.mode = tmp_buf[0]; + spur_tbl_req.no_of_freqs_entries = tmp_buf[1]; + + if (((spur_tbl_req.no_of_freqs_entries * SPUR_DATA_LEN) != + bytes_to_copy - 2) || + ((spur_tbl_req.no_of_freqs_entries * SPUR_DATA_LEN) > + 2 * FM_SPUR_TBL_SIZE)) { + FMDERR("Invalid data len: data[1] = %d, bytes = %zu", + spur_tbl_req.no_of_freqs_entries, + bytes_to_copy); + retval = -EINVAL; + goto END; + } + spur_data = + kmalloc((spur_tbl_req.no_of_freqs_entries * SPUR_DATA_LEN) + + 2, GFP_ATOMIC); if (!spur_data) { FMDERR("Allocation failed for Spur data"); retval = -EFAULT; @@ -3896,7 +3927,8 @@ static int iris_vidioc_s_ext_ctrls(struct file *file, void *priv, if (spur_tbl_req.no_of_freqs_entries <= ENTRIES_EACH_CMD) { memcpy(&spur_tbl_req.spur_data[0], spur_data, - (data[1] * SPUR_DATA_LEN)); + (spur_tbl_req.no_of_freqs_entries * + SPUR_DATA_LEN)); retval = radio_hci_request(radio->fm_hdev, hci_fm_set_spur_tbl_req, (unsigned long)&spur_tbl_req, @@ -3934,6 +3966,7 @@ static int iris_vidioc_s_ext_ctrls(struct file *file, void *priv, } END: + mutex_unlock(&fm_smd_enable); if (retval > 0) retval = -EINVAL; @@ -3957,6 +3990,7 @@ static int iris_vidioc_s_ctrl(struct file *file, void *priv, __u8 intf_det_low_th, intf_det_high_th, intf_det_out; unsigned int spur_freq; + mutex_lock(&fm_smd_enable); if (unlikely(radio == NULL)) { FMDERR(":radio is null"); retval = -EINVAL; @@ -4957,6 +4991,7 @@ static int iris_vidioc_s_ctrl(struct file *file, void *priv, } END: + mutex_unlock(&fm_smd_enable); if (retval > 0) retval = -EINVAL; @@ -5060,11 +5095,12 @@ static int iris_vidioc_g_tuner(struct file *file, void *priv, FMDERR("Invalid Tuner Index"); return -EINVAL; } + mutex_lock(&fm_smd_enable); if (radio->mode == FM_RECV) { retval = hci_cmd(HCI_FM_GET_STATION_PARAM_CMD, radio->fm_hdev); if (retval < 0) { FMDERR("Failed to Get station params"); - return retval; + goto END; } tuner->type = V4L2_TUNER_RADIO; tuner->rangelow = @@ -5080,16 +5116,20 @@ static int iris_vidioc_g_tuner(struct file *file, void *priv, retval = hci_cmd(HCI_FM_GET_TX_CONFIG, radio->fm_hdev); if (retval < 0) { FMDERR("get Tx config failed %d\n", retval); - return retval; + goto END; } tuner->type = V4L2_TUNER_RADIO; tuner->rangelow = radio->trans_conf.band_low_limit * TUNE_PARAM; tuner->rangehigh = radio->trans_conf.band_high_limit * TUNE_PARAM; - } else - return -EINVAL; - return 0; + } else { + retval = -EINVAL; + goto END; + } +END: + mutex_unlock(&fm_smd_enable); + return retval; } static int iris_vidioc_s_tuner(struct file *file, void *priv, @@ -5111,6 +5151,7 @@ static int iris_vidioc_s_tuner(struct file *file, void *priv, if (tuner->index > 0) return -EINVAL; + mutex_lock(&fm_smd_enable); if (radio->mode == FM_RECV) { radio->recv_conf.band_low_limit = tuner->rangelow / TUNE_PARAM; radio->recv_conf.band_high_limit = @@ -5126,17 +5167,22 @@ static int iris_vidioc_s_tuner(struct file *file, void *priv, &radio->stereo_mode, radio->fm_hdev); } - if (retval < 0) + if (retval < 0) { FMDERR(": set tuner failed with %d\n", retval); - return retval; + goto END; + } } else if (radio->mode == FM_TRANS) { radio->trans_conf.band_low_limit = tuner->rangelow / TUNE_PARAM; radio->trans_conf.band_high_limit = tuner->rangehigh / TUNE_PARAM; - } else - return -EINVAL; + } else { + retval = -EINVAL; + goto END; + } +END: + mutex_unlock(&fm_smd_enable); return retval; } @@ -5173,6 +5219,7 @@ static int iris_vidioc_s_frequency(struct file *file, void *priv, if (freq->type != V4L2_TUNER_RADIO) return -EINVAL; + mutex_lock(&fm_smd_enable); /* We turn off RDS prior to tuning to a new station. because of a bug in SoC which prevents tuning during RDS transmission. @@ -5197,6 +5244,7 @@ static int iris_vidioc_s_frequency(struct file *file, void *priv, radio->fm_hdev); } + mutex_unlock(&fm_smd_enable); if (retval < 0) FMDERR(" set frequency failed with %d\n", retval); return retval; @@ -5213,6 +5261,7 @@ static int iris_fops_release(struct file *file) FMDBG("state %d", radio->mode); mutex_lock(&radio->lock); + mutex_lock(&fm_smd_enable); if (radio->mode == FM_OFF) goto END; @@ -5233,12 +5282,12 @@ static int iris_fops_release(struct file *file) radio->is_fm_closing = false; } else if (radio->mode == FM_CALIB) { radio->mode = FM_OFF; + mutex_unlock(&fm_smd_enable); mutex_unlock(&radio->lock); return retval; } END: FMDBG("mode %d", radio->mode); - mutex_lock(&fm_smd_enable); if (radio->fm_hdev != NULL) radio->fm_hdev->close_smd(); mutex_unlock(&fm_smd_enable); diff --git a/drivers/media/radio/silabs/radio-silabs.c b/drivers/media/radio/silabs/radio-silabs.c index af2e74688aa9f..53d557b53ad2c 100644 --- a/drivers/media/radio/silabs/radio-silabs.c +++ b/drivers/media/radio/silabs/radio-silabs.c @@ -1357,7 +1357,7 @@ static bool is_valid_freq(struct silabs_fm_device *radio, u32 freq) { u32 band_low_limit = radio->recv_conf.band_low_limit * TUNE_STEP_SIZE; u32 band_high_limit = radio->recv_conf.band_high_limit * TUNE_STEP_SIZE; - u8 spacing; + u8 spacing = 0; if (radio->recv_conf.ch_spacing == 0) spacing = CH_SPACING_200; @@ -1365,6 +1365,8 @@ static bool is_valid_freq(struct silabs_fm_device *radio, u32 freq) spacing = CH_SPACING_100; else if (radio->recv_conf.ch_spacing == 2) spacing = CH_SPACING_50; + else + return false; if ((freq >= band_low_limit) && (freq <= band_high_limit) && diff --git a/drivers/media/tuners/tuner-xc2028.c b/drivers/media/tuners/tuner-xc2028.c index d12f5e4ad8bf4..36c7f2a077b48 100644 --- a/drivers/media/tuners/tuner-xc2028.c +++ b/drivers/media/tuners/tuner-xc2028.c @@ -1403,11 +1403,12 @@ static int xc2028_set_config(struct dvb_frontend *fe, void *priv_cfg) * in order to avoid troubles during device release. */ kfree(priv->ctrl.fname); + priv->ctrl.fname = NULL; memcpy(&priv->ctrl, p, sizeof(priv->ctrl)); if (p->fname) { priv->ctrl.fname = kstrdup(p->fname, GFP_KERNEL); if (priv->ctrl.fname == NULL) - rc = -ENOMEM; + return -ENOMEM; } /* diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c index 3e59b288b8a89..57d2f89350d26 100644 --- a/drivers/media/usb/uvc/uvc_ctrl.c +++ b/drivers/media/usb/uvc/uvc_ctrl.c @@ -1991,6 +1991,9 @@ int uvc_ctrl_add_mapping(struct uvc_video_chain *chain, if (!found) return -ENOENT; + if (ctrl->info.size < mapping->size) + return -EINVAL; + if (mutex_lock_interruptible(&chain->ctrl_mutex)) return -ERESTARTSYS; diff --git a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c index cade82fbebcf2..4b611fe0f9ecb 100644 --- a/drivers/media/v4l2-core/v4l2-compat-ioctl32.c +++ b/drivers/media/v4l2-core/v4l2-compat-ioctl32.c @@ -20,6 +20,13 @@ #include #include +#define convert_in_user(srcptr, dstptr) \ +({ \ + typeof(*srcptr) val; \ + \ + get_user(val, srcptr) || put_user(val, dstptr); \ +}) + static long native_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { long ret = -ENOIOCTLCMD; @@ -45,27 +52,45 @@ struct v4l2_window32 { compat_caddr_t bitmap; }; -static int get_v4l2_window32(struct v4l2_window *kp, struct v4l2_window32 __user *up) +static int bufsize_v4l2_window32(struct v4l2_window32 __user *up) { + __u32 clipcount; + + if (get_user(clipcount, &up->clipcount)) + return -EFAULT; + if (clipcount > 2048) + return -EINVAL; + return clipcount * sizeof(struct v4l2_clip); +} + +static int get_v4l2_window32(struct v4l2_window __user *kp, struct + v4l2_window32 __user *up, void __user *aux_buf, int aux_space) +{ + __u32 clipcount; + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_window32)) || - copy_from_user(&kp->w, &up->w, sizeof(up->w)) || - get_user(kp->field, &up->field) || - get_user(kp->chromakey, &up->chromakey) || - get_user(kp->clipcount, &up->clipcount)) + copy_in_user(&kp->w, &up->w, sizeof(up->w)) || + convert_in_user(&up->field, &kp->field) || + convert_in_user(&up->chromakey, &kp->chromakey) || + get_user(clipcount, &up->clipcount) || + put_user(clipcount, &kp->clipcount)) return -EFAULT; - if (kp->clipcount > 2048) + if (clipcount > 2048) return -EINVAL; - if (kp->clipcount) { + if (clipcount) { struct v4l2_clip32 __user *uclips; struct v4l2_clip __user *kclips; - int n = kp->clipcount; + int n = clipcount; compat_caddr_t p; if (get_user(p, &up->clips)) return -EFAULT; uclips = compat_ptr(p); - kclips = compat_alloc_user_space(n * sizeof(struct v4l2_clip)); - kp->clips = kclips; + if (aux_space < n * sizeof(struct v4l2_clip)) + return -EFAULT; + kclips = aux_buf; + if (put_user(kclips, &kp->clips)) + return -EFAULT; while (--n >= 0) { if (copy_in_user(&kclips->c, &uclips->c, sizeof(uclips->c))) return -EFAULT; @@ -74,75 +99,77 @@ static int get_v4l2_window32(struct v4l2_window *kp, struct v4l2_window32 __user uclips += 1; kclips += 1; } - } else - kp->clips = NULL; + } else { + if (put_user(NULL, &kp->clips)) + return -EFAULT; + } return 0; } -static int put_v4l2_window32(struct v4l2_window *kp, struct v4l2_window32 __user *up) +static int put_v4l2_window32(struct v4l2_window __user *kp, struct v4l2_window32 __user *up) { - if (copy_to_user(&up->w, &kp->w, sizeof(kp->w)) || - put_user(kp->field, &up->field) || - put_user(kp->chromakey, &up->chromakey) || - put_user(kp->clipcount, &up->clipcount)) - return -EFAULT; + if (copy_in_user(&up->w, &kp->w, sizeof(kp->w)) || + convert_in_user(&kp->field, &up->field) || + convert_in_user(&kp->chromakey, &up->chromakey) || + convert_in_user(&kp->clipcount, &up->clipcount)) + return -EFAULT; return 0; } -static inline int get_v4l2_pix_format(struct v4l2_pix_format *kp, struct v4l2_pix_format __user *up) +static inline int get_v4l2_pix_format(struct v4l2_pix_format __user *kp, struct v4l2_pix_format __user *up) { - if (copy_from_user(kp, up, sizeof(struct v4l2_pix_format))) + if (copy_in_user(kp, up, sizeof(struct v4l2_pix_format))) return -EFAULT; return 0; } -static inline int get_v4l2_pix_format_mplane(struct v4l2_pix_format_mplane *kp, +static inline int get_v4l2_pix_format_mplane(struct v4l2_pix_format_mplane __user *kp, struct v4l2_pix_format_mplane __user *up) { - if (copy_from_user(kp, up, sizeof(struct v4l2_pix_format_mplane))) + if (copy_in_user(kp, up, sizeof(struct v4l2_pix_format_mplane))) return -EFAULT; return 0; } -static inline int put_v4l2_pix_format(struct v4l2_pix_format *kp, struct v4l2_pix_format __user *up) +static inline int put_v4l2_pix_format(struct v4l2_pix_format __user *kp, struct v4l2_pix_format __user *up) { - if (copy_to_user(up, kp, sizeof(struct v4l2_pix_format))) + if (copy_in_user(up, kp, sizeof(struct v4l2_pix_format))) return -EFAULT; return 0; } -static inline int put_v4l2_pix_format_mplane(struct v4l2_pix_format_mplane *kp, +static inline int put_v4l2_pix_format_mplane(struct v4l2_pix_format_mplane __user *kp, struct v4l2_pix_format_mplane __user *up) { - if (copy_to_user(up, kp, sizeof(struct v4l2_pix_format_mplane))) + if (copy_in_user(up, kp, sizeof(struct v4l2_pix_format_mplane))) return -EFAULT; return 0; } -static inline int get_v4l2_vbi_format(struct v4l2_vbi_format *kp, struct v4l2_vbi_format __user *up) +static inline int get_v4l2_vbi_format(struct v4l2_vbi_format __user *kp, struct v4l2_vbi_format __user *up) { - if (copy_from_user(kp, up, sizeof(struct v4l2_vbi_format))) + if (copy_in_user(kp, up, sizeof(struct v4l2_vbi_format))) return -EFAULT; return 0; } -static inline int put_v4l2_vbi_format(struct v4l2_vbi_format *kp, struct v4l2_vbi_format __user *up) +static inline int put_v4l2_vbi_format(struct v4l2_vbi_format __user *kp, struct v4l2_vbi_format __user *up) { - if (copy_to_user(up, kp, sizeof(struct v4l2_vbi_format))) + if (copy_in_user(up, kp, sizeof(struct v4l2_vbi_format))) return -EFAULT; return 0; } -static inline int get_v4l2_sliced_vbi_format(struct v4l2_sliced_vbi_format *kp, struct v4l2_sliced_vbi_format __user *up) +static inline int get_v4l2_sliced_vbi_format(struct v4l2_sliced_vbi_format __user *kp, struct v4l2_sliced_vbi_format __user *up) { - if (copy_from_user(kp, up, sizeof(struct v4l2_sliced_vbi_format))) + if (copy_in_user(kp, up, sizeof(struct v4l2_sliced_vbi_format))) return -EFAULT; return 0; } -static inline int put_v4l2_sliced_vbi_format(struct v4l2_sliced_vbi_format *kp, struct v4l2_sliced_vbi_format __user *up) +static inline int put_v4l2_sliced_vbi_format(struct v4l2_sliced_vbi_format __user *kp, struct v4l2_sliced_vbi_format __user *up) { - if (copy_to_user(up, kp, sizeof(struct v4l2_sliced_vbi_format))) + if (copy_in_user(up, kp, sizeof(struct v4l2_sliced_vbi_format))) return -EFAULT; return 0; } @@ -176,12 +203,31 @@ struct v4l2_create_buffers32 { __u32 reserved[8]; }; -static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up) +static int __bufsize_v4l2_format32(struct v4l2_format32 __user *up) { - if (get_user(kp->type, &up->type)) + __u32 type; + + if (get_user(type, &up->type)) return -EFAULT; - switch (kp->type) { + switch (type) { + case V4L2_BUF_TYPE_VIDEO_OVERLAY: + case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: + return bufsize_v4l2_window32(&up->fmt.win); + default: + return 0; + } +} + +static int __get_v4l2_format32(struct v4l2_format __user *kp, struct + v4l2_format32 __user *up, void __user *aux_buf, int aux_space) +{ + __u32 type; + + if (get_user(type, &up->type) || put_user(type, &kp->type)) + return -EFAULT; + + switch (type) { case V4L2_BUF_TYPE_VIDEO_CAPTURE: case V4L2_BUF_TYPE_VIDEO_OUTPUT: return get_v4l2_pix_format(&kp->fmt.pix, &up->fmt.pix); @@ -191,7 +237,7 @@ static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us &up->fmt.pix_mp); case V4L2_BUF_TYPE_VIDEO_OVERLAY: case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: - return get_v4l2_window32(&kp->fmt.win, &up->fmt.win); + return get_v4l2_window32(&kp->fmt.win, &up->fmt.win, aux_buf, aux_space); case V4L2_BUF_TYPE_VBI_CAPTURE: case V4L2_BUF_TYPE_VBI_OUTPUT: return get_v4l2_vbi_format(&kp->fmt.vbi, &up->fmt.vbi); @@ -205,24 +251,46 @@ static int __get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us } } -static int get_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up) +static int bufsize_v4l2_format32(struct v4l2_format32 __user *up) { if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_format32))) return -EFAULT; - return __get_v4l2_format32(kp, up); + return __bufsize_v4l2_format32(up); } -static int get_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_buffers32 __user *up) +static int get_v4l2_format32(struct v4l2_format __user *kp, struct + v4l2_format32 __user *up, void __user *aux_buf, int aux_space) +{ + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_format32))) + return -EFAULT; + return __get_v4l2_format32(kp, up, aux_buf, aux_space); +} + +static int bufsize_v4l2_create32(struct v4l2_create_buffers32 __user *up) +{ + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_create_buffers32))) + return -EFAULT; + return __bufsize_v4l2_format32(&up->format); +} + +static int get_v4l2_create32(struct v4l2_create_buffers __user *kp, struct + v4l2_create_buffers32 __user *up, void __user *aux_buf, + int aux_space) { if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_create_buffers32)) || - copy_from_user(kp, up, offsetof(struct v4l2_create_buffers32, format))) + copy_in_user(kp, up, offsetof(struct v4l2_create_buffers32, format))) return -EFAULT; - return __get_v4l2_format32(&kp->format, &up->format); + return __get_v4l2_format32(&kp->format, &up->format, aux_buf, aux_space); } -static int __put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up) +static int __put_v4l2_format32(struct v4l2_format __user *kp, struct v4l2_format32 __user *up) { - switch (kp->type) { + __u32 type; + + if (get_user(type, &kp->type)) + return -EFAULT; + + switch (type) { case V4L2_BUF_TYPE_VIDEO_CAPTURE: case V4L2_BUF_TYPE_VIDEO_OUTPUT: return put_v4l2_pix_format(&kp->fmt.pix, &up->fmt.pix); @@ -246,7 +314,7 @@ static int __put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __us } } -static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user *up) +static int put_v4l2_format32(struct v4l2_format __user *kp, struct v4l2_format32 __user *up) { if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_format32)) || put_user(kp->type, &up->type)) @@ -254,10 +322,10 @@ static int put_v4l2_format32(struct v4l2_format *kp, struct v4l2_format32 __user return __put_v4l2_format32(kp, up); } -static int put_v4l2_create32(struct v4l2_create_buffers *kp, struct v4l2_create_buffers32 __user *up) +static int put_v4l2_create32(struct v4l2_create_buffers __user *kp, struct v4l2_create_buffers32 __user *up) { if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_create_buffers32)) || - copy_to_user(up, kp, offsetof(struct v4l2_create_buffers32, format.fmt))) + copy_in_user(up, kp, offsetof(struct v4l2_create_buffers32, format.fmt))) return -EFAULT; return __put_v4l2_format32(&kp->format, &up->format); } @@ -271,24 +339,24 @@ struct v4l2_standard32 { __u32 reserved[4]; }; -static int get_v4l2_standard32(struct v4l2_standard *kp, struct v4l2_standard32 __user *up) +static int get_v4l2_standard32(struct v4l2_standard __user *kp, struct v4l2_standard32 __user *up) { /* other fields are not set by the user, nor used by the driver */ if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_standard32)) || - get_user(kp->index, &up->index)) + convert_in_user(&up->index, &kp->index)) return -EFAULT; return 0; } -static int put_v4l2_standard32(struct v4l2_standard *kp, struct v4l2_standard32 __user *up) +static int put_v4l2_standard32(struct v4l2_standard __user *kp, struct v4l2_standard32 __user *up) { if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_standard32)) || - put_user(kp->index, &up->index) || - copy_to_user(up->id, &kp->id, sizeof(__u64)) || - copy_to_user(up->name, kp->name, 24) || - copy_to_user(&up->frameperiod, &kp->frameperiod, sizeof(kp->frameperiod)) || - put_user(kp->framelines, &up->framelines) || - copy_to_user(up->reserved, kp->reserved, 4 * sizeof(__u32))) + convert_in_user(&kp->index, &up->index) || + copy_in_user(up->id, &kp->id, sizeof(__u64)) || + copy_in_user(up->name, kp->name, 24) || + copy_in_user(&up->frameperiod, &kp->frameperiod, sizeof(kp->frameperiod)) || + convert_in_user(&kp->framelines, &up->framelines) || + copy_in_user(up->reserved, kp->reserved, 4 * sizeof(__u32))) return -EFAULT; return 0; } @@ -331,7 +399,6 @@ struct v4l2_buffer32 { static int get_v4l2_plane32(struct v4l2_plane __user *up, struct v4l2_plane32 __user *up32, enum v4l2_memory memory) { - void __user *up_pln; compat_long_t p; if (copy_in_user(up, up32, 2 * sizeof(__u32)) || @@ -344,10 +411,9 @@ static int get_v4l2_plane32(struct v4l2_plane __user *up, struct v4l2_plane32 __ return -EFAULT; if (memory == V4L2_MEMORY_USERPTR) { - if (get_user(p, &up32->m.userptr)) - return -EFAULT; - up_pln = compat_ptr(p); - if (put_user((unsigned long)up_pln, &up->m.userptr)) + if (get_user(p, &up32->m.userptr) || + put_user((unsigned long) compat_ptr(p), + &up->m.userptr)) return -EFAULT; } else if (memory == V4L2_MEMORY_DMABUF) { if (copy_in_user(&up->m.fd, &up32->m.fd, sizeof(int))) @@ -390,8 +456,34 @@ static int put_v4l2_plane32(struct v4l2_plane __user *up, struct v4l2_plane32 __ return 0; } -static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user *up) +static int bufsize_v4l2_buffer32(struct v4l2_buffer32 __user *up) { + __u32 type; + __u32 length; + + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_buffer32)) || + get_user(type, &up->type) || + get_user(length, &up->length)) + return -EFAULT; + + if (V4L2_TYPE_IS_MULTIPLANAR(type)) { + if (length > VIDEO_MAX_PLANES) + return -EINVAL; + + /* We don't really care if userspace decides to kill itself + * by passing a very big length value + */ + return length * sizeof(struct v4l2_plane); + } + return 0; +} + +static int get_v4l2_buffer32(struct v4l2_buffer __user *kp, struct + v4l2_buffer32 __user *up, void __user *aux_buf, int aux_space) +{ + __u32 type; + __u32 length; + enum v4l2_memory memory; struct v4l2_plane32 __user *uplane32; struct v4l2_plane __user *uplane; compat_caddr_t p; @@ -399,28 +491,40 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user int ret; if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_buffer32)) || - get_user(kp->index, &up->index) || - get_user(kp->type, &up->type) || - get_user(kp->flags, &up->flags) || - get_user(kp->memory, &up->memory) || - get_user(kp->length, &up->length)) + convert_in_user(&up->index, &kp->index) || + get_user(type, &up->type) || + put_user(type, &kp->type) || + convert_in_user(&up->flags, &kp->flags) || + get_user(memory, &up->memory) || + put_user(memory, &kp->memory) || + convert_in_user(&up->length, &kp->length) || + get_user(length, &up->length) || + put_user(length, &kp->length)) return -EFAULT; - if (V4L2_TYPE_IS_OUTPUT(kp->type)) - if (get_user(kp->bytesused, &up->bytesused) || - get_user(kp->field, &up->field) || - get_user(kp->timestamp.tv_sec, &up->timestamp.tv_sec) || - get_user(kp->timestamp.tv_usec, - &up->timestamp.tv_usec)) + if (V4L2_TYPE_IS_OUTPUT(type)) + if (convert_in_user(&up->bytesused, &kp->bytesused) || + convert_in_user(&up->field, &kp->field) || + convert_in_user(&up->timestamp.tv_sec, &kp->timestamp.tv_sec) || + convert_in_user(&up->timestamp.tv_usec, + &kp->timestamp.tv_usec)) return -EFAULT; - if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) { - num_planes = kp->length; + if (type == V4L2_BUF_TYPE_PRIVATE) { + compat_long_t tmp; + + if (get_user(tmp, &up->m.userptr) || + put_user((unsigned long) compat_ptr(tmp), + &kp->m.userptr)) + return -EFAULT; + } + + if (V4L2_TYPE_IS_MULTIPLANAR(type)) { + num_planes = length; if (num_planes == 0) { - kp->m.planes = NULL; /* num_planes == 0 is legal, e.g. when userspace doesn't * need planes array on DQBUF*/ - return 0; + return put_user(NULL, &kp->m.planes); } if (get_user(p, &up->m.planes)) @@ -433,39 +537,44 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user /* We don't really care if userspace decides to kill itself * by passing a very big num_planes value */ - uplane = compat_alloc_user_space(num_planes * - sizeof(struct v4l2_plane)); - kp->m.planes = (__force struct v4l2_plane *)uplane; + if (aux_space < num_planes * sizeof(struct v4l2_plane)) + return -EFAULT; + + uplane = aux_buf; + if (put_user((__force struct v4l2_plane *)uplane, + &kp->m.planes)) + return -EFAULT; while (--num_planes >= 0) { - ret = get_v4l2_plane32(uplane, uplane32, kp->memory); + ret = get_v4l2_plane32(uplane, uplane32, memory); if (ret) return ret; ++uplane; ++uplane32; } } else { - switch (kp->memory) { + switch (memory) { case V4L2_MEMORY_MMAP: - if (get_user(kp->m.offset, &up->m.offset)) + if (convert_in_user(&up->m.offset, &kp->m.offset)) return -EFAULT; break; case V4L2_MEMORY_USERPTR: { - compat_long_t tmp; + compat_long_t tmp; - if (get_user(tmp, &up->m.userptr)) - return -EFAULT; - - kp->m.userptr = (unsigned long)compat_ptr(tmp); + if (get_user(tmp, &up->m.userptr) || + put_user((unsigned long) + compat_ptr(tmp), + &kp->m.userptr)) + return -EFAULT; } break; case V4L2_MEMORY_OVERLAY: - if (get_user(kp->m.offset, &up->m.offset)) + if (convert_in_user(&up->m.offset, &kp->m.offset)) return -EFAULT; break; case V4L2_MEMORY_DMABUF: - if (get_user(kp->m.fd, &up->m.fd)) + if (convert_in_user(&up->m.fd, &kp->m.fd)) return -EFAULT; break; } @@ -474,8 +583,11 @@ static int get_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user return 0; } -static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user *up) +static int put_v4l2_buffer32(struct v4l2_buffer __user *kp, struct v4l2_buffer32 __user *up) { + __u32 type; + __u32 length; + enum v4l2_memory memory; struct v4l2_plane32 __user *uplane32; struct v4l2_plane __user *uplane; compat_caddr_t p; @@ -483,56 +595,63 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user int ret; if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_buffer32)) || - put_user(kp->index, &up->index) || - put_user(kp->type, &up->type) || - put_user(kp->flags, &up->flags) || - put_user(kp->memory, &up->memory)) + convert_in_user(&kp->index, &up->index) || + get_user(type, &kp->type) || + put_user(type, &up->type) || + convert_in_user(&kp->flags, &up->flags) || + get_user(memory, &kp->memory) || + put_user(memory, &up->memory)) return -EFAULT; - if (put_user(kp->bytesused, &up->bytesused) || - put_user(kp->field, &up->field) || - put_user(kp->timestamp.tv_sec, &up->timestamp.tv_sec) || - put_user(kp->timestamp.tv_usec, &up->timestamp.tv_usec) || - copy_to_user(&up->timecode, &kp->timecode, sizeof(struct v4l2_timecode)) || - put_user(kp->sequence, &up->sequence) || - put_user(kp->reserved2, &up->reserved2) || - put_user(kp->reserved, &up->reserved) || - put_user(kp->length, &up->length)) + if (convert_in_user(&kp->bytesused, &up->bytesused) || + convert_in_user(&kp->field, &up->field) || + convert_in_user(&kp->timestamp.tv_sec, &up->timestamp.tv_sec) || + convert_in_user(&kp->timestamp.tv_usec, &up->timestamp.tv_usec) || + copy_in_user(&up->timecode, &kp->timecode, sizeof(struct v4l2_timecode)) || + convert_in_user(&kp->sequence, &up->sequence) || + convert_in_user(&kp->reserved2, &up->reserved2) || + convert_in_user(&kp->reserved, &up->reserved) || + get_user(length, &kp->length) || + put_user(length, &up->length)) + return -EFAULT; + if(type == V4L2_BUF_TYPE_PRIVATE) + if (convert_in_user(&kp->m.userptr, &up->m.userptr)) return -EFAULT; - if (V4L2_TYPE_IS_MULTIPLANAR(kp->type)) { - num_planes = kp->length; + if (V4L2_TYPE_IS_MULTIPLANAR(type)) { + num_planes = length; if (num_planes == 0) return 0; - uplane = (__force struct v4l2_plane __user *)kp->m.planes; + if (get_user(uplane, ((__force struct v4l2_plane __user **)&kp->m.planes))) + return -EFAULT; if (get_user(p, &up->m.planes)) return -EFAULT; uplane32 = compat_ptr(p); while (--num_planes >= 0) { - ret = put_v4l2_plane32(uplane, uplane32, kp->memory); + ret = put_v4l2_plane32(uplane, uplane32, memory); if (ret) return ret; ++uplane; ++uplane32; } } else { - switch (kp->memory) { + switch (memory) { case V4L2_MEMORY_MMAP: - if (put_user(kp->m.offset, &up->m.offset)) + if (convert_in_user(&kp->m.offset, &up->m.offset)) return -EFAULT; break; case V4L2_MEMORY_USERPTR: - if (put_user(kp->m.userptr, &up->m.userptr)) + if (convert_in_user(&kp->m.userptr, &up->m.userptr)) return -EFAULT; break; case V4L2_MEMORY_OVERLAY: - if (put_user(kp->m.offset, &up->m.offset)) + if (convert_in_user(&kp->m.offset, &up->m.offset)) return -EFAULT; break; case V4L2_MEMORY_DMABUF: - if (put_user(kp->m.fd, &up->m.fd)) + if (convert_in_user(&kp->m.fd, &up->m.fd)) return -EFAULT; break; } @@ -542,44 +661,45 @@ static int put_v4l2_buffer32(struct v4l2_buffer *kp, struct v4l2_buffer32 __user } struct v4l2_framebuffer32 { - __u32 capability; - __u32 flags; - compat_caddr_t base; + __u32 capability; + __u32 flags; + compat_caddr_t base; struct { - __u32 width; - __u32 height; - __u32 pixelformat; - __u32 field; - __u32 bytesperline; - __u32 sizeimage; - __u32 colorspace; - __u32 priv; + __u32 width; + __u32 height; + __u32 pixelformat; + __u32 field; + __u32 bytesperline; + __u32 sizeimage; + __u32 colorspace; + __u32 priv; } fmt; }; -static int get_v4l2_framebuffer32(struct v4l2_framebuffer *kp, struct v4l2_framebuffer32 __user *up) +static int get_v4l2_framebuffer32(struct v4l2_framebuffer __user *kp, struct v4l2_framebuffer32 __user *up) { - u32 tmp; + compat_caddr_t tmp; if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_framebuffer32)) || get_user(tmp, &up->base) || - get_user(kp->capability, &up->capability) || - get_user(kp->flags, &up->flags) || - copy_from_user(&kp->fmt, &up->fmt, sizeof(up->fmt))) + put_user((__force void *)compat_ptr(tmp), &kp->base) || + convert_in_user(&up->capability, &kp->capability) || + convert_in_user(&up->flags, &kp->flags) || + get_v4l2_pix_format((struct v4l2_pix_format *)&kp->fmt, (struct v4l2_pix_format *)&up->fmt)) return -EFAULT; - kp->base = (__force void *)compat_ptr(tmp); return 0; } -static int put_v4l2_framebuffer32(struct v4l2_framebuffer *kp, struct v4l2_framebuffer32 __user *up) +static int put_v4l2_framebuffer32(struct v4l2_framebuffer __user *kp, struct v4l2_framebuffer32 __user *up) { - u32 tmp = (u32)((unsigned long)kp->base); + void *base; if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_framebuffer32)) || - put_user(tmp, &up->base) || - put_user(kp->capability, &up->capability) || - put_user(kp->flags, &up->flags) || - copy_to_user(&up->fmt, &kp->fmt, sizeof(up->fmt))) + get_user(base, &kp->base) || + put_user(ptr_to_compat(base), &up->base) || + convert_in_user(&kp->capability, &up->capability) || + convert_in_user(&kp->flags, &up->flags) || + put_v4l2_pix_format((struct v4l2_pix_format *)&kp->fmt, (struct v4l2_pix_format *)&up->fmt)) return -EFAULT; return 0; } @@ -597,16 +717,16 @@ struct v4l2_input32 { /* The 64-bit v4l2_input struct has extra padding at the end of the struct. Otherwise it is identical to the 32-bit version. */ -static inline int get_v4l2_input32(struct v4l2_input *kp, struct v4l2_input32 __user *up) +static inline int get_v4l2_input32(struct v4l2_input __user *kp, struct v4l2_input32 __user *up) { - if (copy_from_user(kp, up, sizeof(struct v4l2_input32))) + if (copy_in_user(kp, up, sizeof(struct v4l2_input32))) return -EFAULT; return 0; } -static inline int put_v4l2_input32(struct v4l2_input *kp, struct v4l2_input32 __user *up) +static inline int put_v4l2_input32(struct v4l2_input __user *kp, struct v4l2_input32 __user *up) { - if (copy_to_user(up, kp, sizeof(struct v4l2_input32))) + if (copy_in_user(up, kp, sizeof(struct v4l2_input32))) return -EFAULT; return 0; } @@ -647,35 +767,51 @@ static inline int ctrl_is_pointer(u32 id) } } -static int get_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext_controls32 __user *up) +static int bufsize_v4l2_ext_controls32(struct v4l2_ext_controls32 __user *up) +{ + __u32 count; + + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_ext_controls32)) || + get_user(count, &up->count)) + return -EFAULT; + if (count > V4L2_CID_MAX_CTRLS) + return -EINVAL; + return count * sizeof(struct v4l2_ext_control); +} + +static int get_v4l2_ext_controls32(struct v4l2_ext_controls __user *kp, struct + v4l2_ext_controls32 __user *up, void __user *aux_buf, + int aux_space) { struct v4l2_ext_control32 __user *ucontrols; struct v4l2_ext_control __user *kcontrols; - int n; + __u32 count; + unsigned int n; compat_caddr_t p; if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_ext_controls32)) || - get_user(kp->ctrl_class, &up->ctrl_class) || - get_user(kp->count, &up->count) || - get_user(kp->error_idx, &up->error_idx) || - copy_from_user(kp->reserved, up->reserved, sizeof(kp->reserved))) + convert_in_user(&up->ctrl_class, &kp->ctrl_class) || + get_user(count, &up->count) || + put_user(count, &kp->count) || + convert_in_user(&up->error_idx, &kp->error_idx) || + copy_in_user(kp->reserved, up->reserved, sizeof(kp->reserved))) return -EFAULT; - n = kp->count; - if (n == 0) { - kp->controls = NULL; - return 0; - } + if (count == 0) + return put_user(NULL, &kp->controls); if (get_user(p, &up->controls)) return -EFAULT; ucontrols = compat_ptr(p); if (!access_ok(VERIFY_READ, ucontrols, - n * sizeof(struct v4l2_ext_control32))) + count * sizeof(struct v4l2_ext_control32))) + return -EFAULT; + if (aux_space < count * sizeof(struct v4l2_ext_control)) + return -EFAULT; + kcontrols = aux_buf; + if (put_user((__force struct v4l2_ext_control *)kcontrols, + &kp->controls)) return -EFAULT; - kcontrols = compat_alloc_user_space(n * sizeof(struct v4l2_ext_control)); - kp->controls = (__force struct v4l2_ext_control *)kcontrols; - while (--n >= 0) { + for (n = 0; n < count; n++) { u32 id; - if (copy_in_user(kcontrols, ucontrols, sizeof(*ucontrols))) return -EFAULT; if (get_user(id, &kcontrols->id)) @@ -695,31 +831,33 @@ static int get_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext return 0; } -static int put_v4l2_ext_controls32(struct v4l2_ext_controls *kp, struct v4l2_ext_controls32 __user *up) +static int put_v4l2_ext_controls32(struct v4l2_ext_controls __user *kp, struct v4l2_ext_controls32 __user *up) { struct v4l2_ext_control32 __user *ucontrols; - struct v4l2_ext_control __user *kcontrols = - (__force struct v4l2_ext_control __user *)kp->controls; - int n = kp->count; + struct v4l2_ext_control __user *kcontrols; + __u32 count; + unsigned int n; compat_caddr_t p; if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_ext_controls32)) || - put_user(kp->ctrl_class, &up->ctrl_class) || - put_user(kp->count, &up->count) || - put_user(kp->error_idx, &up->error_idx) || - copy_to_user(up->reserved, kp->reserved, sizeof(up->reserved))) + get_user(kcontrols, &kp->controls) || + convert_in_user(&kp->ctrl_class, &up->ctrl_class) || + get_user(count, &kp->count) || + put_user(count, &up->count) || + convert_in_user(&kp->error_idx, &up->error_idx) || + copy_in_user(up->reserved, kp->reserved, sizeof(up->reserved))) return -EFAULT; - if (!kp->count) + if (!count) return 0; if (get_user(p, &up->controls)) return -EFAULT; ucontrols = compat_ptr(p); if (!access_ok(VERIFY_WRITE, ucontrols, - n * sizeof(struct v4l2_ext_control32))) + count * sizeof(struct v4l2_ext_control32))) return -EFAULT; - while (--n >= 0) { + for (n = 0; n < count; n++) { unsigned size = sizeof(*ucontrols); u32 id; @@ -753,16 +891,17 @@ struct v4l2_event32 { __u32 reserved[8]; }; -static int put_v4l2_event32(struct v4l2_event *kp, struct v4l2_event32 __user *up) +static int put_v4l2_event32(struct v4l2_event __user *kp, struct v4l2_event32 __user *up) { if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_event32)) || - put_user(kp->type, &up->type) || - copy_to_user(&up->u, &kp->u, sizeof(kp->u)) || - put_user(kp->pending, &up->pending) || - put_user(kp->sequence, &up->sequence) || - compat_put_timespec(&kp->timestamp, &up->timestamp) || - put_user(kp->id, &up->id) || - copy_to_user(up->reserved, kp->reserved, 8 * sizeof(__u32))) + convert_in_user(&kp->type, &up->type) || + copy_in_user(&up->u, &kp->u, sizeof(kp->u)) || + convert_in_user(&kp->pending, &up->pending) || + convert_in_user(&kp->sequence, &up->sequence) || + convert_in_user(&kp->timestamp.tv_sec, &up->timestamp.tv_sec) || + convert_in_user(&kp->timestamp.tv_nsec, &up->timestamp.tv_nsec) || + convert_in_user(&kp->id, &up->id) || + copy_in_user(up->reserved, kp->reserved, 8 * sizeof(__u32))) return -EFAULT; return 0; } @@ -775,31 +914,34 @@ struct v4l2_edid32 { compat_caddr_t edid; }; -static int get_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up) +#define v4l2_subdev_edid32 v4l2_edid32 + +static int get_v4l2_subdev_edid32(struct v4l2_subdev_edid __user *kp, struct v4l2_subdev_edid32 __user *up) { - u32 tmp; + compat_uptr_t tmp; - if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_edid32)) || - get_user(kp->pad, &up->pad) || - get_user(kp->start_block, &up->start_block) || - get_user(kp->blocks, &up->blocks) || + if (!access_ok(VERIFY_READ, up, sizeof(struct v4l2_subdev_edid32)) || + convert_in_user(&up->pad, &kp->pad) || + convert_in_user(&up->start_block, &kp->start_block) || + convert_in_user(&up->blocks, &kp->blocks) || get_user(tmp, &up->edid) || - copy_from_user(kp->reserved, up->reserved, sizeof(kp->reserved))) + put_user(compat_ptr(tmp), &kp->edid) || + copy_in_user(kp->reserved, up->reserved, sizeof(kp->reserved))) return -EFAULT; - kp->edid = (__force u8 *)compat_ptr(tmp); return 0; } -static int put_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up) +static int put_v4l2_subdev_edid32(struct v4l2_subdev_edid __user *kp, struct v4l2_subdev_edid32 __user *up) { - u32 tmp = (u32)((unsigned long)kp->edid); - - if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_edid32)) || - put_user(kp->pad, &up->pad) || - put_user(kp->start_block, &up->start_block) || - put_user(kp->blocks, &up->blocks) || - put_user(tmp, &up->edid) || - copy_to_user(up->reserved, kp->reserved, sizeof(up->reserved))) + void *edid; + + if (!access_ok(VERIFY_WRITE, up, sizeof(struct v4l2_subdev_edid32)) || + convert_in_user(&kp->pad, &up->pad) || + convert_in_user(&kp->start_block, &up->start_block) || + convert_in_user(&kp->blocks, &up->blocks) || + get_user(edid, &kp->edid) || + put_user(ptr_to_compat(edid), &up->edid) || + copy_in_user(up->reserved, kp->reserved, sizeof(up->reserved))) return -EFAULT; return 0; } @@ -832,22 +974,37 @@ static int put_v4l2_edid32(struct v4l2_edid *kp, struct v4l2_edid32 __user *up) #define VIDIOC_G_OUTPUT32 _IOR ('V', 46, s32) #define VIDIOC_S_OUTPUT32 _IOWR('V', 47, s32) +/* + * Note that these macros contain return statements to avoid the need for the + * "caller" to check return values. + */ +#define ALLOC_USER_SPACE(size) \ +({ \ + void __user *up_native; \ + up_native = compat_alloc_user_space(size); \ + if (!up_native) \ + return -ENOMEM; \ + if (clear_user(up_native, size)) \ + return -EFAULT; \ + up_native; \ +}) + +#define ALLOC_AND_GET(bufsizefunc, getfunc, structname) \ + do { \ + aux_space = bufsizefunc(up); \ + if (aux_space < 0) \ + return aux_space; \ + up_native = ALLOC_USER_SPACE(sizeof(struct structname) + aux_space); \ + aux_buf = up_native + sizeof(struct structname); \ + err = getfunc(up_native, up, aux_buf, aux_space); \ + } while (0) + static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { - union { - struct v4l2_format v2f; - struct v4l2_buffer v2b; - struct v4l2_framebuffer v2fb; - struct v4l2_input v2i; - struct v4l2_standard v2s; - struct v4l2_ext_controls v2ecs; - struct v4l2_event v2ev; - struct v4l2_create_buffers v2crt; - struct v4l2_edid v2edid; - unsigned long vx; - int vi; - } karg; void __user *up = compat_ptr(arg); + void __user *up_native = NULL; + void __user *aux_buf; + int aux_space; int compatible_arg = 1; long err = 0; @@ -886,30 +1043,35 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar case VIDIOC_STREAMOFF: case VIDIOC_S_INPUT: case VIDIOC_S_OUTPUT: - err = get_user(karg.vi, (s32 __user *)up); + up_native = ALLOC_USER_SPACE(sizeof(unsigned __user)); + if (convert_in_user((compat_uint_t __user *)up, + (unsigned __user *) up_native)) + return -EFAULT; compatible_arg = 0; break; case VIDIOC_G_INPUT: case VIDIOC_G_OUTPUT: + up_native = ALLOC_USER_SPACE(sizeof(unsigned __user)); compatible_arg = 0; break; case VIDIOC_G_EDID: case VIDIOC_S_EDID: - err = get_v4l2_edid32(&karg.v2edid, up); + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_subdev_edid)); + err = get_v4l2_subdev_edid32(up_native, up); compatible_arg = 0; break; case VIDIOC_G_FMT: case VIDIOC_S_FMT: case VIDIOC_TRY_FMT: - err = get_v4l2_format32(&karg.v2f, up); + ALLOC_AND_GET(bufsize_v4l2_format32, get_v4l2_format32, v4l2_format); compatible_arg = 0; break; case VIDIOC_CREATE_BUFS: - err = get_v4l2_create32(&karg.v2crt, up); + ALLOC_AND_GET(bufsize_v4l2_create32, get_v4l2_create32, v4l2_create_buffers); compatible_arg = 0; break; @@ -917,36 +1079,41 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar case VIDIOC_QUERYBUF: case VIDIOC_QBUF: case VIDIOC_DQBUF: - err = get_v4l2_buffer32(&karg.v2b, up); + ALLOC_AND_GET(bufsize_v4l2_buffer32, get_v4l2_buffer32, v4l2_buffer); compatible_arg = 0; break; case VIDIOC_S_FBUF: - err = get_v4l2_framebuffer32(&karg.v2fb, up); + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_framebuffer)); + err = get_v4l2_framebuffer32((struct v4l2_framebuffer *)up_native, (struct v4l2_framebuffer32 *)up); compatible_arg = 0; break; case VIDIOC_G_FBUF: + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_framebuffer)); compatible_arg = 0; break; case VIDIOC_ENUMSTD: - err = get_v4l2_standard32(&karg.v2s, up); + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_standard)); + err = get_v4l2_standard32(up_native, up); compatible_arg = 0; break; case VIDIOC_ENUMINPUT: - err = get_v4l2_input32(&karg.v2i, up); + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_input)); + err = get_v4l2_input32(up_native, up); compatible_arg = 0; break; case VIDIOC_G_EXT_CTRLS: case VIDIOC_S_EXT_CTRLS: case VIDIOC_TRY_EXT_CTRLS: - err = get_v4l2_ext_controls32(&karg.v2ecs, up); + ALLOC_AND_GET(bufsize_v4l2_ext_controls32, get_v4l2_ext_controls32, v4l2_ext_controls); compatible_arg = 0; break; case VIDIOC_DQEVENT: + up_native = ALLOC_USER_SPACE(sizeof(struct v4l2_event)); compatible_arg = 0; break; } @@ -955,13 +1122,8 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar if (compatible_arg) err = native_ioctl(file, cmd, (unsigned long)up); - else { - mm_segment_t old_fs = get_fs(); - - set_fs(KERNEL_DS); - err = native_ioctl(file, cmd, (unsigned long)&karg); - set_fs(old_fs); - } + else + err = native_ioctl(file, cmd, (unsigned long)up_native); /* Special case: even after an error we need to put the results back for these ioctls since the error_idx will @@ -970,7 +1132,7 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar case VIDIOC_G_EXT_CTRLS: case VIDIOC_S_EXT_CTRLS: case VIDIOC_TRY_EXT_CTRLS: - if (put_v4l2_ext_controls32(&karg.v2ecs, up)) + if (put_v4l2_ext_controls32(up_native, up)) err = -EFAULT; break; } @@ -982,44 +1144,45 @@ static long do_video_ioctl(struct file *file, unsigned int cmd, unsigned long ar case VIDIOC_S_OUTPUT: case VIDIOC_G_INPUT: case VIDIOC_G_OUTPUT: - err = put_user(((s32)karg.vi), (s32 __user *)up); + err = convert_in_user(((unsigned __user *)up_native), + (compat_uint_t __user *)up); break; case VIDIOC_G_FBUF: - err = put_v4l2_framebuffer32(&karg.v2fb, up); + err = put_v4l2_framebuffer32(up_native, up); break; case VIDIOC_DQEVENT: - err = put_v4l2_event32(&karg.v2ev, up); + err = put_v4l2_event32(up_native, up); break; case VIDIOC_G_EDID: case VIDIOC_S_EDID: - err = put_v4l2_edid32(&karg.v2edid, up); + err = put_v4l2_subdev_edid32(up_native, up); break; case VIDIOC_G_FMT: case VIDIOC_S_FMT: case VIDIOC_TRY_FMT: - err = put_v4l2_format32(&karg.v2f, up); + err = put_v4l2_format32(up_native, up); break; case VIDIOC_CREATE_BUFS: - err = put_v4l2_create32(&karg.v2crt, up); + err = put_v4l2_create32(up_native, up); break; case VIDIOC_QUERYBUF: case VIDIOC_QBUF: case VIDIOC_DQBUF: - err = put_v4l2_buffer32(&karg.v2b, up); + err = put_v4l2_buffer32(up_native, up); break; case VIDIOC_ENUMSTD: - err = put_v4l2_standard32(&karg.v2s, up); + err = put_v4l2_standard32(up_native, up); break; case VIDIOC_ENUMINPUT: - err = put_v4l2_input32(&karg.v2i, up); + err = put_v4l2_input32(up_native, up); break; } return err; diff --git a/drivers/mfd/wcd9xxx-core.c b/drivers/mfd/wcd9xxx-core.c index 4cead8fb38cd3..3649e7c9fcbdd 100644 --- a/drivers/mfd/wcd9xxx-core.c +++ b/drivers/mfd/wcd9xxx-core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -2755,7 +2755,7 @@ static struct wcd9xxx_pdata *wcd9xxx_populate_dt_pdata(struct device *dev) "qcom,cdc-reset-gpio", 0); if (pdata->reset_gpio < 0) { dev_err(dev, "Looking up %s property in node %s failed %d\n", - "qcom, cdc-reset-gpio", + "qcom,cdc-reset-gpio", dev->of_node->full_name, pdata->reset_gpio); goto err; } @@ -3107,19 +3107,19 @@ static int wcd9xxx_slim_probe(struct slim_device *slim) ("wcd9xxx_core", 0); if (!IS_ERR(debugfs_wcd9xxx_dent)) { debugfs_peek = debugfs_create_file("slimslave_peek", - S_IFREG | S_IRUGO, debugfs_wcd9xxx_dent, + S_IFREG | S_IRUSR, debugfs_wcd9xxx_dent, (void *) "slimslave_peek", &codec_debug_ops); debugfs_poke = debugfs_create_file("slimslave_poke", - S_IFREG | S_IRUGO, debugfs_wcd9xxx_dent, + S_IFREG | S_IRUSR, debugfs_wcd9xxx_dent, (void *) "slimslave_poke", &codec_debug_ops); debugfs_power_state = debugfs_create_file("power_state", - S_IFREG | S_IRUGO, debugfs_wcd9xxx_dent, + S_IFREG | S_IRUSR, debugfs_wcd9xxx_dent, (void *) "power_state", &codec_debug_ops); debugfs_reg_dump = debugfs_create_file("slimslave_reg_dump", - S_IFREG | S_IRUGO, debugfs_wcd9xxx_dent, + S_IFREG | S_IRUSR, debugfs_wcd9xxx_dent, (void *) "slimslave_reg_dump", &codec_debug_ops); } #endif @@ -3224,9 +3224,9 @@ static int wcd9xxx_slim_device_down(struct slim_device *sldev) return 0; wcd9xxx->dev_up = false; - wcd9xxx_irq_exit(&wcd9xxx->core_res); if (wcd9xxx->dev_down) wcd9xxx->dev_down(wcd9xxx); + wcd9xxx_irq_exit(&wcd9xxx->core_res); return 0; } diff --git a/drivers/mfd/wcd9xxx-slimslave.c b/drivers/mfd/wcd9xxx-slimslave.c index 30fd0dedd6099..d768506f52604 100644 --- a/drivers/mfd/wcd9xxx-slimslave.c +++ b/drivers/mfd/wcd9xxx-slimslave.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -62,6 +62,10 @@ int wcd9xxx_init_slimslave(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la, goto err; } + if (!rx_num || rx_num > wcd9xxx->num_rx_port) { + pr_err("%s: invalid rx num %d\n", __func__, rx_num); + return -EINVAL; + } if (wcd9xxx->rx_chs) { wcd9xxx->num_rx_port = rx_num; for (i = 0; i < rx_num; i++) { @@ -84,6 +88,10 @@ int wcd9xxx_init_slimslave(struct wcd9xxx *wcd9xxx, u8 wcd9xxx_pgd_la, wcd9xxx->num_rx_port); } + if (!tx_num || tx_num > wcd9xxx->num_tx_port) { + pr_err("%s: invalid tx num %d\n", __func__, tx_num); + return -EINVAL; + } if (wcd9xxx->tx_chs) { wcd9xxx->num_tx_port = tx_num; for (i = 0; i < tx_num; i++) { diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile index 0b9117c0e7dae..e6f726c943fbb 100644 --- a/drivers/misc/Makefile +++ b/drivers/misc/Makefile @@ -68,3 +68,4 @@ obj-$(CONFIG_TI_DRV2667) += ti_drv2667.o obj-$(CONFIG_USB_EXT_TYPE_C_PERICOM) += type-c-pericom.o obj-$(CONFIG_USB_EXT_TYPE_C_TI) += type-c-ti.o obj-$(CONFIG_QPNP_MISC) += qpnp-misc.o +obj-y += hardware_info.o diff --git a/drivers/misc/hardware_info.c b/drivers/misc/hardware_info.c new file mode 100755 index 0000000000000..c5913658b2f96 --- /dev/null +++ b/drivers/misc/hardware_info.c @@ -0,0 +1,331 @@ +#include +#include +#include +#include +#include + +#include + +#include +#include +#include + +typedef struct hardwareinfo_get{ + void (*get)(void *driver_data); + void *driver_data; +} hardwareinfo_get; + +static hardwareinfo_get hardwareinfo_get_tp; + +void hardwareinfo_tp_register(void (*fn)(void *), void *driver_data) +{ + hardwareinfo_get_tp.get = fn; + hardwareinfo_get_tp.driver_data = driver_data; +} +char Lcm_name[HARDWARE_MAX_ITEM_LONGTH]; +char board_id[HARDWARE_MAX_ITEM_LONGTH]; +static char hardwareinfo_name[HARDWARE_MAX_ITEM][HARDWARE_MAX_ITEM_LONGTH]; + + +char *hardwareinfo_items[HARDWARE_MAX_ITEM] = { + "LCD", + "TP", + "MEMORY", + "CAM_FRONT", + "CAM_BACK", + "BT", + "WIFI", + "GSENSOR", + "PLSENSOR", + "GYROSENSOR", + "MSENSOR", + "GPS", + "FM", + "BATTERY", + "CAM_M_BACK", + "CAM_M_FRONT", + "BOARD_ID", +}; + +#define FP_PROC_NAME "hwinfo" + +static char hdware_info_fp[100] = "unknow"; + + +static ssize_t fp_hwinfo_proc_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) +{ + size_t min; + min = min(count, (size_t)(ARRAY_SIZE(hdware_info_fp) - 1)); + memset(hdware_info_fp, 0, ARRAY_SIZE(hdware_info_fp)); + if (copy_from_user(hdware_info_fp, buf, min)) { + pr_err("%s: copy from user error.", __func__); + return -EPERM; + } + + return min; +} + +static ssize_t fp_hwinfo_proc_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) +{ + size_t min; + char *p; + size_t size = ARRAY_SIZE(hdware_info_fp) + strlen("Fingerprint: \n"); + + if (*ppos) + return 0; + *ppos += count; + + min = min(count, size); + p = kzalloc(size, GFP_KERNEL); + snprintf(p, size, "Fingerprint: %s\n", hdware_info_fp); + + if (copy_to_user(buf, p, min)) { + pr_err("%s: copy to user error.", __func__); + kfree(p); + return -EPERM; + } + kfree(p); + + return min; +} + + +static const struct file_operations fp_hwinfo_fops = { + .write = fp_hwinfo_proc_write, + .read = fp_hwinfo_proc_read, + .owner = THIS_MODULE, +}; + +/* +* This function will create a node named FP_PROC_NAME for user to read the fingerprint +* infomation.Just cat /proc/FP_PROC_NAME. +*/ +void fp_hwinfo_proc_create(void) +{ + struct proc_dir_entry *fp_hwinfo_proc_dir; + + fp_hwinfo_proc_dir = proc_create(FP_PROC_NAME, 0666, NULL, &fp_hwinfo_fops); + if (fp_hwinfo_proc_dir == NULL) + pr_err("[HW_INFO][ERR]: create fp_hwinfo_proc fail\n"); +} + +int hardwareinfo_set_prop(int cmd, const char *name) +{ + if (cmd < 0 || cmd >= HARDWARE_MAX_ITEM) + return -EPERM; + + strcpy(hardwareinfo_name[cmd], name); + + return 0; +} +EXPORT_SYMBOL_GPL(hardwareinfo_set_prop); + + +static long hardwareinfo_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + int ret = 0, hardwareinfo_num; + void __user *data = (void __user *)arg; + + + switch (cmd) { + case HARDWARE_LCD_GET: + hardwareinfo_set_prop(HARDWARE_LCD, Lcm_name); + hardwareinfo_num = HARDWARE_LCD; + break; + case HARDWARE_TP_GET: + hardwareinfo_num = HARDWARE_TP; + if (hardwareinfo_get_tp.get) + hardwareinfo_get_tp.get(hardwareinfo_get_tp.driver_data); + break; + case HARDWARE_FLASH_GET: + hardwareinfo_num = HARDWARE_FLASH; + break; + case HARDWARE_FRONT_CAM_GET: + hardwareinfo_num = HARDWARE_FRONT_CAM; + break; + case HARDWARE_BACK_CAM_GET: + hardwareinfo_num = HARDWARE_BACK_CAM; + break; + case HARDWARE_BT_GET: + hardwareinfo_set_prop(HARDWARE_BT, "Qualcomm"); + hardwareinfo_num = HARDWARE_BT; + break; + case HARDWARE_WIFI_GET: + hardwareinfo_set_prop(HARDWARE_WIFI, "Qualcomm"); + hardwareinfo_num = HARDWARE_WIFI; + break; + case HARDWARE_ACCELEROMETER_GET: + hardwareinfo_num = HARDWARE_ACCELEROMETER; + break; + case HARDWARE_ALSPS_GET: + hardwareinfo_num = HARDWARE_ALSPS; + break; + case HARDWARE_GYROSCOPE_GET: + hardwareinfo_num = HARDWARE_GYROSCOPE; + break; + case HARDWARE_MAGNETOMETER_GET: + hardwareinfo_num = HARDWARE_MAGNETOMETER; + break; + case HARDWARE_GPS_GET: + hardwareinfo_set_prop(HARDWARE_GPS, "Qualcomm"); + hardwareinfo_num = HARDWARE_GPS; + break; + case HARDWARE_FM_GET: + hardwareinfo_set_prop(HARDWARE_FM, "Qualcomm"); + hardwareinfo_num = HARDWARE_FM; + break; + case HARDWARE_BATTERY_ID_GET: + hardwareinfo_num = HARDWARE_BATTERY_ID; + break; + case HARDWARE_BACK_CAM_MOUDULE_ID_GET: + hardwareinfo_num = HARDWARE_BACK_CAM_MOUDULE_ID; + break; + case HARDWARE_FRONT_CAM_MODULE_ID_GET: + hardwareinfo_num = HARDWARE_FRONT_CAM_MOUDULE_ID; + break; + case HARDWARE_BOARD_ID_GET: + hardwareinfo_set_prop(HARDWARE_BOARD_ID, board_id); + hardwareinfo_num = HARDWARE_BOARD_ID; + break; + case HARDWARE_BACK_CAM_MOUDULE_ID_SET: + if (copy_from_user(hardwareinfo_name[HARDWARE_BACK_CAM_MOUDULE_ID], data, sizeof(data))) { + pr_err("wgz copy_from_user error"); + ret = -EINVAL; + } + goto set_ok; + break; + case HARDWARE_FRONT_CAM_MODULE_ID_SET: + if (copy_from_user(hardwareinfo_name[HARDWARE_FRONT_CAM_MOUDULE_ID], data, sizeof(data))) { + pr_err("wgz copy_from_user error"); + ret = -EINVAL; + } + goto set_ok; + break; + default: + ret = -EINVAL; + goto err_out; + } + + if (copy_to_user(data, hardwareinfo_name[hardwareinfo_num], strlen(hardwareinfo_name[hardwareinfo_num]) + 1)) { + + ret = -EINVAL; + } +set_ok: +err_out: + return ret; +} + +static ssize_t show_boardinfo(struct device *dev, struct device_attribute *attr, char *buf) +{ + int i = 0; + char temp_buffer[HARDWARE_MAX_ITEM_LONGTH]; + int buf_size = 0; + + for (i = 0; i < HARDWARE_MAX_ITEM; i++) { + memset(temp_buffer, 0, HARDWARE_MAX_ITEM_LONGTH); + if (i == HARDWARE_LCD) { + sprintf(temp_buffer, "%s : %s\n", hardwareinfo_items[i], Lcm_name); + } else if (i == HARDWARE_BT || i == HARDWARE_WIFI || i == HARDWARE_GPS || i == HARDWARE_FM) { + sprintf(temp_buffer, "%s : %s\n", hardwareinfo_items[i], "Qualcomm"); + } else { + sprintf(temp_buffer, "%s : %s\n", hardwareinfo_items[i], hardwareinfo_name[i]); + } + strcat(buf, temp_buffer); + buf_size += strlen(temp_buffer); + } + + return buf_size; +} +static DEVICE_ATTR(boardinfo, S_IRUGO, show_boardinfo, NULL); + + +static int boardinfo_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + int rc = 0; + + printk("%s: start\n", __func__); + + rc = device_create_file(dev, &dev_attr_boardinfo); + if (rc < 0) + return rc; + + dev_info(dev, "%s: ok\n", __func__); + + return 0; +} + +static int boardinfo_remove(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + + device_remove_file(dev, &dev_attr_boardinfo); + dev_info(&pdev->dev, "%s\n", __func__); + return 0; +} + + +static struct file_operations hardwareinfo_fops = { + .owner = THIS_MODULE, + .open = simple_open, + .unlocked_ioctl = hardwareinfo_ioctl, + .compat_ioctl = hardwareinfo_ioctl, +}; + +static struct miscdevice hardwareinfo_device = { + .minor = MISC_DYNAMIC_MINOR, + .name = "hardwareinfo", + .fops = &hardwareinfo_fops, +}; + +static struct of_device_id boardinfo_of_match[] = { + { .compatible = "wt:boardinfo", }, + {} +}; + +static struct platform_driver boardinfo_driver = { + .driver = { + .name = "boardinfo", + .owner = THIS_MODULE, + .of_match_table = boardinfo_of_match, + }, + .probe = boardinfo_probe, + .remove = boardinfo_remove, +}; + + + +static int __init hardwareinfo_init_module(void) +{ + int ret, i; + + for (i = 0; i < HARDWARE_MAX_ITEM; i++) + strcpy(hardwareinfo_name[i], "NULL"); + + ret = misc_register(&hardwareinfo_device); + if (ret < 0) { + return -ENODEV; + } + + ret = platform_driver_register(&boardinfo_driver); + if (ret != 0) { + return -ENODEV; + } + + fp_hwinfo_proc_create(); + + return 0; +} + +static void __exit hardwareinfo_exit_module(void) +{ + misc_deregister(&hardwareinfo_device); +} + +module_init(hardwareinfo_init_module); +module_exit(hardwareinfo_exit_module); + +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Ming He "); + + diff --git a/drivers/misc/hdcp.c b/drivers/misc/hdcp.c index 18fd4c2a9a31e..6f293e3a529d9 100644 --- a/drivers/misc/hdcp.c +++ b/drivers/misc/hdcp.c @@ -1193,7 +1193,7 @@ static void hdcp_lib_msg_recvd(struct hdcp_lib_handle *handle) struct hdcp_rcvd_msg_req *req_buf; struct hdcp_rcvd_msg_rsp *rsp_buf; uint32_t msglen; - char *msg; + char *msg = NULL; if (!handle || !handle->qseecom_handle || !handle->qseecom_handle->sbuf) { diff --git a/drivers/misc/qcom/qdsp6v2/aac_in.c b/drivers/misc/qcom/qdsp6v2/aac_in.c index c9d5dbb0b3136..ef963451a3f96 100644 --- a/drivers/misc/qcom/qdsp6v2/aac_in.c +++ b/drivers/misc/qcom/qdsp6v2/aac_in.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2010-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 @@ -34,6 +34,8 @@ #define AAC_FORMAT_ADTS 65535 +#define MAX_SAMPLE_RATE_384K 384000 + static long aac_in_ioctl_shared(struct file *file, unsigned int cmd, void *arg) { struct q6audio_in *audio = file->private_data; @@ -233,6 +235,13 @@ static long aac_in_ioctl_shared(struct file *file, unsigned int cmd, void *arg) break; } + if (cfg->sample_rate > MAX_SAMPLE_RATE_384K) { + pr_err("%s: ERROR: invalid sample rate = %u", + __func__, cfg->sample_rate); + rc = -EINVAL; + break; + } + min_bitrate = ((cfg->sample_rate)*(cfg->channels))/2; /* This calculation should be based on AAC mode. But we cannot * get AAC mode in this setconfig. min_bitrate's logical max @@ -421,6 +430,8 @@ static long aac_in_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_aac_enc_config cfg; struct msm_audio_aac_enc_config32 cfg_32; + memset(&cfg_32, 0, sizeof(cfg_32)); + cmd = AUDIO_GET_AAC_ENC_CONFIG; rc = aac_in_ioctl_shared(file, cmd, &cfg); if (rc) { diff --git a/drivers/misc/qcom/qdsp6v2/amrnb_in.c b/drivers/misc/qcom/qdsp6v2/amrnb_in.c index eb92137f06717..0aed0860e803c 100644 --- a/drivers/misc/qcom/qdsp6v2/amrnb_in.c +++ b/drivers/misc/qcom/qdsp6v2/amrnb_in.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2012, 2014 The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2012, 2014, 2016 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 @@ -221,6 +221,8 @@ static long amrnb_in_compat_ioctl(struct file *file, struct msm_audio_amrnb_enc_config_v2 *amrnb_config; struct msm_audio_amrnb_enc_config_v2_32 amrnb_config_32; + memset(&amrnb_config_32, 0, sizeof(amrnb_config_32)); + amrnb_config = (struct msm_audio_amrnb_enc_config_v2 *)audio->enc_cfg; amrnb_config_32.band_mode = amrnb_config->band_mode; diff --git a/drivers/misc/qcom/qdsp6v2/amrwb_in.c b/drivers/misc/qcom/qdsp6v2/amrwb_in.c index 4cea3dc63389f..43dcbd597d7c4 100644 --- a/drivers/misc/qcom/qdsp6v2/amrwb_in.c +++ b/drivers/misc/qcom/qdsp6v2/amrwb_in.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2011-2012, 2014 The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2012, 2014, 2016 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 @@ -216,6 +217,8 @@ static long amrwb_in_compat_ioctl(struct file *file, struct msm_audio_amrwb_enc_config *amrwb_config; struct msm_audio_amrwb_enc_config_32 amrwb_config_32; + memset(&amrwb_config_32, 0, sizeof(amrwb_config_32)); + amrwb_config = (struct msm_audio_amrwb_enc_config *)audio->enc_cfg; amrwb_config_32.band_mode = amrwb_config->band_mode; @@ -307,7 +310,7 @@ static int amrwb_in_open(struct inode *inode, struct file *file) (void *)audio); if (!audio->ac) { - pr_err("%s:audio[%p]: Could not allocate memory for audio" + pr_err("%s:audio[%pK]: Could not allocate memory for audio" "client\n", __func__, audio); kfree(audio->enc_cfg); kfree(audio); diff --git a/drivers/misc/qcom/qdsp6v2/audio_aac.c b/drivers/misc/qcom/qdsp6v2/audio_aac.c index 73c0f281d43b8..1c791c89cc647 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_aac.c +++ b/drivers/misc/qcom/qdsp6v2/audio_aac.c @@ -221,10 +221,10 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); if (rc) - pr_err("%s[%p]:Failed in utils_ioctl: %d\n", + pr_err("%s[%pK]:Failed in utils_ioctl: %d\n", __func__, audio, rc); } } @@ -328,10 +328,10 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_compat_ioctl(file, cmd, arg); if (rc) - pr_err("%s[%p]:Failed in utils_ioctl: %d\n", + pr_err("%s[%pK]:Failed in utils_ioctl: %d\n", __func__, audio, rc); } } diff --git a/drivers/misc/qcom/qdsp6v2/audio_alac.c b/drivers/misc/qcom/qdsp6v2/audio_alac.c index cf129099a153e..646d37da1ba3f 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_alac.c +++ b/drivers/misc/qcom/qdsp6v2/audio_alac.c @@ -52,7 +52,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd, __func__, audio->pcm_cfg.channel_count); } - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -196,6 +196,8 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_alac_config *alac_config; struct msm_audio_alac_config_32 alac_config_32; + memset(&alac_config_32, 0, sizeof(alac_config_32)); + alac_config = (struct msm_audio_alac_config *)audio->codec_cfg; alac_config_32.frameLength = alac_config->frameLength; alac_config_32.compatVersion = diff --git a/drivers/misc/qcom/qdsp6v2/audio_amrnb.c b/drivers/misc/qcom/qdsp6v2/audio_amrnb.c index eceaf244e0841..34d4fb0cf14c0 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_amrnb.c +++ b/drivers/misc/qcom/qdsp6v2/audio_amrnb.c @@ -33,7 +33,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) switch (cmd) { case AUDIO_START: { - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -62,7 +62,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); } return rc; diff --git a/drivers/misc/qcom/qdsp6v2/audio_amrwb.c b/drivers/misc/qcom/qdsp6v2/audio_amrwb.c index 9ac03667a85ea..7dcaedfe4617e 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_amrwb.c +++ b/drivers/misc/qcom/qdsp6v2/audio_amrwb.c @@ -34,7 +34,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) switch (cmd) { case AUDIO_START: { - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -65,7 +65,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); } return rc; diff --git a/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c b/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c index 2f4ea14d77fe9..3c3f1c4927fd9 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c +++ b/drivers/misc/qcom/qdsp6v2/audio_amrwbplus.c @@ -55,7 +55,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd, switch (cmd) { case AUDIO_START: { - pr_err("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_err("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -162,7 +162,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); break; } @@ -205,6 +205,10 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_amrwbplus_config_v2 *amrwbplus_config; struct msm_audio_amrwbplus_config_v2_32 amrwbplus_config_32; + + memset(&amrwbplus_config_32, 0, + sizeof(amrwbplus_config_32)); + amrwbplus_config = (struct msm_audio_amrwbplus_config_v2 *) audio->codec_cfg; @@ -274,7 +278,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_compat_ioctl(file, cmd, arg); break; } diff --git a/drivers/misc/qcom/qdsp6v2/audio_ape.c b/drivers/misc/qcom/qdsp6v2/audio_ape.c index 1aaf8e8ea6611..737151279c27c 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_ape.c +++ b/drivers/misc/qcom/qdsp6v2/audio_ape.c @@ -39,7 +39,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd, case AUDIO_START: { struct asm_ape_cfg ape_cfg; struct msm_audio_ape_config *ape_config; - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -133,7 +133,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); @@ -180,6 +180,8 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_ape_config *ape_config; struct msm_audio_ape_config_32 ape_config_32; + memset(&ape_config_32, 0, sizeof(ape_config_32)); + ape_config = (struct msm_audio_ape_config *)audio->codec_cfg; ape_config_32.compatibleVersion = ape_config->compatibleVersion; ape_config_32.compressionLevel = @@ -229,7 +231,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_compat_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); diff --git a/drivers/misc/qcom/qdsp6v2/audio_evrc.c b/drivers/misc/qcom/qdsp6v2/audio_evrc.c index 0189dec1ddb96..75b81267df7e9 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_evrc.c +++ b/drivers/misc/qcom/qdsp6v2/audio_evrc.c @@ -34,7 +34,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) switch (cmd) { case AUDIO_START: { - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -65,7 +65,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); } return rc; diff --git a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c index 3a8834446ea40..e602650c4cb51 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c +++ b/drivers/misc/qcom/qdsp6v2/audio_hwacc_effects.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -17,7 +17,6 @@ #include "q6audio_common.h" #include "audio_utils_aio.h" #include -#include #define MAX_CHANNELS_SUPPORTED 8 #define WAIT_TIMEDOUT_DURATION_SECS 1 @@ -29,6 +28,8 @@ struct q6audio_effects { struct audio_client *ac; struct msm_hwacc_effects_config config; + struct mutex lock; + atomic_t in_count; atomic_t out_count; @@ -51,31 +52,11 @@ static void audio_effects_init_pp(struct audio_client *ac) pr_err("%s: audio client null to init pp\n", __func__); return; } - switch (ac->topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER: - - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_1); - if (ret < 0) - pr_err("%s: Send SoftVolume1 Param failed ret=%d\n", - __func__, ret); - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_2); - if (ret < 0) - pr_err("%s: Send SoftVolume2 Param failed ret=%d\n", - __func__, ret); - - msm_dts_eagle_init_master_module(ac); - - break; - default: - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_1); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); - break; - } + ret = q6asm_set_softvolume_v2(ac, &softvol, + SOFT_VOLUME_INSTANCE_1); + if (ret < 0) + pr_err("%s: Send SoftVolume Param failed ret=%d\n", + __func__, ret); } static void audio_effects_deinit_pp(struct audio_client *ac) @@ -84,13 +65,6 @@ static void audio_effects_deinit_pp(struct audio_client *ac) pr_err("%s: audio client null to deinit pp\n", __func__); return; } - switch (ac->topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER: - msm_dts_eagle_deinit_master_module(ac); - break; - default: - break; - } } static void audio_effects_event_handler(uint32_t opcode, uint32_t token, @@ -99,7 +73,7 @@ static void audio_effects_event_handler(uint32_t opcode, uint32_t token, struct q6audio_effects *effects; if (!payload || !priv) { - pr_err("%s: invalid data to handle events, payload: %p, priv: %p\n", + pr_err("%s: invalid data to handle events, payload: %pK, priv: %pK\n", __func__, payload, priv); return; } @@ -146,6 +120,8 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, case AUDIO_START: { pr_debug("%s: AUDIO_START\n", __func__); + mutex_lock(&effects->lock); + rc = q6asm_open_read_write_v2(effects->ac, FORMAT_LINEAR_PCM, FORMAT_MULTI_CHANNEL_LINEAR_PCM, @@ -157,6 +133,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, pr_err("%s: Open failed for hw accelerated effects:rc=%d\n", __func__, rc); rc = -EINVAL; + mutex_unlock(&effects->lock); goto ioctl_fail; } effects->opened = 1; @@ -173,6 +150,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, pr_err("%s: Write buffer Allocation failed rc = %d\n", __func__, rc); rc = -ENOMEM; + mutex_unlock(&effects->lock); goto ioctl_fail; } atomic_set(&effects->in_count, effects->config.input.num_buf); @@ -183,6 +161,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, pr_err("%s: Read buffer Allocation failed rc = %d\n", __func__, rc); rc = -ENOMEM; + mutex_unlock(&effects->lock); goto readbuf_fail; } atomic_set(&effects->out_count, effects->config.output.num_buf); @@ -197,6 +176,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, if (rc < 0) { pr_err("%s: pcm read block config failed\n", __func__); rc = -EINVAL; + mutex_unlock(&effects->lock); goto cfg_fail; } pr_debug("%s: dec: sample_rate: %d, num_channels: %d, bit_width: %d\n", @@ -211,6 +191,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, pr_err("%s: pcm write format block config failed\n", __func__); rc = -EINVAL; + mutex_unlock(&effects->lock); goto cfg_fail; } @@ -223,6 +204,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, effects->started = 0; pr_err("%s: ASM run state failed\n", __func__); } + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_WRITE: { @@ -230,8 +212,11 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, uint32_t idx = 0; uint32_t size = 0; + mutex_lock(&effects->lock); + if (!effects->started) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } @@ -241,11 +226,13 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, if (!rc) { pr_err("%s: write wait_event_timeout\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } if (!atomic_read(&effects->out_count)) { pr_err("%s: pcm stopped out_count 0\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } @@ -255,6 +242,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, copy_from_user(bufptr, (void *)arg, effects->config.buf_cfg.output_len)) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } rc = q6asm_write(effects->ac, @@ -262,6 +250,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, 0, 0, NO_TIMESTAMP); if (rc < 0) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } atomic_dec(&effects->out_count); @@ -269,6 +258,7 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, pr_err("%s: AUDIO_EFFECTS_WRITE: Buffer dropped\n", __func__); } + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_READ: { @@ -276,8 +266,11 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, uint32_t idx = 0; uint32_t size = 0; + mutex_lock(&effects->lock); + if (!effects->started) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } @@ -294,11 +287,13 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, if (!rc) { pr_err("%s: read wait_event_timeout\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } if (!atomic_read(&effects->in_count)) { pr_err("%s: pcm stopped in_count 0\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } @@ -306,15 +301,18 @@ static int audio_effects_shared_ioctl(struct file *file, unsigned cmd, if (bufptr) { if (!((void *)arg)) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } if ((effects->config.buf_cfg.input_len > size) || copy_to_user((void *)arg, bufptr, effects->config.buf_cfg.input_len)) { rc = -EFAULT; + mutex_unlock(&effects->lock); goto ioctl_fail; } } + mutex_unlock(&effects->lock); break; } default: @@ -402,33 +400,6 @@ static long audio_effects_set_pp_param(struct q6audio_effects *effects, &(effects->audio_effects.topo_switch_vol), (long *)&values[1], SOFT_VOLUME_INSTANCE_2); break; - case DTS_EAGLE_MODULE_ENABLE: - pr_debug("%s: DTS_EAGLE_MODULE_ENABLE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top( - effects_module, effects->ac->topology)) { - /* - * HPX->OFF: first disable HPX and then - * enable SA+ - * HPX->ON: first disable SA+ and then - * enable HPX - */ - bool hpx_state = (bool)values[1]; - if (hpx_state) - msm_audio_effects_enable_extn(effects->ac, - &(effects->audio_effects), - false); - msm_dts_eagle_enable_asm(effects->ac, - hpx_state, - AUDPROC_MODULE_ID_DTS_HPX_PREMIX); - msm_dts_eagle_enable_asm(effects->ac, - hpx_state, - AUDPROC_MODULE_ID_DTS_HPX_POSTMIX); - if (!hpx_state) - msm_audio_effects_enable_extn(effects->ac, - &(effects->audio_effects), - true); - } - break; default: pr_err("%s: Invalid effects config module\n", __func__); rc = -EINVAL; @@ -446,6 +417,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, switch (cmd) { case AUDIO_SET_EFFECTS_CONFIG: { pr_debug("%s: AUDIO_SET_EFFECTS_CONFIG\n", __func__); + mutex_lock(&effects->lock); memset(&effects->config, 0, sizeof(effects->config)); if (copy_from_user(&effects->config, (void *)arg, sizeof(effects->config))) { @@ -463,9 +435,11 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, effects->config.input.num_buf, effects->config.input.sample_rate, effects->config.input.num_channels); + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_SET_BUF_LEN: { + mutex_lock(&effects->lock); if (copy_from_user(&effects->config.buf_cfg, (void *)arg, sizeof(effects->config.buf_cfg))) { pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n", @@ -475,6 +449,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, pr_debug("%s: write buf len: %d, read buf len: %d\n", __func__, effects->config.buf_cfg.output_len, effects->config.buf_cfg.input_len); + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_GET_BUF_AVAIL: { @@ -482,6 +457,7 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, buf_avail.input_num_avail = atomic_read(&effects->in_count); buf_avail.output_num_avail = atomic_read(&effects->out_count); + mutex_lock(&effects->lock); pr_debug("%s: write buf avail: %d, read buf avail: %d\n", __func__, buf_avail.output_num_avail, buf_avail.input_num_avail); @@ -491,16 +467,20 @@ static long audio_effects_ioctl(struct file *file, unsigned int cmd, __func__); rc = -EFAULT; } + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_SET_PP_PARAMS: { + mutex_lock(&effects->lock); if (copy_from_user(argvalues, (void *)arg, MAX_PP_PARAMS_SZ*sizeof(long))) { pr_err("%s: copy from user for pp params failed\n", __func__); + mutex_unlock(&effects->lock); return -EFAULT; } rc = audio_effects_set_pp_param(effects, argvalues); + mutex_unlock(&effects->lock); break; } default: @@ -566,12 +546,14 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, case AUDIO_SET_EFFECTS_CONFIG32: { struct msm_hwacc_effects_config32 config32; struct msm_hwacc_effects_config *config = &effects->config; + mutex_lock(&effects->lock); memset(&effects->config, 0, sizeof(effects->config)); if (copy_from_user(&config32, (void *)arg, sizeof(config32))) { pr_err("%s: copy to user for AUDIO_SET_EFFECTS_CONFIG failed\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); break; } config->input.buf_size = config32.input.buf_size; @@ -608,16 +590,19 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, effects->config.input.num_buf, effects->config.input.sample_rate, effects->config.input.num_channels); + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_SET_BUF_LEN32: { struct msm_hwacc_buf_cfg32 buf_cfg32; struct msm_hwacc_effects_config *config = &effects->config; + mutex_lock(&effects->lock); if (copy_from_user(&buf_cfg32, (void *)arg, sizeof(buf_cfg32))) { pr_err("%s: copy from user for AUDIO_EFFECTS_SET_BUF_LEN failed\n", __func__); rc = -EFAULT; + mutex_unlock(&effects->lock); break; } config->buf_cfg.input_len = buf_cfg32.input_len; @@ -625,11 +610,15 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, pr_debug("%s: write buf len: %d, read buf len: %d\n", __func__, effects->config.buf_cfg.output_len, effects->config.buf_cfg.input_len); + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_GET_BUF_AVAIL32: { struct msm_hwacc_buf_avail32 buf_avail; + memset(&buf_avail, 0, sizeof(buf_avail)); + + mutex_lock(&effects->lock); buf_avail.input_num_avail = atomic_read(&effects->in_count); buf_avail.output_num_avail = atomic_read(&effects->out_count); pr_debug("%s: write buf avail: %d, read buf avail: %d\n", @@ -641,22 +630,26 @@ static long audio_effects_compat_ioctl(struct file *file, unsigned int cmd, __func__); rc = -EFAULT; } + mutex_unlock(&effects->lock); break; } case AUDIO_EFFECTS_SET_PP_PARAMS32: { long argvalues[MAX_PP_PARAMS_SZ] = {0}; int argvalues32[MAX_PP_PARAMS_SZ] = {0}; + mutex_lock(&effects->lock); if (copy_from_user(argvalues32, (void *)arg, MAX_PP_PARAMS_SZ*sizeof(int))) { pr_err("%s: copy from user failed for pp params\n", __func__); + mutex_unlock(&effects->lock); return -EFAULT; } for (i = 0; i < MAX_PP_PARAMS_SZ; i++) argvalues[i] = argvalues32[i]; rc = audio_effects_set_pp_param(effects, argvalues); + mutex_unlock(&effects->lock); break; } case AUDIO_START32: { @@ -703,7 +696,7 @@ static int audio_effects_release(struct inode *inode, struct file *file) __func__); rc = q6asm_cmd(effects->ac, CMD_CLOSE); if (rc < 0) - pr_err("%s[%p]:Failed to close the session rc=%d\n", + pr_err("%s[%pK]:Failed to close the session rc=%d\n", __func__, effects, rc); effects->opened = 0; effects->started = 0; @@ -717,6 +710,7 @@ static int audio_effects_release(struct inode *inode, struct file *file) } q6asm_audio_client_free(effects->ac); + mutex_destroy(&effects->lock); kfree(effects); pr_debug("%s: close session success\n", __func__); @@ -747,6 +741,7 @@ static int audio_effects_open(struct inode *inode, struct file *file) init_waitqueue_head(&effects->read_wait); init_waitqueue_head(&effects->write_wait); + mutex_init(&effects->lock); effects->opened = 0; effects->started = 0; diff --git a/drivers/misc/qcom/qdsp6v2/audio_mp3.c b/drivers/misc/qcom/qdsp6v2/audio_mp3.c index c29b5f911e84f..2417ddf2a6c65 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_mp3.c +++ b/drivers/misc/qcom/qdsp6v2/audio_mp3.c @@ -33,7 +33,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) int rc = 0; switch (cmd) { case AUDIO_START: { - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -69,7 +69,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); } return rc; diff --git a/drivers/misc/qcom/qdsp6v2/audio_multi_aac.c b/drivers/misc/qcom/qdsp6v2/audio_multi_aac.c index 858f7bc3d9069..4ac74a5635c09 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_multi_aac.c +++ b/drivers/misc/qcom/qdsp6v2/audio_multi_aac.c @@ -302,6 +302,8 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_aac_config *aac_config; struct msm_audio_aac_config32 aac_config_32; + memset(&aac_config_32, 0, sizeof(aac_config_32)); + aac_config = (struct msm_audio_aac_config *)audio->codec_cfg; aac_config_32.format = aac_config->format; aac_config_32.audio_object = aac_config->audio_object; diff --git a/drivers/misc/qcom/qdsp6v2/audio_qcelp.c b/drivers/misc/qcom/qdsp6v2/audio_qcelp.c index 102cdab9abdd9..f45d3dd8e0d3e 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_qcelp.c +++ b/drivers/misc/qcom/qdsp6v2/audio_qcelp.c @@ -36,7 +36,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) switch (cmd) { case AUDIO_START: { - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -67,7 +67,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); } return rc; diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils.c b/drivers/misc/qcom/qdsp6v2/audio_utils.c index cec449dafc703..15d82d126df7d 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils.c @@ -24,6 +24,15 @@ #include #include "audio_utils.h" +/* + * Define maximum buffer size. Below values are chosen considering the higher + * values used among all native drivers. + */ +#define MAX_FRAME_SIZE 1536 +#define MAX_FRAMES 5 +#define META_SIZE (sizeof(struct meta_out_dsp)) +#define MAX_BUFFER_SIZE (1 + ((MAX_FRAME_SIZE + META_SIZE) * MAX_FRAMES)) + static int audio_in_pause(struct q6audio_in *audio) { int rc; @@ -329,6 +338,10 @@ long audio_in_ioctl(struct file *file, rc = -EINVAL; break; } + if (cfg.buffer_size > MAX_BUFFER_SIZE) { + rc = -EINVAL; + break; + } audio->str_cfg.buffer_size = cfg.buffer_size; audio->str_cfg.buffer_count = cfg.buffer_count; if (audio->opened) { @@ -744,7 +757,7 @@ ssize_t audio_in_read(struct file *file, count -= bytes_to_copy; buf += bytes_to_copy; } else { - pr_err("%s:session id %d: short read data[%p] bytesavail[%d]bytesrequest[%zd]\n", + pr_err("%s:session id %d: short read data[%pK] bytesavail[%d]bytesrequest[%zd]\n", __func__, audio->ac->session, data, size, count); @@ -883,7 +896,7 @@ ssize_t audio_in_write(struct file *file, buf += xfer; } mutex_unlock(&audio->write_lock); - pr_debug("%s:session id %d: eos_condition 0x%x buf[0x%p] start[0x%p]\n", + pr_debug("%s:session id %d: eos_condition 0x%x buf[0x%pK] start[0x%pK]\n", __func__, audio->ac->session, nflags, buf, start); if (nflags & AUD_EOS_SET) { diff --git a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c index f27e6afde2875..0aa81ea4bff50 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c +++ b/drivers/misc/qcom/qdsp6v2/audio_utils_aio.c @@ -1,6 +1,6 @@ /* Copyright (C) 2008 Google, Inc. * Copyright (C) 2008 HTC Corporation - * Copyright (c) 2009-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -26,11 +26,14 @@ #include #include #include +#include #include "audio_utils_aio.h" #ifdef CONFIG_USE_DEV_CTRL_VOLUME #include #endif /*CONFIG_USE_DEV_CTRL_VOLUME*/ +DEFINE_MUTEX(lock); #ifdef CONFIG_DEBUG_FS + int audio_aio_debug_open(struct inode *inode, struct file *file) { file->private_data = inode->i_private; @@ -43,29 +46,37 @@ ssize_t audio_aio_debug_read(struct file *file, char __user *buf, const int debug_bufmax = 4096; static char buffer[4096]; int n = 0; - struct q6audio_aio *audio = file->private_data; + struct q6audio_aio *audio; - mutex_lock(&audio->lock); - n = scnprintf(buffer, debug_bufmax, "opened %d\n", audio->opened); - n += scnprintf(buffer + n, debug_bufmax - n, - "enabled %d\n", audio->enabled); - n += scnprintf(buffer + n, debug_bufmax - n, - "stopped %d\n", audio->stopped); - n += scnprintf(buffer + n, debug_bufmax - n, - "feedback %d\n", audio->feedback); - mutex_unlock(&audio->lock); - /* Following variables are only useful for debugging when - * when playback halts unexpectedly. Thus, no mutual exclusion - * enforced - */ - n += scnprintf(buffer + n, debug_bufmax - n, - "wflush %d\n", audio->wflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "rflush %d\n", audio->rflush); - n += scnprintf(buffer + n, debug_bufmax - n, - "inqueue empty %d\n", list_empty(&audio->in_queue)); - n += scnprintf(buffer + n, debug_bufmax - n, - "outqueue empty %d\n", list_empty(&audio->out_queue)); + mutex_lock(&lock); + if (file->private_data != NULL) { + audio = file->private_data; + mutex_lock(&audio->lock); + n = scnprintf(buffer, debug_bufmax, "opened %d\n", + audio->opened); + n += scnprintf(buffer + n, debug_bufmax - n, + "enabled %d\n", audio->enabled); + n += scnprintf(buffer + n, debug_bufmax - n, + "stopped %d\n", audio->stopped); + n += scnprintf(buffer + n, debug_bufmax - n, + "feedback %d\n", audio->feedback); + mutex_unlock(&audio->lock); + /* Following variables are only useful for debugging when + * when playback halts unexpectedly. Thus, no mutual exclusion + * enforced + */ + n += scnprintf(buffer + n, debug_bufmax - n, + "wflush %d\n", audio->wflush); + n += scnprintf(buffer + n, debug_bufmax - n, + "rflush %d\n", audio->rflush); + n += scnprintf(buffer + n, debug_bufmax - n, + "inqueue empty %d\n", + list_empty(&audio->in_queue)); + n += scnprintf(buffer + n, debug_bufmax - n, + "outqueue empty %d\n", + list_empty(&audio->out_queue)); + } + mutex_unlock(&lock); buffer[n] = 0; return simple_read_from_buffer(buf, count, ppos, buffer, n); } @@ -83,7 +94,7 @@ int insert_eos_buf(struct q6audio_aio *audio, struct audio_aio_buffer_node *buf_node) { struct dec_meta_out *eos_buf = buf_node->kvaddr; - pr_debug("%s[%p]:insert_eos_buf\n", __func__, audio); + pr_debug("%s[%pK]:insert_eos_buf\n", __func__, audio); eos_buf->num_of_frames = 0xFFFFFFFF; eos_buf->meta_out_dsp[0].offset_to_frame = 0x0; eos_buf->meta_out_dsp[0].nflags = AUDIO_DEC_EOS_SET; @@ -119,7 +130,10 @@ static int audio_aio_ion_lookup_vaddr(struct q6audio_aio *audio, void *addr, list_for_each_entry(region_elt, &audio->ion_region_queue, list) { if (addr >= region_elt->vaddr && addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) { + addr + len <= region_elt->vaddr + region_elt->len && + addr + len > addr) { + /* to avoid integer addition overflow */ + /* offset since we could pass vaddr inside a registerd * ion buffer */ @@ -131,14 +145,15 @@ static int audio_aio_ion_lookup_vaddr(struct q6audio_aio *audio, void *addr, } if (match_count > 1) { - pr_err("%s[%p]:multiple hits for vaddr %p, len %ld\n", + pr_err("%s[%pK]:multiple hits for vaddr %pK, len %ld\n", __func__, audio, addr, len); list_for_each_entry(region_elt, &audio->ion_region_queue, list) { if (addr >= region_elt->vaddr && addr < region_elt->vaddr + region_elt->len && - addr + len <= region_elt->vaddr + region_elt->len) - pr_err("\t%s[%p]:%p, %ld --> %pa\n", + addr + len <= region_elt->vaddr + region_elt->len && + addr + len > addr) + pr_err("\t%s[%pK]:%pK, %ld --> %pK\n", __func__, audio, region_elt->vaddr, region_elt->len, @@ -158,7 +173,7 @@ static phys_addr_t audio_aio_ion_fixup(struct q6audio_aio *audio, void *addr, ret = audio_aio_ion_lookup_vaddr(audio, addr, len, ®ion); if (ret) { - pr_err("%s[%p]:lookup (%p, %ld) failed\n", + pr_err("%s[%pK]:lookup (%pK, %ld) failed\n", __func__, audio, addr, len); return 0; } @@ -166,7 +181,7 @@ static phys_addr_t audio_aio_ion_fixup(struct q6audio_aio *audio, void *addr, region->ref_cnt++; else region->ref_cnt--; - pr_debug("%s[%p]:found region %p ref_cnt %d\n", + pr_debug("%s[%pK]:found region %pK ref_cnt %d\n", __func__, audio, region, region->ref_cnt); paddr = region->paddr + (addr - region->vaddr); /* provide kernel virtual address for accessing meta information */ @@ -179,26 +194,26 @@ static int audio_aio_pause(struct q6audio_aio *audio) { int rc = -EINVAL; - pr_debug("%s[%p], enabled = %d\n", __func__, audio, + pr_debug("%s[%pK], enabled = %d\n", __func__, audio, audio->enabled); if (audio->enabled) { rc = q6asm_cmd(audio->ac, CMD_PAUSE); if (rc < 0) - pr_err("%s[%p]: pause cmd failed rc=%d\n", + pr_err("%s[%pK]: pause cmd failed rc=%d\n", __func__, audio, rc); if (rc == 0) { /* Send suspend only if pause was successful */ rc = q6asm_cmd(audio->ac, CMD_SUSPEND); if (rc < 0) - pr_err("%s[%p]: suspend cmd failed rc=%d\n", + pr_err("%s[%pK]: suspend cmd failed rc=%d\n", __func__, audio, rc); } else - pr_err("%s[%p]: not sending suspend since pause failed\n", + pr_err("%s[%pK]: not sending suspend since pause failed\n", __func__, audio); } else - pr_err("%s[%p]: Driver not enabled\n", __func__, audio); + pr_err("%s[%pK]: Driver not enabled\n", __func__, audio); return rc; } @@ -212,7 +227,7 @@ static int audio_aio_flush(struct q6audio_aio *audio) if (!(audio->drv_status & ADRV_STATUS_PAUSE)) { rc = audio_aio_pause(audio); if (rc < 0) - pr_err("%s[%p}: pause cmd failed rc=%d\n", + pr_err("%s[%pK}: pause cmd failed rc=%d\n", __func__, audio, rc); else @@ -220,13 +235,13 @@ static int audio_aio_flush(struct q6audio_aio *audio) } rc = q6asm_cmd(audio->ac, CMD_FLUSH); if (rc < 0) - pr_err("%s[%p]: flush cmd failed rc=%d\n", + pr_err("%s[%pK]: flush cmd failed rc=%d\n", __func__, audio, rc); /* Not in stop state, reenable the stream */ if (audio->stopped == 0) { rc = audio_aio_enable(audio); if (rc) - pr_err("%s[%p]:audio re-enable failed\n", + pr_err("%s[%pK]:audio re-enable failed\n", __func__, audio); else { audio->enabled = 1; @@ -235,9 +250,9 @@ static int audio_aio_flush(struct q6audio_aio *audio) } } } - pr_debug("%s[%p]:in_bytes %d\n", + pr_debug("%s[%pK]:in_bytes %d\n", __func__, audio, atomic_read(&audio->in_bytes)); - pr_debug("%s[%p]:in_samples %d\n", + pr_debug("%s[%pK]:in_samples %d\n", __func__, audio, atomic_read(&audio->in_samples)); atomic_set(&audio->in_bytes, 0); atomic_set(&audio->in_samples, 0); @@ -250,7 +265,7 @@ static int audio_aio_outport_flush(struct q6audio_aio *audio) rc = q6asm_cmd(audio->ac, CMD_OUT_FLUSH); if (rc < 0) - pr_err("%s[%p}: output port flush cmd failed rc=%d\n", + pr_err("%s[%pK}: output port flush cmd failed rc=%d\n", __func__, audio, rc); return rc; } @@ -278,19 +293,19 @@ void audio_aio_async_write_ack(struct q6audio_aio *audio, uint32_t token, if (token == used_buf->token) { list_del(&used_buf->list); spin_unlock_irqrestore(&audio->dsp_lock, flags); - pr_debug("%s[%p]:consumed buffer\n", __func__, audio); + pr_debug("%s[%pK]:consumed buffer\n", __func__, audio); event_payload.aio_buf = used_buf->buf; audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, event_payload); kfree(used_buf); if (list_empty(&audio->out_queue) && (audio->drv_status & ADRV_STATUS_FSYNC)) { - pr_debug("%s[%p]: list is empty, reached EOS in Tunnel\n", + pr_debug("%s[%pK]: list is empty, reached EOS in Tunnel\n", __func__, audio); wake_up(&audio->write_wait); } } else { - pr_err("%s[%p]:expected=%x ret=%x\n", + pr_err("%s[%pK]:expected=%x ret=%x\n", __func__, audio, used_buf->token, token); spin_unlock_irqrestore(&audio->dsp_lock, flags); } @@ -304,13 +319,13 @@ void audio_aio_async_out_flush(struct q6audio_aio *audio) union msm_audio_event_payload payload; unsigned long flags; - pr_debug("%s[%p}\n", __func__, audio); + pr_debug("%s[%pK}\n", __func__, audio); /* EOS followed by flush, EOS response not guranteed, free EOS i/p buffer */ spin_lock_irqsave(&audio->dsp_lock, flags); if (audio->eos_flag && (audio->eos_write_payload.aio_buf.buf_addr)) { - pr_debug("%s[%p]: EOS followed by flush received,acknowledge"\ + pr_debug("%s[%pK]: EOS followed by flush received,acknowledge" " eos i/p buffer immediately\n", __func__, audio); audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, audio->eos_write_payload); @@ -324,7 +339,7 @@ void audio_aio_async_out_flush(struct q6audio_aio *audio) payload.aio_buf = buf_node->buf; audio_aio_post_event(audio, AUDIO_EVENT_WRITE_DONE, payload); kfree(buf_node); - pr_debug("%s[%p]: Propagate WRITE_DONE during flush\n", + pr_debug("%s[%pK]: Propagate WRITE_DONE during flush\n", __func__, audio); } } @@ -335,14 +350,14 @@ void audio_aio_async_in_flush(struct q6audio_aio *audio) struct list_head *ptr, *next; union msm_audio_event_payload payload; - pr_debug("%s[%p]\n", __func__, audio); + pr_debug("%s[%pK]\n", __func__, audio); list_for_each_safe(ptr, next, &audio->in_queue) { buf_node = list_entry(ptr, struct audio_aio_buffer_node, list); list_del(&buf_node->list); /* Forcefull send o/p eos buffer after flush, if no eos response * received by dsp even after sending eos command */ if ((audio->eos_rsp != 1) && audio->eos_flag) { - pr_debug("%s[%p]: send eos on o/p buffer during flush\n", + pr_debug("%s[%pK]: send eos on o/p buffer during flush\n", __func__, audio); payload.aio_buf = buf_node->buf; payload.aio_buf.data_len = @@ -355,7 +370,7 @@ void audio_aio_async_in_flush(struct q6audio_aio *audio) } audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, payload); kfree(buf_node); - pr_debug("%s[%p]: Propagate READ_DONE during flush\n", + pr_debug("%s[%pK]: Propagate READ_DONE during flush\n", __func__, audio); } } @@ -373,19 +388,19 @@ int audio_aio_disable(struct q6audio_aio *audio) if (audio->opened) { audio->enabled = 0; audio->opened = 0; - pr_debug("%s[%p]: inbytes[%d] insamples[%d]\n", __func__, + pr_debug("%s[%pK]: inbytes[%d] insamples[%d]\n", __func__, audio, atomic_read(&audio->in_bytes), atomic_read(&audio->in_samples)); /* Close the session */ rc = q6asm_cmd(audio->ac, CMD_CLOSE); if (rc < 0) - pr_err("%s[%p]:Failed to close the session rc=%d\n", + pr_err("%s[%pK]:Failed to close the session rc=%d\n", __func__, audio, rc); audio->stopped = 1; wake_up(&audio->write_wait); wake_up(&audio->cmd_wait); } - pr_debug("%s[%p]:enabled[%d]\n", __func__, audio, audio->enabled); + pr_debug("%s[%pK]:enabled[%d]\n", __func__, audio, audio->enabled); return rc; } @@ -434,16 +449,16 @@ static void audio_aio_unmap_ion_region(struct q6audio_aio *audio) struct list_head *ptr, *next; int rc = -EINVAL; - pr_debug("%s[%p]:\n", __func__, audio); + pr_debug("%s[%pK]:\n", __func__, audio); list_for_each_safe(ptr, next, &audio->ion_region_queue) { region = list_entry(ptr, struct audio_aio_ion_region, list); if (region != NULL) { - pr_debug("%s[%p]: phy_address = 0x%pa\n", + pr_debug("%s[%pK]: phy_address = 0x%pK\n", __func__, audio, ®ion->paddr); rc = q6asm_memory_unmap(audio->ac, region->paddr, IN); if (rc < 0) - pr_err("%s[%p]: memory unmap failed\n", + pr_err("%s[%pK]: memory unmap failed\n", __func__, audio); } } @@ -460,20 +475,20 @@ static void audio_aio_listner(u32 evt_id, union auddev_evt_data *evt_payload, switch (evt_id) { case AUDDEV_EVT_STREAM_VOL_CHG: audio->volume = evt_payload->session_vol; - pr_debug("%s[%p]: AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d, enabled = %d\n", + pr_debug("%s[%pK]: AUDDEV_EVT_STREAM_VOL_CHG, stream vol %d, enabled = %d\n", __func__, audio, audio->volume, audio->enabled); if (audio->enabled == 1) { if (audio->ac) { rc = q6asm_set_volume(audio->ac, audio->volume); if (rc < 0) { - pr_err("%s[%p]: Send Volume command failed rc=%d\n", + pr_err("%s[%pK]: Send Volume command failed rc=%d\n", __func__, audio, rc); } } } break; default: - pr_err("%s[%p]:ERROR:wrong event\n", __func__, audio); + pr_err("%s[%pK]:ERROR:wrong event\n", __func__, audio); break; } } @@ -490,7 +505,7 @@ int register_volume_listener(struct q6audio_aio *audio) audio_aio_listner, (void *)audio); if (rc < 0) { - pr_err("%s[%p]: Event listener failed\n", __func__, audio); + pr_err("%s[%pK]: Event listener failed\n", __func__, audio); rc = -EACCES; } return rc; @@ -508,7 +523,7 @@ int enable_volume_ramp(struct q6audio_aio *audio) if (audio->ac == NULL) return -EINVAL; - pr_debug("%s[%p]\n", __func__, audio); + pr_debug("%s[%pK]\n", __func__, audio); softpause.enable = SOFT_PAUSE_ENABLE; softpause.period = SOFT_PAUSE_PERIOD; softpause.step = SOFT_PAUSE_STEP; @@ -568,8 +583,11 @@ int enable_volume_ramp(struct q6audio_aio *audio) int audio_aio_release(struct inode *inode, struct file *file) { struct q6audio_aio *audio = file->private_data; - pr_debug("%s[%p]\n", __func__, audio); + pr_debug("%s[%pK]\n", __func__, audio); + mutex_lock(&lock); mutex_lock(&audio->lock); + mutex_lock(&audio->read_lock); + mutex_lock(&audio->write_lock); audio->wflush = 1; if (audio->wakelock_voted && (audio->audio_ws_mgr != NULL) && @@ -595,6 +613,8 @@ int audio_aio_release(struct inode *inode, struct file *file) wake_up(&audio->event_wait); audio_aio_reset_event_queue(audio); q6asm_audio_client_free(audio->ac); + mutex_unlock(&audio->write_lock); + mutex_unlock(&audio->read_lock); mutex_unlock(&audio->lock); mutex_destroy(&audio->lock); mutex_destroy(&audio->read_lock); @@ -608,6 +628,8 @@ int audio_aio_release(struct inode *inode, struct file *file) #endif kfree(audio->codec_cfg); kfree(audio); + file->private_data = NULL; + mutex_unlock(&lock); return 0; } @@ -624,56 +646,56 @@ int audio_aio_fsync(struct file *file, loff_t start, loff_t end, int datasync) audio->drv_status |= ADRV_STATUS_FSYNC; mutex_unlock(&audio->lock); - pr_debug("%s[%p]:\n", __func__, audio); + pr_debug("%s[%pK]:\n", __func__, audio); audio->eos_rsp = 0; - pr_debug("%s[%p]Wait for write done from DSP\n", __func__, audio); + pr_debug("%s[%pK]Wait for write done from DSP\n", __func__, audio); rc = wait_event_interruptible(audio->write_wait, (list_empty(&audio->out_queue)) || audio->wflush || audio->stopped); if (audio->stopped || audio->wflush) { - pr_debug("%s[%p]: Audio Flushed or Stopped,this is not EOS\n" + pr_debug("%s[%pK]: Audio Flushed or Stopped,this is not EOS\n" , __func__, audio); audio->wflush = 0; rc = -EBUSY; } if (rc < 0) { - pr_err("%s[%p]: wait event for list_empty failed, rc = %d\n", + pr_err("%s[%pK]: wait event for list_empty failed, rc = %d\n", __func__, audio, rc); goto done; } rc = q6asm_cmd(audio->ac, CMD_EOS); - pr_debug("%s[%p]: EOS cmd sent to DSP\n", __func__, audio); + pr_debug("%s[%pK]: EOS cmd sent to DSP\n", __func__, audio); if (rc < 0) - pr_err("%s[%p]: q6asm_cmd failed, rc = %d", + pr_err("%s[%pK]: q6asm_cmd failed, rc = %d", __func__, audio, rc); - pr_debug("%s[%p]: wait for RENDERED_EOS from DSP\n" + pr_debug("%s[%pK]: wait for RENDERED_EOS from DSP\n" , __func__, audio); rc = wait_event_interruptible(audio->write_wait, (audio->eos_rsp || audio->wflush || audio->stopped)); if (rc < 0) { - pr_err("%s[%p]: wait event for eos_rsp failed, rc = %d\n", + pr_err("%s[%pK]: wait event for eos_rsp failed, rc = %d\n", __func__, audio, rc); goto done; } if (audio->stopped || audio->wflush) { audio->wflush = 0; - pr_debug("%s[%p]: Audio Flushed or Stopped,this is not EOS\n" + pr_debug("%s[%pK]: Audio Flushed or Stopped,this is not EOS\n" , __func__, audio); rc = -EBUSY; } if (audio->eos_rsp == 1) - pr_debug("%s[%p]: EOS\n", __func__, audio); + pr_debug("%s[%pK]: EOS\n", __func__, audio); done: @@ -744,21 +766,21 @@ static long audio_aio_process_event_req_common(struct q6audio_aio *audio, usr_evt->event_payload = drv_evt->payload; list_add_tail(&drv_evt->list, &audio->free_event_queue); } else { - pr_err("%s[%p]:Unexpected path\n", __func__, audio); + pr_err("%s[%pK]:Unexpected path\n", __func__, audio); spin_unlock_irqrestore(&audio->event_queue_lock, flags); return -EPERM; } spin_unlock_irqrestore(&audio->event_queue_lock, flags); if (drv_evt->event_type == AUDIO_EVENT_WRITE_DONE) { - pr_debug("%s[%p]:posted AUDIO_EVENT_WRITE_DONE to user\n", + pr_debug("%s[%pK]:posted AUDIO_EVENT_WRITE_DONE to user\n", __func__, audio); mutex_lock(&audio->write_lock); audio_aio_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, drv_evt->payload.aio_buf.buf_len, 0, 0); mutex_unlock(&audio->write_lock); } else if (drv_evt->event_type == AUDIO_EVENT_READ_DONE) { - pr_debug("%s[%p]:posted AUDIO_EVENT_READ_DONE to user\n", + pr_debug("%s[%pK]:posted AUDIO_EVENT_READ_DONE to user\n", __func__, audio); mutex_lock(&audio->read_lock); audio_aio_ion_fixup(audio, drv_evt->payload.aio_buf.buf_addr, @@ -770,7 +792,7 @@ static long audio_aio_process_event_req_common(struct q6audio_aio *audio, * Once EOS indicated */ if (audio->eos_rsp && !list_empty(&audio->in_queue)) { - pr_debug("%s[%p]:Send flush command to release read buffers"\ + pr_debug("%s[%pK]:Send flush command to release read buffers" " held up in DSP\n", __func__, audio); mutex_lock(&audio->lock); audio_aio_flush(audio); @@ -844,6 +866,7 @@ static long audio_aio_process_event_req_compat(struct q6audio_aio *audio, long rc; struct msm_audio_event32 usr_evt_32; struct msm_audio_event usr_evt; + memset(&usr_evt, 0, sizeof(struct msm_audio_event)); if (copy_from_user(&usr_evt_32, arg, sizeof(struct msm_audio_event32))) { @@ -853,6 +876,11 @@ static long audio_aio_process_event_req_compat(struct q6audio_aio *audio, usr_evt.timeout_ms = usr_evt_32.timeout_ms; rc = audio_aio_process_event_req_common(audio, &usr_evt); + if (rc < 0) { + pr_err("%s: audio process event failed, rc = %ld", + __func__, rc); + return rc; + } usr_evt_32.event_type = usr_evt.event_type; switch (usr_evt_32.event_type) { @@ -913,7 +941,7 @@ static int audio_aio_ion_check(struct q6audio_aio *audio, list_for_each_entry(region_elt, &audio->ion_region_queue, list) { if (CONTAINS(region_elt, &t) || CONTAINS(&t, region_elt) || OVERLAPS(region_elt, &t)) { - pr_err("%s[%p]:region (vaddr %p len %ld) clashes with registered region (vaddr %p paddr %pa len %ld)\n", + pr_err("%s[%pK]:region (vaddr %pK len %ld) clashes with registered region (vaddr %pK paddr %pK len %ld)\n", __func__, audio, vaddr, len, region_elt->vaddr, ®ion_elt->paddr, region_elt->len); @@ -935,7 +963,7 @@ static int audio_aio_ion_add(struct q6audio_aio *audio, unsigned long ionflag; void *kvaddr = NULL; - pr_debug("%s[%p]:\n", __func__, audio); + pr_debug("%s[%pK]:\n", __func__, audio); region = kmalloc(sizeof(*region), GFP_KERNEL); if (!region) { @@ -964,14 +992,14 @@ static int audio_aio_ion_add(struct q6audio_aio *audio, region->kvaddr = kvaddr; region->len = len; region->ref_cnt = 0; - pr_debug("%s[%p]:add region paddr %pa vaddr %p, len %lu kvaddr %p\n", + pr_debug("%s[%pK]:add region paddr %pK vaddr %pK, len %lu kvaddr %pK\n", __func__, audio, ®ion->paddr, region->vaddr, region->len, region->kvaddr); list_add_tail(®ion->list, &audio->ion_region_queue); rc = q6asm_memory_map(audio->ac, paddr, IN, len, 1); if (rc < 0) { - pr_err("%s[%p]: memory map failed\n", __func__, audio); + pr_err("%s[%pK]: memory map failed\n", __func__, audio); goto mmap_error; } else { goto end; @@ -993,7 +1021,7 @@ static int audio_aio_ion_remove(struct q6audio_aio *audio, struct list_head *ptr, *next; int rc = -EINVAL; - pr_debug("%s[%p]:info fd %d vaddr %p\n", + pr_debug("%s[%pK]:info fd %d vaddr %pK\n", __func__, audio, info->fd, info->vaddr); list_for_each_safe(ptr, next, &audio->ion_region_queue) { @@ -1002,17 +1030,17 @@ static int audio_aio_ion_remove(struct q6audio_aio *audio, if ((region->fd == info->fd) && (region->vaddr == info->vaddr)) { if (region->ref_cnt) { - pr_debug("%s[%p]:region %p in use ref_cnt %d\n", + pr_debug("%s[%pK]:region %pK in use ref_cnt %d\n", __func__, audio, region, region->ref_cnt); break; } - pr_debug("%s[%p]:remove region fd %d vaddr %p\n", + pr_debug("%s[%pK]:remove region fd %d vaddr %pK\n", __func__, audio, info->fd, info->vaddr); rc = q6asm_memory_unmap(audio->ac, region->paddr, IN); if (rc < 0) - pr_err("%s[%p]: memory unmap failed\n", + pr_err("%s[%pK]: memory unmap failed\n", __func__, audio); list_del(®ion->list); @@ -1034,16 +1062,18 @@ static int audio_aio_async_write(struct q6audio_aio *audio, struct audio_client *ac; struct audio_aio_write_param param; + memset(¶m, 0, sizeof(param)); + if (!audio || !buf_node) { - pr_err("%s NULL pointer audio=[0x%p], buf_node=[0x%p]\n", + pr_err("%s NULL pointer audio=[0x%pK], buf_node=[0x%pK]\n", __func__, audio, buf_node); return -EINVAL; } - pr_debug("%s[%p]: Send write buff %p phy %pa len %d meta_enable = %d\n", + pr_debug("%s[%pK]: Send write buff %pK phy %pK len %d meta_enable = %d\n", __func__, audio, buf_node, &buf_node->paddr, buf_node->buf.data_len, audio->buf_cfg.meta_info_enable); - pr_debug("%s[%p]: flags = 0x%x\n", __func__, audio, + pr_debug("%s[%pK]: flags = 0x%x\n", __func__, audio, buf_node->meta_info.meta_in.nflags); ac = audio->ac; @@ -1072,7 +1102,7 @@ static int audio_aio_async_write(struct q6audio_aio *audio, buf_node->token = ac->session; rc = q6asm_async_write(ac, ¶m); if (rc < 0) - pr_err("%s[%p]:failed\n", __func__, audio); + pr_err("%s[%pK]:failed\n", __func__, audio); return rc; } @@ -1091,8 +1121,6 @@ void audio_aio_post_event(struct q6audio_aio *audio, int type, } else { e_node = kmalloc(sizeof(struct audio_aio_event), GFP_ATOMIC); if (!e_node) { - pr_err("%s[%p]:No mem to post event %d\n", - __func__, audio, type); spin_unlock_irqrestore(&audio->event_queue_lock, flags); return; } @@ -1113,7 +1141,7 @@ static int audio_aio_async_read(struct q6audio_aio *audio, struct audio_aio_read_param param; int rc; - pr_debug("%s[%p]: Send read buff %p phy %pa len %d\n", + pr_debug("%s[%pK]: Send read buff %pK phy %pK len %d\n", __func__, audio, buf_node, &buf_node->paddr, buf_node->buf.buf_len); ac = audio->ac; @@ -1127,7 +1155,7 @@ static int audio_aio_async_read(struct q6audio_aio *audio, buf_node->token = param.paddr; rc = q6asm_async_read(ac, ¶m); if (rc < 0) - pr_err("%s[%p]:failed\n", __func__, audio); + pr_err("%s[%pK]:failed\n", __func__, audio); return rc; } @@ -1136,7 +1164,7 @@ static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir, { unsigned long flags; int ret = 0; - pr_debug("%s[%p]:node %p dir %x buf_addr %p buf_len %d data_len %d\n", + pr_debug("%s[%pK]:node %pK dir %x buf_addr %pK buf_len %d data_len %d\n", __func__, audio, buf_node, dir, buf_node->buf.buf_addr, buf_node->buf.buf_len, buf_node->buf.data_len); buf_node->paddr = audio_aio_ion_fixup(audio, buf_node->buf.buf_addr, @@ -1161,7 +1189,7 @@ static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir, } else if (buf_node->meta_info.meta_in.nflags & AUDIO_DEC_EOS_SET) { if (!audio->wflush) { - pr_debug("%s[%p]:Send EOS cmd at i/p\n", + pr_debug("%s[%pK]:Send EOS cmd at i/p\n", __func__, audio); /* Driver will forcefully post writedone event * once eos ack recived from DSP @@ -1207,7 +1235,7 @@ static int audio_aio_buf_add_shared(struct q6audio_aio *audio, u32 dir, event_payload.aio_buf = buf_node->buf; event_payload.aio_buf.data_len = insert_eos_buf(audio, buf_node); - pr_debug("%s[%p]: propagate READ_DONE as EOS done\n",\ + pr_debug("%s[%pK]: propagate READ_DONE as EOS done\n", __func__, audio); audio_aio_post_event(audio, AUDIO_EVENT_READ_DONE, event_payload); @@ -1276,7 +1304,8 @@ void audio_aio_ioport_reset(struct q6audio_aio *audio) * abort due to flush */ if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%p]:fsync in progress\n", __func__, audio); + pr_debug("%s[%pK]:fsync in progress\n", + __func__, audio); audio->drv_ops.out_flush(audio); } else audio->drv_ops.out_flush(audio); @@ -1303,13 +1332,13 @@ int audio_aio_open(struct q6audio_aio *audio, struct file *file) /* Only AIO interface */ if (file->f_flags & O_NONBLOCK) { - pr_debug("%s[%p]:set to aio interface\n", __func__, audio); + pr_debug("%s[%pK]:set to aio interface\n", __func__, audio); audio->drv_status |= ADRV_STATUS_AIO_INTF; audio->drv_ops.out_flush = audio_aio_async_out_flush; audio->drv_ops.in_flush = audio_aio_async_in_flush; q6asm_set_io_mode(audio->ac, ASYNC_IO_MODE); } else { - pr_err("%s[%p]:SIO interface not supported\n", + pr_err("%s[%pK]:SIO interface not supported\n", __func__, audio); rc = -EACCES; goto fail; @@ -1341,7 +1370,7 @@ int audio_aio_open(struct q6audio_aio *audio, struct file *file) if (e_node) list_add_tail(&e_node->list, &audio->free_event_queue); else { - pr_err("%s[%p]:event pkt alloc failed\n", + pr_err("%s[%pK]:event pkt alloc failed\n", __func__, audio); rc = -ENOMEM; goto cleanup; @@ -1353,7 +1382,7 @@ int audio_aio_open(struct q6audio_aio *audio, struct file *file) rc = -ENOMEM; goto cleanup; } - pr_debug("Ion client create in audio_aio_open %p", audio->client); + pr_debug("Ion client create in audio_aio_open %pK", audio->client); rc = register_volume_listener(audio); if (rc < 0) @@ -1387,11 +1416,11 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_OUTPORT_FLUSH: { - pr_debug("%s[%p]:AUDIO_OUTPORT_FLUSH\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_OUTPORT_FLUSH\n", __func__, audio); mutex_lock(&audio->read_lock); rc = audio_aio_outport_flush(audio); if (rc < 0) { - pr_err("%s[%p]: AUDIO_OUTPORT_FLUSH failed\n", + pr_err("%s[%pK]: AUDIO_OUTPORT_FLUSH failed\n", __func__, audio); rc = -EINTR; } @@ -1399,13 +1428,13 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_STOP: { - pr_debug("%s[%p]: AUDIO_STOP session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_STOP session_id[%d]\n", __func__, audio, audio->ac->session); mutex_lock(&audio->lock); audio->stopped = 1; rc = audio_aio_flush(audio); if (rc < 0) { - pr_err("%s[%p]:Audio Stop procedure failed rc=%d\n", + pr_err("%s[%pK]:Audio Stop procedure failed rc=%d\n", __func__, audio, rc); mutex_unlock(&audio->lock); break; @@ -1413,7 +1442,7 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, audio->enabled = 0; audio->drv_status &= ~ADRV_STATUS_PAUSE; if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%p] Waking up the audio_aio_fsync\n", + pr_debug("%s[%pK] Waking up the audio_aio_fsync\n", __func__, audio); wake_up(&audio->write_wait); } @@ -1421,12 +1450,12 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_PAUSE: { - pr_debug("%s[%p]:AUDIO_PAUSE %ld\n", __func__, audio, arg); + pr_debug("%s[%pK]:AUDIO_PAUSE %ld\n", __func__, audio, arg); mutex_lock(&audio->lock); if (arg == 1) { rc = audio_aio_pause(audio); if (rc < 0) { - pr_err("%s[%p]: pause FAILED rc=%d\n", + pr_err("%s[%pK]: pause FAILED rc=%d\n", __func__, audio, rc); mutex_unlock(&audio->lock); break; @@ -1436,7 +1465,7 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, if (audio->drv_status & ADRV_STATUS_PAUSE) { rc = audio_aio_enable(audio); if (rc) - pr_err("%s[%p]: audio enable failed\n", + pr_err("%s[%pK]: audio enable failed\n", __func__, audio); else { audio->drv_status &= ~ADRV_STATUS_PAUSE; @@ -1448,13 +1477,13 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_FLUSH: { - pr_debug("%s[%p]: AUDIO_FLUSH sessionid[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_FLUSH sessionid[%d]\n", __func__, audio, audio->ac->session); mutex_lock(&audio->lock); audio->rflush = 1; audio->wflush = 1; if (audio->drv_status & ADRV_STATUS_FSYNC) { - pr_debug("%s[%p] Waking up the audio_aio_fsync\n", + pr_debug("%s[%pK] Waking up the audio_aio_fsync\n", __func__, audio); wake_up(&audio->write_wait); } @@ -1463,7 +1492,7 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, /* Flush input / Output buffer in software*/ audio_aio_ioport_reset(audio); if (rc < 0) { - pr_err("%s[%p]:AUDIO_FLUSH interrupted\n", + pr_err("%s[%pK]:AUDIO_FLUSH interrupted\n", __func__, audio); rc = -EINTR; } else { @@ -1493,12 +1522,12 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, case AUDIO_PM_AWAKE: { if ((audio->audio_ws_mgr == NULL) || (audio->miscdevice == NULL)) { - pr_err("%s[%p]: invalid ws_mgr or miscdevice", + pr_err("%s[%pK]: invalid ws_mgr or miscdevice", __func__, audio); rc = -EACCES; break; } - pr_debug("%s[%p]:AUDIO_PM_AWAKE\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_PM_AWAKE\n", __func__, audio); mutex_lock(&audio->lock); if (!audio->wakelock_voted) { audio->wakelock_voted = true; @@ -1513,12 +1542,12 @@ static long audio_aio_shared_ioctl(struct file *file, unsigned int cmd, case AUDIO_PM_RELAX: { if ((audio->audio_ws_mgr == NULL) || (audio->miscdevice == NULL)) { - pr_err("%s[%p]: invalid ws_mgr or miscdevice", + pr_err("%s[%pK]: invalid ws_mgr or miscdevice", __func__, audio); rc = -EACCES; break; } - pr_debug("%s[%p]:AUDIO_PM_RELAX\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_PM_RELAX\n", __func__, audio); mutex_lock(&audio->lock); if (audio->wakelock_voted) { audio->wakelock_voted = false; @@ -1577,7 +1606,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_GET_EVENT: { - pr_debug("%s[%p]:AUDIO_GET_EVENT\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_GET_EVENT\n", __func__, audio); if (mutex_trylock(&audio->get_event_lock)) { rc = audio_aio_process_event_req(audio, (void __user *)arg); @@ -1617,7 +1646,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, memset(&cfg, 0, sizeof(cfg)); cfg.buffer_size = audio->str_cfg.buffer_size; cfg.buffer_count = audio->str_cfg.buffer_count; - pr_debug("%s[%p]:GET STREAM CFG %d %d\n", + pr_debug("%s[%pK]:GET STREAM CFG %d %d\n", __func__, audio, cfg.buffer_size, cfg.buffer_count); if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) { pr_err( @@ -1630,7 +1659,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, } case AUDIO_SET_STREAM_CONFIG: { struct msm_audio_stream_config cfg; - pr_debug("%s[%p]:SET STREAM CONFIG\n", __func__, audio); + pr_debug("%s[%pK]:SET STREAM CONFIG\n", __func__, audio); mutex_lock(&audio->lock); if (copy_from_user(&cfg, (void *)arg, sizeof(cfg))) { pr_err( @@ -1660,7 +1689,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, } case AUDIO_SET_CONFIG: { struct msm_audio_config config; - pr_err("%s[%p]:AUDIO_SET_CONFIG\n", __func__, audio); + pr_err("%s[%pK]:AUDIO_SET_CONFIG\n", __func__, audio); mutex_lock(&audio->lock); if (copy_from_user(&config, (void *)arg, sizeof(config))) { pr_err( @@ -1671,7 +1700,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, break; } if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s[%p]:Not sufficient permission to change the playback mode\n", + pr_err("%s[%pK]:Not sufficient permission to change the playback mode\n", __func__, audio); rc = -EACCES; mutex_unlock(&audio->lock); @@ -1711,14 +1740,14 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, } audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - pr_debug("%s[%p]:session id %d: Set-buf-cfg: meta[%d]", + pr_debug("%s[%pK]:session id %d: Set-buf-cfg: meta[%d]", __func__, audio, audio->ac->session, cfg.meta_info_enable); mutex_unlock(&audio->lock); break; } case AUDIO_GET_BUF_CFG: { - pr_debug("%s[%p]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", + pr_debug("%s[%pK]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", __func__, audio, audio->ac->session, audio->buf_cfg.meta_info_enable, audio->buf_cfg.frames_per_buf); @@ -1736,7 +1765,7 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, } case AUDIO_REGISTER_ION: { struct msm_audio_ion_info info; - pr_debug("%s[%p]:AUDIO_REGISTER_ION\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_REGISTER_ION\n", __func__, audio); mutex_lock(&audio->lock); if (copy_from_user(&info, (void *)arg, sizeof(info))) { pr_err( @@ -1744,7 +1773,11 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, __func__); rc = -EFAULT; } else { + mutex_lock(&audio->read_lock); + mutex_lock(&audio->write_lock); rc = audio_aio_ion_add(audio, &info); + mutex_unlock(&audio->write_lock); + mutex_unlock(&audio->read_lock); } mutex_unlock(&audio->lock); break; @@ -1752,14 +1785,18 @@ static long audio_aio_ioctl(struct file *file, unsigned int cmd, case AUDIO_DEREGISTER_ION: { struct msm_audio_ion_info info; mutex_lock(&audio->lock); - pr_debug("%s[%p]:AUDIO_DEREGISTER_ION\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_DEREGISTER_ION\n", __func__, audio); if (copy_from_user(&info, (void *)arg, sizeof(info))) { pr_err( "%s: copy_from_user for AUDIO_DEREGISTER_ION failed\n", __func__); rc = -EFAULT; } else { + mutex_lock(&audio->read_lock); + mutex_lock(&audio->write_lock); rc = audio_aio_ion_remove(audio, &info); + mutex_unlock(&audio->write_lock); + mutex_unlock(&audio->read_lock); } mutex_unlock(&audio->lock); break; @@ -1868,7 +1905,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, break; } case AUDIO_GET_EVENT_32: { - pr_debug("%s[%p]:AUDIO_GET_EVENT\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_GET_EVENT\n", __func__, audio); if (mutex_trylock(&audio->get_event_lock)) { rc = audio_aio_process_event_req_compat(audio, (void __user *)arg); @@ -1908,7 +1945,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, memset(&cfg, 0, sizeof(cfg)); cfg.buffer_size = audio->str_cfg.buffer_size; cfg.buffer_count = audio->str_cfg.buffer_count; - pr_debug("%s[%p]:GET STREAM CFG %d %d\n", + pr_debug("%s[%pK]:GET STREAM CFG %d %d\n", __func__, audio, cfg.buffer_size, cfg.buffer_count); if (copy_to_user((void *)arg, &cfg, sizeof(cfg))) { pr_err("%s: copy_to_user for AUDIO_GET_STREAM_CONFIG_32 failed\n", @@ -1921,7 +1958,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, case AUDIO_SET_STREAM_CONFIG_32: { struct msm_audio_stream_config32 cfg_32; struct msm_audio_stream_config cfg; - pr_debug("%s[%p]:SET STREAM CONFIG\n", __func__, audio); + pr_debug("%s[%pK]:SET STREAM CONFIG\n", __func__, audio); mutex_lock(&audio->lock); if (copy_from_user(&cfg_32, (void *)arg, sizeof(cfg_32))) { pr_err("%s: copy_from_user for AUDIO_SET_STREAM_CONFIG_32 failed\n", @@ -1965,13 +2002,13 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, mutex_lock(&audio->lock); if (audio->feedback != NON_TUNNEL_MODE) { - pr_err("%s[%p]:Not sufficient permission to change the playback mode\n", + pr_err("%s[%pK]:Not sufficient permission to change the playback mode\n", __func__, audio); rc = -EACCES; mutex_unlock(&audio->lock); break; } - pr_err("%s[%p]:AUDIO_SET_CONFIG\n", __func__, audio); + pr_err("%s[%pK]:AUDIO_SET_CONFIG\n", __func__, audio); if (copy_from_user(&config_32, (void *)arg, sizeof(config_32))) { pr_err("%s: copy_from_user for AUDIO_SET_CONFIG_32 failed\n", @@ -2025,7 +2062,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, } audio->buf_cfg.meta_info_enable = cfg.meta_info_enable; - pr_debug("%s[%p]:session id %d: Set-buf-cfg: meta[%d]", + pr_debug("%s[%pK]:session id %d: Set-buf-cfg: meta[%d]", __func__, audio, audio->ac->session, cfg.meta_info_enable); mutex_unlock(&audio->lock); @@ -2033,12 +2070,13 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, } case AUDIO_GET_BUF_CFG_32: { struct msm_audio_buf_cfg32 cfg_32; - pr_debug("%s[%p]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", + pr_debug("%s[%pK]:session id %d: Get-buf-cfg: meta[%d] framesperbuf[%d]\n", __func__, audio, audio->ac->session, audio->buf_cfg.meta_info_enable, audio->buf_cfg.frames_per_buf); mutex_lock(&audio->lock); + memset(&cfg_32, 0, sizeof(cfg_32)); cfg_32.meta_info_enable = audio->buf_cfg.meta_info_enable; cfg_32.frames_per_buf = audio->buf_cfg.frames_per_buf; if (copy_to_user((void *)arg, &cfg_32, @@ -2053,7 +2091,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, case AUDIO_REGISTER_ION_32: { struct msm_audio_ion_info32 info_32; struct msm_audio_ion_info info; - pr_debug("%s[%p]:AUDIO_REGISTER_ION\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_REGISTER_ION\n", __func__, audio); mutex_lock(&audio->lock); if (copy_from_user(&info_32, (void *)arg, sizeof(info_32))) { pr_err("%s: copy_from_user for AUDIO_REGISTER_ION_32 failed\n", @@ -2062,7 +2100,11 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, } else { info.fd = info_32.fd; info.vaddr = compat_ptr(info_32.vaddr); + mutex_lock(&audio->read_lock); + mutex_lock(&audio->write_lock); rc = audio_aio_ion_add(audio, &info); + mutex_unlock(&audio->write_lock); + mutex_unlock(&audio->read_lock); } mutex_unlock(&audio->lock); break; @@ -2071,7 +2113,7 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_ion_info32 info_32; struct msm_audio_ion_info info; mutex_lock(&audio->lock); - pr_debug("%s[%p]:AUDIO_DEREGISTER_ION\n", __func__, audio); + pr_debug("%s[%pK]:AUDIO_DEREGISTER_ION\n", __func__, audio); if (copy_from_user(&info_32, (void *)arg, sizeof(info_32))) { pr_err("%s: copy_from_user for AUDIO_DEREGISTER_ION_32 failed\n", __func__); @@ -2079,7 +2121,11 @@ static long audio_aio_compat_ioctl(struct file *file, unsigned int cmd, } else { info.fd = info_32.fd; info.vaddr = compat_ptr(info_32.vaddr); + mutex_lock(&audio->read_lock); + mutex_lock(&audio->write_lock); rc = audio_aio_ion_remove(audio, &info); + mutex_unlock(&audio->write_lock); + mutex_unlock(&audio->read_lock); } mutex_unlock(&audio->lock); break; diff --git a/drivers/misc/qcom/qdsp6v2/audio_wma.c b/drivers/misc/qcom/qdsp6v2/audio_wma.c index 8c86973c7ebae..25e524f6a8c49 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_wma.c +++ b/drivers/misc/qcom/qdsp6v2/audio_wma.c @@ -40,7 +40,7 @@ static long audio_ioctl_shared(struct file *file, unsigned int cmd, case AUDIO_START: { struct asm_wma_cfg wma_cfg; struct msm_audio_wma_config_v2 *wma_config; - pr_debug("%s[%p]: AUDIO_START session_id[%d]\n", __func__, + pr_debug("%s[%pK]: AUDIO_START session_id[%d]\n", __func__, audio, audio->ac->session); if (audio->feedback == NON_TUNNEL_MODE) { /* Configure PCM output block */ @@ -122,7 +122,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); @@ -166,6 +166,8 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_wma_config_v2 *wma_config; struct msm_audio_wma_config_v2_32 wma_config_32; + memset(&wma_config_32, 0, sizeof(wma_config_32)); + wma_config = (struct msm_audio_wma_config_v2 *)audio->codec_cfg; wma_config_32.format_tag = wma_config->format_tag; wma_config_32.numchannels = wma_config->numchannels; @@ -209,7 +211,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_compat_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); diff --git a/drivers/misc/qcom/qdsp6v2/audio_wmapro.c b/drivers/misc/qcom/qdsp6v2/audio_wmapro.c index f2c3289c4ce28..d389d9b740425 100644 --- a/drivers/misc/qcom/qdsp6v2/audio_wmapro.c +++ b/drivers/misc/qcom/qdsp6v2/audio_wmapro.c @@ -173,7 +173,7 @@ static long audio_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); @@ -217,6 +217,8 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, struct msm_audio_wmapro_config *wmapro_config; struct msm_audio_wmapro_config32 wmapro_config_32; + memset(&wmapro_config_32, 0, sizeof(wmapro_config_32)); + wmapro_config = (struct msm_audio_wmapro_config *)audio->codec_cfg; wmapro_config_32.armdatareqthr = wmapro_config->armdatareqthr; @@ -281,7 +283,7 @@ static long audio_compat_ioctl(struct file *file, unsigned int cmd, break; } default: { - pr_debug("%s[%p]: Calling utils ioctl\n", __func__, audio); + pr_debug("%s[%pK]: Calling utils ioctl\n", __func__, audio); rc = audio->codec_compat_ioctl(file, cmd, arg); if (rc) pr_err("Failed in utils_ioctl: %d\n", rc); diff --git a/drivers/misc/qcom/qdsp6v2/evrc_in.c b/drivers/misc/qcom/qdsp6v2/evrc_in.c index 2f931be226c6d..aab8e27c00941 100644 --- a/drivers/misc/qcom/qdsp6v2/evrc_in.c +++ b/drivers/misc/qcom/qdsp6v2/evrc_in.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2016, 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 @@ -224,6 +224,8 @@ static long evrc_in_compat_ioctl(struct file *file, struct msm_audio_evrc_enc_config32 cfg_32; struct msm_audio_evrc_enc_config *enc_cfg; + memset(&cfg_32, 0, sizeof(cfg_32)); + enc_cfg = audio->enc_cfg; cfg_32.cdma_rate = enc_cfg->cdma_rate; cfg_32.min_bit_rate = enc_cfg->min_bit_rate; diff --git a/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c b/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c index 6e82c8051886e..d861e05a3ac6d 100644 --- a/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c +++ b/drivers/misc/qcom/qdsp6v2/q6audio_v2_aio.c @@ -54,18 +54,18 @@ void audio_aio_cb(uint32_t opcode, uint32_t token, switch (opcode) { case ASM_DATA_EVENT_WRITE_DONE_V2: - pr_debug("%s[%p]:ASM_DATA_EVENT_WRITE_DONE token = 0x%x\n", + pr_debug("%s[%pK]:ASM_DATA_EVENT_WRITE_DONE token = 0x%x\n", __func__, audio, token); audio_aio_async_write_ack(audio, token, payload); break; case ASM_DATA_EVENT_READ_DONE_V2: - pr_debug("%s[%p]:ASM_DATA_EVENT_READ_DONE token = 0x%x\n", + pr_debug("%s[%pK]:ASM_DATA_EVENT_READ_DONE token = 0x%x\n", __func__, audio, token); audio_aio_async_read_ack(audio, token, payload); break; case ASM_DATA_EVENT_RENDERED_EOS: /* EOS Handle */ - pr_debug("%s[%p]:ASM_DATA_CMDRSP_EOS\n", __func__, audio); + pr_debug("%s[%pK]:ASM_DATA_CMDRSP_EOS\n", __func__, audio); if (audio->feedback) { /* Non-Tunnel mode */ audio->eos_rsp = 1; /* propagate input EOS i/p buffer, @@ -87,16 +87,16 @@ void audio_aio_cb(uint32_t opcode, uint32_t token, break; case ASM_DATA_CMD_MEDIA_FMT_UPDATE_V2: case ASM_STREAM_CMD_SET_ENCDEC_PARAM: - pr_debug("%s[%p]:payload0[%x] payloa1d[%x]opcode= 0x%x\n", + pr_debug("%s[%pK]:payload0[%x] payloa1d[%x]opcode= 0x%x\n", __func__, audio, payload[0], payload[1], opcode); break; case ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY: case ASM_DATA_EVENT_ENC_SR_CM_CHANGE_NOTIFY: - pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0]-sr = %d, payload[1]-chl = %d, payload[2] = %d, payload[3] = %d\n", + pr_debug("%s[%pK]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, payload[0]-sr = %d, payload[1]-chl = %d, payload[2] = %d, payload[3] = %d\n", __func__, audio, payload[0], payload[1], payload[2], payload[3]); - pr_debug("%s[%p]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,", + pr_debug("%s[%pK]: ASM_DATA_EVENT_SR_CM_CHANGE_NOTIFY, sr(prev) = %d, chl(prev) = %d,", __func__, audio, audio->pcm_cfg.sample_rate, audio->pcm_cfg.channel_count); @@ -130,7 +130,7 @@ void extract_meta_out_info(struct q6audio_aio *audio, else memset(&buf_node->meta_info.meta_in, 0, sizeof(struct dec_meta_in)); - pr_debug("%s[%p]:i/p: msw_ts 0x%d lsw_ts 0x%d nflags 0x%8x\n", + pr_debug("%s[%pK]:i/p: msw_ts 0x%d lsw_ts 0x%d nflags 0x%8x\n", __func__, audio, buf_node->meta_info.meta_in.ntimestamp.highpart, buf_node->meta_info.meta_in.ntimestamp.lowpart, @@ -145,7 +145,7 @@ void extract_meta_out_info(struct q6audio_aio *audio, meta_data->meta_out_dsp[0].lsw_ts; meta_data->meta_out_dsp[0].lsw_ts = temp; - pr_debug("%s[%p]:o/p: msw_ts 0x%d lsw_ts 0x%d nflags 0x%8x, num_frames = %d\n", + pr_debug("%s[%pK]:o/p: msw_ts 0x%d lsw_ts 0x%d nflags 0x%8x, num_frames = %d\n", __func__, audio, ((struct dec_meta_out *)buf_node->kvaddr)->\ meta_out_dsp[0].msw_ts, @@ -201,7 +201,7 @@ void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, = payload[9]; event_payload.aio_buf.data_len = payload[4]\ + payload[5] + sizeof(struct dec_meta_out); - pr_debug("%s[%p]:nr of frames 0x%8x len=%d\n", + pr_debug("%s[%pK]:nr of frames 0x%8x len=%d\n", __func__, audio, filled_buf->meta_info.meta_out.num_of_frames, event_payload.aio_buf.data_len); @@ -213,7 +213,7 @@ void audio_aio_async_read_ack(struct q6audio_aio *audio, uint32_t token, event_payload); kfree(filled_buf); } else { - pr_err("%s[%p]:expected=%x ret=%x\n", + pr_err("%s[%pK]:expected=%x ret=%x\n", __func__, audio, filled_buf->token, token); spin_unlock_irqrestore(&audio->dsp_lock, flags); } diff --git a/drivers/misc/qcom/qdsp6v2/qcelp_in.c b/drivers/misc/qcom/qdsp6v2/qcelp_in.c index b5d5ad113722c..aabf5d33a507f 100644 --- a/drivers/misc/qcom/qdsp6v2/qcelp_in.c +++ b/drivers/misc/qcom/qdsp6v2/qcelp_in.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-2016, 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 @@ -225,6 +225,8 @@ static long qcelp_in_compat_ioctl(struct file *file, struct msm_audio_qcelp_enc_config32 cfg_32; struct msm_audio_qcelp_enc_config *enc_cfg; + memset(&cfg_32, 0, sizeof(cfg_32)); + enc_cfg = (struct msm_audio_qcelp_enc_config *)audio->enc_cfg; cfg_32.cdma_rate = enc_cfg->cdma_rate; cfg_32.min_bit_rate = enc_cfg->min_bit_rate; diff --git a/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c b/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c index 30274fd4b725b..334e705ca8f1f 100644 --- a/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c +++ b/drivers/misc/qcom/qdsp6v2/ultrasound/q6usm.c @@ -208,7 +208,7 @@ static int q6usm_us_client_buf_free(unsigned int dir, rc = q6usm_memory_unmap(port->phys, dir, usc->session, *((uint32_t *)port->ext)); - pr_debug("%s: data[%p]phys[%llx][%p]\n", __func__, + pr_debug("%s: data[%pK]phys[%llx][%pK]\n", __func__, (void *)port->data, (u64)port->phys, (void *)&port->phys); msm_audio_ion_free(port->client, port->handle); @@ -248,7 +248,7 @@ int q6usm_us_param_buf_free(unsigned int dir, rc = q6usm_memory_unmap(port->param_phys, dir, usc->session, *((uint32_t *)port->param_buf_mem_handle)); - pr_debug("%s: data[%p]phys[%llx][%p]\n", __func__, + pr_debug("%s: data[%pK]phys[%llx][%pK]\n", __func__, (void *)port->param_buf, (u64)port->param_phys, (void *)&port->param_phys); @@ -362,7 +362,7 @@ struct us_client *q6usm_us_client_alloc( spin_lock_init(&usc->port[lcnt].dsp_lock); usc->port[lcnt].ext = (void *)p_mem_handle++; usc->port[lcnt].param_buf_mem_handle = (void *)p_mem_handle++; - pr_err("%s: usc->port[%d].ext=%p;\n", + pr_err("%s: usc->port[%d].ext=%pK;\n", __func__, lcnt, usc->port[lcnt].ext); } atomic_set(&usc->cmd_state, 0); @@ -417,7 +417,7 @@ int q6usm_us_client_buf_alloc(unsigned int dir, port->buf_cnt = bufcnt; port->buf_size = bufsz; - pr_debug("%s: data[%p]; phys[%llx]; [%p]\n", __func__, + pr_debug("%s: data[%pK]; phys[%llx]; [%pK]\n", __func__, (void *)port->data, (u64)port->phys, (void *)&port->phys); @@ -482,7 +482,7 @@ int q6usm_us_param_buf_alloc(unsigned int dir, } port->param_buf_size = bufsz; - pr_debug("%s: param_buf[%p]; param_phys[%llx]; [%p]\n", __func__, + pr_debug("%s: param_buf[%pK]; param_phys[%llx]; [%pK]\n", __func__, (void *)port->param_buf, (u64)port->param_phys, (void *)&port->param_phys); @@ -1335,7 +1335,7 @@ int q6usm_set_us_detection(struct us_client *usc, if ((usc == NULL) || (detect_info_size == 0) || (detect_info == NULL)) { - pr_err("%s: wrong input: usc=0x%p, inf_size=%d; info=0x%p", + pr_err("%s: wrong input: usc=0x%pK, inf_size=%d; info=0x%pK", __func__, usc, detect_info_size, diff --git a/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c b/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c index 7572374cc524d..52f7d3d2f2685 100644 --- a/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c +++ b/drivers/misc/qcom/qdsp6v2/ultrasound/usf.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include "q6usm.h" @@ -135,6 +136,8 @@ struct usf_type { uint16_t conflicting_event_filters; /* The requested buttons bitmap */ uint16_t req_buttons_bitmap; + /* Mutex for exclusive operations (all public APIs) */ + struct mutex mutex; }; struct usf_input_dev_type { @@ -176,7 +179,7 @@ static const int s_button_map[] = { }; /* The opened devices container */ -static int s_opened_devs[MAX_DEVS_NUMBER]; +static atomic_t s_opened_devs[MAX_DEVS_NUMBER]; static struct wakeup_source usf_wakeup_source; @@ -1403,9 +1406,22 @@ static int __usf_set_stream_param(struct usf_xx_type *usf_xx, int dir) { struct us_client *usc = usf_xx->usc; - struct us_port_data *port = &usc->port[dir]; + struct us_port_data *port; int rc = 0; + if (usc == NULL) { + pr_err("%s: usc is null\n", + __func__); + return -EFAULT; + } + + port = &usc->port[dir]; + if (port == NULL) { + pr_err("%s: port is null\n", + __func__); + return -EFAULT; + } + if (port->param_buf == NULL) { pr_err("%s: parameter buffer is null\n", __func__); @@ -1538,10 +1554,12 @@ static int usf_get_stream_param(struct usf_xx_type *usf_xx, return __usf_get_stream_param(usf_xx, &get_stream_param, dir); } /* usf_get_stream_param */ -static long usf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +static long __usf_ioctl(struct usf_type *usf, + unsigned int cmd, + unsigned long arg) { + int rc = 0; - struct usf_type *usf = file->private_data; struct usf_xx_type *usf_xx = NULL; switch (cmd) { @@ -1703,6 +1721,18 @@ static long usf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) (cmd == US_SET_RX_INFO))) release_xx(usf_xx); + return rc; +} /* __usf_ioctl */ + +static long usf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + struct usf_type *usf = file->private_data; + int rc = 0; + + mutex_lock(&usf->mutex); + rc = __usf_ioctl(usf, cmd, arg); + mutex_unlock(&usf->mutex); + return rc; } /* usf_ioctl */ @@ -2147,12 +2177,11 @@ static int usf_get_stream_param32(struct usf_xx_type *usf_xx, return __usf_get_stream_param(usf_xx, &get_stream_param, dir); } /* usf_get_stream_param32 */ -static long usf_compat_ioctl(struct file *file, +static long __usf_compat_ioctl(struct usf_type *usf, unsigned int cmd, unsigned long arg) { int rc = 0; - struct usf_type *usf = file->private_data; struct usf_xx_type *usf_xx = NULL; switch (cmd) { @@ -2160,7 +2189,7 @@ static long usf_compat_ioctl(struct file *file, case US_START_RX: case US_STOP_TX: case US_STOP_RX: { - return usf_ioctl(file, cmd, arg); + return __usf_ioctl(usf, cmd, arg); } case US_SET_TX_INFO32: { @@ -2268,6 +2297,20 @@ static long usf_compat_ioctl(struct file *file, (cmd == US_SET_RX_INFO))) release_xx(usf_xx); + return rc; +} /* __usf_compat_ioctl */ + +static long usf_compat_ioctl(struct file *file, + unsigned int cmd, + unsigned long arg) +{ + struct usf_type *usf = file->private_data; + int rc = 0; + + mutex_lock(&usf->mutex); + rc = __usf_compat_ioctl(usf, cmd, arg); + mutex_unlock(&usf->mutex); + return rc; } /* usf_compat_ioctl */ #endif /* CONFIG_COMPAT */ @@ -2277,13 +2320,17 @@ static int usf_mmap(struct file *file, struct vm_area_struct *vms) struct usf_type *usf = file->private_data; int dir = OUT; struct usf_xx_type *usf_xx = &usf->usf_tx; + int rc = 0; + mutex_lock(&usf->mutex); if (vms->vm_flags & USF_VM_WRITE) { /* RX buf mapping */ dir = IN; usf_xx = &usf->usf_rx; } + rc = q6usm_get_virtual_address(dir, usf_xx->usc, vms); + mutex_unlock(&usf->mutex); - return q6usm_get_virtual_address(dir, usf_xx->usc, vms); + return rc; } static uint16_t add_opened_dev(int minor) @@ -2291,14 +2338,11 @@ static uint16_t add_opened_dev(int minor) uint16_t ind = 0; for (ind = 0; ind < MAX_DEVS_NUMBER; ++ind) { - if (minor == s_opened_devs[ind]) { + if (minor == atomic_cmpxchg(&s_opened_devs[ind], 0, minor)) { pr_err("%s: device %d is already opened\n", __func__, minor); return USF_UNDEF_DEV_ID; - } - - if (s_opened_devs[ind] == 0) { - s_opened_devs[ind] = minor; + } else { pr_debug("%s: device %d is added; ind=%d\n", __func__, minor, ind); return ind; @@ -2336,6 +2380,8 @@ static int usf_open(struct inode *inode, struct file *file) usf->usf_tx.us_detect_type = USF_US_DETECT_UNDEF; usf->usf_rx.us_detect_type = USF_US_DETECT_UNDEF; + mutex_init(&usf->mutex); + pr_debug("%s:usf in open\n", __func__); return 0; } @@ -2346,14 +2392,17 @@ static int usf_release(struct inode *inode, struct file *file) pr_debug("%s: release entry\n", __func__); + mutex_lock(&usf->mutex); usf_release_input(usf); usf_disable(&usf->usf_tx); usf_disable(&usf->usf_rx); - s_opened_devs[usf->dev_ind] = 0; + atomic_set(&s_opened_devs[usf->dev_ind], 0); wakeup_source_trash(&usf_wakeup_source); + mutex_unlock(&usf->mutex); + mutex_destroy(&usf->mutex); kfree(usf); pr_debug("%s: release exit\n", __func__); return 0; diff --git a/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c b/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c index 76bcc83e1c5ec..a4d63f0c0d1ac 100644 --- a/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c +++ b/drivers/misc/qcom/qdsp6v2/ultrasound/usfcdev.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2013, 2016 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 @@ -170,7 +170,7 @@ static int usfcdev_connect(struct input_handler *handler, struct input_dev *dev, } usfc_handle->dev = dev; ret = input_register_handle(usfc_handle); - pr_debug("%s: name=[%s]; ind=%d; dev=0x%p\n", + pr_debug("%s: name=[%s]; ind=%d; dev=0x%pK\n", __func__, dev->name, ind, @@ -259,7 +259,7 @@ bool usfcdev_register( bool rc = false; if ((event_type_ind >= MAX_EVENT_TYPE_NUM) || !match_cb) { - pr_err("%s: wrong input: event_type_ind=%d; match_cb=0x%p\n", + pr_err("%s: wrong input: event_type_ind=%d; match_cb=0x%pK\n", __func__, event_type_ind, match_cb); diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index d3ad2aa1988a3..4854e179bd4cd 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -1,6 +1,6 @@ /*Qualcomm Secure Execution Environment Communicator (QSEECOM) driver * - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-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 @@ -80,6 +80,9 @@ /* Encrypt/Decrypt Data Integrity Partition (DIP) for MDTP */ #define SCM_MDTP_CIPHER_DIP 0x01 +/* Maximum Allowed Size (128K) of Data Integrity Partition (DIP) for MDTP */ +#define MAX_DIP 0x20000 + #define RPMB_SERVICE 0x2000 #define SSD_SERVICE 0x3000 @@ -95,6 +98,7 @@ #define QSEECOM_STATE_NOT_READY 0 #define QSEECOM_STATE_SUSPEND 1 #define QSEECOM_STATE_READY 2 +#define QSEECOM_ICE_FDE_KEY_SIZE_MASK 2 /* * default ce info unit to 0 for @@ -110,6 +114,12 @@ enum qseecom_clk_definitions { CLK_SFPB, }; +enum qseecom_ice_key_size_type{ + QSEECOM_ICE_FDE_KEY_SIZE_16_BYTE = (0 << QSEECOM_ICE_FDE_KEY_SIZE_MASK), + QSEECOM_ICE_FDE_KEY_SIZE_32_BYTE = (1 << QSEECOM_ICE_FDE_KEY_SIZE_MASK), + QSEE_ICE_FDE_KEY_SIZE_UNDEFINED = (0xF << QSEECOM_ICE_FDE_KEY_SIZE_MASK), +}; + enum qseecom_client_handle_type { QSEECOM_CLIENT_APP = 1, QSEECOM_LISTENER_SERVICE, @@ -131,6 +141,35 @@ static DEFINE_MUTEX(qsee_bw_mutex); static DEFINE_MUTEX(app_access_lock); static DEFINE_MUTEX(clk_access_lock); +struct sglist_info { + uint32_t indexAndFlags; + uint32_t sizeOrCount; +}; + +/* + * The 31th bit indicates only one or multiple physical address inside + * the request buffer. If it is set, the index locates a single physical addr + * inside the request buffer, and `sizeOrCount` is the size of the memory being + * shared at that physical address. + * Otherwise, the index locates an array of {start, len} pairs (a + * "scatter/gather list"), and `sizeOrCount` gives the number of entries in + * that array. + * + * The 30th bit indicates 64 or 32bit address; when it is set, physical addr + * and scatter gather entry sizes are 64-bit values. Otherwise, 32-bit values. + * + * The bits [0:29] of `indexAndFlags` hold an offset into the request buffer. + */ +#define SGLISTINFO_SET_INDEX_FLAG(c, s, i) \ + ((uint32_t)(((c & 1) << 31) | ((s & 1) << 30) | (i & 0x3fffffff))) + +#define SGLISTINFO_TABLE_SIZE (sizeof(struct sglist_info) * MAX_ION_FD) + +#define FEATURE_ID_WHITELIST 15 /*whitelist feature id*/ + +#define MAKE_WHITELIST_VERSION(major, minor, patch) \ + (((major & 0x3FF) << 22) | ((minor & 0x3FF) << 12) | (patch & 0xFFF)) + struct qseecom_registered_listener_list { struct list_head list; struct qseecom_register_listener_req svc; @@ -145,6 +184,8 @@ struct qseecom_registered_listener_list { bool listener_in_use; /* wq for thread blocked on this listener*/ wait_queue_head_t listener_block_app_wq; + struct sglist_info sglistinfo_ptr[MAX_ION_FD]; + uint32_t sglist_cnt; }; struct qseecom_registered_app_list { @@ -205,6 +246,7 @@ struct qseecom_control { uint32_t qseos_version; uint32_t qsee_version; struct device *pdev; + bool whitelist_support; bool commonlib_loaded; bool commonlib64_loaded; struct ion_handle *cmnlib_ion_handle; @@ -220,6 +262,7 @@ struct qseecom_control { bool support_bus_scaling; bool support_fde; bool support_pfe; + bool fde_key_size; uint32_t cumulative_mode; enum qseecom_bandwidth_request_mode current_mode; struct timer_list bw_scale_down_timer; @@ -280,6 +323,9 @@ struct qseecom_dev_handle { bool perf_enabled; bool fast_load_enabled; enum qseecom_bandwidth_request_mode mode; + struct sglist_info sglistinfo_ptr[MAX_ION_FD]; + uint32_t sglist_cnt; + bool use_legacy_cmd; }; struct qseecom_key_id_usage_desc { @@ -557,6 +603,34 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } + case QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST: { + struct qseecom_client_listener_data_irsp *req; + struct qseecom_client_listener_data_64bit_irsp *req_64; + + smc_id = + TZ_OS_LISTENER_RESPONSE_HANDLER_WITH_WHITELIST_ID; + desc.arginfo = + TZ_OS_LISTENER_RESPONSE_HANDLER_WITH_WHITELIST_PARAM_ID; + if (qseecom.qsee_version < QSEE_VERSION_40) { + req = + (struct qseecom_client_listener_data_irsp *) + req_buf; + desc.args[0] = req->listener_id; + desc.args[1] = req->status; + desc.args[2] = req->sglistinfo_ptr; + desc.args[3] = req->sglistinfo_len; + } else { + req_64 = + (struct qseecom_client_listener_data_64bit_irsp *) + req_buf; + desc.args[0] = req_64->listener_id; + desc.args[1] = req_64->status; + desc.args[2] = req_64->sglistinfo_ptr; + desc.args[3] = req_64->sglistinfo_len; + } + ret = scm_call2(smc_id, &desc); + break; + } case QSEOS_LOAD_EXTERNAL_ELF_COMMAND: { struct qseecom_load_app_ireq *req; struct qseecom_load_app_64bit_ireq *req_64bit; @@ -612,6 +686,38 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } + case QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST: { + struct qseecom_client_send_data_ireq *req; + struct qseecom_client_send_data_64bit_ireq *req_64bit; + + smc_id = TZ_APP_QSAPP_SEND_DATA_WITH_WHITELIST_ID; + desc.arginfo = + TZ_APP_QSAPP_SEND_DATA_WITH_WHITELIST_ID_PARAM_ID; + if (qseecom.qsee_version < QSEE_VERSION_40) { + req = (struct qseecom_client_send_data_ireq *) + req_buf; + desc.args[0] = req->app_id; + desc.args[1] = req->req_ptr; + desc.args[2] = req->req_len; + desc.args[3] = req->rsp_ptr; + desc.args[4] = req->rsp_len; + desc.args[5] = req->sglistinfo_ptr; + desc.args[6] = req->sglistinfo_len; + } else { + req_64bit = + (struct qseecom_client_send_data_64bit_ireq *) + req_buf; + desc.args[0] = req_64bit->app_id; + desc.args[1] = req_64bit->req_ptr; + desc.args[2] = req_64bit->req_len; + desc.args[3] = req_64bit->rsp_ptr; + desc.args[4] = req_64bit->rsp_len; + desc.args[5] = req_64bit->sglistinfo_ptr; + desc.args[6] = req_64bit->sglistinfo_len; + } + ret = scm_call2(smc_id, &desc); + break; + } case QSEOS_RPMB_PROVISION_KEY_COMMAND: { struct qseecom_client_send_service_ireq *req; req = (struct qseecom_client_send_service_ireq *) @@ -754,6 +860,36 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } + case QSEOS_TEE_OPEN_SESSION_WHITELIST: { + struct qseecom_qteec_ireq *req; + struct qseecom_qteec_64bit_ireq *req_64bit; + + smc_id = TZ_APP_GPAPP_OPEN_SESSION_WITH_WHITELIST_ID; + desc.arginfo = + TZ_APP_GPAPP_OPEN_SESSION_WITH_WHITELIST_ID_PARAM_ID; + if (qseecom.qsee_version < QSEE_VERSION_40) { + req = (struct qseecom_qteec_ireq *)req_buf; + desc.args[0] = req->app_id; + desc.args[1] = req->req_ptr; + desc.args[2] = req->req_len; + desc.args[3] = req->resp_ptr; + desc.args[4] = req->resp_len; + desc.args[5] = req->sglistinfo_ptr; + desc.args[6] = req->sglistinfo_len; + } else { + req_64bit = (struct qseecom_qteec_64bit_ireq *) + req_buf; + desc.args[0] = req_64bit->app_id; + desc.args[1] = req_64bit->req_ptr; + desc.args[2] = req_64bit->req_len; + desc.args[3] = req_64bit->resp_ptr; + desc.args[4] = req_64bit->resp_len; + desc.args[5] = req_64bit->sglistinfo_ptr; + desc.args[6] = req_64bit->sglistinfo_len; + } + ret = scm_call2(smc_id, &desc); + break; + } case QSEOS_TEE_INVOKE_COMMAND: { struct qseecom_qteec_ireq *req; struct qseecom_qteec_64bit_ireq *req_64bit; @@ -778,6 +914,36 @@ static int qseecom_scm_call2(uint32_t svc_id, uint32_t tz_cmd_id, ret = scm_call2(smc_id, &desc); break; } + case QSEOS_TEE_INVOKE_COMMAND_WHITELIST: { + struct qseecom_qteec_ireq *req; + struct qseecom_qteec_64bit_ireq *req_64bit; + + smc_id = TZ_APP_GPAPP_INVOKE_COMMAND_WITH_WHITELIST_ID; + desc.arginfo = + TZ_APP_GPAPP_INVOKE_COMMAND_WITH_WHITELIST_ID_PARAM_ID; + if (qseecom.qsee_version < QSEE_VERSION_40) { + req = (struct qseecom_qteec_ireq *)req_buf; + desc.args[0] = req->app_id; + desc.args[1] = req->req_ptr; + desc.args[2] = req->req_len; + desc.args[3] = req->resp_ptr; + desc.args[4] = req->resp_len; + desc.args[5] = req->sglistinfo_ptr; + desc.args[6] = req->sglistinfo_len; + } else { + req_64bit = (struct qseecom_qteec_64bit_ireq *) + req_buf; + desc.args[0] = req_64bit->app_id; + desc.args[1] = req_64bit->req_ptr; + desc.args[2] = req_64bit->req_len; + desc.args[3] = req_64bit->resp_ptr; + desc.args[4] = req_64bit->resp_len; + desc.args[5] = req_64bit->sglistinfo_ptr; + desc.args[6] = req_64bit->sglistinfo_len; + } + ret = scm_call2(smc_id, &desc); + break; + } case QSEOS_TEE_CLOSE_SESSION: { struct qseecom_qteec_ireq *req; struct qseecom_qteec_64bit_ireq *req_64bit; @@ -946,6 +1112,10 @@ static int __qseecom_set_sb_memory(struct qseecom_registered_listener_list *svc, } /* Populate the structure for sending scm call to load image */ svc->sb_virt = (char *) ion_map_kernel(qseecom.ion_clnt, svc->ihandle); + if (IS_ERR_OR_NULL(svc->sb_virt)) { + pr_err("ION memory mapping for listener shared buffer failed\n"); + return -ENOMEM; + } svc->sb_phys = (phys_addr_t)pa; if (qseecom.qsee_version < QSEE_VERSION_40) { @@ -1005,7 +1175,7 @@ static int qseecom_register_listener(struct qseecom_dev_handle *data, return -EBUSY; } - new_entry = kmalloc(sizeof(*new_entry), GFP_KERNEL); + new_entry = kzalloc(sizeof(*new_entry), GFP_KERNEL); if (!new_entry) { pr_err("kmalloc failed\n"); return -ENOMEM; @@ -1134,9 +1304,11 @@ static int __qseecom_set_msm_bus_request(uint32_t mode) pr_err("Bandwidth req failed(%d) MODE (%d)\n", ret, mode); if (qclk->ce_core_src_clk != NULL) { - if (mode == INACTIVE) - __qseecom_enable_clk(CLK_QSEE); - else + if (mode == INACTIVE) { + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + pr_err("CLK enable failed\n"); + } else __qseecom_disable_clk(CLK_QSEE); } } @@ -1403,6 +1575,10 @@ static int qseecom_set_client_mem_param(struct qseecom_dev_handle *data, /* Populate the structure for sending scm call to load image */ data->client.sb_virt = (char *) ion_map_kernel(qseecom.ion_clnt, data->client.ihandle); + if (IS_ERR_OR_NULL(data->client.sb_virt)) { + pr_err("ION memory mapping for client shared buf failed\n"); + return -ENOMEM; + } data->client.sb_phys = (phys_addr_t)pa; data->client.sb_length = req.sb_len; data->client.user_virt_sb_base = (uintptr_t)req.virt_sb_base; @@ -1440,12 +1616,21 @@ static int __qseecom_qseos_fail_return_resp_tz(struct qseecom_dev_handle *data, if (ptr_svc) pr_warn("listener_id:%x, lstnr: %x\n", ptr_svc->svc.listener_id, lstnr); - if (ptr_svc && ptr_svc->ihandle) - msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle, + if (ptr_svc && ptr_svc->ihandle) { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle, ptr_svc->sb_virt, ptr_svc->sb_length, ION_IOC_CLEAN_INV_CACHES); - if (lstnr == RPMB_SERVICE) - __qseecom_enable_clk(CLK_QSEE); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } + } + + if (lstnr == RPMB_SERVICE) { + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; + } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, send_data_rsp, sizeof(send_data_rsp), resp, sizeof(*resp)); if (ret) { @@ -1466,6 +1651,16 @@ static int __qseecom_qseos_fail_return_resp_tz(struct qseecom_dev_handle *data, return ret; } +static void __qseecom_clean_listener_sglistinfo( + struct qseecom_registered_listener_list *ptr_svc) +{ + if (ptr_svc->sglist_cnt) { + memset(ptr_svc->sglistinfo_ptr, 0, + SGLISTINFO_TABLE_SIZE); + ptr_svc->sglist_cnt = 0; + } +} + static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, struct qseecom_command_scm_resp *resp) { @@ -1474,9 +1669,14 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, uint32_t lstnr; unsigned long flags; struct qseecom_client_listener_data_irsp send_data_rsp; + struct qseecom_client_listener_data_64bit_irsp send_data_rsp_64bit; struct qseecom_registered_listener_list *ptr_svc = NULL; sigset_t new_sigset; sigset_t old_sigset; + uint32_t status; + void *cmd_buf = NULL; + size_t cmd_len; + struct sglist_info *table = NULL; while (resp->result == QSEOS_RESULT_INCOMPLETE) { lstnr = resp->data; @@ -1549,27 +1749,62 @@ static int __qseecom_process_incomplete_cmd(struct qseecom_dev_handle *data, pr_err("Abort clnt %d waiting on lstnr svc %d, ret %d", data->client.app_id, lstnr, ret); rc = -ENODEV; - send_data_rsp.status = QSEOS_RESULT_FAILURE; + status = QSEOS_RESULT_FAILURE; } else { - send_data_rsp.status = QSEOS_RESULT_SUCCESS; + status = QSEOS_RESULT_SUCCESS; } qseecom.send_resp_flag = 0; ptr_svc->send_resp_flag = 0; - send_data_rsp.qsee_cmd_id = QSEOS_LISTENER_DATA_RSP_COMMAND; - send_data_rsp.listener_id = lstnr; - if (ptr_svc) - msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle, - ptr_svc->sb_virt, ptr_svc->sb_length, - ION_IOC_CLEAN_INV_CACHES); + table = ptr_svc->sglistinfo_ptr; + if (qseecom.qsee_version < QSEE_VERSION_40) { + send_data_rsp.listener_id = lstnr; + send_data_rsp.status = status; + send_data_rsp.sglistinfo_ptr = + (uint32_t)virt_to_phys(table); + send_data_rsp.sglistinfo_len = + SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); + cmd_buf = (void *)&send_data_rsp; + cmd_len = sizeof(send_data_rsp); + } else { + send_data_rsp_64bit.listener_id = lstnr; + send_data_rsp_64bit.status = status; + send_data_rsp_64bit.sglistinfo_ptr = + virt_to_phys(table); + send_data_rsp_64bit.sglistinfo_len = + SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); + cmd_buf = (void *)&send_data_rsp_64bit; + cmd_len = sizeof(send_data_rsp_64bit); + } + if (qseecom.whitelist_support == false) + *(uint32_t *)cmd_buf = QSEOS_LISTENER_DATA_RSP_COMMAND; + else + *(uint32_t *)cmd_buf = + QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST; + if (ptr_svc) { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, + ptr_svc->ihandle, ptr_svc->sb_virt, + ptr_svc->sb_length, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } + } - if ((lstnr == RPMB_SERVICE) || (lstnr == SSD_SERVICE)) - __qseecom_enable_clk(CLK_QSEE); + if ((lstnr == RPMB_SERVICE) || (lstnr == SSD_SERVICE)) { + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; + } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, - (const void *)&send_data_rsp, - sizeof(send_data_rsp), resp, - sizeof(*resp)); + cmd_buf, cmd_len, resp, sizeof(*resp)); + ptr_svc->listener_in_use = false; + __qseecom_clean_listener_sglistinfo(ptr_svc); if (ret) { pr_err("scm_call() failed with err: %d (app_id = %d)\n", ret, data->client.app_id); @@ -1693,12 +1928,17 @@ static int __qseecom_reentrancy_process_incomplete_cmd( { int ret = 0; int rc = 0; - uint32_t lstnr; + uint32_t lstnr = 0; unsigned long flags; struct qseecom_client_listener_data_irsp send_data_rsp; + struct qseecom_client_listener_data_64bit_irsp send_data_rsp_64bit; struct qseecom_registered_listener_list *ptr_svc = NULL; sigset_t new_sigset; sigset_t old_sigset; + uint32_t status; + void *cmd_buf = NULL; + size_t cmd_len; + struct sglist_info *table = NULL; while (resp->result == QSEOS_RESULT_INCOMPLETE) { lstnr = resp->data; @@ -1761,27 +2001,61 @@ static int __qseecom_reentrancy_process_incomplete_cmd( pr_err("Abort clnt %d waiting on lstnr svc %d, ret %d", data->client.app_id, lstnr, ret); rc = -ENODEV; - send_data_rsp.status = QSEOS_RESULT_FAILURE; + status = QSEOS_RESULT_FAILURE; } else { - send_data_rsp.status = QSEOS_RESULT_SUCCESS; + status = QSEOS_RESULT_SUCCESS; } - - send_data_rsp.qsee_cmd_id = QSEOS_LISTENER_DATA_RSP_COMMAND; - send_data_rsp.listener_id = lstnr; - if (ptr_svc) - msm_ion_do_cache_op(qseecom.ion_clnt, ptr_svc->ihandle, - ptr_svc->sb_virt, ptr_svc->sb_length, - ION_IOC_CLEAN_INV_CACHES); + table = ptr_svc->sglistinfo_ptr; + if (qseecom.qsee_version < QSEE_VERSION_40) { + send_data_rsp.listener_id = lstnr; + send_data_rsp.status = status; + send_data_rsp.sglistinfo_ptr = + (uint32_t)virt_to_phys(table); + send_data_rsp.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); + cmd_buf = (void *)&send_data_rsp; + cmd_len = sizeof(send_data_rsp); + } else { + send_data_rsp_64bit.listener_id = lstnr; + send_data_rsp_64bit.status = status; + send_data_rsp_64bit.sglistinfo_ptr = + virt_to_phys(table); + send_data_rsp_64bit.sglistinfo_len = + SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); + cmd_buf = (void *)&send_data_rsp_64bit; + cmd_len = sizeof(send_data_rsp_64bit); + } + if (qseecom.whitelist_support == false) + *(uint32_t *)cmd_buf = QSEOS_LISTENER_DATA_RSP_COMMAND; + else + *(uint32_t *)cmd_buf = + QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST; if (lstnr == RPMB_SERVICE) __qseecom_enable_clk(CLK_QSEE); - ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, - (const void *)&send_data_rsp, - sizeof(send_data_rsp), resp, - sizeof(*resp)); + if (ptr_svc) { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, + ptr_svc->ihandle, ptr_svc->sb_virt, + ptr_svc->sb_length, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } + } + if (lstnr == RPMB_SERVICE) { + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; + } + ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, + cmd_buf, cmd_len, resp, sizeof(*resp)); ptr_svc->listener_in_use = false; + __qseecom_clean_listener_sglistinfo(ptr_svc); wake_up_interruptible(&ptr_svc->listener_block_app_wq); if (ret) { @@ -1949,6 +2223,7 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) struct qseecom_load_app_64bit_ireq load_req_64bit; void *cmd_buf = NULL; size_t cmd_len; + bool first_time = false; /* Copy the relevant information needed for loading the image */ if (copy_from_user(&load_img_req, @@ -2020,6 +2295,7 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) &qseecom.registered_app_list_lock, flags); ret = 0; } else { + first_time = true; pr_warn("App (%s) does'nt exist, loading apps for first time\n", (char *)(load_img_req.img_name)); /* Get the handle of the shared fd */ @@ -2038,7 +2314,13 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) ret); goto loadapp_err; } - + if (load_img_req.mdt_len > len || load_img_req.img_len > len) { + pr_err("ion len %zu is smaller than mdt_len %u or img_len %u\n", + len, load_img_req.mdt_len, + load_img_req.img_len); + ret = -EINVAL; + goto loadapp_err; + } /* Populate the structure for sending scm call to load image */ if (qseecom.qsee_version < QSEE_VERSION_40) { load_req.qsee_cmd_id = QSEOS_APP_START_COMMAND; @@ -2060,8 +2342,12 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) cmd_len = sizeof(struct qseecom_load_app_64bit_ireq); } - msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto loadapp_err; + } /* SCM_CALL to load the app and get the app_id back */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, @@ -2151,8 +2437,15 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) load_img_req.app_id = app_id; if (copy_to_user(argp, &load_img_req, sizeof(load_img_req))) { pr_err("copy_to_user failed\n"); - kzfree(entry); ret = -EFAULT; + if (first_time == true) { + spin_lock_irqsave( + &qseecom.registered_app_list_lock, flags); + list_del(&entry->list); + spin_unlock_irqrestore( + &qseecom.registered_app_list_lock, flags); + kzfree(entry); + } } loadapp_err: @@ -2344,11 +2637,6 @@ int __qseecom_process_rpmb_svc_cmd(struct qseecom_dev_handle *data_ptr, return -EINVAL; } - if ((!req_ptr->cmd_req_buf) || (!req_ptr->resp_buf)) { - pr_err("Invalid req/resp buffer, exiting\n"); - return -EINVAL; - } - /* Clients need to ensure req_buf is at base offset of shared buffer */ if ((uintptr_t)req_ptr->cmd_req_buf != data_ptr->client.user_virt_sb_base) { @@ -2356,15 +2644,11 @@ int __qseecom_process_rpmb_svc_cmd(struct qseecom_dev_handle *data_ptr, return -EINVAL; } - if (((uintptr_t)req_ptr->resp_buf < - data_ptr->client.user_virt_sb_base) || - ((uintptr_t)req_ptr->resp_buf >= - (data_ptr->client.user_virt_sb_base + - data_ptr->client.sb_length))){ - pr_err("response buffer address not within shared bufffer\n"); + if (data_ptr->client.sb_length < + sizeof(struct qseecom_rpmb_provision_key)) { + pr_err("shared buffer is too small to hold key type\n"); return -EINVAL; } - req_buf = data_ptr->client.sb_virt; send_svc_ireq_ptr->qsee_cmd_id = req_ptr->cmd_id; @@ -2391,36 +2675,6 @@ int __qseecom_process_fsm_key_svc_cmd(struct qseecom_dev_handle *data_ptr, return -EINVAL; } - if (((uintptr_t)req_ptr->cmd_req_buf < - data_ptr->client.user_virt_sb_base) || - ((uintptr_t)req_ptr->cmd_req_buf >= - (data_ptr->client.user_virt_sb_base + - data_ptr->client.sb_length))) { - pr_err("cmd buffer address not within shared bufffer\n"); - return -EINVAL; - } - - if (((uintptr_t)req_ptr->resp_buf < - data_ptr->client.user_virt_sb_base) || - ((uintptr_t)req_ptr->resp_buf >= - (data_ptr->client.user_virt_sb_base + - data_ptr->client.sb_length))){ - pr_err("response buffer address not within shared bufffer\n"); - return -EINVAL; - } - - if ((req_ptr->cmd_req_len == 0) || (req_ptr->resp_len == 0) || - req_ptr->cmd_req_len > data_ptr->client.sb_length || - req_ptr->resp_len > data_ptr->client.sb_length) { - pr_err("cmd buffer length or response buffer length not valid\n"); - return -EINVAL; - } - - if (req_ptr->cmd_req_len > UINT_MAX - req_ptr->resp_len) { - pr_err("Integer overflow detected in req_len & rsp_len, exiting now\n"); - return -EINVAL; - } - reqd_len_sb_in = req_ptr->cmd_req_len + req_ptr->resp_len; if (reqd_len_sb_in > data_ptr->client.sb_length) { pr_err("Not enough memory to fit cmd_buf and resp_buf. "); @@ -2442,28 +2696,11 @@ int __qseecom_process_fsm_key_svc_cmd(struct qseecom_dev_handle *data_ptr, return ret; } -static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, - void __user *argp) +static int __validate_send_service_cmd_inputs(struct qseecom_dev_handle *data, + struct qseecom_send_svc_cmd_req *req) { - int ret = 0; - struct qseecom_client_send_service_ireq send_svc_ireq; - struct qseecom_client_send_fsm_key_req send_fsm_key_svc_ireq; - struct qseecom_command_scm_resp resp; - struct qseecom_send_svc_cmd_req req; - void *send_req_ptr; - size_t req_buf_size; - - /*struct qseecom_command_scm_resp resp;*/ - - if (copy_from_user(&req, - (void __user *)argp, - sizeof(req))) { - pr_err("copy_from_user failed\n"); - return -EFAULT; - } - - if ((req.resp_buf == NULL) || (req.cmd_req_buf == NULL)) { - pr_err("cmd buffer or response buffer is null\n"); + if (!req || !req->resp_buf || !req->cmd_req_buf) { + pr_err("req or cmd buffer or response buffer is null\n"); return -EINVAL; } @@ -2487,6 +2724,86 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, return -EINVAL; } + if (((uintptr_t)req->cmd_req_buf < + data->client.user_virt_sb_base) || + ((uintptr_t)req->cmd_req_buf >= + (data->client.user_virt_sb_base + data->client.sb_length))) { + pr_err("cmd buffer address not within shared bufffer\n"); + return -EINVAL; + } + if (((uintptr_t)req->resp_buf < + data->client.user_virt_sb_base) || + ((uintptr_t)req->resp_buf >= + (data->client.user_virt_sb_base + data->client.sb_length))) { + pr_err("response buffer address not within shared bufffer\n"); + return -EINVAL; + } + if ((req->cmd_req_len == 0) || (req->resp_len == 0) || + (req->cmd_req_len > data->client.sb_length) || + (req->resp_len > data->client.sb_length)) { + pr_err("cmd buf length or response buf length not valid\n"); + return -EINVAL; + } + if (req->cmd_req_len > UINT_MAX - req->resp_len) { + pr_err("Integer overflow detected in req_len & rsp_len\n"); + return -EINVAL; + } + + if ((req->cmd_req_len + req->resp_len) > data->client.sb_length) { + pr_debug("Not enough memory to fit cmd_buf.\n"); + pr_debug("resp_buf. Required: %u, Available: %zu\n", + (req->cmd_req_len + req->resp_len), + data->client.sb_length); + return -ENOMEM; + } + if ((uintptr_t)req->cmd_req_buf > (ULONG_MAX - req->cmd_req_len)) { + pr_err("Integer overflow in req_len & cmd_req_buf\n"); + return -EINVAL; + } + if ((uintptr_t)req->resp_buf > (ULONG_MAX - req->resp_len)) { + pr_err("Integer overflow in resp_len & resp_buf\n"); + return -EINVAL; + } + if (data->client.user_virt_sb_base > + (ULONG_MAX - data->client.sb_length)) { + pr_err("Integer overflow in user_virt_sb_base & sb_length\n"); + return -EINVAL; + } + if ((((uintptr_t)req->cmd_req_buf + req->cmd_req_len) > + ((uintptr_t)data->client.user_virt_sb_base + + data->client.sb_length)) || + (((uintptr_t)req->resp_buf + req->resp_len) > + ((uintptr_t)data->client.user_virt_sb_base + + data->client.sb_length))) { + pr_err("cmd buf or resp buf is out of shared buffer region\n"); + return -EINVAL; + } + return 0; +} + +static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, + void __user *argp) +{ + int ret = 0; + struct qseecom_client_send_service_ireq send_svc_ireq; + struct qseecom_client_send_fsm_key_req send_fsm_key_svc_ireq; + struct qseecom_command_scm_resp resp; + struct qseecom_send_svc_cmd_req req; + void *send_req_ptr; + size_t req_buf_size; + + /*struct qseecom_command_scm_resp resp;*/ + + if (copy_from_user(&req, + (void __user *)argp, + sizeof(req))) { + pr_err("copy_from_user failed\n"); + return -EFAULT; + } + + if (__validate_send_service_cmd_inputs(data, &req)) + return -EINVAL; + data->type = QSEECOM_SECURE_SERVICE; switch (req.cmd_id) { @@ -2532,15 +2849,16 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, } } - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, data->client.sb_length, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto exit; + } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, (const void *)send_req_ptr, req_buf_size, &resp, sizeof(resp)); - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, - data->client.sb_virt, data->client.sb_length, - ION_IOC_INV_CACHES); if (ret) { pr_err("qseecom_scm_call failed with err: %d\n", ret); if (!qseecom.support_bus_scaling) { @@ -2552,7 +2870,13 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, } goto exit; } - + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + data->client.sb_virt, data->client.sb_length, + ION_IOC_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto exit; + } switch (resp.result) { case QSEOS_RESULT_SUCCESS: break; @@ -2565,7 +2889,11 @@ static int qseecom_send_service_cmd(struct qseecom_dev_handle *data, } if (req.cmd_id == QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND) { pr_warn("RPMB key status is 0x%x\n", resp.result); - *(uint32_t *)req.resp_buf = resp.result; + if (put_user(resp.result, + (uint32_t __user *)req.resp_buf)) { + ret = -EINVAL; + goto exit; + } ret = 0; } break; @@ -2705,14 +3033,15 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, { int ret = 0; u32 reqd_len_sb_in = 0; - struct qseecom_client_send_data_ireq send_data_req; - struct qseecom_client_send_data_64bit_ireq send_data_req_64bit; + struct qseecom_client_send_data_ireq send_data_req = {0}; + struct qseecom_client_send_data_64bit_ireq send_data_req_64bit = {0}; struct qseecom_command_scm_resp resp; unsigned long flags; struct qseecom_registered_app_list *ptr_app; bool found_app = false; void *cmd_buf = NULL; size_t cmd_len; + struct sglist_info *table = data->sglistinfo_ptr; reqd_len_sb_in = req->cmd_req_len + req->resp_len; /* find app_id & img_name from list */ @@ -2734,7 +3063,6 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, } if (qseecom.qsee_version < QSEE_VERSION_40) { - send_data_req.qsee_cmd_id = QSEOS_CLIENT_SEND_DATA_COMMAND; send_data_req.app_id = data->client.app_id; send_data_req.req_ptr = (uint32_t)(__qseecom_uvirt_to_kphys( data, (uintptr_t)req->cmd_req_buf)); @@ -2742,11 +3070,14 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, send_data_req.rsp_ptr = (uint32_t)(__qseecom_uvirt_to_kphys( data, (uintptr_t)req->resp_buf)); send_data_req.rsp_len = req->resp_len; + send_data_req.sglistinfo_ptr = + (uint32_t)virt_to_phys(table); + send_data_req.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); cmd_buf = (void *)&send_data_req; cmd_len = sizeof(struct qseecom_client_send_data_ireq); } else { - send_data_req_64bit.qsee_cmd_id = - QSEOS_CLIENT_SEND_DATA_COMMAND; send_data_req_64bit.app_id = data->client.app_id; send_data_req_64bit.req_ptr = __qseecom_uvirt_to_kphys(data, (uintptr_t)req->cmd_req_buf); @@ -2768,14 +3099,28 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, send_data_req_64bit.rsp_len); return -EFAULT; } + send_data_req_64bit.sglistinfo_ptr = + (uint64_t)virt_to_phys(table); + send_data_req_64bit.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); cmd_buf = (void *)&send_data_req_64bit; cmd_len = sizeof(struct qseecom_client_send_data_64bit_ireq); } - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + if (qseecom.whitelist_support == false || data->use_legacy_cmd == true) + *(uint32_t *)cmd_buf = QSEOS_CLIENT_SEND_DATA_COMMAND; + else + *(uint32_t *)cmd_buf = QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST; + + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, reqd_len_sb_in, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } __qseecom_reentrancy_check_if_this_app_blocked(ptr_app); @@ -2806,9 +3151,11 @@ static int __qseecom_send_cmd(struct qseecom_dev_handle *data, } } } - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, data->client.sb_length, ION_IOC_INV_CACHES); + if (ret) + pr_err("cache operation failed %d\n", ret); return ret; } @@ -2872,6 +3219,8 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, struct qseecom_send_modfd_cmd_req *req = NULL; struct qseecom_send_modfd_listener_resp *lstnr_resp = NULL; struct qseecom_registered_listener_list *this_lstnr = NULL; + uint32_t offset; + struct sg_table *sg_ptr; if ((data->type != QSEECOM_LISTENER_SERVICE) && (data->type != QSEECOM_CLIENT_APP)) @@ -2893,7 +3242,6 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, } for (i = 0; i < MAX_ION_FD; i++) { - struct sg_table *sg_ptr = NULL; if ((data->type != QSEECOM_LISTENER_SERVICE) && (req->ifd_data[i].fd > 0)) { ihandle = ion_import_dma_buf(qseecom.ion_clnt, @@ -2919,7 +3267,7 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, } /* Populate the cmd data structure with the phys_addr */ sg_ptr = ion_sg_table(qseecom.ion_clnt, ihandle); - if (sg_ptr == NULL) { + if (IS_ERR_OR_NULL(sg_ptr)) { pr_err("IOn client could not retrieve sg table\n"); goto err; } @@ -3025,14 +3373,45 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, goto err; } } - if (cleanup) - msm_ion_do_cache_op(qseecom.ion_clnt, + + if (cleanup) { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_INV_CACHES); - else - msm_ion_do_cache_op(qseecom.ion_clnt, + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } + } else { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } + if (data->type == QSEECOM_CLIENT_APP) { + offset = req->ifd_data[i].cmd_buf_offset; + data->sglistinfo_ptr[i].indexAndFlags = + SGLISTINFO_SET_INDEX_FLAG( + (sg_ptr->nents == 1), 0, offset); + data->sglistinfo_ptr[i].sizeOrCount = + (sg_ptr->nents == 1) ? + sg->length : sg_ptr->nents; + data->sglist_cnt = i + 1; + } else { + offset = (lstnr_resp->ifd_data[i].cmd_buf_offset + + (uintptr_t)lstnr_resp->resp_buf_ptr - + (uintptr_t)this_lstnr->sb_virt); + this_lstnr->sglistinfo_ptr[i].indexAndFlags = + SGLISTINFO_SET_INDEX_FLAG( + (sg_ptr->nents == 1), 0, offset); + this_lstnr->sglistinfo_ptr[i].sizeOrCount = + (sg_ptr->nents == 1) ? + sg->length : sg_ptr->nents; + this_lstnr->sglist_cnt = i + 1; + } + } /* Deallocate the handle */ if (!IS_ERR_OR_NULL(ihandle)) ion_free(qseecom.ion_clnt, ihandle); @@ -3103,6 +3482,8 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, struct qseecom_send_modfd_cmd_req *req = NULL; struct qseecom_send_modfd_listener_resp *lstnr_resp = NULL; struct qseecom_registered_listener_list *this_lstnr = NULL; + uint32_t offset; + struct sg_table *sg_ptr; if ((data->type != QSEECOM_LISTENER_SERVICE) && (data->type != QSEECOM_CLIENT_APP)) @@ -3124,7 +3505,6 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, } for (i = 0; i < MAX_ION_FD; i++) { - struct sg_table *sg_ptr = NULL; if ((data->type != QSEECOM_LISTENER_SERVICE) && (req->ifd_data[i].fd > 0)) { ihandle = ion_import_dma_buf(qseecom.ion_clnt, @@ -3150,7 +3530,7 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, } /* Populate the cmd data structure with the phys_addr */ sg_ptr = ion_sg_table(qseecom.ion_clnt, ihandle); - if (sg_ptr == NULL) { + if (IS_ERR_OR_NULL(sg_ptr)) { pr_err("IOn client could not retrieve sg table\n"); goto err; } @@ -3178,6 +3558,7 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, } } len = QSEECOM_SG_LIST_BUF_HDR_SZ_64BIT; + sg = sg_ptr->sgl; goto cleanup; } sg = sg_ptr->sgl; @@ -3231,20 +3612,57 @@ static int __qseecom_update_cmd_buf_64(void *msg, bool cleanup, } } cleanup: - if (cleanup) - msm_ion_do_cache_op(qseecom.ion_clnt, + if (cleanup) { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_INV_CACHES); - else - msm_ion_do_cache_op(qseecom.ion_clnt, + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } + } else { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } + if (data->type == QSEECOM_CLIENT_APP) { + offset = req->ifd_data[i].cmd_buf_offset; + data->sglistinfo_ptr[i].indexAndFlags = + SGLISTINFO_SET_INDEX_FLAG( + (sg_ptr->nents == 1), 1, offset); + data->sglistinfo_ptr[i].sizeOrCount = + (sg_ptr->nents == 1) ? + sg->length : sg_ptr->nents; + data->sglist_cnt = i + 1; + } else { + offset = (lstnr_resp->ifd_data[i].cmd_buf_offset + + (uintptr_t)lstnr_resp->resp_buf_ptr - + (uintptr_t)this_lstnr->sb_virt); + this_lstnr->sglistinfo_ptr[i].indexAndFlags = + SGLISTINFO_SET_INDEX_FLAG( + (sg_ptr->nents == 1), 1, offset); + this_lstnr->sglistinfo_ptr[i].sizeOrCount = + (sg_ptr->nents == 1) ? + sg->length : sg_ptr->nents; + this_lstnr->sglist_cnt = i + 1; + } + } /* Deallocate the handle */ if (!IS_ERR_OR_NULL(ihandle)) ion_free(qseecom.ion_clnt, ihandle); } return ret; err: + for (i = 0; i < MAX_ION_FD; i++) + if (data->client.sec_buf_fd[i].is_sec_buf_fd && + data->client.sec_buf_fd[i].vbase) + dma_free_coherent(qseecom.pdev, + data->client.sec_buf_fd[i].size, + data->client.sec_buf_fd[i].vbase, + data->client.sec_buf_fd[i].pbase); if (!IS_ERR_OR_NULL(ihandle)) ion_free(qseecom.ion_clnt, ihandle); return -ENOMEM; @@ -3432,7 +3850,7 @@ static bool __qseecom_is_fw_image_valid(const struct firmware *fw_entry) return true; } -static int __qseecom_get_fw_size(char *appname, uint32_t *fw_size, +static int __qseecom_get_fw_size(const char *appname, uint32_t *fw_size, uint32_t *app_arch) { int ret = -1; @@ -3470,14 +3888,21 @@ static int __qseecom_get_fw_size(char *appname, uint32_t *fw_size, } pr_debug("QSEE %s app, arch %u\n", appname, *app_arch); release_firmware(fw_entry); + fw_entry = NULL; for (i = 0; i < num_images; i++) { memset(fw_name, 0, sizeof(fw_name)); snprintf(fw_name, ARRAY_SIZE(fw_name), "%s.b%02d", appname, i); ret = request_firmware(&fw_entry, fw_name, qseecom.pdev); if (ret) goto err; + if (*fw_size > U32_MAX - fw_entry->size) { + pr_err("QSEE %s app file size overflow\n", appname); + ret = -EINVAL; + goto err; + } *fw_size += fw_entry->size; release_firmware(fw_entry); + fw_entry = NULL; } return ret; @@ -3488,8 +3913,9 @@ static int __qseecom_get_fw_size(char *appname, uint32_t *fw_size, return ret; } -static int __qseecom_get_fw_data(char *appname, u8 *img_data, - struct qseecom_load_app_ireq *load_req) +static int __qseecom_get_fw_data(const char *appname, u8 *img_data, + uint32_t fw_size, + struct qseecom_load_app_ireq *load_req) { int ret = -1; int i = 0, rc = 0; @@ -3509,6 +3935,12 @@ static int __qseecom_get_fw_data(char *appname, u8 *img_data, } load_req->img_len = fw_entry->size; + if (load_req->img_len > fw_size) { + pr_err("app %s size %zu is larger than buf size %u\n", + appname, fw_entry->size, fw_size); + ret = -EINVAL; + goto err; + } memcpy(img_data_ptr, fw_entry->data, fw_entry->size); img_data_ptr = img_data_ptr + fw_entry->size; load_req->mdt_len = fw_entry->size; /*Get MDT LEN*/ @@ -3527,6 +3959,7 @@ static int __qseecom_get_fw_data(char *appname, u8 *img_data, goto err; } release_firmware(fw_entry); + fw_entry = NULL; for (i = 0; i < num_images; i++) { snprintf(fw_name, ARRAY_SIZE(fw_name), "%s.b%02d", appname, i); ret = request_firmware(&fw_entry, fw_name, qseecom.pdev); @@ -3534,10 +3967,17 @@ static int __qseecom_get_fw_data(char *appname, u8 *img_data, pr_err("Failed to locate blob %s\n", fw_name); goto err; } + if ((fw_entry->size > U32_MAX - load_req->img_len) || + (fw_entry->size + load_req->img_len > fw_size)) { + pr_err("Invalid file size for %s\n", fw_name); + ret = -EINVAL; + goto err; + } memcpy(img_data_ptr, fw_entry->data, fw_entry->size); img_data_ptr = img_data_ptr + fw_entry->size; load_req->img_len += fw_entry->size; release_firmware(fw_entry); + fw_entry = NULL; } return ret; err: @@ -3642,7 +4082,7 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname) if (ret) return ret; - ret = __qseecom_get_fw_data(appname, img_data, &load_req); + ret = __qseecom_get_fw_data(appname, img_data, fw_size, &load_req); if (ret) { ret = -EIO; goto exit_free_img_data; @@ -3683,9 +4123,13 @@ static int __qseecom_load_fw(struct qseecom_dev_handle *data, char *appname) goto exit_unregister_bus_bw_need; } - msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, img_data, fw_size, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto exit_disable_clk_vote; + } /* SCM_CALL to load the image */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, @@ -3763,7 +4207,7 @@ static int qseecom_load_commonlib_image(struct qseecom_dev_handle *data, if (ret) return -EIO; - ret = __qseecom_get_fw_data(cmnlib_name, img_data, &load_req); + ret = __qseecom_get_fw_data(cmnlib_name, img_data, fw_size, &load_req); if (ret) { ret = -EIO; goto exit_free_img_data; @@ -3799,9 +4243,13 @@ static int qseecom_load_commonlib_image(struct qseecom_dev_handle *data, goto exit_unregister_bus_bw_need; } - msm_ion_do_cache_op(qseecom.ion_clnt, qseecom.cmnlib_ion_handle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, qseecom.cmnlib_ion_handle, img_data, fw_size, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto exit_disable_clk_vote; + } /* SCM_CALL to load the image */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, @@ -3905,9 +4353,9 @@ int qseecom_start_app(struct qseecom_handle **handle, return -EINVAL; } - if (strlen(app_name) >= MAX_APP_NAME_SIZE) { + if (strnlen(app_name, MAX_APP_NAME_SIZE) == MAX_APP_NAME_SIZE) { pr_err("The app_name (%s) with length %zu is not valid\n", - app_name, strlen(app_name)); + app_name, strnlen(app_name, MAX_APP_NAME_SIZE)); return -EINVAL; } @@ -3991,6 +4439,7 @@ int qseecom_start_app(struct qseecom_handle **handle, strlcpy(entry->app_name, app_name, MAX_APP_NAME_SIZE); if (__qseecom_get_fw_size(app_name, &fw_size, &app_arch)) { ret = -EIO; + kfree(entry); goto err; } entry->app_arch = app_arch; @@ -4013,6 +4462,11 @@ int qseecom_start_app(struct qseecom_handle **handle, /* Populate the structure for sending scm call to load image */ data->client.sb_virt = (char *) ion_map_kernel(qseecom.ion_clnt, data->client.ihandle); + if (IS_ERR_OR_NULL(data->client.sb_virt)) { + pr_err("ION memory mapping for client shared buf failed\n"); + ret = -ENOMEM; + goto err; + } data->client.user_virt_sb_base = (uintptr_t)data->client.sb_virt; data->client.sb_phys = (phys_addr_t)pa; (*handle)->dev = (void *)data; @@ -4148,8 +4602,11 @@ int qseecom_send_command(struct qseecom_handle *handle, void *send_buf, } perf_enabled = true; } + if (!strcmp(data->client.app_name, "securemm")) + data->use_legacy_cmd = true; ret = __qseecom_send_cmd(data, &req); + data->use_legacy_cmd = false; if (qseecom.support_bus_scaling) __qseecom_add_bw_scale_down_timer( QSEECOM_SEND_CMD_CRYPTO_TIMEOUT); @@ -4359,9 +4816,10 @@ static int __qseecom_enable_clk(enum qseecom_ce_hw_instance ce) } mutex_lock(&clk_access_lock); - if (qclk->clk_access_cnt == ULONG_MAX) + if (qclk->clk_access_cnt == ULONG_MAX) { + pr_err("clk_access_cnt beyond limitation\n"); goto err; - + } if (qclk->clk_access_cnt > 0) { qclk->clk_access_cnt++; mutex_unlock(&clk_access_lock); @@ -4641,6 +5099,12 @@ static int qseecom_load_external_elf(struct qseecom_dev_handle *data, ret); return ret; } + if (load_img_req.mdt_len > len || load_img_req.img_len > len) { + pr_err("ion len %zu is smaller than mdt_len %u or img_len %u\n", + len, load_img_req.mdt_len, + load_img_req.img_len); + return ret; + } /* Populate the structure for sending scm call to load image */ if (qseecom.qsee_version < QSEE_VERSION_40) { load_req.qsee_cmd_id = QSEOS_LOAD_EXTERNAL_ELF_COMMAND; @@ -4674,9 +5138,12 @@ static int qseecom_load_external_elf(struct qseecom_dev_handle *data, ret = -EIO; goto exit_register_bus_bandwidth_needs; } - msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, len, ION_IOC_CLEAN_INV_CACHES); - + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto exit_disable_clock; + } /* SCM_CALL to load the external elf */ ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, &resp, sizeof(resp)); @@ -4922,7 +5389,9 @@ static int __qseecom_generate_and_save_key(struct qseecom_dev_handle *data, pr_err("Error:: unsupported usage %d\n", usage); return -EFAULT; } - __qseecom_enable_clk(CLK_QSEE); + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, ireq, sizeof(struct qseecom_key_generate_ireq), @@ -4980,7 +5449,9 @@ static int __qseecom_delete_saved_key(struct qseecom_dev_handle *data, pr_err("Error:: unsupported usage %d\n", usage); return -EFAULT; } - __qseecom_enable_clk(CLK_QSEE); + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, ireq, sizeof(struct qseecom_key_delete_ireq), @@ -5039,10 +5510,15 @@ static int __qseecom_set_clear_ce_key(struct qseecom_dev_handle *data, pr_err("Error:: unsupported usage %d\n", usage); return -EFAULT; } + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; - __qseecom_enable_clk(CLK_QSEE); - if (qseecom.qsee.instance != qseecom.ce_drv.instance) - __qseecom_enable_clk(CLK_CE_DRV); + if (qseecom.qsee.instance != qseecom.ce_drv.instance) { + ret = __qseecom_enable_clk(CLK_CE_DRV); + if (ret) + return ret; + } ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, ireq, sizeof(struct qseecom_key_select_ireq), @@ -5117,8 +5593,9 @@ static int __qseecom_update_current_key_user_info( pr_err("Error:: unsupported usage %d\n", usage); return -EFAULT; } - - __qseecom_enable_clk(CLK_QSEE); + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + return ret; ret = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, ireq, sizeof(struct qseecom_key_userinfo_update_ireq), @@ -5275,6 +5752,11 @@ static int qseecom_create_key(struct qseecom_dev_handle *data, goto free_buf; } + if (qseecom.fde_key_size) + flags |= QSEECOM_ICE_FDE_KEY_SIZE_32_BYTE; + else + flags |= QSEECOM_ICE_FDE_KEY_SIZE_16_BYTE; + generate_key_ireq.flags = flags; generate_key_ireq.qsee_command_id = QSEOS_GENERATE_KEY; memset((void *)generate_key_ireq.key_id, @@ -5493,6 +5975,12 @@ static int qseecom_update_key_user_info(struct qseecom_dev_handle *data, } ireq.qsee_command_id = QSEOS_UPDATE_KEY_USERINFO; + + if (qseecom.fde_key_size) + flags |= QSEECOM_ICE_FDE_KEY_SIZE_32_BYTE; + else + flags |= QSEECOM_ICE_FDE_KEY_SIZE_16_BYTE; + ireq.flags = flags; memset(ireq.key_id, 0, QSEECOM_KEY_ID_SIZE); memset((void *)ireq.current_hash32, 0, QSEECOM_HASH_SIZE); @@ -5612,7 +6100,8 @@ static int qseecom_mdtp_cipher_dip(void __user *argp) } if (req.in_buf == NULL || req.out_buf == NULL || - req.in_buf_size == 0 || req.out_buf_size == 0 || + req.in_buf_size == 0 || req.in_buf_size > MAX_DIP || + req.out_buf_size == 0 || req.out_buf_size > MAX_DIP || req.direction > 1) { pr_err("invalid parameters\n"); ret = -EINVAL; @@ -5655,7 +6144,9 @@ static int qseecom_mdtp_cipher_dip(void __user *argp) desc.args[3] = req.out_buf_size; desc.args[4] = req.direction; - __qseecom_enable_clk(CLK_QSEE); + ret = __qseecom_enable_clk(CLK_QSEE); + if (ret) + break; ret = scm_call2(TZ_MDTP_CIPHER_DIP_ID, &desc); @@ -5842,7 +6333,7 @@ static int __qseecom_update_qteec_req_buf(struct qseecom_qteec_modfd_req *req, } /* Populate the cmd data structure with the phys_addr */ sg_ptr = ion_sg_table(qseecom.ion_clnt, ihandle); - if (sg_ptr == NULL) { + if (IS_ERR_OR_NULL(sg_ptr)) { pr_err("IOn client could not retrieve sg table\n"); goto err; } @@ -5897,14 +6388,31 @@ static int __qseecom_update_qteec_req_buf(struct qseecom_qteec_modfd_req *req, *update = (uint32_t)sg_dma_address(sg_ptr->sgl); } clean: - if (cleanup) - msm_ion_do_cache_op(qseecom.ion_clnt, + if (cleanup) { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, sg->length, ION_IOC_INV_CACHES); - else - msm_ion_do_cache_op(qseecom.ion_clnt, + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } + } else { + ret = msm_ion_do_cache_op(qseecom.ion_clnt, ihandle, NULL, sg->length, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + goto err; + } + data->sglistinfo_ptr[i].indexAndFlags = + SGLISTINFO_SET_INDEX_FLAG( + (sg_ptr->nents == 1), 0, + req->ifd_data[i].cmd_buf_offset); + data->sglistinfo_ptr[i].sizeOrCount = + (sg_ptr->nents == 1) ? + sg->length : sg_ptr->nents; + data->sglist_cnt = i + 1; + } /* Deallocate the handle */ if (!IS_ERR_OR_NULL(ihandle)) ion_free(qseecom.ion_clnt, ihandle); @@ -5929,11 +6437,17 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, uint32_t reqd_len_sb_in = 0; void *cmd_buf = NULL; size_t cmd_len; + struct sglist_info *table = data->sglistinfo_ptr; + void *req_ptr = NULL; + void *resp_ptr = NULL; ret = __qseecom_qteec_validate_msg(data, req); if (ret) return ret; + req_ptr = req->req_ptr; + resp_ptr = req->resp_ptr; + /* find app_id & img_name from list */ spin_lock_irqsave(&qseecom.registered_app_list_lock, flags); list_for_each_entry(ptr_app, &qseecom.registered_app_list_head, @@ -5951,25 +6465,40 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, return -ENOENT; } + req->req_ptr = (void *)__qseecom_uvirt_to_kvirt(data, + (uintptr_t)req->req_ptr); + req->resp_ptr = (void *)__qseecom_uvirt_to_kvirt(data, + (uintptr_t)req->resp_ptr); + + if ((cmd_id == QSEOS_TEE_OPEN_SESSION) || + (cmd_id == QSEOS_TEE_REQUEST_CANCELLATION)) { + ret = __qseecom_update_qteec_req_buf( + (struct qseecom_qteec_modfd_req *)req, data, false); + if (ret) + return ret; + } + if (qseecom.qsee_version < QSEE_VERSION_40) { - ireq.qsee_cmd_id = cmd_id; ireq.app_id = data->client.app_id; ireq.req_ptr = (uint32_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req->req_ptr); + (uintptr_t)req_ptr); ireq.req_len = req->req_len; ireq.resp_ptr = (uint32_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req->resp_ptr); + (uintptr_t)resp_ptr); ireq.resp_len = req->resp_len; + ireq.sglistinfo_ptr = (uint32_t)virt_to_phys(table); + ireq.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); cmd_buf = (void *)&ireq; cmd_len = sizeof(struct qseecom_qteec_ireq); } else { - ireq_64bit.qsee_cmd_id = cmd_id; ireq_64bit.app_id = data->client.app_id; ireq_64bit.req_ptr = (uint64_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req->req_ptr); + (uintptr_t)req_ptr); ireq_64bit.req_len = req->req_len; ireq_64bit.resp_ptr = (uint64_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req->resp_ptr); + (uintptr_t)resp_ptr); ireq_64bit.resp_len = req->resp_len; if ((data->client.app_arch == ELFCLASS32) && ((ireq_64bit.req_ptr >= @@ -5983,22 +6512,28 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, ireq_64bit.resp_ptr, ireq_64bit.resp_len); return -EFAULT; } + ireq_64bit.sglistinfo_ptr = (uint64_t)virt_to_phys(table); + ireq_64bit.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); cmd_buf = (void *)&ireq_64bit; cmd_len = sizeof(struct qseecom_qteec_64bit_ireq); } + if (qseecom.whitelist_support == true + && cmd_id == QSEOS_TEE_OPEN_SESSION) + *(uint32_t *)cmd_buf = QSEOS_TEE_OPEN_SESSION_WHITELIST; + else + *(uint32_t *)cmd_buf = cmd_id; - if ((cmd_id == QSEOS_TEE_OPEN_SESSION) || - (cmd_id == QSEOS_TEE_REQUEST_CANCELLATION)) { - ret = __qseecom_update_qteec_req_buf( - (struct qseecom_qteec_modfd_req *)req, data, false); - if (ret) - return ret; - } reqd_len_sb_in = req->req_len + req->resp_len; - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, reqd_len_sb_in, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } __qseecom_reentrancy_check_if_this_app_blocked(ptr_app); @@ -6029,9 +6564,13 @@ static int __qseecom_qteec_issue_cmd(struct qseecom_dev_handle *data, } } } - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, data->client.sb_length, ION_IOC_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } if ((cmd_id == QSEOS_TEE_OPEN_SESSION) || (cmd_id == QSEOS_TEE_REQUEST_CANCELLATION)) { @@ -6091,6 +6630,9 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data, uint32_t reqd_len_sb_in = 0; void *cmd_buf = NULL; size_t cmd_len; + struct sglist_info *table = data->sglistinfo_ptr; + void *req_ptr = NULL; + void *resp_ptr = NULL; ret = copy_from_user(&req, argp, sizeof(struct qseecom_qteec_modfd_req)); @@ -6102,6 +6644,8 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data, (struct qseecom_qteec_req *)(&req)); if (ret) return ret; + req_ptr = req.req_ptr; + resp_ptr = req.resp_ptr; /* find app_id & img_name from list */ spin_lock_irqsave(&qseecom.registered_app_list_lock, flags); @@ -6120,49 +6664,64 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data, return -ENOENT; } + /* validate offsets */ + for (i = 0; i < MAX_ION_FD; i++) { + if (req.ifd_data[i].fd) { + if (req.ifd_data[i].cmd_buf_offset >= req.req_len) + return -EINVAL; + } + } + req.req_ptr = (void *)__qseecom_uvirt_to_kvirt(data, + (uintptr_t)req.req_ptr); + req.resp_ptr = (void *)__qseecom_uvirt_to_kvirt(data, + (uintptr_t)req.resp_ptr); + ret = __qseecom_update_qteec_req_buf(&req, data, false); + if (ret) + return ret; + if (qseecom.qsee_version < QSEE_VERSION_40) { - ireq.qsee_cmd_id = QSEOS_TEE_INVOKE_COMMAND; ireq.app_id = data->client.app_id; ireq.req_ptr = (uint32_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req.req_ptr); + (uintptr_t)req_ptr); ireq.req_len = req.req_len; ireq.resp_ptr = (uint32_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req.resp_ptr); + (uintptr_t)resp_ptr); ireq.resp_len = req.resp_len; cmd_buf = (void *)&ireq; cmd_len = sizeof(struct qseecom_qteec_ireq); + ireq.sglistinfo_ptr = (uint32_t)virt_to_phys(table); + ireq.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); } else { - ireq_64bit.qsee_cmd_id = QSEOS_TEE_INVOKE_COMMAND; ireq_64bit.app_id = data->client.app_id; ireq_64bit.req_ptr = (uint64_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req.req_ptr); + (uintptr_t)req_ptr); ireq_64bit.req_len = req.req_len; ireq_64bit.resp_ptr = (uint64_t)__qseecom_uvirt_to_kphys(data, - (uintptr_t)req.resp_ptr); + (uintptr_t)resp_ptr); ireq_64bit.resp_len = req.resp_len; cmd_buf = (void *)&ireq_64bit; cmd_len = sizeof(struct qseecom_qteec_64bit_ireq); + ireq_64bit.sglistinfo_ptr = (uint64_t)virt_to_phys(table); + ireq_64bit.sglistinfo_len = SGLISTINFO_TABLE_SIZE; + dmac_flush_range((void *)table, + (void *)table + SGLISTINFO_TABLE_SIZE); } reqd_len_sb_in = req.req_len + req.resp_len; + if (qseecom.whitelist_support == true) + *(uint32_t *)cmd_buf = QSEOS_TEE_INVOKE_COMMAND_WHITELIST; + else + *(uint32_t *)cmd_buf = QSEOS_TEE_INVOKE_COMMAND; - /* validate offsets */ - for (i = 0; i < MAX_ION_FD; i++) { - if (req.ifd_data[i].fd) { - if (req.ifd_data[i].cmd_buf_offset >= req.req_len) - return -EINVAL; - } - } - req.req_ptr = (void *)__qseecom_uvirt_to_kvirt(data, - (uintptr_t)req.req_ptr); - req.resp_ptr = (void *)__qseecom_uvirt_to_kvirt(data, - (uintptr_t)req.resp_ptr); - ret = __qseecom_update_qteec_req_buf(&req, data, false); - if (ret) - return ret; - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, reqd_len_sb_in, ION_IOC_CLEAN_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } __qseecom_reentrancy_check_if_this_app_blocked(ptr_app); @@ -6197,9 +6756,13 @@ static int qseecom_qteec_invoke_modfd_cmd(struct qseecom_dev_handle *data, if (ret) return ret; - msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, + ret = msm_ion_do_cache_op(qseecom.ion_clnt, data->client.ihandle, data->client.sb_virt, data->client.sb_length, ION_IOC_INV_CACHES); + if (ret) { + pr_err("cache operation failed %d\n", ret); + return ret; + } return 0; } @@ -6221,6 +6784,69 @@ static int qseecom_qteec_request_cancellation(struct qseecom_dev_handle *data, return ret; } +static void __qseecom_clean_data_sglistinfo(struct qseecom_dev_handle *data) +{ + if (data->sglist_cnt) { + memset(data->sglistinfo_ptr, 0, + SGLISTINFO_TABLE_SIZE); + data->sglist_cnt = 0; + } +} + + +static int __qseecom_bus_scaling_enable(struct qseecom_dev_handle *data, + bool *perf_enabled) +{ + int ret = 0; + + if (qseecom.support_bus_scaling) { + if (!data->mode) { + mutex_lock(&qsee_bw_mutex); + __qseecom_register_bus_bandwidth_needs( + data, HIGH); + mutex_unlock(&qsee_bw_mutex); + } + ret = qseecom_scale_bus_bandwidth_timer(INACTIVE); + if (ret) { + pr_err("Failed to set bw\n"); + ret = -EINVAL; + goto exit; + } + } + /* + * On targets where crypto clock is handled by HLOS, + * if clk_access_cnt is zero and perf_enabled is false, + * then the crypto clock was not enabled before sending cmd + * to tz, qseecom will enable the clock to avoid service failure. + */ + if (!qseecom.no_clock_support && + !qseecom.qsee.clk_access_cnt && !data->perf_enabled) { + pr_debug("ce clock is not enabled\n"); + ret = qseecom_perf_enable(data); + if (ret) { + pr_err("Failed to vote for clock with err %d\n", + ret); + ret = -EINVAL; + goto exit; + } + *perf_enabled = true; + } +exit: + return ret; +} + +static void __qseecom_bus_scaling_disable(struct qseecom_dev_handle *data, + bool perf_enabled) +{ + if (qseecom.support_bus_scaling) + __qseecom_add_bw_scale_down_timer( + QSEECOM_SEND_CMD_CRYPTO_TIMEOUT); + if (perf_enabled) { + qsee_disable_clock_vote(data, CLK_DFAB); + qsee_disable_clock_vote(data, CLK_SFPB); + } +} + long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) { int ret = 0; @@ -6287,50 +6913,14 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* Only one client allowed here at a time */ mutex_lock(&app_access_lock); - if (qseecom.support_bus_scaling) { - /* register bus bw in case the client doesn't do it */ - if (!data->mode) { - mutex_lock(&qsee_bw_mutex); - __qseecom_register_bus_bandwidth_needs( - data, HIGH); - mutex_unlock(&qsee_bw_mutex); - } - ret = qseecom_scale_bus_bandwidth_timer(INACTIVE); - if (ret) { - pr_err("Failed to set bw.\n"); - ret = -EINVAL; - mutex_unlock(&app_access_lock); - break; - } - } - /* - * On targets where crypto clock is handled by HLOS, - * if clk_access_cnt is zero and perf_enabled is false, - * then the crypto clock was not enabled before sending cmd - * to tz, qseecom will enable the clock to avoid service failure. - */ - if (!qseecom.no_clock_support && - !qseecom.qsee.clk_access_cnt && !data->perf_enabled) { - pr_debug("ce clock is not enabled!\n"); - ret = qseecom_perf_enable(data); - if (ret) { - pr_err("Failed to vote for clock with err %d\n", - ret); - mutex_unlock(&app_access_lock); - ret = -EINVAL; - break; - } - perf_enabled = true; + ret = __qseecom_bus_scaling_enable(data, &perf_enabled); + if (ret) { + mutex_unlock(&app_access_lock); + break; } atomic_inc(&data->ioctl_count); ret = qseecom_send_cmd(data, argp); - if (qseecom.support_bus_scaling) - __qseecom_add_bw_scale_down_timer( - QSEECOM_SEND_CMD_CRYPTO_TIMEOUT); - if (perf_enabled) { - qsee_disable_clock_vote(data, CLK_DFAB); - qsee_disable_clock_vote(data, CLK_SFPB); - } + __qseecom_bus_scaling_disable(data, perf_enabled); atomic_dec(&data->ioctl_count); wake_up_all(&data->abort_wq); mutex_unlock(&app_access_lock); @@ -6349,57 +6939,23 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* Only one client allowed here at a time */ mutex_lock(&app_access_lock); - if (qseecom.support_bus_scaling) { - if (!data->mode) { - mutex_lock(&qsee_bw_mutex); - __qseecom_register_bus_bandwidth_needs( - data, HIGH); - mutex_unlock(&qsee_bw_mutex); - } - ret = qseecom_scale_bus_bandwidth_timer(INACTIVE); - if (ret) { - pr_err("Failed to set bw.\n"); - mutex_unlock(&app_access_lock); - ret = -EINVAL; - break; - } - } - /* - * On targets where crypto clock is handled by HLOS, - * if clk_access_cnt is zero and perf_enabled is false, - * then the crypto clock was not enabled before sending cmd - * to tz, qseecom will enable the clock to avoid service failure. - */ - if (!qseecom.no_clock_support && - !qseecom.qsee.clk_access_cnt && !data->perf_enabled) { - pr_debug("ce clock is not enabled!\n"); - ret = qseecom_perf_enable(data); - if (ret) { - pr_err("Failed to vote for clock with err %d\n", - ret); - mutex_unlock(&app_access_lock); - ret = -EINVAL; - break; - } - perf_enabled = true; + ret = __qseecom_bus_scaling_enable(data, &perf_enabled); + if (ret) { + mutex_unlock(&app_access_lock); + break; } atomic_inc(&data->ioctl_count); if (cmd == QSEECOM_IOCTL_SEND_MODFD_CMD_REQ) ret = qseecom_send_modfd_cmd(data, argp); else ret = qseecom_send_modfd_cmd_64(data, argp); - if (qseecom.support_bus_scaling) - __qseecom_add_bw_scale_down_timer( - QSEECOM_SEND_CMD_CRYPTO_TIMEOUT); - if (perf_enabled) { - qsee_disable_clock_vote(data, CLK_DFAB); - qsee_disable_clock_vote(data, CLK_SFPB); - } + __qseecom_bus_scaling_disable(data, perf_enabled); atomic_dec(&data->ioctl_count); wake_up_all(&data->abort_wq); mutex_unlock(&app_access_lock); if (ret) pr_err("failed qseecom_send_cmd: %d\n", ret); + __qseecom_clean_data_sglistinfo(data); break; } case QSEECOM_IOCTL_RECEIVE_REQ: { @@ -6447,7 +7003,11 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) break; } pr_debug("SET_MEM_PARAM: qseecom addr = 0x%pK\n", data); + mutex_lock(&app_access_lock); + atomic_inc(&data->ioctl_count); ret = qseecom_set_client_mem_param(data, argp); + atomic_dec(&data->ioctl_count); + mutex_unlock(&app_access_lock); if (ret) pr_err("failed Qqseecom_set_mem_param request: %d\n", ret); @@ -6773,6 +7333,7 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) wake_up_all(&data->abort_wq); if (ret) pr_err("failed qseecom_send_mod_resp: %d\n", ret); + __qseecom_clean_data_sglistinfo(data); break; } case QSEECOM_QTEEC_IOCTL_OPEN_SESSION_REQ: { @@ -6790,13 +7351,20 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* Only one client allowed here at a time */ mutex_lock(&app_access_lock); + ret = __qseecom_bus_scaling_enable(data, &perf_enabled); + if (ret) { + mutex_unlock(&app_access_lock); + break; + } atomic_inc(&data->ioctl_count); ret = qseecom_qteec_open_session(data, argp); + __qseecom_bus_scaling_disable(data, perf_enabled); atomic_dec(&data->ioctl_count); wake_up_all(&data->abort_wq); mutex_unlock(&app_access_lock); if (ret) pr_err("failed open_session_cmd: %d\n", ret); + __qseecom_clean_data_sglistinfo(data); break; } case QSEECOM_QTEEC_IOCTL_CLOSE_SESSION_REQ: { @@ -6838,13 +7406,20 @@ long qseecom_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* Only one client allowed here at a time */ mutex_lock(&app_access_lock); + ret = __qseecom_bus_scaling_enable(data, &perf_enabled); + if (ret) { + mutex_unlock(&app_access_lock); + break; + } atomic_inc(&data->ioctl_count); ret = qseecom_qteec_invoke_modfd_cmd(data, argp); + __qseecom_bus_scaling_disable(data, perf_enabled); atomic_dec(&data->ioctl_count); wake_up_all(&data->abort_wq); mutex_unlock(&app_access_lock); if (ret) pr_err("failed Invoke cmd: %d\n", ret); + __qseecom_clean_data_sglistinfo(data); break; } case QSEECOM_QTEEC_IOCTL_REQUEST_CANCELLATION_REQ: { @@ -6920,7 +7495,6 @@ static int qseecom_open(struct inode *inode, struct file *file) data->mode = INACTIVE; init_waitqueue_head(&data->abort_wq); atomic_set(&data->ioctl_count, 0); - return ret; } @@ -7722,14 +8296,26 @@ static int qseecom_query_ce_info(struct qseecom_dev_handle *data, return ret; } +/* + * Check whitelist feature, and if TZ feature version is < 1.0.0, + * then whitelist feature is not supported. + */ +static int qseecom_check_whitelist_feature(void) +{ + int version = scm_get_feat_version(FEATURE_ID_WHITELIST); + + return version >= MAKE_WHITELIST_VERSION(1, 0, 0); +} + static int qseecom_probe(struct platform_device *pdev) { int rc; - int ret = 0; + int i; uint32_t feature = 10; struct device *class_dev; struct msm_bus_scale_pdata *qseecom_platform_support = NULL; struct qseecom_command_scm_resp resp; + struct qseecom_ce_info_use *pce_info_use = NULL; qseecom.qsee_bw_count = 0; qseecom.qsee_perf_client = 0; @@ -7754,6 +8340,7 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.app_block_ref_cnt = 0; init_waitqueue_head(&qseecom.app_block_wq); + qseecom.whitelist_support = true; rc = alloc_chrdev_region(&qseecom_device_no, 0, 1, QSEECOM_DEV); if (rc < 0) { @@ -7770,7 +8357,7 @@ static int qseecom_probe(struct platform_device *pdev) class_dev = device_create(driver_class, NULL, qseecom_device_no, NULL, QSEECOM_DEV); - if (!class_dev) { + if (IS_ERR(class_dev)) { pr_err("class_device_create failed %d\n", rc); rc = -ENOMEM; goto exit_destroy_class; @@ -7809,7 +8396,7 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.pdev = class_dev; /* Create ION msm client */ qseecom.ion_clnt = msm_ion_client_create("qseecom-kernel"); - if (qseecom.ion_clnt == NULL) { + if (IS_ERR_OR_NULL(qseecom.ion_clnt)) { pr_err("Ion client cannot be created\n"); rc = -ENOMEM; goto exit_del_cdev; @@ -7835,6 +8422,8 @@ static int qseecom_probe(struct platform_device *pdev) "qcom,commonlib64-loaded-by-uefi"); pr_debug("qseecom.commonlib64-loaded-by-uefi = 0x%x", qseecom.commonlib64_loaded); + qseecom.fde_key_size = of_property_read_bool((&pdev->dev)->of_node, + "qcom,fde-key-size"); qseecom.no_clock_support = of_property_read_bool((&pdev->dev)->of_node, "qcom,no-clock-support"); @@ -7871,14 +8460,14 @@ static int qseecom_probe(struct platform_device *pdev) pr_debug("CE operating frequency is not defined, setting to default 100MHZ\n"); qseecom.ce_opp_freq_hz = QSEE_CE_CLK_100MHZ; } - ret = __qseecom_init_clk(CLK_QSEE); - if (ret) + rc = __qseecom_init_clk(CLK_QSEE); + if (rc) goto exit_destroy_ion_client; if ((qseecom.qsee.instance != qseecom.ce_drv.instance) && (qseecom.support_pfe || qseecom.support_fde)) { - ret = __qseecom_init_clk(CLK_CE_DRV); - if (ret) { + rc = __qseecom_init_clk(CLK_CE_DRV); + if (rc) { __qseecom_deinit_clk(CLK_QSEE); goto exit_destroy_ion_client; } @@ -7932,9 +8521,14 @@ static int qseecom_probe(struct platform_device *pdev) } else { pr_err("Fail to get secure app region info\n"); rc = -EINVAL; - goto exit_destroy_ion_client; + goto exit_deinit_clock; + } + rc = __qseecom_enable_clk(CLK_QSEE); + if (rc) { + pr_err("CLK_QSEE enabling failed (%d)\n", rc); + rc = -EIO; + goto exit_deinit_clock; } - __qseecom_enable_clk(CLK_QSEE); rc = qseecom_scm_call(SCM_SVC_TZSCHEDULER, 1, cmd_buf, cmd_len, &resp, sizeof(resp)); @@ -7943,7 +8537,7 @@ static int qseecom_probe(struct platform_device *pdev) pr_err("send secapp reg fail %d resp.res %d\n", rc, resp.result); rc = -EINVAL; - goto exit_destroy_ion_client; + goto exit_deinit_clock; } } /* @@ -7969,13 +8563,38 @@ static int qseecom_probe(struct platform_device *pdev) qseecom.qsee_perf_client = msm_bus_scale_register_client( qseecom_platform_support); + qseecom.whitelist_support = qseecom_check_whitelist_feature(); + pr_warn("qseecom.whitelist_support = %d\n", + qseecom.whitelist_support); + if (!qseecom.qsee_perf_client) pr_err("Unable to register bus client\n"); atomic_set(&qseecom.qseecom_state, QSEECOM_STATE_READY); return 0; +exit_deinit_clock: + __qseecom_deinit_clk(CLK_QSEE); + if ((qseecom.qsee.instance != qseecom.ce_drv.instance) && + (qseecom.support_pfe || qseecom.support_fde)) + __qseecom_deinit_clk(CLK_CE_DRV); exit_destroy_ion_client: + if (qseecom.ce_info.fde) { + pce_info_use = qseecom.ce_info.fde; + for (i = 0; i < qseecom.ce_info.num_fde; i++) { + kzfree(pce_info_use->ce_pipe_entry); + pce_info_use++; + } + kfree(qseecom.ce_info.fde); + } + if (qseecom.ce_info.pfe) { + pce_info_use = qseecom.ce_info.pfe; + for (i = 0; i < qseecom.ce_info.num_pfe; i++) { + kzfree(pce_info_use->ce_pipe_entry); + pce_info_use++; + } + kfree(qseecom.ce_info.pfe); + } ion_client_destroy(qseecom.ion_clnt); exit_del_cdev: cdev_del(&qseecom.cdev); diff --git a/drivers/misc/uid_stat.c b/drivers/misc/uid_stat.c index 4766c1f83b94e..8e8b15c2bb2f7 100644 --- a/drivers/misc/uid_stat.c +++ b/drivers/misc/uid_stat.c @@ -67,7 +67,7 @@ static const struct file_operations uid_stat_read_atomic_int_fops = { .open = uid_stat_read_atomic_int_open, .read = seq_read, .llseek = seq_lseek, - .release = seq_release, + .release = single_release, }; /* Create a new entry for tracking the specified uid. */ diff --git a/drivers/mmc/Kconfig b/drivers/mmc/Kconfig index 91165514156ea..d437724f2243a 100644 --- a/drivers/mmc/Kconfig +++ b/drivers/mmc/Kconfig @@ -27,6 +27,14 @@ config MMC_PERF_PROFILING If you say Y here, support will be added for collecting performance numbers at the MMC Queue and Host layers. +config MMC_ERROR_STATUS + bool "MMC error status" + depends on MMC != n + default n + help + If you say Y here, user space query if eMMC driver has encountered any error or not. + WARNNING:Only SCM could open it. + if MMC source "drivers/mmc/core/Kconfig" diff --git a/drivers/mmc/card/block.c b/drivers/mmc/card/block.c index db111eb27474c..695f3664ce013 100644 --- a/drivers/mmc/card/block.c +++ b/drivers/mmc/card/block.c @@ -3,6 +3,7 @@ * * Copyright 2002 Hewlett-Packard Company * Copyright 2005-2008 Pierre Ossman + * Copyright (C) 2018 XiaoMi, Inc. * * Use consistent with the GNU GPL is permitted, * provided that this copyright notice is @@ -620,6 +621,15 @@ static int mmc_blk_ioctl_cmd(struct block_device *bdev, idata = mmc_blk_ioctl_copy_from_user(ic_ptr); if (IS_ERR_OR_NULL(idata)) return PTR_ERR(idata); + if (idata->ic.postsleep_max_us < idata->ic.postsleep_min_us) { + pr_err("%s: min value: %u must not be greater than max value: %u\n", + __func__, idata->ic.postsleep_min_us, + idata->ic.postsleep_max_us); + WARN_ON(1); + err = -EPERM; + goto cmd_err; + } + md = mmc_blk_get(bdev->bd_disk); if (!md) { err = -EINVAL; @@ -3124,15 +3134,23 @@ static void mmc_blk_cmdq_err(struct mmc_queue *mq) /* RED error - Fatal: requires reset */ if (mrq->cmdq_req->resp_err) { err = mrq->cmdq_req->resp_err; + goto reset; + } + + /* + * TIMEOUT errrors can happen because of execution error + * in the last command. So send cmd 13 to get device status + */ + if ((mrq->cmd && (mrq->cmd->error == -ETIMEDOUT)) || + (mrq->data && (mrq->data->error == -ETIMEDOUT))) { if (mmc_host_halt(host) || mmc_host_cq_disable(host)) { ret = get_card_status(host->card, &status, 0); if (ret) pr_err("%s: CMD13 failed with err %d\n", mmc_hostname(host), ret); } - pr_err("%s: Response error detected with device status 0x%08x\n", + pr_err("%s: Timeout error detected with device status 0x%08x\n", mmc_hostname(host), status); - goto reset; } /* @@ -3443,6 +3461,7 @@ static inline int mmc_blk_cmdq_part_switch(struct mmc_card *card, struct mmc_host *host = card->host; struct mmc_cmdq_context_info *ctx = &host->cmdq_ctx; u8 part_config = card->ext_csd.part_config; + int ret = 0, err = 0; if ((main_md->part_curr == md->part_type) && (card->part_curr == md->part_type)) @@ -3452,48 +3471,74 @@ static inline int mmc_blk_cmdq_part_switch(struct mmc_card *card, card->ext_csd.cmdq_support && (md->flags & MMC_BLK_CMD_QUEUE))); - if (!test_bit(CMDQ_STATE_HALT, &ctx->curr_state)) - WARN_ON(mmc_cmdq_halt(host, true)); + if (!test_bit(CMDQ_STATE_HALT, &ctx->curr_state)) { + ret = mmc_cmdq_halt(host, true); + if (ret) { + pr_err("%s: %s: halt: failed: %d\n", + mmc_hostname(host), __func__, ret); + goto out; + } + } /* disable CQ mode in card */ if (mmc_card_cmdq(card)) { - WARN_ON(mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, + ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_CMDQ, 0, - card->ext_csd.generic_cmd6_time)); + card->ext_csd.generic_cmd6_time); + if (ret) { + pr_err("%s: %s: cmdq mode disable failed %d\n", + mmc_hostname(host), __func__, ret); + goto cmdq_unhalt; + } mmc_card_clr_cmdq(card); } part_config &= ~EXT_CSD_PART_CONFIG_ACC_MASK; part_config |= md->part_type; - WARN_ON(mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, + ret = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_PART_CONFIG, part_config, - card->ext_csd.part_time)); + card->ext_csd.part_time); + if (ret) { + pr_err("%s: %s: mmc_switch failure, %d -> %d , err = %d\n", + mmc_hostname(host), __func__, main_md->part_curr, + md->part_type, ret); + goto cmdq_switch; + } card->ext_csd.part_config = part_config; card->part_curr = md->part_type; main_md->part_curr = md->part_type; - WARN_ON(mmc_blk_cmdq_switch(card, md, true)); - WARN_ON(mmc_cmdq_halt(host, false)); - - return 0; +cmdq_switch: + err = mmc_blk_cmdq_switch(card, md, true); + if (err) { + pr_err("%s: %s: mmc_blk_cmdq_switch failed: %d\n", + mmc_hostname(host), __func__, err); + ret = err; + } +cmdq_unhalt: + err = mmc_cmdq_halt(host, false); + if (err) { + pr_err("%s: %s: unhalt: failed: %d\n", + mmc_hostname(host), __func__, err); + ret = err; + } +out: + return ret; } static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req) { - int ret; + int ret, err = 0; struct mmc_blk_data *md = mq->data; struct mmc_card *card = md->queue.card; + struct mmc_host *host = card->host; unsigned int cmd_flags = req ? req->cmd_flags : 0; mmc_get_card(card); -#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME - if (mmc_bus_needs_resume(card->host)) - mmc_resume_bus(card->host); -#endif if (!card->host->cmdq_ctx.active_reqs && mmc_card_doing_bkops(card)) { ret = mmc_cmdq_halt(card->host, true); if (ret) @@ -3511,9 +3556,20 @@ static int mmc_blk_cmdq_issue_rq(struct mmc_queue *mq, struct request *req) ret = mmc_blk_cmdq_part_switch(card, md); if (ret) { - pr_err("%s: %s: partition switch failed %d\n", + pr_err("%s: %s: partition switch failed %d, resetting cmdq\n", md->disk->disk_name, __func__, ret); - goto out; + + mmc_blk_cmdq_reset(host, false); + err = mmc_blk_cmdq_part_switch(card, md); + if (!err) { + pr_err("%s: %s: partition switch success err = %d\n", + md->disk->disk_name, __func__, err); + } else { + pr_err("%s: %s: partition switch failed err = %d\n", + md->disk->disk_name, __func__, err); + ret = 0; + goto out; + } } if (req) { @@ -3580,10 +3636,6 @@ static int mmc_blk_issue_rq(struct mmc_queue *mq, struct request *req) /* claim host only for the first request */ mmc_get_card(card); -#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME - if (mmc_bus_needs_resume(card->host)) - mmc_resume_bus(card->host); -#endif if (mmc_card_doing_bkops(host->card)) { ret = mmc_stop_bkops(host->card); if (ret) @@ -3707,7 +3759,7 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, INIT_LIST_HEAD(&md->part); md->usage = 1; - ret = mmc_init_queue(&md->queue, card, &md->lock, subname, area_type); + ret = mmc_init_queue(&md->queue, card, NULL, subname, area_type); if (ret) goto err_putdisk; @@ -4004,6 +4056,10 @@ static const struct mmc_fixup blk_fixups[] = MMC_FIXUP("SEM32G", CID_MANFID_SANDISK, 0x100, add_quirk, MMC_QUIRK_INAND_CMD38), + MMC_FIXUP(CID_NAME_ANY, CID_MANFID_ANY, CID_OEMID_ANY, + add_quirk_mmc, MMC_QUIRK_BROKEN_CLK_GATING), + + /* * Some MMC cards experience performance degradation with CMD23 * instead of CMD12-bounded multiblock transfers. For now we'll @@ -4090,6 +4146,11 @@ static const struct mmc_fixup blk_fixups[] = MMC_FIXUP("VZL00M", CID_MANFID_SAMSUNG, CID_OEMID_ANY, add_quirk_mmc, MMC_QUIRK_SEC_ERASE_TRIM_BROKEN), + MMC_FIXUP("Q3J96R", CID_MANFID_MICRON, CID_OEMID_ANY, add_quirk_mmc, + MMC_QUIRK_BROKEN_CLK_GATING), + + MMC_FIXUP("Q3J97V", CID_MANFID_MICRON, CID_OEMID_ANY, add_quirk_mmc, + MMC_QUIRK_BROKEN_CLK_GATING), END_FIXUP }; @@ -4106,6 +4167,10 @@ static int mmc_blk_probe(struct mmc_card *card) mmc_fixup_device(card, blk_fixups); + if (mmc_card_mmc(card)) { + pr_info("card->quirks = 0x%x\n", card->quirks); + } + md = mmc_blk_alloc(card); if (IS_ERR(md)) return PTR_ERR(md); diff --git a/drivers/mmc/card/queue.c b/drivers/mmc/card/queue.c index f3ac99d7b7ebd..49ea792094f0c 100644 --- a/drivers/mmc/card/queue.c +++ b/drivers/mmc/card/queue.c @@ -3,6 +3,7 @@ * * Copyright (C) 2003 Russell King, All Rights Reserved. * Copyright 2006-2007 Pierre Ossman + * Copyright (C) 2018 XiaoMi, 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 @@ -127,14 +128,11 @@ static int mmc_cmdq_thread(void *d) ret = mq->cmdq_issue_fn(mq, mq->cmdq_req_peeked); /* - * Don't requeue if issue_fn fails, just bug on. - * We don't expect failure here and there is no recovery other - * than fixing the actual issue if there is any. + * Don't requeue if issue_fn fails. + * Recovery will be come by completion softirq * Also we end the request if there is a partition switch error, * so we should not requeue the request here. */ - if (ret) - BUG_ON(1); } /* loop */ return 0; @@ -718,15 +716,13 @@ int mmc_queue_suspend(struct mmc_queue *mq, int wait) if (wait) { /* - * After blk_stop_queue is called, wait for all + * After blk_cleanup_queue is called, wait for all * active_reqs to complete. * Then wait for cmdq thread to exit before calling * cmdq shutdown to avoid race between issuing * requests and shutdown of cmdq. */ - spin_lock_irqsave(q->queue_lock, flags); - blk_stop_queue(q); - spin_unlock_irqrestore(q->queue_lock, flags); + blk_cleanup_queue(q); if (host->cmdq_ctx.active_reqs) wait_for_completion( @@ -751,10 +747,15 @@ int mmc_queue_suspend(struct mmc_queue *mq, int wait) } if (!(test_and_set_bit(MMC_QUEUE_SUSPENDED, &mq->flags))) { - spin_lock_irqsave(q->queue_lock, flags); - blk_stop_queue(q); - spin_unlock_irqrestore(q->queue_lock, flags); - + if (!wait) { + /* suspend/stop the queue in case of suspend */ + spin_lock_irqsave(q->queue_lock, flags); + blk_stop_queue(q); + spin_unlock_irqrestore(q->queue_lock, flags); + } else { + /* shutdown the queue in case of shutdown/reboot */ + blk_cleanup_queue(q); + } rc = down_trylock(&mq->thread_sem); if (rc && !wait) { /* diff --git a/drivers/mmc/core/Kconfig b/drivers/mmc/core/Kconfig index f771bc3496a4a..61222fb07da5e 100644 --- a/drivers/mmc/core/Kconfig +++ b/drivers/mmc/core/Kconfig @@ -12,6 +12,17 @@ config MMC_CLKGATE If unsure, say N. +config MMC_RING_BUFFER + bool "MMC_RING_BUFFER" + depends on MMC + default n + help + This enables the ring buffer tracing of significant + events for mmc driver to provide command history for + debugging purpose. + + If unsure, say N. + config MMC_EMBEDDED_SDIO boolean "MMC embedded SDIO device support (EXPERIMENTAL)" help diff --git a/drivers/mmc/core/Makefile b/drivers/mmc/core/Makefile index 38ed210ce2f3b..84c7ceac50de0 100644 --- a/drivers/mmc/core/Makefile +++ b/drivers/mmc/core/Makefile @@ -10,3 +10,4 @@ mmc_core-y := core.o bus.o host.o \ quirks.o slot-gpio.o mmc_core-$(CONFIG_DEBUG_FS) += debugfs.o +obj-$(CONFIG_MMC_RING_BUFFER) += ring_buffer.o diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index 99c1d17a8b127..2f83e90bd50f2 100644 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c @@ -169,6 +169,20 @@ static int mmc_bus_suspend(struct device *dev) if (mmc_bus_needs_resume(host)) return 0; ret = host->bus_ops->suspend(host); + + /* + * bus_ops->suspend may fail due to some reason + * In such cases if we return error to PM framework + * from here without calling drv->resume then mmc + * request may get stuck since PM framework will assume + * that mmc bus is not suspended (because of error) and + * it won't call resume again. + * + * So in case of error call drv->resume. + */ + if (ret && dev->driver && drv->resume) + drv->resume(card); + return ret; } diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c index b07abf8661705..3cfac0311c370 100644 --- a/drivers/mmc/core/core.c +++ b/drivers/mmc/core/core.c @@ -464,6 +464,10 @@ static int mmc_devfreq_set_target(struct device *dev, struct mmc_devfeq_clk_scaling *clk_scaling; int err = 0; int abort; + unsigned long pflags = current->flags; + + /* Ensure scaling would happen even in memory pressure conditions */ + current->flags |= PF_MEMALLOC; if (!(host && freq)) { pr_err("%s: unexpected host/freq parameter\n", __func__); @@ -522,6 +526,7 @@ static int mmc_devfreq_set_target(struct device *dev, mmc_host_clk_release(host); mmc_release_host(host); out: + tsk_restore_flags(current, pflags, PF_MEMALLOC); return err; } @@ -1583,7 +1588,6 @@ struct mmc_async_req *mmc_start_req(struct mmc_host *host, struct mmc_async_req *areq, int *error) { int err = 0; - int start_err = 0; struct mmc_async_req *data = host->areq; /* Prepare a new request */ @@ -1615,7 +1619,7 @@ struct mmc_async_req *mmc_start_req(struct mmc_host *host, trace_mmc_blk_rw_start(areq->mrq->cmd->opcode, areq->mrq->cmd->arg, areq->mrq->data); - start_err = __mmc_start_data_req(host, areq->mrq); + __mmc_start_data_req(host, areq->mrq); } if (host->areq) @@ -1646,10 +1650,6 @@ EXPORT_SYMBOL(mmc_start_req); */ void mmc_wait_for_req(struct mmc_host *host, struct mmc_request *mrq) { -#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME - if (mmc_bus_needs_resume(host)) - mmc_resume_bus(host); -#endif __mmc_start_req(host, mrq); mmc_wait_for_req_done(host, mrq); } @@ -2046,6 +2046,10 @@ void mmc_get_card(struct mmc_card *card) { pm_runtime_get_sync(&card->dev); mmc_claim_host(card->host); +#ifdef CONFIG_MMC_BLOCK_DEFERRED_RESUME + if (mmc_bus_needs_resume(card->host)) + mmc_resume_bus(card->host); +#endif } EXPORT_SYMBOL(mmc_get_card); @@ -2185,6 +2189,30 @@ void mmc_set_ungated(struct mmc_host *host) } #endif +int mmc_execute_tuning(struct mmc_card *card) +{ + struct mmc_host *host = card->host; + u32 opcode; + int err; + + if (!host->ops->execute_tuning) + return 0; + + if (mmc_card_mmc(card)) + opcode = MMC_SEND_TUNING_BLOCK_HS200; + else + opcode = MMC_SEND_TUNING_BLOCK; + + mmc_host_clk_hold(host); + err = host->ops->execute_tuning(host, opcode); + mmc_host_clk_release(host); + + if (err) + pr_err("%s: tuning execution failed\n", mmc_hostname(host)); + + return err; +} + /* * Change the bus mode (open drain/push-pull) of a host. */ @@ -2871,6 +2899,13 @@ static void _mmc_detect_change(struct mmc_host *host, unsigned long delay, pm_wakeup_event(mmc_dev(host), 5000); host->detect_change = 1; + /* + * Change in cd_gpio state, so make sure detection part is + * not overided because of manual resume. + */ + if (cd_irq && mmc_bus_manual_resume(host)) + host->ignore_bus_resume_flags = true; + mmc_schedule_delayed_work(&host->detect, delay); } @@ -3791,7 +3826,8 @@ void mmc_rescan(struct work_struct *work) host->bus_ops->detect(host); host->detect_change = 0; - + if (host->ignore_bus_resume_flags) + host->ignore_bus_resume_flags = false; /* * Let mmc_bus_put() free the bus/bus_ops if we've found that * the card is no longer present. @@ -4044,7 +4080,8 @@ int mmc_pm_notify(struct notifier_block *notify_block, spin_lock_irqsave(&host->lock, flags); host->rescan_disable = 0; - if (mmc_bus_manual_resume(host)) { + if (mmc_bus_manual_resume(host) && + !host->ignore_bus_resume_flags) { spin_unlock_irqrestore(&host->lock, flags); break; } diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h index 49953c8e27b71..4fc7621e1eb3c 100644 --- a/drivers/mmc/core/core.h +++ b/drivers/mmc/core/core.h @@ -72,6 +72,8 @@ void mmc_remove_card_debugfs(struct mmc_card *card); void mmc_init_context_info(struct mmc_host *host); +int mmc_execute_tuning(struct mmc_card *card); + extern bool mmc_can_scale_clk(struct mmc_host *host); extern int mmc_init_clk_scaling(struct mmc_host *host); extern int mmc_suspend_clk_scaling(struct mmc_host *host); diff --git a/drivers/mmc/core/debugfs.c b/drivers/mmc/core/debugfs.c index 03b0c7ee9561e..8229fb22d5363 100644 --- a/drivers/mmc/core/debugfs.c +++ b/drivers/mmc/core/debugfs.c @@ -2,6 +2,7 @@ * Debugfs support for hosts and cards * * Copyright (C) 2008 Atmel Corporation + * Copyright (C) 2018 XiaoMi, 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 @@ -32,6 +33,26 @@ module_param(fail_request, charp, 0); #endif /* CONFIG_FAIL_MMC_REQUEST */ /* The debugfs functions are optimized away when CONFIG_DEBUG_FS isn't set. */ +static int mmc_ring_buffer_show(struct seq_file *s, void *data) +{ + struct mmc_host *mmc = s->private; + + mmc_dump_trace_buffer(mmc, s); + return 0; +} + +static int mmc_ring_buffer_open(struct inode *inode, struct file *file) +{ + return single_open(file, mmc_ring_buffer_show, inode->i_private); +} + +static const struct file_operations mmc_ring_buffer_fops = { + .open = mmc_ring_buffer_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + static int mmc_ios_show(struct seq_file *s, void *data) { static const char *vdd_str[] = { @@ -302,6 +323,34 @@ static int mmc_force_err_set(void *data, u64 val) } DEFINE_SIMPLE_ATTRIBUTE(mmc_force_err_fops, NULL, mmc_force_err_set, "%llu\n"); +#ifdef CONFIG_MMC_ERROR_STATUS +static int mmc_err_state_get(void *data, u64 *val) +{ + struct mmc_host *host = data; + + if (!host) + return -EINVAL; + + *val = host->err_occurred ? 1 : 0; + + return 0; +} + +static int mmc_err_state_clear(void *data, u64 val) +{ + struct mmc_host *host = data; + + if (!host) + return -EINVAL; + + host->err_occurred = false; + + return 0; +} + +DEFINE_SIMPLE_ATTRIBUTE(mmc_err_state, mmc_err_state_get, + mmc_err_state_clear, "%llu\n"); +#endif void mmc_add_host_debugfs(struct mmc_host *host) { @@ -343,6 +392,16 @@ void mmc_add_host_debugfs(struct mmc_host *host) &host->cmdq_thist_enabled)) goto err_node; +#ifdef CONFIG_MMC_RING_BUFFER + if (!debugfs_create_file("ring_buffer", S_IRUSR, + root, host, &mmc_ring_buffer_fops)) + goto err_node; +#endif +#ifdef CONFIG_MMC_ERROR_STATUS + if (!debugfs_create_file("err_state", S_IRUSR | S_IWUSR, root, host, + &mmc_err_state)) + goto err_node; +#endif #ifdef CONFIG_MMC_CLKGATE if (!debugfs_create_u32("clk_delay", (S_IRUSR | S_IWUSR), root, &host->clk_delay)) @@ -735,6 +794,9 @@ static ssize_t mmc_bkops_stats_write(struct file *filp, if (!card) return cnt; + if (!access_ok(VERIFY_READ, ubuf, cnt)) + return cnt; + stats = &card->bkops.stats; err = kstrtoint_from_user(ubuf, cnt, 0, &value); diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index fc96c9a9ec062..ccaffd2b7ebd8 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -26,6 +26,8 @@ #include #include +#include + #include #include "core.h" @@ -787,6 +789,7 @@ int mmc_add_host(struct mmc_host *host) mmc_add_host_debugfs(host); #endif mmc_host_clk_sysfs_init(host); + mmc_trace_init(host); err = sysfs_create_group(&host->class_dev.kobj, &clk_scaling_attr_grp); if (err) diff --git a/drivers/mmc/core/mmc.c b/drivers/mmc/core/mmc.c index 13ff833012167..c111a2f182223 100644 --- a/drivers/mmc/core/mmc.c +++ b/drivers/mmc/core/mmc.c @@ -4,6 +4,7 @@ * Copyright (C) 2003-2004 Russell King, All Rights Reserved. * Copyright (C) 2005-2007 Pierre Ossman, All Rights Reserved. * MMCv4 support Copyright (C) 2006 Philip Langdale, All Rights Reserved. + * Copyright (C) 2018 XiaoMi, 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 @@ -660,6 +661,8 @@ static int mmc_read_ext_csd(struct mmc_card *card, u8 *ext_csd) ext_csd[EXT_CSD_MAX_PACKED_WRITES]; card->ext_csd.max_packed_reads = ext_csd[EXT_CSD_MAX_PACKED_READS]; + card->ext_csd.life_time_est_typ_a = ext_csd[EXT_CSD_LIFE_TIME_EST_TYP_A]; + card->ext_csd.life_time_est_typ_b = ext_csd[EXT_CSD_LIFE_TIME_EST_TYP_B]; } else { card->ext_csd.data_sector_size = 512; } @@ -808,11 +811,13 @@ MMC_DEV_ATTR(serial, "0x%08x\n", card->cid.serial); MMC_DEV_ATTR(enhanced_area_offset, "%llu\n", card->ext_csd.enhanced_area_offset); MMC_DEV_ATTR(enhanced_area_size, "%u\n", card->ext_csd.enhanced_area_size); +MMC_DEV_ATTR(life_time_est_typ_a, "%u\n", card->ext_csd.life_time_est_typ_a); +MMC_DEV_ATTR(life_time_est_typ_b, "%u\n", card->ext_csd.life_time_est_typ_b); MMC_DEV_ATTR(raw_rpmb_size_mult, "%#x\n", card->ext_csd.raw_rpmb_size_mult); MMC_DEV_ATTR(enhanced_rpmb_supported, "%#x\n", card->ext_csd.enhanced_rpmb_supported); MMC_DEV_ATTR(rel_sectors, "%#x\n", card->ext_csd.rel_sectors); - +MMC_DEV_ATTR(fw_version, "%#x\n", card->ext_csd.fw_version); static struct attribute *mmc_std_attrs[] = { &dev_attr_cid.attr, &dev_attr_csd.attr, @@ -828,9 +833,12 @@ static struct attribute *mmc_std_attrs[] = { &dev_attr_serial.attr, &dev_attr_enhanced_area_offset.attr, &dev_attr_enhanced_area_size.attr, + &dev_attr_life_time_est_typ_a.attr, + &dev_attr_life_time_est_typ_b.attr, &dev_attr_raw_rpmb_size_mult.attr, &dev_attr_enhanced_rpmb_supported.attr, &dev_attr_rel_sectors.attr, + &dev_attr_fw_version.attr, NULL, }; ATTRIBUTE_GROUPS(mmc_std); @@ -1046,9 +1054,11 @@ static int mmc_select_hs(struct mmc_card *card) err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, card->ext_csd.generic_cmd6_time, - true, true, true); - if (!err) + true, false, true); + if (!err) { mmc_set_timing(card->host, MMC_TIMING_MMC_HS); + err = mmc_switch_status(card, false); + } return err; } @@ -1072,10 +1082,11 @@ static int mmc_select_hs_ddr(struct mmc_card *card) ext_csd_bits = (bus_width == MMC_BUS_WIDTH_8) ? EXT_CSD_DDR_BUS_WIDTH_8 : EXT_CSD_DDR_BUS_WIDTH_4; - err = mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, + err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_BUS_WIDTH, ext_csd_bits, - card->ext_csd.generic_cmd6_time); + card->ext_csd.generic_cmd6_time, + true, false, false); if (err) { pr_warn("%s: switch to bus width %d ddr failed\n", mmc_hostname(host), 1 << bus_width); @@ -1118,8 +1129,10 @@ static int mmc_select_hs_ddr(struct mmc_card *card) if (err) err = __mmc_set_signal_voltage(host, MMC_SIGNAL_VOLTAGE_330); - if (!err) + if (!err) { mmc_set_timing(host, MMC_TIMING_MMC_DDR52); + err = mmc_switch_status(card, false); + } return err; } @@ -1160,19 +1173,23 @@ static int mmc_select_hs400(struct mmc_card *card) * Before switching to dual data rate operation for HS400, * it is required to convert from HS200 mode to HS mode. */ - mmc_set_timing(card->host, MMC_TIMING_MMC_HS); - mmc_set_bus_speed(card); - err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS, card->ext_csd.generic_cmd6_time, - true, true, true); + true, false, true); if (err) { pr_warn("%s: switch to high-speed from hs200 failed, err:%d\n", mmc_hostname(host), err); return err; } + mmc_set_timing(card->host, MMC_TIMING_MMC_HS); + mmc_set_bus_speed(card); + + err = mmc_switch_status(card, false); + if (err) + goto out_err; + val = EXT_CSD_DDR_BUS_WIDTH_8; if (card->ext_csd.strobe_support) { err = mmc_select_bus_width(card); @@ -1193,7 +1210,7 @@ static int mmc_select_hs400(struct mmc_card *card) err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS400, card->ext_csd.generic_cmd6_time, - true, true, true); + true, false, true); if (err) { pr_warn("%s: switch to hs400 failed, err:%d\n", mmc_hostname(host), err); @@ -1219,6 +1236,17 @@ static int mmc_select_hs400(struct mmc_card *card) mmc_hostname(host)); } + /* + * Sending of CMD13 should be done after the host calibration + * for enhanced_strobe or HS400 mode is completed. + * Otherwise may see CMD13 timeouts or CRC errors. + */ + err = mmc_switch_status(card, false); + +out_err: + if (err) + pr_err("%s: %s failed, error %d\n", mmc_hostname(card->host), + __func__, err); return err; } @@ -1253,9 +1281,17 @@ static int mmc_select_hs200(struct mmc_card *card) err = __mmc_switch(card, EXT_CSD_CMD_SET_NORMAL, EXT_CSD_HS_TIMING, EXT_CSD_TIMING_HS200, card->ext_csd.generic_cmd6_time, - true, true, true); - if (!err) + true, false, true); + if (!err) { mmc_set_timing(host, MMC_TIMING_MMC_HS200); + /* + * Since after switching to hs200, crc errors might + * occur for commands send before tuning. + * So ignore crc error for cmd13. + */ + err = mmc_switch_status(card, true); + + } } err: return err; @@ -1351,7 +1387,6 @@ EXPORT_SYMBOL(tuning_blk_pattern_8bit); static int mmc_hs200_tuning(struct mmc_card *card) { struct mmc_host *host = card->host; - int err = 0; /* * Timing should be adjusted to the HS400 target @@ -1361,18 +1396,7 @@ static int mmc_hs200_tuning(struct mmc_card *card) host->ios.bus_width == MMC_BUS_WIDTH_8) mmc_set_timing(host, MMC_TIMING_MMC_HS400); - if (host->ops->execute_tuning) { - mmc_host_clk_hold(host); - err = host->ops->execute_tuning(host, - MMC_SEND_TUNING_BLOCK_HS200); - mmc_host_clk_release(host); - - if (err) - pr_warn("%s: tuning execution failed\n", - mmc_hostname(host)); - } - - return err; + return mmc_execute_tuning(card); } static int mmc_select_cmdq(struct mmc_card *card) @@ -2342,7 +2366,7 @@ static int mmc_test_awake_ext_csd(struct mmc_host *host) static int _mmc_suspend(struct mmc_host *host, bool is_suspend) { - int err = 0; + int err = 0, ret; BUG_ON(!host); BUG_ON(!host->card); @@ -2351,7 +2375,9 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend) if (err) { pr_err("%s: %s: fail to suspend clock scaling (%d)\n", mmc_hostname(host), __func__, err); - goto out; + if (host->card->cmdq_init) + wake_up(&host->cmdq_ctx.wait); + return err; } mmc_claim_host(host); @@ -2375,18 +2401,12 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend) if (mmc_card_doing_bkops(host->card)) { err = mmc_stop_bkops(host->card); if (err) - goto out; - } - - if (mmc_card_doing_auto_bkops(host->card)) { - err = mmc_set_auto_bkops(host->card, false); - if (err) - goto out; + goto out_err; } err = mmc_flush_cache(host->card); if (err) - goto out; + goto out_err; if (mmc_can_sleepawake(host)) { /* @@ -2403,16 +2423,38 @@ static int _mmc_suspend(struct mmc_host *host, bool is_suspend) err = mmc_deselect_cards(host); } - if (!err) { - mmc_power_off(host); - mmc_card_set_suspended(host->card); + if (err) + goto out_err; + mmc_power_off(host); + mmc_card_set_suspended(host->card); + + goto out; + +out_err: + /* + * In case of err let's put controller back in cmdq mode and unhalt + * the controller. + * We expect cmdq_enable and unhalt won't return any error + * since it is anyway enabling few registers. + */ + if (host->card->cmdq_init) { + mmc_host_clk_hold(host); + ret = host->cmdq_ops->enable(host); + if (ret) + pr_err("%s: %s: enabling CMDQ mode failed (%d)\n", + mmc_hostname(host), __func__, ret); + mmc_host_clk_release(host); + mmc_cmdq_halt(host, false); } + out: /* Kick CMDQ thread to process any requests came in while suspending */ if (host->card->cmdq_init) wake_up(&host->cmdq_ctx.wait); mmc_release_host(host); + if (err) + mmc_resume_clk_scaling(host); return err; } @@ -2463,9 +2505,6 @@ static int mmc_partial_init(struct mmc_host *host) pr_debug("%s: %s: reading and comparing ext_csd successful\n", mmc_hostname(host), __func__); - if (mmc_card_support_auto_bkops(host->card)) - (void)mmc_set_auto_bkops(host->card, true); - if (card->ext_csd.cmdq_support && (card->host->caps2 & MMC_CAP2_CMD_QUEUE)) { err = mmc_select_cmdq(card); @@ -2492,6 +2531,7 @@ static int mmc_suspend(struct mmc_host *host) int err; ktime_t start = ktime_get(); + MMC_TRACE(host, "%s: Enter\n", __func__); err = _mmc_suspend(host, true); if (!err) { pm_runtime_disable(&host->card->dev); @@ -2500,6 +2540,7 @@ static int mmc_suspend(struct mmc_host *host) trace_mmc_suspend(mmc_hostname(host), err, ktime_to_us(ktime_sub(ktime_get(), start))); + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; } @@ -2575,6 +2616,7 @@ static int mmc_resume(struct mmc_host *host) int err = 0; ktime_t start = ktime_get(); + MMC_TRACE(host, "%s: Enter\n", __func__); if (!(host->caps & MMC_CAP_RUNTIME_RESUME)) { err = _mmc_resume(host); pm_runtime_set_active(&host->card->dev); @@ -2584,7 +2626,7 @@ static int mmc_resume(struct mmc_host *host) trace_mmc_resume(mmc_hostname(host), err, ktime_to_us(ktime_sub(ktime_get(), start))); - + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; } @@ -2713,6 +2755,11 @@ static int mmc_power_restore(struct mmc_host *host) } ret = mmc_init_card(host, host->card->ocr, host->card); + if (ret) { + pr_err("%s: %s: mmc_init_card failed (%d)\n", + mmc_hostname(host), __func__, ret); + return ret; + } ret = mmc_resume_clk_scaling(host); if (ret) diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c index 52340abf9f98c..bd4ece00dfbfe 100644 --- a/drivers/mmc/core/mmc_ops.c +++ b/drivers/mmc/core/mmc_ops.c @@ -57,6 +57,33 @@ int mmc_send_status(struct mmc_card *card, u32 *status) return __mmc_send_status(card, status, false); } +static int mmc_switch_status_error(struct mmc_host *host, u32 status) +{ + if (mmc_host_is_spi(host)) { + if (status & R1_SPI_ILLEGAL_COMMAND) + return -EBADMSG; + } else { + if (status & 0xFDFFA000) + pr_warn("%s: unexpected status %#x after switch\n", + mmc_hostname(host), status); + if (status & R1_SWITCH_ERROR) + return -EBADMSG; + } + return 0; +} + +int mmc_switch_status(struct mmc_card *card, bool ignore_crc) +{ + u32 status; + int err; + + err = __mmc_send_status(card, &status, ignore_crc); + if (err) + return err; + + return mmc_switch_status_error(card->host, status); +} + static int _mmc_select_card(struct mmc_host *host, struct mmc_card *card) { int err; @@ -564,18 +591,9 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value, } } while (R1_CURRENT_STATE(status) == R1_STATE_PRG); - if (mmc_host_is_spi(host)) { - if (status & R1_SPI_ILLEGAL_COMMAND) - return -EBADMSG; - } else { - if (status & 0xFDFFA000) - pr_warn("%s: unexpected status %#x after switch\n", - mmc_hostname(host), status); - if (status & R1_SWITCH_ERROR) - return -EBADMSG; - } + err = mmc_switch_status_error(host, status); - return 0; + return err; } EXPORT_SYMBOL_GPL(__mmc_switch); diff --git a/drivers/mmc/core/mmc_ops.h b/drivers/mmc/core/mmc_ops.h index b3f6df521c6de..4eb52c88ec4ab 100644 --- a/drivers/mmc/core/mmc_ops.h +++ b/drivers/mmc/core/mmc_ops.h @@ -29,6 +29,7 @@ int mmc_bus_test(struct mmc_card *card, u8 bus_width); int mmc_send_hpi_cmd(struct mmc_card *card, u32 *status); int mmc_can_ext_csd(struct mmc_card *card); int mmc_discard_queue(struct mmc_host *host, u32 tasks); +int mmc_switch_status(struct mmc_card *card, bool ignore_crc); #endif diff --git a/drivers/mmc/core/ring_buffer.c b/drivers/mmc/core/ring_buffer.c new file mode 100644 index 0000000000000..55b820de2722f --- /dev/null +++ b/drivers/mmc/core/ring_buffer.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2016, 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 +#include + +void mmc_stop_tracing(struct mmc_host *mmc) +{ + mmc->trace_buf.stop_tracing = true; +} + +void mmc_trace_write(struct mmc_host *mmc, + const char *fmt, ...) +{ + unsigned int idx; + va_list args; + char *event; + unsigned long flags; + char str[MMC_TRACE_EVENT_SZ]; + + if (unlikely(!mmc->trace_buf.data) || + unlikely(mmc->trace_buf.stop_tracing)) + return; + + /* + * Here an increment and modulus is used to keep + * index within array bounds. The cast to unsigned is + * necessary so increment and rolover wraps to 0 correctly + */ + spin_lock_irqsave(&mmc->trace_buf.trace_lock, flags); + mmc->trace_buf.wr_idx += 1; + idx = ((unsigned int)mmc->trace_buf.wr_idx) & + (MMC_TRACE_RBUF_NUM_EVENTS - 1); + spin_unlock_irqrestore(&mmc->trace_buf.trace_lock, flags); + + /* Catch some unlikely machine specific wrap-around bug */ + if (unlikely(idx > (MMC_TRACE_RBUF_NUM_EVENTS - 1))) { + pr_err("%s: %s: Invalid idx:%d for mmc trace, tracing stopped !\n", + mmc_hostname(mmc), __func__, idx); + mmc_stop_tracing(mmc); + return; + } + + event = &mmc->trace_buf.data[idx * MMC_TRACE_EVENT_SZ]; + va_start(args, fmt); + snprintf(str, MMC_TRACE_EVENT_SZ, "<%d> %lld: %s: %s", + raw_smp_processor_id(), + ktime_to_ns(ktime_get()), + mmc_hostname(mmc), fmt); + memset(event, '\0', MMC_TRACE_EVENT_SZ); + vscnprintf(event, MMC_TRACE_EVENT_SZ, str, args); + va_end(args); +} + +void mmc_trace_init(struct mmc_host *mmc) +{ + BUILD_BUG_ON_NOT_POWER_OF_2(MMC_TRACE_RBUF_NUM_EVENTS); + + mmc->trace_buf.data = (char *) + __get_free_pages(GFP_KERNEL|__GFP_ZERO, + MMC_TRACE_RBUF_SZ_ORDER); + + if (!mmc->trace_buf.data) { + pr_err("%s: %s: Unable to allocate trace for mmc\n", + __func__, mmc_hostname(mmc)); + return; + } + + spin_lock_init(&mmc->trace_buf.trace_lock); + mmc->trace_buf.wr_idx = -1; +} + +void mmc_trace_free(struct mmc_host *mmc) +{ + if (mmc->trace_buf.data) + free_pages((unsigned long)mmc->trace_buf.data, + MMC_TRACE_RBUF_SZ_ORDER); +} + +void mmc_dump_trace_buffer(struct mmc_host *mmc, struct seq_file *s) +{ + unsigned int idx, cur_idx; + unsigned int N = MMC_TRACE_RBUF_NUM_EVENTS - 1; + char *event; + unsigned long flags; + + if (!mmc->trace_buf.data) + return; + + spin_lock_irqsave(&mmc->trace_buf.trace_lock, flags); + idx = ((unsigned int)mmc->trace_buf.wr_idx) & N; + cur_idx = (idx + 1) & N; + + do { + event = &mmc->trace_buf.data[cur_idx * MMC_TRACE_EVENT_SZ]; + if (s) + seq_printf(s, "%s", (char *)event); + else + pr_err("%s", (char *)event); + cur_idx = (cur_idx + 1) & N; + if (cur_idx == idx) { + event = + &mmc->trace_buf.data[cur_idx * MMC_TRACE_EVENT_SZ]; + if (s) + seq_printf(s, "latest_event: %s", + (char *)event); + else + pr_err("latest_event: %s", (char *)event); + break; + } + } while (1); + spin_unlock_irqrestore(&mmc->trace_buf.trace_lock, flags); +} diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c index 28943172809c8..1d21b905a03c2 100644 --- a/drivers/mmc/core/sd.c +++ b/drivers/mmc/core/sd.c @@ -730,15 +730,10 @@ static int mmc_sd_init_uhs_card(struct mmc_card *card) * SPI mode doesn't define CMD19 and tuning is only valid for SDR50 and * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. */ - if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning && + if (!mmc_host_is_spi(card->host) && (card->sd_bus_speed == UHS_SDR50_BUS_SPEED || - card->sd_bus_speed == UHS_SDR104_BUS_SPEED)) { - mmc_host_clk_hold(card->host); - err = card->host->ops->execute_tuning(card->host, - MMC_SEND_TUNING_BLOCK); - mmc_host_clk_release(card->host); - } - + card->sd_bus_speed == UHS_SDR104_BUS_SPEED)) + err = mmc_execute_tuning(card); out: kfree(status); @@ -1224,11 +1219,16 @@ static int mmc_sd_suspend(struct mmc_host *host) { int err; + MMC_TRACE(host, "%s: Enter\n", __func__); err = _mmc_sd_suspend(host); if (!err) { pm_runtime_disable(&host->card->dev); pm_runtime_set_suspended(&host->card->dev); - } + /* if suspend fails, force mmc_detect_change during resume */ + } else if (mmc_bus_manual_resume(host)) + host->ignore_bus_resume_flags = true; + + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; } @@ -1273,6 +1273,12 @@ static int _mmc_sd_resume(struct mmc_host *host) #else err = mmc_sd_init_card(host, host->card->ocr, host->card); #endif + if (err) { + pr_err("%s: %s: mmc_sd_init_card_failed (%d)\n", + mmc_hostname(host), __func__, err); + mmc_power_off(host); + goto out; + } mmc_card_clr_suspended(host->card); err = mmc_resume_clk_scaling(host); @@ -1294,12 +1300,14 @@ static int mmc_sd_resume(struct mmc_host *host) { int err = 0; + MMC_TRACE(host, "%s: Enter\n", __func__); if (!(host->caps & MMC_CAP_RUNTIME_RESUME)) { err = _mmc_sd_resume(host); pm_runtime_set_active(&host->card->dev); pm_runtime_mark_last_busy(&host->card->dev); } pm_runtime_enable(&host->card->dev); + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; } @@ -1355,6 +1363,11 @@ static int mmc_sd_power_restore(struct mmc_host *host) mmc_claim_host(host); ret = mmc_sd_init_card(host, host->card->ocr, host->card); mmc_release_host(host); + if (ret) { + pr_err("%s: %s: mmc_sd_init_card_failed (%d)\n", + mmc_hostname(host), __func__, ret); + return ret; + } ret = mmc_resume_clk_scaling(host); if (ret) diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index ab541e6591374..4dbd734889dfd 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -643,17 +643,11 @@ static int mmc_sdio_init_uhs_card(struct mmc_card *card) * SPI mode doesn't define CMD19 and tuning is only valid for SDR50 and * SDR104 mode SD-cards. Note that tuning is mandatory for SDR104. */ - if (!mmc_host_is_spi(card->host) && card->host->ops->execute_tuning && + if (!mmc_host_is_spi(card->host) && ((card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR50) || - (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104))) { - mmc_host_clk_hold(card->host); - err = card->host->ops->execute_tuning(card->host, - MMC_SEND_TUNING_BLOCK); - mmc_host_clk_release(card->host); - } - + (card->sw_caps.sd3_bus_mode & SD_MODE_UHS_SDR104))) + err = mmc_execute_tuning(card); out: - return err; } @@ -1036,6 +1030,7 @@ static int mmc_sdio_pre_suspend(struct mmc_host *host) */ static int mmc_sdio_suspend(struct mmc_host *host) { + MMC_TRACE(host, "%s: Enter\n", __func__); if (mmc_card_keep_power(host) && mmc_card_wake_sdio_irq(host)) { mmc_claim_host(host); sdio_disable_wide(host->card); @@ -1046,6 +1041,7 @@ static int mmc_sdio_suspend(struct mmc_host *host) mmc_power_off(host); else if (host->ios.clock) mmc_gate_clock(host); + MMC_TRACE(host, "%s: Exit\n", __func__); return 0; } @@ -1057,6 +1053,7 @@ static int mmc_sdio_resume(struct mmc_host *host) BUG_ON(!host); BUG_ON(!host->card); + MMC_TRACE(host, "%s: Enter\n", __func__); /* Basic card reinitialization. */ mmc_claim_host(host); @@ -1108,6 +1105,7 @@ static int mmc_sdio_resume(struct mmc_host *host) host->pm_flags &= ~MMC_PM_KEEP_POWER; host->pm_flags &= ~MMC_PM_WAKE_SDIO_IRQ; + MMC_TRACE(host, "%s: Exit err: %d\n", __func__, err); return err; } diff --git a/drivers/mmc/host/cmdq_hci.c b/drivers/mmc/host/cmdq_hci.c index 108753ada43c7..eb9ccac6d7d25 100644 --- a/drivers/mmc/host/cmdq_hci.c +++ b/drivers/mmc/host/cmdq_hci.c @@ -1,4 +1,5 @@ /* Copyright (c) 2015-2016 The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -199,6 +200,14 @@ static void cmdq_dumpregs(struct cmdq_host *cq_host) { struct mmc_host *mmc = cq_host->mmc; + MMC_TRACE(mmc, + "%s: 0x0C=0x%08x 0x10=0x%08x 0x14=0x%08x 0x18=0x%08x 0x28=0x%08x 0x2C=0x%08x 0x30=0x%08x 0x34=0x%08x 0x54=0x%08x 0x58=0x%08x 0x5C=0x%08x 0x48=0x%08x\n", + __func__, cmdq_readl(cq_host, CQCTL), cmdq_readl(cq_host, CQIS), + cmdq_readl(cq_host, CQISTE), cmdq_readl(cq_host, CQISGE), + cmdq_readl(cq_host, CQTDBR), cmdq_readl(cq_host, CQTCN), + cmdq_readl(cq_host, CQDQS), cmdq_readl(cq_host, CQDPT), + cmdq_readl(cq_host, CQTERRI), cmdq_readl(cq_host, CQCRI), + cmdq_readl(cq_host, CQCRA), cmdq_readl(cq_host, CQCRDCT)); pr_err(DRV_NAME ": ========== REGISTER DUMP (%s)==========\n", mmc_hostname(mmc)); @@ -395,7 +404,15 @@ static int cmdq_enable(struct mmc_host *mmc) cmdq_writel(cq_host, mmc->card->rca, CQSSC2); /* send QSR at lesser intervals than the default */ - cmdq_writel(cq_host, SEND_QSR_INTERVAL, CQSSC1); + if (CID_MANFID_MICRON == mmc->card->cid.manfid) { + if ((cmdq_readl(cq_host, CQSSC1) | SEND_QSR_INTERVAL) > 0x70040) + + cmdq_writel(cq_host, cmdq_readl(cq_host, CQSSC1) | SEND_QSR_INTERVAL, CQSSC1); + else + cmdq_writel(cq_host, 0x70040, CQSSC1); + } else{ + cmdq_writel(cq_host, SEND_QSR_INTERVAL, CQSSC1); + } /* enable bkops exception indication */ if (mmc_card_configured_manual_bkops(mmc->card) && @@ -427,6 +444,7 @@ static int cmdq_enable(struct mmc_host *mmc) pm_ref_count: cmdq_runtime_pm_put(cq_host); out: + MMC_TRACE(mmc, "%s: CQ enabled err: %d\n", __func__, err); return err; } @@ -444,6 +462,7 @@ static void cmdq_disable_nosync(struct mmc_host *mmc, bool soft) cq_host->enabled = false; mmc_host_set_cq_disable(mmc); + MMC_TRACE(mmc, "%s: CQ disabled\n", __func__); } static void cmdq_disable(struct mmc_host *mmc, bool soft) @@ -526,6 +545,12 @@ static void cmdq_prep_task_desc(struct mmc_request *mrq, REL_WRITE(!!(req_flags & REL_WR)) | BLK_COUNT(mrq->cmdq_req->data.blocks) | BLK_ADDR((u64)mrq->cmdq_req->blk_addr); + + MMC_TRACE(mrq->host, + "%s: Task: 0x%08x | Args: 0x%08x | cnt: 0x%08x\n", __func__, + lower_32_bits(*data), + upper_32_bits(*data), + mrq->cmdq_req->data.blocks); } static int cmdq_dma_map(struct mmc_host *host, struct mmc_request *mrq) @@ -666,6 +691,11 @@ static void cmdq_prep_dcmd_desc(struct mmc_host *mmc, dataddr = (__le64 __force *)(desc + 4); dataddr[0] = cpu_to_le64((u64)mrq->cmd->arg); cmdq_log_task_desc_history(cq_host, *task_desc, true); + MMC_TRACE(mrq->host, + "%s: DCMD: Task: 0x%08x | Args: 0x%08x\n", + __func__, + lower_32_bits(*task_desc), + upper_32_bits(*task_desc)); } static void cmdq_pm_qos_vote(struct sdhci_host *host, struct mmc_request *mrq) @@ -744,6 +774,7 @@ static int cmdq_request(struct mmc_host *mmc, struct mmc_request *mrq) cmdq_dumpregs(cq_host); BUG_ON(1); } + MMC_TRACE(mmc, "%s: tag: %d\n", __func__, tag); cmdq_writel(cq_host, 1 << tag, CQTDBR); /* Commit the doorbell write immediately */ wmb(); @@ -782,10 +813,11 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) u32 dbr_set = 0; status = cmdq_readl(cq_host, CQIS); - cmdq_writel(cq_host, status, CQIS); if (!status && !err) return IRQ_NONE; + MMC_TRACE(mmc, "%s: CQIS: 0x%x err: %d\n", + __func__, status, err); if (err || (status & CQIS_RED)) { err_info = cmdq_readl(cq_host, CQTERRI); @@ -803,6 +835,17 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) if (ret) pr_err("%s: %s: halt failed ret=%d\n", mmc_hostname(mmc), __func__, ret); + + /* + * Clear the CQIS after halting incase of error. This is done + * because if CQIS is cleared before halting, the CQ will + * continue with issueing commands for rest of requests with + * Doorbell rung. This will overwrite the Resp Arg register. + * So CQ must be halted first and then CQIS cleared incase + * of error + */ + cmdq_writel(cq_host, status, CQIS); + cmdq_dumpregs(cq_host); if (!err_info) { @@ -891,13 +934,15 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) mrq->cmdq_req->resp_err = true; pr_err("%s: Response error (0x%08x) from card !!!", - mmc_hostname(mmc), status); + mmc_hostname(mmc), cmdq_readl(cq_host, CQCRA)); } else { mrq->cmdq_req->resp_idx = cmdq_readl(cq_host, CQCRI); mrq->cmdq_req->resp_arg = cmdq_readl(cq_host, CQCRA); } cmdq_finish_data(mmc, tag); + } else { + cmdq_writel(cq_host, status, CQIS); } if (status & CQIS_TCC) { @@ -918,10 +963,17 @@ irqreturn_t cmdq_irq(struct mmc_host *mmc, int err) * before setting doorbell, hence one is not needed here. */ for_each_set_bit(tag, &comp_status, cq_host->num_slots) { - /* complete the corresponding mrq */ - pr_debug("%s: completing tag -> %lu\n", - mmc_hostname(mmc), tag); - cmdq_finish_data(mmc, tag); + mrq = get_req_by_tag(cq_host, tag); + if (!((mrq->cmd && mrq->cmd->error) || + mrq->cmdq_req->resp_err || + (mrq->data && mrq->data->error))) { + /* complete the corresponding mrq */ + pr_debug("%s: completing tag -> %lu\n", + mmc_hostname(mmc), tag); + MMC_TRACE(mmc, "%s: completing tag -> %lu\n", + __func__, tag); + cmdq_finish_data(mmc, tag); + } } } @@ -998,6 +1050,8 @@ static int cmdq_halt(struct mmc_host *mmc, bool halt) retries--; continue; } else { + MMC_TRACE(mmc, "%s: halt done , retries: %d\n", + __func__, retries); /* halt done: re-enable legacy interrupts */ if (cq_host->ops->clear_set_irqs) cq_host->ops->clear_set_irqs(mmc, @@ -1015,6 +1069,7 @@ static int cmdq_halt(struct mmc_host *mmc, bool halt) cq_host->ops->set_data_timeout(mmc, 0xf); if (cq_host->ops->clear_set_irqs) cq_host->ops->clear_set_irqs(mmc, true); + MMC_TRACE(mmc, "%s: unhalt done\n", __func__); cmdq_writel(cq_host, cmdq_readl(cq_host, CQCTL) & ~HALT, CQCTL); } diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index e079f494bbd49..a565e6b66fa77 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -958,6 +958,7 @@ int sdhci_msm_execute_tuning(struct sdhci_host *host, u32 opcode) bool drv_type_changed = false; struct mmc_card *card = host->mmc->card; int sts_retry; + u8 last_good_phase = 0; /* * Tuning is required for SDR104, HS200 and HS400 cards and @@ -1043,6 +1044,22 @@ int sdhci_msm_execute_tuning(struct sdhci_host *host, u32 opcode) mmc_wait_for_req(mmc, &mrq); if (card && (cmd.error || data.error)) { + /* + * Set the dll to last known good phase while sending + * status command to ensure that status command won't + * fail due to bad phase. + */ + if (tuned_phase_cnt) + last_good_phase = + tuned_phases[tuned_phase_cnt-1]; + else if (msm_host->saved_tuning_phase != + INVALID_TUNING_PHASE) + last_good_phase = msm_host->saved_tuning_phase; + + rc = msm_config_cm_dll_phase(host, last_good_phase); + if (rc) + goto kfree; + sts_cmd.opcode = MMC_SEND_STATUS; sts_cmd.arg = card->rca << 16; sts_cmd.flags = MMC_RSP_R1 | MMC_CMD_AC; @@ -2181,21 +2198,6 @@ static int sdhci_msm_setup_vreg(struct sdhci_msm_pltfm_data *pdata, return ret; } -/* - * Reset vreg by ensuring it is off during probe. A call - * to enable vreg is needed to balance disable vreg - */ -static int sdhci_msm_vreg_reset(struct sdhci_msm_pltfm_data *pdata) -{ - int ret; - - ret = sdhci_msm_setup_vreg(pdata, 1, true); - if (ret) - return ret; - ret = sdhci_msm_setup_vreg(pdata, 0, true); - return ret; -} - /* This init function should be called only once for each SDHC slot */ static int sdhci_msm_vreg_init(struct device *dev, struct sdhci_msm_pltfm_data *pdata, @@ -2230,7 +2232,7 @@ static int sdhci_msm_vreg_init(struct device *dev, if (ret) goto vdd_reg_deinit; } - ret = sdhci_msm_vreg_reset(pdata); + if (ret) dev_err(dev, "vreg reset failed (%d)\n", ret); goto out; @@ -2396,7 +2398,9 @@ static irqreturn_t sdhci_msm_pwr_irq(int irq, void *data) io_level = REQ_IO_HIGH; } if (irq_status & CORE_PWRCTL_BUS_OFF) { - ret = sdhci_msm_setup_vreg(msm_host->pdata, false, false); + if (msm_host->pltfm_init_done) + ret = sdhci_msm_setup_vreg(msm_host->pdata, + false, false); if (!ret) { ret = sdhci_msm_setup_pins(msm_host->pdata, false); ret |= sdhci_msm_set_vdd_io_vol(msm_host->pdata, @@ -2582,9 +2586,17 @@ static void sdhci_msm_check_power_status(struct sdhci_host *host, u32 req_type) if (done) init_completion(&msm_host->pwr_irq_completion); else if (!wait_for_completion_timeout(&msm_host->pwr_irq_completion, - msecs_to_jiffies(MSM_PWR_IRQ_TIMEOUT_MS))) + msecs_to_jiffies(MSM_PWR_IRQ_TIMEOUT_MS))) { __WARN_printf("%s: request(%d) timed out waiting for pwr_irq\n", mmc_hostname(host->mmc), req_type); + MMC_TRACE(host->mmc, + "request(%d) timed out waiting for pwr_irq, 0xDC: 0x%08x | 0xE0: 0x%08x | 0xE8: 0x%08x\n", + req_type, + readl_relaxed(msm_host->core_mem + CORE_PWRCTL_STATUS), + readl_relaxed(msm_host->core_mem + CORE_PWRCTL_MASK), + readl_relaxed(msm_host->core_mem + CORE_PWRCTL_CTL)); + mmc_stop_tracing(host->mmc); + } pr_debug("%s: %s: request %d done\n", mmc_hostname(host->mmc), __func__, req_type); @@ -2706,7 +2718,24 @@ static int sdhci_msm_enable_controller_clock(struct sdhci_host *host) return rc; } +static void sdhci_msm_disable_controller_clock(struct sdhci_host *host) +{ + struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); + struct sdhci_msm_host *msm_host = pltfm_host->priv; + if (atomic_read(&msm_host->controller_clock)) { + if (!IS_ERR(msm_host->clk)) + clk_disable_unprepare(msm_host->clk); + if (!IS_ERR(msm_host->pclk)) + clk_disable_unprepare(msm_host->pclk); + if (!IS_ERR(msm_host->ice_clk)) + clk_disable_unprepare(msm_host->ice_clk); + sdhci_msm_bus_voting(host, 0); + atomic_set(&msm_host->controller_clock, 0); + pr_debug("%s: %s: disabled controller clock\n", + mmc_hostname(host->mmc), __func__); + } +} static int sdhci_msm_prepare_clocks(struct sdhci_host *host, bool enable) { @@ -3072,6 +3101,9 @@ void sdhci_msm_dump_vendor_regs(struct sdhci_host *host) if (host->cq_host) sdhci_msm_cmdq_dump_debug_ram(host); + MMC_TRACE(host->mmc, "Data cnt: 0x%08x | Fifo cnt: 0x%08x\n", + readl_relaxed(msm_host->core_mem + CORE_MCI_DATA_CNT), + readl_relaxed(msm_host->core_mem + CORE_MCI_FIFO_CNT)); pr_info("Data cnt: 0x%08x | Fifo cnt: 0x%08x | Int sts: 0x%08x\n", readl_relaxed(msm_host->core_mem + CORE_MCI_DATA_CNT), readl_relaxed(msm_host->core_mem + CORE_MCI_FIFO_CNT), @@ -4313,6 +4345,8 @@ static int sdhci_msm_probe(struct platform_device *pdev) goto free_cd_gpio; } + msm_host->pltfm_init_done = true; + pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); pm_runtime_set_autosuspend_delay(&pdev->dev, MSM_AUTOSUSPEND_DELAY_MS); @@ -4564,7 +4598,7 @@ static int sdhci_msm_suspend(struct device *dev) } ret = sdhci_msm_runtime_suspend(dev); out: - + sdhci_msm_disable_controller_clock(host); if (host->mmc->card && mmc_card_sdio(host->mmc->card)) { sdio_cfg = sdhci_msm_cfg_sdio_wakeup(host, true); if (sdio_cfg) diff --git a/drivers/mmc/host/sdhci-msm.h b/drivers/mmc/host/sdhci-msm.h index e47a5083e8a6a..c3ba28dc967c6 100644 --- a/drivers/mmc/host/sdhci-msm.h +++ b/drivers/mmc/host/sdhci-msm.h @@ -214,6 +214,7 @@ struct sdhci_msm_host { bool pm_qos_group_enable; struct sdhci_msm_pm_qos_irq pm_qos_irq; bool tuning_in_progress; + bool pltfm_init_done; }; extern char *saved_command_line; diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index c7a066819a161..af4e167dec0fd 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -105,6 +105,17 @@ static void sdhci_dump_state(struct sdhci_host *host) static void sdhci_dumpregs(struct sdhci_host *host) { + MMC_TRACE(host->mmc, + "%s: 0x04=0x%08x 0x06=0x%08x 0x0E=0x%08x 0x30=0x%08x 0x34=0x%08x 0x38=0x%08x\n", + __func__, + sdhci_readw(host, SDHCI_BLOCK_SIZE), + sdhci_readw(host, SDHCI_BLOCK_COUNT), + sdhci_readw(host, SDHCI_COMMAND), + sdhci_readl(host, SDHCI_INT_STATUS), + sdhci_readl(host, SDHCI_INT_ENABLE), + sdhci_readl(host, SDHCI_SIGNAL_ENABLE)); + mmc_stop_tracing(host->mmc); + pr_info(DRIVER_NAME ": =========== REGISTER DUMP (%s)===========\n", mmc_hostname(host->mmc)); @@ -161,7 +172,9 @@ static void sdhci_dumpregs(struct sdhci_host *host) readl(host->ioaddr + SDHCI_ADMA_ERROR), readl(host->ioaddr + SDHCI_ADMA_ADDRESS_LOW)); } - + #ifdef CONFIG_MMC_ERROR_STATUS + host->mmc->err_occurred = true; + #endif if (host->ops->dump_vendor_regs) host->ops->dump_vendor_regs(host); sdhci_dump_state(host); @@ -1046,6 +1059,11 @@ static void sdhci_prepare_data(struct sdhci_host *host, struct mmc_command *cmd) /* Set the DMA boundary value and block size */ sdhci_set_blk_size_reg(host, data->blksz, SDHCI_DEFAULT_BOUNDARY_ARG); sdhci_writew(host, data->blocks, SDHCI_BLOCK_COUNT); + MMC_TRACE(host->mmc, + "%s: 0x28=0x%08x 0x3E=0x%08x 0x06=0x%08x\n", __func__, + sdhci_readb(host, SDHCI_HOST_CONTROL), + sdhci_readw(host, SDHCI_HOST_CONTROL2), + sdhci_readw(host, SDHCI_BLOCK_COUNT)); } static void sdhci_set_transfer_mode(struct sdhci_host *host, @@ -1096,6 +1114,9 @@ static void sdhci_set_transfer_mode(struct sdhci_host *host, mode |= SDHCI_TRNS_DMA; sdhci_writew(host, mode, SDHCI_TRANSFER_MODE); + MMC_TRACE(host->mmc, "%s: 0x00=0x%08x 0x0C=0x%08x\n", __func__, + sdhci_readw(host, SDHCI_ARGUMENT2), + sdhci_readw(host, SDHCI_TRANSFER_MODE)); } static void sdhci_finish_data(struct sdhci_host *host) @@ -1107,6 +1128,8 @@ static void sdhci_finish_data(struct sdhci_host *host) data = host->data; host->data = NULL; + MMC_TRACE(host->mmc, "%s: 0x24=0x%08x\n", __func__, + sdhci_readl(host, SDHCI_PRESENT_STATE)); if (host->flags & SDHCI_REQ_USE_DMA) { if (host->flags & SDHCI_USE_ADMA) sdhci_adma_table_post(host, data); @@ -1233,6 +1256,11 @@ void sdhci_send_command(struct sdhci_host *host, struct mmc_command *cmd) if (cmd->data) host->data_start_time = ktime_get(); trace_mmc_cmd_rw_start(cmd->opcode, cmd->arg, cmd->flags); + MMC_TRACE(host->mmc, + "%s: updated 0x8=0x%08x 0xC=0x%08x 0xE=0x%08x\n", __func__, + sdhci_readl(host, SDHCI_ARGUMENT), + sdhci_readw(host, SDHCI_TRANSFER_MODE), + sdhci_readw(host, SDHCI_COMMAND)); sdhci_writew(host, SDHCI_MAKE_CMD(cmd->opcode, flags), SDHCI_COMMAND); } EXPORT_SYMBOL_GPL(sdhci_send_command); @@ -1254,8 +1282,14 @@ static void sdhci_finish_command(struct sdhci_host *host) sdhci_readb(host, SDHCI_RESPONSE + (3-i)*4-1); } + MMC_TRACE(host->mmc, + "%s: resp 0: 0x%08x resp 1: 0x%08x resp 2: 0x%08x resp 3: 0x%08x\n", + __func__, host->cmd->resp[0], host->cmd->resp[1], + host->cmd->resp[2], host->cmd->resp[3]); } else { host->cmd->resp[0] = sdhci_readl(host, SDHCI_RESPONSE); + MMC_TRACE(host->mmc, "%s: resp 0: 0x%08x\n", + __func__, host->cmd->resp[0]); } } @@ -3012,7 +3046,8 @@ static void sdhci_data_irq(struct sdhci_host *host, u32 intmask) host->ops->adma_workaround(host, intmask); } if (host->data->error) { - if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT)) { + if (intmask & (SDHCI_INT_DATA_CRC | SDHCI_INT_DATA_TIMEOUT + | SDHCI_INT_DATA_END_BIT)) { command = SDHCI_GET_CMD(sdhci_readw(host, SDHCI_COMMAND)); if ((command != MMC_SEND_TUNING_BLOCK_HS200) && @@ -3186,6 +3221,9 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) goto out; } + MMC_TRACE(host->mmc, + "%s: intmask: 0x%x\n", __func__, intmask); + if (intmask & SDHCI_INT_AUTO_CMD_ERR) host->auto_cmd_err_sts = sdhci_readw(host, SDHCI_AUTO_CMD_ERR); @@ -4116,10 +4154,15 @@ int sdhci_add_host(struct sdhci_host *host) * value. */ max_current_caps = sdhci_readl(host, SDHCI_MAX_CURRENT); - if (!max_current_caps && !IS_ERR(mmc->supply.vmmc)) { - int curr = regulator_get_current_limit(mmc->supply.vmmc); - if (curr > 0) { + if (!max_current_caps) { + u32 curr = 0; + + if (!IS_ERR(mmc->supply.vmmc)) + curr = regulator_get_current_limit(mmc->supply.vmmc); + else if (host->ops->get_current_limit) + curr = host->ops->get_current_limit(host); + if (curr > 0) { /* convert to SDHCI_MAX_CURRENT format */ curr = curr/1000; /* convert to mA */ curr = curr/SDHCI_MAX_CURRENT_MULTIPLIER; diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h index 80f36d61f11f9..aaba8884d97f1 100644 --- a/drivers/mmc/host/sdhci.h +++ b/drivers/mmc/host/sdhci.h @@ -337,6 +337,7 @@ struct sdhci_ops { void (*init)(struct sdhci_host *host); void (*pre_req)(struct sdhci_host *host, struct mmc_request *req); void (*post_req)(struct sdhci_host *host, struct mmc_request *req); + unsigned int (*get_current_limit)(struct sdhci_host *host); }; #ifdef CONFIG_MMC_SDHCI_IO_ACCESSORS diff --git a/drivers/net/ethernet/amd/xgbe/xgbe.h b/drivers/net/ethernet/amd/xgbe/xgbe.h index 789957d43a137..ef301f45cbdc7 100644 --- a/drivers/net/ethernet/amd/xgbe/xgbe.h +++ b/drivers/net/ethernet/amd/xgbe/xgbe.h @@ -124,7 +124,7 @@ #include #include #include -#include +#include #include #include diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h index 2559206d87046..29e8e6eceb64e 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x.h @@ -22,7 +22,7 @@ #include #include -#include +#include /* compilation time flags */ diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 9af296a1ca999..e5ea8b9973c48 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h @@ -16,6 +16,7 @@ #include #include #include +#include #if defined(CONFIG_M523x) || defined(CONFIG_M527x) || defined(CONFIG_M528x) || \ defined(CONFIG_M520x) || defined(CONFIG_M532x) || \ diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index 7785240a0da1a..9416e5a7e0c82 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h @@ -34,7 +34,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h index 95f47b9f50d4f..5c8be806b83a7 100644 --- a/drivers/net/ethernet/intel/igb/igb.h +++ b/drivers/net/ethernet/intel/igb/igb.h @@ -29,7 +29,7 @@ #include "e1000_mac.h" #include "e1000_82575.h" -#include +#include #include #include #include diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe.h b/drivers/net/ethernet/intel/ixgbe/ixgbe.h index 5032a602d5c98..f26eeb705a773 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe.h +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe.h @@ -38,7 +38,7 @@ #include #include -#include +#include #include #include diff --git a/drivers/net/ethernet/msm/ecm_ipa.c b/drivers/net/ethernet/msm/ecm_ipa.c index c7c4da22139df..80ea7ef497cb0 100644 --- a/drivers/net/ethernet/msm/ecm_ipa.c +++ b/drivers/net/ethernet/msm/ecm_ipa.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -9,7 +9,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ - #include #include #include @@ -106,10 +105,6 @@ enum ecm_ipa_operation { * struct ecm_ipa_dev - main driver context parameters * @net: network interface struct implemented by this driver * @directory: debugfs directory for various debuging switches - * @tx_enable: flag that enable/disable Tx path to continue to IPA - * @rx_enable: flag that enable/disable Rx path to continue to IPA - * @rm_enable: flag that enable/disable Resource manager request prior to Tx - * @dma_enable: flag that allow on-the-fly DMA mode for IPA * @eth_ipv4_hdr_hdl: saved handle for ipv4 header-insertion table * @eth_ipv6_hdr_hdl: saved handle for ipv6 header-insertion table * @usb_to_ipa_hdl: save handle for IPA pipe operations @@ -129,10 +124,6 @@ enum ecm_ipa_operation { */ struct ecm_ipa_dev { struct net_device *net; - u32 tx_enable; - u32 rx_enable; - u32 rm_enable; - bool dma_enable; struct dentry *directory; uint32_t eth_ipv4_hdr_hdl; uint32_t eth_ipv6_hdr_hdl; @@ -167,32 +158,16 @@ static void ecm_ipa_rm_notify(void *user_data, enum ipa_rm_event event, static struct net_device_stats *ecm_ipa_get_stats(struct net_device *net); static int ecm_ipa_create_rm_resource(struct ecm_ipa_dev *ecm_ipa_ctx); static void ecm_ipa_destory_rm_resource(struct ecm_ipa_dev *ecm_ipa_ctx); -static bool rx_filter(struct sk_buff *skb); -static bool tx_filter(struct sk_buff *skb); -static bool rm_enabled(struct ecm_ipa_dev *ecm_ipa_ctx); static int resource_request(struct ecm_ipa_dev *ecm_ipa_ctx); static void resource_release(struct ecm_ipa_dev *ecm_ipa_ctx); static netdev_tx_t ecm_ipa_start_xmit(struct sk_buff *skb, struct net_device *net); -static int ecm_ipa_debugfs_stall_open(struct inode *inode, - struct file *file); -static ssize_t ecm_ipa_debugfs_stall_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); static int ecm_ipa_debugfs_atomic_open(struct inode *inode, struct file *file); -static ssize_t ecm_ipa_debugfs_enable_write_dma(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); -static int ecm_ipa_debugfs_dma_open(struct inode *inode, struct file *file); -static ssize_t ecm_ipa_debugfs_enable_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); -static ssize_t ecm_ipa_debugfs_enable_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos); static ssize_t ecm_ipa_debugfs_atomic_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos); -static int ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx); +static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx); static void ecm_ipa_debugfs_destroy(struct ecm_ipa_dev *ecm_ipa_ctx); static int ecm_ipa_ep_registers_cfg(u32 usb_to_ipa_hdl, u32 ipa_to_usb_hdl); -static int ecm_ipa_ep_registers_dma_cfg(u32 usb_to_ipa_hdl, - enum ipa_client_type prod_client); static int ecm_ipa_set_device_ethernet_addr(u8 *dev_ethaddr, u8 device_ethaddr[]); static enum ecm_ipa_state ecm_ipa_next_state(enum ecm_ipa_state current_state, @@ -210,22 +185,11 @@ static const struct net_device_ops ecm_ipa_netdev_ops = { .ndo_get_stats = ecm_ipa_get_stats, }; -const struct file_operations ecm_ipa_debugfs_dma_ops = { - .open = ecm_ipa_debugfs_dma_open, - .read = ecm_ipa_debugfs_enable_read, - .write = ecm_ipa_debugfs_enable_write_dma, -}; - const struct file_operations ecm_ipa_debugfs_atomic_ops = { .open = ecm_ipa_debugfs_atomic_open, .read = ecm_ipa_debugfs_atomic_read, }; -const struct file_operations ecm_ipa_debugfs_stall_ops = { - .open = ecm_ipa_debugfs_stall_open, - .write = ecm_ipa_debugfs_stall_write, -}; - static void ecm_ipa_msg_free_cb(void *buff, u32 len, u32 type) { kfree(buff); @@ -286,9 +250,6 @@ int ecm_ipa_init(struct ecm_ipa_params *params) ECM_IPA_DEBUG("ecm_ipa_ctx (private) = %p\n", ecm_ipa_ctx); ecm_ipa_ctx->net = net; - ecm_ipa_ctx->tx_enable = true; - ecm_ipa_ctx->rx_enable = true; - ecm_ipa_ctx->rm_enable = true; ecm_ipa_ctx->outstanding_high = DEFAULT_OUTSTANDING_HIGH; ecm_ipa_ctx->outstanding_low = DEFAULT_OUTSTANDING_LOW; atomic_set(&ecm_ipa_ctx->outstanding_pkts, 0); @@ -301,10 +262,7 @@ int ecm_ipa_init(struct ecm_ipa_params *params) ECM_IPA_DEBUG("device_ready_notify() was not supplied"); ecm_ipa_ctx->device_ready_notify = params->device_ready_notify; - result = ecm_ipa_debugfs_init(ecm_ipa_ctx); - if (result) - goto fail_debugfs; - ECM_IPA_DEBUG("debugfs entries were created\n"); + ecm_ipa_debugfs_init(ecm_ipa_ctx); result = ecm_ipa_set_device_ethernet_addr(net->dev_addr, params->device_ethaddr); @@ -353,7 +311,6 @@ int ecm_ipa_init(struct ecm_ipa_params *params) fail_set_device_ethernet: fail_rules_cfg: ecm_ipa_debugfs_destroy(ecm_ipa_ctx); -fail_debugfs: fail_netdev_priv: free_netdev(net); fail_alloc_etherdev: @@ -604,12 +561,6 @@ static netdev_tx_t ecm_ipa_start_xmit(struct sk_buff *skb, return NETDEV_TX_BUSY; } - if (unlikely(tx_filter(skb))) { - dev_kfree_skb_any(skb); - ECM_IPA_DEBUG("packet got filtered out on Tx path\n"); - status = NETDEV_TX_OK; - goto out; - } ret = resource_request(ecm_ipa_ctx); if (ret) { ECM_IPA_DEBUG("Waiting to resource\n"); @@ -683,11 +634,6 @@ static void ecm_ipa_packet_receive_notify(void *priv, skb->dev = ecm_ipa_ctx->net; skb->protocol = eth_type_trans(skb, ecm_ipa_ctx->net); - if (rx_filter(skb)) { - ECM_IPA_DEBUG("packet got filtered out on Rx path\n"); - dev_kfree_skb_any(skb); - return; - } result = netif_rx(skb); if (result) @@ -1150,42 +1096,15 @@ static void ecm_ipa_destory_rm_resource(struct ecm_ipa_dev *ecm_ipa_ctx) ECM_IPA_LOG_EXIT(); } -static bool rx_filter(struct sk_buff *skb) -{ - struct ecm_ipa_dev *ecm_ipa_ctx = netdev_priv(skb->dev); - return !ecm_ipa_ctx->rx_enable; -} - -static bool tx_filter(struct sk_buff *skb) -{ - struct ecm_ipa_dev *ecm_ipa_ctx = netdev_priv(skb->dev); - return !ecm_ipa_ctx->tx_enable; -} - -static bool rm_enabled(struct ecm_ipa_dev *ecm_ipa_ctx) -{ - return ecm_ipa_ctx->rm_enable; -} - static int resource_request(struct ecm_ipa_dev *ecm_ipa_ctx) { - int result = 0; - - if (!rm_enabled(ecm_ipa_ctx)) - goto out; - result = ipa_rm_inactivity_timer_request_resource( - IPA_RM_RESOURCE_STD_ECM_PROD); -out: - return result; + return ipa_rm_inactivity_timer_request_resource( + IPA_RM_RESOURCE_STD_ECM_PROD); } static void resource_release(struct ecm_ipa_dev *ecm_ipa_ctx) { - if (!rm_enabled(ecm_ipa_ctx)) - goto out; ipa_rm_inactivity_timer_release_resource(IPA_RM_RESOURCE_STD_ECM_PROD); -out: - return; } /** @@ -1258,45 +1177,6 @@ static void ecm_ipa_tx_timeout(struct net_device *net) net->stats.tx_errors++; } -static int ecm_ipa_debugfs_stall_open(struct inode *inode, - struct file *file) -{ - ECM_IPA_LOG_ENTRY(); - - ECM_IPA_LOG_EXIT(); - - return 0; -} - -static ssize_t ecm_ipa_debugfs_stall_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - u32 cmdq_cfg_mmio_phy = 0xFD4E3038; - void *cmdq_cfg_mmio_virt; - int result; - bool val = 0; - - ECM_IPA_LOG_ENTRY(); - - file->private_data = &val; - result = ecm_ipa_debugfs_enable_write(file, buf, count, ppos); - - cmdq_cfg_mmio_virt = ioremap(cmdq_cfg_mmio_phy, sizeof(u32)); - if (!cmdq_cfg_mmio_virt) { - ECM_IPA_ERROR("fail on mmio for cmdq_cfg_mmio_phy=0x%x", - cmdq_cfg_mmio_phy); - return result; - } - - iowrite32(val, cmdq_cfg_mmio_virt); - ECM_IPA_DEBUG("Value %d was written to cfgq", val); - - ECM_IPA_LOG_EXIT(); - - return result; - -} - static int ecm_ipa_debugfs_atomic_open(struct inode *inode, struct file *file) { struct ecm_ipa_dev *ecm_ipa_ctx = inode->i_private; @@ -1306,78 +1186,6 @@ static int ecm_ipa_debugfs_atomic_open(struct inode *inode, struct file *file) return 0; } -static ssize_t ecm_ipa_debugfs_enable_write_dma(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - struct ecm_ipa_dev *ecm_ipa_ctx = file->private_data; - int result; - ECM_IPA_LOG_ENTRY(); - file->private_data = &ecm_ipa_ctx->dma_enable; - result = ecm_ipa_debugfs_enable_write(file, buf, count, ppos); - if (ecm_ipa_ctx->dma_enable) - ecm_ipa_ep_registers_dma_cfg(ecm_ipa_ctx->usb_to_ipa_hdl, - ecm_ipa_ctx->ipa_to_usb_client); - else - ecm_ipa_ep_registers_cfg(ecm_ipa_ctx->usb_to_ipa_hdl, - ecm_ipa_ctx->usb_to_ipa_hdl); - ECM_IPA_LOG_EXIT(); - return result; -} - -static int ecm_ipa_debugfs_dma_open(struct inode *inode, struct file *file) -{ - struct ecm_ipa_dev *ecm_ipa_ctx = inode->i_private; - ECM_IPA_LOG_ENTRY(); - file->private_data = ecm_ipa_ctx; - ECM_IPA_LOG_EXIT(); - return 0; -} - -static ssize_t ecm_ipa_debugfs_enable_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - unsigned long missing; - char input; - bool *enable = file->private_data; - if (count != sizeof(input) + 1) { - ECM_IPA_ERROR("wrong input length(%zd)\n", count); - return -EINVAL; - } - if (!buf) { - ECM_IPA_ERROR("Bad argument\n"); - return -EINVAL; - } - missing = copy_from_user(&input, buf, 1); - if (missing) - return -EFAULT; - ECM_IPA_DEBUG("input received %c\n", input); - *enable = input - '0'; - ECM_IPA_DEBUG("value was set to %d\n", *enable); - return count; -} - -static ssize_t ecm_ipa_debugfs_enable_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos) -{ - int nbytes; - int size = 0; - int ret; - loff_t pos; - u8 enable_str[sizeof(char)*3] = {0}; - bool *enable = file->private_data; - pos = *ppos; - nbytes = scnprintf(enable_str, sizeof(enable_str), "%d\n", *enable); - ret = simple_read_from_buffer(ubuf, count, ppos, enable_str, nbytes); - if (ret < 0) { - ECM_IPA_ERROR("simple_read_from_buffer problem\n"); - return ret; - } - size += ret; - count -= nbytes; - *ppos = pos + size; - return size; -} - static ssize_t ecm_ipa_debugfs_atomic_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos) { @@ -1389,42 +1197,24 @@ static ssize_t ecm_ipa_debugfs_atomic_read(struct file *file, return simple_read_from_buffer(ubuf, count, ppos, atomic_str, nbytes); } +#ifdef CONFIG_DEBUG_FS -static int ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) +static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) { const mode_t flags_read_write = S_IRUGO | S_IWUGO; const mode_t flags_read_only = S_IRUGO; - const mode_t flags_write_only = S_IWUGO; struct dentry *file; ECM_IPA_LOG_ENTRY(); if (!ecm_ipa_ctx) - return -EINVAL; + return; ecm_ipa_ctx->directory = debugfs_create_dir("ecm_ipa", NULL); if (!ecm_ipa_ctx->directory) { ECM_IPA_ERROR("could not create debugfs directory entry\n"); goto fail_directory; } - file = debugfs_create_bool("tx_enable", flags_read_write, - ecm_ipa_ctx->directory, &ecm_ipa_ctx->tx_enable); - if (!file) { - ECM_IPA_ERROR("could not create debugfs tx file\n"); - goto fail_file; - } - file = debugfs_create_bool("rx_enable", flags_read_write, - ecm_ipa_ctx->directory, &ecm_ipa_ctx->rx_enable); - if (!file) { - ECM_IPA_ERROR("could not create debugfs rx file\n"); - goto fail_file; - } - file = debugfs_create_bool("rm_enable", flags_read_write, - ecm_ipa_ctx->directory, &ecm_ipa_ctx->rm_enable); - if (!file) { - ECM_IPA_ERROR("could not create debugfs rm file\n"); - goto fail_file; - } file = debugfs_create_u8("outstanding_high", flags_read_write, ecm_ipa_ctx->directory, &ecm_ipa_ctx->outstanding_high); if (!file) { @@ -1437,13 +1227,6 @@ static int ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) ECM_IPA_ERROR("could not create outstanding_low file\n"); goto fail_file; } - file = debugfs_create_file("dma_enable", flags_read_write, - ecm_ipa_ctx->directory, - ecm_ipa_ctx, &ecm_ipa_debugfs_dma_ops); - if (!file) { - ECM_IPA_ERROR("could not create debugfs dma file\n"); - goto fail_file; - } file = debugfs_create_file("outstanding", flags_read_only, ecm_ipa_ctx->directory, ecm_ipa_ctx, &ecm_ipa_debugfs_atomic_ops); @@ -1452,21 +1235,14 @@ static int ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) goto fail_file; } - file = debugfs_create_file("stall_ipa_rx_proc", flags_write_only, - ecm_ipa_ctx->directory, - ecm_ipa_ctx, &ecm_ipa_debugfs_stall_ops); - if (!file) { - ECM_IPA_ERROR("could not create stall_ipa_rx_proc file\n"); - goto fail_file; - } - + ECM_IPA_DEBUG("debugfs entries were created\n"); ECM_IPA_LOG_EXIT(); - return 0; + return; fail_file: debugfs_remove_recursive(ecm_ipa_ctx->directory); fail_directory: - return -EFAULT; + return; } static void ecm_ipa_debugfs_destroy(struct ecm_ipa_dev *ecm_ipa_ctx) @@ -1474,6 +1250,13 @@ static void ecm_ipa_debugfs_destroy(struct ecm_ipa_dev *ecm_ipa_ctx) debugfs_remove_recursive(ecm_ipa_ctx->directory); } +#else /* !CONFIG_DEBUG_FS*/ + +static void ecm_ipa_debugfs_init(struct ecm_ipa_dev *ecm_ipa_ctx) {} + +static void ecm_ipa_debugfs_destroy(struct ecm_ipa_dev *ecm_ipa_ctx) {} + +#endif /* CONFIG_DEBUG_FS */ /** * ecm_ipa_ep_cfg() - configure the USB endpoints for ECM * @@ -1522,46 +1305,6 @@ static int ecm_ipa_ep_registers_cfg(u32 usb_to_ipa_hdl, u32 ipa_to_usb_hdl) return result; } -/** - * ecm_ipa_ep_registers_dma_cfg() - configure the USB endpoints for ECM - * DMA - * @usb_to_ipa_hdl: handle received from ipa_connect - * - * This function will override the previous configuration - * which is needed for cores that does not support blocks logic - * Note that client handles are the actual pipe index - */ -static int ecm_ipa_ep_registers_dma_cfg(u32 usb_to_ipa_hdl, - enum ipa_client_type prod_client) -{ - int result = 0; - struct ipa_ep_cfg_mode cfg_mode; - u32 apps_to_ipa_hdl = 2; - - ECM_IPA_LOG_ENTRY(); - - memset(&cfg_mode, 0 , sizeof(cfg_mode)); - cfg_mode.mode = IPA_DMA; - cfg_mode.dst = prod_client; - result = ipa_cfg_ep_mode(apps_to_ipa_hdl, &cfg_mode); - if (result) { - ECM_IPA_ERROR("failed to configure Apps to IPA\n"); - goto out; - } - memset(&cfg_mode, 0 , sizeof(cfg_mode)); - cfg_mode.mode = IPA_DMA; - cfg_mode.dst = IPA_CLIENT_A5_LAN_WAN_CONS; - result = ipa_cfg_ep_mode(usb_to_ipa_hdl, &cfg_mode); - if (result) { - ECM_IPA_ERROR("failed to configure USB to IPA\n"); - goto out; - } - ECM_IPA_DEBUG("end-point registers successfully configured\n"); -out: - ECM_IPA_LOG_EXIT(); - return result; -} - /** * ecm_ipa_set_device_ethernet_addr() - set device etherenet address * @dev_ethaddr: device etherenet address diff --git a/drivers/net/ethernet/msm/rndis_ipa.c b/drivers/net/ethernet/msm/rndis_ipa.c index 3e0b83f8ddaa6..179e7081cb40d 100644 --- a/drivers/net/ethernet/msm/rndis_ipa.c +++ b/drivers/net/ethernet/msm/rndis_ipa.c @@ -135,29 +135,6 @@ enum rndis_ipa_operation { RNDIS_IPA_DEBUG("Driver state: %s\n",\ rndis_ipa_state_string(ctx->state)); -/** - * struct rndis_loopback_pipe - hold all information needed for - * pipe loopback logic - */ -struct rndis_loopback_pipe { - struct sps_pipe *ipa_sps; - struct ipa_sps_params ipa_sps_connect; - struct ipa_connect_params ipa_connect_params; - - struct sps_pipe *dma_sps; - struct sps_connect dma_connect; - - struct sps_alloc_dma_chan dst_alloc; - struct sps_dma_chan ipa_sps_channel; - enum sps_mode mode; - u32 ipa_peer_bam_hdl; - u32 peer_pipe_index; - u32 ipa_drv_ep_hdl; - u32 ipa_pipe_index; - enum ipa_client_type ipa_client; - ipa_notify_cb ipa_callback; - struct ipa_ep_cfg *ipa_ep_cfg; -}; /** * struct rndis_ipa_dev - main driver context parameters @@ -172,13 +149,9 @@ struct rndis_loopback_pipe { * @rx_dump_enable: dump all Rx packets * @icmp_filter: allow all ICMP packet to pass through the filters * @rm_enable: flag that enable/disable Resource manager request prior to Tx - * @loopback_enable: flag that enable/disable USB stub loopback * @deaggregation_enable: enable/disable IPA HW deaggregation logic * @during_xmit_error: flags that indicate that the driver is in a middle * of error handling in Tx path - * @usb_to_ipa_loopback_pipe: usb to ipa (Rx) pipe representation for loopback - * @ipa_to_usb_loopback_pipe: ipa to usb (Tx) pipe representation for loopback - * @bam_dma_hdl: handle representing bam-dma, used for loopback logic * @directory: holds all debug flags used by the driver to allow cleanup * for driver unload * @eth_ipv4_hdr_hdl: saved handle for ipv4 header-insertion table @@ -209,12 +182,8 @@ struct rndis_ipa_dev { u32 rx_dump_enable; u32 icmp_filter; u32 rm_enable; - bool loopback_enable; u32 deaggregation_enable; u32 during_xmit_error; - struct rndis_loopback_pipe usb_to_ipa_loopback_pipe; - struct rndis_loopback_pipe ipa_to_usb_loopback_pipe; - u32 bam_dma_hdl; struct dentry *directory; uint32_t eth_ipv4_hdr_hdl; uint32_t eth_ipv6_hdr_hdl; @@ -279,35 +248,16 @@ static int resource_request(struct rndis_ipa_dev *rndis_ipa_ctx); static void resource_release(struct rndis_ipa_dev *rndis_ipa_ctx); static netdev_tx_t rndis_ipa_start_xmit(struct sk_buff *skb, struct net_device *net); -static int rndis_ipa_loopback_pipe_create( - struct rndis_ipa_dev *rndis_ipa_ctx, - struct rndis_loopback_pipe *loopback_pipe); -static void rndis_ipa_destroy_loopback_pipe( - struct rndis_loopback_pipe *loopback_pipe); -static int rndis_ipa_create_loopback(struct rndis_ipa_dev *rndis_ipa_ctx); -static void rndis_ipa_destroy_loopback(struct rndis_ipa_dev *rndis_ipa_ctx); -static int rndis_ipa_setup_loopback(bool enable, - struct rndis_ipa_dev *rndis_ipa_ctx); -static int rndis_ipa_debugfs_loopback_open(struct inode *inode, - struct file *file); static int rndis_ipa_debugfs_atomic_open(struct inode *inode, struct file *file); static int rndis_ipa_debugfs_aggr_open(struct inode *inode, struct file *file); static ssize_t rndis_ipa_debugfs_aggr_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos); -static ssize_t rndis_ipa_debugfs_loopback_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); -static ssize_t rndis_ipa_debugfs_enable_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos); -static ssize_t rndis_ipa_debugfs_enable_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos); -static ssize_t rndis_ipa_debugfs_loopback_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos); static ssize_t rndis_ipa_debugfs_atomic_read(struct file *file, char __user *ubuf, size_t count, loff_t *ppos); static void rndis_ipa_dump_skb(struct sk_buff *skb); -static int rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx); +static void rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx); static void rndis_ipa_debugfs_destroy(struct rndis_ipa_dev *rndis_ipa_ctx); static int rndis_ipa_ep_registers_cfg(u32 usb_to_ipa_hdl, u32 ipa_to_usb_hdl, u32 max_xfer_size_bytes_to_dev, @@ -338,12 +288,6 @@ const struct file_operations rndis_ipa_debugfs_atomic_ops = { .read = rndis_ipa_debugfs_atomic_read, }; -const struct file_operations rndis_ipa_loopback_ops = { - .open = rndis_ipa_debugfs_loopback_open, - .read = rndis_ipa_debugfs_loopback_read, - .write = rndis_ipa_debugfs_loopback_write, -}; - const struct file_operations rndis_ipa_aggr_ops = { .open = rndis_ipa_debugfs_aggr_open, .write = rndis_ipa_debugfs_aggr_write, @@ -602,10 +546,7 @@ int rndis_ipa_init(struct ipa_usb_init_params *params) RNDIS_IPA_DEBUG("Needed headroom for RNDIS header set to %d\n", net->needed_headroom); - result = rndis_ipa_debugfs_init(rndis_ipa_ctx); - if (result) - goto fail_debugfs; - RNDIS_IPA_DEBUG("debugfs entries were created\n"); + rndis_ipa_debugfs_init(rndis_ipa_ctx); result = rndis_ipa_set_device_ethernet_addr(net->dev_addr, rndis_ipa_ctx->device_ethaddr); @@ -662,7 +603,6 @@ int rndis_ipa_init(struct ipa_usb_init_params *params) fail_set_device_ethernet: fail_hdrs_cfg: rndis_ipa_debugfs_destroy(rndis_ipa_ctx); -fail_debugfs: fail_netdev_priv: free_netdev(net); fail_alloc_etherdev: @@ -2182,10 +2122,11 @@ static void rndis_ipa_dump_skb(struct sk_buff *skb) skb->len); } +#ifdef CONFIG_DEBUG_FS /** * Creates the root folder for the driver */ -static int rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) +static void rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) { const mode_t flags_read_write = S_IRUGO | S_IWUGO; const mode_t flags_read_only = S_IRUGO; @@ -2196,7 +2137,7 @@ static int rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) RNDIS_IPA_LOG_ENTRY(); if (!rndis_ipa_ctx) - return -EINVAL; + return; rndis_ipa_ctx->directory = debugfs_create_dir(DEBUGFS_DIR_NAME, NULL); if (!rndis_ipa_ctx->directory) { @@ -2256,14 +2197,6 @@ static int rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) goto fail_file; } - file = debugfs_create_file("loopback_enable", flags_read_write, - rndis_ipa_ctx->directory, - rndis_ipa_ctx, &rndis_ipa_loopback_ops); - if (!file) { - RNDIS_IPA_ERROR("could not create outstanding file\n"); - goto fail_file; - } - file = debugfs_create_u8("state", flags_read_only, rndis_ipa_ctx->directory, (u8 *)&rndis_ipa_ctx->state); if (!file) { @@ -2378,13 +2311,14 @@ static int rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) goto fail_file; } + RNDIS_IPA_DEBUG("debugfs entries were created\n"); RNDIS_IPA_LOG_EXIT(); - return 0; + return; fail_file: debugfs_remove_recursive(rndis_ipa_ctx->directory); fail_directory: - return -EFAULT; + return; } static void rndis_ipa_debugfs_destroy(struct rndis_ipa_dev *rndis_ipa_ctx) @@ -2392,6 +2326,13 @@ static void rndis_ipa_debugfs_destroy(struct rndis_ipa_dev *rndis_ipa_ctx) debugfs_remove_recursive(rndis_ipa_ctx->directory); } +#else /* !CONFIG_DEBUG_FS */ + +static void rndis_ipa_debugfs_init(struct rndis_ipa_dev *rndis_ipa_ctx) {} + +static void rndis_ipa_debugfs_destroy(struct rndis_ipa_dev *rndis_ipa_ctx) {} + +#endif /* CONFIG_DEBUG_FS*/ static int rndis_ipa_debugfs_aggr_open(struct inode *inode, struct file *file) @@ -2419,59 +2360,6 @@ static ssize_t rndis_ipa_debugfs_aggr_write(struct file *file, return count; } -static int rndis_ipa_debugfs_loopback_open(struct inode *inode, - struct file *file) -{ - struct rndis_ipa_dev *rndis_ipa_ctx = inode->i_private; - file->private_data = rndis_ipa_ctx; - - return 0; -} - -static ssize_t rndis_ipa_debugfs_loopback_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos) -{ - int cnt; - struct rndis_ipa_dev *rndis_ipa_ctx = file->private_data; - - file->private_data = &rndis_ipa_ctx->loopback_enable; - - cnt = rndis_ipa_debugfs_enable_read(file, - ubuf, count, ppos); - - return cnt; -} - -static ssize_t rndis_ipa_debugfs_loopback_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - int retval; - int cnt; - struct rndis_ipa_dev *rndis_ipa_ctx = file->private_data; - bool old_state = rndis_ipa_ctx->loopback_enable; - - file->private_data = &rndis_ipa_ctx->loopback_enable; - - cnt = rndis_ipa_debugfs_enable_write(file, - buf, count, ppos); - - RNDIS_IPA_DEBUG("loopback_enable was set to:%d->%d\n", - old_state, rndis_ipa_ctx->loopback_enable); - - if (old_state == rndis_ipa_ctx->loopback_enable) { - RNDIS_IPA_ERROR("NOP - same state\n"); - return cnt; - } - - retval = rndis_ipa_setup_loopback( - rndis_ipa_ctx->loopback_enable, - rndis_ipa_ctx); - if (retval) - rndis_ipa_ctx->loopback_enable = old_state; - - return cnt; -} - static int rndis_ipa_debugfs_atomic_open(struct inode *inode, struct file *file) { struct rndis_ipa_dev *rndis_ipa_ctx = inode->i_private; @@ -2502,319 +2390,6 @@ static ssize_t rndis_ipa_debugfs_atomic_read(struct file *file, return simple_read_from_buffer(ubuf, count, ppos, atomic_str, nbytes); } -static ssize_t rndis_ipa_debugfs_enable_read(struct file *file, - char __user *ubuf, size_t count, loff_t *ppos) -{ - int nbytes; - int size = 0; - int ret; - loff_t pos; - u8 enable_str[sizeof(char)*3] = {0}; - bool *enable = file->private_data; - pos = *ppos; - nbytes = scnprintf(enable_str, sizeof(enable_str), "%d\n", *enable); - ret = simple_read_from_buffer(ubuf, count, ppos, enable_str, nbytes); - if (ret < 0) { - RNDIS_IPA_ERROR("simple_read_from_buffer problem\n"); - return ret; - } - size += ret; - count -= nbytes; - *ppos = pos + size; - return size; -} - -static ssize_t rndis_ipa_debugfs_enable_write(struct file *file, - const char __user *buf, size_t count, loff_t *ppos) -{ - unsigned long missing; - char input; - bool *enable = file->private_data; - if (count != sizeof(input) + 1) { - RNDIS_IPA_ERROR("wrong input length(%zd)\n", count); - return -EINVAL; - } - if (!buf) { - RNDIS_IPA_ERROR("Bad argument\n"); - return -EINVAL; - } - missing = copy_from_user(&input, buf, 1); - if (missing) - return -EFAULT; - RNDIS_IPA_DEBUG("input received %c\n", input); - *enable = input - '0'; - RNDIS_IPA_DEBUG("value was set to %d\n", *enable); - return count; -} - -/** - * Connects IPA->BAMDMA - * This shall simulate the path from IPA to USB - * Allowing the driver TX path - */ -static int rndis_ipa_loopback_pipe_create( - struct rndis_ipa_dev *rndis_ipa_ctx, - struct rndis_loopback_pipe *loopback_pipe) -{ - int retval; - - RNDIS_IPA_LOG_ENTRY(); - - /* SPS pipe has two side handshake - * This is the first handshake of IPA->BAMDMA, - * This is the IPA side - */ - loopback_pipe->ipa_connect_params.client = loopback_pipe->ipa_client; - loopback_pipe->ipa_connect_params.client_bam_hdl = - rndis_ipa_ctx->bam_dma_hdl; - loopback_pipe->ipa_connect_params.client_ep_idx = - loopback_pipe->peer_pipe_index; - loopback_pipe->ipa_connect_params.desc_fifo_sz = BAM_DMA_DESC_FIFO_SIZE; - loopback_pipe->ipa_connect_params.data_fifo_sz = BAM_DMA_DATA_FIFO_SIZE; - loopback_pipe->ipa_connect_params.notify = loopback_pipe->ipa_callback; - loopback_pipe->ipa_connect_params.priv = rndis_ipa_ctx; - loopback_pipe->ipa_connect_params.ipa_ep_cfg = - *(loopback_pipe->ipa_ep_cfg); - - /* loopback_pipe->ipa_sps_connect is out param */ - retval = ipa_connect(&loopback_pipe->ipa_connect_params, - &loopback_pipe->ipa_sps_connect, - &loopback_pipe->ipa_drv_ep_hdl); - if (retval) { - RNDIS_IPA_ERROR("ipa_connect() fail (%d)", retval); - return retval; - } - RNDIS_IPA_DEBUG("ipa_connect() succeeded, ipa_drv_ep_hdl=%d", - loopback_pipe->ipa_drv_ep_hdl); - - /* SPS pipe has two side handshake - * This is the second handshake of IPA->BAMDMA, - * This is the BAMDMA side - */ - loopback_pipe->dma_sps = sps_alloc_endpoint(); - if (!loopback_pipe->dma_sps) { - RNDIS_IPA_ERROR("sps_alloc_endpoint() failed "); - retval = -ENOMEM; - goto fail_sps_alloc; - } - - retval = sps_get_config(loopback_pipe->dma_sps, - &loopback_pipe->dma_connect); - if (retval) { - RNDIS_IPA_ERROR("sps_get_config() failed (%d)", retval); - goto fail_get_cfg; - } - - /* Start setting the non IPA ep for SPS driver*/ - loopback_pipe->dma_connect.mode = loopback_pipe->mode; - - /* SPS_MODE_DEST: DMA end point is the dest (consumer) IPA->DMA */ - if (loopback_pipe->mode == SPS_MODE_DEST) { - - loopback_pipe->dma_connect.source = - loopback_pipe->ipa_sps_connect.ipa_bam_hdl; - loopback_pipe->dma_connect.src_pipe_index = - loopback_pipe->ipa_sps_connect.ipa_ep_idx; - loopback_pipe->dma_connect.destination = - rndis_ipa_ctx->bam_dma_hdl; - loopback_pipe->dma_connect.dest_pipe_index = - loopback_pipe->peer_pipe_index; - - /* SPS_MODE_SRC: DMA end point is the source (producer) DMA->IPA */ - } else { - - loopback_pipe->dma_connect.source = - rndis_ipa_ctx->bam_dma_hdl; - loopback_pipe->dma_connect.src_pipe_index = - loopback_pipe->peer_pipe_index; - loopback_pipe->dma_connect.destination = - loopback_pipe->ipa_sps_connect.ipa_bam_hdl; - loopback_pipe->dma_connect.dest_pipe_index = - loopback_pipe->ipa_sps_connect.ipa_ep_idx; - - } - - loopback_pipe->dma_connect.desc = loopback_pipe->ipa_sps_connect.desc; - loopback_pipe->dma_connect.data = loopback_pipe->ipa_sps_connect.data; - loopback_pipe->dma_connect.event_thresh = 0x10; - /* BAM-to-BAM */ - loopback_pipe->dma_connect.options = SPS_O_AUTO_ENABLE; - - RNDIS_IPA_DEBUG("doing sps_connect() with - "); - RNDIS_IPA_DEBUG("src bam_hdl:0x%lx, src_pipe#:%d", - loopback_pipe->dma_connect.source, - loopback_pipe->dma_connect.src_pipe_index); - RNDIS_IPA_DEBUG("dst bam_hdl:0x%lx, dst_pipe#:%d", - loopback_pipe->dma_connect.destination, - loopback_pipe->dma_connect.dest_pipe_index); - - retval = sps_connect(loopback_pipe->dma_sps, - &loopback_pipe->dma_connect); - if (retval) { - RNDIS_IPA_ERROR("sps_connect() fail for BAMDMA side (%d)", - retval); - goto fail_sps_connect; - } - - RNDIS_IPA_LOG_EXIT(); - - return 0; - -fail_sps_connect: -fail_get_cfg: - sps_free_endpoint(loopback_pipe->dma_sps); -fail_sps_alloc: - ipa_disconnect(loopback_pipe->ipa_drv_ep_hdl); - return retval; -} - -static void rndis_ipa_destroy_loopback_pipe( - struct rndis_loopback_pipe *loopback_pipe) -{ - sps_disconnect(loopback_pipe->dma_sps); - sps_free_endpoint(loopback_pipe->dma_sps); -} - -/** - * rndis_ipa_create_loopback() - create a BAM-DMA loopback - * in order to replace the USB core - */ -static int rndis_ipa_create_loopback(struct rndis_ipa_dev *rndis_ipa_ctx) -{ - /* The BAM handle should be use as - * source/destination in the sps_connect() - */ - int retval; - - RNDIS_IPA_LOG_ENTRY(); - - - retval = sps_ctrl_bam_dma_clk(true); - if (retval) { - RNDIS_IPA_ERROR("fail on enabling BAM-DMA clocks"); - return -ENODEV; - } - - /* Get BAM handle instead of USB handle */ - rndis_ipa_ctx->bam_dma_hdl = sps_dma_get_bam_handle(); - if (!rndis_ipa_ctx->bam_dma_hdl) { - RNDIS_IPA_ERROR("sps_dma_get_bam_handle() failed"); - return -ENODEV; - } - RNDIS_IPA_DEBUG("sps_dma_get_bam_handle() succeeded (0x%x)", - rndis_ipa_ctx->bam_dma_hdl); - - /* IPA<-BAMDMA, NetDev Rx path (BAMDMA is the USB stub) */ - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.ipa_client = - IPA_CLIENT_USB_PROD; - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.peer_pipe_index = - FROM_USB_TO_IPA_BAMDMA; - /*DMA EP mode*/ - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.mode = SPS_MODE_SRC; - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.ipa_ep_cfg = - &usb_to_ipa_ep_cfg_deaggr_en; - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.ipa_callback = - rndis_ipa_packet_receive_notify; - RNDIS_IPA_DEBUG("setting up IPA<-BAMDAM pipe (RNDIS_IPA RX path)"); - retval = rndis_ipa_loopback_pipe_create(rndis_ipa_ctx, - &rndis_ipa_ctx->usb_to_ipa_loopback_pipe); - if (retval) { - RNDIS_IPA_ERROR("fail to close IPA->BAMDAM pipe"); - goto fail_to_usb; - } - RNDIS_IPA_DEBUG("IPA->BAMDAM pipe successfully connected (TX path)"); - - /* IPA->BAMDMA, NetDev Tx path (BAMDMA is the USB stub)*/ - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.ipa_client = - IPA_CLIENT_USB_CONS; - /*DMA EP mode*/ - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.mode = SPS_MODE_DEST; - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.ipa_ep_cfg = &ipa_to_usb_ep_cfg; - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.peer_pipe_index = - FROM_IPA_TO_USB_BAMDMA; - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.ipa_callback = - rndis_ipa_tx_complete_notify; - RNDIS_IPA_DEBUG("setting up IPA->BAMDAM pipe (RNDIS_IPA TX path)"); - retval = rndis_ipa_loopback_pipe_create(rndis_ipa_ctx, - &rndis_ipa_ctx->ipa_to_usb_loopback_pipe); - if (retval) { - RNDIS_IPA_ERROR("fail to close IPA<-BAMDAM pipe"); - goto fail_from_usb; - } - RNDIS_IPA_DEBUG("IPA<-BAMDAM pipe successfully connected(RX path)"); - - RNDIS_IPA_LOG_EXIT(); - - return 0; - -fail_from_usb: - rndis_ipa_destroy_loopback_pipe( - &rndis_ipa_ctx->usb_to_ipa_loopback_pipe); -fail_to_usb: - - return retval; -} - -static void rndis_ipa_destroy_loopback(struct rndis_ipa_dev *rndis_ipa_ctx) -{ - rndis_ipa_destroy_loopback_pipe( - &rndis_ipa_ctx->ipa_to_usb_loopback_pipe); - rndis_ipa_destroy_loopback_pipe( - &rndis_ipa_ctx->usb_to_ipa_loopback_pipe); - sps_dma_free_bam_handle(rndis_ipa_ctx->bam_dma_hdl); - if (sps_ctrl_bam_dma_clk(false)) - RNDIS_IPA_ERROR("fail to disable BAM-DMA clocks"); -} - -/** - * rndis_ipa_setup_loopback() - create/destroy a loopback on IPA HW - * (as USB pipes loopback) and notify RNDIS_IPA netdev for pipe connected - * @enable: flag that determines if the loopback should be created or destroyed - * @rndis_ipa_ctx: driver main context - * - * This function is the main loopback logic. - * It shall create/destory the loopback by using BAM-DMA and notify - * the netdev accordingly. - */ -static int rndis_ipa_setup_loopback(bool enable, - struct rndis_ipa_dev *rndis_ipa_ctx) -{ - int retval; - - if (!enable) { - rndis_ipa_destroy_loopback(rndis_ipa_ctx); - RNDIS_IPA_DEBUG("loopback destroy done"); - retval = rndis_ipa_pipe_disconnect_notify(rndis_ipa_ctx); - if (retval) { - RNDIS_IPA_ERROR("connect notify fail"); - return -ENODEV; - } - return 0; - } - - RNDIS_IPA_DEBUG("creating loopback (instead of USB core)"); - retval = rndis_ipa_create_loopback(rndis_ipa_ctx); - RNDIS_IPA_DEBUG("creating loopback- %s", (retval ? "FAIL" : "OK")); - if (retval) { - RNDIS_IPA_ERROR("Fail to connect loopback"); - return -ENODEV; - } - retval = rndis_ipa_pipe_connect_notify( - rndis_ipa_ctx->usb_to_ipa_loopback_pipe.ipa_drv_ep_hdl, - rndis_ipa_ctx->ipa_to_usb_loopback_pipe.ipa_drv_ep_hdl, - BAM_DMA_DATA_FIFO_SIZE, - 15, - BAM_DMA_DATA_FIFO_SIZE - rndis_ipa_ctx->net->mtu, - rndis_ipa_ctx); - if (retval) { - RNDIS_IPA_ERROR("connect notify fail"); - return -ENODEV; - } - - return 0; - -} - static int rndis_ipa_init_module(void) { pr_info("RNDIS_IPA module is loaded."); diff --git a/drivers/net/ethernet/ti/cpts.h b/drivers/net/ethernet/ti/cpts.h index 1a581ef7eee8f..69a46b92c7d6c 100644 --- a/drivers/net/ethernet/ti/cpts.h +++ b/drivers/net/ethernet/ti/cpts.h @@ -27,6 +27,7 @@ #include #include #include +#include struct cpsw_cpts { u32 idver; /* Identification and version */ diff --git a/drivers/net/ppp/ppp_generic.c b/drivers/net/ppp/ppp_generic.c index fc7b3d76f08e0..7efc451aaea94 100644 --- a/drivers/net/ppp/ppp_generic.c +++ b/drivers/net/ppp/ppp_generic.c @@ -2242,7 +2242,7 @@ int ppp_register_net_channel(struct net *net, struct ppp_channel *chan) pch->ppp = NULL; pch->chan = chan; - pch->chan_net = net; + pch->chan_net = get_net(net); chan->ppp = pch; init_ppp_file(&pch->file, CHANNEL); pch->file.hdrlen = chan->hdrlen; @@ -2339,6 +2339,8 @@ ppp_unregister_channel(struct ppp_channel *chan) spin_lock_bh(&pn->all_channels_lock); list_del(&pch->list); spin_unlock_bh(&pn->all_channels_lock); + put_net(pch->chan_net); + pch->chan_net = NULL; pch->file.dead = 1; wake_up_interruptible(&pch->file.rwait); diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index d3920b54a92ce..a1b47ea877fbf 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c @@ -217,7 +217,7 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) info->u->bSlaveInterface0); if (!info->control || !info->data) { dev_dbg(&intf->dev, - "master #%u/%p slave #%u/%p\n", + "master #%u/%pK slave #%u/%pK\n", info->u->bMasterInterface0, info->control, info->u->bSlaveInterface0, @@ -317,7 +317,7 @@ int usbnet_generic_cdc_bind(struct usbnet *dev, struct usb_interface *intf) info->data = usb_ifnum_to_if(dev->udev, 1); if (!info->control || !info->data || info->control != intf) { dev_dbg(&intf->dev, - "rndis: master #0/%p slave #1/%p\n", + "rndis: master #0/%pK slave #1/%pK\n", info->control, info->data); goto bad_desc; diff --git a/drivers/net/usb/cdc_mbim.c b/drivers/net/usb/cdc_mbim.c index 96fc8a5bde841..d11415bb9bb1d 100644 --- a/drivers/net/usb/cdc_mbim.c +++ b/drivers/net/usb/cdc_mbim.c @@ -473,7 +473,7 @@ static int cdc_mbim_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in) /* sanity checking */ if (((offset + len) > skb_in->len) || (len > ctx->rx_max)) { netif_dbg(dev, rx_err, dev->net, - "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%p\n", + "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%pK\n", x, offset, len, skb_in); if (!x) goto err_ndp; diff --git a/drivers/net/usb/cdc_ncm.c b/drivers/net/usb/cdc_ncm.c index 8067b8fbb0eea..d15220fed3c0f 100644 --- a/drivers/net/usb/cdc_ncm.c +++ b/drivers/net/usb/cdc_ncm.c @@ -849,7 +849,7 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ dev_dbg(&intf->dev, "failed to get mac address\n"); goto error2; } - dev_info(&intf->dev, "MAC-Address: %pM\n", dev->net->dev_addr); + dev_info(&intf->dev, "MAC-Address: %pKM\n", dev->net->dev_addr); } /* finish setting up the device specific data */ @@ -948,23 +948,15 @@ EXPORT_SYMBOL_GPL(cdc_ncm_select_altsetting); static int cdc_ncm_bind(struct usbnet *dev, struct usb_interface *intf) { - int ret; - /* MBIM backwards compatible function? */ if (cdc_ncm_select_altsetting(intf) != CDC_NCM_COMM_ALTSETTING_NCM) return -ENODEV; - /* The NCM data altsetting is fixed */ - ret = cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM); - - /* - * We should get an event when network connection is "connected" or - * "disconnected". Set network connection in "disconnected" state - * (carrier is OFF) during attach, so the IP network stack does not - * start IPv6 negotiation and more. + /* The NCM data altsetting is fixed, so we hard-coded it. + * Additionally, generic NCM devices are assumed to accept arbitrarily + * placed NDP. */ - usbnet_link_change(dev, 0, 0); - return ret; + return cdc_ncm_bind_common(dev, intf, CDC_NCM_DATA_ALTSETTING_NCM); } static void cdc_ncm_align_tail(struct sk_buff *skb, size_t modulus, size_t remainder, size_t max) @@ -1399,7 +1391,7 @@ int cdc_ncm_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in) if (((offset + len) > skb_in->len) || (len > ctx->rx_max) || (len < ETH_HLEN)) { netif_dbg(dev, rx_err, dev->net, - "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%p\n", + "invalid frame detected (ignored) offset[%u]=%u, length=%u, skb=%pK\n", x, offset, len, skb_in); if (!x) goto err_ndp; @@ -1506,7 +1498,8 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb) static const struct driver_info cdc_ncm_info = { .description = "CDC NCM", - .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET, + .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET + | FLAG_LINK_INTR, .bind = cdc_ncm_bind, .unbind = cdc_ncm_unbind, .manage_power = usbnet_manage_power, @@ -1519,7 +1512,7 @@ static const struct driver_info cdc_ncm_info = { static const struct driver_info wwan_info = { .description = "Mobile Broadband Network Device", .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET - | FLAG_WWAN, + | FLAG_LINK_INTR | FLAG_WWAN, .bind = cdc_ncm_bind, .unbind = cdc_ncm_unbind, .manage_power = usbnet_manage_power, @@ -1532,7 +1525,7 @@ static const struct driver_info wwan_info = { static const struct driver_info wwan_noarp_info = { .description = "Mobile Broadband Network Device (NO ARP)", .flags = FLAG_POINTTOPOINT | FLAG_NO_SETINT | FLAG_MULTI_PACKET - | FLAG_WWAN | FLAG_NOARP, + | FLAG_LINK_INTR | FLAG_WWAN | FLAG_NOARP, .bind = cdc_ncm_bind, .unbind = cdc_ncm_unbind, .manage_power = usbnet_manage_power, diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 2516b45cd08ae..d1be46bbdd80f 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c @@ -2211,7 +2211,7 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) if (status) goto free_padding_pkt; netif_info(dev, probe, dev->net, - "register '%s' at usb-%s-%s, %s, %pM\n", + "register '%s' at usb-%s-%s, %s, %pKM\n", udev->dev.driver->name, xdev->bus->bus_name, xdev->devpath, dev->driver_info->description, diff --git a/drivers/net/wireless/ath/wil6210/Kconfig b/drivers/net/wireless/ath/wil6210/Kconfig index 5d0e03694e511..4507003862a6d 100644 --- a/drivers/net/wireless/ath/wil6210/Kconfig +++ b/drivers/net/wireless/ath/wil6210/Kconfig @@ -41,6 +41,17 @@ config WIL6210_TRACING If unsure, say Y to make it easier to debug problems. +config WIL6210_WRITE_IOCTL + bool "wil6210 write ioctl to the device" + depends on WIL6210 + default n + ---help--- + Say Y here to allow write-access from user-space to + the device memory through ioctl. This is useful for + debugging purposes only. + + If unsure, say N. + config WIL6210_PLATFORM_MSM bool "wil6210 MSM platform specific support" depends on WIL6210 diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c index b20f56461d775..e0aebd36ca213 100644 --- a/drivers/net/wireless/ath/wil6210/cfg80211.c +++ b/drivers/net/wireless/ath/wil6210/cfg80211.c @@ -696,6 +696,9 @@ int wil_cfg80211_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, wil_dbg_misc(wil, "%s()\n", __func__); print_hex_dump_bytes("mgmt tx frame ", DUMP_PREFIX_OFFSET, buf, len); + if (len < sizeof(struct ieee80211_mgmt)) + return -EINVAL; + cmd = kmalloc(sizeof(*cmd) + len, GFP_KERNEL); if (!cmd) { rc = -ENOMEM; diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c index 63d5c2819ea7e..81a85da6730ca 100644 --- a/drivers/net/wireless/ath/wil6210/debugfs.c +++ b/drivers/net/wireless/ath/wil6210/debugfs.c @@ -807,8 +807,12 @@ static ssize_t wil_write_file_txmgmt(struct file *file, const char __user *buf, struct wireless_dev *wdev = wil_to_wdev(wil); struct cfg80211_mgmt_tx_params params; int rc; - void *frame = kmalloc(len, GFP_KERNEL); + void *frame; + if (!len) + return -EINVAL; + + frame = kmalloc(len, GFP_KERNEL); if (!frame) return -ENOMEM; diff --git a/drivers/net/wireless/ath/wil6210/ioctl.c b/drivers/net/wireless/ath/wil6210/ioctl.c index 47058ccccb5bc..bbdd232df3b76 100644 --- a/drivers/net/wireless/ath/wil6210/ioctl.c +++ b/drivers/net/wireless/ath/wil6210/ioctl.c @@ -87,10 +87,12 @@ static int wil_ioc_memio_dword(struct wil6210_priv *wil, void __user *data) io.val = readl(a); need_copy = true; break; +#if defined(CONFIG_WIL6210_WRITE_IOCTL) case wil_mmio_write: writel(io.val, a); wmb(); /* make sure write propagated to HW */ break; +#endif default: wil_err(wil, "Unsupported operation, op = 0x%08x\n", io.op); return -EINVAL; @@ -147,6 +149,7 @@ static int wil_ioc_memio_block(struct wil6210_priv *wil, void __user *data) goto out_free; } break; +#if defined(CONFIG_WIL6210_WRITE_IOCTL) case wil_mmio_write: if (copy_from_user(block, io.block, io.size)) { rc = -EFAULT; @@ -156,6 +159,7 @@ static int wil_ioc_memio_block(struct wil6210_priv *wil, void __user *data) wmb(); /* make sure write propagated to HW */ wil_hex_dump_ioctl("Write ", block, io.size); break; +#endif default: wil_err(wil, "Unsupported operation, op = 0x%08x\n", io.op); rc = -EINVAL; diff --git a/drivers/net/wireless/cnss/cnss_common.h b/drivers/net/wireless/cnss/cnss_common.h index 07ef9844b6db1..eb6796fc493f5 100644 --- a/drivers/net/wireless/cnss/cnss_common.h +++ b/drivers/net/wireless/cnss/cnss_common.h @@ -13,7 +13,6 @@ #ifndef _NET_CNSS_COMMON_H_ #define _NET_CNSS_COMMON_H_ -#define MAX_FIRMWARE_SIZE (1 * 1024 * 1024) /* max 20mhz channel count */ #define CNSS_MAX_CH_NUM 45 diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c index f55eab39e3416..00bcc12d14061 100644 --- a/drivers/net/wireless/cnss/cnss_pci.c +++ b/drivers/net/wireless/cnss/cnss_pci.c @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include #include #include @@ -56,8 +58,12 @@ #define VREG_ON 1 #define VREG_OFF 0 +#define WLAN_EN_HIGH 1 +#define WLAN_EN_LOW 0 #define PCIE_LINK_UP 1 #define PCIE_LINK_DOWN 0 +#define WLAN_BOOTSTRAP_HIGH 1 +#define WLAN_BOOTSTRAP_LOW 0 #define CNSS_DUMP_FORMAT_VER 0x11 #define CNSS_DUMP_MAGIC_VER_V2 0x42445953 #define CNSS_DUMP_NAME "CNSS_WLAN" @@ -86,6 +92,8 @@ #define WLAN_VREG_SP2T_NAME "vdd-wlan-sp2t" #define WLAN_SWREG_NAME "wlan-soc-swreg" #define WLAN_ANT_SWITCH_NAME "wlan-ant-switch" +#define WLAN_EN_GPIO_NAME "wlan-en-gpio" +#define WLAN_BOOTSTRAP_GPIO_NAME "wlan-bootstrap-gpio" #define PM_OPTIONS 0 #define PM_OPTIONS_SUSPEND_LINK_DOWN \ (MSM_PCIE_CONFIG_NO_CFG_RESTORE | MSM_PCIE_CONFIG_LINKDOWN) @@ -114,12 +122,7 @@ #define PCIE_ENABLE_DELAY 100 #define WLAN_BOOTSTRAP_DELAY 10 #define EVICT_BIN_MAX_SIZE (512*1024) - -/*wlan enable and bootstrap pinctrl state */ -#define WLAN_EN_ACTIVE "wlan_en_active" -#define WLAN_EN_SLEEP "wlan_en_sleep" -#define BOOTSTRAP_ACTIVE "bootstrap_active" -#define BOOTSTRAP_SLEEP "bootstrap_sleep" +#define CNSS_PINCTRL_STATE_ACTIVE "default" static DEFINE_SPINLOCK(pci_link_down_lock); @@ -143,13 +146,14 @@ static DEFINE_SPINLOCK(pci_link_down_lock); #define BMI_TEST_SETUP (0x09) -struct cnss_wlan_pinctrl { - bool bootstrap_enable; +struct cnss_wlan_gpio_info { + char *name; + u32 num; + bool state; + bool init; + bool prop; struct pinctrl *pinctrl; - struct pinctrl_state *wlan_en_active; - struct pinctrl_state *wlan_en_sleep; - struct pinctrl_state *bootstrap_active; - struct pinctrl_state *bootstrap_sleep; + struct pinctrl_state *gpio_state_default; }; struct cnss_wlan_vreg_info { @@ -236,8 +240,8 @@ static struct cnss_data { dma_addr_t smmu_iova_start; size_t smmu_iova_len; struct cnss_wlan_vreg_info vreg_info; - struct cnss_wlan_pinctrl cnss_pinctrl; bool wlan_en_vreg_support; + struct cnss_wlan_gpio_info gpio_info; bool pcie_link_state; bool pcie_link_down_ind; bool pci_register_again; @@ -245,7 +249,7 @@ static struct cnss_data { struct pci_saved_state *saved_state; u16 revision_id; bool recovery_in_progress; - bool fw_available; + atomic_t fw_available; struct codeswap_codeseg_info *cnss_seg_info; /* Virtual Address of the DMA page */ void *codeseg_cpuaddr[CODESWAP_MAX_CODESEGS]; @@ -274,11 +278,14 @@ static struct cnss_data { u32 fw_dma_size; u32 fw_seg_count; struct segment_memory fw_seg_mem[MAX_NUM_OF_SEGMENTS]; + /* Firmware setup complete lock */ + struct mutex fw_setup_stat_lock; void *bdata_cpu; dma_addr_t bdata_dma; u32 bdata_dma_size; u32 bdata_seg_count; struct segment_memory bdata_seg_mem[MAX_NUM_OF_SEGMENTS]; + int wlan_bootstrap_gpio; atomic_t auto_suspended; bool monitor_wake_intr; struct cnss_dual_wifi dual_wifi_info; @@ -289,6 +296,17 @@ module_param(pcie_link_down_panic, uint, S_IRUSR | S_IWUSR); MODULE_PARM_DESC(pcie_link_down_panic, "Trigger kernel panic when PCIe link down is detected"); +static void cnss_put_wlan_enable_gpio(void) +{ + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; + struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; + + if (penv->wlan_en_vreg_support) + regulator_put(vreg_info->wlan_en_reg); + else + gpio_free(gpio_info->num); +} + static int cnss_wlan_vreg_on(struct cnss_wlan_vreg_info *vreg_info) { int ret; @@ -495,130 +513,127 @@ static int cnss_wlan_vreg_set(struct cnss_wlan_vreg_info *vreg_info, bool state) return ret; } -static int cnss_wlan_enable_pin_set_state( - struct cnss_wlan_pinctrl *cnss_pinctrl, - struct cnss_wlan_vreg_info *vreg_info, - bool state) +static int cnss_wlan_gpio_init(struct cnss_wlan_gpio_info *info) { - int ret; + int ret = 0; - if (state) - goto set_wlan_pin_active; + ret = gpio_request(info->num, info->name); - if (penv->wlan_en_vreg_support) - ret = regulator_disable(vreg_info->wlan_en_reg); - else - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->wlan_en_sleep); - msleep(WLAN_ENABLE_DELAY); + if (ret) { + pr_err("can't get gpio %s ret %d\n", info->name, ret); + goto err_gpio_req; + } + + ret = gpio_direction_output(info->num, info->init); + + if (ret) { + pr_err("can't set gpio direction %s ret %d\n", info->name, ret); + goto err_gpio_dir; + } + info->state = info->init; return ret; -set_wlan_pin_active: +err_gpio_dir: + gpio_free(info->num); - if (penv->wlan_en_vreg_support) - ret = regulator_enable(vreg_info->wlan_en_reg); - else - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->wlan_en_active); - msleep(WLAN_ENABLE_DELAY); +err_gpio_req: return ret; } -static int cnss_select_pinctrl_active( - struct cnss_wlan_pinctrl *cnss_pinctrl, bool active) +static int cnss_wlan_bootstrap_gpio_init(void) { - int ret; - struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; - - if (!active) - goto select_sleep_state; + int ret = 0; - if (cnss_pinctrl->bootstrap_enable) { - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->bootstrap_active); - msleep(WLAN_BOOTSTRAP_DELAY); + ret = gpio_request(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_GPIO_NAME); + if (ret) { + pr_err("%s: Can't get GPIO %s, ret = %d\n", + __func__, WLAN_BOOTSTRAP_GPIO_NAME, ret); + goto out; } - ret = cnss_wlan_enable_pin_set_state(cnss_pinctrl, vreg_info, true); - return ret; - -select_sleep_state: - if (cnss_pinctrl->bootstrap_enable) { - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->bootstrap_sleep); - msleep(WLAN_BOOTSTRAP_DELAY); + ret = gpio_direction_output(penv->wlan_bootstrap_gpio, + WLAN_BOOTSTRAP_HIGH); + if (ret) { + pr_err("%s: Can't set GPIO %s direction, ret = %d\n", + __func__, WLAN_BOOTSTRAP_GPIO_NAME, ret); + gpio_free(penv->wlan_bootstrap_gpio); + goto out; } - ret = cnss_wlan_enable_pin_set_state(cnss_pinctrl, vreg_info, false); + msleep(WLAN_BOOTSTRAP_DELAY); +out: return ret; } -static int cnss_pinctrl_init( - struct cnss_wlan_pinctrl *cnss_pinctrl, - struct device *dev) +static void cnss_wlan_gpio_set(struct cnss_wlan_gpio_info *info, bool state) { - int ret = 0; - struct device_node *node = dev->of_node; + if (!info->prop) + return; - cnss_pinctrl->pinctrl = devm_pinctrl_get(dev); - if (IS_ERR_OR_NULL(cnss_pinctrl->pinctrl)) { - pr_err("%s:Failed to get pinctrl!\n", __func__); - return PTR_ERR(cnss_pinctrl->pinctrl); + if (info->state == state) { + pr_debug("Already %s gpio is %s\n", + info->name, state ? "high" : "low"); + return; } - if (penv->wlan_en_vreg_support) - goto skip_wlan_enable_pin_config; - - cnss_pinctrl->wlan_en_active = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, WLAN_EN_ACTIVE); - if (IS_ERR_OR_NULL(cnss_pinctrl->wlan_en_active)) { - pr_err("%s:Failed to get wlan_en active state!\n", __func__); - return PTR_ERR(cnss_pinctrl->wlan_en_active); + if (state == WLAN_EN_LOW && penv->dual_wifi_info.is_dual_wifi_enabled) { + pr_debug("%s Dual WiFi enabled\n", __func__); + return; } - cnss_pinctrl->wlan_en_sleep = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, WLAN_EN_SLEEP); - if (IS_ERR_OR_NULL(cnss_pinctrl->wlan_en_sleep)) { - pr_err("%s:Failed to get wlan_en sleep state!\n", __func__); - return PTR_ERR(cnss_pinctrl->wlan_en_sleep); + gpio_set_value(info->num, state); + info->state = state; + + pr_debug("%s: %s gpio is now %s\n", __func__, + info->name, info->state ? "enabled" : "disabled"); +} + +static int cnss_configure_wlan_en_gpio(bool state) +{ + int ret = 0; + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; + struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; + + if (penv->wlan_en_vreg_support) { + if (state) + ret = regulator_enable(vreg_info->wlan_en_reg); + else + ret = regulator_disable(vreg_info->wlan_en_reg); + } else { + cnss_wlan_gpio_set(gpio_info, state); } - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->wlan_en_active); msleep(WLAN_ENABLE_DELAY); + return ret; +} -skip_wlan_enable_pin_config: - cnss_pinctrl->bootstrap_enable = - of_property_read_bool(node, "qcom,enable-bootstrap-gpio"); - - if (!cnss_pinctrl->bootstrap_enable) - goto end; +static int cnss_pinctrl_init(struct cnss_wlan_gpio_info *gpio_info, + struct platform_device *pdev) +{ + int ret; - cnss_pinctrl->bootstrap_active = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, BOOTSTRAP_ACTIVE); - if (IS_ERR_OR_NULL(cnss_pinctrl->bootstrap_active)) { - pr_err("%s:Failed to get bootstrap active state!\n", __func__); - return PTR_ERR(cnss_pinctrl->bootstrap_active); + gpio_info->pinctrl = devm_pinctrl_get(&pdev->dev); + if (IS_ERR_OR_NULL(gpio_info->pinctrl)) { + pr_err("%s: Failed to get pinctrl!\n", __func__); + return PTR_ERR(gpio_info->pinctrl); } - cnss_pinctrl->bootstrap_sleep = - pinctrl_lookup_state(cnss_pinctrl->pinctrl, BOOTSTRAP_SLEEP); - if (IS_ERR_OR_NULL(cnss_pinctrl->bootstrap_sleep)) { - pr_err("%s:Failed to get bootstrap sleep state!\n", __func__); - return PTR_ERR(cnss_pinctrl->bootstrap_sleep); + gpio_info->gpio_state_default = pinctrl_lookup_state(gpio_info->pinctrl, + CNSS_PINCTRL_STATE_ACTIVE); + if (IS_ERR_OR_NULL(gpio_info->gpio_state_default)) { + pr_err("%s: Can not get active pin state!\n", __func__); + return PTR_ERR(gpio_info->gpio_state_default); } - ret = pinctrl_select_state( - cnss_pinctrl->pinctrl, cnss_pinctrl->bootstrap_active); - msleep(WLAN_BOOTSTRAP_DELAY); + ret = pinctrl_select_state(gpio_info->pinctrl, + gpio_info->gpio_state_default); -end: return ret; } -static void cnss_disable_xtal_ldo(void) +static void cnss_disable_xtal_ldo(struct platform_device *pdev) { struct cnss_wlan_vreg_info *info = &penv->vreg_info; @@ -633,16 +648,17 @@ static void cnss_disable_xtal_ldo(void) } } -static int cnss_enable_xtal_ldo(struct device *dev) +static int cnss_enable_xtal_ldo(struct platform_device *pdev) { int ret = 0; struct cnss_wlan_vreg_info *info = &penv->vreg_info; - struct device_node *node = dev->of_node; - if (!of_get_property(node, WLAN_VREG_XTAL_AON_NAME "-supply", NULL)) + if (!of_get_property(pdev->dev.of_node, + WLAN_VREG_XTAL_AON_NAME "-supply", NULL)) goto enable_xtal; - info->wlan_reg_xtal_aon = regulator_get(dev, WLAN_VREG_XTAL_AON_NAME); + info->wlan_reg_xtal_aon = regulator_get(&pdev->dev, + WLAN_VREG_XTAL_AON_NAME); if (IS_ERR(info->wlan_reg_xtal_aon)) { ret = PTR_ERR(info->wlan_reg_xtal_aon); pr_err("%s: XTAL AON Regulator get failed err:%d\n", __func__, @@ -658,10 +674,11 @@ static int cnss_enable_xtal_ldo(struct device *dev) enable_xtal: - if (!of_get_property(node, WLAN_VREG_XTAL_NAME "-supply", NULL)) + if (!of_get_property(pdev->dev.of_node, + WLAN_VREG_XTAL_NAME "-supply", NULL)) goto out_disable_xtal_aon; - info->wlan_reg_xtal = regulator_get(dev, WLAN_VREG_XTAL_NAME); + info->wlan_reg_xtal = regulator_get(&pdev->dev, WLAN_VREG_XTAL_NAME); if (IS_ERR(info->wlan_reg_xtal)) { ret = PTR_ERR(info->wlan_reg_xtal); @@ -699,15 +716,73 @@ static int cnss_enable_xtal_ldo(struct device *dev) return ret; } -static int cnss_wlan_enable_vreg_regulators(struct device *dev) +static int cnss_get_wlan_enable_gpio( + struct cnss_wlan_gpio_info *gpio_info, + struct platform_device *pdev) +{ + int ret = 0; + struct device *dev = &pdev->dev; + + if (!of_find_property(dev->of_node, gpio_info->name, NULL)) { + gpio_info->prop = false; + return -ENODEV; + } + + gpio_info->prop = true; + ret = of_get_named_gpio(dev->of_node, gpio_info->name, 0); + if (ret >= 0) { + gpio_info->num = ret; + } else { + if (ret == -EPROBE_DEFER) + pr_debug("get WLAN_EN GPIO probe defer\n"); + else + pr_err( + "can't get gpio %s ret %d", gpio_info->name, ret); + } + + ret = cnss_pinctrl_init(gpio_info, pdev); + if (ret) + pr_debug("%s: pinctrl init failed!\n", __func__); + + ret = cnss_wlan_gpio_init(gpio_info); + if (ret) + pr_err("gpio init failed\n"); + + return ret; +} + +static int cnss_get_wlan_bootstrap_gpio(struct platform_device *pdev) { int ret = 0; + struct device_node *node = (&pdev->dev)->of_node; + + if (!of_find_property(node, WLAN_BOOTSTRAP_GPIO_NAME, NULL)) + return ret; + + penv->wlan_bootstrap_gpio = + of_get_named_gpio(node, WLAN_BOOTSTRAP_GPIO_NAME, 0); + if (penv->wlan_bootstrap_gpio > 0) { + ret = cnss_wlan_bootstrap_gpio_init(); + } else { + ret = penv->wlan_bootstrap_gpio; + pr_err( + "%s: Can't get GPIO %s, ret = %d", + __func__, WLAN_BOOTSTRAP_GPIO_NAME, ret); + } + + return ret; +} + +static int cnss_wlan_get_resources(struct platform_device *pdev) +{ + int ret = 0; + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; - struct device_node *node = dev->of_node; + struct device_node *node = pdev->dev.of_node; if (of_get_property(node, WLAN_VREG_CORE_NAME "-supply", NULL)) { - vreg_info->wlan_reg_core = - regulator_get(dev, WLAN_VREG_CORE_NAME); + vreg_info->wlan_reg_core = regulator_get(&pdev->dev, + WLAN_VREG_CORE_NAME); if (IS_ERR(vreg_info->wlan_reg_core)) { ret = PTR_ERR(vreg_info->wlan_reg_core); @@ -736,7 +811,8 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) } if (of_get_property(node, WLAN_VREG_IO_NAME "-supply", NULL)) { - vreg_info->wlan_reg_io = regulator_get(dev, WLAN_VREG_IO_NAME); + vreg_info->wlan_reg_io = regulator_get(&pdev->dev, + WLAN_VREG_IO_NAME); if (!IS_ERR(vreg_info->wlan_reg_io)) { ret = regulator_set_voltage(vreg_info->wlan_reg_io, WLAN_VREG_IO_MIN, WLAN_VREG_IO_MAX); @@ -758,10 +834,10 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) } } - if (cnss_enable_xtal_ldo(dev)) + if (cnss_enable_xtal_ldo(pdev)) goto err_reg_xtal_enable; - vreg_info->wlan_reg = regulator_get(dev, WLAN_VREG_NAME); + vreg_info->wlan_reg = regulator_get(&pdev->dev, WLAN_VREG_NAME); if (IS_ERR(vreg_info->wlan_reg)) { if (PTR_ERR(vreg_info->wlan_reg) == -EPROBE_DEFER) @@ -781,7 +857,7 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) if (of_get_property(node, WLAN_VREG_SP2T_NAME "-supply", NULL)) { vreg_info->wlan_reg_sp2t = - regulator_get(dev, WLAN_VREG_SP2T_NAME); + regulator_get(&pdev->dev, WLAN_VREG_SP2T_NAME); if (!IS_ERR(vreg_info->wlan_reg_sp2t)) { ret = regulator_set_voltage(vreg_info->wlan_reg_sp2t, WLAN_VREG_SP2T_MIN, WLAN_VREG_SP2T_MAX); @@ -802,7 +878,7 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) if (of_get_property(node, WLAN_ANT_SWITCH_NAME "-supply", NULL)) { vreg_info->ant_switch = - regulator_get(dev, WLAN_ANT_SWITCH_NAME); + regulator_get(&pdev->dev, WLAN_ANT_SWITCH_NAME); if (!IS_ERR(vreg_info->ant_switch)) { ret = regulator_set_voltage(vreg_info->ant_switch, WLAN_ANT_SWITCH_VOLT_MIN, @@ -834,7 +910,8 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) penv->cap.cap_flag |= CNSS_HAS_UART_ACCESS; if (of_get_property(node, WLAN_SWREG_NAME "-supply", NULL)) { - vreg_info->soc_swreg = regulator_get(dev, WLAN_SWREG_NAME); + vreg_info->soc_swreg = regulator_get(&pdev->dev, + WLAN_SWREG_NAME); if (IS_ERR(vreg_info->soc_swreg)) { pr_err("%s: soc-swreg node not found\n", __func__); @@ -858,19 +935,36 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) penv->wlan_en_vreg_support = of_property_read_bool(node, "qcom,wlan-en-vreg-support"); if (penv->wlan_en_vreg_support) { - vreg_info->wlan_en_reg = regulator_get(dev, WLAN_EN_VREG_NAME); + vreg_info->wlan_en_reg = + regulator_get(&pdev->dev, WLAN_EN_VREG_NAME); if (IS_ERR(vreg_info->wlan_en_reg)) { pr_err("%s:wlan_en vreg get failed\n", __func__); ret = PTR_ERR(vreg_info->wlan_en_reg); goto err_wlan_en_reg_get; } - - ret = regulator_enable(vreg_info->wlan_en_reg); } + if (!penv->wlan_en_vreg_support) { + ret = cnss_get_wlan_enable_gpio(gpio_info, pdev); + if (ret) { + pr_err( + "%s:Failed to config the WLAN_EN gpio\n", __func__); + goto err_gpio_wlan_en; + } + } vreg_info->state = VREG_ON; + + ret = cnss_get_wlan_bootstrap_gpio(pdev); + if (ret) { + pr_err("%s: Failed to enable wlan bootstrap gpio\n", __func__); + goto err_gpio_wlan_bootstrap; + } + return ret; +err_gpio_wlan_bootstrap: + cnss_put_wlan_enable_gpio(); +err_gpio_wlan_en: err_wlan_en_reg_get: vreg_info->wlan_en_reg = NULL; if (vreg_info->soc_swreg) @@ -902,7 +996,7 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) err_reg_enable: regulator_put(vreg_info->wlan_reg); err_reg_get: - cnss_disable_xtal_ldo(); + cnss_disable_xtal_ldo(pdev); err_reg_xtal_enable: if (vreg_info->wlan_reg_io) @@ -926,15 +1020,15 @@ static int cnss_wlan_enable_vreg_regulators(struct device *dev) static void cnss_wlan_release_resources(void) { + struct cnss_wlan_gpio_info *gpio_info = &penv->gpio_info; struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; + if (penv->wlan_bootstrap_gpio > 0) + gpio_free(penv->wlan_bootstrap_gpio); + cnss_put_wlan_enable_gpio(); + gpio_info->state = WLAN_EN_LOW; + gpio_info->prop = false; cnss_wlan_vreg_set(vreg_info, VREG_OFF); - if (penv->wlan_en_vreg_support) { - if (vreg_info->wlan_en_reg) { - regulator_disable(vreg_info->wlan_en_reg); - regulator_put(vreg_info->wlan_en_reg); - } - } if (vreg_info->soc_swreg) regulator_put(vreg_info->soc_swreg); if (vreg_info->ant_switch) @@ -953,31 +1047,6 @@ static void cnss_wlan_release_resources(void) vreg_info->state = VREG_OFF; } -static int cnss_wlan_get_resources(struct platform_device *pdev) -{ - int ret = 0; - struct device *dev = &pdev->dev; - struct cnss_wlan_pinctrl *cnss_pinctrl = &penv->cnss_pinctrl; - - ret = cnss_wlan_enable_vreg_regulators(dev); - if (ret) { - pr_err("%s: failed to enable the vreg_regulators\n", __func__); - return ret; - } - - ret = cnss_pinctrl_init(cnss_pinctrl, dev); - if (ret) { - pr_err("%s: pinctrl init failed!\n", __func__); - goto err_pinctrl_init; - } - - return ret; - -err_pinctrl_init: - cnss_wlan_release_resources(); - return ret; -} - static u8 cnss_get_pci_dev_bus_number(struct pci_dev *pdev) { return pdev->bus->number; @@ -1365,10 +1434,12 @@ int cnss_get_fw_image(struct image_desc_info *image_desc_info) !penv->fw_seg_count || !penv->bdata_seg_count) return -EINVAL; + mutex_lock(&penv->fw_setup_stat_lock); image_desc_info->fw_addr = penv->fw_dma; image_desc_info->fw_size = penv->fw_dma_size; image_desc_info->bdata_addr = penv->bdata_dma; image_desc_info->bdata_size = penv->bdata_dma_size; + mutex_unlock(&penv->fw_setup_stat_lock); return 0; } @@ -1550,7 +1621,6 @@ static int cnss_wlan_pci_probe(struct pci_dev *pdev, { int ret = 0; struct cnss_wlan_vreg_info *vreg_info = &penv->vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl = &penv->cnss_pinctrl; void *cpu_addr; dma_addr_t dma_handle; struct codeswap_codeseg_info *cnss_seg_info = NULL; @@ -1558,7 +1628,7 @@ static int cnss_wlan_pci_probe(struct pci_dev *pdev, penv->pdev = pdev; penv->id = id; - penv->fw_available = false; + atomic_set(&penv->fw_available, 0); penv->device_id = pdev->device; if (penv->smmu_iova_len) { @@ -1609,19 +1679,17 @@ static int cnss_wlan_pci_probe(struct pci_dev *pdev, penv->pcie_link_state = PCIE_LINK_DOWN; } - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - if (ret) { - pr_err("%s:Failed to enable wlan_en pin\n", __func__); - goto err_pcie_suspend; - } - + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); ret = cnss_wlan_vreg_set(vreg_info, VREG_OFF); + if (ret) { pr_err("can't turn off wlan vreg\n"); goto err_pcie_suspend; } + mutex_lock(&penv->fw_setup_stat_lock); cnss_wlan_fw_mem_alloc(pdev); + mutex_unlock(&penv->fw_setup_stat_lock); ret = device_create_file(&penv->pldev->dev, &dev_attr_wlan_setup); @@ -1868,8 +1936,13 @@ static ssize_t fw_image_setup_store(struct device *dev, if (!penv) return -ENODEV; - if (sscanf(buf, "%d", &val) != 1) + mutex_lock(&penv->fw_setup_stat_lock); + pr_info("%s: Firmware setup in progress\n", __func__); + + if (kstrtoint(buf, 0, &val)) { + mutex_unlock(&penv->fw_setup_stat_lock); return -EINVAL; + } if (val == FW_IMAGE_FTM || val == FW_IMAGE_MISSION || val == FW_IMAGE_BDATA) { @@ -1878,6 +1951,7 @@ static ssize_t fw_image_setup_store(struct device *dev, if (ret != 0) { pr_err("%s: Invalid parsing of FW image files %d", __func__, ret); + mutex_unlock(&penv->fw_setup_stat_lock); return -EINVAL; } penv->fw_image_setup = val; @@ -1887,6 +1961,8 @@ static ssize_t fw_image_setup_store(struct device *dev, penv->bmi_test = val; } + pr_info("%s: Firmware setup completed\n", __func__); + mutex_unlock(&penv->fw_setup_stat_lock); return count; } @@ -1985,16 +2061,21 @@ int cnss_get_codeswap_struct(struct codeswap_codeseg_info *swap_seg) { struct codeswap_codeseg_info *cnss_seg_info = penv->cnss_seg_info; + mutex_lock(&penv->fw_setup_stat_lock); if (!cnss_seg_info) { swap_seg = NULL; + mutex_unlock(&penv->fw_setup_stat_lock); return -ENOENT; } - if (!penv->fw_available) { + + if (!atomic_read(&penv->fw_available)) { pr_debug("%s: fw is not available\n", __func__); + mutex_unlock(&penv->fw_setup_stat_lock); return -ENOENT; } *swap_seg = *cnss_seg_info; + mutex_unlock(&penv->fw_setup_stat_lock); return 0; } @@ -2014,27 +2095,32 @@ static void cnss_wlan_memory_expansion(void) struct pci_dev *pdev; filename = cnss_wlan_get_evicted_data_file(); + mutex_lock(&penv->fw_setup_stat_lock); pdev = penv->pdev; dev = &pdev->dev; cnss_seg_info = penv->cnss_seg_info; if (!cnss_seg_info) { pr_debug("cnss: cnss_seg_info is NULL\n"); + mutex_unlock(&penv->fw_setup_stat_lock); goto end; } - if (penv->fw_available) { + if (atomic_read(&penv->fw_available)) { pr_debug("cnss: fw code already copied to host memory\n"); + mutex_unlock(&penv->fw_setup_stat_lock); goto end; } if (request_firmware(&fw_entry, filename, dev) != 0) { pr_debug("cnss: failed to get fw: %s\n", filename); + mutex_unlock(&penv->fw_setup_stat_lock); goto end; } if (!fw_entry || !fw_entry->data) { pr_err("%s: INVALID FW entries\n", __func__); + mutex_unlock(&penv->fw_setup_stat_lock); goto release_fw; } @@ -2069,7 +2155,9 @@ static void cnss_wlan_memory_expansion(void) } pr_debug("cnss: total_bytes copied: %d\n", total_length); cnss_seg_info->codeseg_total_bytes = total_length; - penv->fw_available = 1; + + atomic_set(&penv->fw_available, 1); + mutex_unlock(&penv->fw_setup_stat_lock); release_fw: release_firmware(fw_entry); @@ -2206,7 +2294,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) int probe_again = 0; struct cnss_wlan_driver *wdrv; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; struct pci_dev *pdev; if (!penv) @@ -2214,7 +2302,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) wdrv = penv->driver; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; pdev = penv->pdev; if (!wdrv) { @@ -2230,11 +2318,15 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) pr_err("wlan vreg ON failed\n"); goto err_wlan_vreg_on; } + msleep(POWER_ON_DELAY); - ret = cnss_select_pinctrl_active(cnss_pinctrl, true); - if (ret) - pr_err("%s:Failed to set cnss pin active state\n", __func__); + if (penv->wlan_bootstrap_gpio > 0) { + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_HIGH); + msleep(WLAN_BOOTSTRAP_DELAY); + } + + cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); if (!pdev) { pr_debug("%s: invalid pdev. register pci device\n", __func__); @@ -2317,8 +2409,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) cnss_get_pci_dev_bus_number(pdev), pdev, PM_OPTIONS); penv->pcie_link_state = PCIE_LINK_DOWN; - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - msleep(WLAN_ENABLE_DELAY); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_vreg_set(vreg_info, VREG_OFF); msleep(POWER_ON_DELAY); probe_again++; @@ -2345,7 +2436,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver) } err_pcie_reg: - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_vreg_set(vreg_info, VREG_OFF); if (penv->pdev) { pr_err("%d: Unregistering PCI device\n", __LINE__); @@ -2365,7 +2456,7 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver) { struct cnss_wlan_driver *wdrv; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; struct pci_dev *pdev; if (!penv) @@ -2373,7 +2464,7 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver) wdrv = penv->driver; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; pdev = penv->pdev; if (!wdrv) { @@ -2425,8 +2516,8 @@ void cnss_wlan_unregister_driver(struct cnss_wlan_driver *driver) cut_power: penv->driver = NULL; - if (cnss_select_pinctrl_active(cnss_pinctrl, false)) - pr_err("%s: Failed disable the wlan_en pin\n", __func__); + + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); if (cnss_wlan_vreg_set(vreg_info, VREG_OFF)) pr_err("wlan vreg OFF failed\n"); } @@ -2506,7 +2597,7 @@ static int cnss_shutdown(const struct subsys_desc *subsys, bool force_stop) struct cnss_wlan_driver *wdrv; struct pci_dev *pdev; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret = 0; if (!penv) @@ -2516,7 +2607,7 @@ static int cnss_shutdown(const struct subsys_desc *subsys, bool force_stop) wdrv = penv->driver; pdev = penv->pdev; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; if (!pdev) { ret = -EINVAL; @@ -2538,10 +2629,7 @@ static int cnss_shutdown(const struct subsys_desc *subsys, bool force_stop) } cut_power: - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - if (ret) - pr_err("%s:Failed to disable the wlan_en pin\n", __func__); - + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); if (cnss_wlan_vreg_set(vreg_info, VREG_OFF)) pr_err("cnss: Failed to set WLAN VREG_OFF!\n"); @@ -2553,7 +2641,7 @@ static int cnss_powerup(const struct subsys_desc *subsys) struct cnss_wlan_driver *wdrv; struct pci_dev *pdev; struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret = 0; if (!penv) @@ -2565,7 +2653,7 @@ static int cnss_powerup(const struct subsys_desc *subsys) wdrv = penv->driver; pdev = penv->pdev; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; ret = cnss_wlan_vreg_set(vreg_info, VREG_ON); if (ret) { @@ -2574,11 +2662,7 @@ static int cnss_powerup(const struct subsys_desc *subsys) } msleep(POWER_ON_DELAY); - ret = cnss_select_pinctrl_active(cnss_pinctrl, true); - if (ret) { - pr_err("%s: Failed to enable wlan_en pin\n", __func__); - goto err_wlan_en_pin_set; - } + cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); if (!pdev) { pr_err("%d: invalid pdev\n", __LINE__); @@ -2637,9 +2721,8 @@ static int cnss_powerup(const struct subsys_desc *subsys) pdev, PM_OPTIONS); penv->pcie_link_state = PCIE_LINK_DOWN; -err_wlan_en_pin_set: err_pcie_link_up: - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_vreg_set(vreg_info, VREG_OFF); if (penv->pdev) { pr_err("%d: Unregistering pci device\n", __LINE__); @@ -2813,14 +2896,26 @@ static int cnss_probe(struct platform_device *pdev) penv->pldev = pdev; penv->esoc_desc = NULL; + penv->gpio_info.name = WLAN_EN_GPIO_NAME; + penv->gpio_info.num = 0; + penv->gpio_info.state = WLAN_EN_LOW; + penv->gpio_info.init = WLAN_EN_LOW; + penv->gpio_info.prop = false; penv->vreg_info.wlan_reg = NULL; penv->vreg_info.state = VREG_OFF; penv->pci_register_again = false; + mutex_init(&penv->fw_setup_stat_lock); ret = cnss_wlan_get_resources(pdev); if (ret) goto err_get_wlan_res; + ret = cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); + if (ret) { + pr_err("%s: Failed to enable WLAN enable gpio\n", __func__); + goto err_get_rc; + } + ret = of_property_read_u32(dev->of_node, "qcom,wlan-rc-num", &rc_num); if (ret) { pr_err("%s: Failed to find PCIe RC number!\n", __func__); @@ -3014,7 +3109,7 @@ static int cnss_probe(struct platform_device *pdev) err_esoc_reg: err_pcie_enumerate: err_get_rc: - ret = cnss_select_pinctrl_active(&penv->cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); cnss_wlan_release_resources(); err_get_wlan_res: @@ -3045,7 +3140,9 @@ static int cnss_remove(struct platform_device *pdev) } } - cnss_select_pinctrl_active(&penv->cnss_pinctrl, false); + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); + if (penv->wlan_bootstrap_gpio > 0) + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_LOW); cnss_wlan_release_resources(); return 0; @@ -3519,11 +3616,11 @@ static struct pci_dev *__cnss_get_pcie_dev(struct device *dev) static int __cnss_pcie_power_up(struct device *dev) { struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; ret = cnss_wlan_vreg_set(vreg_info, VREG_ON); if (ret) { @@ -3533,27 +3630,27 @@ static int __cnss_pcie_power_up(struct device *dev) msleep(POWER_ON_DELAY); - ret = cnss_select_pinctrl_active(cnss_pinctrl, true); - if (ret) - pr_err("%s: Failed to select the default state\n", __func__); + if (penv->wlan_bootstrap_gpio > 0) { + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_HIGH); + msleep(WLAN_BOOTSTRAP_DELAY); + } - return ret; + cnss_configure_wlan_en_gpio(WLAN_EN_HIGH); + return 0; } static int __cnss_pcie_power_down(struct device *dev) { struct cnss_wlan_vreg_info *vreg_info; - struct cnss_wlan_pinctrl *cnss_pinctrl; + struct cnss_wlan_gpio_info *gpio_info; int ret; vreg_info = &penv->vreg_info; - cnss_pinctrl = &penv->cnss_pinctrl; + gpio_info = &penv->gpio_info; - ret = cnss_select_pinctrl_active(cnss_pinctrl, false); - if (ret) { - pr_err("%s: Failed to select the default state\n", __func__); - return ret; - } + cnss_configure_wlan_en_gpio(WLAN_EN_LOW); + if (penv->wlan_bootstrap_gpio > 0) + gpio_set_value(penv->wlan_bootstrap_gpio, WLAN_BOOTSTRAP_LOW); ret = cnss_wlan_vreg_set(vreg_info, VREG_OFF); if (ret) diff --git a/drivers/net/wireless/wcnss/wcnss_vreg.c b/drivers/net/wireless/wcnss/wcnss_vreg.c index 82b90ad00f8b3..d0a04c06afd75 100644 --- a/drivers/net/wireless/wcnss/wcnss_vreg.c +++ b/drivers/net/wireless/wcnss/wcnss_vreg.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2015, 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 @@ -39,6 +39,7 @@ static int is_power_on; #define PRONTO_IRIS_REG_READ_OFFSET 0x1134 #define PRONTO_IRIS_REG_CHIP_ID 0x04 +#define PRONTO_IRIS_REG_CHIP_ID_MASK 0xffff /* IRIS card chip ID's */ #define WCN3660 0x0200 #define WCN3660A 0x0300 @@ -124,13 +125,13 @@ int xo_auto_detect(u32 reg) int wcnss_get_iris_name(char *iris_name) { struct wcnss_wlan_config *cfg = NULL; - int iris_id; + u32 iris_id; cfg = wcnss_get_wlan_config(); if (cfg) { iris_id = cfg->iris_id; - iris_id = iris_id >> 16; + iris_id = PRONTO_IRIS_REG_CHIP_ID_MASK & (iris_id >> 16); } else { return 1; } @@ -167,8 +168,9 @@ EXPORT_SYMBOL(wcnss_get_iris_name); int validate_iris_chip_id(u32 reg) { - int iris_id; - iris_id = reg >> 16; + u32 iris_id; + + iris_id = PRONTO_IRIS_REG_CHIP_ID_MASK & (reg >> 16); switch (iris_id) { case WCN3660: diff --git a/drivers/net/wireless/wcnss/wcnss_wlan.c b/drivers/net/wireless/wcnss/wcnss_wlan.c index 3f9eeabc54648..a6a37b907c13c 100644 --- a/drivers/net/wireless/wcnss/wcnss_wlan.c +++ b/drivers/net/wireless/wcnss/wcnss_wlan.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -395,8 +395,7 @@ static struct { int user_cal_read; int user_cal_available; u32 user_cal_rcvd; - int user_cal_exp_size; - int device_opened; + u32 user_cal_exp_size; int iris_xo_mode_set; int fw_vbatt_state; char wlan_nv_macAddr[WLAN_MAC_ADDR_SIZE]; @@ -589,13 +588,12 @@ void wcnss_pronto_is_a2xb_bus_stall(void *tst_addr, u32 fifo_mask, char *type) } } -/* Log pronto debug registers before sending reset interrupt */ +/* Log pronto debug registers during SSR Timeout CB */ void wcnss_pronto_log_debug_regs(void) { void __iomem *reg_addr, *tst_addr, *tst_ctrl_addr; u32 reg = 0, reg2 = 0, reg3 = 0, reg4 = 0; - reg_addr = penv->msm_wcnss_base + PRONTO_PMU_SPARE_OFFSET; reg = readl_relaxed(reg_addr); pr_err("PRONTO_PMU_SPARE %08x\n", reg); @@ -799,6 +797,33 @@ void wcnss_pronto_log_debug_regs(void) reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_AHB_CBCR_OFFSET; reg3 = readl_relaxed(reg_addr); pr_err("PMU_WLAN_AHB_CBCR %08x\n", reg3); +} +EXPORT_SYMBOL(wcnss_pronto_log_debug_regs); + +/* Log pronto debug registers before sending reset interrupt */ +void wcnss_pronto_dump_regs(void) +{ + void __iomem *reg_addr; + u32 reg = 0, reg2 = 0, reg3 = 0, reg4 = 0; + + if (!penv || !penv->triggered || !penv->msm_wcnss_base) { + pr_info(DEVICE " WCNSS driver is not triggered by userspace\n"); + return; + } + + wcnss_pronto_log_debug_regs(); + + reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_BCR_OFFSET; + reg = readl_relaxed(reg_addr); + + reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_GDSCR_OFFSET; + reg2 = readl_relaxed(reg_addr); + + reg_addr = penv->msm_wcnss_base + PRONTO_PMU_WLAN_AHB_CBCR_OFFSET; + reg3 = readl_relaxed(reg_addr); + + reg_addr = penv->msm_wcnss_base + PRONTO_PMU_CPU_AHB_CMD_RCGR_OFFSET; + reg4 = readl_relaxed(reg_addr); msleep(50); @@ -878,7 +903,7 @@ void wcnss_pronto_log_debug_regs(void) reg = readl_relaxed(penv->alarms_tactl); pr_err("ALARMS_TACTL %08x\n", reg); } -EXPORT_SYMBOL(wcnss_pronto_log_debug_regs); +EXPORT_SYMBOL(wcnss_pronto_dump_regs); #ifdef CONFIG_WCNSS_REGISTER_DUMP_ON_BITE @@ -2123,10 +2148,8 @@ void extract_cal_data(int len) return; } - -static void wcnssctrl_rx_handler(struct work_struct *worker) +static void wcnss_process_smd_msg(int len) { - int len = 0; int rc = 0; unsigned char buf[sizeof(struct wcnss_version)]; unsigned char build[WCNSS_MAX_BUILD_VER_LEN+1]; @@ -2136,17 +2159,6 @@ static void wcnssctrl_rx_handler(struct work_struct *worker) int hw_type; unsigned char fw_status = 0; - len = smd_read_avail(penv->smd_ch); - if (len > WCNSS_MAX_FRAME_SIZE) { - pr_err("wcnss: frame larger than the allowed size\n"); - smd_read(penv->smd_ch, NULL, len); - return; - } - if (len < sizeof(struct smd_msg_hdr)) { - pr_err("wcnss: incomplete header available len = %d\n", len); - return; - } - rc = smd_read(penv->smd_ch, buf, sizeof(struct smd_msg_hdr)); if (rc < sizeof(struct smd_msg_hdr)) { pr_err("wcnss: incomplete header read from smd\n"); @@ -2213,7 +2225,7 @@ static void wcnssctrl_rx_handler(struct work_struct *worker) case WCNSS_BUILD_VER_RSP: if (len > WCNSS_MAX_BUILD_VER_LEN) { pr_err("wcnss: invalid build version data from wcnss %d\n", - len); + len); return; } rc = smd_read(penv->smd_ch, build, len); @@ -2245,7 +2257,6 @@ static void wcnssctrl_rx_handler(struct work_struct *worker) penv->is_cbc_done = 1; pr_debug("wcnss: received WCNSS_CBC_COMPLETE_IND from FW\n"); break; - case WCNSS_CALDATA_UPLD_REQ: extract_cal_data(len); break; @@ -2256,6 +2267,33 @@ static void wcnssctrl_rx_handler(struct work_struct *worker) return; } +static void wcnssctrl_rx_handler(struct work_struct *worker) +{ + int len; + + while (1) { + len = smd_read_avail(penv->smd_ch); + if (0 == len) { + pr_debug("wcnss: No more data to be read\n"); + return; + } + + if (len > WCNSS_MAX_FRAME_SIZE) { + pr_err("wcnss: frame larger than the allowed size\n"); + smd_read(penv->smd_ch, NULL, len); + return; + } + + if (len < sizeof(struct smd_msg_hdr)) { + pr_err("wcnss: incomplete header available len = %d\n", + len); + return; + } + + wcnss_process_smd_msg(len); + } +} + static void wcnss_send_version_req(struct work_struct *worker) { struct smd_msg_hdr smd_msg; @@ -3148,7 +3186,7 @@ wcnss_trigger_config(struct platform_device *pdev) dev_err(&pdev->dev, "Peripheral Loader failed on WCNSS.\n"); ret = PTR_ERR(penv->pil); wcnss_disable_pc_add_req(); - wcnss_pronto_log_debug_regs(); + wcnss_pronto_dump_regs(); } } while (pil_retry++ < WCNSS_MAX_PIL_RETRY && IS_ERR(penv->pil)); @@ -3258,14 +3296,6 @@ static int wcnss_node_open(struct inode *inode, struct file *file) return -EFAULT; } - mutex_lock(&penv->dev_lock); - penv->user_cal_rcvd = 0; - penv->user_cal_read = 0; - penv->user_cal_available = false; - penv->user_cal_data = NULL; - penv->device_opened = 1; - mutex_unlock(&penv->dev_lock); - return rc; } @@ -3274,7 +3304,7 @@ static ssize_t wcnss_wlan_read(struct file *fp, char __user { int rc = 0; - if (!penv || !penv->device_opened) + if (!penv) return -EFAULT; rc = wait_event_interruptible(penv->read_wait, penv->fw_cal_rcvd @@ -3311,55 +3341,66 @@ static ssize_t wcnss_wlan_write(struct file *fp, const char __user *user_buffer, size_t count, loff_t *position) { int rc = 0; - u32 size = 0; + char *cal_data = NULL; - if (!penv || !penv->device_opened || penv->user_cal_available) + if (!penv || penv->user_cal_available) return -EFAULT; - if (penv->user_cal_rcvd == 0 && count >= 4 - && !penv->user_cal_data) { - rc = copy_from_user((void *)&size, user_buffer, 4); - if (!size || size > MAX_CALIBRATED_DATA_SIZE) { - pr_err(DEVICE " invalid size to write %d\n", size); + if (!penv->user_cal_rcvd && count >= 4 && !penv->user_cal_exp_size) { + mutex_lock(&penv->dev_lock); + rc = copy_from_user((void *)&penv->user_cal_exp_size, + user_buffer, 4); + if (!penv->user_cal_exp_size || + penv->user_cal_exp_size > MAX_CALIBRATED_DATA_SIZE) { + pr_err(DEVICE " invalid size to write %d\n", + penv->user_cal_exp_size); + penv->user_cal_exp_size = 0; + mutex_unlock(&penv->dev_lock); return -EFAULT; } - - rc += count; - count -= 4; - penv->user_cal_exp_size = size; - penv->user_cal_data = kmalloc(size, GFP_KERNEL); - if (penv->user_cal_data == NULL) { - pr_err(DEVICE " no memory to write\n"); - return -ENOMEM; - } - if (0 == count) - goto exit; - - } else if (penv->user_cal_rcvd == 0 && count < 4) + mutex_unlock(&penv->dev_lock); + return count; + } else if (!penv->user_cal_rcvd && count < 4) { return -EFAULT; + } + mutex_lock(&penv->dev_lock); if ((UINT32_MAX - count < penv->user_cal_rcvd) || (penv->user_cal_exp_size < count + penv->user_cal_rcvd)) { pr_err(DEVICE " invalid size to write %zu\n", count + penv->user_cal_rcvd); - rc = -ENOMEM; - goto exit; + mutex_unlock(&penv->dev_lock); + return -ENOMEM; } - rc = copy_from_user((void *)penv->user_cal_data + - penv->user_cal_rcvd, user_buffer, count); - if (0 == rc) { + + cal_data = kmalloc(count, GFP_KERNEL); + if (!cal_data) { + mutex_unlock(&penv->dev_lock); + return -ENOMEM; + } + + rc = copy_from_user(cal_data, user_buffer, count); + if (!rc) { + memcpy(penv->user_cal_data + penv->user_cal_rcvd, + cal_data, count); penv->user_cal_rcvd += count; rc += count; } + + kfree(cal_data); if (penv->user_cal_rcvd == penv->user_cal_exp_size) { penv->user_cal_available = true; pr_info_ratelimited("wcnss: user cal written"); } + mutex_unlock(&penv->dev_lock); -exit: return rc; } +static int wcnss_node_release(struct inode *inode, struct file *file) +{ + return 0; +} static int wcnss_notif_cb(struct notifier_block *this, unsigned long code, void *ss_handle) @@ -3400,7 +3441,7 @@ static int wcnss_notif_cb(struct notifier_block *this, unsigned long code, if (pdev && pwlanconfig) wcnss_wlan_power(&pdev->dev, pwlanconfig, WCNSS_WLAN_SWITCH_OFF, NULL); - wcnss_pronto_log_debug_regs(); + wcnss_pronto_dump_regs(); wcnss_disable_pc_remove_req(); } else if (SUBSYS_BEFORE_SHUTDOWN == code) { wcnss_disable_pc_add_req(); @@ -3418,6 +3459,7 @@ static const struct file_operations wcnss_node_fops = { .open = wcnss_node_open, .read = wcnss_wlan_read, .write = wcnss_wlan_write, + .release = wcnss_node_release, }; static struct miscdevice wcnss_misc = { @@ -3445,6 +3487,13 @@ wcnss_wlan_probe(struct platform_device *pdev) } penv->pdev = pdev; + penv->user_cal_data = + devm_kzalloc(&pdev->dev, MAX_CALIBRATED_DATA_SIZE, GFP_KERNEL); + if (!penv->user_cal_data) { + dev_err(&pdev->dev, "Failed to alloc memory for cal data.\n"); + return -ENOMEM; + } + /* register sysfs entries */ ret = wcnss_create_sysfs(&pdev->dev); if (ret) { @@ -3465,6 +3514,11 @@ wcnss_wlan_probe(struct platform_device *pdev) mutex_init(&penv->pm_qos_mutex); init_waitqueue_head(&penv->read_wait); + penv->user_cal_rcvd = 0; + penv->user_cal_read = 0; + penv->user_cal_exp_size = 0; + penv->user_cal_available = false; + /* Since we were built into the kernel we'll be called as part * of kernel initialization. We don't know if userspace * applications are available to service PIL at this time diff --git a/drivers/nfc/nq-nci.c b/drivers/nfc/nq-nci.c index e7f8c835b7f44..3b51de98990aa 100644 --- a/drivers/nfc/nq-nci.c +++ b/drivers/nfc/nq-nci.c @@ -53,6 +53,7 @@ struct nqx_dev { struct mutex read_mutex; struct i2c_client *client; struct miscdevice nqx_device; + union nqx_uinfo nqx_info; /* NFC GPIO variables */ unsigned int irq_gpio; unsigned int en_gpio; @@ -464,6 +465,25 @@ int nfc_ioctl_core_reset_ntf(struct file *filp) return nqx_dev->core_reset_ntf; } +/** + * Inside nfc_ioctl_nfcc_info + * + * @brief nfc_ioctl_nfcc_info + * + * Check the NQ Chipset and firmware version details + */ +unsigned int nfc_ioctl_nfcc_info(struct file *filp, unsigned long arg) +{ + unsigned int r = 0; + struct nqx_dev *nqx_dev = filp->private_data; + + r = nqx_dev->nqx_info.i; + dev_dbg(&nqx_dev->client->dev, + "nqx nfc : nfc_ioctl_nfcc_info r = %d\n", r); + + return r; +} + static long nfc_ioctl(struct file *pfile, unsigned int cmd, unsigned long arg) { @@ -486,6 +506,9 @@ static long nfc_ioctl(struct file *pfile, unsigned int cmd, case NFCC_INITIAL_CORE_RESET_NTF: r = nfc_ioctl_core_reset_ntf(pfile); break; + case NFCC_GET_INFO: + r = nfc_ioctl_nfcc_info(pfile, arg); + break; default: r = -ENOIOCTLCMD; } @@ -505,13 +528,16 @@ static const struct file_operations nfc_dev_fops = { }; /* Check for availability of NQ_ NFC controller hardware */ -static int nfcc_hw_check(struct i2c_client *client, unsigned int enable_gpio) +static int nfcc_hw_check(struct i2c_client *client, struct nqx_dev *nqx_dev) { int ret = 0; unsigned char raw_nci_reset_cmd[] = {0x20, 0x00, 0x01, 0x00}; + unsigned char raw_nci_init_cmd[] = {0x20, 0x01, 0x00}; + unsigned char nci_init_rsp[28]; unsigned char nci_reset_rsp[6]; - + unsigned char init_rsp_len = 0; + unsigned int enable_gpio = nqx_dev->en_gpio; /* making sure that the NFCC starts in a clean state. */ gpio_set_value(enable_gpio, 0);/* ULPM: Disable */ /* hardware dependent delay */ @@ -533,16 +559,75 @@ static int nfcc_hw_check(struct i2c_client *client, unsigned int enable_gpio) /* Read Response of RESET command */ ret = i2c_master_recv(client, nci_reset_rsp, - sizeof(nci_reset_rsp)); + sizeof(nci_reset_rsp)); dev_err(&client->dev, - "%s: - nq - reset cmd answer : NfcNciRx %x %x %x\n", - __func__, nci_reset_rsp[0], - nci_reset_rsp[1], nci_reset_rsp[2]); + "%s: - nq - reset cmd answer : NfcNciRx %x %x %x\n", + __func__, nci_reset_rsp[0], + nci_reset_rsp[1], nci_reset_rsp[2]); if (ret < 0) { dev_err(&client->dev, "%s: - i2c_master_recv Error\n", __func__); goto err_nfcc_hw_check; } + ret = i2c_master_send(client, raw_nci_init_cmd, + sizeof(raw_nci_init_cmd)); + if (ret < 0) { + dev_err(&client->dev, + "%s: - i2c_master_send Error\n", __func__); + goto err_nfcc_hw_check; + } + /* hardware dependent delay */ + msleep(30); + /* Read Response of INIT command */ + ret = i2c_master_recv(client, nci_init_rsp, + sizeof(nci_init_rsp)); + if (ret < 0) { + dev_err(&client->dev, + "%s: - i2c_master_recv Error\n", __func__); + goto err_nfcc_hw_check; + } + init_rsp_len = 2 + nci_init_rsp[2]; /*payload + len*/ + if (init_rsp_len > PAYLOAD_HEADER_LENGTH) { + nqx_dev->nqx_info.info.chip_type = + nci_init_rsp[init_rsp_len - 3]; + nqx_dev->nqx_info.info.rom_version = + nci_init_rsp[init_rsp_len - 2]; + nqx_dev->nqx_info.info.fw_major = + nci_init_rsp[init_rsp_len - 1]; + nqx_dev->nqx_info.info.fw_minor = + nci_init_rsp[init_rsp_len]; + } + dev_dbg(&nqx_dev->client->dev, "NQ NFCC chip_type = %x\n", + nqx_dev->nqx_info.info.chip_type); + dev_dbg(&nqx_dev->client->dev, "NQ fw version = %x.%x.%x\n", + nqx_dev->nqx_info.info.rom_version, + nqx_dev->nqx_info.info.fw_major, + nqx_dev->nqx_info.info.fw_minor); + + switch (nqx_dev->nqx_info.info.chip_type) { + case NFCC_NQ_210: + dev_dbg(&client->dev, + "%s: ## NFCC == NQ210 ##\n", __func__); + break; + case NFCC_NQ_220: + dev_dbg(&client->dev, + "%s: ## NFCC == NQ220 ##\n", __func__); + break; + case NFCC_NQ_310: + dev_dbg(&client->dev, + "%s: ## NFCC == NQ310 ##\n", __func__); + break; + case NFCC_NQ_330: + dev_dbg(&client->dev, + "%s: ## NFCC == NQ330 ##\n", __func__); + break; + default: + dev_err(&client->dev, + "%s: - NFCC HW not Supported\n", __func__); + break; + } + + /*Disable NFC by default to save power on boot*/ gpio_set_value(enable_gpio, 0);/* ULPM: Disable */ ret = 0; goto done; @@ -563,9 +648,7 @@ static int nfcc_hw_check(struct i2c_client *client, unsigned int enable_gpio) static int nqx_clock_select(struct nqx_dev *nqx_dev) { int r = 0; - - nqx_dev->s_clk = - clk_get(&nqx_dev->client->dev, "ref_clk"); + nqx_dev->s_clk = clk_get(&nqx_dev->client->dev, "ref_clk"); if (nqx_dev->s_clk == NULL) goto err_clk; @@ -863,7 +946,7 @@ static int nqx_probe(struct i2c_client *client, * present before attempting further hardware initialisation. * */ - r = nfcc_hw_check(client , platform_data->en_gpio); + r = nfcc_hw_check(client , nqx_dev); if (r) { /* make sure NFCC is not enabled */ gpio_set_value(platform_data->en_gpio, 0); diff --git a/drivers/nfc/nq-nci.h b/drivers/nfc/nq-nci.h index 7656e9e8917ec..7e62b06955379 100644 --- a/drivers/nfc/nq-nci.h +++ b/drivers/nfc/nq-nci.h @@ -22,6 +22,7 @@ #include #include +#include #define NFC_SET_PWR _IOW(0xE9, 0x01, unsigned int) #define ESE_SET_PWR _IOW(0xE9, 0x02, unsigned int) @@ -42,4 +43,11 @@ enum nfcc_initial_core_reset_ntf { DEFAULT_INITIAL_CORE_RESET_NTF, /*2*/ }; +enum nfcc_chip_variant { + NFCC_NQ_210 = 0x48, /**< NFCC NQ210 */ + NFCC_NQ_220 = 0x58, /**< NFCC NQ220 */ + NFCC_NQ_310 = 0x40, /**< NFCC NQ310 */ + NFCC_NQ_330 = 0x51, /**< NFCC NQ330 */ + NFCC_NOT_SUPPORTED = 0xFF /**< NFCC is not supported */ +}; #endif diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c index 0a9e10337142d..a2e4418bb071f 100644 --- a/drivers/of/fdt.c +++ b/drivers/of/fdt.c @@ -723,6 +723,23 @@ const void * __init of_flat_dt_match_machine(const void *default_match, return best_data; } +void __init early_init_dt_check_for_powerup_reason(unsigned long node) +{ + unsigned long pu_reason; + int len; + const __be32 *prop; + + pr_debug("Looking for powerup reason properties... \n"); + + prop = of_get_flat_dt_prop(node, "pureason", &len); + if (!prop) + return; + pu_reason = of_read_ulong(prop, len/4); + early_init_dt_setup_pureason_arch(pu_reason); + + pr_debug("Powerup reason %lu\n", pu_reason); +} + #ifdef CONFIG_BLK_DEV_INITRD /** * early_init_dt_check_for_initrd - Decode initrd location from flat tree @@ -749,6 +766,7 @@ static void __init early_init_dt_check_for_initrd(unsigned long node) initrd_start = (unsigned long)__va(start); initrd_end = (unsigned long)__va(end); initrd_below_start_ok = 1; + early_init_dt_check_for_powerup_reason(node); pr_debug("initrd_start=0x%llx initrd_end=0x%llx\n", (unsigned long long)start, (unsigned long long)end); diff --git a/drivers/of/of_batterydata.c b/drivers/of/of_batterydata.c index 4fddbdefce5b5..cfe46089b72be 100644 --- a/drivers/of/of_batterydata.c +++ b/drivers/of/of_batterydata.c @@ -1,4 +1,5 @@ /* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -19,6 +20,7 @@ #include #include #include +#include static int of_batterydata_read_lut(const struct device_node *np, int max_cols, int max_rows, int *ncols, int *nrows, @@ -310,6 +312,17 @@ static int64_t of_batterydata_convert_battery_id_kohm(int batt_id_uv, return resistor_value_kohm; } + +#ifdef CONFIG_C3N_SMB358 +extern int battid_resister; +#endif + +int battery_type_id = 0 ; + +#if defined(CONFIG_A13N_PMI8952) || defined(CONFIG_D1_ROSY) +static char *default_batt_type = "Generic_Battery"; +#endif + struct device_node *of_batterydata_get_best_profile( const struct device_node *batterydata_container_node, const char *psy_name, const char *batt_type) @@ -322,6 +335,7 @@ struct device_node *of_batterydata_get_best_profile( int delta = 0, best_delta = 0, best_id_kohm = 0, id_range_pct, batt_id_kohm = 0, i = 0, rc = 0, limit = 0; bool in_range = false; + bool default_id = false; psy = power_supply_get_by_name(psy_name); if (!psy) { @@ -335,7 +349,13 @@ struct device_node *of_batterydata_get_best_profile( return ERR_PTR(-ENOSYS); } - batt_id_kohm = ret.intval / 1000; +#ifdef CONFIG_C3N_SMB358 + batt_id_kohm = battid_resister; + pr_err("C3N batt_id = %d\n", batt_id_kohm); +#else + batt_id_kohm = ret.intval / 1000; + pr_err("WT batt_id = %d\n", batt_id_kohm); +#endif /* read battery id range percentage for best profile */ rc = of_property_read_u32(batterydata_container_node, @@ -387,6 +407,26 @@ struct device_node *of_batterydata_get_best_profile( } } +#if defined(CONFIG_A13N_PMI8952) || defined(CONFIG_D1_ROSY) + + if (best_node == NULL) { + for_each_child_of_node(batterydata_container_node, node) { + if (default_batt_type != NULL) { + rc = of_property_read_string(node, "qcom,battery-type", + &battery_type); + if (!rc && strcmp(battery_type, default_batt_type) == 0) { + best_node = node; + best_id_kohm = batt_id_kohm; + default_id = true; + pr_err("No battery data found, Use default battery data\n"); + break; + } + } + } + } + +#endif + if (best_node == NULL) { pr_err("No battery data found\n"); return best_node; @@ -394,7 +434,7 @@ struct device_node *of_batterydata_get_best_profile( /* check that profile id is in range of the measured batt_id */ if (abs(best_id_kohm - batt_id_kohm) > - ((best_id_kohm * id_range_pct) / 100)) { + ((best_id_kohm * id_range_pct) / 100) && !default_id) { pr_err("out of range: profile id %d batt id %d pct %d", best_id_kohm, batt_id_kohm, id_range_pct); return NULL; @@ -402,11 +442,24 @@ struct device_node *of_batterydata_get_best_profile( rc = of_property_read_string(best_node, "qcom,battery-type", &battery_type); - if (!rc) + if (!rc) { + hardwareinfo_set_prop(HARDWARE_BATTERY_ID, battery_type); pr_info("%s found\n", battery_type); + } else pr_info("%s found\n", best_node->name); +#ifdef CONFIG_C3N_SMB358 + + if (strcmp(battery_type, "wingtech-feimaotui-4v4-3030mah") == 0) { + battery_type_id = 1; + } else if (strcmp(battery_type, "wingtech-xingwangda-4v4-3030mah") == 0) { + battery_type_id = 2; + } + +#endif + + return best_node; } diff --git a/drivers/pci/host/pci-msm.c b/drivers/pci/host/pci-msm.c index 96eeaa9f66fc4..bf9af36554358 100644 --- a/drivers/pci/host/pci-msm.c +++ b/drivers/pci/host/pci-msm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -2332,8 +2332,16 @@ static void msm_pcie_sel_debug_testcase(struct msm_pcie_dev_t *dev, dev->res[base_sel - 1].base, wr_offset, wr_mask, wr_value); - msm_pcie_write_reg_field(dev->res[base_sel - 1].base, - wr_offset, wr_mask, wr_value); + base_sel_size = resource_size(dev->res[base_sel - 1].resource); + + if (wr_offset > base_sel_size - 4 || + msm_pcie_check_align(dev, wr_offset)) + PCIE_DBG_FS(dev, + "PCIe: RC%d: Invalid wr_offset: 0x%x. wr_offset should be no more than 0x%x\n", + dev->rc_idx, wr_offset, base_sel_size - 4); + else + msm_pcie_write_reg_field(dev->res[base_sel - 1].base, + wr_offset, wr_mask, wr_value); break; case 13: /* dump all registers of base_sel */ diff --git a/drivers/platform/msm/Kconfig b/drivers/platform/msm/Kconfig index a0f9571dd20c1..0774fe4d29aaa 100644 --- a/drivers/platform/msm/Kconfig +++ b/drivers/platform/msm/Kconfig @@ -300,6 +300,15 @@ config MSM_11AD If you choose to build it as a module, it will be called msm_11ad_proxy. +config BW_MONITOR + bool "Bandwidth monitor driver" + depends on BUS_TOPOLOGY_ADHOC && THERMAL + help + Enable this module if any bandwidth of a bus needs to be + monitored and limited by thermal core framework. It does + it by registering the bus bandwidth as a sensor in + thermal core framework. + source "drivers/platform/msm/spmi/Kconfig" endmenu diff --git a/drivers/platform/msm/avtimer.c b/drivers/platform/msm/avtimer.c index 2bded5e83cce2..4331af8890c0b 100644 --- a/drivers/platform/msm/avtimer.c +++ b/drivers/platform/msm/avtimer.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, 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 @@ -331,9 +331,17 @@ static long avtimer_ioctl(struct file *file, unsigned int ioctl_num, switch (ioctl_num) { case IOCTL_GET_AVTIMER_TICK: { - uint64_t avtimer_tick; + uint64_t avtimer_tick = 0; + int rc; + + rc = avcs_core_query_timer(&avtimer_tick); + + if (rc) { + pr_err("%s: Error: Invalid AV Timer tick, rc = %d\n", + __func__, rc); + return rc; + } - avcs_core_query_timer(&avtimer_tick); pr_debug_ratelimited("%s: AV Timer tick: time %llx\n", __func__, avtimer_tick); if (copy_to_user((void *) ioctl_param, &avtimer_tick, diff --git a/drivers/platform/msm/gsi/gsi.c b/drivers/platform/msm/gsi/gsi.c index a858aac57acf9..194f1bebad336 100644 --- a/drivers/platform/msm/gsi/gsi.c +++ b/drivers/platform/msm/gsi/gsi.c @@ -2568,6 +2568,16 @@ int gsi_enable_fw(phys_addr_t gsi_base_addr, u32 gsi_size) } EXPORT_SYMBOL(gsi_enable_fw); +void gsi_get_inst_ram_offset_and_size(unsigned long *base_offset, + unsigned long *size) +{ + if (base_offset) + *base_offset = GSI_GSI_INST_RAM_BASE_OFFS; + if (size) + *size = GSI_GSI_INST_RAM_SIZE; +} +EXPORT_SYMBOL(gsi_get_inst_ram_offset_and_size); + static int msm_gsi_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; diff --git a/drivers/platform/msm/gsi/gsi_reg.h b/drivers/platform/msm/gsi/gsi_reg.h index 36a74105b4901..e0e51bb52fe8f 100644 --- a/drivers/platform/msm/gsi/gsi_reg.h +++ b/drivers/platform/msm/gsi/gsi_reg.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015, 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 @@ -1687,5 +1687,7 @@ #define GSI_INTER_EE_n_SRC_EV_CH_IRQ_CLR_EV_CH_BIT_MAP_BMSK 0xffffffff #define GSI_INTER_EE_n_SRC_EV_CH_IRQ_CLR_EV_CH_BIT_MAP_SHFT 0x0 +#define GSI_GSI_INST_RAM_BASE_OFFS 0x4000 +#define GSI_GSI_INST_RAM_SIZE 0x4000 #endif /* __GSI_REG_H__ */ diff --git a/drivers/platform/msm/ipa/ipa_common_i.h b/drivers/platform/msm/ipa/ipa_common_i.h index ac83c0fd3d3ba..90774c61ca225 100644 --- a/drivers/platform/msm/ipa/ipa_common_i.h +++ b/drivers/platform/msm/ipa/ipa_common_i.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -26,7 +26,8 @@ log_info.file = __FILENAME__; \ log_info.line = __LINE__; \ log_info.type = EP; \ - log_info.id_string = ipa_clients_strings[client] + log_info.id_string = (client < 0 || client >= IPA_CLIENT_MAX) \ + ? "Invalid Client" : ipa_clients_strings[client] #define IPA_ACTIVE_CLIENTS_PREP_SIMPLE(log_info) \ log_info.file = __FILENAME__; \ diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa.c b/drivers/platform/msm/ipa/ipa_v2/ipa.c index d35140e138bcd..75b756ec7a0d4 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -734,7 +734,8 @@ static long ipa_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) retval = -EINVAL; break; } - if (ipa2_del_hdr((struct ipa_ioc_del_hdr *)param)) { + if (ipa2_del_hdr_by_user((struct ipa_ioc_del_hdr *)param, + true)) { retval = -EFAULT; break; } @@ -1418,8 +1419,8 @@ static long ipa_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) retval = -EINVAL; break; } - if (ipa2_del_hdr_proc_ctx( - (struct ipa_ioc_del_hdr_proc_ctx *)param)) { + if (ipa2_del_hdr_proc_ctx_by_user( + (struct ipa_ioc_del_hdr_proc_ctx *)param, true)) { retval = -EFAULT; break; } @@ -1837,7 +1838,7 @@ static int ipa_q6_clean_q6_tables(void) u32 max_cmds = ipa_get_max_flt_rt_cmds(ipa_ctx->ipa_num_pipes); mem.base = dma_alloc_coherent(ipa_ctx->pdev, 4, &mem.phys_base, - GFP_KERNEL); + GFP_ATOMIC); if (!mem.base) { IPAERR("failed to alloc DMA buff of size 4\n"); return -ENOMEM; @@ -2801,7 +2802,7 @@ static int ipa_setup_apps_pipes(void) if (ipa_ctx->dflt_v4_rt_rule_hdl) __ipa_del_rt_rule(ipa_ctx->dflt_v4_rt_rule_hdl); if (ipa_ctx->excp_hdr_hdl) - __ipa_del_hdr(ipa_ctx->excp_hdr_hdl); + __ipa_del_hdr(ipa_ctx->excp_hdr_hdl, false); ipa2_teardown_sys_pipe(ipa_ctx->clnt_hdl_cmd); fail_cmd: return result; @@ -2813,7 +2814,7 @@ static void ipa_teardown_apps_pipes(void) ipa2_teardown_sys_pipe(ipa_ctx->clnt_hdl_data_in); __ipa_del_rt_rule(ipa_ctx->dflt_v6_rt_rule_hdl); __ipa_del_rt_rule(ipa_ctx->dflt_v4_rt_rule_hdl); - __ipa_del_hdr(ipa_ctx->excp_hdr_hdl); + __ipa_del_hdr(ipa_ctx->excp_hdr_hdl, false); ipa2_teardown_sys_pipe(ipa_ctx->clnt_hdl_cmd); } @@ -3418,7 +3419,7 @@ void ipa_inc_acquire_wakelock(enum ipa_wakelock_ref_client ref_client) return; spin_lock_irqsave(&ipa_ctx->wakelock_ref_cnt.spinlock, flags); if (ipa_ctx->wakelock_ref_cnt.cnt & (1 << ref_client)) - IPAERR("client enum %d mask already set. ref cnt = %d\n", + IPADBG("client enum %d mask already set. ref cnt = %d\n", ref_client, ipa_ctx->wakelock_ref_cnt.cnt); ipa_ctx->wakelock_ref_cnt.cnt |= (1 << ref_client); if (ipa_ctx->wakelock_ref_cnt.cnt) diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c b/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c index 9f6a41f8eb841..5b867727bb3df 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_dp.c @@ -2324,7 +2324,7 @@ static int ipa_lan_rx_pyld_hdlr(struct sk_buff *skb, if (skb->len < IPA_PKT_STATUS_SIZE) { WARN_ON(sys->prev_skb != NULL); IPADBG("status straddles buffer\n"); - sys->prev_skb = skb; + sys->prev_skb = skb_copy(skb, GFP_KERNEL); sys->len_partial = skb->len; return rc; } @@ -2409,7 +2409,7 @@ static int ipa_lan_rx_pyld_hdlr(struct sk_buff *skb, !status->exception) { WARN_ON(sys->prev_skb != NULL); IPADBG("Ins header in next buffer\n"); - sys->prev_skb = skb; + sys->prev_skb = skb_copy(skb, GFP_KERNEL); sys->len_partial = skb->len; return rc; } diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c b/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c index c36ecfef66f14..a5c0893666deb 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_flt.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, 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 @@ -235,7 +235,7 @@ static int ipa_generate_flt_hw_rule(enum ipa_ip_type ip, * @ip: the ip address family type * @hdr_sz: header size * - * Returns: 0 on success, negative on failure + * Returns: size on success, negative on failure * * caller needs to hold any needed locks to ensure integrity * @@ -373,7 +373,12 @@ static int ipa_generate_flt_hw_tbl_common(enum ipa_ip_type ip, u8 *base, ((long)body & IPA_FLT_ENTRY_MEMORY_ALLIGNMENT)); } else { - WARN_ON(tbl->sz == 0); + if (tbl->sz == 0) { + IPAERR("tbl size is 0\n"); + WARN_ON(1); + goto proc_err; + } + /* allocate memory for the flt tbl */ flt_tbl_mem.size = tbl->sz; flt_tbl_mem.base = @@ -460,7 +465,12 @@ static int ipa_generate_flt_hw_tbl_common(enum ipa_ip_type ip, u8 *base, ((long)body & IPA_FLT_ENTRY_MEMORY_ALLIGNMENT)); } else { - WARN_ON(tbl->sz == 0); + if (tbl->sz == 0) { + IPAERR("tbl size is 0\n"); + WARN_ON(1); + goto proc_err; + } + /* allocate memory for the flt tbl */ flt_tbl_mem.size = tbl->sz; flt_tbl_mem.base = @@ -534,8 +544,15 @@ static int ipa_generate_flt_hw_tbl_v1_1(enum ipa_ip_type ip, u8 *hdr; u8 *body; u8 *base; + int res; - mem->size = ipa_get_flt_hw_tbl_size(ip, &hdr_sz); + res = ipa_get_flt_hw_tbl_size(ip, &hdr_sz); + if (res < 0) { + IPAERR("ipa_get_flt_hw_tbl_size failed %d\n", res); + return res; + } + + mem->size = res; mem->size = IPA_HW_TABLE_ALIGNMENT(mem->size); if (mem->size == 0) { @@ -720,6 +737,7 @@ static int ipa_generate_flt_hw_tbl_v2(enum ipa_ip_type ip, u32 *entr; u32 body_start_offset; u32 hdr_top; + int res; if (ip == IPA_IP_v4) body_start_offset = IPA_MEM_PART(apps_v4_flt_ofst) - @@ -756,7 +774,13 @@ static int ipa_generate_flt_hw_tbl_v2(enum ipa_ip_type ip, entr++; } - mem->size = ipa_get_flt_hw_tbl_size(ip, &hdr_sz); + res = ipa_get_flt_hw_tbl_size(ip, &hdr_sz); + if (res < 0) { + IPAERR("ipa_get_flt_hw_tbl_size failed %d\n", res); + goto body_err; + } + + mem->size = res; mem->size -= hdr_sz; mem->size = IPA_HW_TABLE_ALIGNMENT(mem->size); @@ -999,7 +1023,7 @@ static int __ipa_add_flt_rule(struct ipa_flt_tbl *tbl, enum ipa_ip_type ip, goto error; } - if (rt_tbl->cookie != IPA_COOKIE) { + if (rt_tbl->cookie != IPA_RT_TBL_COOKIE) { IPAERR("RT table cookie is invalid\n"); goto error; } @@ -1020,7 +1044,7 @@ static int __ipa_add_flt_rule(struct ipa_flt_tbl *tbl, enum ipa_ip_type ip, } INIT_LIST_HEAD(&entry->link); entry->rule = *rule; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_FLT_COOKIE; entry->rt_tbl = rt_tbl; entry->tbl = tbl; if (add_rear) { @@ -1039,13 +1063,19 @@ static int __ipa_add_flt_rule(struct ipa_flt_tbl *tbl, enum ipa_ip_type ip, if (id < 0) { IPAERR("failed to add to tree\n"); WARN_ON(1); + goto ipa_insert_failed; } *rule_hdl = id; entry->id = id; IPADBG("add flt rule rule_cnt=%d\n", tbl->rule_cnt); return 0; - +ipa_insert_failed: + tbl->rule_cnt--; + if (entry->rt_tbl) + entry->rt_tbl->ref_cnt--; + list_del(&entry->link); + kmem_cache_free(ipa_ctx->flt_rule_cache, entry); error: return -EPERM; } @@ -1061,7 +1091,7 @@ static int __ipa_del_flt_rule(u32 rule_hdl) return -EINVAL; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_FLT_COOKIE) { IPAERR("bad params\n"); return -EINVAL; } @@ -1093,7 +1123,7 @@ static int __ipa_mdfy_flt_rule(struct ipa_flt_rule_mdfy *frule, goto error; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_FLT_COOKIE) { IPAERR("bad params\n"); goto error; } @@ -1114,7 +1144,7 @@ static int __ipa_mdfy_flt_rule(struct ipa_flt_rule_mdfy *frule, goto error; } - if (rt_tbl->cookie != IPA_COOKIE) { + if (rt_tbl->cookie != IPA_RT_TBL_COOKIE) { IPAERR("RT table cookie is invalid\n"); goto error; } diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c b/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c index ee4ddbb9b926d..71afae0221cd4 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_hdr.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -544,7 +544,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, { struct ipa_hdr_entry *hdr_entry; struct ipa_hdr_proc_ctx_entry *entry; - struct ipa_hdr_proc_ctx_offset_entry *offset; + struct ipa_hdr_proc_ctx_offset_entry *offset = NULL; u32 bin; struct ipa_hdr_proc_ctx_tbl *htbl = &ipa_ctx->hdr_proc_ctx_tbl; int id; @@ -560,7 +560,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, } hdr_entry = ipa_id_find(proc_ctx->hdr_hdl); - if (!hdr_entry || (hdr_entry->cookie != IPA_COOKIE)) { + if (!hdr_entry || (hdr_entry->cookie != IPA_HDR_COOKIE)) { IPAERR("hdr_hdl is invalid\n"); return -EINVAL; } @@ -577,7 +577,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, entry->hdr = hdr_entry; if (add_ref_hdr) hdr_entry->ref_cnt++; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_PROC_HDR_COOKIE; needed_len = (proc_ctx->type == IPA_HDR_PROC_NONE) ? sizeof(struct ipa_hdr_proc_ctx_add_hdr_seq) : @@ -637,6 +637,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, if (id < 0) { IPAERR("failed to alloc id\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; proc_ctx->proc_ctx_hdl = id; @@ -644,6 +645,14 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, return 0; +ipa_insert_failed: + if (offset) + list_move(&offset->link, + &htbl->head_free_offset_list[offset->bin]); + entry->offset_entry = NULL; + list_del(&entry->link); + htbl->proc_ctx_cnt--; + bad_len: if (add_ref_hdr) hdr_entry->ref_cnt--; @@ -656,7 +665,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, static int __ipa_add_hdr(struct ipa_hdr_add *hdr) { struct ipa_hdr_entry *entry; - struct ipa_hdr_offset_entry *offset; + struct ipa_hdr_offset_entry *offset = NULL; u32 bin; struct ipa_hdr_tbl *htbl = &ipa_ctx->hdr_tbl; int id; @@ -687,7 +696,7 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) entry->type = hdr->type; entry->is_eth2_ofst_valid = hdr->is_eth2_ofst_valid; entry->eth2_ofst = hdr->eth2_ofst; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_HDR_COOKIE; if (hdr->hdr_len <= ipa_hdr_bin_sz[IPA_HDR_BIN0]) bin = IPA_HDR_BIN0; @@ -770,6 +779,7 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) if (id < 0) { IPAERR("failed to alloc id\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; hdr->hdr_hdl = id; @@ -794,10 +804,18 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) entry->ref_cnt--; hdr->hdr_hdl = 0; ipa_id_remove(id); +ipa_insert_failed: + if (entry->is_hdr_proc_ctx) { + dma_unmap_single(ipa_ctx->pdev, entry->phys_base, + entry->hdr_len, DMA_TO_DEVICE); + } else { + if (offset) + list_move(&offset->link, + &htbl->head_free_offset_list[offset->bin]); + entry->offset_entry = NULL; + } htbl->hdr_cnt--; list_del(&entry->link); - dma_unmap_single(ipa_ctx->pdev, entry->phys_base, - entry->hdr_len, DMA_TO_DEVICE); bad_hdr_len: entry->cookie = 0; kmem_cache_free(ipa_ctx->hdr_cache, entry); @@ -805,13 +823,14 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) return -EPERM; } -static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) +static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, + bool release_hdr, bool by_user) { struct ipa_hdr_proc_ctx_entry *entry; struct ipa_hdr_proc_ctx_tbl *htbl = &ipa_ctx->hdr_proc_ctx_tbl; entry = ipa_id_find(proc_ctx_hdl); - if (!entry || (entry->cookie != IPA_COOKIE)) { + if (!entry || (entry->cookie != IPA_PROC_HDR_COOKIE)) { IPAERR("bad parm\n"); return -EINVAL; } @@ -819,6 +838,14 @@ static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) IPADBG("del ctx proc cnt=%d ofst=%d\n", htbl->proc_ctx_cnt, entry->offset_entry->offset); + if (by_user && entry->user_deleted) { + IPAERR("proc_ctx already deleted by user\n"); + return -EINVAL; + } + + if (by_user) + entry->user_deleted = true; + if (--entry->ref_cnt) { IPADBG("proc_ctx_hdl %x ref_cnt %d\n", proc_ctx_hdl, entry->ref_cnt); @@ -826,7 +853,7 @@ static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) } if (release_hdr) - __ipa_del_hdr(entry->hdr->id); + __ipa_del_hdr(entry->hdr->id, false); /* move the offset entry to appropriate free list */ list_move(&entry->offset_entry->link, @@ -843,7 +870,7 @@ static int __ipa_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) } -int __ipa_del_hdr(u32 hdr_hdl) +int __ipa_del_hdr(u32 hdr_hdl, bool by_user) { struct ipa_hdr_entry *entry; struct ipa_hdr_tbl *htbl = &ipa_ctx->hdr_tbl; @@ -854,7 +881,7 @@ int __ipa_del_hdr(u32 hdr_hdl) return -EINVAL; } - if (!entry || (entry->cookie != IPA_COOKIE)) { + if (entry->cookie != IPA_HDR_COOKIE) { IPAERR("bad parm\n"); return -EINVAL; } @@ -866,6 +893,14 @@ int __ipa_del_hdr(u32 hdr_hdl) IPADBG("del hdr of sz=%d hdr_cnt=%d ofst=%d\n", entry->hdr_len, htbl->hdr_cnt, entry->offset_entry->offset); + if (by_user && entry->user_deleted) { + IPAERR("hdr already deleted by user\n"); + return -EINVAL; + } + + if (by_user) + entry->user_deleted = true; + if (--entry->ref_cnt) { IPADBG("hdr_hdl %x ref_cnt %d\n", hdr_hdl, entry->ref_cnt); return 0; @@ -876,7 +911,7 @@ int __ipa_del_hdr(u32 hdr_hdl) entry->phys_base, entry->hdr_len, DMA_TO_DEVICE); - __ipa_del_hdr_proc_ctx(entry->proc_ctx->id, false); + __ipa_del_hdr_proc_ctx(entry->proc_ctx->id, false, false); } else { /* move the offset entry to appropriate free list */ list_move(&entry->offset_entry->link, @@ -943,15 +978,16 @@ int ipa2_add_hdr(struct ipa_ioc_add_hdr *hdrs) } /** - * ipa2_del_hdr() - Remove the specified headers from SW and optionally commit them - * to IPA HW + * ipa2_del_hdr_by_user() - Remove the specified headers + * from SW and optionally commit them to IPA HW * @hdls: [inout] set of headers to delete + * @by_user: Operation requested by user? * * Returns: 0 on success, negative on failure * * Note: Should not be called from atomic context */ -int ipa2_del_hdr(struct ipa_ioc_del_hdr *hdls) +int ipa2_del_hdr_by_user(struct ipa_ioc_del_hdr *hdls, bool by_user) { int i; int result = -EFAULT; @@ -968,7 +1004,7 @@ int ipa2_del_hdr(struct ipa_ioc_del_hdr *hdls) mutex_lock(&ipa_ctx->lock); for (i = 0; i < hdls->num_hdls; i++) { - if (__ipa_del_hdr(hdls->hdl[i].hdl)) { + if (__ipa_del_hdr(hdls->hdl[i].hdl, by_user)) { IPAERR("failed to del hdr %i\n", i); hdls->hdl[i].status = -1; } else { @@ -988,6 +1024,20 @@ int ipa2_del_hdr(struct ipa_ioc_del_hdr *hdls) return result; } +/** + * ipa2_del_hdr() - Remove the specified headers from SW and optionally commit them + * to IPA HW + * @hdls: [inout] set of headers to delete + * + * Returns: 0 on success, negative on failure + * + * Note: Should not be called from atomic context + */ +int ipa2_del_hdr(struct ipa_ioc_del_hdr *hdls) +{ + return ipa2_del_hdr_by_user(hdls, false); +} + /** * ipa2_add_hdr_proc_ctx() - add the specified headers to SW * and optionally commit them to IPA HW @@ -1040,16 +1090,18 @@ int ipa2_add_hdr_proc_ctx(struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs) } /** - * ipa2_del_hdr_proc_ctx() - + * ipa2_del_hdr_proc_ctx_by_user() - * Remove the specified processing context headers from SW and * optionally commit them to IPA HW. * @hdls: [inout] set of processing context headers to delete + * @by_user: Operation requested by user? * * Returns: 0 on success, negative on failure * * Note: Should not be called from atomic context */ -int ipa2_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) +int ipa2_del_hdr_proc_ctx_by_user(struct ipa_ioc_del_hdr_proc_ctx *hdls, + bool by_user) { int i; int result; @@ -1068,7 +1120,7 @@ int ipa2_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) mutex_lock(&ipa_ctx->lock); for (i = 0; i < hdls->num_hdls; i++) { - if (__ipa_del_hdr_proc_ctx(hdls->hdl[i].hdl, true)) { + if (__ipa_del_hdr_proc_ctx(hdls->hdl[i].hdl, true, by_user)) { IPAERR("failed to del hdr %i\n", i); hdls->hdl[i].status = -1; } else { @@ -1088,6 +1140,21 @@ int ipa2_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) return result; } +/** + * ipa2_del_hdr_proc_ctx() - + * Remove the specified processing context headers from SW and + * optionally commit them to IPA HW. + * @hdls: [inout] set of processing context headers to delete + * + * Returns: 0 on success, negative on failure + * + * Note: Should not be called from atomic context + */ +int ipa2_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) +{ + return ipa2_del_hdr_proc_ctx_by_user(hdls, false); +} + /** * ipa2_commit_hdr() - commit to IPA HW the current header table in SW * @@ -1316,7 +1383,7 @@ int __ipa_release_hdr(u32 hdr_hdl) { int result = 0; - if (__ipa_del_hdr(hdr_hdl)) { + if (__ipa_del_hdr(hdr_hdl, false)) { IPADBG("fail to del hdr %x\n", hdr_hdl); result = -EFAULT; goto bail; @@ -1344,7 +1411,7 @@ int __ipa_release_hdr_proc_ctx(u32 proc_ctx_hdl) { int result = 0; - if (__ipa_del_hdr_proc_ctx(proc_ctx_hdl, true)) { + if (__ipa_del_hdr_proc_ctx(proc_ctx_hdl, true, false)) { IPADBG("fail to del hdr %x\n", proc_ctx_hdl); result = -EFAULT; goto bail; @@ -1383,7 +1450,7 @@ int ipa2_put_hdr(u32 hdr_hdl) goto bail; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_HDR_COOKIE) { IPAERR("invalid header entry\n"); result = -EINVAL; goto bail; diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h index 99bc8ff9541c2..c9b2330a0d69c 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_i.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -37,7 +37,15 @@ #define DRV_NAME "ipa" #define NAT_DEV_NAME "ipaNatTable" + #define IPA_COOKIE 0x57831603 +#define IPA_RT_RULE_COOKIE 0x57831604 +#define IPA_RT_TBL_COOKIE 0x57831605 +#define IPA_FLT_COOKIE 0x57831606 +#define IPA_HDR_COOKIE 0x57831607 +#define IPA_PROC_HDR_COOKIE 0x57831608 + + #define MTU_BYTE 1500 #define IPA_MAX_NUM_PIPES 0x14 @@ -134,7 +142,7 @@ #define IPA_HW_TABLE_ALIGNMENT(start_ofst) \ (((start_ofst) + 127) & ~127) -#define IPA_RT_FLT_HW_RULE_BUF_SIZE (128) +#define IPA_RT_FLT_HW_RULE_BUF_SIZE (256) #define IPA_HDR_PROC_CTX_TABLE_ALIGNMENT_BYTE 8 #define IPA_HDR_PROC_CTX_TABLE_ALIGNMENT(start_ofst) \ @@ -192,8 +200,8 @@ struct ipa_smmu_cb_ctx { */ struct ipa_flt_entry { struct list_head link; - struct ipa_flt_rule rule; u32 cookie; + struct ipa_flt_rule rule; struct ipa_flt_tbl *tbl; struct ipa_rt_tbl *rt_tbl; u32 hw_len; @@ -218,13 +226,13 @@ struct ipa_flt_entry { */ struct ipa_rt_tbl { struct list_head link; + u32 cookie; struct list_head head_rt_rule_list; char name[IPA_RESOURCE_NAME_MAX]; u32 idx; u32 rule_cnt; u32 ref_cnt; struct ipa_rt_tbl_set *set; - u32 cookie; bool in_sys; u32 sz; struct ipa_mem_buffer curr_mem; @@ -251,9 +259,11 @@ struct ipa_rt_tbl { * @id: header entry id * @is_eth2_ofst_valid: is eth2_ofst field valid? * @eth2_ofst: offset to start of Ethernet-II/802.3 header + * @user_deleted: is the header deleted by the user? */ struct ipa_hdr_entry { struct list_head link; + u32 cookie; u8 hdr[IPA_HDR_MAX_SIZE]; u32 hdr_len; char name[IPA_RESOURCE_NAME_MAX]; @@ -263,11 +273,11 @@ struct ipa_hdr_entry { dma_addr_t phys_base; struct ipa_hdr_proc_ctx_entry *proc_ctx; struct ipa_hdr_offset_entry *offset_entry; - u32 cookie; u32 ref_cnt; int id; u8 is_eth2_ofst_valid; u16 eth2_ofst; + bool user_deleted; }; /** @@ -331,15 +341,17 @@ struct ipa_hdr_proc_ctx_add_hdr_cmd_seq { * @cookie: cookie used for validity check * @ref_cnt: reference counter of routing table * @id: processing context header entry id + * @user_deleted: is the hdr processing context deleted by the user? */ struct ipa_hdr_proc_ctx_entry { struct list_head link; + u32 cookie; enum ipa_hdr_proc_type type; struct ipa_hdr_proc_ctx_offset_entry *offset_entry; struct ipa_hdr_entry *hdr; - u32 cookie; u32 ref_cnt; int id; + bool user_deleted; }; /** @@ -392,8 +404,8 @@ struct ipa_flt_tbl { */ struct ipa_rt_entry { struct list_head link; - struct ipa_rt_rule rule; u32 cookie; + struct ipa_rt_rule rule; struct ipa_rt_tbl *tbl; struct ipa_hdr_entry *hdr; struct ipa_hdr_proc_ctx_entry *proc_ctx; @@ -1347,6 +1359,8 @@ int ipa2_add_hdr(struct ipa_ioc_add_hdr *hdrs); int ipa2_del_hdr(struct ipa_ioc_del_hdr *hdls); +int ipa2_del_hdr_by_user(struct ipa_ioc_del_hdr *hdls, bool by_user); + int ipa2_commit_hdr(void); int ipa2_reset_hdr(void); @@ -1364,6 +1378,9 @@ int ipa2_add_hdr_proc_ctx(struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs); int ipa2_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls); +int ipa2_del_hdr_proc_ctx_by_user(struct ipa_ioc_del_hdr_proc_ctx *hdls, + bool by_user); + /* * Routing */ @@ -1655,7 +1672,7 @@ int ipa2_active_clients_log_print_table(char *buf, int size); void ipa2_active_clients_log_clear(void); int ipa_interrupts_init(u32 ipa_irq, u32 ee, struct device *ipa_dev); int __ipa_del_rt_rule(u32 rule_hdl); -int __ipa_del_hdr(u32 hdr_hdl); +int __ipa_del_hdr(u32 hdr_hdl, bool by_user); int __ipa_release_hdr(u32 hdr_hdl); int __ipa_release_hdr_proc_ctx(u32 proc_ctx_hdl); int _ipa_read_gen_reg_v1_1(char *buff, int max_len); diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c b/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c index a1c927c5ec0f5..1ffbf38238782 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_intf.c @@ -272,6 +272,14 @@ int ipa_query_intf_tx_props(struct ipa_ioc_query_intf_tx_props *tx) mutex_lock(&ipa_ctx->lock); list_for_each_entry(entry, &ipa_ctx->intf_list, link) { if (!strncmp(entry->name, tx->name, IPA_RESOURCE_NAME_MAX)) { + /* add the entry check */ + if (entry->num_tx_props != tx->num_tx_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_tx_props, + tx->num_tx_props); + mutex_unlock(&ipa_ctx->lock); + return result; + } memcpy(tx->tx, entry->tx, entry->num_tx_props * sizeof(struct ipa_ioc_tx_intf_prop)); result = 0; @@ -305,6 +313,14 @@ int ipa_query_intf_rx_props(struct ipa_ioc_query_intf_rx_props *rx) mutex_lock(&ipa_ctx->lock); list_for_each_entry(entry, &ipa_ctx->intf_list, link) { if (!strncmp(entry->name, rx->name, IPA_RESOURCE_NAME_MAX)) { + /* add the entry check */ + if (entry->num_rx_props != rx->num_rx_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_rx_props, + rx->num_rx_props); + mutex_unlock(&ipa_ctx->lock); + return result; + } memcpy(rx->rx, entry->rx, entry->num_rx_props * sizeof(struct ipa_ioc_rx_intf_prop)); result = 0; @@ -338,6 +354,14 @@ int ipa_query_intf_ext_props(struct ipa_ioc_query_intf_ext_props *ext) mutex_lock(&ipa_ctx->lock); list_for_each_entry(entry, &ipa_ctx->intf_list, link) { if (!strcmp(entry->name, ext->name)) { + /* add the entry check */ + if (entry->num_ext_props != ext->num_ext_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_ext_props, + ext->num_ext_props); + mutex_unlock(&ipa_ctx->lock); + return result; + } memcpy(ext->ext, entry->ext, entry->num_ext_props * sizeof(struct ipa_ioc_ext_intf_prop)); result = 0; @@ -523,6 +547,8 @@ ssize_t ipa_read(struct file *filp, char __user *buf, size_t count, mutex_unlock(&ipa_ctx->msg_lock); if (copy_to_user(buf, &msg->meta, sizeof(struct ipa_msg_meta))) { + kfree(msg); + msg = NULL; ret = -EFAULT; break; } @@ -531,6 +557,8 @@ ssize_t ipa_read(struct file *filp, char __user *buf, size_t count, if (msg->buff) { if (copy_to_user(buf, msg->buff, msg->meta.msg_len)) { + kfree(msg); + msg = NULL; ret = -EFAULT; break; } diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_nat.c b/drivers/platform/msm/ipa/ipa_v2/ipa_nat.c index 6202992c2c4e3..314b095930260 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_nat.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_nat.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, 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 @@ -25,6 +25,16 @@ #define IPA_NAT_SHARED_MEMORY 1 #define IPA_NAT_TEMP_MEM_SIZE 128 +enum nat_table_type { + IPA_NAT_BASE_TBL = 0, + IPA_NAT_EXPN_TBL = 1, + IPA_NAT_INDX_TBL = 2, + IPA_NAT_INDEX_EXPN_TBL = 3, +}; + +#define NAT_TABLE_ENTRY_SIZE_BYTE 32 +#define NAT_INTEX_TABLE_ENTRY_SIZE_BYTE 4 + static int ipa_nat_vma_fault_remap( struct vm_area_struct *vma, struct vm_fault *vmf) { @@ -568,6 +578,71 @@ int ipa2_nat_dma_cmd(struct ipa_ioc_nat_dma_cmd *dma) goto bail; } + for (cnt = 0; cnt < dma->entries; cnt++) { + if (dma->dma[cnt].table_index >= 1) { + IPAERR("Invalid table index %d\n", + dma->dma[cnt].table_index); + ret = -EPERM; + goto bail; + } + + switch (dma->dma[cnt].base_addr) { + case IPA_NAT_BASE_TBL: + if (dma->dma[cnt].offset >= + (ipa_ctx->nat_mem.size_base_tables + 1) * + NAT_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_EXPN_TBL: + if (dma->dma[cnt].offset >= + ipa_ctx->nat_mem.size_expansion_tables * + NAT_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_INDX_TBL: + if (dma->dma[cnt].offset >= + (ipa_ctx->nat_mem.size_base_tables + 1) * + NAT_INTEX_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_INDEX_EXPN_TBL: + if (dma->dma[cnt].offset >= + ipa_ctx->nat_mem.size_expansion_tables * + NAT_INTEX_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + default: + IPAERR("Invalid base_addr %d\n", + dma->dma[cnt].base_addr); + ret = -EPERM; + goto bail; + } + } + size = sizeof(struct ipa_desc) * NUM_OF_DESC; desc = kzalloc(size, GFP_KERNEL); if (desc == NULL) { diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c index 4ec43dd662f9d..07756665a62ba 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_rt.c @@ -227,7 +227,7 @@ int __ipa_generate_rt_hw_rule_v2_6L(enum ipa_ip_type ip, * @hdr_sz: header size * @max_rt_idx: maximal index * - * Returns: 0 on success, negative on failure + * Returns: size on success, negative on failure * * caller needs to hold any needed locks to ensure integrity * @@ -356,7 +356,11 @@ static int ipa_generate_rt_hw_tbl_common(enum ipa_ip_type ip, u8 *base, u8 *hdr, ((long)body & IPA_RT_ENTRY_MEMORY_ALLIGNMENT)); } else { - WARN_ON(tbl->sz == 0); + if (tbl->sz == 0) { + IPAERR("cannot generate 0 size table\n"); + goto proc_err; + } + /* allocate memory for the RT tbl */ rt_tbl_mem.size = tbl->sz; rt_tbl_mem.base = @@ -429,8 +433,15 @@ static int ipa_generate_rt_hw_tbl_v1_1(enum ipa_ip_type ip, u8 *base; int max_rt_idx; int i; + int res; + + res = ipa_get_rt_hw_tbl_size(ip, &hdr_sz, &max_rt_idx); + if (res < 0) { + IPAERR("ipa_get_rt_hw_tbl_size failed %d\n", res); + goto error; + } - mem->size = ipa_get_rt_hw_tbl_size(ip, &hdr_sz, &max_rt_idx); + mem->size = res; mem->size = (mem->size + IPA_RT_TABLE_MEMORY_ALLIGNMENT) & ~IPA_RT_TABLE_MEMORY_ALLIGNMENT; @@ -603,6 +614,7 @@ static int ipa_generate_rt_hw_tbl_v2(enum ipa_ip_type ip, int num_index; u32 body_start_offset; u32 apps_start_idx; + int res; if (ip == IPA_IP_v4) { num_index = IPA_MEM_PART(v4_apps_rt_index_hi) - @@ -632,7 +644,13 @@ static int ipa_generate_rt_hw_tbl_v2(enum ipa_ip_type ip, entr++; } - mem->size = ipa_get_rt_hw_tbl_size(ip, &hdr_sz, &max_rt_idx); + res = ipa_get_rt_hw_tbl_size(ip, &hdr_sz, &max_rt_idx); + if (res < 0) { + IPAERR("ipa_get_rt_hw_tbl_size failed %d\n", res); + goto base_err; + } + + mem->size = res; mem->size -= hdr_sz; mem->size = (mem->size + IPA_RT_TABLE_MEMORY_ALLIGNMENT) & ~IPA_RT_TABLE_MEMORY_ALLIGNMENT; @@ -834,12 +852,16 @@ int ipa2_query_rt_index(struct ipa_ioc_get_rt_tbl_indx *in) return -EINVAL; } + mutex_lock(&ipa_ctx->lock); /* check if this table exists */ entry = __ipa_find_rt_tbl(in->ip, in->name); - if (!entry) + if (!entry) { + mutex_unlock(&ipa_ctx->lock); return -EFAULT; + } in->idx = entry->idx; + mutex_unlock(&ipa_ctx->lock); return 0; } @@ -882,7 +904,7 @@ static struct ipa_rt_tbl *__ipa_add_rt_tbl(enum ipa_ip_type ip, INIT_LIST_HEAD(&entry->link); strlcpy(entry->name, name, IPA_RESOURCE_NAME_MAX); entry->set = set; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_RT_TBL_COOKIE; entry->in_sys = (ip == IPA_IP_v4) ? !ipa_ctx->ip4_rt_tbl_lcl : !ipa_ctx->ip6_rt_tbl_lcl; set->tbl_cnt++; @@ -895,12 +917,16 @@ static struct ipa_rt_tbl *__ipa_add_rt_tbl(enum ipa_ip_type ip, if (id < 0) { IPAERR("failed to add to tree\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; } return entry; +ipa_insert_failed: + set->tbl_cnt--; + list_del(&entry->link); fail_rt_idx_alloc: entry->cookie = 0; kmem_cache_free(ipa_ctx->rt_tbl_cache, entry); @@ -913,7 +939,7 @@ static int __ipa_del_rt_tbl(struct ipa_rt_tbl *entry) enum ipa_ip_type ip = IPA_IP_MAX; u32 id; - if (entry == NULL || (entry->cookie != IPA_COOKIE)) { + if (entry == NULL || (entry->cookie != IPA_RT_TBL_COOKIE)) { IPAERR("bad parms\n"); return -EINVAL; } @@ -927,8 +953,11 @@ static int __ipa_del_rt_tbl(struct ipa_rt_tbl *entry) ip = IPA_IP_v4; else if (entry->set == &ipa_ctx->rt_tbl_set[IPA_IP_v6]) ip = IPA_IP_v6; - else + else { WARN_ON(1); + return -EPERM; + } + if (!entry->in_sys) { list_del(&entry->link); @@ -967,13 +996,14 @@ static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name, if (rule->hdr_hdl) { hdr = ipa_id_find(rule->hdr_hdl); - if ((hdr == NULL) || (hdr->cookie != IPA_COOKIE)) { + if ((hdr == NULL) || (hdr->cookie != IPA_HDR_COOKIE)) { IPAERR("rt rule does not point to valid hdr\n"); goto error; } } else if (rule->hdr_proc_ctx_hdl) { proc_ctx = ipa_id_find(rule->hdr_proc_ctx_hdl); - if ((proc_ctx == NULL) || (proc_ctx->cookie != IPA_COOKIE)) { + if ((proc_ctx == NULL) || + (proc_ctx->cookie != IPA_PROC_HDR_COOKIE)) { IPAERR("rt rule does not point to valid proc ctx\n"); goto error; } @@ -981,7 +1011,7 @@ static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name, tbl = __ipa_add_rt_tbl(ip, name); - if (tbl == NULL || (tbl->cookie != IPA_COOKIE)) { + if (tbl == NULL || (tbl->cookie != IPA_RT_TBL_COOKIE)) { IPAERR("bad params\n"); goto error; } @@ -1002,7 +1032,7 @@ static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name, goto error; } INIT_LIST_HEAD(&entry->link); - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_RT_RULE_COOKIE; entry->rule = *rule; entry->tbl = tbl; entry->hdr = hdr; @@ -1095,7 +1125,7 @@ int __ipa_del_rt_rule(u32 rule_hdl) return -EINVAL; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_RT_RULE_COOKIE) { IPAERR("bad params\n"); return -EINVAL; } @@ -1330,7 +1360,11 @@ int ipa2_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup) } mutex_lock(&ipa_ctx->lock); entry = __ipa_find_rt_tbl(lookup->ip, lookup->name); - if (entry && entry->cookie == IPA_COOKIE) { + if (entry && entry->cookie == IPA_RT_TBL_COOKIE) { + if (entry->ref_cnt == U32_MAX) { + IPAERR("fail: ref count crossed limit\n"); + goto ret; + } entry->ref_cnt++; lookup->hdl = entry->id; @@ -1340,6 +1374,8 @@ int ipa2_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup) result = 0; } + +ret: mutex_unlock(&ipa_ctx->lock); return result; @@ -1367,7 +1403,7 @@ int ipa2_put_rt_tbl(u32 rt_tbl_hdl) goto ret; } - if ((entry->cookie != IPA_COOKIE) || entry->ref_cnt == 0) { + if ((entry->cookie != IPA_RT_TBL_COOKIE) || entry->ref_cnt == 0) { IPAERR("bad parms\n"); result = -EINVAL; goto ret; @@ -1377,8 +1413,11 @@ int ipa2_put_rt_tbl(u32 rt_tbl_hdl) ip = IPA_IP_v4; else if (entry->set == &ipa_ctx->rt_tbl_set[IPA_IP_v6]) ip = IPA_IP_v6; - else + else { WARN_ON(1); + result = -EINVAL; + goto ret; + } entry->ref_cnt--; if (entry->ref_cnt == 0 && entry->rule_cnt == 0) { @@ -1405,7 +1444,7 @@ static int __ipa_mdfy_rt_rule(struct ipa_rt_rule_mdfy *rtrule) if (rtrule->rule.hdr_hdl) { hdr = ipa_id_find(rtrule->rule.hdr_hdl); - if ((hdr == NULL) || (hdr->cookie != IPA_COOKIE)) { + if ((hdr == NULL) || (hdr->cookie != IPA_HDR_COOKIE)) { IPAERR("rt rule does not point to valid hdr\n"); goto error; } @@ -1417,7 +1456,7 @@ static int __ipa_mdfy_rt_rule(struct ipa_rt_rule_mdfy *rtrule) goto error; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_RT_RULE_COOKIE) { IPAERR("bad params\n"); goto error; } diff --git a/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c index 7cdb314f2196b..6e6af15be0399 100644 --- a/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v2/ipa_utils.c @@ -969,6 +969,11 @@ enum ipacm_client_enum ipa2_get_client(int pipe_idx) */ bool ipa2_get_client_uplink(int pipe_idx) { + if (pipe_idx < 0 || pipe_idx >= IPA_MAX_NUM_PIPES) { + IPAERR("invalid pipe idx %d\n", pipe_idx); + return false; + } + return ipa_ctx->ipacm_client[pipe_idx].uplink; } diff --git a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c index 7b16b51ff72c1..de17a0e58ccbe 100644 --- a/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v2/rmnet_ipa.c @@ -73,6 +73,7 @@ static void *subsys_notify_handle; u32 apps_to_ipa_hdl, ipa_to_apps_hdl; /* get handler from ipa */ static struct mutex ipa_to_apps_pipe_handle_guard; +static struct mutex add_mux_channel_lock; static int wwan_add_ul_flt_rule_to_ipa(void); static int wwan_del_ul_flt_rule_to_ipa(void); static void ipa_wwan_msg_free_cb(void*, u32, u32); @@ -1405,9 +1406,11 @@ static int ipa_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) rmnet_mux_val.mux_id); return rc; } + mutex_lock(&add_mux_channel_lock); if (rmnet_index >= MAX_NUM_OF_MUX_CHANNEL) { IPAWANERR("Exceed mux_channel limit(%d)\n", rmnet_index); + mutex_unlock(&add_mux_channel_lock); return -EFAULT; } IPAWANDBG("ADD_MUX_CHANNEL(%d, name: %s)\n", @@ -1419,6 +1422,9 @@ static int ipa_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) memcpy(mux_channel[rmnet_index].vchannel_name, extend_ioctl_data.u.rmnet_mux_val.vchannel_name, sizeof(mux_channel[rmnet_index].vchannel_name)); + mux_channel[rmnet_index].vchannel_name[ + IFNAMSIZ - 1] = '\0'; + IPAWANDBG("cashe device[%s:%d] in IPA_wan[%d]\n", mux_channel[rmnet_index].vchannel_name, mux_channel[rmnet_index].mux_id, @@ -1433,6 +1439,7 @@ static int ipa_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) IPAWANERR("device %s reg IPA failed\n", extend_ioctl_data.u. rmnet_mux_val.vchannel_name); + mutex_unlock(&add_mux_channel_lock); return -ENODEV; } mux_channel[rmnet_index].mux_channel_set = true; @@ -1445,6 +1452,7 @@ static int ipa_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) mux_channel[rmnet_index].ul_flt_reg = false; } rmnet_index++; + mutex_unlock(&add_mux_channel_lock); break; case RMNET_IOCTL_SET_EGRESS_DATA_FORMAT: IPAWANDBG("get RMNET_IOCTL_SET_EGRESS_DATA_FORMAT\n"); @@ -2467,6 +2475,9 @@ int rmnet_ipa_set_data_quota(struct wan_ioctl_set_data_quota *data) int index; struct ipa_set_data_usage_quota_req_msg_v01 req; + /* prevent string buffer overflows */ + data->interface_name[IFNAMSIZ-1] = '\0'; + index = find_vchannel_name_index(data->interface_name); IPAWANERR("iface name %s, quota %lu\n", data->interface_name, @@ -2500,7 +2511,7 @@ int rmnet_ipa_set_data_quota(struct wan_ioctl_set_data_quota *data) * * Return codes: * 0: Success - * -EFAULT: Invalid interface name provided + * -EFAULT: Invalid src/dst pipes provided * other: See ipa_qmi_set_data_quota */ int rmnet_ipa_set_tether_client_pipe( @@ -2508,6 +2519,23 @@ int rmnet_ipa_set_tether_client_pipe( { int number, i; + /* error checking if ul_src_pipe_len valid or not*/ + if (data->ul_src_pipe_len > QMI_IPA_MAX_PIPES_V01 || + data->ul_src_pipe_len < 0) { + IPAWANERR("UL src pipes %d exceeding max %d\n", + data->ul_src_pipe_len, + QMI_IPA_MAX_PIPES_V01); + return -EFAULT; + } + /* error checking if dl_dst_pipe_len valid or not*/ + if (data->dl_dst_pipe_len > QMI_IPA_MAX_PIPES_V01 || + data->dl_dst_pipe_len < 0) { + IPAWANERR("DL dst pipes %d exceeding max %d\n", + data->dl_dst_pipe_len, + QMI_IPA_MAX_PIPES_V01); + return -EFAULT; + } + IPAWANDBG("client %d, UL %d, DL %d, reset %d\n", data->ipa_client, data->ul_src_pipe_len, @@ -2775,6 +2803,7 @@ static int __init ipa_wwan_init(void) atomic_set(&is_ssr, 0); mutex_init(&ipa_to_apps_pipe_handle_guard); + mutex_init(&add_mux_channel_lock); ipa_to_apps_hdl = -1; ipa_qmi_init(); @@ -2793,6 +2822,7 @@ static void __exit ipa_wwan_cleanup(void) int ret; ipa_qmi_cleanup(); mutex_destroy(&ipa_to_apps_pipe_handle_guard); + mutex_destroy(&add_mux_channel_lock); ret = subsys_notif_unregister_notifier(subsys_notify_handle, &ssr_notifier); if (ret) diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa.c b/drivers/platform/msm/ipa/ipa_v3/ipa.c index 3f0d982857b28..5f91d41096dd1 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa.c @@ -759,7 +759,8 @@ static long ipa3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) retval = -EINVAL; break; } - if (ipa3_del_hdr((struct ipa_ioc_del_hdr *)param)) { + if (ipa3_del_hdr_by_user((struct ipa_ioc_del_hdr *)param, + true)) { retval = -EFAULT; break; } @@ -1528,8 +1529,8 @@ static long ipa3_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) retval = -EINVAL; break; } - if (ipa3_del_hdr_proc_ctx( - (struct ipa_ioc_del_hdr_proc_ctx *)param)) { + if (ipa3_del_hdr_proc_ctx_by_user( + (struct ipa_ioc_del_hdr_proc_ctx *)param, true)) { retval = -EFAULT; break; } @@ -2063,7 +2064,7 @@ static int ipa3_q6_clean_q6_tables(void) mem.size = IPA_HW_TBL_HDR_WIDTH; mem.base = dma_alloc_coherent(ipa3_ctx->pdev, mem.size, - &mem.phys_base, GFP_KERNEL); + &mem.phys_base, GFP_ATOMIC); if (!mem.base) { IPAERR("failed to alloc DMA buff of size %d\n", mem.size); return -ENOMEM; @@ -2978,7 +2979,7 @@ static int ipa3_setup_apps_pipes(void) if (ipa3_ctx->dflt_v4_rt_rule_hdl) __ipa3_del_rt_rule(ipa3_ctx->dflt_v4_rt_rule_hdl); if (ipa3_ctx->excp_hdr_hdl) - __ipa3_del_hdr(ipa3_ctx->excp_hdr_hdl); + __ipa3_del_hdr(ipa3_ctx->excp_hdr_hdl, false); ipa3_teardown_sys_pipe(ipa3_ctx->clnt_hdl_cmd); fail_cmd: return result; @@ -2990,7 +2991,7 @@ static void ipa3_teardown_apps_pipes(void) ipa3_teardown_sys_pipe(ipa3_ctx->clnt_hdl_data_in); __ipa3_del_rt_rule(ipa3_ctx->dflt_v6_rt_rule_hdl); __ipa3_del_rt_rule(ipa3_ctx->dflt_v4_rt_rule_hdl); - __ipa3_del_hdr(ipa3_ctx->excp_hdr_hdl); + __ipa3_del_hdr(ipa3_ctx->excp_hdr_hdl, false); ipa3_teardown_sys_pipe(ipa3_ctx->clnt_hdl_cmd); } @@ -4065,7 +4066,7 @@ static int ipa3_trigger_fw_loading_mdms(void) IPADBG("FWs are available for loading\n"); - result = ipa3_load_fws(fw); + result = ipa3_load_fws(fw, ipa3_res.transport_mem_base); if (result) { IPAERR("IPA FWs loading has failed\n"); release_firmware(fw); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c index 0436ff8cf9d5a..2534df7e871cf 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_debugfs.c @@ -106,6 +106,7 @@ static char dbg_buff[IPA_MAX_MSG_LEN]; static char *active_clients_buf; static s8 ep_reg_idx; +static void *ipa_ipc_low_buff; static ssize_t ipa3_read_gen_reg(struct file *file, char __user *ubuf, @@ -1715,22 +1716,20 @@ static ssize_t ipa3_enable_ipc_low(struct file *file, if (kstrtos8(dbg_buff, 0, &option)) return -EFAULT; + mutex_lock(&ipa3_ctx->lock); if (option) { - if (!ipa3_ctx->logbuf_low) { - ipa3_ctx->logbuf_low = + if (!ipa_ipc_low_buff) { + ipa_ipc_low_buff = ipc_log_context_create(IPA_IPC_LOG_PAGES, "ipa_low", 0); } - - if (ipa3_ctx->logbuf_low == NULL) { - IPAERR("failed to get logbuf_low\n"); - return -EFAULT; - } + if (ipa_ipc_low_buff == NULL) + IPAERR("failed to get logbuf_low\n"); + ipa3_ctx->logbuf_low = ipa_ipc_low_buff; } else { - if (ipa3_ctx->logbuf_low) - ipc_log_context_destroy(ipa3_ctx->logbuf_low); ipa3_ctx->logbuf_low = NULL; } + mutex_unlock(&ipa3_ctx->lock); return count; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c index f4307d2bf1a06..28ca219833a47 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_flt.c @@ -1085,7 +1085,7 @@ static int __ipa_validate_flt_rule(const struct ipa_flt_rule *rule, goto error; } - if ((*rt_tbl)->cookie != IPA_COOKIE) { + if ((*rt_tbl)->cookie != IPA_RT_TBL_COOKIE) { IPAERR("RT table cookie is invalid\n"); goto error; } @@ -1130,7 +1130,7 @@ static int __ipa_create_flt_entry(struct ipa3_flt_entry **entry, } INIT_LIST_HEAD(&((*entry)->link)); (*entry)->rule = *rule; - (*entry)->cookie = IPA_COOKIE; + (*entry)->cookie = IPA_FLT_COOKIE; (*entry)->rt_tbl = rt_tbl; (*entry)->tbl = tbl; if (rule->rule_id) { @@ -1165,12 +1165,18 @@ static int __ipa_finish_flt_rule_add(struct ipa3_flt_tbl *tbl, if (id < 0) { IPAERR("failed to add to tree\n"); WARN_ON(1); + goto ipa_insert_failed; } *rule_hdl = id; entry->id = id; IPADBG_LOW("add flt rule rule_cnt=%d\n", tbl->rule_cnt); return 0; +ipa_insert_failed: + if (entry->rt_tbl) + entry->rt_tbl->ref_cnt--; + tbl->rule_cnt--; + return -EPERM; } static int __ipa_add_flt_rule(struct ipa3_flt_tbl *tbl, enum ipa_ip_type ip, @@ -1196,9 +1202,17 @@ static int __ipa_add_flt_rule(struct ipa3_flt_tbl *tbl, enum ipa_ip_type ip, list_add(&entry->link, &tbl->head_flt_rule_list); } - __ipa_finish_flt_rule_add(tbl, entry, rule_hdl); + if (__ipa_finish_flt_rule_add(tbl, entry, rule_hdl)) + goto ipa_insert_failed; return 0; +ipa_insert_failed: + list_del(&entry->link); + /* if rule id was allocated from idr, remove it */ + if (entry->rule_id >= IPA_RULE_ID_MIN_VAL && + entry->rule_id <= IPA_RULE_ID_MAX_VAL) + idr_remove(&entry->tbl->rule_ids, entry->rule_id); + kmem_cache_free(ipa3_ctx->flt_rule_cache, entry); error: return -EPERM; @@ -1230,7 +1244,8 @@ static int __ipa_add_flt_rule_after(struct ipa3_flt_tbl *tbl, list_add(&entry->link, &((*add_after_entry)->link)); - __ipa_finish_flt_rule_add(tbl, entry, rule_hdl); + if (__ipa_finish_flt_rule_add(tbl, entry, rule_hdl)) + goto ipa_insert_failed; /* * prepare for next insertion @@ -1239,6 +1254,14 @@ static int __ipa_add_flt_rule_after(struct ipa3_flt_tbl *tbl, return 0; +ipa_insert_failed: + list_del(&entry->link); + /* if rule id was allocated from idr, remove it */ + if (entry->rule_id >= IPA_RULE_ID_MIN_VAL && + entry->rule_id <= IPA_RULE_ID_MAX_VAL) + idr_remove(&entry->tbl->rule_ids, entry->rule_id); + kmem_cache_free(ipa3_ctx->flt_rule_cache, entry); + error: *add_after_entry = NULL; return -EPERM; @@ -1255,7 +1278,7 @@ static int __ipa_del_flt_rule(u32 rule_hdl) return -EINVAL; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_FLT_COOKIE) { IPAERR("bad params\n"); return -EINVAL; } @@ -1292,7 +1315,7 @@ static int __ipa_mdfy_flt_rule(struct ipa_flt_rule_mdfy *frule, goto error; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_FLT_COOKIE) { IPAERR("bad params\n"); goto error; } @@ -1313,7 +1336,7 @@ static int __ipa_mdfy_flt_rule(struct ipa_flt_rule_mdfy *frule, goto error; } - if (rt_tbl->cookie != IPA_COOKIE) { + if (rt_tbl->cookie != IPA_RT_TBL_COOKIE) { IPAERR("RT table cookie is invalid\n"); goto error; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c index a2e77648f23dd..6d72bebb83ca8 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_hdr.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -332,7 +332,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, } hdr_entry = ipa3_id_find(proc_ctx->hdr_hdl); - if (!hdr_entry || (hdr_entry->cookie != IPA_COOKIE)) { + if (!hdr_entry || (hdr_entry->cookie != IPA_HDR_COOKIE)) { IPAERR("hdr_hdl is invalid\n"); return -EINVAL; } @@ -349,7 +349,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, entry->hdr = hdr_entry; if (add_ref_hdr) hdr_entry->ref_cnt++; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_PROC_HDR_COOKIE; needed_len = ipahal_get_proc_ctx_needed_len(proc_ctx->type); @@ -407,6 +407,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, if (id < 0) { IPAERR("failed to alloc id\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; proc_ctx->proc_ctx_hdl = id; @@ -414,6 +415,14 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, return 0; +ipa_insert_failed: + if (offset) + list_move(&offset->link, + &htbl->head_free_offset_list[offset->bin]); + entry->offset_entry = NULL; + list_del(&entry->link); + htbl->proc_ctx_cnt--; + bad_len: if (add_ref_hdr) hdr_entry->ref_cnt--; @@ -426,7 +435,7 @@ static int __ipa_add_hdr_proc_ctx(struct ipa_hdr_proc_ctx_add *proc_ctx, static int __ipa_add_hdr(struct ipa_hdr_add *hdr) { struct ipa3_hdr_entry *entry; - struct ipa_hdr_offset_entry *offset; + struct ipa_hdr_offset_entry *offset = NULL; u32 bin; struct ipa3_hdr_tbl *htbl = &ipa3_ctx->hdr_tbl; int id; @@ -457,7 +466,7 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) entry->type = hdr->type; entry->is_eth2_ofst_valid = hdr->is_eth2_ofst_valid; entry->eth2_ofst = hdr->eth2_ofst; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_HDR_COOKIE; if (hdr->hdr_len <= ipa_hdr_bin_sz[IPA_HDR_BIN0]) bin = IPA_HDR_BIN0; @@ -531,6 +540,7 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) if (id < 0) { IPAERR("failed to alloc id\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; hdr->hdr_hdl = id; @@ -555,10 +565,18 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) entry->ref_cnt--; hdr->hdr_hdl = 0; ipa3_id_remove(id); +ipa_insert_failed: + if (entry->is_hdr_proc_ctx) { + dma_unmap_single(ipa3_ctx->pdev, entry->phys_base, + entry->hdr_len, DMA_TO_DEVICE); + } else { + if (offset) + list_move(&offset->link, + &htbl->head_free_offset_list[offset->bin]); + entry->offset_entry = NULL; + } htbl->hdr_cnt--; list_del(&entry->link); - dma_unmap_single(ipa3_ctx->pdev, entry->phys_base, - entry->hdr_len, DMA_TO_DEVICE); bad_hdr_len: entry->cookie = 0; kmem_cache_free(ipa3_ctx->hdr_cache, entry); @@ -566,13 +584,14 @@ static int __ipa_add_hdr(struct ipa_hdr_add *hdr) return -EPERM; } -static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) +static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, + bool release_hdr, bool by_user) { struct ipa3_hdr_proc_ctx_entry *entry; struct ipa3_hdr_proc_ctx_tbl *htbl = &ipa3_ctx->hdr_proc_ctx_tbl; entry = ipa3_id_find(proc_ctx_hdl); - if (!entry || (entry->cookie != IPA_COOKIE)) { + if (!entry || (entry->cookie != IPA_PROC_HDR_COOKIE)) { IPAERR("bad parm\n"); return -EINVAL; } @@ -580,6 +599,14 @@ static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) IPADBG("del ctx proc cnt=%d ofst=%d\n", htbl->proc_ctx_cnt, entry->offset_entry->offset); + if (by_user && entry->user_deleted) { + IPAERR("proc_ctx already deleted by user\n"); + return -EINVAL; + } + + if (by_user) + entry->user_deleted = true; + if (--entry->ref_cnt) { IPADBG("proc_ctx_hdl %x ref_cnt %d\n", proc_ctx_hdl, entry->ref_cnt); @@ -587,7 +614,7 @@ static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) } if (release_hdr) - __ipa3_del_hdr(entry->hdr->id); + __ipa3_del_hdr(entry->hdr->id, false); /* move the offset entry to appropriate free list */ list_move(&entry->offset_entry->link, @@ -604,7 +631,7 @@ static int __ipa3_del_hdr_proc_ctx(u32 proc_ctx_hdl, bool release_hdr) } -int __ipa3_del_hdr(u32 hdr_hdl) +int __ipa3_del_hdr(u32 hdr_hdl, bool by_user) { struct ipa3_hdr_entry *entry; struct ipa3_hdr_tbl *htbl = &ipa3_ctx->hdr_tbl; @@ -615,7 +642,7 @@ int __ipa3_del_hdr(u32 hdr_hdl) return -EINVAL; } - if (!entry || (entry->cookie != IPA_COOKIE)) { + if (entry->cookie != IPA_HDR_COOKIE) { IPAERR("bad parm\n"); return -EINVAL; } @@ -627,6 +654,14 @@ int __ipa3_del_hdr(u32 hdr_hdl) IPADBG("del hdr of sz=%d hdr_cnt=%d ofst=%d\n", entry->hdr_len, htbl->hdr_cnt, entry->offset_entry->offset); + if (by_user && entry->user_deleted) { + IPAERR("proc_ctx already deleted by user\n"); + return -EINVAL; + } + + if (by_user) + entry->user_deleted = true; + if (--entry->ref_cnt) { IPADBG("hdr_hdl %x ref_cnt %d\n", hdr_hdl, entry->ref_cnt); return 0; @@ -637,7 +672,7 @@ int __ipa3_del_hdr(u32 hdr_hdl) entry->phys_base, entry->hdr_len, DMA_TO_DEVICE); - __ipa3_del_hdr_proc_ctx(entry->proc_ctx->id, false); + __ipa3_del_hdr_proc_ctx(entry->proc_ctx->id, false, false); } else { /* move the offset entry to appropriate free list */ list_move(&entry->offset_entry->link, @@ -699,15 +734,16 @@ int ipa3_add_hdr(struct ipa_ioc_add_hdr *hdrs) } /** - * ipa3_del_hdr() - Remove the specified headers from SW and optionally commit them - * to IPA HW + * ipa3_del_hdr_by_user() - Remove the specified headers + * from SW and optionally commit them to IPA HW * @hdls: [inout] set of headers to delete + * @by_user: Operation requested by user? * * Returns: 0 on success, negative on failure * * Note: Should not be called from atomic context */ -int ipa3_del_hdr(struct ipa_ioc_del_hdr *hdls) +int ipa3_del_hdr_by_user(struct ipa_ioc_del_hdr *hdls, bool by_user) { int i; int result = -EFAULT; @@ -719,7 +755,7 @@ int ipa3_del_hdr(struct ipa_ioc_del_hdr *hdls) mutex_lock(&ipa3_ctx->lock); for (i = 0; i < hdls->num_hdls; i++) { - if (__ipa3_del_hdr(hdls->hdl[i].hdl)) { + if (__ipa3_del_hdr(hdls->hdl[i].hdl, by_user)) { IPAERR("failed to del hdr %i\n", i); hdls->hdl[i].status = -1; } else { @@ -739,6 +775,20 @@ int ipa3_del_hdr(struct ipa_ioc_del_hdr *hdls) return result; } +/** + * ipa3_del_hdr() - Remove the specified headers from SW and optionally commit them + * to IPA HW + * @hdls: [inout] set of headers to delete + * + * Returns: 0 on success, negative on failure + * + * Note: Should not be called from atomic context + */ +int ipa3_del_hdr(struct ipa_ioc_del_hdr *hdls) +{ + return ipa3_del_hdr_by_user(hdls, false); +} + /** * ipa3_add_hdr_proc_ctx() - add the specified headers to SW * and optionally commit them to IPA HW @@ -784,16 +834,18 @@ int ipa3_add_hdr_proc_ctx(struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs) } /** - * ipa3_del_hdr_proc_ctx() - + * ipa3_del_hdr_proc_ctx_by_user() - * Remove the specified processing context headers from SW and * optionally commit them to IPA HW. * @hdls: [inout] set of processing context headers to delete + * @by_user: Operation requested by user? * * Returns: 0 on success, negative on failure * * Note: Should not be called from atomic context */ -int ipa3_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) +int ipa3_del_hdr_proc_ctx_by_user(struct ipa_ioc_del_hdr_proc_ctx *hdls, + bool by_user) { int i; int result; @@ -805,7 +857,7 @@ int ipa3_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) mutex_lock(&ipa3_ctx->lock); for (i = 0; i < hdls->num_hdls; i++) { - if (__ipa3_del_hdr_proc_ctx(hdls->hdl[i].hdl, true)) { + if (__ipa3_del_hdr_proc_ctx(hdls->hdl[i].hdl, true, by_user)) { IPAERR("failed to del hdr %i\n", i); hdls->hdl[i].status = -1; } else { @@ -825,6 +877,21 @@ int ipa3_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) return result; } +/** + * ipa3_del_hdr_proc_ctx() - + * Remove the specified processing context headers from SW and + * optionally commit them to IPA HW. + * @hdls: [inout] set of processing context headers to delete + * + * Returns: 0 on success, negative on failure + * + * Note: Should not be called from atomic context + */ +int ipa3_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls) +{ + return ipa3_del_hdr_proc_ctx_by_user(hdls, false); +} + /** * ipa3_commit_hdr() - commit to IPA HW the current header table in SW * @@ -1053,7 +1120,7 @@ int __ipa3_release_hdr(u32 hdr_hdl) { int result = 0; - if (__ipa3_del_hdr(hdr_hdl)) { + if (__ipa3_del_hdr(hdr_hdl, false)) { IPADBG("fail to del hdr %x\n", hdr_hdl); result = -EFAULT; goto bail; @@ -1081,7 +1148,7 @@ int __ipa3_release_hdr_proc_ctx(u32 proc_ctx_hdl) { int result = 0; - if (__ipa3_del_hdr_proc_ctx(proc_ctx_hdl, true)) { + if (__ipa3_del_hdr_proc_ctx(proc_ctx_hdl, true, false)) { IPADBG("fail to del hdr %x\n", proc_ctx_hdl); result = -EFAULT; goto bail; @@ -1120,7 +1187,7 @@ int ipa3_put_hdr(u32 hdr_hdl) goto bail; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_HDR_COOKIE) { IPAERR("invalid header entry\n"); result = -EINVAL; goto bail; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h index cb0adc3aa8ed6..9170611be8088 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_i.h @@ -40,6 +40,12 @@ #define DRV_NAME "ipa" #define NAT_DEV_NAME "ipaNatTable" #define IPA_COOKIE 0x57831603 +#define IPA_RT_RULE_COOKIE 0x57831604 +#define IPA_RT_TBL_COOKIE 0x57831605 +#define IPA_FLT_COOKIE 0x57831606 +#define IPA_HDR_COOKIE 0x57831607 +#define IPA_PROC_HDR_COOKIE 0x57831608 + #define MTU_BYTE 1500 #define IPA3_MAX_NUM_PIPES 31 @@ -253,8 +259,8 @@ struct ipa_smmu_cb_ctx { */ struct ipa3_flt_entry { struct list_head link; - struct ipa_flt_rule rule; u32 cookie; + struct ipa_flt_rule rule; struct ipa3_flt_tbl *tbl; struct ipa3_rt_tbl *rt_tbl; u32 hw_len; @@ -282,13 +288,13 @@ struct ipa3_flt_entry { */ struct ipa3_rt_tbl { struct list_head link; + u32 cookie; struct list_head head_rt_rule_list; char name[IPA_RESOURCE_NAME_MAX]; u32 idx; u32 rule_cnt; u32 ref_cnt; struct ipa3_rt_tbl_set *set; - u32 cookie; bool in_sys[IPA_RULE_TYPE_MAX]; u32 sz[IPA_RULE_TYPE_MAX]; struct ipa_mem_buffer curr_mem[IPA_RULE_TYPE_MAX]; @@ -316,9 +322,11 @@ struct ipa3_rt_tbl { * @id: header entry id * @is_eth2_ofst_valid: is eth2_ofst field valid? * @eth2_ofst: offset to start of Ethernet-II/802.3 header + * @user_deleted: is the header deleted by the user? */ struct ipa3_hdr_entry { struct list_head link; + u32 cookie; u8 hdr[IPA_HDR_MAX_SIZE]; u32 hdr_len; char name[IPA_RESOURCE_NAME_MAX]; @@ -328,11 +336,11 @@ struct ipa3_hdr_entry { dma_addr_t phys_base; struct ipa3_hdr_proc_ctx_entry *proc_ctx; struct ipa_hdr_offset_entry *offset_entry; - u32 cookie; u32 ref_cnt; int id; u8 is_eth2_ofst_valid; u16 eth2_ofst; + bool user_deleted; }; /** @@ -372,15 +380,17 @@ struct ipa3_hdr_proc_ctx_offset_entry { * @cookie: cookie used for validity check * @ref_cnt: reference counter of routing table * @id: processing context header entry id + * @user_deleted: is the hdr processing context deleted by the user? */ struct ipa3_hdr_proc_ctx_entry { struct list_head link; + u32 cookie; enum ipa_hdr_proc_type type; struct ipa3_hdr_proc_ctx_offset_entry *offset_entry; struct ipa3_hdr_entry *hdr; - u32 cookie; u32 ref_cnt; int id; + bool user_deleted; }; /** @@ -439,8 +449,8 @@ struct ipa3_flt_tbl { */ struct ipa3_rt_entry { struct list_head link; - struct ipa_rt_rule rule; u32 cookie; + struct ipa_rt_rule rule; struct ipa3_rt_tbl *tbl; struct ipa3_hdr_entry *hdr; struct ipa3_hdr_proc_ctx_entry *proc_ctx; @@ -1512,6 +1522,8 @@ int ipa3_add_hdr(struct ipa_ioc_add_hdr *hdrs); int ipa3_del_hdr(struct ipa_ioc_del_hdr *hdls); +int ipa3_del_hdr_by_user(struct ipa_ioc_del_hdr *hdls, bool by_user); + int ipa3_commit_hdr(void); int ipa3_reset_hdr(void); @@ -1529,6 +1541,9 @@ int ipa3_add_hdr_proc_ctx(struct ipa_ioc_add_hdr_proc_ctx *proc_ctxs); int ipa3_del_hdr_proc_ctx(struct ipa_ioc_del_hdr_proc_ctx *hdls); +int ipa3_del_hdr_proc_ctx_by_user(struct ipa_ioc_del_hdr_proc_ctx *hdls, + bool by_user); + /* * Routing */ @@ -1833,7 +1848,7 @@ int ipa3_active_clients_log_print_table(char *buf, int size); void ipa3_active_clients_log_clear(void); int ipa3_interrupts_init(u32 ipa_irq, u32 ee, struct device *ipa_dev); int __ipa3_del_rt_rule(u32 rule_hdl); -int __ipa3_del_hdr(u32 hdr_hdl); +int __ipa3_del_hdr(u32 hdr_hdl, bool by_user); int __ipa3_release_hdr(u32 hdr_hdl); int __ipa3_release_hdr_proc_ctx(u32 proc_ctx_hdl); int _ipa_read_ep_reg_v3_0(char *buf, int max_len, int pipe); @@ -1996,7 +2011,7 @@ int ipa3_uc_panic_notifier(struct notifier_block *this, unsigned long event, void *ptr); void ipa3_inc_acquire_wakelock(void); void ipa3_dec_release_wakelock(void); -int ipa3_load_fws(const struct firmware *firmware); +int ipa3_load_fws(const struct firmware *firmware, phys_addr_t gsi_mem_base); int ipa3_register_ipa_ready_cb(void (*ipa_ready_cb)(void *), void *user_data); const char *ipa_hw_error_str(enum ipa3_hw_errors err_type); int ipa_gsi_ch20_wa(void); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c b/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c index 32c5004dda954..2f640943c483f 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_intf.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -275,6 +275,14 @@ int ipa3_query_intf_tx_props(struct ipa_ioc_query_intf_tx_props *tx) mutex_lock(&ipa3_ctx->lock); list_for_each_entry(entry, &ipa3_ctx->intf_list, link) { if (!strcmp(entry->name, tx->name)) { + /* add the entry check */ + if (entry->num_tx_props != tx->num_tx_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_tx_props, + tx->num_tx_props); + mutex_unlock(&ipa3_ctx->lock); + return result; + } memcpy(tx->tx, entry->tx, entry->num_tx_props * sizeof(struct ipa_ioc_tx_intf_prop)); result = 0; @@ -282,7 +290,6 @@ int ipa3_query_intf_tx_props(struct ipa_ioc_query_intf_tx_props *tx) } } mutex_unlock(&ipa3_ctx->lock); - return result; } @@ -314,6 +321,14 @@ int ipa3_query_intf_rx_props(struct ipa_ioc_query_intf_rx_props *rx) mutex_lock(&ipa3_ctx->lock); list_for_each_entry(entry, &ipa3_ctx->intf_list, link) { if (!strcmp(entry->name, rx->name)) { + /* add the entry check */ + if (entry->num_rx_props != rx->num_rx_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_rx_props, + rx->num_rx_props); + mutex_unlock(&ipa3_ctx->lock); + return result; + } memcpy(rx->rx, entry->rx, entry->num_rx_props * sizeof(struct ipa_ioc_rx_intf_prop)); result = 0; @@ -321,7 +336,6 @@ int ipa3_query_intf_rx_props(struct ipa_ioc_query_intf_rx_props *rx) } } mutex_unlock(&ipa3_ctx->lock); - return result; } @@ -348,6 +362,14 @@ int ipa3_query_intf_ext_props(struct ipa_ioc_query_intf_ext_props *ext) mutex_lock(&ipa3_ctx->lock); list_for_each_entry(entry, &ipa3_ctx->intf_list, link) { if (!strcmp(entry->name, ext->name)) { + /* add the entry check */ + if (entry->num_ext_props != ext->num_ext_props) { + IPAERR("invalid entry number(%u %u)\n", + entry->num_ext_props, + ext->num_ext_props); + mutex_unlock(&ipa3_ctx->lock); + return result; + } memcpy(ext->ext, entry->ext, entry->num_ext_props * sizeof(struct ipa_ioc_ext_intf_prop)); result = 0; @@ -531,6 +553,8 @@ ssize_t ipa3_read(struct file *filp, char __user *buf, size_t count, if (copy_to_user(buf, &msg->meta, sizeof(struct ipa_msg_meta))) { ret = -EFAULT; + kfree(msg); + msg = NULL; break; } buf += sizeof(struct ipa_msg_meta); @@ -539,6 +563,8 @@ ssize_t ipa3_read(struct file *filp, char __user *buf, size_t count, if (copy_to_user(buf, msg->buff, msg->meta.msg_len)) { ret = -EFAULT; + kfree(msg); + msg = NULL; break; } buf += msg->meta.msg_len; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c b/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c index 67e9b397a8b49..e7e5cf114242e 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_nat.c @@ -24,6 +24,17 @@ #define IPA_NAT_TEMP_MEM_SIZE 128 +enum nat_table_type { + IPA_NAT_BASE_TBL = 0, + IPA_NAT_EXPN_TBL = 1, + IPA_NAT_INDX_TBL = 2, + IPA_NAT_INDEX_EXPN_TBL = 3, +}; + +#define NAT_TABLE_ENTRY_SIZE_BYTE 32 +#define NAT_INTEX_TABLE_ENTRY_SIZE_BYTE 4 + + static int ipa3_nat_vma_fault_remap( struct vm_area_struct *vma, struct vm_fault *vmf) { @@ -571,6 +582,71 @@ int ipa3_nat_dma_cmd(struct ipa_ioc_nat_dma_cmd *dma) goto bail; } + for (cnt = 0; cnt < dma->entries; cnt++) { + if (dma->dma[cnt].table_index >= 1) { + IPAERR("Invalid table index %d\n", + dma->dma[cnt].table_index); + ret = -EPERM; + goto bail; + } + + switch (dma->dma[cnt].base_addr) { + case IPA_NAT_BASE_TBL: + if (dma->dma[cnt].offset >= + (ipa3_ctx->nat_mem.size_base_tables + 1) * + NAT_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_EXPN_TBL: + if (dma->dma[cnt].offset >= + ipa3_ctx->nat_mem.size_expansion_tables * + NAT_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_INDX_TBL: + if (dma->dma[cnt].offset >= + (ipa3_ctx->nat_mem.size_base_tables + 1) * + NAT_INTEX_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + case IPA_NAT_INDEX_EXPN_TBL: + if (dma->dma[cnt].offset >= + ipa3_ctx->nat_mem.size_expansion_tables * + NAT_INTEX_TABLE_ENTRY_SIZE_BYTE) { + IPAERR("Invalid offset %d\n", + dma->dma[cnt].offset); + ret = -EPERM; + goto bail; + } + + break; + + default: + IPAERR("Invalid base_addr %d\n", + dma->dma[cnt].base_addr); + ret = -EPERM; + goto bail; + } + } + size = sizeof(struct ipa3_desc) * NUM_OF_DESC; desc = kzalloc(size, GFP_KERNEL); if (desc == NULL) { diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c index 11d196e23bf35..846d6045f3cc9 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -52,6 +52,8 @@ struct ipa3_qmi_context *ipa3_qmi_ctx; static bool workqueues_stopped; static bool ipa3_modem_init_cmplt; static bool first_time_handshake; +struct mutex ipa3_qmi_lock; + /* QMI A5 service */ static struct msg_desc ipa3_indication_reg_req_desc = { @@ -597,12 +599,17 @@ int ipa3_qmi_filter_request_send(struct ipa_install_fltr_rule_req_msg_v01 *req) req->filter_spec_ex_list_len); } - /* cache the qmi_filter_request */ - memcpy(&(ipa3_qmi_ctx->ipa_install_fltr_rule_req_msg_cache[ - ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg]), - req, sizeof(struct ipa_install_fltr_rule_req_msg_v01)); - ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg++; - ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg %= 10; + mutex_lock(&ipa3_qmi_lock); + if (ipa3_qmi_ctx != NULL) { + /* cache the qmi_filter_request */ + memcpy(&(ipa3_qmi_ctx->ipa_install_fltr_rule_req_msg_cache[ + ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg]), + req, + sizeof(struct ipa_install_fltr_rule_req_msg_v01)); + ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg++; + ipa3_qmi_ctx->num_ipa_install_fltr_rule_req_msg %= 10; + } + mutex_unlock(&ipa3_qmi_lock); req_desc.max_msg_len = QMI_IPA_INSTALL_FILTER_RULE_REQ_MAX_MSG_LEN_V01; req_desc.msg_id = QMI_IPA_INSTALL_FILTER_RULE_REQ_V01; @@ -624,7 +631,6 @@ int ipa3_qmi_filter_request_send(struct ipa_install_fltr_rule_req_msg_v01 *req) resp.resp.error, "ipa_install_filter"); } - int ipa3_qmi_enable_force_clear_datapath_send( struct ipa_enable_force_clear_datapath_req_msg_v01 *req) { @@ -733,12 +739,17 @@ int ipa3_qmi_filter_notify_send( return -EINVAL; } - /* cache the qmi_filter_request */ - memcpy(&(ipa3_qmi_ctx->ipa_fltr_installed_notif_req_msg_cache[ - ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg]), - req, sizeof(struct ipa_fltr_installed_notif_req_msg_v01)); - ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg++; - ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg %= 10; + mutex_lock(&ipa3_qmi_lock); + if (ipa3_qmi_ctx != NULL) { + /* cache the qmi_filter_request */ + memcpy(&(ipa3_qmi_ctx->ipa_fltr_installed_notif_req_msg_cache[ + ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg]), + req, + sizeof(struct ipa_fltr_installed_notif_req_msg_v01)); + ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg++; + ipa3_qmi_ctx->num_ipa_fltr_installed_notif_req_msg %= 10; + } + mutex_unlock(&ipa3_qmi_lock); req_desc.max_msg_len = QMI_IPA_FILTER_INSTALLED_NOTIF_REQ_MAX_MSG_LEN_V01; @@ -1095,10 +1106,13 @@ void ipa3_qmi_service_exit(void) } /* clean the QMI msg cache */ + mutex_lock(&ipa3_qmi_lock); if (ipa3_qmi_ctx != NULL) { vfree(ipa3_qmi_ctx); ipa3_qmi_ctx = NULL; } + mutex_unlock(&ipa3_qmi_lock); + ipa3_svc_handle = 0; ipa3_qmi_modem_init_fin = false; ipa3_qmi_indication_fin = false; @@ -1267,3 +1281,13 @@ int ipa3_qmi_stop_data_qouta(void) resp.resp.error, "ipa_stop_data_usage_quota_req_msg_v01"); } +void ipa3_qmi_init(void) +{ + mutex_init(&ipa3_qmi_lock); +} + +void ipa3_qmi_cleanup(void) +{ + mutex_destroy(&ipa3_qmi_lock); +} + diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h index 0f641204cc77a..707c21aaa139d 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_qmi_service.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -193,6 +193,10 @@ int ipa3_qmi_stop_data_qouta(void); void ipa3_q6_handshake_complete(bool ssr_bootup); +void ipa3_qmi_init(void); + +void ipa3_qmi_cleanup(void); + #else /* CONFIG_RMNET_IPA3 */ static inline int ipa3_qmi_service_init(uint32_t wan_platform_type) @@ -298,6 +302,14 @@ static inline int ipa3_qmi_stop_data_qouta(void) static inline void ipa3_q6_handshake_complete(bool ssr_bootup) { } +static inline void ipa3_qmi_init(void) +{ +} + +static inline void ipa3_qmi_cleanup(void) +{ +} + #endif /* CONFIG_RMNET_IPA3 */ #endif /* IPA_QMI_SERVICE_H */ diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c index 4ee0a3e06ebf5..d7c91d9415080 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_rt.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -901,12 +901,15 @@ int ipa3_query_rt_index(struct ipa_ioc_get_rt_tbl_indx *in) return -EINVAL; } + mutex_lock(&ipa3_ctx->lock); /* check if this table exists */ entry = __ipa3_find_rt_tbl(in->ip, in->name); - if (!entry) + if (!entry) { + mutex_unlock(&ipa3_ctx->lock); return -EFAULT; - + } in->idx = entry->idx; + mutex_unlock(&ipa3_ctx->lock); return 0; } @@ -967,7 +970,7 @@ static struct ipa3_rt_tbl *__ipa_add_rt_tbl(enum ipa_ip_type ip, INIT_LIST_HEAD(&entry->link); strlcpy(entry->name, name, IPA_RESOURCE_NAME_MAX); entry->set = set; - entry->cookie = IPA_COOKIE; + entry->cookie = IPA_RT_TBL_COOKIE; entry->in_sys[IPA_RULE_HASHABLE] = (ip == IPA_IP_v4) ? !ipa3_ctx->ip4_rt_tbl_hash_lcl : !ipa3_ctx->ip6_rt_tbl_hash_lcl; @@ -985,12 +988,16 @@ static struct ipa3_rt_tbl *__ipa_add_rt_tbl(enum ipa_ip_type ip, if (id < 0) { IPAERR("failed to add to tree\n"); WARN_ON(1); + goto ipa_insert_failed; } entry->id = id; } return entry; - +ipa_insert_failed: + set->tbl_cnt--; + list_del(&entry->link); + idr_destroy(&entry->rule_ids); fail_rt_idx_alloc: entry->cookie = 0; kmem_cache_free(ipa3_ctx->rt_tbl_cache, entry); @@ -1004,7 +1011,7 @@ static int __ipa_del_rt_tbl(struct ipa3_rt_tbl *entry) u32 id; struct ipa3_rt_tbl_set *rset; - if (entry == NULL || (entry->cookie != IPA_COOKIE)) { + if (entry == NULL || (entry->cookie != IPA_RT_TBL_COOKIE)) { IPAERR("bad parms\n"); return -EINVAL; } @@ -1018,8 +1025,10 @@ static int __ipa_del_rt_tbl(struct ipa3_rt_tbl *entry) ip = IPA_IP_v4; else if (entry->set == &ipa3_ctx->rt_tbl_set[IPA_IP_v6]) ip = IPA_IP_v6; - else + else { WARN_ON(1); + return -EPERM; + } rset = &ipa3_ctx->reap_rt_tbl_set[ip]; @@ -1056,14 +1065,14 @@ static int __ipa_rt_validate_hndls(const struct ipa_rt_rule *rule, if (rule->hdr_hdl) { *hdr = ipa3_id_find(rule->hdr_hdl); - if ((*hdr == NULL) || ((*hdr)->cookie != IPA_COOKIE)) { + if ((*hdr == NULL) || ((*hdr)->cookie != IPA_HDR_COOKIE)) { IPAERR("rt rule does not point to valid hdr\n"); return -EPERM; } } else if (rule->hdr_proc_ctx_hdl) { *proc_ctx = ipa3_id_find(rule->hdr_proc_ctx_hdl); if ((*proc_ctx == NULL) || - ((*proc_ctx)->cookie != IPA_COOKIE)) { + ((*proc_ctx)->cookie != IPA_PROC_HDR_COOKIE)) { IPAERR("rt rule does not point to valid proc ctx\n"); return -EPERM; @@ -1086,7 +1095,7 @@ static int __ipa_create_rt_entry(struct ipa3_rt_entry **entry, goto error; } INIT_LIST_HEAD(&(*entry)->link); - (*(entry))->cookie = IPA_COOKIE; + (*(entry))->cookie = IPA_RT_RULE_COOKIE; (*(entry))->rule = *rule; (*(entry))->tbl = tbl; (*(entry))->hdr = hdr; @@ -1154,7 +1163,7 @@ static int __ipa_add_rt_rule(enum ipa_ip_type ip, const char *name, tbl = __ipa_add_rt_tbl(ip, name); - if (tbl == NULL || (tbl->cookie != IPA_COOKIE)) { + if (tbl == NULL || (tbl->cookie != IPA_RT_TBL_COOKIE)) { IPAERR("failed adding rt tbl name = %s\n", name ? name : ""); goto error; @@ -1289,7 +1298,7 @@ int ipa3_add_rt_rule_after(struct ipa_ioc_add_rt_rule_after *rules) mutex_lock(&ipa3_ctx->lock); tbl = __ipa3_find_rt_tbl(rules->ip, rules->rt_tbl_name); - if (tbl == NULL || (tbl->cookie != IPA_COOKIE)) { + if (tbl == NULL || (tbl->cookie != IPA_RT_TBL_COOKIE)) { IPAERR("failed finding rt tbl name = %s\n", rules->rt_tbl_name ? rules->rt_tbl_name : ""); ret = -EINVAL; @@ -1373,7 +1382,7 @@ int __ipa3_del_rt_rule(u32 rule_hdl) return -EINVAL; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_RT_RULE_COOKIE) { IPAERR("bad params\n"); return -EINVAL; } @@ -1610,7 +1619,11 @@ int ipa3_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup) } mutex_lock(&ipa3_ctx->lock); entry = __ipa3_find_rt_tbl(lookup->ip, lookup->name); - if (entry && entry->cookie == IPA_COOKIE) { + if (entry && entry->cookie == IPA_RT_TBL_COOKIE) { + if (entry->ref_cnt == U32_MAX) { + IPAERR("fail: ref count crossed limit\n"); + goto ret; + } entry->ref_cnt++; lookup->hdl = entry->id; @@ -1620,6 +1633,8 @@ int ipa3_get_rt_tbl(struct ipa_ioc_get_rt_tbl *lookup) result = 0; } + +ret: mutex_unlock(&ipa3_ctx->lock); return result; @@ -1647,7 +1662,7 @@ int ipa3_put_rt_tbl(u32 rt_tbl_hdl) goto ret; } - if ((entry->cookie != IPA_COOKIE) || entry->ref_cnt == 0) { + if ((entry->cookie != IPA_RT_TBL_COOKIE) || entry->ref_cnt == 0) { IPAERR("bad parms\n"); result = -EINVAL; goto ret; @@ -1657,8 +1672,10 @@ int ipa3_put_rt_tbl(u32 rt_tbl_hdl) ip = IPA_IP_v4; else if (entry->set == &ipa3_ctx->rt_tbl_set[IPA_IP_v6]) ip = IPA_IP_v6; - else + else { WARN_ON(1); + goto ret; + } entry->ref_cnt--; if (entry->ref_cnt == 0 && entry->rule_cnt == 0) { @@ -1686,13 +1703,14 @@ static int __ipa_mdfy_rt_rule(struct ipa_rt_rule_mdfy *rtrule) if (rtrule->rule.hdr_hdl) { hdr = ipa3_id_find(rtrule->rule.hdr_hdl); - if ((hdr == NULL) || (hdr->cookie != IPA_COOKIE)) { + if ((hdr == NULL) || (hdr->cookie != IPA_HDR_COOKIE)) { IPAERR("rt rule does not point to valid hdr\n"); goto error; } } else if (rtrule->rule.hdr_proc_ctx_hdl) { proc_ctx = ipa3_id_find(rtrule->rule.hdr_proc_ctx_hdl); - if ((proc_ctx == NULL) || (proc_ctx->cookie != IPA_COOKIE)) { + if ((proc_ctx == NULL) || + (proc_ctx->cookie != IPA_PROC_HDR_COOKIE)) { IPAERR("rt rule does not point to valid proc ctx\n"); goto error; } @@ -1704,7 +1722,7 @@ static int __ipa_mdfy_rt_rule(struct ipa_rt_rule_mdfy *rtrule) goto error; } - if (entry->cookie != IPA_COOKIE) { + if (entry->cookie != IPA_RT_RULE_COOKIE) { IPAERR("bad params\n"); goto error; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c index 2f0052da7e1ce..4eb674b7da447 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipa_utils.c @@ -1006,6 +1006,11 @@ enum ipacm_client_enum ipa3_get_client(int pipe_idx) */ bool ipa3_get_client_uplink(int pipe_idx) { + if (pipe_idx < 0 || pipe_idx >= IPA3_MAX_NUM_PIPES) { + IPAERR("invalid pipe idx %d\n", pipe_idx); + return false; + } + return ipa3_ctx->ipacm_client[pipe_idx].uplink; } @@ -4270,7 +4275,7 @@ static int ipa3_tag_generate_force_close_desc(struct ipa3_desc desc[], IPAHAL_FULL_PIPELINE_CLEAR; reg_write_agg_close.offset = ipahal_get_reg_ofst(IPA_AGGR_FORCE_CLOSE); - ipahal_get_aggr_force_close_valmask(1<p_offset > firmware->size) { + IPAERR("Invalid ELF: offset=%u is beyond elf_size=%zu\n", + phdr->p_offset, firmware->size); + return -EINVAL; + } + if ((firmware->size - phdr->p_offset) < phdr->p_filesz) { + IPAERR("Invalid ELF: offset=%u filesz=%u elf_size=%zu\n", + phdr->p_offset, phdr->p_filesz, firmware->size); + return -EINVAL; + } + + if (phdr->p_memsz % sizeof(uint32_t)) { + IPAERR("FW mem size %u doesn't align to 32bit\n", + phdr->p_memsz); + return -EFAULT; + } + + if (phdr->p_filesz > phdr->p_memsz) { + IPAERR("FW image too big src_size=%u dst_size=%u\n", + phdr->p_filesz, phdr->p_memsz); + return -EFAULT; + } + + fw_mem_base = ioremap(phdr->p_vaddr, phdr->p_memsz); + if (!fw_mem_base) { + IPAERR("Failed to map 0x%x for the size of %u\n", + phdr->p_vaddr, phdr->p_memsz); + return -ENOMEM; + } + + /* Set the entire region to 0s */ + memset(fw_mem_base, 0, phdr->p_memsz); + + elf_data_ptr = (uint32_t *)(firmware->data + phdr->p_offset); + + /* Write the FW */ + for (index = 0; index < phdr->p_filesz/sizeof(uint32_t); index++) { + writel_relaxed(*elf_data_ptr, &fw_mem_base[index]); + elf_data_ptr++; + } + + iounmap(fw_mem_base); + + return 0; +} + /** * ipa3_load_fws() - Load the IPAv3 FWs into IPA&GSI SRAM. * * @firmware: Structure which contains the FW data from the user space. + * @gsi_mem_base: GSI base address * * Return value: 0 on success, negative otherwise * */ -int ipa3_load_fws(const struct firmware *firmware) +int ipa3_load_fws(const struct firmware *firmware, phys_addr_t gsi_mem_base) { const struct elf32_hdr *ehdr; const struct elf32_phdr *phdr; - const uint8_t *elf_phdr_ptr; - uint32_t *elf_data_ptr; - int phdr_idx, index; - uint32_t *fw_mem_base; - - ehdr = (struct elf32_hdr *) firmware->data; - - elf_phdr_ptr = firmware->data + sizeof(*ehdr); + unsigned long gsi_iram_ofst; + unsigned long gsi_iram_size; + phys_addr_t ipa_reg_mem_base; + u32 ipa_reg_ofst; + int rc; + + if (!gsi_mem_base) { + IPAERR("Invalid GSI base address\n"); + return -EINVAL; + } - for (phdr_idx = 0; phdr_idx < ehdr->e_phnum; phdr_idx++) { - /* - * The ELF program header will contain the starting - * address to which the firmware needs to copied. - */ - phdr = (struct elf32_phdr *)elf_phdr_ptr; + ipa_assert_on(!firmware); + /* One program header per FW image: GSI, DPS and HPS */ + if (firmware->size < (sizeof(*ehdr) + 3 * sizeof(*phdr))) { + IPAERR("Missing ELF and Program headers firmware size=%zu\n", + firmware->size); + return -EINVAL; + } - /* - * p_vaddr will contain the starting address to which the - * FW needs to be loaded. - * p_memsz will contain the size of the IRAM. - * p_filesz will contain the size of the FW image. - */ - fw_mem_base = ioremap(phdr->p_vaddr, phdr->p_memsz); - if (!fw_mem_base) { - IPAERR("Failed to map 0x%x for the size of %u\n", - phdr->p_vaddr, phdr->p_memsz); - return -ENOMEM; - } + ehdr = (struct elf32_hdr *) firmware->data; + ipa_assert_on(!ehdr); + if (ehdr->e_phnum != 3) { + IPAERR("Unexpected number of ELF program headers\n"); + return -EINVAL; + } + phdr = (struct elf32_phdr *)(firmware->data + sizeof(*ehdr)); - /* Set the entire region to 0s */ - memset(fw_mem_base, 0, phdr->p_memsz); + /* + * Each ELF program header represents a FW image and contains: + * p_vaddr : The starting address to which the FW needs to loaded. + * p_memsz : The size of the IRAM (where the image loaded) + * p_filesz: The size of the FW image embedded inside the ELF + * p_offset: Absolute offset to the image from the head of the ELF + */ - /* - * p_offset will contain and absolute offset from the beginning - * of the ELF file. - */ - elf_data_ptr = (uint32_t *) - ((uint8_t *)firmware->data + phdr->p_offset); + /* Load GSI FW image */ + gsi_get_inst_ram_offset_and_size(&gsi_iram_ofst, &gsi_iram_size); + if (phdr->p_vaddr != (gsi_mem_base + gsi_iram_ofst)) { + IPAERR( + "Invalid GSI FW img load addr vaddr=0x%x gsi_mem_base=%pa gsi_iram_ofst=0x%lx\n" + , phdr->p_vaddr, &gsi_mem_base, gsi_iram_ofst); + return -EINVAL; + } + if (phdr->p_memsz > gsi_iram_size) { + IPAERR("Invalid GSI FW img size memsz=%d gsi_iram_size=%lu\n", + phdr->p_memsz, gsi_iram_size); + return -EINVAL; + } + rc = ipa3_load_single_fw(firmware, phdr); + if (rc) + return rc; - if (phdr->p_memsz % sizeof(uint32_t)) { - IPAERR("FW size %u doesn't align to 32bit\n", - phdr->p_memsz); - return -EFAULT; - } + phdr++; + ipa_reg_mem_base = ipa3_ctx->ipa_wrapper_base + ipahal_get_reg_base(); - /* Write the FW */ - for (index = 0; index < phdr->p_filesz/sizeof(uint32_t); - index++) { - writel_relaxed(*elf_data_ptr, &fw_mem_base[index]); - elf_data_ptr++; - } + /* Load IPA DPS FW image */ + ipa_reg_ofst = ipahal_get_reg_ofst(IPA_DPS_SEQUENCER_FIRST); + if (phdr->p_vaddr != (ipa_reg_mem_base + ipa_reg_ofst)) { + IPAERR( + "Invalid IPA DPS img load addr vaddr=0x%x ipa_reg_mem_base=%pa ipa_reg_ofst=%u\n" + , phdr->p_vaddr, &ipa_reg_mem_base, ipa_reg_ofst); + return -EINVAL; + } + if (phdr->p_memsz > ipahal_get_dps_img_mem_size()) { + IPAERR("Invalid IPA DPS img size memsz=%d dps_mem_size=%u\n", + phdr->p_memsz, ipahal_get_dps_img_mem_size()); + return -EINVAL; + } + rc = ipa3_load_single_fw(firmware, phdr); + if (rc) + return rc; - iounmap(fw_mem_base); + phdr++; - elf_phdr_ptr = elf_phdr_ptr + sizeof(*phdr); + /* Load IPA HPS FW image */ + ipa_reg_ofst = ipahal_get_reg_ofst(IPA_HPS_SEQUENCER_FIRST); + if (phdr->p_vaddr != (ipa_reg_mem_base + ipa_reg_ofst)) { + IPAERR( + "Invalid IPA HPS img load addr vaddr=0x%x ipa_reg_mem_base=%pa ipa_reg_ofst=%u\n" + , phdr->p_vaddr, &ipa_reg_mem_base, ipa_reg_ofst); + return -EINVAL; + } + if (phdr->p_memsz > ipahal_get_hps_img_mem_size()) { + IPAERR("Invalid IPA HPS img size memsz=%d dps_mem_size=%u\n", + phdr->p_memsz, ipahal_get_hps_img_mem_size()); + return -EINVAL; } - IPADBG("IPA FWs (GSI FW, HPS and DPS) were loaded\n"); + rc = ipa3_load_single_fw(firmware, phdr); + if (rc) + return rc; + + IPADBG("IPA FWs (GSI FW, DPS and HPS) loaded successfully\n"); return 0; } diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c index aca6aedfa6e53..585a2db9146c6 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -1253,6 +1253,22 @@ int ipahal_get_proc_ctx_needed_len(enum ipa_hdr_proc_type type) return res; } +/* + * Get IPA Data Processing Star image memory size at IPA SRAM + */ +u32 ipahal_get_dps_img_mem_size(void) +{ + return IPA_HW_DPS_IMG_MEM_SIZE_V3_0; +} + +/* + * Get IPA Header Processing Star image memory size at IPA SRAM + */ +u32 ipahal_get_hps_img_mem_size(void) +{ + return IPA_HW_HPS_IMG_MEM_SIZE_V3_0; +} + int ipahal_init(enum ipa_hw_type ipa_hw_type, void __iomem *base) { int result; diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h index 00b205807b477..746bc30fc1090 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -634,6 +634,16 @@ void ipahal_cp_proc_ctx_to_hw_buff(enum ipa_hdr_proc_type type, */ int ipahal_get_proc_ctx_needed_len(enum ipa_hdr_proc_type type); +/* + * Get IPA Data Processing Star image memory size at IPA SRAM + */ +u32 ipahal_get_dps_img_mem_size(void); + +/* + * Get IPA Header Processing Star image memory size at IPA SRAM + */ +u32 ipahal_get_hps_img_mem_size(void); + int ipahal_init(enum ipa_hw_type ipa_hw_type, void __iomem *base); void ipahal_destroy(void); diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_i.h b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_i.h index 6a22240e951b9..5f02b4df589f5 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_i.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_i.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -542,4 +542,8 @@ struct ipa_hw_hdr_proc_ctx_add_hdr_cmd_seq { struct ipa_hw_hdr_proc_ctx_tlv end; }; +/* IPA HW DPS/HPS image memory sizes */ +#define IPA_HW_DPS_IMG_MEM_SIZE_V3_0 128 +#define IPA_HW_HPS_IMG_MEM_SIZE_V3_0 320 + #endif /* _IPAHAL_I_H_ */ diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c index 2d2ca2831fb9b..5efab8ff1f60f 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.c @@ -1037,6 +1037,12 @@ static struct ipahal_reg_obj ipahal_reg_objs[IPA_HW_MAX][IPA_REG_MAX] = { [IPA_HW_v3_0][IPA_QSB_MAX_READS] = { ipareg_construct_qsb_max_reads, ipareg_parse_dummy, 0x00000078, 0}, + [IPA_HW_v3_0][IPA_DPS_SEQUENCER_FIRST] = { + ipareg_construct_dummy, ipareg_parse_dummy, + 0x0001e000, 0}, + [IPA_HW_v3_0][IPA_HPS_SEQUENCER_FIRST] = { + ipareg_construct_dummy, ipareg_parse_dummy, + 0x0001e080, 0}, /* IPAv3.1 */ @@ -1342,7 +1348,11 @@ void ipahal_get_aggr_force_close_valmask(int ep_idx, IPAHAL_ERR("Input error\n"); return; } - + if (ep_idx > (sizeof(valmask->val) * 8 - 1)) { + IPAHAL_ERR("too big ep_idx %d\n", ep_idx); + ipa_assert(); + return; + } IPA_SETFIELD_IN_REG(valmask->val, 1 << ep_idx, IPA_AGGR_FORCE_CLOSE_OFST_AGGR_FORCE_CLOSE_PIPE_BITMAP_SHFT, IPA_AGGR_FORCE_CLOSE_OFST_AGGR_FORCE_CLOSE_PIPE_BITMAP_BMSK); @@ -1350,6 +1360,7 @@ void ipahal_get_aggr_force_close_valmask(int ep_idx, valmask->mask = IPA_AGGR_FORCE_CLOSE_OFST_AGGR_FORCE_CLOSE_PIPE_BITMAP_BMSK << IPA_AGGR_FORCE_CLOSE_OFST_AGGR_FORCE_CLOSE_PIPE_BITMAP_SHFT; + } void ipahal_get_fltrt_hash_flush_valmask( diff --git a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h index f1acab2e2db6e..38e2236a12dfc 100644 --- a/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h +++ b/drivers/platform/msm/ipa/ipa_v3/ipahal/ipahal_reg.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -83,6 +83,8 @@ enum ipahal_reg_name { IPA_RX_HPS_CLIENTS_MAX_DEPTH_1, IPA_QSB_MAX_WRITES, IPA_QSB_MAX_READS, + IPA_DPS_SEQUENCER_FIRST, + IPA_HPS_SEQUENCER_FIRST, IPA_REG_MAX, }; diff --git a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c index f3b2f379ff4a4..251407bfa1de2 100644 --- a/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c +++ b/drivers/platform/msm/ipa/ipa_v3/rmnet_ipa.c @@ -131,6 +131,7 @@ struct rmnet_ipa3_context { u32 apps_to_ipa3_hdl; u32 ipa3_to_apps_hdl; struct mutex ipa_to_apps_pipe_handle_guard; + struct mutex add_mux_channel_lock; }; static struct rmnet_ipa3_context *rmnet_ipa3_ctx; @@ -1423,10 +1424,13 @@ static int ipa3_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) rmnet_mux_val.mux_id); return rc; } + mutex_lock(&rmnet_ipa3_ctx->add_mux_channel_lock); if (rmnet_ipa3_ctx->rmnet_index >= MAX_NUM_OF_MUX_CHANNEL) { IPAWANERR("Exceed mux_channel limit(%d)\n", rmnet_ipa3_ctx->rmnet_index); + mutex_unlock(&rmnet_ipa3_ctx-> + add_mux_channel_lock); return -EFAULT; } IPAWANDBG("ADD_MUX_CHANNEL(%d, name: %s)\n", @@ -1442,6 +1446,9 @@ static int ipa3_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) extend_ioctl_data.u.rmnet_mux_val.vchannel_name, sizeof(mux_channel[rmnet_index] .vchannel_name)); + mux_channel[rmnet_index].vchannel_name[ + IFNAMSIZ - 1] = '\0'; + IPAWANDBG("cashe device[%s:%d] in IPA_wan[%d]\n", mux_channel[rmnet_index].vchannel_name, mux_channel[rmnet_index].mux_id, @@ -1457,6 +1464,8 @@ static int ipa3_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) IPAWANERR("device %s reg IPA failed\n", extend_ioctl_data.u. rmnet_mux_val.vchannel_name); + mutex_unlock(&rmnet_ipa3_ctx-> + add_mux_channel_lock); return -ENODEV; } mux_channel[rmnet_index].mux_channel_set = true; @@ -1469,6 +1478,7 @@ static int ipa3_wwan_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) mux_channel[rmnet_index].ul_flt_reg = false; } rmnet_ipa3_ctx->rmnet_index++; + mutex_unlock(&rmnet_ipa3_ctx->add_mux_channel_lock); break; case RMNET_IOCTL_SET_EGRESS_DATA_FORMAT: IPAWANDBG("get RMNET_IOCTL_SET_EGRESS_DATA_FORMAT\n"); @@ -2559,6 +2569,9 @@ int rmnet_ipa3_set_data_quota(struct wan_ioctl_set_data_quota *data) int index; struct ipa_set_data_usage_quota_req_msg_v01 req; + /* prevent string buffer overflows */ + data->interface_name[IFNAMSIZ-1] = '\0'; + index = find_vchannel_name_index(data->interface_name); IPAWANERR("iface name %s, quota %lu\n", data->interface_name, @@ -2599,6 +2612,23 @@ int rmnet_ipa3_set_tether_client_pipe( { int number, i; + /* error checking if ul_src_pipe_len valid or not*/ + if (data->ul_src_pipe_len > QMI_IPA_MAX_PIPES_V01 || + data->ul_src_pipe_len < 0) { + IPAWANERR("UL src pipes %d exceeding max %d\n", + data->ul_src_pipe_len, + QMI_IPA_MAX_PIPES_V01); + return -EFAULT; + } + /* error checking if dl_dst_pipe_len valid or not*/ + if (data->dl_dst_pipe_len > QMI_IPA_MAX_PIPES_V01 || + data->dl_dst_pipe_len < 0) { + IPAWANERR("DL dst pipes %d exceeding max %d\n", + data->dl_dst_pipe_len, + QMI_IPA_MAX_PIPES_V01); + return -EFAULT; + } + IPAWANDBG("client %d, UL %d, DL %d, reset %d\n", data->ipa_client, data->ul_src_pipe_len, @@ -2872,7 +2902,11 @@ static int __init ipa3_wwan_init(void) atomic_set(&rmnet_ipa3_ctx->is_ssr, 0); mutex_init(&rmnet_ipa3_ctx->ipa_to_apps_pipe_handle_guard); + mutex_init(&rmnet_ipa3_ctx->add_mux_channel_lock); rmnet_ipa3_ctx->ipa3_to_apps_hdl = -1; + + ipa3_qmi_init(); + /* Register for Modem SSR */ rmnet_ipa3_ctx->subsys_notify_handle = subsys_notif_register_notifier( SUBSYS_MODEM, @@ -2886,7 +2920,10 @@ static int __init ipa3_wwan_init(void) static void __exit ipa3_wwan_cleanup(void) { int ret; + + ipa3_qmi_cleanup(); mutex_destroy(&rmnet_ipa3_ctx->ipa_to_apps_pipe_handle_guard); + mutex_destroy(&rmnet_ipa3_ctx->add_mux_channel_lock); ret = subsys_notif_unregister_notifier( rmnet_ipa3_ctx->subsys_notify_handle, &ipa3_ssr_notifier); if (ret) diff --git a/drivers/platform/msm/mhi/mhi_sys.c b/drivers/platform/msm/mhi/mhi_sys.c index 3a13e6a51609c..bc078859bb263 100644 --- a/drivers/platform/msm/mhi/mhi_sys.c +++ b/drivers/platform/msm/mhi/mhi_sys.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -207,23 +207,6 @@ static const struct file_operations mhi_dbgfs_ev_fops = { .write = NULL, }; -static ssize_t mhi_dbgfs_trigger_msi(struct file *fp, const char __user *buf, - size_t count, loff_t *offp) -{ - u32 msi_nr = 0; - void *irq_ctxt = &((mhi_devices.device_list[0]).pcie_device->dev); - - if (copy_from_user(&msi_nr, buf, sizeof(msi_nr))) - return -ENOMEM; - mhi_msi_handlr(msi_nr, irq_ctxt); - return 0; -} - -static const struct file_operations mhi_dbgfs_trigger_msi_fops = { - .read = NULL, - .write = mhi_dbgfs_trigger_msi, -}; - static ssize_t mhi_dbgfs_state_read(struct file *fp, char __user *buf, size_t count, loff_t *offp) { @@ -279,7 +262,6 @@ int mhi_init_debugfs(struct mhi_device_ctxt *mhi_dev_ctxt) { struct dentry *mhi_chan_stats; struct dentry *mhi_state_stats; - struct dentry *mhi_msi_trigger; struct dentry *mhi_ev_stats; mhi_dev_ctxt->mhi_parent_folder = @@ -309,21 +291,12 @@ int mhi_init_debugfs(struct mhi_device_ctxt *mhi_dev_ctxt) &mhi_dbgfs_state_fops); if (mhi_state_stats == NULL) goto clean_ev_stats; - mhi_msi_trigger = debugfs_create_file("mhi_msi_trigger", - 0444, - mhi_dev_ctxt->mhi_parent_folder, - mhi_dev_ctxt, - &mhi_dbgfs_trigger_msi_fops); - if (mhi_msi_trigger == NULL) - goto clean_state; mhi_dev_ctxt->chan_info = kmalloc(MHI_LOG_SIZE, GFP_KERNEL); if (mhi_dev_ctxt->chan_info == NULL) goto clean_all; return 0; clean_all: - debugfs_remove(mhi_msi_trigger); -clean_state: debugfs_remove(mhi_state_stats); clean_ev_stats: debugfs_remove(mhi_ev_stats); diff --git a/drivers/platform/msm/msm_bus/Makefile b/drivers/platform/msm/msm_bus/Makefile index a58994d6023b7..e88bd26d237a1 100644 --- a/drivers/platform/msm/msm_bus/Makefile +++ b/drivers/platform/msm/msm_bus/Makefile @@ -11,6 +11,7 @@ ifdef CONFIG_BUS_TOPOLOGY_ADHOC obj-$(CONFIG_OF) += msm_bus_of_adhoc.o obj-$(CONFIG_DEBUG_BUS_VOTER) += msm_bus_dbg_voter.o obj-$(CONFIG_CORESIGHT) += msm_buspm_coresight_adhoc.o + obj-$(CONFIG_BW_MONITOR) += msm_bandwidth_monitor.o else obj-y += msm_bus_fabric.o msm_bus_config.o msm_bus_arb.o \ msm_bus_bimc.o msm_bus_noc.o diff --git a/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c b/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c new file mode 100644 index 0000000000000..6764695c8ccef --- /dev/null +++ b/drivers/platform/msm/msm_bus/msm_bandwidth_monitor.c @@ -0,0 +1,653 @@ +/* Copyright (c) 2016-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. + * + */ + +#define pr_fmt(fmt) "%s:%s " fmt, KBUILD_MODNAME, __func__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BM_SENSORS_DRIVER_NAME "bm_sensors" + +#define ALLOC_KMEM(dev, ptr, type, size, ret) \ + do { \ + ret = 0; \ + ptr = devm_kzalloc(dev, \ + sizeof(type) * size,\ + GFP_KERNEL); \ + if (!ptr) \ + ret = -ENOMEM; \ + } while (0) + +/* Trips: HIGH and LOW */ +enum bm_threshold_id { + BM_HIGH_THRESHOLD = 0, + BM_LOW_THRESHOLD, + MAX_BM_THRESHOLD, +}; +#define BM_WRITABLE_TRIPS_MASK ((1 << MAX_BM_THRESHOLD) - 1) + +struct bm_thresh_state { + enum thermal_trip_activation_mode state; + u64 trip_bw; +}; + +struct bm_tz_sensor { + /* Sensor info from dt */ + char bm_sensor[THERMAL_NAME_LENGTH]; + int src_cnt; + int *src_id; + int src_field; + int op; + /* bus rule interface struct */ + struct bus_rule_type thresh_bus_rule[MAX_BM_THRESHOLD]; + uint32_t bus_rule_action[MAX_BM_THRESHOLD]; + unsigned long triggered[BITS_TO_LONGS(MAX_BM_THRESHOLD)]; + bool bus_reg_done; + /* Common callback notifier*/ + struct notifier_block bm_nb; + /* thermal zone handling */ + struct thermal_zone_device *tz_dev; + enum thermal_device_mode mode; + struct bm_thresh_state thresh_state[MAX_BM_THRESHOLD]; +}; + +struct bm_sensors_drv_data { + struct platform_device *pdev; + /* Workqueue Related */ + struct work_struct bm_wq; + /* Serialize workqueue handling */ + struct mutex rule_lock; + struct bm_tz_sensor *bm_tz_sensors; + int bm_sensor_cnt; +}; + +static struct bm_sensors_drv_data *bmdev; + +static void notify_bw_threshold_event(struct bm_tz_sensor *sensor, + struct bus_rule_type *rule, uint32_t action, + enum bm_threshold_id thresh_id) +{ + u64 bw = 0; + int ret = 0; + + if (!sensor || !rule || thresh_id < 0 || + thresh_id >= MAX_BM_THRESHOLD) { + pr_err("Invalid input parameters\n"); + return; + } + + if (action == RULE_STATE_APPLIED) { + sensor->thresh_state[thresh_id].state + = THERMAL_TRIP_ACTIVATION_DISABLED; + ret = msm_rule_query_bandwidth(rule, + &bw, &sensor->bm_nb); + if (ret < 0) { + pr_err("Error in reading curr bw, ret:%d\n", ret); + return; + } + thermal_sensor_trip(sensor->tz_dev, + (thresh_id == BM_HIGH_THRESHOLD) ? + THERMAL_TRIP_CONFIGURABLE_HI : + THERMAL_TRIP_CONFIGURABLE_LOW, + (long)bw); + } else if (action != RULE_STATE_NOT_APPLIED) { + pr_err_ratelimited("Error in high threshold interrupt\n"); + } +} + +static void cleanup_bus_rule(struct bus_rule_type *rule) +{ + if (!rule) { + pr_err("input is NULL\n"); + return; + } + + if (rule->src_id) + devm_kfree(&bmdev->pdev->dev, rule->src_id); + if (rule->src_field) + devm_kfree(&bmdev->pdev->dev, rule->src_field); + if (rule->op) + devm_kfree(&bmdev->pdev->dev, rule->op); + if (rule->thresh) + devm_kfree(&bmdev->pdev->dev, rule->thresh); +} + +static int create_bus_rule(struct bus_rule_type *rule, int src_cnt, + int *src_ids, int src_field, int op, u64 val, + unsigned int *thresh_action) +{ + int i = 0, ret = 0; + + if (!rule->src_id) { + ALLOC_KMEM(&bmdev->pdev->dev, rule->src_id, + int, src_cnt, ret); + if (ret) + goto rule_exit; + } + if (!rule->src_field) { + ALLOC_KMEM(&bmdev->pdev->dev, rule->src_field, + int, 1, ret); + if (ret) + goto rule_exit; + } + if (!rule->op) { + ALLOC_KMEM(&bmdev->pdev->dev, rule->op, + int, 1, ret); + if (ret) + goto rule_exit; + } + if (!rule->thresh) { + ALLOC_KMEM(&bmdev->pdev->dev, rule->thresh, + u64, 1, ret); + if (ret) + goto rule_exit; + } + + rule->num_src = src_cnt; + for (; i < src_cnt; i++) + rule->src_id[i] = src_ids[i]; + *(rule->src_field) = src_field; + *(rule->op) = op; + rule->num_thresh = 1; + *(rule->thresh) = val; + rule->num_dst = 0; + rule->dst_node = NULL; + rule->mode = THROTTLE_OFF; + rule->client_data = (void *)thresh_action; + rule->dst_bw = 0; + rule->combo_op = 0; + +rule_exit: + if (ret) + cleanup_bus_rule(rule); + + return ret; +} + +static void bm_tz_notify_wq(struct work_struct *work) +{ + int i = 0, j = 0; + + mutex_lock(&bmdev->rule_lock); + + /* Notify bw threshold events to thermal zone */ + for (i = 0; i < bmdev->bm_sensor_cnt; i++) { + if (!bitmap_weight(bmdev->bm_tz_sensors[i].triggered, + MAX_BM_THRESHOLD)) + continue; + + for_each_set_bit(j, bmdev->bm_tz_sensors[i].triggered, + MAX_BM_THRESHOLD) { + notify_bw_threshold_event(&bmdev->bm_tz_sensors[i], + &bmdev->bm_tz_sensors[i].thresh_bus_rule[j], + bmdev->bm_tz_sensors[i].bus_rule_action[j], j); + clear_bit(j, bmdev->bm_tz_sensors[i].triggered); + } + } + mutex_unlock(&bmdev->rule_lock); +} + +static int bm_threshold_cb(struct notifier_block *nb, unsigned long action, + void *data) +{ + int thresh_id = 0; + struct bm_tz_sensor *bm_sensor = + container_of(nb, struct bm_tz_sensor, bm_nb); + struct bus_rule_type *rule = data; + unsigned int *bus_rule_action = (unsigned int *)(rule->client_data); + + for (; thresh_id < MAX_BM_THRESHOLD; thresh_id++) + if (&bm_sensor->bus_rule_action[thresh_id] == bus_rule_action) + break; + + if (thresh_id >= MAX_BM_THRESHOLD) { + pr_err("No matching client data. id:%d\n", thresh_id); + return 0; + } + pr_debug( + "srcid:%d, srcfld:%d op:%d thresh:%llu threshid:%d action:%lu curr_bw:%llu\n", + *(rule->src_id), *(rule->src_field), *(rule->op), *(rule->thresh), + thresh_id, action, rule->curr_bw); + set_bit(thresh_id, bm_sensor->triggered); + bm_sensor->bus_rule_action[thresh_id] = action; + queue_work(system_freezable_wq, &bmdev->bm_wq); + + return 0; +} + +static int bm_tz_get_curr_bw(struct thermal_zone_device *bmdev, + unsigned long *bw) +{ + struct bm_tz_sensor *bm_sensor = bmdev->devdata; + int ret = 0; + u64 bus_bw = 0; + + if (!bm_sensor || bm_sensor->mode != THERMAL_DEVICE_ENABLED || !bw) + return -EINVAL; + + ret = msm_rule_query_bandwidth( + &bm_sensor->thresh_bus_rule[BM_HIGH_THRESHOLD], + &bus_bw, + &bm_sensor->bm_nb); + if (ret < 0) { + pr_err("Error in reading curr bw, ret:%d\n", ret); + return -EINVAL; + } + *bw = (unsigned long)bus_bw; + pr_debug("bm sensor[%s] curr bw:%lu\n", bm_sensor->bm_sensor, *bw); + + return 0; +} + +static int bm_tz_get_mode(struct thermal_zone_device *bm, + enum thermal_device_mode *mode) +{ + struct bm_tz_sensor *bm_sensor = bm->devdata; + + if (!bm_sensor || !mode) + return -EINVAL; + + *mode = bm_sensor->mode; + + return 0; +} + +static int bm_tz_get_trip_type(struct thermal_zone_device *bm, + int trip, enum thermal_trip_type *type) +{ + struct bm_tz_sensor *bm_sensor = bm->devdata; + + if (!bm_sensor || trip < 0 || !type) + return -EINVAL; + + switch (trip) { + case BM_HIGH_THRESHOLD: + *type = THERMAL_TRIP_CONFIGURABLE_HI; + break; + case BM_LOW_THRESHOLD: + *type = THERMAL_TRIP_CONFIGURABLE_LOW; + break; + default: + return -EINVAL; + } + + return 0; +} + +static int bm_tz_activate_trip_type(struct thermal_zone_device *bm, + int trip, enum thermal_trip_activation_mode mode) +{ + struct bm_tz_sensor *bm_sensor = bm->devdata; + struct bus_rule_type new_rule = {0}; + int op = -1; + int ret = 0; + u64 thresh = 0; + + if (!bm_sensor || trip < 0) + return -EINVAL; + + switch (trip) { + case BM_HIGH_THRESHOLD: + bm_sensor->thresh_state[BM_HIGH_THRESHOLD].state = mode; + if (mode != THERMAL_TRIP_ACTIVATION_DISABLED) + thresh = + bm_sensor->thresh_state[BM_HIGH_THRESHOLD].trip_bw; + else + thresh = ULLONG_MAX; + op = OP_GT; + break; + case BM_LOW_THRESHOLD: + bm_sensor->thresh_state[BM_LOW_THRESHOLD].state = mode; + if (mode != THERMAL_TRIP_ACTIVATION_DISABLED) + thresh = + bm_sensor->thresh_state[BM_LOW_THRESHOLD].trip_bw; + else + thresh = 0; + op = OP_LT; + break; + default: + pr_err("Unknown trip %d\n", trip); + return -EINVAL; + } + + ret = create_bus_rule(&new_rule, + bm_sensor->src_cnt, bm_sensor->src_id, + bm_sensor->src_field, op, thresh, + &bm_sensor->bus_rule_action[trip]); + if (ret) + goto exit; + + bm_sensor->bm_nb.notifier_call = bm_threshold_cb; + mutex_lock(&bmdev->rule_lock); + msm_rule_update(&bm_sensor->thresh_bus_rule[trip], + &new_rule, &bm_sensor->bm_nb); + *(bm_sensor->thresh_bus_rule[trip].thresh) = thresh; + msm_rule_evaluate_rules(bm_sensor->thresh_bus_rule[trip].src_id[0]); + cleanup_bus_rule(&new_rule); + mutex_unlock(&bmdev->rule_lock); + + pr_debug( + "srcid:%d, srcfld:%d op:%d thresh:%llu threshid:%d\n", + *(bm_sensor->thresh_bus_rule[trip].src_id), + *(bm_sensor->thresh_bus_rule[trip].src_field), + *(bm_sensor->thresh_bus_rule[trip].op), + *(bm_sensor->thresh_bus_rule[trip].thresh), trip); + +exit: + return 0; +}; + +static int bm_tz_get_trip_bw(struct thermal_zone_device *bmdev, + int trip, unsigned long *bw) +{ + struct bm_tz_sensor *bm_sensor = bmdev->devdata; + + if (!bm_sensor || trip < 0 || trip >= MAX_BM_THRESHOLD || !bw) + return -EINVAL; + + *bw = (unsigned long)bm_sensor->thresh_state[trip].trip_bw; + + return 0; +}; + +static int bm_tz_set_trip_bw(struct thermal_zone_device *bmdev, + int trip, unsigned long bw) +{ + struct bm_tz_sensor *bm_sensor = bmdev->devdata; + + if (!bm_sensor || trip < 0 || trip >= MAX_BM_THRESHOLD) + return -EINVAL; + + bm_sensor->thresh_state[trip].trip_bw = bw; + + return 0; +}; + +static struct thermal_zone_device_ops bm_sensor_thermal_zone_ops = { + .get_temp = bm_tz_get_curr_bw, + .get_mode = bm_tz_get_mode, + .get_trip_type = bm_tz_get_trip_type, + .activate_trip_type = bm_tz_activate_trip_type, + .get_trip_temp = bm_tz_get_trip_bw, + .set_trip_temp = bm_tz_set_trip_bw, +}; + +static int bm_sensors_register_thermal_zone(void) +{ + int i = 0, ret = 0; + + for (i = 0; i < bmdev->bm_sensor_cnt; i++) { + struct bm_tz_sensor *bm_sensor = + &bmdev->bm_tz_sensors[i]; + + bm_sensor->mode = THERMAL_DEVICE_ENABLED; + bm_sensor->tz_dev = + thermal_zone_device_register(bm_sensor->bm_sensor, + MAX_BM_THRESHOLD, BM_WRITABLE_TRIPS_MASK, + bm_sensor, &bm_sensor_thermal_zone_ops, + NULL, 0, 0); + if (IS_ERR(bm_sensor->tz_dev)) { + ret = PTR_ERR(bm_sensor->tz_dev); + pr_err( + "%s:thermal zone register failed. ret:%d\n", + __func__, ret); + goto fail; + } + } +fail: + return ret; +} + +static void bm_sensors_unregister_thermal_zone(void) +{ + int i = 0; + + for (i = 0; i < bmdev->bm_sensor_cnt; i++) { + struct bm_tz_sensor *bm_sensor = + &bmdev->bm_tz_sensors[i]; + if (bm_sensor->tz_dev) + thermal_zone_device_unregister(bm_sensor->tz_dev); + bm_sensor->mode = THERMAL_DEVICE_DISABLED; + } +} + +static int read_device_tree_data(struct platform_device *pdev, + struct bm_sensors_drv_data *bmdev) +{ + int bm_sensor_cnt = 0, i = 0, err = 0, idx = 0; + char *key = NULL; + const char *src_f = NULL; + struct device_node *node = pdev->dev.of_node, *child_node = NULL; + struct bm_tz_sensor *bm_tz_sensors = NULL; + struct device_node *bus_node = NULL; + + bm_sensor_cnt = of_get_child_count(node); + if (bm_sensor_cnt == 0) { + pr_err("No child node found\n"); + err = -ENODEV; + goto read_node_fail; + } + + ALLOC_KMEM(&pdev->dev, bm_tz_sensors, struct bm_tz_sensor, + bm_sensor_cnt, err); + if (err) + goto read_node_fail; + + for_each_child_of_node(node, child_node) { + + snprintf(bm_tz_sensors[i].bm_sensor, + THERMAL_NAME_LENGTH, child_node->name); + + key = "qcom,bm-sensor"; + if (!of_get_property(child_node, key, &bm_tz_sensors[i].src_cnt) + || bm_tz_sensors[i].src_cnt <= 0) { + pr_err("src id phandles are not defined\n"); + err = -ENODEV; + goto read_node_fail; + } + + bm_tz_sensors[i].src_cnt /= sizeof(__be32); + ALLOC_KMEM(&pdev->dev, bm_tz_sensors[i].src_id, int, + bm_tz_sensors[i].src_cnt, err); + if (err) + goto read_node_fail; + + for (idx = 0; idx < bm_tz_sensors[i].src_cnt; idx++) { + bus_node = of_parse_phandle(child_node, key, idx); + if (!bus_node) { + pr_err( + "No src id phandle is defined with index:%d\n", + idx); + err = -ENODEV; + goto read_node_fail; + } + err = of_property_read_u32(bus_node, "cell-id", + &bm_tz_sensors[i].src_id[idx]); + if (err) { + pr_err("Bus node is missing cell-id. err:%d\n", + err); + goto read_node_fail; + } + } + + key = "qcom,bm-sensor-field"; + err = of_property_read_string(child_node, + key, &src_f); + if (err) { + pr_err("No %s field is found. err:%d\n", key, err); + goto read_node_fail; + } + if (!strcmp(src_f, "ab")) { + bm_tz_sensors[i].src_field = FLD_AB; + } else if (!strcmp(src_f, "ib")) { + bm_tz_sensors[i].src_field = FLD_IB; + } else { + pr_err("Unknown src field\n"); + err = -EINVAL; + goto read_node_fail; + } + i++; + } + bmdev->bm_tz_sensors = bm_tz_sensors; + bmdev->bm_sensor_cnt = bm_sensor_cnt; + +read_node_fail: + return err; +} + +static void bus_rules_unregister(void) +{ + int i = 0; + + for (; i < bmdev->bm_sensor_cnt; i++) { + struct bm_tz_sensor *bm_sens = + &bmdev->bm_tz_sensors[i]; + + if (bm_sens->bus_reg_done) { + msm_rule_unregister(MAX_BM_THRESHOLD, + bm_sens->thresh_bus_rule, + &bm_sens->bm_nb); + bm_sens->bus_reg_done = false; + } + } +} + +static int init_bm_default_rules(void) +{ + int ret = 0, i = 0; + + for (i = 0; i < bmdev->bm_sensor_cnt; i++) { + struct bm_tz_sensor *bm_sens = &bmdev->bm_tz_sensors[i]; + + bitmap_zero(bm_sens->triggered, MAX_BM_THRESHOLD); + ret = create_bus_rule( + &bm_sens->thresh_bus_rule[BM_HIGH_THRESHOLD], + bm_sens->src_cnt, bm_sens->src_id, + bm_sens->src_field, OP_GT, ULLONG_MAX, + &bm_sens->bus_rule_action[BM_HIGH_THRESHOLD]); + if (ret) { + pr_err("Creating bus rule is failed. ret:%d\n", ret); + goto exit; + } + + ret = create_bus_rule( + &bm_sens->thresh_bus_rule[BM_LOW_THRESHOLD], + bm_sens->src_cnt, bm_sens->src_id, + bm_sens->src_field, OP_LT, 0, + &bm_sens->bus_rule_action[BM_LOW_THRESHOLD]); + if (ret) { + pr_err("Creating bus rule is failed. ret:%d\n", ret); + goto exit; + } + + bm_sens->bm_nb.notifier_call = bm_threshold_cb; + msm_rule_register(MAX_BM_THRESHOLD, bm_sens->thresh_bus_rule, + &bm_sens->bm_nb); + msm_rule_evaluate_rules( + bm_sens->thresh_bus_rule[BM_HIGH_THRESHOLD].src_id[0]); + bm_sens->bus_reg_done = true; + } +exit: + if (ret) + bus_rules_unregister(); + return ret; +} + +static void cleanup_drv_data(void) +{ + if (bmdev) { + bm_sensors_unregister_thermal_zone(); + bus_rules_unregister(); + flush_work(&bmdev->bm_wq); + } +} + +static int bm_tz_sensors_probe(struct platform_device *pdev) +{ + int ret = 0; + + ALLOC_KMEM(&pdev->dev, bmdev, struct bm_sensors_drv_data, + 1, ret); + if (ret) + goto probe_exit; + + bmdev->pdev = pdev; + ret = read_device_tree_data(pdev, bmdev); + if (ret) + goto probe_exit; + + mutex_init(&bmdev->rule_lock); + INIT_WORK(&bmdev->bm_wq, bm_tz_notify_wq); + + ret = init_bm_default_rules(); + if (ret) + goto probe_exit; + + ret = bm_sensors_register_thermal_zone(); + if (ret) + goto probe_exit; + + platform_set_drvdata(pdev, bmdev); +probe_exit: + if (ret) + cleanup_drv_data(); + + return ret; +} + +static int bm_tz_sensors_remove(struct platform_device *pdev) +{ + cleanup_drv_data(); + return 0; +} + +struct of_device_id bm_sensors_match[] = { + { + .compatible = "qcom,bm-sensors", + }, + {}, +}; + +static struct platform_driver bm_sensors_driver = { + .probe = bm_tz_sensors_probe, + .remove = bm_tz_sensors_remove, + .driver = { + .name = BM_SENSORS_DRIVER_NAME, + .owner = THIS_MODULE, + .of_match_table = bm_sensors_match, + }, +}; + +int __init bm_sensors_driver_init(void) +{ + return platform_driver_register(&bm_sensors_driver); +} + +static void __exit bm_sensors_driver_exit(void) +{ + platform_driver_unregister(&bm_sensors_driver); +} + +late_initcall(bm_sensors_driver_init); +module_exit(bm_sensors_driver_exit); + +MODULE_DESCRIPTION("BANDWIDTH TZ SENSORS"); +MODULE_ALIAS("platform:" BM_SENSORS_DRIVER_NAME); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/platform/msm/msm_bus/msm_bus_arb_adhoc.c b/drivers/platform/msm/msm_bus/msm_bus_arb_adhoc.c index 6d66be3dcebfa..ec9b56026caa5 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_arb_adhoc.c +++ b/drivers/platform/msm/msm_bus/msm_bus_arb_adhoc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is Mree software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and @@ -871,7 +871,7 @@ static void unregister_client_adhoc(uint32_t cl) } curr = client->curr; - if (curr >= pdata->num_usecases) { + if ((curr < 0) || (curr >= pdata->num_usecases)) { MSM_BUS_ERR("Invalid index Defaulting curr to 0"); curr = 0; } diff --git a/drivers/platform/msm/msm_bus/msm_bus_dbg.c b/drivers/platform/msm/msm_bus/msm_bus_dbg.c index 88ba18653cf5e..8db3a62a1263a 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_dbg.c +++ b/drivers/platform/msm/msm_bus/msm_bus_dbg.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2012, 2014-2015, The Linux Foundation. All rights +/* Copyright (c) 2010-2012, 2014-2015, 2017 The Linux Foundation. All rights * reserved. * * This program is free software; you can redistribute it and/or modify @@ -38,6 +38,7 @@ static struct dentry *clients; static struct dentry *dir; static DEFINE_MUTEX(msm_bus_dbg_fablist_lock); +static DEFINE_RT_MUTEX(msm_bus_dbg_cllist_lock); struct msm_bus_dbg_state { uint32_t cl; uint8_t enable; @@ -289,7 +290,9 @@ static ssize_t client_data_read(struct file *file, char __user *buf, struct msm_bus_cldata *cldata = NULL; const struct msm_bus_client_handle *handle = file->private_data; int found = 0; + ssize_t ret; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if ((cldata->clid == cl) || (cldata->handle && (cldata->handle == handle))) { @@ -298,12 +301,17 @@ static ssize_t client_data_read(struct file *file, char __user *buf, } } - if (!found) + if (!found) { + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return 0; + } bsize = cldata->size; - return simple_read_from_buffer(buf, count, ppos, + ret = simple_read_from_buffer(buf, count, ppos, cldata->buffer, bsize); + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); + + return ret; } static int client_data_open(struct inode *inode, struct file *file) @@ -339,7 +347,9 @@ int msm_bus_dbg_add_client(const struct msm_bus_client_handle *pdata) return -ENOMEM; } cldata->handle = pdata; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_add_tail(&cldata->list, &cl_list); + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return 0; } @@ -352,6 +362,7 @@ int msm_bus_dbg_rec_transaction(const struct msm_bus_client_handle *pdata, bool found = false; char *buf = NULL; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (cldata->handle == pdata) { found = true; @@ -359,12 +370,15 @@ int msm_bus_dbg_rec_transaction(const struct msm_bus_client_handle *pdata, } } - if (!found) + if (!found) { + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return -ENOENT; + } if (cldata->file == NULL) { if (pdata->name == NULL) { MSM_BUS_DBG("Client doesn't have a name\n"); + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return -EINVAL; } cldata->file = debugfs_create_file(pdata->name, S_IRUGO, @@ -393,6 +407,7 @@ int msm_bus_dbg_rec_transaction(const struct msm_bus_client_handle *pdata, i += scnprintf(buf + i, MAX_BUFF_SIZE - i, "%llu ", ib); i += scnprintf(buf + i, MAX_BUFF_SIZE - i, "\n"); cldata->size = i; + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); trace_bus_update_request((int)ts.tv_sec, (int)ts.tv_nsec, pdata->name, pdata->mas, pdata->slv, ab, ib); @@ -404,6 +419,7 @@ void msm_bus_dbg_remove_client(const struct msm_bus_client_handle *pdata) { struct msm_bus_cldata *cldata = NULL; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (cldata->handle == pdata) { debugfs_remove(cldata->file); @@ -412,6 +428,7 @@ void msm_bus_dbg_remove_client(const struct msm_bus_client_handle *pdata) break; } } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); } static int msm_bus_dbg_record_client(const struct msm_bus_scale_pdata *pdata, @@ -429,7 +446,9 @@ static int msm_bus_dbg_record_client(const struct msm_bus_scale_pdata *pdata, cldata->clid = clid; cldata->file = file; cldata->size = 0; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_add_tail(&cldata->list, &cl_list); + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return 0; } @@ -437,6 +456,7 @@ static void msm_bus_dbg_free_client(uint32_t clid) { struct msm_bus_cldata *cldata = NULL; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (cldata->clid == clid) { debugfs_remove(cldata->file); @@ -445,6 +465,7 @@ static void msm_bus_dbg_free_client(uint32_t clid) break; } } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); } static int msm_bus_dbg_fill_cl_buffer(const struct msm_bus_scale_pdata *pdata, @@ -456,6 +477,7 @@ static int msm_bus_dbg_fill_cl_buffer(const struct msm_bus_scale_pdata *pdata, struct timespec ts; int found = 0; + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (cldata->clid == clid) { found = 1; @@ -463,11 +485,14 @@ static int msm_bus_dbg_fill_cl_buffer(const struct msm_bus_scale_pdata *pdata, } } - if (!found) + if (!found) { + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); return -ENOENT; + } if (cldata->file == NULL) { if (pdata->name == NULL) { + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); MSM_BUS_DBG("Client doesn't have a name\n"); return -EINVAL; } @@ -515,19 +540,9 @@ static int msm_bus_dbg_fill_cl_buffer(const struct msm_bus_scale_pdata *pdata, cldata->index = index; cldata->size = i; - return i; -} - -static int msm_bus_dbg_update_request(struct msm_bus_cldata *cldata, int index) -{ - int ret = 0; + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); - if ((index < 0) || (index > cldata->pdata->num_usecases)) { - MSM_BUS_DBG("Invalid index!\n"); - return -EINVAL; - } - ret = msm_bus_scale_client_update_request(cldata->clid, index); - return ret; + return i; } static ssize_t msm_bus_dbg_update_request_write(struct file *file, @@ -539,19 +554,26 @@ static ssize_t msm_bus_dbg_update_request_write(struct file *file, char *chid; char *buf = kmalloc((sizeof(char) * (cnt + 1)), GFP_KERNEL); int found = 0; + uint32_t clid; + ssize_t res = cnt; if (!buf || IS_ERR(buf)) { MSM_BUS_ERR("Memory allocation for buffer failed\n"); return -ENOMEM; } - if (cnt == 0) - return 0; - if (copy_from_user(buf, ubuf, cnt)) - return -EFAULT; + if (cnt == 0) { + res = 0; + goto out; + } + if (copy_from_user(buf, ubuf, cnt)) { + res = -EFAULT; + goto out; + } buf[cnt] = '\0'; chid = buf; MSM_BUS_DBG("buffer: %s\n size: %zu\n", buf, sizeof(ubuf)); + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (strnstr(chid, cldata->pdata->name, cnt)) { found = 1; @@ -562,21 +584,35 @@ static ssize_t msm_bus_dbg_update_request_write(struct file *file, if (ret) { MSM_BUS_DBG("Index conversion" " failed\n"); - return -EFAULT; + rt_mutex_unlock( + &msm_bus_dbg_cllist_lock); + res = -EFAULT; + goto out; } } else { MSM_BUS_DBG("Error parsing input. Index not" " found\n"); found = 0; } + if ((index < 0) || + (index > cldata->pdata->num_usecases)) { + MSM_BUS_DBG("Invalid index!\n"); + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); + res = -EINVAL; + goto out; + } + clid = cldata->clid; break; } } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); if (found) - msm_bus_dbg_update_request(cldata, index); + msm_bus_scale_client_update_request(clid, index); + +out: kfree(buf); - return cnt; + return res; } /** @@ -599,8 +635,10 @@ static ssize_t fabric_data_read(struct file *file, char __user *buf, break; } } - if (!found) + if (!found) { + mutex_unlock(&msm_bus_dbg_fablist_lock); return -ENOENT; + } bsize = fablist->size; ret = simple_read_from_buffer(buf, count, ppos, fablist->buffer, bsize); @@ -689,8 +727,10 @@ static int msm_bus_dbg_fill_fab_buffer(const char *fabname, break; } } - if (!found) + if (!found) { + mutex_unlock(&msm_bus_dbg_fablist_lock); return -ENOENT; + } if (fablist->file == NULL) { MSM_BUS_DBG("Fabric dbg entry does not exist\n"); @@ -741,6 +781,8 @@ static ssize_t msm_bus_dbg_dump_clients_read(struct file *file, "\nDumping curent client votes to trace log\n"); if (*ppos) goto exit_dump_clients_read; + + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (IS_ERR_OR_NULL(cldata->pdata)) continue; @@ -756,6 +798,7 @@ static ssize_t msm_bus_dbg_dump_clients_read(struct file *file, cldata->pdata->active_only); } } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); exit_dump_clients_read: return simple_read_from_buffer(buf, count, ppos, msg, cnt); } @@ -880,6 +923,7 @@ static int __init msm_bus_debugfs_init(void) goto err; } + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry(cldata, &cl_list, list) { if (cldata->pdata) { if (cldata->pdata->name == NULL) { @@ -899,6 +943,7 @@ static int __init msm_bus_debugfs_init(void) &client_data_fops); } } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); if (debugfs_create_file("dump_clients", S_IRUGO | S_IWUSR, clients, NULL, &msm_bus_dbg_dump_clients_fops) == NULL) @@ -911,6 +956,7 @@ static int __init msm_bus_debugfs_init(void) if (fablist->file == NULL) { MSM_BUS_DBG("Cannot create files for commit data\n"); kfree(rules_buf); + mutex_unlock(&msm_bus_dbg_fablist_lock); goto err; } } @@ -930,10 +976,14 @@ static void __exit msm_bus_dbg_teardown(void) struct msm_bus_cldata *cldata = NULL, *cldata_temp; debugfs_remove_recursive(dir); + + rt_mutex_lock(&msm_bus_dbg_cllist_lock); list_for_each_entry_safe(cldata, cldata_temp, &cl_list, list) { list_del(&cldata->list); kfree(cldata); } + rt_mutex_unlock(&msm_bus_dbg_cllist_lock); + mutex_lock(&msm_bus_dbg_fablist_lock); list_for_each_entry_safe(fablist, fablist_temp, &fabdata_list, list) { list_del(&fablist->list); diff --git a/drivers/platform/msm/msm_bus/msm_bus_of_adhoc.c b/drivers/platform/msm/msm_bus/msm_bus_of_adhoc.c index 620da95d1be4a..46fb764facf8e 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_of_adhoc.c +++ b/drivers/platform/msm/msm_bus/msm_bus_of_adhoc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, 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 @@ -808,6 +808,9 @@ int msm_bus_of_get_static_rules(struct platform_device *pdev, int bw_fld = 0; int i; struct bus_rule_type *local_rule = NULL; + int *thresh_arr = NULL; + int num_op = 0; + int num_fld = 0; of_node = pdev->dev.of_node; num_rules = of_get_child_count(of_node); @@ -832,37 +835,58 @@ int msm_bus_of_get_static_rules(struct platform_device *pdev, &local_rule[rule_idx].num_dst, "qcom,dest-node"); - ret = of_property_read_u32(child_node, "qcom,src-field", - &local_rule[rule_idx].src_field); - if (ret) { - dev_err(&pdev->dev, "src-field missing"); + if (local_rule[rule_idx].num_dst > 1) { + dev_err(&pdev->dev, "Only 1 dest node supported\n"); ret = -ENXIO; goto err_static_rules; } - ret = of_property_read_u32(child_node, "qcom,src-op", - &local_rule[rule_idx].op); - if (ret) { - dev_err(&pdev->dev, "src-op missing"); + thresh_arr = get_arr(pdev, child_node, + "qcom,thresh", + &local_rule[rule_idx].num_thresh); + + if (!local_rule[rule_idx].num_thresh || + ((local_rule[rule_idx].num_thresh > 1) && + local_rule[rule_idx].num_thresh != + local_rule[rule_idx].num_src)) { + dev_err(&pdev->dev, "thresholds missing"); ret = -ENXIO; goto err_static_rules; + } else { + int i; + + local_rule[rule_idx].thresh = + devm_kzalloc(&pdev->dev, + sizeof(u64) * local_rule[rule_idx].num_thresh, + GFP_KERNEL); + if (!IS_ERR_OR_NULL(thresh_arr)) { + for (i = 0; + i < local_rule[rule_idx].num_thresh; ++i) + local_rule[rule_idx].thresh[i] = + KBTOB(thresh_arr[i]); + } } - ret = of_property_read_u32(child_node, "qcom,mode", - &local_rule[rule_idx].mode); - if (ret) { - dev_err(&pdev->dev, "mode missing"); + local_rule[rule_idx].src_field = get_arr(pdev, child_node, + "qcom,src-field", &num_fld); + if (!num_fld || (num_fld != local_rule[rule_idx].num_thresh)) { + dev_err(&pdev->dev, "src-field missing"); ret = -ENXIO; goto err_static_rules; } - ret = of_property_read_u32(child_node, "qcom,thresh", &bw_fld); - if (ret) { - dev_err(&pdev->dev, "thresh missing"); + local_rule[rule_idx].op = get_arr(pdev, child_node, + "qcom,src-op", &num_op); + if (!num_op || (num_op != local_rule[rule_idx].num_thresh)) { + dev_err(&pdev->dev, "src-op missing"); ret = -ENXIO; goto err_static_rules; - } else - local_rule[rule_idx].thresh = KBTOB(bw_fld); + } + + ret = of_property_read_u32(child_node, "qcom,mode", + &local_rule[rule_idx].mode); + if (ret) + local_rule[rule_idx].mode = THROTTLE_OFF; ret = of_property_read_u32(child_node, "qcom,dest-bw", &bw_fld); @@ -871,9 +895,21 @@ int msm_bus_of_get_static_rules(struct platform_device *pdev, else local_rule[rule_idx].dst_bw = KBTOB(bw_fld); - rule_idx++; + ret = of_property_read_u32(child_node, "qcom,combo-op", + &local_rule[rule_idx].combo_op); + if (ret) { + if (local_rule[rule_idx].num_thresh > 1) { + dev_err(&pdev->dev, "combo-op missing"); + ret = -ENXIO; + goto err_static_rules; + } else + local_rule[rule_idx].combo_op = 0; + } + + ++rule_idx; } ret = rule_idx; + exit_static_rules: return ret; err_static_rules: @@ -885,9 +921,22 @@ int msm_bus_of_get_static_rules(struct platform_device *pdev, if (!IS_ERR_OR_NULL(local_rule[i].dst_node)) devm_kfree(&pdev->dev, local_rule[i].dst_node); - devm_kfree(&pdev->dev, local_rule); + if (!IS_ERR_OR_NULL(thresh_arr)) + devm_kfree(&pdev->dev, thresh_arr); + if (!IS_ERR_OR_NULL(local_rule[i].thresh)) + devm_kfree(&pdev->dev, + local_rule[i].thresh); + if (!IS_ERR_OR_NULL(local_rule[i].op)) + devm_kfree(&pdev->dev, + local_rule[i].op); + if (!IS_ERR_OR_NULL(local_rule[i].src_field)) + devm_kfree(&pdev->dev, + local_rule[i].src_field); + if (!IS_ERR_OR_NULL(thresh_arr)) + devm_kfree(&pdev->dev, thresh_arr); } } + devm_kfree(&pdev->dev, local_rule); *static_rules = NULL; return ret; } diff --git a/drivers/platform/msm/msm_bus/msm_bus_rules.c b/drivers/platform/msm/msm_bus/msm_bus_rules.c index 297ba9fc3c353..d9b7d3c214ff5 100644 --- a/drivers/platform/msm/msm_bus/msm_bus_rules.c +++ b/drivers/platform/msm/msm_bus/msm_bus_rules.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -128,9 +128,6 @@ static bool do_compare_op(u64 op1, u64 op2, int op) case OP_GE: ret = GE(op1, op2); break; - case OP_NOOP: - ret = true; - break; default: pr_info("Invalid OP %d", op); break; @@ -155,13 +152,13 @@ static void update_src_id_vote(struct rule_update_path_info *inp_node, } } -static u64 get_field(struct rules_def *rule, int src_id) +static u64 get_sum_field(struct rules_def *rule) { u64 field = 0; int i; for (i = 0; i < rule->num_src; i++) { - switch (rule->rule_ops.src_field) { + switch (rule->rule_ops.src_field[0]) { case FLD_IB: field += rule->src_info[i].ib; break; @@ -177,28 +174,59 @@ static u64 get_field(struct rules_def *rule, int src_id) return field; } -static bool check_rule(struct rules_def *rule, - struct rule_update_path_info *inp) +static u64 get_field(struct rules_def *rule, int src_id) +{ + u64 field = 0; + int i; + + for (i = 0; i < rule->num_src; i++) { + if (rule->src_info[i].id == src_id) { + switch (rule->rule_ops.src_field[i]) { + case FLD_IB: + field = rule->src_info[i].ib; + break; + case FLD_AB: + field = rule->src_info[i].ab; + break; + case FLD_CLK: + field = rule->src_info[i].clk; + break; + } + break; + } + } + return field; +} + +static bool check_rule(struct rules_def *rule) { bool ret = false; + u64 src_field = 0; + int i; if (!rule) return ret; - switch (rule->rule_ops.op) { - case OP_LE: - case OP_LT: - case OP_GT: - case OP_GE: - { - u64 src_field = get_field(rule, inp->id); - ret = do_compare_op(src_field, rule->rule_ops.thresh, - rule->rule_ops.op); - break; - } - default: - pr_err("Unsupported op %d", rule->rule_ops.op); - break; + for (i = 0; i < rule->rule_ops.num_thresh; i++) { + if (rule->rule_ops.op[i] > OP_GT) { + pr_err("Unsupported op %d", rule->rule_ops.op[i]); + continue; + } + if (rule->rule_ops.num_thresh > 1) + src_field = get_field(rule, rule->src_info[i].id); + else + src_field = get_sum_field(rule); + + ret = do_compare_op(src_field, rule->rule_ops.thresh[i], + rule->rule_ops.op[i]); + rule->rule_ops.curr_bw = src_field; + if (rule->rule_ops.combo_op == OP_AND) { + if (!ret) + return ret; + } else if (rule->rule_ops.combo_op == OP_OR) { + if (ret) + return ret; + } } return ret; } @@ -212,12 +240,12 @@ static void match_rule(struct rule_update_path_info *inp_node, list_for_each_entry(rule, &node->node_rules, link) { for (i = 0; i < rule->num_src; i++) { if (rule->src_info[i].id == inp_node->id) { - if (check_rule(rule, inp_node)) { + if (check_rule(rule)) { trace_bus_rules_matches( - (node->cur_rule ? - node->cur_rule->rule_id : -1), - inp_node->id, inp_node->ab, - inp_node->ib, inp_node->clk); + (node->cur_rule ? + node->cur_rule->rule_id : -1), + inp_node->id, inp_node->ab, + inp_node->ib, inp_node->clk); if (rule->state == RULE_STATE_NOT_APPLIED) rule->state_change = true; @@ -298,33 +326,38 @@ int msm_rules_update_path(struct list_head *input_list, return ret; } -static bool ops_equal(int op1, int op2) +static bool is_throttle_rule(int mode) { - bool ret = false; + bool ret = true; - switch (op1) { - case OP_GT: - case OP_GE: - case OP_LT: - case OP_LE: - if (abs(op1 - op2) <= 1) - ret = true; - break; - default: - ret = (op1 == op2); - } + if (mode == THROTTLE_OFF) + ret = false; return ret; } -static bool is_throttle_rule(int mode) +static int64_t get_th_diff(struct rules_def *ra, struct rules_def *rb) { - bool ret = true; + int64_t th_diff = 0; + int num_thresh = 1; - if (mode == THROTTLE_OFF) - ret = false; + if (!(ra && rb)) + return -ENXIO; - return ret; + num_thresh = ra->rule_ops.num_thresh; + if (num_thresh > 1) { + th_diff = ra->rule_ops.dst_bw - + rb->rule_ops.dst_bw; + } else { + if ((ra->rule_ops.op[0] == OP_LE) || + (ra->rule_ops.op[0] == OP_LT)) + th_diff = ra->rule_ops.thresh[0] - + rb->rule_ops.thresh[0]; + else + th_diff = rb->rule_ops.thresh[0] - + ra->rule_ops.thresh[0]; + } + return th_diff; } static int node_rules_compare(void *priv, struct list_head *a, @@ -337,26 +370,17 @@ static int node_rules_compare(void *priv, struct list_head *a, if (ra->rule_ops.mode == rb->rule_ops.mode) { - if (ops_equal(ra->rule_ops.op, rb->rule_ops.op)) { - if ((ra->rule_ops.op == OP_LT) || - (ra->rule_ops.op == OP_LE)) { - th_diff = ra->rule_ops.thresh - - rb->rule_ops.thresh; - if (th_diff > 0) - ret = 1; - else - ret = -1; - } else if ((ra->rule_ops.op == OP_GT) || - (ra->rule_ops.op == OP_GE)) { - th_diff = rb->rule_ops.thresh - - ra->rule_ops.thresh; - if (th_diff > 0) - ret = 1; - else - ret = -1; - } - } else + if ((ra->rule_ops.num_thresh == 1) && + (ra->rule_ops.op[0] - rb->rule_ops.op[0])) ret = ra->rule_ops.op - rb->rule_ops.op; + else { + th_diff = get_th_diff(ra, rb); + + if (th_diff > 0) + ret = 1; + else + ret = -1; + } } else if (is_throttle_rule(ra->rule_ops.mode) && is_throttle_rule(rb->rule_ops.mode)) { if (ra->rule_ops.mode == THROTTLE_ON) @@ -390,7 +414,8 @@ static void print_rules(struct rule_node_info *node_it) list_for_each_entry(node_rule, &node_it->node_rules, link) { pr_info("\n num Rules %d rule Id %d\n", node_it->num_rules, node_rule->rule_id); - pr_info("Rule: src_field %d\n", node_rule->rule_ops.src_field); + pr_info("Rule: src_field %d\n", + node_rule->rule_ops.src_field[0]); for (i = 0; i < node_rule->rule_ops.num_src; i++) pr_info("Rule: src %d\n", node_rule->rule_ops.src_id[i]); @@ -399,8 +424,8 @@ static void print_rules(struct rule_node_info *node_it) node_rule->rule_ops.dst_node[i], node_rule->rule_ops.dst_bw); pr_info("Rule: thresh %llu op %d mode %d State %d\n", - node_rule->rule_ops.thresh, - node_rule->rule_ops.op, + node_rule->rule_ops.thresh[0], + node_rule->rule_ops.op[0], node_rule->rule_ops.mode, node_rule->state); } @@ -410,8 +435,10 @@ void print_all_rules(void) { struct rule_node_info *node_it = NULL; + mutex_lock(&msm_bus_rules_lock); list_for_each_entry(node_it, &node_list, link) print_rules(node_it); + mutex_unlock(&msm_bus_rules_lock); } void print_rules_buf(char *buf, int max_buf) @@ -421,6 +448,7 @@ void print_rules_buf(char *buf, int max_buf) int i; int cnt = 0; + mutex_lock(&msm_bus_rules_lock); list_for_each_entry(node_it, &node_list, link) { cnt += scnprintf(buf + cnt, max_buf - cnt, "\n Now printing rules for Node %d cur_rule %d\n", @@ -431,27 +459,34 @@ void print_rules_buf(char *buf, int max_buf) "\nNum Rules:%d ruleId %d STATE:%d change:%d\n", node_it->num_rules, node_rule->rule_id, node_rule->state, node_rule->state_change); - cnt += scnprintf(buf + cnt, max_buf - cnt, - "Src_field %d\n", - node_rule->rule_ops.src_field); + for (i = 0; i < node_rule->rule_ops.num_thresh; i++) + cnt += scnprintf(buf + cnt, max_buf - cnt, + "Src_field %d\n", + node_rule->rule_ops.src_field[i]); for (i = 0; i < node_rule->rule_ops.num_src; i++) cnt += scnprintf(buf + cnt, max_buf - cnt, - "Src %d Cur Ib %llu Ab %llu\n", + "Src %d Cur Ib %llu Ab %llu Clk %llu\n", node_rule->rule_ops.src_id[i], node_rule->src_info[i].ib, - node_rule->src_info[i].ab); + node_rule->src_info[i].ab, + node_rule->src_info[i].clk); for (i = 0; i < node_rule->rule_ops.num_dst; i++) cnt += scnprintf(buf + cnt, max_buf - cnt, "Dst %d dst_bw %llu\n", node_rule->rule_ops.dst_node[0], node_rule->rule_ops.dst_bw); - cnt += scnprintf(buf + cnt, max_buf - cnt, + for (i = 0; i < node_rule->rule_ops.num_thresh; i++) + cnt += scnprintf(buf + cnt, max_buf - cnt, "Thresh %llu op %d mode %d\n", - node_rule->rule_ops.thresh, - node_rule->rule_ops.op, + node_rule->rule_ops.thresh[i], + node_rule->rule_ops.op[i], node_rule->rule_ops.mode); + scnprintf(buf+cnt, max_buf - cnt, + "Combo Op %d\n", + node_rule->rule_ops.combo_op); } } + mutex_unlock(&msm_bus_rules_lock); } static int copy_rule(struct bus_rule_type *src, struct rules_def *node_rule, @@ -470,17 +505,58 @@ static int copy_rule(struct bus_rule_type *src, struct rules_def *node_rule, __func__); return -ENOMEM; } - memcpy(node_rule->rule_ops.src_id, src->src_id, - sizeof(int) * src->num_src); + node_rule->rule_ops.thresh = kzalloc( + (sizeof(u64) * node_rule->rule_ops.num_thresh), + GFP_KERNEL); + if (!node_rule->rule_ops.thresh) { + pr_err("%s:Failed to allocate for thresh", + __func__); + kfree(node_rule->rule_ops.src_id); + return -ENOMEM; + } + node_rule->rule_ops.src_field = kzalloc( + (sizeof(int) * node_rule->rule_ops.num_thresh), + GFP_KERNEL); + if (!node_rule->rule_ops.src_field) { + pr_err("%s:Failed to allocate for src_field", + __func__); + kfree(node_rule->rule_ops.src_id); + kfree(node_rule->rule_ops.thresh); + return -ENOMEM; + } + node_rule->rule_ops.op = kzalloc( + (sizeof(int) * node_rule->rule_ops.num_thresh), + GFP_KERNEL); + + if (!node_rule->rule_ops.op) { + pr_err("%s:Failed to allocate for OP", + __func__); + kfree(node_rule->rule_ops.src_id); + kfree(node_rule->rule_ops.thresh); + kfree(node_rule->rule_ops.src_field); + return -ENOMEM; + } + memcpy(node_rule->rule_ops.thresh, src->thresh, + sizeof(u64) * src->num_thresh); + memcpy(node_rule->rule_ops.src_field, src->src_field, + sizeof(int) * src->num_thresh); + memcpy(node_rule->rule_ops.op, src->op, + sizeof(int) * src->num_thresh); + memcpy(node_rule->rule_ops.src_id, src->src_id, + sizeof(int) * src->num_src); if (!nb) { node_rule->rule_ops.dst_node = kzalloc( (sizeof(int) * node_rule->rule_ops.num_dst), GFP_KERNEL); if (!node_rule->rule_ops.dst_node) { - pr_err("%s:Failed to allocate for src_id", + pr_err("%s:Failed to allocate for dst_node", __func__); + kfree(node_rule->rule_ops.src_id); + kfree(node_rule->rule_ops.thresh); + kfree(node_rule->rule_ops.src_field); + kfree(node_rule->rule_ops.op); return -ENOMEM; } memcpy(node_rule->rule_ops.dst_node, src->dst_node, @@ -492,8 +568,14 @@ static int copy_rule(struct bus_rule_type *src, struct rules_def *node_rule, (sizeof(struct node_vote_info) * node_rule->rule_ops.num_src), GFP_KERNEL); if (!node_rule->src_info) { - pr_err("%s:Failed to allocate for src_id", + pr_err("%s:Failed to allocate for src_info", __func__); + kfree(node_rule->rule_ops.src_id); + kfree(node_rule->rule_ops.thresh); + kfree(node_rule->rule_ops.src_field); + kfree(node_rule->rule_ops.op); + if (!nb) + kfree(node_rule->rule_ops.dst_node); return -ENOMEM; } for (i = 0; i < src->num_src; i++) @@ -556,7 +638,8 @@ static bool __rule_register(int num_rules, struct bus_rule_type *rule, list_add_tail(&node_rule->link, &node->node_rules); } } - list_sort(NULL, &node->node_rules, node_rules_compare); + if (!nb) + list_sort(NULL, &node->node_rules, node_rules_compare); if (nb && nb != node->rule_notify_list.head) raw_notifier_chain_register(&node->rule_notify_list, nb); exit_rule_register: @@ -573,9 +656,16 @@ static int comp_rules(struct bus_rule_type *rulea, struct bus_rule_type *ruleb) if (!ret && (rulea->num_dst == ruleb->num_dst)) ret = memcmp(rulea->dst_node, ruleb->dst_node, (sizeof(int) * rulea->num_dst)); - if (ret || (rulea->dst_bw != ruleb->dst_bw) || - (rulea->op != ruleb->op) || (rulea->thresh != ruleb->thresh)) + if (!ret && (rulea->num_thresh == ruleb->num_thresh)) + ret = (memcmp(rulea->op, ruleb->op, + (sizeof(int) * rulea->num_thresh)) && + memcmp(rulea->thresh, ruleb->thresh, + (sizeof(int) * rulea->num_thresh)) && + memcmp(rulea->src_field, ruleb->src_field, + (sizeof(int) * rulea->num_thresh))); + if (ret || (rulea->dst_bw != ruleb->dst_bw)) ret = 1; + return ret; } @@ -590,6 +680,20 @@ void msm_rule_register(int num_rules, struct bus_rule_type *rule, mutex_unlock(&msm_bus_rules_lock); } +static void free_rule_params(struct rules_def *node_rule) +{ + struct bus_rule_type *rule = &node_rule->rule_ops; + + kfree(rule->src_id); + kfree(rule->src_field); + kfree(rule->op); + kfree(rule->thresh); + kfree(rule->dst_node); + kfree(node_rule->src_info); + + list_del(&node_rule->link); +} + static bool __rule_unregister(int num_rules, struct bus_rule_type *rule, struct notifier_block *nb) { @@ -609,19 +713,18 @@ static bool __rule_unregister(int num_rules, struct bus_rule_type *rule, pr_err("%s: Can't find node", __func__); goto exit_unregister_rule; } - match_found = true; - list_for_each_entry_safe(node_rule, node_rule_tmp, + + for (i = 0; i < num_rules; i++) { + list_for_each_entry_safe(node_rule, node_rule_tmp, &node->node_rules, link) { - if (comp_rules(&node_rule->rule_ops, + if (comp_rules(&node_rule->rule_ops, &rule[i]) == 0) { - list_del(&node_rule->link); - kfree(node_rule); - match_found = true; - node->num_rules--; - list_sort(NULL, - &node->node_rules, - node_rules_compare); - break; + free_rule_params(node_rule); + kfree(node_rule); + match_found = true; + node->num_rules--; + break; + } } } if (!node->num_rules) @@ -673,6 +776,56 @@ void msm_rule_unregister(int num_rules, struct bus_rule_type *rule, mutex_unlock(&msm_bus_rules_lock); } +int msm_rule_query_bandwidth(struct bus_rule_type *rule, + u64 *bw, struct notifier_block *nb) +{ + struct rule_node_info *node = NULL; + struct rules_def *node_rule; + int ret = -ENXIO; + + if (!rule) { + pr_err("%s: invalid rule pointer", __func__); + return ret; + } + + mutex_lock(&msm_bus_rules_lock); + if (nb) { + node = get_node(NB_ID, nb); + if (!node) { + pr_err("%s: Can't find node", __func__); + goto exit_rule_not_found; + } + list_for_each_entry(node_rule, + &node->node_rules, link) { + if (comp_rules(&node_rule->rule_ops, + rule) == 0) { + *bw = node_rule->rule_ops.curr_bw; + ret = 0; + break; + } + } + } else { + list_for_each_entry(node, &node_list, link) { + list_for_each_entry(node_rule, + &node->node_rules, link) { + if (comp_rules(&node_rule->rule_ops, + rule) == 0) { + *bw = node_rule->rule_ops.curr_bw; + ret = 0; + break; + } + } + } + } + + if (ret) + pr_err("%s: can't find the rule", __func__); + +exit_rule_not_found: + mutex_unlock(&msm_bus_rules_lock); + return ret; +} + bool msm_rule_update(struct bus_rule_type *old_rule, struct bus_rule_type *new_rule, struct notifier_block *nb) @@ -721,11 +874,12 @@ bool msm_rule_are_rules_registered(void) { bool ret = false; + mutex_lock(&msm_bus_rules_lock); if (list_empty(&node_list)) ret = false; else ret = true; - + mutex_unlock(&msm_bus_rules_lock); return ret; } diff --git a/drivers/platform/msm/qpnp-haptic.c b/drivers/platform/msm/qpnp-haptic.c index cae90457bb923..618b96ec715c8 100644 --- a/drivers/platform/msm/qpnp-haptic.c +++ b/drivers/platform/msm/qpnp-haptic.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -350,6 +350,7 @@ struct qpnp_hap { u8 lra_res_cal_period; u8 sc_duration; u8 ext_pwm_dtest_line; + bool vcc_pon_enabled; bool state; bool use_play_irq; bool use_sc_irq; @@ -1736,13 +1737,15 @@ static void qpnp_hap_worker(struct work_struct *work) struct qpnp_hap *hap = container_of(work, struct qpnp_hap, work); u8 val = 0x00; - int rc, reg_en; + int rc; - if (hap->vcc_pon) { - reg_en = regulator_enable(hap->vcc_pon); - if (reg_en) - pr_err("%s: could not enable vcc_pon regulator\n", - __func__); + if (hap->vcc_pon && hap->state && !hap->vcc_pon_enabled) { + rc = regulator_enable(hap->vcc_pon); + if (rc < 0) + pr_err("%s: could not enable vcc_pon regulator rc=%d\n", + __func__, rc); + else + hap->vcc_pon_enabled = true; } /* Disable haptics module if the duration of short circuit @@ -1757,11 +1760,13 @@ static void qpnp_hap_worker(struct work_struct *work) qpnp_hap_set(hap, hap->state); } - if (hap->vcc_pon && !reg_en) { + if (hap->vcc_pon && !hap->state && hap->vcc_pon_enabled) { rc = regulator_disable(hap->vcc_pon); if (rc) - pr_err("%s: could not disable vcc_pon regulator\n", - __func__); + pr_err("%s: could not disable vcc_pon regulator rc=%d\n", + __func__, rc); + else + hap->vcc_pon_enabled = false; } } diff --git a/drivers/platform/msm/qpnp-power-on.c b/drivers/platform/msm/qpnp-power-on.c index 4e2a085f8b0a8..e3961a3268e4a 100644 --- a/drivers/platform/msm/qpnp-power-on.c +++ b/drivers/platform/msm/qpnp-power-on.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -30,6 +31,8 @@ #include #include +#include + #define CREATE_MASK(NUM_BITS, POS) \ ((unsigned char) (((1 << (NUM_BITS)) - 1) << (POS))) #define PON_MASK(MSB_BIT, LSB_BIT) \ @@ -68,6 +71,7 @@ ((pon)->base + PON_OFFSET((pon)->subtype, 0xA, 0xC2)) #define QPNP_POFF_REASON1(pon) \ ((pon)->base + PON_OFFSET((pon)->subtype, 0xC, 0xC5)) +#define QPNP_POFF_REASON2(pon) ((pon)->base + 0xD) #define QPNP_PON_WARM_RESET_REASON2(pon) ((pon)->base + 0xB) #define QPNP_PON_OFF_REASON(pon) ((pon)->base + 0xC7) #define QPNP_FAULT_REASON1(pon) ((pon)->base + 0xC8) @@ -206,7 +210,7 @@ struct qpnp_pon { int num_pon_reg; int num_pon_config; int reg_count; - u32 dbc; + u32 dbc_time_us; u32 uvlo; int warm_reset_poff_type; int hard_reset_poff_type; @@ -218,6 +222,8 @@ struct qpnp_pon { u8 warm_reset_reason2; bool is_spon; bool store_hard_reset_reason; + bool kpdpwr_dbc_enable; + ktime_t kpdpwr_last_release_time; }; static struct qpnp_pon *sys_reset_dev; @@ -240,6 +246,7 @@ static const char * const qpnp_pon_reason[] = { [7] = "Triggered from KPD (power key press)", }; +static struct qpnp_pon *fake_power_pon; #define POFF_REASON_FAULT_OFFSET 16 #define POFF_REASON_S3_RESET_OFFSET 32 static const char * const qpnp_poff_reason[] = { @@ -390,7 +397,7 @@ static int qpnp_pon_set_dbc(struct qpnp_pon *pon, u32 delay) int rc = 0; u32 delay_reg; - if (delay == pon->dbc) + if (delay == pon->dbc_time_us) goto out; if (pon->pon_input) mutex_lock(&pon->pon_input->mutex); @@ -410,7 +417,7 @@ static int qpnp_pon_set_dbc(struct qpnp_pon *pon, u32 delay) goto unlock; } - pon->dbc = delay; + pon->dbc_time_us = delay; unlock: if (pon->pon_input) @@ -419,12 +426,31 @@ static int qpnp_pon_set_dbc(struct qpnp_pon *pon, u32 delay) return rc; } +static int qpnp_pon_get_dbc(struct qpnp_pon *pon, u32 *delay) +{ + int rc; + u8 val; + + rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + QPNP_PON_DBC_CTL(pon), &val, 1); + if (rc) { + pr_err("Unable to read pon_dbc_ctl rc=%d\n", rc); + return rc; + } + val &= QPNP_PON_DBC_DELAY_MASK(pon); + + *delay = USEC_PER_SEC / + (1 << (QPNP_PON_DELAY_BIT_SHIFT - val)); + + return rc; +} + static ssize_t qpnp_pon_dbc_show(struct device *dev, struct device_attribute *attr, char *buf) { struct qpnp_pon *pon = dev_get_drvdata(dev); - return snprintf(buf, QPNP_PON_BUFFER_SIZE, "%d\n", pon->dbc); + return snprintf(buf, QPNP_PON_BUFFER_SIZE, "%d\n", pon->dbc_time_us); } static ssize_t qpnp_pon_dbc_store(struct device *dev, @@ -591,6 +617,79 @@ int qpnp_pon_is_warm_reset(void) } EXPORT_SYMBOL(qpnp_pon_is_warm_reset); +int qpnp_pon_is_ps_hold_reset(void) +{ + struct qpnp_pon *pon = sys_reset_dev; + int rc; + u8 reg = 0; + + if (!pon) + return 0; + + rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + QPNP_POFF_REASON1(pon), ®, 1); + if (rc) { + dev_err(&pon->spmi->dev, + "Unable to read addr=%x, rc(%d)\n", + QPNP_POFF_REASON1(pon), rc); + return 0; + } + + /* The bit 1 is 1, means by PS_HOLD/MSM controlled shutdown */ + if (reg & 0x2) + return 1; + + dev_info(&pon->spmi->dev, + "hw_reset reason1 is 0x%x\n", + reg); + + rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + QPNP_POFF_REASON2(pon), ®, 1); + + dev_info(&pon->spmi->dev, + "hw_reset reason2 is 0x%x\n", + reg); + return 0; +} +EXPORT_SYMBOL(qpnp_pon_is_ps_hold_reset); + +int qpnp_pon_is_lpk(void) +{ + struct qpnp_pon *pon = sys_reset_dev; + int rc; + u8 reg = 0; + + if (!pon) + return 0; + + rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + QPNP_POFF_REASON1(pon), ®, 1); + if (rc) { + dev_err(&pon->spmi->dev, + "Unable to read addr=%x, rc(%d)\n", + QPNP_POFF_REASON1(pon), rc); + return 0; + } + + + if (reg & 0x80) + return 1; + + dev_info(&pon->spmi->dev, + "hw_reset reason1 is 0x%x\n", + reg); + + rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, + QPNP_POFF_REASON2(pon), ®, 1); + + dev_info(&pon->spmi->dev, + "hw_reset reason2 is 0x%x\n", + reg); + + return 0; +} +EXPORT_SYMBOL(qpnp_pon_is_lpk); + /** * qpnp_pon_wd_config - Disable the wd in a warm reset. * @enable: to enable or disable the PON watch dog @@ -757,6 +856,7 @@ qpnp_pon_input_dispatch(struct qpnp_pon *pon, u32 pon_type) struct qpnp_pon_config *cfg = NULL; u8 pon_rt_sts = 0, pon_rt_bit = 0; u32 key_status; + u64 elapsed_us; cfg = qpnp_get_cfg(pon, pon_type); if (!cfg) @@ -766,6 +866,15 @@ qpnp_pon_input_dispatch(struct qpnp_pon *pon, u32 pon_type) if (!cfg->key_code) return 0; + if (pon->kpdpwr_dbc_enable && cfg->pon_type == PON_KPDPWR) { + elapsed_us = ktime_us_delta(ktime_get(), + pon->kpdpwr_last_release_time); + if (elapsed_us < pon->dbc_time_us) { + pr_debug("Ignoring kpdpwr event - within debounce time\n"); + return 0; + } + } + /* check the RT status to get the current status of the line */ rc = spmi_ext_register_readl(pon->spmi->ctrl, pon->spmi->sid, QPNP_PON_RT_STS(pon), &pon_rt_sts, 1); @@ -795,6 +904,11 @@ qpnp_pon_input_dispatch(struct qpnp_pon *pon, u32 pon_type) cfg->key_code, pon_rt_sts); key_status = pon_rt_sts & pon_rt_bit; + if (pon->kpdpwr_dbc_enable && cfg->pon_type == PON_KPDPWR) { + if (!key_status) + pon->kpdpwr_last_release_time = ktime_get(); + } + /* simulate press event in case release event occured * without a press event */ @@ -823,6 +937,18 @@ static irqreturn_t qpnp_kpdpwr_irq(int irq, void *_pon) return IRQ_HANDLED; } +void qpnp_kpdpwr_simulate(void) +{ + int rc; + + if (fake_power_pon == NULL) + return; + + rc = qpnp_pon_input_dispatch(fake_power_pon, PON_KPDPWR); + if (rc) + printk(KERN_WARNING "fake_power_pon Unable to send input event\n"); +} + static irqreturn_t qpnp_kpdpwr_bark_irq(int irq, void *_pon) { return IRQ_HANDLED; @@ -1556,6 +1682,7 @@ static int qpnp_pon_config_init(struct qpnp_pon *pon) } rc = qpnp_pon_request_irqs(pon, cfg); + fake_power_pon = pon; if (rc) { dev_err(&pon->spmi->dev, "Unable to request-irq's\n"); goto unreg_input_dev; @@ -1927,6 +2054,30 @@ static int read_gen2_pon_off_reason(struct qpnp_pon *pon, u16 *reason, return 0; } +extern char board_id[HARDWARE_MAX_ITEM_LONGTH]; +void probe_board_and_set(void) +{ + char *boadrid_start, *boardvol_start; + char boardid_info[HARDWARE_MAX_ITEM_LONGTH]; + + boadrid_start = strstr(saved_command_line, "board_id="); + boardvol_start = strstr(saved_command_line, "board_vol="); + memset(boardid_info, 0, HARDWARE_MAX_ITEM_LONGTH); + if (boadrid_start != NULL) { + boardvol_start = strstr(boadrid_start, ":board_vol="); + if (boardvol_start != NULL) { + strncpy(boardid_info, boadrid_start+sizeof("board_id=")-1, boardvol_start-(boadrid_start+sizeof("board_id=")-1)); + } else { + strncpy(boardid_info, boadrid_start+sizeof("board_id=")-1, 9); + } + } else { + sprintf(boardid_info, "boarid not define!"); + } + + strcpy(board_id, boardid_info); +} + + static int qpnp_pon_probe(struct spmi_device *spmi) { struct qpnp_pon *pon; @@ -1941,6 +2092,8 @@ static int qpnp_pon_probe(struct spmi_device *spmi) u8 s3_src_reg; unsigned long flags; + printk("heming add qpnp_pon_probe\n"); + pon = devm_kzalloc(&spmi->dev, sizeof(struct qpnp_pon), GFP_KERNEL); if (!pon) { @@ -2194,7 +2347,21 @@ static int qpnp_pon_probe(struct spmi_device *spmi) } } else { rc = qpnp_pon_set_dbc(pon, delay); + if (rc) { + dev_err(&spmi->dev, + "Unable to set PON debounce delay rc=%d\n", rc); + return rc; + } } + rc = qpnp_pon_get_dbc(pon, &pon->dbc_time_us); + if (rc) { + dev_err(&spmi->dev, + "Unable to get PON debounce delay rc=%d\n", rc); + return rc; + } + + pon->kpdpwr_dbc_enable = of_property_read_bool(pon->spmi->dev.of_node, + "qcom,kpdpwr-sw-debounce"); rc = of_property_read_u32(pon->spmi->dev.of_node, "qcom,warm-reset-poweroff-type", @@ -2280,6 +2447,10 @@ static int qpnp_pon_probe(struct spmi_device *spmi) "qcom,store-hard-reset-reason"); qpnp_pon_debugfs_init(spmi); + + probe_board_and_set(); + printk("heming add qpnp_pon_probe end\n"); + return 0; } diff --git a/drivers/platform/msm/seemp_core/seemp_event_encoder.c b/drivers/platform/msm/seemp_core/seemp_event_encoder.c index df56a84bc6676..36901f5fbee7e 100644 --- a/drivers/platform/msm/seemp_core/seemp_event_encoder.c +++ b/drivers/platform/msm/seemp_core/seemp_event_encoder.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015, 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 @@ -48,9 +48,15 @@ static void check_param_range(char *section_eq, bool param, void encode_seemp_params(struct seemp_logk_blk *blk) { - char *s = blk->payload.msg + 1; + struct seemp_logk_blk tmp; + char *s = 0; + char *msg_section_start = 0; + char *msg_section_eq = 0; + char *msg_s = 0; - blk->payload.msg[BLK_MAX_MSG_SZ - 1] = 0; /* zero-terminate */ + memcpy(tmp.payload.msg, blk->payload.msg, BLK_MAX_MSG_SZ); + s = tmp.payload.msg + 1; + tmp.payload.msg[BLK_MAX_MSG_SZ - 1] = 0; /* zero-terminate */ while (true) { char *section_start = s; @@ -105,8 +111,13 @@ void encode_seemp_params(struct seemp_logk_blk *blk) } } - encode_seemp_section(section_start, section_eq, s, param, - numeric, id, numeric_value); + msg_section_start = blk->payload.msg + (section_start - + tmp.payload.msg); + msg_section_eq = blk->payload.msg + (section_eq - + tmp.payload.msg); + msg_s = blk->payload.msg + (s - tmp.payload.msg); + encode_seemp_section(msg_section_start, msg_section_eq, + msg_s, param, numeric, id, numeric_value); if (*s == 0) break; diff --git a/drivers/platform/msm/spmi/Kconfig b/drivers/platform/msm/spmi/Kconfig index 4ea9dd597fd42..0d8246045ce2f 100644 --- a/drivers/platform/msm/spmi/Kconfig +++ b/drivers/platform/msm/spmi/Kconfig @@ -27,4 +27,11 @@ config MSM_QPNP_INT help Say 'y' here to include support for the Qualcomm QPNP interrupt support. QPNP is a SPMI based PMIC implementation. + +config MSM_SPMI_DEBUGFS_RO + depends on DEBUG_FS + depends on MSM_SPMI + bool "Disable SPMI debugfs write" + help + Say 'y' here to disable the SPMI debugfs register write operation. endif diff --git a/drivers/platform/msm/spmi/spmi-dbgfs.c b/drivers/platform/msm/spmi/spmi-dbgfs.c index b0a354b59a502..9a1cea429b2e8 100644 --- a/drivers/platform/msm/spmi/spmi-dbgfs.c +++ b/drivers/platform/msm/spmi/spmi-dbgfs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2014, 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 @@ -46,6 +46,12 @@ static const char *DFS_ROOT_NAME = "spmi"; static const mode_t DFS_MODE = S_IRUSR | S_IWUSR; +#ifndef CONFIG_MSM_SPMI_DEBUGFS_RO +static const mode_t DFS_DATA_MODE = S_IRUSR | S_IWUSR; +#else +static const mode_t DFS_DATA_MODE = S_IRUSR; +#endif + /* Log buffer */ struct spmi_log_buffer { size_t rpos; /* Current 'read' position in buffer */ @@ -69,6 +75,7 @@ struct spmi_trans { u32 addr; /* 20-bit address: SID + PID + Register offset */ u32 offset; /* Offset of last read data */ bool raw_data; /* Set to true for raw data dump */ + struct mutex spmi_dfs_lock; /* Prevent thread concurrency */ struct spmi_controller *ctrl; struct spmi_log_buffer *log; /* log buffer */ }; @@ -168,6 +175,7 @@ static int spmi_dfs_open(struct spmi_ctrl_data *ctrl_data, struct file *file) trans->addr = ctrl_data->addr; trans->ctrl = ctrl_data->ctrl; trans->offset = trans->addr; + mutex_init(&trans->spmi_dfs_lock); file->private_data = trans; return 0; @@ -197,6 +205,7 @@ static int spmi_dfs_close(struct inode *inode, struct file *file) if (trans && trans->log) { file->private_data = NULL; + mutex_destroy(&trans->spmi_dfs_lock); kfree(trans->log); kfree(trans); } @@ -241,6 +250,7 @@ spmi_read_data(struct spmi_controller *ctrl, uint8_t *buf, int offset, int cnt) return ret; } +#ifndef CONFIG_MSM_SPMI_DEBUGFS_RO /** * spmi_write_data: writes data across the SPMI bus * @ctrl: The SPMI controller @@ -277,6 +287,7 @@ spmi_write_data(struct spmi_controller *ctrl, uint8_t *buf, int offset, int cnt) done: return ret; } +#endif /** * print_to_log: format a string and place into the log buffer @@ -456,6 +467,7 @@ static int get_log_data(struct spmi_trans *trans) return total_items_read; } +#ifndef CONFIG_MSM_SPMI_DEBUGFS_RO /** * spmi_dfs_reg_write: write user's byte array (coded as string) over SPMI. * @file: file pointer @@ -473,14 +485,21 @@ static ssize_t spmi_dfs_reg_write(struct file *file, const char __user *buf, int cnt = 0; u8 *values; size_t ret = 0; - + u32 offset; + char *kbuf; struct spmi_trans *trans = file->private_data; - u32 offset = trans->offset; + + mutex_lock(&trans->spmi_dfs_lock); + + trans = file->private_data; + offset = trans->offset; /* Make a copy of the user data */ - char *kbuf = kmalloc(count + 1, GFP_KERNEL); - if (!kbuf) - return -ENOMEM; + kbuf = kmalloc(count + 1, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + goto unlock_mutex; + } ret = copy_from_user(kbuf, buf, count); if (ret == count) { @@ -517,8 +536,13 @@ static ssize_t spmi_dfs_reg_write(struct file *file, const char __user *buf, free_buf: kfree(kbuf); +unlock_mutex: + mutex_unlock(&trans->spmi_dfs_lock); return ret; } +#else +#define spmi_dfs_reg_write NULL +#endif /** * spmi_dfs_reg_read: reads value(s) over SPMI and fill user's buffer a @@ -537,10 +561,13 @@ static ssize_t spmi_dfs_reg_read(struct file *file, char __user *buf, size_t ret; size_t len; + mutex_lock(&trans->spmi_dfs_lock); /* Is the the log buffer empty */ if (log->rpos >= log->wpos) { - if (get_log_data(trans) <= 0) - return 0; + if (get_log_data(trans) <= 0) { + len = 0; + goto unlock_mutex; + } } len = min(count, log->wpos - log->rpos); @@ -548,7 +575,8 @@ static ssize_t spmi_dfs_reg_read(struct file *file, char __user *buf, ret = copy_to_user(buf, &log->data[log->rpos], len); if (ret == len) { pr_err("error copy SPMI register values to user\n"); - return -EFAULT; + len = -EFAULT; + goto unlock_mutex; } /* 'ret' is the number of bytes not copied */ @@ -556,6 +584,9 @@ static ssize_t spmi_dfs_reg_read(struct file *file, char __user *buf, *ppos += len; log->rpos += len; + +unlock_mutex: + mutex_unlock(&trans->spmi_dfs_lock); return len; } @@ -671,14 +702,14 @@ int spmi_dfs_add_controller(struct spmi_controller *ctrl) goto err_remove_fs; } - file = debugfs_create_file("data", DFS_MODE, dir, ctrl_data, + file = debugfs_create_file("data", DFS_DATA_MODE, dir, ctrl_data, &spmi_dfs_reg_fops); if (!file) { pr_err("error creating 'data' entry\n"); goto err_remove_fs; } - file = debugfs_create_file("data_raw", DFS_MODE, dir, ctrl_data, + file = debugfs_create_file("data_raw", DFS_DATA_MODE, dir, ctrl_data, &spmi_dfs_raw_data_fops); if (!file) { pr_err("error creating 'data' entry\n"); diff --git a/drivers/platform/msm/spmi/spmi-pmic-arb.c b/drivers/platform/msm/spmi/spmi-pmic-arb.c index a419ffe97d7e1..88961ae2bf7d0 100644 --- a/drivers/platform/msm/spmi/spmi-pmic-arb.c +++ b/drivers/platform/msm/spmi/spmi-pmic-arb.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, 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 @@ -928,6 +928,10 @@ __pmic_arb_periph_irq(int irq, void *dev_id, bool show) int first = pmic_arb->min_intr_apid >> 5; int last = pmic_arb->max_intr_apid >> 5; int i, j; + /* status based dispatch */ + bool acc_valid = false; + u32 irq_status = 0; + dev_dbg(pmic_arb->dev, "Peripheral interrupt detected\n"); @@ -935,6 +939,8 @@ __pmic_arb_periph_irq(int irq, void *dev_id, bool show) for (i = first; i <= last; ++i) { status = readl_relaxed(pmic_arb->intr + pmic_arb->ver->owner_acc_status(ee, i)); + if (status) + acc_valid = true; if ((i == 0) && (status & pmic_arb->irq_acc0_init_val)) { dev_dbg(pmic_arb->dev, "Ignoring IRQ acc[0] mask:0x%x\n", @@ -951,6 +957,24 @@ __pmic_arb_periph_irq(int irq, void *dev_id, bool show) } } + /* ACC_STATUS is empty but IRQ fired check IRQ_STATUS */ + if (!acc_valid) { + for (i = pmic_arb->min_intr_apid; i <= pmic_arb->max_intr_apid; + i++) { + if (!is_apid_valid(pmic_arb, i)) + continue; + irq_status = readl_relaxed(pmic_arb->intr + + pmic_arb->ver->irq_status(i)); + if (irq_status) { + dev_dbg(pmic_arb->dev, + "Dispatching for IRQ_STATUS_REG:0x%lx IRQ_STATUS:0x%x\n", + (ulong) pmic_arb->ver->irq_status(i), + irq_status); + ret |= periph_interrupt(pmic_arb, i, show); + } + } + } + return ret; } diff --git a/drivers/platform/msm/sps/sps.c b/drivers/platform/msm/sps/sps.c index eab0e47e7cd23..ddb2388c50063 100644 --- a/drivers/platform/msm/sps/sps.c +++ b/drivers/platform/msm/sps/sps.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016 , The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -67,6 +67,7 @@ static char *debugfs_buf; static u32 debugfs_buf_size; static u32 debugfs_buf_used; static int wraparound; +static struct mutex sps_debugfs_lock; struct dentry *dent; struct dentry *dfile_info; @@ -85,6 +86,7 @@ static struct sps_bam *phy2bam(phys_addr_t phys_addr); /* record debug info for debugfs */ void sps_debugfs_record(const char *msg) { + mutex_lock(&sps_debugfs_lock); if (debugfs_record_enabled) { if (debugfs_buf_used + MAX_MSG_LEN >= debugfs_buf_size) { debugfs_buf_used = 0; @@ -98,6 +100,7 @@ void sps_debugfs_record(const char *msg) debugfs_buf_size - debugfs_buf_used, "\n**** end line of sps log ****\n\n"); } + mutex_unlock(&sps_debugfs_lock); } /* read the recorded debug info to userspace */ @@ -107,6 +110,7 @@ static ssize_t sps_read_info(struct file *file, char __user *ubuf, int ret = 0; int size; + mutex_lock(&sps_debugfs_lock); if (debugfs_record_enabled) { if (wraparound) size = debugfs_buf_size - MAX_MSG_LEN; @@ -116,6 +120,7 @@ static ssize_t sps_read_info(struct file *file, char __user *ubuf, ret = simple_read_from_buffer(ubuf, count, ppos, debugfs_buf, size); } + mutex_unlock(&sps_debugfs_lock); return ret; } @@ -131,9 +136,10 @@ static ssize_t sps_set_info(struct file *file, const char __user *buf, int i; u32 buf_size_kb = 0; u32 new_buf_size; + u32 size = sizeof(str) < count ? sizeof(str) : count; memset(str, 0, sizeof(str)); - missing = copy_from_user(str, buf, sizeof(str)); + missing = copy_from_user(str, buf, size); if (missing) return -EFAULT; @@ -160,11 +166,13 @@ static ssize_t sps_set_info(struct file *file, const char __user *buf, new_buf_size = buf_size_kb * SZ_1K; + mutex_lock(&sps_debugfs_lock); if (debugfs_record_enabled) { if (debugfs_buf_size == new_buf_size) { /* need do nothing */ pr_info("sps:debugfs: input buffer size " "is the same as before.\n"); + mutex_unlock(&sps_debugfs_lock); return count; } else { /* release the current buffer */ @@ -184,12 +192,14 @@ static ssize_t sps_set_info(struct file *file, const char __user *buf, if (!debugfs_buf) { debugfs_buf_size = 0; pr_err("sps:fail to allocate memory for debug_fs.\n"); + mutex_unlock(&sps_debugfs_lock); return -ENOMEM; } debugfs_buf_used = 0; wraparound = false; debugfs_record_enabled = true; + mutex_unlock(&sps_debugfs_lock); return count; } @@ -221,9 +231,10 @@ static ssize_t sps_set_logging_option(struct file *file, const char __user *buf, char str[MAX_MSG_LEN]; int i; u8 option = 0; + u32 size = sizeof(str) < count ? sizeof(str) : count; memset(str, 0, sizeof(str)); - missing = copy_from_user(str, buf, sizeof(str)); + missing = copy_from_user(str, buf, size); if (missing) return -EFAULT; @@ -237,6 +248,7 @@ static ssize_t sps_set_logging_option(struct file *file, const char __user *buf, return count; } + mutex_lock(&sps_debugfs_lock); if (((option == 0) || (option == 2)) && ((logging_option == 1) || (logging_option == 3))) { debugfs_record_enabled = false; @@ -248,6 +260,7 @@ static ssize_t sps_set_logging_option(struct file *file, const char __user *buf, } logging_option = option; + mutex_unlock(&sps_debugfs_lock); return count; } @@ -270,9 +283,10 @@ static ssize_t sps_set_bam_addr(struct file *file, const char __user *buf, struct sps_bam *bam; u32 num_pipes = 0; void *vir_addr; + u32 size = sizeof(str) < count ? sizeof(str) : count; memset(str, 0, sizeof(str)); - missing = copy_from_user(str, buf, sizeof(str)); + missing = copy_from_user(str, buf, size); if (missing) return -EFAULT; @@ -584,6 +598,8 @@ static void sps_debugfs_init(void) goto bam_log_level_err; } + mutex_init(&sps_debugfs_lock); + return; bam_log_level_err: diff --git a/drivers/platform/msm/sps/spsi.h b/drivers/platform/msm/sps/spsi.h index 1b4ca69bee16e..9e80381903418 100644 --- a/drivers/platform/msm/sps/spsi.h +++ b/drivers/platform/msm/sps/spsi.h @@ -145,11 +145,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } \ } while (0) -#define SPS_DEBUGFS(msg, args...) do { \ - char buf[MAX_MSG_LEN]; \ - snprintf(buf, MAX_MSG_LEN, msg"\n", ##args); \ - sps_debugfs_record(buf); \ - } while (0) #define SPS_ERR(dev, msg, args...) do { \ if (logging_option != 1) { \ if (unlikely(print_limit_option > 2)) \ @@ -157,8 +152,6 @@ extern u8 print_limit_option; else \ pr_err(msg, ##args); \ } \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ SPS_IPC(3, dev, msg, args); \ } while (0) #define SPS_INFO(dev, msg, args...) do { \ @@ -168,8 +161,6 @@ extern u8 print_limit_option; else \ pr_info(msg, ##args); \ } \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ SPS_IPC(3, dev, msg, args); \ } while (0) #define SPS_DBG(dev, msg, args...) do { \ @@ -181,8 +172,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 0) \ SPS_IPC(0, dev, msg, args); \ @@ -197,8 +186,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 1) \ SPS_IPC(1, dev, msg, args); \ @@ -213,8 +200,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 2) \ SPS_IPC(2, dev, msg, args); \ @@ -229,8 +214,6 @@ extern u8 print_limit_option; pr_info(msg, ##args); \ } else \ pr_debug(msg, ##args); \ - if (unlikely(debugfs_record_enabled)) \ - SPS_DEBUGFS(msg, ##args); \ if (dev) { \ if ((dev)->ipc_loglevel <= 3) \ SPS_IPC(3, dev, msg, args); \ diff --git a/drivers/platform/msm/usb_bam.c b/drivers/platform/msm/usb_bam.c index b432b07412201..3f130c4cfb7ce 100644 --- a/drivers/platform/msm/usb_bam.c +++ b/drivers/platform/msm/usb_bam.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -235,10 +235,10 @@ void msm_bam_set_hsic_host_dev(struct device *dev) if (dev) { /* Hold the device until allowing lpm */ info[HSIC_CTRL].in_lpm = false; - log_event_dbg("%s: Getting hsic device %p\n", __func__, dev); + log_event_dbg("%s: Getting hsic device %pK\n", __func__, dev); pm_runtime_get(dev); } else if (host_info[HSIC_CTRL].dev) { - log_event_dbg("%s: Try Putting hsic device %p, lpm:%d\n", + log_event_dbg("%s: Try Putting hsic device %pK, lpm:%d\n", __func__, host_info[HSIC_CTRL].dev, info[HSIC_CTRL].in_lpm); /* Just release previous device if not already done */ @@ -825,7 +825,7 @@ static bool _hsic_host_bam_resume_core(void) /* Exit from "full suspend" in case of hsic host */ if (host_info[HSIC_CTRL].dev && info[HSIC_CTRL].in_lpm) { - log_event_dbg("%s: Getting hsic device %p\n", __func__, + log_event_dbg("%s: Getting hsic device %pK\n", __func__, host_info[HSIC_CTRL].dev); pm_runtime_get(host_info[HSIC_CTRL].dev); info[HSIC_CTRL].in_lpm = false; @@ -839,7 +839,7 @@ static void _hsic_host_bam_suspend_core(void) log_event_dbg("%s: enter\n", __func__); if (host_info[HSIC_CTRL].dev && !info[HSIC_CTRL].in_lpm) { - log_event_dbg("%s: Putting hsic host device %p\n", __func__, + log_event_dbg("%s: Putting hsic host device %pK\n", __func__, host_info[HSIC_CTRL].dev); pm_runtime_put(host_info[HSIC_CTRL].dev); info[HSIC_CTRL].in_lpm = true; @@ -1323,6 +1323,9 @@ static void usb_bam_finish_suspend(enum usb_ctrl cur_bam) __func__, ret); goto no_lpm; } + } else { + log_event_err("%s: pipe type is not B2B\n", __func__); + cons_empty = true; } spin_lock(&usb_bam_ipa_handshake_info_lock); @@ -1721,7 +1724,7 @@ static bool check_pipes_empty(enum usb_ctrl bam_type, u8 src_idx, u8 dst_idx) /* If we have any remaints in the pipes we don't go to sleep */ prod_pipe = ctx->usb_bam_sps.sps_pipes[src_idx]; cons_pipe = ctx->usb_bam_sps.sps_pipes[dst_idx]; - log_event_dbg("prod_pipe=%p, cons_pipe=%p\n", prod_pipe, cons_pipe); + log_event_dbg("prod_pipe=%pK, cons_pipe=%pK\n", prod_pipe, cons_pipe); if (!cons_pipe || (!prod_pipe && prod_pipe_connect->pipe_type == USB_BAM_PIPE_BAM2BAM)) { @@ -1959,8 +1962,8 @@ static void usb_bam_finish_resume(struct work_struct *w) spin_unlock(&usb_bam_ipa_handshake_info_lock); mutex_unlock(&info[cur_bam].suspend_resume_mutex); - log_event_dbg("%s: done..PM Runtime PUT %d, count: %d\n", - __func__, idx, get_pm_runtime_counter(bam_dev)); + log_event_dbg("%s: done..PM Runtime PUT :%d\n", + __func__, get_pm_runtime_counter(bam_dev)); /* Put to match _get at the beginning of this routine */ pm_runtime_put(&ctx->usb_bam_pdev->dev); } @@ -2088,7 +2091,7 @@ static bool msm_bam_host_lpm_ok(enum usb_ctrl bam_type) } /* HSIC host will go now to lpm */ - log_event_dbg("%s: vote for suspend hsic %p\n", + log_event_dbg("%s: vote for suspend hsic %pK\n", __func__, host_info[bam_type].dev); for (i = 0; i < ctx->max_connections; i++) { @@ -2451,7 +2454,7 @@ static void usb_bam_work(struct work_struct *w) if (pipe_iter->bam_type == pipe_connect->bam_type && pipe_iter->dir == PEER_PERIPHERAL_TO_USB && pipe_iter->enabled) { - log_event_dbg("%s: Register wakeup on pipe %p\n", + log_event_dbg("%s: Register wakeup on pipe %pK\n", __func__, pipe_iter); __usb_bam_register_wake_cb( pipe_connect->bam_type, i, @@ -2762,16 +2765,14 @@ static void usb_bam_sps_events(enum sps_callback_case sps_cb_case, void *user) log_event_dbg("%s: received SPS_CALLBACK_BAM_TIMER_IRQ\n", __func__); - spin_lock(&ctx->usb_bam_lock); - bam = get_bam_type_from_core_name((char *)user); if (bam < 0 || bam >= MAX_BAMS) { log_event_err("%s: Invalid bam, type=%d ,name=%s\n", __func__, bam, (char *)user); - spin_unlock(&ctx->usb_bam_lock); return; } ctx = &msm_usb_bam[bam]; + spin_lock(&ctx->usb_bam_lock); ctx->is_bam_inactivity = true; log_event_dbg("%s: Inactivity happened on bam=%s,%d\n", @@ -2886,9 +2887,6 @@ static struct msm_usb_bam_platform_data *usb_bam_dt_to_pdata( else pdata->override_threshold = threshold; - pdata->enable_hsusb_bam_on_boot = of_property_read_bool(node, - "qcom,enable-hsusb-bam-on-boot"); - for_each_child_of_node(pdev->dev.of_node, node) max_connections++; @@ -3012,53 +3010,72 @@ static struct msm_usb_bam_platform_data *usb_bam_dt_to_pdata( return NULL; } -static int usb_bam_init(struct platform_device *pdev) +static void msm_usb_bam_update_props(struct sps_bam_props *props, + struct platform_device *pdev) { - int ret; struct msm_usb_bam_platform_data *pdata = pdev->dev.platform_data; enum usb_ctrl bam_type = pdata->bam_type; struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam_type]; - struct sps_bam_props props; - memset(&props, 0, sizeof(props)); - pr_debug("%s: usb_bam_init - %s\n", __func__, - bam_enable_strings[bam_type]); - - props.phys_addr = ctx->io_res->start; - props.virt_addr = ctx->regs; - props.virt_size = resource_size(ctx->io_res); - props.irq = ctx->irq; - props.summing_threshold = pdata->override_threshold; - props.event_threshold = pdata->override_threshold; - props.num_pipes = pdata->usb_bam_num_pipes; - props.callback = usb_bam_sps_events; - props.user = bam_enable_strings[bam_type]; + props->phys_addr = ctx->io_res->start; + props->virt_addr = NULL; + props->virt_size = resource_size(ctx->io_res); + props->irq = ctx->irq; + props->summing_threshold = pdata->override_threshold; + props->event_threshold = pdata->override_threshold; + props->num_pipes = pdata->usb_bam_num_pipes; + props->callback = usb_bam_sps_events; + props->user = bam_enable_strings[bam_type]; /* * HSUSB and HSIC Cores don't support RESET ACK signal to BAMs * Hence, let BAM to ignore acknowledge from USB while resetting PIPE */ if (pdata->ignore_core_reset_ack && bam_type != DWC3_CTRL) - props.options = SPS_BAM_NO_EXT_P_RST; + props->options = SPS_BAM_NO_EXT_P_RST; if (pdata->disable_clk_gating) - props.options |= SPS_BAM_NO_LOCAL_CLK_GATING; + props->options |= SPS_BAM_NO_LOCAL_CLK_GATING; /* - * HSUSB BAM is not NDP BAM and it must be enabled early before + * HSUSB BAM is not NDP BAM and it must be enabled before * starting peripheral controller to avoid switching USB core mode * from legacy to BAM with ongoing data transfers. */ - if (pdata->enable_hsusb_bam_on_boot && bam_type == CI_CTRL) { - pr_debug("Register and enable HSUSB BAM\n"); - props.options |= SPS_BAM_OPT_ENABLE_AT_BOOT; - props.options |= SPS_BAM_FORCE_RESET; + if (bam_type == CI_CTRL) { + log_event_dbg("Register and enable HSUSB BAM\n"); + props->options |= SPS_BAM_OPT_ENABLE_AT_BOOT; + props->options |= SPS_BAM_FORCE_RESET; } +} + +static int usb_bam_init(struct platform_device *pdev) +{ + int ret; + struct msm_usb_bam_platform_data *pdata = pdev->dev.platform_data; + enum usb_ctrl bam_type = pdata->bam_type; + struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam_type]; + struct sps_bam_props props; + + + pr_debug("%s: usb_bam_init - %s\n", __func__, + bam_enable_strings[bam_type]); + + /* + * CI USB2 BAM is registered before starting controller + * and only if bam2bam function is present in composition + */ + if (bam_type == CI_CTRL) + return 0; + + memset(&props, 0, sizeof(props)); + msm_usb_bam_update_props(&props, pdev); ret = sps_register_bam_device(&props, &ctx->h_bam); if (ret < 0) { - log_event_err("%s: register bam error %d\n", __func__, ret); + log_event_err("%s: register bam error %d\n", + __func__, ret); return -EFAULT; } @@ -3100,79 +3117,6 @@ static int enable_usb_bam(struct platform_device *pdev) return 0; } -static ssize_t -usb_bam_show_inactivity_timer(struct device *dev, struct device_attribute *attr, - char *buf) -{ - char *buff = buf; - int i; - - for (i = 0; i < ARRAY_SIZE(bam_enable_strings); i++) { - buff += snprintf(buff, PAGE_SIZE, "%s: %dms\n", - bam_enable_strings[i], - msm_usb_bam[i].inactivity_timer_ms); - } - - return buff - buf; -} - -static ssize_t usb_bam_store_inactivity_timer(struct device *dev, - struct device_attribute *attr, - const char *buff, size_t count) -{ - char buf[USB_BAM_MAX_STR_LEN]; - char *trimmed_buf, *bam_str, *bam_name, *timer; - int timer_d; - int bam; - - if (strnstr(buff, "help", USB_BAM_MAX_STR_LEN)) { - pr_info("Usage: , ,...\n"); - pr_info("\tbam_name: [%s, %s, %s]\n", - bam_enable_strings[DWC3_CTRL], - bam_enable_strings[CI_CTRL], - bam_enable_strings[HSIC_CTRL]); - pr_info("\tms: time in ms. Use 0 to disable timer\n"); - return count; - } - - strlcpy(buf, buff, sizeof(buf)); - trimmed_buf = strim(buf); - - while (trimmed_buf) { - bam_str = strsep(&trimmed_buf, ","); - if (bam_str) { - bam_name = strsep(&bam_str, " "); - bam = get_bam_type_from_core_name(bam_name); - if (bam < 0 || bam >= MAX_BAMS) { - log_event_err("%s: Invalid bam, type=%d ,name=%s\n", - __func__, bam, bam_name); - return -EINVAL; - } - - timer = strsep(&bam_str, " "); - - if (!timer) - continue; - - sscanf(timer, "%d", &timer_d); - - /* Apply new timer setting if bam has running pipes */ - if (msm_usb_bam[bam].inactivity_timer_ms != timer_d) { - msm_usb_bam[bam].inactivity_timer_ms = timer_d; - if (msm_usb_bam[bam].pipes_enabled_per_bam > 0 - && !info[bam].in_lpm) - usb_bam_set_inactivity_timer(bam); - } - } - } - - return count; -} - -static DEVICE_ATTR(inactivity_timer, S_IWUSR | S_IRUSR, - usb_bam_show_inactivity_timer, - usb_bam_store_inactivity_timer); - static int usb_bam_panic_notifier(struct notifier_block *this, unsigned long event, void *ptr) { @@ -3221,12 +3165,6 @@ static int usb_bam_probe(struct platform_device *pdev) dev_dbg(&pdev->dev, "usb_bam_probe\n"); - ret = device_create_file(&pdev->dev, &dev_attr_inactivity_timer); - if (ret) { - dev_err(&pdev->dev, "failed to create fs node\n"); - return ret; - } - io_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (!io_res) { dev_err(&pdev->dev, "missing BAM memory resource\n"); @@ -3417,7 +3355,7 @@ int msm_do_bam_disable_enable(enum usb_ctrl bam) return 0; pdata = ctx->usb_bam_pdev->dev.platform_data; - if ((bam != CI_CTRL) || !pdata->enable_hsusb_bam_on_boot) + if (bam != CI_CTRL) return 0; if (!ctx->pipes_enabled_per_bam || info[bam].pipes_suspended) @@ -3519,20 +3457,45 @@ EXPORT_SYMBOL(msm_do_bam_disable_enable); bool msm_usb_bam_enable(enum usb_ctrl bam, bool bam_enable) { - struct msm_usb_bam_platform_data *pdata; struct usb_bam_ctx_type *ctx = &msm_usb_bam[bam]; + static bool bam_enabled; + int ret; if (!ctx->usb_bam_pdev) return 0; - pdata = ctx->usb_bam_pdev->dev.platform_data; - if ((bam != CI_CTRL) || !(bam_enable || - pdata->enable_hsusb_bam_on_boot)) + if (bam != CI_CTRL) return 0; - msm_hw_bam_disable(1); - sps_device_reset(ctx->h_bam); - msm_hw_bam_disable(0); + if (bam_enabled == bam_enable) { + log_event_dbg("%s: USB BAM is already %s\n", __func__, + bam_enable ? "Registered" : "De-registered"); + return 0; + } + + if (bam_enable) { + struct sps_bam_props props; + + memset(&props, 0, sizeof(props)); + msm_usb_bam_update_props(&props, ctx->usb_bam_pdev); + msm_hw_bam_disable(1); + ret = sps_register_bam_device(&props, &ctx->h_bam); + bam_enabled = true; + if (ret < 0) { + log_event_err("%s: register bam error %d\n", + __func__, ret); + return -EFAULT; + } + log_event_dbg("%s: USB BAM Registered\n", __func__); + msm_hw_bam_disable(0); + } else { + msm_hw_soft_reset(); + msm_hw_bam_disable(1); + sps_device_reset(ctx->h_bam); + sps_deregister_bam_device(ctx->h_bam); + log_event_dbg("%s: USB BAM De-registered\n", __func__); + bam_enabled = false; + } return 0; } diff --git a/drivers/power/Kconfig b/drivers/power/Kconfig index 7d27cc9334bdb..5037004c23127 100644 --- a/drivers/power/Kconfig +++ b/drivers/power/Kconfig @@ -462,6 +462,63 @@ config SMB358_CHARGER The driver reports the charger status via the power supply framework. A charger status change triggers an IRQ via the device STAT pin. +config CHARGER_BQ2560 + tristate "BQ2560X Battery Charger" + depends on I2C + help + Say Y to include support for SMB358 Battery Charger. + SMB358 is a single path switching mode charger capable of charging + Say Y to include support for BQ2560X Battery Charger. + BQ2560X is a single path switching mode charger capable of charging + the battery with 2Amps of current. + The driver supports charger enable/disable. + The driver reports the charger status via the power supply framework. + A charger status change triggers an IRQ via the device STAT pin. + +config GAUGE_BQ27426 + tristate "BQ27426 Battery Fg" + depends on I2C + help + Say Y to include support for BQ27426 Battery Charger. + BQ27426 is a single path switching mode charger capable of charging + the battery with 2Amps of current. + The driver supports charger enable/disable. + The driver reports the charger status via the power supply framework. + A charger status change triggers an IRQ via the device STAT pin. + + +config C3N_SMB358 + bool "to seperate different projects" + default n + help + Say Y here to enable a function which disabled TEMP protect... + WARNNING:Only SCM could open it. + +config C3B_BQ2560X + bool "to seperate different projects" + default n + help + Say Y here to enable a function which disabled TEMP protect... + WARNNING:Only SCM could open it. + +config A13N_PMI8952 + bool "to seperate different projects" + default n + help + Say Y here to enable A13N_PMI8952 macro + +config D1_ROSY + bool "to seperate different projects" + default n + help + Say Y here to enable D1_ROSY macro + +config BATTERY_CW2015 + tristate "CW2015 battery driver" + depends on I2C + help + Say Y here to enable Test sysfs Interface for CW2015 Drivers. + config SMB23X_CHARGER tristate "SMB23X Battery Charger" depends on I2C @@ -616,6 +673,13 @@ config MSM_BCL_PERIPHERAL_CTL provides routines to configure and monitor the BCL PMIC peripheral. +config DISABLE_TEMP_PROTECT + bool "control of TEMP protect" + default n + help + Say Y here to enable a function which disabled TEMP protect... + WARNNING:Only SCM could open it. + source "drivers/power/reset/Kconfig" endif # POWER_SUPPLY diff --git a/drivers/power/Makefile b/drivers/power/Makefile index babd404fbd148..4b0656851721c 100644 --- a/drivers/power/Makefile +++ b/drivers/power/Makefile @@ -66,6 +66,9 @@ obj-$(CONFIG_SMB135X_CHARGER) += smb135x-charger.o obj-$(CONFIG_SMB1360_CHARGER_FG) += smb1360-charger-fg.o obj-$(CONFIG_SMB138X_CHARGER) += smb138x-charger.o pmic-voter.o obj-$(CONFIG_SMB358_CHARGER) += smb358-charger.o +obj-$(CONFIG_BATTERY_CW2015) += cw2015_battery.o ### add for c3 +obj-$(CONFIG_CHARGER_BQ2560) += bq2560x_charger.o +obj-$(CONFIG_GAUGE_BQ27426) += bq27426_fg.o obj-$(CONFIG_SMB23X_CHARGER) += smb23x-charger.o obj-$(CONFIG_BATTERY_BQ28400) += bq28400_battery.o obj-$(CONFIG_QPNP_BMS) += qpnp-bms.o batterydata-lib.o diff --git a/drivers/power/bq2560x.h b/drivers/power/bq2560x.h new file mode 100644 index 0000000000000..373e4aea274a5 --- /dev/null +++ b/drivers/power/bq2560x.h @@ -0,0 +1,69 @@ +/* + * BQ2560x battery charging driver + * + * Copyright (C) 2013 Texas Instruments + * Copyright (C) 2018 XiaoMi, Inc. + * + * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#ifndef _LINUX_BQ2560X_I2C_H +#define _LINUX_BQ2560X_I2C_H + +#include + + +struct bq2560x_charge_param { + int vlim; + int ilim; + int ichg; + int vreg; +}; + +enum stat_ctrl { + STAT_CTRL_STAT, + STAT_CTRL_ICHG, + STAT_CTRL_INDPM, + STAT_CTRL_DISABLE, +}; + +enum vboost { + BOOSTV_4850 = 4850, + BOOSTV_5000 = 5000, + BOOSTV_5150 = 5150, + BOOSTV_5300 = 5300, +}; + +enum iboost { + BOOSTI_500 = 500, + BOOSTI_1200 = 1200, +}; + +enum vac_ovp { + VAC_OVP_5500 = 5500, + VAC_OVP_6500 = 6500, + VAC_OVP_10500 = 10500, + VAC_OVP_14300 = 14300, +}; + + +struct bq2560x_platform_data { + struct bq2560x_charge_param usb; + struct bq2560x_charge_param ta; + int iprechg; + int iterm; + + enum stat_ctrl statctrl; + enum vboost boostv; + enum iboost boosti; + enum vac_ovp vac_ovp; + +}; + +#endif diff --git a/drivers/power/bq2560x_charger.c b/drivers/power/bq2560x_charger.c new file mode 100644 index 0000000000000..e33a695f28161 --- /dev/null +++ b/drivers/power/bq2560x_charger.c @@ -0,0 +1,2466 @@ +/* + * BQ2560x battery charging driver + * + * Copyright (C) 2013 Texas Instruments + * Copyright (C) 2018 XiaoMi, Inc. + * + * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + */ + +#define pr_fmt(fmt) "bq2560x: %s: " fmt, __func__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bq2560x_reg.h" +#include "bq2560x.h" + +#if 0 +#undef pr_debug +#define pr_debug pr_err +#undef pr_info +#define pr_info pr_err +#undef dev_dbg +#define dev_dbg dev_err +#else +#undef pr_info +#define pr_info pr_debug +#endif + +enum bq2560x_vbus_type { + BQ2560X_VBUS_NONE = REG08_VBUS_TYPE_NONE, + BQ2560X_VBUS_USB = REG08_VBUS_TYPE_USB, + BQ2560X_VBUS_ADAPTER = REG08_VBUS_TYPE_ADAPTER, + BQ2560X_VBUS_OTG = REG08_VBUS_TYPE_OTG, +}; + +enum bq2560x_part_no { + BQ25600 = 0x00, + BQ25601 = 0x02, +}; + +enum { + USER = BIT(0), + JEITA = BIT(1), + BATT_FC = BIT(2), + BATT_PRES = BIT(3), + SOC = BIT(4), + CURRENT = BIT(5), +}; + +enum wakeup_src { + WAKEUP_SRC_MONITOR = 0, + WAKEUP_SRC_JEITA, + WAKEUP_SRC_MAX, +}; + +#define WAKEUP_SRC_MASK (~(~0 << WAKEUP_SRC_MAX)) +struct bq2560x_wakeup_source { + struct wakeup_source source; + unsigned long enabled_bitmap; + spinlock_t ws_lock; +}; + +enum bq2560x_charge_state { + CHARGE_STATE_IDLE = REG08_CHRG_STAT_IDLE, + CHARGE_STATE_PRECHG = REG08_CHRG_STAT_PRECHG, + CHARGE_STATE_FASTCHG = REG08_CHRG_STAT_FASTCHG, + CHARGE_STATE_CHGDONE = REG08_CHRG_STAT_CHGDONE, +}; + +struct bq2560x_otg_regulator { + struct regulator_desc rdesc; + struct regulator_dev *rdev; +}; + + +struct bq2560x { + struct device *dev; + struct i2c_client *client; + + enum bq2560x_part_no part_no; + int revision; + + int gpio_ce; + + int vbus_type; + + int status; + int call_state; + + struct mutex data_lock; + struct mutex i2c_rw_lock; + struct mutex profile_change_lock; + struct mutex charging_disable_lock; + struct mutex irq_complete; + + struct bq2560x_wakeup_source bq2560x_ws; + + bool irq_waiting; + bool irq_disabled; + bool resume_completed; + + bool batt_present; + bool usb_present; + int batt_capacity; + + bool batt_full; + + bool charge_enabled;/* Register bit status */ + bool otg_enabled; + bool batfet_enabled; + bool in_hiz; + + bool vindpm_triggered; + bool iindpm_triggered; + + bool in_therm_regulation; + bool in_vsys_regulation; + + bool power_good; + bool vbus_good; + + bool topoff_active; + bool acov_triggered; + + /* if use software jeita in case of NTC is connected to gauge */ + bool software_jeita_supported; + bool jeita_active; + + bool batt_hot; + bool batt_cold; + bool batt_warm; + bool batt_cool; + bool batt_cool_5; + + int batt_hot_degc; + int batt_warm_degc; + int batt_cold_cool_degc; + int batt_cool_normal_degc; + int batt_cold_degc; + int hot_temp_hysteresis; + int cold_temp_hysteresis; + + int batt_cold_cool_ma; + int batt_cool_normal_ma; + int batt_warm_ma; + int batt_cool_mv; + int batt_warm_mv; + + + int batt_temp; + + int jeita_ma; + int jeita_mv; + + unsigned int thermal_levels; + unsigned int therm_lvl_sel; + unsigned int *thermal_mitigation; + + int usb_psy_ma; + int charge_state; + int charging_disabled_status; + + int fault_status; + + int skip_writes; + int skip_reads; + + struct bq2560x_platform_data *platform_data; + + struct delayed_work discharge_jeita_work; + struct delayed_work charge_jeita_work; + + struct alarm jeita_alarm; + + struct dentry *debug_root; + + struct bq2560x_otg_regulator otg_vreg; + + struct power_supply *usb_psy; + struct power_supply *bms_psy; + struct power_supply batt_psy; +}; + +static int BatteryTestStatus_enable = 0; +static int bq2560x_battery_capacity = 0; + +#define FG_LOG_INTERVAL 150 +static void bq2560x_dump_status(struct bq2560x *bq); +static int calculate_jeita_poll_interval(struct bq2560x *bq); +static void bq2560x_dump_fg_reg(struct bq2560x *bq) +{ + union power_supply_propval val = {0,}; + static int dump_cnt; + + if (++dump_cnt >= (FG_LOG_INTERVAL / calculate_jeita_poll_interval(bq))) { + dump_cnt = 0; + val.intval = 0; + bq->bms_psy->set_property(bq->bms_psy, + POWER_SUPPLY_PROP_UPDATE_NOW, &val); + bq2560x_dump_status(bq); + } +} + + +static int __bq2560x_read_reg(struct bq2560x *bq, u8 reg, u8 *data) +{ + s32 ret; + + ret = i2c_smbus_read_byte_data(bq->client, reg); + if (ret < 0) { + pr_err("i2c read fail: can't read from reg 0x%02X\n", reg); + return ret; + } + + *data = (u8)ret; + + return 0; +} + +static int __bq2560x_write_reg(struct bq2560x *bq, int reg, u8 val) +{ + s32 ret; + + ret = i2c_smbus_write_byte_data(bq->client, reg, val); + if (ret < 0) { + pr_err("i2c write fail: can't write 0x%02X to reg 0x%02X: %d\n", + val, reg, ret); + return ret; + } + return 0; +} + +static int bq2560x_read_byte(struct bq2560x *bq, u8 *data, u8 reg) +{ + int ret; + + if (bq->skip_reads) { + *data = 0; + return 0; + } + + mutex_lock(&bq->i2c_rw_lock); + ret = __bq2560x_read_reg(bq, reg, data); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + + +static int bq2560x_write_byte(struct bq2560x *bq, u8 reg, u8 data) +{ + int ret; + + if (bq->skip_writes) { + return 0; + } + + mutex_lock(&bq->i2c_rw_lock); + ret = __bq2560x_write_reg(bq, reg, data); + mutex_unlock(&bq->i2c_rw_lock); + + if (ret) { + pr_err("Failed: reg=%02X, ret=%d\n", reg, ret); + } + + return ret; +} + + +static int bq2560x_update_bits(struct bq2560x *bq, u8 reg, + u8 mask, u8 data) +{ + int ret; + u8 tmp; + + + if (bq->skip_reads || bq->skip_writes) + return 0; + + mutex_lock(&bq->i2c_rw_lock); + ret = __bq2560x_read_reg(bq, reg, &tmp); + if (ret) { + pr_err("Failed: reg=%02X, ret=%d\n", reg, ret); + goto out; + } + + tmp &= ~mask; + tmp |= data & mask; + + ret = __bq2560x_write_reg(bq, reg, tmp); + if (ret) { + pr_err("Failed: reg=%02X, ret=%d\n", reg, ret); + } + +out: + mutex_unlock(&bq->i2c_rw_lock); + return ret; +} +static void bq2560x_stay_awake(struct bq2560x_wakeup_source *source, + enum wakeup_src wk_src) +{ + unsigned long flags; + + spin_lock_irqsave(&source->ws_lock, flags); + + if (!__test_and_set_bit(wk_src, &source->enabled_bitmap)) { + __pm_stay_awake(&source->source); + pr_debug("enabled source %s, wakeup_src %d\n", + source->source.name, wk_src); + } + spin_unlock_irqrestore(&source->ws_lock, flags); +} + +static void bq2560x_relax(struct bq2560x_wakeup_source *source, + enum wakeup_src wk_src) +{ + unsigned long flags; + + spin_lock_irqsave(&source->ws_lock, flags); + if (__test_and_clear_bit(wk_src, &source->enabled_bitmap) && + !(source->enabled_bitmap & WAKEUP_SRC_MASK)) { + __pm_relax(&source->source); + pr_debug("disabled source %s\n", source->source.name); + } + spin_unlock_irqrestore(&source->ws_lock, flags); + + pr_debug("relax source %s, wakeup_src %d\n", + source->source.name, wk_src); +} + +static void bq2560x_wakeup_src_init(struct bq2560x *bq) +{ + spin_lock_init(&bq->bq2560x_ws.ws_lock); + wakeup_source_init(&bq->bq2560x_ws.source, "bq2560x"); +} + + + +static int bq2560x_enable_otg(struct bq2560x *bq) +{ + u8 val = REG01_OTG_ENABLE << REG01_OTG_CONFIG_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_01, + REG01_OTG_CONFIG_MASK, val); + +} + +static int bq2560x_disable_otg(struct bq2560x *bq) +{ + u8 val = REG01_OTG_DISABLE << REG01_OTG_CONFIG_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_01, + REG01_OTG_CONFIG_MASK, val); + +} + +static int bq2560x_enable_charger(struct bq2560x *bq) +{ + int ret; + u8 val = REG01_CHG_ENABLE << REG01_CHG_CONFIG_SHIFT; + + ret = bq2560x_update_bits(bq, BQ2560X_REG_01, REG01_CHG_CONFIG_MASK, val); + + return ret; +} + +static int bq2560x_disable_charger(struct bq2560x *bq) +{ + int ret; + u8 val = REG01_CHG_DISABLE << REG01_CHG_CONFIG_SHIFT; + + ret = bq2560x_update_bits(bq, BQ2560X_REG_01, REG01_CHG_CONFIG_MASK, val); + return ret; +} + +int bq2560x_set_chargecurrent(struct bq2560x *bq, int curr) +{ + u8 ichg; + + ichg = (curr - REG02_ICHG_BASE)/REG02_ICHG_LSB; + return bq2560x_update_bits(bq, BQ2560X_REG_02, REG02_ICHG_MASK, + ichg << REG02_ICHG_SHIFT); + +} + +int bq2560x_set_term_current(struct bq2560x *bq, int curr) +{ + u8 iterm; + + iterm = (curr - REG03_ITERM_BASE) / REG03_ITERM_LSB; + + return bq2560x_update_bits(bq, BQ2560X_REG_03, REG03_ITERM_MASK, + iterm << REG03_ITERM_SHIFT); +} + + +int bq2560x_set_prechg_current(struct bq2560x *bq, int curr) +{ + u8 iprechg; + + iprechg = (curr - REG03_IPRECHG_BASE) / REG03_IPRECHG_LSB; + + return bq2560x_update_bits(bq, BQ2560X_REG_03, REG03_IPRECHG_MASK, + iprechg << REG03_IPRECHG_SHIFT); +} + +int bq2560x_set_chargevolt(struct bq2560x *bq, int volt) +{ + u8 val; + + val = (volt - REG04_VREG_BASE)/REG04_VREG_LSB; + return bq2560x_update_bits(bq, BQ2560X_REG_04, REG04_VREG_MASK, + val << REG04_VREG_SHIFT); +} + + +int bq2560x_set_input_volt_limit(struct bq2560x *bq, int volt) +{ + u8 val; + val = (volt - REG06_VINDPM_BASE) / REG06_VINDPM_LSB; + return bq2560x_update_bits(bq, BQ2560X_REG_06, REG06_VINDPM_MASK, + val << REG06_VINDPM_SHIFT); +} + +int bq2560x_set_input_current_limit(struct bq2560x *bq, int curr) +{ + u8 val; + + val = (curr - REG00_IINLIM_BASE) / REG00_IINLIM_LSB; + return bq2560x_update_bits(bq, BQ2560X_REG_00, REG00_IINLIM_MASK, + val << REG00_IINLIM_SHIFT); +} + + +int bq2560x_set_watchdog_timer(struct bq2560x *bq, u8 timeout) +{ + u8 temp; + + temp = (u8)(((timeout - REG05_WDT_BASE) / REG05_WDT_LSB) << REG05_WDT_SHIFT); + + return bq2560x_update_bits(bq, BQ2560X_REG_05, REG05_WDT_MASK, temp); +} +EXPORT_SYMBOL_GPL(bq2560x_set_watchdog_timer); + +int bq2560x_disable_watchdog_timer(struct bq2560x *bq) +{ + u8 val = REG05_WDT_DISABLE << REG05_WDT_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_05, REG05_WDT_MASK, val); +} +EXPORT_SYMBOL_GPL(bq2560x_disable_watchdog_timer); + +int bq2560x_reset_watchdog_timer(struct bq2560x *bq) +{ + u8 val = REG01_WDT_RESET << REG01_WDT_RESET_SHIFT; + + pr_err("bq2560x_reset_watchdog_timer\n"); + return bq2560x_update_bits(bq, BQ2560X_REG_01, REG01_WDT_RESET_MASK, val); +} +EXPORT_SYMBOL_GPL(bq2560x_reset_watchdog_timer); + +int bq2560x_reset_chip(struct bq2560x *bq) +{ + int ret; + u8 val = REG0B_REG_RESET << REG0B_REG_RESET_SHIFT; + + ret = bq2560x_update_bits(bq, BQ2560X_REG_0B, REG0B_REG_RESET_MASK, val); + return ret; +} +EXPORT_SYMBOL_GPL(bq2560x_reset_chip); + +int bq2560x_enter_hiz_mode(struct bq2560x *bq) +{ + u8 val = REG00_HIZ_ENABLE << REG00_ENHIZ_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_00, REG00_ENHIZ_MASK, val); + +} +EXPORT_SYMBOL_GPL(bq2560x_enter_hiz_mode); + +int bq2560x_exit_hiz_mode(struct bq2560x *bq) +{ + + u8 val = REG00_HIZ_DISABLE << REG00_ENHIZ_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_00, REG00_ENHIZ_MASK, val); + +} +EXPORT_SYMBOL_GPL(bq2560x_exit_hiz_mode); + +int bq2560x_get_hiz_mode(struct bq2560x *bq, u8 *state) +{ + u8 val; + int ret; + + ret = bq2560x_read_byte(bq, &val, BQ2560X_REG_00); + if (ret) + return ret; + *state = (val & REG00_ENHIZ_MASK) >> REG00_ENHIZ_SHIFT; + + return 0; +} +EXPORT_SYMBOL_GPL(bq2560x_get_hiz_mode); + + +static int bq2560x_enable_term(struct bq2560x *bq, bool enable) +{ + u8 val; + int ret; + + if (enable) + val = REG05_TERM_ENABLE << REG05_EN_TERM_SHIFT; + else + val = REG05_TERM_DISABLE << REG05_EN_TERM_SHIFT; + + ret = bq2560x_update_bits(bq, BQ2560X_REG_05, REG05_EN_TERM_MASK, val); + + return ret; +} +EXPORT_SYMBOL_GPL(bq2560x_enable_term); + +int bq2560x_set_boost_current(struct bq2560x *bq, int curr) +{ + u8 val; + + val = REG02_BOOST_LIM_0P5A; + if (curr == BOOSTI_1200) + val = REG02_BOOST_LIM_1P2A; + + return bq2560x_update_bits(bq, BQ2560X_REG_02, REG02_BOOST_LIM_MASK, + val << REG02_BOOST_LIM_SHIFT); +} + +int bq2560x_set_boost_voltage(struct bq2560x *bq, int volt) +{ + u8 val; + + if (volt == BOOSTV_4850) + val = REG06_BOOSTV_4P85V; + else if (volt == BOOSTV_5150) + val = REG06_BOOSTV_5P15V; + else if (volt == BOOSTV_5300) + val = REG06_BOOSTV_5P3V; + else + val = REG06_BOOSTV_5V; + + return bq2560x_update_bits(bq, BQ2560X_REG_06, REG06_BOOSTV_MASK, + val << REG06_BOOSTV_SHIFT); +} + +static int bq2560x_set_acovp_threshold(struct bq2560x *bq, int volt) +{ + u8 val; + + if (volt == VAC_OVP_14300) + val = REG06_OVP_14P3V; + else if (volt == VAC_OVP_10500) + val = REG06_OVP_10P5V; + else if (volt == VAC_OVP_6500) + val = REG06_OVP_6P5V; + else + val = REG06_OVP_5P5V; + + return bq2560x_update_bits(bq, BQ2560X_REG_06, REG06_OVP_MASK, + val << REG06_OVP_SHIFT); +} + + +static int bq2560x_set_stat_ctrl(struct bq2560x *bq, int ctrl) +{ + u8 val; + + val = ctrl; + + return bq2560x_update_bits(bq, BQ2560X_REG_00, REG00_STAT_CTRL_MASK, + val << REG00_STAT_CTRL_SHIFT); +} + + +static int bq2560x_set_int_mask(struct bq2560x *bq, int mask) +{ + u8 val; + + val = mask; + + return bq2560x_update_bits(bq, BQ2560X_REG_0A, REG0A_INT_MASK_MASK, + val << REG0A_INT_MASK_SHIFT); +} + + +static int bq2560x_enable_batfet(struct bq2560x *bq) +{ + const u8 val = REG07_BATFET_ON << REG07_BATFET_DIS_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_07, REG07_BATFET_DIS_MASK, + val); +} +EXPORT_SYMBOL_GPL(bq2560x_enable_batfet); + + +static int bq2560x_disable_batfet(struct bq2560x *bq) +{ + const u8 val = REG07_BATFET_OFF << REG07_BATFET_DIS_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_07, REG07_BATFET_DIS_MASK, + val); +} +EXPORT_SYMBOL_GPL(bq2560x_disable_batfet); + +static int bq2560x_set_batfet_delay(struct bq2560x *bq, uint8_t delay) +{ + u8 val; + + if (delay == 0) + val = REG07_BATFET_DLY_0S; + else + val = REG07_BATFET_DLY_10S; + + val <<= REG07_BATFET_DLY_SHIFT; + + return bq2560x_update_bits(bq, BQ2560X_REG_07, REG07_BATFET_DLY_MASK, + val); +} +EXPORT_SYMBOL_GPL(bq2560x_set_batfet_delay); + +static int bq2560x_charging_disable(struct bq2560x *bq, int reason, + int disable) +{ + + int ret = 0; + int disabled; + + mutex_lock(&bq->charging_disable_lock); + + disabled = bq->charging_disabled_status; + + pr_err("reason=%d requested_disable=%d disabled_status=%d\n", + reason, disable, disabled); + + if (disable == true) + disabled |= reason; + else + disabled &= ~reason; + + if (disabled && bq->charge_enabled) + ret = bq2560x_disable_charger(bq); + else if (!disabled && !bq->charge_enabled) + ret = bq2560x_enable_charger(bq); + + if (ret) { + pr_err("Couldn't disable/enable charging for reason=%d ret=%d\n", + ret, reason); + } else { + bq->charging_disabled_status = disabled; + mutex_lock(&bq->data_lock); + bq->charge_enabled = !disabled; + mutex_unlock(&bq->data_lock); + } + mutex_unlock(&bq->charging_disable_lock); + + return ret; +} + + +static struct power_supply *get_bms_psy(struct bq2560x *bq) +{ + if (bq->bms_psy) + return bq->bms_psy; + bq->bms_psy = power_supply_get_by_name("bms"); + if (!bq->bms_psy) + pr_debug("bms power supply not found\n"); + + return bq->bms_psy; +} + +static int bq2560x_get_batt_property(struct bq2560x *bq, + enum power_supply_property psp, + union power_supply_propval *val) +{ + struct power_supply *bms_psy = get_bms_psy(bq); + + int ret; + + if (!bms_psy) + return -EINVAL; + + ret = bms_psy->get_property(bms_psy, psp, val); + + return ret; +} + +static inline bool is_device_suspended(struct bq2560x *bq); +static int bq2560x_get_prop_charge_type(struct bq2560x *bq) +{ + u8 val = 0; + if (is_device_suspended(bq)) + return POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; + + bq2560x_read_byte(bq, &val, BQ2560X_REG_08); + val &= REG08_CHRG_STAT_MASK; + val >>= REG08_CHRG_STAT_SHIFT; + switch (val) { + case CHARGE_STATE_FASTCHG: + return POWER_SUPPLY_CHARGE_TYPE_FAST; + case CHARGE_STATE_PRECHG: + return POWER_SUPPLY_CHARGE_TYPE_TRICKLE; + case CHARGE_STATE_CHGDONE: + case CHARGE_STATE_IDLE: + return POWER_SUPPLY_CHARGE_TYPE_NONE; + default: + return POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; + } +} + +static int bq2560x_get_prop_batt_present(struct bq2560x *bq) +{ + union power_supply_propval batt_prop = {0,}; + int ret; + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_PRESENT, &batt_prop); + if (!ret) { + mutex_lock(&bq->data_lock); + bq->batt_present = batt_prop.intval; + mutex_unlock(&bq->data_lock); + } + return ret; + +} + +static int bq2560x_get_prop_batt_capacity(struct bq2560x *bq) +{ + union power_supply_propval batt_prop = {0,}; + int ret; + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_CAPACITY, &batt_prop); + + if (!ret) + bq->batt_capacity = batt_prop.intval; + + return ret; + +} + + +static int bq2560x_get_prop_batt_full(struct bq2560x *bq) +{ + union power_supply_propval batt_prop = {0,}; + int ret; + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_STATUS, &batt_prop); + if (!ret) { + mutex_lock(&bq->data_lock); + bq->batt_full = (batt_prop.intval == POWER_SUPPLY_STATUS_FULL); + mutex_unlock(&bq->data_lock); + } + return ret; +} + +static int bq2560x_get_prop_charge_status(struct bq2560x *bq) +{ + union power_supply_propval batt_prop = {0,}; + int ret; + u8 status; + + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_08); + if (ret) { + return POWER_SUPPLY_STATUS_UNKNOWN; + } + + mutex_lock(&bq->data_lock); + bq->charge_state = (status & REG08_CHRG_STAT_MASK) >> REG08_CHRG_STAT_SHIFT; + mutex_unlock(&bq->data_lock); + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_STATUS, &batt_prop); + if (!ret && ((batt_prop.intval == POWER_SUPPLY_STATUS_FULL) || + (bq->jeita_active && (bq->charge_state == CHARGE_STATE_CHGDONE)))) + return POWER_SUPPLY_STATUS_FULL; + + + switch (bq->charge_state) { + case CHARGE_STATE_FASTCHG: + case CHARGE_STATE_PRECHG: + return POWER_SUPPLY_STATUS_CHARGING; + case CHARGE_STATE_CHGDONE: + return POWER_SUPPLY_STATUS_NOT_CHARGING; + case CHARGE_STATE_IDLE: + return POWER_SUPPLY_STATUS_DISCHARGING; + default: + return POWER_SUPPLY_STATUS_UNKNOWN; + } + +} + +static int bq2560x_get_prop_health(struct bq2560x *bq) +{ + int ret; + union power_supply_propval batt_prop = {0,}; + + if (bq->software_jeita_supported) { + if (bq->jeita_active) { + if (bq->batt_hot) + ret = POWER_SUPPLY_HEALTH_OVERHEAT; + else if (bq->batt_warm) + ret = POWER_SUPPLY_HEALTH_WARM; + else if (bq->batt_cool) + ret = POWER_SUPPLY_HEALTH_COOL; + else if (bq->batt_cold) + ret = POWER_SUPPLY_HEALTH_COLD; + } else { + ret = POWER_SUPPLY_HEALTH_GOOD; + } + } else {/* get health status from gauge */ + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_HEALTH, &batt_prop); + if (!ret) + ret = batt_prop.intval; + else + ret = POWER_SUPPLY_HEALTH_UNKNOWN; + } + return ret; +} + + +static enum power_supply_property bq2560x_charger_props[] = { + + POWER_SUPPLY_PROP_CHARGE_TYPE, + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_CHARGING_ENABLED, + POWER_SUPPLY_PROP_CHARGING_CALL_STATE, + POWER_SUPPLY_PROP_HEALTH, + POWER_SUPPLY_PROP_CAPACITY, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CURRENT_NOW, + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, + + POWER_SUPPLY_PROP_CAPACITY_LEVEL, + POWER_SUPPLY_PROP_TEMP, + + POWER_SUPPLY_PROP_CHARGE_FULL, + + + + POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL, + POWER_SUPPLY_PROP_TECHNOLOGY, + POWER_SUPPLY_PROP_RESISTANCE_ID, +}; + +void static runin_work(struct bq2560x *bq, int runin_flag) +{ + int rc; + + if (1 == runin_flag) { + pr_err("bq2560x_enter_hiz_mode, bq->usb_present = %d\n", bq->usb_present); + rc = bq2560x_enter_hiz_mode(bq); + if (rc) { + dev_err(bq->dev, "Couldn't disenable charge rc=%d\n", rc); + } + } else if (2 == runin_flag) { + pr_err("bq2560x_exit_hiz_mode, bq->usb_present = %d\n", bq->usb_present); + rc = bq2560x_exit_hiz_mode(bq); + if (rc) { + dev_err(bq->dev, "Couldn't enable charge rc=%d\n", rc); + } + } +} + + +static int bq2560x_charger_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) +{ + + struct bq2560x *bq = container_of(psy, struct bq2560x, batt_psy); + + switch (psp) { + case POWER_SUPPLY_PROP_CHARGE_TYPE: + val->intval = bq2560x_get_prop_charge_type(bq); + pr_debug("POWER_SUPPLY_PROP_CHARGE_TYPE:%d\n", val->intval); + break; + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: + val->intval = bq->call_state; + break; + case POWER_SUPPLY_PROP_CHARGING_ENABLED: + val->intval = bq->charge_enabled; + break; + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + val->intval = 3000; + break; + case POWER_SUPPLY_PROP_STATUS: + val->intval = bq2560x_get_prop_charge_status(bq); + break; + case POWER_SUPPLY_PROP_HEALTH: + val->intval = bq2560x_get_prop_health(bq); + break; + case POWER_SUPPLY_PROP_CAPACITY: + bq2560x_get_batt_property(bq, psp, val); + bq2560x_battery_capacity = val->intval; + + break; + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: + val->intval = bq->therm_lvl_sel; + break; + case POWER_SUPPLY_PROP_PRESENT: + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + case POWER_SUPPLY_PROP_CURRENT_NOW: + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + case POWER_SUPPLY_PROP_TEMP: + case POWER_SUPPLY_PROP_CHARGE_FULL: + case POWER_SUPPLY_PROP_TECHNOLOGY: + case POWER_SUPPLY_PROP_RESISTANCE_ID: + return bq2560x_get_batt_property(bq, psp, val); + default: + return -EINVAL; + + } + + return 0; +} + +static int bq2560x_system_temp_level_set(struct bq2560x *bq, int); +static int bq2560x_update_charging_profile(struct bq2560x *bq); +extern int bq_runin_test; +static int bq2560x_charger_set_property(struct power_supply *psy, + enum power_supply_property prop, + const union power_supply_propval *val) +{ + struct bq2560x *bq = container_of(psy, + struct bq2560x, batt_psy); + + switch (prop) { + case POWER_SUPPLY_PROP_CHARGING_ENABLED: + bq2560x_charging_disable(bq, USER, !val->intval); + + if (bq_runin_test) { + pr_err("bq_runin_test\n"); + runin_work(bq, bq_runin_test); + bq_runin_test = 0; + } + + power_supply_changed(&bq->batt_psy); + power_supply_changed(bq->usb_psy); + pr_info("POWER_SUPPLY_PROP_CHARGING_ENABLED: %s\n", + val->intval ? "enable" : "disable"); + break; + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: + bq2560x_system_temp_level_set(bq, val->intval); + break; + + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: + bq->call_state = val->intval; + bq2560x_update_charging_profile(bq); + break; + + default: + return -EINVAL; + } + + return 0; +} + +static int bq2560x_charger_is_writeable(struct power_supply *psy, + enum power_supply_property prop) +{ + int ret; + + switch (prop) { + case POWER_SUPPLY_PROP_CHARGING_ENABLED: + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: + ret = 1; + break; + default: + ret = 0; + break; + } + return ret; +} + +#define calling_current_max 700 +static int bq2560x_update_charging_profile(struct bq2560x *bq) +{ + int ret; + int chg_ma; + int chg_mv; + int icl; + int therm_ma; + + union power_supply_propval prop = {0,}; + + + if (!bq->usb_present) + return 0; + + ret = bq->usb_psy->get_property(bq->usb_psy, + POWER_SUPPLY_PROP_TYPE, &prop); + + if (ret < 0) { + pr_err("couldn't read USB TYPE property, ret=%d\n", ret); + return ret; + } + + mutex_lock(&bq->profile_change_lock); + if (bq->jeita_active) { + chg_ma = bq->jeita_ma; + chg_mv = bq->jeita_mv; + } else { + if (prop.intval == POWER_SUPPLY_TYPE_USB_DCP || prop.intval == POWER_SUPPLY_TYPE_USB_CDP) { + chg_ma = bq->platform_data->ta.ichg; + chg_mv = bq->platform_data->ta.vreg; + } else { + chg_ma = bq->platform_data->usb.ichg; + chg_mv = bq->platform_data->usb.vreg; + } + } + + icl = bq->usb_psy_ma; + if (bq->therm_lvl_sel > 0 + && bq->therm_lvl_sel < (bq->thermal_levels - 1)) + /* + * consider thermal limit only when it is active and not at + * the highest level + */ + therm_ma = bq->thermal_mitigation[bq->therm_lvl_sel]; + else + therm_ma = bq->usb_psy_ma; + + icl = min(therm_ma, icl); + + + if (bq->call_state == 0) { + if (prop.intval == POWER_SUPPLY_TYPE_USB_DCP || prop.intval == POWER_SUPPLY_TYPE_USB_CDP) { + if (bq->jeita_active) { + icl = bq->jeita_ma; + } else{ + icl = calling_current_max; + } + } else{ + icl = bq->platform_data->usb.ichg; + } + pr_err("bq2560x_set_calling_current to =%d\n", icl); + } + + + pr_info("charge volt = %d, charge curr = %d, input curr limit = %d\n", + chg_mv, chg_ma, icl); + + ret = bq2560x_set_input_current_limit(bq, icl); + if (ret < 0) + pr_err("couldn't set input current limit, ret=%d\n", ret); + + ret = bq2560x_set_input_volt_limit(bq, bq->platform_data->ta.vlim); + if (ret < 0) + pr_err("couldn't set input voltage limit, ret=%d\n", ret); + +#ifdef CONFIG_DISABLE_TEMP_PROTECT + chg_mv = 4100; +#endif + + ret = bq2560x_set_chargevolt(bq, chg_mv); + if (ret < 0) + pr_err("couldn't set charge voltage ret=%d\n", ret); + + ret = bq2560x_set_chargecurrent(bq, chg_ma); + if (ret < 0) + pr_err("couldn't set charge current, ret=%d\n", ret); + + mutex_unlock(&bq->profile_change_lock); + + return 0; +} + + +static int bq2560x_system_temp_level_set(struct bq2560x *bq, + int lvl_sel) +{ + int ret = 0; + int prev_therm_lvl; + + pr_err("%s lvl_sel=%d, bq->therm_lvl_sel = %d\n", __func__, lvl_sel, bq->therm_lvl_sel); + if (BatteryTestStatus_enable) + return 0; + + if (!bq->thermal_mitigation) { + pr_err("Thermal mitigation not supported\n"); + return -EINVAL; + } + + if (lvl_sel < 0) { + pr_err("Unsupported level selected %d\n", lvl_sel); + return -EINVAL; + } + + if (lvl_sel >= bq->thermal_levels) { + pr_err("Unsupported level selected %d forcing %d\n", lvl_sel, + bq->thermal_levels - 1); + lvl_sel = bq->thermal_levels - 1; + } + + if (lvl_sel == bq->therm_lvl_sel) + return 0; + + + prev_therm_lvl = bq->therm_lvl_sel; + bq->therm_lvl_sel = lvl_sel; + + ret = bq2560x_update_charging_profile(bq); + if (ret) + pr_err("Couldn't set USB current ret = %d\n", ret); + + + return ret; +} + +static void bq2560x_factory_mode_control_capacity_work(struct bq2560x *bq) +{ +#ifdef WT_COMPILE_FACTORY_VERSION + int ret; + + pr_err("bq2560x_factory_mode_control_capacity_work\n"); + if (bq2560x_battery_capacity >= 80 && bq2560x_battery_capacity <= 100) { + ret = bq2560x_charging_disable(bq, SOC, true); + if (ret) { + dev_err(bq->dev, "factory_mode_control_capacity disable fail: %d\n", ret); + } + } else if (bq2560x_battery_capacity >= 0 && bq2560x_battery_capacity < 80) { + ret = bq2560x_charging_disable(bq, SOC, false); + if (ret) { + dev_err(bq->dev, "actory_mode_control_capacity enable fail: %d\n", ret); + } + } + +#endif + +} + +static int pc_suspend; +static void bq2560x_external_power_changed(struct power_supply *psy) +{ + struct bq2560x *bq = container_of(psy, struct bq2560x, batt_psy); + + union power_supply_propval prop = {0,}; + int ret, current_limit = 0; + + + ret = bq->usb_psy->get_property(bq->usb_psy, + POWER_SUPPLY_PROP_CURRENT_MAX, &prop); + if (ret < 0) + pr_err("could not read USB current_max property, ret=%d\n", ret); + else + current_limit = prop.intval / 1000; + + pr_info("current_limit = %d\n", current_limit); + + if (bq->usb_psy_ma != current_limit) { + bq->usb_psy_ma = current_limit; + bq2560x_update_charging_profile(bq); + if (current_limit <= 2) { + pc_suspend = 1; + bq2560x_charging_disable(bq, CURRENT, 1); + } else{ + pc_suspend = 0; + bq2560x_charging_disable(bq, CURRENT, 0); + } + } + + ret = bq->usb_psy->get_property(bq->usb_psy, + POWER_SUPPLY_PROP_ONLINE, &prop); + if (ret < 0) + pr_err("could not read USB ONLINE property, ret=%d\n", ret); + else + pr_info("usb online status =%d\n", prop.intval); + + ret = 0; + bq2560x_get_prop_charge_status(bq); + if (bq->usb_present && !pc_suspend/*&& bq->charge_state != CHARGE_STATE_IDLE*//* && bq->charge_enabled *//*!bq->charging_disabled_status*/ + /*&& bq->usb_psy_ma != 0*/) { + if (prop.intval == 0) { + pr_err("set usb online\n"); + ret = power_supply_set_online(bq->usb_psy, true); + } + } else { + if (prop.intval == 1) { + pr_err("set usb offline\n"); + ret = power_supply_set_online(bq->usb_psy, false); + } + } + + if (ret < 0) + pr_info("could not set usb online state, ret=%d\n", ret); +} + + +static int bq2560x_psy_register(struct bq2560x *bq) +{ + int ret; + + bq->batt_psy.name = "battery"; + bq->batt_psy.type = POWER_SUPPLY_TYPE_BATTERY; + bq->batt_psy.properties = bq2560x_charger_props; + bq->batt_psy.num_properties = ARRAY_SIZE(bq2560x_charger_props); + bq->batt_psy.get_property = bq2560x_charger_get_property; + bq->batt_psy.set_property = bq2560x_charger_set_property; + bq->batt_psy.external_power_changed = bq2560x_external_power_changed; + bq->batt_psy.property_is_writeable = bq2560x_charger_is_writeable; + + ret = power_supply_register(bq->dev, &bq->batt_psy); + if (ret < 0) { + pr_err("failed to register batt_psy:%d\n", ret); + return ret; + } + + return 0; +} + +static void bq2560x_psy_unregister(struct bq2560x *bq) +{ + power_supply_unregister(&bq->batt_psy); +} + + +static int bq2560x_otg_regulator_enable(struct regulator_dev *rdev) +{ + int ret; + struct bq2560x *bq = rdev_get_drvdata(rdev); + + ret = bq2560x_enable_otg(bq); + if (ret) { + pr_err("Couldn't enable OTG mode ret=%d\n", ret); + } else { + bq->otg_enabled = true; + pr_info("bq2560x OTG mode Enabled!\n"); + } + + return ret; +} + + +static int bq2560x_otg_regulator_disable(struct regulator_dev *rdev) +{ + int ret; + struct bq2560x *bq = rdev_get_drvdata(rdev); + + ret = bq2560x_disable_otg(bq); + if (ret) { + pr_err("Couldn't disable OTG mode, ret=%d\n", ret); + } else { + bq->otg_enabled = false; + pr_info("bq2560x OTG mode Disabled\n"); + } + + return ret; +} + + +static int bq2560x_otg_regulator_is_enable(struct regulator_dev *rdev) +{ + int ret; + u8 status; + u8 enabled; + struct bq2560x *bq = rdev_get_drvdata(rdev); + + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_01); + if (ret) + return ret; + enabled = ((status & REG01_OTG_CONFIG_MASK) >> REG01_OTG_CONFIG_SHIFT); + + return (enabled == REG01_OTG_ENABLE) ? 1 : 0; + +} + + +struct regulator_ops bq2560x_otg_reg_ops = { + .enable = bq2560x_otg_regulator_enable, + .disable = bq2560x_otg_regulator_disable, + .is_enabled = bq2560x_otg_regulator_is_enable, +}; + +static int bq2560x_regulator_init(struct bq2560x *bq) +{ + int ret = 0; + struct regulator_init_data *init_data; + struct regulator_config cfg = {}; + + init_data = of_get_regulator_init_data(bq->dev, bq->dev->of_node); + if (!init_data) { + dev_err(bq->dev, "Unable to allocate memory\n"); + return -ENOMEM; + } + + if (init_data->constraints.name) { + bq->otg_vreg.rdesc.owner = THIS_MODULE; + bq->otg_vreg.rdesc.type = REGULATOR_VOLTAGE; + bq->otg_vreg.rdesc.ops = &bq2560x_otg_reg_ops; + bq->otg_vreg.rdesc.name = init_data->constraints.name; + pr_info("regualtor name = %s\n", bq->otg_vreg.rdesc.name); + + cfg.dev = bq->dev; + cfg.init_data = init_data; + cfg.driver_data = bq; + cfg.of_node = bq->dev->of_node; + + init_data->constraints.valid_ops_mask + |= REGULATOR_CHANGE_STATUS; + + bq->otg_vreg.rdev = regulator_register( + &bq->otg_vreg.rdesc, &cfg); + if (IS_ERR(bq->otg_vreg.rdev)) { + ret = PTR_ERR(bq->otg_vreg.rdev); + bq->otg_vreg.rdev = NULL; + if (ret != -EPROBE_DEFER) + dev_err(bq->dev, + "OTG reg failed, rc=%d\n", ret); + } + } + + return ret; +} + + +static int bq2560x_parse_jeita_dt(struct device *dev, struct bq2560x *bq) +{ + struct device_node *np = dev->of_node; + int ret; + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-hot-degc", + &bq->batt_hot_degc); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-hot-degc\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-warm-degc", + &bq->batt_warm_degc); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-warm-degc\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cool-normal-degc", + &bq->batt_cool_normal_degc); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cool-normal-degc\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cold-cool-degc", + &bq->batt_cold_cool_degc); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cold-cool-degc\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cold-degc", + &bq->batt_cold_degc); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cold-degc\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-hot-hysteresis", + &bq->hot_temp_hysteresis); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-hot-hysteresis\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cold-hysteresis", + &bq->cold_temp_hysteresis); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cold-hysteresis\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cold-cool-ma", + &bq->batt_cold_cool_ma); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cold-cool-ma\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cool-normal-ma", + &bq->batt_cool_normal_ma); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cool-normal-ma\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-cool-mv", + &bq->batt_cool_mv); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-cool-mv\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-warm-ma", + &bq->batt_warm_ma); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-warm-ma\n"); + return ret; + } + + ret = of_property_read_u32(np, "ti,bq2560x,jeita-warm-mv", + &bq->batt_warm_mv); + if (ret) { + pr_err("Failed to read ti,bq2560x,jeita-warm-mv\n"); + return ret; + } + + bq->software_jeita_supported = + of_property_read_bool(np, "ti,bq2560x,software-jeita-supported"); + + return 0; +} + + +static struct bq2560x_platform_data *bq2560x_parse_dt(struct device *dev, + struct bq2560x *bq) +{ + int ret; + struct device_node *np = dev->of_node; + struct bq2560x_platform_data *pdata; + + pdata = devm_kzalloc(dev, sizeof(struct bq2560x_platform_data), + GFP_KERNEL); + if (!pdata) { + pr_err("Out of memory\n"); + return NULL; + } + + bq->call_state = 1; + ret = of_property_read_u32(np, "ti,bq2560x,chip-enable-gpio", &bq->gpio_ce); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,chip-enable-gpio\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,usb-vlim", &pdata->usb.vlim); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,usb-vlim\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,usb-ilim", &pdata->usb.ilim); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,usb-ilim\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,usb-vreg", &pdata->usb.vreg); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,usb-vreg\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,usb-ichg", &pdata->usb.ichg); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,usb-ichg\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,ta-vlim", &pdata->ta.vlim); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,ta-vlim\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,ta-ilim", &pdata->ta.ilim); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,ta-ilim\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,ta-vreg", &pdata->ta.vreg); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,ta-vreg\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,ta-ichg", &pdata->ta.ichg); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,ta-ichg\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,stat-pin-ctrl", &pdata->statctrl); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,stat-pin-ctrl\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,precharge-current", &pdata->iprechg); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,precharge-current\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,termination-current", &pdata->iterm); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,termination-current\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,boost-voltage", &pdata->boostv); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,boost-voltage\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,boost-current", &pdata->boosti); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,boost-current\n"); + } + + ret = of_property_read_u32(np, "ti,bq2560x,vac-ovp-threshold", &pdata->vac_ovp); + if (ret) { + pr_err("Failed to read node of ti,bq2560x,vac-ovp-threshold\n"); + } + + if (of_find_property(np, "qcom,thermal-mitigation", + &bq->thermal_levels)) { + bq->thermal_mitigation = devm_kzalloc(bq->dev, + bq->thermal_levels, + GFP_KERNEL); + + if (bq->thermal_mitigation == NULL) { + pr_err("thermal mitigation kzalloc() failed.\n"); + + } + + bq->thermal_levels /= sizeof(int); + ret = of_property_read_u32_array(np, + "qcom,thermal-mitigation", + bq->thermal_mitigation, bq->thermal_levels); + if (ret) { + pr_err("Couldn't read thermal limits ret = %d\n", ret); + + } + } + + + return pdata; +} + + +static void bq2560x_init_jeita(struct bq2560x *bq) +{ + + bq->batt_temp = -EINVAL; + + /* set default value in case of dts read fail */ + bq->batt_hot_degc = 600; + bq->batt_warm_degc = 450; + bq->batt_cool_normal_degc = 150; + bq->batt_cold_cool_degc = 50; + bq->batt_cold_degc = 0; + + bq->hot_temp_hysteresis = 50; + bq->cold_temp_hysteresis = 50; + + bq->batt_cold_cool_ma = 300; + bq->batt_cool_normal_ma = 600; + bq->batt_cool_mv = 4100; + bq->batt_warm_ma = 400; + bq->batt_warm_mv = 4100; + + bq->software_jeita_supported = true; + + /* DTS setting will overwrite above default value */ + + bq2560x_parse_jeita_dt(&bq->client->dev, bq); +} + +static int bq2560x_init_device(struct bq2560x *bq) +{ + int ret; + + bq2560x_disable_watchdog_timer(bq); + + bq2560x_enable_batfet(bq); + + ret = bq2560x_set_stat_ctrl(bq, bq->platform_data->statctrl); + if (ret) + pr_err("Failed to set stat pin control mode, ret = %d\n", ret); + + ret = bq2560x_set_prechg_current(bq, bq->platform_data->iprechg); + if (ret) + pr_err("Failed to set prechg current, ret = %d\n", ret); + + ret = bq2560x_set_term_current(bq, bq->platform_data->iterm); + if (ret) + pr_err("Failed to set termination current, ret = %d\n", ret); + + ret = bq2560x_set_boost_voltage(bq, bq->platform_data->boostv); + if (ret) + pr_err("Failed to set boost voltage, ret = %d\n", ret); + + ret = bq2560x_set_boost_current(bq, bq->platform_data->boosti); + if (ret) + pr_err("Failed to set boost current, ret = %d\n", ret); + + ret = bq2560x_set_acovp_threshold(bq, bq->platform_data->vac_ovp); + if (ret) + pr_err("Failed to set acovp threshold, ret = %d\n", ret); + + ret = bq2560x_set_int_mask(bq, REG0A_IINDPM_INT_MASK | REG0A_VINDPM_INT_MASK); + if (ret) + pr_err("Failed to set vindpm and iindpm int mask\n"); + + ret = bq2560x_enable_charger(bq); + if (ret) { + pr_err("Failed to enable charger, ret = %d\n", ret); + } else { + bq->charge_enabled = true; + pr_info("Charger Enabled Successfully!\n"); + } + + return 0; +} + + +static int bq2560x_detect_device(struct bq2560x *bq) +{ + int ret; + u8 data; + + ret = bq2560x_read_byte(bq, &data, BQ2560X_REG_0B); + if (ret == 0) { + bq->part_no = (data & REG0B_PN_MASK) >> REG0B_PN_SHIFT; + bq->revision = (data & REG0B_DEV_REV_MASK) >> REG0B_DEV_REV_SHIFT; + } + + return ret; +} + +static void bq2560x_check_jeita(struct bq2560x *bq) +{ + + int ret; + bool last_hot, last_warm, last_cool, last_cold, last_cool_5; + bool chg_disabled_jeita, jeita_hot_cold; + union power_supply_propval batt_prop = {0,}; + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_TEMP, &batt_prop); + if (!ret) + bq->batt_temp = batt_prop.intval; + + if (bq->batt_temp == -EINVAL) + return; + + last_hot = bq->batt_hot; + last_warm = bq->batt_warm; + last_cool = bq->batt_cool; + last_cold = bq->batt_cold; + last_cool_5 = bq->batt_cool_5; + + if (bq->batt_temp >= bq->batt_hot_degc) {/* HOT */ + if (!bq->batt_hot) { + bq->batt_hot = true; + bq->batt_warm = false; + bq->batt_cool = false; + bq->batt_cold = false; + bq->jeita_ma = 0; + bq->jeita_mv = 0; + } + } else if (bq->batt_temp >= bq->batt_warm_degc) {/* WARM */ + if (!bq->batt_hot || + (bq->batt_temp < bq->batt_hot_degc - bq->hot_temp_hysteresis)) { + bq->batt_hot = false; + bq->batt_warm = true; + bq->batt_cool = false; + bq->batt_cold = false; + bq->jeita_mv = bq->batt_warm_mv; + bq->jeita_ma = bq->batt_warm_ma; + } + } else if (bq->batt_temp < bq->batt_cold_degc) {/* COLD */ + if (!bq->batt_cold) { + bq->batt_hot = false; + bq->batt_warm = false; + bq->batt_cool = false; + bq->batt_cold = true; + bq->jeita_ma = 0; + bq->jeita_mv = 0; + } + } else if (bq->batt_temp < bq->batt_cold_cool_degc) {/* 0 - 5 COOL */ + if (!bq->batt_cold || + (bq->batt_temp > bq->batt_cold_degc + bq->cold_temp_hysteresis)) { + pr_err("bq2560x_check_jeita status cold -> cool\n"); + bq->batt_hot = false; + bq->batt_warm = false; + bq->batt_cool = true; + bq->batt_cold = false; + bq->batt_cool_5 = true; + bq->jeita_mv = bq->batt_cool_mv; + bq->jeita_ma = bq->batt_cold_cool_ma; + } + } else if (bq->batt_temp < bq->batt_cool_normal_degc) {/* 5 - 15 COOL */ + pr_err("bq2560x_check_jeita status cool -> normal\n"); + bq->batt_hot = false; + bq->batt_warm = false; + bq->batt_cool = true; + bq->batt_cold = false; + bq->batt_cool_5 = false; + bq->jeita_mv = bq->batt_cool_mv; + bq->jeita_ma = bq->batt_cool_normal_ma; + } else {/* NORMAL */ + bq->batt_hot = false; + bq->batt_warm = false; + bq->batt_cool = false; + bq->batt_cold = false; + } + + bq->jeita_active = bq->batt_cool || bq->batt_hot || + bq->batt_cold || bq->batt_warm; + + if ((last_cold != bq->batt_cold) || (last_warm != bq->batt_warm) || + (last_cool_5 != bq->batt_cool_5) || (last_cool != bq->batt_cool) || (last_hot != bq->batt_hot)) { + bq2560x_update_charging_profile(bq); + power_supply_changed(&bq->batt_psy); + power_supply_changed(bq->usb_psy); + } else if (bq->batt_hot || bq->batt_cold) { + power_supply_changed(&bq->batt_psy); + power_supply_changed(bq->usb_psy); + } + + + jeita_hot_cold = bq->jeita_active && (bq->batt_hot || bq->batt_cold); + chg_disabled_jeita = !!(bq->charging_disabled_status & JEITA); + if (jeita_hot_cold ^ chg_disabled_jeita) + bq2560x_charging_disable(bq, JEITA, jeita_hot_cold); + +} + +static void bq2560x_check_batt_pres(struct bq2560x *bq) +{ + int ret = 0; + bool chg_disabled_pres; + + ret = bq2560x_get_prop_batt_present(bq); + if (!ret) { + chg_disabled_pres = !!(bq->charging_disabled_status & BATT_PRES); + if (chg_disabled_pres ^ !bq->batt_present) { + ret = bq2560x_charging_disable(bq, BATT_PRES, !bq->batt_present); + if (ret) { + pr_err("failed to %s charging, ret = %d\n", + bq->batt_present ? "disable" : "enable", + ret); + } + power_supply_changed(&bq->batt_psy); + power_supply_changed(bq->usb_psy); + } + } + +} + +static void bq2560x_check_batt_capacity(struct bq2560x *bq) +{ + int ret = 0; + int last_batt_capacity = bq->batt_capacity; + + ret = bq2560x_get_prop_batt_capacity(bq); + if (!ret) { + if (last_batt_capacity != bq->batt_capacity) { + pr_err("Battery capacity changed, new capacity = %d\n", bq->batt_capacity); + power_supply_changed(&bq->batt_psy); + } + } + +} + +static void bq2560x_check_batt_full(struct bq2560x *bq) +{ + int ret = 0; + bool chg_disabled_fc; + + ret = bq2560x_get_prop_batt_full(bq); + if (!ret) { + chg_disabled_fc = !!(bq->charging_disabled_status & BATT_FC); + if (chg_disabled_fc ^ bq->batt_full) { + ret = bq2560x_charging_disable(bq, BATT_FC, bq->batt_full); + if (ret) { + pr_err("failed to %s charging, ret = %d\n", + bq->batt_full ? "disable" : "enable", + ret); + } + power_supply_changed(&bq->batt_psy); + power_supply_changed(bq->usb_psy); + } + } +} + + +static int calculate_jeita_poll_interval(struct bq2560x *bq) +{ + int interval; + + if (bq->batt_hot || bq->batt_cold) + interval = 10; + else if (bq->batt_warm || bq->batt_cool) + interval = 30; + else + interval = 50; + return interval; +} + +static enum alarmtimer_restart bq2560x_jeita_alarm_cb(struct alarm *alarm, + ktime_t now) +{ + struct bq2560x *bq = container_of(alarm, + struct bq2560x, jeita_alarm); + unsigned long ns; + + bq2560x_stay_awake(&bq->bq2560x_ws, WAKEUP_SRC_JEITA); + schedule_delayed_work(&bq->charge_jeita_work, HZ/2); + + ns = calculate_jeita_poll_interval(bq) * 1000000000LL; + alarm_forward_now(alarm, ns_to_ktime(ns)); + return ALARMTIMER_RESTART; +} + +static void bq2560x_charge_jeita_workfunc(struct work_struct *work) +{ + struct bq2560x *bq = container_of(work, + struct bq2560x, charge_jeita_work.work); + + bq2560x_reset_watchdog_timer(bq); + bq2560x_factory_mode_control_capacity_work(bq); + + bq2560x_check_batt_pres(bq); + bq2560x_check_batt_full(bq); + bq2560x_check_batt_capacity(bq); + + bq2560x_dump_fg_reg(bq); + + bq2560x_check_jeita(bq); + bq2560x_relax(&bq->bq2560x_ws, WAKEUP_SRC_JEITA); +} + + +static void bq2560x_discharge_jeita_workfunc(struct work_struct *work) +{ + struct bq2560x *bq = container_of(work, + struct bq2560x, discharge_jeita_work.work); + + bq2560x_check_batt_pres(bq); + bq2560x_check_batt_full(bq); + bq2560x_check_batt_capacity(bq); + + bq2560x_dump_fg_reg(bq); + + bq2560x_check_jeita(bq); + + schedule_delayed_work(&bq->discharge_jeita_work, + calculate_jeita_poll_interval(bq) * HZ); +} + +static const unsigned char *charge_stat_str[] = { + "Not Charging", + "Precharging", + "Fast Charging", + "Charge Done", +}; + +static void bq2560x_dump_status(struct bq2560x *bq) +{ + u8 status; + u8 addr; + int ret; + u8 val; + union power_supply_propval batt_prop = {0,}; + + ret = bq2560x_get_batt_property(bq, + POWER_SUPPLY_PROP_CURRENT_NOW, &batt_prop); + + if (!ret) + pr_err("FG current:%d\n", batt_prop.intval); + + pr_err("bq Reg[0x00 -0x0B] = "); + for (addr = 0x0; addr <= 0x0B; addr++) { + ret = bq2560x_read_byte(bq, &val, addr); + if (!ret) { + printk("0x%02X, ", val); + } else + pr_err("bq Reg red err"); + } + printk("\n"); + + if (!bq->power_good) + pr_info("Power Poor\n"); + if (!bq->vbus_good) + pr_info("Vbus voltage not good!\n"); + if (bq->vindpm_triggered) + pr_info("VINDPM triggered\n"); + if (bq->iindpm_triggered) + pr_info("IINDPM triggered\n"); + if (bq->acov_triggered) + pr_info("ACOV triggered\n"); + + if (bq->fault_status & REG09_FAULT_WDT_MASK) + pr_info("Watchdog timer expired!\n"); + if (bq->fault_status & REG09_FAULT_BOOST_MASK) + pr_info("Boost fault occurred!\n"); + + status = (bq->fault_status & REG09_FAULT_CHRG_MASK) >> REG09_FAULT_CHRG_SHIFT; + if (status == REG09_FAULT_CHRG_INPUT) + pr_info("input fault!\n"); + else if (status == REG09_FAULT_CHRG_THERMAL) + pr_info("charge thermal shutdown fault!\n"); + else if (status == REG09_FAULT_CHRG_TIMER) + pr_info("charge timer expired fault!\n"); + + if (bq->fault_status & REG09_FAULT_BAT_MASK) + pr_info("battery ovp fault!\n"); + + if (!bq->software_jeita_supported) { + status = (bq->fault_status & REG09_FAULT_NTC_MASK) >> REG09_FAULT_NTC_SHIFT; + + if (status == REG09_FAULT_NTC_WARM) + pr_debug("JEITA ACTIVE: WARM\n"); + else if (status == REG09_FAULT_NTC_COOL) + pr_debug("JEITA ACTIVE: COOL\n"); + else if (status == REG09_FAULT_NTC_COLD) + pr_debug("JEITA ACTIVE: COLD\n"); + else if (status == REG09_FAULT_NTC_HOT) + pr_debug("JEITA ACTIVE: HOT!\n"); + } else if (bq->jeita_active) { + if (bq->batt_hot) + pr_debug("JEITA ACTIVE: HOT\n"); + else if (bq->batt_warm) + pr_debug("JEITA ACTIVE: WARM\n"); + else if (bq->batt_cool) + pr_debug("JEITA ACTIVE: COOL\n"); + else if (bq->batt_cold) + pr_debug("JEITA ACTIVE: COLD\n"); + } + + pr_info("%s\n", charge_stat_str[bq->charge_state]); +} + + +static void bq2560x_update_status(struct bq2560x *bq) +{ + u8 status; + int ret; + + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_0A); + if (ret) { + pr_err("failed to read reg0a\n"); + return; + } + + mutex_lock(&bq->data_lock); + bq->vbus_good = !!(status & REG0A_VBUS_GD_MASK); + bq->vindpm_triggered = !!(status & REG0A_VINDPM_STAT_MASK); + bq->iindpm_triggered = !!(status & REG0A_IINDPM_STAT_MASK); + bq->topoff_active = !!(status & REG0A_TOPOFF_ACTIVE_MASK); + bq->acov_triggered = !!(status & REG0A_ACOV_STAT_MASK); + mutex_unlock(&bq->data_lock); + + /* Read twice to get present status */ + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_09); + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_09); + if (ret) + return; + + mutex_lock(&bq->data_lock); + bq->fault_status = status; + mutex_unlock(&bq->data_lock); + +} + + +static irqreturn_t bq2560x_charger_interrupt(int irq, void *dev_id) +{ + struct bq2560x *bq = dev_id; + + u8 status; + int ret; + + mutex_lock(&bq->irq_complete); + bq->irq_waiting = true; + if (!bq->resume_completed) { + dev_dbg(bq->dev, "IRQ triggered before device-resume\n"); + if (!bq->irq_disabled) { + disable_irq_nosync(irq); + bq->irq_disabled = true; + } + mutex_unlock(&bq->irq_complete); + return IRQ_HANDLED; + } + bq->irq_waiting = false; + ret = bq2560x_read_byte(bq, &status, BQ2560X_REG_08); + if (ret) { + mutex_unlock(&bq->irq_complete); + return IRQ_HANDLED; + } + + mutex_lock(&bq->data_lock); + bq->power_good = !!(status & REG08_PG_STAT_MASK); + mutex_unlock(&bq->data_lock); + + if (!bq->power_good) { + if (bq->usb_present) { + bq->usb_present = false; + power_supply_set_present(bq->usb_psy, bq->usb_present); + } + if (bq->software_jeita_supported) { + alarm_try_to_cancel(&bq->jeita_alarm); + } + + bq2560x_disable_watchdog_timer(bq); + + schedule_delayed_work(&bq->discharge_jeita_work, + calculate_jeita_poll_interval(bq) * HZ); + + pr_err("usb removed, set usb present = %d\n", bq->usb_present); + } else if (bq->power_good && !bq->usb_present) { + bq->usb_present = true; + msleep(10); + power_supply_set_present(bq->usb_psy, bq->usb_present); + + cancel_delayed_work(&bq->discharge_jeita_work); + + if (bq->software_jeita_supported) { + ret = alarm_start_relative(&bq->jeita_alarm, + ns_to_ktime(1000000000LL)); + if (ret) + pr_err("start alarm for JEITA detection failed, ret=%d\n", + ret); + } + + bq2560x_set_watchdog_timer(bq, 160); + + pr_err("usb plugged in, set usb present = %d\n", bq->usb_present); + } + + bq2560x_update_status(bq); + + mutex_unlock(&bq->irq_complete); + + power_supply_changed(&bq->batt_psy); + + return IRQ_HANDLED; +} + + +static void determine_initial_status(struct bq2560x *bq) +{ + int ret; + u8 status = 0; + ret = bq2560x_get_hiz_mode(bq, &status); + if (!ret) + bq->in_hiz = !!status; + + bq2560x_charger_interrupt(bq->client->irq, bq); +} + + +static ssize_t bq2560x_show_registers(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct bq2560x *bq = dev_get_drvdata(dev); + u8 addr; + u8 val; + u8 tmpbuf[200]; + int len; + int idx = 0; + int ret ; + + idx = snprintf(buf, PAGE_SIZE, "%s:\n", "bq2560x Reg"); + for (addr = 0x0; addr <= 0x0B; addr++) { + ret = bq2560x_read_byte(bq, &val, addr); + if (ret == 0) { + len = snprintf(tmpbuf, PAGE_SIZE - idx, "Reg[0x%.2x] = 0x%.2x\n", addr, val); + memcpy(&buf[idx], tmpbuf, len); + idx += len; + } + } + + return idx; +} + +static ssize_t bq2560x_store_registers(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + struct bq2560x *bq = dev_get_drvdata(dev); + int ret; + unsigned int reg; + unsigned int val; + + ret = sscanf(buf, "%x %x", ®, &val); + if (ret == 2 && reg < 0x0B) { + bq2560x_write_byte(bq, (unsigned char)reg, (unsigned char)val); + } + + return count; +} + +static ssize_t bq2560x_battery_test_status_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return sprintf(buf, "%d\n", BatteryTestStatus_enable); +} +static ssize_t bq2560x_battery_test_status_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int retval; + unsigned int input; + + if (sscanf(buf, "%u", &input) != 1) + retval = -EINVAL; + else + BatteryTestStatus_enable = input; + + pr_err("BatteryTestStatus_enable = %d\n", BatteryTestStatus_enable); + + return retval; +} +static DEVICE_ATTR(registers, S_IRUGO | S_IWUSR, bq2560x_show_registers, bq2560x_store_registers); +static DEVICE_ATTR(BatteryTestStatus, S_IRUGO | S_IWUSR, bq2560x_battery_test_status_show, bq2560x_battery_test_status_store); + +static struct attribute *bq2560x_attributes[] = { + &dev_attr_registers.attr, + &dev_attr_BatteryTestStatus.attr, + NULL, +}; + +static const struct attribute_group bq2560x_attr_group = { + .attrs = bq2560x_attributes, +}; + + +static int show_registers(struct seq_file *m, void *data) +{ + struct bq2560x *bq = m->private; + u8 addr; + int ret; + u8 val; + + for (addr = 0x0; addr <= 0x0B; addr++) { + ret = bq2560x_read_byte(bq, &val, addr); + if (!ret) + seq_printf(m, "Reg[0x%02X] = 0x%02X\n", addr, val); + } + return 0; +} + + +static int reg_debugfs_open(struct inode *inode, struct file *file) +{ + struct bq2560x *bq = inode->i_private; + + return single_open(file, show_registers, bq); +} + + +static const struct file_operations reg_debugfs_ops = { + .owner = THIS_MODULE, + .open = reg_debugfs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void create_debugfs_entry(struct bq2560x *bq) +{ + bq->debug_root = debugfs_create_dir("bq2560x", NULL); + if (!bq->debug_root) + pr_err("Failed to create debug dir\n"); + + if (bq->debug_root) { + + debugfs_create_file("registers", S_IFREG | S_IRUGO, + bq->debug_root, bq, ®_debugfs_ops); + + debugfs_create_x32("charging_disable_status", S_IFREG | S_IRUGO, + bq->debug_root, &(bq->charging_disabled_status)); + + debugfs_create_x32("fault_status", S_IFREG | S_IRUGO, + bq->debug_root, &(bq->fault_status)); + + debugfs_create_x32("vbus_type", S_IFREG | S_IRUGO, + bq->debug_root, &(bq->vbus_type)); + + debugfs_create_x32("charge_state", S_IFREG | S_IRUGO, + bq->debug_root, &(bq->charge_state)); + + debugfs_create_x32("skip_reads", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->skip_reads)); + debugfs_create_x32("skip_writes", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->skip_writes)); + } +} + + +static int bq2560x_charger_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct bq2560x *bq; + struct power_supply *usb_psy; + struct power_supply *bms_psy; + + int ret; + + usb_psy = power_supply_get_by_name("usb"); + if (!usb_psy) { + dev_dbg(&client->dev, "USB supply not found, defer probe\n"); + return -EPROBE_DEFER; + } + + bms_psy = power_supply_get_by_name("bms"); + if (!bms_psy) { + dev_dbg(&client->dev, "bms supply not found, defer probe\n"); + return -EPROBE_DEFER; + } + + bq = devm_kzalloc(&client->dev, sizeof(struct bq2560x), GFP_KERNEL); + if (!bq) { + pr_err("Out of memory\n"); + return -ENOMEM; + } + + bq->dev = &client->dev; + bq->usb_psy = usb_psy; + bq->bms_psy = bms_psy; + + bq->client = client; + i2c_set_clientdata(client, bq); + + mutex_init(&bq->i2c_rw_lock); + mutex_init(&bq->data_lock); + mutex_init(&bq->profile_change_lock); + mutex_init(&bq->charging_disable_lock); + mutex_init(&bq->irq_complete); + + bq->resume_completed = true; + bq->irq_waiting = false; + + ret = bq2560x_detect_device(bq); + if (ret) { + pr_err("No bq2560x device found!\n"); + return -ENODEV; + } + + bq2560x_init_jeita(bq); + + if (client->dev.of_node) + bq->platform_data = bq2560x_parse_dt(&client->dev, bq); + else + bq->platform_data = client->dev.platform_data; + + if (!bq->platform_data) { + pr_err("No platform data provided.\n"); + return -EINVAL; + } + + if (gpio_is_valid(bq->gpio_ce)) { + ret = devm_gpio_request(&client->dev, bq->gpio_ce, "bq2560x_ce"); + if (ret) { + pr_err("Failed to request chip enable gpio %d:, err: %d\n", bq->gpio_ce, ret); + return ret; + } + gpio_direction_output(bq->gpio_ce, 0); + } + + ret = bq2560x_init_device(bq); + if (ret) { + pr_err("Failed to init device\n"); + return ret; + } + + ret = bq2560x_psy_register(bq); + if (ret) + return ret; + ret = bq2560x_regulator_init(bq); + if (ret) { + pr_err("Couldn't initialize bq2560x regulator ret=%d\n", ret); + return ret; + } + + INIT_DELAYED_WORK(&bq->charge_jeita_work, bq2560x_charge_jeita_workfunc); + INIT_DELAYED_WORK(&bq->discharge_jeita_work, bq2560x_discharge_jeita_workfunc); + + alarm_init(&bq->jeita_alarm, ALARM_BOOTTIME, bq2560x_jeita_alarm_cb); + + if (client->irq) { + ret = devm_request_threaded_irq(&client->dev, client->irq, NULL, + bq2560x_charger_interrupt, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "bq2560x charger irq", bq); + if (ret < 0) { + pr_err("request irq for irq=%d failed, ret =%d\n", client->irq, ret); + goto err_1; + } + enable_irq_wake(client->irq); + } + + bq2560x_wakeup_src_init(bq); + + device_init_wakeup(bq->dev, 1); + create_debugfs_entry(bq); + + ret = sysfs_create_group(&bq->dev->kobj, &bq2560x_attr_group); + if (ret) { + dev_err(bq->dev, "failed to register sysfs. err: %d\n", ret); + } + + bq2560x_exit_hiz_mode(bq); + determine_initial_status(bq); + + + pr_info("bq2560x probe successfully, Part Num:%d, Revision:%d\n!", + bq->part_no, bq->revision); + + return 0; + +err_1: + bq2560x_psy_unregister(bq); + + return ret; +} + +static inline bool is_device_suspended(struct bq2560x *bq) +{ + return !bq->resume_completed; +} + +static int bq2560x_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq2560x *bq = i2c_get_clientdata(client); + + mutex_lock(&bq->irq_complete); + bq->resume_completed = false; + mutex_unlock(&bq->irq_complete); + + return 0; +} + +static int bq2560x_suspend_noirq(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq2560x *bq = i2c_get_clientdata(client); + + if (bq->irq_waiting) { + pr_err_ratelimited("Aborting suspend, an interrupt was detected while suspending\n"); + return -EBUSY; + } + return 0; +} + +static int bq2560x_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq2560x *bq = i2c_get_clientdata(client); + + + mutex_lock(&bq->irq_complete); + bq->resume_completed = true; + if (bq->irq_waiting) { + bq->irq_disabled = false; + enable_irq(client->irq); + mutex_unlock(&bq->irq_complete); + bq2560x_charger_interrupt(client->irq, bq); + } else { + mutex_unlock(&bq->irq_complete); + } + + power_supply_changed(&bq->batt_psy); + + return 0; +} +static int bq2560x_charger_remove(struct i2c_client *client) +{ + struct bq2560x *bq = i2c_get_clientdata(client); + + alarm_try_to_cancel(&bq->jeita_alarm); + + cancel_delayed_work_sync(&bq->charge_jeita_work); + cancel_delayed_work_sync(&bq->discharge_jeita_work); + + regulator_unregister(bq->otg_vreg.rdev); + + bq2560x_psy_unregister(bq); + + mutex_destroy(&bq->charging_disable_lock); + mutex_destroy(&bq->profile_change_lock); + mutex_destroy(&bq->data_lock); + mutex_destroy(&bq->i2c_rw_lock); + mutex_destroy(&bq->irq_complete); + + debugfs_remove_recursive(bq->debug_root); + sysfs_remove_group(&bq->dev->kobj, &bq2560x_attr_group); + + + return 0; +} + + +static void bq2560x_charger_shutdown(struct i2c_client *client) +{ + pr_info("Shutdown Successfully\n"); +} + +static struct of_device_id bq2560x_charger_match_table[] = { + {.compatible = "ti,bq25600-charger",}, + {.compatible = "ti,bq25601-charger",}, + {}, +}; +MODULE_DEVICE_TABLE(of, bq2560x_charger_match_table); + +static const struct i2c_device_id bq2560x_charger_id[] = { + { "bq25600-charger", BQ25600 }, + { "bq25601-charger", BQ25601 }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, bq2560x_charger_id); + +static const struct dev_pm_ops bq2560x_pm_ops = { + .resume = bq2560x_resume, + .suspend_noirq = bq2560x_suspend_noirq, + .suspend = bq2560x_suspend, +}; +static struct i2c_driver bq2560x_charger_driver = { + .driver = { + .name = "bq2560x-charger", + .owner = THIS_MODULE, + .of_match_table = bq2560x_charger_match_table, + .pm = &bq2560x_pm_ops, + }, + .id_table = bq2560x_charger_id, + + .probe = bq2560x_charger_probe, + .remove = bq2560x_charger_remove, + .shutdown = bq2560x_charger_shutdown, + +}; + +module_i2c_driver(bq2560x_charger_driver); + +MODULE_DESCRIPTION("TI BQ2560x Charger Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Texas Instruments"); diff --git a/drivers/power/bq2560x_reg.h b/drivers/power/bq2560x_reg.h new file mode 100644 index 0000000000000..5f57ced00cff5 --- /dev/null +++ b/drivers/power/bq2560x_reg.h @@ -0,0 +1,307 @@ + +#ifndef __BQ2560X_HEADER__ +#define __BQ2560X_HEADER__ + +/* Register 00h */ +#define BQ2560X_REG_00 0x00 +#define REG00_ENHIZ_MASK 0x80 +#define REG00_ENHIZ_SHIFT 7 +#define REG00_HIZ_ENABLE 1 +#define REG00_HIZ_DISABLE 0 + +#define REG00_STAT_CTRL_MASK 0x60 +#define REG00_STAT_CTRL_SHIFT 5 +#define REG00_STAT_CTRL_STAT 0 +#define REG00_STAT_CTRL_ICHG 1 +#define REG00_STAT_CTRL_IINDPM 2 +#define REG00_STAT_CTRL_DISABLE 3 + +#define REG00_IINLIM_MASK 0x1F +#define REG00_IINLIM_SHIFT 0 +#define REG00_IINLIM_LSB 100 +#define REG00_IINLIM_BASE 100 + +/* Register 01h */ +#define BQ2560X_REG_01 0x01 +#define REG01_PFM_DIS_MASK 0x80 +#define REG01_PFM_DIS_SHIFT 7 +#define REG01_PFM_ENABLE 0 +#define REG01_PFM_DISABLE 1 + +#define REG01_WDT_RESET_MASK 0x40 +#define REG01_WDT_RESET_SHIFT 6 +#define REG01_WDT_RESET 1 + +#define REG01_OTG_CONFIG_MASK 0x20 +#define REG01_OTG_CONFIG_SHIFT 5 +#define REG01_OTG_ENABLE 1 +#define REG01_OTG_DISABLE 0 + +#define REG01_CHG_CONFIG_MASK 0x10 +#define REG01_CHG_CONFIG_SHIFT 4 +#define REG01_CHG_DISABLE 0 +#define REG01_CHG_ENABLE 1 + +#define REG01_SYS_MINV_MASK 0x0E +#define REG01_SYS_MINV_SHIFT 1 + +#define REG01_MIN_VBAT_SEL_MASK 0x01 +#define REG01_MIN_VBAT_SEL_SHIFT 0 +#define REG01_MIN_VBAT_2P8V 0 +#define REG01_MIN_VBAT_2P5V 1 + + +/* Register 0x02*/ +#define BQ2560X_REG_02 0x02 +#define REG02_BOOST_LIM_MASK 0x80 +#define REG02_BOOST_LIM_SHIFT 7 +#define REG02_BOOST_LIM_0P5A 0 +#define REG02_BOOST_LIM_1P2A 1 + +#define REG02_Q1_FULLON_MASK 0x40 +#define REG02_Q1_FULLON_SHIFT 6 +#define REG02_Q1_FULLON_ENABLE 1 +#define REG02_Q1_FULLON_DISABLE 0 + +#define REG02_ICHG_MASK 0x3F +#define REG02_ICHG_SHIFT 0 +#define REG02_ICHG_BASE 0 +#define REG02_ICHG_LSB 60 + +/* Register 0x03*/ +#define BQ2560X_REG_03 0x03 +#define REG03_IPRECHG_MASK 0xF0 +#define REG03_IPRECHG_SHIFT 4 +#define REG03_IPRECHG_BASE 60 +#define REG03_IPRECHG_LSB 60 + +#define REG03_ITERM_MASK 0x0F +#define REG03_ITERM_SHIFT 0 +#define REG03_ITERM_BASE 60 +#define REG03_ITERM_LSB 60 + + +/* Register 0x04*/ +#define BQ2560X_REG_04 0x04 +#define REG04_VREG_MASK 0xF8 +#define REG04_VREG_SHIFT 3 +#define REG04_VREG_BASE 3856 +#define REG04_VREG_LSB 32 + +#define REG04_TOPOFF_TIMER_MASK 0x06 +#define REG04_TOPOFF_TIMER_SHIFT 1 +#define REG04_TOPOFF_TIMER_DISABLE 0 +#define REG04_TOPOFF_TIMER_15M 1 +#define REG04_TOPOFF_TIMER_30M 2 +#define REG04_TOPOFF_TIMER_45M 3 + + +#define REG04_VRECHG_MASK 0x01 +#define REG04_VRECHG_SHIFT 0 +#define REG04_VRECHG_100MV 0 +#define REG04_VRECHG_200MV 1 + +/* Register 0x05*/ +#define BQ2560X_REG_05 0x05 +#define REG05_EN_TERM_MASK 0x80 +#define REG05_EN_TERM_SHIFT 7 +#define REG05_TERM_ENABLE 1 +#define REG05_TERM_DISABLE 0 + +#define REG05_WDT_MASK 0x30 +#define REG05_WDT_SHIFT 4 +#define REG05_WDT_DISABLE 0 +#define REG05_WDT_40S 1 +#define REG05_WDT_80S 2 +#define REG05_WDT_160S 3 +#define REG05_WDT_BASE 0 +#define REG05_WDT_LSB 40 + +#define REG05_EN_TIMER_MASK 0x08 +#define REG05_EN_TIMER_SHIFT 3 +#define REG05_CHG_TIMER_ENABLE 1 +#define REG05_CHG_TIMER_DISABLE 0 + +#define REG05_CHG_TIMER_MASK 0x04 +#define REG05_CHG_TIMER_SHIFT 2 +#define REG05_CHG_TIMER_5HOURS 0 +#define REG05_CHG_TIMER_10HOURS 1 + +#define REG05_TREG_MASK 0x02 +#define REG05_TREG_SHIFT 1 +#define REG05_TREG_90C 0 +#define REG05_TREG_110C 1 + +#define REG05_JEITA_ISET_MASK 0x01 +#define REG05_JEITA_ISET_SHIFT 0 +#define REG05_JEITA_ISET_50PCT 0 +#define REG05_JEITA_ISET_20PCT 1 + + +/* Register 0x06*/ +#define BQ2560X_REG_06 0x06 +#define REG06_OVP_MASK 0xC0 +#define REG06_OVP_SHIFT 0x6 +#define REG06_OVP_5P5V 0 +#define REG06_OVP_6P5V 1 +#define REG06_OVP_10P5V 2 +#define REG06_OVP_14P3V 3 + +#define REG06_BOOSTV_MASK 0x30 +#define REG06_BOOSTV_SHIFT 4 +#define REG06_BOOSTV_4P85V 0 +#define REG06_BOOSTV_5V 1 +#define REG06_BOOSTV_5P15V 2 +#define REG06_BOOSTV_5P3V 3 + +#define REG06_VINDPM_MASK 0x0F +#define REG06_VINDPM_SHIFT 0 +#define REG06_VINDPM_BASE 3900 +#define REG06_VINDPM_LSB 100 + +/* Register 0x07*/ +#define BQ2560X_REG_07 0x07 +#define REG07_FORCE_DPDM_MASK 0x80 +#define REG07_FORCE_DPDM_SHIFT 7 +#define REG07_FORCE_DPDM 1 + +#define REG07_TMR2X_EN_MASK 0x40 +#define REG07_TMR2X_EN_SHIFT 6 +#define REG07_TMR2X_ENABLE 1 +#define REG07_TMR2X_DISABLE 0 + +#define REG07_BATFET_DIS_MASK 0x20 +#define REG07_BATFET_DIS_SHIFT 5 +#define REG07_BATFET_OFF 1 +#define REG07_BATFET_ON 0 + +#define REG07_JEITA_VSET_MASK 0x10 +#define REG07_JEITA_VSET_SHIFT 4 +#define REG07_JEITA_VSET_4100 0 +#define REG07_JEITA_VSET_VREG 1 + +#define REG07_BATFET_DLY_MASK 0x08 +#define REG07_BATFET_DLY_SHIFT 3 +#define REG07_BATFET_DLY_0S 0 +#define REG07_BATFET_DLY_10S 1 + +#define REG07_BATFET_RST_EN_MASK 0x04 +#define REG07_BATFET_RST_EN_SHIFT 2 +#define REG07_BATFET_RST_DISABLE 0 +#define REG07_BATFET_RST_ENABLE 1 + +#define REG07_VDPM_BAT_TRACK_MASK 0x03 +#define REG07_VDPM_BAT_TRACK_SHIFT 0 +#define REG07_VDPM_BAT_TRACK_DISABLE 0 +#define REG07_VDPM_BAT_TRACK_200MV 1 +#define REG07_VDPM_BAT_TRACK_250MV 2 +#define REG07_VDPM_BAT_TRACK_300MV 3 + +/* Register 0x08*/ +#define BQ2560X_REG_08 0x08 +#define REG08_VBUS_STAT_MASK 0xE0 +#define REG08_VBUS_STAT_SHIFT 5 +#define REG08_VBUS_TYPE_NONE 0 +#define REG08_VBUS_TYPE_USB 1 +#define REG08_VBUS_TYPE_ADAPTER 3 +#define REG08_VBUS_TYPE_OTG 7 + +#define REG08_CHRG_STAT_MASK 0x18 +#define REG08_CHRG_STAT_SHIFT 3 +#define REG08_CHRG_STAT_IDLE 0 +#define REG08_CHRG_STAT_PRECHG 1 +#define REG08_CHRG_STAT_FASTCHG 2 +#define REG08_CHRG_STAT_CHGDONE 3 + +#define REG08_PG_STAT_MASK 0x04 +#define REG08_PG_STAT_SHIFT 2 +#define REG08_POWER_GOOD 1 + +#define REG08_THERM_STAT_MASK 0x02 +#define REG08_THERM_STAT_SHIFT 1 + +#define REG08_VSYS_STAT_MASK 0x01 +#define REG08_VSYS_STAT_SHIFT 0 +#define REG08_IN_VSYS_STAT 1 + + +/* Register 0x09*/ +#define BQ2560X_REG_09 0x09 +#define REG09_FAULT_WDT_MASK 0x80 +#define REG09_FAULT_WDT_SHIFT 7 +#define REG09_FAULT_WDT 1 + +#define REG09_FAULT_BOOST_MASK 0x40 +#define REG09_FAULT_BOOST_SHIFT 6 + +#define REG09_FAULT_CHRG_MASK 0x30 +#define REG09_FAULT_CHRG_SHIFT 4 +#define REG09_FAULT_CHRG_NORMAL 0 +#define REG09_FAULT_CHRG_INPUT 1 +#define REG09_FAULT_CHRG_THERMAL 2 +#define REG09_FAULT_CHRG_TIMER 3 + +#define REG09_FAULT_BAT_MASK 0x08 +#define REG09_FAULT_BAT_SHIFT 3 +#define REG09_FAULT_BAT_OVP 1 + +#define REG09_FAULT_NTC_MASK 0x07 +#define REG09_FAULT_NTC_SHIFT 0 +#define REG09_FAULT_NTC_NORMAL 0 +#define REG09_FAULT_NTC_WARM 2 +#define REG09_FAULT_NTC_COOL 3 +#define REG09_FAULT_NTC_COLD 5 +#define REG09_FAULT_NTC_HOT 6 + + +/* Register 0x0A */ +#define BQ2560X_REG_0A 0x0A +#define REG0A_VBUS_GD_MASK 0x80 +#define REG0A_VBUS_GD_SHIFT 7 +#define REG0A_VBUS_GD 1 + +#define REG0A_VINDPM_STAT_MASK 0x40 +#define REG0A_VINDPM_STAT_SHIFT 6 +#define REG0A_VINDPM_ACTIVE 1 + +#define REG0A_IINDPM_STAT_MASK 0x20 +#define REG0A_IINDPM_STAT_SHIFT 5 +#define REG0A_IINDPM_ACTIVE 1 + +#define REG0A_TOPOFF_ACTIVE_MASK 0x08 +#define REG0A_TOPOFF_ACTIVE_SHIFT 3 +#define REG0A_TOPOFF_ACTIVE 1 + +#define REG0A_ACOV_STAT_MASK 0x04 +#define REG0A_ACOV_STAT_SHIFT 2 +#define REG0A_ACOV_ACTIVE 1 + +#define REG0A_VINDPM_INT_MASK 0x02 +#define REG0A_VINDPM_INT_SHIFT 1 +#define REG0A_VINDPM_INT_ENABLE 0 +#define REG0A_VINDPM_INT_DISABLE 1 + +#define REG0A_IINDPM_INT_MASK 0x01 +#define REG0A_IINDPM_INT_SHIFT 0 +#define REG0A_IINDPM_INT_ENABLE 0 +#define REG0A_IINDPM_INT_DISABLE 1 + +#define REG0A_INT_MASK_MASK 0x03 +#define REG0A_INT_MASK_SHIFT 0 + + +#define BQ2560X_REG_0B 0x0B +#define REG0B_REG_RESET_MASK 0x80 +#define REG0B_REG_RESET_SHIFT 7 +#define REG0B_REG_RESET 1 + +#define REG0B_PN_MASK 0x78 +#define REG0B_PN_SHIFT 3 + +#define REG0B_DEV_REV_MASK 0x03 +#define REG0B_DEV_REV_SHIFT 0 + + +#endif + + diff --git a/drivers/power/bq27426_fg.c b/drivers/power/bq27426_fg.c new file mode 100644 index 0000000000000..73b1e8b50f4e8 --- /dev/null +++ b/drivers/power/bq27426_fg.c @@ -0,0 +1,2290 @@ +/* + * bqGauge battery driver + * + * Copyright (C) 2008 Rodolfo Giometti + * Copyright (C) 2008 Eurotech S.p.A. + * Copyright (C) 2010-2011 Lars-Peter Clausen + * Copyright (C) 2011 Pali Rohár + * Copyright (C) 2018 XiaoMi, Inc. + * + * Based on a previous work by Copyright (C) 2008 Texas Instruments, Inc. + * Copyright (C) 2018 XiaoMi, Inc. + * + * This package 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 PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + */ + +/* + * Datasheets: + */ +#define pr_fmt(fmt) "bq27426- %s: " fmt, __func__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "bqfs_cmd_type.h" + +#include +#include "bq27426_gmfs_desay.h" +#include "bq27426_gmfs_scud.h" +#include "bq27426_gmfs_sunwoda.h" +#include "bq27426_gmfs_atl.h" +#include "bq27426_gmfs_default.h" + + +#undef pr_info +#define pr_info pr_debug + +#define MONITOR_ALARM_CHECK_NS 5000000000 +#define INVALID_REG_ADDR 0xFF +#define BQFS_UPDATE_KEY 0x8F91 + + +#define FG_FLAGS_OT BIT(15) +#define FG_FLAGS_UT BIT(14) +#define FG_FLAGS_FC BIT(9) +#define FG_FLAGS_CHG BIT(8) +#define FG_FLAGS_OCVTAKEN BIT(7) +#define FG_FLAGS_ITPOR BIT(5) +#define FG_FLAGS_CFGUPMODE BIT(4) +#define FG_FLAGS_BAT_DET BIT(3) +#define FG_FLAGS_SOC1 BIT(2) +#define FG_FLAGS_SOCF BIT(1) +#define FG_FLAGS_DSG BIT(0) + + +enum bq_fg_reg_idx { + BQ_FG_REG_CTRL = 0, + BQ_FG_REG_TEMP, /* Battery Temperature */ + BQ_FG_REG_VOLT, /* Battery Voltage */ + BQ_FG_REG_AI, /* Average Current */ + BQ_FG_REG_FLAGS, /* Flags */ + BQ_FG_REG_TTE, /* Time to Empty */ + BQ_FG_REG_TTF, /* Time to Full */ + BQ_FG_REG_FCC, /* Full Charge Capacity */ + BQ_FG_REG_RM, /* Remaining Capacity */ + BQ_FG_REG_CC, /* Cycle Count */ + BQ_FG_REG_SOC, /* Relative State of Charge */ + BQ_FG_REG_SOH, /* State of Health */ + BQ_FG_REG_DC, /* Design Capacity */ + NUM_REGS, +}; + +enum bq_fg_subcmd { + FG_SUBCMD_CTRL_STATUS = 0x0000, + FG_SUBCMD_PART_NUM = 0x0001, + FG_SUBCMD_FW_VER = 0x0002, + FG_SUBCMD_DM_CODE = 0x0004, + FG_SUBCMD_CHEM_ID = 0x0008, + FG_SUBCMD_BAT_INSERT = 0x000C, + FG_SUBCMD_BAT_REMOVE = 0x000D, + FG_SUBCMD_SET_CFGUPDATE = 0x0013, + FG_SUBCMD_SEAL = 0x0020, + FG_SUBCMD_PULSE_SOC_INT = 0x0023, + FG_SUBCMD_CHEM_A = 0x0030, + FG_SUBCMD_CHEM_B = 0x0031, + FG_SUBCMD_CHEM_C = 0x0032, + FG_SUBCMD_SOFT_RESET = 0x0042, +}; + + +enum { + SEAL_STATE_FA, + SEAL_STATE_UNSEALED, + SEAL_STATE_SEALED, +}; + + +enum bq_fg_device { + BQ27X00, + BQ27426, +}; + +enum { + UPDATE_REASON_FG_RESET = 1, + UPDATE_REASON_NEW_VERSION, + UPDATE_REASON_FORCED, +}; + +struct batt_chem_id { + u16 id; + u16 cmd; +}; + +static struct batt_chem_id batt_chem_id_arr[] = { + {3230, FG_SUBCMD_CHEM_A}, + {1202, FG_SUBCMD_CHEM_B}, + {3142, FG_SUBCMD_CHEM_C}, +}; + +struct bq_batt_ids { + int kohm; + const char *battery_type; +}; + +static struct bq_batt_ids bq_batt_ids_attr[] = { + {30, "wingtech-Desay-4v4-3000mah"}, + {68, "wingtech-Scud-4v4-3000mah"}, + {330, "wingtech-Sunwoda-4v4-3000mah"}, + {82, "wingtech-Atl-4v4-3000mah"}, +}; + + +struct fg_batt_profile { + const bqfs_cmd_t *bqfs_image; + u32 array_size; + u8 version; +}; + +static const struct fg_batt_profile bqfs_image[] = { + { bqfs_default, ARRAY_SIZE(bqfs_default), 1}, + { bqfs_desay, ARRAY_SIZE(bqfs_desay), 33}, + { bqfs_scud, ARRAY_SIZE(bqfs_scud), 98}, + { bqfs_sunwoda, ARRAY_SIZE(bqfs_sunwoda), 61}, + { bqfs_atl, ARRAY_SIZE(bqfs_atl), 98}, +}; + +const unsigned char *device2str[] = { + "bq27x00", + "bq27426", +}; + +const unsigned char *update_reason_str[] = { + "Reset", + "New Version", + "Force", +}; + +static u8 bq27426_regs[NUM_REGS] = { + 0x00, /* CONTROL */ + 0x02, /* TEMP */ + 0x04, /* VOLT */ + 0x10, /* AVG CURRENT */ + 0x06, /* FLAGS */ + 0xFF, /* Time to empty */ + 0xFF, /* Time to full */ + 0x0E, /* Full charge capacity */ + 0x0C, /* Remaining Capacity */ + 0xFF, /* CycleCount */ + 0x1C, /* State of Charge */ + 0x20, /* State of Health */ + 0xFF, /* Design Capacity */ +}; + +struct bq_fg_chip; + +enum { + BATTERY_PROFILE_A, + BATTERY_PROFILE_B, + BATTERY_PROFILE_MAX, +}; + +struct bq_fg_chip { + struct device *dev; + struct i2c_client *client; + + + struct mutex i2c_rw_lock; + struct mutex data_lock; + struct mutex update_lock; + struct mutex irq_complete; + + struct work_struct fg_soc_work; + struct alarm fg_soc_alarm; + int usb_present; + + bool irq_waiting; + bool irq_disabled; + bool resume_completed; + + int force_update; + int fw_ver; + int df_ver; + + u8 chip; + u8 regs[NUM_REGS]; + + int batt_id; + + /* status tracking */ + + bool batt_present; + bool batt_fc; + bool batt_ot; + bool batt_ut; + bool batt_soc1; + bool batt_socf; + bool batt_dsg; + bool allow_chg; + bool cfg_update_mode; + bool itpor; + + int seal_state; /* 0 - Full Access, 1 - Unsealed, 2 - Sealed */ + int batt_tte; + int batt_soc; + int batt_fcc; /* Full charge capacity */ + int batt_rm; /* Remaining capacity */ + int batt_dc; /* Design Capacity */ + int batt_volt; + int batt_temp; + int batt_curr; + + int batt_cyclecnt; /* cycle count */ + + + struct work_struct update_work; + + unsigned long last_update; + + /* debug */ + int skip_reads; + int skip_writes; + + int fake_soc; + int fake_temp; + + struct dentry *debug_root; + + struct power_supply *batt_psy; + struct power_supply fg_psy; + struct power_supply *usb_psy; + + struct qpnp_vadc_chip *vadc_dev; + struct regulator *vdd; + struct regulator *vcc_i2c; + u32 connected_rid; + const char *battery_type; +}; + + + +static int __fg_read_byte(struct i2c_client *client, u8 reg, u8 *val) +{ + s32 ret; + + ret = i2c_smbus_read_byte_data(client, reg); + if (ret < 0) { + pr_err("i2c read byte fail: can't read from reg 0x%02X\n", reg); + return ret; + } + + *val = (u8)ret; + + return 0; +} + +static int __fg_write_byte(struct i2c_client *client, u8 reg, u8 val) +{ + s32 ret; + + ret = i2c_smbus_write_byte_data(client, reg, val); + if (ret < 0) { + pr_err("i2c write byte fail: can't write 0x%02X to reg 0x%02X\n", + val, reg); + return ret; + } + + return 0; +} + + +static int __fg_read_word(struct i2c_client *client, u8 reg, u16 *val) +{ + s32 ret; + + ret = i2c_smbus_read_word_data(client, reg); + if (ret < 0) { + pr_err("i2c read word fail: can't read from reg 0x%02X\n", reg); + return ret; + } + + *val = (u16)ret; + + return 0; +} + + +static int __fg_write_word(struct i2c_client *client, u8 reg, u16 val) +{ + s32 ret; + + ret = i2c_smbus_write_word_data(client, reg, val); + if (ret < 0) { + pr_err("i2c write word fail: can't write 0x%02X to reg 0x%02X\n", + val, reg); + return ret; + } + + return 0; +} + +static int __fg_read_block(struct i2c_client *client, u8 reg, u8 *buf, u8 len) +{ + int ret; + struct i2c_msg msg[2]; + int i; + + msg[0].addr = client->addr; + msg[0].flags = 0; + msg[0].buf = ® + msg[0].len = 1; + + msg[1].addr = client->addr; + msg[1].flags = I2C_M_RD; + msg[1].buf = buf; + msg[1].len = len; + + for (i = 0; i < 3; i++) { + ret = i2c_transfer(client->adapter, msg, ARRAY_SIZE(msg)); + if (ret >= 0) + return ret; + else + msleep(5); + } + return ret; +} + +static int __fg_write_block(struct i2c_client *client, u8 reg, u8 *buf, u8 len) +{ + int ret; + struct i2c_msg msg; + u8 data[64]; + int i = 0; + + data[0] = reg; + memcpy(&data[1], buf, len); + + msg.addr = client->addr; + msg.flags = 0; + msg.buf = data; + msg.len = len + 1; + + for (i = 0; i < 3; i++) { + ret = i2c_transfer(client->adapter, &msg, 1); + if (ret >= 0) + return ret; + else + msleep(5); + } + return ret; +} + + +static int fg_read_byte(struct bq_fg_chip *bq, u8 reg, u8 *val) +{ + int ret; + + if (bq->skip_reads) { + *val = 0; + return 0; + } + + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_read_byte(bq->client, reg, val); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + +static int fg_write_byte(struct bq_fg_chip *bq, u8 reg, u8 val) +{ + int ret; + + if (bq->skip_writes) + return 0; + + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_write_byte(bq->client, reg, val); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + +static int fg_read_word(struct bq_fg_chip *bq, u8 reg, u16 *val) +{ + int ret; + + if (bq->skip_reads) { + *val = 0; + return 0; + } + + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_read_word(bq->client, reg, val); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + +static int fg_write_word(struct bq_fg_chip *bq, u8 reg, u16 val) +{ + int ret; + + if (bq->skip_writes) + return 0; + + + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_write_word(bq->client, reg, val); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + +static int fg_read_block(struct bq_fg_chip *bq, u8 reg, u8 *buf, u8 len) +{ + int ret; + + if (bq->skip_reads) + return 0; + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_read_block(bq->client, reg, buf, len); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; + +} + +static int fg_write_block(struct bq_fg_chip *bq, u8 reg, u8 *data, u8 len) +{ + int ret; + + if (bq->skip_writes) + return 0; + + mutex_lock(&bq->i2c_rw_lock); + ret = __fg_write_block(bq->client, reg, data, len); + mutex_unlock(&bq->i2c_rw_lock); + + return ret; +} + +#define CTRL_REG 0x00 + +#define FG_DFT_UNSEAL_KEY1 0x80008000 +#define FG_DFT_UNSEAL_KEY2 0x36724614 + +#define FG_DFT_UNSEAL_FA_KEY 0xFFFFFFFF + +static u8 checksum(u8 *data, u8 len) +{ + u8 i; + u16 sum = 0; + + for (i = 0; i < len; i++) + sum += data[i]; + + sum &= 0xFF; + + return (0xFF - sum); +} + +#if 1 +static void fg_print_buf(const char *msg, u8 *buf, u8 len) +{ + int i; + int idx = 0; + int num; + u8 strbuf[128]; + + pr_err("%s buf: ", msg); + for (i = 0; i < len; i++) { + num = sprintf(&strbuf[idx], "%02X ", buf[i]); + idx += num; + } + pr_err("%s\n", strbuf); +} +#else +static void fg_print_buf(const char *msg, u8 *buf, u8 len) +{} +#endif + + +#define TIMEOUT_INIT_COMPLETED 100 +static int fg_check_init_completed(struct bq_fg_chip *bq) +{ + int ret; + int i = 0; + u16 status; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_CTRL_STATUS); + if (ret < 0) { + pr_err("Failed to write control status cmd, ret = %d\n", ret); + return ret; + } + + msleep(5); + + while (i++ < TIMEOUT_INIT_COMPLETED) { + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &status); + if (ret >= 0 && (status & 0x0080)) + return 0; + msleep(100); + } + pr_err("wait for FG INITCOMP timeout\n"); + return ret; +} + +static int fg_get_seal_state(struct bq_fg_chip *bq) +{ + int ret; + u16 status; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_CTRL_STATUS); + if (ret < 0) { + pr_err("Failed to write control status cmd, ret = %d\n", ret); + return ret; + } + + msleep(5); + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &status); + if (ret < 0) { + pr_err("Failed to read control status, ret = %d\n", ret); + return ret; + } + pr_err("control_status = 0x%04X", status); + if (status & 0x2000) + bq->seal_state = SEAL_STATE_SEALED; + else + bq->seal_state = SEAL_STATE_UNSEALED; + + return 0; +} + +static int fg_unseal(struct bq_fg_chip *bq, u32 key) +{ + int ret; + int retry = 0; + + ret = fg_get_seal_state(bq); + if (ret) + return ret; + if (bq->seal_state == SEAL_STATE_UNSEALED) + return 0; + + pr_info(":key - 0x%08X\n", key); + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], key & 0xFFFF); + if (ret < 0) { + pr_err("unable to write unseal key step 1, ret = %d\n", ret); + return ret; + } + + msleep(5); + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], (key >> 16) & 0xFFFF); + if (ret < 0) { + pr_err("unable to write unseal key step 2, ret = %d\n", ret); + return ret; + } + + msleep(5); + + while (retry++ < 1000) { + fg_get_seal_state(bq); + if (bq->seal_state == SEAL_STATE_UNSEALED) { + return 0; + } + msleep(100); + } + + return -EPERM; +} + + +static int fg_unseal_fa(struct bq_fg_chip *bq, u32 key) +{ + int ret; + int retry = 0; + + pr_info(":key - %d\n", key); + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], key & 0xFFFF); + if (ret < 0) { + pr_err("unable to write unseal key step 1, ret = %d\n", ret); + return ret; + } + + msleep(5); + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], (key >> 16) & 0xFFFF); + if (ret < 0) { + pr_err("unable to write unseal key step 2, ret = %d\n", ret); + return ret; + } + + msleep(5); + + while (retry++ < 1000) { + fg_get_seal_state(bq); + if (bq->seal_state == SEAL_STATE_FA) { + return 0; + } + msleep(10); + } + + return -1; +} +EXPORT_SYMBOL_GPL(fg_unseal_fa); + +static int fg_seal(struct bq_fg_chip *bq) +{ + int ret; + int retry = 0; + + fg_get_seal_state(bq); + + if (bq->seal_state == SEAL_STATE_SEALED) + return 0; + msleep(5); + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_SEAL); + + if (ret < 0) { + pr_err("Failed to send seal command\n"); + return ret; + } + + while (retry++ < 1000) { + fg_get_seal_state(bq); + if (bq->seal_state == SEAL_STATE_SEALED) + return 0; + msleep(200); + } + + return -1; +} + + + +static int fg_check_cfg_update_mode(struct bq_fg_chip *bq) +{ + int ret; + u16 flags; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_FLAGS], &flags); + if (ret < 0) { + return ret; + } + + bq->cfg_update_mode = !!(flags & FG_FLAGS_CFGUPMODE); + + return 0; + +} + +static int fg_check_itpor(struct bq_fg_chip *bq) +{ + int ret; + u16 flags; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_FLAGS], &flags); + if (ret < 0) { + return ret; + } + + bq->itpor = !!(flags & FG_FLAGS_ITPOR); + + return 0; +} + + +static int fg_read_dm_version(struct bq_fg_chip *bq, u8 *ver) +{ + int ret; + u16 dm_code = 0; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_DM_CODE); + if (ret < 0) { + pr_err("Failed to write control status cmd, ret = %d\n", ret); + return ret; + } + + msleep(5); + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &dm_code); + if (!ret) + *ver = dm_code & 0xFF; + return ret; +} + +#define CFG_UPDATE_POLLING_RETRY_LIMIT 50 +static int fg_dm_pre_access(struct bq_fg_chip *bq) +{ + int ret; + int i = 0; + + ret = fg_check_init_completed(bq); + if (ret < 0) + return ret; + ret = fg_unseal(bq, FG_DFT_UNSEAL_KEY1); + if (ret < 0) + return ret; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_SET_CFGUPDATE); + if (ret < 0) + return ret; + + msleep(10); + + while(i++ < CFG_UPDATE_POLLING_RETRY_LIMIT) { + ret = fg_check_cfg_update_mode(bq); + if (!ret && bq->cfg_update_mode) + return 0; + msleep(400); + } + + pr_err("Failed to enter cfgupdate mode\n"); + + return -EPERM; +} +EXPORT_SYMBOL_GPL(fg_dm_pre_access); + +static int fg_dm_post_access(struct bq_fg_chip *bq) +{ + int ret; + int i = 0; + + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], + FG_SUBCMD_SOFT_RESET); + if (ret < 0) + return ret; + + msleep(100); + + while (i++ < CFG_UPDATE_POLLING_RETRY_LIMIT) { + ret = fg_check_cfg_update_mode(bq); + if (!ret && !bq->cfg_update_mode) + break; + msleep(100); + } + + if (i == CFG_UPDATE_POLLING_RETRY_LIMIT) { + pr_err("Failed to exit cfgupdate mode\n"); + return -EPERM; + } else { + return fg_seal(bq); + } +} +EXPORT_SYMBOL_GPL(fg_dm_post_access); + +#define DM_ACCESS_BLOCK_DATA_CHKSUM 0x60 +#define DM_ACCESS_BLOCK_DATA_CTRL 0x61 +#define DM_ACCESS_BLOCK_DATA_CLASS 0x3E +#define DM_ACCESS_DATA_BLOCK 0x3F +#define DM_ACCESS_BLOCK_DATA 0x40 + + +static int fg_dm_read_block(struct bq_fg_chip *bq, u8 classid, + u8 offset, u8 *buf) +{ + int ret; + u8 cksum_calc, cksum; + u8 blk_offset = offset >> 5; + + pr_info("subclass:%d, offset:%d\n", classid, offset); + + ret = fg_write_byte(bq, DM_ACCESS_BLOCK_DATA_CTRL, 0); + if (ret < 0) + return ret; + msleep(5); + ret = fg_write_byte(bq, DM_ACCESS_BLOCK_DATA_CLASS, classid); + if (ret < 0) + return ret; + msleep(5); + ret = fg_write_byte(bq, DM_ACCESS_DATA_BLOCK, blk_offset); + if (ret < 0) + return ret; + msleep(5); + ret = fg_read_block(bq, DM_ACCESS_BLOCK_DATA, buf, 32); + if (ret < 0) + return ret; + + fg_print_buf(__func__, buf, 32); + + msleep(5); + cksum_calc = checksum(buf, 32); + ret = fg_read_byte(bq, DM_ACCESS_BLOCK_DATA_CHKSUM, &cksum); + if (!ret && cksum_calc == cksum) + return 0; + else + return 1; +} +EXPORT_SYMBOL_GPL(fg_dm_read_block); + +static int fg_dm_write_block(struct bq_fg_chip *bq, u8 classid, + u8 offset, u8 *data) +{ + int ret; + u8 cksum; + u8 buf[64]; + u8 blk_offset = offset >> 5; + + pr_info("subclass:%d, offset:%d\n", classid, offset); + + ret = fg_write_byte(bq, DM_ACCESS_BLOCK_DATA_CTRL, 0); + if (ret < 0) + return ret; + msleep(5); + ret = fg_write_byte(bq, DM_ACCESS_BLOCK_DATA_CLASS, classid); + if (ret < 0) + return ret; + msleep(5); + ret = fg_write_byte(bq, DM_ACCESS_DATA_BLOCK, blk_offset); + if (ret < 0) + return ret; + ret = fg_write_block(bq, DM_ACCESS_BLOCK_DATA, data, 32); + msleep(5); + + fg_print_buf(__func__, data, 32); + + cksum = checksum(data, 32); + ret = fg_write_byte(bq, DM_ACCESS_BLOCK_DATA_CHKSUM, cksum); + if (ret < 0) + return ret; + msleep(5); + + ret = fg_write_byte(bq, DM_ACCESS_DATA_BLOCK, blk_offset); + if (ret < 0) + return ret; + msleep(5); + ret = fg_read_block(bq, DM_ACCESS_BLOCK_DATA, buf, 32); + if (ret < 0) + return ret; + if (memcpy(data, buf, 32)) { + pr_err("Error updating subclass %d offset %d\n", + classid, offset); + return 1; + } + return 0; +} +EXPORT_SYMBOL_GPL(fg_dm_write_block); + +static int fg_read_fw_version(struct bq_fg_chip *bq) +{ + + int ret; + u16 version; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], 0x0002); + + if (ret < 0) { + pr_err("Failed to send firmware version subcommand:%d\n", ret); + return ret; + } + + mdelay(2); + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &version); + if (ret < 0) { + pr_err("Failed to read firmware version:%d\n", ret); + return ret; + } + + return version; +} + + +static int fg_read_status(struct bq_fg_chip *bq) +{ + int ret; + u16 flags; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_FLAGS], &flags); + if (ret < 0) { + return ret; + } + + mutex_lock(&bq->data_lock); + bq->batt_present = !!(flags & FG_FLAGS_BAT_DET); + bq->batt_ot = !!(flags & FG_FLAGS_OT); + bq->batt_ut = !!(flags & FG_FLAGS_UT); + bq->batt_fc = !!(flags & FG_FLAGS_FC); + bq->batt_soc1 = !!(flags & FG_FLAGS_SOC1); + bq->batt_socf = !!(flags & FG_FLAGS_SOCF); + bq->batt_dsg = !!(flags & FG_FLAGS_DSG); + bq->allow_chg = !!(flags & FG_FLAGS_CHG); + mutex_unlock(&bq->data_lock); + + return 0; +} + + +static int fg_get_charger_present(struct bq_fg_chip *bq) +{ + union power_supply_propval prop = {0,}; + int ret; + + ret = bq->usb_psy->get_property(bq->usb_psy, + POWER_SUPPLY_PROP_PRESENT, &prop); + + if (!ret) + bq->usb_present = prop.intval; + + return ret; +} + +#define CYCLE_DETECT_TIME 30 +u16 monitor_soc = 0; +static int fg_read_rsoc(struct bq_fg_chip *bq) +{ + int ret; + u16 soc = 0; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_SOC], &soc); + if (ret < 0) { + pr_err("could not read RSOC, ret = %d\n", ret); + return ret; + } + + return soc; + +} + +bool monitor_soc_up = 0; +bool monitor_soc_down = 0; +static int fg_read_new_rsoc(struct bq_fg_chip *bq) +{ + u16 new_soc = 0; + ktime_t kt; + + new_soc = fg_read_rsoc(bq); + fg_get_charger_present(bq); + if (!monitor_soc_up && bq->usb_present && (new_soc == 100 && (bq->batt_soc >= 90 && bq->batt_soc <= 98))) { + pr_err("soc jumped, new_soc = %d, old_soc = %d\n", new_soc, bq->batt_soc); + monitor_soc_up = 1; + monitor_soc_down = 0; + kt = ns_to_ktime(CYCLE_DETECT_TIME*NSEC_PER_SEC); + alarm_start_relative(&bq->fg_soc_alarm, kt); + } + + if (monitor_soc_up || monitor_soc_down) { + } else{ + monitor_soc = new_soc; + } + + return monitor_soc; + +} + +static enum alarmtimer_restart fg_soc_alarm_callback(struct alarm *alarm, + ktime_t now) +{ + struct bq_fg_chip *bq = container_of(alarm, struct bq_fg_chip, + fg_soc_alarm); + + pr_err("fg_soc_jump_callback\n"); + pm_stay_awake(bq->dev); + schedule_work(&bq->fg_soc_work); + + return ALARMTIMER_NORESTART; +} + +static void fg_soc_work_fn(struct work_struct *work) +{ + struct bq_fg_chip *bq = container_of(work, struct bq_fg_chip, + fg_soc_work); + ktime_t kt; + u16 real_soc = 0; + real_soc = fg_read_rsoc(bq); + + fg_get_charger_present(bq); + if (monitor_soc_up && bq->usb_present) { + monitor_soc += 1; + monitor_soc = (monitor_soc <= 100) ? monitor_soc : 100; + } + + pr_err("fg_soc_work_fn monitor_soc = %d\n", monitor_soc); + if (!bq->usb_present && monitor_soc <= 99) { + pr_err("fg_soc_work_fn fg_soc_work_fn monitor_soc_down\n"); + monitor_soc_down = 1; + monitor_soc_up = 0; + } + if (monitor_soc == 100 || real_soc <= monitor_soc) { + pr_err("fg_soc_work_fn alarm stop\n"); + monitor_soc_up = 0; + monitor_soc_down = 0; + } + + power_supply_changed(&bq->fg_psy); + + if (monitor_soc_down || monitor_soc_up) { + kt = ns_to_ktime(CYCLE_DETECT_TIME*NSEC_PER_SEC); + alarm_start_relative(&bq->fg_soc_alarm, kt); + } + + pm_relax(bq->dev); +} + + +#define DEFAULT_TEMP 2980 +static int fg_read_temperature(struct bq_fg_chip *bq) +{ + int ret; + u16 temp = 0; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_TEMP], &temp); + if (ret < 0) { + pr_err("could not read temperature, ret = %d\n", ret); + return ret; + } + + +#ifdef CONFIG_DISABLE_TEMP_PROTECT + pr_err("Disable temp control Version!\n"); + return DEFAULT_TEMP; +#else + return temp; +#endif + +} + +#define DEFAULT_RESISTER 45 +static int fg_get_battid_resister(struct bq_fg_chip *bq) +{ + int rc = 0; + int bq_battid_resister = 0; + struct qpnp_vadc_result results; + + rc = qpnp_vadc_read(bq->vadc_dev, P_MUX4_1_1, &results); + if (rc) { + pr_debug("Unable to read batt resister rc=%d\n", rc); + return DEFAULT_RESISTER; + } + + bq_battid_resister = (results.physical)*100/(1800000 - results.physical); + + return bq_battid_resister; +} + + +static char *bq_default_batt_type = "Generic_Battery"; + +static int bq_batterydata_get_best_profile(struct bq_fg_chip *bq) +{ + int delta = 0, best_id_kohm = 0, id_range_pct = 15, + batt_id_kohm = 0, i = 0, limit = 0; + + batt_id_kohm = fg_get_battid_resister(bq); + + for (i = 0; i < ARRAY_SIZE(bq_batt_ids_attr); i++) { + delta = abs(bq_batt_ids_attr[i].kohm - batt_id_kohm); + limit = (bq_batt_ids_attr[i].kohm * id_range_pct) / 100; + if (delta <= limit) { + best_id_kohm = bq_batt_ids_attr[i].kohm; + bq->battery_type = bq_batt_ids_attr[i].battery_type; + goto out; + } + } + + pr_err("out of range, using default battery, best_id_kohm=%d\n", batt_id_kohm); + + bq->battery_type = bq_default_batt_type; + +out: + pr_err("%s found\n", bq->battery_type); + hardwareinfo_set_prop(HARDWARE_BATTERY_ID, bq->battery_type); + + if (best_id_kohm == 30) { + bq->batt_id = 1; + } else if (best_id_kohm == 68) { + bq->batt_id = 2; + } else if (best_id_kohm == 330) { + bq->batt_id = 3; + } else if (best_id_kohm == 82) { + bq->batt_id = 4; + } else + bq->batt_id = 0; + + return 0; +} + + +static int fg_read_volt(struct bq_fg_chip *bq) +{ + int ret; + u16 volt = 0; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_VOLT], &volt); + if (ret < 0) { + pr_err("could not read voltage, ret = %d\n", ret); + return ret; + } + + return volt; + +} + +static int fg_read_current(struct bq_fg_chip *bq, int *curr) +{ + int ret; + u16 avg_curr = 0; + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_AI], &avg_curr); + if (ret < 0) { + pr_err("could not read current, ret = %d\n", ret); + return ret; + } + *curr = (int)((s16)avg_curr); + + return ret; +} + +static int fg_read_fcc(struct bq_fg_chip *bq) +{ + int ret; + u16 fcc; + + if (bq->regs[BQ_FG_REG_FCC] == INVALID_REG_ADDR) { + pr_err("FCC command not supported!\n"); + return 0; + } + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_FCC], &fcc); + + if (ret < 0) { + pr_err("could not read FCC, ret=%d\n", ret); + } + + return fcc; +} + +static int fg_read_dc(struct bq_fg_chip *bq) +{ + + int ret; + u16 dc; + + if (bq->regs[BQ_FG_REG_DC] == INVALID_REG_ADDR) { + pr_err("DesignCapacity command not supported!\n"); + return 0; + } + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_DC], &dc); + + if (ret < 0) { + pr_err("could not read DC, ret=%d\n", ret); + return ret; + } + + return dc; +} + + +static int fg_read_rm(struct bq_fg_chip *bq) +{ + int ret; + u16 rm; + + if (bq->regs[BQ_FG_REG_RM] == INVALID_REG_ADDR) { + pr_err("RemainingCapacity command not supported!\n"); + return 0; + } + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_RM], &rm); + + if (ret < 0) { + pr_err("could not read DC, ret=%d\n", ret); + return ret; + } + + return rm; + +} + +static int fg_read_cyclecount(struct bq_fg_chip *bq) +{ + int ret; + u16 cc; + + if (bq->regs[BQ_FG_REG_CC] == INVALID_REG_ADDR) { + pr_err("Cycle Count not supported!\n"); + return -EPERM; + } + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CC], &cc); + + if (ret < 0) { + pr_err("could not read Cycle Count, ret=%d\n", ret); + return ret; + } + + return cc; +} + +static int fg_read_tte(struct bq_fg_chip *bq) +{ + int ret; + u16 tte; + + if (bq->regs[BQ_FG_REG_TTE] == INVALID_REG_ADDR) { + pr_err("Time To Empty not supported!\n"); + return -EPERM; + } + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_TTE], &tte); + + if (ret < 0) { + pr_err("could not read Time To Empty, ret=%d\n", ret); + return ret; + } + + if (ret == 0xFFFF) + return -ENODATA; + + return tte; +} + +static int fg_get_batt_status(struct bq_fg_chip *bq) +{ + union power_supply_propval prop = {0,}; + int ret; + + ret = bq->usb_psy->get_property(bq->usb_psy, + POWER_SUPPLY_PROP_PRESENT, &prop); + if (ret < 0) + pr_err("could not read USB current_max property, ret=%d\n", ret); + fg_read_status(bq); + + if (!bq->batt_present) + return POWER_SUPPLY_STATUS_UNKNOWN; + else if (bq->batt_fc && prop.intval) + return POWER_SUPPLY_STATUS_FULL; + else if (bq->batt_dsg) + return POWER_SUPPLY_STATUS_DISCHARGING; + else if (bq->batt_curr > 0) + return POWER_SUPPLY_STATUS_CHARGING; + else + return POWER_SUPPLY_STATUS_NOT_CHARGING; + +} + + +static int fg_get_batt_capacity_level(struct bq_fg_chip *bq) +{ + if (!bq->batt_present) + return POWER_SUPPLY_CAPACITY_LEVEL_UNKNOWN; + else if (bq->batt_fc) + return POWER_SUPPLY_CAPACITY_LEVEL_FULL; + else if (bq->batt_soc1) + return POWER_SUPPLY_CAPACITY_LEVEL_LOW; + else if (bq->batt_socf) + return POWER_SUPPLY_CAPACITY_LEVEL_CRITICAL; + else + return POWER_SUPPLY_CAPACITY_LEVEL_NORMAL; + +} + + +static int fg_get_batt_health(struct bq_fg_chip *bq) +{ + if (!bq->batt_present) + return POWER_SUPPLY_HEALTH_UNKNOWN; + else if (bq->batt_ot) + return POWER_SUPPLY_HEALTH_OVERHEAT; + else if (bq->batt_ut) + return POWER_SUPPLY_HEALTH_COLD; + else + return POWER_SUPPLY_HEALTH_GOOD; + +} + +static enum power_supply_property fg_props[] = { + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CURRENT_NOW, + POWER_SUPPLY_PROP_RESISTANCE_ID, + POWER_SUPPLY_PROP_BATTERY_TYPE, + POWER_SUPPLY_PROP_CAPACITY, + POWER_SUPPLY_PROP_CAPACITY_LEVEL, + POWER_SUPPLY_PROP_TEMP, + + POWER_SUPPLY_PROP_CHARGE_FULL, + + + POWER_SUPPLY_PROP_HEALTH, + POWER_SUPPLY_PROP_TECHNOLOGY, + POWER_SUPPLY_PROP_UPDATE_NOW, +}; + +static int fg_get_property(struct power_supply *psy, enum power_supply_property psp, + union power_supply_propval *val) +{ + struct bq_fg_chip *bq = container_of(psy, struct bq_fg_chip, fg_psy); + int ret; + + mutex_lock(&bq->update_lock); + switch (psp) { + case POWER_SUPPLY_PROP_STATUS: + val->intval = fg_get_batt_status(bq); + break; + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + ret = fg_read_volt(bq); + mutex_lock(&bq->data_lock); + if (ret >= 0) + bq->batt_volt = ret; + val->intval = bq->batt_volt * 1000; + mutex_unlock(&bq->data_lock); + + break; + case POWER_SUPPLY_PROP_PRESENT: + val->intval = bq->batt_present; + break; + case POWER_SUPPLY_PROP_CURRENT_NOW: + mutex_lock(&bq->data_lock); + fg_read_current(bq, &bq->batt_curr); + val->intval = -bq->batt_curr * 1000; + pr_info("bq27426 current=%d\n", val->intval); + mutex_unlock(&bq->data_lock); + break; + case POWER_SUPPLY_PROP_RESISTANCE_ID: + val->intval = fg_get_battid_resister(bq); + break; + case POWER_SUPPLY_PROP_BATTERY_TYPE: + val->strval = bq->battery_type; + break; + case POWER_SUPPLY_PROP_CAPACITY: + if (bq->fake_soc >= 0) { + val->intval = bq->fake_soc; + break; + } + ret = fg_read_new_rsoc(bq); + mutex_lock(&bq->data_lock); + if (ret >= 0) + bq->batt_soc = ret; + val->intval = bq->batt_soc; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_CAPACITY_LEVEL: + val->intval = fg_get_batt_capacity_level(bq); + break; + + case POWER_SUPPLY_PROP_TEMP: + if (bq->fake_temp != -EINVAL) { + val->intval = bq->fake_temp; + break; + } + ret = fg_read_temperature(bq); + mutex_lock(&bq->data_lock); + if (ret > 0) + bq->batt_temp = ret; + val->intval = bq->batt_temp - 2730; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: + ret = fg_read_tte(bq); + mutex_lock(&bq->data_lock); + if (ret >= 0) + bq->batt_tte = ret; + + val->intval = bq->batt_tte; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_CHARGE_FULL: + ret = fg_read_fcc(bq); + mutex_lock(&bq->data_lock); + if (ret > 0) + bq->batt_fcc = ret; + + val->intval = 3000; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + ret = fg_read_dc(bq); + mutex_lock(&bq->data_lock); + if (ret > 0) + bq->batt_dc = ret; + val->intval = bq->batt_dc * 1000; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_CYCLE_COUNT: + ret = fg_read_cyclecount(bq); + mutex_lock(&bq->data_lock); + if (ret >= 0) + bq->batt_cyclecnt = ret; + val->intval = bq->batt_cyclecnt; + mutex_unlock(&bq->data_lock); + break; + + case POWER_SUPPLY_PROP_HEALTH: + val->intval = fg_get_batt_health(bq); + break; + + case POWER_SUPPLY_PROP_TECHNOLOGY: + val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; + break; + + case POWER_SUPPLY_PROP_UPDATE_NOW: + val->intval = 0; + break; + + default: + mutex_unlock(&bq->update_lock); + return -EINVAL; + } + mutex_unlock(&bq->update_lock); + return 0; +} + +static void fg_dump_registers(struct bq_fg_chip *bq); + +static int fg_set_property(struct power_supply *psy, + enum power_supply_property prop, + const union power_supply_propval *val) +{ + struct bq_fg_chip *bq = container_of(psy, struct bq_fg_chip, + fg_psy); + switch (prop) { + case POWER_SUPPLY_PROP_TEMP: + bq->fake_temp = val->intval; + break; + case POWER_SUPPLY_PROP_CAPACITY: + bq->fake_soc = val->intval; + power_supply_changed(&bq->fg_psy); + break; + case POWER_SUPPLY_PROP_UPDATE_NOW: + fg_dump_registers(bq); + break; + default: + return -EINVAL; + } + + return 0; +} + + +static int fg_prop_is_writeable(struct power_supply *psy, + enum power_supply_property prop) +{ + int ret; + + switch (prop) { + case POWER_SUPPLY_PROP_TEMP: + case POWER_SUPPLY_PROP_CAPACITY: + case POWER_SUPPLY_PROP_UPDATE_NOW: + ret = 1; + break; + default: + ret = 0; + break; + } + return ret; +} + + + +static void fg_external_power_changed(struct power_supply *psy) +{ + +} + +static int fg_psy_register(struct bq_fg_chip *bq) +{ + int ret; + + bq->fg_psy.name = "bms"; + bq->fg_psy.type = POWER_SUPPLY_TYPE_BMS; + bq->fg_psy.properties = fg_props; + bq->fg_psy.num_properties = ARRAY_SIZE(fg_props); + bq->fg_psy.get_property = fg_get_property; + bq->fg_psy.set_property = fg_set_property; + bq->fg_psy.external_power_changed = fg_external_power_changed; + bq->fg_psy.property_is_writeable = fg_prop_is_writeable; + + + ret = power_supply_register(bq->dev, &bq->fg_psy); + if (ret < 0) { + pr_err("Failed to register fg_psy:%d\n", ret); + return ret; + } + + return 0; +} + + +static void fg_psy_unregister(struct bq_fg_chip *bq) +{ + + power_supply_unregister(&bq->fg_psy); +} + + +static int fg_change_chem_id(struct bq_fg_chip *bq, u16 new_id) +{ + int ret; + u16 old_id; + + int i; + + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], FG_SUBCMD_CHEM_ID); + if (ret < 0) { + pr_err("Failed to write chemid subcmd, ret = %d\n", ret); + return ret; + } + + msleep(5); + + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &old_id); + if (ret < 0) { + pr_err("Failed to read control status, ret = %d\n", ret); + return ret; + } + + if (new_id == old_id) { + pr_info("new chemid is same as old one, skip change\n"); + return 0; + } + + for (i = 0; i < ARRAY_SIZE(batt_chem_id_arr); i++) { + if (new_id == batt_chem_id_arr[i].id) + break; + } + + if (i == ARRAY_SIZE(batt_chem_id_arr)) { + pr_err("not supported chem_id %d\n", new_id); + return -1; + } + + msleep(5); + ret = fg_dm_pre_access(bq); + if (ret < 0) + return ret; + msleep(5); + ret = fg_write_word(bq, bq->regs[BQ_FG_REG_CTRL], batt_chem_id_arr[i].cmd); + if (ret < 0) { + pr_err("Failed to send chem_id command, ret=%d\n", ret); + fg_dm_post_access(bq); + return ret; + } + + msleep(5); + ret = fg_dm_post_access(bq); + if (ret < 0) + return ret; + + msleep(2000); + /* Read back checm id to confirm */ + ret = fg_read_word(bq, bq->regs[BQ_FG_REG_CTRL], &old_id); + if (ret < 0) { + pr_err("Failed to read control status, ret = %d\n", ret); + return ret; + } + + if (new_id == old_id) { + pr_info("chem ID changed successfully\n"); + return 0; + } else { + return -1; + } +} +EXPORT_SYMBOL_GPL(fg_change_chem_id); + +static int fg_check_update_necessary(struct bq_fg_chip *bq) +{ + int ret; + u8 dm_ver = 0xFF; + + ret = fg_check_itpor(bq); + if (!ret && bq->itpor) + return UPDATE_REASON_FG_RESET; + + ret = fg_read_dm_version(bq, &dm_ver); + pr_err("bq27426 dm_ver = %d\n", dm_ver); + if (!ret && dm_ver < bqfs_image[bq->batt_id].version) + return UPDATE_REASON_NEW_VERSION; + else + return 0; +} + +static bool fg_update_bqfs_execute_cmd(struct bq_fg_chip *bq, + const bqfs_cmd_t *cmd) +{ + int ret; + int i; + u8 tmp_buf[CMD_MAX_DATA_SIZE]; + + switch (cmd->cmd_type) { + case CMD_R: + ret = fg_read_block(bq, cmd->reg, (u8 *)&cmd->data.bytes, cmd->data_len); + if (ret < 0) + return false; + else + return true; + break; + case CMD_W: + ret = fg_write_block(bq, cmd->reg, (u8 *)&cmd->data.bytes, cmd->data_len); + if (ret < 0) + return false; + else + return true; + break; + case CMD_C: + if (fg_read_block(bq, cmd->reg, tmp_buf, cmd->data_len) < 0) + return false; + if (memcmp(tmp_buf, cmd->data.bytes, cmd->data_len)) { + pr_info("CMD_C failed at line %d\n", cmd->line_num); + for (i = 0; i < cmd->data_len; i++) { + pr_err("Read: %02X, Cmp:%02X", tmp_buf[i], cmd->data.bytes[i]); + } + return false; + } + + return true; + break; + case CMD_X: + mdelay(cmd->data.delay); + return true; + break; + default: + pr_err("Unsupported command at line %d\n", cmd->line_num); + return false; + } + +} +EXPORT_SYMBOL_GPL(fg_update_bqfs_execute_cmd); + +static void fg_update_bqfs(struct bq_fg_chip *bq) +{ + int i; + const bqfs_cmd_t *image; + int reason = 0; + + + if (bq->force_update == ~BQFS_UPDATE_KEY) + reason = UPDATE_REASON_FORCED; + else + reason = fg_check_update_necessary(bq); + + if (!reason) { + pr_info("Fuel Gauge parameter no need update, ignored\n"); + return; + } + + if (bq->batt_id >= ARRAY_SIZE(bqfs_image) || + bq->batt_id < 0) { + pr_err("batt_id is out of range"); + return; + } + /* TODO:if unseal, enter cfg update mode cmd sequence are in gmfs file, + no need to do explicitly */ + fg_dm_pre_access(bq); + + pr_err("Fuel Gauge parameter update, reason:%s, version:%d, batt_id=%d Start...\n", + update_reason_str[reason - 1], bqfs_image[bq->batt_id].version, bq->batt_id); + + mutex_lock(&bq->update_lock); + image = bqfs_image[bq->batt_id].bqfs_image; + for (i = 0; i < bqfs_image[bq->batt_id].array_size; i++) { + if (!fg_update_bqfs_execute_cmd(bq, &image[i])) { + mutex_unlock(&bq->update_lock); + pr_err("Failed at command: %d\n", i); + fg_dm_post_access(bq); + return; + } + mdelay(5); + } + mutex_unlock(&bq->update_lock); + + pr_err("Done!\n"); + + /* TODO:exit cfg update mode and seal device if these are not handled in gmfs file */ + fg_dm_post_access(bq); + return; + +} +EXPORT_SYMBOL_GPL(fg_update_bqfs); + + +static const u8 fg_dump_regs[] = { + 0x00, 0x02, 0x04, 0x06, + 0x08, 0x0A, 0x0C, 0x0E, + 0x10, 0x16, 0x18, 0x1A, + 0x1C, 0x1E, 0x20, 0x28, + 0x2A, 0x2C, 0x2E, 0x30, + 0x66, 0x68, 0x6C, 0x6E, + 0x70, +}; + +static void fg_dump_registers(struct bq_fg_chip *bq) +{ + int i; + int ret; + u16 val = 0; + + if (bq->batt_present) { + mutex_lock(&bq->update_lock); + + bq->batt_soc = fg_read_new_rsoc(bq); + bq->batt_volt = fg_read_volt(bq); + fg_read_current(bq, &bq->batt_curr); + bq->batt_temp = fg_read_temperature(bq); + bq->batt_rm = fg_read_rm(bq); + + mutex_unlock(&bq->update_lock); + pr_err("BQ27426 --RSOC:%d, Volt:%d, Current:%d, Temperature:%d\n", + bq->batt_soc, bq->batt_volt, bq->batt_curr, bq->batt_temp - 2730); + } + + pr_err("Reg[00 -70] = "); + for (i = 0; i < ARRAY_SIZE(fg_dump_regs); i++) { + msleep(5); + ret = fg_read_word(bq, fg_dump_regs[i], &val); + if (!ret) + printk("0x%04X, ", val); + } + printk("\n"); +} +EXPORT_SYMBOL_GPL(fg_dump_registers); + + +static int show_registers(struct seq_file *m, void *data) +{ + struct bq_fg_chip *bq = m->private; + int i; + int ret; + u16 val = 0; + + for (i = 0; i < ARRAY_SIZE(fg_dump_regs); i++) { + msleep(5); + ret = fg_read_word(bq, fg_dump_regs[i], &val); + if (!ret) + seq_printf(m, "Reg[%02X] = 0x%04X\n", + fg_dump_regs[i], val); + } + return 0; +} + + +static int reg_debugfs_open(struct inode *inode, struct file *file) +{ + struct bq_fg_chip *bq = inode->i_private; + + return single_open(file, show_registers, bq); +} + +static const struct file_operations reg_debugfs_ops = { + .owner = THIS_MODULE, + .open = reg_debugfs_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void create_debugfs_entry(struct bq_fg_chip *bq) +{ + bq->debug_root = debugfs_create_dir("bq_fg", NULL); + if (!bq->debug_root) + pr_err("Failed to create debug dir\n"); + + if (bq->debug_root) { + + debugfs_create_file("registers", S_IFREG | S_IRUGO, + bq->debug_root, bq, ®_debugfs_ops); + + debugfs_create_x32("fake_soc", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->fake_soc)); + + debugfs_create_x32("fake_temp", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->fake_temp)); + + debugfs_create_x32("skip_reads", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->skip_reads)); + debugfs_create_x32("skip_writes", + S_IFREG | S_IWUSR | S_IRUGO, + bq->debug_root, + &(bq->skip_writes)); + } +} + +static ssize_t fg_attr_show_Ra_table(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + int ret; + u8 rd_buf[64]; + u8 temp_buf[100]; + int len, i, idx; + u8 *err_str[] = { + "Failed to enter configure mode", + "Failed to Read Ra Table", + "Failed to exit configure mode", + }; + + memset(buf, 0, 64); + mutex_lock(&bq->update_lock); + ret = fg_dm_pre_access(bq); + if (ret) { + sprintf(buf, "%s", err_str[0]); + mutex_unlock(&bq->update_lock); + return strlen(err_str[0]); + } + + ret = fg_dm_read_block(bq, 89, 0, rd_buf); + if (ret) { + sprintf(buf, "%s", err_str[1]); + fg_dm_post_access(bq); + mutex_unlock(&bq->update_lock); + return strlen(err_str[1]); + } + + fg_dm_post_access(bq); + + idx = 0; + for (i = 0; i < 30; i++) { + len = sprintf(temp_buf, "%02X ", rd_buf[i]); + memcpy(&buf[idx], temp_buf, len); + idx += len; + } + mutex_unlock(&bq->update_lock); + return idx; +} + +static ssize_t fg_attr_show_Qmax(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + int ret; + u8 rd_buf[64]; + int len; + u8 *err_str[] = { + "Failed to enter configure mode", + "Failed to Qmax", + }; + + memset(buf, 0, 64); + mutex_lock(&bq->update_lock); + ret = fg_dm_pre_access(bq); + if (ret) { + sprintf(buf, "%s", err_str[0]); + mutex_unlock(&bq->update_lock); + return strlen(err_str[0]); + } + + ret = fg_dm_read_block(bq, 82, 0, rd_buf); + if (ret) { + sprintf(buf, "%s", err_str[1]); + fg_dm_post_access(bq); + mutex_unlock(&bq->update_lock); + return strlen(err_str[1]); + } + + len = sprintf(buf, "Qmax Cell 0 = %d\n", (rd_buf[0] << 8) | rd_buf[1]); + fg_dm_post_access(bq); + + mutex_unlock(&bq->update_lock); + return len; +} + +static ssize_t fg_attr_store_update(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + unsigned int key = 0; + + sscanf(buf, "%x", &key); + if (key == BQFS_UPDATE_KEY) { + bq->force_update = ~key; + schedule_work(&bq->update_work); + } + return count; +} + +static ssize_t fg_attr_show_dmcode(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + int ret; + u8 ver; + + ret = fg_read_dm_version(bq, &ver); + if (!ret) + return sprintf(buf, "0x%02X\n", ver); + else + return sprintf(buf, "Read DM code error"); +} + + +static DEVICE_ATTR(RaTable, S_IRUGO, fg_attr_show_Ra_table, NULL); +static DEVICE_ATTR(Qmax, S_IRUGO, fg_attr_show_Qmax, NULL); +static DEVICE_ATTR(update, S_IWUSR, NULL, fg_attr_store_update); +static DEVICE_ATTR(dmcode, S_IRUGO, fg_attr_show_dmcode, NULL); + + +static struct attribute *fg_attributes[] = { + &dev_attr_RaTable.attr, + &dev_attr_Qmax.attr, + &dev_attr_update.attr, + &dev_attr_dmcode.attr, + NULL, +}; + + +static const struct attribute_group fg_attr_group = { + .attrs = fg_attributes, +}; + + +static void fg_update_bqfs_workfunc(struct work_struct *work) +{ + struct bq_fg_chip *bq = container_of(work, + struct bq_fg_chip, update_work); + + fg_update_bqfs(bq); +} + +static irqreturn_t fg_irq_thread(int irq, void *dev_id) +{ + struct bq_fg_chip *bq = dev_id; + + + + + bool last_batt_present; + + mutex_lock(&bq->irq_complete); + bq->irq_waiting = true; + if (!bq->resume_completed) { + pr_info("IRQ triggered before device resume\n"); + if (!bq->irq_disabled) { + disable_irq_nosync(irq); + bq->irq_disabled = true; + } + mutex_unlock(&bq->irq_complete); + return IRQ_HANDLED; + } + bq->irq_waiting = false; + + last_batt_present = bq->batt_present; + + mutex_lock(&bq->update_lock); + fg_read_status(bq); + mutex_unlock(&bq->update_lock); + pr_info("itpor=%d, cfg_mode = %d, seal_state=%d, batt_present=%d", + bq->itpor, bq->cfg_update_mode, bq->seal_state, bq->batt_present); + + if (!last_batt_present && bq->batt_present) {/* battery inserted */ + pr_info("Battery inserted\n"); + } else if (last_batt_present && !bq->batt_present) {/* battery removed */ + pr_info("Battery removed\n"); + bq->batt_soc = -ENODATA; + bq->batt_fcc = -ENODATA; + bq->batt_rm = -ENODATA; + bq->batt_volt = -ENODATA; + bq->batt_curr = -ENODATA; + bq->batt_temp = -ENODATA; + bq->batt_cyclecnt = -ENODATA; + } + power_supply_changed(&bq->fg_psy); + mutex_unlock(&bq->irq_complete); + + return IRQ_HANDLED; +} + + +static void determine_initial_status(struct bq_fg_chip *bq) +{ + fg_irq_thread(bq->client->irq, bq); +} + +#define SMB_VTG_MIN_UV 1800000 +#define SMB_VTG_MAX_UV 1800000 + +static int bq_fg_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + + int ret; + int rc = 0; + struct bq_fg_chip *bq; + struct power_supply *usb_psy; + u8 *regs; + + usb_psy = power_supply_get_by_name("usb"); + if (!usb_psy) { + dev_dbg(&client->dev, "USB supply not found, defer probe\n"); + return -EPROBE_DEFER; + } + + bq = devm_kzalloc(&client->dev, sizeof(*bq), GFP_KERNEL); + + if (!bq) { + pr_err("Could not allocate memory\n"); + return -ENOMEM; + } + + bq->dev = &client->dev; + bq->client = client; + bq->chip = id->driver_data; + bq->usb_psy = usb_psy; + + bq->batt_soc = -ENODATA; + bq->batt_fcc = -ENODATA; + bq->batt_rm = -ENODATA; + bq->batt_dc = -ENODATA; + bq->batt_volt = -ENODATA; + bq->batt_temp = -ENODATA; + bq->batt_curr = -ENODATA; + bq->batt_cyclecnt = -ENODATA; + + bq->fake_soc = -EINVAL; + bq->fake_temp = -EINVAL; + + if (bq->chip == BQ27426) { + regs = bq27426_regs; + } else { + pr_err("unexpected fuel gauge: %d\n", bq->chip); + regs = bq27426_regs; + } + + memcpy(bq->regs, regs, NUM_REGS); + + i2c_set_clientdata(client, bq); + + mutex_init(&bq->i2c_rw_lock); + mutex_init(&bq->data_lock); + mutex_init(&bq->update_lock); + mutex_init(&bq->irq_complete); + + bq->resume_completed = true; + bq->irq_waiting = false; + + bq->vadc_dev = qpnp_get_vadc(bq->dev, "battid"); + if (IS_ERR(bq->vadc_dev)) { + ret = PTR_ERR(bq->vadc_dev); + if (ret == -EPROBE_DEFER) + pr_err("vadc not found - defer rc=%d\n", ret); + else + pr_err("vadc property missing, rc=%d\n", ret); + + return ret; + } + + bq->vcc_i2c = regulator_get(bq->dev, "vcc_i2c"); + if (IS_ERR(bq->vcc_i2c)) { + pr_err("Regulator get failed vdd rc=%d\n", rc); + + } + + if (regulator_count_voltages(bq->vcc_i2c) > 0) { + rc = regulator_set_voltage(bq->vcc_i2c, SMB_VTG_MIN_UV, + SMB_VTG_MAX_UV); + if (rc) { + pr_err("Regulator set_vtg failed vdd rc=%d\n", rc); + } + } + + rc = regulator_enable(bq->vcc_i2c); + if (rc) { + pr_err("Regulator vdd enable failed rc=%d\n", rc); + } + + ret = bq_batterydata_get_best_profile(bq); + if (ret < 0) { + dev_err(&client->dev, "Unable to parse DT nodes\n"); + } + INIT_WORK(&bq->update_work, fg_update_bqfs_workfunc); + + + INIT_WORK(&bq->fg_soc_work, fg_soc_work_fn); + alarm_init(&bq->fg_soc_alarm, ALARM_REALTIME, fg_soc_alarm_callback); + + fg_update_bqfs(bq); + + if (client->irq) { + ret = devm_request_threaded_irq(&client->dev, client->irq, NULL, + fg_irq_thread, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + "bq fuel gauge irq", bq); + if (ret < 0) { + pr_err("request irq for irq=%d failed, ret = %d\n", client->irq, ret); + goto err_1; + } + enable_irq_wake(client->irq); + } + + device_init_wakeup(bq->dev, 1); + + bq->fw_ver = fg_read_fw_version(bq); + + fg_psy_register(bq); + + create_debugfs_entry(bq); + ret = sysfs_create_group(&bq->dev->kobj, &fg_attr_group); + if (ret) { + pr_err("Failed to register sysfs, err:%d\n", ret); + } + + determine_initial_status(bq); + bq->batt_soc = fg_read_rsoc(bq); + monitor_soc = bq->batt_soc; + + pr_info("bq fuel gauge probe successfully, %s FW ver:%d\n", + device2str[bq->chip], bq->fw_ver); + + return 0; + +err_1: + fg_psy_unregister(bq); + return ret; +} + + +static inline bool is_device_suspended(struct bq_fg_chip *bq) +{ + return !bq->resume_completed; +} + + +static int bq_fg_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + mutex_lock(&bq->irq_complete); + bq->resume_completed = false; + mutex_unlock(&bq->irq_complete); + + return 0; +} + +static int bq_fg_suspend_noirq(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + if (bq->irq_waiting) { + pr_err_ratelimited("Aborting suspend, an interrupt was detected while suspending\n"); + return -EBUSY; + } + return 0; + +} + + +static int bq_fg_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + mutex_lock(&bq->irq_complete); + bq->resume_completed = true; + if (bq->irq_waiting) { + bq->irq_disabled = false; + enable_irq(client->irq); + mutex_unlock(&bq->irq_complete); + fg_irq_thread(client->irq, bq); + } else { + mutex_unlock(&bq->irq_complete); + } + + power_supply_changed(&bq->fg_psy); + + return 0; + + +} + +static int bq_fg_remove(struct i2c_client *client) +{ + struct bq_fg_chip *bq = i2c_get_clientdata(client); + + fg_psy_unregister(bq); + + mutex_destroy(&bq->data_lock); + mutex_destroy(&bq->i2c_rw_lock); + mutex_destroy(&bq->update_lock); + mutex_destroy(&bq->irq_complete); + + alarm_cancel(&bq->fg_soc_alarm); + + debugfs_remove_recursive(bq->debug_root); + sysfs_remove_group(&bq->dev->kobj, &fg_attr_group); + + return 0; + +} + +static void bq_fg_shutdown(struct i2c_client *client) +{ + pr_info("bq fuel gauge driver shutdown!\n"); +} + +static struct of_device_id bq_fg_match_table[] = { + {.compatible = "ti,bq27426",}, + {}, +}; +MODULE_DEVICE_TABLE(of, bq_fg_match_table); + +static const struct i2c_device_id bq_fg_id[] = { + { "bq27426", BQ27426 }, + {}, +}; +MODULE_DEVICE_TABLE(i2c, bq_fg_id); + +static const struct dev_pm_ops bq_fg_pm_ops = { + .resume = bq_fg_resume, + .suspend_noirq = bq_fg_suspend_noirq, + .suspend = bq_fg_suspend, +}; + +static struct i2c_driver bq_fg_driver = { + .driver = { + .name = "bq_fg", + .owner = THIS_MODULE, + .of_match_table = bq_fg_match_table, + .pm = &bq_fg_pm_ops, + }, + .id_table = bq_fg_id, + + .probe = bq_fg_probe, + .remove = bq_fg_remove, + .shutdown = bq_fg_shutdown, + +}; + +module_i2c_driver(bq_fg_driver); + +MODULE_DESCRIPTION("TI BQ2742x Gauge Driver"); +MODULE_LICENSE("GPL v2"); +MODULE_AUTHOR("Texas Instruments"); diff --git a/drivers/power/bq27426_gmfs.h b/drivers/power/bq27426_gmfs.h new file mode 100644 index 0000000000000..7b5a70f48697c --- /dev/null +++ b/drivers/power/bq27426_gmfs.h @@ -0,0 +1,946 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + +#ifndef __BQFS_FILE__ +#define __BQFS_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_image[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x62, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x69} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x69} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x79, 0x07, 0x9F, 0x23, 0x00, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x0E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x0E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x0A, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x59} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x59} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x77, 0x01, 0x2C, 0x02, 0x58, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x90} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x90} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x40, 0x00, 0x02, 0x00, 0x32, 0x81, 0x0C, 0x08, 0x2E, 0x52, 0x0C, 0x1C, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x14, 0x03, 0xE8, 0x01, 0x01, 0x00, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCE, 0x00, 0x01, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x15, 0x07, 0x11, 0x2C, 0xD3, 0xD7, 0xE0, 0xE0, 0xE3, 0xE3, 0xE6, 0xE5, 0xE5, 0xEA, 0xF4, 0xD3, 0xCA, 0xF3, 0xF3, 0xEB, 0xF0, 0xE2, 0xF0, 0xEE, 0xF2, 0xF2, 0xF7, 0xF9, 0xFA, 0xFA, 0xFC, 0xFE} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x08} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x08} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xF8, 0xF9, 0xF8, 0xF6, 0xEF, 0xF0, 0xF0, 0xFE, 0xFD, 0xE9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xED} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xED} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFB, 0x1D, 0x05, 0x09, 0x06, 0x03, 0x02, 0xFF, 0x00, 0xFC, 0xFF, 0xFD, 0xFF, 0xFA, 0x0E, 0x19, 0x02, 0x01, 0x02, 0xFB, 0xF5, 0xF5, 0x02, 0x01, 0x05, 0xFE, 0xFB, 0xFD, 0xFE, 0xFC, 0xF7, 0xFB} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE3} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE3} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFA, 0xFD, 0xFE, 0x03, 0xFA, 0x0B, 0xFE, 0x03, 0xB9, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xC7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xC7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0x4B, 0x01, 0x05, 0x02, 0x06, 0x06, 0xFF, 0x03, 0xFA, 0x01, 0xFD, 0xFA, 0x01, 0x1A, 0xE5, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x33} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x33} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0xE0, 0x00, 0x00, 0x28, 0x08, 0x42, 0xDF, 0xFE, 0xE5, 0xFB, 0xFD, 0xF8, 0xED, 0x0F, 0x09, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x0D, 0x00, 0x09, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x23, 0x00, 0x15, 0x00, 0x18, 0x00, 0x17, 0x00, 0x17, 0x00, 0x18, 0x00, 0x18, 0x00, 0x16, 0x00, 0x24, 0x00, 0x25, 0x00, 0x5B, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x63} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x63} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0E, 0xBB, 0x0E, 0xE3, 0x0E, 0x9C, 0x11, 0x30, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x00, 0x00, 0x00, 0xD4, 0x86, 0x4A, 0xC6, 0xB4, 0xC2, 0x6E, 0x2B, 0x03, 0x7C, 0x01, 0x48, 0xFD, 0xA3, 0xF6, 0x75, 0x12, 0x58, 0x2D, 0xB7, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xD4, 0x1A, 0x05} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x1C, 0x98, 0x02, 0xD3, 0xFF, 0xB9, 0x30, 0xEF, 0x05, 0x11, 0x05, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x3C, 0x00, 0x50, 0x3C, 0x00, 0x64, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x69, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0xFF, 0x0B, 0xD6, 0x7E, 0x74, 0x6D, 0xC6, 0x93, 0x0B, 0x0D, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x69, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6B, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xEF, 0x05, 0x11, 0x05, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x3C, 0x00, 0x50, 0x3C, 0x00, 0x64, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6B, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, +}; + +#endif diff --git a/drivers/power/bq27426_gmfs_atl.h b/drivers/power/bq27426_gmfs_atl.h new file mode 100644 index 0000000000000..afda7293698de --- /dev/null +++ b/drivers/power/bq27426_gmfs_atl.h @@ -0,0 +1,822 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + + +#ifndef __BQFS_ATL_FILE__ +#define __BQFS_ATL_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_atl[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x13, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 1100}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x63, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x71, 0x0F, 0x96, 0x20, 0x62, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xB8} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xB8} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x01, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x79, 0x00, 0xE8, 0x02, 0x5C, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x3D, 0xE7, 0x00, 0x00, 0x00, 0x01, 0x0B, 0xCC, 0x2D, 0x6B, 0x0D, 0x48, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x00, 0x7F, 0xFF, 0x01, 0x00, 0x73, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCE, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x86} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x86} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x16, 0x64, 0x11, 0x28, 0xDD, 0xDB, 0xDF, 0xE0, 0xDD, 0xDF, 0xE9, 0xE6, 0xDC, 0xE6, 0xE6, 0xE9, 0xE2, 0xE8, 0xED, 0xE6, 0xE3, 0xEE, 0xEC, 0xF2, 0xF1, 0xF5, 0xF8, 0xF8, 0xF8, 0xFA, 0xFB, 0xFC} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFD, 0xF6, 0xF5, 0xF1, 0xF2, 0xEE, 0xF6, 0xFE, 0xFC, 0xE8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFB, 0x1D, 0x04, 0x14, 0x29, 0x14, 0x0A, 0x2B, 0x1B, 0xC7, 0xE7, 0x4B, 0xF7, 0x08, 0xED, 0x21, 0x09, 0x07, 0x0E, 0xF8, 0xDD, 0xD4, 0xFD, 0x08, 0x03, 0xE9, 0xF9, 0xFA, 0xFA, 0xF1, 0xE9, 0xDE} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xE9, 0xFF, 0x06, 0x11, 0xFC, 0x0A, 0x00, 0x14, 0xC3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0x88, 0x01, 0x03, 0x03, 0xF4, 0x0B, 0xBF, 0x4F, 0xFE, 0x06, 0x00, 0xFA, 0xF7, 0x20, 0x82, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0xC9, 0x01, 0x04, 0x12, 0x21, 0xFB, 0xA3, 0x02, 0xDF, 0xF5, 0xFD, 0xE2, 0xED, 0xFD, 0x74, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x29, 0x00, 0x29, 0x00, 0x26, 0x00, 0x2A, 0x00, 0x23, 0x00, 0x19, 0x00, 0x19, 0x00, 0x17, 0x00, 0x15, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x18, 0x00, 0x51, 0x00, 0xB3, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x88} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x88} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0B, 0x9B, 0x0E, 0xE6, 0x0E, 0xA7, 0x11, 0x2A, 0x10, 0xEA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x00, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x42, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 2000}, + }, +}; + +#endif + + diff --git a/drivers/power/bq27426_gmfs_default.h b/drivers/power/bq27426_gmfs_default.h new file mode 100644 index 0000000000000..a902e55f02819 --- /dev/null +++ b/drivers/power/bq27426_gmfs_default.h @@ -0,0 +1,946 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + +#ifndef __BQFS_DEFAULT_FILE__ +#define __BQFS_DEFAULT_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_default[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x62, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x69} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x69} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x79, 0x07, 0x9F, 0x23, 0x00, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x0E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x0E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x0A, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x59} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x59} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x77, 0x01, 0x2C, 0x02, 0x58, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x90} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x90} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x40, 0x00, 0x02, 0x00, 0x32, 0x81, 0x0C, 0x08, 0x2E, 0x52, 0x0C, 0x1C, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x14, 0x03, 0xE8, 0x01, 0x01, 0x00, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCE, 0x00, 0x01, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x15, 0x07, 0x11, 0x2C, 0xD3, 0xD7, 0xE0, 0xE0, 0xE3, 0xE3, 0xE6, 0xE5, 0xE5, 0xEA, 0xF4, 0xD3, 0xCA, 0xF3, 0xF3, 0xEB, 0xF0, 0xE2, 0xF0, 0xEE, 0xF2, 0xF2, 0xF7, 0xF9, 0xFA, 0xFA, 0xFC, 0xFE} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x08} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x08} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xF8, 0xF9, 0xF8, 0xF6, 0xEF, 0xF0, 0xF0, 0xFE, 0xFD, 0xE9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xED} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xED} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFB, 0x1D, 0x05, 0x09, 0x06, 0x03, 0x02, 0xFF, 0x00, 0xFC, 0xFF, 0xFD, 0xFF, 0xFA, 0x0E, 0x19, 0x02, 0x01, 0x02, 0xFB, 0xF5, 0xF5, 0x02, 0x01, 0x05, 0xFE, 0xFB, 0xFD, 0xFE, 0xFC, 0xF7, 0xFB} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE3} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE3} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFA, 0xFD, 0xFE, 0x03, 0xFA, 0x0B, 0xFE, 0x03, 0xB9, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xC7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xC7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0x4B, 0x01, 0x05, 0x02, 0x06, 0x06, 0xFF, 0x03, 0xFA, 0x01, 0xFD, 0xFA, 0x01, 0x1A, 0xE5, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x33} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x33} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0xE0, 0x00, 0x00, 0x28, 0x08, 0x42, 0xDF, 0xFE, 0xE5, 0xFB, 0xFD, 0xF8, 0xED, 0x0F, 0x09, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x0D, 0x00, 0x09, 0x00, 0x10, 0x00, 0x0E, 0x00, 0x23, 0x00, 0x15, 0x00, 0x18, 0x00, 0x17, 0x00, 0x17, 0x00, 0x18, 0x00, 0x18, 0x00, 0x16, 0x00, 0x24, 0x00, 0x25, 0x00, 0x5B, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x63} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x63} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0E, 0xBB, 0x0E, 0xE3, 0x0E, 0x9C, 0x11, 0x30, 0x10, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x00, 0x00, 0x00, 0xD4, 0x86, 0x4A, 0xC6, 0xB4, 0xC2, 0x6E, 0x2B, 0x03, 0x7C, 0x01, 0x48, 0xFD, 0xA3, 0xF6, 0x75, 0x12, 0x58, 0x2D, 0xB7, 0x00, 0x00, 0x00, 0x00, 0xCB, 0xD4, 0x1A, 0x05} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x1C, 0x98, 0x02, 0xD3, 0xFF, 0xB9, 0x30, 0xEF, 0x05, 0x11, 0x05, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x3C, 0x00, 0x50, 0x3C, 0x00, 0x64, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x68, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x69, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0xFF, 0x0B, 0xD6, 0x7E, 0x74, 0x6D, 0xC6, 0x93, 0x0B, 0x0D, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x69, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6B, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xEF, 0x05, 0x11, 0x05, 0x01, 0x00, 0x00, 0x10, 0x01, 0x00, 0x3C, 0x00, 0x50, 0x3C, 0x00, 0x64, 0x3C, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6B, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, +}; + +#endif diff --git a/drivers/power/bq27426_gmfs_desay.h b/drivers/power/bq27426_gmfs_desay.h new file mode 100644 index 0000000000000..eeb676acfa9d2 --- /dev/null +++ b/drivers/power/bq27426_gmfs_desay.h @@ -0,0 +1,822 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + + +#ifndef __BQFS_DESAI_FILE__ +#define __BQFS_DESAI_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_desay[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x13, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 1100}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x63, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x68} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x68} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x79, 0x0F, 0x86, 0x20, 0x21, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x01} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x01} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x04, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4D} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x4D} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x79, 0x00, 0xE8, 0x02, 0x5C, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x41, 0xF3, 0x00, 0x00, 0x00, 0x01, 0x0B, 0xCC, 0x2D, 0x6B, 0x0D, 0x16, 0x00, 0x96, 0x00, 0x32, 0x00, 0x14, 0x03, 0xE8, 0x01, 0x00, 0x78, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCD, 0x00, 0x02, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x53} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x53} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x16, 0x86, 0x11, 0x35, 0xD4, 0xD2, 0xDF, 0xE0, 0xE6, 0xE5, 0xDD, 0xE8, 0xEA, 0xEB, 0xEC, 0xCD, 0xCB, 0xF3, 0xF4, 0xE9, 0xF0, 0xE3, 0xF2, 0xED, 0xF2, 0xF4, 0xF8, 0xF8, 0xFA, 0xF9, 0xFC, 0xFD} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x8B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x8B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xF7, 0xF8, 0xFB, 0xF6, 0xEF, 0xF1, 0xF1, 0xFB, 0xFF, 0xDD, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF7} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xF8, 0x52, 0x04, 0x39, 0x55, 0x0C, 0x05, 0xE4, 0xEF, 0x32, 0xE4, 0xC8, 0xF5, 0x1B, 0x54, 0x66, 0x01, 0xED, 0xEE, 0xD4, 0xE9, 0xD8, 0x10, 0x09, 0xFE, 0xF4, 0xF7, 0xF3, 0xFC, 0xEA, 0xDD, 0xEE} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x80} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x80} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xEB, 0xEC, 0xE7, 0x22, 0xD3, 0x39, 0x07, 0xD7, 0xDB, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xD9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xD9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0x43, 0x01, 0x07, 0x01, 0x09, 0x08, 0x00, 0x03, 0xF9, 0x02, 0xFB, 0x01, 0x00, 0x00, 0x02, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x30} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x30} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0x9F, 0x00, 0x08, 0x2B, 0x3D, 0x05, 0xC7, 0xF7, 0xC6, 0xF9, 0x01, 0x1C, 0xCC, 0xEA, 0x0E, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x72} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x72} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x31, 0x00, 0x31, 0x00, 0x32, 0x00, 0x34, 0x00, 0x35, 0x00, 0x29, 0x00, 0x2E, 0x00, 0x2B, 0x00, 0x2D, 0x00, 0x30, 0x00, 0x30, 0x00, 0x35, 0x00, 0x45, 0x00, 0x64, 0x00, 0xA5, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x70} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x70} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0B, 0xFD, 0x0E, 0xE4, 0x0E, 0xAF, 0x11, 0x29, 0x10, 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x32} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x32} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x00, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x42, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 2000}, + }, +}; + +#endif + + diff --git a/drivers/power/bq27426_gmfs_scud.h b/drivers/power/bq27426_gmfs_scud.h new file mode 100644 index 0000000000000..f587f38a5b7b7 --- /dev/null +++ b/drivers/power/bq27426_gmfs_scud.h @@ -0,0 +1,822 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + + +#ifndef __BQFS_FEIMAOTUI_FILE__ +#define __BQFS_FEIMAOTUI_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_scud[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x13, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 1100}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x63, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x71, 0x0F, 0x96, 0x20, 0x62, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xB8} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xB8} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x01, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x79, 0x00, 0xE8, 0x02, 0x5C, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x3D, 0xE7, 0x00, 0x00, 0x00, 0x01, 0x0B, 0xCC, 0x2D, 0x6B, 0x0D, 0x48, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x00, 0x7F, 0xFF, 0x01, 0x00, 0x73, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCE, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x86} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x86} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x16, 0x64, 0x11, 0x28, 0xDD, 0xDB, 0xDF, 0xE0, 0xDD, 0xDF, 0xE9, 0xE6, 0xDC, 0xE6, 0xE6, 0xE9, 0xE2, 0xE8, 0xED, 0xE6, 0xE3, 0xEE, 0xEC, 0xF2, 0xF1, 0xF5, 0xF8, 0xF8, 0xF8, 0xFA, 0xFB, 0xFC} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xAE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFD, 0xF6, 0xF5, 0xF1, 0xF2, 0xEE, 0xF6, 0xFE, 0xFC, 0xE8, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xEE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFB, 0x1D, 0x04, 0x14, 0x29, 0x14, 0x0A, 0x2B, 0x1B, 0xC7, 0xE7, 0x4B, 0xF7, 0x08, 0xED, 0x21, 0x09, 0x07, 0x0E, 0xF8, 0xDD, 0xD4, 0xFD, 0x08, 0x03, 0xE9, 0xF9, 0xFA, 0xFA, 0xF1, 0xE9, 0xDE} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xE9, 0xFF, 0x06, 0x11, 0xFC, 0x0A, 0x00, 0x14, 0xC3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0x88, 0x01, 0x03, 0x03, 0xF4, 0x0B, 0xBF, 0x4F, 0xFE, 0x06, 0x00, 0xFA, 0xF7, 0x20, 0x82, 0xDB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF2} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0xC9, 0x01, 0x04, 0x12, 0x21, 0xFB, 0xA3, 0x02, 0xDF, 0xF5, 0xFD, 0xE2, 0xED, 0xFD, 0x74, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x5E} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x29, 0x00, 0x29, 0x00, 0x26, 0x00, 0x2A, 0x00, 0x23, 0x00, 0x19, 0x00, 0x19, 0x00, 0x17, 0x00, 0x15, 0x00, 0x14, 0x00, 0x10, 0x00, 0x14, 0x00, 0x18, 0x00, 0x51, 0x00, 0xB3, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x88} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x88} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0B, 0x9B, 0x0E, 0xE6, 0x0E, 0xA7, 0x11, 0x2A, 0x10, 0xEA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7B} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x00, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x42, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 2000}, + }, +}; + +#endif + + diff --git a/drivers/power/bq27426_gmfs_sunwoda.h b/drivers/power/bq27426_gmfs_sunwoda.h new file mode 100644 index 0000000000000..d172381cb2dc8 --- /dev/null +++ b/drivers/power/bq27426_gmfs_sunwoda.h @@ -0,0 +1,822 @@ +/***************************************************************************** +* Copyright 2010 Texas Instruments Corporation, All Rights Reserved. +* Copyright (C) 2018 XiaoMi, Inc. +* TI makes NO WARRANTY as to software products, which are supplied "AS-IS" +*****************************************************************************/ + +/***************************************************************************** +* This code is automatically generated from bqfs/dffs file. * +* DO NOT MODIFY THIS FILE DIRECTLY * +*****************************************************************************/ + + + +#ifndef __BQFS_XINGWANGDA_FILE__ +#define __BQFS_XINGWANGDA_FILE__ + +#include "bqfs_cmd_type.h" + +const bqfs_cmd_t bqfs_sunwoda[] = { + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x01, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x26, 0x04} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x02, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x13, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 1100}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x02, 0x26, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x02, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xA5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x19, 0x28, 0x63, 0x5F, 0xFF, 0x63, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x24, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x7C} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0A, 0x0F, 0x02, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x31, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x64, 0x79, 0x0F, 0x96, 0x20, 0x3D, 0x00, 0x14, 0x04, 0x00, 0x09, 0x04, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xD5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x40, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xD5} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x32, 0x01, 0xC2, 0x30, 0x00, 0x03, 0x08, 0x98, 0x01, 0x00, 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x44, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xF9} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0xF4, 0x00, 0x1E, 0xC8, 0x14, 0x08, 0x00, 0x3C, 0x0E, 0x10, 0x00, 0x0A, 0x46, 0x05, 0x14, 0x05, 0x0F, 0x03, 0x20, 0x7F, 0xFF, 0x00, 0xF0, 0x46, 0x50, 0x18, 0x01, 0x90, 0x00, 0x64, 0x19} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xE4} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xDC, 0x5C, 0x60, 0x00, 0x7D, 0x00, 0x04, 0x03, 0x19, 0x25, 0x0F, 0x14, 0x0A, 0x78, 0x60, 0x28, 0x01, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x43, 0x80, 0x04, 0x01, 0x14, 0x00, 0x08, 0x0B, 0xB8, 0x01} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDB} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x2C, 0x01, 0x01, 0x0A, 0x00, 0x00, 0x00, 0xC8, 0x00, 0x64, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0xD0, 0x01, 0x03, 0x5A, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x50, 0x02} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x62} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x01, 0x79, 0x00, 0xE8, 0x02, 0x5C, 0x00, 0x3C, 0x3C, 0x01, 0xB3, 0xB3, 0x01, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x51, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xCF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x40, 0x61, 0x00, 0x00, 0x1E, 0x01, 0x0B, 0xCC, 0x2D, 0x6B, 0x0C, 0xE4, 0x00, 0xC8, 0x00, 0x32, 0x00, 0x00, 0x7F, 0xFF, 0x01, 0x00, 0x79, 0x00, 0x0A, 0xFF, 0xCE, 0xFF, 0xCE, 0x00, 0x01, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x49} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x52, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x49} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x16, 0x33, 0x11, 0x2B, 0xDD, 0xDE, 0xE0, 0xE1, 0xE2, 0xE2, 0xE4, 0xE4, 0xE3, 0xE5, 0xE9, 0xE3, 0xD7, 0xE7, 0xED, 0xEA, 0xE8, 0xEB, 0xEA, 0xF0, 0xF2, 0xF5, 0xF5, 0xF8, 0xF9, 0xFB, 0xF9, 0xFD} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDE} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFB, 0xF6, 0xF7, 0xF6, 0xF2, 0xEF, 0xF4, 0xFA, 0xDA, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x78} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x53, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x78} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xF9, 0xD9, 0x05, 0x10, 0x0B, 0x03, 0xFF, 0xFD, 0xFF, 0xFC, 0xFD, 0x04, 0x01, 0xF9, 0x06, 0x2C, 0x07, 0x0B, 0xF7, 0xE9, 0xF4, 0x05, 0x03, 0x02, 0xFF, 0x02, 0xFD, 0xFA, 0xF8, 0x01, 0xEA, 0xF2} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x29} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x29} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFC, 0xF7, 0xF8, 0x05, 0x06, 0x03, 0x0D, 0xC9, 0x12, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x9D} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x54, 0x01} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x9D} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFF, 0xA9, 0x00, 0x03, 0x05, 0x01, 0xFC, 0x07, 0x08, 0xF4, 0xFE, 0xF9, 0xF7, 0x01, 0x02, 0x36, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x55, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xDA} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0xFE, 0x94, 0x00, 0xED, 0x1A, 0x23, 0x05, 0xD9, 0xFF, 0xF0, 0x03, 0x07, 0xFD, 0x19, 0x33, 0x13, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x07} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6C, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x07} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x00, 0x2D, 0x00, 0x26, 0x00, 0x28, 0x00, 0x32, 0x00, 0x2D, 0x00, 0x26, 0x00, 0x28, 0x00, 0x28, 0x00, 0x2A, 0x00, 0x2B, 0x00, 0x2B, 0x00, 0x31, 0x00, 0x3A, 0x00, 0x3C, 0x00, 0x4F, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x39} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x59, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x39} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x0C, 0x99, 0x0E, 0xE3, 0x0E, 0xAD, 0x11, 0x0D, 0x10, 0xEA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x96} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x6D, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0x96} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x40, + .data = {.bytes = {0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} } , + .data_len = 32, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 10}, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x3E, + .data = {.bytes = {0x70, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_C, + .addr = 0xAA, + .reg = 0x60, + .data = {.bytes = {0xFF} } , + .data_len = 1, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x00, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_W, + .addr = 0xAA, + .reg = 0x00, + .data = {.bytes = {0x42, 0x00} } , + .data_len = 2, + }, + { + .cmd_type = CMD_X, + .data = {.delay = 2000}, + }, +}; + +#endif + + diff --git a/drivers/power/bqfs_cmd_type.h b/drivers/power/bqfs_cmd_type.h new file mode 100644 index 0000000000000..311779ec6b5ce --- /dev/null +++ b/drivers/power/bqfs_cmd_type.h @@ -0,0 +1,42 @@ + + +#ifndef __BQFS_CMD_TYPE__ +#define __BQFS_CMD_TYPE__ + + +#define CMD_MAX_DATA_SIZE 110 +#define RETRY_LIMIT 3 +#define CMD_RETRY_DELAY 100 /* in ms */ + +#ifdef __GNUC__ +#define __PACKED __attribute__((packed)) +#else +#error "Make sure structure cmd_t is packed" +#endif + +typedef enum { + CMD_INVALID = 0, + CMD_R, /* Read */ + CMD_W, /* Write */ + CMD_C, /* Compare */ + CMD_X, /* Delay */ +} cmd_type_t; + +/* + * DO NOT change the order of fields - particularly reg + * should be immediately followed by data + */ +typedef struct { + cmd_type_t cmd_type; + u8 addr; + u8 reg; + union { + u8 bytes[CMD_MAX_DATA_SIZE + 1]; + u16 delay; + } data; + u8 data_len; + u16 line_num; +} __PACKED bqfs_cmd_t; + + +#endif diff --git a/drivers/power/cw2015_battery.c b/drivers/power/cw2015_battery.c new file mode 100644 index 0000000000000..06cba04f01b48 --- /dev/null +++ b/drivers/power/cw2015_battery.c @@ -0,0 +1,1300 @@ +/* + * Gas_Gauge driver for CW2015/2013 + * Copyright (C) 2012, CellWise + * Copyright (C) 2018 XiaoMi, Inc. + * + * Authors: ChenGang + * + * 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.And this driver depends on + * I2C and uses IIC bus for communication with the host. + * + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + + +#define REG_VERSION 0x0 +#define REG_VCELL 0x2 +#define REG_SOC 0x4 +#define REG_RRT_ALERT 0x6 +#define REG_CONFIG 0x8 +#define REG_MODE 0xA +#define REG_BATINFO 0x10 + +#define MODE_SLEEP_MASK (0x3<<6) +#define MODE_SLEEP (0x3<<6) +#define MODE_NORMAL (0x0<<6) +#define MODE_QUICK_START (0x3<<4) +#define MODE_RESTART (0xf<<0) + +#define CONFIG_UPDATE_FLG (0x1<<1) +#define ATHD (0x0<<3) + + +#define BATTERY_UP_MAX_CHANGE 420 +#define BATTERY_DOWN_CHANGE 60 +#define BATTERY_DOWN_MIN_CHANGE_RUN 30 +#define BATTERY_DOWN_MIN_CHANGE_SLEEP 1800 +#define BATTERY_DOWN_MAX_CHANGE_RUN_AC_ONLINE 1800 + + + +#define BAT_LOW_INTERRUPT 0 +#define INVALID_GPIO (-1) +#define GPIO_LOW 0 +#define GPIO_HIGH 1 +#define USB_CHARGER_MODE 1 +#define AC_CHARGER_MODE 2 +int cw_capacity; + +struct cw_battery { + struct i2c_client *client; + struct workqueue_struct *battery_workqueue; + struct delayed_work battery_delay_work; + + struct delayed_work bat_low_wakeup_work; + const struct cw_bat_platform_data *plat_data; + struct power_supply rk_bat; + struct power_supply *batt_psy; + + + + long sleep_time_capacity_change; + long run_time_capacity_change; + + long sleep_time_charge_start; + long run_time_charge_start; + + int charger_mode; + int charger_init_mode; + int capacity; + int voltage; + int status; + int time_to_empty; + int alt; + + int bat_change; + struct regulator *vcc_i2c; + struct pinctrl *ts_pinctrl; + struct pinctrl_state *pinctrl_state_active; + struct pinctrl_state *pinctrl_state_suspend; + struct pinctrl_state *pinctrl_state_release; +}; + + +static u8 config_info[SIZE_BATINFO] = { + #include "profile_WT801_88509_NT_XinWangDa.h" +}; +static u8 config_info_xinwangda[SIZE_BATINFO] = { + #include "profile_WT801_88509_NT_XinWangDa.h" +}; +static u8 config_info_feimaotui[SIZE_BATINFO] = { + #include "profile_WT1001_88509_NT_Feimaotui.h" +}; + + + + +/* write data to address */ +static int cw_i2c_write( + struct i2c_client *client, + u8 addr, + u8 *pdata, + unsigned int datalen) +{ + int ret = 0; + u8 tmp_buf[128]; + unsigned int bytelen = 0; + + if (datalen > 125) { + pr_debug("%s too big datalen = %d!\n", __func__, datalen); + return -EPERM; + } + + tmp_buf[0] = addr; + bytelen++; + + if (datalen != 0 && pdata != NULL) { + memcpy(&tmp_buf[bytelen], pdata, datalen); + bytelen += datalen; + } + ret = i2c_master_send(client, tmp_buf, bytelen); + return ret; +} + +/* read data from addr */ +static int cw_i2c_read( + struct i2c_client *client, + u8 addr, + u8 *pdata, + unsigned int datalen) +{ + int ret = 0; + if (datalen > 126) { + pr_debug("%s too big datalen = %d!\n", __func__, datalen); + return -EPERM; + } + + /* set data address */ + ret = cw_i2c_write(client, addr, NULL, 0); + if (ret < 0) { + pr_debug("%s set data address fail!, ret is %d\n", __func__, ret); + return ret; + } + /* read data */ + return i2c_master_recv(client, pdata, datalen); +} + +static int cw_update_config_info(struct cw_battery *cw_bat) +{ + int ret; + u8 reg_val; + int i; + u8 reset_val; + + pr_debug("func: %s-------\n", __func__); + + /* make sure no in sleep mode */ + ret = cw_i2c_read(cw_bat->client, REG_MODE, ®_val, 1); + if (ret < 0) + return ret; + + reset_val = reg_val; + if ((reg_val & MODE_SLEEP_MASK) == MODE_SLEEP) { + dev_err(&cw_bat->client->dev, "Error, device in sleep mode, cannot update battery info\n"); + return -EPERM; + } + + /* update new battery info */ + for (i = 0; i < SIZE_BATINFO; i++) { + pr_debug("cw_bat->plat_data->cw_bat_config_info[%d] = 0x%x\n", i, \ + cw_bat->plat_data->cw_bat_config_info[i]); + ret = cw_i2c_write(cw_bat->client, REG_BATINFO + i, &cw_bat->plat_data->cw_bat_config_info[i], 1); + + if (ret < 0) + return ret; + } + + /* readback & check */ + for (i = 0; i < SIZE_BATINFO; i++) { + ret = cw_i2c_read(cw_bat->client, REG_BATINFO + i, ®_val, 1); + if (reg_val != cw_bat->plat_data->cw_bat_config_info[i]) + return -EPERM; + } + + /* set cw2015/cw2013 to use new battery info */ + ret = cw_i2c_read(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + + reg_val |= CONFIG_UPDATE_FLG; /* set UPDATE_FLAG */ + reg_val &= 0x07; /* clear ATHD */ + reg_val |= ATHD; /* set ATHD */ + ret = cw_i2c_write(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + + /* check 2015/cw2013 for ATHD & update_flag */ + ret = cw_i2c_read(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + + if (!(reg_val & CONFIG_UPDATE_FLG)) { + + pr_debug("update flag for new battery info have not set..\n"); + reg_val = MODE_SLEEP; + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + pr_debug("report battery capacity error"); + return -EPERM; + + } + + if ((reg_val & 0xf8) != ATHD) { + pr_debug("the new ATHD have not set..\n"); + } + + /* reset */ + reset_val &= ~(MODE_RESTART); + reg_val = reset_val | MODE_RESTART; + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + if (ret < 0) + return ret; + + msleep(10); + ret = cw_i2c_write(cw_bat->client, REG_MODE, &reset_val, 1); + if (ret < 0) + return ret; + + return 0; +} + +static int cw_check_ic(struct cw_battery *cw_bat) +{ + int ret = 1 ; + u8 reg_val = 0; + + ret = cw_i2c_read(cw_bat->client, REG_MODE/*REG_VERSION*/, ®_val, 1); + + if (ret < 0) { + if (ret == -107) { + return -107; + } else { + return ret; + } + } + if ((reg_val == 0xC0) || (reg_val == 0x00)) { + ret = 0; + } + + return ret; +} + +static int cw_init(struct cw_battery *cw_bat) +{ + int ret; + int i; + u8 reg_val = MODE_SLEEP; + if ((reg_val & MODE_SLEEP_MASK) == MODE_SLEEP) { + reg_val = MODE_NORMAL; + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + if (ret < 0) + return ret; + } + + ret = cw_i2c_read(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + + if ((reg_val & 0xf8) != ATHD) { + pr_debug("the new ATHD have not set\n"); + reg_val &= 0x07; /* clear ATHD */ + reg_val |= ATHD; /* set ATHD */ + ret = cw_i2c_write(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + } + + ret = cw_i2c_read(cw_bat->client, REG_CONFIG, ®_val, 1); + if (ret < 0) + return ret; + + if (!(reg_val & CONFIG_UPDATE_FLG)) { + pr_debug("update flag for new battery info have not set\n"); + ret = cw_update_config_info(cw_bat); + if (ret < 0) + return ret; + } else { + for (i = 0; i < SIZE_BATINFO; i++) { + ret = cw_i2c_read(cw_bat->client, (REG_BATINFO + i), ®_val, 1); + if (ret < 0) + return ret; + + if (cw_bat->plat_data->cw_bat_config_info[i] != reg_val) + break; + } + + if (i != SIZE_BATINFO) { + pr_debug("update flag for new battery info have not set\n"); + ret = cw_update_config_info(cw_bat); + if (ret < 0) + return ret; + } + } + + for (i = 0; i < 30; i++) { + msleep(100); + ret = cw_i2c_read(cw_bat->client, REG_SOC, ®_val, 1); + if (ret < 0) + return ret; + else if (reg_val <= 0x64) + break; + + if (i > 25) + dev_err(&cw_bat->client->dev, "cw2015/cw2013 input unvalid power error\n"); + + } + if (i >= 30) { + reg_val = MODE_SLEEP; + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + pr_debug("report battery capacity error"); + return -EPERM; + } + return 0; +} + +static void cw_update_time_member_charge_start(struct cw_battery *cw_bat) +{ + struct timespec ts; + int new_run_time; + int new_sleep_time; + + ktime_get_ts(&ts); + new_run_time = ts.tv_sec; + + get_monotonic_boottime(&ts); + new_sleep_time = ts.tv_sec - new_run_time; + + cw_bat->run_time_charge_start = new_run_time; + cw_bat->sleep_time_charge_start = new_sleep_time; +} + +static void cw_update_time_member_capacity_change(struct cw_battery *cw_bat) +{ + struct timespec ts; + int new_run_time; + int new_sleep_time; + + ktime_get_ts(&ts); + new_run_time = ts.tv_sec; + + get_monotonic_boottime(&ts); + new_sleep_time = ts.tv_sec - new_run_time; + + cw_bat->run_time_capacity_change = new_run_time; + cw_bat->sleep_time_capacity_change = new_sleep_time; +} + +static int cw_quickstart(struct cw_battery *cw_bat) +{ + int ret = 0; + u8 reg_val = MODE_QUICK_START; + + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + if (ret < 0) { + dev_err(&cw_bat->client->dev, "Error quick start1\n"); + return ret; + } + + reg_val = MODE_NORMAL; + ret = cw_i2c_write(cw_bat->client, REG_MODE, ®_val, 1); + if (ret < 0) { + dev_err(&cw_bat->client->dev, "Error quick start2\n"); + return ret; + } + return 1; +} + +static int cw_get_capacity(struct cw_battery *cw_bat) +{ + + int ret; + u8 reg_val[2]; + + struct timespec ts; + long new_run_time; + long new_sleep_time; + long capacity_or_aconline_time; + int allow_change; + int allow_capacity; + static int if_quickstart; + static int jump_flag; + static int jump_flag2; + static int reset_loop; + int charge_time; + u8 reset_val; + + + + + ret = cw_i2c_read(cw_bat->client, REG_SOC, reg_val, 2); + if (ret < 0) + return ret; + + cw_capacity = reg_val[0]; + if ((cw_capacity < 0) || (cw_capacity > 100)) { + dev_err(&cw_bat->client->dev, "get cw_capacity error; cw_capacity = %d\n", cw_capacity); + reset_loop++; + + if (reset_loop > 5) { + reset_val = MODE_SLEEP; + ret = cw_i2c_write(cw_bat->client, REG_MODE, &reset_val, 1); + if (ret < 0) + return ret; + reset_val = MODE_NORMAL; + msleep(10); + ret = cw_i2c_write(cw_bat->client, REG_MODE, &reset_val, 1); + if (ret < 0) + return ret; + pr_debug("report battery capacity error"); + ret = cw_update_config_info(cw_bat); + if (ret) + return ret; + reset_loop = 0; + } + return cw_capacity; + } else { + reset_loop = 0; + } + + if (cw_capacity == 0) + pr_debug("the cw201x capacity is 0 !!!!!!!, funciton: %s, line: %d\n", __func__, __LINE__); + else + pr_debug("the cw201x capacity is %d, funciton: %s\n", cw_capacity, __func__); + + + + ktime_get_ts(&ts); + new_run_time = ts.tv_sec; + + get_monotonic_boottime(&ts); + new_sleep_time = ts.tv_sec - new_run_time; + + if (((cw_bat->charger_mode > 0) && (cw_capacity <= (cw_bat->capacity - 1)) && (cw_capacity > (cw_bat->capacity - 30/*9*/))) + || ((cw_bat->charger_mode == 0) && (cw_capacity == (cw_bat->capacity + 1)))) { + + if (!(cw_capacity == 0 && cw_bat->capacity <= 2)) { + cw_capacity = cw_bat->capacity; + } + } + + if ((cw_bat->charger_mode > 0) && (cw_capacity >= 95) && (cw_capacity <= cw_bat->capacity)) { + + capacity_or_aconline_time = (cw_bat->sleep_time_capacity_change > cw_bat->sleep_time_charge_start) ? cw_bat->sleep_time_capacity_change : cw_bat->sleep_time_charge_start; + capacity_or_aconline_time += (cw_bat->run_time_capacity_change > cw_bat->run_time_charge_start) ? cw_bat->run_time_capacity_change : cw_bat->run_time_charge_start; + allow_change = (new_sleep_time + new_run_time - capacity_or_aconline_time) / BATTERY_UP_MAX_CHANGE; + if (allow_change > 0) { + allow_capacity = cw_bat->capacity + allow_change; + cw_capacity = (allow_capacity <= 100) ? allow_capacity : 100; + jump_flag = 1; + } else if (cw_capacity <= cw_bat->capacity) { + cw_capacity = cw_bat->capacity; + } + + } else if ((cw_bat->charger_mode == 0) && cw_bat->capacity == 100 && cw_capacity < cw_bat->capacity && jump_flag2 == 0) { + cw_capacity = cw_bat->capacity; + jump_flag2 = 1; + } else if ((cw_bat->charger_mode == 0) && (cw_capacity <= cw_bat->capacity) && (cw_capacity >= 90) && ((jump_flag == 1) || (jump_flag2 == 1))) { + capacity_or_aconline_time = (cw_bat->sleep_time_capacity_change > cw_bat->sleep_time_charge_start) ? cw_bat->sleep_time_capacity_change : cw_bat->sleep_time_charge_start; + capacity_or_aconline_time += (cw_bat->run_time_capacity_change > cw_bat->run_time_charge_start) ? cw_bat->run_time_capacity_change : cw_bat->run_time_charge_start; + allow_change = (new_sleep_time + new_run_time - capacity_or_aconline_time) / BATTERY_DOWN_CHANGE; + if (allow_change > 0) { + allow_capacity = cw_bat->capacity - allow_change; + if (cw_capacity >= allow_capacity) { + jump_flag = 0; + jump_flag2 = 0; + } else{ + cw_capacity = (allow_capacity <= 100) ? allow_capacity : 100; + } + } else if (cw_capacity <= cw_bat->capacity) { + cw_capacity = cw_bat->capacity; + } + } + + if ((cw_capacity == 0) && (cw_bat->capacity > 1)) { + allow_change = ((new_run_time - cw_bat->run_time_capacity_change) / BATTERY_DOWN_MIN_CHANGE_RUN); + allow_change += ((new_sleep_time - cw_bat->sleep_time_capacity_change) / BATTERY_DOWN_MIN_CHANGE_SLEEP); + + allow_capacity = cw_bat->capacity - allow_change; + cw_capacity = (allow_capacity >= cw_capacity) ? allow_capacity : cw_capacity; + pr_debug("report GGIC POR happened"); + reg_val[0] = MODE_NORMAL; + ret = cw_i2c_write(cw_bat->client, REG_MODE, reg_val, 1); + if (ret < 0) + return ret; + pr_debug("report battery capacity jump 0 "); + } + +#if 1 + if ((cw_bat->charger_mode > 0) && (cw_capacity == 0)) { + charge_time = new_sleep_time + new_run_time - cw_bat->sleep_time_charge_start - cw_bat->run_time_charge_start; + if ((charge_time > BATTERY_DOWN_MAX_CHANGE_RUN_AC_ONLINE) && (if_quickstart == 0)) { + cw_quickstart(cw_bat); + reset_val = MODE_SLEEP; + ret = cw_i2c_write(cw_bat->client, REG_MODE, &reset_val, 1); + if (ret < 0) + return ret; + reset_val = MODE_NORMAL; + msleep(10); + ret = cw_i2c_write(cw_bat->client, REG_MODE, &reset_val, 1); + if (ret < 0) + return ret; + pr_debug("report battery capacity error"); + ret = cw_update_config_info(cw_bat); + if (ret) + return ret; + pr_debug("report battery capacity still 0 if in changing"); + if_quickstart = 1; + } + } else if ((if_quickstart == 1) && (cw_bat->charger_mode == 0)) { + if_quickstart = 0; + } + +#endif + +#ifdef SYSTEM_SHUTDOWN_VOLTAGE + if ((cw_bat->charger_mode == 0) && (cw_capacity <= 20) && (cw_bat->voltage <= SYSTEM_SHUTDOWN_VOLTAGE)) { + if (if_quickstart == 10) { + + allow_change = ((new_run_time - cw_bat->run_time_capacity_change) / BATTERY_DOWN_MIN_CHANGE_RUN); + allow_change += ((new_sleep_time - cw_bat->sleep_time_capacity_change) / BATTERY_DOWN_MIN_CHANGE_SLEEP); + + allow_capacity = cw_bat->capacity - allow_change; + cw_capacity = (allow_capacity >= 0) ? allow_capacity : 0; + + if (cw_capacity < 1) { + cw_quickstart(cw_bat); + if_quickstart = 12; + cw_capacity = 0; + } + } else if (if_quickstart <= 10) + if_quickstart = if_quickstart+2; + pr_debug("the cw201x voltage is less than SYSTEM_SHUTDOWN_VOLTAGE !!!!!!!, funciton: %s, line: %d\n", __func__, __LINE__); + } else if ((cw_bat->charger_mode > 0) && (if_quickstart <= 12)) { + if_quickstart = 0; + } +#endif + return cw_capacity; +} + +static int cw_get_vol(struct cw_battery *cw_bat) +{ + int ret; + u8 reg_val[2]; + u16 value16, value16_1, value16_2, value16_3; + int voltage; + + ret = cw_i2c_read(cw_bat->client, REG_VCELL, reg_val, 2); + if (ret < 0) + return ret; + value16 = (reg_val[0] * 256) + reg_val[1]; + + ret = cw_i2c_read(cw_bat->client, REG_VCELL, reg_val, 2); + if (ret < 0) + return ret; + value16_1 = (reg_val[0] << 8) + reg_val[1]; + + ret = cw_i2c_read(cw_bat->client, REG_VCELL, reg_val, 2); + if (ret < 0) + return ret; + value16_2 = (reg_val[0] << 8) + reg_val[1]; + + + if (value16 > value16_1) { + value16_3 = value16; + value16 = value16_1; + value16_1 = value16_3; + } + + if (value16_1 > value16_2) { + value16_3 = value16_1; + value16_1 = value16_2; + value16_2 = value16_3; + } + + if (value16 > value16_1) { + value16_3 = value16; + value16 = value16_1; + value16_1 = value16_3; + } + + voltage = value16_1 * 312 / 1024; + voltage = voltage * 1000; + + pr_debug("get cw_voltage : cw_voltage = %d\n", voltage); + + return voltage; +} + +#ifdef BAT_LOW_INTERRUPT +static int cw_get_alt(struct cw_battery *cw_bat) +{ + int ret = 0; + u8 reg_val; + u8 value8 = 0; + int alrt; + + ret = cw_i2c_read(cw_bat->client, REG_RRT_ALERT, ®_val, 1); + if (ret < 0) + return ret; + value8 = reg_val; + alrt = value8 >> 7; + + + value8 = value8&0x7f; + reg_val = value8; + ret = cw_i2c_write(cw_bat->client, REG_RRT_ALERT, ®_val, 1); + if (ret < 0) { + dev_err(&cw_bat->client->dev, "Error clear ALRT\n"); + return ret; + } + return alrt; +} +#endif + +static int cw_get_time_to_empty(struct cw_battery *cw_bat) +{ + int ret; + u8 reg_val; + u16 value16; + + ret = cw_i2c_read(cw_bat->client, REG_RRT_ALERT, ®_val, 1); + if (ret < 0) + return ret; + + value16 = reg_val; + + ret = cw_i2c_read(cw_bat->client, REG_RRT_ALERT + 1, ®_val, 1); + if (ret < 0) + return ret; + + value16 = ((value16 << 8) + reg_val) & 0x1fff; + return value16; +} + +static void rk_bat_update_capacity(struct cw_battery *cw_bat) +{ + + + cw_capacity = cw_get_capacity(cw_bat); + if ((cw_capacity >= 0) && (cw_capacity <= 100) && (cw_bat->capacity != cw_capacity)) { + cw_bat->capacity = cw_capacity; + cw_bat->bat_change = 1; + cw_update_time_member_capacity_change(cw_bat); + + if (cw_bat->capacity == 0) + pr_debug("report battery capacity 0 and will shutdown if no changing"); + } +} + + +static void rk_bat_update_vol(struct cw_battery *cw_bat) +{ + int ret; + ret = cw_get_vol(cw_bat); + if ((ret >= 0) && (cw_bat->voltage != ret)) { + cw_bat->voltage = ret; + cw_bat->bat_change = 1; + } +} + + + +extern int power_supply_get_battery_charge_state(struct power_supply *psy); +static struct power_supply *charge_psy; +static u8 is_charger_plug; + + +static void rk_bat_update_status(struct cw_battery *cw_bat) +{ + int status; + union power_supply_propval ret = {0,}; + + + + + if (!charge_psy) { + charge_psy = power_supply_get_by_name("usb"); + } else{ + is_charger_plug = (u8)power_supply_get_battery_charge_state(charge_psy); + } + + pr_debug("Chaman for test is_charger_plug %d\n", is_charger_plug); + if (is_charger_plug == 0) + cw_bat->charger_mode = POWER_SUPPLY_TYPE_UNKNOWN; + else + cw_bat->charger_mode = USB_CHARGER_MODE; + + if (cw_bat->batt_psy == NULL) + cw_bat->batt_psy = power_supply_get_by_name("battery"); + if (cw_bat->batt_psy) { + /* if battery has been registered, use the status property */ + cw_bat->batt_psy->get_property(cw_bat->batt_psy, + POWER_SUPPLY_PROP_STATUS, &ret); + status = ret.intval; + } else{ + /* Default to false if the battery power supply is not registered. */ + pr_debug("battery power supply is not registered\n"); + status = POWER_SUPPLY_STATUS_UNKNOWN; + } + + if (cw_bat->status != status) { + cw_bat->status = status; + cw_bat->bat_change = 1; + } +} + +static void rk_bat_update_time_to_empty(struct cw_battery *cw_bat) +{ + int ret; + ret = cw_get_time_to_empty(cw_bat); + if ((ret >= 0) && (cw_bat->time_to_empty != ret)) { + cw_bat->time_to_empty = ret; + cw_bat->bat_change = 1; + } + +} + +static void cw_bat_work(struct work_struct *work) +{ + struct delayed_work *delay_work; + struct cw_battery *cw_bat; + + + delay_work = container_of(work, struct delayed_work, work); + cw_bat = container_of(delay_work, struct cw_battery, battery_delay_work); + + rk_bat_update_status(cw_bat); + rk_bat_update_capacity(cw_bat); + rk_bat_update_vol(cw_bat); + rk_bat_update_time_to_empty(cw_bat); + + if (cw_bat->bat_change) { + power_supply_changed(&cw_bat->rk_bat); + cw_bat->bat_change = 0; + } + + queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(10000)); + + pr_debug("cw_bat->bat_change = %d, cw_bat->time_to_empty = %d, cw_bat->capacity = %d, cw_bat->voltage = %d\n", \ + cw_bat->bat_change, cw_bat->time_to_empty, cw_bat->capacity, cw_bat->voltage); +} + +static int rk_battery_get_property(struct power_supply *psy, + enum power_supply_property psp, + union power_supply_propval *val) +{ + int ret = 0; + struct cw_battery *cw_bat; + + cw_bat = container_of(psy, struct cw_battery, rk_bat); + switch (psp) { + case POWER_SUPPLY_PROP_CAPACITY: + val->intval = cw_bat->capacity; + break; + + case POWER_SUPPLY_PROP_PRESENT: + val->intval = cw_bat->voltage <= 0 ? 0 : 1; + break; + + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + val->intval = cw_bat->voltage; + break; + + case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: + val->intval = cw_bat->time_to_empty; + break; + + case POWER_SUPPLY_PROP_TECHNOLOGY: + val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; + break; + + default: + break; + } + return ret; +} + +static enum power_supply_property rk_battery_properties[] = { + POWER_SUPPLY_PROP_CAPACITY, + + + POWER_SUPPLY_PROP_PRESENT, + POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW, + POWER_SUPPLY_PROP_TECHNOLOGY, +}; + +#ifdef BAT_LOW_INTERRUPT + +#define WAKE_LOCK_TIMEOUT (10 * HZ) +static struct wake_lock bat_low_wakelock; + +static void bat_low_detect_do_wakeup(struct work_struct *work) +{ + struct delayed_work *delay_work; + struct cw_battery *cw_bat; + + delay_work = container_of(work, struct delayed_work, work); + cw_bat = container_of(delay_work, struct cw_battery, bat_low_wakeup_work); + pr_debug("func: %s-------\n", __func__); + cw_get_alt(cw_bat); + +} + +static irqreturn_t bat_low_detect_irq_handler(int irq, void *dev_id) +{ + struct cw_battery *cw_bat = dev_id; + + wake_lock_timeout(&bat_low_wakelock, WAKE_LOCK_TIMEOUT); + queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->bat_low_wakeup_work, msecs_to_jiffies(20)); + return IRQ_HANDLED; +} +#endif + +#ifdef CONFIG_PM +static int cw_bat_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cw_battery *cw_bat = i2c_get_clientdata(client); + pr_debug("%s\n", __func__); + cancel_delayed_work(&cw_bat->battery_delay_work); + + pr_debug("cw_bat->capacity:%d\n", cw_bat->capacity); + return 0; +} + +static int cw_bat_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct cw_battery *cw_bat = i2c_get_clientdata(client); + pr_debug("%s\n", __func__); + queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(1)); + pr_debug("cw_bat->capacity:%d\n", cw_bat->capacity); + return 0; +} + +static const struct dev_pm_ops cw_bat_pm_ops = { + .suspend = cw_bat_suspend, + .resume = cw_bat_resume, + +}; +#endif + +#ifdef CONFIG_OF +static int cw_bat_parse_dt(struct device *dev, struct cw_bat_platform_data *pdata) +{ + struct device_node *np = dev->of_node; + pdata->bat_low_pin = of_get_named_gpio_flags(np, + "cw2015,irq-gpio", 0, &pdata->irq_flags); + + return 0; +} +#else +static int cw_bat_parse_dt(struct device *dev, struct cw_bat_platform_data *pdata) +{ + return 0; +} +#endif +#ifdef BAT_LOW_INTERRUPT +#define PINCTRL_STATE_ACTIVE "pmx_ts_active" +#define PINCTRL_STATE_SUSPEND "pmx_ts_suspend" +#define PINCTRL_STATE_RELEASE "pmx_ts_release" +#define CW_I2C_VTG_MIN_UV 1800000 +#define CW_I2C_VTG_MAX_UV 1800000 +#define CW_VIO_LOAD_MAX_UA 10000 +static int cw_bat_regulator_configure(struct cw_battery *cw_bat, bool on) +{ + int retval; + + if (on == false) + goto hw_shutdown; + + cw_bat->vcc_i2c = regulator_get(&cw_bat->client->dev, + "vcc_i2c"); + if (IS_ERR(cw_bat->vcc_i2c)) { + dev_err(&cw_bat->client->dev, + "%s: Failed to get i2c regulator\n", + __func__); + retval = PTR_ERR(cw_bat->vcc_i2c); + goto hw_shutdown; + } + + if (regulator_count_voltages(cw_bat->vcc_i2c) > 0) { + retval = regulator_set_voltage(cw_bat->vcc_i2c, + CW_I2C_VTG_MIN_UV, CW_I2C_VTG_MAX_UV); + if (retval) { + dev_err(&cw_bat->client->dev, + "%s reg set i2c vtg failed retval =%d\n", __func__, + retval); + goto err_set_vtg_i2c; + } + } + return 0; + +err_set_vtg_i2c: + regulator_put(cw_bat->vcc_i2c); + +hw_shutdown: + if (regulator_count_voltages(cw_bat->vcc_i2c) > 0) + regulator_set_voltage(cw_bat->vcc_i2c, 0, + CW_I2C_VTG_MAX_UV); + regulator_put(cw_bat->vcc_i2c); + + return 0; +}; + +static int reg_set_optimum_mode_check(struct regulator *reg, int load_uA) +{ + return (regulator_count_voltages(reg) > 0) ? + regulator_set_optimum_mode(reg, load_uA) : 0; +} + +static int cw_bat_power_on(struct cw_battery *cw_bat, + bool on) { + int retval; + + if (on == false) + goto power_off; + + retval = reg_set_optimum_mode_check(cw_bat->vcc_i2c, CW_VIO_LOAD_MAX_UA); + if (retval < 0) { + dev_err(&cw_bat->client->dev, + "%s Regulator vcc_i2c set_opt failed rc=%d\n", __func__, + retval); + goto power_off; + } + + retval = regulator_enable(cw_bat->vcc_i2c); + if (retval) { + dev_err(&cw_bat->client->dev, + "%s Regulator vcc_i2c enable failed rc=%d\n", __func__, + retval); + goto error_reg_en_vcc_i2c; + } + + msleep(200); + return 0; + +error_reg_en_vcc_i2c: + reg_set_optimum_mode_check(cw_bat->vcc_i2c, 0); + return retval; + +power_off: + reg_set_optimum_mode_check(cw_bat->vcc_i2c, 0); + regulator_disable(cw_bat->vcc_i2c); + + msleep(100); + return 0; +} + +static int cw_bat_pinctrl_init(struct cw_battery *cw_bat) +{ + int retval; + + /* Get pinctrl if target uses pinctrl */ + cw_bat->ts_pinctrl = devm_pinctrl_get(&(cw_bat->client->dev)); + if (IS_ERR_OR_NULL(cw_bat->ts_pinctrl)) { + retval = PTR_ERR(cw_bat->ts_pinctrl); + pr_debug( + "%s Target does not use pinctrl %d\n", __func__, retval); + goto err_pinctrl_get; + } + + cw_bat->pinctrl_state_active + = pinctrl_lookup_state(cw_bat->ts_pinctrl, + PINCTRL_STATE_ACTIVE); + if (IS_ERR_OR_NULL(cw_bat->pinctrl_state_active)) { + retval = PTR_ERR(cw_bat->pinctrl_state_active); + dev_err(&cw_bat->client->dev, + "%s Can not lookup %s pinstate %d\n", + __func__, PINCTRL_STATE_ACTIVE, retval); + goto err_pinctrl_lookup; + } + + cw_bat->pinctrl_state_suspend + = pinctrl_lookup_state(cw_bat->ts_pinctrl, + PINCTRL_STATE_SUSPEND); + if (IS_ERR_OR_NULL(cw_bat->pinctrl_state_suspend)) { + retval = PTR_ERR(cw_bat->pinctrl_state_suspend); + dev_err(&cw_bat->client->dev, + "%s Can not lookup %s pinstate %d\n", + __func__, PINCTRL_STATE_SUSPEND, retval); + goto err_pinctrl_lookup; + } + + return 0; + +err_pinctrl_lookup: + devm_pinctrl_put(cw_bat->ts_pinctrl); +err_pinctrl_get: + cw_bat->ts_pinctrl = NULL; + return retval; +} + + +static int cw_bat_pinctrl_select(struct cw_battery *cw_bat, bool on) +{ + struct pinctrl_state *pins_state; + int ret; + + pins_state = on ? cw_bat->pinctrl_state_active + : cw_bat->pinctrl_state_suspend; + if (!IS_ERR_OR_NULL(pins_state)) { + ret = pinctrl_select_state(cw_bat->ts_pinctrl, pins_state); + if (ret) { + dev_err(&cw_bat->client->dev, + "%s can not set %s pins\n", __func__, + on ? "pmx_ts_active" : "pmx_ts_suspend"); + return ret; + } + } else + dev_err(&cw_bat->client->dev, + "%s not a valid '%s' pinstate\n", __func__, + on ? "pmx_ts_active" : "pmx_ts_suspend"); + + return 0; +} + + +static int cw_bat_gpio_configure(struct cw_battery *cw_bat, bool on) +{ + int retval = 0; + + if (on) { + if (gpio_is_valid(cw_bat->plat_data->bat_low_pin)) { + /* configure irq gpio */ + retval = gpio_request(cw_bat->plat_data->bat_low_pin, + "rmi4_irq_gpio"); + if (retval) { + dev_err(&cw_bat->client->dev, + "%s unable to request gpio [%d]\n", __func__, + cw_bat->plat_data->bat_low_pin); + goto err_irq_gpio_req; + } + retval = gpio_direction_input(cw_bat->plat_data->bat_low_pin); + if (retval) { + dev_err(&cw_bat->client->dev, + "%s unable to set direction for gpio " \ + "[%d]\n", __func__, cw_bat->plat_data->bat_low_pin); + goto err_irq_gpio_dir; + } + } else { + dev_err(&cw_bat->client->dev, + "%s irq gpio not provided\n", __func__); + goto err_irq_gpio_req; + } + + return 0; + } else { + return 0; + } + +err_irq_gpio_dir: + if (gpio_is_valid(cw_bat->plat_data->bat_low_pin)) + gpio_free(cw_bat->plat_data->bat_low_pin); +err_irq_gpio_req: + return retval; +} +#endif + +extern int battery_type_id ; +static int cw_bat_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + struct cw_bat_platform_data *pdata = client->dev.platform_data; + struct cw_battery *cw_bat; + int ret; + int loop = 0; + + pr_debug("\ncw2015/cw2013 driver v1.2 probe start, battery_type_id is %d\n", battery_type_id); + + cw_bat = kzalloc(sizeof(struct cw_battery), GFP_KERNEL); + if (!cw_bat) { + dev_err(&cw_bat->client->dev, "fail to allocate memory\n"); + return -ENOMEM; + } + if (client->dev.of_node) { + pdata = devm_kzalloc(&client->dev, + sizeof(struct cw_bat_platform_data), GFP_KERNEL); + if (!pdata) { + dev_err(&client->dev, + "GTP Failed to allocate memory for pdata\n"); + return -ENOMEM; + } + ret = cw_bat_parse_dt(&client->dev, pdata); + if (ret) + return ret; + } else { + pdata = client->dev.platform_data; + } + + if (!pdata) { + dev_err(&client->dev, "Invalid pdata\n"); + return -EINVAL; + } + + + else if (battery_type_id == 1) { + pdata->cw_bat_config_info = config_info_feimaotui; + } else if (battery_type_id == 2) { + pdata->cw_bat_config_info = config_info_xinwangda; + } else { + pdata->cw_bat_config_info = config_info; + } + + + + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + dev_err(&client->dev, "I2C not supported\n"); + return -ENODEV; + } + + cw_bat->client = client; + i2c_set_clientdata(client, cw_bat); + + cw_bat->plat_data = pdata; + ret = cw_check_ic(cw_bat); + + while ((loop++ < 5) && (ret != 0)) { + pr_debug(" check ret is %d, loop is %d \n" , ret, loop); + ret = cw_check_ic(cw_bat); + } + + + if (ret != 0) { + pr_debug(" wc_check_ic fail ,return ENODEV \n"); + return -ENODEV; + } + + ret = cw_init(cw_bat); + while ((loop++ < 2000) && (ret != 0)) { + ret = cw_init(cw_bat); + } + + if (ret) { + return ret; + } + + cw_bat->rk_bat.name = "rk-bat"; + cw_bat->rk_bat.type = POWER_SUPPLY_TYPE_BATTERY; + cw_bat->rk_bat.properties = rk_battery_properties; + cw_bat->rk_bat.num_properties = ARRAY_SIZE(rk_battery_properties); + cw_bat->rk_bat.get_property = rk_battery_get_property; + ret = power_supply_register(&client->dev, &cw_bat->rk_bat); + if (ret < 0) { + dev_err(&cw_bat->client->dev, "power supply register rk_bat error\n"); + pr_debug("rk_bat_register_fail\n"); + goto rk_bat_register_fail; + } + + cw_bat->charger_mode = 0; + cw_bat->capacity = 0; + cw_bat->voltage = 0; + cw_bat->status = 0; + cw_bat->time_to_empty = 0; + cw_bat->bat_change = 0; + + cw_update_time_member_capacity_change(cw_bat); + cw_update_time_member_charge_start(cw_bat); + + cw_bat->battery_workqueue = create_singlethread_workqueue("rk_battery"); + INIT_DELAYED_WORK(&cw_bat->battery_delay_work, cw_bat_work); + + queue_delayed_work(cw_bat->battery_workqueue, &cw_bat->battery_delay_work, msecs_to_jiffies(10)); + +#ifdef BAT_LOW_INTERRUPT + ret = cw_bat_regulator_configure(cw_bat, true); + if (ret < 0) { + dev_err(&client->dev, "%s Failed to configure regulators\n", __func__); + goto err_reg_configure; + } + + ret = cw_bat_power_on(cw_bat, true); + if (ret < 0) { + dev_err(&client->dev, "%s Failed to power on\n", __func__); + goto err_power_device; + + } + + ret = cw_bat_pinctrl_init(cw_bat); + if (!ret && cw_bat->ts_pinctrl) { + ret = pinctrl_select_state(cw_bat->ts_pinctrl, + cw_bat->pinctrl_state_active); + if (ret < 0) + goto err_pinctrl_select; + } + + ret = cw_bat_gpio_configure(cw_bat, true); + if (ret < 0) { + dev_err(&client->dev, "%s Failed to configure gpios\n", __func__); + goto err_gpio_config; + } + + INIT_DELAYED_WORK(&cw_bat->bat_low_wakeup_work, bat_low_detect_do_wakeup); + wake_lock_init(&bat_low_wakelock, WAKE_LOCK_SUSPEND, "bat_low_detect"); + cw_bat->client->irq = gpio_to_irq(pdata->bat_low_pin); + ret = request_threaded_irq(client->irq, NULL, + bat_low_detect_irq_handler, pdata->irq_flags, + "bat_low_detect", cw_bat); + if (ret) { + dev_err(&client->dev, "request irq failed\n"); + gpio_free(cw_bat->plat_data->bat_low_pin); + } + /*Chaman add for charger detect*/ + charge_psy = power_supply_get_by_name("usb"); + + err_gpio_config: + if (cw_bat->ts_pinctrl) { + ret = cw_bat_pinctrl_select(cw_bat, false); + if (ret < 0) + pr_err("Cannot get idle pinctrl state\n"); + } + err_pinctrl_select: + if (cw_bat->ts_pinctrl) { + pinctrl_put(cw_bat->ts_pinctrl); + } + err_power_device: + cw_bat_power_on(cw_bat, false); + err_reg_configure: + cw_bat_regulator_configure(cw_bat, false); +#endif + + pr_debug("\ncw2015/cw2013 driver v1.2 probe sucess\n"); + return 0; + +rk_bat_register_fail: + pr_debug("cw2015/cw2013 driver v1.2 probe error!!!!\n"); + return ret; +} + +static int cw_bat_remove(struct i2c_client *client) +{ + struct cw_battery *cw_bat = i2c_get_clientdata(client); + pr_debug("%s\n", __func__); + cancel_delayed_work(&cw_bat->battery_delay_work); + return 0; +} + +static const struct i2c_device_id cw_id[] = { + { "cw201x", 0 }, +}; +MODULE_DEVICE_TABLE(i2c, cw_id); + +static struct of_device_id cw2015_match_table[] = { + { .compatible = "cellwise,cw2015", }, + { }, +}; +static struct i2c_driver cw_bat_driver = { + .driver = { + .name = "cw201x", + +#ifdef CONFIG_PM + .pm = &cw_bat_pm_ops, +#endif + .of_match_table = cw2015_match_table, + }, + .probe = cw_bat_probe, + .remove = cw_bat_remove, + .id_table = cw_id, +}; + +static int __init cw_bat_init(void) +{ + return i2c_add_driver(&cw_bat_driver); +} + +static void __exit cw_bat_exit(void) +{ + i2c_del_driver(&cw_bat_driver); +} + +late_initcall(cw_bat_init); +module_exit(cw_bat_exit); + +MODULE_AUTHOR("ben"); +MODULE_DESCRIPTION("cw2015/cw2013 battery driver"); +MODULE_LICENSE("GPL"); diff --git a/drivers/power/pmic-voter.c b/drivers/power/pmic-voter.c index 4ba0db459f032..0e6936805a6c5 100644 --- a/drivers/power/pmic-voter.c +++ b/drivers/power/pmic-voter.c @@ -18,7 +18,7 @@ #include "pmic-voter.h" -#define NUM_MAX_CLIENTS 8 +#define NUM_MAX_CLIENTS 10 struct client_vote { int state; diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c index 27bcf6e2b6858..328483b6a36ab 100644 --- a/drivers/power/power_supply_core.c +++ b/drivers/power/power_supply_core.c @@ -4,6 +4,7 @@ * Copyright © 2007 Anton Vorontsov * Copyright © 2004 Szabolcs Gyurko * Copyright © 2003 Ian Molton + * Copyright (C) 2018 XiaoMi, Inc. * * Modified: 2004, Oct Szabolcs Gyurko * @@ -270,6 +271,26 @@ int power_supply_set_low_power_state(struct power_supply *psy, int value) } EXPORT_SYMBOL(power_supply_set_low_power_state); +int power_supply_get_battery_charge_state(struct power_supply *psy) +{ + union power_supply_propval ret = {0,}; + + if (!psy) { + pr_err("power supply is NULL\n"); + } + + if (psy->get_property) { + psy->get_property(psy, POWER_SUPPLY_PROP_PRESENT, &ret); + } + + pr_debug("online:%d\n", ret.intval); + + return ret.intval; + +} + +EXPORT_SYMBOL(power_supply_get_battery_charge_state); + /** * power_supply_set_dp_dm - * @psy: the power supply to control @@ -765,11 +786,70 @@ static void psy_unregister_cooler(struct power_supply *psy) } #endif + + +int bq_runin_test = 0; +static ssize_t show_StopCharging_Test(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* Disable charging */ + bool charging_enable = false; + struct power_supply *batt_psy = NULL; + int rc; + + bq_runin_test = 1; + batt_psy = power_supply_get_by_name("battery"); + if (batt_psy) { + rc = power_supply_set_charging_enabled(batt_psy, 0); + if (rc) + pr_err("disable charging failed\n"); + pr_err("show_StopCharging_Test : %x success\n", charging_enable); + } else + pr_err("get battery power supply Error!!\n"); + + return sprintf(buf, "chr=%d\n", charging_enable); +} + +static ssize_t store_StopCharging_Test(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + return -EPERM; +} +static DEVICE_ATTR(StopCharging_Test, 0664, show_StopCharging_Test, store_StopCharging_Test); + +static ssize_t show_StartCharging_Test(struct device *dev, struct device_attribute *attr, char *buf) +{ + /* Enable charging */ + bool charging_enable = true; + struct power_supply *batt_psy = NULL; + int rc; + + bq_runin_test = 2; + batt_psy = power_supply_get_by_name("battery"); + if (batt_psy) { + rc = power_supply_set_charging_enabled(batt_psy, 1); + if (rc) + pr_err("enable charging failed\n"); + pr_err("show_StartCharging_Test : %x success\n", charging_enable); + } else + pr_err("get battery power supply Error!!\n"); + + return sprintf(buf, "chr=%d\n", charging_enable); +} + +static ssize_t store_StartCharging_Test(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) +{ + return -EPERM; +} +static DEVICE_ATTR(StartCharging_Test, 0664, show_StartCharging_Test, store_StartCharging_Test); + + + + static int __power_supply_register(struct device *parent, struct power_supply *psy, bool ws) { struct device *dev; int rc; + int ret_device_file = 0; dev = kzalloc(sizeof(*dev), GFP_KERNEL); if (!dev) @@ -819,6 +899,11 @@ static int __power_supply_register(struct device *parent, power_supply_changed(psy); + if (strcmp(psy->name, "battery") == 0) { + pr_err("battery powe supply creat attr file!!\n"); + ret_device_file = device_create_file(dev, &dev_attr_StopCharging_Test); + ret_device_file = device_create_file(dev, &dev_attr_StartCharging_Test); + } return 0; create_triggers_failed: diff --git a/drivers/power/power_supply_sysfs.c b/drivers/power/power_supply_sysfs.c index a444df4623ba2..5f30098c8addc 100644 --- a/drivers/power/power_supply_sysfs.c +++ b/drivers/power/power_supply_sysfs.c @@ -5,6 +5,7 @@ * Copyright © 2007 Anton Vorontsov * Copyright © 2004 Szabolcs Gyurko * Copyright © 2003 Ian Molton + * Copyright (C) 2018 XiaoMi, Inc. * * Modified: 2004, Oct Szabolcs Gyurko * @@ -225,6 +226,7 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(temp_cool), POWER_SUPPLY_ATTR(temp_warm), POWER_SUPPLY_ATTR(system_temp_level), + POWER_SUPPLY_ATTR(charger_type), POWER_SUPPLY_ATTR(resistance), POWER_SUPPLY_ATTR(resistance_capacitive), POWER_SUPPLY_ATTR(resistance_id), @@ -253,6 +255,7 @@ static struct device_attribute power_supply_attrs[] = { POWER_SUPPLY_ATTR(enable_jeita_detection), POWER_SUPPLY_ATTR(battery_info), POWER_SUPPLY_ATTR(battery_info_id), + POWER_SUPPLY_ATTR(charging_call_state), /* Local extensions of type int64_t */ POWER_SUPPLY_ATTR(charge_counter_ext), /* Properties of type `const char *' */ diff --git a/drivers/power/profile_WT1001_88509_NT_Feimaotui.h b/drivers/power/profile_WT1001_88509_NT_Feimaotui.h new file mode 100644 index 0000000000000..4d42c13b01aa0 --- /dev/null +++ b/drivers/power/profile_WT1001_88509_NT_Feimaotui.h @@ -0,0 +1,64 @@ +0x18 +, 0x07 +, 0x6D +, 0x6C +, 0x6B +, 0x6A +, 0x65 +, 0x65 +, 0x56 +, 0x78 +, 0x63 +, 0x49 +, 0x67 +, 0x56 +, 0x47 +, 0x3E +, 0x38 +, 0x2D +, 0x2B +, 0x24 +, 0x2B +, 0x31 +, 0x44 +, 0x4E +, 0x17 +, 0x63 +, 0x0B +, 0x85 +, 0x0D +, 0x1A +, 0x52 +, 0x5D +, 0x78 +, 0x74 +, 0x74 +, 0x78 +, 0x3E +, 0x1B +, 0x5E +, 0x22 +, 0x1C +, 0x3F +, 0x29 +, 0x53 +, 0x81 +, 0x97 +, 0x98 +, 0x23 +, 0x75 +, 0x7A +, 0x95 +, 0xC2 +, 0x7B +, 0x99 +, 0xBA +, 0xCB +, 0x2F +, 0x7D +, 0x72 +, 0xA5 +, 0xB5 +, 0xC1 +, 0x58 +, 0x91 diff --git a/drivers/power/profile_WT702_88509_NT_DeSai.h b/drivers/power/profile_WT702_88509_NT_DeSai.h new file mode 100644 index 0000000000000..55909fd752b27 --- /dev/null +++ b/drivers/power/profile_WT702_88509_NT_DeSai.h @@ -0,0 +1,64 @@ +0x17 +, 0xEC +, 0x6F +, 0x6D +, 0x6D +, 0x68 +, 0x66 +, 0x63 +, 0x58 +, 0x75 +, 0x65 +, 0x44 +, 0x5A +, 0x5C +, 0x4C +, 0x43 +, 0x37 +, 0x2E +, 0x2A +, 0x21 +, 0x1E +, 0x2D +, 0x45 +, 0x54 +, 0x23 +, 0x2E +, 0x0B +, 0x85 +, 0x41 +, 0x63 +, 0x50 +, 0x60 +, 0x70 +, 0x65 +, 0x69 +, 0x69 +, 0x3B +, 0x19 +, 0x7A +, 0x4F +, 0x06 +, 0x39 +, 0x21 +, 0x4D +, 0x86 +, 0x95 +, 0x98 +, 0x4D +, 0x6E +, 0x88 +, 0x98 +, 0xA4 +, 0x50 +, 0x87 +, 0xB0 +, 0xCB +, 0x2F +, 0x7D +, 0x72 +, 0xA5 +, 0xB5 +, 0xC1 +, 0x46 +, 0xAE diff --git a/drivers/power/profile_WT801_88509_NT_XinWangDa.h b/drivers/power/profile_WT801_88509_NT_XinWangDa.h new file mode 100644 index 0000000000000..8ab813520335b --- /dev/null +++ b/drivers/power/profile_WT801_88509_NT_XinWangDa.h @@ -0,0 +1,64 @@ +0x18 +, 0x03 +, 0x6A +, 0x6B +, 0x6D +, 0x6A +, 0x68 +, 0x65 +, 0x60 +, 0x63 +, 0x60 +, 0x54 +, 0x5D +, 0x59 +, 0x48 +, 0x40 +, 0x38 +, 0x31 +, 0x27 +, 0x24 +, 0x28 +, 0x31 +, 0x43 +, 0x4D +, 0x28 +, 0x49 +, 0x0B +, 0x85 +, 0x1C +, 0x37 +, 0x57 +, 0x6E +, 0x79 +, 0x7A +, 0x7A +, 0x7A +, 0x3D +, 0x1A +, 0x62 +, 0x3F +, 0x0A +, 0x44 +, 0x34 +, 0x55 +, 0x82 +, 0x97 +, 0x9B +, 0x13 +, 0x41 +, 0x81 +, 0x94 +, 0xC2 +, 0x74 +, 0x9C +, 0xBC +, 0xCB +, 0x2F +, 0x7D +, 0x72 +, 0xA5 +, 0xB5 +, 0xC1 +, 0x95 +, 0x61 diff --git a/drivers/power/profile_WT902_88509_NT_GuangYu.h b/drivers/power/profile_WT902_88509_NT_GuangYu.h new file mode 100644 index 0000000000000..ac811defb47b9 --- /dev/null +++ b/drivers/power/profile_WT902_88509_NT_GuangYu.h @@ -0,0 +1,64 @@ +0x17 +, 0xFD +, 0x6A +, 0x6B +, 0x6C +, 0x6A +, 0x68 +, 0x66 +, 0x60 +, 0x62 +, 0x5C +, 0x58 +, 0x60 +, 0x5B +, 0x49 +, 0x3D +, 0x38 +, 0x2E +, 0x2A +, 0x21 +, 0x27 +, 0x32 +, 0x42 +, 0x52 +, 0x26 +, 0x31 +, 0x0B +, 0x85 +, 0x46 +, 0x6C +, 0x5E +, 0x73 +, 0x85 +, 0x80 +, 0x81 +, 0x84 +, 0x3D +, 0x1A +, 0x5E +, 0x49 +, 0x07 +, 0x37 +, 0x32 +, 0x54 +, 0x82 +, 0x96 +, 0x9D +, 0x15 +, 0x61 +, 0x80 +, 0x94 +, 0xB9 +, 0x6A +, 0x8A +, 0x98 +, 0xCB +, 0x2F +, 0x7D +, 0x72 +, 0xA5 +, 0xB5 +, 0xC1 +, 0x46 +, 0xAE diff --git a/drivers/power/qcom/debug_core.c b/drivers/power/qcom/debug_core.c index d3620bbbeafa0..ccef04ae9eb24 100644 --- a/drivers/power/qcom/debug_core.c +++ b/drivers/power/qcom/debug_core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, 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 @@ -22,6 +22,8 @@ #include "soc/qcom/msm-core.h" #define MAX_PSTATES 50 +#define NUM_OF_PENTRY 3 /* number of variables for ptable node */ +#define NUM_OF_EENTRY 2 /* number of variables for enable node */ enum arg_offset { CPU_OFFSET, @@ -82,15 +84,28 @@ static struct debugfs_blob_wrapper help_msg = { }; -static void add_to_ptable(uint64_t *arg) +static void add_to_ptable(unsigned int *arg) { struct core_debug *node; int i, cpu = arg[CPU_OFFSET]; + uint32_t freq = arg[FREQ_OFFSET]; + uint32_t power = arg[POWER_OFFSET]; if (!cpu_possible(cpu)) return; + if ((freq == 0) || (power == 0)) { + pr_warn("Incorrect power data\n"); + return; + } + node = &per_cpu(c_dgfs, cpu); + + if (node->len >= MAX_PSTATES) { + pr_warn("Dropped ptable update - no space left.\n"); + return; + } + if (!node->head) { node->head = kzalloc(sizeof(struct cpu_pstate_pwr) * (MAX_PSTATES + 1), @@ -98,24 +113,18 @@ static void add_to_ptable(uint64_t *arg) if (!node->head) return; } - for (i = 0; i < MAX_PSTATES; i++) { - if (node->head[i].freq == arg[FREQ_OFFSET]) { - node->head[i].power = arg[POWER_OFFSET]; + + for (i = 0; i < node->len; i++) { + if (node->head[i].freq == freq) { + node->head[i].power = power; return; } - if (node->head[i].freq == 0) - break; - } - - if (i == MAX_PSTATES) { - pr_warn("Dropped ptable update - no space left.\n"); - return; } /* Insert a new frequency (may need to move things around to keep in ascending order). */ for (i = MAX_PSTATES - 1; i > 0; i--) { - if (node->head[i-1].freq > arg[FREQ_OFFSET]) { + if (node->head[i-1].freq > freq) { node->head[i].freq = node->head[i-1].freq; node->head[i].power = node->head[i-1].power; } else if (node->head[i-1].freq != 0) { @@ -123,23 +132,29 @@ static void add_to_ptable(uint64_t *arg) } } - node->head[i].freq = arg[FREQ_OFFSET]; - node->head[i].power = arg[POWER_OFFSET]; - node->len++; + if (node->len < MAX_PSTATES) { + node->head[i].freq = freq; + node->head[i].power = power; + node->len++; + } if (node->ptr) node->ptr->len = node->len; } -static int split_ptable_args(char *line, uint64_t *arg) +static int split_ptable_args(char *line, unsigned int *arg, uint32_t n) { char *args; int i; int ret = 0; - for (i = 0; line; i++) { + for (i = 0; i < n; i++) { + if (!line) + break; args = strsep(&line, " "); - ret = kstrtoull(args, 10, &arg[i]); + ret = kstrtouint(args, 10, &arg[i]); + if (ret) + return ret; } return ret; } @@ -149,7 +164,7 @@ static ssize_t msm_core_ptable_write(struct file *file, { char *kbuf; int ret; - uint64_t arg[3]; + unsigned int arg[3]; if (len == 0) return 0; @@ -163,7 +178,7 @@ static ssize_t msm_core_ptable_write(struct file *file, goto done; } kbuf[len] = '\0'; - ret = split_ptable_args(kbuf, arg); + ret = split_ptable_args(kbuf, arg, NUM_OF_PENTRY); if (!ret) { add_to_ptable(arg); ret = len; @@ -201,7 +216,7 @@ static int msm_core_ptable_read(struct seq_file *m, void *data) seq_printf(m, "--- CPU%d - Live numbers at %ldC---\n", cpu, node->ptr->temp); print_table(m, msm_core_data[cpu].ptable, - msm_core_data[cpu].len); + node->driver_len); } } return 0; @@ -212,7 +227,7 @@ static ssize_t msm_core_enable_write(struct file *file, { char *kbuf; int ret; - uint64_t arg[3]; + unsigned int arg[3]; int cpu; if (len == 0) @@ -227,7 +242,7 @@ static ssize_t msm_core_enable_write(struct file *file, goto done; } kbuf[len] = '\0'; - ret = split_ptable_args(kbuf, arg); + ret = split_ptable_args(kbuf, arg, NUM_OF_EENTRY); if (ret) goto done; cpu = arg[CPU_OFFSET]; diff --git a/drivers/power/qcom/msm-core.c b/drivers/power/qcom/msm-core.c index fa46b507ab30e..2c35da1b62b11 100644 --- a/drivers/power/qcom/msm-core.c +++ b/drivers/power/qcom/msm-core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -240,10 +240,10 @@ void trigger_cpu_pwr_stats_calc(void) if (cpu_node->sensor_id < 0) continue; - if (cpu_node->temp == prev_temp[cpu]) + if (cpu_node->temp == prev_temp[cpu]) { sensor_get_temp(cpu_node->sensor_id, &temp); - - cpu_node->temp = temp / scaling_factor; + cpu_node->temp = temp / scaling_factor; + } prev_temp[cpu] = cpu_node->temp; @@ -373,7 +373,7 @@ static int update_userspace_power(struct sched_params __user *argp) { int i; int ret; - int cpu; + int cpu = -1; struct cpu_activity_info *node; struct cpu_static_info *sp, *clear_sp; int cpumask, cluster, mpidr; @@ -396,7 +396,7 @@ static int update_userspace_power(struct sched_params __user *argp) } } - if (cpu >= num_possible_cpus()) + if ((cpu < 0) || (cpu >= num_possible_cpus())) return -EINVAL; node = &activity[cpu]; @@ -455,7 +455,7 @@ static int update_userspace_power(struct sched_params __user *argp) spin_unlock(&update_lock); for_each_possible_cpu(cpu) { - if (pdata_valid[cpu]) + if (!pdata_valid[cpu]) continue; blocking_notifier_call_chain( @@ -1069,6 +1069,7 @@ static int msm_core_dev_probe(struct platform_device *pdev) if (ret) goto failed; + INIT_DEFERRABLE_WORK(&sampling_work, samplequeue_handle); ret = msm_core_task_init(&pdev->dev); if (ret) goto failed; @@ -1076,7 +1077,6 @@ static int msm_core_dev_probe(struct platform_device *pdev) for_each_possible_cpu(cpu) set_threshold(&activity[cpu]); - INIT_DEFERRABLE_WORK(&sampling_work, samplequeue_handle); schedule_delayed_work(&sampling_work, msecs_to_jiffies(0)); cpufreq_register_notifier(&cpu_policy, CPUFREQ_POLICY_NOTIFIER); pm_notifier(system_suspend_handler, 0); diff --git a/drivers/power/qcom/msm-pm.c b/drivers/power/qcom/msm-pm.c index df894c4c36c0c..7ff56b93af02b 100644 --- a/drivers/power/qcom/msm-pm.c +++ b/drivers/power/qcom/msm-pm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -87,6 +87,7 @@ static long *msm_pc_debug_counters; static cpumask_t retention_cpus; static DEFINE_SPINLOCK(retention_lock); +static DEFINE_MUTEX(msm_pc_debug_mutex); static bool msm_pm_is_L1_writeback(void) { @@ -678,33 +679,48 @@ static ssize_t msm_pc_debug_counters_file_read(struct file *file, char __user *bufu, size_t count, loff_t *ppos) { struct msm_pc_debug_counters_buffer *data; + ssize_t ret; + mutex_lock(&msm_pc_debug_mutex); data = file->private_data; - if (!data) - return -EINVAL; + if (!data) { + ret = -EINVAL; + goto exit; + } - if (!bufu) - return -EINVAL; + if (!bufu) { + ret = -EINVAL; + goto exit; + } - if (!access_ok(VERIFY_WRITE, bufu, count)) - return -EFAULT; + if (!access_ok(VERIFY_WRITE, bufu, count)) { + ret = -EFAULT; + goto exit; + } if (*ppos >= data->len && data->len == 0) data->len = msm_pc_debug_counters_copy(data); - return simple_read_from_buffer(bufu, count, ppos, + ret = simple_read_from_buffer(bufu, count, ppos, data->buf, data->len); +exit: + mutex_unlock(&msm_pc_debug_mutex); + return ret; } static int msm_pc_debug_counters_file_open(struct inode *inode, struct file *file) { struct msm_pc_debug_counters_buffer *buf; + int ret = 0; + mutex_lock(&msm_pc_debug_mutex); - if (!inode->i_private) - return -EINVAL; + if (!inode->i_private) { + ret = -EINVAL; + goto exit; + } file->private_data = kzalloc( sizeof(struct msm_pc_debug_counters_buffer), GFP_KERNEL); @@ -713,19 +729,24 @@ static int msm_pc_debug_counters_file_open(struct inode *inode, pr_err("%s: ERROR kmalloc failed to allocate %zu bytes\n", __func__, sizeof(struct msm_pc_debug_counters_buffer)); - return -ENOMEM; + ret = -ENOMEM; + goto exit; } buf = file->private_data; buf->reg = (long *)inode->i_private; - return 0; +exit: + mutex_unlock(&msm_pc_debug_mutex); + return ret; } static int msm_pc_debug_counters_file_close(struct inode *inode, struct file *file) { + mutex_lock(&msm_pc_debug_mutex); kfree(file->private_data); + mutex_unlock(&msm_pc_debug_mutex); return 0; } diff --git a/drivers/power/qpnp-fg.c b/drivers/power/qpnp-fg.c index d0d7fb6d38a30..89600dbcb56ef 100644 --- a/drivers/power/qpnp-fg.c +++ b/drivers/power/qpnp-fg.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -518,6 +519,7 @@ struct fg_chip { struct fg_wakeup_source update_sram_wakeup_source; bool fg_restarting; bool profile_loaded; + bool soc_reporting_ready; bool use_otp_profile; bool battery_missing; bool power_supply_registered; @@ -528,6 +530,7 @@ struct fg_chip { bool charge_done; bool resume_soc_lowered; bool vbat_low_irq_enabled; + bool full_soc_irq_enabled; bool charge_full; bool hold_soc_while_full; bool input_present; @@ -667,6 +670,7 @@ struct fg_trans { struct fg_chip *chip; struct fg_log_buffer *log; /* log buffer */ u8 *data; /* fg data that is read */ + struct mutex memif_dfs_lock; /* Prevent thread concurrency */ }; struct fg_dbgfs { @@ -842,6 +846,30 @@ static int fg_sec_masked_write(struct fg_chip *chip, u16 addr, u8 mask, u8 val, return rc; } + +static int area_version_flag; +static void get_area_version(struct fg_chip *chip) +{ + char *boardid_string = NULL; + char boardid_start[32] = " "; + int India; + + boardid_string = strstr(saved_command_line, "board_id="); + + if (boardid_string != NULL) { + strncpy(boardid_start, boardid_string+9, 9); + India = strncmp(boardid_start, "S88567CA1", 9); + if (!India) { + pr_err("India version!\n"); + area_version_flag = 1; + } else{ + pr_err("Normal version!\n"); + area_version_flag = 0; + } + } +} + + #define RIF_MEM_ACCESS_REQ BIT(7) static int fg_check_rif_mem_access(struct fg_chip *chip, bool *status) { @@ -1331,8 +1359,11 @@ static void fg_enable_irqs(struct fg_chip *chip, bool enable) if (enable) { enable_irq(chip->soc_irq[DELTA_SOC].irq); enable_irq_wake(chip->soc_irq[DELTA_SOC].irq); - enable_irq(chip->soc_irq[FULL_SOC].irq); - enable_irq_wake(chip->soc_irq[FULL_SOC].irq); + if (!chip->full_soc_irq_enabled) { + enable_irq(chip->soc_irq[FULL_SOC].irq); + enable_irq_wake(chip->soc_irq[FULL_SOC].irq); + chip->full_soc_irq_enabled = true; + } enable_irq(chip->batt_irq[BATT_MISSING].irq); if (!chip->vbat_low_irq_enabled) { enable_irq(chip->batt_irq[VBATT_LOW].irq); @@ -1347,8 +1378,11 @@ static void fg_enable_irqs(struct fg_chip *chip, bool enable) } else { disable_irq_wake(chip->soc_irq[DELTA_SOC].irq); disable_irq_nosync(chip->soc_irq[DELTA_SOC].irq); - disable_irq_wake(chip->soc_irq[FULL_SOC].irq); - disable_irq_nosync(chip->soc_irq[FULL_SOC].irq); + if (chip->full_soc_irq_enabled) { + disable_irq_wake(chip->soc_irq[FULL_SOC].irq); + disable_irq_nosync(chip->soc_irq[FULL_SOC].irq); + chip->full_soc_irq_enabled = false; + } disable_irq(chip->batt_irq[BATT_MISSING].irq); if (chip->vbat_low_irq_enabled) { disable_irq_wake(chip->batt_irq[VBATT_LOW].irq); @@ -1954,11 +1988,6 @@ static void fg_handle_battery_insertion(struct fg_chip *chip) } -static int soc_to_setpoint(int soc) -{ - return DIV_ROUND_CLOSEST(soc * 255, 100); -} - static void batt_to_setpoint_adc(int vbatt_mv, u8 *data) { int val; @@ -2186,9 +2215,6 @@ static int get_prop_capacity(struct fg_chip *chip) if (chip->battery_missing) return MISSING_CAPACITY; - if (!chip->profile_loaded && !chip->use_otp_profile) - return DEFAULT_CAPACITY; - if (chip->charge_full) return FULL_CAPACITY; @@ -2222,6 +2248,18 @@ static int get_prop_capacity(struct fg_chip *chip) return FULL_CAPACITY; } + +#if defined(CONFIG_D1_ROSY) + if (((chip->health == POWER_SUPPLY_HEALTH_COOL) + || (chip->health == POWER_SUPPLY_HEALTH_COLD)) + && msoc >= 247) { + pr_info("wt msoc= %d, chip->health=%d\n", msoc, chip->health); + return DIV_ROUND_CLOSEST((msoc - 1) * (FULL_CAPACITY - 2), + FULL_SOC_RAW - 2) + 2; + } +#endif + + return DIV_ROUND_CLOSEST((msoc - 1) * (FULL_CAPACITY - 2), FULL_SOC_RAW - 2) + 1; } @@ -2957,7 +2995,8 @@ static void update_cycle_count(struct work_struct *work) static int fg_get_cycle_count(struct fg_chip *chip) { - int count; + int count = 0; + int i = 0; if (!chip->cyc_ctr.en) return 0; @@ -2966,11 +3005,34 @@ static int fg_get_cycle_count(struct fg_chip *chip) return -EINVAL; mutex_lock(&chip->cyc_ctr.lock); - count = chip->cyc_ctr.count[chip->cyc_ctr.id - 1]; + for (i = 0; i < BUCKET_COUNT; i++) + count += chip->cyc_ctr.count[i]; + count /= BUCKET_COUNT; mutex_unlock(&chip->cyc_ctr.lock); return count; } +static int fg_set_cycle_count(struct fg_chip *chip, int value) +{ + int rc = 0; + int i = 0; + int address; + u8 data[2]; + + for (i = 0; i < BUCKET_COUNT; i++) { + data[0] = value & 0xFF; + data[1] = value >> 8; + + address = BATT_CYCLE_NUMBER_REG + i * 2; + rc = fg_mem_write(chip, data, address, 2, BATT_CYCLE_OFFSET, 0); + if (rc < 0) + pr_err("failed to write BATT_CYCLE[%d] rc=%d\n", i, rc); + else + chip->cyc_ctr.count[i] = value; + } + return rc; +} + static void half_float_to_buffer(int64_t uval, u8 *buffer) { u16 raw; @@ -3470,6 +3532,7 @@ static int fg_cap_learning_process_full_data(struct fg_chip *chip) int cc_pc_val, rc = -EINVAL; unsigned int cc_soc_delta_pc; int64_t delta_cc_uah; + uint64_t temp; bool batt_missing = is_battery_missing(chip); if (batt_missing) { @@ -3492,9 +3555,8 @@ static int fg_cap_learning_process_full_data(struct fg_chip *chip) goto fail; } - cc_soc_delta_pc = DIV_ROUND_CLOSEST( - abs(cc_pc_val - chip->learning_data.init_cc_pc_val) - * 100, FULL_PERCENT_28BIT); + temp = abs(cc_pc_val - chip->learning_data.init_cc_pc_val); + cc_soc_delta_pc = DIV_ROUND_CLOSEST_ULL(temp * 100, FULL_PERCENT_28BIT); delta_cc_uah = div64_s64( chip->learning_data.learned_cc_uah * cc_soc_delta_pc, @@ -3502,8 +3564,11 @@ static int fg_cap_learning_process_full_data(struct fg_chip *chip) chip->learning_data.cc_uah = delta_cc_uah + chip->learning_data.cc_uah; if (fg_debug_mask & FG_AGING) - pr_info("current cc_soc=%d cc_soc_pc=%d total_cc_uah = %lld\n", + pr_info("current cc_soc=%d cc_soc_pc=%d init_cc_pc_val=%d delta_cc_uah=%lld learned_cc_uah=%lld total_cc_uah = %lld\n", cc_pc_val, cc_soc_delta_pc, + chip->learning_data.init_cc_pc_val, + delta_cc_uah, + chip->learning_data.learned_cc_uah, chip->learning_data.cc_uah); return 0; @@ -3931,8 +3996,15 @@ static void status_change_work(struct work_struct *work) } if (chip->status == POWER_SUPPLY_STATUS_FULL) { +#if defined(CONFIG_D1_ROSY) + + if (capacity >= 99 && chip->hold_soc_while_full + && (chip->health == POWER_SUPPLY_HEALTH_GOOD || chip->health == POWER_SUPPLY_HEALTH_COOL)) { + +#else if (capacity >= 99 && chip->hold_soc_while_full && chip->health == POWER_SUPPLY_HEALTH_GOOD) { +#endif if (fg_debug_mask & FG_STATUS) pr_info("holding soc at 100\n"); chip->charge_full = true; @@ -3949,6 +4021,13 @@ static void status_change_work(struct work_struct *work) enable_irq_wake(chip->batt_irq[VBATT_LOW].irq); chip->vbat_low_irq_enabled = true; } + + if (!chip->full_soc_irq_enabled) { + enable_irq(chip->soc_irq[FULL_SOC].irq); + enable_irq_wake(chip->soc_irq[FULL_SOC].irq); + chip->full_soc_irq_enabled = true; + } + if (!!(chip->wa_flag & PULSE_REQUEST_WA) && capacity == 100) fg_configure_soc(chip); } else if (chip->status == POWER_SUPPLY_STATUS_DISCHARGING) { @@ -3958,6 +4037,12 @@ static void status_change_work(struct work_struct *work) disable_irq_nosync(chip->batt_irq[VBATT_LOW].irq); chip->vbat_low_irq_enabled = false; } + + if (chip->full_soc_irq_enabled) { + disable_irq_wake(chip->soc_irq[FULL_SOC].irq); + disable_irq_nosync(chip->soc_irq[FULL_SOC].irq); + chip->full_soc_irq_enabled = false; + } } fg_cap_learning_check(chip); schedule_work(&chip->update_esr_work); @@ -4013,10 +4098,10 @@ static void status_change_work(struct work_struct *work) } if ((chip->wa_flag & USE_CC_SOC_REG) && chip->bad_batt_detection_en && chip->safety_timer_expired) { - chip->sw_cc_soc_data.delta_soc = - DIV_ROUND_CLOSEST(abs(cc_soc - - chip->sw_cc_soc_data.init_cc_soc) - * 100, FULL_PERCENT_28BIT); + uint64_t delta_cc_soc = abs(cc_soc - + chip->sw_cc_soc_data.init_cc_soc); + chip->sw_cc_soc_data.delta_soc = DIV_ROUND_CLOSEST_ULL( + delta_cc_soc * 100, FULL_PERCENT_28BIT); chip->sw_cc_soc_data.full_capacity = chip->sw_cc_soc_data.delta_soc + chip->sw_cc_soc_data.init_sys_soc; @@ -4072,49 +4157,76 @@ static void check_gain_compensation(struct fg_chip *chip) } } +#define WARNTEMP 30 +#define COOLTEMP 10 + static void fg_hysteresis_config(struct fg_chip *chip) { int hard_hot = 0, hard_cold = 0; + int soft_hot = 0, soft_cold = 0; + soft_hot = get_prop_jeita_temp(chip, FG_MEM_SOFT_HOT); + soft_cold = get_prop_jeita_temp(chip, FG_MEM_SOFT_COLD); hard_hot = get_prop_jeita_temp(chip, FG_MEM_HARD_HOT); hard_cold = get_prop_jeita_temp(chip, FG_MEM_HARD_COLD); + if (chip->health == POWER_SUPPLY_HEALTH_OVERHEAT && !chip->batt_hot) { /* turn down the hard hot threshold */ + set_prop_jeita_temp(chip, FG_MEM_HARD_HOT, hard_hot - chip->hot_hysteresis); chip->batt_hot = true; - set_prop_jeita_temp(chip, FG_MEM_HARD_HOT, - hard_hot - chip->hot_hysteresis); - if (fg_debug_mask & FG_STATUS) - pr_info("hard hot hysteresis: old hot=%d, new hot=%d\n", - hard_hot, hard_hot - chip->hot_hysteresis); - } else if (chip->health == POWER_SUPPLY_HEALTH_COLD && - !chip->batt_cold) { + chip->batt_warm = false; + chip->batt_cold = false; + chip->batt_cold = false; + } else if (chip->health != POWER_SUPPLY_HEALTH_OVERHEAT && chip->batt_hot) { + /* restore the hard hot threshold */ + set_prop_jeita_temp(chip, FG_MEM_HARD_HOT, hard_hot + chip->hot_hysteresis); + chip->batt_hot = false; + chip->batt_warm = true; + chip->batt_cold = false; + chip->batt_cool = false; + } else if (chip->health == POWER_SUPPLY_HEALTH_WARM && !chip->batt_warm) { + /* turn down the soft hot threshold */ + set_prop_jeita_temp(chip, FG_MEM_SOFT_HOT, soft_hot - WARNTEMP); + chip->batt_hot = false; + chip->batt_warm = true; + chip->batt_cold = false; + chip->batt_cool = false; + } else if (chip->health != POWER_SUPPLY_HEALTH_WARM && chip->batt_warm) { + /* restore the soft hot threshold */ + set_prop_jeita_temp(chip, FG_MEM_SOFT_HOT, soft_hot + WARNTEMP); + chip->batt_warm = false; + chip->batt_hot = false; + chip->batt_cold = false; + chip->batt_cool = false; + } else if (chip->health == POWER_SUPPLY_HEALTH_COOL && !chip->batt_cool) { + /* turn up the soft cold threshold */ + set_prop_jeita_temp(chip, FG_MEM_SOFT_COLD, soft_cold + COOLTEMP); + chip->batt_hot = false; + chip->batt_warm = false; + chip->batt_cold = false; + chip->batt_cool = true; + } else if (chip->health != POWER_SUPPLY_HEALTH_COOL && chip->batt_cool) { + /* restore the soft cold threshold */ + set_prop_jeita_temp(chip, FG_MEM_SOFT_COLD, soft_cold - COOLTEMP); + chip->batt_cool = false; + chip->batt_hot = false; + chip->batt_warm = false; + chip->batt_cold = false; + } else if (chip->health == POWER_SUPPLY_HEALTH_COLD && !chip->batt_cold) { /* turn up the hard cold threshold */ + set_prop_jeita_temp(chip, FG_MEM_HARD_COLD, hard_cold + chip->cold_hysteresis); + chip->batt_hot = false; + chip->batt_warm = false; chip->batt_cold = true; - set_prop_jeita_temp(chip, FG_MEM_HARD_COLD, - hard_cold + chip->cold_hysteresis); - if (fg_debug_mask & FG_STATUS) - pr_info("hard cold hysteresis: old cold=%d, new cold=%d\n", - hard_cold, hard_cold + chip->hot_hysteresis); - } else if (chip->health != POWER_SUPPLY_HEALTH_OVERHEAT && - chip->batt_hot) { - /* restore the hard hot threshold */ - set_prop_jeita_temp(chip, FG_MEM_HARD_HOT, - hard_hot + chip->hot_hysteresis); - chip->batt_hot = !chip->batt_hot; - if (fg_debug_mask & FG_STATUS) - pr_info("restore hard hot threshold: old hot=%d, new hot=%d\n", - hard_hot, - hard_hot + chip->hot_hysteresis); + chip->batt_cool = false; } else if (chip->health != POWER_SUPPLY_HEALTH_COLD && chip->batt_cold) { /* restore the hard cold threshold */ - set_prop_jeita_temp(chip, FG_MEM_HARD_COLD, - hard_cold - chip->cold_hysteresis); - chip->batt_cold = !chip->batt_cold; - if (fg_debug_mask & FG_STATUS) - pr_info("restore hard cold threshold: old cold=%d, new cold=%d\n", - hard_cold, - hard_cold - chip->cold_hysteresis); + set_prop_jeita_temp(chip, FG_MEM_HARD_COLD, hard_cold - chip->cold_hysteresis); + chip->batt_cold = false; + chip->batt_hot = false; + chip->batt_warm = false; + chip->batt_cool = true; } } @@ -4144,6 +4256,9 @@ static int fg_init_batt_temp_state(struct fg_chip *chip) (batt_info_sts & JEITA_HARD_HOT_RT_STS) ? true : false; chip->batt_cold = (batt_info_sts & JEITA_HARD_COLD_RT_STS) ? true : false; + chip->batt_warm = false; + chip->batt_cool = false; + if (chip->batt_hot || chip->batt_cold) { if (chip->batt_hot) { chip->health = POWER_SUPPLY_HEALTH_OVERHEAT; @@ -4520,7 +4635,7 @@ static int fg_power_get_property(struct power_supply *psy, val->intval = !!chip->bcl_lpm_disabled; break; case POWER_SUPPLY_PROP_SOC_REPORTING_READY: - val->intval = !!chip->profile_loaded; + val->intval = !!chip->soc_reporting_ready; break; case POWER_SUPPLY_PROP_IGNORE_FALSE_NEGATIVE_ISENSE: val->intval = !chip->allow_false_negative_isense; @@ -4636,8 +4751,8 @@ static int fg_power_set_property(struct power_supply *psy, schedule_work(&chip->set_resume_soc_work); } - if (chip->jeita_hysteresis_support) - fg_hysteresis_config(chip); + + fg_hysteresis_config(chip); break; case POWER_SUPPLY_PROP_CHARGE_DONE: chip->charge_done = val->intval; @@ -4646,6 +4761,10 @@ static int fg_power_set_property(struct power_supply *psy, schedule_work(&chip->set_resume_soc_work); } break; + case POWER_SUPPLY_PROP_CYCLE_COUNT: + rc = fg_set_cycle_count(chip, val->intval); + pr_info("Cycle count is modified to %d by userspace\n", val->intval); + break; case POWER_SUPPLY_PROP_CYCLE_COUNT_ID: if ((val->intval > 0) && (val->intval <= BUCKET_COUNT)) { chip->cyc_ctr.id = val->intval; @@ -4687,6 +4806,7 @@ static int fg_property_is_writeable(struct power_supply *psy, case POWER_SUPPLY_PROP_CYCLE_COUNT_ID: case POWER_SUPPLY_PROP_BATTERY_INFO: case POWER_SUPPLY_PROP_BATTERY_INFO_ID: + case POWER_SUPPLY_PROP_CYCLE_COUNT: return 1; default: break; @@ -5156,6 +5276,7 @@ static irqreturn_t fg_batt_missing_irq_handler(int irq, void *_chip) fg_cap_learning_stop(chip); chip->battery_missing = true; chip->profile_loaded = false; + chip->soc_reporting_ready = false; chip->batt_type = default_batt_type; mutex_lock(&chip->cyc_ctr.lock); if (fg_debug_mask & FG_IRQS) @@ -5342,17 +5463,18 @@ static irqreturn_t fg_first_soc_irq_handler(int irq, void *_chip) static void fg_external_power_changed(struct power_supply *psy) { struct fg_chip *chip = container_of(psy, struct fg_chip, bms_psy); + bool input_present = is_input_present(chip); - if (is_input_present(chip) && chip->rslow_comp.active && + if (input_present ^ chip->rslow_comp.active && chip->rslow_comp.chg_rs_to_rslow > 0 && chip->rslow_comp.chg_rslow_comp_c1 > 0 && chip->rslow_comp.chg_rslow_comp_c2 > 0) schedule_work(&chip->rslow_comp_work); - if (!is_input_present(chip) && chip->resume_soc_lowered) { + if (!input_present && chip->resume_soc_lowered) { fg_stay_awake(&chip->resume_soc_wakeup_source); schedule_work(&chip->set_resume_soc_work); } - if (!is_input_present(chip) && chip->charge_full) + if (!input_present && chip->charge_full) schedule_work(&chip->charge_full_work); } @@ -5417,6 +5539,25 @@ static void set_resume_soc_work(struct work_struct *work) #define RSLOW_COMP_REG 0x528 #define RSLOW_COMP_C1_OFFSET 0 #define RSLOW_COMP_C2_OFFSET 2 +#define BATT_PROFILE_OFFSET 0x4C0 +static void get_default_rslow_comp_settings(struct fg_chip *chip) +{ + int offset; + + offset = RSLOW_CFG_REG + RSLOW_CFG_OFFSET - BATT_PROFILE_OFFSET; + memcpy(&chip->rslow_comp.rslow_cfg, chip->batt_profile + offset, 1); + + offset = RSLOW_THRESH_REG + RSLOW_THRESH_OFFSET - BATT_PROFILE_OFFSET; + memcpy(&chip->rslow_comp.rslow_thr, chip->batt_profile + offset, 1); + + offset = TEMP_RS_TO_RSLOW_REG + RS_TO_RSLOW_CHG_OFFSET - + BATT_PROFILE_OFFSET; + memcpy(&chip->rslow_comp.rs_to_rslow, chip->batt_profile + offset, 2); + + offset = RSLOW_COMP_REG + RSLOW_COMP_C1_OFFSET - BATT_PROFILE_OFFSET; + memcpy(&chip->rslow_comp.rslow_comp, chip->batt_profile + offset, 4); +} + static int populate_system_data(struct fg_chip *chip) { u8 buffer[24]; @@ -5469,37 +5610,7 @@ static int populate_system_data(struct fg_chip *chip) chip->ocv_junction_p1p2, chip->ocv_junction_p2p3); - rc = fg_mem_read(chip, buffer, RSLOW_CFG_REG, 1, RSLOW_CFG_OFFSET, 0); - if (rc) { - pr_err("unable to read rslow cfg: %d\n", rc); - goto done; - } - - chip->rslow_comp.rslow_cfg = buffer[0]; - rc = fg_mem_read(chip, buffer, RSLOW_THRESH_REG, 1, - RSLOW_THRESH_OFFSET, 0); - if (rc) { - pr_err("unable to read rslow thresh: %d\n", rc); - goto done; - } - - chip->rslow_comp.rslow_thr = buffer[0]; - rc = fg_mem_read(chip, buffer, TEMP_RS_TO_RSLOW_REG, 2, - RS_TO_RSLOW_CHG_OFFSET, 0); - if (rc) { - pr_err("unable to read rs to rslow_chg: %d\n", rc); - goto done; - } - - memcpy(chip->rslow_comp.rs_to_rslow, buffer, 2); - rc = fg_mem_read(chip, buffer, RSLOW_COMP_REG, 4, - RSLOW_COMP_C1_OFFSET, 0); - if (rc) { - pr_err("unable to read rslow comp: %d\n", rc); - goto done; - } - - memcpy(chip->rslow_comp.rslow_comp, buffer, 4); + get_default_rslow_comp_settings(chip); done: fg_mem_release(chip); return rc; @@ -5923,7 +6034,6 @@ static void discharge_gain_work(struct work_struct *work) } #define LOW_LATENCY BIT(6) -#define BATT_PROFILE_OFFSET 0x4C0 #define PROFILE_INTEGRITY_REG 0x53C #define PROFILE_INTEGRITY_BIT BIT(0) #define FIRST_EST_DONE_BIT BIT(5) @@ -6175,6 +6285,44 @@ static int fg_do_restart(struct fg_chip *chip, bool write_profile) return -EINVAL; } + +#define REDO_BATID_DURING_FIRST_EST BIT(4) +static void fg_hw_restart(struct fg_chip *chip) +{ + u8 reg, rc; + int batt_id; + u8 data[4]; + + reg = 0x80; + fg_masked_write(chip, 0x4150, reg, reg, 1); + fg_masked_write(chip, chip->soc_base + SOC_RESTART, 0xFF, 0, 1); + mdelay(5); + + reg = REDO_BATID_DURING_FIRST_EST|REDO_FIRST_ESTIMATE; + fg_masked_write(chip, chip->soc_base + SOC_RESTART, reg, reg, 1); + mdelay(5); + + reg = REDO_BATID_DURING_FIRST_EST | REDO_FIRST_ESTIMATE | RESTART_GO; + fg_masked_write(chip, chip->soc_base + SOC_RESTART, reg, reg, 1); + mdelay(1000); + + fg_masked_write(chip, chip->soc_base + SOC_RESTART, 0xFF, 0, 1); + fg_masked_write(chip, 0x4150, 0x80, 0, 1); + + mdelay(2000); + + rc = fg_mem_read(chip, data, fg_data[FG_DATA_BATT_ID].address, + fg_data[FG_DATA_BATT_ID].len, fg_data[FG_DATA_BATT_ID].offset, 0); + if (rc) { + pr_err("XJB Failed to get sram battery id data\n"); + } else { + fg_data[FG_DATA_BATT_ID].value = data[0] * LSB_8B; + } + batt_id = get_sram_prop_now(chip, FG_DATA_BATT_ID); + pr_err("fg_hw_restart. wingtech after restart battery id = %d\n", batt_id); +} + + #define FG_PROFILE_LEN 128 #define PROFILE_COMPARE_LEN 32 #define THERMAL_COEFF_ADDR 0x444 @@ -6189,6 +6337,8 @@ static int fg_batt_profile_init(struct fg_chip *chip) const char *data, *batt_type_str; bool tried_again = false, vbat_in_range, profiles_same; u8 reg = 0; + int value; + wait: fg_stay_awake(&chip->profile_wakeup_source); @@ -6209,6 +6359,21 @@ static int fg_batt_profile_init(struct fg_chip *chip) if (!is_charger_available(chip)) goto reschedule; + + value = get_sram_prop_now(chip, FG_DATA_BATT_ID); + pr_err("wingtech init FG_DATA_BATT_ID =%d\n", value); +#if defined(CONFIG_A13N_PMI8952) + if (!(((value > 85000) && (value < 115000)) || ((value > 57000) && (value < 78000)) || ((value > 24000) && (value < 35000)))) { + + fg_hw_restart(chip); + } + +#elif defined(CONFIG_D1_ROSY) + if (!(((value > 57000) && (value < 78000)) || ((value > 280000) && (value < 380000)))) { + fg_hw_restart(chip); + } +#endif + /* Disable charging for a FG cycle before calculating vbat_in_range */ if (!chip->charging_disabled) { rc = set_prop_enable_charging(chip, false); @@ -6275,6 +6440,12 @@ static int fg_batt_profile_init(struct fg_chip *chip) if (rc) pr_warn("couldn't find battery max voltage\n"); + if (area_version_flag == 1) + chip->batt_max_voltage_uv = 4380000; + + #ifdef CONFIG_DISABLE_TEMP_PROTECT + chip->batt_max_voltage_uv = 4100000; + #endif /* * Only configure from profile if fg-cc-cv-threshold-mv is not @@ -6343,6 +6514,12 @@ static int fg_batt_profile_init(struct fg_chip *chip) pr_info("Battery profiles same, using default\n"); if (fg_est_dump) schedule_work(&chip->dump_sram); + /* + * Copy the profile read from device tree for + * getting profile parameters later. + */ + memcpy(chip->batt_profile, data, len); + chip->batt_profile_len = len; goto done; } } else { @@ -6440,6 +6617,7 @@ static int fg_batt_profile_init(struct fg_chip *chip) chip->first_profile_loaded = true; chip->profile_loaded = true; + chip->soc_reporting_ready = true; chip->battery_missing = is_battery_missing(chip); update_chg_iterm(chip); update_cc_cv_setpoint(chip); @@ -6458,6 +6636,7 @@ static int fg_batt_profile_init(struct fg_chip *chip) complete_all(&chip->fg_reset_done); return rc; no_profile: + chip->soc_reporting_ready = true; if (chip->charging_disabled) { rc = set_prop_enable_charging(chip, true); if (rc) @@ -6560,9 +6739,10 @@ static void charge_full_work(struct work_struct *work) int rc; u8 buffer[3]; int bsoc; - int resume_soc_raw = FULL_SOC_RAW - settings[FG_MEM_RESUME_SOC].value; + int resume_soc_raw = settings[FG_MEM_RESUME_SOC].value; bool disable = false; u8 reg; + int msoc = 0, retry = 0; if (chip->status != POWER_SUPPLY_STATUS_FULL) { if (fg_debug_mask & FG_STATUS) @@ -6605,6 +6785,15 @@ static void charge_full_work(struct work_struct *work) pr_info("wrote %06x into soc full\n", bsoc); } fg_mem_release(chip); + + + while (msoc != 0xFF && retry != 8) { + msleep(200); + msoc = get_monotonic_soc_raw(chip); + retry++; + } + + /* * wait one cycle to make sure the soc is updated before clearing * the soc mask bit @@ -6881,6 +7070,14 @@ static int fg_of_init(struct fg_chip *chip) OF_READ_SETTING(FG_MEM_HARD_HOT, "hot-bat-decidegc", rc, 1); OF_READ_SETTING(FG_MEM_HARD_COLD, "cold-bat-decidegc", rc, 1); + #ifdef CONFIG_DISABLE_TEMP_PROTECT + settings[FG_MEM_HARD_HOT].value = 850; + settings[FG_MEM_SOFT_HOT].value = 850; + settings[FG_MEM_HARD_COLD].value = -250; + settings[FG_MEM_SOFT_COLD].value = -250; + #endif + + if (of_find_property(node, "qcom,cold-hot-jeita-hysteresis", NULL)) { int hard_hot = 0, soft_hot = 0, hard_cold = 0, soft_cold = 0; @@ -6954,6 +7151,9 @@ static int fg_of_init(struct fg_chip *chip) DEFAULT_EVALUATION_CURRENT_MA); OF_READ_PROPERTY(chip->cc_cv_threshold_mv, "fg-cc-cv-threshold-mv", rc, 0); + if (area_version_flag == 1) + chip->cc_cv_threshold_mv = 4370; + if (of_property_read_bool(chip->spmi->dev.of_node, "qcom,capacity-learning-on")) chip->batt_aging_mode = FG_AGING_CC; @@ -7154,6 +7354,8 @@ static int fg_init_irqs(struct fg_chip *chip) chip->soc_irq[FULL_SOC].irq, rc); return rc; } + enable_irq_wake(chip->soc_irq[FULL_SOC].irq); + chip->full_soc_irq_enabled = true; if (!chip->use_vbat_low_empty_soc) { rc = devm_request_irq(chip->dev, @@ -7190,7 +7392,6 @@ static int fg_init_irqs(struct fg_chip *chip) } enable_irq_wake(chip->soc_irq[DELTA_SOC].irq); - enable_irq_wake(chip->soc_irq[FULL_SOC].irq); if (!chip->use_vbat_low_empty_soc) enable_irq_wake(chip->soc_irq[EMPTY_SOC].irq); break; @@ -7437,6 +7638,7 @@ static int fg_memif_data_open(struct inode *inode, struct file *file) trans->addr = dbgfs_data.addr; trans->chip = dbgfs_data.chip; trans->offset = trans->addr; + mutex_init(&trans->memif_dfs_lock); file->private_data = trans; return 0; @@ -7448,6 +7650,7 @@ static int fg_memif_dfs_close(struct inode *inode, struct file *file) if (trans && trans->log && trans->data) { file->private_data = NULL; + mutex_destroy(&trans->memif_dfs_lock); kfree(trans->log); kfree(trans->data); kfree(trans); @@ -7605,10 +7808,13 @@ static ssize_t fg_memif_dfs_reg_read(struct file *file, char __user *buf, size_t ret; size_t len; + mutex_lock(&trans->memif_dfs_lock); /* Is the the log buffer empty */ if (log->rpos >= log->wpos) { - if (get_log_data(trans) <= 0) - return 0; + if (get_log_data(trans) <= 0) { + len = 0; + goto unlock_mutex; + } } len = min(count, log->wpos - log->rpos); @@ -7616,7 +7822,8 @@ static ssize_t fg_memif_dfs_reg_read(struct file *file, char __user *buf, ret = copy_to_user(buf, &log->data[log->rpos], len); if (ret == len) { pr_err("error copy sram register values to user\n"); - return -EFAULT; + len = -EFAULT; + goto unlock_mutex; } /* 'ret' is the number of bytes not copied */ @@ -7624,6 +7831,9 @@ static ssize_t fg_memif_dfs_reg_read(struct file *file, char __user *buf, *ppos += len; log->rpos += len; + +unlock_mutex: + mutex_unlock(&trans->memif_dfs_lock); return len; } @@ -7644,14 +7854,20 @@ static ssize_t fg_memif_dfs_reg_write(struct file *file, const char __user *buf, int cnt = 0; u8 *values; size_t ret = 0; + char *kbuf; + u32 offset; struct fg_trans *trans = file->private_data; - u32 offset = trans->offset; + + mutex_lock(&trans->memif_dfs_lock); + offset = trans->offset; /* Make a copy of the user data */ - char *kbuf = kmalloc(count + 1, GFP_KERNEL); - if (!kbuf) - return -ENOMEM; + kbuf = kmalloc(count + 1, GFP_KERNEL); + if (!kbuf) { + ret = -ENOMEM; + goto unlock_mutex; + } ret = copy_from_user(kbuf, buf, count); if (ret == count) { @@ -7690,6 +7906,8 @@ static ssize_t fg_memif_dfs_reg_write(struct file *file, const char __user *buf, free_buf: kfree(kbuf); +unlock_mutex: + mutex_unlock(&trans->memif_dfs_lock); return ret; } @@ -7887,7 +8105,7 @@ static int fg_common_hw_init(struct fg_chip *chip) } rc = fg_mem_masked_write(chip, settings[FG_MEM_DELTA_SOC].address, 0xFF, - soc_to_setpoint(settings[FG_MEM_DELTA_SOC].value), + settings[FG_MEM_DELTA_SOC].value, settings[FG_MEM_DELTA_SOC].offset); if (rc) { pr_err("failed to write delta soc rc=%d\n", rc); @@ -8323,6 +8541,7 @@ static void ima_error_recovery_work(struct work_struct *work) if (!chip->use_otp_profile) { chip->battery_missing = true; chip->profile_loaded = false; + chip->soc_reporting_ready = false; chip->batt_type = default_batt_type; fg_handle_battery_insertion(chip); } @@ -8668,6 +8887,8 @@ static int fg_probe(struct spmi_device *spmi) } } + get_area_version(chip); + rc = fg_detect_pmic_type(chip); if (rc) { pr_err("Unable to detect PMIC type rc=%d\n", rc); @@ -8876,6 +9097,8 @@ static void fg_shutdown(struct spmi_device *spmi) if (fg_debug_mask & FG_STATUS) pr_emerg("FG shutdown started\n"); + if (chip->rslow_comp.active) + fg_rslow_charge_comp_clear(chip); fg_cancel_all_works(chip); fg_check_ima_idle(chip); chip->fg_shutdown = true; diff --git a/drivers/power/qpnp-smbcharger.c b/drivers/power/qpnp-smbcharger.c index 16820ae2ad64c..25b6e44187949 100644 --- a/drivers/power/qpnp-smbcharger.c +++ b/drivers/power/qpnp-smbcharger.c @@ -1,4 +1,5 @@ /* Copyright (c) 2014-2016 The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -125,11 +126,18 @@ struct smbchg_chip { int bmd_pin_src; int jeita_temp_hard_limit; int aicl_rerun_period_s; + + int customize_cool_low_limit; + int customize_cool_high_limit; + int fcc_customize_cool_ma; + int fcc_batt_cool_ma; + bool use_vfloat_adjustments; bool iterm_disabled; bool bmd_algo_disabled; bool soft_vfloat_comp_disabled; bool chg_enabled; + int call_state; bool charge_unknown_battery; bool chg_inhibit_en; bool chg_inhibit_source_fg; @@ -248,8 +256,12 @@ struct smbchg_chip { struct smbchg_regulator otg_vreg; struct smbchg_regulator ext_otg_vreg; struct work_struct usb_set_online_work; + struct delayed_work period_update_work; struct delayed_work vfloat_adjust_work; struct delayed_work hvdcp_det_work; + + struct delayed_work monitor_charging_temp_5_work; + spinlock_t sec_access_lock; struct mutex therm_lvl_lock; struct mutex usb_set_online_lock; @@ -279,7 +291,9 @@ struct smbchg_chip { struct votable *hw_aicl_rerun_disable_votable; struct votable *hw_aicl_rerun_enable_indirect_votable; struct votable *aicl_deglitch_short_votable; + struct votable *hvdcp_enable_votable; }; +struct smbchg_chip *wt_chip = NULL; enum qpnp_schg { QPNP_SCHG, @@ -310,6 +324,8 @@ enum smbchg_wa { SMBCHG_FLASH_BUCK_SWITCH_FREQ_WA = BIT(7), SMBCHG_ICL_CONTROL_WA = BIT(8), }; +static inline void dump_reg(struct smbchg_chip *chip, u16 addr, + const char *name); enum print_reason { PR_REGISTER = BIT(0), @@ -328,6 +344,7 @@ enum wake_reason { PM_ESR_PULSE = BIT(2), PM_PARALLEL_TAPER = BIT(3), PM_DETECT_HVDCP = BIT(4), + PM_CHARGER_ONLINE = BIT(5), }; enum fcc_voters { @@ -346,6 +363,7 @@ enum icl_voters { SW_AICL_ICL_VOTER, CHG_SUSPEND_WORKAROUND_ICL_VOTER, SHUTDOWN_WORKAROUND_ICL_VOTER, + CALL_ICL_VOTER, NUM_ICL_VOTER, }; @@ -421,12 +439,18 @@ enum aicl_short_deglitch_voters { HVDCP_SHORT_DEGLITCH_VOTER, NUM_HW_SHORT_DEGLITCH_VOTERS, }; -static int smbchg_debug_mask; +enum hvdcp_voters { + HVDCP_PMIC_VOTER, + HVDCP_OTG_VOTER, + HVDCP_PULSING_VOTER, + NUM_HVDCP_VOTERS, +}; +static int smbchg_debug_mask = PR_INTERRUPT | PR_STATUS | PR_MISC; module_param_named( debug_mask, smbchg_debug_mask, int, S_IRUSR | S_IWUSR ); -static int smbchg_parallel_en = 1; +static int smbchg_parallel_en; module_param_named( parallel_en, smbchg_parallel_en, int, S_IRUSR | S_IWUSR ); @@ -443,19 +467,19 @@ module_param_named( int, S_IRUSR | S_IWUSR ); -static int smbchg_default_hvdcp_icl_ma = 1800; +static int smbchg_default_hvdcp_icl_ma = 1200; module_param_named( default_hvdcp_icl_ma, smbchg_default_hvdcp_icl_ma, int, S_IRUSR | S_IWUSR ); -static int smbchg_default_hvdcp3_icl_ma = 3000; +static int smbchg_default_hvdcp3_icl_ma = 2000; module_param_named( default_hvdcp3_icl_ma, smbchg_default_hvdcp3_icl_ma, int, S_IRUSR | S_IWUSR ); -static int smbchg_default_dcp_icl_ma = 1800; +static int smbchg_default_dcp_icl_ma = 2000; module_param_named( default_dcp_icl_ma, smbchg_default_dcp_icl_ma, int, S_IRUSR | S_IWUSR @@ -642,6 +666,30 @@ static int smbchg_sec_masked_write(struct smbchg_chip *chip, u16 base, u8 mask, return rc; } + +static int area_version_flag; +static void get_area_version(struct smbchg_chip *chip) +{ + char *boardid_string = NULL; + char boardid_start[32] = " "; + int India; + + boardid_string = strstr(saved_command_line, "board_id="); + + if (boardid_string != NULL) { + strncpy(boardid_start, boardid_string+9, 9); + India = strncmp(boardid_start, "S88567CA1", 9); + if (!India) { + pr_err("India version!\n"); + area_version_flag = 1; + } else{ + pr_err("Normal version!\n"); + area_version_flag = 0; + } + } +} + + static void smbchg_stay_awake(struct smbchg_chip *chip, int reason) { int reasons; @@ -970,7 +1018,7 @@ static int get_prop_batt_status(struct smbchg_chip *chip) else status = POWER_SUPPLY_STATUS_CHARGING; out: - pr_smb_rt(PR_MISC, "CHGR_STS = 0x%02x\n", reg); + pr_smb_rt(PR_DUMP, "CHGR_STS = 0x%02x\n", reg); return status; } @@ -1090,7 +1138,19 @@ static int get_prop_batt_temp(struct smbchg_chip *chip) pr_smb(PR_STATUS, "Couldn't get temperature rc = %d\n", rc); temp = DEFAULT_BATT_TEMP; } - return temp; + #ifdef CONFIG_DISABLE_TEMP_PROTECT + pr_smb(PR_STATUS, "WINGTECH disable temp protect version; real temp:%d\n", temp); + return 250; + #endif + + if (temp < -100) { + temp = temp - 55; + return temp; + } else if (temp > 450) { + temp = temp - 10; + return temp; + } else + return temp; } #define DEFAULT_BATT_CURRENT_NOW 0 @@ -1160,8 +1220,17 @@ static int get_prop_batt_voltage_max_design(struct smbchg_chip *chip) return uv; } +#if defined(CONFIG_D1_ROSY) +#define DEFAULT_BATT_CAPACITY_MAX_DESIGN 3300 +#else +#define DEFAULT_BATT_CAPACITY_MAX_DESIGN 4100000 +#endif static int get_prop_batt_health(struct smbchg_chip *chip) { + #ifdef CONFIG_DISABLE_TEMP_PROTECT + return POWER_SUPPLY_HEALTH_GOOD; + #endif + if (chip->batt_hot) return POWER_SUPPLY_HEALTH_OVERHEAT; else if (chip->batt_cold) @@ -1564,7 +1633,7 @@ static struct power_supply *get_parallel_psy(struct smbchg_chip *chip) return chip->parallel.psy; chip->parallel.psy = power_supply_get_by_name("usb-parallel"); if (!chip->parallel.psy) - pr_smb(PR_STATUS, "parallel charger not found\n"); + pr_smb(PR_DUMP, "parallel charger not found\n"); return chip->parallel.psy; } @@ -1578,6 +1647,8 @@ static void smbchg_usb_update_online_work(struct work_struct *work) int online; online = user_enabled && chip->usb_present && !chip->very_weak_charger; + pr_err("chip->usb_online:%d,online:%d,user_enabled:%d,chip->usb_present:%d,chip->very_weak_charger:%d\n", + chip->usb_online, online, user_enabled, chip->usb_present, chip->very_weak_charger); mutex_lock(&chip->usb_set_online_lock); if (chip->usb_online != online) { @@ -2472,6 +2543,26 @@ static int dc_suspend_vote_cb(struct device *dev, int suspend, return rc; } +#define HVDCP_EN_BIT BIT(3) +static int smbchg_hvdcp_enable_cb(struct device *dev, int enable, + int client, int last_enable, + int last_client) +{ + int rc = 0; + struct smbchg_chip *chip = dev_get_drvdata(dev); + + pr_err("smbchg_hvdcp_enable_cb enable %d last_enable %d\n", + enable, last_enable); + rc = smbchg_sec_masked_write(chip, + chip->usb_chgpth_base + CHGPTH_CFG, + HVDCP_EN_BIT, enable ? HVDCP_EN_BIT : 0); + if (rc < 0) + dev_err(chip->dev, "Couldn't %s HVDCP rc=%d\n", + enable ? "enable" : "disable", rc); + + return rc; +} + static int set_fastchg_current_vote_cb(struct device *dev, int fcc_ma, int client, @@ -3596,6 +3687,12 @@ static int smbchg_config_chg_battery_type(struct smbchg_chip *chip) pr_warn("couldn't find battery max voltage rc=%d\n", rc); ret = rc; } else { + if (area_version_flag == 1) + max_voltage_uv = 4380000; + + #ifdef CONFIG_DISABLE_TEMP_PROTECT + max_voltage_uv = 4100000; + #endif if (chip->vfloat_mv != (max_voltage_uv / 1000)) { pr_info("Vfloat changed from %dmV to %dmV for battery-type %s\n", chip->vfloat_mv, (max_voltage_uv / 1000), @@ -3751,6 +3848,32 @@ static void smbchg_external_power_changed(struct power_supply *psy) power_supply_changed(&chip->batt_psy); } + +#define call_current_max 900 +#define d1_call_current_max 1200 +void smbchg_set_calling_current(struct smbchg_chip *chip) +{ + enum power_supply_type usb_supply_type; + char *usb_type_name = "null"; + + read_usb_type(chip, &usb_type_name, &usb_supply_type); + pr_smb(PR_MISC, "chip->call_state =%d, usb_supply_type =%d\n", chip->call_state, usb_supply_type); + if ((chip->call_state == 0)) { + if (usb_supply_type == POWER_SUPPLY_TYPE_USB_DCP) { +#if defined(CONFIG_D1_ROSY) + pr_smb(PR_MISC, "call_icl_voltage vote 1200mA when calling\n"); + vote(chip->usb_icl_votable, CALL_ICL_VOTER, true, d1_call_current_max); +#else + pr_smb(PR_MISC, "call_icl_voltage vote 900mA when calling\n"); + vote(chip->usb_icl_votable, CALL_ICL_VOTER, true, call_current_max); +#endif + } + } else { + pr_smb(PR_MISC, "call_icl_volter false"); + vote(chip->usb_icl_votable, CALL_ICL_VOTER, false, 0); + } +} + static int smbchg_otg_regulator_enable(struct regulator_dev *rdev) { int rc = 0; @@ -3835,8 +3958,7 @@ struct regulator_ops smbchg_otg_reg_ops = { #define ADAPTER_ALLOWANCE_MASK 0x7 #define USBIN_ADAPTER_9V 0x3 #define USBIN_ADAPTER_5V_9V_CONT 0x2 -#define USBIN_ADAPTER_5V_UNREGULATED_9V 0x5 -#define HVDCP_EN_BIT BIT(3) +#define USBIN_ADAPTER_5V_UNREGULATED_9V 0x6 static int smbchg_external_otg_regulator_enable(struct regulator_dev *rdev) { int rc = 0; @@ -3860,9 +3982,7 @@ static int smbchg_external_otg_regulator_enable(struct regulator_dev *rdev) * allowance to 9V, so that the audio boost operating in reverse never * gets detected as a valid input */ - rc = smbchg_sec_masked_write(chip, - chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, 0); + rc = vote(chip->hvdcp_enable_votable, HVDCP_OTG_VOTER, true, 0); if (rc < 0) { dev_err(chip->dev, "Couldn't disable HVDCP rc=%d\n", rc); return rc; @@ -3896,9 +4016,7 @@ static int smbchg_external_otg_regulator_disable(struct regulator_dev *rdev) * value in order to allow normal USBs to be recognized as a valid * input. */ - rc = smbchg_sec_masked_write(chip, - chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, HVDCP_EN_BIT); + rc = vote(chip->hvdcp_enable_votable, HVDCP_OTG_VOTER, false, 1); if (rc < 0) { dev_err(chip->dev, "Couldn't enable HVDCP rc=%d\n", rc); return rc; @@ -4516,8 +4634,7 @@ static int smbchg_change_usb_supply_type(struct smbchg_chip *chip, * and set type after the vote */ if (type == POWER_SUPPLY_TYPE_UNKNOWN) { - rc = vote(chip->usb_icl_votable, PSY_ICL_VOTER, false, - current_limit_ma); + rc = vote(chip->usb_icl_votable, PSY_ICL_VOTER, true, 0); if (rc < 0) pr_err("Couldn't remove ICL vote rc=%d\n", rc); @@ -4636,9 +4753,7 @@ static void restore_from_hvdcp_detection(struct smbchg_chip *chip) pr_err("Couldn't configure HVDCP 9V rc=%d\n", rc); /* enable HVDCP */ - rc = smbchg_sec_masked_write(chip, - chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, HVDCP_EN_BIT); + rc = vote(chip->hvdcp_enable_votable, HVDCP_PULSING_VOTER, false, 1); if (rc < 0) pr_err("Couldn't enable HVDCP rc=%d\n", rc); @@ -4703,6 +4818,95 @@ static int smbchg_restricted_charging(struct smbchg_chip *chip, bool enable) return rc; } + +#define FACTORY_DISCHAGE_CAPACITY_THRESHOLD 80 +static int smbchg_factory_mode_controlled_by_capacity(struct smbchg_chip *chip) +{ +#ifdef WT_COMPILE_FACTORY_VERSION + int rc, capacity_now; + + capacity_now = get_prop_batt_capacity(chip); + if ((capacity_now >= FACTORY_DISCHAGE_CAPACITY_THRESHOLD) && (capacity_now <= 100)) { + pr_smb(PR_DUMP, "capacity_now = %d, disable charge\n", capacity_now); + rc = smbchg_charging_en(chip, false); + if (rc) { + pr_err("failed to disable charge in factory mode\n"); + return rc; + } + } else if ((capacity_now >= 0) && (capacity_now < FACTORY_DISCHAGE_CAPACITY_THRESHOLD)) { + pr_smb(PR_DUMP, "capacity_now = %d, enable charge\n", capacity_now); + rc = smbchg_charging_en(chip, true); + if (rc) { + pr_err("failed to enable charge in factory mode\n"); + return rc; + } + } +#endif + return 0; +} + + + +#define MONITOR_PERIOD 20000 +static bool in_cool_low; +static bool in_cool_high; +static int smbchg_get_iusb(struct smbchg_chip *chip); +static void smbchg_monitor_charging_temp_5_work(struct work_struct *work) +{ + int battery_temperature; + bool usb_preset; + int batt_temp; + int chg_current; + int usb_current; + struct smbchg_chip *chip = container_of(work, struct smbchg_chip, monitor_charging_temp_5_work.work); + + usb_preset = is_usb_present(chip); + pr_smb(PR_DUMP, "monitor begin work. usb_preset = %d\n", usb_preset); + if (usb_preset) { + set_property_on_fg(chip, POWER_SUPPLY_PROP_UPDATE_NOW, 1); + battery_temperature = get_prop_batt_temp(chip); + if ((battery_temperature > chip->customize_cool_low_limit) + && (battery_temperature <= chip->customize_cool_high_limit)) { + if ((chip->fcc_customize_cool_ma > 0) && (!in_cool_low)) { + pr_smb(PR_DUMP, "between temp range 0 - 5\n"); + if (chip->customize_cool_high_limit < 60) + chip->customize_cool_high_limit = 60; + + in_cool_low = true; + in_cool_high = false; + vote(chip->fcc_votable, RESTRICTED_CHG_FCC_VOTER, true, chip->fcc_customize_cool_ma); + } + } else { + if (chip->batt_cool) { + + if ((chip->fcc_batt_cool_ma > 0) && (!in_cool_high) && (battery_temperature > chip->customize_cool_high_limit)) { + pr_smb(PR_DUMP, "between temp range 5 - 15\n"); + if (chip->customize_cool_high_limit > 50) + chip->customize_cool_high_limit = 50; + + in_cool_low = false; + in_cool_high = true; + vote(chip->fcc_votable, RESTRICTED_CHG_FCC_VOTER, true, chip->fcc_batt_cool_ma); + } + } else { + in_cool_low = false; + in_cool_high = false; + } + } + } + + batt_temp = get_prop_batt_temp(chip)/10; + chg_current = get_prop_batt_current_now(chip); + usb_current = smbchg_get_iusb(chip); + pr_smb(PR_DUMP, "@**batt_temp=%d,chg_current=%d,usb_current=%d\n", batt_temp, chg_current, usb_current); + + smbchg_factory_mode_controlled_by_capacity(chip); + + schedule_delayed_work(&chip->monitor_charging_temp_5_work, msecs_to_jiffies(MONITOR_PERIOD)); + +} + + static void handle_usb_removal(struct smbchg_chip *chip) { struct power_supply *parallel_psy = get_parallel_psy(chip); @@ -4718,6 +4922,7 @@ static void handle_usb_removal(struct smbchg_chip *chip) chip->typec_current_ma = 0; /* cancel/wait for hvdcp pending work if any */ cancel_delayed_work_sync(&chip->hvdcp_det_work); + smbchg_relax(chip, PM_DETECT_HVDCP); smbchg_change_usb_supply_type(chip, POWER_SUPPLY_TYPE_UNKNOWN); if (!chip->skip_usb_notification) { pr_smb(PR_MISC, "setting usb psy present = %d\n", @@ -4755,6 +4960,14 @@ static void handle_usb_removal(struct smbchg_chip *chip) HVDCP_SHORT_DEGLITCH_VOTER, false, 0); if (!chip->hvdcp_not_supported) restore_from_hvdcp_detection(chip); + +#if defined(CONFIG_D1_ROSY) + in_cool_low = false; + in_cool_high = false; + chip->customize_cool_high_limit = 50; + cancel_delayed_work_sync(&chip->monitor_charging_temp_5_work); + smbchg_relax(chip, PM_CHARGER_ONLINE); +#endif } static bool is_usbin_uv_high(struct smbchg_chip *chip) @@ -4782,6 +4995,8 @@ static void handle_usb_insertion(struct smbchg_chip *chip) read_usb_type(chip, &usb_type_name, &usb_supply_type); pr_smb(PR_STATUS, "inserted type = %d (%s)", usb_supply_type, usb_type_name); + pr_smb(PR_STATUS, "plugged cable will call smbchg_set_calling_current \n"); + smbchg_set_calling_current(chip); smbchg_aicl_deglitch_wa_check(chip); if (chip->typec_psy) @@ -4829,6 +5044,11 @@ static void handle_usb_insertion(struct smbchg_chip *chip) rc = enable_irq_wake(chip->aicl_done_irq); chip->enable_aicl_wake = true; } + +#if defined(CONFIG_D1_ROSY) + smbchg_stay_awake(chip, PM_CHARGER_ONLINE); + schedule_delayed_work(&chip->monitor_charging_temp_5_work, msecs_to_jiffies(MONITOR_PERIOD)); +#endif } void update_usb_status(struct smbchg_chip *chip, bool usb_present, bool force) @@ -5189,8 +5409,7 @@ static int smbchg_prepare_for_pulsing(struct smbchg_chip *chip) /* disable HVDCP */ pr_smb(PR_MISC, "Disable HVDCP\n"); - rc = smbchg_sec_masked_write(chip, chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, 0); + rc = vote(chip->hvdcp_enable_votable, HVDCP_PULSING_VOTER, true, 0); if (rc < 0) { pr_err("Couldn't disable HVDCP rc=%d\n", rc); goto out; @@ -5295,9 +5514,7 @@ static int smbchg_unprepare_for_pulsing(struct smbchg_chip *chip) /* enable HVDCP */ pr_smb(PR_MISC, "Enable HVDCP\n"); - rc = smbchg_sec_masked_write(chip, - chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, HVDCP_EN_BIT); + rc = vote(chip->hvdcp_enable_votable, HVDCP_PULSING_VOTER, false, 1); if (rc < 0) { pr_err("Couldn't enable HVDCP rc=%d\n", rc); return rc; @@ -5782,6 +5999,7 @@ static enum power_supply_property smbchg_battery_properties[] = { POWER_SUPPLY_PROP_HEALTH, POWER_SUPPLY_PROP_TECHNOLOGY, POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL, + POWER_SUPPLY_PROP_CHARGER_TYPE, POWER_SUPPLY_PROP_FLASH_CURRENT_MAX, POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX, POWER_SUPPLY_PROP_VOLTAGE_MAX, @@ -5803,6 +6021,8 @@ static enum power_supply_property smbchg_battery_properties[] = { POWER_SUPPLY_PROP_RESTRICTED_CHARGING, POWER_SUPPLY_PROP_ALLOW_HVDCP3, POWER_SUPPLY_PROP_MAX_PULSE_ALLOWED, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, + POWER_SUPPLY_PROP_CHARGING_CALL_STATE, }; static int smbchg_battery_set_property(struct power_supply *psy, @@ -5886,6 +6106,13 @@ static int smbchg_battery_set_property(struct power_supply *psy, power_supply_changed(&chip->batt_psy); } break; + + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: + chip->call_state = val->intval; + pr_smb(PR_STATUS, "calling will call smbchg_set_calling_current and will detect cable plugged chip->call_state =%d\n", chip->call_state); + smbchg_set_calling_current(chip); + break; + default: return -EINVAL; } @@ -5910,6 +6137,7 @@ static int smbchg_battery_is_writeable(struct power_supply *psy, case POWER_SUPPLY_PROP_RERUN_AICL: case POWER_SUPPLY_PROP_RESTRICTED_CHARGING: case POWER_SUPPLY_PROP_ALLOW_HVDCP3: + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: rc = 1; break; default: @@ -5940,6 +6168,11 @@ static int smbchg_battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_CHARGING_ENABLED: val->intval = chip->chg_enabled; break; + + case POWER_SUPPLY_PROP_CHARGING_CALL_STATE: + val->intval = chip->call_state; + break; + case POWER_SUPPLY_PROP_CHARGE_TYPE: val->intval = get_prop_charge_type(chip); break; @@ -5950,7 +6183,7 @@ static int smbchg_battery_get_property(struct power_supply *psy, val->intval = get_prop_batt_health(chip); break; case POWER_SUPPLY_PROP_TECHNOLOGY: - val->intval = POWER_SUPPLY_TECHNOLOGY_LION; + val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; break; case POWER_SUPPLY_PROP_FLASH_CURRENT_MAX: val->intval = smbchg_calc_max_flash_current(chip); @@ -5961,6 +6194,9 @@ static int smbchg_battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: val->intval = chip->therm_lvl_sel; break; + case POWER_SUPPLY_PROP_CHARGER_TYPE: + val->intval = chip->usb_supply_type; + break; case POWER_SUPPLY_PROP_INPUT_CURRENT_MAX: val->intval = smbchg_get_aicl_level_ma(chip) * 1000; break; @@ -5989,6 +6225,9 @@ static int smbchg_battery_get_property(struct power_supply *psy, case POWER_SUPPLY_PROP_TEMP: val->intval = get_prop_batt_temp(chip); break; + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + val->intval = DEFAULT_BATT_CAPACITY_MAX_DESIGN; + break; case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: val->intval = get_prop_batt_voltage_max_design(chip); break; @@ -6150,6 +6389,8 @@ static irqreturn_t batt_cold_handler(int irq, void *_chip) get_prop_batt_health(chip)); return IRQ_HANDLED; } +#define BATT_WARM_CURRENT 900 +#define BATT_WARM_VOLTAGE 15 static irqreturn_t batt_warm_handler(int irq, void *_chip) { @@ -6159,6 +6400,10 @@ static irqreturn_t batt_warm_handler(int irq, void *_chip) smbchg_read(chip, ®, chip->bat_if_base + RT_STS, 1); chip->batt_warm = !!(reg & HOT_BAT_SOFT_BIT); pr_smb(PR_INTERRUPT, "triggered: 0x%02x\n", reg); + smbchg_fastchg_current_comp_set(chip, + BATT_WARM_CURRENT); + smbchg_float_voltage_comp_set(chip, + BATT_WARM_VOLTAGE); smbchg_parallel_usb_check_ok(chip); if (chip->psy_registered) power_supply_changed(&chip->batt_psy); @@ -6167,6 +6412,8 @@ static irqreturn_t batt_warm_handler(int irq, void *_chip) return IRQ_HANDLED; } +#define BATT_COOL_CURRENT 900 +#define BATT_COOL_VOLTAGE 5 static irqreturn_t batt_cool_handler(int irq, void *_chip) { struct smbchg_chip *chip = _chip; @@ -6174,7 +6421,27 @@ static irqreturn_t batt_cool_handler(int irq, void *_chip) smbchg_read(chip, ®, chip->bat_if_base + RT_STS, 1); chip->batt_cool = !!(reg & COLD_BAT_SOFT_BIT); - pr_smb(PR_INTERRUPT, "triggered: 0x%02x\n", reg); + pr_smb(PR_INTERRUPT, "triggered: 0x%02x, batt_cool=%d\n", reg, chip->batt_cool); +#if defined(CONFIG_D1_ROSY) + + if (chip->batt_cool) { + if (chip->fcc_batt_cool_ma > 0) { + vote(chip->fcc_votable, RESTRICTED_CHG_FCC_VOTER, true, chip->fcc_batt_cool_ma); + } + } else { + in_cool_low = false; + in_cool_high = false; + vote(chip->fcc_votable, RESTRICTED_CHG_FCC_VOTER, true, chip->cfg_fastchg_current_ma); + } + +#else + if (chip->batt_cool) { + smbchg_fastchg_current_comp_set(chip, + BATT_COOL_CURRENT); + smbchg_float_voltage_comp_set(chip, + BATT_COOL_VOLTAGE); + } +#endif smbchg_parallel_usb_check_ok(chip); if (chip->psy_registered) power_supply_changed(&chip->batt_psy); @@ -6238,8 +6505,12 @@ static irqreturn_t fastchg_handler(int irq, void *_chip) struct smbchg_chip *chip = _chip; pr_smb(PR_INTERRUPT, "p2f triggered\n"); - smbchg_detect_parallel_charger(chip); - smbchg_parallel_usb_check_ok(chip); + + if (is_usb_present(chip) || is_dc_present(chip)) { + smbchg_detect_parallel_charger(chip); + smbchg_parallel_usb_check_ok(chip); + } + if (chip->psy_registered) power_supply_changed(&chip->batt_psy); smbchg_charging_status_change(chip); @@ -6415,6 +6686,13 @@ static irqreturn_t usbin_uv_handler(int irq, void *_chip) int aicl_level = smbchg_get_aicl_level_ma(chip); int rc; u8 reg; + bool usb_present = is_usb_present(chip); + + + pr_err( + "chip->usb_present = %d rt_sts = 0x%02x aicl = %d\n", + chip->usb_present, reg, aicl_level); + pr_err("CHG %s, chip->usb_present = %d usb_present = %d\n", __func__, chip->usb_present, usb_present); rc = smbchg_read(chip, ®, chip->usb_chgpth_base + RT_STS, 1); if (rc) { @@ -6546,9 +6824,15 @@ static irqreturn_t src_detect_handler(int irq, void *_chip) if (src_detect) { update_usb_status(chip, usb_present, 0); +#if defined(CONFIG_D1_ROSY) + smbchg_stay_awake(chip, PM_CHARGER_ONLINE); +#endif } else { update_usb_status(chip, 0, false); chip->aicl_irq_count = 0; +#if defined(CONFIG_D1_ROSY) + smbchg_relax(chip, PM_CHARGER_ONLINE); +#endif } out: return IRQ_HANDLED; @@ -6789,6 +7073,7 @@ static inline int get_bpd(const char *name) #define OTG_PIN_CTRL_RID_DIS 0x04 #define OTG_CMD_CTRL_RID_EN 0x08 #define AICL_ADC_BIT BIT(6) +#define OTG_CURRENT_REG SMB_MASK(1, 0) static void batt_ov_wa_check(struct smbchg_chip *chip) { int rc; @@ -6833,6 +7118,26 @@ static void batt_ov_wa_check(struct smbchg_chip *chip) } } + +#if defined(CONFIG_D1_ROSY) +#define CCMP_CFG 0xFA +#define COLD_SL_FV_COMP BIT(2) +#define COLD_SL_CHG_I_COMP BIT(0) +static int smbchg_cold_soft_limit_comp_dis_set(struct smbchg_chip *chip) +{ + int rc; + + rc = smbchg_sec_masked_write(chip, chip->chgr_base + CCMP_CFG, + COLD_SL_FV_COMP | COLD_SL_CHG_I_COMP, 0); + if (rc) + dev_err(chip->dev, "Couldn't set COLD_SL_FV_COMP and COLD_SL_CHG_I_COMP rc = %d\n", + rc); + + return rc; +} +#endif + + static int smbchg_hw_init(struct smbchg_chip *chip) { int rc, i; @@ -6850,7 +7155,15 @@ static int smbchg_hw_init(struct smbchg_chip *chip) chip->revision[ANA_MAJOR], chip->revision[ANA_MINOR]); /* Setup 9V HVDCP */ - if (!chip->hvdcp_not_supported) { + if (chip->hvdcp_not_supported) { + rc = vote(chip->hvdcp_enable_votable, HVDCP_PMIC_VOTER, + true, 0); + if (rc < 0) { + dev_err(chip->dev, "Couldn't disable HVDCP rc=%d\n", + rc); + return rc; + } + } else { rc = smbchg_sec_masked_write(chip, chip->usb_chgpth_base + CHGPTH_CFG, HVDCP_ADAPTER_SEL_MASK, HVDCP_9V); @@ -7062,6 +7375,17 @@ static int smbchg_hw_init(struct smbchg_chip *chip) } } + +#if defined(CONFIG_D1_ROSY) + rc = smbchg_cold_soft_limit_comp_dis_set(chip); + if (rc) { + dev_err(chip->dev, "Couldn't set cold_soft_limit_comp_dis rc = %d\n", + rc); + return rc; + } +#endif + + /* make the buck switch faster to prevent some vbus oscillation */ rc = smbchg_sec_masked_write(chip, chip->usb_chgpth_base + TR_8OR32B, @@ -7230,6 +7554,27 @@ static int smbchg_hw_init(struct smbchg_chip *chip) return rc; } } +#if defined(CONFIG_D1_ROSY) + + rc = smbchg_sec_masked_write(chip, chip->otg_base + 0xF3, + OTG_CURRENT_REG, 0x1); + if (rc < 0) { + dev_err(chip->dev, "Couldn't set OTG current config rc = %d\n", + rc); + return rc; + } + +#else + + rc = smbchg_sec_masked_write(chip, chip->otg_base + 0xF3, + OTG_CURRENT_REG, 0x2); + if (rc < 0) { + dev_err(chip->dev, "Couldn't set OTG current config rc = %d\n", + rc); + return rc; + } + +#endif if (chip->wa_flags & SMBCHG_BATT_OV_WA) batt_ov_wa_check(chip); @@ -7394,6 +7739,18 @@ static int smb_parse_dt(struct smbchg_chip *chip) if (chip->cfg_fastchg_current_ma == -EINVAL) chip->cfg_fastchg_current_ma = DEFAULT_FCC_MA; OF_PROP_READ(chip, chip->vfloat_mv, "float-voltage-mv", rc, 1); + if (area_version_flag == 1) + chip->vfloat_mv = 4380; + + #ifdef CONFIG_DISABLE_TEMP_PROTECT + chip->vfloat_mv = 4100; + #endif + + OF_PROP_READ(chip, chip->customize_cool_low_limit, "customize-cool-low-limit", rc, 1); + OF_PROP_READ(chip, chip->customize_cool_high_limit, "customize-cool-high-limit", rc, 1); + OF_PROP_READ(chip, chip->fcc_customize_cool_ma, "fastchg-current-customize-cool", rc, 1); + OF_PROP_READ(chip, chip->fcc_batt_cool_ma, "fastchg-current-bat-cool", rc, 1); + OF_PROP_READ(chip, chip->safety_time, "charging-timeout-mins", rc, 1); OF_PROP_READ(chip, chip->vled_max_uv, "vled-max-uv", rc, 1); if (chip->vled_max_uv < 0) @@ -7463,6 +7820,7 @@ static int smb_parse_dt(struct smbchg_chip *chip) "qcom,soft-vfloat-comp-disabled"); chip->chg_enabled = !(of_property_read_bool(node, "qcom,charging-disabled")); + chip->call_state = 1; chip->charge_unknown_battery = of_property_read_bool(node, "qcom,charge-unknown-battery"); chip->chg_inhibit_en = of_property_read_bool(node, @@ -7975,6 +8333,109 @@ static int smbchg_check_chg_version(struct smbchg_chip *chip) return 0; } + +static int period_ms; +static int set_period_ms(const char *val, struct kernel_param *kp) +{ + int ret; + + ret = param_set_int(val, kp); + if (ret) { + pr_err("error setting value %d\n", ret); + return ret; + } + if (wt_chip) { + pr_info("set_period_ms to %d\n", period_ms); + cancel_delayed_work_sync(&wt_chip->period_update_work); + schedule_delayed_work(&wt_chip->period_update_work, + round_jiffies_relative(msecs_to_jiffies + (period_ms))); + return 0; + } + return -EINVAL; +} +module_param_call(period_ms, set_period_ms, param_get_uint, + &period_ms, 0644); + +#define LOW_SOC_HEARTBEAT_MS 20000 +#define HEARTBEAT_MS 60000 +#define OFFCHG_FORCE_POWEROFF_DELTA HZ*60*10 +#define NORMAL_FORCE_POWEROFF_DELTA HZ*60*1 +static void period_update(struct work_struct *work) +{ + struct delayed_work *dwork = to_delayed_work(work); + struct smbchg_chip *chip = container_of(dwork, + struct smbchg_chip, period_update_work); + + int period = 500; + int temp, voltage, cap, status, charge_type, present, chg_current, usb_present, usb_current; + static int old_temp; + static int old_cap; + static int old_status; + static int old_present; + static int old_usb_present; + static int printk_counter; + + union power_supply_propval prop = {0,}; + int vbus; + + if (chip == NULL) { + pr_err("pmic fatal error:the_chip=null\n!!"); + return; + } + + if (smbchg_debug_mask == 0xFF) + dump_regs(chip); + + temp = get_prop_batt_temp(chip)/10; + voltage = get_prop_batt_voltage_now(chip)/1000; + cap = get_prop_batt_capacity(chip); + status = get_prop_batt_status(chip); + charge_type = get_prop_charge_type(chip); + present = get_prop_batt_present(chip); + chg_current = get_prop_batt_current_now(chip); + usb_present = is_usb_present(chip); + usb_current = smbchg_get_iusb(chip); + + chip->usb_psy->get_property(chip->usb_psy, POWER_SUPPLY_PROP_VOLTAGE_NOW, &prop); + vbus = prop.intval; + + printk_counter++; + /*if heatbeat_ms is bigger than 500ms,must output the logs directly.*/ + if ((period_ms >= 500) || (abs(temp-old_temp) >= 1) || (old_cap != cap) || (old_status != status) + || (old_present != present) || (old_usb_present != usb_present) || (printk_counter >= 5)) { + pr_info("***temp=%d,vol=%d,cap=%d,status=%d,chg_state=%d,current=%d,present=%d,usb_present=%d\n", + temp, voltage, cap, status, charge_type, chg_current, present, usb_present); + + pr_info("***present=%d,usb_present=%d,usb_current=%d, Vbus=%d\n", + present, usb_present, usb_current, vbus); + + + old_temp = temp; + old_cap = cap; + old_status = status; + old_present = present; + old_usb_present = usb_present; + printk_counter = 0; + } + + power_supply_changed(&chip->batt_psy); + + if (period_ms >= 500) { + period = period_ms; + } else { + if (cap <= 5) + period = LOW_SOC_HEARTBEAT_MS; + else + period = HEARTBEAT_MS; + } + + schedule_delayed_work(&chip->period_update_work, + round_jiffies_relative(msecs_to_jiffies + (period))); +} + + static void rerun_hvdcp_det_if_necessary(struct smbchg_chip *chip) { enum power_supply_type usb_supply_type; @@ -8147,11 +8608,22 @@ static int smbchg_probe(struct spmi_device *spmi) if (IS_ERR(chip->aicl_deglitch_short_votable)) return PTR_ERR(chip->aicl_deglitch_short_votable); + chip->hvdcp_enable_votable = create_votable(&spmi->dev, + "SMBCHG: hvdcp_enable", + VOTE_MIN, NUM_HVDCP_VOTERS, 1, + smbchg_hvdcp_enable_cb); + if (IS_ERR(chip->hvdcp_enable_votable)) + return PTR_ERR(chip->hvdcp_enable_votable); + INIT_WORK(&chip->usb_set_online_work, smbchg_usb_update_online_work); + INIT_DELAYED_WORK(&chip->period_update_work, period_update); INIT_DELAYED_WORK(&chip->parallel_en_work, smbchg_parallel_usb_en_work); INIT_DELAYED_WORK(&chip->vfloat_adjust_work, smbchg_vfloat_adjust_work); INIT_DELAYED_WORK(&chip->hvdcp_det_work, smbchg_hvdcp_det_work); + + INIT_DELAYED_WORK(&chip->monitor_charging_temp_5_work, smbchg_monitor_charging_temp_5_work); + init_completion(&chip->src_det_lowered); init_completion(&chip->src_det_raised); init_completion(&chip->usbin_uv_lowered); @@ -8176,6 +8648,8 @@ static int smbchg_probe(struct spmi_device *spmi) mutex_init(&chip->usb_status_lock); device_init_wakeup(chip->dev, true); + get_area_version(chip); + rc = smbchg_parse_peripherals(chip); if (rc) { dev_err(chip->dev, "Error parsing DT peripherals: %d\n", rc); @@ -8285,6 +8759,7 @@ static int smbchg_probe(struct spmi_device *spmi) rerun_hvdcp_det_if_necessary(chip); + update_usb_status(chip, is_usb_present(chip), false); dump_regs(chip); create_debugfs_entries(chip); dev_info(chip->dev, @@ -8294,6 +8769,8 @@ static int smbchg_probe(struct spmi_device *spmi) chip->revision[ANA_MAJOR], chip->revision[ANA_MINOR], get_prop_batt_present(chip), chip->dc_present, chip->usb_present); + schedule_delayed_work(&chip->period_update_work, + round_jiffies_relative(msecs_to_jiffies(HEARTBEAT_MS))); return 0; unregister_led_class: @@ -8361,11 +8838,9 @@ static void smbchg_shutdown(struct spmi_device *spmi) disable_irq(chip->otg_oc_irq); disable_irq(chip->power_ok_irq); disable_irq(chip->recharge_irq); - disable_irq(chip->src_detect_irq); disable_irq(chip->taper_irq); disable_irq(chip->usbid_change_irq); disable_irq(chip->usbin_ov_irq); - disable_irq(chip->usbin_uv_irq); disable_irq(chip->vbat_low_irq); disable_irq(chip->wdog_timeout_irq); @@ -8406,8 +8881,7 @@ static void smbchg_shutdown(struct spmi_device *spmi) /* disable HVDCP */ pr_smb(PR_MISC, "Disable HVDCP\n"); - rc = smbchg_sec_masked_write(chip, chip->usb_chgpth_base + CHGPTH_CFG, - HVDCP_EN_BIT, 0); + rc = vote(chip->hvdcp_enable_votable, HVDCP_PMIC_VOTER, true, 0); if (rc < 0) pr_err("Couldn't disable HVDCP rc=%d\n", rc); @@ -8424,6 +8898,9 @@ static void smbchg_shutdown(struct spmi_device *spmi) if (rc < 0) pr_err("Couldn't fake insertion rc=%d\n", rc); + disable_irq(chip->src_detect_irq); + disable_irq(chip->usbin_uv_irq); + pr_smb(PR_MISC, "Wait 1S to settle\n"); msleep(1000); chip->hvdcp_3_det_ignore_uv = false; diff --git a/drivers/power/qpnp-typec.c b/drivers/power/qpnp-typec.c index 37d5db330b142..8fc721fc82588 100644 --- a/drivers/power/qpnp-typec.c +++ b/drivers/power/qpnp-typec.c @@ -57,7 +57,7 @@ #define QPNP_TYPEC_DEV_NAME "qcom,qpnp-typec" #define TYPEC_PSY_NAME "typec" -#define DUAL_ROLE_DESC_NAME "dual_role" +#define DUAL_ROLE_DESC_NAME "otg_default" enum cc_line_state { CC_1, @@ -385,6 +385,9 @@ static int qpnp_typec_handle_detach(struct qpnp_typec_chip *chip) pr_err("Failed to set DRP mode rc=%d\n", rc); } + if (chip->dr_inst) + dual_role_instance_changed(chip->dr_inst); + return rc; } @@ -460,6 +463,9 @@ static irqreturn_t ufp_detect_handler(int irq, void *_chip) if (rc) pr_err("failed to set TYPEC MODE on battery psy rc=%d\n", rc); + if (chip->dr_inst) + dual_role_instance_changed(chip->dr_inst); + pr_debug("UFP status reg = 0x%x current = %dma\n", reg, chip->current_ma); @@ -517,6 +523,9 @@ static irqreturn_t dfp_detect_handler(int irq, void *_chip) rc); } + if (chip->dr_inst) + dual_role_instance_changed(chip->dr_inst); + pr_debug("UFP status reg = 0x%x DFP status reg = 0x%x\n", reg[0], reg[1]); @@ -733,6 +742,8 @@ static void qpnp_typec_role_check_work(struct work_struct *work) enum dual_role_property qpnp_typec_dr_properties[] = { DUAL_ROLE_PROP_SUPPORTED_MODES, DUAL_ROLE_PROP_MODE, + DUAL_ROLE_PROP_PR, + DUAL_ROLE_PROP_DR, }; static int qpnp_typec_dr_is_writeable(struct dual_role_phy_instance *dual_role, @@ -816,19 +827,40 @@ static int qpnp_typec_dr_get_property(struct dual_role_phy_instance *dual_role, unsigned int *val) { struct qpnp_typec_chip *chip = dual_role_get_drvdata(dual_role); + unsigned int mode, power_role, data_role; if (!chip) return -EINVAL; + switch (chip->typec_state) { + case POWER_SUPPLY_TYPE_UFP: + mode = DUAL_ROLE_PROP_MODE_UFP; + power_role = DUAL_ROLE_PROP_PR_SNK; + data_role = DUAL_ROLE_PROP_DR_DEVICE; + break; + case POWER_SUPPLY_TYPE_DFP: + mode = DUAL_ROLE_PROP_MODE_DFP; + power_role = DUAL_ROLE_PROP_PR_SRC; + data_role = DUAL_ROLE_PROP_DR_HOST; + break; + default: + mode = DUAL_ROLE_PROP_MODE_NONE; + power_role = DUAL_ROLE_PROP_PR_NONE; + data_role = DUAL_ROLE_PROP_DR_NONE; + }; + switch (prop) { case DUAL_ROLE_PROP_SUPPORTED_MODES: *val = chip->dr_desc.supported_modes; break; case DUAL_ROLE_PROP_MODE: - *val = (chip->typec_state == POWER_SUPPLY_TYPE_UFP) - ? DUAL_ROLE_PROP_MODE_UFP - : (chip->typec_state == POWER_SUPPLY_TYPE_DFP) - ? DUAL_ROLE_PROP_MODE_DFP : DUAL_ROLE_PROP_MODE_NONE; + *val = mode; + break; + case DUAL_ROLE_PROP_PR: + *val = power_role; + break; + case DUAL_ROLE_PROP_DR: + *val = data_role; break; default: return -EINVAL; diff --git a/drivers/power/reset/msm-poweroff.c b/drivers/power/reset/msm-poweroff.c index ee3e72b3537ac..4350fa5ed6f97 100644 --- a/drivers/power/reset/msm-poweroff.c +++ b/drivers/power/reset/msm-poweroff.c @@ -1,4 +1,5 @@ /* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -55,7 +56,9 @@ static void __iomem *msm_ps_hold; static phys_addr_t tcsr_boot_misc_detect; static void scm_disable_sdi(void); -#ifdef CONFIG_MSM_DLOAD_MODE +#if defined(WT_FINAL_RELEASE) +static int download_mode; +#elif defined(CONFIG_MSM_DLOAD_MODE) /* Runtime could be only changed value once. * There is no API from TZ to re-enable the registers. * So the SDI cannot be re-enabled when it already by-passed. @@ -154,17 +157,18 @@ static bool get_dload_mode(void) static void enable_emergency_dload_mode(void) { +#ifdef WT_COMPILE_FACTORY_VERSION int ret; if (emergency_dload_mode_addr) { __raw_writel(EMERGENCY_DLOAD_MAGIC1, - emergency_dload_mode_addr); + emergency_dload_mode_addr); __raw_writel(EMERGENCY_DLOAD_MAGIC2, - emergency_dload_mode_addr + - sizeof(unsigned int)); + emergency_dload_mode_addr + + sizeof(unsigned int)); __raw_writel(EMERGENCY_DLOAD_MAGIC3, - emergency_dload_mode_addr + - (2 * sizeof(unsigned int))); + emergency_dload_mode_addr + + (2 * sizeof(unsigned int))); /* Need disable the pmic wdt, then the emergency dload mode * will not auto reset. */ @@ -175,6 +179,9 @@ static void enable_emergency_dload_mode(void) ret = scm_set_dload_mode(SCM_EDLOAD_MODE, 0); if (ret) pr_err("Failed to set secure EDLOAD mode: %d\n", ret); +#else + pr_err("Failed to set secure EDLOAD mode: Xiaomi Required\n"); +#endif } static int dload_set(const char *val, struct kernel_param *kp) @@ -216,6 +223,7 @@ static bool get_dload_mode(void) static void scm_disable_sdi(void) { +#ifdef WT_FINAL_RELEASE int ret; struct scm_desc desc = { .args[0] = 1, @@ -232,6 +240,7 @@ static void scm_disable_sdi(void) SCM_WDOG_DEBUG_BOOT_PART), &desc); if (ret) pr_err("Failed to disable secure wdog debug: %d\n", ret); +#endif } void msm_set_restart_mode(int mode) @@ -264,6 +273,17 @@ static void halt_spmi_pmic_arbiter(void) } } +static bool device_locked_flag; +static int __init device_locked(char *str) +{ + if (strcmp(str, "1")) + device_locked_flag = false; + else + device_locked_flag = true; + return 1; +} +__setup("device_locked=", device_locked); + static void msm_restart_prepare(const char *cmd) { bool need_warm_reset = false; @@ -281,12 +301,12 @@ static void msm_restart_prepare(const char *cmd) if (qpnp_pon_check_hard_reset_stored()) { /* Set warm reset as true when device is in dload mode */ - if (get_dload_mode() || + if (get_dload_mode() || in_panic || ((cmd != NULL && cmd[0] != '\0') && !strcmp(cmd, "edl"))) need_warm_reset = true; } else { - need_warm_reset = (get_dload_mode() || + need_warm_reset = (get_dload_mode() || in_panic || (cmd != NULL && cmd[0] != '\0')); } @@ -297,7 +317,11 @@ static void msm_restart_prepare(const char *cmd) qpnp_pon_system_pwr_off(PON_POWER_OFF_HARD_RESET); } - if (cmd != NULL) { + if (in_panic) { + qpnp_pon_system_pwr_off(PON_POWER_OFF_WARM_RESET); + qpnp_pon_set_restart_reason(PON_RESTART_REASON_PANIC); + __raw_writel(0x77665504, restart_reason); + } else if (cmd != NULL) { if (!strncmp(cmd, "bootloader", 10)) { qpnp_pon_set_restart_reason( PON_RESTART_REASON_BOOTLOADER); @@ -322,6 +346,8 @@ static void msm_restart_prepare(const char *cmd) qpnp_pon_set_restart_reason( PON_RESTART_REASON_KEYS_CLEAR); __raw_writel(0x7766550a, restart_reason); + } else if (!strncmp(cmd, "fastmmi", 7)) { + __raw_writel(0x77665505, restart_reason); } else if (!strncmp(cmd, "oem-", 4)) { unsigned long code; int ret; @@ -329,11 +355,20 @@ static void msm_restart_prepare(const char *cmd) if (!ret) __raw_writel(0x6f656d00 | (code & 0xff), restart_reason); +#ifdef WT_COMPILE_FACTORY_VERSION } else if (!strncmp(cmd, "edl", 3)) { - enable_emergency_dload_mode(); + enable_emergency_dload_mode(); +#else + } else if (!strncmp(cmd, "edl", 3) && !device_locked_flag) { + enable_emergency_dload_mode(); +#endif } else { + qpnp_pon_set_restart_reason(PON_RESTART_REASON_NORMAL); __raw_writel(0x77665501, restart_reason); } + } else { + qpnp_pon_set_restart_reason(PON_RESTART_REASON_NORMAL); + __raw_writel(0x77665501, restart_reason); } flush_cache_all(); @@ -397,6 +432,8 @@ static void do_msm_poweroff(void) pr_notice("Powering off the SoC\n"); set_dload_mode(0); + qpnp_pon_set_restart_reason(PON_RESTART_REASON_UNKNOWN); + __raw_writel(0x0, restart_reason); scm_disable_sdi(); qpnp_pon_system_pwr_off(PON_POWER_OFF_SHUTDOWN); @@ -569,6 +606,9 @@ static int msm_restart_probe(struct platform_device *pdev) if (mem) tcsr_boot_misc_detect = mem->start; + + qpnp_pon_set_restart_reason(PON_RESTART_REASON_UNKNOWN); + __raw_writel(0x77665506, restart_reason); pm_power_off = do_msm_poweroff; arm_pm_restart = do_msm_restart; diff --git a/drivers/power/smb1351-charger.c b/drivers/power/smb1351-charger.c index 411b85fe9f409..2894ea823648e 100644 --- a/drivers/power/smb1351-charger.c +++ b/drivers/power/smb1351-charger.c @@ -529,6 +529,7 @@ struct smb1351_charger { int slave_fcc_ma_before_esr; int workaround_flags; + struct mutex parallel_config_lock; int parallel_pin_polarity_setting; bool is_slave; bool use_external_fg; @@ -2559,10 +2560,12 @@ static int smb1351_parallel_set_property(struct power_supply *psy, } break; case POWER_SUPPLY_PROP_PRESENT: + mutex_lock(&chip->parallel_config_lock); rc = smb1351_parallel_set_chg_present(chip, val->intval); if (rc) pr_err("Set charger %spresent failed\n", val->intval ? "" : "un-"); + mutex_unlock(&chip->parallel_config_lock); break; case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: if (chip->parallel_charger_present) { @@ -4658,6 +4661,7 @@ static int smb1351_parallel_slave_probe(struct i2c_client *client, EN_BY_PIN_HIGH_ENABLE : EN_BY_PIN_LOW_ENABLE; i2c_set_clientdata(client, chip); + mutex_init(&chip->parallel_config_lock); chip->parallel_psy.name = "usb-parallel"; chip->parallel_psy.type = POWER_SUPPLY_TYPE_USB_PARALLEL; @@ -4690,6 +4694,7 @@ static int smb1351_parallel_slave_probe(struct i2c_client *client, wakeup_source_trash(&chip->smb1351_ws.source); mutex_destroy(&chip->irq_complete); mutex_destroy(&chip->fcc_lock); + mutex_destroy(&chip->parallel_config_lock); return rc; } @@ -4712,8 +4717,10 @@ static int smb1351_charger_remove(struct i2c_client *client) wakeup_source_trash(&chip->smb1351_ws.source); mutex_destroy(&chip->irq_complete); mutex_destroy(&chip->fcc_lock); - if (is_parallel_slave(client)) + if (is_parallel_slave(client)) { + mutex_destroy(&chip->parallel_config_lock); mutex_destroy(&chip->parallel.lock); + } debugfs_remove_recursive(chip->debug_root); return 0; } diff --git a/drivers/power/smb135x-charger.c b/drivers/power/smb135x-charger.c index eb36c6430a1c3..9d680155492ab 100644 --- a/drivers/power/smb135x-charger.c +++ b/drivers/power/smb135x-charger.c @@ -112,6 +112,7 @@ #define BATT_MISSING_THERM_BIT BIT(1) #define CFG_1A_REG 0x1A +#define TEMP_MONITOR_EN_BIT BIT(6) #define HOT_SOFT_VFLOAT_COMP_EN_BIT BIT(3) #define COLD_SOFT_VFLOAT_COMP_EN_BIT BIT(2) #define HOT_SOFT_CURRENT_COMP_EN_BIT BIT(1) @@ -374,6 +375,7 @@ struct smb135x_chg { struct mutex otg_oc_count_lock; struct delayed_work hvdcp_det_work; + struct mutex parallel_config_lock; bool parallel_charger; bool parallel_charger_present; bool bms_controlled_charging; @@ -1814,6 +1816,15 @@ static int smb135x_parallel_set_chg_present(struct smb135x_chg *chip, return rc; } + /* disable thermal monitoring for parallel-charger */ + rc = smb135x_masked_write(chip, CFG_1A_REG, + TEMP_MONITOR_EN_BIT, 0); + if (rc < 0) { + dev_err(chip->dev, + "Couldn't disable temp-monitor rc=%d\n", rc); + return rc; + } + /* set the float voltage */ if (chip->vfloat_mv != -EINVAL) { rc = smb135x_float_voltage_set(chip, chip->vfloat_mv); @@ -1944,7 +1955,9 @@ static int smb135x_parallel_set_property(struct power_supply *psy, chip->chg_enabled = val->intval; break; case POWER_SUPPLY_PROP_PRESENT: + mutex_lock(&chip->parallel_config_lock); rc = smb135x_parallel_set_chg_present(chip, val->intval); + mutex_unlock(&chip->parallel_config_lock); break; case POWER_SUPPLY_PROP_CONSTANT_CHARGE_CURRENT_MAX: if (chip->parallel_charger_present) { @@ -4381,6 +4394,7 @@ static int smb135x_parallel_charger_probe(struct i2c_client *client, mutex_init(&chip->path_suspend_lock); mutex_init(&chip->current_change_lock); mutex_init(&chip->read_write_lock); + mutex_init(&chip->parallel_config_lock); wakeup_source_init(&chip->wake_source.source, "smb_wake_source"); match = of_match_node(smb135x_match_table, node); @@ -4439,6 +4453,7 @@ static int smb135x_charger_remove(struct i2c_client *client) if (chip->parallel_charger) { power_supply_unregister(&chip->parallel_psy); + mutex_destroy(&chip->parallel_config_lock); goto mutex_destroy; } diff --git a/drivers/power/smb358-charger.c b/drivers/power/smb358-charger.c index 75cf2f964ca10..396742b14081b 100644 --- a/drivers/power/smb358-charger.c +++ b/drivers/power/smb358-charger.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2014-2015 The Linux Foundation. All rights reserved. +/* Copyright (c) 2014 The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -29,6 +30,15 @@ #include #include +#include +#include +#include +#include + +#include +#include + + #define _SMB358_MASK(BITS, POS) \ ((unsigned char)(((1 << (BITS)) - 1) << (POS))) #define SMB358_MASK(LEFT_BIT_POS, RIGHT_BIT_POS) \ @@ -48,6 +58,7 @@ #define OTHER_CTRL_REG 0x9 #define FAULT_INT_REG 0xC #define STATUS_INT_REG 0xD +#define OTG_CONTROL_REG 0xA /* Command registers */ #define CMD_A_REG 0x30 @@ -90,6 +101,10 @@ #define CHG_CTRL_APSD_EN_MASK BIT(2) #define CHG_ITERM_MASK 0x07 #define CHG_PIN_CTRL_USBCS_REG_BIT 0x0 +#define OTG_CURRENT_CONTROL_BIT2 BIT(2) +#define OTG_CURRENT_CONTROL_BIT3 BIT(3) + + /* This is to select if use external pin EN to control CHG */ #define CHG_PIN_CTRL_CHG_EN_LOW_PIN_BIT SMB358_MASK(6, 5) #define CHG_PIN_CTRL_CHG_EN_LOW_REG_BIT 0x0 @@ -175,17 +190,40 @@ #define SMB358_FAST_CHG_MAX_MA 2000 #define SMB358_FAST_CHG_SHIFT 5 #define SMB_FAST_CHG_CURRENT_MASK 0xE0 -#define SMB358_DEFAULT_BATT_CAPACITY 50 +#define SMB358_DEFAULT_BATT_CAPACITY 10 #define SMB358_BATT_GOOD_THRE_2P5 0x1 +#ifdef CONFIG_C3N_SMB358 +#define BATTERY_FCC 3030 +#else +#define BATTERY_FCC 3000 +#endif + + +int pre_usb_current_ma = -EINVAL; +bool thermal = false; +bool recovery = false; +int fastmmi_mode = 0; + +#define DEBUG + +extern struct device_node *of_batterydata_get_best_profile( + const struct device_node *batterydata_container_node, + const char *psy_name, const char *batt_type); + + + enum { - USER = BIT(0), - THERMAL = BIT(1), - CURRENT = BIT(2), - SOC = BIT(3), - FAKE_BATTERY = BIT(4), + USER = BIT(0), + THERMAL = BIT(1), + CURRENT = BIT(2), + SOC = BIT(3), }; +enum path_type { + USB, + DC, +}; struct smb358_regulator { struct regulator_desc rdesc; struct regulator_dev *rdev; @@ -208,26 +246,28 @@ struct smb358_charger { bool chg_autonomous_mode; bool disable_apsd; bool using_pmic_therm; - bool pmic_vbat_sns; bool battery_missing; const char *bms_psy_name; bool resume_completed; bool irq_waiting; bool bms_controlled_charging; - bool skip_usb_suspend_for_fake_battery; struct mutex read_write_lock; struct mutex path_suspend_lock; struct mutex irq_complete; + struct wake_lock wake_lock_hightemp; u8 irq_cfg_mask[2]; + u8 power_ok; int irq_gpio; int charging_disabled; int fastchg_current_max_ma; - unsigned int cool_bat_ma; + + int psy_usb_ma; + + unsigned int cool_cold_bat_ma; + unsigned int cool_normal_bat_ma; unsigned int warm_bat_ma; unsigned int cool_bat_mv; unsigned int warm_bat_mv; - unsigned int connected_rid; - /* debugfs related */ #if defined(CONFIG_DEBUG_FS) struct dentry *debug_root; @@ -240,16 +280,20 @@ struct smb358_charger { bool batt_warm; bool batt_cool; bool jeita_supported; + int psy_health_sts; int charging_disabled_status; int usb_suspended; /* power supply */ struct power_supply *usb_psy; struct power_supply *bms_psy; + struct power_supply *rk_bat; struct power_supply batt_psy; /* otg 5V regulator */ struct smb358_regulator otg_vreg; + struct work_struct batt_temp_work; + struct alarm batt_temp_alarm; /* adc_tm paramters */ struct qpnp_vadc_chip *vadc_dev; @@ -260,10 +304,34 @@ struct smb358_charger { int cool_bat_decidegc; int warm_bat_decidegc; int bat_present_decidegc; + unsigned int thermal_levels; + unsigned int therm_lvl_sel; + int *thermal_mitigation; + struct mutex current_change_lock; /* i2c pull up regulator */ struct regulator *vcc_i2c; + unsigned int fcc_mah; + const char *battery_type; + + + struct delayed_work abnormal_detect; }; +int hot_status = 0; +int cold_status = 0; +int warm_status = 0; +int cool_status = 0; + +int cool_status_5 = 0; + +static int smb358_charging_disable(struct smb358_charger *chip, + int reason, int disable); +static int smb358_get_prop_batt_temp(struct smb358_charger *chip); +static void smb358_chg_set_appropriate_vddmax( + struct smb358_charger *chip); +static void smb358_chg_set_appropriate_battery_current( + struct smb358_charger *chip); + struct smb_irq_info { const char *name; int (*smb_irq)(struct smb358_charger *chip, @@ -292,6 +360,8 @@ static char *pm_batt_supplied_to[] = { "bms", }; +static void dump_regs(struct smb358_charger *chip); + static int __smb358_read_reg(struct smb358_charger *chip, u8 reg, u8 *val) { s32 ret; @@ -384,6 +454,241 @@ static int smb358_enable_volatile_writes(struct smb358_charger *chip) return rc; } + +static int disable_software_temp_monitor; +int dis_sof_temp_monitor_set(const char *val, const struct kernel_param *kp) +{ + if (!val) + val = "1"; + return strtobool(val, kp->arg); +} + +int dis_sof_temp_monitor_get(char *buffer, const struct kernel_param *kp) +{ + disable_software_temp_monitor = 1; + return sprintf(buffer, "%c", *(bool *)kp->arg ? 'Y' : 'N'); +} + +static struct kernel_param_ops dis_sof_temp_monitor_ops = { + .set = dis_sof_temp_monitor_set, + .get = dis_sof_temp_monitor_get, +}; + +module_param_cb(disable_software_temp_monitor, &dis_sof_temp_monitor_ops + , &disable_software_temp_monitor, 0644); + +MODULE_PARM_DESC(debug, "1:disable software temp monitor , 0:enable,default:0"); + + + +#define DELAY_COUNT 3 +#define VFLT_300MV 0x0C +#define VFLT_200MV 0x08 +#define VFLT_100MV 0x04 +#define VFLT_50MV 0x00 +#define VFLT_MASK 0x0C +static void qpnp_lbc_temp_alarm_work_fn(struct work_struct *work) +{ + ktime_t kt; + int batt_temp = 250; + u64 monitor_second = 10LL*NSEC_PER_SEC; + static int disabled_delay_times = DELAY_COUNT; + static int enabled_delay_times = DELAY_COUNT; + static int chg_enabled1; + static int chg_enabled2; + static int chg_enabled3; + static int chg_disabled; + u8 reg = 0; + int rc; + + struct smb358_charger *chip = container_of(work, struct smb358_charger, batt_temp_work); + + smb358_read_reg(chip, IRQ_E_REG, ®); + if (!reg) { + chip->chg_present = true; + power_supply_set_present(chip->usb_psy, chip->chg_present); + } else { + chip->chg_present = false; + smb358_charging_disable(chip, THERMAL, 1); + power_supply_set_present(chip->usb_psy, chip->chg_present); + } + + + if (!chip->chg_present) { + enabled_delay_times = DELAY_COUNT; + disabled_delay_times = DELAY_COUNT; + chg_disabled = 0; + chg_enabled1 = 0; + chg_enabled2 = 0; + chg_enabled3 = 0; + hot_status = 0; + cold_status = 0; + + + + pr_err("wgz usb plug out or charge done\n"); + goto exit; + } + + if (disable_software_temp_monitor) { + smb358_charging_disable(chip, THERMAL, 0); + enabled_delay_times = DELAY_COUNT; + disabled_delay_times = DELAY_COUNT; + chg_disabled = 0; + chg_enabled1 = 0; + chg_enabled2 = 0; + chg_enabled3 = 0; + hot_status = 0; + cold_status = 0; + warm_status = 0; + cool_status = 0; + goto out; + } + + batt_temp = smb358_get_prop_batt_temp(chip); + pr_err("wgz temp = %d , disabled_delay_times = %d , enabled_delay_times = %d\n" + , batt_temp , disabled_delay_times , enabled_delay_times); + + if (batt_temp >= 0 && batt_temp <= 150) { + reg = VFLT_100MV; + rc = smb358_masked_write(chip, CHG_OTH_CURRENT_CTRL_REG, + VFLT_MASK, reg); + if (rc) { + dev_err(chip->dev, + "Couldn't set inhibit threshold rc = %d\n", rc); + } + } + + + if ((batt_temp > 550 || batt_temp < 0) && !chg_disabled) { + wake_lock(&chip->wake_lock_hightemp); + if ((disabled_delay_times++) >= DELAY_COUNT) { + pr_err("wgz temp high disable charger\n"); + enabled_delay_times = 0; + disabled_delay_times = 0; + chg_disabled = 1; + chg_enabled1 = 0; + chg_enabled2 = 0; + chg_enabled3 = 0; + if (batt_temp > 550) { + pr_err("battery is too hot\n"); + hot_status = 1; + cold_status = 0; + warm_status = 0; + cool_status = 0; + } else if (batt_temp < 0) { + pr_err("battery is too cold\n"); + hot_status = 0; + cold_status = 1; + warm_status = 0; + cool_status = 0; + } + smb358_charging_disable(chip, THERMAL, 1); + wake_unlock(&chip->wake_lock_hightemp); + power_supply_changed(&chip->batt_psy); + } + } else if (((batt_temp > 450 && batt_temp <= 550) || (batt_temp > 50 && batt_temp <= 150)) && !chg_enabled1) { + wake_lock(&chip->wake_lock_hightemp); + if ((disabled_delay_times++) >= DELAY_COUNT) { + enabled_delay_times = 0; + disabled_delay_times = 0; + chg_disabled = 0; + chg_enabled1 = 1; + chg_enabled2 = 0; + chg_enabled3 = 0; + + if (batt_temp > 450 && batt_temp <= 550) { + pr_err("battery is too warm\n"); + hot_status = 0; + cold_status = 0; + warm_status = 1; + cool_status = 0; + } else if (batt_temp > 50 && batt_temp <= 150) { + pr_err("battery is too cool_normal\n"); + hot_status = 0; + cold_status = 0; + warm_status = 0; + cool_status = 1; + cool_status_5 = 2; + } + + smb358_charging_disable(chip, THERMAL, 0); + smb358_chg_set_appropriate_battery_current(chip); + smb358_chg_set_appropriate_vddmax(chip); + wake_unlock(&chip->wake_lock_hightemp); + power_supply_changed(&chip->batt_psy); + } + } + + else if ((!chg_enabled3) && ((batt_temp >= 0) && (batt_temp <= 50))) { + wake_lock(&chip->wake_lock_hightemp); + if ((disabled_delay_times++) >= DELAY_COUNT) { + pr_err("battery is too cool_cold\n"); + enabled_delay_times = 0; + disabled_delay_times = 0; + chg_disabled = 0; + chg_enabled1 = 0; + chg_enabled2 = 0; + chg_enabled3 = 1; + + hot_status = 0; + cold_status = 0; + warm_status = 0; + cool_status = 1; + cool_status_5 = 1; + smb358_chg_set_appropriate_battery_current(chip); + smb358_chg_set_appropriate_vddmax(chip); + wake_unlock(&chip->wake_lock_hightemp); + power_supply_changed(&chip->batt_psy); + } + } + + else if ((!chg_enabled2) && ((batt_temp > 150) && (batt_temp <= 450))) { + { + wake_lock(&chip->wake_lock_hightemp); + if (enabled_delay_times++ == DELAY_COUNT) { + pr_err("battery is normal\n"); + enabled_delay_times = 0; + disabled_delay_times = 0; + chg_disabled = 0; + chg_enabled1 = 0; + chg_enabled2 = 1; + chg_enabled3 = 0; + + smb358_charging_disable(chip, THERMAL, 0); + hot_status = 0; + cold_status = 0; + warm_status = 0; + cool_status = 0; + smb358_chg_set_appropriate_battery_current(chip); + smb358_chg_set_appropriate_vddmax(chip); + wake_unlock(&chip->wake_lock_hightemp); + power_supply_changed(&chip->batt_psy); + } + } + } +out: + kt = ns_to_ktime(monitor_second); + alarm_start_relative(&chip->batt_temp_alarm, kt); +exit: + pm_relax(chip->dev); +} + + +static enum alarmtimer_restart batt_temp_alarm_callback(struct alarm *alarm, + ktime_t now) +{ + struct smb358_charger *chip = container_of(alarm, struct smb358_charger, + batt_temp_alarm); + + pr_err("wgz %s:%d\n" , __FUNCTION__ , __LINE__); + pm_stay_awake(chip->dev); + schedule_work(&chip->batt_temp_work); + + return ALARMTIMER_NORESTART; +} + + static int smb358_fastchg_current_set(struct smb358_charger *chip, unsigned int fastchg_current) { @@ -391,7 +696,7 @@ static int smb358_fastchg_current_set(struct smb358_charger *chip, if ((fastchg_current < SMB358_FAST_CHG_MIN_MA) || (fastchg_current > SMB358_FAST_CHG_MAX_MA)) { - dev_dbg(chip->dev, "bad fastchg current mA=%d asked to set\n", + pr_debug("bad fastchg current mA=%d asked to set\n", fastchg_current); return -EINVAL; } @@ -408,7 +713,7 @@ static int smb358_fastchg_current_set(struct smb358_charger *chip, } i = i << SMB358_FAST_CHG_SHIFT; - dev_dbg(chip->dev, "fastchg limit=%d setting %02x\n", + pr_debug("fastchg limit=%d setting %02x\n", fastchg_current, i); return smb358_masked_write(chip, CHG_CURRENT_CTRL_REG, @@ -568,6 +873,15 @@ static int smb358_chg_otg_regulator_enable(struct regulator_dev *rdev) if (rc) dev_err(chip->dev, "Couldn't enable OTG mode rc=%d, reg=%2x\n", rc, CMD_A_REG); + + + rc = smb358_masked_write(chip, OTG_CONTROL_REG, OTG_CURRENT_CONTROL_BIT2, + OTG_CURRENT_CONTROL_BIT2); + if (rc) + dev_err(chip->dev, "Couldn't enable OTG current control rc=%d, reg=%2x\n", + rc, OTG_CONTROL_REG); + + return rc; } @@ -646,53 +960,6 @@ static int smb358_regulator_init(struct smb358_charger *chip) return rc; } -static int __smb358_path_suspend(struct smb358_charger *chip, bool suspend) -{ - int rc; - - rc = smb358_masked_write(chip, CMD_A_REG, CMD_A_CHG_SUSP_EN_MASK, - suspend ? CMD_A_CHG_SUSP_EN_BIT : 0); - if (rc < 0) - dev_err(chip->dev, "Couldn't set CMD_A reg, rc = %d\n", rc); - - return rc; -} - -static int smb358_path_suspend(struct smb358_charger *chip, int reason, - bool suspend) -{ - int rc = 0; - int suspended; - - mutex_lock(&chip->path_suspend_lock); - suspended = chip->usb_suspended; - - if (suspend == false) - suspended &= ~reason; - else - suspended |= reason; - - if (!chip->usb_suspended && suspended) { - rc = __smb358_path_suspend(chip, true); - chip->usb_suspended = suspended; - power_supply_set_online(chip->usb_psy, !chip->usb_suspended); - power_supply_changed(chip->usb_psy); - } else if (chip->usb_suspended && !suspended) { - rc = __smb358_path_suspend(chip, false); - chip->usb_suspended = suspended; - power_supply_set_online(chip->usb_psy, !chip->usb_suspended); - power_supply_changed(chip->usb_psy); - } - - if (rc) - dev_err(chip->dev, "Couldn't set/unset suspend rc = %d\n", rc); - - mutex_unlock(&chip->path_suspend_lock); - - return rc; -} - - static int __smb358_charging_disable(struct smb358_charger *chip, bool disable) { int rc; @@ -711,6 +978,9 @@ static int smb358_charging_disable(struct smb358_charger *chip, int rc = 0; int disabled; + if (disable == true) { + pre_usb_current_ma = -EINVAL; + } disabled = chip->charging_disabled_status; pr_debug("reason = %d requested_disable = %d disabled_status = %d\n", @@ -738,19 +1008,17 @@ static int smb358_charging_disable(struct smb358_charger *chip, return rc; } -#define MAX_INV_BATT_ID 7700 -#define MIN_INV_BATT_ID 7300 static int smb358_hw_init(struct smb358_charger *chip) { int rc; u8 reg = 0, mask = 0; /* - * If the charger is pre-configured for autonomous operation, - * do not apply additonal settings - */ + * If the charger is pre-configured for autonomous operation, + * do not apply additonal settings + */ if (chip->chg_autonomous_mode) { - dev_dbg(chip->dev, "Charger configured for autonomous mode\n"); + pr_debug("Charger configured for autonomous mode\n"); return 0; } @@ -792,9 +1060,6 @@ static int smb358_hw_init(struct smb358_charger *chip) if (!chip->disable_apsd) reg = CHG_CTRL_APSD_EN_BIT; - else - reg = 0; - rc = smb358_masked_write(chip, CHG_CTRL_REG, CHG_CTRL_APSD_EN_MASK, reg); if (rc) { @@ -853,17 +1118,6 @@ static int smb358_hw_init(struct smb358_charger *chip) if (rc) dev_err(chip->dev, "Couldn't set recharge para rc=%d\n", rc); - /* suspend USB path for fake battery */ - if (!chip->skip_usb_suspend_for_fake_battery) { - if ((chip->connected_rid >= MIN_INV_BATT_ID) && - (chip->connected_rid <= MAX_INV_BATT_ID)) { - rc = smb358_path_suspend(chip, FAKE_BATTERY, true); - if (!rc) - dev_info(chip->dev, - "Suspended USB path reason FAKE_BATTERY\n"); - } - } - /* enable/disable charging */ if (chip->charging_disabled) { rc = smb358_charging_disable(chip, USER, 1); @@ -872,9 +1126,9 @@ static int smb358_hw_init(struct smb358_charger *chip) chip->charging_disabled ? "disable" : "enable", rc); } else { /* - * Enable charging explictly, - * because not sure the default behavior. - */ + * Enable charging explictly, + * because not sure the default behavior. + */ rc = __smb358_charging_disable(chip, 0); if (rc) dev_err(chip->dev, "Couldn't enable charging\n"); @@ -908,6 +1162,12 @@ static enum power_supply_property smb358_battery_properties[] = { POWER_SUPPLY_PROP_MODEL_NAME, POWER_SUPPLY_PROP_TEMP, POWER_SUPPLY_PROP_VOLTAGE_NOW, + POWER_SUPPLY_PROP_CURRENT_NOW, + POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL, + POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN, + POWER_SUPPLY_PROP_CHARGE_FULL, + POWER_SUPPLY_PROP_BATTERY_TYPE, + POWER_SUPPLY_PROP_RESISTANCE_ID, }; static int smb358_get_prop_batt_status(struct smb358_charger *chip) @@ -915,23 +1175,23 @@ static int smb358_get_prop_batt_status(struct smb358_charger *chip) int rc; u8 reg = 0; - if (chip->batt_full) - return POWER_SUPPLY_STATUS_FULL; - rc = smb358_read_reg(chip, STATUS_C_REG, ®); + pr_debug("XXX::smb358_get_prop_batt_status:reg=0x%x\r\n", reg); if (rc) { dev_err(chip->dev, "Couldn't read STAT_C rc = %d\n", rc); return POWER_SUPPLY_STATUS_UNKNOWN; } - dev_dbg(chip->dev, "%s: STATUS_C_REG=%x\n", __func__, reg); + pr_debug("%s: STATUS_C_REG=%x\n", __func__, reg); - if (reg & STATUS_C_CHG_HOLD_OFF_BIT) - return POWER_SUPPLY_STATUS_NOT_CHARGING; + if ((chip->batt_full)) + return POWER_SUPPLY_STATUS_FULL; if ((reg & STATUS_C_CHARGING_MASK) && !(reg & STATUS_C_CHG_ERR_STATUS_BIT)) return POWER_SUPPLY_STATUS_CHARGING; + if ((reg & STATUS_C_CHG_HOLD_OFF_BIT) || !chip->power_ok) + return POWER_SUPPLY_STATUS_NOT_CHARGING; return POWER_SUPPLY_STATUS_DISCHARGING; } @@ -941,6 +1201,7 @@ static int smb358_get_prop_batt_present(struct smb358_charger *chip) return !chip->battery_missing; } +static struct power_supply *cw2015_psy; static int smb358_get_prop_batt_capacity(struct smb358_charger *chip) { union power_supply_propval ret = {0, }; @@ -948,17 +1209,41 @@ static int smb358_get_prop_batt_capacity(struct smb358_charger *chip) if (chip->fake_battery_soc >= 0) return chip->fake_battery_soc; + if (!cw2015_psy) + cw2015_psy = power_supply_get_by_name("rk-bat"); + if (cw2015_psy) { + cw2015_psy->get_property(cw2015_psy, + POWER_SUPPLY_PROP_CAPACITY, &ret); + pr_err("CW2015_BATTERY_CAPACITY IS:%d\n", ret.intval); + return ret.intval; + } + if (chip->bms_psy) { chip->bms_psy->get_property(chip->bms_psy, POWER_SUPPLY_PROP_CAPACITY, &ret); + pr_err("BMS_BATTERY_CAPACITY IS:%d\n", ret.intval); return ret.intval; + } - dev_dbg(chip->dev, - "Couldn't get bms_psy, return default capacity\n"); + pr_debug("Couldn't get bms_psy, return default capacity\n"); return SMB358_DEFAULT_BATT_CAPACITY; } +static int get_prop_current_now(struct smb358_charger *chip) +{ + union power_supply_propval ret = {0,}; + if (chip->bms_psy) { + chip->bms_psy->get_property(chip->bms_psy, + POWER_SUPPLY_PROP_CURRENT_NOW, &ret); + pr_debug("xujismbcur = %d\n", ret.intval); + return ret.intval; + } else { + pr_debug("No BMS supply registered return 0\n"); + } + return 1000; +} + static int smb358_get_prop_charge_type(struct smb358_charger *chip) { int rc; @@ -970,7 +1255,7 @@ static int smb358_get_prop_charge_type(struct smb358_charger *chip) return POWER_SUPPLY_CHARGE_TYPE_UNKNOWN; } - dev_dbg(chip->dev, "%s: STATUS_C_REG=%x\n", __func__, reg); + pr_debug("%s: STATUS_C_REG=%x\n", __func__, reg); reg &= STATUS_C_CHARGING_MASK; @@ -987,18 +1272,24 @@ static int smb358_get_prop_charge_type(struct smb358_charger *chip) static int smb358_get_prop_batt_health(struct smb358_charger *chip) { union power_supply_propval ret = {0, }; - - if (chip->batt_hot) - ret.intval = POWER_SUPPLY_HEALTH_OVERHEAT; - else if (chip->batt_cold) - ret.intval = POWER_SUPPLY_HEALTH_COLD; - else if (chip->batt_warm) - ret.intval = POWER_SUPPLY_HEALTH_WARM; - else if (chip->batt_cool) - ret.intval = POWER_SUPPLY_HEALTH_COOL; + if (!disable_software_temp_monitor) { + if (hot_status == 1) + return POWER_SUPPLY_HEALTH_OVERHEAT; + if (cold_status == 1) + return POWER_SUPPLY_HEALTH_COLD; + if (cool_status == 1) + return POWER_SUPPLY_HEALTH_COOL; + if (warm_status == 1) + return POWER_SUPPLY_HEALTH_WARM; + else if (chip->psy_health_sts == POWER_SUPPLY_HEALTH_OVERVOLTAGE) + ret.intval = POWER_SUPPLY_HEALTH_OVERVOLTAGE; + else + ret.intval = POWER_SUPPLY_HEALTH_GOOD; + } else - ret.intval = POWER_SUPPLY_HEALTH_GOOD; + ret.intval = POWER_SUPPLY_HEALTH_GOOD; + pr_err("battery health is %d\n", ret.intval); return ret.intval; } @@ -1008,52 +1299,146 @@ static int smb358_get_prop_batt_temp(struct smb358_charger *chip) int rc = 0; struct qpnp_vadc_result results; - if (!smb358_get_prop_batt_present(chip) - || !chip->vadc_dev - || !chip->using_pmic_therm) + if (!smb358_get_prop_batt_present(chip)) return DEFAULT_TEMP; - rc = qpnp_vadc_read(chip->vadc_dev, LR_MUX1_BATT_THERM, &results); + rc = qpnp_vadc_read(chip->vadc_dev, P_MUX2_1_1, &results); if (rc) { pr_debug("Unable to read batt temperature rc=%d\n", rc); return DEFAULT_TEMP; } - pr_debug("get_bat_temp %d, %lld\n", + pr_err("get_bat_temp %d, %lld\n", results.adc_code, results.physical); - return (int)results.physical; + #ifdef CONFIG_DISABLE_TEMP_PROTECT + pr_err("WINGTECH disable temp protect version; real temp:%lld\n", results.physical*10); + return 250; + #endif + if (results.physical*10 > 46 && results.physical*10 < 51) + return results.physical * 10 + 4; + else if (results.physical*10 > 51 && results.physical*10 < 56) + return results.physical*10 + 6; + else + return results.physical*10; + + } +int battid_resister = 0; +#define DEFAULT_RESISTER 50 + + + int smb358_get_prop_battid_resister(struct smb358_charger *chip) +{ + int rc = 0; + struct qpnp_vadc_result results; + + rc = qpnp_vadc_read(chip->vadc_dev, P_MUX4_1_1, &results); + if (rc) { + pr_debug("Unable to read batt resister rc=%d\n", rc); + return DEFAULT_RESISTER; + } + battid_resister = (results.physical)*68/(1800000 - results.physical); + pr_debug("battid_resister = %d\n", battid_resister); + + return battid_resister; +} + +#define SMB358_DEFAULT_BATT_VOLTAGE 4000 + static int smb358_get_prop_battery_voltage_now(struct smb358_charger *chip) +{ + + union power_supply_propval ret = {0, }; + + if (chip->fake_battery_soc >= 0) + return chip->fake_battery_soc; + + if (!cw2015_psy) + cw2015_psy = power_supply_get_by_name("rk-bat"); + if (cw2015_psy) { + cw2015_psy->get_property(cw2015_psy, + POWER_SUPPLY_PROP_VOLTAGE_NOW, &ret); + pr_err("POWER_SUPPLY_PROP_VOLTAGE_NOW IS:%d\n", ret.intval); + return ret.intval; + } + pr_debug("Couldn't get bms_psy, return default capacity\n"); + return SMB358_DEFAULT_BATT_VOLTAGE; +} + +static int __smb358_path_suspend(struct smb358_charger *chip, bool suspend) +{ + int rc; + + rc = smb358_masked_write(chip, CMD_A_REG, + CMD_A_CHG_SUSP_EN_MASK, + suspend ? CMD_A_CHG_SUSP_EN_BIT : 0); + if (rc < 0) + dev_err(chip->dev, "Couldn't set CMD_A reg, rc = %d\n", rc); + return rc; +} + +static int smb358_path_suspend(struct smb358_charger *chip, int reason, + bool suspend) { int rc = 0; - struct qpnp_vadc_result results; + int suspended; - if (!chip->vadc_dev || !chip->pmic_vbat_sns) - return 0; + mutex_lock(&chip->path_suspend_lock); + suspended = chip->usb_suspended; - rc = qpnp_vadc_read(chip->vadc_dev, VBAT_SNS, &results); - if (rc) { - pr_err("Unable to read vbat rc=%d\n", rc); - return 0; + if (suspend == false) + suspended &= ~reason; + else + suspended |= reason; + + if (!chip->usb_suspended && suspended) { + rc = __smb358_path_suspend(chip, true); + chip->usb_suspended = suspended; + power_supply_set_online(chip->usb_psy, !chip->usb_suspended); + power_supply_changed(chip->usb_psy); + } else if (chip->usb_suspended && !suspended) { + rc = __smb358_path_suspend(chip, false); + chip->usb_suspended = suspended; + power_supply_set_online(chip->usb_psy, !chip->usb_suspended); + power_supply_changed(chip->usb_psy); } - return results.physical; + + if (rc) + dev_err(chip->dev, "Couldn't set/unset suspend rc = %d\n", rc); + + mutex_unlock(&chip->path_suspend_lock); + return rc; } static int smb358_set_usb_chg_current(struct smb358_charger *chip, - int current_ma) + int curr_ma) { int i, rc = 0; u8 reg1 = 0, reg2 = 0, mask = 0; + int current_ma; - dev_dbg(chip->dev, "%s: USB current_ma = %d\n", __func__, current_ma); + pr_debug("%s: USB current_ma = %d\n", __func__, curr_ma); if (chip->chg_autonomous_mode) { - dev_dbg(chip->dev, "%s: Charger in autonmous mode\n", __func__); + pr_debug("%s: Charger in autonmous mode\n", __func__); return 0; } + if (recovery != true && curr_ma == pre_usb_current_ma) { + return 0; + } + recovery = false; + + if (thermal == false) { + current_ma = curr_ma; + pre_usb_current_ma = curr_ma; + pr_debug("current ma1 is %d\n", current_ma); + } else { + current_ma = min(curr_ma, chip->thermal_mitigation[chip->therm_lvl_sel]); + pr_debug("current ma2 is %d\n", current_ma); + } if (current_ma < USB3_MIN_CURRENT_MA && current_ma != 2) current_ma = USB2_MIN_CURRENT_MA; @@ -1088,7 +1473,12 @@ static int smb358_set_usb_chg_current(struct smb358_charger *chip, if (rc) dev_err(chip->dev, "Couldn't set input mA rc=%d\n", rc); } - + mask = 0; + rc = __smb358_write_reg(chip, CMD_B_REG, mask); + if (rc) { + dev_err(chip->dev, + "smb358_write Failed: reg=%03X, rc=%d\n", CMD_B_REG, rc); + } mask = CMD_B_CHG_HC_ENABLE_BIT | CMD_B_CHG_USB_500_900_ENABLE_BIT; rc = smb358_masked_write(chip, CMD_B_REG, mask, reg2); if (rc < 0) @@ -1120,6 +1510,7 @@ smb358_batt_property_is_writeable(struct power_supply *psy, switch (psp) { case POWER_SUPPLY_PROP_CHARGING_ENABLED: case POWER_SUPPLY_PROP_CAPACITY: + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: return 1; default: break; @@ -1135,6 +1526,106 @@ static int bound_soc(int soc) return soc; } +static int smb358_set_appropriate_current(struct smb358_charger *chip, + enum path_type path) +{ + int therm_ma; + + + int rc = 0; + + if (!chip->usb_psy && path == USB) + return 0; + /* + * If battery is absent do not modify the current at all, these + * would be some appropriate values set by the bootloader or default + * configuration and since it is the only source of power we should + * not change it + */ + if (chip->battery_missing) { + pr_debug("ignoring current request since battery is absent\n"); + return 0; + } + + #if 0 + if (path == USB) { + path_current = chip->usb_psy_ma; + func = smb135x_set_usb_chg_current; + } else { + path_current = chip->dc_psy_ma; + func = smb135x_set_dc_chg_current; + if (chip->dc_psy_type == -EINVAL) + func = NULL; + } + #endif + + if (chip->therm_lvl_sel >= 0 + && chip->therm_lvl_sel <= (chip->thermal_levels - 1)) { /* + * consider thermal limit only when it is active and not at + * the highest level + */ + therm_ma = chip->thermal_mitigation[chip->therm_lvl_sel]; + if (chip->therm_lvl_sel == 0) { + thermal = false; + recovery = true; + } else { + thermal = true; + } + } else { + + pr_debug("Not effective thermal levels\n"); + pr_debug("therm_ma is %d\n", therm_ma); + } + + + therm_ma = min(therm_ma, chip->psy_usb_ma); + pr_debug("therm_ma is %d\n", therm_ma); + pr_debug("chip->psy_usb_ma is %d\n", chip->psy_usb_ma); + pr_debug("thermal limited charging current to %d\n", therm_ma); + + smb358_set_usb_chg_current(chip, therm_ma); + return rc; +} + + +static int smb358_system_temp_level_set(struct smb358_charger *chip, + int lvl_sel) +{ + int rc = 0; + int prev_therm_lvl; + + if (!chip->thermal_mitigation) { + pr_err("Thermal mitigation not supported\n"); + return -EINVAL; + } + + if (lvl_sel < 0) { + pr_err("Unsupported level selected %d\n", lvl_sel); + return -EINVAL; + } + + if (lvl_sel >= chip->thermal_levels) { + pr_err("Unsupported level selected %d forcing %d\n", lvl_sel, + chip->thermal_levels - 1); + lvl_sel = chip->thermal_levels - 1; + } + + if (lvl_sel == chip->therm_lvl_sel) + return 0; + + mutex_lock(&chip->current_change_lock); + prev_therm_lvl = chip->therm_lvl_sel; + chip->therm_lvl_sel = lvl_sel; + pr_debug("chip->therm_lvl_sel = %d\n", chip->therm_lvl_sel); + + smb358_set_appropriate_current(chip, USB); + + mutex_unlock(&chip->current_change_lock); + return rc; +} + + + static int smb358_battery_set_property(struct power_supply *psy, enum power_supply_property prop, const union power_supply_propval *val) @@ -1156,14 +1647,16 @@ static int smb358_battery_set_property(struct power_supply *psy, rc); } else { chip->batt_full = true; - dev_dbg(chip->dev, "status = FULL, batt_full = %d\n", + + pr_debug("status = FULL, batt_full = %d\n", chip->batt_full); } break; case POWER_SUPPLY_STATUS_DISCHARGING: chip->batt_full = false; + power_supply_changed(&chip->batt_psy); - dev_dbg(chip->dev, "status = DISCHARGING, batt_full = %d\n", + pr_debug("status = DISCHARGING, batt_full = %d\n", chip->batt_full); break; case POWER_SUPPLY_STATUS_CHARGING: @@ -1174,7 +1667,8 @@ static int smb358_battery_set_property(struct power_supply *psy, rc); } else { chip->batt_full = false; - dev_dbg(chip->dev, "status = CHARGING, batt_full = %d\n", + + pr_debug("status = CHARGING, batt_full = %d\n", chip->batt_full); } break; @@ -1190,6 +1684,9 @@ static int smb358_battery_set_property(struct power_supply *psy, chip->fake_battery_soc = bound_soc(val->intval); power_supply_changed(&chip->batt_psy); break; + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: + smb358_system_temp_level_set(chip, val->intval); + break; default: return -EINVAL; } @@ -1198,8 +1695,8 @@ static int smb358_battery_set_property(struct power_supply *psy, } static int smb358_battery_get_property(struct power_supply *psy, - enum power_supply_property prop, - union power_supply_propval *val) + enum power_supply_property prop, + union power_supply_propval *val) { struct smb358_charger *chip = container_of(psy, struct smb358_charger, batt_psy); @@ -1224,17 +1721,35 @@ static int smb358_battery_get_property(struct power_supply *psy, val->intval = smb358_get_prop_batt_health(chip); break; case POWER_SUPPLY_PROP_TECHNOLOGY: - val->intval = POWER_SUPPLY_TECHNOLOGY_LION; + val->intval = POWER_SUPPLY_TECHNOLOGY_LIPO; break; case POWER_SUPPLY_PROP_MODEL_NAME: val->strval = "SMB358"; break; + case POWER_SUPPLY_PROP_BATTERY_TYPE: + val->strval = (chip->battery_type); + break; + case POWER_SUPPLY_PROP_RESISTANCE_ID: + val->intval = smb358_get_prop_battid_resister(chip); + break; case POWER_SUPPLY_PROP_TEMP: val->intval = smb358_get_prop_batt_temp(chip); break; case POWER_SUPPLY_PROP_VOLTAGE_NOW: val->intval = smb358_get_prop_battery_voltage_now(chip); break; + case POWER_SUPPLY_PROP_CURRENT_NOW: + val->intval = get_prop_current_now(chip); + break; + case POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL: + val->intval = chip->therm_lvl_sel; + break; + case POWER_SUPPLY_PROP_CHARGE_FULL_DESIGN: + val->intval = chip->fcc_mah; + break; + case POWER_SUPPLY_PROP_CHARGE_FULL: + val->intval = chip->fcc_mah; + break; default: return -EINVAL; } @@ -1248,13 +1763,13 @@ static int apsd_complete(struct smb358_charger *chip, u8 status) enum power_supply_type type = POWER_SUPPLY_TYPE_UNKNOWN; /* - * If apsd is disabled, charger detection is done by - * DCIN UV irq. - * status = ZERO - indicates charger removed, handled - * by DCIN UV irq - */ + * If apsd is disabled, charger detection is done by + * DCIN UV irq. + * status = ZERO - indicates charger removed, handled + * by DCIN UV irq + */ if (chip->disable_apsd || status == 0) { - dev_dbg(chip->dev, "APSD %s, status = %d\n", + pr_debug("APSD %s, status = %d\n", chip->disable_apsd ? "disabled" : "enabled", !!status); return 0; } @@ -1265,7 +1780,7 @@ static int apsd_complete(struct smb358_charger *chip, u8 status) return rc; } - dev_dbg(chip->dev, "%s: STATUS_D_REG=%x\n", __func__, reg); + pr_debug("%s: STATUS_D_REG=%x\n", __func__, reg); switch (reg & STATUS_D_CHARGING_PORT_MASK) { case STATUS_D_PORT_ACA_DOCK: @@ -1293,13 +1808,13 @@ static int apsd_complete(struct smb358_charger *chip, u8 status) chip->chg_present = !!status; - dev_dbg(chip->dev, "APSD complete. USB type detected=%d chg_present=%d", + pr_debug("APSD complete. USB type detected=%d chg_present=%d", type, chip->chg_present); power_supply_set_supply_type(chip->usb_psy, type); - /* SMB is now done sampling the D+/D- lines, indicate USB driver */ - dev_dbg(chip->dev, "%s updating usb_psy present=%d", __func__, + /* SMB is now done sampling the D+/D- lines, indicate USB driver */ + pr_err("%s pluginupdating usb_psy present=%d", __func__, chip->chg_present); power_supply_set_present(chip->usb_psy, chip->chg_present); @@ -1309,16 +1824,22 @@ static int apsd_complete(struct smb358_charger *chip, u8 status) static int chg_uv(struct smb358_charger *chip, u8 status) { int rc; + ktime_t kt; /* use this to detect USB insertion only if !apsd */ if (chip->disable_apsd && status == 0) { + kt = ns_to_ktime(1LL*NSEC_PER_SEC); + alarm_start_relative(&chip->batt_temp_alarm, kt); chip->chg_present = true; - dev_dbg(chip->dev, "%s updating usb_psy present=%d", + pre_usb_current_ma = -EINVAL; + + pr_err("%s pluginupdating usb_psy present=%d", __func__, chip->chg_present); - power_supply_set_supply_type(chip->usb_psy, - POWER_SUPPLY_TYPE_USB); + + + power_supply_set_present(chip->usb_psy, chip->chg_present); - if (chip->bms_controlled_charging) { + if (chip->bms_controlled_charging) /* * Disable SOC based USB suspend to enable charging on * USB insertion. @@ -1326,35 +1847,41 @@ static int chg_uv(struct smb358_charger *chip, u8 status) rc = smb358_charging_disable(chip, SOC, false); if (rc < 0) dev_err(chip->dev, - "Couldn't disable usb suspend rc = %d\n", - rc); - } + "Couldn't disable usb suspend rc = %d\n", + rc); } if (status != 0) { chip->chg_present = false; - dev_dbg(chip->dev, "%s updating usb_psy present=%d", + pre_usb_current_ma = -EINVAL; + + pr_err("%s plugoutupdating usb_psy present=%d", __func__, chip->chg_present); /* we can't set usb_psy as UNKNOWN here, will lead USERSPACE issue */ + smb358_charging_disable(chip, THERMAL, 1); + + kt = ns_to_ktime(0); + alarm_start_relative(&chip->batt_temp_alarm, kt); power_supply_set_present(chip->usb_psy, chip->chg_present); } power_supply_changed(chip->usb_psy); - dev_dbg(chip->dev, "chip->chg_present = %d\n", chip->chg_present); + pr_debug("chip->chg_present = %d\n", chip->chg_present); return 0; } static int chg_ov(struct smb358_charger *chip, u8 status) { - u8 psy_health_sts; + + if (status) - psy_health_sts = POWER_SUPPLY_HEALTH_OVERVOLTAGE; + chip->psy_health_sts = POWER_SUPPLY_HEALTH_OVERVOLTAGE; else - psy_health_sts = POWER_SUPPLY_HEALTH_GOOD; + chip->psy_health_sts = POWER_SUPPLY_HEALTH_GOOD; power_supply_set_health_state( - chip->usb_psy, psy_health_sts); + chip->usb_psy, chip->psy_health_sts); power_supply_changed(chip->usb_psy); return 0; @@ -1363,16 +1890,18 @@ static int chg_ov(struct smb358_charger *chip, u8 status) #define STATUS_FAST_CHARGING BIT(6) static int fast_chg(struct smb358_charger *chip, u8 status) { - dev_dbg(chip->dev, "%s\n", __func__); + pr_debug("%s\n", __func__); - if (status & STATUS_FAST_CHARGING) + if (status & STATUS_FAST_CHARGING) { chip->batt_full = false; + + } return 0; } static int chg_term(struct smb358_charger *chip, u8 status) { - dev_dbg(chip->dev, "%s\n", __func__); + pr_debug("%s\n", __func__); if (!chip->iterm_disabled) chip->batt_full = !!status; return 0; @@ -1380,13 +1909,13 @@ static int chg_term(struct smb358_charger *chip, u8 status) static int taper_chg(struct smb358_charger *chip, u8 status) { - dev_dbg(chip->dev, "%s\n", __func__); + pr_debug("%s\n", __func__); return 0; } static int chg_recharge(struct smb358_charger *chip, u8 status) { - dev_dbg(chip->dev, "%s, status = %d\n", __func__, !!status); + pr_debug("%s, status = %d\n", __func__, !!status); /* to check the status mean */ chip->batt_full = !status; return 0; @@ -1398,13 +1927,19 @@ static void smb358_chg_set_appropriate_battery_current( int rc; unsigned int current_max = chip->fastchg_current_max_ma; - if (chip->batt_cool) - current_max = - min(current_max, chip->cool_bat_ma); - if (chip->batt_warm) + if (cool_status) { + if (cool_status_5 == 1) + current_max = + min(current_max, chip->cool_cold_bat_ma); + if (cool_status_5 == 2) + current_max = + min(current_max, chip->cool_normal_bat_ma); + } + + if (warm_status) current_max = min(current_max, chip->warm_bat_ma); - dev_dbg(chip->dev, "setting %dmA", current_max); + pr_debug("setting %dmA", current_max); rc = smb358_fastchg_current_set(chip, current_max); if (rc) dev_err(chip->dev, @@ -1417,19 +1952,22 @@ static void smb358_chg_set_appropriate_vddmax( int rc; unsigned int vddmax = chip->vfloat_mv; - if (chip->batt_cool) + if (cool_status) vddmax = min(vddmax, chip->cool_bat_mv); - if (chip->batt_warm) + if (warm_status) vddmax = min(vddmax, chip->warm_bat_mv); - dev_dbg(chip->dev, "setting %dmV\n", vddmax); + #ifdef CONFIG_DISABLE_TEMP_PROTECT + vddmax = 4100; + #endif + pr_debug("setting %dmV\n", vddmax); rc = smb358_float_voltage_set(chip, vddmax); if (rc) dev_err(chip->dev, "Couldn't set float voltage rc = %d\n", rc); } -#define HYSTERESIS_DECIDEGC 20 +#define HYSTERESIS_DECIDEGC 0 static void smb_chg_adc_notification(enum qpnp_tm_state state, void *ctx) { struct smb358_charger *chip = ctx; @@ -1442,7 +1980,7 @@ static void smb_chg_adc_notification(enum qpnp_tm_state state, void *ctx) return; } - temp = smb358_get_prop_batt_temp(chip); + temp = 250; pr_debug("temp = %d state = %s\n", temp, state == ADC_TM_WARM_STATE ? "hot" : "cold"); @@ -1592,7 +2130,7 @@ static void smb_chg_adc_notification(enum qpnp_tm_state state, void *ctx) chip->batt_hot = bat_hot; chip->batt_cold = bat_cold; /* stop charging explicitly since we use PMIC thermal pin*/ - if (bat_hot || bat_cold || chip->battery_missing) + if ((bat_hot || bat_cold || chip->battery_missing) && !disable_software_temp_monitor) smb358_charging_disable(chip, THERMAL, 1); else smb358_charging_disable(chip, THERMAL, 0); @@ -1646,6 +2184,19 @@ static int battery_missing(struct smb358_charger *chip, u8 status) return 0; } +/** + * power_ok_handler() - called when the switcher turns on or turns off + * @chip: pointer to smb135x_chg chip + * @rt_stat: the status bit indicating switcher turning on or off + */ +static int power_ok_handler(struct smb358_charger *chip, u8 rt_stat) +{ + chip->power_ok = !!rt_stat; + msleep(30); + power_supply_changed(&chip->batt_psy); + return 0; +} + static struct irq_handler_info handlers[] = { [0] = { .stat_reg = IRQ_A_REG, @@ -1761,6 +2312,7 @@ static struct irq_handler_info handlers[] = { .irq_info = { { .name = "power_ok", + .smb_irq = power_ok_handler, }, { .name = "otg_det", @@ -1778,6 +2330,39 @@ static struct irq_handler_info handlers[] = { #define IRQ_LATCHED_MASK 0x02 #define IRQ_STATUS_MASK 0x01 #define BITS_PER_IRQ 2 +static int smb358_update_power_on_state(struct smb358_charger *chip) +{ + int i, j; + int rc; + u8 rt_stat, prev_rt_stat, changed; + struct smb_irq_info *info; + for (i = 0; i < ARRAY_SIZE(handlers); i++) { + if (handlers[i].stat_reg == IRQ_F_REG) { + rc = smb358_read_reg(chip, handlers[i].stat_reg, + &handlers[i].val); + if (rc < 0) { + dev_err(chip->dev, "Couldn't read %d rc = %d\n", + handlers[i].stat_reg, rc); + return -EPERM; + } + info = handlers[i].irq_info; + for (j = 0; j < ARRAY_SIZE(handlers[i].irq_info); j++) { + if (!strcmp(info[j].name, "power_ok")) { + rt_stat = handlers[i].val + & (IRQ_STATUS_MASK << (j * BITS_PER_IRQ)); + prev_rt_stat = handlers[i].prev_val & (IRQ_STATUS_MASK << (j * BITS_PER_IRQ)); + changed = prev_rt_stat ^ rt_stat; + if (changed) { + handlers[i].prev_val = handlers[i].val; + chip->power_ok = rt_stat; + pr_debug("chip->power_ok = %d\n", chip->power_ok); + } + } + } + } + } + return 0; +} static irqreturn_t smb358_chg_stat_handler(int irq, void *dev_id) { struct smb358_charger *chip = dev_id; @@ -1787,18 +2372,15 @@ static irqreturn_t smb358_chg_stat_handler(int irq, void *dev_id) u8 rt_stat, prev_rt_stat; int rc; int handler_count = 0; - mutex_lock(&chip->irq_complete); - chip->irq_waiting = true; if (!chip->resume_completed) { - dev_dbg(chip->dev, "IRQ triggered before device-resume\n"); + pr_debug("IRQ triggered before device-resume\n"); disable_irq_nosync(irq); mutex_unlock(&chip->irq_complete); return IRQ_HANDLED; } chip->irq_waiting = false; - for (i = 0; i < ARRAY_SIZE(handlers); i++) { rc = smb358_read_reg(chip, handlers[i].stat_reg, &handlers[i].val); @@ -1810,7 +2392,7 @@ static irqreturn_t smb358_chg_stat_handler(int irq, void *dev_id) for (j = 0; j < ARRAY_SIZE(handlers[i].irq_info); j++) { triggered = handlers[i].val - & (IRQ_LATCHED_MASK << (j * BITS_PER_IRQ)); + & (IRQ_LATCHED_MASK << (j * BITS_PER_IRQ)); rt_stat = handlers[i].val & (IRQ_STATUS_MASK << (j * BITS_PER_IRQ)); prev_rt_stat = handlers[i].prev_val @@ -1834,13 +2416,11 @@ static irqreturn_t smb358_chg_stat_handler(int irq, void *dev_id) } handlers[i].prev_val = handlers[i].val; } - pr_debug("handler count = %d\n", handler_count); if (handler_count) { pr_debug("batt psy changed\n"); power_supply_changed(&chip->batt_psy); } - mutex_unlock(&chip->irq_complete); return IRQ_HANDLED; @@ -1859,15 +2439,18 @@ static irqreturn_t smb358_chg_valid_handler(int irq, void *dev_id) } present ^= chip->chg_valid_act_low; - dev_dbg(chip->dev, "%s: chg_present = %d\n", __func__, present); + pr_debug("%s: chg_present = %d\n", __func__, present); if (present != chip->chg_present) { chip->chg_present = present; - dev_dbg(chip->dev, "%s updating usb_psy present=%d", + pre_usb_current_ma = -EINVAL; + + pr_debug("%s updating usb_psy present=%d", __func__, chip->chg_present); power_supply_set_present(chip->usb_psy, chip->chg_present); + power_supply_changed(&chip->batt_psy); } - + pr_debug("smb358_chg_valid_handler has been started\n"); return IRQ_HANDLED; } @@ -1877,6 +2460,11 @@ static void smb358_external_power_changed(struct power_supply *psy) struct smb358_charger, batt_psy); union power_supply_propval prop = {0,}; int rc, current_limit = 0; + int vol; + + dump_regs(chip); + vol = smb358_get_prop_battery_voltage_now(chip); + pr_debug("batt_vol = %d\n", vol); if (chip->bms_psy_name) chip->bms_psy = @@ -1890,11 +2478,14 @@ static void smb358_external_power_changed(struct power_supply *psy) else current_limit = prop.intval / 1000; - + chip->psy_usb_ma = current_limit; smb358_enable_volatile_writes(chip); smb358_set_usb_chg_current(chip, current_limit); - dev_dbg(chip->dev, "current_limit = %d\n", current_limit); + smb358_chg_set_appropriate_battery_current(chip); + smb358_chg_set_appropriate_vddmax(chip); + + pr_debug("current_limit = %d\n", current_limit); } #if defined(CONFIG_DEBUG_FS) @@ -2005,7 +2596,7 @@ static int show_irq_count(struct seq_file *m, void *data) seq_printf(m, "%s=%d\t(high=%d low=%d)\n", handlers[i].irq_info[j].name, handlers[i].irq_info[j].high - + handlers[i].irq_info[j].low, + + handlers[i].irq_info[j].low, handlers[i].irq_info[j].high, handlers[i].irq_info[j].low); total += (handlers[i].irq_info[j].high @@ -2117,59 +2708,34 @@ static void dump_regs(struct smb358_charger *chip) } #endif -static int smb_parse_batt_id(struct smb358_charger *chip) +extern int battery_type_id; +static const char *default_batt_type = "Generic_Battery"; +static int smb_parse_dt_battery(struct smb358_charger *chip) { - int rc = 0, rpull = 0, vref = 0; - int64_t denom, batt_id_uv, numerator; - struct device_node *node = chip->dev->of_node; - struct qpnp_vadc_result result; - - rc = of_property_read_u32(node, "qcom,batt-id-vref-uv", &vref); - if (rc < 0) { - dev_err(chip->dev, - "Couldn't read batt-id-vref-uv rc=%d\n", rc); - return rc; - } - - rc = of_property_read_u32(node, "qcom,batt-id-rpullup-kohm", &rpull); - if (rc < 0) { - dev_err(chip->dev, - "Couldn't read batt-id-rpullup-kohm rc=%d\n", rc); - return rc; - } - /* read battery ID */ - rc = qpnp_vadc_read(chip->vadc_dev, LR_MUX2_BAT_ID, &result); - if (rc) { - dev_err(chip->dev, - "Couldn't read batt id channel=%d, rc=%d\n", - LR_MUX2_BAT_ID, rc); - return rc; - } - batt_id_uv = result.physical; + struct device_node *node = chip->dev->of_node; + struct device_node *batt_node, *profile_node; - if (batt_id_uv == 0) { - /*vadc not correct or batt id line grounded, report 0 kohms */ - dev_warn(chip->dev, "batt_id_uv=0, batt-id grounded\n"); + batt_node = of_find_node_by_name(node, "qcom,battery-data"); + if (!batt_node) { return 0; } + profile_node = of_batterydata_get_best_profile(batt_node, + "battery", NULL); - numerator = batt_id_uv * rpull * 1000; - denom = vref - batt_id_uv; - - /* batt id connector might be open, return 0 kohms */ - if (denom == 0) - return 0; - - chip->connected_rid = div64_s64(numerator, denom); + if (battery_type_id == 1 || battery_type_id == 2) + of_property_read_string(profile_node, "qcom,battery-type", &chip->battery_type); + else { + chip->battery_type = default_batt_type; + hardwareinfo_set_prop(HARDWARE_BATTERY_ID, chip->battery_type); + } + dev_err(chip->dev, "found battery type is %s\n", chip->battery_type); - dev_dbg(chip->dev, - "batt_id_voltage=%lld numerator=%lld denom=%lld connected_rid=%d\n", - batt_id_uv, numerator, denom, chip->connected_rid); return 0; } + static int smb_parse_dt(struct smb358_charger *chip) { int rc; @@ -2194,8 +2760,6 @@ static int smb_parse_dt(struct smb358_charger *chip) chip->using_pmic_therm = of_property_read_bool(node, "qcom,using-pmic-therm"); - chip->pmic_vbat_sns = of_property_read_bool(node, - "qcom,using-vbat-sns"); chip->bms_controlled_charging = of_property_read_bool(node, "qcom,bms-controlled-charging"); @@ -2207,7 +2771,7 @@ static int smb_parse_dt(struct smb358_charger *chip) chip->chg_valid_gpio = of_get_named_gpio_flags(node, "qcom,chg-valid-gpio", 0, &gpio_flags); if (!gpio_is_valid(chip->chg_valid_gpio)) - dev_dbg(chip->dev, "Invalid chg-valid-gpio"); + pr_debug("Invalid chg-valid-gpio"); else chip->chg_valid_act_low = gpio_flags & OF_GPIO_ACTIVE_LOW; @@ -2262,8 +2826,13 @@ static int smb_parse_dt(struct smb358_charger *chip) rc |= of_property_read_u32(node, "qcom,warm-bat-mv", &chip->warm_bat_mv); - rc |= of_property_read_u32(node, "qcom,cool-bat-ma", - &chip->cool_bat_ma); + /*rc |= of_property_read_u32(node, "qcom,cool-bat-ma", + &chip->cool_bat_ma);*/ + rc |= of_property_read_u32(node, "qcom,cool-cold-bat-ma", + &chip->cool_cold_bat_ma); + + rc |= of_property_read_u32(node, "qcom,cool-normal-bat-ma", + &chip->cool_normal_bat_ma); rc |= of_property_read_u32(node, "qcom,warm-bat-ma", &chip->warm_bat_ma); @@ -2273,6 +2842,27 @@ static int smb_parse_dt(struct smb358_charger *chip) chip->jeita_supported = true; } + if (of_find_property(node, "qcom,thermal-mitigation", + &chip->thermal_levels)) { + chip->thermal_mitigation = devm_kzalloc(chip->dev, + chip->thermal_levels, + GFP_KERNEL); + + if (chip->thermal_mitigation == NULL) { + pr_err("thermal mitigation kzalloc() failed.\n"); + return -ENOMEM; + } + + chip->thermal_levels /= sizeof(int); + rc = of_property_read_u32_array(node, + "qcom,thermal-mitigation", + chip->thermal_mitigation, chip->thermal_levels); + pr_debug("thermal_mitigations = %d, %d, %d, %d; thermal_levels = %d\n", chip->thermal_mitigation[0], chip->thermal_mitigation[1], chip->thermal_mitigation[2], chip->thermal_mitigation[3], chip->thermal_levels); + if (rc) { + pr_err("Couldn't read threm limits rc = %d\n", rc); + return rc; + } + } pr_debug("jeita_supported = %d", chip->jeita_supported); rc = of_property_read_u32(node, "qcom,bat-present-decidegc", @@ -2292,28 +2882,19 @@ static int smb_parse_dt(struct smb358_charger *chip) } } - chip->skip_usb_suspend_for_fake_battery = of_property_read_bool(node, - "qcom,skip-usb-suspend-for-fake-battery"); - if (!chip->skip_usb_suspend_for_fake_battery) { - if (!chip->vadc_dev) { - dev_err(chip->dev, - "VADC device not present with usb suspend on fake battery\n"); - return -EINVAL; - } - rc = smb_parse_batt_id(chip); - if (rc) { - dev_err(chip->dev, - "failed to read batt-id rc=%d\n", rc); - return rc; - } + rc = of_property_read_u32(node, "qcom,battery-fcc", + &chip->fcc_mah); + if (rc) { + chip->fcc_mah = BATTERY_FCC; } + pr_debug("inhibit-disabled = %d, recharge-disabled = %d, recharge-mv = %d,", chip->inhibit_disabled, chip->recharge_disabled, chip->recharge_mv); pr_debug("vfloat-mv = %d, iterm-disabled = %d,", - chip->vfloat_mv, chip->iterm_disabled); + chip->vfloat_mv, chip->iterm_ma); pr_debug("fastchg-current = %d, charging-disabled = %d,", chip->fastchg_current_max_ma, chip->charging_disabled); @@ -2322,6 +2903,7 @@ static int smb_parse_dt(struct smb358_charger *chip) chip->cold_bat_decidegc); pr_debug("hot-bat-degree = %d, bat-present-decidegc = %d\n", chip->hot_bat_decidegc, chip->bat_present_decidegc); + pr_debug("fcc_mah is %d \n", chip->fcc_mah); return 0; } @@ -2391,8 +2973,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) struct dentry *ent; ent = debugfs_create_file("config_registers", S_IFREG | S_IRUGO, - chip->debug_root, chip, - &cnfg_debugfs_ops); + chip->debug_root, chip, + &cnfg_debugfs_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2401,8 +2983,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_file("status_registers", S_IFREG | S_IRUGO, - chip->debug_root, chip, - &status_debugfs_ops); + chip->debug_root, chip, + &status_debugfs_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2411,8 +2993,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_file("cmd_registers", S_IFREG | S_IRUGO, - chip->debug_root, chip, - &cmd_debugfs_ops); + chip->debug_root, chip, + &cmd_debugfs_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2421,8 +3003,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_x32("address", S_IFREG | S_IWUSR | S_IRUGO, - chip->debug_root, - &(chip->peek_poke_address)); + chip->debug_root, + &(chip->peek_poke_address)); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2431,8 +3013,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_file("data", S_IFREG | S_IWUSR | S_IRUGO, - chip->debug_root, chip, - &poke_poke_debug_ops); + chip->debug_root, chip, + &poke_poke_debug_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2441,9 +3023,9 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_file("force_irq", - S_IFREG | S_IWUSR | S_IRUGO, - chip->debug_root, chip, - &force_irq_ops); + S_IFREG | S_IWUSR | S_IRUGO, + chip->debug_root, chip, + &force_irq_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2452,8 +3034,8 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } ent = debugfs_create_file("irq_count", S_IFREG | S_IRUGO, - chip->debug_root, chip, - &irq_count_debugfs_ops); + chip->debug_root, chip, + &irq_count_debugfs_ops); if (!ent || IS_ERR(ent)) { rc = PTR_ERR(ent); dev_err(chip->dev, @@ -2468,16 +3050,89 @@ static void smb358_debugfs_init(struct smb358_charger *chip) } #endif +int into_fastmmi_mode(struct smb358_charger *chip) +{ + int ret; + char *cmdline_fastmmi = NULL; + char *temp; + + cmdline_fastmmi = strstr(saved_command_line, "androidboot.mode="); + if (cmdline_fastmmi != NULL) { + temp = cmdline_fastmmi + strlen("androidboot.mode="); + ret = strncmp(temp, "ffbm", strlen("ffbm")); + if (ret == 0) { + pr_err("into fastmmi mode\n"); + fastmmi_mode = 1; + return 1;/* fastmmi mode*/ + } else{ + pr_err("others modes\n"); + fastmmi_mode = 0; + return 2;/* Others mode*/ + } + } + pr_err("has no androidboot.mode \n"); + return 0; +} + +bool disable_charging = false; +void get_capacity_disable_charging(struct smb358_charger *chip) +{ + char *boardid_string = NULL; + char boardid_start[32] = " "; + int India_0; + int India_1; + + boardid_string = strstr(saved_command_line, "board_id="); + + if (boardid_string != NULL) { + strncpy(boardid_start, boardid_string+9, 9); + India_0 = strncmp(boardid_start, "S88503BA1", 9); + India_1 = strncmp(boardid_start, "S88503BB1", 9); + } + if (((India_0 == 0) || (India_1 == 0)) && (into_fastmmi_mode(chip) == 1)) { + disable_charging = true; + } else{ + pr_err("else discharg\n"); + disable_charging = false; + } +} +static void charger_abnormal_detect_work(struct work_struct *work) +{ + struct smb358_charger *chip = container_of(work, + struct smb358_charger, + abnormal_detect.work); + int rc, soc; + soc = smb358_get_prop_batt_capacity(chip); + get_capacity_disable_charging(chip); + if (into_fastmmi_mode(chip) == 1) { + if (disable_charging) { + if (soc >= 80 && soc <= 100) { + rc = smb358_charging_disable(chip, SOC, true); + if (rc < 0) { + dev_err(chip->dev, "Couldn't disable charging: rc = %d\n", rc); + } + } else if (soc >= 0 && soc < 80) { + rc = smb358_charging_disable(chip, SOC, false); + if (rc < 0) { + dev_err(chip->dev, "Couldn't enable charging: rc = %d\n", rc); + } + } + } + schedule_delayed_work(&chip->abnormal_detect, msecs_to_jiffies(20000)); + } +} + #define SMB_I2C_VTG_MIN_UV 1800000 #define SMB_I2C_VTG_MAX_UV 1800000 static int smb358_charger_probe(struct i2c_client *client, const struct i2c_device_id *id) { int rc, irq; + ktime_t kt; + struct smb358_charger *chip; struct power_supply *usb_psy; u8 reg = 0; - usb_psy = power_supply_get_by_name("usb"); if (!usb_psy) { dev_dbg(&client->dev, "USB psy not found; deferring probe\n"); @@ -2495,15 +3150,13 @@ static int smb358_charger_probe(struct i2c_client *client, chip->usb_psy = usb_psy; chip->fake_battery_soc = -EINVAL; - if (of_find_property(chip->dev->of_node, "qcom,chg-vadc", NULL)) { - /* early for VADC get, defer probe if needed */ - chip->vadc_dev = qpnp_get_vadc(chip->dev, "chg"); - if (IS_ERR(chip->vadc_dev)) { - rc = PTR_ERR(chip->vadc_dev); - if (rc != -EPROBE_DEFER) - pr_err("vadc property configured incorrectly\n"); - return rc; - } + /* early for VADC get, defer probe if needed */ + chip->vadc_dev = qpnp_get_vadc(chip->dev, "chg"); + if (IS_ERR(chip->vadc_dev)) { + rc = PTR_ERR(chip->vadc_dev); + if (rc != -EPROBE_DEFER) + pr_err("vadc property missing\n"); + return rc; } rc = smb_parse_dt(chip); @@ -2529,14 +3182,28 @@ static int smb358_charger_probe(struct i2c_client *client, dev_err(&client->dev, "Regulator vcc_i2c enable failed rc = %d\n", rc); - goto err_set_vtg_i2c; + pr_debug("first alarm start\n"); goto err_set_vtg_i2c; } } mutex_init(&chip->irq_complete); mutex_init(&chip->read_write_lock); mutex_init(&chip->path_suspend_lock); + mutex_init(&chip->current_change_lock); + wake_lock_init(&chip->wake_lock_hightemp, WAKE_LOCK_SUSPEND, "wake_lock_hightemp"); + + + + INIT_DELAYED_WORK(&chip->abnormal_detect, charger_abnormal_detect_work); + + + INIT_WORK(&chip->batt_temp_work, qpnp_lbc_temp_alarm_work_fn); + alarm_init(&chip->batt_temp_alarm, ALARM_REALTIME, batt_temp_alarm_callback); + if (chip->chg_present) { + kt = ns_to_ktime(5LL*NSEC_PER_SEC); + alarm_start_relative(&chip->batt_temp_alarm, kt); + } /* probe the device to check if its actually connected */ rc = smb358_read_reg(chip, CHG_OTH_CURRENT_CTRL_REG, ®); if (rc) { @@ -2571,6 +3238,14 @@ static int smb358_charger_probe(struct i2c_client *client, chip->resume_completed = true; + if (chip->bms_psy) { + chip->batt_psy.bms_psy_ok = 1; + } else { + chip->batt_psy.bms_psy_ok = 0; + } + + smb358_update_power_on_state(chip); + chip->batt_psy.bms_psy_ok = 0; rc = power_supply_register(chip->dev, &chip->batt_psy); if (rc < 0) { dev_err(&client->dev, "Couldn't register batt psy rc = %d\n", @@ -2586,6 +3261,11 @@ static int smb358_charger_probe(struct i2c_client *client, "Couldn't initialize smb358 ragulator rc=%d\n", rc); goto fail_regulator_register; } + rc = smb_parse_dt_battery(chip); + if (rc) { + dev_err(&client->dev, + " smb_parse_dt_battery rc=%d\n", rc); + } rc = smb358_hw_init(chip); if (rc) { @@ -2656,7 +3336,7 @@ static int smb358_charger_probe(struct i2c_client *client, } rc = devm_request_threaded_irq(&client->dev, irq, NULL, smb358_chg_stat_handler, - IRQF_TRIGGER_FALLING | IRQF_ONESHOT, + IRQF_TRIGGER_FALLING | IRQF_ONESHOT, "smb358_chg_stat_irq", chip); if (rc) { dev_err(&client->dev, @@ -2683,7 +3363,8 @@ static int smb358_charger_probe(struct i2c_client *client, chip->adc_param.btm_ctx = chip; chip->adc_param.threshold_notification = smb_chg_adc_notification; - chip->adc_param.channel = LR_MUX1_BATT_THERM; + chip->adc_param.channel = P_MUX2_1_1; + /* update battery missing info in tm_channel_measure*/ rc = qpnp_adc_tm_channel_measure(chip->adc_tm_dev, @@ -2698,6 +3379,17 @@ static int smb358_charger_probe(struct i2c_client *client, dev_info(chip->dev, "SMB358 successfully probed. charger=%d, batt=%d\n", chip->chg_present, smb358_get_prop_batt_present(chip)); + + if (chip->bms_psy_name) { + chip->bms_psy = power_supply_get_by_name((char *)chip->bms_psy_name); + if (chip->bms_psy && chip->bms_psy->bms_psy_ok == 1 && chip->power_ok) { + chip->batt_psy.bms_psy_ok = 1; + } + + } + + schedule_delayed_work(&chip->abnormal_detect, 0); + return 0; fail_chg_valid_irq: @@ -2722,6 +3414,11 @@ static int smb358_charger_remove(struct i2c_client *client) { struct smb358_charger *chip = i2c_get_clientdata(client); + pr_err("smb358 charger remove\n"); + hot_status = 0; + cold_status = 0; + warm_status = 0; + cool_status = 0; power_supply_unregister(&chip->batt_psy); if (gpio_is_valid(chip->chg_valid_gpio)) gpio_free(chip->chg_valid_gpio); @@ -2730,7 +3427,12 @@ static int smb358_charger_remove(struct i2c_client *client) regulator_disable(chip->vcc_i2c); mutex_destroy(&chip->irq_complete); + wake_lock_destroy(&chip->wake_lock_hightemp); debugfs_remove_recursive(chip->debug_root); + + alarm_cancel(&chip->batt_temp_alarm); + cancel_work_sync(&chip->batt_temp_work); + cancel_delayed_work(&chip->abnormal_detect); return 0; } @@ -2740,7 +3442,6 @@ static int smb358_suspend(struct device *dev) struct smb358_charger *chip = i2c_get_clientdata(client); int rc; int i; - for (i = 0; i < 2; i++) { rc = smb358_read_reg(chip, FAULT_INT_REG + i, &chip->irq_cfg_mask[i]); diff --git a/drivers/regulator/Kconfig b/drivers/regulator/Kconfig index cce12d14704ad..31584dce04988 100644 --- a/drivers/regulator/Kconfig +++ b/drivers/regulator/Kconfig @@ -900,3 +900,17 @@ config REGULATOR_KRYO endif +config REGULATOR_TPS65132 + tristate "TI TPS65132 Power regulator" + depends on I2C + select REGMAP_I2C + help + This driver supports TPS65132 voltage regulator chips. The chip has + a synchronous boost converter that generates a positive voltage which + is regulated down by an integrated LDO, providing a positive supply + rail. It also has a negative supply rail which is generated by an + integrated negative charge pump driven from the boost converter + output. Both output regulators support 4V~6V voltage range and + can be configured separately. Each regulator can be enabled and + disabled independently through an external pin. + diff --git a/drivers/regulator/Makefile b/drivers/regulator/Makefile index 3334ef2fe320e..eab8b43104112 100644 --- a/drivers/regulator/Makefile +++ b/drivers/regulator/Makefile @@ -110,4 +110,5 @@ obj-$(CONFIG_REGULATOR_QPNP_LABIBB) += qpnp-labibb-regulator.o obj-$(CONFIG_REGULATOR_STUB) += stub-regulator.o obj-$(CONFIG_REGULATOR_KRYO) += kryo-regulator.o obj-$(CONFIG_REGULATOR_CPR2_GFX) += cpr2-gfx-regulator.o +obj-$(CONFIG_REGULATOR_TPS65132) += tps65132-regulator.o ccflags-$(CONFIG_REGULATOR_DEBUG) += -DDEBUG diff --git a/drivers/regulator/cpr3-hmss-regulator.c b/drivers/regulator/cpr3-hmss-regulator.c index afe9c21404d67..a9259058e0e23 100644 --- a/drivers/regulator/cpr3-hmss-regulator.c +++ b/drivers/regulator/cpr3-hmss-regulator.c @@ -87,8 +87,9 @@ struct cpr3_msm8996_hmss_fuses { /* * Fuse combos 0 - 7 map to CPR fusing revision 0 - 7 with speed bin fuse = 0. * Fuse combos 8 - 15 map to CPR fusing revision 0 - 7 with speed bin fuse = 1. + * Fuse combos 16 - 23 map to CPR fusing revision 0 - 7 with speed bin fuse = 2. */ -#define CPR3_MSM8996_HMSS_FUSE_COMBO_COUNT 16 +#define CPR3_MSM8996_HMSS_FUSE_COMBO_COUNT 24 /* * Constants which define the name of each fuse corner. Note that no actual diff --git a/drivers/regulator/cpr3-mmss-regulator.c b/drivers/regulator/cpr3-mmss-regulator.c index 6125a3b4a569c..2cca4acaf33b3 100644 --- a/drivers/regulator/cpr3-mmss-regulator.c +++ b/drivers/regulator/cpr3-mmss-regulator.c @@ -68,8 +68,9 @@ struct cpr3_msm8996_mmss_fuses { /* * Fuse combos 0 - 7 map to CPR fusing revision 0 - 7 with speed bin fuse = 0. * Fuse combos 8 - 15 map to CPR fusing revision 0 - 7 with speed bin fuse = 1. + * Fuse combos 16 - 23 map to CPR fusing revision 0 - 7 with speed bin fuse = 2. */ -#define CPR3_MSM8996PRO_MMSS_FUSE_COMBO_COUNT 16 +#define CPR3_MSM8996PRO_MMSS_FUSE_COMBO_COUNT 24 /* Fuse combos 0 - 7 map to CPR fusing revision 0 - 7 */ #define CPR3_MSMCOBALT_MMSS_FUSE_COMBO_COUNT 8 diff --git a/drivers/regulator/cpr3-regulator.c b/drivers/regulator/cpr3-regulator.c index 95069c02d4fbb..ba354472ac89b 100644 --- a/drivers/regulator/cpr3-regulator.c +++ b/drivers/regulator/cpr3-regulator.c @@ -3341,7 +3341,8 @@ static int cpr3_regulator_measure_aging(struct cpr3_controller *ctrl, if (rc) { cpr3_err(ctrl, "failed to clear CPR4 configuration,rc=%d\n", rc); - goto cleanup; + kfree(quot_delta_results); + return rc; } } @@ -5891,14 +5892,11 @@ static int cpr3_panic_callback(struct notifier_block *nfb, struct cpr3_controller, panic_notifier); struct cpr3_panic_regs_info *regs_info = ctrl->panic_regs_info; struct cpr3_reg_info *reg; - void __iomem *virt_addr; int i = 0; for (i = 0; i < regs_info->reg_count; i++) { reg = &(regs_info->regs[i]); - virt_addr = ioremap(reg->addr, 0x4); - reg->value = readl_relaxed(virt_addr); - iounmap(virt_addr); + reg->value = readl_relaxed(reg->virt_addr); pr_err("%s[0x%08x] = 0x%08x\n", reg->name, reg->addr, reg->value); } diff --git a/drivers/regulator/cpr3-regulator.h b/drivers/regulator/cpr3-regulator.h index 8bcbc67eecdc0..9861ecf2f7a20 100644 --- a/drivers/regulator/cpr3-regulator.h +++ b/drivers/regulator/cpr3-regulator.h @@ -498,6 +498,7 @@ struct cpr3_aging_sensor_info { * @name: Register name * @addr: Register physical address * @value: Register content + * @virt_addr: Register virtual address * * This data structure is used to dump some critical register contents * when the device crashes due to a kernel panic. @@ -506,6 +507,7 @@ struct cpr3_reg_info { const char *name; u32 addr; u32 value; + void __iomem *virt_addr; }; /** diff --git a/drivers/regulator/cpr3-util.c b/drivers/regulator/cpr3-util.c index 58226cd638550..69d9c7fff32b4 100644 --- a/drivers/regulator/cpr3-util.c +++ b/drivers/regulator/cpr3-util.c @@ -1087,6 +1087,12 @@ static int cpr3_panic_notifier_init(struct cpr3_controller *ctrl) rc); return rc; } + regs[i].virt_addr = devm_ioremap(ctrl->dev, regs[i].addr, 0x4); + if (!regs[i].virt_addr) { + pr_err("Unable to map panic register addr 0x%08x\n", + regs[i].addr); + return -EINVAL; + } regs[i].value = 0xFFFFFFFF; } diff --git a/drivers/regulator/mem-acc-regulator.c b/drivers/regulator/mem-acc-regulator.c index 02d543b8ec741..27a9aa2d79054 100644 --- a/drivers/regulator/mem-acc-regulator.c +++ b/drivers/regulator/mem-acc-regulator.c @@ -108,6 +108,8 @@ struct mem_acc_regulator { u32 *phys_reg_addr_list; void __iomem **remap_reg_addr_list; struct corner_acc_reg_config *corner_acc_reg_config; + u32 *override_acc_range_fuse_list; + int override_acc_range_fuse_num; }; static DEFINE_MUTEX(mem_acc_memory_mutex); @@ -551,9 +553,8 @@ static int mem_acc_custom_data_init(struct platform_device *pdev, return 0; } -static int override_mem_acc_custom_data(struct platform_device *pdev, - struct mem_acc_regulator *mem_acc_vreg, - int mem_type) +static int override_mem_acc_custom_data(struct mem_acc_regulator *mem_acc_vreg, + int mem_type) { char *custom_apc_data_str; int len, rc = 0, i; @@ -649,27 +650,48 @@ static int mem_acc_override_corner_map(struct mem_acc_regulator *mem_acc_vreg) } -static int mem_acc_find_override_map_match(struct platform_device *pdev, - struct mem_acc_regulator *mem_acc_vreg) +static void mem_acc_read_efuse_param(struct mem_acc_regulator *mem_acc_vreg, + u32 *fuse_sel, int *val) { - struct device_node *of_node = pdev->dev.of_node; + u64 fuse_bits; + + fuse_bits = mem_acc_read_efuse_row(mem_acc_vreg, fuse_sel[0], + fuse_sel[3]); + /* + * fuse_sel[1] = LSB position in row (shift) + * fuse_sel[2] = num of bits (mask) + */ + *val = (fuse_bits >> fuse_sel[1]) & ((1 << fuse_sel[2]) - 1); +} + +#define FUSE_TUPLE_SIZE 4 +static int mem_acc_parse_override_fuse_version_map( + struct mem_acc_regulator *mem_acc_vreg) +{ + struct device_node *of_node = mem_acc_vreg->dev->of_node; int i, rc, tuple_size; int len = 0; u32 *tmp; - char *prop_str = "qcom,override-fuse-version-map"; - - /* Specify default no match case. */ - mem_acc_vreg->override_map_match = FUSE_MAP_NO_MATCH; - mem_acc_vreg->override_map_count = 0; + u32 fuse_sel[4]; + char *prop_str; - if (!of_find_property(of_node, prop_str, &len)) { - /* No mapping present. */ - return 0; + prop_str = "qcom,override-acc-fuse-sel"; + rc = of_property_read_u32_array(of_node, prop_str, fuse_sel, + FUSE_TUPLE_SIZE); + if (rc < 0) { + pr_err("Read failed - %s rc=%d\n", prop_str, rc); + return rc; } + mem_acc_read_efuse_param(mem_acc_vreg, fuse_sel, + &mem_acc_vreg->override_fuse_value); + + prop_str = "qcom,override-fuse-version-map"; + if (!of_find_property(of_node, prop_str, &len)) + return -EINVAL; + tuple_size = 1; mem_acc_vreg->override_map_count = len / (sizeof(u32) * tuple_size); - if (len == 0 || len % (sizeof(u32) * tuple_size)) { pr_err("%s length=%d is invalid\n", prop_str, len); return -EINVAL; @@ -697,8 +719,9 @@ static int mem_acc_find_override_map_match(struct platform_device *pdev, } if (mem_acc_vreg->override_map_match != FUSE_MAP_NO_MATCH) - pr_debug("%s tuple match found: %d\n", prop_str, - mem_acc_vreg->override_map_match); + pr_info("override_fuse_val=%d, %s tuple match found: %d\n", + mem_acc_vreg->override_fuse_value, prop_str, + mem_acc_vreg->override_map_match); else pr_err("%s tuple match not found\n", prop_str); @@ -707,6 +730,121 @@ static int mem_acc_find_override_map_match(struct platform_device *pdev, return rc; } +static int mem_acc_parse_override_fuse_version_range( + struct mem_acc_regulator *mem_acc_vreg) +{ + struct device_node *of_node = mem_acc_vreg->dev->of_node; + int i, j, rc, size, row_size; + int num_fuse_sel, len = 0; + u32 *tmp = NULL; + char *prop_str; + u32 *fuse_val, *fuse_sel; + char *buf = NULL; + int pos = 0, buflen; + + prop_str = "qcom,override-acc-range-fuse-list"; + if (!of_find_property(of_node, prop_str, &len)) { + pr_err("%s property is missing\n", prop_str); + return -EINVAL; + } + + size = len / sizeof(u32); + if (len == 0 || (size % FUSE_TUPLE_SIZE)) { + pr_err("%s property length (%d) is invalid\n", prop_str, len); + return -EINVAL; + } + + num_fuse_sel = size / FUSE_TUPLE_SIZE; + fuse_val = devm_kcalloc(mem_acc_vreg->dev, num_fuse_sel, + sizeof(*fuse_val), GFP_KERNEL); + if (!fuse_val) + return -ENOMEM; + mem_acc_vreg->override_acc_range_fuse_list = fuse_val; + mem_acc_vreg->override_acc_range_fuse_num = num_fuse_sel; + + fuse_sel = kzalloc(len, GFP_KERNEL); + if (!fuse_sel) { + rc = -ENOMEM; + goto done; + } + + rc = of_property_read_u32_array(of_node, prop_str, fuse_sel, + size); + if (rc) { + pr_err("%s read failed, rc=%d\n", prop_str, rc); + goto done; + } + + for (i = 0; i < num_fuse_sel; i++) { + mem_acc_read_efuse_param(mem_acc_vreg, &fuse_sel[i * 4], + &fuse_val[i]); + } + + prop_str = "qcom,override-fuse-range-map"; + if (!of_find_property(of_node, prop_str, &len)) + goto done; + + row_size = num_fuse_sel * 2; + mem_acc_vreg->override_map_count = len / (sizeof(u32) * row_size); + + if (len == 0 || len % (sizeof(u32) * row_size)) { + pr_err("%s length=%d is invalid\n", prop_str, len); + rc = -EINVAL; + goto done; + } + + tmp = kzalloc(len, GFP_KERNEL); + if (!tmp) { + rc = -ENOMEM; + goto done; + } + + rc = of_property_read_u32_array(of_node, prop_str, tmp, + mem_acc_vreg->override_map_count * row_size); + if (rc) { + pr_err("could not read %s rc=%d\n", prop_str, rc); + goto done; + } + + for (i = 0; i < mem_acc_vreg->override_map_count; i++) { + for (j = 0; j < num_fuse_sel; j++) { + if (tmp[i * row_size + j * 2] > fuse_val[j] + || tmp[i * row_size + j * 2 + 1] < fuse_val[j]) + break; + } + + if (j == num_fuse_sel) { + mem_acc_vreg->override_map_match = i; + break; + } + } + + /* + * Log register and value mapping since they are useful for + * baseline MEM ACC logging. + */ + buflen = num_fuse_sel * sizeof("fuse_selxxxx = XXXX "); + buf = kzalloc(buflen, GFP_KERNEL); + if (!buf) + goto done; + + for (j = 0; j < num_fuse_sel; j++) + pos += scnprintf(buf + pos, buflen - pos, "fuse_sel%d = %d ", + j, fuse_val[j]); + buf[pos] = '\0'; + if (mem_acc_vreg->override_map_match != FUSE_MAP_NO_MATCH) + pr_info("%s %s tuple match found: %d\n", buf, prop_str, + mem_acc_vreg->override_map_match); + else + pr_err("%s %s tuple match not found\n", buf, prop_str); + +done: + kfree(fuse_sel); + kfree(tmp); + kfree(buf); + return rc; +} + #define MAX_CHARS_PER_INT 20 static int mem_acc_reg_addr_val_dump(struct mem_acc_regulator *mem_acc_vreg, @@ -791,6 +929,150 @@ static int mem_acc_get_reg_addr_val(struct device_node *of_node, return rc; } +static int mem_acc_override_reg_addr_val_init( + struct mem_acc_regulator *mem_acc_vreg) +{ + struct device_node *of_node = mem_acc_vreg->dev->of_node; + struct corner_acc_reg_config *corner_acc_reg_config; + struct acc_reg_value *override_reg_config_list; + int i, tuple_count, tuple_match, len = 0, rc = 0; + u32 list_size, override_max_reg_config_len; + char prop_str[40]; + struct property *prop; + int num_corners = mem_acc_vreg->num_corners; + + if (!mem_acc_vreg->corner_acc_reg_config) + return 0; + + if (mem_acc_vreg->override_map_count) { + if (mem_acc_vreg->override_map_match == FUSE_MAP_NO_MATCH) + return 0; + tuple_count = mem_acc_vreg->override_map_count; + tuple_match = mem_acc_vreg->override_map_match; + } else { + tuple_count = 1; + tuple_match = 0; + } + + corner_acc_reg_config = mem_acc_vreg->corner_acc_reg_config; + for (i = 1; i <= num_corners; i++) { + snprintf(prop_str, sizeof(prop_str), + "qcom,override-corner%d-addr-val-map", i); + prop = of_find_property(of_node, prop_str, &len); + list_size = len / (tuple_count * sizeof(u32)); + if (!prop) { + pr_debug("%s property not specified\n", prop_str); + continue; + } + + if ((!list_size) || list_size < (num_corners * 2)) { + pr_err("qcom,override-corner%d-addr-val-map property is missed or invalid length: len=%d\n", + i, len); + return -EINVAL; + } + + override_max_reg_config_len = list_size / (num_corners * 2); + override_reg_config_list = + corner_acc_reg_config[i].reg_config_list; + + if (corner_acc_reg_config[i].max_reg_config_len + != override_max_reg_config_len) { + /* Free already allocate memory */ + devm_kfree(mem_acc_vreg->dev, override_reg_config_list); + + /* Allocated memory for new requirement */ + override_reg_config_list = + devm_kcalloc(mem_acc_vreg->dev, + override_max_reg_config_len * num_corners, + sizeof(*override_reg_config_list), GFP_KERNEL); + if (!override_reg_config_list) + return -ENOMEM; + + corner_acc_reg_config[i].max_reg_config_len = + override_max_reg_config_len; + corner_acc_reg_config[i].reg_config_list = + override_reg_config_list; + } + + rc = mem_acc_get_reg_addr_val(of_node, prop_str, + override_reg_config_list, tuple_match, + list_size, mem_acc_vreg->num_acc_reg); + if (rc) { + pr_err("Failed to read %s property: rc=%d\n", + prop_str, rc); + return rc; + } + + rc = mem_acc_reg_addr_val_dump(mem_acc_vreg, + &corner_acc_reg_config[i], i); + if (rc) { + pr_err("could not dump acc address-value dump for corner=%d: rc=%d\n", + i, rc); + return rc; + } + } + + return rc; +} + +static int mem_acc_parse_override_config(struct mem_acc_regulator *mem_acc_vreg) +{ + struct device_node *of_node = mem_acc_vreg->dev->of_node; + int i, rc = 0; + + /* Specify default no match case. */ + mem_acc_vreg->override_map_match = FUSE_MAP_NO_MATCH; + mem_acc_vreg->override_map_count = 0; + + if (of_find_property(of_node, "qcom,override-fuse-range-map", + NULL)) { + rc = mem_acc_parse_override_fuse_version_range(mem_acc_vreg); + if (rc) { + pr_err("parsing qcom,override-fuse-range-map property failed, rc=%d\n", + rc); + return rc; + } + } else if (of_find_property(of_node, "qcom,override-fuse-version-map", + NULL)) { + rc = mem_acc_parse_override_fuse_version_map(mem_acc_vreg); + if (rc) { + pr_err("parsing qcom,override-fuse-version-map property failed, rc=%d\n", + rc); + return rc; + } + } else { + /* No override fuse configuration defined in device node */ + return 0; + } + + if (mem_acc_vreg->override_map_match == FUSE_MAP_NO_MATCH) + return 0; + + rc = mem_acc_override_corner_map(mem_acc_vreg); + if (rc) { + pr_err("Unable to override corner map rc=%d\n", rc); + return rc; + } + + rc = mem_acc_override_reg_addr_val_init(mem_acc_vreg); + if (rc) { + pr_err("Unable to override reg_config_list init rc=%d\n", + rc); + return rc; + } + + for (i = 0; i < MEMORY_MAX; i++) { + rc = override_mem_acc_custom_data(mem_acc_vreg, i); + if (rc) { + pr_err("Unable to override custom data for mem_type=%d rc=%d\n", + i, rc); + return rc; + } + } + + return rc; +} + static int mem_acc_init_reg_config(struct mem_acc_regulator *mem_acc_vreg) { struct device_node *of_node = mem_acc_vreg->dev->of_node; @@ -967,92 +1249,6 @@ static int mem_acc_reg_config_init(struct mem_acc_regulator *mem_acc_vreg) return rc; } -static int mem_acc_override_reg_addr_val_init( - struct mem_acc_regulator *mem_acc_vreg) -{ - struct device_node *of_node = mem_acc_vreg->dev->of_node; - struct corner_acc_reg_config *corner_acc_reg_config; - struct acc_reg_value *override_reg_config_list; - int i, tuple_count, tuple_match, len = 0, rc = 0; - u32 list_size, override_max_reg_config_len; - char prop_str[40]; - struct property *prop; - int num_corners = mem_acc_vreg->num_corners; - - if (!mem_acc_vreg->corner_acc_reg_config) - return 0; - - if (mem_acc_vreg->override_map_count) { - if (mem_acc_vreg->override_map_match == FUSE_MAP_NO_MATCH) - return 0; - tuple_count = mem_acc_vreg->override_map_count; - tuple_match = mem_acc_vreg->override_map_match; - } else { - tuple_count = 1; - tuple_match = 0; - } - - corner_acc_reg_config = mem_acc_vreg->corner_acc_reg_config; - for (i = 1; i <= num_corners; i++) { - snprintf(prop_str, sizeof(prop_str), - "qcom,override-corner%d-addr-val-map", i); - prop = of_find_property(of_node, prop_str, &len); - list_size = len / (tuple_count * sizeof(u32)); - if (!prop) { - pr_debug("%s property not specified\n", prop_str); - continue; - } - - if ((!list_size) || list_size < (num_corners * 2)) { - pr_err("qcom,override-corner%d-addr-val-map property is missed or invalid length: len=%d\n", - i, len); - return -EINVAL; - } - - override_max_reg_config_len = list_size / (num_corners * 2); - override_reg_config_list = - corner_acc_reg_config[i].reg_config_list; - - if (corner_acc_reg_config[i].max_reg_config_len - != override_max_reg_config_len) { - /* Free already allocate memory */ - devm_kfree(mem_acc_vreg->dev, override_reg_config_list); - - /* Allocated memory for new requirement */ - override_reg_config_list = - devm_kcalloc(mem_acc_vreg->dev, - override_max_reg_config_len * num_corners, - sizeof(*override_reg_config_list), GFP_KERNEL); - if (!override_reg_config_list) - return -ENOMEM; - - corner_acc_reg_config[i].max_reg_config_len = - override_max_reg_config_len; - corner_acc_reg_config[i].reg_config_list = - override_reg_config_list; - } - - rc = mem_acc_get_reg_addr_val(of_node, prop_str, - override_reg_config_list, tuple_match, - list_size, mem_acc_vreg->num_acc_reg); - if (rc) { - pr_err("Failed to read %s property: rc=%d\n", - prop_str, rc); - return rc; - } - - rc = mem_acc_reg_addr_val_dump(mem_acc_vreg, - &corner_acc_reg_config[i], i); - if (rc) { - pr_err("could not dump acc address-value dump for corner=%d: rc=%d\n", - i, rc); - return rc; - } - } - - return rc; -} - #define MEM_TYPE_STRING_LEN 20 static int mem_acc_init(struct platform_device *pdev, struct mem_acc_regulator *mem_acc_vreg) @@ -1060,8 +1256,6 @@ static int mem_acc_init(struct platform_device *pdev, struct device_node *of_node = pdev->dev.of_node; struct resource *res; int len, rc, i, j; - u32 fuse_sel[4]; - u64 fuse_bits; bool acc_type_present = false; char tmps[MEM_TYPE_STRING_LEN]; @@ -1203,59 +1397,12 @@ static int mem_acc_init(struct platform_device *pdev, } } - if (of_find_property(mem_acc_vreg->dev->of_node, - "qcom,override-acc-fuse-sel", NULL)) { - rc = of_property_read_u32_array(mem_acc_vreg->dev->of_node, - "qcom,override-acc-fuse-sel", fuse_sel, 4); - if (rc < 0) { - pr_err("Read failed - qcom,override-acc-fuse-sel rc=%d\n", - rc); - return rc; - } - - fuse_bits = mem_acc_read_efuse_row(mem_acc_vreg, fuse_sel[0], - fuse_sel[3]); - /* - * fuse_sel[1] = LSB position in row (shift) - * fuse_sel[2] = num of bits (mask) - */ - mem_acc_vreg->override_fuse_value = (fuse_bits >> fuse_sel[1]) & - ((1 << fuse_sel[2]) - 1); - - rc = mem_acc_find_override_map_match(pdev, mem_acc_vreg); - if (rc) { - pr_err("Unable to find fuse map match rc=%d\n", rc); - return rc; - } - - pr_debug("override_fuse_val=%d override_map_match=%d\n", - mem_acc_vreg->override_fuse_value, - mem_acc_vreg->override_map_match); - - rc = mem_acc_override_corner_map(mem_acc_vreg); - if (rc) { - pr_err("Unable to override corner map rc=%d\n", rc); - return rc; - } - - rc = mem_acc_override_reg_addr_val_init(mem_acc_vreg); - if (rc) { - pr_err("Unable to override reg_config_list init rc=%d\n", - rc); - return rc; - } - - for (i = 0; i < MEMORY_MAX; i++) { - rc = override_mem_acc_custom_data(pdev, - mem_acc_vreg, i); - if (rc) { - pr_err("Unable to override custom data for mem_type=%d rc=%d\n", - i, rc); - return rc; - } - } + rc = mem_acc_parse_override_config(mem_acc_vreg); + if (rc) { + pr_err("Unable to parse mem acc override configuration, rc=%d\n", + rc); + return rc; } - if (acc_type_present) { mem_acc_vreg->mem_acc_type_data = devm_kzalloc( mem_acc_vreg->dev, mem_acc_vreg->num_corners * diff --git a/drivers/regulator/msm_gfx_ldo.c b/drivers/regulator/msm_gfx_ldo.c index 5c97bc04ad87e..988e99c26575c 100644 --- a/drivers/regulator/msm_gfx_ldo.c +++ b/drivers/regulator/msm_gfx_ldo.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -319,23 +319,23 @@ static int enable_ldo_mode(struct msm_gfx_ldo *ldo_vreg) /* Move BHS under SW control */ ctl |= BHS_UNDER_SW_CTL; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* Set LDO under gdsc control */ ctl &= ~LDO_UNDER_SW_CTRL_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* enable hw_pre-on to gdsc */ ctl |= LDO_PREON_SW_OVR_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* remove LDO bypass */ ctl &= ~LDO_BYPASS_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* set power-source as LDO */ ctl |= PWR_SRC_SEL_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* clear fake-sw ack to gdsc */ ctl &= ~ACK_SW_OVR_BIT; @@ -343,7 +343,7 @@ static int enable_ldo_mode(struct msm_gfx_ldo *ldo_vreg) /* put CPR in bypass mode */ ctl |= CPR_BYPASS_IN_LDO_MODE_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* complete all writes */ mb(); @@ -398,6 +398,15 @@ static int msm_gfx_ldo_enable(struct regulator_dev *rdev) ldo_vreg->corner + MIN_CORNER_OFFSET); if (ldo_vreg->vdd_cx) { + rc = regulator_set_voltage(ldo_vreg->vdd_cx, + ldo_vreg->vdd_cx_corner_map[ldo_vreg->corner], + INT_MAX); + if (rc) { + pr_err("Unable to set CX for corner %d rc=%d\n", + ldo_vreg->corner + MIN_CORNER_OFFSET, rc); + goto fail; + } + rc = regulator_enable(ldo_vreg->vdd_cx); if (rc) { pr_err("regulator_enable: vdd_cx: failed rc=%d\n", rc); @@ -535,7 +544,7 @@ static int switch_mode_to_ldo(struct msm_gfx_ldo *ldo_vreg, int new_corner) /* remove LDO bypass */ ctl &= ~LDO_BYPASS_BIT; - writel_relaxed(ctl, ldo_vreg + PWRSWITCH_CTRL_REG); + writel_relaxed(ctl, ldo_vreg->ldo_base + PWRSWITCH_CTRL_REG); /* expose LDO to gdsc */ ctl &= ~ACK_SW_OVR_BIT; @@ -646,17 +655,6 @@ static int msm_gfx_ldo_set_voltage(struct regulator_dev *rdev, else if (corner < ldo_vreg->corner) dir = DOWN; - if (ldo_vreg->vdd_cx) { - rc = regulator_set_voltage(ldo_vreg->vdd_cx, - ldo_vreg->vdd_cx_corner_map[corner], - INT_MAX); - if (rc) { - pr_err("Unable to set CX for corner %d rc=%d\n", - corner + MIN_CORNER_OFFSET, rc); - goto done; - } - } - if (ldo_vreg->mem_acc_vreg && dir == DOWN) { mem_acc_corner = ldo_vreg->mem_acc_corner_map[corner]; rc = regulator_set_voltage(ldo_vreg->mem_acc_vreg, @@ -668,6 +666,17 @@ static int msm_gfx_ldo_set_voltage(struct regulator_dev *rdev, goto done; } + if (ldo_vreg->vdd_cx) { + rc = regulator_set_voltage(ldo_vreg->vdd_cx, + ldo_vreg->vdd_cx_corner_map[corner], + INT_MAX); + if (rc) { + pr_err("Unable to set CX for corner %d rc=%d\n", + corner + MIN_CORNER_OFFSET, rc); + goto done; + } + } + new_mode = get_operating_mode(ldo_vreg, corner); if (new_mode == BHS) { @@ -755,6 +764,9 @@ static int msm_gfx_ldo_adjust_init_voltage(struct msm_gfx_ldo *ldo_vreg) volt_adjust = devm_kcalloc(ldo_vreg->dev, size, sizeof(*volt_adjust), GFP_KERNEL); + if (!volt_adjust) + return -ENOMEM; + rc = of_property_read_u32_array(of_node, prop_name, volt_adjust, size); if (rc) { pr_err("failed to read %s property rc=%d\n", prop_name, rc); diff --git a/drivers/regulator/tps65132-regulator.c b/drivers/regulator/tps65132-regulator.c new file mode 100644 index 0000000000000..f3293414c6ef0 --- /dev/null +++ b/drivers/regulator/tps65132-regulator.c @@ -0,0 +1,628 @@ +/* Copyright (c) 2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 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. + */ + +#define pr_fmt(fmt) "%s: " fmt, __func__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct tps65132_regulator { + struct regulator_init_data *init_data; + struct regulator_dev *rdev; + struct device_node *node; + struct regulator_desc rdesc; + struct tps65132_chip *chip; + const char *name; + u8 vol_reg; + u8 dischg_bit_pos; + bool dischg_en; + u8 ctrl_reg; + u8 wrt_en_bit_pos; + u8 read_eeprom_bit_pos; + int en_gpio; + enum of_gpio_flags gpio_flags; + bool is_enabled; + int curr_uV; + u8 vol_set_val; + bool vol_set_postpone; +}; + +struct tps65132_chip { + struct tps65132_regulator *vreg; + struct regulator *i2c_pwr; + struct regmap *regmap; + struct device *dev; + u8 num_regulators; + u8 apps_cfg; + u8 apps_dischg_reg; + u8 apps_cfg_bit_pos; + u8 apps_dischg_val; + bool apps_dischg_cfg_postpone; + bool en_gpio_lpm; +}; + +#define TPS65132_REG_VPOS 0x00 +#define TPS65132_REG_VNEG 0x01 +#define TPS65132_VOLTAGE_MASK 0x1f +#define TPS65132_REG_APPS_DISCHARGE 0x03 +#define TPS65132_DISCHARGE_NEG_BIT 0 +#define TPS65132_DISCHARGE_POS_BIT 1 +#define TPS65132_APPSCFG_BIT 6 +#define TPS65132_REG_CTRL 0xff +#define TPS65132_WRITE_EN_BIT 7 + +#define TPS65132_VOLTAGE_MIN 4000000 +#define TPS65132_VOLTAGE_MAX 6000000 +#define TPS65132_VOLTAGE_STEP 100000 +#define TPS65132_VOLTAGE_LEVELS \ + ((TPS65132_VOLTAGE_MAX - TPS65132_VOLTAGE_MIN) \ + / TPS65132_VOLTAGE_STEP + 1) +#define TPS65132_CTRL_READ_DAC 0 +#define TPS65132_CTRL_READ_EEPROM 1 + +#define TPS65132_NEG_TABLET_CURR_LIMIT_UA 80000 +#define TPS65132_NEG_SMARTPHONE_CURR_LIMIT_UA 40000 +#define TPS65132_POS_CURR_LIMIT_UA 200000 + +#define I2C_VOLTAGE_LEVEL 1800000 + +enum { + TPS65132_POSITIVE_BOOST = 0, + TPS65132_NEGATIVE_BOOST, +}; + +static struct of_regulator_match tps65132_reg_matches[] = { + { .name = "pos-boost", .driver_data = (void *)TPS65132_POSITIVE_BOOST }, + { .name = "neg-boost", .driver_data = (void *)TPS65132_NEGATIVE_BOOST }, +}; + +static int tps65132_regulator_disable(struct regulator_dev *rdev) +{ + struct tps65132_regulator *vreg = rdev_get_drvdata(rdev); + struct tps65132_chip *chip = vreg->chip; + printk("tps65132_regulator_disable\n"); + printk("vreg->en_gpio is %d\n", vreg->en_gpio); + if (chip->en_gpio_lpm) { + gpio_direction_output(vreg->en_gpio, 0); + } else{ + gpio_set_value_cansleep(vreg->en_gpio, + vreg->gpio_flags & OF_GPIO_ACTIVE_LOW ? 1 : 0); +} + vreg->is_enabled = false; + + return 0; +} + +static int tps65132_regulator_enable(struct regulator_dev *rdev) +{ + struct tps65132_regulator *vreg = rdev_get_drvdata(rdev); + struct tps65132_chip *chip = vreg->chip; + int rc; + printk("tps65132_regulator_enable\n"); + printk("vreg->en_gpio is %d\n", vreg->en_gpio); + if (chip->en_gpio_lpm) { + gpio_direction_output(vreg->en_gpio, 1); +} + else { + gpio_set_value_cansleep(vreg->en_gpio, + vreg->gpio_flags & OF_GPIO_ACTIVE_LOW ? 0 : 1); +} + vreg->is_enabled = true; + + if (chip->apps_dischg_cfg_postpone) { + rc = regmap_write(chip->regmap, chip->apps_dischg_reg, + chip->apps_dischg_val); + if (rc) { + pr_err("apps_dischg set failed, rc = %d\n", rc); + return rc; + } + chip->apps_dischg_cfg_postpone = false; + } + + if (vreg->vol_set_postpone) { + rc = regmap_write(rdev->regmap, vreg->vol_reg, + vreg->vol_set_val); + + if (rc) { + pr_err("set voltage failed, rc = %d\n", rc); + return rc; + } + vreg->vol_set_postpone = false; + } + + return 0; +} + +static int tps65132_regulator_get_voltage(struct regulator_dev *rdev) +{ + struct tps65132_regulator *vreg = rdev_get_drvdata(rdev); + int rc, val; + return 0; + + if (!rdev->regmap) { + pr_err("regmap not found\n"); + return -EINVAL; + } + if (!vreg->is_enabled) + return vreg->curr_uV; + + rc = regmap_write(rdev->regmap, vreg->ctrl_reg, TPS65132_CTRL_READ_DAC); + if (rc) { + pr_err("failed to write reg %d, rc = %d\n", vreg->ctrl_reg, rc); + return rc; + } + + rc = regmap_read(rdev->regmap, vreg->vol_reg, &val); + if (rc) { + pr_err("read reg %d failed, rc = %d\n", vreg->vol_reg, rc); + return rc; + } else { + vreg->curr_uV = (val & TPS65132_VOLTAGE_MASK) * + TPS65132_VOLTAGE_STEP + TPS65132_VOLTAGE_MIN; + } + + return vreg->curr_uV; +} + +static int tps65132_regulator_set_voltage(struct regulator_dev *rdev, + int min_uV, int max_uV, unsigned *selector) +{ + struct tps65132_regulator *vreg = rdev_get_drvdata(rdev); + int val, new_uV, rc; + + if (!rdev->regmap) { + pr_err("regmap not found\n"); + return -EINVAL; + } + + val = DIV_ROUND_UP(min_uV - TPS65132_VOLTAGE_MIN, + TPS65132_VOLTAGE_STEP); + val = val & TPS65132_VOLTAGE_MASK; + new_uV = TPS65132_VOLTAGE_MIN + (val * TPS65132_VOLTAGE_STEP); + if (new_uV > max_uV) { + pr_err("failed to set voltage (%d %d)\n", min_uV, max_uV); + return -EINVAL; + } + if (!vreg->is_enabled) { + vreg->vol_set_val = val; + vreg->vol_set_postpone = true; + } else { + rc = regmap_write(rdev->regmap, vreg->vol_reg, val); + if (rc) { + pr_err("failed to write reg %d, rc = %d\n", + vreg->vol_reg, rc); + return rc; + } + } + vreg->curr_uV = new_uV; + + *selector = val; + + return 0; +} + +static int tps65132_regulator_list_voltage(struct regulator_dev *rdev, + unsigned selector) +{ + if (selector >= TPS65132_VOLTAGE_LEVELS) + return 0; + + return selector * TPS65132_VOLTAGE_STEP + TPS65132_VOLTAGE_MIN; +} + +static int tps65132_regulator_is_enabled(struct regulator_dev *rdev) +{ + struct tps65132_regulator *vreg = rdev_get_drvdata(rdev); + + return vreg->is_enabled ? 1 : 0; +} + +static struct regulator_ops tps65132_ops = { + .set_voltage = tps65132_regulator_set_voltage, + .get_voltage = tps65132_regulator_get_voltage, + .list_voltage = tps65132_regulator_list_voltage, + .enable = tps65132_regulator_enable, + .disable = tps65132_regulator_disable, + .is_enabled = tps65132_regulator_is_enabled, +}; + +static int tps65132_regulator_gpio_init(struct tps65132_chip *chip) +{ + struct tps65132_regulator *vreg; + u32 gpio; + enum of_gpio_flags flags; + int state; + int i, rc = 0; + + for (i = 0; i < chip->num_regulators; i++) { + vreg = &chip->vreg[i]; + gpio = vreg->en_gpio; + flags = vreg->gpio_flags; + if (gpio_is_valid(gpio)) { + rc = devm_gpio_request(chip->dev, gpio, vreg->name); + if (rc < 0) { + pr_err("gpio %d request failed, rc = %d\n", + gpio, rc); + return rc; + } + state = gpio_get_value_cansleep(gpio); + if (state < 0) { + pr_err("gpio %d: get value failed, rc = %d\n", + gpio, state); + return state; + } + rc = gpio_direction_output(gpio, state); + if (rc < 0) { + pr_err("gpio %d set output failed, rc = %d\n", + gpio, rc); + return rc; + } + if (((flags & OF_GPIO_ACTIVE_LOW) && (state == 0)) || + (!(flags & OF_GPIO_ACTIVE_LOW) && (state == 1))) + vreg->is_enabled = true; + } else { + pr_err("gpio %d is invalid for %s EN-pin\n", + gpio, vreg->name); + return -EINVAL; + } + } + + return rc; +} + +static int tps65132_regulator_apps_dischg_config(struct tps65132_chip *chip) +{ + struct tps65132_regulator *vreg; + u8 value = 0; + bool online = false; + int i, rc = 0; + + if (chip->apps_cfg > 0) + value = BIT(chip->apps_cfg_bit_pos); + + for (i = 0; i < chip->num_regulators; i++) { + vreg = &chip->vreg[i]; + if (vreg->dischg_en) + value |= BIT(vreg->dischg_bit_pos); + if (vreg->is_enabled) + online = true; + } + if (online) { + rc = regmap_write(chip->regmap, chip->apps_dischg_reg, value); + if (rc) + pr_err("write reg %d failed, rc = %d\n", + chip->apps_dischg_reg, rc); + } else { + chip->apps_dischg_cfg_postpone = true; + chip->apps_dischg_val = value; + } + + return 0; +} + +static int tps65132_regulator_hw_init(struct tps65132_chip *chip) +{ + int rc; + struct regulator *i2c_pwr = chip->i2c_pwr; + + rc = tps65132_regulator_gpio_init(chip); + if (rc) { + pr_err("gpios initialize failed, rc = %d\n", rc); + return rc; + } + + if (i2c_pwr) { + if (regulator_count_voltages(i2c_pwr) > 0) { + rc = regulator_set_voltage(i2c_pwr, + I2C_VOLTAGE_LEVEL, I2C_VOLTAGE_LEVEL); + if (rc < 0) { + pr_err("set i2c-pwr voltage failed, rc = %d\n", + rc); + return rc; + } + } + rc = regulator_enable(i2c_pwr); + if (rc) { + pr_err("enable i2c-pwr voltage failed, rc = %d\n", rc); + return rc; + } + } + + rc = tps65132_regulator_apps_dischg_config(chip); + if (rc) + pr_err("appscfg set failed, rc = %d\n", rc); + + return rc; +} + +static int tps65132_parse_dt(struct tps65132_chip *chip, + struct i2c_client *client) +{ + struct device_node *node; + struct of_regulator_match *match; + int type, i, rc; + u32 current_limit; + + if (!client->dev.of_node) { + pr_err("device node missing\n"); + return -EINVAL; + } + + node = of_find_node_by_name(client->dev.of_node, "regulators"); + if (!node) { + pr_err("get regulators node failed\n"); + return -EINVAL; + } + + rc = of_regulator_match(&client->dev, node, tps65132_reg_matches, + ARRAY_SIZE(tps65132_reg_matches)); + if (rc < 0) { + pr_err("regulator match failed, rc = %d\n", rc); + return rc; + } + + chip->num_regulators = rc; + + chip->vreg = devm_kzalloc(&client->dev, chip->num_regulators * + sizeof(struct tps65132_regulator), + GFP_KERNEL); + if (!chip->vreg) { + pr_err("memory allocation failed for vreg\n"); + return -ENOMEM; + } + if (of_find_property(client->dev.of_node, "i2c-pwr-supply", NULL)) { + chip->i2c_pwr = devm_regulator_get(&client->dev, "i2c-pwr"); + if (IS_ERR_OR_NULL(chip->i2c_pwr)) { + rc = PTR_RET(chip->i2c_pwr); + if (rc != EPROBE_DEFER) + pr_err("get i2c_pwr failed, rc = %d\n", rc); + return rc; + } + } + chip->en_gpio_lpm = of_property_read_bool(client->dev.of_node, + "ti,en-gpio-lpm"); + + for (i = 0; i < chip->num_regulators; i++) { + match = &tps65132_reg_matches[i]; + if (!match->init_data) + continue; + match->init_data->constraints.input_uV = + match->init_data->constraints.max_uV; + match->init_data->constraints.valid_ops_mask = + REGULATOR_CHANGE_VOLTAGE | + REGULATOR_CHANGE_STATUS; + + chip->vreg[i].init_data = match->init_data; + chip->vreg[i].node = match->of_node; + chip->vreg[i].chip = chip; + chip->vreg[i].name = match->init_data->constraints.name; + chip->vreg[i].ctrl_reg = TPS65132_REG_CTRL; + chip->vreg[i].wrt_en_bit_pos = TPS65132_WRITE_EN_BIT; + chip->vreg[i].read_eeprom_bit_pos = + TPS65132_WRITE_EN_BIT; + chip->vreg[i].dischg_en = of_property_read_bool( + match->of_node, "ti,discharge-enable"); + rc = of_property_read_u32(match->of_node, "ti,enable-time", + &chip->vreg[i].rdesc.enable_time); + if (rc < 0) { + pr_debug("ti,enable-time read failed, rc = %d\n", rc); + chip->vreg[i].rdesc.enable_time = 800; + } + rc = of_property_read_u32(match->of_node, "ti,current-limit", + ¤t_limit); + type = (uintptr_t)match->driver_data; + if (type == TPS65132_POSITIVE_BOOST) { + chip->vreg[i].vol_reg = TPS65132_REG_VPOS; + chip->vreg[i].dischg_bit_pos = + TPS65132_DISCHARGE_POS_BIT; + if (!rc && (current_limit != + TPS65132_POS_CURR_LIMIT_UA)) { + pr_err("current limit %duA is invalid for postive boost\n", + current_limit); + return -EINVAL; + } + } else if (type == TPS65132_NEGATIVE_BOOST) { + chip->vreg[i].vol_reg = TPS65132_REG_VNEG; + chip->vreg[i].dischg_bit_pos = + TPS65132_DISCHARGE_NEG_BIT; + if (!rc && (current_limit != + TPS65132_NEG_TABLET_CURR_LIMIT_UA) && + (current_limit != + TPS65132_NEG_SMARTPHONE_CURR_LIMIT_UA)) { + pr_err("current limit %duA is invalid for negative boost\n", + current_limit); + return -EINVAL; + } else if (!rc && (current_limit == + TPS65132_NEG_TABLET_CURR_LIMIT_UA)) { + chip->apps_cfg = 1; + } + } else { + pr_err("unknown regulator type: %d\n", type); + return -EINVAL; + } + rc = 0; + chip->vreg[i].en_gpio = of_get_named_gpio_flags( + match->of_node, "ti,en-gpio", 0, + &chip->vreg[i].gpio_flags); + if (chip->vreg[i].en_gpio < 0) { + pr_err("get ti,en-gpio failed, rc = %d\n", + chip->vreg[i].en_gpio); + return chip->vreg[i].en_gpio; + } + } + chip->apps_dischg_reg = TPS65132_REG_APPS_DISCHARGE; + chip->apps_cfg_bit_pos = TPS65132_APPSCFG_BIT; + + return rc; +} + +static struct regmap_config tps65132_regmap_config = { + .reg_bits = 8, + .val_bits = 8, +}; + +static int tps65132_regulator_probe(struct i2c_client *client, + const struct i2c_device_id *id) +{ + struct tps65132_chip *chip; + struct regulator_config config = {}; + struct regulator_desc *rdesc; + int i, j, rc; + chip = devm_kzalloc(&client->dev, sizeof(struct tps65132_chip), + GFP_KERNEL); + if (!chip) { + pr_err("memory allocation failed for tps65132_chip\n"); + return -ENOMEM; + } + rc = tps65132_parse_dt(chip, client); + if (rc) { + pr_err("parse device tree failed for tps65132, rc = %d\n", + rc); + return rc; + } + chip->regmap = devm_regmap_init_i2c(client, &tps65132_regmap_config); + if (IS_ERR(chip->regmap)) { + pr_err("init regmap failed for tps65132, rc = %ld\n", + PTR_ERR(chip->regmap)); + return PTR_ERR(chip->regmap); + } + chip->dev = &client->dev; + + rc = tps65132_regulator_hw_init(chip); + if (rc < 0) { + pr_err("hardware init failed for tps65132, rc = %d\n", rc); + return rc; + } + i2c_set_clientdata(client, chip); + + for (i = 0; i < chip->num_regulators; i++) { + config.dev = &client->dev; + config.init_data = chip->vreg[i].init_data; + config.regmap = chip->regmap; + config.driver_data = &chip->vreg[i]; + config.of_node = chip->vreg[i].node; + + rdesc = &chip->vreg[i].rdesc; + rdesc->name = chip->vreg[i].name; + rdesc->type = REGULATOR_VOLTAGE; + rdesc->owner = THIS_MODULE; + rdesc->n_voltages = TPS65132_VOLTAGE_LEVELS; + if (of_get_property(client->dev.of_node, "vin-supply", NULL)) + rdesc->supply_name = "vin"; + rdesc->ops = &tps65132_ops; + chip->vreg[i].rdev = regulator_register(rdesc, &config); + if (IS_ERR(chip->vreg[i].rdev)) { + pr_err("regulator register failed, rc = %ld\n", + PTR_ERR(chip->vreg[i].rdev)); + for (j = i - 1; j >= 0; j--) + regulator_unregister(chip->vreg[j].rdev); + + return PTR_ERR(chip->vreg[i].rdev); + } + } + + return 0; +} + +static int tps65132_regulator_remove(struct i2c_client *client) +{ + struct tps65132_chip *chip = i2c_get_clientdata(client); + struct regulator *i2c_pwr = chip->i2c_pwr; + int i; + + if (i2c_pwr) + regulator_disable(i2c_pwr); + + for (i = 0; i < chip->num_regulators; i++) + regulator_unregister(chip->vreg[i].rdev); + + return 0; +} + +static struct of_device_id tps65132_match_table[] = { + { .compatible = "ti,tps65132", }, + {}, +}; +MODULE_DEVICE_TABLE(of, tps65132_match_table); + +static const struct i2c_device_id tps65132_id[] = { + {"tps65132", -1}, + { }, +}; + +static int tps65132_suspend(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct tps65132_chip *chip = i2c_get_clientdata(client); + int rc = 0; + + if (chip->i2c_pwr) + rc = regulator_disable(chip->i2c_pwr); + + return rc; +} + +static int tps65132_resume(struct device *dev) +{ + struct i2c_client *client = to_i2c_client(dev); + struct tps65132_chip *chip = i2c_get_clientdata(client); + int rc = 0; + + if (chip->i2c_pwr) + rc = regulator_enable(chip->i2c_pwr); + + return rc; +} + +const struct dev_pm_ops tps65132_pm_ops = { + .resume = tps65132_resume, + .suspend = tps65132_suspend, +}; + +static struct i2c_driver tps65132_regulator_driver = { + .driver = { + .name = "tps65132", + .owner = THIS_MODULE, + .of_match_table = tps65132_match_table, + }, + .probe = tps65132_regulator_probe, + .remove = tps65132_regulator_remove, + .id_table = tps65132_id, +}; + +static int __init tps65132_init(void) +{ + return i2c_add_driver(&tps65132_regulator_driver); +} +subsys_initcall(tps65132_init); + +static void __exit tps65132_exit(void) +{ + i2c_del_driver(&tps65132_regulator_driver); +} +module_exit(tps65132_exit); + +MODULE_DESCRIPTION("TI TPS65132 regulator driver"); +MODULE_LICENSE("GPL v2"); diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 7c4903b618c9f..1dd8de53b0ecb 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -406,6 +406,9 @@ sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) struct sg_header *old_hdr = NULL; int retval = 0; + if (unlikely(segment_eq(get_fs(), KERNEL_DS))) + return -EINVAL; + if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) return -ENXIO; SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp, @@ -510,7 +513,7 @@ sg_read(struct file *filp, char __user *buf, size_t count, loff_t * ppos) old_hdr->result = EIO; break; case DID_ERROR: - old_hdr->result = (srp->sense_b[0] == 0 && + old_hdr->result = (srp->sense_b[0] == 0 && hp->masked_status == GOOD) ? 0 : EIO; break; default: @@ -788,8 +791,14 @@ sg_common_write(Sg_fd * sfp, Sg_request * srp, return k; /* probably out of space --> ENOMEM */ } if (atomic_read(&sdp->detaching)) { - if (srp->bio) + if (srp->bio) { + if (srp->rq->cmd != srp->rq->__cmd) + kfree(srp->rq->cmd); + blk_end_request_all(srp->rq, -EIO); + srp->rq = NULL; + } + sg_finish_rem_req(srp); return -ENODEV; } @@ -869,8 +878,10 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) return -ENXIO; if (!access_ok(VERIFY_WRITE, p, SZ_SG_IO_HDR)) return -EFAULT; + mutex_lock(&sfp->parentdp->open_rel_lock); result = sg_new_write(sfp, filp, p, SZ_SG_IO_HDR, 1, read_only, 1, &srp); + mutex_unlock(&sfp->parentdp->open_rel_lock); if (result < 0) return result; result = wait_event_interruptible(sfp->read_wait, @@ -910,8 +921,10 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) sfp->low_dma = 1; if ((0 == sfp->low_dma) && (0 == sg_res_in_use(sfp))) { val = (int) sfp->reserve.bufflen; + mutex_lock(&sfp->parentdp->open_rel_lock); sg_remove_scat(sfp, &sfp->reserve); sg_build_reserve(sfp, val); + mutex_unlock(&sfp->parentdp->open_rel_lock); } } else { if (atomic_read(&sdp->detaching)) @@ -979,15 +992,17 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) result = get_user(val, ip); if (result) return result; - if (val < 0) - return -EINVAL; + if (val < 0) + return -EINVAL; val = min_t(int, val, max_sectors_bytes(sdp->device->request_queue)); if (val != sfp->reserve.bufflen) { if (sg_res_in_use(sfp) || sfp->mmap_called) return -EBUSY; + mutex_lock(&sfp->parentdp->open_rel_lock); sg_remove_scat(sfp, &sfp->reserve); sg_build_reserve(sfp, val); + mutex_unlock(&sfp->parentdp->open_rel_lock); } return 0; case SG_GET_RESERVED_SIZE: @@ -1014,6 +1029,8 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) result = get_user(val, ip); if (result) return result; + if (val > SG_MAX_CDB_SIZE) + return -ENOMEM; sfp->next_cmd_len = (val > 0) ? val : 0; return 0; case SG_GET_VERSION_NUM: @@ -1040,8 +1057,8 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) if (srp) { rinfo[val].req_state = srp->done + 1; rinfo[val].problem = - srp->header.masked_status & - srp->header.host_status & + srp->header.masked_status & + srp->header.host_status & srp->header.driver_status; if (srp->done) rinfo[val].duration = @@ -1062,7 +1079,7 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg) } } read_unlock_irqrestore(&sfp->rq_list_lock, iflags); - result = __copy_to_user(p, rinfo, + result = __copy_to_user(p, rinfo, SZ_SG_REQ_INFO * SG_MAX_QUEUE); result = result ? -EFAULT : 0; kfree(rinfo); @@ -1164,14 +1181,14 @@ static long sg_compat_ioctl(struct file *filp, unsigned int cmd_in, unsigned lon return -ENXIO; sdev = sdp->device; - if (sdev->host->hostt->compat_ioctl) { + if (sdev->host->hostt->compat_ioctl) { int ret; ret = sdev->host->hostt->compat_ioctl(sdev, cmd_in, (void __user *)arg); return ret; } - + return -ENOIOCTLCMD; } #endif @@ -1655,7 +1672,7 @@ init_sg(void) else def_reserved_size = sg_big_buff; - rc = register_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), + rc = register_chrdev_region(MKDEV(SCSI_GENERIC_MAJOR, 0), SG_MAX_DEVS, "sg"); if (rc) return rc; @@ -2340,7 +2357,7 @@ static const struct file_operations adio_fops = { }; static int sg_proc_single_open_dressz(struct inode *inode, struct file *file); -static ssize_t sg_proc_write_dressz(struct file *filp, +static ssize_t sg_proc_write_dressz(struct file *filp, const char __user *buffer, size_t count, loff_t *off); static const struct file_operations dressz_fops = { .owner = THIS_MODULE, @@ -2480,7 +2497,7 @@ static int sg_proc_single_open_adio(struct inode *inode, struct file *file) return single_open(file, sg_proc_seq_show_int, &sg_allow_dio); } -static ssize_t +static ssize_t sg_proc_write_adio(struct file *filp, const char __user *buffer, size_t count, loff_t *off) { @@ -2501,7 +2518,7 @@ static int sg_proc_single_open_dressz(struct inode *inode, struct file *file) return single_open(file, sg_proc_seq_show_int, &sg_big_buff); } -static ssize_t +static ssize_t sg_proc_write_dressz(struct file *filp, const char __user *buffer, size_t count, loff_t *off) { @@ -2661,7 +2678,7 @@ static void sg_proc_debug_helper(struct seq_file *s, Sg_device * sdp) hp = &srp->header; new_interface = (hp->interface_id == '\0') ? 0 : 1; if (srp->res_used) { - if (new_interface && + if (new_interface && (SG_FLAG_MMAP_IO & hp->flags)) cp = " mmap>> "; else diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 4feb372515d73..bbb3e068ad25a 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c @@ -1273,7 +1273,8 @@ int ufshcd_hold(struct ufs_hba *hba, bool async) hba->clk_gating.state = REQ_CLKS_ON; trace_ufshcd_clk_gating(dev_name(hba->dev), hba->clk_gating.state); - schedule_work(&hba->clk_gating.ungate_work); + queue_work(hba->clk_gating.ungating_workq, + &hba->clk_gating.ungate_work); /* * fall through to check if we should wait for this * work to be done or not. @@ -1522,6 +1523,7 @@ static ssize_t ufshcd_clkgate_enable_store(struct device *dev, static void ufshcd_init_clk_gating(struct ufs_hba *hba) { struct ufs_clk_gating *gating = &hba->clk_gating; + char wq_name[sizeof("ufs_clk_ungating_00")]; hba->clk_gating.state = CLKS_ON; @@ -1531,6 +1533,10 @@ static void ufshcd_init_clk_gating(struct ufs_hba *hba) INIT_DELAYED_WORK(&gating->gate_work, ufshcd_gate_work); INIT_WORK(&gating->ungate_work, ufshcd_ungate_work); + snprintf(wq_name, ARRAY_SIZE(wq_name), "ufs_clk_ungating_%d", + hba->host->host_no); + hba->clk_gating.ungating_workq = create_singlethread_workqueue(wq_name); + gating->is_enabled = true; /* @@ -1607,6 +1613,7 @@ static void ufshcd_exit_clk_gating(struct ufs_hba *hba) device_remove_file(hba->dev, &hba->clk_gating.enable_attr); cancel_work_sync(&hba->clk_gating.ungate_work); cancel_delayed_work_sync(&hba->clk_gating.gate_work); + destroy_workqueue(hba->clk_gating.ungating_workq); } /** @@ -3890,17 +3897,17 @@ int ufshcd_wait_for_doorbell_clr(struct ufs_hba *hba, u64 wait_timeout_us) ufshcd_hold_all(hba); spin_lock_irqsave(hba->host->host_lock, flags); - if (hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL) { - ret = -EBUSY; - goto out; - } - /* * Wait for all the outstanding tasks/transfer requests. * Verify by checking the doorbell registers are clear. */ start = ktime_get(); do { + if (hba->ufshcd_state != UFSHCD_STATE_OPERATIONAL) { + ret = -EBUSY; + goto out; + } + tm_doorbell = ufshcd_readl(hba, REG_UTP_TASK_REQ_DOOR_BELL); tr_doorbell = ufshcd_readl(hba, REG_UTP_TRANSFER_REQ_DOOR_BELL); if (!tm_doorbell && !tr_doorbell) { diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index 3ba141c6e1a7f..7a3d13500d6fe 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h @@ -421,6 +421,7 @@ struct ufs_clk_gating { struct device_attribute enable_attr; bool is_enabled; int active_reqs; + struct workqueue_struct *ungating_workq; }; /* Hibern8 state */ diff --git a/drivers/soc/qcom/Kconfig b/drivers/soc/qcom/Kconfig index 1dbc2efa2b8ca..e3ed488f2f9fa 100644 --- a/drivers/soc/qcom/Kconfig +++ b/drivers/soc/qcom/Kconfig @@ -292,6 +292,16 @@ config MSM_CACHE_M4M_ERP64_PANIC_ON_UE Say 'Y' here to cause kernel panic when uncorrectable cache/M4M errors are detected. +config MSM_L2_IA_DEBUG + bool "Enable MSM L2 Indirect Access Debug" + depends on DEBUG_FS + default n + help + This option enables L2 indirect access debug + capability. It exposes L2 indirect access + debugfs interface to get/set data, address, + and target cpus. + config MSM_RPM_SMD bool "RPM driver using SMD protocol" help @@ -707,14 +717,6 @@ config ICNSS control messages to FW over QMI channel. It is also responsible for handling WLAN PD restart notifications. -config MSM_CORE_CTL_HELPER - tristate "Core control helper functions for dynamically hotplug CPUs" - help - Provide helper functions for core control driver. Core control - driver dynamically hotplugs CPUs from kernel based on current - system load and state. It also supports limiting min and - max online CPUs from userspace. - config MSM_BAM_DMUX bool "BAM Data Mux Driver" depends on SPS @@ -782,7 +784,7 @@ config MSM_PACMAN peripheral (BLSP) ownership. config MSM_KERNEL_PROTECT - bool "Protect kernel text by removing write permissions in stage-2" + bool "Protect kernel text by removing write permissions" depends on !FUNCTION_TRACER help On hypervisor-enabled targets, this option will make a call into @@ -795,6 +797,18 @@ config MSM_KERNEL_PROTECT aarch64_insn_patch_text_nosync, etc. including the various CPU errata workarounds in arch/arm64/kernel/cpu_errata.c). + For MPU based protection-enabled targets please refer to + MSM_KERNEL_PROTECT_MPU + +config MSM_KERNEL_PROTECT_MPU + bool "Protect kernel text from other masters by MPU" + depends on MSM_KERNEL_PROTECT + help + On MPU based protection enabled targets, this option will make a call + into TrustZone to request that the kernel text be ptotected for any + write access from external bus masters. This protects against + malicious devices rewriting kernel code. + config MSM_KERNEL_PROTECT_TEST bool "Bootup test of kernel protection (INTENTIONAL CRASH)" depends on MSM_KERNEL_PROTECT @@ -812,6 +826,21 @@ config MSM_REMOTEQDSS enable/disable these events. Interface located in /sys/class/remoteqdss. +config SERIAL_NUM + bool "Enable Serial Number Proc Interface" + help + Provide a interface for reading CPU serial number + +config SECBOOT_FUSE + bool "Enable Secure boot fuse Proc Interface" + help + rovide a interface for reading CPU secure boot fuse setting. Interface located in + proc/secboot_fuse_reg + +config CPUMAXFREQ + bool "Enable CPUMAXFREQ Proc Interface" + help + Provide a interface for getting the maximum frequency supported by cpu core config QCOM_SMCINVOKE bool "Secure QSEE Support" help diff --git a/drivers/soc/qcom/Makefile b/drivers/soc/qcom/Makefile index a0f69ac87804c..2500709d994a9 100644 --- a/drivers/soc/qcom/Makefile +++ b/drivers/soc/qcom/Makefile @@ -59,7 +59,11 @@ obj-$(CONFIG_MSM_RPM_RBCPR_STATS_V2_LOG) += rpm_rbcpr_stats_v2.o obj-$(CONFIG_MEM_SHARE_QMI_SERVICE) += memshare/ obj-$(CONFIG_CP_ACCESS64) += cpaccess64.o obj-$(CONFIG_MSM_RPM_STATS_LOG) += rpm_stats.o rpm_master_stat.o rpm_rail_stats.o system_stats.o +ifdef CONFIG_ARCH_MSM8996 obj-$(CONFIG_HW_PERF_EVENTS) += perf_event_kryo.o perf_event_l2.o +else +obj-$(CONFIG_HW_PERF_EVENTS) += perf_event_l2.o +endif obj-$(CONFIG_MSM_RPM_LOG) += rpm_log.o obj-$(CONFIG_MSM_JTAG) += jtag-fuse.o jtag.o obj-$(CONFIG_MSM_JTAG_MM) += jtag-fuse.o jtag-mm.o @@ -71,7 +75,6 @@ obj-$(CONFIG_MSM_TZ_SMMU) += msm_tz_smmu.o obj-$(CONFIG_MSM_PIL) += peripheral-loader.o obj-$(CONFIG_MSM_PIL_SSR_GENERIC) += subsys-pil-tz.o obj-$(CONFIG_MSM_PIL_MSS_QDSP6V5) += pil-q6v5.o pil-msa.o pil-q6v5-mss.o -obj-$(CONFIG_MSM_CORE_CTL_HELPER) += core_ctl_helper.o obj-$(CONFIG_MSM_SCM_ERRATA) += scm-errata.o obj-$(CONFIG_MSM_PFE_WA) += pfe-wa.o obj-$(CONFIG_MSM_PERFORMANCE) += msm_performance.o @@ -83,6 +86,9 @@ ifdef CONFIG_MSM_SUBSYSTEM_RESTART obj-y += subsystem_restart.o obj-y += ramdump.o endif +obj-$(CONFIG_SERIAL_NUM) += serial_num.o +obj-$(CONFIG_SECBOOT_FUSE) += secboot_fuse.o +obj-$(CONFIG_CPUMAXFREQ) += cpumaxfreq.o obj-$(CONFIG_MSM_SERVICE_NOTIFIER) += service-notifier.o obj-$(CONFIG_MSM_SYSMON_COMM) += sysmon.o sysmon-qmi.o diff --git a/drivers/soc/qcom/core_ctl_helper.c b/drivers/soc/qcom/core_ctl_helper.c deleted file mode 100644 index c21ba2f7173a8..0000000000000 --- a/drivers/soc/qcom/core_ctl_helper.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2014-2016, 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 -#include -#include -#include -#include -#include -#include - -void core_ctl_block_hotplug(void) -{ - get_online_cpus(); -} -EXPORT_SYMBOL(core_ctl_block_hotplug); - -void core_ctl_unblock_hotplug(void) -{ - put_online_cpus(); -} -EXPORT_SYMBOL(core_ctl_unblock_hotplug); - -s64 core_ctl_get_time(void) -{ - return ktime_to_ms(ktime_get()); -} -EXPORT_SYMBOL(core_ctl_get_time); - -struct cpufreq_policy *core_ctl_get_policy(int cpu) -{ - return cpufreq_cpu_get(cpu); -} -EXPORT_SYMBOL(core_ctl_get_policy); - -void core_ctl_put_policy(struct cpufreq_policy *policy) -{ - cpufreq_cpu_put(policy); -} -EXPORT_SYMBOL(core_ctl_put_policy); - -struct device *core_ctl_find_cpu_device(unsigned cpu) -{ - return get_cpu_device(cpu); -} -EXPORT_SYMBOL(core_ctl_find_cpu_device); - -int __ref core_ctl_online_core(unsigned int cpu) -{ - int ret; - struct device *dev; - - lock_device_hotplug(); - dev = get_cpu_device(cpu); - if (!dev) { - pr_err("%s: failed to get cpu%d device\n", __func__, cpu); - ret = -ENODEV; - } else { - ret = device_online(dev); - } - unlock_device_hotplug(); - return ret; -} -EXPORT_SYMBOL(core_ctl_online_core); - -int __ref core_ctl_offline_core(unsigned int cpu) -{ - int ret; - struct device *dev; - - lock_device_hotplug(); - dev = get_cpu_device(cpu); - if (!dev) { - pr_err("%s: failed to get cpu%d device\n", __func__, cpu); - ret = -ENODEV; - } else { - ret = device_offline(dev); - } - unlock_device_hotplug(); - return ret; -} -EXPORT_SYMBOL(core_ctl_offline_core); diff --git a/drivers/soc/qcom/cpumaxfreq.c b/drivers/soc/qcom/cpumaxfreq.c new file mode 100644 index 0000000000000..0ee532ea330a0 --- /dev/null +++ b/drivers/soc/qcom/cpumaxfreq.c @@ -0,0 +1,60 @@ +#include +#include +#include +#include + +static struct proc_dir_entry *entry; + +static unsigned int cpumaxfreq = 0; + +static int cpumaxfreq_read(struct seq_file *m, void *v) +{ + int ret; + + pr_debug("cpumaxfreq: %u kHz\n", cpumaxfreq); + + ret = cpumaxfreq/1000 + 5; + seq_printf(m, "%u.%02u\n", ret/1000, ret%1000/10); + + return 0; +} + +static int cpumaxfreq_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, cpumaxfreq_read, NULL); +} + +static const struct file_operations cpumaxfreq_fops = { + .open = cpumaxfreq_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static int __init cpumaxfreq_init(void) +{ + int cpu; + struct cpufreq_policy policy; + + entry = proc_create("cpumaxfreq", 0444 /* read only*/, + NULL /* parent dir */, &cpumaxfreq_fops); + + for_each_possible_cpu(cpu) { + if (cpufreq_get_policy(&policy, cpu)) + continue; + if (policy.cpuinfo.max_freq > cpumaxfreq) + cpumaxfreq = policy.cpuinfo.max_freq; + } + + return !entry; +} +module_init(cpumaxfreq_init); + +static void __exit cpumaxfreq_exit(void) +{ + proc_remove(entry); +} +module_exit(cpumaxfreq_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("Return the max freqency supported by any core of the processor"); diff --git a/drivers/soc/qcom/glink.c b/drivers/soc/qcom/glink.c index 277ab9786aa90..6e2d5aae970cc 100644 --- a/drivers/soc/qcom/glink.c +++ b/drivers/soc/qcom/glink.c @@ -1022,7 +1022,8 @@ static void glink_edge_ctx_release(struct rwref_lock *ch_st_lock) * it is not found. * @xprt_ctx: Transport to search for a matching edge. * - * Return: The edge ctx corresponding to edge of @xprt_ctx. + * Return: The edge ctx corresponding to edge of @xprt_ctx or + * NULL if memory allocation fails. */ static struct glink_core_edge_ctx *edge_name_to_ctx_create( struct glink_core_xprt_ctx *xprt_ctx) @@ -1038,6 +1039,10 @@ static struct glink_core_edge_ctx *edge_name_to_ctx_create( } } edge_ctx = kzalloc(sizeof(struct glink_core_edge_ctx), GFP_KERNEL); + if (!edge_ctx) { + mutex_unlock(&edge_list_lock_lhd0); + return NULL; + } strlcpy(edge_ctx->name, xprt_ctx->edge, GLINK_NAME_SIZE); rwref_lock_init(&edge_ctx->edge_ref_lock_lhd1, glink_edge_ctx_release); mutex_init(&edge_ctx->edge_migration_lock_lhd2); @@ -1146,6 +1151,7 @@ int ch_pop_remote_rx_intent(struct channel_ctx *ctx, size_t size, { struct glink_core_rx_intent *intent; struct glink_core_rx_intent *intent_tmp; + struct glink_core_rx_intent *best_intent = NULL; unsigned long flags; if (GLINK_MAX_PKT_SIZE < size) { @@ -1168,20 +1174,28 @@ int ch_pop_remote_rx_intent(struct channel_ctx *ctx, size_t size, list_for_each_entry_safe(intent, intent_tmp, &ctx->rmt_rx_intent_list, list) { if (intent->intent_size >= size) { - list_del(&intent->list); - GLINK_DBG_CH(ctx, - "%s: R[%u]:%zu Removed remote intent\n", - __func__, - intent->id, - intent->intent_size); - *riid_ptr = intent->id; - *intent_size = intent->intent_size; - kfree(intent); - spin_unlock_irqrestore( - &ctx->rmt_rx_intent_lst_lock_lhc2, flags); - return 0; + if (!best_intent) + best_intent = intent; + else if (best_intent->intent_size > intent->intent_size) + best_intent = intent; + if (best_intent->intent_size == size) + break; } } + if (best_intent) { + list_del(&best_intent->list); + GLINK_DBG_CH(ctx, + "%s: R[%u]:%zu Removed remote intent\n", + __func__, + best_intent->id, + best_intent->intent_size); + *riid_ptr = best_intent->id; + *intent_size = best_intent->intent_size; + kfree(best_intent); + spin_unlock_irqrestore( + &ctx->rmt_rx_intent_lst_lock_lhc2, flags); + return 0; + } spin_unlock_irqrestore(&ctx->rmt_rx_intent_lst_lock_lhc2, flags); return -EAGAIN; } @@ -2322,6 +2336,35 @@ static void dummy_tx_cmd_ch_remote_close_ack(struct glink_transport_if *if_ptr, /* intentionally left blank */ } +/** + * dummy_tx_cmd_ch_open() - dummy channel open cmd sending function + * @if_ptr: The transport to transmit on. + * @lcid: The local channel id to encode. + * @name: The channel name to encode. + * @req_xprt: The transport the core would like to migrate this channel to. + * + * Return: 0 on success or standard Linux error code. + */ +static int dummy_tx_cmd_ch_open(struct glink_transport_if *if_ptr, + uint32_t lcid, const char *name, + uint16_t req_xprt) +{ + return -EOPNOTSUPP; +} + +/** + * dummy_tx_cmd_ch_remote_open_ack() - convert a channel open ack cmd to wire + * format and transmit + * @if_ptr: The transport to transmit on. + * @rcid: The remote channel id to encode. + * @xprt_resp: The response to a transport migration request. + */ +static void dummy_tx_cmd_ch_remote_open_ack(struct glink_transport_if *if_ptr, + uint32_t rcid, uint16_t xprt_resp) +{ + /* intentionally left blank */ +} + /** * dummy_get_power_vote_ramp_time() - Dummy Power vote ramp time * @if_ptr: The transport to transmit on. @@ -2663,7 +2706,7 @@ int glink_close(void *handle) { struct glink_core_xprt_ctx *xprt_ctx = NULL; struct channel_ctx *ctx = (struct channel_ctx *)handle; - int ret; + int ret = 0; unsigned long flags; bool is_empty = false; @@ -2824,7 +2867,7 @@ static int glink_tx_common(void *handle, void *pkt_priv, tracer_pkt_log_event(data, GLINK_CORE_TX); } - /* find matching rx intent (first-fit algorithm for now) */ + /* find matching rx intent (best-fit algorithm for now) */ if (ch_pop_remote_rx_intent(ctx, size, &riid, &intent_size)) { if (!(tx_flags & GLINK_TX_REQ_INTENT)) { /* no rx intent available */ @@ -3805,6 +3848,10 @@ int glink_core_register_transport(struct glink_transport_if *if_ptr, xprt_ptr->local_version_idx = cfg->versions_entries - 1; xprt_ptr->remote_version_idx = cfg->versions_entries - 1; xprt_ptr->edge_ctx = edge_name_to_ctx_create(xprt_ptr); + if (!xprt_ptr->edge_ctx) { + kfree(xprt_ptr); + return -ENOMEM; + } xprt_ptr->l_features = cfg->versions[cfg->versions_entries - 1].features; if (!if_ptr->poll) @@ -3994,8 +4041,14 @@ static struct glink_core_xprt_ctx *glink_create_dummy_xprt_ctx( if_ptr->tx_cmd_remote_rx_intent_req_ack = dummy_tx_cmd_remote_rx_intent_req_ack; if_ptr->tx_cmd_set_sigs = dummy_tx_cmd_set_sigs; + if_ptr->tx_cmd_ch_open = dummy_tx_cmd_ch_open; + if_ptr->tx_cmd_ch_remote_open_ack = dummy_tx_cmd_ch_remote_open_ack; if_ptr->tx_cmd_ch_close = dummy_tx_cmd_ch_close; if_ptr->tx_cmd_ch_remote_close_ack = dummy_tx_cmd_ch_remote_close_ack; + if_ptr->tx_cmd_tracer_pkt = dummy_tx_cmd_tracer_pkt; + if_ptr->get_power_vote_ramp_time = dummy_get_power_vote_ramp_time; + if_ptr->power_vote = dummy_power_vote; + if_ptr->power_unvote = dummy_power_unvote; xprt_ptr->ops = if_ptr; xprt_ptr->log_ctx = log_ctx; @@ -5228,7 +5281,7 @@ static int glink_scheduler_tx(struct channel_ctx *ctx, size_t txd_len = 0; size_t tx_len = 0; uint32_t num_pkts = 0; - int ret; + int ret = 0; spin_lock_irqsave(&ctx->tx_lists_lock_lhc3, flags); while (txd_len < xprt_ctx->mtu && diff --git a/drivers/soc/qcom/glink_ssr.c b/drivers/soc/qcom/glink_ssr.c index 4952e12ffe3c1..a14d912b7536f 100644 --- a/drivers/soc/qcom/glink_ssr.c +++ b/drivers/soc/qcom/glink_ssr.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, 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 @@ -769,7 +769,7 @@ static int glink_ssr_probe(struct platform_device *pdev) struct device_node *phandle_node; struct restart_notifier_block *nb; struct subsys_info *ss_info; - struct subsys_info_leaf *ss_info_leaf; + struct subsys_info_leaf *ss_info_leaf = NULL; struct glink_link_info *link_info; char *key; const char *edge; diff --git a/drivers/soc/qcom/jtag-fuse.c b/drivers/soc/qcom/jtag-fuse.c index 46de4e5f2026e..d7389f397b9ce 100644 --- a/drivers/soc/qcom/jtag-fuse.c +++ b/drivers/soc/qcom/jtag-fuse.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2016, 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 @@ -152,8 +152,6 @@ static int jtag_fuse_probe(struct platform_device *pdev) drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; - /* Store the driver data pointer for use in exported functions */ - fusedrvdata = drvdata; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); @@ -174,6 +172,8 @@ static int jtag_fuse_probe(struct platform_device *pdev) if (!drvdata->base) return -ENOMEM; + /* Store the driver data pointer for use in exported functions */ + fusedrvdata = drvdata; dev_info(dev, "JTag Fuse initialized\n"); return 0; } diff --git a/drivers/soc/qcom/kernel_protect.c b/drivers/soc/qcom/kernel_protect.c index 7319297185c50..b48cd0bfc423c 100644 --- a/drivers/soc/qcom/kernel_protect.c +++ b/drivers/soc/qcom/kernel_protect.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015,2016 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 @@ -14,10 +14,12 @@ #include #include #include +#include #include #include #include +#define KERNEL_PROTECT_MPU 0x24 #ifdef CONFIG_MSM_KERNEL_PROTECT_TEST @@ -38,6 +40,10 @@ static void msm_protect_kernel_test(void) */ char *addr = (char *)__alloc_pages_nodemask; + if (IS_ENABLED(CONFIG_MSM_KERNEL_PROTECT_MPU)) { + pr_err("MPU protected kernel code is HLOS writable\n"); + return; + } pr_err("Checking whether the kernel text is writable...\n"); pr_err("A BUG means it is writable (this is bad)\n"); pr_err("A stage-2 fault means it's not writable (this is good, but we'll still crash)\n"); @@ -84,9 +90,33 @@ static int __init msm_protect_kernel(void) pr_debug("assigning from phys: %pa to %pa\n", &kernel_x_start_rounded, &kernel_x_end); pr_debug("virtual: %p to %p\n", virt_start, virt_end); - ret = hyp_assign_phys(kernel_x_start_rounded, - kernel_x_end - kernel_x_start_rounded, - &vmid_hlos, 1, &vmid_hlos, &dest_perms, 1); + + if (IS_ENABLED(CONFIG_MSM_KERNEL_PROTECT_MPU)) { + struct scm_desc desc = {0}; + + if (!scm_is_call_available(SCM_SVC_MP, KERNEL_PROTECT_MPU)) + return 0; + + desc.args[0] = kernel_x_start_rounded; + desc.args[1] = kernel_x_end - kernel_x_start_rounded; + desc.arginfo = SCM_ARGS(2); + + ret = scm_call2(SCM_SIP_FNID(SCM_SVC_MP, + KERNEL_PROTECT_MPU), &desc); + if (ret) { + /* + * must not proceed if failed to MPU protect kernel + * text region + */ + panic("Failed to protect kernel region %pa -- %pa\n", + &kernel_x_start_rounded, + &kernel_x_end); + } + } else { + ret = hyp_assign_phys(kernel_x_start_rounded, + kernel_x_end - kernel_x_start_rounded, + &vmid_hlos, 1, &vmid_hlos, &dest_perms, 1); + } if (ret) /* * We want to fail relatively silently since not all diff --git a/drivers/soc/qcom/kryo-l2-accessors.c b/drivers/soc/qcom/kryo-l2-accessors.c index a945f9e0ba40f..1d81074d7b817 100644 --- a/drivers/soc/qcom/kryo-l2-accessors.c +++ b/drivers/soc/qcom/kryo-l2-accessors.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2015, 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 @@ -80,7 +80,7 @@ u64 get_l2_indirect_reg(u64 reg) } EXPORT_SYMBOL(get_l2_indirect_reg); -#if defined(CONFIG_DEBUG_FS) +#if defined(CONFIG_MSM_L2_IA_DEBUG) static u32 debug_addr; static int debug_target_cpu; @@ -180,4 +180,4 @@ static int l2_ia_debug_init(void) } late_initcall(l2_ia_debug_init); -#endif /* CONFIG_DEBUG_FS */ +#endif /* CONFIG_MSM_L2_IA_DEBUG */ diff --git a/drivers/soc/qcom/memshare/msm_memshare.c b/drivers/soc/qcom/memshare/msm_memshare.c index e1e91f56526d8..67a902f81368c 100644 --- a/drivers/soc/qcom/memshare/msm_memshare.c +++ b/drivers/soc/qcom/memshare/msm_memshare.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -26,6 +26,7 @@ #include "heap_mem_ext_v01.h" #include +#include /* Macros */ #define MEMSHARE_DEV_NAME "memshare" @@ -37,6 +38,8 @@ static void mem_share_svc_recv_msg(struct work_struct *work); static DECLARE_DELAYED_WORK(work_recv_msg, mem_share_svc_recv_msg); static struct workqueue_struct *mem_share_svc_workqueue; static uint64_t bootup_request; +static bool ramdump_event; +static void *memshare_ramdump_dev[MAX_CLIENTS]; /* Memshare Driver Structure */ struct memshare_driver { @@ -114,9 +117,37 @@ static struct msg_desc mem_share_svc_size_query_resp_desc = { .ei_array = mem_query_size_resp_msg_data_v01_ei, }; +/* + * This API creates ramdump dev handlers + * for each of the memshare clients. + * These dev handlers will be used for + * extracting the ramdump for loaned memory + * segments. + */ + +static int mem_share_configure_ramdump(void) +{ + char client_name[18] = "memshare_"; + char *clnt; + + clnt = ((!num_clients) ? "GPS" : ((num_clients == 1) ? "FTM" : "DIAG")); + snprintf(client_name, 18, "memshare_%s", clnt); + + memshare_ramdump_dev[num_clients] = create_ramdump_device(client_name, + NULL); + if (IS_ERR_OR_NULL(memshare_ramdump_dev[num_clients])) { + pr_err("memshare: %s: Unable to create memshare ramdump device.\n", + __func__); + memshare_ramdump_dev[num_clients] = NULL; + return -ENOMEM; + } + + return 0; +} + static int check_client(int client_id, int proc, int request) { - int i = 0; + int i = 0, rc; int found = DHMS_MEM_CLIENT_INVALID; for (i = 0; i < MAX_CLIENTS; i++) { @@ -127,7 +158,7 @@ static int check_client(int client_id, int proc, int request) } } if ((found == DHMS_MEM_CLIENT_INVALID) && !request) { - pr_debug("No registered client, adding a new client\n"); + pr_debug("memshare: No registered client, adding a new client\n"); /* Add a new client */ for (i = 0; i < MAX_CLIENTS; i++) { if (memblock[i].client_id == DHMS_MEM_CLIENT_INVALID) { @@ -136,6 +167,16 @@ static int check_client(int client_id, int proc, int request) memblock[i].guarantee = 0; memblock[i].peripheral = proc; found = i; + + if (!memblock[i].file_created) { + rc = mem_share_configure_ramdump(); + if (rc) + pr_err("In %s, Cannot create ramdump for client: %d\n", + __func__, client_id); + else + memblock[i].file_created = 1; + } + break; } } @@ -190,10 +231,63 @@ void initialize_client(void) memblock[i].memory_type = MEMORY_CMA; memblock[i].free_memory = 0; memblock[i].hyp_mapping = 0; + memblock[i].file_created = 0; } dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &attrs); } +/* + * This API initializes the ramdump segments + * with the physical address and size of + * the memshared clients. Extraction of ramdump + * is skipped if memshare client is not alloted + * This calls the ramdump api in extracting the + * ramdump in elf format. + */ + +static int mem_share_do_ramdump(void) +{ + int i = 0, ret; + char *client_name; + + for (i = 0; i < num_clients; i++) { + + struct ramdump_segment *ramdump_segments_tmp = NULL; + + client_name = (i == 0) ? "GPS" : + ((i == 1) ? "FTM" : ((i == 2) ? "DIAG" : "NULL")); + + if (!memblock[i].alloted) { + pr_err("memshare:%s memblock is not alloted\n", + client_name); + continue; + } + + ramdump_segments_tmp = kcalloc(1, + sizeof(struct ramdump_segment), + GFP_KERNEL); + if (!ramdump_segments_tmp) + return -ENOMEM; + + ramdump_segments_tmp[0].size = memblock[i].size; + ramdump_segments_tmp[0].address = memblock[i].phy_addr; + + pr_debug("memshare: %s:%s client:phy_address = %llx, size = %d\n", + __func__, client_name, + (unsigned long long) memblock[i].phy_addr, memblock[i].size); + + ret = do_elf_ramdump(memshare_ramdump_dev[i], + ramdump_segments_tmp, 1); + if (ret < 0) { + pr_err("memshare: Unable to dump: %d\n", ret); + kfree(ramdump_segments_tmp); + return ret; + } + kfree(ramdump_segments_tmp); + } + return 0; +} + static int modem_notifier_cb(struct notifier_block *this, unsigned long code, void *_cmd) { @@ -202,14 +296,38 @@ static int modem_notifier_cb(struct notifier_block *this, unsigned long code, u32 source_vmlist[2] = {VMID_HLOS, VMID_MSS_MSA}; int dest_vmids[1] = {VMID_HLOS}; int dest_perms[1] = {PERM_READ|PERM_WRITE}; + struct notif_data *notifdata = NULL; mutex_lock(&memsh_drv->mem_share); + switch (code) { case SUBSYS_BEFORE_SHUTDOWN: bootup_request++; break; + case SUBSYS_RAMDUMP_NOTIFICATION: + ramdump_event = 1; + break; + + case SUBSYS_BEFORE_POWERUP: + if (_cmd) { + notifdata = (struct notif_data *) _cmd; + } else { + ramdump_event = 0; + break; + } + + if (notifdata->enable_ramdump && ramdump_event) { + pr_info("memshare: %s, Ramdump collection is enabled\n", + __func__); + ret = mem_share_do_ramdump(); + if (ret) + pr_err("Ramdump collection failed\n"); + ramdump_event = 0; + } + break; + case SUBSYS_AFTER_POWERUP: pr_debug("memshare: Modem has booted up\n"); for (i = 0; i < MAX_CLIENTS; i++) { @@ -800,6 +918,9 @@ static int memshare_child_probe(struct platform_device *pdev) memblock[num_clients].size = size; memblock[num_clients].client_id = client_id; + /* + * Memshare allocation for guaranteed clients + */ if (memblock[num_clients].guarantee) { rc = memshare_alloc(memsh_child->dev, memblock[num_clients].size, @@ -812,6 +933,21 @@ static int memshare_child_probe(struct platform_device *pdev) memblock[num_clients].alloted = 1; } + /* + * call for creating ramdump dev handlers for + * memshare clients + */ + + if (!memblock[num_clients].file_created) { + rc = mem_share_configure_ramdump(); + if (rc) + pr_err("In %s, cannot collect dumps for client id: %d\n", + __func__, + memblock[num_clients].client_id); + else + memblock[num_clients].file_created = 1; + } + num_clients++; return 0; diff --git a/drivers/soc/qcom/memshare/msm_memshare.h b/drivers/soc/qcom/memshare/msm_memshare.h index 68a1439079762..3989075329776 100644 --- a/drivers/soc/qcom/memshare/msm_memshare.h +++ b/drivers/soc/qcom/memshare/msm_memshare.h @@ -51,6 +51,9 @@ struct mem_blocks { uint8_t free_memory; /* Need Hypervisor mapping*/ uint8_t hyp_mapping; + /* Status flag which checks if ramdump file is created*/ + int file_created; + }; int memshare_alloc(struct device *dev, diff --git a/drivers/soc/qcom/peripheral-loader.c b/drivers/soc/qcom/peripheral-loader.c index eb25733a7838d..320729c7c2372 100644 --- a/drivers/soc/qcom/peripheral-loader.c +++ b/drivers/soc/qcom/peripheral-loader.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -461,6 +461,8 @@ static int pil_alloc_region(struct pil_priv *priv, phys_addr_t min_addr, if (region == NULL) { pil_err(priv->desc, "Failed to allocate relocatable region of size %zx\n", size); + priv->region_start = 0; + priv->region_end = 0; return -ENOMEM; } @@ -579,6 +581,13 @@ static int pil_init_mmap(struct pil_desc *desc, const struct pil_mdt *mdt) return pil_init_entry_addr(priv, mdt); } +struct pil_map_fw_info { + void *region; + struct dma_attrs attrs; + phys_addr_t base_addr; + struct device *dev; +}; + static void pil_release_mmap(struct pil_desc *desc) { struct pil_priv *priv = desc->priv; @@ -597,14 +606,30 @@ static void pil_release_mmap(struct pil_desc *desc) } } -#define IOMAP_SIZE SZ_1M +static void pil_clear_segment(struct pil_desc *desc) +{ + struct pil_priv *priv = desc->priv; + u8 __iomem *buf; -struct pil_map_fw_info { - void *region; - struct dma_attrs attrs; - phys_addr_t base_addr; - struct device *dev; -}; + struct pil_map_fw_info map_fw_info = { + .attrs = desc->attrs, + .region = priv->region, + .base_addr = priv->region_start, + .dev = desc->dev, + }; + + void *map_data = desc->map_data ? desc->map_data : &map_fw_info; + + /* Clear memory so that unauthorized ELF code is not left behind */ + buf = desc->map_fw_mem(priv->region_start, (priv->region_end - + priv->region_start), map_data); + pil_memset_io(buf, 0, (priv->region_end - priv->region_start)); + desc->unmap_fw_mem(buf, (priv->region_end - priv->region_start), + map_data); + +} + +#define IOMAP_SIZE SZ_1M static void *map_fw_mem(phys_addr_t paddr, size_t size, void *data) { @@ -885,11 +910,15 @@ int pil_boot(struct pil_desc *desc) priv->region_start), VMID_HLOS); } + if (desc->clear_fw_region && priv->region_start) + pil_clear_segment(desc); dma_free_attrs(desc->dev, priv->region_size, priv->region, priv->region_start, &desc->attrs); priv->region = NULL; } + if (desc->clear_fw_region && priv->region_start) + pil_clear_segment(desc); pil_release_mmap(desc); } return ret; diff --git a/drivers/soc/qcom/peripheral-loader.h b/drivers/soc/qcom/peripheral-loader.h index 802abe26a9606..b0c83150dad9d 100644 --- a/drivers/soc/qcom/peripheral-loader.h +++ b/drivers/soc/qcom/peripheral-loader.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -38,6 +38,7 @@ struct pil_priv; * @shutdown_fail: Set if PIL op for shutting down subsystem fails. * @modem_ssr: true if modem is restarting, false if booting for first time. * @subsys_vmid: memprot id for the subsystem. + * @clear_fw_region: Clear fw region on failure in loading. */ struct pil_desc { const char *name; @@ -57,6 +58,7 @@ struct pil_desc { bool shutdown_fail; bool modem_ssr; u32 subsys_vmid; + bool clear_fw_region; }; /** diff --git a/drivers/soc/qcom/pil-msa.c b/drivers/soc/qcom/pil-msa.c index 7a12c3220cad4..a61ecc14dc2d5 100644 --- a/drivers/soc/qcom/pil-msa.c +++ b/drivers/soc/qcom/pil-msa.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -527,7 +527,7 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) { struct q6v5_data *drv = container_of(pil, struct q6v5_data, desc); struct modem_data *md = dev_get_drvdata(pil->dev); - const struct firmware *fw, *dp_fw; + const struct firmware *fw, *dp_fw = NULL; char fw_name_legacy[10] = "mba.b00"; char fw_name[10] = "mba.mbn"; char *dp_name = "msadp"; @@ -595,7 +595,15 @@ int pil_mss_reset_load_mba(struct pil_desc *pil) /* Load the MBA image into memory */ count = fw->size; - memcpy(mba_dp_virt, data, count); + if (count <= SZ_1M) { + /* Ensures memcpy is done for max 1MB fw size */ + memcpy(mba_dp_virt, data, count); + } else { + dev_err(pil->dev, "%s fw image loading into memory is failed due to fw size overflow\n", + __func__); + ret = -EINVAL; + goto err_mba_data; + } /* Ensure memcpy of the MBA memory is done before loading the DP */ wmb(); diff --git a/drivers/soc/qcom/pil-q6v5.c b/drivers/soc/qcom/pil-q6v5.c index 369d165bd6920..fa6566c94bd22 100644 --- a/drivers/soc/qcom/pil-q6v5.c +++ b/drivers/soc/qcom/pil-q6v5.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-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 @@ -203,9 +203,9 @@ void pil_q6v5_halt_axi_port(struct pil_desc *pil, void __iomem *halt_base) ret = readl_poll_timeout(halt_base + AXI_HALTACK, status, status != 0, 50, HALT_ACK_TIMEOUT_US); if (ret) - dev_warn(pil->dev, "Port %p halt timeout\n", halt_base); + dev_warn(pil->dev, "Port %pK halt timeout\n", halt_base); else if (!readl_relaxed(halt_base + AXI_IDLE)) - dev_warn(pil->dev, "Port %p halt failed\n", halt_base); + dev_warn(pil->dev, "Port %pK halt failed\n", halt_base); /* Clear halt request (port will remain halted until reset) */ writel_relaxed(0, halt_base + AXI_HALTREQ); @@ -584,6 +584,7 @@ struct q6v5_data *pil_q6v5_init(struct platform_device *pdev) if (ret) return ERR_PTR(ret); + desc->clear_fw_region = false; desc->dev = &pdev->dev; drv->qdsp6v5_2_0 = of_device_is_compatible(pdev->dev.of_node, diff --git a/drivers/soc/qcom/qbt1000.c b/drivers/soc/qcom/qbt1000.c index 135e2b834db30..335333098a49f 100644 --- a/drivers/soc/qcom/qbt1000.c +++ b/drivers/soc/qcom/qbt1000.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -60,6 +60,7 @@ enum sensor_connection_types { * user space will provide new value upon tz app load */ static uint32_t g_app_buf_size = SZ_256K; +static char const *const FP_APP_NAME = "fingerpr"; struct qbt1000_drvdata { struct class *qbt1000_class; @@ -86,6 +87,7 @@ struct qbt1000_drvdata { uint32_t ssc_spi_port; uint32_t ssc_spi_port_slave_index; struct wakeup_source w_lock; + struct qseecom_handle *app_handle; }; #define W_LOCK_DELAY_MS (2000) @@ -107,14 +109,16 @@ static int get_cmd_rsp_buffers(struct qseecom_handle *hdl, uint32_t *rsp_len) { /* 64 bytes alignment for QSEECOM */ - *cmd_len = ALIGN(*cmd_len, 64); - *rsp_len = ALIGN(*rsp_len, 64); + uint64_t aligned_cmd_len = ALIGN((uint64_t)*cmd_len, 64); + uint64_t aligned_rsp_len = ALIGN((uint64_t)*rsp_len, 64); - if ((*rsp_len + *cmd_len) > g_app_buf_size) + if ((aligned_rsp_len + aligned_cmd_len) > (uint64_t)g_app_buf_size) return -ENOMEM; *cmd = hdl->sbuf; + *cmd_len = aligned_cmd_len; *rsp = hdl->sbuf + *cmd_len; + *rsp_len = aligned_rsp_len; return 0; } @@ -751,13 +755,14 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) void __user *priv_arg = (void __user *)arg; struct qbt1000_drvdata *drvdata; + drvdata = file->private_data; + if (IS_ERR(priv_arg)) { dev_err(drvdata->dev, "%s: invalid user space pointer %lu\n", __func__, arg); return -EINVAL; } - drvdata = file->private_data; pm_runtime_get_sync(drvdata->dev); mutex_lock(&drvdata->mutex); if (((drvdata->sensor_conn_type == SPI) && (!drvdata->clock_state)) || @@ -772,6 +777,7 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) case QBT1000_LOAD_APP: { struct qbt1000_app app; + struct qseecom_handle *app_handle; if (copy_from_user(&app, priv_arg, sizeof(app)) != 0) { @@ -782,13 +788,55 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) goto end; } + if (!app.app_handle) { + dev_err(drvdata->dev, "%s: LOAD app_handle is null\n", + __func__); + rc = -EINVAL; + goto end; + } + + if (strcmp(app.name, FP_APP_NAME)) { + dev_err(drvdata->dev, "%s: Invalid app name\n", + __func__); + rc = -EINVAL; + goto end; + } + + if (drvdata->app_handle) { + dev_err(drvdata->dev, "%s: LOAD app already loaded, unloading first\n", + __func__); + rc = qseecom_shutdown_app(&drvdata->app_handle); + if (rc != 0) { + dev_err(drvdata->dev, "%s: LOAD current app failed to shutdown\n", + __func__); + goto end; + } + } + + app.name[MAX_NAME_SIZE - 1] = '\0'; + /* start the TZ app */ - rc = qseecom_start_app(app.app_handle, app.name, app.size); + rc = qseecom_start_app(&drvdata->app_handle, + app.name, app.size); if (rc == 0) { g_app_buf_size = app.size; } else { - dev_err(drvdata->dev, "%s: App %s failed to load\n", - __func__, app.name); + dev_err(drvdata->dev, "%s: Fingerprint Trusted App failed to load\n", + __func__); + goto end; + } + + /* copy a fake app handle to user */ + app_handle = drvdata->app_handle ? + (struct qseecom_handle *)123456 : 0; + rc = copy_to_user((void __user *)app.app_handle, &app_handle, + sizeof(*app.app_handle)); + + if (rc != 0) { + dev_err(drvdata->dev, + "%s: Failed copy 2us LOAD rc:%d\n", + __func__, rc); + rc = -ENOMEM; goto end; } @@ -797,31 +845,62 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) case QBT1000_UNLOAD_APP: { struct qbt1000_app app; + struct qseecom_handle *app_handle = 0; if (copy_from_user(&app, priv_arg, sizeof(app)) != 0) { rc = -ENOMEM; dev_err(drvdata->dev, - "%s: Failed copy from user space-LOAD\n", + "%s: Failed copy from user space-UNLOAD\n", __func__); goto end; } - /* if the app hasn't been loaded already, return err */ if (!app.app_handle) { + dev_err(drvdata->dev, "%s: UNLOAD app_handle is null\n", + __func__); + rc = -EINVAL; + goto end; + } + + rc = copy_from_user(&app_handle, app.app_handle, + sizeof(app_handle)); + + if (rc != 0) { + dev_err(drvdata->dev, + "%s: Failed copy from user space-UNLOAD handle rc:%d\n", + __func__, rc); + rc = -ENOMEM; + goto end; + } + + /* if the app hasn't been loaded already, return err */ + if (!drvdata->app_handle) { dev_err(drvdata->dev, "%s: App not loaded\n", __func__); rc = -EINVAL; goto end; } - rc = qseecom_shutdown_app(app.app_handle); + rc = qseecom_shutdown_app(&drvdata->app_handle); if (rc != 0) { dev_err(drvdata->dev, "%s: App failed to shutdown\n", __func__); goto end; } + /* copy the app handle (should be null) to user */ + rc = copy_to_user((void __user *)app.app_handle, &app_handle, + sizeof(*app.app_handle)); + + if (rc != 0) { + dev_err(drvdata->dev, + "%s: Failed copy 2us UNLOAD rc:%d\n", + __func__, rc); + rc = -ENOMEM; + goto end; + } + break; } case QBT1000_SEND_TZCMD: @@ -844,7 +923,7 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* if the app hasn't been loaded already, return err */ - if (!tzcmd.app_handle) { + if (!drvdata->app_handle) { dev_err(drvdata->dev, "%s: App not loaded\n", __func__); rc = -EINVAL; @@ -854,7 +933,7 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) /* init command and response buffers and align lengths */ aligned_cmd_len = tzcmd.req_buf_len; aligned_rsp_len = tzcmd.rsp_buf_len; - rc = get_cmd_rsp_buffers(tzcmd.app_handle, + rc = get_cmd_rsp_buffers(drvdata->app_handle, (void **)&aligned_cmd, &aligned_cmd_len, (void **)&aligned_rsp, @@ -862,6 +941,13 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) if (rc != 0) goto end; + if (!aligned_cmd) { + dev_err(drvdata->dev, "%s: Null command buffer\n", + __func__); + rc = -EINVAL; + goto end; + } + rc = copy_from_user(aligned_cmd, (void __user *)tzcmd.req_buf, tzcmd.req_buf_len); if (rc != 0) { @@ -872,7 +958,7 @@ static long qbt1000_ioctl(struct file *file, unsigned cmd, unsigned long arg) } /* send cmd to TZ */ - rc = qseecom_send_command(tzcmd.app_handle, + rc = qseecom_send_command(drvdata->app_handle, aligned_cmd, aligned_cmd_len, aligned_rsp, diff --git a/drivers/soc/qcom/qdsp6v2/voice_svc.c b/drivers/soc/qcom/qdsp6v2/voice_svc.c index 67c58d1e6d4cd..fe54589744061 100644 --- a/drivers/soc/qcom/qdsp6v2/voice_svc.c +++ b/drivers/soc/qcom/qdsp6v2/voice_svc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -42,6 +42,12 @@ struct voice_svc_prvt { struct list_head response_queue; wait_queue_head_t response_wait; spinlock_t response_lock; + /* + * This mutex ensures responses are processed in sequential order and + * that no two threads access and free the same response at the same + * time. + */ + struct mutex response_mutex_lock; }; struct apr_data { @@ -223,8 +229,8 @@ static int voice_svc_send_req(struct voice_svc_cmd_request *apr_request, } else if (!strcmp(apr_request->svc_name, VOICE_SVC_MVM_STR)) { apr_handle = prtd->apr_q6_mvm; } else { - pr_err("%s: Invalid service %s\n", __func__, - apr_request->svc_name); + pr_err("%s: Invalid service %.*s\n", __func__, + MAX_APR_SERVICE_NAME_LEN, apr_request->svc_name); ret = -EINVAL; goto done; @@ -338,8 +344,8 @@ static int process_reg_cmd(struct voice_svc_register *apr_reg_svc, svc = VOICE_SVC_CVS_STR; handle = &prtd->apr_q6_cvs; } else { - pr_err("%s: Invalid Service: %s\n", __func__, - apr_reg_svc->svc_name); + pr_err("%s: Invalid Service: %.*s\n", __func__, + MAX_APR_SERVICE_NAME_LEN, apr_reg_svc->svc_name); ret = -EINVAL; goto done; } @@ -362,10 +368,23 @@ static ssize_t voice_svc_write(struct file *file, const char __user *buf, struct voice_svc_prvt *prtd; struct voice_svc_write_msg *data = NULL; uint32_t cmd; + struct voice_svc_register *register_data = NULL; + struct voice_svc_cmd_request *request_data = NULL; + uint32_t request_payload_size; pr_debug("%s\n", __func__); - data = kmalloc(count, GFP_KERNEL); + /* + * Check if enough memory is allocated to parse the message type. + * Will check there is enough to hold the payload later. + */ + if (count >= sizeof(struct voice_svc_write_msg)) { + data = kmalloc(count, GFP_KERNEL); + } else { + pr_debug("%s: invalid data size\n", __func__); + ret = -EINVAL; + goto done; + } if (data == NULL) { pr_err("%s: data kmalloc failed.\n", __func__); @@ -383,7 +402,7 @@ static ssize_t voice_svc_write(struct file *file, const char __user *buf, } cmd = data->msg_type; - prtd = (struct voice_svc_prvt *)file->private_data; + prtd = (struct voice_svc_prvt *) file->private_data; if (prtd == NULL) { pr_err("%s: prtd is NULL\n", __func__); @@ -393,31 +412,68 @@ static ssize_t voice_svc_write(struct file *file, const char __user *buf, switch (cmd) { case MSG_REGISTER: - if (count >= - (sizeof(struct voice_svc_register) + - sizeof(*data))) { - ret = process_reg_cmd( - (struct voice_svc_register *)data->payload, prtd); + /* + * Check that count reflects the expected size to ensure + * sufficient memory was allocated. Since voice_svc_register + * has a static size, this should be exact. + */ + if (count == (sizeof(struct voice_svc_write_msg) + + sizeof(struct voice_svc_register))) { + register_data = + (struct voice_svc_register *)data->payload; + if (register_data == NULL) { + pr_err("%s: register data is NULL", __func__); + ret = -EINVAL; + goto done; + } + ret = process_reg_cmd(register_data, prtd); if (!ret) ret = count; } else { - pr_err("%s: invalid payload size\n", __func__); + pr_err("%s: invalid data payload size for register command\n", + __func__); ret = -EINVAL; goto done; } break; case MSG_REQUEST: - if (count >= (sizeof(struct voice_svc_cmd_request) + - sizeof(*data))) { - ret = voice_svc_send_req( - (struct voice_svc_cmd_request *)data->payload, prtd); - if (!ret) - ret = count; - } else { - pr_err("%s: invalid payload size\n", __func__); - ret = -EINVAL; - goto done; - } + /* + * Check that count reflects the expected size to ensure + * sufficient memory was allocated. Since voice_svc_cmd_request + * has a variable size, check the minimum value count must be to + * parse the message request then check the minimum size to hold + * the payload of the message request. + */ + if (count >= (sizeof(struct voice_svc_write_msg) + + sizeof(struct voice_svc_cmd_request))) { + request_data = + (struct voice_svc_cmd_request *)data->payload; + if (request_data == NULL) { + pr_err("%s: request data is NULL", __func__); + ret = -EINVAL; + goto done; + } + + request_payload_size = request_data->payload_size; + + if (count >= (sizeof(struct voice_svc_write_msg) + + sizeof(struct voice_svc_cmd_request) + + request_payload_size)) { + ret = voice_svc_send_req(request_data, prtd); + if (!ret) + ret = count; + } else { + pr_err("%s: invalid request payload size\n", + __func__); + ret = -EINVAL; + goto done; + } + } else { + pr_err("%s: invalid data payload size for request command\n", + __func__); + ret = -EINVAL; + goto done; + } break; default: pr_debug("%s: Invalid command: %u\n", __func__, cmd); @@ -448,6 +504,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, goto done; } + mutex_lock(&prtd->response_mutex_lock); spin_lock_irqsave(&prtd->response_lock, spin_flags); if (list_empty(&prtd->response_queue)) { @@ -461,7 +518,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, pr_debug("%s: Read timeout\n", __func__); ret = -ETIMEDOUT; - goto done; + goto unlock; } else if (ret > 0 && !list_empty(&prtd->response_queue)) { pr_debug("%s: Interrupt recieved for response\n", __func__); @@ -469,7 +526,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, pr_debug("%s: Interrupted by SIGNAL %d\n", __func__, ret); - goto done; + goto unlock; } spin_lock_irqsave(&prtd->response_lock, spin_flags); @@ -488,7 +545,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, __func__, count, size); ret = -ENOMEM; - goto done; + goto unlock; } if (!access_ok(VERIFY_WRITE, arg, size)) { @@ -496,7 +553,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, __func__); ret = -EPERM; - goto done; + goto unlock; } ret = copy_to_user(arg, &resp->resp, @@ -506,7 +563,7 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, pr_err("%s: copy_to_user failed %d\n", __func__, ret); ret = -EPERM; - goto done; + goto unlock; } spin_lock_irqsave(&prtd->response_lock, spin_flags); @@ -520,6 +577,8 @@ static ssize_t voice_svc_read(struct file *file, char __user *arg, ret = count; +unlock: + mutex_unlock(&prtd->response_mutex_lock); done: return ret; } @@ -575,6 +634,7 @@ static int voice_svc_open(struct inode *inode, struct file *file) INIT_LIST_HEAD(&prtd->response_queue); init_waitqueue_head(&prtd->response_wait); spin_lock_init(&prtd->response_lock); + mutex_init(&prtd->response_mutex_lock); file->private_data = (void *)prtd; /* Current APR implementation doesn't support session based @@ -625,6 +685,7 @@ static int voice_svc_release(struct inode *inode, struct file *file) pr_err("%s: Failed to dereg MVM %d\n", __func__, ret); } + mutex_lock(&prtd->response_mutex_lock); spin_lock_irqsave(&prtd->response_lock, spin_flags); while (!list_empty(&prtd->response_queue)) { @@ -638,6 +699,9 @@ static int voice_svc_release(struct inode *inode, struct file *file) } spin_unlock_irqrestore(&prtd->response_lock, spin_flags); + mutex_unlock(&prtd->response_mutex_lock); + + mutex_destroy(&prtd->response_mutex_lock); kfree(file->private_data); file->private_data = NULL; diff --git a/drivers/soc/qcom/rpm-smd-debug.c b/drivers/soc/qcom/rpm-smd-debug.c index c086681496361..aaf7b415d1f19 100644 --- a/drivers/soc/qcom/rpm-smd-debug.c +++ b/drivers/soc/qcom/rpm-smd-debug.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2014, 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 @@ -44,9 +44,9 @@ static ssize_t rsc_ops_write(struct file *fp, const char __user *user_buffer, { char buf[MAX_MSG_BUFFER], rsc_type_str[6] = {}, rpm_set[8] = {}, key_str[6] = {}; - int i, pos, set = -1, nelems; + int i, pos = -1, set = -1, nelems = -1; char *cmp; - uint32_t rsc_type, rsc_id, key, data; + uint32_t rsc_type = 0, rsc_id = 0, key = 0, data = 0; struct msm_rpm_request *req; count = min(count, sizeof(buf) - 1); @@ -55,8 +55,12 @@ static ssize_t rsc_ops_write(struct file *fp, const char __user *user_buffer, buf[count] = '\0'; cmp = strstrip(buf); - sscanf(cmp, "%7s %5s %u %d %n", rpm_set, rsc_type_str, &rsc_id, - &nelems, &pos); + if (sscanf(cmp, "%7s %5s %u %d %n", rpm_set, rsc_type_str, + &rsc_id, &nelems, &pos) != 4) { + pr_err("Invalid number of arguments passed\n"); + goto err; + } + if (strlen(rpm_set) > 6 || strlen(rsc_type_str) > 4) { pr_err("Invalid value of set or resource type\n"); goto err; @@ -84,7 +88,11 @@ static ssize_t rsc_ops_write(struct file *fp, const char __user *user_buffer, for (i = 0; i < nelems; i++) { cmp += pos; - sscanf(cmp, "%5s %n", key_str, &pos); + if (sscanf(cmp, "%5s %n", key_str, &pos) != 1) { + pr_err("Invalid number of arguments passed\n"); + goto err; + } + if (strlen(key_str) > 4) { pr_err("Key value cannot be more than 4 charecters"); goto err; @@ -96,7 +104,11 @@ static ssize_t rsc_ops_write(struct file *fp, const char __user *user_buffer, } cmp += pos; - sscanf(cmp, "%u %n", &data, &pos); + if (sscanf(cmp, "%u %n", &data, &pos) != 1) { + pr_err("Invalid number of arguments passed\n"); + goto err; + } + if (msm_rpm_add_kvp_data(req, key, (void *)&data, sizeof(data))) goto err_request; diff --git a/drivers/soc/qcom/rpm-smd.c b/drivers/soc/qcom/rpm-smd.c index 209e5c64c8cc5..bb0be81d7e9f5 100644 --- a/drivers/soc/qcom/rpm-smd.c +++ b/drivers/soc/qcom/rpm-smd.c @@ -523,7 +523,6 @@ static int msm_rpm_read_sleep_ack(void) { int ret; char buf[MAX_ERR_BUFFER_SIZE] = {0}; - uint32_t msg_id; if (glink_enabled) ret = msm_rpm_glink_rx_poll(glink_data->glink_handle); @@ -554,38 +553,18 @@ static int msm_rpm_read_sleep_ack(void) return -EAGAIN; ret = msm_rpm_read_smd_data(buf); - if (!ret) { - /* Mimic Glink behavior to ensure that the - * data is read and the msg is removed from - * the wait list. We should have gotten here - * only when there are no drivers waiting on - * ACKs. msm_rpm_get_entry_from_msg_id() - * return non-NULL only then. - */ - msg_id = msm_rpm_get_msg_id_from_ack(buf); - msm_rpm_process_ack(msg_id, 0); + if (!ret) ret = smd_is_pkt_avail(msm_rpm_data.ch_info); - } } return ret; } -static void msm_rpm_flush_noack_messages(void) -{ - while (!list_empty(&msm_rpm_wait_list)) { - if (!msm_rpm_read_sleep_ack()) - break; - } -} - static int msm_rpm_flush_requests(bool print) { struct rb_node *t; int ret; int count = 0; - msm_rpm_flush_noack_messages(); - for (t = rb_first(&tr_root); t; t = rb_next(t)) { struct slp_buf *s = rb_entry(t, struct slp_buf, node); @@ -844,18 +823,14 @@ static void msm_rpm_notify(void *data, unsigned event) bool msm_rpm_waiting_for_ack(void) { - bool ret = false; + bool ret; unsigned long flags; - struct msm_rpm_wait_data *elem = NULL; spin_lock_irqsave(&msm_rpm_list_lock, flags); - elem = list_first_entry_or_null(&msm_rpm_wait_list, - struct msm_rpm_wait_data, list); - if (elem) - ret = !elem->delete_on_ack; + ret = list_empty(&msm_rpm_wait_list); spin_unlock_irqrestore(&msm_rpm_list_lock, flags); - return ret; + return !ret; } static struct msm_rpm_wait_data *msm_rpm_get_entry_from_msg_id(uint32_t msg_id) diff --git a/drivers/soc/qcom/rpm_master_stat.c b/drivers/soc/qcom/rpm_master_stat.c index 7854e35faf16c..ec8300b94ac2f 100644 --- a/drivers/soc/qcom/rpm_master_stat.c +++ b/drivers/soc/qcom/rpm_master_stat.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2012-2014, 2016 The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2014, 2016-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 @@ -50,6 +51,8 @@ #define GET_FIELD(a) ((strnstr(#a, ".", 80) + 1)) +static DEFINE_MUTEX(msm_rpm_master_stats_mutex); + struct msm_rpm_master_stats { uint32_t active_cores; uint32_t numshutdowns; @@ -80,9 +83,11 @@ int msm_rpm_master_stats_file_close(struct inode *inode, { struct msm_rpm_master_stats_private_data *private = file->private_data; + mutex_lock(&msm_rpm_master_stats_mutex); if (private->reg_base) iounmap(private->reg_base); kfree(file->private_data); + mutex_unlock(&msm_rpm_master_stats_mutex); return 0; } @@ -95,14 +100,10 @@ static int msm_rpm_master_copy_stats( static int master_cnt; int count, j = 0; char *buf; - static DEFINE_MUTEX(msm_rpm_master_stats_mutex); - - mutex_lock(&msm_rpm_master_stats_mutex); /* Iterate possible number of masters */ if (master_cnt > prvdata->num_masters - 1) { master_cnt = 0; - mutex_unlock(&msm_rpm_master_stats_mutex); return 0; } @@ -256,7 +257,6 @@ static int msm_rpm_master_copy_stats( } master_cnt++; - mutex_unlock(&msm_rpm_master_stats_mutex); return RPM_MASTERS_BUF_LEN - count; } @@ -265,25 +265,36 @@ static ssize_t msm_rpm_master_stats_file_read(struct file *file, { struct msm_rpm_master_stats_private_data *prvdata; struct msm_rpm_master_stats_platform_data *pdata; + ssize_t ret; + mutex_lock(&msm_rpm_master_stats_mutex); prvdata = file->private_data; - if (!prvdata) - return -EINVAL; + if (!prvdata) { + ret = -EINVAL; + goto exit; + } pdata = prvdata->platform_data; - if (!pdata) - return -EINVAL; + if (!pdata) { + ret = -EINVAL; + goto exit; + } - if (!bufu || count == 0) - return -EINVAL; + if (!bufu || count == 0) { + ret = -EINVAL; + goto exit; + } if ((*ppos <= pdata->phys_size)) { prvdata->len = msm_rpm_master_copy_stats(prvdata); *ppos = 0; } - return simple_read_from_buffer(bufu, count, ppos, + ret = simple_read_from_buffer(bufu, count, ppos, prvdata->buf, prvdata->len); +exit: + mutex_unlock(&msm_rpm_master_stats_mutex); + return ret; } static int msm_rpm_master_stats_file_open(struct inode *inode, @@ -291,15 +302,20 @@ static int msm_rpm_master_stats_file_open(struct inode *inode, { struct msm_rpm_master_stats_private_data *prvdata; struct msm_rpm_master_stats_platform_data *pdata; + int ret = 0; + mutex_lock(&msm_rpm_master_stats_mutex); pdata = inode->i_private; file->private_data = kzalloc(sizeof(struct msm_rpm_master_stats_private_data), GFP_KERNEL); - if (!file->private_data) - return -ENOMEM; + if (!file->private_data) { + ret = -ENOMEM; + goto exit; + } + prvdata = file->private_data; prvdata->reg_base = ioremap(pdata->phys_addr_base, @@ -310,14 +326,17 @@ static int msm_rpm_master_stats_file_open(struct inode *inode, pr_err("%s: ERROR could not ioremap start=%pa, len=%u\n", __func__, &pdata->phys_addr_base, pdata->phys_size); - return -EBUSY; + ret = -EBUSY; + goto exit; } prvdata->len = 0; prvdata->num_masters = pdata->num_masters; prvdata->master_names = pdata->masters; prvdata->platform_data = pdata; - return 0; +exit: + mutex_unlock(&msm_rpm_master_stats_mutex); + return ret; } static const struct file_operations msm_rpm_master_stats_fops = { diff --git a/drivers/soc/qcom/rpm_rail_stats.c b/drivers/soc/qcom/rpm_rail_stats.c index c4d34378140de..5e90ce35e64cf 100644 --- a/drivers/soc/qcom/rpm_rail_stats.c +++ b/drivers/soc/qcom/rpm_rail_stats.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015, 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 @@ -46,6 +46,8 @@ #define NAMELEN (sizeof(uint32_t)+1) +static DEFINE_MUTEX(msm_rpm_rail_stats_mutex); + struct msm_rpm_rail_stats_platform_data { phys_addr_t phys_addr_base; u32 phys_size; @@ -80,9 +82,11 @@ int msm_rpm_rail_stats_file_close(struct inode *inode, struct file *file) { struct msm_rpm_rail_stats_private_data *private = file->private_data; + mutex_lock(&msm_rpm_rail_stats_mutex); if (private->reg_base) iounmap(private->reg_base); kfree(file->private_data); + mutex_unlock(&msm_rpm_rail_stats_mutex); return 0; } @@ -154,18 +158,26 @@ static int msm_rpm_rail_stats_copy( static ssize_t msm_rpm_rail_stats_file_read(struct file *file, char __user *bufu, size_t count, loff_t *ppos) { - struct msm_rpm_rail_stats_private_data *prvdata = - file->private_data; + struct msm_rpm_rail_stats_private_data *prvdata; struct msm_rpm_rail_stats_platform_data *pdata; + ssize_t ret; - if (!prvdata) - return -EINVAL; + mutex_lock(&msm_rpm_rail_stats_mutex); + prvdata = file->private_data; + if (!prvdata) { + ret = -EINVAL; + goto exit; + } - if (!prvdata->platform_data) - return -EINVAL; + if (!prvdata->platform_data) { + ret = -EINVAL; + goto exit; + } - if (!bufu || count == 0) - return -EINVAL; + if (!bufu || count == 0) { + ret = -EINVAL; + goto exit; + } pdata = prvdata->platform_data; @@ -174,22 +186,32 @@ static ssize_t msm_rpm_rail_stats_file_read(struct file *file, *ppos = 0; } - return simple_read_from_buffer(bufu, count, ppos, + ret = simple_read_from_buffer(bufu, count, ppos, prvdata->buf, prvdata->len); +exit: + mutex_unlock(&msm_rpm_rail_stats_mutex); + return ret; } static int msm_rpm_rail_stats_file_open(struct inode *inode, struct file *file) { struct msm_rpm_rail_stats_private_data *prvdata; - struct msm_rpm_rail_stats_platform_data *pdata = inode->i_private; + struct msm_rpm_rail_stats_platform_data *pdata; + int ret = 0; + + mutex_lock(&msm_rpm_rail_stats_mutex); + pdata = inode->i_private; file->private_data = kzalloc(sizeof(struct msm_rpm_rail_stats_private_data), GFP_KERNEL); - if (!file->private_data) - return -ENOMEM; + if (!file->private_data) { + ret = -ENOMEM; + goto exit; + } + prvdata = file->private_data; prvdata->reg_base = ioremap(pdata->phys_addr_base, @@ -200,12 +222,15 @@ static int msm_rpm_rail_stats_file_open(struct inode *inode, pr_err("%s: ERROR could not ioremap start=%pa, len=%u\n", __func__, &pdata->phys_addr_base, pdata->phys_size); - return -EBUSY; + ret = -EBUSY; + goto exit; } prvdata->len = 0; prvdata->platform_data = pdata; - return 0; +exit: + mutex_unlock(&msm_rpm_rail_stats_mutex); + return ret; } diff --git a/drivers/soc/qcom/rpm_stats.c b/drivers/soc/qcom/rpm_stats.c index ec5f2303ffb03..70d6383837e0f 100644 --- a/drivers/soc/qcom/rpm_stats.c +++ b/drivers/soc/qcom/rpm_stats.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2015, 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 @@ -31,6 +31,8 @@ #define GET_PDATA_OF_ATTR(attr) \ (container_of(attr, struct msm_rpmstats_kobj_attr, ka)->pd) +static DEFINE_MUTEX(rpm_stats_mutex); + enum { ID_COUNTER, ID_ACCUM_TIME_SCLK, @@ -218,6 +220,12 @@ static int msm_rpmstats_copy_stats(struct msm_rpmstats_private_data *pdata) record.id = msm_rpmstats_read_register(pdata->reg_base, pdata->read_idx, 1); + if (record.id >= ID_MAX) { + pr_err("%s: array out of bound error found.\n", + __func__); + return -EINVAL; + } + record.val = msm_rpmstats_read_register(pdata->reg_base, pdata->read_idx, 2); @@ -240,13 +248,20 @@ static ssize_t msm_rpmstats_file_read(struct file *file, char __user *bufu, size_t count, loff_t *ppos) { struct msm_rpmstats_private_data *prvdata; + ssize_t ret; + + mutex_lock(&rpm_stats_mutex); prvdata = file->private_data; - if (!prvdata) - return -EINVAL; + if (!prvdata) { + ret = -EINVAL; + goto exit; + } - if (!bufu || count == 0) - return -EINVAL; + if (!bufu || count == 0) { + ret = -EINVAL; + goto exit; + } if (prvdata->platform_data->version == 1) { if (!prvdata->num_records) @@ -263,22 +278,30 @@ static ssize_t msm_rpmstats_file_read(struct file *file, char __user *bufu, *ppos = 0; } - return simple_read_from_buffer(bufu, count, ppos, + ret = simple_read_from_buffer(bufu, count, ppos, prvdata->buf, prvdata->len); +exit: + mutex_unlock(&rpm_stats_mutex); + return ret; } static int msm_rpmstats_file_open(struct inode *inode, struct file *file) { struct msm_rpmstats_private_data *prvdata; struct msm_rpmstats_platform_data *pdata; + int ret = 0; + mutex_lock(&rpm_stats_mutex); pdata = inode->i_private; file->private_data = kmalloc(sizeof(struct msm_rpmstats_private_data), GFP_KERNEL); - if (!file->private_data) - return -ENOMEM; + if (!file->private_data) { + ret = -ENOMEM; + goto exit; + } + prvdata = file->private_data; prvdata->reg_base = ioremap_nocache(pdata->phys_addr_base, @@ -289,24 +312,28 @@ static int msm_rpmstats_file_open(struct inode *inode, struct file *file) pr_err("%s: ERROR could not ioremap start=%pa, len=%u\n", __func__, &pdata->phys_addr_base, pdata->phys_size); - return -EBUSY; + ret = -EBUSY; + goto exit; } prvdata->read_idx = prvdata->num_records = prvdata->len = 0; prvdata->platform_data = pdata; if (pdata->version == 2) prvdata->num_records = 2; - - return 0; +exit: + mutex_unlock(&rpm_stats_mutex); + return ret; } static int msm_rpmstats_file_close(struct inode *inode, struct file *file) { struct msm_rpmstats_private_data *private = file->private_data; + mutex_lock(&rpm_stats_mutex); if (private->reg_base) iounmap(private->reg_base); kfree(file->private_data); + mutex_unlock(&rpm_stats_mutex); return 0; } @@ -362,22 +389,26 @@ static ssize_t rpmstats_show(struct kobject *kobj, { struct msm_rpmstats_private_data *prvdata = NULL; struct msm_rpmstats_platform_data *pdata = NULL; + ssize_t ret; + mutex_lock(&rpm_stats_mutex); pdata = GET_PDATA_OF_ATTR(attr); prvdata = kmalloc(sizeof(*prvdata), GFP_KERNEL); - if (!prvdata) - return -ENOMEM; + if (!prvdata) { + ret = -ENOMEM; + goto kmalloc_fail; + } prvdata->reg_base = ioremap_nocache(pdata->phys_addr_base, pdata->phys_size); if (!prvdata->reg_base) { - kfree(prvdata); pr_err("%s: ERROR could not ioremap start=%pa, len=%u\n", __func__, &pdata->phys_addr_base, pdata->phys_size); - return -EBUSY; + ret = -EBUSY; + goto ioremap_fail; } prvdata->read_idx = prvdata->num_records = prvdata->len = 0; @@ -399,23 +430,22 @@ static ssize_t rpmstats_show(struct kobject *kobj, prvdata); } - return snprintf(buf, prvdata->len, prvdata->buf); + ret = snprintf(buf, prvdata->len, prvdata->buf); + iounmap(prvdata->reg_base); +ioremap_fail: + kfree(prvdata); +kmalloc_fail: + mutex_unlock(&rpm_stats_mutex); + return ret; } static int msm_rpmstats_create_sysfs(struct msm_rpmstats_platform_data *pd) { - struct kobject *module_kobj = NULL; struct kobject *rpmstats_kobj = NULL; struct msm_rpmstats_kobj_attr *rpms_ka = NULL; int ret = 0; - module_kobj = kset_find_obj(module_kset, KBUILD_MODNAME); - if (!module_kobj) { - pr_err("%s: Cannot find module_kset\n", __func__); - return -ENODEV; - } - - rpmstats_kobj = kobject_create_and_add("rpmstats", module_kobj); + rpmstats_kobj = kobject_create_and_add("system_sleep", power_kobj); if (!rpmstats_kobj) { pr_err("%s: Cannot create rpmstats kobject\n", __func__); ret = -ENOMEM; diff --git a/drivers/soc/qcom/scm.c b/drivers/soc/qcom/scm.c index 16115619b9db5..045a5001fc9fb 100644 --- a/drivers/soc/qcom/scm.c +++ b/drivers/soc/qcom/scm.c @@ -56,9 +56,16 @@ DEFINE_MUTEX(scm_lmh_lock); #define SMC_ATOMIC_MASK 0x80000000 #define IS_CALL_AVAIL_CMD 1 -#define SCM_BUF_LEN(__cmd_size, __resp_size) \ - (sizeof(struct scm_command) + sizeof(struct scm_response) + \ - __cmd_size + __resp_size) +#define SCM_BUF_LEN(__cmd_size, __resp_size) ({ \ + size_t x = __cmd_size + __resp_size; \ + size_t y = sizeof(struct scm_command) + sizeof(struct scm_response); \ + size_t result; \ + if (x < __cmd_size || (x + y) < x) \ + result = 0; \ + else \ + result = x + y; \ + result; \ + }) /** * struct scm_command - one SCM command buffer * @len: total available memory for command and response @@ -357,8 +364,7 @@ int scm_call_noalloc(u32 svc_id, u32 cmd_id, const void *cmd_buf, int ret; size_t len = SCM_BUF_LEN(cmd_len, resp_len); - if (cmd_len > scm_buf_len || resp_len > scm_buf_len || - len > scm_buf_len) + if (len == 0) return -EINVAL; if (!IS_ALIGNED((unsigned long)scm_buf, PAGE_SIZE)) @@ -662,10 +668,6 @@ int scm_call2(u32 fn_id, struct scm_desc *desc) desc->ret[0] = desc->ret[1] = desc->ret[2] = 0; - pr_debug("scm_call: func id %#llx, args: %#x, %#llx, %#llx, %#llx, %#llx\n", - x0, desc->arginfo, desc->args[0], desc->args[1], - desc->args[2], desc->x5); - trace_scm_call_start(x0, desc); if (scm_version == SCM_ARMV8_64) @@ -695,10 +697,8 @@ int scm_call2(u32 fn_id, struct scm_desc *desc) } while (ret == SCM_V2_EBUSY && (retry_count++ < SCM_EBUSY_MAX_RETRY)); if (ret < 0) - pr_err("scm_call failed: func id %#llx, arginfo: %#x, args: %#llx, %#llx, %#llx, %#llx, ret: %d, syscall returns: %#llx, %#llx, %#llx\n", - x0, desc->arginfo, desc->args[0], desc->args[1], - desc->args[2], desc->x5, ret, desc->ret[0], - desc->ret[1], desc->ret[2]); + pr_err("scm_call failed: func id %#llx, ret: %d, syscall returns: %#llx, %#llx, %#llx\n", + x0, ret, desc->ret[0], desc->ret[1], desc->ret[2]); if (arglen > N_REGISTER_ARGS) kfree(desc->extra_arg_buf); @@ -783,7 +783,7 @@ int scm_call(u32 svc_id, u32 cmd_id, const void *cmd_buf, size_t cmd_len, int ret; size_t len = SCM_BUF_LEN(cmd_len, resp_len); - if (cmd_len > len || resp_len > len) + if (len == 0 || PAGE_ALIGN(len) < len) return -EINVAL; cmd = kzalloc(PAGE_ALIGN(len), GFP_KERNEL); diff --git a/drivers/soc/qcom/secboot_fuse.c b/drivers/soc/qcom/secboot_fuse.c new file mode 100644 index 0000000000000..badceec978208 --- /dev/null +++ b/drivers/soc/qcom/secboot_fuse.c @@ -0,0 +1,121 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define secboot_fuse_readl(drvdata, off) __raw_readl(drvdata->base + off) + +#define SECBOOT_FUSE (0x000) + +static uint32_t secboot_fuse; + +struct secboot_fuse_drvdata { + void __iomem *base; + struct device *dev; +}; + +static struct secboot_fuse_drvdata *secdrvdata; + +static int secboot_fuse_read(struct seq_file *m, void *v) +{ + struct secboot_fuse_drvdata *drvdata = secdrvdata; + + if (!drvdata) + return false; + + if (secboot_fuse == 0) + secboot_fuse = secboot_fuse_readl(drvdata, SECBOOT_FUSE); + + dev_dbg(drvdata->dev, "secboot register: %x\n", secboot_fuse); + + seq_printf(m, "0x%x\n", secboot_fuse); + + return 0; + +} + +static int secboot_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, secboot_fuse_read, NULL); +} + +static const struct file_operations secboot_fops = { + .open = secboot_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void secboot_fuse_create_proc(void) +{ + struct proc_dir_entry *entry; + entry = proc_create("secboot_fuse_reg", 0 /* default mode */, + NULL /* parent dir */, &secboot_fops); +} + +static int secboot_fuse_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct secboot_fuse_drvdata *drvdata; + struct resource *res; + + drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) + return -ENOMEM; + /* Store the driver data pointer for use in exported functions */ + secdrvdata = drvdata; + drvdata->dev = &pdev->dev; + platform_set_drvdata(pdev, drvdata); + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sec-boot-base"); + if (!res) + return -ENODEV; + + drvdata->base = devm_ioremap(dev, res->start, resource_size(res)); + if (!drvdata->base) + return -ENOMEM; + + secboot_fuse_create_proc(); + dev_info(dev, "Secboot-fuse interface initialized\n"); + return 0; +} + +static int secboot_fuse_remove(struct platform_device *pdev) +{ + return 0; +} + +static struct of_device_id secboot_fuse_match[] = { + {.compatible = "qcom,sec-boot-fuse"}, + {} +}; + +static struct platform_driver secboot_fuse_driver = { + .probe = secboot_fuse_probe, + .remove = secboot_fuse_remove, + .driver = { + .name = "msm-secboot-fuse", + .owner = THIS_MODULE, + .of_match_table = secboot_fuse_match, + }, +}; + +static int __init secboot_fuse_init(void) +{ + return platform_driver_register(&secboot_fuse_driver); +} +arch_initcall(secboot_fuse_init); + +static void __exit secboot_fuse_exit(void) +{ + platform_driver_unregister(&secboot_fuse_driver); +} +module_exit(secboot_fuse_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("JTag Fuse driver"); diff --git a/drivers/soc/qcom/serial_num.c b/drivers/soc/qcom/serial_num.c new file mode 100644 index 0000000000000..e0fca88ba6a12 --- /dev/null +++ b/drivers/soc/qcom/serial_num.c @@ -0,0 +1,121 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define sn_readl(drvdata, off) __raw_readl(drvdata->base + off) + +#define SERIAL_NUM (0x000) + +static uint32_t sn; + +struct sn_drvdata { + void __iomem *base; + struct device *dev; +}; + +static struct sn_drvdata *sndrvdata; + +static int sn_read(struct seq_file *m, void *v) +{ + struct sn_drvdata *drvdata = sndrvdata; + + if (!drvdata) + return false; + + if (sn == 0) + sn = sn_readl(drvdata, SERIAL_NUM); + + dev_dbg(drvdata->dev, "serial num: %x\n", sn); + + seq_printf(m, "0x%x\n", sn); + + return 0; + +} + +static int sn_proc_open(struct inode *inode, struct file *file) +{ + return single_open(file, sn_read, NULL); +} + +static const struct file_operations sn_fops = { + .open = sn_proc_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void sn_create_proc(void) +{ + struct proc_dir_entry *entry; + entry = proc_create("serial_num", 0 /* default mode */, + NULL /* parent dir */, &sn_fops); +} + +static int sn_fuse_probe(struct platform_device *pdev) +{ + struct device *dev = &pdev->dev; + struct sn_drvdata *drvdata; + struct resource *res; + + drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); + if (!drvdata) + return -ENOMEM; + /* Store the driver data pointer for use in exported functions */ + sndrvdata = drvdata; + drvdata->dev = &pdev->dev; + platform_set_drvdata(pdev, drvdata); + + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "sn-base"); + if (!res) + return -ENODEV; + + drvdata->base = devm_ioremap(dev, res->start, resource_size(res)); + if (!drvdata->base) + return -ENOMEM; + + sn_create_proc(); + dev_info(dev, "SN interface initialized\n"); + return 0; +} + +static int sn_fuse_remove(struct platform_device *pdev) +{ + return 0; +} + +static struct of_device_id sn_fuse_match[] = { + {.compatible = "qcom,sn-fuse"}, + {} +}; + +static struct platform_driver sn_fuse_driver = { + .probe = sn_fuse_probe, + .remove = sn_fuse_remove, + .driver = { + .name = "msm-sn-fuse", + .owner = THIS_MODULE, + .of_match_table = sn_fuse_match, + }, +}; + +static int __init sn_fuse_init(void) +{ + return platform_driver_register(&sn_fuse_driver); +} +arch_initcall(sn_fuse_init); + +static void __exit sn_fuse_exit(void) +{ + platform_driver_unregister(&sn_fuse_driver); +} +module_exit(sn_fuse_exit); + +MODULE_LICENSE("GPL v2"); +MODULE_DESCRIPTION("JTag Fuse driver"); diff --git a/drivers/soc/qcom/service-locator.c b/drivers/soc/qcom/service-locator.c index f6e7486bebf7c..d03621e27c8d3 100644 --- a/drivers/soc/qcom/service-locator.c +++ b/drivers/soc/qcom/service-locator.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -24,7 +24,6 @@ #include #include #include -#include #include #include @@ -68,48 +67,6 @@ struct pd_qmi_data { DEFINE_MUTEX(service_init_mutex); struct pd_qmi_data service_locator; -/* Please refer soc/qcom/service-locator.h for use about APIs defined here */ - -static ssize_t show_service_locator_status(struct class *cl, - struct class_attribute *attr, - char *buf) -{ - return scnprintf(buf, PAGE_SIZE, "%x\n", locator_status); -} - -static ssize_t store_service_locator_status(struct class *cl, - struct class_attribute *attr, - const char *buf, size_t size) -{ - u32 val; - - if (kstrtos32(buf, 10, &val) < 0) - goto err; - if (val != LOCATOR_NOT_PRESENT && val != LOCATOR_PRESENT) - goto err; - - mutex_lock(&service_init_mutex); - locator_status = val; - complete_all(&locator_status_known); - mutex_unlock(&service_init_mutex); - return size; -err: - pr_err("Invalid input parameters\n"); - return -EINVAL; -} - -static struct class_attribute service_locator_class_attr[] = { - __ATTR(service_locator_status, S_IRUGO | S_IWUSR, - show_service_locator_status, - store_service_locator_status), - __ATTR_NULL, -}; - -static struct class service_locator_class = { - .name = "service_locator", - .owner = THIS_MODULE, - .class_attrs = service_locator_class_attr, -}; static int service_locator_svc_event_notify(struct notifier_block *this, unsigned long code, @@ -245,8 +202,8 @@ static int servreg_loc_send_msg(struct msg_desc *req_desc, static int service_locator_send_msg(struct pd_qmi_client_data *pd) { struct msg_desc req_desc, resp_desc; - struct qmi_servreg_loc_get_domain_list_resp_msg_v01 *resp; - struct qmi_servreg_loc_get_domain_list_req_msg_v01 *req; + struct qmi_servreg_loc_get_domain_list_resp_msg_v01 *resp = NULL; + struct qmi_servreg_loc_get_domain_list_req_msg_v01 *req = NULL; int rc; int db_rev_count = 0, domains_read = 0; @@ -300,10 +257,11 @@ static int service_locator_send_msg(struct pd_qmi_client_data *pd) if (!domains_read) { db_rev_count = pd->db_rev_count = resp->db_rev_count; pd->total_domains = resp->total_domains; - if (!pd->total_domains && resp->domain_list_len) { - pr_err("total domains not set\n"); - pd->total_domains = resp->domain_list_len; + if (!resp->total_domains) { + pr_err("No matching domains found\n"); + goto out; } + pd->domain_list = kmalloc( sizeof(struct servreg_loc_entry_v01) * resp->total_domains, GFP_KERNEL); @@ -320,6 +278,10 @@ static int service_locator_send_msg(struct pd_qmi_client_data *pd) rc = -EAGAIN; goto out; } + if (resp->domain_list_len > resp->total_domains) { + /* Always read total_domains from the response msg */ + resp->domain_list_len = resp->total_domains; + } /* Copy the response*/ store_get_domain_list_response(pd, resp, domains_read); domains_read += resp->domain_list_len; @@ -450,82 +412,3 @@ int find_subsys(const char *pd_path, char *subsys) return 0; } EXPORT_SYMBOL(find_subsys); - -static struct pd_qmi_client_data test_data; - -static ssize_t show_servloc(struct seq_file *f, void *unused) -{ - int rc = 0, i = 0; - char subsys[QMI_SERVREG_LOC_NAME_LENGTH_V01]; - - rc = get_service_location(&test_data); - if (rc) { - seq_printf(f, "Failed to get process domain!, rc = %d\n", rc); - return -EIO; - } - - seq_printf(f, "Service Name: %s\tTotal Domains: %d\n", - test_data.service_name, test_data.total_domains); - for (i = 0; i < test_data.total_domains; i++) { - seq_printf(f, "Instance ID: %d\t ", - test_data.domain_list[i].instance_id); - seq_printf(f, "Domain Name: %s\n", - test_data.domain_list[i].name); - rc = find_subsys(test_data.domain_list[i].name, subsys); - if (rc < 0) - seq_printf(f, "No valid subsys found for %s!\n", - test_data.domain_list[i].name); - else - seq_printf(f, "Subsys: %s\n", subsys); - } - return 0; -} - -static ssize_t store_servloc(struct file *fp, const char __user *buf, - size_t count, loff_t *unused) -{ - if (!buf) - return -EIO; - snprintf(test_data.service_name, sizeof(test_data.service_name), - "%.*s", (int) min((size_t)count - 1, - (sizeof(test_data.service_name) - 1)), buf); - return count; -} - -static int servloc_open(struct inode *inode, struct file *file) -{ - return single_open(file, (void *)show_servloc, inode->i_private); -} - -static const struct file_operations servloc_fops = { - .open = servloc_open, - .read = seq_read, - .write = store_servloc, - .llseek = seq_lseek, - .release = seq_release, -}; - -static struct dentry *test_servloc_file; - -static int __init service_locator_init(void) -{ - if (!enable) - locator_status = LOCATOR_NOT_PRESENT; - - class_register(&service_locator_class); - test_servloc_file = debugfs_create_file("test_servloc", - S_IRUGO | S_IWUSR, NULL, NULL, - &servloc_fops); - if (!test_servloc_file) - pr_err("Could not create test_servloc debugfs entry!"); - return 0; -} - -static void __exit service_locator_exit(void) -{ - class_unregister(&service_locator_class); - debugfs_remove(test_servloc_file); -} - -module_init(service_locator_init); -module_exit(service_locator_exit); diff --git a/drivers/soc/qcom/service-notifier.c b/drivers/soc/qcom/service-notifier.c index fc0ea0cf0706d..c2a5442f4e129 100644 --- a/drivers/soc/qcom/service-notifier.c +++ b/drivers/soc/qcom/service-notifier.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015, 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 @@ -21,7 +21,6 @@ #include #include #include -#include #include #include @@ -662,179 +661,3 @@ int service_notif_unregister_notifier(void *service_notif_handle, &service_notif->service_notif_rcvr_list, nb); } EXPORT_SYMBOL(service_notif_unregister_notifier); - -struct service_notifier_test_data { - char service_path[MAX_STRING_LEN]; - int instance_id; - struct notifier_block nb; - void *service_notif_handle; -}; - -static struct service_notifier_test_data test_data; - -static void print_service_provider_state(int notification, char *type) -{ - if (notification == SERVREG_NOTIF_SERVICE_STATE_DOWN_V01) - pr_info("%s: Service %s down!\n", type, test_data.service_path); - else if (notification == SERVREG_NOTIF_SERVICE_STATE_UP_V01) - pr_info("%s: Service %s up!\n", type, test_data.service_path); - else if (notification == SERVREG_NOTIF_SERVICE_STATE_UNINIT_V01) - pr_info("%s: Service %s state uninit!\n", type, - test_data.service_path); - else - pr_info("%s: Service %s state Unknown 0x%x!\n", type, - test_data.service_path, notification); -} - -static int nb_callback(struct notifier_block *nb, - unsigned long notification, - void *data) -{ - print_service_provider_state((int)notification, "Notification:"); - return 0; -} - -static ssize_t show_service_path(struct seq_file *f, void *unused) -{ - if (test_data.service_notif_handle) - seq_printf(f, "Service Path: %s\n", test_data.service_path); - else - seq_puts(f, "No existing notifier\n"); - return 0; -} - - -static ssize_t set_service_notifier_register(struct file *fp, - const char __user *buf, - size_t count, loff_t *ppos) -{ - int curr_state = INT_MAX, rc; - - if (!buf) - return -EIO; - if (test_data.service_notif_handle) { - service_notif_unregister_notifier( - test_data.service_notif_handle, - &test_data.nb); - test_data.service_notif_handle = NULL; - pr_info("Unregistering existing notifier for %s\n", - test_data.service_path); - } - rc = simple_write_to_buffer(test_data.service_path, MAX_STRING_LEN, - ppos, buf, count - 1); - if (rc != count - 1) { - pr_err("Unable to read data into kernel buffer\n"); - goto err; - } - test_data.nb.notifier_call = nb_callback; - test_data.service_notif_handle = service_notif_register_notifier( - test_data.service_path, - test_data.instance_id, &test_data.nb, - &curr_state); - if (!IS_ERR(test_data.service_notif_handle)) { - pr_info("Notifier Registered for service %s\n", - test_data.service_path); - print_service_provider_state(curr_state, "Initial State"); - return count; - } -err: - test_data.service_notif_handle = NULL; - pr_err("Unable to register notifier for %s\n", test_data.service_path); - return -EIO; -} - -static int open_service_notifier_register(struct inode *inode, struct file *f) -{ - return single_open(f, (void *) show_service_path, - inode->i_private); -} - -static const struct file_operations service_notifier_register_fops = { - .open = open_service_notifier_register, - .read = seq_read, - .write = set_service_notifier_register, - .llseek = seq_lseek, - .release = seq_release, -}; - -static ssize_t show_service_notifier_id(struct seq_file *f, void *unused) -{ - seq_printf(f, "Service instance ID: %d\n", test_data.instance_id); - return 0; -} - -static ssize_t set_service_notifier_id(struct file *fp, - const char __user *buf, - size_t count, loff_t *unused) -{ - int val, rc; - char kbuf[MAX_STRING_LEN]; - - if (MAX_STRING_LEN < count) { - rc = -EIO; - goto err; - } - rc = copy_from_user(kbuf, buf, count); - if (rc != 0) { - rc = -EFAULT; - goto err; - } - - kbuf[count - 1] = '\0'; - rc = kstrtoint(kbuf, 0, &val); - if (rc < 0) - goto err; - - test_data.instance_id = val; - return count; -err: - pr_err("Invalid input parameters: rc = %d\n", rc); - return rc; -} - -static int open_service_notifier_id(struct inode *inode, struct file *f) -{ - return single_open(f, (void *) show_service_notifier_id, - inode->i_private); -} - -static const struct file_operations service_notifier_id_fops = { - .open = open_service_notifier_id, - .read = seq_read, - .write = set_service_notifier_id, - .llseek = seq_lseek, - .release = seq_release, -}; - -static struct dentry *service_notifier_dir; -static struct dentry *service_path_file; -static struct dentry *service_id_file; - -static int __init service_notifier_init(void) -{ - service_notifier_dir = debugfs_create_dir("service_notifier", NULL); - if (service_notifier_dir) { - service_path_file = debugfs_create_file("service_path", - S_IRUGO | S_IWUSR, service_notifier_dir, NULL, - &service_notifier_register_fops); - if (!service_path_file) - goto err; - service_id_file = debugfs_create_file("service_id", - S_IRUGO | S_IWUSR, service_notifier_dir, NULL, - &service_notifier_id_fops); - if (!service_id_file) - goto err; - } - return 0; -err: - debugfs_remove_recursive(service_notifier_dir); - return 0; -} - -static void __exit service_notifier_exit(void) -{ - debugfs_remove_recursive(service_notifier_dir); - test_data.nb.notifier_call = nb_callback; -} -module_init(service_notifier_init); -module_exit(service_notifier_exit); diff --git a/drivers/soc/qcom/smem.c b/drivers/soc/qcom/smem.c index 76018d84b9c95..ee0bade506d91 100644 --- a/drivers/soc/qcom/smem.c +++ b/drivers/soc/qcom/smem.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-2015,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 @@ -367,7 +367,7 @@ static void *__smem_get_entry_secure(unsigned id, uint32_t a_hdr_size; int rc; - SMEM_DBG("%s(%u, %u, %u, %u, %d, %d)\n", __func__, id, *size, to_proc, + SMEM_DBG("%s(%u, %u, %u, %d, %d)\n", __func__, id, to_proc, flags, skip_init_check, use_rspinlock); if (!skip_init_check && !smem_initialized_check()) @@ -788,7 +788,7 @@ EXPORT_SYMBOL(smem_alloc); void *smem_get_entry(unsigned id, unsigned *size, unsigned to_proc, unsigned flags) { - SMEM_DBG("%s(%u, %u, %u, %u)\n", __func__, id, *size, to_proc, flags); + SMEM_DBG("%s(%u, %u, %u)\n", __func__, id, to_proc, flags); /* * Handle the circular dependecy between SMEM and software implemented diff --git a/drivers/soc/qcom/smp2p.c b/drivers/soc/qcom/smp2p.c index fc5688b4bc8c7..79b8ffbc5ee7b 100644 --- a/drivers/soc/qcom/smp2p.c +++ b/drivers/soc/qcom/smp2p.c @@ -1,6 +1,6 @@ /* drivers/soc/qcom/smp2p.c * - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016, 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 @@ -519,8 +519,8 @@ static void smp2p_find_entry_v1(struct smp2p_smem __iomem *item, char entry_name[SMP2P_MAX_ENTRY_NAME]; if (!item || !name || !entry_ptr) { - SMP2P_ERR("%s: invalid arguments %p, %p, %p\n", - __func__, item, name, entry_ptr); + SMP2P_ERR("%s: invalid arguments %d %d %d\n", + __func__, !item, !name, !entry_ptr); return; } diff --git a/drivers/soc/qcom/smp2p_debug.c b/drivers/soc/qcom/smp2p_debug.c index 4deb05a081391..8d98d07c1adf4 100644 --- a/drivers/soc/qcom/smp2p_debug.c +++ b/drivers/soc/qcom/smp2p_debug.c @@ -1,6 +1,6 @@ /* drivers/soc/qcom/smp2p_debug.c * - * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014,2016 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 @@ -41,7 +41,7 @@ static void smp2p_int_stats(struct seq_file *s) pid != SMP2P_REMOTE_MOCK_PROC) continue; - seq_printf(s, "| %5s (%d) | %11u | %10u | %10u | %p | %08x |\n", + seq_printf(s, "| %5s (%d) | %11u | %10u | %10u | %pK | %08x |\n", int_cfg[pid].name, pid, int_cfg[pid].in_int_id, int_cfg[pid].in_interrupt_count, diff --git a/drivers/soc/qcom/smp2p_spinlock_test.c b/drivers/soc/qcom/smp2p_spinlock_test.c index 99b4558ef01f2..27ad4f4c5c643 100644 --- a/drivers/soc/qcom/smp2p_spinlock_test.c +++ b/drivers/soc/qcom/smp2p_spinlock_test.c @@ -1,6 +1,6 @@ /* drivers/soc/qcom/smp2p_spinlock_test.c * - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2015, 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 @@ -516,7 +516,7 @@ static void smp2p_ut_remote_spinlock_ssr(struct seq_file *s) int spinlock_owner = 0; struct workqueue_struct *ws = NULL; - struct rmt_spinlock_work_item work_item; + struct rmt_spinlock_work_item work_item = { .has_locked = false }; seq_printf(s, " Running %s Test\n", __func__); diff --git a/drivers/soc/qcom/smp2p_test_common.h b/drivers/soc/qcom/smp2p_test_common.h index 747a812d82c5a..3be519bc0c96f 100644 --- a/drivers/soc/qcom/smp2p_test_common.h +++ b/drivers/soc/qcom/smp2p_test_common.h @@ -1,6 +1,6 @@ /* drivers/soc/qcom/smp2p_test_common.h * - * Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2014,2016 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 @@ -49,7 +49,8 @@ void *a_tmp = (a); \ void *b_tmp = (b); \ if (!((a_tmp)cmp(b_tmp))) { \ - seq_printf(s, "%s:%d Fail: " #a "(%p) " #cmp " " #b "(%p)\n", \ + seq_printf(s, "%s:%d Fail: " #a "(%pK) " #cmp \ + " " #b "(%pK)\n", \ __func__, __LINE__, \ a_tmp, b_tmp); \ failed = 1; \ diff --git a/drivers/soc/qcom/socinfo.c b/drivers/soc/qcom/socinfo.c index 1ff591dbe1864..29ff385bf8a16 100644 --- a/drivers/soc/qcom/socinfo.c +++ b/drivers/soc/qcom/socinfo.c @@ -46,6 +46,7 @@ #define SMEM_IMAGE_VERSION_OEM_OFFSET 96 #define SMEM_IMAGE_VERSION_PARTITION_APPS 10 +static DECLARE_RWSEM(current_image_rwsem); enum { HW_PLATFORM_UNKNOWN = 0, HW_PLATFORM_SURF = 1, @@ -556,6 +557,9 @@ static struct msm_soc_info cpu_of_id[] = { [293] = {MSM_CPU_8953, "MSM8953"}, [304] = {MSM_CPU_8953, "APQ8053"}, + /* SDM450 ID */ + [338] = {MSM_CPU_SDM450, "SDM450"}, + /* 9607 IDs */ [290] = {MSM_CPU_9607, "MDM9607"}, [296] = {MSM_CPU_9607, "MDM8207"}, @@ -948,7 +952,9 @@ msm_get_image_version(struct device *dev, pr_err("Failed to get image version base address"); return snprintf(buf, SMEM_IMAGE_VERSION_NAME_SIZE, "Unknown"); } + down_read(¤t_image_rwsem); string_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); return snprintf(buf, SMEM_IMAGE_VERSION_NAME_SIZE, "%-.75s\n", string_address); } @@ -961,14 +967,19 @@ msm_set_image_version(struct device *dev, { char *store_address; - if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) + down_read(¤t_image_rwsem); + if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) { + up_read(¤t_image_rwsem); return count; + } store_address = socinfo_get_image_version_base_address(); if (IS_ERR_OR_NULL(store_address)) { pr_err("Failed to get image version base address"); + up_read(¤t_image_rwsem); return count; } store_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); snprintf(store_address, SMEM_IMAGE_VERSION_NAME_SIZE, "%-.75s", buf); return count; } @@ -986,7 +997,9 @@ msm_get_image_variant(struct device *dev, return snprintf(buf, SMEM_IMAGE_VERSION_VARIANT_SIZE, "Unknown"); } + down_read(¤t_image_rwsem); string_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); string_address += SMEM_IMAGE_VERSION_VARIANT_OFFSET; return snprintf(buf, SMEM_IMAGE_VERSION_VARIANT_SIZE, "%-.20s\n", string_address); @@ -1000,14 +1013,19 @@ msm_set_image_variant(struct device *dev, { char *store_address; - if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) + down_read(¤t_image_rwsem); + if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) { + up_read(¤t_image_rwsem); return count; + } store_address = socinfo_get_image_version_base_address(); if (IS_ERR_OR_NULL(store_address)) { pr_err("Failed to get image version base address"); + up_read(¤t_image_rwsem); return count; } store_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); store_address += SMEM_IMAGE_VERSION_VARIANT_OFFSET; snprintf(store_address, SMEM_IMAGE_VERSION_VARIANT_SIZE, "%-.20s", buf); return count; @@ -1025,7 +1043,9 @@ msm_get_image_crm_version(struct device *dev, pr_err("Failed to get image version base address"); return snprintf(buf, SMEM_IMAGE_VERSION_OEM_SIZE, "Unknown"); } + down_read(¤t_image_rwsem); string_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); string_address += SMEM_IMAGE_VERSION_OEM_OFFSET; return snprintf(buf, SMEM_IMAGE_VERSION_OEM_SIZE, "%-.32s\n", string_address); @@ -1039,14 +1059,19 @@ msm_set_image_crm_version(struct device *dev, { char *store_address; - if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) + down_read(¤t_image_rwsem); + if (current_image != SMEM_IMAGE_VERSION_PARTITION_APPS) { + up_read(¤t_image_rwsem); return count; + } store_address = socinfo_get_image_version_base_address(); if (IS_ERR_OR_NULL(store_address)) { pr_err("Failed to get image version base address"); + up_read(¤t_image_rwsem); return count; } store_address += current_image * SMEM_IMAGE_VERSION_SINGLE_BLOCK_SIZE; + up_read(¤t_image_rwsem); store_address += SMEM_IMAGE_VERSION_OEM_OFFSET; snprintf(store_address, SMEM_IMAGE_VERSION_OEM_SIZE, "%-.32s", buf); return count; @@ -1057,8 +1082,14 @@ msm_get_image_number(struct device *dev, struct device_attribute *attr, char *buf) { - return snprintf(buf, PAGE_SIZE, "%d\n", + int ret; + + down_read(¤t_image_rwsem); + ret = snprintf(buf, PAGE_SIZE, "%d\n", current_image); + up_read(¤t_image_rwsem); + return ret; + } static ssize_t @@ -1070,10 +1101,12 @@ msm_select_image(struct device *dev, struct device_attribute *attr, ret = kstrtoint(buf, 10, &digit); if (ret) return ret; + down_write(¤t_image_rwsem); if (0 <= digit && digit < SMEM_IMAGE_VERSION_BLOCKS_COUNT) current_image = digit; else current_image = 0; + up_write(¤t_image_rwsem); return count; } @@ -1255,6 +1288,10 @@ static void * __init setup_dummy_socinfo(void) dummy_socinfo.id = 293; strlcpy(dummy_socinfo.build_id, "msm8953 - ", sizeof(dummy_socinfo.build_id)); + } else if (early_machine_is_sdm450()) { + dummy_socinfo.id = 338; + strlcpy(dummy_socinfo.build_id, "sdm450 - ", + sizeof(dummy_socinfo.build_id)); } else if (early_machine_is_mdm9607()) { dummy_socinfo.id = 290; strlcpy(dummy_socinfo.build_id, "mdm9607 - ", diff --git a/drivers/soc/qcom/spcom.c b/drivers/soc/qcom/spcom.c deleted file mode 100644 index a5e17991f122e..0000000000000 --- a/drivers/soc/qcom/spcom.c +++ /dev/null @@ -1,2395 +0,0 @@ -/* - * Copyright (c) 2015-2016, 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. - */ - -/* - * Secure-Processor-Communication (SPCOM). - * - * This driver provides communication to Secure Processor (SP) - * over G-Link transport layer. - * - * It provides interface to both User Space spcomlib and kernel drivers. - * - * User Space App shall use spcomlib for communication with SP. - * User Space App can be either Client or Server. - * spcomlib shall use write() file operation to send data, - * and read() file operation to read data. - * - * This driver uses glink as the transport layer. - * This driver exposes "/dev/" file node for each glink - * logical channel. - * This driver exposes "/dev/spcom" file node for some debug/control command. - * The predefined channel "/dev/sp_kernel" is used for loading SP Application - * from HLOS. - * This driver exposes "/dev/sp_ssr" file node to allow user space poll for SSR. - * After the remote SP App is loaded, this driver exposes a new file node - * "/dev/" for the matching HLOS App to use. - * The access to predefined file node is restricted by using unix group - * and SELinux. - * - * No message routing is use, but using the G-Link "multiplexing" feature - * to use a dedicated logical channel for HLOS and SP Application-Pair. - * - * Each HLOS/SP Application can be either Client or Server or both, - * Messaging is allays point-to-point between 2 HLOS<=>SP applications. - * - * User Space Request & Response are synchronous. - * read() & write() operations are blocking until completed or terminated. - * - * This driver registers to G-Link callbacks to be aware on channel state. - * A notify callback is called upon channel connect/disconnect. - * - */ - -/* Uncomment the line below to test spcom against modem rather than SP */ -/* #define SPCOM_TEST_HLOS_WITH_MODEM 1 */ - -/* Uncomment the line below to enable debug messages */ -/* #define DEBUG 1 */ - -#define pr_fmt(fmt) "spcom [%s]: " fmt, __func__ - -#include /* min() */ -#include /* MODULE_LICENSE */ -#include /* class_create() */ -#include /* kzalloc() */ -#include /* file_operations */ -#include /* cdev_add() */ -#include /* EINVAL, ETIMEDOUT */ -#include /* pr_err() */ -#include /* BIT(x) */ -#include /* wait_for_completion_timeout() */ -#include /* POLLOUT */ -#include /* dma_alloc_coherent() */ -#include -#include /* of_property_count_strings() */ -#include -#include /* msleep() */ -#include /* msm_ion_client_create() */ - -#include -#include -#include - -#include - -#include "glink_private.h" /* glink_ssr() */ - -/* "SPCM" string */ -#define SPCOM_MAGIC_ID ((uint32_t)(0x5350434D)) - -/* Request/Response */ -#define SPCOM_FLAG_REQ BIT(0) -#define SPCOM_FLAG_RESP BIT(1) -#define SPCOM_FLAG_ENCODED BIT(2) -#define SPCOM_FLAG_NON_ENCODED BIT(3) - -/* SPCOM driver name */ -#define DEVICE_NAME "spcom" - -#define SPCOM_MAX_CHANNELS 20 - -/* Maximum command size */ -#define SPCOM_MAX_COMMAND_SIZE (PAGE_SIZE) - -/* Maximum input size */ -#define SPCOM_MAX_READ_SIZE (PAGE_SIZE) - -/* Current Process ID */ -#define current_pid() ((u32)(current->pid)) - -/* Maximum channel name size (including null) - matching GLINK_NAME_SIZE */ -#define MAX_CH_NAME_LEN 32 - -/* Connection negotiation timeout, if remote channel is open */ -#define OPEN_CHANNEL_TIMEOUT_MSEC 100 - -/* - * After both sides get CONNECTED, - * there is a race between once side queueing rx buffer and the other side - * trying to call glink_tx() , this race is only on the 1st tx. - * do tx retry with some delay to allow the other side to queue rx buffer. - */ -#define TX_RETRY_DELAY_MSEC 100 - -/* number of tx retries */ -#define TX_MAX_RETRY 3 - -/* SPCOM_MAX_REQUEST_SIZE-or-SPCOM_MAX_RESPONSE_SIZE + header */ -#define SPCOM_RX_BUF_SIZE 300 - -/* The SPSS RAM size is 256 KB so SP App must fit into it */ -#define SPCOM_MAX_APP_SIZE SZ_256K - -/* ACK timeout from remote side for TX data */ -#define TX_DONE_TIMEOUT_MSEC 100 - -/* - * Initial transaction id, use non-zero nonce for debug. - * Incremented by client on request, and copied back by server on response. - */ -#define INITIAL_TXN_ID 0x12345678 - -/** - * struct spcom_msg_hdr - Request/Response message header between HLOS and SP. - * - * This header is proceeding any request specific parameters. - * The transaction id is used to match request with response. - * Note: glink API provides the rx/tx data size, so user payload size is - * calculated by reducing the header size. - */ -struct spcom_msg_hdr { - uint32_t reserved; /* for future use */ - uint32_t txn_id; /* transaction id */ - char buf[0]; /* Variable buffer size, must be last field */ -} __packed; - -/** - * struct spcom_client - Client handle - */ -struct spcom_client { - struct spcom_channel *ch; -}; - -/** - * struct spcom_server - Server handle - */ -struct spcom_server { - struct spcom_channel *ch; -}; - -/** - * struct spcom_channel - channel context - */ -struct spcom_channel { - char name[MAX_CH_NAME_LEN]; - struct mutex lock; - void *glink_handle; - uint32_t txn_id; /* incrementing nonce per channel */ - bool is_server; /* for txn_id and response_timeout_msec */ - uint32_t response_timeout_msec; /* for client only */ - - /* char dev */ - struct cdev *cdev; - struct device *dev; - struct device_attribute attr; - - /* - * glink state: CONNECTED / LOCAL_DISCONNECTED, REMOTE_DISCONNECTED - */ - unsigned glink_state; - - /* Events notification */ - struct completion connect; - struct completion disconnect; - struct completion tx_done; - struct completion rx_done; - - /* - * Only one client or server per channel. - * Only one rx/tx transaction at a time (request + response). - */ - int ref_count; - u32 pid; - - /* link UP/DOWN callback */ - void (*notify_link_state_cb)(bool up); - - /* abort flags */ - bool rx_abort; - bool tx_abort; - - /* rx data info */ - int rx_buf_size; /* allocated rx buffer size */ - bool rx_buf_ready; - int actual_rx_size; /* actual data size received */ - const void *glink_rx_buf; - - /* ION lock/unlock support */ - int ion_fd_table[SPCOM_MAX_ION_BUF]; - struct ion_handle *ion_handle_table[SPCOM_MAX_ION_BUF]; -}; - -/** - * struct spcom_device - device state structure. - */ -struct spcom_device { - char predefined_ch_name[SPCOM_MAX_CHANNELS][MAX_CH_NAME_LEN]; - - /* char device info */ - struct cdev cdev; - dev_t device_no; - struct class *driver_class; - struct device *class_dev; - - /* G-Link channels */ - struct spcom_channel channels[SPCOM_MAX_CHANNELS]; - int channel_count; - - /* private */ - struct mutex lock; - - /* Link state */ - struct completion link_state_changed; - enum glink_link_state link_state; - - /* ION support */ - struct ion_client *ion_client; -}; - -#ifdef SPCOM_TEST_HLOS_WITH_MODEM - static const char *spcom_edge = "mpss"; - static const char *spcom_transport = "smem"; -#else - static const char *spcom_edge = "spss"; - static const char *spcom_transport = "mailbox"; -#endif - -/* Device Driver State */ -static struct spcom_device *spcom_dev; - -/* static functions declaration */ -static int spcom_create_channel_chardev(const char *name); -static int spcom_open(struct spcom_channel *ch, unsigned int timeout_msec); -static int spcom_close(struct spcom_channel *ch); - -/** - * spcom_is_ready() - driver is initialized and ready. - */ -static inline bool spcom_is_ready(void) -{ - return spcom_dev != NULL; -} - -/** - * spcom_is_channel_open() - channel is open on this side. - * - * Channel might not be fully connected if remote side didn't open the channel - * yet. - */ -static inline bool spcom_is_channel_open(struct spcom_channel *ch) -{ - return ch->glink_handle != NULL; -} - -/** - * spcom_is_channel_connected() - channel is fully connected by both sides. - */ -static inline bool spcom_is_channel_connected(struct spcom_channel *ch) -{ - return (ch->glink_state == GLINK_CONNECTED); -} - -/** - * spcom_create_predefined_channels_chardev() - expose predefined channels to - * user space. - * - * Predefined channels list is provided by device tree. - * Typically, it is for known servers on remote side that are not loaded by the - * HLOS. - */ -static int spcom_create_predefined_channels_chardev(void) -{ - int i; - int ret; - - for (i = 0; i < SPCOM_MAX_CHANNELS; i++) { - const char *name = spcom_dev->predefined_ch_name[i]; - - if (name[0] == 0) - break; - ret = spcom_create_channel_chardev(name); - if (ret) { - pr_err("failed to create chardev [%s], ret [%d].\n", - name, ret); - return -EFAULT; - } - } - - return 0; -} - -/*======================================================================*/ -/* GLINK CALLBACKS */ -/*======================================================================*/ - -/** - * spcom_link_state_notif_cb() - glink callback for link state change. - * - * glink notifies link layer is up, before any channel opened on remote side. - * Calling glink_open() locally allowed only after link is up. - * Notify link down, normally upon Remote Subsystem Reset (SSR). - * Note: upon SSR, glink will also notify each channel about remote disconnect, - * and abort any pending rx buffer. - */ -static void spcom_link_state_notif_cb(struct glink_link_state_cb_info *cb_info, - void *priv) -{ - spcom_dev->link_state = cb_info->link_state; - - pr_debug("spcom_link_state_notif_cb called. transport = %s edge = %s\n", - cb_info->transport, cb_info->edge); - - switch (cb_info->link_state) { - case GLINK_LINK_STATE_UP: - pr_debug("GLINK_LINK_STATE_UP.\n"); - spcom_create_predefined_channels_chardev(); - break; - case GLINK_LINK_STATE_DOWN: - pr_debug("GLINK_LINK_STATE_DOWN.\n"); - break; - default: - pr_err("unknown link_state [%d].\n", cb_info->link_state); - break; - } - complete_all(&spcom_dev->link_state_changed); -} - -/** - * spcom_notify_rx() - glink callback on receiving data. - * - * Glink notify rx data is ready. The glink internal rx buffer was - * allocated upon glink_queue_rx_intent(). - */ -static void spcom_notify_rx(void *handle, - const void *priv, const void *pkt_priv, - const void *buf, size_t size) -{ - struct spcom_channel *ch = (struct spcom_channel *) priv; - - if (!ch) { - pr_err("invalid ch parameter.\n"); - return; - } - - pr_debug("ch [%s] rx size [%d].\n", ch->name, (int) size); - - ch->actual_rx_size = (int) size; - ch->glink_rx_buf = (void *) buf; - - complete_all(&ch->rx_done); -} - -/** - * spcom_notify_tx_done() - glink callback on ACK sent data. - * - * after calling glink_tx() the remote side ACK receiving the data. - */ -static void spcom_notify_tx_done(void *handle, - const void *priv, const void *pkt_priv, - const void *buf) -{ - struct spcom_channel *ch = (struct spcom_channel *) priv; - int *tx_buf = (int *) buf; - - if (!ch) { - pr_err("invalid ch parameter.\n"); - return; - } - - pr_debug("ch [%s] buf[0] = [0x%x].\n", ch->name, tx_buf[0]); - - complete_all(&ch->tx_done); -} - -/** - * spcom_notify_state() - glink callback on channel connect/disconnect. - * - * Channel is fully CONNECTED after both sides opened the channel. - * Channel is LOCAL_DISCONNECTED after both sides closed the channel. - * If the remote side closed the channel, it is expected that the local side - * will also close the channel. - * Upon connection, rx buffer is allocated to receive data, - * the maximum transfer size is agreed by both sides. - */ -static void spcom_notify_state(void *handle, const void *priv, unsigned event) -{ - int ret; - struct spcom_channel *ch = (struct spcom_channel *) priv; - - switch (event) { - case GLINK_CONNECTED: - pr_debug("GLINK_CONNECTED, ch name [%s].\n", ch->name); - complete_all(&ch->connect); - - /* - * if spcom_notify_state() is called within glink_open() - * then ch->glink_handle is not updated yet. - */ - if (!ch->glink_handle) { - pr_debug("update glink_handle, ch [%s].\n", ch->name); - ch->glink_handle = handle; - } - - /* prepare default rx buffer after connected */ - ret = glink_queue_rx_intent(ch->glink_handle, - ch, ch->rx_buf_size); - if (ret) { - pr_err("glink_queue_rx_intent() err [%d]\n", ret); - } else { - pr_debug("rx buf is ready, size [%d].\n", - ch->rx_buf_size); - ch->rx_buf_ready = true; - } - break; - case GLINK_LOCAL_DISCONNECTED: - /* - * Channel state is GLINK_LOCAL_DISCONNECTED - * only after *both* sides closed the channel. - */ - pr_debug("GLINK_LOCAL_DISCONNECTED, ch [%s].\n", ch->name); - complete_all(&ch->disconnect); - break; - case GLINK_REMOTE_DISCONNECTED: - /* - * Remote side initiates glink_close(). - * This is not expected on normal operation. - * This may happen upon remote SSR. - */ - pr_debug("GLINK_REMOTE_DISCONNECTED, ch [%s].\n", ch->name); - /* - * after glink_close(), - * expecting notify GLINK_LOCAL_DISCONNECTED - */ - spcom_close(ch); - break; - default: - pr_err("unknown event id = %d, ch name [%s].\n", - (int) event, ch->name); - return; - } - - ch->glink_state = event; -} - -/** - * spcom_notify_rx_intent_req() - glink callback on intent request. - * - * glink allows the remote side to request for a local rx buffer if such - * buffer is not ready. - * However, for spcom simplicity on SP, and to reduce latency, we decided - * that glink_tx() on both side is not using INTENT_REQ flag, so this - * callback should not be called. - * Anyhow, return "false" to reject the request. - */ -static bool spcom_notify_rx_intent_req(void *handle, const void *priv, - size_t req_size) -{ - struct spcom_channel *ch = (struct spcom_channel *) priv; - - pr_err("Unexpected intent request for ch [%s].\n", ch->name); - - return false; -} - -/** - * spcom_notify_rx_abort() - glink callback on aborting rx pending buffer. - * - * Rx abort may happen if channel is closed by remote side, while rx buffer is - * pending in the queue. - */ -static void spcom_notify_rx_abort(void *handle, const void *priv, - const void *pkt_priv) -{ - struct spcom_channel *ch = (struct spcom_channel *) priv; - - pr_debug("ch [%s] pending rx aborted.\n", ch->name); - - if (spcom_is_channel_connected(ch)) { - ch->rx_abort = true; - complete_all(&ch->rx_done); - } -} - -/** - * spcom_notify_tx_abort() - glink callback on aborting tx data. - * - * This is probably not relevant, since glink_txv() is not used. - * Tx abort may happen if channel is closed by remote side, - * while multiple tx buffers are in a middle of tx operation. - */ -static void spcom_notify_tx_abort(void *handle, const void *priv, - const void *pkt_priv) -{ - struct spcom_channel *ch = (struct spcom_channel *) priv; - - pr_debug("ch [%s] pending tx aborted.\n", ch->name); - - if (spcom_is_channel_connected(ch)) { - complete_all(&ch->tx_done); - ch->tx_abort = true; - } -} - -/*======================================================================*/ -/* UTILITIES */ -/*======================================================================*/ - -/** - * spcom_init_open_config() - Fill glink_open() configuration parameters. - * - * @cfg: glink configuration struct pointer - * @name: channel name - * @priv: private caller data, provided back by callbacks, channel state. - * - * specify callbacks and other parameters for glink open channel. - */ -static void spcom_init_open_config(struct glink_open_config *cfg, - const char *name, void *priv) -{ - cfg->notify_rx = spcom_notify_rx; - cfg->notify_rxv = NULL; - cfg->notify_tx_done = spcom_notify_tx_done; - cfg->notify_state = spcom_notify_state; - cfg->notify_rx_intent_req = spcom_notify_rx_intent_req; - cfg->notify_rx_sigs = NULL; - cfg->notify_rx_abort = spcom_notify_rx_abort; - cfg->notify_tx_abort = spcom_notify_tx_abort; - - cfg->options = 0; /* not using GLINK_OPT_INITIAL_XPORT */ - cfg->priv = priv; /* provided back by callbacks */ - - cfg->name = name; - - cfg->transport = spcom_transport; - cfg->edge = spcom_edge; -} - -/** - * spcom_init_channel() - initialize channel state. - * - * @ch: channel state struct pointer - * @name: channel name - */ -static int spcom_init_channel(struct spcom_channel *ch, const char *name) -{ - if (!ch || !name || !name[0]) { - pr_err("invalid parameters.\n"); - return -EINVAL; - } - - strlcpy(ch->name, name, sizeof(ch->name)); - - init_completion(&ch->connect); - init_completion(&ch->disconnect); - init_completion(&ch->tx_done); - init_completion(&ch->rx_done); - - mutex_init(&ch->lock); - ch->glink_state = GLINK_LOCAL_DISCONNECTED; - ch->actual_rx_size = 0; - ch->rx_buf_size = SPCOM_RX_BUF_SIZE; - - return 0; -} - -/** - * spcom_find_channel_by_name() - find a channel by name. - * - * @name: channel name - * - * Return: a channel state struct. - */ -static struct spcom_channel *spcom_find_channel_by_name(const char *name) -{ - int i; - - for (i = 0 ; i < ARRAY_SIZE(spcom_dev->channels); i++) { - struct spcom_channel *ch = &spcom_dev->channels[i]; - - if (strcmp(ch->name, name) == 0) { - pr_debug("channel [%s] found.\n", name); - return ch; - } - } - - pr_err("failed to find channel [%s].\n", name); - - return NULL; -} - -/** - * spcom_open() - Open glink channel and wait for connection ACK. - * - * @ch: channel state struct pointer - * - * Normally, a local client opens a channel after remote server has opened - * the channel. - * A local server may open the channel before remote client is running. - */ -static int spcom_open(struct spcom_channel *ch, unsigned int timeout_msec) -{ - struct glink_open_config cfg = {0}; - unsigned long jiffies = msecs_to_jiffies(timeout_msec); - long timeleft; - const char *name; - void *handle; - - mutex_lock(&ch->lock); - name = ch->name; - - /* only one client/server may use the channel */ - if (ch->ref_count) { - pr_err("channel [%s] already in use.\n", name); - goto exit_err; - } - ch->ref_count++; - ch->pid = current_pid(); - ch->txn_id = INITIAL_TXN_ID; - - pr_debug("ch [%s] opened by PID [%d], count [%d]\n", - name, ch->pid, ch->ref_count); - - pr_debug("Open channel [%s] timeout_msec [%d].\n", name, timeout_msec); - - if (spcom_is_channel_open(ch)) { - pr_debug("channel [%s] already open.\n", name); - mutex_unlock(&ch->lock); - return 0; - } - - spcom_init_open_config(&cfg, name, ch); - - /* init completion before calling glink_open() */ - reinit_completion(&ch->connect); - - handle = glink_open(&cfg); - if (IS_ERR_OR_NULL(handle)) { - pr_err("glink_open failed.\n"); - goto exit_err; - } else { - pr_debug("glink_open [%s] ok.\n", name); - } - ch->glink_handle = handle; - - pr_debug("Wait for connection on channel [%s] timeout_msec [%d].\n", - name, timeout_msec); - - /* Wait for remote side to connect */ - if (timeout_msec) { - timeleft = wait_for_completion_timeout(&(ch->connect), jiffies); - if (timeleft == 0) - pr_debug("Channel [%s] is NOT connected.\n", name); - else - pr_debug("Channel [%s] fully connect.\n", name); - } else { - pr_debug("wait for connection ch [%s] no timeout.\n", name); - wait_for_completion(&(ch->connect)); - pr_debug("Channel [%s] opened, no timeout.\n", name); - } - - mutex_unlock(&ch->lock); - - return 0; -exit_err: - mutex_unlock(&ch->lock); - - return -EFAULT; -} - -/** - * spcom_close() - Close glink channel. - * - * @ch: channel state struct pointer - * - * A calling API functions should wait for disconnecting by both sides. - */ -static int spcom_close(struct spcom_channel *ch) -{ - int ret = 0; - - mutex_lock(&ch->lock); - - if (!spcom_is_channel_open(ch)) { - pr_err("ch already closed.\n"); - mutex_unlock(&ch->lock); - return 0; - } - - ret = glink_close(ch->glink_handle); - if (ret) - pr_err("glink_close() fail, ret [%d].\n", ret); - else - pr_debug("glink_close() ok.\n"); - - ch->glink_handle = NULL; - ch->ref_count = 0; - - ch->txn_id = INITIAL_TXN_ID; /* use non-zero nonce for debug */ - ch->pid = 0; - - pr_debug("Channel closed [%s].\n", ch->name); - mutex_unlock(&ch->lock); - - return 0; -} - -/** - * spcom_tx() - Send data and wait for ACK or timeout. - * - * @ch: channel state struct pointer - * @buf: buffer pointer - * @size: buffer size - * - * ACK is expected within a very short time (few msec). - */ -static int spcom_tx(struct spcom_channel *ch, - void *buf, - uint32_t size, - uint32_t timeout_msec) -{ - int ret; - void *pkt_priv = NULL; - uint32_t tx_flags = 0 ; /* don't use GLINK_TX_REQ_INTENT */ - unsigned long jiffies = msecs_to_jiffies(timeout_msec); - long timeleft; - int retry = 0; - - mutex_lock(&ch->lock); - - /* reset completion before calling glink */ - reinit_completion(&ch->tx_done); - - for (retry = 0; retry < TX_MAX_RETRY ; retry++) { - ret = glink_tx(ch->glink_handle, pkt_priv, buf, size, tx_flags); - if (ret == -EAGAIN) { - pr_err("glink_tx() fail, try again.\n"); - /* - * Delay to allow remote side to queue rx buffer. - * This may happen after the first channel connection. - */ - msleep(TX_RETRY_DELAY_MSEC); - } else if (ret < 0) { - pr_err("glink_tx() error %d.\n", ret); - goto exit_err; - } else { - break; /* no retry needed */ - } - } - - pr_debug("Wait for Tx done.\n"); - - /* Wait for Tx Completion */ - timeleft = wait_for_completion_timeout(&ch->tx_done, jiffies); - if (timeleft == 0) { - pr_err("tx_done timeout %d msec expired.\n", timeout_msec); - goto exit_err; - } else if (ch->tx_abort) { - pr_err("tx aborted.\n"); - goto exit_err; - } - - mutex_unlock(&ch->lock); - - return ret; -exit_err: - mutex_unlock(&ch->lock); - return -EFAULT; -} - -/** - * spcom_rx() - Wait for received data until timeout, unless pending rx data is - * already ready - * - * @ch: channel state struct pointer - * @buf: buffer pointer - * @size: buffer size - * - * ACK is expected within a very short time (few msec). - */ -static int spcom_rx(struct spcom_channel *ch, - void *buf, - uint32_t size, - uint32_t timeout_msec) -{ - int ret; - unsigned long jiffies = msecs_to_jiffies(timeout_msec); - long timeleft = 1; - - mutex_lock(&ch->lock); - - /* check for already pending data */ - if (ch->actual_rx_size) { - pr_debug("already pending data size [%d].\n", - ch->actual_rx_size); - goto copy_buf; - } - - /* reset completion before calling glink */ - reinit_completion(&ch->rx_done); - - /* Wait for Rx response */ - pr_debug("Wait for Rx done.\n"); - if (timeout_msec) - timeleft = wait_for_completion_timeout(&ch->rx_done, jiffies); - else - wait_for_completion(&ch->rx_done); - - if (timeleft == 0) { - pr_err("rx_done timeout [%d] msec expired.\n", timeout_msec); - goto exit_err; - } else if (ch->rx_abort) { - pr_err("rx aborted.\n"); - goto exit_err; - } else if (ch->actual_rx_size) { - pr_debug("actual_rx_size is [%d].\n", ch->actual_rx_size); - } else { - pr_err("actual_rx_size is zero.\n"); - goto exit_err; - } - - if (!ch->glink_rx_buf) { - pr_err("invalid glink_rx_buf.\n"); - goto exit_err; - } - -copy_buf: - /* Copy from glink buffer to spcom buffer */ - size = min_t(int, ch->actual_rx_size, size); - memcpy(buf, ch->glink_rx_buf, size); - - pr_debug("copy size [%d].\n", (int) size); - - /* free glink buffer after copy to spcom buffer */ - glink_rx_done(ch->glink_handle, ch->glink_rx_buf, false); - ch->glink_rx_buf = NULL; - ch->actual_rx_size = 0; - - /* queue rx buffer for the next time */ - ret = glink_queue_rx_intent(ch->glink_handle, ch, ch->rx_buf_size); - if (ret) { - pr_err("glink_queue_rx_intent() failed, ret [%d]", ret); - goto exit_err; - } else { - pr_debug("queue rx_buf, size [%d].\n", ch->rx_buf_size); - } - - mutex_unlock(&ch->lock); - - return size; -exit_err: - mutex_unlock(&ch->lock); - return -EFAULT; -} - -/** - * spcom_get_next_request_size() - get request size. - * already ready - * - * @ch: channel state struct pointer - * - * Server needs the size of the next request to allocate a request buffer. - * Initially used intent-request, however this complicated the remote side, - * so both sides are not using glink_tx() with INTENT_REQ anymore. - */ -static int spcom_get_next_request_size(struct spcom_channel *ch) -{ - int size = -1; - - /* NOTE: Remote clients might not be connected yet.*/ - mutex_lock(&ch->lock); - reinit_completion(&ch->rx_done); - - /* check if already got it via callback */ - if (ch->actual_rx_size) { - pr_debug("next-req-size already ready ch [%s] size [%d].\n", - ch->name, ch->actual_rx_size); - goto exit_ready; - } - - pr_debug("Wait for Rx Done, ch [%s].\n", ch->name); - wait_for_completion(&ch->rx_done); - if (ch->actual_rx_size <= 0) { - pr_err("invalid rx size [%d] ch [%s].\n", - ch->actual_rx_size, ch->name); - goto exit_error; - } - -exit_ready: - size = ch->actual_rx_size; - if (size > sizeof(struct spcom_msg_hdr)) { - size -= sizeof(struct spcom_msg_hdr); - } else { - pr_err("rx size [%d] too small.\n", size); - goto exit_error; - } - - mutex_unlock(&ch->lock); - return size; - -exit_error: - mutex_unlock(&ch->lock); - return -EFAULT; - - -} - -/*======================================================================*/ -/* Client API for kernel drivers */ -/*======================================================================*/ - -/** - * spcom_register_client() - register a client. - * - * @info: channel name and ssr callback. - * - * Return: client handle - */ -struct spcom_client *spcom_register_client(struct spcom_client_info *info) -{ - int ret; - const char *name; - struct spcom_channel *ch; - struct spcom_client *client; - - if (!info) { - pr_err("Invalid parameter.\n"); - return NULL; - } - name = info->ch_name; - - client = kzalloc(sizeof(*client), GFP_KERNEL); - if (!client) - return NULL; - - ch = spcom_find_channel_by_name(name); - if (!ch) { - pr_err("channel %s doesn't exist, load App first.\n", name); - return NULL; - } - - client->ch = ch; /* backtrack */ - - ret = spcom_open(ch, OPEN_CHANNEL_TIMEOUT_MSEC); - if (ret) { - pr_err("failed to open channel [%s].\n", name); - kfree(client); - client = NULL; - } else { - pr_info("remote side connect to channel [%s].\n", name); - } - - return client; -} -EXPORT_SYMBOL(spcom_register_client); - - -/** - * spcom_unregister_client() - unregister a client. - * - * @client: client handle - */ -int spcom_unregister_client(struct spcom_client *client) -{ - struct spcom_channel *ch; - - if (!client) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = client->ch; - - kfree(client); - - spcom_close(ch); - - return 0; -} -EXPORT_SYMBOL(spcom_unregister_client); - - -/** - * spcom_client_send_message_sync() - send request and wait for response. - * - * @client: client handle - * @req_ptr: request pointer - * @req_size: request size - * @resp_ptr: response pointer - * @resp_size: response size - * @timeout_msec: timeout waiting for response. - * - * The timeout depends on the specific request handling time at the remote side. - */ -int spcom_client_send_message_sync(struct spcom_client *client, - void *req_ptr, - uint32_t req_size, - void *resp_ptr, - uint32_t resp_size, - uint32_t timeout_msec) -{ - int ret; - struct spcom_channel *ch; - - if (!client || !req_ptr || !resp_ptr) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = client->ch; - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - ret = spcom_tx(ch, req_ptr, req_size, TX_DONE_TIMEOUT_MSEC); - if (ret < 0) { - pr_err("tx error %d.\n", ret); - return ret; - } - - ret = spcom_rx(ch, resp_ptr, resp_size, timeout_msec); - if (ret < 0) { - pr_err("rx error %d.\n", ret); - return ret; - } - - /* @todo verify response transaction id match the request */ - - return ret; -} -EXPORT_SYMBOL(spcom_client_send_message_sync); - - -/** - * spcom_client_is_server_connected() - is remote server connected. - * - * @client: client handle - */ -bool spcom_client_is_server_connected(struct spcom_client *client) -{ - bool connected; - - if (!client) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - connected = spcom_is_channel_connected(client->ch); - - return connected; -} -EXPORT_SYMBOL(spcom_client_is_server_connected); - -/*======================================================================*/ -/* Server API for kernel drivers */ -/*======================================================================*/ - -/** - * spcom_register_service() - register a server. - * - * @info: channel name and ssr callback. - * - * Return: server handle - */ -struct spcom_server *spcom_register_service(struct spcom_service_info *info) -{ - int ret; - const char *name; - struct spcom_channel *ch; - struct spcom_server *server; - - if (!info) { - pr_err("Invalid parameter.\n"); - return NULL; - } - name = info->ch_name; - - server = kzalloc(sizeof(*server), GFP_KERNEL); - if (!server) - return NULL; - - ch = spcom_find_channel_by_name(name); - if (!ch) { - pr_err("channel %s doesn't exist, load App first.\n", name); - return NULL; - } - - server->ch = ch; /* backtrack */ - - ret = spcom_open(ch, 0); - if (ret) { - pr_err("failed to open channel [%s].\n", name); - kfree(server); - server = NULL; - } - - return server; -} -EXPORT_SYMBOL(spcom_register_service); - -/** - * spcom_unregister_service() - unregister a server. - * - * @server: server handle - */ -int spcom_unregister_service(struct spcom_server *server) -{ - struct spcom_channel *ch; - - if (!server) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = server->ch; - - kfree(server); - - spcom_close(ch); - - return 0; -} -EXPORT_SYMBOL(spcom_unregister_service); - -/** - * spcom_server_get_next_request_size() - get request size. - * - * @server: server handle - * - * Return: request size in bytes. - */ -int spcom_server_get_next_request_size(struct spcom_server *server) -{ - int size; - struct spcom_channel *ch; - - if (!server) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = server->ch; - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - size = spcom_get_next_request_size(ch); - - pr_debug("next_request_size [%d].\n", size); - - return size; -} -EXPORT_SYMBOL(spcom_server_get_next_request_size); - -/** - * spcom_server_wait_for_request() - wait for request. - * - * @server: server handle - * @req_ptr: request buffer pointer - * @req_size: max request size - * - * Return: request size in bytes. - */ -int spcom_server_wait_for_request(struct spcom_server *server, - void *req_ptr, - uint32_t req_size) -{ - int ret; - struct spcom_channel *ch; - - if (!server || !req_ptr) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = server->ch; - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - ret = spcom_rx(ch, req_ptr, req_size, 0); - - return ret; -} -EXPORT_SYMBOL(spcom_server_wait_for_request); - -/** - * spcom_server_send_response() - Send response - * - * @server: server handle - * @resp_ptr: response buffer pointer - * @resp_size: response size - */ -int spcom_server_send_response(struct spcom_server *server, - void *resp_ptr, - uint32_t resp_size) -{ - int ret; - struct spcom_channel *ch; - - if (!server || !resp_ptr) { - pr_err("Invalid parameter.\n"); - return -EINVAL; - } - - ch = server->ch; - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - ret = spcom_tx(ch, resp_ptr, resp_size, TX_DONE_TIMEOUT_MSEC); - - return ret; -} -EXPORT_SYMBOL(spcom_server_send_response); - -/*======================================================================*/ -/* USER SPACE commands handling */ -/*======================================================================*/ - -/** - * spcom_handle_create_channel_command() - Handle Create Channel command from - * user space. - * - * @cmd_buf: command buffer. - * @cmd_size: command buffer size. - * - * Return: 0 on successful operation, negative value otherwise. - */ -static int spcom_handle_create_channel_command(void *cmd_buf, int cmd_size) -{ - int ret = 0; - struct spcom_user_create_channel_command *cmd = cmd_buf; - const char *ch_name; - - if (cmd_size != sizeof(*cmd)) { - pr_err("cmd_size [%d] , expected [%d].\n", - (int) cmd_size, (int) sizeof(*cmd)); - return -EINVAL; - } - - ch_name = cmd->ch_name; - - pr_debug("ch_name [%s].\n", ch_name); - - ret = spcom_create_channel_chardev(ch_name); - - return ret; -} - -/** - * spcom_handle_send_command() - Handle send request/response from user space. - * - * @buf: command buffer. - * @buf_size: command buffer size. - * - * Return: 0 on successful operation, negative value otherwise. - */ -static int spcom_handle_send_command(struct spcom_channel *ch, - void *cmd_buf, int size) -{ - int ret = 0; - struct spcom_send_command *cmd = cmd_buf; - uint32_t buf_size; - void *buf; - struct spcom_msg_hdr *hdr; - void *tx_buf; - int tx_buf_size; - uint32_t timeout_msec; - - pr_debug("send req/resp ch [%s] size [%d] .\n", ch->name, size); - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - /* parse command buffer */ - buf = &cmd->buf; - buf_size = cmd->buf_size; - timeout_msec = cmd->timeout_msec; - - /* Allocate Buffers*/ - tx_buf_size = sizeof(*hdr) + buf_size; - tx_buf = kzalloc(tx_buf_size, GFP_KERNEL); - if (!tx_buf) - return -ENOMEM; - - /* Prepare Tx Buf */ - hdr = tx_buf; - - /* Header */ - hdr->txn_id = ch->txn_id; - if (!ch->is_server) { - ch->txn_id++; /* client sets the request txn_id */ - ch->response_timeout_msec = timeout_msec; - } - - /* user buf */ - memcpy(hdr->buf, buf, buf_size); - - /* - * remote side should have rx buffer ready. - * tx_done is expected to be received quickly. - */ - ret = spcom_tx(ch, tx_buf, tx_buf_size, TX_DONE_TIMEOUT_MSEC); - if (ret < 0) - pr_err("tx error %d.\n", ret); - - kfree(tx_buf); - - return ret; -} - -/** - * modify_ion_addr() - replace the ION buffer virtual address with physical - * address in a request or response buffer. - * - * @buf: buffer to modify - * @buf_size: buffer size - * @ion_info: ION buffer info such as FD and offset in buffer. - * - * Return: 0 on successful operation, negative value otherwise. - */ -static int modify_ion_addr(void *buf, - uint32_t buf_size, - struct spcom_ion_info ion_info) -{ - struct ion_handle *handle = NULL; - ion_phys_addr_t ion_phys_addr; - size_t len; - int fd; - uint32_t buf_offset; - uint64_t *addr; - int ret; - - fd = ion_info.fd; - buf_offset = ion_info.buf_offset; - - if (fd < 0) { - pr_err("invalid fd [%d].\n", fd); - return -ENODEV; - } - - if (buf_offset > buf_size - sizeof(uint64_t)) { - pr_err("invalid buf_offset [%d].\n", buf_offset); - return -ENODEV; - } - - /* Get ION handle from fd */ - handle = ion_import_dma_buf(spcom_dev->ion_client, fd); - if (handle == NULL) { - pr_err("fail to get ion handle.\n"); - return -EINVAL; - } - pr_debug("ion handle ok.\n"); - - /* Get the ION buffer Physical Address */ - ret = ion_phys(spcom_dev->ion_client, handle, &ion_phys_addr, &len); - if (ret < 0) { - pr_err("fail to get ion phys addr.\n"); - ion_free(spcom_dev->ion_client, handle); - return -EINVAL; - } - pr_debug("buf_offset [%d].\n", buf_offset); - addr = (uint64_t *) ((char *) buf + buf_offset); - - /* Replace the user ION Virtual Address with the Physical Address */ - pr_debug("ion user vaddr = [0x%lx].\n", (long int) *addr); - *addr = (uint64_t) ion_phys_addr; - pr_debug("ion phys addr = [0x%lx].\n", (long int) *addr); - - /* Release the ION handle */ - ion_free(spcom_dev->ion_client, handle); - - return 0; -} - -/** - * spcom_handle_send_modified_command() - send a request/response with ION - * buffer address. Modify the request/response by replacing the ION buffer - * virtual address with the physical address. - * - * @ch: channel pointer - * @cmd_buf: User space command buffer - * @size: size of user command buffer - * - * Return: 0 on successful operation, negative value otherwise. - */ -static int spcom_handle_send_modified_command(struct spcom_channel *ch, - void *cmd_buf, int size) -{ - int ret = 0; - struct spcom_user_send_modified_command *cmd = cmd_buf; - uint32_t buf_size; - void *buf; - struct spcom_msg_hdr *hdr; - void *tx_buf; - int tx_buf_size; - uint32_t timeout_msec; - struct spcom_ion_info ion_info[SPCOM_MAX_ION_BUF]; - int i; - - pr_debug("send req/resp ch [%s] size [%d] .\n", ch->name, size); - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - /* parse command buffer */ - buf = &cmd->buf; - buf_size = cmd->buf_size; - timeout_msec = cmd->timeout_msec; - memcpy(ion_info, cmd->ion_info, sizeof(ion_info)); - - /* Allocate Buffers*/ - tx_buf_size = sizeof(*hdr) + buf_size; - tx_buf = kzalloc(tx_buf_size, GFP_KERNEL); - if (!tx_buf) - return -ENOMEM; - - /* Prepare Tx Buf */ - hdr = tx_buf; - - /* Header */ - hdr->txn_id = ch->txn_id; - if (!ch->is_server) { - ch->txn_id++; /* client sets the request txn_id */ - ch->response_timeout_msec = timeout_msec; - } - - /* user buf */ - memcpy(hdr->buf, buf, buf_size); - - for (i = 0 ; i < SPCOM_MAX_ION_BUF ; i++) { - if (ion_info[i].fd >= 0) { - ret = modify_ion_addr(hdr->buf, buf_size, ion_info[i]); - if (ret < 0) { - pr_err("modify_ion_addr() error [%d].\n", ret); - kfree(tx_buf); - return -EFAULT; - } - } - } - - /* - * remote side should have rx buffer ready. - * tx_done is expected to be received quickly. - */ - ret = spcom_tx(ch, tx_buf, tx_buf_size, TX_DONE_TIMEOUT_MSEC); - if (ret < 0) - pr_err("tx error %d.\n", ret); - - kfree(tx_buf); - - return ret; -} - - -/** - * spcom_handle_lock_ion_buf_command() - Lock an ION buffer. - * - * Lock an ION buffer, prevent it from being free if the user space App crash, - * while it is used by the remote subsystem. - */ -static int spcom_handle_lock_ion_buf_command(struct spcom_channel *ch, - void *cmd_buf, int size) -{ - struct spcom_user_command *cmd = cmd_buf; - int fd = cmd->arg; - struct ion_handle *ion_handle; - int i; - - /* Check ION client */ - if (spcom_dev->ion_client == NULL) { - pr_err("invalid ion client.\n"); - return -ENODEV; - } - - /* Check if this FD is already locked */ - for (i = 0 ; i < SPCOM_MAX_ION_BUF ; i++) - if (ch->ion_fd_table[i] == fd) { - pr_debug("fd [%d] is already locked.\n", fd); - return -EINVAL; - } - - /* Get ION handle from fd - this increments the ref count */ - ion_handle = ion_import_dma_buf(spcom_dev->ion_client, fd); - if (ion_handle == NULL) { - pr_err("fail to get ion handle.\n"); - return -EINVAL; - } - pr_debug("ion handle ok.\n"); - - for (i = 0 ; i < SPCOM_MAX_ION_BUF ; i++) { - if (ch->ion_handle_table[i] == NULL) { - ch->ion_handle_table[i] = ion_handle; - ch->ion_fd_table[i] = fd; - pr_debug("locked ion buf#[%d], fd [%d].\n", i, fd); - return 0; - } - } - - return -EFAULT; -} - -/** - * spcom_handle_unlock_ion_buf_command() - Unlock an ION buffer. - * - * Unlock an ION buffer, let it be free, when it is no longer being used by - * the remote subsystem. - */ -static int spcom_handle_unlock_ion_buf_command(struct spcom_channel *ch, - void *cmd_buf, int size) -{ - struct spcom_user_command *cmd = cmd_buf; - int fd = cmd->arg; - struct ion_client *ion_client = spcom_dev->ion_client; - int i; - - /* Check ION client */ - if (ion_client == NULL) { - pr_err("fail to create ion client.\n"); - return -ENODEV; - } - - if (fd == (int) SPCOM_ION_FD_UNLOCK_ALL) { - /* unlock all ION buf */ - for (i = 0 ; i < SPCOM_MAX_ION_BUF ; i++) { - if (ch->ion_handle_table[i] != NULL) { - ion_free(ion_client, ch->ion_handle_table[i]); - ch->ion_handle_table[i] = NULL; - ch->ion_fd_table[i] = -1; - pr_debug("unlocked ion buf#[%d].\n", i); - } - } - } else { - /* unlock specific ION buf */ - for (i = 0 ; i < SPCOM_MAX_ION_BUF ; i++) { - if (ch->ion_fd_table[i] == fd) { - ion_free(ion_client, ch->ion_handle_table[i]); - ch->ion_handle_table[i] = NULL; - ch->ion_fd_table[i] = -1; - pr_debug("unlocked ion buf#[%d].\n", i); - break; - } - } - } - - return 0; -} - -/** - * spcom_handle_fake_ssr_command() - Handle fake ssr command from user space. - */ -static int spcom_handle_fake_ssr_command(struct spcom_channel *ch, int arg) -{ - pr_debug("Start Fake glink SSR subsystem [%s].\n", spcom_edge); - glink_ssr(spcom_edge); - pr_debug("Fake glink SSR subsystem [%s] done.\n", spcom_edge); - - return 0; -} - -/** - * spcom_handle_write() - Handle user space write commands. - * - * @buf: command buffer. - * @buf_size: command buffer size. - * - * Return: 0 on successful operation, negative value otherwise. - */ -static int spcom_handle_write(struct spcom_channel *ch, - void *buf, - int buf_size) -{ - int ret = 0; - struct spcom_user_command *cmd = NULL; - int cmd_id = 0; - int swap_id; - char cmd_name[5] = {0}; /* debug only */ - - /* opcode field is the minimum length of cmd */ - if (buf_size < sizeof(cmd->cmd_id)) { - pr_err("Invalid argument user buffer size %d.\n", buf_size); - return -EINVAL; - } - - cmd = (struct spcom_user_command *)buf; - cmd_id = (int) cmd->cmd_id; - swap_id = htonl(cmd->cmd_id); - memcpy(cmd_name, &swap_id, sizeof(int)); - - pr_debug("cmd_id [0x%x] cmd_name [%s].\n", cmd_id, cmd_name); - - switch (cmd_id) { - case SPCOM_CMD_SEND: - ret = spcom_handle_send_command(ch, buf, buf_size); - break; - case SPCOM_CMD_SEND_MODIFIED: - ret = spcom_handle_send_modified_command(ch, buf, buf_size); - break; - case SPCOM_CMD_LOCK_ION_BUF: - ret = spcom_handle_lock_ion_buf_command(ch, buf, buf_size); - break; - case SPCOM_CMD_UNLOCK_ION_BUF: - ret = spcom_handle_unlock_ion_buf_command(ch, buf, buf_size); - break; - case SPCOM_CMD_FSSR: - ret = spcom_handle_fake_ssr_command(ch, cmd->arg); - break; - case SPCOM_CMD_CREATE_CHANNEL: - ret = spcom_handle_create_channel_command(buf, buf_size); - break; - default: - pr_err("Invalid Command Id [0x%x].\n", (int) cmd->cmd_id); - return -EINVAL; - } - - return ret; -} - -/** - * spcom_handle_get_req_size() - Handle user space get request size command - * - * @ch: channel handle - * @buf: command buffer. - * @size: command buffer size. - * - * Return: size in bytes. - */ -static int spcom_handle_get_req_size(struct spcom_channel *ch, - void *buf, - uint32_t size) -{ - uint32_t next_req_size = 0; - - if (size < sizeof(next_req_size)) { - pr_err("buf size [%d] too small.\n", (int) size); - return -EINVAL; - } - - next_req_size = spcom_get_next_request_size(ch); - - memcpy(buf, &next_req_size, sizeof(next_req_size)); - pr_debug("next_req_size [%d].\n", next_req_size); - - return sizeof(next_req_size); /* can't exceed user buffer size */ -} - -/** - * spcom_handle_read_req_resp() - Handle user space get request/response command - * - * @ch: channel handle - * @buf: command buffer. - * @size: command buffer size. - * - * Return: size in bytes. - */ -static int spcom_handle_read_req_resp(struct spcom_channel *ch, - void *buf, - uint32_t size) -{ - int ret; - struct spcom_msg_hdr *hdr; - void *rx_buf; - int rx_buf_size; - uint32_t timeout_msec = 0; /* client only */ - - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - - /* Allocate Buffers*/ - rx_buf_size = sizeof(*hdr) + size; - rx_buf = kzalloc(rx_buf_size, GFP_KERNEL); - if (!rx_buf) - return -ENOMEM; - - /* - * client response timeout depends on the request - * handling time on the remote side . - */ - if (!ch->is_server) { - timeout_msec = ch->response_timeout_msec; - pr_debug("response_timeout_msec = %d.\n", (int) timeout_msec); - } - - ret = spcom_rx(ch, rx_buf, rx_buf_size, timeout_msec); - if (ret < 0) { - pr_err("rx error %d.\n", ret); - goto exit_err; - } else { - size = ret; /* actual_rx_size */ - } - - hdr = rx_buf; - - if (ch->is_server) { - ch->txn_id = hdr->txn_id; - pr_err("request txn_id [0x%x].\n", ch->txn_id); - } - - /* copy data to user without the header */ - if (size > sizeof(*hdr)) { - size -= sizeof(*hdr); - memcpy(buf, hdr->buf, size); - } else { - pr_err("rx size [%d] too small.\n", size); - goto exit_err; - } - - kfree(rx_buf); - return size; -exit_err: - kfree(rx_buf); - return -EFAULT; - -} - -/** - * spcom_handle_read() - Handle user space read request/response or - * request-size command - * - * @ch: channel handle - * @buf: command buffer. - * @size: command buffer size. - * - * A special size SPCOM_GET_NEXT_REQUEST_SIZE, which is bigger than the max - * response/request tells the kernel that user space only need the size. - * - * Return: size in bytes. - */ -static int spcom_handle_read(struct spcom_channel *ch, - void *buf, - uint32_t size) -{ - if (size == SPCOM_GET_NEXT_REQUEST_SIZE) { - pr_debug("get next request size, ch [%s].\n", ch->name); - size = spcom_handle_get_req_size(ch, buf, size); - ch->is_server = true; - } else { - pr_debug("get request/response, ch [%s].\n", ch->name); - size = spcom_handle_read_req_resp(ch, buf, size); - } - - pr_debug("ch [%s] , size = %d.\n", ch->name, size); - - return size; -} - -/*======================================================================*/ -/* CHAR DEVICE USER SPACE INTERFACE */ -/*======================================================================*/ - -/** - * file_to_filename() - get the filename from file pointer. - * - * @filp: file pointer - * - * it is used for debug prints. - * - * Return: filename string or "unknown". - */ -static char *file_to_filename(struct file *filp) -{ - struct dentry *dentry = NULL; - char *filename = NULL; - - if (!filp || !filp->f_path.dentry) - return "unknown"; - - dentry = filp->f_path.dentry; - filename = dentry->d_iname; - - return filename; -} - -/** - * spcom_device_open() - handle channel file open() from user space. - * - * @filp: file pointer - * - * The file name (without path) is the channel name. - * Open the relevant glink channel. - * Store the channel context in the file private - * date pointer for future read/write/close - * operations. - */ -static int spcom_device_open(struct inode *inode, struct file *filp) -{ - int ret = 0; - struct spcom_channel *ch; - const char *name = file_to_filename(filp); - - pr_debug("Open file [%s].\n", name); - - if (strcmp(name, DEVICE_NAME) == 0) { - pr_debug("root dir skipped.\n"); - return 0; - } - - if (strcmp(name, "sp_ssr") == 0) { - pr_debug("sp_ssr dev node skipped.\n"); - return 0; - } - - ch = spcom_find_channel_by_name(name); - if (!ch) { - pr_err("channel %s doesn't exist, load App first.\n", name); - return -ENODEV; - } - - filp->private_data = ch; - - ret = spcom_open(ch, OPEN_CHANNEL_TIMEOUT_MSEC); - if (ret == -ETIMEDOUT) { - pr_err("Connection timeout channel [%s].\n", name); - } else if (ret) { - pr_err("failed to open channel [%s] , err=%d.\n", name, ret); - return ret; - } - - pr_debug("finished.\n"); - - return 0; -} - -/** - * spcom_device_release() - handle channel file close() from user space. - * - * @filp: file pointer - * - * The file name (without path) is the channel name. - * Open the relevant glink channel. - * Store the channel context in the file private - * date pointer for future read/write/close - * operations. - */ -static int spcom_device_release(struct inode *inode, struct file *filp) -{ - struct spcom_channel *ch; - const char *name = file_to_filename(filp); - bool connected = false; - - pr_debug("Close file [%s].\n", name); - - ch = filp->private_data; - - if (!ch) { - pr_err("ch is NULL, file name %s.\n", file_to_filename(filp)); - return -ENODEV; - } - - /* channel might be already closed or disconnected */ - if (spcom_is_channel_open(ch) && spcom_is_channel_connected(ch)) - connected = true; - - reinit_completion(&ch->disconnect); - - spcom_close(ch); - - if (connected) { - pr_debug("Wait for event GLINK_LOCAL_DISCONNECTED, ch [%s].\n", - name); - wait_for_completion(&ch->disconnect); - pr_debug("GLINK_LOCAL_DISCONNECTED signaled, ch [%s].\n", name); - } - - return 0; -} - -/** - * spcom_device_write() - handle channel file write() from user space. - * - * @filp: file pointer - * - * Return: On Success - same size as number of bytes to write. - * On Failure - negative value. - */ -static ssize_t spcom_device_write(struct file *filp, - const char __user *user_buff, - size_t size, loff_t *f_pos) -{ - int ret; - char *buf; - struct spcom_channel *ch; - const char *name = file_to_filename(filp); - - pr_debug("Write file [%s] size [%d] pos [%d].\n", - name, (int) size, (int) *f_pos); - - if (!user_buff || !f_pos || !filp) { - pr_err("invalid null parameters.\n"); - return -EINVAL; - } - - ch = filp->private_data; - if (!ch) { - pr_debug("invalid ch pointer.\n"); - /* Allow some special commands via /dev/spcom and /dev/sp_ssr */ - } else { - /* Check if remote side connect */ - if (!spcom_is_channel_connected(ch)) { - pr_err("ch [%s] remote side not connect.\n", ch->name); - return -ENOTCONN; - } - } - - if (size > SPCOM_MAX_COMMAND_SIZE) { - pr_err("size [%d] > max size [%d].\n", - (int) size , (int) SPCOM_MAX_COMMAND_SIZE); - return -EINVAL; - } - - if (*f_pos != 0) { - pr_err("offset should be zero, no sparse buffer.\n"); - return -EINVAL; - } - - buf = kzalloc(size, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - - ret = copy_from_user(buf, user_buff, size); - if (ret) { - pr_err("Unable to copy from user (err %d).\n", ret); - kfree(buf); - return -EFAULT; - } - - ret = spcom_handle_write(ch, buf, size); - if (ret) { - pr_err("handle command error [%d].\n", ret); - kfree(buf); - return -EFAULT; - } - - kfree(buf); - - return size; -} - -/** - * spcom_device_read() - handle channel file write() from user space. - * - * @filp: file pointer - * - * Return: number of bytes to read on success, negative value on - * failure. - */ -static ssize_t spcom_device_read(struct file *filp, char __user *user_buff, - size_t size, loff_t *f_pos) -{ - int ret = 0; - int actual_size = 0; - char *buf; - struct spcom_channel *ch; - const char *name = file_to_filename(filp); - - pr_debug("Read file [%s], size = %d bytes.\n", name, (int) size); - - if (!filp || !user_buff || !f_pos || - (size == 0) || (size > SPCOM_MAX_READ_SIZE)) { - pr_err("invalid parameters.\n"); - return -EINVAL; - } - - ch = filp->private_data; - - buf = kzalloc(size, GFP_KERNEL); - if (buf == NULL) - return -ENOMEM; - - actual_size = spcom_handle_read(ch, buf, size); - - ret = copy_to_user(user_buff, buf, actual_size); - - if (ret) { - pr_err("Unable to copy to user, err = %d.\n", ret); - kfree(buf); - return -EFAULT; - } - - kfree(buf); - - pr_debug("ch [%s] ret [%d].\n", name, (int) actual_size); - - return actual_size; -} - -/** - * spcom_device_poll() - handle channel file poll() from user space. - * - * @filp: file pointer - * - * This allows user space to wait/check for channel connection, - * or wait for SSR event. - * - * Return: event bitmask on success, set POLLERR on failure. - */ -static unsigned int spcom_device_poll(struct file *filp, - struct poll_table_struct *poll_table) -{ - /* - * when user call with timeout -1 for blocking mode, - * any bit must be set in response - */ - unsigned int ret = SPCOM_POLL_READY_FLAG; - unsigned long mask; - struct spcom_channel *ch; - const char *name = file_to_filename(filp); - bool wait = false; - bool done = false; - /* Event types always implicitly polled for */ - unsigned long reserved = POLLERR | POLLHUP | POLLNVAL; - int ready = 0; - - ch = filp->private_data; - - mask = poll_requested_events(poll_table); - - pr_debug("== ch [%s] mask [0x%x] ==.\n", name, (int) mask); - - /* user space API has poll use "short" and not "long" */ - mask &= 0x0000FFFF; - - wait = mask & SPCOM_POLL_WAIT_FLAG; - if (wait) - pr_debug("ch [%s] wait for event flag is ON.\n", name); - mask &= ~SPCOM_POLL_WAIT_FLAG; /* clear the wait flag */ - mask &= ~SPCOM_POLL_READY_FLAG; /* clear the ready flag */ - mask &= ~reserved; /* clear the implicitly set reserved bits */ - - switch (mask) { - case SPCOM_POLL_LINK_STATE: - pr_debug("ch [%s] SPCOM_POLL_LINK_STATE.\n", name); - if (wait) { - reinit_completion(&spcom_dev->link_state_changed); - ready = wait_for_completion_interruptible( - &spcom_dev->link_state_changed); - pr_debug("ch [%s] poll LINK_STATE signaled.\n", name); - } - done = (spcom_dev->link_state == GLINK_LINK_STATE_UP); - break; - case SPCOM_POLL_CH_CONNECT: - pr_debug("ch [%s] SPCOM_POLL_CH_CONNECT.\n", name); - if (wait) { - reinit_completion(&ch->connect); - ready = wait_for_completion_interruptible(&ch->connect); - pr_debug("ch [%s] poll CH_CONNECT signaled.\n", name); - } - done = completion_done(&ch->connect); - break; - default: - pr_err("ch [%s] poll, invalid mask [0x%x].\n", - name, (int) mask); - ret = POLLERR; - break; - } - - if (ready < 0) { /* wait was interrupted */ - pr_err("ch [%s] poll interrupted, ret [%d].\n", name, ready); - ret = POLLERR | SPCOM_POLL_READY_FLAG | mask; - } - if (done) - ret |= mask; - - pr_debug("ch [%s] poll, mask = 0x%x, ret=0x%x.\n", - name, (int) mask, ret); - - return ret; -} - -/* file operation supported from user space */ -static const struct file_operations fops = { - .owner = THIS_MODULE, - .read = spcom_device_read, - .poll = spcom_device_poll, - .write = spcom_device_write, - .open = spcom_device_open, - .release = spcom_device_release, -}; - -/** - * spcom_create_channel_chardev() - Create a channel char-dev node file - * for user space interface - */ -static int spcom_create_channel_chardev(const char *name) -{ - int ret; - struct device *dev; - struct spcom_channel *ch; - dev_t devt; - struct class *cls = spcom_dev->driver_class; - struct device *parent = spcom_dev->class_dev; - void *priv; - struct cdev *cdev; - - pr_debug("Add channel [%s].\n", name); - - ch = spcom_find_channel_by_name(name); - if (ch) { - pr_err("channel [%s] already exist.\n", name); - return -EINVAL; - } - - ch = spcom_find_channel_by_name(""); /* find reserved channel */ - if (!ch) { - pr_err("no free channel.\n"); - return -ENODEV; - } - - cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); - if (!cdev) - return -ENOMEM; - - spcom_dev->channel_count++; - devt = spcom_dev->device_no + spcom_dev->channel_count; - priv = ch; - dev = device_create(cls, parent, devt, priv, name); - if (!dev) { - pr_err("device_create failed.\n"); - kfree(cdev); - return -ENODEV; - } - - cdev_init(cdev, &fops); - cdev->owner = THIS_MODULE; - - ret = cdev_add(cdev, devt, 1); - if (ret < 0) { - pr_err("cdev_add failed %d\n", ret); - goto exit_destroy_device; - } - - spcom_init_channel(ch, name); - - ch->cdev = cdev; - ch->dev = dev; - - return 0; - -exit_destroy_device: - device_destroy(spcom_dev->driver_class, devt); - kfree(cdev); - return -EFAULT; -} - -static int __init spcom_register_chardev(void) -{ - int ret; - unsigned baseminor = 0; - unsigned count = 1; - void *priv = spcom_dev; - - ret = alloc_chrdev_region(&spcom_dev->device_no, baseminor, count, - DEVICE_NAME); - if (ret < 0) { - pr_err("alloc_chrdev_region failed %d\n", ret); - return ret; - } - - spcom_dev->driver_class = class_create(THIS_MODULE, DEVICE_NAME); - if (IS_ERR(spcom_dev->driver_class)) { - ret = -ENOMEM; - pr_err("class_create failed %d\n", ret); - goto exit_unreg_chrdev_region; - } - - spcom_dev->class_dev = device_create(spcom_dev->driver_class, NULL, - spcom_dev->device_no, priv, - DEVICE_NAME); - - if (!spcom_dev->class_dev) { - pr_err("class_device_create failed %d\n", ret); - ret = -ENOMEM; - goto exit_destroy_class; - } - - cdev_init(&spcom_dev->cdev, &fops); - spcom_dev->cdev.owner = THIS_MODULE; - - ret = cdev_add(&spcom_dev->cdev, - MKDEV(MAJOR(spcom_dev->device_no), 0), - SPCOM_MAX_CHANNELS); - if (ret < 0) { - pr_err("cdev_add failed %d\n", ret); - goto exit_destroy_device; - } - - pr_info("char device created.\n"); - - return 0; - -exit_destroy_device: - device_destroy(spcom_dev->driver_class, spcom_dev->device_no); -exit_destroy_class: - class_destroy(spcom_dev->driver_class); -exit_unreg_chrdev_region: - unregister_chrdev_region(spcom_dev->device_no, 1); - return ret; -} - -static void spcom_unregister_chrdev(void) -{ - cdev_del(&spcom_dev->cdev); - device_destroy(spcom_dev->driver_class, spcom_dev->device_no); - class_destroy(spcom_dev->driver_class); - unregister_chrdev_region(spcom_dev->device_no, 1); - -} - -/*======================================================================*/ -/* Device Tree */ -/*======================================================================*/ - -static int spcom_parse_dt(struct device_node *np) -{ - int ret; - const char *propname = "qcom,spcom-ch-names"; - int num_ch = of_property_count_strings(np, propname); - int i; - const char *name; - - pr_debug("num of predefined channels [%d].\n", num_ch); - - for (i = 0; i < num_ch; i++) { - ret = of_property_read_string_index(np, propname, i, &name); - if (ret) { - pr_err("failed to read DT channel [%d] name .\n", i); - return -EFAULT; - } - strlcpy(spcom_dev->predefined_ch_name[i], - name, - sizeof(spcom_dev->predefined_ch_name[i])); - - pr_debug("found ch [%s].\n", name); - } - - return num_ch; -} - -static int spcom_probe(struct platform_device *pdev) -{ - int ret; - struct spcom_device *dev = NULL; - struct glink_link_info link_info; - struct device_node *np; - struct link_state_notifier_info *notif_handle; - - if (!pdev) { - pr_err("invalid pdev.\n"); - return -ENODEV; - } - - np = pdev->dev.of_node; - if (!np) { - pr_err("invalid DT node.\n"); - return -EINVAL; - } - - dev = kzalloc(sizeof(*dev), GFP_KERNEL); - if (dev == NULL) - return -ENOMEM; - - spcom_dev = dev; - mutex_init(&dev->lock); - init_completion(&dev->link_state_changed); - spcom_dev->link_state = GLINK_LINK_STATE_DOWN; - - ret = spcom_register_chardev(); - if (ret) { - pr_err("create character device failed.\n"); - goto fail_reg_chardev; - } - - link_info.glink_link_state_notif_cb = spcom_link_state_notif_cb; - link_info.transport = spcom_transport; - link_info.edge = spcom_edge; - - ret = spcom_parse_dt(np); - if (ret < 0) - goto fail_reg_chardev; - - /* - * Register for glink link up/down notification. - * glink channels can't be opened before link is up. - */ - pr_debug("register_link_state_cb(), transport [%s] edge [%s]\n", - link_info.transport, link_info.edge); - notif_handle = glink_register_link_state_cb(&link_info, spcom_dev); - if (!notif_handle) { - pr_err("glink_register_link_state_cb(), err [%d]\n", ret); - goto fail_reg_chardev; - } - - spcom_dev->ion_client = msm_ion_client_create(DEVICE_NAME); - if (spcom_dev->ion_client == NULL) { - pr_err("fail to create ion client.\n"); - goto fail_reg_chardev; - } - - pr_info("Driver Initialization ok.\n"); - - return 0; - -fail_reg_chardev: - pr_err("Failed to init driver.\n"); - spcom_unregister_chrdev(); - kfree(dev); - spcom_dev = NULL; - - return -ENODEV; -} - -static const struct of_device_id spcom_match_table[] = { - { .compatible = "qcom,spcom", }, - { }, -}; - -static struct platform_driver spcom_driver = { - .probe = spcom_probe, - .driver = { - .name = DEVICE_NAME, - .owner = THIS_MODULE, - .of_match_table = of_match_ptr(spcom_match_table), - }, -}; - -/*======================================================================*/ -/* Driver Init/Exit */ -/*======================================================================*/ - -static int __init spcom_init(void) -{ - int ret; - - pr_info("spcom driver Ver 1.0 23-Nov-2015.\n"); - - ret = platform_driver_register(&spcom_driver); - if (ret) - pr_err("spcom_driver register failed %d\n", ret); - - return 0; -} -module_init(spcom_init); - -MODULE_LICENSE("GPL v2"); -MODULE_DESCRIPTION("Secure Processor Communication"); diff --git a/drivers/soc/qcom/subsys-pil-tz.c b/drivers/soc/qcom/subsys-pil-tz.c index f98cfbc8d9478..c8d6150494879 100644 --- a/drivers/soc/qcom/subsys-pil-tz.c +++ b/drivers/soc/qcom/subsys-pil-tz.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -613,6 +614,10 @@ static int pil_init_image_trusted(struct pil_desc *pil, return -ENOMEM; } + /* Make sure there are no mappings in PKMAP and fixmap */ + kmap_flush_unused(); + kmap_atomic_flush_unused(); + memcpy(mdata_buf, metadata, size); request.proc = d->pas_id; @@ -995,6 +1000,7 @@ static int pil_tz_driver_probe(struct platform_device *pdev) d->desc.ops = &pil_ops_trusted; d->desc.proxy_timeout = PROXY_TIMEOUT_MS; + d->desc.clear_fw_region = true; rc = of_property_read_u32(pdev->dev.of_node, "qcom,proxy-timeout-ms", &proxy_timeout); diff --git a/drivers/soc/qcom/subsystem_notif.c b/drivers/soc/qcom/subsystem_notif.c index 431bbd8cee6f9..8b24008b5abec 100644 --- a/drivers/soc/qcom/subsystem_notif.c +++ b/drivers/soc/qcom/subsystem_notif.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011, 2013, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011, 2013, 2016 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 @@ -196,7 +196,7 @@ static int subsys_notifier_test_call(struct notifier_block *this, switch (code) { default: - printk(KERN_WARNING "%s: Notification %s from subsystem %p\n", + pr_warn("%s: Notification %s from subsystem %pK\n", __func__, notif_to_string(code), data); break; @@ -212,7 +212,7 @@ static struct notifier_block nb = { static void subsys_notif_reg_test_notifier(const char *subsys_name) { void *handle = subsys_notif_register_notifier(subsys_name, &nb); - printk(KERN_WARNING "%s: Registered test notifier, handle=%p", + pr_warn("%s: Registered test notifier, handle=%pK", __func__, handle); } #endif diff --git a/drivers/soc/qcom/subsystem_restart.c b/drivers/soc/qcom/subsystem_restart.c index 5fc22ce2ca40d..f1ad238d30674 100644 --- a/drivers/soc/qcom/subsystem_restart.c +++ b/drivers/soc/qcom/subsystem_restart.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-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 @@ -353,10 +353,11 @@ static struct device_attribute subsys_attrs[] = { __ATTR_NULL, }; -static struct bus_type subsys_bus_type = { +struct bus_type subsys_bus_type = { .name = "msm_subsys", .dev_attrs = subsys_attrs, }; +EXPORT_SYMBOL(subsys_bus_type); static DEFINE_IDA(subsys_ida); @@ -407,6 +408,23 @@ module_param(max_restarts, int, 0644); static long max_history_time = 3600; module_param(max_history_time, long, 0644); +#ifdef WT_COMPILE_FACTORY_VERSION +static int adsp_crash_num = 0; +module_param(adsp_crash_num, int, 0644); + +static int modem_crash_num = 0; +module_param(modem_crash_num, int, 0644); + +static int venus_crash_num = 0; +module_param(venus_crash_num, int, 0644); + +static int wcnss_crash_num = 0; +module_param(wcnss_crash_num, int, 0644); + +static int a506_zap_crash_num = 0; +module_param(a506_zap_crash_num, int, 0644); +#endif + static void do_epoch_check(struct subsys_device *dev) { int n = 0; @@ -599,10 +617,11 @@ static void subsystem_shutdown(struct subsys_device *dev, void *data) { const char *name = dev->desc->name; - pr_info("[%p]: Shutting down %s\n", current, name); + pr_info("[%s:%d]: Shutting down %s\n", + current->comm, current->pid, name); if (dev->desc->shutdown(dev->desc, true) < 0) - panic("subsys-restart: [%p]: Failed to shutdown %s!", - current, name); + panic("subsys-restart: [%s:%d]: Failed to shutdown %s!", + current->comm, current->pid, name); dev->crash_count++; subsys_set_state(dev, SUBSYS_OFFLINE); disable_all_irqs(dev); @@ -614,7 +633,8 @@ static void subsystem_ramdump(struct subsys_device *dev, void *data) if (dev->desc->ramdump) if (dev->desc->ramdump(is_ramdump_enabled(dev), dev->desc) < 0) - pr_warn("%s[%p]: Ramdump failed.\n", name, current); + pr_warn("%s[%s:%d]: Ramdump failed.\n", + name, current->comm, current->pid); dev->do_ramdump_on_put = false; } @@ -629,13 +649,14 @@ static void subsystem_powerup(struct subsys_device *dev, void *data) const char *name = dev->desc->name; int ret; - pr_info("[%p]: Powering up %s\n", current, name); + pr_info("[%s:%d]: Powering up %s\n", current->comm, current->pid, name); init_completion(&dev->err_ready); if (dev->desc->powerup(dev->desc) < 0) { notify_each_subsys_device(&dev, 1, SUBSYS_POWERUP_FAILURE, NULL); - panic("[%p]: Powerup error: %s!", current, name); + panic("[%s:%d]: Powerup error: %s!", + current->comm, current->pid, name); } enable_all_irqs(dev); @@ -643,8 +664,8 @@ static void subsystem_powerup(struct subsys_device *dev, void *data) if (ret) { notify_each_subsys_device(&dev, 1, SUBSYS_POWERUP_FAILURE, NULL); - panic("[%p]: Timed out waiting for error ready: %s!", - current, name); + panic("[%s:%d]: Timed out waiting for error ready: %s!", + current->comm, current->pid, name); } subsys_set_state(dev, SUBSYS_ONLINE); subsys_set_crash_status(dev, false); @@ -931,8 +952,8 @@ static void subsystem_restart_wq_func(struct work_struct *work) */ mutex_lock(&soc_order_reg_lock); - pr_debug("[%p]: Starting restart sequence for %s\n", current, - desc->name); + pr_debug("[%s:%d]: Starting restart sequence for %s\n", + current->comm, current->pid, desc->name); notify_each_subsys_device(list, count, SUBSYS_BEFORE_SHUTDOWN, NULL); for_each_subsys_device(list, count, NULL, subsystem_shutdown); notify_each_subsys_device(list, count, SUBSYS_AFTER_SHUTDOWN, NULL); @@ -953,8 +974,8 @@ static void subsystem_restart_wq_func(struct work_struct *work) for_each_subsys_device(list, count, NULL, subsystem_powerup); notify_each_subsys_device(list, count, SUBSYS_AFTER_POWERUP, NULL); - pr_info("[%p]: Restart sequence for %s completed.\n", - current, desc->name); + pr_info("[%s:%d]: Restart sequence for %s completed.\n", + current->comm, current->pid, desc->name); mutex_unlock(&soc_order_reg_lock); mutex_unlock(&track->lock); @@ -1036,11 +1057,25 @@ int subsystem_restart_dev(struct subsys_device *dev) return -EBUSY; } +#ifdef WT_COMPILE_FACTORY_VERSION + if (!strcmp(name, "adsp")) + adsp_crash_num++; + if (!strcmp(name, "modem")) + modem_crash_num++; + if(!strcmp(name, "venus")) + venus_crash_num++; + if (!strcmp(name, "wcnss")) + wcnss_crash_num++; + if (!strcmp(name, "a506_zap")) + a506_zap_crash_num++; +#endif + pr_info("Restart sequence requested for %s, restart_level = %s.\n", name, restart_levels[dev->restart_level]); - if (WARN(disable_restart_work == DISABLE_SSR, - "subsys-restart: Ignoring restart request for %s.\n", name)) { + if (disable_restart_work == DISABLE_SSR) { + pr_warn("subsys-restart: Ignoring restart request for %s.\n", + name); return 0; } @@ -1639,7 +1674,11 @@ struct subsys_device *subsys_register(struct subsys_desc *desc) subsys->desc->sysmon_pid = -1; strlcpy(subsys->desc->fw_name, desc->name, sizeof(subsys->desc->fw_name)); - +#ifdef WT_FINAL_RELEASE + subsys->restart_level = RESET_SUBSYS_COUPLED; +#else + subsys->restart_level = RESET_SOC; +#endif subsys->notify = subsys_notif_add_subsys(desc->name); snprintf(subsys->wlname, sizeof(subsys->wlname), "ssr(%s)", desc->name); diff --git a/drivers/soc/qcom/sysmon.c b/drivers/soc/qcom/sysmon.c index 8a12341a6f912..b43da8c82a737 100644 --- a/drivers/soc/qcom/sysmon.c +++ b/drivers/soc/qcom/sysmon.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2014, The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016, 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 @@ -206,7 +206,7 @@ int sysmon_send_shutdown_no_qmi(struct subsys_desc *dest_desc) return -ENODEV; mutex_lock(&ss->lock); - ret = sysmon_send_msg(ss, tx_buf, ARRAY_SIZE(tx_buf)); + ret = sysmon_send_msg(ss, tx_buf, strlen(tx_buf)); if (ret) { pr_err("Message sending failed %d\n", ret); goto out; @@ -257,7 +257,7 @@ int sysmon_get_reason_no_qmi(struct subsys_desc *dest_desc, return -ENODEV; mutex_lock(&ss->lock); - ret = sysmon_send_msg(ss, tx_buf, ARRAY_SIZE(tx_buf)); + ret = sysmon_send_msg(ss, tx_buf, strlen(tx_buf)); if (ret) { pr_err("Message sending failed %d\n", ret); goto out; diff --git a/drivers/soc/qcom/watchdog_v2.c b/drivers/soc/qcom/watchdog_v2.c index d97ddd5fd2f31..de22502d9528d 100644 --- a/drivers/soc/qcom/watchdog_v2.c +++ b/drivers/soc/qcom/watchdog_v2.c @@ -104,6 +104,23 @@ module_param(WDT_HZ, long, 0); static int ipi_opt_en; module_param(ipi_opt_en, int, 0); +#ifdef CONFIG_FIRE_WATCHDOG +static int wdog_fire; +static int wdog_fire_set(const char *val, struct kernel_param *kp); +module_param_call(wdog_fire, wdog_fire_set, param_get_int, + &wdog_fire, 0644); + +static int wdog_fire_set(const char *val, struct kernel_param *kp) +{ + printk(KERN_INFO "trigger wdog_fire_set\n"); + local_irq_disable(); + while (1) + ; + + return 0; +} +#endif + static void dump_cpu_alive_mask(struct msm_watchdog_data *wdog_dd) { static char alive_mask_buf[MASK_SIZE]; @@ -168,6 +185,11 @@ static int panic_wdog_handler(struct notifier_block *this, wdog_dd->base + WDT0_BITE_TIME); __raw_writel(1, wdog_dd->base + WDT0_RST); } +#ifdef CONFIG_DUMP_ALL_STACKS + /* Suspend wdog until all stacks are printed */ + printk(KERN_INFO "D Status stack trace dump:\n"); + show_state_filter(TASK_UNINTERRUPTIBLE); +#endif return NOTIFY_DONE; } diff --git a/drivers/soundwire/swr-wcd-ctrl.c b/drivers/soundwire/swr-wcd-ctrl.c index 9a78a76b16936..357fc962019b4 100644 --- a/drivers/soundwire/swr-wcd-ctrl.c +++ b/drivers/soundwire/swr-wcd-ctrl.c @@ -61,6 +61,10 @@ struct usecase uc[] = { {6, 14, 6600}, /* UC11: 2*(Spkr + Comp + SB) */ {2, 3, 2700}, /* UC12: Spkr + SB */ {4, 6, 5400}, /* UC13: 2*(Spkr + SB) */ + {3, 5, 3900}, /* UC14: Spkr + SB + VI */ + {6, 10, 7800}, /* UC15: 2*(Spkr + SB + VI) */ + {2, 3, 3600}, /* UC16: Spkr + VI */ + {4, 6, 7200}, /* UC17: 2*(Spkr + VI) */ }; #define MAX_USECASE ARRAY_SIZE(uc) @@ -148,6 +152,33 @@ struct port_params pp[MAX_USECASE][SWR_MSTR_PORT_LEN] = { {7, 6, 0}, {63, 13, 31}, }, + /* UC 14 */ + { + {7, 1, 0}, + {63, 12, 31}, + {15, 7, 0}, + }, + /* UC 15 */ + { + {7, 1, 0}, + {63, 12, 31}, + {15, 7, 0}, + {7, 6, 0}, + {63, 13, 31}, + {15, 10, 0}, + }, + /* UC 16 */ + { + {7, 1, 0}, + {15, 7, 0}, + }, + /* UC 17 */ + { + {7, 1, 0}, + {15, 7, 0}, + {7, 6, 0}, + {15, 10, 0}, + }, }; enum { diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c index 1a981ef27fadf..823503f624091 100644 --- a/drivers/spi/spidev.c +++ b/drivers/spi/spidev.c @@ -4,6 +4,7 @@ * Copyright (C) 2006 SWAPP * Andrea Paterniani * Copyright (C) 2007 David Brownell (simplification, cleanup) + * Copyright (C) 2018 XiaoMi, Inc. * * 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 @@ -92,7 +93,7 @@ struct spidev_data { static LIST_HEAD(device_list); static DEFINE_MUTEX(device_list_lock); -static unsigned bufsiz = 4096; +static unsigned bufsiz = 512*4096; module_param(bufsiz, uint, S_IRUGO); MODULE_PARM_DESC(bufsiz, "data bytes in biggest supported SPI message"); @@ -162,6 +163,10 @@ spidev_sync_write(struct spidev_data *spidev, size_t len) struct spi_transfer t = { .tx_buf = spidev->tx_buffer, .len = len, + .delay_usecs = 0, + .cs_change = 0, + + .speed_hz = 960000, }; struct spi_message m; @@ -544,36 +549,18 @@ static int spidev_open(struct inode *inode, struct file *filp) goto err_find_dev; } - if (!spidev->tx_buffer) { - spidev->tx_buffer = kmalloc(bufsiz, GFP_KERNEL); - if (!spidev->tx_buffer) { - dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); - status = -ENOMEM; - goto err_find_dev; - } - } - - if (!spidev->rx_buffer) { - spidev->rx_buffer = kmalloc(bufsiz, GFP_KERNEL); - if (!spidev->rx_buffer) { - dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); - status = -ENOMEM; - goto err_alloc_rx_buf; - } - } + memset(spidev->tx_buffer, 0, bufsiz); + memset(spidev->rx_buffer, 0, bufsiz); spidev->users++; filp->private_data = spidev; nonseekable_open(inode, filp); - mutex_unlock(&device_list_lock); return 0; -err_alloc_rx_buf: - kfree(spidev->tx_buffer); - spidev->tx_buffer = NULL; err_find_dev: mutex_unlock(&device_list_lock); + return status; } @@ -591,12 +578,6 @@ static int spidev_release(struct inode *inode, struct file *filp) if (!spidev->users) { int dofree; - kfree(spidev->tx_buffer); - spidev->tx_buffer = NULL; - - kfree(spidev->rx_buffer); - spidev->rx_buffer = NULL; - /* ... after we unbound from the underlying device? */ spin_lock_irq(&spidev->spi_lock); dofree = (spidev->spi == NULL); @@ -675,12 +656,40 @@ static int spidev_probe(struct spi_device *spi) set_bit(minor, minors); list_add(&spidev->device_entry, &device_list); } + + if (!spidev->tx_buffer) { + spidev->tx_buffer = kmalloc(bufsiz, GFP_KERNEL); + if (!spidev->tx_buffer) { + dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); + status = -ENOMEM; + goto err_find_dev; + } + } + + if (!spidev->rx_buffer) { + spidev->rx_buffer = kmalloc(bufsiz, GFP_KERNEL); + if (!spidev->rx_buffer) { + dev_dbg(&spidev->spi->dev, "open/ENOMEM\n"); + status = -ENOMEM; + goto err_alloc_rx_buf; + } + } + mutex_unlock(&device_list_lock); if (status == 0) spi_set_drvdata(spi, spidev); else - kfree(spidev); + goto err_dev_status; + + return status; +err_dev_status: + kfree(spidev); +err_alloc_rx_buf: + kfree(spidev->tx_buffer); + spidev->tx_buffer = NULL; +err_find_dev: + mutex_unlock(&device_list_lock); return status; } @@ -691,6 +700,13 @@ static int spidev_remove(struct spi_device *spi) /* make sure ops on existing fds can abort cleanly */ spin_lock_irq(&spidev->spi_lock); + + kfree(spidev->tx_buffer); + spidev->tx_buffer = NULL; + + kfree(spidev->rx_buffer); + spidev->rx_buffer = NULL; + spidev->spi = NULL; spin_unlock_irq(&spidev->spi_lock); diff --git a/drivers/staging/Kconfig b/drivers/staging/Kconfig index 4690ae9a267f3..605a6871301d0 100644 --- a/drivers/staging/Kconfig +++ b/drivers/staging/Kconfig @@ -108,4 +108,8 @@ source "drivers/staging/skein/Kconfig" source "drivers/staging/unisys/Kconfig" +source "drivers/staging/ktrace/Kconfig" + +source "drivers/staging/rtmm/Kconfig" + endif # STAGING diff --git a/drivers/staging/Makefile b/drivers/staging/Makefile index 53503056d747e..a7b95b4413806 100644 --- a/drivers/staging/Makefile +++ b/drivers/staging/Makefile @@ -45,3 +45,6 @@ obj-$(CONFIG_MTD_SPINAND_MT29F) += mt29f_spinand/ obj-$(CONFIG_GS_FPGABOOT) += gs_fpgaboot/ obj-$(CONFIG_CRYPTO_SKEIN) += skein/ obj-$(CONFIG_UNISYSSPAR) += unisys/ +obj-$(CONFIG_KTRACE) += ktrace/ +obj-$(CONFIG_RTMM) += rtmm/ + diff --git a/drivers/staging/android/Kconfig b/drivers/staging/android/Kconfig index b14adec68d8f6..9f6976beb1d18 100644 --- a/drivers/staging/android/Kconfig +++ b/drivers/staging/android/Kconfig @@ -32,6 +32,28 @@ config ANDROID_BINDER_IPC_32BIT Note that enabling this will break newer Android user-space. +config ANDROID_BINDER_DEVICES + string "Android Binder devices" + depends on ANDROID_BINDER_IPC + default "binder,hwbinder,vndbinder" + ---help--- + Default value for the binder.devices parameter. + + The binder.devices parameter is a comma-separated list of strings + that specifies the names of the binder device nodes that will be + created. Each binder device has its own context manager, and is + therefore logically separated from the other devices. + +config ANDROID_BINDER_IPC_SELFTEST + bool "Android Binder IPC Driver Selftest" + depends on ANDROID_BINDER_IPC + ---help--- + This feature allows binder selftest to run. + + Binder selftest checks the allocation and free of binder buffers + exhaustively with combinations of various buffer sizes and + alignments. + config ASHMEM bool "Enable the Anonymous Shared Memory Subsystem" default n @@ -126,6 +148,12 @@ config ONESHOT_SYNC_USER help Provide a userspace API for creating oneshot sync objects. +config ANDROID_WHETSTONE + bool "Android Whetstone" + default N + ---help--- + report to whetstone the memory state when reach target limit value. + source "drivers/staging/android/ion/Kconfig" source "drivers/staging/android/fiq_debugger/Kconfig" diff --git a/drivers/staging/android/Makefile b/drivers/staging/android/Makefile index a6cf4808234dc..0ed34e2873f07 100644 --- a/drivers/staging/android/Makefile +++ b/drivers/staging/android/Makefile @@ -3,11 +3,13 @@ ccflags-y += -I$(src) # needed for trace events obj-y += ion/ obj-$(CONFIG_FIQ_DEBUGGER) += fiq_debugger/ -obj-$(CONFIG_ANDROID_BINDER_IPC) += binder.o +obj-$(CONFIG_ANDROID_BINDER_IPC) += binder.o binder_alloc.o +obj-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o obj-$(CONFIG_ASHMEM) += ashmem.o obj-$(CONFIG_ANDROID_LOGGER) += logger.o obj-$(CONFIG_ANDROID_TIMED_OUTPUT) += timed_output.o obj-$(CONFIG_ANDROID_TIMED_GPIO) += timed_gpio.o +obj-$(CONFIG_ANDROID_WHETSTONE) += memsw_state.o obj-$(CONFIG_ANDROID_LOW_MEMORY_KILLER) += lowmemorykiller.o obj-$(CONFIG_SYNC) += sync.o obj-$(CONFIG_SW_SYNC) += sw_sync.o diff --git a/drivers/staging/android/ashmem.c b/drivers/staging/android/ashmem.c index 411072fc8d2dd..ea356c961b425 100644 --- a/drivers/staging/android/ashmem.c +++ b/drivers/staging/android/ashmem.c @@ -32,7 +32,6 @@ #include #include #include -#include #include "ashmem.h" @@ -397,6 +396,7 @@ static int ashmem_mmap(struct file *file, struct vm_area_struct *vma) ret = PTR_ERR(vmfile); goto out; } + vmfile->f_mode |= FMODE_LSEEK; asma->file = vmfile; } get_file(asma->file); @@ -744,37 +744,6 @@ static int ashmem_pin_unpin(struct ashmem_area *asma, unsigned long cmd, return ret; } -static int ashmem_cache_op(struct ashmem_area *asma, - void (*cache_func)(const void *vstart, const void *vend)) -{ - int ret = 0; - struct vm_area_struct *vma; - if (!asma->vm_start) - return -EINVAL; - - down_read(¤t->mm->mmap_sem); - vma = find_vma(current->mm, asma->vm_start); - if (!vma) { - ret = -EINVAL; - goto done; - } - if (vma->vm_file != asma->file) { - ret = -EINVAL; - goto done; - } - if ((asma->vm_start + asma->size) > vma->vm_end) { - ret = -EINVAL; - goto done; - } - cache_func((void *)asma->vm_start, - (void *)(asma->vm_start + asma->size)); -done: - up_read(¤t->mm->mmap_sem); - if (ret) - asma->vm_start = 0; - return ret; -} - static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct ashmem_area *asma = file->private_data; @@ -789,10 +758,12 @@ static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg) break; case ASHMEM_SET_SIZE: ret = -EINVAL; + mutex_lock(&ashmem_mutex); if (!asma->file) { ret = 0; asma->size = (size_t) arg; } + mutex_unlock(&ashmem_mutex); break; case ASHMEM_GET_SIZE: ret = asma->size; @@ -820,15 +791,6 @@ static long ashmem_ioctl(struct file *file, unsigned int cmd, unsigned long arg) ashmem_shrink_scan(&ashmem_shrinker, &sc); } break; - case ASHMEM_CACHE_FLUSH_RANGE: - ret = ashmem_cache_op(asma, &dmac_flush_range); - break; - case ASHMEM_CACHE_CLEAN_RANGE: - ret = ashmem_cache_op(asma, &dmac_clean_range); - break; - case ASHMEM_CACHE_INV_RANGE: - ret = ashmem_cache_op(asma, &dmac_inv_range); - break; } return ret; diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index 71476ca5fad71..299d78d2e9c3b 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -15,6 +15,40 @@ * */ +/* + * Locking overview + * + * There are 3 main spinlocks which must be acquired in the + * order shown: + * + * 1) proc->outer_lock : protects binder_ref + * binder_proc_lock() and binder_proc_unlock() are + * used to acq/rel. + * 2) node->lock : protects most fields of binder_node. + * binder_node_lock() and binder_node_unlock() are + * used to acq/rel + * 3) proc->inner_lock : protects the thread and node lists + * (proc->threads, proc->waiting_threads, proc->nodes) + * and all todo lists associated with the binder_proc + * (proc->todo, thread->todo, proc->delivered_death and + * node->async_todo), as well as thread->transaction_stack + * binder_inner_proc_lock() and binder_inner_proc_unlock() + * are used to acq/rel + * + * Any lock under procA must never be nested under any lock at the same + * level or below on procB. + * + * Functions that require a lock held on entry indicate which lock + * in the suffix of the function name: + * + * foo_olocked() : requires node->outer_lock + * foo_nlocked() : requires node->lock + * foo_ilocked() : requires proc->inner_lock + * foo_oilocked(): requires proc->outer_lock and proc->inner_lock + * foo_nilocked(): requires node->lock and proc->inner_lock + * ... + */ + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include @@ -24,7 +58,6 @@ #include #include #include -#include #include #include #include @@ -34,27 +67,27 @@ #include #include #include -#include -#include #include #include +#include #include "binder.h" +#include "binder_alloc.h" #include "binder_trace.h" -static DEFINE_MUTEX(binder_main_lock); +static HLIST_HEAD(binder_deferred_list); static DEFINE_MUTEX(binder_deferred_lock); -static DEFINE_MUTEX(binder_mmap_lock); +static HLIST_HEAD(binder_devices); static HLIST_HEAD(binder_procs); -static HLIST_HEAD(binder_deferred_list); +static DEFINE_MUTEX(binder_procs_lock); + static HLIST_HEAD(binder_dead_nodes); +static DEFINE_SPINLOCK(binder_dead_nodes_lock); static struct dentry *binder_debugfs_dir_entry_root; static struct dentry *binder_debugfs_dir_entry_proc; -static struct binder_node *binder_context_mgr_node; -static kuid_t binder_context_mgr_uid = INVALID_UID; -static int binder_last_id; +static atomic_t binder_last_id; static struct workqueue_struct *binder_deferred_workqueue; #define BINDER_DEBUG_ENTRY(name) \ @@ -101,16 +134,15 @@ enum { BINDER_DEBUG_TRANSACTION_COMPLETE = 1U << 10, BINDER_DEBUG_FREE_BUFFER = 1U << 11, BINDER_DEBUG_INTERNAL_REFS = 1U << 12, - BINDER_DEBUG_BUFFER_ALLOC = 1U << 13, - BINDER_DEBUG_PRIORITY_CAP = 1U << 14, - BINDER_DEBUG_BUFFER_ALLOC_ASYNC = 1U << 15, + BINDER_DEBUG_PRIORITY_CAP = 1U << 13, + BINDER_DEBUG_SPINLOCKS = 1U << 14, }; static uint32_t binder_debug_mask = BINDER_DEBUG_USER_ERROR | BINDER_DEBUG_FAILED_TRANSACTION | BINDER_DEBUG_DEAD_TRANSACTION; module_param_named(debug_mask, binder_debug_mask, uint, S_IWUSR | S_IRUGO); -static bool binder_debug_no_lock; -module_param_named(proc_no_lock, binder_debug_no_lock, bool, S_IWUSR | S_IRUGO); +static char *binder_devices_param = CONFIG_ANDROID_BINDER_DEVICES; +module_param_named(devices, binder_devices_param, charp, S_IRUGO); static DECLARE_WAIT_QUEUE_HEAD(binder_user_error_wait); static int binder_stop_on_user_error; @@ -142,6 +174,17 @@ module_param_call(stop_on_user_error, binder_set_stop_on_user_error, binder_stop_on_user_error = 2; \ } while (0) +#define to_flat_binder_object(hdr) \ + container_of(hdr, struct flat_binder_object, hdr) + +#define to_binder_fd_object(hdr) container_of(hdr, struct binder_fd_object, hdr) + +#define to_binder_buffer_object(hdr) \ + container_of(hdr, struct binder_buffer_object, hdr) + +#define to_binder_fd_array_object(hdr) \ + container_of(hdr, struct binder_fd_array_object, hdr) + enum binder_stat_types { BINDER_STAT_PROC, BINDER_STAT_THREAD, @@ -154,26 +197,27 @@ enum binder_stat_types { }; struct binder_stats { - int br[_IOC_NR(BR_FAILED_REPLY) + 1]; - int bc[_IOC_NR(BC_DEAD_BINDER_DONE) + 1]; - int obj_created[BINDER_STAT_COUNT]; - int obj_deleted[BINDER_STAT_COUNT]; + atomic_t br[_IOC_NR(BR_FAILED_REPLY) + 1]; + atomic_t bc[_IOC_NR(BC_REPLY_SG) + 1]; + atomic_t obj_created[BINDER_STAT_COUNT]; + atomic_t obj_deleted[BINDER_STAT_COUNT]; }; static struct binder_stats binder_stats; static inline void binder_stats_deleted(enum binder_stat_types type) { - binder_stats.obj_deleted[type]++; + atomic_inc(&binder_stats.obj_deleted[type]); } static inline void binder_stats_created(enum binder_stat_types type) { - binder_stats.obj_created[type]++; + atomic_inc(&binder_stats.obj_created[type]); } struct binder_transaction_log_entry { int debug_id; + int debug_id_done; int call_type; int from_proc; int from_thread; @@ -183,10 +227,14 @@ struct binder_transaction_log_entry { int to_node; int data_size; int offsets_size; + int return_error_line; + uint32_t return_error; + uint32_t return_error_param; + const char *context_name; }; struct binder_transaction_log { - int next; - int full; + atomic_t cur; + bool full; struct binder_transaction_log_entry entry[32]; }; static struct binder_transaction_log binder_transaction_log; @@ -196,22 +244,50 @@ static struct binder_transaction_log_entry *binder_transaction_log_add( struct binder_transaction_log *log) { struct binder_transaction_log_entry *e; + unsigned int cur = atomic_inc_return(&log->cur); - e = &log->entry[log->next]; - memset(e, 0, sizeof(*e)); - log->next++; - if (log->next == ARRAY_SIZE(log->entry)) { - log->next = 0; + if (cur >= ARRAY_SIZE(log->entry)) log->full = 1; - } + e = &log->entry[cur % ARRAY_SIZE(log->entry)]; + WRITE_ONCE(e->debug_id_done, 0); + /* + * write-barrier to synchronize access to e->debug_id_done. + * We make sure the initialized 0 value is seen before + * memset() other fields are zeroed by memset. + */ + smp_wmb(); + memset(e, 0, sizeof(*e)); return e; } +struct binder_context { + struct binder_node *binder_context_mgr_node; + struct mutex context_mgr_node_lock; + + kuid_t binder_context_mgr_uid; + const char *name; +}; + +struct binder_device { + struct hlist_node hlist; + struct miscdevice miscdev; + struct binder_context context; +}; + +/** + * struct binder_work - work enqueued on a worklist + * @entry: node enqueued on list + * @type: type of work to be performed + * + * There are separate work lists for proc, thread, and node (async). + */ struct binder_work { struct list_head entry; + enum { BINDER_WORK_TRANSACTION = 1, BINDER_WORK_TRANSACTION_COMPLETE, + BINDER_WORK_RETURN_ERROR, BINDER_WORK_NODE, BINDER_WORK_DEAD_BINDER, BINDER_WORK_DEAD_BINDER_AND_CLEAR, @@ -219,8 +295,76 @@ struct binder_work { } type; }; +struct binder_error { + struct binder_work work; + uint32_t cmd; +}; + +/** + * struct binder_node - binder node bookkeeping + * @debug_id: unique ID for debugging + * (invariant after initialized) + * @lock: lock for node fields + * @work: worklist element for node work + * (protected by @proc->inner_lock) + * @rb_node: element for proc->nodes tree + * (protected by @proc->inner_lock) + * @dead_node: element for binder_dead_nodes list + * (protected by binder_dead_nodes_lock) + * @proc: binder_proc that owns this node + * (invariant after initialized) + * @refs: list of references on this node + * (protected by @lock) + * @internal_strong_refs: used to take strong references when + * initiating a transaction + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @local_weak_refs: weak user refs from local process + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @local_strong_refs: strong user refs from local process + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @tmp_refs: temporary kernel refs + * (protected by @proc->inner_lock while @proc + * is valid, and by binder_dead_nodes_lock + * if @proc is NULL. During inc/dec and node release + * it is also protected by @lock to provide safety + * as the node dies and @proc becomes NULL) + * @ptr: userspace pointer for node + * (invariant, no lock needed) + * @cookie: userspace cookie for node + * (invariant, no lock needed) + * @has_strong_ref: userspace notified of strong ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @pending_strong_ref: userspace has acked notification of strong ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @has_weak_ref: userspace notified of weak ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @pending_weak_ref: userspace has acked notification of weak ref + * (protected by @proc->inner_lock if @proc + * and by @lock) + * @has_async_transaction: async transaction to node in progress + * (protected by @lock) + * @sched_policy: minimum scheduling policy for node + * (invariant after initialized) + * @accept_fds: file descriptor operations supported for node + * (invariant after initialized) + * @min_priority: minimum scheduling priority + * (invariant after initialized) + * @inherit_rt: inherit RT scheduling policy from caller + * (invariant after initialized) + * @async_todo: list of async work items + * (protected by @proc->inner_lock) + * + * Bookkeeping structure for binder nodes. + */ struct binder_node { int debug_id; + spinlock_t lock; struct binder_work work; union { struct rb_node rb_node; @@ -231,87 +375,185 @@ struct binder_node { int internal_strong_refs; int local_weak_refs; int local_strong_refs; + int tmp_refs; binder_uintptr_t ptr; binder_uintptr_t cookie; - unsigned has_strong_ref:1; - unsigned pending_strong_ref:1; - unsigned has_weak_ref:1; - unsigned pending_weak_ref:1; - unsigned has_async_transaction:1; - unsigned accept_fds:1; - unsigned min_priority:8; + struct { + /* + * bitfield elements protected by + * proc inner_lock + */ + u8 has_strong_ref:1; + u8 pending_strong_ref:1; + u8 has_weak_ref:1; + u8 pending_weak_ref:1; + }; + struct { + /* + * invariant after initialization + */ + u8 sched_policy:2; + u8 inherit_rt:1; + u8 accept_fds:1; + u8 min_priority; + }; + bool has_async_transaction; struct list_head async_todo; }; struct binder_ref_death { + /** + * @work: worklist element for death notifications + * (protected by inner_lock of the proc that + * this ref belongs to) + */ struct binder_work work; binder_uintptr_t cookie; }; +/** + * struct binder_ref_data - binder_ref counts and id + * @debug_id: unique ID for the ref + * @desc: unique userspace handle for ref + * @strong: strong ref count (debugging only if not locked) + * @weak: weak ref count (debugging only if not locked) + * + * Structure to hold ref count and ref id information. Since + * the actual ref can only be accessed with a lock, this structure + * is used to return information about the ref to callers of + * ref inc/dec functions. + */ +struct binder_ref_data { + int debug_id; + uint32_t desc; + int strong; + int weak; +}; + +/** + * struct binder_ref - struct to track references on nodes + * @data: binder_ref_data containing id, handle, and current refcounts + * @rb_node_desc: node for lookup by @data.desc in proc's rb_tree + * @rb_node_node: node for lookup by @node in proc's rb_tree + * @node_entry: list entry for node->refs list in target node + * (protected by @node->lock) + * @proc: binder_proc containing ref + * @node: binder_node of target node. When cleaning up a + * ref for deletion in binder_cleanup_ref, a non-NULL + * @node indicates the node must be freed + * @death: pointer to death notification (ref_death) if requested + * (protected by @node->lock) + * + * Structure to track references from procA to target node (on procB). This + * structure is unsafe to access without holding @proc->outer_lock. + */ struct binder_ref { /* Lookups needed: */ /* node + proc => ref (transaction) */ /* desc + proc => ref (transaction, inc/dec ref) */ /* node => refs + procs (proc exit) */ - int debug_id; + struct binder_ref_data data; struct rb_node rb_node_desc; struct rb_node rb_node_node; struct hlist_node node_entry; struct binder_proc *proc; struct binder_node *node; - uint32_t desc; - int strong; - int weak; struct binder_ref_death *death; }; -struct binder_buffer { - struct list_head entry; /* free and allocated entries by address */ - struct rb_node rb_node; /* free entry by size or allocated entry */ - /* by address */ - unsigned free:1; - unsigned allow_user_free:1; - unsigned async_transaction:1; - unsigned debug_id:29; - - struct binder_transaction *transaction; - - struct binder_node *target_node; - size_t data_size; - size_t offsets_size; - uint8_t data[0]; -}; - enum binder_deferred_state { BINDER_DEFERRED_PUT_FILES = 0x01, BINDER_DEFERRED_FLUSH = 0x02, BINDER_DEFERRED_RELEASE = 0x04, }; +/** + * struct binder_priority - scheduler policy and priority + * @sched_policy scheduler policy + * @prio [100..139] for SCHED_NORMAL, [0..99] for FIFO/RT + * + * The binder driver supports inheriting the following scheduler policies: + * SCHED_NORMAL + * SCHED_BATCH + * SCHED_FIFO + * SCHED_RR + */ +struct binder_priority { + unsigned int sched_policy; + int prio; +}; + +/** + * struct binder_proc - binder process bookkeeping + * @proc_node: element for binder_procs list + * @threads: rbtree of binder_threads in this proc + * (protected by @inner_lock) + * @nodes: rbtree of binder nodes associated with + * this proc ordered by node->ptr + * (protected by @inner_lock) + * @refs_by_desc: rbtree of refs ordered by ref->desc + * (protected by @outer_lock) + * @refs_by_node: rbtree of refs ordered by ref->node + * (protected by @outer_lock) + * @waiting_threads: threads currently waiting for proc work + * (protected by @inner_lock) + * @pid PID of group_leader of process + * (invariant after initialized) + * @tsk task_struct for group_leader of process + * (invariant after initialized) + * @files files_struct for process + * (invariant after initialized) + * @deferred_work_node: element for binder_deferred_list + * (protected by binder_deferred_lock) + * @deferred_work: bitmap of deferred work to perform + * (protected by binder_deferred_lock) + * @is_dead: process is dead and awaiting free + * when outstanding transactions are cleaned up + * (protected by @inner_lock) + * @todo: list of work for this process + * (protected by @inner_lock) + * @wait: wait queue head to wait for proc work + * (invariant after initialized) + * @stats: per-process binder statistics + * (atomics, no lock needed) + * @delivered_death: list of delivered death notification + * (protected by @inner_lock) + * @max_threads: cap on number of binder threads + * (protected by @inner_lock) + * @requested_threads: number of binder threads requested but not + * yet started. In current implementation, can + * only be 0 or 1. + * (protected by @inner_lock) + * @requested_threads_started: number binder threads started + * (protected by @inner_lock) + * @tmp_ref: temporary reference to indicate proc is in use + * (protected by @inner_lock) + * @default_priority: default scheduler priority + * (invariant after initialized) + * @debugfs_entry: debugfs node + * @alloc: binder allocator bookkeeping + * @context: binder_context for this proc + * (invariant after initialized) + * @inner_lock: can nest under outer_lock and/or node lock + * @outer_lock: no nesting under innor or node lock + * Lock order: 1) outer, 2) node, 3) inner + * + * Bookkeeping structure for binder processes + */ struct binder_proc { struct hlist_node proc_node; struct rb_root threads; struct rb_root nodes; struct rb_root refs_by_desc; struct rb_root refs_by_node; + struct list_head waiting_threads; int pid; - struct vm_area_struct *vma; - struct mm_struct *vma_vm_mm; struct task_struct *tsk; struct files_struct *files; struct hlist_node deferred_work_node; int deferred_work; - void *buffer; - ptrdiff_t user_buffer_offset; - - struct list_head buffers; - struct rb_root free_buffers; - struct rb_root allocated_buffers; - size_t free_async_space; + bool is_dead; - struct page **pages; - size_t buffer_size; - uint32_t buffer_free; struct list_head todo; wait_queue_head_t wait; struct binder_stats stats; @@ -319,9 +561,13 @@ struct binder_proc { int max_threads; int requested_threads; int requested_threads_started; - int ready_threads; - long default_priority; + int tmp_ref; + struct binder_priority default_priority; struct dentry *debugfs_entry; + struct binder_alloc alloc; + struct binder_context *context; + spinlock_t inner_lock; + spinlock_t outer_lock; }; enum { @@ -330,22 +576,60 @@ enum { BINDER_LOOPER_STATE_EXITED = 0x04, BINDER_LOOPER_STATE_INVALID = 0x08, BINDER_LOOPER_STATE_WAITING = 0x10, - BINDER_LOOPER_STATE_NEED_RETURN = 0x20 + BINDER_LOOPER_STATE_POLL = 0x20, }; +/** + * struct binder_thread - binder thread bookkeeping + * @proc: binder process for this thread + * (invariant after initialization) + * @rb_node: element for proc->threads rbtree + * (protected by @proc->inner_lock) + * @waiting_thread_node: element for @proc->waiting_threads list + * (protected by @proc->inner_lock) + * @pid: PID for this thread + * (invariant after initialization) + * @looper: bitmap of looping state + * (only accessed by this thread) + * @looper_needs_return: looping thread needs to exit driver + * (no lock needed) + * @transaction_stack: stack of in-progress transactions for this thread + * (protected by @proc->inner_lock) + * @todo: list of work to do for this thread + * (protected by @proc->inner_lock) + * @return_error: transaction errors reported by this thread + * (only accessed by this thread) + * @reply_error: transaction errors reported by target thread + * (protected by @proc->inner_lock) + * @wait: wait queue for thread work + * @stats: per-thread statistics + * (atomics, no lock needed) + * @tmp_ref: temporary reference to indicate thread is in use + * (atomic since @proc->inner_lock cannot + * always be acquired) + * @is_dead: thread is dead and awaiting free + * when outstanding transactions are cleaned up + * (protected by @proc->inner_lock) + * @task: struct task_struct for this thread + * + * Bookkeeping structure for binder threads. + */ struct binder_thread { struct binder_proc *proc; struct rb_node rb_node; + struct list_head waiting_thread_node; int pid; - int looper; + int looper; /* only modified by this thread */ + bool looper_need_return; /* can be written by other thread */ struct binder_transaction *transaction_stack; struct list_head todo; - uint32_t return_error; /* Write failed, return error code in read buf */ - uint32_t return_error2; /* Write failed, return error code in read */ - /* buffer. Used when sending a reply to a dead process that */ - /* we are also waiting on */ + struct binder_error return_error; + struct binder_error reply_error; wait_queue_head_t wait; struct binder_stats stats; + atomic_t tmp_ref; + bool is_dead; + struct task_struct *task; }; struct binder_transaction { @@ -362,13 +646,257 @@ struct binder_transaction { struct binder_buffer *buffer; unsigned int code; unsigned int flags; - long priority; - long saved_priority; + struct binder_priority priority; + struct binder_priority saved_priority; + bool set_priority_called; kuid_t sender_euid; + /** + * @lock: protects @from, @to_proc, and @to_thread + * + * @from, @to_proc, and @to_thread can be set to NULL + * during thread teardown + */ + spinlock_t lock; }; +/** + * binder_proc_lock() - Acquire outer lock for given binder_proc + * @proc: struct binder_proc to acquire + * + * Acquires proc->outer_lock. Used to protect binder_ref + * structures associated with the given proc. + */ +#define binder_proc_lock(proc) _binder_proc_lock(proc, __LINE__) +static void +_binder_proc_lock(struct binder_proc *proc, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_lock(&proc->outer_lock); +} + +/** + * binder_proc_unlock() - Release spinlock for given binder_proc + * @proc: struct binder_proc to acquire + * + * Release lock acquired via binder_proc_lock() + */ +#define binder_proc_unlock(_proc) _binder_proc_unlock(_proc, __LINE__) +static void +_binder_proc_unlock(struct binder_proc *proc, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_unlock(&proc->outer_lock); +} + +/** + * binder_inner_proc_lock() - Acquire inner lock for given binder_proc + * @proc: struct binder_proc to acquire + * + * Acquires proc->inner_lock. Used to protect todo lists + */ +#define binder_inner_proc_lock(proc) _binder_inner_proc_lock(proc, __LINE__) +static void +_binder_inner_proc_lock(struct binder_proc *proc, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_lock(&proc->inner_lock); +} + +/** + * binder_inner_proc_unlock() - Release inner lock for given binder_proc + * @proc: struct binder_proc to acquire + * + * Release lock acquired via binder_inner_proc_lock() + */ +#define binder_inner_proc_unlock(proc) _binder_inner_proc_unlock(proc, __LINE__) +static void +_binder_inner_proc_unlock(struct binder_proc *proc, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_unlock(&proc->inner_lock); +} + +/** + * binder_node_lock() - Acquire spinlock for given binder_node + * @node: struct binder_node to acquire + * + * Acquires node->lock. Used to protect binder_node fields + */ +#define binder_node_lock(node) _binder_node_lock(node, __LINE__) +static void +_binder_node_lock(struct binder_node *node, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_lock(&node->lock); +} + +/** + * binder_node_unlock() - Release spinlock for given binder_proc + * @node: struct binder_node to acquire + * + * Release lock acquired via binder_node_lock() + */ +#define binder_node_unlock(node) _binder_node_unlock(node, __LINE__) +static void +_binder_node_unlock(struct binder_node *node, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_unlock(&node->lock); +} + +/** + * binder_node_inner_lock() - Acquire node and inner locks + * @node: struct binder_node to acquire + * + * Acquires node->lock. If node->proc also acquires + * proc->inner_lock. Used to protect binder_node fields + */ +#define binder_node_inner_lock(node) _binder_node_inner_lock(node, __LINE__) +static void +_binder_node_inner_lock(struct binder_node *node, int line) +{ + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + spin_lock(&node->lock); + if (node->proc) + binder_inner_proc_lock(node->proc); +} + +/** + * binder_node_unlock() - Release node and inner locks + * @node: struct binder_node to acquire + * + * Release lock acquired via binder_node_lock() + */ +#define binder_node_inner_unlock(node) _binder_node_inner_unlock(node, __LINE__) +static void +_binder_node_inner_unlock(struct binder_node *node, int line) +{ + struct binder_proc *proc = node->proc; + + binder_debug(BINDER_DEBUG_SPINLOCKS, + "%s: line=%d\n", __func__, line); + if (proc) + binder_inner_proc_unlock(proc); + spin_unlock(&node->lock); +} + +static bool binder_worklist_empty_ilocked(struct list_head *list) +{ + return list_empty(list); +} + +/** + * binder_worklist_empty() - Check if no items on the work list + * @proc: binder_proc associated with list + * @list: list to check + * + * Return: true if there are no items on list, else false + */ +static bool binder_worklist_empty(struct binder_proc *proc, + struct list_head *list) +{ + bool ret; + + binder_inner_proc_lock(proc); + ret = binder_worklist_empty_ilocked(list); + binder_inner_proc_unlock(proc); + return ret; +} + +static void +binder_enqueue_work_ilocked(struct binder_work *work, + struct list_head *target_list) +{ + BUG_ON(target_list == NULL); + BUG_ON(work->entry.next && !list_empty(&work->entry)); + list_add_tail(&work->entry, target_list); +} + +/** + * binder_enqueue_work() - Add an item to the work list + * @proc: binder_proc associated with list + * @work: struct binder_work to add to list + * @target_list: list to add work to + * + * Adds the work to the specified list. Asserts that work + * is not already on a list. + */ +static void +binder_enqueue_work(struct binder_proc *proc, + struct binder_work *work, + struct list_head *target_list) +{ + binder_inner_proc_lock(proc); + binder_enqueue_work_ilocked(work, target_list); + binder_inner_proc_unlock(proc); +} + +static void +binder_dequeue_work_ilocked(struct binder_work *work) +{ + list_del_init(&work->entry); +} + +/** + * binder_dequeue_work() - Removes an item from the work list + * @proc: binder_proc associated with list + * @work: struct binder_work to remove from list + * + * Removes the specified work item from whatever list it is on. + * Can safely be called if work is not on any list. + */ +static void +binder_dequeue_work(struct binder_proc *proc, struct binder_work *work) +{ + binder_inner_proc_lock(proc); + binder_dequeue_work_ilocked(work); + binder_inner_proc_unlock(proc); +} + +static struct binder_work *binder_dequeue_work_head_ilocked( + struct list_head *list) +{ + struct binder_work *w; + + w = list_first_entry_or_null(list, struct binder_work, entry); + if (w) + list_del_init(&w->entry); + return w; +} + +/** + * binder_dequeue_work_head() - Dequeues the item at head of list + * @proc: binder_proc associated with list + * @list: list to dequeue head + * + * Removes the head of the list if there are items on the list + * + * Return: pointer dequeued binder_work, NULL if list was empty + */ +static struct binder_work *binder_dequeue_work_head( + struct binder_proc *proc, + struct list_head *list) +{ + struct binder_work *w; + + binder_inner_proc_lock(proc); + w = binder_dequeue_work_head_ilocked(list); + binder_inner_proc_unlock(proc); + return w; +} + static void binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer); +static void binder_free_thread(struct binder_thread *thread); +static void binder_free_proc(struct binder_proc *proc); +static void binder_inc_node_tmpref_ilocked(struct binder_node *node); static int task_get_unused_fd_flags(struct binder_proc *proc, int flags) { @@ -419,475 +947,330 @@ static long task_close_fd(struct binder_proc *proc, unsigned int fd) return retval; } -static inline void binder_lock(const char *tag) +static bool binder_has_work_ilocked(struct binder_thread *thread, + bool do_proc_work) { - trace_binder_lock(tag); - mutex_lock(&binder_main_lock); - trace_binder_locked(tag); + return !binder_worklist_empty_ilocked(&thread->todo) || + thread->looper_need_return || + (do_proc_work && + !binder_worklist_empty_ilocked(&thread->proc->todo)); } -static inline void binder_unlock(const char *tag) +static bool binder_has_work(struct binder_thread *thread, bool do_proc_work) { - trace_binder_unlock(tag); - mutex_unlock(&binder_main_lock); -} + bool has_work; -static void binder_set_nice(long nice) -{ - long min_nice; + binder_inner_proc_lock(thread->proc); + has_work = binder_has_work_ilocked(thread, do_proc_work); + binder_inner_proc_unlock(thread->proc); - if (can_nice(current, nice)) { - set_user_nice(current, nice); - return; - } - min_nice = rlimit_to_nice(current->signal->rlim[RLIMIT_NICE].rlim_cur); - binder_debug(BINDER_DEBUG_PRIORITY_CAP, - "%d: nice value %ld not allowed use %ld instead\n", - current->pid, nice, min_nice); - set_user_nice(current, min_nice); - if (min_nice <= MAX_NICE) - return; - binder_user_error("%d RLIMIT_NICE not set\n", current->pid); + return has_work; } -static size_t binder_buffer_size(struct binder_proc *proc, - struct binder_buffer *buffer) +static bool binder_available_for_proc_work_ilocked(struct binder_thread *thread) { - if (list_is_last(&buffer->entry, &proc->buffers)) - return proc->buffer + proc->buffer_size - (void *)buffer->data; - return (size_t)list_entry(buffer->entry.next, - struct binder_buffer, entry) - (size_t)buffer->data; + return !thread->transaction_stack && + binder_worklist_empty_ilocked(&thread->todo) && + (thread->looper & (BINDER_LOOPER_STATE_ENTERED | + BINDER_LOOPER_STATE_REGISTERED)); } -static void binder_insert_free_buffer(struct binder_proc *proc, - struct binder_buffer *new_buffer) +static void binder_wakeup_poll_threads_ilocked(struct binder_proc *proc, + bool sync) { - struct rb_node **p = &proc->free_buffers.rb_node; - struct rb_node *parent = NULL; - struct binder_buffer *buffer; - size_t buffer_size; - size_t new_buffer_size; - - BUG_ON(!new_buffer->free); - - new_buffer_size = binder_buffer_size(proc, new_buffer); - - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: add free buffer, size %zd, at %p\n", - proc->pid, new_buffer_size, new_buffer); - - while (*p) { - parent = *p; - buffer = rb_entry(parent, struct binder_buffer, rb_node); - BUG_ON(!buffer->free); - - buffer_size = binder_buffer_size(proc, buffer); + struct rb_node *n; + struct binder_thread *thread; - if (new_buffer_size < buffer_size) - p = &parent->rb_left; - else - p = &parent->rb_right; + for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) { + thread = rb_entry(n, struct binder_thread, rb_node); + if (thread->looper & BINDER_LOOPER_STATE_POLL && + binder_available_for_proc_work_ilocked(thread)) { + if (sync) + wake_up_interruptible_sync(&thread->wait); + else + wake_up_interruptible(&thread->wait); + } } - rb_link_node(&new_buffer->rb_node, parent, p); - rb_insert_color(&new_buffer->rb_node, &proc->free_buffers); } -static void binder_insert_allocated_buffer(struct binder_proc *proc, - struct binder_buffer *new_buffer) +/** + * binder_select_thread_ilocked() - selects a thread for doing proc work. + * @proc: process to select a thread from + * + * Note that calling this function moves the thread off the waiting_threads + * list, so it can only be woken up by the caller of this function, or a + * signal. Therefore, callers *should* always wake up the thread this function + * returns. + * + * Return: If there's a thread currently waiting for process work, + * returns that thread. Otherwise returns NULL. + */ +static struct binder_thread * +binder_select_thread_ilocked(struct binder_proc *proc) { - struct rb_node **p = &proc->allocated_buffers.rb_node; - struct rb_node *parent = NULL; - struct binder_buffer *buffer; + struct binder_thread *thread; - BUG_ON(new_buffer->free); + assert_spin_locked(&proc->inner_lock); + thread = list_first_entry_or_null(&proc->waiting_threads, + struct binder_thread, + waiting_thread_node); - while (*p) { - parent = *p; - buffer = rb_entry(parent, struct binder_buffer, rb_node); - BUG_ON(buffer->free); + if (thread) + list_del_init(&thread->waiting_thread_node); - if (new_buffer < buffer) - p = &parent->rb_left; - else if (new_buffer > buffer) - p = &parent->rb_right; - else - BUG(); - } - rb_link_node(&new_buffer->rb_node, parent, p); - rb_insert_color(&new_buffer->rb_node, &proc->allocated_buffers); + return thread; } -static struct binder_buffer *binder_buffer_lookup(struct binder_proc *proc, - uintptr_t user_ptr) +/** + * binder_wakeup_thread_ilocked() - wakes up a thread for doing proc work. + * @proc: process to wake up a thread in + * @thread: specific thread to wake-up (may be NULL) + * @sync: whether to do a synchronous wake-up + * + * This function wakes up a thread in the @proc process. + * The caller may provide a specific thread to wake-up in + * the @thread parameter. If @thread is NULL, this function + * will wake up threads that have called poll(). + * + * Note that for this function to work as expected, callers + * should first call binder_select_thread() to find a thread + * to handle the work (if they don't have a thread already), + * and pass the result into the @thread parameter. + */ +static void binder_wakeup_thread_ilocked(struct binder_proc *proc, + struct binder_thread *thread, + bool sync) { - struct rb_node *n = proc->allocated_buffers.rb_node; - struct binder_buffer *buffer; - struct binder_buffer *kern_ptr; + assert_spin_locked(&proc->inner_lock); - kern_ptr = (struct binder_buffer *)(user_ptr - proc->user_buffer_offset - - offsetof(struct binder_buffer, data)); - - while (n) { - buffer = rb_entry(n, struct binder_buffer, rb_node); - BUG_ON(buffer->free); - - if (kern_ptr < buffer) - n = n->rb_left; - else if (kern_ptr > buffer) - n = n->rb_right; + if (thread) { + if (sync) + wake_up_interruptible_sync(&thread->wait); else - return buffer; + wake_up_interruptible(&thread->wait); + return; } - return NULL; + + /* Didn't find a thread waiting for proc work; this can happen + * in two scenarios: + * 1. All threads are busy handling transactions + * In that case, one of those threads should call back into + * the kernel driver soon and pick up this work. + * 2. Threads are using the (e)poll interface, in which case + * they may be blocked on the waitqueue without having been + * added to waiting_threads. For this case, we just iterate + * over all threads not handling transaction work, and + * wake them all up. We wake all because we don't know whether + * a thread that called into (e)poll is handling non-binder + * work currently. + */ + binder_wakeup_poll_threads_ilocked(proc, sync); } -static int binder_update_page_range(struct binder_proc *proc, int allocate, - void *start, void *end, - struct vm_area_struct *vma) +static void binder_wakeup_proc_ilocked(struct binder_proc *proc) { - void *page_addr; - unsigned long user_page_addr; - struct page **page; - struct mm_struct *mm; - - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: %s pages %p-%p\n", proc->pid, - allocate ? "allocate" : "free", start, end); + struct binder_thread *thread = binder_select_thread_ilocked(proc); - if (end <= start) - return 0; + binder_wakeup_thread_ilocked(proc, thread, /* sync = */false); +} - trace_binder_update_page_range(proc, allocate, start, end); +static bool is_rt_policy(int policy) +{ + return policy == SCHED_FIFO || policy == SCHED_RR; +} - if (vma) - mm = NULL; - else - mm = get_task_mm(proc->tsk); +static bool is_fair_policy(int policy) +{ + return policy == SCHED_NORMAL || policy == SCHED_BATCH; +} - if (mm) { - down_write(&mm->mmap_sem); - vma = proc->vma; - if (vma && mm != proc->vma_vm_mm) { - pr_err("%d: vma mm and task mm mismatch\n", - proc->pid); - vma = NULL; - } - } +static bool binder_supported_policy(int policy) +{ + return is_fair_policy(policy) || is_rt_policy(policy); +} - if (allocate == 0) - goto free_range; +static int to_userspace_prio(int policy, int kernel_priority) +{ + if (is_fair_policy(policy)) + return PRIO_TO_NICE(kernel_priority); + else + return MAX_USER_RT_PRIO - 1 - kernel_priority; +} - if (vma == NULL) { - pr_err("%d: binder_alloc_buf failed to map pages in userspace, no vma\n", - proc->pid); - goto err_no_vma; - } +static int to_kernel_prio(int policy, int user_priority) +{ + if (is_fair_policy(policy)) + return NICE_TO_PRIO(user_priority); + else + return MAX_USER_RT_PRIO - 1 - user_priority; +} - for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) { - int ret; +static void binder_do_set_priority(struct task_struct *task, + struct binder_priority desired, + bool verify) +{ + int priority; /* user-space prio value */ + bool has_cap_nice; + unsigned int policy = desired.sched_policy; - page = &proc->pages[(page_addr - proc->buffer) / PAGE_SIZE]; - - BUG_ON(*page); - *page = alloc_page(GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO); - if (*page == NULL) { - pr_err("%d: binder_alloc_buf failed for page at %p\n", - proc->pid, page_addr); - goto err_alloc_page_failed; - } - ret = map_kernel_range_noflush((unsigned long)page_addr, - PAGE_SIZE, PAGE_KERNEL, page); - flush_cache_vmap((unsigned long)page_addr, - (unsigned long)page_addr + PAGE_SIZE); - if (ret != 1) { - pr_err("%d: binder_alloc_buf failed to map page at %p in kernel\n", - proc->pid, page_addr); - goto err_map_kernel_failed; - } - user_page_addr = - (uintptr_t)page_addr + proc->user_buffer_offset; - ret = vm_insert_page(vma, user_page_addr, page[0]); - if (ret) { - pr_err("%d: binder_alloc_buf failed to map page at %lx in userspace\n", - proc->pid, user_page_addr); - goto err_vm_insert_page_failed; - } - /* vm_insert_page does not seem to increment the refcount */ - } - if (mm) { - up_write(&mm->mmap_sem); - mmput(mm); - } - return 0; + if (task->policy == policy && task->normal_prio == desired.prio) + return; -free_range: - for (page_addr = end - PAGE_SIZE; page_addr >= start; - page_addr -= PAGE_SIZE) { - page = &proc->pages[(page_addr - proc->buffer) / PAGE_SIZE]; - if (vma) - zap_page_range(vma, (uintptr_t)page_addr + - proc->user_buffer_offset, PAGE_SIZE, NULL); -err_vm_insert_page_failed: - unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE); -err_map_kernel_failed: - __free_page(*page); - *page = NULL; -err_alloc_page_failed: - ; - } -err_no_vma: - if (mm) { - up_write(&mm->mmap_sem); - mmput(mm); - } - return -ENOMEM; -} - -static struct binder_buffer *binder_alloc_buf(struct binder_proc *proc, - size_t data_size, - size_t offsets_size, int is_async) -{ - struct rb_node *n = proc->free_buffers.rb_node; - struct binder_buffer *buffer; - size_t buffer_size; - struct rb_node *best_fit = NULL; - void *has_page_addr; - void *end_page_addr; - size_t size; - - if (proc->vma == NULL) { - pr_err("%d: binder_alloc_buf, no vma\n", - proc->pid); - return NULL; - } + has_cap_nice = has_capability_noaudit(task, CAP_SYS_NICE); - size = ALIGN(data_size, sizeof(void *)) + - ALIGN(offsets_size, sizeof(void *)); + priority = to_userspace_prio(policy, desired.prio); - if (size < data_size || size < offsets_size) { - binder_user_error("%d: got transaction with invalid size %zd-%zd\n", - proc->pid, data_size, offsets_size); - return NULL; - } + if (verify && is_rt_policy(policy) && !has_cap_nice) { + long max_rtprio = task_rlimit(task, RLIMIT_RTPRIO); - if (is_async && - proc->free_async_space < size + sizeof(struct binder_buffer)) { - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_alloc_buf size %zd failed, no async space left\n", - proc->pid, size); - return NULL; + if (max_rtprio == 0) { + policy = SCHED_NORMAL; + priority = MIN_NICE; + } else if (priority > max_rtprio) { + priority = max_rtprio; + } } - while (n) { - buffer = rb_entry(n, struct binder_buffer, rb_node); - BUG_ON(!buffer->free); - buffer_size = binder_buffer_size(proc, buffer); + if (verify && is_fair_policy(policy) && !has_cap_nice) { + long min_nice = rlimit_to_nice(task_rlimit(task, RLIMIT_NICE)); - if (size < buffer_size) { - best_fit = n; - n = n->rb_left; - } else if (size > buffer_size) - n = n->rb_right; - else { - best_fit = n; - break; + if (min_nice > MAX_NICE) { + binder_user_error("%d RLIMIT_NICE not set\n", + task->pid); + return; + } else if (priority < min_nice) { + priority = min_nice; } } - if (best_fit == NULL) { - pr_err("%d: binder_alloc_buf size %zd failed, no address space\n", - proc->pid, size); - return NULL; - } - if (n == NULL) { - buffer = rb_entry(best_fit, struct binder_buffer, rb_node); - buffer_size = binder_buffer_size(proc, buffer); - } - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_alloc_buf size %zd got buffer %p size %zd\n", - proc->pid, size, buffer, buffer_size); + if (policy != desired.sched_policy || + to_kernel_prio(policy, priority) != desired.prio) + binder_debug(BINDER_DEBUG_PRIORITY_CAP, + "%d: priority %d not allowed, using %d instead\n", + task->pid, desired.prio, + to_kernel_prio(policy, priority)); - has_page_addr = - (void *)(((uintptr_t)buffer->data + buffer_size) & PAGE_MASK); - if (n == NULL) { - if (size + sizeof(struct binder_buffer) + 4 >= buffer_size) - buffer_size = size; /* no room for other buffers */ - else - buffer_size = size + sizeof(struct binder_buffer); - } - end_page_addr = - (void *)PAGE_ALIGN((uintptr_t)buffer->data + buffer_size); - if (end_page_addr > has_page_addr) - end_page_addr = has_page_addr; - if (binder_update_page_range(proc, 1, - (void *)PAGE_ALIGN((uintptr_t)buffer->data), end_page_addr, NULL)) - return NULL; + trace_binder_set_priority(task->tgid, task->pid, task->normal_prio, + to_kernel_prio(policy, priority), + desired.prio); - rb_erase(best_fit, &proc->free_buffers); - buffer->free = 0; - binder_insert_allocated_buffer(proc, buffer); - if (buffer_size != size) { - struct binder_buffer *new_buffer = (void *)buffer->data + size; + /* Set the actual priority */ + if (task->policy != policy || is_rt_policy(policy)) { + struct sched_param params; - list_add(&new_buffer->entry, &buffer->entry); - new_buffer->free = 1; - binder_insert_free_buffer(proc, new_buffer); - } - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_alloc_buf size %zd got %p\n", - proc->pid, size, buffer); - buffer->data_size = data_size; - buffer->offsets_size = offsets_size; - buffer->async_transaction = is_async; - if (is_async) { - proc->free_async_space -= size + sizeof(struct binder_buffer); - binder_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, - "%d: binder_alloc_buf size %zd async free %zd\n", - proc->pid, size, proc->free_async_space); - } + params.sched_priority = is_rt_policy(policy) ? priority : 0; - return buffer; + sched_setscheduler_nocheck(task, + policy | SCHED_RESET_ON_FORK, + ¶ms); + } + if (is_fair_policy(policy)) + set_user_nice(task, priority); } -static void *buffer_start_page(struct binder_buffer *buffer) +static void binder_set_priority(struct task_struct *task, + struct binder_priority desired) { - return (void *)((uintptr_t)buffer & PAGE_MASK); + binder_do_set_priority(task, desired, /* verify = */ true); } -static void *buffer_end_page(struct binder_buffer *buffer) +static void binder_restore_priority(struct task_struct *task, + struct binder_priority desired) { - return (void *)(((uintptr_t)(buffer + 1) - 1) & PAGE_MASK); + binder_do_set_priority(task, desired, /* verify = */ false); } -static void binder_delete_free_buffer(struct binder_proc *proc, - struct binder_buffer *buffer) +static void binder_transaction_priority(struct task_struct *task, + struct binder_transaction *t, + struct binder_priority node_prio, + bool inherit_rt) { - struct binder_buffer *prev, *next = NULL; - int free_page_end = 1; - int free_page_start = 1; + struct binder_priority desired_prio = t->priority; - BUG_ON(proc->buffers.next == &buffer->entry); - prev = list_entry(buffer->entry.prev, struct binder_buffer, entry); - BUG_ON(!prev->free); - if (buffer_end_page(prev) == buffer_start_page(buffer)) { - free_page_start = 0; - if (buffer_end_page(prev) == buffer_end_page(buffer)) - free_page_end = 0; - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: merge free, buffer %p share page with %p\n", - proc->pid, buffer, prev); - } + if (t->set_priority_called) + return; - if (!list_is_last(&buffer->entry, &proc->buffers)) { - next = list_entry(buffer->entry.next, - struct binder_buffer, entry); - if (buffer_start_page(next) == buffer_end_page(buffer)) { - free_page_end = 0; - if (buffer_start_page(next) == - buffer_start_page(buffer)) - free_page_start = 0; - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: merge free, buffer %p share page with %p\n", - proc->pid, buffer, prev); - } + t->set_priority_called = true; + t->saved_priority.sched_policy = task->policy; + t->saved_priority.prio = task->normal_prio; + + if (!inherit_rt && is_rt_policy(desired_prio.sched_policy)) { + desired_prio.prio = NICE_TO_PRIO(0); + desired_prio.sched_policy = SCHED_NORMAL; } - list_del(&buffer->entry); - if (free_page_start || free_page_end) { - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: merge free, buffer %p do not share page%s%s with %p or %p\n", - proc->pid, buffer, free_page_start ? "" : " end", - free_page_end ? "" : " start", prev, next); - binder_update_page_range(proc, 0, free_page_start ? - buffer_start_page(buffer) : buffer_end_page(buffer), - (free_page_end ? buffer_end_page(buffer) : - buffer_start_page(buffer)) + PAGE_SIZE, NULL); + + if (node_prio.prio < t->priority.prio || + (node_prio.prio == t->priority.prio && + node_prio.sched_policy == SCHED_FIFO)) { + /* + * In case the minimum priority on the node is + * higher (lower value), use that priority. If + * the priority is the same, but the node uses + * SCHED_FIFO, prefer SCHED_FIFO, since it can + * run unbounded, unlike SCHED_RR. + */ + desired_prio = node_prio; } + + binder_set_priority(task, desired_prio); } -static void binder_free_buf(struct binder_proc *proc, - struct binder_buffer *buffer) +static struct binder_node *binder_get_node_ilocked(struct binder_proc *proc, + binder_uintptr_t ptr) { - size_t size, buffer_size; + struct rb_node *n = proc->nodes.rb_node; + struct binder_node *node; - buffer_size = binder_buffer_size(proc, buffer); + assert_spin_locked(&proc->inner_lock); - size = ALIGN(buffer->data_size, sizeof(void *)) + - ALIGN(buffer->offsets_size, sizeof(void *)); + while (n) { + node = rb_entry(n, struct binder_node, rb_node); - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%d: binder_free_buf %p size %zd buffer_size %zd\n", - proc->pid, buffer, size, buffer_size); - - BUG_ON(buffer->free); - BUG_ON(size > buffer_size); - BUG_ON(buffer->transaction != NULL); - BUG_ON((void *)buffer < proc->buffer); - BUG_ON((void *)buffer > proc->buffer + proc->buffer_size); - - if (buffer->async_transaction) { - proc->free_async_space += size + sizeof(struct binder_buffer); - - binder_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, - "%d: binder_free_buf size %zd async free %zd\n", - proc->pid, size, proc->free_async_space); - } - - binder_update_page_range(proc, 0, - (void *)PAGE_ALIGN((uintptr_t)buffer->data), - (void *)(((uintptr_t)buffer->data + buffer_size) & PAGE_MASK), - NULL); - rb_erase(&buffer->rb_node, &proc->allocated_buffers); - buffer->free = 1; - if (!list_is_last(&buffer->entry, &proc->buffers)) { - struct binder_buffer *next = list_entry(buffer->entry.next, - struct binder_buffer, entry); - - if (next->free) { - rb_erase(&next->rb_node, &proc->free_buffers); - binder_delete_free_buffer(proc, next); - } - } - if (proc->buffers.next != &buffer->entry) { - struct binder_buffer *prev = list_entry(buffer->entry.prev, - struct binder_buffer, entry); - - if (prev->free) { - binder_delete_free_buffer(proc, buffer); - rb_erase(&prev->rb_node, &proc->free_buffers); - buffer = prev; + if (ptr < node->ptr) + n = n->rb_left; + else if (ptr > node->ptr) + n = n->rb_right; + else { + /* + * take an implicit weak reference + * to ensure node stays alive until + * call to binder_put_node() + */ + binder_inc_node_tmpref_ilocked(node); + return node; } } - binder_insert_free_buffer(proc, buffer); + return NULL; } static struct binder_node *binder_get_node(struct binder_proc *proc, binder_uintptr_t ptr) { - struct rb_node *n = proc->nodes.rb_node; struct binder_node *node; - while (n) { - node = rb_entry(n, struct binder_node, rb_node); - - if (ptr < node->ptr) - n = n->rb_left; - else if (ptr > node->ptr) - n = n->rb_right; - else - return node; - } - return NULL; + binder_inner_proc_lock(proc); + node = binder_get_node_ilocked(proc, ptr); + binder_inner_proc_unlock(proc); + return node; } -static struct binder_node *binder_new_node(struct binder_proc *proc, - binder_uintptr_t ptr, - binder_uintptr_t cookie) +static struct binder_node *binder_init_node_ilocked( + struct binder_proc *proc, + struct binder_node *new_node, + struct flat_binder_object *fp) { struct rb_node **p = &proc->nodes.rb_node; struct rb_node *parent = NULL; struct binder_node *node; + binder_uintptr_t ptr = fp ? fp->binder : 0; + binder_uintptr_t cookie = fp ? fp->cookie : 0; + __u32 flags = fp ? fp->flags : 0; + s8 priority; + + assert_spin_locked(&proc->inner_lock); while (*p) { + parent = *p; node = rb_entry(parent, struct binder_node, rb_node); @@ -895,39 +1278,87 @@ static struct binder_node *binder_new_node(struct binder_proc *proc, p = &(*p)->rb_left; else if (ptr > node->ptr) p = &(*p)->rb_right; - else - return NULL; + else { + /* + * A matching node is already in + * the rb tree. Abandon the init + * and return it. + */ + binder_inc_node_tmpref_ilocked(node); + return node; + } } - - node = kzalloc(sizeof(*node), GFP_KERNEL); - if (node == NULL) - return NULL; + node = new_node; binder_stats_created(BINDER_STAT_NODE); + node->tmp_refs++; rb_link_node(&node->rb_node, parent, p); rb_insert_color(&node->rb_node, &proc->nodes); - node->debug_id = ++binder_last_id; + node->debug_id = atomic_inc_return(&binder_last_id); node->proc = proc; node->ptr = ptr; node->cookie = cookie; node->work.type = BINDER_WORK_NODE; + priority = flags & FLAT_BINDER_FLAG_PRIORITY_MASK; + node->sched_policy = (flags & FLAT_BINDER_FLAG_SCHED_POLICY_MASK) >> + FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT; + node->min_priority = to_kernel_prio(node->sched_policy, priority); + node->accept_fds = !!(flags & FLAT_BINDER_FLAG_ACCEPTS_FDS); +/* node->inherit_rt = !!(flags & FLAT_BINDER_FLAG_INHERIT_RT);*/ + node->inherit_rt = true; + spin_lock_init(&node->lock); INIT_LIST_HEAD(&node->work.entry); INIT_LIST_HEAD(&node->async_todo); binder_debug(BINDER_DEBUG_INTERNAL_REFS, "%d:%d node %d u%016llx c%016llx created\n", proc->pid, current->pid, node->debug_id, (u64)node->ptr, (u64)node->cookie); + return node; } -static int binder_inc_node(struct binder_node *node, int strong, int internal, - struct list_head *target_list) +static struct binder_node *binder_new_node(struct binder_proc *proc, + struct flat_binder_object *fp) +{ + struct binder_node *node; + struct binder_node *new_node = kzalloc(sizeof(*node), GFP_KERNEL); + + if (!new_node) + return NULL; + binder_inner_proc_lock(proc); + node = binder_init_node_ilocked(proc, new_node, fp); + binder_inner_proc_unlock(proc); + if (node != new_node) + /* + * The node was already added by another thread + */ + kfree(new_node); + + return node; +} + +static void binder_free_node(struct binder_node *node) +{ + kfree(node); + binder_stats_deleted(BINDER_STAT_NODE); +} + +static int binder_inc_node_nilocked(struct binder_node *node, int strong, + int internal, + struct list_head *target_list) { + struct binder_proc *proc = node->proc; + + assert_spin_locked(&node->lock); + if (proc) + assert_spin_locked(&proc->inner_lock); if (strong) { if (internal) { if (target_list == NULL && node->internal_strong_refs == 0 && - !(node == binder_context_mgr_node && - node->has_strong_ref)) { + !(node->proc && + node == node->proc->context-> + binder_context_mgr_node && + node->has_strong_ref)) { pr_err("invalid inc strong node for %d\n", node->debug_id); return -EINVAL; @@ -936,8 +1367,8 @@ static int binder_inc_node(struct binder_node *node, int strong, int internal, } else node->local_strong_refs++; if (!node->has_strong_ref && target_list) { - list_del_init(&node->work.entry); - list_add_tail(&node->work.entry, target_list); + binder_dequeue_work_ilocked(&node->work); + binder_enqueue_work_ilocked(&node->work, target_list); } } else { if (!internal) @@ -948,58 +1379,169 @@ static int binder_inc_node(struct binder_node *node, int strong, int internal, node->debug_id); return -EINVAL; } - list_add_tail(&node->work.entry, target_list); + binder_enqueue_work_ilocked(&node->work, target_list); } } return 0; } -static int binder_dec_node(struct binder_node *node, int strong, int internal) +static int binder_inc_node(struct binder_node *node, int strong, int internal, + struct list_head *target_list) +{ + int ret; + + binder_node_inner_lock(node); + ret = binder_inc_node_nilocked(node, strong, internal, target_list); + binder_node_inner_unlock(node); + + return ret; +} + +static bool binder_dec_node_nilocked(struct binder_node *node, + int strong, int internal) { + struct binder_proc *proc = node->proc; + + assert_spin_locked(&node->lock); + if (proc) + assert_spin_locked(&proc->inner_lock); if (strong) { if (internal) node->internal_strong_refs--; else node->local_strong_refs--; if (node->local_strong_refs || node->internal_strong_refs) - return 0; + return false; } else { if (!internal) node->local_weak_refs--; - if (node->local_weak_refs || !hlist_empty(&node->refs)) - return 0; + if (node->local_weak_refs || node->tmp_refs || + !hlist_empty(&node->refs)) + return false; } - if (node->proc && (node->has_strong_ref || node->has_weak_ref)) { + + if (proc && (node->has_strong_ref || node->has_weak_ref)) { if (list_empty(&node->work.entry)) { - list_add_tail(&node->work.entry, &node->proc->todo); - wake_up_interruptible(&node->proc->wait); + binder_enqueue_work_ilocked(&node->work, &proc->todo); + binder_wakeup_proc_ilocked(proc); } } else { if (hlist_empty(&node->refs) && !node->local_strong_refs && - !node->local_weak_refs) { - list_del_init(&node->work.entry); - if (node->proc) { - rb_erase(&node->rb_node, &node->proc->nodes); + !node->local_weak_refs && !node->tmp_refs) { + if (proc) { + binder_dequeue_work_ilocked(&node->work); + rb_erase(&node->rb_node, &proc->nodes); binder_debug(BINDER_DEBUG_INTERNAL_REFS, "refless node %d deleted\n", node->debug_id); } else { + BUG_ON(!list_empty(&node->work.entry)); + spin_lock(&binder_dead_nodes_lock); + /* + * tmp_refs could have changed so + * check it again + */ + if (node->tmp_refs) { + spin_unlock(&binder_dead_nodes_lock); + return false; + } hlist_del(&node->dead_node); + spin_unlock(&binder_dead_nodes_lock); binder_debug(BINDER_DEBUG_INTERNAL_REFS, "dead node %d deleted\n", node->debug_id); } - kfree(node); - binder_stats_deleted(BINDER_STAT_NODE); + return true; } } + return false; +} - return 0; +static void binder_dec_node(struct binder_node *node, int strong, int internal) +{ + bool free_node; + + binder_node_inner_lock(node); + free_node = binder_dec_node_nilocked(node, strong, internal); + binder_node_inner_unlock(node); + if (free_node) + binder_free_node(node); +} + +static void binder_inc_node_tmpref_ilocked(struct binder_node *node) +{ + /* + * No call to binder_inc_node() is needed since we + * don't need to inform userspace of any changes to + * tmp_refs + */ + node->tmp_refs++; +} + +/** + * binder_inc_node_tmpref() - take a temporary reference on node + * @node: node to reference + * + * Take reference on node to prevent the node from being freed + * while referenced only by a local variable. The inner lock is + * needed to serialize with the node work on the queue (which + * isn't needed after the node is dead). If the node is dead + * (node->proc is NULL), use binder_dead_nodes_lock to protect + * node->tmp_refs against dead-node-only cases where the node + * lock cannot be acquired (eg traversing the dead node list to + * print nodes) + */ +static void binder_inc_node_tmpref(struct binder_node *node) +{ + binder_node_lock(node); + if (node->proc) + binder_inner_proc_lock(node->proc); + else + spin_lock(&binder_dead_nodes_lock); + binder_inc_node_tmpref_ilocked(node); + if (node->proc) + binder_inner_proc_unlock(node->proc); + else + spin_unlock(&binder_dead_nodes_lock); + binder_node_unlock(node); } +/** + * binder_dec_node_tmpref() - remove a temporary reference on node + * @node: node to reference + * + * Release temporary reference on node taken via binder_inc_node_tmpref() + */ +static void binder_dec_node_tmpref(struct binder_node *node) +{ + bool free_node; + + binder_node_inner_lock(node); + if (!node->proc) + spin_lock(&binder_dead_nodes_lock); + node->tmp_refs--; + BUG_ON(node->tmp_refs < 0); + if (!node->proc) + spin_unlock(&binder_dead_nodes_lock); + /* + * Call binder_dec_node() to check if all refcounts are 0 + * and cleanup is needed. Calling with strong=0 and internal=1 + * causes no actual reference to be released in binder_dec_node(). + * If that changes, a change is needed here too. + */ + free_node = binder_dec_node_nilocked(node, 0, 1); + binder_node_inner_unlock(node); + if (free_node) + binder_free_node(node); +} + +static void binder_put_node(struct binder_node *node) +{ + binder_dec_node_tmpref(node); +} -static struct binder_ref *binder_get_ref(struct binder_proc *proc, - uint32_t desc) +static struct binder_ref *binder_get_ref_olocked(struct binder_proc *proc, + u32 desc, bool need_strong_ref) { struct rb_node *n = proc->refs_by_desc.rb_node; struct binder_ref *ref; @@ -1007,23 +1549,48 @@ static struct binder_ref *binder_get_ref(struct binder_proc *proc, while (n) { ref = rb_entry(n, struct binder_ref, rb_node_desc); - if (desc < ref->desc) + if (desc < ref->data.desc) { n = n->rb_left; - else if (desc > ref->desc) + } else if (desc > ref->data.desc) { n = n->rb_right; - else + } else if (need_strong_ref && !ref->data.strong) { + binder_user_error("tried to use weak ref as strong ref\n"); + return NULL; + } else { return ref; + } } return NULL; } -static struct binder_ref *binder_get_ref_for_node(struct binder_proc *proc, - struct binder_node *node) +/** + * binder_get_ref_for_node_olocked() - get the ref associated with given node + * @proc: binder_proc that owns the ref + * @node: binder_node of target + * @new_ref: newly allocated binder_ref to be initialized or %NULL + * + * Look up the ref for the given node and return it if it exists + * + * If it doesn't exist and the caller provides a newly allocated + * ref, initialize the fields of the newly allocated ref and insert + * into the given proc rb_trees and node refs list. + * + * Return: the ref for node. It is possible that another thread + * allocated/initialized the ref first in which case the + * returned ref would be different than the passed-in + * new_ref. new_ref must be kfree'd by the caller in + * this case. + */ +static struct binder_ref *binder_get_ref_for_node_olocked( + struct binder_proc *proc, + struct binder_node *node, + struct binder_ref *new_ref) { - struct rb_node *n; + struct binder_context *context = proc->context; struct rb_node **p = &proc->refs_by_node.rb_node; struct rb_node *parent = NULL; - struct binder_ref *ref, *new_ref; + struct binder_ref *ref; + struct rb_node *n; while (*p) { parent = *p; @@ -1036,22 +1603,22 @@ static struct binder_ref *binder_get_ref_for_node(struct binder_proc *proc, else return ref; } - new_ref = kzalloc(sizeof(*ref), GFP_KERNEL); - if (new_ref == NULL) + if (!new_ref) return NULL; + binder_stats_created(BINDER_STAT_REF); - new_ref->debug_id = ++binder_last_id; + new_ref->data.debug_id = atomic_inc_return(&binder_last_id); new_ref->proc = proc; new_ref->node = node; rb_link_node(&new_ref->rb_node_node, parent, p); rb_insert_color(&new_ref->rb_node_node, &proc->refs_by_node); - new_ref->desc = (node == binder_context_mgr_node) ? 0 : 1; + new_ref->data.desc = (node == context->binder_context_mgr_node) ? 0 : 1; for (n = rb_first(&proc->refs_by_desc); n != NULL; n = rb_next(n)) { ref = rb_entry(n, struct binder_ref, rb_node_desc); - if (ref->desc > new_ref->desc) + if (ref->data.desc > new_ref->data.desc) break; - new_ref->desc = ref->desc + 1; + new_ref->data.desc = ref->data.desc + 1; } p = &proc->refs_by_desc.rb_node; @@ -1059,306 +1626,1252 @@ static struct binder_ref *binder_get_ref_for_node(struct binder_proc *proc, parent = *p; ref = rb_entry(parent, struct binder_ref, rb_node_desc); - if (new_ref->desc < ref->desc) + if (new_ref->data.desc < ref->data.desc) p = &(*p)->rb_left; - else if (new_ref->desc > ref->desc) + else if (new_ref->data.desc > ref->data.desc) p = &(*p)->rb_right; else BUG(); } rb_link_node(&new_ref->rb_node_desc, parent, p); rb_insert_color(&new_ref->rb_node_desc, &proc->refs_by_desc); - if (node) { - hlist_add_head(&new_ref->node_entry, &node->refs); - binder_debug(BINDER_DEBUG_INTERNAL_REFS, - "%d new ref %d desc %d for node %d\n", - proc->pid, new_ref->debug_id, new_ref->desc, - node->debug_id); - } else { - binder_debug(BINDER_DEBUG_INTERNAL_REFS, - "%d new ref %d desc %d for dead node\n", - proc->pid, new_ref->debug_id, new_ref->desc); - } + binder_node_lock(node); + hlist_add_head(&new_ref->node_entry, &node->refs); + + binder_debug(BINDER_DEBUG_INTERNAL_REFS, + "%d new ref %d desc %d for node %d\n", + proc->pid, new_ref->data.debug_id, new_ref->data.desc, + node->debug_id); + binder_node_unlock(node); return new_ref; } -static void binder_delete_ref(struct binder_ref *ref) +static void binder_cleanup_ref_olocked(struct binder_ref *ref) { + bool delete_node = false; + binder_debug(BINDER_DEBUG_INTERNAL_REFS, "%d delete ref %d desc %d for node %d\n", - ref->proc->pid, ref->debug_id, ref->desc, + ref->proc->pid, ref->data.debug_id, ref->data.desc, ref->node->debug_id); rb_erase(&ref->rb_node_desc, &ref->proc->refs_by_desc); rb_erase(&ref->rb_node_node, &ref->proc->refs_by_node); - if (ref->strong) - binder_dec_node(ref->node, 1, 1); + + binder_node_inner_lock(ref->node); + if (ref->data.strong) + binder_dec_node_nilocked(ref->node, 1, 1); + hlist_del(&ref->node_entry); - binder_dec_node(ref->node, 0, 1); + delete_node = binder_dec_node_nilocked(ref->node, 0, 1); + binder_node_inner_unlock(ref->node); + /* + * Clear ref->node unless we want the caller to free the node + */ + if (!delete_node) { + /* + * The caller uses ref->node to determine + * whether the node needs to be freed. Clear + * it since the node is still alive. + */ + ref->node = NULL; + } + if (ref->death) { binder_debug(BINDER_DEBUG_DEAD_BINDER, "%d delete ref %d desc %d has death notification\n", - ref->proc->pid, ref->debug_id, ref->desc); - list_del(&ref->death->work.entry); - kfree(ref->death); + ref->proc->pid, ref->data.debug_id, + ref->data.desc); + binder_dequeue_work(ref->proc, &ref->death->work); binder_stats_deleted(BINDER_STAT_DEATH); } - kfree(ref); binder_stats_deleted(BINDER_STAT_REF); } -static int binder_inc_ref(struct binder_ref *ref, int strong, - struct list_head *target_list) +/** + * binder_inc_ref_olocked() - increment the ref for given handle + * @ref: ref to be incremented + * @strong: if true, strong increment, else weak + * @target_list: list to queue node work on + * + * Increment the ref. @ref->proc->outer_lock must be held on entry + * + * Return: 0, if successful, else errno + */ +static int binder_inc_ref_olocked(struct binder_ref *ref, int strong, + struct list_head *target_list) { int ret; if (strong) { - if (ref->strong == 0) { + if (ref->data.strong == 0) { ret = binder_inc_node(ref->node, 1, 1, target_list); if (ret) return ret; } - ref->strong++; + ref->data.strong++; } else { - if (ref->weak == 0) { + if (ref->data.weak == 0) { ret = binder_inc_node(ref->node, 0, 1, target_list); if (ret) return ret; } - ref->weak++; + ref->data.weak++; } return 0; } - -static int binder_dec_ref(struct binder_ref *ref, int strong) +/** + * binder_dec_ref() - dec the ref for given handle + * @ref: ref to be decremented + * @strong: if true, strong decrement, else weak + * + * Decrement the ref. + * + * Return: true if ref is cleaned up and ready to be freed + */ +static bool binder_dec_ref_olocked(struct binder_ref *ref, int strong) { if (strong) { - if (ref->strong == 0) { + if (ref->data.strong == 0) { binder_user_error("%d invalid dec strong, ref %d desc %d s %d w %d\n", - ref->proc->pid, ref->debug_id, - ref->desc, ref->strong, ref->weak); - return -EINVAL; + ref->proc->pid, ref->data.debug_id, + ref->data.desc, ref->data.strong, + ref->data.weak); + return false; } - ref->strong--; - if (ref->strong == 0) { - int ret; + ref->data.strong--; + if (ref->data.strong == 0) + binder_dec_node(ref->node, strong, 1); + } else { + if (ref->data.weak == 0) { + binder_user_error("%d invalid dec weak, ref %d desc %d s %d w %d\n", + ref->proc->pid, ref->data.debug_id, + ref->data.desc, ref->data.strong, + ref->data.weak); + return false; + } + ref->data.weak--; + } + if (ref->data.strong == 0 && ref->data.weak == 0) { + binder_cleanup_ref_olocked(ref); + return true; + } + return false; +} - ret = binder_dec_node(ref->node, strong, 1); - if (ret) - return ret; +/** + * binder_get_node_from_ref() - get the node from the given proc/desc + * @proc: proc containing the ref + * @desc: the handle associated with the ref + * @need_strong_ref: if true, only return node if ref is strong + * @rdata: the id/refcount data for the ref + * + * Given a proc and ref handle, return the associated binder_node + * + * Return: a binder_node or NULL if not found or not strong when strong required + */ +static struct binder_node *binder_get_node_from_ref( + struct binder_proc *proc, + u32 desc, bool need_strong_ref, + struct binder_ref_data *rdata) +{ + struct binder_node *node; + struct binder_ref *ref; + + binder_proc_lock(proc); + ref = binder_get_ref_olocked(proc, desc, need_strong_ref); + if (!ref) + goto err_no_ref; + node = ref->node; + /* + * Take an implicit reference on the node to ensure + * it stays alive until the call to binder_put_node() + */ + binder_inc_node_tmpref(node); + if (rdata) + *rdata = ref->data; + binder_proc_unlock(proc); + + return node; + +err_no_ref: + binder_proc_unlock(proc); + return NULL; +} + +/** + * binder_free_ref() - free the binder_ref + * @ref: ref to free + * + * Free the binder_ref. Free the binder_node indicated by ref->node + * (if non-NULL) and the binder_ref_death indicated by ref->death. + */ +static void binder_free_ref(struct binder_ref *ref) +{ + if (ref->node) + binder_free_node(ref->node); + kfree(ref->death); + kfree(ref); +} + +/** + * binder_update_ref_for_handle() - inc/dec the ref for given handle + * @proc: proc containing the ref + * @desc: the handle associated with the ref + * @increment: true=inc reference, false=dec reference + * @strong: true=strong reference, false=weak reference + * @rdata: the id/refcount data for the ref + * + * Given a proc and ref handle, increment or decrement the ref + * according to "increment" arg. + * + * Return: 0 if successful, else errno + */ +static int binder_update_ref_for_handle(struct binder_proc *proc, + uint32_t desc, bool increment, bool strong, + struct binder_ref_data *rdata) +{ + int ret = 0; + struct binder_ref *ref; + bool delete_ref = false; + + binder_proc_lock(proc); + ref = binder_get_ref_olocked(proc, desc, strong); + if (!ref) { + ret = -EINVAL; + goto err_no_ref; + } + if (increment) + ret = binder_inc_ref_olocked(ref, strong, NULL); + else + delete_ref = binder_dec_ref_olocked(ref, strong); + + if (rdata) + *rdata = ref->data; + binder_proc_unlock(proc); + + if (delete_ref) + binder_free_ref(ref); + return ret; + +err_no_ref: + binder_proc_unlock(proc); + return ret; +} + +/** + * binder_dec_ref_for_handle() - dec the ref for given handle + * @proc: proc containing the ref + * @desc: the handle associated with the ref + * @strong: true=strong reference, false=weak reference + * @rdata: the id/refcount data for the ref + * + * Just calls binder_update_ref_for_handle() to decrement the ref. + * + * Return: 0 if successful, else errno + */ +static int binder_dec_ref_for_handle(struct binder_proc *proc, + uint32_t desc, bool strong, struct binder_ref_data *rdata) +{ + return binder_update_ref_for_handle(proc, desc, false, strong, rdata); +} + + +/** + * binder_inc_ref_for_node() - increment the ref for given proc/node + * @proc: proc containing the ref + * @node: target node + * @strong: true=strong reference, false=weak reference + * @target_list: worklist to use if node is incremented + * @rdata: the id/refcount data for the ref + * + * Given a proc and node, increment the ref. Create the ref if it + * doesn't already exist + * + * Return: 0 if successful, else errno + */ +static int binder_inc_ref_for_node(struct binder_proc *proc, + struct binder_node *node, + bool strong, + struct list_head *target_list, + struct binder_ref_data *rdata) +{ + struct binder_ref *ref; + struct binder_ref *new_ref = NULL; + int ret = 0; + + binder_proc_lock(proc); + ref = binder_get_ref_for_node_olocked(proc, node, NULL); + if (!ref) { + binder_proc_unlock(proc); + new_ref = kzalloc(sizeof(*ref), GFP_KERNEL); + if (!new_ref) + return -ENOMEM; + binder_proc_lock(proc); + ref = binder_get_ref_for_node_olocked(proc, node, new_ref); + } + ret = binder_inc_ref_olocked(ref, strong, target_list); + *rdata = ref->data; + binder_proc_unlock(proc); + if (new_ref && ref != new_ref) + /* + * Another thread created the ref first so + * free the one we allocated + */ + kfree(new_ref); + return ret; +} + +static void binder_pop_transaction_ilocked(struct binder_thread *target_thread, + struct binder_transaction *t) +{ + BUG_ON(!target_thread); + assert_spin_locked(&target_thread->proc->inner_lock); + BUG_ON(target_thread->transaction_stack != t); + BUG_ON(target_thread->transaction_stack->from != target_thread); + target_thread->transaction_stack = + target_thread->transaction_stack->from_parent; + t->from = NULL; +} + +/** + * binder_thread_dec_tmpref() - decrement thread->tmp_ref + * @thread: thread to decrement + * + * A thread needs to be kept alive while being used to create or + * handle a transaction. binder_get_txn_from() is used to safely + * extract t->from from a binder_transaction and keep the thread + * indicated by t->from from being freed. When done with that + * binder_thread, this function is called to decrement the + * tmp_ref and free if appropriate (thread has been released + * and no transaction being processed by the driver) + */ +static void binder_thread_dec_tmpref(struct binder_thread *thread) +{ + /* + * atomic is used to protect the counter value while + * it cannot reach zero or thread->is_dead is false + */ + binder_inner_proc_lock(thread->proc); + atomic_dec(&thread->tmp_ref); + if (thread->is_dead && !atomic_read(&thread->tmp_ref)) { + binder_inner_proc_unlock(thread->proc); + binder_free_thread(thread); + return; + } + binder_inner_proc_unlock(thread->proc); +} + +/** + * binder_proc_dec_tmpref() - decrement proc->tmp_ref + * @proc: proc to decrement + * + * A binder_proc needs to be kept alive while being used to create or + * handle a transaction. proc->tmp_ref is incremented when + * creating a new transaction or the binder_proc is currently in-use + * by threads that are being released. When done with the binder_proc, + * this function is called to decrement the counter and free the + * proc if appropriate (proc has been released, all threads have + * been released and not currenly in-use to process a transaction). + */ +static void binder_proc_dec_tmpref(struct binder_proc *proc) +{ + binder_inner_proc_lock(proc); + proc->tmp_ref--; + if (proc->is_dead && RB_EMPTY_ROOT(&proc->threads) && + !proc->tmp_ref) { + binder_inner_proc_unlock(proc); + binder_free_proc(proc); + return; + } + binder_inner_proc_unlock(proc); +} + +/** + * binder_get_txn_from() - safely extract the "from" thread in transaction + * @t: binder transaction for t->from + * + * Atomically return the "from" thread and increment the tmp_ref + * count for the thread to ensure it stays alive until + * binder_thread_dec_tmpref() is called. + * + * Return: the value of t->from + */ +static struct binder_thread *binder_get_txn_from( + struct binder_transaction *t) +{ + struct binder_thread *from; + + spin_lock(&t->lock); + from = t->from; + if (from) + atomic_inc(&from->tmp_ref); + spin_unlock(&t->lock); + return from; +} + +/** + * binder_get_txn_from_and_acq_inner() - get t->from and acquire inner lock + * @t: binder transaction for t->from + * + * Same as binder_get_txn_from() except it also acquires the proc->inner_lock + * to guarantee that the thread cannot be released while operating on it. + * The caller must call binder_inner_proc_unlock() to release the inner lock + * as well as call binder_dec_thread_txn() to release the reference. + * + * Return: the value of t->from + */ +static struct binder_thread *binder_get_txn_from_and_acq_inner( + struct binder_transaction *t) +{ + struct binder_thread *from; + + from = binder_get_txn_from(t); + if (!from) + return NULL; + binder_inner_proc_lock(from->proc); + if (t->from) { + BUG_ON(from != t->from); + return from; + } + binder_inner_proc_unlock(from->proc); + binder_thread_dec_tmpref(from); + return NULL; +} + +static void binder_free_transaction(struct binder_transaction *t) +{ + if (t->buffer) + t->buffer->transaction = NULL; + kfree(t); + binder_stats_deleted(BINDER_STAT_TRANSACTION); +} + +static void binder_send_failed_reply(struct binder_transaction *t, + uint32_t error_code) +{ + struct binder_thread *target_thread; + struct binder_transaction *next; + + BUG_ON(t->flags & TF_ONE_WAY); + while (1) { + target_thread = binder_get_txn_from_and_acq_inner(t); + if (target_thread) { + binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, + "send failed reply for transaction %d to %d:%d\n", + t->debug_id, + target_thread->proc->pid, + target_thread->pid); + + binder_pop_transaction_ilocked(target_thread, t); + if (target_thread->reply_error.cmd == BR_OK) { + target_thread->reply_error.cmd = error_code; + binder_enqueue_work_ilocked( + &target_thread->reply_error.work, + &target_thread->todo); + wake_up_interruptible(&target_thread->wait); + } else { + WARN(1, "Unexpected reply error: %u\n", + target_thread->reply_error.cmd); + } + binder_inner_proc_unlock(target_thread->proc); + binder_thread_dec_tmpref(target_thread); + binder_free_transaction(t); + return; + } + next = t->from_parent; + + binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, + "send failed reply for transaction %d, target dead\n", + t->debug_id); + + binder_free_transaction(t); + if (next == NULL) { + binder_debug(BINDER_DEBUG_DEAD_BINDER, + "reply failed, no target thread at root\n"); + return; } + t = next; + binder_debug(BINDER_DEBUG_DEAD_BINDER, + "reply failed, no target thread -- retry %d\n", + t->debug_id); + } +} + +/** + * binder_cleanup_transaction() - cleans up undelivered transaction + * @t: transaction that needs to be cleaned up + * @reason: reason the transaction wasn't delivered + * @error_code: error to return to caller (if synchronous call) + */ +static void binder_cleanup_transaction(struct binder_transaction *t, + const char *reason, + uint32_t error_code) +{ + if (t->buffer->target_node && !(t->flags & TF_ONE_WAY)) { + binder_send_failed_reply(t, error_code); } else { - if (ref->weak == 0) { - binder_user_error("%d invalid dec weak, ref %d desc %d s %d w %d\n", - ref->proc->pid, ref->debug_id, - ref->desc, ref->strong, ref->weak); - return -EINVAL; + binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, + "undelivered transaction %d, %s\n", + t->debug_id, reason); + binder_free_transaction(t); + } +} + +/** + * binder_validate_object() - checks for a valid metadata object in a buffer. + * @buffer: binder_buffer that we're parsing. + * @offset: offset in the buffer at which to validate an object. + * + * Return: If there's a valid metadata object at @offset in @buffer, the + * size of that object. Otherwise, it returns zero. + */ +static size_t binder_validate_object(struct binder_buffer *buffer, u64 offset) +{ + /* Check if we can read a header first */ + struct binder_object_header *hdr; + size_t object_size = 0; + + if (offset > buffer->data_size - sizeof(*hdr) || + buffer->data_size < sizeof(*hdr) || + !IS_ALIGNED(offset, sizeof(u32))) + return 0; + + /* Ok, now see if we can read a complete object. */ + hdr = (struct binder_object_header *)(buffer->data + offset); + switch (hdr->type) { + case BINDER_TYPE_BINDER: + case BINDER_TYPE_WEAK_BINDER: + case BINDER_TYPE_HANDLE: + case BINDER_TYPE_WEAK_HANDLE: + object_size = sizeof(struct flat_binder_object); + break; + case BINDER_TYPE_FD: + object_size = sizeof(struct binder_fd_object); + break; + case BINDER_TYPE_PTR: + object_size = sizeof(struct binder_buffer_object); + break; + case BINDER_TYPE_FDA: + object_size = sizeof(struct binder_fd_array_object); + break; + default: + return 0; + } + if (offset <= buffer->data_size - object_size && + buffer->data_size >= object_size) + return object_size; + else + return 0; +} + +/** + * binder_validate_ptr() - validates binder_buffer_object in a binder_buffer. + * @b: binder_buffer containing the object + * @index: index in offset array at which the binder_buffer_object is + * located + * @start: points to the start of the offset array + * @num_valid: the number of valid offsets in the offset array + * + * Return: If @index is within the valid range of the offset array + * described by @start and @num_valid, and if there's a valid + * binder_buffer_object at the offset found in index @index + * of the offset array, that object is returned. Otherwise, + * %NULL is returned. + * Note that the offset found in index @index itself is not + * verified; this function assumes that @num_valid elements + * from @start were previously verified to have valid offsets. + */ +static struct binder_buffer_object *binder_validate_ptr(struct binder_buffer *b, + binder_size_t index, + binder_size_t *start, + binder_size_t num_valid) +{ + struct binder_buffer_object *buffer_obj; + binder_size_t *offp; + + if (index >= num_valid) + return NULL; + + offp = start + index; + buffer_obj = (struct binder_buffer_object *)(b->data + *offp); + if (buffer_obj->hdr.type != BINDER_TYPE_PTR) + return NULL; + + return buffer_obj; +} + +/** + * binder_validate_fixup() - validates pointer/fd fixups happen in order. + * @b: transaction buffer + * @objects_start start of objects buffer + * @buffer: binder_buffer_object in which to fix up + * @offset: start offset in @buffer to fix up + * @last_obj: last binder_buffer_object that we fixed up in + * @last_min_offset: minimum fixup offset in @last_obj + * + * Return: %true if a fixup in buffer @buffer at offset @offset is + * allowed. + * + * For safety reasons, we only allow fixups inside a buffer to happen + * at increasing offsets; additionally, we only allow fixup on the last + * buffer object that was verified, or one of its parents. + * + * Example of what is allowed: + * + * A + * B (parent = A, offset = 0) + * C (parent = A, offset = 16) + * D (parent = C, offset = 0) + * E (parent = A, offset = 32) // min_offset is 16 (C.parent_offset) + * + * Examples of what is not allowed: + * + * Decreasing offsets within the same parent: + * A + * C (parent = A, offset = 16) + * B (parent = A, offset = 0) // decreasing offset within A + * + * Referring to a parent that wasn't the last object or any of its parents: + * A + * B (parent = A, offset = 0) + * C (parent = A, offset = 0) + * C (parent = A, offset = 16) + * D (parent = B, offset = 0) // B is not A or any of A's parents + */ +static bool binder_validate_fixup(struct binder_buffer *b, + binder_size_t *objects_start, + struct binder_buffer_object *buffer, + binder_size_t fixup_offset, + struct binder_buffer_object *last_obj, + binder_size_t last_min_offset) +{ + if (!last_obj) { + /* Nothing to fix up in */ + return false; + } + + while (last_obj != buffer) { + /* + * Safe to retrieve the parent of last_obj, since it + * was already previously verified by the driver. + */ + if ((last_obj->flags & BINDER_BUFFER_FLAG_HAS_PARENT) == 0) + return false; + last_min_offset = last_obj->parent_offset + sizeof(uintptr_t); + last_obj = (struct binder_buffer_object *) + (b->data + *(objects_start + last_obj->parent)); + } + return (fixup_offset >= last_min_offset); +} + +static void binder_transaction_buffer_release(struct binder_proc *proc, + struct binder_buffer *buffer, + binder_size_t *failed_at) +{ + binder_size_t *offp, *off_start, *off_end; + int debug_id = buffer->debug_id; + + binder_debug(BINDER_DEBUG_TRANSACTION, + "%d buffer release %d, size %zd-%zd, failed at %p\n", + proc->pid, buffer->debug_id, + buffer->data_size, buffer->offsets_size, failed_at); + + if (buffer->target_node) + binder_dec_node(buffer->target_node, 1, 0); + + off_start = (binder_size_t *)(buffer->data + + ALIGN(buffer->data_size, sizeof(void *))); + if (failed_at) + off_end = failed_at; + else + off_end = (void *)off_start + buffer->offsets_size; + for (offp = off_start; offp < off_end; offp++) { + struct binder_object_header *hdr; + size_t object_size = binder_validate_object(buffer, *offp); + + if (object_size == 0) { + pr_err("transaction release %d bad object at offset %lld, size %zd\n", + debug_id, (u64)*offp, buffer->data_size); + continue; } - ref->weak--; + hdr = (struct binder_object_header *)(buffer->data + *offp); + switch (hdr->type) { + case BINDER_TYPE_BINDER: + case BINDER_TYPE_WEAK_BINDER: { + struct flat_binder_object *fp; + struct binder_node *node; + + fp = to_flat_binder_object(hdr); + node = binder_get_node(proc, fp->binder); + if (node == NULL) { + pr_err("transaction release %d bad node %016llx\n", + debug_id, (u64)fp->binder); + break; + } + binder_debug(BINDER_DEBUG_TRANSACTION, + " node %d u%016llx\n", + node->debug_id, (u64)node->ptr); + binder_dec_node(node, hdr->type == BINDER_TYPE_BINDER, + 0); + binder_put_node(node); + } break; + case BINDER_TYPE_HANDLE: + case BINDER_TYPE_WEAK_HANDLE: { + struct flat_binder_object *fp; + struct binder_ref_data rdata; + int ret; + + fp = to_flat_binder_object(hdr); + ret = binder_dec_ref_for_handle(proc, fp->handle, + hdr->type == BINDER_TYPE_HANDLE, &rdata); + + if (ret) { + pr_err("transaction release %d bad handle %d, ret = %d\n", + debug_id, fp->handle, ret); + break; + } + binder_debug(BINDER_DEBUG_TRANSACTION, + " ref %d desc %d\n", + rdata.debug_id, rdata.desc); + } break; + + case BINDER_TYPE_FD: { + struct binder_fd_object *fp = to_binder_fd_object(hdr); + + binder_debug(BINDER_DEBUG_TRANSACTION, + " fd %d\n", fp->fd); + if (failed_at) + task_close_fd(proc, fp->fd); + } break; + case BINDER_TYPE_PTR: + /* + * Nothing to do here, this will get cleaned up when the + * transaction buffer gets freed + */ + break; + case BINDER_TYPE_FDA: { + struct binder_fd_array_object *fda; + struct binder_buffer_object *parent; + uintptr_t parent_buffer; + u32 *fd_array; + size_t fd_index; + binder_size_t fd_buf_size; + + fda = to_binder_fd_array_object(hdr); + parent = binder_validate_ptr(buffer, fda->parent, + off_start, + offp - off_start); + if (!parent) { + pr_err("transaction release %d bad parent offset", + debug_id); + continue; + } + /* + * Since the parent was already fixed up, convert it + * back to kernel address space to access it + */ + parent_buffer = parent->buffer - + binder_alloc_get_user_buffer_offset( + &proc->alloc); + + fd_buf_size = sizeof(u32) * fda->num_fds; + if (fda->num_fds >= SIZE_MAX / sizeof(u32)) { + pr_err("transaction release %d invalid number of fds (%lld)\n", + debug_id, (u64)fda->num_fds); + continue; + } + if (fd_buf_size > parent->length || + fda->parent_offset > parent->length - fd_buf_size) { + /* No space for all file descriptors here. */ + pr_err("transaction release %d not enough space for %lld fds in buffer\n", + debug_id, (u64)fda->num_fds); + continue; + } + fd_array = (u32 *)(parent_buffer + fda->parent_offset); + for (fd_index = 0; fd_index < fda->num_fds; fd_index++) + task_close_fd(proc, fd_array[fd_index]); + } break; + default: + pr_err("transaction release %d bad object type %x\n", + debug_id, hdr->type); + break; + } + } +} + +static int binder_translate_binder(struct flat_binder_object *fp, + struct binder_transaction *t, + struct binder_thread *thread) +{ + struct binder_node *node; + struct binder_proc *proc = thread->proc; + struct binder_proc *target_proc = t->to_proc; + struct binder_ref_data rdata; + int ret = 0; + + node = binder_get_node(proc, fp->binder); + if (!node) { + node = binder_new_node(proc, fp); + if (!node) + return -ENOMEM; + } + if (fp->cookie != node->cookie) { + binder_user_error("%d:%d sending u%016llx node %d, cookie mismatch %016llx != %016llx\n", + proc->pid, thread->pid, (u64)fp->binder, + node->debug_id, (u64)fp->cookie, + (u64)node->cookie); + ret = -EINVAL; + goto done; + } + if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { + ret = -EPERM; + goto done; + } + + ret = binder_inc_ref_for_node(target_proc, node, + fp->hdr.type == BINDER_TYPE_BINDER, + &thread->todo, &rdata); + if (ret) + goto done; + + if (fp->hdr.type == BINDER_TYPE_BINDER) + fp->hdr.type = BINDER_TYPE_HANDLE; + else + fp->hdr.type = BINDER_TYPE_WEAK_HANDLE; + fp->binder = 0; + fp->handle = rdata.desc; + fp->cookie = 0; + + trace_binder_transaction_node_to_ref(t, node, &rdata); + binder_debug(BINDER_DEBUG_TRANSACTION, + " node %d u%016llx -> ref %d desc %d\n", + node->debug_id, (u64)node->ptr, + rdata.debug_id, rdata.desc); +done: + binder_put_node(node); + return ret; +} + +static int binder_translate_handle(struct flat_binder_object *fp, + struct binder_transaction *t, + struct binder_thread *thread) +{ + struct binder_proc *proc = thread->proc; + struct binder_proc *target_proc = t->to_proc; + struct binder_node *node; + struct binder_ref_data src_rdata; + int ret = 0; + + node = binder_get_node_from_ref(proc, fp->handle, + fp->hdr.type == BINDER_TYPE_HANDLE, &src_rdata); + if (!node) { + binder_user_error("%d:%d got transaction with invalid handle, %d\n", + proc->pid, thread->pid, fp->handle); + return -EINVAL; + } + if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { + ret = -EPERM; + goto done; + } + + binder_node_lock(node); + if (node->proc == target_proc) { + if (fp->hdr.type == BINDER_TYPE_HANDLE) + fp->hdr.type = BINDER_TYPE_BINDER; + else + fp->hdr.type = BINDER_TYPE_WEAK_BINDER; + fp->binder = node->ptr; + fp->cookie = node->cookie; + if (node->proc) + binder_inner_proc_lock(node->proc); + binder_inc_node_nilocked(node, + fp->hdr.type == BINDER_TYPE_BINDER, + 0, NULL); + if (node->proc) + binder_inner_proc_unlock(node->proc); + trace_binder_transaction_ref_to_node(t, node, &src_rdata); + binder_debug(BINDER_DEBUG_TRANSACTION, + " ref %d desc %d -> node %d u%016llx\n", + src_rdata.debug_id, src_rdata.desc, node->debug_id, + (u64)node->ptr); + binder_node_unlock(node); + } else { + struct binder_ref_data dest_rdata; + + binder_node_unlock(node); + ret = binder_inc_ref_for_node(target_proc, node, + fp->hdr.type == BINDER_TYPE_HANDLE, + NULL, &dest_rdata); + if (ret) + goto done; + + fp->binder = 0; + fp->handle = dest_rdata.desc; + fp->cookie = 0; + trace_binder_transaction_ref_to_ref(t, node, &src_rdata, + &dest_rdata); + binder_debug(BINDER_DEBUG_TRANSACTION, + " ref %d desc %d -> ref %d desc %d (node %d)\n", + src_rdata.debug_id, src_rdata.desc, + dest_rdata.debug_id, dest_rdata.desc, + node->debug_id); + } +done: + binder_put_node(node); + return ret; +} + +static int binder_translate_fd(int fd, + struct binder_transaction *t, + struct binder_thread *thread, + struct binder_transaction *in_reply_to) +{ + struct binder_proc *proc = thread->proc; + struct binder_proc *target_proc = t->to_proc; + int target_fd; + struct file *file; + int ret; + bool target_allows_fd; + + if (in_reply_to) + target_allows_fd = !!(in_reply_to->flags & TF_ACCEPT_FDS); + else + target_allows_fd = t->buffer->target_node->accept_fds; + if (!target_allows_fd) { + binder_user_error("%d:%d got %s with fd, %d, but target does not allow fds\n", + proc->pid, thread->pid, + in_reply_to ? "reply" : "transaction", + fd); + ret = -EPERM; + goto err_fd_not_accepted; + } + + file = fget(fd); + if (!file) { + binder_user_error("%d:%d got transaction with invalid fd, %d\n", + proc->pid, thread->pid, fd); + ret = -EBADF; + goto err_fget; + } + ret = security_binder_transfer_file(proc->tsk, target_proc->tsk, file); + if (ret < 0) { + ret = -EPERM; + goto err_security; + } + + target_fd = task_get_unused_fd_flags(target_proc, O_CLOEXEC); + if (target_fd < 0) { + ret = -ENOMEM; + goto err_get_unused_fd; + } + task_fd_install(target_proc, target_fd, file); + trace_binder_transaction_fd(t, fd, target_fd); + binder_debug(BINDER_DEBUG_TRANSACTION, " fd %d -> %d\n", + fd, target_fd); + + return target_fd; + +err_get_unused_fd: +err_security: + fput(file); +err_fget: +err_fd_not_accepted: + return ret; +} + +static int binder_translate_fd_array(struct binder_fd_array_object *fda, + struct binder_buffer_object *parent, + struct binder_transaction *t, + struct binder_thread *thread, + struct binder_transaction *in_reply_to) +{ + binder_size_t fdi, fd_buf_size, num_installed_fds; + int target_fd; + uintptr_t parent_buffer; + u32 *fd_array; + struct binder_proc *proc = thread->proc; + struct binder_proc *target_proc = t->to_proc; + + fd_buf_size = sizeof(u32) * fda->num_fds; + if (fda->num_fds >= SIZE_MAX / sizeof(u32)) { + binder_user_error("%d:%d got transaction with invalid number of fds (%lld)\n", + proc->pid, thread->pid, (u64)fda->num_fds); + return -EINVAL; + } + if (fd_buf_size > parent->length || + fda->parent_offset > parent->length - fd_buf_size) { + /* No space for all file descriptors here. */ + binder_user_error("%d:%d not enough space to store %lld fds in buffer\n", + proc->pid, thread->pid, (u64)fda->num_fds); + return -EINVAL; + } + /* + * Since the parent was already fixed up, convert it + * back to the kernel address space to access it + */ + parent_buffer = parent->buffer - + binder_alloc_get_user_buffer_offset(&target_proc->alloc); + fd_array = (u32 *)(parent_buffer + 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); + return -EINVAL; + } + for (fdi = 0; fdi < fda->num_fds; fdi++) { + target_fd = binder_translate_fd(fd_array[fdi], t, thread, + in_reply_to); + if (target_fd < 0) + goto err_translate_fd_failed; + fd_array[fdi] = target_fd; } - if (ref->strong == 0 && ref->weak == 0) - binder_delete_ref(ref); return 0; + +err_translate_fd_failed: + /* + * Failed to allocate fd or security error, free fds + * installed so far. + */ + num_installed_fds = fdi; + for (fdi = 0; fdi < num_installed_fds; fdi++) + task_close_fd(target_proc, fd_array[fdi]); + return target_fd; } -static void binder_pop_transaction(struct binder_thread *target_thread, - struct binder_transaction *t) +static int binder_fixup_parent(struct binder_transaction *t, + struct binder_thread *thread, + struct binder_buffer_object *bp, + binder_size_t *off_start, + binder_size_t num_valid, + struct binder_buffer_object *last_fixup_obj, + binder_size_t last_fixup_min_off) { - if (target_thread) { - BUG_ON(target_thread->transaction_stack != t); - BUG_ON(target_thread->transaction_stack->from != target_thread); - target_thread->transaction_stack = - target_thread->transaction_stack->from_parent; - t->from = NULL; + struct binder_buffer_object *parent; + u8 *parent_buffer; + struct binder_buffer *b = t->buffer; + struct binder_proc *proc = thread->proc; + struct binder_proc *target_proc = t->to_proc; + + if (!(bp->flags & BINDER_BUFFER_FLAG_HAS_PARENT)) + return 0; + + parent = binder_validate_ptr(b, bp->parent, off_start, num_valid); + if (!parent) { + binder_user_error("%d:%d got transaction with invalid parent offset or type\n", + proc->pid, thread->pid); + return -EINVAL; } - t->need_reply = 0; - if (t->buffer) - t->buffer->transaction = NULL; - kfree(t); - binder_stats_deleted(BINDER_STAT_TRANSACTION); + + if (!binder_validate_fixup(b, off_start, + parent, bp->parent_offset, + last_fixup_obj, + last_fixup_min_off)) { + binder_user_error("%d:%d got transaction with out-of-order buffer fixup\n", + proc->pid, thread->pid); + return -EINVAL; + } + + if (parent->length < sizeof(binder_uintptr_t) || + bp->parent_offset > parent->length - sizeof(binder_uintptr_t)) { + /* No space for a pointer here! */ + binder_user_error("%d:%d got transaction with invalid parent offset\n", + proc->pid, thread->pid); + return -EINVAL; + } + parent_buffer = (u8 *)(parent->buffer - + binder_alloc_get_user_buffer_offset( + &target_proc->alloc)); + *(binder_uintptr_t *)(parent_buffer + bp->parent_offset) = bp->buffer; + + return 0; } -static void binder_send_failed_reply(struct binder_transaction *t, - uint32_t error_code) +/** + * binder_proc_transaction() - sends a transaction to a process and wakes it up + * @t: transaction to send + * @proc: process to send the transaction to + * @thread: thread in @proc to send the transaction to (may be NULL) + * + * This function queues a transaction to the specified process. It will try + * to find a thread in the target process to handle the transaction and + * wake it up. If no thread is found, the work is queued to the proc + * waitqueue. + * + * If the @thread parameter is not NULL, the transaction is always queued + * to the waitlist of that specific thread. + * + * Return: true if the transactions was successfully queued + * false if the target process or thread is dead + */ +static bool binder_proc_transaction(struct binder_transaction *t, + struct binder_proc *proc, + struct binder_thread *thread) { - struct binder_thread *target_thread; - struct binder_transaction *next; - - BUG_ON(t->flags & TF_ONE_WAY); - while (1) { - target_thread = t->from; - if (target_thread) { - if (target_thread->return_error != BR_OK && - target_thread->return_error2 == BR_OK) { - target_thread->return_error2 = - target_thread->return_error; - target_thread->return_error = BR_OK; - } - if (target_thread->return_error == BR_OK) { - binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, - "send failed reply for transaction %d to %d:%d\n", - t->debug_id, - target_thread->proc->pid, - target_thread->pid); - - binder_pop_transaction(target_thread, t); - target_thread->return_error = error_code; - wake_up_interruptible(&target_thread->wait); - } else { - pr_err("reply failed, target thread, %d:%d, has error code %d already\n", - target_thread->proc->pid, - target_thread->pid, - target_thread->return_error); - } - return; + struct list_head *target_list = NULL; + struct binder_node *node = t->buffer->target_node; + struct binder_priority node_prio; + bool oneway = !!(t->flags & TF_ONE_WAY); + bool wakeup = true; + + BUG_ON(!node); + binder_node_lock(node); + node_prio.prio = node->min_priority; + node_prio.sched_policy = node->sched_policy; + + if (oneway) { + BUG_ON(thread); + if (node->has_async_transaction) { + target_list = &node->async_todo; + wakeup = false; + } else { + node->has_async_transaction = 1; } - next = t->from_parent; + } - binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, - "send failed reply for transaction %d, target dead\n", - t->debug_id); + binder_inner_proc_lock(proc); - binder_pop_transaction(target_thread, t); - if (next == NULL) { - binder_debug(BINDER_DEBUG_DEAD_BINDER, - "reply failed, no target thread at root\n"); - return; - } - t = next; - binder_debug(BINDER_DEBUG_DEAD_BINDER, - "reply failed, no target thread -- retry %d\n", - t->debug_id); + if (proc->is_dead || (thread && thread->is_dead)) { + binder_inner_proc_unlock(proc); + binder_node_unlock(node); + return false; } -} -static void binder_transaction_buffer_release(struct binder_proc *proc, - struct binder_buffer *buffer, - binder_size_t *failed_at) -{ - binder_size_t *offp, *off_end; - int debug_id = buffer->debug_id; + if (!thread && !target_list) + thread = binder_select_thread_ilocked(proc); - binder_debug(BINDER_DEBUG_TRANSACTION, - "%d buffer release %d, size %zd-%zd, failed at %p\n", - proc->pid, buffer->debug_id, - buffer->data_size, buffer->offsets_size, failed_at); + if (thread) { + target_list = &thread->todo; + binder_transaction_priority(thread->task, t, node_prio, + node->inherit_rt); + } else if (!target_list) { + target_list = &proc->todo; + } else { + BUG_ON(target_list != &node->async_todo); + } - if (buffer->target_node) - binder_dec_node(buffer->target_node, 1, 0); + binder_enqueue_work_ilocked(&t->work, target_list); - offp = (binder_size_t *)(buffer->data + - ALIGN(buffer->data_size, sizeof(void *))); - if (failed_at) - off_end = failed_at; - else - off_end = (void *)offp + buffer->offsets_size; - for (; offp < off_end; offp++) { - struct flat_binder_object *fp; + if (wakeup) + binder_wakeup_thread_ilocked(proc, thread, !oneway /* sync */); - if (*offp > buffer->data_size - sizeof(*fp) || - buffer->data_size < sizeof(*fp) || - !IS_ALIGNED(*offp, sizeof(u32))) { - pr_err("transaction release %d bad offset %lld, size %zd\n", - debug_id, (u64)*offp, buffer->data_size); - continue; - } - fp = (struct flat_binder_object *)(buffer->data + *offp); - switch (fp->type) { - case BINDER_TYPE_BINDER: - case BINDER_TYPE_WEAK_BINDER: { - struct binder_node *node = binder_get_node(proc, fp->binder); + binder_inner_proc_unlock(proc); + binder_node_unlock(node); - if (node == NULL) { - pr_err("transaction release %d bad node %016llx\n", - debug_id, (u64)fp->binder); - break; - } - binder_debug(BINDER_DEBUG_TRANSACTION, - " node %d u%016llx\n", - node->debug_id, (u64)node->ptr); - binder_dec_node(node, fp->type == BINDER_TYPE_BINDER, 0); - } break; - case BINDER_TYPE_HANDLE: - case BINDER_TYPE_WEAK_HANDLE: { - struct binder_ref *ref = binder_get_ref(proc, fp->handle); + return true; +} - if (ref == NULL) { - pr_err("transaction release %d bad handle %d\n", - debug_id, fp->handle); - break; - } - binder_debug(BINDER_DEBUG_TRANSACTION, - " ref %d desc %d (node %d)\n", - ref->debug_id, ref->desc, ref->node->debug_id); - binder_dec_ref(ref, fp->type == BINDER_TYPE_HANDLE); - } break; +/** + * binder_get_node_refs_for_txn() - Get required refs on node for txn + * @node: struct binder_node for which to get refs + * @proc: returns @node->proc if valid + * @error: if no @proc then returns BR_DEAD_REPLY + * + * User-space normally keeps the node alive when creating a transaction + * since it has a reference to the target. The local strong ref keeps it + * alive if the sending process dies before the target process processes + * the transaction. If the source process is malicious or has a reference + * counting bug, relying on the local strong ref can fail. + * + * Since user-space can cause the local strong ref to go away, we also take + * a tmpref on the node to ensure it survives while we are constructing + * the transaction. We also need a tmpref on the proc while we are + * constructing the transaction, so we take that here as well. + * + * Return: The target_node with refs taken or NULL if no @node->proc is NULL. + * Also sets @proc if valid. If the @node->proc is NULL indicating that the + * target proc has died, @error is set to BR_DEAD_REPLY + */ +static struct binder_node *binder_get_node_refs_for_txn( + struct binder_node *node, + struct binder_proc **procp, + uint32_t *error) +{ + struct binder_node *target_node = NULL; - case BINDER_TYPE_FD: - binder_debug(BINDER_DEBUG_TRANSACTION, - " fd %d\n", fp->handle); - if (failed_at) - task_close_fd(proc, fp->handle); - break; + binder_node_inner_lock(node); + if (node->proc) { + target_node = node; + binder_inc_node_nilocked(node, 1, 0, NULL); + binder_inc_node_tmpref_ilocked(node); + node->proc->tmp_ref++; + *procp = node->proc; + } else + *error = BR_DEAD_REPLY; + binder_node_inner_unlock(node); - default: - pr_err("transaction release %d bad object type %x\n", - debug_id, fp->type); - break; - } - } + return target_node; } static void binder_transaction(struct binder_proc *proc, struct binder_thread *thread, - struct binder_transaction_data *tr, int reply) + struct binder_transaction_data *tr, int reply, + binder_size_t extra_buffers_size) { + int ret; struct binder_transaction *t; struct binder_work *tcomplete; - binder_size_t *offp, *off_end; + binder_size_t *offp, *off_end, *off_start; binder_size_t off_min; - struct binder_proc *target_proc; + u8 *sg_bufp, *sg_buf_end; + struct binder_proc *target_proc = NULL; struct binder_thread *target_thread = NULL; struct binder_node *target_node = NULL; - struct list_head *target_list; - wait_queue_head_t *target_wait; struct binder_transaction *in_reply_to = NULL; struct binder_transaction_log_entry *e; - uint32_t return_error; + uint32_t return_error = 0; + uint32_t return_error_param = 0; + uint32_t return_error_line = 0; + struct binder_buffer_object *last_fixup_obj = NULL; + binder_size_t last_fixup_min_off = 0; + struct binder_context *context = proc->context; + int t_debug_id = atomic_inc_return(&binder_last_id); e = binder_transaction_log_add(&binder_transaction_log); + e->debug_id = t_debug_id; e->call_type = reply ? 2 : !!(tr->flags & TF_ONE_WAY); e->from_proc = proc->pid; e->from_thread = thread->pid; e->target_handle = tr->target.handle; e->data_size = tr->data_size; e->offsets_size = tr->offsets_size; + e->context_name = proc->context->name; if (reply) { + binder_inner_proc_lock(proc); in_reply_to = thread->transaction_stack; if (in_reply_to == NULL) { + binder_inner_proc_unlock(proc); binder_user_error("%d:%d got reply transaction with no transaction stack\n", proc->pid, thread->pid); return_error = BR_FAILED_REPLY; + return_error_param = -EPROTO; + return_error_line = __LINE__; goto err_empty_call_stack; } - binder_set_nice(in_reply_to->saved_priority); if (in_reply_to->to_thread != thread) { + spin_lock(&in_reply_to->lock); binder_user_error("%d:%d got reply transaction with bad transaction stack, transaction %d has target %d:%d\n", proc->pid, thread->pid, in_reply_to->debug_id, in_reply_to->to_proc ? in_reply_to->to_proc->pid : 0, in_reply_to->to_thread ? in_reply_to->to_thread->pid : 0); + spin_unlock(&in_reply_to->lock); + binder_inner_proc_unlock(proc); return_error = BR_FAILED_REPLY; + return_error_param = -EPROTO; + return_error_line = __LINE__; in_reply_to = NULL; goto err_bad_call_stack; } thread->transaction_stack = in_reply_to->to_parent; - target_thread = in_reply_to->from; + binder_inner_proc_unlock(proc); + target_thread = binder_get_txn_from_and_acq_inner(in_reply_to); if (target_thread == NULL) { return_error = BR_DEAD_REPLY; + return_error_line = __LINE__; goto err_dead_binder; } if (target_thread->transaction_stack != in_reply_to) { @@ -1367,105 +2880,148 @@ static void binder_transaction(struct binder_proc *proc, target_thread->transaction_stack ? target_thread->transaction_stack->debug_id : 0, in_reply_to->debug_id); + binder_inner_proc_unlock(target_thread->proc); return_error = BR_FAILED_REPLY; + return_error_param = -EPROTO; + return_error_line = __LINE__; in_reply_to = NULL; target_thread = NULL; goto err_dead_binder; } target_proc = target_thread->proc; + target_proc->tmp_ref++; + binder_inner_proc_unlock(target_thread->proc); } else { if (tr->target.handle) { struct binder_ref *ref; - ref = binder_get_ref(proc, tr->target.handle); - if (ref == NULL) { + /* + * There must already be a strong ref + * on this node. If so, do a strong + * increment on the node to ensure it + * stays alive until the transaction is + * done. + */ + binder_proc_lock(proc); + ref = binder_get_ref_olocked(proc, tr->target.handle, + true); + if (ref) { + target_node = binder_get_node_refs_for_txn( + ref->node, &target_proc, + &return_error); + } else { binder_user_error("%d:%d got transaction to invalid handle\n", - proc->pid, thread->pid); + proc->pid, thread->pid); return_error = BR_FAILED_REPLY; - goto err_invalid_target_handle; } - target_node = ref->node; + binder_proc_unlock(proc); } else { - target_node = binder_context_mgr_node; - if (target_node == NULL) { + mutex_lock(&context->context_mgr_node_lock); + target_node = context->binder_context_mgr_node; + if (target_node) + target_node = binder_get_node_refs_for_txn( + target_node, &target_proc, + &return_error); + else return_error = BR_DEAD_REPLY; - goto err_no_context_mgr_node; - } + mutex_unlock(&context->context_mgr_node_lock); } - e->to_node = target_node->debug_id; - target_proc = target_node->proc; - if (target_proc == NULL) { - return_error = BR_DEAD_REPLY; + if (!target_node) { + /* + * return_error is set above + */ + return_error_param = -EINVAL; + return_error_line = __LINE__; goto err_dead_binder; } - if (security_binder_transaction(proc->tsk, target_proc->tsk) < 0) { + e->to_node = target_node->debug_id; + if (security_binder_transaction(proc->tsk, + target_proc->tsk) < 0) { return_error = BR_FAILED_REPLY; + return_error_param = -EPERM; + return_error_line = __LINE__; goto err_invalid_target_handle; } + binder_inner_proc_lock(proc); if (!(tr->flags & TF_ONE_WAY) && thread->transaction_stack) { struct binder_transaction *tmp; tmp = thread->transaction_stack; if (tmp->to_thread != thread) { + spin_lock(&tmp->lock); binder_user_error("%d:%d got new transaction with bad transaction stack, transaction %d has target %d:%d\n", proc->pid, thread->pid, tmp->debug_id, tmp->to_proc ? tmp->to_proc->pid : 0, tmp->to_thread ? tmp->to_thread->pid : 0); + spin_unlock(&tmp->lock); + binder_inner_proc_unlock(proc); return_error = BR_FAILED_REPLY; + return_error_param = -EPROTO; + return_error_line = __LINE__; goto err_bad_call_stack; } while (tmp) { - if (tmp->from && tmp->from->proc == target_proc) - target_thread = tmp->from; + struct binder_thread *from; + + spin_lock(&tmp->lock); + from = tmp->from; + if (from && from->proc == target_proc) { + atomic_inc(&from->tmp_ref); + target_thread = from; + spin_unlock(&tmp->lock); + break; + } + spin_unlock(&tmp->lock); tmp = tmp->from_parent; } } + binder_inner_proc_unlock(proc); } - if (target_thread) { + if (target_thread) e->to_thread = target_thread->pid; - target_list = &target_thread->todo; - target_wait = &target_thread->wait; - } else { - target_list = &target_proc->todo; - target_wait = &target_proc->wait; - } e->to_proc = target_proc->pid; /* TODO: reuse incoming transaction for reply */ t = kzalloc(sizeof(*t), GFP_KERNEL); if (t == NULL) { return_error = BR_FAILED_REPLY; + return_error_param = -ENOMEM; + return_error_line = __LINE__; goto err_alloc_t_failed; } binder_stats_created(BINDER_STAT_TRANSACTION); + spin_lock_init(&t->lock); tcomplete = kzalloc(sizeof(*tcomplete), GFP_KERNEL); if (tcomplete == NULL) { return_error = BR_FAILED_REPLY; + return_error_param = -ENOMEM; + return_error_line = __LINE__; goto err_alloc_tcomplete_failed; } binder_stats_created(BINDER_STAT_TRANSACTION_COMPLETE); - t->debug_id = ++binder_last_id; - e->debug_id = t->debug_id; + t->debug_id = t_debug_id; if (reply) binder_debug(BINDER_DEBUG_TRANSACTION, - "%d:%d BC_REPLY %d -> %d:%d, data %016llx-%016llx size %lld-%lld\n", + "%d:%d BC_REPLY %d -> %d:%d, data %016llx-%016llx size %lld-%lld-%lld\n", proc->pid, thread->pid, t->debug_id, target_proc->pid, target_thread->pid, (u64)tr->data.ptr.buffer, (u64)tr->data.ptr.offsets, - (u64)tr->data_size, (u64)tr->offsets_size); + (u64)tr->data_size, (u64)tr->offsets_size, + (u64)extra_buffers_size); else binder_debug(BINDER_DEBUG_TRANSACTION, - "%d:%d BC_TRANSACTION %d -> %d - node %d, data %016llx-%016llx size %lld-%lld\n", + "%d:%d BC_TRANSACTION %d -> %d - node %d, data %016llx-%016llx size %lld-%lld-%lld\n", proc->pid, thread->pid, t->debug_id, target_proc->pid, target_node->debug_id, (u64)tr->data.ptr.buffer, (u64)tr->data.ptr.offsets, - (u64)tr->data_size, (u64)tr->offsets_size); + (u64)tr->data_size, (u64)tr->offsets_size, + (u64)extra_buffers_size); if (!reply && !(tr->flags & TF_ONE_WAY)) t->from = thread; @@ -1476,14 +3032,30 @@ static void binder_transaction(struct binder_proc *proc, t->to_thread = target_thread; t->code = tr->code; t->flags = tr->flags; - t->priority = task_nice(current); + if (!(t->flags & TF_ONE_WAY) && + binder_supported_policy(current->policy)) { + /* Inherit supported policies for synchronous transactions */ + t->priority.sched_policy = current->policy; + t->priority.prio = current->normal_prio; + } else { + /* Otherwise, fall back to the default priority */ + t->priority = target_proc->default_priority; + } trace_binder_transaction(reply, t, target_node); - t->buffer = binder_alloc_buf(target_proc, tr->data_size, - tr->offsets_size, !reply && (t->flags & TF_ONE_WAY)); - if (t->buffer == NULL) { - return_error = BR_FAILED_REPLY; + t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size, + tr->offsets_size, extra_buffers_size, + !reply && (t->flags & TF_ONE_WAY)); + if (IS_ERR(t->buffer)) { + /* + * -ESRCH indicates VMA cleared. The target is dying. + */ + return_error_param = PTR_ERR(t->buffer); + return_error = return_error_param == -ESRCH ? + BR_DEAD_REPLY : BR_FAILED_REPLY; + return_error_line = __LINE__; + t->buffer = NULL; goto err_binder_alloc_buf_failed; } t->buffer->allow_user_free = 0; @@ -1491,17 +3063,17 @@ static void binder_transaction(struct binder_proc *proc, t->buffer->transaction = t; t->buffer->target_node = target_node; trace_binder_transaction_alloc_buf(t->buffer); - if (target_node) - binder_inc_node(target_node, 1, 0, NULL); - - offp = (binder_size_t *)(t->buffer->data + - ALIGN(tr->data_size, sizeof(void *))); + off_start = (binder_size_t *)(t->buffer->data + + ALIGN(tr->data_size, sizeof(void *))); + offp = off_start; if (copy_from_user(t->buffer->data, (const void __user *)(uintptr_t) tr->data.ptr.buffer, tr->data_size)) { binder_user_error("%d:%d got transaction with invalid data ptr\n", proc->pid, thread->pid); return_error = BR_FAILED_REPLY; + return_error_param = -EFAULT; + return_error_line = __LINE__; goto err_copy_data_failed; } if (copy_from_user(offp, (const void __user *)(uintptr_t) @@ -1509,223 +3081,244 @@ static void binder_transaction(struct binder_proc *proc, binder_user_error("%d:%d got transaction with invalid offsets ptr\n", proc->pid, thread->pid); return_error = BR_FAILED_REPLY; + return_error_param = -EFAULT; + return_error_line = __LINE__; goto err_copy_data_failed; } if (!IS_ALIGNED(tr->offsets_size, sizeof(binder_size_t))) { binder_user_error("%d:%d got transaction with invalid offsets size, %lld\n", proc->pid, thread->pid, (u64)tr->offsets_size); return_error = BR_FAILED_REPLY; + return_error_param = -EINVAL; + return_error_line = __LINE__; + goto err_bad_offset; + } + if (!IS_ALIGNED(extra_buffers_size, sizeof(u64))) { + binder_user_error("%d:%d got transaction with unaligned buffers size, %lld\n", + proc->pid, thread->pid, + (u64)extra_buffers_size); + return_error = BR_FAILED_REPLY; + return_error_param = -EINVAL; + return_error_line = __LINE__; goto err_bad_offset; } - off_end = (void *)offp + tr->offsets_size; + off_end = (void *)off_start + tr->offsets_size; + sg_bufp = (u8 *)(PTR_ALIGN(off_end, sizeof(void *))); + sg_buf_end = sg_bufp + extra_buffers_size; off_min = 0; for (; offp < off_end; offp++) { - struct flat_binder_object *fp; + struct binder_object_header *hdr; + size_t object_size = binder_validate_object(t->buffer, *offp); - if (*offp > t->buffer->data_size - sizeof(*fp) || - *offp < off_min || - t->buffer->data_size < sizeof(*fp) || - !IS_ALIGNED(*offp, sizeof(u32))) { - binder_user_error("%d:%d got transaction with invalid offset, %lld (min %lld, max %lld)\n", + if (object_size == 0 || *offp < off_min) { + binder_user_error("%d:%d got transaction with invalid offset (%lld, min %lld max %lld) or object.\n", proc->pid, thread->pid, (u64)*offp, (u64)off_min, - (u64)(t->buffer->data_size - - sizeof(*fp))); + (u64)t->buffer->data_size); return_error = BR_FAILED_REPLY; + return_error_param = -EINVAL; + return_error_line = __LINE__; goto err_bad_offset; } - fp = (struct flat_binder_object *)(t->buffer->data + *offp); - off_min = *offp + sizeof(struct flat_binder_object); - switch (fp->type) { + + hdr = (struct binder_object_header *)(t->buffer->data + *offp); + off_min = *offp + object_size; + switch (hdr->type) { case BINDER_TYPE_BINDER: case BINDER_TYPE_WEAK_BINDER: { - struct binder_ref *ref; - struct binder_node *node = binder_get_node(proc, fp->binder); + struct flat_binder_object *fp; - if (node == NULL) { - node = binder_new_node(proc, fp->binder, fp->cookie); - if (node == NULL) { - return_error = BR_FAILED_REPLY; - goto err_binder_new_node_failed; - } - node->min_priority = fp->flags & FLAT_BINDER_FLAG_PRIORITY_MASK; - node->accept_fds = !!(fp->flags & FLAT_BINDER_FLAG_ACCEPTS_FDS); - } - if (fp->cookie != node->cookie) { - binder_user_error("%d:%d sending u%016llx node %d, cookie mismatch %016llx != %016llx\n", - proc->pid, thread->pid, - (u64)fp->binder, node->debug_id, - (u64)fp->cookie, (u64)node->cookie); - return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_for_node_failed; - } - if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { - return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_for_node_failed; - } - ref = binder_get_ref_for_node(target_proc, node); - if (ref == NULL) { + fp = to_flat_binder_object(hdr); + ret = binder_translate_binder(fp, t, thread); + if (ret < 0) { return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_for_node_failed; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; } - if (fp->type == BINDER_TYPE_BINDER) - fp->type = BINDER_TYPE_HANDLE; - else - fp->type = BINDER_TYPE_WEAK_HANDLE; - fp->handle = ref->desc; - binder_inc_ref(ref, fp->type == BINDER_TYPE_HANDLE, - &thread->todo); - - trace_binder_transaction_node_to_ref(t, node, ref); - binder_debug(BINDER_DEBUG_TRANSACTION, - " node %d u%016llx -> ref %d desc %d\n", - node->debug_id, (u64)node->ptr, - ref->debug_id, ref->desc); } break; case BINDER_TYPE_HANDLE: case BINDER_TYPE_WEAK_HANDLE: { - struct binder_ref *ref = binder_get_ref(proc, fp->handle); + struct flat_binder_object *fp; - if (ref == NULL) { - binder_user_error("%d:%d got transaction with invalid handle, %d\n", - proc->pid, - thread->pid, fp->handle); - return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_failed; - } - if (security_binder_transfer_binder(proc->tsk, target_proc->tsk)) { + fp = to_flat_binder_object(hdr); + ret = binder_translate_handle(fp, t, thread); + if (ret < 0) { return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_failed; - } - if (ref->node->proc == target_proc) { - if (fp->type == BINDER_TYPE_HANDLE) - fp->type = BINDER_TYPE_BINDER; - else - fp->type = BINDER_TYPE_WEAK_BINDER; - fp->binder = ref->node->ptr; - fp->cookie = ref->node->cookie; - binder_inc_node(ref->node, fp->type == BINDER_TYPE_BINDER, 0, NULL); - trace_binder_transaction_ref_to_node(t, ref); - binder_debug(BINDER_DEBUG_TRANSACTION, - " ref %d desc %d -> node %d u%016llx\n", - ref->debug_id, ref->desc, ref->node->debug_id, - (u64)ref->node->ptr); - } else { - struct binder_ref *new_ref; - - new_ref = binder_get_ref_for_node(target_proc, ref->node); - if (new_ref == NULL) { - return_error = BR_FAILED_REPLY; - goto err_binder_get_ref_for_node_failed; - } - fp->handle = new_ref->desc; - binder_inc_ref(new_ref, fp->type == BINDER_TYPE_HANDLE, NULL); - trace_binder_transaction_ref_to_ref(t, ref, - new_ref); - binder_debug(BINDER_DEBUG_TRANSACTION, - " ref %d desc %d -> ref %d desc %d (node %d)\n", - ref->debug_id, ref->desc, new_ref->debug_id, - new_ref->desc, ref->node->debug_id); + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; } } break; case BINDER_TYPE_FD: { - int target_fd; - struct file *file; - - if (reply) { - if (!(in_reply_to->flags & TF_ACCEPT_FDS)) { - binder_user_error("%d:%d got reply with fd, %d, but target does not allow fds\n", - proc->pid, thread->pid, fp->handle); - return_error = BR_FAILED_REPLY; - goto err_fd_not_allowed; - } - } else if (!target_node->accept_fds) { - binder_user_error("%d:%d got transaction with fd, %d, but target does not allow fds\n", - proc->pid, thread->pid, fp->handle); + struct binder_fd_object *fp = to_binder_fd_object(hdr); + int target_fd = binder_translate_fd(fp->fd, t, thread, + in_reply_to); + + if (target_fd < 0) { return_error = BR_FAILED_REPLY; - goto err_fd_not_allowed; + return_error_param = target_fd; + return_error_line = __LINE__; + goto err_translate_failed; } - - file = fget(fp->handle); - if (file == NULL) { - binder_user_error("%d:%d got transaction with invalid fd, %d\n", - proc->pid, thread->pid, fp->handle); + fp->pad_binder = 0; + fp->fd = target_fd; + } break; + case BINDER_TYPE_FDA: { + struct binder_fd_array_object *fda = + to_binder_fd_array_object(hdr); + struct binder_buffer_object *parent = + binder_validate_ptr(t->buffer, fda->parent, + off_start, + offp - off_start); + if (!parent) { + binder_user_error("%d:%d got transaction with invalid parent offset or type\n", + proc->pid, thread->pid); return_error = BR_FAILED_REPLY; - goto err_fget_failed; + return_error_param = -EINVAL; + return_error_line = __LINE__; + goto err_bad_parent; } - if (security_binder_transfer_file(proc->tsk, target_proc->tsk, file) < 0) { - fput(file); + if (!binder_validate_fixup(t->buffer, off_start, + parent, fda->parent_offset, + last_fixup_obj, + last_fixup_min_off)) { + binder_user_error("%d:%d got transaction with out-of-order buffer fixup\n", + proc->pid, thread->pid); return_error = BR_FAILED_REPLY; - goto err_get_unused_fd_failed; + return_error_param = -EINVAL; + return_error_line = __LINE__; + goto err_bad_parent; } - target_fd = task_get_unused_fd_flags(target_proc, O_CLOEXEC); - if (target_fd < 0) { - fput(file); + ret = binder_translate_fd_array(fda, parent, t, thread, + in_reply_to); + if (ret < 0) { return_error = BR_FAILED_REPLY; - goto err_get_unused_fd_failed; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; } - task_fd_install(target_proc, target_fd, file); - trace_binder_transaction_fd(t, fp->handle, target_fd); - binder_debug(BINDER_DEBUG_TRANSACTION, - " fd %d -> %d\n", fp->handle, target_fd); - /* TODO: fput? */ - fp->handle = target_fd; + last_fixup_obj = parent; + last_fixup_min_off = + fda->parent_offset + sizeof(u32) * fda->num_fds; + } break; + case BINDER_TYPE_PTR: { + struct binder_buffer_object *bp = + to_binder_buffer_object(hdr); + size_t buf_left = sg_buf_end - sg_bufp; + + if (bp->length > buf_left) { + binder_user_error("%d:%d got transaction with too large buffer\n", + proc->pid, thread->pid); + return_error = BR_FAILED_REPLY; + return_error_param = -EINVAL; + return_error_line = __LINE__; + goto err_bad_offset; + } + if (copy_from_user(sg_bufp, + (const void __user *)(uintptr_t) + bp->buffer, bp->length)) { + binder_user_error("%d:%d got transaction with invalid offsets ptr\n", + proc->pid, thread->pid); + return_error_param = -EFAULT; + return_error = BR_FAILED_REPLY; + return_error_line = __LINE__; + goto err_copy_data_failed; + } + /* Fixup buffer pointer to target proc address space */ + bp->buffer = (uintptr_t)sg_bufp + + binder_alloc_get_user_buffer_offset( + &target_proc->alloc); + sg_bufp += ALIGN(bp->length, sizeof(u64)); + + ret = binder_fixup_parent(t, thread, bp, off_start, + offp - off_start, + last_fixup_obj, + last_fixup_min_off); + if (ret < 0) { + return_error = BR_FAILED_REPLY; + return_error_param = ret; + return_error_line = __LINE__; + goto err_translate_failed; + } + last_fixup_obj = bp; + last_fixup_min_off = 0; } break; - default: binder_user_error("%d:%d got transaction with invalid object type, %x\n", - proc->pid, thread->pid, fp->type); + proc->pid, thread->pid, hdr->type); return_error = BR_FAILED_REPLY; + return_error_param = -EINVAL; + return_error_line = __LINE__; goto err_bad_object_type; } } + tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE; + binder_enqueue_work(proc, tcomplete, &thread->todo); + t->work.type = BINDER_WORK_TRANSACTION; + if (reply) { + binder_inner_proc_lock(target_proc); + if (target_thread->is_dead) { + binder_inner_proc_unlock(target_proc); + goto err_dead_proc_or_thread; + } BUG_ON(t->buffer->async_transaction != 0); - binder_pop_transaction(target_thread, in_reply_to); + binder_pop_transaction_ilocked(target_thread, in_reply_to); + binder_enqueue_work_ilocked(&t->work, &target_thread->todo); + binder_inner_proc_unlock(target_proc); + wake_up_interruptible_sync(&target_thread->wait); + binder_restore_priority(current, in_reply_to->saved_priority); + binder_free_transaction(in_reply_to); } else if (!(t->flags & TF_ONE_WAY)) { BUG_ON(t->buffer->async_transaction != 0); + binder_inner_proc_lock(proc); t->need_reply = 1; t->from_parent = thread->transaction_stack; thread->transaction_stack = t; + binder_inner_proc_unlock(proc); + if (!binder_proc_transaction(t, target_proc, target_thread)) { + binder_inner_proc_lock(proc); + binder_pop_transaction_ilocked(thread, t); + binder_inner_proc_unlock(proc); + goto err_dead_proc_or_thread; + } } else { BUG_ON(target_node == NULL); BUG_ON(t->buffer->async_transaction != 1); - if (target_node->has_async_transaction) { - target_list = &target_node->async_todo; - target_wait = NULL; - } else - target_node->has_async_transaction = 1; - } - t->work.type = BINDER_WORK_TRANSACTION; - list_add_tail(&t->work.entry, target_list); - tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE; - list_add_tail(&tcomplete->entry, &thread->todo); - if (target_wait) { - if (reply || !(t->flags & TF_ONE_WAY)) { - preempt_disable(); - wake_up_interruptible_sync(target_wait); - preempt_enable_no_resched(); - } - else { - wake_up_interruptible(target_wait); - } + if (!binder_proc_transaction(t, target_proc, NULL)) + goto err_dead_proc_or_thread; } + if (target_thread) + binder_thread_dec_tmpref(target_thread); + binder_proc_dec_tmpref(target_proc); + if (target_node) + binder_dec_node_tmpref(target_node); + /* + * write barrier to synchronize with initialization + * of log entry + */ + smp_wmb(); + WRITE_ONCE(e->debug_id_done, t_debug_id); return; -err_get_unused_fd_failed: -err_fget_failed: -err_fd_not_allowed: -err_binder_get_ref_for_node_failed: -err_binder_get_ref_failed: -err_binder_new_node_failed: +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: +err_bad_parent: err_copy_data_failed: trace_binder_transaction_failed_buffer_release(t->buffer); binder_transaction_buffer_release(target_proc, t->buffer, offp); + if (target_node) + binder_dec_node_tmpref(target_node); + target_node = NULL; t->buffer->transaction = NULL; - binder_free_buf(target_proc, t->buffer); + binder_alloc_free_buf(&target_proc->alloc, t->buffer); err_binder_alloc_buf_failed: kfree(tcomplete); binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); @@ -1737,25 +3330,52 @@ static void binder_transaction(struct binder_proc *proc, err_empty_call_stack: err_dead_binder: err_invalid_target_handle: -err_no_context_mgr_node: + if (target_thread) + binder_thread_dec_tmpref(target_thread); + if (target_proc) + binder_proc_dec_tmpref(target_proc); + if (target_node) { + binder_dec_node(target_node, 1, 0); + binder_dec_node_tmpref(target_node); + } + binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, - "%d:%d transaction failed %d, size %lld-%lld\n", - proc->pid, thread->pid, return_error, - (u64)tr->data_size, (u64)tr->offsets_size); + "%d:%d transaction failed %d/%d, size %lld-%lld line %d\n", + proc->pid, thread->pid, return_error, return_error_param, + (u64)tr->data_size, (u64)tr->offsets_size, + return_error_line); { struct binder_transaction_log_entry *fe; + e->return_error = return_error; + e->return_error_param = return_error_param; + e->return_error_line = return_error_line; fe = binder_transaction_log_add(&binder_transaction_log_failed); *fe = *e; + /* + * write barrier to synchronize with initialization + * of log entry + */ + smp_wmb(); + WRITE_ONCE(e->debug_id_done, t_debug_id); + WRITE_ONCE(fe->debug_id_done, t_debug_id); } - BUG_ON(thread->return_error != BR_OK); + BUG_ON(thread->return_error.cmd != BR_OK); if (in_reply_to) { - thread->return_error = BR_TRANSACTION_COMPLETE; + binder_restore_priority(current, in_reply_to->saved_priority); + thread->return_error.cmd = BR_TRANSACTION_COMPLETE; + binder_enqueue_work(thread->proc, + &thread->return_error.work, + &thread->todo); binder_send_failed_reply(in_reply_to, return_error); - } else - thread->return_error = return_error; + } else { + thread->return_error.cmd = return_error; + binder_enqueue_work(thread->proc, + &thread->return_error.work, + &thread->todo); + } } static int binder_thread_write(struct binder_proc *proc, @@ -1764,19 +3384,22 @@ static int binder_thread_write(struct binder_proc *proc, binder_size_t *consumed) { uint32_t cmd; + struct binder_context *context = proc->context; void __user *buffer = (void __user *)(uintptr_t)binder_buffer; void __user *ptr = buffer + *consumed; void __user *end = buffer + size; - while (ptr < end && thread->return_error == BR_OK) { + while (ptr < end && thread->return_error.cmd == BR_OK) { + int ret; + if (get_user(cmd, (uint32_t __user *)ptr)) return -EFAULT; ptr += sizeof(uint32_t); trace_binder_command(cmd); if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.bc)) { - binder_stats.bc[_IOC_NR(cmd)]++; - proc->stats.bc[_IOC_NR(cmd)]++; - thread->stats.bc[_IOC_NR(cmd)]++; + atomic_inc(&binder_stats.bc[_IOC_NR(cmd)]); + atomic_inc(&proc->stats.bc[_IOC_NR(cmd)]); + atomic_inc(&thread->stats.bc[_IOC_NR(cmd)]); } switch (cmd) { case BC_INCREFS: @@ -1784,51 +3407,61 @@ static int binder_thread_write(struct binder_proc *proc, case BC_RELEASE: case BC_DECREFS: { uint32_t target; - struct binder_ref *ref; const char *debug_string; + bool strong = cmd == BC_ACQUIRE || cmd == BC_RELEASE; + bool increment = cmd == BC_INCREFS || cmd == BC_ACQUIRE; + struct binder_ref_data rdata; if (get_user(target, (uint32_t __user *)ptr)) return -EFAULT; + ptr += sizeof(uint32_t); - if (target == 0 && binder_context_mgr_node && - (cmd == BC_INCREFS || cmd == BC_ACQUIRE)) { - ref = binder_get_ref_for_node(proc, - binder_context_mgr_node); - if (ref->desc != target) { - binder_user_error("%d:%d tried to acquire reference to desc 0, got %d instead\n", - proc->pid, thread->pid, - ref->desc); - } - } else - ref = binder_get_ref(proc, target); - if (ref == NULL) { - binder_user_error("%d:%d refcount change on invalid ref %d\n", - proc->pid, thread->pid, target); - break; + ret = -1; + if (increment && !target) { + struct binder_node *ctx_mgr_node; + mutex_lock(&context->context_mgr_node_lock); + ctx_mgr_node = context->binder_context_mgr_node; + if (ctx_mgr_node) + ret = binder_inc_ref_for_node( + proc, ctx_mgr_node, + strong, NULL, &rdata); + mutex_unlock(&context->context_mgr_node_lock); + } + if (ret) + ret = binder_update_ref_for_handle( + proc, target, increment, strong, + &rdata); + if (!ret && rdata.desc != target) { + binder_user_error("%d:%d tried to acquire reference to desc %d, got %d instead\n", + proc->pid, thread->pid, + target, rdata.desc); } switch (cmd) { case BC_INCREFS: debug_string = "IncRefs"; - binder_inc_ref(ref, 0, NULL); break; case BC_ACQUIRE: debug_string = "Acquire"; - binder_inc_ref(ref, 1, NULL); break; case BC_RELEASE: debug_string = "Release"; - binder_dec_ref(ref, 1); break; case BC_DECREFS: default: debug_string = "DecRefs"; - binder_dec_ref(ref, 0); + break; + } + if (ret) { + binder_user_error("%d:%d %s %d refcount change on invalid ref %d ret %d\n", + proc->pid, thread->pid, debug_string, + strong, target, ret); break; } binder_debug(BINDER_DEBUG_USER_REFS, - "%d:%d %s ref %d desc %d s %d w %d for node %d\n", - proc->pid, thread->pid, debug_string, ref->debug_id, - ref->desc, ref->strong, ref->weak, ref->node->debug_id); + "%d:%d %s ref %d desc %d s %d w %d\n", + proc->pid, thread->pid, debug_string, + rdata.debug_id, rdata.desc, rdata.strong, + rdata.weak); break; } case BC_INCREFS_DONE: @@ -1836,6 +3469,7 @@ static int binder_thread_write(struct binder_proc *proc, binder_uintptr_t node_ptr; binder_uintptr_t cookie; struct binder_node *node; + bool free_node; if (get_user(node_ptr, (binder_uintptr_t __user *)ptr)) return -EFAULT; @@ -1860,13 +3494,17 @@ static int binder_thread_write(struct binder_proc *proc, "BC_INCREFS_DONE" : "BC_ACQUIRE_DONE", (u64)node_ptr, node->debug_id, (u64)cookie, (u64)node->cookie); + binder_put_node(node); break; } + binder_node_inner_lock(node); if (cmd == BC_ACQUIRE_DONE) { if (node->pending_strong_ref == 0) { binder_user_error("%d:%d BC_ACQUIRE_DONE node %d has no pending acquire request\n", proc->pid, thread->pid, node->debug_id); + binder_node_inner_unlock(node); + binder_put_node(node); break; } node->pending_strong_ref = 0; @@ -1875,16 +3513,23 @@ static int binder_thread_write(struct binder_proc *proc, binder_user_error("%d:%d BC_INCREFS_DONE node %d has no pending increfs request\n", proc->pid, thread->pid, node->debug_id); + binder_node_inner_unlock(node); + binder_put_node(node); break; } node->pending_weak_ref = 0; } - binder_dec_node(node, cmd == BC_ACQUIRE_DONE, 0); + free_node = binder_dec_node_nilocked(node, + cmd == BC_ACQUIRE_DONE, 0); + WARN_ON(free_node); binder_debug(BINDER_DEBUG_USER_REFS, - "%d:%d %s node %d ls %d lw %d\n", + "%d:%d %s node %d ls %d lw %d tr %d\n", proc->pid, thread->pid, cmd == BC_INCREFS_DONE ? "BC_INCREFS_DONE" : "BC_ACQUIRE_DONE", - node->debug_id, node->local_strong_refs, node->local_weak_refs); + node->debug_id, node->local_strong_refs, + node->local_weak_refs, node->tmp_refs); + binder_node_inner_unlock(node); + binder_put_node(node); break; } case BC_ATTEMPT_ACQUIRE: @@ -1902,7 +3547,8 @@ static int binder_thread_write(struct binder_proc *proc, return -EFAULT; ptr += sizeof(binder_uintptr_t); - buffer = binder_buffer_lookup(proc, data_ptr); + buffer = binder_alloc_prepare_to_free(&proc->alloc, + data_ptr); if (buffer == NULL) { binder_user_error("%d:%d BC_FREE_BUFFER u%016llx no match\n", proc->pid, thread->pid, (u64)data_ptr); @@ -1924,18 +3570,41 @@ static int binder_thread_write(struct binder_proc *proc, buffer->transaction = NULL; } if (buffer->async_transaction && buffer->target_node) { - BUG_ON(!buffer->target_node->has_async_transaction); - if (list_empty(&buffer->target_node->async_todo)) - buffer->target_node->has_async_transaction = 0; - else - list_move_tail(buffer->target_node->async_todo.next, &thread->todo); + struct binder_node *buf_node; + struct binder_work *w; + + buf_node = buffer->target_node; + binder_node_inner_lock(buf_node); + BUG_ON(!buf_node->has_async_transaction); + BUG_ON(buf_node->proc != proc); + w = binder_dequeue_work_head_ilocked( + &buf_node->async_todo); + if (!w) { + buf_node->has_async_transaction = 0; + } else { + binder_enqueue_work_ilocked( + w, &proc->todo); + binder_wakeup_proc_ilocked(proc); + } + binder_node_inner_unlock(buf_node); } trace_binder_transaction_buffer_release(buffer); binder_transaction_buffer_release(proc, buffer, NULL); - binder_free_buf(proc, buffer); + binder_alloc_free_buf(&proc->alloc, buffer); break; } + case BC_TRANSACTION_SG: + case BC_REPLY_SG: { + struct binder_transaction_data_sg tr; + + if (copy_from_user(&tr, ptr, sizeof(tr))) + return -EFAULT; + ptr += sizeof(tr); + binder_transaction(proc, thread, &tr.transaction_data, + cmd == BC_REPLY_SG, tr.buffers_size); + break; + } case BC_TRANSACTION: case BC_REPLY: { struct binder_transaction_data tr; @@ -1943,7 +3612,8 @@ static int binder_thread_write(struct binder_proc *proc, if (copy_from_user(&tr, ptr, sizeof(tr))) return -EFAULT; ptr += sizeof(tr); - binder_transaction(proc, thread, &tr, cmd == BC_REPLY); + binder_transaction(proc, thread, &tr, + cmd == BC_REPLY, 0); break; } @@ -1951,6 +3621,7 @@ static int binder_thread_write(struct binder_proc *proc, binder_debug(BINDER_DEBUG_THREADS, "%d:%d BC_REGISTER_LOOPER\n", proc->pid, thread->pid); + binder_inner_proc_lock(proc); if (thread->looper & BINDER_LOOPER_STATE_ENTERED) { thread->looper |= BINDER_LOOPER_STATE_INVALID; binder_user_error("%d:%d ERROR: BC_REGISTER_LOOPER called after BC_ENTER_LOOPER\n", @@ -1964,6 +3635,7 @@ static int binder_thread_write(struct binder_proc *proc, proc->requested_threads_started++; } thread->looper |= BINDER_LOOPER_STATE_REGISTERED; + binder_inner_proc_unlock(proc); break; case BC_ENTER_LOOPER: binder_debug(BINDER_DEBUG_THREADS, @@ -1988,7 +3660,7 @@ static int binder_thread_write(struct binder_proc *proc, uint32_t target; binder_uintptr_t cookie; struct binder_ref *ref; - struct binder_ref_death *death; + struct binder_ref_death *death = NULL; if (get_user(target, (uint32_t __user *)ptr)) return -EFAULT; @@ -1996,7 +3668,29 @@ static int binder_thread_write(struct binder_proc *proc, if (get_user(cookie, (binder_uintptr_t __user *)ptr)) return -EFAULT; ptr += sizeof(binder_uintptr_t); - ref = binder_get_ref(proc, target); + if (cmd == BC_REQUEST_DEATH_NOTIFICATION) { + /* + * Allocate memory for death notification + * before taking lock + */ + death = kzalloc(sizeof(*death), GFP_KERNEL); + if (death == NULL) { + WARN_ON(thread->return_error.cmd != + BR_OK); + thread->return_error.cmd = BR_ERROR; + binder_enqueue_work( + thread->proc, + &thread->return_error.work, + &thread->todo); + binder_debug( + BINDER_DEBUG_FAILED_TRANSACTION, + "%d:%d BC_REQUEST_DEATH_NOTIFICATION failed\n", + proc->pid, thread->pid); + break; + } + } + binder_proc_lock(proc); + ref = binder_get_ref_olocked(proc, target, false); if (ref == NULL) { binder_user_error("%d:%d %s invalid ref %d\n", proc->pid, thread->pid, @@ -2004,6 +3698,8 @@ static int binder_thread_write(struct binder_proc *proc, "BC_REQUEST_DEATH_NOTIFICATION" : "BC_CLEAR_DEATH_NOTIFICATION", target); + binder_proc_unlock(proc); + kfree(death); break; } @@ -2013,21 +3709,18 @@ static int binder_thread_write(struct binder_proc *proc, cmd == BC_REQUEST_DEATH_NOTIFICATION ? "BC_REQUEST_DEATH_NOTIFICATION" : "BC_CLEAR_DEATH_NOTIFICATION", - (u64)cookie, ref->debug_id, ref->desc, - ref->strong, ref->weak, ref->node->debug_id); + (u64)cookie, ref->data.debug_id, + ref->data.desc, ref->data.strong, + ref->data.weak, ref->node->debug_id); + binder_node_lock(ref->node); if (cmd == BC_REQUEST_DEATH_NOTIFICATION) { if (ref->death) { binder_user_error("%d:%d BC_REQUEST_DEATH_NOTIFICATION death notification already set\n", proc->pid, thread->pid); - break; - } - death = kzalloc(sizeof(*death), GFP_KERNEL); - if (death == NULL) { - thread->return_error = BR_ERROR; - binder_debug(BINDER_DEBUG_FAILED_TRANSACTION, - "%d:%d BC_REQUEST_DEATH_NOTIFICATION failed\n", - proc->pid, thread->pid); + binder_node_unlock(ref->node); + binder_proc_unlock(proc); + kfree(death); break; } binder_stats_created(BINDER_STAT_DEATH); @@ -2036,17 +3729,19 @@ static int binder_thread_write(struct binder_proc *proc, ref->death = death; if (ref->node->proc == NULL) { ref->death->work.type = BINDER_WORK_DEAD_BINDER; - if (thread->looper & (BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_ENTERED)) { - list_add_tail(&ref->death->work.entry, &thread->todo); - } else { - list_add_tail(&ref->death->work.entry, &proc->todo); - wake_up_interruptible(&proc->wait); - } + + binder_inner_proc_lock(proc); + binder_enqueue_work_ilocked( + &ref->death->work, &proc->todo); + binder_wakeup_proc_ilocked(proc); + binder_inner_proc_unlock(proc); } } else { if (ref->death == NULL) { binder_user_error("%d:%d BC_CLEAR_DEATH_NOTIFICATION death notification not active\n", proc->pid, thread->pid); + binder_node_unlock(ref->node); + binder_proc_unlock(proc); break; } death = ref->death; @@ -2055,22 +3750,35 @@ static int binder_thread_write(struct binder_proc *proc, proc->pid, thread->pid, (u64)death->cookie, (u64)cookie); + binder_node_unlock(ref->node); + binder_proc_unlock(proc); break; } ref->death = NULL; + binder_inner_proc_lock(proc); if (list_empty(&death->work.entry)) { death->work.type = BINDER_WORK_CLEAR_DEATH_NOTIFICATION; - if (thread->looper & (BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_ENTERED)) { - list_add_tail(&death->work.entry, &thread->todo); - } else { - list_add_tail(&death->work.entry, &proc->todo); - wake_up_interruptible(&proc->wait); + if (thread->looper & + (BINDER_LOOPER_STATE_REGISTERED | + BINDER_LOOPER_STATE_ENTERED)) + binder_enqueue_work_ilocked( + &death->work, + &thread->todo); + else { + binder_enqueue_work_ilocked( + &death->work, + &proc->todo); + binder_wakeup_proc_ilocked( + proc); } } else { BUG_ON(death->work.type != BINDER_WORK_DEAD_BINDER); death->work.type = BINDER_WORK_DEAD_BINDER_AND_CLEAR; } + binder_inner_proc_unlock(proc); } + binder_node_unlock(ref->node); + binder_proc_unlock(proc); } break; case BC_DEAD_BINDER_DONE: { struct binder_work *w; @@ -2080,9 +3788,14 @@ static int binder_thread_write(struct binder_proc *proc, if (get_user(cookie, (binder_uintptr_t __user *)ptr)) return -EFAULT; - ptr += sizeof(void *); - list_for_each_entry(w, &proc->delivered_death, entry) { - struct binder_ref_death *tmp_death = container_of(w, struct binder_ref_death, work); + ptr += sizeof(cookie); + binder_inner_proc_lock(proc); + list_for_each_entry(w, &proc->delivered_death, + entry) { + struct binder_ref_death *tmp_death = + container_of(w, + struct binder_ref_death, + work); if (tmp_death->cookie == cookie) { death = tmp_death; @@ -2096,19 +3809,25 @@ static int binder_thread_write(struct binder_proc *proc, if (death == NULL) { binder_user_error("%d:%d BC_DEAD_BINDER_DONE %016llx not found\n", proc->pid, thread->pid, (u64)cookie); + binder_inner_proc_unlock(proc); break; } - - list_del_init(&death->work.entry); + binder_dequeue_work_ilocked(&death->work); if (death->work.type == BINDER_WORK_DEAD_BINDER_AND_CLEAR) { death->work.type = BINDER_WORK_CLEAR_DEATH_NOTIFICATION; - if (thread->looper & (BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_ENTERED)) { - list_add_tail(&death->work.entry, &thread->todo); - } else { - list_add_tail(&death->work.entry, &proc->todo); - wake_up_interruptible(&proc->wait); + if (thread->looper & + (BINDER_LOOPER_STATE_REGISTERED | + BINDER_LOOPER_STATE_ENTERED)) + binder_enqueue_work_ilocked( + &death->work, &thread->todo); + else { + binder_enqueue_work_ilocked( + &death->work, + &proc->todo); + binder_wakeup_proc_ilocked(proc); } } + binder_inner_proc_unlock(proc); } break; default: @@ -2126,23 +3845,73 @@ static void binder_stat_br(struct binder_proc *proc, { trace_binder_return(cmd); if (_IOC_NR(cmd) < ARRAY_SIZE(binder_stats.br)) { - binder_stats.br[_IOC_NR(cmd)]++; - proc->stats.br[_IOC_NR(cmd)]++; - thread->stats.br[_IOC_NR(cmd)]++; + atomic_inc(&binder_stats.br[_IOC_NR(cmd)]); + atomic_inc(&proc->stats.br[_IOC_NR(cmd)]); + atomic_inc(&thread->stats.br[_IOC_NR(cmd)]); } } -static int binder_has_proc_work(struct binder_proc *proc, - struct binder_thread *thread) +static int binder_put_node_cmd(struct binder_proc *proc, + struct binder_thread *thread, + void __user **ptrp, + binder_uintptr_t node_ptr, + binder_uintptr_t node_cookie, + int node_debug_id, + uint32_t cmd, const char *cmd_name) { - return !list_empty(&proc->todo) || - (thread->looper & BINDER_LOOPER_STATE_NEED_RETURN); + void __user *ptr = *ptrp; + + if (put_user(cmd, (uint32_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(uint32_t); + + if (put_user(node_ptr, (binder_uintptr_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(binder_uintptr_t); + + if (put_user(node_cookie, (binder_uintptr_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(binder_uintptr_t); + + binder_stat_br(proc, thread, cmd); + binder_debug(BINDER_DEBUG_USER_REFS, "%d:%d %s %d u%016llx c%016llx\n", + proc->pid, thread->pid, cmd_name, node_debug_id, + (u64)node_ptr, (u64)node_cookie); + + *ptrp = ptr; + return 0; } -static int binder_has_thread_work(struct binder_thread *thread) +static int binder_wait_for_work(struct binder_thread *thread, + bool do_proc_work) { - return !list_empty(&thread->todo) || thread->return_error != BR_OK || - (thread->looper & BINDER_LOOPER_STATE_NEED_RETURN); + DEFINE_WAIT(wait); + struct binder_proc *proc = thread->proc; + int ret = 0; + + freezer_do_not_count(); + binder_inner_proc_lock(proc); + for (;;) { + prepare_to_wait(&thread->wait, &wait, TASK_INTERRUPTIBLE); + if (binder_has_work_ilocked(thread, do_proc_work)) + break; + if (do_proc_work) + list_add(&thread->waiting_thread_node, + &proc->waiting_threads); + binder_inner_proc_unlock(proc); + schedule(); + binder_inner_proc_lock(proc); + list_del_init(&thread->waiting_thread_node); + if (signal_pending(current)) { + ret = -ERESTARTSYS; + break; + } + } + finish_wait(&thread->wait, &wait); + binder_inner_proc_unlock(proc); + freezer_count(); + + return ret; } static int binder_thread_read(struct binder_proc *proc, @@ -2157,44 +3926,22 @@ static int binder_thread_read(struct binder_proc *proc, int ret = 0; int wait_for_proc_work; - if (*consumed == 0) { - if (put_user(BR_NOOP, (uint32_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(uint32_t); - } - -retry: - wait_for_proc_work = thread->transaction_stack == NULL && - list_empty(&thread->todo); - - if (thread->return_error != BR_OK && ptr < end) { - if (thread->return_error2 != BR_OK) { - if (put_user(thread->return_error2, (uint32_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(uint32_t); - binder_stat_br(proc, thread, thread->return_error2); - if (ptr == end) - goto done; - thread->return_error2 = BR_OK; - } - if (put_user(thread->return_error, (uint32_t __user *)ptr)) + if (*consumed == 0) { + if (put_user(BR_NOOP, (uint32_t __user *)ptr)) return -EFAULT; ptr += sizeof(uint32_t); - binder_stat_br(proc, thread, thread->return_error); - thread->return_error = BR_OK; - goto done; } +retry: + binder_inner_proc_lock(proc); + wait_for_proc_work = binder_available_for_proc_work_ilocked(thread); + binder_inner_proc_unlock(proc); thread->looper |= BINDER_LOOPER_STATE_WAITING; - if (wait_for_proc_work) - proc->ready_threads++; - - binder_unlock(__func__); trace_binder_wait_for_work(wait_for_proc_work, !!thread->transaction_stack, - !list_empty(&thread->todo)); + !binder_worklist_empty(proc, &thread->todo)); if (wait_for_proc_work) { if (!(thread->looper & (BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_ENTERED))) { @@ -2203,24 +3950,16 @@ static int binder_thread_read(struct binder_proc *proc, wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2); } - binder_set_nice(proc->default_priority); - if (non_block) { - if (!binder_has_proc_work(proc, thread)) - ret = -EAGAIN; - } else - ret = wait_event_freezable_exclusive(proc->wait, binder_has_proc_work(proc, thread)); - } else { - if (non_block) { - if (!binder_has_thread_work(thread)) - ret = -EAGAIN; - } else - ret = wait_event_freezable(thread->wait, binder_has_thread_work(thread)); + binder_restore_priority(current, proc->default_priority); } - binder_lock(__func__); + if (non_block) { + if (!binder_has_work(thread, wait_for_proc_work)) + ret = -EAGAIN; + } else { + ret = binder_wait_for_work(thread, wait_for_proc_work); + } - if (wait_for_proc_work) - proc->ready_threads--; thread->looper &= ~BINDER_LOOPER_STATE_WAITING; if (ret) @@ -2229,31 +3968,52 @@ static int binder_thread_read(struct binder_proc *proc, while (1) { uint32_t cmd; struct binder_transaction_data tr; - struct binder_work *w; + struct binder_work *w = NULL; + struct list_head *list = NULL; struct binder_transaction *t = NULL; + struct binder_thread *t_from; + + binder_inner_proc_lock(proc); + if (!binder_worklist_empty_ilocked(&thread->todo)) + list = &thread->todo; + else if (!binder_worklist_empty_ilocked(&proc->todo) && + wait_for_proc_work) + list = &proc->todo; + else { + binder_inner_proc_unlock(proc); - if (!list_empty(&thread->todo)) { - w = list_first_entry(&thread->todo, struct binder_work, - entry); - } else if (!list_empty(&proc->todo) && wait_for_proc_work) { - w = list_first_entry(&proc->todo, struct binder_work, - entry); - } else { /* no data added */ - if (ptr - buffer == 4 && - !(thread->looper & BINDER_LOOPER_STATE_NEED_RETURN)) + if (ptr - buffer == 4 && !thread->looper_need_return) goto retry; break; } - if (end - ptr < sizeof(tr) + 4) + if (end - ptr < sizeof(tr) + 4) { + binder_inner_proc_unlock(proc); break; + } + w = binder_dequeue_work_head_ilocked(list); switch (w->type) { case BINDER_WORK_TRANSACTION: { + binder_inner_proc_unlock(proc); t = container_of(w, struct binder_transaction, work); } break; + case BINDER_WORK_RETURN_ERROR: { + struct binder_error *e = container_of( + w, struct binder_error, work); + + WARN_ON(e->cmd == BR_OK); + binder_inner_proc_unlock(proc); + if (put_user(e->cmd, (uint32_t __user *)ptr)) + return -EFAULT; + e->cmd = BR_OK; + ptr += sizeof(uint32_t); + + binder_stat_br(proc, thread, cmd); + } break; case BINDER_WORK_TRANSACTION_COMPLETE: { + binder_inner_proc_unlock(proc); cmd = BR_TRANSACTION_COMPLETE; if (put_user(cmd, (uint32_t __user *)ptr)) return -EFAULT; @@ -2263,113 +4023,134 @@ static int binder_thread_read(struct binder_proc *proc, binder_debug(BINDER_DEBUG_TRANSACTION_COMPLETE, "%d:%d BR_TRANSACTION_COMPLETE\n", proc->pid, thread->pid); - - list_del(&w->entry); kfree(w); binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); } break; case BINDER_WORK_NODE: { struct binder_node *node = container_of(w, struct binder_node, work); - uint32_t cmd = BR_NOOP; - const char *cmd_name; - int strong = node->internal_strong_refs || node->local_strong_refs; - int weak = !hlist_empty(&node->refs) || node->local_weak_refs || strong; - - if (weak && !node->has_weak_ref) { - cmd = BR_INCREFS; - cmd_name = "BR_INCREFS"; + int strong, weak; + binder_uintptr_t node_ptr = node->ptr; + binder_uintptr_t node_cookie = node->cookie; + int node_debug_id = node->debug_id; + int has_weak_ref; + int has_strong_ref; + void __user *orig_ptr = ptr; + + BUG_ON(proc != node->proc); + strong = node->internal_strong_refs || + node->local_strong_refs; + weak = !hlist_empty(&node->refs) || + node->local_weak_refs || + node->tmp_refs || strong; + has_strong_ref = node->has_strong_ref; + has_weak_ref = node->has_weak_ref; + + if (weak && !has_weak_ref) { node->has_weak_ref = 1; node->pending_weak_ref = 1; node->local_weak_refs++; - } else if (strong && !node->has_strong_ref) { - cmd = BR_ACQUIRE; - cmd_name = "BR_ACQUIRE"; + } + if (strong && !has_strong_ref) { node->has_strong_ref = 1; node->pending_strong_ref = 1; node->local_strong_refs++; - } else if (!strong && node->has_strong_ref) { - cmd = BR_RELEASE; - cmd_name = "BR_RELEASE"; + } + if (!strong && has_strong_ref) node->has_strong_ref = 0; - } else if (!weak && node->has_weak_ref) { - cmd = BR_DECREFS; - cmd_name = "BR_DECREFS"; + if (!weak && has_weak_ref) node->has_weak_ref = 0; - } - if (cmd != BR_NOOP) { - if (put_user(cmd, (uint32_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(uint32_t); - if (put_user(node->ptr, - (binder_uintptr_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(binder_uintptr_t); - if (put_user(node->cookie, - (binder_uintptr_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(binder_uintptr_t); - - binder_stat_br(proc, thread, cmd); - binder_debug(BINDER_DEBUG_USER_REFS, - "%d:%d %s %d u%016llx c%016llx\n", - proc->pid, thread->pid, cmd_name, - node->debug_id, - (u64)node->ptr, (u64)node->cookie); - } else { - list_del_init(&w->entry); - if (!weak && !strong) { - binder_debug(BINDER_DEBUG_INTERNAL_REFS, - "%d:%d node %d u%016llx c%016llx deleted\n", - proc->pid, thread->pid, - node->debug_id, - (u64)node->ptr, - (u64)node->cookie); - rb_erase(&node->rb_node, &proc->nodes); - kfree(node); - binder_stats_deleted(BINDER_STAT_NODE); - } else { - binder_debug(BINDER_DEBUG_INTERNAL_REFS, - "%d:%d node %d u%016llx c%016llx state unchanged\n", - proc->pid, thread->pid, - node->debug_id, - (u64)node->ptr, - (u64)node->cookie); - } - } + if (!weak && !strong) { + binder_debug(BINDER_DEBUG_INTERNAL_REFS, + "%d:%d node %d u%016llx c%016llx deleted\n", + proc->pid, thread->pid, + node_debug_id, + (u64)node_ptr, + (u64)node_cookie); + rb_erase(&node->rb_node, &proc->nodes); + binder_inner_proc_unlock(proc); + binder_node_lock(node); + /* + * Acquire the node lock before freeing the + * node to serialize with other threads that + * may have been holding the node lock while + * decrementing this node (avoids race where + * this thread frees while the other thread + * is unlocking the node after the final + * decrement) + */ + binder_node_unlock(node); + binder_free_node(node); + } else + binder_inner_proc_unlock(proc); + + if (weak && !has_weak_ref) + ret = binder_put_node_cmd( + proc, thread, &ptr, node_ptr, + node_cookie, node_debug_id, + BR_INCREFS, "BR_INCREFS"); + if (!ret && strong && !has_strong_ref) + ret = binder_put_node_cmd( + proc, thread, &ptr, node_ptr, + node_cookie, node_debug_id, + BR_ACQUIRE, "BR_ACQUIRE"); + if (!ret && !strong && has_strong_ref) + ret = binder_put_node_cmd( + proc, thread, &ptr, node_ptr, + node_cookie, node_debug_id, + BR_RELEASE, "BR_RELEASE"); + if (!ret && !weak && has_weak_ref) + ret = binder_put_node_cmd( + proc, thread, &ptr, node_ptr, + node_cookie, node_debug_id, + BR_DECREFS, "BR_DECREFS"); + if (orig_ptr == ptr) + binder_debug(BINDER_DEBUG_INTERNAL_REFS, + "%d:%d node %d u%016llx c%016llx state unchanged\n", + proc->pid, thread->pid, + node_debug_id, + (u64)node_ptr, + (u64)node_cookie); + if (ret) + return ret; } break; case BINDER_WORK_DEAD_BINDER: case BINDER_WORK_DEAD_BINDER_AND_CLEAR: case BINDER_WORK_CLEAR_DEATH_NOTIFICATION: { struct binder_ref_death *death; uint32_t cmd; + binder_uintptr_t cookie; death = container_of(w, struct binder_ref_death, work); if (w->type == BINDER_WORK_CLEAR_DEATH_NOTIFICATION) cmd = BR_CLEAR_DEATH_NOTIFICATION_DONE; else cmd = BR_DEAD_BINDER; - if (put_user(cmd, (uint32_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(uint32_t); - if (put_user(death->cookie, - (binder_uintptr_t __user *)ptr)) - return -EFAULT; - ptr += sizeof(binder_uintptr_t); - binder_stat_br(proc, thread, cmd); + cookie = death->cookie; + binder_debug(BINDER_DEBUG_DEATH_NOTIFICATION, "%d:%d %s %016llx\n", proc->pid, thread->pid, cmd == BR_DEAD_BINDER ? "BR_DEAD_BINDER" : "BR_CLEAR_DEATH_NOTIFICATION_DONE", - (u64)death->cookie); - + (u64)cookie); if (w->type == BINDER_WORK_CLEAR_DEATH_NOTIFICATION) { - list_del(&w->entry); + binder_inner_proc_unlock(proc); kfree(death); binder_stats_deleted(BINDER_STAT_DEATH); - } else - list_move(&w->entry, &proc->delivered_death); + } else { + binder_enqueue_work_ilocked( + w, &proc->delivered_death); + binder_inner_proc_unlock(proc); + } + if (put_user(cmd, (uint32_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(uint32_t); + if (put_user(cookie, + (binder_uintptr_t __user *)ptr)) + return -EFAULT; + ptr += sizeof(binder_uintptr_t); + binder_stat_br(proc, thread, cmd); if (cmd == BR_DEAD_BINDER) goto done; /* DEAD_BINDER notifications can cause transactions */ } break; @@ -2381,16 +4162,14 @@ static int binder_thread_read(struct binder_proc *proc, BUG_ON(t->buffer == NULL); if (t->buffer->target_node) { struct binder_node *target_node = t->buffer->target_node; + struct binder_priority node_prio; tr.target.ptr = target_node->ptr; tr.cookie = target_node->cookie; - t->saved_priority = task_nice(current); - if (t->priority < target_node->min_priority && - !(t->flags & TF_ONE_WAY)) - binder_set_nice(t->priority); - else if (!(t->flags & TF_ONE_WAY) || - t->saved_priority > target_node->min_priority) - binder_set_nice(target_node->min_priority); + node_prio.sched_policy = target_node->sched_policy; + node_prio.prio = target_node->min_priority; + binder_transaction_priority(current, t, node_prio, + target_node->inherit_rt); cmd = BR_TRANSACTION; } else { tr.target.ptr = 0; @@ -2401,8 +4180,9 @@ static int binder_thread_read(struct binder_proc *proc, tr.flags = t->flags; tr.sender_euid = from_kuid(current_user_ns(), t->sender_euid); - if (t->from) { - struct task_struct *sender = t->from->proc->tsk; + t_from = binder_get_txn_from(t); + if (t_from) { + struct task_struct *sender = t_from->proc->tsk; tr.sender_pid = task_tgid_nr_ns(sender, task_active_pid_ns(current)); @@ -2412,18 +4192,32 @@ static int binder_thread_read(struct binder_proc *proc, tr.data_size = t->buffer->data_size; tr.offsets_size = t->buffer->offsets_size; - tr.data.ptr.buffer = (binder_uintptr_t)( - (uintptr_t)t->buffer->data + - proc->user_buffer_offset); + tr.data.ptr.buffer = (binder_uintptr_t) + ((uintptr_t)t->buffer->data + + binder_alloc_get_user_buffer_offset(&proc->alloc)); tr.data.ptr.offsets = tr.data.ptr.buffer + ALIGN(t->buffer->data_size, sizeof(void *)); - if (put_user(cmd, (uint32_t __user *)ptr)) + if (put_user(cmd, (uint32_t __user *)ptr)) { + if (t_from) + binder_thread_dec_tmpref(t_from); + + binder_cleanup_transaction(t, "put_user failed", + BR_FAILED_REPLY); + return -EFAULT; + } ptr += sizeof(uint32_t); - if (copy_to_user(ptr, &tr, sizeof(tr))) + if (copy_to_user(ptr, &tr, sizeof(tr))) { + if (t_from) + binder_thread_dec_tmpref(t_from); + + binder_cleanup_transaction(t, "copy_to_user failed", + BR_FAILED_REPLY); + return -EFAULT; + } ptr += sizeof(tr); trace_binder_transaction_received(t); @@ -2433,21 +4227,22 @@ static int binder_thread_read(struct binder_proc *proc, proc->pid, thread->pid, (cmd == BR_TRANSACTION) ? "BR_TRANSACTION" : "BR_REPLY", - t->debug_id, t->from ? t->from->proc->pid : 0, - t->from ? t->from->pid : 0, cmd, + t->debug_id, t_from ? t_from->proc->pid : 0, + t_from ? t_from->pid : 0, cmd, t->buffer->data_size, t->buffer->offsets_size, (u64)tr.data.ptr.buffer, (u64)tr.data.ptr.offsets); - list_del(&t->work.entry); + if (t_from) + binder_thread_dec_tmpref(t_from); t->buffer->allow_user_free = 1; if (cmd == BR_TRANSACTION && !(t->flags & TF_ONE_WAY)) { + binder_inner_proc_lock(thread->proc); t->to_parent = thread->transaction_stack; t->to_thread = thread; thread->transaction_stack = t; + binder_inner_proc_unlock(thread->proc); } else { - t->buffer->transaction = NULL; - kfree(t); - binder_stats_deleted(BINDER_STAT_TRANSACTION); + binder_free_transaction(t); } break; } @@ -2455,45 +4250,52 @@ static int binder_thread_read(struct binder_proc *proc, done: *consumed = ptr - buffer; - if (proc->requested_threads + proc->ready_threads == 0 && + binder_inner_proc_lock(proc); + if (proc->requested_threads == 0 && + list_empty(&thread->proc->waiting_threads) && proc->requested_threads_started < proc->max_threads && (thread->looper & (BINDER_LOOPER_STATE_REGISTERED | BINDER_LOOPER_STATE_ENTERED)) /* the user-space code fails to */ /*spawn a new thread if we leave this out */) { proc->requested_threads++; + binder_inner_proc_unlock(proc); binder_debug(BINDER_DEBUG_THREADS, "%d:%d BR_SPAWN_LOOPER\n", proc->pid, thread->pid); if (put_user(BR_SPAWN_LOOPER, (uint32_t __user *)buffer)) return -EFAULT; binder_stat_br(proc, thread, BR_SPAWN_LOOPER); - } + } else + binder_inner_proc_unlock(proc); return 0; } -static void binder_release_work(struct list_head *list) +static void binder_release_work(struct binder_proc *proc, + struct list_head *list) { struct binder_work *w; - while (!list_empty(list)) { - w = list_first_entry(list, struct binder_work, entry); - list_del_init(&w->entry); + while (1) { + w = binder_dequeue_work_head(proc, list); + if (!w) + return; + switch (w->type) { case BINDER_WORK_TRANSACTION: { struct binder_transaction *t; t = container_of(w, struct binder_transaction, work); - if (t->buffer->target_node && - !(t->flags & TF_ONE_WAY)) { - binder_send_failed_reply(t, BR_DEAD_REPLY); - } else { - binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, - "undelivered transaction %d\n", - t->debug_id); - t->buffer->transaction = NULL; - kfree(t); - binder_stats_deleted(BINDER_STAT_TRANSACTION); - } + + binder_cleanup_transaction(t, "process died.", + BR_DEAD_REPLY); + } break; + case BINDER_WORK_RETURN_ERROR: { + struct binder_error *e = container_of( + w, struct binder_error, work); + + binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, + "undelivered TRANSACTION_ERROR: %u\n", + e->cmd); } break; case BINDER_WORK_TRANSACTION_COMPLETE: { binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, @@ -2521,7 +4323,8 @@ static void binder_release_work(struct list_head *list) } -static struct binder_thread *binder_get_thread(struct binder_proc *proc) +static struct binder_thread *binder_get_thread_ilocked( + struct binder_proc *proc, struct binder_thread *new_thread) { struct binder_thread *thread = NULL; struct rb_node *parent = NULL; @@ -2536,38 +4339,102 @@ static struct binder_thread *binder_get_thread(struct binder_proc *proc) else if (current->pid > thread->pid) p = &(*p)->rb_right; else - break; + return thread; } - if (*p == NULL) { - thread = kzalloc(sizeof(*thread), GFP_KERNEL); - if (thread == NULL) + if (!new_thread) + return NULL; + thread = new_thread; + binder_stats_created(BINDER_STAT_THREAD); + thread->proc = proc; + thread->pid = current->pid; + get_task_struct(current); + thread->task = current; + atomic_set(&thread->tmp_ref, 0); + init_waitqueue_head(&thread->wait); + INIT_LIST_HEAD(&thread->todo); + rb_link_node(&thread->rb_node, parent, p); + rb_insert_color(&thread->rb_node, &proc->threads); + thread->looper_need_return = true; + thread->return_error.work.type = BINDER_WORK_RETURN_ERROR; + thread->return_error.cmd = BR_OK; + thread->reply_error.work.type = BINDER_WORK_RETURN_ERROR; + thread->reply_error.cmd = BR_OK; + INIT_LIST_HEAD(&new_thread->waiting_thread_node); + return thread; +} + +static struct binder_thread *binder_get_thread(struct binder_proc *proc) +{ + struct binder_thread *thread; + struct binder_thread *new_thread; + + binder_inner_proc_lock(proc); + thread = binder_get_thread_ilocked(proc, NULL); + binder_inner_proc_unlock(proc); + if (!thread) { + new_thread = kzalloc(sizeof(*thread), GFP_KERNEL); + if (new_thread == NULL) return NULL; - binder_stats_created(BINDER_STAT_THREAD); - thread->proc = proc; - thread->pid = current->pid; - init_waitqueue_head(&thread->wait); - INIT_LIST_HEAD(&thread->todo); - rb_link_node(&thread->rb_node, parent, p); - rb_insert_color(&thread->rb_node, &proc->threads); - thread->looper |= BINDER_LOOPER_STATE_NEED_RETURN; - thread->return_error = BR_OK; - thread->return_error2 = BR_OK; + binder_inner_proc_lock(proc); + thread = binder_get_thread_ilocked(proc, new_thread); + binder_inner_proc_unlock(proc); + if (thread != new_thread) + kfree(new_thread); } return thread; } -static int binder_free_thread(struct binder_proc *proc, - struct binder_thread *thread) +static void binder_free_proc(struct binder_proc *proc) +{ + BUG_ON(!list_empty(&proc->todo)); + BUG_ON(!list_empty(&proc->delivered_death)); + binder_alloc_deferred_release(&proc->alloc); + put_task_struct(proc->tsk); + binder_stats_deleted(BINDER_STAT_PROC); + kfree(proc); +} + +static void binder_free_thread(struct binder_thread *thread) +{ + BUG_ON(!list_empty(&thread->todo)); + binder_stats_deleted(BINDER_STAT_THREAD); + binder_proc_dec_tmpref(thread->proc); + put_task_struct(thread->task); + kfree(thread); +} + +static int binder_thread_release(struct binder_proc *proc, + struct binder_thread *thread) { struct binder_transaction *t; struct binder_transaction *send_reply = NULL; int active_transactions = 0; - + struct binder_transaction *last_t = NULL; + + binder_inner_proc_lock(thread->proc); + /* + * take a ref on the proc so it survives + * after we remove this thread from proc->threads. + * The corresponding dec is when we actually + * free the thread in binder_free_thread() + */ + proc->tmp_ref++; + /* + * take a ref on this thread to ensure it + * survives while we are releasing it + */ + atomic_inc(&thread->tmp_ref); rb_erase(&thread->rb_node, &proc->threads); t = thread->transaction_stack; - if (t && t->to_thread == thread) - send_reply = t; + if (t) { + spin_lock(&t->lock); + if (t->to_thread == thread) + send_reply = t; + } + thread->is_dead = true; + while (t) { + last_t = t; active_transactions++; binder_debug(BINDER_DEBUG_DEAD_TRANSACTION, "release %d:%d transaction %d %s, still active\n", @@ -2588,12 +4455,16 @@ static int binder_free_thread(struct binder_proc *proc, t = t->from_parent; } else BUG(); + spin_unlock(&last_t->lock); + if (t) + spin_lock(&t->lock); } + binder_inner_proc_unlock(thread->proc); + if (send_reply) binder_send_failed_reply(send_reply, BR_DEAD_REPLY); - binder_release_work(&thread->todo); - kfree(thread); - binder_stats_deleted(BINDER_STAT_THREAD); + binder_release_work(proc, &thread->todo); + binder_thread_dec_tmpref(thread); return active_transactions; } @@ -2602,30 +4473,21 @@ static unsigned int binder_poll(struct file *filp, { struct binder_proc *proc = filp->private_data; struct binder_thread *thread = NULL; - int wait_for_proc_work; - - binder_lock(__func__); + bool wait_for_proc_work; thread = binder_get_thread(proc); - wait_for_proc_work = thread->transaction_stack == NULL && - list_empty(&thread->todo) && thread->return_error == BR_OK; + binder_inner_proc_lock(thread->proc); + thread->looper |= BINDER_LOOPER_STATE_POLL; + wait_for_proc_work = binder_available_for_proc_work_ilocked(thread); - binder_unlock(__func__); + binder_inner_proc_unlock(thread->proc); + + poll_wait(filp, &thread->wait, wait); + + if (binder_has_work(thread, wait_for_proc_work)) + return POLLIN; - if (wait_for_proc_work) { - if (binder_has_proc_work(proc, thread)) - return POLLIN; - poll_wait(filp, &proc->wait, wait); - if (binder_has_proc_work(proc, thread)) - return POLLIN; - } else { - if (binder_has_thread_work(thread)) - return POLLIN; - poll_wait(filp, &thread->wait, wait); - if (binder_has_thread_work(thread)) - return POLLIN; - } return 0; } @@ -2672,8 +4534,10 @@ static int binder_ioctl_write_read(struct file *filp, &bwr.read_consumed, filp->f_flags & O_NONBLOCK); trace_binder_read_done(ret); - if (!list_empty(&proc->todo)) - wake_up_interruptible(&proc->wait); + binder_inner_proc_lock(proc); + if (!binder_worklist_empty_ilocked(&proc->todo)) + binder_wakeup_proc_ilocked(proc); + binder_inner_proc_unlock(proc); if (ret < 0) { if (copy_to_user(ubuf, &bwr, sizeof(bwr))) ret = -EFAULT; @@ -2697,38 +4561,73 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp) { int ret = 0; struct binder_proc *proc = filp->private_data; + struct binder_context *context = proc->context; + struct binder_node *new_node; kuid_t curr_euid = current_euid(); - if (binder_context_mgr_node != NULL) { + mutex_lock(&context->context_mgr_node_lock); + if (context->binder_context_mgr_node) { pr_err("BINDER_SET_CONTEXT_MGR already set\n"); ret = -EBUSY; goto out; } - if (uid_valid(binder_context_mgr_uid)) { - if (!uid_eq(binder_context_mgr_uid, curr_euid)) { + ret = security_binder_set_context_mgr(proc->tsk); + if (ret < 0) + goto out; + if (uid_valid(context->binder_context_mgr_uid)) { + if (!uid_eq(context->binder_context_mgr_uid, curr_euid)) { pr_err("BINDER_SET_CONTEXT_MGR bad uid %d != %d\n", from_kuid(&init_user_ns, curr_euid), from_kuid(&init_user_ns, - binder_context_mgr_uid)); + context->binder_context_mgr_uid)); ret = -EPERM; goto out; } } else { - binder_context_mgr_uid = curr_euid; + context->binder_context_mgr_uid = curr_euid; } - binder_context_mgr_node = binder_new_node(proc, 0, 0); - if (binder_context_mgr_node == NULL) { + new_node = binder_new_node(proc, NULL); + if (!new_node) { ret = -ENOMEM; goto out; } - binder_context_mgr_node->local_weak_refs++; - binder_context_mgr_node->local_strong_refs++; - binder_context_mgr_node->has_strong_ref = 1; - binder_context_mgr_node->has_weak_ref = 1; + binder_node_lock(new_node); + new_node->local_weak_refs++; + new_node->local_strong_refs++; + new_node->has_strong_ref = 1; + new_node->has_weak_ref = 1; + context->binder_context_mgr_node = new_node; + binder_node_unlock(new_node); + binder_put_node(new_node); out: + mutex_unlock(&context->context_mgr_node_lock); return ret; } +static int binder_ioctl_get_node_debug_info(struct binder_proc *proc, + struct binder_node_debug_info *info) { + struct rb_node *n; + binder_uintptr_t ptr = info->ptr; + + memset(info, 0, sizeof(*info)); + + binder_inner_proc_lock(proc); + for (n = rb_first(&proc->nodes); n != NULL; n = rb_next(n)) { + struct binder_node *node = rb_entry(n, struct binder_node, + rb_node); + if (node->ptr > ptr) { + info->ptr = node->ptr; + info->cookie = node->cookie; + info->has_strong_ref = node->has_strong_ref; + info->has_weak_ref = node->has_weak_ref; + break; + } + } + binder_inner_proc_unlock(proc); + + return 0; +} + static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { int ret; @@ -2740,13 +4639,14 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) /*pr_info("binder_ioctl: %d:%d %x %lx\n", proc->pid, current->pid, cmd, arg);*/ + binder_selftest_alloc(&proc->alloc); + trace_binder_ioctl(cmd, arg); ret = wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2); if (ret) goto err_unlocked; - binder_lock(__func__); thread = binder_get_thread(proc); if (thread == NULL) { ret = -ENOMEM; @@ -2759,24 +4659,28 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) if (ret) goto err; break; - case BINDER_SET_MAX_THREADS: - if (copy_from_user(&proc->max_threads, ubuf, sizeof(proc->max_threads))) { + case BINDER_SET_MAX_THREADS: { + int max_threads; + + if (copy_from_user(&max_threads, ubuf, + sizeof(max_threads))) { ret = -EINVAL; goto err; } + binder_inner_proc_lock(proc); + proc->max_threads = max_threads; + binder_inner_proc_unlock(proc); break; + } case BINDER_SET_CONTEXT_MGR: ret = binder_ioctl_set_ctx_mgr(filp); if (ret) goto err; - ret = security_binder_set_context_mgr(proc->tsk); - if (ret < 0) - goto err; break; case BINDER_THREAD_EXIT: binder_debug(BINDER_DEBUG_THREADS, "%d:%d exit\n", proc->pid, thread->pid); - binder_free_thread(proc, thread); + binder_thread_release(proc, thread); thread = NULL; break; case BINDER_VERSION: { @@ -2793,6 +4697,24 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) } break; } + case BINDER_GET_NODE_DEBUG_INFO: { + struct binder_node_debug_info info; + + if (copy_from_user(&info, ubuf, sizeof(info))) { + ret = -EFAULT; + goto err; + } + + ret = binder_ioctl_get_node_debug_info(proc, &info); + if (ret < 0) + goto err; + + if (copy_to_user(ubuf, &info, sizeof(info))) { + ret = -EFAULT; + goto err; + } + break; + } default: ret = -EINVAL; goto err; @@ -2800,8 +4722,7 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) ret = 0; err: if (thread) - thread->looper &= ~BINDER_LOOPER_STATE_NEED_RETURN; - binder_unlock(__func__); + thread->looper_need_return = false; wait_event_interruptible(binder_user_error_wait, binder_stop_on_user_error < 2); if (ret && ret != -ERESTARTSYS) pr_info("%d:%d ioctl %x %lx returned %d\n", proc->pid, current->pid, cmd, arg, ret); @@ -2830,8 +4751,7 @@ static void binder_vma_close(struct vm_area_struct *vma) proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, (unsigned long)pgprot_val(vma->vm_page_prot)); - proc->vma = NULL; - proc->vma_vm_mm = NULL; + binder_alloc_vma_close(&proc->alloc); binder_defer_work(proc, BINDER_DEFERRED_PUT_FILES); } @@ -2849,20 +4769,18 @@ static struct vm_operations_struct binder_vm_ops = { static int binder_mmap(struct file *filp, struct vm_area_struct *vma) { int ret; - struct vm_struct *area; struct binder_proc *proc = filp->private_data; const char *failure_string; - struct binder_buffer *buffer; - if (proc->tsk != current) + if (proc->tsk != current->group_leader) return -EINVAL; if ((vma->vm_end - vma->vm_start) > SZ_4M) vma->vm_end = vma->vm_start + SZ_4M; binder_debug(BINDER_DEBUG_OPEN_CLOSE, - "binder_mmap: %d %lx-%lx (%ld K) vma %lx pagep %lx\n", - proc->pid, vma->vm_start, vma->vm_end, + "%s: %d %lx-%lx (%ld K) vma %lx pagep %lx\n", + __func__, proc->pid, vma->vm_start, vma->vm_end, (vma->vm_end - vma->vm_start) / SZ_1K, vma->vm_flags, (unsigned long)pgprot_val(vma->vm_page_prot)); @@ -2872,73 +4790,15 @@ static int binder_mmap(struct file *filp, struct vm_area_struct *vma) goto err_bad_arg; } vma->vm_flags = (vma->vm_flags | VM_DONTCOPY) & ~VM_MAYWRITE; - - mutex_lock(&binder_mmap_lock); - if (proc->buffer) { - ret = -EBUSY; - failure_string = "already mapped"; - goto err_already_mapped; - } - - area = get_vm_area(vma->vm_end - vma->vm_start, VM_IOREMAP); - if (area == NULL) { - ret = -ENOMEM; - failure_string = "get_vm_area"; - goto err_get_vm_area_failed; - } - proc->buffer = area->addr; - proc->user_buffer_offset = vma->vm_start - (uintptr_t)proc->buffer; - mutex_unlock(&binder_mmap_lock); - -#ifdef CONFIG_CPU_CACHE_VIPT - if (cache_is_vipt_aliasing()) { - while (CACHE_COLOUR((vma->vm_start ^ (uint32_t)proc->buffer))) { - pr_info("binder_mmap: %d %lx-%lx maps %p bad alignment\n", proc->pid, vma->vm_start, vma->vm_end, proc->buffer); - vma->vm_start += PAGE_SIZE; - } - } -#endif - proc->pages = kzalloc(sizeof(proc->pages[0]) * ((vma->vm_end - vma->vm_start) / PAGE_SIZE), GFP_KERNEL); - if (proc->pages == NULL) { - ret = -ENOMEM; - failure_string = "alloc page array"; - goto err_alloc_pages_failed; - } - proc->buffer_size = vma->vm_end - vma->vm_start; - vma->vm_ops = &binder_vm_ops; vma->vm_private_data = proc; - if (binder_update_page_range(proc, 1, proc->buffer, proc->buffer + PAGE_SIZE, vma)) { - ret = -ENOMEM; - failure_string = "alloc small buf"; - goto err_alloc_small_buf_failed; - } - buffer = proc->buffer; - INIT_LIST_HEAD(&proc->buffers); - list_add(&buffer->entry, &proc->buffers); - buffer->free = 1; - binder_insert_free_buffer(proc, buffer); - proc->free_async_space = proc->buffer_size / 2; - barrier(); + ret = binder_alloc_mmap_handler(&proc->alloc, vma); + if (ret) + return ret; proc->files = get_files_struct(current); - proc->vma = vma; - proc->vma_vm_mm = vma->vm_mm; - - /*pr_info("binder_mmap: %d %lx-%lx maps %p\n", - proc->pid, vma->vm_start, vma->vm_end, proc->buffer);*/ return 0; -err_alloc_small_buf_failed: - kfree(proc->pages); - proc->pages = NULL; -err_alloc_pages_failed: - mutex_lock(&binder_mmap_lock); - vfree(proc->buffer); - proc->buffer = NULL; -err_get_vm_area_failed: -err_already_mapped: - mutex_unlock(&binder_mmap_lock); err_bad_arg: pr_err("binder_mmap: %d %lx-%lx %s failed %d\n", proc->pid, vma->vm_start, vma->vm_end, failure_string, ret); @@ -2948,6 +4808,7 @@ static int binder_mmap(struct file *filp, struct vm_area_struct *vma) static int binder_open(struct inode *nodp, struct file *filp) { struct binder_proc *proc; + struct binder_device *binder_dev; binder_debug(BINDER_DEBUG_OPEN_CLOSE, "binder_open: %d:%d\n", current->group_leader->pid, current->pid); @@ -2955,28 +4816,49 @@ static int binder_open(struct inode *nodp, struct file *filp) proc = kzalloc(sizeof(*proc), GFP_KERNEL); if (proc == NULL) return -ENOMEM; - get_task_struct(current); - proc->tsk = current; + spin_lock_init(&proc->inner_lock); + spin_lock_init(&proc->outer_lock); + get_task_struct(current->group_leader); + proc->tsk = current->group_leader; INIT_LIST_HEAD(&proc->todo); - init_waitqueue_head(&proc->wait); - proc->default_priority = task_nice(current); + if (binder_supported_policy(current->policy)) { + proc->default_priority.sched_policy = current->policy; + proc->default_priority.prio = current->normal_prio; + } else { + proc->default_priority.sched_policy = SCHED_NORMAL; + proc->default_priority.prio = NICE_TO_PRIO(0); + } - binder_lock(__func__); + binder_dev = container_of(filp->private_data, struct binder_device, + miscdev); + proc->context = &binder_dev->context; + binder_alloc_init(&proc->alloc); binder_stats_created(BINDER_STAT_PROC); - hlist_add_head(&proc->proc_node, &binder_procs); proc->pid = current->group_leader->pid; INIT_LIST_HEAD(&proc->delivered_death); + INIT_LIST_HEAD(&proc->waiting_threads); filp->private_data = proc; - binder_unlock(__func__); + mutex_lock(&binder_procs_lock); + hlist_add_head(&proc->proc_node, &binder_procs); + mutex_unlock(&binder_procs_lock); if (binder_debugfs_dir_entry_proc) { char strbuf[11]; snprintf(strbuf, sizeof(strbuf), "%u", proc->pid); + /* + * proc debug entries are shared between contexts, so + * this will fail if the process tries to open the driver + * again with a different context. The priting code will + * anyway print all contexts that a given PID has, so this + * is not a problem. + */ proc->debugfs_entry = debugfs_create_file(strbuf, S_IRUGO, - binder_debugfs_dir_entry_proc, proc, &binder_proc_fops); + binder_debugfs_dir_entry_proc, + (void *)(unsigned long)proc->pid, + &binder_proc_fops); } return 0; @@ -2996,16 +4878,17 @@ static void binder_deferred_flush(struct binder_proc *proc) struct rb_node *n; int wake_count = 0; + binder_inner_proc_lock(proc); for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) { struct binder_thread *thread = rb_entry(n, struct binder_thread, rb_node); - thread->looper |= BINDER_LOOPER_STATE_NEED_RETURN; + thread->looper_need_return = true; if (thread->looper & BINDER_LOOPER_STATE_WAITING) { wake_up_interruptible(&thread->wait); wake_count++; } } - wake_up_interruptible_all(&proc->wait); + binder_inner_proc_unlock(proc); binder_debug(BINDER_DEBUG_OPEN_CLOSE, "binder_flush: %d woke %d threads\n", proc->pid, @@ -3026,13 +4909,21 @@ static int binder_node_release(struct binder_node *node, int refs) { struct binder_ref *ref; int death = 0; - - list_del_init(&node->work.entry); - binder_release_work(&node->async_todo); - - if (hlist_empty(&node->refs)) { - kfree(node); - binder_stats_deleted(BINDER_STAT_NODE); + struct binder_proc *proc = node->proc; + + binder_release_work(proc, &node->async_todo); + + binder_node_lock(node); + binder_inner_proc_lock(proc); + binder_dequeue_work_ilocked(&node->work); + /* + * The caller must have taken a temporary ref on the node, + */ + BUG_ON(!node->tmp_refs); + if (hlist_empty(&node->refs) && node->tmp_refs == 1) { + binder_inner_proc_unlock(proc); + binder_node_unlock(node); + binder_free_node(node); return refs; } @@ -3040,59 +4931,84 @@ static int binder_node_release(struct binder_node *node, int refs) node->proc = NULL; node->local_strong_refs = 0; node->local_weak_refs = 0; + binder_inner_proc_unlock(proc); + + spin_lock(&binder_dead_nodes_lock); hlist_add_head(&node->dead_node, &binder_dead_nodes); + spin_unlock(&binder_dead_nodes_lock); hlist_for_each_entry(ref, &node->refs, node_entry) { refs++; - - if (!ref->death) + /* + * Need the node lock to synchronize + * with new notification requests and the + * inner lock to synchronize with queued + * death notifications. + */ + binder_inner_proc_lock(ref->proc); + if (!ref->death) { + binder_inner_proc_unlock(ref->proc); continue; + } death++; - if (list_empty(&ref->death->work.entry)) { - ref->death->work.type = BINDER_WORK_DEAD_BINDER; - list_add_tail(&ref->death->work.entry, - &ref->proc->todo); - wake_up_interruptible(&ref->proc->wait); - } else - BUG(); + BUG_ON(!list_empty(&ref->death->work.entry)); + ref->death->work.type = BINDER_WORK_DEAD_BINDER; + binder_enqueue_work_ilocked(&ref->death->work, + &ref->proc->todo); + binder_wakeup_proc_ilocked(ref->proc); + binder_inner_proc_unlock(ref->proc); } binder_debug(BINDER_DEBUG_DEAD_BINDER, "node %d now dead, refs %d, death %d\n", node->debug_id, refs, death); + binder_node_unlock(node); + binder_put_node(node); return refs; } static void binder_deferred_release(struct binder_proc *proc) { - struct binder_transaction *t; + struct binder_context *context = proc->context; struct rb_node *n; - int threads, nodes, incoming_refs, outgoing_refs, buffers, - active_transactions, page_count; + int threads, nodes, incoming_refs, outgoing_refs, active_transactions; - BUG_ON(proc->vma); BUG_ON(proc->files); + mutex_lock(&binder_procs_lock); hlist_del(&proc->proc_node); + mutex_unlock(&binder_procs_lock); - if (binder_context_mgr_node && binder_context_mgr_node->proc == proc) { + mutex_lock(&context->context_mgr_node_lock); + if (context->binder_context_mgr_node && + context->binder_context_mgr_node->proc == proc) { binder_debug(BINDER_DEBUG_DEAD_BINDER, "%s: %d context_mgr_node gone\n", __func__, proc->pid); - binder_context_mgr_node = NULL; + context->binder_context_mgr_node = NULL; } - + mutex_unlock(&context->context_mgr_node_lock); + binder_inner_proc_lock(proc); + /* + * Make sure proc stays alive after we + * remove all the threads + */ + proc->tmp_ref++; + + proc->is_dead = true; threads = 0; active_transactions = 0; while ((n = rb_first(&proc->threads))) { struct binder_thread *thread; thread = rb_entry(n, struct binder_thread, rb_node); + binder_inner_proc_unlock(proc); threads++; - active_transactions += binder_free_thread(proc, thread); + active_transactions += binder_thread_release(proc, thread); + binder_inner_proc_lock(proc); } nodes = 0; @@ -3102,73 +5018,42 @@ static void binder_deferred_release(struct binder_proc *proc) node = rb_entry(n, struct binder_node, rb_node); nodes++; + /* + * take a temporary ref on the node before + * calling binder_node_release() which will either + * kfree() the node or call binder_put_node() + */ + binder_inc_node_tmpref_ilocked(node); rb_erase(&node->rb_node, &proc->nodes); + binder_inner_proc_unlock(proc); incoming_refs = binder_node_release(node, incoming_refs); + binder_inner_proc_lock(proc); } + binder_inner_proc_unlock(proc); outgoing_refs = 0; + binder_proc_lock(proc); while ((n = rb_first(&proc->refs_by_desc))) { struct binder_ref *ref; ref = rb_entry(n, struct binder_ref, rb_node_desc); outgoing_refs++; - binder_delete_ref(ref); - } - - binder_release_work(&proc->todo); - binder_release_work(&proc->delivered_death); - - buffers = 0; - while ((n = rb_first(&proc->allocated_buffers))) { - struct binder_buffer *buffer; - - buffer = rb_entry(n, struct binder_buffer, rb_node); - - t = buffer->transaction; - if (t) { - t->buffer = NULL; - buffer->transaction = NULL; - pr_err("release proc %d, transaction %d, not freed\n", - proc->pid, t->debug_id); - /*BUG();*/ - } - - binder_free_buf(proc, buffer); - buffers++; - } - - binder_stats_deleted(BINDER_STAT_PROC); - - page_count = 0; - if (proc->pages) { - int i; - - for (i = 0; i < proc->buffer_size / PAGE_SIZE; i++) { - void *page_addr; - - if (!proc->pages[i]) - continue; - - page_addr = proc->buffer + i * PAGE_SIZE; - binder_debug(BINDER_DEBUG_BUFFER_ALLOC, - "%s: %d: page %d at %p not freed\n", - __func__, proc->pid, i, page_addr); - unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE); - __free_page(proc->pages[i]); - page_count++; - } - kfree(proc->pages); - vfree(proc->buffer); + binder_cleanup_ref_olocked(ref); + binder_proc_unlock(proc); + binder_free_ref(ref); + binder_proc_lock(proc); } + binder_proc_unlock(proc); - put_task_struct(proc->tsk); + binder_release_work(proc, &proc->todo); + binder_release_work(proc, &proc->delivered_death); binder_debug(BINDER_DEBUG_OPEN_CLOSE, - "%s: %d threads %d, nodes %d (ref %d), refs %d, active transactions %d, buffers %d, pages %d\n", + "%s: %d threads %d, nodes %d (ref %d), refs %d, active transactions %d\n", __func__, proc->pid, threads, nodes, incoming_refs, - outgoing_refs, active_transactions, buffers, page_count); + outgoing_refs, active_transactions); - kfree(proc); + binder_proc_dec_tmpref(proc); } static void binder_deferred_func(struct work_struct *work) @@ -3179,7 +5064,6 @@ static void binder_deferred_func(struct work_struct *work) int defer; do { - binder_lock(__func__); mutex_lock(&binder_deferred_lock); if (!hlist_empty(&binder_deferred_list)) { proc = hlist_entry(binder_deferred_list.first, @@ -3206,7 +5090,6 @@ static void binder_deferred_func(struct work_struct *work) if (defer & BINDER_DEFERRED_RELEASE) binder_deferred_release(proc); /* frees proc */ - binder_unlock(__func__); if (files) put_files_struct(files); } while (proc); @@ -3226,41 +5109,52 @@ binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer) mutex_unlock(&binder_deferred_lock); } -static void print_binder_transaction(struct seq_file *m, const char *prefix, - struct binder_transaction *t) +static void print_binder_transaction_ilocked(struct seq_file *m, + struct binder_proc *proc, + const char *prefix, + struct binder_transaction *t) { + struct binder_proc *to_proc; + struct binder_buffer *buffer = t->buffer; + + spin_lock(&t->lock); + to_proc = t->to_proc; seq_printf(m, - "%s %d: %p from %d:%d to %d:%d code %x flags %x pri %ld r%d", + "%s %d: %p from %d:%d to %d:%d code %x flags %x pri %d:%d r%d", prefix, t->debug_id, t, t->from ? t->from->proc->pid : 0, t->from ? t->from->pid : 0, - t->to_proc ? t->to_proc->pid : 0, + to_proc ? to_proc->pid : 0, t->to_thread ? t->to_thread->pid : 0, - t->code, t->flags, t->priority, t->need_reply); - if (t->buffer == NULL) { + t->code, t->flags, t->priority.sched_policy, + t->priority.prio, t->need_reply); + spin_unlock(&t->lock); + + if (proc != to_proc) { + /* + * Can only safely deref buffer if we are holding the + * correct proc inner lock for this node + */ + seq_puts(m, "\n"); + return; + } + + if (buffer == NULL) { seq_puts(m, " buffer free\n"); return; } - if (t->buffer->target_node) - seq_printf(m, " node %d", - t->buffer->target_node->debug_id); + if (buffer->target_node) + seq_printf(m, " node %d", buffer->target_node->debug_id); seq_printf(m, " size %zd:%zd data %p\n", - t->buffer->data_size, t->buffer->offsets_size, - t->buffer->data); -} - -static void print_binder_buffer(struct seq_file *m, const char *prefix, - struct binder_buffer *buffer) -{ - seq_printf(m, "%s %d: %p size %zd:%zd %s\n", - prefix, buffer->debug_id, buffer->data, buffer->data_size, buffer->offsets_size, - buffer->transaction ? "active" : "delivered"); + buffer->data); } -static void print_binder_work(struct seq_file *m, const char *prefix, - const char *transaction_prefix, - struct binder_work *w) +static void print_binder_work_ilocked(struct seq_file *m, + struct binder_proc *proc, + const char *prefix, + const char *transaction_prefix, + struct binder_work *w) { struct binder_node *node; struct binder_transaction *t; @@ -3268,8 +5162,16 @@ static void print_binder_work(struct seq_file *m, const char *prefix, switch (w->type) { case BINDER_WORK_TRANSACTION: t = container_of(w, struct binder_transaction, work); - print_binder_transaction(m, transaction_prefix, t); + print_binder_transaction_ilocked( + m, proc, transaction_prefix, t); break; + case BINDER_WORK_RETURN_ERROR: { + struct binder_error *e = container_of( + w, struct binder_error, work); + + seq_printf(m, "%stransaction error: %u\n", + prefix, e->cmd); + } break; case BINDER_WORK_TRANSACTION_COMPLETE: seq_printf(m, "%stransaction complete\n", prefix); break; @@ -3294,40 +5196,46 @@ static void print_binder_work(struct seq_file *m, const char *prefix, } } -static void print_binder_thread(struct seq_file *m, - struct binder_thread *thread, - int print_always) +static void print_binder_thread_ilocked(struct seq_file *m, + struct binder_thread *thread, + int print_always) { struct binder_transaction *t; struct binder_work *w; size_t start_pos = m->count; size_t header_pos; - seq_printf(m, " thread %d: l %02x\n", thread->pid, thread->looper); + seq_printf(m, " thread %d: l %02x need_return %d tr %d\n", + thread->pid, thread->looper, + thread->looper_need_return, + atomic_read(&thread->tmp_ref)); header_pos = m->count; t = thread->transaction_stack; while (t) { if (t->from == thread) { - print_binder_transaction(m, - " outgoing transaction", t); + print_binder_transaction_ilocked(m, thread->proc, + " outgoing transaction", t); t = t->from_parent; } else if (t->to_thread == thread) { - print_binder_transaction(m, + print_binder_transaction_ilocked(m, thread->proc, " incoming transaction", t); t = t->to_parent; } else { - print_binder_transaction(m, " bad transaction", t); + print_binder_transaction_ilocked(m, thread->proc, + " bad transaction", t); t = NULL; } } list_for_each_entry(w, &thread->todo, entry) { - print_binder_work(m, " ", " pending transaction", w); + print_binder_work_ilocked(m, thread->proc, " ", + " pending transaction", w); } if (!print_always && m->count == header_pos) m->count = start_pos; } -static void print_binder_node(struct seq_file *m, struct binder_node *node) +static void print_binder_node_nilocked(struct seq_file *m, + struct binder_node *node) { struct binder_ref *ref; struct binder_work *w; @@ -3337,27 +5245,35 @@ static void print_binder_node(struct seq_file *m, struct binder_node *node) hlist_for_each_entry(ref, &node->refs, node_entry) count++; - seq_printf(m, " node %d: u%016llx c%016llx hs %d hw %d ls %d lw %d is %d iw %d", + seq_printf(m, " node %d: u%016llx c%016llx pri %d:%d hs %d hw %d ls %d lw %d is %d iw %d tr %d", node->debug_id, (u64)node->ptr, (u64)node->cookie, + node->sched_policy, node->min_priority, node->has_strong_ref, node->has_weak_ref, node->local_strong_refs, node->local_weak_refs, - node->internal_strong_refs, count); + node->internal_strong_refs, count, node->tmp_refs); if (count) { seq_puts(m, " proc"); hlist_for_each_entry(ref, &node->refs, node_entry) seq_printf(m, " %d", ref->proc->pid); } seq_puts(m, "\n"); - list_for_each_entry(w, &node->async_todo, entry) - print_binder_work(m, " ", - " pending async transaction", w); + if (node->proc) { + list_for_each_entry(w, &node->async_todo, entry) + print_binder_work_ilocked(m, node->proc, " ", + " pending async transaction", w); + } } -static void print_binder_ref(struct seq_file *m, struct binder_ref *ref) +static void print_binder_ref_olocked(struct seq_file *m, + struct binder_ref *ref) { - seq_printf(m, " ref %d: desc %d %snode %d s %d w %d d %p\n", - ref->debug_id, ref->desc, ref->node->proc ? "" : "dead ", - ref->node->debug_id, ref->strong, ref->weak, ref->death); + binder_node_lock(ref->node); + seq_printf(m, " ref %d: desc %d %snode %d s %d w %d d %pK\n", + ref->data.debug_id, ref->data.desc, + ref->node->proc ? "" : "dead ", + ref->node->debug_id, ref->data.strong, + ref->data.weak, ref->death); + binder_node_unlock(ref->node); } static void print_binder_proc(struct seq_file *m, @@ -3367,35 +5283,60 @@ static void print_binder_proc(struct seq_file *m, struct rb_node *n; size_t start_pos = m->count; size_t header_pos; + struct binder_node *last_node = NULL; seq_printf(m, "proc %d\n", proc->pid); + seq_printf(m, "context %s\n", proc->context->name); header_pos = m->count; + binder_inner_proc_lock(proc); for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) - print_binder_thread(m, rb_entry(n, struct binder_thread, + print_binder_thread_ilocked(m, rb_entry(n, struct binder_thread, rb_node), print_all); + for (n = rb_first(&proc->nodes); n != NULL; n = rb_next(n)) { struct binder_node *node = rb_entry(n, struct binder_node, rb_node); - if (print_all || node->has_async_transaction) - print_binder_node(m, node); + /* + * take a temporary reference on the node so it + * survives and isn't removed from the tree + * while we print it. + */ + binder_inc_node_tmpref_ilocked(node); + /* Need to drop inner lock to take node lock */ + binder_inner_proc_unlock(proc); + if (last_node) + binder_put_node(last_node); + binder_node_inner_lock(node); + print_binder_node_nilocked(m, node); + binder_node_inner_unlock(node); + last_node = node; + binder_inner_proc_lock(proc); } + binder_inner_proc_unlock(proc); + if (last_node) + binder_put_node(last_node); + if (print_all) { + binder_proc_lock(proc); for (n = rb_first(&proc->refs_by_desc); n != NULL; n = rb_next(n)) - print_binder_ref(m, rb_entry(n, struct binder_ref, - rb_node_desc)); + print_binder_ref_olocked(m, rb_entry(n, + struct binder_ref, + rb_node_desc)); + binder_proc_unlock(proc); } - for (n = rb_first(&proc->allocated_buffers); n != NULL; n = rb_next(n)) - print_binder_buffer(m, " buffer", - rb_entry(n, struct binder_buffer, rb_node)); + binder_alloc_print_allocated(m, &proc->alloc); + binder_inner_proc_lock(proc); list_for_each_entry(w, &proc->todo, entry) - print_binder_work(m, " ", " pending transaction", w); + print_binder_work_ilocked(m, proc, " ", + " pending transaction", w); list_for_each_entry(w, &proc->delivered_death, entry) { seq_puts(m, " has delivered dead binder\n"); break; } + binder_inner_proc_unlock(proc); if (!print_all && m->count == header_pos) m->count = start_pos; } @@ -3438,7 +5379,9 @@ static const char * const binder_command_strings[] = { "BC_EXIT_LOOPER", "BC_REQUEST_DEATH_NOTIFICATION", "BC_CLEAR_DEATH_NOTIFICATION", - "BC_DEAD_BINDER_DONE" + "BC_DEAD_BINDER_DONE", + "BC_TRANSACTION_SG", + "BC_REPLY_SG", }; static const char * const binder_objstat_strings[] = { @@ -3459,17 +5402,21 @@ static void print_binder_stats(struct seq_file *m, const char *prefix, BUILD_BUG_ON(ARRAY_SIZE(stats->bc) != ARRAY_SIZE(binder_command_strings)); for (i = 0; i < ARRAY_SIZE(stats->bc); i++) { - if (stats->bc[i]) + int temp = atomic_read(&stats->bc[i]); + + if (temp) seq_printf(m, "%s%s: %d\n", prefix, - binder_command_strings[i], stats->bc[i]); + binder_command_strings[i], temp); } BUILD_BUG_ON(ARRAY_SIZE(stats->br) != ARRAY_SIZE(binder_return_strings)); for (i = 0; i < ARRAY_SIZE(stats->br); i++) { - if (stats->br[i]) + int temp = atomic_read(&stats->br[i]); + + if (temp) seq_printf(m, "%s%s: %d\n", prefix, - binder_return_strings[i], stats->br[i]); + binder_return_strings[i], temp); } BUILD_BUG_ON(ARRAY_SIZE(stats->obj_created) != @@ -3477,11 +5424,15 @@ static void print_binder_stats(struct seq_file *m, const char *prefix, BUILD_BUG_ON(ARRAY_SIZE(stats->obj_created) != ARRAY_SIZE(stats->obj_deleted)); for (i = 0; i < ARRAY_SIZE(stats->obj_created); i++) { - if (stats->obj_created[i] || stats->obj_deleted[i]) - seq_printf(m, "%s%s: active %d total %d\n", prefix, + int created = atomic_read(&stats->obj_created[i]); + int deleted = atomic_read(&stats->obj_deleted[i]); + + if (created || deleted) + seq_printf(m, "%s%s: active %d total %d\n", + prefix, binder_objstat_strings[i], - stats->obj_created[i] - stats->obj_deleted[i], - stats->obj_created[i]); + created - deleted, + created); } } @@ -3489,50 +5440,61 @@ static void print_binder_proc_stats(struct seq_file *m, struct binder_proc *proc) { struct binder_work *w; + struct binder_thread *thread; struct rb_node *n; - int count, strong, weak; + int count, strong, weak, ready_threads; + size_t free_async_space = + binder_alloc_get_free_async_space(&proc->alloc); seq_printf(m, "proc %d\n", proc->pid); + seq_printf(m, "context %s\n", proc->context->name); count = 0; + ready_threads = 0; + binder_inner_proc_lock(proc); for (n = rb_first(&proc->threads); n != NULL; n = rb_next(n)) count++; + + list_for_each_entry(thread, &proc->waiting_threads, waiting_thread_node) + ready_threads++; + seq_printf(m, " threads: %d\n", count); seq_printf(m, " requested threads: %d+%d/%d\n" " ready threads %d\n" " free async space %zd\n", proc->requested_threads, proc->requested_threads_started, proc->max_threads, - proc->ready_threads, proc->free_async_space); + ready_threads, + free_async_space); count = 0; for (n = rb_first(&proc->nodes); n != NULL; n = rb_next(n)) count++; + binder_inner_proc_unlock(proc); seq_printf(m, " nodes: %d\n", count); count = 0; strong = 0; weak = 0; + binder_proc_lock(proc); for (n = rb_first(&proc->refs_by_desc); n != NULL; n = rb_next(n)) { struct binder_ref *ref = rb_entry(n, struct binder_ref, rb_node_desc); count++; - strong += ref->strong; - weak += ref->weak; + strong += ref->data.strong; + weak += ref->data.weak; } + binder_proc_unlock(proc); seq_printf(m, " refs: %d s %d w %d\n", count, strong, weak); - count = 0; - for (n = rb_first(&proc->allocated_buffers); n != NULL; n = rb_next(n)) - count++; + count = binder_alloc_get_allocated_count(&proc->alloc); seq_printf(m, " buffers: %d\n", count); + binder_alloc_print_pages(m, &proc->alloc); + count = 0; + binder_inner_proc_lock(proc); list_for_each_entry(w, &proc->todo, entry) { - switch (w->type) { - case BINDER_WORK_TRANSACTION: + if (w->type == BINDER_WORK_TRANSACTION) count++; - break; - default: - break; - } } + binder_inner_proc_unlock(proc); seq_printf(m, " pending transactions: %d\n", count); print_binder_stats(m, " ", &proc->stats); @@ -3543,107 +5505,131 @@ static int binder_state_show(struct seq_file *m, void *unused) { struct binder_proc *proc; struct binder_node *node; - int do_lock = !binder_debug_no_lock; - - if (do_lock) - binder_lock(__func__); + struct binder_node *last_node = NULL; seq_puts(m, "binder state:\n"); + spin_lock(&binder_dead_nodes_lock); if (!hlist_empty(&binder_dead_nodes)) seq_puts(m, "dead nodes:\n"); - hlist_for_each_entry(node, &binder_dead_nodes, dead_node) - print_binder_node(m, node); + hlist_for_each_entry(node, &binder_dead_nodes, dead_node) { + /* + * take a temporary reference on the node so it + * survives and isn't removed from the list + * while we print it. + */ + node->tmp_refs++; + spin_unlock(&binder_dead_nodes_lock); + if (last_node) + binder_put_node(last_node); + binder_node_lock(node); + print_binder_node_nilocked(m, node); + binder_node_unlock(node); + last_node = node; + spin_lock(&binder_dead_nodes_lock); + } + spin_unlock(&binder_dead_nodes_lock); + if (last_node) + binder_put_node(last_node); + mutex_lock(&binder_procs_lock); hlist_for_each_entry(proc, &binder_procs, proc_node) print_binder_proc(m, proc, 1); - if (do_lock) - binder_unlock(__func__); + mutex_unlock(&binder_procs_lock); + return 0; } static int binder_stats_show(struct seq_file *m, void *unused) { struct binder_proc *proc; - int do_lock = !binder_debug_no_lock; - - if (do_lock) - binder_lock(__func__); seq_puts(m, "binder stats:\n"); print_binder_stats(m, "", &binder_stats); + mutex_lock(&binder_procs_lock); hlist_for_each_entry(proc, &binder_procs, proc_node) print_binder_proc_stats(m, proc); - if (do_lock) - binder_unlock(__func__); + mutex_unlock(&binder_procs_lock); + return 0; } static int binder_transactions_show(struct seq_file *m, void *unused) { struct binder_proc *proc; - int do_lock = !binder_debug_no_lock; - - if (do_lock) - binder_lock(__func__); seq_puts(m, "binder transactions:\n"); + mutex_lock(&binder_procs_lock); hlist_for_each_entry(proc, &binder_procs, proc_node) print_binder_proc(m, proc, 0); - if (do_lock) - binder_unlock(__func__); + mutex_unlock(&binder_procs_lock); + return 0; } static int binder_proc_show(struct seq_file *m, void *unused) { struct binder_proc *itr; - struct binder_proc *proc = m->private; - int do_lock = !binder_debug_no_lock; - bool valid_proc = false; - - if (do_lock) - binder_lock(__func__); + int pid = (unsigned long)m->private; + mutex_lock(&binder_procs_lock); hlist_for_each_entry(itr, &binder_procs, proc_node) { - if (itr == proc) { - valid_proc = true; - break; + if (itr->pid == pid) { + seq_puts(m, "binder proc state:\n"); + print_binder_proc(m, itr, 1); } } - if (valid_proc) { - seq_puts(m, "binder proc state:\n"); - print_binder_proc(m, proc, 1); - } - if (do_lock) - binder_unlock(__func__); + mutex_unlock(&binder_procs_lock); + return 0; } static void print_binder_transaction_log_entry(struct seq_file *m, struct binder_transaction_log_entry *e) { + int debug_id = READ_ONCE(e->debug_id_done); + /* + * read barrier to guarantee debug_id_done read before + * we print the log values + */ + smp_rmb(); seq_printf(m, - "%d: %s from %d:%d to %d:%d node %d handle %d size %d:%d\n", + "%d: %s from %d:%d to %d:%d context %s node %d handle %d size %d:%d ret %d/%d l=%d", e->debug_id, (e->call_type == 2) ? "reply" : ((e->call_type == 1) ? "async" : "call "), e->from_proc, - e->from_thread, e->to_proc, e->to_thread, e->to_node, - e->target_handle, e->data_size, e->offsets_size); + e->from_thread, e->to_proc, e->to_thread, e->context_name, + e->to_node, e->target_handle, e->data_size, e->offsets_size, + e->return_error, e->return_error_param, + e->return_error_line); + /* + * read-barrier to guarantee read of debug_id_done after + * done printing the fields of the entry + */ + smp_rmb(); + seq_printf(m, debug_id && debug_id == READ_ONCE(e->debug_id_done) ? + "\n" : " (incomplete)\n"); } static int binder_transaction_log_show(struct seq_file *m, void *unused) { struct binder_transaction_log *log = m->private; + unsigned int log_cur = atomic_read(&log->cur); + unsigned int count; + unsigned int cur; int i; - if (log->full) { - for (i = log->next; i < ARRAY_SIZE(log->entry); i++) - print_binder_transaction_log_entry(m, &log->entry[i]); + count = log_cur + 1; + cur = count < ARRAY_SIZE(log->entry) && !log->full ? + 0 : count % ARRAY_SIZE(log->entry); + if (count > ARRAY_SIZE(log->entry) || log->full) + count = ARRAY_SIZE(log->entry); + for (i = 0; i < count; i++) { + unsigned int index = cur++ % ARRAY_SIZE(log->entry); + + print_binder_transaction_log_entry(m, &log->entry[index]); } - for (i = 0; i < log->next; i++) - print_binder_transaction_log_entry(m, &log->entry[i]); return 0; } @@ -3658,21 +5644,50 @@ static const struct file_operations binder_fops = { .release = binder_release, }; -static struct miscdevice binder_miscdev = { - .minor = MISC_DYNAMIC_MINOR, - .name = "binder", - .fops = &binder_fops -}; - BINDER_DEBUG_ENTRY(state); BINDER_DEBUG_ENTRY(stats); BINDER_DEBUG_ENTRY(transactions); BINDER_DEBUG_ENTRY(transaction_log); +static int __init init_binder_device(const char *name) +{ + int ret; + struct binder_device *binder_device; + + binder_device = kzalloc(sizeof(*binder_device), GFP_KERNEL); + if (!binder_device) + return -ENOMEM; + + binder_device->miscdev.fops = &binder_fops; + binder_device->miscdev.minor = MISC_DYNAMIC_MINOR; + binder_device->miscdev.name = name; + + binder_device->context.binder_context_mgr_uid = INVALID_UID; + binder_device->context.name = name; + mutex_init(&binder_device->context.context_mgr_node_lock); + + ret = misc_register(&binder_device->miscdev); + if (ret < 0) { + kfree(binder_device); + return ret; + } + + hlist_add_head(&binder_device->hlist, &binder_devices); + + return ret; +} + static int __init binder_init(void) { int ret; + char *device_name, *device_names; + struct binder_device *device; + struct hlist_node *tmp; + binder_alloc_shrinker_init(); + + atomic_set(&binder_transaction_log.cur, ~0U); + atomic_set(&binder_transaction_log_failed.cur, ~0U); binder_deferred_workqueue = create_singlethread_workqueue("binder"); if (!binder_deferred_workqueue) return -ENOMEM; @@ -3681,7 +5696,7 @@ static int __init binder_init(void) if (binder_debugfs_dir_entry_root) binder_debugfs_dir_entry_proc = debugfs_create_dir("proc", binder_debugfs_dir_entry_root); - ret = misc_register(&binder_miscdev); + if (binder_debugfs_dir_entry_root) { debugfs_create_file("state", S_IRUGO, @@ -3709,6 +5724,37 @@ static int __init binder_init(void) &binder_transaction_log_failed, &binder_transaction_log_fops); } + + /* + * Copy the module_parameter string, because we don't want to + * tokenize it in-place. + */ + device_names = kzalloc(strlen(binder_devices_param) + 1, GFP_KERNEL); + if (!device_names) { + ret = -ENOMEM; + goto err_alloc_device_names_failed; + } + strcpy(device_names, binder_devices_param); + + while ((device_name = strsep(&device_names, ","))) { + ret = init_binder_device(device_name); + if (ret) + goto err_init_binder_device_failed; + } + + return ret; + +err_init_binder_device_failed: + hlist_for_each_entry_safe(device, tmp, &binder_devices, hlist) { + misc_deregister(&device->miscdev); + hlist_del(&device->hlist); + kfree(device); + } +err_alloc_device_names_failed: + debugfs_remove_recursive(binder_debugfs_dir_entry_root); + + destroy_workqueue(binder_deferred_workqueue); + return ret; } diff --git a/drivers/staging/android/binder_alloc.c b/drivers/staging/android/binder_alloc.c new file mode 100644 index 0000000000000..6f66ef97626a3 --- /dev/null +++ b/drivers/staging/android/binder_alloc.c @@ -0,0 +1,1012 @@ +/* binder_alloc.c + * + * Android IPC Subsystem + * + * Copyright (C) 2007-2017 Google, Inc. + * + * 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. + * + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "binder_alloc.h" +#include "binder_trace.h" + +struct list_lru binder_alloc_lru; + +static DEFINE_MUTEX(binder_alloc_mmap_lock); + +enum { + BINDER_DEBUG_OPEN_CLOSE = 1U << 1, + BINDER_DEBUG_BUFFER_ALLOC = 1U << 2, + BINDER_DEBUG_BUFFER_ALLOC_ASYNC = 1U << 3, +}; +static uint32_t binder_alloc_debug_mask; + +module_param_named(debug_mask, binder_alloc_debug_mask, + uint, S_IWUSR | S_IRUGO); + +#define binder_alloc_debug(mask, x...) \ + do { \ + if (binder_alloc_debug_mask & mask) \ + pr_info(x); \ + } while (0) + +static struct binder_buffer *binder_buffer_next(struct binder_buffer *buffer) +{ + return list_entry(buffer->entry.next, struct binder_buffer, entry); +} + +static struct binder_buffer *binder_buffer_prev(struct binder_buffer *buffer) +{ + return list_entry(buffer->entry.prev, struct binder_buffer, entry); +} + +static size_t binder_alloc_buffer_size(struct binder_alloc *alloc, + struct binder_buffer *buffer) +{ + if (list_is_last(&buffer->entry, &alloc->buffers)) + return (u8 *)alloc->buffer + + alloc->buffer_size - (u8 *)buffer->data; + return (u8 *)binder_buffer_next(buffer)->data - (u8 *)buffer->data; +} + +static void binder_insert_free_buffer(struct binder_alloc *alloc, + struct binder_buffer *new_buffer) +{ + struct rb_node **p = &alloc->free_buffers.rb_node; + struct rb_node *parent = NULL; + struct binder_buffer *buffer; + size_t buffer_size; + size_t new_buffer_size; + + BUG_ON(!new_buffer->free); + + new_buffer_size = binder_alloc_buffer_size(alloc, new_buffer); + + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: add free buffer, size %zd, at %pK\n", + alloc->pid, new_buffer_size, new_buffer); + + while (*p) { + parent = *p; + buffer = rb_entry(parent, struct binder_buffer, rb_node); + BUG_ON(!buffer->free); + + buffer_size = binder_alloc_buffer_size(alloc, buffer); + + if (new_buffer_size < buffer_size) + p = &parent->rb_left; + else + p = &parent->rb_right; + } + rb_link_node(&new_buffer->rb_node, parent, p); + rb_insert_color(&new_buffer->rb_node, &alloc->free_buffers); +} + +static void binder_insert_allocated_buffer_locked( + struct binder_alloc *alloc, struct binder_buffer *new_buffer) +{ + struct rb_node **p = &alloc->allocated_buffers.rb_node; + struct rb_node *parent = NULL; + struct binder_buffer *buffer; + + BUG_ON(new_buffer->free); + + while (*p) { + parent = *p; + buffer = rb_entry(parent, struct binder_buffer, rb_node); + BUG_ON(buffer->free); + + if (new_buffer->data < buffer->data) + p = &parent->rb_left; + else if (new_buffer->data > buffer->data) + p = &parent->rb_right; + else + BUG(); + } + rb_link_node(&new_buffer->rb_node, parent, p); + rb_insert_color(&new_buffer->rb_node, &alloc->allocated_buffers); +} + +static struct binder_buffer *binder_alloc_prepare_to_free_locked( + struct binder_alloc *alloc, + uintptr_t user_ptr) +{ + struct rb_node *n = alloc->allocated_buffers.rb_node; + struct binder_buffer *buffer; + void *kern_ptr; + + kern_ptr = (void *)(user_ptr - alloc->user_buffer_offset); + + while (n) { + buffer = rb_entry(n, struct binder_buffer, rb_node); + BUG_ON(buffer->free); + + if (kern_ptr < buffer->data) + n = n->rb_left; + else if (kern_ptr > buffer->data) + n = n->rb_right; + else { + /* + * Guard against user threads attempting to + * free the buffer twice + */ + if (buffer->free_in_progress) { + pr_err("%d:%d FREE_BUFFER u%016llx user freed buffer twice\n", + alloc->pid, current->pid, (u64)user_ptr); + return NULL; + } + buffer->free_in_progress = 1; + return buffer; + } + } + return NULL; +} + +/** + * binder_alloc_buffer_lookup() - get buffer given user ptr + * @alloc: binder_alloc for this proc + * @user_ptr: User pointer to buffer data + * + * Validate userspace pointer to buffer data and return buffer corresponding to + * that user pointer. Search the rb tree for buffer that matches user data + * pointer. + * + * Return: Pointer to buffer or NULL + */ +struct binder_buffer *binder_alloc_prepare_to_free(struct binder_alloc *alloc, + uintptr_t user_ptr) +{ + struct binder_buffer *buffer; + + mutex_lock(&alloc->mutex); + buffer = binder_alloc_prepare_to_free_locked(alloc, user_ptr); + mutex_unlock(&alloc->mutex); + return buffer; +} + +static int binder_update_page_range(struct binder_alloc *alloc, int allocate, + void *start, void *end) +{ + void *page_addr; + unsigned long user_page_addr; + struct binder_lru_page *page; + struct vm_area_struct *vma = NULL; + struct mm_struct *mm = NULL; + bool need_mm = false; + + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: %s pages %pK-%pK\n", alloc->pid, + allocate ? "allocate" : "free", start, end); + + if (end <= start) + return 0; + + trace_binder_update_page_range(alloc, allocate, start, end); + + if (allocate == 0) + goto free_range; + + for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) { + page = &alloc->pages[(page_addr - alloc->buffer) / PAGE_SIZE]; + if (!page->page_ptr) { + need_mm = true; + break; + } + } + + /* Same as mmget_not_zero() in later kernel versions */ + if (need_mm && atomic_inc_not_zero(&alloc->vma_vm_mm->mm_users)) + mm = alloc->vma_vm_mm; + + if (mm) { + down_write(&mm->mmap_sem); + vma = alloc->vma; + } + + if (!vma && need_mm) { + pr_err("%d: binder_alloc_buf failed to map pages in userspace, no vma\n", + alloc->pid); + goto err_no_vma; + } + + for (page_addr = start; page_addr < end; page_addr += PAGE_SIZE) { + int ret; + bool on_lru; + size_t index; + + index = (page_addr - alloc->buffer) / PAGE_SIZE; + page = &alloc->pages[index]; + + if (page->page_ptr) { + trace_binder_alloc_lru_start(alloc, index); + + on_lru = list_lru_del(&binder_alloc_lru, &page->lru); + WARN_ON(!on_lru); + + trace_binder_alloc_lru_end(alloc, index); + continue; + } + + if (WARN_ON(!vma)) + goto err_page_ptr_cleared; + + trace_binder_alloc_page_start(alloc, index); + page->page_ptr = alloc_page(GFP_KERNEL | + __GFP_HIGHMEM | + __GFP_ZERO); + if (!page->page_ptr) { + pr_err("%d: binder_alloc_buf failed for page at %pK\n", + alloc->pid, page_addr); + goto err_alloc_page_failed; + } + page->alloc = alloc; + INIT_LIST_HEAD(&page->lru); + + ret = map_kernel_range_noflush((unsigned long)page_addr, + PAGE_SIZE, PAGE_KERNEL, + &page->page_ptr); + flush_cache_vmap((unsigned long)page_addr, + (unsigned long)page_addr + PAGE_SIZE); + if (ret != 1) { + pr_err("%d: binder_alloc_buf failed to map page at %pK in kernel\n", + alloc->pid, page_addr); + goto err_map_kernel_failed; + } + user_page_addr = + (uintptr_t)page_addr + alloc->user_buffer_offset; + ret = vm_insert_page(vma, user_page_addr, page[0].page_ptr); + if (ret) { + pr_err("%d: binder_alloc_buf failed to map page at %lx in userspace\n", + alloc->pid, user_page_addr); + goto err_vm_insert_page_failed; + } + + trace_binder_alloc_page_end(alloc, index); + /* vm_insert_page does not seem to increment the refcount */ + } + if (mm) { + up_write(&mm->mmap_sem); + mmput(mm); + } + return 0; + +free_range: + for (page_addr = end - PAGE_SIZE; page_addr >= start; + page_addr -= PAGE_SIZE) { + bool ret; + size_t index; + + index = (page_addr - alloc->buffer) / PAGE_SIZE; + page = &alloc->pages[index]; + + trace_binder_free_lru_start(alloc, index); + + ret = list_lru_add(&binder_alloc_lru, &page->lru); + WARN_ON(!ret); + + trace_binder_free_lru_end(alloc, index); + continue; + +err_vm_insert_page_failed: + unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE); +err_map_kernel_failed: + __free_page(page->page_ptr); + page->page_ptr = NULL; +err_alloc_page_failed: +err_page_ptr_cleared: + ; + } +err_no_vma: + if (mm) { + up_write(&mm->mmap_sem); + mmput(mm); + } + return vma ? -ENOMEM : -ESRCH; +} + +struct binder_buffer *binder_alloc_new_buf_locked(struct binder_alloc *alloc, + size_t data_size, + size_t offsets_size, + size_t extra_buffers_size, + int is_async) +{ + struct rb_node *n = alloc->free_buffers.rb_node; + struct binder_buffer *buffer; + size_t buffer_size; + struct rb_node *best_fit = NULL; + void *has_page_addr; + void *end_page_addr; + size_t size, data_offsets_size; + int ret; + + if (alloc->vma == NULL) { + pr_err("%d: binder_alloc_buf, no vma\n", + alloc->pid); + return ERR_PTR(-ESRCH); + } + + data_offsets_size = ALIGN(data_size, sizeof(void *)) + + ALIGN(offsets_size, sizeof(void *)); + + if (data_offsets_size < data_size || data_offsets_size < offsets_size) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: got transaction with invalid size %zd-%zd\n", + alloc->pid, data_size, offsets_size); + return ERR_PTR(-EINVAL); + } + size = data_offsets_size + ALIGN(extra_buffers_size, sizeof(void *)); + if (size < data_offsets_size || size < extra_buffers_size) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: got transaction with invalid extra_buffers_size %zd\n", + alloc->pid, extra_buffers_size); + return ERR_PTR(-EINVAL); + } + if (is_async && + alloc->free_async_space < size + sizeof(struct binder_buffer)) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_alloc_buf size %zd failed, no async space left\n", + alloc->pid, size); + return ERR_PTR(-ENOSPC); + } + + /* Pad 0-size buffers so they get assigned unique addresses */ + size = max(size, sizeof(void *)); + + while (n) { + buffer = rb_entry(n, struct binder_buffer, rb_node); + BUG_ON(!buffer->free); + buffer_size = binder_alloc_buffer_size(alloc, buffer); + + if (size < buffer_size) { + best_fit = n; + n = n->rb_left; + } else if (size > buffer_size) + n = n->rb_right; + else { + best_fit = n; + break; + } + } + if (best_fit == NULL) { + size_t allocated_buffers = 0; + size_t largest_alloc_size = 0; + size_t total_alloc_size = 0; + size_t free_buffers = 0; + size_t largest_free_size = 0; + size_t total_free_size = 0; + + for (n = rb_first(&alloc->allocated_buffers); n != NULL; + n = rb_next(n)) { + buffer = rb_entry(n, struct binder_buffer, rb_node); + buffer_size = binder_alloc_buffer_size(alloc, buffer); + allocated_buffers++; + total_alloc_size += buffer_size; + if (buffer_size > largest_alloc_size) + largest_alloc_size = buffer_size; + } + for (n = rb_first(&alloc->free_buffers); n != NULL; + n = rb_next(n)) { + buffer = rb_entry(n, struct binder_buffer, rb_node); + buffer_size = binder_alloc_buffer_size(alloc, buffer); + free_buffers++; + total_free_size += buffer_size; + if (buffer_size > largest_free_size) + largest_free_size = buffer_size; + } + pr_err("%d: binder_alloc_buf size %zd failed, no address space\n", + alloc->pid, size); + pr_err("allocated: %zd (num: %zd largest: %zd), free: %zd (num: %zd largest: %zd)\n", + total_alloc_size, allocated_buffers, largest_alloc_size, + total_free_size, free_buffers, largest_free_size); + return ERR_PTR(-ENOSPC); + } + if (n == NULL) { + buffer = rb_entry(best_fit, struct binder_buffer, rb_node); + buffer_size = binder_alloc_buffer_size(alloc, buffer); + } + + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_alloc_buf size %zd got buffer %pK size %zd\n", + alloc->pid, size, buffer, buffer_size); + + has_page_addr = + (void *)(((uintptr_t)buffer->data + buffer_size) & PAGE_MASK); + WARN_ON(n && buffer_size != size); + end_page_addr = + (void *)PAGE_ALIGN((uintptr_t)buffer->data + size); + if (end_page_addr > has_page_addr) + end_page_addr = has_page_addr; + ret = binder_update_page_range(alloc, 1, + (void *)PAGE_ALIGN((uintptr_t)buffer->data), end_page_addr); + if (ret) + return ERR_PTR(ret); + + if (buffer_size != size) { + struct binder_buffer *new_buffer; + + new_buffer = kzalloc(sizeof(*buffer), GFP_KERNEL); + if (!new_buffer) { + pr_err("%s: %d failed to alloc new buffer struct\n", + __func__, alloc->pid); + goto err_alloc_buf_struct_failed; + } + new_buffer->data = (u8 *)buffer->data + size; + list_add(&new_buffer->entry, &buffer->entry); + new_buffer->free = 1; + binder_insert_free_buffer(alloc, new_buffer); + } + + rb_erase(best_fit, &alloc->free_buffers); + buffer->free = 0; + buffer->free_in_progress = 0; + binder_insert_allocated_buffer_locked(alloc, buffer); + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_alloc_buf size %zd got %pK\n", + alloc->pid, size, buffer); + buffer->data_size = data_size; + buffer->offsets_size = offsets_size; + buffer->async_transaction = is_async; + buffer->extra_buffers_size = extra_buffers_size; + if (is_async) { + alloc->free_async_space -= size + sizeof(struct binder_buffer); + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, + "%d: binder_alloc_buf size %zd async free %zd\n", + alloc->pid, size, alloc->free_async_space); + } + return buffer; + +err_alloc_buf_struct_failed: + binder_update_page_range(alloc, 0, + (void *)PAGE_ALIGN((uintptr_t)buffer->data), + end_page_addr); + return ERR_PTR(-ENOMEM); +} + +/** + * binder_alloc_new_buf() - Allocate a new binder buffer + * @alloc: binder_alloc for this proc + * @data_size: size of user data buffer + * @offsets_size: user specified buffer offset + * @extra_buffers_size: size of extra space for meta-data (eg, security context) + * @is_async: buffer for async transaction + * + * Allocate a new buffer given the requested sizes. Returns + * the kernel version of the buffer pointer. The size allocated + * is the sum of the three given sizes (each rounded up to + * pointer-sized boundary) + * + * Return: The allocated buffer or %NULL if error + */ +struct binder_buffer *binder_alloc_new_buf(struct binder_alloc *alloc, + size_t data_size, + size_t offsets_size, + size_t extra_buffers_size, + int is_async) +{ + struct binder_buffer *buffer; + + mutex_lock(&alloc->mutex); + buffer = binder_alloc_new_buf_locked(alloc, data_size, offsets_size, + extra_buffers_size, is_async); + mutex_unlock(&alloc->mutex); + return buffer; +} + +static void *buffer_start_page(struct binder_buffer *buffer) +{ + return (void *)((uintptr_t)buffer->data & PAGE_MASK); +} + +static void *prev_buffer_end_page(struct binder_buffer *buffer) +{ + return (void *)(((uintptr_t)(buffer->data) - 1) & PAGE_MASK); +} + +static void binder_delete_free_buffer(struct binder_alloc *alloc, + struct binder_buffer *buffer) +{ + struct binder_buffer *prev, *next = NULL; + bool to_free = true; + BUG_ON(alloc->buffers.next == &buffer->entry); + prev = binder_buffer_prev(buffer); + BUG_ON(!prev->free); + if (prev_buffer_end_page(prev) == buffer_start_page(buffer)) { + to_free = false; + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: merge free, buffer %pK share page with %pK\n", + alloc->pid, buffer->data, prev->data); + } + + if (!list_is_last(&buffer->entry, &alloc->buffers)) { + next = binder_buffer_next(buffer); + if (buffer_start_page(next) == buffer_start_page(buffer)) { + to_free = false; + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: merge free, buffer %pK share page with %pK\n", + alloc->pid, + buffer->data, + next->data); + } + } + + if (PAGE_ALIGNED(buffer->data)) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: merge free, buffer start %pK is page aligned\n", + alloc->pid, buffer->data); + to_free = false; + } + + if (to_free) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: merge free, buffer %pK do not share page with %pK or %pK\n", + alloc->pid, buffer->data, + prev->data, next ? next->data : NULL); + binder_update_page_range(alloc, 0, buffer_start_page(buffer), + buffer_start_page(buffer) + PAGE_SIZE); + } + list_del(&buffer->entry); + kfree(buffer); +} + +static void binder_free_buf_locked(struct binder_alloc *alloc, + struct binder_buffer *buffer) +{ + size_t size, buffer_size; + + buffer_size = binder_alloc_buffer_size(alloc, buffer); + + size = ALIGN(buffer->data_size, sizeof(void *)) + + ALIGN(buffer->offsets_size, sizeof(void *)) + + ALIGN(buffer->extra_buffers_size, sizeof(void *)); + + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_free_buf %pK size %zd buffer_size %zd\n", + alloc->pid, buffer, size, buffer_size); + + BUG_ON(buffer->free); + BUG_ON(size > buffer_size); + BUG_ON(buffer->transaction != NULL); + BUG_ON(buffer->data < alloc->buffer); + BUG_ON(buffer->data > alloc->buffer + alloc->buffer_size); + + if (buffer->async_transaction) { + alloc->free_async_space += size + sizeof(struct binder_buffer); + + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC, + "%d: binder_free_buf size %zd async free %zd\n", + alloc->pid, size, alloc->free_async_space); + } + + binder_update_page_range(alloc, 0, + (void *)PAGE_ALIGN((uintptr_t)buffer->data), + (void *)(((uintptr_t)buffer->data + buffer_size) & PAGE_MASK)); + + rb_erase(&buffer->rb_node, &alloc->allocated_buffers); + buffer->free = 1; + if (!list_is_last(&buffer->entry, &alloc->buffers)) { + struct binder_buffer *next = binder_buffer_next(buffer); + + if (next->free) { + rb_erase(&next->rb_node, &alloc->free_buffers); + binder_delete_free_buffer(alloc, next); + } + } + if (alloc->buffers.next != &buffer->entry) { + struct binder_buffer *prev = binder_buffer_prev(buffer); + + if (prev->free) { + binder_delete_free_buffer(alloc, buffer); + rb_erase(&prev->rb_node, &alloc->free_buffers); + buffer = prev; + } + } + binder_insert_free_buffer(alloc, buffer); +} + +/** + * binder_alloc_free_buf() - free a binder buffer + * @alloc: binder_alloc for this proc + * @buffer: kernel pointer to buffer + * + * Free the buffer allocated via binder_alloc_new_buffer() + */ +void binder_alloc_free_buf(struct binder_alloc *alloc, + struct binder_buffer *buffer) +{ + mutex_lock(&alloc->mutex); + binder_free_buf_locked(alloc, buffer); + mutex_unlock(&alloc->mutex); +} + +/** + * binder_alloc_mmap_handler() - map virtual address space for proc + * @alloc: alloc structure for this proc + * @vma: vma passed to mmap() + * + * Called by binder_mmap() to initialize the space specified in + * vma for allocating binder buffers + * + * Return: + * 0 = success + * -EBUSY = address space already mapped + * -ENOMEM = failed to map memory to given address space + */ +int binder_alloc_mmap_handler(struct binder_alloc *alloc, + struct vm_area_struct *vma) +{ + int ret; + struct vm_struct *area; + const char *failure_string; + struct binder_buffer *buffer; + + mutex_lock(&binder_alloc_mmap_lock); + if (alloc->buffer) { + ret = -EBUSY; + failure_string = "already mapped"; + goto err_already_mapped; + } + + area = get_vm_area(vma->vm_end - vma->vm_start, VM_IOREMAP); + if (area == NULL) { + ret = -ENOMEM; + failure_string = "get_vm_area"; + goto err_get_vm_area_failed; + } + alloc->buffer = area->addr; + alloc->user_buffer_offset = + vma->vm_start - (uintptr_t)alloc->buffer; + mutex_unlock(&binder_alloc_mmap_lock); + +#ifdef CONFIG_CPU_CACHE_VIPT + if (cache_is_vipt_aliasing()) { + while (CACHE_COLOUR( + (vma->vm_start ^ (uint32_t)alloc->buffer))) { + pr_info("binder_mmap: %d %lx-%lx maps %pK bad alignment\n", + alloc->pid, vma->vm_start, vma->vm_end, + alloc->buffer); + vma->vm_start += PAGE_SIZE; + } + } +#endif + alloc->pages = kzalloc(sizeof(alloc->pages[0]) * + ((vma->vm_end - vma->vm_start) / PAGE_SIZE), + GFP_KERNEL); + if (alloc->pages == NULL) { + ret = -ENOMEM; + failure_string = "alloc page array"; + goto err_alloc_pages_failed; + } + alloc->buffer_size = vma->vm_end - vma->vm_start; + + buffer = kzalloc(sizeof(*buffer), GFP_KERNEL); + if (!buffer) { + ret = -ENOMEM; + failure_string = "alloc buffer struct"; + goto err_alloc_buf_struct_failed; + } + + buffer->data = alloc->buffer; + list_add(&buffer->entry, &alloc->buffers); + buffer->free = 1; + binder_insert_free_buffer(alloc, buffer); + alloc->free_async_space = alloc->buffer_size / 2; + barrier(); + alloc->vma = vma; + alloc->vma_vm_mm = vma->vm_mm; + /* Same as mmgrab() in later kernel versions */ + atomic_inc(&alloc->vma_vm_mm->mm_count); + + return 0; + +err_alloc_buf_struct_failed: + kfree(alloc->pages); + alloc->pages = NULL; +err_alloc_pages_failed: + mutex_lock(&binder_alloc_mmap_lock); + vfree(alloc->buffer); + alloc->buffer = NULL; +err_get_vm_area_failed: +err_already_mapped: + mutex_unlock(&binder_alloc_mmap_lock); + pr_err("%s: %d %lx-%lx %s failed %d\n", __func__, + alloc->pid, vma->vm_start, vma->vm_end, failure_string, ret); + return ret; +} + + +void binder_alloc_deferred_release(struct binder_alloc *alloc) +{ + struct rb_node *n; + int buffers, page_count; + struct binder_buffer *buffer; + + BUG_ON(alloc->vma); + + buffers = 0; + mutex_lock(&alloc->mutex); + while ((n = rb_first(&alloc->allocated_buffers))) { + buffer = rb_entry(n, struct binder_buffer, rb_node); + + /* Transaction should already have been freed */ + BUG_ON(buffer->transaction); + + binder_free_buf_locked(alloc, buffer); + buffers++; + } + + while (!list_empty(&alloc->buffers)) { + buffer = list_first_entry(&alloc->buffers, + struct binder_buffer, entry); + WARN_ON(!buffer->free); + + list_del(&buffer->entry); + WARN_ON_ONCE(!list_empty(&alloc->buffers)); + kfree(buffer); + } + + page_count = 0; + if (alloc->pages) { + int i; + + for (i = 0; i < alloc->buffer_size / PAGE_SIZE; i++) { + void *page_addr; + bool on_lru; + + if (!alloc->pages[i].page_ptr) + continue; + + on_lru = list_lru_del(&binder_alloc_lru, + &alloc->pages[i].lru); + page_addr = alloc->buffer + i * PAGE_SIZE; + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%s: %d: page %d at %pK %s\n", + __func__, alloc->pid, i, page_addr, + on_lru ? "on lru" : "active"); + unmap_kernel_range((unsigned long)page_addr, PAGE_SIZE); + __free_page(alloc->pages[i].page_ptr); + page_count++; + } + kfree(alloc->pages); + vfree(alloc->buffer); + } + mutex_unlock(&alloc->mutex); + if (alloc->vma_vm_mm) + mmdrop(alloc->vma_vm_mm); + + binder_alloc_debug(BINDER_DEBUG_OPEN_CLOSE, + "%s: %d buffers %d, pages %d\n", + __func__, alloc->pid, buffers, page_count); +} + +static void print_binder_buffer(struct seq_file *m, const char *prefix, + struct binder_buffer *buffer) +{ + seq_printf(m, "%s %d: %pK size %zd:%zd:%zd %s\n", + prefix, buffer->debug_id, buffer->data, + buffer->data_size, buffer->offsets_size, + buffer->extra_buffers_size, + buffer->transaction ? "active" : "delivered"); +} + +/** + * binder_alloc_print_allocated() - print buffer info + * @m: seq_file for output via seq_printf() + * @alloc: binder_alloc for this proc + * + * Prints information about every buffer associated with + * the binder_alloc state to the given seq_file + */ +void binder_alloc_print_allocated(struct seq_file *m, + struct binder_alloc *alloc) +{ + struct rb_node *n; + + mutex_lock(&alloc->mutex); + for (n = rb_first(&alloc->allocated_buffers); n != NULL; n = rb_next(n)) + print_binder_buffer(m, " buffer", + rb_entry(n, struct binder_buffer, rb_node)); + mutex_unlock(&alloc->mutex); +} + +/** + * binder_alloc_print_pages() - print page usage + * @m: seq_file for output via seq_printf() + * @alloc: binder_alloc for this proc + */ +void binder_alloc_print_pages(struct seq_file *m, + struct binder_alloc *alloc) +{ + struct binder_lru_page *page; + int i; + int active = 0; + int lru = 0; + int free = 0; + + mutex_lock(&alloc->mutex); + for (i = 0; i < alloc->buffer_size / PAGE_SIZE; i++) { + page = &alloc->pages[i]; + if (!page->page_ptr) + free++; + else if (list_empty(&page->lru)) + active++; + else + lru++; + } + mutex_unlock(&alloc->mutex); + seq_printf(m, " pages: %d:%d:%d\n", active, lru, free); +} + +/** + * binder_alloc_get_allocated_count() - return count of buffers + * @alloc: binder_alloc for this proc + * + * Return: count of allocated buffers + */ +int binder_alloc_get_allocated_count(struct binder_alloc *alloc) +{ + struct rb_node *n; + int count = 0; + + mutex_lock(&alloc->mutex); + for (n = rb_first(&alloc->allocated_buffers); n != NULL; n = rb_next(n)) + count++; + mutex_unlock(&alloc->mutex); + return count; +} + + +/** + * binder_alloc_vma_close() - invalidate address space + * @alloc: binder_alloc for this proc + * + * Called from binder_vma_close() when releasing address space. + * Clears alloc->vma to prevent new incoming transactions from + * allocating more buffers. + */ +void binder_alloc_vma_close(struct binder_alloc *alloc) +{ + WRITE_ONCE(alloc->vma, NULL); +} + +/** + * binder_alloc_free_page() - shrinker callback to free pages + * @item: item to free + * @lock: lock protecting the item + * @cb_arg: callback argument + * + * Called from list_lru_walk() in binder_shrink_scan() to free + * up pages when the system is under memory pressure. + */ +enum lru_status binder_alloc_free_page(struct list_head *item, + spinlock_t *lock, + void *cb_arg) +{ + struct mm_struct *mm = NULL; + struct binder_lru_page *page = container_of(item, + struct binder_lru_page, + lru); + struct binder_alloc *alloc; + uintptr_t page_addr; + size_t index; + struct vm_area_struct *vma; + + alloc = page->alloc; + if (!mutex_trylock(&alloc->mutex)) + goto err_get_alloc_mutex_failed; + + if (!page->page_ptr) + goto err_page_already_freed; + + index = page - alloc->pages; + page_addr = (uintptr_t)alloc->buffer + index * PAGE_SIZE; + vma = alloc->vma; + if (vma) { + /* Same as mmget_not_zero() in later kernel versions */ + if (!atomic_inc_not_zero(&alloc->vma_vm_mm->mm_users)) + goto err_mmget; + mm = alloc->vma_vm_mm; + if (!down_write_trylock(&mm->mmap_sem)) + goto err_down_write_mmap_sem_failed; + } + + list_del_init(item); + spin_unlock(lock); + + if (vma) { + trace_binder_unmap_user_start(alloc, index); + + zap_page_range(vma, + page_addr + + alloc->user_buffer_offset, + PAGE_SIZE, NULL); + + trace_binder_unmap_user_end(alloc, index); + + up_write(&mm->mmap_sem); + mmput(mm); + } + + trace_binder_unmap_kernel_start(alloc, index); + + unmap_kernel_range(page_addr, PAGE_SIZE); + __free_page(page->page_ptr); + page->page_ptr = NULL; + + trace_binder_unmap_kernel_end(alloc, index); + + spin_lock(lock); + mutex_unlock(&alloc->mutex); + return LRU_REMOVED_RETRY; + +err_down_write_mmap_sem_failed: + mmput_async(mm); +err_mmget: +err_page_already_freed: + mutex_unlock(&alloc->mutex); +err_get_alloc_mutex_failed: + return LRU_SKIP; +} + +static unsigned long +binder_shrink_count(struct shrinker *shrink, struct shrink_control *sc) +{ + unsigned long ret = list_lru_count(&binder_alloc_lru); + return ret; +} + +static unsigned long +binder_shrink_scan(struct shrinker *shrink, struct shrink_control *sc) +{ + unsigned long ret; + + ret = list_lru_walk(&binder_alloc_lru, binder_alloc_free_page, + NULL, sc->nr_to_scan); + return ret; +} + +static struct shrinker binder_shrinker = { + .count_objects = binder_shrink_count, + .scan_objects = binder_shrink_scan, + .seeks = DEFAULT_SEEKS, +}; + +/** + * binder_alloc_init() - called by binder_open() for per-proc initialization + * @alloc: binder_alloc for this proc + * + * Called from binder_open() to initialize binder_alloc fields for + * new binder proc + */ +void binder_alloc_init(struct binder_alloc *alloc) +{ + alloc->pid = current->group_leader->pid; + mutex_init(&alloc->mutex); + INIT_LIST_HEAD(&alloc->buffers); +} + +void binder_alloc_shrinker_init(void) +{ + list_lru_init(&binder_alloc_lru); + register_shrinker(&binder_shrinker); +} diff --git a/drivers/staging/android/binder_alloc.h b/drivers/staging/android/binder_alloc.h new file mode 100644 index 0000000000000..fb3fe4a4e88d9 --- /dev/null +++ b/drivers/staging/android/binder_alloc.h @@ -0,0 +1,185 @@ +/* + * Copyright (C) 2017 Google, Inc. + * + * 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. + * + */ + +#ifndef _LINUX_BINDER_ALLOC_H +#define _LINUX_BINDER_ALLOC_H + +#include +#include +#include +#include +#include +#include +#include + +extern struct list_lru binder_alloc_lru; +struct binder_transaction; + +/** + * struct binder_buffer - buffer used for binder transactions + * @entry: entry alloc->buffers + * @rb_node: node for allocated_buffers/free_buffers rb trees + * @free: true if buffer is free + * @allow_user_free: describe the second member of struct blah, + * @async_transaction: describe the second member of struct blah, + * @debug_id: describe the second member of struct blah, + * @transaction: describe the second member of struct blah, + * @target_node: describe the second member of struct blah, + * @data_size: describe the second member of struct blah, + * @offsets_size: describe the second member of struct blah, + * @extra_buffers_size: describe the second member of struct blah, + * @data:i describe the second member of struct blah, + * + * Bookkeeping structure for binder transaction buffers + */ +struct binder_buffer { + struct list_head entry; /* free and allocated entries by address */ + struct rb_node rb_node; /* free entry by size or allocated entry */ + /* by address */ + unsigned free:1; + unsigned allow_user_free:1; + unsigned async_transaction:1; + unsigned free_in_progress:1; + unsigned debug_id:28; + + struct binder_transaction *transaction; + + struct binder_node *target_node; + size_t data_size; + size_t offsets_size; + size_t extra_buffers_size; + void *data; +}; + +/** + * struct binder_lru_page - page object used for binder shrinker + * @page_ptr: pointer to physical page in mmap'd space + * @lru: entry in binder_alloc_lru + * @alloc: binder_alloc for a proc + */ +struct binder_lru_page { + struct list_head lru; + struct page *page_ptr; + struct binder_alloc *alloc; +}; + +/** + * struct binder_alloc - per-binder proc state for binder allocator + * @vma: vm_area_struct passed to mmap_handler + * (invarient after mmap) + * @tsk: tid for task that called init for this proc + * (invariant after init) + * @vma_vm_mm: copy of vma->vm_mm (invarient after mmap) + * @buffer: base of per-proc address space mapped via mmap + * @user_buffer_offset: offset between user and kernel VAs for buffer + * @buffers: list of all buffers for this proc + * @free_buffers: rb tree of buffers available for allocation + * sorted by size + * @allocated_buffers: rb tree of allocated buffers sorted by address + * @free_async_space: VA space available for async buffers. This is + * initialized at mmap time to 1/2 the full VA space + * @pages: array of binder_lru_page + * @buffer_size: size of address space specified via mmap + * @pid: pid for associated binder_proc (invariant after init) + * + * Bookkeeping structure for per-proc address space management for binder + * buffers. It is normally initialized during binder_init() and binder_mmap() + * calls. The address space is used for both user-visible buffers and for + * struct binder_buffer objects used to track the user buffers + */ +struct binder_alloc { + struct mutex mutex; + struct vm_area_struct *vma; + struct mm_struct *vma_vm_mm; + void *buffer; + ptrdiff_t user_buffer_offset; + struct list_head buffers; + struct rb_root free_buffers; + struct rb_root allocated_buffers; + size_t free_async_space; + struct binder_lru_page *pages; + size_t buffer_size; + uint32_t buffer_free; + int pid; +}; + +#ifdef CONFIG_ANDROID_BINDER_IPC_SELFTEST +void binder_selftest_alloc(struct binder_alloc *alloc); +#else +static inline void binder_selftest_alloc(struct binder_alloc *alloc) {} +#endif +enum lru_status binder_alloc_free_page(struct list_head *item, + spinlock_t *lock, void *cb_arg); +extern struct binder_buffer *binder_alloc_new_buf(struct binder_alloc *alloc, + size_t data_size, + size_t offsets_size, + size_t extra_buffers_size, + int is_async); +extern void binder_alloc_init(struct binder_alloc *alloc); +void binder_alloc_shrinker_init(void); +extern void binder_alloc_vma_close(struct binder_alloc *alloc); +extern struct binder_buffer * +binder_alloc_prepare_to_free(struct binder_alloc *alloc, + uintptr_t user_ptr); +extern void binder_alloc_free_buf(struct binder_alloc *alloc, + struct binder_buffer *buffer); +extern int binder_alloc_mmap_handler(struct binder_alloc *alloc, + struct vm_area_struct *vma); +extern void binder_alloc_deferred_release(struct binder_alloc *alloc); +extern int binder_alloc_get_allocated_count(struct binder_alloc *alloc); +extern void binder_alloc_print_allocated(struct seq_file *m, + struct binder_alloc *alloc); +void binder_alloc_print_pages(struct seq_file *m, + struct binder_alloc *alloc); + +/** + * binder_alloc_get_free_async_space() - get free space available for async + * @alloc: binder_alloc for this proc + * + * Return: the bytes remaining in the address-space for async transactions + */ +static inline size_t +binder_alloc_get_free_async_space(struct binder_alloc *alloc) +{ + size_t free_async_space; + + mutex_lock(&alloc->mutex); + free_async_space = alloc->free_async_space; + mutex_unlock(&alloc->mutex); + return free_async_space; +} + +/** + * binder_alloc_get_user_buffer_offset() - get offset between kernel/user addrs + * @alloc: binder_alloc for this proc + * + * Return: the offset between kernel and user-space addresses to use for + * virtual address conversion + */ +static inline ptrdiff_t +binder_alloc_get_user_buffer_offset(struct binder_alloc *alloc) +{ + /* + * user_buffer_offset is constant if vma is set and + * undefined if vma is not set. It is possible to + * get here with !alloc->vma if the target process + * is dying while a transaction is being initiated. + * Returning the old value is ok in this case and + * the transaction will fail. + */ + return alloc->user_buffer_offset; +} + +#endif /* _LINUX_BINDER_ALLOC_H */ + diff --git a/drivers/staging/android/binder_alloc_selftest.c b/drivers/staging/android/binder_alloc_selftest.c new file mode 100644 index 0000000000000..f14f78cb5b469 --- /dev/null +++ b/drivers/staging/android/binder_alloc_selftest.c @@ -0,0 +1,310 @@ +/* binder_alloc_selftest.c + * + * Android IPC Subsystem + * + * Copyright (C) 2017 Google, Inc. + * + * 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. + * + */ + +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + +#include +#include +#include "binder_alloc.h" + +#define BUFFER_NUM 5 +#define BUFFER_MIN_SIZE (PAGE_SIZE / 8) + +static bool binder_selftest_run = true; +static int binder_selftest_failures; +static DEFINE_MUTEX(binder_selftest_lock); + +/** + * enum buf_end_align_type - Page alignment of a buffer + * end with regard to the end of the previous buffer. + * + * In the pictures below, buf2 refers to the buffer we + * are aligning. buf1 refers to previous buffer by addr. + * Symbol [ means the start of a buffer, ] means the end + * of a buffer, and | means page boundaries. + */ +enum buf_end_align_type { + /** + * @SAME_PAGE_UNALIGNED: The end of this buffer is on + * the same page as the end of the previous buffer and + * is not page aligned. Examples: + * buf1 ][ buf2 ][ ... + * buf1 ]|[ buf2 ][ ... + */ + SAME_PAGE_UNALIGNED = 0, + /** + * @SAME_PAGE_ALIGNED: When the end of the previous buffer + * is not page aligned, the end of this buffer is on the + * same page as the end of the previous buffer and is page + * aligned. When the previous buffer is page aligned, the + * end of this buffer is aligned to the next page boundary. + * Examples: + * buf1 ][ buf2 ]| ... + * buf1 ]|[ buf2 ]| ... + */ + SAME_PAGE_ALIGNED, + /** + * @NEXT_PAGE_UNALIGNED: The end of this buffer is on + * the page next to the end of the previous buffer and + * is not page aligned. Examples: + * buf1 ][ buf2 | buf2 ][ ... + * buf1 ]|[ buf2 | buf2 ][ ... + */ + NEXT_PAGE_UNALIGNED, + /** + * @NEXT_PAGE_ALIGNED: The end of this buffer is on + * the page next to the end of the previous buffer and + * is page aligned. Examples: + * buf1 ][ buf2 | buf2 ]| ... + * buf1 ]|[ buf2 | buf2 ]| ... + */ + NEXT_PAGE_ALIGNED, + /** + * @NEXT_NEXT_UNALIGNED: The end of this buffer is on + * the page that follows the page after the end of the + * previous buffer and is not page aligned. Examples: + * buf1 ][ buf2 | buf2 | buf2 ][ ... + * buf1 ]|[ buf2 | buf2 | buf2 ][ ... + */ + NEXT_NEXT_UNALIGNED, + LOOP_END, +}; + +static void pr_err_size_seq(size_t *sizes, int *seq) +{ + int i; + + pr_err("alloc sizes: "); + for (i = 0; i < BUFFER_NUM; i++) + pr_cont("[%zu]", sizes[i]); + pr_cont("\n"); + pr_err("free seq: "); + for (i = 0; i < BUFFER_NUM; i++) + pr_cont("[%d]", seq[i]); + pr_cont("\n"); +} + +static bool check_buffer_pages_allocated(struct binder_alloc *alloc, + struct binder_buffer *buffer, + size_t size) +{ + void *page_addr, *end; + int page_index; + + end = (void *)PAGE_ALIGN((uintptr_t)buffer->data + size); + page_addr = buffer->data; + for (; page_addr < end; page_addr += PAGE_SIZE) { + page_index = (page_addr - alloc->buffer) / PAGE_SIZE; + if (!alloc->pages[page_index].page_ptr || + !list_empty(&alloc->pages[page_index].lru)) { + pr_err("expect alloc but is %s at page index %d\n", + alloc->pages[page_index].page_ptr ? + "lru" : "free", page_index); + return false; + } + } + return true; +} + +static void binder_selftest_alloc_buf(struct binder_alloc *alloc, + struct binder_buffer *buffers[], + size_t *sizes, int *seq) +{ + int i; + + for (i = 0; i < BUFFER_NUM; i++) { + buffers[i] = binder_alloc_new_buf(alloc, sizes[i], 0, 0, 0); + if (IS_ERR(buffers[i]) || + !check_buffer_pages_allocated(alloc, buffers[i], + sizes[i])) { + pr_err_size_seq(sizes, seq); + binder_selftest_failures++; + } + } +} + +static void binder_selftest_free_buf(struct binder_alloc *alloc, + struct binder_buffer *buffers[], + size_t *sizes, int *seq, size_t end) +{ + int i; + + for (i = 0; i < BUFFER_NUM; i++) + binder_alloc_free_buf(alloc, buffers[seq[i]]); + + for (i = 0; i < end / PAGE_SIZE; i++) { + /** + * Error message on a free page can be false positive + * if binder shrinker ran during binder_alloc_free_buf + * calls above. + */ + if (list_empty(&alloc->pages[i].lru)) { + pr_err_size_seq(sizes, seq); + pr_err("expect lru but is %s at page index %d\n", + alloc->pages[i].page_ptr ? "alloc" : "free", i); + binder_selftest_failures++; + } + } +} + +static void binder_selftest_free_page(struct binder_alloc *alloc) +{ + int i; + unsigned long count; + + while ((count = list_lru_count(&binder_alloc_lru))) { + list_lru_walk(&binder_alloc_lru, binder_alloc_free_page, + NULL, count); + } + + for (i = 0; i < (alloc->buffer_size / PAGE_SIZE); i++) { + if (alloc->pages[i].page_ptr) { + pr_err("expect free but is %s at page index %d\n", + list_empty(&alloc->pages[i].lru) ? + "alloc" : "lru", i); + binder_selftest_failures++; + } + } +} + +static void binder_selftest_alloc_free(struct binder_alloc *alloc, + size_t *sizes, int *seq, size_t end) +{ + struct binder_buffer *buffers[BUFFER_NUM]; + + binder_selftest_alloc_buf(alloc, buffers, sizes, seq); + binder_selftest_free_buf(alloc, buffers, sizes, seq, end); + + /* Allocate from lru. */ + binder_selftest_alloc_buf(alloc, buffers, sizes, seq); + if (list_lru_count(&binder_alloc_lru)) + pr_err("lru list should be empty but is not\n"); + + binder_selftest_free_buf(alloc, buffers, sizes, seq, end); + binder_selftest_free_page(alloc); +} + +static bool is_dup(int *seq, int index, int val) +{ + int i; + + for (i = 0; i < index; i++) { + if (seq[i] == val) + return true; + } + return false; +} + +/* Generate BUFFER_NUM factorial free orders. */ +static void binder_selftest_free_seq(struct binder_alloc *alloc, + size_t *sizes, int *seq, + int index, size_t end) +{ + int i; + + if (index == BUFFER_NUM) { + binder_selftest_alloc_free(alloc, sizes, seq, end); + return; + } + for (i = 0; i < BUFFER_NUM; i++) { + if (is_dup(seq, index, i)) + continue; + seq[index] = i; + binder_selftest_free_seq(alloc, sizes, seq, index + 1, end); + } +} + +static void binder_selftest_alloc_size(struct binder_alloc *alloc, + size_t *end_offset) +{ + int i; + int seq[BUFFER_NUM] = {0}; + size_t front_sizes[BUFFER_NUM]; + size_t back_sizes[BUFFER_NUM]; + size_t last_offset, offset = 0; + + for (i = 0; i < BUFFER_NUM; i++) { + last_offset = offset; + offset = end_offset[i]; + front_sizes[i] = offset - last_offset; + back_sizes[BUFFER_NUM - i - 1] = front_sizes[i]; + } + /* + * Buffers share the first or last few pages. + * Only BUFFER_NUM - 1 buffer sizes are adjustable since + * we need one giant buffer before getting to the last page. + */ + back_sizes[0] += alloc->buffer_size - end_offset[BUFFER_NUM - 1]; + binder_selftest_free_seq(alloc, front_sizes, seq, 0, + end_offset[BUFFER_NUM - 1]); + binder_selftest_free_seq(alloc, back_sizes, seq, 0, alloc->buffer_size); +} + +static void binder_selftest_alloc_offset(struct binder_alloc *alloc, + size_t *end_offset, int index) +{ + int align; + size_t end, prev; + + if (index == BUFFER_NUM) { + binder_selftest_alloc_size(alloc, end_offset); + return; + } + prev = index == 0 ? 0 : end_offset[index - 1]; + end = prev; + + BUILD_BUG_ON(BUFFER_MIN_SIZE * BUFFER_NUM >= PAGE_SIZE); + + for (align = SAME_PAGE_UNALIGNED; align < LOOP_END; align++) { + if (align % 2) + end = ALIGN(end, PAGE_SIZE); + else + end += BUFFER_MIN_SIZE; + end_offset[index] = end; + binder_selftest_alloc_offset(alloc, end_offset, index + 1); + } +} + +/** + * binder_selftest_alloc() - Test alloc and free of buffer pages. + * @alloc: Pointer to alloc struct. + * + * Allocate BUFFER_NUM buffers to cover all page alignment cases, + * then free them in all orders possible. Check that pages are + * correctly allocated, put onto lru when buffers are freed, and + * are freed when binder_alloc_free_page is called. + */ +void binder_selftest_alloc(struct binder_alloc *alloc) +{ + size_t end_offset[BUFFER_NUM]; + + if (!binder_selftest_run) + return; + mutex_lock(&binder_selftest_lock); + if (!binder_selftest_run || !alloc->vma) + goto done; + pr_info("STARTED\n"); + binder_selftest_alloc_offset(alloc, end_offset, 0); + binder_selftest_run = false; + if (binder_selftest_failures > 0) + pr_info("%d tests FAILED\n", binder_selftest_failures); + else + pr_info("PASSED\n"); + +done: + mutex_unlock(&binder_selftest_lock); +} diff --git a/drivers/staging/android/binder_trace.h b/drivers/staging/android/binder_trace.h index 7f20f3dc83690..b11dffc521e85 100644 --- a/drivers/staging/android/binder_trace.h +++ b/drivers/staging/android/binder_trace.h @@ -23,7 +23,8 @@ struct binder_buffer; struct binder_node; struct binder_proc; -struct binder_ref; +struct binder_alloc; +struct binder_ref_data; struct binder_thread; struct binder_transaction; @@ -84,6 +85,30 @@ DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_ioctl_done); DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_write_done); DEFINE_BINDER_FUNCTION_RETURN_EVENT(binder_read_done); +TRACE_EVENT(binder_set_priority, + TP_PROTO(int proc, int thread, unsigned int old_prio, + unsigned int desired_prio, unsigned int new_prio), + TP_ARGS(proc, thread, old_prio, new_prio, desired_prio), + + TP_STRUCT__entry( + __field(int, proc) + __field(int, thread) + __field(unsigned int, old_prio) + __field(unsigned int, new_prio) + __field(unsigned int, desired_prio) + ), + TP_fast_assign( + __entry->proc = proc; + __entry->thread = thread; + __entry->old_prio = old_prio; + __entry->new_prio = new_prio; + __entry->desired_prio = desired_prio; + ), + TP_printk("proc=%d thread=%d old=%d => new=%d desired=%d", + __entry->proc, __entry->thread, __entry->old_prio, + __entry->new_prio, __entry->desired_prio) +); + TRACE_EVENT(binder_wait_for_work, TP_PROTO(bool proc_work, bool transaction_stack, bool thread_todo), TP_ARGS(proc_work, transaction_stack, thread_todo), @@ -146,8 +171,8 @@ TRACE_EVENT(binder_transaction_received, TRACE_EVENT(binder_transaction_node_to_ref, TP_PROTO(struct binder_transaction *t, struct binder_node *node, - struct binder_ref *ref), - TP_ARGS(t, node, ref), + struct binder_ref_data *rdata), + TP_ARGS(t, node, rdata), TP_STRUCT__entry( __field(int, debug_id) @@ -160,8 +185,8 @@ TRACE_EVENT(binder_transaction_node_to_ref, __entry->debug_id = t->debug_id; __entry->node_debug_id = node->debug_id; __entry->node_ptr = node->ptr; - __entry->ref_debug_id = ref->debug_id; - __entry->ref_desc = ref->desc; + __entry->ref_debug_id = rdata->debug_id; + __entry->ref_desc = rdata->desc; ), TP_printk("transaction=%d node=%d src_ptr=0x%016llx ==> dest_ref=%d dest_desc=%d", __entry->debug_id, __entry->node_debug_id, @@ -170,8 +195,9 @@ TRACE_EVENT(binder_transaction_node_to_ref, ); TRACE_EVENT(binder_transaction_ref_to_node, - TP_PROTO(struct binder_transaction *t, struct binder_ref *ref), - TP_ARGS(t, ref), + TP_PROTO(struct binder_transaction *t, struct binder_node *node, + struct binder_ref_data *rdata), + TP_ARGS(t, node, rdata), TP_STRUCT__entry( __field(int, debug_id) @@ -182,10 +208,10 @@ TRACE_EVENT(binder_transaction_ref_to_node, ), TP_fast_assign( __entry->debug_id = t->debug_id; - __entry->ref_debug_id = ref->debug_id; - __entry->ref_desc = ref->desc; - __entry->node_debug_id = ref->node->debug_id; - __entry->node_ptr = ref->node->ptr; + __entry->ref_debug_id = rdata->debug_id; + __entry->ref_desc = rdata->desc; + __entry->node_debug_id = node->debug_id; + __entry->node_ptr = node->ptr; ), TP_printk("transaction=%d node=%d src_ref=%d src_desc=%d ==> dest_ptr=0x%016llx", __entry->debug_id, __entry->node_debug_id, @@ -194,9 +220,10 @@ TRACE_EVENT(binder_transaction_ref_to_node, ); TRACE_EVENT(binder_transaction_ref_to_ref, - TP_PROTO(struct binder_transaction *t, struct binder_ref *src_ref, - struct binder_ref *dest_ref), - TP_ARGS(t, src_ref, dest_ref), + TP_PROTO(struct binder_transaction *t, struct binder_node *node, + struct binder_ref_data *src_ref, + struct binder_ref_data *dest_ref), + TP_ARGS(t, node, src_ref, dest_ref), TP_STRUCT__entry( __field(int, debug_id) @@ -208,7 +235,7 @@ TRACE_EVENT(binder_transaction_ref_to_ref, ), TP_fast_assign( __entry->debug_id = t->debug_id; - __entry->node_debug_id = src_ref->node->debug_id; + __entry->node_debug_id = node->debug_id; __entry->src_ref_debug_id = src_ref->debug_id; __entry->src_ref_desc = src_ref->desc; __entry->dest_ref_debug_id = dest_ref->debug_id; @@ -268,9 +295,9 @@ DEFINE_EVENT(binder_buffer_class, binder_transaction_failed_buffer_release, TP_ARGS(buffer)); TRACE_EVENT(binder_update_page_range, - TP_PROTO(struct binder_proc *proc, bool allocate, + TP_PROTO(struct binder_alloc *alloc, bool allocate, void *start, void *end), - TP_ARGS(proc, allocate, start, end), + TP_ARGS(alloc, allocate, start, end), TP_STRUCT__entry( __field(int, proc) __field(bool, allocate) @@ -278,9 +305,9 @@ TRACE_EVENT(binder_update_page_range, __field(size_t, size) ), TP_fast_assign( - __entry->proc = proc->pid; + __entry->proc = alloc->pid; __entry->allocate = allocate; - __entry->offset = start - proc->buffer; + __entry->offset = start - alloc->buffer; __entry->size = end - start; ), TP_printk("proc=%d allocate=%d offset=%zu size=%zu", @@ -288,6 +315,61 @@ TRACE_EVENT(binder_update_page_range, __entry->offset, __entry->size) ); +DECLARE_EVENT_CLASS(binder_lru_page_class, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index), + TP_STRUCT__entry( + __field(int, proc) + __field(size_t, page_index) + ), + TP_fast_assign( + __entry->proc = alloc->pid; + __entry->page_index = page_index; + ), + TP_printk("proc=%d page_index=%zu", + __entry->proc, __entry->page_index) +); + +DEFINE_EVENT(binder_lru_page_class, binder_alloc_lru_start, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_alloc_lru_end, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_free_lru_start, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_free_lru_end, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_alloc_page_start, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_alloc_page_end, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_unmap_user_start, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_unmap_user_end, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_unmap_kernel_start, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + +DEFINE_EVENT(binder_lru_page_class, binder_unmap_kernel_end, + TP_PROTO(const struct binder_alloc *alloc, size_t page_index), + TP_ARGS(alloc, page_index)); + TRACE_EVENT(binder_command, TP_PROTO(uint32_t cmd), TP_ARGS(cmd), diff --git a/drivers/staging/android/fiq_debugger/fiq_debugger.c b/drivers/staging/android/fiq_debugger/fiq_debugger.c index 52f681674c539..0abced1ec6221 100644 --- a/drivers/staging/android/fiq_debugger/fiq_debugger.c +++ b/drivers/staging/android/fiq_debugger/fiq_debugger.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -395,7 +396,7 @@ static void fiq_debugger_work(struct work_struct *work) cmd += 6; while (*cmd == ' ') cmd++; - if (cmd != '\0') + if ((cmd != '\0') && sysrq_on()) kernel_restart(cmd); else kernel_restart(NULL); @@ -425,29 +426,39 @@ static void fiq_debugger_irq_exec(struct fiq_debugger_state *state, char *cmd) static void fiq_debugger_help(struct fiq_debugger_state *state) { fiq_debugger_printf(&state->output, - "FIQ Debugger commands:\n" - " pc PC status\n" - " regs Register dump\n" - " allregs Extended Register dump\n" - " bt Stack trace\n" - " reboot [] Reboot with command \n" - " reset [] Hard reset with command \n" - " irqs Interupt status\n" - " kmsg Kernel log\n" - " version Kernel version\n"); - fiq_debugger_printf(&state->output, - " sleep Allow sleep while in FIQ\n" - " nosleep Disable sleep while in FIQ\n" - " console Switch terminal to console\n" - " cpu Current CPU\n" - " cpu Switch to CPU\n"); + "FIQ Debugger commands:\n"); + if (sysrq_on()) { + fiq_debugger_printf(&state->output, + " pc PC status\n" + " regs Register dump\n" + " allregs Extended Register dump\n" + " bt Stack trace\n"); + fiq_debugger_printf(&state->output, + " reboot [] Reboot with command \n" + " reset [] Hard reset with command \n" + " irqs Interrupt status\n" + " kmsg Kernel log\n" + " version Kernel version\n"); + fiq_debugger_printf(&state->output, + " cpu Current CPU\n" + " cpu Switch to CPU\n" + " sysrq sysrq options\n" + " sysrq Execute sysrq with \n"); + } else { + fiq_debugger_printf(&state->output, + " reboot Reboot\n" + " reset Hard reset\n" + " irqs Interrupt status\n"); + } fiq_debugger_printf(&state->output, - " ps Process list\n" - " sysrq sysrq options\n" - " sysrq Execute sysrq with \n"); + " sleep Allow sleep while in FIQ\n" + " nosleep Disable sleep while in FIQ\n" + " console Switch terminal to console\n" + " ps Process list\n"); #ifdef CONFIG_KGDB - fiq_debugger_printf(&state->output, - " kgdb Enter kernel debugger\n"); + if (fiq_kgdb_enable) { + fiq_debugger_printf(&state->output, + " kgdb Enter kernel debugger\n"); #endif } @@ -479,18 +490,23 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, if (!strcmp(cmd, "help") || !strcmp(cmd, "?")) { fiq_debugger_help(state); } else if (!strcmp(cmd, "pc")) { - fiq_debugger_dump_pc(&state->output, regs); + if (sysrq_on()) + fiq_debugger_dump_pc(&state->output, regs); } else if (!strcmp(cmd, "regs")) { - fiq_debugger_dump_regs(&state->output, regs); + if (sysrq_on()) + fiq_debugger_dump_regs(&state->output, regs); } else if (!strcmp(cmd, "allregs")) { - fiq_debugger_dump_allregs(&state->output, regs); + if (sysrq_on()) + fiq_debugger_dump_allregs(&state->output, regs); } else if (!strcmp(cmd, "bt")) { - fiq_debugger_dump_stacktrace(&state->output, regs, 100, svc_sp); + if (sysrq_on()) + fiq_debugger_dump_stacktrace(&state->output, regs, + 100, svc_sp); } else if (!strncmp(cmd, "reset", 5)) { cmd += 5; while (*cmd == ' ') cmd++; - if (*cmd) { + if (*cmd && sysrq_on()) { char tmp_cmd[32]; strlcpy(tmp_cmd, cmd, sizeof(tmp_cmd)); machine_restart(tmp_cmd); @@ -500,9 +516,12 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, } else if (!strcmp(cmd, "irqs")) { fiq_debugger_dump_irqs(state); } else if (!strcmp(cmd, "kmsg")) { - fiq_debugger_dump_kernel_log(state); + if (sysrq_on()) + fiq_debugger_dump_kernel_log(state); } else if (!strcmp(cmd, "version")) { - fiq_debugger_printf(&state->output, "%s\n", linux_banner); + if (sysrq_on()) + fiq_debugger_printf(&state->output, "%s\n", + linux_banner); } else if (!strcmp(cmd, "sleep")) { state->no_sleep = false; fiq_debugger_printf(&state->output, "enabling sleep\n"); @@ -514,14 +533,17 @@ static bool fiq_debugger_fiq_exec(struct fiq_debugger_state *state, fiq_debugger_uart_flush(state); state->console_enable = true; } else if (!strcmp(cmd, "cpu")) { - fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); - } else if (!strncmp(cmd, "cpu ", 4)) { + if (sysrq_on()) + fiq_debugger_printf(&state->output, "cpu %d\n", + state->current_cpu); + } else if (!strncmp(cmd, "cpu ", 4) && sysrq_on()) { unsigned long cpu = 0; if (kstrtoul(cmd + 4, 10, &cpu) == 0) fiq_debugger_switch_cpu(state, cpu); else fiq_debugger_printf(&state->output, "invalid cpu\n"); - fiq_debugger_printf(&state->output, "cpu %d\n", state->current_cpu); + fiq_debugger_printf(&state->output, "cpu %d\n", + state->current_cpu); } else { if (state->debug_busy) { fiq_debugger_printf(&state->output, diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index cb4a2f43e4fef..1cf5962f12499 100755 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -3,7 +3,7 @@ * drivers/staging/android/ion/ion.c * * Copyright (C) 2011 Google, Inc. - * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2017, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -16,6 +16,7 @@ * */ +#include #include #include #include @@ -113,6 +114,7 @@ struct ion_client { */ struct ion_handle { struct kref ref; + unsigned int user_ref_count; struct ion_client *client; struct ion_buffer *buffer; struct rb_node node; @@ -406,6 +408,15 @@ static void ion_handle_get(struct ion_handle *handle) kref_get(&handle->ref); } +/* Must hold the client lock */ +static struct ion_handle* ion_handle_get_check_overflow(struct ion_handle *handle) +{ + if (atomic_read(&handle->ref.refcount) + 1 == 0) + return ERR_PTR(-EOVERFLOW); + ion_handle_get(handle); + return handle; +} + static int ion_handle_put_nolock(struct ion_handle *handle) { int ret; @@ -427,6 +438,49 @@ int ion_handle_put(struct ion_handle *handle) return ret; } +/* Must hold the client lock */ +static void user_ion_handle_get(struct ion_handle *handle) +{ + if (handle->user_ref_count++ == 0) + kref_get(&handle->ref); +} + +/* Must hold the client lock */ +static struct ion_handle *user_ion_handle_get_check_overflow( + struct ion_handle *handle) +{ + if (handle->user_ref_count + 1 == 0) + return ERR_PTR(-EOVERFLOW); + user_ion_handle_get(handle); + return handle; +} + +/* passes a kref to the user ref count. + * We know we're holding a kref to the object before and + * after this call, so no need to reverify handle. */ +static struct ion_handle *pass_to_user(struct ion_handle *handle) +{ + struct ion_client *client = handle->client; + struct ion_handle *ret; + + mutex_lock(&client->lock); + ret = user_ion_handle_get_check_overflow(handle); + ion_handle_put_nolock(handle); + mutex_unlock(&client->lock); + return ret; +} + +/* Must hold the client lock */ +static int user_ion_handle_put_nolock(struct ion_handle *handle) +{ + int ret = 0; + + if (--handle->user_ref_count == 0) + ret = ion_handle_put_nolock(handle); + + return ret; +} + static struct ion_handle *ion_handle_lookup(struct ion_client *client, struct ion_buffer *buffer) { @@ -452,9 +506,9 @@ static struct ion_handle *ion_handle_get_by_id_nolock(struct ion_client *client, handle = idr_find(&client->idr, id); if (handle) - ion_handle_get(handle); + return ion_handle_get_check_overflow(handle); - return handle ? handle : ERR_PTR(-EINVAL); + return ERR_PTR(-EINVAL); } struct ion_handle *ion_handle_get_by_id(struct ion_client *client, @@ -507,9 +561,9 @@ static int ion_handle_add(struct ion_client *client, struct ion_handle *handle) return 0; } -struct ion_handle *ion_alloc(struct ion_client *client, size_t len, +static struct ion_handle *__ion_alloc(struct ion_client *client, size_t len, size_t align, unsigned int heap_id_mask, - unsigned int flags) + unsigned int flags, bool grab_handle) { struct ion_handle *handle; struct ion_device *dev = client->dev; @@ -604,6 +658,8 @@ struct ion_handle *ion_alloc(struct ion_client *client, size_t len, return handle; mutex_lock(&client->lock); + if (grab_handle) + ion_handle_get(handle); ret = ion_handle_add(client, handle); mutex_unlock(&client->lock); if (ret) { @@ -613,6 +669,13 @@ struct ion_handle *ion_alloc(struct ion_client *client, size_t len, return handle; } + +struct ion_handle *ion_alloc(struct ion_client *client, size_t len, + size_t align, unsigned int heap_id_mask, + unsigned int flags) +{ + return __ion_alloc(client, len, align, heap_id_mask, flags, false); +} EXPORT_SYMBOL(ion_alloc); static void ion_free_nolock(struct ion_client *client, struct ion_handle *handle) @@ -629,6 +692,25 @@ static void ion_free_nolock(struct ion_client *client, struct ion_handle *handle ion_handle_put_nolock(handle); } +static void user_ion_free_nolock(struct ion_client *client, + struct ion_handle *handle) +{ + bool valid_handle; + + BUG_ON(client != handle->client); + + valid_handle = ion_handle_validate(client, handle); + if (!valid_handle) { + WARN(1, "%s: invalid handle passed to free.\n", __func__); + return; + } + if (handle->user_ref_count == 0) { + WARN(1, "%s: User does not have access!\n", __func__); + return; + } + user_ion_handle_put_nolock(handle); +} + void ion_free(struct ion_client *client, struct ion_handle *handle) { BUG_ON(client != handle->client); @@ -802,7 +884,7 @@ static int ion_debug_client_show(struct seq_file *s, void *unused) struct ion_handle *handle = rb_entry(n, struct ion_handle, node); - seq_printf(s, "%16.16s: %16zx : %16d : %12p", + seq_printf(s, "%16.16s: %16zx : %16d : %12pK", handle->buffer->heap->name, handle->buffer->size, atomic_read(&handle->ref.refcount), @@ -1201,7 +1283,7 @@ static void ion_vm_open(struct vm_area_struct *vma) mutex_lock(&buffer->lock); list_add(&vma_list->list, &buffer->vmas); mutex_unlock(&buffer->lock); - pr_debug("%s: adding %p\n", __func__, vma); + pr_debug("%s: adding %pK\n", __func__, vma); } static void ion_vm_close(struct vm_area_struct *vma) @@ -1216,7 +1298,7 @@ static void ion_vm_close(struct vm_area_struct *vma) continue; list_del(&vma_list->list); kfree(vma_list); - pr_debug("%s: deleting %p\n", __func__, vma); + pr_debug("%s: deleting %pK\n", __func__, vma); break; } mutex_unlock(&buffer->lock); @@ -1398,7 +1480,7 @@ struct ion_handle *ion_import_dma_buf(struct ion_client *client, int fd) /* if a handle exists for this buffer just take a reference to it */ handle = ion_handle_lookup(client, buffer); if (!IS_ERR(handle)) { - ion_handle_get(handle); + handle = ion_handle_get_check_overflow(handle); mutex_unlock(&client->lock); goto end; } @@ -1488,13 +1570,13 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) { struct ion_handle *handle; - handle = ion_alloc(client, data.allocation.len, + handle = __ion_alloc(client, data.allocation.len, data.allocation.align, data.allocation.heap_id_mask, - data.allocation.flags); + data.allocation.flags, true); if (IS_ERR(handle)) return PTR_ERR(handle); - + pass_to_user(handle); data.allocation.handle = handle->id; cleanup_handle = handle; @@ -1510,7 +1592,7 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) mutex_unlock(&client->lock); return PTR_ERR(handle); } - ion_free_nolock(client, handle); + user_ion_free_nolock(client, handle); ion_handle_put_nolock(handle); mutex_unlock(&client->lock); break; @@ -1534,10 +1616,15 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) struct ion_handle *handle; handle = ion_import_dma_buf(client, data.fd.fd); - if (IS_ERR(handle)) + if (IS_ERR(handle)) { ret = PTR_ERR(handle); - else - data.handle.handle = handle->id; + } else { + handle = pass_to_user(handle); + if (IS_ERR(handle)) + ret = PTR_ERR(handle); + else + data.handle.handle = handle->id; + } break; } case ION_IOC_SYNC: @@ -1568,11 +1655,17 @@ static long ion_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) if (dir & _IOC_READ) { if (copy_to_user((void __user *)arg, &data, _IOC_SIZE(cmd))) { - if (cleanup_handle) - ion_free(client, cleanup_handle); + if (cleanup_handle) { + mutex_lock(&client->lock); + user_ion_free_nolock(client, cleanup_handle); + ion_handle_put_nolock(cleanup_handle); + mutex_unlock(&client->lock); + } return -EFAULT; } } + if (cleanup_handle) + ion_handle_put(cleanup_handle); return ret; } diff --git a/drivers/staging/android/ion/ion_cma_heap.c b/drivers/staging/android/ion/ion_cma_heap.c index aaea7bed36e1a..b5905fc81147b 100644 --- a/drivers/staging/android/ion/ion_cma_heap.c +++ b/drivers/staging/android/ion/ion_cma_heap.c @@ -94,7 +94,7 @@ static int ion_cma_allocate(struct ion_heap *heap, struct ion_buffer *buffer, /* keep this for memory release */ buffer->priv_virt = info; - dev_dbg(dev, "Allocate buffer %p\n", buffer); + dev_dbg(dev, "Allocate buffer %pK\n", buffer); return 0; err: @@ -107,7 +107,7 @@ static void ion_cma_free(struct ion_buffer *buffer) struct device *dev = buffer->heap->priv; struct ion_cma_buffer_info *info = buffer->priv_virt; - dev_dbg(dev, "Release buffer %p\n", buffer); + dev_dbg(dev, "Release buffer %pK\n", buffer); /* release memory */ dma_free_coherent(dev, buffer->size, info->cpu_addr, info->handle); sg_free_table(info->table); @@ -123,7 +123,7 @@ static int ion_cma_phys(struct ion_heap *heap, struct ion_buffer *buffer, struct device *dev = heap->priv; struct ion_cma_buffer_info *info = buffer->priv_virt; - dev_dbg(dev, "Return buffer %p physical address %pa\n", buffer, + dev_dbg(dev, "Return buffer %pK physical address %pa\n", buffer, &info->handle); *addr = info->handle; @@ -274,11 +274,16 @@ static int ion_secure_cma_allocate(struct ion_heap *heap, source_vm = VMID_HLOS; dest_vm = get_secure_vmid(flags); + if (dest_vm < 0) { pr_err("%s: Failed to get secure vmid\n", __func__); return -EINVAL; } - dest_perms = PERM_READ | PERM_WRITE; + + if (dest_vm == VMID_CP_SEC_DISPLAY) + dest_perms = PERM_READ; + else + dest_perms = PERM_READ | PERM_WRITE; ret = ion_cma_allocate(heap, buffer, len, align, flags); if (ret) { diff --git a/drivers/staging/android/ion/ion_cma_secure_heap.c b/drivers/staging/android/ion/ion_cma_secure_heap.c index d945b92514379..90ae7eb65b659 100644 --- a/drivers/staging/android/ion/ion_cma_secure_heap.c +++ b/drivers/staging/android/ion/ion_cma_secure_heap.c @@ -3,7 +3,7 @@ * * Copyright (C) Linaro 2012 * Author: for ST-Ericsson. - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -501,7 +501,7 @@ static struct ion_secure_cma_buffer_info *__ion_secure_cma_allocate( /* keep this for memory release */ buffer->priv_virt = info; - dev_dbg(sheap->dev, "Allocate buffer %p\n", buffer); + dev_dbg(sheap->dev, "Allocate buffer %pK\n", buffer); return info; err: @@ -634,7 +634,7 @@ static struct ion_secure_cma_buffer_info *__ion_secure_cma_allocate_non_contig( sg = sg_next(sg); } buffer->priv_virt = info; - dev_dbg(sheap->dev, "Allocate buffer %p\n", buffer); + dev_dbg(sheap->dev, "Allocate buffer %pK\n", buffer); return info; err2: @@ -721,7 +721,7 @@ static void ion_secure_cma_free(struct ion_buffer *buffer) struct ion_secure_cma_buffer_info *info = buffer->priv_virt; int ret = 0; - dev_dbg(sheap->dev, "Release buffer %p\n", buffer); + dev_dbg(sheap->dev, "Release buffer %pK\n", buffer); if (msm_secure_v2_is_supported()) ret = msm_unsecure_table(info->table); atomic_sub(buffer->size, &sheap->total_allocated); @@ -743,8 +743,8 @@ static int ion_secure_cma_phys(struct ion_heap *heap, struct ion_buffer *buffer, container_of(heap, struct ion_cma_secure_heap, heap); struct ion_secure_cma_buffer_info *info = buffer->priv_virt; - dev_dbg(sheap->dev, "Return buffer %p physical address 0x%pa\n", buffer, - &info->phys); + dev_dbg(sheap->dev, "Return buffer %pK physical address 0x%pa\n", + buffer, &info->phys); *addr = info->phys; *len = buffer->size; diff --git a/drivers/staging/android/ion/ion_heap.c b/drivers/staging/android/ion/ion_heap.c index 54d3bd98126e7..a48566ab41d87 100644 --- a/drivers/staging/android/ion/ion_heap.c +++ b/drivers/staging/android/ion/ion_heap.c @@ -2,7 +2,7 @@ * drivers/staging/android/ion/ion_heap.c * * Copyright (C) 2011 Google, Inc. - * Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2011-2016, The Linux Foundation. All rights reserved. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -325,8 +325,9 @@ struct ion_heap *ion_heap_create(struct ion_platform_heap *heap_data) switch (heap_data->type) { case ION_HEAP_TYPE_SYSTEM_CONTIG: - heap = ion_system_contig_heap_create(heap_data); - break; + pr_err("%s: Heap type is disabled: %d\n", __func__, + heap_data->type); + return ERR_PTR(-EINVAL); case ION_HEAP_TYPE_SYSTEM: heap = ion_system_heap_create(heap_data); break; @@ -365,7 +366,8 @@ void ion_heap_destroy(struct ion_heap *heap) switch (heap->type) { case ION_HEAP_TYPE_SYSTEM_CONTIG: - ion_system_contig_heap_destroy(heap); + pr_err("%s: Heap type is disabled: %d\n", __func__, + heap->type); break; case ION_HEAP_TYPE_SYSTEM: ion_system_heap_destroy(heap); diff --git a/drivers/staging/android/ion/ion_system_heap.c b/drivers/staging/android/ion/ion_system_heap.c index 062de5ae1738f..10e8a73cee3c1 100644 --- a/drivers/staging/android/ion/ion_system_heap.c +++ b/drivers/staging/android/ion/ion_system_heap.c @@ -37,7 +37,7 @@ static gfp_t high_order_gfp_flags = (GFP_HIGHUSER | __GFP_NOWARN | static gfp_t low_order_gfp_flags = (GFP_HIGHUSER | __GFP_NOWARN); #ifndef CONFIG_ALLOC_BUFFERS_IN_4K_CHUNKS -static const unsigned int orders[] = {9, 8, 4, 0}; +static const unsigned int orders[] = {4, 0}; #else static const unsigned int orders[] = {0}; #endif diff --git a/drivers/staging/android/ion/msm/msm_ion.c b/drivers/staging/android/ion/msm/msm_ion.c index bbc027b0714fe..882e33e4c01c3 100644 --- a/drivers/staging/android/ion/msm/msm_ion.c +++ b/drivers/staging/android/ion/msm/msm_ion.c @@ -705,7 +705,7 @@ long msm_ion_custom_ioctl(struct ion_client *client, } else { handle = ion_import_dma_buf(client, data.flush_data.fd); if (IS_ERR(handle)) { - pr_info("%s: Could not import handle: %p\n", + pr_info("%s: Could not import handle: %pK\n", __func__, handle); return -EINVAL; } @@ -718,7 +718,7 @@ long msm_ion_custom_ioctl(struct ion_client *client, + data.flush_data.length; if (start && check_vaddr_bounds(start, end)) { - pr_err("%s: virtual address %p is out of bounds\n", + pr_err("%s: virtual address %pK is out of bounds\n", __func__, data.flush_data.vaddr); ret = -EINVAL; } else { diff --git a/drivers/staging/android/lowmemorykiller.c b/drivers/staging/android/lowmemorykiller.c index d70c1233e3518..9b6c97e3524a4 100644 --- a/drivers/staging/android/lowmemorykiller.c +++ b/drivers/staging/android/lowmemorykiller.c @@ -32,35 +32,22 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt -#include +#include +#include #include #include #include #include #include #include +#include #include -#include -#include -#include -#include -#include #include -#include -#define CREATE_TRACE_POINTS -#include -#ifdef CONFIG_HIGHMEM -#define _ZONE ZONE_HIGHMEM -#else -#define _ZONE ZONE_NORMAL -#endif +#define CONFIG_CONVERT_ADJ_TO_SCORE_ADJ -#define CREATE_TRACE_POINTS -#include "trace/lowmemorykiller.h" - -static uint32_t lowmem_debug_level = 1; +static u32 lowmem_debug_level = 1; static short lowmem_adj[6] = { 0, 1, @@ -75,311 +62,41 @@ static int lowmem_minfree[6] = { 16 * 1024, /* 64MB */ }; static int lowmem_minfree_size = 4; -static int lmk_fast_run = 1; static unsigned long lowmem_deathpending_timeout; +static bool kill_one_more; + #define lowmem_print(level, x...) \ do { \ if (lowmem_debug_level >= (level)) \ pr_info(x); \ } while (0) -static unsigned long lowmem_count(struct shrinker *s, - struct shrink_control *sc) -{ - return global_page_state(NR_ACTIVE_ANON) + - global_page_state(NR_ACTIVE_FILE) + - global_page_state(NR_INACTIVE_ANON) + - global_page_state(NR_INACTIVE_FILE); -} - -static atomic_t shift_adj = ATOMIC_INIT(0); -static short adj_max_shift = 353; -module_param_named(adj_max_shift, adj_max_shift, short, - S_IRUGO | S_IWUSR); - -/* User knob to enable/disable adaptive lmk feature */ -static int enable_adaptive_lmk; -module_param_named(enable_adaptive_lmk, enable_adaptive_lmk, int, - S_IRUGO | S_IWUSR); - -/* - * This parameter controls the behaviour of LMK when vmpressure is in - * the range of 90-94. Adaptive lmk triggers based on number of file - * pages wrt vmpressure_file_min, when vmpressure is in the range of - * 90-94. Usually this is a pseudo minfree value, higher than the - * highest configured value in minfree array. - */ -static int vmpressure_file_min; -module_param_named(vmpressure_file_min, vmpressure_file_min, int, - S_IRUGO | S_IWUSR); - -enum { - VMPRESSURE_NO_ADJUST = 0, - VMPRESSURE_ADJUST_ENCROACH, - VMPRESSURE_ADJUST_NORMAL, -}; - -int adjust_minadj(short *min_score_adj) -{ - int ret = VMPRESSURE_NO_ADJUST; - if (!enable_adaptive_lmk) - return 0; - - if (atomic_read(&shift_adj) && - (*min_score_adj > adj_max_shift)) { - if (*min_score_adj == OOM_SCORE_ADJ_MAX + 1) - ret = VMPRESSURE_ADJUST_ENCROACH; - else - ret = VMPRESSURE_ADJUST_NORMAL; - *min_score_adj = adj_max_shift; - } - atomic_set(&shift_adj, 0); - - return ret; -} - -static int lmk_vmpressure_notifier(struct notifier_block *nb, - unsigned long action, void *data) -{ - int other_free, other_file; - unsigned long pressure = action; - int array_size = ARRAY_SIZE(lowmem_adj); - - if (!enable_adaptive_lmk) - return 0; - - if (pressure >= 95) { - other_file = global_page_state(NR_FILE_PAGES) + zcache_pages() - - global_page_state(NR_SHMEM) - - total_swapcache_pages(); - other_free = global_page_state(NR_FREE_PAGES); - - atomic_set(&shift_adj, 1); - trace_almk_vmpressure(pressure, other_free, other_file); - } else if (pressure >= 90) { - if (lowmem_adj_size < array_size) - array_size = lowmem_adj_size; - if (lowmem_minfree_size < array_size) - array_size = lowmem_minfree_size; - - other_file = global_page_state(NR_FILE_PAGES) + zcache_pages() - - global_page_state(NR_SHMEM) - - total_swapcache_pages(); - - other_free = global_page_state(NR_FREE_PAGES); - - if ((other_free < lowmem_minfree[array_size - 1]) && - (other_file < vmpressure_file_min)) { - atomic_set(&shift_adj, 1); - trace_almk_vmpressure(pressure, other_free, - other_file); - } - } else if (atomic_read(&shift_adj)) { - /* - * shift_adj would have been set by a previous invocation - * of notifier, which is not followed by a lowmem_shrink yet. - * Since vmpressure has improved, reset shift_adj to avoid - * false adaptive LMK trigger. - */ - trace_almk_vmpressure(pressure, other_free, other_file); - atomic_set(&shift_adj, 0); - } - - return 0; -} - -static struct notifier_block lmk_vmpr_nb = { - .notifier_call = lmk_vmpressure_notifier, -}; - -static int test_task_flag(struct task_struct *p, int flag) +static bool test_tsk_lmk_waiting(struct task_struct *p) { struct task_struct *t; for_each_thread(p, t) { task_lock(t); - if (test_tsk_thread_flag(t, flag)) { + if (unlikely(task_lmk_waiting(t))) { task_unlock(t); - return 1; + return true; } task_unlock(t); } - return 0; + return false; } -static DEFINE_MUTEX(scan_mutex); - -int can_use_cma_pages(gfp_t gfp_mask) -{ - int can_use = 0; - int mtype = gfpflags_to_migratetype(gfp_mask); - int i = 0; - int *mtype_fallbacks = get_migratetype_fallbacks(mtype); - - if (is_migrate_cma(mtype)) { - can_use = 1; - } else { - for (i = 0;; i++) { - int fallbacktype = mtype_fallbacks[i]; - - if (is_migrate_cma(fallbacktype)) { - can_use = 1; - break; - } - - if (fallbacktype == MIGRATE_RESERVE) - break; - } - } - return can_use; -} - -void tune_lmk_zone_param(struct zonelist *zonelist, int classzone_idx, - int *other_free, int *other_file, - int use_cma_pages) -{ - struct zone *zone; - struct zoneref *zoneref; - int zone_idx; - - for_each_zone_zonelist(zone, zoneref, zonelist, MAX_NR_ZONES) { - zone_idx = zonelist_zone_idx(zoneref); - if (zone_idx == ZONE_MOVABLE) { - if (!use_cma_pages && other_free) - *other_free -= - zone_page_state(zone, NR_FREE_CMA_PAGES); - continue; - } - - if (zone_idx > classzone_idx) { - if (other_free != NULL) - *other_free -= zone_page_state(zone, - NR_FREE_PAGES); - if (other_file != NULL) - *other_file -= zone_page_state(zone, - NR_FILE_PAGES) - - zone_page_state(zone, NR_SHMEM) - - zone_page_state(zone, NR_SWAPCACHE); - } else if (zone_idx < classzone_idx) { - if (zone_watermark_ok(zone, 0, 0, classzone_idx, 0) && - other_free) { - if (!use_cma_pages) { - *other_free -= min( - zone->lowmem_reserve[classzone_idx] + - zone_page_state( - zone, NR_FREE_CMA_PAGES), - zone_page_state( - zone, NR_FREE_PAGES)); - } else { - *other_free -= - zone->lowmem_reserve[classzone_idx]; - } - } else { - if (other_free) - *other_free -= - zone_page_state(zone, NR_FREE_PAGES); - } - } - } -} - -#ifdef CONFIG_HIGHMEM -void adjust_gfp_mask(gfp_t *gfp_mask) -{ - struct zone *preferred_zone; - struct zonelist *zonelist; - enum zone_type high_zoneidx; - - if (current_is_kswapd()) { - zonelist = node_zonelist(0, *gfp_mask); - high_zoneidx = gfp_zone(*gfp_mask); - first_zones_zonelist(zonelist, high_zoneidx, NULL, - &preferred_zone); - - if (high_zoneidx == ZONE_NORMAL) { - if (zone_watermark_ok_safe(preferred_zone, 0, - high_wmark_pages(preferred_zone), 0, - 0)) - *gfp_mask |= __GFP_HIGHMEM; - } else if (high_zoneidx == ZONE_HIGHMEM) { - *gfp_mask |= __GFP_HIGHMEM; - } - } -} -#else -void adjust_gfp_mask(gfp_t *unused) -{ -} -#endif - -void tune_lmk_param(int *other_free, int *other_file, struct shrink_control *sc) +static unsigned long lowmem_count(struct shrinker *s, + struct shrink_control *sc) { - gfp_t gfp_mask; - struct zone *preferred_zone; - struct zonelist *zonelist; - enum zone_type high_zoneidx, classzone_idx; - unsigned long balance_gap; - int use_cma_pages; - - gfp_mask = sc->gfp_mask; - adjust_gfp_mask(&gfp_mask); - - zonelist = node_zonelist(0, gfp_mask); - high_zoneidx = gfp_zone(gfp_mask); - first_zones_zonelist(zonelist, high_zoneidx, NULL, &preferred_zone); - classzone_idx = zone_idx(preferred_zone); - use_cma_pages = can_use_cma_pages(gfp_mask); - - balance_gap = min(low_wmark_pages(preferred_zone), - (preferred_zone->present_pages + - KSWAPD_ZONE_BALANCE_GAP_RATIO-1) / - KSWAPD_ZONE_BALANCE_GAP_RATIO); - - if (likely(current_is_kswapd() && zone_watermark_ok(preferred_zone, 0, - high_wmark_pages(preferred_zone) + SWAP_CLUSTER_MAX + - balance_gap, 0, 0))) { - if (lmk_fast_run) - tune_lmk_zone_param(zonelist, classzone_idx, other_free, - other_file, use_cma_pages); - else - tune_lmk_zone_param(zonelist, classzone_idx, other_free, - NULL, use_cma_pages); - - if (zone_watermark_ok(preferred_zone, 0, 0, _ZONE, 0)) { - if (!use_cma_pages) { - *other_free -= min( - preferred_zone->lowmem_reserve[_ZONE] - + zone_page_state( - preferred_zone, NR_FREE_CMA_PAGES), - zone_page_state( - preferred_zone, NR_FREE_PAGES)); - } else { - *other_free -= - preferred_zone->lowmem_reserve[_ZONE]; - } - } else { - *other_free -= zone_page_state(preferred_zone, - NR_FREE_PAGES); - } - - lowmem_print(4, "lowmem_shrink of kswapd tunning for highmem " - "ofree %d, %d\n", *other_free, *other_file); - } else { - tune_lmk_zone_param(zonelist, classzone_idx, other_free, - other_file, use_cma_pages); - - if (!use_cma_pages) { - *other_free -= - zone_page_state(preferred_zone, NR_FREE_CMA_PAGES); - } - - lowmem_print(4, "lowmem_shrink tunning for others ofree %d, " - "%d\n", *other_free, *other_file); - } + return global_page_state(NR_ACTIVE_ANON) + + global_page_state(NR_ACTIVE_FILE) + + global_page_state(NR_INACTIVE_ANON) + + global_page_state(NR_INACTIVE_FILE); } static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) @@ -389,29 +106,16 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) unsigned long rem = 0; int tasksize; int i; - int ret = 0; short min_score_adj = OOM_SCORE_ADJ_MAX + 1; int minfree = 0; int selected_tasksize = 0; short selected_oom_score_adj; int array_size = ARRAY_SIZE(lowmem_adj); - int other_free; - int other_file; - - if (mutex_lock_interruptible(&scan_mutex) < 0) - return 0; - - other_free = global_page_state(NR_FREE_PAGES); - - if (global_page_state(NR_SHMEM) + total_swapcache_pages() < - global_page_state(NR_FILE_PAGES) + zcache_pages()) - other_file = global_page_state(NR_FILE_PAGES) + zcache_pages() - + int other_free = global_page_state(NR_FREE_PAGES) - totalreserve_pages; + int other_file = global_page_state(NR_FILE_PAGES) - global_page_state(NR_SHMEM) - + global_page_state(NR_UNEVICTABLE) - total_swapcache_pages(); - else - other_file = 0; - - tune_lmk_param(&other_free, &other_file, sc); if (lowmem_adj_size < array_size) array_size = lowmem_adj_size; @@ -419,29 +123,26 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) array_size = lowmem_minfree_size; for (i = 0; i < array_size; i++) { minfree = lowmem_minfree[i]; - if (other_free < minfree && other_file < minfree) { + if (other_free < minfree && other_file < (minfree + minfree / 4)) { min_score_adj = lowmem_adj[i]; break; } } - ret = adjust_minadj(&min_score_adj); - lowmem_print(3, "lowmem_scan %lu, %x, ofree %d %d, ma %hd\n", sc->nr_to_scan, sc->gfp_mask, other_free, other_file, min_score_adj); if (min_score_adj == OOM_SCORE_ADJ_MAX + 1) { - trace_almk_shrink(0, ret, other_free, other_file, 0); lowmem_print(5, "lowmem_scan %lu, %x, return 0\n", sc->nr_to_scan, sc->gfp_mask); - mutex_unlock(&scan_mutex); return 0; } selected_oom_score_adj = min_score_adj; rcu_read_lock(); +again: for_each_process(tsk) { struct task_struct *p; short oom_score_adj; @@ -449,18 +150,10 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) if (tsk->flags & PF_KTHREAD) continue; - /* if task no longer has any memory ignore it */ - if (test_task_flag(tsk, TIF_MM_RELEASED)) + if (test_tsk_lmk_waiting(tsk)) { + lowmem_print(2, "%s (%d) is already killed, skip\n", + tsk->comm, tsk->pid); continue; - - if (time_before_eq(jiffies, lowmem_deathpending_timeout)) { - if (test_task_flag(tsk, TIF_MEMDIE)) { - rcu_read_unlock(); - /* give the system time to free up the memory */ - msleep_interruptible(20); - mutex_unlock(&scan_mutex); - return 0; - } } p = find_lock_task_mm(tsk); @@ -473,6 +166,9 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) continue; } tasksize = get_mm_rss(p->mm); +#ifdef CONFIG_ZRAM + tasksize += (get_mm_counter(p->mm, MM_SWAPENTS) / 3); +#endif task_unlock(p); if (tasksize <= 0) continue; @@ -486,63 +182,41 @@ static unsigned long lowmem_scan(struct shrinker *s, struct shrink_control *sc) selected = p; selected_tasksize = tasksize; selected_oom_score_adj = oom_score_adj; - lowmem_print(3, "select '%s' (%d), adj %hd, size %d, to kill\n", - p->comm, p->pid, oom_score_adj, tasksize); + lowmem_print(2, "select '%s' (%d, %d), adj %hd, size %d, to kill\n", + p->comm, p->pid, p->tgid, oom_score_adj, tasksize); } if (selected) { - long cache_size = other_file * (long)(PAGE_SIZE / 1024); - long cache_limit = minfree * (long)(PAGE_SIZE / 1024); - long free = other_free * (long)(PAGE_SIZE / 1024); - trace_lowmemory_kill(selected, cache_size, cache_limit, free); - lowmem_print(1, "Killing '%s' (%d), adj %hd,\n" \ - " to free %ldkB on behalf of '%s' (%d) because\n" \ - " cache %ldkB is below limit %ldkB for oom_score_adj %hd\n" \ - " Free memory is %ldkB above reserved.\n" \ - " Free CMA is %ldkB\n" \ - " Total reserve is %ldkB\n" \ - " Total free pages is %ldkB\n" \ - " Total file cache is %ldkB\n" \ - " Total zcache is %ldkB\n" \ - " GFP mask is 0x%x\n", + task_lock(selected); + send_sig(SIGKILL, selected, 0); + if (selected->mm) + task_set_lmk_waiting(selected); + task_unlock(selected); + lowmem_print(1, "Killing '%s' (%d), adj %hd,\n" + " to free %ldkB on behalf of '%s' (%d) because\n" + " cache %ldkB is below limit %ldkB for oom_score_adj %hd\n" + " Free memory is %ldkB above reserved\n", selected->comm, selected->pid, selected_oom_score_adj, selected_tasksize * (long)(PAGE_SIZE / 1024), current->comm, current->pid, - cache_size, cache_limit, + other_file * (long)(PAGE_SIZE / 1024), + minfree * (long)(PAGE_SIZE / 1024), min_score_adj, - other_free * (long)(PAGE_SIZE / 1024), - global_page_state(NR_FREE_CMA_PAGES) * - (long)(PAGE_SIZE / 1024), - totalreserve_pages * (long)(PAGE_SIZE / 1024), - global_page_state(NR_FREE_PAGES) * - (long)(PAGE_SIZE / 1024), - global_page_state(NR_FILE_PAGES) * - (long)(PAGE_SIZE / 1024), - (long)zcache_pages() * (long)(PAGE_SIZE / 1024), - sc->gfp_mask); - - if (lowmem_debug_level >= 2 && selected_oom_score_adj == 0) { - show_mem(SHOW_MEM_FILTER_NODES); - dump_tasks(NULL, NULL); - } - + other_free * (long)(PAGE_SIZE / 1024)); lowmem_deathpending_timeout = jiffies + HZ; - set_tsk_thread_flag(selected, TIF_MEMDIE); - send_sig(SIGKILL, selected, 0); rem += selected_tasksize; - rcu_read_unlock(); - /* give the system time to free up the memory */ - msleep_interruptible(20); - trace_almk_shrink(selected_tasksize, ret, - other_free, other_file, selected_oom_score_adj); - } else { - trace_almk_shrink(1, ret, other_free, other_file, 0); - rcu_read_unlock(); + } + + if (kill_one_more) { + selected = NULL; + kill_one_more = false; + goto again; } lowmem_print(4, "lowmem_scan %lu, %x, return %lu\n", sc->nr_to_scan, sc->gfp_mask, rem); - mutex_unlock(&scan_mutex); + rcu_read_unlock(); + return rem; } @@ -552,19 +226,45 @@ static struct shrinker lowmem_shrinker = { .seeks = DEFAULT_SEEKS * 16 }; -static int __init lowmem_init(void) + +/* + * when vmpressure >= vmpressure_level_critical(95), we will kill one more process + */ +static int lmk_vmpressure_notifier(struct notifier_block *nb, + unsigned long action, void *data) { - register_shrinker(&lowmem_shrinker); - vmpressure_notifier_register(&lmk_vmpr_nb); + unsigned long pressure = action; + + if (pressure >= 95) { + if (!kill_one_more) { + kill_one_more = true; + lowmem_print(1, "vmpressure %ld, set kill_one_more true\n", + pressure); + } + } else { + if (kill_one_more) { + kill_one_more = false; + lowmem_print(1, "vmpressure %ld, set kill_one_more false\n", + pressure); + } + } + return 0; } -static void __exit lowmem_exit(void) +static struct notifier_block lmk_vmpr_nb = { + .notifier_call = lmk_vmpressure_notifier, +}; + +static int __init lowmem_init(void) { - unregister_shrinker(&lowmem_shrinker); + register_shrinker(&lowmem_shrinker); + vmpressure_notifier_register(&lmk_vmpr_nb); + return 0; } +device_initcall(lowmem_init); -#ifdef CONFIG_ANDROID_LOW_MEMORY_KILLER_AUTODETECT_OOM_ADJ_VALUES +#ifdef CONFIG_CONVERT_ADJ_TO_SCORE_ADJ static short lowmem_oom_adj_to_oom_score_adj(short oom_adj) { if (oom_adj == OOM_ADJUST_MAX) @@ -641,8 +341,12 @@ static const struct kparam_array __param_arr_adj = { }; #endif +/* + * not really modular, but the easiest way to keep compat with existing + * bootargs behaviour is to continue using module_param here. + */ module_param_named(cost, lowmem_shrinker.seeks, int, S_IRUGO | S_IWUSR); -#ifdef CONFIG_ANDROID_LOW_MEMORY_KILLER_AUTODETECT_OOM_ADJ_VALUES +#ifdef CONFIG_CONVERT_ADJ_TO_SCORE_ADJ module_param_cb(adj, &lowmem_adj_array_ops, .arr = &__param_arr_adj, S_IRUGO | S_IWUSR); __MODULE_PARM_TYPE(adj, "array of short"); @@ -653,10 +357,4 @@ module_param_array_named(adj, lowmem_adj, short, &lowmem_adj_size, module_param_array_named(minfree, lowmem_minfree, uint, &lowmem_minfree_size, S_IRUGO | S_IWUSR); module_param_named(debug_level, lowmem_debug_level, uint, S_IRUGO | S_IWUSR); -module_param_named(lmk_fast_run, lmk_fast_run, int, S_IRUGO | S_IWUSR); - -module_init(lowmem_init); -module_exit(lowmem_exit); - -MODULE_LICENSE("GPL"); diff --git a/drivers/staging/android/memsw_state.c b/drivers/staging/android/memsw_state.c new file mode 100644 index 0000000000000..44bc39cbcca0c --- /dev/null +++ b/drivers/staging/android/memsw_state.c @@ -0,0 +1,306 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "memsw_state.h" + +#define memsw_freeram (global_page_state(NR_FREE_PAGES) - totalreserve_pages) +#define memsw_filepage (global_page_state(NR_FILE_PAGES) - total_swapcache_pages()) + +#define MEMSW_FREEMEM_KB ((memsw_freeram + memsw_filepage) << (PAGE_SHIFT - 10)) +#define MEMSW_FREESWAP_KB (get_nr_swap_pages() << (PAGE_SHIFT - 10)) +#define MEMSW_EXTRA_KB (16 << (PAGE_SHIFT - 10)) + +static uint32_t check_pending_times; + +static int memsw_dev_open(struct inode *inode, struct file *file) +{ + struct memsw_dev *memsw_dev; + struct memsw_reader *reader; + int ret, i = MINOR(inode->i_rdev); + + + memsw_dev = memsw_dev_get_w_check(i); + if (memsw_dev == NULL) + return -ENODEV; + + + if (!(file->f_mode & FMODE_READ)) + ret = -EBADF; + + ret = nonseekable_open(inode, file); + if (ret) + return ret; + + reader = kmalloc(sizeof(struct memsw_reader), GFP_KERNEL); + if (!reader) + return -ENOMEM; + + reader->dev = memsw_dev; + reader->version = 1; + reader->auth_rights = in_egroup_p(inode->i_gid) || capable(CAP_SYS_ADMIN); + INIT_LIST_HEAD(&reader->list); + + mutex_lock(&memsw_dev->mutex); + list_add_tail(&reader->list, &memsw_dev->reader_list); + mutex_unlock(&memsw_dev->mutex); + + file->private_data = reader; + + return 0; +} + +static inline void memsw_dev_update_data(struct memsw_dev *memsw_dev) +{ + mutex_lock(&memsw_dev->mutex); + (memsw_dev->memsw_data).current_freeram = MEMSW_FREEMEM_KB; + (memsw_dev->memsw_data).current_freeswap = MEMSW_FREESWAP_KB; + mutex_unlock(&memsw_dev->mutex); +} + +static inline int memsw_dev_event_pending(struct memsw_dev *memsw_dev) +{ + int pending = 0; + + mutex_lock(&memsw_dev->mutex); + if ((memsw_dev->memsw_data).mem_threshold >= MEMSW_FREEMEM_KB) { + (memsw_dev->memsw_data).low_mem_triggered = 1; + pending = 1; + } else { + (memsw_dev->memsw_data).low_mem_triggered = 0; + } + if (((memsw_dev->memsw_data).swap_threshold >= MEMSW_FREESWAP_KB) && (total_swap_pages != 0)) { + (memsw_dev->memsw_data).low_swap_triggered = 1; + pending = 1; + } else { + (memsw_dev->memsw_data).low_swap_triggered = 0; + } + mutex_unlock(&memsw_dev->mutex); + + return pending; +} + +static ssize_t memsw_dev_read(struct file *file, char __user *buf, + size_t count, loff_t *pos) +{ + ssize_t ret = 0; + struct memsw_reader *reader = file->private_data; + struct memsw_dev *memsw_dev = reader->dev; + + if (!(reader->auth_rights)) + return -EPERM; + + if (!memsw_dev_event_pending(memsw_dev) && (file->f_flags & O_NONBLOCK)) + return -EAGAIN; + + wait_event_interruptible(memsw_dev->wq, memsw_dev_event_pending(memsw_dev)); + + memsw_dev_update_data(memsw_dev); + if (copy_to_user(buf, &memsw_dev->memsw_data, sizeof(struct memsw_state_data))) + return -EFAULT; + + ret = sizeof(struct memsw_state_data); + + return ret; +} + +static unsigned int memsw_dev_poll(struct file *file, poll_table *wait) +{ + struct memsw_reader *reader = file->private_data; + struct memsw_dev *memsw_dev = reader->dev; + + poll_wait(file, &memsw_dev->wq, wait); + return (memsw_dev_event_pending(memsw_dev) ? (POLLIN | POLLRDNORM) : 0); +} + +static long memsw_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + long ret = -EINVAL; + struct memsw_reader *reader = file->private_data; + struct memsw_dev *memsw_dev = reader->dev; + void __user *argp = (void __user *) arg; + + if (!(reader->auth_rights)) + return -EPERM; + + mutex_lock(&memsw_dev->mutex); + + switch (cmd) { + case GET_MEM_THRESHOLD: + ret = copy_to_user(argp, &(memsw_dev->memsw_data.mem_threshold), sizeof(unsigned long)); + break; + case SET_MEM_THRESHOLD: + ret = copy_from_user(&(memsw_dev->memsw_data.mem_threshold), argp, sizeof(unsigned long)); + if (ret == 0) { + if ((memsw_dev->memsw_data).mem_threshold <= MEMSW_FREEMEM_KB) { + (memsw_dev->memsw_data).low_mem_triggered = 1; + wake_up_interruptible(&memsw_dev->wq); + } + } + break; + case GET_SWAP_THRESHOLD: + ret = copy_to_user(argp, &(memsw_dev->memsw_data.swap_threshold), sizeof(unsigned long)); + break; + case SET_SWAP_THRESHOLD: + ret = copy_from_user(&(memsw_dev->memsw_data.swap_threshold), argp, sizeof(unsigned long)); + if (ret == 0) { + if ((memsw_dev->memsw_data).swap_threshold <= MEMSW_FREESWAP_KB) { + (memsw_dev->memsw_data).low_swap_triggered = 1; + wake_up_interruptible(&memsw_dev->wq); + } + } + break; + case GET_MEMSW_DEV_VERSION: + ret = copy_to_user(argp, &(reader->version), sizeof(uint8_t)); + break; + case SET_MEMSW_DEV_VERSION: + ret = copy_from_user(&(reader->version), argp, sizeof(uint8_t)); + break; + } + + mutex_unlock(&memsw_dev->mutex); + + return ret; +} + +static int memsw_dev_release(struct inode *inode, struct file *file) +{ + struct memsw_reader *reader = file->private_data; + struct memsw_dev *memsw_dev = reader->dev; + + mutex_lock(&memsw_dev->mutex); + list_del(&reader->list); + mutex_unlock(&memsw_dev->mutex); + kfree(reader); + + return 0; +} + +static const struct file_operations memsw_dev_fops = { + .owner = THIS_MODULE, + .open = memsw_dev_open, + .read = memsw_dev_read, + .poll = memsw_dev_poll, + .unlocked_ioctl = memsw_dev_ioctl, + .compat_ioctl = memsw_dev_ioctl, + .release = memsw_dev_release, + .llseek = no_llseek, +}; + +static struct memsw_dev memsw_state_dev = { + .memsw_data = { 0 }, + .misc_dev = { + .minor = MISC_DYNAMIC_MINOR, + .name = "xiaomi_memsw_state", + .fops = &memsw_dev_fops, + .parent = NULL, + }, + .wq = __WAIT_QUEUE_HEAD_INITIALIZER(memsw_state_dev.wq), + .reader_list = LIST_HEAD_INIT(memsw_state_dev.reader_list), + .mutex = __MUTEX_INITIALIZER(memsw_state_dev.mutex), +}; + +struct memsw_dev *memsw_dev_get_wo_check(void) +{ + return &memsw_state_dev; +} + +struct memsw_dev *memsw_dev_get_w_check(int minor) +{ + if (memsw_state_dev.misc_dev.minor == minor) + return &memsw_state_dev; + else + return NULL; +} + +static inline int memsw_dev_check_pending(void) +{ + struct memsw_dev *memsw_dev = memsw_dev_get_wo_check(); + + if (memsw_dev_event_pending(memsw_dev)) + wake_up_interruptible(&memsw_dev->wq); + + return 0; +} + +DECLARE_WAIT_QUEUE_HEAD(kmemswchkd_wq); + +static void kmemsw_chkd_try_to_sleep(void) +{ + DEFINE_WAIT(wait); + prepare_to_wait(&kmemswchkd_wq, &wait, TASK_INTERRUPTIBLE); + if (!kthread_should_stop()) + schedule(); + finish_wait(&kmemswchkd_wq, &wait); +} + +static int kmemsw_chkd(void *data) +{ + while (!kthread_should_stop()) { + check_pending_times++; + memsw_dev_check_pending(); + kmemsw_chkd_try_to_sleep(); + } + return -EPERM; +} + +void wakeup_kmemsw_chkd(void) +{ + if (!waitqueue_active(&kmemswchkd_wq)) + return; + wake_up_interruptible(&kmemswchkd_wq); +} +EXPORT_SYMBOL(wakeup_kmemsw_chkd); + +static struct task_struct *kmemswchkd_ktp; +static int __init kmemswchkd_init(void) +{ + int ret = 0; + struct memsw_dev *memsw_dev = memsw_dev_get_wo_check(); + ret = misc_register(&memsw_dev->misc_dev); + if (ret < 0) { + printk(KERN_WARNING "misc register device 'memsw_state' failed: %d", ret); + goto err_out; + } + + if (kmemswchkd_ktp) + return -EPERM; + + + kmemswchkd_ktp = kthread_run(kmemsw_chkd, NULL, "kmemsw_chkd"); + if (IS_ERR(kmemswchkd_ktp)) { + printk(KERN_WARNING"Failed to start kmemswchkd thread.\n"); + kmemswchkd_ktp = NULL; + ret = -1; + } + +err_out: + return ret; +} + +static void __init kmemswchkd_exit(void) +{ + struct memsw_dev *memsw_dev = memsw_dev_get_wo_check(); + misc_deregister(&memsw_dev->misc_dev); + + if (kmemswchkd_ktp != NULL) { + kthread_stop(kmemswchkd_ktp); + kmemswchkd_ktp = NULL; + } +} + +module_param_named(check_times, check_pending_times, uint, S_IRUGO | S_IWUSR); + +module_init(kmemswchkd_init); +module_exit(kmemswchkd_exit); + +MODULE_LICENSE("GPL"); + diff --git a/drivers/staging/android/memsw_state.h b/drivers/staging/android/memsw_state.h new file mode 100644 index 0000000000000..8a24c256282d3 --- /dev/null +++ b/drivers/staging/android/memsw_state.h @@ -0,0 +1,45 @@ +#ifndef _MEMSW_STATE_H +#define _MEMSW_STATE_H + +#include +#include + +struct memsw_state_data { + uint8_t low_mem_triggered; + uint8_t low_swap_triggered; + unsigned long mem_threshold; + unsigned long swap_threshold; + unsigned long current_freeram; + unsigned long current_freeswap; +}; + +struct memsw_dev { + struct memsw_state_data memsw_data; + struct miscdevice misc_dev; + wait_queue_head_t wq; + struct list_head reader_list; + struct mutex mutex; /* protects reader_list */ +}; + +struct memsw_reader { + struct memsw_dev *dev; /* associated device*/ + struct list_head list; /* node in memsw_dev.reader_list*/ + uint8_t auth_rights; + uint8_t version; +}; + +struct memsw_dev *memsw_dev_get_wo_check(void); +struct memsw_dev *memsw_dev_get_w_check(int minor); +void wakeup_kmemsw_chkd(void); + +#define __MEMSWIO 0xAE + +#define GET_MEM_THRESHOLD _IO(__MEMSWIO, 0x11) +#define SET_MEM_THRESHOLD _IO(__MEMSWIO, 0x12) +#define GET_SWAP_THRESHOLD _IO(__MEMSWIO, 0x13) +#define SET_SWAP_THRESHOLD _IO(__MEMSWIO, 0x14) +#define GET_MEMSW_DEV_VERSION _IO(__MEMSWIO, 0x15) +#define SET_MEMSW_DEV_VERSION _IO(__MEMSWIO, 0x16) + +#endif + diff --git a/drivers/staging/android/uapi/binder.h b/drivers/staging/android/uapi/binder.h index dba4cef3a8d35..712314f2e9993 100644 --- a/drivers/staging/android/uapi/binder.h +++ b/drivers/staging/android/uapi/binder.h @@ -32,11 +32,60 @@ enum { BINDER_TYPE_HANDLE = B_PACK_CHARS('s', 'h', '*', B_TYPE_LARGE), BINDER_TYPE_WEAK_HANDLE = B_PACK_CHARS('w', 'h', '*', B_TYPE_LARGE), BINDER_TYPE_FD = B_PACK_CHARS('f', 'd', '*', B_TYPE_LARGE), + BINDER_TYPE_FDA = B_PACK_CHARS('f', 'd', 'a', B_TYPE_LARGE), + BINDER_TYPE_PTR = B_PACK_CHARS('p', 't', '*', B_TYPE_LARGE), }; -enum { +/** + * enum flat_binder_object_shifts: shift values for flat_binder_object_flags + * @FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT: shift for getting scheduler policy. + * + */ +enum flat_binder_object_shifts { + FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT = 9, +}; + +/** + * enum flat_binder_object_flags - flags for use in flat_binder_object.flags + */ +enum flat_binder_object_flags { + /** + * @FLAT_BINDER_FLAG_PRIORITY_MASK: bit-mask for min scheduler priority + * + * These bits can be used to set the minimum scheduler priority + * at which transactions into this node should run. Valid values + * in these bits depend on the scheduler policy encoded in + * @FLAT_BINDER_FLAG_SCHED_POLICY_MASK. + * + * For SCHED_NORMAL/SCHED_BATCH, the valid range is between [-20..19] + * For SCHED_FIFO/SCHED_RR, the value can run between [1..99] + */ FLAT_BINDER_FLAG_PRIORITY_MASK = 0xff, + /** + * @FLAT_BINDER_FLAG_ACCEPTS_FDS: whether the node accepts fds. + */ FLAT_BINDER_FLAG_ACCEPTS_FDS = 0x100, + /** + * @FLAT_BINDER_FLAG_SCHED_POLICY_MASK: bit-mask for scheduling policy + * + * These two bits can be used to set the min scheduling policy at which + * transactions on this node should run. These match the UAPI + * scheduler policy values, eg: + * 00b: SCHED_NORMAL + * 01b: SCHED_FIFO + * 10b: SCHED_RR + * 11b: SCHED_BATCH + */ + FLAT_BINDER_FLAG_SCHED_POLICY_MASK = + 3U << FLAT_BINDER_FLAG_SCHED_POLICY_SHIFT, + + /** + * @FLAT_BINDER_FLAG_INHERIT_RT: whether the node inherits RT policy + * + * Only when set, calls into this node will inherit a real-time + * scheduling policy from the caller (for synchronous transactions). + */ + FLAT_BINDER_FLAG_INHERIT_RT = 0x800, }; #ifdef BINDER_IPC_32BIT @@ -47,6 +96,14 @@ typedef __u64 binder_size_t; typedef __u64 binder_uintptr_t; #endif +/** + * struct binder_object_header - header shared by all binder metadata objects. + * @type: type of the object + */ +struct binder_object_header { + __u32 type; +}; + /* * This is the flattened representation of a Binder object for transfer * between processes. The 'offsets' supplied as part of a binder transaction @@ -55,9 +112,8 @@ typedef __u64 binder_uintptr_t; * between processes. */ struct flat_binder_object { - /* 8 bytes for large_flat_header. */ - __u32 type; - __u32 flags; + struct binder_object_header hdr; + __u32 flags; /* 8 bytes of data. */ union { @@ -69,6 +125,86 @@ struct flat_binder_object { binder_uintptr_t cookie; }; +/** + * struct binder_fd_object - describes a filedescriptor to be fixed up. + * @hdr: common header structure + * @pad_flags: padding to remain compatible with old userspace code + * @pad_binder: padding to remain compatible with old userspace code + * @fd: file descriptor + * @cookie: opaque data, used by user-space + */ +struct binder_fd_object { + struct binder_object_header hdr; + __u32 pad_flags; + union { + binder_uintptr_t pad_binder; + __u32 fd; + }; + + binder_uintptr_t cookie; +}; + +/* struct binder_buffer_object - object describing a userspace buffer + * @hdr: common header structure + * @flags: one or more BINDER_BUFFER_* flags + * @buffer: address of the buffer + * @length: length of the buffer + * @parent: index in offset array pointing to parent buffer + * @parent_offset: offset in @parent pointing to this buffer + * + * A binder_buffer object represents an object that the + * binder kernel driver can copy verbatim to the target + * address space. A buffer itself may be pointed to from + * within another buffer, meaning that the pointer inside + * that other buffer needs to be fixed up as well. This + * can be done by setting the BINDER_BUFFER_FLAG_HAS_PARENT + * flag in @flags, by setting @parent buffer to the index + * in the offset array pointing to the parent binder_buffer_object, + * and by setting @parent_offset to the offset in the parent buffer + * at which the pointer to this buffer is located. + */ +struct binder_buffer_object { + struct binder_object_header hdr; + __u32 flags; + binder_uintptr_t buffer; + binder_size_t length; + binder_size_t parent; + binder_size_t parent_offset; +}; + +enum { + BINDER_BUFFER_FLAG_HAS_PARENT = 0x01, +}; + +/* struct binder_fd_array_object - object describing an array of fds in a buffer + * @hdr: common header structure + * @pad: padding to ensure correct alignment + * @num_fds: number of file descriptors in the buffer + * @parent: index in offset array to buffer holding the fd array + * @parent_offset: start offset of fd array in the buffer + * + * A binder_fd_array object represents an array of file + * descriptors embedded in a binder_buffer_object. It is + * different from a regular binder_buffer_object because it + * describes a list of file descriptors to fix up, not an opaque + * blob of memory, and hence the kernel needs to treat it differently. + * + * An example of how this would be used is with Android's + * native_handle_t object, which is a struct with a list of integers + * and a list of file descriptors. The native_handle_t struct itself + * will be represented by a struct binder_buffer_objct, whereas the + * embedded list of file descriptors is represented by a + * struct binder_fd_array_object with that binder_buffer_object as + * a parent. + */ +struct binder_fd_array_object { + struct binder_object_header hdr; + __u32 pad; + binder_size_t num_fds; + binder_size_t parent; + binder_size_t parent_offset; +}; + /* * On 64-bit platforms where user code may run in 32-bits the driver must * translate the buffer (and local binder) addresses appropriately. @@ -96,6 +232,19 @@ struct binder_version { #define BINDER_CURRENT_PROTOCOL_VERSION 8 #endif +/* + * Use with BINDER_GET_NODE_DEBUG_INFO, driver reads ptr, writes to all fields. + * Set ptr to NULL for the first call to get the info for the first node, and + * then repeat the call passing the previously returned value to get the next + * nodes. ptr will be 0 when there are no more nodes. + */ +struct binder_node_debug_info { + binder_uintptr_t ptr; + binder_uintptr_t cookie; + __u32 has_strong_ref; + __u32 has_weak_ref; +}; + #define BINDER_WRITE_READ _IOWR('b', 1, struct binder_write_read) #define BINDER_SET_IDLE_TIMEOUT _IOW('b', 3, __s64) #define BINDER_SET_MAX_THREADS _IOW('b', 5, __u32) @@ -103,6 +252,7 @@ struct binder_version { #define BINDER_SET_CONTEXT_MGR _IOW('b', 7, __s32) #define BINDER_THREAD_EXIT _IOW('b', 8, __s32) #define BINDER_VERSION _IOWR('b', 9, struct binder_version) +#define BINDER_GET_NODE_DEBUG_INFO _IOWR('b', 11, struct binder_node_debug_info) /* * NOTE: Two special error codes you should check for when calling @@ -161,6 +311,11 @@ struct binder_transaction_data { } data; }; +struct binder_transaction_data_sg { + struct binder_transaction_data transaction_data; + binder_size_t buffers_size; +}; + struct binder_ptr_cookie { binder_uintptr_t ptr; binder_uintptr_t cookie; @@ -345,6 +500,12 @@ enum binder_driver_command_protocol { /* * void *: cookie */ + + BC_TRANSACTION_SG = _IOW('c', 17, struct binder_transaction_data_sg), + BC_REPLY_SG = _IOW('c', 18, struct binder_transaction_data_sg), + /* + * binder_transaction_data_sg: the sent command. + */ }; #endif /* _UAPI_LINUX_BINDER_H */ diff --git a/drivers/staging/ktrace/Kconfig b/drivers/staging/ktrace/Kconfig new file mode 100644 index 0000000000000..9a1cb2f7d7024 --- /dev/null +++ b/drivers/staging/ktrace/Kconfig @@ -0,0 +1,6 @@ +config KTRACE + bool "enable ktrace" + select DEBUG_FS + default y + help + add kernel trace, such as slow path time, direct reclaim time diff --git a/drivers/staging/ktrace/Makefile b/drivers/staging/ktrace/Makefile new file mode 100644 index 0000000000000..29399e8471a0a --- /dev/null +++ b/drivers/staging/ktrace/Makefile @@ -0,0 +1,3 @@ +obj-$(CONFIG_KTRACE) += ktrace_main.o ktrace_mm.o ktrace_print.o \ + ktrace_queue.o ktrace_sched.o ktrace_event.o \ + ktrace_binder.o ktrace_cpufreq.o diff --git a/drivers/staging/ktrace/ktrace_binder.c b/drivers/staging/ktrace/ktrace_binder.c new file mode 100644 index 0000000000000..efc4df119d3f1 --- /dev/null +++ b/drivers/staging/ktrace/ktrace_binder.c @@ -0,0 +1,216 @@ +#define pr_fmt(fmt) "ktrace : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BINDER_ITEMS_READ_MAX DEFAULT_ITEMS_PER_READ + +struct binder_entry { + long long time_stamp_ns; + unsigned char type; + pid_t pid; + unsigned int time_us; +}; + +struct binder_stats { + atomic_t count; + u64 time; /* us */ +}; + +struct ktrace_binder { + struct ktrace_queue *q; + struct dentry *dir; + + void *buf; + int entry_size; + int max; + + unsigned int match_all_pid; + unsigned int filter[KTRACE_BINDER_TYPE_NR]; + struct binder_stats stats[KTRACE_BINDER_TYPE_NR]; +}; + +static struct ktrace_binder __binder = { + .filter = { + [KTRACE_BINDER_TYPE_SAMPLE1] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE2] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE3] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE4] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE5] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE6] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE7] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE8] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE9] = MS_TO_US(1), + [KTRACE_BINDER_TYPE_SAMPLE10] = MS_TO_US(1), + + /* Do not change below values */ + [KTRACE_BINDER_TYPE_TRANSACTION] = MS_TO_US(1), + } +}; + +static const char *const binder_event_name[KTRACE_BINDER_TYPE_NR] = { + "sam_1", + "sam_2", + "sam_3", + "sam_4", + "sam_5", + "sam_6", + "sam_7", + "sam_8", + "sam_9", + "sam_10", + + "transaction", +}; + +void ktrace_add_binder_event(unsigned char type, u64 time_stamp, u64 delta) +{ + struct ktrace_binder *binder = &__binder; + struct ktrace_queue *q = binder->q; + struct binder_entry e; + u64 delta_us = delta >> 10; /* ns => us */ + pid_t pid = current->pid; + + if (unlikely(!binder->buf || type >= KTRACE_BINDER_TYPE_NR)) + return; + + if (likely(delta_us < binder->filter[type])) + return; + + if (!binder->match_all_pid && !ktrace_sched_match_pid(pid)) + return; + + e.time_stamp_ns = time_stamp; + e.type = type; + e.pid = pid; + e.time_us = (unsigned int)delta_us; + + atomic_inc(&binder->stats[type].count); + binder->stats[type].time += delta_us; + + ktrace_tryadd_queue(q, &e); +} + +static int binder_show_entry(struct seq_file *m, void *entry, bool debug) +{ + struct binder_entry *e = (struct binder_entry *)entry; + int ret; + + ret = seq_printf(m, "%lld %5d <%s> %d.%03d ms\n", + e->time_stamp_ns, e->pid, + binder_event_name[e->type], + e->time_us / 1000, e->time_us % 1000); + + return ret; +} + +KTRACE_QUEUE_RO_SINGLE(binder); + +static int binder_stats_show(struct seq_file *m, void *v) +{ + struct ktrace_binder *binder = (struct ktrace_binder *)m->private; + int i; + + seq_puts(m, "statatistics:\n"); + for (i = 0; i < KTRACE_BINDER_TYPE_NR; i++) { + seq_printf(m, " %-32s %6d %llu ms\n", binder_event_name[i], + atomic_read(&binder->stats[i].count), + binder->stats[i].time >> 10); + } + + return 0; +} +KTRACE_ENTRY_RO_SINGLE(binder_stats); + +static int binder_reset_write(void *data, u64 val) +{ + struct ktrace_queue *q = data; + struct ktrace_binder *binder = q->priv; + int clean = val; + int i; + + if (clean) { + ktrace_reset_queue(q); + + for (i = 0; i < KTRACE_BINDER_TYPE_NR; i++) { + atomic_set(&binder->stats[i].count, 0); + binder->stats[i].time = 0; + } + } + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(binder_reset, NULL, binder_reset_write, "%llu\n"); + +int __init ktrace_binder_init(struct dentry *dir, struct ktrace_queue *q) +{ + struct ktrace_binder *binder = &__binder; + void *buf; + int i; + + BUILD_BUG_ON(sizeof(binder_event_name) / sizeof(binder_event_name[0]) + != KTRACE_BINDER_TYPE_NR); + + memset(binder, sizeof(struct ktrace_binder), 0); + + buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!buf) + return -ENOMEM; + binder->q = q; + + binder->entry_size = sizeof(struct binder_entry); + binder->max = (PAGE_SIZE << 1) / binder->entry_size; + + binder->dir = debugfs_create_dir("binder", dir); + + ktrace_init_queue(q, binder->dir, binder, buf, binder->entry_size, binder->max, + BINDER_ITEMS_READ_MAX, + binder_show_entry); + + if (binder->dir) { + debugfs_create_file("trace", + S_IFREG | S_IRUGO, + binder->dir, + q, + &binder_fops); + + debugfs_create_bool("match_all_pids", + S_IFREG | S_IRUGO | S_IWUSR , + binder->dir, + &binder->match_all_pid); + + debugfs_create_file("stats", + S_IFREG | S_IRUGO, + binder->dir, + binder, + &binder_stats_fops); + + for (i = 0; i < KTRACE_BINDER_TYPE_NR; i++) { + char name[32]; + snprintf(name, sizeof(name) - 1, "filter_%s", binder_event_name[i]); + + debugfs_create_u32(name, + S_IFREG | S_IRUGO | S_IWUSR, + binder->dir, + &binder->filter[i]); + } + + debugfs_create_file("reset", S_IWUSR, binder->dir, q, + &binder_reset); + } + + smp_mb(); + binder->buf = buf; + pr_info("binder ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/ktrace/ktrace_cpufreq.c b/drivers/staging/ktrace/ktrace_cpufreq.c new file mode 100644 index 0000000000000..07fe470d809e3 --- /dev/null +++ b/drivers/staging/ktrace/ktrace_cpufreq.c @@ -0,0 +1,316 @@ +#define pr_fmt(fmt) "ktrace : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define PROC_HASH_BITS 10 +DECLARE_HASHTABLE(proc_hash, PROC_HASH_BITS); + +#define CPUFREQ_ITEMS_READ_MAX DEFAULT_ITEMS_PER_READ +#define KTRACE_CPUFREQ_MITIGATED_NR 2 + +struct cpufreq_entry { + s64 time_stamp_ns; + unsigned char type; + pid_t pid; + unsigned int cpu; + unsigned int target_freq; + unsigned int max; +}; + +struct cpufreq_mitigated { + bool ismitigated; + unsigned int cpu; + unsigned int max; + char comm[TASK_COMM_LEN]; +}; + +struct proc_entry { + pid_t pid; + char comm[TASK_COMM_LEN]; + unsigned long long load; + struct hlist_node hash; +}; + +struct ktrace_cpufreq { + struct ktrace_queue *q; + struct dentry *dir; + + void *buf; + int entry_size; + int max; + struct cpufreq_mitigated mitigated[KTRACE_CPUFREQ_MITIGATED_NR]; +}; + +static struct ktrace_cpufreq __cf; + +static const char const *cpufreq_event_name[KTRACE_CPUFREQ_TYPE_NR] = { + "sam_1", + "sam_2", + "sam_3", + "sam_4", + "sam_5", + "sam_6", + "sam_7", + "sam_8", + "sam_9", + "sam_10", + + "mitigation", + "unpluged", +}; + +static int cpufreq_show_entry(struct seq_file *m, void *entry, bool debug) +{ + struct cpufreq_entry *e = (struct cpufreq_entry *)entry; + int ret; + + if (e->type == KTRACE_CPUFREQ_TYPE_MITIGATION) { + if (debug) { + ret = seq_printf(m, "%lld %5d <%s> %d ms %u %u %u\n", + e->time_stamp_ns, e->pid, + cpufreq_event_name[e->type], -1, + e->cpu, e->target_freq, e->max); + } else { + ret = seq_printf(m, "%lld %5d <%s> %d ms %u %u %u\n", + e->time_stamp_ns, e->pid, + cpufreq_event_name[e->type], -1, + e->cpu, e->target_freq, e->max); + } + } else { + ret = seq_printf(m, "%lld %5d <%s> %d ms %u\n", + e->time_stamp_ns, e->pid, + cpufreq_event_name[e->type], -1, + e->cpu); + } + + return ret; +} + +KTRACE_QUEUE_RO_SINGLE(cpufreq); + +void ktrace_add_cpufreq_event(unsigned char type, pid_t pid, u64 time_stamp, + unsigned int cpu, unsigned int target_freq, unsigned int max) +{ + struct ktrace_cpufreq *cpufreq = &__cf; + struct ktrace_queue *q = cpufreq->q; + struct cpufreq_entry e; + + if (unlikely(!cpufreq->buf)) + return; + + if (!ktrace_sched_match_pid(pid)) + return; + + e.time_stamp_ns = time_stamp; + e.type = type; + e.pid = pid; + e.cpu = cpu; + e.target_freq = target_freq; + e.max = max; + + ktrace_tryadd_queue(q, &e); +} + +void ktrace_cpufreq_set_mitigated(char *comm, unsigned int cpu, + const struct cpumask *related_cpus, unsigned int max) +{ + struct ktrace_cpufreq *cpufreq = &__cf; + int i; + + for (i = 0; i < KTRACE_CPUFREQ_MITIGATED_NR; i++) { + struct cpufreq_mitigated *cm = &cpufreq->mitigated[i]; + + if (cm->cpu == -1 || cpumask_test_cpu(cm->cpu, related_cpus) != 0) { + if (max == 0) { + + cm->ismitigated = false; + cm->max = UINT_MAX; + } else if (max < cm->max) { + + + cm->ismitigated = true; + cm->cpu = cpu; + cm->max = max; + memcpy(cm->comm, comm, TASK_COMM_LEN); + } + break; + } + } +} + +static int cpufreq_mitigated_show(struct seq_file *m, void *v) +{ + struct ktrace_cpufreq *cpufreq = (struct ktrace_cpufreq *)m->private; + int i; + + for (i = 0; i < KTRACE_CPUFREQ_MITIGATED_NR; i++) { + struct cpufreq_mitigated *cm = &cpufreq->mitigated[i]; + if (cm->ismitigated) { + seq_printf(m, "%u %u <%s>\n", + cm->cpu, cm->max, cm->comm); + } + } + + return 0; +} + +KTRACE_ENTRY_RO_SINGLE(cpufreq_mitigated); + +static void __init cpufreq_mitigated_init(struct ktrace_cpufreq *cpufreq) +{ + int i; + + for (i = 0; i < KTRACE_CPUFREQ_MITIGATED_NR; i++) { + struct cpufreq_mitigated *cm = &cpufreq->mitigated[i]; + cm->ismitigated = false; + cm->cpu = -1; + cm->max = UINT_MAX; + } +} + +void ktrace_cpufreq_update_history(struct task_struct *p, u32 runtime, int samples, u32 scale_runtime) +{ + u32 load = runtime; + + if (samples) + load += samples * scale_runtime; + + p->ravg.proc_load += load; +} + +static inline struct proc_entry *find_proc_entry(pid_t pid) +{ + struct proc_entry *proc_entry; + hash_for_each_possible(proc_hash, proc_entry, hash, pid) { + if (proc_entry->pid == pid) + return proc_entry; + } + return NULL; +} + +static inline struct proc_entry *find_or_register_proc(pid_t pid, char *comm) +{ + struct proc_entry *proc_entry; + + proc_entry = find_proc_entry(pid); + if (proc_entry) + return proc_entry; + + proc_entry = kzalloc(sizeof(struct proc_entry), GFP_ATOMIC); + if (!proc_entry) + return NULL; + + proc_entry->pid = pid; + memcpy(proc_entry->comm, comm, TASK_COMM_LEN); + proc_entry->load = 0; + + hash_add(proc_hash, &proc_entry->hash, pid); + + return proc_entry; +} + +static int cpufreq_procload_show(struct seq_file *m, void *v) +{ + struct proc_entry *proc_entry; + struct task_struct *task, *temp; + struct hlist_node *tmp; + unsigned long bkt; + + read_lock(&tasklist_lock); + do_each_thread(temp, task) { + proc_entry = find_or_register_proc(task->tgid, task->group_leader->comm); + + if (!proc_entry) { + pr_err("%s: failed to find the proc_entry for pid %d\n", + __func__, task->tgid); + read_unlock(&tasklist_lock); + return -ENOMEM; + } + + proc_entry->load += task->ravg.proc_load; + + } while_each_thread(temp, task); + read_unlock(&tasklist_lock); + + hash_for_each_safe(proc_hash, bkt, tmp, proc_entry, hash) { + if (proc_entry->load > 0) { + seq_printf(m, "%d %s %llu\n", proc_entry->pid, + proc_entry->comm, proc_entry->load); + } + hash_del(&proc_entry->hash); + kfree(proc_entry); + } + + return 0; + +} + +KTRACE_ENTRY_RO_SINGLE(cpufreq_procload); + +int __init ktrace_cpufreq_init(struct dentry *dir, struct ktrace_queue *q) +{ + struct ktrace_cpufreq *cpufreq = &__cf; + void *buf; + + hash_init(proc_hash); + + BUILD_BUG_ON(sizeof(cpufreq_event_name) / sizeof(cpufreq_event_name[0]) + != KTRACE_CPUFREQ_TYPE_NR); + + buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!buf) + return -ENOMEM; + cpufreq->q = q; + + cpufreq->entry_size = sizeof(struct cpufreq_entry); + cpufreq->max = (PAGE_SIZE << 1) / cpufreq->entry_size; + + cpufreq_mitigated_init(cpufreq); + + cpufreq->dir = debugfs_create_dir("cpufreq", dir); + + ktrace_init_queue(q, cpufreq->dir, cpufreq, buf, cpufreq->entry_size, cpufreq->max, + CPUFREQ_ITEMS_READ_MAX, + cpufreq_show_entry); + + if (cpufreq->dir) { + debugfs_create_file("trace", + S_IFREG | S_IRUGO, + cpufreq->dir, + q, + &cpufreq_fops); + + debugfs_create_file("mitigated", + S_IFREG | S_IRUGO, + cpufreq->dir, + cpufreq, + &cpufreq_mitigated_fops); + + debugfs_create_file("procload", + S_IFREG | S_IRUGO, + cpufreq->dir, + cpufreq, + &cpufreq_procload_fops); + } + + smp_mb(); + cpufreq->buf = buf; + + pr_info("cpufreq ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/ktrace/ktrace_event.c b/drivers/staging/ktrace/ktrace_event.c new file mode 100644 index 0000000000000..a1a2f9765ddaf --- /dev/null +++ b/drivers/staging/ktrace/ktrace_event.c @@ -0,0 +1,133 @@ + +#define pr_fmt(fmt) "ktrace : " fmt + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +struct event_entry { + atomic64_t created_count; + atomic64_t deleted_count; +}; + +struct ktrace_event { + struct dentry *dir; + + struct event_entry entry[KTRACE_EVENT_NR]; + +}; + +static const char const *event_str[KTRACE_EVENT_NR] = { + "event-1", + "event-2", + "event-3", + "event-4", + "event-5", + "event-6", + "event-7", + "event-8", + "event-9", + "event-10", + + "event-11", + "event-12", + "event-13", + "event-14", + "event-15", + "event-16", + "event-17", + "event-18", + "event-19", + "event-20", +}; + + +static struct ktrace_event __event; + +void ktrace_event_inc(unsigned char type) +{ + struct ktrace_event *event = &__event; + struct event_entry *ee = &event->entry[type]; + + atomic_long_inc(&ee->created_count); + + return; +} + +void ktrace_event_dec(unsigned char type) +{ + struct ktrace_event *event = &__event; + struct event_entry *ee = &event->entry[type]; + + atomic_long_inc(&ee->deleted_count); + + return; +} + +void ktrace_event_add(unsigned char type, int i) +{ + struct ktrace_event *event = &__event; + struct event_entry *ee = &event->entry[type]; + + atomic_long_add(i, &ee->created_count); + + return; +} + +void ktrace_event_sub(unsigned char type, int i) +{ + struct ktrace_event *event = &__event; + struct event_entry *ee = &event->entry[type]; + + atomic_long_add(i, &ee->deleted_count); + + return; +} + +static int event_stats_show(struct seq_file *m, void *v) +{ + struct ktrace_event *event = m->private; + int i; + + seq_puts(m, "event stats:\n"); + + for (i = 0; i < KTRACE_EVENT_NR; i++) { + long created = atomic_long_read(&event->entry[i].created_count); + long deleted = atomic_long_read(&event->entry[i].deleted_count); + seq_printf(m, " %-20s %ld - %ld = %ld\n", event_str[i], + created, deleted, created - deleted); + } + + return 0; +} + +KTRACE_ENTRY_RO_SINGLE(event_stats); + +int __init ktrace_event_init(struct dentry *dir) +{ + struct ktrace_event *event = &__event; + + memset(event, sizeof(struct ktrace_event), 0); + + event->dir = debugfs_create_dir("event", dir); + + if (event->dir) { + debugfs_create_file("stats", + S_IFREG | S_IRUGO, + event->dir, + event, + &event_stats_fops); + } + + pr_info("event ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/ktrace/ktrace_main.c b/drivers/staging/ktrace/ktrace_main.c new file mode 100644 index 0000000000000..f1296b9e2b79e --- /dev/null +++ b/drivers/staging/ktrace/ktrace_main.c @@ -0,0 +1,52 @@ + +#define pr_fmt(fmt) "ktrace : " fmt + +#include +#include +#include +#include +#include +#include + +static struct ktrace __kt; + +struct ktrace *get_ktrace(void) +{ + return &__kt; +} + +static int __init ktrace_init(void) +{ + struct ktrace *kt = get_ktrace(); + + if (!debugfs_initialized()) { + pr_warn("debugfs not available, stat dir not created\n"); + return -ENOENT; + } + kt->dir = debugfs_create_dir("ktrace", NULL); + if (!kt->dir) { + pr_err("debugfs 'ktrace' stat dir creation failed\n"); + return -ENOMEM ; + } + + ktrace_print_init(kt->dir, &kt->queue[QUEUE_STR]); + + ktrace_event_init(kt->dir); + + ktrace_mm_init(kt->dir, &kt->queue[QUEUE_MM]); + + ktrace_sched_init(kt->dir, &kt->queue[QUEUE_SCHED]); + + ktrace_binder_init(kt->dir, &kt->queue[QUEUE_BINDER]); + + ktrace_cpufreq_init(kt->dir, &kt->queue[QUEUE_CPUFREQ]); + + pr_info("ktrace init OK\n"); + + return 0; +} + +fs_initcall(ktrace_init); + +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_AUTHOR("Cai Liu "); diff --git a/drivers/staging/ktrace/ktrace_mm.c b/drivers/staging/ktrace/ktrace_mm.c new file mode 100644 index 0000000000000..b033ebdac5d1c --- /dev/null +++ b/drivers/staging/ktrace/ktrace_mm.c @@ -0,0 +1,284 @@ + +#define pr_fmt(fmt) "ktrace : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MM_ITEMS_READ_MAX DEFAULT_ITEMS_PER_READ + +struct mm_entry { + long long time_stamp_ns; + unsigned char type; + pid_t pid; + unsigned int time_us; +}; + +struct mm_stats { + atomic_t count; + u64 time; /* us */ +}; + +struct ktrace_mm { + struct ktrace_queue *q; + struct dentry *dir; + + void *buf; + int entry_size; + int max; + + unsigned int match_all_pid; + unsigned int filter[KTRACE_MM_TYPE_NR]; + struct mm_stats stats[KTRACE_MM_TYPE_NR]; +}; + +static struct ktrace_mm __mm = { + .filter = { + [KTRACE_MM_TYPE_SAMPLE1] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE2] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE3] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE4] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE5] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE6] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE7] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE8] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE9] = MS_TO_US(1), + [KTRACE_MM_TYPE_SAMPLE10] = MS_TO_US(1), + + /* Do not change below values */ + [KTRACE_MM_TYPE_SLOW_PATH] = MS_TO_US(1), + [KTRACE_MM_TYPE_COMPACT] = MS_TO_US(1), + [KTRACE_MM_TYPE_DIRECT_RECLAIM] = MS_TO_US(1), + } +}; + +static const char *const mm_event_name[KTRACE_MM_TYPE_NR] = { + "sam_1", + "sam_2", + "sam_3", + "sam_4", + "sam_5", + "sam_6", + "sam_7", + "sam_8", + "sam_9", + "sam_10", + + "slow_path", + "compact", + "direct_reclaim", +}; + +void ktrace_add_mm_event(unsigned char type, u64 time_stamp, u64 delta) +{ + struct ktrace_mm *mm = &__mm; + struct ktrace_queue *q = mm->q; + struct mm_entry e; + u64 delta_us = delta >> 10; /* ns => us */ + pid_t pid = current->pid; + + if (unlikely(!mm->buf || type >= KTRACE_MM_TYPE_NR)) + return; + + if (!mm->match_all_pid && !ktrace_sched_match_pid(pid)) + return; + + if (likely(delta_us < mm->filter[type])) + return; + + e.time_stamp_ns = time_stamp; + e.type = type; + e.pid = pid; + e.time_us = (unsigned int)delta_us; + + atomic_inc(&mm->stats[type].count); + mm->stats[type].time += delta_us; + + ktrace_tryadd_queue(q, &e); +} + +static int mm_show_entry(struct seq_file *m, void *entry, bool debug) +{ + struct mm_entry *e = (struct mm_entry *)entry; + int ret; + + ret = seq_printf(m, "%lld %5d <%s> %d.%03d ms\n", + e->time_stamp_ns, e->pid, + mm_event_name[e->type], + e->time_us / 1000, e->time_us % 1000); + + return ret; + + return 0; +} + +KTRACE_QUEUE_RO_SINGLE(mm); + +static int mm_fragment_show(struct seq_file *m, void *v) +{ + int nid; + unsigned int order; + + /* Flush pending updates to the LRU lists */ + lru_add_drain_all(); + + seq_printf(m, "%-15s ", "fragmentation "); + for (order = 0; order < MAX_ORDER; ++order) + seq_printf(m, "%6d ", order); + seq_putc(m, '\n'); + + for_each_online_node(nid) { + pg_data_t *pgdat = NODE_DATA(nid); + int zoneid; + + if (!node_state(pgdat->node_id, N_MEMORY)) + continue; + + for (zoneid = 0; zoneid < MAX_NR_ZONES; zoneid++) { + struct zone *zone = &pgdat->node_zones[zoneid]; + int fragindex; + unsigned long flags; + + if (!populated_zone(zone)) + continue; + + seq_printf(m, "Node %d, zone %8s ", + pgdat->node_id, zone->name); + + if (!spin_trylock_irqsave(&zone->lock, flags)) + return 0; + + for (order = 0; order < MAX_ORDER; order++) { + fragindex = fragmentation_index(zone, order); + if (fragindex == -1000) { + seq_printf(m, "%6s ", "ok"); + } else { + seq_printf(m, "%6d ", fragindex); + } + } + seq_putc(m, '\n'); + spin_unlock_irqrestore(&zone->lock, flags); + } + } + + return 0; +} + +KTRACE_ENTRY_RO_SINGLE(mm_fragment); + +static int mm_stats_show(struct seq_file *m, void *v) +{ + struct ktrace_mm *mm = (struct ktrace_mm *)m->private; + int i; + + seq_puts(m, "statatistics:\n"); + for (i = 0; i < KTRACE_MM_TYPE_NR; i++) { + seq_printf(m, " %-32s %6d %llu ms\n", mm_event_name[i], + atomic_read(&mm->stats[i].count), + mm->stats[i].time >> 10); + } + + return 0; +} +KTRACE_ENTRY_RO_SINGLE(mm_stats); + +static int mm_reset_write(void *data, u64 val) +{ + struct ktrace_queue *q = data; + struct ktrace_mm *mm = q->priv; + int clean = val; + int i; + + if (clean) { + ktrace_reset_queue(q); + + for (i = 0; i < KTRACE_MM_TYPE_NR; i++) { + atomic_set(&mm->stats[i].count, 0); + mm->stats[i].time = 0; + } + } + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(mm_reset, NULL, mm_reset_write, "%llu\n"); + +int __init ktrace_mm_init(struct dentry *dir, struct ktrace_queue *q) +{ + struct ktrace_mm *mm = &__mm; + void *buf; + int i; + + BUILD_BUG_ON(sizeof(mm_event_name) / sizeof(mm_event_name[0]) + != KTRACE_MM_TYPE_NR); + + memset(mm, sizeof(struct ktrace_mm), 0); + + buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!buf) + return -ENOMEM; + mm->q = q; + + mm->entry_size = sizeof(struct mm_entry); + mm->max = (PAGE_SIZE << 1) / mm->entry_size; + + mm->dir = debugfs_create_dir("mm", dir); + + ktrace_init_queue(q, mm->dir, mm, buf, mm->entry_size, mm->max, + MM_ITEMS_READ_MAX, + mm_show_entry); + + if (mm->dir) { + debugfs_create_file("trace", + S_IFREG | S_IRUGO, + mm->dir, + q, + &mm_fops); + + debugfs_create_bool("match_all_pids", + S_IFREG | S_IRUGO | S_IWUSR , + mm->dir, + &mm->match_all_pid); + + debugfs_create_file("fragmentation", + S_IFREG | S_IRUGO, + mm->dir, + q, + &mm_fragment_fops); + + debugfs_create_file("stats", + S_IFREG | S_IRUGO, + mm->dir, + mm, + &mm_stats_fops); + + for (i = 0; i < KTRACE_MM_TYPE_NR; i++) { + char name[32]; + snprintf(name, sizeof(name) - 1, "filter_%s", mm_event_name[i]); + + debugfs_create_u32(name, + S_IFREG | S_IRUGO | S_IWUSR, + mm->dir, + &mm->filter[i]); + } + + debugfs_create_file("reset", S_IWUSR, mm->dir, q, + &mm_reset); + } + + smp_mb(); + mm->buf = buf; + pr_info("mm ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/ktrace/ktrace_print.c b/drivers/staging/ktrace/ktrace_print.c new file mode 100644 index 0000000000000..3f6d45acf9ab9 --- /dev/null +++ b/drivers/staging/ktrace/ktrace_print.c @@ -0,0 +1,109 @@ + +#define pr_fmt(fmt) "ktrace : " fmt + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define BUF_SIZE 64 + +struct ktrace_print { + struct ktrace_queue *q; + struct dentry *dir; + + void *buf; + int entry_size; + int max; +}; + +static struct ktrace_print __print; + +void ktrace_print(const char *fmt, ...) +{ + struct ktrace_print *kp = &__print; + struct ktrace_queue *q = kp->q; + char buf[BUF_SIZE]; + va_list args; + int cnt; + + if (unlikely(!kp->buf)) + return; + + va_start(args, fmt); + cnt = vsnprintf(buf, BUF_SIZE, fmt, args); + va_end(args); + + ktrace_add_queue_multi(q, buf, cnt); + + return; +} + +static int str_show_entry(struct seq_file *m, void *entry, bool debug) +{ + char *b = (char *)entry; + int ret; + + ret = seq_putc(m, *b); + + return ret; +} + +KTRACE_QUEUE_RO_SINGLE(print); + +static int print_clean_write(void *data, u64 val) +{ + struct ktrace_queue *q = data; + int clean = val; + + if (clean) { + ktrace_reset_queue(q); + } + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(print_clean, NULL, print_clean_write, "%llu\n"); + +int __init ktrace_print_init(struct dentry *dir, struct ktrace_queue *q) +{ + struct ktrace_print *kp = &__print; + void *buf; + + memset(kp, sizeof(struct ktrace_print), 0); + + buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!buf) + return -ENOMEM; + kp->q = q; + + kp->entry_size = 1; + kp->max = (PAGE_SIZE << 1); + kp->dir = debugfs_create_dir("print", dir); + + ktrace_init_queue(q, kp->dir, kp, buf, kp->entry_size, kp->max, + DEFAULT_ITEMS_PER_READ, + str_show_entry); + + if (kp->dir) { + debugfs_create_file("trace", + S_IFREG | S_IRUGO, + kp->dir, + q, + &print_fops); + + debugfs_create_file("clean", S_IWUSR, kp->dir, q, + &print_clean); + } + + smp_mb(); + kp->buf = buf; + pr_info("kp ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/ktrace/ktrace_queue.c b/drivers/staging/ktrace/ktrace_queue.c new file mode 100644 index 0000000000000..504cafae25aae --- /dev/null +++ b/drivers/staging/ktrace/ktrace_queue.c @@ -0,0 +1,238 @@ + +#define pr_fmt(fmt) "ktrace : " fmt + + +#include +#include +#include +#include +#include +#include +#include +#include + + + +#ifdef KTRACE_QUEUE_NOLOCK + +static inline int KTRACE_QUEUE_TRYLOCK(spinlock_t *lock, unsigned long flags) +{ + return 1; +} +static inline void KTRACE_QUEUE_LOCK(spinlock_t *lock, unsigned long flags) {} +static inline void KTRACE_QUEUE_UNLOCK(spinlock_t *lock, unsigned long flags) {} + +#else + +#define KTRACE_QUEUE_TRYLOCK(lock, flags) \ + spin_trylock_irqsave(lock, flags) + +#define KTRACE_QUEUE_LOCK(lock, flags) \ + spin_lock_irqsave(lock, flags) + +#define KTRACE_QUEUE_UNLOCK(lock, flags) \ + spin_unlock_irqrestore(lock, flags) + +#endif + +void *ktrace_q_start(struct seq_file *m, loff_t *pos) +{ + struct ktrace_queue *q = m->private; + unsigned long flags; + void *ret = (void *) 1; + int enable_debug = q->enable_debug; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + if (enable_debug) { + seq_printf(m, "-> queue: tail %d, head %d, max %d\n", + q->tail, q->head, q->max); + } + + q->read_cnt = 0; + + if (QUEUE_EMPTY(q->head, q->tail)) { + ret = NULL; + } + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); + + return ret; +} + +void *ktrace_q_next(struct seq_file *m, void *v, loff_t *pos) +{ + struct ktrace_queue *q = m->private; + unsigned long flags; + void *ret = (void *) 1; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + + q->read_cnt += 1; + + if ((q->read_cnt >= q->items_per_read) || + QUEUE_EMPTY(q->head, q->tail)) { + ret = NULL; + } + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); + + return ret; + +} + +void ktrace_q_stop(struct seq_file *m, void *v) +{ + struct ktrace_queue *q = m->private; + int enable_debug = q->enable_debug; + + if (enable_debug) { + seq_printf(m, " queue: tail %d, head %d, max %d\n", + q->tail, q->head, q->max); + } +} + +int ktrace_q_show(struct seq_file *m, void *v) +{ + struct ktrace_queue *q = m->private; + unsigned long flags; + int enable_debug = q->enable_debug; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + if (QUEUE_EMPTY(q->head, q->tail)) { + goto out; + } + + q->show_entry(m, q->buf + q->tail * q->entry_size, enable_debug); + + q->tail = QUEUE_NEXT(q->tail, q->max); + +out: + KTRACE_QUEUE_UNLOCK(&q->lock, flags); + + return 0; +} + +int ktrace_q_single_show(struct seq_file *m, void *v) +{ + struct ktrace_queue *q = m->private; + unsigned long flags; + int ret; + int enable_debug = q->enable_debug; + int tail; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + if (enable_debug) { + seq_printf(m, "-> queue: tail %d, head %d, max %d\n", + q->tail, q->head, q->max); + } + + tail = q->tail; + while (!QUEUE_EMPTY(q->head, tail)) { + + ret = q->show_entry(m, q->buf + tail * q->entry_size, q->enable_debug); + tail = QUEUE_NEXT(tail, q->max); + + if (ret) + break; + } + + if (!ret) + q->tail = tail; + + if (enable_debug) { + seq_printf(m, " queue: tail %d, head %d, max %d\n", + q->tail, q->head, q->max); + } + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); + + return 0; +} + +void ktrace_tryadd_queue(struct ktrace_queue *q, void *entry) +{ + unsigned long flags; + void *dst; + + if (!KTRACE_QUEUE_TRYLOCK(&q->lock, flags)) + return; + + dst = q->buf + q->head * q->entry_size; + memcpy(dst, entry, q->entry_size); + + if (QUEUE_FULL(q->tail, q->head, q->max)) + q->tail = QUEUE_NEXT(q->tail, q->max); + + q->head = QUEUE_NEXT(q->head, q->max); + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); + +} + +void ktrace_add_queue_multi(struct ktrace_queue *q, void *entry, int num) +{ + unsigned long flags; + void *dst; + int i; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + for (i = 0; i < num; i++) { + dst = q->buf + q->head * q->entry_size; + memcpy(dst, entry + i * q->entry_size, q->entry_size); + + if (QUEUE_FULL(q->tail, q->head, q->max)) + q->tail = QUEUE_NEXT(q->tail, q->max); + + q->head = QUEUE_NEXT(q->head, q->max); + } + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); +} + +void ktrace_reset_queue(struct ktrace_queue *q) +{ + unsigned long flags; + + KTRACE_QUEUE_LOCK(&q->lock, flags); + + q->head = 0; + q->tail = 0; + + KTRACE_QUEUE_UNLOCK(&q->lock, flags); +} + +void __init ktrace_init_queue(struct ktrace_queue *q, struct dentry *dir, + void *priv, void *buf, int entry_size, int max, int items_per_read, + int(*show_entry)(struct seq_file *, void *, bool)) +{ + spin_lock_init(&q->lock); + + q->priv = priv; + q->buf = buf; + q->entry_size = entry_size; + + q->head = 0; + q->tail = 0; + q->max = max; + q->read_cnt = 0; + q->items_per_read = items_per_read; + q->show_entry = show_entry; + + if (dir) { + debugfs_create_bool("queue_debug", + S_IFREG | S_IRUGO | S_IWUSR, + dir, + &q->enable_debug); + debugfs_create_u32("items_per_read", + S_IFREG | S_IRUGO | S_IWUSR, + dir, + &q->items_per_read); + } + + return; +} diff --git a/drivers/staging/ktrace/ktrace_sched.c b/drivers/staging/ktrace/ktrace_sched.c new file mode 100644 index 0000000000000..0b622c85c5efc --- /dev/null +++ b/drivers/staging/ktrace/ktrace_sched.c @@ -0,0 +1,568 @@ +#define pr_fmt(fmt) "ktrace : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MONITOR_PID_NR 5 +#define INVALID_PID -1 + +#define SCHED_ITEMS_READ_MAX DEFAULT_ITEMS_PER_READ + +#define BLOCK_REASON_NR 30 + +#define USE_THREAD_TO_UPDATE_PIDS 0 + +struct sched_entry { + s64 time_stamp_ns; + unsigned char type; + pid_t pid; + unsigned int time_us; + void *pc; +}; + +struct sched_stats { + atomic_t count; + u64 time; /* us */ +}; + +struct sched_block_reason { + void *pc; + int count; + u64 time; /* us */ +}; + +struct ktrace_sched { + struct ktrace_queue *q; + struct dentry *dir; + + void *buf; + int entry_size; + int max; + + int enable_debug; + + struct task_struct *thread; + + unsigned int filter[KTRACE_SCHED_TYPE_NR]; /* us */ + struct sched_stats stats[KTRACE_SCHED_TYPE_NR]; + struct sched_block_reason block_reason[BLOCK_REASON_NR]; + + /* currently do not consider lock here*/ + pid_t pids[MONITOR_PID_NR]; + int pid_nr; + + pid_t new_pids[MONITOR_PID_NR]; + int new_pid_nr; + bool match_all_pid; +}; + +static struct ktrace_sched __ks = { + .filter = { + [KTRACE_SCHED_TYPE_SAMPLE1] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE2] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE3] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE4] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE5] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE6] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE7] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE8] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE9] = MS_TO_US(1), + [KTRACE_SCHED_TYPE_SAMPLE10] = MS_TO_US(1), + + /* Do not change below values */ + [KTRACE_SCHED_TYPE_PREEMPT] = MS_TO_US(2), + [KTRACE_SCHED_TYPE_WAIT] = MS_TO_US(2), + [KTRACE_SCHED_TYPE_BLOCK] = MS_TO_US(2), + } + +}; + +static const char const *sched_event_name[KTRACE_SCHED_TYPE_NR] = { + "sam_1", + "sam_2", + "sam_3", + "sam_4", + "sam_5", + "sam_6", + "sam_7", + "sam_8", + "sam_9", + "sam_10", + + "p", + "w", + "b", +}; + +#define ktrace_sched_debug(enable, x...) \ + do { \ + if (enable) \ + ktrace_print(x); \ + } while (0) + +static int sched_show_entry(struct seq_file *m, void *entry, bool debug) +{ + struct sched_entry *e = (struct sched_entry *)entry; + int ret; + + if (e->pc) { + if (debug) { + ret = seq_printf(m, "%lld %5d <%s> %d.%03d ms %pS\n", + e->time_stamp_ns, e->pid, + sched_event_name[e->type], + e->time_us / 1000, e->time_us % 1000, + e->pc); + } else { + ret = seq_printf(m, "%lld %5d <%s> %d.%03d ms %ps\n", + e->time_stamp_ns, e->pid, + sched_event_name[e->type], + e->time_us / 1000, e->time_us % 1000, + e->pc); + } + } else { + ret = seq_printf(m, "%lld %5d <%s> %d.%03d ms\n", + e->time_stamp_ns, e->pid, + sched_event_name[e->type], + e->time_us / 1000, e->time_us % 1000); + } + + return ret; +} + +KTRACE_QUEUE_RO_SINGLE(sched); + + +static int sched_stats_show(struct seq_file *m, void *v) +{ + struct ktrace_sched *sched = (struct ktrace_sched *)m->private; + int i; + u64 total_block_time = 0; + int total_block_cnt = 0; + + seq_puts(m, "sched stats:\n"); + for (i = 0; i < KTRACE_SCHED_TYPE_NR; i++) { + seq_printf(m, " %-20s %6d %llu ms\n", sched_event_name[i], + atomic_read(&sched->stats[i].count), + sched->stats[i].time / 1000); + } + + seq_puts(m, "\n"); + + seq_puts(m, "Block reason:\n"); + for (i = 0; i < BLOCK_REASON_NR; i++) { + struct sched_block_reason *reason = &sched->block_reason[i]; + + if (!reason->pc) + break; + + total_block_time += reason->time; + total_block_cnt += reason->count; + seq_printf(m, " %2d. %-40pS => %d, total %lld ms, avg %lld.%lld ms\n", + i + 1, reason->pc, reason->count, + reason->time / 1000, (reason->time / reason->count) / 1000, + (reason->time / reason->count) % 1000); + } + seq_printf(m, " total: %d, %lld ms\n", total_block_cnt, total_block_time / 1000); + + return 0; +} +KTRACE_ENTRY_RO_SINGLE(sched_stats); + +static inline int __match_pid(pid_t *pids, int nr, pid_t new_pid) +{ + int i; + int match = 0; + + for (i = 0; i < nr; i++) { + if (pids[i] == INVALID_PID) + break; + + if (pids[i] == new_pid) { + match = 1; + break; + } + } + + return match; +} + +static inline int sched_match_pid(struct ktrace_sched *sched, pid_t pid) +{ + + if (unlikely(sched->match_all_pid)) + return 1; + + return __match_pid(sched->pids, sched->pid_nr, pid); +} + +static void sched_init_pids(struct ktrace_sched *sched) +{ + int i; + + for (i = 0; i < MONITOR_PID_NR; i++) { + sched->pids[i] = INVALID_PID; + sched->new_pids[i] = INVALID_PID; + } + sched->pid_nr = 0; + sched->new_pid_nr = 0; +} + +static void sched_erase_pids(pid_t *pids, int *nr) +{ + int i; + + for (i = 0; i < *nr; i++) { + pids[i] = INVALID_PID; + } + *nr = 0; + + return; +} + +static void sched_update_pids(struct ktrace_sched *sched) +{ + int i; + int n = 0; + + if (sched->enable_debug) { + char buf[64]; + for (i = 0; i < sched->pid_nr; i++) { + if (sched->pids[i] == INVALID_PID) + break; + n += snprintf(buf + n, sizeof(buf) - n - 1, "%d ", sched->pids[i]); + } + + n += snprintf(buf + n, sizeof(buf) - n - 1, "=> "); + + for (i = 0; i < sched->new_pid_nr; i++) { + if (sched->new_pids[i] == INVALID_PID) + break; + n += snprintf(buf + n, sizeof(buf) - n - 1, "%d ", sched->new_pids[i]); + } + + n += snprintf(buf + n, sizeof(buf) - n - 1, "\n"); + + ktrace_sched_debug(sched->enable_debug, buf); + KTRACE_BEGIN(buf); + KTRACE_END(); + } + + sched_erase_pids(sched->pids, &sched->pid_nr); + + for (i = 0; i < sched->new_pid_nr; i++) { + sched->pids[i] = sched->new_pids[i]; + sched->pid_nr++; + } + + sched_erase_pids(sched->new_pids, &sched->new_pid_nr); + +} + +static int sched_switch_pid(struct ktrace_sched *sched) +{ + /* + * Add action here + * such as: sched_set_fifo_scheduler(sched); + */ + + sched_update_pids(sched); + + return 0; +} + +static int sched_pid_show(struct seq_file *m, void *v) +{ + struct ktrace_sched *sched = m->private; + int i; + + if (sched->match_all_pid) { + seq_puts(m, "match all pids\n"); + return 0; + } + + seq_printf(m, "%d pids registered\n", sched->pid_nr); + + for (i = 0; i < sched->pid_nr; i++) { + if (sched->pids[i] == INVALID_PID) + break; + + seq_printf(m, "%d ", sched->pids[i]); + } + seq_putc(m, '\n'); + + return 0; +} + +static int sched_pid_open(struct inode *inode, struct file *file) +{ + int ret; + + ret = single_open(file, sched_pid_show, inode->i_private); + if (!ret) { + /* + struct seq_file *m = file->private_data; + m->private = inode->i_private; // single_open do not need it + */ + } + return ret; +} + +static ssize_t sched_pid_write(struct file *file, const char __user *user_buf, + size_t size, loff_t *ppos) +{ + struct ktrace_sched *sched = ((struct seq_file *)file->private_data)->private; + char buf[64], *tmp; + + char *pid_str; + pid_t pid; + int ret = 0; + + if (size >= sizeof(buf)) + return -EINVAL; + + if (copy_from_user(&buf, user_buf, size)) + return -EFAULT; + + buf[size] = 0; + tmp = buf; + + if (strncmp(buf, "all", strlen("all")) == 0) { + sched->match_all_pid = 1; + return size; + } else if (strncmp(buf, "notall", strlen("notall")) == 0) { + sched->match_all_pid = 0; + return size; + } + + /* Currently do not add lock here, consider later */ + while ((pid_str = strsep(&tmp, ","))) { + ret = kstrtoint(pid_str, 10, &pid); + if (ret < 0) + break; + + if (sched->new_pid_nr >= MONITOR_PID_NR - 1) { + ret = -EINVAL; + break; + } + + sched->new_pids[sched->new_pid_nr++] = pid; + } + + if (!ret) { + if (USE_THREAD_TO_UPDATE_PIDS) + wake_up_process(sched->thread); + else + sched_update_pids(sched); + } else { + sched_erase_pids(sched->new_pids, &sched->new_pid_nr); + } + return ret ? ret : size; +} + +static const struct file_operations sched_pid_fops = { + .owner = THIS_MODULE, + .open = sched_pid_open, + .read = seq_read, + .write = sched_pid_write, + .llseek = seq_lseek, + .release = seq_release, +}; + +static int sched_reset_write(void *data, u64 val) +{ + struct ktrace_queue *q = data; + struct ktrace_sched *sched = q->priv; + int clean = val; + int i; + + if (clean) { + ktrace_reset_queue(q); + + for (i = 0; i < KTRACE_SCHED_TYPE_NR; i++) { + atomic_set(&sched->stats[i].count, 0); + sched->stats[i].time = 0; + } + + for (i = 0; i < BLOCK_REASON_NR; i++) { + struct sched_block_reason *reason = &sched->block_reason[i]; + + reason->count = 0; + reason->pc = NULL; + reason->time = 0; + } + } + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(sched_reset, NULL, sched_reset_write, "%llu\n"); + +static inline void sched_add_block_reason(struct ktrace_sched *sched, void *pc, + unsigned int time) +{ + int i; + + for (i = 0; i < BLOCK_REASON_NR; i++) { + struct sched_block_reason *reason = &sched->block_reason[i]; + if (reason->pc == NULL || reason->pc == pc) { + if (reason->pc == NULL) + reason->pc = pc; + reason->count++; + reason->time += time; + break; + } + } +} + +void ktrace_add_sched_event(unsigned char type, pid_t pid, u64 time_stamp, u64 delta, void *pc) +{ + struct ktrace_sched *sched = &__ks; + struct ktrace_queue *q = sched->q; + struct sched_entry e; + u64 delta_us = delta >> 10; /* ns => us */ + + if (unlikely(!sched->buf)) + return; + + if (pid == 0) + return; + + if (likely(delta_us < sched->filter[type])) + return; + + if (!sched_match_pid(sched, pid)) + return; + + e.time_stamp_ns = time_stamp; + e.type = type; + e.pid = pid; + e.time_us = (unsigned int)delta_us; + e.pc = pc; + + atomic_inc(&sched->stats[type].count); + sched->stats[type].time += delta_us; + + if (type == KTRACE_SCHED_TYPE_BLOCK) + sched_add_block_reason(sched, pc, delta_us); + + ktrace_tryadd_queue(q, &e); +} + +int ktrace_sched_match_pid(pid_t pid) +{ + struct ktrace_sched *sched = &__ks; + + return sched_match_pid(sched, pid); +} + +static int ktrace_sched_thread(void *d) +{ + struct ktrace_sched *sched = (struct ktrace_sched *)d; + struct sched_param param = { + .sched_priority = 1 + }; + + sched_setscheduler(current, SCHED_FIFO, ¶m); + + while (!kthread_should_stop()) { + int ret; + + set_current_state(TASK_INTERRUPTIBLE); + + if (sched->new_pid_nr == 0) + schedule(); + + set_current_state(TASK_RUNNING); + + ret = sched_switch_pid(sched); + } + + return 0; +} + +int __init ktrace_sched_init(struct dentry *dir, struct ktrace_queue *q) +{ + struct ktrace_sched *sched = &__ks; + void *buf; + int i; + + BUILD_BUG_ON(sizeof(sched_event_name) / sizeof(sched_event_name[0]) + != KTRACE_SCHED_TYPE_NR); + + memset(sched, sizeof(struct ktrace_sched), 0); + + if (USE_THREAD_TO_UPDATE_PIDS) { + sched->thread = kthread_run(ktrace_sched_thread, sched, "ktrace-sched"); + if (IS_ERR(sched->thread)) { + return PTR_ERR(sched->thread); + } + } + + buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO, 1); + if (!buf) + return -ENOMEM; + sched->q = q; + + sched->entry_size = sizeof(struct sched_entry); + sched->max = (PAGE_SIZE << 1) / sched->entry_size; + + sched_init_pids(sched); + + sched->dir = debugfs_create_dir("sched", dir); + + ktrace_init_queue(q, sched->dir, sched, buf, sched->entry_size, sched->max, + SCHED_ITEMS_READ_MAX, + sched_show_entry); + + if (sched->dir) { + debugfs_create_file("trace", + S_IFREG | S_IRUGO, + sched->dir, + q, + &sched_fops); + + debugfs_create_file("stats", + S_IFREG | S_IRUGO, + sched->dir, + sched, + &sched_stats_fops); + + for (i = 0; i < KTRACE_SCHED_TYPE_NR; i++) { + char name[32]; + snprintf(name, sizeof(name) - 1, "filter_%s", sched_event_name[i]); + + debugfs_create_u32(name, + S_IFREG | S_IRUGO | S_IWUSR, + sched->dir, + &sched->filter[i]); + } + + debugfs_create_file("pids", S_IRUGO | S_IWUSR, sched->dir, sched, + &sched_pid_fops); + + debugfs_create_bool("sched_debug", + S_IFREG | S_IRUGO | S_IWUSR, + sched->dir, + &sched->enable_debug); + + debugfs_create_file("reset", S_IWUSR, sched->dir, q, + &sched_reset); + } + + smp_mb(); + sched->buf = buf; + + pr_info("sched ktrace init OK\n"); + + return 0; +} diff --git a/drivers/staging/rtmm/Kconfig b/drivers/staging/rtmm/Kconfig new file mode 100644 index 0000000000000..6a66cfd4a2438 --- /dev/null +++ b/drivers/staging/rtmm/Kconfig @@ -0,0 +1,5 @@ +config RTMM + bool "enable runtime mem optimization" + select DEBUG_FS + help + Thie module is created by MIUI to optimize mem performance. diff --git a/drivers/staging/rtmm/Makefile b/drivers/staging/rtmm/Makefile new file mode 100644 index 0000000000000..604ee02d3dfde --- /dev/null +++ b/drivers/staging/rtmm/Makefile @@ -0,0 +1 @@ +obj-$(CONFIG_RTMM) += rtmm_main.o rtmm_pool.o rtmm_reclaim.o diff --git a/drivers/staging/rtmm/rtmm_main.c b/drivers/staging/rtmm/rtmm_main.c new file mode 100644 index 0000000000000..2d076e770d4fb --- /dev/null +++ b/drivers/staging/rtmm/rtmm_main.c @@ -0,0 +1,37 @@ + +#define pr_fmt(fmt) "rtmm : " fmt + +#include +#include +#include +#include +#include +#include + +static int __init rtmm_init(void) +{ + struct dentry *dir; + + if (!debugfs_initialized()) { + pr_warn("debugfs not available, stat dir not created\n"); + return -ENOENT; + } + dir = debugfs_create_dir("rtmm", NULL); + if (!dir) { + pr_err("debugfs 'rtmm' stat dir creation failed\n"); + return -ENOMEM ; + } + + rtmm_pool_init(dir); + + rtmm_reclaim_init(dir); + + pr_info("rtmm init OK\n"); + + return 0; +} + +fs_initcall(rtmm_init); + +MODULE_LICENSE("Dual BSD/GPL"); +MODULE_AUTHOR("Cai Liu "); diff --git a/drivers/staging/rtmm/rtmm_pool.c b/drivers/staging/rtmm/rtmm_pool.c new file mode 100644 index 0000000000000..84348fbae82ad --- /dev/null +++ b/drivers/staging/rtmm/rtmm_pool.c @@ -0,0 +1,402 @@ + +#define pr_fmt(fmt) "rtmm : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define MP_NAME_LEN 12 + +enum { + NR_THREAD_ALLOC_FROM_BUDDY = 0, + NR_ALLOC_FROM_POOL, + NR_ALLOC_FROM_BUDDY, + + NR_FREE_TO_POOL, + NR_FREE_TO_BUDDY, + + NR_THREAD_ALLOC_FAIL, + + NR_WAKEUP_FROM_ALLOC, + NR_WAKEUP_FROM_FREE, + NR_WAKEUP_FROM_SET_MAXNR, + + NR_STAT +}; + +static const char *stat_str[NR_STAT] = { + [NR_THREAD_ALLOC_FROM_BUDDY] = "thread alloc", + [NR_ALLOC_FROM_POOL] = "alloc from pool", + [NR_ALLOC_FROM_BUDDY] = "alloc from buddy", + + [NR_FREE_TO_POOL] = "free to pool", + [NR_FREE_TO_BUDDY] = "free to buddy", + + [NR_THREAD_ALLOC_FAIL] = "thread alloc fail", + + [NR_WAKEUP_FROM_ALLOC] = "wakeup from alloc", + [NR_WAKEUP_FROM_FREE] = "wakeup from free", + [NR_WAKEUP_FROM_SET_MAXNR] = "wakeup from set maxnr", +}; + +struct mpool { + atomic_t init; + gfp_t gfp_mask; + int order; + + atomic_t cur_nr; /* do not need atomic here */ + atomic_t max_nr; + atomic_t low_wm_nr; + + atomic_t stat[NR_STAT]; + + struct list_head list; + spinlock_t lock; + + int pool_type; + struct dentry *dir; + struct rtmm_pool *pool; + + struct page *(*__alloc_pages)(void); + void (*__free_pages)(void *addr); +}; + +struct rtmm_pool { + struct dentry *dir; + + struct mpool mp[RTMM_POOL_NR]; + + struct task_struct *tsk; + wait_queue_head_t waitqueue; +}; + +static struct page *mp_alloc_pages_ti(void); +static void mp_free_pages_ti(void *addr); + +static struct rtmm_pool __pool = { + .mp = { + [RTMM_POOL_THREADINFO] = { + .init = ATOMIC_INIT(0), + .max_nr = ATOMIC_INIT(40), + .__alloc_pages = mp_alloc_pages_ti, + .__free_pages = mp_free_pages_ti, + } + } +}; + +static inline struct rtmm_pool *get_pool(void) +{ + return &__pool; +} + +static inline bool __mp_is_not_full(struct mpool *mp) +{ + return (atomic_read(&mp->cur_nr) < atomic_read(&mp->max_nr)); +} + +static inline bool __mp_is_not_empty(struct mpool *mp) +{ + return (atomic_read(&mp->cur_nr) > 0); +} + +static inline bool __mp_is_below_wm(struct mpool *mp) +{ + return (atomic_read(&mp->cur_nr) < atomic_read(&mp->low_wm_nr)); +} + +static inline bool __pool_thread_running(struct task_struct *tsk) +{ + return (tsk && (tsk->state == TASK_RUNNING)); +} + +static inline void __mp_wakeup(struct mpool *mp, int type) +{ + wake_up(&mp->pool->waitqueue); + + atomic_inc(&mp->stat[type]); +} + +static struct page *mp_alloc_pages(struct mpool *mp) +{ + struct page *page = NULL; + + if (__mp_is_not_empty(mp)) { + spin_lock(&mp->lock); + if (!list_empty(&mp->list)) { + page = list_first_entry(&mp->list, struct page , lru); + list_del(&page->lru); + } + spin_unlock(&mp->lock); + } + + if (page) { + atomic_dec(&mp->cur_nr); + atomic_inc(&mp->stat[NR_ALLOC_FROM_POOL]); + } + + if (__mp_is_below_wm(mp) && !__pool_thread_running(mp->pool->tsk)) + __mp_wakeup(mp, NR_WAKEUP_FROM_ALLOC); + + return page; +} + +static void mp_free_pages(struct mpool *mp, void *addr) +{ + struct page *page = virt_to_page(addr); + + spin_lock(&mp->lock); + list_add(&page->lru, &mp->list); + spin_unlock(&mp->lock); + + atomic_inc(&mp->cur_nr); + atomic_inc(&mp->stat[NR_FREE_TO_POOL]); + + if (__mp_is_below_wm(mp) && !__pool_thread_running(mp->pool->tsk)) + __mp_wakeup(mp, NR_WAKEUP_FROM_FREE); +} + +static struct page *mp_alloc_pages_ti(void) +{ + return alloc_kmem_pages_node(NUMA_NO_NODE, THREADINFO_GFP, + THREAD_SIZE_ORDER); +} + +static void mp_free_pages_ti(void *addr) +{ + /* free to buddy system */ + kasan_alloc_pages(virt_to_page(addr), THREAD_SIZE_ORDER); + free_kmem_pages((unsigned long)addr, THREAD_SIZE_ORDER); +} + + +static int __pool_is_not_full(struct rtmm_pool *pool) +{ + int i; + int not_full = 0; + + for (i = 0; i < RTMM_POOL_NR; i++) { + if (__mp_is_not_full(&pool->mp[i])) { + not_full = 1; + break; + } + } + + return not_full; +} + +struct page *rtmm_alloc_pages(int pool_type) +{ + struct rtmm_pool *pool = get_pool(); + struct mpool *mp = &pool->mp[pool_type]; + struct page *page = NULL; + + if (1 || ktrace_sched_match_pid(current->pid)) + page = mp_alloc_pages(mp); + + if (!page) { + page = mp->__alloc_pages(); + + atomic_inc(&mp->stat[NR_ALLOC_FROM_BUDDY]); + } + + return page; +} + +void rtmm_free_pages(void *addr, int pool_type) +{ + struct rtmm_pool *pool = get_pool(); + struct mpool *mp = &pool->mp[pool_type]; + + if (atomic_read(&mp->init) && __mp_is_not_full(mp)) { + mp_free_pages(mp, addr); + } else { + mp->__free_pages(addr); + atomic_inc(&mp->stat[NR_FREE_TO_BUDDY]); + } +} + +static int mp_thread(void *data) +{ + struct rtmm_pool *pool = data; + struct sched_param param = { .sched_priority = 0 }; + + sched_setscheduler(pool->tsk, SCHED_NORMAL, ¶m); + + while (true) { + int i; + + wait_event_freezable(pool->waitqueue, __pool_is_not_full(pool)); + + for (i = 0; i < RTMM_POOL_NR; i++) { + struct mpool *mp = &pool->mp[i]; + + while (__mp_is_not_full(mp)) { + struct page *page = mp->__alloc_pages(); + + if (!page) { + atomic_inc(&mp->stat[NR_THREAD_ALLOC_FAIL]); + continue; + } + + spin_lock(&mp->lock); + list_add_tail(&page->lru, &mp->list); + spin_unlock(&mp->lock); + + atomic_inc(&mp->cur_nr); + atomic_inc(&mp->stat[NR_THREAD_ALLOC_FROM_BUDDY]); + } + } + } + + return 0; +} + +static int mp_maxnr_read(void *data, u64 *val) +{ + struct mpool *mp = (struct mpool *)data; + + *val = atomic_read(&mp->max_nr); + + return 0; +} + +static int mp_maxnr_write(void *data, u64 val) +{ + struct mpool *mp = (struct mpool *)data; + + int old_nr = atomic_read(&mp->max_nr); + int new_nr = (unsigned int)val; + + atomic_set(&mp->max_nr, val); + + if (old_nr < new_nr) + __mp_wakeup(mp, NR_WAKEUP_FROM_SET_MAXNR); + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(pool_max_nr, mp_maxnr_read, + mp_maxnr_write, "%llu\n"); + +static int mp_stats_show(struct seq_file *s, void *v) +{ + struct mpool *mp = s->private; + int i; + + seq_puts(s, "\n"); + + seq_printf(s, "max %d, low_wm %d, cur %d\n", + atomic_read(&mp->max_nr), + atomic_read(&mp->low_wm_nr), + atomic_read(&mp->cur_nr)); + + seq_puts(s, "----\n"); + + for (i = 0; i < NR_STAT; i++) { + seq_printf(s, " %-25s: %d\n", + stat_str[i], + atomic_read(&mp->stat[i])); + } + + seq_puts(s, "----\n"); + seq_printf(s, " pool hit rate %d%%\n", + 100 * atomic_read(&mp->stat[NR_ALLOC_FROM_POOL]) / + (atomic_read(&mp->stat[NR_ALLOC_FROM_POOL]) + + atomic_read(&mp->stat[NR_ALLOC_FROM_BUDDY]))); + + return 0; +} + +static int mp_stats_open(struct inode *inode, struct file *file) +{ + return single_open(file, mp_stats_show, inode->i_private); +} + +static const struct file_operations mp_stat_ops = { + .open = mp_stats_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, +}; + +static void __init mp_init(struct rtmm_pool *pool) +{ + int i; + + for (i = 0; i < RTMM_POOL_NR; i++) { + struct mpool *mp = &pool->mp[i]; + int j; + + mp->pool = pool; + mp->pool_type = i; + + spin_lock_init(&mp->lock); + INIT_LIST_HEAD(&mp->list); + atomic_set(&mp->cur_nr, 0); + atomic_set(&mp->low_wm_nr, atomic_read(&mp->max_nr) * 3 / 4); + + for (j = 0; j < NR_STAT; j++) + atomic_set(&mp->stat[j], 0); + + if (pool->dir) { + char mp_dir_name[MP_NAME_LEN]; + + snprintf(mp_dir_name , MP_NAME_LEN - 1, "pool-%d", mp->pool_type); + mp->dir = debugfs_create_dir(mp_dir_name, pool->dir); + + if (mp->dir) { + debugfs_create_file("pool_max_nr", S_IRUGO | S_IWUSR, mp->dir, mp, + &pool_max_nr); + + debugfs_create_file("stat", S_IFREG | S_IRUGO, + mp->dir, mp, &mp_stat_ops); + } + } + + atomic_set(&mp->init, 1); + } + +} + +int __init rtmm_pool_init(struct dentry *dir) +{ + struct rtmm_pool *pool = get_pool(); + + memset(pool, sizeof(struct rtmm_pool), 0); + + pool->dir = debugfs_create_dir("pool", dir); + if (!pool->dir) { + pr_err("fail to create debugfs dir\n"); + } + + init_waitqueue_head(&pool->waitqueue); + + mp_init(pool); + pool->tsk = kthread_run(mp_thread, pool, "rtmm_pool"); + if (IS_ERR(pool->tsk)) { + pr_err("%s: creating thread for rtmm pool failed\n", + __func__); + return PTR_ERR_OR_ZERO(pool->tsk); + } + + smp_mb(); + + pr_info("rtmm mp init OK\n"); + + return 0; +} + diff --git a/drivers/staging/rtmm/rtmm_reclaim.c b/drivers/staging/rtmm/rtmm_reclaim.c new file mode 100644 index 0000000000000..fcbc05769156f --- /dev/null +++ b/drivers/staging/rtmm/rtmm_reclaim.c @@ -0,0 +1,609 @@ + +#define pr_fmt(fmt) "rtmm : " fmt + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include + +#define MB_TO_PAGES(m) (((m) << 20) >> PAGE_SHIFT) +#define PAGES_TO_MB(p) (((p) << PAGE_SHIFT) >> 20) + +#define GLOBAL_RECLAIM_MAX_SIZE 200 /* MB */ + +enum reclaim_type { + RECLAIM_NONE = 0, + RECLAIM_KILL, + RECLAIM_PROC, + RECLAIM_GLOBAL, /* global lru*/ +}; + +enum page_type { + RECLAIM_PAGE_NONE = 0, + RECLAIM_PAGE_FILE, + RECLAIM_PAGE_ANON, + RECLAIM_PAGE_ALL, /* anon/file pages */ +}; + +#define CMD_STR_LEN 64 + +struct reclaim_cmd { + /* proc reclaim; global reclaim ; kill */ + int type; + + /* proc reclaim ; kill*/ + pid_t pid; + + int page_type; /* anon/file */ + + /* global reclaim */ + int order; + + int nr_to_reclaim; + + struct list_head list; +}; + +struct rtmm_reclaim { + struct dentry *dir; + + struct task_struct *tsk; + wait_queue_head_t waitqueue; + + spinlock_t lock; + struct list_head cmd_todo; + atomic_t cmd_nr; +}; + +struct rtmm_reclaim __reclaim; + +static inline struct rtmm_reclaim *get_reclaim(void) +{ + return &__reclaim; +} + +/* + * kill a process + */ +static int mem_process_kill(pid_t pid) +{ + struct task_struct *task; + struct signal_struct *sig; + struct mm_struct *mm; + int oom_score_adj; + unsigned long rss = 0; + int ret = 0; + + rcu_read_lock(); + task = find_task_by_vpid(pid); + if (!task) { + ret = -ESRCH; + goto out; + } + mm = task->mm; + sig = task->signal; + if (!mm || !sig) { + ret = -ESRCH; + goto out; + } + + oom_score_adj = sig->oom_score_adj; + if (oom_score_adj < 0) { + pr_warn("KILL: odj %d, exit\n", oom_score_adj); + ret = -EPERM; + goto out; + } + + rss = get_mm_rss(mm); + + pr_info("kill process %d(%s)\n", pid, task->comm); + send_sig(SIGKILL, task, 0); +out: + rcu_read_unlock(); + + return rss; +} + +static struct task_struct *find_get_task_by_pid(pid_t pid) +{ + struct task_struct *p; + + rcu_read_lock(); + p = find_task_by_vpid(pid); + if (p) + get_task_struct(p); + + rcu_read_unlock(); + + return p; +} + +/* + * reclaim anon/file pages of a process + */ +static int mem_process_reclaim(pid_t pid, int type, int nr_to_reclaim) +{ + struct task_struct *task; + struct mm_struct *mm; + struct vm_area_struct *vma; + struct mm_walk reclaim_walk = {}; + struct reclaim_param rp; + int ret = 0; + + task = find_get_task_by_pid(pid); + if (!task) + return -ESRCH; + + mm = get_task_mm(task); + if (!mm) { + ret = -EINVAL; + goto out; + } + + reclaim_walk.mm = mm; + reclaim_walk.pmd_entry = reclaim_pte_range; + + rp.nr_scanned = 0; + rp.nr_to_reclaim = nr_to_reclaim; + rp.nr_reclaimed = 0; + reclaim_walk.private = &rp; + + down_read(&mm->mmap_sem); + + for (vma = mm->mmap; vma; vma = vma->vm_next) { + if (is_vm_hugetlb_page(vma)) + continue; + + if (type == RECLAIM_PAGE_ANON && vma->vm_file) + continue; + + if (type == RECLAIM_PAGE_FILE && !vma->vm_file) + continue; + + rp.vma = vma; + ret = walk_page_range(vma->vm_start, vma->vm_end, + &reclaim_walk); + if (ret) + break; + } + + flush_tlb_mm(mm); + up_read(&mm->mmap_sem); + mmput(mm); + +out: + put_task_struct(task); + + /* -EPIPE is returned in reclaim_pte_range() to break the iteration, + * it is a valid value, so we set the ret as 0 here. + */ + if (ret == -EPIPE) + ret = 0; + + pr_info("process reclaim: pid %d, page_type %d, try to reclaim %d, reclaimed %d(scan %d)\n", + pid, type, nr_to_reclaim, rp.nr_reclaimed, rp.nr_scanned); + + return ret; +} + +static int mem_global_reclaim(unsigned long nr_to_reclaim) +{ +#define RECLAIM_PAGES_PER_LOOP MB_TO_PAGES(1) + + unsigned long nr_reclaimed = 0; + int loop = nr_to_reclaim / RECLAIM_PAGES_PER_LOOP; + int remain = nr_to_reclaim % RECLAIM_PAGES_PER_LOOP; + + /* Currently we only consider loops instead of nr_to_reclaim */ + while (loop--) { + nr_reclaimed += reclaim_global(RECLAIM_PAGES_PER_LOOP); + + if (nr_reclaimed >= nr_to_reclaim) + break; + } + if (remain && (nr_reclaimed < nr_to_reclaim)) + nr_reclaimed += reclaim_global(remain); + + pr_info("global reclaim: try to reclaim %ld, reclaimed %ld\n", + nr_to_reclaim, nr_reclaimed); + + return nr_reclaimed; +} + + +static struct reclaim_cmd *__alloc_reclaim_cmd(void) +{ + struct reclaim_cmd *cmd; + + cmd = kzalloc(sizeof(struct reclaim_cmd), GFP_KERNEL); + if (!cmd) { + pr_err("fail to get an empty slot\n"); + return NULL; + } + cmd->type = RECLAIM_NONE; + INIT_LIST_HEAD(&cmd->list); + + return cmd; +} + +static void __release_reclaim_cmd(struct reclaim_cmd *cmd) +{ + kfree(cmd); +} + +static void __enqueue_reclaim_cmd(struct rtmm_reclaim *reclaim, struct reclaim_cmd *cmd) +{ + spin_lock(&reclaim->lock); + list_add_tail(&cmd->list, &reclaim->cmd_todo); + spin_unlock(&reclaim->lock); + + atomic_inc(&reclaim->cmd_nr); + + wake_up(&reclaim->waitqueue); + + return; +} + +static struct reclaim_cmd *__dequeue_reclaim_cmd(struct rtmm_reclaim *reclaim) +{ + struct reclaim_cmd *cmd = NULL; + + spin_lock(&reclaim->lock); + if (!list_empty(&reclaim->cmd_todo)) { + cmd = list_first_entry(&reclaim->cmd_todo, struct reclaim_cmd, + list); + list_del(&cmd->list); + } + spin_unlock(&reclaim->lock); + + atomic_dec(&reclaim->cmd_nr); + + return cmd; +} + + +static int mem_reclaim_thread(void *data) +{ + struct rtmm_reclaim *reclaim = data; + struct sched_param param = { .sched_priority = 0 }; + + sched_setscheduler(reclaim->tsk, SCHED_NORMAL, ¶m); + + while (true) { + struct reclaim_cmd *cmd; + + wait_event_freezable(reclaim->waitqueue, (atomic_read(&reclaim->cmd_nr) > 0)); + + while (atomic_read(&reclaim->cmd_nr) > 0) { + cmd = __dequeue_reclaim_cmd(reclaim); + if (!cmd) + break; + + switch (cmd->type) { + case RECLAIM_KILL: + mem_process_kill(cmd->pid); + break; + + case RECLAIM_PROC: + mem_process_reclaim(cmd->pid, cmd->page_type, cmd->nr_to_reclaim); + break; + + case RECLAIM_GLOBAL: + mem_global_reclaim(cmd->nr_to_reclaim); + break; + + default: + pr_err("unknow type %d", cmd->type); + break; + } + + __release_reclaim_cmd(cmd); + } + } + + return 0; +} + +static int sys_kill_process(void *data, u64 val) +{ + struct rtmm_reclaim *reclaim = (struct rtmm_reclaim *)data; + struct reclaim_cmd *cmd; + pid_t pid = (pid_t)val; + + cmd = __alloc_reclaim_cmd(); + if (!cmd) { + pr_err("fail to get an empty slot in kill reclaim\n"); + return -ENOMEM; + } + cmd->type = RECLAIM_KILL; + cmd->pid = pid; + + __enqueue_reclaim_cmd(reclaim, cmd); + + return 0; +} +DEFINE_SIMPLE_ATTRIBUTE(kill_ops, NULL, sys_kill_process, "%llu\n"); + +static int sys_proc_reclaim_show(struct seq_file *m, void *v) +{ + return 0; +} + + +static int sys_proc_reclaim_open(struct inode *inode, struct file *file) +{ + int ret; + + ret = single_open(file, sys_proc_reclaim_show, inode->i_private); + if (!ret) { + } + return ret; +} + +static ssize_t sys_proc_reclaim_write(struct file *file, const char __user *user_buf, + size_t size, loff_t *ppos) +{ + struct rtmm_reclaim *reclaim = ((struct seq_file *)file->private_data)->private; + char buf[CMD_STR_LEN]; + int ret; + pid_t pid; + int page_type; + int size_MB; + struct reclaim_cmd *cmd; + + if (size >= sizeof(buf)) + return -EINVAL; + + if (copy_from_user(&buf, user_buf, size)) + return -EFAULT; + + buf[size] = 0; + + ret = sscanf(buf, "%d %d %d", &pid, &page_type, &size_MB); + + if (ret != 3) { + pr_err("param err in proc reclaim cmd(%s)\n", buf); + return -EINVAL; + } + + cmd = __alloc_reclaim_cmd(); + if (!cmd) { + pr_err("fail to get an empty slot in proc reclaim\n"); + return -ENOMEM; + } + cmd->type = RECLAIM_PROC; + cmd->pid = pid; + cmd->page_type = page_type; + cmd->nr_to_reclaim = MB_TO_PAGES(size_MB); + + __enqueue_reclaim_cmd(reclaim, cmd); + + return size; +} + +static const struct file_operations proc_reclaim_fops = { + .owner = THIS_MODULE, + .open = sys_proc_reclaim_open, + .read = seq_read, + .write = sys_proc_reclaim_write, + .llseek = seq_lseek, + .release = seq_release, +}; + +static int sys_global_reclaim_show(struct seq_file *m, void *v) +{ + return 0; +} + +static int sys_global_reclaim_open(struct inode *inode, struct file *file) +{ + int ret; + + ret = single_open(file, sys_global_reclaim_show, inode->i_private); + if (!ret) { + } + return ret; +} + +static ssize_t sys_global_reclaim_write(struct file *file, const char __user *user_buf, + size_t size, loff_t *ppos) +{ + struct rtmm_reclaim *reclaim = ((struct seq_file *)file->private_data)->private; + char buf[CMD_STR_LEN]; + int ret; + int size_MB; + struct reclaim_cmd *cmd; + + if (size >= sizeof(buf)) + return -EINVAL; + + if (copy_from_user(&buf, user_buf, size)) + return -EFAULT; + + buf[size] = 0; + + ret = sscanf(buf, "%d", &size_MB); + + if (ret != 1) { + pr_err("param err in global reclaim cmd(%s)\n", buf); + return -EINVAL; + } + + if (size_MB > GLOBAL_RECLAIM_MAX_SIZE) { + pr_err("global reclaim: size %d MB to big, return\n", size_MB); + return -EINVAL; + } + + cmd = __alloc_reclaim_cmd(); + if (!cmd) { + pr_err("fail to get an empty slot in global reclaim\n"); + return -ENOMEM; + } + cmd->type = RECLAIM_GLOBAL; + cmd->nr_to_reclaim = MB_TO_PAGES(size_MB); + + __enqueue_reclaim_cmd(reclaim, cmd); + + return size; +} + +static const struct file_operations global_reclaim_fops = { + .owner = THIS_MODULE, + .open = sys_global_reclaim_open, + .read = seq_read, + .write = sys_global_reclaim_write, + .llseek = seq_lseek, + .release = seq_release, +}; + + +static int sys_auto_reclaim_show(struct seq_file *m, void *v) +{ + return 0; +} + +static int sys_auto_reclaim_open(struct inode *inode, struct file *file) +{ + int ret; + + ret = single_open(file, sys_auto_reclaim_show, inode->i_private); + if (!ret) { + } + return ret; +} + +static ssize_t sys_auto_reclaim_write(struct file *file, const char __user *user_buf, + size_t size, loff_t *ppos) +{ + struct rtmm_reclaim *reclaim = ((struct seq_file *)file->private_data)->private; + char buf[CMD_STR_LEN]; + int ret; + struct reclaim_cmd *cmd; + int target_free_size; + int cur_free = global_page_state(NR_FREE_PAGES); + int cur_free_size = PAGES_TO_MB(cur_free); + int reclaim_size; + + if (size >= sizeof(buf)) + return -EINVAL; + + if (copy_from_user(&buf, user_buf, size)) + return -EFAULT; + + buf[size] = 0; + + ret = sscanf(buf, "%d", &target_free_size); + + if (ret != 1) { + pr_err("param err in auto reclaim cmd(%s)\n", buf); + return -EINVAL; + } + + if (target_free_size > GLOBAL_RECLAIM_MAX_SIZE) { + pr_err("auto reclaim: size %d MB to big, return\n", target_free_size); + return -EINVAL; + } + + reclaim_size = target_free_size - cur_free_size; + if (reclaim_size <= 0) + return size; + + cmd = __alloc_reclaim_cmd(); + if (!cmd) { + pr_err("fail to get an empty slot in auto reclaim\n"); + return -ENOMEM; + } + cmd->type = RECLAIM_GLOBAL; + cmd->nr_to_reclaim = MB_TO_PAGES(reclaim_size); + + __enqueue_reclaim_cmd(reclaim, cmd); + + return size; +} + +static const struct file_operations auto_reclaim_fops = { + .owner = THIS_MODULE, + .open = sys_auto_reclaim_open, + .read = seq_read, + .write = sys_auto_reclaim_write, + .llseek = seq_lseek, + .release = seq_release, +}; + +static void __init reclaim_init(struct rtmm_reclaim *reclaim) +{ + spin_lock_init(&reclaim->lock); + init_waitqueue_head(&reclaim->waitqueue); + + atomic_set(&reclaim->cmd_nr, 0); + INIT_LIST_HEAD(&reclaim->cmd_todo); + + if (reclaim->dir) { + debugfs_create_file("kill", + S_IFREG | S_IRUGO | S_IWUSR, + reclaim->dir, + reclaim, + &kill_ops); + + debugfs_create_file("proc_reclaim", + S_IFREG | S_IRUGO | S_IWUSR, + reclaim->dir, + reclaim, + &proc_reclaim_fops); + + debugfs_create_file("global_reclaim", + S_IFREG | S_IRUGO | S_IWUSR, + reclaim->dir, + reclaim, + &global_reclaim_fops); + + debugfs_create_file("auto_reclaim", + S_IFREG | S_IRUGO | S_IWUSR, + reclaim->dir, + reclaim, + &auto_reclaim_fops); + } +} + +int __init rtmm_reclaim_init(struct dentry *dir) +{ + struct rtmm_reclaim *reclaim = get_reclaim(); + + memset(reclaim, 0, sizeof(struct rtmm_reclaim)); + + reclaim->dir = debugfs_create_dir("reclaim", dir); + if (!reclaim->dir) { + pr_err("fail to create debugfs dir\n"); + } + + reclaim_init(reclaim); + + reclaim->tsk = kthread_run(mem_reclaim_thread, reclaim, "rtmm_reclaim"); + if (IS_ERR(reclaim->tsk)) { + pr_err("%s: creating thread for rtmm reclaim failed\n", + __func__); + return PTR_ERR_OR_ZERO(reclaim->tsk); + } + + pr_info("rtmm reclaim init OK\n"); + + return 0; +} diff --git a/drivers/thermal/msm-tsens.c b/drivers/thermal/msm-tsens.c index 906a7b3bb2569..525f740a9b62e 100644 --- a/drivers/thermal/msm-tsens.c +++ b/drivers/thermal/msm-tsens.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -87,6 +87,7 @@ #define TSENS_TM_CRITICAL_INT_EN BIT(2) #define TSENS_TM_UPPER_INT_EN BIT(1) #define TSENS_TM_LOWER_INT_EN BIT(0) +#define TSENS_TM_UPPER_LOWER_INT_DISABLE 0xffffffff #define TSENS_TM_UPPER_INT_MASK(n) (((n) & 0xffff0000) >> 16) #define TSENS_TM_LOWER_INT_MASK(n) ((n) & 0xffff) @@ -843,8 +844,8 @@ struct tsens_tm_device { uint32_t tsens_num_sensor; int tsens_irq; int tsens_critical_irq; - void *tsens_addr; - void *tsens_calib_addr; + void __iomem *tsens_addr; + void __iomem *tsens_calib_addr; int tsens_len; int calib_len; struct resource *res_tsens_mem; @@ -981,6 +982,7 @@ static int32_t get_tsens_sensor_for_client_id(struct tsens_tm_device *tmdev, } if (!strcmp(id->compatible, "qcom,msm8996-tsens") || + (!strcmp(id->compatible, "qcom,msm8953-tsens")) || (!strcmp(id->compatible, "qcom,msmcobalt-tsens"))) { while (i < tmdev->tsens_num_sensor && !id_found) { if (tmdev->sensor[i].sensor_client_id == @@ -1108,67 +1110,68 @@ static int tsens_get_sw_id_mapping_for_controller( return 0; } -int tsens_get_hw_id_mapping(int sensor_sw_id, int *sensor_client_id) +int tsens_get_hw_id_mapping(int thermal_sensor_num, int *sensor_client_id) { - int i = 0; - bool id_found = false; struct tsens_tm_device *tmdev = NULL; struct device_node *of_node = NULL; const struct of_device_id *id; + uint32_t tsens_max_sensors = 0, idx = 0, i = 0; - tmdev = get_tsens_controller_for_client_id(sensor_sw_id); - if (tmdev == NULL) { - pr_debug("TSENS early init not done\n"); + if (list_empty(&tsens_device_list)) { + pr_debug("%s: TSENS controller not available\n", __func__); return -EPROBE_DEFER; } - of_node = tmdev->pdev->dev.of_node; - if (of_node == NULL) { - pr_err("Invalid of_node??\n"); + list_for_each_entry(tmdev, &tsens_device_list, list) + tsens_max_sensors += tmdev->tsens_num_sensor; + + if (tsens_max_sensors != thermal_sensor_num) { + pr_err("TSENS total sensors is %d, thermal expects:%d\n", + tsens_max_sensors, thermal_sensor_num); return -EINVAL; } - if (!of_match_node(tsens_match, of_node)) { - pr_err("Need to read SoC specific fuse map\n"); - return -ENODEV; - } + list_for_each_entry(tmdev, &tsens_device_list, list) { + of_node = tmdev->pdev->dev.of_node; + if (of_node == NULL) { + pr_err("Invalid of_node??\n"); + return -EINVAL; + } - id = of_match_node(tsens_match, of_node); - if (id == NULL) { - pr_err("can not find tsens_match of_node\n"); - return -ENODEV; - } + if (!of_match_node(tsens_match, of_node)) { + pr_err("Need to read SoC specific fuse map\n"); + return -ENODEV; + } + + id = of_match_node(tsens_match, of_node); + if (id == NULL) { + pr_err("can not find tsens_match of_node\n"); + return -ENODEV; + } if (!strcmp(id->compatible, "qcom,msm8996-tsens") || + (!strcmp(id->compatible, "qcom,msm8953-tsens")) || (!strcmp(id->compatible, "qcom,msmcobalt-tsens"))) { /* Assign a client id which will be used to get the * controller and hw_sensor details */ - while (i < tmdev->tsens_num_sensor && !id_found) { - if (sensor_sw_id == tmdev->sensor[i].sensor_client_id) { - *sensor_client_id = + for (i = 0; i < tmdev->tsens_num_sensor; i++) { + sensor_client_id[idx] = tmdev->sensor[i].sensor_client_id; - id_found = true; + idx++; } - i++; - } - } else { - /* Assign the corresponding hw sensor number which is done - * prior to support for multiple controllres - */ - while (i < tmdev->tsens_num_sensor && !id_found) { - if (sensor_sw_id == tmdev->sensor[i].sensor_sw_id) { - *sensor_client_id = + } else { + /* Assign the corresponding hw sensor number + * prior to support for multiple controllres + */ + for (i = 0; i < tmdev->tsens_num_sensor; i++) { + sensor_client_id[idx] = tmdev->sensor[i].sensor_hw_num; - id_found = true; + idx++; } - i++; } } - if (!id_found) - return -EINVAL; - return 0; } EXPORT_SYMBOL(tsens_get_hw_id_mapping); @@ -2708,6 +2711,7 @@ static int tsens_hw_init(struct tsens_tm_device *tmdev) { void __iomem *srot_addr; unsigned int srot_val; + void __iomem *int_mask_addr; if (!tmdev) { pr_err("Invalid tsens device\n"); @@ -2721,6 +2725,10 @@ static int tsens_hw_init(struct tsens_tm_device *tmdev) pr_err("TSENS device is not enabled\n"); return -ENODEV; } + int_mask_addr = TSENS_TM_UPPER_LOWER_INT_MASK + (tmdev->tsens_addr); + writel_relaxed(TSENS_TM_UPPER_LOWER_INT_DISABLE, + int_mask_addr); writel_relaxed(TSENS_TM_CRITICAL_INT_EN | TSENS_TM_UPPER_INT_EN | TSENS_TM_LOWER_INT_EN, TSENS_TM_INT_EN(tmdev->tsens_addr)); @@ -5841,6 +5849,11 @@ static int tsens_thermal_zone_register(struct tsens_tm_device *tmdev) const struct of_device_id *id; struct device_node *of_node; + if (tmdev == NULL) { + pr_err("Invalid tsens instance\n"); + return -EINVAL; + } + of_node = tmdev->pdev->dev.of_node; if (of_node == NULL) { pr_err("Invalid of_node??\n"); @@ -5858,11 +5871,6 @@ static int tsens_thermal_zone_register(struct tsens_tm_device *tmdev) return -ENODEV; } - if (tmdev == NULL) { - pr_err("Invalid tsens instance\n"); - return -EINVAL; - } - for (i = 0; i < tmdev->tsens_num_sensor; i++) { char name[18]; if ((!strcmp(id->compatible, "qcom,mdm9640-tsens")) || @@ -5871,7 +5879,7 @@ static int tsens_thermal_zone_register(struct tsens_tm_device *tmdev) tmdev->sensor[i].sensor_hw_num); else snprintf(name, sizeof(name), "tsens_tz_sensor%d", - tsens_sensor_sw_idx); + tmdev->sensor[i].sensor_client_id); tmdev->sensor[i].mode = THERMAL_DEVICE_ENABLED; tmdev->sensor[i].tm = tmdev; @@ -5898,7 +5906,6 @@ static int tsens_thermal_zone_register(struct tsens_tm_device *tmdev) goto fail; } } - tsens_sensor_sw_idx++; } if (tmdev->tsens_type == TSENS_TYPE3) { diff --git a/drivers/thermal/msm_thermal-dev.c b/drivers/thermal/msm_thermal-dev.c index e6af6b884e99c..ead9765666c84 100644 --- a/drivers/thermal/msm_thermal-dev.c +++ b/drivers/thermal/msm_thermal-dev.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -35,6 +35,7 @@ static unsigned int freq_table_len[NR_CPUS], freq_table_set[NR_CPUS]; static unsigned int voltage_table_set[NR_CPUS]; static unsigned int *freq_table_ptr[NR_CPUS]; static uint32_t *voltage_table_ptr[NR_CPUS]; +static DEFINE_MUTEX(ioctl_access_mutex); static int msm_thermal_ioctl_open(struct inode *node, struct file *filep) { @@ -291,8 +292,9 @@ static long msm_thermal_ioctl_process(struct file *filep, unsigned int cmd, ret = validate_and_copy(&cmd, &arg, &query); if (ret) - goto process_exit; + return ret; + mutex_lock(&ioctl_access_mutex); switch (cmd) { case MSM_THERMAL_SET_CPU_MAX_FREQUENCY: ret = msm_thermal_set_frequency(query.cpu_freq.cpu_num, @@ -321,6 +323,7 @@ static long msm_thermal_ioctl_process(struct file *filep, unsigned int cmd, goto process_exit; } process_exit: + mutex_unlock(&ioctl_access_mutex); return ret; } diff --git a/drivers/thermal/msm_thermal.c b/drivers/thermal/msm_thermal.c index b28da9d3e8827..95ca8540500d7 100644 --- a/drivers/thermal/msm_thermal.c +++ b/drivers/thermal/msm_thermal.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -2360,7 +2360,6 @@ static int create_sensor_zone_id_map(void) static int create_sensor_id_map(struct device *dev) { - int i = 0; int ret = 0; tsens_id_map = devm_kzalloc(dev, @@ -2371,19 +2370,10 @@ static int create_sensor_id_map(struct device *dev) return -ENOMEM; } - for (i = 0; i < max_tsens_num; i++) { - ret = tsens_get_hw_id_mapping(i, &tsens_id_map[i]); - /* If return -ENXIO, hw_id is default in sequence */ - if (ret) { - if (ret == -ENXIO) { - tsens_id_map[i] = i; - ret = 0; - } else { - pr_err("Failed to get hw id for id:%d.err:%d\n", - i, ret); - goto fail; - } - } + ret = tsens_get_hw_id_mapping(max_tsens_num, tsens_id_map); + if (ret) { + pr_err("Failed to get tsens id's:%d\n", ret); + goto fail; } return ret; @@ -2822,7 +2812,7 @@ static void __ref do_core_control(long temp) cpu_dev = get_cpu_device(i); trace_thermal_pre_core_offline(i); ret = device_offline(cpu_dev); - if (ret) + if (ret < 0) pr_err("Error %d offline core %d\n", ret, i); trace_thermal_post_core_offline(i, @@ -2895,7 +2885,8 @@ static int __ref update_offline_cores(int val) cpu_dev = get_cpu_device(cpu); trace_thermal_pre_core_offline(cpu); ret = device_offline(cpu_dev); - if (ret) { + if (ret < 0) { + cpus_offlined &= ~BIT(cpu); pr_err_ratelimited( "Unable to offline CPU%d. err:%d\n", cpu, ret); @@ -2965,6 +2956,14 @@ static __ref int do_hotplug(void *data) &hotplug_notify_complete) != 0) ; reinit_completion(&hotplug_notify_complete); + + /* + * Suspend framework will have disabled the + * hotplug functionality. So wait till the suspend exits + * and then re-evaluate. + */ + if (in_suspend) + continue; mask = 0; mutex_lock(&core_control_mutex); diff --git a/drivers/thermal/qpnp-temp-alarm.c b/drivers/thermal/qpnp-temp-alarm.c index 6004fdc0ef550..087122ce9e107 100644 --- a/drivers/thermal/qpnp-temp-alarm.c +++ b/drivers/thermal/qpnp-temp-alarm.c @@ -725,6 +725,19 @@ static int qpnp_tm_remove(struct spmi_device *spmi) return 0; } +static void qpnp_tm_shutdown(struct spmi_device *spmi) +{ + struct qpnp_tm_chip *chip = dev_get_drvdata(&spmi->dev); + int rc; + u8 reg; + + /* configure TEMP_ALARM to follow HW_EN */ + reg = ALARM_CTRL_FOLLOW_HW_ENABLE; + rc = qpnp_tm_write(chip, QPNP_TM_REG_ALARM_CTRL, ®, 1); + if (rc) + pr_err("Failed to cfg. TEMP_ALARM to follow HW_EN rc=%d\n", rc); +} + #ifdef CONFIG_PM static int qpnp_tm_suspend(struct device *dev) { @@ -776,6 +789,7 @@ static struct spmi_driver qpnp_tm_driver = { }, .probe = qpnp_tm_probe, .remove = qpnp_tm_remove, + .shutdown = qpnp_tm_shutdown, .id_table = qpnp_tm_id, }; diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c index 7b64a5fdd916f..4171774925dae 100644 --- a/drivers/tty/n_tty.c +++ b/drivers/tty/n_tty.c @@ -90,6 +90,7 @@ struct n_tty_data { /* producer-published */ size_t read_head; + size_t commit_head; size_t canon_head; size_t echo_head; size_t echo_commit; @@ -165,14 +166,16 @@ static int receive_room(struct tty_struct *tty) { struct n_tty_data *ldata = tty->disc_data; int left; + size_t tail = smp_load_acquire(&ldata->read_tail); + size_t head = ldata->read_head; if (I_PARMRK(tty)) { /* Multiply read_cnt by 3, since each byte might take up to * three times as many spaces when PARMRK is set (depending on * its flags, e.g. parity error). */ - left = N_TTY_BUF_SIZE - read_cnt(ldata) * 3 - 1; + left = N_TTY_BUF_SIZE - (head - tail) * 3 - 1; } else - left = N_TTY_BUF_SIZE - read_cnt(ldata) - 1; + left = N_TTY_BUF_SIZE - (head - tail) - 1; /* * If we are doing input canonicalization, and there are no @@ -181,7 +184,7 @@ static int receive_room(struct tty_struct *tty) * characters will be beeped. */ if (left <= 0) - left = ldata->icanon && ldata->canon_head == ldata->read_tail; + left = ldata->icanon && ldata->canon_head == tail; return left; } @@ -235,7 +238,7 @@ static ssize_t chars_in_buffer(struct tty_struct *tty) ssize_t n = 0; if (!ldata->icanon) - n = read_cnt(ldata); + n = ldata->commit_head - ldata->read_tail; else n = ldata->canon_head - ldata->read_tail; return n; @@ -319,10 +322,6 @@ static void n_tty_check_unthrottle(struct tty_struct *tty) * * n_tty_receive_buf()/producer path: * caller holds non-exclusive termios_rwsem - * modifies read_head - * - * read_head is only considered 'published' if canonical mode is - * not active. */ static inline void put_tty_queue(unsigned char c, struct n_tty_data *ldata) @@ -346,6 +345,7 @@ static void reset_buffer_flags(struct n_tty_data *ldata) { ldata->read_head = ldata->canon_head = ldata->read_tail = 0; ldata->echo_head = ldata->echo_tail = ldata->echo_commit = 0; + ldata->commit_head = 0; ldata->echo_mark = 0; ldata->line_start = 0; @@ -992,10 +992,6 @@ static inline void finish_erasing(struct n_tty_data *ldata) * * n_tty_receive_buf()/producer path: * caller holds non-exclusive termios_rwsem - * modifies read_head - * - * Modifying the read_head is not considered a publish in this context - * because canonical mode is active -- only canon_head publishes */ static void eraser(unsigned char c, struct tty_struct *tty) @@ -1144,7 +1140,6 @@ static void isig(int sig, struct tty_struct *tty) * * n_tty_receive_buf()/producer path: * caller holds non-exclusive termios_rwsem - * publishes read_head via put_tty_queue() * * Note: may get exclusive termios_rwsem if flushing input buffer */ @@ -1214,7 +1209,6 @@ static void n_tty_receive_overrun(struct tty_struct *tty) * * n_tty_receive_buf()/producer path: * caller holds non-exclusive termios_rwsem - * publishes read_head via put_tty_queue() */ static void n_tty_receive_parity_error(struct tty_struct *tty, unsigned char c) { @@ -1268,7 +1262,6 @@ n_tty_receive_signal_char(struct tty_struct *tty, int signal, unsigned char c) * n_tty_receive_buf()/producer path: * caller holds non-exclusive termios_rwsem * publishes canon_head if canonical mode is active - * otherwise, publishes read_head via put_tty_queue() * * Returns 1 if LNEXT was received, else returns 0 */ @@ -1381,7 +1374,7 @@ n_tty_receive_char_special(struct tty_struct *tty, unsigned char c) handle_newline: set_bit(ldata->read_head & (N_TTY_BUF_SIZE - 1), ldata->read_flags); put_tty_queue(c, ldata); - ldata->canon_head = ldata->read_head; + smp_store_release(&ldata->canon_head, ldata->read_head); kill_fasync(&tty->fasync, SIGIO, POLL_IN); wake_up_interruptible_poll(&tty->read_wait, POLLIN); return 0; @@ -1524,16 +1517,14 @@ n_tty_receive_buf_real_raw(struct tty_struct *tty, const unsigned char *cp, size_t n, head; head = ldata->read_head & (N_TTY_BUF_SIZE - 1); - n = N_TTY_BUF_SIZE - max(read_cnt(ldata), head); - n = min_t(size_t, count, n); + n = min_t(size_t, count, N_TTY_BUF_SIZE - head); memcpy(read_buf_addr(ldata, head), cp, n); ldata->read_head += n; cp += n; count -= n; head = ldata->read_head & (N_TTY_BUF_SIZE - 1); - n = N_TTY_BUF_SIZE - max(read_cnt(ldata), head); - n = min_t(size_t, count, n); + n = min_t(size_t, count, N_TTY_BUF_SIZE - head); memcpy(read_buf_addr(ldata, head), cp, n); ldata->read_head += n; } @@ -1663,8 +1654,13 @@ static void __receive_buf(struct tty_struct *tty, const unsigned char *cp, tty->ops->flush_chars(tty); } - if ((!ldata->icanon && (read_cnt(ldata) >= ldata->minimum_to_wake)) || - L_EXTPROC(tty)) { + if (ldata->icanon && !L_EXTPROC(tty)) + return; + + /* publish read_head to consumer */ + smp_store_release(&ldata->commit_head, ldata->read_head); + + if ((read_cnt(ldata) >= ldata->minimum_to_wake) || L_EXTPROC(tty)) { kill_fasync(&tty->fasync, SIGIO, POLL_IN); wake_up_interruptible_poll(&tty->read_wait, POLLIN); } @@ -1821,6 +1817,7 @@ static void n_tty_set_termios(struct tty_struct *tty, struct ktermios *old) ldata->canon_head = ldata->read_head; ldata->push = 1; } + ldata->commit_head = ldata->read_head; ldata->erasing = 0; ldata->lnext = 0; } @@ -1960,7 +1957,7 @@ static inline int input_available_p(struct tty_struct *tty, int poll) if (ldata->icanon && !L_EXTPROC(tty)) return ldata->canon_head != ldata->read_tail; else - return read_cnt(ldata) >= amt; + return ldata->commit_head - ldata->read_tail >= amt; } /** @@ -1992,10 +1989,11 @@ static int copy_from_read_buf(struct tty_struct *tty, int retval; size_t n; bool is_eof; + size_t head = smp_load_acquire(&ldata->commit_head); size_t tail = ldata->read_tail & (N_TTY_BUF_SIZE - 1); retval = 0; - n = min(read_cnt(ldata), N_TTY_BUF_SIZE - tail); + n = min(head - ldata->read_tail, N_TTY_BUF_SIZE - tail); n = min(*nr, n); if (n) { retval = copy_to_user(*b, read_buf_addr(ldata, tail), n); @@ -2003,9 +2001,10 @@ static int copy_from_read_buf(struct tty_struct *tty, is_eof = n == 1 && read_buf(ldata, tail) == EOF_CHAR(tty); tty_audit_add_data(tty, read_buf_addr(ldata, tail), n, ldata->icanon); - ldata->read_tail += n; + smp_store_release(&ldata->read_tail, ldata->read_tail + n); /* Turn single EOF into zero-length read */ - if (L_EXTPROC(tty) && ldata->icanon && is_eof && !read_cnt(ldata)) + if (L_EXTPROC(tty) && ldata->icanon && is_eof && + (head == ldata->read_tail)) n = 0; *b += n; *nr -= n; @@ -2048,7 +2047,7 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, bool eof_push = 0; /* N.B. avoid overrun if nr == 0 */ - n = min(*nr, read_cnt(ldata)); + n = min(*nr, smp_load_acquire(&ldata->canon_head) - ldata->read_tail); if (!n) return 0; @@ -2098,8 +2097,7 @@ static int canon_copy_from_read_buf(struct tty_struct *tty, if (found) clear_bit(eol, ldata->read_flags); - smp_mb__after_atomic(); - ldata->read_tail += c; + smp_store_release(&ldata->read_tail, ldata->read_tail + c); if (found) { if (!ldata->push) diff --git a/drivers/tty/sysrq.c b/drivers/tty/sysrq.c index 42bad18c66c93..2ecb3631bc811 100644 --- a/drivers/tty/sysrq.c +++ b/drivers/tty/sysrq.c @@ -58,10 +58,11 @@ static bool __read_mostly sysrq_always_enabled; unsigned short platform_sysrq_reset_seq[] __weak = { KEY_RESERVED }; int sysrq_reset_downtime_ms __weak; -static bool sysrq_on(void) +bool sysrq_on(void) { return sysrq_enabled || sysrq_always_enabled; } +EXPORT_SYMBOL(sysrq_on); /* * A value of 1 means 'all', other nonzero values are an op mask: @@ -136,6 +137,12 @@ static void sysrq_handle_crash(int key) { char *killer = NULL; + /* we need to release the RCU read lock here, + * otherwise we get an annoying + * 'BUG: sleeping function called from invalid context' + * complaint from the kernel before the panic. + */ + rcu_read_unlock(); panic_on_oops = 1; /* force panic */ wmb(); *killer = 1; diff --git a/drivers/tty/tty_ldisc.c b/drivers/tty/tty_ldisc.c index 2d822aa259b2f..2bf08366cd5b3 100644 --- a/drivers/tty/tty_ldisc.c +++ b/drivers/tty/tty_ldisc.c @@ -414,6 +414,10 @@ EXPORT_SYMBOL_GPL(tty_ldisc_flush); * they are not on hot paths so a little discipline won't do * any harm. * + * The line discipline-related tty_struct fields are reset to + * prevent the ldisc driver from re-using stale information for + * the new ldisc instance. + * * Locking: takes termios_rwsem */ @@ -422,6 +426,9 @@ static void tty_set_termios_ldisc(struct tty_struct *tty, int num) down_write(&tty->termios_rwsem); tty->termios.c_line = num; up_write(&tty->termios_rwsem); + + tty->disc_data = NULL; + tty->receive_room = 0; } /** diff --git a/drivers/uio/msm_sharedmem/sharedmem_qmi.c b/drivers/uio/msm_sharedmem/sharedmem_qmi.c index 48fb17ecdd957..fd95deeb61332 100644 --- a/drivers/uio/msm_sharedmem/sharedmem_qmi.c +++ b/drivers/uio/msm_sharedmem/sharedmem_qmi.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2015, 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 @@ -223,6 +223,7 @@ static int sharedmem_qmi_req_cb(struct qmi_handle *handle, void *conn_h, #define DEBUG_BUF_SIZE (2048) static char *debug_buffer; static u32 debug_data_size; +static struct mutex dbg_buf_lock; /* mutex for debug_buffer */ static ssize_t debug_read(struct file *file, char __user *buf, size_t count, loff_t *file_pos) @@ -279,21 +280,29 @@ static int debug_open(struct inode *inode, struct file *file) { u32 buffer_size; - if (debug_buffer != NULL) + mutex_lock(&dbg_buf_lock); + if (debug_buffer != NULL) { + mutex_unlock(&dbg_buf_lock); return -EBUSY; + } buffer_size = DEBUG_BUF_SIZE; debug_buffer = kzalloc(buffer_size, GFP_KERNEL); - if (debug_buffer == NULL) + if (debug_buffer == NULL) { + mutex_unlock(&dbg_buf_lock); return -ENOMEM; + } debug_data_size = fill_debug_info(debug_buffer, buffer_size); + mutex_unlock(&dbg_buf_lock); return 0; } static int debug_close(struct inode *inode, struct file *file) { + mutex_lock(&dbg_buf_lock); kfree(debug_buffer); debug_buffer = NULL; debug_data_size = 0; + mutex_unlock(&dbg_buf_lock); return 0; } @@ -324,6 +333,7 @@ static void debugfs_init(void) { struct dentry *f_ent; + mutex_init(&dbg_buf_lock); dir_ent = debugfs_create_dir("rmt_storage", NULL); if (IS_ERR(dir_ent)) { pr_err("Failed to create debug_fs directory\n"); @@ -352,6 +362,7 @@ static void debugfs_init(void) static void debugfs_exit(void) { debugfs_remove_recursive(dir_ent); + mutex_destroy(&dbg_buf_lock); } static void sharedmem_qmi_svc_recv_msg(struct work_struct *work) diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index a85eadff6beaf..877578fd58ffb 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c @@ -373,11 +373,11 @@ static void snoop_urb(struct usb_device *udev, if (userurb) { /* Async */ if (when == SUBMIT) - dev_info(&udev->dev, "userurb %p, ep%d %s-%s, " + dev_info(&udev->dev, "userurb %pK, ep%d %s-%s, " "length %u\n", userurb, ep, t, d, length); else - dev_info(&udev->dev, "userurb %p, ep%d %s-%s, " + dev_info(&udev->dev, "userurb %pK, ep%d %s-%s, " "actual_length %u status %d\n", userurb, ep, t, d, length, timeout_or_status); @@ -1202,10 +1202,11 @@ static int proc_getdriver(struct usb_dev_state *ps, void __user *arg) static int proc_connectinfo(struct usb_dev_state *ps, void __user *arg) { - struct usbdevfs_connectinfo ci = { - .devnum = ps->dev->devnum, - .slow = ps->dev->speed == USB_SPEED_LOW - }; + struct usbdevfs_connectinfo ci; + + memset(&ci, 0, sizeof(ci)); + ci.devnum = ps->dev->devnum; + ci.slow = ps->dev->speed == USB_SPEED_LOW; if (copy_to_user(arg, &ci, sizeof(ci))) return -EFAULT; diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 701db5dffae0f..c462e3bb0d2de 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -1643,7 +1643,7 @@ int usb_hcd_unlink_urb (struct urb *urb, int status) if (retval == 0) retval = -EINPROGRESS; else if (retval != -EIDRM && retval != -EBUSY) - dev_dbg(&udev->dev, "hcd_unlink_urb %p fail %d\n", + dev_dbg(&udev->dev, "hcd_unlink_urb %pK fail %d\n", urb, retval); usb_put_dev(udev); } @@ -1812,7 +1812,7 @@ void usb_hcd_flush_endpoint(struct usb_device *udev, /* kick hcd */ unlink1(hcd, urb, -ESHUTDOWN); dev_dbg (hcd->self.controller, - "shutdown urb %p ep%d%s%s\n", + "shutdown urb %pK ep%d%s%s\n", urb, usb_endpoint_num(&ep->desc), is_in ? "in" : "out", ({ char *s; @@ -2154,8 +2154,65 @@ int usb_hcd_get_frame_number (struct usb_device *udev) return hcd->driver->get_frame_number (hcd); } +int usb_hcd_sec_event_ring_setup(struct usb_device *udev, + unsigned intr_num) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!HCD_RH_RUNNING(hcd)) + return 0; + + return hcd->driver->sec_event_ring_setup(hcd, intr_num); +} + +int usb_hcd_sec_event_ring_cleanup(struct usb_device *udev, + unsigned intr_num) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!HCD_RH_RUNNING(hcd)) + return 0; + + return hcd->driver->sec_event_ring_cleanup(hcd, intr_num); +} + /*-------------------------------------------------------------------------*/ +dma_addr_t +usb_hcd_get_sec_event_ring_dma_addr(struct usb_device *udev, + unsigned intr_num) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!HCD_RH_RUNNING(hcd)) + return 0; + + return hcd->driver->get_sec_event_ring_dma_addr(hcd, intr_num); +} + +dma_addr_t +usb_hcd_get_dcba_dma_addr(struct usb_device *udev) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!HCD_RH_RUNNING(hcd)) + return 0; + + return hcd->driver->get_dcba_dma_addr(hcd, udev); +} + +dma_addr_t +usb_hcd_get_xfer_ring_dma_addr(struct usb_device *udev, + struct usb_host_endpoint *ep) +{ + struct usb_hcd *hcd = bus_to_hcd(udev->bus); + + if (!HCD_RH_RUNNING(hcd)) + return 0; + + return hcd->driver->get_xfer_ring_dma_addr(hcd, udev, ep); +} + #ifdef CONFIG_PM int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg) @@ -2869,6 +2926,9 @@ void usb_remove_hcd(struct usb_hcd *hcd) cancel_work_sync(&hcd->wakeup_work); #endif + /* handle any pending hub events before XHCI stops */ + usb_flush_hub_wq(); + mutex_lock(&usb_bus_list_lock); usb_disconnect(&rhdev); /* Sets rhdev to NULL */ mutex_unlock(&usb_bus_list_lock); diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index ab53405bac00a..5e2ea5997677e 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c @@ -48,6 +48,11 @@ static void hub_event(struct work_struct *work); /* synchronize hub-port add/remove and peering operations */ DEFINE_MUTEX(usb_port_peer_mutex); +static bool skip_extended_resume_delay = 1; +module_param(skip_extended_resume_delay, bool, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(skip_extended_resume_delay, + "removes extra delay added to finish bus resume"); + /* cycle leds on hubs that aren't blinking for attention */ static bool blinkenlights = 0; module_param (blinkenlights, bool, S_IRUGO); @@ -606,6 +611,12 @@ void usb_kick_hub_wq(struct usb_device *hdev) kick_hub_wq(hub); } +void usb_flush_hub_wq(void) +{ + flush_workqueue(hub_wq); +} +EXPORT_SYMBOL(usb_flush_hub_wq); + /* * Let the USB core know that a USB 3.0 device has sent a Function Wake Device * Notification, which indicates it had initiated remote wakeup. @@ -3397,7 +3408,9 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) /* drive resume for USB_RESUME_TIMEOUT msec */ dev_dbg(&udev->dev, "usb %sresume\n", (PMSG_IS_AUTO(msg) ? "auto-" : "")); - msleep(USB_RESUME_TIMEOUT); + if (!skip_extended_resume_delay) + usleep_range(USB_RESUME_TIMEOUT * 1000, + (USB_RESUME_TIMEOUT + 1) * 1000); /* Virtual root hubs can trigger on GET_PORT_STATUS to * stop resume signaling. Then finish the resume @@ -3406,7 +3419,7 @@ int usb_port_resume(struct usb_device *udev, pm_message_t msg) status = hub_port_status(hub, port1, &portstatus, &portchange); /* TRSMRCY = 10 msec */ - msleep(10); + usleep_range(10000, 10500); } SuspendCleared: diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c index c9e8ee81b6b74..188819aedb43f 100644 --- a/drivers/usb/core/urb.c +++ b/drivers/usb/core/urb.c @@ -336,7 +336,7 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags) if (!urb || !urb->complete) return -EINVAL; if (urb->hcpriv) { - WARN_ONCE(1, "URB %p submitted while active\n", urb); + WARN_ONCE(1, "URB %pK submitted while active\n", urb); return -EBUSY; } diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index 29ee9363faa51..aae67e0e94db5 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c @@ -655,6 +655,54 @@ int usb_get_current_frame_number(struct usb_device *dev) } EXPORT_SYMBOL_GPL(usb_get_current_frame_number); +int usb_sec_event_ring_setup(struct usb_device *dev, + unsigned intr_num) +{ + if (dev->state == USB_STATE_NOTATTACHED) + return 0; + + return usb_hcd_sec_event_ring_setup(dev, intr_num); +} +EXPORT_SYMBOL(usb_sec_event_ring_setup); + +int usb_sec_event_ring_cleanup(struct usb_device *dev, + unsigned intr_num) +{ + return usb_hcd_sec_event_ring_cleanup(dev, intr_num); +} +EXPORT_SYMBOL(usb_sec_event_ring_cleanup); + +dma_addr_t +usb_get_sec_event_ring_dma_addr(struct usb_device *dev, + unsigned intr_num) +{ + if (dev->state == USB_STATE_NOTATTACHED) + return 0; + + return usb_hcd_get_sec_event_ring_dma_addr(dev, intr_num); +} +EXPORT_SYMBOL(usb_get_sec_event_ring_dma_addr); + +dma_addr_t +usb_get_dcba_dma_addr(struct usb_device *dev) +{ + if (dev->state == USB_STATE_NOTATTACHED) + return 0; + + return usb_hcd_get_dcba_dma_addr(dev); +} +EXPORT_SYMBOL(usb_get_dcba_dma_addr); + +dma_addr_t usb_get_xfer_ring_dma_addr(struct usb_device *dev, + struct usb_host_endpoint *ep) +{ + if (dev->state == USB_STATE_NOTATTACHED) + return 0; + + return usb_hcd_get_xfer_ring_dma_addr(dev, ep); +} +EXPORT_SYMBOL(usb_get_xfer_ring_dma_addr); + /*-------------------------------------------------------------------*/ /* * __usb_get_extra_descriptor() finds a descriptor of specific type in the diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 98bf050660ae7..c62a79d3eb074 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c @@ -274,7 +274,7 @@ int dwc3_event_buffers_setup(struct dwc3 *dwc) for (n = 0; n < dwc->num_event_buffers; n++) { evt = dwc->ev_buffs[n]; - dev_dbg(dwc->dev, "Event buf %p dma %08llx length %d\n", + dev_dbg(dwc->dev, "Event buf %pK dma %08llx length %d\n", evt->buf, (unsigned long long) evt->dma, evt->length); diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h index 36073f29088ae..b098801f566a5 100644 --- a/drivers/usb/dwc3/core.h +++ b/drivers/usb/dwc3/core.h @@ -947,7 +947,6 @@ struct dwc3 { unsigned pullups_connected:1; unsigned resize_fifos:1; unsigned setup_packet_pending:1; - unsigned start_config_issued:1; unsigned three_stage_setup:1; unsigned is_drd:1; @@ -975,6 +974,7 @@ struct dwc3 { int irq; struct tasklet_struct bh; unsigned long irq_cnt; + unsigned long ep_cmd_timeout_cnt; unsigned bh_completion_time[MAX_INTR_STATS]; unsigned bh_handled_evt_cnt[MAX_INTR_STATS]; unsigned bh_dbg_index; diff --git a/drivers/usb/dwc3/debugfs.c b/drivers/usb/dwc3/debugfs.c index 76ad2bc464d02..b8a161d61625c 100644 --- a/drivers/usb/dwc3/debugfs.c +++ b/drivers/usb/dwc3/debugfs.c @@ -402,7 +402,7 @@ static ssize_t dwc3_mode_write(struct file *file, struct dwc3 *dwc = s->private; unsigned long flags; u32 mode = 0; - char buf[32]; + char buf[32] = {0}; if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) return -EFAULT; @@ -482,7 +482,7 @@ static ssize_t dwc3_testmode_write(struct file *file, struct dwc3 *dwc = s->private; unsigned long flags; u32 testmode = 0; - char buf[32]; + char buf[32] = {0}; if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) return -EFAULT; @@ -589,7 +589,7 @@ static ssize_t dwc3_link_state_write(struct file *file, struct dwc3 *dwc = s->private; unsigned long flags; enum dwc3_link_state state = 0; - char buf[32]; + char buf[32] = {0}; if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count))) return -EFAULT; @@ -630,12 +630,10 @@ static ssize_t dwc3_store_ep_num(struct file *file, const char __user *ubuf, { struct seq_file *s = file->private_data; struct dwc3 *dwc = s->private; - char kbuf[10]; + char kbuf[10] = {0}; unsigned int num, dir, temp; unsigned long flags; - memset(kbuf, 0, 10); - if (copy_from_user(kbuf, ubuf, count > 10 ? 10 : count)) return -EFAULT; @@ -673,7 +671,7 @@ static int dwc3_ep_req_list_show(struct seq_file *s, void *unused) req = list_entry(ptr, struct dwc3_request, list); seq_printf(s, - "req:0x%p len: %d sts: %d dma:0x%pa num_sgs: %d\n", + "req:0x%pK len: %d sts: %d dma:0x%pKa num_sgs: %d\n", req, req->request.length, req->request.status, &req->request.dma, req->request.num_sgs); } @@ -712,7 +710,7 @@ static int dwc3_ep_queued_req_show(struct seq_file *s, void *unused) req = list_entry(ptr, struct dwc3_request, list); seq_printf(s, - "req:0x%p len:%d sts:%d dma:%pa nsg:%d trb:0x%p\n", + "req:0x%pK len:%d sts:%d dma:%pKa nsg:%d trb:0x%pK\n", req, req->request.length, req->request.status, &req->request.dma, req->request.num_sgs, req->trb); } @@ -756,7 +754,7 @@ static int dwc3_ep_trbs_show(struct seq_file *s, void *unused) dep->name, dep->flags, dep->free_slot, dep->busy_slot); for (j = 0; j < DWC3_TRB_NUM; j++) { trb = &dep->trb_pool[j]; - seq_printf(s, "trb:0x%p bph:0x%x bpl:0x%x size:0x%x ctrl: %x\n", + seq_printf(s, "trb:0x%pK bph:0x%x bpl:0x%x size:0x%x ctrl: %x\n", trb, trb->bph, trb->bpl, trb->size, trb->ctrl); } spin_unlock_irqrestore(&dwc->lock, flags); @@ -897,21 +895,30 @@ void dwc3_dbg_print_reg(struct dwc3 *dwc, const char *name, int reg) static ssize_t dwc3_store_int_events(struct file *file, const char __user *ubuf, size_t count, loff_t *ppos) { - int clear_stats, i; + int i, ret; unsigned long flags; struct seq_file *s = file->private_data; struct dwc3 *dwc = s->private; struct dwc3_ep *dep; struct timespec ts; + u8 clear_stats; if (ubuf == NULL) { pr_err("[%s] EINVAL\n", __func__); - goto done; + ret = -EINVAL; + return ret; + } + + ret = kstrtou8_from_user(ubuf, count, 0, &clear_stats); + if (ret < 0) { + pr_err("can't get enter value.\n"); + return ret; } - if (sscanf(ubuf, "%u", &clear_stats) != 1 || clear_stats != 0) { + if (clear_stats != 0) { pr_err("Wrong value. To clear stats, enter value as 0.\n"); - goto done; + ret = -EINVAL; + return ret; } spin_lock_irqsave(&dwc->lock, flags); @@ -928,7 +935,6 @@ static ssize_t dwc3_store_int_events(struct file *file, spin_unlock_irqrestore(&dwc->lock, flags); -done: return count; } @@ -1068,26 +1074,23 @@ int dwc3_debugfs_init(struct dwc3 *dwc) { struct dentry *root; struct dentry *file; - int ret; if (count >= DWC_CTRL_COUNT) { dev_err(dwc->dev, "Err dwc instance %d >= %d available\n", count, DWC_CTRL_COUNT); - ret = -EINVAL; - return ret; + return -EINVAL; } root = debugfs_create_dir(dev_name(dwc->dev), NULL); if (!root) { - ret = -ENOMEM; - goto err0; + dev_err(dwc->dev, "Can't create debugfs root\n"); + return -ENOMEM; } dwc->root = root; dwc->regset = kzalloc(sizeof(*dwc->regset), GFP_KERNEL); if (!dwc->regset) { - ret = -ENOMEM; goto err1; } @@ -1097,7 +1100,7 @@ int dwc3_debugfs_init(struct dwc3 *dwc) file = debugfs_create_regset32("regdump", S_IRUGO, root, dwc->regset); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs regdump\n"); goto err1; } @@ -1105,7 +1108,7 @@ int dwc3_debugfs_init(struct dwc3 *dwc) file = debugfs_create_file("mode", S_IRUGO | S_IWUSR, root, dwc, &dwc3_mode_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs mode\n"); goto err1; } } @@ -1115,14 +1118,14 @@ int dwc3_debugfs_init(struct dwc3 *dwc) file = debugfs_create_file("testmode", S_IRUGO | S_IWUSR, root, dwc, &dwc3_testmode_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs testmode\n"); goto err1; } file = debugfs_create_file("link_state", S_IRUGO | S_IWUSR, root, dwc, &dwc3_link_state_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs linkstate\n"); goto err1; } } @@ -1130,28 +1133,28 @@ int dwc3_debugfs_init(struct dwc3 *dwc) file = debugfs_create_file("trbs", S_IRUGO | S_IWUSR, root, dwc, &dwc3_ep_trb_list_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs trbs\n"); goto err1; } file = debugfs_create_file("requests", S_IRUGO | S_IWUSR, root, dwc, &dwc3_ep_req_list_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs requests\n"); goto err1; } file = debugfs_create_file("queued_reqs", S_IRUGO | S_IWUSR, root, dwc, &dwc3_ep_req_queued_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs queued_reqs\n"); goto err1; } file = debugfs_create_file("int_events", S_IRUGO | S_IWUSR, root, dwc, &dwc3_gadget_dbg_events_fops); if (!file) { - ret = -ENOMEM; + dev_dbg(dwc->dev, "Can't create debugfs int_events\n"); goto err1; } @@ -1170,9 +1173,7 @@ int dwc3_debugfs_init(struct dwc3 *dwc) kfree(dwc->regset); dwc->regset = NULL; debugfs_remove_recursive(root); - -err0: - return ret; + return -ENOMEM; } void dwc3_debugfs_exit(struct dwc3 *dwc) diff --git a/drivers/usb/dwc3/dwc3-msm.c b/drivers/usb/dwc3/dwc3-msm.c index 32b0e90040bda..bd30104d3b0e9 100644 --- a/drivers/usb/dwc3/dwc3-msm.c +++ b/drivers/usb/dwc3/dwc3-msm.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -45,6 +46,8 @@ #include #include +#include + #include "power.h" #include "core.h" #include "gadget.h" @@ -52,8 +55,13 @@ #include "debug.h" #include "xhci.h" +#if defined(CONFIG_D1_ROSY) +#define DWC3_IDEV_CHG_MAX 2000 +#else #define DWC3_IDEV_CHG_MAX 1500 +#endif #define DWC3_HVDCP_CHG_MAX 1800 +#define DWC3_PROPRIETARY_CHG_MAX 1000 /* AHB2PHY register offsets */ #define PERIPH_SS_AHB2PHY_TOP_CFG 0x10 @@ -97,6 +105,8 @@ MODULE_PARM_DESC(dcp_max_current, "max current drawn for DCP charger"); #define CGCTL_REG (QSCRATCH_REG_OFFSET + 0x28) #define PWR_EVNT_IRQ_STAT_REG (QSCRATCH_REG_OFFSET + 0x58) #define PWR_EVNT_IRQ_MASK_REG (QSCRATCH_REG_OFFSET + 0x5C) +#define QSCRATCH_USB30_STS_REG (QSCRATCH_REG_OFFSET + 0xF8) + #define PWR_EVNT_POWERDOWN_IN_P3_MASK BIT(2) #define PWR_EVNT_POWERDOWN_OUT_P3_MASK BIT(3) @@ -186,6 +196,7 @@ struct dwc3_msm { struct regulator *dwc3_gdsc; struct usb_phy *hs_phy, *ss_phy; + struct qpnp_vadc_chip *vadc_dev; struct dbm *dbm; @@ -235,11 +246,14 @@ struct dwc3_msm { struct notifier_block dwc3_cpu_notifier; struct notifier_block usbdev_nb; bool hc_died; + bool host_only_mode; int pwr_event_irq; atomic_t in_p3; unsigned int lpm_to_suspend_delay; bool init; + + int wt_check_times; }; #define USB_HSPHY_3P3_VOL_MIN 3050000 /* uV */ @@ -668,7 +682,7 @@ static int dwc3_msm_ep_queue(struct usb_ep *ep, spin_lock_irqsave(&dwc->lock, flags); if (!dep->endpoint.desc) { dev_err(mdwc->dev, - "%s: trying to queue request %p to disabled ep %s\n", + "%s: trying to queue request %pK to disabled ep %s\n", __func__, request, ep->name); spin_unlock_irqrestore(&dwc->lock, flags); return -EPERM; @@ -705,7 +719,7 @@ static int dwc3_msm_ep_queue(struct usb_ep *ep, if (dep->number == 0 || dep->number == 1) { dev_err(mdwc->dev, - "%s: trying to queue dbm request %p to control ep %s\n", + "%s: trying to queue dbm request %pK to control ep %s\n", __func__, request, ep->name); spin_unlock_irqrestore(&dwc->lock, flags); return -EPERM; @@ -714,7 +728,7 @@ static int dwc3_msm_ep_queue(struct usb_ep *ep, if (dep->busy_slot != dep->free_slot || !list_empty(&dep->request_list) || !list_empty(&dep->req_queued)) { dev_err(mdwc->dev, - "%s: trying to queue dbm request %p tp ep %s\n", + "%s: trying to queue dbm request %pK tp ep %s\n", __func__, request, ep->name); spin_unlock_irqrestore(&dwc->lock, flags); return -EPERM; @@ -737,7 +751,7 @@ static int dwc3_msm_ep_queue(struct usb_ep *ep, list_add_tail(&req_complete->list_item, &mdwc->req_complete_list); request->complete = dwc3_msm_req_complete_func; - dev_vdbg(dwc->dev, "%s: queing request %p to ep %s length %d\n", + dev_vdbg(dwc->dev, "%s: queing request %pK to ep %s length %d\n", __func__, request, ep->name, request->length); size = dwc3_msm_read_reg(mdwc->base, DWC3_GEVNTSIZ(0)); dbm_event_buffer_config(mdwc->dbm, @@ -923,7 +937,7 @@ static void gsi_ring_in_db(struct usb_ep *ep, struct usb_gsi_request *request) dev_dbg(mdwc->dev, "Failed to get GSI DBL address MSB\n"); offset = dwc3_trb_dma_offset(dep, &dep->trb_pool[num_trbs-1]); - dev_dbg(mdwc->dev, "Writing link TRB addr: %pa to %p (%x)\n", + dev_dbg(mdwc->dev, "Writing link TRB addr: %pKa to %pK (%x)\n", &offset, gsi_dbl_address_lsb, dbl_lo_addr); writel_relaxed(offset, gsi_dbl_address_lsb); @@ -1797,7 +1811,7 @@ static void dwc3_msm_notify_event(struct dwc3 *dwc, unsigned event, break; case DWC3_CONTROLLER_RESTART_USB_SESSION: dev_dbg(mdwc->dev, "DWC3_CONTROLLER_RESTART_USB_SESSION received\n"); - dwc3_restart_usb_work(&mdwc->restart_usb_work); + schedule_work(&mdwc->restart_usb_work); break; case DWC3_CONTROLLER_NOTIFY_DISABLE_UPDXFER: dwc3_msm_dbm_disable_updxfer(dwc, value); @@ -1879,10 +1893,11 @@ static int dwc3_msm_prepare_suspend(struct dwc3_msm *mdwc) { unsigned long timeout; u32 reg = 0; + struct dwc3 *dwc = platform_get_drvdata(mdwc->dwc3); if ((mdwc->in_host_mode || (mdwc->vbus_active && mdwc->otg_state == OTG_STATE_B_SUSPEND)) - && dwc3_msm_is_superspeed(mdwc)) { + && dwc3_msm_is_superspeed(mdwc) && !mdwc->in_restart) { if (!atomic_read(&mdwc->in_p3)) { dev_err(mdwc->dev, "Not in P3,aborting LPM sequence\n"); return -EBUSY; @@ -1908,8 +1923,17 @@ static int dwc3_msm_prepare_suspend(struct dwc3_msm *mdwc) if (!(reg & PWR_EVNT_LPM_IN_L2_MASK)) { dev_err(mdwc->dev, "could not transition HS PHY to L2\n"); - queue_delayed_work(mdwc->dwc3_wq, &mdwc->resume_work, 0); - return -EBUSY; + dbg_event(0xFF, "PWR_EVNT_LPM", + dwc3_msm_read_reg(mdwc->base, PWR_EVNT_IRQ_STAT_REG)); + dbg_event(0xFF, "QUSB_STS", + dwc3_msm_read_reg(mdwc->base, QSCRATCH_USB30_STS_REG)); + /* Mark fatal error for host mode or USB bus suspend case */ + if (mdwc->in_host_mode || (mdwc->vbus_active + && mdwc->otg_state == OTG_STATE_B_SUSPEND)) { + queue_delayed_work(mdwc->dwc3_wq, + &mdwc->resume_work, 0); + return -EBUSY; + } } /* Clear L2 event bit */ @@ -2374,6 +2398,28 @@ static irqreturn_t msm_dwc3_pwr_irq(int irq, void *data) return IRQ_HANDLED; } + +static int dwc3_msm_prop_usbin_voltage_now(struct dwc3_msm *mdwc) +{ + int rc = 0; + struct qpnp_vadc_result results; + + if (IS_ERR_OR_NULL(mdwc->vadc_dev)) { + mdwc->vadc_dev = qpnp_get_vadc(mdwc->dev, "usbin"); + if (IS_ERR(mdwc->vadc_dev)) + return PTR_ERR(mdwc->vadc_dev); + } + + rc = qpnp_vadc_read(mdwc->vadc_dev, USBIN, &results); + if (rc) { + pr_err("Unable to read usbin rc=%d\n", rc); + return 0; + } else { + return results.physical; + } +} + + static int dwc3_msm_power_get_property_usb(struct power_supply *psy, enum power_supply_property psp, union power_supply_propval *val) @@ -2402,6 +2448,9 @@ static int dwc3_msm_power_get_property_usb(struct power_supply *psy, case POWER_SUPPLY_PROP_HEALTH: val->intval = mdwc->health_status; break; + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + val->intval = dwc3_msm_prop_usbin_voltage_now(mdwc); + break; case POWER_SUPPLY_PROP_USB_OTG: val->intval = !mdwc->id_state; break; @@ -2573,6 +2622,7 @@ static enum power_supply_property dwc3_msm_pm_power_props_usb[] = { POWER_SUPPLY_PROP_INPUT_CURRENT_MAX, POWER_SUPPLY_PROP_TYPE, POWER_SUPPLY_PROP_HEALTH, + POWER_SUPPLY_PROP_VOLTAGE_NOW, POWER_SUPPLY_PROP_USB_OTG, }; @@ -3065,6 +3115,7 @@ static int dwc3_msm_probe(struct platform_device *pdev) if (!dwc->is_drd && host_mode) { dev_dbg(&pdev->dev, "DWC3 in host only mode\n"); + mdwc->host_only_mode = true; mdwc->id_state = DWC3_ID_GROUND; dwc3_ext_event_notify(mdwc); } @@ -3287,7 +3338,9 @@ static int dwc3_otg_start_host(struct dwc3_msm *mdwc, int on) mdwc->in_host_mode = false; /* re-init core and OTG registers as block reset clears these */ - dwc3_post_host_reset_core_init(dwc); + if (!mdwc->host_only_mode) + dwc3_post_host_reset_core_init(dwc); + pm_runtime_mark_last_busy(mdwc->dev); pm_runtime_put_sync_autosuspend(mdwc->dev); dbg_event(0xFF, "StopHost psync", @@ -3349,7 +3402,10 @@ static int dwc3_msm_gadget_vbus_draw(struct dwc3_msm *mdwc, unsigned mA) if (mdwc->charging_disabled) return 0; - if (mdwc->chg_type != DWC3_INVALID_CHARGER) { + + if ((mdwc->chg_type != DWC3_INVALID_CHARGER) && + (mdwc->chg_type != DWC3_PROPRIETARY_CHARGER) && + (mdwc->chg_type != DWC3_DCP_CHARGER)) { dev_dbg(mdwc->dev, "SKIP setting power supply type again,chg_type = %d\n", mdwc->chg_type); @@ -3426,7 +3482,18 @@ static void dwc3_check_float_lines(struct dwc3_msm *mdwc) dwc3_msm_gadget_vbus_draw(mdwc, 0); /* Get linestate with Idp_src enabled */ - dpdm = usb_phy_dpdm_with_idp_src(mdwc->hs_phy); + if (mdwc->otg_state == OTG_STATE_UNDEFINED) { + dpdm = usb_phy_dpdm_with_idp_src(mdwc->hs_phy); + } else { + do { + dpdm = usb_phy_dpdm_with_idp_src(mdwc->hs_phy); + if (dpdm == 0 || dpdm == 0x3) + break; + mdwc->wt_check_times++; + msleep(200); + } while (mdwc->wt_check_times < 10); + } + dev_err(mdwc->dev, "%s: linestate(dpdm) = %d\n", __func__, dpdm); if (dpdm == 0x2) { /* DP is HIGH = lines are floating */ mdwc->chg_type = DWC3_PROPRIETARY_CHARGER; @@ -3434,6 +3501,13 @@ static void dwc3_check_float_lines(struct dwc3_msm *mdwc) pm_runtime_put_sync(mdwc->dev); dbg_event(0xFF, "FLT psync", atomic_read(&mdwc->dev->power.usage_count)); + } else if (dpdm == 0x3) { + mdwc->chg_type = DWC3_DCP_CHARGER; + mdwc->otg_state = OTG_STATE_B_IDLE; + pm_runtime_put_sync(mdwc->dev); + dbg_event(0xFF, "FLT psync", + atomic_read(&mdwc->dev->power.usage_count)); + } else if (dpdm) { dev_dbg(mdwc->dev, "%s:invalid linestate:%x\n", __func__, dpdm); } @@ -3513,6 +3587,8 @@ static void dwc3_otg_sm_work(struct work_struct *w) dev_dbg(mdwc->dev, "%s state\n", state); dbg_event(0xFF, state, 0); + dev_info(mdwc->dev, "XJB enter ,mdwc->otg_state= %d\n", mdwc->otg_state); + /* Check OTG state */ switch (mdwc->otg_state) { case OTG_STATE_UNDEFINED: @@ -3543,13 +3619,19 @@ static void dwc3_otg_sm_work(struct work_struct *w) dbg_event(0xFF, "undef_b_sess_vld", 0); switch (mdwc->chg_type) { case DWC3_DCP_CHARGER: - case DWC3_PROPRIETARY_CHARGER: dev_dbg(mdwc->dev, "DCP charger\n"); dwc3_msm_gadget_vbus_draw(mdwc, dcp_max_current); atomic_set(&dwc->in_lpm, 1); pm_relax(mdwc->dev); break; + case DWC3_PROPRIETARY_CHARGER: + dev_dbg(mdwc->dev, "PROPRIETARY charger\n"); + dwc3_msm_gadget_vbus_draw(mdwc, + DWC3_PROPRIETARY_CHG_MAX); + atomic_set(&dwc->in_lpm, 1); + pm_relax(mdwc->dev); + break; case DWC3_CDP_CHARGER: case DWC3_SDP_CHARGER: atomic_set(&dwc->in_lpm, 0); @@ -3558,10 +3640,13 @@ static void dwc3_otg_sm_work(struct work_struct *w) pm_runtime_get_noresume(mdwc->dev); dwc3_initialize(mdwc); /* check dp/dm for SDP & runtime_put if !SDP */ - if (mdwc->detect_dpdm_floating) { + if (mdwc->detect_dpdm_floating && + mdwc->chg_type == DWC3_SDP_CHARGER) { dwc3_check_float_lines(mdwc); - if (mdwc->chg_type != DWC3_SDP_CHARGER) + if (mdwc->chg_type != DWC3_SDP_CHARGER) { + work = 1; break; + } } dwc3_otg_start_peripheral(mdwc, 1); mdwc->otg_state = OTG_STATE_B_PERIPHERAL; @@ -3599,11 +3684,15 @@ static void dwc3_otg_sm_work(struct work_struct *w) dev_dbg(mdwc->dev, "b_sess_vld\n"); switch (mdwc->chg_type) { case DWC3_DCP_CHARGER: - case DWC3_PROPRIETARY_CHARGER: dev_dbg(mdwc->dev, "lpm, DCP charger\n"); dwc3_msm_gadget_vbus_draw(mdwc, dcp_max_current); break; + case DWC3_PROPRIETARY_CHARGER: + dev_dbg(mdwc->dev, "lpm, PROPRIETARY charger\n"); + dwc3_msm_gadget_vbus_draw(mdwc, + DWC3_PROPRIETARY_CHG_MAX); + break; case DWC3_CDP_CHARGER: dwc3_msm_gadget_vbus_draw(mdwc, DWC3_IDEV_CHG_MAX); @@ -3623,8 +3712,10 @@ static void dwc3_otg_sm_work(struct work_struct *w) if (mdwc->detect_dpdm_floating && mdwc->chg_type == DWC3_SDP_CHARGER) { dwc3_check_float_lines(mdwc); - if (mdwc->chg_type != DWC3_SDP_CHARGER) + if (mdwc->chg_type != DWC3_SDP_CHARGER) { + work = 1; break; + } } dwc3_otg_start_peripheral(mdwc, 1); mdwc->otg_state = OTG_STATE_B_PERIPHERAL; @@ -3636,6 +3727,7 @@ static void dwc3_otg_sm_work(struct work_struct *w) } } else { mdwc->typec_current_max = 0; + mdwc->wt_check_times = 0; dwc3_msm_gadget_vbus_draw(mdwc, 0); dev_dbg(mdwc->dev, "No device, allowing suspend\n"); } @@ -3745,8 +3837,10 @@ static void dwc3_otg_sm_work(struct work_struct *w) } - if (work) + if (work) { + dev_info(mdwc->dev, "XJB delay = %lu mdwc->wt_check_times = %d\n", delay, mdwc->wt_check_times); schedule_delayed_work(&mdwc->sm_work, delay); + } ret: return; diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index c481351469cf6..a337aba4eb23c 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -228,7 +228,7 @@ int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, spin_lock_irqsave(&dwc->lock, flags); if (!dep->endpoint.desc) { dwc3_trace(trace_dwc3_ep0, - "trying to queue request %p to disabled %s", + "trying to queue request %pK to disabled %s", request, dep->name); ret = -ESHUTDOWN; goto out; @@ -241,7 +241,7 @@ int dwc3_gadget_ep0_queue(struct usb_ep *ep, struct usb_request *request, } dwc3_trace(trace_dwc3_ep0, - "queueing request %p to %s length %d state '%s'", + "queueing request %pK to %s length %d state '%s'", request, dep->name, request->length, dwc3_ep0_state_string(dwc->ep0state)); @@ -575,7 +575,6 @@ static int dwc3_ep0_set_config(struct dwc3 *dwc, struct usb_ctrlrequest *ctrl) int ret; u32 reg; - dwc->start_config_issued = false; cfg = le16_to_cpu(ctrl->wValue); switch (state) { diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 34935b3edeb84..197603bc724c8 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2,6 +2,7 @@ * gadget.c - DesignWare USB3 DRD Controller Gadget Framework Link * * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com + * Copyright (C) 2018 XiaoMi, Inc. * * Authors: Felipe Balbi , * Sebastian Andrzej Siewior @@ -17,6 +18,8 @@ */ #include +#include +#include #include #include #include @@ -38,9 +41,26 @@ #include "debug.h" #include "io.h" +#ifdef WT_COMPILE_FACTORY_VERSION +#undef dev_dbg +#define dev_dbg dev_info +#undef pr_debug +#define pr_debug pr_info +#endif + static void dwc3_gadget_wakeup_interrupt(struct dwc3 *dwc, bool remote_wakeup); static int dwc3_gadget_wakeup_int(struct dwc3 *dwc); +/* + * Some USB functions' endpoints are not enabled at set config stage. + * So fifo_resize cannot happen for these endpoints. + * So, user can specify Isochronous IN endpoint using high_bw_ep_in_num + * to enable fifo_resize to support high bandwidth transfers. + */ +static int high_bw_ep_in_num; +module_param(high_bw_ep_in_num, int, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(high_bw_ep_in_num, + "Isoc ep number to support for HS high bandwidth transfer"); /** * dwc3_gadget_set_test_mode - Enables USB2 Test Modes * @dwc: pointer to our context structure @@ -215,6 +235,9 @@ int dwc3_gadget_resize_tx_fifos(struct dwc3 *dwc) if (dep->endpoint.ep_type == EP_TYPE_GSI) mult = 3; + if (num == high_bw_ep_in_num) + mult = 3; + if (!(dep->flags & DWC3_EP_ENABLED)) { dev_dbg(dwc->dev, "ep%dIn not enabled", num); goto resize_fifo; @@ -298,7 +321,7 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, usb_gadget_unmap_request(&dwc->gadget, &req->request, req->direction); - dev_dbg(dwc->dev, "request %p from %s completed %d/%d ===> %d\n", + dev_dbg(dwc->dev, "request %pK from %s completed %d/%d ===> %d\n", req, dep->name, req->request.actual, req->request.length, status); trace_dwc3_gadget_giveback(req); @@ -344,7 +367,7 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, unsigned cmd, struct dwc3_gadget_ep_cmd_params *params) { struct dwc3_ep *dep = dwc->eps[ep]; - u32 timeout = 1500; + u32 timeout = 3000; u32 reg; trace_dwc3_gadget_ep_cmd(dep, cmd, params); @@ -381,6 +404,11 @@ int dwc3_send_gadget_ep_cmd(struct dwc3 *dwc, unsigned ep, if (!timeout) { dev_err(dwc->dev, "%s command timeout for %s\n", dwc3_gadget_ep_cmd_string(cmd), dep->name); + if (!(cmd & DWC3_DEPCMD_ENDTRANSFER)) { + dwc->ep_cmd_timeout_cnt++; + dwc3_notify_event(dwc, + DWC3_CONTROLLER_RESTART_USB_SESSION, 0); + } return -ETIMEDOUT; } @@ -430,24 +458,66 @@ static void dwc3_free_trb_pool(struct dwc3_ep *dep) } } +static int dwc3_gadget_set_xfer_resource(struct dwc3 *dwc, struct dwc3_ep *dep); + +/** + * dwc3_gadget_start_config - Configure EP resources + * @dwc: pointer to our controller context structure + * @dep: endpoint that is being enabled + * + * The assignment of transfer resources cannot perfectly follow the + * data book due to the fact that the controller driver does not have + * all knowledge of the configuration in advance. It is given this + * information piecemeal by the composite gadget framework after every + * SET_CONFIGURATION and SET_INTERFACE. Trying to follow the databook + * programming model in this scenario can cause errors. For two + * reasons: + * + * 1) The databook says to do DEPSTARTCFG for every SET_CONFIGURATION + * and SET_INTERFACE (8.1.5). This is incorrect in the scenario of + * multiple interfaces. + * + * 2) The databook does not mention doing more DEPXFERCFG for new + * endpoint on alt setting (8.1.6). + * + * The following simplified method is used instead: + * + * All hardware endpoints can be assigned a transfer resource and this + * setting will stay persistent until either a core reset or + * hibernation. So whenever we do a DEPSTARTCFG(0) we can go ahead and + * do DEPXFERCFG for every hardware endpoint as well. We are + * guaranteed that there are as many transfer resources as endpoints. + * + * This function is called for each endpoint when it is being enabled + * but is triggered only when called for EP0-out, which always happens + * first, and which should only happen in one of the above conditions. + */ static int dwc3_gadget_start_config(struct dwc3 *dwc, struct dwc3_ep *dep) { struct dwc3_gadget_ep_cmd_params params; u32 cmd; + int i; + int ret; + + if (dep->number) + return 0; memset(¶ms, 0x00, sizeof(params)); + cmd = DWC3_DEPCMD_DEPSTARTCFG; - if (dep->number != 1) { - cmd = DWC3_DEPCMD_DEPSTARTCFG; - /* XferRscIdx == 0 for ep0 and 2 for the remaining */ - if (dep->number > 1) { - if (dwc->start_config_issued) - return 0; - dwc->start_config_issued = true; - cmd |= DWC3_DEPCMD_PARAM(2); - } + ret = dwc3_send_gadget_ep_cmd(dwc, 0, cmd, ¶ms); + if (ret) + return ret; - return dwc3_send_gadget_ep_cmd(dwc, 0, cmd, ¶ms); + for (i = 0; i < DWC3_ENDPOINTS_NUM; i++) { + struct dwc3_ep *dep = dwc->eps[i]; + + if (!dep) + continue; + + ret = dwc3_gadget_set_xfer_resource(dwc, dep); + if (ret) + return ret; } return 0; @@ -573,13 +643,6 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, struct dwc3_trb *trb_st_hw; struct dwc3_trb *trb_link; - ret = dwc3_gadget_set_xfer_resource(dwc, dep); - if (ret) { - dev_err(dwc->dev, "set_xfer_resource() failed for %s\n", - dep->name); - return ret; - } - dep->endpoint.desc = desc; dep->comp_desc = comp_desc; dep->type = usb_endpoint_type(desc); @@ -620,6 +683,10 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) dwc3_gadget_giveback(dep, req, -ESHUTDOWN); } + /* For isoc endpoints explicitly stop active transfers */ + } else if (dep->endpoint.desc && + usb_endpoint_xfer_isoc(dep->endpoint.desc)) { + dwc3_stop_active_transfer(dwc, dep->number, true); } while (!list_empty(&dep->request_list)) { @@ -699,7 +766,7 @@ static int dwc3_gadget_ep_enable(struct usb_ep *ep, int ret; if (!ep || !desc || desc->bDescriptorType != USB_DT_ENDPOINT) { - pr_debug("dwc3: invalid parameters. ep=%p, desc=%p, DT=%d\n", + pr_debug("dwc3: invalid parameters. ep=%pK, desc=%pK, DT=%d\n", ep, desc, desc ? desc->bDescriptorType : 0); return -EINVAL; } @@ -827,8 +894,9 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, struct dwc3_trb *trb; bool zlp_appended = false; unsigned rlen; + int isoc_maxp, max_payload, mult; - dev_vdbg(dwc->dev, "%s: req %p dma %08llx length %d%s%s\n", + dev_vdbg(dwc->dev, "%s: req %pK dma %08llx length %d%s%s\n", dep->name, req, (unsigned long long) dma, length, last ? " last" : "", chain ? " chain" : ""); @@ -860,6 +928,11 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep, break; case USB_ENDPOINT_XFER_ISOC: + isoc_maxp = usb_endpoint_maxp(dep->endpoint.desc); + max_payload = isoc_maxp & 0x7FF; + mult = (req->request.length/max_payload) & 0x3; + trb->size |= DWC3_TRB_SIZE_PCM1( + (req->request.length%max_payload) ? mult : mult-1); if (!node) trb->ctrl = DWC3_TRBCTL_ISOCHRONOUS_FIRST; else @@ -1294,7 +1367,7 @@ static int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request *req) if (req->request.status == -EINPROGRESS) { ret = -EBUSY; - dev_err(dwc->dev, "%s: %p request already in queue", + dev_err(dwc->dev, "%s: %pK request already in queue", dep->name, req); return ret; } @@ -1439,7 +1512,7 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request, spin_lock_irqsave(&dwc->lock, flags); if (!dep->endpoint.desc) { - dev_dbg(dwc->dev, "trying to queue request %p to disabled %s\n", + dev_dbg(dwc->dev, "trying to queue request %pK to disabled %s\n", request, ep->name); spin_unlock_irqrestore(&dwc->lock, flags); return -ESHUTDOWN; @@ -1450,7 +1523,7 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request, * API should not be allowed. */ if (dep->endpoint.endless) { - dev_dbg(dwc->dev, "trying to queue endless request %p to %s\n", + dev_dbg(dwc->dev, "trying to queue endless request %pK to %s\n", request, ep->name); spin_unlock_irqrestore(&dwc->lock, flags); return -EPERM; @@ -1463,7 +1536,7 @@ static int dwc3_gadget_ep_queue(struct usb_ep *ep, struct usb_request *request, return dwc->gadget.remote_wakeup ? -EAGAIN : -ENOTSUPP; } - dev_vdbg(dwc->dev, "queing request %p to %s length %d\n", + dev_vdbg(dwc->dev, "queing request %pK to %s length %d\n", request, ep->name, request->length); trace_dwc3_ep_queue(req); @@ -1513,7 +1586,7 @@ static int dwc3_gadget_ep_dequeue(struct usb_ep *ep, dwc3_stop_active_transfer(dwc, dep->number, true); goto out1; } - dev_err(dwc->dev, "request %p was not queued to %s\n", + dev_err(dwc->dev, "request %pK was not queued to %s\n", request, ep->name); ret = -EINVAL; goto out0; @@ -2155,8 +2228,6 @@ static int __dwc3_gadget_start(struct dwc3 *dwc) dwc3_writel(dwc->regs, DWC3_GSBUSCFG1, reg); } - dwc->start_config_issued = false; - /* Start with SuperSpeed Default */ dwc3_gadget_ep0_desc.wMaxPacketSize = cpu_to_le16(512); @@ -2425,7 +2496,7 @@ static int __dwc3_cleanup_done_trbs(struct dwc3 *dwc, struct dwc3_ep *dep, * would help. Lets hope that if this occurs, someone * fixes the root cause instead of looking away :) */ - dev_err(dwc->dev, "%s's TRB (%p) still owned by HW\n", + dev_err(dwc->dev, "%s's TRB (%pK) still owned by HW\n", dep->name, trb); count = trb->size & DWC3_TRB_SIZE_MASK; @@ -2888,7 +2959,6 @@ static void dwc3_gadget_disconnect_interrupt(struct dwc3 *dwc) dbg_event(0xFF, "DISCONNECT", 0); dwc3_disconnect_gadget(dwc); - dwc->start_config_issued = false; dwc->gadget.speed = USB_SPEED_UNKNOWN; dwc->setup_packet_pending = false; @@ -2955,7 +3025,7 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) dwc3_gadget_usb3_phy_suspend(dwc, false); - usb_gadget_vbus_draw(&dwc->gadget, 0); + usb_gadget_vbus_draw(&dwc->gadget, 3); if (dwc->gadget.speed != USB_SPEED_UNKNOWN) dwc3_disconnect_gadget(dwc); @@ -2967,7 +3037,6 @@ static void dwc3_gadget_reset_interrupt(struct dwc3 *dwc) dwc3_stop_active_transfers(dwc); dwc3_clear_stall_all_ep(dwc); - dwc->start_config_issued = false; /* bus reset issued due to missing status stage of a control transfer */ dwc->resize_fifos = 0; diff --git a/drivers/usb/dwc3/io.h b/drivers/usb/dwc3/io.h index 6a79c8e66bbcc..d797eb8728de8 100644 --- a/drivers/usb/dwc3/io.h +++ b/drivers/usb/dwc3/io.h @@ -41,7 +41,7 @@ static inline u32 dwc3_readl(void __iomem *base, u32 offset) * documentation, so we revert it back to the proper addresses, the * same way they are described on SNPS documentation */ - dwc3_trace(trace_dwc3_readl, "addr %p value %08x", + dwc3_trace(trace_dwc3_readl, "addr %pK value %08x", base - DWC3_GLOBALS_REGS_START + offset, value); return value; @@ -63,7 +63,7 @@ static inline void dwc3_writel(void __iomem *base, u32 offset, u32 value) * documentation, so we revert it back to the proper addresses, the * same way they are described on SNPS documentation */ - dwc3_trace(trace_dwc3_writel, "addr %p value %08x", + dwc3_trace(trace_dwc3_writel, "addr %pK value %08x", base - DWC3_GLOBALS_REGS_START + offset, value); } diff --git a/drivers/usb/dwc3/trace.h b/drivers/usb/dwc3/trace.h index 60b0f41eafc40..88f18814907bb 100644 --- a/drivers/usb/dwc3/trace.h +++ b/drivers/usb/dwc3/trace.h @@ -115,7 +115,7 @@ DECLARE_EVENT_CLASS(dwc3_log_request, __entry->length = req->request.length; __entry->status = req->request.status; ), - TP_printk("%s: req %p length %u/%u ==> %d", + TP_printk("%s: req %pK length %u/%u ==> %d", __get_str(name), __entry->req, __entry->actual, __entry->length, __entry->status ) @@ -214,7 +214,7 @@ DECLARE_EVENT_CLASS(dwc3_log_trb, __entry->size = trb->size; __entry->ctrl = trb->ctrl; ), - TP_printk("%s: trb %p bph %08x bpl %08x size %08x ctrl %08x\n", + TP_printk("%s: trb %pK bph %08x bpl %08x size %08x ctrl %08x\n", __get_str(name), __entry->trb, __entry->bph, __entry->bpl, __entry->size, __entry->ctrl ) diff --git a/drivers/usb/early/ehci-dbgp.c b/drivers/usb/early/ehci-dbgp.c index 8cfc3191be50a..482995c10fc32 100644 --- a/drivers/usb/early/ehci-dbgp.c +++ b/drivers/usb/early/ehci-dbgp.c @@ -888,7 +888,7 @@ int __init early_dbgp_init(char *s) set_fixmap_nocache(FIX_DBGP_BASE, bar_val & PAGE_MASK); ehci_bar = (void __iomem *)__fix_to_virt(FIX_DBGP_BASE); ehci_bar += bar_val & ~PAGE_MASK; - dbgp_printk("ehci_bar: %p\n", ehci_bar); + dbgp_printk("ehci_bar: %pK\n", ehci_bar); ehci_caps = ehci_bar; ehci_regs = ehci_bar + EARLY_HC_LENGTH(readl(&ehci_caps->hc_capbase)); diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index da01358193072..5e88699105bc4 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig @@ -188,6 +188,7 @@ config USB_F_UAC2 tristate config USB_F_UVC + select VIDEOBUF2_VMALLOC tristate config USB_F_MTP @@ -422,6 +423,8 @@ config USB_G_ANDROID select USB_F_NCM select USB_F_MASS_STORAGE select USB_F_UAC1 if SND_PCM + select USB_F_UAC2 if SND_PCM + select USB_F_UVC if MEDIA_SUPPORT help The Android Composite Gadget supports multiple USB functions: adb, acm, mass storage, mtp, accessory diff --git a/drivers/usb/gadget/android.c b/drivers/usb/gadget/android.c index e5d8899b19ebc..5f762f350defa 100644 --- a/drivers/usb/gadget/android.c +++ b/drivers/usb/gadget/android.c @@ -36,6 +36,10 @@ #include "gadget_chips.h" +#ifdef CONFIG_MEDIA_SUPPORT +#include "f_uvc.h" +#include "u_uvc.h" +#endif #include "u_fs.h" #include "u_ecm.h" #include "u_ncm.h" @@ -71,8 +75,18 @@ #include "f_mass_storage.h" USB_ETHERNET_MODULE_PARAMETERS(); +#ifdef CONFIG_MEDIA_SUPPORT +USB_VIDEO_MODULE_PARAMETERS(); +#endif #include "debug.h" +#ifdef WT_COMPILE_FACTORY_VERSION +#undef dev_dbg +#define dev_dbg dev_info +#undef pr_debug +#define pr_debug pr_info +#endif + MODULE_AUTHOR("Mike Lockwood"); MODULE_DESCRIPTION("Android Composite USB Driver"); MODULE_LICENSE("GPL"); @@ -238,6 +252,8 @@ static struct android_configuration *alloc_android_config static void free_android_config(struct android_dev *dev, struct android_configuration *conf); +static bool video_enabled; + /* string IDs are assigned dynamically */ #define STRING_MANUFACTURER_IDX 0 #define STRING_PRODUCT_IDX 1 @@ -481,7 +497,7 @@ static void android_work(struct work_struct *data) } pr_info("%s: sent uevent %s\n", __func__, uevent_envp[0]); } else { - pr_info("%s: did not send uevent (%d %d %p)\n", __func__, + pr_info("%s: did not send uevent (%d %d %pK)\n", __func__, dev->connected, dev->sw_connected, cdev->config); } } @@ -520,7 +536,11 @@ static int android_enable(struct android_dev *dev) if (ktime_to_ms(diff) < MIN_DISCONNECT_DELAY_MS) msleep(MIN_DISCONNECT_DELAY_MS - ktime_to_ms(diff)); - usb_gadget_connect(cdev->gadget); + /* Userspace UVC driver will trigger connect for video */ + if (!video_enabled) + usb_gadget_connect(cdev->gadget); + else + pr_debug("defer gadget connect until usersapce opens video device\n"); } return err; @@ -530,9 +550,13 @@ static void android_disable(struct android_dev *dev) { struct usb_composite_dev *cdev = dev->cdev; struct android_configuration *conf; + bool do_put = false; if (dev->disable_depth++ == 0) { - usb_gadget_autopm_get(cdev->gadget); + if (cdev->suspended && cdev->config) { + usb_gadget_autopm_get(cdev->gadget); + do_put = true; + } if (gadget_is_dwc3(cdev->gadget)) { /* Cancel pending control requests */ usb_ep_dequeue(cdev->gadget->ep0, cdev->req); @@ -551,7 +575,8 @@ static void android_disable(struct android_dev *dev) list_for_each_entry(conf, &dev->configs, list_item) usb_remove_config(cdev, &conf->usb_config); } - usb_gadget_autopm_put_async(cdev->gadget); + if (do_put) + usb_gadget_autopm_put_async(cdev->gadget); } } @@ -1496,6 +1521,185 @@ static struct android_usb_function audio_function = { }; #endif +/* PERIPHERAL uac2 */ +struct uac2_function_config { + struct usb_function *func; + struct usb_function_instance *fi; +}; + +static int uac2_function_init(struct android_usb_function *f, + struct usb_composite_dev *cdev) +{ + struct uac2_function_config *config; + + f->config = kzalloc(sizeof(*config), GFP_KERNEL); + if (!f->config) + return -ENOMEM; + + config = f->config; + + config->fi = usb_get_function_instance("uac2"); + if (IS_ERR(config->fi)) + return PTR_ERR(config->fi); + + config->func = usb_get_function(config->fi); + if (IS_ERR(config->func)) { + usb_put_function_instance(config->fi); + return PTR_ERR(config->func); + } + + return 0; +} + +static void uac2_function_cleanup(struct android_usb_function *f) +{ + struct uac2_function_config *config = f->config; + + if (config) { + usb_put_function(config->func); + usb_put_function_instance(config->fi); + } + + kfree(f->config); + f->config = NULL; +} + +static int uac2_function_bind_config(struct android_usb_function *f, + struct usb_configuration *c) +{ + struct uac2_function_config *config = f->config; + + return usb_add_function(c, config->func); +} + +static struct android_usb_function uac2_function = { + .name = "uac2_func", + .init = uac2_function_init, + .cleanup = uac2_function_cleanup, + .bind_config = uac2_function_bind_config, +}; + +#ifdef CONFIG_MEDIA_SUPPORT +/* PERIPHERAL VIDEO */ +struct video_function_config { + struct usb_function *func; + struct usb_function_instance *fi; +}; + +static int video_function_init(struct android_usb_function *f, + struct usb_composite_dev *cdev) +{ + struct f_uvc_opts *uvc_opts; + struct video_function_config *config; + + f->config = kzalloc(sizeof(*config), GFP_KERNEL); + if (!f->config) + return -ENOMEM; + + config = f->config; + + config->fi = usb_get_function_instance("uvc"); + if (IS_ERR(config->fi)) + return PTR_ERR(config->fi); + + uvc_opts = container_of(config->fi, struct f_uvc_opts, func_inst); + + uvc_opts->streaming_interval = streaming_interval; + uvc_opts->streaming_maxpacket = streaming_maxpacket; + uvc_opts->streaming_maxburst = streaming_maxburst; + uvc_set_trace_param(trace); + + uvc_opts->fs_control = uvc_fs_control_cls; + uvc_opts->ss_control = uvc_ss_control_cls; + uvc_opts->fs_streaming = uvc_fs_streaming_cls; + uvc_opts->hs_streaming = uvc_hs_streaming_cls; + uvc_opts->ss_streaming = uvc_ss_streaming_cls; + + config->func = usb_get_function(config->fi); + if (IS_ERR(config->func)) { + usb_put_function_instance(config->fi); + return PTR_ERR(config->func); + } + + return 0; +} + +static void video_function_cleanup(struct android_usb_function *f) +{ + struct video_function_config *config = f->config; + + if (config) { + usb_put_function(config->func); + usb_put_function_instance(config->fi); + } + + kfree(f->config); + f->config = NULL; +} + +static int video_function_bind_config(struct android_usb_function *f, + struct usb_configuration *c) +{ + struct video_function_config *config = f->config; + + return usb_add_function(c, config->func); +} + +static void video_function_enable(struct android_usb_function *f) +{ + video_enabled = true; +} + +static void video_function_disable(struct android_usb_function *f) +{ + video_enabled = false; +} + +static struct android_usb_function video_function = { + .name = "video", + .init = video_function_init, + .cleanup = video_function_cleanup, + .bind_config = video_function_bind_config, + .enable = video_function_enable, + .disable = video_function_disable, +}; + +int video_ready_callback(struct usb_function *function) +{ + struct android_dev *dev = video_function.android_dev; + struct usb_composite_dev *cdev; + + if (!dev) { + pr_err("%s: dev is NULL\n", __func__); + return -ENODEV; + } + + cdev = dev->cdev; + + pr_debug("%s: connect\n", __func__); + usb_gadget_connect(cdev->gadget); + + return 0; +} + +int video_closed_callback(struct usb_function *function) +{ + struct android_dev *dev = video_function.android_dev; + struct usb_composite_dev *cdev; + + if (!dev) { + pr_err("%s: dev is NULL\n", __func__); + return -ENODEV; + } + + cdev = dev->cdev; + + pr_debug("%s: disconnect\n", __func__); + usb_gadget_disconnect(cdev->gadget); + + return 0; +} +#endif /* DIAG */ static char diag_clients[32]; /*enabled DIAG clients- "diag[,diag_mdm]" */ @@ -1925,6 +2129,7 @@ static int serial_function_bind_config(struct android_usb_function *f, err = gport_setup(c); if (err) { pr_err("serial: Cannot setup transports"); + gserial_deinit_port(); goto out; } @@ -3083,6 +3288,10 @@ static struct android_usb_function *default_functions[] = { &ecm_qc_function, #ifdef CONFIG_SND_PCM &audio_function, + &uac2_function, +#endif +#ifdef CONFIG_MEDIA_SUPPORT + &video_function, #endif &rmnet_function, &gps_function, @@ -4042,7 +4251,7 @@ static int usb_diag_update_pid_and_serial_num(u32 pid, const char *snum) return -ENODEV; } - pr_debug("%s: dload:%p pid:%x serial_num:%s\n", + pr_debug("%s: dload:%pK pid:%x serial_num:%s\n", __func__, diag_dload, pid, snum); /* update pid */ diff --git a/drivers/usb/gadget/ci13xxx_msm.c b/drivers/usb/gadget/ci13xxx_msm.c index 4fb191177ac17..ef32fb3ff6084 100644 --- a/drivers/usb/gadget/ci13xxx_msm.c +++ b/drivers/usb/gadget/ci13xxx_msm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -15,6 +15,13 @@ #include "ci13xxx_udc.c" +#ifdef WT_COMPILE_FACTORY_VERSION +#undef dev_dbg +#define dev_dbg dev_info +#undef pr_debug +#define pr_debug pr_info +#endif + #define MSM_USB_BASE (udc->regs) #define CI13XXX_MSM_MAX_LOG2_ITC 7 @@ -470,6 +477,13 @@ void ci13xxx_msm_shutdown(struct platform_device *pdev) ci13xxx_pullup(&_udc->gadget, 0); } +void msm_hw_soft_reset(void) +{ + struct ci13xxx *udc = _udc; + + hw_device_reset(udc); +} + void msm_hw_bam_disable(bool bam_disable) { u32 val; diff --git a/drivers/usb/gadget/ci13xxx_msm_hsic.c b/drivers/usb/gadget/ci13xxx_msm_hsic.c index 02ebd75092b46..3a861cf320113 100644 --- a/drivers/usb/gadget/ci13xxx_msm_hsic.c +++ b/drivers/usb/gadget/ci13xxx_msm_hsic.c @@ -379,7 +379,7 @@ static void msm_hsic_start(void) while (seq[0] >= 0 && seq_count > 0) { val = readl_relaxed(mhsic->tlmm_regs + seq[0]); val |= seq[1]; - dev_dbg(mhsic->dev, "%s: writing %x to %p\n", + dev_dbg(mhsic->dev, "%s: writing %x to %pK\n", __func__, val, mhsic->tlmm_regs + seq[0]); writel_relaxed(val, mhsic->tlmm_regs + seq[0]); seq += 2; @@ -948,7 +948,7 @@ static int msm_hsic_probe(struct platform_device *pdev) ret = -ENOMEM; goto error; } - dev_info(&pdev->dev, "HSIC Peripheral regs = %p\n", mhsic->regs); + dev_info(&pdev->dev, "HSIC Peripheral regs = %pK\n", mhsic->regs); res = platform_get_resource(pdev, IORESOURCE_MEM, 1); if (!res && pdata->tlmm_init_seq) { diff --git a/drivers/usb/gadget/ci13xxx_udc.c b/drivers/usb/gadget/ci13xxx_udc.c index 25b421f9e6d55..bcd0afe0f0b4f 100644 --- a/drivers/usb/gadget/ci13xxx_udc.c +++ b/drivers/usb/gadget/ci13xxx_udc.c @@ -69,7 +69,12 @@ #include #include "ci13xxx_udc.h" - +#ifdef WT_COMPILE_FACTORY_VERSION +#undef dev_dbg +#define dev_dbg dev_info +#undef pr_debug +#define pr_debug pr_info +#endif /****************************************************************************** * DEFINE *****************************************************************************/ @@ -859,7 +864,7 @@ static ssize_t show_device(struct device *dev, struct device_attribute *attr, struct usb_gadget *gadget = &udc->gadget; int n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -901,7 +906,7 @@ static ssize_t show_driver(struct device *dev, struct device_attribute *attr, struct usb_gadget_driver *driver = udc->driver; int n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1116,7 +1121,7 @@ static void dbg_usb_op_fail(u8 addr, const char *name, list_for_each(ptr, &mep->qh.queue) { req = list_entry(ptr, struct ci13xxx_req, queue); scnprintf(msg, sizeof(msg), - "%pa:%08X:%08X\n", + "%pKa:%08X:%08X\n", &req->dma, req->ptr->next, req->ptr->token); dbg_print(addr, "REQ", 0, msg); @@ -1139,7 +1144,7 @@ static ssize_t show_events(struct device *dev, struct device_attribute *attr, unsigned long flags; unsigned i, j, n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1174,7 +1179,7 @@ static ssize_t store_events(struct device *dev, struct device_attribute *attr, { unsigned tty; - dbg_trace("[%s] %p, %d\n", __func__, buf, count); + dbg_trace("[%s] %pK, %d\n", __func__, buf, count); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); goto done; @@ -1206,7 +1211,7 @@ static ssize_t show_inters(struct device *dev, struct device_attribute *attr, u32 intr; unsigned i, j, n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1279,7 +1284,7 @@ static ssize_t store_inters(struct device *dev, struct device_attribute *attr, unsigned long flags; unsigned en, bit; - dbg_trace("[%s] %p, %d\n", __func__, buf, count); + dbg_trace("[%s] %pK, %d\n", __func__, buf, count); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); goto done; @@ -1319,7 +1324,7 @@ static ssize_t show_port_test(struct device *dev, unsigned long flags; unsigned mode; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1345,7 +1350,7 @@ static ssize_t store_port_test(struct device *dev, unsigned long flags; unsigned mode; - dbg_trace("[%s] %p, %d\n", __func__, buf, count); + dbg_trace("[%s] %pK, %d\n", __func__, buf, count); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); goto done; @@ -1379,7 +1384,7 @@ static ssize_t show_qheads(struct device *dev, struct device_attribute *attr, unsigned long flags; unsigned i, j, n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1419,7 +1424,7 @@ static ssize_t show_registers(struct device *dev, u32 *dump; unsigned i, k, n = 0; - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1457,7 +1462,7 @@ static ssize_t store_registers(struct device *dev, struct ci13xxx *udc = container_of(dev, struct ci13xxx, gadget.dev); unsigned long addr, data, flags; - dbg_trace("[%s] %p, %d\n", __func__, buf, count); + dbg_trace("[%s] %pK, %d\n", __func__, buf, count); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); goto done; @@ -1493,7 +1498,7 @@ static ssize_t show_requests(struct device *dev, struct device_attribute *attr, struct ci13xxx_req *req = NULL; unsigned i, j, n = 0, qSize = sizeof(struct ci13xxx_td)/sizeof(u32); - dbg_trace("[%s] %p\n", __func__, buf); + dbg_trace("[%s] %pK\n", __func__, buf); if (attr == NULL || buf == NULL) { dev_err(dev, "[%s] EINVAL\n", __func__); return 0; @@ -1603,7 +1608,7 @@ static ssize_t print_dtds(struct device *dev, list_for_each(ptr, &mEp->qh.queue) { req = list_entry(ptr, struct ci13xxx_req, queue); - pr_info("\treq:%pa next:%08x token:%08x page0:%08x status:%d\n", + pr_info("\treq:%pKa next:%08x token:%08x page0:%08x status:%d\n", &req->dma, req->ptr->next, req->ptr->token, req->ptr->page[0], req->req.status); } @@ -1827,7 +1832,7 @@ static void ep_prime_timer_func(unsigned long data) mep->qh.ptr->td.next, mep->qh.ptr->td.token); list_for_each(ptr, &mep->qh.queue) { req = list_entry(ptr, struct ci13xxx_req, queue); - pr_info("\treq:%pa:%08xtkn:%08xpage0:%08xsts:%d\n", + pr_info("\treq:%pKa:%08xtkn:%08xpage0:%08xsts:%d\n", &req->dma, req->ptr->next, req->ptr->token, req->ptr->page[0], req->req.status); @@ -1861,7 +1866,7 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq) unsigned length = mReq->req.length; struct ci13xxx *udc = _udc; - trace("%p, %p", mEp, mReq); + trace("%pK, %pK", mEp, mReq); /* don't queue twice */ if (mReq->req.status == -EALREADY) @@ -2079,7 +2084,7 @@ static int _hardware_enqueue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq) */ static int _hardware_dequeue(struct ci13xxx_ep *mEp, struct ci13xxx_req *mReq) { - trace("%p, %p", mEp, mReq); + trace("%pK, %pK", mEp, mReq); if (mReq->req.status != -EALREADY) return -EINVAL; @@ -2281,7 +2286,7 @@ static int _ep_nuke(struct ci13xxx_ep *mEp) __releases(mEp->lock) __acquires(mEp->lock) { - trace("%p", mEp); + trace("%pK", mEp); if (mEp == NULL) return -EINVAL; @@ -2328,7 +2333,7 @@ static int _gadget_stop_activity(struct usb_gadget *gadget) struct ci13xxx *udc = container_of(gadget, struct ci13xxx, gadget); unsigned long flags; - trace("%p", gadget); + trace("%pK", gadget); if (gadget == NULL) return -EINVAL; @@ -2372,7 +2377,7 @@ __acquires(udc->lock) { int retval; - trace("%p", udc); + trace("%pK", udc); if (udc == NULL) { err("EINVAL"); @@ -2474,7 +2479,7 @@ static void isr_suspend_handler(struct ci13xxx *udc) */ static void isr_get_status_complete(struct usb_ep *ep, struct usb_request *req) { - trace("%p, %p", ep, req); + trace("%pK, %pK", ep, req); if (ep == NULL || req == NULL) { err("EINVAL"); @@ -2501,7 +2506,7 @@ __acquires(mEp->lock) struct usb_request *req = udc->status; int dir, num, retval; - trace("%p, %p", mEp, setup); + trace("%pK, %pK", mEp, setup); if (mEp == NULL || setup == NULL) return -EINVAL; @@ -2543,7 +2548,7 @@ isr_setup_status_complete(struct usb_ep *ep, struct usb_request *req) struct ci13xxx *udc = req->context; unsigned long flags; - trace("%p, %p", ep, req); + trace("%pK, %pK", ep, req); spin_lock_irqsave(udc->lock, flags); if (udc->test_mode) @@ -2564,7 +2569,7 @@ __acquires(mEp->lock) int retval; struct ci13xxx_ep *mEp; - trace("%p", udc); + trace("%pK", udc); mEp = (udc->ep0_dir == TX) ? &udc->ep0out : &udc->ep0in; udc->status->context = udc; @@ -2595,7 +2600,7 @@ __acquires(mEp->lock) int req_dequeue = 1; struct ci13xxx *udc = _udc; - trace("%p", mEp); + trace("%pK", mEp); if (list_empty(&mEp->qh.queue)) return 0; @@ -2693,7 +2698,7 @@ __acquires(udc->lock) unsigned i; u8 tmode = 0; - trace("%p", udc); + trace("%pK", udc); if (udc == NULL) { err("EINVAL"); @@ -2896,7 +2901,7 @@ static int ep_enable(struct usb_ep *ep, unsigned long flags; unsigned mult = 0; - trace("ep = %p, desc = %p", ep, desc); + trace("ep = %pK, desc = %pK", ep, desc); if (ep == NULL || desc == NULL) return -EINVAL; @@ -2959,7 +2964,7 @@ static int ep_disable(struct usb_ep *ep) int direction, retval = 0; unsigned long flags; - trace("%p", ep); + trace("%pK", ep); if (ep == NULL) return -EINVAL; @@ -3006,7 +3011,7 @@ static struct usb_request *ep_alloc_request(struct usb_ep *ep, gfp_t gfp_flags) struct ci13xxx_ep *mEp = container_of(ep, struct ci13xxx_ep, ep); struct ci13xxx_req *mReq = NULL; - trace("%p, %i", ep, gfp_flags); + trace("%pK, %i", ep, gfp_flags); if (ep == NULL) { err("EINVAL"); @@ -3042,7 +3047,7 @@ static void ep_free_request(struct usb_ep *ep, struct usb_request *req) struct ci13xxx_req *mReq = container_of(req, struct ci13xxx_req, req); unsigned long flags; - trace("%p, %p", ep, req); + trace("%pK, %pK", ep, req); if (ep == NULL || req == NULL) { err("EINVAL"); @@ -3077,7 +3082,7 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req, unsigned long flags; struct ci13xxx *udc = _udc; - trace("%p, %p, %X", ep, req, gfp_flags); + trace("%pK, %pK, %X", ep, req, gfp_flags); spin_lock_irqsave(mEp->lock, flags); if (ep == NULL || req == NULL || mEp->desc == NULL) { @@ -3166,6 +3171,7 @@ static int ep_queue(struct usb_ep *ep, struct usb_request *req, __func__); dev_dbg(mEp->device, "%s: Remote wakeup is not supported. ept #%d\n", __func__, mEp->num); + mEp->multi_req = false; retval = -EAGAIN; goto done; @@ -3210,7 +3216,7 @@ static int ep_dequeue(struct usb_ep *ep, struct usb_request *req) struct ci13xxx *udc = _udc; unsigned long flags; - trace("%p, %p", ep, req); + trace("%pK, %pK", ep, req); if (udc->udc_driver->in_lpm && udc->udc_driver->in_lpm(udc)) { dev_err(udc->transceiver->dev, @@ -3288,7 +3294,7 @@ static int ep_set_halt(struct usb_ep *ep, int value) int direction, retval = 0; unsigned long flags; - trace("%p, %i", ep, value); + trace("%pK, %i", ep, value); if (ep == NULL || mEp->desc == NULL) return -EINVAL; @@ -3339,7 +3345,7 @@ static int ep_set_wedge(struct usb_ep *ep) struct ci13xxx_ep *mEp = container_of(ep, struct ci13xxx_ep, ep); unsigned long flags; - trace("%p", ep); + trace("%pK", ep); if (ep == NULL || mEp->desc == NULL) return -EINVAL; @@ -3365,7 +3371,7 @@ static void ep_fifo_flush(struct usb_ep *ep) struct ci13xxx_ep *mEp = container_of(ep, struct ci13xxx_ep, ep); unsigned long flags; - trace("%p", ep); + trace("%pK", ep); if (ep == NULL) { err("%02X: -EINVAL", _usb_addr(mEp)); @@ -3427,21 +3433,28 @@ static int ci13xxx_vbus_session(struct usb_gadget *_gadget, int is_active) gadget_ready = 1; spin_unlock_irqrestore(udc->lock, flags); - if (gadget_ready) { - if (is_active) { - hw_device_reset(udc); - if (udc->udc_driver->notify_event) - udc->udc_driver->notify_event(udc, - CI13XXX_CONTROLLER_CONNECT_EVENT); - if (udc->softconnect) - hw_device_state(udc->ep0out.qh.dma); - } else { - hw_device_state(0); - _gadget_stop_activity(&udc->gadget); - if (udc->udc_driver->notify_event) - udc->udc_driver->notify_event(udc, - CI13XXX_CONTROLLER_DISCONNECT_EVENT); + if (!gadget_ready) + return 0; + + if (is_active) { + hw_device_reset(udc); + if (udc->udc_driver->notify_event) + udc->udc_driver->notify_event(udc, + CI13XXX_CONTROLLER_CONNECT_EVENT); + /* Enable BAM (if needed) before starting controller */ + if (udc->softconnect) { + dbg_event(0xFF, "BAM EN2", + _gadget->bam2bam_func_enabled); + msm_usb_bam_enable(CI_CTRL, + _gadget->bam2bam_func_enabled); + hw_device_state(udc->ep0out.qh.dma); } + } else { + hw_device_state(0); + _gadget_stop_activity(&udc->gadget); + if (udc->udc_driver->notify_event) + udc->udc_driver->notify_event(udc, + CI13XXX_CONTROLLER_DISCONNECT_EVENT); } return 0; @@ -3488,6 +3501,12 @@ static int ci13xxx_pullup(struct usb_gadget *_gadget, int is_active) pm_runtime_get_sync(&_gadget->dev); + /* Enable BAM (if needed) before starting controller */ + if (is_active) { + dbg_event(0xFF, "BAM EN1", _gadget->bam2bam_func_enabled); + msm_usb_bam_enable(CI_CTRL, _gadget->bam2bam_func_enabled); + } + spin_lock_irqsave(udc->lock, flags); if (!udc->vbus_active) { spin_unlock_irqrestore(udc->lock, flags); @@ -3545,7 +3564,7 @@ static int ci13xxx_start(struct usb_gadget *gadget, unsigned long flags; int retval = -ENOMEM; - trace("%p", driver); + trace("%pK", driver); if (driver == NULL || driver->setup == NULL || @@ -3633,7 +3652,7 @@ static int ci13xxx_stop(struct usb_gadget *gadget, struct ci13xxx *udc = _udc; unsigned long flags; - trace("%p", driver); + trace("%pK", driver); if (driver == NULL || driver->unbind == NULL || @@ -3763,7 +3782,7 @@ static int udc_probe(struct ci13xxx_udc_driver *driver, struct device *dev, struct ci13xxx_platform_data *pdata; int retval = 0, i, j; - trace("%p, %p, %p", dev, regs, driver->name); + trace("%pK, %pK, %pK", dev, regs, driver->name); if (dev == NULL || regs == NULL || driver == NULL || driver->name == NULL) diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 777e634a70e5f..1540bf2f5a317 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c @@ -2,6 +2,7 @@ * composite.c - infrastructure for Composite USB Gadgets * * Copyright (C) 2006-2008 David Brownell + * Copyright (C) 2018 XiaoMi, Inc. * * 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 @@ -27,7 +28,12 @@ #define SSUSB_GADGET_VBUS_DRAW 900 /* in mA */ #define SSUSB_GADGET_VBUS_DRAW_UNITS 8 #define HSUSB_GADGET_VBUS_DRAW_UNITS 2 - +#ifdef WT_COMPILE_FACTORY_VERSION +#undef dev_dbg +#define dev_dbg dev_info +#undef pr_debug +#define pr_debug pr_info +#endif static bool enable_l1_for_hs; module_param(enable_l1_for_hs, bool, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(enable_l1_for_hs, "Enable support for L1 LPM for HS devices"); @@ -208,7 +214,7 @@ int usb_add_function(struct usb_configuration *config, { int value = -EINVAL; - DBG(config->cdev, "adding '%s'/%p to config '%s'/%p\n", + DBG(config->cdev, "adding '%s'/%pK to config '%s'/%pK\n", function->name, function, config->label, config); @@ -243,7 +249,7 @@ int usb_add_function(struct usb_configuration *config, done: if (value) - DBG(config->cdev, "adding '%s'/%p --> %d\n", + DBG(config->cdev, "adding '%s'/%pK --> %d\n", function->name, function, value); return value; } @@ -847,7 +853,7 @@ static int set_config(struct usb_composite_dev *cdev, result = f->set_alt(f, tmp, 0); if (result < 0) { - DBG(cdev, "interface %d (%s/%p) alt 0 --> %d\n", + DBG(cdev, "interface %d (%s/%pK) alt 0 --> %d\n", tmp, f->name, f, result); reset_config(cdev); @@ -926,7 +932,7 @@ int usb_add_config(struct usb_composite_dev *cdev, if (!bind) goto done; - DBG(cdev, "adding config #%u '%s'/%p\n", + DBG(cdev, "adding config #%u '%s'/%pK\n", config->bConfigurationValue, config->label, config); @@ -943,7 +949,7 @@ int usb_add_config(struct usb_composite_dev *cdev, struct usb_function, list); list_del(&f->list); if (f->unbind) { - DBG(cdev, "unbind function '%s'/%p\n", + DBG(cdev, "unbind function '%s'/%pK\n", f->name, f); f->unbind(config, f); /* may free memory for "f" */ @@ -954,7 +960,7 @@ int usb_add_config(struct usb_composite_dev *cdev, } else { unsigned i; - DBG(cdev, "cfg %d/%p speeds:%s%s%s\n", + DBG(cdev, "cfg %d/%pK speeds:%s%s%s\n", config->bConfigurationValue, config, config->superspeed ? " super" : "", config->highspeed ? " high" : "", @@ -969,7 +975,7 @@ int usb_add_config(struct usb_composite_dev *cdev, if (!f) continue; - DBG(cdev, " interface %d = %s/%p\n", + DBG(cdev, " interface %d = %s/%pK\n", i, f->name, f); } } @@ -997,13 +1003,13 @@ static void unbind_config(struct usb_composite_dev *cdev, struct usb_function, list); list_del(&f->list); if (f->unbind) { - DBG(cdev, "unbind function '%s'/%p\n", f->name, f); + DBG(cdev, "unbind function '%s'/%pK\n", f->name, f); f->unbind(config, f); /* may free memory for "f" */ } } if (config->unbind) { - DBG(cdev, "unbind config '%s'/%p\n", config->label, config); + DBG(cdev, "unbind config '%s'/%pK\n", config->label, config); config->unbind(config); /* may free memory for "c" */ } @@ -1673,7 +1679,9 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) if (!gadget_is_dualspeed(gadget) || gadget->speed >= USB_SPEED_SUPER) break; + spin_lock(&cdev->lock); device_qual(cdev); + spin_unlock(&cdev->lock); value = min_t(int, w_length, sizeof(struct usb_qualifier_descriptor)); break; @@ -1683,7 +1691,9 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) break; /* FALLTHROUGH */ case USB_DT_CONFIG: + spin_lock(&cdev->lock); value = config_desc(cdev, w_value); + spin_unlock(&cdev->lock); if (value >= 0) value = min(w_length, (u16) value); break; diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c index 77b2ea7431f0b..29cbc5e0fe7fd 100644 --- a/drivers/usb/gadget/configfs.c +++ b/drivers/usb/gadget/configfs.c @@ -130,21 +130,28 @@ struct gadget_config_name { struct list_head list; }; +#define MAX_USB_STRING_LEN 126 +#define MAX_USB_STRING_WITH_NULL_LEN (MAX_USB_STRING_LEN+1) + static int usb_string_copy(const char *s, char **s_copy) { int ret; char *str; char *copy = *s_copy; ret = strlen(s); - if (ret > 126) + if (ret > MAX_USB_STRING_LEN) return -EOVERFLOW; - str = kstrdup(s, GFP_KERNEL); - if (!str) - return -ENOMEM; + if (copy) { + str = copy; + } else { + str = kmalloc(MAX_USB_STRING_WITH_NULL_LEN, GFP_KERNEL); + if (!str) + return -ENOMEM; + } + strncpy(str, s, MAX_USB_STRING_WITH_NULL_LEN); if (str[ret - 1] == '\n') str[ret - 1] = '\0'; - kfree(copy); *s_copy = str; return 0; } @@ -1326,7 +1333,7 @@ static void purge_configs_funcs(struct gadget_info *gi) list_move_tail(&f->list, &cfg->func_list); if (f->unbind) { dev_err(&gi->cdev.gadget->dev, "unbind function" - " '%s'/%p\n", f->name, f); + " '%s'/%pK\n", f->name, f); f->unbind(c, f); } } @@ -1511,7 +1518,7 @@ static void android_work(struct work_struct *data) } if (!uevent_sent) { - pr_info("%s: did not send uevent (%d %d %p)\n", __func__, + pr_info("%s: did not send uevent (%d %d %pK)\n", __func__, gi->connected, gi->sw_connected, cdev->config); } } diff --git a/drivers/usb/gadget/function/f_accessory.c b/drivers/usb/gadget/function/f_accessory.c index 19f945b5e57f0..27b2926f16bec 100644 --- a/drivers/usb/gadget/function/f_accessory.c +++ b/drivers/usb/gadget/function/f_accessory.c @@ -448,12 +448,19 @@ static void acc_hid_close(struct hid_device *hid) { } +static int acc_hid_raw_request(struct hid_device *hid, unsigned char reportnum, + __u8 *buf, size_t len, unsigned char rtype, int reqtype) +{ + return 0; +} + static struct hid_ll_driver acc_hid_ll_driver = { .parse = acc_hid_parse, .start = acc_hid_start, .stop = acc_hid_stop, .open = acc_hid_open, .close = acc_hid_close, + .raw_request = acc_hid_raw_request, }; static struct acc_hid_dev *acc_hid_new(struct acc_dev *dev, @@ -548,7 +555,7 @@ static int create_bulk_endpoints(struct acc_dev *dev, struct usb_ep *ep; int i; - DBG(cdev, "create_bulk_endpoints dev: %p\n", dev); + DBG(cdev, "create_bulk_endpoints dev: %pK\n", dev); ep = usb_ep_autoconfig(cdev->gadget, in_desc); if (!ep) { @@ -651,7 +658,7 @@ static ssize_t acc_read(struct file *fp, char __user *buf, r = -EIO; goto done; } else { - pr_debug("rx %p queue\n", req); + pr_debug("rx %pK queue\n", req); } /* wait for a request to complete */ @@ -674,7 +681,7 @@ static ssize_t acc_read(struct file *fp, char __user *buf, if (req->actual == 0) goto requeue_req; - pr_debug("rx %p %u\n", req, req->actual); + pr_debug("rx %pK %u\n", req, req->actual); xfer = (req->actual < count) ? req->actual : count; r = xfer; if (copy_to_user(buf, req->buf, xfer)) @@ -974,7 +981,7 @@ __acc_function_bind(struct usb_configuration *c, int id; int ret; - DBG(cdev, "acc_function_bind dev: %p\n", dev); + DBG(cdev, "acc_function_bind dev: %pK\n", dev); if (configfs) { if (acc_string_defs[INTERFACE_STRING_INDEX].id == 0) { @@ -1161,7 +1168,7 @@ static void acc_hid_work(struct work_struct *data) list_for_each_safe(entry, temp, &new_list) { hid = list_entry(entry, struct acc_hid_dev, list); if (acc_hid_init(hid)) { - pr_err("can't add HID device %p\n", hid); + pr_err("can't add HID device %pK\n", hid); acc_hid_delete(hid); } else { spin_lock_irqsave(&dev->lock, flags); diff --git a/drivers/usb/gadget/function/f_acm.c b/drivers/usb/gadget/function/f_acm.c index ba830348ad4d4..2126b5e1f753d 100644 --- a/drivers/usb/gadget/function/f_acm.c +++ b/drivers/usb/gadget/function/f_acm.c @@ -137,7 +137,7 @@ static int acm_port_connect(struct f_acm *acm) port_num = gacm_ports[acm->port_num].client_port_num; - pr_debug("%s: transport:%s f_acm:%p gserial:%p port_num:%d cl_port_no:%d\n", + pr_debug("%s: transport:%s f_acm:%pK gserial:%pK port_num:%d cl_port_no:%d\n", __func__, xport_to_str(acm->transport), acm, &acm->port, acm->port_num, port_num); @@ -163,7 +163,7 @@ static int acm_port_disconnect(struct f_acm *acm) port_num = gacm_ports[acm->port_num].client_port_num; - pr_debug("%s: transport:%s f_acm:%p gserial:%p port_num:%d cl_pno:%d\n", + pr_debug("%s: transport:%s f_acm:%pK gserial:%pK port_num:%d cl_pno:%d\n", __func__, xport_to_str(acm->transport), acm, &acm->port, acm->port_num, port_num); @@ -833,7 +833,7 @@ acm_bind(struct usb_configuration *c, struct usb_function *f) if (acm->port.in) acm->port.in->driver_data = NULL; - ERROR(cdev, "%s/%p: can't bind, err %d\n", f->name, f, status); + ERROR(cdev, "%s/%pK: can't bind, err %d\n", f->name, f, status); return status; } diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index e389c27d8e202..efa6ec31c08e2 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -689,7 +689,6 @@ static void ffs_user_copy_worker(struct work_struct *work) usb_ep_free_request(io_data->ep, io_data->req); - io_data->kiocb->private = NULL; if (io_data->read) kfree(io_data->iovec); kfree(io_data->buf); @@ -1579,14 +1578,14 @@ static void ffs_data_clear(struct ffs_data *ffs) { ENTER(); - pr_debug("%s: ffs->gadget= %p, ffs->flags= %lu\n", __func__, + pr_debug("%s: ffs->gadget= %pK, ffs->flags= %lu\n", __func__, ffs->gadget, ffs->flags); ffs_closed(ffs); /* Dump ffs->gadget and ffs->flags */ if (ffs->gadget) - pr_err("%s: ffs:%p ffs->gadget= %p, ffs->flags= %lu\n", + pr_err("%s: ffs:%pK ffs->gadget= %pK, ffs->flags= %lu\n", __func__, ffs, ffs->gadget, ffs->flags); BUG_ON(ffs->gadget); diff --git a/drivers/usb/gadget/function/f_gps.c b/drivers/usb/gadget/function/f_gps.c index 075a152141358..1e0cfd33ff398 100644 --- a/drivers/usb/gadget/function/f_gps.c +++ b/drivers/usb/gadget/function/f_gps.c @@ -292,7 +292,7 @@ gps_set_alt(struct usb_function *f, unsigned intf, unsigned alt) int ret; struct list_head *cpkt; - pr_debug("%s:dev:%p\n", __func__, dev); + pr_debug("%s:dev:%pK\n", __func__, dev); if (dev->notify->driver_data) usb_ep_disable(dev->notify); @@ -333,7 +333,7 @@ static void gps_ctrl_response_available(struct f_gps *dev) int ret; struct rmnet_ctrl_pkt *cpkt; - pr_debug("%s:dev:%p\n", __func__, dev); + pr_debug("%s:dev:%pK\n", __func__, dev); spin_lock_irqsave(&dev->lock, flags); if (!atomic_read(&dev->online) || !req || !req->buf) { @@ -380,7 +380,7 @@ static void gps_connect(struct grmnet *gr) struct f_gps *dev; if (!gr) { - pr_err("%s: Invalid grmnet:%p\n", __func__, gr); + pr_err("%s: Invalid grmnet:%pK\n", __func__, gr); return; } @@ -394,7 +394,7 @@ static void gps_disconnect(struct grmnet *gr) struct f_gps *dev; if (!gr) { - pr_err("%s: Invalid grmnet:%p\n", __func__, gr); + pr_err("%s: Invalid grmnet:%pK\n", __func__, gr); return; } @@ -420,7 +420,7 @@ gps_send_cpkt_response(void *gr, void *buf, size_t len) unsigned long flags; if (!gr || !buf) { - pr_err("%s: Invalid grmnet/buf, grmnet:%p buf:%p\n", + pr_err("%s: Invalid grmnet/buf, grmnet:%pK buf:%pK\n", __func__, gr, buf); return -ENODEV; } @@ -434,7 +434,7 @@ gps_send_cpkt_response(void *gr, void *buf, size_t len) dev = port_to_gps(gr); - pr_debug("%s: dev:%p\n", __func__, dev); + pr_debug("%s: dev:%pK\n", __func__, dev); if (!atomic_read(&dev->online) || !atomic_read(&dev->ctrl_online)) { gps_free_ctrl_pkt(cpkt); @@ -461,7 +461,7 @@ gps_cmd_complete(struct usb_ep *ep, struct usb_request *req) return; } - pr_debug("%s: dev:%p\n", __func__, dev); + pr_debug("%s: dev:%pK\n", __func__, dev); cdev = dev->cdev; @@ -476,7 +476,7 @@ static void gps_notify_complete(struct usb_ep *ep, struct usb_request *req) unsigned long flags; struct rmnet_ctrl_pkt *cpkt; - pr_debug("%s: dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s: dev:%pK port#%d\n", __func__, dev, dev->port_num); switch (status) { case -ECONNRESET: @@ -529,7 +529,7 @@ gps_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) u16 w_length = le16_to_cpu(ctrl->wLength); int ret = -EOPNOTSUPP; - pr_debug("%s:dev:%p\n", __func__, dev); + pr_debug("%s:dev:%pK\n", __func__, dev); if (!atomic_read(&dev->online)) { pr_debug("%s: usb cable is not connected\n", __func__); @@ -700,7 +700,7 @@ static int gps_bind_config(struct usb_configuration *c) struct usb_function *f; unsigned long flags; - pr_debug("%s: usb config:%p\n", __func__, c); + pr_debug("%s: usb config:%pK\n", __func__, c); if (gps_string_defs[0].id == 0) { status = usb_string_id(c->cdev); diff --git a/drivers/usb/gadget/function/f_gsi.c b/drivers/usb/gadget/function/f_gsi.c index 380f62f529496..51110b1a16e0d 100644 --- a/drivers/usb/gadget/function/f_gsi.c +++ b/drivers/usb/gadget/function/f_gsi.c @@ -1053,7 +1053,7 @@ static int gsi_ctrl_dev_open(struct inode *ip, struct file *fp) ctrl_device); if (!c_port) { - log_event_err("%s: gsi ctrl port %p", __func__, c_port); + log_event_err("%s: gsi ctrl port %pK", __func__, c_port); return -ENODEV; } @@ -1076,7 +1076,7 @@ static int gsi_ctrl_dev_release(struct inode *ip, struct file *fp) ctrl_device); if (!c_port) { - log_event_err("%s: gsi ctrl port %p", __func__, c_port); + log_event_err("%s: gsi ctrl port %pK", __func__, c_port); return -ENODEV; } @@ -1101,7 +1101,7 @@ gsi_ctrl_dev_read(struct file *fp, char __user *buf, size_t count, loff_t *pos) log_event_dbg("%s: Enter %zu", __func__, count); if (!c_port) { - log_event_err("%s: gsi ctrl port %p", __func__, c_port); + log_event_err("%s: gsi ctrl port %pK", __func__, c_port); return -ENODEV; } @@ -1173,7 +1173,7 @@ static ssize_t gsi_ctrl_dev_write(struct file *fp, const char __user *buf, log_event_dbg("Enter %zu", count); if (!c_port || !req || !req->buf) { - log_event_err("%s: c_port %p req %p req->buf %p", + log_event_err("%s: c_port %pK req %pK req->buf %pK", __func__, c_port, req, req ? req->buf : req); return -ENODEV; } @@ -1233,7 +1233,7 @@ static long gsi_ctrl_dev_ioctl(struct file *fp, unsigned cmd, int val, ret = 0; if (!c_port) { - log_event_err("%s: gsi ctrl port %p", __func__, c_port); + log_event_err("%s: gsi ctrl port %pK", __func__, c_port); return -ENODEV; } @@ -1350,7 +1350,7 @@ static unsigned int gsi_ctrl_dev_poll(struct file *fp, poll_table *wait) unsigned int mask = 0; if (!c_port) { - log_event_err("%s: gsi ctrl port %p", __func__, c_port); + log_event_err("%s: gsi ctrl port %pK", __func__, c_port); return -ENODEV; } @@ -1469,7 +1469,7 @@ void gsi_rndis_ipa_reset_trigger(void) unsigned long flags; if (!rndis) { - log_event_err("%s: gsi prot ctx is %p", __func__, rndis); + log_event_err("%s: gsi prot ctx is %pK", __func__, rndis); return; } @@ -1490,7 +1490,7 @@ void gsi_rndis_flow_ctrl_enable(bool enable) struct gsi_data_port *d_port; if (!rndis) { - log_event_err("%s: gsi prot ctx is %p", __func__, rndis); + log_event_err("%s: gsi prot ctx is %pK", __func__, rndis); return; } @@ -1746,7 +1746,7 @@ gsi_ctrl_set_ntb_cmd_complete(struct usb_ep *ep, struct usb_request *req) struct f_gsi *gsi = req->context; struct gsi_ntb_info *ntb = NULL; - log_event_dbg("dev:%p", gsi); + log_event_dbg("dev:%pK", gsi); req->context = NULL; if (req->status || req->actual != req->length) { diff --git a/drivers/usb/gadget/function/f_mbim.c b/drivers/usb/gadget/function/f_mbim.c index 017a2a9cb6ea6..84c0066823bc5 100644 --- a/drivers/usb/gadget/function/f_mbim.c +++ b/drivers/usb/gadget/function/f_mbim.c @@ -741,7 +741,7 @@ static void mbim_notify_complete(struct usb_ep *ep, struct usb_request *req) struct f_mbim *mbim = req->context; struct usb_cdc_notification *event = req->buf; - pr_debug("dev:%p\n", mbim); + pr_debug("dev:%pK\n", mbim); spin_lock(&mbim->lock); switch (req->status) { @@ -771,7 +771,7 @@ static void mbim_notify_complete(struct usb_ep *ep, struct usb_request *req) mbim_do_notify(mbim); spin_unlock(&mbim->lock); - pr_debug("dev:%p Exit\n", mbim); + pr_debug("dev:%pK Exit\n", mbim); } static void mbim_ep0out_complete(struct usb_ep *ep, struct usb_request *req) @@ -782,7 +782,7 @@ static void mbim_ep0out_complete(struct usb_ep *ep, struct usb_request *req) struct f_mbim *mbim = func_to_mbim(f); struct mbim_ntb_input_size *ntb = NULL; - pr_debug("dev:%p\n", mbim); + pr_debug("dev:%pK\n", mbim); req->context = NULL; if (req->status || req->actual != req->length) { @@ -820,7 +820,7 @@ static void mbim_ep0out_complete(struct usb_ep *ep, struct usb_request *req) invalid: usb_ep_set_halt(ep); - pr_err("dev:%p Failed\n", mbim); + pr_err("dev:%pK Failed\n", mbim); return; } @@ -855,7 +855,7 @@ fmbim_cmd_complete(struct usb_ep *ep, struct usb_request *req) if (!first_command_sent) first_command_sent = true; - pr_debug("dev:%p port#%d\n", dev, dev->port_num); + pr_debug("dev:%pK port#%d\n", dev, dev->port_num); cpkt = mbim_alloc_ctrl_pkt(len, GFP_ATOMIC); if (!cpkt) { @@ -1195,7 +1195,7 @@ static int mbim_set_alt(struct usb_function *f, unsigned intf, unsigned alt) return ret; } - pr_info("Set mbim port in_desc = 0x%p\n", + pr_info("Set mbim port in_desc = 0x%pK\n", mbim->bam_port.in->desc); ret = config_ep_by_speed(cdev->gadget, f, @@ -1207,7 +1207,7 @@ static int mbim_set_alt(struct usb_function *f, unsigned intf, unsigned alt) return ret; } - pr_info("Set mbim port out_desc = 0x%p\n", + pr_info("Set mbim port out_desc = 0x%pK\n", mbim->bam_port.out->desc); pr_debug("Activate mbim\n"); @@ -1832,7 +1832,7 @@ mbim_write(struct file *fp, const char __user *buf, size_t count, loff_t *pos) pr_debug("Enter(%zu)\n", count); if (!dev || !req || !req->buf) { - pr_err("%s: dev %p req %p req->buf %p\n", + pr_err("%s: dev %pK req %pK req->buf %pK\n", __func__, dev, req, req ? req->buf : req); return -ENODEV; } @@ -1854,7 +1854,7 @@ mbim_write(struct file *fp, const char __user *buf, size_t count, loff_t *pos) } if (dev->not_port.notify_state != MBIM_NOTIFY_RESPONSE_AVAILABLE) { - pr_err("dev:%p state=%d error\n", dev, + pr_err("dev:%pK state=%d error\n", dev, dev->not_port.notify_state); mbim_unlock(&dev->write_excl); return -EINVAL; @@ -2030,7 +2030,7 @@ static long mbim_ioctl(struct file *fp, unsigned cmd, unsigned long arg) default: ret = -ENODEV; pr_err("unknown transport\n"); - break; + goto fail; } ret = copy_to_user((void __user *)arg, &info, @@ -2046,6 +2046,7 @@ static long mbim_ioctl(struct file *fp, unsigned cmd, unsigned long arg) ret = -EINVAL; } +fail: mbim_unlock(&mbim->ioctl_excl); return ret; diff --git a/drivers/usb/gadget/function/f_midi.c b/drivers/usb/gadget/function/f_midi.c index a3d9831b71857..46839f01e7690 100644 --- a/drivers/usb/gadget/function/f_midi.c +++ b/drivers/usb/gadget/function/f_midi.c @@ -92,6 +92,8 @@ struct f_midi { unsigned int buflen, qlen; }; +static struct f_midi *the_midi; + static inline struct f_midi *func_to_midi(struct usb_function *f) { return container_of(f, struct f_midi, func); @@ -170,6 +172,15 @@ static struct usb_endpoint_descriptor bulk_in_desc = { .bmAttributes = USB_ENDPOINT_XFER_BULK, }; +static struct usb_ss_ep_comp_descriptor midi_ss_bulk_comp_desc = { + .bLength = sizeof(midi_ss_bulk_comp_desc), + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, + + /* the following 2 values can be tweaked if necessary */ + /* .bMaxBurst = 0, */ + /* .bmAttributes = 0, */ +}; + /* B.6.2 Class-specific MS Bulk IN Endpoint Descriptor */ static struct usb_ms_endpoint_descriptor_16 ms_in_desc = { /* .bLength = DYNAMIC */ @@ -406,13 +417,14 @@ static void f_midi_unbind(struct usb_configuration *c, struct usb_function *f) card = midi->card; midi->card = NULL; if (card) - snd_card_free(card); + snd_card_free_when_closed(card); kfree(midi->id); midi->id = NULL; usb_free_all_descriptors(f); kfree(midi); + the_midi = NULL; } static int f_midi_snd_free(struct snd_device *device) @@ -586,6 +598,10 @@ static int f_midi_in_open(struct snd_rawmidi_substream *substream) { struct f_midi *midi = substream->rmidi->private_data; + /* check if midi got disabled or re-enabled quickly */ + if (midi != the_midi) + return -ENODEV; + if (!midi->in_port[substream->number]) return -EINVAL; @@ -607,6 +623,10 @@ static void f_midi_in_trigger(struct snd_rawmidi_substream *substream, int up) { struct f_midi *midi = substream->rmidi->private_data; + /* check if midi got disabled or re-enabled quickly */ + if (midi != the_midi) + return; + if (!midi->in_port[substream->number]) return; @@ -620,6 +640,10 @@ static int f_midi_out_open(struct snd_rawmidi_substream *substream) { struct f_midi *midi = substream->rmidi->private_data; + /* check if midi got disabled or re-enabled quickly */ + if (midi != the_midi) + return -ENODEV; + if (substream->number >= MAX_PORTS) return -EINVAL; @@ -640,6 +664,10 @@ static void f_midi_out_trigger(struct snd_rawmidi_substream *substream, int up) { struct f_midi *midi = substream->rmidi->private_data; + /* check if midi got disabled or re-enabled quickly */ + if (midi != the_midi) + return; + VDBG(midi, "%s()\n", __func__); if (up) @@ -734,13 +762,14 @@ static int /* __init */ f_midi_bind(struct usb_configuration *c, struct usb_function *f) { struct usb_descriptor_header **midi_function; + struct usb_descriptor_header **midi_ss_function; struct usb_midi_in_jack_descriptor jack_in_ext_desc[MAX_PORTS]; struct usb_midi_in_jack_descriptor jack_in_emb_desc[MAX_PORTS]; struct usb_midi_out_jack_descriptor_1 jack_out_ext_desc[MAX_PORTS]; struct usb_midi_out_jack_descriptor_1 jack_out_emb_desc[MAX_PORTS]; struct usb_composite_dev *cdev = c->cdev; struct f_midi *midi = func_to_midi(f); - int status, n, jack = 1, i = 0; + int status, n, jack = 1, i = 0, j = 0; /* maybe allocate device-global string ID */ if (midi_string_defs[0].id == 0) { @@ -775,11 +804,20 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) goto fail; midi->out_ep->driver_data = cdev; /* claim */ + /* allocate temporary function list for ss */ + midi_ss_function = kcalloc((MAX_PORTS * 4) + 11, + sizeof(*midi_ss_function), GFP_KERNEL); + if (!midi_ss_function) { + status = -ENOMEM; + goto fail; + } + /* allocate temporary function list */ midi_function = kcalloc((MAX_PORTS * 4) + 9, sizeof(*midi_function), GFP_KERNEL); if (!midi_function) { status = -ENOMEM; + kfree(midi_ss_function); goto fail; } @@ -793,6 +831,12 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) midi_function[i++] = (struct usb_descriptor_header *) &ac_interface_desc; midi_function[i++] = (struct usb_descriptor_header *) &ac_header_desc; midi_function[i++] = (struct usb_descriptor_header *) &ms_interface_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &ac_interface_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &ac_header_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &ms_interface_desc; /* calculate the header's wTotalLength */ n = USB_DT_MS_HEADER_SIZE @@ -801,6 +845,8 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) ms_header_desc.wTotalLength = cpu_to_le16(n); midi_function[i++] = (struct usb_descriptor_header *) &ms_header_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &ms_header_desc; /* configure the external IN jacks, each linked to an embedded OUT jack */ for (n = 0; n < midi->in_ports; n++) { @@ -814,6 +860,7 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) in_ext->bJackID = jack++; in_ext->iJack = 0; midi_function[i++] = (struct usb_descriptor_header *) in_ext; + midi_ss_function[j++] = (struct usb_descriptor_header *) in_ext; out_emb->bLength = USB_DT_MIDI_OUT_SIZE(1); out_emb->bDescriptorType = USB_DT_CS_INTERFACE; @@ -825,6 +872,8 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) out_emb->pins[0].baSourceID = in_ext->bJackID; out_emb->iJack = 0; midi_function[i++] = (struct usb_descriptor_header *) out_emb; + midi_ss_function[j++] = + (struct usb_descriptor_header *) out_emb; /* link it to the endpoint */ ms_in_desc.baAssocJackID[n] = out_emb->bJackID; @@ -842,6 +891,7 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) in_emb->bJackID = jack++; in_emb->iJack = 0; midi_function[i++] = (struct usb_descriptor_header *) in_emb; + midi_ss_function[j++] = (struct usb_descriptor_header *) in_emb; out_ext->bLength = USB_DT_MIDI_OUT_SIZE(1); out_ext->bDescriptorType = USB_DT_CS_INTERFACE; @@ -853,6 +903,8 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) out_ext->pins[0].baSourceID = in_emb->bJackID; out_ext->pins[0].baSourcePin = 1; midi_function[i++] = (struct usb_descriptor_header *) out_ext; + midi_ss_function[j++] = + (struct usb_descriptor_header *) out_ext; /* link it to the endpoint */ ms_out_desc.baAssocJackID[n] = in_emb->bJackID; @@ -872,6 +924,16 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) midi_function[i++] = (struct usb_descriptor_header *) &ms_in_desc; midi_function[i++] = NULL; + midi_ss_function[j++] = (struct usb_descriptor_header *) &bulk_out_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &midi_ss_bulk_comp_desc; + midi_ss_function[j++] = (struct usb_descriptor_header *) &ms_out_desc; + midi_ss_function[j++] = (struct usb_descriptor_header *) &bulk_in_desc; + midi_ss_function[j++] = + (struct usb_descriptor_header *) &midi_ss_bulk_comp_desc; + midi_ss_function[j++] = (struct usb_descriptor_header *) &ms_in_desc; + midi_ss_function[j++] = NULL; + /* * support all relevant hardware speeds... we expect that when * hardware is dual speed, all bulk-capable endpoints work at @@ -890,13 +952,23 @@ f_midi_bind(struct usb_configuration *c, struct usb_function *f) goto fail_f_midi; } + if (gadget_is_superspeed(c->cdev->gadget)) { + bulk_in_desc.wMaxPacketSize = cpu_to_le16(1024); + bulk_out_desc.wMaxPacketSize = cpu_to_le16(1024); + f->ss_descriptors = usb_copy_descriptors(midi_ss_function); + if (!f->ss_descriptors) + goto fail_f_midi; + } + kfree(midi_function); + kfree(midi_ss_function); return 0; fail_f_midi: kfree(midi_function); usb_free_descriptors(f->hs_descriptors); + kfree(midi_ss_function); fail: /* we might as well release our claims on endpoints */ if (midi->out_ep) @@ -985,6 +1057,7 @@ int /* __init */ f_midi_bind_config(struct usb_configuration *c, if (status) goto setup_fail; + the_midi = midi; if (config) { config->card = midi->rmidi->card->number; diff --git a/drivers/usb/gadget/function/f_mtp.c b/drivers/usb/gadget/function/f_mtp.c index a11fdcd848441..2f8203a39c45c 100644 --- a/drivers/usb/gadget/function/f_mtp.c +++ b/drivers/usb/gadget/function/f_mtp.c @@ -519,7 +519,7 @@ static int mtp_create_bulk_endpoints(struct mtp_dev *dev, size_t extra_buf_alloc = cdev->gadget->extra_buf_alloc; int i; - DBG(cdev, "create_bulk_endpoints dev: %p\n", dev); + DBG(cdev, "create_bulk_endpoints dev: %pK\n", dev); ep = usb_ep_autoconfig(cdev->gadget, in_desc); if (!ep) { @@ -654,7 +654,7 @@ static ssize_t mtp_read(struct file *fp, char __user *buf, r = -EIO; goto done; } else { - DBG(cdev, "rx %p queue\n", req); + DBG(cdev, "rx %pK queue\n", req); } /* wait for a request to complete */ @@ -679,7 +679,7 @@ static ssize_t mtp_read(struct file *fp, char __user *buf, if (req->actual == 0) goto requeue_req; - DBG(cdev, "rx %p %d\n", req, req->actual); + DBG(cdev, "rx %pK %d\n", req, req->actual); xfer = (req->actual < count) ? req->actual : count; r = xfer; if (copy_to_user(buf, req->buf, xfer)) @@ -815,6 +815,11 @@ static void send_file_work(struct work_struct *data) offset = dev->xfer_file_offset; count = dev->xfer_file_length; + if (count < 0) { + dev->xfer_result = -EINVAL; + return; + } + DBG(cdev, "send_file_work(%lld %lld)\n", offset, count); if (dev->xfer_send_header) { @@ -934,6 +939,11 @@ static void receive_file_work(struct work_struct *data) offset = dev->xfer_file_offset; count = dev->xfer_file_length; + if (count < 0) { + dev->xfer_result = -EINVAL; + return; + } + DBG(cdev, "receive_file_work(%lld)\n", count); if (!IS_ALIGNED(count, dev->ep_out->maxpacket)) DBG(cdev, "%s- count(%lld) not multiple of mtu(%d)\n", __func__, @@ -959,7 +969,7 @@ static void receive_file_work(struct work_struct *data) } if (write_req) { - DBG(cdev, "rx %p %d\n", write_req, write_req->actual); + DBG(cdev, "rx %pK %d\n", write_req, write_req->actual); start_time = ktime_get(); ret = vfs_write(filp, write_req->buf, write_req->actual, &offset); @@ -1393,7 +1403,7 @@ mtp_function_bind(struct usb_configuration *c, struct usb_function *f) int ret; dev->cdev = cdev; - DBG(cdev, "mtp_function_bind dev: %p\n", dev); + DBG(cdev, "mtp_function_bind dev: %pK\n", dev); /* allocate interface ID(s) */ id = usb_interface_id(c, f); @@ -1588,7 +1598,7 @@ static int debug_mtp_read_stats(struct seq_file *s, void *unused) } seq_printf(s, "vfs_write(time in usec) min:%d\t max:%d\t avg:%d\n", - min, max, sum / iteration); + min, max, (iteration ? (sum / iteration) : 0)); min = max = sum = iteration = 0; seq_puts(s, "\n=======================\n"); seq_puts(s, "MTP Read Stats:\n"); @@ -1610,7 +1620,7 @@ static int debug_mtp_read_stats(struct seq_file *s, void *unused) } seq_printf(s, "vfs_read(time in usec) min:%d\t max:%d\t avg:%d\n", - min, max, sum / iteration); + min, max, (iteration ? (sum / iteration) : 0)); spin_unlock_irqrestore(&dev->lock, flags); return 0; } diff --git a/drivers/usb/gadget/function/f_obex.c b/drivers/usb/gadget/function/f_obex.c index a1b79c53499c2..a28459d209e5d 100644 --- a/drivers/usb/gadget/function/f_obex.c +++ b/drivers/usb/gadget/function/f_obex.c @@ -403,7 +403,7 @@ static int obex_bind(struct usb_configuration *c, struct usb_function *f) if (obex->port.in) obex->port.in->driver_data = NULL; - ERROR(cdev, "%s/%p: can't bind, err %d\n", f->name, f, status); + ERROR(cdev, "%s/%pK: can't bind, err %d\n", f->name, f, status); return status; } diff --git a/drivers/usb/gadget/function/f_qc_rndis.c b/drivers/usb/gadget/function/f_qc_rndis.c index 69d48b3e1a403..bef6a1ab3e5a7 100644 --- a/drivers/usb/gadget/function/f_qc_rndis.c +++ b/drivers/usb/gadget/function/f_qc_rndis.c @@ -1084,6 +1084,7 @@ rndis_qc_unbind(struct usb_configuration *c, struct usb_function *f) usb_free_descriptors(f->hs_descriptors); usb_free_descriptors(f->fs_descriptors); + c->cdev->gadget->bam2bam_func_enabled = false; kfree(rndis->notify_req->buf); usb_ep_free_request(rndis->notify, rndis->notify_req); @@ -1288,8 +1289,6 @@ rndis_qc_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], rndis->port.func.suspend = rndis_qc_suspend; rndis->port.func.resume = rndis_qc_resume; - _rndis_qc = rndis; - if (rndis->xport == USB_GADGET_XPORT_BAM2BAM_IPA) { status = rndis_ipa_init(&rndis_ipa_params); if (status) { @@ -1305,6 +1304,10 @@ rndis_qc_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], goto fail; } + _rndis_qc = rndis; + + c->cdev->gadget->bam2bam_func_enabled = true; + return 0; fail: @@ -1315,74 +1318,115 @@ rndis_qc_bind_config_vendor(struct usb_configuration *c, u8 ethaddr[ETH_ALEN], static int rndis_qc_open_dev(struct inode *ip, struct file *fp) { + int ret = 0; + unsigned long flags; pr_info("Open rndis QC driver\n"); + spin_lock_irqsave(&rndis_lock, flags); if (!_rndis_qc) { pr_err("rndis_qc_dev not created yet\n"); - return -ENODEV; + ret = -ENODEV; + goto fail; } if (rndis_qc_lock(&_rndis_qc->open_excl)) { pr_err("Already opened\n"); - return -EBUSY; + ret = -EBUSY; + goto fail; } fp->private_data = _rndis_qc; - pr_info("rndis QC file opened\n"); +fail: + spin_unlock_irqrestore(&rndis_lock, flags); - return 0; + if (!ret) + pr_info("rndis QC file opened\n"); + + return ret; } static int rndis_qc_release_dev(struct inode *ip, struct file *fp) { - struct f_rndis_qc *rndis = fp->private_data; - + unsigned long flags; pr_info("Close rndis QC file\n"); - rndis_qc_unlock(&rndis->open_excl); + spin_lock_irqsave(&rndis_lock, flags); + + if (!_rndis_qc) { + pr_err("rndis_qc_dev not present\n"); + spin_unlock_irqrestore(&rndis_lock, flags); + return -ENODEV; + } + rndis_qc_unlock(&_rndis_qc->open_excl); + spin_unlock_irqrestore(&rndis_lock, flags); return 0; } static long rndis_qc_ioctl(struct file *fp, unsigned cmd, unsigned long arg) { - struct f_rndis_qc *rndis = fp->private_data; + u8 qc_max_pkt_per_xfer = 0; + u32 qc_max_pkt_size = 0; int ret = 0; + unsigned long flags; - pr_info("Received command %d\n", cmd); + spin_lock_irqsave(&rndis_lock, flags); + if (!_rndis_qc) { + pr_err("rndis_qc_dev not present\n"); + ret = -ENODEV; + goto fail; + } - if (rndis_qc_lock(&rndis->ioctl_excl)) - return -EBUSY; + qc_max_pkt_per_xfer = _rndis_qc->ul_max_pkt_per_xfer; + qc_max_pkt_size = _rndis_qc->max_pkt_size; + + if (rndis_qc_lock(&_rndis_qc->ioctl_excl)) { + ret = -EBUSY; + goto fail; + } + + spin_unlock_irqrestore(&rndis_lock, flags); + + pr_info("Received command %d\n", cmd); switch (cmd) { case RNDIS_QC_GET_MAX_PKT_PER_XFER: ret = copy_to_user((void __user *)arg, - &rndis->ul_max_pkt_per_xfer, - sizeof(rndis->ul_max_pkt_per_xfer)); + &qc_max_pkt_per_xfer, + sizeof(qc_max_pkt_per_xfer)); if (ret) { pr_err("copying to user space failed\n"); ret = -EFAULT; } pr_info("Sent UL max packets per xfer %d\n", - rndis->ul_max_pkt_per_xfer); + qc_max_pkt_per_xfer); break; case RNDIS_QC_GET_MAX_PKT_SIZE: ret = copy_to_user((void __user *)arg, - &rndis->max_pkt_size, - sizeof(rndis->max_pkt_size)); + &qc_max_pkt_size, + sizeof(qc_max_pkt_size)); if (ret) { pr_err("copying to user space failed\n"); ret = -EFAULT; } pr_debug("Sent max packet size %d\n", - rndis->max_pkt_size); + qc_max_pkt_size); break; default: pr_err("Unsupported IOCTL\n"); ret = -EINVAL; } - rndis_qc_unlock(&rndis->ioctl_excl); + spin_lock_irqsave(&rndis_lock, flags); + + if (!_rndis_qc) { + pr_err("rndis_qc_dev not present\n"); + ret = -ENODEV; + goto fail; + } + rndis_qc_unlock(&_rndis_qc->ioctl_excl); +fail: + spin_unlock_irqrestore(&rndis_lock, flags); return ret; } @@ -1405,10 +1449,11 @@ static int rndis_qc_init(void) pr_info("initialize rndis QC instance\n"); + spin_lock_init(&rndis_lock); + ret = misc_register(&rndis_qc_device); if (ret) pr_err("rndis QC driver failed to register\n"); - spin_lock_init(&rndis_lock); ret = bam_data_setup(USB_FUNC_RNDIS, RNDIS_QC_NO_PORTS); if (ret) { diff --git a/drivers/usb/gadget/function/f_qdss.c b/drivers/usb/gadget/function/f_qdss.c index 9b0f4e4a7dc70..e60fb05220f2b 100644 --- a/drivers/usb/gadget/function/f_qdss.c +++ b/drivers/usb/gadget/function/f_qdss.c @@ -1,7 +1,7 @@ /* * f_qdss.c -- QDSS function Driver * - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-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 @@ -482,12 +482,16 @@ static void qdss_unbind(struct usb_configuration *c, struct usb_function *f) { struct f_qdss *qdss = func_to_qdss(f); struct usb_gadget *gadget = c->cdev->gadget; + enum transport_type dxport = qdss_ports[qdss->port_num].data_xport; int i; pr_debug("qdss_unbind\n"); flush_workqueue(qdss->wq); + if (dxport == USB_GADGET_XPORT_BAM2BAM_IPA) + ipa_data_flush_workqueue(); + c->cdev->gadget->bam2bam_func_enabled = false; clear_eps(f); clear_desc(gadget, f); @@ -716,7 +720,7 @@ static void usb_qdss_connect_work(struct work_struct *work) dxport = qdss_ports[qdss->port_num].data_xport; ctrl_xport = qdss_ports[qdss->port_num].ctrl_xport; port_num = qdss_ports[qdss->port_num].data_xport_num; - pr_debug("%s: data xport: %s dev: %p portno: %d\n", + pr_debug("%s: data xport: %s dev: %pK portno: %d\n", __func__, xport_to_str(dxport), qdss, qdss->port_num); if (qdss->port_num >= nr_qdss_ports) { @@ -822,7 +826,7 @@ static int qdss_set_alt(struct usb_function *f, unsigned intf, unsigned alt) dxport = qdss_ports[qdss->port_num].data_xport; - pr_debug("qdss_set_alt qdss pointer = %p\n", qdss); + pr_debug("qdss_set_alt qdss pointer = %pK\n", qdss); qdss->gadget = gadget; @@ -1040,6 +1044,9 @@ static int qdss_bind_config(struct usb_configuration *c, unsigned char portno) kfree(name); kfree(qdss); } + if (dxport == USB_GADGET_XPORT_BAM2BAM_IPA || + dxport == USB_GADGET_XPORT_BAM2BAM) + c->cdev->gadget->bam2bam_func_enabled = true; return status; } diff --git a/drivers/usb/gadget/function/f_rmnet.c b/drivers/usb/gadget/function/f_rmnet.c index df153571a9105..1b3f0940b7de8 100644 --- a/drivers/usb/gadget/function/f_rmnet.c +++ b/drivers/usb/gadget/function/f_rmnet.c @@ -383,7 +383,7 @@ static int gport_rmnet_connect(struct f_rmnet *dev, unsigned intf) enum usb_ctrl usb_bam_type; void *net; - pr_debug("%s: ctrl xport: %s data xport: %s dev: %p portno: %d\n", + pr_debug("%s: ctrl xport: %s data xport: %s dev: %pK portno: %d\n", __func__, xport_to_str(cxport), xport_to_str(dxport), dev, dev->port_num); @@ -504,7 +504,7 @@ static int gport_rmnet_disconnect(struct f_rmnet *dev) enum transport_type cxport = rmnet_ports[dev->port_num].ctrl_xport; enum transport_type dxport = rmnet_ports[dev->port_num].data_xport; - pr_debug("%s: ctrl xport: %s data xport: %s dev: %p portno: %d\n", + pr_debug("%s: ctrl xport: %s data xport: %s dev: %pK portno: %d\n", __func__, xport_to_str(cxport), xport_to_str(dxport), dev, dev->port_num); @@ -553,6 +553,7 @@ static int gport_rmnet_disconnect(struct f_rmnet *dev) static void frmnet_unbind(struct usb_configuration *c, struct usb_function *f) { struct f_rmnet *dev = func_to_rmnet(f); + enum transport_type dxport = rmnet_ports[dev->port_num].data_xport; pr_debug("%s: portno:%d\n", __func__, dev->port_num); if (gadget_is_superspeed(c->cdev->gadget)) @@ -562,7 +563,10 @@ static void frmnet_unbind(struct usb_configuration *c, struct usb_function *f) usb_free_descriptors(f->fs_descriptors); frmnet_free_req(dev->notify, dev->notify_req); - + if (dxport == USB_GADGET_XPORT_BAM2BAM_IPA) { + gbam_data_flush_workqueue(); + c->cdev->gadget->bam2bam_func_enabled = false; + } kfree(f->name); } @@ -597,7 +601,7 @@ static void frmnet_suspend(struct usb_function *f) else remote_wakeup_allowed = f->config->cdev->gadget->remote_wakeup; - pr_debug("%s: data xport: %s dev: %p portno: %d remote_wakeup: %d\n", + pr_debug("%s: data xport: %s dev: %pK portno: %d remote_wakeup: %d\n", __func__, xport_to_str(dxport), dev, dev->port_num, remote_wakeup_allowed); @@ -621,7 +625,7 @@ static void frmnet_suspend(struct usb_function *f) */ dev->in_ep_desc_backup = dev->port.in->desc; dev->out_ep_desc_backup = dev->port.out->desc; - pr_debug("in_ep_desc_bkup = %p, out_ep_desc_bkup = %p", + pr_debug("in_ep_desc_bkup = %pK, out_ep_desc_bkup = %pK", dev->in_ep_desc_backup, dev->out_ep_desc_backup); pr_debug("%s(): Disconnecting\n", __func__); if (gadget_is_dwc3(f->config->cdev->gadget)) { @@ -658,7 +662,7 @@ static void frmnet_resume(struct usb_function *f) else remote_wakeup_allowed = f->config->cdev->gadget->remote_wakeup; - pr_debug("%s: data xport: %s dev: %p portno: %d remote_wakeup: %d\n", + pr_debug("%s: data xport: %s dev: %pK portno: %d remote_wakeup: %d\n", __func__, xport_to_str(dxport), dev, dev->port_num, remote_wakeup_allowed); @@ -725,7 +729,7 @@ frmnet_set_alt(struct usb_function *f, unsigned intf, unsigned alt) int ret; struct list_head *cpkt; - pr_debug("%s:dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s:dev:%pK port#%d\n", __func__, dev, dev->port_num); if (dev->notify->driver_data) { pr_debug("%s: reset port:%d\n", __func__, dev->port_num); @@ -791,7 +795,7 @@ static void frmnet_ctrl_response_available(struct f_rmnet *dev) int ret; struct rmnet_ctrl_pkt *cpkt; - pr_debug("%s:dev:%p portno#%d\n", __func__, dev, dev->port_num); + pr_debug("%s:dev:%pK portno#%d\n", __func__, dev, dev->port_num); spin_lock_irqsave(&dev->lock, flags); if (!atomic_read(&dev->online) || !req || !req->buf) { @@ -840,7 +844,7 @@ static void frmnet_connect(struct grmnet *gr) struct f_rmnet *dev; if (!gr) { - pr_err("%s: Invalid grmnet:%p\n", __func__, gr); + pr_err("%s: Invalid grmnet:%pK\n", __func__, gr); return; } @@ -856,7 +860,7 @@ static void frmnet_disconnect(struct grmnet *gr) int status; if (!gr) { - pr_err("%s: Invalid grmnet:%p\n", __func__, gr); + pr_err("%s: Invalid grmnet:%pK\n", __func__, gr); return; } @@ -898,7 +902,7 @@ frmnet_send_cpkt_response(void *gr, void *buf, size_t len) unsigned long flags; if (!gr || !buf) { - pr_err("%s: Invalid grmnet/buf, grmnet:%p buf:%p\n", + pr_err("%s: Invalid grmnet/buf, grmnet:%pK buf:%pK\n", __func__, gr, buf); return -ENODEV; } @@ -912,7 +916,7 @@ frmnet_send_cpkt_response(void *gr, void *buf, size_t len) dev = port_to_rmnet(gr); - pr_debug("%s: dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s: dev:%pK port#%d\n", __func__, dev, dev->port_num); if (!atomic_read(&dev->online) || !atomic_read(&dev->ctrl_online)) { rmnet_free_ctrl_pkt(cpkt); @@ -940,7 +944,7 @@ frmnet_cmd_complete(struct usb_ep *ep, struct usb_request *req) return; } - pr_debug("%s: dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s: dev:%pK port#%d\n", __func__, dev, dev->port_num); cdev = dev->cdev; @@ -957,7 +961,7 @@ static void frmnet_notify_complete(struct usb_ep *ep, struct usb_request *req) unsigned long flags; struct rmnet_ctrl_pkt *cpkt; - pr_debug("%s: dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s: dev:%pK port#%d\n", __func__, dev, dev->port_num); switch (status) { case -ECONNRESET: @@ -1026,7 +1030,7 @@ frmnet_setup(struct usb_function *f, const struct usb_ctrlrequest *ctrl) u16 w_length = le16_to_cpu(ctrl->wLength); int ret = -EOPNOTSUPP; - pr_debug("%s:dev:%p port#%d\n", __func__, dev, dev->port_num); + pr_debug("%s:dev:%pK port#%d\n", __func__, dev, dev->port_num); if (!atomic_read(&dev->online)) { pr_warning("%s: usb cable is not connected\n", __func__); @@ -1252,7 +1256,7 @@ static int frmnet_bind_config(struct usb_configuration *c, unsigned portno) struct usb_function *f; unsigned long flags; - pr_debug("%s: usb config:%p\n", __func__, c); + pr_debug("%s: usb config:%pK\n", __func__, c); if (portno >= nr_rmnet_ports) { pr_err("%s: supporting ports#%u port_id:%u\n", __func__, @@ -1318,6 +1322,9 @@ static int frmnet_bind_config(struct usb_configuration *c, unsigned portno) kfree(f->name); return status; } + if (rmnet_ports[portno].data_xport == + USB_GADGET_XPORT_BAM2BAM_IPA) + c->cdev->gadget->bam2bam_func_enabled = true; pr_debug("%s: complete\n", __func__); diff --git a/drivers/usb/gadget/function/f_serial.c b/drivers/usb/gadget/function/f_serial.c index 25963de5777e3..bf73196c16c33 100644 --- a/drivers/usb/gadget/function/f_serial.c +++ b/drivers/usb/gadget/function/f_serial.c @@ -379,7 +379,7 @@ static int gport_connect(struct f_gser *gser) unsigned port_num; int ret; - pr_debug("%s: transport: %s f_gser: %p gserial: %p port_num: %d\n", + pr_debug("%s: transport: %s f_gser: %pK gserial: %pK port_num: %d\n", __func__, xport_to_str(gser->transport), gser, &gser->port, gser->port_num); @@ -425,7 +425,7 @@ static int gport_disconnect(struct f_gser *gser) port_num = gserial_ports[gser->port_num].client_port_num; - pr_debug("%s: transport: %s f_gser: %p gserial: %p port_num: %d\n", + pr_debug("%s: transport: %s f_gser: %pK gserial: %pK port_num: %d\n", __func__, xport_to_str(gser->transport), gser, &gser->port, gser->port_num); @@ -626,7 +626,7 @@ static void gser_suspend(struct usb_function *f) port_num = gserial_ports[gser->port_num].client_port_num; - pr_debug("%s: transport: %s f_gser: %p gserial: %p port_num: %d\n", + pr_debug("%s: transport: %s f_gser: %pK gserial: %pK port_num: %d\n", __func__, xport_to_str(gser->transport), gser, &gser->port, gser->port_num); @@ -648,7 +648,7 @@ static void gser_resume(struct usb_function *f) port_num = gserial_ports[gser->port_num].client_port_num; - pr_debug("%s: transport: %s f_gser: %p gserial: %p port_num: %d\n", + pr_debug("%s: transport: %s f_gser: %pK gserial: %pK port_num: %d\n", __func__, xport_to_str(gser->transport), gser, &gser->port, gser->port_num); /* @@ -1111,17 +1111,22 @@ static struct usb_function *gser_alloc(struct usb_function_instance *fi) struct f_gser *gser; struct f_serial_opts *opts; + opts = container_of(fi, struct f_serial_opts, func_inst); + if (nr_ports) { + opts->port_num = gser_next_free_port++; + if(opts->port_num >= GSERIAL_NO_PORTS) { + pr_err("%s: No serial allowed for port %d\n", + __func__, opts->port_num); + return ERR_PTR(-EINVAL); + } + } + /* allocate and initialize one new instance */ gser = kzalloc(sizeof(*gser), GFP_KERNEL); if (!gser) return ERR_PTR(-ENOMEM); - opts = container_of(fi, struct f_serial_opts, func_inst); - spin_lock_init(&gser->lock); - if (nr_ports) - opts->port_num = gser_next_free_port++; - gser->port_num = opts->port_num; gser->port.func.name = "gser"; @@ -1211,6 +1216,14 @@ int gserial_init_port(int port_num, const char *name, return ret; } +void gserial_deinit_port(void) +{ + no_char_bridge_ports = 0; + no_tty_ports = 0; + no_smd_ports = 0; + no_hsic_sports = 0; + nr_ports = 0; +} bool gserial_is_connected(void) { diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index 33e16658e5cfe..ec9b2a707ca52 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c @@ -23,7 +23,7 @@ #include "u_uac2.h" /* Keep everyone on toes */ -#define USB_XFERS 2 +#define USB_XFERS 8 /* * The driver implements a simple UAC_2 topology. @@ -128,6 +128,7 @@ struct audio_dev { /* The ALSA Sound Card it represents on the USB-Client side */ struct snd_uac2_chip uac2; + struct device *gdev; }; static inline @@ -457,7 +458,7 @@ static int snd_uac2_probe(struct platform_device *pdev) c_chmask = opts->c_chmask; /* Choose any slot, with no id */ - err = snd_card_new(&pdev->dev, -1, NULL, THIS_MODULE, 0, &card); + err = snd_card_new(audio_dev->gdev, -1, NULL, THIS_MODULE, 0, &card); if (err < 0) return err; @@ -522,6 +523,7 @@ static int alsa_uac2_init(struct audio_dev *agdev) struct snd_uac2_chip *uac2 = &agdev->uac2; int err; + memset(&uac2->pdev, 0, sizeof(uac2->pdev)); uac2->pdrv.probe = snd_uac2_probe; uac2->pdrv.remove = snd_uac2_remove; uac2->pdrv.driver.name = uac2_name; @@ -791,6 +793,13 @@ struct usb_endpoint_descriptor hs_epout_desc = { .bInterval = 4, }; +static struct usb_ss_ep_comp_descriptor ss_epout_comp_desc = { + .bLength = sizeof(ss_epout_comp_desc), + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, + + .wBytesPerInterval = cpu_to_le16(1024), +}; + /* CS AS ISO OUT Endpoint */ static struct uac2_iso_endpoint_descriptor as_iso_out_desc = { .bLength = sizeof as_iso_out_desc, @@ -868,6 +877,13 @@ struct usb_endpoint_descriptor hs_epin_desc = { .bInterval = 4, }; +static struct usb_ss_ep_comp_descriptor ss_epin_comp_desc = { + .bLength = sizeof(ss_epin_comp_desc), + .bDescriptorType = USB_DT_SS_ENDPOINT_COMP, + + .wBytesPerInterval = cpu_to_le16(1024), +}; + /* CS AS ISO IN Endpoint */ static struct uac2_iso_endpoint_descriptor as_iso_in_desc = { .bLength = sizeof as_iso_in_desc, @@ -940,6 +956,38 @@ static struct usb_descriptor_header *hs_audio_desc[] = { NULL, }; +static struct usb_descriptor_header *ss_audio_desc[] = { + (struct usb_descriptor_header *)&iad_desc, + (struct usb_descriptor_header *)&std_ac_if_desc, + + (struct usb_descriptor_header *)&ac_hdr_desc, + (struct usb_descriptor_header *)&in_clk_src_desc, + (struct usb_descriptor_header *)&out_clk_src_desc, + (struct usb_descriptor_header *)&usb_out_it_desc, + (struct usb_descriptor_header *)&io_in_it_desc, + (struct usb_descriptor_header *)&usb_in_ot_desc, + (struct usb_descriptor_header *)&io_out_ot_desc, + + (struct usb_descriptor_header *)&std_as_out_if0_desc, + (struct usb_descriptor_header *)&std_as_out_if1_desc, + + (struct usb_descriptor_header *)&as_out_hdr_desc, + (struct usb_descriptor_header *)&as_out_fmt1_desc, + (struct usb_descriptor_header *)&hs_epout_desc, + (struct usb_descriptor_header *)&ss_epout_comp_desc, + (struct usb_descriptor_header *)&as_iso_out_desc, + + (struct usb_descriptor_header *)&std_as_in_if0_desc, + (struct usb_descriptor_header *)&std_as_in_if1_desc, + + (struct usb_descriptor_header *)&as_in_hdr_desc, + (struct usb_descriptor_header *)&as_in_fmt1_desc, + (struct usb_descriptor_header *)&hs_epin_desc, + (struct usb_descriptor_header *)&ss_epin_comp_desc, + (struct usb_descriptor_header *)&as_iso_in_desc, + NULL, +}; + struct cntrl_cur_lay3 { __u32 dCUR; }; @@ -1030,6 +1078,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) return ret; } std_ac_if_desc.bInterfaceNumber = ret; + iad_desc.bFirstInterface = ret; agdev->ac_intf = ret; agdev->ac_alt = 0; @@ -1075,7 +1124,8 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress; hs_epin_desc.wMaxPacketSize = fs_epin_desc.wMaxPacketSize; - ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, NULL); + ret = usb_assign_descriptors(fn, fs_audio_desc, hs_audio_desc, + ss_audio_desc); if (ret) goto err; @@ -1095,6 +1145,7 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) goto err_free_descs; } + agdev->gdev = &gadget->dev; ret = alsa_uac2_init(agdev); if (ret) goto err_free_descs; diff --git a/drivers/usb/gadget/function/f_uvc.c b/drivers/usb/gadget/function/f_uvc.c index 945b3bd2ca98a..80c4f51ae1754 100644 --- a/drivers/usb/gadget/function/f_uvc.c +++ b/drivers/usb/gadget/function/f_uvc.c @@ -31,6 +31,7 @@ #include "uvc_v4l2.h" #include "uvc_video.h" #include "u_uvc.h" +#include "f_uvc.h" unsigned int uvc_gadget_trace_param; @@ -83,7 +84,7 @@ static struct usb_interface_descriptor uvc_control_intf = { .bNumEndpoints = 1, .bInterfaceClass = USB_CLASS_VIDEO, .bInterfaceSubClass = UVC_SC_VIDEOCONTROL, - .bInterfaceProtocol = 0x00, + .bInterfaceProtocol = 0x01, .iInterface = 0, }; @@ -120,7 +121,7 @@ static struct usb_interface_descriptor uvc_streaming_intf_alt0 = { .bNumEndpoints = 0, .bInterfaceClass = USB_CLASS_VIDEO, .bInterfaceSubClass = UVC_SC_VIDEOSTREAMING, - .bInterfaceProtocol = 0x00, + .bInterfaceProtocol = 0x01, .iInterface = 0, }; @@ -132,7 +133,7 @@ static struct usb_interface_descriptor uvc_streaming_intf_alt1 = { .bNumEndpoints = 1, .bInterfaceClass = USB_CLASS_VIDEO, .bInterfaceSubClass = UVC_SC_VIDEOSTREAMING, - .bInterfaceProtocol = 0x00, + .bInterfaceProtocol = 0x01, .iInterface = 0, }; @@ -412,7 +413,8 @@ uvc_function_connect(struct uvc_device *uvc) struct usb_composite_dev *cdev = uvc->func.config->cdev; int ret; - if ((ret = usb_function_activate(&uvc->func)) < 0) + ret = video_ready_callback(&uvc->func); + if (ret < 0) INFO(cdev, "UVC connect failed with %d\n", ret); } @@ -422,7 +424,8 @@ uvc_function_disconnect(struct uvc_device *uvc) struct usb_composite_dev *cdev = uvc->func.config->cdev; int ret; - if ((ret = usb_function_deactivate(&uvc->func)) < 0) + ret = video_closed_callback(&uvc->func); + if (ret < 0) INFO(cdev, "UVC disconnect failed with %d\n", ret); } @@ -717,11 +720,9 @@ uvc_function_bind(struct usb_configuration *c, struct usb_function *f) uvc->control_req->complete = uvc_function_ep0_complete; uvc->control_req->context = uvc; - /* Avoid letting this gadget enumerate until the userspace server is - * active. + /* Gadget drivers avoids enumerattion until the userspace server is + * active - when it opens uvc video device node. */ - if ((ret = usb_function_deactivate(f)) < 0) - goto error; if (v4l2_device_register(&cdev->gadget->dev, &uvc->v4l2_dev)) { printk(KERN_INFO "v4l2_device_register failed\n"); diff --git a/drivers/usb/gadget/function/f_uvc.h b/drivers/usb/gadget/function/f_uvc.h index d0a73bdcbba10..afbb422da3a97 100644 --- a/drivers/usb/gadget/function/f_uvc.h +++ b/drivers/usb/gadget/function/f_uvc.h @@ -24,5 +24,341 @@ void uvc_function_connect(struct uvc_device *uvc); void uvc_function_disconnect(struct uvc_device *uvc); +int video_ready_callback(struct usb_function *function); +int video_closed_callback(struct usb_function *function); + +DECLARE_UVC_HEADER_DESCRIPTOR(1); + +static const struct UVC_HEADER_DESCRIPTOR(1) uvc_control_header = { + .bLength = UVC_DT_HEADER_SIZE(1), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VC_HEADER, + .bcdUVC = cpu_to_le16(0x0150), + .wTotalLength = 0, /* dynamic */ + .dwClockFrequency = cpu_to_le32(48000000), + .bInCollection = 0, /* dynamic */ + .baInterfaceNr[0] = 0, /* dynamic */ +}; + +static const struct uvc_camera_terminal_descriptor uvc_camera_terminal = { + .bLength = UVC_DT_CAMERA_TERMINAL_SIZE(3), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VC_INPUT_TERMINAL, + .bTerminalID = 1, + .wTerminalType = cpu_to_le16(0x0201), + .bAssocTerminal = 0, + .iTerminal = 0, + .wObjectiveFocalLengthMin = cpu_to_le16(0), + .wObjectiveFocalLengthMax = cpu_to_le16(0), + .wOcularFocalLength = cpu_to_le16(0), + .bControlSize = 3, + .bmControls[0] = 14, + .bmControls[1] = 0, + .bmControls[2] = 0, +}; + +static const struct uvc_processing_unit_descriptor uvc_processing = { + .bLength = UVC_DT_PROCESSING_UNIT_SIZE(3), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VC_PROCESSING_UNIT, + .bUnitID = 2, + .bSourceID = 1, + .wMaxMultiplier = cpu_to_le16(16*1024), + .bControlSize = 3, + .bmControls[0] = 64, + .bmControls[1] = 16, + .bmControls[2] = 1, + .iProcessing = 0, +}; + +static const struct uvc_output_terminal_descriptor uvc_output_terminal = { + .bLength = UVC_DT_OUTPUT_TERMINAL_SIZE, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VC_OUTPUT_TERMINAL, + .bTerminalID = 3, + .wTerminalType = cpu_to_le16(0x0101), + .bAssocTerminal = 0, + .bSourceID = 2, + .iTerminal = 0, +}; + +DECLARE_UVC_INPUT_HEADER_DESCRIPTOR(1, 3); + +static const struct UVC_INPUT_HEADER_DESCRIPTOR(1, 3) uvc_input_header = { + .bLength = UVC_DT_INPUT_HEADER_SIZE(1, 3), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_INPUT_HEADER, + .bNumFormats = 3, + .wTotalLength = 0, /* dynamic */ + .bEndpointAddress = 0, /* dynamic */ + .bmInfo = 0, + .bTerminalLink = 3, + .bStillCaptureMethod = 0, + .bTriggerSupport = 0, + .bTriggerUsage = 0, + .bControlSize = 1, + .bmaControls[0][0] = 0, + .bmaControls[1][0] = 4, + .bmaControls[2][0] = 0, +}; + +static const struct uvc_format_uncompressed uvc_format_yuv = { + .bLength = UVC_DT_FORMAT_UNCOMPRESSED_SIZE, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FORMAT_UNCOMPRESSED, + .bFormatIndex = 1, + .bNumFrameDescriptors = 2, + .guidFormat = { + 'Y', 'U', 'Y', '2', 0x00, 0x00, 0x10, 0x00, + 0x80, 0x00, 0x00, 0xaa, 0x00, 0x38, 0x9b, 0x71}, + .bBitsPerPixel = 16, + .bDefaultFrameIndex = 1, + .bAspectRatioX = 0, + .bAspectRatioY = 0, + .bmInterfaceFlags = 0, + .bCopyProtect = 0, +}; + +DECLARE_UVC_FRAME_UNCOMPRESSED(1); +DECLARE_UVC_FRAME_UNCOMPRESSED(3); + +static const struct UVC_FRAME_UNCOMPRESSED(3) uvc_frame_yuv_360p = { + .bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE(3), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_UNCOMPRESSED, + .bFrameIndex = 1, + .bmCapabilities = 0, + .wWidth = cpu_to_le16(640), + .wHeight = cpu_to_le16(360), + .dwMinBitRate = cpu_to_le32(18432000), + .dwMaxBitRate = cpu_to_le32(55296000), + .dwMaxVideoFrameBufferSize = cpu_to_le32(460800), + .dwDefaultFrameInterval = cpu_to_le32(666666), + .bFrameIntervalType = 3, + .dwFrameInterval[0] = cpu_to_le32(666666), + .dwFrameInterval[1] = cpu_to_le32(1000000), + .dwFrameInterval[2] = cpu_to_le32(5000000), +}; + +static const struct UVC_FRAME_UNCOMPRESSED(1) uvc_frame_yuv_720p = { + .bLength = UVC_DT_FRAME_UNCOMPRESSED_SIZE(1), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_UNCOMPRESSED, + .bFrameIndex = 2, + .bmCapabilities = 0, + .wWidth = cpu_to_le16(1280), + .wHeight = cpu_to_le16(720), + .dwMinBitRate = cpu_to_le32(29491200), + .dwMaxBitRate = cpu_to_le32(29491200), + .dwMaxVideoFrameBufferSize = cpu_to_le32(1843200), + .dwDefaultFrameInterval = cpu_to_le32(5000000), + .bFrameIntervalType = 1, + .dwFrameInterval[0] = cpu_to_le32(5000000), +}; + +static const struct uvc_format_mjpeg uvc_format_mjpg = { + .bLength = UVC_DT_FORMAT_MJPEG_SIZE, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FORMAT_MJPEG, + .bFormatIndex = 2, + .bNumFrameDescriptors = 2, + .bmFlags = 0, + .bDefaultFrameIndex = 1, + .bAspectRatioX = 0, + .bAspectRatioY = 0, + .bmInterfaceFlags = 0, + .bCopyProtect = 0, +}; + +DECLARE_UVC_FRAME_MJPEG(1); +DECLARE_UVC_FRAME_MJPEG(3); + +static const struct UVC_FRAME_MJPEG(3) uvc_frame_mjpg_360p = { + .bLength = UVC_DT_FRAME_MJPEG_SIZE(3), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_MJPEG, + .bFrameIndex = 1, + .bmCapabilities = 0, + .wWidth = cpu_to_le16(640), + .wHeight = cpu_to_le16(360), + .dwMinBitRate = cpu_to_le32(18432000), + .dwMaxBitRate = cpu_to_le32(55296000), + .dwMaxVideoFrameBufferSize = cpu_to_le32(460800), + .dwDefaultFrameInterval = cpu_to_le32(666666), + .bFrameIntervalType = 3, + .dwFrameInterval[0] = cpu_to_le32(666666), + .dwFrameInterval[1] = cpu_to_le32(1000000), + .dwFrameInterval[2] = cpu_to_le32(5000000), +}; + +static const struct UVC_FRAME_MJPEG(1) uvc_frame_mjpg_720p = { + .bLength = UVC_DT_FRAME_MJPEG_SIZE(1), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_MJPEG, + .bFrameIndex = 2, + .bmCapabilities = 0, + .wWidth = cpu_to_le16(1280), + .wHeight = cpu_to_le16(720), + .dwMinBitRate = cpu_to_le32(29491200), + .dwMaxBitRate = cpu_to_le32(29491200), + .dwMaxVideoFrameBufferSize = cpu_to_le32(1843200), + .dwDefaultFrameInterval = cpu_to_le32(5000000), + .bFrameIntervalType = 1, + .dwFrameInterval[0] = cpu_to_le32(5000000), +}; + +static const struct uvc_format_h264 uvc_fmt_h264 = { + .bLength = UVC_DT_FORMAT_H264_SIZE, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FORMAT_H264, + .bFormatIndex = 3, + .bNumFrameDescriptors = 2, + .bDefaultFrameIndex = 1, + .bMaxCodecConfigDelay = 0x4, + .bmSupportedSliceModes = 0, + .bmSupportedSyncFrameTypes = 0x76, + .bResolutionScaling = 0, + .Reserved1 = 0, + .bmSupportedRateControlModes = 0x3F, + .wMaxMBperSecOneResNoScalability = cpu_to_le16(972), + .wMaxMBperSecTwoResNoScalability = 0, + .wMaxMBperSecThreeResNoScalability = 0, + .wMaxMBperSecFourResNoScalability = 0, + .wMaxMBperSecOneResTemporalScalability = cpu_to_le16(972), + .wMaxMBperSecTwoResTemporalScalability = 0, + .wMaxMBperSecThreeResTemporalScalability = 0, + .wMaxMBperSecFourResTemporalScalability = 0, + .wMaxMBperSecOneResTemporalQualityScalability = cpu_to_le16(972), + .wMaxMBperSecTwoResTemporalQualityScalability = 0, + .wMaxMBperSecThreeResTemporalQualityScalability = 0, + .wMaxMBperSecFourResTemporalQualityScalability = 0, + .wMaxMBperSecOneResTemporalSpatialScalability = 0, + .wMaxMBperSecTwoResTemporalSpatialScalability = 0, + .wMaxMBperSecThreeResTemporalSpatialScalability = 0, + .wMaxMBperSecFourResTemporalSpatialScalability = 0, + .wMaxMBperSecOneResFullScalability = 0, + .wMaxMBperSecTwoResFullScalability = 0, + .wMaxMBperSecThreeResFullScalability = 0, + .wMaxMBperSecFourResFullScalability = 0, +}; + +DECLARE_UVC_FRAME_H264(1); + +static const struct UVC_FRAME_H264(1) uvc_frame_h264_1920p = { + .bLength = UVC_DT_FRAME_H264_SIZE(1), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_H264, + .bFrameIndex = 1, + .wWidth = cpu_to_le16(3840), + .wHeight = cpu_to_le16(1920), + .wSARwidth = 1, + .wSARheight = 1, + .wProfile = 0x6400, + .bLevelIDC = 0x33, + .bmSupportedUsages = 0x70003, + .wConstrainedToolset = cpu_to_le16(0), + .bmCapabilities = 0x47, + .bmSVCCapabilities = 0x4, + .bmMVCCapabilities = 0, + .dwMinBitRate = cpu_to_le32(29491200), + .dwMaxBitRate = cpu_to_le32(100000000), + .dwDefaultFrameInterval = cpu_to_le32(333667), + .bNumFrameIntervals = 1, + .dwFrameInterval[0] = cpu_to_le32(333667), +}; + +static const struct UVC_FRAME_H264(1) uvc_frame_h264_960p = { + .bLength = UVC_DT_FRAME_H264_SIZE(1), + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_FRAME_H264, + .bFrameIndex = 2, + .wWidth = cpu_to_le16(1920), + .wHeight = cpu_to_le16(960), + .wSARwidth = 1, + .wSARheight = 1, + .wProfile = 0x6400, + .bLevelIDC = 0x28, + .bmSupportedUsages = 0x70003, + .wConstrainedToolset = cpu_to_le16(0), + .bmCapabilities = 0x47, + .bmSVCCapabilities = 0x4, + .bmMVCCapabilities = 0, + .dwMinBitRate = cpu_to_le32(29491200), + .dwMaxBitRate = cpu_to_le32(100000000), + .dwDefaultFrameInterval = cpu_to_le32(333667), + .bNumFrameIntervals = 1, + .dwFrameInterval[0] = cpu_to_le32(333667), +}; + +static const struct uvc_color_matching_descriptor uvc_color_matching = { + .bLength = UVC_DT_COLOR_MATCHING_SIZE, + .bDescriptorType = USB_DT_CS_INTERFACE, + .bDescriptorSubType = UVC_VS_COLORFORMAT, + .bColorPrimaries = 1, + .bTransferCharacteristics = 1, + .bMatrixCoefficients = 4, +}; + +static const struct uvc_descriptor_header * const uvc_fs_control_cls[] = { + (const struct uvc_descriptor_header *) &uvc_control_header, + (const struct uvc_descriptor_header *) &uvc_camera_terminal, + (const struct uvc_descriptor_header *) &uvc_processing, + (const struct uvc_descriptor_header *) &uvc_output_terminal, + NULL, +}; + +static const struct uvc_descriptor_header * const uvc_ss_control_cls[] = { + (const struct uvc_descriptor_header *) &uvc_control_header, + (const struct uvc_descriptor_header *) &uvc_camera_terminal, + (const struct uvc_descriptor_header *) &uvc_processing, + (const struct uvc_descriptor_header *) &uvc_output_terminal, + NULL, +}; + +static const struct uvc_descriptor_header * const uvc_fs_streaming_cls[] = { + (const struct uvc_descriptor_header *) &uvc_input_header, + (const struct uvc_descriptor_header *) &uvc_format_yuv, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_360p, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_720p, + (const struct uvc_descriptor_header *) &uvc_format_mjpg, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p, + (const struct uvc_descriptor_header *) &uvc_fmt_h264, + (const struct uvc_descriptor_header *) &uvc_frame_h264_960p, + (const struct uvc_descriptor_header *) &uvc_frame_h264_1920p, + (const struct uvc_descriptor_header *) &uvc_color_matching, + NULL, +}; + +static const struct uvc_descriptor_header * const uvc_hs_streaming_cls[] = { + (const struct uvc_descriptor_header *) &uvc_input_header, + (const struct uvc_descriptor_header *) &uvc_format_yuv, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_360p, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_720p, + (const struct uvc_descriptor_header *) &uvc_format_mjpg, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p, + (const struct uvc_descriptor_header *) &uvc_fmt_h264, + (const struct uvc_descriptor_header *) &uvc_frame_h264_960p, + (const struct uvc_descriptor_header *) &uvc_frame_h264_1920p, + (const struct uvc_descriptor_header *) &uvc_color_matching, + NULL, +}; + +static const struct uvc_descriptor_header * const uvc_ss_streaming_cls[] = { + (const struct uvc_descriptor_header *) &uvc_input_header, + (const struct uvc_descriptor_header *) &uvc_format_yuv, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_360p, + (const struct uvc_descriptor_header *) &uvc_frame_yuv_720p, + (const struct uvc_descriptor_header *) &uvc_format_mjpg, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_360p, + (const struct uvc_descriptor_header *) &uvc_frame_mjpg_720p, + (const struct uvc_descriptor_header *) &uvc_fmt_h264, + (const struct uvc_descriptor_header *) &uvc_frame_h264_960p, + (const struct uvc_descriptor_header *) &uvc_frame_h264_1920p, + (const struct uvc_descriptor_header *) &uvc_color_matching, + NULL, +}; + #endif /* _F_UVC_H_ */ diff --git a/drivers/usb/gadget/function/u_bam.c b/drivers/usb/gadget/function/u_bam.c index b2bf5b560f41a..3093017c21028 100644 --- a/drivers/usb/gadget/function/u_bam.c +++ b/drivers/usb/gadget/function/u_bam.c @@ -230,7 +230,7 @@ static int gbam_alloc_requests(struct usb_ep *ep, struct list_head *head, { int i; struct usb_request *req; - pr_debug("%s: ep:%p head:%p num:%d cb:%p", __func__, + pr_debug("%s: ep:%pK head:%pK num:%d cb:%pK", __func__, ep, head, num, cb); for (i = 0; i < num; i++) { @@ -492,7 +492,7 @@ void gbam_data_recv_cb(void *p, struct sk_buff *skb) if (!skb) return; - pr_debug("%s: p:%p#%d d:%p skb_len:%d\n", __func__, + pr_debug("%s: p:%pK#%d d:%pK skb_len:%d\n", __func__, port, port->port_num, d, skb->len); spin_lock_irqsave(&port->port_lock_dl, flags); @@ -533,7 +533,7 @@ void gbam_data_write_done(void *p, struct sk_buff *skb) d->pending_bytes_with_bam -= skb->len; gbam_free_skb_to_pool(port, skb); - pr_debug("%s:port:%p d:%p tom:%lu ppkt:%u pbytes:%u pno:%d\n", __func__, + pr_debug("%s:port:%pK d:%pK tom:%lu ppkt:%u pbytes:%u pno:%d\n", __func__, port, d, d->to_modem, d->pending_pkts_with_bam, d->pending_bytes_with_bam, port->port_num); @@ -609,7 +609,7 @@ static void gbam_data_write_tobam(struct work_struct *w) d->pending_bytes_with_bam += skb->len; d->to_modem++; - pr_debug("%s: port:%p d:%p tom:%lu ppkts:%u pbytes:%u pno:%d\n", + pr_debug("%s: port:%pK d:%pK tom:%lu ppkts:%u pbytes:%u pno:%d\n", __func__, port, d, d->to_modem, d->pending_pkts_with_bam, d->pending_bytes_with_bam, port->port_num); @@ -1098,7 +1098,7 @@ static void gbam_start_io(struct gbam_port *port) { unsigned long flags; - pr_debug("%s: port:%p\n", __func__, port); + pr_debug("%s: port:%pK\n", __func__, port); if (_gbam_start_io(port, true)) return; @@ -1385,7 +1385,6 @@ static void gbam2bam_connect_work(struct work_struct *w) spin_unlock_irqrestore(&port->port_lock, flags); usb_bam_alloc_fifos(d->usb_bam_type, d->src_connection_idx); usb_bam_alloc_fifos(d->usb_bam_type, d->dst_connection_idx); - gadget->bam2bam_func_enabled = true; spin_lock_irqsave(&port->port_lock, flags); /* check if USB cable is disconnected or not */ @@ -1830,7 +1829,7 @@ static int gbam_port_alloc(int portno) pdrv->driver.owner = THIS_MODULE; platform_driver_register(pdrv); - pr_debug("%s: port:%p portno:%d\n", __func__, port, portno); + pr_debug("%s: port:%pK portno:%d\n", __func__, port, portno); return 0; } @@ -1870,7 +1869,7 @@ static int gbam2bam_port_alloc(int portno) INIT_LIST_HEAD(&d->rx_idle); INIT_WORK(&d->write_tobam_w, gbam_data_write_tobam); - pr_debug("%s: port:%p portno:%d\n", __func__, port, portno); + pr_debug("%s: port:%pK portno:%d\n", __func__, port, portno); return 0; } @@ -1902,7 +1901,7 @@ static ssize_t gbam_read_stats(struct file *file, char __user *ubuf, d = &port->data_ch; temp += scnprintf(buf + temp, DEBUG_BUF_SIZE - temp, - "#PORT:%d port:%p data_ch:%p#\n" + "#PORT:%d port:%pK data_ch:%pK#\n" "dpkts_to_usbhost: %lu\n" "dpkts_to_modem: %lu\n" "dpkts_pwith_bam: %u\n" @@ -2025,7 +2024,7 @@ void gbam_disconnect(struct grmnet *gr, u8 port_num, enum transport_type trans) unsigned long flags, flags_ul, flags_dl; struct bam_ch_info *d; - pr_debug("%s: grmnet:%p port#%d\n", __func__, gr, port_num); + pr_debug("%s: grmnet:%pK port#%d\n", __func__, gr, port_num); if (trans == USB_GADGET_XPORT_BAM2BAM) { pr_err("%s: invalid xport#%d\n", __func__, trans); @@ -2153,7 +2152,7 @@ int gbam_connect(struct grmnet *gr, u8 port_num, int ret; unsigned long flags, flags_ul; - pr_debug("%s: grmnet:%p port#%d\n", __func__, gr, port_num); + pr_debug("%s: grmnet:%pK port#%d\n", __func__, gr, port_num); if (!gr) { pr_err("%s: grmnet port is null\n", __func__); @@ -2298,7 +2297,7 @@ int gbam_connect(struct grmnet *gr, u8 port_num, ret = usb_ep_enable(gr->in); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:IN ep:%p", + pr_err("%s: usb_ep_enable failed eptype:IN ep:%pK", __func__, gr->in); usb_ep_free_request(port->port_usb->out, d->rx_req); d->rx_req = NULL; @@ -2321,7 +2320,7 @@ int gbam_connect(struct grmnet *gr, u8 port_num, if (gr->out) { ret = usb_ep_enable(gr->out); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:OUT ep:%p", + pr_err("%s: usb_ep_enable failed eptype:OUT ep:%pK", __func__, gr->out); gr->in->driver_data = 0; usb_ep_disable(gr->in); @@ -2355,6 +2354,12 @@ int gbam_connect(struct grmnet *gr, u8 port_num, return ret; } +void gbam_data_flush_workqueue(void) +{ + pr_debug("%s(): Flushing workqueue\n", __func__); + flush_workqueue(gbam_wq); +} + int gbam_setup(unsigned int no_bam_port) { int i; diff --git a/drivers/usb/gadget/function/u_bam_data.c b/drivers/usb/gadget/function/u_bam_data.c index c1d770f492b9d..9199adc38eb3a 100644 --- a/drivers/usb/gadget/function/u_bam_data.c +++ b/drivers/usb/gadget/function/u_bam_data.c @@ -166,7 +166,7 @@ static int bam_data_alloc_requests(struct usb_ep *ep, struct list_head *head, struct bam_data_ch_info *d = &port->data_ch; struct usb_request *req; - pr_debug("%s: ep:%p head:%p num:%d cb:%p", __func__, + pr_debug("%s: ep:%pK head:%pK num:%d cb:%pK", __func__, ep, head, num, cb); if (d->alloc_rx_reqs) { @@ -292,7 +292,7 @@ static void bam_data_write_done(void *p, struct sk_buff *skb) d->pending_with_bam--; - pr_debug("%s: port:%p d:%p pbam:%u, pno:%d\n", __func__, + pr_debug("%s: port:%pK d:%pK pbam:%u, pno:%d\n", __func__, port, d, d->pending_with_bam, port->port_num); spin_unlock_irqrestore(&port->port_lock, flags); @@ -528,7 +528,7 @@ static void bam_data_write_toipa(struct work_struct *w) d->pending_with_bam++; - pr_debug("%s: port:%p d:%p pbam:%u pno:%d\n", __func__, + pr_debug("%s: port:%pK d:%pK pbam:%u pno:%d\n", __func__, port, d, d->pending_with_bam, port->port_num); spin_unlock_irqrestore(&port->port_lock, flags); @@ -811,7 +811,7 @@ static void bam2bam_data_disconnect_work(struct work_struct *w) usb_gadget_autopm_put_async(port->gadget); spin_unlock_irqrestore(&port->port_lock, flags); - pr_debug("Disconnect workqueue done (port %p)\n", port); + pr_debug("Disconnect workqueue done (port %pK)\n", port); } /* * This function configured data fifo based on index passed to get bam2bam @@ -1021,7 +1021,6 @@ static void bam2bam_data_connect_work(struct work_struct *w) __func__, ret); goto free_fifos; } - gadget->bam2bam_func_enabled = true; spin_lock_irqsave(&port->port_lock, flags); if (port->last_event == U_BAM_DATA_DISCONNECT_E) { @@ -1154,7 +1153,7 @@ static void bam2bam_data_connect_work(struct work_struct *w) bam_data_start_rx_transfers(d, port); bam_data_start_endless_tx(port); - pr_debug("Connect workqueue done (port %p)", port); + pr_debug("Connect workqueue done (port %pK)", port); return; disconnect_ipa: @@ -1197,7 +1196,7 @@ void bam_data_start_rx_tx(u8 port_num) } if (!d->rx_req || !d->tx_req) { - pr_err("%s: No request d->rx_req=%p, d->tx_req=%p", __func__, + pr_err("%s: No request d->rx_req=%pK, d->tx_req=%pK", __func__, d->rx_req, d->tx_req); goto out; } @@ -1369,7 +1368,7 @@ void bam_data_disconnect(struct data_port *gr, enum function_type func, return; } - pr_debug("dev:%p port number:%d\n", gr, port_num); + pr_debug("dev:%pK port number:%d\n", gr, port_num); if (!gr) { pr_err("data port is null\n"); @@ -1516,7 +1515,7 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans, return -EINVAL; } - pr_debug("dev:%p port#%d\n", gr, port_num); + pr_debug("dev:%pK port#%d\n", gr, port_num); usb_bam_type = usb_bam_get_bam_type(gr->cdev->gadget->name); @@ -1593,7 +1592,7 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans, ret = usb_ep_enable(gr->in); if (ret) { - pr_err("usb_ep_enable failed eptype:IN ep:%p", gr->in); + pr_err("usb_ep_enable failed eptype:IN ep:%pK", gr->in); goto exit; } @@ -1601,7 +1600,7 @@ int bam_data_connect(struct data_port *gr, enum transport_type trans, ret = usb_ep_enable(gr->out); if (ret) { - pr_err("usb_ep_enable failed eptype:OUT ep:%p", gr->out); + pr_err("usb_ep_enable failed eptype:OUT ep:%pK", gr->out); goto disable_in_ep; } @@ -1872,7 +1871,7 @@ void bam_data_suspend(struct data_port *port_usb, u8 dev_port_num, port_usb->in_ep_desc_backup = port_usb->in->desc; port_usb->out_ep_desc_backup = port_usb->out->desc; - pr_debug("in_ep_desc_backup = %p, out_ep_desc_backup = %p", + pr_debug("in_ep_desc_backup = %pK, out_ep_desc_backup = %pK", port_usb->in_ep_desc_backup, port_usb->out_ep_desc_backup); @@ -1913,7 +1912,7 @@ void bam_data_resume(struct data_port *port_usb, u8 dev_port_num, port_usb->in->desc = port_usb->in_ep_desc_backup; port_usb->out->desc = port_usb->out_ep_desc_backup; - pr_debug("in_ep_desc_backup = %p, out_ep_desc_backup = %p", + pr_debug("in_ep_desc_backup = %pK, out_ep_desc_backup = %pK", port_usb->in_ep_desc_backup, port_usb->out_ep_desc_backup); diff --git a/drivers/usb/gadget/function/u_ctrl_hsic.c b/drivers/usb/gadget/function/u_ctrl_hsic.c index 7bbf4e4705fa0..e5dfb74d9b75c 100644 --- a/drivers/usb/gadget/function/u_ctrl_hsic.c +++ b/drivers/usb/gadget/function/u_ctrl_hsic.c @@ -185,7 +185,7 @@ static void ghsic_ctrl_connect_w(struct work_struct *w) if (!port || !test_bit(CH_READY, &port->bridge_sts)) return; - pr_debug("%s: port:%p port type =%u\n", __func__, port, port->gtype); + pr_debug("%s: port:%pK port type =%u\n", __func__, port, port->gtype); retval = ctrl_bridge_open(&port->brdg); if (retval) { @@ -482,7 +482,7 @@ static int gctrl_port_alloc(int portno, enum gadget_type gtype) platform_driver_register(pdrv); - pr_debug("%s: port:%p portno:%d\n", __func__, port, portno); + pr_debug("%s: port:%pK portno:%d\n", __func__, port, portno); return 0; } @@ -574,7 +574,7 @@ static ssize_t gctrl_read_stats(struct file *file, char __user *ubuf, temp += scnprintf(buf + temp, DEBUG_BUF_SIZE - temp, "\nName: %s\n" - "#PORT:%d port: %p\n" + "#PORT:%d port: %pK\n" "to_usbhost: %lu\n" "to_modem: %lu\n" "cpkt_drp_cnt: %lu\n" diff --git a/drivers/usb/gadget/function/u_ctrl_qti.c b/drivers/usb/gadget/function/u_ctrl_qti.c index a9a8ab4618e89..2e16f0a324bc9 100644 --- a/drivers/usb/gadget/function/u_ctrl_qti.c +++ b/drivers/usb/gadget/function/u_ctrl_qti.c @@ -88,7 +88,7 @@ static void qti_ctrl_queue_notify(struct qti_ctrl_port *port) spin_lock_irqsave(&port->lock, flags); if (!port->is_open) { - pr_err("%s: rmnet ctrl file handler %p is not open", + pr_err("%s: rmnet ctrl file handler %pK is not open", __func__, port); spin_unlock_irqrestore(&port->lock, flags); return; @@ -141,7 +141,7 @@ static int gqti_ctrl_send_cpkt_tomodem(u8 portno, void *buf, size_t len) /* drop cpkt if port is not open */ if (!port->is_open) { - pr_debug("rmnet file handler %p(index=%d) is not open", + pr_debug("rmnet file handler %pK(index=%d) is not open", port, port->index); port->drp_cpkt_cnt++; spin_unlock_irqrestore(&port->lock, flags); @@ -185,7 +185,7 @@ int gqti_ctrl_connect(void *gr, u8 port_num, unsigned intf, struct gqdss *g_dpl = NULL; unsigned long flags; - pr_debug("%s: gtype:%d gadget:%p\n", __func__, gtype, gr); + pr_debug("%s: gtype:%d gadget:%pK\n", __func__, gtype, gr); if (port_num >= NR_QTI_PORTS) { pr_err("%s: Invalid QTI port %d\n", __func__, port_num); return -ENODEV; @@ -261,7 +261,7 @@ void gqti_ctrl_disconnect(void *gr, u8 port_num) struct grmnet *g_rmnet = NULL; struct gqdss *g_dpl = NULL; - pr_debug("%s: gadget:%p\n", __func__, gr); + pr_debug("%s: gadget:%pK\n", __func__, gr); if (port_num >= NR_QTI_PORTS) { pr_err("%s: Invalid QTI port %d\n", __func__, port_num); @@ -659,7 +659,7 @@ static int qti_ctrl_read_stats(struct seq_file *s, void *unused) continue; spin_lock_irqsave(&port->lock, flags); - seq_printf(s, "\n#PORT:%d port: %p\n", i, port); + seq_printf(s, "\n#PORT:%d port: %pK\n", i, port); seq_printf(s, "name: %s\n", port->name); seq_printf(s, "host_to_modem: %d\n", port->host_to_modem); diff --git a/drivers/usb/gadget/function/u_data_bridge.c b/drivers/usb/gadget/function/u_data_bridge.c index 1cc7350ed13a7..2d55fdd710d4a 100644 --- a/drivers/usb/gadget/function/u_data_bridge.c +++ b/drivers/usb/gadget/function/u_data_bridge.c @@ -138,7 +138,7 @@ static int gbridge_alloc_requests(struct usb_ep *ep, struct list_head *head, int i; struct usb_request *req; - pr_debug("ep:%p head:%p num:%d size:%d cb:%p", + pr_debug("ep:%pK head:%pK num:%d size:%d cb:%pK", ep, head, num, size, cb); for (i = 0; i < num; i++) { @@ -188,7 +188,7 @@ static void gbridge_start_rx(struct gbridge_port *port) ret = usb_ep_queue(ep, req, GFP_KERNEL); spin_lock_irqsave(&port->port_lock, flags); if (ret) { - pr_err("port(%d):%p usb ep(%s) queue failed\n", + pr_err("port(%d):%pK usb ep(%s) queue failed\n", port->port_num, port, ep->name); list_add(&req->list, pool); break; @@ -203,7 +203,7 @@ static void gbridge_read_complete(struct usb_ep *ep, struct usb_request *req) struct gbridge_port *port = ep->driver_data; unsigned long flags; - pr_debug("ep:(%p)(%s) port:%p req_status:%d req->actual:%u\n", + pr_debug("ep:(%pK)(%s) port:%pK req_status:%d req->actual:%u\n", ep, ep->name, port, req->status, req->actual); if (!port) { pr_err("port is null\n"); @@ -230,7 +230,7 @@ static void gbridge_write_complete(struct usb_ep *ep, struct usb_request *req) unsigned long flags; struct gbridge_port *port = ep->driver_data; - pr_debug("ep:(%p)(%s) port:%p req_stats:%d\n", + pr_debug("ep:(%pK)(%s) port:%pK req_stats:%d\n", ep, ep->name, port, req->status); spin_lock_irqsave(&port->port_lock, flags); @@ -266,7 +266,7 @@ static void gbridge_start_io(struct gbridge_port *port) int ret = -ENODEV; unsigned long flags; - pr_debug("port: %p\n", port); + pr_debug("port: %pK\n", port); spin_lock_irqsave(&port->port_lock, flags); if (!port->port_usb) @@ -309,7 +309,7 @@ static void gbridge_stop_io(struct gbridge_port *port) struct usb_ep *out; unsigned long flags; - pr_debug("port:%p\n", port); + pr_debug("port:%pK\n", port); spin_lock_irqsave(&port->port_lock, flags); if (!port->port_usb) { spin_unlock_irqrestore(&port->port_lock, flags); @@ -358,7 +358,7 @@ int gbridge_port_open(struct inode *inode, struct file *file) } file->private_data = port; - pr_debug("opening port(%p)\n", port); + pr_debug("opening port(%pK)\n", port); ret = wait_event_interruptible(port->open_wq, port->is_connected); if (ret) { @@ -371,7 +371,7 @@ int gbridge_port_open(struct inode *inode, struct file *file) spin_unlock_irqrestore(&port->port_lock, flags); gbridge_start_rx(port); - pr_debug("port(%p) open is success\n", port); + pr_debug("port(%pK) open is success\n", port); return 0; } @@ -387,12 +387,12 @@ int gbridge_port_release(struct inode *inode, struct file *file) return -EINVAL; } - pr_debug("closing port(%p)\n", port); + pr_debug("closing port(%pK)\n", port); spin_lock_irqsave(&port->port_lock, flags); port->port_open = false; port->cbits_updated = false; spin_unlock_irqrestore(&port->port_lock, flags); - pr_debug("port(%p) is closed.\n", port); + pr_debug("port(%pK) is closed.\n", port); return 0; } @@ -416,7 +416,7 @@ ssize_t gbridge_port_read(struct file *file, return -EINVAL; } - pr_debug("read on port(%p) count:%zu\n", port, count); + pr_debug("read on port(%pK) count:%zu\n", port, count); spin_lock_irqsave(&port->port_lock, flags); current_rx_req = port->current_rx_req; pending_rx_bytes = port->pending_rx_bytes; @@ -517,7 +517,7 @@ ssize_t gbridge_port_write(struct file *file, } spin_lock_irqsave(&port->port_lock, flags); - pr_debug("write on port(%p)\n", port); + pr_debug("write on port(%pK)\n", port); if (!port->is_connected || !port->port_usb) { spin_unlock_irqrestore(&port->port_lock, flags); @@ -705,7 +705,7 @@ static long gbridge_port_ioctl(struct file *fp, unsigned cmd, case TIOCMBIC: case TIOCMBIS: case TIOCMSET: - pr_debug("TIOCMSET on port:%p\n", port); + pr_debug("TIOCMSET on port:%pK\n", port); i = get_user(val, (uint32_t *)arg); if (i) { pr_err("Error getting TIOCMSET value\n"); @@ -714,7 +714,7 @@ static long gbridge_port_ioctl(struct file *fp, unsigned cmd, ret = gbridge_port_tiocmset(port, val, ~val); break; case TIOCMGET: - pr_debug("TIOCMGET on port:%p\n", port); + pr_debug("TIOCMGET on port:%pK\n", port); ret = gbridge_port_tiocmget(port); if (ret >= 0) { ret = put_user(ret, (uint32_t *)arg); @@ -887,7 +887,7 @@ static void gbridge_debugfs_init(void) {} int gbridge_setup(void *gptr, u8 no_ports) { - pr_debug("gptr:%p, no_bridge_ports:%d\n", gptr, no_ports); + pr_debug("gptr:%pK, no_bridge_ports:%d\n", gptr, no_ports); if (no_ports >= num_of_instance) { pr_err("More ports are requested\n"); return -EINVAL; @@ -910,7 +910,7 @@ int gbridge_connect(void *gptr, u8 portno) return -EINVAL; } - pr_debug("gbridge:%p portno:%u\n", gptr, portno); + pr_debug("gbridge:%pK portno:%u\n", gptr, portno); port = ports[portno]; gser = gptr; @@ -921,7 +921,7 @@ int gbridge_connect(void *gptr, u8 portno) ret = usb_ep_enable(gser->in); if (ret) { - pr_err("usb_ep_enable failed eptype:IN ep:%p, err:%d", + pr_err("usb_ep_enable failed eptype:IN ep:%pK, err:%d", gser->in, ret); port->port_usb = 0; return ret; @@ -930,7 +930,7 @@ int gbridge_connect(void *gptr, u8 portno) ret = usb_ep_enable(gser->out); if (ret) { - pr_err("usb_ep_enable failed eptype:OUT ep:%p, err: %d", + pr_err("usb_ep_enable failed eptype:OUT ep:%pK, err: %d", gser->out, ret); port->port_usb = 0; gser->in->driver_data = 0; @@ -958,7 +958,7 @@ void gbridge_disconnect(void *gptr, u8 portno) return; } - pr_debug("gptr:%p portno:%u\n", gptr, portno); + pr_debug("gptr:%pK portno:%u\n", gptr, portno); if (portno >= num_of_instance) { pr_err("Wrong port no %d\n", portno); return; @@ -1010,7 +1010,7 @@ static int gbridge_port_alloc(int portno) INIT_LIST_HEAD(&ports[portno]->read_pool); INIT_LIST_HEAD(&ports[portno]->read_queued); INIT_LIST_HEAD(&ports[portno]->write_pool); - pr_debug("port:%p portno:%d\n", ports[portno], portno); + pr_debug("port:%pK portno:%d\n", ports[portno], portno); return 0; } diff --git a/drivers/usb/gadget/function/u_data_hsic.c b/drivers/usb/gadget/function/u_data_hsic.c index 07bb5a8fac5f1..c02c798a82ae7 100644 --- a/drivers/usb/gadget/function/u_data_hsic.c +++ b/drivers/usb/gadget/function/u_data_hsic.c @@ -156,7 +156,7 @@ static int ghsic_data_alloc_requests(struct usb_ep *ep, struct list_head *head, struct usb_request *req; unsigned long flags; - pr_debug("%s: ep:%s head:%p num:%d cb:%p", __func__, + pr_debug("%s: ep:%s head:%pK num:%d cb:%pK", __func__, ep->name, head, num, cb); for (i = 0; i < num; i++) { @@ -272,7 +272,7 @@ static int ghsic_data_receive(void *p, void *data, size_t len) return -ENOTCONN; } - pr_debug("%s: p:%p#%d skb_len:%d\n", __func__, + pr_debug("%s: p:%pK#%d skb_len:%d\n", __func__, port, port->port_num, skb->len); spin_lock_irqsave(&port->tx_lock, flags); @@ -316,7 +316,7 @@ static void ghsic_data_write_tomdm(struct work_struct *w) } while ((skb = __skb_dequeue(&port->rx_skb_q))) { - pr_debug("%s: port:%p tom:%lu pno:%d\n", __func__, + pr_debug("%s: port:%pK tom:%lu pno:%d\n", __func__, port, port->to_modem, port->port_num); info = (struct timestamp_info *)skb->cb; @@ -424,7 +424,7 @@ static void ghsic_data_start_rx(struct gdata_port *port) struct timestamp_info *info; unsigned int created; - pr_debug("%s: port:%p\n", __func__, port); + pr_debug("%s: port:%pK\n", __func__, port); if (!port) return; @@ -481,7 +481,7 @@ static void ghsic_data_start_io(struct gdata_port *port) struct usb_ep *ep_out, *ep_in; int ret; - pr_debug("%s: port:%p\n", __func__, port); + pr_debug("%s: port:%pK\n", __func__, port); if (!port) return; @@ -508,7 +508,7 @@ static void ghsic_data_start_io(struct gdata_port *port) spin_lock_irqsave(&port->tx_lock, flags); ep_in = port->in; spin_unlock_irqrestore(&port->tx_lock, flags); - pr_debug("%s: ep_in:%p\n", __func__, ep_in); + pr_debug("%s: ep_in:%pK\n", __func__, ep_in); if (!ep_in) { spin_lock_irqsave(&port->rx_lock, flags); @@ -543,7 +543,7 @@ static void ghsic_data_connect_w(struct work_struct *w) !test_bit(CH_READY, &port->bridge_sts)) return; - pr_debug("%s: port:%p\n", __func__, port); + pr_debug("%s: port:%pK\n", __func__, port); ret = data_bridge_open(&port->brdg); if (ret) { @@ -855,14 +855,14 @@ int ghsic_data_connect(void *gptr, int port_num) ret = usb_ep_enable(port->in); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:IN ep:%p", + pr_err("%s: usb_ep_enable failed eptype:IN ep:%pK", __func__, port->in); goto fail; } if (port->out) { ret = usb_ep_enable(port->out); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:OUT ep:%p", + pr_err("%s: usb_ep_enable failed eptype:OUT ep:%pK", __func__, port->out); usb_ep_disable(port->in); goto fail; @@ -939,7 +939,7 @@ static void dbg_timestamp(char *event, struct sk_buff * skb) write_lock_irqsave(&dbg_data.lck, flags); scnprintf(dbg_data.buf[dbg_data.idx], DBG_DATA_MSG, - "%p %u[%s] %u %u %u %u %u %u\n", + "%pK %u[%s] %u %u %u %u %u %u\n", skb, skb->len, event, info->created, info->rx_queued, info->rx_done, info->rx_done_sent, info->tx_queued, get_timestamp()); @@ -1013,7 +1013,7 @@ static ssize_t ghsic_data_read_stats(struct file *file, spin_lock_irqsave(&port->rx_lock, flags); temp += scnprintf(buf + temp, DEBUG_DATA_BUF_SIZE - temp, "\nName: %s\n" - "#PORT:%d port#: %p\n" + "#PORT:%d port#: %pK\n" "data_ch_open: %d\n" "data_ch_ready: %d\n" "\n******UL INFO*****\n\n" diff --git a/drivers/usb/gadget/function/u_data_ipa.c b/drivers/usb/gadget/function/u_data_ipa.c index 9f601239fc202..de17c3b4f821c 100644 --- a/drivers/usb/gadget/function/u_data_ipa.c +++ b/drivers/usb/gadget/function/u_data_ipa.c @@ -192,7 +192,7 @@ void ipa_data_disconnect(struct gadget_ipa_port *gp, u8 port_num) unsigned long flags; struct usb_gadget *gadget = NULL; - pr_debug("dev:%p port number:%d\n", gp, port_num); + pr_debug("dev:%pK port number:%d\n", gp, port_num); if (port_num >= n_ipa_ports) { pr_err("invalid ipa portno#%d\n", port_num); return; @@ -422,7 +422,6 @@ static void ipa_data_connect_work(struct work_struct *w) pr_err("usb_bam_connect_ipa out failed err:%d\n", ret); goto unconfig_msm_ep_in; } - gadget->bam2bam_func_enabled = true; gport->ipa_consumer_ep = port->ipa_params.ipa_cons_ep_idx; is_ipa_disconnected = false; @@ -438,7 +437,6 @@ static void ipa_data_connect_work(struct work_struct *w) pr_err("usb_bam_connect_ipa IN failed err:%d\n", ret); goto disconnect_usb_bam_ipa_out; } - gadget->bam2bam_func_enabled = true; gport->ipa_producer_ep = port->ipa_params.ipa_prod_ep_idx; is_ipa_disconnected = false; @@ -460,7 +458,7 @@ static void ipa_data_connect_work(struct work_struct *w) if (gport->in) ipa_data_start_endless_xfer(port, true); - pr_debug("Connect workqueue done (port %p)", port); + pr_debug("Connect workqueue done (port %pK)", port); return; disconnect_usb_bam_ipa_out: @@ -509,7 +507,7 @@ int ipa_data_connect(struct gadget_ipa_port *gp, u8 port_num, unsigned long flags; int ret; - pr_debug("dev:%p port#%d src_connection_idx:%d dst_connection_idx:%d\n", + pr_debug("dev:%pK port#%d src_connection_idx:%d dst_connection_idx:%d\n", gp, port_num, src_connection_idx, dst_connection_idx); if (port_num >= n_ipa_ports) { @@ -547,7 +545,7 @@ int ipa_data_connect(struct gadget_ipa_port *gp, u8 port_num, port->port_usb->in->endless = true; ret = usb_ep_enable(port->port_usb->in); if (ret) { - pr_err("usb_ep_enable failed eptype:IN ep:%p", + pr_err("usb_ep_enable failed eptype:IN ep:%pK", port->port_usb->in); port->port_usb->in->endless = false; goto err_usb_in; @@ -558,7 +556,7 @@ int ipa_data_connect(struct gadget_ipa_port *gp, u8 port_num, port->port_usb->out->endless = true; ret = usb_ep_enable(port->port_usb->out); if (ret) { - pr_err("usb_ep_enable failed eptype:OUT ep:%p", + pr_err("usb_ep_enable failed eptype:OUT ep:%pK", port->port_usb->out); port->port_usb->out->endless = false; goto err_usb_out; @@ -661,7 +659,7 @@ void ipa_data_suspend(struct gadget_ipa_port *gp, u8 port_num) struct ipa_data_ch_info *port; int ret; - pr_debug("dev:%p port number:%d\n", gp, port_num); + pr_debug("dev:%pK port number:%d\n", gp, port_num); if (port_num >= n_ipa_ports) { pr_err("invalid ipa portno#%d\n", port_num); @@ -709,7 +707,7 @@ void ipa_data_resume(struct gadget_ipa_port *gp, u8 port_num) struct usb_gadget *gadget = NULL; int ret; - pr_debug("dev:%p port number:%d\n", gp, port_num); + pr_debug("dev:%pK port number:%d\n", gp, port_num); if (port_num >= n_ipa_ports) { pr_err("invalid ipa portno#%d\n", port_num); @@ -785,7 +783,7 @@ static int ipa_data_port_alloc(int portno) ipa_data_ports[portno] = port; - pr_debug("port:%p with portno:%d allocated\n", port, portno); + pr_debug("port:%pK with portno:%d allocated\n", port, portno); return 0; } @@ -821,6 +819,12 @@ void ipa_data_port_select(int portno, enum gadget_type gtype) port->gtype = gtype; }; +void ipa_data_flush_workqueue(void) +{ + pr_debug("%s(): Flushing workqueue\n", __func__); + flush_workqueue(ipa_data_wq); +} + /** * ipa_data_setup() - setup BAM2BAM IPA port * @no_ipa_port: total number of BAM2BAM IPA port to support diff --git a/drivers/usb/gadget/function/u_data_ipa.h b/drivers/usb/gadget/function/u_data_ipa.h index b7d47ab1bb044..f6bc961ec4383 100644 --- a/drivers/usb/gadget/function/u_data_ipa.h +++ b/drivers/usb/gadget/function/u_data_ipa.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014,2016 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 @@ -31,5 +31,6 @@ int ipa_data_connect(struct gadget_ipa_port *gp, u8 port_num, int ipa_data_setup(unsigned int no_ipa_port); void ipa_data_resume(struct gadget_ipa_port *gp, u8 port_num); void ipa_data_suspend(struct gadget_ipa_port *gp, u8 port_num); +void ipa_data_flush_workqueue(void); #endif diff --git a/drivers/usb/gadget/function/u_ether.c b/drivers/usb/gadget/function/u_ether.c index 0b3bc8c19c3a8..5458b6b6d8158 100644 --- a/drivers/usb/gadget/function/u_ether.c +++ b/drivers/usb/gadget/function/u_ether.c @@ -1923,7 +1923,7 @@ int gether_get_host_addr_cdc(struct net_device *net, char *host_addr, int len) return -EINVAL; dev = netdev_priv(net); - snprintf(host_addr, len, "%pm", dev->host_mac); + snprintf(host_addr, len, "%pM", dev->host_mac); return strlen(host_addr); } diff --git a/drivers/usb/gadget/function/u_qdss.c b/drivers/usb/gadget/function/u_qdss.c index f44bf51e9e342..d29b0754ee97b 100644 --- a/drivers/usb/gadget/function/u_qdss.c +++ b/drivers/usb/gadget/function/u_qdss.c @@ -100,7 +100,6 @@ static int set_qdss_data_connection(struct usb_gadget *gadget, res = usb_bam_connect(usb_bam_type, idx, &(bam_info.usb_bam_pipe_idx)); - gadget->bam2bam_func_enabled = true; } else { kfree(bam_info.data_fifo); res = usb_bam_disconnect_pipe(usb_bam_type, idx); diff --git a/drivers/usb/gadget/function/u_rmnet.h b/drivers/usb/gadget/function/u_rmnet.h index 4336dbf26274e..c83aaae90a3e3 100644 --- a/drivers/usb/gadget/function/u_rmnet.h +++ b/drivers/usb/gadget/function/u_rmnet.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2016 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 @@ -76,4 +76,5 @@ int gsmd_ctrl_connect(struct grmnet *gr, int port_num); void gsmd_ctrl_disconnect(struct grmnet *gr, u8 port_num); int gsmd_ctrl_setup(enum ctrl_client client_num, unsigned int count, u8 *first_port_idx); +void gbam_data_flush_workqueue(void); #endif /* __U_RMNET_H*/ diff --git a/drivers/usb/gadget/function/u_rmnet_ctrl_smd.c b/drivers/usb/gadget/function/u_rmnet_ctrl_smd.c index 1fa27b0ed522b..b667eb416a2b1 100644 --- a/drivers/usb/gadget/function/u_rmnet_ctrl_smd.c +++ b/drivers/usb/gadget/function/u_rmnet_ctrl_smd.c @@ -142,7 +142,7 @@ static void grmnet_ctrl_smd_read_w(struct work_struct *w) (c->ch == 0))); if (read_avail < 0 || c->ch == 0) { - pr_err("%s:smd read_avail failure:%d or channel closed ch=%p", + pr_err("%s:smd read_avail failure:%d or channel closed ch=%pK", __func__, read_avail, c->ch); kfree(buf); return; @@ -435,7 +435,7 @@ int gsmd_ctrl_connect(struct grmnet *gr, int port_num) struct smd_ch_info *c; unsigned long flags; - pr_debug("%s: grmnet:%p port#%d\n", __func__, gr, port_num); + pr_debug("%s: grmnet:%pK port#%d\n", __func__, gr, port_num); if (!is_legal_port_num(port_num)) { pr_err("%s: Invalid port_num#%d\n", __func__, port_num); @@ -491,7 +491,7 @@ void gsmd_ctrl_disconnect(struct grmnet *gr, u8 port_num) struct rmnet_ctrl_pkt *cpkt; int clear_bits; - pr_debug("%s: grmnet:%p port#%d\n", __func__, gr, port_num); + pr_debug("%s: grmnet:%pK port#%d\n", __func__, gr, port_num); if (!is_legal_port_num(port_num)) { pr_err("%s: Invalid port_num#%d\n", __func__, port_num); @@ -646,7 +646,7 @@ static int grmnet_ctrl_smd_port_alloc(int portno) pdrv->driver.name = c->name; pdrv->driver.owner = THIS_MODULE; - pr_debug("%s: port:%p portno:%d\n", __func__, port, portno); + pr_debug("%s: port:%pK portno:%d\n", __func__, port, portno); return 0; } @@ -735,7 +735,7 @@ static ssize_t gsmd_ctrl_read_stats(struct file *file, char __user *ubuf, c = &port->ctrl_ch; temp += scnprintf(buf + temp, DEBUG_BUF_SIZE - temp, - "#PORT:%d port:%p ctrl_ch:%p#\n" + "#PORT:%d port:%pK ctrl_ch:%pK#\n" "to_usbhost: %lu\n" "to_modem: %lu\n" "DTR: %s\n" diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c index 2610e220d32e5..ef7885a8f2ee1 100644 --- a/drivers/usb/gadget/function/u_serial.c +++ b/drivers/usb/gadget/function/u_serial.c @@ -871,7 +871,7 @@ static int gs_open(struct tty_struct *tty, struct file *file) spin_lock_irq(&port->port_lock); if (status) { - pr_debug("gs_open: ttyGS%d (%p,%p) no buffer\n", + pr_debug("gs_open: ttyGS%d (%pK,%pK) no buffer\n", port->port_num, tty, file); port->openclose = false; goto exit_unlock_port; @@ -906,7 +906,7 @@ static int gs_open(struct tty_struct *tty, struct file *file) gser->connect(gser); } - pr_debug("gs_open: ttyGS%d (%p,%p)\n", port->port_num, tty, file); + pr_debug("gs_open: ttyGS%d (%pK,%pK)\n", port->port_num, tty, file); status = 0; @@ -942,7 +942,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) goto exit; } - pr_debug("gs_close: ttyGS%d (%p,%p) ...\n", port->port_num, tty, file); + pr_debug("gs_close: ttyGS%d (%pK,%pK) ...\n", port->port_num, tty, file); /* mark port as closing but in use; we can drop port lock * and sleep if necessary @@ -980,7 +980,7 @@ static void gs_close(struct tty_struct *tty, struct file *file) port->openclose = false; - pr_debug("gs_close: ttyGS%d (%p,%p) done!\n", + pr_debug("gs_close: ttyGS%d (%pK,%pK) done!\n", port->port_num, tty, file); wake_up(&port->port.close_wait); @@ -996,7 +996,7 @@ static int gs_write(struct tty_struct *tty, const unsigned char *buf, int count) if (!port) return 0; - pr_vdebug("gs_write: ttyGS%d (%p) writing %d bytes\n", + pr_vdebug("gs_write: ttyGS%d (%pK) writing %d bytes\n", port->port_num, tty, count); spin_lock_irqsave(&port->port_lock, flags); @@ -1018,7 +1018,7 @@ static int gs_put_char(struct tty_struct *tty, unsigned char ch) if (!port) return 0; - pr_vdebug("gs_put_char: (%d,%p) char=0x%x, called from %pf\n", + pr_vdebug("gs_put_char: (%d,%pK) char=0x%x, called from %pKf\n", port->port_num, tty, ch, __builtin_return_address(0)); spin_lock_irqsave(&port->port_lock, flags); @@ -1035,7 +1035,7 @@ static void gs_flush_chars(struct tty_struct *tty) if (!port) return; - pr_vdebug("gs_flush_chars: (%d,%p)\n", port->port_num, tty); + pr_vdebug("gs_flush_chars: (%d,%pK)\n", port->port_num, tty); spin_lock_irqsave(&port->port_lock, flags); if (port->port_usb) @@ -1056,7 +1056,7 @@ static int gs_write_room(struct tty_struct *tty) room = gs_buf_space_avail(&port->port_write_buf); spin_unlock_irqrestore(&port->port_lock, flags); - pr_vdebug("gs_write_room: (%d,%p) room=%d\n", + pr_vdebug("gs_write_room: (%d,%pK) room=%d\n", port->port_num, tty, room); return room; @@ -1074,7 +1074,7 @@ static int gs_chars_in_buffer(struct tty_struct *tty) chars = gs_buf_data_avail(&port->port_write_buf); spin_unlock_irqrestore(&port->port_lock, flags); - pr_vdebug("gs_chars_in_buffer: (%d,%p) chars=%d\n", + pr_vdebug("gs_chars_in_buffer: (%d,%pK) chars=%d\n", port->port_num, tty, chars); return chars; diff --git a/drivers/usb/gadget/function/u_smd.c b/drivers/usb/gadget/function/u_smd.c index 6ebdd206bb454..2164775a975cd 100644 --- a/drivers/usb/gadget/function/u_smd.c +++ b/drivers/usb/gadget/function/u_smd.c @@ -149,7 +149,7 @@ static int gsmd_alloc_requests(struct usb_ep *ep, struct list_head *head, int i; struct usb_request *req; - pr_debug("%s: ep:%p head:%p num:%d size:%d cb:%p", __func__, + pr_debug("%s: ep:%pK head:%pK num:%d size:%d cb:%pK", __func__, ep, head, num, size, cb); for (i = 0; i < num; i++) { @@ -199,7 +199,7 @@ static void gsmd_start_rx(struct gsmd_port *port) spin_lock_irqsave(&port->port_lock, flags); if (ret) { pr_err("%s: usb ep out queue failed" - "port:%p, port#%d\n", + "port:%pK, port#%d\n", __func__, port, port->port_num); list_add_tail(&req->list, pool); break; @@ -215,7 +215,7 @@ static void gsmd_rx_push(struct work_struct *w) struct smd_port_info *pi = port->pi; struct list_head *q; - pr_debug("%s: port:%p port#%d", __func__, port, port->port_num); + pr_debug("%s: port:%pK port#%d", __func__, port, port->port_num); spin_lock_irq(&port->port_lock); @@ -228,11 +228,11 @@ static void gsmd_rx_push(struct work_struct *w) switch (req->status) { case -ESHUTDOWN: - pr_debug("%s: req status shutdown portno#%d port:%p\n", + pr_debug("%s: req status shutdown portno#%d port:%pK\n", __func__, port->port_num, port); goto rx_push_end; default: - pr_warning("%s: port:%p port#%d" + pr_warning("%s: port:%pK port#%d" " Unexpected Rx Status:%d\n", __func__, port, port->port_num, req->status); case 0: @@ -305,7 +305,7 @@ static void gsmd_tx_pull(struct work_struct *w) struct usb_ep *in; int ret; - pr_debug("%s: port:%p port#%d pool:%p\n", __func__, + pr_debug("%s: port:%pK port#%d pool:%pK\n", __func__, port, port->port_num, pool); spin_lock_irq(&port->port_lock); @@ -365,7 +365,7 @@ static void gsmd_tx_pull(struct work_struct *w) spin_lock_irq(&port->port_lock); if (ret) { pr_err("%s: usb ep in queue failed" - "port:%p, port#%d err:%d\n", + "port:%pK, port#%d err:%d\n", __func__, port, port->port_num, ret); /* could be usb disconnected */ if (!port->port_usb) @@ -392,7 +392,7 @@ static void gsmd_read_complete(struct usb_ep *ep, struct usb_request *req) { struct gsmd_port *port = ep->driver_data; - pr_debug("%s: ep:%p port:%p\n", __func__, ep, port); + pr_debug("%s: ep:%pK port:%pK\n", __func__, ep, port); if (!port) { pr_err("%s: port is null\n", __func__); @@ -418,7 +418,7 @@ static void gsmd_write_complete(struct usb_ep *ep, struct usb_request *req) { struct gsmd_port *port = ep->driver_data; - pr_debug("%s: ep:%p port:%p\n", __func__, ep, port); + pr_debug("%s: ep:%pK port:%pK\n", __func__, ep, port); if (!port) { pr_err("%s: port is null\n", __func__); @@ -434,7 +434,7 @@ static void gsmd_write_complete(struct usb_ep *ep, struct usb_request *req) } if (req->status) - pr_warning("%s: port:%p port#%d unexpected %s status %d\n", + pr_warning("%s: port:%pK port#%d unexpected %s status %d\n", __func__, port, port->port_num, ep->name, req->status); @@ -449,7 +449,7 @@ static void gsmd_start_io(struct gsmd_port *port) { int ret = -ENODEV; - pr_debug("%s: port: %p\n", __func__, port); + pr_debug("%s: port: %pK\n", __func__, port); spin_lock(&port->port_lock); @@ -604,7 +604,7 @@ static void gsmd_connect_work(struct work_struct *w) port = container_of(w, struct gsmd_port, connect_work.work); pi = port->pi; - pr_debug("%s: port:%p port#%d\n", __func__, port, port->port_num); + pr_debug("%s: port:%pK port#%d\n", __func__, port, port->port_num); if (!test_bit(CH_READY, &pi->flags)) return; @@ -633,7 +633,7 @@ static void gsmd_disconnect_work(struct work_struct *w) port = container_of(w, struct gsmd_port, disconnect_work); pi = port->pi; - pr_debug("%s: port:%p port#%d\n", __func__, port, port->port_num); + pr_debug("%s: port:%pK port#%d\n", __func__, port, port->port_num); smd_close(port->pi->ch); port->pi->ch = NULL; @@ -701,7 +701,7 @@ int gsmd_connect(struct gserial *gser, u8 portno) int ret; struct gsmd_port *port; - pr_debug("%s: gserial:%p portno:%u\n", __func__, gser, portno); + pr_debug("%s: gserial:%pK portno:%u\n", __func__, gser, portno); if (portno >= n_smd_ports) { pr_err("%s: Invalid port no#%d", __func__, portno); @@ -725,7 +725,7 @@ int gsmd_connect(struct gserial *gser, u8 portno) ret = usb_ep_enable(gser->in); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:IN ep:%p, err:%d", + pr_err("%s: usb_ep_enable failed eptype:IN ep:%pK, err:%d", __func__, gser->in, ret); port->port_usb = 0; return ret; @@ -734,7 +734,7 @@ int gsmd_connect(struct gserial *gser, u8 portno) ret = usb_ep_enable(gser->out); if (ret) { - pr_err("%s: usb_ep_enable failed eptype:OUT ep:%p, err: %d", + pr_err("%s: usb_ep_enable failed eptype:OUT ep:%pK, err: %d", __func__, gser->out, ret); port->port_usb = 0; gser->in->driver_data = 0; @@ -752,7 +752,7 @@ void gsmd_disconnect(struct gserial *gser, u8 portno) unsigned long flags; struct gsmd_port *port; - pr_debug("%s: gserial:%p portno:%u\n", __func__, gser, portno); + pr_debug("%s: gserial:%pK portno:%u\n", __func__, gser, portno); if (portno >= n_smd_ports) { pr_err("%s: invalid portno#%d\n", __func__, portno); @@ -890,7 +890,7 @@ static int gsmd_port_alloc(int portno, struct usb_cdc_line_coding *coding) pdrv->driver.owner = THIS_MODULE; platform_driver_register(pdrv); - pr_debug("%s: port:%p portno:%d\n", __func__, port, portno); + pr_debug("%s: port:%pK portno:%d\n", __func__, port, portno); return 0; } @@ -994,10 +994,10 @@ int gsmd_setup(struct usb_gadget *g, unsigned count) int ret; int i; - pr_debug("%s: g:%p count: %d\n", __func__, g, count); + pr_debug("%s: g:%pK count: %d\n", __func__, g, count); if (!count || count > SMD_N_PORTS) { - pr_err("%s: Invalid num of ports count:%d gadget:%p\n", + pr_err("%s: Invalid num of ports count:%d gadget:%pK\n", __func__, count, g); return -EINVAL; } @@ -1042,7 +1042,7 @@ void gsmd_suspend(struct gserial *gser, u8 portno) { struct gsmd_port *port; - pr_debug("%s: gserial:%p portno:%u\n", __func__, gser, portno); + pr_debug("%s: gserial:%pK portno:%u\n", __func__, gser, portno); port = smd_ports[portno].port; spin_lock(&port->port_lock); @@ -1054,7 +1054,7 @@ void gsmd_resume(struct gserial *gser, u8 portno) { struct gsmd_port *port; - pr_debug("%s: gserial:%p portno:%u\n", __func__, gser, portno); + pr_debug("%s: gserial:%pK portno:%u\n", __func__, gser, portno); port = smd_ports[portno].port; spin_lock(&port->port_lock); diff --git a/drivers/usb/gadget/function/u_uac2.h b/drivers/usb/gadget/function/u_uac2.h index 78dd37279bd45..9c4f4bdf05493 100644 --- a/drivers/usb/gadget/function/u_uac2.h +++ b/drivers/usb/gadget/function/u_uac2.h @@ -18,7 +18,7 @@ #include -#define UAC2_DEF_PCHMASK 0x3 +#define UAC2_DEF_PCHMASK 0x1 #define UAC2_DEF_PSRATE 48000 #define UAC2_DEF_PSSIZE 2 #define UAC2_DEF_CCHMASK 0x3 diff --git a/drivers/usb/gadget/function/u_uvc.h b/drivers/usb/gadget/function/u_uvc.h index 2a8dfdff03325..96d3f39441c9a 100644 --- a/drivers/usb/gadget/function/u_uvc.h +++ b/drivers/usb/gadget/function/u_uvc.h @@ -18,6 +18,24 @@ #include +/* module parameters specific to the Video streaming endpoint */ +#define USB_VIDEO_MODULE_PARAMETERS() \ + static unsigned int streaming_interval = 1; \ + module_param(streaming_interval, uint, S_IRUGO|S_IWUSR); \ + MODULE_PARM_DESC(streaming_interval, "1 - 16"); \ + \ + static unsigned int streaming_maxpacket = 3072; \ + module_param(streaming_maxpacket, uint, S_IRUGO|S_IWUSR); \ + MODULE_PARM_DESC(streaming_maxpacket, "1-1023 (FS), 1-3072 (hs/ss)"); \ + \ + static unsigned int streaming_maxburst; \ + module_param(streaming_maxburst, uint, S_IRUGO|S_IWUSR); \ + MODULE_PARM_DESC(streaming_maxburst, "0 - 15 (ss only)"); \ + \ + static unsigned int trace; \ + module_param(trace, uint, S_IRUGO|S_IWUSR); \ + MODULE_PARM_DESC(trace, "Trace level bitmask") + #define to_f_uvc_opts(f) container_of(f, struct f_uvc_opts, func_inst) struct f_uvc_opts { diff --git a/drivers/usb/gadget/function/uvc_video.c b/drivers/usb/gadget/function/uvc_video.c index 9cb86bc1a9a54..5cd4a2e506fb2 100644 --- a/drivers/usb/gadget/function/uvc_video.c +++ b/drivers/usb/gadget/function/uvc_video.c @@ -238,11 +238,17 @@ uvc_video_alloc_requests(struct uvc_video *video) unsigned int i; int ret = -ENOMEM; - BUG_ON(video->req_size); + if (video->req_size) { + pr_err("%s: close the video node and reopen it\n", + __func__); + return -EBUSY; + } - req_size = video->ep->maxpacket + req_size = (video->ep->maxpacket & 0x7FF) * max_t(unsigned int, video->ep->maxburst, 1) - * (video->ep->mult + 1); + * (max_t(unsigned int, + (video->ep->maxpacket >> 11) & 0x3, + video->ep->mult) + 1); for (i = 0; i < UVC_NUM_REQUESTS; ++i) { video->req_buffer[i] = kmalloc(req_size, GFP_KERNEL); diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index db2becd31a51e..8b862fe869f92 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c @@ -309,7 +309,7 @@ get_ready_ep (unsigned f_flags, struct ep_data *epdata) // case STATE_EP_DISABLED: /* "can't happen" */ // case STATE_EP_READY: /* "can't happen" */ default: /* error! */ - pr_debug ("%s: ep %p not available, state %d\n", + pr_debug ("%s: ep %pK not available, state %d\n", shortname, epdata, epdata->state); // FALLTHROUGH case STATE_EP_UNBOUND: /* clean disconnect */ @@ -1940,7 +1940,7 @@ dev_config (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) fail: spin_unlock_irq (&dev->lock); - pr_debug ("%s: %s fail %Zd, %p\n", shortname, __func__, value, dev); + pr_debug ("%s: %s fail %Zd, %pK\n", shortname, __func__, value, dev); kfree (dev->buf); dev->buf = NULL; return value; diff --git a/drivers/usb/host/ehci-dbg.c b/drivers/usb/host/ehci-dbg.c index 524cbf26d9925..e5a4bd495fec8 100644 --- a/drivers/usb/host/ehci-dbg.c +++ b/drivers/usb/host/ehci-dbg.c @@ -106,7 +106,7 @@ static inline void dbg_hcc_params (struct ehci_hcd *ehci, char *label) {} static void __maybe_unused dbg_qtd (const char *label, struct ehci_hcd *ehci, struct ehci_qtd *qtd) { - ehci_dbg(ehci, "%s td %p n%08x %08x t%08x p0=%08x\n", label, qtd, + ehci_dbg(ehci, "%s td %pK n%08x %08x t%08x p0=%08x\n", label, qtd, hc32_to_cpup(ehci, &qtd->hw_next), hc32_to_cpup(ehci, &qtd->hw_alt_next), hc32_to_cpup(ehci, &qtd->hw_token), @@ -124,7 +124,7 @@ dbg_qh (const char *label, struct ehci_hcd *ehci, struct ehci_qh *qh) { struct ehci_qh_hw *hw = qh->hw; - ehci_dbg (ehci, "%s qh %p n%08x info %x %x qtd %x\n", label, + ehci_dbg (ehci, "%s qh %pK n%08x info %x %x qtd %x\n", label, qh, hw->hw_next, hw->hw_info1, hw->hw_info2, hw->hw_current); dbg_qtd("overlay", ehci, (struct ehci_qtd *) &hw->hw_qtd_next); } @@ -132,7 +132,7 @@ dbg_qh (const char *label, struct ehci_hcd *ehci, struct ehci_qh *qh) static void __maybe_unused dbg_itd (const char *label, struct ehci_hcd *ehci, struct ehci_itd *itd) { - ehci_dbg (ehci, "%s [%d] itd %p, next %08x, urb %p\n", + ehci_dbg (ehci, "%s [%d] itd %pK, next %08x, urb %pK\n", label, itd->frame, itd, hc32_to_cpu(ehci, itd->hw_next), itd->urb); ehci_dbg (ehci, @@ -163,7 +163,7 @@ dbg_itd (const char *label, struct ehci_hcd *ehci, struct ehci_itd *itd) static void __maybe_unused dbg_sitd (const char *label, struct ehci_hcd *ehci, struct ehci_sitd *sitd) { - ehci_dbg (ehci, "%s [%d] sitd %p, next %08x, urb %p\n", + ehci_dbg (ehci, "%s [%d] sitd %pK, next %08x, urb %pK\n", label, sitd->frame, sitd, hc32_to_cpu(ehci, sitd->hw_next), sitd->urb); ehci_dbg (ehci, @@ -436,7 +436,7 @@ static void qh_lines ( scratch = hc32_to_cpup(ehci, &hw->hw_info1); hw_curr = (mark == '*') ? hc32_to_cpup(ehci, &hw->hw_current) : 0; temp = scnprintf (next, size, - "qh/%p dev%d %cs ep%d %08x %08x (%08x%c %s nak%d)", + "qh/%pK dev%d %cs ep%d %08x %08x (%08x%c %s nak%d)", qh, scratch & 0x007f, speed_char (scratch), (scratch >> 8) & 0x000f, @@ -464,7 +464,7 @@ static void qh_lines ( mark = '/'; } temp = snprintf (next, size, - "\n\t%p%c%s len=%d %08x urb %p", + "\n\t%pK%c%s len=%d %08x urb %pK", td, mark, ({ char *tmp; switch ((scratch>>8)&0x03) { case 0: tmp = "out"; break; @@ -661,7 +661,7 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) switch (hc32_to_cpu(ehci, tag)) { case Q_TYPE_QH: hw = p.qh->hw; - temp = scnprintf (next, size, " qh%d-%04x/%p", + temp = scnprintf (next, size, " qh%d-%04x/%pK", p.qh->ps.period, hc32_to_cpup(ehci, &hw->hw_info2) @@ -723,20 +723,20 @@ static ssize_t fill_periodic_buffer(struct debug_buffer *buf) break; case Q_TYPE_FSTN: temp = scnprintf (next, size, - " fstn-%8x/%p", p.fstn->hw_prev, + " fstn-%8x/%pK", p.fstn->hw_prev, p.fstn); tag = Q_NEXT_TYPE(ehci, p.fstn->hw_next); p = p.fstn->fstn_next; break; case Q_TYPE_ITD: temp = scnprintf (next, size, - " itd/%p", p.itd); + " itd/%pK", p.itd); tag = Q_NEXT_TYPE(ehci, p.itd->hw_next); p = p.itd->itd_next; break; case Q_TYPE_SITD: temp = scnprintf (next, size, - " sitd%d-%04x/%p", + " sitd%d-%04x/%pK", p.sitd->stream->ps.period, hc32_to_cpup(ehci, &p.sitd->hw_uframe) & 0x0000ffff, @@ -908,7 +908,7 @@ static ssize_t fill_registers_buffer(struct debug_buffer *buf) } if (!list_empty(&ehci->async_unlink)) { - temp = scnprintf(next, size, "async unlink qh %p\n", + temp = scnprintf(next, size, "async unlink qh %pK\n", list_first_entry(&ehci->async_unlink, struct ehci_qh, unlink_node)); size -= temp; diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 9ac96f3656004..7725563bfb177 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -1006,7 +1006,7 @@ ehci_endpoint_disable (struct usb_hcd *hcd, struct usb_host_endpoint *ep) /* caller was supposed to have unlinked any requests; * that's not our job. just leak this memory. */ - ehci_err (ehci, "qh %p (#%02x) state %d%s\n", + ehci_err (ehci, "qh %pK (#%02x) state %d%s\n", qh, ep->desc.bEndpointAddress, qh->qh_state, list_empty (&qh->qtd_list) ? "" : "(has tds)"); break; diff --git a/drivers/usb/host/ehci-msm-hsic.c b/drivers/usb/host/ehci-msm-hsic.c index 2bbffda01effc..5a3ca6ae71743 100644 --- a/drivers/usb/host/ehci-msm-hsic.c +++ b/drivers/usb/host/ehci-msm-hsic.c @@ -271,7 +271,7 @@ static void dbg_log_event(struct urb *urb, char * event, unsigned extra) if (!str_to_event(event)) { write_lock_irqsave(&dbg_hsic_ctrl.lck, flags); scnprintf(dbg_hsic_ctrl.buf[dbg_hsic_ctrl.idx], - DBG_MSG_LEN, "%s: [%s : %p]:[%s] " + DBG_MSG_LEN, "%s: [%s : %pK]:[%s] " "%02x %02x %04x %04x %04x %u %d %s", get_timestamp(tbuf), event, urb, usb_urb_dir_in(urb) ? "in" : "out", @@ -291,7 +291,7 @@ static void dbg_log_event(struct urb *urb, char * event, unsigned extra) } else { write_lock_irqsave(&dbg_hsic_ctrl.lck, flags); scnprintf(dbg_hsic_ctrl.buf[dbg_hsic_ctrl.idx], - DBG_MSG_LEN, "%s: [%s : %p]:[%s] %u %d %s", + DBG_MSG_LEN, "%s: [%s : %pK]:[%s] %u %d %s", get_timestamp(tbuf), event, urb, usb_urb_dir_in(urb) ? "in" : "out", urb->actual_length, extra, @@ -304,7 +304,7 @@ static void dbg_log_event(struct urb *urb, char * event, unsigned extra) } else { write_lock_irqsave(&dbg_hsic_data.lck, flags); scnprintf(dbg_hsic_data.buf[dbg_hsic_data.idx], DBG_MSG_LEN, - "%s: [%s : %p]:ep%d[%s] %u %d %s", + "%s: [%s : %pK]:ep%d[%s] %u %d %s", get_timestamp(tbuf), event, urb, ep_addr & 0x0f, usb_urb_dir_in(urb) ? "in" : "out", str_to_event(event) ? urb->actual_length : @@ -336,7 +336,7 @@ static void dump_hsic_regs(struct usb_hcd *hcd) return; for (i = USB_REG_START_OFFSET; i <= USB_REG_END_OFFSET; i += 0x10) - pr_info("%p: %08x\t%08x\t%08x\t%08x\n", hcd->regs + i, + pr_info("%pK: %08x\t%08x\t%08x\t%08x\n", hcd->regs + i, readl_relaxed(hcd->regs + i), readl_relaxed(hcd->regs + i + 4), readl_relaxed(hcd->regs + i + 8), @@ -690,7 +690,7 @@ static int msm_hsic_start(struct msm_hsic_hcd *mehci) while (seq[0] >= 0 && seq_count > 0) { val = readl_relaxed(mehci->tlmm_regs + seq[0]); val |= seq[1]; - dev_dbg(mehci->dev, "%s: writing %x to %p\n", + dev_dbg(mehci->dev, "%s: writing %x to %pK\n", __func__, val, mehci->tlmm_regs + seq[0]); writel_relaxed(val, mehci->tlmm_regs + seq[0]); @@ -1677,7 +1677,7 @@ static irqreturn_t hsic_peripheral_status_change(int irq, void *dev_id) { struct msm_hsic_hcd *mehci = dev_id; - pr_debug("%s: mehci:%p dev_id:%p\n", __func__, mehci, dev_id); + pr_debug("%s: mehci:%pK dev_id:%pK\n", __func__, mehci, dev_id); if (mehci) msm_hsic_config_gpios(mehci, 0); diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 54f5332f814dd..ed4a20a7ca200 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c @@ -264,7 +264,7 @@ ehci_urb_done(struct ehci_hcd *ehci, struct urb *urb, int status) #ifdef EHCI_URB_TRACE ehci_dbg (ehci, - "%s %s urb %p ep%d%s status %d len %d/%d\n", + "%s %s urb %pK ep%d%s status %d len %d/%d\n", __func__, urb->dev->devpath, urb, usb_pipeendpoint (urb->pipe), usb_pipein (urb->pipe) ? "in" : "out", @@ -350,7 +350,7 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) /* Report Data Buffer Error: non-fatal but useful */ if (token & QTD_STS_DBE) ehci_dbg(ehci, - "detected DataBufferErr for urb %p ep%d%s len %d, qtd %p [qh %p]\n", + "detected DataBufferErr for urb %pK ep%d%s len %d, qtd %pK [qh %pK]\n", urb, usb_endpoint_num(&urb->ep->desc), usb_endpoint_dir_in(&urb->ep->desc) ? "in" : "out", @@ -924,7 +924,7 @@ qh_make ( } break; default: - ehci_dbg(ehci, "bogus dev %p speed %d\n", urb->dev, + ehci_dbg(ehci, "bogus dev %pK speed %d\n", urb->dev, urb->dev->speed); done: qh_destroy(ehci, qh); @@ -1112,7 +1112,7 @@ submit_async ( struct ehci_qtd *qtd; qtd = list_entry(qtd_list->next, struct ehci_qtd, qtd_list); ehci_dbg(ehci, - "%s %s urb %p ep%d%s len %d, qtd %p [qh %p]\n", + "%s %s urb %pK ep%d%s len %d, qtd %pK [qh %pK]\n", __func__, urb->dev->devpath, urb, epnum & 0x0f, (epnum & USB_DIR_IN) ? "in" : "out", urb->transfer_buffer_length, diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index c399606f154e4..fc62964e659e9 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c @@ -548,7 +548,7 @@ static void qh_link_periodic(struct ehci_hcd *ehci, struct ehci_qh *qh) unsigned period = qh->ps.period; dev_dbg(&qh->ps.udev->dev, - "link qh%d-%04x/%p start %d [%d/%d us]\n", + "link qh%d-%04x/%pK start %d [%d/%d us]\n", period, hc32_to_cpup(ehci, &qh->hw->hw_info2) & (QH_CMASK | QH_SMASK), qh, qh->ps.phase, qh->ps.usecs, qh->ps.c_usecs); @@ -641,7 +641,7 @@ static void qh_unlink_periodic(struct ehci_hcd *ehci, struct ehci_qh *qh) : (qh->ps.usecs * 8); dev_dbg(&qh->ps.udev->dev, - "unlink qh%d-%04x/%p start %d [%d/%d us]\n", + "unlink qh%d-%04x/%pK start %d [%d/%d us]\n", qh->ps.period, hc32_to_cpup(ehci, &qh->hw->hw_info2) & (QH_CMASK | QH_SMASK), qh, qh->ps.phase, qh->ps.usecs, qh->ps.c_usecs); @@ -751,7 +751,7 @@ static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh) * FIXME kill the now-dysfunctional queued urbs */ else { - ehci_err(ehci, "can't reschedule qh %p, err %d\n", + ehci_err(ehci, "can't reschedule qh %pK, err %d\n", qh, rc); } } @@ -869,7 +869,7 @@ static int qh_schedule(struct ehci_hcd *ehci, struct ehci_qh *qh) /* reuse the previous schedule slots, if we can */ if (qh->ps.phase != NO_FRAME) { - ehci_dbg(ehci, "reused qh %p schedule\n", qh); + ehci_dbg(ehci, "reused qh %pK schedule\n", qh); return 0; } @@ -1552,7 +1552,7 @@ iso_stream_schedule ( /* no room in the schedule */ if (!done) { - ehci_dbg(ehci, "iso sched full %p", urb); + ehci_dbg(ehci, "iso sched full %pK", urb); status = -ENOSPC; goto fail; } @@ -1606,7 +1606,7 @@ iso_stream_schedule ( /* Is the schedule already full? */ if (unlikely(!empty && start < period)) { - ehci_dbg(ehci, "iso sched full %p (%u-%u < %u mod %u)\n", + ehci_dbg(ehci, "iso sched full %pK (%u-%u < %u mod %u)\n", urb, stream->next_uframe, base, period, mod); status = -ENOSPC; goto fail; @@ -1635,7 +1635,7 @@ iso_stream_schedule ( /* How many uframes and packets do we need to skip? */ skip = (now2 - start + period - 1) & -period; if (skip >= span) { /* Entirely in the past? */ - ehci_dbg(ehci, "iso underrun %p (%u+%u < %u) [%u]\n", + ehci_dbg(ehci, "iso underrun %pK (%u+%u < %u) [%u]\n", urb, start + base, span - period, now2 + base, base); @@ -1662,7 +1662,7 @@ iso_stream_schedule ( use_start: /* Tried to schedule too far into the future? */ if (unlikely(start + span - period >= mod + wrap)) { - ehci_dbg(ehci, "request %p would overflow (%u+%u >= %u)\n", + ehci_dbg(ehci, "request %pK would overflow (%u+%u >= %u)\n", urb, start, span - period, mod + wrap); status = -EFBIG; goto fail; @@ -1957,7 +1957,7 @@ static int itd_submit (struct ehci_hcd *ehci, struct urb *urb, #ifdef EHCI_URB_TRACE ehci_dbg (ehci, - "%s %s urb %p ep%d%s len %d, %d pkts %d uframes [%p]\n", + "%s %s urb %pK ep%d%s len %d, %d pkts %d uframes [%pK]\n", __func__, urb->dev->devpath, urb, usb_pipeendpoint (urb->pipe), usb_pipein (urb->pipe) ? "in" : "out", @@ -2337,7 +2337,7 @@ static int sitd_submit (struct ehci_hcd *ehci, struct urb *urb, #ifdef EHCI_URB_TRACE ehci_dbg (ehci, - "submit %p dev%s ep%d%s-iso len %d\n", + "submit %pK dev%s ep%d%s-iso len %d\n", urb, urb->dev->devpath, usb_pipeendpoint (urb->pipe), usb_pipein (urb->pipe) ? "in" : "out", @@ -2490,7 +2490,7 @@ static void scan_isoc(struct ehci_hcd *ehci) q = *q_p; break; default: - ehci_dbg(ehci, "corrupt type %d frame %d shadow %p\n", + ehci_dbg(ehci, "corrupt type %d frame %d shadow %pK\n", type, frame, q.ptr); // BUG (); /* FALL THROUGH */ diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c index bb89175ca6e5d..092a9997aa0fa 100644 --- a/drivers/usb/host/xhci-dbg.c +++ b/drivers/usb/host/xhci-dbg.c @@ -30,10 +30,10 @@ void xhci_dbg_regs(struct xhci_hcd *xhci) { u32 temp; - xhci_dbg(xhci, "// xHCI capability registers at %p:\n", + xhci_dbg(xhci, "// xHCI capability registers at %pK:\n", xhci->cap_regs); temp = readl(&xhci->cap_regs->hc_capbase); - xhci_dbg(xhci, "// @%p = 0x%x (CAPLENGTH AND HCIVERSION)\n", + xhci_dbg(xhci, "// @%pK = 0x%x (CAPLENGTH AND HCIVERSION)\n", &xhci->cap_regs->hc_capbase, temp); xhci_dbg(xhci, "// CAPLENGTH: 0x%x\n", (unsigned int) HC_LENGTH(temp)); @@ -42,24 +42,24 @@ void xhci_dbg_regs(struct xhci_hcd *xhci) (unsigned int) HC_VERSION(temp)); #endif - xhci_dbg(xhci, "// xHCI operational registers at %p:\n", xhci->op_regs); + xhci_dbg(xhci, "// xHCI operational registers at %pK:\n", xhci->op_regs); temp = readl(&xhci->cap_regs->run_regs_off); - xhci_dbg(xhci, "// @%p = 0x%x RTSOFF\n", + xhci_dbg(xhci, "// @%pK = 0x%x RTSOFF\n", &xhci->cap_regs->run_regs_off, (unsigned int) temp & RTSOFF_MASK); - xhci_dbg(xhci, "// xHCI runtime registers at %p:\n", xhci->run_regs); + xhci_dbg(xhci, "// xHCI runtime registers at %pK:\n", xhci->run_regs); temp = readl(&xhci->cap_regs->db_off); - xhci_dbg(xhci, "// @%p = 0x%x DBOFF\n", &xhci->cap_regs->db_off, temp); - xhci_dbg(xhci, "// Doorbell array at %p:\n", xhci->dba); + xhci_dbg(xhci, "// @%pK = 0x%x DBOFF\n", &xhci->cap_regs->db_off, temp); + xhci_dbg(xhci, "// Doorbell array at %pK:\n", xhci->dba); } static void xhci_print_cap_regs(struct xhci_hcd *xhci) { u32 temp; - xhci_dbg(xhci, "xHCI capability registers at %p:\n", xhci->cap_regs); + xhci_dbg(xhci, "xHCI capability registers at %pK:\n", xhci->cap_regs); temp = readl(&xhci->cap_regs->hc_capbase); xhci_dbg(xhci, "CAPLENGTH AND HCIVERSION 0x%x:\n", @@ -140,7 +140,7 @@ static void xhci_print_status(struct xhci_hcd *xhci) static void xhci_print_op_regs(struct xhci_hcd *xhci) { - xhci_dbg(xhci, "xHCI operational registers at %p:\n", xhci->op_regs); + xhci_dbg(xhci, "xHCI operational registers at %pK:\n", xhci->op_regs); xhci_print_command_reg(xhci); xhci_print_status(xhci); } @@ -161,7 +161,7 @@ static void xhci_print_ports(struct xhci_hcd *xhci) addr = &xhci->op_regs->port_status_base; for (i = 0; i < ports; i++) { for (j = 0; j < NUM_PORT_REGS; ++j) { - xhci_dbg(xhci, "%p port %s reg = 0x%x\n", + xhci_dbg(xhci, "%pK port %s reg = 0x%x\n", addr, names[j], (unsigned int) readl(addr)); addr++; @@ -181,35 +181,35 @@ void xhci_print_ir_set(struct xhci_hcd *xhci, int set_num) if (temp == XHCI_INIT_VALUE) return; - xhci_dbg(xhci, " %p: ir_set[%i]\n", ir_set, set_num); + xhci_dbg(xhci, " %pK: ir_set[%i]\n", ir_set, set_num); - xhci_dbg(xhci, " %p: ir_set.pending = 0x%x\n", addr, + xhci_dbg(xhci, " %pK: ir_set.pending = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->irq_control; temp = readl(addr); - xhci_dbg(xhci, " %p: ir_set.control = 0x%x\n", addr, + xhci_dbg(xhci, " %pK: ir_set.control = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->erst_size; temp = readl(addr); - xhci_dbg(xhci, " %p: ir_set.erst_size = 0x%x\n", addr, + xhci_dbg(xhci, " %pK: ir_set.erst_size = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->rsvd; temp = readl(addr); if (temp != XHCI_INIT_VALUE) - xhci_dbg(xhci, " WARN: %p: ir_set.rsvd = 0x%x\n", + xhci_dbg(xhci, " WARN: %pK: ir_set.rsvd = 0x%x\n", addr, (unsigned int)temp); addr = &ir_set->erst_base; temp_64 = xhci_read_64(xhci, addr); - xhci_dbg(xhci, " %p: ir_set.erst_base = @%08llx\n", + xhci_dbg(xhci, " %pK: ir_set.erst_base = @%08llx\n", addr, temp_64); addr = &ir_set->erst_dequeue; temp_64 = xhci_read_64(xhci, addr); - xhci_dbg(xhci, " %p: ir_set.erst_dequeue = @%08llx\n", + xhci_dbg(xhci, " %pK: ir_set.erst_dequeue = @%08llx\n", addr, temp_64); } @@ -218,15 +218,15 @@ void xhci_print_run_regs(struct xhci_hcd *xhci) u32 temp; int i; - xhci_dbg(xhci, "xHCI runtime registers at %p:\n", xhci->run_regs); + xhci_dbg(xhci, "xHCI runtime registers at %pK:\n", xhci->run_regs); temp = readl(&xhci->run_regs->microframe_index); - xhci_dbg(xhci, " %p: Microframe index = 0x%x\n", + xhci_dbg(xhci, " %pK: Microframe index = 0x%x\n", &xhci->run_regs->microframe_index, (unsigned int) temp); for (i = 0; i < 7; ++i) { temp = readl(&xhci->run_regs->rsvd[i]); if (temp != XHCI_INIT_VALUE) - xhci_dbg(xhci, " WARN: %p: Rsvd[%i] = 0x%x\n", + xhci_dbg(xhci, " WARN: %pK: Rsvd[%i] = 0x%x\n", &xhci->run_regs->rsvd[i], i, (unsigned int) temp); } @@ -328,13 +328,13 @@ void xhci_debug_segment(struct xhci_hcd *xhci, struct xhci_segment *seg) void xhci_dbg_ring_ptrs(struct xhci_hcd *xhci, struct xhci_ring *ring) { - xhci_dbg(xhci, "Ring deq = %p (virt), 0x%llx (dma)\n", + xhci_dbg(xhci, "Ring deq = %pK (virt), 0x%llx (dma)\n", ring->dequeue, (unsigned long long)xhci_trb_virt_to_dma(ring->deq_seg, ring->dequeue)); xhci_dbg(xhci, "Ring deq updated %u times\n", ring->deq_updates); - xhci_dbg(xhci, "Ring enq = %p (virt), 0x%llx (dma)\n", + xhci_dbg(xhci, "Ring enq = %pK (virt), 0x%llx (dma)\n", ring->enqueue, (unsigned long long)xhci_trb_virt_to_dma(ring->enq_seg, ring->enqueue)); @@ -424,7 +424,7 @@ static void dbg_rsvd64(struct xhci_hcd *xhci, u64 *ctx, dma_addr_t dma) { int i; for (i = 0; i < 4; ++i) { - xhci_dbg(xhci, "@%p (virt) @%08llx " + xhci_dbg(xhci, "@%pK (virt) @%08llx " "(dma) %#08llx - rsvd64[%d]\n", &ctx[4 + i], (unsigned long long)dma, ctx[4 + i], i); @@ -463,24 +463,24 @@ static void xhci_dbg_slot_ctx(struct xhci_hcd *xhci, struct xhci_container_ctx * int csz = HCC_64BYTE_CONTEXT(xhci->hcc_params); xhci_dbg(xhci, "Slot Context:\n"); - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - dev_info\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - dev_info\n", &slot_ctx->dev_info, (unsigned long long)dma, slot_ctx->dev_info); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - dev_info2\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - dev_info2\n", &slot_ctx->dev_info2, (unsigned long long)dma, slot_ctx->dev_info2); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - tt_info\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - tt_info\n", &slot_ctx->tt_info, (unsigned long long)dma, slot_ctx->tt_info); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - dev_state\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - dev_state\n", &slot_ctx->dev_state, (unsigned long long)dma, slot_ctx->dev_state); dma += field_size; for (i = 0; i < 4; ++i) { - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - rsvd[%d]\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - rsvd[%d]\n", &slot_ctx->reserved[i], (unsigned long long)dma, slot_ctx->reserved[i], i); dma += field_size; @@ -511,24 +511,24 @@ static void xhci_dbg_ep_ctx(struct xhci_hcd *xhci, xhci_dbg(xhci, "%s Endpoint %02d Context (ep_index %02d):\n", usb_endpoint_out(epaddr) ? "OUT" : "IN", epaddr & USB_ENDPOINT_NUMBER_MASK, i); - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - ep_info\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - ep_info\n", &ep_ctx->ep_info, (unsigned long long)dma, ep_ctx->ep_info); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - ep_info2\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - ep_info2\n", &ep_ctx->ep_info2, (unsigned long long)dma, ep_ctx->ep_info2); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08llx - deq\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08llx - deq\n", &ep_ctx->deq, (unsigned long long)dma, ep_ctx->deq); dma += 2*field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - tx_info\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - tx_info\n", &ep_ctx->tx_info, (unsigned long long)dma, ep_ctx->tx_info); dma += field_size; for (j = 0; j < 3; ++j) { - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - rsvd[%d]\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - rsvd[%d]\n", &ep_ctx->reserved[j], (unsigned long long)dma, ep_ctx->reserved[j], j); @@ -558,16 +558,16 @@ void xhci_dbg_ctx(struct xhci_hcd *xhci, return; } - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - drop flags\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - drop flags\n", &ctrl_ctx->drop_flags, (unsigned long long)dma, ctrl_ctx->drop_flags); dma += field_size; - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - add flags\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - add flags\n", &ctrl_ctx->add_flags, (unsigned long long)dma, ctrl_ctx->add_flags); dma += field_size; for (i = 0; i < 6; ++i) { - xhci_dbg(xhci, "@%p (virt) @%08llx (dma) %#08x - rsvd2[%d]\n", + xhci_dbg(xhci, "@%pK (virt) @%08llx (dma) %#08x - rsvd2[%d]\n", &ctrl_ctx->rsvd2[i], (unsigned long long)dma, ctrl_ctx->rsvd2[i], i); dma += field_size; @@ -590,7 +590,7 @@ void xhci_dbg_trace(struct xhci_hcd *xhci, void (*trace)(struct va_format *), va_start(args, fmt); vaf.fmt = fmt; vaf.va = &args; - xhci_dbg(xhci, "%pV\n", &vaf); + xhci_dbg(xhci, "%pKV\n", &vaf); trace(&vaf); va_end(args); } diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index f88c049ea0e03..09a1e1a3f0178 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c @@ -1176,7 +1176,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, xhci_set_link_state(xhci, port_array, wIndex, XDEV_RESUME); spin_unlock_irqrestore(&xhci->lock, flags); - msleep(20); + usleep_range(21000, 21500); spin_lock_irqsave(&xhci->lock, flags); xhci_set_link_state(xhci, port_array, wIndex, XDEV_U0); @@ -1412,7 +1412,7 @@ int xhci_bus_resume(struct usb_hcd *hcd) port_index, XDEV_RESUME); spin_unlock_irqrestore(&xhci->lock, flags); - msleep(20); + usleep_range(21000, 21500); spin_lock_irqsave(&xhci->lock, flags); xhci_set_link_state(xhci, port_array, diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index bf6693df523f7..3720cd7917ea6 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c @@ -1024,7 +1024,7 @@ int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, /* Point to output device context in dcbaa. */ xhci->dcbaa->dev_context_ptrs[slot_id] = cpu_to_le64(dev->out_ctx->dma); - xhci_dbg(xhci, "Set slot id %d dcbaa entry %p to 0x%llx\n", + xhci_dbg(xhci, "Set slot id %d dcbaa entry %pK to 0x%llx\n", slot_id, &xhci->dcbaa->dev_context_ptrs[slot_id], le64_to_cpu(xhci->dcbaa->dev_context_ptrs[slot_id])); @@ -1185,7 +1185,7 @@ int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *ud if (udev->tt->multi) slot_ctx->dev_info |= cpu_to_le32(DEV_MTT); } - xhci_dbg(xhci, "udev->tt = %p\n", udev->tt); + xhci_dbg(xhci, "udev->tt = %pK\n", udev->tt); xhci_dbg(xhci, "udev->ttport = 0x%x\n", udev->ttport); /* Step 4 - ring already allocated */ @@ -1792,25 +1792,151 @@ void xhci_free_command(struct xhci_hcd *xhci, kfree(command); } -void xhci_mem_cleanup(struct xhci_hcd *xhci) +void xhci_handle_sec_intr_events(struct xhci_hcd *xhci, int intr_num) { + union xhci_trb *erdp_trb, *current_trb; + struct xhci_segment *seg; + u64 erdp_reg; + u32 iman_reg; + dma_addr_t deq; + unsigned long segment_offset; + + /* disable irq, ack pending interrupt and ack all pending events */ + + iman_reg = + readl_relaxed(&xhci->sec_ir_set[intr_num]->irq_pending); + iman_reg &= ~IMAN_IE; + writel_relaxed(iman_reg, + &xhci->sec_ir_set[intr_num]->irq_pending); + iman_reg = + readl_relaxed(&xhci->sec_ir_set[intr_num]->irq_pending); + if (iman_reg & IMAN_IP) + writel_relaxed(iman_reg, + &xhci->sec_ir_set[intr_num]->irq_pending); + + /* last acked event trb is in erdp reg */ + erdp_reg = + xhci_read_64(xhci, &xhci->sec_ir_set[intr_num]->erst_dequeue); + deq = (dma_addr_t)(erdp_reg & ~ERST_PTR_MASK); + if (!deq) { + pr_debug("%s: event ring handling not required\n", __func__); + return; + } + + seg = xhci->sec_event_ring[intr_num]->first_seg; + segment_offset = deq - seg->dma; + + /* find out virtual address of the last acked event trb */ + erdp_trb = current_trb = &seg->trbs[0] + + (segment_offset/sizeof(*current_trb)); + + /* read cycle state of the last acked trb to find out CCS */ + xhci->sec_event_ring[intr_num]->cycle_state = + (current_trb->event_cmd.flags & TRB_CYCLE); + + while (1) { + /* last trb of the event ring: toggle cycle state */ + if (current_trb == &seg->trbs[TRBS_PER_SEGMENT - 1]) { + xhci->sec_event_ring[intr_num]->cycle_state ^= 1; + current_trb = &seg->trbs[0]; + } else { + current_trb++; + } + + /* cycle state transition */ + if ((le32_to_cpu(current_trb->event_cmd.flags) & TRB_CYCLE) != + xhci->sec_event_ring[intr_num]->cycle_state) + break; + } + + if (erdp_trb != current_trb) { + deq = + xhci_trb_virt_to_dma(xhci->sec_event_ring[intr_num]->deq_seg, + current_trb); + if (deq == 0) + xhci_warn(xhci, + "WARN ivalid SW event ring dequeue ptr.\n"); + /* Update HC event ring dequeue pointer */ + erdp_reg &= ERST_PTR_MASK; + erdp_reg |= ((u64) deq & (u64) ~ERST_PTR_MASK); + } + + /* Clear the event handler busy flag (RW1C); event ring is empty. */ + erdp_reg |= ERST_EHB; + xhci_write_64(xhci, erdp_reg, + &xhci->sec_ir_set[intr_num]->erst_dequeue); +} + +int xhci_sec_event_ring_cleanup(struct usb_hcd *hcd, unsigned intr_num) +{ + int size; + struct xhci_hcd *xhci = hcd_to_xhci(hcd); struct device *dev = xhci_to_hcd(xhci)->self.controller; + + if (intr_num >= xhci->max_interrupters) { + xhci_err(xhci, "invalid secondary interrupter num %d\n", + intr_num); + return -EINVAL; + } + + size = + sizeof(struct xhci_erst_entry)*(xhci->sec_erst[intr_num].num_entries); + if (xhci->sec_erst[intr_num].entries) { + xhci_handle_sec_intr_events(xhci, intr_num); + dma_free_coherent(dev, size, xhci->sec_erst[intr_num].entries, + xhci->sec_erst[intr_num].erst_dma_addr); + xhci->sec_erst[intr_num].entries = NULL; + } + xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed SEC ERST#%d", + intr_num); + if (xhci->sec_event_ring[intr_num]) + xhci_ring_free(xhci, xhci->sec_event_ring[intr_num]); + + xhci->sec_event_ring[intr_num] = NULL; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "Freed sec event ring"); + + return 0; +} + +void xhci_event_ring_cleanup(struct xhci_hcd *xhci) +{ int size; - int i, j, num_ports; + unsigned int i; + struct device *dev = xhci_to_hcd(xhci)->self.controller; - del_timer_sync(&xhci->cmd_timer); + /* sec event ring clean up */ + for (i = 1; i < xhci->max_interrupters; i++) + xhci_sec_event_ring_cleanup(xhci_to_hcd(xhci), i); - /* Free the Event Ring Segment Table and the actual Event Ring */ + kfree(xhci->sec_ir_set); + xhci->sec_ir_set = NULL; + kfree(xhci->sec_erst); + xhci->sec_erst = NULL; + kfree(xhci->sec_event_ring); + xhci->sec_event_ring = NULL; + + /* primary event ring clean up */ size = sizeof(struct xhci_erst_entry)*(xhci->erst.num_entries); if (xhci->erst.entries) dma_free_coherent(dev, size, xhci->erst.entries, xhci->erst.erst_dma_addr); xhci->erst.entries = NULL; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed ERST"); + xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed primary ERST"); if (xhci->event_ring) xhci_ring_free(xhci, xhci->event_ring); xhci->event_ring = NULL; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed event ring"); + xhci_dbg_trace(xhci, trace_xhci_dbg_init, "Freed priamry event ring"); +} + +void xhci_mem_cleanup(struct xhci_hcd *xhci) +{ + struct device *dev = xhci_to_hcd(xhci)->self.controller; + int i, j, num_ports; + + del_timer_sync(&xhci->cmd_timer); + + xhci_event_ring_cleanup(xhci); if (xhci->lpm_command) xhci_free_command(xhci, xhci->lpm_command); @@ -1910,15 +2036,15 @@ static int xhci_test_trb_in_td(struct xhci_hcd *xhci, if (seg != result_seg) { xhci_warn(xhci, "WARN: %s TRB math test %d failed!\n", test_name, test_number); - xhci_warn(xhci, "Tested TRB math w/ seg %p and " + xhci_warn(xhci, "Tested TRB math w/ seg %pK and " "input DMA 0x%llx\n", input_seg, (unsigned long long) input_dma); - xhci_warn(xhci, "starting TRB %p (0x%llx DMA), " - "ending TRB %p (0x%llx DMA)\n", + xhci_warn(xhci, "starting TRB %pK (0x%llx DMA), " + "ending TRB %pK (0x%llx DMA)\n", start_trb, start_dma, end_trb, end_dma); - xhci_warn(xhci, "Expected seg %p, got seg %p\n", + xhci_warn(xhci, "Expected seg %pK, got seg %pK\n", result_seg, seg); trb_in_td(xhci, input_seg, start_trb, end_trb, input_dma, true); @@ -2049,30 +2175,6 @@ static int xhci_check_trb_in_td_math(struct xhci_hcd *xhci, gfp_t mem_flags) return 0; } -static void xhci_set_hc_event_deq(struct xhci_hcd *xhci) -{ - u64 temp; - dma_addr_t deq; - - deq = xhci_trb_virt_to_dma(xhci->event_ring->deq_seg, - xhci->event_ring->dequeue); - if (deq == 0 && !in_interrupt()) - xhci_warn(xhci, "WARN something wrong with SW event ring " - "dequeue ptr.\n"); - /* Update HC event ring dequeue pointer */ - temp = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); - temp &= ERST_PTR_MASK; - /* Don't clear the EHB bit (which is RW1C) because - * there might be more events to service. - */ - temp &= ~ERST_EHB; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Write event ring dequeue pointer, " - "preserving EHB bit"); - xhci_write_64(xhci, ((u64) deq & (u64) ~ERST_PTR_MASK) | temp, - &xhci->ir_set->erst_dequeue); -} - static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, __le32 __iomem *addr, u8 major_revision, int max_caps) { @@ -2081,7 +2183,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, if (major_revision > 0x03) { xhci_warn(xhci, "Ignoring unknown port speed, " - "Ext Cap %p, revision = 0x%x\n", + "Ext Cap %pK, revision = 0x%x\n", addr, major_revision); /* Ignoring port protocol we can't understand. FIXME */ return; @@ -2092,7 +2194,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, port_offset = XHCI_EXT_PORT_OFF(temp); port_count = XHCI_EXT_PORT_COUNT(temp); xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "Ext Cap %p, port offset = %u, " + "Ext Cap %pK, port offset = %u, " "count = %u, revision = 0x%x", addr, port_offset, port_count, major_revision); /* Port count includes the current port offset */ @@ -2127,7 +2229,7 @@ static void xhci_add_in_port(struct xhci_hcd *xhci, unsigned int num_ports, for (i = port_offset; i < (port_offset + port_count); i++) { /* Duplicate entry. Ignore the port if the revisions differ. */ if (xhci->port_array[i] != 0) { - xhci_warn(xhci, "Duplicate port entry, Ext Cap %p," + xhci_warn(xhci, "Duplicate port entry, Ext Cap %pK," " port %u\n", addr, i); xhci_warn(xhci, "Port was marked as USB %u, " "duplicated as USB %u\n", @@ -2283,7 +2385,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) NUM_PORT_REGS*i; xhci_dbg_trace(xhci, trace_xhci_dbg_init, "USB 2.0 port at index %u, " - "addr = %p", i, + "addr = %pK", i, xhci->usb2_ports[port_index]); port_index++; if (port_index == xhci->num_usb2_ports) @@ -2304,7 +2406,7 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) NUM_PORT_REGS*i; xhci_dbg_trace(xhci, trace_xhci_dbg_init, "USB 3.0 port at index %u, " - "addr = %p", i, + "addr = %pK", i, xhci->usb3_ports[port_index]); port_index++; if (port_index == xhci->num_usb3_ports) @@ -2314,13 +2416,184 @@ static int xhci_setup_port_arrays(struct xhci_hcd *xhci, gfp_t flags) return 0; } +int xhci_event_ring_setup(struct xhci_hcd *xhci, struct xhci_ring **er, + struct xhci_intr_reg __iomem *ir_set, struct xhci_erst *erst, + unsigned int intr_num, gfp_t flags) +{ + dma_addr_t dma, deq; + u64 val_64; + unsigned int val; + struct xhci_segment *seg; + struct device *dev = xhci_to_hcd(xhci)->self.controller; + + *er = xhci_ring_alloc(xhci, ERST_NUM_SEGS, 1, + TYPE_EVENT, flags); + if (!*er) + return -ENOMEM; + + erst->entries = dma_alloc_coherent(dev, + sizeof(struct xhci_erst_entry) * ERST_NUM_SEGS, &dma, + flags); + if (!erst->entries) { + xhci_ring_free(xhci, *er); + return -ENOMEM; + } + + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "intr# %d: Allocated event ring segment table at 0x%llx", + intr_num, (unsigned long long)dma); + + memset(erst->entries, 0, sizeof(struct xhci_erst_entry)*ERST_NUM_SEGS); + erst->num_entries = ERST_NUM_SEGS; + erst->erst_dma_addr = dma; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "intr# %d: num segs = %i, virt addr = %pK, dma addr = 0x%llx", + intr_num, + erst->num_entries, + erst->entries, + (unsigned long long)erst->erst_dma_addr); + + /* set ring base address and size for each segment table entry */ + for (val = 0, seg = (*er)->first_seg; val < ERST_NUM_SEGS; val++) { + struct xhci_erst_entry *entry = &erst->entries[val]; + + entry->seg_addr = cpu_to_le64(seg->dma); + entry->seg_size = cpu_to_le32(TRBS_PER_SEGMENT); + entry->rsvd = 0; + seg = seg->next; + } + + /* set ERST count with the number of entries in the segment table */ + val = readl_relaxed(&ir_set->erst_size); + val &= ERST_SIZE_MASK; + val |= ERST_NUM_SEGS; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "Write ERST size = %i to ir_set %d (some bits preserved)", val, + intr_num); + writel_relaxed(val, &ir_set->erst_size); + + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "intr# %d: Set ERST entries to point to event ring.", + intr_num); + /* set the segment table base address */ + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "Set ERST base address for ir_set %d = 0x%llx", + intr_num, + (unsigned long long)erst->erst_dma_addr); + val_64 = xhci_read_64(xhci, &ir_set->erst_base); + val_64 &= ERST_PTR_MASK; + val_64 |= (erst->erst_dma_addr & (u64) ~ERST_PTR_MASK); + xhci_write_64(xhci, val_64, &ir_set->erst_base); + + /* Set the event ring dequeue address */ + deq = xhci_trb_virt_to_dma((*er)->deq_seg, (*er)->dequeue); + if (deq == 0 && !in_interrupt()) + xhci_warn(xhci, + "intr# %d:WARN something wrong with SW event ring deq ptr.\n", + intr_num); + /* Update HC event ring dequeue pointer */ + val_64 = xhci_read_64(xhci, &ir_set->erst_dequeue); + val_64 &= ERST_PTR_MASK; + /* Don't clear the EHB bit (which is RW1C) because + * there might be more events to service. + */ + val_64 &= ~ERST_EHB; + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "intr# %d:Write event ring dequeue pointer, preserving EHB bit", + intr_num); + xhci_write_64(xhci, ((u64) deq & (u64) ~ERST_PTR_MASK) | val_64, + &ir_set->erst_dequeue); + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "Wrote ERST address to ir_set %d.", intr_num); + xhci_print_ir_set(xhci, intr_num); + + return 0; +} + +int xhci_sec_event_ring_setup(struct usb_hcd *hcd, unsigned intr_num) +{ + int ret; + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + if ((xhci->xhc_state & XHCI_STATE_HALTED) || !xhci->sec_ir_set + || !xhci->sec_event_ring || !xhci->sec_erst || + intr_num >= xhci->max_interrupters) { + xhci_err(xhci, + "%s:state %x ir_set %pK evt_ring %pK erst %pK intr# %d\n", + __func__, xhci->xhc_state, xhci->sec_ir_set, + xhci->sec_event_ring, xhci->sec_erst, intr_num); + return -EINVAL; + } + + if (xhci->sec_event_ring && xhci->sec_event_ring[intr_num] + && xhci->sec_event_ring[intr_num]->first_seg) + goto done; + + xhci->sec_ir_set[intr_num] = &xhci->run_regs->ir_set[intr_num]; + ret = xhci_event_ring_setup(xhci, + &xhci->sec_event_ring[intr_num], + xhci->sec_ir_set[intr_num], + &xhci->sec_erst[intr_num], + intr_num, GFP_KERNEL); + if (ret) { + xhci_err(xhci, "sec event ring setup failed inter#%d\n", + intr_num); + return ret; + } +done: + return 0; +} + +int xhci_event_ring_init(struct xhci_hcd *xhci, gfp_t flags) +{ + int ret = 0; + + /* primary + secondary */ + xhci->max_interrupters = HCS_MAX_INTRS(xhci->hcs_params1); + + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "// Allocating primary event ring"); + + /* Set ir_set to interrupt register set 0 */ + xhci->ir_set = &xhci->run_regs->ir_set[0]; + ret = xhci_event_ring_setup(xhci, &xhci->event_ring, xhci->ir_set, + &xhci->erst, 0, flags); + if (ret) { + xhci_err(xhci, "failed to setup primary event ring\n"); + goto fail; + } + + xhci_dbg_trace(xhci, trace_xhci_dbg_init, + "// Allocating sec event ring related pointers"); + + xhci->sec_ir_set = kcalloc(xhci->max_interrupters, + sizeof(*xhci->sec_ir_set), flags); + if (!xhci->sec_ir_set) { + ret = -ENOMEM; + goto fail; + } + + xhci->sec_event_ring = kcalloc(xhci->max_interrupters, + sizeof(*xhci->sec_event_ring), flags); + if (!xhci->sec_event_ring) { + ret = -ENOMEM; + goto fail; + } + + xhci->sec_erst = kcalloc(xhci->max_interrupters, + sizeof(*xhci->sec_erst), flags); + if (!xhci->sec_erst) + ret = -ENOMEM; +fail: + return ret; +} + int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) { dma_addr_t dma; struct device *dev = xhci_to_hcd(xhci)->self.controller; unsigned int val, val2; u64 val_64; - struct xhci_segment *seg; u32 page_size, temp; int i; @@ -2369,7 +2642,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) memset(xhci->dcbaa, 0, sizeof *(xhci->dcbaa)); xhci->dcbaa->dma = dma; xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Device context base array address = 0x%llx (DMA), %p (virt)", + "// Device context base array address = 0x%llx (DMA), %pK (virt)", (unsigned long long)xhci->dcbaa->dma, xhci->dcbaa); xhci_write_64(xhci, dma, &xhci->op_regs->dcbaa_ptr); @@ -2410,7 +2683,7 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) if (!xhci->cmd_ring) goto fail; xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "Allocated command ring at %p", xhci->cmd_ring); + "Allocated command ring at %pK", xhci->cmd_ring); xhci_dbg_trace(xhci, trace_xhci_dbg_init, "First segment DMA is 0x%llx", (unsigned long long)xhci->cmd_ring->first_seg->dma); @@ -2442,73 +2715,16 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) xhci->dba = (void __iomem *) xhci->cap_regs + val; xhci_dbg_regs(xhci); xhci_print_run_regs(xhci); - /* Set ir_set to interrupt register set 0 */ - xhci->ir_set = &xhci->run_regs->ir_set[0]; /* * Event ring setup: Allocate a normal ring, but also setup * the event ring segment table (ERST). Section 4.9.3. */ - xhci_dbg_trace(xhci, trace_xhci_dbg_init, "// Allocating event ring"); - xhci->event_ring = xhci_ring_alloc(xhci, ERST_NUM_SEGS, 1, TYPE_EVENT, - flags); - if (!xhci->event_ring) - goto fail; - if (xhci_check_trb_in_td_math(xhci, flags) < 0) + if (xhci_event_ring_init(xhci, GFP_KERNEL)) goto fail; - xhci->erst.entries = dma_alloc_coherent(dev, - sizeof(struct xhci_erst_entry) * ERST_NUM_SEGS, &dma, - GFP_KERNEL); - if (!xhci->erst.entries) + if (xhci_check_trb_in_td_math(xhci, flags) < 0) goto fail; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Allocated event ring segment table at 0x%llx", - (unsigned long long)dma); - - memset(xhci->erst.entries, 0, sizeof(struct xhci_erst_entry)*ERST_NUM_SEGS); - xhci->erst.num_entries = ERST_NUM_SEGS; - xhci->erst.erst_dma_addr = dma; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "Set ERST to 0; private num segs = %i, virt addr = %p, dma addr = 0x%llx", - xhci->erst.num_entries, - xhci->erst.entries, - (unsigned long long)xhci->erst.erst_dma_addr); - - /* set ring base address and size for each segment table entry */ - for (val = 0, seg = xhci->event_ring->first_seg; val < ERST_NUM_SEGS; val++) { - struct xhci_erst_entry *entry = &xhci->erst.entries[val]; - entry->seg_addr = cpu_to_le64(seg->dma); - entry->seg_size = cpu_to_le32(TRBS_PER_SEGMENT); - entry->rsvd = 0; - seg = seg->next; - } - - /* set ERST count with the number of entries in the segment table */ - val = readl(&xhci->ir_set->erst_size); - val &= ERST_SIZE_MASK; - val |= ERST_NUM_SEGS; - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Write ERST size = %i to ir_set 0 (some bits preserved)", - val); - writel(val, &xhci->ir_set->erst_size); - - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Set ERST entries to point to event ring."); - /* set the segment table base address */ - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Set ERST base address for ir_set 0 = 0x%llx", - (unsigned long long)xhci->erst.erst_dma_addr); - val_64 = xhci_read_64(xhci, &xhci->ir_set->erst_base); - val_64 &= ERST_PTR_MASK; - val_64 |= (xhci->erst.erst_dma_addr & (u64) ~ERST_PTR_MASK); - xhci_write_64(xhci, val_64, &xhci->ir_set->erst_base); - - /* Set the event ring dequeue address */ - xhci_set_hc_event_deq(xhci); - xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "Wrote ERST address to ir_set 0."); - xhci_print_ir_set(xhci, 0); /* init command timeout timer */ init_timer(&xhci->cmd_timer); diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 7216fd2d7196e..0afcc33a4d7fd 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c @@ -507,7 +507,7 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, "Cycle state = 0x%x", state->new_cycle_state); xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, - "New dequeue segment = %p (virtual)", + "New dequeue segment = %pK (virtual)", state->new_deq_seg); addr = xhci_trb_virt_to_dma(state->new_deq_seg, state->new_deq_ptr); xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, @@ -542,8 +542,8 @@ static void td_to_noop(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, "Cancel (unchain) link TRB"); xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, - "Address = %p (0x%llx dma); " - "in seg %p (0x%llx dma)", + "Address = %pK (0x%llx dma); " + "in seg %pK (0x%llx dma)", cur_trb, (unsigned long long)xhci_trb_virt_to_dma(cur_seg, cur_trb), cur_seg, @@ -679,7 +679,7 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd *xhci, int slot_id, * short, don't muck with the stream ID after * submission. */ - xhci_warn(xhci, "WARN Cancelled URB %p " + xhci_warn(xhci, "WARN Cancelled URB %pK " "has invalid stream ID %u.\n", cur_td->urb, cur_td->urb->stream_id); @@ -1024,7 +1024,7 @@ static void xhci_handle_cmd_set_deq(struct xhci_hcd *xhci, int slot_id, ep_ring, ep_index); } else { xhci_warn(xhci, "Mismatch between completed Set TR Deq Ptr command & xHCI internal state.\n"); - xhci_warn(xhci, "ep deq seg = %p, deq ptr = %p\n", + xhci_warn(xhci, "ep deq seg = %pK, deq ptr = %pK\n", ep->queued_deq_seg, ep->queued_deq_ptr); } } @@ -1208,7 +1208,7 @@ static void xhci_handle_stopped_cmd_ring(struct xhci_hcd *xhci, i_cmd->status = COMP_CMD_STOP; - xhci_dbg(xhci, "Turn aborted command %p to no-op\n", + xhci_dbg(xhci, "Turn aborted command %pK to no-op\n", i_cmd->command_trb); /* get cycle state from the original cmd trb */ cycle_state = le32_to_cpu( @@ -2527,7 +2527,7 @@ static int handle_tx_event(struct xhci_hcd *xhci, URB_SHORT_NOT_OK)) || (status != 0 && !usb_endpoint_xfer_isoc(&urb->ep->desc))) - xhci_dbg(xhci, "Giveback URB %p, len = %d, " + xhci_dbg(xhci, "Giveback URB %pK, len = %d, " "expected = %d, status = %d\n", urb, urb->actual_length, urb->transfer_buffer_length, @@ -4062,7 +4062,7 @@ void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci, int ret; xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, - "Set TR Deq Ptr cmd, new deq seg = %p (0x%llx dma), new deq ptr = %p (0x%llx dma), new cycle = %u", + "Set TR Deq Ptr cmd, new deq seg = %pK (0x%llx dma), new deq ptr = %pK (0x%llx dma), new cycle = %u", deq_state->new_deq_seg, (unsigned long long)deq_state->new_deq_seg->dma, deq_state->new_deq_ptr, @@ -4074,7 +4074,7 @@ void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci, deq_state->new_deq_ptr); if (addr == 0) { xhci_warn(xhci, "WARN Cannot submit Set TR Deq Ptr\n"); - xhci_warn(xhci, "WARN deq seg = %p, deq pt = %p\n", + xhci_warn(xhci, "WARN deq seg = %pK, deq pt = %pK\n", deq_state->new_deq_seg, deq_state->new_deq_ptr); return; } diff --git a/drivers/usb/host/xhci-trace.h b/drivers/usb/host/xhci-trace.h index dde3959b7a33a..6a673fc45d420 100644 --- a/drivers/usb/host/xhci-trace.h +++ b/drivers/usb/host/xhci-trace.h @@ -96,7 +96,7 @@ DECLARE_EVENT_CLASS(xhci_log_ctx, ((HCC_64BYTE_CONTEXT(xhci->hcc_params) + 1) * 32) * ((ctx->type == XHCI_CTX_TYPE_INPUT) + ep_num + 1)); ), - TP_printk("\nctx_64=%d, ctx_type=%u, ctx_dma=@%llx, ctx_va=@%p", + TP_printk("\nctx_64=%d, ctx_type=%u, ctx_dma=@%llx, ctx_va=@%pK", __entry->ctx_64, __entry->ctx_type, (unsigned long long) __entry->ctx_dma, __entry->ctx_va ) @@ -127,7 +127,7 @@ DECLARE_EVENT_CLASS(xhci_log_event, memcpy(__get_dynamic_array(trb), trb_va, sizeof(struct xhci_generic_trb)); ), - TP_printk("\ntrb_dma=@%llx, trb_va=@%p, status=%08x, flags=%08x", + TP_printk("\ntrb_dma=@%llx, trb_va=@%pK, status=%08x, flags=%08x", (unsigned long long) __entry->dma, __entry->va, __entry->status, __entry->flags ) diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 25f4283500b8d..c09ca565fd0b1 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c @@ -654,7 +654,7 @@ int xhci_run(struct usb_hcd *hcd) temp = readl(&xhci->ir_set->irq_pending); xhci_dbg_trace(xhci, trace_xhci_dbg_init, - "// Enabling event ring interrupter %p by writing 0x%x to irq_pending", + "// Enabling event ring interrupter %pK by writing 0x%x to irq_pending", xhci->ir_set, (unsigned int) ER_IRQ_ENABLE(temp)); writel(ER_IRQ_ENABLE(temp), &xhci->ir_set->irq_pending); xhci_print_ir_set(xhci, 0); @@ -1485,7 +1485,7 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) exit: return ret; dying: - xhci_dbg(xhci, "Ep 0x%x: URB %p submitted for " + xhci_dbg(xhci, "Ep 0x%x: URB %pK submitted for " "non-responsive xHCI host.\n", urb->ep->desc.bEndpointAddress, urb); ret = -ESHUTDOWN; @@ -1609,7 +1609,7 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) if ((xhci->xhc_state & XHCI_STATE_DYING) || (xhci->xhc_state & XHCI_STATE_HALTED)) { xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, - "Ep 0x%x: URB %p to be canceled on " + "Ep 0x%x: URB %pK to be canceled on " "non-responsive xHCI host.", urb->ep->desc.bEndpointAddress, urb); /* Let the stop endpoint command watchdog timer (which set this @@ -1632,7 +1632,7 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) i = urb_priv->td_cnt; if (i < urb_priv->length) xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, - "Cancel URB %p, dev %s, ep 0x%x, " + "Cancel URB %pK, dev %s, ep 0x%x, " "starting at offset 0x%llx", urb, urb->dev->devpath, urb->ep->desc.bEndpointAddress, @@ -1700,7 +1700,7 @@ int xhci_drop_endpoint(struct usb_hcd *hcd, struct usb_device *udev, if (xhci->xhc_state & XHCI_STATE_DYING) return -ENODEV; - xhci_dbg(xhci, "%s called for udev %p\n", __func__, udev); + xhci_dbg(xhci, "%s called for udev %pK\n", __func__, udev); drop_flag = xhci_get_endpoint_flag(&ep->desc); if (drop_flag == SLOT_FLAG || drop_flag == EP0_FLAG) { xhci_dbg(xhci, "xHCI %s - can't drop slot or ep 0 %#x\n", @@ -1726,7 +1726,7 @@ int xhci_drop_endpoint(struct usb_hcd *hcd, struct usb_device *udev, cpu_to_le32(EP_STATE_DISABLED)) || le32_to_cpu(ctrl_ctx->drop_flags) & xhci_get_endpoint_flag(&ep->desc)) { - xhci_warn(xhci, "xHCI %s called with disabled ep %p\n", + xhci_warn(xhci, "xHCI %s called with disabled ep %pK\n", __func__, ep); return 0; } @@ -1821,7 +1821,7 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, */ if (le32_to_cpu(ctrl_ctx->add_flags) & xhci_get_endpoint_flag(&ep->desc)) { - xhci_warn(xhci, "xHCI %s called with enabled ep %p\n", + xhci_warn(xhci, "xHCI %s called with enabled ep %pK\n", __func__, ep); return 0; } @@ -2799,7 +2799,7 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) (xhci->xhc_state & XHCI_STATE_REMOVING)) return -ENODEV; - xhci_dbg(xhci, "%s called for udev %p\n", __func__, udev); + xhci_dbg(xhci, "%s called for udev %pK\n", __func__, udev); virt_dev = xhci->devs[udev->slot_id]; command = xhci_alloc_command(xhci, false, true, GFP_KERNEL); @@ -2896,7 +2896,7 @@ void xhci_reset_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) return; xhci = hcd_to_xhci(hcd); - xhci_dbg(xhci, "%s called for udev %p\n", __func__, udev); + xhci_dbg(xhci, "%s called for udev %pK\n", __func__, udev); virt_dev = xhci->devs[udev->slot_id]; /* Free any rings allocated for added endpoints */ for (i = 0; i < 31; ++i) { @@ -2949,7 +2949,7 @@ static void xhci_setup_input_ctx_for_quirk(struct xhci_hcd *xhci, if (addr == 0) { xhci_warn(xhci, "WARN Cannot submit config ep after " "reset ep command\n"); - xhci_warn(xhci, "WARN deq seg = %p, deq ptr = %p\n", + xhci_warn(xhci, "WARN deq seg = %pK, deq ptr = %pK\n", deq_state->new_deq_seg, deq_state->new_deq_ptr); return; @@ -3970,7 +3970,7 @@ static int xhci_setup_device(struct usb_hcd *hcd, struct usb_device *udev, xhci_dbg_trace(xhci, trace_xhci_dbg_address, "Op regs DCBAA ptr = %#016llx", temp_64); xhci_dbg_trace(xhci, trace_xhci_dbg_address, - "Slot ID %d dcbaa entry @%p = %#016llx", + "Slot ID %d dcbaa entry @%pK = %#016llx", udev->slot_id, &xhci->dcbaa->dev_context_ptrs[udev->slot_id], (unsigned long long) @@ -4980,6 +4980,61 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks) } EXPORT_SYMBOL_GPL(xhci_gen_setup); +dma_addr_t xhci_get_sec_event_ring_dma_addr(struct usb_hcd *hcd, + unsigned intr_num) +{ + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + if (intr_num >= xhci->max_interrupters) { + xhci_err(xhci, "intr num %d >= max intrs %d\n", intr_num, + xhci->max_interrupters); + return 0; + } + + if (!(xhci->xhc_state & XHCI_STATE_HALTED) && + xhci->sec_event_ring && xhci->sec_event_ring[intr_num] + && xhci->sec_event_ring[intr_num]->first_seg) + return xhci->sec_event_ring[intr_num]->first_seg->dma; + + return 0; +} + +dma_addr_t xhci_get_dcba_dma_addr(struct usb_hcd *hcd, + struct usb_device *udev) +{ + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + if (!(xhci->xhc_state & XHCI_STATE_HALTED) && xhci->dcbaa) + return xhci->dcbaa->dev_context_ptrs[udev->slot_id]; + + return 0; +} + +dma_addr_t xhci_get_xfer_ring_dma_addr(struct usb_hcd *hcd, + struct usb_device *udev, struct usb_host_endpoint *ep) +{ + int ret; + unsigned int ep_index; + struct xhci_virt_device *virt_dev; + + struct xhci_hcd *xhci = hcd_to_xhci(hcd); + + ret = xhci_check_args(hcd, udev, ep, 1, true, __func__); + if (ret <= 0) { + xhci_err(xhci, "%s: invalid args\n", __func__); + return 0; + } + + virt_dev = xhci->devs[udev->slot_id]; + ep_index = xhci_get_endpoint_index(&ep->desc); + + if (virt_dev->eps[ep_index].ring && + virt_dev->eps[ep_index].ring->first_seg) + return virt_dev->eps[ep_index].ring->first_seg->dma; + + return 0; +} + static const struct hc_driver xhci_hc_driver = { .description = "xhci-hcd", .product_desc = "xHCI Host Controller", @@ -5039,6 +5094,11 @@ static const struct hc_driver xhci_hc_driver = { .enable_usb3_lpm_timeout = xhci_enable_usb3_lpm_timeout, .disable_usb3_lpm_timeout = xhci_disable_usb3_lpm_timeout, .find_raw_port_number = xhci_find_raw_port_number, + .sec_event_ring_setup = xhci_sec_event_ring_setup, + .sec_event_ring_cleanup = xhci_sec_event_ring_cleanup, + .get_sec_event_ring_dma_addr = xhci_get_sec_event_ring_dma_addr, + .get_xfer_ring_dma_addr = xhci_get_xfer_ring_dma_addr, + .get_dcba_dma_addr = xhci_get_dcba_dma_addr, }; void xhci_init_driver(struct hc_driver *drv, int (*setup_fn)(struct usb_hcd *)) diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index ad153d1f574d8..e4466af6136c8 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h @@ -1452,6 +1452,9 @@ struct xhci_hcd { /* Our HCD's current interrupter register set */ struct xhci_intr_reg __iomem *ir_set; + /* secondary interrupter */ + struct xhci_intr_reg __iomem **sec_ir_set; + /* Cached register copies of read-only HC data */ __u32 hcs_params1; __u32 hcs_params2; @@ -1491,6 +1494,11 @@ struct xhci_hcd { struct xhci_command *current_cmd; struct xhci_ring *event_ring; struct xhci_erst erst; + + /* secondary event ring and erst */ + struct xhci_ring **sec_event_ring; + struct xhci_erst *sec_erst; + /* Scratchpad */ struct xhci_scratchpad *scratchpad; /* Store LPM test failed devices' information */ @@ -1738,6 +1746,8 @@ struct xhci_command *xhci_alloc_command(struct xhci_hcd *xhci, void xhci_urb_free_priv(struct xhci_hcd *xhci, struct urb_priv *urb_priv); void xhci_free_command(struct xhci_hcd *xhci, struct xhci_command *command); +int xhci_sec_event_ring_setup(struct usb_hcd *hcd, unsigned intr_num); +int xhci_sec_event_ring_cleanup(struct usb_hcd *hcd, unsigned intr_num); /* xHCI host controller glue */ typedef void (*xhci_get_quirks_t)(struct device *, struct xhci_hcd *); diff --git a/drivers/usb/mon/mon_text.c b/drivers/usb/mon/mon_text.c index ad408251d9557..060d78d531181 100644 --- a/drivers/usb/mon/mon_text.c +++ b/drivers/usb/mon/mon_text.c @@ -347,7 +347,7 @@ static int mon_text_open(struct inode *inode, struct file *file) rp->r.rnf_error = mon_text_error; rp->r.rnf_complete = mon_text_complete; - snprintf(rp->slab_name, SLAB_NAME_SZ, "mon_text_%p", rp); + snprintf(rp->slab_name, SLAB_NAME_SZ, "mon_text_%pK", rp); rp->e_slab = kmem_cache_create(rp->slab_name, sizeof(struct mon_event_text), sizeof(long), 0, mon_text_ctor); diff --git a/drivers/usb/phy/phy-msm-qusb.c b/drivers/usb/phy/phy-msm-qusb.c index 86a213126cfa1..acf5c19766225 100644 --- a/drivers/usb/phy/phy-msm-qusb.c +++ b/drivers/usb/phy/phy-msm-qusb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-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 @@ -63,6 +63,8 @@ #define FREEZIO_N BIT(1) #define POWER_DOWN BIT(0) +#define QUSB2PHY_PORT_TEST_CTRL 0xB8 + #define QUSB2PHY_PORT_UTMI_CTRL1 0xC0 #define SUSPEND_N BIT(5) #define TERM_SELECT BIT(4) @@ -124,6 +126,7 @@ struct qusb_phy { void __iomem *tune2_efuse_reg; void __iomem *ref_clk_base; void __iomem *tcsr_phy_clk_scheme_sel; + void __iomem *tcsr_phy_lvl_shift_keeper; struct clk *ref_clk_src; struct clk *ref_clk; @@ -402,13 +405,18 @@ static int qusb_phy_update_dpdm(struct usb_phy *phy, int value) case POWER_SUPPLY_DP_DM_DPF_DMF: dev_dbg(phy->dev, "POWER_SUPPLY_DP_DM_DPF_DMF\n"); if (!qphy->rm_pulldown) { + ret = qusb_phy_enable_power(qphy, true); + if (ret >= 0) { + qphy->rm_pulldown = true; + dev_dbg(phy->dev, "DP_DM_F: rm_pulldown:%d\n", + qphy->rm_pulldown); + } if (qphy->put_into_high_z_state) { + if (qphy->tcsr_phy_lvl_shift_keeper) + writel_relaxed(0x1, + qphy->tcsr_phy_lvl_shift_keeper); - /* Bring up DVDD */ - ret = qusb_phy_vdd(qphy, true); - if (ret < 0) - goto clk_error; qusb_phy_gdsc(qphy, true); qusb_phy_enable_clocks(qphy, true); @@ -438,16 +446,7 @@ static int qusb_phy_update_dpdm(struct usb_phy *phy, int value) qphy->base + QUSB2PHY_PORT_POWERDOWN); /* Make sure that above write is completed */ wmb(); - } - - ret = qusb_phy_enable_power(qphy, true); - if (ret >= 0) { - qphy->rm_pulldown = true; - dev_dbg(phy->dev, "DP_DM_F: rm_pulldown:%d\n", - qphy->rm_pulldown); - } - if (qphy->put_into_high_z_state) { qusb_phy_enable_clocks(qphy, false); qusb_phy_gdsc(qphy, false); } @@ -489,6 +488,9 @@ static int qusb_phy_update_dpdm(struct usb_phy *phy, int value) } if (!qphy->cable_connected) { + if (qphy->tcsr_phy_lvl_shift_keeper) + writel_relaxed(0x0, + qphy->tcsr_phy_lvl_shift_keeper); dev_dbg(phy->dev, "turn off for HVDCP case\n"); ret = qusb_phy_enable_power(qphy, false); } @@ -992,6 +994,23 @@ static int qusb_phy_set_suspend(struct usb_phy *phy, int suspend) writel_relaxed(intr_mask, qphy->base + QUSB2PHY_PORT_INTR_CTRL); + if (linestate & (LINESTATE_DP | LINESTATE_DM)) { + /* enable phy auto-resume */ + writel_relaxed(0x0C, + qphy->base + QUSB2PHY_PORT_TEST_CTRL); + /* flush the previous write before next write */ + wmb(); + writel_relaxed(0x04, + qphy->base + QUSB2PHY_PORT_TEST_CTRL); + } + + + dev_dbg(phy->dev, "%s: intr_mask = %x\n", + __func__, intr_mask); + + /* Makes sure that above write goes through */ + wmb(); + qusb_phy_enable_clocks(qphy, false); } else { /* Disconnect case */ /* Disable all interrupts */ @@ -1002,7 +1021,15 @@ static int qusb_phy_set_suspend(struct usb_phy *phy, int suspend) wmb(); qusb_phy_enable_clocks(qphy, false); - qusb_phy_enable_power(qphy, false); + if (qphy->tcsr_phy_lvl_shift_keeper) + writel_relaxed(0x0, + qphy->tcsr_phy_lvl_shift_keeper); + /* Do not disable power rails if there is vote for it */ + if (!qphy->rm_pulldown) + qusb_phy_enable_power(qphy, false); + else + dev_dbg(phy->dev, "race with rm_pulldown. Keep ldo ON\n"); + /* * Set put_into_high_z_state to true so next USB * cable connect, DPF_DMF request performs PHY @@ -1023,6 +1050,9 @@ static int qusb_phy_set_suspend(struct usb_phy *phy, int suspend) qphy->base + QUSB2PHY_PORT_INTR_CTRL); } else { qusb_phy_enable_power(qphy, true); + if (qphy->tcsr_phy_lvl_shift_keeper) + writel_relaxed(0x1, + qphy->tcsr_phy_lvl_shift_keeper); qusb_phy_enable_clocks(qphy, true); } qphy->suspended = false; @@ -1177,6 +1207,17 @@ static int qusb_phy_probe(struct platform_device *pdev) dev_dbg(dev, "err reading tcsr_phy_clk_scheme_sel\n"); } + res = platform_get_resource_byname(pdev, IORESOURCE_MEM, + "tcsr_phy_level_shift_keeper"); + if (res) { + qphy->tcsr_phy_lvl_shift_keeper = devm_ioremap_nocache(dev, + res->start, resource_size(res)); + if (IS_ERR(qphy->tcsr_phy_lvl_shift_keeper)) { + dev_err(dev, "err reading tcsr_phy_lvl_shift_keeper\n"); + qphy->tcsr_phy_lvl_shift_keeper = NULL; + } + } + qphy->dpdm_pulsing_enabled = of_property_read_bool(dev->of_node, "qcom,enable-dpdm-pulsing"); diff --git a/drivers/usb/phy/phy-msm-usb.c b/drivers/usb/phy/phy-msm-usb.c index b2b060b0cc289..8684bd3a013e2 100644 --- a/drivers/usb/phy/phy-msm-usb.c +++ b/drivers/usb/phy/phy-msm-usb.c @@ -1,4 +1,5 @@ /* Copyright (c) 2009-2016, Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -54,7 +55,7 @@ #define DRIVER_NAME "msm_otg" -#define CHG_RECHECK_DELAY (jiffies + msecs_to_jiffies(2000)) +#define CHG_RECHECK_DELAY (jiffies + msecs_to_jiffies(5000)) #define ULPI_IO_TIMEOUT_USEC (10 * 1000) #define USB_PHY_3P3_VOL_MIN 3050000 /* uV */ #define USB_PHY_3P3_VOL_MAX 3300000 /* uV */ @@ -132,6 +133,19 @@ static char bus_clkname[USB_NUM_BUS_CLOCKS][20] = {"bimc_clk", "snoc_clk", "pcnoc_clk"}; static bool bus_clk_rate_set; + +static int oem_is_kpoc; +static int __init oem_kpoc_setup(char *str) +{ + if (!strncmp(str, "charger", 4)) { + oem_is_kpoc = 1; + printk("[oem][kpoc] disable udc @kpoc mode\n"); + } + return 1; +} +__setup("androidboot.mode=", oem_kpoc_setup); + + static void dbg_inc(unsigned *idx) { *idx = (*idx + 1) & (DEBUG_MAX_MSG-1); @@ -473,10 +487,13 @@ static void ulpi_init(struct msm_otg *motg) static int msm_otg_phy_clk_reset(struct msm_otg *motg) { int ret; + unsigned long flags; if (!motg->phy_reset_clk) return 0; - + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + motg->otg_phy_clk_enable = false; + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); if (motg->sleep_clk) clk_disable_unprepare(motg->sleep_clk); if (motg->phy_csr_clk) @@ -507,6 +524,9 @@ static int msm_otg_phy_clk_reset(struct msm_otg *motg) clk_prepare_enable(motg->phy_csr_clk); if (motg->sleep_clk) clk_prepare_enable(motg->sleep_clk); + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + motg->otg_phy_clk_enable = true; + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); return 0; } @@ -805,15 +825,9 @@ static int msm_otg_reset(struct usb_phy *phy) USB_HS_APF_CTRL); /* - * Enable USB BAM if USB BAM is enabled already before block reset as - * block reset also resets USB BAM registers. + * Disable USB BAM as block reset resets USB BAM registers. */ - if (test_bit(ID, &motg->inputs)) { - msm_usb_bam_enable(CI_CTRL, - phy->otg->gadget->bam2bam_func_enabled); - } else { - dev_dbg(phy->dev, "host mode BAM not enabled\n"); - } + msm_usb_bam_enable(CI_CTRL, false); return 0; } @@ -1424,6 +1438,11 @@ static int msm_otg_suspend(struct msm_otg *motg) if (!(phy->state == OTG_STATE_B_PERIPHERAL && test_bit(A_BUS_SUSPEND, &motg->inputs)) || !motg->pdata->core_clk_always_on_workaround) { + unsigned long flags; + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + motg->otg_phy_clk_enable = false; + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); + clk_disable_unprepare(motg->pclk); clk_disable_unprepare(motg->core_clk); if (motg->phy_csr_clk) @@ -1557,6 +1576,7 @@ static int msm_otg_resume(struct msm_otg *motg) } if (motg->lpm_flags & CLOCKS_DOWN) { + unsigned long flags; if (motg->phy_csr_clk) { ret = clk_prepare_enable(motg->phy_csr_clk); WARN(ret, "USB phy_csr_clk enable failed\n"); @@ -1566,6 +1586,10 @@ static int msm_otg_resume(struct msm_otg *motg) ret = clk_prepare_enable(motg->pclk); WARN(ret, "USB pclk enable failed\n"); motg->lpm_flags &= ~CLOCKS_DOWN; + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + motg->otg_phy_clk_enable = true; + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); + } if (motg->lpm_flags & PHY_PWR_COLLAPSED) { @@ -1812,9 +1836,11 @@ static void msm_otg_notify_charger(struct msm_otg *motg, unsigned mA) /* * This condition will be true when usb cable is disconnected - * during bootup before charger detection mechanism starts. + * during bootup before enumeration. Check charger type also + * to avoid clearing online flag in case of valid charger. */ - if (motg->online && motg->cur_power == 0 && mA == 0) + if (motg->online && motg->cur_power == 0 && mA == 0 && + (motg->chg_type == USB_INVALID_CHARGER)) msm_otg_set_online_status(motg); if (motg->cur_power == mA) @@ -2224,7 +2250,13 @@ static bool msm_otg_read_pmic_id_state(struct msm_otg *motg) static bool msm_otg_read_phy_id_state(struct msm_otg *motg) { u8 val; + unsigned long flags; + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + if (false == motg->otg_phy_clk_enable) { + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); + return motg->id_state; + } /* * clear the pending/outstanding interrupts and * read the ID status from the SRC_STATUS register. @@ -2240,6 +2272,7 @@ static bool msm_otg_read_phy_id_state(struct msm_otg *motg) writeb_relaxed(0x0, USB2_PHY_USB_PHY_IRQ_CMD); val = readb_relaxed(USB2_PHY_USB_PHY_INTERRUPT_SRC_STATUS); + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); if (val & USB_PHY_IDDIG_1_0) return false; /* ID is grounded */ else @@ -2835,6 +2868,18 @@ static void msm_otg_sm_work(struct work_struct *w) IDEV_CHG_MAX); /* fall through */ case USB_SDP_CHARGER: + + if (oem_is_kpoc) { + motg->chg_type = USB_DCP_CHARGER; + msm_otg_notify_charger(motg, 500); + otg->phy->state = OTG_STATE_B_CHARGER; + work = 0; + pm_runtime_put_noidle(otg->phy->dev); + pm_runtime_suspend(otg->phy->dev); + break; + } + + msm_otg_notify_charger(motg, IDEV_CHG_MIN); pm_runtime_get_sync(otg->phy->dev); msm_otg_start_peripheral(otg, 1); otg->phy->state = @@ -3754,10 +3799,11 @@ set_msm_otg_perf_mode(struct device *dev, struct device_attribute *attr, ret = clk_set_rate(motg->core_clk, clk_rate); if (ret) pr_err("sys_clk set_rate fail:%d %ld\n", ret, clk_rate); + msm_otg_dbg_log_event(&motg->phy, "OTG PERF SET", + clk_rate, ret); } else { pr_err("usb sys_clk rate is undefined\n"); } - msm_otg_dbg_log_event(&motg->phy, "OTG PERF SET", clk_rate, ret); return count; } @@ -4430,6 +4476,9 @@ static int msm_otg_probe(struct platform_device *pdev) } } + motg->otg_phy_clk_enable = true; + spin_lock_init(&motg->otg_phy_clk_lock); + of_property_read_u32(pdev->dev.of_node, "qcom,pm-qos-latency", &motg->pm_qos_latency); @@ -4519,7 +4568,7 @@ static int msm_otg_probe(struct platform_device *pdev) ret = -ENOMEM; goto devote_bus_bw; } - dev_info(&pdev->dev, "OTG regs = %p\n", motg->regs); + dev_info(&pdev->dev, "OTG regs = %pK\n", motg->regs); if (pdata->enable_sec_phy) { res = platform_get_resource_byname(pdev, @@ -4995,6 +5044,7 @@ static int msm_otg_remove(struct platform_device *pdev) struct msm_otg *motg = platform_get_drvdata(pdev); struct usb_phy *phy = &motg->phy; int cnt = 0; + unsigned long flags; if (phy->otg->host || phy->otg->gadget) return -EBUSY; @@ -5063,6 +5113,9 @@ static int msm_otg_remove(struct platform_device *pdev) clk_disable_unprepare(motg->pclk); clk_disable_unprepare(motg->core_clk); + spin_lock_irqsave(&motg->otg_phy_clk_lock, flags); + motg->otg_phy_clk_enable = false; + spin_unlock_irqrestore(&motg->otg_phy_clk_lock, flags); if (motg->phy_csr_clk) clk_disable_unprepare(motg->phy_csr_clk); if (motg->xo_clk) { diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c index 0e400f382f3a8..d28adc350fb92 100644 --- a/drivers/usb/storage/scsiglue.c +++ b/drivers/usb/storage/scsiglue.c @@ -328,7 +328,7 @@ static int queuecommand_lck(struct scsi_cmnd *srb, /* check for state-transition errors */ if (us->srb != NULL) { - printk(KERN_ERR USB_STORAGE "Error in %s: us->srb = %p\n", + printk(KERN_ERR USB_STORAGE "Error in %s: us->srb = %pK\n", __func__, us->srb); return SCSI_MLQUEUE_HOST_BUSY; } diff --git a/drivers/video/adf/adf_client.c b/drivers/video/adf/adf_client.c index 8061d8e6b9fbd..75b2f0b18522e 100644 --- a/drivers/video/adf/adf_client.c +++ b/drivers/video/adf/adf_client.c @@ -305,8 +305,10 @@ static int adf_buffer_map(struct adf_device *dev, struct adf_buffer *buf, } done: - if (ret < 0) + if (ret < 0) { adf_buffer_mapping_cleanup(mapping, buf); + memset(mapping, 0, sizeof(*mapping)); + } return ret; } diff --git a/drivers/video/fbdev/core/fbcmap.c b/drivers/video/fbdev/core/fbcmap.c index 6bf80e43cac52..021755f7f32d3 100644 --- a/drivers/video/fbdev/core/fbcmap.c +++ b/drivers/video/fbdev/core/fbcmap.c @@ -187,8 +187,8 @@ int fb_copy_cmap(const struct fb_cmap *from, struct fb_cmap *to) int fb_cmap_to_user(const struct fb_cmap *from, struct fb_cmap_user *to) { - int tooff = 0, fromoff = 0; - int size; + u32 tooff = 0, fromoff = 0; + u32 size; if (to->start > from->start) fromoff = to->start - from->start; @@ -198,10 +198,10 @@ int fb_cmap_to_user(const struct fb_cmap *from, struct fb_cmap_user *to) return -EINVAL; size = to->len - tooff; - if (size > (int) (from->len - fromoff)) + if (size > (from->len - fromoff)) size = from->len - fromoff; size *= sizeof(u16); - if (!size) + if (size == 0) return -EINVAL; if (copy_to_user(to->red+tooff, from->red+fromoff, size)) diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index c082ae8e50ce4..a39b333efd51a 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -2,6 +2,7 @@ * linux/drivers/video/fbmem.c * * Copyright (C) 1994 Martin Schaller + * Copyright (C) 2018 XiaoMi, Inc. * * 2001 - Documented with DocBook * - Brad Douglas @@ -1054,13 +1055,21 @@ EXPORT_SYMBOL(fb_set_var); int fb_blank(struct fb_info *info, int blank) -{ +{ struct fb_event event; int ret = -EINVAL, early_ret; if (blank > FB_BLANK_POWERDOWN) blank = FB_BLANK_POWERDOWN; + + if (info->blank == blank) { + if (info->fbops->fb_blank) + ret = info->fbops->fb_blank(blank, info); + return ret; + } + + event.info = info; event.data = ␣ @@ -1080,6 +1089,9 @@ fb_blank(struct fb_info *info, int blank) fb_notifier_call_chain(FB_R_EARLY_EVENT_BLANK, &event); } + if (!ret) + info->blank = blank; + return ret; } EXPORT_SYMBOL(fb_blank); @@ -1097,6 +1109,13 @@ static long do_fb_ioctl(struct fb_info *info, unsigned int cmd, void __user *argp = (void __user *)arg; long ret = 0; + memset(&var, 0, sizeof(var)); + memset(&fix, 0, sizeof(fix)); + memset(&con2fb, 0, sizeof(con2fb)); + memset(&cmap_from, 0, sizeof(cmap_from)); + memset(&cmap, 0, sizeof(cmap)); + memset(&event, 0, sizeof(event)); + switch (cmd) { case FBIOGET_VSCREENINFO: if (!lock_fb_info(info)) @@ -1634,6 +1653,7 @@ static int do_register_framebuffer(struct fb_info *fb_info) if (!registered_fb[i]) break; fb_info->node = i; + fb_info->blank = -1; atomic_set(&fb_info->count, 1); mutex_init(&fb_info->lock); mutex_init(&fb_info->mm_lock); diff --git a/drivers/video/msm/ba/msm_ba.c b/drivers/video/msm/ba/msm_ba.c index 43feb0f365651..0461a98ace5e3 100644 --- a/drivers/video/msm/ba/msm_ba.c +++ b/drivers/video/msm/ba/msm_ba.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-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 @@ -53,7 +53,7 @@ int msm_ba_querycap(void *instance, struct v4l2_capability *cap) if (!inst || !cap) { dprintk(BA_ERR, - "Invalid input, inst = 0x%p, cap = 0x%p", inst, cap); + "Invalid input, inst = 0x%pK, cap = 0x%pK", inst, cap); return -EINVAL; } @@ -77,7 +77,7 @@ int msm_ba_g_priority(void *instance, enum v4l2_priority *prio) if (!inst || !prio) { dprintk(BA_ERR, - "Invalid prio, inst = 0x%p, prio = 0x%p", inst, prio); + "Invalid prio, inst = 0x%pK, prio = 0x%pK", inst, prio); return -EINVAL; } @@ -692,7 +692,7 @@ static int msm_ba_register_v4l2_subdev(struct v4l2_device *v4l2_dev, struct video_device *vdev; int rc = 0; - dprintk(BA_DBG, "Enter %s: v4l2_dev 0x%p, v4l2_subdev 0x%p", + dprintk(BA_DBG, "Enter %s: v4l2_dev 0x%pK, v4l2_subdev 0x%pK", __func__, v4l2_dev, sd); if (NULL == v4l2_dev || NULL == sd || !sd->name[0]) { dprintk(BA_ERR, "Invalid input"); @@ -944,7 +944,7 @@ int msm_ba_close(void *instance) debugfs_remove_recursive(inst->debugfs_root); - dprintk(BA_DBG, "Closed BA instance: %p", inst); + dprintk(BA_DBG, "Closed BA instance: %pK", inst); kfree(inst); return rc; diff --git a/drivers/video/msm/ba/msm_ba_debug.c b/drivers/video/msm/ba/msm_ba_debug.c index a39a0d3ef714b..d2441021ef2f8 100644 --- a/drivers/video/msm/ba/msm_ba_debug.c +++ b/drivers/video/msm/ba/msm_ba_debug.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2015,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 @@ -13,7 +13,7 @@ #include "msm_ba_debug.h" -#define MAX_DBG_BUF_SIZE 4096 +#define MAX_DBG_BUF_SIZE 1008 int msm_ba_debug = BA_ERR | BA_WARN; int msm_ba_debug_out = BA_OUT_PRINTK; @@ -24,11 +24,9 @@ struct debug_buffer { u32 filled_size; }; -static struct debug_buffer dbg_buf; - #define INIT_DBG_BUF(__buf) ({ \ - __buf.curr = __buf.ptr;\ - __buf.filled_size = 0; \ + __buf->curr = __buf->ptr;\ + __buf->filled_size = 0; \ }) static int dev_info_open(struct inode *inode, struct file *file) @@ -58,19 +56,30 @@ static ssize_t dev_info_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct msm_ba_dev *dev_ctxt = file->private_data; + struct debug_buffer *dbg_buf = NULL; + ssize_t size = 0; if (!dev_ctxt) { - dprintk(BA_ERR, "Invalid params, dev: 0x%p", dev_ctxt); + dprintk(BA_ERR, "Invalid params, dev: 0x%pK", dev_ctxt); return 0; } + + dbg_buf = kmalloc(sizeof(struct debug_buffer), GFP_KERNEL); + if (NULL == dbg_buf) + return 0; + INIT_DBG_BUF(dbg_buf); - write_str(&dbg_buf, "==============================="); - write_str(&dbg_buf, "DEV: 0x%p", dev_ctxt); - write_str(&dbg_buf, "==============================="); - write_str(&dbg_buf, "state: %d", dev_ctxt->state); + write_str(dbg_buf, "==============================="); + write_str(dbg_buf, "DEV: 0x%pK", dev_ctxt); + write_str(dbg_buf, "==============================="); + write_str(dbg_buf, "state: %d", dev_ctxt->state); - return simple_read_from_buffer(buf, count, ppos, - dbg_buf.ptr, dbg_buf.filled_size); + size = simple_read_from_buffer(buf, count, ppos, + dbg_buf->ptr, dbg_buf->filled_size); + + kfree(dbg_buf); + + return size; } static const struct file_operations dev_info_fops = { @@ -93,7 +102,7 @@ struct dentry *msm_ba_debugfs_init_drv(void) struct dentry *f = debugfs_create_##__type(__name, S_IRUGO | S_IWUSR, \ dir, __value); \ if (IS_ERR_OR_NULL(f)) { \ - dprintk(BA_ERR, "Failed creating debugfs file '%pd/%s'", \ + dprintk(BA_ERR, "Failed creating debugfs file '%pKd/%s'", \ dir, __name); \ f = NULL; \ } \ @@ -126,11 +135,11 @@ struct dentry *msm_ba_debugfs_init_dev(struct msm_ba_dev *dev_ctxt, char debugfs_name[MAX_DEBUGFS_NAME]; if (!dev_ctxt) { - dprintk(BA_ERR, "Invalid params, core: %p", dev_ctxt); + dprintk(BA_ERR, "Invalid params, core: %pK", dev_ctxt); goto failed_create_dir; } - snprintf(debugfs_name, MAX_DEBUGFS_NAME, "dev_%p", dev_ctxt); + snprintf(debugfs_name, MAX_DEBUGFS_NAME, "dev_%pK", dev_ctxt); dir = debugfs_create_dir(debugfs_name, parent); if (!dir) { dprintk(BA_ERR, "Failed to create debugfs for msm_ba"); @@ -155,21 +164,32 @@ static ssize_t inst_info_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct msm_ba_inst *inst = file->private_data; + struct debug_buffer *dbg_buf = NULL; + ssize_t size = 0; if (!inst) { - dprintk(BA_ERR, "Invalid params, dev: %p", inst); + dprintk(BA_ERR, "Invalid params, dev: %pK", inst); return 0; } + + dbg_buf = kmalloc(sizeof(struct debug_buffer), GFP_KERNEL); + if (NULL == dbg_buf) + return 0; + INIT_DBG_BUF(dbg_buf); - write_str(&dbg_buf, "==============================="); - write_str(&dbg_buf, "INSTANCE: %p (%s)", inst, + write_str(dbg_buf, "==============================="); + write_str(dbg_buf, "INSTANCE: %pK (%s)", inst, "BA device"); - write_str(&dbg_buf, "==============================="); - write_str(&dbg_buf, "dev: %p", inst->dev_ctxt); - write_str(&dbg_buf, "state: %d", inst->state); + write_str(dbg_buf, "==============================="); + write_str(dbg_buf, "dev: %pK", inst->dev_ctxt); + write_str(dbg_buf, "state: %d", inst->state); - return simple_read_from_buffer(buf, count, ppos, - dbg_buf.ptr, dbg_buf.filled_size); + size = simple_read_from_buffer(buf, count, ppos, + dbg_buf->ptr, dbg_buf->filled_size); + + kfree(dbg_buf); + + return size; } static const struct file_operations inst_info_fops = { @@ -184,10 +204,10 @@ struct dentry *msm_ba_debugfs_init_inst(struct msm_ba_inst *inst, char debugfs_name[MAX_DEBUGFS_NAME]; if (!inst) { - dprintk(BA_ERR, "Invalid params, inst: %p", inst); + dprintk(BA_ERR, "Invalid params, inst: %pK", inst); goto failed_create_dir; } - snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%p", inst); + snprintf(debugfs_name, MAX_DEBUGFS_NAME, "inst_%pK", inst); dir = debugfs_create_dir(debugfs_name, parent); if (!dir) { dprintk(BA_ERR, "Failed to create debugfs for msm_ba"); diff --git a/drivers/video/msm/ba/msm_v4l2_ba.c b/drivers/video/msm/ba/msm_v4l2_ba.c index d0fff6ba34bc6..300630ad85875 100644 --- a/drivers/video/msm/ba/msm_v4l2_ba.c +++ b/drivers/video/msm/ba/msm_v4l2_ba.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-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 @@ -387,7 +387,7 @@ static int msm_ba_device_init(struct platform_device *pdev, if ((NULL == ret_dev_ctxt) || (NULL != *ret_dev_ctxt) || (NULL == pdev)) { - dprintk(BA_ERR, "%s(%d) Invalid params %p %p %p", + dprintk(BA_ERR, "%s(%d) Invalid params %pK %pK %pK", __func__, __LINE__, ret_dev_ctxt, *ret_dev_ctxt, pdev); return -EINVAL; @@ -471,7 +471,7 @@ static int msm_ba_probe(struct platform_device *pdev) struct ba_ctxt *ba_ctxt; int rc = 0; - dprintk(BA_INFO, "Enter %s: pdev %p device id = %d", + dprintk(BA_INFO, "Enter %s: pdev %pK device id = %d", __func__, pdev, pdev->id); ba_ctxt = msm_ba_get_ba_context(); diff --git a/drivers/video/msm/mdss/mdp3.c b/drivers/video/msm/mdss/mdp3.c index 0bfeb3b10f04d..3bd94c68d561a 100644 --- a/drivers/video/msm/mdss/mdp3.c +++ b/drivers/video/msm/mdss/mdp3.c @@ -1125,7 +1125,7 @@ static int mdp3_res_init(void) mdp3_res->ion_client = msm_ion_client_create(mdp3_res->pdev->name); if (IS_ERR_OR_NULL(mdp3_res->ion_client)) { - pr_err("msm_ion_client_create() return error (%p)\n", + pr_err("msm_ion_client_create() return error (%pK)\n", mdp3_res->ion_client); mdp3_res->ion_client = NULL; return -EINVAL; @@ -1555,7 +1555,7 @@ void mdp3_unmap_iommu(struct ion_client *client, struct ion_handle *handle) mutex_lock(&mdp3_res->iommu_lock); meta = mdp3_iommu_meta_lookup(table); if (!meta) { - WARN(1, "%s: buffer was never mapped for %p\n", __func__, + WARN(1, "%s: buffer was never mapped for %pK\n", __func__, handle); mutex_unlock(&mdp3_res->iommu_lock); return; @@ -1581,7 +1581,7 @@ static void mdp3_iommu_meta_add(struct mdp3_iommu_meta *meta) } else if (meta->table > entry->table) { p = &(*p)->rb_right; } else { - pr_err("%s: handle %p already exists\n", __func__, + pr_err("%s: handle %pK already exists\n", __func__, entry->handle); BUG(); } @@ -1644,7 +1644,7 @@ static int mdp3_iommu_map_iommu(struct mdp3_iommu_meta *meta, ret = iommu_map_range(domain, meta->iova_addr + padding, table->sgl, size, prot); if (ret) { - pr_err("%s: could not map %pa in domain %p\n", + pr_err("%s: could not map %pa in domain %pK\n", __func__, &meta->iova_addr, domain); unmap_size = padding; goto out2; @@ -1767,12 +1767,12 @@ int mdp3_self_map_iommu(struct ion_client *client, struct ion_handle *handle, } } else { if (iommu_meta->flags != iommu_flags) { - pr_err("%s: hndl %p already mapped with diff flag\n", + pr_err("%s: hndl %pK already mapped with diff flag\n", __func__, handle); ret = -EINVAL; goto out_unlock; } else if (iommu_meta->mapped_size != iova_length) { - pr_err("%s: hndl %p already mapped with diff len\n", + pr_err("%s: hndl %pK already mapped with diff len\n", __func__, handle); ret = -EINVAL; goto out_unlock; @@ -1806,7 +1806,7 @@ int mdp3_put_img(struct mdp3_img_data *data, int client) fdput(data->srcp_f); memset(&data->srcp_f, 0, sizeof(struct fd)); } else if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) { - pr_debug("ion hdl = %p buf=0x%pa\n", data->srcp_dma_buf, + pr_debug("ion hdl = %pK buf=0x%pa\n", data->srcp_dma_buf, &data->addr); if (!iclient) { pr_err("invalid ion client\n"); @@ -1909,7 +1909,7 @@ int mdp3_get_img(struct msmfb_data *img, struct mdp3_img_data *data, int client) data->addr += img->offset; data->len -= img->offset; - pr_debug("mem=%d ihdl=%p buf=0x%pa len=0x%lx\n", + pr_debug("mem=%d ihdl=%pK buf=0x%pa len=0x%lx\n", img->memory_id, data->srcp_dma_buf, &data->addr, data->len); diff --git a/drivers/video/msm/mdss/mdp3_ctrl.c b/drivers/video/msm/mdss/mdp3_ctrl.c index 31c0cd86df4b5..5d47ba3d1fd24 100644 --- a/drivers/video/msm/mdss/mdp3_ctrl.c +++ b/drivers/video/msm/mdss/mdp3_ctrl.c @@ -2153,8 +2153,10 @@ static int mdp3_ctrl_lut_config(struct msm_fb_data_type *mfd, dma = mdp3_session->dma; - if (cfg->cmap.start + cfg->cmap.len > MDP_LUT_SIZE) { - pr_err("Invalid arguments\n"); + if ((cfg->cmap.start > MDP_LUT_SIZE) || + (cfg->cmap.len > MDP_LUT_SIZE) || + (cfg->cmap.start + cfg->cmap.len > MDP_LUT_SIZE)) { + pr_err("Invalid arguments.\n"); return -EINVAL; } diff --git a/drivers/video/msm/mdss/mdp3_dma.c b/drivers/video/msm/mdss/mdp3_dma.c index d4c83d6e33f0d..8b382ea6fd95d 100644 --- a/drivers/video/msm/mdss/mdp3_dma.c +++ b/drivers/video/msm/mdss/mdp3_dma.c @@ -721,7 +721,7 @@ static int mdp3_dmap_update(struct mdp3_dma *dma, void *buf, retry_vsync: rc = wait_for_completion_timeout(&dma->vsync_comp, KOFF_TIMEOUT); - pr_err("%s VID DMA Buff Addr %p\n", __func__, buf); + pr_err("%s VID DMA Buff Addr %pK\n", __func__, buf); if (rc <= 0 && --retry_count) { int vsync = MDP3_REG_READ(MDP3_REG_INTR_STATUS) & (1 << MDP3_INTR_LCDC_START_OF_FRAME); diff --git a/drivers/video/msm/mdss/mdp3_ppp.c b/drivers/video/msm/mdss/mdp3_ppp.c index 2eeecf046dbcc..682d3b002e4e7 100644 --- a/drivers/video/msm/mdss/mdp3_ppp.c +++ b/drivers/video/msm/mdss/mdp3_ppp.c @@ -37,6 +37,7 @@ #define MDP_PPP_MAX_BPP 4 #define MDP_PPP_DYNAMIC_FACTOR 3 #define MDP_PPP_MAX_READ_WRITE 3 +#define MDP_PPP_MAX_WIDTH 0xFFF #define ENABLE_SOLID_FILL 0x2 #define DISABLE_SOLID_FILL 0x0 #define BLEND_LATENCY 3 @@ -150,6 +151,11 @@ int mdp3_ppp_get_img(struct mdp_img *img, struct mdp_blit_req *req, return -EINVAL; } + if (img->width > MDP_PPP_MAX_WIDTH) { + pr_err("%s incorrect width %d\n", __func__, img->width); + return -EINVAL; + } + fb_data.flags = img->priv; fb_data.memory_id = img->memory_id; fb_data.offset = 0; diff --git a/drivers/video/msm/mdss/mdp3_ppp_hwio.c b/drivers/video/msm/mdss/mdp3_ppp_hwio.c index 5ba3fbdb62381..a4c66939bb184 100644 --- a/drivers/video/msm/mdss/mdp3_ppp_hwio.c +++ b/drivers/video/msm/mdss/mdp3_ppp_hwio.c @@ -1308,7 +1308,7 @@ int config_ppp_op_mode(struct ppp_blit_op *blit_op) pr_debug("ROI(x %d,y %d,w %d, h %d) ", blit_op->src.roi.x, blit_op->src.roi.y, blit_op->src.roi.width, blit_op->src.roi.height); - pr_debug("Addr_P0 %p, Stride S0 %d Addr_P1 %p, Stride S1 %d\n", + pr_debug("Addr_P0 %pK, Stride S0 %d Addr_P1 %pK, Stride S1 %d\n", blit_op->src.p0, blit_op->src.stride0, blit_op->src.p1, blit_op->src.stride1); @@ -1320,7 +1320,7 @@ int config_ppp_op_mode(struct ppp_blit_op *blit_op) pr_debug("ROI(x %d,y %d, w %d, h %d) ", blit_op->bg.roi.x, blit_op->bg.roi.y, blit_op->bg.roi.width, blit_op->bg.roi.height); - pr_debug("Addr %p, Stride S0 %d Addr_P1 %p, Stride S1 %d\n", + pr_debug("Addr %pK, Stride S0 %d Addr_P1 %pK, Stride S1 %d\n", blit_op->bg.p0, blit_op->bg.stride0, blit_op->bg.p1, blit_op->bg.stride1); } @@ -1331,7 +1331,7 @@ int config_ppp_op_mode(struct ppp_blit_op *blit_op) pr_debug("ROI(x %d,y %d, w %d, h %d) ", blit_op->dst.roi.x, blit_op->dst.roi.y, blit_op->dst.roi.width, blit_op->dst.roi.height); - pr_debug("Addr %p, Stride S0 %d Addr_P1 %p, Stride S1 %d\n", + pr_debug("Addr %pK, Stride S0 %d Addr_P1 %pK, Stride S1 %d\n", blit_op->dst.p0, blit_op->src.stride0, blit_op->dst.p1, blit_op->dst.stride1); diff --git a/drivers/video/msm/mdss/mdss.h b/drivers/video/msm/mdss/mdss.h index 9bd7e29a8aba0..396f4efe080da 100644 --- a/drivers/video/msm/mdss/mdss.h +++ b/drivers/video/msm/mdss/mdss.h @@ -161,6 +161,7 @@ enum mdss_hw_quirk { MDSS_QUIRK_FMT_PACK_PATTERN, MDSS_QUIRK_NEED_SECURE_MAP, MDSS_QUIRK_SRC_SPLIT_ALWAYS, + MDSS_QUIRK_HDR_SUPPORT_ENABLED, MDSS_QUIRK_MAX, }; @@ -248,7 +249,7 @@ struct mdss_smmu_ops { void (*smmu_unmap_dma_buf)(struct sg_table *table, int domain, int dir, struct dma_buf *dma_buf); int (*smmu_dma_alloc_coherent)(struct device *dev, size_t size, - dma_addr_t *phys, dma_addr_t *iova, void *cpu_addr, + dma_addr_t *phys, dma_addr_t *iova, void **cpu_addr, gfp_t gfp, int domain); void (*smmu_dma_free_coherent)(struct device *dev, size_t size, void *cpu_addr, dma_addr_t phys, dma_addr_t iova, diff --git a/drivers/video/msm/mdss/mdss_compat_utils.c b/drivers/video/msm/mdss/mdss_compat_utils.c index ad25b1f7a366b..d72cbb8bf8c66 100644 --- a/drivers/video/msm/mdss/mdss_compat_utils.c +++ b/drivers/video/msm/mdss/mdss_compat_utils.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2017, The Linux Foundation. All rights reserved. * Copyright (C) 1994 Martin Schaller * * 2001 - Documented with DocBook @@ -119,6 +119,9 @@ static unsigned int __do_compat_ioctl_nr(unsigned int cmd32) static void __copy_atomic_commit_struct(struct mdp_layer_commit *commit, struct mdp_layer_commit32 *commit32) { + unsigned int destsize = sizeof(commit->commit_v1.reserved); + unsigned int srcsize = sizeof(commit32->commit_v1.reserved); + unsigned int count = (destsize <= srcsize ? destsize : srcsize); commit->version = commit32->version; commit->commit_v1.flags = commit32->commit_v1.flags; commit->commit_v1.input_layer_cnt = @@ -126,7 +129,7 @@ static void __copy_atomic_commit_struct(struct mdp_layer_commit *commit, commit->commit_v1.left_roi = commit32->commit_v1.left_roi; commit->commit_v1.right_roi = commit32->commit_v1.right_roi; memcpy(&commit->commit_v1.reserved, &commit32->commit_v1.reserved, - sizeof(commit32->commit_v1.reserved)); + count); } static struct mdp_input_layer32 *__create_layer_list32( @@ -150,7 +153,7 @@ static struct mdp_input_layer32 *__create_layer_list32( compat_ptr(commit32->commit_v1.input_layers), sizeof(struct mdp_input_layer32) * layer_count); if (ret) { - pr_err("layer list32 copy from user failed, ptr %p\n", + pr_err("layer list32 copy from user failed, ptr %pK\n", compat_ptr(commit32->commit_v1.input_layers)); kfree(layer_list32); ret = -EFAULT; @@ -182,7 +185,7 @@ static int __copy_scale_params(struct mdp_input_layer *layer, sizeof(struct mdp_scale_data)); if (ret) { kfree(scale); - pr_err("scale param copy from user failed, ptr %p\n", + pr_err("scale param copy from user failed, ptr %pK\n", compat_ptr(layer32->scale)); ret = -EFAULT; } else { @@ -307,7 +310,7 @@ static int __compat_atomic_commit(struct fb_info *info, unsigned int cmd, ret = copy_from_user(&commit32, (void __user *)argp, sizeof(struct mdp_layer_commit32)); if (ret) { - pr_err("%s:copy_from_user failed, ptr %p\n", __func__, + pr_err("%s:copy_from_user failed, ptr %pK\n", __func__, (void __user *)argp); ret = -EFAULT; return ret; @@ -325,7 +328,7 @@ static int __compat_atomic_commit(struct fb_info *info, unsigned int cmd, compat_ptr(commit32.commit_v1.output_layer), buffer_size); if (ret) { - pr_err("fail to copy output layer from user, ptr %p\n", + pr_err("fail to copy output layer from user, ptr %pK\n", compat_ptr(commit32.commit_v1.output_layer)); ret = -EFAULT; goto layer_list_err; @@ -846,6 +849,7 @@ static int __from_user_pcc_coeff_v17( return -EFAULT; } + memset(&pcc_cfg_payload, 0, sizeof(pcc_cfg_payload)); pcc_cfg_payload.r.b = pcc_cfg_payload32.r.b; pcc_cfg_payload.r.g = pcc_cfg_payload32.r.g; pcc_cfg_payload.r.c = pcc_cfg_payload32.r.c; @@ -934,6 +938,7 @@ static int __to_user_pcc_coeff_v1_7( struct mdp_pcc_data_v1_7_32 pcc_cfg_payload32; struct mdp_pcc_data_v1_7 pcc_cfg_payload; + memset(&pcc_cfg_payload32, 0, sizeof(pcc_cfg_payload32)); if (copy_from_user(&pcc_cfg_payload, pcc_cfg->cfg_payload, sizeof(struct mdp_pcc_data_v1_7))) { @@ -1127,6 +1132,8 @@ static int __from_user_igc_lut_data_v17( pr_err("failed to copy payload from user for igc\n"); return -EFAULT; } + + memset(&igc_cfg_payload, 0, sizeof(igc_cfg_payload)); igc_cfg_payload.c0_c1_data = compat_ptr(igc_cfg_payload_32.c0_c1_data); igc_cfg_payload.c2_data = compat_ptr(igc_cfg_payload_32.c2_data); igc_cfg_payload.len = igc_cfg_payload_32.len; @@ -1261,6 +1268,7 @@ static int __from_user_pgc_lut_data_v1_7( pr_err("failed to copy from user the pgc32 payload\n"); return -EFAULT; } + memset(&pgc_cfg_payload, 0, sizeof(pgc_cfg_payload)); pgc_cfg_payload.c0_data = compat_ptr(pgc_cfg_payload_32.c0_data); pgc_cfg_payload.c1_data = compat_ptr(pgc_cfg_payload_32.c1_data); pgc_cfg_payload.c2_data = compat_ptr(pgc_cfg_payload_32.c2_data); @@ -1470,6 +1478,7 @@ static int __from_user_hist_lut_data_v1_7( return -EFAULT; } + memset(&hist_lut_cfg_payload, 0, sizeof(hist_lut_cfg_payload)); hist_lut_cfg_payload.len = hist_lut_cfg_payload32.len; hist_lut_cfg_payload.data = compat_ptr(hist_lut_cfg_payload32.data); @@ -2024,6 +2033,7 @@ static int __from_user_pa_data_v1_7( return -EFAULT; } + memset(&pa_cfg_payload, 0, sizeof(pa_cfg_payload)); pa_cfg_payload.mode = pa_cfg_payload32.mode; pa_cfg_payload.global_hue_adj = pa_cfg_payload32.global_hue_adj; pa_cfg_payload.global_sat_adj = pa_cfg_payload32.global_sat_adj; @@ -2124,6 +2134,7 @@ static int __to_user_pa_data_v1_7( struct mdp_pa_data_v1_7_32 pa_cfg_payload32; struct mdp_pa_data_v1_7 pa_cfg_payload; + memset(&pa_cfg_payload32, 0, sizeof(pa_cfg_payload32)); if (copy_from_user(&pa_cfg_payload, pa_v2_cfg->cfg_payload, sizeof(pa_cfg_payload))) { @@ -2280,6 +2291,8 @@ static int __from_user_gamut_cfg_data_v17( pr_err("failed to copy the gamut payload from userspace\n"); return -EFAULT; } + + memset(&gamut_cfg_payload, 0, sizeof(gamut_cfg_payload)); gamut_cfg_payload.mode = gamut_cfg_payload32.mode; for (i = 0; i < MDP_GAMUT_TABLE_NUM_V1_7; i++) { gamut_cfg_payload.tbl_size[i] = @@ -3418,7 +3431,7 @@ static int __copy_layer_igc_lut_data_v1_7( cfg_payload32, sizeof(struct mdp_igc_lut_data_v1_7_32)); if (ret) { - pr_err("copy from user failed, IGC cfg payload = %p\n", + pr_err("copy from user failed, IGC cfg payload = %pK\n", cfg_payload32); ret = -EFAULT; goto exit; @@ -3474,6 +3487,7 @@ static int __copy_layer_pp_info_igc_params( compat_ptr(pp_info32->igc_cfg.c0_c1_data); pp_info->igc_cfg.c2_data = compat_ptr(pp_info32->igc_cfg.c2_data); + kfree(cfg_payload); cfg_payload = NULL; break; } @@ -3493,7 +3507,7 @@ static int __copy_layer_hist_lut_data_v1_7( cfg_payload32, sizeof(struct mdp_hist_lut_data_v1_7_32)); if (ret) { - pr_err("copy from user failed, hist lut cfg_payload = %p\n", + pr_err("copy from user failed, hist lut cfg_payload = %pK\n", cfg_payload32); ret = -EFAULT; goto exit; @@ -3546,6 +3560,7 @@ static int __copy_layer_pp_info_hist_lut_params( pp_info->hist_lut_cfg.len = pp_info32->hist_lut_cfg.len; pp_info->hist_lut_cfg.data = compat_ptr(pp_info32->hist_lut_cfg.data); + kfree(cfg_payload); cfg_payload = NULL; break; } @@ -3565,7 +3580,7 @@ static int __copy_layer_pa_data_v1_7( cfg_payload32, sizeof(struct mdp_pa_data_v1_7_32)); if (ret) { - pr_err("copy from user failed, pa cfg_payload = %p\n", + pr_err("copy from user failed, pa cfg_payload = %pK\n", cfg_payload32); ret = -EFAULT; goto exit; @@ -3635,6 +3650,7 @@ static int __copy_layer_pp_info_pa_v2_params( break; default: pr_debug("version invalid\n"); + kfree(cfg_payload); cfg_payload = NULL; break; } @@ -3707,7 +3723,7 @@ static int __copy_layer_pp_info_pcc_params( compat_ptr(pp_info32->pcc_cfg_data.cfg_payload), sizeof(struct mdp_pcc_data_v1_7)); if (ret) { - pr_err("compat copy of PCC cfg payload failed, ptr %p\n", + pr_err("compat copy of PCC cfg payload failed, ptr %pK\n", compat_ptr( pp_info32->pcc_cfg_data.cfg_payload)); ret = -EFAULT; @@ -3718,6 +3734,7 @@ static int __copy_layer_pp_info_pcc_params( break; default: pr_debug("version invalid, fallback to legacy\n"); + kfree(cfg_payload); cfg_payload = NULL; break; } @@ -3741,7 +3758,7 @@ static int __copy_layer_pp_info_params(struct mdp_input_layer *layer, compat_ptr(layer32->pp_info), sizeof(struct mdp_overlay_pp_params32)); if (ret) { - pr_err("pp info copy from user failed, pp_info %p\n", + pr_err("pp info copy from user failed, pp_info %pK\n", compat_ptr(layer32->pp_info)); ret = -EFAULT; goto exit; diff --git a/drivers/video/msm/mdss/mdss_debug.c b/drivers/video/msm/mdss/mdss_debug.c index a1f15d9c94fa3..2756c0dd6f271 100644 --- a/drivers/video/msm/mdss/mdss_debug.c +++ b/drivers/video/msm/mdss/mdss_debug.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2009-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 @@ -44,6 +44,8 @@ #define INVALID_XIN_ID 0xFF +static DEFINE_MUTEX(mdss_debug_lock); + static char panel_reg[2] = {DEFAULT_READ_PANEL_POWER_MODE_REG, 0x00}; static int panel_debug_base_open(struct inode *inode, struct file *file) @@ -57,11 +59,13 @@ static int panel_debug_base_open(struct inode *inode, struct file *file) static int panel_debug_base_release(struct inode *inode, struct file *file) { struct mdss_debug_base *dbg = file->private_data; + mutex_lock(&mdss_debug_lock); if (dbg && dbg->buf) { kfree(dbg->buf); dbg->buf_len = 0; dbg->buf = NULL; } + mutex_unlock(&mdss_debug_lock); return 0; } @@ -93,8 +97,10 @@ static ssize_t panel_debug_base_offset_write(struct file *file, if (cnt > (dbg->max_offset - off)) cnt = dbg->max_offset - off; + mutex_lock(&mdss_debug_lock); dbg->off = off; dbg->cnt = cnt; + mutex_unlock(&mdss_debug_lock); pr_debug("offset=%x cnt=%d\n", off, cnt); @@ -114,15 +120,21 @@ static ssize_t panel_debug_base_offset_read(struct file *file, if (*ppos) return 0; /* the end */ + mutex_lock(&mdss_debug_lock); len = snprintf(buf, sizeof(buf), "0x%02zx %zx\n", dbg->off, dbg->cnt); - if (len < 0 || len >= sizeof(buf)) + if (len < 0 || len >= sizeof(buf)) { + mutex_unlock(&mdss_debug_lock); return 0; + } - if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) + if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) { + mutex_unlock(&mdss_debug_lock); return -EFAULT; + } *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; } @@ -220,11 +232,16 @@ static ssize_t panel_debug_base_reg_read(struct file *file, if (!dbg) return -ENODEV; - if (!dbg->cnt) + mutex_lock(&mdss_debug_lock); + if (!dbg->cnt) { + mutex_unlock(&mdss_debug_lock); return 0; + } - if (*ppos) + if (*ppos) { + mutex_unlock(&mdss_debug_lock); return 0; /* the end */ + } /* '0x' + 2 digit + blank = 5 bytes for each number */ reg_buf_len = (dbg->cnt * PANEL_REG_FORMAT_LEN) @@ -265,11 +282,13 @@ static ssize_t panel_debug_base_reg_read(struct file *file, kfree(panel_reg_buf); *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; read_reg_fail: kfree(rx_buf); kfree(panel_reg_buf); + mutex_unlock(&mdss_debug_lock); return rc; } @@ -368,11 +387,13 @@ static int mdss_debug_base_open(struct inode *inode, struct file *file) static int mdss_debug_base_release(struct inode *inode, struct file *file) { struct mdss_debug_base *dbg = file->private_data; + mutex_lock(&mdss_debug_lock); if (dbg && dbg->buf) { kfree(dbg->buf); dbg->buf_len = 0; dbg->buf = NULL; } + mutex_unlock(&mdss_debug_lock); return 0; } @@ -395,6 +416,9 @@ static ssize_t mdss_debug_base_offset_write(struct file *file, buf[count] = 0; /* end of string */ + if (off % sizeof(u32)) + return -EINVAL; + sscanf(buf, "%5x %x", &off, &cnt); if (off > dbg->max_offset) @@ -403,8 +427,10 @@ static ssize_t mdss_debug_base_offset_write(struct file *file, if (cnt > (dbg->max_offset - off)) cnt = dbg->max_offset - off; + mutex_lock(&mdss_debug_lock); dbg->off = off; dbg->cnt = cnt; + mutex_unlock(&mdss_debug_lock); pr_debug("offset=%x cnt=%x\n", off, cnt); @@ -424,15 +450,21 @@ static ssize_t mdss_debug_base_offset_read(struct file *file, if (*ppos) return 0; /* the end */ + mutex_lock(&mdss_debug_lock); len = snprintf(buf, sizeof(buf), "0x%08zx %zx\n", dbg->off, dbg->cnt); - if (len < 0 || len >= sizeof(buf)) + if (len < 0 || len >= sizeof(buf)) { + mutex_unlock(&mdss_debug_lock); return 0; + } - if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) + if ((count < sizeof(buf)) || copy_to_user(buff, buf, len)) { + mutex_unlock(&mdss_debug_lock); return -EFAULT; + } *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; } @@ -461,6 +493,9 @@ static ssize_t mdss_debug_base_reg_write(struct file *file, if (cnt < 2) return -EFAULT; + if (off % sizeof(u32)) + return -EFAULT; + if (off >= dbg->max_offset) return -EFAULT; @@ -489,6 +524,8 @@ static ssize_t mdss_debug_base_reg_read(struct file *file, return -ENODEV; } + mutex_lock(&mdss_debug_lock); + if (!dbg->buf) { char dump_buf[64]; char *ptr; @@ -500,9 +537,13 @@ static ssize_t mdss_debug_base_reg_read(struct file *file, if (!dbg->buf) { pr_err("not enough memory to hold reg dump\n"); + mutex_unlock(&mdss_debug_lock); return -ENOMEM; } + if (dbg->off % sizeof(u32)) + return -EFAULT; + ptr = dbg->base + dbg->off; tot = 0; @@ -530,17 +571,21 @@ static ssize_t mdss_debug_base_reg_read(struct file *file, dbg->buf_len = tot; } - if (*ppos >= dbg->buf_len) + if (*ppos >= dbg->buf_len) { + mutex_unlock(&mdss_debug_lock); return 0; /* done reading */ + } len = min(count, dbg->buf_len - (size_t) *ppos); if (copy_to_user(user_buf, dbg->buf + *ppos, len)) { pr_err("failed to copy to user\n"); + mutex_unlock(&mdss_debug_lock); return -EFAULT; } *ppos += len; /* increase offset */ + mutex_unlock(&mdss_debug_lock); return len; } @@ -1359,7 +1404,7 @@ static inline struct mdss_mdp_misr_map *mdss_misr_get_map(u32 block_id, return NULL; } - pr_debug("MISR Module(%d) CTRL(0x%x) SIG(0x%x) intf_base(0x%p)\n", + pr_debug("MISR Module(%d) CTRL(0x%x) SIG(0x%x) intf_base(0x%pK)\n", block_id, map->ctrl_reg, map->value_reg, intf_base); return map; } @@ -1432,7 +1477,7 @@ int mdss_misr_set(struct mdss_data_type *mdata, bool use_mdp_up_misr = false; if (!mdata || !req || !ctl) { - pr_err("Invalid input params: mdata = %p req = %p ctl = %p", + pr_err("Invalid input params: mdata = %pK req = %pK ctl = %pK", mdata, req, ctl); return -EINVAL; } @@ -1512,7 +1557,7 @@ int mdss_misr_set(struct mdss_data_type *mdata, writel_relaxed(config, mdata->mdp_base + map->ctrl_reg); - pr_debug("MISR_CTRL=0x%x [base:0x%p reg:0x%x config:0x%x]\n", + pr_debug("MISR_CTRL=0x%x [base:0x%pK reg:0x%x config:0x%x]\n", readl_relaxed(mdata->mdp_base + map->ctrl_reg), mdata->mdp_base, map->ctrl_reg, config); } diff --git a/drivers/video/msm/mdss/mdss_debug_xlog.c b/drivers/video/msm/mdss/mdss_debug_xlog.c index 431118980afc6..375dc47dd006d 100644 --- a/drivers/video/msm/mdss/mdss_debug_xlog.c +++ b/drivers/video/msm/mdss/mdss_debug_xlog.c @@ -253,7 +253,7 @@ static void mdss_dump_debug_bus(u32 bus_dump_flag, if (*dump_mem) { dump_addr = *dump_mem; - pr_info("%s: start_addr:0x%p end_addr:0x%p\n", + pr_info("%s: start_addr:0x%pK end_addr:0x%pK\n", __func__, dump_addr, dump_addr + list_size); } else { in_mem = false; @@ -371,7 +371,7 @@ static void mdss_dump_vbif_debug_bus(u32 bus_dump_flag, if (*dump_mem) { dump_addr = *dump_mem; - pr_info("%s: start_addr:0x%p end_addr:0x%p\n", + pr_info("%s: start_addr:0x%pK end_addr:0x%pK\n", __func__, dump_addr, dump_addr + list_size); } else { in_mem = false; @@ -431,7 +431,7 @@ void mdss_dump_reg(const char *dump_name, u32 reg_dump_flag, char *addr, if (*dump_mem) { dump_addr = *dump_mem; - pr_info("%s: start_addr:0x%p end_addr:0x%p reg_addr=0x%p\n", + pr_info("%s: start_addr:0x%pK end_addr:0x%pK reg_addr=0x%pK\n", dump_name, dump_addr, dump_addr + (u32)len * 16, addr); } else { @@ -452,7 +452,7 @@ void mdss_dump_reg(const char *dump_name, u32 reg_dump_flag, char *addr, xc = readl_relaxed(addr+0xc); if (in_log) - pr_info("%p : %08x %08x %08x %08x\n", addr, x0, x4, x8, + pr_info("%pK : %08x %08x %08x %08x\n", addr, x0, x4, x8, xc); if (dump_addr && in_mem) { @@ -490,7 +490,7 @@ static void mdss_dump_reg_by_ranges(struct mdss_debug_base *dbg, len = get_dump_range(&xlog_node->offset, dbg->max_offset); addr = dbg->base + xlog_node->offset.start; - pr_debug("%s: range_base=0x%p start=0x%x end=0x%x\n", + pr_debug("%s: range_base=0x%pK start=0x%x end=0x%x\n", xlog_node->range_name, addr, xlog_node->offset.start, xlog_node->offset.end); @@ -501,7 +501,7 @@ static void mdss_dump_reg_by_ranges(struct mdss_debug_base *dbg, } else { /* If there is no list to dump ranges, dump all registers */ pr_info("Ranges not found, will dump full registers"); - pr_info("base:0x%p len:0x%zu\n", dbg->base, dbg->max_offset); + pr_info("base:0x%pK len:0x%zu\n", dbg->base, dbg->max_offset); addr = dbg->base; len = dbg->max_offset; mdss_dump_reg((const char *)dbg->name, reg_dump_flag, addr, diff --git a/drivers/video/msm/mdss/mdss_dsi.c b/drivers/video/msm/mdss/mdss_dsi.c index 8a1933709cf38..df9bdaa6910a0 100644 --- a/drivers/video/msm/mdss/mdss_dsi.c +++ b/drivers/video/msm/mdss/mdss_dsi.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -35,6 +36,13 @@ #include "mdss_dba_utils.h" #define XO_CLK_RATE 19200000 + +struct mutex gamma_lock; +struct mutex ce_lock; +struct mutex eye_lock; +struct mutex cabc_lock; + + #define CMDLINE_DSI_CTL_NUM_STRING_LEN 2 /* Master structure to hold all the information about the DSI/panel */ @@ -44,6 +52,8 @@ static struct mdss_dsi_data *mdss_dsi_res; #define DSI_ENABLE_PC_LATENCY PM_QOS_DEFAULT_VALUE static struct pm_qos_request mdss_dsi_pm_qos_request; +bool is_Lcm_Present = false; +bool is_tianma_panel = false; static void mdss_dsi_pm_qos_add_request(struct mdss_dsi_ctrl_pdata *ctrl_pdata) { @@ -292,6 +302,8 @@ static int mdss_dsi_panel_power_off(struct mdss_panel_data *pdata) ret = 0; } + usleep(500); + if (mdss_dsi_pinctrl_set_state(ctrl_pdata, false)) pr_debug("reset disable: pinctrl not enabled\n"); @@ -306,6 +318,8 @@ static int mdss_dsi_panel_power_off(struct mdss_panel_data *pdata) return ret; } +int tp_gesture_onoff = 0; +EXPORT_SYMBOL(tp_gesture_onoff); static int mdss_dsi_panel_power_on(struct mdss_panel_data *pdata) { int ret = 0; @@ -344,7 +358,6 @@ static int mdss_dsi_panel_power_on(struct mdss_panel_data *pdata) pr_err("%s: Panel reset failed. rc=%d\n", __func__, ret); } - return ret; } @@ -625,6 +638,7 @@ struct buf_data { char *string_buf; /* cmd buf as string, 3 bytes per number */ int sblen; /* string buffer length */ int sync_flag; + struct mutex dbg_mutex; /* mutex to synchronize read/write/flush */ }; struct mdss_dsi_debugfs_info { @@ -673,6 +687,11 @@ static ssize_t mdss_dsi_cmd_state_write(struct file *file, int *link_state = file->private_data; char *input; + if (!count) { + pr_err("%s: Zero bytes to be written\n", __func__); + return -EINVAL; + } + input = kmalloc(count, GFP_KERNEL); if (!input) { pr_err("%s: Failed to allocate memory\n", __func__); @@ -714,6 +733,7 @@ static ssize_t mdss_dsi_cmd_read(struct file *file, char __user *buf, char *bp; ssize_t ret = 0; + mutex_lock(&pcmds->dbg_mutex); if (*ppos == 0) { kfree(pcmds->string_buf); pcmds->string_buf = NULL; @@ -732,6 +752,7 @@ static ssize_t mdss_dsi_cmd_read(struct file *file, char __user *buf, buffer = kmalloc(bsize, GFP_KERNEL); if (!buffer) { pr_err("%s: Failed to allocate memory\n", __func__); + mutex_unlock(&pcmds->dbg_mutex); return -ENOMEM; } @@ -767,10 +788,12 @@ static ssize_t mdss_dsi_cmd_read(struct file *file, char __user *buf, kfree(pcmds->string_buf); pcmds->string_buf = NULL; pcmds->sblen = 0; + mutex_unlock(&pcmds->dbg_mutex); return 0; /* the end */ } ret = simple_read_from_buffer(buf, count, ppos, pcmds->string_buf, pcmds->sblen); + mutex_unlock(&pcmds->dbg_mutex); return ret; } @@ -782,6 +805,7 @@ static ssize_t mdss_dsi_cmd_write(struct file *file, const char __user *p, int blen = 0; char *string_buf; + mutex_lock(&pcmds->dbg_mutex); if (*ppos == 0) { kfree(pcmds->string_buf); pcmds->string_buf = NULL; @@ -793,15 +817,22 @@ static ssize_t mdss_dsi_cmd_write(struct file *file, const char __user *p, string_buf = krealloc(pcmds->string_buf, blen + 1, GFP_KERNEL); if (!string_buf) { pr_err("%s: Failed to allocate memory\n", __func__); + mutex_unlock(&pcmds->dbg_mutex); return -ENOMEM; } /* Writing in batches is possible */ ret = simple_write_to_buffer(string_buf, blen, ppos, p, count); + if (ret < 0) { + pr_err("%s: Failed to copy data\n", __func__); + mutex_unlock(&pcmds->dbg_mutex); + return -EINVAL; + } - string_buf[blen] = '\0'; + string_buf[ret] = '\0'; pcmds->string_buf = string_buf; - pcmds->sblen = blen; + pcmds->sblen = count; + mutex_unlock(&pcmds->dbg_mutex); return ret; } @@ -812,8 +843,12 @@ static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id) char *buf, *bufp, *bp; struct dsi_ctrl_hdr *dchdr; - if (!pcmds->string_buf) + mutex_lock(&pcmds->dbg_mutex); + + if (!pcmds->string_buf) { + mutex_unlock(&pcmds->dbg_mutex); return 0; + } /* * Allocate memory for command buffer @@ -826,6 +861,7 @@ static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id) kfree(pcmds->string_buf); pcmds->string_buf = NULL; pcmds->sblen = 0; + mutex_unlock(&pcmds->dbg_mutex); return -ENOMEM; } @@ -850,6 +886,7 @@ static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id) pr_err("%s: dtsi cmd=%x error, len=%d\n", __func__, dchdr->dtype, dchdr->dlen); kfree(buf); + mutex_unlock(&pcmds->dbg_mutex); return -EINVAL; } bp += sizeof(*dchdr); @@ -861,6 +898,7 @@ static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id) pr_err("%s: dcs_cmd=%x len=%d error!\n", __func__, bp[0], len); kfree(buf); + mutex_unlock(&pcmds->dbg_mutex); return -EINVAL; } @@ -873,6 +911,7 @@ static int mdss_dsi_cmd_flush(struct file *file, fl_owner_t id) pcmds->buf = buf; pcmds->blen = blen; } + mutex_unlock(&pcmds->dbg_mutex); return 0; } @@ -887,6 +926,7 @@ struct dentry *dsi_debugfs_create_dcs_cmd(const char *name, umode_t mode, struct dentry *parent, struct buf_data *cmd, struct dsi_panel_cmds ctrl_cmds) { + mutex_init(&cmd->dbg_mutex); cmd->buf = ctrl_cmds.buf; cmd->blen = ctrl_cmds.blen; cmd->string_buf = NULL; @@ -1129,7 +1169,7 @@ static int mdss_dsi_off(struct mdss_panel_data *pdata, int power_state) panel_info = &ctrl_pdata->panel_data.panel_info; - pr_debug("%s+: ctrl=%p ndx=%d power_state=%d\n", + pr_debug("%s+: ctrl=%pK ndx=%d power_state=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx, power_state); if (power_state == panel_info->panel_power_state) { @@ -1297,6 +1337,7 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) struct mipi_panel_info *mipi; struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; int cur_power_state; + unsigned long timeout = jiffies; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); @@ -1310,7 +1351,7 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) mdss_dsi_validate_debugfs_info(ctrl_pdata); cur_power_state = pdata->panel_info.panel_power_state; - pr_debug("%s+: ctrl=%p ndx=%d cur_power_state=%d\n", __func__, + pr_debug("%s+: ctrl=%pK ndx=%d cur_power_state=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx, cur_power_state); pinfo = &pdata->panel_info; @@ -1398,6 +1439,9 @@ int mdss_dsi_on(struct mdss_panel_data *pdata) mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + pr_info("%s: mdss_dsi_on time=%ums \n", __func__, + jiffies_to_msecs(jiffies-timeout)); + end: pr_debug("%s-:\n", __func__); return ret; @@ -1482,7 +1526,7 @@ static int mdss_dsi_unblank(struct mdss_panel_data *pdata) panel_data); mipi = &pdata->panel_info.mipi; - pr_debug("%s+: ctrl=%p ndx=%d cur_power_state=%d ctrl_state=%x\n", + pr_debug("%s+: ctrl=%pK ndx=%d cur_power_state=%d ctrl_state=%x\n", __func__, ctrl_pdata, ctrl_pdata->ndx, pdata->panel_info.panel_power_state, ctrl_pdata->ctrl_state); @@ -1497,10 +1541,12 @@ static int mdss_dsi_unblank(struct mdss_panel_data *pdata) mdss_dsi_clk_ctrl(sctrl, sctrl->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); - if (mdss_dsi_is_panel_on_lp(pdata)) { + if (ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_LP) { pr_debug("%s: dsi_unblank with panel always on\n", __func__); if (ctrl_pdata->low_power_config) ret = ctrl_pdata->low_power_config(pdata, false); + if (!ret) + ctrl_pdata->ctrl_state &= ~CTRL_STATE_PANEL_LP; goto error; } @@ -1555,7 +1601,7 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state) panel_data); mipi = &pdata->panel_info.mipi; - pr_debug("%s+: ctrl=%p ndx=%d power_state=%d\n", + pr_debug("%s+: ctrl=%pK ndx=%d power_state=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx, power_state); mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, @@ -1565,6 +1611,8 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state) pr_debug("%s: low power state requested\n", __func__); if (ctrl_pdata->low_power_config) ret = ctrl_pdata->low_power_config(pdata, true); + if (!ret) + ctrl_pdata->ctrl_state |= CTRL_STATE_PANEL_LP; goto error; } @@ -1607,7 +1655,8 @@ static int mdss_dsi_blank(struct mdss_panel_data *pdata, int power_state) } ATRACE_END("dsi_panel_off"); } - ctrl_pdata->ctrl_state &= ~CTRL_STATE_PANEL_INIT; + ctrl_pdata->ctrl_state &= ~(CTRL_STATE_PANEL_INIT | + CTRL_STATE_PANEL_LP); } error: @@ -1629,7 +1678,7 @@ static int mdss_dsi_post_panel_on(struct mdss_panel_data *pdata) ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); - pr_debug("%s+: ctrl=%p ndx=%d\n", __func__, + pr_debug("%s+: ctrl=%pK ndx=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx); mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, @@ -1663,7 +1712,7 @@ int mdss_dsi_cont_splash_on(struct mdss_panel_data *pdata) ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); - pr_debug("%s+: ctrl=%p ndx=%d\n", __func__, + pr_debug("%s+: ctrl=%pK ndx=%d\n", __func__, ctrl_pdata, ctrl_pdata->ndx); WARN((ctrl_pdata->ctrl_state & CTRL_STATE_PANEL_INIT), @@ -2738,6 +2787,10 @@ static struct device_node *mdss_dsi_find_panel_of_node( panel_name[i] = *(str1 + i); panel_name[i] = 0; } + + if (!strcmp(panel_name, "qcom,mdss_dsi_ili9881c_tianma_c3b_720p_video")) + is_tianma_panel = true; + pr_info("%s: cmdline:%s panel_name:%s\n", __func__, panel_cfg, panel_name); if (!strcmp(panel_name, NONE_PANEL)) @@ -2776,12 +2829,13 @@ static struct device_node *mdss_dsi_find_panel_of_node( cfg_np_name, MDSS_MAX_PANEL_LEN); } } - + is_Lcm_Present = true; return dsi_pan_node; } end: if (strcmp(panel_name, NONE_PANEL)) dsi_pan_node = mdss_dsi_pref_prim_panel(pdev); + is_Lcm_Present = false; exit: return dsi_pan_node; } @@ -2995,8 +3049,8 @@ static int mdss_dsi_get_bridge_chip_params(struct mdss_panel_info *pinfo, u32 temp_val = 0; if (!ctrl_pdata || !pdev || !pinfo) { - pr_err("%s: Invalid Params ctrl_pdata=%p, pdev=%p\n", __func__, - ctrl_pdata, pdev); + pr_err("%s: Invalid Params ctrl_pdata=%pK, pdev=%pK\n", + __func__, ctrl_pdata, pdev); rc = -EINVAL; goto end; } @@ -3318,7 +3372,7 @@ static int mdss_dsi_res_init(struct platform_device *pdev) mdss_dsi_res->shared_data = devm_kzalloc(&pdev->dev, sizeof(struct dsi_shared_data), GFP_KERNEL); - pr_debug("%s Allocated shared_data=%p\n", __func__, + pr_debug("%s Allocated shared_data=%pK\n", __func__, mdss_dsi_res->shared_data); if (!mdss_dsi_res->shared_data) { pr_err("%s Unable to alloc mem for shared_data\n", @@ -3384,7 +3438,7 @@ static int mdss_dsi_res_init(struct platform_device *pdev) rc = -ENOMEM; goto mem_fail; } - pr_debug("%s Allocated ctrl_pdata[%d]=%p\n", + pr_debug("%s Allocated ctrl_pdata[%d]=%pK\n", __func__, i, mdss_dsi_res->ctrl_pdata[i]); mdss_dsi_res->ctrl_pdata[i]->shared_data = mdss_dsi_res->shared_data; @@ -3394,7 +3448,7 @@ static int mdss_dsi_res_init(struct platform_device *pdev) } mdss_dsi_res->pdev = pdev; - pr_debug("%s: Setting up mdss_dsi_res=%p\n", __func__, mdss_dsi_res); + pr_debug("%s: Setting up mdss_dsi_res=%pK\n", __func__, mdss_dsi_res); return 0; @@ -3620,6 +3674,10 @@ static int mdss_dsi_probe(struct platform_device *pdev) pr_err("%s: Invalid DSI hw configuration\n", __func__); goto error; } + mutex_init(&gamma_lock); + mutex_init(&ce_lock); + mutex_init(&eye_lock); + mutex_init(&cabc_lock); mdss_dsi_config_clk_src(pdev); @@ -3721,11 +3779,11 @@ int mdss_dsi_retrieve_ctrl_resources(struct platform_device *pdev, int mode, pr_debug("%s:%d unable to remap dsi phy regulator resources\n", __func__, __LINE__); else - pr_info("%s: phy_regulator_base=%p phy_regulator_size=%x\n", + pr_info("%s: phy_regulator_base=%pK phy_regulator_size=%x\n", __func__, ctrl->phy_regulator_io.base, ctrl->phy_regulator_io.len); - pr_info("%s: ctrl_base=%p ctrl_size=%x phy_base=%p phy_size=%x\n", + pr_info("%s: ctrl_base=%pK ctrl_size=%x phy_base=%pK phy_size=%x\n", __func__, ctrl->ctrl_base, ctrl->reg_size, ctrl->phy_io.base, ctrl->phy_io.len); @@ -3869,7 +3927,7 @@ static int mdss_dsi_parse_ctrl_params(struct platform_device *ctrl_pdev, data = of_get_property(ctrl_pdev->dev.of_node, "qcom,display-id", &len); if (!data || len <= 0) - pr_err("%s:%d Unable to read qcom,display-id, data=%p,len=%d\n", + pr_err("%s:%d Unable to read qcom,display-id, data=%pK,len=%d\n", __func__, __LINE__, data, len); else snprintf(ctrl_pdata->panel_data.panel_info.display_id, @@ -4150,6 +4208,223 @@ static int mdss_dsi_register_driver(void) return platform_driver_register(&mdss_dsi_driver); } +int current_gamma = NATURE; +int current_ce = STANDARD; +int current_eye = 0; +int poweron = 0; + +extern int mdss_dsi_panel_gamma(struct mdss_panel_data *pdata); + int mdss_panel_set_gamma(struct mdss_panel_data *pdata, int mode) +{ + int ret = 0; + struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + + if (poweron == 0 && is_tianma_panel) { + poweron++; + current_gamma = 0; + } + + if (mode != current_gamma) { + pr_err("%s: Set panel gamma, mode is %d\n", __func__, mode); + mutex_lock(&gamma_lock); + ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); + + switch (mode) { + case WARM: + ctrl_pdata->gamma_cmds = ctrl_pdata->warm_cmds; + current_gamma = WARM; + break; + case COOL: + ctrl_pdata->gamma_cmds = ctrl_pdata->cool_cmds; + current_gamma = COOL; + break; + case NATURE: + ctrl_pdata->gamma_cmds = ctrl_pdata->nature_cmds; + current_gamma = NATURE; + break; + default: + ret = -EINVAL; + goto err_out; + } + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(0, &ctrl_pdata->panel_data); + + ret = mdss_dsi_panel_gamma(pdata); + if (ret) { + pr_err("%s: unable to set the panel gamma\n", + __func__); + goto err_out; + } + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) { + mdss_dsi_set_tx_power_mode(1, &ctrl_pdata->panel_data); + } + +err_out: + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + mutex_unlock(&gamma_lock); + } + + return ret; +} + +extern int mdss_dsi_panel_dispparam(struct mdss_panel_data *pdata); +int mdss_panel_set_dispparam(struct mdss_panel_data *pdata, int level) +{ + int ret = 0; + struct mipi_panel_info *mipi; + struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; + + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + if (current_eye != level) { + mutex_lock(&eye_lock); + ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mipi = &pdata->panel_info.mipi; + if ((level < 0) || (level > 8)) { + pr_err("%s: Invalid level to protect eyes\n", __func__); + mutex_unlock(&eye_lock); + return -EINVAL; + } + + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); + + current_eye = level; + if (level == 0) { + ctrl_pdata->eyemode = false; + if (current_gamma == WARM) + ctrl_pdata->dispparam_cmds = ctrl_pdata->warm_cmds; + if (current_gamma == COOL) + ctrl_pdata->dispparam_cmds = ctrl_pdata->cool_cmds; + if (current_gamma == NATURE) + ctrl_pdata->dispparam_cmds = ctrl_pdata->nature_cmds; + } else{ + ctrl_pdata->eyemode = true; + ctrl_pdata->dispparam_cmds = ctrl_pdata->eye_cmds[level-1]; + } + + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(0, &ctrl_pdata->panel_data); + ret = mdss_dsi_panel_dispparam(pdata); + if (ret) { + pr_err("%s: unable to set the panel gamma\n", + __func__); + goto err_out; + } + + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(1, &ctrl_pdata->panel_data); + +err_out: + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + mutex_unlock(&eye_lock); + } + return ret; +} + +extern int mdss_dsi_panel_ce(struct mdss_panel_data *pdata); + int mdss_panel_set_ce(struct mdss_panel_data *pdata, int mode) +{ + int ret = 0; + struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + if (mode != current_ce) { + pr_err("%s: Set panel ce, mode is %d\n", __func__, mode); + mutex_lock(&ce_lock); + ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); + switch (mode) { + case VIVID: + ctrl_pdata->ce_cmds = ctrl_pdata->vivid_cmds; + current_ce = VIVID; + break; + case STANDARD: + ctrl_pdata->ce_cmds = ctrl_pdata->standard_cmds; + current_ce = STANDARD; + break; + case BRIGHT: + ctrl_pdata->ce_cmds = ctrl_pdata->bright_cmds; + current_ce = BRIGHT; + break; + default: + ret = -EINVAL; + goto err_out; + } + + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(0, &ctrl_pdata->panel_data); + + ret = mdss_dsi_panel_ce(pdata); + if (ret) { + pr_err("%s: unable to set the panel ce\n", __func__); + goto err_out; + } + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(1, &ctrl_pdata->panel_data); + +err_out: + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + mutex_unlock(&ce_lock); + } + return ret; +} +extern int mdss_dsi_panel_cabc(struct mdss_panel_data *pdata); + int mdss_panel_set_cabc(struct mdss_panel_data *pdata, int mode) +{ + int ret = 0; + struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + pr_err("%s: Set panel cabc, mode is %d\n", __func__, mode); + mutex_lock(&cabc_lock); + ctrl_pdata = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); + switch (mode) { + case CABC_ON: + ctrl_pdata->cabc_cmds = ctrl_pdata->cabc_on_cmds; + break; + case CABC_OFF: + ctrl_pdata->cabc_cmds = ctrl_pdata->cabc_off_cmds; + break; + default: + pr_err("%s: Set panel cabc fail, mode is %d\n", __func__, mode); + ret = -EINVAL; + goto err_out; + } + + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(0, &ctrl_pdata->panel_data); + + ret = mdss_dsi_panel_cabc(pdata); + if (ret) { + pr_err("%s: unable to set the panel cabc\n", __func__); + goto err_out; + } + if (ctrl_pdata->nature_cmds.link_state == DSI_HS_MODE) + mdss_dsi_set_tx_power_mode(1, &ctrl_pdata->panel_data); + +err_out: + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + mutex_unlock(&cabc_lock); + + return ret; +} + static int __init mdss_dsi_driver_init(void) { int ret; diff --git a/drivers/video/msm/mdss/mdss_dsi.h b/drivers/video/msm/mdss/mdss_dsi.h index e7683a3e49e99..dfc7eaeeec5d8 100644 --- a/drivers/video/msm/mdss/mdss_dsi.h +++ b/drivers/video/msm/mdss/mdss_dsi.h @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -64,6 +65,21 @@ #define NONE_PANEL "none" +enum { + WARM = 1, + COOL = 3, + NATURE = 2, + STANDARD = 10, + VIVID = 11, + BRIGHT = 12, +}; + +enum { /* mipi dsi panel */ + CABC_ON = 1, + CABC_OFF = 0, +}; + + enum { /* mipi dsi panel */ DSI_VIDEO_MODE, DSI_CMD_MODE, @@ -148,6 +164,7 @@ enum dsi_pm_type { #define CTRL_STATE_PANEL_INIT BIT(0) #define CTRL_STATE_MDP_ACTIVE BIT(1) #define CTRL_STATE_DSI_ACTIVE BIT(2) +#define CTRL_STATE_PANEL_LP BIT(3) #define DSI_NON_BURST_SYNCH_PULSE 0 #define DSI_NON_BURST_SYNCH_EVENT 1 @@ -428,6 +445,7 @@ struct mdss_dsi_ctrl_pdata { int irq_cnt; int disp_te_gpio; int rst_gpio; + int iovdd_gpio; int disp_en_gpio; int bklt_en_gpio; int mode_gpio; @@ -467,6 +485,22 @@ struct mdss_dsi_ctrl_pdata { struct dsi_panel_cmds post_panel_on_cmds; struct dsi_panel_cmds off_cmds; struct dsi_panel_cmds status_cmds; + struct dsi_panel_cmds warm_cmds; + struct dsi_panel_cmds cool_cmds; + struct dsi_panel_cmds nature_cmds; + struct dsi_panel_cmds vivid_cmds; + struct dsi_panel_cmds standard_cmds; + struct dsi_panel_cmds bright_cmds; + struct dsi_panel_cmds eye_cmds[8]; + struct dsi_panel_cmds cabc_cmds; + struct dsi_panel_cmds cabc_on_cmds; + struct dsi_panel_cmds cabc_off_cmds; + int eye_cmds_num; + bool eyemode; + struct dsi_panel_cmds dispparam_cmds; + struct dsi_panel_cmds gamma_cmds; + struct dsi_panel_cmds ce_cmds; + bool init_last; u32 *status_valid_params; u32 *status_cmds_rlen; u32 *status_value; @@ -617,6 +651,10 @@ int mdss_dsi_pre_clkon_cb(void *priv, enum mdss_dsi_clk_type clk_type, enum mdss_dsi_clk_state new_state); int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable); +int mdss_panel_set_ce(struct mdss_panel_data *pdata, int mode); +int mdss_panel_set_gamma(struct mdss_panel_data *pdata, int mode); +int mdss_panel_set_dispparam(struct mdss_panel_data *pdata, int mode); +int mdss_panel_set_cabc(struct mdss_panel_data *pdata, int mode); void mdss_dsi_phy_disable(struct mdss_dsi_ctrl_pdata *ctrl); void mdss_dsi_cmd_test_pattern(struct mdss_dsi_ctrl_pdata *ctrl); void mdss_dsi_video_test_pattern(struct mdss_dsi_ctrl_pdata *ctrl); diff --git a/drivers/video/msm/mdss/mdss_dsi_clk.c b/drivers/video/msm/mdss/mdss_dsi_clk.c index 377aeb7cad47b..ec339ba735c7c 100644 --- a/drivers/video/msm/mdss/mdss_dsi_clk.c +++ b/drivers/video/msm/mdss/mdss_dsi_clk.c @@ -754,7 +754,7 @@ int mdss_dsi_clk_req_state(void *client, enum mdss_dsi_clk_type clk, if (!client || !clk || clk > (MDSS_DSI_CORE_CLK | MDSS_DSI_LINK_CLK) || state > MDSS_DSI_CLK_EARLY_GATE) { - pr_err("Invalid params, client = %p, clk = 0x%x, state = %d\n", + pr_err("Invalid params, client = %pK, clk = 0x%x, state = %d\n", client, clk, state); return -EINVAL; } @@ -852,7 +852,7 @@ int mdss_dsi_clk_set_link_rate(void *client, enum mdss_dsi_link_clk_type clk, struct mdss_dsi_clk_mngr *mngr; if (!client || (clk > MDSS_DSI_LINK_CLK_MAX)) { - pr_err("Invalid params, client = %p, clk = 0x%x", client, clk); + pr_err("Invalid params, client = %pK, clk = 0x%x", client, clk); return -EINVAL; } @@ -951,7 +951,7 @@ int mdss_dsi_clk_force_toggle(void *client, u32 clk) struct mdss_dsi_clk_mngr *mngr; if (!client || !clk || clk >= MDSS_DSI_CLKS_MAX) { - pr_err("Invalid params, client = %p, clk = 0x%x\n", + pr_err("Invalid params, client = %pK, clk = 0x%x\n", client, clk); return -EINVAL; } diff --git a/drivers/video/msm/mdss/mdss_dsi_host.c b/drivers/video/msm/mdss/mdss_dsi_host.c index 27ea8fa502633..52404e8c6be48 100644 --- a/drivers/video/msm/mdss/mdss_dsi_host.c +++ b/drivers/video/msm/mdss/mdss_dsi_host.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -39,6 +40,8 @@ #define MDSS_DSI_INT_CTRL 0x0110 +#define CEIL(x, y) (((x) + ((y) - 1)) / (y)) + struct mdss_dsi_ctrl_pdata *ctrl_list[DSI_CTRL_MAX]; struct mdss_hw mdss_dsi0_hw = { @@ -104,7 +107,7 @@ void mdss_dsi_ctrl_init(struct device *ctrl_dev, if (ctrl->mdss_util->register_irq(ctrl->dsi_hw)) pr_err("%s: mdss_register_irq failed.\n", __func__); - pr_debug("%s: ndx=%d base=%p\n", __func__, ctrl->ndx, ctrl->ctrl_base); + pr_debug("%s: ndx=%d base=%pK\n", __func__, ctrl->ndx, ctrl->ctrl_base); init_completion(&ctrl->dma_comp); init_completion(&ctrl->mdp_comp); @@ -601,7 +604,7 @@ static inline bool mdss_dsi_poll_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) if (readl_poll_timeout(((ctrl->ctrl_base) + 0x00a8), clk, (clk & 0x0010), - 10, 1000)) { + 100, 20000)) { pr_err("%s: ndx=%d clk lane NOT stopped, clk=%x\n", __func__, ctrl->ndx, clk); @@ -641,6 +644,7 @@ static void mdss_dsi_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) mdss_dsi_stop_hs_clk_lane(ctrl); mutex_lock(&ctrl->clk_lane_mutex); + MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt, current->pid, XLOG_FUNC_ENTRY); mdss_dsi_clk_ctrl(ctrl, ctrl->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_ON); if (ctrl->clk_lane_cnt) { @@ -656,6 +660,7 @@ static void mdss_dsi_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) ctrl->ndx, ctrl->clk_lane_cnt); mdss_dsi_clk_ctrl(ctrl, ctrl->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt, current->pid, XLOG_FUNC_EXIT); mutex_unlock(&ctrl->clk_lane_mutex); } @@ -663,6 +668,10 @@ static void mdss_dsi_start_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) * mdss_dsi_stop_hs_clk_lane: * this function is work around solution for 8994 dsi clk lane * may stuck at HS problem + * since this function is called by event_thread, it may wakeup + * after next kickoff had been lunched and start_hs_clk_lane + * had been started. Therefore more than 1 vsync polling time is needed. + * Use 50ms timeout to cover 30 FPS case. */ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) { @@ -670,6 +679,8 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) u32 lane = 0; mutex_lock(&ctrl->clk_lane_mutex); + MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt, current->pid, + XLOG_FUNC_ENTRY); if (ctrl->clk_lane_cnt == 0) /* stopped already */ goto release; @@ -679,7 +690,7 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) if (readl_poll_timeout(((ctrl->ctrl_base) + 0x000c), fifo, ((fifo & 0x11110000) == 0x11110000), - 10, 1000)) { + 100, 50000)) { pr_err("%s: fifo NOT empty, fifo=%x\n", __func__, fifo); goto end; @@ -689,7 +700,7 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) if (readl_poll_timeout(((ctrl->ctrl_base) + 0x00a8), lane, ((lane & 0x000f) == 0x000f), - 100, 2000)) { + 100, 20000)) { pr_err("%s: datalane NOT stopped, lane=%x\n", __func__, lane); } @@ -706,6 +717,8 @@ static void mdss_dsi_stop_hs_clk_lane(struct mdss_dsi_ctrl_pdata *ctrl) mdss_dsi_clk_ctrl(ctrl, ctrl->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); + MDSS_XLOG(ctrl->ndx, ctrl->clk_lane_cnt, + current->pid, XLOG_FUNC_EXIT); mutex_unlock(&ctrl->clk_lane_mutex); } @@ -746,6 +759,8 @@ static void mdss_dsi_ctl_phy_reset(struct mdss_dsi_ctrl_pdata *ctrl, u32 event) u32 data0, data1, mask = 0, data_lane_en = 0; struct mdss_dsi_ctrl_pdata *ctrl0, *ctrl1; u32 ln0, ln1, ln_ctrl0, ln_ctrl1, i; + int rc = 0; + /* * Add 2 ms delay suggested by HW team. * Check clk lane stop state after every 200 us @@ -767,9 +782,15 @@ static void mdss_dsi_ctl_phy_reset(struct mdss_dsi_ctrl_pdata *ctrl, u32 event) ctrl0 = mdss_dsi_get_ctrl_by_index(DSI_CTRL_0); ctrl1 = mdss_dsi_get_ctrl_by_index(DSI_CTRL_1); - if (ctrl0->recovery) - ctrl0->recovery->fxn(ctrl0->recovery->data, + if (ctrl0->recovery) { + rc = ctrl0->recovery->fxn(ctrl0->recovery->data, MDP_INTF_DSI_VIDEO_FIFO_OVERFLOW); + if (rc < 0) { + pr_debug("%s: Target is in suspend/shutdown\n", + __func__); + return; + } + } /* * Disable PHY contention detection and receive. * Configure the strength ctrl 1 register. @@ -859,9 +880,15 @@ static void mdss_dsi_ctl_phy_reset(struct mdss_dsi_ctrl_pdata *ctrl, u32 event) */ udelay(200); } else { - if (ctrl->recovery) - ctrl->recovery->fxn(ctrl->recovery->data, + if (ctrl->recovery) { + rc = ctrl->recovery->fxn(ctrl->recovery->data, MDP_INTF_DSI_VIDEO_FIFO_OVERFLOW); + if (rc < 0) { + pr_debug("%s: Target is in suspend/shutdown\n", + __func__); + return; + } + } /* Disable PHY contention detection and receive */ MIPI_OUTP((ctrl->phy_io.base) + 0x0188, 0); @@ -1410,6 +1437,7 @@ int mdss_dsi_bta_status_check(struct mdss_dsi_ctrl_pdata *ctrl_pdata) { int ret = 0; unsigned long flag; + int ignore_underflow = 0; if (ctrl_pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); @@ -1424,6 +1452,9 @@ int mdss_dsi_bta_status_check(struct mdss_dsi_ctrl_pdata *ctrl_pdata) mutex_lock(&ctrl_pdata->cmd_mutex); + if (ctrl_pdata->panel_mode == DSI_VIDEO_MODE) + ignore_underflow = 1; + pr_debug("%s: Checking BTA status\n", __func__); mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, @@ -1432,6 +1463,9 @@ int mdss_dsi_bta_status_check(struct mdss_dsi_ctrl_pdata *ctrl_pdata) reinit_completion(&ctrl_pdata->bta_comp); mdss_dsi_enable_irq(ctrl_pdata, DSI_BTA_TERM); spin_unlock_irqrestore(&ctrl_pdata->mdp_lock, flag); + /* mask out overflow errors */ + if (ignore_underflow) + mdss_dsi_set_reg(ctrl_pdata, 0x10c, 0x0f0000, 0x0f0000); MIPI_OUTP(ctrl_pdata->ctrl_base + 0x098, 0x01); /* trigger */ wmb(); @@ -1442,6 +1476,13 @@ int mdss_dsi_bta_status_check(struct mdss_dsi_ctrl_pdata *ctrl_pdata) pr_err("%s: DSI BTA error: %i\n", __func__, ret); } + if (ignore_underflow) { + /* clear pending overflow status */ + mdss_dsi_set_reg(ctrl_pdata, 0xc, 0xffffffff, 0x44440000); + /* restore overflow isr */ + mdss_dsi_set_reg(ctrl_pdata, 0x10c, 0x0f0000, 0); + } + mdss_dsi_clk_ctrl(ctrl_pdata, ctrl_pdata->dsi_clk_handle, MDSS_DSI_ALL_CLKS, MDSS_DSI_CLK_OFF); pr_debug("%s: BTA done with ret: %d\n", __func__, ret); @@ -2061,8 +2102,8 @@ static int mdss_dsi_cmd_dma_tx(struct mdss_dsi_ctrl_pdata *ctrl, status = reg_val & DSI_INTR_CMD_DMA_DONE; if (status) { reg_val &= DSI_INTR_MASK_ALL; - /* clear CMD DMA isr only */ - reg_val |= DSI_INTR_CMD_DMA_DONE; + /* clear CMD DMA and BTA_DONE isr only */ + reg_val |= (DSI_INTR_CMD_DMA_DONE | DSI_INTR_BTA_DONE); MIPI_OUTP(ctrl->ctrl_base + 0x0110, reg_val); mdss_dsi_disable_irq_nosync(ctrl, DSI_CMD_TERM); complete(&ctrl->dma_comp); @@ -2306,16 +2347,21 @@ void mdss_dsi_wait4video_done(struct mdss_dsi_ctrl_pdata *ctrl) /* DSI_INTL_CTRL */ data = MIPI_INP((ctrl->ctrl_base) + 0x0110); + /* clear previous VIDEO_DONE interrupt first */ data &= DSI_INTR_TOTAL_MASK; - data |= DSI_INTR_VIDEO_DONE_MASK; - - MIPI_OUTP((ctrl->ctrl_base) + 0x0110, data); + MIPI_OUTP((ctrl->ctrl_base) + 0x0110, (data | DSI_INTR_VIDEO_DONE)); + wmb(); /* make sure write happened */ spin_lock_irqsave(&ctrl->mdp_lock, flag); reinit_completion(&ctrl->video_comp); mdss_dsi_enable_irq(ctrl, DSI_VIDEO_TERM); spin_unlock_irqrestore(&ctrl->mdp_lock, flag); + /* set interrupt enable bit for VIDEO_DONE */ + data |= DSI_INTR_VIDEO_DONE_MASK; + MIPI_OUTP((ctrl->ctrl_base) + 0x0110, data); + wmb(); /* make sure write happened */ + wait_for_completion_timeout(&ctrl->video_comp, msecs_to_jiffies(VSYNC_PERIOD * 4)); @@ -2328,14 +2374,25 @@ void mdss_dsi_wait4video_done(struct mdss_dsi_ctrl_pdata *ctrl) static int mdss_dsi_wait4video_eng_busy(struct mdss_dsi_ctrl_pdata *ctrl) { int ret = 0; + u32 v_total = 0, v_blank = 0, sleep_ms = 0, fps = 0; + struct mdss_panel_info *pinfo = &ctrl->panel_data.panel_info; if (ctrl->panel_mode == DSI_CMD_MODE) return ret; if (ctrl->ctrl_state & CTRL_STATE_MDP_ACTIVE) { mdss_dsi_wait4video_done(ctrl); - /* delay 4 ms to skip BLLP */ - usleep_range(4000, 4000); + v_total = mdss_panel_get_vtotal(pinfo); + v_blank = pinfo->lcdc.v_back_porch + pinfo->lcdc.v_pulse_width; + if (pinfo->dynamic_fps && pinfo->current_fps) + fps = pinfo->current_fps; + else + fps = pinfo->mipi.frame_rate; + + sleep_ms = CEIL((v_blank * 1000), (v_total * fps)); + /* delay sleep_ms to skip BLLP */ + if (sleep_ms) + usleep_range((sleep_ms * 1000), (sleep_ms * 1000) + 10); ret = 1; } @@ -2969,6 +3026,13 @@ static bool mdss_dsi_fifo_status(struct mdss_dsi_ctrl_pdata *ctrl) pr_err("%s: status=%x\n", __func__, status); + /* + * if DSI FIFO overflow is masked, + * do not report overflow error + */ + if (MIPI_INP(base + 0x10c) & 0xf0000) + status = status & 0xaaaaffff; + if (status & 0x44440000) {/* DLNx_HS_FIFO_OVERFLOW */ dsi_send_events(ctrl, DSI_EV_DLNx_FIFO_OVERFLOW, 0); /* Ignore FIFO EMPTY when overflow happens */ @@ -3047,7 +3111,7 @@ static void __dsi_error_counter(struct dsi_err_container *err_container) pr_err("%s: panic in WQ as dsi error intrs within:%dms\n", __func__, err_container->err_time_delta); MDSS_XLOG_TOUT_HANDLER_WQ("mdp", "dsi0_ctrl", "dsi0_phy", - "dsi1_ctrl", "dsi1_phy", "panic"); + "dsi1_ctrl", "dsi1_phy"); } } diff --git a/drivers/video/msm/mdss/mdss_dsi_panel.c b/drivers/video/msm/mdss/mdss_dsi_panel.c index 6f75aa5a2ea5b..fee8519e79d6f 100644 --- a/drivers/video/msm/mdss/mdss_dsi_panel.c +++ b/drivers/video/msm/mdss/mdss_dsi_panel.c @@ -1,4 +1,5 @@ /* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -25,6 +26,7 @@ #include "mdss_dsi.h" #include "mdss_dba_utils.h" +#include #define DT_CMD_HDR 6 #define MIN_REFRESH_RATE 48 @@ -32,6 +34,9 @@ #define VSYNC_DELAY msecs_to_jiffies(17) +extern char Lcm_name[HARDWARE_MAX_ITEM_LONGTH]; +extern bool is_Lcm_Present; + DEFINE_LED_TRIGGER(bl_led_trigger); void mdss_dsi_panel_pwm_cfg(struct mdss_dsi_ctrl_pdata *ctrl) @@ -94,7 +99,6 @@ static void mdss_dsi_panel_bklt_pwm(struct mdss_dsi_ctrl_pdata *ctrl, int level) pr_debug("%s: bklt_ctrl=%d pwm_period=%d pwm_gpio=%d pwm_lpg_chan=%d\n", __func__, ctrl->bklt_ctrl, ctrl->pwm_period, ctrl->pwm_pmic_gpio, ctrl->pwm_lpg_chan); - pr_debug("%s: ndx=%d level=%d duty=%d\n", __func__, ctrl->ndx, level, duty); @@ -270,11 +274,13 @@ static int mdss_dsi_request_gpios(struct mdss_dsi_ctrl_pdata *ctrl_pdata) return rc; } +extern int tp_gesture_onoff; int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) { struct mdss_dsi_ctrl_pdata *ctrl_pdata = NULL; struct mdss_panel_info *pinfo = NULL; int i, rc = 0; + unsigned long timeout = jiffies; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); @@ -285,6 +291,7 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) panel_data); pinfo = &(ctrl_pdata->panel_data.panel_info); + if ((mdss_dsi_is_right_ctrl(ctrl_pdata) && mdss_dsi_is_hw_config_split(ctrl_pdata->shared_data)) || pinfo->is_dba_panel) { @@ -381,11 +388,17 @@ int mdss_dsi_panel_reset(struct mdss_panel_data *pdata, int enable) gpio_set_value((ctrl_pdata->disp_en_gpio), 0); gpio_free(ctrl_pdata->disp_en_gpio); } - gpio_set_value((ctrl_pdata->rst_gpio), 0); + + if (((tp_gesture_onoff) || (pinfo->pwr_off_rst_pull_high)) && pinfo->panel_dead == 0) + gpio_set_value((ctrl_pdata->rst_gpio), 1); + else + gpio_set_value((ctrl_pdata->rst_gpio), 0); gpio_free(ctrl_pdata->rst_gpio); if (gpio_is_valid(ctrl_pdata->mode_gpio)) gpio_free(ctrl_pdata->mode_gpio); } + pr_info("%s: mdss_dsi_panel_reset time=%ums \n", __func__, + jiffies_to_msecs(jiffies-timeout)); exit: return rc; @@ -708,6 +721,7 @@ static int mdss_dsi_panel_on(struct mdss_panel_data *pdata) struct mdss_panel_info *pinfo; struct dsi_panel_cmds *on_cmds; int ret = 0; + unsigned long timeout = jiffies; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); @@ -734,14 +748,54 @@ static int mdss_dsi_panel_on(struct mdss_panel_data *pdata) pr_debug("%s: ndx=%d cmd_cnt=%d\n", __func__, ctrl->ndx, on_cmds->cmd_cnt); + + if (ctrl->eyemode == true && (!strcmp(Lcm_name, "nt35521s_HD720p_video_EBBG_c3a"))) { + if (on_cmds->cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, on_cmds, CMD_REQ_COMMIT); + if (ctrl->dispparam_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->dispparam_cmds, CMD_REQ_COMMIT); + } else{ + if (ctrl->init_last) { + if (ctrl->eyemode == true) { + if (ctrl->dispparam_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->dispparam_cmds, CMD_REQ_COMMIT); + } else{ + if (ctrl->gamma_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->gamma_cmds, CMD_REQ_COMMIT); + if (ctrl->ce_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->ce_cmds, CMD_REQ_COMMIT); + } + } + if (on_cmds->cmd_cnt) mdss_dsi_panel_cmds_send(ctrl, on_cmds, CMD_REQ_COMMIT); + if (pinfo->cabcmode) { + if (ctrl->cabc_on_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->cabc_on_cmds, CMD_REQ_COMMIT); + } + + if (!ctrl->init_last) { + if (ctrl->eyemode == true) { + if (ctrl->dispparam_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->dispparam_cmds, CMD_REQ_COMMIT); + } else{ + if (ctrl->gamma_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->gamma_cmds, CMD_REQ_COMMIT); + if (ctrl->ce_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->ce_cmds, CMD_REQ_COMMIT); + } + } + } if (pinfo->compression_mode == COMPRESSION_DSC) mdss_dsi_panel_dsc_pps_send(ctrl, pinfo); if (ctrl->ds_registered) mdss_dba_utils_video_on(pinfo->dba_data, pinfo); + + pr_info("%s: mdss_dsi_panel_on time=%ums \n", __func__, + jiffies_to_msecs(jiffies-timeout)); + end: pr_debug("%s:-\n", __func__); return ret; @@ -762,7 +816,7 @@ static int mdss_dsi_post_panel_on(struct mdss_panel_data *pdata) ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); - pr_debug("%s: ctrl=%p ndx=%d\n", __func__, ctrl, ctrl->ndx); + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); pinfo = &pdata->panel_info; if (pinfo->dcs_cmd_by_left && ctrl->ndx != DSI_CTRL_LEFT) @@ -790,6 +844,7 @@ static int mdss_dsi_panel_off(struct mdss_panel_data *pdata) { struct mdss_dsi_ctrl_pdata *ctrl = NULL; struct mdss_panel_info *pinfo; + unsigned long timeout = jiffies; if (pdata == NULL) { pr_err("%s: Invalid input data\n", __func__); @@ -800,7 +855,7 @@ static int mdss_dsi_panel_off(struct mdss_panel_data *pdata) ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); - pr_debug("%s: ctrl=%p ndx=%d\n", __func__, ctrl, ctrl->ndx); + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); if (pinfo->dcs_cmd_by_left) { if (ctrl->ndx != DSI_CTRL_LEFT) @@ -814,6 +869,8 @@ static int mdss_dsi_panel_off(struct mdss_panel_data *pdata) mdss_dba_utils_video_off(pinfo->dba_data); mdss_dba_utils_hdcp_enable(pinfo->dba_data, false); } + pr_info("%s: mdss_dsi_panel_off time=%ums \n", __func__, + jiffies_to_msecs(jiffies-timeout)); end: pr_debug("%s:-\n", __func__); @@ -835,7 +892,7 @@ static int mdss_dsi_panel_low_power_config(struct mdss_panel_data *pdata, ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, panel_data); - pr_debug("%s: ctrl=%p ndx=%d enable=%d\n", __func__, ctrl, ctrl->ndx, + pr_debug("%s: ctrl=%pK ndx=%d enable=%d\n", __func__, ctrl, ctrl->ndx, enable); /* Any panel specific low power commands/config */ @@ -844,6 +901,97 @@ static int mdss_dsi_panel_low_power_config(struct mdss_panel_data *pdata, return 0; } +int mdss_dsi_panel_gamma(struct mdss_panel_data *pdata) +{ + struct mipi_panel_info *mipi; + struct mdss_dsi_ctrl_pdata *ctrl = NULL; + + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + + ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mipi = &pdata->panel_info.mipi; + + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); + + if (ctrl->gamma_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->gamma_cmds, CMD_REQ_COMMIT); + + pr_debug("%s:-\n", __func__); + return 0; +} +int mdss_dsi_panel_ce(struct mdss_panel_data *pdata) +{ + struct mipi_panel_info *mipi; + struct mdss_dsi_ctrl_pdata *ctrl = NULL; + + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + + ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mipi = &pdata->panel_info.mipi; + + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); + + if (ctrl->ce_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->ce_cmds, CMD_REQ_COMMIT); + + pr_debug("%s:-\n", __func__); + return 0; +} + +int mdss_dsi_panel_dispparam(struct mdss_panel_data *pdata) +{ + struct mipi_panel_info *mipi; + struct mdss_dsi_ctrl_pdata *ctrl = NULL; + + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + + ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mipi = &pdata->panel_info.mipi; + + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); + + if (ctrl->dispparam_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->dispparam_cmds, CMD_REQ_COMMIT); + + pr_debug("%s:-\n", __func__); + return 0; +} + +int mdss_dsi_panel_cabc(struct mdss_panel_data *pdata) +{ + struct mipi_panel_info *mipi; + struct mdss_dsi_ctrl_pdata *ctrl = NULL; + + if (pdata == NULL) { + pr_err("%s: Invalid input data\n", __func__); + return -EINVAL; + } + + ctrl = container_of(pdata, struct mdss_dsi_ctrl_pdata, + panel_data); + mipi = &pdata->panel_info.mipi; + + pr_debug("%s: ctrl=%pK ndx=%d\n", __func__, ctrl, ctrl->ndx); + + if (ctrl->cabc_cmds.cmd_cnt) + mdss_dsi_panel_cmds_send(ctrl, &ctrl->cabc_cmds, CMD_REQ_COMMIT); + + pr_debug("%s:-\n", __func__); + return 0; +} + static void mdss_dsi_parse_trigger(struct device_node *np, char *trigger, char *trigger_key) { @@ -892,7 +1040,8 @@ static int mdss_dsi_parse_dcs_cmds(struct device_node *np, while (len >= sizeof(*dchdr)) { dchdr = (struct dsi_ctrl_hdr *)bp; dchdr->dlen = ntohs(dchdr->dlen); - if (dchdr->dlen > len) { + + if (dchdr->dlen > len || dchdr->dlen < 0) { pr_err("%s: dtsi cmd=%x error, len=%d", __func__, dchdr->dtype, dchdr->dlen); goto exit_free; @@ -1115,6 +1264,58 @@ void mdss_dsi_panel_dsc_pps_send(struct mdss_dsi_ctrl_pdata *ctrl, mdss_dsi_panel_cmds_send(ctrl, &pcmds, CMD_REQ_COMMIT); } +static int mdss_dsi_parse_hdr_settings(struct device_node *np, + struct mdss_panel_info *pinfo) +{ + int rc = 0; + struct mdss_panel_hdr_properties *hdr_prop; + + if (!np) { + pr_err("%s: device node pointer is NULL\n", __func__); + return -EINVAL; + } + + if (!pinfo) { + pr_err("%s: panel info is NULL\n", __func__); + return -EINVAL; + } + + hdr_prop = &pinfo->hdr_properties; + hdr_prop->hdr_enabled = of_property_read_bool(np, + "qcom,mdss-dsi-panel-hdr-enabled"); + + if (hdr_prop->hdr_enabled) { + rc = of_property_read_u32_array(np, + "qcom,mdss-dsi-panel-hdr-color-primaries", + hdr_prop->display_primaries, + DISPLAY_PRIMARIES_COUNT); + if (rc) { + pr_info("%s:%d, Unable to read color primaries,rc:%u", + __func__, __LINE__, + hdr_prop->hdr_enabled = false); + } + + rc = of_property_read_u32(np, + "qcom,mdss-dsi-panel-peak-brightness", + &(hdr_prop->peak_brightness)); + if (rc) { + pr_info("%s:%d, Unable to read hdr brightness, rc:%u", + __func__, __LINE__, rc); + hdr_prop->hdr_enabled = false; + } + + rc = of_property_read_u32(np, + "qcom,mdss-dsi-panel-blackness-level", + &(hdr_prop->blackness_level)); + if (rc) { + pr_info("%s:%d, Unable to read hdr brightness, rc:%u", + __func__, __LINE__, rc); + hdr_prop->hdr_enabled = false; + } + } + return 0; +} + static int mdss_dsi_parse_dsc_version(struct device_node *np, struct mdss_panel_timing *timing) { @@ -1441,7 +1642,7 @@ static int mdss_dsi_parse_reset_seq(struct device_node *np, } return 0; } - +extern int panel_dead2tp; static bool mdss_dsi_cmp_panel_reg_v2(struct mdss_dsi_ctrl_pdata *ctrl) { int i, j; @@ -1455,9 +1656,18 @@ static bool mdss_dsi_cmp_panel_reg_v2(struct mdss_dsi_ctrl_pdata *ctrl) for (j = 0; j < ctrl->groups; ++j) { for (i = 0; i < len; ++i) { - if (ctrl->return_buf[i] != - ctrl->status_value[group + i]) + if (ctrl->return_buf[i] != ctrl->status_value[group + i]) { + pr_info("%s: LCD ESD check fail, return_buf[%d]=0x%02x , status_value=[%d]=0x%02x \n", __func__, + i, ctrl->return_buf[i], group + i, ctrl->status_value[group + i]); break; + } + #ifdef CONFIG_D1_ROSY + + if (panel_dead2tp) { + pr_info("%s: LCD ESD check fail, panel_dead2tp is %d\n ", __func__, panel_dead2tp); + break; + } + #endif } if (i == len) @@ -1672,7 +1882,8 @@ static void mdss_dsi_parse_esd_params(struct device_node *np, pinfo->esd_check_enabled = of_property_read_bool(np, "qcom,esd-check-enabled"); - if (!pinfo->esd_check_enabled) + + if ((!pinfo->esd_check_enabled) || (!is_Lcm_Present)) return; ctrl->status_mode = ESD_MAX; @@ -2191,7 +2402,7 @@ static int mdss_dsi_panel_timing_from_dt(struct device_node *np, if (np->name) { pt->timing.name = kstrdup(np->name, GFP_KERNEL); - pr_info("%s: found new timing \"%s\" (%p)\n", __func__, + pr_info("%s: found new timing \"%s\" (%pK)\n", __func__, np->name, &pt->timing); } @@ -2308,6 +2519,21 @@ static int mdss_panel_parse_display_timings(struct device_node *np, return rc; } + +void mdss_dsi_parse_eye_command(struct device_node *np, struct mdss_dsi_ctrl_pdata *ctrl_pdata) +{ + int i = 0; + char cmd_key[] = "qcom,mdss-dsi-panel-eye-command01"; + int cmd_len = strlen(cmd_key); + for (i = 1; i <= ctrl_pdata->eye_cmds_num; i++) { + cmd_key[cmd_len-1] = i%10 + '0'; + cmd_key[cmd_len-2] = i/10 + '0'; + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->eye_cmds[i-1], + cmd_key, "qcom,mdss-dsi-panel-gamma-command-state"); + } +} + static int mdss_panel_parse_dt(struct device_node *np, struct mdss_dsi_ctrl_pdata *ctrl_pdata) { @@ -2376,6 +2602,9 @@ static int mdss_panel_parse_dt(struct device_node *np, rc = of_property_read_u32(np, "qcom,mdss-brightness-max-level", &tmp); pinfo->brightness_max = (!rc ? tmp : MDSS_MAX_BL_BRIGHTNESS); + #if defined(WT_COMPILE_FACTORY_VERSION) && defined(CONFIG_D1_ROSY) + pinfo->brightness_max = 255; + #endif rc = of_property_read_u32(np, "qcom,mdss-dsi-bl-min-level", &tmp); pinfo->bl_min = (!rc ? tmp : 0); rc = of_property_read_u32(np, "qcom,mdss-dsi-bl-max-level", &tmp); @@ -2460,6 +2689,9 @@ static int mdss_panel_parse_dt(struct device_node *np, "qcom,mdss-dsi-lane-3-state"); rc = mdss_panel_parse_display_timings(np, &ctrl_pdata->panel_data); + if (rc) + return rc; + rc = mdss_dsi_parse_hdr_settings(np, pinfo); if (rc) return rc; @@ -2501,9 +2733,44 @@ static int mdss_panel_parse_dt(struct device_node *np, mdss_dsi_parse_reset_seq(np, pinfo->rst_seq, &(pinfo->rst_seq_len), "qcom,mdss-dsi-reset-sequence"); + + rc = of_property_read_u32(np, "qcom,mdss-dsi-pwr-off-rst-pull-high", &tmp); + pinfo->pwr_off_rst_pull_high = (!rc ? tmp : 0); + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->off_cmds, "qcom,mdss-dsi-off-command", "qcom,mdss-dsi-off-command-state"); + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->warm_cmds, + "qcom,mdss-dsi-panel-warm-command", "qcom,mdss-dsi-panel-gamma-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->cool_cmds, + "qcom,mdss-dsi-panel-cool-command", "qcom,mdss-dsi-panel-gamma-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->nature_cmds, + "qcom,mdss-dsi-panel-nature-command", "qcom,mdss-dsi-panel-gamma-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->standard_cmds, + "qcom,mdss-dsi-panel-ce-std-command", "qcom,mdss-dsi-panel-ce-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->vivid_cmds, + "qcom,mdss-dsi-panel-ce-vivid-command", "qcom,mdss-dsi-panel-ce-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->bright_cmds, + "qcom,mdss-dsi-panel-ce-bright-command", "qcom,mdss-dsi-panel-ce-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->cabc_on_cmds, + "qcom,mdss-dsi-panel-cabc-on-command", "qcom,mdss-dsi-panel-cabc-command-state"); + + mdss_dsi_parse_dcs_cmds(np, &ctrl_pdata->cabc_off_cmds, + "qcom,mdss-dsi-panel-cabc-off-command", "qcom,mdss-dsi-panel-cabc-command-state"); + + rc = of_property_read_u32(np, "qcom,mdss-dsi-panel-eye-command-num", &tmp); + ctrl_pdata->eye_cmds_num = (!rc ? tmp : 0); + + mdss_dsi_parse_eye_command(np, ctrl_pdata); + + ctrl_pdata->init_last = of_property_read_bool(np, "qcom,mdss-dsi-init-last"); + rc = of_property_read_u32(np, "qcom,adjust-timer-wakeup-ms", &tmp); pinfo->adjust_timer_delay_ms = (!rc ? tmp : 0); @@ -2527,7 +2794,7 @@ static int mdss_panel_parse_dt(struct device_node *np, bridge_chip_name = of_get_property(np, "qcom,bridge-name", &len); if (!bridge_chip_name || len <= 0) { - pr_err("%s:%d Unable to read qcom,bridge_name, data=%p,len=%d\n", + pr_err("%s:%d Unable to read qcom,bridge_name, data=%pK,len=%d\n", __func__, __LINE__, bridge_chip_name, len); rc = -EINVAL; goto error; @@ -2566,7 +2833,13 @@ int mdss_dsi_panel_init(struct device_node *node, } else { pr_info("%s: Panel Name = %s\n", __func__, panel_name); strlcpy(&pinfo->panel_name[0], panel_name, MDSS_MAX_PANEL_LEN); + /*add for hardware info*/ + strcpy(Lcm_name, panel_name); } + + if (!is_Lcm_Present) + strcpy(Lcm_name, ""); + rc = mdss_panel_parse_dt(node, ctrl_pdata); if (rc) { pr_err("%s:%d panel dt parse failed\n", __func__, __LINE__); @@ -2581,7 +2854,9 @@ int mdss_dsi_panel_init(struct device_node *node, ctrl_pdata->post_panel_on = mdss_dsi_post_panel_on; ctrl_pdata->off = mdss_dsi_panel_off; ctrl_pdata->low_power_config = mdss_dsi_panel_low_power_config; - ctrl_pdata->panel_data.set_backlight = mdss_dsi_panel_bl_ctrl; + if (is_Lcm_Present) { + ctrl_pdata->panel_data.set_backlight = mdss_dsi_panel_bl_ctrl; + } ctrl_pdata->switch_mode = mdss_dsi_panel_switch_mode; return 0; diff --git a/drivers/video/msm/mdss/mdss_dsi_status.c b/drivers/video/msm/mdss/mdss_dsi_status.c index bf545ae311f2c..5459cb1ec756f 100644 --- a/drivers/video/msm/mdss/mdss_dsi_status.c +++ b/drivers/video/msm/mdss/mdss_dsi_status.c @@ -30,7 +30,7 @@ #include "mdss_panel.h" #include "mdss_mdp.h" -#define STATUS_CHECK_INTERVAL_MS 5000 +#define STATUS_CHECK_INTERVAL_MS 2000 #define STATUS_CHECK_INTERVAL_MIN_MS 50 #define DSI_STATUS_CHECK_INIT -1 #define DSI_STATUS_CHECK_DISABLE 1 diff --git a/drivers/video/msm/mdss/mdss_fb.c b/drivers/video/msm/mdss/mdss_fb.c index a5ad5b6baf3ca..d3f99836c4afa 100644 --- a/drivers/video/msm/mdss/mdss_fb.c +++ b/drivers/video/msm/mdss/mdss_fb.c @@ -2,7 +2,8 @@ * Core MDSS framebuffer driver. * * Copyright (C) 2007 Google Incorporated - * Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2008-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -48,12 +49,16 @@ #include #include #include + +#include +#include #include "mdss_fb.h" #include "mdss_mdp_splash_logo.h" #define CREATE_TRACE_POINTS #include "mdss_debug.h" #include "mdss_smmu.h" #include "mdss_mdp.h" +#include "mdss_dsi.h" #ifdef CONFIG_FB_MSM_TRIPLE_BUFFER #define MDSS_FB_NUM 3 @@ -115,6 +120,36 @@ static int mdss_fb_send_panel_event(struct msm_fb_data_type *mfd, int event, void *arg); static void mdss_fb_set_mdp_sync_pt_threshold(struct msm_fb_data_type *mfd, int type); + +#define WAIT_RESUME_TIMEOUT 200 +static struct fb_info *prim_fbi; +static struct delayed_work prim_panel_work; +static atomic_t prim_panel_is_on; +static struct wake_lock prim_panel_wakelock; +static void prim_panel_off_delayed_work(struct work_struct *work) +{ +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_lock(); +#endif + if (!lock_fb_info(prim_fbi)) { +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_unlock(); +#endif + return; + } + + if (atomic_read(&prim_panel_is_on)) { + fb_blank(prim_fbi, FB_BLANK_POWERDOWN); + atomic_set(&prim_panel_is_on, false); + wake_unlock(&prim_panel_wakelock); + } + + unlock_fb_info(prim_fbi); +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_unlock(); +#endif +} + void mdss_fb_no_update_notify_timer_cb(unsigned long data) { struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)data; @@ -257,11 +292,21 @@ static int mdss_fb_notify_update(struct msm_fb_data_type *mfd, static int lcd_backlight_registered; +#define WINGTECH_MDSS_BRIGHT_TO_BL(out, v, bl_min, bl_max, min_bright, max_bright) do {\ + if (v <= ((int)min_bright*(int)bl_max-(int)bl_min*(int)max_bright)\ + /((int)bl_max - (int)bl_min)) out = 1; \ + else \ + out = (((int)bl_max - (int)bl_min)*v + \ + ((int)max_bright*(int)bl_min - (int)min_bright*(int)bl_max)) \ + /((int)max_bright - (int)min_bright); \ + } while (0) static void mdss_fb_set_bl_brightness(struct led_classdev *led_cdev, enum led_brightness value) { struct msm_fb_data_type *mfd = dev_get_drvdata(led_cdev->dev->parent); - int bl_lvl; + int bl_lvl, brightness_min; + + brightness_min = 10; if (mfd->boot_notification_led) { led_trigger_event(mfd->boot_notification_led, 0); @@ -271,13 +316,16 @@ static void mdss_fb_set_bl_brightness(struct led_classdev *led_cdev, if (value > mfd->panel_info->brightness_max) value = mfd->panel_info->brightness_max; - /* This maps android backlight level 0 to 255 into - driver backlight level 0 to bl_max with rounding */ - MDSS_BRIGHT_TO_BL(bl_lvl, value, mfd->panel_info->bl_max, - mfd->panel_info->brightness_max); + if (mfd->panel_info->bl_min == 1) + mfd->panel_info->bl_min = 5; + WINGTECH_MDSS_BRIGHT_TO_BL(bl_lvl, value, mfd->panel_info->bl_min, mfd->panel_info->bl_max, + brightness_min, mfd->panel_info->brightness_max); + if (bl_lvl && !value) + bl_lvl = 0; if (!bl_lvl && value) bl_lvl = 1; + pr_debug("bl_lvl is %d, value is %d\n", bl_lvl, value); if (!IS_CALIB_MODE_BL(mfd) && (!mfd->ext_bl_ctrl || !value || !mfd->bl_level)) { @@ -550,7 +598,13 @@ static ssize_t mdss_fb_get_panel_info(struct device *dev, "min_w=%d\nmin_h=%d\nroi_merge=%d\ndyn_fps_en=%d\n" "min_fps=%d\nmax_fps=%d\npanel_name=%s\n" "primary_panel=%d\nis_pluggable=%d\ndisplay_id=%s\n" - "is_cec_supported=%d\nis_pingpong_split=%d\n", + "is_cec_supported=%d\nis_pingpong_split=%d\n" + "is_hdr_enabled=%d\n" + "peak_brightness=%d\nblackness_level=%d\n" + "white_chromaticity_x=%d\nwhite_chromaticity_y=%d\n" + "red_chromaticity_x=%d\nred_chromaticity_y=%d\n" + "green_chromaticity_x=%d\ngreen_chromaticity_y=%d\n" + "blue_chromaticity_x=%d\nblue_chromaticity_y=%d\n", pinfo->partial_update_enabled, pinfo->roi_alignment.xstart_pix_align, pinfo->roi_alignment.width_pix_align, @@ -562,7 +616,18 @@ static ssize_t mdss_fb_get_panel_info(struct device *dev, pinfo->dynamic_fps, pinfo->min_fps, pinfo->max_fps, pinfo->panel_name, pinfo->is_prim_panel, pinfo->is_pluggable, pinfo->display_id, - pinfo->is_cec_supported, is_pingpong_split(mfd)); + pinfo->is_cec_supported, is_pingpong_split(mfd), + pinfo->hdr_properties.hdr_enabled, + pinfo->hdr_properties.peak_brightness, + pinfo->hdr_properties.blackness_level, + pinfo->hdr_properties.display_primaries[0], + pinfo->hdr_properties.display_primaries[1], + pinfo->hdr_properties.display_primaries[2], + pinfo->hdr_properties.display_primaries[3], + pinfo->hdr_properties.display_primaries[4], + pinfo->hdr_properties.display_primaries[5], + pinfo->hdr_properties.display_primaries[6], + pinfo->hdr_properties.display_primaries[7]); return ret; } @@ -819,6 +884,7 @@ static void mdss_fb_shutdown(struct platform_device *pdev) struct msm_fb_data_type *mfd = platform_get_drvdata(pdev); mfd->shutdown_pending = true; + pr_err("mdss_fb_shutdown, shutdown_pending = true\n"); /* wake up threads waiting on idle or kickoff queues */ wake_up_all(&mfd->idle_wait_q); @@ -1250,6 +1316,12 @@ static int mdss_fb_remove(struct platform_device *pdev) if (!mfd) return -ENODEV; + if (mfd->panel_info && mfd->panel_info->is_prim_panel) { + atomic_set(&prim_panel_is_on, false); + cancel_delayed_work_sync(&prim_panel_work); + wake_lock_destroy(&prim_panel_wakelock); + } + mdss_fb_remove_sysfs(mfd); pm_runtime_disable(mfd->fbi->dev); @@ -1425,6 +1497,31 @@ static int mdss_fb_resume(struct platform_device *pdev) #endif #ifdef CONFIG_PM_SLEEP + +static int mdss_fb_pm_prepare(struct device *dev) +{ + struct msm_fb_data_type *mfd = dev_get_drvdata(dev); + + if (!mfd) + return -ENODEV; + if (mfd->panel_info->is_prim_panel) + atomic_inc(&mfd->resume_pending); + return 0; +} + +static void mdss_fb_pm_complete(struct device *dev) +{ + struct msm_fb_data_type *mfd = dev_get_drvdata(dev); + + if (!mfd) + return; + if (mfd->panel_info->is_prim_panel) { + atomic_set(&mfd->resume_pending, 0); + wake_up_all(&mfd->resume_wait_q); + } + return; +} + static int mdss_fb_pm_suspend(struct device *dev) { struct msm_fb_data_type *mfd = dev_get_drvdata(dev); @@ -1459,6 +1556,9 @@ static int mdss_fb_pm_resume(struct device *dev) #endif static const struct dev_pm_ops mdss_fb_pm_ops = { + + .prepare = mdss_fb_pm_prepare, + .complete = mdss_fb_pm_complete, SET_SYSTEM_SLEEP_PM_OPS(mdss_fb_pm_suspend, mdss_fb_pm_resume) }; @@ -1590,6 +1690,7 @@ void mdss_fb_update_backlight(struct msm_fb_data_type *mfd) pdata->set_backlight(pdata, temp); mfd->bl_level_scaled = mfd->unset_bl_level; mfd->allow_bl_update = true; + pr_info("LCD backlight level=%u \n", temp); } } mutex_unlock(&mfd->bl_lock); @@ -1900,6 +2001,14 @@ static int mdss_fb_blank(int blank_mode, struct fb_info *info) struct mdss_panel_data *pdata; struct msm_fb_data_type *mfd = (struct msm_fb_data_type *)info->par; + if ((info == prim_fbi) && (blank_mode == FB_BLANK_UNBLANK) && + atomic_read(&prim_panel_is_on)) { + atomic_set(&prim_panel_is_on, false); + wake_unlock(&prim_panel_wakelock); + cancel_delayed_work_sync(&prim_panel_work); + return 0; + } + ret = mdss_fb_pan_idle(mfd); if (ret) { pr_warn("mdss_fb_pan_idle for fb%d failed. ret=%d\n", @@ -2042,7 +2151,7 @@ int mdss_fb_alloc_fb_ion_memory(struct msm_fb_data_type *mfd, size_t fb_size) rc = PTR_ERR(vaddr); goto err_unmap; } - pr_debug("alloc 0x%zuB vaddr = %p for fb%d\n", fb_size, + pr_debug("alloc 0x%zuB vaddr = %pK for fb%d\n", fb_size, vaddr, mfd->index); mfd->fbi->screen_base = (char *) vaddr; @@ -2059,6 +2168,10 @@ int mdss_fb_alloc_fb_ion_memory(struct msm_fb_data_type *mfd, size_t fb_size) dma_buf_put(mfd->fbmem_buf); fb_mmap_failed: ion_free(mfd->fb_ion_client, mfd->fb_ion_handle); + mfd->fb_attachment = NULL; + mfd->fb_table = NULL; + mfd->fb_ion_handle = NULL; + mfd->fbmem_buf = NULL; return rc; } @@ -2141,7 +2254,7 @@ static int mdss_fb_fbmem_ion_mmap(struct fb_info *info, vma->vm_page_prot = pgprot_writecombine(vma->vm_page_prot); - pr_debug("vma=%p, addr=%x len=%ld\n", + pr_debug("vma=%pK, addr=%x len=%ld\n", vma, (unsigned int)addr, len); pr_debug("vm_start=%x vm_end=%x vm_page_prot=%ld\n", (unsigned int)vma->vm_start, @@ -2308,7 +2421,7 @@ static int mdss_fb_alloc_fbmem_iommu(struct msm_fb_data_type *mfd, int dom) return -ERANGE; } - pr_debug("alloc 0x%zxB @ (%pa phys) (0x%p virt) (%pa iova) for fb%d\n", + pr_debug("alloc 0x%zxB @ (%pa phys) (0x%pK virt) (%pa iova) for fb%d\n", size, &phys, virt, &mfd->iova, mfd->index); mfd->fbi->screen_base = virt; @@ -2519,6 +2632,7 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd) atomic_set(&mfd->commits_pending, 0); atomic_set(&mfd->ioctl_ref_cnt, 0); atomic_set(&mfd->kickoff_pending, 0); + atomic_set(&mfd->resume_pending, 0); init_timer(&mfd->no_update.timer); mfd->no_update.timer.function = mdss_fb_no_update_notify_timer_cb; @@ -2534,6 +2648,7 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd) init_waitqueue_head(&mfd->idle_wait_q); init_waitqueue_head(&mfd->ioctl_q); init_waitqueue_head(&mfd->kickoff_wait_q); + init_waitqueue_head(&mfd->resume_wait_q); ret = fb_alloc_cmap(&fbi->cmap, 256, 0); if (ret) @@ -2552,6 +2667,14 @@ static int mdss_fb_register(struct msm_fb_data_type *mfd) pr_info("FrameBuffer[%d] %dx%d registered successfully!\n", mfd->index, fbi->var.xres, fbi->var.yres); + if (panel_info->is_prim_panel) { + prim_fbi = fbi; + atomic_set(&prim_panel_is_on, false); + INIT_DELAYED_WORK(&prim_panel_work, prim_panel_off_delayed_work); + wake_lock_init(&prim_panel_wakelock, WAKE_LOCK_SUSPEND, "prim_panel_wakelock"); + } + + return 0; } @@ -2596,7 +2719,7 @@ static int mdss_fb_open(struct fb_info *info, int user) } mfd->ref_cnt++; - pr_debug("mfd refcount:%d file:%p\n", mfd->ref_cnt, info->file); + pr_debug("mfd refcount:%d file:%pK\n", mfd->ref_cnt, info->file); return 0; @@ -2661,7 +2784,7 @@ static int mdss_fb_release_all(struct fb_info *info, bool release_all) pr_warn("file node not found or wrong ref cnt: release all:%d refcnt:%d\n", release_all, mfd->ref_cnt); - pr_debug("current process=%s pid=%d mfd->ref=%d file:%p\n", + pr_debug("current process=%s pid=%d mfd->ref=%d file:%pK\n", task->comm, current->tgid, mfd->ref_cnt, info->file); if (!mfd->ref_cnt || release_all) { @@ -2962,6 +3085,7 @@ static int __mdss_fb_sync_buf_done_callback(struct notifier_block *p, static int mdss_fb_pan_idle(struct msm_fb_data_type *mfd) { int ret = 0; + static int shutdown_pending_count; ret = wait_event_timeout(mfd->idle_wait_q, (!atomic_read(&mfd->commits_pending) || @@ -2975,8 +3099,14 @@ static int mdss_fb_pan_idle(struct msm_fb_data_type *mfd) "dbg_bus", "vbif_dbg_bus"); ret = -ETIMEDOUT; } else if (mfd->shutdown_pending) { - pr_debug("Shutdown signalled\n"); - ret = -ESHUTDOWN; + if (shutdown_pending_count++ < 10) { + pr_debug("Shutdown signalled\n"); + ret = -ESHUTDOWN; + } else { + pr_debug("work around for shutdown fail\n"); + shutdown_pending_count = 0; + ret = 0; + } } else { ret = 0; } @@ -3218,6 +3348,10 @@ int mdss_fb_atomic_commit(struct fb_info *info, MSMFB_ATOMIC_COMMIT, true, false); if (mfd->panel.type == WRITEBACK_PANEL) { output_layer = commit_v1->output_layer; + if (!output_layer) { + pr_err("Output layer is null\n"); + goto end; + } wb_change = !mdss_fb_is_wb_config_same(mfd, commit_v1->output_layer); if (wb_change) { @@ -4114,8 +4248,6 @@ static int mdss_fb_handle_buf_sync_ioctl(struct msm_sync_pt_data *sync_pt_data, goto buf_sync_err_2; } - sync_fence_install(rel_fence, rel_fen_fd); - ret = copy_to_user(buf_sync->rel_fen_fd, &rel_fen_fd, sizeof(int)); if (ret) { pr_err("%s: copy_to_user failed\n", sync_pt_data->fence_name); @@ -4152,8 +4284,6 @@ static int mdss_fb_handle_buf_sync_ioctl(struct msm_sync_pt_data *sync_pt_data, goto buf_sync_err_3; } - sync_fence_install(retire_fence, retire_fen_fd); - ret = copy_to_user(buf_sync->retire_fen_fd, &retire_fen_fd, sizeof(int)); if (ret) { @@ -4164,6 +4294,9 @@ static int mdss_fb_handle_buf_sync_ioctl(struct msm_sync_pt_data *sync_pt_data, goto buf_sync_err_3; } + sync_fence_install(rel_fence, rel_fen_fd); + sync_fence_install(retire_fence, retire_fen_fd); + skip_retire_fence: mutex_unlock(&sync_pt_data->sync_mutex); @@ -4550,6 +4683,15 @@ static int __ioctl_wait_idle(struct msm_fb_data_type *mfd, u32 cmd) return ret; } +static bool check_not_supported_ioctl(u32 cmd) +{ + return((cmd == MSMFB_OVERLAY_SET) || (cmd == MSMFB_OVERLAY_UNSET) || + (cmd == MSMFB_OVERLAY_GET) || (cmd == MSMFB_OVERLAY_PREPARE) || + (cmd == MSMFB_DISPLAY_COMMIT) || (cmd == MSMFB_OVERLAY_PLAY) || + (cmd == MSMFB_BUFFER_SYNC) || (cmd == MSMFB_OVERLAY_QUEUE) || + (cmd == MSMFB_NOTIFY_UPDATE)); +} + /* * mdss_fb_do_ioctl() - MDSS Framebuffer ioctl function * @info: pointer to framebuffer info @@ -4569,6 +4711,10 @@ int mdss_fb_do_ioctl(struct fb_info *info, unsigned int cmd, struct mdp_buf_sync buf_sync; unsigned int dsi_mode = 0; struct mdss_panel_data *pdata = NULL; + unsigned int Color_mode = 0; + unsigned int CE_mode = 0; + unsigned int Eye_mode = 0; + unsigned int CABC_mode = 0; if (!info || !info->par) return -EINVAL; @@ -4584,6 +4730,11 @@ int mdss_fb_do_ioctl(struct fb_info *info, unsigned int cmd, if (!pdata || pdata->panel_info.dynamic_switch_pending) return -EPERM; + if (check_not_supported_ioctl(cmd)) { + pr_err("Unsupported ioctl\n"); + return -EINVAL; + } + atomic_inc(&mfd->ioctl_ref_cnt); mdss_fb_power_setting_idle(mfd); @@ -4642,6 +4793,36 @@ int mdss_fb_do_ioctl(struct fb_info *info, unsigned int cmd, ret = mdss_fb_async_position_update_ioctl(info, argp); break; + case MSMFB_ENHANCE_SET_GAMMA: + if (copy_from_user(&Color_mode, argp, sizeof(Color_mode))) { + pr_err("%s: MSMFB_ENHANCE_SET_GAMMA ioctl failed\n", __func__); + goto exit; + } + ret = mdss_panel_set_gamma(pdata, Color_mode); + break; + + case MSMFB_ENHANCE_SET_CE: + if (copy_from_user(&CE_mode, argp, sizeof(CE_mode))) { + pr_err("%s: MSMFB_ENHANCE_SET_CE ioctl failed\n", __func__); + goto exit; + } + ret = mdss_panel_set_ce(pdata, CE_mode); + break; + case MSMFB_ENHANCE_SET_EYE: + if (copy_from_user(&Eye_mode, argp, sizeof(Eye_mode))) { + pr_err("%s: MSMFB_ENHANCE_SET_EYE ioctl failed\n", __func__); + goto exit; + } + ret = mdss_panel_set_dispparam(pdata, Eye_mode); + break; + case MSMFB_SET_CABC: + if (copy_from_user(&CABC_mode, argp, sizeof(CABC_mode))) { + pr_err("%s: MSMFB_SET_CABC ioctl failed\n", __func__); + goto exit; + } + ret = mdss_panel_set_cabc(pdata, CABC_mode); + pdata->panel_info.cabcmode = CABC_mode; + break; default: if (mfd->mdp.ioctl_handler) ret = mfd->mdp.ioctl_handler(mfd, cmd, argp); @@ -4840,6 +5021,8 @@ int mdss_fb_suspres_panel(struct device *dev, void *data) * from the panel. The function sends the PANEL_ALIVE=0 status to HAL * layer. */ +int panel_dead2tp = 0; +EXPORT_SYMBOL(panel_dead2tp); void mdss_fb_report_panel_dead(struct msm_fb_data_type *mfd) { char *envp[2] = {"PANEL_ALIVE=0", NULL}; @@ -4851,7 +5034,63 @@ void mdss_fb_report_panel_dead(struct msm_fb_data_type *mfd) } pdata->panel_info.panel_dead = true; + panel_dead2tp = pdata->panel_info.panel_dead; kobject_uevent_env(&mfd->fbi->dev->kobj, KOBJ_CHANGE, envp); pr_err("Panel has gone bad, sending uevent - %s\n", envp[0]); } + +/* + * mdss_prim_panel_fb_unblank() - Unblank primary panel FB + * @timeout : >0 blank primary panel FB after timeout (ms) + */ +int mdss_prim_panel_fb_unblank(int timeout) +{ + int ret = 0; + struct msm_fb_data_type *mfd = NULL; + + if (prim_fbi) { + mfd = (struct msm_fb_data_type *)prim_fbi->par; + ret = wait_event_timeout(mfd->resume_wait_q, + !atomic_read(&mfd->resume_pending), + msecs_to_jiffies(WAIT_RESUME_TIMEOUT)); + if (!ret) { + pr_info("Primary fb resume timeout\n"); + return -ETIMEDOUT; + } +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_lock(); +#endif + if (!lock_fb_info(prim_fbi)) { +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_unlock(); +#endif + return -ENODEV; + } + if (prim_fbi->blank == FB_BLANK_UNBLANK) { + unlock_fb_info(prim_fbi); +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_unlock(); +#endif + return 0; + } + wake_lock(&prim_panel_wakelock); + ret = fb_blank(prim_fbi, FB_BLANK_UNBLANK); + if (!ret) { + atomic_set(&prim_panel_is_on, true); + if (timeout > 0) + schedule_delayed_work(&prim_panel_work, msecs_to_jiffies(timeout)); + else + wake_unlock(&prim_panel_wakelock); + } else + wake_unlock(&prim_panel_wakelock); + unlock_fb_info(prim_fbi); +#ifdef CONFIG_FRAMEBUFFER_CONSOLE + console_unlock(); +#endif + return ret; + } + + pr_err("primary panel is not existed\n"); + return -EINVAL; +} diff --git a/drivers/video/msm/mdss/mdss_fb.h b/drivers/video/msm/mdss/mdss_fb.h index 56997e40d2443..4f5c6e37817aa 100644 --- a/drivers/video/msm/mdss/mdss_fb.h +++ b/drivers/video/msm/mdss/mdss_fb.h @@ -1,4 +1,5 @@ /* Copyright (c) 2008-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -322,6 +323,9 @@ struct msm_fb_data_type { struct task_struct *disp_thread; atomic_t commits_pending; atomic_t kickoff_pending; + + atomic_t resume_pending; + wait_queue_head_t resume_wait_q; wait_queue_head_t commit_wait_q; wait_queue_head_t idle_wait_q; wait_queue_head_t kickoff_wait_q; diff --git a/drivers/video/msm/mdss/mdss_hdmi_cec.c b/drivers/video/msm/mdss/mdss_hdmi_cec.c index a424d987bb638..a4ed01210e04c 100644 --- a/drivers/video/msm/mdss/mdss_hdmi_cec.c +++ b/drivers/video/msm/mdss/mdss_hdmi_cec.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -196,7 +196,7 @@ static void hdmi_cec_msg_recv(struct work_struct *work) msg.sender_id, msg.recvr_id, msg.frame_size); - if (msg.frame_size < 1) { + if (msg.frame_size < 1 || msg.frame_size > MAX_CEC_FRAME_SIZE) { DEV_ERR("%s: invalid message (frame length = %d)\n", __func__, msg.frame_size); return; @@ -216,7 +216,7 @@ static void hdmi_cec_msg_recv(struct work_struct *work) msg.operand[i] = data & 0xFF; } - for (; i < 14; i++) + for (; i < MAX_OPERAND_SIZE; i++) msg.operand[i] = 0; DEV_DBG("%s: opcode 0x%x, wakup_en %d, device_suspend %d\n", __func__, diff --git a/drivers/video/msm/mdss/mdss_hdmi_edid.c b/drivers/video/msm/mdss/mdss_hdmi_edid.c index 36c24302658d8..56fc9d837e651 100644 --- a/drivers/video/msm/mdss/mdss_hdmi_edid.c +++ b/drivers/video/msm/mdss/mdss_hdmi_edid.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2010-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 @@ -460,8 +460,10 @@ static ssize_t hdmi_edid_sysfs_wta_res_info(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { int rc, page_id; + u32 i = 0, j, page; ssize_t ret = strnlen(buf, PAGE_SIZE); struct hdmi_edid_ctrl *edid_ctrl = hdmi_edid_get_ctrl(dev); + struct msm_hdmi_mode_timing_info info = {0}; if (!edid_ctrl) { DEV_ERR("%s: invalid input\n", __func__); @@ -474,7 +476,22 @@ static ssize_t hdmi_edid_sysfs_wta_res_info(struct device *dev, return rc; } - edid_ctrl->page_id = page_id; + if (page_id > MSM_HDMI_INIT_RES_PAGE) { + page = MSM_HDMI_INIT_RES_PAGE; + while (page < page_id) { + j = 1; + while (sizeof(info) * j < PAGE_SIZE) { + i++; + j++; + } + page++; + } + } + + if (i < HDMI_VFRMT_MAX) + edid_ctrl->page_id = page_id; + else + DEV_ERR("%s: invalid page id\n", __func__); DEV_DBG("%s: %d\n", __func__, edid_ctrl->page_id); return ret; @@ -2180,6 +2197,13 @@ int hdmi_edid_parser(void *input) goto bail; } + /* Find out if CEA extension blocks exceeding max limit */ + if (num_of_cea_blocks >= MAX_EDID_BLOCKS) { + DEV_WARN("%s: HDMI EDID exceeded max CEA blocks limit\n", + __func__); + num_of_cea_blocks = MAX_EDID_BLOCKS - 1; + } + /* check for valid CEA block */ if (edid_buf[EDID_BLOCK_SIZE] != 2) { DEV_ERR("%s: Invalid CEA block\n", __func__); diff --git a/drivers/video/msm/mdss/mdss_hdmi_tx.c b/drivers/video/msm/mdss/mdss_hdmi_tx.c index ebf20eaba1d2d..cb5d97dfa6edb 100644 --- a/drivers/video/msm/mdss/mdss_hdmi_tx.c +++ b/drivers/video/msm/mdss/mdss_hdmi_tx.c @@ -542,7 +542,8 @@ static ssize_t hdmi_tx_sysfs_wta_edid(struct device *dev, } mutex_lock(&hdmi_ctrl->tx_lock); - if (edid_size < EDID_BLOCK_SIZE) { + if ((edid_size < EDID_BLOCK_SIZE) || + (edid_size > hdmi_ctrl->edid_buf_size)) { DEV_DBG("%s: disabling custom edid\n", __func__); ret = -EINVAL; @@ -594,6 +595,11 @@ static ssize_t hdmi_tx_sysfs_rda_edid(struct device *dev, mutex_lock(&hdmi_ctrl->tx_lock); cea_blks = hdmi_ctrl->edid_buf[EDID_BLOCK_SIZE - 2]; + if (cea_blks >= MAX_EDID_BLOCKS) { + DEV_ERR("%s: invalid cea blocks\n", __func__); + mutex_unlock(&hdmi_ctrl->tx_lock); + return -EINVAL; + } size = (cea_blks + 1) * EDID_BLOCK_SIZE; size = min_t(u32, size, PAGE_SIZE); @@ -1306,7 +1312,7 @@ static int hdmi_tx_sysfs_create(struct hdmi_tx_ctrl *hdmi_ctrl, return rc; } hdmi_ctrl->kobj = &fbi->dev->kobj; - DEV_DBG("%s: sysfs group %p\n", __func__, hdmi_ctrl->kobj); + DEV_DBG("%s: sysfs group %pK\n", __func__, hdmi_ctrl->kobj); return 0; } /* hdmi_tx_sysfs_create */ @@ -1443,6 +1449,8 @@ static void hdmi_tx_hdcp_cb_work(struct work_struct *work) return; } + mutex_lock(&hdmi_ctrl->tx_lock); + switch (hdmi_ctrl->hdcp_status) { case HDCP_STATE_AUTHENTICATED: hdmi_ctrl->auth_state = true; @@ -1464,14 +1472,15 @@ static void hdmi_tx_hdcp_cb_work(struct work_struct *work) hdmi_ctrl->auth_state = false; - if (hdmi_tx_is_encryption_set(hdmi_ctrl) || - !hdmi_tx_is_stream_shareable(hdmi_ctrl)) { - hdmi_tx_set_audio_switch_node(hdmi_ctrl, 0); - rc = hdmi_tx_config_avmute(hdmi_ctrl, true); - } - if (hdmi_tx_is_panel_on(hdmi_ctrl)) { DEV_DBG("%s: Reauthenticating\n", __func__); + + if (hdmi_tx_is_encryption_set(hdmi_ctrl) || + !hdmi_tx_is_stream_shareable(hdmi_ctrl)) { + hdmi_tx_set_audio_switch_node(hdmi_ctrl, 0); + rc = hdmi_tx_config_avmute(hdmi_ctrl, true); + } + rc = hdmi_ctrl->hdcp_ops->hdmi_hdcp_reauthenticate( hdmi_ctrl->hdcp_data); if (rc) @@ -1508,6 +1517,8 @@ static void hdmi_tx_hdcp_cb_work(struct work_struct *work) break; /* do nothing */ } + + mutex_unlock(&hdmi_ctrl->tx_lock); } static u32 hdmi_tx_ddc_read(struct hdmi_tx_ddc_ctrl *ddc_ctrl, @@ -3410,8 +3421,6 @@ static int hdmi_tx_hdcp_off(struct hdmi_tx_ctrl *hdmi_ctrl) hdmi_ctrl->hdcp_ops->hdmi_hdcp_off( hdmi_ctrl->hdcp_data); - flush_delayed_work(&hdmi_ctrl->hdcp_cb_work); - hdmi_ctrl->hdcp_ops = NULL; rc = hdmi_tx_enable_power(hdmi_ctrl, HDMI_TX_DDC_PM, @@ -3858,7 +3867,7 @@ static int hdmi_tx_init_resource(struct hdmi_tx_ctrl *hdmi_ctrl) DEV_DBG("%s: '%s' remap failed or not available\n", __func__, hdmi_tx_io_name(i)); } - DEV_INFO("%s: '%s': start = 0x%p, len=0x%x\n", __func__, + DEV_INFO("%s: '%s': start = 0x%pK, len=0x%x\n", __func__, hdmi_tx_io_name(i), pdata->io[i].base, pdata->io[i].len); } @@ -4361,7 +4370,7 @@ static int hdmi_tx_get_dt_data(struct platform_device *pdev, data = of_get_property(pdev->dev.of_node, "qcom,display-id", &len); if (!data || len <= 0) - pr_err("%s:%d Unable to read qcom,display-id, data=%p,len=%d\n", + pr_err("%s:%d Unable to read qcom,display-id, data=%pK,len=%d\n", __func__, __LINE__, data, len); else snprintf(hdmi_ctrl->panel_data.panel_info.display_id, diff --git a/drivers/video/msm/mdss/mdss_mdp.c b/drivers/video/msm/mdss/mdss_mdp.c index ec4259ed6bdb3..c85ec6f6c96e2 100644 --- a/drivers/video/msm/mdss/mdss_mdp.c +++ b/drivers/video/msm/mdss/mdss_mdp.c @@ -599,7 +599,7 @@ struct reg_bus_client *mdss_reg_bus_vote_client_create(char *client_name) strlcpy(client->name, client_name, MAX_CLIENT_NAME_LEN); client->usecase_ndx = VOTE_INDEX_DISABLE; client->id = id; - pr_debug("bus vote client %s created:%p id :%d\n", client_name, + pr_debug("bus vote client %s created:%pK id :%d\n", client_name, client, id); id++; list_add(&client->list, &mdss_res->reg_bus_clist); @@ -613,7 +613,7 @@ void mdss_reg_bus_vote_client_destroy(struct reg_bus_client *client) if (!client) { pr_err("reg bus vote: invalid client handle\n"); } else { - pr_debug("bus vote client %s destroyed:%p id:%u\n", + pr_debug("bus vote client %s destroyed:%pK id:%u\n", client->name, client, client->id); mutex_lock(&mdss_res->reg_bus_lock); list_del_init(&client->list); @@ -1796,6 +1796,7 @@ static void mdss_mdp_hw_rev_caps_init(struct mdss_data_type *mdata) mdss_mdp_init_default_prefill_factors(mdata); mdss_set_quirk(mdata, MDSS_QUIRK_DSC_RIGHT_ONLY_PU); mdss_set_quirk(mdata, MDSS_QUIRK_DSC_2SLICE_PU_THRPUT); + mdss_set_quirk(mdata, MDSS_QUIRK_HDR_SUPPORT_ENABLED); break; case MDSS_MDP_HW_REV_105: case MDSS_MDP_HW_REV_109: @@ -1980,7 +1981,7 @@ static u32 mdss_mdp_res_init(struct mdss_data_type *mdata) mdata->iclient = msm_ion_client_create(mdata->pdev->name); if (IS_ERR_OR_NULL(mdata->iclient)) { - pr_err("msm_ion_client_create() return error (%p)\n", + pr_err("msm_ion_client_create() return error (%pK)\n", mdata->iclient); mdata->iclient = NULL; } @@ -2401,6 +2402,8 @@ ssize_t mdss_mdp_show_capabilities(struct device *dev, SPRINT(" dest_scaler"); if (mdata->has_separate_rotator) SPRINT(" separate_rotator"); + if (mdss_has_quirk(mdata, MDSS_QUIRK_HDR_SUPPORT_ENABLED)) + SPRINT(" hdr"); SPRINT("\n"); #undef SPRINT @@ -2592,7 +2595,7 @@ static int mdss_mdp_probe(struct platform_device *pdev) if (rc) pr_debug("unable to map MDSS VBIF non-realtime base\n"); else - pr_debug("MDSS VBIF NRT HW Base addr=%p len=0x%x\n", + pr_debug("MDSS VBIF NRT HW Base addr=%pK len=0x%x\n", mdata->vbif_nrt_io.base, mdata->vbif_nrt_io.len); res = platform_get_resource(pdev, IORESOURCE_IRQ, 0); @@ -3414,7 +3417,7 @@ static int mdss_mdp_cdm_addr_setup(struct mdss_data_type *mdata, atomic_set(&head[i].kref.refcount, 0); mutex_init(&head[i].lock); init_completion(&head[i].free_comp); - pr_debug("%s: cdm off (%d) = %p\n", __func__, i, head[i].base); + pr_debug("%s: cdm off (%d) = %pK\n", __func__, i, head[i].base); } mdata->cdm_off = head; @@ -3481,7 +3484,7 @@ static int mdss_mdp_dsc_addr_setup(struct mdss_data_type *mdata, for (i = 0; i < len; i++) { head[i].num = i; head[i].base = (mdata->mdss_io.base) + dsc_offsets[i]; - pr_debug("dsc off (%d) = %p\n", i, head[i].base); + pr_debug("dsc off (%d) = %pK\n", i, head[i].base); } mdata->dsc_off = head; @@ -4788,7 +4791,8 @@ static void mdss_mdp_footswitch_ctrl(struct mdss_data_type *mdata, int on) } } -int mdss_mdp_secure_display_ctrl(unsigned int enable) +int mdss_mdp_secure_display_ctrl(struct mdss_data_type *mdata, + unsigned int enable) { struct sd_ctrl_req { unsigned int enable; @@ -4797,6 +4801,12 @@ int mdss_mdp_secure_display_ctrl(unsigned int enable) int ret = 0; struct scm_desc desc; + if ((enable && (mdss_get_sd_client_cnt() > 0)) || + (!enable && (mdss_get_sd_client_cnt() > 1))) { + mdss_update_sd_client(mdata, enable); + return ret; + } + desc.args[0] = request.enable = enable; desc.arginfo = SCM_ARGS(1); @@ -4814,6 +4824,7 @@ int mdss_mdp_secure_display_ctrl(unsigned int enable) if (ret) return ret; + mdss_update_sd_client(mdata, enable); return resp; } diff --git a/drivers/video/msm/mdss/mdss_mdp.h b/drivers/video/msm/mdss/mdss_mdp.h index 98eed0a6b7bc0..5767fd07a2e8b 100644 --- a/drivers/video/msm/mdss/mdss_mdp.h +++ b/drivers/video/msm/mdss/mdss_mdp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2012-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 @@ -114,6 +114,12 @@ enum mdss_mdp_mixer_mux { MDSS_MDP_MIXER_MUX_RIGHT, }; +enum mdss_sd_transition { + SD_TRANSITION_NONE, + SD_TRANSITION_SECURE_TO_NON_SECURE, + SD_TRANSITION_NON_SECURE_TO_SECURE +}; + static inline enum mdss_mdp_sspp_index get_pipe_num_from_ndx(u32 ndx) { u32 id; @@ -189,9 +195,13 @@ enum mdss_mdp_csc_type { MDSS_MDP_CSC_YUV2RGB_601L, MDSS_MDP_CSC_YUV2RGB_601FR, MDSS_MDP_CSC_YUV2RGB_709L, + MDSS_MDP_CSC_YUV2RGB_2020L, + MDSS_MDP_CSC_YUV2RGB_2020FR, MDSS_MDP_CSC_RGB2YUV_601L, MDSS_MDP_CSC_RGB2YUV_601FR, MDSS_MDP_CSC_RGB2YUV_709L, + MDSS_MDP_CSC_RGB2YUV_2020L, + MDSS_MDP_CSC_RGB2YUV_2020FR, MDSS_MDP_CSC_YUV2YUV, MDSS_MDP_CSC_RGB2RGB, MDSS_MDP_MAX_CSC @@ -823,6 +833,8 @@ struct mdss_overlay_private { u32 ad_bl_events; bool allow_kickoff; + + u8 sd_transition_state; }; struct mdss_mdp_set_ot_params { @@ -1119,7 +1131,7 @@ static inline struct clk *mdss_mdp_get_clk(u32 clk_idx) } static inline void mdss_update_sd_client(struct mdss_data_type *mdata, - bool status) + unsigned int status) { if (status) atomic_inc(&mdata->sd_client_count); @@ -1131,12 +1143,21 @@ static inline int mdss_mdp_get_wb_ctl_support(struct mdss_data_type *mdata, bool rotator_session) { /* - * Initial control paths are used for primary and external - * interfaces and remaining control paths are used for WB - * interfaces. + * Any control path can be routed to any of the hardware datapaths. + * But there is a HW restriction for 3D Mux block. As the 3D Mux + * settings in the CTL registers are double buffered, if an interface + * uses it and disconnects, then the subsequent interface which gets + * connected should use the same control path in order to clear the + * 3D MUX settings. + * To handle this restriction, we are allowing WB also, to loop through + * all the avialable control paths, so that it can reuse the control + * path left by the external interface, thereby clearing the 3D Mux + * settings. + * The initial control paths can be used by Primary, External and WB. + * The rotator can use the remaining available control paths. */ return rotator_session ? (mdata->nctl - mdata->nmixers_wb) : - (mdata->nctl - mdata->nwb); + MDSS_MDP_CTL0; } static inline bool mdss_mdp_is_nrt_vbif_client(struct mdss_data_type *mdata, @@ -1256,6 +1277,10 @@ static inline uint8_t pp_vig_csc_pipe_val(struct mdss_mdp_pipe *pipe) return MDSS_MDP_CSC_YUV2RGB_601L; case MDP_CSC_ITU_R_601_FR: return MDSS_MDP_CSC_YUV2RGB_601FR; + case MDP_CSC_ITU_R_2020: + return MDSS_MDP_CSC_YUV2RGB_2020L; + case MDP_CSC_ITU_R_2020_FR: + return MDSS_MDP_CSC_YUV2RGB_2020FR; case MDP_CSC_ITU_R_709: default: return MDSS_MDP_CSC_YUV2RGB_709L; @@ -1409,7 +1434,8 @@ unsigned long mdss_mdp_get_clk_rate(u32 clk_idx, bool locked); int mdss_mdp_vsync_clk_enable(int enable, bool locked); void mdss_mdp_clk_ctrl(int enable); struct mdss_data_type *mdss_mdp_get_mdata(void); -int mdss_mdp_secure_display_ctrl(unsigned int enable); +int mdss_mdp_secure_display_ctrl(struct mdss_data_type *mdata, + unsigned int enable); int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd); int mdss_mdp_dfps_update_params(struct msm_fb_data_type *mfd, @@ -1583,7 +1609,8 @@ int mdss_mdp_argc_config(struct msm_fb_data_type *mfd, int mdss_mdp_hist_lut_config(struct msm_fb_data_type *mfd, struct mdp_hist_lut_data *config, u32 *copyback); int mdss_mdp_pp_default_overlay_config(struct msm_fb_data_type *mfd, - struct mdss_panel_data *pdata); + struct mdss_panel_data *pdata, + bool enable); int mdss_mdp_dither_config(struct msm_fb_data_type *mfd, struct mdp_dither_cfg_data *config, u32 *copyback, int copy_from_kernel); diff --git a/drivers/video/msm/mdss/mdss_mdp_ctl.c b/drivers/video/msm/mdss/mdss_mdp_ctl.c index b7f6da0a68384..ae46dd2141740 100644 --- a/drivers/video/msm/mdss/mdss_mdp_ctl.c +++ b/drivers/video/msm/mdss/mdss_mdp_ctl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -73,8 +73,18 @@ static void __mdss_mdp_mixer_write_cfg(struct mdss_mdp_mixer *mixer, static inline u64 fudge_factor(u64 val, u32 numer, u32 denom) { - u64 result = (val * (u64)numer); - do_div(result, denom); + u64 result = val; + + if (val) { + u64 temp = -1UL; + + do_div(temp, val); + if (temp > numer) { + /* no overflow, so we can do the operation*/ + result = (val * (u64)numer); + do_div(result, denom); + } + } return result; } @@ -702,6 +712,7 @@ int mdss_mdp_get_panel_params(struct mdss_mdp_pipe *pipe, *v_total = mixer->height; *xres = mixer->width; *h_total = mixer->width; + *fps = DEFAULT_FRAME_RATE; } return 0; @@ -713,7 +724,8 @@ int mdss_mdp_get_pipe_overlap_bw(struct mdss_mdp_pipe *pipe, struct mdss_data_type *mdata = mdss_mdp_get_mdata(); struct mdss_mdp_mixer *mixer = pipe->mixer_left; struct mdss_rect src, dst; - u32 v_total, fps, h_total, xres, src_h; + u32 v_total = 0, h_total = 0, xres = 0, src_h = 0; + u32 fps = DEFAULT_FRAME_RATE; *quota = 0; *quota_nocr = 0; @@ -3495,57 +3507,58 @@ int mdss_mdp_ctl_setup(struct mdss_mdp_ctl *ctl) ctl->mixer_left->valid_roi = true; ctl->mixer_left->roi_changed = true; - rc = mdss_mdp_pp_default_overlay_config(ctl->mfd, ctl->panel_data); - /* - * Ignore failure of PP config, ctl set-up can succeed. - */ - if (rc) { - pr_err("failed to set the pp config rc %dfb %d\n", rc, - ctl->mfd->index); - rc = 0; - } - if (ctl->mfd->split_mode == MDP_DUAL_LM_DUAL_DISPLAY) { pr_debug("dual display detected\n"); - return 0; - } - - if (split_fb) - width = ctl->mfd->split_fb_right; + } else { + if (split_fb) + width = ctl->mfd->split_fb_right; - if (width < ctl->width) { - if (ctl->mixer_right == NULL) { - ctl->mixer_right = mdss_mdp_mixer_alloc(ctl, + if (width < ctl->width) { + if (ctl->mixer_right == NULL) { + ctl->mixer_right = mdss_mdp_mixer_alloc(ctl, MDSS_MDP_MIXER_TYPE_INTF, true, 0); - if (!ctl->mixer_right) { - pr_err("unable to allocate right mixer\n"); - if (ctl->mixer_left) - mdss_mdp_mixer_free(ctl->mixer_left); - return -ENOMEM; + if (!ctl->mixer_right) { + pr_err("unable to allocate right mixer\n"); + if (ctl->mixer_left) + mdss_mdp_mixer_free( + ctl->mixer_left); + return -ENOMEM; + } } - } - ctl->mixer_right->is_right_mixer = true; - ctl->mixer_right->width = width; - ctl->mixer_right->height = height; - ctl->mixer_right->roi = (struct mdss_rect) + ctl->mixer_right->is_right_mixer = true; + ctl->mixer_right->width = width; + ctl->mixer_right->height = height; + ctl->mixer_right->roi = (struct mdss_rect) {0, 0, width, height}; - ctl->mixer_right->valid_roi = true; - ctl->mixer_right->roi_changed = true; - } else if (ctl->mixer_right) { - ctl->mixer_right->valid_roi = false; - ctl->mixer_right->roi_changed = false; - mdss_mdp_mixer_free(ctl->mixer_right); - ctl->mixer_right = NULL; - } + ctl->mixer_right->valid_roi = true; + ctl->mixer_right->roi_changed = true; + } else if (ctl->mixer_right) { + ctl->mixer_right->valid_roi = false; + ctl->mixer_right->roi_changed = false; + mdss_mdp_mixer_free(ctl->mixer_right); + ctl->mixer_right = NULL; + } - if (ctl->mixer_right) { - if (!is_dsc_compression(pinfo) || - (pinfo->dsc_enc_total == 1)) - ctl->opmode |= MDSS_MDP_CTL_OP_PACK_3D_ENABLE | + if (ctl->mixer_right) { + if (!is_dsc_compression(pinfo) || + (pinfo->dsc_enc_total == 1)) + ctl->opmode |= MDSS_MDP_CTL_OP_PACK_3D_ENABLE | MDSS_MDP_CTL_OP_PACK_3D_H_ROW_INT; - } else { - ctl->opmode &= ~(MDSS_MDP_CTL_OP_PACK_3D_ENABLE | + } else { + ctl->opmode &= ~(MDSS_MDP_CTL_OP_PACK_3D_ENABLE | MDSS_MDP_CTL_OP_PACK_3D_H_ROW_INT); + } + } + + rc = mdss_mdp_pp_default_overlay_config(ctl->mfd, ctl->panel_data, + true); + /* + * Ignore failure of PP config, ctl set-up can succeed. + */ + if (rc) { + pr_err("failed to set the pp config rc %dfb %d\n", rc, + ctl->mfd->index); + rc = 0; } return 0; } @@ -3906,6 +3919,9 @@ int mdss_mdp_ctl_destroy(struct mdss_mdp_ctl *ctl) CTL_INTF_EVENT_FLAG_DEFAULT); WARN(rc, "unable to close panel for intf=%d\n", ctl->intf_num); + (void) mdss_mdp_pp_default_overlay_config(ctl->mfd, ctl->panel_data, + false); + sctl = mdss_mdp_get_split_ctl(ctl); if (sctl) { pr_debug("destroying split display ctl=%d\n", sctl->num); diff --git a/drivers/video/msm/mdss/mdss_mdp_debug.c b/drivers/video/msm/mdss/mdss_mdp_debug.c index 25702b54f91ae..7e0fd0f497009 100644 --- a/drivers/video/msm/mdss/mdss_mdp_debug.c +++ b/drivers/video/msm/mdss/mdss_mdp_debug.c @@ -988,7 +988,7 @@ void mdss_mdp_debug_mid(u32 mid) len = get_dump_range(&xlog_node->offset, blk_base->max_offset); addr = blk_base->base + xlog_node->offset.start; - pr_info("%s: mid:%d range_base=0x%p start=0x%x end=0x%x\n", + pr_info("%s: mid:%d range_base=0x%pK start=0x%x end=0x%x\n", xlog_node->range_name, mid, addr, xlog_node->offset.start, xlog_node->offset.end); diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c index d2205ff6cce20..fed428a797cad 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_cmd.c @@ -1025,7 +1025,7 @@ static int mdss_mdp_cmd_wait4readptr(struct mdss_mdp_cmd_ctx *ctx) return rc; } -static void mdss_mdp_cmd_intf_callback(void *data, int event) +static int mdss_mdp_cmd_intf_callback(void *data, int event) { struct mdss_mdp_cmd_ctx *ctx = data; struct mdss_mdp_pp_tear_check *te = NULL; @@ -1034,11 +1034,11 @@ static void mdss_mdp_cmd_intf_callback(void *data, int event) if (!data) { pr_err("%s: invalid ctx\n", __func__); - return; + return -EINVAL; } if (!ctx->ctl) - return; + return -EINVAL; switch (event) { case MDP_INTF_CALLBACK_DSI_WAIT: @@ -1050,7 +1050,7 @@ static void mdss_mdp_cmd_intf_callback(void *data, int event) * just return */ if (ctx->intf_stopped || !is_pingpong_split(ctx->ctl->mfd)) - return; + return -EINVAL; atomic_inc(&ctx->rdptr_cnt); /* enable clks and rd_ptr interrupt */ @@ -1059,7 +1059,7 @@ static void mdss_mdp_cmd_intf_callback(void *data, int event) mixer = mdss_mdp_mixer_get(ctx->ctl, MDSS_MDP_MIXER_MUX_LEFT); if (!mixer) { pr_err("%s: null mixer\n", __func__); - return; + return -EINVAL; } /* wait for read pointer */ @@ -1083,6 +1083,7 @@ static void mdss_mdp_cmd_intf_callback(void *data, int event) pr_debug("%s: unhandled event=%d\n", __func__, event); break; } + return 0; } static void mdss_mdp_cmd_lineptr_done(void *arg) @@ -1108,7 +1109,7 @@ static void mdss_mdp_cmd_lineptr_done(void *arg) spin_unlock(&ctx->clk_lock); } -static void mdss_mdp_cmd_intf_recovery(void *data, int event) +static int mdss_mdp_cmd_intf_recovery(void *data, int event) { struct mdss_mdp_cmd_ctx *ctx = data; unsigned long flags; @@ -1116,11 +1117,11 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event) if (!data) { pr_err("%s: invalid ctx\n", __func__); - return; + return -EINVAL; } if (!ctx->ctl) - return; + return -EINVAL; /* * Currently, only intf_fifo_underflow is @@ -1130,7 +1131,7 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event) if (event != MDP_INTF_DSI_CMD_FIFO_UNDERFLOW) { pr_warn("%s: unsupported recovery event:%d\n", __func__, event); - return; + return -EPERM; } if (atomic_read(&ctx->koff_cnt)) { @@ -1154,6 +1155,7 @@ static void mdss_mdp_cmd_intf_recovery(void *data, int event) if (notify_frame_timeout) mdss_mdp_ctl_notify(ctx->ctl, MDP_NOTIFY_FRAME_TIMEOUT); + return 0; } static void mdss_mdp_cmd_pingpong_done(void *arg) @@ -1886,7 +1888,7 @@ static int mdss_mdp_cmd_wait4pingpong(struct mdss_mdp_ctl *ctl, void *arg) MDSS_XLOG(ctl->num, atomic_read(&ctx->koff_cnt), ctl->roi_bkup.w, ctl->roi_bkup.h); - pr_debug("%s: intf_num=%d ctx=%p koff_cnt=%d\n", __func__, + pr_debug("%s: intf_num=%d ctx=%pK koff_cnt=%d\n", __func__, ctl->intf_num, ctx, atomic_read(&ctx->koff_cnt)); rc = wait_event_timeout(ctx->pp_waitq, @@ -2122,7 +2124,7 @@ int mdss_mdp_cmd_set_autorefresh_mode(struct mdss_mdp_ctl *mctl, int frame_cnt) struct mdss_panel_info *pinfo; if (!mctl || !mctl->is_master || !mctl->panel_data) { - pr_err("invalid ctl mctl:%p pdata:%p\n", + pr_err("invalid ctl mctl:%pK pdata:%pK\n", mctl, mctl ? mctl->panel_data : 0); return -ENODEV; } @@ -2177,6 +2179,7 @@ int mdss_mdp_cmd_set_autorefresh_mode(struct mdss_mdp_ctl *mctl, int frame_cnt) */ ctx->autorefresh_state = MDP_AUTOREFRESH_ON_REQUESTED; ctx->autorefresh_frame_cnt = frame_cnt; + mctl->mdata->serialize_wait4pp = true; /* Cancel GATE Work Item */ if (cancel_work_sync(&ctx->gate_clk_work)) @@ -2190,8 +2193,10 @@ int mdss_mdp_cmd_set_autorefresh_mode(struct mdss_mdp_ctl *mctl, int frame_cnt) if (frame_cnt == 0) { ctx->autorefresh_state = MDP_AUTOREFRESH_OFF; ctx->autorefresh_frame_cnt = 0; + mctl->mdata->serialize_wait4pp = false; } else { ctx->autorefresh_frame_cnt = frame_cnt; + mctl->mdata->serialize_wait4pp = true; } break; case MDP_AUTOREFRESH_ON: @@ -2203,6 +2208,7 @@ int mdss_mdp_cmd_set_autorefresh_mode(struct mdss_mdp_ctl *mctl, int frame_cnt) ctx->autorefresh_state = MDP_AUTOREFRESH_OFF_REQUESTED; } else { ctx->autorefresh_frame_cnt = frame_cnt; + mctl->mdata->serialize_wait4pp = true; } break; case MDP_AUTOREFRESH_OFF_REQUESTED: @@ -2212,6 +2218,7 @@ int mdss_mdp_cmd_set_autorefresh_mode(struct mdss_mdp_ctl *mctl, int frame_cnt) pr_debug("cancelling autorefresh off request\n"); ctx->autorefresh_state = MDP_AUTOREFRESH_ON; ctx->autorefresh_frame_cnt = frame_cnt; + mctl->mdata->serialize_wait4pp = true; } break; default: @@ -2322,7 +2329,7 @@ static void mdss_mdp_cmd_wait4_autorefresh_pp(struct mdss_mdp_ctl *ctl) MDSS_XLOG(ctl->num, line_out, ctl->mixer_left->roi.h); - if (line_out < ctl->mixer_left->roi.h) { + if ((line_out < ctl->mixer_left->roi.h) && line_out) { reinit_completion(&ctx->autorefresh_ppdone); /* enable ping pong done */ @@ -2574,6 +2581,7 @@ static int mdss_mdp_disable_autorefresh(struct mdss_mdp_ctl *ctl, mdss_mdp_pingpong_write(pp_base, MDSS_MDP_REG_PP_SYNC_CONFIG_VSYNC, cfg); + ctl->mdata->serialize_wait4pp = false; return 0; } @@ -2866,6 +2874,8 @@ int mdss_mdp_cmd_ctx_stop(struct mdss_mdp_ctl *ctl, ctx->default_pp_num, NULL, NULL); memset(ctx, 0, sizeof(*ctx)); + /* intf stopped, no more kickoff */ + ctx->intf_stopped = 1; return 0; } @@ -3008,7 +3018,11 @@ int mdss_mdp_cmd_stop(struct mdss_mdp_ctl *ctl, int panel_power_state) ctx->intf_stopped = 0; if (sctx) sctx->intf_stopped = 0; - + /* + * Tearcheck was disabled while entering LP2 state. + * Enable it back to allow updates in LP1 state. + */ + mdss_mdp_tearcheck_enable(ctl, true); goto end; } } @@ -3189,7 +3203,7 @@ static int mdss_mdp_cmd_ctx_setup(struct mdss_mdp_ctl *ctl, ctx->intf_stopped = 0; - pr_debug("%s: ctx=%p num=%d aux=%d\n", __func__, ctx, + pr_debug("%s: ctx=%pK num=%d aux=%d\n", __func__, ctx, default_pp_num, aux_pp_num); MDSS_XLOG(ctl->num, atomic_read(&ctx->koff_cnt)); diff --git a/drivers/video/msm/mdss/mdss_mdp_intf_video.c b/drivers/video/msm/mdss/mdss_mdp_intf_video.c index b9988f6ce2646..082ac4f5d4ca7 100644 --- a/drivers/video/msm/mdss/mdss_mdp_intf_video.c +++ b/drivers/video/msm/mdss/mdss_mdp_intf_video.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -297,7 +297,7 @@ int mdss_mdp_video_addr_setup(struct mdss_data_type *mdata, for (i = 0; i < count; i++) { head[i].base = mdata->mdss_io.base + offsets[i]; - pr_debug("adding Video Intf #%d offset=0x%x virt=%p\n", i, + pr_debug("adding Video Intf #%d offset=0x%x virt=%pK\n", i, offsets[i], head[i].base); head[i].ref_cnt = 0; head[i].intf_num = i + MDSS_MDP_INTF0; @@ -310,7 +310,7 @@ int mdss_mdp_video_addr_setup(struct mdss_data_type *mdata, return 0; } -static void mdss_mdp_video_intf_recovery(void *data, int event) +static int mdss_mdp_video_intf_recovery(void *data, int event) { struct mdss_mdp_video_ctx *ctx; struct mdss_mdp_ctl *ctl = data; @@ -322,7 +322,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) if (!data) { pr_err("%s: invalid ctl\n", __func__); - return; + return -EINVAL; } /* @@ -333,7 +333,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) if (event != MDP_INTF_DSI_VIDEO_FIFO_OVERFLOW) { pr_warn("%s: unsupported recovery event:%d\n", __func__, event); - return; + return -EPERM; } ctx = ctl->intf_ctx[MASTER_CTX]; @@ -348,7 +348,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) clk_rate = DIV_ROUND_UP_ULL(clk_rate, 1000); /* in kHz */ if (!clk_rate) { pr_err("Unable to get proper clk_rate\n"); - return; + return -EINVAL; } /* * calculate clk_period as pico second to maintain good @@ -358,7 +358,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) clk_period = DIV_ROUND_UP_ULL(1000000000, clk_rate); if (!clk_period) { pr_err("Unable to calculate clock period\n"); - return; + return -EINVAL; } min_ln_cnt = pinfo->lcdc.v_back_porch + pinfo->lcdc.v_pulse_width; active_lns_cnt = pinfo->yres; @@ -384,7 +384,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) !ctx->timegen_en) { pr_warn("Target is in suspend or shutdown pending\n"); mutex_unlock(&ctl->offlock); - return; + return -EPERM; } line_cnt = mdss_mdp_video_line_count(ctl); @@ -394,7 +394,7 @@ static void mdss_mdp_video_intf_recovery(void *data, int event) pr_debug("%s, Needed lines left line_cnt=%d\n", __func__, line_cnt); mutex_unlock(&ctl->offlock); - return; + return 0; } else { pr_warn("line count is less. line_cnt = %d\n", line_cnt); @@ -880,7 +880,7 @@ static int mdss_mdp_video_intfs_stop(struct mdss_mdp_ctl *ctl, pr_err("Intf %d not in use\n", (inum + MDSS_MDP_INTF0)); return -ENODEV; } - pr_debug("stop ctl=%d video Intf #%d base=%p", ctl->num, ctx->intf_num, + pr_debug("stop ctl=%d video Intf #%d base=%pK", ctl->num, ctx->intf_num, ctx->base); ret = mdss_mdp_video_ctx_stop(ctl, pinfo, ctx); @@ -898,7 +898,7 @@ static int mdss_mdp_video_intfs_stop(struct mdss_mdp_ctl *ctl, pr_err("Intf %d not in use\n", (inum + MDSS_MDP_INTF0)); return -ENODEV; } - pr_debug("stop ctl=%d video Intf #%d base=%p", ctl->num, + pr_debug("stop ctl=%d video Intf #%d base=%pK", ctl->num, sctx->intf_num, sctx->base); ret = mdss_mdp_video_ctx_stop(ctl, pinfo, sctx); @@ -1750,8 +1750,9 @@ static void mdss_mdp_handoff_programmable_fetch(struct mdss_mdp_ctl *ctl, MDSS_MDP_REG_INTF_HSYNC_CTL) >> 16; v_total_handoff = mdp_video_read(ctx, MDSS_MDP_REG_INTF_VSYNC_PERIOD_F0)/h_total_handoff; - pinfo->prg_fet = v_total_handoff - - ((fetch_start_handoff - 1)/h_total_handoff); + if (h_total_handoff) + pinfo->prg_fet = v_total_handoff - + ((fetch_start_handoff - 1)/h_total_handoff); pr_debug("programmable fetch lines %d start:%d\n", pinfo->prg_fet, fetch_start_handoff); MDSS_XLOG(pinfo->prg_fet, fetch_start_handoff, @@ -1925,7 +1926,7 @@ static int mdss_mdp_video_intfs_setup(struct mdss_mdp_ctl *ctl, (inum + MDSS_MDP_INTF0)); return -EBUSY; } - pr_debug("video Intf #%d base=%p", ctx->intf_num, ctx->base); + pr_debug("video Intf #%d base=%pK", ctx->intf_num, ctx->base); ctx->ref_cnt++; } else { pr_err("Invalid intf number: %d\n", (inum + MDSS_MDP_INTF0)); @@ -1958,7 +1959,7 @@ static int mdss_mdp_video_intfs_setup(struct mdss_mdp_ctl *ctl, (inum + MDSS_MDP_INTF0)); return -EBUSY; } - pr_debug("video Intf #%d base=%p", ctx->intf_num, ctx->base); + pr_debug("video Intf #%d base=%pK", ctx->intf_num, ctx->base); ctx->ref_cnt++; ctl->intf_ctx[SLAVE_CTX] = ctx; @@ -2109,10 +2110,21 @@ static int mdss_mdp_video_early_wake_up(struct mdss_mdp_ctl *ctl) * lot of latency rendering the input events useless in preventing the * idle time out. */ - if (ctl->mfd->idle_state == MDSS_FB_IDLE_TIMER_RUNNING) { - if (ctl->mfd->idle_time) + if ((ctl->mfd->idle_state == MDSS_FB_IDLE_TIMER_RUNNING) || + (ctl->mfd->idle_state == MDSS_FB_IDLE)) { + /* + * Modify the idle time so that an idle fallback can be + * triggered for those cases, where we have no update + * despite of a touch event and idle time is 0. + */ + if (!ctl->mfd->idle_time) { + ctl->mfd->idle_time = 70; + schedule_delayed_work(&ctl->mfd->idle_notify_work, + msecs_to_jiffies(200)); + } else { mod_delayed_work(system_wq, &ctl->mfd->idle_notify_work, msecs_to_jiffies(ctl->mfd->idle_time)); + } pr_debug("Delayed idle time\n"); } else { pr_debug("Nothing to done for this state (%d)\n", diff --git a/drivers/video/msm/mdss/mdss_mdp_layer.c b/drivers/video/msm/mdss/mdss_mdp_layer.c index 989905444e652..28bd7129a9ff5 100644 --- a/drivers/video/msm/mdss/mdss_mdp_layer.c +++ b/drivers/video/msm/mdss/mdss_mdp_layer.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -467,6 +467,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, int ret = 0; u32 left_lm_w = left_lm_w_from_mfd(mfd); u32 flags; + bool is_right_blend = false; struct mdss_mdp_mixer *mixer = NULL; struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); @@ -476,7 +477,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, mixer = mdss_mdp_mixer_get(mdp5_data->ctl, mixer_mux); pipe->src_fmt = mdss_mdp_get_format_params(layer->buffer.format); if (!pipe->src_fmt || !mixer) { - pr_err("invalid layer format:%d or mixer:%p\n", + pr_err("invalid layer format:%d or mixer:%pK\n", layer->buffer.format, pipe->mixer_left); ret = -EINVAL; goto end; @@ -574,6 +575,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, * staging, same pipe will be stagged on both layer mixers. */ if (mdata->has_src_split) { + is_right_blend = pipe->is_right_blend; if (left_blend_pipe) { if (pipe->priority <= left_blend_pipe->priority) { pr_err("priority limitation. left:%d right%d\n", @@ -583,7 +585,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, goto end; } else { pr_debug("pipe%d is a right_pipe\n", pipe->num); - pipe->is_right_blend = true; + is_right_blend = true; } } else if (pipe->is_right_blend) { /* @@ -592,7 +594,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, */ mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_right); - pipe->is_right_blend = false; + is_right_blend = false; } if (is_split_lm(mfd) && __layer_needs_src_split(layer)) { @@ -618,6 +620,7 @@ static int __configure_pipe_params(struct msm_fb_data_type *mfd, } pipe->src_split_req = false; } + pipe->is_right_blend = is_right_blend; } pipe->multirect.mode = vinfo->multirect.mode; @@ -1107,6 +1110,40 @@ static struct mdss_mdp_pipe *__assign_pipe_for_layer( return pipe; } +/* + * __is_sd_state_valid() - validate secure display state + * + * This function checks if the current state of secrure display is valid, + * based on the new settings. + * For command mode panels, the sd state would be invalid if a non secure pipe + * comes and one of the below condition is met: + * 1) Secure Display is enabled for current client, and there is other + secure client. + * 2) Secure Display is disabled for current client, and there is other + secure client. + * 3) Secure pipes are already staged for the current client. + * For other panels, the sd state would be invalid if a non secure pipe comes + * and one of the below condition is met: + * 1) Secure Display is enabled for current or other client. + * 2) Secure pipes are already staged for the current client. + * + */ +static inline bool __is_sd_state_valid(uint32_t sd_pipes, uint32_t nonsd_pipes, + int panel_type, u32 sd_enabled) +{ + if (panel_type == MIPI_CMD_PANEL) { + if ((((mdss_get_sd_client_cnt() > 1) && sd_enabled) || + (mdss_get_sd_client_cnt() && !sd_enabled) || + sd_pipes) + && nonsd_pipes) + return false; + } else { + if ((sd_pipes || mdss_get_sd_client_cnt()) && nonsd_pipes) + return false; + } + return true; +} + /* * __validate_secure_display() - validate secure display * @@ -1119,6 +1156,8 @@ static int __validate_secure_display(struct mdss_overlay_private *mdp5_data) { struct mdss_mdp_pipe *pipe, *tmp; uint32_t sd_pipes = 0, nonsd_pipes = 0; + int panel_type = mdp5_data->ctl->panel_data->panel_info.type; + int ret = 0; mutex_lock(&mdp5_data->list_lock); list_for_each_entry_safe(pipe, tmp, &mdp5_data->pipes_used, list) { @@ -1132,14 +1171,21 @@ static int __validate_secure_display(struct mdss_overlay_private *mdp5_data) pr_debug("pipe count:: secure display:%d non-secure:%d\n", sd_pipes, nonsd_pipes); - if ((sd_pipes || mdss_get_sd_client_cnt()) && nonsd_pipes) { + mdp5_data->sd_transition_state = SD_TRANSITION_NONE; + if (!__is_sd_state_valid(sd_pipes, nonsd_pipes, panel_type, + mdp5_data->sd_enabled)) { pr_err("non-secure layer validation request during secure display session\n"); pr_err(" secure client cnt:%d secure pipe cnt:%d non-secure pipe cnt:%d\n", mdss_get_sd_client_cnt(), sd_pipes, nonsd_pipes); - return -EINVAL; - } else { - return 0; + ret = -EINVAL; + } else if (!mdp5_data->sd_enabled && sd_pipes) { + mdp5_data->sd_transition_state = + SD_TRANSITION_NON_SECURE_TO_SECURE; + } else if (mdp5_data->sd_enabled && !sd_pipes) { + mdp5_data->sd_transition_state = + SD_TRANSITION_SECURE_TO_NON_SECURE; } + return ret; } /* @@ -1893,16 +1939,20 @@ static int __validate_layers(struct msm_fb_data_type *mfd, mutex_lock(&mdp5_data->list_lock); list_for_each_entry_safe(pipe, tmp, &mdp5_data->pipes_used, list) { if (IS_ERR_VALUE(ret)) { - if ((pipe->ndx & rec_release_ndx[0]) || - (pipe->ndx & rec_release_ndx[1])) { + if (((pipe->ndx & rec_release_ndx[0]) && + (pipe->multirect.num == 0)) || + ((pipe->ndx & rec_release_ndx[1]) && + (pipe->multirect.num == 1))) { mdss_mdp_smp_unreserve(pipe); pipe->params_changed = 0; pipe->dirty = true; if (!list_empty(&pipe->list)) list_del_init(&pipe->list); mdss_mdp_pipe_destroy(pipe); - } else if ((pipe->ndx & rec_destroy_ndx[0]) || - (pipe->ndx & rec_destroy_ndx[1])) { + } else if (((pipe->ndx & rec_destroy_ndx[0]) && + (pipe->multirect.num == 0)) || + ((pipe->ndx & rec_destroy_ndx[1]) && + (pipe->multirect.num == 1))) { /* * cleanup/destroy list pipes should move back * to destroy list. Next/current kickoff cycle @@ -1914,7 +1964,7 @@ static int __validate_layers(struct msm_fb_data_type *mfd, } } else { pipe->file = file; - pr_debug("file pointer attached with pipe is %p\n", + pr_debug("file pointer attached with pipe is %pK\n", file); } } @@ -1963,7 +2013,8 @@ int mdss_mdp_layer_pre_commit(struct msm_fb_data_type *mfd, /* handle null commit */ if (!layer_count) { __handle_free_list(mdp5_data, NULL, layer_count); - return 0; + /* Check for secure state transition. */ + return __validate_secure_display(mdp5_data); } validate_info_list = kcalloc(layer_count, sizeof(*validate_info_list), @@ -2107,6 +2158,12 @@ int mdss_mdp_layer_pre_commit_wfd(struct msm_fb_data_type *mfd, wfd = mdp5_data->wfd; output_layer = commit->output_layer; + if (output_layer->buffer.plane_count > MAX_PLANES) { + pr_err("Output buffer plane_count exceeds MAX_PLANES limit:%d\n", + output_layer->buffer.plane_count); + return -EINVAL; + } + data = mdss_mdp_wfd_add_data(wfd, output_layer); if (IS_ERR_OR_NULL(data)) return PTR_ERR(data); @@ -2137,6 +2194,14 @@ int mdss_mdp_layer_pre_commit_wfd(struct msm_fb_data_type *mfd, sync_pt_data = &mfd->mdp_sync_pt_data; mutex_lock(&sync_pt_data->sync_mutex); count = sync_pt_data->acq_fen_cnt; + + if (count >= MDP_MAX_FENCE_FD) { + pr_err("Reached maximum possible value for fence count\n"); + mutex_unlock(&sync_pt_data->sync_mutex); + rc = -EINVAL; + goto input_layer_err; + } + sync_pt_data->acq_fen[count] = fence; sync_pt_data->acq_fen_cnt++; mutex_unlock(&sync_pt_data->sync_mutex); diff --git a/drivers/video/msm/mdss/mdss_mdp_overlay.c b/drivers/video/msm/mdss/mdss_mdp_overlay.c index d71622372e192..3c9da0bc13f60 100644 --- a/drivers/video/msm/mdss/mdss_mdp_overlay.c +++ b/drivers/video/msm/mdss/mdss_mdp_overlay.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -48,6 +48,12 @@ #define BUF_POOL_SIZE 32 +#define DFPS_DATA_MAX_HFP 8192 +#define DFPS_DATA_MAX_HBP 8192 +#define DFPS_DATA_MAX_HPW 8192 +#define DFPS_DATA_MAX_FPS 0x7fffffff +#define DFPS_DATA_MAX_CLK_RATE 250000 + static int mdss_mdp_overlay_free_fb_pipe(struct msm_fb_data_type *mfd); static int mdss_mdp_overlay_fb_parse_dt(struct msm_fb_data_type *mfd); static int mdss_mdp_overlay_off(struct msm_fb_data_type *mfd); @@ -1081,7 +1087,7 @@ struct mdss_mdp_data *mdss_mdp_overlay_buf_alloc(struct msm_fb_data_type *mfd, list_move_tail(&buf->buf_list, &mdp5_data->bufs_used); list_add_tail(&buf->pipe_list, &pipe->buf_queue); - pr_debug("buffer alloc: %p\n", buf); + pr_debug("buffer alloc: %pK\n", buf); return buf; } @@ -1135,7 +1141,7 @@ void mdss_mdp_overlay_buf_free(struct msm_fb_data_type *mfd, buf->last_freed = local_clock(); buf->state = MDP_BUF_STATE_UNUSED; - pr_debug("buffer freed: %p\n", buf); + pr_debug("buffer freed: %pK\n", buf); list_move_tail(&buf->buf_list, &mdp5_data->bufs_pool); } @@ -1456,6 +1462,21 @@ static void mdss_mdp_overlay_update_pm(struct mdss_overlay_private *mdp5_data) activate_event_timer(mdp5_data->cpu_pm_hdl, wakeup_time); } +static void __unstage_pipe_and_clean_buf(struct msm_fb_data_type *mfd, + struct mdss_mdp_pipe *pipe, struct mdss_mdp_data *buf) +{ + + pr_debug("unstaging pipe:%d rect:%d buf:%d\n", + pipe->num, pipe->multirect.num, !buf); + MDSS_XLOG(pipe->num, pipe->multirect.num, !buf); + mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); + mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_right); + pipe->dirty = true; + + if (buf) + __pipe_buf_mark_cleanup(mfd, buf); +} + static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) { struct mdss_overlay_private *mdp5_data = mfd_to_mdp5_data(mfd); @@ -1516,7 +1537,7 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) if (buf) { switch (buf->state) { case MDP_BUF_STATE_READY: - pr_debug("pnum=%d buf=%p first buffer ready\n", + pr_debug("pnum=%d buf=%pK first buffer ready\n", pipe->num, buf); break; case MDP_BUF_STATE_ACTIVE: @@ -1536,7 +1557,7 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) } break; default: - pr_err("invalid state of buf %p=%d\n", + pr_err("invalid state of buf %pK=%d\n", buf, buf->state); BUG(); break; @@ -1567,7 +1588,6 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) pipe->num); ret = -EINVAL; } - /* * if we reach here without errors and buf == NULL * then solid fill will be set @@ -1576,14 +1596,36 @@ static int __overlay_queue_pipes(struct msm_fb_data_type *mfd) ret = mdss_mdp_pipe_queue_data(pipe, buf); if (IS_ERR_VALUE(ret)) { - pr_warn("Unable to queue data for pnum=%d\n", - pipe->num); - mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_left); - mdss_mdp_mixer_pipe_unstage(pipe, pipe->mixer_right); - pipe->dirty = true; + pr_warn("Unable to queue data for pnum=%d rect=%d\n", + pipe->num, pipe->multirect.num); + + /* + * If we fail for a multi-rect pipe, unstage both rects + * so we don't leave the pipe configured in multi-rect + * mode with only one rectangle staged. + */ + if (pipe->multirect.mode != + MDSS_MDP_PIPE_MULTIRECT_NONE) { + struct mdss_mdp_pipe *next_pipe = + (struct mdss_mdp_pipe *) + pipe->multirect.next; + + if (next_pipe) { + struct mdss_mdp_data *next_buf = + list_first_entry_or_null( + &next_pipe->buf_queue, + struct mdss_mdp_data, + pipe_list); + + __unstage_pipe_and_clean_buf(mfd, + next_pipe, next_buf); + } else { + pr_warn("cannot find rect pnum=%d\n", + pipe->num); + } + } - if (buf) - __pipe_buf_mark_cleanup(mfd, buf); + __unstage_pipe_and_clean_buf(mfd, pipe, buf); } } @@ -1959,6 +2001,42 @@ static void __validate_and_set_roi(struct msm_fb_data_type *mfd, mdss_mdp_set_roi(ctl, &l_roi, &r_roi); } +static int __config_secure_display(struct mdss_overlay_private *mdp5_data) +{ + int panel_type = mdp5_data->ctl->panel_data->panel_info.type; + int sd_enable = -1; /* Since 0 is a valid state, initialize with -1 */ + int ret = 0; + + if (panel_type == MIPI_CMD_PANEL) + mdss_mdp_display_wait4pingpong(mdp5_data->ctl, true); + + /* + * Start secure display session if we are transitioning from non secure + * to secure display. + */ + if (mdp5_data->sd_transition_state == + SD_TRANSITION_NON_SECURE_TO_SECURE) + sd_enable = 1; + + /* + * For command mode panels, if we are trasitioning from secure to + * non secure session, disable the secure display, as we've already + * waited for the previous frame transfer. + */ + if ((panel_type == MIPI_CMD_PANEL) && + (mdp5_data->sd_transition_state == + SD_TRANSITION_SECURE_TO_NON_SECURE)) + sd_enable = 0; + + if (sd_enable != -1) { + ret = mdss_mdp_secure_display_ctrl(mdp5_data->mdata, sd_enable); + if (!ret) + mdp5_data->sd_enabled = sd_enable; + } + + return ret; +} + int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, struct mdp_display_commit *data) { @@ -1966,10 +2044,10 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, struct mdss_mdp_pipe *pipe, *tmp; struct mdss_mdp_ctl *ctl = mfd_to_ctl(mfd); int ret = 0; - int sd_in_pipe = 0; struct mdss_mdp_commit_cb commit_cb; + u8 sd_transition_state = 0; - if (!ctl) + if (!ctl || !ctl->mixer_left) return -ENODEV; ATRACE_BEGIN(__func__); @@ -1999,30 +2077,6 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, } mutex_lock(&mdp5_data->list_lock); - /* - * check if there is a secure display session - */ - list_for_each_entry(pipe, &mdp5_data->pipes_used, list) { - if (pipe->flags & MDP_SECURE_DISPLAY_OVERLAY_SESSION) { - sd_in_pipe = 1; - pr_debug("Secure pipe: %u : %08X\n", - pipe->num, pipe->flags); - } - } - - /* - * start secure display session if there is secure display session and - * sd_enabled is not true. - */ - if (!mdp5_data->sd_enabled && sd_in_pipe) { - if (!mdss_get_sd_client_cnt()) - ret = mdss_mdp_secure_display_ctrl(1); - if (!ret) { - mdp5_data->sd_enabled = 1; - mdss_update_sd_client(mdp5_data->mdata, true); - } - } - if (!ctl->shared_lock) mdss_mdp_ctl_notify(ctl, MDP_NOTIFY_FRAME_BEGIN); @@ -2035,6 +2089,15 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, if (ctl->ops.wait_pingpong && mdp5_data->mdata->serialize_wait4pp) mdss_mdp_display_wait4pingpong(ctl, true); + sd_transition_state = mdp5_data->sd_transition_state; + if (sd_transition_state != SD_TRANSITION_NONE) { + ret = __config_secure_display(mdp5_data); + if (IS_ERR_VALUE(ret)) { + pr_err("Secure session config failed\n"); + goto commit_fail; + } + } + /* * Setup pipe in solid fill before unstaging, * to ensure no fetches are happening after dettach or reattach. @@ -2069,6 +2132,7 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, commit_cb.data = mfd; ret = mdss_mdp_display_commit(mdp5_data->ctl, NULL, &commit_cb); + ctl->panel_data->panel_info.kickoff_count++; ATRACE_END("display_commit"); } @@ -2111,17 +2175,14 @@ int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd, mutex_lock(&mdp5_data->ov_lock); /* - * If there is no secure display session and sd_enabled, disable the - * secure display session + * If we are transitioning from secure to non-secure display, + * disable the secure display. */ - if (mdp5_data->sd_enabled && !sd_in_pipe && !ret) { - /* disable the secure display on last client */ - if (mdss_get_sd_client_cnt() == 1) - ret = mdss_mdp_secure_display_ctrl(0); - if (!ret) { - mdss_update_sd_client(mdp5_data->mdata, false); + if (mdp5_data->sd_enabled && (sd_transition_state == + SD_TRANSITION_SECURE_TO_NON_SECURE)) { + ret = mdss_mdp_secure_display_ctrl(mdp5_data->mdata, 0); + if (!ret) mdp5_data->sd_enabled = 0; - } } mdss_fb_update_notify_update(mfd); @@ -2237,7 +2298,7 @@ static int __mdss_mdp_overlay_release_all(struct msm_fb_data_type *mfd, u32 unset_ndx = 0; int cnt = 0; - pr_debug("releasing all resources for fb%d file:%p\n", + pr_debug("releasing all resources for fb%d file:%pK\n", mfd->index, file); mutex_lock(&mdp5_data->ov_lock); @@ -2950,6 +3011,7 @@ int mdss_mdp_dfps_update_params(struct msm_fb_data_type *mfd, pr_warn("Unsupported FPS. Configuring to max_fps = %d\n", pdata->panel_info.max_fps); dfps = pdata->panel_info.max_fps; + dfps_data->fps = dfps; } dfps_update_panel_params(pdata, dfps_data); @@ -3026,6 +3088,13 @@ static ssize_t dynamic_fps_sysfs_wta_dfps(struct device *dev, return count; } + if (data.hfp > DFPS_DATA_MAX_HFP || data.hbp > DFPS_DATA_MAX_HBP || + data.hpw > DFPS_DATA_MAX_HPW || data.fps > DFPS_DATA_MAX_FPS || + data.clk_rate > DFPS_DATA_MAX_CLK_RATE){ + pr_err("Data values out of bound.\n"); + return -EINVAL; + } + rc = mdss_mdp_dfps_update_params(mfd, pdata, &data); if (rc) { pr_err("failed to set dfps params\n"); @@ -3770,7 +3839,7 @@ static int mdss_mdp_hw_cursor_pipe_update(struct msm_fb_data_type *mfd, if (!mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) { ret = mdss_smmu_dma_alloc_coherent(&pdev->dev, cursor_frame_size, (dma_addr_t *) &mfd->cursor_buf_phys, - &mfd->cursor_buf_iova, mfd->cursor_buf, + &mfd->cursor_buf_iova, &mfd->cursor_buf, GFP_KERNEL, MDSS_IOMMU_DOMAIN_UNSECURE); if (ret) { pr_err("can't allocate cursor buffer rc:%d\n", ret); @@ -3812,12 +3881,21 @@ static int mdss_mdp_hw_cursor_pipe_update(struct msm_fb_data_type *mfd, start_y = 0; } + if ((img->width > mdata->max_cursor_size) || + (img->height > mdata->max_cursor_size) || + (img->depth != 32) || (start_x >= xres) || + (start_y >= yres)) { + pr_err("Invalid cursor image coordinates\n"); + ret = -EINVAL; + goto done; + } + roi.w = min(xres - start_x, img->width - roi.x); roi.h = min(yres - start_y, img->height - roi.y); if ((roi.w > mdata->max_cursor_size) || - (roi.h > mdata->max_cursor_size) || - (img->depth != 32) || (start_x >= xres) || (start_y >= yres)) { + (roi.h > mdata->max_cursor_size)) { + pr_err("Invalid cursor ROI size\n"); ret = -EINVAL; goto done; } @@ -3848,6 +3926,12 @@ static int mdss_mdp_hw_cursor_pipe_update(struct msm_fb_data_type *mfd, req->transp_mask = img->bg_color & ~(0xff << var->transp.offset); if (mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) { + if (img->width * img->height * 4 > cursor_frame_size) { + pr_err("cursor image size is too large\n"); + ret = -EINVAL; + goto done; + } + ret = copy_from_user(mfd->cursor_buf, img->data, img->width * img->height * 4); if (ret) { @@ -3949,7 +4033,7 @@ static int mdss_mdp_hw_cursor_update(struct msm_fb_data_type *mfd, if (!mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) { ret = mdss_smmu_dma_alloc_coherent(&pdev->dev, cursor_frame_size, (dma_addr_t *) &mfd->cursor_buf_phys, - &mfd->cursor_buf_iova, mfd->cursor_buf, + &mfd->cursor_buf_iova, &mfd->cursor_buf, GFP_KERNEL, MDSS_IOMMU_DOMAIN_UNSECURE); if (ret) { pr_err("can't allocate cursor buffer rc:%d\n", ret); @@ -3997,7 +4081,7 @@ static int mdss_mdp_hw_cursor_update(struct msm_fb_data_type *mfd, mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); - if (cursor->set & FB_CUR_SETIMAGE) { + if (mfd->cursor_buf && (cursor->set & FB_CUR_SETIMAGE)) { u32 cursor_addr; ret = copy_from_user(mfd->cursor_buf, img->data, img->width * img->height * 4); @@ -4075,8 +4159,10 @@ static int mdss_bl_scale_config(struct msm_fb_data_type *mfd, pr_debug("update scale = %d, min_lvl = %d\n", mfd->bl_scale, mfd->bl_min_lvl); - /* update current backlight to use new scaling*/ - mdss_fb_set_backlight(mfd, curr_bl); + /* Update current backlight to use new scaling, if it is not zero */ + if (curr_bl) + mdss_fb_set_backlight(mfd, curr_bl); + mutex_unlock(&mfd->bl_lock); return ret; } @@ -4314,12 +4400,16 @@ static int mdss_fb_get_metadata(struct msm_fb_data_type *mfd, ret = mdss_fb_get_hw_caps(mfd, &metadata->data.caps); break; case metadata_op_get_ion_fd: - if (mfd->fb_ion_handle) { + if (mfd->fb_ion_handle && mfd->fb_ion_client) { + get_dma_buf(mfd->fbmem_buf); metadata->data.fbmem_ionfd = - dma_buf_fd(mfd->fbmem_buf, 0); - if (metadata->data.fbmem_ionfd < 0) + ion_share_dma_buf_fd(mfd->fb_ion_client, + mfd->fb_ion_handle); + if (metadata->data.fbmem_ionfd < 0) { + dma_buf_put(mfd->fbmem_buf); pr_err("fd allocation failed. fd = %d\n", metadata->data.fbmem_ionfd); + } } break; case metadata_op_crc: diff --git a/drivers/video/msm/mdss/mdss_mdp_pipe.c b/drivers/video/msm/mdss/mdss_mdp_pipe.c index 9a4e97722ad76..1f03763b197a2 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pipe.c +++ b/drivers/video/msm/mdss/mdss_mdp_pipe.c @@ -2664,20 +2664,22 @@ int mdss_mdp_pipe_queue_data(struct mdss_mdp_pipe *pipe, pipe->params_changed = 0; mdss_mdp_pipe_solidfill_setup(pipe); - MDSS_XLOG(pipe->num, pipe->mixer_left->num, pipe->play_cnt, - 0x111); + MDSS_XLOG(pipe->num, pipe->multirect.num, + pipe->mixer_left->num, pipe->play_cnt, 0x111); goto update_nobuf; } - MDSS_XLOG(pipe->num, pipe->mixer_left->num, pipe->play_cnt, 0x222); + MDSS_XLOG(pipe->num, pipe->multirect.num, pipe->mixer_left->num, + pipe->play_cnt, 0x222); if (params_changed) { pipe->params_changed = 0; ret = mdss_mdp_pipe_pp_setup(pipe, &opmode); if (ret) { - pr_err("pipe pp setup error for pnum=%d\n", pipe->num); + pr_err("pipe pp setup error for pnum=%d rect=%d\n", + pipe->num, pipe->multirect.num); goto done; } @@ -2730,7 +2732,7 @@ int mdss_mdp_pipe_queue_data(struct mdss_mdp_pipe *pipe, mdss_mdp_pipe_write(pipe, MDSS_MDP_REG_SSPP_MULTI_REC_OP_MODE, multirect_opmode); if (src_data == NULL) { - pr_debug("src_data=%p pipe num=%dx\n", + pr_debug("src_data=%pK pipe num=%dx\n", src_data, pipe->num); goto update_nobuf; } diff --git a/drivers/video/msm/mdss/mdss_mdp_pp.c b/drivers/video/msm/mdss/mdss_mdp_pp.c index fe8a1969389a3..32fed5027f492 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -60,6 +60,30 @@ struct mdp_csc_cfg mdp_csc_8bit_convert[MDSS_MDP_MAX_CSC] = { { 0x10, 0xeb, 0x10, 0xf0, 0x10, 0xf0,}, { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, }, + [MDSS_MDP_CSC_YUV2RGB_2020L] = { + 0, + { + 0x0256, 0x0000, 0x035e, + 0x0256, 0xffa0, 0xfeb2, + 0x0256, 0x044c, 0x0000, + }, + { 0xfff0, 0xff80, 0xff80,}, + { 0x0, 0x0, 0x0,}, + { 0x10, 0xeb, 0x10, 0xf0, 0x10, 0xf0,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + }, + [MDSS_MDP_CSC_YUV2RGB_2020FR] = { + 0, + { + 0x0200, 0x0000, 0x02f3, + 0x0200, 0xffac, 0xfedb, + 0x0200, 0x03c3, 0x0000, + }, + { 0x0000, 0xff80, 0xff80,}, + { 0x0, 0x0, 0x0,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + }, [MDSS_MDP_CSC_RGB2YUV_601L] = { 0, { @@ -96,6 +120,30 @@ struct mdp_csc_cfg mdp_csc_8bit_convert[MDSS_MDP_MAX_CSC] = { { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, { 0x0010, 0x00eb, 0x0010, 0x00f0, 0x0010, 0x00f0,}, }, + [MDSS_MDP_CSC_RGB2YUV_2020L] = { + 0, + { + 0x0073, 0x0129, 0x001a, + 0xffc1, 0xff5e, 0x00e0, + 0x00e0, 0xff32, 0xffee + }, + { 0x0, 0x0, 0x0,}, + { 0x0010, 0x0080, 0x0080,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + { 0x0010, 0x00eb, 0x0010, 0x00f0, 0x0010, 0x00f0,}, + }, + [MDSS_MDP_CSC_RGB2YUV_2020FR] = { + 0, + { + 0x0086, 0x015b, 0x001e, + 0xffb9, 0xff47, 0x0100, + 0x0100, 0xff15, 0xffeb + }, + { 0x0, 0x0, 0x0,}, + { 0x0, 0x0080, 0x0080,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + { 0x0, 0xff, 0x0, 0xff, 0x0, 0xff,}, + }, [MDSS_MDP_CSC_YUV2YUV] = { 0, { @@ -159,6 +207,30 @@ struct mdp_csc_cfg mdp_csc_10bit_convert[MDSS_MDP_MAX_CSC] = { { 0x40, 0x3ac, 0x40, 0x3c0, 0x40, 0x3c0,}, { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, }, + [MDSS_MDP_CSC_YUV2RGB_2020L] = { + 0, + { + 0x0256, 0x0000, 0x035e, + 0x0256, 0xffa0, 0xfeb2, + 0x0256, 0x044c, 0x0000, + }, + { 0xffc0, 0xfe00, 0xfe00,}, + { 0x0, 0x0, 0x0,}, + { 0x40, 0x3ac, 0x40, 0x3c0, 0x40, 0x3c0,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + }, + [MDSS_MDP_CSC_YUV2RGB_2020FR] = { + 0, + { + 0x0200, 0x0000, 0x02f3, + 0x0200, 0xffac, 0xfedb, + 0x0200, 0x03c3, 0x0000, + }, + { 0x0000, 0xfe00, 0xfe00,}, + { 0x0, 0x0, 0x0,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + }, [MDSS_MDP_CSC_RGB2YUV_601L] = { 0, { @@ -195,6 +267,30 @@ struct mdp_csc_cfg mdp_csc_10bit_convert[MDSS_MDP_MAX_CSC] = { { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, { 0x0040, 0x03ac, 0x0040, 0x03c0, 0x0040, 0x03c0,}, }, + [MDSS_MDP_CSC_RGB2YUV_2020L] = { + 0, + { + 0x0073, 0x0129, 0x001a, + 0xffc1, 0xff5e, 0x00e0, + 0x00e0, 0xff32, 0xffee + }, + { 0x0, 0x0, 0x0,}, + { 0x0040, 0x0200, 0x0200,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + { 0x0040, 0x03ac, 0x0040, 0x03c0, 0x0040, 0x03c0,}, + }, + [MDSS_MDP_CSC_RGB2YUV_2020FR] = { + 0, + { + 0x0086, 0x015b, 0x001e, + 0xffb9, 0xff47, 0x0100, + 0x0100, 0xff15, 0xffeb + }, + { 0x0, 0x0, 0x0,}, + { 0x0, 0x0200, 0x0200,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + { 0x0, 0x3ff, 0x0, 0x3ff, 0x0, 0x3ff,}, + }, [MDSS_MDP_CSC_YUV2YUV] = { 0, { @@ -500,8 +596,9 @@ static void mdss_mdp_hist_irq_set_mask(u32 irq); static void mdss_mdp_hist_irq_clear_mask(u32 irq); static void mdss_mdp_hist_intr_notify(u32 disp); static int mdss_mdp_panel_default_dither_config(struct msm_fb_data_type *mfd, - u32 panel_bpp); -static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd); + u32 panel_bpp, bool enable); +static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd, + bool enable); static inline int pp_validate_dspp_mfd_block(struct msm_fb_data_type *mfd, int block); static int pp_mfd_release_all(struct msm_fb_data_type *mfd); @@ -1158,7 +1255,7 @@ static int pp_rgb_pipe_setup(struct mdss_mdp_pipe *pipe, u32 *op) int ret = 0; if (!pipe) { - pr_err("invalid param pipe %p\n", pipe); + pr_err("invalid param pipe %pK\n", pipe); return -EINVAL; } if (pipe->flags & MDP_OVERLAY_PP_CFG_EN && @@ -1176,7 +1273,7 @@ static int pp_dma_pipe_setup(struct mdss_mdp_pipe *pipe, u32 *op) int ret = 0; if (!pipe) { - pr_err("invalid param pipe %p\n", pipe); + pr_err("invalid param pipe %pK\n", pipe); return -EINVAL; } if (pipe->flags & MDP_OVERLAY_PP_CFG_EN && @@ -1793,7 +1890,7 @@ void mdss_mdp_pipe_pp_clear(struct mdss_mdp_pipe *pipe) struct pp_hist_col_info *hist_info; if (!pipe) { - pr_err("Invalid pipe context passed, %p\n", + pr_err("Invalid pipe context passed, %pK\n", pipe); return; } @@ -1919,7 +2016,7 @@ static int pp_mixer_setup(struct mdss_mdp_mixer *mixer) struct mdss_data_type *mdata = mdss_mdp_get_mdata(); if (!mixer || !mixer->ctl || !mixer->ctl->mfd || !mdata) { - pr_err("invalid parameters, mixer %p ctl %p mfd %p mdata %p\n", + pr_err("invalid parameters, mixer %pK ctl %pK mfd %pK mdata %pK\n", mixer, (mixer ? mixer->ctl : NULL), (mixer ? (mixer->ctl ? mixer->ctl->mfd : NULL) : NULL), mdata); @@ -2568,7 +2665,7 @@ int mdss_mdp_pp_resume(struct msm_fb_data_type *mfd) struct mdp_pa_v2_cfg_data *pa_v2_cache_cfg = NULL; if (!mfd) { - pr_err("invalid input: mfd = 0x%p\n", mfd); + pr_err("invalid input: mfd = 0x%pK\n", mfd); return -EINVAL; } @@ -2658,7 +2755,7 @@ int mdss_mdp_pp_resume(struct msm_fb_data_type *mfd) mfd->index); return 0; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -2799,7 +2896,7 @@ static int mdss_mdp_pp_dt_parse(struct device *dev) ret = 0; } } else { - pr_err("invalid dev %p mdata %p\n", dev, mdata); + pr_err("invalid dev %pK mdata %pK\n", dev, mdata); ret = -EINVAL; } bail_out: @@ -2933,7 +3030,7 @@ int mdss_mdp_pp_overlay_init(struct msm_fb_data_type *mfd) struct mdss_data_type *mdata = mdss_mdp_get_mdata(); if (!mfd || !mdata) { - pr_err("Invalid mfd %p mdata %p\n", mfd, mdata); + pr_err("Invalid mfd %pK mdata %pK\n", mfd, mdata); return -EPERM; } if (mfd->index >= (MDP_BLOCK_MAX - MDP_LOGICAL_BLOCK_DISP_0)) @@ -2946,22 +3043,24 @@ int mdss_mdp_pp_overlay_init(struct msm_fb_data_type *mfd) } int mdss_mdp_pp_default_overlay_config(struct msm_fb_data_type *mfd, - struct mdss_panel_data *pdata) + struct mdss_panel_data *pdata, + bool enable) { int ret = 0; if (!mfd || !pdata) { - pr_err("Invalid parameters mfd %p pdata %p\n", mfd, pdata); + pr_err("Invalid parameters mfd %pK pdata %pK\n", mfd, pdata); return -EINVAL; } - ret = mdss_mdp_panel_default_dither_config(mfd, pdata->panel_info.bpp); + ret = mdss_mdp_panel_default_dither_config(mfd, pdata->panel_info.bpp, + enable); if (ret) pr_err("Unable to configure default dither on fb%d ret %d\n", mfd->index, ret); if (pdata->panel_info.type == DTV_PANEL) { - ret = mdss_mdp_limited_lut_igc_config(mfd); + ret = mdss_mdp_limited_lut_igc_config(mfd, enable); if (ret) pr_err("Unable to configure DTV panel default IGC ret %d\n", ret); @@ -3004,7 +3103,7 @@ static int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out, mfd->index); return 0; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK.\n", ret, ad); return ret; } @@ -3023,7 +3122,7 @@ static int pp_ad_calc_bl(struct msm_fb_data_type *mfd, int bl_in, int *bl_out, if (!ad->bl_mfd || !ad->bl_mfd->panel_info || !ad->bl_att_lut) { - pr_err("Invalid ad info: bl_mfd = 0x%p, ad->bl_mfd->panel_info = 0x%p, bl_att_lut = 0x%p\n", + pr_err("Invalid ad info: bl_mfd = 0x%pK, ad->bl_mfd->panel_info = 0x%pK, bl_att_lut = 0x%pK\n", ad->bl_mfd, (!ad->bl_mfd) ? NULL : ad->bl_mfd->panel_info, ad->bl_att_lut); @@ -3520,7 +3619,7 @@ int mdss_mdp_pcc_config(struct msm_fb_data_type *mfd, if (pp_ops[PCC].pp_get_config) { addr = mdss_mdp_get_dspp_addr_off(disp_num); if (IS_ERR_OR_NULL(addr)) { - pr_err("invalid dspp base_addr %p\n", + pr_err("invalid dspp base_addr %pK\n", addr); ret = -EINVAL; goto pcc_clk_off; @@ -3651,7 +3750,8 @@ static void pp_update_igc_lut(struct mdp_igc_lut_data *cfg, writel_relaxed((cfg->c2_data[i] & 0xFFF) | data, addr); } -static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd) +static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd, + bool enable) { int ret = 0; u32 copyback = 0; @@ -3676,7 +3776,10 @@ static int mdss_mdp_limited_lut_igc_config(struct msm_fb_data_type *mfd) pr_err("failed to get default IGC version, ret %d\n", ret); config.version = igc_version.version_info; - config.ops = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE; + if (enable) + config.ops = MDP_PP_OPS_WRITE | MDP_PP_OPS_ENABLE; + else + config.ops = MDP_PP_OPS_DISABLE; config.block = (mfd->index) + MDP_LOGICAL_BLOCK_DISP_0; switch (config.version) { case mdp_igc_v1_7: @@ -3728,8 +3831,7 @@ int mdss_mdp_igc_lut_config(struct msm_fb_data_type *mfd, disp_num = config->block - MDP_LOGICAL_BLOCK_DISP_0; if (config->ops & MDP_PP_OPS_READ) { - if (config->len != IGC_LUT_ENTRIES && - !pp_ops[IGC].pp_get_config) { + if (config->len != IGC_LUT_ENTRIES) { pr_err("invalid len for IGC table for read %d\n", config->len); return -EINVAL; @@ -4208,7 +4310,7 @@ int mdss_mdp_hist_lut_config(struct msm_fb_data_type *mfd, mdss_mdp_clk_ctrl(MDP_BLOCK_POWER_ON); base_addr = mdss_mdp_get_dspp_addr_off(dspp_num); if (IS_ERR_OR_NULL(base_addr)) { - pr_err("invalid base addr %p\n", + pr_err("invalid base addr %pK\n", base_addr); ret = -EINVAL; goto hist_lut_clk_off; @@ -4267,7 +4369,7 @@ int mdss_mdp_hist_lut_config(struct msm_fb_data_type *mfd, } static int mdss_mdp_panel_default_dither_config(struct msm_fb_data_type *mfd, - u32 panel_bpp) + u32 panel_bpp, bool enable) { int ret = 0; struct mdp_dither_cfg_data dither; @@ -4292,55 +4394,58 @@ static int mdss_mdp_panel_default_dither_config(struct msm_fb_data_type *mfd, return ret; } dither.version = dither_version.version_info; - - switch (panel_bpp) { - case 24: - dither.flags = MDP_PP_OPS_ENABLE | MDP_PP_OPS_WRITE; - switch (dither.version) { - case mdp_dither_v1_7: - dither_data.g_y_depth = 8; - dither_data.r_cr_depth = 8; - dither_data.b_cb_depth = 8; - /* - * Use default dither table by setting len to 0 - */ - dither_data.len = 0; - dither.cfg_payload = &dither_data; - break; - case mdp_pp_legacy: - default: - dither.g_y_depth = 8; - dither.r_cr_depth = 8; - dither.b_cb_depth = 8; - dither.cfg_payload = NULL; + dither.cfg_payload = NULL; + + if (enable) { + switch (panel_bpp) { + case 24: + dither.flags = MDP_PP_OPS_ENABLE | MDP_PP_OPS_WRITE; + switch (dither.version) { + case mdp_dither_v1_7: + dither_data.g_y_depth = 8; + dither_data.r_cr_depth = 8; + dither_data.b_cb_depth = 8; + /* + * Use default dither table by setting len to 0 + */ + dither_data.len = 0; + dither.cfg_payload = &dither_data; + break; + case mdp_pp_legacy: + default: + dither.g_y_depth = 8; + dither.r_cr_depth = 8; + dither.b_cb_depth = 8; + dither.cfg_payload = NULL; + break; + } break; - } - break; - case 18: - dither.flags = MDP_PP_OPS_ENABLE | MDP_PP_OPS_WRITE; - switch (dither.version) { - case mdp_dither_v1_7: - dither_data.g_y_depth = 6; - dither_data.r_cr_depth = 6; - dither_data.b_cb_depth = 6; - /* - * Use default dither table by setting len to 0 - */ - dither_data.len = 0; - dither.cfg_payload = &dither_data; + case 18: + dither.flags = MDP_PP_OPS_ENABLE | MDP_PP_OPS_WRITE; + switch (dither.version) { + case mdp_dither_v1_7: + dither_data.g_y_depth = 6; + dither_data.r_cr_depth = 6; + dither_data.b_cb_depth = 6; + /* + * Use default dither table by setting len to 0 + */ + dither_data.len = 0; + dither.cfg_payload = &dither_data; + break; + case mdp_pp_legacy: + default: + dither.g_y_depth = 6; + dither.r_cr_depth = 6; + dither.b_cb_depth = 6; + dither.cfg_payload = NULL; + break; + } break; - case mdp_pp_legacy: default: - dither.g_y_depth = 6; - dither.r_cr_depth = 6; - dither.b_cb_depth = 6; dither.cfg_payload = NULL; break; } - break; - default: - dither.cfg_payload = NULL; - break; } ret = mdss_mdp_dither_config(mfd, &dither, NULL, true); if (ret) @@ -4462,7 +4567,7 @@ int mdss_mdp_gamut_config(struct msm_fb_data_type *mfd, if (pp_ops[GAMUT].pp_get_config) { addr = mdss_mdp_get_dspp_addr_off(disp_num); if (IS_ERR_OR_NULL(addr)) { - pr_err("invalid dspp base addr %p\n", + pr_err("invalid dspp base addr %pK\n", addr); ret = -EINVAL; goto gamut_clk_off; @@ -4575,6 +4680,11 @@ int mdss_mdp_gamut_config(struct msm_fb_data_type *mfd, goto gamut_set_dirty; } } + if (pp_gm_has_invalid_lut_size(config)) { + pr_err("invalid lut size for gamut\n"); + ret = -EINVAL; + goto gamut_config_exit; + } local_cfg = *config; tbl_off = mdss_pp_res->gamut_tbl[disp_num]; for (i = 0; i < MDP_GAMUT_TABLE_NUM; i++) { @@ -4648,7 +4758,7 @@ static int pp_hist_enable(struct pp_hist_col_info *hist_info, spin_lock_irqsave(&hist_info->hist_lock, flag); if (hist_info->col_en) { spin_unlock_irqrestore(&hist_info->hist_lock, flag); - pr_err("%s Hist collection has already been enabled %p\n", + pr_err("%s Hist collection has already been enabled %pK\n", __func__, hist_info->base); ret = -EBUSY; goto exit; @@ -4797,7 +4907,7 @@ static int pp_hist_disable(struct pp_hist_col_info *hist_info) spin_lock_irqsave(&hist_info->hist_lock, flag); if (hist_info->col_en == false) { spin_unlock_irqrestore(&hist_info->hist_lock, flag); - pr_debug("Histogram already disabled (%p)\n", hist_info->base); + pr_debug("Histogram already disabled (%pK)\n", hist_info->base); ret = -EINVAL; goto exit; } @@ -4894,7 +5004,7 @@ int mdss_mdp_hist_intr_req(struct mdss_intr *intr, u32 bits, bool en) unsigned long flag; int ret = 0; if (!intr) { - pr_err("NULL addr passed, %p\n", intr); + pr_err("NULL addr passed, %pK\n", intr); return -EINVAL; } @@ -5458,7 +5568,7 @@ static int mdss_mdp_get_ad(struct msm_fb_data_type *mfd, *ret_ad = NULL; if (!mfd) { - pr_err("invalid parameter mfd %p\n", mfd); + pr_err("invalid parameter mfd %pK\n", mfd); return -EINVAL; } mdata = mfd_to_mdata(mfd); @@ -5505,7 +5615,7 @@ static int pp_ad_invalidate_input(struct msm_fb_data_type *mfd) mfd->index); return 0; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -5540,7 +5650,7 @@ int mdss_mdp_ad_config(struct msm_fb_data_type *mfd, mfd->index); return ret; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -5657,7 +5767,7 @@ int mdss_mdp_ad_input(struct msm_fb_data_type *mfd, mfd->index); return ret; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -6016,7 +6126,7 @@ static int mdss_mdp_ad_ipc_reset(struct msm_fb_data_type *mfd) struct mdss_ad_info *ad; if (!mfd) { - pr_err("mfd = 0x%p\n", mfd); + pr_err("mfd = 0x%pK\n", mfd); return -EINVAL; } @@ -6026,7 +6136,7 @@ static int mdss_mdp_ad_ipc_reset(struct msm_fb_data_type *mfd) mfd->index); return 0; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -6050,13 +6160,13 @@ static int mdss_mdp_ad_setup(struct msm_fb_data_type *mfd) u32 width; if (!mfd) { - pr_err("mfd = 0x%p\n", mfd); + pr_err("mfd = 0x%pK\n", mfd); return -EINVAL; } ctl = mfd_to_ctl(mfd); if (!ctl) { - pr_err("ctl = 0x%p\n", ctl); + pr_err("ctl = 0x%pK\n", ctl); return -EINVAL; } sctl = mdss_mdp_get_split_ctl(ctl); @@ -6067,7 +6177,7 @@ static int mdss_mdp_ad_setup(struct msm_fb_data_type *mfd) mfd->index); return 0; } else if (ret || !ad) { - pr_err("Failed to get ad info: ret = %d, ad = 0x%p.\n", + pr_err("Failed to get ad info: ret = %d, ad = 0x%pK\n", ret, ad); return ret; } @@ -6254,7 +6364,7 @@ static void pp_ad_calc_worker(struct work_struct *work) } mdp5_data = mfd_to_mdp5_data(ad->mfd); if (!mdp5_data) { - pr_err("mdp5_data = 0x%p\n", mdp5_data); + pr_err("mdp5_data = 0x%pK\n", mdp5_data); mutex_unlock(&ad->lock); return; } @@ -6262,7 +6372,7 @@ static void pp_ad_calc_worker(struct work_struct *work) ctl = mfd_to_ctl(ad->mfd); mdata = mfd_to_mdata(ad->mfd); if (!ctl || !mdata || ad->calc_hw_num >= mdata->nad_cfgs) { - pr_err("ctl = 0x%p, mdata = 0x%p, ad->calc_hw_num = %d, mdata->nad_cfg = %d\n", + pr_err("ctl = 0x%pK, mdata = 0x%pK, ad->calc_hw_num = %d, mdata->nad_cfg = %d\n", ctl, mdata, ad->calc_hw_num, (!mdata ? 0 : mdata->nad_cfgs)); mutex_unlock(&ad->lock); @@ -6708,9 +6818,6 @@ static int is_valid_calib_addr(void *addr, u32 operation) int ret = 0; char __iomem *ptr = addr; char __iomem *mixer_base = mdss_res->mixer_intf->base; - char __iomem *rgb_base = mdss_res->rgb_pipes->base; - char __iomem *dma_base = mdss_res->dma_pipes->base; - char __iomem *vig_base = mdss_res->vig_pipes->base; char __iomem *ctl_base = mdss_res->ctl_off->base; char __iomem *dspp_base = mdss_res->mixer_intf->dspp_base; @@ -6742,17 +6849,20 @@ static int is_valid_calib_addr(void *addr, u32 operation) if (ret) goto valid_addr; } - if (ptr >= vig_base) { + if (mdss_res->vig_pipes && + ptr >= mdss_res->vig_pipes->base) { ret = is_valid_calib_vig_addr(ptr); if (ret) goto valid_addr; } - if (ptr >= rgb_base) { + if (mdss_res->rgb_pipes && + ptr >= mdss_res->rgb_pipes->base) { ret = is_valid_calib_rgb_addr(ptr); if (ret) goto valid_addr; } - if (ptr >= dma_base) { + if (mdss_res->dma_pipes && + ptr >= mdss_res->dma_pipes->base) { ret = is_valid_calib_dma_addr(ptr); if (ret) goto valid_addr; @@ -6873,7 +6983,7 @@ static int sspp_cache_location(u32 pipe_type, enum pp_config_block *block) int ret = 0; if (!block) { - pr_err("invalid params %p\n", block); + pr_err("invalid params %pK\n", block); return -EINVAL; } switch (pipe_type) { @@ -6902,7 +7012,7 @@ int mdss_mdp_pp_sspp_config(struct mdss_mdp_pipe *pipe) int ret = 0; if (!pipe) { - pr_err("invalid params, pipe %p\n", pipe); + pr_err("invalid params, pipe %pK\n", pipe); return -EINVAL; } @@ -7024,7 +7134,7 @@ static int pp_update_pcc_pipe_setup(struct mdss_mdp_pipe *pipe, u32 location) char __iomem *pipe_base = NULL; if (!pipe) { - pr_err("invalid param pipe %p\n", pipe); + pr_err("invalid param pipe %pK\n", pipe); return -EINVAL; } @@ -7076,7 +7186,7 @@ int mdss_mdp_pp_get_version(struct mdp_pp_feature_version *version) u32 ver_info = mdp_pp_legacy; if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); ret = -EINVAL; goto exit_version; } @@ -7157,7 +7267,7 @@ int mdss_mdp_copy_layer_pp_info(struct mdp_input_layer *layer) uint32_t ops; if (!layer) { - pr_err("invalid layer pointer passed %p\n", layer); + pr_err("invalid layer pointer passed %pK\n", layer); return -EFAULT; } @@ -7169,7 +7279,7 @@ int mdss_mdp_copy_layer_pp_info(struct mdp_input_layer *layer) ret = copy_from_user(pp_info, layer->pp_info, sizeof(struct mdp_overlay_pp_params)); if (ret) { - pr_err("layer list copy from user failed, pp_info = %p\n", + pr_err("layer list copy from user failed, pp_info = %pK\n", layer->pp_info); ret = -EFAULT; goto exit_pp_info; @@ -7278,7 +7388,7 @@ static int pp_mfd_release_all(struct msm_fb_data_type *mfd) struct mdss_data_type *mdata = mdss_mdp_get_mdata(); int ret = 0; if (!mfd || !mdata) { - pr_err("Invalid mfd %p mdata %p\n", mfd, mdata); + pr_err("Invalid mfd %pK mdata %pK\n", mfd, mdata); return -EPERM; } @@ -7309,7 +7419,7 @@ static int pp_mfd_ad_release_all(struct msm_fb_data_type *mfd) int ret = 0; if (!mdata || !mfd) { - pr_err("invalid params mdata %p mfd %p\n", mdata, mfd); + pr_err("invalid params mdata %pK mfd %pK\n", mdata, mfd); return -EINVAL; } if (!mdata->ad_calc_wq) @@ -7417,7 +7527,7 @@ static int pp_ppb_setup(struct mdss_mdp_mixer *mixer) int ret = 0; if (!mixer || !mixer->ctl || !mixer->ctl->mfd) { - pr_err("invalid parameters, mixer %p ctl %p mfd %p\n", + pr_err("invalid parameters, mixer %pK ctl %pK mfd %pK\n", mixer, (mixer ? mixer->ctl : NULL), (mixer ? (mixer->ctl ? mixer->ctl->mfd : NULL) : NULL)); return -EINVAL; diff --git a/drivers/video/msm/mdss/mdss_mdp_pp.h b/drivers/video/msm/mdss/mdss_mdp_pp.h index adb4160f046e2..6604d6ba946ca 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp.h +++ b/drivers/video/msm/mdss/mdss_mdp_pp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2015, 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 @@ -153,7 +153,7 @@ struct mdss_pp_res_type { struct mdp_hist_lut_data enhist_disp_cfg[MDSS_BLOCK_DISP_NUM]; struct mdp_dither_cfg_data dither_disp_cfg[MDSS_BLOCK_DISP_NUM]; struct mdp_gamut_cfg_data gamut_disp_cfg[MDSS_BLOCK_DISP_NUM]; - uint16_t gamut_tbl[MDSS_BLOCK_DISP_NUM][GAMUT_TOTAL_TABLE_SIZE]; + uint16_t gamut_tbl[MDSS_BLOCK_DISP_NUM][GAMUT_TOTAL_TABLE_SIZE * 3]; u32 hist_data[MDSS_BLOCK_DISP_NUM][HIST_V_SIZE]; struct pp_sts_type pp_disp_sts[MDSS_BLOCK_DISP_NUM]; /* physical info */ diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c b/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c index d1b3f1a898125..4252c9cdd6f5b 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_cache_config.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-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 @@ -103,7 +103,7 @@ static int pp_hist_lut_cache_params_v1_7(struct mdp_hist_lut_data *config, int ret = 0; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -113,7 +113,7 @@ static int pp_hist_lut_cache_params_v1_7(struct mdp_hist_lut_data *config, return -EINVAL; } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } @@ -165,7 +165,7 @@ static int pp_hist_lut_cache_params_pipe_v1_7(struct mdp_hist_lut_data *config, int ret = 0; if (!config || !pipe) { - pr_err("Invalid param config %p pipe %p\n", + pr_err("Invalid param config %pK pipe %pK\n", config, pipe); return -EINVAL; } @@ -185,8 +185,12 @@ static int pp_hist_lut_cache_params_pipe_v1_7(struct mdp_hist_lut_data *config, return -EINVAL; } - memcpy(&hist_lut_usr_config, config->cfg_payload, - sizeof(struct mdp_hist_lut_data_v1_7)); + if (copy_from_user(&hist_lut_usr_config, + (void __user *) config->cfg_payload, + sizeof(hist_lut_usr_config))) { + pr_err("failed to copy hist lut config\n"); + return -EFAULT; + } hist_lut_cache_data = pipe->pp_res.hist_lut_cfg_payload; if (!hist_lut_cache_data) { @@ -236,7 +240,7 @@ int pp_hist_lut_cache_params(struct mdp_hist_lut_data *config, int ret = 0; if (!config || !res_cache) { - pr_err("invalid param config %p res_cache %p\n", + pr_err("invalid param config %pK res_cache %pK\n", config, res_cache); return -EINVAL; } @@ -245,7 +249,7 @@ int pp_hist_lut_cache_params(struct mdp_hist_lut_data *config, return -EINVAL; } if (!res_cache->mdss_pp_res && !res_cache->pipe_res) { - pr_err("NULL payload for block %d mdss_pp_res %p pipe_res %p\n", + pr_err("NULL payload for block %d mdss_pp_res %pK pipe_res %pK\n", res_cache->block, res_cache->mdss_pp_res, res_cache->pipe_res); return -EINVAL; @@ -286,7 +290,7 @@ int pp_dither_cache_params_v1_7(struct mdp_dither_cfg_data *config, struct mdp_dither_data_v1_7 *v17_cache_data = NULL, v17_usr_config; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -296,7 +300,7 @@ int pp_dither_cache_params_v1_7(struct mdp_dither_cfg_data *config, return -EINVAL; } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } @@ -358,7 +362,7 @@ int pp_dither_cache_params(struct mdp_dither_cfg_data *config, { int ret = 0; if (!config || !mdss_pp_res) { - pr_err("invalid param config %pi pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -387,7 +391,7 @@ static int pp_gamut_cache_params_v1_7(struct mdp_gamut_cfg_data *config, int ret = 0, i = 0; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -398,7 +402,7 @@ static int pp_gamut_cache_params_v1_7(struct mdp_gamut_cfg_data *config, return -EINVAL; } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } res_cache = mdss_pp_res->pp_data_v1_7; @@ -555,7 +559,7 @@ int pp_gamut_cache_params(struct mdp_gamut_cfg_data *config, { int ret = 0; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -578,7 +582,7 @@ static int pp_pcc_cache_params_pipe_v1_7(struct mdp_pcc_cfg_data *config, struct mdp_pcc_data_v1_7 *v17_cache_data = NULL, v17_usr_config; if (!pipe || !config) { - pr_err("invalid params pipe %p config %p\n", pipe, config); + pr_err("invalid params pipe %pK config %pK\n", pipe, config); return -EINVAL; } @@ -597,8 +601,12 @@ static int pp_pcc_cache_params_pipe_v1_7(struct mdp_pcc_cfg_data *config, return -EINVAL; } - memcpy(&v17_usr_config, config->cfg_payload, - sizeof(v17_usr_config)); + if (copy_from_user(&v17_usr_config, + (void __user *) config->cfg_payload, + sizeof(v17_usr_config))) { + pr_err("failed to copy pcc config\n"); + return -EFAULT; + } if (!(config->ops & MDP_PP_OPS_WRITE)) { pr_debug("write ops not set value of flag is %d\n", @@ -636,7 +644,7 @@ static int pp_pcc_cache_params_v1_7(struct mdp_pcc_cfg_data *config, struct mdp_pcc_data_v1_7 *v17_cache_data, v17_usr_config; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -647,7 +655,7 @@ static int pp_pcc_cache_params_v1_7(struct mdp_pcc_cfg_data *config, return -EINVAL; } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } @@ -687,7 +695,7 @@ int pp_pcc_cache_params(struct mdp_pcc_cfg_data *config, { int ret = 0; if (!config || !res_cache) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, res_cache); return -EINVAL; } @@ -696,7 +704,7 @@ int pp_pcc_cache_params(struct mdp_pcc_cfg_data *config, return -EINVAL; } if (!res_cache->mdss_pp_res && !res_cache->pipe_res) { - pr_err("NULL payload for block %d mdss_pp_res %p pipe_res %p\n", + pr_err("NULL payload for block %d mdss_pp_res %pK pipe_res %pK\n", res_cache->block, res_cache->mdss_pp_res, res_cache->pipe_res); return -EINVAL; @@ -735,7 +743,7 @@ static int pp_igc_lut_cache_params_v1_7(struct mdp_igc_lut_data *config, struct mdp_igc_lut_data_v1_7 *v17_cache_data, v17_usr_config; u32 disp_num; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -745,7 +753,7 @@ static int pp_igc_lut_cache_params_v1_7(struct mdp_igc_lut_data *config, return -EINVAL; } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } res_cache = mdss_pp_res->pp_data_v1_7; @@ -781,7 +789,7 @@ static int pp_igc_lut_cache_params_v1_7(struct mdp_igc_lut_data *config, } if (copy_from_kernel && (!v17_usr_config.c0_c1_data || !v17_usr_config.c2_data)) { - pr_err("copy from kernel invalid params c0_c1_data %p c2_data %p\n", + pr_err("copy from kernel invalid params c0_c1_data %pK c2_data %pK\n", v17_usr_config.c0_c1_data, v17_usr_config.c2_data); ret = -EINVAL; @@ -837,7 +845,7 @@ static int pp_igc_lut_cache_params_pipe_v1_7(struct mdp_igc_lut_data *config, struct mdp_igc_lut_data_v1_7 *v17_cache_data = NULL, v17_usr_config; int ret = 0, fix_up = 0, i = 0; if (!config || !pipe) { - pr_err("invalid param config %p pipe %p\n", + pr_err("invalid param config %pK pipe %pK\n", config, pipe); return -EINVAL; } @@ -852,8 +860,12 @@ static int pp_igc_lut_cache_params_pipe_v1_7(struct mdp_igc_lut_data *config, goto igc_config_exit; } - memcpy(&v17_usr_config, config->cfg_payload, - sizeof(v17_usr_config)); + if (copy_from_user(&v17_usr_config, + (void __user *) config->cfg_payload, + sizeof(v17_usr_config))) { + pr_err("failed to copy igc config\n"); + return -EFAULT; + } if (!(config->ops & MDP_PP_OPS_WRITE)) { pr_debug("op for gamut %d\n", config->ops); @@ -865,7 +877,7 @@ static int pp_igc_lut_cache_params_pipe_v1_7(struct mdp_igc_lut_data *config, if (!v17_usr_config.c0_c1_data || !v17_usr_config.c2_data || v17_usr_config.len != IGC_LUT_ENTRIES) { - pr_err("invalid c0_c1data %p c2_data %p tbl len %d\n", + pr_err("invalid c0_c1data %pK c2_data %pK tbl len %d\n", v17_usr_config.c0_c1_data, v17_usr_config.c2_data, v17_usr_config.len); @@ -959,7 +971,7 @@ int pp_igc_lut_cache_params(struct mdp_igc_lut_data *config, { int ret = 0; if (!config || !res_cache) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, res_cache); return -EINVAL; } @@ -968,7 +980,7 @@ int pp_igc_lut_cache_params(struct mdp_igc_lut_data *config, return -EINVAL; } if (!res_cache->mdss_pp_res && !res_cache->pipe_res) { - pr_err("NULL payload for block %d mdss_pp_res %p pipe_res %p\n", + pr_err("NULL payload for block %d mdss_pp_res %pK pipe_res %pK\n", res_cache->block, res_cache->mdss_pp_res, res_cache->pipe_res); ret = -EINVAL; @@ -1103,7 +1115,7 @@ int pp_pgc_lut_cache_params(struct mdp_pgc_lut_data *config, { int ret = 0; if (!config || !mdss_pp_res) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -1128,7 +1140,7 @@ static int pp_pa_cache_params_v1_7(struct mdp_pa_v2_cfg_data *config, int disp_num, ret = 0; if (!config || !mdss_pp_res) { - pr_err("Invalid param config %p pp_res %p\n", + pr_err("Invalid param config %pK pp_res %pK\n", config, mdss_pp_res); return -EINVAL; } @@ -1140,7 +1152,7 @@ static int pp_pa_cache_params_v1_7(struct mdp_pa_v2_cfg_data *config, } if (!mdss_pp_res->pp_data_v1_7) { - pr_err("Invalid pp_data_v1_7 %p\n", mdss_pp_res->pp_data_v1_7); + pr_err("Invalid pp_data_v1_7 %pK\n", mdss_pp_res->pp_data_v1_7); return -EINVAL; } @@ -1228,7 +1240,7 @@ static int pp_pa_cache_params_pipe_v1_7(struct mdp_pa_v2_cfg_data *config, int ret = 0; if (!config || !pipe) { - pr_err("Invalid param config %p pipe %p\n", + pr_err("Invalid param config %pK pipe %pK\n", config, pipe); return -EINVAL; } @@ -1248,8 +1260,12 @@ static int pp_pa_cache_params_pipe_v1_7(struct mdp_pa_v2_cfg_data *config, return -EINVAL; } - memcpy(&pa_usr_config, config->cfg_payload, - sizeof(struct mdp_pa_data_v1_7)); + if (copy_from_user(&pa_usr_config, + (void __user *) config->cfg_payload, + sizeof(pa_usr_config))) { + pr_err("failed to copy pa usr config\n"); + return -EFAULT; + } pa_cache_data = pipe->pp_res.pa_cfg_payload; if (!pa_cache_data) { @@ -1284,7 +1300,7 @@ int pp_pa_cache_params(struct mdp_pa_v2_cfg_data *config, { int ret = 0; if (!config || !res_cache) { - pr_err("invalid param config %p pp_res %p\n", + pr_err("invalid param config %pK pp_res %pK\n", config, res_cache); return -EINVAL; } @@ -1293,7 +1309,7 @@ int pp_pa_cache_params(struct mdp_pa_v2_cfg_data *config, return -EINVAL; } if (!res_cache->mdss_pp_res && !res_cache->pipe_res) { - pr_err("NULL payload for block %d mdss_pp_res %p pipe_res %p\n", + pr_err("NULL payload for block %d mdss_pp_res %pK pipe_res %pK\n", res_cache->block, res_cache->mdss_pp_res, res_cache->pipe_res); return -EINVAL; @@ -1344,7 +1360,7 @@ int pp_copy_layer_igc_payload(struct mdp_overlay_pp_params *pp_info) pp_info->igc_cfg.cfg_payload, sizeof(struct mdp_igc_lut_data_v1_7)); if (ret) { - pr_err("layer list copy from user failed, IGC cfg payload = %p\n", + pr_err("layer list copy from user failed, IGC cfg payload = %pK\n", pp_info->igc_cfg.cfg_payload); ret = -EFAULT; kfree(cfg_payload); @@ -1382,7 +1398,7 @@ int pp_copy_layer_hist_lut_payload(struct mdp_overlay_pp_params *pp_info) pp_info->hist_lut_cfg.cfg_payload, sizeof(struct mdp_hist_lut_data_v1_7)); if (ret) { - pr_err("layer list copy from user failed, Hist LUT cfg payload = %p\n", + pr_err("layer list copy from user failed, Hist LUT cfg payload = %pK\n", pp_info->hist_lut_cfg.cfg_payload); ret = -EFAULT; kfree(cfg_payload); @@ -1420,7 +1436,7 @@ int pp_copy_layer_pa_payload(struct mdp_overlay_pp_params *pp_info) pp_info->pa_v2_cfg_data.cfg_payload, sizeof(struct mdp_pa_data_v1_7)); if (ret) { - pr_err("layer list copy from user failed, PA cfg payload = %p\n", + pr_err("layer list copy from user failed, PA cfg payload = %pK\n", pp_info->pa_v2_cfg_data.cfg_payload); ret = -EFAULT; kfree(cfg_payload); @@ -1458,7 +1474,7 @@ int pp_copy_layer_pcc_payload(struct mdp_overlay_pp_params *pp_info) pp_info->pcc_cfg_data.cfg_payload, sizeof(struct mdp_pcc_data_v1_7)); if (ret) { - pr_err("layer list copy from user failed, PCC cfg payload = %p\n", + pr_err("layer list copy from user failed, PCC cfg payload = %pK\n", pp_info->pcc_cfg_data.cfg_payload); ret = -EFAULT; kfree(cfg_payload); diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_common.c b/drivers/video/msm/mdss/mdss_mdp_pp_common.c index 7742b5e4ad0c9..f3eccfe957f72 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_common.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_common.c @@ -20,7 +20,7 @@ void pp_pa_set_sts(struct pp_sts_type *pp_sts, int enable_flag, int block_type) { if (!pp_sts) { - pr_err("invalid input pp_sts %p\n", pp_sts); + pr_err("invalid input pp_sts %pK\n", pp_sts); return; } @@ -34,7 +34,7 @@ void pp_pa_set_sts(struct pp_sts_type *pp_sts, } if (!pa_data) { - pr_err("invalid input pa_data %p\n", pa_data); + pr_err("invalid input pa_data %pK\n", pa_data); return; } diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c b/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c index 1470915a12532..5702fd755e54b 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_v1_7.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-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 @@ -246,7 +246,7 @@ static void pp_gamut_clock_gating_en(char __iomem *base_addr); void *pp_get_driver_ops_v1_7(struct mdp_pp_driver_ops *ops) { if (!ops) { - pr_err("PP driver ops invalid %p\n", ops); + pr_err("PP driver ops invalid %pK\n", ops); return ERR_PTR(-EINVAL); } @@ -308,7 +308,7 @@ static void pp_opmode_config(int location, struct pp_sts_type *pp_sts, u32 *opmode, int side) { if (!pp_sts || !opmode) { - pr_err("Invalid pp_sts %p or opmode %p\n", pp_sts, opmode); + pr_err("Invalid pp_sts %pK or opmode %pK\n", pp_sts, opmode); return; } switch (location) { @@ -358,11 +358,12 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, int ret = 0, i = 0; char __iomem *hist_addr; u32 sz = 0, temp = 0, *data = NULL; - struct mdp_hist_lut_data_v1_7 *lut_data = NULL; + struct mdp_hist_lut_data_v1_7 lut_data_v1_7; + struct mdp_hist_lut_data_v1_7 *lut_data = &lut_data_v1_7; struct mdp_hist_lut_data *lut_cfg_data = NULL; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -374,11 +375,15 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, } if (lut_cfg_data->version != mdp_hist_lut_v1_7 || !lut_cfg_data->cfg_payload) { - pr_err("invalid hist_lut version %d payload %p\n", + pr_err("invalid hist_lut version %d payload %pK\n", lut_cfg_data->version, lut_cfg_data->cfg_payload); return -EINVAL; } - lut_data = lut_cfg_data->cfg_payload; + if (copy_from_user(lut_data, (void __user *) lut_cfg_data->cfg_payload, + sizeof(*lut_data))) { + pr_err("copy from user failed for lut_data\n"); + return -EFAULT; + } if (lut_data->len != ENHIST_LUT_ENTRIES) { pr_err("invalid hist_lut len %d", lut_data->len); return -EINVAL; @@ -439,7 +444,7 @@ static int pp_hist_lut_set_config(char __iomem *base_addr, char __iomem *hist_addr = NULL, *swap_addr = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -465,12 +470,12 @@ static int pp_hist_lut_set_config(char __iomem *base_addr, } lut_data = lut_cfg_data->cfg_payload; if (!lut_data) { - pr_err("invalid hist_lut cfg_payload %p\n", lut_data); + pr_err("invalid hist_lut cfg_payload %pK\n", lut_data); return -EINVAL; } if (lut_data->len != ENHIST_LUT_ENTRIES || !lut_data->data) { - pr_err("invalid hist_lut len %d data %p\n", + pr_err("invalid hist_lut len %d data %pK\n", lut_data->len, lut_data->data); return -EINVAL; } @@ -535,7 +540,7 @@ static int pp_dither_set_config(char __iomem *base_addr, uint32_t *pdata = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -563,7 +568,7 @@ static int pp_dither_set_config(char __iomem *base_addr, dither_data = dither_cfg_data->cfg_payload; if (!dither_data) { - pr_err("invalid payload for dither %p\n", dither_data); + pr_err("invalid payload for dither %pK\n", dither_data); return -EINVAL; } @@ -611,7 +616,7 @@ static int pp_hist_get_config(char __iomem *base_addr, void *cfg_data, struct pp_hist_col_info *hist_info = NULL; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -649,7 +654,7 @@ static int pp_get_hist_offset(u32 block, u32 *ctl_off) int ret = 0; if (!ctl_off) { - pr_err("invalid params ctl_off %p\n", ctl_off); + pr_err("invalid params ctl_off %pK\n", ctl_off); return -EINVAL; } switch (block) { @@ -670,7 +675,7 @@ static int pp_get_hist_offset(u32 block, u32 *ctl_off) static int pp_get_hist_isr(u32 *isr_mask) { if (!isr_mask) { - pr_err("invalid params isr_mask %p\n", isr_mask); + pr_err("invalid params isr_mask %pK\n", isr_mask); return -EINVAL; } @@ -696,7 +701,7 @@ static int pp_gamut_get_config(char __iomem *base_addr, void *cfg_data, u32 clk_gate_disable = 0; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -833,8 +838,10 @@ static int pp_gamut_set_config(char __iomem *base_addr, struct mdp_gamut_cfg_data *gamut_cfg_data = NULL; struct mdp_gamut_data_v1_7 *gamut_data = NULL; char __iomem *base_addr_scale = base_addr; + uint64_t gamut_val; + if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -856,7 +863,7 @@ static int pp_gamut_set_config(char __iomem *base_addr, gamut_data = (struct mdp_gamut_data_v1_7 *) gamut_cfg_data->cfg_payload; if (!gamut_data) { - pr_err("invalid payload for gamut %p\n", gamut_data); + pr_err("invalid payload for gamut %pK\n", gamut_data); return -EINVAL; } @@ -875,7 +882,7 @@ static int pp_gamut_set_config(char __iomem *base_addr, for (i = 0; i < MDP_GAMUT_TABLE_NUM_V1_7; i++) { if (!gamut_data->c0_data[i] || !gamut_data->c1_c2_data[i] || (gamut_data->tbl_size[i] != tbl_sz)) { - pr_err("invalid param for c0 %p c1c2 %p table %d size %d expected sz %d\n", + pr_err("invalid param for c0 %pK c1c2 %pK table %d size %d expected sz %d\n", gamut_data->c0_data[i], gamut_data->c1_c2_data[i], i, gamut_data->tbl_size[i], tbl_sz); @@ -886,7 +893,7 @@ static int pp_gamut_set_config(char __iomem *base_addr, (!gamut_data->scale_off_data[i] || (gamut_data->tbl_scale_off_sz[i] != MDP_GAMUT_SCALE_OFF_SZ))) { - pr_err("invalid param for scale table %p for c%d size %d expected size%d\n", + pr_err("invalid param for scale table %pK for c%d size %d expected size%d\n", gamut_data->scale_off_data[i], i, gamut_data->tbl_scale_off_sz[i], MDP_GAMUT_SCALE_OFF_SZ); @@ -900,12 +907,18 @@ static int pp_gamut_set_config(char __iomem *base_addr, val = index_start; val |= GAMUT_TABLE_SELECT(i); writel_relaxed(val, (base_addr + GAMUT_TABLE_INDEX)); - for (j = 0; j < gamut_data->tbl_size[i]; j++) { - writel_relaxed(gamut_data->c1_c2_data[i][j], - base_addr + GAMUT_TABLE_LOWER_GB); - writel_relaxed(gamut_data->c0_data[i][j], - base_addr + GAMUT_TABLE_UPPER_R); + + writel_relaxed(gamut_data->c1_c2_data[i][0], + base_addr + GAMUT_TABLE_LOWER_GB); + for (j = 0; j < gamut_data->tbl_size[i] - 1; j++) { + gamut_val = gamut_data->c1_c2_data[i][j + 1]; + gamut_val = (gamut_val << 32) | + gamut_data->c0_data[i][j]; + writeq_relaxed(gamut_val, + base_addr + GAMUT_TABLE_UPPER_R); } + writel_relaxed(gamut_data->c0_data[i][j], + base_addr + GAMUT_TABLE_UPPER_R); if ((i >= MDP_GAMUT_SCALE_OFF_TABLE_NUM) || (!gamut_data->map_en)) continue; @@ -951,7 +964,7 @@ static int pp_pcc_set_config(char __iomem *base_addr, u32 opmode = 0; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -966,7 +979,7 @@ static int pp_pcc_set_config(char __iomem *base_addr, } pcc_data = pcc_cfg_data->cfg_payload; if (!pcc_data) { - pr_err("invalid payload for pcc %p\n", pcc_data); + pr_err("invalid payload for pcc %pK\n", pcc_data); return -EINVAL; } @@ -1036,7 +1049,7 @@ static int pp_pcc_get_config(char __iomem *base_addr, void *cfg_data, struct mdp_pcc_data_v1_7 pcc_data; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -1233,7 +1246,7 @@ static void pp_pa_set_six_zone(char __iomem *base_addr, if (!pa_data->six_zone_len || !pa_data->six_zone_curve_p0 || !pa_data->six_zone_curve_p1) { - pr_err("Invalid six zone data: len %d curve_p0 %p curve_p1 %p\n", + pr_err("Invalid six zone data: len %d curve_p0 %pK curve_p1 %pK\n", pa_data->six_zone_len, pa_data->six_zone_curve_p0, pa_data->six_zone_curve_p1); @@ -1283,7 +1296,7 @@ static int pp_pa_set_config(char __iomem *base_addr, int ret = 0; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -1308,7 +1321,7 @@ static int pp_pa_set_config(char __iomem *base_addr, pa_data = pa_cfg_data->cfg_payload; if (!pa_data) { - pr_err("invalid payload for pa %p\n", pa_data); + pr_err("invalid payload for pa %pK\n", pa_data); return -EINVAL; } @@ -1557,7 +1570,7 @@ static int pp_pa_get_config(char __iomem *base_addr, void *cfg_data, char __iomem *pa_hold_addr = NULL; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -1690,7 +1703,7 @@ static int pp_igc_set_config(char __iomem *base_addr, u32 data; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -1698,7 +1711,7 @@ static int pp_igc_set_config(char __iomem *base_addr, lut_cfg_data = (struct mdp_igc_lut_data *) cfg_data; if (lut_cfg_data->version != mdp_igc_v1_7 || !lut_cfg_data->cfg_payload) { - pr_err_once("invalid igc version %d payload %p\n", + pr_err_once("invalid igc version %d payload %pK\n", lut_cfg_data->version, lut_cfg_data->cfg_payload); return -EINVAL; } @@ -1717,7 +1730,7 @@ static int pp_igc_set_config(char __iomem *base_addr, lut_data = lut_cfg_data->cfg_payload; if (lut_data->len != IGC_LUT_ENTRIES || !lut_data->c0_c1_data || !lut_data->c2_data) { - pr_err("invalid lut len %d c0_c1_data %p c2_data %p\n", + pr_err("invalid lut len %d c0_c1_data %pK c2_data %pK\n", lut_data->len, lut_data->c0_c1_data, lut_data->c2_data); return -EINVAL; } @@ -1778,13 +1791,14 @@ static int pp_igc_get_config(char __iomem *base_addr, void *cfg_data, { int ret = 0, i = 0; struct mdp_igc_lut_data *lut_cfg_data = NULL; - struct mdp_igc_lut_data_v1_7 *lut_data = NULL; + struct mdp_igc_lut_data_v1_7 lut_data_v1_7; + struct mdp_igc_lut_data_v1_7 *lut_data = &lut_data_v1_7; char __iomem *c1 = NULL, *c2 = NULL; u32 *c0c1_data = NULL, *c2_data = NULL; u32 data = 0, sz = 0; if (!base_addr || !cfg_data || block_type != DSPP) { - pr_err("invalid params base_addr %p cfg_data %p block_type %d\n", + pr_err("invalid params base_addr %pK cfg_data %pK block_type %d\n", base_addr, cfg_data, block_type); return -EINVAL; } @@ -1796,13 +1810,17 @@ static int pp_igc_get_config(char __iomem *base_addr, void *cfg_data, if (lut_cfg_data->version != mdp_igc_v1_7 || !lut_cfg_data->cfg_payload || lut_cfg_data->block > IGC_MASK_MAX) { - pr_err("invalid igc version %d payload %p block %d\n", + pr_err("invalid igc version %d payload %pK block %d\n", lut_cfg_data->version, lut_cfg_data->cfg_payload, lut_cfg_data->block); ret = -EINVAL; goto exit; } - lut_data = lut_cfg_data->cfg_payload; + if (copy_from_user(lut_data, (void __user *) lut_cfg_data->cfg_payload, + sizeof(*lut_data))) { + pr_err("copy from user failed for lut_data\n"); + return -EFAULT; + } if (lut_data->len != IGC_LUT_ENTRIES) { pr_err("invalid lut len %d\n", lut_data->len); ret = -EINVAL; @@ -1861,7 +1879,7 @@ static int pp_pgc_set_config(char __iomem *base_addr, struct mdp_pgc_lut_data_v1_7 *pgc_data_v17 = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -1887,13 +1905,13 @@ static int pp_pgc_set_config(char __iomem *base_addr, pgc_data_v17 = (struct mdp_pgc_lut_data_v1_7 *) pgc_data->cfg_payload; if (!pgc_data_v17) { - pr_err("invalid payload for GC %p\n", pgc_data_v17); + pr_err("invalid payload for GC %pK\n", pgc_data_v17); return -EINVAL; } if (pgc_data_v17->len != PGC_LUT_ENTRIES || !pgc_data_v17->c0_data || !pgc_data_v17->c1_data || !pgc_data_v17->c2_data) { - pr_err("Invalid params entries %d c0_data %p c1_data %p c2_data %p\n", + pr_err("Invalid params entries %d c0_data %pK c1_data %pK c2_data %pK\n", pgc_data_v17->len, pgc_data_v17->c0_data, pgc_data_v17->c1_data, pgc_data_v17->c2_data); return -EINVAL; @@ -1946,20 +1964,24 @@ static int pp_pgc_get_config(char __iomem *base_addr, void *cfg_data, u32 *c0_data = NULL, *c1_data = NULL, *c2_data = NULL; u32 val = 0, i = 0, sz = 0; struct mdp_pgc_lut_data *pgc_data = NULL; - struct mdp_pgc_lut_data_v1_7 *pgc_data_v17 = NULL; + struct mdp_pgc_lut_data_v1_7 pgc_lut_data_v17; + struct mdp_pgc_lut_data_v1_7 *pgc_data_v17 = &pgc_lut_data_v17; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p block_type %d\n", + pr_err("invalid params base_addr %pK cfg_data %pK block_type %d\n", base_addr, cfg_data, block_type); return -EINVAL; } pgc_data = (struct mdp_pgc_lut_data *) cfg_data; - pgc_data_v17 = (struct mdp_pgc_lut_data_v1_7 *) - pgc_data->cfg_payload; - if (pgc_data->version != mdp_pgc_v1_7 || !pgc_data_v17) { - pr_err("invalid pgc version %d payload %p\n", - pgc_data->version, pgc_data_v17); + if (pgc_data->version != mdp_pgc_v1_7 || !pgc_data->cfg_payload) { + pr_err("invalid pgc version %d payload %pK\n", + pgc_data->version, pgc_data->cfg_payload); return -EINVAL; } + if (copy_from_user(pgc_data_v17, (void __user *) pgc_data->cfg_payload, + sizeof(*pgc_data_v17))) { + pr_err("copy from user failed for pgc lut data\n"); + return -EFAULT; + } if (!(pgc_data->flags & MDP_PP_OPS_READ)) { pr_info("read ops is not set %d", pgc_data->flags); return -EINVAL; @@ -2018,7 +2040,7 @@ static int pp_pgc_get_config(char __iomem *base_addr, void *cfg_data, static int pp_pcc_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_pcc_v1_7; @@ -2028,7 +2050,7 @@ static int pp_pcc_get_version(u32 *version) static int pp_igc_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_igc_v1_7; @@ -2038,7 +2060,7 @@ static int pp_igc_get_version(u32 *version) static int pp_pgc_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_pgc_v1_7; @@ -2048,7 +2070,7 @@ static int pp_pgc_get_version(u32 *version) static int pp_pa_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_pa_v1_7; @@ -2058,7 +2080,7 @@ static int pp_pa_get_version(u32 *version) static int pp_gamut_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_gamut_v1_7; @@ -2068,7 +2090,7 @@ static int pp_gamut_get_version(u32 *version) static int pp_dither_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_dither_v1_7; @@ -2078,7 +2100,7 @@ static int pp_dither_get_version(u32 *version) static int pp_hist_lut_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_hist_lut_v1_7; diff --git a/drivers/video/msm/mdss/mdss_mdp_pp_v3.c b/drivers/video/msm/mdss/mdss_mdp_pp_v3.c index 4920c5387e2c0..c01e97d4c5947 100644 --- a/drivers/video/msm/mdss/mdss_mdp_pp_v3.c +++ b/drivers/video/msm/mdss/mdss_mdp_pp_v3.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-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 @@ -117,7 +117,7 @@ void *pp_get_driver_ops_v3(struct mdp_pp_driver_ops *ops) void *pp_cfg = NULL; if (!ops) { - pr_err("PP driver ops invalid %p\n", ops); + pr_err("PP driver ops invalid %pK\n", ops); return ERR_PTR(-EINVAL); } @@ -158,7 +158,7 @@ static int pp_get_hist_offset(u32 block, u32 *ctl_off) int ret = 0; if (!ctl_off) { - pr_err("invalid params ctl_off %p\n", ctl_off); + pr_err("invalid params ctl_off %pK\n", ctl_off); return -EINVAL; } @@ -184,7 +184,7 @@ static int pp_hist_set_config(char __iomem *base_addr, struct pp_hist_col_info *hist_info = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -220,7 +220,7 @@ static int pp_hist_get_config(char __iomem *base_addr, void *cfg_data, char __iomem *hist_addr; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -249,11 +249,12 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, int ret = 0, i = 0; char __iomem *hist_lut_addr; u32 sz = 0, temp = 0, *data = NULL; - struct mdp_hist_lut_data_v1_7 *lut_data = NULL; + struct mdp_hist_lut_data_v1_7 lut_data_v1_7; + struct mdp_hist_lut_data_v1_7 *lut_data = &lut_data_v1_7; struct mdp_hist_lut_data *lut_cfg_data = NULL; if (!base_addr || !cfg_data) { - pr_err("invalid params base_addr %p cfg_data %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK\n", base_addr, cfg_data); return -EINVAL; } @@ -270,11 +271,15 @@ static int pp_hist_lut_get_config(char __iomem *base_addr, void *cfg_data, } if (lut_cfg_data->version != mdp_hist_lut_v1_7 || !lut_cfg_data->cfg_payload) { - pr_err("invalid hist_lut version %d payload %p\n", + pr_err("invalid hist_lut version %d payload %pK\n", lut_cfg_data->version, lut_cfg_data->cfg_payload); return -EINVAL; } - lut_data = lut_cfg_data->cfg_payload; + if (copy_from_user(lut_data, (void __user *) lut_cfg_data->cfg_payload, + sizeof(*lut_data))) { + pr_err("copy from user failed for lut_data\n"); + return -EFAULT; + } if (lut_data->len != ENHIST_LUT_ENTRIES) { pr_err("invalid hist_lut len %d", lut_data->len); return -EINVAL; @@ -317,7 +322,7 @@ static int pp_hist_lut_set_config(char __iomem *base_addr, char __iomem *hist_lut_addr = NULL, *swap_addr = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -344,12 +349,12 @@ static int pp_hist_lut_set_config(char __iomem *base_addr, } lut_data = lut_cfg_data->cfg_payload; if (!lut_data) { - pr_err("invalid hist_lut cfg_payload %p\n", lut_data); + pr_err("invalid hist_lut cfg_payload %pK\n", lut_data); return -EINVAL; } if (lut_data->len != ENHIST_LUT_ENTRIES || !lut_data->data) { - pr_err("invalid hist_lut len %d data %p\n", + pr_err("invalid hist_lut len %d data %pK\n", lut_data->len, lut_data->data); return -EINVAL; } @@ -386,7 +391,7 @@ static int pp_hist_lut_set_config(char __iomem *base_addr, static int pp_hist_lut_get_version(u32 *version) { if (!version) { - pr_err("invalid param version %p\n", version); + pr_err("invalid param version %pK\n", version); return -EINVAL; } *version = mdp_hist_lut_v1_7; @@ -399,7 +404,7 @@ static void pp_hist_lut_opmode_config(char __iomem *base_addr, u32 opmode = 0; if (!base_addr || !pp_sts) { - pr_err("invalid params base_addr %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK pp_sts_type %pK\n", base_addr, pp_sts); return; } @@ -428,7 +433,7 @@ static int pp_pa_set_config(char __iomem *base_addr, char __iomem *block_addr = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -459,7 +464,7 @@ static int pp_pa_set_config(char __iomem *base_addr, pa_data = pa_cfg_data->cfg_payload; if (!pa_data) { - pr_err("invalid payload for pa %p\n", pa_data); + pr_err("invalid payload for pa %pK\n", pa_data); return -EINVAL; } @@ -508,7 +513,7 @@ static int pp_dither_set_config(char __iomem *base_addr, char __iomem *dither_opmode = NULL; if (!base_addr || !cfg_data || !pp_sts) { - pr_err("invalid params base_addr %p cfg_data %p pp_sts_type %p\n", + pr_err("invalid params base_addr %pK cfg_data %pK pp_sts_type %pK\n", base_addr, cfg_data, pp_sts); return -EINVAL; } @@ -537,7 +542,7 @@ static int pp_dither_set_config(char __iomem *base_addr, dither_data = dither_cfg_data->cfg_payload; if (!dither_data) { - pr_err("invalid payload for dither %p\n", dither_data); + pr_err("invalid payload for dither %pK\n", dither_data); return -EINVAL; } @@ -592,7 +597,7 @@ static void pp_opmode_config(int location, struct pp_sts_type *pp_sts, u32 *opmode, int side) { if (!pp_sts || !opmode) { - pr_err("Invalid pp_sts %p or opmode %p\n", pp_sts, opmode); + pr_err("Invalid pp_sts %pK or opmode %pK\n", pp_sts, opmode); return; } switch (location) { @@ -726,7 +731,7 @@ static void pp_pa_set_six_zone(char __iomem *base_addr, if (pa_data->six_zone_len != MDP_SIX_ZONE_LUT_SIZE || !pa_data->six_zone_curve_p0 || !pa_data->six_zone_curve_p1) { - pr_err("Invalid six zone data: len %d curve_p0 %p curve_p1 %p\n", + pr_err("Invalid six zone data: len %d curve_p0 %pK curve_p1 %pK\n", pa_data->six_zone_len, pa_data->six_zone_curve_p0, pa_data->six_zone_curve_p1); diff --git a/drivers/video/msm/mdss/mdss_mdp_util.c b/drivers/video/msm/mdss/mdss_mdp_util.c index 3a904b8242c42..bffc13184c1f8 100644 --- a/drivers/video/msm/mdss/mdss_mdp_util.c +++ b/drivers/video/msm/mdss/mdss_mdp_util.c @@ -931,7 +931,7 @@ static int mdss_mdp_put_img(struct mdss_mdp_img_data *data, bool rotator, pr_debug("pmem buf=0x%pa\n", &data->addr); memset(&data->srcp_f, 0, sizeof(struct fd)); } else if (!IS_ERR_OR_NULL(data->srcp_dma_buf)) { - pr_debug("ion hdl=%p buf=0x%pa\n", data->srcp_dma_buf, + pr_debug("ion hdl=%pK buf=0x%pa\n", data->srcp_dma_buf, &data->addr); if (!iclient) { pr_err("invalid ion client\n"); @@ -1086,7 +1086,7 @@ static int mdss_mdp_get_img(struct msmfb_data *img, return ret; } } - if (!*start) { + if (start && !*start) { pr_err("start address is zero!\n"); mdss_mdp_put_img(data, rotator, dir); return -ENOMEM; @@ -1096,8 +1096,9 @@ static int mdss_mdp_get_img(struct msmfb_data *img, data->addr += data->offset; data->len -= data->offset; - pr_debug("mem=%d ihdl=%p buf=0x%pa len=0x%lx\n", img->memory_id, - data->srcp_dma_buf, &data->addr, data->len); + pr_debug("mem=%d ihdl=%pK buf=0x%pa len=0x%lx\n", + img->memory_id, data->srcp_dma_buf, &data->addr, + data->len); } else { mdss_mdp_put_img(data, rotator, dir); return ret ? : -EOVERFLOW; @@ -1161,7 +1162,7 @@ static int mdss_mdp_map_buffer(struct mdss_mdp_img_data *data, bool rotator, data->addr += data->offset; data->len -= data->offset; - pr_debug("ihdl=%p buf=0x%pa len=0x%lx\n", + pr_debug("ihdl=%pK buf=0x%pa len=0x%lx\n", data->srcp_dma_buf, &data->addr, data->len); } else { mdss_mdp_put_img(data, rotator, dir); diff --git a/drivers/video/msm/mdss/mdss_mdp_wfd.c b/drivers/video/msm/mdss/mdss_mdp_wfd.c index 398f5406cdf39..7c02238f68e44 100644 --- a/drivers/video/msm/mdss/mdss_mdp_wfd.c +++ b/drivers/video/msm/mdss/mdss_mdp_wfd.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -300,6 +300,12 @@ static int mdss_mdp_wfd_import_data(struct device *device, if (wfd_data->layer.flags & MDP_LAYER_SECURE_SESSION) flags = MDP_SECURE_OVERLAY_SESSION; + if (buffer->plane_count > MAX_PLANES) { + pr_err("buffer plane_count exceeds MAX_PLANES limit:%d", + buffer->plane_count); + return -EINVAL; + } + memset(planes, 0, sizeof(planes)); for (i = 0; i < buffer->plane_count; i++) { diff --git a/drivers/video/msm/mdss/mdss_panel.h b/drivers/video/msm/mdss/mdss_panel.h index 00ad560627b58..fa32966044704 100644 --- a/drivers/video/msm/mdss/mdss_panel.h +++ b/drivers/video/msm/mdss/mdss_panel.h @@ -55,6 +55,9 @@ struct panel_id { #define DSC_PPS_LEN 128 +/* HDR propeties count */ +#define DISPLAY_PRIMARIES_COUNT 8 /* WRGB x and y values*/ + static inline const char *mdss_panel2str(u32 panel) { static const char const *names[] = { @@ -106,12 +109,6 @@ enum { MDSS_PANEL_POWER_LP2, }; -enum { - MDSS_PANEL_BLANK_BLANK = 0, - MDSS_PANEL_BLANK_UNBLANK, - MDSS_PANEL_BLANK_LOW_POWER, -}; - enum { MODE_GPIO_NOT_VALID = 0, MODE_GPIO_HIGH, @@ -164,7 +161,7 @@ enum { }; struct mdss_intf_recovery { - void (*fxn)(void *ctx, int event); + int (*fxn)(void *ctx, int event); void *data; }; @@ -588,6 +585,19 @@ struct mdss_panel_roi_alignment { u32 min_height; }; +struct mdss_panel_hdr_properties { + bool hdr_enabled; + + /* WRGB X and y values arrayed in format */ + /* [WX, WY, RX, RY, GX, GY, BX, BY] */ + u32 display_primaries[DISPLAY_PRIMARIES_COUNT]; + + /* peak brightness supported by panel */ + u32 peak_brightness; + /* Blackness level supported by panel */ + u32 blackness_level; +}; + struct mdss_panel_info { u32 xres; u32 yres; @@ -610,11 +620,13 @@ struct mdss_panel_info { u32 out_format; u32 rst_seq[MDSS_DSI_RST_SEQ_LEN]; u32 rst_seq_len; + u32 pwr_off_rst_pull_high; u32 vic; /* video identification code */ struct mdss_rect roi; int pwm_pmic_gpio; int pwm_lpg_chan; int pwm_period; + unsigned int cabcmode; bool dynamic_fps; bool ulps_feature_enabled; bool ulps_suspend_enabled; @@ -721,6 +733,11 @@ struct mdss_panel_info { /* debugfs structure for the panel */ struct mdss_panel_debugfs_info *debugfs_info; + u64 kickoff_count; + u64 panel_active; + + /* HDR properties of display panel*/ + struct mdss_panel_hdr_properties hdr_properties; }; struct mdss_panel_timing { diff --git a/drivers/video/msm/mdss/mdss_rotator.c b/drivers/video/msm/mdss/mdss_rotator.c index ea7bc7bbec3f5..c6be47c555320 100644 --- a/drivers/video/msm/mdss/mdss_rotator.c +++ b/drivers/video/msm/mdss/mdss_rotator.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -373,6 +373,15 @@ static bool mdss_rotator_is_work_pending(struct mdss_rot_mgr *mgr, return false; } +static void mdss_rotator_install_fence_fd(struct mdss_rot_entry_container *req) +{ + int i = 0; + + for (i = 0; i < req->count; i++) + sync_fence_install(req->entries[i].output_fence, + req->entries[i].output_fence_fd); +} + static int mdss_rotator_create_fence(struct mdss_rot_entry *entry) { int ret = 0, fd; @@ -411,7 +420,6 @@ static int mdss_rotator_create_fence(struct mdss_rot_entry *entry) goto get_fd_err; } - sync_fence_install(fence, fd); rot_timeline->next_value++; mutex_unlock(&rot_timeline->lock); @@ -501,6 +509,12 @@ static int mdss_rotator_import_buffer(struct mdp_layer_buffer *buffer, memset(planes, 0, sizeof(planes)); + if (buffer->plane_count > MAX_PLANES) { + pr_err("buffer plane_count exceeds MAX_PLANES limit:%d\n", + buffer->plane_count); + return -EINVAL; + } + for (i = 0; i < buffer->plane_count; i++) { planes[i].memory_id = buffer->planes[i].fd; planes[i].offset = buffer->planes[i].offset; @@ -1034,8 +1048,16 @@ static int mdss_rotator_calc_perf(struct mdss_rot_perf *perf) pr_err("invalid output format\n"); return -EINVAL; } + if (!config->input.width || + (0xffffffff/config->input.width < config->input.height)) + return -EINVAL; perf->clk_rate = config->input.width * config->input.height; + + if (!perf->clk_rate || + (0xffffffff/perf->clk_rate < config->frame_rate)) + return -EINVAL; + perf->clk_rate *= config->frame_rate; /* rotator processes 4 pixels per clock */ perf->clk_rate /= 4; @@ -1104,6 +1126,7 @@ static void mdss_rotator_release_from_work_distribution( bool free_perf = false; u32 wb_idx = entry->queue->hw->wb_id; + mutex_lock(&mgr->lock); mutex_lock(&entry->perf->work_dis_lock); if (entry->perf->work_distribution[wb_idx]) entry->perf->work_distribution[wb_idx]--; @@ -1127,6 +1150,7 @@ static void mdss_rotator_release_from_work_distribution( mdss_rotator_clk_ctrl(mgr, false); entry->perf = NULL; } + mutex_unlock(&mgr->lock); } } @@ -2023,7 +2047,6 @@ static int mdss_rotator_close_session(struct mdss_rot_mgr *mgr, list_del_init(&perf->list); mutex_unlock(&perf->work_dis_lock); mutex_unlock(&private->perf_lock); - mutex_unlock(&mgr->lock); if (offload_release_work) goto done; @@ -2036,6 +2059,7 @@ static int mdss_rotator_close_session(struct mdss_rot_mgr *mgr, done: pr_debug("Closed session id:%u", id); ATRACE_END(__func__); + mutex_unlock(&mgr->lock); return 0; } @@ -2059,10 +2083,12 @@ static int mdss_rotator_config_session(struct mdss_rot_mgr *mgr, return ret; } + mutex_lock(&mgr->lock); perf = mdss_rotator_find_session(private, config.session_id); if (!perf) { pr_err("No session with id=%u could be found\n", config.session_id); + mutex_unlock(&mgr->lock); return -EINVAL; } @@ -2085,6 +2111,7 @@ static int mdss_rotator_config_session(struct mdss_rot_mgr *mgr, config.output.format); done: ATRACE_END(__func__); + mutex_unlock(&mgr->lock); return ret; } @@ -2095,6 +2122,20 @@ struct mdss_rot_entry_container *mdss_rotator_req_init( struct mdss_rot_entry_container *req; int size, i; + /* + * Check input and output plane_count from each given item + * are within the MAX_PLANES limit + */ + for (i = 0 ; i < count; i++) { + if ((items[i].input.plane_count > MAX_PLANES) || + (items[i].output.plane_count > MAX_PLANES)) { + pr_err("Input/Output plane_count exceeds MAX_PLANES limit, input:%d, output:%d\n", + items[i].input.plane_count, + items[i].output.plane_count); + return ERR_PTR(-EINVAL); + } + } + size = sizeof(struct mdss_rot_entry_container); size += sizeof(struct mdss_rot_entry) * count; req = devm_kzalloc(&mgr->pdev->dev, size, GFP_KERNEL); @@ -2148,6 +2189,12 @@ static int mdss_rotator_handle_request(struct mdss_rot_mgr *mgr, struct mdss_rot_entry_container *req = NULL; int size, ret; uint32_t req_count; + struct mdss_data_type *mdata = mdss_mdp_get_mdata(); + + if (mdata->handoff_pending) { + pr_err("Rotator request failed. Handoff pending\n"); + return -EPERM; + } if (mdss_get_sd_client_cnt()) { pr_err("rot request not permitted during secure display session\n"); @@ -2211,6 +2258,7 @@ static int mdss_rotator_handle_request(struct mdss_rot_mgr *mgr, goto handle_request_err1; } + mdss_rotator_install_fence_fd(req); mdss_rotator_queue_request(mgr, private, req); mutex_unlock(&mgr->lock); @@ -2371,6 +2419,7 @@ static int mdss_rotator_handle_request32(struct mdss_rot_mgr *mgr, goto handle_request32_err1; } + mdss_rotator_install_fence_fd(req); mdss_rotator_queue_request(mgr, private, req); mutex_unlock(&mgr->lock); diff --git a/drivers/video/msm/mdss/mdss_smmu.c b/drivers/video/msm/mdss/mdss_smmu.c index 4a99cf5cc5b3a..a609b44a1eca4 100644 --- a/drivers/video/msm/mdss/mdss_smmu.c +++ b/drivers/video/msm/mdss/mdss_smmu.c @@ -36,6 +36,8 @@ #include "mdss_smmu.h" #include "mdss_debug.h" +#define SZ_4G 0xF0000000 + static DEFINE_MUTEX(mdp_iommu_lock); void mdss_iommu_lock(void) @@ -327,7 +329,7 @@ static void mdss_smmu_unmap_dma_buf_v2(struct sg_table *table, int domain, * bank device */ static int mdss_smmu_dma_alloc_coherent_v2(struct device *dev, size_t size, - dma_addr_t *phys, dma_addr_t *iova, void *cpu_addr, + dma_addr_t *phys, dma_addr_t *iova, void **cpu_addr, gfp_t gfp, int domain) { struct mdss_smmu_client *mdss_smmu = mdss_smmu_get_cb(domain); @@ -336,8 +338,8 @@ static int mdss_smmu_dma_alloc_coherent_v2(struct device *dev, size_t size, return -EINVAL; } - cpu_addr = dma_alloc_coherent(mdss_smmu->dev, size, iova, gfp); - if (!cpu_addr) { + *cpu_addr = dma_alloc_coherent(mdss_smmu->dev, size, iova, gfp); + if (!*cpu_addr) { pr_err("dma alloc coherent failed!\n"); return -ENOMEM; } @@ -537,13 +539,13 @@ int mdss_smmu_init(struct mdss_data_type *mdata, struct device *dev) } static struct mdss_smmu_domain mdss_mdp_unsec = { - "mdp_0", MDSS_IOMMU_DOMAIN_UNSECURE, SZ_128K, (SZ_1G - SZ_128K)}; + "mdp_0", MDSS_IOMMU_DOMAIN_UNSECURE, SZ_1M, (SZ_4G - SZ_1M)}; static struct mdss_smmu_domain mdss_rot_unsec = { - NULL, MDSS_IOMMU_DOMAIN_ROT_UNSECURE, SZ_128K, (SZ_1G - SZ_128K)}; + NULL, MDSS_IOMMU_DOMAIN_ROT_UNSECURE, SZ_1M, (SZ_4G - SZ_1M)}; static struct mdss_smmu_domain mdss_mdp_sec = { - "mdp_1", MDSS_IOMMU_DOMAIN_SECURE, SZ_1G, SZ_2G}; + "mdp_1", MDSS_IOMMU_DOMAIN_SECURE, SZ_1M, (SZ_4G - SZ_1M)}; static struct mdss_smmu_domain mdss_rot_sec = { - NULL, MDSS_IOMMU_DOMAIN_ROT_SECURE, SZ_1G, SZ_2G}; + NULL, MDSS_IOMMU_DOMAIN_ROT_SECURE, SZ_1M, (SZ_4G - SZ_1M)}; static const struct of_device_id mdss_smmu_dt_match[] = { { .compatible = "qcom,smmu_mdp_unsec", .data = &mdss_mdp_unsec}, diff --git a/drivers/video/msm/mdss/mdss_smmu.h b/drivers/video/msm/mdss/mdss_smmu.h index 19ec3d2d1e2dd..1e15d7036a7aa 100644 --- a/drivers/video/msm/mdss/mdss_smmu.h +++ b/drivers/video/msm/mdss/mdss_smmu.h @@ -201,7 +201,7 @@ static inline void mdss_smmu_unmap_dma_buf(struct sg_table *table, int domain, } static inline int mdss_smmu_dma_alloc_coherent(struct device *dev, size_t size, - dma_addr_t *phys, dma_addr_t *iova, void *cpu_addr, + dma_addr_t *phys, dma_addr_t *iova, void **cpu_addr, gfp_t gfp, int domain) { struct mdss_data_type *mdata = mdss_mdp_get_mdata(); diff --git a/drivers/video/msm/mdss/mdss_util.c b/drivers/video/msm/mdss/mdss_util.c index db318de6fc6d7..d2610ff808789 100644 --- a/drivers/video/msm/mdss/mdss_util.c +++ b/drivers/video/msm/mdss/mdss_util.c @@ -33,7 +33,7 @@ int mdss_register_irq(struct mdss_hw *hw) if (!mdss_irq_handlers[hw->hw_ndx]) mdss_irq_handlers[hw->hw_ndx] = hw; else - pr_err("panel %d's irq at %p is already registered\n", + pr_err("panel %d's irq at %pK is already registered\n", hw->hw_ndx, hw->irq_handler); spin_unlock_irqrestore(&mdss_lock, irq_flags); diff --git a/drivers/video/msm/mdss/mhl3/mhl_linux_tx.c b/drivers/video/msm/mdss/mhl3/mhl_linux_tx.c index 1514f021414ad..04ba7a00bb2bc 100644 --- a/drivers/video/msm/mdss/mhl3/mhl_linux_tx.c +++ b/drivers/video/msm/mdss/mhl3/mhl_linux_tx.c @@ -5599,7 +5599,7 @@ static int is_timer_handle_valid(struct mhl_dev_context *dev_context, } if (timer != timer_handle) { - MHL_TX_DBG_WARN("Invalid timer handle %p received\n", + MHL_TX_DBG_WARN("Invalid timer handle %pK received\n", timer_handle); return -EINVAL; } diff --git a/drivers/video/msm/mdss/mhl3/mhl_supp.c b/drivers/video/msm/mdss/mhl3/mhl_supp.c index 7055d8cd758dd..29de6d0b6401a 100644 --- a/drivers/video/msm/mdss/mhl3/mhl_supp.c +++ b/drivers/video/msm/mdss/mhl3/mhl_supp.c @@ -185,7 +185,7 @@ static struct cbus_req *get_free_cbus_queue_entry_impl( req->function = function; req->line = line; req->sequence = dev_context->sequence++; - /*MHL_TX_DBG_ERR(,"q %d get:0x%p %s:%d\n", + /*MHL_TX_DBG_ERR(,"q %d get:0x%pK %s:%d\n", req->sequence,req,function,line); */ return req; } @@ -197,7 +197,7 @@ static void return_cbus_queue_entry_impl(struct mhl_dev_context *dev_context, struct cbus_req *pReq, const char *function, int line) { - /* MHL_TX_DBG_ERR(,"q ret:0x%p %s:%d\n",pReq,function,line); */ + /* MHL_TX_DBG_ERR(,"q ret:0x%pK %s:%d\n",pReq,function,line); */ list_add(&pReq->link, &dev_context->cbus_free_list); } @@ -372,7 +372,7 @@ static struct block_req *start_new_block_marshalling_req_impl( sizeof(payload->as_bytes) - sizeof(struct SI_PACK_THIS_STRUCT standard_transport_header_t); dev_context->block_protocol.marshalling_req = req; - MHL_TX_DBG_WARN("q %d get:0x%p %s:%d\n", req->sequence, req, function, + MHL_TX_DBG_WARN("q %d get:0x%pK %s:%d\n", req->sequence, req, function, line); return req; } @@ -384,7 +384,7 @@ static void return_block_queue_entry_impl(struct mhl_dev_context *dev_context, struct block_req *pReq, const char *function, int line) { - /* MHL_TX_DBG_ERR(,"q ret:0x%p %s:%d\n",pReq,function,line); */ + /* MHL_TX_DBG_ERR(,"q ret:0x%pK %s:%d\n",pReq,function,line); */ list_add(&pReq->link, &dev_context->block_protocol.free_list); } @@ -1283,7 +1283,7 @@ void si_mhl_tx_drive_states(struct mhl_dev_context *dev_context) if (req == NULL) return; - MHL_TX_DBG_INFO("req: %p\n", req); + MHL_TX_DBG_INFO("req: %pK\n", req); /* coordinate write burst requests and grants. */ if (MHL_MSC_MSG == req->command) { dev_context->msc_msg_last_data = req->msg_data[1]; @@ -1298,7 +1298,7 @@ void si_mhl_tx_drive_states(struct mhl_dev_context *dev_context) } } - MHL_TX_DBG_INFO("req: %p\n", req); + MHL_TX_DBG_INFO("req: %pK\n", req); if (req) { uint8_t ret_val; dev_context->current_cbus_req = req; diff --git a/drivers/video/msm/mdss/mhl3/platform.c b/drivers/video/msm/mdss/mhl3/platform.c index c0e5174880b81..b0c7e8aabb236 100644 --- a/drivers/video/msm/mdss/mhl3/platform.c +++ b/drivers/video/msm/mdss/mhl3/platform.c @@ -1590,7 +1590,7 @@ static int __devinit si_8620_mhl_tx_i2c_probe(struct i2c_client *client, { int ret; - pr_info("%s(), i2c_device_id = %p\n", __func__, id); + pr_info("%s(), i2c_device_id = %pK\n", __func__, id); #if defined(SIMG_USE_DTS) /* @@ -1844,7 +1844,7 @@ static int __devinit si_8620_mhl_tx_spi_probe(struct spi_device *spi) { int ret; - pr_info("%s(), spi = %p\n", __func__, spi); + pr_info("%s(), spi = %pK\n", __func__, spi); spi->bits_per_word = 8; spi_dev = spi; spi_bus_num = spi->master->bus_num; @@ -2161,7 +2161,7 @@ static void __exit si_8620_exit(void) for (idx = 0; idx < ARRAY_SIZE(device_addresses); idx++) { MHL_TX_DBG_INFO("\n"); if (device_addresses[idx].client != NULL) { - MHL_TX_DBG_INFO("unregistering device:%p\n", + MHL_TX_DBG_INFO("unregistering device:%pK\n", device_addresses[idx].client); i2c_unregister_device(device_addresses[idx]. client); diff --git a/drivers/video/msm/mdss/mhl3/si_8620_drv.c b/drivers/video/msm/mdss/mhl3/si_8620_drv.c index dd71f1becd1eb..9d68f285d5816 100644 --- a/drivers/video/msm/mdss/mhl3/si_8620_drv.c +++ b/drivers/video/msm/mdss/mhl3/si_8620_drv.c @@ -2367,7 +2367,7 @@ int si_mhl_tx_drv_get_edid_fifo_partial_block(struct drv_hw_context *hw_context, offset = EDID_BLOCK_SIZE * (hw_context->edid_fifo_block_number & 0x01); offset += start; - MHL_TX_DBG_INFO("%p %p\n", hw_context, edid_buf); + MHL_TX_DBG_INFO("%pK %pK\n", hw_context, edid_buf); if (EDID_BLOCK_SIZE == (offset + length)) hw_context->edid_fifo_block_number++; @@ -2401,7 +2401,7 @@ int si_mhl_tx_drv_get_edid_fifo_next_block(struct drv_hw_context *hw_context, offset = EDID_BLOCK_SIZE * (hw_context->edid_fifo_block_number & 0x01); - MHL_TX_DBG_INFO("%p %p\n", hw_context, edid_buf); + MHL_TX_DBG_INFO("%pK %pK\n", hw_context, edid_buf); hw_context->edid_fifo_block_number++; #ifdef MANUAL_EDID_FETCH diff --git a/drivers/video/msm/mdss/mhl3/si_emsc_hid.c b/drivers/video/msm/mdss/mhl3/si_emsc_hid.c index 17d33c99ef549..51e2eda2827e7 100644 --- a/drivers/video/msm/mdss/mhl3/si_emsc_hid.c +++ b/drivers/video/msm/mdss/mhl3/si_emsc_hid.c @@ -461,7 +461,7 @@ static int mhl3_send_ack(struct mhl3_hid_data *mhid, uint8_t reason) return -ENODEV; MHL3_HID_DBG_WARN("%s - HID_ACK reason code: %02X\n", __func__, reason); - MHL3_HID_DBG_ERR("mhid->mdev: %p\n", mhid->mdev); + MHL3_HID_DBG_ERR("mhid->mdev: %pK\n", mhid->mdev); mhid->out_data[0] = MHL3_HID_ACK; mhid->out_data[1] = reason; @@ -1089,7 +1089,7 @@ static void mhid_add_work(struct work_struct *workdata) mhl3_send_ack(mhid, HID_ACK_NODEV); mhid->flags |= HID_FLAGS_WQ_CANCEL; - MHL3_HID_DBG_ERR("WORK QUEUE function FAIL - mhid: %p\n", mhid); + MHL3_HID_DBG_ERR("WORK QUEUE function FAIL - mhid: %pK\n", mhid); mhl3_disconnect_and_destroy_hid_device(mhid); /* diff --git a/drivers/video/msm/mdss/mhl3/si_mdt_inputdev.c b/drivers/video/msm/mdss/mhl3/si_mdt_inputdev.c index 13d2a08831afb..926ab6c53e74a 100644 --- a/drivers/video/msm/mdss/mhl3/si_mdt_inputdev.c +++ b/drivers/video/msm/mdss/mhl3/si_mdt_inputdev.c @@ -80,10 +80,11 @@ static void destroy_mouse(struct mhl_dev_context *dev_context) if (dev_context->mdt_devs.dev_mouse == NULL) return; - MHL_TX_DBG_INFO("Unregistering mouse: %p\n", + MHL_TX_DBG_INFO("Unregistering mouse: %pK\n", dev_context->mdt_devs.dev_mouse); input_unregister_device(dev_context->mdt_devs.dev_mouse); - MHL_TX_DBG_INFO("Freeing mouse: %p\n", dev_context->mdt_devs.dev_mouse); + MHL_TX_DBG_INFO("Freeing mouse: %pK\n", + dev_context->mdt_devs.dev_mouse); input_free_device(dev_context->mdt_devs.dev_mouse); dev_context->mdt_devs.dev_mouse = NULL; } @@ -93,10 +94,10 @@ static void destroy_keyboard(struct mhl_dev_context *dev_context) if (dev_context->mdt_devs.dev_keyboard == NULL) return; - MHL_TX_DBG_INFO("Unregistering keyboard: %p\n", + MHL_TX_DBG_INFO("Unregistering keyboard: %pK\n", dev_context->mdt_devs.dev_keyboard); input_unregister_device(dev_context->mdt_devs.dev_keyboard); - MHL_TX_DBG_INFO("Freeing keyboard: %p\n", + MHL_TX_DBG_INFO("Freeing keyboard: %pK\n", dev_context->mdt_devs.dev_keyboard); input_free_device(dev_context->mdt_devs.dev_keyboard); dev_context->mdt_devs.dev_keyboard = NULL; @@ -107,10 +108,10 @@ static void destroy_touchscreen(struct mhl_dev_context *dev_context) if (dev_context->mdt_devs.dev_touchscreen == NULL) return; - MHL_TX_DBG_INFO("Unregistering mouse: %p\n", + MHL_TX_DBG_INFO("Unregistering mouse: %pK\n", dev_context->mdt_devs.dev_touchscreen); input_unregister_device(dev_context->mdt_devs.dev_touchscreen); - MHL_TX_DBG_INFO("Freeing mouse: %p\n", + MHL_TX_DBG_INFO("Freeing mouse: %pK\n", dev_context->mdt_devs.dev_touchscreen); input_free_device(dev_context->mdt_devs.dev_touchscreen); dev_context->mdt_devs.dev_touchscreen = NULL; @@ -130,7 +131,7 @@ int init_mdt_keyboard(struct mhl_dev_context *dev_context) MHL_TX_DBG_ERR("Not enough memory\n"); return -ENOMEM; } - MHL_TX_DBG_INFO("Allocated keyboard: %p\n", dev_keyboard); + MHL_TX_DBG_INFO("Allocated keyboard: %pK\n", dev_keyboard); set_bit(EV_KEY, dev_keyboard->evbit); set_bit(EV_REP, dev_keyboard->evbit); @@ -158,7 +159,7 @@ int init_mdt_keyboard(struct mhl_dev_context *dev_context) return error; } - MHL_TX_DBG_INFO("Registered keyboard: %p\n", dev_keyboard); + MHL_TX_DBG_INFO("Registered keyboard: %pK\n", dev_keyboard); dev_context->mdt_devs.dev_keyboard = dev_keyboard; @@ -175,7 +176,7 @@ int init_mdt_mouse(struct mhl_dev_context *dev_context) MHL_TX_DBG_ERR("Not enough memory\n"); return -ENOMEM; } - MHL_TX_DBG_INFO("Allocated mouse: %p\n", dev_mouse); + MHL_TX_DBG_INFO("Allocated mouse: %pK\n", dev_mouse); set_bit(EV_REL, dev_mouse->evbit); set_bit(EV_KEY, dev_mouse->evbit); @@ -208,7 +209,7 @@ int init_mdt_mouse(struct mhl_dev_context *dev_context) return error; } - MHL_TX_DBG_INFO("Registered mouse: %p\n", dev_mouse); + MHL_TX_DBG_INFO("Registered mouse: %pK\n", dev_mouse); dev_context->mdt_devs.dev_mouse = dev_mouse; @@ -226,7 +227,7 @@ int init_mdt_touchscreen(struct mhl_dev_context *dev_context) return -ENOMEM; } - MHL_TX_DBG_INFO("Allocated touch screen: %p\n", dev_touchscreen); + MHL_TX_DBG_INFO("Allocated touch screen: %pK\n", dev_touchscreen); #if !defined(SINGLE_TOUCH) && defined(KERNEL_2_6_38_AND_LATER) input_mt_init_slots(dev_touchscreen, MAX_TOUCH_CONTACTS); @@ -301,7 +302,7 @@ int init_mdt_touchscreen(struct mhl_dev_context *dev_context) input_free_device(dev_touchscreen); return error; } - MHL_TX_DBG_INFO("Registered touchscreen: %p\n", dev_touchscreen); + MHL_TX_DBG_INFO("Registered touchscreen: %pK\n", dev_touchscreen); dev_context->mdt_devs.dev_touchscreen = dev_touchscreen; diff --git a/drivers/video/msm/mdss/mhl3/si_mhl2_edid_3d.c b/drivers/video/msm/mdss/mhl3/si_mhl2_edid_3d.c index fd6918fbf1ff8..f9ece54e5c432 100644 --- a/drivers/video/msm/mdss/mhl3/si_mhl2_edid_3d.c +++ b/drivers/video/msm/mdss/mhl3/si_mhl2_edid_3d.c @@ -1118,7 +1118,7 @@ static void tx_prune_dtd_list(struct edid_3d_data_t *mhl_edid_3d_data, if ((0 != p_desc->dtd.pixel_clock_low) || (0 != p_desc->dtd.pixel_clock_high)) { MHL_TX_EDID_INFO( - "pix clock non-zero p_desc:%p", p_desc) + "pix clock non-zero p_desc:%pK", p_desc) if ((0 == p_desc->dtd.horz_active_7_0) && (0 == p_desc->dtd.horz_active_blanking_high. horz_active_11_8)) { @@ -1133,7 +1133,7 @@ static void tx_prune_dtd_list(struct edid_3d_data_t *mhl_edid_3d_data, * one by one */ MHL_TX_EDID_INFO( - "p_desc:%p p_next_desc:%p\n", + "p_desc:%pK p_next_desc:%pK\n", p_desc, p_next_desc) *p_desc++ = *p_next_desc++; } @@ -1144,7 +1144,7 @@ static void tx_prune_dtd_list(struct edid_3d_data_t *mhl_edid_3d_data, p_desc = p_holder; } else { p_desc++; - MHL_TX_EDID_INFO("p_desc:%p\n", p_desc) + MHL_TX_EDID_INFO("p_desc:%pK\n", p_desc) } } } @@ -1446,7 +1446,7 @@ static bool si_mhl_tx_parse_detailed_timing_descriptor( * Mark this mode for pruning by setting * horizontal active to zero */ - MHL_TX_DBG_ERR("%smark for pruning%s %p\n", + MHL_TX_DBG_ERR("%smark for pruning%s %pK\n", ANSI_ESC_YELLOW_TEXT, ANSI_ESC_RESET_TEXT, p_desc); @@ -1500,7 +1500,7 @@ static uint8_t si_mhl_tx_parse_861_long_descriptors( ++mhl_edid_3d_data->parse_data. num_cea_861_timing_dtds; } else if (valid) { - MHL_TX_EDID_INFO("stopping at %p\n", + MHL_TX_EDID_INFO("stopping at %pK\n", p_data_u.p_long_descriptors) break; } @@ -1600,7 +1600,7 @@ static void prune_hdmi_vsdb_vic_list( HDMI_VIC_len = inner_loop_limit; p_CEA_extension->byte_offset_to_18_byte_descriptors -= num_HDMI_VICs_pruned; - MHL_TX_EDID_INFO("%p\n", mhl_edid_3d_data->parse_data.p_HDMI_vsdb); + MHL_TX_EDID_INFO("%pK\n", mhl_edid_3d_data->parse_data.p_HDMI_vsdb); if (mhl_edid_3d_data->parse_data.p_HDMI_vsdb) { mhl_edid_3d_data->parse_data.p_HDMI_vsdb-> header.fields.length_following_header -= @@ -1722,8 +1722,7 @@ static void prune_svd_list( ("\n\nInvalid extension size\n\n")); while (pb_src < pb_limit) { MHL_TX_EDID_INFO( - "moving data up %p(0x%02X) " - "<- %p(0x%02X)\n", + "moving data up %pK(0x%02X)<- %pK(0x%02X)\n", pb_dest, (uint16_t)*pb_dest, pb_src, (uint16_t)*pb_src); *pb_dest++ = *pb_src++; @@ -3123,7 +3122,7 @@ void si_mhl_tx_process_hev_vic_burst(struct edid_3d_data_t *mhl_edid_3d_data, ANSI_ESC_RED_TEXT, ANSI_ESC_RESET_TEXT); return; } else { - MHL_TX_DBG_WARN(" %d %p\n", hev_index, + MHL_TX_DBG_WARN(" %d %pK\n", hev_index, mhl_edid_3d_data->hev_vic_list) mhl_edid_3d_data->hev_vic_info. num_items_allocated = @@ -3136,7 +3135,7 @@ void si_mhl_tx_process_hev_vic_burst(struct edid_3d_data_t *mhl_edid_3d_data, MHL_TX_DBG_ERR("bogus write burst, no hev_vic_list\n") return; } - MHL_TX_DBG_WARN(" %d %p\n", hev_index, mhl_edid_3d_data->hev_vic_list) + MHL_TX_DBG_WARN(" %d %pK\n", hev_index, mhl_edid_3d_data->hev_vic_list) if (NULL == mhl_edid_3d_data->hev_vic_list) { MHL_TX_DBG_ERR("%s no place to put HEV_VIC burst%s\n", ANSI_ESC_RED_TEXT, ANSI_ESC_RESET_TEXT); @@ -3155,7 +3154,7 @@ void si_mhl_tx_process_hev_vic_burst(struct edid_3d_data_t *mhl_edid_3d_data, burst_id_HEV_VIC, (union video_burst_descriptor_u *) &p_burst-> video_descriptors[i])) { - MHL_TX_DBG_INFO(" %d %p\n", + MHL_TX_DBG_INFO(" %d %pK\n", hev_index, mhl_edid_3d_data->hev_vic_list) mhl_edid_3d_data->hev_vic_list[hev_index]. mhl3_hev_vic_descriptor = @@ -4036,7 +4035,8 @@ static uint8_t parse_861_block(struct edid_3d_data_t *mhl_edid_3d_data, mhl_edid_3d_data->parse_data.p_HDMI_vsdb = NULL; - MHL_TX_EDID_INFO("tag:place holder EDID block:%p\n", p_EDID_block_data); + MHL_TX_EDID_INFO("tag:place holder EDID block:%pK\n", + p_EDID_block_data); if (EDID_EXTENSION_BLOCK_MAP == p_CEA_extension->tag) { struct block_map_t *p_block_map; int i; @@ -4123,7 +4123,7 @@ void si_mhl_tx_handle_atomic_hw_edid_read_complete( mhl_edid_3d_data->parse_data.num_EDID_extensions; ++counter) { MHL_TX_EDID_INFO - (" counter:%d tag:place holder EDID block:%p\n", + (" counter:%d tag:place holder EDID block:%pK\n", counter, &mhl_edid_3d_data-> EDID_block_data[EDID_BLOCK_SIZE * counter]); diff --git a/drivers/video/msm/mdss/msm_mdss_io_8974.c b/drivers/video/msm/mdss/msm_mdss_io_8974.c index 0e11453c15f2b..348a699dced35 100644 --- a/drivers/video/msm/mdss/msm_mdss_io_8974.c +++ b/drivers/video/msm/mdss/msm_mdss_io_8974.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -1796,8 +1796,10 @@ static int mdss_dsi_ulps_config(struct mdss_dsi_ctrl_pdata *ctrl, * to be in stop state. */ MIPI_OUTP(ctrl->ctrl_base + 0x0AC, active_lanes << 16); + wmb(); /* ensure lanes are put to stop state */ MIPI_OUTP(ctrl->ctrl_base + 0x0AC, 0x0); + wmb(); /* ensure lanes are in proper state */ /* * Wait for a short duration before enabling diff --git a/drivers/video/msm/msm_dba/adv7533.c b/drivers/video/msm/msm_dba/adv7533.c index 8d2fb69333352..a644a559fc7c5 100644 --- a/drivers/video/msm/msm_dba/adv7533.c +++ b/drivers/video/msm/msm_dba/adv7533.c @@ -728,7 +728,7 @@ static void adv7533_notify_clients(struct msm_dba_device_info *dev, u32 adv7533_read_edid(struct adv7533 *pdata, u32 size, char *edid_buf) { u32 ret = 0, read_size = size / 2; - u8 edid_addr; + u8 edid_addr = 0; int ndx; if (!pdata || !edid_buf) diff --git a/drivers/video/msm/msm_dba/msm_dba.c b/drivers/video/msm/msm_dba/msm_dba.c index 7a5c9d9d873a0..cc6512a4af9b2 100644 --- a/drivers/video/msm/msm_dba/msm_dba.c +++ b/drivers/video/msm/msm_dba/msm_dba.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015,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 @@ -80,6 +80,11 @@ void *msm_dba_register_client(struct msm_dba_reg_info *info, if (rc) { pr_err("%s: Client register failed (%s, %d)\n", __func__, info->chip_name, info->instance_id); + /* remove the client from list before freeing */ + mutex_lock_nested(&device->dev_mutex, + SINGLE_DEPTH_NESTING); + list_del(&client->list); + mutex_unlock(&device->dev_mutex); kfree(client); mutex_unlock(®ister_mutex); return ERR_PTR(rc); diff --git a/fs/9p/acl.c b/fs/9p/acl.c index 8482f2d116066..9ebe8d5c0c20a 100644 --- a/fs/9p/acl.c +++ b/fs/9p/acl.c @@ -320,32 +320,29 @@ static int v9fs_xattr_set_acl(struct dentry *dentry, const char *name, case ACL_TYPE_ACCESS: name = POSIX_ACL_XATTR_ACCESS; if (acl) { - umode_t mode = inode->i_mode; - retval = posix_acl_equiv_mode(acl, &mode); - if (retval < 0) + struct iattr iattr; + struct posix_acl *old_acl = acl; + + retval = posix_acl_update_mode(inode, + &iattr.ia_mode, &acl); + if (retval) goto err_out; - else { - struct iattr iattr; - if (retval == 0) { - /* - * ACL can be represented - * by the mode bits. So don't - * update ACL. - */ - acl = NULL; - value = NULL; - size = 0; - } - /* Updte the mode bits */ - iattr.ia_mode = ((mode & S_IALLUGO) | - (inode->i_mode & ~S_IALLUGO)); - iattr.ia_valid = ATTR_MODE; - /* FIXME should we update ctime ? - * What is the following setxattr update the - * mode ? + if (!acl) { + /* + * ACL can be represented + * by the mode bits. So don't + * update ACL. */ - v9fs_vfs_setattr_dotl(dentry, &iattr); + posix_acl_release(old_acl); + value = NULL; + size = 0; } + iattr.ia_valid = ATTR_MODE; + /* FIXME should we update ctime ? + * What is the following setxattr update the + * mode ? + */ + v9fs_vfs_setattr_dotl(dentry, &iattr); } break; case ACL_TYPE_DEFAULT: diff --git a/fs/aio.c b/fs/aio.c index d9912555aacc8..3eec984704441 100644 --- a/fs/aio.c +++ b/fs/aio.c @@ -229,6 +229,7 @@ static int __init aio_setup(void) aio_mnt = kern_mount(&aio_fs); if (IS_ERR(aio_mnt)) panic("Failed to create aio fs mount."); + aio_mnt->mnt_flags |= MNT_NOEXEC; if (bdi_init(&aio_fs_backing_dev_info)) panic("Failed to init aio fs backing dev info."); diff --git a/fs/attr.c b/fs/attr.c index 6530ced19697d..ebb3ee561c1d1 100644 --- a/fs/attr.c +++ b/fs/attr.c @@ -187,7 +187,7 @@ EXPORT_SYMBOL(setattr_copy); * the file open for write, as there can be no conflicting delegation in * that case. */ -int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **delegated_inode) +int notify_change2(struct vfsmount *mnt, struct dentry *dentry, struct iattr *attr, struct inode **delegated_inode) { struct inode *inode = dentry->d_inode; umode_t mode = inode->i_mode; @@ -262,7 +262,9 @@ int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **de if (error) return error; - if (inode->i_op->setattr) + if (mnt && inode->i_op->setattr2) + error = inode->i_op->setattr2(mnt, dentry, attr); + else if (inode->i_op->setattr) error = inode->i_op->setattr(dentry, attr); else error = simple_setattr(dentry, attr); @@ -275,4 +277,10 @@ int notify_change(struct dentry * dentry, struct iattr * attr, struct inode **de return error; } +EXPORT_SYMBOL(notify_change2); + +int notify_change(struct dentry *dentry, struct iattr *attr, struct inode **delegated_inode) +{ + return notify_change2(NULL, dentry, attr, delegated_inode); +} EXPORT_SYMBOL(notify_change); diff --git a/fs/btrfs/acl.c b/fs/btrfs/acl.c index 9a0124a958510..664d50579fcf9 100644 --- a/fs/btrfs/acl.c +++ b/fs/btrfs/acl.c @@ -83,11 +83,10 @@ static int __btrfs_set_acl(struct btrfs_trans_handle *trans, case ACL_TYPE_ACCESS: name = POSIX_ACL_XATTR_ACCESS; if (acl) { - ret = posix_acl_equiv_mode(acl, &inode->i_mode); - if (ret < 0) + ret = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (ret) return ret; - if (ret == 0) - acl = NULL; } ret = 0; break; diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c index 5bd853ba44ffc..6a4a3e2a46cf2 100644 --- a/fs/ceph/acl.c +++ b/fs/ceph/acl.c @@ -108,11 +108,9 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type) case ACL_TYPE_ACCESS: name = POSIX_ACL_XATTR_ACCESS; if (acl) { - ret = posix_acl_equiv_mode(acl, &new_mode); - if (ret < 0) + ret = posix_acl_update_mode(inode, &new_mode, &acl); + if (ret) goto out; - if (ret == 0) - acl = NULL; } break; case ACL_TYPE_DEFAULT: diff --git a/fs/coredump.c b/fs/coredump.c index 7eb6181184ea0..b4b521aa7b804 100644 --- a/fs/coredump.c +++ b/fs/coredump.c @@ -707,7 +707,7 @@ void do_coredump(const siginfo_t *siginfo) goto close_fail; if (!(cprm.file->f_mode & FMODE_CAN_WRITE)) goto close_fail; - if (do_truncate(cprm.file->f_path.dentry, 0, 0, cprm.file)) + if (do_truncate2(cprm.file->f_path.mnt, cprm.file->f_path.dentry, 0, 0, cprm.file)) goto close_fail; } diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index d68eb1b838c07..e83d404df6d16 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c @@ -178,6 +178,19 @@ static int read_or_initialize_metadata(struct dentry *dentry) return rc; } +static int ecryptfs_mmap(struct file *file, struct vm_area_struct *vma) +{ + struct file *lower_file = ecryptfs_file_to_lower(file); + /* + * Don't allow mmap on top of file systems that don't support it + * natively. If FILESYSTEM_MAX_STACK_DEPTH > 2 or ecryptfs + * allows recursive mounting, this will need to be extended. + */ + if (!lower_file->f_op->mmap) + return -ENODEV; + return generic_file_mmap(file, vma); +} + /** * ecryptfs_open * @inode: inode speciying file to open @@ -398,7 +411,7 @@ const struct file_operations ecryptfs_main_fops = { #ifdef CONFIG_COMPAT .compat_ioctl = ecryptfs_compat_ioctl, #endif - .mmap = generic_file_mmap, + .mmap = ecryptfs_mmap, .open = ecryptfs_open, .flush = ecryptfs_flush, .release = ecryptfs_release, diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c index 8dc0492ff81c7..5edc638165ae4 100644 --- a/fs/ecryptfs/keystore.c +++ b/fs/ecryptfs/keystore.c @@ -1745,7 +1745,7 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok, mutex_lock(tfm_mutex); rc = crypto_blkcipher_setkey( desc.tfm, auth_tok->token.password.session_key_encryption_key, - auth_tok->token.password.session_key_encryption_key_bytes); + ecryptfs_get_key_size_to_store_key(crypt_stat)); if (unlikely(rc < 0)) { mutex_unlock(tfm_mutex); printk(KERN_ERR "Error setting key for crypto context\n"); @@ -2294,12 +2294,11 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, if (auth_tok->token.password.flags & ECRYPTFS_SESSION_KEY_ENCRYPTION_KEY_SET) { ecryptfs_printk(KERN_DEBUG, "Using previously generated " - "session key encryption key of size [%d]\n", - auth_tok->token.password. - session_key_encryption_key_bytes); + "session key encryption key of size [%zd]\n", + ecryptfs_get_key_size_to_store_key(crypt_stat)); memcpy(session_key_encryption_key, auth_tok->token.password.session_key_encryption_key, - auth_tok->token.password.session_key_encryption_key_bytes); + ecryptfs_get_key_size_to_store_key(crypt_stat)); ecryptfs_printk(KERN_DEBUG, "Cached session key encryption key:\n"); if (ecryptfs_verbosity > 0) @@ -2332,7 +2331,7 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes, } mutex_lock(tfm_mutex); rc = crypto_blkcipher_setkey(desc.tfm, session_key_encryption_key, - auth_tok->token.password.session_key_encryption_key_bytes); + ecryptfs_get_key_size_to_store_key(crypt_stat)); if (rc < 0) { mutex_unlock(tfm_mutex); ecryptfs_printk(KERN_ERR, "Error setting key for crypto " diff --git a/fs/exec.c b/fs/exec.c index b7a5f46181b0f..b079500cb496b 100644 --- a/fs/exec.c +++ b/fs/exec.c @@ -1092,7 +1092,7 @@ EXPORT_SYMBOL(flush_old_exec); void would_dump(struct linux_binprm *bprm, struct file *file) { - if (inode_permission(file_inode(file), MAY_READ) < 0) + if (inode_permission2(file->f_path.mnt, file_inode(file), MAY_READ) < 0) bprm->interp_flags |= BINPRM_FLAGS_ENFORCE_NONDUMP; } EXPORT_SYMBOL(would_dump); diff --git a/fs/ext2/acl.c b/fs/ext2/acl.c index 27695e6f4e466..ec67e1a6dbeb0 100644 --- a/fs/ext2/acl.c +++ b/fs/ext2/acl.c @@ -193,15 +193,12 @@ ext2_set_acl(struct inode *inode, struct posix_acl *acl, int type) case ACL_TYPE_ACCESS: name_index = EXT2_XATTR_INDEX_POSIX_ACL_ACCESS; if (acl) { - error = posix_acl_equiv_mode(acl, &inode->i_mode); - if (error < 0) + error = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (error) return error; - else { - inode->i_ctime = CURRENT_TIME_SEC; - mark_inode_dirty(inode); - if (error == 0) - acl = NULL; - } + inode->i_ctime = CURRENT_TIME_SEC; + mark_inode_dirty(inode); } break; diff --git a/fs/ext4/acl.c b/fs/ext4/acl.c index d40c8dbbb0d66..90c3a50104555 100644 --- a/fs/ext4/acl.c +++ b/fs/ext4/acl.c @@ -201,15 +201,12 @@ __ext4_set_acl(handle_t *handle, struct inode *inode, int type, case ACL_TYPE_ACCESS: name_index = EXT4_XATTR_INDEX_POSIX_ACL_ACCESS; if (acl) { - error = posix_acl_equiv_mode(acl, &inode->i_mode); - if (error < 0) + error = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (error) return error; - else { - inode->i_ctime = ext4_current_time(inode); - ext4_mark_inode_dirty(handle, inode); - if (error == 0) - acl = NULL; - } + inode->i_ctime = ext4_current_time(inode); + ext4_mark_inode_dirty(handle, inode); } break; diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c index d418431818187..e770c1ee4613e 100644 --- a/fs/ext4/ext4_jbd2.c +++ b/fs/ext4/ext4_jbd2.c @@ -88,13 +88,13 @@ int __ext4_journal_stop(const char *where, unsigned int line, handle_t *handle) return 0; } + err = handle->h_err; if (!handle->h_transaction) { - err = jbd2_journal_stop(handle); - return handle->h_err ? handle->h_err : err; + rc = jbd2_journal_stop(handle); + return err ? err : rc; } sb = handle->h_transaction->t_journal->j_private; - err = handle->h_err; rc = jbd2_journal_stop(handle); if (!err) diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 2ea75cbeb697e..a99e660050b2f 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c @@ -3408,6 +3408,7 @@ int ext4_can_truncate(struct inode *inode) int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) { +#if 0 struct super_block *sb = inode->i_sb; ext4_lblk_t first_block, stop_block; struct address_space *mapping = inode->i_mapping; @@ -3531,6 +3532,12 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length) out_mutex: mutex_unlock(&inode->i_mutex); return ret; +#else + /* + * Disabled as per b/28760453 + */ + return -EOPNOTSUPP; +#endif } int ext4_inode_attach_jinode(struct inode *inode) diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c index 83b9b5a8d1120..9151e70348dcd 100644 --- a/fs/f2fs/acl.c +++ b/fs/f2fs/acl.c @@ -207,12 +207,11 @@ static int __f2fs_set_acl(struct inode *inode, int type, case ACL_TYPE_ACCESS: name_index = F2FS_XATTR_INDEX_POSIX_ACL_ACCESS; if (acl) { - error = posix_acl_equiv_mode(acl, &inode->i_mode); - if (error < 0) + error = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (error) return error; set_acl_inode(fi, inode->i_mode); - if (error == 0) - acl = NULL; } break; diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index f988b01b6f895..e5a2e7ae20ae1 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -737,6 +737,15 @@ int f2fs_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, start, len, get_data_block_fiemap); } +static int get_data_block_bmap(struct inode *inode, sector_t iblock, + struct buffer_head *bh_result, int create) +{ + /* Block number less than F2FS MAX BLOCKS */ + if (unlikely(iblock >= max_file_size(0))) + return -EFBIG; + return get_data_block_ro(inode, iblock, bh_result, create); +} + static int f2fs_read_data_page(struct file *file, struct page *page) { struct inode *inode = page->mapping->host; @@ -1153,7 +1162,7 @@ static sector_t f2fs_bmap(struct address_space *mapping, sector_t block) if (f2fs_has_inline_data(inode)) return 0; - return generic_block_bmap(mapping, block, get_data_block); + return generic_block_bmap(mapping, block, get_data_block_bmap); } const struct address_space_operations f2fs_dblock_aops = { diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 8171e80b2ee9f..2f73c62e58dbc 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -1246,6 +1246,7 @@ static inline int f2fs_add_link(struct dentry *dentry, struct inode *inode) /* * super.c */ +loff_t max_file_size(unsigned bits); int f2fs_sync_fs(struct super_block *, int); extern __printf(3, 4) void f2fs_msg(struct super_block *, const char *, const char *, ...); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 41d6f700f4ee6..ef28a08add5eb 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -752,7 +752,7 @@ static const struct export_operations f2fs_export_ops = { .get_parent = f2fs_get_parent, }; -static loff_t max_file_size(unsigned bits) +loff_t max_file_size(unsigned bits) { loff_t result = (DEF_ADDRS_PER_INODE - F2FS_INLINE_XATTR_ADDRS); loff_t leaf_count = ADDRS_PER_BLOCK; @@ -801,6 +801,14 @@ static int sanity_check_raw_super(struct super_block *sb, return 1; } + /* check log blocks per segment */ + if (le32_to_cpu(raw_super->log_blocks_per_seg) != 9) { + f2fs_msg(sb, KERN_INFO, + "Invalid log blocks per segment (%u)\n", + le32_to_cpu(raw_super->log_blocks_per_seg)); + return 1; + } + /* Currently, support 512/1024/2048/4096 bytes sector size */ if (le32_to_cpu(raw_super->log_sectorsize) > F2FS_MAX_LOG_SECTOR_SIZE || @@ -819,6 +827,13 @@ static int sanity_check_raw_super(struct super_block *sb, le32_to_cpu(raw_super->log_sectorsize)); return 1; } + + if (le32_to_cpu(raw_super->segment_count) > F2FS_MAX_SEGMENT) { + f2fs_msg(sb, KERN_INFO, + "Invalid segment count (%u)", + le32_to_cpu(raw_super->segment_count)); + return 1; + } return 0; } @@ -827,6 +842,8 @@ static int sanity_check_ckpt(struct f2fs_sb_info *sbi) unsigned int total, fsmeta; struct f2fs_super_block *raw_super = F2FS_RAW_SUPER(sbi); struct f2fs_checkpoint *ckpt = F2FS_CKPT(sbi); + unsigned int main_segs, blocks_per_seg; + int i; total = le32_to_cpu(raw_super->segment_count); fsmeta = le32_to_cpu(raw_super->segment_count_ckpt); @@ -838,6 +855,22 @@ static int sanity_check_ckpt(struct f2fs_sb_info *sbi) if (unlikely(fsmeta >= total)) return 1; + main_segs = le32_to_cpu(sbi->raw_super->segment_count_main); + blocks_per_seg = sbi->blocks_per_seg; + + for (i = 0; i < NR_CURSEG_NODE_TYPE; i++) { + if (le32_to_cpu(ckpt->cur_node_segno[i]) >= main_segs || + le16_to_cpu(ckpt->cur_node_blkoff[i]) >= blocks_per_seg) { + return 1; + } + } + for (i = 0; i < NR_CURSEG_DATA_TYPE; i++) { + if (le32_to_cpu(ckpt->cur_data_segno[i]) >= main_segs || + le16_to_cpu(ckpt->cur_data_blkoff[i]) >= blocks_per_seg) { + return 1; + } + } + if (unlikely(f2fs_cp_error(sbi))) { f2fs_msg(sbi->sb, KERN_ERR, "A bug case: need to run fsck"); return 1; diff --git a/fs/fuse/shortcircuit.c b/fs/fuse/shortcircuit.c index 499e496005b5c..c657b170fb7e5 100644 --- a/fs/fuse/shortcircuit.c +++ b/fs/fuse/shortcircuit.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2016, 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 @@ -58,10 +58,12 @@ static ssize_t fuse_shortcircuit_read_write_iter(struct kiocb *iocb, struct fuse_file *ff; struct file *fuse_file, *lower_file; struct inode *fuse_inode, *lower_inode; + struct fuse_conn *fc; ff = iocb->ki_filp->private_data; fuse_file = iocb->ki_filp; lower_file = ff->rw_lower_file; + fc = ff->fc; /* lock lower file to prevent it from being released */ get_file(lower_file); @@ -75,7 +77,9 @@ static ssize_t fuse_shortcircuit_read_write_iter(struct kiocb *iocb, ret_val = lower_file->f_op->write_iter(iocb, iter); if (ret_val >= 0 || ret_val == -EIOCBQUEUED) { + spin_lock(&fc->lock); fsstack_copy_inode_size(fuse_inode, lower_inode); + spin_unlock(&fc->lock); fsstack_copy_attr_times(fuse_inode, lower_inode); } } else { diff --git a/fs/gfs2/acl.c b/fs/gfs2/acl.c index 7b3143064af11..6282f3de36e64 100644 --- a/fs/gfs2/acl.c +++ b/fs/gfs2/acl.c @@ -78,18 +78,15 @@ int gfs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) if (type == ACL_TYPE_ACCESS) { umode_t mode = inode->i_mode; + struct posix_acl *old_acl = acl; + error = posix_acl_update_mode(inode, &inode->i_mode, &acl); - error = posix_acl_equiv_mode(acl, &mode); - if (error < 0) + if (!acl) + posix_acl_release(old_acl); + if (error) return error; - - if (error == 0) - acl = NULL; - - if (mode != inode->i_mode) { - inode->i_mode = mode; + if (mode != inode->i_mode) mark_inode_dirty(inode); - } } if (acl) { diff --git a/fs/hfsplus/posix_acl.c b/fs/hfsplus/posix_acl.c index df0c9af68d05e..6c71990020264 100644 --- a/fs/hfsplus/posix_acl.c +++ b/fs/hfsplus/posix_acl.c @@ -68,8 +68,9 @@ int hfsplus_set_posix_acl(struct inode *inode, struct posix_acl *acl, case ACL_TYPE_ACCESS: xattr_name = POSIX_ACL_XATTR_ACCESS; if (acl) { - err = posix_acl_equiv_mode(acl, &inode->i_mode); - if (err < 0) + err = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (err) return err; } err = 0; diff --git a/fs/inode.c b/fs/inode.c index 56d1d2b4bf317..da55347c44a28 100644 --- a/fs/inode.c +++ b/fs/inode.c @@ -1598,7 +1598,7 @@ int should_remove_suid(struct dentry *dentry) } EXPORT_SYMBOL(should_remove_suid); -static int __remove_suid(struct dentry *dentry, int kill) +static int __remove_suid(struct vfsmount *mnt, struct dentry *dentry, int kill) { struct iattr newattrs; @@ -1607,7 +1607,7 @@ static int __remove_suid(struct dentry *dentry, int kill) * Note we call this on write, so notify_change will not * encounter any conflicting delegations: */ - return notify_change(dentry, &newattrs, NULL); + return notify_change2(mnt, dentry, &newattrs, NULL); } int file_remove_suid(struct file *file) @@ -1630,7 +1630,7 @@ int file_remove_suid(struct file *file) if (killpriv) error = security_inode_killpriv(dentry); if (!error && killsuid) - error = __remove_suid(dentry, killsuid); + error = __remove_suid(file->f_path.mnt, dentry, killsuid); if (!error) inode_has_no_xattr(inode); diff --git a/fs/internal.h b/fs/internal.h index ff683fcf3e16b..7644ead97418c 100644 --- a/fs/internal.h +++ b/fs/internal.h @@ -83,9 +83,11 @@ extern struct file *get_empty_filp(void); * super.c */ extern int do_remount_sb(struct super_block *, int, void *, int); +extern int do_remount_sb2(struct vfsmount *, struct super_block *, int, + void *, int); extern bool grab_super_passive(struct super_block *sb); extern struct dentry *mount_fs(struct file_system_type *, - int, const char *, void *); + int, const char *, struct vfsmount *, void *); extern struct super_block *user_get_super(dev_t); /* diff --git a/fs/jffs2/acl.c b/fs/jffs2/acl.c index 2f7a3c0904899..f9f86f87d32b8 100644 --- a/fs/jffs2/acl.c +++ b/fs/jffs2/acl.c @@ -235,9 +235,10 @@ int jffs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) case ACL_TYPE_ACCESS: xprefix = JFFS2_XPREFIX_ACL_ACCESS; if (acl) { - umode_t mode = inode->i_mode; - rc = posix_acl_equiv_mode(acl, &mode); - if (rc < 0) + umode_t mode; + + rc = posix_acl_update_mode(inode, &mode, &acl); + if (rc) return rc; if (inode->i_mode != mode) { struct iattr attr; @@ -249,8 +250,6 @@ int jffs2_set_acl(struct inode *inode, struct posix_acl *acl, int type) if (rc < 0) return rc; } - if (rc == 0) - acl = NULL; } break; case ACL_TYPE_DEFAULT: diff --git a/fs/jfs/acl.c b/fs/jfs/acl.c index 0c8ca830b113e..9fad9f4fe8830 100644 --- a/fs/jfs/acl.c +++ b/fs/jfs/acl.c @@ -84,13 +84,11 @@ static int __jfs_set_acl(tid_t tid, struct inode *inode, int type, case ACL_TYPE_ACCESS: ea_name = POSIX_ACL_XATTR_ACCESS; if (acl) { - rc = posix_acl_equiv_mode(acl, &inode->i_mode); - if (rc < 0) + rc = posix_acl_update_mode(inode, &inode->i_mode, &acl); + if (rc) return rc; inode->i_ctime = CURRENT_TIME; mark_inode_dirty(inode); - if (rc == 0) - acl = NULL; } break; case ACL_TYPE_DEFAULT: diff --git a/fs/namei.c b/fs/namei.c index 46e02f4c630a2..5ec9ccc4f7ff1 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -368,9 +368,11 @@ EXPORT_SYMBOL(generic_permission); * flag in inode->i_opflags, that says "this has not special * permission function, use the fast case". */ -static inline int do_inode_permission(struct inode *inode, int mask) +static inline int do_inode_permission(struct vfsmount *mnt, struct inode *inode, int mask) { if (unlikely(!(inode->i_opflags & IOP_FASTPERM))) { + if (likely(mnt && inode->i_op->permission2)) + return inode->i_op->permission2(mnt, inode, mask); if (likely(inode->i_op->permission)) return inode->i_op->permission(inode, mask); @@ -394,7 +396,7 @@ static inline int do_inode_permission(struct inode *inode, int mask) * This does not check for a read-only file system. You probably want * inode_permission(). */ -int __inode_permission(struct inode *inode, int mask) +int __inode_permission2(struct vfsmount *mnt, struct inode *inode, int mask) { int retval; @@ -406,7 +408,7 @@ int __inode_permission(struct inode *inode, int mask) return -EACCES; } - retval = do_inode_permission(inode, mask); + retval = do_inode_permission(mnt, inode, mask); if (retval) return retval; @@ -414,7 +416,14 @@ int __inode_permission(struct inode *inode, int mask) if (retval) return retval; - return security_inode_permission(inode, mask); + retval = security_inode_permission(inode, mask); + return retval; +} +EXPORT_SYMBOL(__inode_permission2); + +int __inode_permission(struct inode *inode, int mask) +{ + return __inode_permission2(NULL, inode, mask); } EXPORT_SYMBOL(__inode_permission); @@ -450,14 +459,20 @@ static int sb_permission(struct super_block *sb, struct inode *inode, int mask) * * When checking for MAY_APPEND, MAY_WRITE must also be set in @mask. */ -int inode_permission(struct inode *inode, int mask) +int inode_permission2(struct vfsmount *mnt, struct inode *inode, int mask) { int retval; retval = sb_permission(inode->i_sb, inode, mask); if (retval) return retval; - return __inode_permission(inode, mask); + return __inode_permission2(mnt, inode, mask); +} +EXPORT_SYMBOL(inode_permission2); + +int inode_permission(struct inode *inode, int mask) +{ + return inode_permission2(NULL, inode, mask); } EXPORT_SYMBOL(inode_permission); @@ -1512,13 +1527,13 @@ static int lookup_slow(struct nameidata *nd, struct path *path) static inline int may_lookup(struct nameidata *nd) { if (nd->flags & LOOKUP_RCU) { - int err = inode_permission(nd->inode, MAY_EXEC|MAY_NOT_BLOCK); + int err = inode_permission2(nd->path.mnt, nd->inode, MAY_EXEC|MAY_NOT_BLOCK); if (err != -ECHILD) return err; if (unlazy_walk(nd, NULL)) return -ECHILD; } - return inode_permission(nd->inode, MAY_EXEC); + return inode_permission2(nd->path.mnt, nd->inode, MAY_EXEC); } static inline int handle_dots(struct nameidata *nd, int type) @@ -1856,11 +1871,12 @@ static int path_init(int dfd, const char *name, unsigned int flags, nd->depth = 0; if (flags & LOOKUP_ROOT) { struct dentry *root = nd->root.dentry; + struct vfsmount *mnt = nd->root.mnt; struct inode *inode = root->d_inode; if (*name) { if (!d_can_lookup(root)) return -ENOTDIR; - retval = inode_permission(inode, MAY_EXEC); + retval = inode_permission2(mnt, inode, MAY_EXEC); if (retval) return retval; } @@ -2114,6 +2130,7 @@ static struct dentry *lookup_hash(struct nameidata *nd) /** * lookup_one_len - filesystem helper to lookup single pathname component * @name: pathname component to lookup + * @mnt: mount we are looking up on * @base: base directory to lookup from * @len: maximum length @len should be interpreted to * @@ -2122,7 +2139,7 @@ static struct dentry *lookup_hash(struct nameidata *nd) * nameidata argument is passed to the filesystem methods and a filesystem * using this helper needs to be prepared for that. */ -struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) +struct dentry *lookup_one_len2(const char *name, struct vfsmount *mnt, struct dentry *base, int len) { struct qstr this; unsigned int c; @@ -2156,12 +2173,18 @@ struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) return ERR_PTR(err); } - err = inode_permission(base->d_inode, MAY_EXEC); + err = inode_permission2(mnt, base->d_inode, MAY_EXEC); if (err) return ERR_PTR(err); return __lookup_hash(&this, base, 0); } +EXPORT_SYMBOL(lookup_one_len2); + +struct dentry *lookup_one_len(const char *name, struct dentry *base, int len) +{ + return lookup_one_len2(name, NULL, base, len); +} EXPORT_SYMBOL(lookup_one_len); int user_path_at_empty(int dfd, const char __user *name, unsigned flags, @@ -2441,7 +2464,7 @@ EXPORT_SYMBOL(__check_sticky); * 10. We don't allow removal of NFS sillyrenamed files; it's handled by * nfs_async_unlink(). */ -static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) +static int may_delete(struct vfsmount *mnt, struct inode *dir, struct dentry *victim, bool isdir) { struct inode *inode = victim->d_inode; int error; @@ -2453,7 +2476,7 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) BUG_ON(victim->d_parent->d_inode != dir); audit_inode_child(dir, victim, AUDIT_TYPE_CHILD_DELETE); - error = inode_permission(dir, MAY_WRITE | MAY_EXEC); + error = inode_permission2(mnt, dir, MAY_WRITE | MAY_EXEC); if (error) return error; if (IS_APPEND(dir)) @@ -2484,14 +2507,14 @@ static int may_delete(struct inode *dir, struct dentry *victim, bool isdir) * 3. We should have write and exec permissions on dir * 4. We can't do it if dir is immutable (done in permission()) */ -static inline int may_create(struct inode *dir, struct dentry *child) +static inline int may_create(struct vfsmount *mnt, struct inode *dir, struct dentry *child) { audit_inode_child(dir, child, AUDIT_TYPE_CHILD_CREATE); if (child->d_inode) return -EEXIST; if (IS_DEADDIR(dir)) return -ENOENT; - return inode_permission(dir, MAY_WRITE | MAY_EXEC); + return inode_permission2(mnt, dir, MAY_WRITE | MAY_EXEC); } /* @@ -2501,7 +2524,7 @@ struct dentry *lock_rename(struct dentry *p1, struct dentry *p2) { struct dentry *p; - if (p1 == p2) { + if (p1 == p2 || p1->d_inode == p2->d_inode) { mutex_lock_nested(&p1->d_inode->i_mutex, I_MUTEX_PARENT); return NULL; } @@ -2538,10 +2561,10 @@ void unlock_rename(struct dentry *p1, struct dentry *p2) } EXPORT_SYMBOL(unlock_rename); -int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, - bool want_excl) +int vfs_create2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, + umode_t mode, bool want_excl) { - int error = may_create(dir, dentry); + int error = may_create(mnt, dir, dentry); if (error) return error; @@ -2563,11 +2586,19 @@ int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, return error; } +EXPORT_SYMBOL(vfs_create2); + +int vfs_create(struct inode *dir, struct dentry *dentry, umode_t mode, + bool want_excl) +{ + return vfs_create2(NULL, dir, dentry, mode, want_excl); +} EXPORT_SYMBOL(vfs_create); static int may_open(struct path *path, int acc_mode, int flag) { struct dentry *dentry = path->dentry; + struct vfsmount *mnt = path->mnt; struct inode *inode = dentry->d_inode; int error; @@ -2596,7 +2627,7 @@ static int may_open(struct path *path, int acc_mode, int flag) break; } - error = inode_permission(inode, acc_mode); + error = inode_permission2(mnt, inode, acc_mode); if (error) return error; @@ -2631,7 +2662,7 @@ static int handle_truncate(struct file *filp) if (!error) error = security_path_truncate(path); if (!error) { - error = do_truncate(path->dentry, 0, + error = do_truncate2(path->mnt, path->dentry, 0, ATTR_MTIME|ATTR_CTIME|ATTR_OPEN, filp); } @@ -2652,7 +2683,7 @@ static int may_o_create(struct path *dir, struct dentry *dentry, umode_t mode) if (error) return error; - error = inode_permission(dir->dentry->d_inode, MAY_WRITE | MAY_EXEC); + error = inode_permission2(dir->mnt, dir->dentry->d_inode, MAY_WRITE | MAY_EXEC); if (error) return error; @@ -2850,6 +2881,7 @@ static int lookup_open(struct nameidata *nd, struct path *path, bool got_write, int *opened) { struct dentry *dir = nd->path.dentry; + struct vfsmount *mnt = nd->path.mnt; struct inode *dir_inode = dir->d_inode; struct dentry *dentry; int error; @@ -2897,7 +2929,7 @@ static int lookup_open(struct nameidata *nd, struct path *path, error = security_path_mknod(&nd->path, dentry, mode, 0); if (error) goto out_dput; - error = vfs_create(dir->d_inode, dentry, mode, + error = vfs_create2(mnt, dir->d_inode, dentry, mode, nd->flags & LOOKUP_EXCL); if (error) goto out_dput; @@ -3169,7 +3201,7 @@ static int do_tmpfile(int dfd, struct filename *pathname, if (unlikely(error)) goto out; /* we want directory to be writable */ - error = inode_permission(nd->inode, MAY_WRITE | MAY_EXEC); + error = inode_permission2(nd->path.mnt, nd->inode, MAY_WRITE | MAY_EXEC); if (error) goto out2; dentry = nd->path.dentry; @@ -3419,9 +3451,9 @@ struct dentry *user_path_create(int dfd, const char __user *pathname, } EXPORT_SYMBOL(user_path_create); -int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) +int vfs_mknod2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) { - int error = may_create(dir, dentry); + int error = may_create(mnt, dir, dentry); if (error) return error; @@ -3453,6 +3485,12 @@ int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) return error; } +EXPORT_SYMBOL(vfs_mknod2); + +int vfs_mknod(struct inode *dir, struct dentry *dentry, umode_t mode, dev_t dev) +{ + return vfs_mknod2(NULL, dir, dentry, mode, dev); +} EXPORT_SYMBOL(vfs_mknod); static int may_mknod(umode_t mode) @@ -3495,10 +3533,10 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const char __user *, filename, umode_t, mode, goto out; switch (mode & S_IFMT) { case 0: case S_IFREG: - error = vfs_create(path.dentry->d_inode,dentry,mode,true); + error = vfs_create2(path.mnt, path.dentry->d_inode, dentry, mode, true); break; case S_IFCHR: case S_IFBLK: - error = vfs_mknod(path.dentry->d_inode,dentry,mode, + error = vfs_mknod2(path.mnt, path.dentry->d_inode, dentry, mode, new_decode_dev(dev)); break; case S_IFIFO: case S_IFSOCK: @@ -3519,9 +3557,9 @@ SYSCALL_DEFINE3(mknod, const char __user *, filename, umode_t, mode, unsigned, d return sys_mknodat(AT_FDCWD, filename, mode, dev); } -int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) +int vfs_mkdir2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, umode_t mode) { - int error = may_create(dir, dentry); + int error = may_create(mnt, dir, dentry); unsigned max_links = dir->i_sb->s_max_links; if (error) @@ -3543,6 +3581,12 @@ int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) fsnotify_mkdir(dir, dentry); return error; } +EXPORT_SYMBOL(vfs_mkdir2); + +int vfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode) +{ + return vfs_mkdir2(NULL, dir, dentry, mode); +} EXPORT_SYMBOL(vfs_mkdir); SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode) @@ -3561,7 +3605,7 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, umode_t, mode) mode &= ~current_umask(); error = security_path_mkdir(&path, dentry, mode); if (!error) - error = vfs_mkdir(path.dentry->d_inode, dentry, mode); + error = vfs_mkdir2(path.mnt, path.dentry->d_inode, dentry, mode); done_path_create(&path, dentry); if (retry_estale(error, lookup_flags)) { lookup_flags |= LOOKUP_REVAL; @@ -3600,9 +3644,9 @@ void dentry_unhash(struct dentry *dentry) } EXPORT_SYMBOL(dentry_unhash); -int vfs_rmdir(struct inode *dir, struct dentry *dentry) +int vfs_rmdir2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry) { - int error = may_delete(dir, dentry, 1); + int error = may_delete(mnt, dir, dentry, 1); if (error) return error; @@ -3637,6 +3681,10 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry) d_delete(dentry); return error; } +int vfs_rmdir(struct inode *dir, struct dentry *dentry) +{ + return vfs_rmdir2(NULL, dir, dentry); +} EXPORT_SYMBOL(vfs_rmdir); static long do_rmdir(int dfd, const char __user *pathname) @@ -3680,7 +3728,7 @@ static long do_rmdir(int dfd, const char __user *pathname) error = security_path_rmdir(&nd.path, dentry); if (error) goto exit3; - error = vfs_rmdir(nd.path.dentry->d_inode, dentry); + error = vfs_rmdir2(nd.path.mnt, nd.path.dentry->d_inode, dentry); exit3: dput(dentry); exit2: @@ -3719,10 +3767,10 @@ SYSCALL_DEFINE1(rmdir, const char __user *, pathname) * be appropriate for callers that expect the underlying filesystem not * to be NFS exported. */ -int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) +int vfs_unlink2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) { struct inode *target = dentry->d_inode; - int error = may_delete(dir, dentry, 0); + int error = may_delete(mnt, dir, dentry, 0); if (error) return error; @@ -3757,6 +3805,12 @@ int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegate return error; } +EXPORT_SYMBOL(vfs_unlink2); + +int vfs_unlink(struct inode *dir, struct dentry *dentry, struct inode **delegated_inode) +{ + return vfs_unlink2(NULL, dir, dentry, delegated_inode); +} EXPORT_SYMBOL(vfs_unlink); /* @@ -3802,7 +3856,7 @@ static long do_unlinkat(int dfd, const char __user *pathname) error = security_path_unlink(&nd.path, dentry); if (error) goto exit2; - error = vfs_unlink(nd.path.dentry->d_inode, dentry, &delegated_inode); + error = vfs_unlink2(nd.path.mnt, nd.path.dentry->d_inode, dentry, &delegated_inode); exit2: dput(dentry); } @@ -3852,9 +3906,9 @@ SYSCALL_DEFINE1(unlink, const char __user *, pathname) return do_unlinkat(AT_FDCWD, pathname); } -int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) +int vfs_symlink2(struct vfsmount *mnt, struct inode *dir, struct dentry *dentry, const char *oldname) { - int error = may_create(dir, dentry); + int error = may_create(mnt, dir, dentry); if (error) return error; @@ -3871,6 +3925,12 @@ int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) fsnotify_create(dir, dentry); return error; } +EXPORT_SYMBOL(vfs_symlink2); + +int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) +{ + return vfs_symlink2(NULL, dir, dentry, oldname); +} EXPORT_SYMBOL(vfs_symlink); SYSCALL_DEFINE3(symlinkat, const char __user *, oldname, @@ -3893,7 +3953,7 @@ SYSCALL_DEFINE3(symlinkat, const char __user *, oldname, error = security_path_symlink(&path, dentry, from->name); if (!error) - error = vfs_symlink(path.dentry->d_inode, dentry, from->name); + error = vfs_symlink2(path.mnt, path.dentry->d_inode, dentry, from->name); done_path_create(&path, dentry); if (retry_estale(error, lookup_flags)) { lookup_flags |= LOOKUP_REVAL; @@ -3928,7 +3988,7 @@ SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newn * be appropriate for callers that expect the underlying filesystem not * to be NFS exported. */ -int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry, struct inode **delegated_inode) +int vfs_link2(struct vfsmount *mnt, struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry, struct inode **delegated_inode) { struct inode *inode = old_dentry->d_inode; unsigned max_links = dir->i_sb->s_max_links; @@ -3937,7 +3997,7 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de if (!inode) return -ENOENT; - error = may_create(dir, new_dentry); + error = may_create(mnt, dir, new_dentry); if (error) return error; @@ -3980,6 +4040,12 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de fsnotify_link(dir, inode, new_dentry); return error; } +EXPORT_SYMBOL(vfs_link2); + +int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry, struct inode **delegated_inode) +{ + return vfs_link2(NULL, old_dentry, dir, new_dentry, delegated_inode); +} EXPORT_SYMBOL(vfs_link); /* @@ -4035,7 +4101,7 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname, error = security_path_link(old_path.dentry, &new_path, new_dentry); if (error) goto out_dput; - error = vfs_link(old_path.dentry, new_path.dentry->d_inode, new_dentry, &delegated_inode); + error = vfs_link2(old_path.mnt, old_path.dentry, new_path.dentry->d_inode, new_dentry, &delegated_inode); out_dput: done_path_create(&new_path, new_dentry); if (delegated_inode) { @@ -4110,7 +4176,8 @@ SYSCALL_DEFINE2(link, const char __user *, oldname, const char __user *, newname * ->i_mutex on parents, which works but leads to some truly excessive * locking]. */ -int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, +int vfs_rename2(struct vfsmount *mnt, + struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry, struct inode **delegated_inode, unsigned int flags) { @@ -4125,19 +4192,19 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, if (source == target) return 0; - error = may_delete(old_dir, old_dentry, is_dir); + error = may_delete(mnt, old_dir, old_dentry, is_dir); if (error) return error; if (!target) { - error = may_create(new_dir, new_dentry); + error = may_create(mnt, new_dir, new_dentry); } else { new_is_dir = d_is_dir(new_dentry); if (!(flags & RENAME_EXCHANGE)) - error = may_delete(new_dir, new_dentry, is_dir); + error = may_delete(mnt, new_dir, new_dentry, is_dir); else - error = may_delete(new_dir, new_dentry, new_is_dir); + error = may_delete(mnt, new_dir, new_dentry, new_is_dir); } if (error) return error; @@ -4154,12 +4221,12 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, */ if (new_dir != old_dir) { if (is_dir) { - error = inode_permission(source, MAY_WRITE); + error = inode_permission2(mnt, source, MAY_WRITE); if (error) return error; } if ((flags & RENAME_EXCHANGE) && new_is_dir) { - error = inode_permission(target, MAY_WRITE); + error = inode_permission2(mnt, target, MAY_WRITE); if (error) return error; } @@ -4242,6 +4309,14 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, return error; } +EXPORT_SYMBOL(vfs_rename2); + +int vfs_rename(struct inode *old_dir, struct dentry *old_dentry, + struct inode *new_dir, struct dentry *new_dentry, + struct inode **delegated_inode, unsigned int flags) +{ + return vfs_rename2(NULL, old_dir, old_dentry, new_dir, new_dentry, delegated_inode, flags); +} EXPORT_SYMBOL(vfs_rename); SYSCALL_DEFINE5(renameat2, int, olddfd, const char __user *, oldname, @@ -4356,7 +4431,7 @@ SYSCALL_DEFINE5(renameat2, int, olddfd, const char __user *, oldname, &newnd.path, new_dentry, flags); if (error) goto exit5; - error = vfs_rename(old_dir->d_inode, old_dentry, + error = vfs_rename2(oldnd.path.mnt, old_dir->d_inode, old_dentry, new_dir->d_inode, new_dentry, &delegated_inode, flags); exit5: @@ -4401,7 +4476,7 @@ SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newna int vfs_whiteout(struct inode *dir, struct dentry *dentry) { - int error = may_create(dir, dentry); + int error = may_create(NULL, dir, dentry); if (error) return error; diff --git a/fs/namespace.c b/fs/namespace.c index ff5ba8c5c4e97..9953cc3924a69 100644 --- a/fs/namespace.c +++ b/fs/namespace.c @@ -568,6 +568,7 @@ int sb_prepare_remount_readonly(struct super_block *sb) static void free_vfsmnt(struct mount *mnt) { + kfree(mnt->mnt.data); kfree(mnt->mnt_devname); #ifdef CONFIG_SMP free_percpu(mnt->mnt_pcp); @@ -901,11 +902,21 @@ vfs_kern_mount(struct file_system_type *type, int flags, const char *name, void if (!mnt) return ERR_PTR(-ENOMEM); + mnt->mnt.data = NULL; + if (type->alloc_mnt_data) { + mnt->mnt.data = type->alloc_mnt_data(); + if (!mnt->mnt.data) { + mnt_free_id(mnt); + free_vfsmnt(mnt); + return ERR_PTR(-ENOMEM); + } + } if (flags & MS_KERNMOUNT) mnt->mnt.mnt_flags = MNT_INTERNAL; - root = mount_fs(type, flags, name, data); + root = mount_fs(type, flags, name, &mnt->mnt, data); if (IS_ERR(root)) { + kfree(mnt->mnt.data); mnt_free_id(mnt); free_vfsmnt(mnt); return ERR_CAST(root); @@ -933,6 +944,14 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root, if (!mnt) return ERR_PTR(-ENOMEM); + if (sb->s_op->clone_mnt_data) { + mnt->mnt.data = sb->s_op->clone_mnt_data(old->mnt.data); + if (!mnt->mnt.data) { + err = -ENOMEM; + goto out_free; + } + } + if (flag & (CL_SLAVE | CL_PRIVATE | CL_SHARED_TO_SLAVE)) mnt->mnt_group_id = 0; /* not a peer of original */ else @@ -1000,6 +1019,7 @@ static struct mount *clone_mnt(struct mount *old, struct dentry *root, return mnt; out_free: + kfree(mnt->mnt.data); mnt_free_id(mnt); free_vfsmnt(mnt); return ERR_PTR(err); @@ -2139,8 +2159,14 @@ static int do_remount(struct path *path, int flags, int mnt_flags, err = change_mount_flags(path->mnt, flags); else if (!capable(CAP_SYS_ADMIN)) err = -EPERM; - else - err = do_remount_sb(sb, flags, data, 0); + else { + err = do_remount_sb2(path->mnt, sb, flags, data, 0); + namespace_lock(); + lock_mount_hash(); + propagate_remount(mnt); + unlock_mount_hash(); + namespace_unlock(); + } if (!err) { lock_mount_hash(); mnt_flags |= mnt->mnt.mnt_flags & ~MNT_USER_SETTABLE_MASK; diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c index c991616acca9e..fcbb414721d22 100644 --- a/fs/notify/fanotify/fanotify_user.c +++ b/fs/notify/fanotify/fanotify_user.c @@ -475,7 +475,7 @@ static int fanotify_find_path(int dfd, const char __user *filename, } /* you can only watch an inode if you have read permissions on it */ - ret = inode_permission(path->dentry->d_inode, MAY_READ); + ret = inode_permission2(path->mnt, path->dentry->d_inode, MAY_READ); if (ret) path_put(path); out: diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c index 8637f33b826d5..b2ddc882dac92 100644 --- a/fs/notify/inotify/inotify_user.c +++ b/fs/notify/inotify/inotify_user.c @@ -338,7 +338,7 @@ static int inotify_find_inode(const char __user *dirname, struct path *path, uns if (error) return error; /* you can only watch an inode if you have read permissions on it */ - error = inode_permission(path->dentry->d_inode, MAY_READ); + error = inode_permission2(path->mnt, path->dentry->d_inode, MAY_READ); if (error) path_put(path); return error; @@ -735,7 +735,7 @@ SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname, /* support stacked filesystems */ if(path.dentry && path.dentry->d_op) { if (path.dentry->d_op->d_canonical_path) { - path.dentry->d_op->d_canonical_path(path.dentry, &alteredpath); + path.dentry->d_op->d_canonical_path(&path, &alteredpath); canonical_path = &alteredpath; path_put(&path); } diff --git a/fs/ocfs2/acl.c b/fs/ocfs2/acl.c index 7e8282dcea2a9..b3600c705528a 100644 --- a/fs/ocfs2/acl.c +++ b/fs/ocfs2/acl.c @@ -241,9 +241,10 @@ int ocfs2_set_acl(handle_t *handle, case ACL_TYPE_ACCESS: name_index = OCFS2_XATTR_INDEX_POSIX_ACL_ACCESS; if (acl) { - umode_t mode = inode->i_mode; - ret = posix_acl_equiv_mode(acl, &mode); - if (ret < 0) + umode_t mode; + + ret = posix_acl_update_mode(inode, &mode, &acl); + if (ret) return ret; else { if (ret == 0) @@ -253,7 +254,6 @@ int ocfs2_set_acl(handle_t *handle, handle, mode); if (ret) return ret; - } } break; diff --git a/fs/open.c b/fs/open.c index 1651f35d50f5c..d7e0e1b8b0cf9 100644 --- a/fs/open.c +++ b/fs/open.c @@ -34,8 +34,8 @@ #include "internal.h" -int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, - struct file *filp) +int do_truncate2(struct vfsmount *mnt, struct dentry *dentry, loff_t length, + unsigned int time_attrs, struct file *filp) { int ret; struct iattr newattrs; @@ -58,17 +58,24 @@ int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, mutex_lock(&dentry->d_inode->i_mutex); /* Note any delegations or leases have already been broken: */ - ret = notify_change(dentry, &newattrs, NULL); + ret = notify_change2(mnt, dentry, &newattrs, NULL); mutex_unlock(&dentry->d_inode->i_mutex); return ret; } +int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs, + struct file *filp) +{ + return do_truncate2(NULL, dentry, length, time_attrs, filp); +} long vfs_truncate(struct path *path, loff_t length) { struct inode *inode; + struct vfsmount *mnt; long error; inode = path->dentry->d_inode; + mnt = path->mnt; /* For directories it's -EISDIR, for other non-regulars - -EINVAL */ if (S_ISDIR(inode->i_mode)) @@ -80,7 +87,7 @@ long vfs_truncate(struct path *path, loff_t length) if (error) goto out; - error = inode_permission(inode, MAY_WRITE); + error = inode_permission2(mnt, inode, MAY_WRITE); if (error) goto mnt_drop_write_and_out; @@ -104,7 +111,7 @@ long vfs_truncate(struct path *path, loff_t length) if (!error) error = security_path_truncate(path); if (!error) - error = do_truncate(path->dentry, length, 0, NULL); + error = do_truncate2(mnt, path->dentry, length, 0, NULL); put_write_and_out: put_write_access(inode); @@ -153,6 +160,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) { struct inode *inode; struct dentry *dentry; + struct vfsmount *mnt; struct fd f; int error; @@ -169,6 +177,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) small = 0; dentry = f.file->f_path.dentry; + mnt = f.file->f_path.mnt; inode = dentry->d_inode; error = -EINVAL; if (!S_ISREG(inode->i_mode) || !(f.file->f_mode & FMODE_WRITE)) @@ -188,7 +197,7 @@ static long do_sys_ftruncate(unsigned int fd, loff_t length, int small) if (!error) error = security_path_truncate(&f.file->f_path); if (!error) - error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, f.file); + error = do_truncate2(mnt, dentry, length, ATTR_MTIME|ATTR_CTIME, f.file); sb_end_write(inode->i_sb); out_putf: fdput(f); @@ -322,6 +331,7 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) struct cred *override_cred; struct path path; struct inode *inode; + struct vfsmount *mnt; int res; unsigned int lookup_flags = LOOKUP_FOLLOW; @@ -352,6 +362,7 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) goto out; inode = path.dentry->d_inode; + mnt = path.mnt; if ((mode & MAY_EXEC) && S_ISREG(inode->i_mode)) { /* @@ -363,7 +374,7 @@ SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode) goto out_path_release; } - res = inode_permission(inode, mode | MAY_ACCESS); + res = inode_permission2(mnt, inode, mode | MAY_ACCESS); /* SuS v2 requires we report a read only fs too */ if (res || !(mode & S_IWOTH) || special_file(inode->i_mode)) goto out_path_release; @@ -407,7 +418,7 @@ SYSCALL_DEFINE1(chdir, const char __user *, filename) if (error) goto out; - error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); + error = inode_permission2(path.mnt, path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); if (error) goto dput_and_out; @@ -427,6 +438,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) { struct fd f = fdget_raw(fd); struct inode *inode; + struct vfsmount *mnt; int error = -EBADF; error = -EBADF; @@ -434,12 +446,13 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd) goto out; inode = file_inode(f.file); + mnt = f.file->f_path.mnt; error = -ENOTDIR; if (!S_ISDIR(inode->i_mode)) goto out_putf; - error = inode_permission(inode, MAY_EXEC | MAY_CHDIR); + error = inode_permission2(mnt, inode, MAY_EXEC | MAY_CHDIR); if (!error) set_fs_pwd(current->fs, &f.file->f_path); out_putf: @@ -458,7 +471,7 @@ SYSCALL_DEFINE1(chroot, const char __user *, filename) if (error) goto out; - error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); + error = inode_permission2(path.mnt, path.dentry->d_inode, MAY_EXEC | MAY_CHDIR); if (error) goto dput_and_out; @@ -498,7 +511,7 @@ static int chmod_common(struct path *path, umode_t mode) goto out_unlock; newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO); newattrs.ia_valid = ATTR_MODE | ATTR_CTIME; - error = notify_change(path->dentry, &newattrs, &delegated_inode); + error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode); out_unlock: mutex_unlock(&inode->i_mutex); if (delegated_inode) { @@ -578,7 +591,7 @@ static int chown_common(struct path *path, uid_t user, gid_t group) mutex_lock(&inode->i_mutex); error = security_path_chown(path, uid, gid); if (!error) - error = notify_change(path->dentry, &newattrs, &delegated_inode); + error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode); mutex_unlock(&inode->i_mutex); if (delegated_inode) { error = break_deleg_wait(&delegated_inode); diff --git a/fs/pnode.c b/fs/pnode.c index aae331a5d03b2..33ab85985473a 100644 --- a/fs/pnode.c +++ b/fs/pnode.c @@ -403,3 +403,18 @@ int propagate_umount(struct hlist_head *list) __propagate_umount(mnt); return 0; } + +int propagate_remount(struct mount *mnt) +{ + struct mount *m; + struct super_block *sb = mnt->mnt.mnt_sb; + int ret = 0; + + if (sb->s_op->copy_mnt_data) { + for (m = first_slave(mnt); m->mnt_slave.next != &mnt->mnt_slave_list; m = next_slave(m)) { + sb->s_op->copy_mnt_data(m->mnt.data, mnt->mnt.data); + } + } + + return ret; +} diff --git a/fs/pnode.h b/fs/pnode.h index 16afc3d6d2f2d..47dc0399da603 100644 --- a/fs/pnode.h +++ b/fs/pnode.h @@ -42,6 +42,7 @@ int propagate_mnt(struct mount *, struct mountpoint *, struct mount *, struct hlist_head *); int propagate_umount(struct hlist_head *); int propagate_mount_busy(struct mount *, int); +int propagate_remount(struct mount *); void mnt_release_group_id(struct mount *); int get_dominating_id(struct mount *mnt, const struct path *root); unsigned int mnt_get_count(struct mount *mnt); diff --git a/fs/posix_acl.c b/fs/posix_acl.c index 0855f772cd415..73aad912314e2 100644 --- a/fs/posix_acl.c +++ b/fs/posix_acl.c @@ -594,6 +594,37 @@ posix_acl_create(struct inode *dir, umode_t *mode, } EXPORT_SYMBOL_GPL(posix_acl_create); +/** + * posix_acl_update_mode - update mode in set_acl + * + * Update the file mode when setting an ACL: compute the new file permission + * bits based on the ACL. In addition, if the ACL is equivalent to the new + * file mode, set *acl to NULL to indicate that no ACL should be set. + * + * As with chmod, clear the setgit bit if the caller is not in the owning group + * or capable of CAP_FSETID (see inode_change_ok). + * + * Called from set_acl inode operations. + */ +int posix_acl_update_mode(struct inode *inode, umode_t *mode_p, + struct posix_acl **acl) +{ + umode_t mode = inode->i_mode; + int error; + + error = posix_acl_equiv_mode(*acl, &mode); + if (error < 0) + return error; + if (error == 0) + *acl = NULL; + if (!in_group_p(inode->i_gid) && + !capable_wrt_inode_uidgid(inode, CAP_FSETID)) + mode &= ~S_ISGID; + *mode_p = mode; + return 0; +} +EXPORT_SYMBOL(posix_acl_update_mode); + /* * Fix up the uids and gids in posix acl extended attributes in place. */ diff --git a/fs/proc/array.c b/fs/proc/array.c index 864f2e52cf1bc..6307f8774a11d 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -159,16 +159,16 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, int g; struct fdtable *fdt = NULL; const struct cred *cred; - pid_t ppid, tpid; + pid_t ppid = 0, tpid = 0; + struct task_struct *leader = NULL; rcu_read_lock(); - ppid = pid_alive(p) ? - task_tgid_nr_ns(rcu_dereference(p->real_parent), ns) : 0; - tpid = 0; if (pid_alive(p)) { struct task_struct *tracer = ptrace_parent(p); if (tracer) tpid = task_pid_nr_ns(tracer, ns); + ppid = task_tgid_nr_ns(rcu_dereference(p->real_parent), ns); + leader = p->group_leader; } cred = get_task_cred(p); seq_printf(m, @@ -181,7 +181,7 @@ static inline void task_state(struct seq_file *m, struct pid_namespace *ns, "Gid:\t%d\t%d\t%d\t%d\n" "Ngid:\t%d\n", get_task_state(p), - task_tgid_nr_ns(p, ns), + leader ? task_pid_nr_ns(leader, ns) : 0, pid_nr_ns(pid, ns), ppid, tpid, from_kuid_munged(user_ns, cred->uid), diff --git a/fs/proc/base.c b/fs/proc/base.c index 9dd8651960add..bfbeb596a576e 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -752,7 +752,8 @@ static ssize_t environ_read(struct file *file, char __user *buf, int ret = 0; struct mm_struct *mm = file->private_data; - if (!mm) + /* Ensure the process spawned far enough to have an environment. */ + if (!mm || !mm->env_end) return 0; page = (char *)__get_free_page(GFP_TEMPORARY); diff --git a/fs/proc/root.c b/fs/proc/root.c index 9e772f1a5386f..7863ed5a6a88f 100644 --- a/fs/proc/root.c +++ b/fs/proc/root.c @@ -121,6 +121,13 @@ static struct dentry *proc_mount(struct file_system_type *fs_type, if (IS_ERR(sb)) return ERR_CAST(sb); + /* + * procfs isn't actually a stacking filesystem; however, there is + * too much magic going on inside it to permit stacking things on + * top of it + */ + sb->s_stack_depth = FILESYSTEM_MAX_STACK_DEPTH; + if (!proc_parse_options(options, ns)) { deactivate_locked_super(sb); return ERR_PTR(-EINVAL); diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 251cc6e8bef8b..69dc4a339bce0 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -1400,7 +1400,7 @@ const struct file_operations proc_pagemap_operations = { #endif /* CONFIG_PROC_PAGE_MONITOR */ #ifdef CONFIG_PROCESS_RECLAIM -static int reclaim_pte_range(pmd_t *pmd, unsigned long addr, +int reclaim_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end, struct mm_walk *walk) { struct reclaim_param *rp = walk->private; @@ -1427,6 +1427,9 @@ static int reclaim_pte_range(pmd_t *pmd, unsigned long addr, if (!page) continue; + if (page_mapcount(page) != 1) + continue; + if (isolate_lru_page(page)) continue; @@ -1449,7 +1452,7 @@ static int reclaim_pte_range(pmd_t *pmd, unsigned long addr, goto cont; cond_resched(); - return 0; + return (rp->nr_to_reclaim == 0) ? -EPIPE : 0; } enum reclaim_type { @@ -1517,6 +1520,7 @@ static ssize_t reclaim_write(struct file *file, const char __user *buf, unsigned long start = 0; unsigned long end = 0; struct reclaim_param rp; + int ret; memset(buffer, 0, sizeof(buffer)); if (count > sizeof(buffer) - 1) @@ -1578,7 +1582,7 @@ static ssize_t reclaim_write(struct file *file, const char __user *buf, reclaim_walk.mm = mm; reclaim_walk.pmd_entry = reclaim_pte_range; - rp.nr_to_reclaim = ~0; + rp.nr_to_reclaim = INT_MAX; rp.nr_reclaimed = 0; reclaim_walk.private = &rp; @@ -1592,9 +1596,11 @@ static ssize_t reclaim_write(struct file *file, const char __user *buf, continue; rp.vma = vma; - walk_page_range(max(vma->vm_start, start), + ret = walk_page_range(max(vma->vm_start, start), min(vma->vm_end, end), &reclaim_walk); + if (ret) + break; vma = vma->vm_next; } } else { @@ -1609,8 +1615,10 @@ static ssize_t reclaim_write(struct file *file, const char __user *buf, continue; rp.vma = vma; - walk_page_range(vma->vm_start, vma->vm_end, + ret = walk_page_range(vma->vm_start, vma->vm_end, &reclaim_walk); + if (ret) + break; } } diff --git a/fs/proc_namespace.c b/fs/proc_namespace.c index 73ca1740d8395..f68d0fe2abd40 100644 --- a/fs/proc_namespace.c +++ b/fs/proc_namespace.c @@ -112,7 +112,9 @@ static int show_vfsmnt(struct seq_file *m, struct vfsmount *mnt) if (err) goto out; show_mnt_opts(m, mnt); - if (sb->s_op->show_options) + if (sb->s_op->show_options2) + err = sb->s_op->show_options2(mnt, m, mnt_path.dentry); + else if (sb->s_op->show_options) err = sb->s_op->show_options(m, mnt_path.dentry); seq_puts(m, " 0 0\n"); out: @@ -173,7 +175,9 @@ static int show_mountinfo(struct seq_file *m, struct vfsmount *mnt) err = show_sb_opts(m, sb); if (err) goto out; - if (sb->s_op->show_options) + if (sb->s_op->show_options2) { + err = sb->s_op->show_options2(mnt, m, mnt->mnt_root); + } else if (sb->s_op->show_options) err = sb->s_op->show_options(m, mnt->mnt_root); seq_putc(m, '\n'); out: diff --git a/fs/pstore/Kconfig b/fs/pstore/Kconfig index 916b8e23d9684..11aff0a7fc495 100644 --- a/fs/pstore/Kconfig +++ b/fs/pstore/Kconfig @@ -60,3 +60,11 @@ config PSTORE_RAM "ramoops.ko". For more information, see Documentation/ramoops.txt. + +config PSTORE_LAST_KMSG + bool "export /proc/last_kmsg" + default y + depends on PSTORE + help + When the option is enabled, pstore will export a proc filesystem + interface /proc/last_kmsg. diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c index 6dce93c8ac290..eda661c008a43 100644 --- a/fs/pstore/inode.c +++ b/fs/pstore/inode.c @@ -36,6 +36,9 @@ #include #include #include +#ifdef CONFIG_PSTORE_LAST_KMSG +#include +#endif #include "internal.h" @@ -270,6 +273,24 @@ int pstore_is_mounted(void) return pstore_sb != NULL; } +#ifdef CONFIG_PSTORE_LAST_KMSG +static char *console_buffer; +static ssize_t console_bufsize; + +static ssize_t last_kmsg_read(struct file *file, char __user *buf, + size_t len, loff_t *offset) +{ + return simple_read_from_buffer(buf, len, offset, + console_buffer, console_bufsize); +} + +static const struct file_operations last_kmsg_fops = { + .owner = THIS_MODULE, + .read = last_kmsg_read, + .llseek = default_llseek, +}; +#endif + /* * Make a regular file in the root directory of our file system. * Load it up with "size" bytes of data from "buf". @@ -371,6 +392,13 @@ int pstore_mkfile(enum pstore_type_id type, char *psname, u64 id, int count, list_add(&private->list, &allpstore); spin_unlock_irqrestore(&allpstore_lock, flags); +#ifdef CONFIG_PSTORE_LAST_KMSG + if (type == PSTORE_TYPE_CONSOLE) { + console_buffer = private->data; + console_bufsize = size; + } +#endif + mutex_unlock(&root->d_inode->i_mutex); return 0; @@ -441,6 +469,9 @@ static struct kobject *pstore_kobj; static int __init init_pstore_fs(void) { int err = 0; +#ifdef CONFIG_PSTORE_LAST_KMSG + struct proc_dir_entry *last_kmsg_entry = NULL; +#endif /* Create a convenient mount point for people to access pstore */ pstore_kobj = kobject_create_and_add("pstore", fs_kobj); @@ -453,6 +484,15 @@ static int __init init_pstore_fs(void) if (err < 0) kobject_put(pstore_kobj); +#ifdef CONFIG_PSTORE_LAST_KMSG + last_kmsg_entry = proc_create_data("last_kmsg", S_IFREG | S_IRUGO, + NULL, &last_kmsg_fops, NULL); + if (!last_kmsg_entry) { + pr_err("Failed to create last_kmsg\n"); + goto out; + } +#endif + out: return err; } diff --git a/fs/pstore/ram.c b/fs/pstore/ram.c index c28dc6802cf4f..ab64d4ff2bfd0 100644 --- a/fs/pstore/ram.c +++ b/fs/pstore/ram.c @@ -34,16 +34,22 @@ #include #include #include +#include +#include #define RAMOOPS_KERNMSG_HDR "====" #define MIN_MEM_SIZE 4096UL +#define SZ_2_1M 0x100000 +#define PSTORE_RAM_SIZE_DEFAULT SZ_2_1M +#define RAM_MAX_MEM (1 << 31) + static ulong record_size = MIN_MEM_SIZE; module_param(record_size, ulong, 0400); MODULE_PARM_DESC(record_size, "size of each dump done on oops/panic"); -static ulong ramoops_console_size = MIN_MEM_SIZE; +static ulong ramoops_console_size = 256*1024UL; module_param_named(console_size, ramoops_console_size, ulong, 0400); MODULE_PARM_DESC(console_size, "size of kernel console log"); @@ -625,6 +631,36 @@ static void ramoops_register_dummy(void) } } +void __init pstore_ram_reserve_memory(void) +{ + phys_addr_t mem; + size_t size; + int ret; + + size = PSTORE_RAM_SIZE_DEFAULT; + size = ALIGN(size, PAGE_SIZE); + + mem = memblock_find_in_range(0, RAM_MAX_MEM, size, PAGE_SIZE); + if (!mem) { + pr_err("Cannot find memblock range for pstore_ram\n"); + return; + } + + ret = memblock_reserve(mem, size); + if (ret) { + pr_err("Failed to reserve memory from 0x%llx-0x%llx\n", + (unsigned long long)mem, + (unsigned long long)(mem + size - 1)); + return; + } + + mem_address = mem; + mem_size = size; + + printk("reserved RAM buffer: mem_address:0x%zx mem_size:0x%llx \n", + size, (unsigned long long)mem); +} + static int __init ramoops_init(void) { ramoops_register_dummy(); diff --git a/fs/reiserfs/xattr_acl.c b/fs/reiserfs/xattr_acl.c index 4b34b9dc03dda..97c462e0178c3 100644 --- a/fs/reiserfs/xattr_acl.c +++ b/fs/reiserfs/xattr_acl.c @@ -246,13 +246,10 @@ __reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode, case ACL_TYPE_ACCESS: name = POSIX_ACL_XATTR_ACCESS; if (acl) { - error = posix_acl_equiv_mode(acl, &inode->i_mode); - if (error < 0) + error = posix_acl_update_mode(inode, + &inode->i_mode, &acl); + if (error) return error; - else { - if (error == 0) - acl = NULL; - } } break; case ACL_TYPE_DEFAULT: diff --git a/fs/sdcardfs/dentry.c b/fs/sdcardfs/dentry.c index ba165ef11e272..0466b55fa25ee 100644 --- a/fs/sdcardfs/dentry.c +++ b/fs/sdcardfs/dentry.c @@ -34,6 +34,8 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) struct dentry *parent_lower_dentry = NULL; struct dentry *lower_cur_parent_dentry = NULL; struct dentry *lower_dentry = NULL; + struct inode *inode; + struct sdcardfs_inode_data *data; if (flags & LOOKUP_RCU) return -ECHILD; @@ -46,7 +48,8 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) spin_unlock(&dentry->d_lock); /* check uninitialized obb_dentry and - * whether the base obbpath has been changed or not */ + * whether the base obbpath has been changed or not + */ if (is_obbpath_invalid(dentry)) { d_drop(dentry); return 0; @@ -59,6 +62,14 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) lower_dentry = lower_path.dentry; lower_cur_parent_dentry = dget_parent(lower_dentry); + if ((lower_dentry->d_flags & DCACHE_OP_REVALIDATE)) { + err = lower_dentry->d_op->d_revalidate(lower_dentry, flags); + if (err == 0) { + d_drop(dentry); + goto out; + } + } + spin_lock(&lower_dentry->d_lock); if (d_unhashed(lower_dentry)) { spin_unlock(&lower_dentry->d_lock); @@ -76,17 +87,13 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) if (dentry < lower_dentry) { spin_lock(&dentry->d_lock); - spin_lock(&lower_dentry->d_lock); + spin_lock_nested(&lower_dentry->d_lock, DENTRY_D_LOCK_NESTED); } else { spin_lock(&lower_dentry->d_lock); - spin_lock(&dentry->d_lock); + spin_lock_nested(&dentry->d_lock, DENTRY_D_LOCK_NESTED); } - if (dentry->d_name.len != lower_dentry->d_name.len) { - __d_drop(dentry); - err = 0; - } else if (strncasecmp(dentry->d_name.name, lower_dentry->d_name.name, - dentry->d_name.len) != 0) { + if (!qstr_case_eq(&dentry->d_name, &lower_dentry->d_name)) { __d_drop(dentry); err = 0; } @@ -98,6 +105,21 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) spin_unlock(&dentry->d_lock); spin_unlock(&lower_dentry->d_lock); } + if (!err) + goto out; + + /* If our top's inode is gone, we may be out of date */ + inode = igrab(dentry->d_inode); + if (inode) { + data = top_data_get(SDCARDFS_I(inode)); + if (!data || data->abandoned) { + d_drop(dentry); + err = 0; + } + if (data) + data_put(data); + iput(inode); + } out: dput(parent_dentry); @@ -110,12 +132,10 @@ static int sdcardfs_d_revalidate(struct dentry *dentry, unsigned int flags) static void sdcardfs_d_release(struct dentry *dentry) { /* release and reset the lower paths */ - if(has_graft_path(dentry)) { + if (has_graft_path(dentry)) sdcardfs_put_reset_orig_path(dentry); - } sdcardfs_put_reset_lower_path(dentry); free_dentry_private_data(dentry); - return; } static int sdcardfs_hash_ci(const struct dentry *dentry, @@ -132,12 +152,10 @@ static int sdcardfs_hash_ci(const struct dentry *dentry, unsigned long hash; name = qstr->name; - //len = vfat_striptail_len(qstr); len = qstr->len; hash = init_name_hash(); while (len--) - //hash = partial_name_hash(nls_tolower(t, *name++), hash); hash = partial_name_hash(tolower(*name++), hash); qstr->hash = end_name_hash(hash); @@ -151,32 +169,26 @@ static int sdcardfs_cmp_ci(const struct dentry *parent, const struct dentry *dentry, unsigned int len, const char *str, const struct qstr *name) { - /* This function is copy of vfat_cmpi */ - // FIXME Should we support national language? - //struct nls_table *t = MSDOS_SB(parent->d_sb)->nls_io; - //unsigned int alen, blen; + /* FIXME Should we support national language? */ - /* A filename cannot end in '.' or we treat it like it has none */ - /* - alen = vfat_striptail_len(name); - blen = __vfat_striptail_len(len, str); - if (alen == blen) { - if (nls_strnicmp(t, name->name, str, alen) == 0) - return 0; - } - */ if (name->len == len) { - if (strncasecmp(name->name, str, len) == 0) + if (str_n_case_eq(name->name, str, len)) return 0; } return 1; } +static void sdcardfs_canonical_path(const struct path *path, + struct path *actual_path) +{ + sdcardfs_get_real_lower(path->dentry, actual_path); +} + const struct dentry_operations sdcardfs_ci_dops = { .d_revalidate = sdcardfs_d_revalidate, .d_release = sdcardfs_d_release, - .d_hash = sdcardfs_hash_ci, + .d_hash = sdcardfs_hash_ci, .d_compare = sdcardfs_cmp_ci, - .d_canonical_path = sdcardfs_get_real_lower, + .d_canonical_path = sdcardfs_canonical_path, }; diff --git a/fs/sdcardfs/derived_perm.c b/fs/sdcardfs/derived_perm.c index 128b3e56851fb..d567eddb333ed 100644 --- a/fs/sdcardfs/derived_perm.c +++ b/fs/sdcardfs/derived_perm.c @@ -26,100 +26,302 @@ static void inherit_derived_state(struct inode *parent, struct inode *child) struct sdcardfs_inode_info *pi = SDCARDFS_I(parent); struct sdcardfs_inode_info *ci = SDCARDFS_I(child); - ci->perm = PERM_INHERIT; - ci->userid = pi->userid; - ci->d_uid = pi->d_uid; - ci->under_android = pi->under_android; + ci->data->perm = PERM_INHERIT; + ci->data->userid = pi->data->userid; + ci->data->d_uid = pi->data->d_uid; + ci->data->under_android = pi->data->under_android; + ci->data->under_cache = pi->data->under_cache; + ci->data->under_obb = pi->data->under_obb; + set_top(ci, pi->top_data); } /* helper function for derived state */ -void setup_derived_state(struct inode *inode, perm_t perm, - userid_t userid, uid_t uid, bool under_android) +void setup_derived_state(struct inode *inode, perm_t perm, userid_t userid, + uid_t uid, bool under_android, + struct sdcardfs_inode_data *top) { struct sdcardfs_inode_info *info = SDCARDFS_I(inode); - info->perm = perm; - info->userid = userid; - info->d_uid = uid; - info->under_android = under_android; + info->data->perm = perm; + info->data->userid = userid; + info->data->d_uid = uid; + info->data->under_android = under_android; + info->data->under_cache = false; + info->data->under_obb = false; + set_top(info, top); } -/* While renaming, there is a point where we want the path from dentry, but the name from newdentry */ -void get_derived_permission_new(struct dentry *parent, struct dentry *dentry, struct dentry *newdentry) +/* While renaming, there is a point where we want the path from dentry, + * but the name from newdentry + */ +void get_derived_permission_new(struct dentry *parent, struct dentry *dentry, + const struct qstr *name) { - struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); struct sdcardfs_inode_info *info = SDCARDFS_I(dentry->d_inode); - struct sdcardfs_inode_info *parent_info= SDCARDFS_I(parent->d_inode); + struct sdcardfs_inode_data *parent_data = + SDCARDFS_I(parent->d_inode)->data; appid_t appid; + unsigned long user_num; + int err; + struct qstr q_Android = QSTR_LITERAL("Android"); + struct qstr q_data = QSTR_LITERAL("data"); + struct qstr q_obb = QSTR_LITERAL("obb"); + struct qstr q_media = QSTR_LITERAL("media"); + struct qstr q_cache = QSTR_LITERAL("cache"); /* By default, each inode inherits from its parent. * the properties are maintained on its private fields * because the inode attributes will be modified with that of * its lower inode. - * The derived state will be updated on the last - * stage of each system call by fix_derived_permission(inode). + * These values are used by our custom permission call instead + * of using the inode permissions. */ inherit_derived_state(parent->d_inode, dentry->d_inode); + /* Files don't get special labels */ + if (!S_ISDIR(dentry->d_inode->i_mode)) + return; /* Derive custom permissions based on parent and current node */ - switch (parent_info->perm) { - case PERM_INHERIT: - /* Already inherited above */ - break; - case PERM_PRE_ROOT: - /* Legacy internal layout places users at top level */ - info->perm = PERM_ROOT; - info->userid = simple_strtoul(newdentry->d_name.name, NULL, 10); - break; - case PERM_ROOT: - /* Assume masked off by default. */ - if (!strcasecmp(newdentry->d_name.name, "Android")) { - /* App-specific directories inside; let anyone traverse */ - info->perm = PERM_ANDROID; - info->under_android = true; - } - break; - case PERM_ANDROID: - if (!strcasecmp(newdentry->d_name.name, "data")) { - /* App-specific directories inside; let anyone traverse */ - info->perm = PERM_ANDROID_DATA; - } else if (!strcasecmp(newdentry->d_name.name, "obb")) { - /* App-specific directories inside; let anyone traverse */ - info->perm = PERM_ANDROID_OBB; - /* Single OBB directory is always shared */ - } else if (!strcasecmp(newdentry->d_name.name, "media")) { - /* App-specific directories inside; let anyone traverse */ - info->perm = PERM_ANDROID_MEDIA; - } - break; - case PERM_ANDROID_DATA: - case PERM_ANDROID_OBB: - case PERM_ANDROID_MEDIA: - appid = get_appid(sbi->pkgl_id, newdentry->d_name.name); - if (appid != 0) { - info->d_uid = multiuser_get_uid(parent_info->userid, appid); - } - break; + switch (parent_data->perm) { + case PERM_INHERIT: + case PERM_ANDROID_PACKAGE_CACHE: + /* Already inherited above */ + break; + case PERM_PRE_ROOT: + /* Legacy internal layout places users at top level */ + info->data->perm = PERM_ROOT; + err = kstrtoul(name->name, 10, &user_num); + if (err) + info->data->userid = 0; + else + info->data->userid = user_num; + set_top(info, info->data); + break; + case PERM_ROOT: + /* Assume masked off by default. */ + if (qstr_case_eq(name, &q_Android)) { + /* App-specific directories inside; let anyone traverse */ + info->data->perm = PERM_ANDROID; + info->data->under_android = true; + set_top(info, info->data); + } + break; + case PERM_ANDROID: + if (qstr_case_eq(name, &q_data)) { + /* App-specific directories inside; let anyone traverse */ + info->data->perm = PERM_ANDROID_DATA; + set_top(info, info->data); + } else if (qstr_case_eq(name, &q_obb)) { + /* App-specific directories inside; let anyone traverse */ + info->data->perm = PERM_ANDROID_OBB; + info->data->under_obb = true; + set_top(info, info->data); + /* Single OBB directory is always shared */ + } else if (qstr_case_eq(name, &q_media)) { + /* App-specific directories inside; let anyone traverse */ + info->data->perm = PERM_ANDROID_MEDIA; + set_top(info, info->data); + } + break; + case PERM_ANDROID_OBB: + case PERM_ANDROID_DATA: + case PERM_ANDROID_MEDIA: + info->data->perm = PERM_ANDROID_PACKAGE; + appid = get_appid(name->name); + if (appid != 0 && !is_excluded(name->name, parent_data->userid)) + info->data->d_uid = + multiuser_get_uid(parent_data->userid, appid); + set_top(info, info->data); + break; + case PERM_ANDROID_PACKAGE: + if (qstr_case_eq(name, &q_cache)) { + info->data->perm = PERM_ANDROID_PACKAGE_CACHE; + info->data->under_cache = true; + } + break; } } void get_derived_permission(struct dentry *parent, struct dentry *dentry) { - get_derived_permission_new(parent, dentry, dentry); + get_derived_permission_new(parent, dentry, &dentry->d_name); } -void get_derive_permissions_recursive(struct dentry *parent) { - struct dentry *dentry; - list_for_each_entry(dentry, &parent->d_subdirs, d_child) { - if (dentry && dentry->d_inode) { - mutex_lock(&dentry->d_inode->i_mutex); - get_derived_permission(parent, dentry); - fix_derived_permission(dentry->d_inode); - get_derive_permissions_recursive(dentry); - mutex_unlock(&dentry->d_inode->i_mutex); +static appid_t get_type(const char *name) +{ + const char *ext = strrchr(name, '.'); + appid_t id; + + if (ext && ext[0]) { + ext = &ext[1]; + id = get_ext_gid(ext); + return id?:AID_MEDIA_RW; + } + return AID_MEDIA_RW; +} + +void fixup_lower_ownership(struct dentry *dentry, const char *name) +{ + struct path path; + struct inode *inode; + struct inode *delegated_inode = NULL; + int error; + struct sdcardfs_inode_info *info; + struct sdcardfs_inode_data *info_d; + struct sdcardfs_inode_data *info_top; + perm_t perm; + struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); + uid_t uid = sbi->options.fs_low_uid; + gid_t gid = sbi->options.fs_low_gid; + struct iattr newattrs; + + info = SDCARDFS_I(dentry->d_inode); + info_d = info->data; + perm = info_d->perm; + if (info_d->under_obb) { + perm = PERM_ANDROID_OBB; + } else if (info_d->under_cache) { + perm = PERM_ANDROID_PACKAGE_CACHE; + } else if (perm == PERM_INHERIT) { + info_top = top_data_get(info); + perm = info_top->perm; + data_put(info_top); + } + + switch (perm) { + case PERM_ROOT: + case PERM_ANDROID: + case PERM_ANDROID_DATA: + case PERM_ANDROID_MEDIA: + case PERM_ANDROID_PACKAGE: + case PERM_ANDROID_PACKAGE_CACHE: + uid = multiuser_get_uid(info_d->userid, uid); + break; + case PERM_ANDROID_OBB: + uid = AID_MEDIA_OBB; + break; + case PERM_PRE_ROOT: + default: + break; + } + switch (perm) { + case PERM_ROOT: + case PERM_ANDROID: + case PERM_ANDROID_DATA: + case PERM_ANDROID_MEDIA: + if (S_ISDIR(dentry->d_inode->i_mode)) + gid = multiuser_get_uid(info_d->userid, AID_MEDIA_RW); + else + gid = multiuser_get_uid(info_d->userid, get_type(name)); + break; + case PERM_ANDROID_OBB: + gid = AID_MEDIA_OBB; + break; + case PERM_ANDROID_PACKAGE: + if (uid_is_app(info_d->d_uid)) + gid = multiuser_get_ext_gid(info_d->d_uid); + else + gid = multiuser_get_uid(info_d->userid, AID_MEDIA_RW); + break; + case PERM_ANDROID_PACKAGE_CACHE: + if (uid_is_app(info_d->d_uid)) + gid = multiuser_get_ext_cache_gid(info_d->d_uid); + else + gid = multiuser_get_uid(info_d->userid, AID_MEDIA_RW); + break; + case PERM_PRE_ROOT: + default: + break; + } + + sdcardfs_get_lower_path(dentry, &path); + inode = path.dentry->d_inode; + if (path.dentry->d_inode->i_gid.val != gid || path.dentry->d_inode->i_uid.val != uid) { +retry_deleg: + newattrs.ia_valid = ATTR_GID | ATTR_UID | ATTR_FORCE; + newattrs.ia_uid = make_kuid(current_user_ns(), uid); + newattrs.ia_gid = make_kgid(current_user_ns(), gid); + if (!S_ISDIR(inode->i_mode)) + newattrs.ia_valid |= + ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV; + mutex_lock(&inode->i_mutex); + error = security_path_chown(&path, newattrs.ia_uid, newattrs.ia_gid); + if (!error) + error = notify_change2(path.mnt, path.dentry, &newattrs, &delegated_inode); + mutex_unlock(&inode->i_mutex); + if (delegated_inode) { + error = break_deleg_wait(&delegated_inode); + if (!error) + goto retry_deleg; } + if (error) + pr_debug("sdcardfs: Failed to touch up lower fs gid/uid for %s\n", name); } + sdcardfs_put_lower_path(dentry, &path); +} + +static int descendant_may_need_fixup(struct sdcardfs_inode_data *data, + struct limit_search *limit) +{ + if (data->perm == PERM_ROOT) + return (limit->flags & BY_USERID) ? + data->userid == limit->userid : 1; + if (data->perm == PERM_PRE_ROOT || data->perm == PERM_ANDROID) + return 1; + return 0; +} + +static int needs_fixup(perm_t perm) +{ + if (perm == PERM_ANDROID_DATA || perm == PERM_ANDROID_OBB + || perm == PERM_ANDROID_MEDIA) + return 1; + return 0; +} + +static void __fixup_perms_recursive(struct dentry *dentry, struct limit_search *limit, int depth) +{ + struct dentry *child; + struct sdcardfs_inode_info *info; + + /* + * All paths will terminate their recursion on hitting PERM_ANDROID_OBB, + * PERM_ANDROID_MEDIA, or PERM_ANDROID_DATA. This happens at a depth of + * at most 3. + */ + WARN(depth > 3, "%s: Max expected depth exceeded!\n", __func__); + spin_lock_nested(&dentry->d_lock, depth); + if (!dentry->d_inode) { + spin_unlock(&dentry->d_lock); + return; + } + info = SDCARDFS_I(dentry->d_inode); + + if (needs_fixup(info->data->perm)) { + list_for_each_entry(child, &dentry->d_subdirs, d_child) { + spin_lock_nested(&child->d_lock, depth + 1); + if (!(limit->flags & BY_NAME) || qstr_case_eq(&child->d_name, &limit->name)) { + if (child->d_inode) { + get_derived_permission(dentry, child); + fixup_tmp_permissions(child->d_inode); + spin_unlock(&child->d_lock); + break; + } + } + spin_unlock(&child->d_lock); + } + } else if (descendant_may_need_fixup(info->data, limit)) { + list_for_each_entry(child, &dentry->d_subdirs, d_child) { + __fixup_perms_recursive(child, limit, depth + 1); + } + } + spin_unlock(&dentry->d_lock); +} + +void fixup_perms_recursive(struct dentry *dentry, struct limit_search *limit) +{ + __fixup_perms_recursive(dentry, limit, 0); } /* main function for updating derived permission */ @@ -127,41 +329,38 @@ inline void update_derived_permission_lock(struct dentry *dentry) { struct dentry *parent; - if(!dentry || !dentry->d_inode) { - printk(KERN_ERR "sdcardfs: %s: invalid dentry\n", __func__); + if (!dentry || !dentry->d_inode) { + pr_err("sdcardfs: %s: invalid dentry\n", __func__); return; } /* FIXME: * 1. need to check whether the dentry is updated or not * 2. remove the root dentry update */ - mutex_lock(&dentry->d_inode->i_mutex); - if(IS_ROOT(dentry)) { - //setup_default_pre_root_state(dentry->d_inode); - } else { + if (!IS_ROOT(dentry)) { parent = dget_parent(dentry); - if(parent) { + if (parent) { get_derived_permission(parent, dentry); dput(parent); } } - fix_derived_permission(dentry->d_inode); - mutex_unlock(&dentry->d_inode->i_mutex); + fixup_tmp_permissions(dentry->d_inode); } int need_graft_path(struct dentry *dentry) { int ret = 0; struct dentry *parent = dget_parent(dentry); - struct sdcardfs_inode_info *parent_info= SDCARDFS_I(parent->d_inode); + struct sdcardfs_inode_info *parent_info = SDCARDFS_I(parent->d_inode); struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); + struct qstr obb = QSTR_LITERAL("obb"); - if(parent_info->perm == PERM_ANDROID && - !strcasecmp(dentry->d_name.name, "obb")) { + if (parent_info->data->perm == PERM_ANDROID && + qstr_case_eq(&dentry->d_name, &obb)) { /* /Android/obb is the base obbpath of DERIVED_UNIFIED */ - if(!(sbi->options.multiuser == false - && parent_info->userid == 0)) { + if (!(sbi->options.multiuser == false + && parent_info->data->userid == 0)) { ret = 1; } } @@ -175,36 +374,40 @@ int is_obbpath_invalid(struct dentry *dent) struct sdcardfs_dentry_info *di = SDCARDFS_D(dent); struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dent->d_sb); char *path_buf, *obbpath_s; + int need_put = 0; + struct path lower_path; /* check the base obbpath has been changed. * this routine can check an uninitialized obb dentry as well. - * regarding the uninitialized obb, refer to the sdcardfs_mkdir() */ + * regarding the uninitialized obb, refer to the sdcardfs_mkdir() + */ spin_lock(&di->lock); - if(di->orig_path.dentry) { - if(!di->lower_path.dentry) { + if (di->orig_path.dentry) { + if (!di->lower_path.dentry) { ret = 1; } else { path_get(&di->lower_path); - //lower_parent = lock_parent(lower_path->dentry); path_buf = kmalloc(PATH_MAX, GFP_ATOMIC); - if(!path_buf) { + if (!path_buf) { ret = 1; - printk(KERN_ERR "sdcardfs: fail to allocate path_buf in %s.\n", __func__); + pr_err("sdcardfs: fail to allocate path_buf in %s.\n", __func__); } else { obbpath_s = d_path(&di->lower_path, path_buf, PATH_MAX); if (d_unhashed(di->lower_path.dentry) || - strcasecmp(sbi->obbpath_s, obbpath_s)) { + !str_case_eq(sbi->obbpath_s, obbpath_s)) { ret = 1; } kfree(path_buf); } - //unlock_dir(lower_parent); - path_put(&di->lower_path); + pathcpy(&lower_path, &di->lower_path); + need_put = 1; } } spin_unlock(&di->lock); + if (need_put) + path_put(&lower_path); return ret; } @@ -212,17 +415,18 @@ int is_base_obbpath(struct dentry *dentry) { int ret = 0; struct dentry *parent = dget_parent(dentry); - struct sdcardfs_inode_info *parent_info= SDCARDFS_I(parent->d_inode); + struct sdcardfs_inode_info *parent_info = SDCARDFS_I(parent->d_inode); struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); + struct qstr q_obb = QSTR_LITERAL("obb"); spin_lock(&SDCARDFS_D(dentry)->lock); if (sbi->options.multiuser) { - if(parent_info->perm == PERM_PRE_ROOT && - !strcasecmp(dentry->d_name.name, "obb")) { + if (parent_info->data->perm == PERM_PRE_ROOT && + qstr_case_eq(&dentry->d_name, &q_obb)) { ret = 1; } - } else if (parent_info->perm == PERM_ANDROID && - !strcasecmp(dentry->d_name.name, "obb")) { + } else if (parent_info->data->perm == PERM_ANDROID && + qstr_case_eq(&dentry->d_name, &q_obb)) { ret = 1; } spin_unlock(&SDCARDFS_D(dentry)->lock); @@ -232,7 +436,8 @@ int is_base_obbpath(struct dentry *dentry) /* The lower_path will be stored to the dentry's orig_path * and the base obbpath will be copyed to the lower_path variable. * if an error returned, there's no change in the lower_path - * returns: -ERRNO if error (0: no error) */ + * returns: -ERRNO if error (0: no error) + */ int setup_obb_dentry(struct dentry *dentry, struct path *lower_path) { int err = 0; @@ -241,23 +446,24 @@ int setup_obb_dentry(struct dentry *dentry, struct path *lower_path) /* A local obb dentry must have its own orig_path to support rmdir * and mkdir of itself. Usually, we expect that the sbi->obbpath - * is avaiable on this stage. */ + * is avaiable on this stage. + */ sdcardfs_set_orig_path(dentry, lower_path); err = kern_path(sbi->obbpath_s, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &obbpath); - if(!err) { + if (!err) { /* the obbpath base has been found */ - printk(KERN_INFO "sdcardfs: the sbi->obbpath is found\n"); pathcpy(lower_path, &obbpath); } else { /* if the sbi->obbpath is not available, we can optionally * setup the lower_path with its orig_path. * but, the current implementation just returns an error * because the sdcard daemon also regards this case as - * a lookup fail. */ - printk(KERN_INFO "sdcardfs: the sbi->obbpath is not available\n"); + * a lookup fail. + */ + pr_info("sdcardfs: the sbi->obbpath is not available\n"); } return err; } diff --git a/fs/sdcardfs/file.c b/fs/sdcardfs/file.c index 82911179f976a..2f338718cc576 100644 --- a/fs/sdcardfs/file.c +++ b/fs/sdcardfs/file.c @@ -65,7 +65,7 @@ static ssize_t sdcardfs_write(struct file *file, const char __user *buf, /* check disk space */ if (!check_min_free_space(dentry, count, 0)) { - printk(KERN_INFO "No minimum free space.\n"); + pr_err("No minimum free space.\n"); return -ENOSPC; } @@ -113,6 +113,13 @@ static long sdcardfs_unlocked_ioctl(struct file *file, unsigned int cmd, if (lower_file->f_op->unlocked_ioctl) err = lower_file->f_op->unlocked_ioctl(lower_file, cmd, arg); + /* some ioctls can change inode attributes (EXT2_IOC_SETFLAGS) */ + if (!err) { + sdcardfs_copy_and_fix_attrs(file_inode(file), + file_inode(lower_file)); + fsstack_copy_inode_size(file_inode(file), + file_inode(lower_file)); + } out: return err; } @@ -160,8 +167,7 @@ static int sdcardfs_mmap(struct file *file, struct vm_area_struct *vma) lower_file = sdcardfs_lower_file(file); if (willwrite && !lower_file->f_mapping->a_ops->writepage) { err = -EINVAL; - printk(KERN_ERR "sdcardfs: lower file system does not " - "support writeable mmap\n"); + pr_err("sdcardfs: lower file system does not support writeable mmap\n"); goto out; } @@ -173,16 +179,10 @@ static int sdcardfs_mmap(struct file *file, struct vm_area_struct *vma) if (!SDCARDFS_F(file)->lower_vm_ops) { err = lower_file->f_op->mmap(lower_file, vma); if (err) { - printk(KERN_ERR "sdcardfs: lower mmap failed %d\n", err); + pr_err("sdcardfs: lower mmap failed %d\n", err); goto out; } saved_vm_ops = vma->vm_ops; /* save: came from lower ->mmap */ - err = do_munmap(current->mm, vma->vm_start, - vma->vm_end - vma->vm_start); - if (err) { - printk(KERN_ERR "sdcardfs: do_munmap failed %d\n", err); - goto out; - } } /* @@ -195,6 +195,9 @@ static int sdcardfs_mmap(struct file *file, struct vm_area_struct *vma) file->f_mapping->a_ops = &sdcardfs_aops; /* set our aops */ if (!SDCARDFS_F(file)->lower_vm_ops) /* save for our ->fault */ SDCARDFS_F(file)->lower_vm_ops = saved_vm_ops; + vma->vm_private_data = file; + get_file(lower_file); + vma->vm_file = lower_file; out: return err; @@ -216,16 +219,13 @@ static int sdcardfs_open(struct inode *inode, struct file *file) goto out_err; } - if(!check_caller_access_to_name(parent->d_inode, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(parent->d_inode, &dentry->d_name)) { err = -EACCES; goto out_err; } /* save current_cred and override it */ - OVERRIDE_CRED(sbi, saved_cred); + OVERRIDE_CRED(sbi, saved_cred, SDCARDFS_I(inode)); file->private_data = kzalloc(sizeof(struct sdcardfs_file_info), GFP_KERNEL); @@ -253,6 +253,7 @@ static int sdcardfs_open(struct inode *inode, struct file *file) kfree(SDCARDFS_F(file)); else { sdcardfs_copy_and_fix_attrs(inode, sdcardfs_lower_inode(inode)); + fsstack_copy_inode_size(inode, sdcardfs_lower_inode(inode)); } out_revert_cred: @@ -323,6 +324,85 @@ static int sdcardfs_fasync(int fd, struct file *file, int flag) return err; } +/* + * Sdcardfs cannot use generic_file_llseek as ->llseek, because it would + * only set the offset of the upper file. So we have to implement our + * own method to set both the upper and lower file offsets + * consistently. + */ +static loff_t sdcardfs_file_llseek(struct file *file, loff_t offset, int whence) +{ + int err; + struct file *lower_file; + + err = generic_file_llseek(file, offset, whence); + if (err < 0) + goto out; + + lower_file = sdcardfs_lower_file(file); + err = generic_file_llseek(lower_file, offset, whence); + +out: + return err; +} + +/* + * Sdcardfs read_iter, redirect modified iocb to lower read_iter + */ +ssize_t sdcardfs_read_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + int err; + struct file *file = iocb->ki_filp, *lower_file; + + lower_file = sdcardfs_lower_file(file); + if (!lower_file->f_op->read_iter) { + err = -EINVAL; + goto out; + } + + get_file(lower_file); /* prevent lower_file from being released */ + iocb->ki_filp = lower_file; + err = lower_file->f_op->read_iter(iocb, iter); + iocb->ki_filp = file; + fput(lower_file); + /* update upper inode atime as needed */ + if (err >= 0 || err == -EIOCBQUEUED) + fsstack_copy_attr_atime(file->f_path.dentry->d_inode, + file_inode(lower_file)); +out: + return err; +} + +/* + * Sdcardfs write_iter, redirect modified iocb to lower write_iter + */ +ssize_t sdcardfs_write_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + int err; + struct file *file = iocb->ki_filp, *lower_file; + + lower_file = sdcardfs_lower_file(file); + if (!lower_file->f_op->write_iter) { + err = -EINVAL; + goto out; + } + + get_file(lower_file); /* prevent lower_file from being released */ + iocb->ki_filp = lower_file; + err = lower_file->f_op->write_iter(iocb, iter); + iocb->ki_filp = file; + fput(lower_file); + /* update upper inode times/sizes as needed */ + if (err >= 0 || err == -EIOCBQUEUED) { + fsstack_copy_inode_size(file->f_path.dentry->d_inode, + file_inode(lower_file)); + fsstack_copy_attr_times(file->f_path.dentry->d_inode, + file_inode(lower_file)); + } +out: + return err; +} + const struct file_operations sdcardfs_main_fops = { .llseek = generic_file_llseek, .read = sdcardfs_read, @@ -337,11 +417,13 @@ const struct file_operations sdcardfs_main_fops = { .release = sdcardfs_file_release, .fsync = sdcardfs_fsync, .fasync = sdcardfs_fasync, + .read_iter = sdcardfs_read_iter, + .write_iter = sdcardfs_write_iter, }; /* trimmed directory options */ const struct file_operations sdcardfs_dir_fops = { - .llseek = generic_file_llseek, + .llseek = sdcardfs_file_llseek, .read = generic_read_dir, .iterate = sdcardfs_readdir, .unlocked_ioctl = sdcardfs_unlocked_ioctl, diff --git a/fs/sdcardfs/inode.c b/fs/sdcardfs/inode.c index 69060ee52e6b7..9b2e4fc3379f7 100644 --- a/fs/sdcardfs/inode.c +++ b/fs/sdcardfs/inode.c @@ -19,18 +19,26 @@ */ #include "sdcardfs.h" +#include +#include /* Do not directly use this function. Use OVERRIDE_CRED() instead. */ -const struct cred * override_fsids(struct sdcardfs_sb_info* sbi) +const struct cred *override_fsids(struct sdcardfs_sb_info *sbi, + struct sdcardfs_inode_data *data) { - struct cred * cred; - const struct cred * old_cred; + struct cred *cred; + const struct cred *old_cred; + uid_t uid; cred = prepare_creds(); if (!cred) return NULL; - cred->fsuid = make_kuid(&init_user_ns, sbi->options.fs_low_uid); + if (data->under_obb) + uid = AID_MEDIA_OBB; + else + uid = multiuser_get_uid(data->userid, sbi->options.fs_low_uid); + cred->fsuid = make_kuid(&init_user_ns, uid); cred->fsgid = make_kgid(&init_user_ns, sbi->options.fs_low_gid); old_cred = override_creds(cred); @@ -39,9 +47,9 @@ const struct cred * override_fsids(struct sdcardfs_sb_info* sbi) } /* Do not directly use this function, use REVERT_CRED() instead. */ -void revert_fsids(const struct cred * old_cred) +void revert_fsids(const struct cred *old_cred) { - const struct cred * cur_cred; + const struct cred *cur_cred; cur_cred = current->cred; revert_creds(old_cred); @@ -53,38 +61,54 @@ static int sdcardfs_create(struct inode *dir, struct dentry *dentry, { int err; struct dentry *lower_dentry; + struct vfsmount *lower_dentry_mnt; struct dentry *lower_parent_dentry = NULL; struct path lower_path; const struct cred *saved_cred = NULL; + struct fs_struct *saved_fs; + struct fs_struct *copied_fs; - if(!check_caller_access_to_name(dir, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(dir, &dentry->d_name)) { err = -EACCES; goto out_eacces; } /* save current_cred and override it */ - OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dir)); sdcardfs_get_lower_path(dentry, &lower_path); lower_dentry = lower_path.dentry; + lower_dentry_mnt = lower_path.mnt; lower_parent_dentry = lock_parent(lower_dentry); /* set last 16bytes of mode field to 0664 */ mode = (mode & S_IFMT) | 00664; - err = vfs_create(lower_parent_dentry->d_inode, lower_dentry, mode, want_excl); + + /* temporarily change umask for lower fs write */ + saved_fs = current->fs; + copied_fs = copy_fs_struct(current->fs); + if (!copied_fs) { + err = -ENOMEM; + goto out_unlock; + } + current->fs = copied_fs; + current->fs->umask = 0; + err = vfs_create2(lower_dentry_mnt, lower_parent_dentry->d_inode, lower_dentry, mode, want_excl); if (err) goto out; - err = sdcardfs_interpose(dentry, dir->i_sb, &lower_path, SDCARDFS_I(dir)->userid); + err = sdcardfs_interpose(dentry, dir->i_sb, &lower_path, + SDCARDFS_I(dir)->data->userid); if (err) goto out; fsstack_copy_attr_times(dir, sdcardfs_lower_inode(dir)); fsstack_copy_inode_size(dir, lower_parent_dentry->d_inode); + fixup_lower_ownership(dentry, dentry->d_name.name); out: + current->fs = saved_fs; + free_fs_struct(copied_fs); +out_unlock: unlock_dir(lower_parent_dentry); sdcardfs_put_lower_path(dentry, &lower_path); REVERT_CRED(saved_cred); @@ -138,28 +162,27 @@ static int sdcardfs_unlink(struct inode *dir, struct dentry *dentry) { int err; struct dentry *lower_dentry; + struct vfsmount *lower_mnt; struct inode *lower_dir_inode = sdcardfs_lower_inode(dir); struct dentry *lower_dir_dentry; struct path lower_path; const struct cred *saved_cred = NULL; - if(!check_caller_access_to_name(dir, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(dir, &dentry->d_name)) { err = -EACCES; goto out_eacces; } /* save current_cred and override it */ - OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dir)); sdcardfs_get_lower_path(dentry, &lower_path); lower_dentry = lower_path.dentry; + lower_mnt = lower_path.mnt; dget(lower_dentry); lower_dir_dentry = lock_parent(lower_dentry); - err = vfs_unlink(lower_dir_inode, lower_dentry, NULL); + err = vfs_unlink2(lower_mnt, lower_dir_inode, lower_dentry, NULL); /* * Note: unlinking on top of NFS can cause silly-renamed files. @@ -219,14 +242,15 @@ static int sdcardfs_symlink(struct inode *dir, struct dentry *dentry, } #endif -static int touch(char *abs_path, mode_t mode) { +static int touch(char *abs_path, mode_t mode) +{ struct file *filp = filp_open(abs_path, O_RDWR|O_CREAT|O_EXCL|O_NOFOLLOW, mode); + if (IS_ERR(filp)) { if (PTR_ERR(filp) == -EEXIST) { return 0; - } - else { - printk(KERN_ERR "sdcardfs: failed to open(%s): %ld\n", + } else { + pr_err("sdcardfs: failed to open(%s): %ld\n", abs_path, PTR_ERR(filp)); return PTR_ERR(filp); } @@ -240,31 +264,29 @@ static int sdcardfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode int err; int make_nomedia_in_obb = 0; struct dentry *lower_dentry; + struct vfsmount *lower_mnt; struct dentry *lower_parent_dentry = NULL; struct path lower_path; struct sdcardfs_sb_info *sbi = SDCARDFS_SB(dentry->d_sb); const struct cred *saved_cred = NULL; - struct sdcardfs_inode_info *pi = SDCARDFS_I(dir); - char *page_buf; - char *nomedia_dir_name; - char *nomedia_fullpath; - int fullpath_namelen; + struct sdcardfs_inode_data *pd = SDCARDFS_I(dir)->data; int touch_err = 0; + struct fs_struct *saved_fs; + struct fs_struct *copied_fs; + struct qstr q_obb = QSTR_LITERAL("obb"); + struct qstr q_data = QSTR_LITERAL("data"); - if(!check_caller_access_to_name(dir, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(dir, &dentry->d_name)) { err = -EACCES; goto out_eacces; } /* save current_cred and override it */ - OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dir)); /* check disk space */ if (!check_min_free_space(dentry, 0, 1)) { - printk(KERN_INFO "sdcardfs: No minimum free space.\n"); + pr_err("sdcardfs: No minimum free space.\n"); err = -ENOSPC; goto out_revert; } @@ -272,87 +294,84 @@ static int sdcardfs_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode /* the lower_dentry is negative here */ sdcardfs_get_lower_path(dentry, &lower_path); lower_dentry = lower_path.dentry; + lower_mnt = lower_path.mnt; lower_parent_dentry = lock_parent(lower_dentry); /* set last 16bytes of mode field to 0775 */ mode = (mode & S_IFMT) | 00775; - err = vfs_mkdir(lower_parent_dentry->d_inode, lower_dentry, mode); - if (err) + /* temporarily change umask for lower fs write */ + saved_fs = current->fs; + copied_fs = copy_fs_struct(current->fs); + if (!copied_fs) { + err = -ENOMEM; + unlock_dir(lower_parent_dentry); + goto out_unlock; + } + current->fs = copied_fs; + current->fs->umask = 0; + err = vfs_mkdir2(lower_mnt, lower_parent_dentry->d_inode, lower_dentry, mode); + + if (err) { + unlock_dir(lower_parent_dentry); goto out; + } /* if it is a local obb dentry, setup it with the base obbpath */ - if(need_graft_path(dentry)) { + if (need_graft_path(dentry)) { err = setup_obb_dentry(dentry, &lower_path); - if(err) { + if (err) { /* if the sbi->obbpath is not available, the lower_path won't be * changed by setup_obb_dentry() but the lower path is saved to * its orig_path. this dentry will be revalidated later. - * but now, the lower_path should be NULL */ + * but now, the lower_path should be NULL + */ sdcardfs_put_reset_lower_path(dentry); /* the newly created lower path which saved to its orig_path or * the lower_path is the base obbpath. - * therefore, an additional path_get is required */ + * therefore, an additional path_get is required + */ path_get(&lower_path); } else make_nomedia_in_obb = 1; } - err = sdcardfs_interpose(dentry, dir->i_sb, &lower_path, pi->userid); - if (err) + err = sdcardfs_interpose(dentry, dir->i_sb, &lower_path, pd->userid); + if (err) { + unlock_dir(lower_parent_dentry); goto out; + } fsstack_copy_attr_times(dir, sdcardfs_lower_inode(dir)); fsstack_copy_inode_size(dir, lower_parent_dentry->d_inode); /* update number of links on parent directory */ set_nlink(dir, sdcardfs_lower_inode(dir)->i_nlink); - - if ((!sbi->options.multiuser) && (!strcasecmp(dentry->d_name.name, "obb")) - && (pi->perm == PERM_ANDROID) && (pi->userid == 0)) + fixup_lower_ownership(dentry, dentry->d_name.name); + unlock_dir(lower_parent_dentry); + if ((!sbi->options.multiuser) && (qstr_case_eq(&dentry->d_name, &q_obb)) + && (pd->perm == PERM_ANDROID) && (pd->userid == 0)) make_nomedia_in_obb = 1; /* When creating /Android/data and /Android/obb, mark them as .nomedia */ if (make_nomedia_in_obb || - ((pi->perm == PERM_ANDROID) && (!strcasecmp(dentry->d_name.name, "data")))) { - - page_buf = (char *)__get_free_page(GFP_KERNEL); - if (!page_buf) { - printk(KERN_ERR "sdcardfs: failed to allocate page buf\n"); - goto out; - } - - nomedia_dir_name = d_absolute_path(&lower_path, page_buf, PAGE_SIZE); - if (IS_ERR(nomedia_dir_name)) { - free_page((unsigned long)page_buf); - printk(KERN_ERR "sdcardfs: failed to get .nomedia dir name\n"); - goto out; - } - - fullpath_namelen = page_buf + PAGE_SIZE - nomedia_dir_name - 1; - fullpath_namelen += strlen("/.nomedia"); - nomedia_fullpath = kzalloc(fullpath_namelen + 1, GFP_KERNEL); - if (!nomedia_fullpath) { - free_page((unsigned long)page_buf); - printk(KERN_ERR "sdcardfs: failed to allocate .nomedia fullpath buf\n"); - goto out; - } - - strcpy(nomedia_fullpath, nomedia_dir_name); - free_page((unsigned long)page_buf); - strcat(nomedia_fullpath, "/.nomedia"); - touch_err = touch(nomedia_fullpath, 0664); + ((pd->perm == PERM_ANDROID) + && (qstr_case_eq(&dentry->d_name, &q_data)))) { + REVERT_CRED(saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dentry->d_inode)); + set_fs_pwd(current->fs, &lower_path); + touch_err = touch(".nomedia", 0664); if (touch_err) { - printk(KERN_ERR "sdcardfs: failed to touch(%s): %d\n", - nomedia_fullpath, touch_err); - kfree(nomedia_fullpath); + pr_err("sdcardfs: failed to create .nomedia in %s: %d\n", + lower_path.dentry->d_name.name, touch_err); goto out; } - kfree(nomedia_fullpath); } out: - unlock_dir(lower_parent_dentry); + current->fs = saved_fs; + free_fs_struct(copied_fs); +out_unlock: sdcardfs_put_lower_path(dentry, &lower_path); out_revert: REVERT_CRED(saved_cred); @@ -364,29 +383,29 @@ static int sdcardfs_rmdir(struct inode *dir, struct dentry *dentry) { struct dentry *lower_dentry; struct dentry *lower_dir_dentry; + struct vfsmount *lower_mnt; int err; struct path lower_path; const struct cred *saved_cred = NULL; - if(!check_caller_access_to_name(dir, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(dir, &dentry->d_name)) { err = -EACCES; goto out_eacces; } /* save current_cred and override it */ - OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dir)); /* sdcardfs_get_real_lower(): in case of remove an user's obb dentry - * the dentry on the original path should be deleted. */ + * the dentry on the original path should be deleted. + */ sdcardfs_get_real_lower(dentry, &lower_path); lower_dentry = lower_path.dentry; + lower_mnt = lower_path.mnt; lower_dir_dentry = lock_parent(lower_dentry); - err = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry); + err = vfs_rmdir2(lower_mnt, lower_dir_dentry->d_inode, lower_dentry); if (err) goto out; @@ -450,27 +469,25 @@ static int sdcardfs_rename(struct inode *old_dir, struct dentry *old_dentry, struct dentry *lower_new_dentry = NULL; struct dentry *lower_old_dir_dentry = NULL; struct dentry *lower_new_dir_dentry = NULL; + struct vfsmount *lower_mnt = NULL; struct dentry *trap = NULL; - struct dentry *new_parent = NULL; struct path lower_old_path, lower_new_path; const struct cred *saved_cred = NULL; - if(!check_caller_access_to_name(old_dir, old_dentry->d_name.name) || - !check_caller_access_to_name(new_dir, new_dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " new_dentry: %s, task:%s\n", - __func__, new_dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(old_dir, &old_dentry->d_name) || + !check_caller_access_to_name(new_dir, &new_dentry->d_name)) { err = -EACCES; goto out_eacces; } /* save current_cred and override it */ - OVERRIDE_CRED(SDCARDFS_SB(old_dir->i_sb), saved_cred); + OVERRIDE_CRED(SDCARDFS_SB(old_dir->i_sb), saved_cred, SDCARDFS_I(new_dir)); sdcardfs_get_real_lower(old_dentry, &lower_old_path); sdcardfs_get_lower_path(new_dentry, &lower_new_path); lower_old_dentry = lower_old_path.dentry; lower_new_dentry = lower_new_path.dentry; + lower_mnt = lower_old_path.mnt; lower_old_dir_dentry = dget_parent(lower_old_dentry); lower_new_dir_dentry = dget_parent(lower_new_dentry); @@ -486,7 +503,8 @@ static int sdcardfs_rename(struct inode *old_dir, struct dentry *old_dentry, goto out; } - err = vfs_rename(lower_old_dir_dentry->d_inode, lower_old_dentry, + err = vfs_rename2(lower_mnt, + lower_old_dir_dentry->d_inode, lower_old_dentry, lower_new_dir_dentry->d_inode, lower_new_dentry, NULL, 0); if (err) @@ -499,25 +517,11 @@ static int sdcardfs_rename(struct inode *old_dir, struct dentry *old_dentry, if (new_dir != old_dir) { sdcardfs_copy_and_fix_attrs(old_dir, lower_old_dir_dentry->d_inode); fsstack_copy_inode_size(old_dir, lower_old_dir_dentry->d_inode); - - /* update the derived permission of the old_dentry - * with its new parent - */ - new_parent = dget_parent(new_dentry); - if(new_parent) { - if(old_dentry->d_inode) { - update_derived_permission_lock(old_dentry); - } - dput(new_parent); - } } - /* At this point, not all dentry information has been moved, so - * we pass along new_dentry for the name.*/ - mutex_lock(&old_dentry->d_inode->i_mutex); - get_derived_permission_new(new_dentry->d_parent, old_dentry, new_dentry); - fix_derived_permission(old_dentry->d_inode); - get_derive_permissions_recursive(old_dentry); - mutex_unlock(&old_dentry->d_inode->i_mutex); + get_derived_permission_new(new_dentry->d_parent, old_dentry, &new_dentry->d_name); + fixup_tmp_permissions(old_dentry->d_inode); + fixup_lower_ownership(old_dentry, new_dentry->d_name.name); + d_invalidate(old_dentry); /* Can't fixup ownership recursively :( */ out: unlock_rename(lower_old_dir_dentry, lower_new_dir_dentry); dput(lower_old_dir_dentry); @@ -588,16 +592,61 @@ static void *sdcardfs_follow_link(struct dentry *dentry, struct nameidata *nd) } #endif -static int sdcardfs_permission(struct inode *inode, int mask) +static int sdcardfs_permission_wrn(struct inode *inode, int mask) +{ + WARN_RATELIMIT(1, "sdcardfs does not support permission. Use permission2.\n"); + return -EINVAL; +} + +void copy_attrs(struct inode *dest, const struct inode *src) +{ + dest->i_mode = src->i_mode; + dest->i_uid = src->i_uid; + dest->i_gid = src->i_gid; + dest->i_rdev = src->i_rdev; + dest->i_atime = src->i_atime; + dest->i_mtime = src->i_mtime; + dest->i_ctime = src->i_ctime; + dest->i_blkbits = src->i_blkbits; + dest->i_flags = src->i_flags; +#ifdef CONFIG_FS_POSIX_ACL + dest->i_acl = src->i_acl; +#endif +#ifdef CONFIG_SECURITY + dest->i_security = src->i_security; +#endif +} + +static int sdcardfs_permission(struct vfsmount *mnt, struct inode *inode, int mask) { int err; + struct inode tmp; + struct sdcardfs_inode_data *top = top_data_get(SDCARDFS_I(inode)); + + if (!top) + return -EINVAL; /* * Permission check on sdcardfs inode. * Calling process should have AID_SDCARD_RW permission + * Since generic_permission only needs i_mode, i_uid, + * i_gid, and i_sb, we can create a fake inode to pass + * this information down in. + * + * The underlying code may attempt to take locks in some + * cases for features we're not using, but if that changes, + * locks must be dealt with to avoid undefined behavior. */ - err = generic_permission(inode, mask); - + copy_attrs(&tmp, inode); + tmp.i_uid = make_kuid(&init_user_ns, top->d_uid); + tmp.i_gid = make_kgid(&init_user_ns, get_gid(mnt, top)); + tmp.i_mode = (inode->i_mode & S_IFMT) + | get_mode(mnt, SDCARDFS_I(inode), top); + data_put(top); + tmp.i_sb = inode->i_sb; + if (IS_POSIXACL(inode)) + pr_warn("%s: This may be undefined behavior...\n", __func__); + err = generic_permission(&tmp, mask); /* XXX * Original sdcardfs code calls inode_permission(lower_inode,.. ) * for checking inode permission. But doing such things here seems @@ -614,6 +663,7 @@ static int sdcardfs_permission(struct inode *inode, int mask) * we check it with AID_MEDIA_RW permission */ struct inode *lower_inode; + OVERRIDE_CRED(SDCARDFS_SB(inode->sb)); lower_inode = sdcardfs_lower_inode(inode); @@ -626,47 +676,85 @@ static int sdcardfs_permission(struct inode *inode, int mask) } -static int sdcardfs_setattr(struct dentry *dentry, struct iattr *ia) +static int sdcardfs_setattr_wrn(struct dentry *dentry, struct iattr *ia) +{ + WARN_RATELIMIT(1, "sdcardfs does not support setattr. User setattr2.\n"); + return -EINVAL; +} + +static int sdcardfs_setattr(struct vfsmount *mnt, struct dentry *dentry, struct iattr *ia) { int err; struct dentry *lower_dentry; + struct vfsmount *lower_mnt; struct inode *inode; struct inode *lower_inode; struct path lower_path; struct iattr lower_ia; struct dentry *parent; + struct inode tmp; + struct sdcardfs_inode_data *top; + const struct cred *saved_cred = NULL; inode = dentry->d_inode; + top = top_data_get(SDCARDFS_I(inode)); + + if (!top) + return -EINVAL; + + /* + * Permission check on sdcardfs inode. + * Calling process should have AID_SDCARD_RW permission + * Since generic_permission only needs i_mode, i_uid, + * i_gid, and i_sb, we can create a fake inode to pass + * this information down in. + * + * The underlying code may attempt to take locks in some + * cases for features we're not using, but if that changes, + * locks must be dealt with to avoid undefined behavior. + * + */ + copy_attrs(&tmp, inode); + tmp.i_uid = make_kuid(&init_user_ns, top->d_uid); + tmp.i_gid = make_kgid(&init_user_ns, get_gid(mnt, top)); + tmp.i_mode = (inode->i_mode & S_IFMT) + | get_mode(mnt, SDCARDFS_I(inode), top); + tmp.i_size = i_size_read(inode); + data_put(top); + tmp.i_sb = inode->i_sb; /* * Check if user has permission to change inode. We don't check if * this user can change the lower inode: that should happen when * calling notify_change on the lower inode. */ - err = inode_change_ok(inode, ia); + /* prepare our own lower struct iattr (with the lower file) */ + memcpy(&lower_ia, ia, sizeof(lower_ia)); + /* Allow touch updating timestamps. A previous permission check ensures + * we have write access. Changes to mode, owner, and group are ignored + */ + ia->ia_valid |= ATTR_FORCE; + err = inode_change_ok(&tmp, ia); - /* no vfs_XXX operations required, cred overriding will be skipped. wj*/ if (!err) { /* check the Android group ID */ parent = dget_parent(dentry); - if(!check_caller_access_to_name(parent->d_inode, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(parent->d_inode, &dentry->d_name)) err = -EACCES; - } dput(parent); } if (err) goto out_err; + /* save current_cred and override it */ + OVERRIDE_CRED(SDCARDFS_SB(dentry->d_sb), saved_cred, SDCARDFS_I(inode)); + sdcardfs_get_lower_path(dentry, &lower_path); lower_dentry = lower_path.dentry; + lower_mnt = lower_path.mnt; lower_inode = sdcardfs_lower_inode(inode); - /* prepare our own lower struct iattr (with the lower file) */ - memcpy(&lower_ia, ia, sizeof(lower_ia)); if (ia->ia_valid & ATTR_FILE) lower_ia.ia_file = sdcardfs_lower_file(ia->ia_file); @@ -680,13 +768,9 @@ static int sdcardfs_setattr(struct dentry *dentry, struct iattr *ia) * afterwards in the other cases: we fsstack_copy_inode_size from * the lower level. */ - if (current->mm) - down_write(¤t->mm->mmap_sem); if (ia->ia_valid & ATTR_SIZE) { - err = inode_newsize_ok(inode, ia->ia_size); + err = inode_newsize_ok(&tmp, ia->ia_size); if (err) { - if (current->mm) - up_write(¤t->mm->mmap_sem); goto out; } truncate_setsize(inode, ia->ia_size); @@ -706,11 +790,9 @@ static int sdcardfs_setattr(struct dentry *dentry, struct iattr *ia) * tries to open(), unlink(), then ftruncate() a file. */ mutex_lock(&lower_dentry->d_inode->i_mutex); - err = notify_change(lower_dentry, &lower_ia, /* note: lower_ia */ + err = notify_change2(lower_mnt, lower_dentry, &lower_ia, /* note: lower_ia */ NULL); mutex_unlock(&lower_dentry->d_inode->i_mutex); - if (current->mm) - up_write(¤t->mm->mmap_sem); if (err) goto out; @@ -725,48 +807,69 @@ static int sdcardfs_setattr(struct dentry *dentry, struct iattr *ia) out: sdcardfs_put_lower_path(dentry, &lower_path); + REVERT_CRED(saved_cred); out_err: return err; } +static int sdcardfs_fillattr(struct vfsmount *mnt, + struct inode *inode, struct kstat *stat) +{ + struct sdcardfs_inode_info *info = SDCARDFS_I(inode); + struct sdcardfs_inode_data *top = top_data_get(info); + + if (!top) + return -EINVAL; + + stat->dev = inode->i_sb->s_dev; + stat->ino = inode->i_ino; + stat->mode = (inode->i_mode & S_IFMT) | get_mode(mnt, info, top); + stat->nlink = inode->i_nlink; + stat->uid = make_kuid(&init_user_ns, top->d_uid); + stat->gid = make_kgid(&init_user_ns, get_gid(mnt, top)); + stat->rdev = inode->i_rdev; + stat->size = i_size_read(inode); + stat->atime = inode->i_atime; + stat->mtime = inode->i_mtime; + stat->ctime = inode->i_ctime; + stat->blksize = (1 << inode->i_blkbits); + stat->blocks = inode->i_blocks; + data_put(top); + return 0; +} + static int sdcardfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat) { - struct dentry *lower_dentry; - struct inode *inode; - struct inode *lower_inode; + struct kstat lower_stat; struct path lower_path; struct dentry *parent; + int err; parent = dget_parent(dentry); - if(!check_caller_access_to_name(parent->d_inode, dentry->d_name.name)) { - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); + if (!check_caller_access_to_name(parent->d_inode, &dentry->d_name)) { dput(parent); return -EACCES; } dput(parent); - inode = dentry->d_inode; - sdcardfs_get_lower_path(dentry, &lower_path); - lower_dentry = lower_path.dentry; - lower_inode = sdcardfs_lower_inode(inode); - - - sdcardfs_copy_and_fix_attrs(inode, lower_inode); - fsstack_copy_inode_size(inode, lower_inode); - - - generic_fillattr(inode, stat); + err = vfs_getattr(&lower_path, &lower_stat); + if (err) + goto out; + sdcardfs_copy_and_fix_attrs(dentry->d_inode, + lower_path.dentry->d_inode); + fsstack_copy_inode_size(dentry->d_inode, lower_path.dentry->d_inode); + err = sdcardfs_fillattr(mnt, dentry->d_inode, stat); + stat->blocks = lower_stat.blocks; +out: sdcardfs_put_lower_path(dentry, &lower_path); - return 0; + return err; } const struct inode_operations sdcardfs_symlink_iops = { - .permission = sdcardfs_permission, - .setattr = sdcardfs_setattr, + .permission2 = sdcardfs_permission, + .setattr2 = sdcardfs_setattr, /* XXX Following operations are implemented, * but FUSE(sdcard) or FAT does not support them * These methods are *NOT* perfectly tested. @@ -779,14 +882,14 @@ const struct inode_operations sdcardfs_symlink_iops = { const struct inode_operations sdcardfs_dir_iops = { .create = sdcardfs_create, .lookup = sdcardfs_lookup, -#if 0 - .permission = sdcardfs_permission, -#endif + .permission = sdcardfs_permission_wrn, + .permission2 = sdcardfs_permission, .unlink = sdcardfs_unlink, .mkdir = sdcardfs_mkdir, .rmdir = sdcardfs_rmdir, .rename = sdcardfs_rename, - .setattr = sdcardfs_setattr, + .setattr = sdcardfs_setattr_wrn, + .setattr2 = sdcardfs_setattr, .getattr = sdcardfs_getattr, /* XXX Following operations are implemented, * but FUSE(sdcard) or FAT does not support them @@ -798,7 +901,9 @@ const struct inode_operations sdcardfs_dir_iops = { }; const struct inode_operations sdcardfs_main_iops = { - .permission = sdcardfs_permission, - .setattr = sdcardfs_setattr, + .permission = sdcardfs_permission_wrn, + .permission2 = sdcardfs_permission, + .setattr = sdcardfs_setattr_wrn, + .setattr2 = sdcardfs_setattr, .getattr = sdcardfs_getattr, }; diff --git a/fs/sdcardfs/lookup.c b/fs/sdcardfs/lookup.c index a01b06a514fd9..57199654f634a 100644 --- a/fs/sdcardfs/lookup.c +++ b/fs/sdcardfs/lookup.c @@ -36,8 +36,7 @@ int sdcardfs_init_dentry_cache(void) void sdcardfs_destroy_dentry_cache(void) { - if (sdcardfs_dentry_cachep) - kmem_cache_destroy(sdcardfs_dentry_cachep); + kmem_cache_destroy(sdcardfs_dentry_cachep); } void free_dentry_private_data(struct dentry *dentry) @@ -72,7 +71,8 @@ struct inode_data { static int sdcardfs_inode_test(struct inode *inode, void *candidate_data/*void *candidate_lower_inode*/) { struct inode *current_lower_inode = sdcardfs_lower_inode(inode); - userid_t current_userid = SDCARDFS_I(inode)->userid; + userid_t current_userid = SDCARDFS_I(inode)->data->userid; + if (current_lower_inode == ((struct inode_data *)candidate_data)->lower_inode && current_userid == ((struct inode_data *)candidate_data)->id) return 1; /* found a match */ @@ -91,7 +91,9 @@ struct inode *sdcardfs_iget(struct super_block *sb, struct inode *lower_inode, u struct sdcardfs_inode_info *info; struct inode_data data; struct inode *inode; /* the new inode to return */ - int err; + + if (!igrab(lower_inode)) + return ERR_PTR(-ESTALE); data.id = id; data.lower_inode = lower_inode; @@ -102,26 +104,23 @@ struct inode *sdcardfs_iget(struct super_block *sb, struct inode *lower_inode, u * instead. */ lower_inode->i_ino, /* hashval */ - sdcardfs_inode_test, /* inode comparison function */ + sdcardfs_inode_test, /* inode comparison function */ sdcardfs_inode_set, /* inode init function */ &data); /* data passed to test+set fxns */ if (!inode) { - err = -EACCES; iput(lower_inode); - return ERR_PTR(err); + return ERR_PTR(-ENOMEM); } - /* if found a cached inode, then just return it */ - if (!(inode->i_state & I_NEW)) + /* if found a cached inode, then just return it (after iput) */ + if (!(inode->i_state & I_NEW)) { + iput(lower_inode); return inode; + } /* initialize new inode */ info = SDCARDFS_I(inode); inode->i_ino = lower_inode->i_ino; - if (!igrab(lower_inode)) { - err = -ESTALE; - return ERR_PTR(err); - } sdcardfs_set_lower_inode(inode, lower_inode); inode->i_version++; @@ -164,27 +163,26 @@ struct inode *sdcardfs_iget(struct super_block *sb, struct inode *lower_inode, u } /* - * Connect a sdcardfs inode dentry/inode with several lower ones. This is - * the classic stackable file system "vnode interposition" action. - * - * @dentry: sdcardfs's dentry which interposes on lower one - * @sb: sdcardfs's super_block - * @lower_path: the lower path (caller does path_get/put) + * Helper interpose routine, called directly by ->lookup to handle + * spliced dentries. */ -int sdcardfs_interpose(struct dentry *dentry, struct super_block *sb, - struct path *lower_path, userid_t id) +static struct dentry *__sdcardfs_interpose(struct dentry *dentry, + struct super_block *sb, + struct path *lower_path, + userid_t id) { - int err = 0; struct inode *inode; struct inode *lower_inode; struct super_block *lower_sb; + struct dentry *ret_dentry = NULL; + struct dentry *alias = NULL; lower_inode = lower_path->dentry->d_inode; lower_sb = sdcardfs_lower_super(sb); /* check that the lower file system didn't cross a mount point */ if (lower_inode->i_sb != lower_sb) { - err = -EXDEV; + ret_dentry = ERR_PTR(-EXDEV); goto out; } @@ -196,14 +194,68 @@ int sdcardfs_interpose(struct dentry *dentry, struct super_block *sb, /* inherit lower inode number for sdcardfs's inode */ inode = sdcardfs_iget(sb, lower_inode, id); if (IS_ERR(inode)) { - err = PTR_ERR(inode); + ret_dentry = ERR_CAST(inode); + goto out; + } + + alias = d_find_any_alias(inode); + if (IS_ERR(alias)) { + ret_dentry = alias; goto out; } - d_add(dentry, inode); - update_derived_permission_lock(dentry); + /* Allow to 'obb' inode have multiple dentry */ + if (need_graft_path(dentry) || + (alias && alias->d_parent != dentry->d_parent)) { + d_add(dentry, inode); + } else { + ret_dentry = d_splice_alias(inode, dentry); + dentry = ret_dentry ?: dentry; + } + + if (!IS_ERR(dentry)) + update_derived_permission_lock(dentry); out: - return err; + return ret_dentry; +} + +/* + * Connect an sdcardfs inode dentry/inode with several lower ones. This is + * the classic stackable file system "vnode interposition" action. + * + * @dentry: sdcardfs's dentry which interposes on lower one + * @sb: sdcardfs's super_block + * @lower_path: the lower path (caller does path_get/put) + */ +int sdcardfs_interpose(struct dentry *dentry, struct super_block *sb, + struct path *lower_path, userid_t id) +{ + struct dentry *ret_dentry; + + ret_dentry = __sdcardfs_interpose(dentry, sb, lower_path, id); + return PTR_ERR(ret_dentry); +} + +struct sdcardfs_name_data { + struct dir_context ctx; + const struct qstr *to_find; + char *name; + bool found; +}; + +static int sdcardfs_name_match(void *__buf, const char *name, int namelen, + loff_t offset, u64 ino, unsigned int d_type) +{ + struct sdcardfs_name_data *buf = (struct sdcardfs_name_data *) __buf; + struct qstr candidate = QSTR_INIT(name, namelen); + + if (qstr_case_eq(buf->to_find, &candidate)) { + memcpy(buf->name, name, namelen); + buf->name[namelen] = 0; + buf->found = true; + return 1; + } + return 0; } /* @@ -219,9 +271,10 @@ static struct dentry *__sdcardfs_lookup(struct dentry *dentry, struct vfsmount *lower_dir_mnt; struct dentry *lower_dir_dentry = NULL; struct dentry *lower_dentry; - const char *name; + const struct qstr *name; struct path lower_path; - struct qstr this; + struct qstr dname; + struct dentry *ret_dentry = NULL; struct sdcardfs_sb_info *sbi; sbi = SDCARDFS_SB(dentry->d_sb); @@ -231,47 +284,90 @@ static struct dentry *__sdcardfs_lookup(struct dentry *dentry, if (IS_ROOT(dentry)) goto out; - name = dentry->d_name.name; + name = &dentry->d_name; /* now start the actual lookup procedure */ lower_dir_dentry = lower_parent_path->dentry; lower_dir_mnt = lower_parent_path->mnt; /* Use vfs_path_lookup to check if the dentry exists or not */ - err = vfs_path_lookup(lower_dir_dentry, lower_dir_mnt, name, 0, + err = vfs_path_lookup(lower_dir_dentry, lower_dir_mnt, name->name, 0, &lower_path); + /* check for other cases */ + if (err == -ENOENT) { + struct file *file; + const struct cred *cred = current_cred(); + + struct sdcardfs_name_data buffer = { + .ctx.actor = sdcardfs_name_match, + .to_find = name, + .name = __getname(), + .found = false, + }; + + if (!buffer.name) { + err = -ENOMEM; + goto out; + } + file = dentry_open(lower_parent_path, O_RDONLY, cred); + if (IS_ERR(file)) { + err = PTR_ERR(file); + goto put_name; + } + err = iterate_dir(file, &buffer.ctx); + fput(file); + if (err) + goto put_name; + + if (buffer.found) + err = vfs_path_lookup(lower_dir_dentry, + lower_dir_mnt, + buffer.name, 0, + &lower_path); + else + err = -ENOENT; +put_name: + __putname(buffer.name); + } /* no error: handle positive dentries */ if (!err) { /* check if the dentry is an obb dentry * if true, the lower_inode must be replaced with - * the inode of the graft path */ + * the inode of the graft path + */ - if(need_graft_path(dentry)) { + if (need_graft_path(dentry)) { /* setup_obb_dentry() - * The lower_path will be stored to the dentry's orig_path + * The lower_path will be stored to the dentry's orig_path * and the base obbpath will be copyed to the lower_path variable. * if an error returned, there's no change in the lower_path - * returns: -ERRNO if error (0: no error) */ + * returns: -ERRNO if error (0: no error) + */ err = setup_obb_dentry(dentry, &lower_path); - if(err) { + if (err) { /* if the sbi->obbpath is not available, we can optionally * setup the lower_path with its orig_path. * but, the current implementation just returns an error * because the sdcard daemon also regards this case as - * a lookup fail. */ - printk(KERN_INFO "sdcardfs: base obbpath is not available\n"); + * a lookup fail. + */ + pr_info("sdcardfs: base obbpath is not available\n"); sdcardfs_put_reset_orig_path(dentry); goto out; } } sdcardfs_set_lower_path(dentry, &lower_path); - err = sdcardfs_interpose(dentry, dentry->d_sb, &lower_path, id); - if (err) /* path_put underlying path on error */ + ret_dentry = + __sdcardfs_interpose(dentry, dentry->d_sb, &lower_path, id); + if (IS_ERR(ret_dentry)) { + err = PTR_ERR(ret_dentry); + /* path_put underlying path on error */ sdcardfs_put_reset_lower_path(dentry); + } goto out; } @@ -283,21 +379,24 @@ static struct dentry *__sdcardfs_lookup(struct dentry *dentry, goto out; /* instatiate a new negative dentry */ - this.name = name; - this.len = strlen(name); - this.hash = full_name_hash(this.name, this.len); - lower_dentry = d_lookup(lower_dir_dentry, &this); - if (lower_dentry) - goto setup_lower; - - lower_dentry = d_alloc(lower_dir_dentry, &this); + dname.name = name->name; + dname.len = name->len; + + /* See if the low-level filesystem might want + * to use its own hash + */ + lower_dentry = d_hash_and_lookup(lower_dir_dentry, &dname); + if (IS_ERR(lower_dentry)) + return lower_dentry; if (!lower_dentry) { - err = -ENOMEM; + /* We called vfs_path_lookup earlier, and did not get a negative + * dentry then. Don't confuse the lower filesystem by forcing + * one on it now... + */ + err = -ENOENT; goto out; } - d_add(lower_dentry, NULL); /* instantiate and hash */ -setup_lower: lower_path.dentry = lower_dentry; lower_path.mnt = mntget(lower_dir_mnt); sdcardfs_set_lower_path(dentry, &lower_path); @@ -311,14 +410,16 @@ static struct dentry *__sdcardfs_lookup(struct dentry *dentry, err = 0; out: - return ERR_PTR(err); + if (err) + return ERR_PTR(err); + return ret_dentry; } /* * On success: - * fills dentry object appropriate values and returns NULL. + * fills dentry object appropriate values and returns NULL. * On fail (== error) - * returns error ptr + * returns error ptr * * @dir : Parent inode. It is locked (dir->i_mutex) * @dentry : Target dentry to lookup. we should set each of fields. @@ -335,16 +436,13 @@ struct dentry *sdcardfs_lookup(struct inode *dir, struct dentry *dentry, parent = dget_parent(dentry); - if(!check_caller_access_to_name(parent->d_inode, dentry->d_name.name)) { + if (!check_caller_access_to_name(parent->d_inode, &dentry->d_name)) { ret = ERR_PTR(-EACCES); - printk(KERN_INFO "%s: need to check the caller's gid in packages.list\n" - " dentry: %s, task:%s\n", - __func__, dentry->d_name.name, current->comm); goto out_err; - } + } /* save current_cred and override it */ - OVERRIDE_CRED_PTR(SDCARDFS_SB(dir->i_sb), saved_cred); + OVERRIDE_CRED_PTR(SDCARDFS_SB(dir->i_sb), saved_cred, SDCARDFS_I(dir)); sdcardfs_get_lower_path(parent, &lower_parent_path); @@ -355,21 +453,19 @@ struct dentry *sdcardfs_lookup(struct inode *dir, struct dentry *dentry, goto out; } - ret = __sdcardfs_lookup(dentry, flags, &lower_parent_path, SDCARDFS_I(dir)->userid); + ret = __sdcardfs_lookup(dentry, flags, &lower_parent_path, + SDCARDFS_I(dir)->data->userid); if (IS_ERR(ret)) - { goto out; - } if (ret) dentry = ret; if (dentry->d_inode) { fsstack_copy_attr_times(dentry->d_inode, sdcardfs_lower_inode(dentry->d_inode)); - /* get drived permission */ - mutex_lock(&dentry->d_inode->i_mutex); + /* get derived permission */ get_derived_permission(parent, dentry); - fix_derived_permission(dentry->d_inode); - mutex_unlock(&dentry->d_inode->i_mutex); + fixup_tmp_permissions(dentry->d_inode); + fixup_lower_ownership(dentry, dentry->d_name.name); } /* update parent directory's atime */ fsstack_copy_attr_atime(parent->d_inode, diff --git a/fs/sdcardfs/main.c b/fs/sdcardfs/main.c index a6522286d7314..5931c87c7a1bc 100644 --- a/fs/sdcardfs/main.c +++ b/fs/sdcardfs/main.c @@ -28,9 +28,8 @@ enum { Opt_fsgid, Opt_gid, Opt_debug, - Opt_lower_fs, Opt_mask, - Opt_multiuser, // May need? + Opt_multiuser, Opt_userid, Opt_reserved_mb, Opt_err, @@ -49,7 +48,8 @@ static const match_table_t sdcardfs_tokens = { }; static int parse_options(struct super_block *sb, char *options, int silent, - int *debug, struct sdcardfs_mount_options *opts) + int *debug, struct sdcardfs_vfsmount_options *vfsopts, + struct sdcardfs_mount_options *opts) { char *p; substring_t args[MAX_OPT_ARGS]; @@ -58,10 +58,10 @@ static int parse_options(struct super_block *sb, char *options, int silent, /* by default, we use AID_MEDIA_RW as uid, gid */ opts->fs_low_uid = AID_MEDIA_RW; opts->fs_low_gid = AID_MEDIA_RW; - opts->mask = 0; + vfsopts->mask = 0; opts->multiuser = false; opts->fs_user_id = 0; - opts->gid = 0; + vfsopts->gid = 0; /* by default, 0MB is reserved */ opts->reserved_mb = 0; @@ -72,6 +72,7 @@ static int parse_options(struct super_block *sb, char *options, int silent, while ((p = strsep(&options, ",")) != NULL) { int token; + if (!*p) continue; @@ -94,7 +95,7 @@ static int parse_options(struct super_block *sb, char *options, int silent, case Opt_gid: if (match_int(&args[0], &option)) return 0; - opts->gid = option; + vfsopts->gid = option; break; case Opt_userid: if (match_int(&args[0], &option)) @@ -104,7 +105,7 @@ static int parse_options(struct super_block *sb, char *options, int silent, case Opt_mask: if (match_int(&args[0], &option)) return 0; - opts->mask = option; + vfsopts->mask = option; break; case Opt_multiuser: opts->multiuser = true; @@ -116,25 +117,81 @@ static int parse_options(struct super_block *sb, char *options, int silent, break; /* unknown option */ default: - if (!silent) { - printk( KERN_ERR "Unrecognized mount option \"%s\" " - "or missing value", p); - } + if (!silent) + pr_err("Unrecognized mount option \"%s\" or missing value", p); return -EINVAL; } } if (*debug) { - printk( KERN_INFO "sdcardfs : options - debug:%d\n", *debug); - printk( KERN_INFO "sdcardfs : options - uid:%d\n", + pr_info("sdcardfs : options - debug:%d\n", *debug); + pr_info("sdcardfs : options - uid:%d\n", opts->fs_low_uid); - printk( KERN_INFO "sdcardfs : options - gid:%d\n", + pr_info("sdcardfs : options - gid:%d\n", opts->fs_low_gid); } return 0; } +int parse_options_remount(struct super_block *sb, char *options, int silent, + struct sdcardfs_vfsmount_options *vfsopts) +{ + char *p; + substring_t args[MAX_OPT_ARGS]; + int option; + int debug; + + if (!options) + return 0; + + while ((p = strsep(&options, ",")) != NULL) { + int token; + + if (!*p) + continue; + + token = match_token(p, sdcardfs_tokens, args); + + switch (token) { + case Opt_debug: + debug = 1; + break; + case Opt_gid: + if (match_int(&args[0], &option)) + return 0; + vfsopts->gid = option; + + break; + case Opt_mask: + if (match_int(&args[0], &option)) + return 0; + vfsopts->mask = option; + break; + case Opt_multiuser: + case Opt_userid: + case Opt_fsuid: + case Opt_fsgid: + case Opt_reserved_mb: + pr_warn("Option \"%s\" can't be changed during remount\n", p); + break; + /* unknown option */ + default: + if (!silent) + pr_err("Unrecognized mount option \"%s\" or missing value", p); + return -EINVAL; + } + } + + if (debug) { + pr_info("sdcardfs : options - debug:%d\n", debug); + pr_info("sdcardfs : options - gid:%d\n", vfsopts->gid); + pr_info("sdcardfs : options - mask:%d\n", vfsopts->mask); + } + + return 0; +} + #if 0 /* * our custom d_alloc_root work-alike @@ -164,57 +221,58 @@ static struct dentry *sdcardfs_d_alloc_root(struct super_block *sb) #endif DEFINE_MUTEX(sdcardfs_super_list_lock); -LIST_HEAD(sdcardfs_super_list); EXPORT_SYMBOL_GPL(sdcardfs_super_list_lock); +LIST_HEAD(sdcardfs_super_list); EXPORT_SYMBOL_GPL(sdcardfs_super_list); /* * There is no need to lock the sdcardfs_super_info's rwsem as there is no * way anyone can have a reference to the superblock at this point in time. */ -static int sdcardfs_read_super(struct super_block *sb, const char *dev_name, - void *raw_data, int silent) +static int sdcardfs_read_super(struct vfsmount *mnt, struct super_block *sb, + const char *dev_name, void *raw_data, int silent) { int err = 0; int debug; struct super_block *lower_sb; struct path lower_path; struct sdcardfs_sb_info *sb_info; + struct sdcardfs_vfsmount_options *mnt_opt = mnt->data; struct inode *inode; - printk(KERN_INFO "sdcardfs version 2.0\n"); + pr_info("sdcardfs version 2.0\n"); if (!dev_name) { - printk(KERN_ERR - "sdcardfs: read_super: missing dev_name argument\n"); + pr_err("sdcardfs: read_super: missing dev_name argument\n"); err = -EINVAL; goto out; } - printk(KERN_INFO "sdcardfs: dev_name -> %s\n", dev_name); - printk(KERN_INFO "sdcardfs: options -> %s\n", (char *)raw_data); + pr_info("sdcardfs: dev_name -> %s\n", dev_name); + pr_info("sdcardfs: options -> %s\n", (char *)raw_data); + pr_info("sdcardfs: mnt -> %p\n", mnt); /* parse lower path */ err = kern_path(dev_name, LOOKUP_FOLLOW | LOOKUP_DIRECTORY, &lower_path); if (err) { - printk(KERN_ERR "sdcardfs: error accessing lower directory '%s'\n", dev_name); + pr_err("sdcardfs: error accessing lower directory '%s'\n", dev_name); goto out; } /* allocate superblock private data */ sb->s_fs_info = kzalloc(sizeof(struct sdcardfs_sb_info), GFP_KERNEL); if (!SDCARDFS_SB(sb)) { - printk(KERN_CRIT "sdcardfs: read_super: out of memory\n"); + pr_crit("sdcardfs: read_super: out of memory\n"); err = -ENOMEM; goto out_free; } sb_info = sb->s_fs_info; /* parse options */ - err = parse_options(sb, raw_data, silent, &debug, &sb_info->options); + err = parse_options(sb, raw_data, silent, &debug, mnt_opt, &sb_info->options); if (err) { - printk(KERN_ERR "sdcardfs: invalid options\n"); + pr_err("sdcardfs: invalid options\n"); goto out_freesbi; } @@ -267,23 +325,24 @@ static int sdcardfs_read_super(struct super_block *sb, const char *dev_name, /* setup permission policy */ sb_info->obbpath_s = kzalloc(PATH_MAX, GFP_KERNEL); mutex_lock(&sdcardfs_super_list_lock); - if(sb_info->options.multiuser) { - setup_derived_state(sb->s_root->d_inode, PERM_PRE_ROOT, sb_info->options.fs_user_id, AID_ROOT, false); + if (sb_info->options.multiuser) { + setup_derived_state(sb->s_root->d_inode, PERM_PRE_ROOT, + sb_info->options.fs_user_id, AID_ROOT, + false, SDCARDFS_I(sb->s_root->d_inode)->data); snprintf(sb_info->obbpath_s, PATH_MAX, "%s/obb", dev_name); - /*err = prepare_dir(sb_info->obbpath_s, - sb_info->options.fs_low_uid, - sb_info->options.fs_low_gid, 00755);*/ } else { - setup_derived_state(sb->s_root->d_inode, PERM_ROOT, sb_info->options.fs_low_uid, AID_ROOT, false); + setup_derived_state(sb->s_root->d_inode, PERM_ROOT, + sb_info->options.fs_user_id, AID_ROOT, + false, SDCARDFS_I(sb->s_root->d_inode)->data); snprintf(sb_info->obbpath_s, PATH_MAX, "%s/Android/obb", dev_name); } - fix_derived_permission(sb->s_root->d_inode); + fixup_tmp_permissions(sb->s_root->d_inode); sb_info->sb = sb; list_add(&sb_info->list, &sdcardfs_super_list); mutex_unlock(&sdcardfs_super_list_lock); if (!silent) - printk(KERN_INFO "sdcardfs: mounted on top of %s type %s\n", + pr_info("sdcardfs: mounted on top of %s type %s\n", dev_name, lower_sb->s_type->name); goto out; /* all is well */ @@ -305,58 +364,71 @@ static int sdcardfs_read_super(struct super_block *sb, const char *dev_name, return err; } -/* A feature which supports mount_nodev() with options */ -static struct dentry *mount_nodev_with_options(struct file_system_type *fs_type, - int flags, const char *dev_name, void *data, - int (*fill_super)(struct super_block *, const char *, void *, int)) +struct sdcardfs_mount_private { + struct vfsmount *mnt; + const char *dev_name; + void *raw_data; +}; +static int __sdcardfs_fill_super( + struct super_block *sb, + void *_priv, int silent) { - int error; - struct super_block *s = sget(fs_type, NULL, set_anon_super, flags, NULL); + struct sdcardfs_mount_private *priv = _priv; - if (IS_ERR(s)) - return ERR_CAST(s); + return sdcardfs_read_super(priv->mnt, + sb, priv->dev_name, priv->raw_data, silent); +} - s->s_flags = flags; +static struct dentry *sdcardfs_mount(struct vfsmount *mnt, + struct file_system_type *fs_type, int flags, + const char *dev_name, void *raw_data) +{ + struct sdcardfs_mount_private priv = { + .mnt = mnt, + .dev_name = dev_name, + .raw_data = raw_data + }; + + return mount_nodev(fs_type, flags, + &priv, __sdcardfs_fill_super); +} - error = fill_super(s, dev_name, data, flags & MS_SILENT ? 1 : 0); - if (error) { - deactivate_locked_super(s); - return ERR_PTR(error); - } - s->s_flags |= MS_ACTIVE; - return dget(s->s_root); +static struct dentry *sdcardfs_mount_wrn(struct file_system_type *fs_type, + int flags, const char *dev_name, void *raw_data) +{ + WARN(1, "sdcardfs does not support mount. Use mount2.\n"); + return ERR_PTR(-EINVAL); } -struct dentry *sdcardfs_mount(struct file_system_type *fs_type, int flags, - const char *dev_name, void *raw_data) +void *sdcardfs_alloc_mnt_data(void) { - /* - * dev_name is a lower_path_name, - * raw_data is a option string. - */ - return mount_nodev_with_options(fs_type, flags, dev_name, - raw_data, sdcardfs_read_super); + return kmalloc(sizeof(struct sdcardfs_vfsmount_options), GFP_KERNEL); } -void sdcardfs_kill_sb(struct super_block *sb) { +void sdcardfs_kill_sb(struct super_block *sb) +{ struct sdcardfs_sb_info *sbi; + if (sb->s_magic == SDCARDFS_SUPER_MAGIC) { sbi = SDCARDFS_SB(sb); mutex_lock(&sdcardfs_super_list_lock); list_del(&sbi->list); mutex_unlock(&sdcardfs_super_list_lock); } - generic_shutdown_super(sb); + kill_anon_super(sb); } static struct file_system_type sdcardfs_fs_type = { .owner = THIS_MODULE, .name = SDCARDFS_NAME, - .mount = sdcardfs_mount, + .mount = sdcardfs_mount_wrn, + .mount2 = sdcardfs_mount, + .alloc_mnt_data = sdcardfs_alloc_mnt_data, .kill_sb = sdcardfs_kill_sb, .fs_flags = 0, }; +MODULE_ALIAS_FS(SDCARDFS_NAME); static int __init init_sdcardfs_fs(void) { @@ -392,10 +464,15 @@ static void __exit exit_sdcardfs_fs(void) pr_info("Completed sdcardfs module unload\n"); } -MODULE_AUTHOR("Erez Zadok, Filesystems and Storage Lab, Stony Brook University" - " (http://www.fsl.cs.sunysb.edu/)"); -MODULE_DESCRIPTION("Wrapfs " SDCARDFS_VERSION - " (http://wrapfs.filesystems.org/)"); +/* Original wrapfs authors */ +MODULE_AUTHOR("Erez Zadok, Filesystems and Storage Lab, Stony Brook University (http://www.fsl.cs.sunysb.edu/)"); + +/* Original sdcardfs authors */ +MODULE_AUTHOR("Woojoong Lee, Daeho Jeong, Kitae Lee, Yeongjin Gil System Memory Lab., Samsung Electronics"); + +/* Current maintainer */ +MODULE_AUTHOR("Daniel Rosenberg, Google"); +MODULE_DESCRIPTION("Sdcardfs " SDCARDFS_VERSION); MODULE_LICENSE("GPL"); module_init(init_sdcardfs_fs); diff --git a/fs/sdcardfs/mmap.c b/fs/sdcardfs/mmap.c index acbaee05e963a..f61896128cfe0 100644 --- a/fs/sdcardfs/mmap.c +++ b/fs/sdcardfs/mmap.c @@ -23,28 +23,46 @@ static int sdcardfs_fault(struct vm_area_struct *vma, struct vm_fault *vmf) { int err; - struct file *file, *lower_file; + struct file *file; const struct vm_operations_struct *lower_vm_ops; - struct vm_area_struct lower_vma; - memcpy(&lower_vma, vma, sizeof(struct vm_area_struct)); - file = lower_vma.vm_file; + file = (struct file *)vma->vm_private_data; lower_vm_ops = SDCARDFS_F(file)->lower_vm_ops; BUG_ON(!lower_vm_ops); - lower_file = sdcardfs_lower_file(file); - /* - * XXX: vm_ops->fault may be called in parallel. Because we have to - * resort to temporarily changing the vma->vm_file to point to the - * lower file, a concurrent invocation of sdcardfs_fault could see a - * different value. In this workaround, we keep a different copy of - * the vma structure in our stack, so we never expose a different - * value of the vma->vm_file called to us, even temporarily. A - * better fix would be to change the calling semantics of ->fault to - * take an explicit file pointer. - */ - lower_vma.vm_file = lower_file; - err = lower_vm_ops->fault(&lower_vma, vmf); + err = lower_vm_ops->fault(vma, vmf); + return err; +} + +static void sdcardfs_vm_open(struct vm_area_struct *vma) +{ + struct file *file = (struct file *)vma->vm_private_data; + + get_file(file); +} + +static void sdcardfs_vm_close(struct vm_area_struct *vma) +{ + struct file *file = (struct file *)vma->vm_private_data; + + fput(file); +} + +static int sdcardfs_page_mkwrite(struct vm_area_struct *vma, + struct vm_fault *vmf) +{ + int err = 0; + struct file *file; + const struct vm_operations_struct *lower_vm_ops; + + file = (struct file *)vma->vm_private_data; + lower_vm_ops = SDCARDFS_F(file)->lower_vm_ops; + BUG_ON(!lower_vm_ops); + if (!lower_vm_ops->page_mkwrite) + goto out; + + err = lower_vm_ops->page_mkwrite(vma, vmf); +out: return err; } @@ -52,30 +70,20 @@ static ssize_t sdcardfs_direct_IO(int rw, struct kiocb *iocb, struct iov_iter *iter, loff_t pos) { /* - * This function returns zero on purpose in order to support direct IO. - * __dentry_open checks a_ops->direct_IO and returns EINVAL if it is null. - * - * However, this function won't be called by certain file operations - * including generic fs functions. * reads and writes are delivered to - * the lower file systems and the direct IOs will be handled by them. - * - * NOTE: exceptionally, on the recent kernels (since Linux 3.8.x), - * swap_writepage invokes this function directly. + * This function should never be called directly. We need it + * to exist, to get past a check in open_check_o_direct(), + * which is called from do_last(). */ - printk(KERN_INFO "%s, operation is not supported\n", __func__); - return 0; + return -EINVAL; } -/* - * XXX: the default address_space_ops for sdcardfs is empty. We cannot set - * our inode->i_mapping->a_ops to NULL because too many code paths expect - * the a_ops vector to be non-NULL. - */ const struct address_space_operations sdcardfs_aops = { - /* empty on purpose */ .direct_IO = sdcardfs_direct_IO, }; const struct vm_operations_struct sdcardfs_vm_ops = { .fault = sdcardfs_fault, + .page_mkwrite = sdcardfs_page_mkwrite, + .open = sdcardfs_vm_open, + .close = sdcardfs_vm_close, }; diff --git a/fs/sdcardfs/multiuser.h b/fs/sdcardfs/multiuser.h index 923ba101dfa9f..85341e753f8c9 100644 --- a/fs/sdcardfs/multiuser.h +++ b/fs/sdcardfs/multiuser.h @@ -18,20 +18,36 @@ * General Public License. */ -#define MULTIUSER_APP_PER_USER_RANGE 100000 +#define AID_USER_OFFSET 100000 /* offset for uid ranges for each user */ +#define AID_APP_START 10000 /* first app user */ +#define AID_APP_END 19999 /* last app user */ +#define AID_CACHE_GID_START 20000 /* start of gids for apps to mark cached data */ +#define AID_EXT_GID_START 30000 /* start of gids for apps to mark external data */ +#define AID_EXT_CACHE_GID_START 40000 /* start of gids for apps to mark external cached data */ +#define AID_EXT_CACHE_GID_END 49999 /* end of gids for apps to mark external cached data */ +#define AID_SHARED_GID_START 50000 /* start of gids for apps in each user to share */ typedef uid_t userid_t; typedef uid_t appid_t; -static inline userid_t multiuser_get_user_id(uid_t uid) { - return uid / MULTIUSER_APP_PER_USER_RANGE; +static inline uid_t multiuser_get_uid(userid_t user_id, appid_t app_id) +{ + return (user_id * AID_USER_OFFSET) + (app_id % AID_USER_OFFSET); } -static inline appid_t multiuser_get_app_id(uid_t uid) { - return uid % MULTIUSER_APP_PER_USER_RANGE; +static inline bool uid_is_app(uid_t uid) +{ + appid_t appid = uid % AID_USER_OFFSET; + + return appid >= AID_APP_START && appid <= AID_APP_END; } -static inline uid_t multiuser_get_uid(userid_t userId, appid_t appId) { - return userId * MULTIUSER_APP_PER_USER_RANGE + (appId % MULTIUSER_APP_PER_USER_RANGE); +static inline gid_t multiuser_get_ext_cache_gid(uid_t uid) +{ + return uid - AID_APP_START + AID_EXT_CACHE_GID_START; } +static inline gid_t multiuser_get_ext_gid(uid_t uid) +{ + return uid - AID_APP_START + AID_EXT_GID_START; +} diff --git a/fs/sdcardfs/packagelist.c b/fs/sdcardfs/packagelist.c index fead71eac95f2..d552dde9c1309 100644 --- a/fs/sdcardfs/packagelist.c +++ b/fs/sdcardfs/packagelist.c @@ -20,8 +20,10 @@ #include "sdcardfs.h" #include +#include #include - +#include +#include #include #include @@ -29,382 +31,827 @@ #include -#define STRING_BUF_SIZE (512) - struct hashtable_entry { struct hlist_node hlist; - void *key; - unsigned int value; + struct hlist_node dlist; /* for deletion cleanup */ + struct qstr key; + atomic_t value; }; -struct sb_list { - struct super_block *sb; - struct list_head list; -}; +static DEFINE_HASHTABLE(package_to_appid, 8); +static DEFINE_HASHTABLE(package_to_userid, 8); +static DEFINE_HASHTABLE(ext_to_groupid, 8); -struct packagelist_data { - DECLARE_HASHTABLE(package_to_appid,8); - struct mutex hashtable_lock; -}; +static struct kmem_cache *hashtable_entry_cachep; -static struct packagelist_data *pkgl_data_all; +static unsigned int full_name_case_hash(const unsigned char *name, unsigned int len) +{ + unsigned long hash = init_name_hash(); -static struct kmem_cache *hashtable_entry_cachep; + while (len--) + hash = partial_name_hash(tolower(*name++), hash); + return end_name_hash(hash); +} -static unsigned int str_hash(const char *key) { - int i; - unsigned int h = strlen(key); - char *data = (char *)key; +static inline void qstr_init(struct qstr *q, const char *name) +{ + q->name = name; + q->len = strlen(q->name); + q->hash = full_name_case_hash(q->name, q->len); +} + +static inline int qstr_copy(const struct qstr *src, struct qstr *dest) +{ + dest->name = kstrdup(src->name, GFP_KERNEL); + dest->hash_len = src->hash_len; + return !!dest->name; +} + + +static appid_t __get_appid(const struct qstr *key) +{ + struct hashtable_entry *hash_cur; + unsigned int hash = key->hash; + appid_t ret_id; - for (i = 0; i < strlen(key); i++) { - h = h * 31 + *data; - data++; + rcu_read_lock(); + hash_for_each_possible_rcu(package_to_appid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) { + ret_id = atomic_read(&hash_cur->value); + rcu_read_unlock(); + return ret_id; + } } - return h; + rcu_read_unlock(); + return 0; +} + +appid_t get_appid(const char *key) +{ + struct qstr q; + + qstr_init(&q, key); + return __get_appid(&q); } -appid_t get_appid(void *pkgl_id, const char *app_name) +static appid_t __get_ext_gid(const struct qstr *key) { - struct packagelist_data *pkgl_dat = pkgl_data_all; struct hashtable_entry *hash_cur; - unsigned int hash = str_hash(app_name); + unsigned int hash = key->hash; appid_t ret_id; - mutex_lock(&pkgl_dat->hashtable_lock); - hash_for_each_possible(pkgl_dat->package_to_appid, hash_cur, hlist, hash) { - if (!strcasecmp(app_name, hash_cur->key)) { - ret_id = (appid_t)hash_cur->value; - mutex_unlock(&pkgl_dat->hashtable_lock); + rcu_read_lock(); + hash_for_each_possible_rcu(ext_to_groupid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) { + ret_id = atomic_read(&hash_cur->value); + rcu_read_unlock(); return ret_id; } } - mutex_unlock(&pkgl_dat->hashtable_lock); + rcu_read_unlock(); + return 0; +} + +appid_t get_ext_gid(const char *key) +{ + struct qstr q; + + qstr_init(&q, key); + return __get_ext_gid(&q); +} + +static appid_t __is_excluded(const struct qstr *app_name, userid_t user) +{ + struct hashtable_entry *hash_cur; + unsigned int hash = app_name->hash; + + rcu_read_lock(); + hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) { + if (atomic_read(&hash_cur->value) == user && + qstr_case_eq(app_name, &hash_cur->key)) { + rcu_read_unlock(); + return 1; + } + } + rcu_read_unlock(); return 0; } +appid_t is_excluded(const char *key, userid_t user) +{ + struct qstr q; + + qstr_init(&q, key); + return __is_excluded(&q, user); +} + /* Kernel has already enforced everything we returned through * derive_permissions_locked(), so this is used to lock down access - * even further, such as enforcing that apps hold sdcard_rw. */ -int check_caller_access_to_name(struct inode *parent_node, const char* name) { + * even further, such as enforcing that apps hold sdcard_rw. + */ +int check_caller_access_to_name(struct inode *parent_node, const struct qstr *name) +{ + struct qstr q_autorun = QSTR_LITERAL("autorun.inf"); + struct qstr q__android_secure = QSTR_LITERAL(".android_secure"); + struct qstr q_android_secure = QSTR_LITERAL("android_secure"); /* Always block security-sensitive files at root */ - if (parent_node && SDCARDFS_I(parent_node)->perm == PERM_ROOT) { - if (!strcasecmp(name, "autorun.inf") - || !strcasecmp(name, ".android_secure") - || !strcasecmp(name, "android_secure")) { + if (parent_node && SDCARDFS_I(parent_node)->data->perm == PERM_ROOT) { + if (qstr_case_eq(name, &q_autorun) + || qstr_case_eq(name, &q__android_secure) + || qstr_case_eq(name, &q_android_secure)) { return 0; } } /* Root always has access; access for any other UIDs should always - * be controlled through packages.list. */ - if (from_kuid(&init_user_ns, current_fsuid()) == 0) { + * be controlled through packages.list. + */ + if (from_kuid(&init_user_ns, current_fsuid()) == 0) return 1; - } /* No extra permissions to enforce */ return 1; } -/* This function is used when file opening. The open flags must be - * checked before calling check_caller_access_to_name() */ -int open_flags_to_access_mode(int open_flags) { - if((open_flags & O_ACCMODE) == O_RDONLY) { - return 0; /* R_OK */ - } else if ((open_flags & O_ACCMODE) == O_WRONLY) { - return 1; /* W_OK */ - } else { - /* Probably O_RDRW, but treat as default to be safe */ - return 1; /* R_OK | W_OK */ +static struct hashtable_entry *alloc_hashtable_entry(const struct qstr *key, + appid_t value) +{ + struct hashtable_entry *ret = kmem_cache_alloc(hashtable_entry_cachep, + GFP_KERNEL); + if (!ret) + return NULL; + INIT_HLIST_NODE(&ret->dlist); + INIT_HLIST_NODE(&ret->hlist); + + if (!qstr_copy(key, &ret->key)) { + kmem_cache_free(hashtable_entry_cachep, ret); + return NULL; } + + atomic_set(&ret->value, value); + return ret; } -static int insert_str_to_int_lock(struct packagelist_data *pkgl_dat, char *key, - unsigned int value) +static int insert_packagelist_appid_entry_locked(const struct qstr *key, appid_t value) { struct hashtable_entry *hash_cur; struct hashtable_entry *new_entry; - unsigned int hash = str_hash(key); + unsigned int hash = key->hash; - hash_for_each_possible(pkgl_dat->package_to_appid, hash_cur, hlist, hash) { - if (!strcasecmp(key, hash_cur->key)) { - hash_cur->value = value; + hash_for_each_possible_rcu(package_to_appid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) { + atomic_set(&hash_cur->value, value); return 0; } } - new_entry = kmem_cache_alloc(hashtable_entry_cachep, GFP_KERNEL); + new_entry = alloc_hashtable_entry(key, value); + if (!new_entry) + return -ENOMEM; + hash_add_rcu(package_to_appid, &new_entry->hlist, hash); + return 0; +} + +static int insert_ext_gid_entry_locked(const struct qstr *key, appid_t value) +{ + struct hashtable_entry *hash_cur; + struct hashtable_entry *new_entry; + unsigned int hash = key->hash; + + /* An extension can only belong to one gid */ + hash_for_each_possible_rcu(ext_to_groupid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) + return -EINVAL; + } + new_entry = alloc_hashtable_entry(key, value); if (!new_entry) return -ENOMEM; - new_entry->key = kstrdup(key, GFP_KERNEL); - new_entry->value = value; - hash_add(pkgl_dat->package_to_appid, &new_entry->hlist, hash); + hash_add_rcu(ext_to_groupid, &new_entry->hlist, hash); return 0; } -static void fixup_perms(struct super_block *sb) { - if (sb && sb->s_magic == SDCARDFS_SUPER_MAGIC) { - mutex_lock(&sb->s_root->d_inode->i_mutex); - get_derive_permissions_recursive(sb->s_root); - mutex_unlock(&sb->s_root->d_inode->i_mutex); +static int insert_userid_exclude_entry_locked(const struct qstr *key, userid_t value) +{ + struct hashtable_entry *hash_cur; + struct hashtable_entry *new_entry; + unsigned int hash = key->hash; + + /* Only insert if not already present */ + hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) { + if (atomic_read(&hash_cur->value) == value && + qstr_case_eq(key, &hash_cur->key)) + return 0; } + new_entry = alloc_hashtable_entry(key, value); + if (!new_entry) + return -ENOMEM; + hash_add_rcu(package_to_userid, &new_entry->hlist, hash); + return 0; } -static int insert_str_to_int(struct packagelist_data *pkgl_dat, char *key, - unsigned int value) { - int ret; +static void fixup_all_perms_name(const struct qstr *key) +{ struct sdcardfs_sb_info *sbinfo; - mutex_lock(&sdcardfs_super_list_lock); - mutex_lock(&pkgl_dat->hashtable_lock); - ret = insert_str_to_int_lock(pkgl_dat, key, value); - mutex_unlock(&pkgl_dat->hashtable_lock); + struct limit_search limit = { + .flags = BY_NAME, + .name = QSTR_INIT(key->name, key->len), + }; + list_for_each_entry(sbinfo, &sdcardfs_super_list, list) { + if (sbinfo_has_sdcard_magic(sbinfo)) + fixup_perms_recursive(sbinfo->sb->s_root, &limit); + } +} +static void fixup_all_perms_name_userid(const struct qstr *key, userid_t userid) +{ + struct sdcardfs_sb_info *sbinfo; + struct limit_search limit = { + .flags = BY_NAME | BY_USERID, + .name = QSTR_INIT(key->name, key->len), + .userid = userid, + }; list_for_each_entry(sbinfo, &sdcardfs_super_list, list) { - if (sbinfo) { - fixup_perms(sbinfo->sb); - } + if (sbinfo_has_sdcard_magic(sbinfo)) + fixup_perms_recursive(sbinfo->sb->s_root, &limit); } +} + +static void fixup_all_perms_userid(userid_t userid) +{ + struct sdcardfs_sb_info *sbinfo; + struct limit_search limit = { + .flags = BY_USERID, + .userid = userid, + }; + list_for_each_entry(sbinfo, &sdcardfs_super_list, list) { + if (sbinfo_has_sdcard_magic(sbinfo)) + fixup_perms_recursive(sbinfo->sb->s_root, &limit); + } +} + +static int insert_packagelist_entry(const struct qstr *key, appid_t value) +{ + int err; + + mutex_lock(&sdcardfs_super_list_lock); + err = insert_packagelist_appid_entry_locked(key, value); + if (!err) + fixup_all_perms_name(key); mutex_unlock(&sdcardfs_super_list_lock); - return ret; + + return err; } -static void remove_str_to_int_lock(struct hashtable_entry *h_entry) { - kfree(h_entry->key); - hash_del(&h_entry->hlist); - kmem_cache_free(hashtable_entry_cachep, h_entry); +static int insert_ext_gid_entry(const struct qstr *key, appid_t value) +{ + int err; + + mutex_lock(&sdcardfs_super_list_lock); + err = insert_ext_gid_entry_locked(key, value); + mutex_unlock(&sdcardfs_super_list_lock); + + return err; } -static void remove_str_to_int(struct packagelist_data *pkgl_dat, const char *key) +static int insert_userid_exclude_entry(const struct qstr *key, userid_t value) { - struct sdcardfs_sb_info *sbinfo; - struct hashtable_entry *hash_cur; - unsigned int hash = str_hash(key); + int err; + mutex_lock(&sdcardfs_super_list_lock); - mutex_lock(&pkgl_dat->hashtable_lock); - hash_for_each_possible(pkgl_dat->package_to_appid, hash_cur, hlist, hash) { - if (!strcasecmp(key, hash_cur->key)) { - remove_str_to_int_lock(hash_cur); + err = insert_userid_exclude_entry_locked(key, value); + if (!err) + fixup_all_perms_name_userid(key, value); + mutex_unlock(&sdcardfs_super_list_lock); + + return err; +} + +static void free_hashtable_entry(struct hashtable_entry *entry) +{ + kfree(entry->key.name); + kmem_cache_free(hashtable_entry_cachep, entry); +} + +static void remove_packagelist_entry_locked(const struct qstr *key) +{ + struct hashtable_entry *hash_cur; + unsigned int hash = key->hash; + struct hlist_node *h_t; + HLIST_HEAD(free_list); + + hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) { + hash_del_rcu(&hash_cur->hlist); + hlist_add_head(&hash_cur->dlist, &free_list); + } + } + hash_for_each_possible_rcu(package_to_appid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key)) { + hash_del_rcu(&hash_cur->hlist); + hlist_add_head(&hash_cur->dlist, &free_list); break; } } - mutex_unlock(&pkgl_dat->hashtable_lock); - list_for_each_entry(sbinfo, &sdcardfs_super_list, list) { - if (sbinfo) { - fixup_perms(sbinfo->sb); + synchronize_rcu(); + hlist_for_each_entry_safe(hash_cur, h_t, &free_list, dlist) + free_hashtable_entry(hash_cur); +} + +static void remove_packagelist_entry(const struct qstr *key) +{ + mutex_lock(&sdcardfs_super_list_lock); + remove_packagelist_entry_locked(key); + fixup_all_perms_name(key); + mutex_unlock(&sdcardfs_super_list_lock); +} + +static void remove_ext_gid_entry_locked(const struct qstr *key, gid_t group) +{ + struct hashtable_entry *hash_cur; + unsigned int hash = key->hash; + + hash_for_each_possible_rcu(ext_to_groupid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key) && atomic_read(&hash_cur->value) == group) { + hash_del_rcu(&hash_cur->hlist); + synchronize_rcu(); + free_hashtable_entry(hash_cur); + break; } } +} + +static void remove_ext_gid_entry(const struct qstr *key, gid_t group) +{ + mutex_lock(&sdcardfs_super_list_lock); + remove_ext_gid_entry_locked(key, group); mutex_unlock(&sdcardfs_super_list_lock); - return; } -static void remove_all_hashentrys(struct packagelist_data *pkgl_dat) +static void remove_userid_all_entry_locked(userid_t userid) { struct hashtable_entry *hash_cur; struct hlist_node *h_t; + HLIST_HEAD(free_list); int i; - mutex_lock(&pkgl_dat->hashtable_lock); - hash_for_each_safe(pkgl_dat->package_to_appid, i, h_t, hash_cur, hlist) - remove_str_to_int_lock(hash_cur); - mutex_unlock(&pkgl_dat->hashtable_lock); - hash_init(pkgl_dat->package_to_appid); + + hash_for_each_rcu(package_to_userid, i, hash_cur, hlist) { + if (atomic_read(&hash_cur->value) == userid) { + hash_del_rcu(&hash_cur->hlist); + hlist_add_head(&hash_cur->dlist, &free_list); + } + } + synchronize_rcu(); + hlist_for_each_entry_safe(hash_cur, h_t, &free_list, dlist) { + free_hashtable_entry(hash_cur); + } } -static struct packagelist_data * packagelist_create(void) +static void remove_userid_all_entry(userid_t userid) { - struct packagelist_data *pkgl_dat; + mutex_lock(&sdcardfs_super_list_lock); + remove_userid_all_entry_locked(userid); + fixup_all_perms_userid(userid); + mutex_unlock(&sdcardfs_super_list_lock); +} - pkgl_dat = kmalloc(sizeof(*pkgl_dat), GFP_KERNEL | __GFP_ZERO); - if (!pkgl_dat) { - printk(KERN_ERR "sdcardfs: Failed to create hash\n"); - return ERR_PTR(-ENOMEM); +static void remove_userid_exclude_entry_locked(const struct qstr *key, userid_t userid) +{ + struct hashtable_entry *hash_cur; + unsigned int hash = key->hash; + + hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) { + if (qstr_case_eq(key, &hash_cur->key) && + atomic_read(&hash_cur->value) == userid) { + hash_del_rcu(&hash_cur->hlist); + synchronize_rcu(); + free_hashtable_entry(hash_cur); + break; + } } +} - mutex_init(&pkgl_dat->hashtable_lock); - hash_init(pkgl_dat->package_to_appid); - - return pkgl_dat; +static void remove_userid_exclude_entry(const struct qstr *key, userid_t userid) +{ + mutex_lock(&sdcardfs_super_list_lock); + remove_userid_exclude_entry_locked(key, userid); + fixup_all_perms_name_userid(key, userid); + mutex_unlock(&sdcardfs_super_list_lock); } -static void packagelist_destroy(struct packagelist_data *pkgl_dat) +static void packagelist_destroy(void) { - remove_all_hashentrys(pkgl_dat); - printk(KERN_INFO "sdcardfs: destroyed packagelist pkgld\n"); - kfree(pkgl_dat); + struct hashtable_entry *hash_cur; + struct hlist_node *h_t; + HLIST_HEAD(free_list); + int i; + + mutex_lock(&sdcardfs_super_list_lock); + hash_for_each_rcu(package_to_appid, i, hash_cur, hlist) { + hash_del_rcu(&hash_cur->hlist); + hlist_add_head(&hash_cur->dlist, &free_list); + } + hash_for_each_rcu(package_to_userid, i, hash_cur, hlist) { + hash_del_rcu(&hash_cur->hlist); + hlist_add_head(&hash_cur->dlist, &free_list); + } + synchronize_rcu(); + hlist_for_each_entry_safe(hash_cur, h_t, &free_list, dlist) + free_hashtable_entry(hash_cur); + mutex_unlock(&sdcardfs_super_list_lock); + pr_info("sdcardfs: destroyed packagelist pkgld\n"); } -struct package_appid { +struct package_details { struct config_item item; - int add_pid; + struct qstr name; }; -static inline struct package_appid *to_package_appid(struct config_item *item) +static inline struct package_details *to_package_details(struct config_item *item) { - return item ? container_of(item, struct package_appid, item) : NULL; + return item ? container_of(item, struct package_details, item) : NULL; } -static struct configfs_attribute package_appid_attr_add_pid = { - .ca_owner = THIS_MODULE, - .ca_name = "appid", - .ca_mode = S_IRUGO | S_IWUGO, -}; +CONFIGFS_ATTR_STRUCT(package_details); +#define PACKAGE_DETAILS_ATTR(_name, _mode, _show, _store) \ +struct package_details_attribute package_details_attr_##_name = __CONFIGFS_ATTR(_name, _mode, _show, _store) +#define PACKAGE_DETAILS_ATTRIBUTE(name) (&package_details_attr_##name.attr) -static struct configfs_attribute *package_appid_attrs[] = { - &package_appid_attr_add_pid, - NULL, -}; +static ssize_t package_details_appid_show(struct package_details *package_details, + char *page) +{ + return scnprintf(page, PAGE_SIZE, "%u\n", __get_appid(&package_details->name)); +} + +static ssize_t package_details_appid_store(struct package_details *package_details, + const char *page, size_t count) +{ + unsigned int tmp; + int ret; + + ret = kstrtouint(page, 10, &tmp); + if (ret) + return ret; + + ret = insert_packagelist_entry(&package_details->name, tmp); + + if (ret) + return ret; + + return count; +} -static ssize_t package_appid_attr_show(struct config_item *item, - struct configfs_attribute *attr, +static ssize_t package_details_excluded_userids_show(struct package_details *package_details, char *page) { - ssize_t count; - count = sprintf(page, "%d\n", get_appid(pkgl_data_all, item->ci_name)); + struct hashtable_entry *hash_cur; + unsigned int hash = package_details->name.hash; + int count = 0; + + rcu_read_lock(); + hash_for_each_possible_rcu(package_to_userid, hash_cur, hlist, hash) { + if (qstr_case_eq(&package_details->name, &hash_cur->key)) + count += scnprintf(page + count, PAGE_SIZE - count, + "%d ", atomic_read(&hash_cur->value)); + } + rcu_read_unlock(); + if (count) + count--; + count += scnprintf(page + count, PAGE_SIZE - count, "\n"); return count; } -static ssize_t package_appid_attr_store(struct config_item *item, - struct configfs_attribute *attr, +static ssize_t package_details_excluded_userids_store(struct package_details *package_details, const char *page, size_t count) { - struct package_appid *package_appid = to_package_appid(item); - unsigned long tmp; - char *p = (char *) page; + unsigned int tmp; int ret; - tmp = simple_strtoul(p, &p, 10); - if (!p || (*p && (*p != '\n'))) - return -EINVAL; + ret = kstrtouint(page, 10, &tmp); + if (ret) + return ret; + + ret = insert_userid_exclude_entry(&package_details->name, tmp); - if (tmp > INT_MAX) - return -ERANGE; - ret = insert_str_to_int(pkgl_data_all, item->ci_name, (unsigned int)tmp); - package_appid->add_pid = tmp; if (ret) return ret; return count; } -static void package_appid_release(struct config_item *item) +static ssize_t package_details_clear_userid_store(struct package_details *package_details, + const char *page, size_t count) { - printk(KERN_INFO "sdcardfs: removing %s\n", item->ci_dentry->d_name.name); - /* item->ci_name is freed already, so we rely on the dentry */ - remove_str_to_int(pkgl_data_all, item->ci_dentry->d_name.name); - kfree(to_package_appid(item)); + unsigned int tmp; + int ret; + + ret = kstrtouint(page, 10, &tmp); + if (ret) + return ret; + remove_userid_exclude_entry(&package_details->name, tmp); + return count; +} + +static void package_details_release(struct config_item *item) +{ + struct package_details *package_details = to_package_details(item); + + pr_info("sdcardfs: removing %s\n", package_details->name.name); + remove_packagelist_entry(&package_details->name); + kfree(package_details->name.name); + kfree(package_details); } -static struct configfs_item_operations package_appid_item_ops = { - .release = package_appid_release, - .show_attribute = package_appid_attr_show, - .store_attribute = package_appid_attr_store, +PACKAGE_DETAILS_ATTR(appid, S_IRUGO | S_IWUGO, package_details_appid_show, package_details_appid_store); +PACKAGE_DETAILS_ATTR(excluded_userids, S_IRUGO | S_IWUGO, + package_details_excluded_userids_show, package_details_excluded_userids_store); +PACKAGE_DETAILS_ATTR(clear_userid, S_IWUGO, NULL, package_details_clear_userid_store); + +static struct configfs_attribute *package_details_attrs[] = { + PACKAGE_DETAILS_ATTRIBUTE(appid), + PACKAGE_DETAILS_ATTRIBUTE(excluded_userids), + PACKAGE_DETAILS_ATTRIBUTE(clear_userid), + NULL, +}; + +CONFIGFS_ATTR_OPS(package_details); + +static struct configfs_item_operations package_details_item_ops = { + .release = package_details_release, + .show_attribute = package_details_attr_show, + .store_attribute = package_details_attr_store, }; static struct config_item_type package_appid_type = { - .ct_item_ops = &package_appid_item_ops, - .ct_attrs = package_appid_attrs, + .ct_item_ops = &package_details_item_ops, + .ct_attrs = package_details_attrs, .ct_owner = THIS_MODULE, }; - -struct sdcardfs_packages { +struct extensions_value { struct config_group group; + unsigned int num; +}; + +struct extension_details { + struct config_item item; + struct qstr name; + unsigned int num; }; -static inline struct sdcardfs_packages *to_sdcardfs_packages(struct config_item *item) +static inline struct extensions_value *to_extensions_value(struct config_item *item) { - return item ? container_of(to_config_group(item), struct sdcardfs_packages, group) : NULL; + return item ? container_of(to_config_group(item), struct extensions_value, group) : NULL; } -static struct config_item *sdcardfs_packages_make_item(struct config_group *group, const char *name) +static inline struct extension_details *to_extension_details(struct config_item *item) { - struct package_appid *package_appid; + return item ? container_of(item, struct extension_details, item) : NULL; +} + +static void extension_details_release(struct config_item *item) +{ + struct extension_details *extension_details = to_extension_details(item); + + pr_info("sdcardfs: No longer mapping %s files to gid %d\n", + extension_details->name.name, extension_details->num); + remove_ext_gid_entry(&extension_details->name, extension_details->num); + kfree(extension_details->name.name); + kfree(extension_details); +} + +static struct configfs_item_operations extension_details_item_ops = { + .release = extension_details_release, +}; - package_appid = kzalloc(sizeof(struct package_appid), GFP_KERNEL); - if (!package_appid) +static struct config_item_type extension_details_type = { + .ct_item_ops = &extension_details_item_ops, + .ct_owner = THIS_MODULE, +}; + +static struct config_item *extension_details_make_item(struct config_group *group, const char *name) +{ + struct extensions_value *extensions_value = to_extensions_value(&group->cg_item); + struct extension_details *extension_details = kzalloc(sizeof(struct extension_details), GFP_KERNEL); + const char *tmp; + int ret; + + if (!extension_details) return ERR_PTR(-ENOMEM); - config_item_init_type_name(&package_appid->item, name, - &package_appid_type); + tmp = kstrdup(name, GFP_KERNEL); + if (!tmp) { + kfree(extension_details); + return ERR_PTR(-ENOMEM); + } + qstr_init(&extension_details->name, tmp); + ret = insert_ext_gid_entry(&extension_details->name, extensions_value->num); - package_appid->add_pid = 0; + if (ret) { + kfree(extension_details->name.name); + kfree(extension_details); + return ERR_PTR(ret); + } + config_item_init_type_name(&extension_details->item, name, &extension_details_type); - return &package_appid->item; + return &extension_details->item; } -static struct configfs_attribute sdcardfs_packages_attr_description = { - .ca_owner = THIS_MODULE, - .ca_name = "packages_gid.list", - .ca_mode = S_IRUGO, +static struct configfs_group_operations extensions_value_group_ops = { + .make_item = extension_details_make_item, }; -static struct configfs_attribute *sdcardfs_packages_attrs[] = { - &sdcardfs_packages_attr_description, - NULL, +static struct config_item_type extensions_name_type = { + .ct_group_ops = &extensions_value_group_ops, + .ct_owner = THIS_MODULE, +}; + +static struct config_group *extensions_make_group(struct config_group *group, const char *name) +{ + struct extensions_value *extensions_value; + unsigned int tmp; + int ret; + + extensions_value = kzalloc(sizeof(struct extensions_value), GFP_KERNEL); + if (!extensions_value) + return ERR_PTR(-ENOMEM); + ret = kstrtouint(name, 10, &tmp); + if (ret) { + kfree(extensions_value); + return ERR_PTR(ret); + } + + extensions_value->num = tmp; + config_group_init_type_name(&extensions_value->group, name, + &extensions_name_type); + return &extensions_value->group; +} + +static void extensions_drop_group(struct config_group *group, struct config_item *item) +{ + struct extensions_value *value = to_extensions_value(item); + + pr_info("sdcardfs: No longer mapping any files to gid %d\n", value->num); + kfree(value); +} + +static struct configfs_group_operations extensions_group_ops = { + .make_group = extensions_make_group, + .drop_item = extensions_drop_group, }; -static ssize_t packages_attr_show(struct config_item *item, - struct configfs_attribute *attr, +static struct config_item_type extensions_type = { + .ct_group_ops = &extensions_group_ops, + .ct_owner = THIS_MODULE, +}; + +struct config_group extension_group = { + .cg_item = { + .ci_namebuf = "extensions", + .ci_type = &extensions_type, + }, +}; + +struct packages { + struct configfs_subsystem subsystem; +}; + +static inline struct packages *to_packages(struct config_item *item) +{ + return item ? container_of(to_configfs_subsystem(to_config_group(item)), struct packages, subsystem) : NULL; +} + +CONFIGFS_ATTR_STRUCT(packages); +#define PACKAGES_ATTR(_name, _mode, _show, _store) \ +struct packages_attribute packages_attr_##_name = __CONFIGFS_ATTR(_name, _mode, _show, _store) +#define PACKAGES_ATTR_RO(_name, _show) \ +struct packages_attribute packages_attr_##_name = __CONFIGFS_ATTR_RO(_name, _show) + +static struct config_item *packages_make_item(struct config_group *group, const char *name) +{ + struct package_details *package_details; + const char *tmp; + + package_details = kzalloc(sizeof(struct package_details), GFP_KERNEL); + if (!package_details) + return ERR_PTR(-ENOMEM); + tmp = kstrdup(name, GFP_KERNEL); + if (!tmp) { + kfree(package_details); + return ERR_PTR(-ENOMEM); + } + qstr_init(&package_details->name, tmp); + config_item_init_type_name(&package_details->item, name, + &package_appid_type); + + return &package_details->item; +} + +static ssize_t packages_list_show(struct packages *packages, char *page) { - struct hashtable_entry *hash_cur; - struct hlist_node *h_t; + struct hashtable_entry *hash_cur_app; + struct hashtable_entry *hash_cur_user; int i; - int count = 0; - mutex_lock(&pkgl_data_all->hashtable_lock); - hash_for_each_safe(pkgl_data_all->package_to_appid, i, h_t, hash_cur, hlist) - count += snprintf(page + count, PAGE_SIZE - count, "%s %d\n", (char *)hash_cur->key, hash_cur->value); - mutex_unlock(&pkgl_data_all->hashtable_lock); - + int count = 0, written = 0; + const char errormsg[] = "\n"; + unsigned int hash; + + rcu_read_lock(); + hash_for_each_rcu(package_to_appid, i, hash_cur_app, hlist) { + written = scnprintf(page + count, PAGE_SIZE - sizeof(errormsg) - count, "%s %d\n", + hash_cur_app->key.name, atomic_read(&hash_cur_app->value)); + hash = hash_cur_app->key.hash; + hash_for_each_possible_rcu(package_to_userid, hash_cur_user, hlist, hash) { + if (qstr_case_eq(&hash_cur_app->key, &hash_cur_user->key)) { + written += scnprintf(page + count + written - 1, + PAGE_SIZE - sizeof(errormsg) - count - written + 1, + " %d\n", atomic_read(&hash_cur_user->value)) - 1; + } + } + if (count + written == PAGE_SIZE - sizeof(errormsg) - 1) { + count += scnprintf(page + count, PAGE_SIZE - count, errormsg); + break; + } + count += written; + } + rcu_read_unlock(); return count; } -static void sdcardfs_packages_release(struct config_item *item) +static ssize_t packages_remove_userid_store(struct packages *packages, + const char *page, size_t count) { + unsigned int tmp; + int ret; - printk(KERN_INFO "sdcardfs: destroyed something?\n"); - kfree(to_sdcardfs_packages(item)); + ret = kstrtouint(page, 10, &tmp); + if (ret) + return ret; + remove_userid_all_entry(tmp); + return count; } -static struct configfs_item_operations sdcardfs_packages_item_ops = { - .release = sdcardfs_packages_release, - .show_attribute = packages_attr_show, +struct packages_attribute packages_attr_packages_gid_list = __CONFIGFS_ATTR_RO(packages_gid.list, packages_list_show); +PACKAGES_ATTR(remove_userid, S_IWUGO, NULL, packages_remove_userid_store); + +static struct configfs_attribute *packages_attrs[] = { + &packages_attr_packages_gid_list.attr, + &packages_attr_remove_userid.attr, + NULL, +}; + +CONFIGFS_ATTR_OPS(packages) +static struct configfs_item_operations packages_item_ops = { + .show_attribute = packages_attr_show, + .store_attribute = packages_attr_store, }; /* * Note that, since no extra work is required on ->drop_item(), * no ->drop_item() is provided. */ -static struct configfs_group_operations sdcardfs_packages_group_ops = { - .make_item = sdcardfs_packages_make_item, +static struct configfs_group_operations packages_group_ops = { + .make_item = packages_make_item, }; -static struct config_item_type sdcardfs_packages_type = { - .ct_item_ops = &sdcardfs_packages_item_ops, - .ct_group_ops = &sdcardfs_packages_group_ops, - .ct_attrs = sdcardfs_packages_attrs, +static struct config_item_type packages_type = { + .ct_item_ops = &packages_item_ops, + .ct_group_ops = &packages_group_ops, + .ct_attrs = packages_attrs, .ct_owner = THIS_MODULE, }; -static struct configfs_subsystem sdcardfs_packages_subsys = { - .su_group = { - .cg_item = { - .ci_namebuf = "sdcardfs", - .ci_type = &sdcardfs_packages_type, +struct config_group *sd_default_groups[] = { + &extension_group, + NULL, +}; + +static struct packages sdcardfs_packages = { + .subsystem = { + .su_group = { + .cg_item = { + .ci_namebuf = "sdcardfs", + .ci_type = &packages_type, + }, + .default_groups = sd_default_groups, }, }, }; static int configfs_sdcardfs_init(void) { - int ret; - struct configfs_subsystem *subsys = &sdcardfs_packages_subsys; + int ret, i; + struct configfs_subsystem *subsys = &sdcardfs_packages.subsystem; + for (i = 0; sd_default_groups[i]; i++) + config_group_init(sd_default_groups[i]); config_group_init(&subsys->su_group); mutex_init(&subsys->su_mutex); ret = configfs_register_subsystem(subsys); if (ret) { - printk(KERN_ERR "Error %d while registering subsystem %s\n", + pr_err("Error %d while registering subsystem %s\n", ret, subsys->su_group.cg_item.ci_namebuf); } @@ -413,7 +860,7 @@ static int configfs_sdcardfs_init(void) static void configfs_sdcardfs_exit(void) { - configfs_unregister_subsystem(&sdcardfs_packages_subsys); + configfs_unregister_subsystem(&sdcardfs_packages.subsystem); } int packagelist_init(void) @@ -422,19 +869,17 @@ int packagelist_init(void) kmem_cache_create("packagelist_hashtable_entry", sizeof(struct hashtable_entry), 0, 0, NULL); if (!hashtable_entry_cachep) { - printk(KERN_ERR "sdcardfs: failed creating pkgl_hashtable entry slab cache\n"); + pr_err("sdcardfs: failed creating pkgl_hashtable entry slab cache\n"); return -ENOMEM; } - pkgl_data_all = packagelist_create(); configfs_sdcardfs_init(); - return 0; + return 0; } void packagelist_exit(void) { configfs_sdcardfs_exit(); - packagelist_destroy(pkgl_data_all); - if (hashtable_entry_cachep) - kmem_cache_destroy(hashtable_entry_cachep); + packagelist_destroy(); + kmem_cache_destroy(hashtable_entry_cachep); } diff --git a/fs/sdcardfs/sdcardfs.h b/fs/sdcardfs/sdcardfs.h index 62c59da5ca858..f26994cb869a2 100644 --- a/fs/sdcardfs/sdcardfs.h +++ b/fs/sdcardfs/sdcardfs.h @@ -29,6 +29,8 @@ #include #include #include +#include +#include #include #include #include @@ -52,7 +54,7 @@ #define SDCARDFS_ROOT_INO 1 /* useful for tracking code reachability */ -#define UDBG printk(KERN_DEFAULT "DBG:%s:%s:%d\n", __FILE__, __func__, __LINE__) +#define UDBG pr_default("DBG:%s:%s:%d\n", __FILE__, __func__, __LINE__) #define SDCARDFS_DIRENT_SIZE 256 @@ -65,71 +67,90 @@ #define AID_SDCARD_PICS 1033 /* external storage photos access */ #define AID_SDCARD_AV 1034 /* external storage audio/video access */ #define AID_SDCARD_ALL 1035 /* access all users external storage */ +#define AID_MEDIA_OBB 1059 /* obb files */ + +#define AID_SDCARD_IMAGE 1057 #define AID_PACKAGE_INFO 1027 -#define fix_derived_permission(x) \ + +/* + * Permissions are handled by our permission function. + * We don't want anyone who happens to look at our inode value to prematurely + * block access, so store more permissive values. These are probably never + * used. + */ +#define fixup_tmp_permissions(x) \ do { \ - (x)->i_uid = make_kuid(&init_user_ns, SDCARDFS_I(x)->d_uid); \ - (x)->i_gid = make_kgid(&init_user_ns, get_gid(SDCARDFS_I(x))); \ - (x)->i_mode = ((x)->i_mode & S_IFMT) | get_mode(SDCARDFS_I(x));\ + (x)->i_uid = make_kuid(&init_user_ns, \ + SDCARDFS_I(x)->data->d_uid); \ + (x)->i_gid = make_kgid(&init_user_ns, AID_SDCARD_RW); \ + (x)->i_mode = ((x)->i_mode & S_IFMT) | 0775;\ } while (0) - /* OVERRIDE_CRED() and REVERT_CRED() - * OVERRID_CRED() - * backup original task->cred - * and modifies task->cred->fsuid/fsgid to specified value. + * OVERRIDE_CRED() + * backup original task->cred + * and modifies task->cred->fsuid/fsgid to specified value. * REVERT_CRED() - * restore original task->cred->fsuid/fsgid. + * restore original task->cred->fsuid/fsgid. * These two macro should be used in pair, and OVERRIDE_CRED() should be * placed at the beginning of a function, right after variable declaration. */ -#define OVERRIDE_CRED(sdcardfs_sbi, saved_cred) \ - saved_cred = override_fsids(sdcardfs_sbi); \ - if (!saved_cred) { return -ENOMEM; } +#define OVERRIDE_CRED(sdcardfs_sbi, saved_cred, info) \ + do { \ + saved_cred = override_fsids(sdcardfs_sbi, info->data); \ + if (!saved_cred) \ + return -ENOMEM; \ + } while (0) -#define OVERRIDE_CRED_PTR(sdcardfs_sbi, saved_cred) \ - saved_cred = override_fsids(sdcardfs_sbi); \ - if (!saved_cred) { return ERR_PTR(-ENOMEM); } +#define OVERRIDE_CRED_PTR(sdcardfs_sbi, saved_cred, info) \ + do { \ + saved_cred = override_fsids(sdcardfs_sbi, info->data); \ + if (!saved_cred) \ + return ERR_PTR(-ENOMEM); \ + } while (0) #define REVERT_CRED(saved_cred) revert_fsids(saved_cred) -#define DEBUG_CRED() \ - printk("KAKJAGI: %s:%d fsuid %d fsgid %d\n", \ - __FUNCTION__, __LINE__, \ - (int)current->cred->fsuid, \ - (int)current->cred->fsgid); - /* Android 5.0 support */ /* Permission mode for a specific node. Controls how file permissions - * are derived for children nodes. */ + * are derived for children nodes. + */ typedef enum { - /* Nothing special; this node should just inherit from its parent. */ - PERM_INHERIT, - /* This node is one level above a normal root; used for legacy layouts - * which use the first level to represent user_id. */ - PERM_PRE_ROOT, - /* This node is "/" */ - PERM_ROOT, - /* This node is "/Android" */ - PERM_ANDROID, - /* This node is "/Android/data" */ - PERM_ANDROID_DATA, - /* This node is "/Android/obb" */ - PERM_ANDROID_OBB, - /* This node is "/Android/media" */ - PERM_ANDROID_MEDIA, + /* Nothing special; this node should just inherit from its parent. */ + PERM_INHERIT, + /* This node is one level above a normal root; used for legacy layouts + * which use the first level to represent user_id. + */ + PERM_PRE_ROOT, + /* This node is "/" */ + PERM_ROOT, + /* This node is "/Android" */ + PERM_ANDROID, + /* This node is "/Android/data" */ + PERM_ANDROID_DATA, + /* This node is "/Android/obb" */ + PERM_ANDROID_OBB, + /* This node is "/Android/media" */ + PERM_ANDROID_MEDIA, + /* This node is "/Android/[data|media|obb]/[package]" */ + PERM_ANDROID_PACKAGE, + /* This node is "/Android/[data|media|obb]/[package]/cache" */ + PERM_ANDROID_PACKAGE_CACHE, } perm_t; struct sdcardfs_sb_info; struct sdcardfs_mount_options; +struct sdcardfs_inode_info; +struct sdcardfs_inode_data; /* Do not directly use this function. Use OVERRIDE_CRED() instead. */ -const struct cred * override_fsids(struct sdcardfs_sb_info* sbi); +const struct cred *override_fsids(struct sdcardfs_sb_info *sbi, + struct sdcardfs_inode_data *data); /* Do not directly use this function, use REVERT_CRED() instead. */ -void revert_fsids(const struct cred * old_cred); +void revert_fsids(const struct cred *old_cred); /* operations vectors defined in specific files */ extern const struct file_operations sdcardfs_main_fops; @@ -161,14 +182,26 @@ struct sdcardfs_file_info { const struct vm_operations_struct *lower_vm_ops; }; -/* sdcardfs inode data in memory */ -struct sdcardfs_inode_info { - struct inode *lower_inode; - /* state derived based on current position in hierachy */ +struct sdcardfs_inode_data { + struct kref refcount; + bool abandoned; + perm_t perm; userid_t userid; uid_t d_uid; bool under_android; + bool under_cache; + bool under_obb; +}; + +/* sdcardfs inode data in memory */ +struct sdcardfs_inode_info { + struct inode *lower_inode; + /* state derived based on current position in hierarchy */ + struct sdcardfs_inode_data *data; + + /* top folder for ownership */ + struct sdcardfs_inode_data *top_data; struct inode vfs_inode; }; @@ -185,18 +218,25 @@ struct sdcardfs_mount_options { uid_t fs_low_uid; gid_t fs_low_gid; userid_t fs_user_id; - gid_t gid; - mode_t mask; bool multiuser; unsigned int reserved_mb; }; +struct sdcardfs_vfsmount_options { + gid_t gid; + mode_t mask; +}; + +extern int parse_options_remount(struct super_block *sb, char *options, int silent, + struct sdcardfs_vfsmount_options *vfsopts); + /* sdcardfs super-block data in memory */ struct sdcardfs_sb_info { struct super_block *sb; struct super_block *lower_sb; /* derived perm policy : some of options have been added - * to sdcardfs_mount_options (Android 4.4 support) */ + * to sdcardfs_mount_options (Android 4.4 support) + */ struct sdcardfs_mount_options options; spinlock_t lock; /* protects obbpath */ char *obbpath_s; @@ -307,7 +347,7 @@ static inline void sdcardfs_put_reset_##pname(const struct dentry *dent) \ { \ struct path pname; \ spin_lock(&SDCARDFS_D(dent)->lock); \ - if(SDCARDFS_D(dent)->pname.dentry) { \ + if (SDCARDFS_D(dent)->pname.dentry) { \ pathcpy(&pname, &SDCARDFS_D(dent)->pname); \ SDCARDFS_D(dent)->pname.dentry = NULL; \ SDCARDFS_D(dent)->pname.mnt = NULL; \ @@ -321,38 +361,97 @@ static inline void sdcardfs_put_reset_##pname(const struct dentry *dent) \ SDCARDFS_DENT_FUNC(lower_path) SDCARDFS_DENT_FUNC(orig_path) -static inline int get_gid(struct sdcardfs_inode_info *info) { - struct sdcardfs_sb_info *sb_info = SDCARDFS_SB(info->vfs_inode.i_sb); - if (sb_info->options.gid == AID_SDCARD_RW) { +static inline bool sbinfo_has_sdcard_magic(struct sdcardfs_sb_info *sbinfo) +{ + return sbinfo && sbinfo->sb + && sbinfo->sb->s_magic == SDCARDFS_SUPER_MAGIC; +} + +static inline struct sdcardfs_inode_data *data_get( + struct sdcardfs_inode_data *data) +{ + if (data) + kref_get(&data->refcount); + return data; +} + +static inline struct sdcardfs_inode_data *top_data_get( + struct sdcardfs_inode_info *info) +{ + return data_get(info->top_data); +} + +extern void data_release(struct kref *ref); + +static inline void data_put(struct sdcardfs_inode_data *data) +{ + kref_put(&data->refcount, data_release); +} + +static inline void release_own_data(struct sdcardfs_inode_info *info) +{ + /* + * This happens exactly once per inode. At this point, the inode that + * originally held this data is about to be freed, and all references + * to it are held as a top value, and will likely be released soon. + */ + info->data->abandoned = true; + data_put(info->data); +} + +static inline void set_top(struct sdcardfs_inode_info *info, + struct sdcardfs_inode_data *top) +{ + struct sdcardfs_inode_data *old_top = info->top_data; + + if (top) + data_get(top); + info->top_data = top; + if (old_top) + data_put(old_top); +} + +static inline int get_gid(struct vfsmount *mnt, + struct sdcardfs_inode_data *data) +{ + struct sdcardfs_vfsmount_options *opts = mnt->data; + + if (opts->gid == AID_SDCARD_RW) /* As an optimization, certain trusted system components only run * as owner but operate across all users. Since we're now handing * out the sdcard_rw GID only to trusted apps, we're okay relaxing * the user boundary enforcement for the default view. The UIDs - * assigned to app directories are still multiuser aware. */ + * assigned to app directories are still multiuser aware. + */ return AID_SDCARD_RW; - } else { - return multiuser_get_uid(info->userid, sb_info->options.gid); - } + else + return multiuser_get_uid(data->userid, opts->gid); } -static inline int get_mode(struct sdcardfs_inode_info *info) { + +static inline int get_mode(struct vfsmount *mnt, + struct sdcardfs_inode_info *info, + struct sdcardfs_inode_data *data) +{ int owner_mode; int filtered_mode; - struct sdcardfs_sb_info *sb_info = SDCARDFS_SB(info->vfs_inode.i_sb); - int visible_mode = 0775 & ~sb_info->options.mask; + struct sdcardfs_vfsmount_options *opts = mnt->data; + int visible_mode = 0775 & ~opts->mask; - if (info->perm == PERM_PRE_ROOT) { + + if (data->perm == PERM_PRE_ROOT) { /* Top of multi-user view should always be visible to ensure - * secondary users can traverse inside. */ + * secondary users can traverse inside. + */ visible_mode = 0711; - } else if (info->under_android) { + } else if (data->under_android) { /* Block "other" access to Android directories, since only apps * belonging to a specific user should be in there; we still - * leave +x open for the default view. */ - if (sb_info->options.gid == AID_SDCARD_RW) { + * leave +x open for the default view. + */ + if (opts->gid == AID_SDCARD_RW) visible_mode = visible_mode & ~0006; - } else { + else visible_mode = visible_mode & ~0007; - } } owner_mode = info->lower_inode->i_mode & 0700; filtered_mode = visible_mode & (owner_mode | (owner_mode >> 3) | (owner_mode >> 6)); @@ -377,7 +476,7 @@ static inline void sdcardfs_get_real_lower(const struct dentry *dent, /* in case of a local obb dentry * the orig_path should be returned */ - if(has_graft_path(dent)) + if (has_graft_path(dent)) sdcardfs_get_orig_path(dent, real_lower); else sdcardfs_get_lower_path(dent, real_lower); @@ -386,7 +485,7 @@ static inline void sdcardfs_get_real_lower(const struct dentry *dent, static inline void sdcardfs_put_real_lower(const struct dentry *dent, struct path *real_lower) { - if(has_graft_path(dent)) + if (has_graft_path(dent)) sdcardfs_put_orig_path(dent, real_lower); else sdcardfs_put_lower_path(dent, real_lower); @@ -396,20 +495,31 @@ extern struct mutex sdcardfs_super_list_lock; extern struct list_head sdcardfs_super_list; /* for packagelist.c */ -extern appid_t get_appid(void *pkgl_id, const char *app_name); -extern int check_caller_access_to_name(struct inode *parent_node, const char* name); -extern int open_flags_to_access_mode(int open_flags); +extern appid_t get_appid(const char *app_name); +extern appid_t get_ext_gid(const char *app_name); +extern appid_t is_excluded(const char *app_name, userid_t userid); +extern int check_caller_access_to_name(struct inode *parent_node, const struct qstr *name); extern int packagelist_init(void); extern void packagelist_exit(void); /* for derived_perm.c */ +#define BY_NAME (1 << 0) +#define BY_USERID (1 << 1) +struct limit_search { + unsigned int flags; + struct qstr name; + userid_t userid; +}; + extern void setup_derived_state(struct inode *inode, perm_t perm, - userid_t userid, uid_t uid, bool under_android); + userid_t userid, uid_t uid, bool under_android, + struct sdcardfs_inode_data *top); extern void get_derived_permission(struct dentry *parent, struct dentry *dentry); -extern void get_derived_permission_new(struct dentry *parent, struct dentry *dentry, struct dentry *newdentry); -extern void get_derive_permissions_recursive(struct dentry *parent); +extern void get_derived_permission_new(struct dentry *parent, struct dentry *dentry, const struct qstr *name); +extern void fixup_perms_recursive(struct dentry *dentry, struct limit_search *limit); extern void update_derived_permission_lock(struct dentry *dentry); +void fixup_lower_ownership(struct dentry *dentry, const char *name); extern int need_graft_path(struct dentry *dentry); extern int is_base_obbpath(struct dentry *dentry); extern int is_obbpath_invalid(struct dentry *dentry); @@ -419,6 +529,7 @@ extern int setup_obb_dentry(struct dentry *dentry, struct path *lower_path); static inline struct dentry *lock_parent(struct dentry *dentry) { struct dentry *dir = dget_parent(dentry); + mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT); return dir; } @@ -444,7 +555,7 @@ static inline int prepare_dir(const char *path_s, uid_t uid, gid_t gid, mode_t m goto out_unlock; } - err = vfs_mkdir(parent.dentry->d_inode, dent, mode); + err = vfs_mkdir2(parent.mnt, parent.dentry->d_inode, dent, mode); if (err) { if (err == -EEXIST) err = 0; @@ -455,7 +566,7 @@ static inline int prepare_dir(const char *path_s, uid_t uid, gid_t gid, mode_t m attrs.ia_gid = make_kgid(&init_user_ns, gid); attrs.ia_valid = ATTR_UID | ATTR_GID; mutex_lock(&dent->d_inode->i_mutex); - notify_change(dent, &attrs, NULL); + notify_change2(parent.mnt, dent, &attrs, NULL); mutex_unlock(&dent->d_inode->i_mutex); out_dput: @@ -513,12 +624,16 @@ static inline int check_min_free_space(struct dentry *dentry, size_t size, int d return 1; } -/* Copies attrs and maintains sdcardfs managed attrs */ +/* + * Copies attrs and maintains sdcardfs managed attrs + * Since our permission check handles all special permissions, set those to be open + */ static inline void sdcardfs_copy_and_fix_attrs(struct inode *dest, const struct inode *src) { - dest->i_mode = (src->i_mode & S_IFMT) | get_mode(SDCARDFS_I(dest)); - dest->i_uid = make_kuid(&init_user_ns, SDCARDFS_I(dest)->d_uid); - dest->i_gid = make_kgid(&init_user_ns, get_gid(SDCARDFS_I(dest))); + dest->i_mode = (src->i_mode & S_IFMT) | S_IRWXU | S_IRWXG | + S_IROTH | S_IXOTH; /* 0775 */ + dest->i_uid = make_kuid(&init_user_ns, SDCARDFS_I(dest)->data->d_uid); + dest->i_gid = make_kgid(&init_user_ns, AID_SDCARD_RW); dest->i_rdev = src->i_rdev; dest->i_atime = src->i_atime; dest->i_mtime = src->i_mtime; @@ -527,4 +642,23 @@ static inline void sdcardfs_copy_and_fix_attrs(struct inode *dest, const struct dest->i_flags = src->i_flags; set_nlink(dest, src->i_nlink); } + +static inline bool str_case_eq(const char *s1, const char *s2) +{ + return !strcasecmp(s1, s2); +} + +static inline bool str_n_case_eq(const char *s1, const char *s2, size_t len) +{ + return !strncasecmp(s1, s2, len); +} + +static inline bool qstr_case_eq(const struct qstr *q1, const struct qstr *q2) +{ + return q1->len == q2->len && str_n_case_eq(q1->name, q2->name, q1->len); +} + +/* */ +#define QSTR_LITERAL(string) QSTR_INIT(string, sizeof(string)-1) + #endif /* not _SDCARDFS_H_ */ diff --git a/fs/sdcardfs/super.c b/fs/sdcardfs/super.c index 1d6490128c990..7f4539b4b2493 100644 --- a/fs/sdcardfs/super.c +++ b/fs/sdcardfs/super.c @@ -26,6 +26,23 @@ */ static struct kmem_cache *sdcardfs_inode_cachep; +/* + * To support the top references, we must track some data separately. + * An sdcardfs_inode_info always has a reference to its data, and once set up, + * also has a reference to its top. The top may be itself, in which case it + * holds two references to its data. When top is changed, it takes a ref to the + * new data and then drops the ref to the old data. + */ +static struct kmem_cache *sdcardfs_inode_data_cachep; + +void data_release(struct kref *ref) +{ + struct sdcardfs_inode_data *data = + container_of(ref, struct sdcardfs_inode_data, refcount); + + kmem_cache_free(sdcardfs_inode_data_cachep, data); +} + /* final actions when unmounting a file system */ static void sdcardfs_put_super(struct super_block *sb) { @@ -36,7 +53,7 @@ static void sdcardfs_put_super(struct super_block *sb) if (!spd) return; - if(spd->obbpath_s) { + if (spd->obbpath_s) { kfree(spd->obbpath_s); path_put(&spd->obbpath); } @@ -64,7 +81,7 @@ static int sdcardfs_statfs(struct dentry *dentry, struct kstatfs *buf) if (sbi->options.reserved_mb) { /* Invalid statfs informations. */ if (buf->f_bsize == 0) { - printk(KERN_ERR "Returned block size is zero.\n"); + pr_err("Returned block size is zero.\n"); return -EINVAL; } @@ -100,14 +117,61 @@ static int sdcardfs_remount_fs(struct super_block *sb, int *flags, char *options * SILENT, but anything else left over is an error. */ if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT)) != 0) { - printk(KERN_ERR - "sdcardfs: remount flags 0x%x unsupported\n", *flags); + pr_err("sdcardfs: remount flags 0x%x unsupported\n", *flags); err = -EINVAL; } return err; } +/* + * @mnt: mount point we are remounting + * @sb: superblock we are remounting + * @flags: numeric mount options + * @options: mount options string + */ +static int sdcardfs_remount_fs2(struct vfsmount *mnt, struct super_block *sb, + int *flags, char *options) +{ + int err = 0; + + /* + * The VFS will take care of "ro" and "rw" flags among others. We + * can safely accept a few flags (RDONLY, MANDLOCK), and honor + * SILENT, but anything else left over is an error. + */ + if ((*flags & ~(MS_RDONLY | MS_MANDLOCK | MS_SILENT | MS_REMOUNT)) != 0) { + pr_err("sdcardfs: remount flags 0x%x unsupported\n", *flags); + err = -EINVAL; + } + pr_info("Remount options were %s for vfsmnt %p.\n", options, mnt); + err = parse_options_remount(sb, options, *flags & ~MS_SILENT, mnt->data); + + + return err; +} + +static void *sdcardfs_clone_mnt_data(void *data) +{ + struct sdcardfs_vfsmount_options *opt = kmalloc(sizeof(struct sdcardfs_vfsmount_options), GFP_KERNEL); + struct sdcardfs_vfsmount_options *old = data; + + if (!opt) + return NULL; + opt->gid = old->gid; + opt->mask = old->mask; + return opt; +} + +static void sdcardfs_copy_mnt_data(void *data, void *newdata) +{ + struct sdcardfs_vfsmount_options *old = data; + struct sdcardfs_vfsmount_options *new = newdata; + + old->gid = new->gid; + old->mask = new->mask; +} + /* * Called by iput() when the inode reference count reached zero * and the inode is not hashed anywhere. Used to clear anything @@ -119,6 +183,7 @@ static void sdcardfs_evict_inode(struct inode *inode) struct inode *lower_inode; truncate_inode_pages(&inode->i_data, 0); + set_top(SDCARDFS_I(inode), NULL); clear_inode(inode); /* * Decrement a reference to a lower_inode, which was incremented @@ -132,6 +197,7 @@ static void sdcardfs_evict_inode(struct inode *inode) static struct inode *sdcardfs_alloc_inode(struct super_block *sb) { struct sdcardfs_inode_info *i; + struct sdcardfs_inode_data *d; i = kmem_cache_alloc(sdcardfs_inode_cachep, GFP_KERNEL); if (!i) @@ -140,15 +206,33 @@ static struct inode *sdcardfs_alloc_inode(struct super_block *sb) /* memset everything up to the inode to 0 */ memset(i, 0, offsetof(struct sdcardfs_inode_info, vfs_inode)); + d = kmem_cache_alloc(sdcardfs_inode_data_cachep, + GFP_KERNEL | __GFP_ZERO); + if (!d) { + kmem_cache_free(sdcardfs_inode_cachep, i); + return NULL; + } + + i->data = d; + kref_init(&d->refcount); + i->vfs_inode.i_version = 1; return &i->vfs_inode; } -static void sdcardfs_destroy_inode(struct inode *inode) +static void i_callback(struct rcu_head *head) { + struct inode *inode = container_of(head, struct inode, i_rcu); + + release_own_data(SDCARDFS_I(inode)); kmem_cache_free(sdcardfs_inode_cachep, SDCARDFS_I(inode)); } +static void sdcardfs_destroy_inode(struct inode *inode) +{ + call_rcu(&inode->i_rcu, i_callback); +} + /* sdcardfs inode cache constructor */ static void init_once(void *obj) { @@ -159,22 +243,31 @@ static void init_once(void *obj) int sdcardfs_init_inode_cache(void) { - int err = 0; - sdcardfs_inode_cachep = kmem_cache_create("sdcardfs_inode_cache", sizeof(struct sdcardfs_inode_info), 0, SLAB_RECLAIM_ACCOUNT, init_once); + if (!sdcardfs_inode_cachep) - err = -ENOMEM; - return err; + return -ENOMEM; + + sdcardfs_inode_data_cachep = + kmem_cache_create("sdcardfs_inode_data_cache", + sizeof(struct sdcardfs_inode_data), 0, + SLAB_RECLAIM_ACCOUNT, NULL); + if (!sdcardfs_inode_data_cachep) { + kmem_cache_destroy(sdcardfs_inode_cachep); + return -ENOMEM; + } + + return 0; } /* sdcardfs inode cache destructor */ void sdcardfs_destroy_inode_cache(void) { - if (sdcardfs_inode_cachep) - kmem_cache_destroy(sdcardfs_inode_cachep); + kmem_cache_destroy(sdcardfs_inode_data_cachep); + kmem_cache_destroy(sdcardfs_inode_cachep); } /* @@ -190,19 +283,25 @@ static void sdcardfs_umount_begin(struct super_block *sb) lower_sb->s_op->umount_begin(lower_sb); } -static int sdcardfs_show_options(struct seq_file *m, struct dentry *root) +static int sdcardfs_show_options(struct vfsmount *mnt, struct seq_file *m, + struct dentry *root) { struct sdcardfs_sb_info *sbi = SDCARDFS_SB(root->d_sb); struct sdcardfs_mount_options *opts = &sbi->options; + struct sdcardfs_vfsmount_options *vfsopts = mnt->data; if (opts->fs_low_uid != 0) - seq_printf(m, ",uid=%u", opts->fs_low_uid); + seq_printf(m, ",fsuid=%u", opts->fs_low_uid); if (opts->fs_low_gid != 0) - seq_printf(m, ",gid=%u", opts->fs_low_gid); - + seq_printf(m, ",fsgid=%u", opts->fs_low_gid); + if (vfsopts->gid != 0) + seq_printf(m, ",gid=%u", vfsopts->gid); if (opts->multiuser) - seq_printf(m, ",multiuser"); - + seq_puts(m, ",multiuser"); + if (vfsopts->mask) + seq_printf(m, ",mask=%u", vfsopts->mask); + if (opts->fs_user_id) + seq_printf(m, ",userid=%u", opts->fs_user_id); if (opts->reserved_mb != 0) seq_printf(m, ",reserved=%uMB", opts->reserved_mb); @@ -213,9 +312,12 @@ const struct super_operations sdcardfs_sops = { .put_super = sdcardfs_put_super, .statfs = sdcardfs_statfs, .remount_fs = sdcardfs_remount_fs, + .remount_fs2 = sdcardfs_remount_fs2, + .clone_mnt_data = sdcardfs_clone_mnt_data, + .copy_mnt_data = sdcardfs_copy_mnt_data, .evict_inode = sdcardfs_evict_inode, .umount_begin = sdcardfs_umount_begin, - .show_options = sdcardfs_show_options, + .show_options2 = sdcardfs_show_options, .alloc_inode = sdcardfs_alloc_inode, .destroy_inode = sdcardfs_destroy_inode, .drop_inode = generic_delete_inode, diff --git a/fs/super.c b/fs/super.c index cdf6dec26549a..2693e90ab8762 100644 --- a/fs/super.c +++ b/fs/super.c @@ -682,7 +682,8 @@ struct super_block *user_get_super(dev_t dev) } /** - * do_remount_sb - asks filesystem to change mount options. + * do_remount_sb2 - asks filesystem to change mount options. + * @mnt: mount we are looking at * @sb: superblock in question * @flags: numeric part of options * @data: the rest of options @@ -690,7 +691,7 @@ struct super_block *user_get_super(dev_t dev) * * 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_sb2(struct vfsmount *mnt, struct super_block *sb, int flags, void *data, int force) { int retval; int remount_ro; @@ -732,7 +733,16 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) } } - if (sb->s_op->remount_fs) { + if (mnt && sb->s_op->remount_fs2) { + retval = sb->s_op->remount_fs2(mnt, sb, &flags, data); + if (retval) { + if (!force) + goto cancel_readonly; + /* If forced remount, go ahead despite any errors */ + WARN(1, "forced remount of a %s fs returned %i\n", + sb->s_type->name, retval); + } + } else if (sb->s_op->remount_fs) { retval = sb->s_op->remount_fs(sb, &flags, data); if (retval) { if (!force) @@ -764,6 +774,11 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) return retval; } +int do_remount_sb(struct super_block *sb, int flags, void *data, int force) +{ + return do_remount_sb2(NULL, sb, flags, data, force); +} + static void do_emergency_remount(struct work_struct *work) { struct super_block *sb, *p = NULL; @@ -1086,7 +1101,7 @@ struct dentry *mount_single(struct file_system_type *fs_type, EXPORT_SYMBOL(mount_single); struct dentry * -mount_fs(struct file_system_type *type, int flags, const char *name, void *data) +mount_fs(struct file_system_type *type, int flags, const char *name, struct vfsmount *mnt, void *data) { struct dentry *root; struct super_block *sb; @@ -1103,7 +1118,10 @@ mount_fs(struct file_system_type *type, int flags, const char *name, void *data) goto out_free_secdata; } - root = type->mount(type, flags, name, data); + if (type->mount2) + root = type->mount2(mnt, type, flags, name, data); + else + root = type->mount(type, flags, name, data); if (IS_ERR(root)) { error = PTR_ERR(root); goto out_free_secdata; diff --git a/fs/timerfd.c b/fs/timerfd.c index 86b32c3cb247f..31374ec8f9bd2 100644 --- a/fs/timerfd.c +++ b/fs/timerfd.c @@ -40,6 +40,7 @@ struct timerfd_ctx { short unsigned settime_flags; /* to show in fdinfo */ struct rcu_head rcu; struct list_head clist; + spinlock_t cancel_lock; bool might_cancel; }; @@ -113,7 +114,7 @@ void timerfd_clock_was_set(void) rcu_read_unlock(); } -static void timerfd_remove_cancel(struct timerfd_ctx *ctx) +static void __timerfd_remove_cancel(struct timerfd_ctx *ctx) { if (ctx->might_cancel) { ctx->might_cancel = false; @@ -123,6 +124,13 @@ static void timerfd_remove_cancel(struct timerfd_ctx *ctx) } } +static void timerfd_remove_cancel(struct timerfd_ctx *ctx) +{ + spin_lock(&ctx->cancel_lock); + __timerfd_remove_cancel(ctx); + spin_unlock(&ctx->cancel_lock); +} + static bool timerfd_canceled(struct timerfd_ctx *ctx) { if (!ctx->might_cancel || ctx->moffs.tv64 != KTIME_MAX) @@ -133,6 +141,7 @@ static bool timerfd_canceled(struct timerfd_ctx *ctx) static void timerfd_setup_cancel(struct timerfd_ctx *ctx, int flags) { + spin_lock(&ctx->cancel_lock); if ((ctx->clockid == CLOCK_REALTIME || ctx->clockid == CLOCK_REALTIME_ALARM || ctx->clockid == CLOCK_POWEROFF_ALARM) && @@ -143,9 +152,10 @@ static void timerfd_setup_cancel(struct timerfd_ctx *ctx, int flags) list_add_rcu(&ctx->clist, &cancel_list); spin_unlock(&cancel_lock); } - } else if (ctx->might_cancel) { - timerfd_remove_cancel(ctx); + } else { + __timerfd_remove_cancel(ctx); } + spin_unlock(&ctx->cancel_lock); } static ktime_t timerfd_get_remaining(struct timerfd_ctx *ctx) @@ -397,6 +407,7 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags) return -ENOMEM; init_waitqueue_head(&ctx->wqh); + spin_lock_init(&ctx->cancel_lock); ctx->clockid = clockid; if (isalarm(ctx)) { diff --git a/fs/utimes.c b/fs/utimes.c index aa138d64560a6..dfb457546c604 100644 --- a/fs/utimes.c +++ b/fs/utimes.c @@ -97,14 +97,14 @@ static int utimes_common(struct path *path, struct timespec *times) goto mnt_drop_write_and_out; if (!inode_owner_or_capable(inode)) { - error = inode_permission(inode, MAY_WRITE); + error = inode_permission2(path->mnt, inode, MAY_WRITE); if (error) goto mnt_drop_write_and_out; } } retry_deleg: mutex_lock(&inode->i_mutex); - error = notify_change(path->dentry, &newattrs, &delegated_inode); + error = notify_change2(path->mnt, path->dentry, &newattrs, &delegated_inode); mutex_unlock(&inode->i_mutex); if (delegated_inode) { error = break_deleg_wait(&delegated_inode); diff --git a/fs/xfs/xfs_acl.c b/fs/xfs/xfs_acl.c index a65fa5dde6e9c..c5bda4bf69c70 100644 --- a/fs/xfs/xfs_acl.c +++ b/fs/xfs/xfs_acl.c @@ -286,16 +286,13 @@ xfs_set_acl(struct inode *inode, struct posix_acl *acl, int type) return error; if (type == ACL_TYPE_ACCESS) { - umode_t mode = inode->i_mode; - error = posix_acl_equiv_mode(acl, &mode); - - if (error <= 0) { - acl = NULL; - - if (error < 0) - return error; - } - + umode_t mode; + struct posix_acl *old_acl = acl; + error = posix_acl_update_mode(inode, &mode, &acl); + if (!acl) + posix_acl_release(old_acl); + if (error) + return error; error = xfs_set_mode(inode, mode); if (error) return error; diff --git a/include/clocksource/arm_arch_timer.h b/include/clocksource/arm_arch_timer.h index 49766d24aef28..e14f77b7a0aa9 100644 --- a/include/clocksource/arm_arch_timer.h +++ b/include/clocksource/arm_arch_timer.h @@ -16,7 +16,7 @@ #ifndef __CLKSOURCE_ARM_ARCH_TIMER_H #define __CLKSOURCE_ARM_ARCH_TIMER_H -#include +#include #include #define ARCH_TIMER_CTRL_ENABLE (1 << 0) diff --git a/include/dt-bindings/clock/msm-clocks-8952.h b/include/dt-bindings/clock/msm-clocks-8952.h index 6e2fe580a14fa..fc88dac5bc4c8 100644 --- a/include/dt-bindings/clock/msm-clocks-8952.h +++ b/include/dt-bindings/clock/msm-clocks-8952.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, 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 @@ -261,6 +261,7 @@ #define clk_snoc_clk 0x2c341aa0 #define clk_snoc_a_clk 0x8fcef2af #define clk_snoc_usb_a_clk 0x34b7821b +#define clk_snoc_wcnss_a_clk 0xd3949ebc #define clk_snoc_usb_clk 0x29f9d73d #define clk_snoc_msmbus_clk 0xe6900bb6 #define clk_snoc_msmbus_a_clk 0x5d4683bd @@ -276,6 +277,7 @@ #define clk_bimc_msmbus_clk 0xd212feea #define clk_bimc_msmbus_a_clk 0x71d1a499 #define clk_bimc_usb_a_clk 0xea410834 +#define clk_bimc_wcnss_a_clk 0x5a6df715 #define clk_bimc_usb_clk 0x9bd2b2bf #define clk_bimc_gpu_clk 0xd3e0a327 #define clk_bimc_gpu_a_clk 0x67f0e9a5 diff --git a/include/dt-bindings/clock/msm-clocks-8953.h b/include/dt-bindings/clock/msm-clocks-8953.h index bb624ba084ffc..ac7136cf66b33 100644 --- a/include/dt-bindings/clock/msm-clocks-8953.h +++ b/include/dt-bindings/clock/msm-clocks-8953.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -52,6 +52,7 @@ #define clk_bimc_msmbus_a_clk 0x71d1a499 #define clk_bimc_usb_clk 0x9bd2b2bf #define clk_bimc_usb_a_clk 0xea410834 +#define clk_bimc_wcnss_a_clk 0x5a6df715 #define clk_pcnoc_keepalive_a_clk 0x9464f720 #define clk_pcnoc_msmbus_clk 0x2b53b688 #define clk_pcnoc_msmbus_a_clk 0x9753a54f @@ -61,6 +62,7 @@ #define clk_snoc_msmbus_a_clk 0x5d4683bd #define clk_snoc_usb_clk 0x29f9d73d #define clk_snoc_usb_a_clk 0x34b7821b +#define clk_snoc_wcnss_a_clk 0xd3949ebc #define clk_sysmmnoc_msmbus_a_clk 0x50600f1b #define clk_sysmmnoc_msmbus_clk 0xd61e5721 #define clk_xo_dwc3_clk 0xfad488ce diff --git a/include/dt-bindings/input/input.h b/include/dt-bindings/input/input.h index 042e7b3b62963..885a2688d5fb8 100644 --- a/include/dt-bindings/input/input.h +++ b/include/dt-bindings/input/input.h @@ -269,6 +269,8 @@ #define KEY_MICMUTE 248 /* Mute / unmute the microphone */ +#define KEY_ANTENNA_DET 252 +#define KEY_ANTENNA_DET_UP 253 /* Code 255 is reserved for special needs of AT keyboard driver */ #define BTN_MISC 0x100 diff --git a/include/dt-bindings/msm/msm-bus-rule-ops.h b/include/dt-bindings/msm/msm-bus-rule-ops.h index 3dcbebd4418b2..895e6d709a676 100644 --- a/include/dt-bindings/msm/msm-bus-rule-ops.h +++ b/include/dt-bindings/msm/msm-bus-rule-ops.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, 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 @@ -21,7 +21,9 @@ #define OP_LT 1 #define OP_GE 2 #define OP_GT 3 -#define OP_NOOP 4 +#define OP_NOOP 4 +#define OP_AND 5 +#define OP_OR 6 #define RULE_STATE_NOT_APPLIED 0 #define RULE_STATE_APPLIED 1 diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h index d144e99d2399f..2abe24777b460 100644 --- a/include/linux/clocksource.h +++ b/include/linux/clocksource.h @@ -18,8 +18,6 @@ #include #include -/* clocksource cycle base type */ -typedef u64 cycle_t; struct clocksource; struct module; @@ -27,106 +25,6 @@ struct module; #include #endif -/** - * struct cyclecounter - hardware abstraction for a free running counter - * Provides completely state-free accessors to the underlying hardware. - * Depending on which hardware it reads, the cycle counter may wrap - * around quickly. Locking rules (if necessary) have to be defined - * by the implementor and user of specific instances of this API. - * - * @read: returns the current cycle value - * @mask: bitmask for two's complement - * subtraction of non 64 bit counters, - * see CLOCKSOURCE_MASK() helper macro - * @mult: cycle to nanosecond multiplier - * @shift: cycle to nanosecond divisor (power of two) - */ -struct cyclecounter { - cycle_t (*read)(const struct cyclecounter *cc); - cycle_t mask; - u32 mult; - u32 shift; -}; - -/** - * struct timecounter - layer above a %struct cyclecounter which counts nanoseconds - * Contains the state needed by timecounter_read() to detect - * cycle counter wrap around. Initialize with - * timecounter_init(). Also used to convert cycle counts into the - * corresponding nanosecond counts with timecounter_cyc2time(). Users - * of this code are responsible for initializing the underlying - * cycle counter hardware, locking issues and reading the time - * more often than the cycle counter wraps around. The nanosecond - * counter will only wrap around after ~585 years. - * - * @cc: the cycle counter used by this instance - * @cycle_last: most recent cycle counter value seen by - * timecounter_read() - * @nsec: continuously increasing count - */ -struct timecounter { - const struct cyclecounter *cc; - cycle_t cycle_last; - u64 nsec; -}; - -/** - * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds - * @cc: Pointer to cycle counter. - * @cycles: Cycles - * - * XXX - This could use some mult_lxl_ll() asm optimization. Same code - * as in cyc2ns, but with unsigned result. - */ -static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc, - cycle_t cycles) -{ - u64 ret = (u64)cycles; - ret = (ret * cc->mult) >> cc->shift; - return ret; -} - -/** - * timecounter_init - initialize a time counter - * @tc: Pointer to time counter which is to be initialized/reset - * @cc: A cycle counter, ready to be used. - * @start_tstamp: Arbitrary initial time stamp. - * - * After this call the current cycle register (roughly) corresponds to - * the initial time stamp. Every call to timecounter_read() increments - * the time stamp counter by the number of elapsed nanoseconds. - */ -extern void timecounter_init(struct timecounter *tc, - const struct cyclecounter *cc, - u64 start_tstamp); - -/** - * timecounter_read - return nanoseconds elapsed since timecounter_init() - * plus the initial time stamp - * @tc: Pointer to time counter. - * - * In other words, keeps track of time since the same epoch as - * the function which generated the initial time stamp. - */ -extern u64 timecounter_read(struct timecounter *tc); - -/** - * timecounter_cyc2time - convert a cycle counter to same - * time base as values returned by - * timecounter_read() - * @tc: Pointer to time counter. - * @cycle_tstamp: a value returned by tc->cc->read() - * - * Cycle counts that are converted correctly as long as they - * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], - * with "max cycle count" == cs->mask+1. - * - * This allows conversion of cycle counter values which were generated - * in the past. - */ -extern u64 timecounter_cyc2time(struct timecounter *tc, - cycle_t cycle_tstamp); - /** * struct clocksource - hardware abstraction for a free running counter * Provides mostly state-free accessors to the underlying hardware. diff --git a/include/linux/dcache.h b/include/linux/dcache.h index f29c340bf6296..5d567e32d8b69 100644 --- a/include/linux/dcache.h +++ b/include/linux/dcache.h @@ -160,8 +160,8 @@ struct dentry_operations { char *(*d_dname)(struct dentry *, char *, int); struct vfsmount *(*d_automount)(struct path *); int (*d_manage)(struct dentry *, bool); + void (*d_canonical_path)(const struct path *, struct path *); struct inode *(*d_select_inode)(struct dentry *, unsigned); - void (*d_canonical_path)(const struct dentry *, struct path *); } ____cacheline_aligned; /* @@ -280,7 +280,7 @@ extern void d_rehash(struct dentry *); * This adds the entry to the hash queues and initializes @inode. * The entry was actually filled in earlier during d_alloc(). */ - + static inline void d_add(struct dentry *entry, struct inode *inode) { d_instantiate(entry, inode); @@ -345,7 +345,7 @@ extern char *dentry_path(struct dentry *, char *, int); * @dentry: dentry to get a reference to * * Given a dentry or %NULL pointer increment the reference count - * if appropriate and return the dentry. A dentry will not be + * if appropriate and return the dentry. A dentry will not be * destroyed when it has references. */ static inline struct dentry *dget_dlock(struct dentry *dentry) @@ -370,7 +370,7 @@ extern struct dentry *dget_parent(struct dentry *dentry); * * Returns true if the dentry passed is not currently hashed. */ - + static inline int d_unhashed(const struct dentry *dentry) { return hlist_bl_unhashed(&dentry->d_hash); diff --git a/include/linux/delay.h b/include/linux/delay.h index a6ecb34cf547d..0e303d1aacd8b 100644 --- a/include/linux/delay.h +++ b/include/linux/delay.h @@ -47,6 +47,11 @@ void msleep(unsigned int msecs); unsigned long msleep_interruptible(unsigned int msecs); void usleep_range(unsigned long min, unsigned long max); +static inline void usleep(unsigned long usecs) +{ + usleep_range(usecs, usecs); +} + static inline void ssleep(unsigned int seconds) { msleep(seconds * 1000); diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h index 860313a33a438..2df22eab98e3f 100644 --- a/include/linux/f2fs_fs.h +++ b/include/linux/f2fs_fs.h @@ -268,6 +268,12 @@ struct f2fs_nat_block { #define SIT_VBLOCK_MAP_SIZE 64 #define SIT_ENTRY_PER_BLOCK (PAGE_CACHE_SIZE / sizeof(struct f2fs_sit_entry)) +/* + * F2FS uses 4 bytes to represent block address. As a result, supported size of + * disk is 16 TB and it equals to 16 * 1024 * 1024 / 2 segments. + */ +#define F2FS_MAX_SEGMENT ((16 * 1024 * 1024) / 2) + /* * Note that f2fs_sit_entry->vblocks has the following bit-field information. * [15:10] : allocation type such as CURSEG_XXXX_TYPE diff --git a/include/linux/fb.h b/include/linux/fb.h index 3cde50f14de03..3770513765fc0 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -503,6 +503,7 @@ struct fb_info { } *apertures; bool skip_vt_switch; /* no VT switch on suspend/resume required */ + int blank; }; static inline struct apertures_struct *alloc_apertures(unsigned int max_num) { diff --git a/include/linux/filter.h b/include/linux/filter.h index c80b1a9d07152..954f6dfdd0a5c 100644 --- a/include/linux/filter.h +++ b/include/linux/filter.h @@ -358,7 +358,11 @@ static inline void bpf_prog_unlock_ro(struct bpf_prog *fp) } #endif /* CONFIG_DEBUG_SET_MODULE_RONX */ -int sk_filter(struct sock *sk, struct sk_buff *skb); +int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap); +static inline int sk_filter(struct sock *sk, struct sk_buff *skb) +{ + return sk_filter_trim_cap(sk, skb, 1); +} void bpf_prog_select_runtime(struct bpf_prog *fp); void bpf_prog_free(struct bpf_prog *fp); diff --git a/include/linux/fs.h b/include/linux/fs.h index 835dabb5a9dfe..a942e614dfaed 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -1422,13 +1422,21 @@ extern bool inode_owner_or_capable(const struct inode *inode); * VFS helper functions.. */ extern int vfs_create(struct inode *, struct dentry *, umode_t, bool); +extern int vfs_create2(struct vfsmount *, struct inode *, struct dentry *, umode_t, bool); extern int vfs_mkdir(struct inode *, struct dentry *, umode_t); +extern int vfs_mkdir2(struct vfsmount *, struct inode *, struct dentry *, umode_t); extern int vfs_mknod(struct inode *, struct dentry *, umode_t, dev_t); +extern int vfs_mknod2(struct vfsmount *, struct inode *, struct dentry *, umode_t, dev_t); extern int vfs_symlink(struct inode *, struct dentry *, const char *); +extern int vfs_symlink2(struct vfsmount *, struct inode *, struct dentry *, const char *); extern int vfs_link(struct dentry *, struct inode *, struct dentry *, struct inode **); +extern int vfs_link2(struct vfsmount *, struct dentry *, struct inode *, struct dentry *, struct inode **); extern int vfs_rmdir(struct inode *, struct dentry *); +extern int vfs_rmdir2(struct vfsmount *, struct inode *, struct dentry *); extern int vfs_unlink(struct inode *, struct dentry *, struct inode **); +extern int vfs_unlink2(struct vfsmount *, struct inode *, struct dentry *, struct inode **); extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int); +extern int vfs_rename2(struct vfsmount *, struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int); extern int vfs_whiteout(struct inode *, struct dentry *); /* @@ -1530,6 +1538,7 @@ struct inode_operations { struct dentry * (*lookup) (struct inode *,struct dentry *, unsigned int); void * (*follow_link) (struct dentry *, struct nameidata *); int (*permission) (struct inode *, int); + int (*permission2) (struct vfsmount *, struct inode *, int); struct posix_acl * (*get_acl)(struct inode *, int); int (*readlink) (struct dentry *, char __user *,int); @@ -1547,6 +1556,7 @@ struct inode_operations { int (*rename2) (struct inode *, struct dentry *, struct inode *, struct dentry *, unsigned int); int (*setattr) (struct dentry *, struct iattr *); + int (*setattr2) (struct vfsmount *, struct dentry *, struct iattr *); int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *); int (*setxattr) (struct dentry *, const char *,const void *,size_t,int); ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t); @@ -1590,9 +1600,13 @@ struct super_operations { int (*unfreeze_fs) (struct super_block *); int (*statfs) (struct dentry *, struct kstatfs *); int (*remount_fs) (struct super_block *, int *, char *); + int (*remount_fs2) (struct vfsmount *, struct super_block *, int *, char *); + void *(*clone_mnt_data) (void *); + void (*copy_mnt_data) (void *, void *); void (*umount_begin) (struct super_block *); int (*show_options)(struct seq_file *, struct dentry *); + int (*show_options2)(struct vfsmount *, struct seq_file *, struct dentry *); int (*show_devname)(struct seq_file *, struct dentry *); int (*show_path)(struct seq_file *, struct dentry *); int (*show_stats)(struct seq_file *, struct dentry *); @@ -1795,7 +1809,7 @@ int sync_inode_metadata(struct inode *inode, int wait); struct file_system_type { const char *name; int fs_flags; -#define FS_REQUIRES_DEV 1 +#define FS_REQUIRES_DEV 1 #define FS_BINARY_MOUNTDATA 2 #define FS_HAS_SUBTYPE 4 #define FS_USERNS_MOUNT 8 /* Can be mounted by userns root */ @@ -1804,6 +1818,9 @@ struct file_system_type { #define FS_RENAME_DOES_D_MOVE 32768 /* FS will handle d_move() during rename() internally. */ struct dentry *(*mount) (struct file_system_type *, int, const char *, void *); + struct dentry *(*mount2) (struct vfsmount *, struct file_system_type *, int, + const char *, void *); + void *(*alloc_mnt_data) (void); void (*kill_sb) (struct super_block *); struct module *owner; struct file_system_type * next; @@ -2071,6 +2088,8 @@ struct filename { extern long vfs_truncate(struct path *, loff_t); extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs, struct file *filp); +extern int do_truncate2(struct vfsmount *, struct dentry *, loff_t start, + unsigned int time_attrs, struct file *filp); extern int do_fallocate(struct file *file, int mode, loff_t offset, loff_t len); extern long do_sys_open(int dfd, const char __user *filename, int flags, @@ -2291,8 +2310,11 @@ extern void emergency_remount(void); extern sector_t bmap(struct inode *, sector_t); #endif extern int notify_change(struct dentry *, struct iattr *, struct inode **); +extern int notify_change2(struct vfsmount *, struct dentry *, struct iattr *, struct inode **); extern int inode_permission(struct inode *, int); +extern int inode_permission2(struct vfsmount *, struct inode *, int); extern int __inode_permission(struct inode *, int); +extern int __inode_permission2(struct vfsmount *, struct inode *, int); extern int generic_permission(struct inode *, int); extern int __check_sticky(struct inode *dir, struct inode *inode); diff --git a/include/linux/hardware_info.h b/include/linux/hardware_info.h new file mode 100755 index 0000000000000..4813d4defbada --- /dev/null +++ b/include/linux/hardware_info.h @@ -0,0 +1,54 @@ +#ifndef __HARDWARE_H__ +#define __HARDWARE_H__ + +#define HARDWARE_MAX_ITEM_LONGTH 64 + +enum{ + HARDWARE_LCD = 0, + HARDWARE_TP, + HARDWARE_FLASH, + HARDWARE_FRONT_CAM, + HARDWARE_BACK_CAM, + HARDWARE_BT, + HARDWARE_WIFI, + HARDWARE_ACCELEROMETER, + HARDWARE_ALSPS, + HARDWARE_GYROSCOPE, + HARDWARE_MAGNETOMETER, + HARDWARE_GPS, + HARDWARE_FM, + HARDWARE_BATTERY_ID, + HARDWARE_BACK_CAM_MOUDULE_ID, + HARDWARE_FRONT_CAM_MOUDULE_ID, + HARDWARE_BOARD_ID, + HARDWARE_MAX_ITEM +}; + + +#define HARDWARE_ID 'H' +#define HARDWARE_LCD_GET _IOWR(HARDWARE_ID, 0x01, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_TP_GET _IOWR(HARDWARE_ID, 0x02, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_FLASH_GET _IOWR(HARDWARE_ID, 0x03, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_FRONT_CAM_GET _IOWR(HARDWARE_ID, 0x04, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BACK_CAM_GET _IOWR(HARDWARE_ID, 0x05, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_ACCELEROMETER_GET _IOWR(HARDWARE_ID, 0x06, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_ALSPS_GET _IOWR(HARDWARE_ID, 0x07, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_GYROSCOPE_GET _IOWR(HARDWARE_ID, 0x08, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_MAGNETOMETER_GET _IOWR(HARDWARE_ID, 0x09, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BT_GET _IOWR(HARDWARE_ID, 0x10, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_WIFI_GET _IOWR(HARDWARE_ID, 0x11, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_GPS_GET _IOWR(HARDWARE_ID, 0x12, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_FM_GET _IOWR(HARDWARE_ID, 0x13, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BATTERY_ID_GET _IOWR(HARDWARE_ID, 0x15, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BACK_CAM_MOUDULE_ID_GET _IOWR(HARDWARE_ID, 0x16, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_FRONT_CAM_MODULE_ID_GET _IOWR(HARDWARE_ID, 0x17, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BOARD_ID_GET _IOWR(HARDWARE_ID, 0x18, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_BACK_CAM_MOUDULE_ID_SET _IOWR(HARDWARE_ID, 0x81, char[HARDWARE_MAX_ITEM_LONGTH]) +#define HARDWARE_FRONT_CAM_MODULE_ID_SET _IOWR(HARDWARE_ID, 0x82, char[HARDWARE_MAX_ITEM_LONGTH]) + + + + +int hardwareinfo_set_prop(int cmd, const char *name); +void hardwareinfo_tp_register(void (*fn)(void *), void *driver_data); +#endif diff --git a/include/linux/input/ft5346.h b/include/linux/input/ft5346.h new file mode 100644 index 0000000000000..d9f223c0dbf51 --- /dev/null +++ b/include/linux/input/ft5346.h @@ -0,0 +1,348 @@ +/* + * + * FocalTech ft5x06 TouchScreen driver header file. + * + * Copyright (c) 2010 Focal tech Ltd. + * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ +#ifndef __LINUX_FT5X06_TS_H__ +#define __LINUX_FT5X06_TS_H__ + +#define FT5X06_ID 0x55 +#define FT5X16_ID 0x0A +#define FT5X36_ID 0x14 +#define FT6X06_ID 0x06 +#define FT6X36_ID 0x36 + +#define FT_DRIVER_VERSION 0x02 + +#define FT_META_REGS 3 +#define FT_ONE_TCH_LEN 6 +#define FT_TCH_LEN(x) (FT_META_REGS + FT_ONE_TCH_LEN * x) + +#define FT_PRESS 0x7F +#define FT_MAX_ID 0x0F +#define FT_TOUCH_X_H_POS 3 +#define FT_TOUCH_X_L_POS 4 +#define FT_TOUCH_Y_H_POS 5 +#define FT_TOUCH_Y_L_POS 6 +#define FT_TD_STATUS 2 +#define FT_TOUCH_EVENT_POS 3 +#define FT_TOUCH_ID_POS 5 +#define FT_TOUCH_DOWN 0 +#define FT_TOUCH_CONTACT 2 +#define FT_LOCKDOWN_SIZE 8 + + +/*register address*/ +#define FT_REG_DEV_MODE 0x00 +#define FT_DEV_MODE_REG_CAL 0x02 +#define FT_REG_ID 0xA3 +#define FT_REG_PMODE 0xA5 +#define FT_REG_FW_VER 0xA6 +#define FT_REG_FW_VENDOR_ID 0xA8 +#define FT_REG_POINT_RATE 0x88 +#define FT_REG_THGROUP 0x80 +#define FT_REG_ECC 0xCC +#define FT_REG_RESET_FW 0x07 +#define FT_REG_FW_MIN_VER 0xB2 +#define FT_REG_FW_SUB_MIN_VER 0xB3 + +/*Firmware vendors*/ +#define VENDOR_O_FILM 0x51 +#define VENDOR_Lens 0x3B +#define VENDOR_DS 0x53 + +/*IC name*/ + +#define TP_IC_FT5X06 0x55 +#define TP_IC_FT5606 0x08 +#define TP_IC_FT5X16 0x0A +#define TP_IC_FT6208 0x05 +#define TP_IC_FT6X06 0x06 +#define TP_IC_FT6X36 0x36 +#define TP_IC_FT5336 0x14 +#define TP_IC_FT3316 0x13 +#define TP_IC_FT5436i 0x12 +#define TP_IC_FT5336i 0x11 +#define TP_IC_FT5346 0x54 + + +/*TP Color*/ +#define TP_White 0x31 +#define TP_Black 0x32 +#define TP_Golden 0x38 + +/*TP Maker*/ +#define TP_OUFEI 0x34 +#define TP_LENS 0x32 +#define TP_DS 0x45 + +/*LCD Maker*/ +#define TP_TIANMA 0x36 + +#define TP_EBBG 0x37 + +/*PROJECT Id*/ +#define PROJECT_C3B 0x0c +#define PROJECT_C3N 0xc3 + +/* power register bits*/ +#define FT_PMODE_ACTIVE 0x00 +#define FT_PMODE_MONITOR 0x01 +#define FT_PMODE_STANDBY 0x02 +#define FT_PMODE_HIBERNATE 0x03 +#define FT_FACTORYMODE_VALUE 0x40 +#define FT_WORKMODE_VALUE 0x00 +#define FT_RST_CMD_REG1 0xFC +#define FT_RST_CMD_REG2 0xBC +#define FT_READ_ID_REG 0x90 +#define FT_ERASE_APP_REG 0x61 +#define FT_ERASE_PANEL_REG 0x63 +#define FT_FW_START_REG 0xBF + +#define FT_STATUS_NUM_TP_MASK 0x0F + +#define FT_VTG_MIN_UV 2600000 +#define FT_VTG_MAX_UV 3300000 +#define FT_I2C_VTG_MIN_UV 1800000 +#define FT_I2C_VTG_MAX_UV 1800000 + +#define FT_COORDS_ARR_SIZE 4 +#define MAX_BUTTONS 4 + +#define FT_8BIT_SHIFT 8 +#define FT_4BIT_SHIFT 4 +#define FT_FW_NAME_MAX_LEN 50 + +#define FT5316_ID 0x0A +#define FT5306I_ID 0x55 +#define FT6X06_ID 0x06 +#define FT6X36_ID 0x36 + +#define FT_UPGRADE_AA 0xAA +#define FT_UPGRADE_55 0x55 + +#define FT_FW_MIN_SIZE 8 +#define FT_FW_MAX_SIZE 32768 + +#define FT5x0x_REG_FW_VER 0xA6 + + +/* Firmware file is not supporting minor and sub minor so use 0 */ +#define FT_FW_FILE_MAJ_VER(x) ((x)->data[(x)->size - 2]) +#define FT_FW_FILE_MIN_VER(x) 0 +#define FT_FW_FILE_SUB_MIN_VER(x) 0 +#define FT_FW_FILE_VENDOR_ID(x) ((x)->data[(x)->size - 1]) + +#define FT_FW_FILE_MAJ_VER_FT6X36(x) ((x)->data[0x10a]) +#define FT_FW_FILE_VENDOR_ID_FT6X36(x) ((x)->data[0x108]) + +/** +* Application data verification will be run before upgrade flow. +* Firmware image stores some flags with negative and positive value +* in corresponding addresses, we need pick them out do some check to +* make sure the application data is valid. +*/ +#define FT_FW_CHECK(x, ts_data) \ + (ts_data->family_id == FT6X36_ID ? \ + (((x)->data[0x104] ^ (x)->data[0x105]) == 0xFF \ + && ((x)->data[0x106] ^ (x)->data[0x107]) == 0xFF) : \ + (((x)->data[(x)->size - 8] ^ (x)->data[(x)->size - 6]) == 0xFF \ + && ((x)->data[(x)->size - 7] ^ (x)->data[(x)->size - 5]) == 0xFF \ + && ((x)->data[(x)->size - 3] ^ (x)->data[(x)->size - 4]) == 0xFF)) + +#define FT_MAX_TRIES 5 +#define FT_RETRY_DLY 20 + +#define FT_MAX_WR_BUF 10 +#define FT_MAX_RD_BUF 2 +#define FT_FW_PKT_LEN 128 +#define FT_FW_PKT_META_LEN 6 +#define FT_FW_PKT_DLY_MS 20 +#define FT_FW_LAST_PKT 0x6ffa +#define FT_EARSE_DLY_MS 100 +#define FT_55_AA_DLY_NS 5000 + +#define FT_UPGRADE_LOOP 30 +#define FT_CAL_START 0x04 +#define FT_CAL_FIN 0x00 +#define FT_CAL_STORE 0x05 +#define FT_CAL_RETRY 100 +#define FT_REG_CAL 0x00 +#define FT_CAL_MASK 0x7C + +#define FT_INFO_MAX_LEN 512 +#define FTS_PACKET_LENGTH 128 + + +#define FT_BLOADER_SIZE_OFF 12 +#define FT_BLOADER_NEW_SIZE 30 +#define FT_DATA_LEN_OFF_OLD_FW 8 +#define FT_DATA_LEN_OFF_NEW_FW 14 +#define FT_FINISHING_PKT_LEN_OLD_FW 6 +#define FT_FINISHING_PKT_LEN_NEW_FW 12 +#define FT_MAGIC_BLOADER_Z7 0x7bfa +#define FT_MAGIC_BLOADER_LZ4 0x6ffa +#define FT_MAGIC_BLOADER_GZF_30 0x7ff4 +#define FT_MAGIC_BLOADER_GZF 0x7bf4 + +enum { + FT_BLOADER_VERSION_LZ4 = 0, + FT_BLOADER_VERSION_Z7 = 1, + FT_BLOADER_VERSION_GZF = 2, +}; + +enum { + FT_FT5336_FAMILY_ID_0x11 = 0x11, + FT_FT5336_FAMILY_ID_0x12 = 0x12, + FT_FT5336_FAMILY_ID_0x13 = 0x13, + FT_FT5336_FAMILY_ID_0x14 = 0x14, +}; + +struct fw_upgrade_info { + bool auto_cal; + u16 delay_aa; + u16 delay_55; + u8 upgrade_id_1; + u8 upgrade_id_2; + u16 delay_readid; + u16 delay_erase_flash; +}; + +struct Upgrade_Info { + u8 CHIP_ID; + u8 FTS_NAME[20]; + u8 TPD_MAX_POINTS; + u8 AUTO_CLB; + u16 delay_aa; /*delay of write FT_UPGRADE_AA */ + u16 delay_55; /*delay of write FT_UPGRADE_55 */ + u8 upgrade_id_1; /*upgrade id 1 */ + u8 upgrade_id_2; /*upgrade id 2 */ + u16 delay_readid; /*delay of read id */ + u16 delay_earse_flash; /*delay of earse flash*/ +}; + + +struct ft5x06_ts_platform_data { + struct fw_upgrade_info info; + const char *name; + const char *fw_name; + u32 irqflags; + u32 irq_gpio; + u32 irq_gpio_flags; + u32 reset_gpio; + u32 reset_gpio_flags; + u32 family_id; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; + u32 panel_minx; + u32 panel_miny; + u32 panel_maxx; + u32 panel_maxy; + u32 group_id; + u32 hard_rst_dly; + u32 soft_rst_dly; + u32 num_max_touches; + bool fw_vkey_support; + bool no_force_update; + bool i2c_pull_up; + bool ignore_id_check; + int (*power_init) (bool); + int (*power_on) (bool); +}; + +struct ft5x06_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + const struct ft5x06_ts_platform_data *pdata; + struct regulator *vdd; + struct regulator *vcc_i2c; + char fw_name[FT_FW_NAME_MAX_LEN]; + u8 lockdown_info[FT_LOCKDOWN_SIZE]; + bool loading_fw; + u8 family_id; + struct dentry *dir; + u16 addr; + bool suspended; + char *ts_info; + u8 *tch_data; + u32 tch_data_len; + u8 fw_ver[3]; + u8 fw_vendor_id; +#if defined(CONFIG_FB) + struct notifier_block fb_notif; + struct work_struct fb_notify_work; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + struct pinctrl *ts_pinctrl; + struct pinctrl_state *gpio_state_active; + struct pinctrl_state *gpio_state_suspend; +}; + + + +#define CTP_IC_TYPE_0 0x12 +#define CTP_IC_TYPE_1 0x14 +#define CTP_IC_TYPE_2 0x54 + +#define CTP_SYS_APK_UPDATE 0 + +#define TPD_AUTO_UPGRADE 1 +#define FTS_PROC_APK_DEBUG 1 + +#define CTP_CHARGER_DETECT 1 + +#define CTP_PROC_INTERFACE 1 + + + +#if CTP_PROC_INTERFACE +extern int fts_open_short_test(char *ini_file_name, char *bufdest, ssize_t *pinumread); +#endif +#define WT_ADD_CTP_INFO 1 +#define WT_CTP_GESTURE_SUPPORT 1 +#define KEYCODE_WAKEUP 143 +#define MXT_INPUT_EVENT_START 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_OFF 0 +#define MXT_INPUT_EVENT_SENSITIVE_MODE_ON 1 +#define MXT_INPUT_EVENT_STYLUS_MODE_OFF 2 +#define MXT_INPUT_EVENT_STYLUS_MODE_ON 3 +#define MXT_INPUT_EVENT_WAKUP_MODE_OFF 4 +#define MXT_INPUT_EVENT_WAKUP_MODE_ON 5 +#define MXT_INPUT_EVENT_EDGE_DISABLE 6 +#define MXT_INPUT_EVENT_EDGE_FINGER 7 +#define MXT_INPUT_EVENT_EDGE_HANDGRIP 8 +#define MXT_INPUT_EVENT_EDGE_FINGER_HANDGRIP 9 +#define MXT_INPUT_EVENT_END 9 +#define CTP_DEBUG_ON 0 +#define CTP_DEBUG_FUNC_ON 1 +#define CTP_INFO(fmt, arg...) printk("FT5X06-TP-TAG INFO:"fmt"\n", ##arg) + +#define CTP_ERROR(fmt, arg...) printk("FT5X06-TP-TAG ERROR:"fmt"\n", ##arg) + +#define CTP_DEBUG(fmt, arg...) do {\ + if (CTP_DEBUG_ON)\ + printk("FT5X06-TP-TAG DEBUG:[%d]"fmt"\n", __LINE__, ##arg);\ + } while (0) +#define CTP_DEBUG_FUNC() do {\ + if (CTP_DEBUG_FUNC_ON)\ + printk("FT5X06-TP-TAG Func:%s@Line:%d\n", __func__, __LINE__);\ + } while (0) + + +#endif diff --git a/include/linux/input/ft5x06_720p.h b/include/linux/input/ft5x06_720p.h new file mode 100644 index 0000000000000..7e9db84de7f53 --- /dev/null +++ b/include/linux/input/ft5x06_720p.h @@ -0,0 +1,334 @@ +/* + * + * FocalTech ft5x06 TouchScreen driver header file. + * + * Copyright (c) 2010 Focal tech Ltd. + * Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. + * + * 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. + * + */ +#ifndef __LINUX_FT5X06_TS_H__ +#define __LINUX_FT5X06_TS_H__ + +#define FT5X06_ID 0x55 +#define FT5X16_ID 0x0A +#define FT5X36_ID 0x14 +#define FT6X06_ID 0x06 +#define FT6X36_ID 0x36 + +#define FT_DRIVER_VERSION 0x02 + +#define FT_META_REGS 3 +#define FT_ONE_TCH_LEN 6 +#define FT_TCH_LEN(x) (FT_META_REGS + FT_ONE_TCH_LEN * x) + +#define FT_PRESS 0x7F +#define FT_MAX_ID 0x0F +#define FT_TOUCH_X_H_POS 3 +#define FT_TOUCH_X_L_POS 4 +#define FT_TOUCH_Y_H_POS 5 +#define FT_TOUCH_Y_L_POS 6 +#define FT_TD_STATUS 2 +#define FT_TOUCH_EVENT_POS 3 +#define FT_TOUCH_ID_POS 5 +#define FT_TOUCH_DOWN 0 +#define FT_TOUCH_CONTACT 2 +#define FT_LOCKDOWN_SIZE 8 + + +/*register address*/ +#define FT_REG_DEV_MODE 0x00 +#define FT_DEV_MODE_REG_CAL 0x02 +#define FT_REG_ID 0xA3 +#define FT_REG_PMODE 0xA5 +#define FT_REG_FW_VER 0xA6 +#define FT_REG_FW_VENDOR_ID 0xA8 +#define FT_REG_POINT_RATE 0x88 +#define FT_REG_THGROUP 0x80 +#define FT_REG_ECC 0xCC +#define FT_REG_RESET_FW 0x07 +#define FT_REG_FW_MIN_VER 0xB2 +#define FT_REG_FW_SUB_MIN_VER 0xB3 + +/*Firmware vendors*/ +#define VENDOR_O_FILM 0x51 +#define VENDOR_MUTTO 0x53 +#define VENDOR_BIEL_1080P 0x3B +#define VENDOR_TPK_1080P 0x5C +#define VENDOR_BIEL_720P 0xF1 +#define VENDOR_TPK_720P 0xF2 +#define VENDOR_OUFEI_720P 0xF3 +#define VENDOR_LENS_720P 0xF4 + + +#define VENDOR_WINTEK 0x89 +#define VENDOR_GIS 0x8F + + +/*IC name*/ +#define IC_FT5X06 0x55 +#define IC_FT5606 0x08 +#define IC_FT5X16 0x0A +#define IC_FT6208 0x05 +#define IC_FT6X06 0x06 +#define IC_FT6X36 0x36 +#define IC_FT5336 0x14 +#define IC_FT3316 0x13 +#define IC_FT5436i 0x12 +#define IC_FT5336i 0x11 + +/*TP Color*/ +#define TP_White 0x31 +#define TP_Black 0x32 +#define TP_Golden 0x38 + +/*TP Maker*/ +#define TP_OUFEI 0x34 +#define TP_LENS 0x32 +#define TP_Biel 0x31 + +/*LCD Maker*/ +#define LCD_TIANMA 0x36 +#define LCD_EBBG 0x37 +#define LCD_BOE 0x35 + +/* power register bits*/ +#define FT_PMODE_ACTIVE 0x00 +#define FT_PMODE_MONITOR 0x01 +#define FT_PMODE_STANDBY 0x02 +#define FT_PMODE_HIBERNATE 0x03 +#define FT_FACTORYMODE_VALUE 0x40 +#define FT_WORKMODE_VALUE 0x00 +#define FT_RST_CMD_REG1 0xFC +#define FT_RST_CMD_REG2 0xBC +#define FT_READ_ID_REG 0x90 +#define FT_ERASE_APP_REG 0x61 +#define FT_ERASE_PANEL_REG 0x63 +#define FT_FW_START_REG 0xBF + +#define FT_STATUS_NUM_TP_MASK 0x0F + +#define FT_VTG_MIN_UV 2600000 +#define FT_VTG_MAX_UV 3300000 +#define FT_I2C_VTG_MIN_UV 1800000 +#define FT_I2C_VTG_MAX_UV 1800000 + +#define FT_COORDS_ARR_SIZE 4 +#define MAX_BUTTONS 4 + +#define FT_8BIT_SHIFT 8 +#define FT_4BIT_SHIFT 4 +#define FT_FW_NAME_MAX_LEN 50 + +#define FT5316_ID 0x0A +#define FT5306I_ID 0x55 +#define FT6X06_ID 0x06 +#define FT6X36_ID 0x36 + +#define FT_UPGRADE_AA 0xAA +#define FT_UPGRADE_55 0x55 + +#define FT_FW_MIN_SIZE 8 +#define FT_FW_MAX_SIZE 32768 + +#define FT5x0x_REG_FW_VER 0xA6 + + +/* Firmware file is not supporting minor and sub minor so use 0 */ +#define FT_FW_FILE_MAJ_VER(x) ((x)->data[(x)->size - 2]) +#define FT_FW_FILE_MIN_VER(x) 0 +#define FT_FW_FILE_SUB_MIN_VER(x) 0 +#define FT_FW_FILE_VENDOR_ID(x) ((x)->data[(x)->size - 1]) + +#define FT_FW_FILE_MAJ_VER_FT6X36(x) ((x)->data[0x10a]) +#define FT_FW_FILE_VENDOR_ID_FT6X36(x) ((x)->data[0x108]) + +/** +* Application data verification will be run before upgrade flow. +* Firmware image stores some flags with negative and positive value +* in corresponding addresses, we need pick them out do some check to +* make sure the application data is valid. +*/ +#define FT_FW_CHECK(x, ts_data) \ + (ts_data->family_id == FT6X36_ID ? \ + (((x)->data[0x104] ^ (x)->data[0x105]) == 0xFF \ + && ((x)->data[0x106] ^ (x)->data[0x107]) == 0xFF) : \ + (((x)->data[(x)->size - 8] ^ (x)->data[(x)->size - 6]) == 0xFF \ + && ((x)->data[(x)->size - 7] ^ (x)->data[(x)->size - 5]) == 0xFF \ + && ((x)->data[(x)->size - 3] ^ (x)->data[(x)->size - 4]) == 0xFF)) + +#define FT_MAX_TRIES 5 +#define FT_RETRY_DLY 20 + +#define FT_MAX_WR_BUF 10 +#define FT_MAX_RD_BUF 2 +#define FT_FW_PKT_LEN 128 +#define FT_FW_PKT_META_LEN 6 +#define FT_FW_PKT_DLY_MS 20 +#define FT_FW_LAST_PKT 0x6ffa +#define FT_EARSE_DLY_MS 100 +#define FT_55_AA_DLY_NS 5000 + +#define FT_UPGRADE_LOOP 30 +#define FT_CAL_START 0x04 +#define FT_CAL_FIN 0x00 +#define FT_CAL_STORE 0x05 +#define FT_CAL_RETRY 100 +#define FT_REG_CAL 0x00 +#define FT_CAL_MASK 0x7C + +#define FT_INFO_MAX_LEN 512 +#define FTS_PACKET_LENGTH 128 + + +#define FT_BLOADER_SIZE_OFF 12 +#define FT_BLOADER_NEW_SIZE 30 +#define FT_DATA_LEN_OFF_OLD_FW 8 +#define FT_DATA_LEN_OFF_NEW_FW 14 +#define FT_FINISHING_PKT_LEN_OLD_FW 6 +#define FT_FINISHING_PKT_LEN_NEW_FW 12 +#define FT_MAGIC_BLOADER_Z7 0x7bfa +#define FT_MAGIC_BLOADER_LZ4 0x6ffa +#define FT_MAGIC_BLOADER_GZF_30 0x7ff4 +#define FT_MAGIC_BLOADER_GZF 0x7bf4 + +enum { + FT_BLOADER_VERSION_LZ4 = 0, + FT_BLOADER_VERSION_Z7 = 1, + FT_BLOADER_VERSION_GZF = 2, +}; + +enum { + FT_FT5336_FAMILY_ID_0x11 = 0x11, + FT_FT5336_FAMILY_ID_0x12 = 0x12, + FT_FT5336_FAMILY_ID_0x13 = 0x13, + FT_FT5336_FAMILY_ID_0x14 = 0x14, +}; + +struct fw_upgrade_info { + bool auto_cal; + u16 delay_aa; + u16 delay_55; + u8 upgrade_id_1; + u8 upgrade_id_2; + u16 delay_readid; + u16 delay_erase_flash; +}; + +struct Upgrade_Info { + u8 CHIP_ID; + u8 FTS_NAME[20]; + u8 TPD_MAX_POINTS; + u8 AUTO_CLB; + u16 delay_aa; /*delay of write FT_UPGRADE_AA */ + u16 delay_55; /*delay of write FT_UPGRADE_55 */ + u8 upgrade_id_1; /*upgrade id 1 */ + u8 upgrade_id_2; /*upgrade id 2 */ + u16 delay_readid; /*delay of read id */ + u16 delay_earse_flash; /*delay of earse flash*/ +}; + + +struct ft5x06_ts_platform_data { + struct fw_upgrade_info info; + const char *name; + const char *fw_name; + u32 irqflags; + u32 irq_gpio; + u32 irq_gpio_flags; + u32 reset_gpio; + u32 reset_gpio_flags; + u32 family_id; + u32 x_max; + u32 y_max; + u32 x_min; + u32 y_min; + u32 panel_minx; + u32 panel_miny; + u32 panel_maxx; + u32 panel_maxy; + u32 group_id; + u32 hard_rst_dly; + u32 soft_rst_dly; + u32 num_max_touches; + bool fw_vkey_support; + bool no_force_update; + bool i2c_pull_up; + bool ignore_id_check; + int (*power_init) (bool); + int (*power_on) (bool); +}; + +struct ft5x06_ts_data { + struct i2c_client *client; + struct input_dev *input_dev; + const struct ft5x06_ts_platform_data *pdata; + struct regulator *vdd; + struct regulator *vcc_i2c; + char fw_name[FT_FW_NAME_MAX_LEN]; + u8 lockdown_info[FT_LOCKDOWN_SIZE]; + bool loading_fw; + u8 family_id; + struct dentry *dir; + u16 addr; + bool suspended; + char *ts_info; + u8 *tch_data; + u32 tch_data_len; + u8 fw_ver[3]; + u8 fw_vendor_id; +#if defined(CONFIG_FB) + struct notifier_block fb_notif; + struct work_struct fb_notify_work; +#elif defined(CONFIG_HAS_EARLYSUSPEND) + struct early_suspend early_suspend; +#endif + struct pinctrl *ts_pinctrl; + struct pinctrl_state *gpio_state_active; + struct pinctrl_state *gpio_state_suspend; +}; + + + +#define CTP_IC_TYPE_0 0x12 +#define CTP_IC_TYPE_1 0x14 + +#define CTP_SYS_APK_UPDATE 0 + +#define TPD_AUTO_UPGRADE 1 +#define FTS_PROC_APK_DEBUG 1 + +#define CTP_CHARGER_DETECT 1 + +#define CTP_PROC_INTERFACE 1 +#define CTP_LOCKDOWN_INFO 1 + + +#define WT_ADD_CTP_INFO 1 + +#define CTP_DEBUG_ON 1 +#define CTP_DEBUG_FUNC_ON 0 +#define CTP_INFO(fmt, arg...) printk("FT5X06-TP-TAG INFO:"fmt"\n", ##arg) + +#define CTP_ERROR(fmt, arg...) printk("FT5X06-TP-TAG ERROR:"fmt"\n", ##arg) + +#define CTP_DEBUG(fmt, arg...) do {\ + if (CTP_DEBUG_ON)\ + printk("FT5X06-TP-TAG DEBUG:[%d]"fmt"\n", __LINE__, ##arg);\ + } while (0) +#define CTP_DEBUG_FUNC() do {\ + if (CTP_DEBUG_FUNC_ON)\ + printk("FT5X06-TP-TAG Func:%s@Line:%d\n", __func__, __LINE__);\ + } while (0) + + +#endif diff --git a/include/linux/input/gen_vkeys_gt.h b/include/linux/input/gen_vkeys_gt.h new file mode 100644 index 0000000000000..a58158d703bda --- /dev/null +++ b/include/linux/input/gen_vkeys_gt.h @@ -0,0 +1,24 @@ +/* Copyright (c) 2013, 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. + */ + +#ifndef __GEN_VKEYS_ +struct vkeys_platform_data { + const char *name; + int disp_maxx; + int disp_maxy; + int panel_maxx; + int panel_maxy; + int *keycodes; + int num_keys; + int y_offset; +}; +#endif diff --git a/include/linux/ktrace.h b/include/linux/ktrace.h new file mode 100644 index 0000000000000..b125b5b072c1f --- /dev/null +++ b/include/linux/ktrace.h @@ -0,0 +1,287 @@ +#ifndef __KTRACE_H__ +#define __KTRACE_H__ + +#include +#include + +#define US_TO_NS(usec) ((usec) * 1000) +#define MS_TO_US(msec) ((msec) * 1000) + +#define QUEUE_NEXT(v, max) (((v) + 1) % (max)) +#define QUEUE_ADD(v, a, max) (((v) + (a)) % (max)) +#define QUEUE_EMPTY(tail, head) ((tail) == (head)) +#define QUEUE_FULL(tail, head, max) ((((head) + 1) % (max)) == tail) + +#define DEFAULT_ITEMS_PER_READ INT_MAX + +enum { + KTRACE_MM_TYPE_SAMPLE1 = 0, + KTRACE_MM_TYPE_SAMPLE2, + KTRACE_MM_TYPE_SAMPLE3, + KTRACE_MM_TYPE_SAMPLE4, + KTRACE_MM_TYPE_SAMPLE5, + KTRACE_MM_TYPE_SAMPLE6, + KTRACE_MM_TYPE_SAMPLE7, + KTRACE_MM_TYPE_SAMPLE8, + KTRACE_MM_TYPE_SAMPLE9, + KTRACE_MM_TYPE_SAMPLE10, + + KTRACE_MM_TYPE_SLOW_PATH, + KTRACE_MM_TYPE_COMPACT, + KTRACE_MM_TYPE_DIRECT_RECLAIM, + KTRACE_MM_TYPE_NR, +}; + +enum { + KTRACE_SCHED_TYPE_SAMPLE1 = 0, + KTRACE_SCHED_TYPE_SAMPLE2, + KTRACE_SCHED_TYPE_SAMPLE3, + KTRACE_SCHED_TYPE_SAMPLE4, + KTRACE_SCHED_TYPE_SAMPLE5, + KTRACE_SCHED_TYPE_SAMPLE6, + KTRACE_SCHED_TYPE_SAMPLE7, + KTRACE_SCHED_TYPE_SAMPLE8, + KTRACE_SCHED_TYPE_SAMPLE9, + KTRACE_SCHED_TYPE_SAMPLE10, + + KTRACE_SCHED_TYPE_PREEMPT, + KTRACE_SCHED_TYPE_WAIT, + KTRACE_SCHED_TYPE_BLOCK, + KTRACE_SCHED_TYPE_NR, +}; + +enum { + KTRACE_BINDER_TYPE_SAMPLE1 = 0, + KTRACE_BINDER_TYPE_SAMPLE2, + KTRACE_BINDER_TYPE_SAMPLE3, + KTRACE_BINDER_TYPE_SAMPLE4, + KTRACE_BINDER_TYPE_SAMPLE5, + KTRACE_BINDER_TYPE_SAMPLE6, + KTRACE_BINDER_TYPE_SAMPLE7, + KTRACE_BINDER_TYPE_SAMPLE8, + KTRACE_BINDER_TYPE_SAMPLE9, + KTRACE_BINDER_TYPE_SAMPLE10, + + KTRACE_BINDER_TYPE_TRANSACTION, + KTRACE_BINDER_TYPE_NR, +}; + +enum { + KTRACE_CPUFREQ_TYPE_SAMPLE1 = 0, + KTRACE_CPUFREQ_TYPE_SAMPLE2, + KTRACE_CPUFREQ_TYPE_SAMPLE3, + KTRACE_CPUFREQ_TYPE_SAMPLE4, + KTRACE_CPUFREQ_TYPE_SAMPLE5, + KTRACE_CPUFREQ_TYPE_SAMPLE6, + KTRACE_CPUFREQ_TYPE_SAMPLE7, + KTRACE_CPUFREQ_TYPE_SAMPLE8, + KTRACE_CPUFREQ_TYPE_SAMPLE9, + KTRACE_CPUFREQ_TYPE_SAMPLE10, + + KTRACE_CPUFREQ_TYPE_MITIGATION, + KTRACE_CPUFREQ_TYPE_UNPLUGED, + KTRACE_CPUFREQ_TYPE_NR, +}; + +enum { + QUEUE_MM = 0, + QUEUE_STR, + QUEUE_SCHED, + QUEUE_BINDER, + QUEUE_CPUFREQ, + QUEUE_NR +}; + +enum { + KTRACE_EVENT_1 = 0, + KTRACE_EVENT_2, + KTRACE_EVENT_3, + KTRACE_EVENT_4, + KTRACE_EVENT_5, + KTRACE_EVENT_6, + KTRACE_EVENT_7, + KTRACE_EVENT_8, + KTRACE_EVENT_9, + KTRACE_EVENT_10, + + KTRACE_EVENT_11, + KTRACE_EVENT_12, + KTRACE_EVENT_13, + KTRACE_EVENT_14, + KTRACE_EVENT_15, + KTRACE_EVENT_16, + KTRACE_EVENT_17, + KTRACE_EVENT_18, + KTRACE_EVENT_19, + KTRACE_EVENT_20, + + KTRACE_EVENT_NR +}; + +struct ktrace_queue { + spinlock_t lock; + + void *buf; + int entry_size; + int max; + int head; + int tail; + + int read_cnt; + int items_per_read; + + int enable_debug; + + int (*show_entry)(struct seq_file *m, void *entry, bool debug); + + void *priv; +}; + +struct ktrace { + struct dentry *dir; + + struct ktrace_queue queue[QUEUE_NR]; + + /* str ktrace */ + spinlock_t str_lock; + int str_queue_head; + int str_queue_tail; + int str_queue_max; + char *str_buf; + + int str_enable_debug; +}; + +/* use single_open() */ +#define KTRACE_ENTRY_RO_SINGLE(name) \ +static int name##_open(struct inode *inode, struct file *file) \ +{ \ + return single_open(file, name##_show, inode->i_private); \ +} \ +\ +static const struct file_operations name##_fops = { \ + .owner = THIS_MODULE, \ + .open = name##_open, \ + .read = seq_read, \ + .llseek = no_llseek, \ + .release = single_release, \ +}; + +/* use single_open() */ +#define KTRACE_QUEUE_RO_SINGLE(name) \ +static int name##_open(struct inode *inode, struct file *file) \ +{ \ + return single_open(file, ktrace_q_single_show, inode->i_private); \ +} \ +\ +static const struct file_operations name##_fops = { \ + .owner = THIS_MODULE, \ + .open = name##_open, \ + .read = seq_read, \ + .llseek = no_llseek, \ + .release = single_release, \ +}; + + +/* use seq_open() */ +#define KTRACE_QUEUE_RO(name) \ +\ +static const struct seq_operations name##_seq_ops = { \ + .start = ktrace_q_start, \ + .stop = ktrace_q_stop, \ + .next = ktrace_q_next, \ + .show = ktrace_q_show, \ +}; \ +static int name##_open(struct inode *inode, struct file *file) \ +{ \ + int ret; \ +\ + ret = seq_open(file, &name##_seq_ops); \ + if (!ret) { \ + struct seq_file *m = file->private_data; \ + m->private = inode->i_private; \ + } \ + return ret; \ +} \ +\ +static const struct file_operations name##_fops = { \ + .owner = THIS_MODULE, \ + .open = name##_open, \ + .read = seq_read, \ + .llseek = no_llseek, \ + .release = seq_release, \ +}; + +/* + * sed -i 's/^\([^\[]*\[[0-9]\{3\}\] [^\s]\{4\} \s*[0-9]\+\.[0-9]\+:\) \([^:]*:\) \(tracing_mark_write: .*\)/\1 \3/g' .html + */ +#define KTRACE_BEGIN(name) trace_printk("tracing_mark_write: B|%d|%s\n", current->tgid, name) +#define KTRACE_END() trace_printk("tracing_mark_write: E\n") +#define KTRACE_FUNC() KTRACE_BEGIN(__func__) +#define KTRACE_INT(name, value) trace_printk("tracing_mark_write: C|%d|%s|%d\n", current->tgid, name, (int)(value)) +#define KTRACE_BEGIN_MSG(fmt...) \ + do { \ + char buf[64]; \ + snprintf(buf, sizeof(buf) - 1, fmt); \ + KTRACE_BEGIN(buf); \ + } while (0); + +#ifdef CONFIG_KTRACE + +struct ktrace *get_ktrace(void); +int __init ktrace_mm_init(struct dentry *dir, struct ktrace_queue *q); +int __init ktrace_print_init(struct dentry *dir, struct ktrace_queue *q); +int __init ktrace_sched_init(struct dentry *dir, struct ktrace_queue *q); +int __init ktrace_binder_init(struct dentry *dir, struct ktrace_queue *q); +int __init ktrace_cpufreq_init(struct dentry *dir, struct ktrace_queue *q); +int __init ktrace_event_init(struct dentry *dir); + +void ktrace_add_mm_event(unsigned char type, u64 time_stamp, u64 delta); +void ktrace_add_sched_event(unsigned char type, pid_t pid, u64 time_stamp, u64 delta, void *pc); +void ktrace_add_binder_event(unsigned char type, u64 time_stamp, u64 delta); +int ktrace_sched_match_pid(pid_t pid); +void ktrace_add_cpufreq_event(unsigned char type, pid_t pid, u64 time_stamp, + unsigned int cpu, unsigned int target_freq, unsigned int max); +void ktrace_cpufreq_set_mitigated(char *comm, unsigned int cpu, + const struct cpumask *related_cpus, unsigned int max); +void ktrace_cpufreq_update_history(struct task_struct *p, u32 runtime, int samples, u32 scale_runtime); +void ktrace_print(const char *fmt, ...); + +void *ktrace_q_start(struct seq_file *m, loff_t *pos); +void *ktrace_q_next(struct seq_file *m, void *v, loff_t *pos); +void ktrace_q_stop(struct seq_file *m, void *v); +int ktrace_q_show(struct seq_file *m, void *v); +int ktrace_q_single_show(struct seq_file *m, void *v); +void ktrace_init_queue(struct ktrace_queue *q, struct dentry *dir, + void *priv, void *buf, int entry_size, int max, int items_per_read, + int(*show_entry)(struct seq_file *, void *, bool)); +void ktrace_tryadd_queue(struct ktrace_queue *q, void *entry); +void ktrace_add_queue_multi(struct ktrace_queue *q, void *entry, int num); +void ktrace_reset_queue(struct ktrace_queue *q); + +void ktrace_event_inc(unsigned char type); +void ktrace_event_dec(unsigned char type); +void ktrace_event_add(unsigned char type, int i); +void ktrace_event_sub(unsigned char type, int i); +#else +static inline void ktrace_add_mm_event(unsigned char type, u64 time_stamp, u64 delta) {} +static inline void ktrace_print(const char *fmt, ...) {} +static inline void ktrace_add_sched_event(unsigned char type, pid_t pid, u64 time_stamp, u64 delta, void *pc) {} +static inline void ktrace_add_binder_event(unsigned char type, u64 time_stamp, u64 delta) {} +static inline int ktrace_sched_match_pid(pid_t pid) { return 0; } +static inline void ktrace_add_cpufreq_event(unsigned char type, pid_t pid, u64 time_stamp, + unsigned int cpu, unsigned int target_freq, unsigned int max) {} +static inline void ktrace_cpufreq_set_mitigated(char *comm, unsigned int cpu, + const struct cpumask *related_cpus, unsigned int max){} +static inline void ktrace_cpufreq_update_history(struct task_struct *p, u32 runtime, int samples, u32 scale_runtime) {} + + + +static inline void ktrace_event_inc(unsigned char type) {} +static inline void ktrace_event_dec(unsigned char type) {} +static inline void ktrace_event_add(unsigned char type, int i) {} +static inline void ktrace_event_sub(unsigned char type, int i) {} + +#endif + +#endif diff --git a/include/linux/mdss_io_util.h b/include/linux/mdss_io_util.h index 6ad21e8878774..1e5227a9eadfc 100644 --- a/include/linux/mdss_io_util.h +++ b/include/linux/mdss_io_util.h @@ -1,4 +1,5 @@ /* Copyright (c) 2012, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -109,4 +110,5 @@ int mdss_i2c_byte_read(struct i2c_client *client, uint8_t slave_addr, int mdss_i2c_byte_write(struct i2c_client *client, uint8_t slave_addr, uint8_t reg_offset, uint8_t *value); +int mdss_prim_panel_fb_unblank(int timeout); #endif /* __MDSS_IO_UTIL_H__ */ diff --git a/include/linux/mlx4/device.h b/include/linux/mlx4/device.h index 37e4404d0227f..22fc8f9edc049 100644 --- a/include/linux/mlx4/device.h +++ b/include/linux/mlx4/device.h @@ -42,7 +42,7 @@ #include -#include +#include #define MAX_MSIX_P_PORT 17 #define MAX_MSIX 64 diff --git a/include/linux/mm.h b/include/linux/mm.h index 7a345e6a04c6f..e890d9f07a256 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -2055,6 +2055,7 @@ static inline struct page *follow_page(struct vm_area_struct *vma, #define FOLL_NUMA 0x200 /* force NUMA hinting page fault */ #define FOLL_MIGRATION 0x400 /* wait for page to replace migration entry */ #define FOLL_TRIED 0x800 /* a retry, previous pass started an IO */ +#define FOLL_COW 0x4000 /* internal GUP flag */ typedef int (*pte_fn_t)(pte_t *pte, pgtable_t token, unsigned long addr, void *data); @@ -2204,6 +2205,9 @@ struct reclaim_param { }; extern struct reclaim_param reclaim_task_anon(struct task_struct *task, int nr_to_reclaim); +extern int reclaim_pte_range(pmd_t *pmd, unsigned long addr, + unsigned long end, struct mm_walk *walk); +extern unsigned long reclaim_global(unsigned long nr_to_reclaim); #endif #endif /* __KERNEL__ */ diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 2e67166e323ec..b57da43998b12 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -469,6 +470,7 @@ struct mm_struct { bool tlb_flush_pending; #endif struct uprobes_state uprobes_state; + struct work_struct async_put_work; #ifdef CONFIG_MSM_APP_SETTINGS int app_setting; #endif diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 43c952e5f4671..f57daa844270a 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -130,6 +130,8 @@ struct mmc_ext_csd { u8 raw_sectors[4]; /* 212 - 4 bytes */ u8 cmdq_depth; /* 307 */ u8 cmdq_support; /* 308 */ + u8 life_time_est_typ_a; /* 268 */ + u8 life_time_est_typ_b; /* 269 */ u8 barrier_support; /* 486 */ u8 barrier_en; diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index a110beb96773a..e6da99015cabc 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -20,6 +20,7 @@ #include #include #include +#include #define MMC_AUTOSUSPEND_DELAY_MS 3000 @@ -500,6 +501,7 @@ struct mmc_host { unsigned int bus_resume_flags; #define MMC_BUSRESUME_MANUAL_RESUME (1 << 0) #define MMC_BUSRESUME_NEEDS_RESUME (1 << 1) +bool ignore_bus_resume_flags; unsigned int sdio_irqs; struct task_struct *sdio_irq_thread; @@ -516,7 +518,9 @@ struct mmc_host { struct mmc_supply supply; struct dentry *debugfs_root; - +#ifdef CONFIG_MMC_ERROR_STATUS + bool err_occurred; +#endif struct mmc_async_req *areq; /* active async req */ struct mmc_context_info context_info; /* async synchronization info */ @@ -557,6 +561,7 @@ struct mmc_host { } perf; bool perf_enable; #endif + struct mmc_trace_buffer trace_buf; enum dev_state dev_status; bool wakeup_on_idle; struct mmc_cmdq_context_info cmdq_ctx; diff --git a/include/linux/mmc/mmc.h b/include/linux/mmc/mmc.h index ed6638ab7ca51..b8a6c3ef411de 100644 --- a/include/linux/mmc/mmc.h +++ b/include/linux/mmc/mmc.h @@ -286,6 +286,8 @@ struct _mmc_csd { #define EXT_CSD_FW_VERSION 254 /* RO */ #define EXT_CSD_CMDQ_DEPTH 307 /* RO */ #define EXT_CSD_CMDQ_SUPPORT 308 /* RO */ +#define EXT_CSD_LIFE_TIME_EST_TYP_A 268 /* RO */ +#define EXT_CSD_LIFE_TIME_EST_TYP_B 269 /* RO */ #define EXT_CSD_BARRIER_SUPPORT 486 /* RO */ #define EXT_CSD_TAG_UNIT_SIZE 498 /* RO */ #define EXT_CSD_DATA_TAG_SUPPORT 499 /* RO */ diff --git a/include/linux/mmc/ring_buffer.h b/include/linux/mmc/ring_buffer.h new file mode 100644 index 0000000000000..1bf564df7939d --- /dev/null +++ b/include/linux/mmc/ring_buffer.h @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2016, 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. + * + */ + +#ifndef __MMC_RING_BUFFER__ +#define __MMC_RING_BUFFER__ + +#include +#include + +#include "core.h" + +#define MMC_TRACE_RBUF_SZ_ORDER 2 /* 2^2 pages */ +#define MMC_TRACE_RBUF_SZ (PAGE_SIZE * (1 << MMC_TRACE_RBUF_SZ_ORDER)) +#define MMC_TRACE_EVENT_SZ 256 +#define MMC_TRACE_RBUF_NUM_EVENTS (MMC_TRACE_RBUF_SZ / MMC_TRACE_EVENT_SZ) + +struct mmc_host; +struct mmc_trace_buffer { + int wr_idx; + bool stop_tracing; + spinlock_t trace_lock; + char *data; +}; + +#ifdef CONFIG_MMC_RING_BUFFER +void mmc_stop_tracing(struct mmc_host *mmc); +void mmc_trace_write(struct mmc_host *mmc, const char *fmt, ...); +void mmc_trace_init(struct mmc_host *mmc); +void mmc_trace_free(struct mmc_host *mmc); +void mmc_dump_trace_buffer(struct mmc_host *mmc, struct seq_file *s); +#else +static inline void mmc_stop_tracing(struct mmc_host *mmc) {} +static inline void mmc_trace_write(struct mmc_host *mmc, + const char *fmt, ...) {} +static inline void mmc_trace_init(struct mmc_host *mmc) {} +static inline void mmc_trace_free(struct mmc_host *mmc) {} +static inline void mmc_dump_trace_buffer(struct mmc_host *mmc, + struct seq_file *s) {} +#endif + +#define MMC_TRACE(mmc, fmt, ...) \ + mmc_trace_write(mmc, fmt, ##__VA_ARGS__) + +#endif /* __MMC_RING_BUFFER__ */ diff --git a/include/linux/mount.h b/include/linux/mount.h index c2c561dc01144..7c9e561fa0111 100644 --- a/include/linux/mount.h +++ b/include/linux/mount.h @@ -66,6 +66,7 @@ struct vfsmount { struct dentry *mnt_root; /* root of the mounted tree */ struct super_block *mnt_sb; /* pointer to superblock */ int mnt_flags; + void *data; }; struct file; /* forward dec */ diff --git a/include/linux/msm_bus_rules.h b/include/linux/msm_bus_rules.h index e6142bfcb6234..dda8610bc58bd 100644 --- a/include/linux/msm_bus_rules.h +++ b/include/linux/msm_bus_rules.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2016, 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 @@ -39,15 +39,18 @@ struct rule_apply_rcm_info { struct bus_rule_type { int num_src; - int *src_id; - int src_field; - int op; - u64 thresh; + int combo_op; + int num_thresh; int num_dst; - int *dst_node; u64 dst_bw; int mode; + u64 curr_bw; void *client_data; + int *src_id; + int *src_field; + int *op; + u64 *thresh; + int *dst_node; }; #if (defined(CONFIG_BUS_TOPOLOGY_ADHOC)) @@ -61,6 +64,8 @@ bool msm_rule_update(struct bus_rule_type *old_rule, void msm_rule_evaluate_rules(int node); void print_rules_buf(char *buf, int count); bool msm_rule_are_rules_registered(void); +int msm_rule_query_bandwidth(struct bus_rule_type *rule, + u64 *bw, struct notifier_block *nb); #else static inline void msm_rule_register(int num_rules, struct bus_rule_type *rule, struct notifier_block *nb) @@ -87,5 +92,10 @@ static inline bool msm_rule_update(struct bus_rule_type *old_rule, static inline void msm_rule_evaluate_rules(int node) { } +static inline int msm_rule_query_bandwidth(struct bus_rule_type *rule, + u64 *bw, struct notifier_block *nb) +{ + return false; +} #endif /* defined(CONFIG_BUS_TOPOLOGY_ADHOC) */ #endif /* _ARCH_ARM_MACH_MSM_BUS_RULES_H */ diff --git a/include/linux/msm_gsi.h b/include/linux/msm_gsi.h index c95a529b029bf..95ad6f96bcd05 100644 --- a/include/linux/msm_gsi.h +++ b/include/linux/msm_gsi.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-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 @@ -1030,6 +1030,19 @@ int gsi_configure_regs(phys_addr_t gsi_base_addr, u32 gsi_size, */ int gsi_enable_fw(phys_addr_t gsi_base_addr, u32 gsi_size); +/** + * gsi_get_inst_ram_offset_and_size - Peripheral should call this function + * to get instruction RAM base address offset and size. Peripheral typically + * uses this info to load GSI FW into the IRAM. + * + * @base_offset:[OUT] - IRAM base offset address + * @size: [OUT] - IRAM size + + * @Return none + */ +void gsi_get_inst_ram_offset_and_size(unsigned long *base_offset, + unsigned long *size); + /* * Here is a typical sequence of calls * @@ -1217,9 +1230,15 @@ static inline int gsi_configure_regs(phys_addr_t gsi_base_addr, u32 gsi_size, { return -GSI_STATUS_UNSUPPORTED_OP; } + static inline int gsi_enable_fw(phys_addr_t gsi_base_addr, u32 gsi_size) { return -GSI_STATUS_UNSUPPORTED_OP; } + +static inline void gsi_get_inst_ram_offset_and_size(unsigned long *base_offset, + unsigned long *size) +{ +} #endif #endif diff --git a/include/linux/namei.h b/include/linux/namei.h index c9ad7a100d052..f6ff630b39aa3 100644 --- a/include/linux/namei.h +++ b/include/linux/namei.h @@ -75,6 +75,7 @@ extern int vfs_path_lookup(struct dentry *, struct vfsmount *, const char *, unsigned int, struct path *); extern struct dentry *lookup_one_len(const char *, struct dentry *, int); +extern struct dentry *lookup_one_len2(const char *, struct vfsmount *mnt, struct dentry *, int); extern int follow_down_one(struct path *); extern int follow_down(struct path *); diff --git a/include/linux/nfcinfo.h b/include/linux/nfcinfo.h new file mode 100644 index 0000000000000..9e089084ca14a --- /dev/null +++ b/include/linux/nfcinfo.h @@ -0,0 +1,18 @@ +/*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. + */ + +#ifndef _NFCINFO_H +#define _NFCINFO_H + +#include + +#endif diff --git a/include/linux/of_fdt.h b/include/linux/of_fdt.h index 35feeca7bf2c8..242ec59d88423 100644 --- a/include/linux/of_fdt.h +++ b/include/linux/of_fdt.h @@ -56,6 +56,7 @@ extern int of_flat_dt_is_compatible(unsigned long node, const char *name); extern int of_flat_dt_match(unsigned long node, const char *const *matches); extern unsigned long of_get_flat_dt_root(void); extern int of_get_flat_dt_size(void); +extern void early_init_dt_setup_pureason_arch(unsigned long pu_reason); /* * early_init_dt_scan_chosen - scan the device tree for ramdisk and bootargs @@ -113,6 +114,7 @@ static inline void early_init_fdt_scan_reserved_mem(void) {} static inline const char *of_flat_dt_get_machine_name(void) { return NULL; } static inline void unflatten_device_tree(void) {} static inline void unflatten_and_copy_device_tree(void) {} +static inline void early_init_dt_setup_pureason_arch(unsigned long pu_reason) {} #endif /* CONFIG_OF_FLATTREE */ #endif /* __ASSEMBLY__ */ diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 20227882f5499..eb65b3392d0b1 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -220,11 +220,6 @@ static inline struct page *__page_cache_alloc(gfp_t gfp) page = alloc_pages(gfp, 0); - if (page && is_cma_pageblock(page)) { - __free_page(page); - page = alloc_pages(gfp & ~__GFP_MOVABLE, 0); - } - return page; } #endif diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h index 5627a26a2435e..93474a4d9247d 100644 --- a/include/linux/perf_event.h +++ b/include/linux/perf_event.h @@ -339,6 +339,12 @@ struct perf_event { int nr_siblings; int group_flags; struct perf_event *group_leader; + + /* + * Protect the pmu, attributes and context of a group leader. + * Note: does not protect the pointer to the group_leader. + */ + struct mutex group_leader_mutex; struct pmu *pmu; enum perf_event_active_state state; @@ -458,11 +464,6 @@ struct perf_event { #endif /* CONFIG_PERF_EVENTS */ }; -enum perf_event_context_type { - task_context, - cpu_context, -}; - /** * struct perf_event_context - event context structure * @@ -470,7 +471,6 @@ enum perf_event_context_type { */ struct perf_event_context { struct pmu *pmu; - enum perf_event_context_type type; /* * Protect the states of the events in the list, * nr_active, and the list: @@ -753,6 +753,11 @@ extern int perf_cpu_time_max_percent_handler(struct ctl_table *table, int write, loff_t *ppos); +static inline bool perf_paranoid_any(void) +{ + return sysctl_perf_event_paranoid > 2; +} + static inline bool perf_paranoid_tracepoint_raw(void) { return sysctl_perf_event_paranoid > -1; diff --git a/include/linux/pid.h b/include/linux/pid.h index 23705a53abbaa..97b745ddece50 100644 --- a/include/linux/pid.h +++ b/include/linux/pid.h @@ -8,7 +8,9 @@ enum pid_type PIDTYPE_PID, PIDTYPE_PGID, PIDTYPE_SID, - PIDTYPE_MAX + PIDTYPE_MAX, + /* only valid to __task_pid_nr_ns() */ + __PIDTYPE_TGID }; /* diff --git a/include/linux/posix_acl.h b/include/linux/posix_acl.h index 3e96a6a761033..33ddf915462e5 100644 --- a/include/linux/posix_acl.h +++ b/include/linux/posix_acl.h @@ -95,6 +95,8 @@ extern int set_posix_acl(struct inode *, int, struct posix_acl *); extern int posix_acl_chmod(struct inode *, umode_t); extern int posix_acl_create(struct inode *, umode_t *, struct posix_acl **, struct posix_acl **); +extern int posix_acl_update_mode(struct inode *, umode_t *, + struct posix_acl **); extern int simple_set_acl(struct inode *, struct posix_acl *, int); extern int simple_acl_create(struct inode *, struct inode *); diff --git a/include/linux/power/cw2015_battery.h b/include/linux/power/cw2015_battery.h new file mode 100644 index 0000000000000..fb03ca53c996f --- /dev/null +++ b/include/linux/power/cw2015_battery.h @@ -0,0 +1,55 @@ +/* + * Gas_Gauge driver for CW2015/2013 + * Copyright (C) 2012, CellWise + * Copyright (C) 2018 XiaoMi, Inc. + * + * Authors: ChenGang + * + * 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.And this driver depends on + * I2C and uses IIC bus for communication with the host. + * + */ + +#ifndef __LINUX_CW2015_BATTERY_H__ +#define __LINUX_CW2015_BATTERY_H__ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_HAS_EARLYSUSPEND +#include +#endif + +#define SIZE_BATINFO 64 + + + +struct cw_bat_platform_data { + int (*io_init)(void); + + int is_usb_charge; + int is_dc_charge; + u8 *cw_bat_config_info; + u32 irq_flags; + u32 dc_det_pin; + u32 dc_det_level; + + u32 bat_low_pin; + u32 bat_low_level; + u32 chg_ok_pin; + u32 chg_ok_level; + u32 chg_mode_sel_pin; + u32 chg_mode_sel_level; +}; + +#endif + diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index 7a98cebe117f0..63f5e8d77f45d 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -4,6 +4,7 @@ * Copyright © 2007 Anton Vorontsov * Copyright © 2004 Szabolcs Gyurko * Copyright © 2003 Ian Molton + * Copyright (C) 2018 XiaoMi, Inc. * * Modified: 2004, Oct Szabolcs Gyurko * @@ -188,6 +189,7 @@ enum power_supply_property { POWER_SUPPLY_PROP_COOL_TEMP, POWER_SUPPLY_PROP_WARM_TEMP, POWER_SUPPLY_PROP_SYSTEM_TEMP_LEVEL, + POWER_SUPPLY_PROP_CHARGER_TYPE, POWER_SUPPLY_PROP_RESISTANCE, POWER_SUPPLY_PROP_RESISTANCE_CAPACITIVE, POWER_SUPPLY_PROP_RESISTANCE_ID, /* in Ohms */ @@ -216,6 +218,7 @@ enum power_supply_property { POWER_SUPPLY_PROP_ENABLE_JEITA_DETECTION, POWER_SUPPLY_PROP_BATTERY_INFO, POWER_SUPPLY_PROP_BATTERY_INFO_ID, + POWER_SUPPLY_PROP_CHARGING_CALL_STATE, /* Local extensions of type int64_t */ POWER_SUPPLY_PROP_CHARGE_COUNTER_EXT, /* Properties of type `const char *' */ @@ -290,6 +293,7 @@ struct power_supply { bool no_thermal; /* For APM emulation, think legacy userspace. */ int use_for_apm; + u8 bms_psy_ok; /* private */ struct device *dev; diff --git a/include/linux/qpnp/power-on.h b/include/linux/qpnp/power-on.h index da8f5a8622dde..e301dba1e137a 100644 --- a/include/linux/qpnp/power-on.h +++ b/include/linux/qpnp/power-on.h @@ -58,6 +58,8 @@ enum pon_restart_reason { PON_RESTART_REASON_DMVERITY_CORRUPTED = 0x04, PON_RESTART_REASON_DMVERITY_ENFORCE = 0x05, PON_RESTART_REASON_KEYS_CLEAR = 0x06, + PON_RESTART_REASON_NORMAL = 0x20, + PON_RESTART_REASON_PANIC = 0x21, }; #ifdef CONFIG_QPNP_POWER_ON @@ -67,6 +69,8 @@ int qpnp_pon_trigger_config(enum pon_trigger_source pon_src, bool enable); int qpnp_pon_wd_config(bool enable); int qpnp_pon_set_restart_reason(enum pon_restart_reason reason); bool qpnp_pon_check_hard_reset_stored(void); +int qpnp_pon_is_lpk(void); +int qpnp_pon_is_ps_hold_reset(void); #else static int qpnp_pon_system_pwr_off(enum pon_power_off_type type) @@ -91,6 +95,9 @@ static inline bool qpnp_pon_check_hard_reset_stored(void) { return false; } +static inline int qpnp_pon_is_lpk(void) { return -ENODEV; } +static inline int qpnp_pon_is_ps_hold_reset(void) { return -ENODEV; } + #endif #endif diff --git a/include/linux/rtmm.h b/include/linux/rtmm.h new file mode 100644 index 0000000000000..e55a80e63c1ed --- /dev/null +++ b/include/linux/rtmm.h @@ -0,0 +1,31 @@ +#ifndef __RTMM_H__ +#define __MIMEM_H__ + + +#define GLOBAL_RECLAIM_SWAPPINESS 150 + +enum { + RTMM_POOL_THREADINFO = 0, + RTMM_POOL_NR +}; + +int __init rtmm_pool_init(struct dentry *dir); +struct page *rtmm_alloc_pages(int pool_type); +void rtmm_free_pages(void *addr, int pool_type); + +int __init rtmm_reclaim_init(struct dentry *dir); + +struct scan_control; +#ifdef CONFIG_RTMM +static inline bool rtmm_reclaim(struct scan_control *sc) +{ + return strncmp("rtmm_reclaim", current->comm, strlen("rtmm_reclaim")) == 0; +} +#else +static inline bool rtmm_reclaim(struct scan_control *sc) +{ + return false; +} +#endif + +#endif diff --git a/include/linux/sched.h b/include/linux/sched.h index 27caaaa7289a0..7b093814d0039 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -1182,6 +1182,7 @@ struct ravg { u64 mark_start; u32 sum, demand; u32 sum_history[RAVG_HIST_SIZE_MAX]; + u64 proc_load; #ifdef CONFIG_SCHED_FREQ_INPUT u32 curr_window, prev_window; u16 active_windows; @@ -1227,6 +1228,8 @@ struct sched_rt_entity { unsigned long timeout; unsigned long watchdog_stamp; unsigned int time_slice; + unsigned short on_rq; + unsigned short on_list; struct sched_rt_entity *back; #ifdef CONFIG_RT_GROUP_SCHED @@ -1336,6 +1339,8 @@ struct task_struct { u64 last_wake_ts; u64 last_switch_out_ts; u64 last_cpu_selected_ts; + u64 last_preempt; + u64 last_wakeup; #ifdef CONFIG_SCHED_QHMP u64 run_start; #endif @@ -1860,14 +1865,16 @@ static inline pid_t task_tgid_nr(struct task_struct *tsk) return tsk->tgid; } -pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns); +static inline pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns) +{ + return __task_pid_nr_ns(tsk, __PIDTYPE_TGID, ns); +} static inline pid_t task_tgid_vnr(struct task_struct *tsk) { - return pid_vnr(task_tgid(tsk)); + return __task_pid_nr_ns(tsk, __PIDTYPE_TGID, NULL); } - static inline int pid_alive(const struct task_struct *p); static inline pid_t task_ppid_nr_ns(const struct task_struct *tsk, struct pid_namespace *ns) { @@ -2111,7 +2118,7 @@ static inline void memalloc_noio_restore(unsigned int flags) #define PFA_NO_NEW_PRIVS 0 /* May not gain new privileges. */ #define PFA_SPREAD_PAGE 1 /* Spread page cache over cpuset */ #define PFA_SPREAD_SLAB 2 /* Spread some slab caches over cpuset */ - +#define PFA_LMK_WAITING 3 /* Lowmemorykiller is waiting */ #define TASK_PFA_TEST(name, func) \ static inline bool task_##func(struct task_struct *p) \ @@ -2134,6 +2141,9 @@ TASK_PFA_TEST(SPREAD_SLAB, spread_slab) TASK_PFA_SET(SPREAD_SLAB, spread_slab) TASK_PFA_CLEAR(SPREAD_SLAB, spread_slab) +TASK_PFA_TEST(LMK_WAITING, lmk_waiting) +TASK_PFA_SET(LMK_WAITING, lmk_waiting) + /* * task->jobctl flags */ @@ -2615,6 +2625,11 @@ static inline void mmdrop(struct mm_struct * mm) /* mmput gets rid of the mappings and all user-space */ extern int mmput(struct mm_struct *); +/* same as above but performs the slow path from the async kontext. Can + * be called from the atomic context as well + */ +extern void mmput_async(struct mm_struct *); + /* 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/security.h b/include/linux/security.h index c0855c22e3105..2ef9ed4e6317f 100644 --- a/include/linux/security.h +++ b/include/linux/security.h @@ -1572,7 +1572,6 @@ struct security_operations { struct fown_struct *fown, int sig); int (*file_receive) (struct file *file); int (*file_open) (struct file *file, const struct cred *cred); - int (*file_close)(struct file *file); bool (*allow_merge_bio)(struct bio *bio1, struct bio *bio2); int (*task_create) (unsigned long clone_flags); @@ -1855,7 +1854,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_file_close(struct file *file); bool security_allow_merge_bio(struct bio *bio1, struct bio *bio2); int security_task_create(unsigned long clone_flags); @@ -2381,11 +2379,6 @@ static inline int security_file_open(struct file *file, return 0; } -static inline int security_file_close(struct file *file) -{ - return 0; -} - static inline bool security_allow_merge_bio(struct bio *bio1, struct bio *bio2) { return true; diff --git a/include/linux/sysrq.h b/include/linux/sysrq.h index 387fa7d05c982..d802692acb539 100644 --- a/include/linux/sysrq.h +++ b/include/linux/sysrq.h @@ -42,6 +42,7 @@ struct sysrq_key_op { * are available -- else NULL's). */ +bool sysrq_on(void); void handle_sysrq(int key); void __handle_sysrq(int key, bool check_mask); int register_sysrq_key(int key, struct sysrq_key_op *op); diff --git a/include/linux/timecounter.h b/include/linux/timecounter.h new file mode 100644 index 0000000000000..146f07a6651be --- /dev/null +++ b/include/linux/timecounter.h @@ -0,0 +1,122 @@ +/* + * linux/include/linux/timecounter.h + * + * based on code that migrated away from + * linux/include/linux/clocksource.h + * + * 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 _LINUX_TIMECOUNTER_H +#define _LINUX_TIMECOUNTER_H + +#include + +/** + * struct cyclecounter - hardware abstraction for a free running counter + * Provides completely state-free accessors to the underlying hardware. + * Depending on which hardware it reads, the cycle counter may wrap + * around quickly. Locking rules (if necessary) have to be defined + * by the implementor and user of specific instances of this API. + * + * @read: returns the current cycle value + * @mask: bitmask for two's complement + * subtraction of non 64 bit counters, + * see CLOCKSOURCE_MASK() helper macro + * @mult: cycle to nanosecond multiplier + * @shift: cycle to nanosecond divisor (power of two) + */ +struct cyclecounter { + cycle_t (*read)(const struct cyclecounter *cc); + cycle_t mask; + u32 mult; + u32 shift; +}; + +/** + * struct timecounter - layer above a %struct cyclecounter which counts nanoseconds + * Contains the state needed by timecounter_read() to detect + * cycle counter wrap around. Initialize with + * timecounter_init(). Also used to convert cycle counts into the + * corresponding nanosecond counts with timecounter_cyc2time(). Users + * of this code are responsible for initializing the underlying + * cycle counter hardware, locking issues and reading the time + * more often than the cycle counter wraps around. The nanosecond + * counter will only wrap around after ~585 years. + * + * @cc: the cycle counter used by this instance + * @cycle_last: most recent cycle counter value seen by + * timecounter_read() + * @nsec: continuously increasing count + */ +struct timecounter { + const struct cyclecounter *cc; + cycle_t cycle_last; + u64 nsec; +}; + +/** + * cyclecounter_cyc2ns - converts cycle counter cycles to nanoseconds + * @cc: Pointer to cycle counter. + * @cycles: Cycles + * + * XXX - This could use some mult_lxl_ll() asm optimization. Same code + * as in cyc2ns, but with unsigned result. + */ +static inline u64 cyclecounter_cyc2ns(const struct cyclecounter *cc, + cycle_t cycles) +{ + u64 ret = (u64)cycles; + ret = (ret * cc->mult) >> cc->shift; + return ret; +} + +/** + * timecounter_init - initialize a time counter + * @tc: Pointer to time counter which is to be initialized/reset + * @cc: A cycle counter, ready to be used. + * @start_tstamp: Arbitrary initial time stamp. + * + * After this call the current cycle register (roughly) corresponds to + * the initial time stamp. Every call to timecounter_read() increments + * the time stamp counter by the number of elapsed nanoseconds. + */ +extern void timecounter_init(struct timecounter *tc, + const struct cyclecounter *cc, + u64 start_tstamp); + +/** + * timecounter_read - return nanoseconds elapsed since timecounter_init() + * plus the initial time stamp + * @tc: Pointer to time counter. + * + * In other words, keeps track of time since the same epoch as + * the function which generated the initial time stamp. + */ +extern u64 timecounter_read(struct timecounter *tc); + +/** + * timecounter_cyc2time - convert a cycle counter to same + * time base as values returned by + * timecounter_read() + * @tc: Pointer to time counter. + * @cycle_tstamp: a value returned by tc->cc->read() + * + * Cycle counts that are converted correctly as long as they + * fall into the interval [-1/2 max cycle count, +1/2 max cycle count], + * with "max cycle count" == cs->mask+1. + * + * This allows conversion of cycle counter values which were generated + * in the past. + */ +extern u64 timecounter_cyc2time(struct timecounter *tc, + cycle_t cycle_tstamp); + +#endif diff --git a/include/linux/types.h b/include/linux/types.h index 049fc8697cb15..d23c45e74f8a2 100644 --- a/include/linux/types.h +++ b/include/linux/types.h @@ -213,5 +213,8 @@ struct callback_head { }; #define rcu_head callback_head +/* clocksource cycle base type */ +typedef u64 cycle_t; + #endif /* __ASSEMBLY__ */ #endif /* _LINUX_TYPES_H */ diff --git a/include/linux/usb.h b/include/linux/usb.h index 70a7dbf11de8f..0f4f50926f14d 100644 --- a/include/linux/usb.h +++ b/include/linux/usb.h @@ -735,6 +735,17 @@ static inline bool usb_device_no_sg_constraint(struct usb_device *udev) /* for drivers using iso endpoints */ extern int usb_get_current_frame_number(struct usb_device *usb_dev); +extern int usb_sec_event_ring_setup(struct usb_device *dev, + unsigned intr_num); +extern int usb_sec_event_ring_cleanup(struct usb_device *dev, + unsigned intr_num); + +extern dma_addr_t +usb_get_sec_event_ring_dma_addr(struct usb_device *dev, + unsigned intr_num); +extern dma_addr_t usb_get_dcba_dma_addr(struct usb_device *dev); +extern dma_addr_t usb_get_xfer_ring_dma_addr(struct usb_device *dev, + struct usb_host_endpoint *ep); /* Sets up a group of bulk endpoints to support multiple stream IDs. */ extern int usb_alloc_streams(struct usb_interface *interface, diff --git a/include/linux/usb/android.h b/include/linux/usb/android.h index a28182c8d54bb..8ce93e39d6050 100644 --- a/include/linux/usb/android.h +++ b/include/linux/usb/android.h @@ -132,6 +132,7 @@ extern int gport_setup(struct usb_configuration *c); extern void gport_cleanup(void); extern int gserial_init_port(int port_num, const char *name, const char *port_name); +extern void gserial_deinit_port(void); extern bool gserial_is_connected(void); extern bool gserial_is_dun_w_softap_enabled(void); extern void gserial_dun_w_softap_enable(bool enable); diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h index 9a30c1e01fb2b..65cd72c7686af 100644 --- a/include/linux/usb/hcd.h +++ b/include/linux/usb/hcd.h @@ -387,6 +387,15 @@ struct hc_driver { void (*dump_regs)(struct usb_hcd *); void (*set_autosuspend_delay)(struct usb_device *); void (*reset_sof_bug_handler)(struct usb_hcd *hcd, u32 val); + + int (*sec_event_ring_setup)(struct usb_hcd *hcd, unsigned intr_num); + int (*sec_event_ring_cleanup)(struct usb_hcd *hcd, unsigned intr_num); + dma_addr_t (*get_sec_event_ring_dma_addr)(struct usb_hcd *hcd, + unsigned intr_num); + dma_addr_t (*get_xfer_ring_dma_addr)(struct usb_hcd *hcd, + struct usb_device *udev, struct usb_host_endpoint *ep); + dma_addr_t (*get_dcba_dma_addr)(struct usb_hcd *hcd, + struct usb_device *udev); }; static inline int hcd_giveback_urb_in_bh(struct usb_hcd *hcd) @@ -425,6 +434,17 @@ extern int usb_hcd_alloc_bandwidth(struct usb_device *udev, struct usb_host_interface *old_alt, struct usb_host_interface *new_alt); extern int usb_hcd_get_frame_number(struct usb_device *udev); +extern int usb_hcd_sec_event_ring_setup(struct usb_device *udev, + unsigned intr_num); +extern int usb_hcd_sec_event_ring_cleanup(struct usb_device *udev, + unsigned intr_num); +extern dma_addr_t +usb_hcd_get_sec_event_ring_dma_addr(struct usb_device *udev, + unsigned intr_num); +extern dma_addr_t usb_hcd_get_dcba_dma_addr(struct usb_device *udev); +extern dma_addr_t +usb_hcd_get_xfer_ring_dma_addr(struct usb_device *udev, + struct usb_host_endpoint *ep); extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver, struct device *dev, const char *bus_name); @@ -474,7 +494,7 @@ extern void usb_hc_died(struct usb_hcd *hcd); extern void usb_hcd_poll_rh_status(struct usb_hcd *hcd); extern void usb_wakeup_notification(struct usb_device *hdev, unsigned int portnum); - +extern void usb_flush_hub_wq(void); extern void usb_hcd_start_port_resume(struct usb_bus *bus, int portnum); extern void usb_hcd_end_port_resume(struct usb_bus *bus, int portnum); diff --git a/include/linux/usb/msm_hsusb.h b/include/linux/usb/msm_hsusb.h index 507ad809802e7..572eef14c8829 100644 --- a/include/linux/usb/msm_hsusb.h +++ b/include/linux/usb/msm_hsusb.h @@ -2,7 +2,8 @@ * * Copyright (C) 2008 Google, Inc. * Author: Brian Swetland - * Copyright (c) 2009-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2009-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, Inc. * * This software is licensed under the terms of the GNU General Public * License version 2, as published by the Free Software Foundation, and @@ -120,9 +121,10 @@ enum msm_usb_phy_type { QUSB_ULPI_PHY, }; -#define IDEV_CHG_MAX 1500 +#define IDEV_CHG_MAX 1000 #define IUNIT 100 #define IDEV_HVDCP_CHG_MAX 1800 +#define IDEV_CHG_MIN 500 /** * Different states involved in USB charger detection. @@ -421,6 +423,8 @@ struct msm_otg { struct clk *phy_csr_clk; struct clk *bus_clks[USB_NUM_BUS_CLOCKS]; struct clk *phy_ref_clk; + spinlock_t otg_phy_clk_lock; + bool otg_phy_clk_enable; long core_clk_rate; long core_clk_svs_rate; long core_clk_nominal_rate; @@ -654,9 +658,13 @@ static inline bool msm_usb_bam_enable(enum usb_ctrl ctrl, bool bam_enable) int msm_do_bam_disable_enable(enum usb_ctrl ctrl) { return true; } #endif #ifdef CONFIG_USB_CI13XXX_MSM +void msm_hw_soft_reset(void); void msm_hw_bam_disable(bool bam_disable); void msm_usb_irq_disable(bool disable); #else +static inline void msm_hw_soft_reset(void) +{ +} static inline void msm_hw_bam_disable(bool bam_disable) { } diff --git a/include/linux/usb_bam.h b/include/linux/usb_bam.h index ebc2fe898bef2..80bbd8c8a6836 100644 --- a/include/linux/usb_bam.h +++ b/include/linux/usb_bam.h @@ -209,7 +209,6 @@ struct usb_bam_pipe_connect { * can work at in bam2bam mode when connected to HS host. * @max_mbps_superspeed: Maximum Mbits per seconds that the USB core * can work at in bam2bam mode when connected to SS host. - * @enable_hsusb_bam_on_boot: Enable HSUSB BAM (non-NDP) on bootup itself */ struct msm_usb_bam_platform_data { u8 max_connections; @@ -222,7 +221,6 @@ struct msm_usb_bam_platform_data { u32 override_threshold; u32 max_mbps_highspeed; u32 max_mbps_superspeed; - bool enable_hsusb_bam_on_boot; enum usb_ctrl bam_type; }; diff --git a/include/linux/wcnss_wlan.h b/include/linux/wcnss_wlan.h index c93364b861d9e..cd4c004d7ea1d 100644 --- a/include/linux/wcnss_wlan.h +++ b/include/linux/wcnss_wlan.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2011-2016, 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 @@ -42,7 +42,7 @@ struct wcnss_wlan_config { int is_pronto_vadc; int is_pronto_v3; void __iomem *msm_wcnss_base; - int iris_id; + unsigned int iris_id; int vbatt; struct vregs_level pronto_vlevel[PRONTO_REGULATORS]; struct vregs_level iris_vlevel[IRIS_REGULATORS]; @@ -124,6 +124,7 @@ void wcnss_suspend_notify(void); void wcnss_resume_notify(void); void wcnss_riva_log_debug_regs(void); void wcnss_pronto_log_debug_regs(void); +void wcnss_pronto_dump_regs(void); int wcnss_is_hw_pronto_ver3(void); int wcnss_device_ready(void); bool wcnss_cbc_complete(void); diff --git a/include/linux/zpool.h b/include/linux/zpool.h index 56529b34dc635..2e97b7707dffc 100644 --- a/include/linux/zpool.h +++ b/include/linux/zpool.h @@ -36,10 +36,12 @@ enum zpool_mapmode { ZPOOL_MM_DEFAULT = ZPOOL_MM_RW }; -struct zpool *zpool_create_pool(char *type, char *name, - gfp_t gfp, struct zpool_ops *ops); +bool zpool_has_pool(char *type); -char *zpool_get_type(struct zpool *pool); +struct zpool *zpool_create_pool(const char *type, const char *name, + gfp_t gfp, const struct zpool_ops *ops); + +const char *zpool_get_type(struct zpool *pool); void zpool_destroy_pool(struct zpool *pool); @@ -81,7 +83,10 @@ struct zpool_driver { atomic_t refcount; struct list_head list; - void *(*create)(char *name, gfp_t gfp, struct zpool_ops *ops); + void *(*create)(const char *name, + gfp_t gfp, + const struct zpool_ops *ops, + struct zpool *zpool); void (*destroy)(void *pool); int (*malloc)(void *pool, size_t size, gfp_t gfp, @@ -102,6 +107,4 @@ void zpool_register_driver(struct zpool_driver *driver); int zpool_unregister_driver(struct zpool_driver *driver); -int zpool_evict(void *pool, unsigned long handle); - #endif diff --git a/include/linux/zsmalloc.h b/include/linux/zsmalloc.h index 1338190b54783..57a8e98f2708c 100644 --- a/include/linux/zsmalloc.h +++ b/include/linux/zsmalloc.h @@ -34,12 +34,17 @@ enum zs_mapmode { */ }; +struct zs_pool_stats { + /* How many pages were migrated (freed) */ + unsigned long pages_compacted; +}; + struct zs_pool; -struct zs_pool *zs_create_pool(char *name, gfp_t flags); +struct zs_pool *zs_create_pool(const char *name); void zs_destroy_pool(struct zs_pool *pool); -unsigned long zs_malloc(struct zs_pool *pool, size_t size); +unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t flags); void zs_free(struct zs_pool *pool, unsigned long obj); void *zs_map_object(struct zs_pool *pool, unsigned long handle, @@ -49,4 +54,5 @@ void zs_unmap_object(struct zs_pool *pool, unsigned long handle); unsigned long zs_get_total_pages(struct zs_pool *pool); unsigned long zs_compact(struct zs_pool *pool); +void zs_pool_stats(struct zs_pool *pool, struct zs_pool_stats *stats); #endif diff --git a/include/media/msm_cam_sensor.h b/include/media/msm_cam_sensor.h index fb650ab2693f8..75d0912aa459f 100644 --- a/include/media/msm_cam_sensor.h +++ b/include/media/msm_cam_sensor.h @@ -2,6 +2,7 @@ #define __LINUX_MSM_CAM_SENSOR_H #include +#include #include @@ -72,6 +73,16 @@ struct csid_cfg_data32 { } cfg; }; +struct msm_ir_led_cfg_data_t32 { + enum msm_ir_led_cfg_type_t cfg_type; + int32_t pwm_duty_on_ns; + int32_t pwm_period_ns; +}; + +struct msm_ir_cut_cfg_data_t32 { + enum msm_ir_cut_cfg_type_t cfg_type; +}; + struct eeprom_read_t32 { compat_uptr_t dbuffer; uint32_t num_bytes; @@ -258,6 +269,12 @@ struct msm_flash_cfg_data_t32 { #define VIDIOC_MSM_FLASH_CFG32 \ _IOWR('V', BASE_VIDIOC_PRIVATE + 13, struct msm_flash_cfg_data_t32) + +#define VIDIOC_MSM_IR_LED_CFG32 \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 14, struct msm_ir_led_cfg_data_t32) + +#define VIDIOC_MSM_IR_CUT_CFG32 \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 15, struct msm_ir_cut_cfg_data_t32) #endif #endif diff --git a/include/media/msmb_pproc.h b/include/media/msmb_pproc.h index 623fbfce6c675..1e677f95a375e 100644 --- a/include/media/msmb_pproc.h +++ b/include/media/msmb_pproc.h @@ -5,6 +5,8 @@ #include +#define MSM_OUTPUT_BUF_CNT 8 + #ifdef CONFIG_COMPAT struct msm_cpp_frame_info32_t { int32_t frame_id; @@ -26,7 +28,7 @@ struct msm_cpp_frame_info32_t { uint32_t feature_mask; uint8_t we_disable; struct msm_cpp_buffer_info_t input_buffer_info; - struct msm_cpp_buffer_info_t output_buffer_info[8]; + struct msm_cpp_buffer_info_t output_buffer_info[MSM_OUTPUT_BUF_CNT]; struct msm_cpp_buffer_info_t duplicate_buffer_info; struct msm_cpp_buffer_info_t tnr_scratch_buffer_info[2]; uint32_t reserved; diff --git a/include/net/cnss.h b/include/net/cnss.h index 7d0e7be951c1f..bda4e57873d73 100644 --- a/include/net/cnss.h +++ b/include/net/cnss.h @@ -18,6 +18,7 @@ #include #ifdef CONFIG_CNSS +#define MAX_FIRMWARE_SIZE (1 * 1024 * 1024) #define CNSS_MAX_FILE_NAME 20 #define PINCTRL_SLEEP 0 #define PINCTRL_ACTIVE 1 diff --git a/include/net/tcp.h b/include/net/tcp.h index b35a773acf291..919428932e92f 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h @@ -1085,6 +1085,7 @@ static inline void tcp_prequeue_init(struct tcp_sock *tp) } bool tcp_prequeue(struct sock *sk, struct sk_buff *skb); +int tcp_filter(struct sock *sk, struct sk_buff *skb); #undef STATE_TRACE @@ -1448,6 +1449,8 @@ static inline void tcp_check_send_head(struct sock *sk, struct sk_buff *skb_unli { if (sk->sk_send_head == skb_unlinked) sk->sk_send_head = NULL; + if (tcp_sk(sk)->highest_sack == skb_unlinked) + tcp_sk(sk)->highest_sack = NULL; } static inline void tcp_init_send_head(struct sock *sk) diff --git a/include/scsi/fc/Kbuild b/include/scsi/fc/Kbuild deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/include/soc/qcom/core_ctl.h b/include/soc/qcom/core_ctl.h deleted file mode 100644 index 39bce9fc8fdd2..0000000000000 --- a/include/soc/qcom/core_ctl.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2014-2015, 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. - */ - -#ifndef __SOC_QCOM_CORE_CTL_H -#define __SOC_QCOM_CORE_CTL_H - -extern void core_ctl_block_hotplug(void); -extern void core_ctl_unblock_hotplug(void); -extern s64 core_ctl_get_time(void); -extern struct cpufreq_policy *core_ctl_get_policy(int cpu); -extern void core_ctl_put_policy(struct cpufreq_policy *policy); -extern struct device *core_ctl_find_cpu_device(unsigned cpu); -extern int core_ctl_online_core(unsigned int cpu); -extern int core_ctl_offline_core(unsigned int cpu); - -#endif diff --git a/include/soc/qcom/qseecomi.h b/include/soc/qcom/qseecomi.h index 1349a3440e222..e33fd9fc1841a 100644 --- a/include/soc/qcom/qseecomi.h +++ b/include/soc/qcom/qseecomi.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2016, 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 @@ -18,6 +18,7 @@ #define QSEECOM_KEY_ID_SIZE 32 +#define QSEOS_RESULT_FAIL_SEND_CMD_NO_THREAD -19 /*0xFFFFFFED*/ #define QSEOS_RESULT_FAIL_UNSUPPORTED_CE_PIPE -63 #define QSEOS_RESULT_FAIL_KS_OP -64 #define QSEOS_RESULT_FAIL_KEY_ID_EXISTS -65 @@ -64,6 +65,10 @@ enum qseecom_qceos_cmd_id { QSEOS_TEE_REQUEST_CANCELLATION, QSEOS_CONTINUE_BLOCKED_REQ_COMMAND, QSEOS_RPMB_CHECK_PROV_STATUS_COMMAND = 0x1B, + QSEOS_CLIENT_SEND_DATA_COMMAND_WHITELIST = 0x1C, + QSEOS_TEE_OPEN_SESSION_WHITELIST = 0x1D, + QSEOS_TEE_INVOKE_COMMAND_WHITELIST = 0x1E, + QSEOS_LISTENER_DATA_RSP_COMMAND_WHITELIST = 0x1F, QSEOS_FSM_LTEOTA_REQ_CMD = 0x109, QSEOS_FSM_LTEOTA_REQ_RSP_CMD = 0x110, QSEOS_FSM_IKE_REQ_CMD = 0x203, @@ -181,6 +186,8 @@ __packed struct qseecom_client_send_data_ireq { uint32_t req_len; uint32_t rsp_ptr;/* First 4 bytes should be the return status */ uint32_t rsp_len; + uint32_t sglistinfo_ptr; + uint32_t sglistinfo_len; }; __packed struct qseecom_client_send_data_64bit_ireq { @@ -190,6 +197,8 @@ __packed struct qseecom_client_send_data_64bit_ireq { uint32_t req_len; uint64_t rsp_ptr; uint32_t rsp_len; + uint64_t sglistinfo_ptr; + uint32_t sglistinfo_len; }; __packed struct qseecom_reg_log_buf_ireq { @@ -209,6 +218,16 @@ __packed struct qseecom_client_listener_data_irsp { uint32_t qsee_cmd_id; uint32_t listener_id; uint32_t status; + uint32_t sglistinfo_ptr; + uint32_t sglistinfo_len; +}; + +__packed struct qseecom_client_listener_data_64bit_irsp { + uint32_t qsee_cmd_id; + uint32_t listener_id; + uint32_t status; + uint64_t sglistinfo_ptr; + uint32_t sglistinfo_len; }; /* @@ -292,6 +311,8 @@ __packed struct qseecom_qteec_ireq { uint32_t req_len; uint32_t resp_ptr; uint32_t resp_len; + uint32_t sglistinfo_ptr; + uint32_t sglistinfo_len; }; __packed struct qseecom_qteec_64bit_ireq { @@ -301,6 +322,8 @@ __packed struct qseecom_qteec_64bit_ireq { uint32_t req_len; uint64_t resp_ptr; uint32_t resp_len; + uint64_t sglistinfo_ptr; + uint32_t sglistinfo_len; }; __packed struct qseecom_client_send_fsm_key_req { @@ -658,4 +681,45 @@ __packed struct qseecom_continue_blocked_request_ireq { #define TZ_OS_CONTINUE_BLOCKED_REQUEST_ID_PARAM_ID \ TZ_SYSCALL_CREATE_PARAM_ID_1(TZ_SYSCALL_PARAM_TYPE_VAL) +#define TZ_APP_QSAPP_SEND_DATA_WITH_WHITELIST_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_TZ_APPS, \ + TZ_SVC_APP_ID_PLACEHOLDER, 0x06) + +#define TZ_APP_QSAPP_SEND_DATA_WITH_WHITELIST_ID_PARAM_ID \ + TZ_SYSCALL_CREATE_PARAM_ID_7( \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL) + +#define TZ_APP_GPAPP_OPEN_SESSION_WITH_WHITELIST_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_TZ_APPS, \ + TZ_SVC_APP_ID_PLACEHOLDER, 0x07) + +#define TZ_APP_GPAPP_OPEN_SESSION_WITH_WHITELIST_ID_PARAM_ID \ + TZ_SYSCALL_CREATE_PARAM_ID_7( \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL) + +#define TZ_APP_GPAPP_INVOKE_COMMAND_WITH_WHITELIST_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_TZ_APPS, \ + TZ_SVC_APP_ID_PLACEHOLDER, 0x09) + +#define TZ_APP_GPAPP_INVOKE_COMMAND_WITH_WHITELIST_ID_PARAM_ID \ + TZ_SYSCALL_CREATE_PARAM_ID_7( \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_BUF_RW, \ + TZ_SYSCALL_PARAM_TYPE_VAL) + +#define TZ_OS_LISTENER_RESPONSE_HANDLER_WITH_WHITELIST_ID \ + TZ_SYSCALL_CREATE_SMC_ID(TZ_OWNER_QSEE_OS, TZ_SVC_LISTENER, 0x05) + +#define TZ_OS_LISTENER_RESPONSE_HANDLER_WITH_WHITELIST_PARAM_ID \ + TZ_SYSCALL_CREATE_PARAM_ID_4( \ + TZ_SYSCALL_PARAM_TYPE_VAL, TZ_SYSCALL_PARAM_TYPE_VAL, \ + TZ_SYSCALL_PARAM_TYPE_BUF_RW, TZ_SYSCALL_PARAM_TYPE_VAL) + #endif /* __QSEECOMI_H_ */ diff --git a/include/soc/qcom/socinfo.h b/include/soc/qcom/socinfo.h index a146c32785e2d..48e169aa939d4 100644 --- a/include/soc/qcom/socinfo.h +++ b/include/soc/qcom/socinfo.h @@ -92,6 +92,8 @@ of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,msm8952") #define early_machine_is_msm8953() \ of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,msm8953") +#define early_machine_is_sdm450() \ + of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,sdm450") #define early_machine_is_msm8937() \ of_flat_dt_is_compatible(of_get_flat_dt_root(), "qcom,msm8937") #define early_machine_is_msm8996() \ @@ -136,6 +138,7 @@ #define early_machine_is_fsm9010() 0 #define early_machine_is_msm8952() 0 #define early_machine_is_msm8953() 0 +#define early_machine_is_sdm450() 0 #define early_machine_is_msm8937() 0 #define early_machine_is_msm8996() 0 #define early_machine_is_msm8976() 0 @@ -200,6 +203,7 @@ enum msm_cpu { FSM_CPU_9010, MSM_CPU_8952, MSM_CPU_8953, + MSM_CPU_SDM450, MSM_CPU_8937, MSM_CPU_8996, MSM_CPU_8976, diff --git a/include/soc/qcom/subsystem_restart.h b/include/soc/qcom/subsystem_restart.h index 3a5f6e678b4f8..88492e62972e4 100644 --- a/include/soc/qcom/subsystem_restart.h +++ b/include/soc/qcom/subsystem_restart.h @@ -18,6 +18,7 @@ #include struct subsys_device; +extern struct bus_type subsys_bus_type; enum { RESET_SOC = 0, diff --git a/include/sound/msm-dts-eagle.h b/include/sound/msm-dts-eagle.h deleted file mode 100644 index 2ef01136b7ced..0000000000000 --- a/include/sound/msm-dts-eagle.h +++ /dev/null @@ -1,148 +0,0 @@ -/* Copyright (c) 2014, 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. - */ - -#ifndef __MSM_DTS_EAGLE_H__ -#define __MSM_DTS_EAGLE_H__ - -#include -#include -#include -#include - -#ifdef CONFIG_COMPAT -enum { - DTS_EAGLE_IOCTL_GET_CACHE_SIZE32 = _IOR(0xF2, 0, __s32), - DTS_EAGLE_IOCTL_SET_CACHE_SIZE32 = _IOW(0xF2, 1, __s32), - DTS_EAGLE_IOCTL_GET_PARAM32 = _IOR(0xF2, 2, compat_uptr_t), - DTS_EAGLE_IOCTL_SET_PARAM32 = _IOW(0xF2, 3, compat_uptr_t), - DTS_EAGLE_IOCTL_SET_CACHE_BLOCK32 = - _IOW(0xF2, 4, compat_uptr_t), - DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE32 = - _IOW(0xF2, 5, compat_uptr_t), - DTS_EAGLE_IOCTL_GET_LICENSE32 = - _IOR(0xF2, 6, compat_uptr_t), - DTS_EAGLE_IOCTL_SET_LICENSE32 = - _IOW(0xF2, 7, compat_uptr_t), - DTS_EAGLE_IOCTL_SEND_LICENSE32 = _IOW(0xF2, 8, __s32), - DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS32 = _IOW(0xF2, 9, - compat_uptr_t), -}; -#endif - -#ifdef CONFIG_DTS_EAGLE -void msm_dts_ion_memmap(struct param_outband *po_); -int msm_dts_eagle_enable_asm(struct audio_client *ac, u32 enable, int module); -int msm_dts_eagle_enable_adm(int port_id, int copp_idx, u32 enable); -void msm_dts_eagle_add_controls(struct snd_soc_platform *platform); -int msm_dts_eagle_set_stream_gain(struct audio_client *ac, - int lgain, int rgain); -int msm_dts_eagle_handle_asm(struct dts_eagle_param_desc *depd, char *buf, - bool for_pre, bool get, struct audio_client *ac, - struct param_outband *po); -int msm_dts_eagle_handle_adm(struct dts_eagle_param_desc *depd, char *buf, - bool for_pre, bool get); -int msm_dts_eagle_ioctl(unsigned int cmd, unsigned long arg); -int msm_dts_eagle_is_hpx_on(void); -int msm_dts_eagle_init_pre(struct audio_client *ac); -int msm_dts_eagle_deinit_pre(struct audio_client *ac); -int msm_dts_eagle_init_post(int port_id, int copp_id); -int msm_dts_eagle_deinit_post(int port_id, int topology); -int msm_dts_eagle_init_master_module(struct audio_client *ac); -int msm_dts_eagle_deinit_master_module(struct audio_client *ac); -int msm_dts_eagle_pcm_new(struct snd_soc_pcm_runtime *runtime); -void msm_dts_eagle_pcm_free(struct snd_pcm *pcm); -int msm_dts_eagle_compat_ioctl(unsigned int cmd, unsigned long arg); -#else -static inline void msm_dts_ion_memmap(struct param_outband *po_) -{ - pr_debug("%s\n", __func__); -} -static inline int msm_dts_eagle_enable_asm(struct audio_client *ac, - u32 enable, int module) -{ - return 0; -} -static inline int msm_dts_eagle_enable_adm(int port_id, int copp_idx, - u32 enable) -{ - return 0; -} -static inline void msm_dts_eagle_add_controls(struct snd_soc_platform *platform) -{ -} -static inline int msm_dts_eagle_set_stream_gain(struct audio_client *ac, - int lgain, int rgain) -{ - pr_debug("%s\n", __func__); - return 0; -} -static inline int msm_dts_eagle_handle_asm(struct dts_eagle_param_desc *depd, - char *buf, bool for_pre, bool get, - struct audio_client *ac, - struct param_outband *po) -{ - return 0; -} -static inline int msm_dts_eagle_handle_adm(struct dts_eagle_param_desc *depd, - char *buf, bool for_pre, bool get) -{ - return 0; -} -static inline int msm_dts_eagle_ioctl(unsigned int cmd, unsigned long arg) -{ - return -EPERM; -} -static inline int msm_dts_eagle_is_hpx_on(void) -{ - return 0; -} -static inline int msm_dts_eagle_init_pre(struct audio_client *ac) -{ - return 0; -} -static inline int msm_dts_eagle_deinit_pre(struct audio_client *ac) -{ - return 0; -} -static inline int msm_dts_eagle_init_post(int port_id, int coppid) -{ - return 0; -} -static inline int msm_dts_eagle_deinit_post(int port_id, int topology) -{ - return 0; -} -static inline int msm_dts_eagle_init_master_module(struct audio_client *ac) -{ - return 0; -} -static inline int msm_dts_eagle_deinit_master_module(struct audio_client *ac) -{ - return 0; -} -static inline int msm_dts_eagle_pcm_new(struct snd_soc_pcm_runtime *runtime) -{ - pr_debug("%s\n", __func__); - return 0; -} -static inline void msm_dts_eagle_pcm_free(struct snd_pcm *pcm) -{ - pr_debug("%s\n", __func__); -} -static inline int msm_dts_eagle_compat_ioctl(unsigned int cmd, - unsigned long arg) -{ - return 0; -} -#endif - -#endif diff --git a/include/sound/q6adm-v2.h b/include/sound/q6adm-v2.h index 47e8e2a739201..222071da9b7f3 100644 --- a/include/sound/q6adm-v2.h +++ b/include/sound/q6adm-v2.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -34,7 +34,6 @@ enum { ADM_AUDVOL_CAL, ADM_RTAC_INFO_CAL, ADM_RTAC_APR_CAL, - ADM_DTS_EAGLE, ADM_SRS_TRUMEDIA, ADM_RTAC_AUDVOL_CAL, ADM_MAX_CAL_TYPES diff --git a/include/sound/q6asm-v2.h b/include/sound/q6asm-v2.h index 679894f64f722..2ede9701be704 100644 --- a/include/sound/q6asm-v2.h +++ b/include/sound/q6asm-v2.h @@ -184,6 +184,7 @@ struct audio_client { int session; app_cb cb; atomic_t cmd_state; + atomic_t cmd_state_pp; /* Relative or absolute TS */ atomic_t time_flag; atomic_t nowait_cmd_cnt; @@ -227,7 +228,7 @@ struct audio_client *q6asm_get_audio_client(int session_id); int q6asm_audio_client_buf_alloc(unsigned int dir/* 1:Out,0:In */, struct audio_client *ac, unsigned int bufsz, - unsigned int bufcnt); + uint32_t bufcnt); int q6asm_audio_client_buf_alloc_contiguous(unsigned int dir /* 1:Out,0:In */, struct audio_client *ac, diff --git a/include/sound/rawmidi.h b/include/sound/rawmidi.h index 5bd2bfbf6dd11..0afad5cd6253a 100644 --- a/include/sound/rawmidi.h +++ b/include/sound/rawmidi.h @@ -77,6 +77,7 @@ struct snd_rawmidi_runtime { size_t xruns; /* over/underruns counter */ /* misc */ spinlock_t lock; + struct mutex realloc_mutex; wait_queue_head_t sleep; /* event handler (new bytes, input only) */ void (*event)(struct snd_rawmidi_substream *substream); diff --git a/include/trace/events/power.h b/include/trace/events/power.h index c4085df07cc15..3b7dae87b6b35 100644 --- a/include/trace/events/power.h +++ b/include/trace/events/power.h @@ -619,49 +619,6 @@ DEFINE_EVENT(dev_pm_qos_request, dev_pm_qos_remove_request, TP_ARGS(name, type, new_value) ); -TRACE_EVENT(core_ctl_eval_need, - - TP_PROTO(unsigned int cpu, unsigned int old_need, - unsigned int new_need, unsigned int updated), - TP_ARGS(cpu, old_need, new_need, updated), - TP_STRUCT__entry( - __field(u32, cpu) - __field(u32, old_need) - __field(u32, new_need) - __field(u32, updated) - ), - TP_fast_assign( - __entry->cpu = cpu; - __entry->old_need = old_need; - __entry->new_need = new_need; - __entry->updated = updated; - ), - TP_printk("cpu=%u, old_need=%u, new_need=%u, updated=%u", __entry->cpu, - __entry->old_need, __entry->new_need, __entry->updated) -); - -TRACE_EVENT(core_ctl_set_busy, - - TP_PROTO(unsigned int cpu, unsigned int busy, - unsigned int old_is_busy, unsigned int is_busy), - TP_ARGS(cpu, busy, old_is_busy, is_busy), - TP_STRUCT__entry( - __field(u32, cpu) - __field(u32, busy) - __field(u32, old_is_busy) - __field(u32, is_busy) - ), - TP_fast_assign( - __entry->cpu = cpu; - __entry->busy = busy; - __entry->old_is_busy = old_is_busy; - __entry->is_busy = is_busy; - ), - TP_printk("cpu=%u, busy=%u, old_is_busy=%u, new_is_busy=%u", - __entry->cpu, __entry->busy, __entry->old_is_busy, - __entry->is_busy) -); - DECLARE_EVENT_CLASS(kpm_module, TP_PROTO(unsigned int managed_cpus, unsigned int max_cpus), diff --git a/include/trace/events/qhmp_sched.h b/include/trace/events/qhmp_sched.h index 1fda71251c16c..8f2ea8cbc8315 100644 --- a/include/trace/events/qhmp_sched.h +++ b/include/trace/events/qhmp_sched.h @@ -1045,6 +1045,50 @@ TRACE_EVENT(sched_get_nr_running_avg, TP_printk("avg=%d big_avg=%d iowait_avg=%d", __entry->avg, __entry->big_avg, __entry->iowait_avg) ); + +TRACE_EVENT(core_ctl_eval_need, + + TP_PROTO(unsigned int cpu, unsigned int old_need, + unsigned int new_need, unsigned int updated), + TP_ARGS(cpu, old_need, new_need, updated), + TP_STRUCT__entry( + __field(u32, cpu) + __field(u32, old_need) + __field(u32, new_need) + __field(u32, updated) + ), + TP_fast_assign( + __entry->cpu = cpu; + __entry->old_need = old_need; + __entry->new_need = new_need; + __entry->updated = updated; + ), + TP_printk("cpu=%u, old_need=%u, new_need=%u, updated=%u", __entry->cpu, + __entry->old_need, __entry->new_need, __entry->updated) +); + +TRACE_EVENT(core_ctl_set_busy, + + TP_PROTO(unsigned int cpu, unsigned int busy, + unsigned int old_is_busy, unsigned int is_busy), + TP_ARGS(cpu, busy, old_is_busy, is_busy), + TP_STRUCT__entry( + __field(u32, cpu) + __field(u32, busy) + __field(u32, old_is_busy) + __field(u32, is_busy) + ), + TP_fast_assign( + __entry->cpu = cpu; + __entry->busy = busy; + __entry->old_is_busy = old_is_busy; + __entry->is_busy = is_busy; + ), + TP_printk("cpu=%u, busy=%u, old_is_busy=%u, new_is_busy=%u", + __entry->cpu, __entry->busy, __entry->old_is_busy, + __entry->is_busy) +); + #endif /* _TRACE_SCHED_H */ /* This part must be outside protection */ diff --git a/include/trace/events/sched.h b/include/trace/events/sched.h index 9452f5e789dd3..9c0c1f9d1577f 100644 --- a/include/trace/events/sched.h +++ b/include/trace/events/sched.h @@ -1269,6 +1269,49 @@ TRACE_EVENT(sched_get_nr_running_avg, __entry->avg, __entry->big_avg, __entry->iowait_avg) ); +TRACE_EVENT(core_ctl_eval_need, + + TP_PROTO(unsigned int cpu, unsigned int old_need, + unsigned int new_need, unsigned int updated), + TP_ARGS(cpu, old_need, new_need, updated), + TP_STRUCT__entry( + __field(u32, cpu) + __field(u32, old_need) + __field(u32, new_need) + __field(u32, updated) + ), + TP_fast_assign( + __entry->cpu = cpu; + __entry->old_need = old_need; + __entry->new_need = new_need; + __entry->updated = updated; + ), + TP_printk("cpu=%u, old_need=%u, new_need=%u, updated=%u", __entry->cpu, + __entry->old_need, __entry->new_need, __entry->updated) +); + +TRACE_EVENT(core_ctl_set_busy, + + TP_PROTO(unsigned int cpu, unsigned int busy, + unsigned int old_is_busy, unsigned int is_busy), + TP_ARGS(cpu, busy, old_is_busy, is_busy), + TP_STRUCT__entry( + __field(u32, cpu) + __field(u32, busy) + __field(u32, old_is_busy) + __field(u32, is_busy) + ), + TP_fast_assign( + __entry->cpu = cpu; + __entry->busy = busy; + __entry->old_is_busy = old_is_busy; + __entry->is_busy = is_busy; + ), + TP_printk("cpu=%u, busy=%u, old_is_busy=%u, new_is_busy=%u", + __entry->cpu, __entry->busy, __entry->old_is_busy, + __entry->is_busy) +); + #endif /* _TRACE_SCHED_H */ /* This part must be outside protection */ diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild index cdaa0e68b1e10..fc5e588e818cf 100644 --- a/include/uapi/linux/Kbuild +++ b/include/uapi/linux/Kbuild @@ -22,6 +22,7 @@ header-y += usb/ header-y += wimax/ header-y += ../../../drivers/staging/android/uapi/ header-y += mfd/ +header-y += nfc/ genhdr-y += version.h diff --git a/include/uapi/linux/ashmem.h b/include/uapi/linux/ashmem.h index c8d93499d8b2e..8861e960c221c 100644 --- a/include/uapi/linux/ashmem.h +++ b/include/uapi/linux/ashmem.h @@ -34,9 +34,6 @@ struct ashmem_pin { #define ASHMEM_UNPIN _IOW(__ASHMEMIOC, 8, struct ashmem_pin) #define ASHMEM_GET_PIN_STATUS _IO(__ASHMEMIOC, 9) #define ASHMEM_PURGE_ALL_CACHES _IO(__ASHMEMIOC, 10) -#define ASHMEM_CACHE_FLUSH_RANGE _IO(__ASHMEMIOC, 11) -#define ASHMEM_CACHE_CLEAN_RANGE _IO(__ASHMEMIOC, 12) -#define ASHMEM_CACHE_INV_RANGE _IO(__ASHMEMIOC, 13) #endif /* _UAPI_LINUX_ASHMEM_H */ diff --git a/include/uapi/linux/input.h b/include/uapi/linux/input.h index 7082516374d27..6db9562a0ac78 100644 --- a/include/uapi/linux/input.h +++ b/include/uapi/linux/input.h @@ -481,6 +481,11 @@ struct input_keymap_entry { #define KEY_MICMUTE 248 /* Mute / unmute the microphone */ +#define KEY_NEXTSONG_NEW 250 +#define KEY_PREVIOUSSONG_NEW 251 + +#define KEY_ANTENNA_DET 252 +#define KEY_ANTENNA_DET_UP 253 /* Code 255 is reserved for special needs of AT keyboard driver */ #define BTN_MISC 0x100 diff --git a/include/uapi/linux/msm_mdp.h b/include/uapi/linux/msm_mdp.h index 62efc33a2e048..00847271c3f2e 100644 --- a/include/uapi/linux/msm_mdp.h +++ b/include/uapi/linux/msm_mdp.h @@ -71,6 +71,11 @@ #define MSMFB_MDP_PP_GET_FEATURE_VERSION _IOWR(MSMFB_IOCTL_MAGIC, 171, \ struct mdp_pp_feature_version) +#define MSMFB_ENHANCE_SET_GAMMA _IOWR(MSMFB_IOCTL_MAGIC, 172, unsigned int) +#define MSMFB_ENHANCE_SET_CE _IOWR(MSMFB_IOCTL_MAGIC, 173, unsigned int) +#define MSMFB_ENHANCE_SET_EYE _IOWR(MSMFB_IOCTL_MAGIC, 174, unsigned int) +#define MSMFB_SET_CABC _IOWR(MSMFB_IOCTL_MAGIC, 175, unsigned int) + #define FB_TYPE_3D_PANEL 0x10101010 #define MDP_IMGTYPE2_START 0x10000 #define MSMFB_DRIVER_VERSION 0xF9E8D701 @@ -1368,12 +1373,21 @@ enum { MDP_WRITEBACK_MIRROR_RESUME, }; +/* + * The enum values are continued below as preprocessor macro definitions + */ enum mdp_color_space { MDP_CSC_ITU_R_601, MDP_CSC_ITU_R_601_FR, MDP_CSC_ITU_R_709, }; +/* + * These definitions are a continuation of the mdp_color_space enum above + */ +#define MDP_CSC_ITU_R_2020 (MDP_CSC_ITU_R_709 + 1) +#define MDP_CSC_ITU_R_2020_FR (MDP_CSC_ITU_R_2020 + 1) + enum { mdp_igc_v1_7 = 1, mdp_igc_vmax, diff --git a/include/uapi/linux/nfc/Kbuild b/include/uapi/linux/nfc/Kbuild new file mode 100644 index 0000000000000..90710153e4626 --- /dev/null +++ b/include/uapi/linux/nfc/Kbuild @@ -0,0 +1,2 @@ +#UAPI export list +header-y += nfcinfo.h diff --git a/include/uapi/linux/nfc/nfcinfo.h b/include/uapi/linux/nfc/nfcinfo.h new file mode 100644 index 0000000000000..df178e2bbae6d --- /dev/null +++ b/include/uapi/linux/nfc/nfcinfo.h @@ -0,0 +1,21 @@ +#ifndef _UAPI_NFCINFO_H_ +#define _UAPI_NFCINFO_H_ + +#include + +#define NFCC_MAGIC 0xE9 +#define NFCC_GET_INFO _IOW(NFCC_MAGIC, 0x09, unsigned int) + +struct nqx_devinfo { + unsigned char chip_type; + unsigned char rom_version; + unsigned char fw_major; + unsigned char fw_minor; +}; + +union nqx_uinfo { + unsigned int i; + struct nqx_devinfo info; +}; + +#endif diff --git a/include/uapi/linux/usb/video.h b/include/uapi/linux/usb/video.h index 3b3b95e01f71b..b638f016aa214 100644 --- a/include/uapi/linux/usb/video.h +++ b/include/uapi/linux/usb/video.h @@ -53,6 +53,8 @@ #define UVC_VS_FORMAT_FRAME_BASED 0x10 #define UVC_VS_FRAME_FRAME_BASED 0x11 #define UVC_VS_FORMAT_STREAM_BASED 0x12 +#define UVC_VS_FORMAT_H264 0x13 +#define UVC_VS_FRAME_H264 0x14 /* A.7. Video Class-Specific Endpoint Descriptor Subtypes */ #define UVC_EP_UNDEFINED 0x00 @@ -298,11 +300,12 @@ struct uvc_processing_unit_descriptor { __u8 bSourceID; __u16 wMaxMultiplier; __u8 bControlSize; - __u8 bmControls[2]; + __u8 bmControls[3]; __u8 iProcessing; + __u8 bmVideoStandards; } __attribute__((__packed__)); -#define UVC_DT_PROCESSING_UNIT_SIZE(n) (9+(n)) +#define UVC_DT_PROCESSING_UNIT_SIZE(n) (10+(n)) /* 3.7.2.6. Extension Unit Descriptor */ struct uvc_extension_unit_descriptor { @@ -564,5 +567,96 @@ struct UVC_FRAME_MJPEG(n) { \ __u32 dwFrameInterval[n]; \ } __attribute__ ((packed)) +/* H264 Payload - 3.1.1. H264 Video Format Descriptor */ +struct uvc_format_h264 { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bFormatIndex; + __u8 bNumFrameDescriptors; + __u8 bDefaultFrameIndex; + __u8 bMaxCodecConfigDelay; + __u8 bmSupportedSliceModes; + __u8 bmSupportedSyncFrameTypes; + __u8 bResolutionScaling; + __u8 Reserved1; + __u8 bmSupportedRateControlModes; + __u16 wMaxMBperSecOneResNoScalability; + __u16 wMaxMBperSecTwoResNoScalability; + __u16 wMaxMBperSecThreeResNoScalability; + __u16 wMaxMBperSecFourResNoScalability; + __u16 wMaxMBperSecOneResTemporalScalability; + __u16 wMaxMBperSecTwoResTemporalScalability; + __u16 wMaxMBperSecThreeResTemporalScalability; + __u16 wMaxMBperSecFourResTemporalScalability; + __u16 wMaxMBperSecOneResTemporalQualityScalability; + __u16 wMaxMBperSecTwoResTemporalQualityScalability; + __u16 wMaxMBperSecThreeResTemporalQualityScalability; + __u16 wMaxMBperSecFourResTemporalQualityScalability; + __u16 wMaxMBperSecOneResTemporalSpatialScalability; + __u16 wMaxMBperSecTwoResTemporalSpatialScalability; + __u16 wMaxMBperSecThreeResTemporalSpatialScalability; + __u16 wMaxMBperSecFourResTemporalSpatialScalability; + __u16 wMaxMBperSecOneResFullScalability; + __u16 wMaxMBperSecTwoResFullScalability; + __u16 wMaxMBperSecThreeResFullScalability; + __u16 wMaxMBperSecFourResFullScalability; +} __attribute__((__packed__)); + +#define UVC_DT_FORMAT_H264_SIZE 52 + +/* H264 Payload - 3.1.2. H264 Video Frame Descriptor */ +struct uvc_frame_h264 { + __u8 bLength; + __u8 bDescriptorType; + __u8 bDescriptorSubType; + __u8 bFrameIndex; + __u16 wWidth; + __u16 wHeight; + __u16 wSARwidth; + __u16 wSARheight; + __u16 wProfile; + __u8 bLevelIDC; + __u16 wConstrainedToolset; + __u32 bmSupportedUsages; + __u16 bmCapabilities; + __u32 bmSVCCapabilities; + __u32 bmMVCCapabilities; + __u32 dwMinBitRate; + __u32 dwMaxBitRate; + __u32 dwDefaultFrameInterval; + __u8 bNumFrameIntervals; + __u32 dwFrameInterval[]; +} __attribute__((__packed__)); + +#define UVC_DT_FRAME_H264_SIZE(n) (44+4*(n)) + +#define UVC_FRAME_H264(n) \ + uvc_frame_h264_##n + +#define DECLARE_UVC_FRAME_H264(n) \ +struct UVC_FRAME_H264(n) { \ + __u8 bLength; \ + __u8 bDescriptorType; \ + __u8 bDescriptorSubType; \ + __u8 bFrameIndex; \ + __u16 wWidth; \ + __u16 wHeight; \ + __u16 wSARwidth; \ + __u16 wSARheight; \ + __u16 wProfile; \ + __u8 bLevelIDC; \ + __u16 wConstrainedToolset; \ + __u32 bmSupportedUsages; \ + __u16 bmCapabilities; \ + __u32 bmSVCCapabilities; \ + __u32 bmMVCCapabilities; \ + __u32 dwMinBitRate; \ + __u32 dwMaxBitRate; \ + __u32 dwDefaultFrameInterval; \ + __u8 bNumFrameIntervals; \ + __u32 dwFrameInterval[n]; \ +} __attribute__ ((packed)) + #endif /* __LINUX_USB_VIDEO_H */ diff --git a/include/uapi/linux/v4l2-controls.h b/include/uapi/linux/v4l2-controls.h index d207652370a2d..7d79484c8f3f9 100644 --- a/include/uapi/linux/v4l2-controls.h +++ b/include/uapi/linux/v4l2-controls.h @@ -1200,6 +1200,15 @@ enum v4l2_mpeg_vidc_video_h264_transform_8x8 { V4L2_MPEG_VIDC_VIDEO_H264_TRANSFORM_8x8_ENABLE = 1, }; +#define V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_TYPE \ + (V4L2_CID_MPEG_MSM_VIDC_BASE + 100) +enum v4l2_mpeg_vidc_video_venc_iframesize_type { + V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_DEFAULT, + V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_MEDIUM, + V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_HUGE, + V4L2_CID_MPEG_VIDC_VIDEO_IFRAME_SIZE_UNLIMITED, +}; + /* Camera class control IDs */ #define V4L2_CID_CAMERA_CLASS_BASE (V4L2_CTRL_CLASS_CAMERA | 0x900) diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h index d2cf8c2973d37..b9e7193a15e29 100644 --- a/include/uapi/linux/videodev2.h +++ b/include/uapi/linux/videodev2.h @@ -1902,6 +1902,7 @@ struct v4l2_streamparm { #define V4L2_EVENT_BITDEPTH_FLAG 0x1 #define V4L2_EVENT_PICSTRUCT_FLAG 0x2 +#define V4L2_EVENT_COLOUR_SPACE_FLAG 0x4 #define V4L2_EVENT_MSM_VIDC_START (V4L2_EVENT_PRIVATE_START + 0x00001000) #define V4L2_EVENT_MSM_VIDC_FLUSH_DONE (V4L2_EVENT_MSM_VIDC_START + 1) diff --git a/include/uapi/media/msm_cam_sensor.h b/include/uapi/media/msm_cam_sensor.h index 540a96c57e5b9..3f0e0f7596ab0 100644 --- a/include/uapi/media/msm_cam_sensor.h +++ b/include/uapi/media/msm_cam_sensor.h @@ -83,6 +83,8 @@ enum sensor_sub_module_t { SUB_MODULE_CSIPHY_3D, SUB_MODULE_OIS, SUB_MODULE_EXT, + SUB_MODULE_IR_LED, + SUB_MODULE_IR_CUT, SUB_MODULE_MAX, }; @@ -286,11 +288,21 @@ struct msm_eeprom_info_t { struct msm_eeprom_memory_map_array *mem_map_array; }; +struct msm_ir_led_cfg_data_t { + enum msm_ir_led_cfg_type_t cfg_type; + int32_t pwm_duty_on_ns; + int32_t pwm_period_ns; +}; + +struct msm_ir_cut_cfg_data_t { + enum msm_ir_cut_cfg_type_t cfg_type; +}; + struct msm_eeprom_cfg_data { enum eeprom_cfg_type_t cfgtype; uint8_t is_supported; union { - char eeprom_name[MAX_SENSOR_NAME]; + char eeprom_name[MAX_EEPROM_NAME]; struct eeprom_get_t get_data; struct eeprom_read_t read_data; struct eeprom_write_t write_data; @@ -586,5 +598,11 @@ struct sensor_init_cfg_data { #define VIDIOC_MSM_OIS_CFG_DOWNLOAD \ _IOWR('V', BASE_VIDIOC_PRIVATE + 14, struct msm_ois_cfg_download_data) +#define VIDIOC_MSM_IR_LED_CFG \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 15, struct msm_ir_led_cfg_data_t) + +#define VIDIOC_MSM_IR_CUT_CFG \ + _IOWR('V', BASE_VIDIOC_PRIVATE + 15, struct msm_ir_cut_cfg_data_t) + #endif diff --git a/include/uapi/media/msm_camsensor_sdk.h b/include/uapi/media/msm_camsensor_sdk.h index 01e52b6f7b44e..ad0825e332177 100644 --- a/include/uapi/media/msm_camsensor_sdk.h +++ b/include/uapi/media/msm_camsensor_sdk.h @@ -114,6 +114,15 @@ enum msm_sensor_power_seq_gpio_t { SENSOR_GPIO_MAX, }; +enum msm_ir_cut_filter_gpio_t { + IR_CUT_FILTER_GPIO_P = 0, + IR_CUT_FILTER_GPIO_M, + IR_CUT_FILTER_GPIO_MAX, +}; +#define IR_CUT_FILTER_GPIO_P IR_CUT_FILTER_GPIO_P +#define IR_CUT_FILTER_GPIO_M IR_CUT_FILTER_GPIO_M +#define R_CUT_FILTER_GPIO_MAX IR_CUT_FILTER_GPIO_MAX + enum msm_camera_vreg_name_t { CAM_VDIG, CAM_VIO, @@ -182,6 +191,28 @@ enum msm_flash_cfg_type_t { CFG_FLASH_HIGH, }; +enum msm_ir_led_cfg_type_t { + CFG_IR_LED_INIT = 0, + CFG_IR_LED_RELEASE, + CFG_IR_LED_OFF, + CFG_IR_LED_ON, +}; +#define CFG_IR_LED_INIT CFG_IR_LED_INIT +#define CFG_IR_LED_RELEASE CFG_IR_LED_RELEASE +#define CFG_IR_LED_OFF CFG_IR_LED_OFF +#define CFG_IR_LED_ON CFG_IR_LED_ON + +enum msm_ir_cut_cfg_type_t { + CFG_IR_CUT_INIT = 0, + CFG_IR_CUT_RELEASE, + CFG_IR_CUT_OFF, + CFG_IR_CUT_ON, +}; +#define CFG_IR_CUT_INIT CFG_IR_CUT_INIT +#define CFG_IR_CUT_RELEASE CFG_IR_CUT_RELEASE +#define CFG_IR_CUT_OFF CFG_IR_CUT_OFF +#define CFG_IR_CUT_ON CFG_IR_CUT_ON + enum msm_sensor_output_format_t { MSM_SENSOR_BAYER, MSM_SENSOR_YCBCR, diff --git a/include/uapi/media/msm_jpeg_dma.h b/include/uapi/media/msm_jpeg_dma.h index 44fa4ed8af520..df3c7ee5b7cfc 100644 --- a/include/uapi/media/msm_jpeg_dma.h +++ b/include/uapi/media/msm_jpeg_dma.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2016, 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 @@ -18,4 +18,10 @@ /* msm jpeg dma control ID's */ #define V4L2_CID_JPEG_DMA_SPEED (V4L2_CID_PRIVATE_BASE) +/* msm_jpeg_dma_buf */ +struct msm_jpeg_dma_buff { + int32_t fd; + uint32_t offset; +}; + #endif /* __UAPI_MSM_JPEG_DMA__ */ diff --git a/include/uapi/media/msm_vidc.h b/include/uapi/media/msm_vidc.h index b259bdef8a937..e9370cb660b29 100644 --- a/include/uapi/media/msm_vidc.h +++ b/include/uapi/media/msm_vidc.h @@ -245,7 +245,7 @@ enum msm_vidc_extradata_type { MSM_VIDC_EXTRADATA_DIGITAL_ZOOM = 0x07000010, #define MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO \ MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO - MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO = 0x070000011, + MSM_VIDC_EXTRADATA_VPX_COLORSPACE_INFO = 0x00000014, MSM_VIDC_EXTRADATA_MULTISLICE_INFO = 0x7F100000, MSM_VIDC_EXTRADATA_NUM_CONCEALED_MB = 0x7F100001, MSM_VIDC_EXTRADATA_INDEX = 0x7F100002, diff --git a/include/uapi/media/msmb_camera.h b/include/uapi/media/msmb_camera.h index fe70daa772df1..071331ef68829 100644 --- a/include/uapi/media/msmb_camera.h +++ b/include/uapi/media/msmb_camera.h @@ -48,7 +48,9 @@ #define MSM_CAMERA_SUBDEV_SENSOR_INIT 14 #define MSM_CAMERA_SUBDEV_OIS 15 #define MSM_CAMERA_SUBDEV_FLASH 16 -#define MSM_CAMERA_SUBDEV_EXT 17 +#define MSM_CAMERA_SUBDEV_IR_LED 17 +#define MSM_CAMERA_SUBDEV_IR_CUT 18 +#define MSM_CAMERA_SUBDEV_EXT 19 #define MSM_MAX_CAMERA_SENSORS 5 diff --git a/include/uapi/media/msmb_isp.h b/include/uapi/media/msmb_isp.h index 7eb81bb79aab3..364f6544a35ad 100644 --- a/include/uapi/media/msmb_isp.h +++ b/include/uapi/media/msmb_isp.h @@ -18,8 +18,13 @@ #define ISP_META_CHANNEL_BIT (0x10000 << 3) #define ISP_SCRATCH_BUF_BIT (0x10000 << 4) #define ISP_OFFLINE_STATS_BIT (0x10000 << 5) +#define ISP_SVHDR_IN_BIT (0x10000 << 6) /* RDI hw stream for SVHDR */ +#define ISP_SVHDR_OUT_BIT (0x10000 << 7) /* SVHDR output bufq stream*/ + #define ISP_STATS_STREAM_BIT 0x80000000 +#define VFE_HW_LIMIT 1 + struct msm_vfe_cfg_cmd_list; enum ISP_START_PIXEL_PATTERN { @@ -327,11 +332,18 @@ enum msm_vfe_axi_stream_cmd { STOP_IMMEDIATELY, }; +enum msm_vfe_hw_state { + HW_STATE_NONE, + HW_STATE_SLEEP, + HW_STATE_AWAKE, +}; + struct msm_vfe_axi_stream_cfg_cmd { uint8_t num_streams; uint32_t stream_handle[VFE_AXI_SRC_MAX]; enum msm_vfe_axi_stream_cmd cmd; uint8_t sync_frame_id_src; + enum msm_vfe_hw_state hw_state; }; enum msm_vfe_axi_stream_update_type { @@ -451,6 +463,7 @@ enum msm_vfe_reg_cfg_type { VFE_HW_UPDATE_UNLOCK, SET_WM_UB_SIZE, SET_UB_POLICY, + GET_VFE_HW_LIMIT, }; struct msm_vfe_cfg_cmd2 { @@ -873,6 +886,8 @@ enum msm_isp_ioctl_cmd_code { MSM_ISP_UNMAP_BUF, MSM_ISP_FETCH_ENG_MULTI_PASS_START, MSM_ISP_MAP_BUF_START_MULTI_PASS_FE, + MSM_ISP_CFG_HW_STATE, + MSM_ISP_AHB_CLK_CFG, }; #define VIDIOC_MSM_VFE_REG_CFG \ @@ -975,9 +990,6 @@ enum msm_isp_ioctl_cmd_code { _IOWR('V', MSM_ISP_UNMAP_BUF, \ struct msm_isp_unmap_buf_req) -#define VIDIOC_MSM_ISP_AHB_CLK_CFG \ - _IOWR('V', BASE_VIDIOC_PRIVATE+25, struct msm_isp_ahb_clk_cfg) - #define VIDIOC_MSM_ISP_FETCH_ENG_MULTI_PASS_START \ _IOWR('V', MSM_ISP_FETCH_ENG_MULTI_PASS_START, \ struct msm_vfe_fetch_eng_multi_pass_start) @@ -985,4 +997,11 @@ enum msm_isp_ioctl_cmd_code { #define VIDIOC_MSM_ISP_MAP_BUF_START_MULTI_PASS_FE \ _IOWR('V', MSM_ISP_MAP_BUF_START_MULTI_PASS_FE, \ struct msm_vfe_fetch_eng_multi_pass_start) + +#define VIDIOC_MSM_ISP_CFG_HW_STATE \ + _IOWR('V', MSM_ISP_CFG_HW_STATE, \ + struct msm_vfe_axi_stream_cfg_cmd) + +#define VIDIOC_MSM_ISP_AHB_CLK_CFG \ + _IOWR('V', MSM_ISP_AHB_CLK_CFG, struct msm_isp_ahb_clk_cfg) #endif /* __MSMB_ISP__ */ diff --git a/include/uapi/media/msmb_ispif.h b/include/uapi/media/msmb_ispif.h index 7f4deaf126831..dd8bb44576af3 100644 --- a/include/uapi/media/msmb_ispif.h +++ b/include/uapi/media/msmb_ispif.h @@ -28,6 +28,7 @@ enum msm_ispif_intftype { }; #define MAX_PARAM_ENTRIES (INTF_MAX * 2) #define MAX_CID_CH 8 +#define MAX_CID_CH_v2 3 #define PIX0_MASK (1 << PIX0) #define PIX1_MASK (1 << PIX1) @@ -94,7 +95,7 @@ struct msm_ispif_params_entry { enum msm_ispif_vfe_intf vfe_intf; enum msm_ispif_intftype intftype; int num_cids; - enum msm_ispif_cid cids[3]; + enum msm_ispif_cid cids[MAX_CID_CH_v2]; enum msm_ispif_csid csid; int crop_enable; uint16_t crop_start_pixel; diff --git a/include/uapi/media/msmb_pproc.h b/include/uapi/media/msmb_pproc.h index b65669b87a21d..8f454571e69de 100644 --- a/include/uapi/media/msmb_pproc.h +++ b/include/uapi/media/msmb_pproc.h @@ -16,6 +16,7 @@ #define MSM_CPP_MAX_FRAME_LENGTH 4096 #define MSM_CPP_MAX_FW_NAME_LEN 32 #define MAX_FREQ_TBL 10 +#define MSM_OUTPUT_BUF_CNT 8 enum msm_cpp_frame_type { MSM_CPP_OFFLINE_FRAME, @@ -76,7 +77,7 @@ struct msm_cpp_frame_info_t { uint32_t feature_mask; uint8_t we_disable; struct msm_cpp_buffer_info_t input_buffer_info; - struct msm_cpp_buffer_info_t output_buffer_info[8]; + struct msm_cpp_buffer_info_t output_buffer_info[MSM_OUTPUT_BUF_CNT]; struct msm_cpp_buffer_info_t duplicate_buffer_info; struct msm_cpp_buffer_info_t tnr_scratch_buffer_info[2]; uint32_t reserved; diff --git a/init/Kconfig b/init/Kconfig index c325946ceecb3..213ea095b3ed1 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -1172,6 +1172,16 @@ config SCHED_HMP_CSTATE_AWARE with CPUs C-state. If this is enabled, scheduler places tasks onto the shallowest C-state CPU among the most power efficient CPUs. +config SCHED_CORE_CTL + bool "QTI Core Control" + depends on SMP + help + This options enables the core control functionality in + the scheduler. Core control automatically offline and + online cores based on cpu load and utilization. + + If unsure, say N here. + config SCHED_QHMP bool "QHMP scheduler extensions" depends on SCHED_HMP diff --git a/ipc/mqueue.c b/ipc/mqueue.c index f65a044d66c54..3949468d5af19 100644 --- a/ipc/mqueue.c +++ b/ipc/mqueue.c @@ -751,7 +751,7 @@ static struct file *do_create(struct ipc_namespace *ipc_ns, struct inode *dir, } mode &= ~current_umask(); - ret = vfs_create(dir, path->dentry, mode, true); + ret = vfs_create2(path->mnt, dir, path->dentry, mode, true); path->dentry->d_fsdata = NULL; if (ret) return ERR_PTR(ret); @@ -767,7 +767,7 @@ static struct file *do_open(struct path *path, int oflag) if ((oflag & O_ACCMODE) == (O_RDWR | O_WRONLY)) return ERR_PTR(-EINVAL); acc = oflag2acc[oflag & O_ACCMODE]; - if (inode_permission(path->dentry->d_inode, acc)) + if (inode_permission2(path->mnt, path->dentry->d_inode, acc)) return ERR_PTR(-EACCES); return dentry_open(path, oflag, current_cred()); } @@ -800,7 +800,7 @@ SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, umode_t, mode, ro = mnt_want_write(mnt); /* we'll drop it in any case */ error = 0; mutex_lock(&root->d_inode->i_mutex); - path.dentry = lookup_one_len(name->name, root, strlen(name->name)); + path.dentry = lookup_one_len2(name->name, mnt, root, strlen(name->name)); if (IS_ERR(path.dentry)) { error = PTR_ERR(path.dentry); goto out_putfd; @@ -871,7 +871,7 @@ SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name) if (err) goto out_name; mutex_lock_nested(&mnt->mnt_root->d_inode->i_mutex, I_MUTEX_PARENT); - dentry = lookup_one_len(name->name, mnt->mnt_root, + dentry = lookup_one_len2(name->name, mnt, mnt->mnt_root, strlen(name->name)); if (IS_ERR(dentry)) { err = PTR_ERR(dentry); @@ -883,7 +883,7 @@ SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name) err = -ENOENT; } else { ihold(inode); - err = vfs_unlink(dentry->d_parent->d_inode, dentry, NULL); + err = vfs_unlink2(mnt, dentry->d_parent->d_inode, dentry, NULL); } dput(dentry); diff --git a/kernel/auditsc.c b/kernel/auditsc.c index cc3416f0dedac..3a6e01013b34a 100644 --- a/kernel/auditsc.c +++ b/kernel/auditsc.c @@ -73,6 +73,7 @@ #include #include #include +#include #include #include "audit.h" @@ -82,7 +83,8 @@ #define AUDITSC_SUCCESS 1 #define AUDITSC_FAILURE 2 -/* no execve audit message should be longer than this (userspace limits) */ +/* no execve audit message should be longer than this (userspace limits), + * see the note near the top of audit_log_execve_info() about this value */ #define MAX_EXECVE_AUDIT_LEN 7500 /* max length to print of cmdline/proctitle value during audit */ @@ -1010,185 +1012,178 @@ static int audit_log_pid_context(struct audit_context *context, pid_t pid, return rc; } -/* - * to_send and len_sent accounting are very loose estimates. We aren't - * really worried about a hard cap to MAX_EXECVE_AUDIT_LEN so much as being - * within about 500 bytes (next page boundary) - * - * why snprintf? an int is up to 12 digits long. if we just assumed when - * logging that a[%d]= was going to be 16 characters long we would be wasting - * space in every audit message. In one 7500 byte message we can log up to - * about 1000 min size arguments. That comes down to about 50% waste of space - * if we didn't do the snprintf to find out how long arg_num_len was. - */ -static int audit_log_single_execve_arg(struct audit_context *context, - struct audit_buffer **ab, - int arg_num, - size_t *len_sent, - const char __user *p, - char *buf) +static void audit_log_execve_info(struct audit_context *context, + struct audit_buffer **ab) { - char arg_num_len_buf[12]; - const char __user *tmp_p = p; - /* how many digits are in arg_num? 5 is the length of ' a=""' */ - size_t arg_num_len = snprintf(arg_num_len_buf, 12, "%d", arg_num) + 5; - size_t len, len_left, to_send; - size_t max_execve_audit_len = MAX_EXECVE_AUDIT_LEN; - unsigned int i, has_cntl = 0, too_long = 0; - int ret; - - /* strnlen_user includes the null we don't want to send */ - len_left = len = strnlen_user(p, MAX_ARG_STRLEN) - 1; - - /* - * We just created this mm, if we can't find the strings - * we just copied into it something is _very_ wrong. Similar - * for strings that are too long, we should not have created - * any. - */ - if (unlikely((len == -1) || len > MAX_ARG_STRLEN - 1)) { - WARN_ON(1); - send_sig(SIGKILL, current, 0); - return -1; + long len_max; + long len_rem; + long len_full; + long len_buf; + long len_abuf; + long len_tmp; + bool require_data; + bool encode; + unsigned int iter; + unsigned int arg; + char *buf_head; + char *buf; + const char __user *p = (const char __user *)current->mm->arg_start; + + /* NOTE: this buffer needs to be large enough to hold all the non-arg + * data we put in the audit record for this argument (see the + * code below) ... at this point in time 96 is plenty */ + char abuf[96]; + + /* NOTE: we set MAX_EXECVE_AUDIT_LEN to a rather arbitrary limit, the + * current value of 7500 is not as important as the fact that it + * is less than 8k, a setting of 7500 gives us plenty of wiggle + * room if we go over a little bit in the logging below */ + WARN_ON_ONCE(MAX_EXECVE_AUDIT_LEN > 7500); + len_max = MAX_EXECVE_AUDIT_LEN; + + /* scratch buffer to hold the userspace args */ + buf_head = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL); + if (!buf_head) { + audit_panic("out of memory for argv string"); + return; } + buf = buf_head; - /* walk the whole argument looking for non-ascii chars */ + audit_log_format(*ab, "argc=%d", context->execve.argc); + + len_rem = len_max; + len_buf = 0; + len_full = 0; + require_data = true; + encode = false; + iter = 0; + arg = 0; do { - if (len_left > MAX_EXECVE_AUDIT_LEN) - to_send = MAX_EXECVE_AUDIT_LEN; - else - to_send = len_left; - ret = copy_from_user(buf, tmp_p, to_send); - /* - * There is no reason for this copy to be short. We just - * copied them here, and the mm hasn't been exposed to user- - * space yet. - */ - if (ret) { - WARN_ON(1); - send_sig(SIGKILL, current, 0); - return -1; - } - buf[to_send] = '\0'; - has_cntl = audit_string_contains_control(buf, to_send); - if (has_cntl) { - /* - * hex messages get logged as 2 bytes, so we can only - * send half as much in each message - */ - max_execve_audit_len = MAX_EXECVE_AUDIT_LEN / 2; - break; - } - len_left -= to_send; - tmp_p += to_send; - } while (len_left > 0); - - len_left = len; - - if (len > max_execve_audit_len) - too_long = 1; - - /* rewalk the argument actually logging the message */ - for (i = 0; len_left > 0; i++) { - int room_left; - - if (len_left > max_execve_audit_len) - to_send = max_execve_audit_len; - else - to_send = len_left; - - /* do we have space left to send this argument in this ab? */ - room_left = MAX_EXECVE_AUDIT_LEN - arg_num_len - *len_sent; - if (has_cntl) - room_left -= (to_send * 2); - else - room_left -= to_send; - if (room_left < 0) { - *len_sent = 0; - audit_log_end(*ab); - *ab = audit_log_start(context, GFP_KERNEL, AUDIT_EXECVE); - if (!*ab) - return 0; - } + /* NOTE: we don't ever want to trust this value for anything + * serious, but the audit record format insists we + * provide an argument length for really long arguments, + * e.g. > MAX_EXECVE_AUDIT_LEN, so we have no choice but + * to use strncpy_from_user() to obtain this value for + * recording in the log, although we don't use it + * anywhere here to avoid a double-fetch problem */ + if (len_full == 0) + len_full = strnlen_user(p, MAX_ARG_STRLEN) - 1; + + /* read more data from userspace */ + if (require_data) { + /* can we make more room in the buffer? */ + if (buf != buf_head) { + memmove(buf_head, buf, len_buf); + buf = buf_head; + } + + /* fetch as much as we can of the argument */ + len_tmp = strncpy_from_user(&buf_head[len_buf], p, + len_max - len_buf); + if (len_tmp == -EFAULT) { + /* unable to copy from userspace */ + send_sig(SIGKILL, current, 0); + goto out; + } else if (len_tmp == (len_max - len_buf)) { + /* buffer is not large enough */ + require_data = true; + /* NOTE: if we are going to span multiple + * buffers force the encoding so we stand + * a chance at a sane len_full value and + * consistent record encoding */ + encode = true; + len_full = len_full * 2; + p += len_tmp; + } else { + require_data = false; + if (!encode) + encode = audit_string_contains_control( + buf, len_tmp); + /* try to use a trusted value for len_full */ + if (len_full < len_max) + len_full = (encode ? + len_tmp * 2 : len_tmp); + p += len_tmp + 1; + } + len_buf += len_tmp; + buf_head[len_buf] = '\0'; - /* - * first record needs to say how long the original string was - * so we can be sure nothing was lost. - */ - if ((i == 0) && (too_long)) - audit_log_format(*ab, " a%d_len=%zu", arg_num, - has_cntl ? 2*len : len); - - /* - * normally arguments are small enough to fit and we already - * filled buf above when we checked for control characters - * so don't bother with another copy_from_user - */ - if (len >= max_execve_audit_len) - ret = copy_from_user(buf, p, to_send); - else - ret = 0; - if (ret) { - WARN_ON(1); - send_sig(SIGKILL, current, 0); - return -1; + /* length of the buffer in the audit record? */ + len_abuf = (encode ? len_buf * 2 : len_buf + 2); } - buf[to_send] = '\0'; - - /* actually log it */ - audit_log_format(*ab, " a%d", arg_num); - if (too_long) - audit_log_format(*ab, "[%d]", i); - audit_log_format(*ab, "="); - if (has_cntl) - audit_log_n_hex(*ab, buf, to_send); - else - audit_log_string(*ab, buf); - - p += to_send; - len_left -= to_send; - *len_sent += arg_num_len; - if (has_cntl) - *len_sent += to_send * 2; - else - *len_sent += to_send; - } - /* include the null we didn't log */ - return len + 1; -} -static void audit_log_execve_info(struct audit_context *context, - struct audit_buffer **ab) -{ - int i, len; - size_t len_sent = 0; - const char __user *p; - char *buf; + /* write as much as we can to the audit log */ + if (len_buf > 0) { + /* NOTE: some magic numbers here - basically if we + * can't fit a reasonable amount of data into the + * existing audit buffer, flush it and start with + * a new buffer */ + if ((sizeof(abuf) + 8) > len_rem) { + len_rem = len_max; + audit_log_end(*ab); + *ab = audit_log_start(context, + GFP_KERNEL, AUDIT_EXECVE); + if (!*ab) + goto out; + } - p = (const char __user *)current->mm->arg_start; + /* create the non-arg portion of the arg record */ + len_tmp = 0; + if (require_data || (iter > 0) || + ((len_abuf + sizeof(abuf)) > len_rem)) { + if (iter == 0) { + len_tmp += snprintf(&abuf[len_tmp], + sizeof(abuf) - len_tmp, + " a%d_len=%lu", + arg, len_full); + } + len_tmp += snprintf(&abuf[len_tmp], + sizeof(abuf) - len_tmp, + " a%d[%d]=", arg, iter++); + } else + len_tmp += snprintf(&abuf[len_tmp], + sizeof(abuf) - len_tmp, + " a%d=", arg); + WARN_ON(len_tmp >= sizeof(abuf)); + abuf[sizeof(abuf) - 1] = '\0'; + + /* log the arg in the audit record */ + audit_log_format(*ab, "%s", abuf); + len_rem -= len_tmp; + len_tmp = len_buf; + if (encode) { + if (len_abuf > len_rem) + len_tmp = len_rem / 2; /* encoding */ + audit_log_n_hex(*ab, buf, len_tmp); + len_rem -= len_tmp * 2; + len_abuf -= len_tmp * 2; + } else { + if (len_abuf > len_rem) + len_tmp = len_rem - 2; /* quotes */ + audit_log_n_string(*ab, buf, len_tmp); + len_rem -= len_tmp + 2; + /* don't subtract the "2" because we still need + * to add quotes to the remaining string */ + len_abuf -= len_tmp; + } + len_buf -= len_tmp; + buf += len_tmp; + } - audit_log_format(*ab, "argc=%d", context->execve.argc); + /* ready to move to the next argument? */ + if ((len_buf == 0) && !require_data) { + arg++; + iter = 0; + len_full = 0; + require_data = true; + encode = false; + } + } while (arg < context->execve.argc); - /* - * we need some kernel buffer to hold the userspace args. Just - * allocate one big one rather than allocating one of the right size - * for every single argument inside audit_log_single_execve_arg() - * should be <8k allocation so should be pretty safe. - */ - buf = kmalloc(MAX_EXECVE_AUDIT_LEN + 1, GFP_KERNEL); - if (!buf) { - audit_panic("out of memory for argv string"); - return; - } + /* NOTE: the caller handles the final audit_log_end() call */ - for (i = 0; i < context->execve.argc; i++) { - len = audit_log_single_execve_arg(context, ab, i, - &len_sent, p, buf); - if (len <= 0) - break; - p += len; - } - kfree(buf); +out: + kfree(buf_head); } static void show_special(struct audit_context *context, int *call_panic) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 67f5f177c0715..72f96e69eec3f 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -315,7 +315,8 @@ static const char *const bpf_jmp_string[] = { [BPF_EXIT >> 4] = "exit", }; -static void print_bpf_insn(struct bpf_insn *insn) +static void print_bpf_insn(const struct bpf_verifier_env *env, + const struct bpf_insn *insn) { u8 class = BPF_CLASS(insn->code); @@ -379,9 +380,19 @@ static void print_bpf_insn(struct bpf_insn *insn) insn->code, bpf_ldst_string[BPF_SIZE(insn->code) >> 3], insn->src_reg, insn->imm); - } else if (BPF_MODE(insn->code) == BPF_IMM) { - verbose("(%02x) r%d = 0x%x\n", - insn->code, insn->dst_reg, insn->imm); + } else if (BPF_MODE(insn->code) == BPF_IMM && + BPF_SIZE(insn->code) == BPF_DW) { + /* At this point, we already made sure that the second + * part of the ldimm64 insn is accessible. + */ + u64 imm = ((u64)(insn + 1)->imm << 32) | (u32)insn->imm; + bool map_ptr = insn->src_reg == BPF_PSEUDO_MAP_FD; + + if (map_ptr && !env->allow_ptr_leaks) + imm = 0; + + verbose("(%02x) r%d = 0x%llx\n", insn->code, + insn->dst_reg, (unsigned long long)imm); } else { verbose("BUG_ld_%02x\n", insn->code); return; @@ -1534,7 +1545,7 @@ static int do_check(struct verifier_env *env) if (log_level) { verbose("%d: ", insn_idx); - print_bpf_insn(insn); + print_bpf_insn(env, insn); } if (class == BPF_ALU || class == BPF_ALU64) { diff --git a/kernel/cgroup.c b/kernel/cgroup.c index bf2543b6f3419..359a50e63e1e5 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -5566,7 +5566,7 @@ static int cgroup_css_links_read(struct seq_file *seq, void *v) struct task_struct *task; int count = 0; - seq_printf(seq, "css_set %p\n", cset); + seq_printf(seq, "css_set %pK\n", cset); list_for_each_entry(task, &cset->tasks, cg_list) { if (count++ > MAX_TASKS_SHOWN_PER_CSS) diff --git a/kernel/cpu.c b/kernel/cpu.c index cd9c5c65ebe1f..23d4b48b020fc 100644 --- a/kernel/cpu.c +++ b/kernel/cpu.c @@ -24,6 +24,7 @@ #include #include +#include #include "smpboot.h" @@ -492,6 +493,10 @@ static int _cpu_up(unsigned int cpu, int tasks_frozen) nr_calls--; pr_warn("%s: attempt to bring up CPU %u failed\n", __func__, cpu); + + ktrace_add_cpufreq_event(KTRACE_CPUFREQ_TYPE_UNPLUGED, + current->pid, ktime_to_ns(ktime_get()), cpu, 0, 0); + goto out_notify; } @@ -598,6 +603,7 @@ void __weak arch_enable_nonboot_cpus_end(void) void __ref enable_nonboot_cpus(void) { int cpu, error; + struct device *cpu_device; /* Allow everyone to use the CPU hotplug again */ cpu_maps_update_begin(); @@ -615,6 +621,12 @@ void __ref enable_nonboot_cpus(void) trace_suspend_resume(TPS("CPU_ON"), cpu, false); if (!error) { pr_info("CPU%d is up\n", cpu); + cpu_device = get_cpu_device(cpu); + if (!cpu_device) + pr_err("%s: failed to get cpu%d device\n", + __func__, cpu); + else + kobject_uevent(&cpu_device->kobj, KOBJ_ONLINE); continue; } pr_warn("Error taking CPU%d up: %d\n", cpu, error); diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 71b52dd957de1..4e39fcba59d45 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c @@ -99,6 +99,7 @@ struct cpuset { /* user-configured CPUs and Memory Nodes allow to tasks */ cpumask_var_t cpus_allowed; + cpumask_var_t cpus_requested; nodemask_t mems_allowed; /* effective CPUs and Memory Nodes allow to tasks */ @@ -385,7 +386,7 @@ static void cpuset_update_task_spread_flag(struct cpuset *cs, static int is_cpuset_subset(const struct cpuset *p, const struct cpuset *q) { - return cpumask_subset(p->cpus_allowed, q->cpus_allowed) && + return cpumask_subset(p->cpus_requested, q->cpus_requested) && nodes_subset(p->mems_allowed, q->mems_allowed) && is_cpu_exclusive(p) <= is_cpu_exclusive(q) && is_mem_exclusive(p) <= is_mem_exclusive(q); @@ -484,7 +485,7 @@ static int validate_change(struct cpuset *cur, struct cpuset *trial) cpuset_for_each_child(c, css, par) { if ((is_cpu_exclusive(trial) || is_cpu_exclusive(c)) && c != cur && - cpumask_intersects(trial->cpus_allowed, c->cpus_allowed)) + cpumask_intersects(trial->cpus_requested, c->cpus_requested)) goto out; if ((is_mem_exclusive(trial) || is_mem_exclusive(c)) && c != cur && @@ -923,17 +924,18 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, if (!*buf) { cpumask_clear(trialcs->cpus_allowed); } else { - retval = cpulist_parse(buf, trialcs->cpus_allowed); + retval = cpulist_parse(buf, trialcs->cpus_requested); if (retval < 0) return retval; - if (!cpumask_subset(trialcs->cpus_allowed, - top_cpuset.cpus_allowed)) + if (!cpumask_subset(trialcs->cpus_requested, cpu_present_mask)) return -EINVAL; + + cpumask_and(trialcs->cpus_allowed, trialcs->cpus_requested, cpu_active_mask); } /* Nothing to do if the cpus didn't change */ - if (cpumask_equal(cs->cpus_allowed, trialcs->cpus_allowed)) + if (cpumask_equal(cs->cpus_requested, trialcs->cpus_requested)) return 0; retval = validate_change(cs, trialcs); @@ -942,6 +944,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, mutex_lock(&callback_mutex); cpumask_copy(cs->cpus_allowed, trialcs->cpus_allowed); + cpumask_copy(cs->cpus_requested, trialcs->cpus_requested); mutex_unlock(&callback_mutex); /* use trialcs->cpus_allowed as a temp variable */ @@ -1454,6 +1457,27 @@ static int cpuset_can_attach(struct cgroup_subsys_state *css, return ret; } +static int cpuset_allow_attach(struct cgroup_subsys_state *css, + struct cgroup_taskset *tset) +{ + const struct cred *cred = current_cred(), *tcred; + struct task_struct *task; + + if (capable(CAP_SYS_NICE)) + return 0; + + cgroup_taskset_for_each(task, tset) { + tcred = __task_cred(task); + + if (current != task && !uid_eq(cred->euid, tcred->uid) && + !uid_eq(cred->euid, tcred->suid)) + return -EACCES; + } + + return 0; +} + + static void cpuset_cancel_attach(struct cgroup_subsys_state *css, struct cgroup_taskset *tset) { @@ -1714,7 +1738,7 @@ static int cpuset_common_seq_show(struct seq_file *sf, void *v) switch (type) { case FILE_CPULIST: - s += cpulist_scnprintf(s, count, cs->cpus_allowed); + s += cpulist_scnprintf(s, count, cs->cpus_requested); break; case FILE_MEMLIST: s += nodelist_scnprintf(s, count, cs->mems_allowed); @@ -1914,11 +1938,14 @@ cpuset_css_alloc(struct cgroup_subsys_state *parent_css) return ERR_PTR(-ENOMEM); if (!alloc_cpumask_var(&cs->cpus_allowed, GFP_KERNEL)) goto free_cs; + if (!alloc_cpumask_var(&cs->cpus_requested, GFP_KERNEL)) + goto free_allowed; if (!alloc_cpumask_var(&cs->effective_cpus, GFP_KERNEL)) - goto free_cpus; + goto free_requested; set_bit(CS_SCHED_LOAD_BALANCE, &cs->flags); cpumask_clear(cs->cpus_allowed); + cpumask_clear(cs->cpus_requested); nodes_clear(cs->mems_allowed); cpumask_clear(cs->effective_cpus); nodes_clear(cs->effective_mems); @@ -1927,7 +1954,9 @@ cpuset_css_alloc(struct cgroup_subsys_state *parent_css) return &cs->css; -free_cpus: +free_requested: + free_cpumask_var(cs->cpus_requested); +free_allowed: free_cpumask_var(cs->cpus_allowed); free_cs: kfree(cs); @@ -1990,6 +2019,7 @@ static int cpuset_css_online(struct cgroup_subsys_state *css) cs->mems_allowed = parent->mems_allowed; cs->effective_mems = parent->mems_allowed; cpumask_copy(cs->cpus_allowed, parent->cpus_allowed); + cpumask_copy(cs->cpus_requested, parent->cpus_requested); cpumask_copy(cs->effective_cpus, parent->cpus_allowed); mutex_unlock(&callback_mutex); out_unlock: @@ -2024,6 +2054,7 @@ static void cpuset_css_free(struct cgroup_subsys_state *css) free_cpumask_var(cs->effective_cpus); free_cpumask_var(cs->cpus_allowed); + free_cpumask_var(cs->cpus_requested); kfree(cs); } @@ -2051,6 +2082,7 @@ struct cgroup_subsys cpuset_cgrp_subsys = { .css_offline = cpuset_css_offline, .css_free = cpuset_css_free, .can_attach = cpuset_can_attach, + .allow_attach = cpuset_allow_attach, .cancel_attach = cpuset_cancel_attach, .attach = cpuset_attach, .bind = cpuset_bind, @@ -2072,8 +2104,11 @@ int __init cpuset_init(void) BUG(); if (!alloc_cpumask_var(&top_cpuset.effective_cpus, GFP_KERNEL)) BUG(); + if (!alloc_cpumask_var(&top_cpuset.cpus_requested, GFP_KERNEL)) + BUG(); cpumask_setall(top_cpuset.cpus_allowed); + cpumask_setall(top_cpuset.cpus_requested); nodes_setall(top_cpuset.mems_allowed); cpumask_setall(top_cpuset.effective_cpus); nodes_setall(top_cpuset.effective_mems); @@ -2207,7 +2242,7 @@ static void cpuset_hotplug_update_tasks(struct cpuset *cs) goto retry; } - cpumask_and(&new_cpus, cs->cpus_allowed, parent_cs(cs)->effective_cpus); + cpumask_and(&new_cpus, cs->cpus_requested, parent_cs(cs)->effective_cpus); nodes_and(new_mems, cs->mems_allowed, parent_cs(cs)->effective_mems); cpus_updated = !cpumask_equal(&new_cpus, cs->effective_cpus); diff --git a/kernel/events/core.c b/kernel/events/core.c index 7ee39bfa1ce01..62372aa81df99 100644 --- a/kernel/events/core.c +++ b/kernel/events/core.c @@ -171,9 +171,12 @@ static struct srcu_struct pmus_srcu; * 0 - disallow raw tracepoint access for unpriv * 1 - disallow cpu events for unpriv * 2 - disallow kernel profiling for unpriv + * 3 - disallow all unpriv perf event use */ #ifdef CONFIG_PERF_EVENTS_USERMODE int sysctl_perf_event_paranoid __read_mostly = -1; +#elif defined CONFIG_SECURITY_PERF_EVENTS_RESTRICT +int sysctl_perf_event_paranoid __read_mostly = 3; #else int sysctl_perf_event_paranoid __read_mostly = 1; #endif @@ -911,6 +914,77 @@ static void put_ctx(struct perf_event_context *ctx) } } +/* + * Because of perf_event::ctx migration in sys_perf_event_open::move_group and + * perf_pmu_migrate_context() we need some magic. + * + * Those places that change perf_event::ctx will hold both + * perf_event_ctx::mutex of the 'old' and 'new' ctx value. + * + * Lock ordering is by mutex address. There is one other site where + * perf_event_context::mutex nests and that is put_event(). But remember that + * that is a parent<->child context relation, and migration does not affect + * children, therefore these two orderings should not interact. + * + * The change in perf_event::ctx does not affect children (as claimed above) + * because the sys_perf_event_open() case will install a new event and break + * the ctx parent<->child relation, and perf_pmu_migrate_context() is only + * concerned with cpuctx and that doesn't have children. + * + * The places that change perf_event::ctx will issue: + * + * perf_remove_from_context(); + * synchronize_rcu(); + * perf_install_in_context(); + * + * to affect the change. The remove_from_context() + synchronize_rcu() should + * quiesce the event, after which we can install it in the new location. This + * means that only external vectors (perf_fops, prctl) can perturb the event + * while in transit. Therefore all such accessors should also acquire + * perf_event_context::mutex to serialize against this. + * + * However; because event->ctx can change while we're waiting to acquire + * ctx->mutex we must be careful and use the below perf_event_ctx_lock() + * function. + * + * Lock order: + * task_struct::perf_event_mutex + * perf_event_context::mutex + * perf_event_context::lock + * perf_event::child_mutex; + * perf_event::mmap_mutex + * mmap_sem + */ +static struct perf_event_context *perf_event_ctx_lock(struct perf_event *event) +{ + struct perf_event_context *ctx; + +again: + rcu_read_lock(); + ctx = ACCESS_ONCE(event->ctx); + if (!atomic_inc_not_zero(&ctx->refcount)) { + rcu_read_unlock(); + goto again; + } + rcu_read_unlock(); + + mutex_lock(&ctx->mutex); + if (event->ctx != ctx) { + mutex_unlock(&ctx->mutex); + put_ctx(ctx); + goto again; + } + + return ctx; +} + +static void perf_event_ctx_unlock(struct perf_event *event, + struct perf_event_context *ctx) +{ + mutex_unlock(&ctx->mutex); + put_ctx(ctx); +} + /* * This must be done under the ctx->lock, such as to serialize against * context_equiv(), therefore we cannot call put_ctx() since that might end up @@ -1377,10 +1451,17 @@ static void perf_group_detach(struct perf_event *event) * If this was a group event with sibling events then * upgrade the siblings to singleton events by adding them * to whatever list we are on. + * If this isn't on a list, make sure we still remove the sibling's + * group_entry from this sibling_list; otherwise, when that sibling + * is later deallocated, it will try to remove itself from this + * sibling_list, which may well have been deallocated already, + * resulting in a use-after-free. */ list_for_each_entry_safe(sibling, tmp, &event->sibling_list, group_entry) { if (list) list_move_tail(&sibling->group_entry, list); + else + list_del_init(&sibling->group_entry); sibling->group_leader = sibling; /* Inherit group flags from the previous leader */ @@ -1661,7 +1742,7 @@ int __perf_event_disable(void *info) * is the current context on this CPU and preemption is disabled, * hence we can't get into perf_event_task_sched_out for this context. */ -void perf_event_disable(struct perf_event *event) +static void _perf_event_disable(struct perf_event *event) { struct perf_event_context *ctx = event->ctx; struct task_struct *task = ctx->task; @@ -1702,6 +1783,19 @@ void perf_event_disable(struct perf_event *event) } raw_spin_unlock_irq(&ctx->lock); } + +/* + * Strictly speaking kernel users cannot create groups and therefore this + * interface does not need the perf_event_ctx_lock() magic. + */ +void perf_event_disable(struct perf_event *event) +{ + struct perf_event_context *ctx; + + ctx = perf_event_ctx_lock(event); + _perf_event_disable(event); + perf_event_ctx_unlock(event, ctx); +} EXPORT_SYMBOL_GPL(perf_event_disable); static void perf_set_shadow_time(struct perf_event *event, @@ -2165,7 +2259,7 @@ static int __perf_event_enable(void *info) * perf_event_for_each_child or perf_event_for_each as described * for perf_event_disable. */ -void perf_event_enable(struct perf_event *event) +static void _perf_event_enable(struct perf_event *event) { struct perf_event_context *ctx = event->ctx; struct task_struct *task = ctx->task; @@ -2221,9 +2315,21 @@ void perf_event_enable(struct perf_event *event) out: raw_spin_unlock_irq(&ctx->lock); } + +/* + * See perf_event_disable(); + */ +void perf_event_enable(struct perf_event *event) +{ + struct perf_event_context *ctx; + + ctx = perf_event_ctx_lock(event); + _perf_event_enable(event); + perf_event_ctx_unlock(event, ctx); +} EXPORT_SYMBOL_GPL(perf_event_enable); -int perf_event_refresh(struct perf_event *event, int refresh) +static int _perf_event_refresh(struct perf_event *event, int refresh) { /* * not supported on inherited events @@ -2232,10 +2338,25 @@ int perf_event_refresh(struct perf_event *event, int refresh) return -EINVAL; atomic_add(refresh, &event->event_limit); - perf_event_enable(event); + _perf_event_enable(event); return 0; } + +/* + * See perf_event_disable() + */ +int perf_event_refresh(struct perf_event *event, int refresh) +{ + struct perf_event_context *ctx; + int ret; + + ctx = perf_event_ctx_lock(event); + ret = _perf_event_refresh(event, refresh); + perf_event_ctx_unlock(event, ctx); + + return ret; +} EXPORT_SYMBOL_GPL(perf_event_refresh); static void ctx_sched_out(struct perf_event_context *ctx, @@ -3433,7 +3554,16 @@ static void perf_remove_from_owner(struct perf_event *event) rcu_read_unlock(); if (owner) { - mutex_lock(&owner->perf_event_mutex); + /* + * If we're here through perf_event_exit_task() we're already + * holding ctx->mutex which would be an inversion wrt. the + * normal lock order. + * + * However we can safely take this lock because its the child + * ctx->mutex. + */ + mutex_lock_nested(&owner->perf_event_mutex, SINGLE_DEPTH_NESTING); + /* * We have to re-check the event->owner field, if it is cleared * we raced with perf_event_exit_task(), acquiring the mutex @@ -3568,12 +3698,13 @@ static int perf_event_read_group(struct perf_event *event, u64 read_format, char __user *buf) { struct perf_event *leader = event->group_leader, *sub; - int n = 0, size = 0, ret = -EFAULT; struct perf_event_context *ctx = leader->ctx; - u64 values[5]; + int n = 0, size = 0, ret; u64 count, enabled, running; + u64 values[5]; + + lockdep_assert_held(&ctx->mutex); - mutex_lock(&ctx->mutex); count = perf_event_read_value(leader, &enabled, &running); values[n++] = 1 + leader->nr_siblings; @@ -3588,7 +3719,7 @@ static int perf_event_read_group(struct perf_event *event, size = n * sizeof(u64); if (copy_to_user(buf, values, size)) - goto unlock; + return -EFAULT; ret = size; @@ -3602,14 +3733,11 @@ static int perf_event_read_group(struct perf_event *event, size = n * sizeof(u64); if (copy_to_user(buf + ret, values, size)) { - ret = -EFAULT; - goto unlock; + return -EFAULT; } ret += size; } -unlock: - mutex_unlock(&ctx->mutex); return ret; } @@ -3681,8 +3809,14 @@ static ssize_t perf_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { struct perf_event *event = file->private_data; + struct perf_event_context *ctx; + int ret; + + ctx = perf_event_ctx_lock(event); + ret = perf_read_hw(event, buf, count); + perf_event_ctx_unlock(event, ctx); - return perf_read_hw(event, buf, count); + return ret; } static unsigned int perf_poll(struct file *file, poll_table *wait) @@ -3708,7 +3842,7 @@ static unsigned int perf_poll(struct file *file, poll_table *wait) return events; } -static void perf_event_reset(struct perf_event *event) +static void _perf_event_reset(struct perf_event *event) { (void)perf_event_read(event); local64_set(&event->count, 0); @@ -3727,6 +3861,7 @@ static void perf_event_for_each_child(struct perf_event *event, struct perf_event *child; WARN_ON_ONCE(event->ctx->parent_ctx); + mutex_lock(&event->child_mutex); func(event); list_for_each_entry(child, &event->child_list, child_list) @@ -3740,14 +3875,13 @@ static void perf_event_for_each(struct perf_event *event, struct perf_event_context *ctx = event->ctx; struct perf_event *sibling; - WARN_ON_ONCE(ctx->parent_ctx); - mutex_lock(&ctx->mutex); + lockdep_assert_held(&ctx->mutex); + event = event->group_leader; perf_event_for_each_child(event, func); list_for_each_entry(sibling, &event->sibling_list, group_entry) perf_event_for_each_child(sibling, func); - mutex_unlock(&ctx->mutex); } struct period_event { @@ -3852,25 +3986,24 @@ static int perf_event_set_output(struct perf_event *event, struct perf_event *output_event); static int perf_event_set_filter(struct perf_event *event, void __user *arg); -static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +static long _perf_ioctl(struct perf_event *event, unsigned int cmd, unsigned long arg) { - struct perf_event *event = file->private_data; void (*func)(struct perf_event *); u32 flags = arg; switch (cmd) { case PERF_EVENT_IOC_ENABLE: - func = perf_event_enable; + func = _perf_event_enable; break; case PERF_EVENT_IOC_DISABLE: - func = perf_event_disable; + func = _perf_event_disable; break; case PERF_EVENT_IOC_RESET: - func = perf_event_reset; + func = _perf_event_reset; break; case PERF_EVENT_IOC_REFRESH: - return perf_event_refresh(event, arg); + return _perf_event_refresh(event, arg); case PERF_EVENT_IOC_PERIOD: return perf_event_period(event, (u64 __user *)arg); @@ -3917,6 +4050,19 @@ static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) return 0; } +static long perf_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +{ + struct perf_event *event = file->private_data; + struct perf_event_context *ctx; + long ret; + + ctx = perf_event_ctx_lock(event); + ret = _perf_ioctl(event, cmd, arg); + perf_event_ctx_unlock(event, ctx); + + return ret; +} + #ifdef CONFIG_COMPAT static long perf_compat_ioctl(struct file *file, unsigned int cmd, unsigned long arg) @@ -3939,11 +4085,15 @@ static long perf_compat_ioctl(struct file *file, unsigned int cmd, int perf_event_task_enable(void) { + struct perf_event_context *ctx; struct perf_event *event; mutex_lock(¤t->perf_event_mutex); - list_for_each_entry(event, ¤t->perf_event_list, owner_entry) - perf_event_for_each_child(event, perf_event_enable); + list_for_each_entry(event, ¤t->perf_event_list, owner_entry) { + ctx = perf_event_ctx_lock(event); + perf_event_for_each_child(event, _perf_event_enable); + perf_event_ctx_unlock(event, ctx); + } mutex_unlock(¤t->perf_event_mutex); return 0; @@ -3951,11 +4101,15 @@ int perf_event_task_enable(void) int perf_event_task_disable(void) { + struct perf_event_context *ctx; struct perf_event *event; mutex_lock(¤t->perf_event_mutex); - list_for_each_entry(event, ¤t->perf_event_list, owner_entry) - perf_event_for_each_child(event, perf_event_disable); + list_for_each_entry(event, ¤t->perf_event_list, owner_entry) { + ctx = perf_event_ctx_lock(event); + perf_event_for_each_child(event, _perf_event_disable); + perf_event_ctx_unlock(event, ctx); + } mutex_unlock(¤t->perf_event_mutex); return 0; @@ -5728,9 +5882,6 @@ struct swevent_htable { /* Recursion avoidance in each contexts */ int recursion[PERF_NR_CONTEXTS]; - - /* Keeps track of cpu being initialized/exited */ - bool online; }; static DEFINE_PER_CPU(struct swevent_htable, swevent_htable); @@ -5977,14 +6128,8 @@ static int perf_swevent_add(struct perf_event *event, int flags) hwc->state = !(flags & PERF_EF_START); head = find_swevent_head(swhash, event); - if (!head) { - /* - * We can race with cpu hotplug code. Do not - * WARN if the cpu just got unplugged. - */ - WARN_ON_ONCE(swhash->online); + if (WARN_ON_ONCE(!head)) return -EINVAL; - } hlist_add_head_rcu(&event->hlist_entry, head); @@ -6051,7 +6196,6 @@ static int swevent_hlist_get_cpu(struct perf_event *event, int cpu) int err = 0; mutex_lock(&swhash->hlist_mutex); - if (!swevent_hlist_deref(swhash) && cpu_online(cpu)) { struct swevent_hlist *hlist; @@ -6813,7 +6957,6 @@ int perf_pmu_register(struct pmu *pmu, const char *name, int type) __perf_event_init_context(&cpuctx->ctx); lockdep_set_class(&cpuctx->ctx.mutex, &cpuctx_mutex); lockdep_set_class(&cpuctx->ctx.lock, &cpuctx_lock); - cpuctx->ctx.type = cpu_context; cpuctx->ctx.pmu = pmu; __perf_cpu_hrtimer_init(cpuctx, cpu); @@ -7006,6 +7149,7 @@ perf_event_alloc(struct perf_event_attr *attr, int cpu, if (!group_leader) group_leader = event; + mutex_init(&event->group_leader_mutex); mutex_init(&event->child_mutex); INIT_LIST_HEAD(&event->child_list); @@ -7282,6 +7426,46 @@ perf_event_set_output(struct perf_event *event, struct perf_event *output_event) return ret; } +static void mutex_lock_double(struct mutex *a, struct mutex *b) +{ + if (b < a) + swap(a, b); + + mutex_lock(a); + mutex_lock_nested(b, SINGLE_DEPTH_NESTING); +} + +/* + * Variation on perf_event_ctx_lock_nested(), except we take two context + * mutexes. + */ +static struct perf_event_context * +__perf_event_ctx_lock_double(struct perf_event *group_leader, + struct perf_event_context *ctx) +{ + struct perf_event_context *gctx; + +again: + rcu_read_lock(); + gctx = ACCESS_ONCE(group_leader->ctx); + if (!atomic_inc_not_zero(&gctx->refcount)) { + rcu_read_unlock(); + goto again; + } + rcu_read_unlock(); + + mutex_lock_double(&gctx->mutex, &ctx->mutex); + + if (group_leader->ctx != gctx) { + mutex_unlock(&ctx->mutex); + mutex_unlock(&gctx->mutex); + put_ctx(gctx); + goto again; + } + + return gctx; +} + /** * sys_perf_event_open - open a performance event, associate it to a task/cpu * @@ -7297,7 +7481,7 @@ SYSCALL_DEFINE5(perf_event_open, struct perf_event *group_leader = NULL, *output_event = NULL; struct perf_event *event, *sibling; struct perf_event_attr attr; - struct perf_event_context *ctx; + struct perf_event_context *ctx, *uninitialized_var(gctx); struct file *event_file = NULL; struct fd group = {NULL, 0}; struct task_struct *task = NULL; @@ -7311,6 +7495,9 @@ SYSCALL_DEFINE5(perf_event_open, if (flags & ~PERF_FLAG_ALL) return -EINVAL; + if (perf_paranoid_any() && !capable(CAP_SYS_ADMIN)) + return -EACCES; + err = perf_copy_attr(attr_uptr, &attr); if (err) return err; @@ -7358,6 +7545,16 @@ SYSCALL_DEFINE5(perf_event_open, group_leader = NULL; } + /* + * Take the group_leader's group_leader_mutex before observing + * anything in the group leader that leads to changes in ctx, + * many of which may be changing on another thread. + * In particular, we want to take this lock before deciding + * whether we need to move_group. + */ + if (group_leader) + mutex_lock(&group_leader->group_leader_mutex); + if (pid != -1 && !(flags & PERF_FLAG_PID_CGROUP)) { task = find_lively_task_by_vpid(pid); if (IS_ERR(task)) { @@ -7458,7 +7655,19 @@ SYSCALL_DEFINE5(perf_event_open, * task or CPU context: */ if (move_group) { - if (group_leader->ctx->type != ctx->type) + /* + * Make sure we're both on the same task, or both + * per-cpu events. + */ + if (group_leader->ctx->task != ctx->task) + goto err_context; + + /* + * Make sure we're both events for the same CPU; + * grouping events for different CPUs is broken; since + * you can never concurrently schedule them anyhow. + */ + if (group_leader->cpu != event->cpu) goto err_context; } else { if (group_leader->ctx != ctx) @@ -7486,9 +7695,31 @@ SYSCALL_DEFINE5(perf_event_open, } if (move_group) { - struct perf_event_context *gctx = group_leader->ctx; + gctx = __perf_event_ctx_lock_double(group_leader, ctx); - mutex_lock(&gctx->mutex); + /* + * Check if we raced against another sys_perf_event_open() call + * moving the software group underneath us. + */ + if (!(group_leader->group_flags & PERF_GROUP_SOFTWARE)) { + /* + * If someone moved the group out from under us, check + * if this new event wound up on the same ctx, if so + * its the regular !move_group case, otherwise fail. + */ + if (gctx != ctx) { + err = -EINVAL; + goto err_locked; + } else { + perf_event_ctx_unlock(group_leader, gctx); + move_group = 0; + } + } + + /* + * See perf_event_ctx_lock() for comments on the details + * of swizzling perf_event::ctx. + */ perf_remove_from_context(group_leader, false); /* @@ -7503,15 +7734,19 @@ SYSCALL_DEFINE5(perf_event_open, perf_event__state_init(sibling); put_ctx(gctx); } - mutex_unlock(&gctx->mutex); - put_ctx(gctx); + } else { + mutex_lock(&ctx->mutex); } WARN_ON_ONCE(ctx->parent_ctx); - mutex_lock(&ctx->mutex); if (move_group) { + /* + * Wait for everybody to stop referencing the events through + * the old lists, before installing it on new lists. + */ synchronize_rcu(); + perf_install_in_context(ctx, group_leader, group_leader->cpu); get_ctx(ctx); list_for_each_entry(sibling, &group_leader->sibling_list, @@ -7523,7 +7758,14 @@ SYSCALL_DEFINE5(perf_event_open, perf_install_in_context(ctx, event, event->cpu); perf_unpin_context(ctx); + + if (move_group) { + perf_event_ctx_unlock(group_leader, gctx); + put_ctx(gctx); + } mutex_unlock(&ctx->mutex); + if (group_leader) + mutex_unlock(&group_leader->group_leader_mutex); put_online_cpus(); @@ -7549,6 +7791,11 @@ SYSCALL_DEFINE5(perf_event_open, fd_install(event_fd, event_file); return event_fd; +err_locked: + if (move_group) + perf_event_ctx_unlock(group_leader, gctx); + mutex_unlock(&ctx->mutex); + fput(event_file); err_context: perf_unpin_context(ctx); put_ctx(ctx); @@ -7560,6 +7807,8 @@ SYSCALL_DEFINE5(perf_event_open, if (task) put_task_struct(task); err_group_fd: + if (group_leader) + mutex_unlock(&group_leader->group_leader_mutex); fdput(group); err_fd: put_unused_fd(event_fd); @@ -7630,7 +7879,11 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu) src_ctx = &per_cpu_ptr(pmu->pmu_cpu_context, src_cpu)->ctx; dst_ctx = &per_cpu_ptr(pmu->pmu_cpu_context, dst_cpu)->ctx; - mutex_lock(&src_ctx->mutex); + /* + * See perf_event_ctx_lock() for comments on the details + * of swizzling perf_event::ctx. + */ + mutex_lock_double(&src_ctx->mutex, &dst_ctx->mutex); list_for_each_entry_safe(event, tmp, &src_ctx->event_list, event_entry) { perf_remove_from_context(event, false); @@ -7638,11 +7891,9 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu) put_ctx(src_ctx); list_add(&event->migrate_entry, &events); } - mutex_unlock(&src_ctx->mutex); synchronize_rcu(); - mutex_lock(&dst_ctx->mutex); list_for_each_entry_safe(event, tmp, &events, migrate_entry) { list_del(&event->migrate_entry); if (event->state >= PERF_EVENT_STATE_OFF) @@ -7652,6 +7903,7 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu) get_ctx(dst_ctx); } mutex_unlock(&dst_ctx->mutex); + mutex_unlock(&src_ctx->mutex); } EXPORT_SYMBOL_GPL(perf_pmu_migrate_context); @@ -8173,7 +8425,6 @@ static void perf_event_init_cpu(int cpu) struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu); mutex_lock(&swhash->hlist_mutex); - swhash->online = true; if (swhash->hlist_refcount > 0) { struct swevent_hlist *hlist; @@ -8273,14 +8524,7 @@ static void perf_event_start_swclock(int cpu) static void perf_event_exit_cpu(int cpu) { - struct swevent_htable *swhash = &per_cpu(swevent_htable, cpu); - perf_event_exit_cpu_context(cpu); - - mutex_lock(&swhash->hlist_mutex); - swhash->online = false; - swevent_hlist_release(swhash); - mutex_unlock(&swhash->hlist_mutex); } #else static inline void perf_event_exit_cpu(int cpu) { } diff --git a/kernel/fork.c b/kernel/fork.c index 600956bafb8df..3eac3fd8c71e1 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -76,6 +76,8 @@ #include #include +#include + #include #include #include @@ -151,16 +153,24 @@ void __weak arch_release_thread_info(struct thread_info *ti) static struct thread_info *alloc_thread_info_node(struct task_struct *tsk, int node) { +#ifdef CONFIG_RTMM + struct page *page = rtmm_alloc_pages(RTMM_POOL_THREADINFO); +#else struct page *page = alloc_kmem_pages_node(node, THREADINFO_GFP, THREAD_SIZE_ORDER); +#endif return page ? page_address(page) : NULL; } static inline void free_thread_info(struct thread_info *ti) { +#ifdef CONFIG_RTMM + rtmm_free_pages(ti, RTMM_POOL_THREADINFO); +#else kasan_alloc_pages(virt_to_page(ti), THREAD_SIZE_ORDER); free_kmem_pages((unsigned long)ti, THREAD_SIZE_ORDER); +#endif } # else static struct kmem_cache *thread_info_cache; @@ -661,6 +671,27 @@ void __mmdrop(struct mm_struct *mm) } EXPORT_SYMBOL_GPL(__mmdrop); +static inline void __mmput(struct mm_struct *mm) +{ + VM_BUG_ON(atomic_read(&mm->mm_users)); + + uprobe_clear_state(mm); + exit_aio(mm); + ksm_exit(mm); + khugepaged_exit(mm); /* must run before exit_mmap */ + exit_mmap(mm); + set_mm_exe_file(mm, NULL); + if (!list_empty(&mm->mmlist)) { + spin_lock(&mmlist_lock); + list_del(&mm->mmlist); + spin_unlock(&mmlist_lock); + } + if (mm->binfmt) + module_put(mm->binfmt->module); + mmdrop(mm); +} + + /* * Decrement the use count and release all resources for an mm. */ @@ -670,26 +701,27 @@ int mmput(struct mm_struct *mm) might_sleep(); if (atomic_dec_and_test(&mm->mm_users)) { - uprobe_clear_state(mm); - exit_aio(mm); - ksm_exit(mm); - khugepaged_exit(mm); /* must run before exit_mmap */ - exit_mmap(mm); - set_mm_exe_file(mm, NULL); - if (!list_empty(&mm->mmlist)) { - spin_lock(&mmlist_lock); - list_del(&mm->mmlist); - spin_unlock(&mmlist_lock); - } - if (mm->binfmt) - module_put(mm->binfmt->module); - mmdrop(mm); + __mmput(mm); mm_freed = 1; } return mm_freed; } EXPORT_SYMBOL_GPL(mmput); +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); + } +} + void set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file) { if (new_exe_file) @@ -756,8 +788,7 @@ struct mm_struct *mm_access(struct task_struct *task, unsigned int mode) mm = get_task_mm(task); if (mm && mm != current->mm && - !ptrace_may_access(task, mode) && - !capable(CAP_SYS_RESOURCE)) { + !ptrace_may_access(task, mode)) { mmput(mm); mm = ERR_PTR(-EACCES); } diff --git a/kernel/locking/mcs_spinlock.c b/kernel/locking/mcs_spinlock.c index 9887a905a7626..1ac5ee932dc0a 100644 --- a/kernel/locking/mcs_spinlock.c +++ b/kernel/locking/mcs_spinlock.c @@ -1,6 +1,7 @@ #include #include #include "mcs_spinlock.h" +#include #ifdef CONFIG_SMP @@ -87,6 +88,7 @@ bool osq_lock(struct optimistic_spin_queue *lock) { struct optimistic_spin_node *node = this_cpu_ptr(&osq_node); struct optimistic_spin_node *prev, *next; + struct task_struct *task = current; int curr = encode_cpu(smp_processor_id()); int old; @@ -100,6 +102,32 @@ bool osq_lock(struct optimistic_spin_queue *lock) prev = decode_cpu(old); node->prev = prev; + + /* + * We need to avoid reordering of link updation sequence of osq. + * A case in which the status of optimistic spin queue is + * CPU6->CPU2 in which CPU6 has acquired the lock. At this point + * if CPU0 comes in to acquire osq_lock, it will update the tail + * count. After tail count update if CPU2 starts to unqueue itself + * from optimistic spin queue, it will find updated tail count with + * CPU0 and update CPU2 node->next to NULL in osq_wait_next(). If + * reordering of following stores happen then prev->next where prev + * being CPU2 would be updated to point to CPU0 node: + * node->prev = prev; + * WRITE_ONCE(prev->next, node); + * + * At this point if next instruction + * WRITE_ONCE(next->prev, prev); + * in CPU2 path is committed before the update of CPU0 node->prev = + * prev then CPU0 node->prev will point to CPU6 node. At this point + * if CPU0 path's node->prev = prev is committed resulting in change + * of CPU0 prev back to CPU2 node. CPU2 node->next is NULL, so if + * CPU0 gets into unqueue path of osq_lock it will keep spinning + * in infinite loop as condition prev->next == node will never be + * true. + */ + smp_mb(); + ACCESS_ONCE(prev->next) = node; /* @@ -114,8 +142,13 @@ bool osq_lock(struct optimistic_spin_queue *lock) while (!smp_load_acquire(&node->locked)) { /* * If we need to reschedule bail... so we can block. + * If a task spins on owner on a CPU after acquiring + * osq_lock while a RT task spins on another CPU to + * acquire osq_lock, it will starve the owner from + * completing if owner is to be scheduled on the same CPU. + * It will be a live lock. */ - if (need_resched()) + if (need_resched() || rt_task(task)) goto unqueue; cpu_relax_lowlatency(); diff --git a/kernel/pid.c b/kernel/pid.c index 82430c858d697..65a386e248110 100644 --- a/kernel/pid.c +++ b/kernel/pid.c @@ -523,8 +523,11 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type, if (!ns) ns = task_active_pid_ns(current); if (likely(pid_alive(task))) { - if (type != PIDTYPE_PID) + if (type != PIDTYPE_PID) { + if (type == __PIDTYPE_TGID) + type = PIDTYPE_PID; task = task->group_leader; + } nr = pid_nr_ns(task->pids[type].pid, ns); } rcu_read_unlock(); @@ -533,12 +536,6 @@ pid_t __task_pid_nr_ns(struct task_struct *task, enum pid_type type, } EXPORT_SYMBOL(__task_pid_nr_ns); -pid_t task_tgid_nr_ns(struct task_struct *tsk, struct pid_namespace *ns) -{ - return pid_nr_ns(task_tgid(tsk), ns); -} -EXPORT_SYMBOL(task_tgid_nr_ns); - struct pid_namespace *task_active_pid_ns(struct task_struct *tsk) { return ns_of_pid(task_pid(tsk)); diff --git a/kernel/power/Kconfig b/kernel/power/Kconfig index 67ecc6b59e1c6..e1e59512337b8 100644 --- a/kernel/power/Kconfig +++ b/kernel/power/Kconfig @@ -18,6 +18,16 @@ config SUSPEND_FREEZER Turning OFF this setting is NOT recommended! If in doubt, say Y. +config SUSPEND_SKIP_SYNC + bool "Skip kernel's sys_sync() on suspend to RAM/standby" + depends on SUSPEND + depends on EXPERT + help + Skip the kernel sys_sync() before freezing user processes. + Some systems prefer not to pay this cost on every invocation + of suspend, or they are content with invoking sync() from + user-space before invoking suspend. Say Y if that's your case. + config WAKELOCK bool "Android's method of preventing suspend" default y diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c index a212348cbfbfb..08deeaf752d7e 100644 --- a/kernel/power/suspend.c +++ b/kernel/power/suspend.c @@ -463,11 +463,13 @@ static int enter_state(suspend_state_t state) if (state == PM_SUSPEND_FREEZE) freeze_begin(); +#ifndef CONFIG_SUSPEND_SKIP_SYNC trace_suspend_resume(TPS("sync_filesystems"), 0, true); printk(KERN_INFO "PM: Syncing filesystems ... "); sys_sync(); printk("done.\n"); trace_suspend_resume(TPS("sync_filesystems"), 0, false); +#endif pr_debug("PM: Preparing system for %s sleep\n", pm_states[state]); error = suspend_prepare(state); diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 6c5eeee441e99..c8832a4091493 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -3476,8 +3476,10 @@ static int rcu_cpu_notify(struct notifier_block *self, case CPU_DEAD_FROZEN: case CPU_UP_CANCELED: case CPU_UP_CANCELED_FROZEN: - for_each_rcu_flavor(rsp) + for_each_rcu_flavor(rsp) { rcu_cleanup_dead_cpu(cpu, rsp); + do_nocb_deferred_wakeup(per_cpu_ptr(rsp->rda, cpu)); + } break; default: break; diff --git a/kernel/sched/Makefile b/kernel/sched/Makefile index 45679c741541e..15cb264f1aff4 100644 --- a/kernel/sched/Makefile +++ b/kernel/sched/Makefile @@ -25,3 +25,4 @@ obj-$(CONFIG_SCHED_AUTOGROUP) += auto_group.o obj-$(CONFIG_SCHEDSTATS) += stats.o obj-$(CONFIG_SCHED_DEBUG) += debug.o obj-$(CONFIG_CGROUP_CPUACCT) += cpuacct.o +obj-$(CONFIG_SCHED_CORE_CTL) += core_ctl.o diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 86bac83457e5a..81ce793db58ee 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -963,18 +963,20 @@ static void set_load_weight(struct task_struct *p) load->inv_weight = prio_to_wmult[prio]; } -static void enqueue_task(struct rq *rq, struct task_struct *p, int flags) +static inline void enqueue_task(struct rq *rq, struct task_struct *p, int flags) { update_rq_clock(rq); - sched_info_queued(rq, p); + if (!(flags & ENQUEUE_RESTORE)) + sched_info_queued(rq, p); p->sched_class->enqueue_task(rq, p, flags); trace_sched_enq_deq_task(p, 1, cpumask_bits(&p->cpus_allowed)[0]); } -static void dequeue_task(struct rq *rq, struct task_struct *p, int flags) +static inline void dequeue_task(struct rq *rq, struct task_struct *p, int flags) { update_rq_clock(rq); - sched_info_dequeued(rq, p); + if (!(flags & DEQUEUE_SAVE)) + sched_info_dequeued(rq, p); p->sched_class->dequeue_task(rq, p, flags); trace_sched_enq_deq_task(p, 0, cpumask_bits(&p->cpus_allowed)[0]); } @@ -3964,7 +3966,14 @@ static void remove_task_from_group(struct task_struct *p) if (empty_group) { list_del(&grp->list); + /* + * RCU, kswapd etc tasks can get woken up from + * call_rcu(). As the wakeup path also acquires + * the related_thread_group_lock, drop it here. + */ + write_unlock(&related_thread_group_lock); call_rcu(&grp->rcu, free_related_thread_group); + write_lock(&related_thread_group_lock); } } @@ -4770,7 +4779,7 @@ ttwu_stat(struct task_struct *p, int cpu, int wake_flags) #endif /* CONFIG_SCHEDSTATS */ } -static void ttwu_activate(struct rq *rq, struct task_struct *p, int en_flags) +static inline void ttwu_activate(struct rq *rq, struct task_struct *p, int en_flags) { activate_task(rq, p, en_flags); p->on_rq = TASK_ON_RQ_QUEUED; @@ -5246,6 +5255,10 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) __dl_clear_params(p); INIT_LIST_HEAD(&p->rt.run_list); + p->rt.timeout = 0; + p->rt.time_slice = sched_rr_timeslice; + p->rt.on_rq = 0; + p->rt.on_list = 0; #ifdef CONFIG_PREEMPT_NOTIFIERS INIT_HLIST_HEAD(&p->preempt_notifiers); @@ -5636,6 +5649,9 @@ prepare_task_switch(struct rq *rq, struct task_struct *prev, #ifdef CONFIG_MSM_APP_SETTINGS if (use_app_setting) switch_app_setting_bit(prev, next); + + if (use_32bit_app_setting || use_32bit_app_setting_pro) + switch_32bit_app_setting_bit(prev, next); #endif } @@ -6158,7 +6174,8 @@ static noinline void __schedule_bug(struct task_struct *prev) static inline void schedule_debug(struct task_struct *prev) { #ifdef CONFIG_SCHED_STACK_END_CHECK - BUG_ON(unlikely(task_stack_end_corrupted(prev))); + if (unlikely(task_stack_end_corrupted(prev))) + panic("corrupted stack end detected inside scheduler\n"); #endif /* * Test if we are atomic. Since do_exit() needs to call into @@ -6519,7 +6536,7 @@ EXPORT_SYMBOL(default_wake_function); */ void rt_mutex_setprio(struct task_struct *p, int prio) { - int oldprio, queued, running, enqueue_flag = 0; + int oldprio, queued, running, queue_flag = DEQUEUE_SAVE | DEQUEUE_MOVE; struct rq *rq; const struct sched_class *prev_class; @@ -6547,11 +6564,15 @@ void rt_mutex_setprio(struct task_struct *p, int prio) trace_sched_pi_setprio(p, prio); oldprio = p->prio; + + if (oldprio == prio) + queue_flag &= ~DEQUEUE_MOVE; + prev_class = p->sched_class; queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, queue_flag); if (running) put_prev_task(rq, p); @@ -6570,7 +6591,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) (pi_task && dl_entity_preempt(&pi_task->dl, &p->dl))) { p->dl.dl_boosted = 1; p->dl.dl_throttled = 0; - enqueue_flag = ENQUEUE_REPLENISH; + queue_flag |= ENQUEUE_REPLENISH; } else p->dl.dl_boosted = 0; p->sched_class = &dl_sched_class; @@ -6578,7 +6599,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) if (dl_prio(oldprio)) p->dl.dl_boosted = 0; if (oldprio < prio) - enqueue_flag = ENQUEUE_HEAD; + queue_flag |= ENQUEUE_HEAD; p->sched_class = &rt_sched_class; } else { if (dl_prio(oldprio)) @@ -6593,7 +6614,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) if (running) p->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, p, enqueue_flag); + enqueue_task(rq, p, queue_flag); check_class_changed(rq, p, prev_class, oldprio); out_unlock: @@ -6626,7 +6647,7 @@ void set_user_nice(struct task_struct *p, long nice) } queued = task_on_rq_queued(p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); p->static_prio = NICE_TO_PRIO(nice); set_load_weight(p); @@ -6635,7 +6656,7 @@ void set_user_nice(struct task_struct *p, long nice) delta = p->prio - old_prio; if (queued) { - enqueue_task(rq, p, 0); + enqueue_task(rq, p, ENQUEUE_RESTORE); /* * If the task increased its priority or is running and * lowered its priority, then reschedule its CPU: @@ -6915,6 +6936,7 @@ static int __sched_setscheduler(struct task_struct *p, const struct sched_class *prev_class; struct rq *rq; int reset_on_fork; + int queue_flags = DEQUEUE_SAVE | DEQUEUE_MOVE; /* may grab non-irq protected spin_locks */ BUG_ON(in_interrupt()); @@ -7099,16 +7121,13 @@ static int __sched_setscheduler(struct task_struct *p, * itself. */ new_effective_prio = rt_mutex_get_effective_prio(p, newprio); - if (new_effective_prio == oldprio) { - __setscheduler_params(p, attr); - task_rq_unlock(rq, p, &flags); - return 0; - } + if (new_effective_prio == oldprio) + queue_flags &= ~DEQUEUE_MOVE; queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, queue_flags); if (running) put_prev_task(rq, p); @@ -7122,7 +7141,10 @@ static int __sched_setscheduler(struct task_struct *p, * We enqueue to tail when the priority of a task is * increased (user space view). */ - enqueue_task(rq, p, oldprio <= p->prio ? ENQUEUE_HEAD : 0); + if (oldprio < p->prio) + queue_flags |= ENQUEUE_HEAD; + + enqueue_task(rq, p, queue_flags); } check_class_changed(rq, p, prev_class, oldprio); @@ -8358,7 +8380,7 @@ void sched_setnuma(struct task_struct *p, int nid) running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); if (running) put_prev_task(rq, p); @@ -8367,7 +8389,7 @@ void sched_setnuma(struct task_struct *p, int nid) if (running) p->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, p, 0); + enqueue_task(rq, p, ENQUEUE_RESTORE); task_rq_unlock(rq, p, &flags); } #endif @@ -11032,7 +11054,7 @@ void sched_move_task(struct task_struct *tsk) queued = task_on_rq_queued(tsk); if (queued) - dequeue_task(rq, tsk, 0); + dequeue_task(rq, tsk, DEQUEUE_SAVE | DEQUEUE_MOVE); if (unlikely(running)) put_prev_task(rq, tsk); @@ -11056,7 +11078,7 @@ void sched_move_task(struct task_struct *tsk) if (unlikely(running)) tsk->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, tsk, 0); + enqueue_task(rq, tsk, ENQUEUE_RESTORE | ENQUEUE_MOVE); task_rq_unlock(rq, tsk, &flags); } diff --git a/kernel/sched/core_ctl.c b/kernel/sched/core_ctl.c new file mode 100644 index 0000000000000..0897b8d7685d0 --- /dev/null +++ b/kernel/sched/core_ctl.c @@ -0,0 +1,1115 @@ +/* Copyright (c) 2014-2016, 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define MAX_CPUS_PER_GROUP 4 + +struct cpu_data { + /* Per CPU data. */ + bool inited; + bool online; + bool rejected; + bool is_busy; + bool not_preferred; + unsigned int busy; + unsigned int cpu; + struct list_head sib; + unsigned int first_cpu; + struct list_head pending_sib; + + /* Per cluster data set only on first CPU */ + unsigned int min_cpus; + unsigned int max_cpus; + unsigned int offline_delay_ms; + unsigned int busy_up_thres[MAX_CPUS_PER_GROUP]; + unsigned int busy_down_thres[MAX_CPUS_PER_GROUP]; + unsigned int online_cpus; + unsigned int avail_cpus; + unsigned int num_cpus; + unsigned int need_cpus; + unsigned int task_thres; + s64 need_ts; + struct list_head lru; + bool pending; + spinlock_t pending_lock; + bool is_big_cluster; + int nrrun; + bool nrrun_changed; + struct timer_list timer; + struct task_struct *hotplug_thread; + struct kobject kobj; + struct list_head pending_lru; + bool disabled; +}; + +static DEFINE_PER_CPU(struct cpu_data, cpu_state); +static DEFINE_SPINLOCK(state_lock); +static DEFINE_SPINLOCK(pending_lru_lock); +static DEFINE_MUTEX(lru_lock); + +static void apply_need(struct cpu_data *f); +static void wake_up_hotplug_thread(struct cpu_data *state); +static void add_to_pending_lru(struct cpu_data *state); +static void update_lru(struct cpu_data *state); + +/* ========================= sysfs interface =========================== */ + +static ssize_t store_min_cpus(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + state->min_cpus = min(val, state->max_cpus); + wake_up_hotplug_thread(state); + + return count; +} + +static ssize_t show_min_cpus(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->min_cpus); +} + +static ssize_t store_max_cpus(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + val = min(val, state->num_cpus); + state->max_cpus = val; + state->min_cpus = min(state->min_cpus, state->max_cpus); + wake_up_hotplug_thread(state); + + return count; +} + +static ssize_t show_max_cpus(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->max_cpus); +} + +static ssize_t store_offline_delay_ms(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + state->offline_delay_ms = val; + apply_need(state); + + return count; +} + +static ssize_t show_task_thres(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->task_thres); +} + +static ssize_t store_task_thres(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + if (val < state->num_cpus) + return -EINVAL; + + state->task_thres = val; + apply_need(state); + + return count; +} + +static ssize_t show_offline_delay_ms(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->offline_delay_ms); +} + +static ssize_t store_busy_up_thres(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val[MAX_CPUS_PER_GROUP]; + int ret, i; + + ret = sscanf(buf, "%u %u %u %u\n", &val[0], &val[1], &val[2], &val[3]); + if (ret != 1 && ret != state->num_cpus) + return -EINVAL; + + if (ret == 1) { + for (i = 0; i < state->num_cpus; i++) + state->busy_up_thres[i] = val[0]; + } else { + for (i = 0; i < state->num_cpus; i++) + state->busy_up_thres[i] = val[i]; + } + apply_need(state); + return count; +} + +static ssize_t show_busy_up_thres(struct cpu_data *state, char *buf) +{ + int i, count = 0; + + for (i = 0; i < state->num_cpus; i++) + count += snprintf(buf + count, PAGE_SIZE - count, "%u ", + state->busy_up_thres[i]); + count += snprintf(buf + count, PAGE_SIZE - count, "\n"); + return count; +} + +static ssize_t store_busy_down_thres(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val[MAX_CPUS_PER_GROUP]; + int ret, i; + + ret = sscanf(buf, "%u %u %u %u\n", &val[0], &val[1], &val[2], &val[3]); + if (ret != 1 && ret != state->num_cpus) + return -EINVAL; + + if (ret == 1) { + for (i = 0; i < state->num_cpus; i++) + state->busy_down_thres[i] = val[0]; + } else { + for (i = 0; i < state->num_cpus; i++) + state->busy_down_thres[i] = val[i]; + } + apply_need(state); + return count; +} + +static ssize_t show_busy_down_thres(struct cpu_data *state, char *buf) +{ + int i, count = 0; + + for (i = 0; i < state->num_cpus; i++) + count += snprintf(buf + count, PAGE_SIZE - count, "%u ", + state->busy_down_thres[i]); + count += snprintf(buf + count, PAGE_SIZE - count, "\n"); + return count; +} + +static ssize_t store_is_big_cluster(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + state->is_big_cluster = val ? 1 : 0; + return count; +} + +static ssize_t show_is_big_cluster(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->is_big_cluster); +} + +static ssize_t show_cpus(struct cpu_data *state, char *buf) +{ + struct cpu_data *c; + ssize_t count = 0; + unsigned long flags; + + spin_lock_irqsave(&state_lock, flags); + list_for_each_entry(c, &state->lru, sib) { + count += snprintf(buf + count, PAGE_SIZE - count, + "CPU%u (%s)\n", c->cpu, + c->online ? "Online" : "Offline"); + } + spin_unlock_irqrestore(&state_lock, flags); + return count; +} + +static ssize_t show_need_cpus(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->need_cpus); +} + +static ssize_t show_online_cpus(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->online_cpus); +} + +static ssize_t show_global_state(struct cpu_data *state, char *buf) +{ + struct cpu_data *c; + ssize_t count = 0; + unsigned int cpu; + + for_each_possible_cpu(cpu) { + count += snprintf(buf + count, PAGE_SIZE - count, + "CPU%u\n", cpu); + c = &per_cpu(cpu_state, cpu); + if (!c->inited) + continue; + count += snprintf(buf + count, PAGE_SIZE - count, + "\tCPU: %u\n", c->cpu); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tOnline: %u\n", c->online); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tRejected: %u\n", c->rejected); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tFirst CPU: %u\n", c->first_cpu); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tBusy%%: %u\n", c->busy); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tIs busy: %u\n", c->is_busy); + if (c->cpu != c->first_cpu) + continue; + count += snprintf(buf + count, PAGE_SIZE - count, + "\tNr running: %u\n", c->nrrun); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tAvail CPUs: %u\n", c->avail_cpus); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tNeed CPUs: %u\n", c->need_cpus); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tStatus: %s\n", + c->disabled ? "disabled" : "enabled"); + } + + return count; +} + +static ssize_t store_not_preferred(struct cpu_data *state, + const char *buf, size_t count) +{ + struct cpu_data *c; + unsigned int i, first_cpu; + unsigned int val[MAX_CPUS_PER_GROUP]; + int ret; + + ret = sscanf(buf, "%u %u %u %u\n", &val[0], &val[1], &val[2], &val[3]); + if (ret != 1 && ret != state->num_cpus) + return -EINVAL; + + first_cpu = state->first_cpu; + + for (i = 0; i < state->num_cpus; i++) { + c = &per_cpu(cpu_state, first_cpu); + c->not_preferred = val[i]; + first_cpu++; + } + + return count; +} + +static ssize_t show_not_preferred(struct cpu_data *state, char *buf) +{ + struct cpu_data *c; + ssize_t count = 0; + unsigned int i, first_cpu; + + first_cpu = state->first_cpu; + + for (i = 0; i < state->num_cpus; i++) { + c = &per_cpu(cpu_state, first_cpu); + count += snprintf(buf + count, PAGE_SIZE - count, + "\tCPU:%d %u\n", first_cpu, c->not_preferred); + first_cpu++; + } + + return count; +} + +static ssize_t store_disable(struct cpu_data *state, + const char *buf, size_t count) +{ + unsigned int val; + + if (sscanf(buf, "%u\n", &val) != 1) + return -EINVAL; + + val = !!val; + + if (state->disabled == val) + return count; + + state->disabled = val; + + if (!state->disabled) + wake_up_hotplug_thread(state); + + + return count; +} + +static ssize_t show_disable(struct cpu_data *state, char *buf) +{ + return snprintf(buf, PAGE_SIZE, "%u\n", state->disabled); +} + +struct core_ctl_attr { + struct attribute attr; + ssize_t (*show)(struct cpu_data *, char *); + ssize_t (*store)(struct cpu_data *, const char *, size_t count); +}; + +#define core_ctl_attr_ro(_name) \ +static struct core_ctl_attr _name = \ +__ATTR(_name, 0444, show_##_name, NULL) + +#define core_ctl_attr_rw(_name) \ +static struct core_ctl_attr _name = \ +__ATTR(_name, 0644, show_##_name, store_##_name) + +core_ctl_attr_rw(min_cpus); +core_ctl_attr_rw(max_cpus); +core_ctl_attr_rw(offline_delay_ms); +core_ctl_attr_rw(busy_up_thres); +core_ctl_attr_rw(busy_down_thres); +core_ctl_attr_rw(task_thres); +core_ctl_attr_rw(is_big_cluster); +core_ctl_attr_ro(cpus); +core_ctl_attr_ro(need_cpus); +core_ctl_attr_ro(online_cpus); +core_ctl_attr_ro(global_state); +core_ctl_attr_rw(not_preferred); +core_ctl_attr_rw(disable); + +static struct attribute *default_attrs[] = { + &min_cpus.attr, + &max_cpus.attr, + &offline_delay_ms.attr, + &busy_up_thres.attr, + &busy_down_thres.attr, + &task_thres.attr, + &is_big_cluster.attr, + &cpus.attr, + &need_cpus.attr, + &online_cpus.attr, + &global_state.attr, + ¬_preferred.attr, + &disable.attr, + NULL +}; + +#define to_cpu_data(k) container_of(k, struct cpu_data, kobj) +#define to_attr(a) container_of(a, struct core_ctl_attr, attr) +static ssize_t show(struct kobject *kobj, struct attribute *attr, char *buf) +{ + struct cpu_data *data = to_cpu_data(kobj); + struct core_ctl_attr *cattr = to_attr(attr); + ssize_t ret = -EIO; + + if (cattr->show) + ret = cattr->show(data, buf); + + return ret; +} + +static ssize_t store(struct kobject *kobj, struct attribute *attr, + const char *buf, size_t count) +{ + struct cpu_data *data = to_cpu_data(kobj); + struct core_ctl_attr *cattr = to_attr(attr); + ssize_t ret = -EIO; + + if (cattr->store) + ret = cattr->store(data, buf, count); + + return ret; +} + +static const struct sysfs_ops sysfs_ops = { + .show = show, + .store = store, +}; + +static struct kobj_type ktype_core_ctl = { + .sysfs_ops = &sysfs_ops, + .default_attrs = default_attrs, +}; + +/* ==================== runqueue based core count =================== */ + +#define RQ_AVG_TOLERANCE 2 +#define RQ_AVG_DEFAULT_MS 20 +#define NR_RUNNING_TOLERANCE 5 +static unsigned int rq_avg_period_ms = RQ_AVG_DEFAULT_MS; + +static s64 rq_avg_timestamp_ms; +static struct timer_list rq_avg_timer; + +static void update_running_avg(bool trigger_update) +{ + int cpu; + struct cpu_data *pcpu; + int avg, iowait_avg, big_avg, old_nrrun; + s64 now; + unsigned long flags; + + spin_lock_irqsave(&state_lock, flags); + + now = ktime_to_ms(ktime_get()); + if (now - rq_avg_timestamp_ms < rq_avg_period_ms - RQ_AVG_TOLERANCE) { + spin_unlock_irqrestore(&state_lock, flags); + return; + } + rq_avg_timestamp_ms = now; + sched_get_nr_running_avg(&avg, &iowait_avg, &big_avg); + + spin_unlock_irqrestore(&state_lock, flags); + + /* + * Round up to the next integer if the average nr running tasks + * is within NR_RUNNING_TOLERANCE/100 of the next integer. + * If normal rounding up is used, it will allow a transient task + * to trigger online event. By the time core is onlined, the task + * has finished. + * Rounding to closest suffers same problem because scheduler + * might only provide running stats per jiffy, and a transient + * task could skew the number for one jiffy. If core control + * samples every 2 jiffies, it will observe 0.5 additional running + * average which rounds up to 1 task. + */ + avg = (avg + NR_RUNNING_TOLERANCE) / 100; + big_avg = (big_avg + NR_RUNNING_TOLERANCE) / 100; + + for_each_possible_cpu(cpu) { + pcpu = &per_cpu(cpu_state, cpu); + if (!pcpu->inited || pcpu->first_cpu != cpu) + continue; + old_nrrun = pcpu->nrrun; + /* + * Big cluster only need to take care of big tasks, but if + * there are not enough big cores, big tasks need to be run + * on little as well. Thus for little's runqueue stat, it + * has to use overall runqueue average, or derive what big + * tasks would have to be run on little. The latter approach + * is not easy to get given core control reacts much slower + * than scheduler, and can't predict scheduler's behavior. + */ + pcpu->nrrun = pcpu->is_big_cluster ? big_avg : avg; + if (pcpu->nrrun != old_nrrun) { + if (trigger_update) + apply_need(pcpu); + else + pcpu->nrrun_changed = true; + } + } +} + +/* adjust needed CPUs based on current runqueue information */ +static unsigned int apply_task_need(struct cpu_data *f, unsigned int new_need) +{ + /* Online all cores if there are enough tasks */ + if (f->nrrun >= f->task_thres) + return f->num_cpus; + + /* only online more cores if there are tasks to run */ + if (f->nrrun > new_need) + return new_need + 1; + + return new_need; +} + +static u64 round_to_nw_start(void) +{ + unsigned long step = msecs_to_jiffies(rq_avg_period_ms); + u64 jif = get_jiffies_64(); + + do_div(jif, step); + return (jif + 1) * step; +} + +static void rq_avg_timer_func(unsigned long not_used) +{ + update_running_avg(true); + mod_timer(&rq_avg_timer, round_to_nw_start()); +} + +/* ======================= load based core count ====================== */ + +static unsigned int apply_limits(struct cpu_data *f, unsigned int need_cpus) +{ + return min(max(f->min_cpus, need_cpus), f->max_cpus); +} + +static bool eval_need(struct cpu_data *f) +{ + unsigned long flags; + struct cpu_data *c; + unsigned int need_cpus = 0, last_need, thres_idx; + int ret = 0; + bool need_flag = false; + s64 now; + + if (unlikely(!f->inited)) + return 0; + + spin_lock_irqsave(&state_lock, flags); + thres_idx = f->online_cpus ? f->online_cpus - 1 : 0; + list_for_each_entry(c, &f->lru, sib) { + if (c->busy >= f->busy_up_thres[thres_idx]) + c->is_busy = true; + else if (c->busy < f->busy_down_thres[thres_idx]) + c->is_busy = false; + need_cpus += c->is_busy; + } + need_cpus = apply_task_need(f, need_cpus); + need_flag = apply_limits(f, need_cpus) != apply_limits(f, f->need_cpus); + last_need = f->need_cpus; + + now = ktime_to_ms(ktime_get()); + + if (need_cpus == last_need) { + f->need_ts = now; + spin_unlock_irqrestore(&state_lock, flags); + return 0; + } + + if (need_cpus > last_need) { + ret = 1; + } else if (need_cpus < last_need) { + s64 elapsed = now - f->need_ts; + + if (elapsed >= f->offline_delay_ms) { + ret = 1; + } else { + mod_timer(&f->timer, jiffies + + msecs_to_jiffies(f->offline_delay_ms)); + } + } + + if (ret) { + f->need_ts = now; + f->need_cpus = need_cpus; + } + + trace_core_ctl_eval_need(f->cpu, last_need, need_cpus, + ret && need_flag); + spin_unlock_irqrestore(&state_lock, flags); + + return ret && need_flag; +} + +static void apply_need(struct cpu_data *f) +{ + if (eval_need(f)) + wake_up_hotplug_thread(f); +} + +static int core_ctl_set_busy(unsigned int cpu, unsigned int busy) +{ + struct cpu_data *c = &per_cpu(cpu_state, cpu); + struct cpu_data *f; + unsigned int old_is_busy = c->is_busy; + + if (!c->inited) + return 0; + f = &per_cpu(cpu_state, c->first_cpu); + + update_running_avg(false); + if (c->busy == busy && !f->nrrun_changed) + return 0; + c->busy = busy; + f->nrrun_changed = false; + + apply_need(f); + trace_core_ctl_set_busy(cpu, busy, old_is_busy, c->is_busy); + return 0; +} + +/* ========================= core count enforcement ==================== */ + +/* + * If current thread is hotplug thread, don't attempt to wake up + * itself or other hotplug threads because it will deadlock. Instead, + * schedule a timer to fire in next timer tick and wake up the thread. + */ +static void wake_up_hotplug_thread(struct cpu_data *state) +{ + unsigned long flags; + int cpu; + struct cpu_data *pcpu; + bool no_wakeup = false; + + if (unlikely(state->disabled)) + return; + + for_each_possible_cpu(cpu) { + pcpu = &per_cpu(cpu_state, cpu); + if (cpu != pcpu->first_cpu) + continue; + if (pcpu->hotplug_thread == current) { + no_wakeup = true; + break; + } + } + + spin_lock_irqsave(&state->pending_lock, flags); + state->pending = true; + spin_unlock_irqrestore(&state->pending_lock, flags); + + if (no_wakeup) { + spin_lock_irqsave(&state_lock, flags); + mod_timer(&state->timer, jiffies); + spin_unlock_irqrestore(&state_lock, flags); + } else { + wake_up_process(state->hotplug_thread); + } +} + +static void core_ctl_timer_func(unsigned long cpu) +{ + struct cpu_data *state = &per_cpu(cpu_state, cpu); + unsigned long flags; + + if (eval_need(state) && !state->disabled) { + spin_lock_irqsave(&state->pending_lock, flags); + state->pending = true; + spin_unlock_irqrestore(&state->pending_lock, flags); + wake_up_process(state->hotplug_thread); + } + +} + +static int core_ctl_online_core(unsigned int cpu) +{ + int ret; + struct device *dev; + + lock_device_hotplug(); + dev = get_cpu_device(cpu); + if (!dev) { + pr_err("%s: failed to get cpu%d device\n", __func__, cpu); + ret = -ENODEV; + } else { + ret = device_online(dev); + } + unlock_device_hotplug(); + return ret; +} + +static int core_ctl_offline_core(unsigned int cpu) +{ + int ret; + struct device *dev; + + lock_device_hotplug(); + dev = get_cpu_device(cpu); + if (!dev) { + pr_err("%s: failed to get cpu%d device\n", __func__, cpu); + ret = -ENODEV; + } else { + ret = device_offline(dev); + } + unlock_device_hotplug(); + return ret; +} + +static void update_lru(struct cpu_data *f) +{ + struct cpu_data *c, *tmp; + unsigned long flags; + + spin_lock_irqsave(&pending_lru_lock, flags); + spin_lock(&state_lock); + + list_for_each_entry_safe(c, tmp, &f->pending_lru, pending_sib) { + list_del_init(&c->pending_sib); + list_del(&c->sib); + list_add_tail(&c->sib, &f->lru); + } + + spin_unlock(&state_lock); + spin_unlock_irqrestore(&pending_lru_lock, flags); +} + +static void __ref do_hotplug(struct cpu_data *f) +{ + unsigned int need; + struct cpu_data *c, *tmp; + + need = apply_limits(f, f->need_cpus); + pr_debug("Trying to adjust group %u to %u\n", f->first_cpu, need); + + mutex_lock(&lru_lock); + if (f->online_cpus > need) { + list_for_each_entry_safe(c, tmp, &f->lru, sib) { + if (!c->online) + continue; + + if (f->online_cpus == need) + break; + + /* Don't offline busy CPUs. */ + if (c->is_busy) + continue; + + pr_debug("Trying to Offline CPU%u\n", c->cpu); + if (core_ctl_offline_core(c->cpu)) + pr_debug("Unable to Offline CPU%u\n", c->cpu); + } + + /* + * If the number of online CPUs is within the limits, then + * don't force any busy CPUs offline. + */ + if (f->online_cpus <= f->max_cpus) + goto done; + + list_for_each_entry_safe(c, tmp, &f->lru, sib) { + if (!c->online) + continue; + + if (f->online_cpus <= f->max_cpus) + break; + + pr_debug("Trying to Offline CPU%u\n", c->cpu); + if (core_ctl_offline_core(c->cpu)) + pr_debug("Unable to Offline CPU%u\n", c->cpu); + } + } else if (f->online_cpus < need) { + list_for_each_entry_safe(c, tmp, &f->lru, sib) { + if (c->online || c->rejected || c->not_preferred) + continue; + if (f->online_cpus == need) + break; + + pr_debug("Trying to Online CPU%u\n", c->cpu); + if (core_ctl_online_core(c->cpu)) + pr_debug("Unable to Online CPU%u\n", c->cpu); + } + + if (f->online_cpus == need) + goto done; + + + list_for_each_entry_safe(c, tmp, &f->lru, sib) { + if (c->online || c->rejected || !c->not_preferred) + continue; + if (f->online_cpus == need) + break; + + pr_debug("Trying to Online CPU%u\n", c->cpu); + if (core_ctl_online_core(c->cpu)) + pr_debug("Unable to Online CPU%u\n", c->cpu); + } + } +done: + mutex_unlock(&lru_lock); + update_lru(f); +} + +static int __ref try_hotplug(void *data) +{ + struct cpu_data *f = data; + unsigned long flags; + + while (1) { + set_current_state(TASK_INTERRUPTIBLE); + spin_lock_irqsave(&f->pending_lock, flags); + if (!f->pending) { + spin_unlock_irqrestore(&f->pending_lock, flags); + schedule(); + if (kthread_should_stop()) + break; + spin_lock_irqsave(&f->pending_lock, flags); + } + set_current_state(TASK_RUNNING); + f->pending = false; + spin_unlock_irqrestore(&f->pending_lock, flags); + + do_hotplug(f); + } + + return 0; +} + +static void add_to_pending_lru(struct cpu_data *state) +{ + unsigned long flags; + struct cpu_data *f = &per_cpu(cpu_state, state->first_cpu); + + spin_lock_irqsave(&pending_lru_lock, flags); + + if (!list_empty(&state->pending_sib)) + list_del(&state->pending_sib); + list_add_tail(&state->pending_sib, &f->pending_lru); + + spin_unlock_irqrestore(&pending_lru_lock, flags); +} + +static int __ref cpu_callback(struct notifier_block *nfb, + unsigned long action, void *hcpu) +{ + uint32_t cpu = (uintptr_t)hcpu; + struct cpu_data *state = &per_cpu(cpu_state, cpu); + struct cpu_data *f; + int ret = NOTIFY_OK; + unsigned long flags; + + /* Don't affect suspend resume */ + if (action & CPU_TASKS_FROZEN) + return NOTIFY_OK; + + if (unlikely(!state->inited)) + return NOTIFY_OK; + + f = &per_cpu(cpu_state, state->first_cpu); + + switch (action) { + case CPU_UP_PREPARE: + + /* If online state of CPU somehow got out of sync, fix it. */ + if (state->online) { + f->online_cpus--; + state->online = false; + pr_warn("CPU%d offline when state is online\n", cpu); + } + + if (state->rejected) { + state->rejected = false; + f->avail_cpus++; + } + + /* + * If a CPU is in the process of coming up, mark it as online + * so that there's no race with hotplug thread bringing up more + * CPUs than necessary. + */ + if (!f->disabled && + apply_limits(f, f->need_cpus) <= f->online_cpus) { + pr_debug("Prevent CPU%d onlining\n", cpu); + ret = NOTIFY_BAD; + } else { + state->online = true; + f->online_cpus++; + } + break; + + case CPU_ONLINE: + /* + * Moving to the end of the list should only happen in + * CPU_ONLINE and not on CPU_UP_PREPARE to prevent an + * infinite list traversal when thermal (or other entities) + * reject trying to online CPUs. + */ + ret = mutex_trylock(&lru_lock); + if (ret) { + spin_lock_irqsave(&state_lock, flags); + list_del(&state->sib); + list_add_tail(&state->sib, &f->lru); + spin_unlock_irqrestore(&state_lock, flags); + mutex_unlock(&lru_lock); + } else { + /* + * lru_lock is held by our hotplug thread to + * prevent concurrent access of lru list. The updates + * are maintained in pending_lru list and lru is + * updated at the end of do_hotplug(). + */ + add_to_pending_lru(state); + } + break; + + case CPU_DEAD: + /* Move a CPU to the end of the LRU when it goes offline. */ + ret = mutex_trylock(&lru_lock); + if (ret) { + spin_lock_irqsave(&state_lock, flags); + list_del(&state->sib); + list_add_tail(&state->sib, &f->lru); + spin_unlock_irqrestore(&state_lock, flags); + mutex_unlock(&lru_lock); + } else { + add_to_pending_lru(state); + } + /* Fall through */ + + case CPU_UP_CANCELED: + + /* If online state of CPU somehow got out of sync, fix it. */ + if (!state->online) { + f->online_cpus++; + pr_warn("CPU%d online when state is offline\n", cpu); + } + + if (!state->rejected && action == CPU_UP_CANCELED) { + state->rejected = true; + f->avail_cpus--; + } + + state->online = false; + state->busy = 0; + f->online_cpus--; + break; + } + + if (f->online_cpus < apply_limits(f, f->need_cpus) + && f->online_cpus < f->avail_cpus + && action == CPU_DEAD) + wake_up_hotplug_thread(f); + + return ret; +} + +static struct notifier_block __refdata cpu_notifier = { + .notifier_call = cpu_callback, +}; + +/* ============================ init code ============================== */ + +static int group_init(struct cpumask *mask) +{ + struct device *dev; + unsigned int first_cpu = cpumask_first(mask); + struct cpu_data *f = &per_cpu(cpu_state, first_cpu); + struct cpu_data *state; + unsigned int cpu; + struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 }; + + if (likely(f->inited)) + return 0; + + dev = get_cpu_device(first_cpu); + if (!dev) + return -ENODEV; + + pr_info("Creating CPU group %d\n", first_cpu); + + f->num_cpus = cpumask_weight(mask); + if (f->num_cpus > MAX_CPUS_PER_GROUP) { + pr_err("HW configuration not supported\n"); + return -EINVAL; + } + f->min_cpus = 1; + f->max_cpus = f->num_cpus; + f->need_cpus = f->num_cpus; + f->avail_cpus = f->num_cpus; + f->offline_delay_ms = 100; + f->task_thres = UINT_MAX; + f->nrrun = f->num_cpus; + INIT_LIST_HEAD(&f->lru); + INIT_LIST_HEAD(&f->pending_lru); + init_timer(&f->timer); + spin_lock_init(&f->pending_lock); + f->timer.function = core_ctl_timer_func; + f->timer.data = first_cpu; + + for_each_cpu(cpu, mask) { + pr_info("Init CPU%u state\n", cpu); + + state = &per_cpu(cpu_state, cpu); + state->cpu = cpu; + state->first_cpu = first_cpu; + + if (cpu_online(cpu)) { + f->online_cpus++; + state->online = true; + } + + list_add_tail(&state->sib, &f->lru); + INIT_LIST_HEAD(&state->pending_sib); + } + + f->hotplug_thread = kthread_run(try_hotplug, (void *) f, + "core_ctl/%d", first_cpu); + if (IS_ERR(f->hotplug_thread)) + return PTR_ERR(f->hotplug_thread); + sched_setscheduler_nocheck(f->hotplug_thread, SCHED_FIFO, ¶m); + + for_each_cpu(cpu, mask) { + state = &per_cpu(cpu_state, cpu); + state->inited = true; + } + + kobject_init(&f->kobj, &ktype_core_ctl); + return kobject_add(&f->kobj, &dev->kobj, "core_ctl"); +} + +static int cpufreq_policy_cb(struct notifier_block *nb, unsigned long val, + void *data) +{ + struct cpufreq_policy *policy = data; + + switch (val) { + case CPUFREQ_CREATE_POLICY: + group_init(policy->related_cpus); + break; + } + + return NOTIFY_OK; +} + +static struct notifier_block cpufreq_pol_nb = { + .notifier_call = cpufreq_policy_cb, +}; + +static int cpufreq_gov_cb(struct notifier_block *nb, unsigned long val, + void *data) +{ + struct cpufreq_govinfo *info = data; + + switch (val) { + case CPUFREQ_LOAD_CHANGE: + core_ctl_set_busy(info->cpu, info->load); + break; + } + + return NOTIFY_OK; +} + +static struct notifier_block cpufreq_gov_nb = { + .notifier_call = cpufreq_gov_cb, +}; + +static int __init core_ctl_init(void) +{ + struct cpufreq_policy *policy; + unsigned int cpu; + + register_cpu_notifier(&cpu_notifier); + cpufreq_register_notifier(&cpufreq_pol_nb, CPUFREQ_POLICY_NOTIFIER); + cpufreq_register_notifier(&cpufreq_gov_nb, CPUFREQ_GOVINFO_NOTIFIER); + init_timer_deferrable(&rq_avg_timer); + rq_avg_timer.function = rq_avg_timer_func; + + get_online_cpus(); + for_each_online_cpu(cpu) { + policy = cpufreq_cpu_get(cpu); + if (policy) { + group_init(policy->related_cpus); + cpufreq_cpu_put(policy); + } + } + put_online_cpus(); + mod_timer(&rq_avg_timer, round_to_nw_start()); + return 0; +} + +late_initcall(core_ctl_init); diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 063d882bf600b..33f1ba0fc2059 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -3805,7 +3805,21 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, int ret; unsigned int old_val; unsigned int *data = (unsigned int *)table->data; - int update_min_nice = 0; + int update_task_count = 0; + + if (!sched_enable_hmp) + return 0; + + /* + * The policy mutex is acquired with cpu_hotplug.lock + * held from cpu_up()->cpufreq_governor_interactive()-> + * sched_set_window(). So enforce the same order here. + */ + if (write && (data == &sysctl_sched_upmigrate_pct || + data == (unsigned int *)&sysctl_sched_upmigrate_min_nice)) { + update_task_count = 1; + get_online_cpus(); + } mutex_lock(&policy_mutex); @@ -3813,7 +3827,7 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos); - if (ret || !write || !sched_enable_hmp) + if (ret || !write) goto done; if (write && (old_val == *data)) @@ -3828,7 +3842,6 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, ret = -EINVAL; goto done; } - update_min_nice = 1; } else if (data != &sysctl_sched_select_prev_cpu_us) { /* * all tunables other than min_nice and prev_cpu_us are @@ -3850,19 +3863,17 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, * includes taking runqueue lock of all online cpus and re-initiatizing * their big counter values based on changed criteria. */ - if ((data == &sysctl_sched_upmigrate_pct || update_min_nice)) { - get_online_cpus(); + if (update_task_count) pre_big_task_count_change(cpu_online_mask); - } set_hmp_defaults(); - if ((data == &sysctl_sched_upmigrate_pct || update_min_nice)) { + if (update_task_count) post_big_task_count_change(cpu_online_mask); - put_online_cpus(); - } done: + if (update_task_count) + put_online_cpus(); mutex_unlock(&policy_mutex); return ret; } diff --git a/kernel/sched/idle.c b/kernel/sched/idle.c index c232a2c2066a2..7d0cc80f1a885 100644 --- a/kernel/sched/idle.c +++ b/kernel/sched/idle.c @@ -47,7 +47,8 @@ static inline int cpu_idle_poll(void) rcu_idle_enter(); trace_cpu_idle_rcuidle(0, smp_processor_id()); local_irq_enable(); - while (!tif_need_resched()) + while (!tif_need_resched() && + (cpu_idle_force_poll || tick_check_broadcast_expired())) cpu_relax(); trace_cpu_idle_rcuidle(PWR_EVENT_EXIT, smp_processor_id()); rcu_idle_exit(); diff --git a/kernel/sched/qhmp_core.c b/kernel/sched/qhmp_core.c index 9925058aab334..65bc5fc785070 100644 --- a/kernel/sched/qhmp_core.c +++ b/kernel/sched/qhmp_core.c @@ -76,6 +76,8 @@ #include #include #include +#include +#include #include #include @@ -889,18 +891,20 @@ static void set_load_weight(struct task_struct *p) load->inv_weight = prio_to_wmult[prio]; } -static void enqueue_task(struct rq *rq, struct task_struct *p, int flags) +static inline void enqueue_task(struct rq *rq, struct task_struct *p, int flags) { update_rq_clock(rq); - sched_info_queued(rq, p); + if (!(flags & ENQUEUE_RESTORE)) + sched_info_queued(rq, p); p->sched_class->enqueue_task(rq, p, flags); trace_sched_enq_deq_task(p, 1, cpumask_bits(&p->cpus_allowed)[0]); } -static void dequeue_task(struct rq *rq, struct task_struct *p, int flags) +static inline void dequeue_task(struct rq *rq, struct task_struct *p, int flags) { update_rq_clock(rq); - sched_info_dequeued(rq, p); + if (!(flags & DEQUEUE_SAVE)) + sched_info_dequeued(rq, p); p->sched_class->dequeue_task(rq, p, flags); trace_sched_enq_deq_task(p, 0, cpumask_bits(&p->cpus_allowed)[0]); } @@ -1902,6 +1906,9 @@ static void update_task_demand(struct task_struct *p, struct rq *rq, /* Process (window_start - mark_start) first */ add_to_task_demand(rq, p, window_start - mark_start); + ktrace_cpufreq_update_history(p, p->ravg.sum, nr_full_windows, + scale_exec_time(window_size, rq)); + /* Push new sample(s) into task's demand history */ update_history(rq, p, p->ravg.sum, 1, event); if (nr_full_windows) @@ -3211,7 +3218,7 @@ ttwu_stat(struct task_struct *p, int cpu, int wake_flags) #endif /* CONFIG_SCHEDSTATS */ } -static void ttwu_activate(struct rq *rq, struct task_struct *p, int en_flags) +static inline void ttwu_activate(struct rq *rq, struct task_struct *p, int en_flags) { activate_task(rq, p, en_flags); p->on_rq = TASK_ON_RQ_QUEUED; @@ -3229,6 +3236,9 @@ ttwu_do_wakeup(struct rq *rq, struct task_struct *p, int wake_flags) { check_preempt_curr(rq, p, wake_flags); trace_sched_wakeup(p, true); + if (ktrace_sched_match_pid(p->pid)) { + p->last_wakeup = sched_ktime_clock(); + } p->state = TASK_RUNNING; #ifdef CONFIG_SMP @@ -3676,6 +3686,10 @@ static void __sched_fork(unsigned long clone_flags, struct task_struct *p) __dl_clear_params(p); INIT_LIST_HEAD(&p->rt.run_list); + p->rt.timeout = 0; + p->rt.time_slice = sched_rr_timeslice; + p->rt.on_rq = 0; + p->rt.on_list = 0; #ifdef CONFIG_PREEMPT_NOTIFIERS INIT_HLIST_HEAD(&p->preempt_notifiers); @@ -4055,6 +4069,23 @@ static inline void prepare_task_switch(struct rq *rq, struct task_struct *prev, struct task_struct *next) { + if (ktrace_sched_match_pid(prev->pid) && prev->state == TASK_RUNNING) { + prev->last_preempt = sched_ktime_clock(); + } else if (ktrace_sched_match_pid(next->pid) && next->state == TASK_RUNNING) { + s64 now = sched_ktime_clock(); + + if (next->last_preempt) { + ktrace_add_sched_event(KTRACE_SCHED_TYPE_PREEMPT, next->pid, + now, (now - next->last_preempt), NULL); + } else if (next->last_wakeup) { + ktrace_add_sched_event(KTRACE_SCHED_TYPE_WAIT, next->pid, + now, (now - next->last_wakeup), NULL); + } + + next->last_preempt = 0; + next->last_wakeup = 0; + } + trace_sched_switch(prev, next); sched_info_switch(rq, prev, next); perf_event_task_sched_out(prev, next); @@ -4526,7 +4557,8 @@ static noinline void __schedule_bug(struct task_struct *prev) static inline void schedule_debug(struct task_struct *prev) { #ifdef CONFIG_SCHED_STACK_END_CHECK - BUG_ON(unlikely(task_stack_end_corrupted(prev))); + if (unlikely(task_stack_end_corrupted(prev))) + panic("corrupted stack end detected inside scheduler\n"); #endif /* * Test if we are atomic. Since do_exit() needs to call into @@ -4885,7 +4917,7 @@ EXPORT_SYMBOL(default_wake_function); */ void rt_mutex_setprio(struct task_struct *p, int prio) { - int oldprio, queued, running, enqueue_flag = 0; + int oldprio, queued, running, queue_flag = DEQUEUE_SAVE | DEQUEUE_MOVE; struct rq *rq; const struct sched_class *prev_class; @@ -4913,11 +4945,15 @@ void rt_mutex_setprio(struct task_struct *p, int prio) trace_sched_pi_setprio(p, prio); oldprio = p->prio; + + if (oldprio == prio) + queue_flag &= ~DEQUEUE_MOVE; + prev_class = p->sched_class; queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, queue_flag); if (running) put_prev_task(rq, p); @@ -4936,7 +4972,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) (pi_task && dl_entity_preempt(&pi_task->dl, &p->dl))) { p->dl.dl_boosted = 1; p->dl.dl_throttled = 0; - enqueue_flag = ENQUEUE_REPLENISH; + queue_flag |= ENQUEUE_REPLENISH; } else p->dl.dl_boosted = 0; p->sched_class = &dl_sched_class; @@ -4944,7 +4980,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) if (dl_prio(oldprio)) p->dl.dl_boosted = 0; if (oldprio < prio) - enqueue_flag = ENQUEUE_HEAD; + queue_flag |= ENQUEUE_HEAD; p->sched_class = &rt_sched_class; } else { if (dl_prio(oldprio)) @@ -4959,7 +4995,7 @@ void rt_mutex_setprio(struct task_struct *p, int prio) if (running) p->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, p, enqueue_flag); + enqueue_task(rq, p, queue_flag); check_class_changed(rq, p, prev_class, oldprio); out_unlock: @@ -4992,7 +5028,7 @@ void set_user_nice(struct task_struct *p, long nice) } queued = task_on_rq_queued(p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); p->static_prio = NICE_TO_PRIO(nice); set_load_weight(p); @@ -5001,7 +5037,7 @@ void set_user_nice(struct task_struct *p, long nice) delta = p->prio - old_prio; if (queued) { - enqueue_task(rq, p, 0); + enqueue_task(rq, p, ENQUEUE_RESTORE); /* * If the task increased its priority or is running and * lowered its priority, then reschedule its CPU: @@ -5281,6 +5317,7 @@ static int __sched_setscheduler(struct task_struct *p, const struct sched_class *prev_class; struct rq *rq; int reset_on_fork; + int queue_flags = DEQUEUE_SAVE | DEQUEUE_MOVE; /* may grab non-irq protected spin_locks */ BUG_ON(in_interrupt()); @@ -5465,16 +5502,13 @@ static int __sched_setscheduler(struct task_struct *p, * itself. */ new_effective_prio = rt_mutex_get_effective_prio(p, newprio); - if (new_effective_prio == oldprio) { - __setscheduler_params(p, attr); - task_rq_unlock(rq, p, &flags); - return 0; - } + if (new_effective_prio == oldprio) + queue_flags &= ~DEQUEUE_MOVE; queued = task_on_rq_queued(p); running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, queue_flags); if (running) put_prev_task(rq, p); @@ -5488,7 +5522,10 @@ static int __sched_setscheduler(struct task_struct *p, * We enqueue to tail when the priority of a task is * increased (user space view). */ - enqueue_task(rq, p, oldprio <= p->prio ? ENQUEUE_HEAD : 0); + if (oldprio < p->prio) + queue_flags |= ENQUEUE_HEAD; + + enqueue_task(rq, p, queue_flags); } check_class_changed(rq, p, prev_class, oldprio); @@ -6595,7 +6632,8 @@ int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) if (cpumask_equal(&p->cpus_allowed, new_mask)) goto out; - if (!cpumask_intersects(new_mask, cpu_active_mask)) { + dest_cpu = cpumask_any_and(cpu_active_mask, new_mask); + if (dest_cpu >= nr_cpu_ids) { ret = -EINVAL; goto out; } @@ -6606,7 +6644,6 @@ int set_cpus_allowed_ptr(struct task_struct *p, const struct cpumask *new_mask) if (cpumask_test_cpu(task_cpu(p), new_mask)) goto out; - dest_cpu = cpumask_any_and(cpu_active_mask, new_mask); if (task_running(rq, p) || p->state == TASK_WAKING) { struct migration_arg arg = { p, dest_cpu }; /* Need help from migration thread: drop lock and wait. */ @@ -6718,7 +6755,7 @@ void sched_setnuma(struct task_struct *p, int nid) running = task_current(rq, p); if (queued) - dequeue_task(rq, p, 0); + dequeue_task(rq, p, DEQUEUE_SAVE); if (running) put_prev_task(rq, p); @@ -6727,7 +6764,7 @@ void sched_setnuma(struct task_struct *p, int nid) if (running) p->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, p, 0); + enqueue_task(rq, p, ENQUEUE_RESTORE); task_rq_unlock(rq, p, &flags); } #endif @@ -7155,6 +7192,14 @@ static int sched_cpu_active(struct notifier_block *nfb, case CPU_STARTING: set_cpu_rq_start_time(); return NOTIFY_OK; + case CPU_ONLINE: + /* + * At this point a starting CPU has marked itself as online via + * set_cpu_online(). But it might not yet have marked itself + * as active, which is essential from here on. + * + * Thus, fall-through and help the starting CPU along. + */ case CPU_DOWN_FAILED: set_cpu_active((long)hcpu, true); return NOTIFY_OK; @@ -9382,7 +9427,7 @@ void sched_move_task(struct task_struct *tsk) queued = task_on_rq_queued(tsk); if (queued) - dequeue_task(rq, tsk, 0); + dequeue_task(rq, tsk, DEQUEUE_SAVE | DEQUEUE_MOVE); if (unlikely(running)) put_prev_task(rq, tsk); @@ -9406,7 +9451,7 @@ void sched_move_task(struct task_struct *tsk) if (unlikely(running)) tsk->sched_class->set_curr_task(rq); if (queued) - enqueue_task(rq, tsk, 0); + enqueue_task(rq, tsk, ENQUEUE_RESTORE | ENQUEUE_MOVE); task_rq_unlock(rq, tsk, &flags); } diff --git a/kernel/sched/qhmp_fair.c b/kernel/sched/qhmp_fair.c index ebcc53f69c376..c7d12d71ffc42 100644 --- a/kernel/sched/qhmp_fair.c +++ b/kernel/sched/qhmp_fair.c @@ -31,6 +31,7 @@ #include #include #include +#include #include @@ -3056,7 +3057,7 @@ static int best_small_task_cpu(struct task_struct *p, int sync) hmp_capable = !cpumask_equal(&mpc_mask, cpu_possible_mask); - cpumask_and(&search_cpu, tsk_cpus_allowed(p), cpu_online_mask); + cpumask_and(&search_cpu, tsk_cpus_allowed(p), cpu_active_mask); if (unlikely(!cpumask_test_cpu(i, &search_cpu))) { i = cpumask_first(&search_cpu); if (i >= nr_cpu_ids) @@ -3121,7 +3122,7 @@ static int best_small_task_cpu(struct task_struct *p, int sync) return min_cstate_cpu; if (!sysctl_sched_restrict_tasks_spread) { - cpumask_and(&search_cpu, tsk_cpus_allowed(p), cpu_online_mask); + cpumask_and(&search_cpu, tsk_cpus_allowed(p), cpu_active_mask); cpumask_andnot(&search_cpu, &search_cpu, &fb_search_cpu); for_each_cpu(i, &search_cpu) { rq = cpu_rq(i); @@ -3244,7 +3245,7 @@ static int select_packing_target(struct task_struct *p, int best_cpu) if (rq->max_freq <= rq->mostly_idle_freq) return best_cpu; - cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_online_mask); + cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_active_mask); cpumask_and(&search_cpus, &search_cpus, &rq->freq_domain_cpumask); /* Pick the first lowest power cpu as target */ @@ -3316,7 +3317,7 @@ static int select_best_cpu(struct task_struct *p, int target, int reason, } trq = task_rq(p); - cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_online_mask); + cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_active_mask); for_each_cpu(i, &search_cpus) { struct rq *rq = cpu_rq(i); @@ -3883,7 +3884,22 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, int ret; unsigned int old_val; unsigned int *data = (unsigned int *)table->data; - int update_min_nice = 0; + int update_task_count = 0; + + if (!sched_enable_hmp) + return 0; + + /* + * The policy mutex is acquired with cpu_hotplug.lock + * held from cpu_up()->cpufreq_governor_interactive()-> + * sched_set_window(). So enforce the same order here. + */ + if (write && (data == &sysctl_sched_upmigrate_pct || + data == &sysctl_sched_small_task_pct || + data == (unsigned int *)&sysctl_sched_upmigrate_min_nice)) { + update_task_count = 1; + get_online_cpus(); + } mutex_lock(&policy_mutex); @@ -3908,7 +3924,6 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, ret = -EINVAL; goto done; } - update_min_nice = 1; } else { /* all tunables other than min_nice are in percentage */ if (sysctl_sched_downmigrate_pct > @@ -3927,21 +3942,17 @@ int sched_hmp_proc_update_handler(struct ctl_table *table, int write, * includes taking runqueue lock of all online cpus and re-initiatizing * their big/small counter values based on changed criteria. */ - if ((data == &sysctl_sched_upmigrate_pct || - data == &sysctl_sched_small_task_pct || update_min_nice)) { - get_online_cpus(); + if (update_task_count) pre_big_small_task_count_change(cpu_online_mask); - } set_hmp_defaults(); - if ((data == &sysctl_sched_upmigrate_pct || - data == &sysctl_sched_small_task_pct || update_min_nice)) { + if (update_task_count) post_big_small_task_count_change(cpu_online_mask); - put_online_cpus(); - } done: + if (update_task_count) + put_online_cpus(); mutex_unlock(&policy_mutex); return ret; } @@ -4020,7 +4031,7 @@ static int lower_power_cpu_available(struct task_struct *p, int cpu) * This function should be called only when task 'p' fits in the current * CPU which can be ensured by task_will_fit() prior to this. */ - cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_online_mask); + cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_active_mask); cpumask_and(&search_cpus, &search_cpus, &rq->freq_domain_cpumask); cpumask_clear_cpu(lowest_power_cpu, &search_cpus); @@ -4925,6 +4936,12 @@ static void enqueue_sleeper(struct cfs_rq *cfs_rq, struct sched_entity *se) trace_sched_stat_blocked(tsk, delta); + if (ktrace_sched_match_pid(tsk->pid)) { + ktrace_add_sched_event(KTRACE_SCHED_TYPE_BLOCK, + tsk->pid, sched_ktime_clock(), delta, + (void *)get_wchan(tsk)); + } + /* * Blocking time is in units of nanosecs, so shift by * 20 to get a milliseconds-range estimation of the diff --git a/kernel/sched/qhmp_rt.c b/kernel/sched/qhmp_rt.c index 6f2a5c297f493..201cadeca1537 100644 --- a/kernel/sched/qhmp_rt.c +++ b/kernel/sched/qhmp_rt.c @@ -412,7 +412,7 @@ static void dequeue_top_rt_rq(struct rt_rq *rt_rq); static inline int on_rt_rq(struct sched_rt_entity *rt_se) { - return !list_empty(&rt_se->run_list); + return rt_se->on_rq; } #ifdef CONFIG_RT_GROUP_SCHED @@ -458,8 +458,8 @@ static inline struct rt_rq *group_rt_rq(struct sched_rt_entity *rt_se) return rt_se->my_q; } -static void enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head); -static void dequeue_rt_entity(struct sched_rt_entity *rt_se); +static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags); +static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags); static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) { @@ -475,7 +475,7 @@ static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) if (!rt_se) enqueue_top_rt_rq(rt_rq); else if (!on_rt_rq(rt_se)) - enqueue_rt_entity(rt_se, false); + enqueue_rt_entity(rt_se, 0); if (rt_rq->highest_prio.curr < curr->prio) resched_curr(rq); @@ -492,7 +492,7 @@ static void sched_rt_rq_dequeue(struct rt_rq *rt_rq) if (!rt_se) dequeue_top_rt_rq(rt_rq); else if (on_rt_rq(rt_se)) - dequeue_rt_entity(rt_se); + dequeue_rt_entity(rt_se, 0); } static inline int rt_rq_throttled(struct rt_rq *rt_rq) @@ -1231,7 +1231,30 @@ void dec_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) dec_rt_group(rt_se, rt_rq); } -static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) +/* + * Change rt_se->run_list location unless SAVE && !MOVE + * + * assumes ENQUEUE/DEQUEUE flags match + */ +static inline bool move_entity(unsigned int flags) +{ + if ((flags & (DEQUEUE_SAVE | DEQUEUE_MOVE)) == DEQUEUE_SAVE) + return false; + + return true; +} + +static void __delist_rt_entity(struct sched_rt_entity *rt_se, struct rt_prio_array *array) +{ + list_del_init(&rt_se->run_list); + + if (list_empty(array->queue + rt_se_prio(rt_se))) + __clear_bit(rt_se_prio(rt_se), array->bitmap); + + rt_se->on_list = 0; +} + +static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rt_rq *rt_rq = rt_rq_of_se(rt_se); struct rt_prio_array *array = &rt_rq->active; @@ -1244,26 +1267,37 @@ static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) * get throttled and the current group doesn't have any other * active members. */ - if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) + if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) { + if (rt_se->on_list) + __delist_rt_entity(rt_se, array); return; + } - if (head) - list_add(&rt_se->run_list, queue); - else - list_add_tail(&rt_se->run_list, queue); - __set_bit(rt_se_prio(rt_se), array->bitmap); + if (move_entity(flags)) { + WARN_ON_ONCE(rt_se->on_list); + if (flags & ENQUEUE_HEAD) + list_add(&rt_se->run_list, queue); + else + list_add_tail(&rt_se->run_list, queue); + + __set_bit(rt_se_prio(rt_se), array->bitmap); + rt_se->on_list = 1; + } + rt_se->on_rq = 1; inc_rt_tasks(rt_se, rt_rq); } -static void __dequeue_rt_entity(struct sched_rt_entity *rt_se) +static void __dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rt_rq *rt_rq = rt_rq_of_se(rt_se); struct rt_prio_array *array = &rt_rq->active; - list_del_init(&rt_se->run_list); - if (list_empty(array->queue + rt_se_prio(rt_se))) - __clear_bit(rt_se_prio(rt_se), array->bitmap); + if (move_entity(flags)) { + WARN_ON_ONCE(!rt_se->on_list); + __delist_rt_entity(rt_se, array); + } + rt_se->on_rq = 0; dec_rt_tasks(rt_se, rt_rq); } @@ -1272,7 +1306,7 @@ static void __dequeue_rt_entity(struct sched_rt_entity *rt_se) * Because the prio of an upper entry depends on the lower * entries, we must remove entries top - down. */ -static void dequeue_rt_stack(struct sched_rt_entity *rt_se) +static void dequeue_rt_stack(struct sched_rt_entity *rt_se, unsigned int flags) { struct sched_rt_entity *back = NULL; @@ -1285,31 +1319,31 @@ static void dequeue_rt_stack(struct sched_rt_entity *rt_se) for (rt_se = back; rt_se; rt_se = rt_se->back) { if (on_rt_rq(rt_se)) - __dequeue_rt_entity(rt_se); + __dequeue_rt_entity(rt_se, flags); } } -static void enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) +static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rq *rq = rq_of_rt_se(rt_se); - dequeue_rt_stack(rt_se); + dequeue_rt_stack(rt_se, flags); for_each_sched_rt_entity(rt_se) - __enqueue_rt_entity(rt_se, head); + __enqueue_rt_entity(rt_se, flags); enqueue_top_rt_rq(&rq->rt); } -static void dequeue_rt_entity(struct sched_rt_entity *rt_se) +static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rq *rq = rq_of_rt_se(rt_se); - dequeue_rt_stack(rt_se); + dequeue_rt_stack(rt_se, flags); for_each_sched_rt_entity(rt_se) { struct rt_rq *rt_rq = group_rt_rq(rt_se); if (rt_rq && rt_rq->rt_nr_running) - __enqueue_rt_entity(rt_se, false); + __enqueue_rt_entity(rt_se, flags); } enqueue_top_rt_rq(&rq->rt); } @@ -1325,7 +1359,7 @@ enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags) if (flags & ENQUEUE_WAKEUP) rt_se->timeout = 0; - enqueue_rt_entity(rt_se, flags & ENQUEUE_HEAD); + enqueue_rt_entity(rt_se, flags); inc_hmp_sched_stats_rt(rq, p); if (!task_current(rq, p) && p->nr_cpus_allowed > 1) @@ -1337,7 +1371,7 @@ static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags) struct sched_rt_entity *rt_se = &p->rt; update_curr_rt(rq); - dequeue_rt_entity(rt_se); + dequeue_rt_entity(rt_se, flags); dec_hmp_sched_stats_rt(rq, p); dequeue_pushable_task(rq, p); diff --git a/kernel/sched/qhmp_sched.h b/kernel/sched/qhmp_sched.h index 91d0dffaf9090..3a3a048b01e5b 100644 --- a/kernel/sched/qhmp_sched.h +++ b/kernel/sched/qhmp_sched.h @@ -1431,18 +1431,42 @@ static const u32 prio_to_wmult[40] = { /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, }; -#define ENQUEUE_WAKEUP 1 -#define ENQUEUE_HEAD 2 +/* + * {de,en}queue flags: + * + * DEQUEUE_SLEEP - task is no longer runnable + * ENQUEUE_WAKEUP - task just became runnable + * + * SAVE/RESTORE - an otherwise spurious dequeue/enqueue, done to ensure tasks + * are in a known state which allows modification. Such pairs + * should preserve as much state as possible. + * + * MOVE - paired with SAVE/RESTORE, explicitly does not preserve the location + * in the runqueue. + * + * ENQUEUE_HEAD - place at front of runqueue (tail if not specified) + * ENQUEUE_REPLENISH - CBS (replenish runtime and postpone deadline) + * ENQUEUE_WAKING - sched_class::task_waking was called + * + */ + +#define DEQUEUE_SLEEP 0x01 +#define DEQUEUE_SAVE 0x02 /* matches ENQUEUE_RESTORE */ +#define DEQUEUE_MOVE 0x04 /* matches ENQUEUE_MOVE */ +#define DEQUEUE_MIGRATING 0x08 + +#define ENQUEUE_WAKEUP 0x01 +#define ENQUEUE_RESTORE 0x02 +#define ENQUEUE_MOVE 0x04 + +#define ENQUEUE_HEAD 0x08 +#define ENQUEUE_REPLENISH 0x10 #ifdef CONFIG_SMP -#define ENQUEUE_WAKING 4 /* sched_class::task_waking was called */ +#define ENQUEUE_WAKING 0x20 #else -#define ENQUEUE_WAKING 0 +#define ENQUEUE_WAKING 0x00 #endif -#define ENQUEUE_REPLENISH 8 -#define ENQUEUE_MIGRATING 16 - -#define DEQUEUE_SLEEP 1 -#define DEQUEUE_MIGRATING 2 +#define ENQUEUE_MIGRATING 0x40 #define RETRY_TASK ((void *)-1UL) diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index 083b45a9de5b3..ce5fe4aa091b1 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c @@ -412,7 +412,7 @@ static void dequeue_top_rt_rq(struct rt_rq *rt_rq); static inline int on_rt_rq(struct sched_rt_entity *rt_se) { - return !list_empty(&rt_se->run_list); + return rt_se->on_rq; } #ifdef CONFIG_RT_GROUP_SCHED @@ -458,8 +458,8 @@ static inline struct rt_rq *group_rt_rq(struct sched_rt_entity *rt_se) return rt_se->my_q; } -static void enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head); -static void dequeue_rt_entity(struct sched_rt_entity *rt_se); +static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags); +static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags); static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) { @@ -475,7 +475,7 @@ static void sched_rt_rq_enqueue(struct rt_rq *rt_rq) if (!rt_se) enqueue_top_rt_rq(rt_rq); else if (!on_rt_rq(rt_se)) - enqueue_rt_entity(rt_se, false); + enqueue_rt_entity(rt_se, 0); if (rt_rq->highest_prio.curr < curr->prio) resched_curr(rq); @@ -492,7 +492,7 @@ static void sched_rt_rq_dequeue(struct rt_rq *rt_rq) if (!rt_se) dequeue_top_rt_rq(rt_rq); else if (on_rt_rq(rt_se)) - dequeue_rt_entity(rt_se); + dequeue_rt_entity(rt_se, 0); } static inline int rt_rq_throttled(struct rt_rq *rt_rq) @@ -1244,7 +1244,30 @@ void dec_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) dec_rt_group(rt_se, rt_rq); } -static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) +/* + * Change rt_se->run_list location unless SAVE && !MOVE + * + * assumes ENQUEUE/DEQUEUE flags match + */ +static inline bool move_entity(unsigned int flags) +{ + if ((flags & (DEQUEUE_SAVE | DEQUEUE_MOVE)) == DEQUEUE_SAVE) + return false; + + return true; +} + +static void __delist_rt_entity(struct sched_rt_entity *rt_se, struct rt_prio_array *array) +{ + list_del_init(&rt_se->run_list); + + if (list_empty(array->queue + rt_se_prio(rt_se))) + __clear_bit(rt_se_prio(rt_se), array->bitmap); + + rt_se->on_list = 0; +} + +static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rt_rq *rt_rq = rt_rq_of_se(rt_se); struct rt_prio_array *array = &rt_rq->active; @@ -1257,26 +1280,37 @@ static void __enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) * get throttled and the current group doesn't have any other * active members. */ - if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) + if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) { + if (rt_se->on_list) + __delist_rt_entity(rt_se, array); return; + } - if (head) - list_add(&rt_se->run_list, queue); - else - list_add_tail(&rt_se->run_list, queue); - __set_bit(rt_se_prio(rt_se), array->bitmap); + if (move_entity(flags)) { + WARN_ON_ONCE(rt_se->on_list); + if (flags & ENQUEUE_HEAD) + list_add(&rt_se->run_list, queue); + else + list_add_tail(&rt_se->run_list, queue); + + __set_bit(rt_se_prio(rt_se), array->bitmap); + rt_se->on_list = 1; + } + rt_se->on_rq = 1; inc_rt_tasks(rt_se, rt_rq); } -static void __dequeue_rt_entity(struct sched_rt_entity *rt_se) +static void __dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rt_rq *rt_rq = rt_rq_of_se(rt_se); struct rt_prio_array *array = &rt_rq->active; - list_del_init(&rt_se->run_list); - if (list_empty(array->queue + rt_se_prio(rt_se))) - __clear_bit(rt_se_prio(rt_se), array->bitmap); + if (move_entity(flags)) { + WARN_ON_ONCE(!rt_se->on_list); + __delist_rt_entity(rt_se, array); + } + rt_se->on_rq = 0; dec_rt_tasks(rt_se, rt_rq); } @@ -1285,7 +1319,7 @@ static void __dequeue_rt_entity(struct sched_rt_entity *rt_se) * Because the prio of an upper entry depends on the lower * entries, we must remove entries top - down. */ -static void dequeue_rt_stack(struct sched_rt_entity *rt_se) +static void dequeue_rt_stack(struct sched_rt_entity *rt_se, unsigned int flags) { struct sched_rt_entity *back = NULL; @@ -1298,31 +1332,31 @@ static void dequeue_rt_stack(struct sched_rt_entity *rt_se) for (rt_se = back; rt_se; rt_se = rt_se->back) { if (on_rt_rq(rt_se)) - __dequeue_rt_entity(rt_se); + __dequeue_rt_entity(rt_se, flags); } } -static void enqueue_rt_entity(struct sched_rt_entity *rt_se, bool head) +static void enqueue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rq *rq = rq_of_rt_se(rt_se); - dequeue_rt_stack(rt_se); + dequeue_rt_stack(rt_se, flags); for_each_sched_rt_entity(rt_se) - __enqueue_rt_entity(rt_se, head); + __enqueue_rt_entity(rt_se, flags); enqueue_top_rt_rq(&rq->rt); } -static void dequeue_rt_entity(struct sched_rt_entity *rt_se) +static void dequeue_rt_entity(struct sched_rt_entity *rt_se, unsigned int flags) { struct rq *rq = rq_of_rt_se(rt_se); - dequeue_rt_stack(rt_se); + dequeue_rt_stack(rt_se, flags); for_each_sched_rt_entity(rt_se) { struct rt_rq *rt_rq = group_rt_rq(rt_se); if (rt_rq && rt_rq->rt_nr_running) - __enqueue_rt_entity(rt_se, false); + __enqueue_rt_entity(rt_se, flags); } enqueue_top_rt_rq(&rq->rt); } @@ -1338,7 +1372,7 @@ enqueue_task_rt(struct rq *rq, struct task_struct *p, int flags) if (flags & ENQUEUE_WAKEUP) rt_se->timeout = 0; - enqueue_rt_entity(rt_se, flags & ENQUEUE_HEAD); + enqueue_rt_entity(rt_se, flags); inc_hmp_sched_stats_rt(rq, p); if (!task_current(rq, p) && p->nr_cpus_allowed > 1) @@ -1350,7 +1384,7 @@ static void dequeue_task_rt(struct rq *rq, struct task_struct *p, int flags) struct sched_rt_entity *rt_se = &p->rt; update_curr_rt(rq); - dequeue_rt_entity(rt_se); + dequeue_rt_entity(rt_se, flags); dec_hmp_sched_stats_rt(rq, p); dequeue_pushable_task(rq, p); diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index e84a1d16b0e96..63f2797109da7 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1671,18 +1671,42 @@ static const u32 prio_to_wmult[40] = { /* 15 */ 119304647, 148102320, 186737708, 238609294, 286331153, }; -#define ENQUEUE_WAKEUP 1 -#define ENQUEUE_HEAD 2 +/* + * {de,en}queue flags: + * + * DEQUEUE_SLEEP - task is no longer runnable + * ENQUEUE_WAKEUP - task just became runnable + * + * SAVE/RESTORE - an otherwise spurious dequeue/enqueue, done to ensure tasks + * are in a known state which allows modification. Such pairs + * should preserve as much state as possible. + * + * MOVE - paired with SAVE/RESTORE, explicitly does not preserve the location + * in the runqueue. + * + * ENQUEUE_HEAD - place at front of runqueue (tail if not specified) + * ENQUEUE_REPLENISH - CBS (replenish runtime and postpone deadline) + * ENQUEUE_WAKING - sched_class::task_waking was called + * + */ + +#define DEQUEUE_SLEEP 0x01 +#define DEQUEUE_SAVE 0x02 /* matches ENQUEUE_RESTORE */ +#define DEQUEUE_MOVE 0x04 /* matches ENQUEUE_MOVE */ +#define DEQUEUE_MIGRATING 0x08 + +#define ENQUEUE_WAKEUP 0x01 +#define ENQUEUE_RESTORE 0x02 +#define ENQUEUE_MOVE 0x04 + +#define ENQUEUE_HEAD 0x08 +#define ENQUEUE_REPLENISH 0x10 #ifdef CONFIG_SMP -#define ENQUEUE_WAKING 4 /* sched_class::task_waking was called */ +#define ENQUEUE_WAKING 0x20 #else -#define ENQUEUE_WAKING 0 +#define ENQUEUE_WAKING 0x00 #endif -#define ENQUEUE_REPLENISH 8 -#define ENQUEUE_MIGRATING 16 - -#define DEQUEUE_SLEEP 1 -#define DEQUEUE_MIGRATING 2 +#define ENQUEUE_MIGRATING 0x40 #define RETRY_TASK ((void *)-1UL) diff --git a/kernel/sched/sched_avg.c b/kernel/sched/sched_avg.c index c70e0466c36c4..cfb0607f1f5e3 100644 --- a/kernel/sched/sched_avg.c +++ b/kernel/sched/sched_avg.c @@ -107,7 +107,7 @@ EXPORT_SYMBOL(sched_get_nr_running_avg); */ void sched_update_nr_prod(int cpu, long delta, bool inc) { - int diff; + s64 diff; s64 curr_time; unsigned long flags, nr_running; diff --git a/kernel/time/Makefile b/kernel/time/Makefile index d678ca611304b..bfbbb41c07348 100644 --- a/kernel/time/Makefile +++ b/kernel/time/Makefile @@ -1,6 +1,6 @@ obj-y += time.o timer.o hrtimer.o itimer.o posix-timers.o posix-cpu-timers.o obj-y += timekeeping.o ntp.o clocksource.o jiffies.o timer_list.o -obj-y += timeconv.o posix-clock.o alarmtimer.o +obj-y += timeconv.o timecounter.o posix-clock.o alarmtimer.o obj-$(CONFIG_GENERIC_CLOCKEVENTS_BUILD) += clockevents.o obj-$(CONFIG_GENERIC_CLOCKEVENTS) += tick-common.o diff --git a/kernel/time/alarmtimer.c b/kernel/time/alarmtimer.c index 47d256ff51ec7..b250a70b903cd 100644 --- a/kernel/time/alarmtimer.c +++ b/kernel/time/alarmtimer.c @@ -26,6 +26,9 @@ #include #include +#include +#include + #ifdef CONFIG_MSM_PM #include "lpm-levels.h" #endif @@ -54,6 +57,15 @@ static struct wakeup_source *ws; static struct delayed_work work; static struct workqueue_struct *power_off_alarm_workqueue; +#define AUTOWAKEUP_MAGIC 0xA2370000 +#define AUTOWAKEUP_MASK 0x0000FFFF + +static unsigned int auto_wakeup_time = AUTOWAKEUP_MAGIC; +#define AUTOWAKEUP_VALID_TIME_GET() \ + (AUTOWAKEUP_MAGIC == (auto_wakeup_time & (~AUTOWAKEUP_MASK)) ? (AUTOWAKEUP_MASK & auto_wakeup_time) : 0) +module_param_named(auto_wakeup_time, auto_wakeup_time, uint, S_IRUGO | S_IWUSR | S_IWGRP); +MODULE_PARM_DESC(auto_wakeup_time, "vRTC auto wakeup expire time(default is 0s)"); + #ifdef CONFIG_RTC_CLASS /* rtc timer and device for setting alarm wakeups at suspend */ static struct rtc_timer rtctimer; @@ -372,6 +384,7 @@ static int alarmtimer_suspend(struct device *dev) struct rtc_device *rtc; int i; int ret = 0; + unsigned int wakeup_time = 0; cancel_delayed_work_sync(&work); @@ -408,6 +421,12 @@ static int alarmtimer_suspend(struct device *dev) return -EBUSY; } + wakeup_time = AUTOWAKEUP_VALID_TIME_GET(); + if (unlikely(0 != wakeup_time)) { + min = ktime_set(wakeup_time, 0); + pr_err("auto wakeup: wake up in %d seconds\n", wakeup_time); + } + /* Setup a timer to fire that far in the future */ rtc_timer_cancel(rtc, &rtctimer); rtc_read_time(rtc, &tm); @@ -486,10 +505,16 @@ static int alarmtimer_suspend(struct device *dev) return ret; } #endif + +void qpnp_kpdpwr_simulate(void); static int alarmtimer_resume(struct device *dev) { struct rtc_device *rtc; + if (unlikely(0 != AUTOWAKEUP_VALID_TIME_GET())) { + qpnp_kpdpwr_simulate(); + } + rtc = alarmtimer_get_rtcdev(); /* If we have no rtcdev, just return */ if (!rtc) diff --git a/kernel/time/clocksource.c b/kernel/time/clocksource.c index 93aabc88fdc60..6e86678018496 100644 --- a/kernel/time/clocksource.c +++ b/kernel/time/clocksource.c @@ -34,82 +34,6 @@ #include "tick-internal.h" #include "timekeeping_internal.h" -void timecounter_init(struct timecounter *tc, - const struct cyclecounter *cc, - u64 start_tstamp) -{ - tc->cc = cc; - tc->cycle_last = cc->read(cc); - tc->nsec = start_tstamp; -} -EXPORT_SYMBOL_GPL(timecounter_init); - -/** - * timecounter_read_delta - get nanoseconds since last call of this function - * @tc: Pointer to time counter - * - * When the underlying cycle counter runs over, this will be handled - * correctly as long as it does not run over more than once between - * calls. - * - * The first call to this function for a new time counter initializes - * the time tracking and returns an undefined result. - */ -static u64 timecounter_read_delta(struct timecounter *tc) -{ - cycle_t cycle_now, cycle_delta; - u64 ns_offset; - - /* read cycle counter: */ - cycle_now = tc->cc->read(tc->cc); - - /* calculate the delta since the last timecounter_read_delta(): */ - cycle_delta = (cycle_now - tc->cycle_last) & tc->cc->mask; - - /* convert to nanoseconds: */ - ns_offset = cyclecounter_cyc2ns(tc->cc, cycle_delta); - - /* update time stamp of timecounter_read_delta() call: */ - tc->cycle_last = cycle_now; - - return ns_offset; -} - -u64 timecounter_read(struct timecounter *tc) -{ - u64 nsec; - - /* increment time by nanoseconds since last call */ - nsec = timecounter_read_delta(tc); - nsec += tc->nsec; - tc->nsec = nsec; - - return nsec; -} -EXPORT_SYMBOL_GPL(timecounter_read); - -u64 timecounter_cyc2time(struct timecounter *tc, - cycle_t cycle_tstamp) -{ - u64 cycle_delta = (cycle_tstamp - tc->cycle_last) & tc->cc->mask; - u64 nsec; - - /* - * Instead of always treating cycle_tstamp as more recent - * than tc->cycle_last, detect when it is too far in the - * future and treat it as old time stamp instead. - */ - if (cycle_delta > tc->cc->mask / 2) { - cycle_delta = (tc->cycle_last - cycle_tstamp) & tc->cc->mask; - nsec = tc->nsec - cyclecounter_cyc2ns(tc->cc, cycle_delta); - } else { - nsec = cyclecounter_cyc2ns(tc->cc, cycle_delta) + tc->nsec; - } - - return nsec; -} -EXPORT_SYMBOL_GPL(timecounter_cyc2time); - /** * clocks_calc_mult_shift - calculate mult/shift factors for scaled math of clocks * @mult: pointer to mult variable diff --git a/kernel/time/timecounter.c b/kernel/time/timecounter.c new file mode 100644 index 0000000000000..f97fb2145fe29 --- /dev/null +++ b/kernel/time/timecounter.c @@ -0,0 +1,95 @@ +/* + * linux/kernel/time/timecounter.c + * + * based on code that migrated away from + * linux/kernel/time/clocksource.c + * + * 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. + */ + +#include +#include + +void timecounter_init(struct timecounter *tc, + const struct cyclecounter *cc, + u64 start_tstamp) +{ + tc->cc = cc; + tc->cycle_last = cc->read(cc); + tc->nsec = start_tstamp; +} +EXPORT_SYMBOL_GPL(timecounter_init); + +/** + * timecounter_read_delta - get nanoseconds since last call of this function + * @tc: Pointer to time counter + * + * When the underlying cycle counter runs over, this will be handled + * correctly as long as it does not run over more than once between + * calls. + * + * The first call to this function for a new time counter initializes + * the time tracking and returns an undefined result. + */ +static u64 timecounter_read_delta(struct timecounter *tc) +{ + cycle_t cycle_now, cycle_delta; + u64 ns_offset; + + /* read cycle counter: */ + cycle_now = tc->cc->read(tc->cc); + + /* calculate the delta since the last timecounter_read_delta(): */ + cycle_delta = (cycle_now - tc->cycle_last) & tc->cc->mask; + + /* convert to nanoseconds: */ + ns_offset = cyclecounter_cyc2ns(tc->cc, cycle_delta); + + /* update time stamp of timecounter_read_delta() call: */ + tc->cycle_last = cycle_now; + + return ns_offset; +} + +u64 timecounter_read(struct timecounter *tc) +{ + u64 nsec; + + /* increment time by nanoseconds since last call */ + nsec = timecounter_read_delta(tc); + nsec += tc->nsec; + tc->nsec = nsec; + + return nsec; +} +EXPORT_SYMBOL_GPL(timecounter_read); + +u64 timecounter_cyc2time(struct timecounter *tc, + cycle_t cycle_tstamp) +{ + u64 cycle_delta = (cycle_tstamp - tc->cycle_last) & tc->cc->mask; + u64 nsec; + + /* + * Instead of always treating cycle_tstamp as more recent + * than tc->cycle_last, detect when it is too far in the + * future and treat it as old time stamp instead. + */ + if (cycle_delta > tc->cc->mask / 2) { + cycle_delta = (tc->cycle_last - cycle_tstamp) & tc->cc->mask; + nsec = tc->nsec - cyclecounter_cyc2ns(tc->cc, cycle_delta); + } else { + nsec = cyclecounter_cyc2ns(tc->cc, cycle_delta) + tc->nsec; + } + + return nsec; +} +EXPORT_SYMBOL_GPL(timecounter_cyc2time); diff --git a/kernel/trace/ipc_logging.c b/kernel/trace/ipc_logging.c index 6c5b402c510e0..c31bd90ad9f5e 100644 --- a/kernel/trace/ipc_logging.c +++ b/kernel/trace/ipc_logging.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2015,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 @@ -507,8 +507,8 @@ int ipc_log_string(void *ilctxt, const char *fmt, ...) tsv_qtimer_write(&ectxt); avail_size = (MAX_MSG_SIZE - (ectxt.offset + hdr_size)); va_start(arg_list, fmt); - data_size = vsnprintf((ectxt.buff + ectxt.offset + hdr_size), - avail_size, fmt, arg_list); + data_size = vscnprintf((ectxt.buff + ectxt.offset + hdr_size), + avail_size, fmt, arg_list); va_end(arg_list); tsv_write_header(&ectxt, TSV_TYPE_BYTE_ARRAY, data_size); ectxt.offset += data_size; diff --git a/kernel/trace/power-traces.c b/kernel/trace/power-traces.c index 74760614a0048..d89a8e9814100 100644 --- a/kernel/trace/power-traces.c +++ b/kernel/trace/power-traces.c @@ -14,5 +14,3 @@ #include EXPORT_TRACEPOINT_SYMBOL_GPL(cpu_idle); -EXPORT_TRACEPOINT_SYMBOL(core_ctl_set_busy); -EXPORT_TRACEPOINT_SYMBOL(core_ctl_eval_need); diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c index 0fc5cfedcc8c7..7d370a6ebf181 100644 --- a/kernel/trace/ring_buffer.c +++ b/kernel/trace/ring_buffer.c @@ -1693,14 +1693,13 @@ int ring_buffer_resize(struct ring_buffer *buffer, unsigned long size, !cpumask_test_cpu(cpu_id, buffer->cpumask)) return size; - size = DIV_ROUND_UP(size, BUF_PAGE_SIZE); - size *= BUF_PAGE_SIZE; + nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE); /* we need a minimum of two pages */ - if (size < BUF_PAGE_SIZE * 2) - size = BUF_PAGE_SIZE * 2; + if (nr_pages < 2) + nr_pages = 2; - nr_pages = DIV_ROUND_UP(size, BUF_PAGE_SIZE); + size = nr_pages * BUF_PAGE_SIZE; /* * Don't succeed if resizing is disabled, as a reader might be diff --git a/kernel/trace/trace.c b/kernel/trace/trace.c index 445f12467b6bc..de12731d5ade7 100644 --- a/kernel/trace/trace.c +++ b/kernel/trace/trace.c @@ -1285,11 +1285,11 @@ void tracing_reset_all_online_cpus(void) #define SAVED_CMDLINES_DEFAULT 128 #define NO_CMDLINE_MAP UINT_MAX -static unsigned saved_tgids[SAVED_CMDLINES_DEFAULT]; static arch_spinlock_t trace_cmdline_lock = __ARCH_SPIN_LOCK_UNLOCKED; struct saved_cmdlines_buffer { unsigned map_pid_to_cmdline[PID_MAX_DEFAULT+1]; unsigned *map_cmdline_to_pid; + unsigned *map_cmdline_to_tgid; unsigned cmdline_num; int cmdline_idx; char *saved_cmdlines; @@ -1323,12 +1323,23 @@ static int allocate_cmdlines_buffer(unsigned int val, return -ENOMEM; } + s->map_cmdline_to_tgid = kmalloc_array(val, + sizeof(*s->map_cmdline_to_tgid), + GFP_KERNEL); + if (!s->map_cmdline_to_tgid) { + kfree(s->map_cmdline_to_pid); + kfree(s->saved_cmdlines); + return -ENOMEM; + } + s->cmdline_idx = 0; s->cmdline_num = val; memset(&s->map_pid_to_cmdline, NO_CMDLINE_MAP, sizeof(s->map_pid_to_cmdline)); memset(s->map_cmdline_to_pid, NO_CMDLINE_MAP, val * sizeof(*s->map_cmdline_to_pid)); + memset(s->map_cmdline_to_tgid, NO_CMDLINE_MAP, + val * sizeof(*s->map_cmdline_to_tgid)); return 0; } @@ -1494,14 +1505,17 @@ static int trace_save_cmdline(struct task_struct *tsk) if (!tsk->pid || unlikely(tsk->pid > PID_MAX_DEFAULT)) return 0; + preempt_disable(); /* * It's not the end of the world if we don't get * the lock, but we also don't want to spin * nor do we want to disable interrupts, * so if we miss here, then better luck next time. */ - if (!arch_spin_trylock(&trace_cmdline_lock)) + if (!arch_spin_trylock(&trace_cmdline_lock)) { + preempt_enable(); return 0; + } idx = savedcmd->map_pid_to_cmdline[tsk->pid]; if (idx == NO_CMDLINE_MAP) { @@ -1524,8 +1538,9 @@ static int trace_save_cmdline(struct task_struct *tsk) } set_cmdline(idx, tsk->comm); - saved_tgids[idx] = tsk->tgid; + savedcmd->map_cmdline_to_tgid[idx] = tsk->tgid; arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); return 1; } @@ -1551,7 +1566,7 @@ static void __trace_find_cmdline(int pid, char comm[]) map = savedcmd->map_pid_to_cmdline[pid]; if (map != NO_CMDLINE_MAP) - strcpy(comm, get_saved_cmdlines(map)); + strlcpy(comm, get_saved_cmdlines(map), TASK_COMM_LEN - 1); else strcpy(comm, "<...>"); } @@ -1567,19 +1582,29 @@ void trace_find_cmdline(int pid, char comm[]) preempt_enable(); } -int trace_find_tgid(int pid) +static int __find_tgid_locked(int pid) { unsigned map; int tgid; - preempt_disable(); - arch_spin_lock(&trace_cmdline_lock); map = savedcmd->map_pid_to_cmdline[pid]; if (map != NO_CMDLINE_MAP) - tgid = saved_tgids[map]; + tgid = savedcmd->map_cmdline_to_tgid[map]; else tgid = -1; + return tgid; +} + +int trace_find_tgid(int pid) +{ + int tgid; + + preempt_disable(); + arch_spin_lock(&trace_cmdline_lock); + + tgid = __find_tgid_locked(pid); + arch_spin_unlock(&trace_cmdline_lock); preempt_enable(); @@ -3881,10 +3906,15 @@ tracing_saved_cmdlines_size_read(struct file *filp, char __user *ubuf, { char buf[64]; int r; + unsigned int n; + preempt_disable(); arch_spin_lock(&trace_cmdline_lock); - r = scnprintf(buf, sizeof(buf), "%u\n", savedcmd->cmdline_num); + n = savedcmd->cmdline_num; arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); + + r = scnprintf(buf, sizeof(buf), "%u\n", n); return simple_read_from_buffer(ubuf, cnt, ppos, buf, r); } @@ -3893,6 +3923,7 @@ static void free_saved_cmdlines_buffer(struct saved_cmdlines_buffer *s) { kfree(s->saved_cmdlines); kfree(s->map_cmdline_to_pid); + kfree(s->map_cmdline_to_tgid); kfree(s); } @@ -3909,10 +3940,12 @@ static int tracing_resize_saved_cmdlines(unsigned int val) return -ENOMEM; } + preempt_disable(); arch_spin_lock(&trace_cmdline_lock); savedcmd_temp = savedcmd; savedcmd = s; arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); free_saved_cmdlines_buffer(savedcmd_temp); return 0; @@ -3955,33 +3988,61 @@ tracing_saved_tgids_read(struct file *file, char __user *ubuf, char *file_buf; char *buf; int len = 0; - int pid; int i; + int *pids; + int n = 0; - file_buf = kmalloc(SAVED_CMDLINES_DEFAULT*(16+1+16), GFP_KERNEL); - if (!file_buf) - return -ENOMEM; + preempt_disable(); + arch_spin_lock(&trace_cmdline_lock); - buf = file_buf; + pids = kmalloc_array(savedcmd->cmdline_num, 2*sizeof(int), GFP_KERNEL); + if (!pids) { + arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); + return -ENOMEM; + } - for (i = 0; i < SAVED_CMDLINES_DEFAULT; i++) { - int tgid; - int r; + for (i = 0; i < savedcmd->cmdline_num; i++) { + int pid; pid = savedcmd->map_cmdline_to_pid[i]; if (pid == -1 || pid == NO_CMDLINE_MAP) continue; - tgid = trace_find_tgid(pid); - r = sprintf(buf, "%d %d\n", pid, tgid); + pids[n] = pid; + pids[n+1] = __find_tgid_locked(pid); + n += 2; + } + arch_spin_unlock(&trace_cmdline_lock); + preempt_enable(); + + if (n == 0) { + kfree(pids); + return 0; + } + + /* enough to hold max pair of pids + space, lr and nul */ + len = n * 12; + file_buf = kmalloc(len, GFP_KERNEL); + if (!file_buf) { + kfree(pids); + return -ENOMEM; + } + + buf = file_buf; + for (i = 0; i < n && len > 0; i += 2) { + int r; + + r = snprintf(buf, len, "%d %d\n", pids[i], pids[i+1]); buf += r; - len += r; + len -= r; } len = simple_read_from_buffer(ubuf, cnt, ppos, - file_buf, len); + file_buf, buf - file_buf); kfree(file_buf); + kfree(pids); return len; } diff --git a/kernel/trace/trace_printk.c b/kernel/trace/trace_printk.c index 14ffaa59a9e9e..50f750036ab29 100644 --- a/kernel/trace/trace_printk.c +++ b/kernel/trace/trace_printk.c @@ -294,7 +294,7 @@ static int t_show(struct seq_file *m, void *v) if (!*fmt) return 0; - seq_printf(m, "0x%lx : \"", *(unsigned long *)fmt); + seq_printf(m, "0x%lx : \"", 0L); /* * Tabs and new lines need to be converted. diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug index 9b75ae8f0bd06..d6ea0a8ed1dec 100644 --- a/lib/Kconfig.debug +++ b/lib/Kconfig.debug @@ -192,6 +192,21 @@ config ENABLE_MUST_CHECK suppress the "warning: ignoring return value of 'foo', declared with attribute warn_unused_result" messages. +config FIRE_WATCHDOG + bool "Provide watchdog trigger" + default n + depends on PRINTK && MSM_WATCHDOG_V2 + help + Provide a way to trigger watchdog for debugging purpose. + +config DUMP_ALL_STACKS + bool "Show all task stack information in logbuf on panic" + default n + depends on PRINTK && MSM_WATCHDOG_V2 + help + Selecting this option for debugging purpose to dump all task stack + under watchdog disable condition. + config FRAME_WARN int "Warn for stack frames larger than (needs gcc 4.4)" range 0 8192 diff --git a/lib/asn1_decoder.c b/lib/asn1_decoder.c index 1a000bb050f9f..806c5b6b4b3a0 100644 --- a/lib/asn1_decoder.c +++ b/lib/asn1_decoder.c @@ -69,7 +69,7 @@ static int asn1_find_indefinite_length(const unsigned char *data, size_t datalen /* Extract a tag from the data */ tag = data[dp++]; - if (tag == 0) { + if (tag == ASN1_EOC) { /* It appears to be an EOC. */ if (data[dp++] != 0) goto invalid_eoc; @@ -91,10 +91,8 @@ static int asn1_find_indefinite_length(const unsigned char *data, size_t datalen /* Extract the length */ len = data[dp++]; - if (len <= 0x7f) { - dp += len; - goto next_tag; - } + if (len <= 0x7f) + goto check_length; if (unlikely(len == ASN1_INDEFINITE_LENGTH)) { /* Indefinite length */ @@ -105,14 +103,18 @@ static int asn1_find_indefinite_length(const unsigned char *data, size_t datalen } n = len - 0x80; - if (unlikely(n > sizeof(size_t) - 1)) + if (unlikely(n > sizeof(len) - 1)) goto length_too_long; if (unlikely(n > datalen - dp)) goto data_overrun_error; - for (len = 0; n > 0; n--) { + len = 0; + for (; n > 0; n--) { len <<= 8; len |= data[dp++]; } +check_length: + if (len > datalen - dp) + goto data_overrun_error; dp += len; goto next_tag; @@ -208,9 +210,8 @@ int asn1_ber_decoder(const struct asn1_decoder *decoder, unsigned char tmp; /* Skip conditional matches if possible */ - if ((op & ASN1_OP_MATCH__COND && - flags & FLAG_MATCHED) || - dp == datalen) { + if ((op & ASN1_OP_MATCH__COND && flags & FLAG_MATCHED) || + (op & ASN1_OP_MATCH__SKIP && dp == datalen)) { pc += asn1_op_lengths[op]; goto next_op; } diff --git a/lib/assoc_array.c b/lib/assoc_array.c index 2404d03e251a6..03a77f4740c12 100644 --- a/lib/assoc_array.c +++ b/lib/assoc_array.c @@ -523,7 +523,9 @@ static bool assoc_array_insert_into_terminal_node(struct assoc_array_edit *edit, free_slot = i; continue; } - if (ops->compare_object(assoc_array_ptr_to_leaf(ptr), index_key)) { + if (assoc_array_ptr_is_leaf(ptr) && + ops->compare_object(assoc_array_ptr_to_leaf(ptr), + index_key)) { pr_devel("replace in slot %d\n", i); edit->leaf_p = &node->slots[i]; edit->dead_leaf = node->slots[i]; diff --git a/lib/mpi/mpi-pow.c b/lib/mpi/mpi-pow.c index 5464c8744ea95..e24388a863a76 100644 --- a/lib/mpi/mpi-pow.c +++ b/lib/mpi/mpi-pow.c @@ -64,8 +64,13 @@ int mpi_powm(MPI res, MPI base, MPI exp, MPI mod) if (!esize) { /* Exponent is zero, result is 1 mod MOD, i.e., 1 or 0 * depending on if MOD equals 1. */ - rp[0] = 1; res->nlimbs = (msize == 1 && mod->d[0] == 1) ? 0 : 1; + if (res->nlimbs) { + if (mpi_resize(res, 1) < 0) + goto enomem; + rp = res->d; + rp[0] = 1; + } res->sign = 0; goto leave; } diff --git a/mm/cma.c b/mm/cma.c index e1218e26656cd..878c54bb0813a 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -367,6 +367,9 @@ struct page *cma_alloc(struct cma *cma, size_t count, unsigned int align) bitmap_maxno = cma_bitmap_maxno(cma); bitmap_count = cma_bitmap_pages_to_bits(cma, count); + if (bitmap_count > bitmap_maxno) + return NULL; + for (;;) { mutex_lock(&cma->lock); bitmap_no = bitmap_find_next_zero_area(cma->bitmap, diff --git a/mm/gup.c b/mm/gup.c index 377a5a796242e..bef4bb0f79625 100644 --- a/mm/gup.c +++ b/mm/gup.c @@ -32,6 +32,16 @@ static struct page *no_page_table(struct vm_area_struct *vma, return NULL; } +/* + * FOLL_FORCE can write to even unwritable pte's, but only + * after we've gone through a COW cycle and they are dirty. + */ +static inline bool can_follow_write_pte(pte_t pte, unsigned int flags) +{ + return pte_write(pte) || + ((flags & FOLL_FORCE) && (flags & FOLL_COW) && pte_dirty(pte)); +} + static struct page *follow_page_pte(struct vm_area_struct *vma, unsigned long address, pmd_t *pmd, unsigned int flags) { @@ -66,7 +76,7 @@ static struct page *follow_page_pte(struct vm_area_struct *vma, } if ((flags & FOLL_NUMA) && pte_numa(pte)) goto no_page; - if ((flags & FOLL_WRITE) && !pte_write(pte)) { + if ((flags & FOLL_WRITE) && !can_follow_write_pte(pte, flags)) { pte_unmap_unlock(ptep, ptl); return NULL; } @@ -315,7 +325,7 @@ static int faultin_page(struct task_struct *tsk, struct vm_area_struct *vma, * reCOWed by userspace write). */ if ((ret & VM_FAULT_WRITE) && !(vma->vm_flags & VM_WRITE)) - *flags &= ~FOLL_WRITE; + *flags |= FOLL_COW; return 0; } diff --git a/mm/memory.c b/mm/memory.c index 62b30f222c092..276a433c20c59 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -2630,6 +2630,10 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma, pte_unmap(page_table); + /* File mapping without ->vm_ops ? */ + if (vma->vm_flags & VM_SHARED) + return VM_FAULT_SIGBUS; + /* Check if we need to add a guard page to the stack */ if (check_stack_guard_page(vma, address) < 0) return VM_FAULT_SIGSEGV; @@ -3034,6 +3038,9 @@ static int do_linear_fault(struct mm_struct *mm, struct vm_area_struct *vma, - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff; pte_unmap(page_table); + /* The VMA was not fully populated on mmap() or missing VM_DONTEXPAND */ + if (!vma->vm_ops->fault) + return VM_FAULT_SIGBUS; if (!(flags & FAULT_FLAG_WRITE)) return do_read_fault(mm, vma, address, pmd, pgoff, flags, orig_pte); @@ -3199,13 +3206,12 @@ static int handle_pte_fault(struct mm_struct *mm, entry = ACCESS_ONCE(*pte); if (!pte_present(entry)) { if (pte_none(entry)) { - if (vma->vm_ops) { - if (likely(vma->vm_ops->fault)) - return do_linear_fault(mm, vma, address, - pte, pmd, flags, entry); - } - return do_anonymous_page(mm, vma, address, - pte, pmd, flags); + if (vma->vm_ops) + return do_linear_fault(mm, vma, address, pte, + pmd, flags, entry); + + return do_anonymous_page(mm, vma, address, pte, pmd, + flags); } if (pte_file(entry)) return do_nonlinear_fault(mm, vma, address, diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 30d683e54ab5f..e8b2419725688 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -1546,7 +1546,6 @@ COMPAT_SYSCALL_DEFINE5(get_mempolicy, int __user *, policy, COMPAT_SYSCALL_DEFINE3(set_mempolicy, int, mode, compat_ulong_t __user *, nmask, compat_ulong_t, maxnode) { - long err = 0; unsigned long __user *nm = NULL; unsigned long nr_bits, alloc_size; DECLARE_BITMAP(bm, MAX_NUMNODES); @@ -1555,14 +1554,13 @@ COMPAT_SYSCALL_DEFINE3(set_mempolicy, int, mode, compat_ulong_t __user *, nmask, alloc_size = ALIGN(nr_bits, BITS_PER_LONG) / 8; if (nmask) { - err = compat_get_bitmap(bm, nmask, nr_bits); + if (compat_get_bitmap(bm, nmask, nr_bits)) + return -EFAULT; nm = compat_alloc_user_space(alloc_size); - err |= copy_to_user(nm, bm, alloc_size); + if (copy_to_user(nm, bm, alloc_size)) + return -EFAULT; } - if (err) - return -EFAULT; - return sys_set_mempolicy(mode, nm, nr_bits+1); } @@ -1570,7 +1568,6 @@ COMPAT_SYSCALL_DEFINE6(mbind, compat_ulong_t, start, compat_ulong_t, len, compat_ulong_t, mode, compat_ulong_t __user *, nmask, compat_ulong_t, maxnode, compat_ulong_t, flags) { - long err = 0; unsigned long __user *nm = NULL; unsigned long nr_bits, alloc_size; nodemask_t bm; @@ -1579,14 +1576,13 @@ COMPAT_SYSCALL_DEFINE6(mbind, compat_ulong_t, start, compat_ulong_t, len, alloc_size = ALIGN(nr_bits, BITS_PER_LONG) / 8; if (nmask) { - err = compat_get_bitmap(nodes_addr(bm), nmask, nr_bits); + if (compat_get_bitmap(nodes_addr(bm), nmask, nr_bits)) + return -EFAULT; nm = compat_alloc_user_space(alloc_size); - err |= copy_to_user(nm, nodes_addr(bm), alloc_size); + if (copy_to_user(nm, nodes_addr(bm), alloc_size)) + return -EFAULT; } - if (err) - return -EFAULT; - return sys_mbind(start, len, mode, nm, nr_bits+1, flags); } diff --git a/mm/migrate.c b/mm/migrate.c index 7204f7464b3c7..79004be4ff5ab 100644 --- a/mm/migrate.c +++ b/mm/migrate.c @@ -37,6 +37,7 @@ #include #include #include +#include #include @@ -1470,7 +1471,6 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages, const int __user *, nodes, int __user *, status, int, flags) { - const struct cred *cred = current_cred(), *tcred; struct task_struct *task; struct mm_struct *mm; int err; @@ -1494,14 +1494,9 @@ SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages, /* * Check if this process has the right to modify the specified - * process. The right exists if the process has administrative - * capabilities, superuser privileges or the same - * userid as the target process. + * process. Use the regular "ptrace_may_access()" checks. */ - tcred = __task_cred(task); - if (!uid_eq(cred->euid, tcred->suid) && !uid_eq(cred->euid, tcred->uid) && - !uid_eq(cred->uid, tcred->suid) && !uid_eq(cred->uid, tcred->uid) && - !capable(CAP_SYS_NICE)) { + if (!ptrace_may_access(task, PTRACE_MODE_READ_REALCREDS)) { rcu_read_unlock(); err = -EPERM; goto out; diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 5b87e0674296c..ed4e77728747d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -60,6 +60,7 @@ #include #include #include +#include #include #include @@ -1155,7 +1156,8 @@ static void change_pageblock_range(struct page *pageblock_page, * is worse than movable allocations stealing from unmovable and reclaimable * pageblocks. */ -static bool can_steal_fallback(unsigned int order, int start_mt) +static bool can_steal_fallback(unsigned int order, int start_mt, + int fallback_type, unsigned int start_order) { /* * Leaving this order check is intended, although there is @@ -1167,10 +1169,15 @@ static bool can_steal_fallback(unsigned int order, int start_mt) if (order >= pageblock_order) return true; - if (order >= pageblock_order / 2 || - start_mt == MIGRATE_RECLAIMABLE || - start_mt == MIGRATE_UNMOVABLE || - page_group_by_mobility_disabled) + /* don't let unmovable allocations cause migrations simply because of free pages */ + if ((start_mt != MIGRATE_UNMOVABLE && order >= pageblock_order / 2) || + /* only steal reclaimable page blocks for unmovable allocations */ + (start_mt == MIGRATE_UNMOVABLE && fallback_type != MIGRATE_MOVABLE && order >= pageblock_order / 2) || + /* reclaimable can steal aggressively */ + start_mt == MIGRATE_RECLAIMABLE || + /* allow unmovable allocs up to 64K without migrating blocks */ + (start_mt == MIGRATE_UNMOVABLE && start_order >= 5) || + page_group_by_mobility_disabled) return true; return false; @@ -1205,7 +1212,7 @@ static void steal_suitable_fallback(struct zone *zone, struct page *page, /* Check whether there is a suitable fallback freepage with requested order. */ static int find_suitable_fallback(struct free_area *area, unsigned int order, - int migratetype, bool *can_steal) + int migratetype, bool *can_steal, unsigned int start_order) { int i; int fallback_mt; @@ -1222,7 +1229,7 @@ static int find_suitable_fallback(struct free_area *area, unsigned int order, if (list_empty(&area->free_list[fallback_mt])) continue; - if (can_steal_fallback(order, migratetype)) + if (can_steal_fallback(order, migratetype, fallback_mt, start_order)) *can_steal = true; return fallback_mt; @@ -1247,7 +1254,7 @@ __rmqueue_fallback(struct zone *zone, unsigned int order, int start_migratetype) --current_order) { area = &(zone->free_area[current_order]); fallback_mt = find_suitable_fallback(area, current_order, - start_migratetype, &can_steal); + start_migratetype, &can_steal, order); if (fallback_mt == -1) continue; @@ -3046,10 +3053,15 @@ __alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, * can deadlock because I/O on the device might not * complete. */ + u64 start_time, end_time; gfp_mask = memalloc_noio_flags(gfp_mask); + + start_time = ktime_get_ns(); page = __alloc_pages_slowpath(gfp_mask, order, zonelist, high_zoneidx, nodemask, preferred_zone, classzone_idx, migratetype); + end_time = ktime_get_ns(); + ktrace_add_mm_event(KTRACE_MM_TYPE_SLOW_PATH, end_time, end_time - start_time); } trace_mm_page_alloc(page, order, gfp_mask, migratetype); diff --git a/mm/percpu.c b/mm/percpu.c index 88bb6c92d83a9..5ae6e02849670 100644 --- a/mm/percpu.c +++ b/mm/percpu.c @@ -110,7 +110,7 @@ struct pcpu_chunk { int map_used; /* # of map entries used before the sentry */ int map_alloc; /* # of map entries allocated */ int *map; /* allocation map */ - struct work_struct map_extend_work;/* async ->map[] extension */ + struct list_head map_extend_list;/* on pcpu_map_extend_chunks */ void *data; /* chunk data */ int first_free; /* no free below this */ @@ -160,10 +160,13 @@ static struct pcpu_chunk *pcpu_reserved_chunk; static int pcpu_reserved_chunk_limit; static DEFINE_SPINLOCK(pcpu_lock); /* all internal data structures */ -static DEFINE_MUTEX(pcpu_alloc_mutex); /* chunk create/destroy, [de]pop */ +static DEFINE_MUTEX(pcpu_alloc_mutex); /* chunk create/destroy, [de]pop, map ext */ static struct list_head *pcpu_slot __read_mostly; /* chunk list slots */ +/* chunks which need their map areas extended, protected by pcpu_lock */ +static LIST_HEAD(pcpu_map_extend_chunks); + /* * The number of empty populated pages, protected by pcpu_lock. The * reserved chunk doesn't contribute to the count. @@ -397,13 +400,19 @@ static int pcpu_need_to_extend(struct pcpu_chunk *chunk, bool is_atomic) { int margin, new_alloc; + lockdep_assert_held(&pcpu_lock); + if (is_atomic) { margin = 3; if (chunk->map_alloc < - chunk->map_used + PCPU_ATOMIC_MAP_MARGIN_LOW && - pcpu_async_enabled) - schedule_work(&chunk->map_extend_work); + chunk->map_used + PCPU_ATOMIC_MAP_MARGIN_LOW) { + if (list_empty(&chunk->map_extend_list)) { + list_add_tail(&chunk->map_extend_list, + &pcpu_map_extend_chunks); + pcpu_schedule_balance_work(); + } + } } else { margin = PCPU_ATOMIC_MAP_MARGIN_HIGH; } @@ -437,6 +446,8 @@ static int pcpu_extend_area_map(struct pcpu_chunk *chunk, int new_alloc) size_t old_size = 0, new_size = new_alloc * sizeof(new[0]); unsigned long flags; + lockdep_assert_held(&pcpu_alloc_mutex); + new = pcpu_mem_zalloc(new_size); if (!new) return -ENOMEM; @@ -469,20 +480,6 @@ static int pcpu_extend_area_map(struct pcpu_chunk *chunk, int new_alloc) return 0; } -static void pcpu_map_extend_workfn(struct work_struct *work) -{ - struct pcpu_chunk *chunk = container_of(work, struct pcpu_chunk, - map_extend_work); - int new_alloc; - - spin_lock_irq(&pcpu_lock); - new_alloc = pcpu_need_to_extend(chunk, false); - spin_unlock_irq(&pcpu_lock); - - if (new_alloc) - pcpu_extend_area_map(chunk, new_alloc); -} - /** * pcpu_fit_in_area - try to fit the requested allocation in a candidate area * @chunk: chunk the candidate area belongs to @@ -742,7 +739,7 @@ static struct pcpu_chunk *pcpu_alloc_chunk(void) chunk->map_used = 1; INIT_LIST_HEAD(&chunk->list); - INIT_WORK(&chunk->map_extend_work, pcpu_map_extend_workfn); + INIT_LIST_HEAD(&chunk->map_extend_list); chunk->free_size = pcpu_unit_size; chunk->contig_hint = pcpu_unit_size; @@ -897,6 +894,9 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, return NULL; } + if (!is_atomic) + mutex_lock(&pcpu_alloc_mutex); + spin_lock_irqsave(&pcpu_lock, flags); /* serve reserved allocations from the reserved chunk if available */ @@ -969,12 +969,9 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, if (is_atomic) goto fail; - mutex_lock(&pcpu_alloc_mutex); - if (list_empty(&pcpu_slot[pcpu_nr_slots - 1])) { chunk = pcpu_create_chunk(); if (!chunk) { - mutex_unlock(&pcpu_alloc_mutex); err = "failed to allocate new chunk"; goto fail; } @@ -985,7 +982,6 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, spin_lock_irqsave(&pcpu_lock, flags); } - mutex_unlock(&pcpu_alloc_mutex); goto restart; area_found: @@ -995,8 +991,6 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, if (!is_atomic) { int page_start, page_end, rs, re; - mutex_lock(&pcpu_alloc_mutex); - page_start = PFN_DOWN(off); page_end = PFN_UP(off + size); @@ -1007,7 +1001,6 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, spin_lock_irqsave(&pcpu_lock, flags); if (ret) { - mutex_unlock(&pcpu_alloc_mutex); pcpu_free_area(chunk, off, &occ_pages); err = "failed to populate"; goto fail_unlock; @@ -1047,6 +1040,8 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved, /* see the flag handling in pcpu_blance_workfn() */ pcpu_atomic_alloc_failed = true; pcpu_schedule_balance_work(); + } else { + mutex_unlock(&pcpu_alloc_mutex); } return NULL; } @@ -1131,6 +1126,7 @@ static void pcpu_balance_workfn(struct work_struct *work) if (chunk == list_first_entry(free_head, struct pcpu_chunk, list)) continue; + list_del_init(&chunk->map_extend_list); list_move(&chunk->list, &to_free); } @@ -1148,6 +1144,25 @@ static void pcpu_balance_workfn(struct work_struct *work) pcpu_destroy_chunk(chunk); } + /* service chunks which requested async area map extension */ + do { + int new_alloc = 0; + + spin_lock_irq(&pcpu_lock); + + chunk = list_first_entry_or_null(&pcpu_map_extend_chunks, + struct pcpu_chunk, map_extend_list); + if (chunk) { + list_del_init(&chunk->map_extend_list); + new_alloc = pcpu_need_to_extend(chunk, false); + } + + spin_unlock_irq(&pcpu_lock); + + if (new_alloc) + pcpu_extend_area_map(chunk, new_alloc); + } while (chunk); + /* * Ensure there are certain number of free populated pages for * atomic allocs. Fill up from the most packed so that atomic @@ -1648,7 +1663,7 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai, */ schunk = memblock_virt_alloc(pcpu_chunk_struct_size, 0); INIT_LIST_HEAD(&schunk->list); - INIT_WORK(&schunk->map_extend_work, pcpu_map_extend_workfn); + INIT_LIST_HEAD(&schunk->map_extend_list); schunk->base_addr = base_addr; schunk->map = smap; schunk->map_alloc = ARRAY_SIZE(smap); @@ -1678,7 +1693,7 @@ int __init pcpu_setup_first_chunk(const struct pcpu_alloc_info *ai, if (dyn_size) { dchunk = memblock_virt_alloc(pcpu_chunk_struct_size, 0); INIT_LIST_HEAD(&dchunk->list); - INIT_WORK(&dchunk->map_extend_work, pcpu_map_extend_workfn); + INIT_LIST_HEAD(&dchunk->map_extend_list); dchunk->base_addr = base_addr; dchunk->map = dmap; dchunk->map_alloc = ARRAY_SIZE(dmap); diff --git a/mm/vmscan.c b/mm/vmscan.c index fc1c933b73d3c..cccc61bc717df 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -2,6 +2,7 @@ * linux/mm/vmscan.c * * Copyright (C) 1991, 1992, 1993, 1994 Linus Torvalds + * Copyright (C) 2018 XiaoMi, Inc. * * Swap reorganised 29.12.95, Stephen Tweedie. * kswapd added: 7.1.96 sct @@ -46,13 +47,13 @@ #include #include #include -#include #include #include #include #include +#include #include "internal.h" @@ -200,39 +201,6 @@ static unsigned long get_lru_size(struct lruvec *lruvec, enum lru_list lru) return zone_page_state(lruvec_zone(lruvec), NR_LRU_BASE + lru); } -struct dentry *debug_file; - -static int debug_shrinker_show(struct seq_file *s, void *unused) -{ - struct shrinker *shrinker; - struct shrink_control sc; - - sc.gfp_mask = -1; - sc.nr_to_scan = 0; - - down_read(&shrinker_rwsem); - list_for_each_entry(shrinker, &shrinker_list, list) { - int num_objs; - - num_objs = shrinker->count_objects(shrinker, &sc); - seq_printf(s, "%pf %d\n", shrinker->scan_objects, num_objs); - } - up_read(&shrinker_rwsem); - return 0; -} - -static int debug_shrinker_open(struct inode *inode, struct file *file) -{ - return single_open(file, debug_shrinker_show, inode->i_private); -} - -static const struct file_operations debug_shrinker_fops = { - .open = debug_shrinker_open, - .read = seq_read, - .llseek = seq_lseek, - .release = single_release, -}; - /* * Add a shrinker callback to be called from the vm. */ @@ -262,15 +230,6 @@ int register_shrinker(struct shrinker *shrinker) } EXPORT_SYMBOL(register_shrinker); -static int __init add_shrinker_debug(void) -{ - debugfs_create_file("shrinker", 0644, NULL, NULL, - &debug_shrinker_fops); - return 0; -} - -late_initcall(add_shrinker_debug); - /* * Remove one */ @@ -3393,6 +3352,10 @@ static void kswapd_try_to_sleep(pg_data_t *pgdat, int order, int classzone_idx) finish_wait(&pgdat->kswapd_wait, &wait); } +#if defined(CONFIG_ANDROID_WHETSTONE) +extern void wakeup_kmemsw_chkd(void); +#endif + /* * The background pageout daemon, started as a kernel thread * from the init process. @@ -3492,6 +3455,9 @@ static int kswapd(void *p) balanced_classzone_idx = classzone_idx; balanced_order = balance_pgdat(pgdat, order, &balanced_classzone_idx); +#if defined(CONFIG_ANDROID_WHETSTONE) + wakeup_kmemsw_chkd(); +#endif } } @@ -3568,6 +3534,43 @@ unsigned long shrink_all_memory(unsigned long nr_to_reclaim) } #endif /* CONFIG_HIBERNATION */ +#ifdef CONFIG_RTMM +/* + * reclaim anon/file pages from global lru + * + * TODO: merge with shrink_all_memory()?? + */ +unsigned long reclaim_global(unsigned long nr_to_reclaim) +{ + struct reclaim_state reclaim_state; + struct scan_control sc = { + .nr_to_reclaim = max(nr_to_reclaim, SWAP_CLUSTER_MAX), + .gfp_mask = GFP_HIGHUSER_MOVABLE, + .order = 0, + .priority = DEF_PRIORITY, + .may_writepage = 1, + .may_unmap = 1, + .may_swap = 1, + }; + struct zonelist *zonelist = node_zonelist(numa_node_id(), sc.gfp_mask); + struct task_struct *p = current; + unsigned long nr_reclaimed; + + p->flags |= PF_MEMALLOC; + lockdep_set_current_reclaim_state(sc.gfp_mask); + reclaim_state.reclaimed_slab = 0; + p->reclaim_state = &reclaim_state; + + nr_reclaimed = do_try_to_free_pages(zonelist, &sc); + + p->reclaim_state = NULL; + lockdep_clear_current_reclaim_state(); + p->flags &= ~PF_MEMALLOC; + + return nr_reclaimed; +} +#endif + /* It's optimal to keep kswapds on the same CPUs as their memory, but not required for correctness. So if the last cpu in a node goes away, we get changed to run anywhere: as the first one comes back, diff --git a/mm/zpool.c b/mm/zpool.c index bacdab6e47de3..fd3ff719c32cb 100644 --- a/mm/zpool.c +++ b/mm/zpool.c @@ -18,11 +18,9 @@ #include struct zpool { - char *type; - struct zpool_driver *driver; void *pool; - struct zpool_ops *ops; + const struct zpool_ops *ops; struct list_head list; }; @@ -73,34 +71,8 @@ int zpool_unregister_driver(struct zpool_driver *driver) } EXPORT_SYMBOL(zpool_unregister_driver); -/** - * zpool_evict() - evict callback from a zpool implementation. - * @pool: pool to evict from. - * @handle: handle to evict. - * - * This can be used by zpool implementations to call the - * user's evict zpool_ops struct evict callback. - */ -int zpool_evict(void *pool, unsigned long handle) -{ - struct zpool *zpool; - - spin_lock(&pools_lock); - list_for_each_entry(zpool, &pools_head, list) { - if (zpool->pool == pool) { - spin_unlock(&pools_lock); - if (!zpool->ops || !zpool->ops->evict) - return -EINVAL; - return zpool->ops->evict(zpool, handle); - } - } - spin_unlock(&pools_lock); - - return -ENOENT; -} -EXPORT_SYMBOL(zpool_evict); - -static struct zpool_driver *zpool_get_driver(char *type) +/* this assumes @type is null-terminated. */ +static struct zpool_driver *zpool_get_driver(const char *type) { struct zpool_driver *driver; @@ -126,6 +98,41 @@ static void zpool_put_driver(struct zpool_driver *driver) module_put(driver->owner); } +/** + * zpool_has_pool() - Check if the pool driver is available + * @type The type of the zpool to check (e.g. zbud, zsmalloc) + * + * This checks if the @type pool driver is available. This will try to load + * the requested module, if needed, but there is no guarantee the module will + * still be loaded and available immediately after calling. If this returns + * true, the caller should assume the pool is available, but must be prepared + * to handle the @zpool_create_pool() returning failure. However if this + * returns false, the caller should assume the requested pool type is not + * available; either the requested pool type module does not exist, or could + * not be loaded, and calling @zpool_create_pool() with the pool type will + * fail. + * + * The @type string must be null-terminated. + * + * Returns: true if @type pool is available, false if not + */ +bool zpool_has_pool(char *type) +{ + struct zpool_driver *driver = zpool_get_driver(type); + + if (!driver) { + request_module("zpool-%s", type); + driver = zpool_get_driver(type); + } + + if (!driver) + return false; + + zpool_put_driver(driver); + return true; +} +EXPORT_SYMBOL(zpool_has_pool); + /** * zpool_create_pool() - Create a new zpool * @type The type of the zpool to create (e.g. zbud, zsmalloc) @@ -139,15 +146,17 @@ static void zpool_put_driver(struct zpool_driver *driver) * * Implementations must guarantee this to be thread-safe. * + * The @type and @name strings must be null-terminated. + * * Returns: New zpool on success, NULL on failure. */ -struct zpool *zpool_create_pool(char *type, char *name, gfp_t gfp, - struct zpool_ops *ops) +struct zpool *zpool_create_pool(const char *type, const char *name, gfp_t gfp, + const struct zpool_ops *ops) { struct zpool_driver *driver; struct zpool *zpool; - pr_info("creating pool type %s\n", type); + pr_debug("creating pool type %s\n", type); driver = zpool_get_driver(type); @@ -168,9 +177,8 @@ struct zpool *zpool_create_pool(char *type, char *name, gfp_t gfp, return NULL; } - zpool->type = driver->type; zpool->driver = driver; - zpool->pool = driver->create(name, gfp, ops); + zpool->pool = driver->create(name, gfp, ops, zpool); zpool->ops = ops; if (!zpool->pool) { @@ -180,7 +188,7 @@ struct zpool *zpool_create_pool(char *type, char *name, gfp_t gfp, return NULL; } - pr_info("created %s pool\n", type); + pr_debug("created pool type %s\n", type); spin_lock(&pools_lock); list_add(&zpool->list, &pools_head); @@ -202,7 +210,7 @@ struct zpool *zpool_create_pool(char *type, char *name, gfp_t gfp, */ void zpool_destroy_pool(struct zpool *zpool) { - pr_info("destroying pool type %s\n", zpool->type); + pr_debug("destroying pool type %s\n", zpool->driver->type); spin_lock(&pools_lock); list_del(&zpool->list); @@ -222,9 +230,9 @@ void zpool_destroy_pool(struct zpool *zpool) * * Returns: The type of zpool. */ -char *zpool_get_type(struct zpool *zpool) +const char *zpool_get_type(struct zpool *zpool) { - return zpool->type; + return zpool->driver->type; } /** @@ -347,20 +355,6 @@ u64 zpool_get_total_size(struct zpool *zpool) return zpool->driver->total_size(zpool->pool); } -static int __init init_zpool(void) -{ - pr_info("loaded\n"); - return 0; -} - -static void __exit exit_zpool(void) -{ - pr_info("unloaded\n"); -} - -module_init(init_zpool); -module_exit(exit_zpool); - MODULE_LICENSE("GPL"); MODULE_AUTHOR("Dan Streetman "); MODULE_DESCRIPTION("Common API for compressed memory storage"); diff --git a/mm/zsmalloc.c b/mm/zsmalloc.c index a8b5e749e84e7..b6d4f258cb53c 100644 --- a/mm/zsmalloc.c +++ b/mm/zsmalloc.c @@ -16,7 +16,7 @@ * struct page(s) to form a zspage. * * Usage of struct page fields: - * page->first_page: points to the first component (0-order) page + * page->private: points to the first component (0-order) page * page->index (union with page->freelist): offset of the first object * starting in this page. For the first page, this is * always 0, so we use this field (aka freelist) to point @@ -26,8 +26,7 @@ * * For _first_ page only: * - * page->private (union with page->first_page): refers to the - * component page after the first page + * page->private: refers to the component page after the first page * If the page is first_page for huge object, it stores handle. * Look at size_class->huge. * page->freelist: points to the first free object in zspage. @@ -38,6 +37,7 @@ * page->lru: links together first pages of various zspages. * Basically forming list of zspages in a fullness group. * page->mapping: class index and fullness group of the zspage + * page->inuse: the number of objects that are used in this zspage * * Usage of struct page flags: * PG_private: identifies the first component page @@ -45,9 +45,7 @@ * */ -#ifdef CONFIG_ZSMALLOC_DEBUG -#define DEBUG -#endif +#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include #include @@ -62,7 +60,7 @@ #include #include #include -#include +#include #include #include #include @@ -170,17 +168,20 @@ enum zs_stat_type { OBJ_USED, CLASS_ALMOST_FULL, CLASS_ALMOST_EMPTY, - NR_ZS_STAT_TYPE, }; #ifdef CONFIG_ZSMALLOC_STAT - -static struct dentry *zs_stat_root; +#define NR_ZS_STAT_TYPE (CLASS_ALMOST_EMPTY + 1) +#else +#define NR_ZS_STAT_TYPE (OBJ_USED + 1) +#endif struct zs_size_stat { unsigned long objs[NR_ZS_STAT_TYPE]; }; +#ifdef CONFIG_ZSMALLOC_STAT +static struct dentry *zs_stat_root; #endif /* @@ -205,6 +206,8 @@ static int zs_size_classes; static const int fullness_threshold_frac = 4; struct size_class { + spinlock_t lock; + struct page *fullness_list[_ZS_NR_FULLNESS_GROUPS]; /* * Size of objects stored in this class. Must be multiple * of ZS_ALIGN. @@ -212,18 +215,12 @@ struct size_class { int size; unsigned int index; + struct zs_size_stat stats; + /* Number of PAGE_SIZE sized pages to combine to form a 'zspage' */ int pages_per_zspage; /* huge object: pages_per_zspage == 1 && maxobj_per_zspage == 1 */ bool huge; - -#ifdef CONFIG_ZSMALLOC_STAT - struct zs_size_stat stats; -#endif - - spinlock_t lock; - - struct page *fullness_list[_ZS_NR_FULLNESS_GROUPS]; }; /* @@ -247,14 +244,22 @@ struct link_free { }; struct zs_pool { - char *name; + const char *name; struct size_class **size_class; struct kmem_cache *handle_cachep; - gfp_t flags; /* allocation flags used when growing pool */ atomic_long_t pages_allocated; + struct zs_pool_stats stats; + + /* Compact classes */ + struct shrinker shrinker; + /* + * To signify that register_shrinker() was successful + * and unregister_shrinker() will not Oops. + */ + bool shrinker_enabled; #ifdef CONFIG_ZSMALLOC_STAT struct dentry *stat_dentry; #endif @@ -277,7 +282,6 @@ struct mapping_area { #endif char *vm_addr; /* address of kmap_atomic()'ed pages */ enum zs_mapmode vm_mm; /* mapping mode */ - bool huge; }; static int create_handle_cache(struct zs_pool *pool) @@ -289,14 +293,13 @@ static int create_handle_cache(struct zs_pool *pool) static void destroy_handle_cache(struct zs_pool *pool) { - if (pool->handle_cachep) - kmem_cache_destroy(pool->handle_cachep); + kmem_cache_destroy(pool->handle_cachep); } -static unsigned long alloc_handle(struct zs_pool *pool) +static unsigned long alloc_handle(struct zs_pool *pool, gfp_t gfp) { return (unsigned long)kmem_cache_alloc(pool->handle_cachep, - pool->flags & ~__GFP_HIGHMEM); + gfp & ~__GFP_HIGHMEM); } static void free_handle(struct zs_pool *pool, unsigned long handle) @@ -306,16 +309,28 @@ static void free_handle(struct zs_pool *pool, unsigned long handle) static void record_obj(unsigned long handle, unsigned long obj) { - *(unsigned long *)handle = obj; + /* + * lsb of @obj represents handle lock while other bits + * represent object value the handle is pointing so + * updating shouldn't do store tearing. + */ + WRITE_ONCE(*(unsigned long *)handle, obj); } /* zpool driver */ #ifdef CONFIG_ZPOOL -static void *zs_zpool_create(char *name, gfp_t gfp, struct zpool_ops *zpool_ops) +static void *zs_zpool_create(const char *name, gfp_t gfp, + const struct zpool_ops *zpool_ops, + struct zpool *zpool) { - return zs_create_pool(name, gfp); + /* + * Ignore global gfp flags: zs_malloc() may be invoked from + * different contexts and its caller must provide a valid + * gfp mask. + */ + return zs_create_pool(name); } static void zs_zpool_destroy(void *pool) @@ -326,7 +341,7 @@ static void zs_zpool_destroy(void *pool) static int zs_zpool_malloc(void *pool, size_t size, gfp_t gfp, unsigned long *handle) { - *handle = zs_malloc(pool, size); + *handle = zs_malloc(pool, size, gfp); return *handle ? 0 : -1; } static void zs_zpool_free(void *pool, unsigned long handle) @@ -404,26 +419,28 @@ static int is_last_page(struct page *page) return PagePrivate2(page); } -static void get_zspage_mapping(struct page *page, unsigned int *class_idx, +static void get_zspage_mapping(struct page *first_page, + unsigned int *class_idx, enum fullness_group *fullness) { unsigned long m; - BUG_ON(!is_first_page(page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); - m = (unsigned long)page->mapping; + m = (unsigned long)first_page->mapping; *fullness = m & FULLNESS_MASK; *class_idx = (m >> FULLNESS_BITS) & CLASS_IDX_MASK; } -static void set_zspage_mapping(struct page *page, unsigned int class_idx, +static void set_zspage_mapping(struct page *first_page, + unsigned int class_idx, enum fullness_group fullness) { unsigned long m; - BUG_ON(!is_first_page(page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); m = ((class_idx & CLASS_IDX_MASK) << FULLNESS_BITS) | (fullness & FULLNESS_MASK); - page->mapping = (struct address_space *)m; + first_page->mapping = (struct address_space *)m; } /* @@ -444,36 +461,40 @@ static int get_size_class_index(int size) return min(zs_size_classes - 1, idx); } -#ifdef CONFIG_ZSMALLOC_STAT - static inline void zs_stat_inc(struct size_class *class, enum zs_stat_type type, unsigned long cnt) { - class->stats.objs[type] += cnt; + if (type < NR_ZS_STAT_TYPE) + class->stats.objs[type] += cnt; } static inline void zs_stat_dec(struct size_class *class, enum zs_stat_type type, unsigned long cnt) { - class->stats.objs[type] -= cnt; + if (type < NR_ZS_STAT_TYPE) + class->stats.objs[type] -= cnt; } static inline unsigned long zs_stat_get(struct size_class *class, enum zs_stat_type type) { - return class->stats.objs[type]; + if (type < NR_ZS_STAT_TYPE) + return class->stats.objs[type]; + return 0; } -static int __init zs_stat_init(void) +#ifdef CONFIG_ZSMALLOC_STAT + +static void __init zs_stat_init(void) { - if (!debugfs_initialized()) - return -ENODEV; + if (!debugfs_initialized()) { + pr_warn("debugfs not available, stat dir not created\n"); + return; + } zs_stat_root = debugfs_create_dir("zsmalloc", NULL); if (!zs_stat_root) - return -ENOMEM; - - return 0; + pr_warn("debugfs 'zsmalloc' stat dir creation failed\n"); } static void __exit zs_stat_exit(void) @@ -481,6 +502,8 @@ static void __exit zs_stat_exit(void) debugfs_remove_recursive(zs_stat_root); } +static unsigned long zs_can_compact(struct size_class *class); + static int zs_stats_size_show(struct seq_file *s, void *v) { int i; @@ -488,14 +511,15 @@ static int zs_stats_size_show(struct seq_file *s, void *v) struct size_class *class; int objs_per_zspage; unsigned long class_almost_full, class_almost_empty; - unsigned long obj_allocated, obj_used, pages_used; + unsigned long obj_allocated, obj_used, pages_used, freeable; unsigned long total_class_almost_full = 0, total_class_almost_empty = 0; unsigned long total_objs = 0, total_used_objs = 0, total_pages = 0; + unsigned long total_freeable = 0; - seq_printf(s, " %5s %5s %11s %12s %13s %10s %10s %16s\n", + seq_printf(s, " %5s %5s %11s %12s %13s %10s %10s %16s %8s\n", "class", "size", "almost_full", "almost_empty", "obj_allocated", "obj_used", "pages_used", - "pages_per_zspage"); + "pages_per_zspage", "freeable"); for (i = 0; i < zs_size_classes; i++) { class = pool->size_class[i]; @@ -508,6 +532,7 @@ static int zs_stats_size_show(struct seq_file *s, void *v) class_almost_empty = zs_stat_get(class, CLASS_ALMOST_EMPTY); obj_allocated = zs_stat_get(class, OBJ_ALLOCATED); obj_used = zs_stat_get(class, OBJ_USED); + freeable = zs_can_compact(class); spin_unlock(&class->lock); objs_per_zspage = get_maxobj_per_zspage(class->size, @@ -515,23 +540,25 @@ static int zs_stats_size_show(struct seq_file *s, void *v) pages_used = obj_allocated / objs_per_zspage * class->pages_per_zspage; - seq_printf(s, " %5u %5u %11lu %12lu %13lu %10lu %10lu %16d\n", + seq_printf(s, " %5u %5u %11lu %12lu %13lu" + " %10lu %10lu %16d %8lu\n", i, class->size, class_almost_full, class_almost_empty, obj_allocated, obj_used, pages_used, - class->pages_per_zspage); + class->pages_per_zspage, freeable); total_class_almost_full += class_almost_full; total_class_almost_empty += class_almost_empty; total_objs += obj_allocated; total_used_objs += obj_used; total_pages += pages_used; + total_freeable += freeable; } seq_puts(s, "\n"); - seq_printf(s, " %5s %5s %11lu %12lu %13lu %10lu %10lu\n", + seq_printf(s, " %5s %5s %11lu %12lu %13lu %10lu %10lu %16s %8lu\n", "Total", "", total_class_almost_full, total_class_almost_empty, total_objs, - total_used_objs, total_pages); + total_used_objs, total_pages, "", total_freeable); return 0; } @@ -548,17 +575,19 @@ static const struct file_operations zs_stat_size_ops = { .release = single_release, }; -static int zs_pool_stat_create(char *name, struct zs_pool *pool) +static void zs_pool_stat_create(struct zs_pool *pool, const char *name) { struct dentry *entry; - if (!zs_stat_root) - return -ENODEV; + if (!zs_stat_root) { + pr_warn("no root stat dir, not creating <%s> stat dir\n", name); + return; + } entry = debugfs_create_dir(name, zs_stat_root); if (!entry) { pr_warn("debugfs dir <%s> creation failed\n", name); - return -ENOMEM; + return; } pool->stat_dentry = entry; @@ -567,10 +596,9 @@ static int zs_pool_stat_create(char *name, struct zs_pool *pool) if (!entry) { pr_warn("%s: debugfs file entry <%s> creation failed\n", name, "classes"); - return -ENOMEM; + debugfs_remove_recursive(pool->stat_dentry); + pool->stat_dentry = NULL; } - - return 0; } static void zs_pool_stat_destroy(struct zs_pool *pool) @@ -579,44 +607,23 @@ static void zs_pool_stat_destroy(struct zs_pool *pool) } #else /* CONFIG_ZSMALLOC_STAT */ - -static inline void zs_stat_inc(struct size_class *class, - enum zs_stat_type type, unsigned long cnt) +static void __init zs_stat_init(void) { } -static inline void zs_stat_dec(struct size_class *class, - enum zs_stat_type type, unsigned long cnt) -{ -} - -static inline unsigned long zs_stat_get(struct size_class *class, - enum zs_stat_type type) -{ - return 0; -} - -static int __init zs_stat_init(void) -{ - return 0; -} - static void __exit zs_stat_exit(void) { } -static inline int zs_pool_stat_create(char *name, struct zs_pool *pool) +static inline void zs_pool_stat_create(struct zs_pool *pool, const char *name) { - return 0; } static inline void zs_pool_stat_destroy(struct zs_pool *pool) { } - #endif - /* * For each size class, zspages are divided into different groups * depending on how "full" they are. This was done so that we could @@ -624,14 +631,15 @@ static inline void zs_pool_stat_destroy(struct zs_pool *pool) * the pool (not yet implemented). This function returns fullness * status of the given page. */ -static enum fullness_group get_fullness_group(struct page *page) +static enum fullness_group get_fullness_group(struct page *first_page) { int inuse, max_objects; enum fullness_group fg; - BUG_ON(!is_first_page(page)); - inuse = page->inuse; - max_objects = page->objects; + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); + + inuse = first_page->inuse; + max_objects = first_page->objects; if (inuse == 0) fg = ZS_EMPTY; @@ -651,48 +659,59 @@ static enum fullness_group get_fullness_group(struct page *page) * have. This functions inserts the given zspage into the freelist * identified by . */ -static void insert_zspage(struct page *page, struct size_class *class, - enum fullness_group fullness) +static void insert_zspage(struct size_class *class, + enum fullness_group fullness, + struct page *first_page) { struct page **head; - BUG_ON(!is_first_page(page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); if (fullness >= _ZS_NR_FULLNESS_GROUPS) return; - head = &class->fullness_list[fullness]; - if (*head) - list_add_tail(&page->lru, &(*head)->lru); - - *head = page; zs_stat_inc(class, fullness == ZS_ALMOST_EMPTY ? CLASS_ALMOST_EMPTY : CLASS_ALMOST_FULL, 1); + + head = &class->fullness_list[fullness]; + if (!*head) { + *head = first_page; + return; + } + + /* + * We want to see more ZS_FULL pages and less almost + * empty/full. Put pages with higher ->inuse first. + */ + list_add_tail(&first_page->lru, &(*head)->lru); + if (first_page->inuse >= (*head)->inuse) + *head = first_page; } /* * This function removes the given zspage from the freelist identified * by . */ -static void remove_zspage(struct page *page, struct size_class *class, - enum fullness_group fullness) +static void remove_zspage(struct size_class *class, + enum fullness_group fullness, + struct page *first_page) { struct page **head; - BUG_ON(!is_first_page(page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); if (fullness >= _ZS_NR_FULLNESS_GROUPS) return; head = &class->fullness_list[fullness]; - BUG_ON(!*head); + VM_BUG_ON_PAGE(!*head, first_page); if (list_empty(&(*head)->lru)) *head = NULL; - else if (*head == page) + else if (*head == first_page) *head = (struct page *)list_entry((*head)->lru.next, struct page, lru); - list_del_init(&page->lru); + list_del_init(&first_page->lru); zs_stat_dec(class, fullness == ZS_ALMOST_EMPTY ? CLASS_ALMOST_EMPTY : CLASS_ALMOST_FULL, 1); } @@ -707,21 +726,19 @@ static void remove_zspage(struct page *page, struct size_class *class, * fullness group. */ static enum fullness_group fix_fullness_group(struct size_class *class, - struct page *page) + struct page *first_page) { int class_idx; enum fullness_group currfg, newfg; - BUG_ON(!is_first_page(page)); - - get_zspage_mapping(page, &class_idx, &currfg); - newfg = get_fullness_group(page); + get_zspage_mapping(first_page, &class_idx, &currfg); + newfg = get_fullness_group(first_page); if (newfg == currfg) goto out; - remove_zspage(page, class, currfg); - insert_zspage(page, class, newfg); - set_zspage_mapping(page, class_idx, newfg); + remove_zspage(class, currfg, first_page); + insert_zspage(class, newfg, first_page); + set_zspage_mapping(first_page, class_idx, newfg); out: return newfg; @@ -773,7 +790,7 @@ static struct page *get_first_page(struct page *page) if (is_first_page(page)) return page; else - return page->first_page; + return (struct page *)page_private(page); } static struct page *get_next_page(struct page *page) @@ -799,7 +816,7 @@ static void *location_to_obj(struct page *page, unsigned long obj_idx) unsigned long obj; if (!page) { - BUG_ON(obj_idx); + VM_BUG_ON(obj_idx); return NULL; } @@ -832,8 +849,8 @@ static unsigned long obj_to_head(struct size_class *class, struct page *page, void *obj) { if (class->huge) { - VM_BUG_ON(!is_first_page(page)); - return *(unsigned long *)page_private(page); + VM_BUG_ON_PAGE(!is_first_page(page), page); + return page_private(page); } else return *(unsigned long *)obj; } @@ -882,8 +899,8 @@ static void free_zspage(struct page *first_page) { struct page *nextp, *tmp, *head_extra; - BUG_ON(!is_first_page(first_page)); - BUG_ON(first_page->inuse); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); + VM_BUG_ON_PAGE(first_page->inuse, first_page); head_extra = (struct page *)page_private(first_page); @@ -904,12 +921,13 @@ static void free_zspage(struct page *first_page) } /* Initialize a newly allocated zspage */ -static void init_zspage(struct page *first_page, struct size_class *class) +static void init_zspage(struct size_class *class, struct page *first_page) { unsigned long off = 0; struct page *page = first_page; - BUG_ON(!is_first_page(first_page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); + while (page) { struct page *next_page; struct link_free *link; @@ -958,7 +976,7 @@ static struct page *alloc_zspage(struct size_class *class, gfp_t flags) * Allocate individual pages and link them together as: * 1. first page->private = first sub-page * 2. all sub-pages are linked together using page->lru - * 3. each sub-page is linked to the first page using page->first_page + * 3. each sub-page is linked to the first page using page->private * * For each size class, First/Head pages are linked together using * page->lru. Also, we set PG_private to identify the first page @@ -983,7 +1001,7 @@ static struct page *alloc_zspage(struct size_class *class, gfp_t flags) if (i == 1) set_page_private(first_page, (unsigned long)page); if (i >= 1) - page->first_page = first_page; + set_page_private(page, (unsigned long)first_page); if (i >= 2) list_add(&page->lru, &prev_page->lru); if (i == class->pages_per_zspage - 1) /* last page */ @@ -991,7 +1009,7 @@ static struct page *alloc_zspage(struct size_class *class, gfp_t flags) prev_page = page; } - init_zspage(first_page, class); + init_zspage(class, first_page); first_page->freelist = location_to_obj(first_page, 0); /* Maximum number of objects we can store in this zspage */ @@ -1122,11 +1140,9 @@ static void __zs_unmap_object(struct mapping_area *area, goto out; buf = area->vm_buf; - if (!area->huge) { - buf = buf + ZS_HANDLE_SIZE; - size -= ZS_HANDLE_SIZE; - off += ZS_HANDLE_SIZE; - } + buf = buf + ZS_HANDLE_SIZE; + size -= ZS_HANDLE_SIZE; + off += ZS_HANDLE_SIZE; sizes[0] = PAGE_SIZE - off; sizes[1] = size - sizes[0]; @@ -1226,11 +1242,11 @@ static bool can_merge(struct size_class *prev, int size, int pages_per_zspage) return true; } -static bool zspage_full(struct page *page) +static bool zspage_full(struct page *first_page) { - BUG_ON(!is_first_page(page)); + VM_BUG_ON_PAGE(!is_first_page(first_page), first_page); - return page->inuse == page->objects; + return first_page->inuse == first_page->objects; } unsigned long zs_get_total_pages(struct zs_pool *pool) @@ -1266,14 +1282,12 @@ void *zs_map_object(struct zs_pool *pool, unsigned long handle, struct page *pages[2]; void *ret; - BUG_ON(!handle); - /* * Because we use per-cpu mapping areas shared among the * pools/users, we can't allow mapping in interrupt context * because it can corrupt another users mappings. */ - BUG_ON(in_interrupt()); + WARN_ON_ONCE(in_interrupt()); /* From now on, migration cannot move the object */ pin_tag(handle); @@ -1317,8 +1331,6 @@ void zs_unmap_object(struct zs_pool *pool, unsigned long handle) struct size_class *class; struct mapping_area *area; - BUG_ON(!handle); - obj = handle_to_obj(handle); obj_to_location(obj, &page, &obj_idx); get_zspage_mapping(get_first_page(page), &class_idx, &fg); @@ -1342,8 +1354,8 @@ void zs_unmap_object(struct zs_pool *pool, unsigned long handle) } EXPORT_SYMBOL_GPL(zs_unmap_object); -static unsigned long obj_malloc(struct page *first_page, - struct size_class *class, unsigned long handle) +static unsigned long obj_malloc(struct size_class *class, + struct page *first_page, unsigned long handle) { unsigned long obj; struct link_free *link; @@ -1383,7 +1395,7 @@ static unsigned long obj_malloc(struct page *first_page, * otherwise 0. * Allocation requests with size > ZS_MAX_ALLOC_SIZE will fail. */ -unsigned long zs_malloc(struct zs_pool *pool, size_t size) +unsigned long zs_malloc(struct zs_pool *pool, size_t size, gfp_t gfp) { unsigned long handle, obj; struct size_class *class; @@ -1392,7 +1404,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size) if (unlikely(!size || size > ZS_MAX_ALLOC_SIZE)) return 0; - handle = alloc_handle(pool); + handle = alloc_handle(pool, gfp); if (!handle) return 0; @@ -1405,7 +1417,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size) if (!first_page) { spin_unlock(&class->lock); - first_page = alloc_zspage(class, pool->flags); + first_page = alloc_zspage(class, gfp); if (unlikely(!first_page)) { free_handle(pool, handle); return 0; @@ -1420,7 +1432,7 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size) class->size, class->pages_per_zspage)); } - obj = obj_malloc(first_page, class, handle); + obj = obj_malloc(class, first_page, handle); /* Now move the zspage to another fullness group, if required */ fix_fullness_group(class, first_page); record_obj(handle, obj); @@ -1430,23 +1442,17 @@ unsigned long zs_malloc(struct zs_pool *pool, size_t size) } EXPORT_SYMBOL_GPL(zs_malloc); -static void obj_free(struct zs_pool *pool, struct size_class *class, - unsigned long obj) +static void obj_free(struct size_class *class, unsigned long obj) { struct link_free *link; struct page *first_page, *f_page; unsigned long f_objidx, f_offset; void *vaddr; - int class_idx; - enum fullness_group fullness; - - BUG_ON(!obj); obj &= ~OBJ_ALLOCATED_TAG; obj_to_location(obj, &f_page, &f_objidx); first_page = get_first_page(f_page); - get_zspage_mapping(first_page, &class_idx, &fullness); f_offset = obj_idx_to_offset(f_page, f_objidx, class->size); vaddr = kmap_atomic(f_page); @@ -1482,7 +1488,7 @@ void zs_free(struct zs_pool *pool, unsigned long handle) class = pool->size_class[class_idx]; spin_lock(&class->lock); - obj_free(pool, class, obj); + obj_free(class, obj); fullness = fix_fullness_group(class, first_page); if (fullness == ZS_EMPTY) { zs_stat_dec(class, OBJ_ALLOCATED, get_maxobj_per_zspage( @@ -1498,8 +1504,8 @@ void zs_free(struct zs_pool *pool, unsigned long handle) } EXPORT_SYMBOL_GPL(zs_free); -static void zs_object_copy(unsigned long src, unsigned long dst, - struct size_class *class) +static void zs_object_copy(struct size_class *class, unsigned long dst, + unsigned long src) { struct page *s_page, *d_page; unsigned long s_objidx, d_objidx; @@ -1542,7 +1548,6 @@ static void zs_object_copy(unsigned long src, unsigned long dst, kunmap_atomic(d_addr); kunmap_atomic(s_addr); s_page = get_next_page(s_page); - BUG_ON(!s_page); s_addr = kmap_atomic(s_page); d_addr = kmap_atomic(d_page); s_size = class->size - written; @@ -1552,7 +1557,6 @@ static void zs_object_copy(unsigned long src, unsigned long dst, if (d_off >= PAGE_SIZE) { kunmap_atomic(d_addr); d_page = get_next_page(d_page); - BUG_ON(!d_page); d_addr = kmap_atomic(d_page); d_size = class->size - written; d_off = 0; @@ -1567,8 +1571,8 @@ static void zs_object_copy(unsigned long src, unsigned long dst, * Find alloced object in zspage from index object and * return handle. */ -static unsigned long find_alloced_obj(struct page *page, int index, - struct size_class *class) +static unsigned long find_alloced_obj(struct size_class *class, + struct page *page, int index) { unsigned long head; int offset = 0; @@ -1605,8 +1609,6 @@ struct zs_compact_control { /* Starting object index within @s_page which used for live object * in the subpage. */ int index; - /* how many of objects are migrated */ - int nr_migrated; }; static int migrate_zspage(struct zs_pool *pool, struct size_class *class, @@ -1617,11 +1619,10 @@ static int migrate_zspage(struct zs_pool *pool, struct size_class *class, struct page *s_page = cc->s_page; struct page *d_page = cc->d_page; unsigned long index = cc->index; - int nr_migrated = 0; int ret = 0; while (1) { - handle = find_alloced_obj(s_page, index, class); + handle = find_alloced_obj(class, s_page, index); if (!handle) { s_page = get_next_page(s_page); if (!s_page) @@ -1638,24 +1639,29 @@ static int migrate_zspage(struct zs_pool *pool, struct size_class *class, } used_obj = handle_to_obj(handle); - free_obj = obj_malloc(d_page, class, handle); - zs_object_copy(used_obj, free_obj, class); + free_obj = obj_malloc(class, d_page, handle); + zs_object_copy(class, free_obj, used_obj); index++; + /* + * record_obj updates handle's value to free_obj and it will + * invalidate lock bit(ie, HANDLE_PIN_BIT) of handle, which + * breaks synchronization using pin_tag(e,g, zs_free) so + * let's keep the lock bit. + */ + free_obj |= BIT(HANDLE_PIN_BIT); record_obj(handle, free_obj); unpin_tag(handle); - obj_free(pool, class, used_obj); - nr_migrated++; + obj_free(class, used_obj); } /* Remember last position in this iteration */ cc->s_page = s_page; cc->index = index; - cc->nr_migrated = nr_migrated; return ret; } -static struct page *alloc_target_page(struct size_class *class) +static struct page *isolate_target_page(struct size_class *class) { int i; struct page *page; @@ -1663,7 +1669,7 @@ static struct page *alloc_target_page(struct size_class *class) for (i = 0; i < _ZS_NR_FULLNESS_GROUPS; i++) { page = class->fullness_list[i]; if (page) { - remove_zspage(page, class, i); + remove_zspage(class, i, page); break; } } @@ -1671,15 +1677,22 @@ static struct page *alloc_target_page(struct size_class *class) return page; } -static void putback_zspage(struct zs_pool *pool, struct size_class *class, - struct page *first_page) +/* + * putback_zspage - add @first_page into right class's fullness list + * @pool: target pool + * @class: destination class + * @first_page: target page + * + * Return @fist_page's fullness_group + */ +static enum fullness_group putback_zspage(struct zs_pool *pool, + struct size_class *class, + struct page *first_page) { enum fullness_group fullness; - BUG_ON(!is_first_page(first_page)); - fullness = get_fullness_group(first_page); - insert_zspage(first_page, class, fullness); + insert_zspage(class, fullness, first_page); set_zspage_mapping(first_page, class->index, fullness); if (fullness == ZS_EMPTY) { @@ -1690,50 +1703,73 @@ static void putback_zspage(struct zs_pool *pool, struct size_class *class, free_zspage(first_page); } + + return fullness; } static struct page *isolate_source_page(struct size_class *class) { - struct page *page; + int i; + struct page *page = NULL; - page = class->fullness_list[ZS_ALMOST_EMPTY]; - if (page) - remove_zspage(page, class, ZS_ALMOST_EMPTY); + for (i = ZS_ALMOST_EMPTY; i >= ZS_ALMOST_FULL; i--) { + page = class->fullness_list[i]; + if (!page) + continue; + + remove_zspage(class, i, page); + break; + } return page; } -static unsigned long __zs_compact(struct zs_pool *pool, - struct size_class *class) +/* + * + * Based on the number of unused allocated objects calculate + * and return the number of pages that we can free. + */ +static unsigned long zs_can_compact(struct size_class *class) +{ + unsigned long obj_wasted; + unsigned long obj_allocated = zs_stat_get(class, OBJ_ALLOCATED); + unsigned long obj_used = zs_stat_get(class, OBJ_USED); + + if (obj_allocated <= obj_used) + return 0; + + obj_wasted = obj_allocated - obj_used; + obj_wasted /= get_maxobj_per_zspage(class->size, + class->pages_per_zspage); + + return obj_wasted * class->pages_per_zspage; +} + +static void __zs_compact(struct zs_pool *pool, struct size_class *class) { - int nr_to_migrate; struct zs_compact_control cc; struct page *src_page; struct page *dst_page = NULL; - unsigned long nr_total_migrated = 0; spin_lock(&class->lock); while ((src_page = isolate_source_page(class))) { - BUG_ON(!is_first_page(src_page)); + if (!zs_can_compact(class)) + break; - /* The goal is to migrate all live objects in source page */ - nr_to_migrate = src_page->inuse; cc.index = 0; cc.s_page = src_page; - while ((dst_page = alloc_target_page(class))) { + while ((dst_page = isolate_target_page(class))) { cc.d_page = dst_page; /* - * If there is no more space in dst_page, try to - * allocate another zspage. + * If there is no more space in dst_page, resched + * and see if anyone had allocated another zspage. */ if (!migrate_zspage(pool, class, &cc)) break; putback_zspage(pool, class, dst_page); - nr_total_migrated += cc.nr_migrated; - nr_to_migrate -= cc.nr_migrated; } /* Stop if we couldn't find slot */ @@ -1741,9 +1777,9 @@ static unsigned long __zs_compact(struct zs_pool *pool, break; putback_zspage(pool, class, dst_page); - putback_zspage(pool, class, src_page); + if (putback_zspage(pool, class, src_page) == ZS_EMPTY) + pool->stats.pages_compacted += class->pages_per_zspage; spin_unlock(&class->lock); - nr_total_migrated += cc.nr_migrated; cond_resched(); spin_lock(&class->lock); } @@ -1752,14 +1788,11 @@ static unsigned long __zs_compact(struct zs_pool *pool, putback_zspage(pool, class, src_page); spin_unlock(&class->lock); - - return nr_total_migrated; } unsigned long zs_compact(struct zs_pool *pool) { int i; - unsigned long nr_migrated = 0; struct size_class *class; for (i = zs_size_classes - 1; i >= 0; i--) { @@ -1768,13 +1801,77 @@ unsigned long zs_compact(struct zs_pool *pool) continue; if (class->index != i) continue; - nr_migrated += __zs_compact(pool, class); + __zs_compact(pool, class); } - return nr_migrated; + return pool->stats.pages_compacted; } EXPORT_SYMBOL_GPL(zs_compact); +void zs_pool_stats(struct zs_pool *pool, struct zs_pool_stats *stats) +{ + memcpy(stats, &pool->stats, sizeof(struct zs_pool_stats)); +} +EXPORT_SYMBOL_GPL(zs_pool_stats); + +static unsigned long zs_shrinker_scan(struct shrinker *shrinker, + struct shrink_control *sc) +{ + unsigned long pages_freed; + struct zs_pool *pool = container_of(shrinker, struct zs_pool, + shrinker); + + pages_freed = pool->stats.pages_compacted; + /* + * Compact classes and calculate compaction delta. + * Can run concurrently with a manually triggered + * (by user) compaction. + */ + pages_freed = zs_compact(pool) - pages_freed; + + return pages_freed ? pages_freed : SHRINK_STOP; +} + +static unsigned long zs_shrinker_count(struct shrinker *shrinker, + struct shrink_control *sc) +{ + int i; + struct size_class *class; + unsigned long pages_to_free = 0; + struct zs_pool *pool = container_of(shrinker, struct zs_pool, + shrinker); + + for (i = zs_size_classes - 1; i >= 0; i--) { + class = pool->size_class[i]; + if (!class) + continue; + if (class->index != i) + continue; + + pages_to_free += zs_can_compact(class); + } + + return pages_to_free; +} + +static void zs_unregister_shrinker(struct zs_pool *pool) +{ + if (pool->shrinker_enabled) { + unregister_shrinker(&pool->shrinker); + pool->shrinker_enabled = false; + } +} + +static int zs_register_shrinker(struct zs_pool *pool) +{ + pool->shrinker.scan_objects = zs_shrinker_scan; + pool->shrinker.count_objects = zs_shrinker_count; + pool->shrinker.batch = 0; + pool->shrinker.seeks = DEFAULT_SEEKS; + + return register_shrinker(&pool->shrinker); +} + /** * zs_create_pool - Creates an allocation pool to work from. * @flags: allocation flags used to allocate pool metadata @@ -1785,7 +1882,7 @@ EXPORT_SYMBOL_GPL(zs_compact); * On success, a pointer to the newly created pool is returned, * otherwise NULL. */ -struct zs_pool *zs_create_pool(char *name, gfp_t flags) +struct zs_pool *zs_create_pool(const char *name) { int i; struct zs_pool *pool; @@ -1855,11 +1952,15 @@ struct zs_pool *zs_create_pool(char *name, gfp_t flags) prev_class = class; } - pool->flags = flags; - - if (zs_pool_stat_create(name, pool)) - goto err; + /* debug only, don't abort if it fails */ + zs_pool_stat_create(pool, name); + /* + * Not critical, we still can use the pool + * and user can trigger compaction manually. + */ + if (zs_register_shrinker(pool) == 0) + pool->shrinker_enabled = true; return pool; err: @@ -1872,6 +1973,7 @@ void zs_destroy_pool(struct zs_pool *pool) { int i; + zs_unregister_shrinker(pool); zs_pool_stat_destroy(pool); for (i = 0; i < zs_size_classes; i++) { @@ -1913,17 +2015,10 @@ static int __init zs_init(void) zpool_register_driver(&zs_zpool_driver); #endif - ret = zs_stat_init(); - if (ret) { - pr_err("zs stat initialization failed\n"); - goto stat_fail; - } + zs_stat_init(); + return 0; -stat_fail: -#ifdef CONFIG_ZPOOL - zpool_unregister_driver(&zs_zpool_driver); -#endif notifier_fail: zs_unregister_cpu_notifier(); diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c index ec2cf37c7c944..52650ff1a3cd6 100644 --- a/net/bluetooth/bnep/core.c +++ b/net/bluetooth/bnep/core.c @@ -533,6 +533,9 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) BT_DBG(""); + if (!l2cap_is_socket(sock)) + return -EBADFD; + baswap((void *) dst, &l2cap_pi(sock->sk)->chan->dst); baswap((void *) src, &l2cap_pi(sock->sk)->chan->src); diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c index 128644c0cfe8f..a9e1e67bbbd7d 100644 --- a/net/bluetooth/rfcomm/sock.c +++ b/net/bluetooth/rfcomm/sock.c @@ -335,16 +335,21 @@ static int rfcomm_sock_create(struct net *net, struct socket *sock, static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_len) { - struct sockaddr_rc *sa = (struct sockaddr_rc *) addr; + struct sockaddr_rc sa; struct sock *sk = sock->sk; - int chan = sa->rc_channel; - int err = 0; - - BT_DBG("sk %pK %pMR", sk, &sa->rc_bdaddr); + int chan; + int len, err = 0; if (!addr || addr->sa_family != AF_BLUETOOTH) return -EINVAL; + memset(&sa, 0, sizeof(sa)); + len = min_t(unsigned int, sizeof(sa), addr_len); + memcpy(&sa, addr, len); + chan = sa.rc_channel; + + BT_DBG("sk %pK %pMR", sk, &sa.rc_bdaddr); + lock_sock(sk); if (sk->sk_state != BT_OPEN) { @@ -359,11 +364,11 @@ static int rfcomm_sock_bind(struct socket *sock, struct sockaddr *addr, int addr write_lock(&rfcomm_sk_list.lock); - if (chan && __rfcomm_get_listen_sock_by_addr(chan, &sa->rc_bdaddr)) { + if (chan && __rfcomm_get_listen_sock_by_addr(chan, &sa.rc_bdaddr)) { err = -EADDRINUSE; } else { /* Save source address */ - bacpy(&rfcomm_pi(sk)->src, &sa->rc_bdaddr); + bacpy(&rfcomm_pi(sk)->src, &sa.rc_bdaddr); rfcomm_pi(sk)->channel = chan; sk->sk_state = BT_BOUND; } diff --git a/net/core/filter.c b/net/core/filter.c index e6cde173851d0..905224b23cb55 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -46,9 +46,10 @@ #include /** - * sk_filter - run a packet through a socket filter + * sk_filter_trim_cap - run a packet through a socket filter * @sk: sock associated with &sk_buff * @skb: buffer to filter + * @cap: limit on how short the eBPF program may trim the packet * * Run the filter code and then cut skb->data to correct size returned by * SK_RUN_FILTER. If pkt_len is 0 we toss packet. If skb->len is smaller @@ -57,7 +58,7 @@ * be accepted or -EPERM if the packet should be tossed. * */ -int sk_filter(struct sock *sk, struct sk_buff *skb) +int sk_filter_trim_cap(struct sock *sk, struct sk_buff *skb, unsigned int cap) { int err; struct sk_filter *filter; @@ -79,13 +80,13 @@ int sk_filter(struct sock *sk, struct sk_buff *skb) if (filter) { unsigned int pkt_len = SK_RUN_FILTER(filter, skb); - err = pkt_len ? pskb_trim(skb, pkt_len) : -EPERM; + err = pkt_len ? pskb_trim(skb, max(cap, pkt_len)) : -EPERM; } rcu_read_unlock(); return err; } -EXPORT_SYMBOL(sk_filter); +EXPORT_SYMBOL(sk_filter_trim_cap); static u64 __skb_get_pay_offset(u64 ctx, u64 a, u64 x, u64 r4, u64 r5) { diff --git a/net/core/iovec.c b/net/core/iovec.c index e1ec45ab1e63c..4c3fd5845f4b5 100644 --- a/net/core/iovec.c +++ b/net/core/iovec.c @@ -88,6 +88,10 @@ int csum_partial_copy_fromiovecend(unsigned char *kdata, struct iovec *iov, __wsum csum = *csump; int partial_cnt = 0, err = 0; + /* No data? Done! */ + if (len == 0) + return 0; + /* Skip over the finished iovecs */ while (offset >= iov->iov_len) { offset -= iov->iov_len; diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index c412db7746032..c555dd808f986 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c @@ -1027,6 +1027,14 @@ static int rtnl_fill_ifinfo(struct sk_buff *skb, struct net_device *dev, .dma = dev->dma, .port = dev->if_port, }; + memset(&map, 0, sizeof(map)); + map.mem_start = dev->mem_start; + map.mem_end = dev->mem_end; + map.base_addr = dev->base_addr; + map.irq = dev->irq; + map.dma = dev->dma; + map.port = dev->if_port; + if (nla_put(skb, IFLA_MAP, sizeof(map), &map)) goto nla_put_failure; } diff --git a/net/core/sock.c b/net/core/sock.c index b1a6ff0a9041c..29ec4ed8bbaaf 100644 --- a/net/core/sock.c +++ b/net/core/sock.c @@ -733,7 +733,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, val = min_t(u32, val, sysctl_wmem_max); set_sndbuf: sk->sk_userlocks |= SOCK_SNDBUF_LOCK; - sk->sk_sndbuf = max_t(u32, val * 2, SOCK_MIN_SNDBUF); + sk->sk_sndbuf = max_t(int, val * 2, SOCK_MIN_SNDBUF); /* Wake up sending tasks if we upped the value. */ sk->sk_write_space(sk); break; @@ -769,7 +769,7 @@ int sock_setsockopt(struct socket *sock, int level, int optname, * returning the value we actually used in getsockopt * is the most desirable behavior. */ - sk->sk_rcvbuf = max_t(u32, val * 2, SOCK_MIN_RCVBUF); + sk->sk_rcvbuf = max_t(int, val * 2, SOCK_MIN_RCVBUF); break; case SO_RCVBUFFORCE: diff --git a/net/dccp/input.c b/net/dccp/input.c index 3c8ec7d4a34ec..700440e4fa3bb 100644 --- a/net/dccp/input.c +++ b/net/dccp/input.c @@ -606,7 +606,8 @@ int dccp_rcv_state_process(struct sock *sk, struct sk_buff *skb, if (inet_csk(sk)->icsk_af_ops->conn_request(sk, skb) < 0) return 1; - goto discard; + consume_skb(skb); + return 0; } if (dh->dccph_type == DCCP_PKT_RESET) goto discard; diff --git a/net/dccp/ipv6.c b/net/dccp/ipv6.c index 92cd5bf4751cf..e9a8975f2824c 100644 --- a/net/dccp/ipv6.c +++ b/net/dccp/ipv6.c @@ -468,6 +468,9 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, newsk->sk_backlog_rcv = dccp_v4_do_rcv; newnp->pktoptions = NULL; newnp->opt = NULL; + newnp->ipv6_mc_list = NULL; + newnp->ipv6_ac_list = NULL; + newnp->ipv6_fl_list = NULL; newnp->mcast_oif = inet6_iif(skb); newnp->mcast_hops = ipv6_hdr(skb)->hop_limit; @@ -542,6 +545,9 @@ static struct sock *dccp_v6_request_recv_sock(struct sock *sk, /* Clone RX bits */ newnp->rxopt.all = np->rxopt.all; + newnp->ipv6_mc_list = NULL; + newnp->ipv6_ac_list = NULL; + newnp->ipv6_fl_list = NULL; /* Clone pktoptions received with SYN */ newnp->pktoptions = NULL; diff --git a/net/ipc_router/ipc_router_core.c b/net/ipc_router/ipc_router_core.c index fae41583d0e98..47730b708838c 100644 --- a/net/ipc_router/ipc_router_core.c +++ b/net/ipc_router/ipc_router_core.c @@ -720,7 +720,7 @@ static void *msm_ipc_router_skb_to_buf(struct sk_buff_head *skb_head, unsigned int len) { struct sk_buff *temp; - unsigned int offset = 0, buf_len = 0, copy_len; + int offset = 0, buf_len = 0, copy_len; void *buf; if (!skb_head) { @@ -2808,6 +2808,9 @@ int msm_ipc_router_register_server(struct msm_ipc_port *port_ptr, if (!port_ptr || !name) return -EINVAL; + if (port_ptr->type != CLIENT_PORT) + return -EINVAL; + if (name->addrtype != MSM_IPC_ADDR_NAME) return -EINVAL; diff --git a/net/ipc_router/ipc_router_socket.c b/net/ipc_router/ipc_router_socket.c index 828797bd19e50..652531a8e592d 100644 --- a/net/ipc_router/ipc_router_socket.c +++ b/net/ipc_router/ipc_router_socket.c @@ -555,10 +555,18 @@ static unsigned int msm_ipc_router_poll(struct file *file, static int msm_ipc_router_close(struct socket *sock) { struct sock *sk = sock->sk; - struct msm_ipc_port *port_ptr = msm_ipc_sk_port(sk); + struct msm_ipc_port *port_ptr; int ret; + if (!sk) + return -EINVAL; + lock_sock(sk); + port_ptr = msm_ipc_sk_port(sk); + if (!port_ptr) { + release_sock(sk); + return -EINVAL; + } ret = msm_ipc_router_close_port(port_ptr); msm_ipc_unload_default_node(msm_ipc_sk(sk)->default_node_vote_info); release_sock(sk); diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 046fce012da5b..8839b55ea4def 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c @@ -1066,7 +1066,14 @@ void ipv4_pktinfo_prepare(const struct sock *sk, struct sk_buff *skb) pktinfo->ipi_ifindex = 0; pktinfo->ipi_spec_dst.s_addr = 0; } - skb_dst_drop(skb); + /* We need to keep the dst for __ip_options_echo() + * We could restrict the test to opt.ts_needtime || opt.srr, + * but the following is good enough as IP options are not often used. + */ + if (unlikely(IPCB(skb)->opt.optlen)) + skb_dst_force(skb); + else + skb_dst_drop(skb); } int ip_setsockopt(struct sock *sk, int level, diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index f95b6f93814b9..738e62d548ce7 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c @@ -355,11 +355,12 @@ unsigned int arpt_do_table(struct sk_buff *skb, } /* All zeroes == unconditional rule. */ -static inline bool unconditional(const struct arpt_arp *arp) +static inline bool unconditional(const struct arpt_entry *e) { static const struct arpt_arp uncond; - return memcmp(arp, &uncond, sizeof(uncond)) == 0; + return e->target_offset == sizeof(struct arpt_entry) && + memcmp(&e->arp, &uncond, sizeof(uncond)) == 0; } /* Figures out from what hook each rule can be called: returns 0 if @@ -398,11 +399,10 @@ static int mark_source_chains(const struct xt_table_info *newinfo, |= ((1 << hook) | (1 << NF_ARP_NUMHOOKS)); /* Unconditional return/END. */ - if ((e->target_offset == sizeof(struct arpt_entry) && + if ((unconditional(e) && (strcmp(t->target.u.user.name, XT_STANDARD_TARGET) == 0) && - t->verdict < 0 && unconditional(&e->arp)) || - visited) { + t->verdict < 0) || visited) { unsigned int oldpos, size; if ((strcmp(t->target.u.user.name, @@ -470,14 +470,12 @@ static int mark_source_chains(const struct xt_table_info *newinfo, return 1; } -static inline int check_entry(const struct arpt_entry *e, const char *name) +static inline int check_entry(const struct arpt_entry *e) { const struct xt_entry_target *t; - if (!arp_checkentry(&e->arp)) { - duprintf("arp_tables: arp check failed %p %s.\n", e, name); + if (!arp_checkentry(&e->arp)) return -EINVAL; - } if (e->target_offset + sizeof(struct xt_entry_target) > e->next_offset) return -EINVAL; @@ -518,10 +516,6 @@ find_check_entry(struct arpt_entry *e, const char *name, unsigned int size) struct xt_target *target; int ret; - ret = check_entry(e, name); - if (ret) - return ret; - t = arpt_get_target(e); target = xt_request_find_target(NFPROTO_ARP, t->u.user.name, t->u.user.revision); @@ -547,7 +541,7 @@ static bool check_underflow(const struct arpt_entry *e) const struct xt_entry_target *t; unsigned int verdict; - if (!unconditional(&e->arp)) + if (!unconditional(e)) return false; t = arpt_get_target_c(e); if (strcmp(t->u.user.name, XT_STANDARD_TARGET) != 0) @@ -566,9 +560,11 @@ static inline int check_entry_size_and_hooks(struct arpt_entry *e, unsigned int valid_hooks) { unsigned int h; + int err; if ((unsigned long)e % __alignof__(struct arpt_entry) != 0 || - (unsigned char *)e + sizeof(struct arpt_entry) >= limit) { + (unsigned char *)e + sizeof(struct arpt_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p\n", e); return -EINVAL; } @@ -580,6 +576,10 @@ static inline int check_entry_size_and_hooks(struct arpt_entry *e, return -EINVAL; } + err = check_entry(e); + if (err) + return err; + /* Check hooks & underflows */ for (h = 0; h < NF_ARP_NUMHOOKS; h++) { if (!(valid_hooks & (1 << h))) @@ -588,9 +588,9 @@ static inline int check_entry_size_and_hooks(struct arpt_entry *e, newinfo->hook_entry[h] = hook_entries[h]; if ((unsigned char *)e - base == underflows[h]) { if (!check_underflow(e)) { - pr_err("Underflows must be unconditional and " - "use the STANDARD target with " - "ACCEPT/DROP\n"); + pr_debug("Underflows must be unconditional and " + "use the STANDARD target with " + "ACCEPT/DROP\n"); return -EINVAL; } newinfo->underflow[h] = underflows[h]; @@ -1224,7 +1224,8 @@ check_compat_entry_size_and_hooks(struct compat_arpt_entry *e, duprintf("check_compat_entry_size_and_hooks %p\n", e); if ((unsigned long)e % __alignof__(struct compat_arpt_entry) != 0 || - (unsigned char *)e + sizeof(struct compat_arpt_entry) >= limit) { + (unsigned char *)e + sizeof(struct compat_arpt_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p, limit = %p\n", e, limit); return -EINVAL; } @@ -1237,7 +1238,7 @@ check_compat_entry_size_and_hooks(struct compat_arpt_entry *e, } /* For purposes of check_entry casting the compat entry is fine */ - ret = check_entry((struct arpt_entry *)e, name); + ret = check_entry((struct arpt_entry *)e); if (ret) return ret; diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c index 99e810f84671b..2c8fb724dde5d 100644 --- a/net/ipv4/netfilter/ip_tables.c +++ b/net/ipv4/netfilter/ip_tables.c @@ -168,11 +168,12 @@ get_entry(const void *base, unsigned int offset) /* All zeroes == unconditional rule. */ /* Mildly perf critical (only if packet tracing is on) */ -static inline bool unconditional(const struct ipt_ip *ip) +static inline bool unconditional(const struct ipt_entry *e) { static const struct ipt_ip uncond; - return memcmp(ip, &uncond, sizeof(uncond)) == 0; + return e->target_offset == sizeof(struct ipt_entry) && + memcmp(&e->ip, &uncond, sizeof(uncond)) == 0; #undef FWINV } @@ -229,11 +230,10 @@ get_chainname_rulenum(const struct ipt_entry *s, const struct ipt_entry *e, } else if (s == e) { (*rulenum)++; - if (s->target_offset == sizeof(struct ipt_entry) && + if (unconditional(s) && strcmp(t->target.u.kernel.target->name, XT_STANDARD_TARGET) == 0 && - t->verdict < 0 && - unconditional(&s->ip)) { + t->verdict < 0) { /* Tail of chains: STANDARD target (return/policy) */ *comment = *chainname == hookname ? comments[NF_IP_TRACE_COMMENT_POLICY] @@ -472,11 +472,10 @@ mark_source_chains(const struct xt_table_info *newinfo, e->comefrom |= ((1 << hook) | (1 << NF_INET_NUMHOOKS)); /* Unconditional return/END. */ - if ((e->target_offset == sizeof(struct ipt_entry) && + if ((unconditional(e) && (strcmp(t->target.u.user.name, XT_STANDARD_TARGET) == 0) && - t->verdict < 0 && unconditional(&e->ip)) || - visited) { + t->verdict < 0) || visited) { unsigned int oldpos, size; if ((strcmp(t->target.u.user.name, @@ -565,14 +564,12 @@ static void cleanup_match(struct xt_entry_match *m, struct net *net) } static int -check_entry(const struct ipt_entry *e, const char *name) +check_entry(const struct ipt_entry *e) { const struct xt_entry_target *t; - if (!ip_checkentry(&e->ip)) { - duprintf("ip check failed %p %s.\n", e, name); + if (!ip_checkentry(&e->ip)) return -EINVAL; - } if (e->target_offset + sizeof(struct xt_entry_target) > e->next_offset) @@ -662,10 +659,6 @@ find_check_entry(struct ipt_entry *e, struct net *net, const char *name, struct xt_mtchk_param mtpar; struct xt_entry_match *ematch; - ret = check_entry(e, name); - if (ret) - return ret; - j = 0; mtpar.net = net; mtpar.table = name; @@ -709,7 +702,7 @@ static bool check_underflow(const struct ipt_entry *e) const struct xt_entry_target *t; unsigned int verdict; - if (!unconditional(&e->ip)) + if (!unconditional(e)) return false; t = ipt_get_target_c(e); if (strcmp(t->u.user.name, XT_STANDARD_TARGET) != 0) @@ -729,9 +722,11 @@ check_entry_size_and_hooks(struct ipt_entry *e, unsigned int valid_hooks) { unsigned int h; + int err; if ((unsigned long)e % __alignof__(struct ipt_entry) != 0 || - (unsigned char *)e + sizeof(struct ipt_entry) >= limit) { + (unsigned char *)e + sizeof(struct ipt_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p\n", e); return -EINVAL; } @@ -743,6 +738,10 @@ check_entry_size_and_hooks(struct ipt_entry *e, return -EINVAL; } + err = check_entry(e); + if (err) + return err; + /* Check hooks & underflows */ for (h = 0; h < NF_INET_NUMHOOKS; h++) { if (!(valid_hooks & (1 << h))) @@ -751,9 +750,9 @@ check_entry_size_and_hooks(struct ipt_entry *e, newinfo->hook_entry[h] = hook_entries[h]; if ((unsigned char *)e - base == underflows[h]) { if (!check_underflow(e)) { - pr_err("Underflows must be unconditional and " - "use the STANDARD target with " - "ACCEPT/DROP\n"); + pr_debug("Underflows must be unconditional and " + "use the STANDARD target with " + "ACCEPT/DROP\n"); return -EINVAL; } newinfo->underflow[h] = underflows[h]; @@ -1490,7 +1489,8 @@ check_compat_entry_size_and_hooks(struct compat_ipt_entry *e, duprintf("check_compat_entry_size_and_hooks %p\n", e); if ((unsigned long)e % __alignof__(struct compat_ipt_entry) != 0 || - (unsigned char *)e + sizeof(struct compat_ipt_entry) >= limit) { + (unsigned char *)e + sizeof(struct compat_ipt_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p, limit = %p\n", e, limit); return -EINVAL; } @@ -1503,7 +1503,7 @@ check_compat_entry_size_and_hooks(struct compat_ipt_entry *e, } /* For purposes of check_entry casting the compat entry is fine */ - ret = check_entry((struct ipt_entry *)e, name); + ret = check_entry((struct ipt_entry *)e); if (ret) return ret; diff --git a/net/ipv4/ping.c b/net/ipv4/ping.c index 59f8d47bffe42..f65379c4d86db 100644 --- a/net/ipv4/ping.c +++ b/net/ipv4/ping.c @@ -656,7 +656,7 @@ int ping_common_sendmsg(int family, struct msghdr *msg, size_t len, void *user_icmph, size_t icmph_len) { u8 type, code; - if (len > 0xFFFF) + if (len > 0xFFFF || len < icmph_len) return -EMSGSIZE; /* diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 4fcfaf8693140..9fe51f80d91e9 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -785,6 +785,12 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos, ret = -EAGAIN; break; } + /* if __tcp_splice_read() got nothing while we have + * an skb in receive queue, we do not want to loop. + * This might happen with URG data. + */ + if (!skb_queue_empty(&sk->sk_receive_queue)) + break; sk_wait_data(sk, &timeo); if (signal_pending(current)) { ret = sock_intr_errno(timeo); diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 3bdea261141bb..cc7f940ca996e 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -88,7 +88,7 @@ int sysctl_tcp_adv_win_scale __read_mostly = 1; EXPORT_SYMBOL(sysctl_tcp_adv_win_scale); /* rfc5961 challenge ack rate limiting */ -int sysctl_tcp_challenge_ack_limit = 100; +int sysctl_tcp_challenge_ack_limit = 1000; int sysctl_tcp_stdurg __read_mostly; int sysctl_tcp_rfc1337 __read_mostly; @@ -3325,13 +3325,20 @@ static void tcp_send_challenge_ack(struct sock *sk) /* unprotected vars, we dont care of overwrites */ static u32 challenge_timestamp; static unsigned int challenge_count; - u32 now = jiffies / HZ; + u32 count, now; + /* Check host-wide RFC 5961 rate limit. */ + now = jiffies / HZ; if (now != challenge_timestamp) { + u32 half = (sysctl_tcp_challenge_ack_limit + 1) >> 1; + challenge_timestamp = now; - challenge_count = 0; + WRITE_ONCE(challenge_count, half + + prandom_u32_max(sysctl_tcp_challenge_ack_limit)); } - if (++challenge_count <= sysctl_tcp_challenge_ack_limit) { + count = READ_ONCE(challenge_count); + if (count > 0) { + WRITE_ONCE(challenge_count, count - 1); NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPCHALLENGEACK); tcp_send_ack(sk); } diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 81c3261dd7806..918ef0385e6a5 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c @@ -1581,6 +1581,21 @@ bool tcp_prequeue(struct sock *sk, struct sk_buff *skb) } EXPORT_SYMBOL(tcp_prequeue); +int tcp_filter(struct sock *sk, struct sk_buff *skb) +{ + struct tcphdr *th = (struct tcphdr *)skb->data; + unsigned int eaten = skb->len; + int err; + + err = sk_filter_trim_cap(sk, skb, th->doff * 4); + if (!err) { + eaten -= skb->len; + TCP_SKB_CB(skb)->end_seq -= eaten; + } + return err; +} +EXPORT_SYMBOL(tcp_filter); + /* * From tcp_input.c */ @@ -1609,6 +1624,14 @@ int tcp_v4_rcv(struct sk_buff *skb) if (!pskb_may_pull(skb, th->doff * 4)) goto discard_it; + + /* Assuming a trustworthy entity did the checksum and found the csum + * invalid, drop the packet. + */ + if (skb->ip_summed == CHECKSUM_COMPLETE && skb->csum_valid == 0) + goto csum_error; + + /* An explanation is required here, I think. * Packet length and doff are validated by header prediction, * provided case of th->doff==0 is eliminated. @@ -1664,8 +1687,10 @@ int tcp_v4_rcv(struct sk_buff *skb) nf_reset(skb); - if (sk_filter(sk, skb)) + if (tcp_filter(sk, skb)) goto discard_and_relse; + th = (const struct tcphdr *)skb->data; + iph = ip_hdr(skb); sk_mark_napi_id(sk, skb); skb->dev = NULL; diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 44a7c83d1a363..9f8f9ae5e36d1 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1258,6 +1258,7 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, int peeked, off = 0; int err; int is_udplite = IS_UDPLITE(sk); + bool checksum_valid = false; bool slow; if (flags & MSG_ERRQUEUE) @@ -1283,11 +1284,12 @@ int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, */ if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) { - if (udp_lib_checksum_complete(skb)) + checksum_valid = !udp_lib_checksum_complete(skb); + if (!checksum_valid) goto csum_copy_err; } - if (skb_csum_unnecessary(skb)) + if (checksum_valid || skb_csum_unnecessary(skb)) err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov, copied); else { diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c index 1a93a39b2aab0..96c59dbd5b74a 100644 --- a/net/ipv6/ip6_gre.c +++ b/net/ipv6/ip6_gre.c @@ -367,35 +367,37 @@ static void ip6gre_tunnel_uninit(struct net_device *dev) static void ip6gre_err(struct sk_buff *skb, struct inet6_skb_parm *opt, - u8 type, u8 code, int offset, __be32 info) + u8 type, u8 code, int offset, __be32 info) { - const struct ipv6hdr *ipv6h = (const struct ipv6hdr *)skb->data; - __be16 *p = (__be16 *)(skb->data + offset); - int grehlen = offset + 4; + const struct gre_base_hdr *greh; + const struct ipv6hdr *ipv6h; + int grehlen = sizeof(*greh); struct ip6_tnl *t; + int key_off = 0; __be16 flags; + __be32 key; - flags = p[0]; - if (flags&(GRE_CSUM|GRE_KEY|GRE_SEQ|GRE_ROUTING|GRE_VERSION)) { - if (flags&(GRE_VERSION|GRE_ROUTING)) - return; - if (flags&GRE_KEY) { - grehlen += 4; - if (flags&GRE_CSUM) - grehlen += 4; - } + if (!pskb_may_pull(skb, offset + grehlen)) + return; + greh = (const struct gre_base_hdr *)(skb->data + offset); + flags = greh->flags; + if (flags & (GRE_VERSION | GRE_ROUTING)) + return; + if (flags & GRE_CSUM) + grehlen += 4; + if (flags & GRE_KEY) { + key_off = grehlen + offset; + grehlen += 4; } - /* If only 8 bytes returned, keyed message will be dropped here */ - if (!pskb_may_pull(skb, grehlen)) + if (!pskb_may_pull(skb, offset + grehlen)) return; ipv6h = (const struct ipv6hdr *)skb->data; - p = (__be16 *)(skb->data + offset); + greh = (const struct gre_base_hdr *)(skb->data + offset); + key = key_off ? *(__be32 *)(skb->data + key_off) : 0; t = ip6gre_tunnel_lookup(skb->dev, &ipv6h->daddr, &ipv6h->saddr, - flags & GRE_KEY ? - *(((__be32 *)p) + (grehlen / 4) - 1) : 0, - p[1]); + key, greh->protocol); if (t == NULL) return; diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index e080fbbbc0e5c..bc0615b1cf63e 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c @@ -195,11 +195,12 @@ get_entry(const void *base, unsigned int offset) /* All zeroes == unconditional rule. */ /* Mildly perf critical (only if packet tracing is on) */ -static inline bool unconditional(const struct ip6t_ip6 *ipv6) +static inline bool unconditional(const struct ip6t_entry *e) { static const struct ip6t_ip6 uncond; - return memcmp(ipv6, &uncond, sizeof(uncond)) == 0; + return e->target_offset == sizeof(struct ip6t_entry) && + memcmp(&e->ipv6, &uncond, sizeof(uncond)) == 0; } static inline const struct xt_entry_target * @@ -255,11 +256,10 @@ get_chainname_rulenum(const struct ip6t_entry *s, const struct ip6t_entry *e, } else if (s == e) { (*rulenum)++; - if (s->target_offset == sizeof(struct ip6t_entry) && + if (unconditional(s) && strcmp(t->target.u.kernel.target->name, XT_STANDARD_TARGET) == 0 && - t->verdict < 0 && - unconditional(&s->ipv6)) { + t->verdict < 0) { /* Tail of chains: STANDARD target (return/policy) */ *comment = *chainname == hookname ? comments[NF_IP6_TRACE_COMMENT_POLICY] @@ -482,11 +482,10 @@ mark_source_chains(const struct xt_table_info *newinfo, e->comefrom |= ((1 << hook) | (1 << NF_INET_NUMHOOKS)); /* Unconditional return/END. */ - if ((e->target_offset == sizeof(struct ip6t_entry) && + if ((unconditional(e) && (strcmp(t->target.u.user.name, XT_STANDARD_TARGET) == 0) && - t->verdict < 0 && - unconditional(&e->ipv6)) || visited) { + t->verdict < 0) || visited) { unsigned int oldpos, size; if ((strcmp(t->target.u.user.name, @@ -575,14 +574,12 @@ static void cleanup_match(struct xt_entry_match *m, struct net *net) } static int -check_entry(const struct ip6t_entry *e, const char *name) +check_entry(const struct ip6t_entry *e) { const struct xt_entry_target *t; - if (!ip6_checkentry(&e->ipv6)) { - duprintf("ip_tables: ip check failed %p %s.\n", e, name); + if (!ip6_checkentry(&e->ipv6)) return -EINVAL; - } if (e->target_offset + sizeof(struct xt_entry_target) > e->next_offset) @@ -673,10 +670,6 @@ find_check_entry(struct ip6t_entry *e, struct net *net, const char *name, struct xt_mtchk_param mtpar; struct xt_entry_match *ematch; - ret = check_entry(e, name); - if (ret) - return ret; - j = 0; mtpar.net = net; mtpar.table = name; @@ -720,7 +713,7 @@ static bool check_underflow(const struct ip6t_entry *e) const struct xt_entry_target *t; unsigned int verdict; - if (!unconditional(&e->ipv6)) + if (!unconditional(e)) return false; t = ip6t_get_target_c(e); if (strcmp(t->u.user.name, XT_STANDARD_TARGET) != 0) @@ -740,9 +733,11 @@ check_entry_size_and_hooks(struct ip6t_entry *e, unsigned int valid_hooks) { unsigned int h; + int err; if ((unsigned long)e % __alignof__(struct ip6t_entry) != 0 || - (unsigned char *)e + sizeof(struct ip6t_entry) >= limit) { + (unsigned char *)e + sizeof(struct ip6t_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p\n", e); return -EINVAL; } @@ -754,6 +749,10 @@ check_entry_size_and_hooks(struct ip6t_entry *e, return -EINVAL; } + err = check_entry(e); + if (err) + return err; + /* Check hooks & underflows */ for (h = 0; h < NF_INET_NUMHOOKS; h++) { if (!(valid_hooks & (1 << h))) @@ -762,9 +761,9 @@ check_entry_size_and_hooks(struct ip6t_entry *e, newinfo->hook_entry[h] = hook_entries[h]; if ((unsigned char *)e - base == underflows[h]) { if (!check_underflow(e)) { - pr_err("Underflows must be unconditional and " - "use the STANDARD target with " - "ACCEPT/DROP\n"); + pr_debug("Underflows must be unconditional and " + "use the STANDARD target with " + "ACCEPT/DROP\n"); return -EINVAL; } newinfo->underflow[h] = underflows[h]; @@ -1502,7 +1501,8 @@ check_compat_entry_size_and_hooks(struct compat_ip6t_entry *e, duprintf("check_compat_entry_size_and_hooks %p\n", e); if ((unsigned long)e % __alignof__(struct compat_ip6t_entry) != 0 || - (unsigned char *)e + sizeof(struct compat_ip6t_entry) >= limit) { + (unsigned char *)e + sizeof(struct compat_ip6t_entry) >= limit || + (unsigned char *)e + e->next_offset > limit) { duprintf("Bad offset %p, limit = %p\n", e, limit); return -EINVAL; } @@ -1515,7 +1515,7 @@ check_compat_entry_size_and_hooks(struct compat_ip6t_entry *e, } /* For purposes of check_entry casting the compat entry is fine */ - ret = check_entry((struct ip6t_entry *)e, name); + ret = check_entry((struct ip6t_entry *)e); if (ret) return ret; diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 205430708a92d..54ad474c8ffd1 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c @@ -1076,7 +1076,7 @@ static struct sock *tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, #ifdef CONFIG_TCP_MD5SIG newtp->af_specific = &tcp_sock_ipv6_mapped_specific; #endif - + newnp->ipv6_mc_list = NULL; newnp->ipv6_ac_list = NULL; newnp->ipv6_fl_list = NULL; newnp->pktoptions = NULL; @@ -1148,6 +1148,7 @@ static struct sock *tcp_v6_syn_recv_sock(struct sock *sk, struct sk_buff *skb, First: no IPv4 options. */ newinet->inet_opt = NULL; + newnp->ipv6_mc_list = NULL; newnp->ipv6_ac_list = NULL; newnp->ipv6_fl_list = NULL; @@ -1256,7 +1257,7 @@ static int tcp_v6_do_rcv(struct sock *sk, struct sk_buff *skb) if (skb->protocol == htons(ETH_P_IP)) return tcp_v4_do_rcv(sk, skb); - if (sk_filter(sk, skb)) + if (tcp_filter(sk, skb)) goto discard; /* @@ -1460,8 +1461,10 @@ static int tcp_v6_rcv(struct sk_buff *skb) goto discard_and_relse; #endif - if (sk_filter(sk, skb)) + if (tcp_filter(sk, skb)) goto discard_and_relse; + th = (const struct tcphdr *)skb->data; + hdr = ipv6_hdr(skb); sk_mark_napi_id(sk, skb); skb->dev = NULL; diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c index 978641648951e..c48441d67d491 100644 --- a/net/ipv6/udp.c +++ b/net/ipv6/udp.c @@ -388,6 +388,7 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, int peeked, off = 0; int err; int is_udplite = IS_UDPLITE(sk); + bool checksum_valid = false; int is_udp4; bool slow; @@ -419,11 +420,12 @@ int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk, */ if (copied < ulen || UDP_SKB_CB(skb)->partial_cov) { - if (udp_lib_checksum_complete(skb)) + checksum_valid = !udp_lib_checksum_complete(skb); + if (!checksum_valid) goto csum_copy_err; } - if (skb_csum_unnecessary(skb)) + if (checksum_valid || skb_csum_unnecessary(skb)) err = skb_copy_datagram_iovec(skb, sizeof(struct udphdr), msg->msg_iov, copied); else { diff --git a/net/ipx/af_ipx.c b/net/ipx/af_ipx.c index 1b095ca37aa46..bc043dc989637 100644 --- a/net/ipx/af_ipx.c +++ b/net/ipx/af_ipx.c @@ -1168,11 +1168,10 @@ static int ipxitf_ioctl(unsigned int cmd, void __user *arg) sipx->sipx_network = ipxif->if_netnum; memcpy(sipx->sipx_node, ipxif->if_node, sizeof(sipx->sipx_node)); - rc = -EFAULT; + rc = 0; if (copy_to_user(arg, &ifr, sizeof(ifr))) - break; + rc = -EFAULT; ipxitf_put(ipxif); - rc = 0; break; } case SIOCAIPXITFCRT: diff --git a/net/l2tp/l2tp_ip.c b/net/l2tp/l2tp_ip.c index 369a9822488c4..142f036aa6114 100644 --- a/net/l2tp/l2tp_ip.c +++ b/net/l2tp/l2tp_ip.c @@ -249,8 +249,6 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) int ret; int chk_addr_ret; - if (!sock_flag(sk, SOCK_ZAPPED)) - return -EINVAL; if (addr_len < sizeof(struct sockaddr_l2tpip)) return -EINVAL; if (addr->l2tp_family != AF_INET) @@ -265,6 +263,9 @@ static int l2tp_ip_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) read_unlock_bh(&l2tp_ip_lock); lock_sock(sk); + if (!sock_flag(sk, SOCK_ZAPPED)) + goto out; + if (sk->sk_state != TCP_CLOSE || addr_len < sizeof(struct sockaddr_l2tpip)) goto out; diff --git a/net/l2tp/l2tp_ip6.c b/net/l2tp/l2tp_ip6.c index 38658826175ca..17b74814afa66 100644 --- a/net/l2tp/l2tp_ip6.c +++ b/net/l2tp/l2tp_ip6.c @@ -264,8 +264,6 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) int addr_type; int err; - if (!sock_flag(sk, SOCK_ZAPPED)) - return -EINVAL; if (addr->l2tp_family != AF_INET6) return -EINVAL; if (addr_len < sizeof(*addr)) @@ -291,6 +289,9 @@ static int l2tp_ip6_bind(struct sock *sk, struct sockaddr *uaddr, int addr_len) lock_sock(sk); err = -EINVAL; + if (!sock_flag(sk, SOCK_ZAPPED)) + goto out_unlock; + if (sk->sk_state != TCP_CLOSE) goto out_unlock; diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 63745440403b0..e8c0cb51bd436 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c @@ -235,7 +235,7 @@ EXPORT_SYMBOL_GPL(nf_ct_invert_tuple); static void clean_from_lists(struct nf_conn *ct) { - pr_debug("clean_from_lists(%p)\n", ct); + pr_debug("clean_from_lists(%pK)\n", ct); hlist_nulls_del_rcu(&ct->tuplehash[IP_CT_DIR_ORIGINAL].hnnode); hlist_nulls_del_rcu(&ct->tuplehash[IP_CT_DIR_REPLY].hnnode); @@ -301,7 +301,7 @@ destroy_conntrack(struct nf_conntrack *nfct) struct list_head *sip_node_save_list; void (*delete_entry)(struct nf_conn *ct); - pr_debug("destroy_conntrack(%p)\n", ct); + pr_debug("destroy_conntrack(%pK)\n", ct); NF_CT_ASSERT(atomic_read(&nfct->use) == 0); NF_CT_ASSERT(!timer_pending(&ct->timeout)); @@ -346,7 +346,7 @@ destroy_conntrack(struct nf_conntrack *nfct) if (ct->master) nf_ct_put(ct->master); - pr_debug("destroy_conntrack: returning ct=%p to slab\n", ct); + pr_debug("destroy_conntrack: returning ct=%pK to slab\n", ct); nf_conntrack_free(ct); } @@ -635,7 +635,7 @@ __nf_conntrack_confirm(struct sk_buff *skb) * confirmed us. */ NF_CT_ASSERT(!nf_ct_is_confirmed(ct)); - pr_debug("Confirming conntrack %p\n", ct); + pr_debug("Confirming conntrack %pK\n", ct); /* We have to check the DYING flag after unlink to prevent * a race against nf_ct_get_next_corpse() possibly called from * user context, else we insert an already 'dead' hash, blocking @@ -981,7 +981,7 @@ init_conntrack(struct net *net, struct nf_conn *tmpl, spin_lock(&nf_conntrack_expect_lock); exp = nf_ct_find_expectation(net, zone, tuple); if (exp) { - pr_debug("conntrack: expectation arrives ct=%p exp=%p\n", + pr_debug("conntrack: expectation arrives ct=%pK exp=%pK\n", ct, exp); /* Welcome, Mr. Bond. We've been expecting you... */ __set_bit(IPS_EXPECTED_BIT, &ct->status); @@ -1074,14 +1074,14 @@ resolve_normal_ct(struct net *net, struct nf_conn *tmpl, } else { /* Once we've had two way comms, always ESTABLISHED. */ if (test_bit(IPS_SEEN_REPLY_BIT, &ct->status)) { - pr_debug("nf_conntrack_in: normal packet for %p\n", ct); + pr_debug("nf_conntrack_in: normal packet for %pK\n", ct); *ctinfo = IP_CT_ESTABLISHED; } else if (test_bit(IPS_EXPECTED_BIT, &ct->status)) { - pr_debug("nf_conntrack_in: related packet for %p\n", + pr_debug("nf_conntrack_in: related packet for %pK\n", ct); *ctinfo = IP_CT_RELATED; } else { - pr_debug("nf_conntrack_in: new packet for %p\n", ct); + pr_debug("nf_conntrack_in: new packet for %pK\n", ct); *ctinfo = IP_CT_NEW; } *set_reply = 0; @@ -1223,7 +1223,7 @@ void nf_conntrack_alter_reply(struct nf_conn *ct, /* Should be unconfirmed, so not in hash table yet */ NF_CT_ASSERT(!nf_ct_is_confirmed(ct)); - pr_debug("Altering reply tuple of %p to ", ct); + pr_debug("Altering reply tuple of %pK to ", ct); nf_ct_dump_tuple(newreply); ct->tuplehash[IP_CT_DIR_REPLY].tuple = *newreply; @@ -1800,7 +1800,7 @@ int nf_conntrack_init_net(struct net *net) if (!net->ct.stat) goto err_pcpu_lists; - net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%p", net); + net->ct.slabname = kasprintf(GFP_KERNEL, "nf_conntrack_%pK", net); if (!net->ct.slabname) goto err_slabname; diff --git a/net/netfilter/nfnetlink.c b/net/netfilter/nfnetlink.c index e41bab38a3ca8..daec7d6957a94 100644 --- a/net/netfilter/nfnetlink.c +++ b/net/netfilter/nfnetlink.c @@ -321,10 +321,12 @@ static void nfnetlink_rcv_batch(struct sk_buff *skb, struct nlmsghdr *nlh, nlh = nlmsg_hdr(skb); err = 0; - if (nlmsg_len(nlh) < sizeof(struct nfgenmsg) || - skb->len < nlh->nlmsg_len) { - err = -EINVAL; - goto ack; + if (nlh->nlmsg_len < NLMSG_HDRLEN || + skb->len < nlh->nlmsg_len || + nlmsg_len(nlh) < sizeof(struct nfgenmsg)) { + nfnl_err_reset(&err_list); + success = false; + goto done; } /* Only requests are handled by the kernel */ diff --git a/net/netfilter/xt_qtaguid.c b/net/netfilter/xt_qtaguid.c index f04d49ddd42aa..0f559e2e337f8 100644 --- a/net/netfilter/xt_qtaguid.c +++ b/net/netfilter/xt_qtaguid.c @@ -1615,8 +1615,7 @@ static struct sock *qtaguid_find_sk(const struct sk_buff *skb, * "struct inet_timewait_sock" which is missing fields. */ if (sk->sk_state == TCP_TIME_WAIT) { - if (sk != skb->sk) - sock_gen_put(sk); + sock_gen_put(sk); sk = NULL; } } @@ -1934,7 +1933,7 @@ static int qtaguid_ctrl_proc_show(struct seq_file *m, void *v) ); f_count = atomic_long_read( &sock_tag_entry->socket->file->f_count); - seq_printf(m, "sock=%p tag=0x%llx (uid=%u) pid=%u " + seq_printf(m, "sock=%pK tag=0x%llx (uid=%u) pid=%u " "f_count=%lu\n", sock_tag_entry->sk, sock_tag_entry->tag, uid, @@ -2537,8 +2536,7 @@ static int pp_stats_line(struct seq_file *m, struct tag_stat *ts_entry, uid_t stat_uid = get_uid_from_tag(tag); struct proc_print_info *ppi = m->private; /* Detailed tags are not available to everybody */ - if (get_atag_from_tag(tag) && !can_read_other_uid_stats( - make_kuid(&init_user_ns,stat_uid))) { + if (!can_read_other_uid_stats(make_kuid(&init_user_ns,stat_uid))) { CT_DEBUG("qtaguid: stats line: " "%s 0x%llx %u: insufficient priv " "from pid=%u tgid=%u uid=%u stats.gid=%u\n", diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 2c932c9db96f2..3faaf31800663 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c @@ -3283,19 +3283,25 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv if (optlen != sizeof(val)) return -EINVAL; - if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) - return -EBUSY; if (copy_from_user(&val, optval, sizeof(val))) return -EFAULT; switch (val) { case TPACKET_V1: case TPACKET_V2: case TPACKET_V3: - po->tp_version = val; - return 0; + break; default: return -EINVAL; } + lock_sock(sk); + if (po->rx_ring.pg_vec || po->tx_ring.pg_vec) { + ret = -EBUSY; + } else { + po->tp_version = val; + ret = 0; + } + release_sock(sk); + return ret; } case PACKET_RESERVE: { @@ -3307,6 +3313,8 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv return -EBUSY; if (copy_from_user(&val, optval, sizeof(val))) return -EFAULT; + if (val > INT_MAX) + return -EINVAL; po->tp_reserve = val; return 0; } @@ -3758,6 +3766,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, /* Added to avoid minimal code churn */ struct tpacket_req *req = &req_u->req; + lock_sock(sk); /* Opening a Tx-ring is NOT supported in TPACKET_V3 */ if (!closing && tx_ring && (po->tp_version > TPACKET_V2)) { WARN(1, "Tx-ring is not supported.\n"); @@ -3799,8 +3808,8 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, if (unlikely(req->tp_block_size & (PAGE_SIZE - 1))) goto out; if (po->tp_version >= TPACKET_V3 && - (int)(req->tp_block_size - - BLK_PLUS_PRIV(req_u->req3.tp_sizeof_priv)) <= 0) + req->tp_block_size <= + BLK_PLUS_PRIV((u64)req_u->req3.tp_sizeof_priv)) goto out; if (unlikely(req->tp_frame_size < po->tp_hdrlen + po->tp_reserve)) @@ -3811,6 +3820,8 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, rb->frames_per_block = req->tp_block_size/req->tp_frame_size; if (unlikely(rb->frames_per_block <= 0)) goto out; + if (unlikely(req->tp_block_size > UINT_MAX / req->tp_block_nr)) + goto out; if (unlikely((rb->frames_per_block * req->tp_block_nr) != req->tp_frame_nr)) goto out; @@ -3839,7 +3850,6 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, goto out; } - lock_sock(sk); /* Detach socket from network */ spin_lock(&po->bind_lock); @@ -3888,11 +3898,11 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u, if (!tx_ring) prb_shutdown_retire_blk_timer(po, tx_ring, rb_queue); } - release_sock(sk); if (pg_vec) free_pg_vec(pg_vec, order, req->tp_block_nr); out: + release_sock(sk); return err; } diff --git a/net/rmnet_data/rmnet_data_config.c b/net/rmnet_data/rmnet_data_config.c index 9f5a2ccbb7cd2..7876b74162094 100644 --- a/net/rmnet_data/rmnet_data_config.c +++ b/net/rmnet_data/rmnet_data_config.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2015, 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 @@ -531,6 +531,11 @@ void rmnet_config_netlink_msg_handler(struct sk_buff *skb) nlmsg_header = (struct nlmsghdr *) skb->data; rmnet_header = (struct rmnet_nl_msg_s *) nlmsg_data(nlmsg_header); + if (!nlmsg_header->nlmsg_pid || + (nlmsg_header->nlmsg_len < sizeof(struct nlmsghdr) + + sizeof(struct rmnet_nl_msg_s))) + return; + LOGL("Netlink message pid=%d, seq=%d, length=%d, rmnet_type=%d", nlmsg_header->nlmsg_pid, nlmsg_header->nlmsg_seq, diff --git a/net/rmnet_data/rmnet_data_handlers.c b/net/rmnet_data/rmnet_data_handlers.c index 9d04b2f8ddd95..fa309f5fa5eac 100644 --- a/net/rmnet_data/rmnet_data_handlers.c +++ b/net/rmnet_data/rmnet_data_handlers.c @@ -411,6 +411,7 @@ static rx_handler_result_t _rmnet_map_ingress_handler(struct sk_buff *skb, else if (ckresult != RMNET_MAP_CHECKSUM_ERR_UNKNOWN_IP_VERSION && ckresult != RMNET_MAP_CHECKSUM_ERR_UNKNOWN_TRANSPORT && ckresult != RMNET_MAP_CHECKSUM_VALID_FLAG_NOT_SET + && ckresult != RMNET_MAP_CHECKSUM_VALIDATION_FAILED && ckresult != RMNET_MAP_CHECKSUM_FRAGMENTED_PACKET) { rmnet_kfree_skb(skb, RMNET_STATS_SKBFREE_INGRESS_BAD_MAP_CKSUM); diff --git a/net/rmnet_data/rmnet_data_vnd.c b/net/rmnet_data/rmnet_data_vnd.c index 4b0b2de1c850a..f284f90654e91 100644 --- a/net/rmnet_data/rmnet_data_vnd.c +++ b/net/rmnet_data/rmnet_data_vnd.c @@ -929,7 +929,7 @@ int rmnet_vnd_add_tc_flow(uint32_t id, uint32_t map_flow, uint32_t tc_flow) list_add(&(itm->list), &(dev_conf->flow_head)); write_unlock_irqrestore(&dev_conf->flow_map_lock, flags); - LOGD("Created flow mapping [%s][0x%08X][0x%08X]@%p", + LOGD("Created flow mapping [%s][0x%08X][0x%08X]@%pK", dev->name, itm->map_flow_id, itm->tc_flow_id[0], itm); return RMNET_CONFIG_OK; diff --git a/net/rose/rose_in.c b/net/rose/rose_in.c index 79c4abcfa6b4e..fb31d2ea5a814 100644 --- a/net/rose/rose_in.c +++ b/net/rose/rose_in.c @@ -164,7 +164,8 @@ static int rose_state3_machine(struct sock *sk, struct sk_buff *skb, int framety rose_frames_acked(sk, nr); if (ns == rose->vr) { rose_start_idletimer(sk); - if (sock_queue_rcv_skb(sk, skb) == 0) { + if (sk_filter_trim_cap(sk, skb, ROSE_MIN_LEN) == 0 && + sock_queue_rcv_skb(sk, skb) == 0) { rose->vr = (rose->vr + 1) % ROSE_MODULUS; queued = 1; } else { diff --git a/net/socket.c b/net/socket.c index f457cc2e46fbf..6f886c4857da3 100644 --- a/net/socket.c +++ b/net/socket.c @@ -2449,31 +2449,31 @@ int __sys_recvmmsg(int fd, struct mmsghdr __user *mmsg, unsigned int vlen, break; } -out_put: - fput_light(sock->file, fput_needed); - if (err == 0) - return datagrams; + goto out_put; - if (datagrams != 0) { + if (datagrams == 0) { + datagrams = err; + goto out_put; + } + + /* + * We may return less entries than requested (vlen) if the + * sock is non block and there aren't enough datagrams... + */ + if (err != -EAGAIN) { /* - * We may return less entries than requested (vlen) if the - * sock is non block and there aren't enough datagrams... + * ... or if recvmsg returns an error after we + * received some datagrams, where we record the + * error to return on the next call or if the + * app asks about it using getsockopt(SO_ERROR). */ - if (err != -EAGAIN) { - /* - * ... or if recvmsg returns an error after we - * received some datagrams, where we record the - * error to return on the next call or if the - * app asks about it using getsockopt(SO_ERROR). - */ - sock->sk->sk_err = -err; - } - - return datagrams; + sock->sk->sk_err = -err; } +out_put: + fput_light(sock->file, fput_needed); - return err; + return datagrams; } SYSCALL_DEFINE5(recvmmsg, int, fd, struct mmsghdr __user *, mmsg, diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 67dc2175ff39e..3e2eec6437d5a 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c @@ -1724,7 +1724,12 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock, goto out_unlock; } - if (unlikely(unix_peer(other) != sk && unix_recvq_full(other))) { + /* other == sk && unix_peer(other) != sk if + * - unix_peer(sk) == NULL, destination address bound to sk + * - unix_peer(sk) == sk by time of get but disconnected before lock + */ + if (other != sk && + unlikely(unix_peer(other) != sk && unix_recvq_full(other))) { if (timeo) { timeo = unix_wait_for_peer(other, timeo); diff --git a/net/wireless/db.txt b/net/wireless/db.txt index bfa4c7f12586c..a8bb6177bc904 100644 --- a/net/wireless/db.txt +++ b/net/wireless/db.txt @@ -16,7 +16,7 @@ country 00: (57240 - 63720 @ 2160), (0) -country AE: DFS-FCC +country AE: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (24), AUTO-BW (5250 - 5330 @ 80), (24), DFS, AUTO-BW @@ -52,13 +52,12 @@ country AN: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS -country AR: DFS-FCC - (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5590 @ 80), (24), DFS - (5650 - 5730 @ 80), (24), DFS - (5735 - 5835 @ 80), (30) +country AR: + (2402 - 2482 @ 40), (36) + (5170 - 5330 @ 160), (23) + (5490 - 5590 @ 80), (36) + (5650 - 5730 @ 80), (36) + (5735 - 5835 @ 80), (36) country AS: DFS-FCC (2402 - 2472 @ 40), (30) @@ -162,11 +161,10 @@ country BG: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country BH: DFS-ETSI +country BH: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 20), (20) - (5250 - 5330 @ 20), (20), DFS - (5735 - 5835 @ 20), (20) + (5170 - 5330 @ 20), (23) + (5735 - 5835 @ 20), (33) country BL: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -219,8 +217,10 @@ country BY: DFS-ETSI (5490 - 5710 @ 160), (27), DFS country BZ: - (2402 - 2482 @ 40), (30) - (5735 - 5835 @ 80), (30) + (2402 - 2482 @ 40), (36) + (5170 - 5330 @ 160), (27) + (5490 - 5730 @ 160), (36) + (5735 - 5835 @ 80), (36) country CA: DFS-FCC (2402 - 2472 @ 40), (30) @@ -259,10 +259,9 @@ country CI: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) -country CL: DFS-ETSI +country CL: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5170 - 5330 @ 160), (20) (5735 - 5835 @ 80), (20) country CN: DFS-FCC @@ -426,8 +425,8 @@ country EE: DFS-ETSI country EG: DFS-ETSI (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 40), (20) - (5250 - 5330 @ 40), (20), DFS + (5170 - 5250 @ 40), (23) + (5250 - 5330 @ 40), (23), DFS country ES: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -590,11 +589,10 @@ country HK: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) -country HN: DFS-FCC +country HN: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5730 @ 160), (24), DFS + (5170 - 5330 @ 160), (24) + (5490 - 5730 @ 160), (24) (5735 - 5835 @ 80), (30) country HR: DFS-ETSI @@ -666,11 +664,10 @@ country IL: DFS-ETSI (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW -country IN: DFS-ETSI +country IN: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW - (5735 - 5835 @ 80), (20) + (5170 - 5330 @ 160), (23) + (5735 - 5835 @ 80), (30) country IR: (2402 - 2482 @ 40), (20) @@ -744,7 +741,7 @@ country KH: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS -country KN: DFS-ETSI +country KN: DFS-FCC (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW @@ -755,8 +752,11 @@ country KR: DFS-ETSI (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW - (5490 - 5630 @ 80), (30), DFS - (5735 - 5815 @ 80), (30) + (5490 - 5710 @ 80), (30), DFS + (5735 - 5835 @ 80), (30) + # 60 GHz band channels 1-4, + # ref: http://www.law.go.kr/%ED%96%89%EC%A0%95%EA%B7%9C%EC%B9%99/%EB%AC%B4%EC%84%A0%EC%84%A4%EB%B9%84%EA%B7%9C%EC%B9%99 + (57000 - 66000 @ 2160), (43) country KP: DFS-ETSI (2402 - 2482 @ 40), (20) @@ -787,7 +787,7 @@ country LB: DFS-FCC (5490 - 5730 @ 160), (24), DFS (5735 - 5835 @ 80), (30) -country LC: DFS-ETSI +country LC: DFS-FCC (2402 - 2482 @ 40), (20) (5170 - 5250 @ 80), (20), AUTO-BW (5250 - 5330 @ 80), (20), DFS, AUTO-BW @@ -1046,10 +1046,9 @@ country NO: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country NP: DFS-ETSI +country NP: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW + (5170 - 5330 @ 160), (20) (5735 - 5835 @ 80), (20) country NZ: DFS-FCC @@ -1065,11 +1064,11 @@ country OM: DFS-ETSI (5250 - 5330 @ 80), (20), DFS, AUTO-BW (5490 - 5710 @ 160), (27), DFS -country PA: DFS-FCC +country PA: (2402 - 2472 @ 40), (30) - (5170 - 5250 @ 80), (17), AUTO-BW - (5250 - 5330 @ 80), (23), DFS, AUTO-BW - (5735 - 5835 @ 80), (30) + (5170 - 5250 @ 80), (23), AUT0-BW + (5250 - 5330 @ 80), (30), AUTO-BW + (5735 - 5835 @ 80), (36) country PE: DFS-FCC (2402 - 2482 @ 40), (20) @@ -1207,11 +1206,10 @@ country RS: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country RU: DFS-ETSI +country RU: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (20), AUTO-BW - (5250 - 5330 @ 80), (20), DFS, AUTO-BW - (5650 - 5710 @ 40), (30), DFS + (5170 - 5330 @ 160), (23) + (5490 - 5730 @ 160), (30) (5735 - 5835 @ 80), (30) country RW: DFS-FCC @@ -1285,11 +1283,10 @@ country SK: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country SN: DFS-FCC +country SN: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5730 @ 160), (24), DFS + (5170 - 5330 @ 160), (24) + (5490 - 5730 @ 160), (24) (5735 - 5835 @ 80), (30) country SR: DFS-ETSI @@ -1346,12 +1343,11 @@ country TR: DFS-ETSI # 60 gHz band channels 1-4, ref: Etsi En 302 567 (57240 - 65880 @ 2160), (40), NO-OUTDOOR -country TT: DFS-FCC +country TT: (2402 - 2482 @ 40), (20) - (5170 - 5250 @ 80), (24), AUTO-BW - (5250 - 5330 @ 80), (24), DFS, AUTO-BW - (5490 - 5730 @ 160), (24), DFS - (5735 - 5835 @ 80), (30) + (5170 - 5330 @ 160), (27) + (5490 - 5730 @ 160), (36) + (5735 - 5835 @ 80), (36) country TW: DFS-FCC (2402 - 2472 @ 40), (30) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 1926d8d553bde..85b3192ce5e19 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -301,8 +301,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { [NL80211_ATTR_WPA_VERSIONS] = { .type = NLA_U32 }, [NL80211_ATTR_PID] = { .type = NLA_U32 }, [NL80211_ATTR_4ADDR] = { .type = NLA_U8 }, - [NL80211_ATTR_PMKID] = { .type = NLA_BINARY, - .len = WLAN_PMKID_LEN }, + [NL80211_ATTR_PMKID] = { .len = WLAN_PMKID_LEN }, [NL80211_ATTR_DURATION] = { .type = NLA_U32 }, [NL80211_ATTR_COOKIE] = { .type = NLA_U64 }, [NL80211_ATTR_TX_RATES] = { .type = NLA_NESTED }, @@ -358,6 +357,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = { [NL80211_ATTR_SCAN_FLAGS] = { .type = NLA_U32 }, [NL80211_ATTR_P2P_CTWINDOW] = { .type = NLA_U8 }, [NL80211_ATTR_P2P_OPPPS] = { .type = NLA_U8 }, + [NL80211_ATTR_LOCAL_MESH_POWER_MODE] = {. type = NLA_U32 }, [NL80211_ATTR_ACL_POLICY] = {. type = NLA_U32 }, [NL80211_ATTR_MAC_ADDRS] = { .type = NLA_NESTED }, [NL80211_ATTR_STA_CAPABILITY] = { .type = NLA_U16 }, diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 4769382d9478f..9d6d229e147d0 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c @@ -3296,9 +3296,15 @@ int xfrm_migrate(const struct xfrm_selector *sel, u8 dir, u8 type, struct xfrm_state *x_new[XFRM_MAX_DEPTH]; struct xfrm_migrate *mp; + /* Stage 0 - sanity checks */ if ((err = xfrm_migrate_check(m, num_migrate)) < 0) goto out; + if (dir >= XFRM_POLICY_MAX) { + err = -EINVAL; + goto out; + } + /* Stage 1 - find policy */ if ((pol = xfrm_migrate_policy_find(sel, dir, type, net)) == NULL) { err = -ENOENT; diff --git a/net/xfrm/xfrm_user.c b/net/xfrm/xfrm_user.c index e812e988c111b..d5b9ded40216b 100644 --- a/net/xfrm/xfrm_user.c +++ b/net/xfrm/xfrm_user.c @@ -386,7 +386,15 @@ static inline int xfrm_replay_verify_len(struct xfrm_replay_state_esn *replay_es up = nla_data(rp); ulen = xfrm_replay_state_esn_len(up); - if (nla_len(rp) < ulen || xfrm_replay_state_esn_len(replay_esn) != ulen) + /* Check the overall length and the internal bitmap length to avoid + * potential overflow. + */ + if (nla_len(rp) < ulen || + xfrm_replay_state_esn_len(replay_esn) != ulen || + replay_esn->bmp_len != up->bmp_len) + return -EINVAL; + + if (up->replay_window > up->bmp_len * sizeof(__u32) * 8) return -EINVAL; return 0; diff --git a/security/Kconfig b/security/Kconfig index 3a5ffac8c91db..263e25b1cec0a 100644 --- a/security/Kconfig +++ b/security/Kconfig @@ -23,6 +23,15 @@ config SECURITY_DMESG_RESTRICT If you are unsure how to answer this question, answer N. +config SECURITY_PERF_EVENTS_RESTRICT + bool "Restrict unprivileged use of performance events" + depends on PERF_EVENTS + help + If you say Y here, the kernel.perf_event_paranoid sysctl + will be set to 3 by default, and no unprivileged use of the + perf_event_open syscall will be permitted unless it is + changed. + config SECURITY bool "Enable different security models" depends on SYSFS diff --git a/security/commoncap.c b/security/commoncap.c index af871332626a7..76d8017c724a3 100644 --- a/security/commoncap.c +++ b/security/commoncap.c @@ -96,13 +96,16 @@ int cap_capable(const struct cred *cred, struct user_namespace *targ_ns, for (;;) { /* Do we have the necessary capabilities? */ if (ns == cred->user_ns) - return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM; - + #ifdef WT_COMPILE_FACTORY_VERSION + return 0; + #else + return cap_raised(cred->cap_effective, cap) ? 0 : -EPERM; + #endif /* Have we tried all of the parent namespaces? */ if (ns == &init_user_ns) return -EPERM; - /* + /* * The owner of the user namespace in the parent of the * user namespace has all caps. */ diff --git a/security/inode.c b/security/inode.c index 8e7ca62078abe..b5f9474e58d83 100644 --- a/security/inode.c +++ b/security/inode.c @@ -105,7 +105,7 @@ struct dentry *securityfs_create_file(const char *name, umode_t mode, dir = parent->d_inode; mutex_lock(&dir->i_mutex); - dentry = lookup_one_len(name, parent, strlen(name)); + dentry = lookup_one_len2(name, mount, parent, strlen(name)); if (IS_ERR(dentry)) goto out; diff --git a/security/keys/key.c b/security/keys/key.c index e17ba6aefdc08..f8bde20bed5da 100644 --- a/security/keys/key.c +++ b/security/keys/key.c @@ -580,7 +580,7 @@ int key_reject_and_link(struct key *key, mutex_unlock(&key_construction_mutex); - if (keyring) + if (keyring && link_ret == 0) __key_link_end(keyring, &key->index_key, edit); /* wake up anyone waiting for a key to be constructed */ diff --git a/security/keys/proc.c b/security/keys/proc.c index 972eeb336b814..9962535ef9ad8 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 timespec now; unsigned long timo; key_ref_t key_ref, skey_ref; - char xbuf[12]; + char xbuf[16]; int rc; struct keyring_search_context ctx = { diff --git a/security/pfe/Kconfig b/security/pfe/Kconfig index ac248c950448b..64c4c22f203c9 100644 --- a/security/pfe/Kconfig +++ b/security/pfe/Kconfig @@ -16,6 +16,7 @@ config PFK bool "Per-File-Key driver" depends on SECURITY depends on ECRYPT_FS + depends on SECURITY_SELINUX default n help This driver is used for storing eCryptfs information diff --git a/security/pfe/pfk.c b/security/pfe/pfk.c index 7af2c7d1381fc..e6db86f2f2dc2 100644 --- a/security/pfe/pfk.c +++ b/security/pfe/pfk.c @@ -88,61 +88,11 @@ static char *inode_to_filename(struct inode *inode) return filename; } -static int pfk_inode_alloc_security(struct inode *inode) -{ - struct inode_security_struct *i_sec = NULL; - - if (inode == NULL) - return -EINVAL; - - i_sec = kzalloc(sizeof(*i_sec), GFP_KERNEL); - - if (i_sec == NULL) - return -ENOMEM; - - inode->i_security = i_sec; - - return 0; -} - -static void pfk_inode_free_security(struct inode *inode) -{ - if (inode == NULL) - return; - - kzfree(inode->i_security); -} - -static struct security_operations pfk_security_ops = { - .name = "pfk", - - .inode_alloc_security = pfk_inode_alloc_security, - .inode_free_security = pfk_inode_free_security, - - .allow_merge_bio = pfk_allow_merge_bio, -}; - static int __init pfk_lsm_init(void) { - int ret; - - /* Check if PFK is the chosen lsm via security_module_enable() */ - if (security_module_enable(&pfk_security_ops)) { - /* replace null callbacks with empty callbacks */ - security_fixup_ops(&pfk_security_ops); - ret = register_security(&pfk_security_ops); - if (ret != 0) { - pr_err("pfk lsm registeration failed, ret=%d.\n", ret); - return ret; - } - pr_debug("pfk is the chosen lsm, registered successfully !\n"); - } else { - pr_debug("pfk is not the chosen lsm.\n"); - if (!selinux_is_enabled()) { - pr_err("se linux is not enabled.\n"); - return -ENODEV; - } - + if (!selinux_is_enabled()) { + pr_err("se linux is not enabled.\n"); + return -ENODEV; } return 0; diff --git a/security/pfe/pft.c b/security/pfe/pft.c index 8b4f6631cd61a..d9e6b89a07c03 100644 --- a/security/pfe/pft.c +++ b/security/pfe/pft.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. + * Copyright (c) 2014-2016, 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 @@ -216,12 +216,13 @@ static int __init pft_lsm_init(struct pft_device *dev) ret = register_security(&pft_security_ops); if (ret) { pr_err("pft lsm registeration failed, ret=%d.\n", ret); - return 0; + return ret; } dev->is_chosen_lsm = true; pr_debug("pft is the chosen lsm, registered successfully !\n"); } else { - pr_debug("pft is not the chosen lsm.\n"); + pr_err("pft is not the chosen lsm.\n"); + return -ENODEV; } return 0; diff --git a/security/security.c b/security/security.c index 6db0967852d6f..0ef8a38e2673e 100644 --- a/security/security.c +++ b/security/security.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #define MAX_LSM_EVM_XATTR 2 @@ -832,20 +833,14 @@ int security_file_open(struct file *file, const struct cred *cred) return fsnotify_perm(file, MAY_OPEN); } -int security_file_close(struct file *file) -{ - if (security_ops->file_close) - return security_ops->file_close(file); - - return 0; -} - bool security_allow_merge_bio(struct bio *bio1, struct bio *bio2) { + bool ret = pfk_allow_merge_bio(bio1, bio2); + if (security_ops->allow_merge_bio) - return security_ops->allow_merge_bio(bio1, bio2); + ret = ret && security_ops->allow_merge_bio(bio1, bio2); - return true; + return ret; } int security_task_create(unsigned long clone_flags) diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index d2ae32d3fe0d2..a6fc6c0024934 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -84,7 +84,6 @@ #include #include #include -#include #include #include "avc.h" @@ -1735,15 +1734,9 @@ static int may_create(struct inode *dir, if (rc) return rc; - rc = avc_has_perm(newsid, sbsec->sid, - SECCLASS_FILESYSTEM, - FILESYSTEM__ASSOCIATE, &ad); - if (rc) - return rc; - - rc = pft_inode_mknod(dir, dentry, 0, 0); - - return rc; + return avc_has_perm(newsid, sbsec->sid, + SECCLASS_FILESYSTEM, + FILESYSTEM__ASSOCIATE, &ad); } /* Check whether a task can create a key. */ @@ -1799,14 +1792,7 @@ static int may_link(struct inode *dir, return 0; } - rc = avc_has_perm(sid, isec->sid, isec->sclass, av, &ad); - if (rc) - return rc; - - if (kind == MAY_UNLINK) - rc = pft_inode_unlink(dir, dentry); - - return rc; + return avc_has_perm(sid, isec->sid, isec->sclass, av, &ad); } static inline int may_rename(struct inode *old_dir, @@ -2831,24 +2817,9 @@ static int selinux_inode_init_security(struct inode *inode, struct inode *dir, static int selinux_inode_create(struct inode *dir, struct dentry *dentry, umode_t mode) { - int ret; - - ret = pft_inode_create(dir, dentry, mode); - if (ret < 0) - return ret; return may_create(dir, dentry, SECCLASS_FILE); } -static int selinux_inode_post_create(struct inode *dir, struct dentry *dentry, - umode_t mode) -{ - int ret; - - ret = pft_inode_post_create(dir, dentry, mode); - - return ret; -} - static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry) { return may_link(dir, old_dentry, MAY_LINK); @@ -2882,12 +2853,6 @@ static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, umode_t static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry, struct inode *new_inode, struct dentry *new_dentry) { - int rc; - - rc = pft_inode_rename(old_inode, old_dentry, new_inode, new_dentry); - if (rc) - return rc; - return may_rename(old_inode, old_dentry, new_inode, new_dentry); } @@ -3006,9 +2971,6 @@ static int selinux_inode_setotherxattr(struct dentry *dentry, const char *name) { const struct cred *cred = current_cred(); - if (pft_inode_set_xattr(dentry, name, NULL, 0, 0) < 0) - return -EACCES; - if (!strncmp(name, XATTR_SECURITY_PREFIX, sizeof XATTR_SECURITY_PREFIX - 1)) { if (!strcmp(name, XATTR_NAME_CAPS)) { @@ -3256,16 +3218,11 @@ static int selinux_file_permission(struct file *file, int mask) struct file_security_struct *fsec = file->f_security; struct inode_security_struct *isec = inode->i_security; u32 sid = current_sid(); - int ret; if (!mask) /* No permission to check. Existence test. */ return 0; - ret = pft_file_permission(file, mask); - if (ret < 0) - return ret; - if (sid == fsec->sid && fsec->isid == isec->sid && fsec->pseqno == avc_policy_seqno()) /* No change since file_open check. */ @@ -3560,11 +3517,6 @@ static int selinux_file_open(struct file *file, const struct cred *cred) { struct file_security_struct *fsec; struct inode_security_struct *isec; - int ret; - - ret = pft_file_open(file, cred); - if (ret < 0) - return ret; fsec = file->f_security; isec = file_inode(file)->i_security; @@ -3588,18 +3540,6 @@ static int selinux_file_open(struct file *file, const struct cred *cred) return file_path_has_perm(cred, file, open_file_to_av(file)); } -static int selinux_file_close(struct file *file) -{ - return pft_file_close(file); -} - - -static bool selinux_allow_merge_bio(struct bio *bio1, struct bio *bio2) -{ - return pft_allow_merge_bio(bio1, bio2) && - pfk_allow_merge_bio(bio1, bio2); -} - /* task security operations */ static int selinux_task_create(unsigned long clone_flags) @@ -6040,7 +5980,6 @@ static struct security_operations selinux_ops = { .inode_free_security = selinux_inode_free_security, .inode_init_security = selinux_inode_init_security, .inode_create = selinux_inode_create, - .inode_post_create = selinux_inode_post_create, .inode_link = selinux_inode_link, .inode_unlink = selinux_inode_unlink, .inode_symlink = selinux_inode_symlink, @@ -6077,8 +6016,6 @@ static struct security_operations selinux_ops = { .file_receive = selinux_file_receive, .file_open = selinux_file_open, - .file_close = selinux_file_close, - .allow_merge_bio = selinux_allow_merge_bio, .task_create = selinux_task_create, .cred_alloc_blank = selinux_cred_alloc_blank, diff --git a/sound/core/info.c b/sound/core/info.c index 418b4ec43cadb..a4af0ba92d30f 100644 --- a/sound/core/info.c +++ b/sound/core/info.c @@ -253,6 +253,7 @@ static ssize_t snd_info_entry_write(struct file *file, const char __user *buffer struct snd_info_buffer *buf; ssize_t size = 0; loff_t pos; + unsigned long realloc_size; data = file->private_data; if (snd_BUG_ON(!data)) @@ -261,7 +262,8 @@ static ssize_t snd_info_entry_write(struct file *file, const char __user *buffer pos = *offset; if (pos < 0 || (long) pos != pos || (ssize_t) count < 0) return -EIO; - if ((unsigned long) pos + (unsigned long) count < (unsigned long) pos) + realloc_size = (unsigned long) pos + (unsigned long) count; + if (realloc_size < (unsigned long) pos || realloc_size > UINT_MAX) return -EIO; switch (entry->content) { case SNDRV_INFO_CONTENT_TEXT: diff --git a/sound/core/pcm.c b/sound/core/pcm.c index 2a456f2d8bd53..87a31ec77bb6f 100644 --- a/sound/core/pcm.c +++ b/sound/core/pcm.c @@ -150,7 +150,9 @@ static int snd_pcm_control_ioctl(struct snd_card *card, err = -ENXIO; goto _error; } + mutex_lock(&pcm->open_mutex); err = snd_pcm_info_user(substream, info); + mutex_unlock(&pcm->open_mutex); _error: mutex_unlock(®ister_mutex); return err; @@ -158,7 +160,7 @@ static int snd_pcm_control_ioctl(struct snd_card *card, case SNDRV_CTL_IOCTL_PCM_PREFER_SUBDEVICE: { int val; - + if (get_user(val, (int __user *)arg)) return -EFAULT; control->prefer_pcm_subdevice = val; diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c index 55c89bb323ebd..cace4de9ca110 100644 --- a/sound/core/pcm_lib.c +++ b/sound/core/pcm_lib.c @@ -1877,10 +1877,10 @@ void snd_pcm_period_elapsed(struct snd_pcm_substream *substream) if (substream->timer_running) snd_timer_interrupt(substream->timer, 1); _end: + kill_fasync(&runtime->fasync, SIGIO, POLL_IN); snd_pcm_stream_unlock_irqrestore(substream, flags); if (runtime->transfer_ack_end) runtime->transfer_ack_end(substream); - kill_fasync(&runtime->fasync, SIGIO, POLL_IN); } EXPORT_SYMBOL(snd_pcm_period_elapsed); diff --git a/sound/core/rawmidi.c b/sound/core/rawmidi.c index 857741431fc63..1264598cd3cd7 100644 --- a/sound/core/rawmidi.c +++ b/sound/core/rawmidi.c @@ -115,6 +115,7 @@ static int snd_rawmidi_runtime_create(struct snd_rawmidi_substream *substream) return -ENOMEM; runtime->substream = substream; spin_lock_init(&runtime->lock); + mutex_init(&runtime->realloc_mutex); init_waitqueue_head(&runtime->sleep); INIT_WORK(&runtime->event_work, snd_rawmidi_input_event_work); runtime->event = NULL; @@ -637,8 +638,10 @@ int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream, struct snd_rawmidi_params * params) { char *newbuf; + char *oldbuf; struct snd_rawmidi_runtime *runtime = substream->runtime; - + unsigned long flags; + if (substream->append && substream->use_count > 1) return -EBUSY; snd_rawmidi_drain_output(substream); @@ -649,13 +652,22 @@ int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream, return -EINVAL; } if (params->buffer_size != runtime->buffer_size) { - newbuf = krealloc(runtime->buffer, params->buffer_size, + mutex_lock(&runtime->realloc_mutex); + newbuf = __krealloc(runtime->buffer, params->buffer_size, GFP_KERNEL); - if (!newbuf) + if (!newbuf) { + mutex_unlock(&runtime->realloc_mutex); return -ENOMEM; + } + spin_lock_irqsave(&runtime->lock, flags); + oldbuf = runtime->buffer; runtime->buffer = newbuf; runtime->buffer_size = params->buffer_size; runtime->avail = runtime->buffer_size; + spin_unlock_irqrestore(&runtime->lock, flags); + if (oldbuf != newbuf) + kfree(oldbuf); + mutex_unlock(&runtime->realloc_mutex); } runtime->avail_min = params->avail_min; substream->active_sensing = !params->no_active_sensing; @@ -667,7 +679,9 @@ int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream, struct snd_rawmidi_params * params) { char *newbuf; + char *oldbuf; struct snd_rawmidi_runtime *runtime = substream->runtime; + unsigned long flags; snd_rawmidi_drain_input(substream); if (params->buffer_size < 32 || params->buffer_size > 1024L * 1024L) { @@ -677,12 +691,21 @@ int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream, return -EINVAL; } if (params->buffer_size != runtime->buffer_size) { - newbuf = krealloc(runtime->buffer, params->buffer_size, + mutex_lock(&runtime->realloc_mutex); + newbuf = __krealloc(runtime->buffer, params->buffer_size, GFP_KERNEL); - if (!newbuf) + if (!newbuf) { + mutex_unlock(&runtime->realloc_mutex); return -ENOMEM; + } + spin_lock_irqsave(&runtime->lock, flags); + oldbuf = runtime->buffer; runtime->buffer = newbuf; runtime->buffer_size = params->buffer_size; + spin_unlock_irqrestore(&runtime->lock, flags); + if (oldbuf != newbuf) + kfree(oldbuf); + mutex_unlock(&runtime->realloc_mutex); } runtime->avail_min = params->avail_min; return 0; @@ -954,6 +977,8 @@ static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream, struct snd_rawmidi_runtime *runtime = substream->runtime; unsigned long appl_ptr; + if (userbuf) + mutex_lock(&runtime->realloc_mutex); spin_lock_irqsave(&runtime->lock, flags); while (count > 0 && runtime->avail) { count1 = runtime->buffer_size - runtime->appl_ptr; @@ -974,6 +999,7 @@ static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream, spin_unlock_irqrestore(&runtime->lock, flags); if (copy_to_user(userbuf + result, runtime->buffer + appl_ptr, count1)) { + mutex_unlock(&runtime->realloc_mutex); return result > 0 ? result : -EFAULT; } spin_lock_irqsave(&runtime->lock, flags); @@ -982,6 +1008,8 @@ static long snd_rawmidi_kernel_read1(struct snd_rawmidi_substream *substream, count -= count1; } spin_unlock_irqrestore(&runtime->lock, flags); + if (userbuf) + mutex_unlock(&runtime->realloc_mutex); return result; } @@ -1246,10 +1274,14 @@ static long snd_rawmidi_kernel_write1(struct snd_rawmidi_substream *substream, return -EINVAL; result = 0; + if (userbuf) + mutex_lock(&runtime->realloc_mutex); spin_lock_irqsave(&runtime->lock, flags); if (substream->append) { if ((long)runtime->avail < count) { spin_unlock_irqrestore(&runtime->lock, flags); + if (userbuf) + mutex_unlock(&runtime->realloc_mutex); return -EAGAIN; } } @@ -1285,6 +1317,8 @@ static long snd_rawmidi_kernel_write1(struct snd_rawmidi_substream *substream, __end: count1 = runtime->avail < runtime->buffer_size; spin_unlock_irqrestore(&runtime->lock, flags); + if (userbuf) + mutex_unlock(&runtime->realloc_mutex); if (count1) snd_rawmidi_output_trigger(substream, 1); return result; diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c index a4dabd55e3978..f54a79fba0782 100644 --- a/sound/core/seq/seq_clientmgr.c +++ b/sound/core/seq/seq_clientmgr.c @@ -1251,8 +1251,8 @@ static int snd_seq_ioctl_set_client_info(struct snd_seq_client *client, } -/* - * CREATE PORT ioctl() +/* + * CREATE PORT ioctl() */ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, void __user *arg) @@ -1260,6 +1260,7 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, struct snd_seq_client_port *port; struct snd_seq_port_info info; struct snd_seq_port_callback *callback; + int port_idx; if (copy_from_user(&info, arg, sizeof(info))) return -EFAULT; @@ -1273,7 +1274,9 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, return -ENOMEM; if (client->type == USER_CLIENT && info.kernel) { - snd_seq_delete_port(client, port->addr.port); + port_idx = port->addr.port; + snd_seq_port_unlock(port); + snd_seq_delete_port(client, port_idx); return -EINVAL; } if (client->type == KERNEL_CLIENT) { @@ -1295,6 +1298,7 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, snd_seq_set_port_info(port, &info); snd_seq_system_client_ev_port_start(port->addr.client, port->addr.port); + snd_seq_port_unlock(port); if (copy_to_user(arg, &info, sizeof(info))) return -EFAULT; @@ -1302,8 +1306,8 @@ static int snd_seq_ioctl_create_port(struct snd_seq_client *client, return 0; } -/* - * DELETE PORT ioctl() +/* + * DELETE PORT ioctl() */ static int snd_seq_ioctl_delete_port(struct snd_seq_client *client, void __user *arg) diff --git a/sound/core/seq/seq_ports.c b/sound/core/seq/seq_ports.c index 9c1c8d50f593e..cde2c6ca6d47e 100644 --- a/sound/core/seq/seq_ports.c +++ b/sound/core/seq/seq_ports.c @@ -121,15 +121,16 @@ static void port_subs_info_init(struct snd_seq_port_subs_info *grp) grp->close = NULL; } - -/* create a port, port number is returned (-1 on failure) */ +/* create a port, port number is returned (-1 on failure); +* the caller needs to unref the port via snd_seq_port_unlock() appropriately +*/ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, int port) { unsigned long flags; struct snd_seq_client_port *new_port, *p; int num = -1; - + /* sanity check */ if (snd_BUG_ON(!client)) return NULL; @@ -151,6 +152,7 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, snd_use_lock_init(&new_port->use_lock); port_subs_info_init(&new_port->c_src); port_subs_info_init(&new_port->c_dest); + snd_use_lock_use(&new_port->use_lock); num = port >= 0 ? port : 0; mutex_lock(&client->ports_mutex); @@ -165,9 +167,9 @@ struct snd_seq_client_port *snd_seq_create_port(struct snd_seq_client *client, list_add_tail(&new_port->list, &p->list); client->num_ports++; new_port->addr.port = num; /* store the port number in the port */ + sprintf(new_port->name, "port-%d", num); write_unlock_irqrestore(&client->ports_lock, flags); mutex_unlock(&client->ports_mutex); - sprintf(new_port->name, "port-%d", num); return new_port; } diff --git a/sound/core/seq/seq_queue.c b/sound/core/seq/seq_queue.c index a0cda38205b97..77ec214203558 100644 --- a/sound/core/seq/seq_queue.c +++ b/sound/core/seq/seq_queue.c @@ -142,8 +142,10 @@ static struct snd_seq_queue *queue_new(int owner, int locked) static void queue_delete(struct snd_seq_queue *q) { /* stop and release the timer */ + mutex_lock(&q->timer_mutex); snd_seq_timer_stop(q->timer); snd_seq_timer_close(q); + mutex_unlock(&q->timer_mutex); /* wait until access free */ snd_use_lock_sync(&q->use_lock); /* release resources... */ diff --git a/sound/core/timer.c b/sound/core/timer.c index 4927a3c88340f..592c93cbbb081 100644 --- a/sound/core/timer.c +++ b/sound/core/timer.c @@ -74,7 +74,7 @@ struct snd_timer_user { struct timespec tstamp; /* trigger tstamp */ wait_queue_head_t qchange_sleep; struct fasync_struct *fasync; - struct mutex tread_sem; + struct mutex ioctl_lock; }; /* list of timers */ @@ -305,8 +305,6 @@ int snd_timer_open(struct snd_timer_instance **ti, return 0; } -static int _snd_timer_stop(struct snd_timer_instance *timeri, int event); - /* * close a timer instance */ @@ -395,7 +393,6 @@ unsigned long snd_timer_resolution(struct snd_timer_instance *timeri) static void snd_timer_notify1(struct snd_timer_instance *ti, int event) { struct snd_timer *timer; - unsigned long flags; unsigned long resolution = 0; struct snd_timer_instance *ts; struct timespec tstamp; @@ -419,34 +416,66 @@ static void snd_timer_notify1(struct snd_timer_instance *ti, int event) return; if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) return; - spin_lock_irqsave(&timer->lock, flags); list_for_each_entry(ts, &ti->slave_active_head, active_list) if (ts->ccallback) ts->ccallback(ts, event + 100, &tstamp, resolution); - spin_unlock_irqrestore(&timer->lock, flags); } -static int snd_timer_start1(struct snd_timer *timer, struct snd_timer_instance *timeri, - unsigned long sticks) +/* start/continue a master timer */ +static int snd_timer_start1(struct snd_timer_instance *timeri, + bool start, unsigned long ticks) { + struct snd_timer *timer; + int result; + unsigned long flags; + + timer = timeri->timer; + if (!timer) + return -EINVAL; + + spin_lock_irqsave(&timer->lock, flags); + if (timer->card && timer->card->shutdown) { + result = -ENODEV; + goto unlock; + } + if (timeri->flags & (SNDRV_TIMER_IFLG_RUNNING | + SNDRV_TIMER_IFLG_START)) { + result = -EBUSY; + goto unlock; + } + + if (start) + timeri->ticks = timeri->cticks = ticks; + else if (!timeri->cticks) + timeri->cticks = 1; + timeri->pticks = 0; + list_move_tail(&timeri->active_list, &timer->active_list_head); if (timer->running) { if (timer->hw.flags & SNDRV_TIMER_HW_SLAVE) goto __start_now; timer->flags |= SNDRV_TIMER_FLG_RESCHED; timeri->flags |= SNDRV_TIMER_IFLG_START; - return 1; /* delayed start */ + result = 1; /* delayed start */ } else { - timer->sticks = sticks; + if (start) + timer->sticks = ticks; timer->hw.start(timer); __start_now: timer->running++; timeri->flags |= SNDRV_TIMER_IFLG_RUNNING; - return 0; + result = 0; } + snd_timer_notify1(timeri, start ? SNDRV_TIMER_EVENT_START : + SNDRV_TIMER_EVENT_CONTINUE); + unlock: + spin_unlock_irqrestore(&timer->lock, flags); + return result; } -static int snd_timer_start_slave(struct snd_timer_instance *timeri) +/* start/continue a slave timer */ +static int snd_timer_start_slave(struct snd_timer_instance *timeri, + bool start) { unsigned long flags; @@ -460,88 +489,37 @@ static int snd_timer_start_slave(struct snd_timer_instance *timeri) spin_lock(&timeri->timer->lock); list_add_tail(&timeri->active_list, &timeri->master->slave_active_head); + snd_timer_notify1(timeri, start ? SNDRV_TIMER_EVENT_START : + SNDRV_TIMER_EVENT_CONTINUE); spin_unlock(&timeri->timer->lock); } spin_unlock_irqrestore(&slave_active_lock, flags); return 1; /* delayed start */ } -/* - * start the timer instance - */ -int snd_timer_start(struct snd_timer_instance *timeri, unsigned int ticks) -{ - struct snd_timer *timer; - int result = -EINVAL; - unsigned long flags; - - if (timeri == NULL || ticks < 1) - return -EINVAL; - if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) { - result = snd_timer_start_slave(timeri); - if (result >= 0) - snd_timer_notify1(timeri, SNDRV_TIMER_EVENT_START); - return result; - } - timer = timeri->timer; - if (timer == NULL) - return -EINVAL; - if (timer->card && timer->card->shutdown) - return -ENODEV; - spin_lock_irqsave(&timer->lock, flags); - if (timeri->flags & (SNDRV_TIMER_IFLG_RUNNING | - SNDRV_TIMER_IFLG_START)) { - result = -EBUSY; - goto unlock; - } - timeri->ticks = timeri->cticks = ticks; - timeri->pticks = 0; - result = snd_timer_start1(timer, timeri, ticks); - unlock: - spin_unlock_irqrestore(&timer->lock, flags); - if (result >= 0) - snd_timer_notify1(timeri, SNDRV_TIMER_EVENT_START); - return result; -} - -static int _snd_timer_stop(struct snd_timer_instance *timeri, int event) +/* stop/pause a master timer */ +static int snd_timer_stop1(struct snd_timer_instance *timeri, bool stop) { struct snd_timer *timer; + int result = 0; unsigned long flags; - if (snd_BUG_ON(!timeri)) - return -ENXIO; - - if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) { - spin_lock_irqsave(&slave_active_lock, flags); - if (!(timeri->flags & SNDRV_TIMER_IFLG_RUNNING)) { - spin_unlock_irqrestore(&slave_active_lock, flags); - return -EBUSY; - } - if (timeri->timer) - spin_lock(&timeri->timer->lock); - timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING; - list_del_init(&timeri->ack_list); - list_del_init(&timeri->active_list); - if (timeri->timer) - spin_unlock(&timeri->timer->lock); - spin_unlock_irqrestore(&slave_active_lock, flags); - goto __end; - } timer = timeri->timer; if (!timer) return -EINVAL; spin_lock_irqsave(&timer->lock, flags); if (!(timeri->flags & (SNDRV_TIMER_IFLG_RUNNING | SNDRV_TIMER_IFLG_START))) { - spin_unlock_irqrestore(&timer->lock, flags); - return -EBUSY; + result = -EBUSY; + goto unlock; } list_del_init(&timeri->ack_list); list_del_init(&timeri->active_list); - if (timer->card && timer->card->shutdown) { - spin_unlock_irqrestore(&timer->lock, flags); - return 0; + if (timer->card && timer->card->shutdown) + goto unlock; + if (stop) { + timeri->cticks = timeri->ticks; + timeri->pticks = 0; } if ((timeri->flags & SNDRV_TIMER_IFLG_RUNNING) && !(--timer->running)) { @@ -556,13 +534,49 @@ static int _snd_timer_stop(struct snd_timer_instance *timeri, int event) } } timeri->flags &= ~(SNDRV_TIMER_IFLG_RUNNING | SNDRV_TIMER_IFLG_START); + snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP : + SNDRV_TIMER_EVENT_CONTINUE); + unlock: spin_unlock_irqrestore(&timer->lock, flags); - __end: - if (event != SNDRV_TIMER_EVENT_RESOLUTION) - snd_timer_notify1(timeri, event); + return result; +} + +/* stop/pause a slave timer */ +static int snd_timer_stop_slave(struct snd_timer_instance *timeri, bool stop) +{ + unsigned long flags; + + spin_lock_irqsave(&slave_active_lock, flags); + if (!(timeri->flags & SNDRV_TIMER_IFLG_RUNNING)) { + spin_unlock_irqrestore(&slave_active_lock, flags); + return -EBUSY; + } + timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING; + if (timeri->timer) { + spin_lock(&timeri->timer->lock); + list_del_init(&timeri->ack_list); + list_del_init(&timeri->active_list); + snd_timer_notify1(timeri, stop ? SNDRV_TIMER_EVENT_STOP : + SNDRV_TIMER_EVENT_CONTINUE); + spin_unlock(&timeri->timer->lock); + } + spin_unlock_irqrestore(&slave_active_lock, flags); return 0; } +/* + * start the timer instance + */ +int snd_timer_start(struct snd_timer_instance *timeri, unsigned int ticks) +{ + if (timeri == NULL || ticks < 1) + return -EINVAL; + if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) + return snd_timer_start_slave(timeri, true); + else + return snd_timer_start1(timeri, true, ticks); +} + /* * stop the timer instance. * @@ -570,21 +584,10 @@ static int _snd_timer_stop(struct snd_timer_instance *timeri, int event) */ int snd_timer_stop(struct snd_timer_instance *timeri) { - struct snd_timer *timer; - unsigned long flags; - int err; - - err = _snd_timer_stop(timeri, SNDRV_TIMER_EVENT_STOP); - if (err < 0) - return err; - timer = timeri->timer; - if (!timer) - return -EINVAL; - spin_lock_irqsave(&timer->lock, flags); - timeri->cticks = timeri->ticks; - timeri->pticks = 0; - spin_unlock_irqrestore(&timer->lock, flags); - return 0; + if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) + return snd_timer_stop_slave(timeri, true); + else + return snd_timer_stop1(timeri, true); } /* @@ -592,32 +595,10 @@ int snd_timer_stop(struct snd_timer_instance *timeri) */ int snd_timer_continue(struct snd_timer_instance *timeri) { - struct snd_timer *timer; - int result = -EINVAL; - unsigned long flags; - - if (timeri == NULL) - return result; if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) - return snd_timer_start_slave(timeri); - timer = timeri->timer; - if (! timer) - return -EINVAL; - if (timer->card && timer->card->shutdown) - return -ENODEV; - spin_lock_irqsave(&timer->lock, flags); - if (timeri->flags & SNDRV_TIMER_IFLG_RUNNING) { - result = -EBUSY; - goto unlock; - } - if (!timeri->cticks) - timeri->cticks = 1; - timeri->pticks = 0; - result = snd_timer_start1(timer, timeri, timer->sticks); - unlock: - spin_unlock_irqrestore(&timer->lock, flags); - snd_timer_notify1(timeri, SNDRV_TIMER_EVENT_CONTINUE); - return result; + return snd_timer_start_slave(timeri, false); + else + return snd_timer_start1(timeri, false, 0); } /* @@ -625,7 +606,10 @@ int snd_timer_continue(struct snd_timer_instance *timeri) */ int snd_timer_pause(struct snd_timer_instance * timeri) { - return _snd_timer_stop(timeri, SNDRV_TIMER_EVENT_PAUSE); + if (timeri->flags & SNDRV_TIMER_IFLG_SLAVE) + return snd_timer_stop_slave(timeri, false); + else + return snd_timer_stop1(timeri, false); } /* @@ -1251,6 +1235,7 @@ static void snd_timer_user_ccallback(struct snd_timer_instance *timeri, tu->tstamp = *tstamp; if ((tu->filter & (1 << event)) == 0 || !tu->tread) return; + memset(&r1, 0, sizeof(r1)); r1.event = event; r1.tstamp = *tstamp; r1.val = resolution; @@ -1285,6 +1270,7 @@ static void snd_timer_user_tinterrupt(struct snd_timer_instance *timeri, } if ((tu->filter & (1 << SNDRV_TIMER_EVENT_RESOLUTION)) && tu->last_resolution != resolution) { + memset(&r1, 0, sizeof(r1)); r1.event = SNDRV_TIMER_EVENT_RESOLUTION; r1.tstamp = tstamp; r1.val = resolution; @@ -1333,7 +1319,7 @@ static int snd_timer_user_open(struct inode *inode, struct file *file) return -ENOMEM; spin_lock_init(&tu->qlock); init_waitqueue_head(&tu->qchange_sleep); - mutex_init(&tu->tread_sem); + mutex_init(&tu->ioctl_lock); tu->ticks = 1; tu->queue_size = 128; tu->queue = kmalloc(tu->queue_size * sizeof(struct snd_timer_read), @@ -1353,8 +1339,10 @@ static int snd_timer_user_release(struct inode *inode, struct file *file) if (file->private_data) { tu = file->private_data; file->private_data = NULL; + mutex_lock(&tu->ioctl_lock); if (tu->timeri) snd_timer_close(tu->timeri); + mutex_unlock(&tu->ioctl_lock); kfree(tu->queue); kfree(tu->tqueue); kfree(tu); @@ -1592,7 +1580,6 @@ static int snd_timer_user_tselect(struct file *file, int err = 0; tu = file->private_data; - mutex_lock(&tu->tread_sem); if (tu->timeri) { snd_timer_close(tu->timeri); tu->timeri = NULL; @@ -1636,7 +1623,6 @@ static int snd_timer_user_tselect(struct file *file, } __err: - mutex_unlock(&tu->tread_sem); return err; } @@ -1750,6 +1736,7 @@ static int snd_timer_user_params(struct file *file, if (tu->timeri->flags & SNDRV_TIMER_IFLG_EARLY_EVENT) { if (tu->tread) { struct snd_timer_tread tread; + memset(&tread, 0, sizeof(tread)); tread.event = SNDRV_TIMER_EVENT_EARLY; tread.tstamp.tv_sec = 0; tread.tstamp.tv_nsec = 0; @@ -1849,7 +1836,7 @@ enum { SNDRV_TIMER_IOCTL_PAUSE_OLD = _IO('T', 0x23), }; -static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, +static long __snd_timer_user_ioctl(struct file *file, unsigned int cmd, unsigned long arg) { struct snd_timer_user *tu; @@ -1866,17 +1853,11 @@ static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, { int xarg; - mutex_lock(&tu->tread_sem); - if (tu->timeri) { /* too late */ - mutex_unlock(&tu->tread_sem); + if (tu->timeri) /* too late */ return -EBUSY; - } - if (get_user(xarg, p)) { - mutex_unlock(&tu->tread_sem); + if (get_user(xarg, p)) return -EFAULT; - } tu->tread = xarg ? 1 : 0; - mutex_unlock(&tu->tread_sem); return 0; } case SNDRV_TIMER_IOCTL_GINFO: @@ -1909,6 +1890,18 @@ static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, return -ENOTTY; } +static long snd_timer_user_ioctl(struct file *file, unsigned int cmd, + unsigned long arg) +{ + struct snd_timer_user *tu = file->private_data; + long ret; + + mutex_lock(&tu->ioctl_lock); + ret = __snd_timer_user_ioctl(file, cmd, arg); + mutex_unlock(&tu->ioctl_lock); + return ret; +} + static int snd_timer_user_fasync(int fd, struct file * file, int on) { struct snd_timer_user *tu; @@ -1927,6 +1920,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, tu = file->private_data; unit = tu->tread ? sizeof(struct snd_timer_tread) : sizeof(struct snd_timer_read); + mutex_lock(&tu->ioctl_lock); spin_lock_irq(&tu->qlock); while ((long)count - result >= unit) { while (!tu->qused) { @@ -1942,7 +1936,9 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, add_wait_queue(&tu->qchange_sleep, &wait); spin_unlock_irq(&tu->qlock); + mutex_unlock(&tu->ioctl_lock); schedule(); + mutex_lock(&tu->ioctl_lock); spin_lock_irq(&tu->qlock); remove_wait_queue(&tu->qchange_sleep, &wait); @@ -1980,6 +1976,7 @@ static ssize_t snd_timer_user_read(struct file *file, char __user *buffer, } _error: spin_unlock_irq(&tu->qlock); + mutex_unlock(&tu->ioctl_lock); return result > 0 ? result : err; } diff --git a/sound/pci/hda/hda_priv.h b/sound/pci/hda/hda_priv.h index a09703a2b2c18..5484c6596943b 100644 --- a/sound/pci/hda/hda_priv.h +++ b/sound/pci/hda/hda_priv.h @@ -15,7 +15,7 @@ #ifndef __SOUND_HDA_PRIV_H #define __SOUND_HDA_PRIV_H -#include +#include #include #include diff --git a/sound/soc/codecs/msm8916-wcd-irq.c b/sound/soc/codecs/msm8916-wcd-irq.c index 66b21d7ba1131..a4e3c7d87a6a4 100644 --- a/sound/soc/codecs/msm8916-wcd-irq.c +++ b/sound/soc/codecs/msm8916-wcd-irq.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015,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 @@ -210,14 +210,9 @@ static int get_irq_bit(int linux_irq) return i; } -static int get_order_irq(int i) -{ - return order[i]; -} - static irqreturn_t wcd9xxx_spmi_irq_handler(int linux_irq, void *data) { - int irq, i, j; + int irq, i; unsigned long status[NUM_IRQ_REGS] = {0}; if (unlikely(wcd9xxx_spmi_lock_sleep() == false)) { @@ -236,16 +231,8 @@ static irqreturn_t wcd9xxx_spmi_irq_handler(int linux_irq, void *data) MSM8X16_WCD_A_DIGITAL_INT_LATCHED_STS); status[i] &= ~map.mask[i]; } - for (i = 0; i < MAX_NUM_IRQS; i++) { - j = get_order_irq(i); - if ((status[BIT_BYTE(j)] & BYTE_BIT_MASK(j)) && - ((map.handled[BIT_BYTE(j)] & - BYTE_BIT_MASK(j)) == 0)) { - map.handler[j](irq, data); - map.handled[BIT_BYTE(j)] |= - BYTE_BIT_MASK(j); - } - } + + map.handler[irq](irq, data); map.handled[BIT_BYTE(irq)] &= ~BYTE_BIT_MASK(irq); wcd9xxx_spmi_unlock_sleep(); diff --git a/sound/soc/codecs/msm8x16-wcd.c b/sound/soc/codecs/msm8x16-wcd.c index a63d01700414c..c72ea29207c7d 100644 --- a/sound/soc/codecs/msm8x16-wcd.c +++ b/sound/soc/codecs/msm8x16-wcd.c @@ -1,4 +1,5 @@ /* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -33,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -98,7 +100,7 @@ enum { #define SPK_PMD 2 #define SPK_PMU 3 -#define MICBIAS_DEFAULT_VAL 1800000 +#define MICBIAS_DEFAULT_VAL 2400000 #define MICBIAS_MIN_VAL 1600000 #define MICBIAS_STEP_SIZE 50000 @@ -132,8 +134,10 @@ enum { static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0); static const DECLARE_TLV_DB_SCALE(analog_gain, 0, 25, 1); static struct snd_soc_dai_driver msm8x16_wcd_i2s_dai[]; -/* By default enable the internal speaker boost */ -static bool spkr_boost_en = true; + +static struct switch_dev accdet_data; +static int accdet_state; +static bool spkr_boost_en; #define MSM8X16_WCD_ACQUIRE_LOCK(x) \ mutex_lock_nested(&x, SINGLE_DEPTH_NESTING) @@ -955,7 +959,8 @@ static void msm8x16_wcd_mbhc_calc_impedance(struct wcd_mbhc *mbhc, uint32_t *zl, msm8x16_wcd_compute_impedance(codec, impedance_l, impedance_r, zl, zr, high); - pr_debug("%s: RL %d ohm, RR %d ohm\n", __func__, *zl, *zr); + + pr_err("%s: RL %d ohm, RR %d ohm\n", __func__, *zl, *zr); pr_debug("%s: Impedance detection completed\n", __func__); } @@ -1162,6 +1167,11 @@ static int __msm8x16_wcd_reg_read(struct snd_soc_codec *codec, pr_debug("%s reg = %x\n", __func__, reg); mutex_lock(&msm8x16_wcd->io_lock); pdata = snd_soc_card_get_drvdata(codec->component.card); + + if (pdata == NULL) { + mutex_unlock(&msm8x16_wcd->io_lock); + return ret; + } if (MSM8X16_WCD_IS_TOMBAK_REG(reg)) ret = msm8x16_wcd_spmi_read(reg, 1, &temp); else if (MSM8X16_WCD_IS_DIGITAL_REG(reg)) { @@ -1218,6 +1228,11 @@ static int __msm8x16_wcd_reg_write(struct snd_soc_codec *codec, mutex_lock(&msm8x16_wcd->io_lock); pdata = snd_soc_card_get_drvdata(codec->component.card); + + if (pdata == NULL) { + mutex_unlock(&msm8x16_wcd->io_lock); + return ret; + } if (MSM8X16_WCD_IS_TOMBAK_REG(reg)) ret = msm8x16_wcd_spmi_write(reg, 1, &val); else if (MSM8X16_WCD_IS_DIGITAL_REG(reg)) { @@ -4073,6 +4088,9 @@ void wcd_imped_config(struct snd_soc_codec *codec, value = wcd_get_impedance_value(imped); +#ifdef WT_COMPILE_FACTORY_VERSION + value = 16; +#endif if (value < wcd_imped_val[0]) { pr_debug("%s, detected impedance is less than 4 Ohm\n", __func__); @@ -4086,6 +4104,9 @@ void wcd_imped_config(struct snd_soc_codec *codec, codec_version = get_codec_version(msm8x16_wcd); + pr_err("%s codec_version %d imped %u set_gain %d\n", __func__, + codec_version, value, set_gain); + if (set_gain) { switch (codec_version) { case TOMBAK_1_0: @@ -4223,14 +4244,23 @@ static int msm8x16_wcd_lo_dac_event(struct snd_soc_dapm_widget *w, case SND_SOC_DAPM_PRE_PMU: snd_soc_update_bits(codec, MSM8X16_WCD_A_DIGITAL_CDC_ANA_CLK_CTL, 0x10, 0x10); + + #ifdef CONFIG_D1_ROSY + snd_soc_update_bits(codec, + MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 0x20, 0x00); + #else snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 0x20, 0x20); + #endif snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 0x80, 0x80); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x08, 0x08); snd_soc_update_bits(codec, MSM8X16_WCD_A_ANALOG_RX_LO_DAC_CTL, 0x40, 0x40); +#if defined(CONFIG_D1_ROSY) + msleep(5); +#endif break; case SND_SOC_DAPM_POST_PMU: snd_soc_update_bits(codec, @@ -4308,6 +4338,17 @@ static int msm8x16_wcd_hphr_dac_event(struct snd_soc_dapm_widget *w, return 0; } +void msm8x16_wcd_codec_set_headset_state(u32 state) +{ + switch_set_state((struct switch_dev *)&accdet_data, state); + accdet_state = state; +} + +int msm8x16_wcd_codec_get_headset_state(void) +{ + pr_debug("%s accdet_state = %d\n", __func__, accdet_state); + return accdet_state; +} static int msm8x16_wcd_hph_pa_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event) { @@ -4432,6 +4473,9 @@ static const struct snd_soc_dapm_route audio_map[] = { {"Ext Spk", NULL, "Ext Spk Switch"}, {"Ext Spk Switch", "On", "HPHL PA"}, {"Ext Spk Switch", "On", "HPHR PA"}, + #if defined (CONFIG_D1_ROSY) + {"Ext Spk Switch", "On", "LINEOUT PA"}, + #endif {"HPHL PA", NULL, "HPHL"}, {"HPHR PA", NULL, "HPHR"}, @@ -5093,9 +5137,15 @@ static const struct snd_soc_dapm_widget msm8x16_wcd_dapm_widgets[] = { SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD), +#ifdef CONFIG_D1_ROSY + SND_SOC_DAPM_PGA_E("LINEOUT PA", MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, + 5, 1 , NULL, 0, msm8x16_wcd_codec_enable_lo_pa, + SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), +#else SND_SOC_DAPM_PGA_E("LINEOUT PA", MSM8X16_WCD_A_ANALOG_RX_LO_EN_CTL, 5, 0 , NULL, 0, msm8x16_wcd_codec_enable_lo_pa, SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD), +#endif SND_SOC_DAPM_SUPPLY("VDD_SPKDRV", SND_SOC_NOPM, 0, 0, msm89xx_wcd_codec_enable_vdd_spkr, @@ -5852,6 +5902,15 @@ static int msm8x16_wcd_codec_probe(struct snd_soc_codec *codec) wcd_mbhc_init(&msm8x16_wcd_priv->mbhc, codec, &mbhc_cb, &intr_ids, wcd_mbhc_registers, true); + accdet_data.name = "h2w"; + accdet_data.index = 0; + accdet_data.state = 0; + + ret = switch_dev_register(&accdet_data); + if (ret) { + dev_err(codec->dev, "%s: Failed to register h2w\n", __func__); + return -ENOMEM; + } msm8x16_wcd_priv->mclk_enabled = false; msm8x16_wcd_priv->clock_active = false; @@ -6203,7 +6262,7 @@ static int msm8x16_wcd_spmi_probe(struct spmi_device *spmi) } - dev_dbg(&spmi->dev, "%s(%d):start addr = 0x%pa\n", + dev_dbg(&spmi->dev, "%s(%d):start addr = 0x%pK\n", __func__, __LINE__, &wcd_resource->start); if (wcd_resource->start != TOMBAK_CORE_0_SPMI_ADDR) diff --git a/sound/soc/codecs/wcd-mbhc-v2.c b/sound/soc/codecs/wcd-mbhc-v2.c index e8c33409e2919..aa7772070033c 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.c +++ b/sound/soc/codecs/wcd-mbhc-v2.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2015-2017, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -67,6 +68,11 @@ enum wcd_mbhc_cs_mb_en_flag { WCD_MBHC_EN_NONE, }; + +#ifdef CONFIG_C3B_BQ2560X +static int wt_correct_accessory_type; +#endif + static void wcd_mbhc_jack_report(struct wcd_mbhc *mbhc, struct snd_soc_jack *jack, int status, int mask) { @@ -335,11 +341,15 @@ static int wcd_event_notify(struct notifier_block *self, unsigned long val, wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_PULLUP); else /* enable current source and disable mb, pullup*/ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); + wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); + +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) +#else /* configure cap settings properly when micbias is disabled */ if (mbhc->mbhc_cb->set_cap_mode) mbhc->mbhc_cb->set_cap_mode(codec, micbias1, false); +#endif break; case WCD_EVENT_PRE_HPHL_PA_OFF: mutex_lock(&mbhc->hphl_pa_lock); @@ -355,7 +365,7 @@ static int wcd_event_notify(struct notifier_block *self, unsigned long val, wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); else /* Disable micbias, pullup & enable cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); + wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); mutex_unlock(&mbhc->hphl_pa_lock); break; case WCD_EVENT_PRE_HPHR_PA_OFF: @@ -372,7 +382,7 @@ static int wcd_event_notify(struct notifier_block *self, unsigned long val, wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); else /* Disable micbias, pullup & enable cs */ - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); + wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); mutex_unlock(&mbhc->hphr_pa_lock); break; case WCD_EVENT_PRE_HPHL_PA_ON: @@ -553,10 +563,14 @@ static void wcd_mbhc_hs_elec_irq(struct wcd_mbhc *mbhc, int irq_type, static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, enum snd_jack_types jack_type) { + struct snd_soc_codec *codec = mbhc->codec; + bool is_pa_on = false; + WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); - pr_debug("%s: enter insertion %d hph_status %x\n", - __func__, insertion, mbhc->hph_status); + + printk("%s: enter insertion %d hph_status %x, jack_type %d, current_plug %u\n", + __func__, insertion, mbhc->hph_status, jack_type, mbhc->current_plug); if (!insertion) { /* Report removal */ mbhc->hph_status &= ~jack_type; @@ -578,14 +592,14 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, if (mbhc->micbias_enable) { if (mbhc->mbhc_cb->mbhc_micbias_control) mbhc->mbhc_cb->mbhc_micbias_control( - mbhc->codec, MIC_BIAS_2, + codec, MIC_BIAS_2, MICB_DISABLE); if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - mbhc->codec, + codec, MIC_BIAS_2, false); if (mbhc->mbhc_cb->set_micbias_value) { - mbhc->mbhc_cb->set_micbias_value(mbhc->codec); + mbhc->mbhc_cb->set_micbias_value(codec); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MICB_CTRL, 0); } mbhc->micbias_enable = false; @@ -597,7 +611,10 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, jack_type, mbhc->hph_status); wcd_mbhc_jack_report(mbhc, &mbhc->headset_jack, mbhc->hph_status, WCD_MBHC_JACK_MASK); + msm8x16_wcd_codec_set_headset_state(mbhc->hph_status); + #if 0 wcd_mbhc_set_and_turnoff_hph_padac(mbhc); + #endif hphrocp_off_report(mbhc, SND_JACK_OC_HPHR); hphlocp_off_report(mbhc, SND_JACK_OC_HPHL); mbhc->current_plug = MBHC_PLUG_TYPE_NONE; @@ -616,15 +633,15 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) { if (mbhc->mbhc_cb->mbhc_micbias_control) mbhc->mbhc_cb->mbhc_micbias_control( - mbhc->codec, MIC_BIAS_2, + codec, MIC_BIAS_2, MICB_DISABLE); if (mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic) mbhc->mbhc_cb->mbhc_micb_ctrl_thr_mic( - mbhc->codec, + codec, MIC_BIAS_2, false); if (mbhc->mbhc_cb->set_micbias_value) { mbhc->mbhc_cb->set_micbias_value( - mbhc->codec); + codec); WCD_MBHC_REG_UPDATE_BITS( WCD_MBHC_MICB_CTRL, 0); } @@ -675,9 +692,13 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, } else if (jack_type == SND_JACK_ANC_HEADPHONE) mbhc->current_plug = MBHC_PLUG_TYPE_ANC_HEADPHONE; + if (mbhc->mbhc_cb->hph_pa_on_status) + is_pa_on = mbhc->mbhc_cb->hph_pa_on_status(codec); + if (mbhc->impedance_detect && mbhc->mbhc_cb->compute_impedance && - (mbhc->mbhc_cfg->linein_th != 0)) { + (mbhc->mbhc_cfg->linein_th != 0) && + (!is_pa_on)) { mbhc->mbhc_cb->compute_impedance(mbhc, &mbhc->zl, &mbhc->zr); if ((mbhc->zl > mbhc->mbhc_cfg->linein_th && @@ -709,6 +730,7 @@ static void wcd_mbhc_report_plug(struct wcd_mbhc *mbhc, int insertion, (mbhc->hph_status | SND_JACK_MECHANICAL), WCD_MBHC_JACK_MASK); wcd_mbhc_clr_and_turnon_hph_padac(mbhc); + msm8x16_wcd_codec_set_headset_state(mbhc->hph_status); } pr_debug("%s: leave hph_status %x\n", __func__, mbhc->hph_status); } @@ -805,7 +827,8 @@ static void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, bool anc_mic_found = false; enum snd_jack_types jack_type; - pr_debug("%s: enter current_plug(%d) new_plug(%d)\n", + + printk("%s: enter current_plug(%d) new_plug(%d)\n", __func__, mbhc->current_plug, plug_type); WCD_MBHC_RSC_ASSERT_LOCKED(mbhc); @@ -815,6 +838,10 @@ static void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, goto exit; } +#ifdef CONFIG_C3B_BQ2560X + wt_correct_accessory_type = false; +#endif + if (plug_type == MBHC_PLUG_TYPE_HEADPHONE) { /* * Nothing was reported previously @@ -827,7 +854,35 @@ static void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, SND_JACK_HEADPHONE); if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) wcd_mbhc_report_plug(mbhc, 0, SND_JACK_HEADSET); + + #ifndef CONFIG_C3B_BQ2560X wcd_mbhc_report_plug(mbhc, 1, SND_JACK_UNSUPPORTED); + #else + /* + * calculate impedance detection + * If Zl and Zr > 20k then it is special accessory + * otherwise unsupported cable. + */ + if (mbhc->impedance_detect) { + mbhc->mbhc_cb->compute_impedance(mbhc, + &mbhc->zl, &mbhc->zr); + pr_err("%s: RL %d ohm, RR %d ohm\n", __func__, mbhc->zl, mbhc->zr); + if ((mbhc->zl > 20000) && (mbhc->zr > 20000)) { + pr_debug("%s: special accessory \n", __func__); + /* Toggle switch back */ + if (mbhc->mbhc_cfg->swap_gnd_mic && + mbhc->mbhc_cfg->swap_gnd_mic(mbhc->codec)) { + pr_debug("%s: US_EU gpio present,flip switch again\n" + , __func__); + } + wcd_mbhc_report_plug(mbhc, 1, SND_JACK_HEADSET); + wt_correct_accessory_type = true; + } else { + wcd_mbhc_report_plug(mbhc, 1, SND_JACK_UNSUPPORTED); + } + } + #endif + } else if (plug_type == MBHC_PLUG_TYPE_HEADSET) { if (mbhc->mbhc_cfg->enable_anc_mic_detect) anc_mic_found = wcd_mbhc_detect_anc_plug_type(mbhc); @@ -845,7 +900,8 @@ static void wcd_mbhc_find_plug_and_report(struct wcd_mbhc *mbhc, if (mbhc->mbhc_cfg->detect_extn_cable) { /* High impedance device found. Report as LINEOUT */ wcd_mbhc_report_plug(mbhc, 1, SND_JACK_LINEOUT); - pr_debug("%s: setup mic trigger for further detection\n", + + printk("%s: setup mic trigger for further detection\n", __func__); /* Disable HW FSM and current source */ @@ -886,6 +942,11 @@ static int wcd_check_cross_conn(struct wcd_mbhc *mbhc) return -EINVAL; } + /* If PA is enabled, dont check for cross-connection */ + if (mbhc->mbhc_cb->hph_pa_on_status) + if (mbhc->mbhc_cb->hph_pa_on_status(mbhc->codec)) + return false; + WCD_MBHC_REG_READ(WCD_MBHC_ELECT_SCHMT_ISRC, reg1); /* * Check if there is any cross connection, @@ -1067,9 +1128,9 @@ static void wcd_enable_mbhc_supply(struct wcd_mbhc *mbhc, WCD_MBHC_EN_PULLUP); else wcd_enable_curr_micbias(mbhc, - WCD_MBHC_EN_CS); + WCD_MBHC_EN_MB); } else if (plug_type == MBHC_PLUG_TYPE_HEADPHONE) { - wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_CS); + wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_MB); } else { wcd_enable_curr_micbias(mbhc, WCD_MBHC_EN_NONE); } @@ -1184,6 +1245,7 @@ static void wcd_correct_swch_plug(struct work_struct *work) plug_type = MBHC_PLUG_TYPE_INVALID; } + printk("%s button check: plug_type %d\n", __func__, plug_type); do { cross_conn = wcd_check_cross_conn(mbhc); try++; @@ -1196,7 +1258,8 @@ static void wcd_correct_swch_plug(struct work_struct *work) pr_debug("%s: cross con found, start polling\n", __func__); plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; - pr_debug("%s: Plug found, plug type is %d\n", + + printk("%s cross_conn check: Plug found, plug type is %d\n", __func__, plug_type); goto correct_plug_type; } @@ -1294,7 +1357,8 @@ static void wcd_correct_swch_plug(struct work_struct *work) * This is due to GND/MIC switch didn't * work, Report unsupported plug. */ - pr_debug("%s: switch didnt work\n", + + printk("%s cross_conn check: switch didnt work\n", __func__); plug_type = MBHC_PLUG_TYPE_GND_MIC_SWAP; goto report; @@ -1321,7 +1385,8 @@ static void wcd_correct_swch_plug(struct work_struct *work) */ if (mbhc->mbhc_cfg->swap_gnd_mic && mbhc->mbhc_cfg->swap_gnd_mic(codec)) { - pr_debug("%s: US_EU gpio present,flip switch\n" + + printk("%s cross_conn check: US_EU gpio present,flip switch\n" , __func__); continue; } @@ -1331,12 +1396,16 @@ static void wcd_correct_swch_plug(struct work_struct *work) WCD_MBHC_REG_READ(WCD_MBHC_HPHL_SCHMT_RESULT, hphl_sch); WCD_MBHC_REG_READ(WCD_MBHC_MIC_SCHMT_RESULT, mic_sch); if (hs_comp_res && !(hphl_sch || mic_sch)) { - pr_debug("%s: cable is extension cable\n", __func__); + + printk("%s: cable is extension cable\n", __func__); plug_type = MBHC_PLUG_TYPE_HIGH_HPH; wrk_complete = true; } else { pr_debug("%s: cable might be headset: %d\n", __func__, plug_type); + + printk("%s: hs_comp_res %u, hphl_sch %u, mic_sch %u\n", + __func__, hs_comp_res, hphl_sch, mic_sch); if (!(plug_type == MBHC_PLUG_TYPE_GND_MIC_SWAP)) { plug_type = MBHC_PLUG_TYPE_HEADSET; /* @@ -1350,7 +1419,8 @@ static void wcd_correct_swch_plug(struct work_struct *work) MBHC_PLUG_TYPE_ANC_HEADPHONE)) && !wcd_swch_level_remove(mbhc) && !mbhc->btn_press_intr) { - pr_debug("%s: cable is %sheadset\n", + + printk("%s: cable is %sheadset\n", __func__, ((spl_hs_count == WCD_MBHC_SPL_HS_CNT) ? @@ -1402,6 +1472,14 @@ static void wcd_correct_swch_plug(struct work_struct *work) mbhc->btn_press_intr); WCD_MBHC_RSC_LOCK(mbhc); wcd_mbhc_find_plug_and_report(mbhc, plug_type); + + #ifdef CONFIG_C3B_BQ2560X + if (wt_correct_accessory_type == true) { + plug_type = MBHC_PLUG_TYPE_HEADSET; + wt_correct_accessory_type = false; + } + #endif + WCD_MBHC_RSC_UNLOCK(mbhc); enable_supply: if (mbhc->mbhc_cb->mbhc_micbias_control) @@ -1428,8 +1506,17 @@ static void wcd_correct_swch_plug(struct work_struct *work) wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, true); WCD_MBHC_RSC_UNLOCK(mbhc); } - if (mbhc->mbhc_cb->set_cap_mode) + if (mbhc->mbhc_cb->set_cap_mode) { +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) + + /*bug 225893 ,20161111,add,headset button erro*/ + if (plug_type == MBHC_PLUG_TYPE_HEADSET) { + mbhc->mbhc_cb->set_cap_mode(codec, micbias1, true); + pr_debug("%s:set_cap_mode micbias1=%d, micbias2 = %d==>true , MBHC_PLUG_TYPE_HEADSET\n", __func__, micbias1, micbias2); + } else +#endif mbhc->mbhc_cb->set_cap_mode(codec, micbias1, micbias2); + } if (mbhc->mbhc_cb->hph_pull_down_ctrl) mbhc->mbhc_cb->hph_pull_down_ctrl(codec, true); @@ -1491,7 +1578,8 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_MECH_DETECTION_TYPE, !detection_type); - pr_debug("%s: mbhc->current_plug: %d detection_type: %d\n", __func__, + + printk("%s: mbhc->current_plug: %d detection_type: %d\n", __func__, mbhc->current_plug, detection_type); wcd_cancel_hs_detect_plug(mbhc, &mbhc->correct_plug_swch); @@ -1525,6 +1613,7 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) if (mbhc->mbhc_cb->enable_mb_source) mbhc->mbhc_cb->enable_mb_source(codec, true); mbhc->btn_press_intr = false; + mbhc->is_btn_press = false; wcd_mbhc_detect_plug_type(mbhc); } else if ((mbhc->current_plug != MBHC_PLUG_TYPE_NONE) && !detection_type) { @@ -1542,6 +1631,7 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) mbhc->mbhc_cb->set_cap_mode(codec, micbias1, false); mbhc->btn_press_intr = false; + mbhc->is_btn_press = false; if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADPHONE) { wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, false); @@ -1579,12 +1669,8 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); wcd_mbhc_report_plug(mbhc, 0, SND_JACK_LINEOUT); } else if (mbhc->current_plug == MBHC_PLUG_TYPE_ANC_HEADPHONE) { - mbhc->mbhc_cb->irq_control(codec, - mbhc->intr_ids->mbhc_hs_rem_intr, - false); - mbhc->mbhc_cb->irq_control(codec, - mbhc->intr_ids->mbhc_hs_ins_intr, - false); + wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, false); + wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_DETECTION_TYPE, 0); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_ELECT_SCHMT_ISRC, 0); @@ -1597,6 +1683,9 @@ static void wcd_mbhc_swch_irq_handler(struct wcd_mbhc *mbhc) /* Disable HW FSM */ WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_FSM_EN, 0); WCD_MBHC_REG_UPDATE_BITS(WCD_MBHC_BTN_ISRC_CTL, 0); + wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_INS, false); + wcd_mbhc_hs_elec_irq(mbhc, WCD_MBHC_ELEC_HS_REM, false); + } mbhc->in_swch_irq_handler = false; @@ -1736,6 +1825,7 @@ static irqreturn_t wcd_mbhc_hs_ins_irq(int irq, void *data) mic_trigerred = 0; mbhc->is_extn_cable = true; mbhc->btn_press_intr = false; + mbhc->is_btn_press = false; wcd_mbhc_detect_plug_type(mbhc); WCD_MBHC_RSC_UNLOCK(mbhc); pr_debug("%s: leave\n", __func__); @@ -1869,6 +1959,8 @@ static void wcd_btn_lpress_fn(struct work_struct *work) mbhc = container_of(dwork, struct wcd_mbhc, mbhc_btn_dwork); WCD_MBHC_REG_READ(WCD_MBHC_BTN_RESULT, btn_result); + + printk("%s: current_plug %d, long button press %x\n", __func__, mbhc->current_plug, mbhc->buttons_pressed); if (mbhc->current_plug == MBHC_PLUG_TYPE_HEADSET) { pr_debug("%s: Reporting long button press event, btn_result: %d\n", __func__, btn_result); @@ -1909,18 +2001,17 @@ static irqreturn_t wcd_mbhc_btn_press_handler(int irq, void *data) int mask; unsigned long msec_val; - pr_debug("%s: enter\n", __func__); + + printk("%s: enter, current_plug %d\n", __func__, mbhc->current_plug); complete(&mbhc->btn_press_compl); WCD_MBHC_RSC_LOCK(mbhc); - /* send event to sw intr handler*/ - mbhc->is_btn_press = true; wcd_cancel_btn_work(mbhc); if (wcd_swch_level_remove(mbhc)) { pr_debug("%s: Switch level is low ", __func__); goto done; } - mbhc->btn_press_intr = true; + mbhc->is_btn_press = true; msec_val = jiffies_to_msecs(jiffies - mbhc->jiffies_atreport); pr_debug("%s: msec_val = %ld\n", __func__, msec_val); if (msec_val < MBHC_BUTTON_PRESS_THRESHOLD_MIN) { @@ -1934,12 +2025,15 @@ static irqreturn_t wcd_mbhc_btn_press_handler(int irq, void *data) __func__); goto done; } + mask = wcd_mbhc_get_button_mask(mbhc); + if (mask == SND_JACK_BTN_0) + mbhc->btn_press_intr = true; + if (mbhc->current_plug != MBHC_PLUG_TYPE_HEADSET) { pr_debug("%s: Plug isn't headset, ignore button press\n", __func__); goto done; } - mask = wcd_mbhc_get_button_mask(mbhc); mbhc->buttons_pressed |= mask; mbhc->mbhc_cb->lock_sleep(mbhc, true); if (schedule_delayed_work(&mbhc->mbhc_btn_dwork, @@ -1958,15 +2052,16 @@ static irqreturn_t wcd_mbhc_release_handler(int irq, void *data) struct wcd_mbhc *mbhc = data; int ret; - pr_debug("%s: enter\n", __func__); + + printk("%s: enter, current_plug %d\n", __func__, mbhc->current_plug); WCD_MBHC_RSC_LOCK(mbhc); if (wcd_swch_level_remove(mbhc)) { pr_debug("%s: Switch level is low ", __func__); goto exit; } - if (mbhc->btn_press_intr) { - mbhc->btn_press_intr = false; + if (mbhc->is_btn_press) { + mbhc->is_btn_press = false; } else { pr_debug("%s: This release is for fake btn press\n", __func__); goto exit; @@ -1985,8 +2080,9 @@ static irqreturn_t wcd_mbhc_release_handler(int irq, void *data) if (mbhc->buttons_pressed & WCD_MBHC_JACK_BUTTON_MASK) { ret = wcd_cancel_btn_work(mbhc); if (ret == 0) { - pr_debug("%s: Reporting long button release event\n", - __func__); + + printk("%s: Reporting long button release event %x\n", + __func__, mbhc->buttons_pressed); wcd_mbhc_jack_report(mbhc, &mbhc->button_jack, 0, mbhc->buttons_pressed); } else { @@ -1994,6 +2090,8 @@ static irqreturn_t wcd_mbhc_release_handler(int irq, void *data) pr_debug("%s: Switch irq kicked in, ignore\n", __func__); } else { + + printk("%s: reporting btn press and release %x\n", __func__, mbhc->buttons_pressed); pr_debug("%s: Reporting btn press\n", __func__); wcd_mbhc_jack_report(mbhc, @@ -2298,7 +2396,7 @@ int wcd_mbhc_start(struct wcd_mbhc *mbhc, schedule_delayed_work(&mbhc->mbhc_firmware_dwork, usecs_to_jiffies(FW_READ_TIMEOUT)); else - pr_err("%s: Skipping to read mbhc fw, 0x%p %p\n", + pr_err("%s: Skipping to read mbhc fw, 0x%pK %pK\n", __func__, mbhc->mbhc_fw, mbhc->mbhc_cal); } pr_debug("%s: leave %d\n", __func__, rc); diff --git a/sound/soc/codecs/wcd-mbhc-v2.h b/sound/soc/codecs/wcd-mbhc-v2.h index bc48cbff45769..dce5b26f6ba44 100644 --- a/sound/soc/codecs/wcd-mbhc-v2.h +++ b/sound/soc/codecs/wcd-mbhc-v2.h @@ -527,3 +527,4 @@ static inline void wcd_mbhc_deinit(struct wcd_mbhc *mbhc) #endif #endif /* __WCD_MBHC_V2_H__ */ +extern void msm8x16_wcd_codec_set_headset_state(u32 state); diff --git a/sound/soc/codecs/wcd9320.c b/sound/soc/codecs/wcd9320.c index 20aee359248f5..ff199c14ec7d5 100644 --- a/sound/soc/codecs/wcd9320.c +++ b/sound/soc/codecs/wcd9320.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2014, 2016 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 @@ -1208,6 +1208,14 @@ static int taiko_mad_input_put(struct snd_kcontrol *kcontrol, taiko_mad_input = ucontrol->value.integer.value[0]; + if (taiko_mad_input >= ARRAY_SIZE(taiko_conn_mad_text)) { + dev_err(codec->dev, + "%s: taiko_mad_input = %d out of bounds\n", + __func__, taiko_mad_input); + return -EINVAL; + } + + micb_4_int_reg = taiko->resmgr.reg_addr->micb_4_int_rbias; pr_debug("%s: taiko_mad_input = %s\n", __func__, taiko_conn_mad_text[taiko_mad_input]); @@ -4734,7 +4742,7 @@ static int taiko_set_channel_map(struct snd_soc_dai *dai, struct taiko_priv *taiko = snd_soc_codec_get_drvdata(dai->codec); struct wcd9xxx *core = dev_get_drvdata(dai->codec->dev->parent); if (!tx_slot || !rx_slot) { - pr_err("%s: Invalid tx_slot=%p, rx_slot=%p\n", __func__, + pr_err("%s: Invalid tx_slot=%pK, rx_slot=%pK\n", __func__, tx_slot, rx_slot); return -EINVAL; } diff --git a/sound/soc/codecs/wcd9330.c b/sound/soc/codecs/wcd9330.c index 47d1d38e3133b..7fb10966b1f2b 100644 --- a/sound/soc/codecs/wcd9330.c +++ b/sound/soc/codecs/wcd9330.c @@ -1377,6 +1377,13 @@ static int tomtom_mad_input_put(struct snd_kcontrol *kcontrol, tomtom_mad_input = ucontrol->value.integer.value[0]; micb_4_int_reg = tomtom->resmgr.reg_addr->micb_4_int_rbias; + if (tomtom_mad_input >= ARRAY_SIZE(tomtom_conn_mad_text)) { + dev_err(codec->dev, + "%s: tomtom_mad_input = %d out of bounds\n", + __func__, tomtom_mad_input); + return -EINVAL; + } + pr_debug("%s: tomtom_mad_input = %s\n", __func__, tomtom_conn_mad_text[tomtom_mad_input]); @@ -5314,7 +5321,7 @@ static int tomtom_set_channel_map(struct snd_soc_dai *dai, struct tomtom_priv *tomtom = snd_soc_codec_get_drvdata(dai->codec); struct wcd9xxx *core = dev_get_drvdata(dai->codec->dev->parent); if (!tx_slot || !rx_slot) { - pr_err("%s: Invalid tx_slot=%p, rx_slot=%p\n", + pr_err("%s: Invalid tx_slot=%pK, rx_slot=%pK\n", __func__, tx_slot, rx_slot); return -EINVAL; } @@ -5359,7 +5366,7 @@ static int tomtom_get_channel_map(struct snd_soc_dai *dai, case AIF2_PB: case AIF3_PB: if (!rx_slot || !rx_num) { - pr_err("%s: Invalid rx_slot %p or rx_num %p\n", + pr_err("%s: Invalid rx_slot %pK or rx_num %pK\n", __func__, rx_slot, rx_num); return -EINVAL; } @@ -5378,7 +5385,7 @@ static int tomtom_get_channel_map(struct snd_soc_dai *dai, case AIF4_VIFEED: case AIF4_MAD_TX: if (!tx_slot || !tx_num) { - pr_err("%s: Invalid tx_slot %p or tx_num %p\n", + pr_err("%s: Invalid tx_slot %pK or tx_num %pK\n", __func__, tx_slot, tx_num); return -EINVAL; } @@ -8068,7 +8075,7 @@ static void tomtom_compute_impedance(struct wcd9xxx_mbhc *mbhc, s16 *l, s16 *r, struct tomtom_priv *tomtom; if (!mbhc) { - pr_err("%s: Invalid parameters mbhc = %p\n", + pr_err("%s: Invalid parameters mbhc = %pK\n", __func__, mbhc); return; } @@ -8127,7 +8134,7 @@ static void tomtom_zdet_error_approx(struct wcd9xxx_mbhc *mbhc, uint32_t *zl, const int shift = TOMTOM_ZDET_ERROR_APPROX_SHIFT; if (!zl || !zr || !mbhc) { - pr_err("%s: Invalid parameters zl = %p zr = %p, mbhc = %p\n", + pr_err("%s: Invalid parameters zl = %pK zr = %pK, mbhc = %pK\n", __func__, zl, zr, mbhc); return; } @@ -8444,7 +8451,7 @@ static int tomtom_codec_fll_enable(struct snd_soc_codec *codec, struct wcd9xxx *wcd9xxx; if (!codec || !codec->control_data) { - pr_err("%s: Invalid codec handle, %p\n", + pr_err("%s: Invalid codec handle, %pK\n", __func__, codec); return -EINVAL; } diff --git a/sound/soc/codecs/wcd9335.c b/sound/soc/codecs/wcd9335.c index 00ae80019ac1b..7896f7370ce05 100644 --- a/sound/soc/codecs/wcd9335.c +++ b/sound/soc/codecs/wcd9335.c @@ -7563,6 +7563,13 @@ static int tasha_mad_input_put(struct snd_kcontrol *kcontrol, tasha_mad_input = ucontrol->value.integer.value[0]; + if (tasha_mad_input >= ARRAY_SIZE(tasha_conn_mad_text)) { + dev_err(codec->dev, + "%s: tasha_mad_input = %d out of bounds\n", + __func__, tasha_mad_input); + return -EINVAL; + } + if (!strcmp(tasha_conn_mad_text[tasha_mad_input], "NOTUSED1") || !strcmp(tasha_conn_mad_text[tasha_mad_input], "NOTUSED2") || !strcmp(tasha_conn_mad_text[tasha_mad_input], "NOTUSED3") || @@ -10758,7 +10765,7 @@ static int tasha_get_channel_map(struct snd_soc_dai *dai, case AIF4_PB: case AIF_MIX1_PB: if (!rx_slot || !rx_num) { - pr_err("%s: Invalid rx_slot %p or rx_num %p\n", + pr_err("%s: Invalid rx_slot %pK or rx_num %pK\n", __func__, rx_slot, rx_num); return -EINVAL; } @@ -10777,7 +10784,7 @@ static int tasha_get_channel_map(struct snd_soc_dai *dai, case AIF4_MAD_TX: case AIF4_VIFEED: if (!tx_slot || !tx_num) { - pr_err("%s: Invalid tx_slot %p or tx_num %p\n", + pr_err("%s: Invalid tx_slot %pK or tx_num %pK\n", __func__, tx_slot, tx_num); return -EINVAL; } @@ -10815,7 +10822,7 @@ static int tasha_set_channel_map(struct snd_soc_dai *dai, core = dev_get_drvdata(dai->codec->dev->parent); if (!tx_slot || !rx_slot) { - pr_err("%s: Invalid tx_slot=%p, rx_slot=%p\n", + pr_err("%s: Invalid tx_slot=%pK, rx_slot=%pK\n", __func__, tx_slot, rx_slot); return -EINVAL; } diff --git a/sound/soc/codecs/wcd9xxx-common-v2.c b/sound/soc/codecs/wcd9xxx-common-v2.c index 600062187e07e..b3ced47e9e8eb 100644 --- a/sound/soc/codecs/wcd9xxx-common-v2.c +++ b/sound/soc/codecs/wcd9xxx-common-v2.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (c) 2015-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 @@ -194,7 +194,7 @@ void wcd_clsh_imped_config(struct snd_soc_codec *codec, int imped, bool reset) return; } index = get_impedance_index(imped); - if (index >= ARRAY_SIZE(imped_index)) { + if (index >= (ARRAY_SIZE(imped_index) - 1)) { pr_debug("%s, impedance not in range = %d\n", __func__, imped); return; } diff --git a/sound/soc/codecs/wcd9xxx-mbhc.c b/sound/soc/codecs/wcd9xxx-mbhc.c index b9db3fa79dd8c..b6e6157f80bde 100644 --- a/sound/soc/codecs/wcd9xxx-mbhc.c +++ b/sound/soc/codecs/wcd9xxx-mbhc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2016, 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 @@ -4689,7 +4689,7 @@ int wcd9xxx_mbhc_start(struct wcd9xxx_mbhc *mbhc, schedule_delayed_work(&mbhc->mbhc_firmware_dwork, usecs_to_jiffies(FW_READ_TIMEOUT)); else - pr_debug("%s: Skipping to read mbhc fw, 0x%p %p\n", + pr_debug("%s: Skipping to read mbhc fw, 0x%pK %pK\n", __func__, mbhc->mbhc_fw, mbhc->mbhc_cal); } @@ -5087,7 +5087,7 @@ static int wcd9xxx_remeasure_z_values(struct wcd9xxx_mbhc *mbhc, right = !!(r); dev_dbg(codec->dev, "%s: Remeasuring impedance values\n", __func__); - dev_dbg(codec->dev, "%s: l: %p, r: %p, left=%d, right=%d\n", __func__, + dev_dbg(codec->dev, "%s: l: %pK, r: %pK, left=%d, right=%d\n", __func__, l, r, left, right); /* Remeasure V2 values */ diff --git a/sound/soc/codecs/wcd_cpe_core.c b/sound/soc/codecs/wcd_cpe_core.c index acf6df089a1b0..8209137d6e809 100644 --- a/sound/soc/codecs/wcd_cpe_core.c +++ b/sound/soc/codecs/wcd_cpe_core.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -473,7 +473,7 @@ static int wcd_cpe_load_fw(struct wcd_cpe_core *core, bool load_segment; if (!core || !core->cpe_handle) { - pr_err("%s: Error CPE core %p\n", __func__, + pr_err("%s: Error CPE core %pK\n", __func__, core); return -EINVAL; } @@ -891,14 +891,7 @@ static int wcd_cpe_enable(struct wcd_cpe_core *core, * instead SSR handler will control CPE. */ wcd_cpe_enable_cpe_clks(core, false); - /* - * During BUS_DOWN event, possibly the - * irq driver is under cleanup, do not request - * cleanup of irqs here, rather cleanup irqs - * once BUS_UP event is received. - */ - if (core->ssr_type != WCD_CPE_BUS_DOWN_EVENT) - wcd_cpe_cleanup_irqs(core); + wcd_cpe_cleanup_irqs(core); goto done; } @@ -1149,7 +1142,6 @@ int wcd_cpe_ssr_event(void *core_handle, break; case WCD_CPE_BUS_UP_EVENT: - wcd_cpe_cleanup_irqs(core); wcd_cpe_set_and_complete(core, WCD_CPE_BUS_READY); /* * In case of bus up event ssr_type will be changed @@ -1739,10 +1731,10 @@ static ssize_t fw_name_store(struct wcd_cpe_core *core, if (pos) copy_count = pos - buf; - if (copy_count > WCD_CPE_IMAGE_FNAME_MAX) { + if (copy_count > (WCD_CPE_IMAGE_FNAME_MAX - 1)) { dev_err(core->dev, "%s: Invalid length %d, max allowed %d\n", - __func__, copy_count, WCD_CPE_IMAGE_FNAME_MAX); + __func__, copy_count, WCD_CPE_IMAGE_FNAME_MAX - 1); return -EINVAL; } diff --git a/sound/soc/codecs/wsa881x.c b/sound/soc/codecs/wsa881x.c index 1f3f176526e3b..21be047df08c8 100644 --- a/sound/soc/codecs/wsa881x.c +++ b/sound/soc/codecs/wsa881x.c @@ -905,7 +905,7 @@ int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port, u8 num_port, if (!port || !ch_mask || !ch_rate || (num_port > WSA881X_MAX_SWR_PORTS)) { dev_err(codec->dev, - "%s: Invalid port=%p, ch_mask=%p, ch_rate=%p\n", + "%s: Invalid port=%pK, ch_mask=%pK, ch_rate=%pK\n", __func__, port, ch_mask, ch_rate); return -EINVAL; } diff --git a/sound/soc/msm/AW87319_Audio_M.c b/sound/soc/msm/AW87319_Audio_M.c new file mode 100644 index 0000000000000..f6e24e29cd0b1 --- /dev/null +++ b/sound/soc/msm/AW87319_Audio_M.c @@ -0,0 +1,454 @@ +/************************************************************************** +* AW87319_Audio.c +* +* Create Date : +* +* Modify Date : +* +* Create by : AWINIC Technology CO., LTD +* +* Version : 0.9, 2016/02/15 +**************************************************************************/ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define AW87319_I2C_NAME "AW87319_PA" +#define AW87319_I2C_BUS 0 +#define AW87319_I2C_ADDR 0x58 + +unsigned char AW87319_Audio_Reciver(void); +unsigned char AW87319_Audio_Speaker(void); +unsigned char AW87319_Audio_OFF(void); + + +unsigned char aw87319_hw_on(void); +unsigned char aw87319_hw_off(void); +unsigned char aw87319_sw_on(void); +unsigned char aw87319_sw_off(void); + +static ssize_t aw87319_get_reg(struct device *cd, struct device_attribute *attr, char *buf); +static ssize_t aw87319_set_reg(struct device *cd, struct device_attribute *attr, const char *buf, size_t len); +static ssize_t aw87319_set_swen(struct device *cd, struct device_attribute *attr, const char *buf, size_t len); +static ssize_t aw87319_get_swen(struct device *cd, struct device_attribute *attr, char *buf); +static ssize_t aw87319_set_hwen(struct device *cd, struct device_attribute *attr, const char *buf, size_t len); +static ssize_t aw87319_get_hwen(struct device *cd, struct device_attribute *attr, char *buf); + +static DEVICE_ATTR(reg, 0660, aw87319_get_reg, aw87319_set_reg); +static DEVICE_ATTR(swen, 0660, aw87319_get_swen, aw87319_set_swen); +static DEVICE_ATTR(hwen, 0660, aw87319_get_hwen, aw87319_set_hwen); + +struct i2c_client *aw87319_pa_client; +int aw87319_rst; +struct pinctrl *aw87319ctrl = NULL; +struct pinctrl_state *aw87319_rst_high = NULL; +struct pinctrl_state *aw87319_rst_low = NULL; + + + + + + +char Spk_Pa_Flag[] = " "; + +static void aw87319_pa_pwron(void) +{ + pr_debug("%s enter\n", __func__); + gpio_direction_output(aw87319_rst, false); + msleep(1); + gpio_direction_output(aw87319_rst, true); + msleep(10); +} + +static void aw87319_pa_pwroff(void) +{ + pr_debug("%s enter\n", __func__); + gpio_direction_output(aw87319_rst, false); + msleep(1); +} + + + + + +unsigned char I2C_write_reg(unsigned char addr, unsigned char reg_data) +{ + char ret; + u8 wdbuf[512] = {0}; + + struct i2c_msg msgs[] = { + { + .addr = aw87319_pa_client->addr, + .flags = 0, + .len = 2, + .buf = wdbuf, + }, + }; + + wdbuf[0] = addr; + wdbuf[1] = reg_data; + + if (NULL == aw87319_pa_client) { + pr_err("msg %s aw87319_pa_client is NULL\n", __func__); + return -EPERM; + } + + ret = i2c_transfer(aw87319_pa_client->adapter, msgs, 1); + if (ret < 0) + pr_err("msg %s i2c read error: %d\n", __func__, ret); + + return ret; +} + +unsigned char I2C_read_reg(unsigned char addr) +{ + unsigned char ret; + u8 rdbuf[512] = {0}; + + struct i2c_msg msgs[] = { + { + .addr = aw87319_pa_client->addr, + .flags = 0, + .len = 1, + .buf = rdbuf, + }, + { + .addr = aw87319_pa_client->addr, + .flags = I2C_M_RD, + .len = 1, + .buf = rdbuf, + }, + }; + + rdbuf[0] = addr; + + if (NULL == aw87319_pa_client) { + pr_err("msg %s aw87319_pa_client is NULL\n", __func__); + return -EPERM; + } + + ret = i2c_transfer(aw87319_pa_client->adapter, msgs, 2); + if (ret < 0) + pr_err("msg %s i2c read error: %d\n", __func__, ret); + + return rdbuf[0]; +} + + + + + +unsigned char AW87319_Audio_Reciver(void) +{ + aw87319_hw_on(); + + I2C_write_reg(0x05, 0x03); + + I2C_write_reg(0x01, 0x02); + I2C_write_reg(0x01, 0x06); + + return 0; +} + +unsigned char AW87319_Audio_Speaker(void) +{ + aw87319_hw_on(); + + I2C_write_reg(0x02, 0x28); + I2C_write_reg(0x03, 0x05); + I2C_write_reg(0x04, 0x04); + I2C_write_reg(0x05, 0x0D); + #if defined CONFIG_D1_ROSY + I2C_write_reg(0x06, 0x05); + #else + I2C_write_reg(0x06, 0x03); + #endif + I2C_write_reg(0x07, 0x52); + I2C_write_reg(0x08, 0x28); + I2C_write_reg(0x09, 0x02); + + I2C_write_reg(0x01, 0x03); + I2C_write_reg(0x01, 0x07); + + return 0; +} + + +unsigned char AW87319_Audio_OFF(void) +{ + I2C_write_reg(0x01, 0x00); + aw87319_hw_off(); + + return 0; +} + + + + +unsigned char aw87319_sw_on(void) +{ + unsigned char reg; + reg = I2C_read_reg(0x01); + reg |= 0x04; + I2C_write_reg(0x01, reg); + + return 0; +} + +unsigned char aw87319_sw_off(void) +{ + unsigned char reg; + reg = I2C_read_reg(0x01); + reg &= 0xFB; + I2C_write_reg(0x01, reg); + + return 0; +} + +unsigned char aw87319_hw_on(void) +{ + aw87319_pa_pwron(); + I2C_write_reg(0x64, 0x2C); + + return 0; +} + +unsigned char aw87319_hw_off(void) +{ + aw87319_pa_pwroff(); + + return 0; +} + + + +static ssize_t aw87319_get_reg(struct device *cd, struct device_attribute *attr, char *buf) +{ + unsigned char reg_val; + ssize_t len = 0; + u8 i; + for (i = 0; i < 0x10; i++) { + reg_val = I2C_read_reg(i); + len += snprintf(buf+len, PAGE_SIZE-len, "reg%2X = 0x%2X, ", i, reg_val); + } + + return len; +} + +static ssize_t aw87319_set_reg(struct device *cd, struct device_attribute *attr, const char *buf, size_t len) +{ + unsigned int databuf[2]; + if (2 == sscanf(buf, "%x %x", &databuf[0], &databuf[1])) { + I2C_write_reg(databuf[0], databuf[1]); + } + return len; +} + +static ssize_t aw87319_get_swen(struct device *cd, struct device_attribute *attr, char *buf) +{ + ssize_t len = 0; + len += snprintf(buf+len, PAGE_SIZE-len, "aw87319_sw_on(void)\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "echo 1 > swen\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "aw87319_sw_off(void)\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "echo 0 > swen\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "\n"); + + return len; +} + +static ssize_t aw87319_set_swen(struct device *cd, struct device_attribute *attr, const char *buf, size_t len) +{ + unsigned int databuf[16]; + + sscanf(buf, "%d", &databuf[0]); + if (databuf[0] == 0) { + aw87319_sw_off(); + } else { + aw87319_sw_on(); + } + + return len; +} + +static ssize_t aw87319_get_hwen(struct device *cd, struct device_attribute *attr, char *buf) +{ + ssize_t len = 0; + len += snprintf(buf+len, PAGE_SIZE-len, "aw87319_hw_on(void)\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "echo 1 > hwen\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "aw87319_hw_off(void)\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "echo 0 > hwen\n"); + len += snprintf(buf+len, PAGE_SIZE-len, "\n"); + + return len; +} + +static ssize_t aw87319_set_hwen(struct device *cd, struct device_attribute *attr, const char *buf, size_t len) +{ + unsigned int databuf[16]; + + sscanf(buf, "%d", &databuf[0]); + if (databuf[0] == 0) { + aw87319_hw_off(); + } else { + aw87319_hw_on(); + } + + return len; +} + + +static int aw87319_create_sysfs(struct i2c_client *client) +{ + int err; + struct device *dev = &(client->dev); + + err = device_create_file(dev, &dev_attr_reg); + err = device_create_file(dev, &dev_attr_swen); + err = device_create_file(dev, &dev_attr_hwen); + return err; +} + + + + + +static int aw87319_i2c_probe(struct i2c_client *client, const struct i2c_device_id *id) +{ + unsigned char reg_value; + unsigned char cnt = 5; + int err = 0; + + pr_debug("%s Enter\n", __func__); + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { + err = -ENODEV; + goto exit_check_functionality_failed; + } + + + aw87319_rst = of_get_named_gpio(client->dev.of_node, "qcom,ext_pa_spk_aw87319_rst", 0); + if (aw87319_rst < 0) { + err = -ENODEV; + goto exit_gpio_get_failed; + } + if (gpio_request_one(aw87319_rst, GPIOF_DIR_OUT , "spk_enable")) { + pr_err("%s: request spk_pa_gpio fail!\n", __func__); + goto exit_gpio_request_failed; + } + + pr_debug("%s: aw87319_rst = %d \n", __func__, aw87319_rst); + aw87319_pa_client = client; + + aw87319_hw_on(); + msleep(10); + + while (cnt > 0) { + I2C_write_reg(0x64, 0x2C); + reg_value = I2C_read_reg(0x00); + printk("AW87319 CHIPID=0x%2x\n", reg_value); + if (reg_value == 0x9B) { + break; + } + cnt--; + msleep(10); + } + if (!cnt) { + err = -ENODEV; + aw87319_hw_off(); + strncpy(Spk_Pa_Flag, "S88537A12", 9); + pr_err("%s:can not find AW87319, board is S88537A12\n!", __func__); + goto exit_create_singlethread; + } + + aw87319_create_sysfs(client); + + aw87319_hw_off(); + + return 0; + +exit_create_singlethread: + aw87319_pa_client = NULL; +exit_gpio_request_failed: + gpio_free(aw87319_rst); +exit_gpio_get_failed: +exit_check_functionality_failed: + return err; +} + +static int aw87319_i2c_remove(struct i2c_client *client) +{ + aw87319_pa_client = NULL; + return 0; +} + +static const struct i2c_device_id aw87319_i2c_id[] = { + { AW87319_I2C_NAME, 0 }, + { } +}; + + +static const struct of_device_id extpa_of_match[] = { + {.compatible = "awinic,aw87319_pa"}, + {}, +}; + +static struct i2c_driver aw87319_i2c_driver = { + .driver = { + .owner = THIS_MODULE, + .name = AW87319_I2C_NAME, + .of_match_table = extpa_of_match, +}, + .probe = aw87319_i2c_probe, + .remove = aw87319_i2c_remove, + .id_table = aw87319_i2c_id, +}; + +static int __init aw87319_pa_init(void) +{ + int ret; + printk("%s Enter\n", __func__); + + ret = i2c_add_driver(&aw87319_i2c_driver); + if (ret) { + printk("****[%s] Unable to register driver (%d)\n", __func__, ret); + return ret; + } + return 0; +} + +static void __exit aw87319_pa_exit(void) +{ + printk("%s Enter\n", __func__); + i2c_del_driver(&aw87319_i2c_driver); +} + + +subsys_initcall(aw87319_pa_init); +module_exit(aw87319_pa_exit); + +MODULE_AUTHOR(""); +MODULE_DESCRIPTION("AWINIC AW87319 PA driver"); +MODULE_LICENSE("GPL"); + diff --git a/sound/soc/msm/Kconfig b/sound/soc/msm/Kconfig index 640b926861337..c0de03f346a18 100644 --- a/sound/soc/msm/Kconfig +++ b/sound/soc/msm/Kconfig @@ -250,6 +250,9 @@ config SND_SOC_MSM8909 the machine drivers and the corresponding DAI-links. +config SND_SOC_AW87319 + tristate "Build AWINIC AW87319 ASoc Speaker PA" + config SND_SOC_MDM9640 tristate "SoC Machine driver for MDM9640 boards" depends on ARCH_MDM9640 diff --git a/sound/soc/msm/Makefile b/sound/soc/msm/Makefile index 163f985fbb044..afa2435144fe4 100644 --- a/sound/soc/msm/Makefile +++ b/sound/soc/msm/Makefile @@ -41,6 +41,9 @@ obj-$(CONFIG_SND_SOC_MDM9607) += snd-soc-mdm9607.o snd-soc-msm8909-objs := msm8952.o msm-audio-pinctrl.o obj-$(CONFIG_SND_SOC_MSM8909) += snd-soc-msm8909.o +#for AW87319 sound Speaker PA +obj-$(CONFIG_SND_SOC_AW87319) += AW87319_Audio_M.o + # for MDM9640 sound card driver snd-soc-mdm9640-objs := mdm9640.o obj-$(CONFIG_SND_SOC_MDM9640) += snd-soc-mdm9640.o \ No newline at end of file diff --git a/sound/soc/msm/apq8084.c b/sound/soc/msm/apq8084.c index 1501ba7006bb5..948e5586e5f23 100644 --- a/sound/soc/msm/apq8084.c +++ b/sound/soc/msm/apq8084.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -622,7 +622,7 @@ static int apq8084_get_spk(struct snd_kcontrol *kcontrol, static int apq8084_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); if (apq8084_spk_control == ucontrol->value.integer.value[0]) diff --git a/sound/soc/msm/mdm9607.c b/sound/soc/msm/mdm9607.c index 16142a9d252da..effef4d755647 100644 --- a/sound/soc/msm/mdm9607.c +++ b/sound/soc/msm/mdm9607.c @@ -774,7 +774,7 @@ static void mdm_ext_control(struct snd_soc_codec *codec) static int mdm_mi2s_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); diff --git a/sound/soc/msm/mdm9640.c b/sound/soc/msm/mdm9640.c index 172addd36037d..9ba745e0aed21 100644 --- a/sound/soc/msm/mdm9640.c +++ b/sound/soc/msm/mdm9640.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -732,7 +732,7 @@ static void mdm_ext_control(struct snd_soc_codec *codec) static int mdm_mi2s_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); diff --git a/sound/soc/msm/mdmcalifornium.c b/sound/soc/msm/mdmcalifornium.c index 1b150a83759a3..783c21e40c0be 100644 --- a/sound/soc/msm/mdmcalifornium.c +++ b/sound/soc/msm/mdmcalifornium.c @@ -817,7 +817,7 @@ static void mdm_ext_control(struct snd_soc_codec *codec) static int mdm_mi2s_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); diff --git a/sound/soc/msm/msm-cpe-lsm.c b/sound/soc/msm/msm-cpe-lsm.c index 9f957e530817a..8e867ac62d1ed 100644 --- a/sound/soc/msm/msm-cpe-lsm.c +++ b/sound/soc/msm/msm-cpe-lsm.c @@ -506,7 +506,7 @@ static int msm_cpe_lab_buf_alloc(struct snd_pcm_substream *substream, pcm_buf[count].mem = pcm_buf[0].mem + (count * bufsz); pcm_buf[count].phys = pcm_buf[0].phys + (count * bufsz); dev_dbg(rtd->dev, - "%s: pcm_buf[%d].mem %p pcm_buf[%d].phys %pa\n", + "%s: pcm_buf[%d].mem %pK pcm_buf[%d].phys %pK\n", __func__, count, (void *)pcm_buf[count].mem, count, &(pcm_buf[count].phys)); @@ -733,7 +733,7 @@ static int msm_cpe_lab_thread(void *data) cur_buf = &lab_d->pcm_buf[buf_count % prd_cnt]; next_buf = &lab_d->pcm_buf[(buf_count + 2) % prd_cnt]; dev_dbg(rtd->dev, - "%s: Cur buf.mem = %p Next Buf.mem = %p\n" + "%s: Cur buf.mem = %pK Next Buf.mem = %pK\n" " buf count = 0x%x\n", __func__, cur_buf->mem, next_buf->mem, buf_count); } else { @@ -1190,13 +1190,6 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, dev_dbg(rtd->dev, "%s: %s\n", __func__, "SNDRV_LSM_REG_SND_MODEL_V2"); - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid argument to ioctl %s\n", - __func__, - "SNDRV_LSM_REG_SND_MODEL_V2"); - return -EINVAL; - } memcpy(&snd_model, arg, sizeof(struct snd_lsm_sound_model_v2)); @@ -1219,6 +1212,7 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: No memory for sound model\n", __func__); kfree(session->conf_levels); + session->conf_levels = NULL; return -ENOMEM; } session->snd_model_size = snd_model.data_size; @@ -1230,6 +1224,8 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, __func__); kfree(session->conf_levels); kfree(session->snd_model_data); + session->conf_levels = NULL; + session->snd_model_data = NULL; return -EFAULT; } @@ -1241,6 +1237,8 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, __func__, rc); kfree(session->snd_model_data); kfree(session->conf_levels); + session->snd_model_data = NULL; + session->conf_levels = NULL; return rc; } @@ -1254,6 +1252,8 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, lsm_ops->lsm_shmem_dealloc(cpe->core_handle, session); kfree(session->snd_model_data); kfree(session->conf_levels); + session->snd_model_data = NULL; + session->conf_levels = NULL; return rc; } @@ -1332,13 +1332,6 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, dev_dbg(rtd->dev, "%s: %s\n", __func__, "SNDRV_LSM_EVENT_STATUS"); - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid argument to ioctl %s\n", - __func__, - "SNDRV_LSM_EVENT_STATUS"); - return -EINVAL; - } user = arg; @@ -1441,12 +1434,6 @@ static int msm_cpe_lsm_ioctl_shared(struct snd_pcm_substream *substream, break; case SNDRV_LSM_SET_PARAMS: - if (!arg) { - dev_err(rtd->dev, - "%s: %s Invalid argument\n", - __func__, "SNDRV_LSM_SET_PARAMS"); - return -EINVAL; - } memcpy(&det_params, arg, sizeof(det_params)); if (det_params.num_confidence_levels <= 0) { @@ -1548,7 +1535,7 @@ static int msm_cpe_lsm_lab_start(struct snd_pcm_substream *substream, int rc; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", __func__, substream); return -EINVAL; } @@ -1638,7 +1625,7 @@ static bool msm_cpe_lsm_is_valid_stream(struct snd_pcm_substream *substream, struct wcd_cpe_lsm_ops *lsm_ops; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", func, substream); return false; } @@ -1882,6 +1869,13 @@ static int msm_cpe_lsm_reg_model(struct snd_pcm_substream *substream, lsm_ops->lsm_get_snd_model_offset(cpe->core_handle, session, &offset); + /* Check if 'p_info->param_size + offset' crosses U32_MAX. */ + if (p_info->param_size > U32_MAX - offset) { + dev_err(rtd->dev, + "%s: Invalid param_size %d\n", + __func__, p_info->param_size); + return -EINVAL; + } session->snd_model_size = p_info->param_size + offset; session->snd_model_data = vzalloc(session->snd_model_size); @@ -2079,7 +2073,7 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, struct wcd_cpe_lsm_ops *lsm_ops; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", __func__, substream); return -EINVAL; } @@ -2116,7 +2110,8 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "LSM_REG_SND_MODEL_V2"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&snd_model, (void *)arg, @@ -2196,7 +2191,8 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "SNDRV_LSM_SET_PARAMS"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&det_params, (void *) arg, @@ -2223,14 +2219,16 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if not using topology\n", __func__, "SET_MODULE_PARAMS"); - return -EINVAL; + err = -EINVAL; + goto done; } if (!arg) { dev_err(rtd->dev, "%s: %s: No Param data to set\n", __func__, "SET_MODULE_PARAMS"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&p_data, arg, @@ -2238,7 +2236,8 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: copy_from_user failed, size = %zd\n", __func__, "p_data", sizeof(p_data)); - return -EFAULT; + err = -EFAULT; + goto done; } if (p_data.num_params > LSM_PARAMS_MAX) { @@ -2246,7 +2245,8 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: Invalid num_params %d\n", __func__, "SET_MODULE_PARAMS", p_data.num_params); - return -EINVAL; + err = -EINVAL; + goto done; } p_size = p_data.num_params * @@ -2257,12 +2257,15 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: Invalid size %zd\n", __func__, "SET_MODULE_PARAMS", p_size); - return -EFAULT; + err = -EFAULT; + goto done; } params = kzalloc(p_size, GFP_KERNEL); - if (!params) - return -ENOMEM; + if (!params) { + err = -ENOMEM; + goto done; + } if (copy_from_user(params, p_data.params, p_data.data_size)) { @@ -2270,7 +2273,8 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: copy_from_user failed, size = %d\n", __func__, "params", p_data.data_size); kfree(params); - return -EFAULT; + err = -EFAULT; + goto done; } err = msm_cpe_lsm_process_params(substream, &p_data, params); @@ -2293,12 +2297,6 @@ static int msm_cpe_lsm_ioctl(struct snd_pcm_substream *substream, } #ifdef CONFIG_COMPAT -struct snd_lsm_event_status32 { - u16 status; - u16 payload_size; - u8 payload[0]; -}; - struct snd_lsm_sound_model_v2_32 { compat_uptr_t data; compat_uptr_t confidence_level; @@ -2330,8 +2328,6 @@ struct snd_lsm_module_params_32 { }; enum { - SNDRV_LSM_EVENT_STATUS32 = - _IOW('U', 0x02, struct snd_lsm_event_status32), SNDRV_LSM_REG_SND_MODEL_V2_32 = _IOW('U', 0x07, struct snd_lsm_sound_model_v2_32), SNDRV_LSM_SET_PARAMS32 = @@ -2351,7 +2347,7 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, struct wcd_cpe_lsm_ops *lsm_ops; if (!substream || !substream->private_data) { - pr_err("%s: invalid substream (%p)\n", + pr_err("%s: invalid substream (%pK)\n", __func__, substream); return -EINVAL; } @@ -2389,7 +2385,8 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "LSM_REG_SND_MODEL_V2_32"); - return -EINVAL; + err = -EINVAL; + goto done; } dev_dbg(rtd->dev, @@ -2425,7 +2422,7 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, err); } break; - case SNDRV_LSM_EVENT_STATUS32: { + case SNDRV_LSM_EVENT_STATUS: { struct snd_lsm_event_status *event_status = NULL; struct snd_lsm_event_status u_event_status32; struct snd_lsm_event_status *udata_32 = NULL; @@ -2467,7 +2464,6 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, } else { event_status->payload_size = u_event_status32.payload_size; - cmd = SNDRV_LSM_EVENT_STATUS; err = msm_cpe_lsm_ioctl_shared(substream, cmd, event_status); if (err) @@ -2520,7 +2516,9 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "SNDRV_LSM_SET_PARAMS32"); - return -EINVAL; + + err = -EINVAL; + goto done; } if (copy_from_user(&det_params32, arg, @@ -2564,14 +2562,8 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if not using topology\n", __func__, "SET_MODULE_PARAMS_32"); - return -EINVAL; - } - - if (!arg) { - dev_err(rtd->dev, - "%s: %s: No Param data to set\n", - __func__, "SET_MODULE_PARAMS_32"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&p_data_32, arg, @@ -2580,7 +2572,8 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: copy_from_user failed, size = %zd\n", __func__, "SET_MODULE_PARAMS_32", sizeof(p_data_32)); - return -EFAULT; + err = -EFAULT; + goto done; } p_data.params = compat_ptr(p_data_32.params); @@ -2592,7 +2585,8 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: Invalid num_params %d\n", __func__, "SET_MODULE_PARAMS_32", p_data.num_params); - return -EINVAL; + err = -EINVAL; + goto done; } if (p_data.data_size != @@ -2601,21 +2595,25 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: Invalid size %d\n", __func__, "SET_MODULE_PARAMS_32", p_data.data_size); - return -EINVAL; + err = -EINVAL; + goto done; } p_size = sizeof(struct lsm_params_info_32) * p_data.num_params; params32 = kzalloc(p_size, GFP_KERNEL); - if (!params32) - return -ENOMEM; + if (!params32) { + err = -ENOMEM; + goto done; + } p_size = sizeof(struct lsm_params_info) * p_data.num_params; params = kzalloc(p_size, GFP_KERNEL); if (!params) { kfree(params32); - return -ENOMEM; + err = -ENOMEM; + goto done; } if (copy_from_user(params32, p_data.params, @@ -2625,7 +2623,8 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, __func__, "params32", p_data.data_size); kfree(params32); kfree(params); - return -EFAULT; + err = -EFAULT; + goto done; } p_info_32 = (struct lsm_params_info_32 *) params32; @@ -2651,6 +2650,19 @@ static int msm_cpe_lsm_ioctl_compat(struct snd_pcm_substream *substream, kfree(params32); break; } + case SNDRV_LSM_REG_SND_MODEL_V2: + case SNDRV_LSM_SET_PARAMS: + case SNDRV_LSM_SET_MODULE_PARAMS: + /* + * In ideal cases, the compat_ioctl should never be called + * with the above unlocked ioctl commands. Print error + * and return error if it does. + */ + dev_err(rtd->dev, + "%s: Invalid cmd for compat_ioctl\n", + __func__); + err = -EINVAL; + break; default: err = msm_cpe_lsm_ioctl_shared(substream, cmd, arg); break; @@ -3001,7 +3013,7 @@ static int msm_cpe_lsm_copy(struct snd_pcm_substream *substream, int a, if (lab_d->buf_idx >= (lsm_d->hw_params.period_count)) lab_d->buf_idx = 0; pcm_buf = (lab_d->pcm_buf[lab_d->buf_idx].mem); - pr_debug("%s: Buf IDX = 0x%x pcm_buf %p\n", + pr_debug("%s: Buf IDX = 0x%x pcm_buf %pK\n", __func__, lab_d->buf_idx, pcm_buf); if (pcm_buf) { if (copy_to_user(buf, pcm_buf, fbytes)) { diff --git a/sound/soc/msm/msm8952-slimbus.c b/sound/soc/msm/msm8952-slimbus.c index ade7046ad8f17..5adca82f7744e 100644 --- a/sound/soc/msm/msm8952-slimbus.c +++ b/sound/soc/msm/msm8952-slimbus.c @@ -408,7 +408,7 @@ static int msm8952_get_spk(struct snd_kcontrol *kcontrol, static int msm8952_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); if (msm8952_spk_control == ucontrol->value.integer.value[0]) diff --git a/sound/soc/msm/msm8952.c b/sound/soc/msm/msm8952.c index f4a96da417a8a..dce8368df463c 100644 --- a/sound/soc/msm/msm8952.c +++ b/sound/soc/msm/msm8952.c @@ -1,4 +1,5 @@ /* Copyright (c) 2015-2016, The Linux Foundation. All rights reserved. + * Copyright (C) 2018 XiaoMi, 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 and @@ -25,6 +26,7 @@ #include #include #include +#include #include #include "qdsp6v2/msm-pcm-routing-v2.h" #include "msm-audio-pinctrl.h" @@ -47,11 +49,26 @@ #define QUIN_MI2S_ID (1 << 4) #define DEFAULT_MCLK_RATE 9600000 - +#if defined(CONFIG_C3N_SMB358) +#define AW8736_MODE 5 +#elif defined(CONFIG_C3B_BQ2560X) +#define AW8736_MODE 3 +#else +#define AW8738_MODE 5 +#endif #define WCD_MBHC_DEF_RLOADS 5 #define MAX_WSA_CODEC_NAME_LENGTH 80 #define MSM_DT_MAX_PROP_SIZE 80 +#define EXT_CLASS_D_EN_DELAY 13000 +#define EXT_CLASS_D_DIS_DELAY 3000 +#define EXT_CLASS_D_DELAY_DELTA 2000 + +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) || defined(CONFIG_D1_ROSY) +#else +#define A13_AW87319_SPK_PA 1 +#define A12_AW8738_SPK_PA 2 +#endif enum btsco_rates { RATE_8KHZ_ID, RATE_16KHZ_ID, @@ -72,6 +89,17 @@ static atomic_t quat_mi2s_clk_ref; static atomic_t quin_mi2s_clk_ref; static atomic_t auxpcm_mi2s_clk_ref; +static int headset_gpio; +static int spk_pa_gpio; +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) || defined(CONFIG_D1_ROSY) +#else +static int Spk_Pa_Id; + +static struct delayed_work lineout_amp_enable; +static struct delayed_work lineout_amp_dualmode; +static struct delayed_work lineout_hs_sw_enable; +#endif + static int msm8952_enable_dig_cdc_clk(struct snd_soc_codec *codec, int enable, bool dapm); static bool msm8952_swap_gnd_mic(struct snd_soc_codec *codec); @@ -80,6 +108,10 @@ static int msm8952_mclk_event(struct snd_soc_dapm_widget *w, static int msm8952_wsa_switch_event(struct snd_soc_dapm_widget *w, struct snd_kcontrol *kcontrol, int event); +#if defined (CONFIG_D1_ROSY) +extern unsigned char AW87319_Audio_Speaker(void); +extern unsigned char AW87319_Audio_OFF(void); +#endif /* * Android L spec * Need to report LINEIN @@ -93,9 +125,9 @@ static struct wcd_mbhc_config mbhc_cfg = { .swap_gnd_mic = NULL, .hs_ext_micbias = false, .key_code[0] = KEY_MEDIA, - .key_code[1] = KEY_VOICECOMMAND, - .key_code[2] = KEY_VOLUMEUP, - .key_code[3] = KEY_VOLUMEDOWN, + .key_code[1] = KEY_PREVIOUSSONG_NEW, + .key_code[2] = KEY_NEXTSONG_NEW, + .key_code[3] = KEY_VOICECOMMAND, .key_code[4] = 0, .key_code[5] = 0, .key_code[6] = 0, @@ -168,6 +200,11 @@ static const char *const btsco_rate_text[] = {"BTSCO_RATE_8KHZ", static const char *const proxy_rx_ch_text[] = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight"}; static const char *const vi_feed_ch_text[] = {"One", "Two"}; +static const char *const lineout_text[] = {"DISABLE", "ENABLE", "DUALMODE"}; +#if defined(CONFIG_D1_ROSY) +#else +static const char *const hs_amp_text[] = {"DISABLE", "ENABLE"}; +#endif static char const *mi2s_rx_sample_rate_text[] = {"KHZ_48", "KHZ_96", "KHZ_192"}; @@ -254,6 +291,11 @@ int is_ext_spk_gpio_support(struct platform_device *pdev, pr_err("%s: Invalid external speaker gpio: %d", __func__, pdata->spk_ext_pa_gpio); return -EINVAL; + + #ifdef CONFIG_C3B_BQ2560X + if (gpio_request_one(pdata->spk_ext_pa_gpio, GPIOF_DIR_OUT , "spk_enable")) + dev_err(&pdev->dev, "%s: request spk_ext_pa_gpio fail!\n", __func__); + #endif } } return 0; @@ -261,6 +303,8 @@ int is_ext_spk_gpio_support(struct platform_device *pdev, static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable) { + #if defined(CONFIG_D1_ROSY) + #else struct snd_soc_card *card = codec->component.card; struct msm8916_asoc_mach_data *pdata = snd_soc_card_get_drvdata(card); int ret; @@ -270,11 +314,21 @@ static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable) pdata->spk_ext_pa_gpio); return false; } - + #endif pr_debug("%s: %s external speaker PA\n", __func__, enable ? "Enable" : "Disable"); if (enable) { + + #ifdef CONFIG_C3B_BQ2560X + pr_debug("%s spk pa mode %d\n", __func__, AW8736_MODE); + for (ret = 0; ret < AW8736_MODE; ret++) { + gpio_direction_output(pdata->spk_ext_pa_gpio, false); + gpio_direction_output(pdata->spk_ext_pa_gpio, true); + } + #elif defined(CONFIG_D1_ROSY) + AW87319_Audio_Speaker(); + #else ret = msm_gpioset_activate(CLIENT_WCD_INT, "ext_spk_gpio"); if (ret) { pr_err("%s: gpio set cannot be de-activated %s\n", @@ -282,7 +336,17 @@ static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable) return ret; } gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, enable); + #endif } else { + + #ifdef CONFIG_C3B_BQ2560X + gpio_direction_output(pdata->spk_ext_pa_gpio, false); + /* time takes disable the external power amplifier */ + usleep_range(EXT_CLASS_D_DIS_DELAY, + EXT_CLASS_D_DIS_DELAY + EXT_CLASS_D_DELAY_DELTA); + #elif defined(CONFIG_D1_ROSY) + AW87319_Audio_OFF(); + #else gpio_set_value_cansleep(pdata->spk_ext_pa_gpio, enable); ret = msm_gpioset_suspend(CLIENT_WCD_INT, "ext_spk_gpio"); if (ret) { @@ -290,6 +354,7 @@ static int enable_spk_ext_pa(struct snd_soc_codec *codec, int enable) __func__, "ext_spk_gpio"); return ret; } + #endif } return 0; } @@ -550,7 +615,7 @@ static bool is_mi2s_rx_port(int port_id) static uint32_t get_mi2s_rx_clk_val(int port_id) { - uint32_t clk_val; + uint32_t clk_val = 0; /* * Derive clock value based on sample rate, bits per sample and @@ -715,6 +780,217 @@ static int msm8952_enable_dig_cdc_clk(struct snd_soc_codec *codec, return ret; } +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) +static void msm8952_ext_hs_control(u32 enable) +{ + gpio_direction_output(headset_gpio, enable); + pr_err("%s: %s [hjf] headset 111PAs.\n", __func__, + enable ? "Enable" : "Disable"); +} +static void msm8952_ext_spk_control(u32 enable) +{ + int i = 0; + + if (enable) { + /* Open external audio PA device */ + for (i = 0; i < AW8736_MODE; i++) { + gpio_direction_output(spk_pa_gpio, false); + gpio_direction_output(spk_pa_gpio, true); + } + usleep_range(EXT_CLASS_D_EN_DELAY, + EXT_CLASS_D_EN_DELAY + EXT_CLASS_D_DELAY_DELTA); + } else { + gpio_direction_output(spk_pa_gpio, false); + /* time takes disable the external power amplifier */ + usleep_range(EXT_CLASS_D_DIS_DELAY, + EXT_CLASS_D_DIS_DELAY + EXT_CLASS_D_DELAY_DELTA); + } + + pr_err("%s: %s [hjf] external speaker 222PAs.\n", __func__, + enable ? "Enable" : "Disable"); +} +static void msm8x16_ext_spk_delayed_dualmode(u32 enable) +{ + int i = 0; + + /* Open the headset device */ + gpio_direction_output(headset_gpio, true); + usleep_range(EXT_CLASS_D_EN_DELAY, + EXT_CLASS_D_EN_DELAY + EXT_CLASS_D_DELAY_DELTA); + + for (i = 0; i < AW8736_MODE; i++) { + gpio_direction_output(spk_pa_gpio, false); + gpio_direction_output(spk_pa_gpio, true); + } + usleep_range(EXT_CLASS_D_EN_DELAY, + EXT_CLASS_D_EN_DELAY + EXT_CLASS_D_DELAY_DELTA); + + pr_debug("%s: Enable external speaker PAs dualmode.\n", __func__); +} +#elif defined(CONFIG_D1_ROSY) +static void msm8952_ext_spk_control(u32 enable) +{ + if (enable) { + AW87319_Audio_Speaker(); + } else { + AW87319_Audio_OFF(); + } + + pr_debug("%s: external speaker PAs %s.\n", __func__, enable ? "Enable" : "Disable"); +} +#else +static void msm8952_ext_hs_control(u32 enable) +{ + gpio_direction_output(headset_gpio, enable); + pr_err("%s: %s headset 111PAs.\n", __func__, + enable ? "Enable" : "Disable"); +} + +static void msm8952_ext_hs_delay_enable(struct work_struct *work) +{ + gpio_direction_output(headset_gpio, true); + pr_err("%s: headset 111PAs.\n", __func__); +} + +extern unsigned char AW87319_Audio_Speaker(void); +extern unsigned char AW87319_Audio_OFF(void); +static void AW8738_Audio_Ctl(bool enable) +{ + int i = 0; + if (enable) { + /* Open external audio PA device */ + for (i = 0; i < AW8738_MODE; i++) { + gpio_direction_output(spk_pa_gpio, false); + gpio_direction_output(spk_pa_gpio, true); + } + usleep_range(EXT_CLASS_D_EN_DELAY, + EXT_CLASS_D_EN_DELAY + EXT_CLASS_D_DELAY_DELTA); + } else { + /* Disable external audio PA device */ + gpio_direction_output(spk_pa_gpio, false); + usleep_range(EXT_CLASS_D_DIS_DELAY, + EXT_CLASS_D_DIS_DELAY + EXT_CLASS_D_DELAY_DELTA); + } + +} +static void msm8952_ext_spk_control(u32 enable) +{ + if (enable) { + /* Open external audio PA device */ + if (A13_AW87319_SPK_PA == Spk_Pa_Id) { + AW87319_Audio_Speaker(); + } else if (A12_AW8738_SPK_PA == Spk_Pa_Id) { + AW8738_Audio_Ctl(enable); + } + } else { + /* Disable external audio PA device */ + if (A13_AW87319_SPK_PA == Spk_Pa_Id) { + AW87319_Audio_OFF(); + } else if (A12_AW8738_SPK_PA == Spk_Pa_Id) { + AW8738_Audio_Ctl(enable); + } + } + pr_debug("%s: external speaker PAs %s.\n", __func__, enable ? "Enable" : "Disable"); +} + +static void msm8952_ext_spk__delayed_enable(struct work_struct *work) +{ + if (A13_AW87319_SPK_PA == Spk_Pa_Id) + AW87319_Audio_Speaker(); + else if (A12_AW8738_SPK_PA == Spk_Pa_Id) + AW8738_Audio_Ctl(true); + + pr_debug("%s: external speaker enable.\n", __func__); +} + +static void msm8x16_ext_spk_delayed_dualmode(struct work_struct *work) +{ + /* Open the headset device */ + gpio_direction_output(headset_gpio, true); + usleep_range(EXT_CLASS_D_EN_DELAY, EXT_CLASS_D_EN_DELAY + EXT_CLASS_D_DELAY_DELTA); + + /* Open the speaker device */ + if (A13_AW87319_SPK_PA == Spk_Pa_Id) + AW87319_Audio_Speaker(); + else if (A12_AW8738_SPK_PA == Spk_Pa_Id) + AW8738_Audio_Ctl(true); + + pr_debug("%s: Enable external speaker PAs dualmode.\n", __func__); +} +#endif +#if defined(CONFIG_D1_ROSY) +#else +static int headset_status_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_debug("%s: get headset_status_get\n", __func__); + return 0; +} + +static int headset_status_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int state = 0; + state = ucontrol->value.integer.value[0]; + pr_debug("%s: set external speaker PA mode:%d\n", __func__, state); + + switch (state) { + case 1: + #if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) + msm8952_ext_hs_control(1); + #else + schedule_delayed_work(&lineout_hs_sw_enable, msecs_to_jiffies(50)); + #endif + break; + case 0: + msm8952_ext_hs_control(0); + break; + default: + pr_err("%s: Unexpected input value\n", __func__); + break; + } + return 0; +} +#endif +static int lineout_status_get(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + pr_debug("%s: get lineout_status_get\n", __func__); + return 0; +} +static int lineout_status_put(struct snd_kcontrol *kcontrol, + struct snd_ctl_elem_value *ucontrol) +{ + int state = 0; + state = ucontrol->value.integer.value[0]; + pr_debug("%s: external speaker PA mode:%d\n", __func__, state); + + switch (state) { + case 1: + #if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) || defined(CONFIG_D1_ROSY) + msm8952_ext_spk_control(1); + #else + schedule_delayed_work(&lineout_amp_enable, msecs_to_jiffies(50)); + #endif + break; + case 0: + msm8952_ext_spk_control(0); + break; + case 2: + #if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) + msm8x16_ext_spk_delayed_dualmode(1); + #elif defined(CONFIG_D1_ROSY) + msm8952_ext_spk_control(1); + #else + schedule_delayed_work(&lineout_amp_dualmode, msecs_to_jiffies(50)); + #endif + break; + default: + pr_err("%s: Unexpected input value\n", __func__); + break; + } + return 0; +} static int msm_btsco_rate_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { @@ -1001,6 +1277,11 @@ static const struct soc_enum msm_snd_enum[] = { vi_feed_ch_text), SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(mi2s_rx_sample_rate_text), mi2s_rx_sample_rate_text), + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(lineout_text), lineout_text), + #if defined(CONFIG_D1_ROSY) + #else + SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(hs_amp_text), hs_amp_text), + #endif }; static const struct snd_kcontrol_new msm_snd_controls[] = { @@ -1018,6 +1299,13 @@ static const struct snd_kcontrol_new msm_snd_controls[] = { msm_proxy_rx_ch_get, msm_proxy_rx_ch_put), SOC_ENUM_EXT("VI_FEED_TX Channels", msm_snd_enum[5], msm_vi_feed_tx_ch_get, msm_vi_feed_tx_ch_put), + SOC_ENUM_EXT("Lineout_1 amp", msm_snd_enum[7], + lineout_status_get, lineout_status_put), + #if defined(CONFIG_D1_ROSY) + #else + SOC_ENUM_EXT("headset amp", msm_snd_enum[8], + headset_status_get, headset_status_put), + #endif SOC_ENUM_EXT("MI2S_RX SampleRate", msm_snd_enum[6], mi2s_rx_sample_rate_get, mi2s_rx_sample_rate_put), }; @@ -1167,6 +1455,11 @@ static int msm_mi2s_snd_startup(struct snd_pcm_substream *substream) pr_debug("%s(): substream = %s stream = %d\n", __func__, substream->name, substream->stream); + if (!q6core_is_adsp_ready()) { + pr_err("%s(): adsp not ready\n", __func__); + return -EINVAL; + } + /* * configure the slave select to * invalid state for internal codec @@ -1257,6 +1550,11 @@ static int msm_prim_auxpcm_startup(struct snd_pcm_substream *substream) pr_debug("%s(): substream = %s\n", __func__, substream->name); + if (!q6core_is_adsp_ready()) { + pr_err("%s(): adsp not ready\n", __func__); + return -EINVAL; + } + /* mux config to route the AUX MI2S */ if (pdata->vaddr_gpio_mux_mic_ctl) { val = ioread32(pdata->vaddr_gpio_mux_mic_ctl); @@ -1323,6 +1621,12 @@ static int msm_sec_mi2s_snd_startup(struct snd_pcm_substream *substream) __func__); return 0; } + + if (!q6core_is_adsp_ready()) { + pr_err("%s(): adsp not ready\n", __func__); + return -EINVAL; + } + if ((pdata->ext_pa & SEC_MI2S_ID) == SEC_MI2S_ID) { if (pdata->vaddr_gpio_mux_spkr_ctl) { val = ioread32(pdata->vaddr_gpio_mux_spkr_ctl); @@ -1396,6 +1700,12 @@ static int msm_quat_mi2s_snd_startup(struct snd_pcm_substream *substream) pr_debug("%s(): substream = %s stream = %d\n", __func__, substream->name, substream->stream); + + if (!q6core_is_adsp_ready()) { + pr_err("%s(): adsp not ready\n", __func__); + return -EINVAL; + } + if (pdata->vaddr_gpio_mux_mic_ctl) { val = ioread32(pdata->vaddr_gpio_mux_mic_ctl); val = val | 0x02020002; @@ -1454,6 +1764,12 @@ static int msm_quin_mi2s_snd_startup(struct snd_pcm_substream *substream) pr_debug("%s(): substream = %s stream = %d\n", __func__, substream->name, substream->stream); + + if (!q6core_is_adsp_ready()) { + pr_err("%s(): adsp not ready\n", __func__); + return -EINVAL; + } + if (pdata->vaddr_gpio_mux_quin_ctl) { val = ioread32(pdata->vaddr_gpio_mux_quin_ctl); val = val | 0x00000001; @@ -1515,7 +1831,9 @@ static void *def_msm8952_wcd_mbhc_cal(void) return NULL; #define S(X, Y) ((WCD_MBHC_CAL_PLUG_TYPE_PTR(msm8952_wcd_cal)->X) = (Y)) - S(v_hs_max, 1500); +/*--- +bug 264424 ,zhanghao,modify,20170522,fix is can not identfiy headset --*/ +/*--- +bug 329872 ,yangrun,modify,20171229,fix the problem that delay identfiy headset --*/ + S(v_hs_max, 1700); #undef S #define S(X, Y) ((WCD_MBHC_CAL_BTN_DET_PTR(msm8952_wcd_cal)->X) = (Y)) S(num_btn, WCD_MBHC_DEF_BUTTONS); @@ -1538,19 +1856,38 @@ static void *def_msm8952_wcd_mbhc_cal(void) * 210-290 == Button 2 * 360-680 == Button 3 */ - btn_low[0] = 75; - btn_high[0] = 75; - btn_low[1] = 150; - btn_high[1] = 150; - btn_low[2] = 225; - btn_high[2] = 225; - btn_low[3] = 450; - btn_high[3] = 450; - btn_low[4] = 500; - btn_high[4] = 500; + + btn_low[0] = 25; + btn_high[0] = 75; + btn_low[1] = 200; + btn_high[1] = 225; + btn_low[2] = 325; + btn_high[2] = 450; + btn_low[3] = 500; + btn_high[3] = 510; + btn_low[4] = 530; + btn_high[4] = 540; + return msm8952_wcd_cal; } +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) || defined(CONFIG_D1_ROSY) +#else +extern char Spk_Pa_Flag[]; + +static void Set_Spk_PA_Id(void) +{ + int ret = 0; + + ret = strncmp(Spk_Pa_Flag, "S88537A12", 9); + if (ret == 0) { + Spk_Pa_Id = A12_AW8738_SPK_PA; + } else{ + Spk_Pa_Id = A13_AW87319_SPK_PA; + } + pr_err("%s:Spk_Pa_Id =%d\n!", __func__, Spk_Pa_Id); +} +#endif static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) { @@ -1598,7 +1935,20 @@ static int msm_audrx_init(struct snd_soc_pcm_runtime *rtd) return ret; } } - return msm8x16_wcd_hs_detect(codec, &mbhc_cfg); + +#if defined(CONFIG_C3N_SMB358) || defined(CONFIG_C3B_BQ2560X) || defined(CONFIG_D1_ROSY) +#else + INIT_DELAYED_WORK(&lineout_amp_enable, msm8952_ext_spk__delayed_enable); + + INIT_DELAYED_WORK(&lineout_amp_dualmode, msm8x16_ext_spk_delayed_dualmode); + + INIT_DELAYED_WORK(&lineout_hs_sw_enable, msm8952_ext_hs_delay_enable); + + /*Set Externl speaker PA Hardware ID*/ + Set_Spk_PA_Id(); +#endif + + return 0; } static struct snd_soc_ops msm8952_quat_mi2s_be_ops = { @@ -2984,6 +3334,28 @@ static int msm8952_asoc_machine_probe(struct platform_device *pdev) } pdata->mclk_freq = id; + spk_pa_gpio = of_get_named_gpio(pdev->dev.of_node, "ext-spk-amp-gpio", 0); + if (spk_pa_gpio < 0) { + dev_err(&pdev->dev, + "%s: error! spk_pa_gpio is :%d\n", __func__, spk_pa_gpio); + } else { + if (gpio_request_one(spk_pa_gpio, GPIOF_DIR_OUT , "spk_enable")) { + dev_err(&pdev->dev, "%s: request spk_pa_gpio fail!\n", __func__); + } + } + pr_debug("%s: request spk_pa_gpio is %d!\n", __func__, spk_pa_gpio); + + headset_gpio = of_get_named_gpio(pdev->dev.of_node, "headset-gpio", 0); + if (headset_gpio < 0) { + dev_err(&pdev->dev, + "%s: error! headset_gpio is :%d\n", __func__, headset_gpio); + } else { + if (gpio_request_one(headset_gpio, GPIOF_DIR_OUT , "headset_enable")) { + dev_err(&pdev->dev, "%s: request headset_gpio fail!\n", __func__); + } + } + pr_debug("%s:request headset_gpio is %d!\n", __func__, headset_gpio); + /*reading the gpio configurations from dtsi file*/ ret = msm_gpioset_initialize(CLIENT_WCD_INT, &pdev->dev); if (ret < 0) { @@ -3201,6 +3573,12 @@ static int msm8952_asoc_machine_probe(struct platform_device *pdev) kfree(msm8952_codec_conf[i].name_prefix); } } + + if (spk_pa_gpio > 0) + gpio_free(spk_pa_gpio); + if (headset_gpio > 0) + gpio_free(headset_gpio); + err1: devm_kfree(&pdev->dev, pdata); return ret; diff --git a/sound/soc/msm/msm8994.c b/sound/soc/msm/msm8994.c index 83edad44e4003..2d5428066cede 100644 --- a/sound/soc/msm/msm8994.c +++ b/sound/soc/msm/msm8994.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2015, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-2015, 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 @@ -546,7 +546,7 @@ static int msm8994_get_spk(struct snd_kcontrol *kcontrol, static int msm8994_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s()\n", __func__); if (msm8994_spk_control == ucontrol->value.integer.value[0]) @@ -3439,7 +3439,7 @@ static int msm8994_asoc_machine_probe(struct platform_device *pdev) if (pdata->mclk_gpio < 0) { dev_err(&pdev->dev, "Looking up %s property in node %s failed %d\n", - "qcom, cdc-mclk-gpios", pdev->dev.of_node->full_name, + "qcom,cdc-mclk-gpios", pdev->dev.of_node->full_name, pdata->mclk_gpio); ret = -ENODEV; goto err; diff --git a/sound/soc/msm/msm8996.c b/sound/soc/msm/msm8996.c index 5fa5d552d5ab2..c54c30a6c2220 100644 --- a/sound/soc/msm/msm8996.c +++ b/sound/soc/msm/msm8996.c @@ -353,7 +353,7 @@ static int msm8996_get_spk(struct snd_kcontrol *kcontrol, static int msm8996_set_spk(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - struct snd_soc_codec *codec = snd_kcontrol_chip(kcontrol); + struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol); pr_debug("%s() ucontrol->value.integer.value[0] = %ld\n", __func__, ucontrol->value.integer.value[0]); diff --git a/sound/soc/msm/qdsp6v2/Makefile b/sound/soc/msm/qdsp6v2/Makefile index 3472e080c9328..7abaaadc0e06a 100644 --- a/sound/soc/msm/qdsp6v2/Makefile +++ b/sound/soc/msm/qdsp6v2/Makefile @@ -1,5 +1,5 @@ snd-soc-qdsp6v2-objs += msm-dai-q6-v2.o msm-pcm-q6-v2.o msm-pcm-routing-v2.o \ - msm-compress-q6-v2.o msm-compr-q6-v2.o \ + msm-compress-q6-v2.o \ msm-pcm-lpa-v2.o \ msm-pcm-afe-v2.o msm-pcm-voip-v2.o \ msm-pcm-voice-v2.o msm-dai-q6-hdmi-v2.o \ @@ -10,7 +10,6 @@ obj-$(CONFIG_SLIMBUS) += msm-dai-slim.o audio_slimslave.o obj-$(CONFIG_SND_SOC_QDSP6V2) += snd-soc-qdsp6v2.o msm-pcm-dtmf-v2.o \ msm-dai-stub-v2.o obj-$(CONFIG_SND_HWDEP) += msm-pcm-routing-devdep.o -obj-$(CONFIG_DTS_EAGLE) += msm-dts-eagle.o obj-$(CONFIG_DOLBY_DAP) += msm-dolby-dap-config.o obj-$(CONFIG_DOLBY_DS2) += msm-ds2-dap-config.o obj-$(CONFIG_DTS_SRS_TM) += msm-dts-srs-tm-config.o diff --git a/sound/soc/msm/qdsp6v2/audio_cal_utils.c b/sound/soc/msm/qdsp6v2/audio_cal_utils.c index 9b76b4892eb15..74186ecf593f2 100644 --- a/sound/soc/msm/qdsp6v2/audio_cal_utils.c +++ b/sound/soc/msm/qdsp6v2/audio_cal_utils.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014-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 @@ -155,9 +155,6 @@ size_t get_cal_info_size(int32_t cal_type) case ULP_LSM_CAL_TYPE: size = sizeof(struct audio_cal_info_lsm); break; - case DTS_EAGLE_CAL_TYPE: - size = 0; - break; case AUDIO_CORE_METAINFO_CAL_TYPE: size = sizeof(struct audio_cal_info_metainfo); break; @@ -301,9 +298,6 @@ size_t get_user_cal_type_size(int32_t cal_type) case ULP_LSM_CAL_TYPE: size = sizeof(struct audio_cal_type_lsm); break; - case DTS_EAGLE_CAL_TYPE: - size = 0; - break; case AUDIO_CORE_METAINFO_CAL_TYPE: size = sizeof(struct audio_cal_type_metainfo); break; @@ -601,7 +595,6 @@ static struct cal_block_data *create_cal_block(struct cal_type_data *cal_type, } INIT_LIST_HEAD(&cal_block->list); - list_add_tail(&cal_block->list, &cal_type->cal_blocks); cal_block->map_data.ion_map_handle = basic_cal->cal_data.mem_handle; if (basic_cal->cal_data.mem_handle > 0) { @@ -633,6 +626,7 @@ static struct cal_block_data *create_cal_block(struct cal_type_data *cal_type, goto err; } cal_block->buffer_number = basic_cal->cal_hdr.buffer_number; + list_add_tail(&cal_block->list, &cal_type->cal_blocks); pr_debug("%s: created block for cal type %d, buf num %d, map handle %d, map size %zd paddr 0x%pK!\n", __func__, cal_type->info.reg.cal_type, cal_block->buffer_number, @@ -642,6 +636,10 @@ static struct cal_block_data *create_cal_block(struct cal_type_data *cal_type, done: return cal_block; err: + kfree(cal_block->cal_info); + cal_block->cal_info = NULL; + kfree(cal_block->client_info); + cal_block->client_info = NULL; kfree(cal_block); cal_block = NULL; return cal_block; diff --git a/sound/soc/msm/qdsp6v2/audio_calibration.c b/sound/soc/msm/qdsp6v2/audio_calibration.c index 60d09dfaeb7f7..2a1b34776b686 100644 --- a/sound/soc/msm/qdsp6v2/audio_calibration.c +++ b/sound/soc/msm/qdsp6v2/audio_calibration.c @@ -453,6 +453,12 @@ static long audio_cal_shared_ioctl(struct file *file, unsigned int cmd, data->cal_type.cal_hdr.buffer_number); ret = -EINVAL; goto done; + } else if ((data->hdr.cal_type_size + sizeof(data->hdr)) > size) { + pr_err("%s: cal type hdr size %zd + cal type size %d is greater than user buffer size %d\n", + __func__, sizeof(data->hdr), data->hdr.cal_type_size, + size); + ret = -EFAULT; + goto done; } @@ -490,13 +496,7 @@ static long audio_cal_shared_ioctl(struct file *file, unsigned int cmd, goto unlock; if (data == NULL) goto unlock; - if ((sizeof(data->hdr) + data->hdr.cal_type_size) > size) { - pr_err("%s: header size %zd plus cal type size %d are greater than data buffer size %d\n", - __func__, sizeof(data->hdr), - data->hdr.cal_type_size, size); - ret = -EFAULT; - goto unlock; - } else if (copy_to_user((void *)arg, data, + if (copy_to_user(arg, data, sizeof(data->hdr) + data->hdr.cal_type_size)) { pr_err("%s: Could not copy cal type to user\n", __func__); diff --git a/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c index 1c08842c78400..1286d31857802 100644 --- a/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-audio-effects-q6-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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 @@ -15,7 +15,6 @@ #include #include #include -#include #include #define MAX_ENABLE_CMD_SIZE 32 @@ -49,26 +48,6 @@ bool msm_audio_effects_is_effmodule_supp_in_top(int effect_module, case EQ_MODULE: switch (topology) { case ASM_STREAM_POSTPROC_TOPO_ID_SA_PLUS: - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS: - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER: - return true; - default: - return false; - } - case DTS_EAGLE_MODULE: - switch (topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX: - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS: - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER: - return true; - default: - return false; - } - case SOFT_VOLUME2_MODULE: - case DTS_EAGLE_MODULE_ENABLE: - switch (topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS: - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER: return true; default: return false; @@ -176,7 +155,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "VIRT ENABLE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_VIRTUALIZER; *updt_params++ = @@ -204,7 +183,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "VIRT STRENGTH", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_VIRTUALIZER; *updt_params++ = @@ -232,7 +211,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "VIRT OUT_TYPE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_VIRTUALIZER; *updt_params++ = @@ -260,7 +239,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "VIRT GAIN_ADJUST", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_VIRTUALIZER; *updt_params++ = @@ -276,7 +255,7 @@ int msm_audio_effects_virtualizer_handler(struct audio_client *ac, break; } } - if (params_length && !msm_dts_eagle_is_hpx_on() && (rc == 0)) + if (params_length && (rc == 0)) q6asm_send_audio_effects_params(ac, params, params_length); else @@ -339,7 +318,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_ENABLE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -367,7 +346,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_MODE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -395,7 +374,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_PRESET", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -423,7 +402,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_WET_MIX", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -451,7 +430,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_GAIN_ADJUST", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -479,7 +458,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_ROOM_LEVEL", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -507,7 +486,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_ROOM_HF_LEVEL", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -535,7 +514,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_DECAY_TIME", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -563,7 +542,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_DECAY_HF_RATIO", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -591,7 +570,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_REFLECTIONS_LEVEL", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -619,7 +598,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_REFLECTIONS_DELAY", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -647,7 +626,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_LEVEL", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -675,7 +654,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_DELAY", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -703,7 +682,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_DIFFUSION", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -731,7 +710,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "REVERB_DENSITY", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_REVERB; *updt_params++ = @@ -747,7 +726,7 @@ int msm_audio_effects_reverb_handler(struct audio_client *ac, break; } } - if (params_length && !msm_dts_eagle_is_hpx_on() && (rc == 0)) + if (params_length && (rc == 0)) q6asm_send_audio_effects_params(ac, params, params_length); else @@ -811,7 +790,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "BASS_BOOST_ENABLE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_BASS_BOOST; *updt_params++ = @@ -839,7 +818,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "BASS_BOOST_MODE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_BASS_BOOST; *updt_params++ = @@ -867,7 +846,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "BASS_BOOST_STRENGTH", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_BASS_BOOST; *updt_params++ = @@ -883,7 +862,7 @@ int msm_audio_effects_bass_boost_handler(struct audio_client *ac, break; } } - if (params_length && !msm_dts_eagle_is_hpx_on() && (rc == 0)) + if (params_length && (rc == 0)) q6asm_send_audio_effects_params(ac, params, params_length); else @@ -945,7 +924,7 @@ int msm_audio_effects_pbe_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "PBE_ENABLE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_PBE; *updt_params++ = @@ -971,7 +950,7 @@ int msm_audio_effects_pbe_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "PBE_PARAM", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_PBE; *updt_params++ = @@ -1056,7 +1035,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "EQ_ENABLE", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; *updt_params++ = @@ -1124,7 +1103,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "EQ_CONFIG", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; *updt_params++ = @@ -1175,7 +1154,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "EQ_BAND_INDEX", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; *updt_params++ = @@ -1207,7 +1186,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac, MAX_INBAND_PARAM_SZ, "EQ_SINGLE_BAND_FREQ", rc); if (rc != 0) - break; + goto invalid_config; *updt_params++ = AUDPROC_MODULE_ID_POPLESS_EQUALIZER; *updt_params++ = @@ -1223,7 +1202,7 @@ int msm_audio_effects_popless_eq_handler(struct audio_client *ac, break; } } - if (params_length && !msm_dts_eagle_is_hpx_on() && (rc == 0)) + if (params_length && (rc == 0)) q6asm_send_audio_effects_params(ac, params, params_length); else @@ -1297,7 +1276,7 @@ static int __msm_audio_effects_volume_handler(struct audio_client *ac, "VOLUME/VOLUME2_GAIN_2CH", rc); if (rc != 0) - break; + goto invalid_config; if (instance == SOFT_VOLUME_INSTANCE_2) *updt_params++ = ASM_MODULE_ID_VOL_CTRL2; @@ -1346,7 +1325,7 @@ static int __msm_audio_effects_volume_handler(struct audio_client *ac, "VOLUME/VOLUME2_GAIN_MASTER", rc); if (rc != 0) - break; + goto invalid_config; if (instance == SOFT_VOLUME_INSTANCE_2) *updt_params++ = ASM_MODULE_ID_VOL_CTRL2; diff --git a/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c deleted file mode 100644 index 26528e6a2bb83..0000000000000 --- a/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.c +++ /dev/null @@ -1,1692 +0,0 @@ -/* Copyright (c) 2012-2016, 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "msm-compr-q6-v2.h" -#include "msm-pcm-routing-v2.h" -#include - -#define COMPRE_CAPTURE_NUM_PERIODS 16 -/* Allocate the worst case frame size for compressed audio */ -#define COMPRE_CAPTURE_HEADER_SIZE (sizeof(struct snd_compr_audio_info)) -/* Changing period size to 4032. 4032 will make sure COMPRE_CAPTURE_PERIOD_SIZE - * is 4096 with meta data size of 64 and MAX_NUM_FRAMES_PER_BUFFER 1 - */ -#define COMPRE_CAPTURE_MAX_FRAME_SIZE (4032) -#define COMPRE_CAPTURE_PERIOD_SIZE ((COMPRE_CAPTURE_MAX_FRAME_SIZE + \ - COMPRE_CAPTURE_HEADER_SIZE) * \ - MAX_NUM_FRAMES_PER_BUFFER) -#define COMPRE_OUTPUT_METADATA_SIZE (sizeof(struct output_meta_data_st)) -#define COMPRESSED_LR_VOL_MAX_STEPS 0x20002000 - -#define MAX_AC3_PARAM_SIZE (18*2*sizeof(int)) -#define AMR_WB_BAND_MODE 8 -#define AMR_WB_DTX_MODE 0 - - -const DECLARE_TLV_DB_LINEAR(compr_rx_vol_gain, 0, - COMPRESSED_LR_VOL_MAX_STEPS); - -static struct audio_locks the_locks; - -static struct snd_pcm_hardware msm_compr_hardware_capture = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = SNDRV_PCM_FMTBIT_S16_LE, - .rates = SNDRV_PCM_RATE_8000_48000, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 8, - .buffer_bytes_max = - COMPRE_CAPTURE_PERIOD_SIZE * COMPRE_CAPTURE_NUM_PERIODS , - .period_bytes_min = COMPRE_CAPTURE_PERIOD_SIZE, - .period_bytes_max = COMPRE_CAPTURE_PERIOD_SIZE, - .periods_min = COMPRE_CAPTURE_NUM_PERIODS, - .periods_max = COMPRE_CAPTURE_NUM_PERIODS, - .fifo_size = 0, -}; - -static struct snd_pcm_hardware msm_compr_hardware_playback = { - .info = (SNDRV_PCM_INFO_MMAP | - SNDRV_PCM_INFO_BLOCK_TRANSFER | - SNDRV_PCM_INFO_MMAP_VALID | - SNDRV_PCM_INFO_INTERLEAVED | - SNDRV_PCM_INFO_PAUSE | SNDRV_PCM_INFO_RESUME), - .formats = SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE, - .rates = SNDRV_PCM_RATE_8000_48000 | SNDRV_PCM_RATE_KNOT, - .rate_min = 8000, - .rate_max = 48000, - .channels_min = 1, - .channels_max = 8, - .buffer_bytes_max = 1024 * 1024, - .period_bytes_min = 128 * 1024, - .period_bytes_max = 256 * 1024, - .periods_min = 4, - .periods_max = 8, - .fifo_size = 0, -}; - -/* Conventional and unconventional sample rate supported */ -static unsigned int supported_sample_rates[] = { - 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000 -}; - -/* Add supported codecs for compress capture path */ -static uint32_t supported_compr_capture_codecs[] = { - SND_AUDIOCODEC_AMRWB -}; - -static struct snd_pcm_hw_constraint_list constraints_sample_rates = { - .count = ARRAY_SIZE(supported_sample_rates), - .list = supported_sample_rates, - .mask = 0, -}; - -static bool msm_compr_capture_codecs(uint32_t req_codec) -{ - int i; - pr_debug("%s req_codec:%d\n", __func__, req_codec); - if (req_codec == 0) - return false; - for (i = 0; i < ARRAY_SIZE(supported_compr_capture_codecs); i++) { - if (req_codec == supported_compr_capture_codecs[i]) - return true; - } - return false; -} - -static void compr_event_handler(uint32_t opcode, - uint32_t token, uint32_t *payload, void *priv) -{ - struct compr_audio *compr = priv; - struct msm_audio *prtd = &compr->prtd; - struct snd_pcm_substream *substream = prtd->substream; - struct snd_pcm_runtime *runtime = substream->runtime; - struct audio_aio_write_param param; - struct audio_aio_read_param read_param; - struct audio_buffer *buf = NULL; - phys_addr_t temp; - struct output_meta_data_st output_meta_data; - uint32_t *ptrmem = (uint32_t *)payload; - int i = 0; - int time_stamp_flag = 0; - int buffer_length = 0; - int stop_playback = 0; - - pr_debug("%s opcode =%08x\n", __func__, opcode); - switch (opcode) { - case ASM_DATA_EVENT_WRITE_DONE_V2: { - uint32_t *ptrmem = (uint32_t *)¶m; - pr_debug("ASM_DATA_EVENT_WRITE_DONE\n"); - pr_debug("Buffer Consumed = 0x%08x\n", *ptrmem); - prtd->pcm_irq_pos += prtd->pcm_count; - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - else - if (substream->timer_running) - snd_timer_interrupt(substream->timer, 1); - atomic_inc(&prtd->out_count); - wake_up(&the_locks.write_wait); - if (!atomic_read(&prtd->start)) { - atomic_set(&prtd->pending_buffer, 1); - break; - } else - atomic_set(&prtd->pending_buffer, 0); - - /* - * check for underrun - */ - snd_pcm_stream_lock_irq(substream); - if (runtime->status->hw_ptr >= runtime->control->appl_ptr) { - runtime->render_flag |= SNDRV_RENDER_STOPPED; - stop_playback = 1; - } - snd_pcm_stream_unlock_irq(substream); - - if (stop_playback) { - pr_err("underrun! render stopped\n"); - break; - } - - buf = prtd->audio_client->port[IN].buf; - pr_debug("%s:writing %d bytes of buffer[%d] to dsp 2\n", - __func__, prtd->pcm_count, prtd->out_head); - temp = buf[0].phys + (prtd->out_head * prtd->pcm_count); - pr_debug("%s:writing buffer[%d] from 0x%pK\n", - __func__, prtd->out_head, &temp); - - if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) - time_stamp_flag = SET_TIMESTAMP; - else - time_stamp_flag = NO_TIMESTAMP; - memcpy(&output_meta_data, (char *)(buf->data + - prtd->out_head * prtd->pcm_count), - COMPRE_OUTPUT_METADATA_SIZE); - - buffer_length = output_meta_data.frame_size; - pr_debug("meta_data_length: %d, frame_length: %d\n", - output_meta_data.meta_data_length, - output_meta_data.frame_size); - pr_debug("timestamp_msw: %d, timestamp_lsw: %d\n", - output_meta_data.timestamp_msw, - output_meta_data.timestamp_lsw); - if (buffer_length == 0) { - pr_debug("Recieved a zero length buffer-break out"); - break; - } - param.paddr = temp + output_meta_data.meta_data_length; - param.len = buffer_length; - param.msw_ts = output_meta_data.timestamp_msw; - param.lsw_ts = output_meta_data.timestamp_lsw; - param.flags = time_stamp_flag; - param.uid = prtd->session_id; - for (i = 0; i < sizeof(struct audio_aio_write_param)/4; - i++, ++ptrmem) - pr_debug("cmd[%d]=0x%08x\n", i, *ptrmem); - if (q6asm_async_write(prtd->audio_client, - ¶m) < 0) - pr_err("%s:q6asm_async_write failed\n", - __func__); - else - prtd->out_head = - (prtd->out_head + 1) & (runtime->periods - 1); - break; - } - case ASM_DATA_EVENT_RENDERED_EOS: - pr_debug("ASM_DATA_CMDRSP_EOS\n"); - if (atomic_read(&prtd->eos)) { - pr_debug("ASM_DATA_CMDRSP_EOS wake up\n"); - prtd->cmd_ack = 1; - wake_up(&the_locks.eos_wait); - atomic_set(&prtd->eos, 0); - } - break; - case ASM_DATA_EVENT_READ_DONE_V2: { - pr_debug("ASM_DATA_EVENT_READ_DONE\n"); - pr_debug("buf = %pK, data = 0x%X, *data = %pK,\n" - "prtd->pcm_irq_pos = %d\n", - prtd->audio_client->port[OUT].buf, - *(uint32_t *)prtd->audio_client->port[OUT].buf->data, - prtd->audio_client->port[OUT].buf->data, - prtd->pcm_irq_pos); - - memcpy(prtd->audio_client->port[OUT].buf->data + - prtd->pcm_irq_pos, (ptrmem + READDONE_IDX_SIZE), - COMPRE_CAPTURE_HEADER_SIZE); - pr_debug("buf = %pK, updated data = 0x%X, *data = %pK\n", - prtd->audio_client->port[OUT].buf, - *(uint32_t *)(prtd->audio_client->port[OUT].buf->data + - prtd->pcm_irq_pos), - prtd->audio_client->port[OUT].buf->data); - if (!atomic_read(&prtd->start)) - break; - pr_debug("frame size=%d, buffer = 0x%X\n", - ptrmem[READDONE_IDX_SIZE], - ptrmem[READDONE_IDX_BUFADD_LSW]); - if (ptrmem[READDONE_IDX_SIZE] > COMPRE_CAPTURE_MAX_FRAME_SIZE) { - pr_err("Frame length exceeded the max length"); - break; - } - buf = prtd->audio_client->port[OUT].buf; - - pr_debug("pcm_irq_pos=%d, buf[0].phys = 0x%pK\n", - prtd->pcm_irq_pos, &buf[0].phys); - read_param.len = prtd->pcm_count - COMPRE_CAPTURE_HEADER_SIZE; - read_param.paddr = buf[0].phys + - prtd->pcm_irq_pos + COMPRE_CAPTURE_HEADER_SIZE; - prtd->pcm_irq_pos += prtd->pcm_count; - - if (atomic_read(&prtd->start)) - snd_pcm_period_elapsed(substream); - - q6asm_async_read(prtd->audio_client, &read_param); - break; - } - case APR_BASIC_RSP_RESULT: { - switch (payload[0]) { - case ASM_SESSION_CMD_RUN_V2: { - if (substream->stream - != SNDRV_PCM_STREAM_PLAYBACK) { - atomic_set(&prtd->start, 1); - break; - } - if (!atomic_read(&prtd->pending_buffer)) - break; - pr_debug("%s: writing %d bytes of buffer[%d] to dsp\n", - __func__, prtd->pcm_count, prtd->out_head); - buf = prtd->audio_client->port[IN].buf; - pr_debug("%s: writing buffer[%d] from 0x%pK head %d count %d\n", - __func__, prtd->out_head, &buf[0].phys, - prtd->pcm_count, prtd->out_head); - if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) - time_stamp_flag = SET_TIMESTAMP; - else - time_stamp_flag = NO_TIMESTAMP; - memcpy(&output_meta_data, (char *)(buf->data + - prtd->out_head * prtd->pcm_count), - COMPRE_OUTPUT_METADATA_SIZE); - buffer_length = output_meta_data.frame_size; - pr_debug("meta_data_length: %d, frame_length: %d\n", - output_meta_data.meta_data_length, - output_meta_data.frame_size); - pr_debug("timestamp_msw: %d, timestamp_lsw: %d\n", - output_meta_data.timestamp_msw, - output_meta_data.timestamp_lsw); - param.paddr = buf[prtd->out_head].phys - + output_meta_data.meta_data_length; - param.len = buffer_length; - param.msw_ts = output_meta_data.timestamp_msw; - param.lsw_ts = output_meta_data.timestamp_lsw; - param.flags = time_stamp_flag; - param.uid = prtd->session_id; - param.metadata_len = COMPRE_OUTPUT_METADATA_SIZE; - if (q6asm_async_write(prtd->audio_client, - ¶m) < 0) - pr_err("%s:q6asm_async_write failed\n", - __func__); - else - prtd->out_head = - (prtd->out_head + 1) - & (runtime->periods - 1); - atomic_set(&prtd->pending_buffer, 0); - } - break; - case ASM_STREAM_CMD_FLUSH: - pr_debug("ASM_STREAM_CMD_FLUSH\n"); - prtd->cmd_ack = 1; - wake_up(&the_locks.flush_wait); - break; - default: - break; - } - break; - } - default: - pr_debug("Not Supported Event opcode[0x%x]\n", opcode); - break; - } -} - -static int msm_compr_send_ddp_cfg(struct audio_client *ac, - struct snd_dec_ddp *ddp) -{ - int i, rc; - pr_debug("%s\n", __func__); - - if (ddp->params_length / 2 > SND_DEC_DDP_MAX_PARAMS) { - pr_err("%s: Invalid number of params %u, max allowed %u\n", - __func__, ddp->params_length / 2, - SND_DEC_DDP_MAX_PARAMS); - return -EINVAL; - } - - for (i = 0; i < ddp->params_length/2; i++) { - rc = q6asm_ds1_set_endp_params(ac, ddp->params_id[i], - ddp->params_value[i]); - if (rc) { - pr_err("sending params_id: %d failed\n", - ddp->params_id[i]); - return rc; - } - } - return 0; -} - -static int msm_compr_playback_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct msm_audio *prtd = &compr->prtd; - struct snd_pcm_hw_params *params; - struct asm_aac_cfg aac_cfg; - uint16_t bits_per_sample = 16; - int ret; - - struct asm_softpause_params softpause = { - .enable = SOFT_PAUSE_ENABLE, - .period = SOFT_PAUSE_PERIOD, - .step = SOFT_PAUSE_STEP, - .rampingcurve = SOFT_PAUSE_CURVE_LINEAR, - }; - struct asm_softvolume_params softvol = { - .period = SOFT_VOLUME_PERIOD, - .step = SOFT_VOLUME_STEP, - .rampingcurve = SOFT_VOLUME_CURVE_LINEAR, - }; - - pr_debug("%s\n", __func__); - - params = &soc_prtd->dpcm[substream->stream].hw_params; - if (runtime->format == SNDRV_PCM_FORMAT_S24_LE) - bits_per_sample = 24; - - ret = q6asm_open_write_v2(prtd->audio_client, - compr->codec, bits_per_sample); - if (ret < 0) { - pr_err("%s: Session out open failed\n", - __func__); - return -ENOMEM; - } - msm_pcm_routing_reg_phy_stream( - soc_prtd->dai_link->be_id, - prtd->audio_client->perf_mode, - prtd->session_id, - substream->stream); - /* - * the number of channels are required to call volume api - * accoridngly. So, get channels from hw params - */ - if ((params_channels(params) > 0) && - (params_periods(params) <= runtime->hw.channels_max)) - prtd->channel_mode = params_channels(params); - - ret = q6asm_set_softpause(prtd->audio_client, &softpause); - if (ret < 0) - pr_err("%s: Send SoftPause Param failed ret=%d\n", - __func__, ret); - ret = q6asm_set_softvolume(prtd->audio_client, &softvol); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); - - ret = q6asm_set_io_mode(prtd->audio_client, - (COMPRESSED_IO | ASYNC_IO_MODE)); - if (ret < 0) { - pr_err("%s: Set IO mode failed\n", __func__); - return -ENOMEM; - } - - prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_irq_pos = 0; - /* rate and channels are sent to audio driver */ - prtd->samp_rate = runtime->rate; - prtd->channel_mode = runtime->channels; - prtd->out_head = 0; - atomic_set(&prtd->out_count, runtime->periods); - - if (prtd->enabled) - return 0; - - switch (compr->info.codec_param.codec.id) { - case SND_AUDIOCODEC_MP3: - /* No media format block for mp3 */ - break; - case SND_AUDIOCODEC_AAC: - pr_debug("%s: SND_AUDIOCODEC_AAC\n", __func__); - memset(&aac_cfg, 0x0, sizeof(struct asm_aac_cfg)); - aac_cfg.aot = AAC_ENC_MODE_EAAC_P; - aac_cfg.format = 0x03; - aac_cfg.ch_cfg = runtime->channels; - aac_cfg.sample_rate = runtime->rate; - ret = q6asm_media_format_block_aac(prtd->audio_client, - &aac_cfg); - if (ret < 0) - pr_err("%s: CMD Format block failed\n", __func__); - break; - case SND_AUDIOCODEC_AC3: { - struct snd_dec_ddp *ddp = - &compr->info.codec_param.codec.options.ddp; - pr_debug("%s: SND_AUDIOCODEC_AC3\n", __func__); - ret = msm_compr_send_ddp_cfg(prtd->audio_client, ddp); - if (ret < 0) - pr_err("%s: DDP CMD CFG failed\n", __func__); - break; - } - case SND_AUDIOCODEC_EAC3: { - struct snd_dec_ddp *ddp = - &compr->info.codec_param.codec.options.ddp; - pr_debug("%s: SND_AUDIOCODEC_EAC3\n", __func__); - ret = msm_compr_send_ddp_cfg(prtd->audio_client, ddp); - if (ret < 0) - pr_err("%s: DDP CMD CFG failed\n", __func__); - break; - } - default: - return -EINVAL; - } - - prtd->enabled = 1; - prtd->cmd_ack = 0; - prtd->cmd_interrupt = 0; - - return 0; -} - -static int msm_compr_capture_prepare(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - struct audio_buffer *buf = prtd->audio_client->port[OUT].buf; - struct snd_codec *codec = &compr->info.codec_param.codec; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct audio_aio_read_param read_param; - uint16_t bits_per_sample = 16; - int ret = 0; - int i; - - prtd->pcm_size = snd_pcm_lib_buffer_bytes(substream); - prtd->pcm_count = snd_pcm_lib_period_bytes(substream); - prtd->pcm_irq_pos = 0; - - if (runtime->format == SNDRV_PCM_FORMAT_S24_LE) - bits_per_sample = 24; - - if (!msm_compr_capture_codecs( - compr->info.codec_param.codec.id)) { - /* - * request codec invalid or not supported, - * use default compress format - */ - compr->info.codec_param.codec.id = - SND_AUDIOCODEC_AMRWB; - } - switch (compr->info.codec_param.codec.id) { - case SND_AUDIOCODEC_AMRWB: - pr_debug("q6asm_open_read(FORMAT_AMRWB)\n"); - ret = q6asm_open_read(prtd->audio_client, - FORMAT_AMRWB); - if (ret < 0) { - pr_err("%s: compressed Session out open failed\n", - __func__); - return -ENOMEM; - } - pr_debug("msm_pcm_routing_reg_phy_stream\n"); - msm_pcm_routing_reg_phy_stream( - soc_prtd->dai_link->be_id, - prtd->audio_client->perf_mode, - prtd->session_id, substream->stream); - break; - default: - pr_debug("q6asm_open_read_compressed(COMPRESSED_META_DATA_MODE)\n"); - /* - ret = q6asm_open_read_compressed(prtd->audio_client, - MAX_NUM_FRAMES_PER_BUFFER, - COMPRESSED_META_DATA_MODE); - */ - ret = -EINVAL; - break; - } - - if (ret < 0) { - pr_err("%s: compressed Session out open failed\n", - __func__); - return -ENOMEM; - } - - ret = q6asm_set_io_mode(prtd->audio_client, - (COMPRESSED_IO | ASYNC_IO_MODE)); - if (ret < 0) { - pr_err("%s: Set IO mode failed\n", __func__); - return -ENOMEM; - } - - if (!msm_compr_capture_codecs(codec->id)) { - /* - * request codec invalid or not supported, - * use default compress format - */ - codec->id = SND_AUDIOCODEC_AMRWB; - } - /* rate and channels are sent to audio driver */ - prtd->samp_rate = runtime->rate; - prtd->channel_mode = runtime->channels; - - if (prtd->enabled) - return ret; - read_param.len = prtd->pcm_count; - - switch (codec->id) { - case SND_AUDIOCODEC_AMRWB: - pr_debug("SND_AUDIOCODEC_AMRWB\n"); - ret = q6asm_enc_cfg_blk_amrwb(prtd->audio_client, - MAX_NUM_FRAMES_PER_BUFFER, - /* - * use fixed band mode and dtx mode - * band mode - 23.85 kbps - */ - AMR_WB_BAND_MODE, - /* dtx mode - disable */ - AMR_WB_DTX_MODE); - if (ret < 0) - pr_err("%s: CMD Format block failed: %d\n", - __func__, ret); - break; - default: - pr_debug("No config for codec %d\n", codec->id); - } - pr_debug("%s: Samp_rate = %d, Channel = %d, pcm_size = %d,\n" - "pcm_count = %d, periods = %d\n", - __func__, prtd->samp_rate, prtd->channel_mode, - prtd->pcm_size, prtd->pcm_count, runtime->periods); - - for (i = 0; i < runtime->periods; i++) { - read_param.uid = i; - switch (codec->id) { - case SND_AUDIOCODEC_AMRWB: - read_param.len = prtd->pcm_count - - COMPRE_CAPTURE_HEADER_SIZE; - read_param.paddr = buf[i].phys - + COMPRE_CAPTURE_HEADER_SIZE; - pr_debug("Push buffer [%d] to DSP, paddr: %pK, vaddr: %pK\n", - i, &read_param.paddr, - buf[i].data); - q6asm_async_read(prtd->audio_client, &read_param); - break; - default: - read_param.paddr = buf[i].phys; - /*q6asm_async_read_compressed(prtd->audio_client, - &read_param);*/ - pr_debug("%s: To add support for read compressed\n", - __func__); - ret = -EINVAL; - break; - } - } - prtd->periods = runtime->periods; - - prtd->enabled = 1; - - return ret; -} - -static int msm_compr_trigger(struct snd_pcm_substream *substream, int cmd) -{ - int ret = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - - pr_debug("%s\n", __func__); - switch (cmd) { - case SNDRV_PCM_TRIGGER_START: - prtd->pcm_irq_pos = 0; - - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - if (!msm_compr_capture_codecs( - compr->info.codec_param.codec.id)) { - /* - * request codec invalid or not supported, - * use default compress format - */ - compr->info.codec_param.codec.id = - SND_AUDIOCODEC_AMRWB; - } - switch (compr->info.codec_param.codec.id) { - case SND_AUDIOCODEC_AMRWB: - break; - default: - msm_pcm_routing_reg_psthr_stream( - soc_prtd->dai_link->be_id, - prtd->session_id, substream->stream); - break; - } - } - atomic_set(&prtd->pending_buffer, 1); - case SNDRV_PCM_TRIGGER_RESUME: - case SNDRV_PCM_TRIGGER_PAUSE_RELEASE: - pr_debug("%s: Trigger start\n", __func__); - q6asm_run_nowait(prtd->audio_client, 0, 0, 0); - atomic_set(&prtd->start, 1); - break; - case SNDRV_PCM_TRIGGER_STOP: - pr_debug("SNDRV_PCM_TRIGGER_STOP\n"); - if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { - switch (compr->info.codec_param.codec.id) { - case SND_AUDIOCODEC_AMRWB: - break; - default: - msm_pcm_routing_reg_psthr_stream( - soc_prtd->dai_link->be_id, - prtd->session_id, substream->stream); - break; - } - } - atomic_set(&prtd->start, 0); - runtime->render_flag &= ~SNDRV_RENDER_STOPPED; - break; - case SNDRV_PCM_TRIGGER_SUSPEND: - case SNDRV_PCM_TRIGGER_PAUSE_PUSH: - pr_debug("SNDRV_PCM_TRIGGER_PAUSE\n"); - q6asm_cmd_nowait(prtd->audio_client, CMD_PAUSE); - atomic_set(&prtd->start, 0); - runtime->render_flag &= ~SNDRV_RENDER_STOPPED; - break; - default: - ret = -EINVAL; - break; - } - - return ret; -} - -static void populate_codec_list(struct compr_audio *compr, - struct snd_pcm_runtime *runtime) -{ - pr_debug("%s\n", __func__); - /* MP3 Block */ - compr->info.compr_cap.num_codecs = 5; - compr->info.compr_cap.min_fragment_size = runtime->hw.period_bytes_min; - compr->info.compr_cap.max_fragment_size = runtime->hw.period_bytes_max; - compr->info.compr_cap.min_fragments = runtime->hw.periods_min; - compr->info.compr_cap.max_fragments = runtime->hw.periods_max; - compr->info.compr_cap.codecs[0] = SND_AUDIOCODEC_MP3; - compr->info.compr_cap.codecs[1] = SND_AUDIOCODEC_AAC; - compr->info.compr_cap.codecs[2] = SND_AUDIOCODEC_AC3; - compr->info.compr_cap.codecs[3] = SND_AUDIOCODEC_EAC3; - compr->info.compr_cap.codecs[4] = SND_AUDIOCODEC_AMRWB; - /* Add new codecs here */ -} - -static int msm_compr_open(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr; - struct msm_audio *prtd; - int ret = 0; - - pr_debug("%s\n", __func__); - compr = kzalloc(sizeof(struct compr_audio), GFP_KERNEL); - if (compr == NULL) { - pr_err("Failed to allocate memory for msm_audio\n"); - return -ENOMEM; - } - prtd = &compr->prtd; - prtd->substream = substream; - runtime->render_flag = SNDRV_DMA_MODE; - prtd->audio_client = q6asm_audio_client_alloc( - (app_cb)compr_event_handler, compr); - if (!prtd->audio_client) { - pr_info("%s: Could not allocate memory\n", __func__); - kfree(prtd); - return -ENOMEM; - } - - prtd->audio_client->perf_mode = false; - pr_info("%s: session ID %d\n", __func__, prtd->audio_client->session); - - prtd->session_id = prtd->audio_client->session; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) { - runtime->hw = msm_compr_hardware_playback; - prtd->cmd_ack = 1; - } else { - runtime->hw = msm_compr_hardware_capture; - } - - - ret = snd_pcm_hw_constraint_list(runtime, 0, - SNDRV_PCM_HW_PARAM_RATE, - &constraints_sample_rates); - if (ret < 0) - pr_info("snd_pcm_hw_constraint_list failed\n"); - /* Ensure that buffer size is a multiple of period size */ - ret = snd_pcm_hw_constraint_integer(runtime, - SNDRV_PCM_HW_PARAM_PERIODS); - if (ret < 0) - pr_info("snd_pcm_hw_constraint_integer failed\n"); - - prtd->dsp_cnt = 0; - atomic_set(&prtd->pending_buffer, 1); - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - compr->codec = FORMAT_MP3; - populate_codec_list(compr, runtime); - runtime->private_data = compr; - atomic_set(&prtd->eos, 0); - return 0; -} - -static int compressed_set_volume(struct msm_audio *prtd, uint32_t volume) -{ - int rc = 0; - int avg_vol = 0; - int lgain = (volume >> 16) & 0xFFFF; - int rgain = volume & 0xFFFF; - if (prtd && prtd->audio_client) { - pr_debug("%s: channels %d volume 0x%x\n", __func__, - prtd->channel_mode, volume); - if ((prtd->channel_mode == 2) && - (lgain != rgain)) { - pr_debug("%s: call q6asm_set_lrgain\n", __func__); - rc = q6asm_set_lrgain(prtd->audio_client, lgain, rgain); - } else { - avg_vol = (lgain + rgain)/2; - pr_debug("%s: call q6asm_set_volume\n", __func__); - rc = q6asm_set_volume(prtd->audio_client, avg_vol); - } - if (rc < 0) { - pr_err("%s: Send Volume command failed rc=%d\n", - __func__, rc); - } - } - return rc; -} - -static int msm_compr_playback_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - int dir = 0; - - pr_debug("%s\n", __func__); - - dir = IN; - atomic_set(&prtd->pending_buffer, 0); - - prtd->pcm_irq_pos = 0; - q6asm_cmd(prtd->audio_client, CMD_CLOSE); - q6asm_audio_client_buf_free_contiguous(dir, - prtd->audio_client); - msm_pcm_routing_dereg_phy_stream( - soc_prtd->dai_link->be_id, - SNDRV_PCM_STREAM_PLAYBACK); - q6asm_audio_client_free(prtd->audio_client); - kfree(prtd); - return 0; -} - -static int msm_compr_capture_close(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct snd_soc_pcm_runtime *soc_prtd = substream->private_data; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - int dir = OUT; - - pr_debug("%s\n", __func__); - atomic_set(&prtd->pending_buffer, 0); - q6asm_cmd(prtd->audio_client, CMD_CLOSE); - q6asm_audio_client_buf_free_contiguous(dir, - prtd->audio_client); - msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->be_id, - SNDRV_PCM_STREAM_CAPTURE); - q6asm_audio_client_free(prtd->audio_client); - kfree(prtd); - return 0; -} - -static int msm_compr_close(struct snd_pcm_substream *substream) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_compr_playback_close(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_compr_capture_close(substream); - return ret; -} - -static int msm_compr_prepare(struct snd_pcm_substream *substream) -{ - int ret = 0; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - ret = msm_compr_playback_prepare(substream); - else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) - ret = msm_compr_capture_prepare(substream); - return ret; -} - -static snd_pcm_uframes_t msm_compr_pointer(struct snd_pcm_substream *substream) -{ - - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - - if (prtd->pcm_irq_pos >= prtd->pcm_size) - prtd->pcm_irq_pos = 0; - - pr_debug("%s: pcm_irq_pos = %d, pcm_size = %d, sample_bits = %d,\n" - "frame_bits = %d\n", __func__, prtd->pcm_irq_pos, - prtd->pcm_size, runtime->sample_bits, - runtime->frame_bits); - return bytes_to_frames(runtime, (prtd->pcm_irq_pos)); -} - -static int msm_compr_mmap(struct snd_pcm_substream *substream, - struct vm_area_struct *vma) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct msm_audio *prtd = runtime->private_data; - struct audio_client *ac = prtd->audio_client; - struct audio_port_data *apd = ac->port; - struct audio_buffer *ab; - int dir = -1; - - prtd->mmap_flag = 1; - runtime->render_flag = SNDRV_NON_DMA_MODE; - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - ab = &(apd[dir].buf[0]); - - return msm_audio_ion_mmap(ab, vma); -} - -static int msm_compr_hw_params(struct snd_pcm_substream *substream, - struct snd_pcm_hw_params *params) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - struct snd_dma_buffer *dma_buf = &substream->dma_buffer; - struct audio_buffer *buf; - int dir, ret; - - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) - dir = IN; - else - dir = OUT; - /* Modifying kernel hardware params based on userspace config */ - if (params_periods(params) > 0 && - (params_periods(params) != runtime->hw.periods_max)) { - runtime->hw.periods_max = params_periods(params); - } - if (params_period_bytes(params) > 0 && - (params_period_bytes(params) != runtime->hw.period_bytes_min)) { - runtime->hw.period_bytes_min = params_period_bytes(params); - } - runtime->hw.buffer_bytes_max = - runtime->hw.period_bytes_min * runtime->hw.periods_max; - pr_debug("allocate %zd buffers each of size %d\n", - runtime->hw.period_bytes_min, - runtime->hw.periods_max); - ret = q6asm_audio_client_buf_alloc_contiguous(dir, - prtd->audio_client, - runtime->hw.period_bytes_min, - runtime->hw.periods_max); - if (ret < 0) { - pr_err("Audio Start: Buffer Allocation failed rc = %d\n", - ret); - return -ENOMEM; - } - buf = prtd->audio_client->port[dir].buf; - - dma_buf->dev.type = SNDRV_DMA_TYPE_DEV; - dma_buf->dev.dev = substream->pcm->card->dev; - dma_buf->private_data = NULL; - dma_buf->area = buf[0].data; - dma_buf->addr = buf[0].phys; - dma_buf->bytes = runtime->hw.buffer_bytes_max; - - pr_debug("%s: buf[%pK]dma_buf->area[%pK]dma_buf->addr[%pK]\n" - "dma_buf->bytes[%zd]\n", __func__, - (void *)buf, (void *)dma_buf->area, - &dma_buf->addr, dma_buf->bytes); - if (!dma_buf->area) - return -ENOMEM; - - snd_pcm_set_runtime_buffer(substream, &substream->dma_buffer); - return 0; -} - -static int msm_compr_ioctl_shared(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - int rc = 0; - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - uint64_t timestamp; - uint64_t temp; - - switch (cmd) { - case SNDRV_COMPRESS_TSTAMP: { - struct snd_compr_tstamp *tstamp; - pr_debug("SNDRV_COMPRESS_TSTAMP\n"); - tstamp = arg; - memset(tstamp, 0x0, sizeof(*tstamp)); - rc = q6asm_get_session_time(prtd->audio_client, ×tamp); - if (rc < 0) { - pr_err("%s: Get Session Time return value =%lld\n", - __func__, timestamp); - return -EAGAIN; - } - temp = (timestamp * 2 * runtime->channels); - temp = temp * (runtime->rate/1000); - temp = div_u64(temp, 1000); - tstamp->sampling_rate = runtime->rate; - tstamp->timestamp = timestamp; - pr_debug("%s: bytes_consumed:,timestamp = %lld,\n", - __func__, - tstamp->timestamp); - return 0; - } - case SNDRV_COMPRESS_GET_CAPS: { - struct snd_compr_caps *caps; - caps = arg; - memset(caps, 0, sizeof(*caps)); - pr_debug("SNDRV_COMPRESS_GET_CAPS\n"); - memcpy(caps, &compr->info.compr_cap, sizeof(*caps)); - return 0; - } - case SNDRV_COMPRESS_SET_PARAMS: - pr_debug("SNDRV_COMPRESS_SET_PARAMS:\n"); - memcpy(&compr->info.codec_param, (void *) arg, - sizeof(struct snd_compr_params)); - switch (compr->info.codec_param.codec.id) { - case SND_AUDIOCODEC_MP3: - /* For MP3 we dont need any other parameter */ - pr_debug("SND_AUDIOCODEC_MP3\n"); - compr->codec = FORMAT_MP3; - break; - case SND_AUDIOCODEC_AAC: - pr_debug("SND_AUDIOCODEC_AAC\n"); - compr->codec = FORMAT_MPEG4_AAC; - break; - case SND_AUDIOCODEC_AC3: { - char params_value[MAX_AC3_PARAM_SIZE]; - int *params_value_data = (int *)params_value; - /* 36 is the max param length for ddp */ - int i; - struct snd_dec_ddp *ddp = - &compr->info.codec_param.codec.options.ddp; - uint32_t params_length = 0; - /* check integer overflow */ - if (ddp->params_length > UINT_MAX/sizeof(int)) { - pr_err("%s: Integer overflow ddp->params_length %d\n", - __func__, ddp->params_length); - return -EINVAL; - } - params_length = ddp->params_length*sizeof(int); - if (params_length > MAX_AC3_PARAM_SIZE) { - /*MAX is 36*sizeof(int) this should not happen*/ - pr_err("%s: params_length(%d) is greater than %zd\n", - __func__, params_length, MAX_AC3_PARAM_SIZE); - return -EINVAL; - } - pr_debug("SND_AUDIOCODEC_AC3\n"); - compr->codec = FORMAT_AC3; - pr_debug("params_length: %d\n", ddp->params_length); - for (i = 0; i < params_length/sizeof(int); i++) - pr_debug("params_value[%d]: %x\n", i, - params_value_data[i]); - for (i = 0; i < ddp->params_length/2; i++) { - ddp->params_id[i] = params_value_data[2*i]; - ddp->params_value[i] = params_value_data[2*i+1]; - } - if (atomic_read(&prtd->start)) { - rc = msm_compr_send_ddp_cfg(prtd->audio_client, - ddp); - if (rc < 0) - pr_err("%s: DDP CMD CFG failed\n", - __func__); - } - break; - } - case SND_AUDIOCODEC_EAC3: { - char params_value[MAX_AC3_PARAM_SIZE]; - int *params_value_data = (int *)params_value; - /* 36 is the max param length for ddp */ - int i; - struct snd_dec_ddp *ddp = - &compr->info.codec_param.codec.options.ddp; - uint32_t params_length = 0; - /* check integer overflow */ - if (ddp->params_length > UINT_MAX/sizeof(int)) { - pr_err("%s: Integer overflow ddp->params_length %d\n", - __func__, ddp->params_length); - return -EINVAL; - } - params_length = ddp->params_length*sizeof(int); - if (params_length > MAX_AC3_PARAM_SIZE) { - /*MAX is 36*sizeof(int) this should not happen*/ - pr_err("%s: params_length(%d) is greater than %zd\n", - __func__, params_length, MAX_AC3_PARAM_SIZE); - return -EINVAL; - } - pr_debug("SND_AUDIOCODEC_EAC3\n"); - compr->codec = FORMAT_EAC3; - pr_debug("params_length: %d\n", ddp->params_length); - for (i = 0; i < ddp->params_length; i++) - pr_debug("params_value[%d]: %x\n", i, - params_value_data[i]); - for (i = 0; i < ddp->params_length/2; i++) { - ddp->params_id[i] = params_value_data[2*i]; - ddp->params_value[i] = params_value_data[2*i+1]; - } - if (atomic_read(&prtd->start)) { - rc = msm_compr_send_ddp_cfg(prtd->audio_client, - ddp); - if (rc < 0) - pr_err("%s: DDP CMD CFG failed\n", - __func__); - } - break; - } - default: - pr_debug("FORMAT_LINEAR_PCM\n"); - compr->codec = FORMAT_LINEAR_PCM; - break; - } - return 0; - case SNDRV_PCM_IOCTL1_RESET: - pr_debug("SNDRV_PCM_IOCTL1_RESET\n"); - /* Flush only when session is started during CAPTURE, - while PLAYBACK has no such restriction. */ - if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK || - (substream->stream == SNDRV_PCM_STREAM_CAPTURE && - atomic_read(&prtd->start))) { - if (atomic_read(&prtd->eos)) { - prtd->cmd_interrupt = 1; - wake_up(&the_locks.eos_wait); - atomic_set(&prtd->eos, 0); - } - - /* A unlikely race condition possible with FLUSH - DRAIN if ack is set by flush and reset by drain */ - prtd->cmd_ack = 0; - rc = q6asm_cmd(prtd->audio_client, CMD_FLUSH); - if (rc < 0) { - pr_err("%s: flush cmd failed rc=%d\n", - __func__, rc); - return rc; - } - rc = wait_event_timeout(the_locks.flush_wait, - prtd->cmd_ack, 5 * HZ); - if (!rc) - pr_err("Flush cmd timeout\n"); - prtd->pcm_irq_pos = 0; - } - break; - case SNDRV_COMPRESS_DRAIN: - pr_debug("%s: SNDRV_COMPRESS_DRAIN\n", __func__); - if (atomic_read(&prtd->pending_buffer)) { - pr_debug("%s: no pending writes, drain would block\n", - __func__); - return -EWOULDBLOCK; - } - - atomic_set(&prtd->eos, 1); - atomic_set(&prtd->pending_buffer, 0); - prtd->cmd_ack = 0; - q6asm_cmd_nowait(prtd->audio_client, CMD_EOS); - /* Wait indefinitely for DRAIN. Flush can also signal this*/ - rc = wait_event_interruptible(the_locks.eos_wait, - (prtd->cmd_ack || prtd->cmd_interrupt)); - - if (rc < 0) - pr_err("EOS cmd interrupted\n"); - pr_debug("%s: SNDRV_COMPRESS_DRAIN out of wait\n", __func__); - - if (prtd->cmd_interrupt) - rc = -EINTR; - - prtd->cmd_interrupt = 0; - return rc; - default: - break; - } - return snd_pcm_lib_ioctl(substream, cmd, arg); -} -#ifdef CONFIG_COMPAT -struct snd_enc_wma32 { - u32 super_block_align; /* WMA Type-specific data */ - u32 encodeopt1; - u32 encodeopt2; -}; - -struct snd_enc_vorbis32 { - s32 quality; - u32 managed; - u32 max_bit_rate; - u32 min_bit_rate; - u32 downmix; -}; - -struct snd_enc_real32 { - u32 quant_bits; - u32 start_region; - u32 num_regions; -}; - -struct snd_enc_flac32 { - u32 num; - u32 gain; -}; - -struct snd_enc_generic32 { - u32 bw; /* encoder bandwidth */ - s32 reserved[15]; -}; -struct snd_dec_ddp32 { - u32 params_length; - u32 params_id[18]; - u32 params_value[18]; -}; - -union snd_codec_options32 { - struct snd_enc_wma32 wma; - struct snd_enc_vorbis32 vorbis; - struct snd_enc_real32 real; - struct snd_enc_flac32 flac; - struct snd_enc_generic32 generic; - struct snd_dec_ddp32 ddp; -}; - -struct snd_codec32 { - u32 id; - u32 ch_in; - u32 ch_out; - u32 sample_rate; - u32 bit_rate; - u32 rate_control; - u32 profile; - u32 level; - u32 ch_mode; - u32 format; - u32 align; - union snd_codec_options32 options; - u32 reserved[3]; -}; - -struct snd_compressed_buffer32 { - u32 fragment_size; - u32 fragments; -}; - -struct snd_compr_params32 { - struct snd_compressed_buffer32 buffer; - struct snd_codec32 codec; - u8 no_wake_mode; -}; - -struct snd_compr_caps32 { - u32 num_codecs; - u32 direction; - u32 min_fragment_size; - u32 max_fragment_size; - u32 min_fragments; - u32 max_fragments; - u32 codecs[MAX_NUM_CODECS]; - u32 reserved[11]; -}; -struct snd_compr_tstamp32 { - u32 byte_offset; - u32 copied_total; - compat_ulong_t pcm_frames; - compat_ulong_t pcm_io_frames; - u32 sampling_rate; - compat_u64 timestamp; -}; -enum { - SNDRV_COMPRESS_TSTAMP32 = _IOR('C', 0x20, struct snd_compr_tstamp32), - SNDRV_COMPRESS_GET_CAPS32 = _IOWR('C', 0x10, struct snd_compr_caps32), - SNDRV_COMPRESS_SET_PARAMS32 = - _IOW('C', 0x12, struct snd_compr_params32), -}; -static int msm_compr_compat_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - int err = 0; - switch (cmd) { - case SNDRV_COMPRESS_TSTAMP32: { - struct snd_compr_tstamp tstamp; - struct snd_compr_tstamp32 tstamp32; - memset(&tstamp, 0, sizeof(tstamp)); - memset(&tstamp32, 0, sizeof(tstamp32)); - cmd = SNDRV_COMPRESS_TSTAMP; - err = msm_compr_ioctl_shared(substream, cmd, &tstamp); - if (err) { - pr_err("%s: COMPRESS_TSTAMP failed rc %d\n", - __func__, err); - goto bail_out; - } - tstamp32.byte_offset = tstamp.byte_offset; - tstamp32.copied_total = tstamp.copied_total; - tstamp32.pcm_frames = tstamp.pcm_frames; - tstamp32.pcm_io_frames = tstamp.pcm_io_frames; - tstamp32.sampling_rate = tstamp.sampling_rate; - tstamp32.timestamp = tstamp.timestamp; - if (copy_to_user(arg, &tstamp32, sizeof(tstamp32))) { - pr_err("%s: copytouser failed COMPRESS_TSTAMP32\n", - __func__); - err = -EFAULT; - } - break; - } - case SNDRV_COMPRESS_GET_CAPS32: { - struct snd_compr_caps caps; - struct snd_compr_caps32 caps32; - u32 i; - memset(&caps, 0, sizeof(caps)); - memset(&caps32, 0, sizeof(caps32)); - cmd = SNDRV_COMPRESS_GET_CAPS; - err = msm_compr_ioctl_shared(substream, cmd, &caps); - if (err) { - pr_err("%s: GET_CAPS failed rc %d\n", - __func__, err); - goto bail_out; - } - pr_debug("SNDRV_COMPRESS_GET_CAPS_32\n"); - if (!err && caps.num_codecs >= MAX_NUM_CODECS) { - pr_err("%s: Invalid number of codecs\n", __func__); - err = -EINVAL; - goto bail_out; - } - caps32.direction = caps.direction; - caps32.max_fragment_size = caps.max_fragment_size; - caps32.max_fragments = caps.max_fragments; - caps32.min_fragment_size = caps.min_fragment_size; - caps32.num_codecs = caps.num_codecs; - for (i = 0; i < caps.num_codecs; i++) - caps32.codecs[i] = caps.codecs[i]; - if (copy_to_user(arg, &caps32, sizeof(caps32))) { - pr_err("%s: copytouser failed COMPRESS_GETCAPS32\n", - __func__); - err = -EFAULT; - } - break; - } - case SNDRV_COMPRESS_SET_PARAMS32: { - struct snd_compr_params32 params32; - struct snd_compr_params params; - memset(¶ms32, 0 , sizeof(params32)); - memset(¶ms, 0 , sizeof(params)); - cmd = SNDRV_COMPRESS_SET_PARAMS; - if (copy_from_user(¶ms32, arg, sizeof(params32))) { - pr_err("%s: copyfromuser failed SET_PARAMS32\n", - __func__); - err = -EFAULT; - goto bail_out; - } - params.no_wake_mode = params32.no_wake_mode; - params.codec.id = params32.codec.id; - params.codec.ch_in = params32.codec.ch_in; - params.codec.ch_out = params32.codec.ch_out; - params.codec.sample_rate = params32.codec.sample_rate; - params.codec.bit_rate = params32.codec.bit_rate; - params.codec.rate_control = params32.codec.rate_control; - params.codec.profile = params32.codec.profile; - params.codec.level = params32.codec.level; - params.codec.ch_mode = params32.codec.ch_mode; - params.codec.format = params32.codec.format; - params.codec.align = params32.codec.align; - - switch (params.codec.id) { - case SND_AUDIOCODEC_WMA: - case SND_AUDIOCODEC_WMA_PRO: - params.codec.options.wma.encodeopt1 = - params32.codec.options.wma.encodeopt1; - params.codec.options.wma.encodeopt2 = - params32.codec.options.wma.encodeopt2; - params.codec.options.wma.super_block_align = - params32.codec.options.wma.super_block_align; - break; - case SND_AUDIOCODEC_VORBIS: - params.codec.options.vorbis.downmix = - params32.codec.options.vorbis.downmix; - params.codec.options.vorbis.managed = - params32.codec.options.vorbis.managed; - params.codec.options.vorbis.max_bit_rate = - params32.codec.options.vorbis.max_bit_rate; - params.codec.options.vorbis.min_bit_rate = - params32.codec.options.vorbis.min_bit_rate; - params.codec.options.vorbis.quality = - params32.codec.options.vorbis.quality; - break; - case SND_AUDIOCODEC_REAL: - params.codec.options.real.num_regions = - params32.codec.options.real.num_regions; - params.codec.options.real.quant_bits = - params32.codec.options.real.quant_bits; - params.codec.options.real.start_region = - params32.codec.options.real.start_region; - break; - case SND_AUDIOCODEC_FLAC: - params.codec.options.flac.gain = - params32.codec.options.flac.gain; - params.codec.options.flac.num = - params32.codec.options.flac.num; - break; - case SND_AUDIOCODEC_DTS: - case SND_AUDIOCODEC_DTS_PASS_THROUGH: - case SND_AUDIOCODEC_DTS_LBR: - case SND_AUDIOCODEC_DTS_LBR_PASS_THROUGH: - case SND_AUDIOCODEC_DTS_TRANSCODE_LOOPBACK: - break; - case SND_AUDIOCODEC_AC3: - case SND_AUDIOCODEC_EAC3: - params.codec.options.ddp.params_length = - params32.codec.options.ddp.params_length; - memcpy(params.codec.options.ddp.params_value, - params32.codec.options.ddp.params_value, - sizeof(params32.codec.options.ddp.params_value)); - memcpy(params.codec.options.ddp.params_id, - params32.codec.options.ddp.params_id, - sizeof(params32.codec.options.ddp.params_id)); - break; - default: - params.codec.options.generic.bw = - params32.codec.options.generic.bw; - break; - } - if (!err) - err = msm_compr_ioctl_shared(substream, cmd, ¶ms); - break; - } - default: - err = msm_compr_ioctl_shared(substream, cmd, arg); - } -bail_out: - return err; - -} -#endif -static int msm_compr_ioctl(struct snd_pcm_substream *substream, - unsigned int cmd, void *arg) -{ - int err = 0; - if (!substream) { - pr_err("%s: Invalid params\n", __func__); - return -EINVAL; - } - pr_debug("%s called with cmd = %d\n", __func__, cmd); - switch (cmd) { - case SNDRV_COMPRESS_TSTAMP: { - struct snd_compr_tstamp tstamp; - if (!arg) { - pr_err("%s: Invalid params Tstamp\n", __func__); - return -EINVAL; - } - err = msm_compr_ioctl_shared(substream, cmd, &tstamp); - if (err) - pr_err("%s: COMPRESS_TSTAMP failed rc %d\n", - __func__, err); - if (!err && copy_to_user(arg, &tstamp, sizeof(tstamp))) { - pr_err("%s: copytouser failed COMPRESS_TSTAMP\n", - __func__); - err = -EFAULT; - } - break; - } - case SNDRV_COMPRESS_GET_CAPS: { - struct snd_compr_caps cap; - if (!arg) { - pr_err("%s: Invalid params getcaps\n", __func__); - return -EINVAL; - } - pr_debug("SNDRV_COMPRESS_GET_CAPS\n"); - err = msm_compr_ioctl_shared(substream, cmd, &cap); - if (err) - pr_err("%s: GET_CAPS failed rc %d\n", - __func__, err); - if (!err && copy_to_user(arg, &cap, sizeof(cap))) { - pr_err("%s: copytouser failed GET_CAPS\n", - __func__); - err = -EFAULT; - } - break; - } - case SNDRV_COMPRESS_SET_PARAMS: { - struct snd_compr_params params; - if (!arg) { - pr_err("%s: Invalid params setparam\n", __func__); - return -EINVAL; - } - if (copy_from_user(¶ms, arg, - sizeof(struct snd_compr_params))) { - pr_err("%s: SET_PARAMS\n", __func__); - return -EFAULT; - } - err = msm_compr_ioctl_shared(substream, cmd, ¶ms); - if (err) - pr_err("%s: SET_PARAMS failed rc %d\n", - __func__, err); - break; - } - default: - err = msm_compr_ioctl_shared(substream, cmd, arg); - } - return err; -} - -static int msm_compr_restart(struct snd_pcm_substream *substream) -{ - struct snd_pcm_runtime *runtime = substream->runtime; - struct compr_audio *compr = runtime->private_data; - struct msm_audio *prtd = &compr->prtd; - struct audio_aio_write_param param; - struct audio_buffer *buf = NULL; - struct output_meta_data_st output_meta_data; - int time_stamp_flag = 0; - int buffer_length = 0; - - pr_debug("%s, trigger restart\n", __func__); - - if (runtime->render_flag & SNDRV_RENDER_STOPPED) { - buf = prtd->audio_client->port[IN].buf; - pr_debug("%s:writing %d bytes of buffer[%d] to dsp 2\n", - __func__, prtd->pcm_count, prtd->out_head); - pr_debug("%s:writing buffer[%d] from 0x%08x\n", - __func__, prtd->out_head, - ((unsigned int)buf[0].phys - + (prtd->out_head * prtd->pcm_count))); - - if (runtime->tstamp_mode == SNDRV_PCM_TSTAMP_ENABLE) - time_stamp_flag = SET_TIMESTAMP; - else - time_stamp_flag = NO_TIMESTAMP; - memcpy(&output_meta_data, (char *)(buf->data + - prtd->out_head * prtd->pcm_count), - COMPRE_OUTPUT_METADATA_SIZE); - - buffer_length = output_meta_data.frame_size; - pr_debug("meta_data_length: %d, frame_length: %d\n", - output_meta_data.meta_data_length, - output_meta_data.frame_size); - pr_debug("timestamp_msw: %d, timestamp_lsw: %d\n", - output_meta_data.timestamp_msw, - output_meta_data.timestamp_lsw); - - param.paddr = (unsigned long)buf[0].phys - + (prtd->out_head * prtd->pcm_count) - + output_meta_data.meta_data_length; - param.len = buffer_length; - param.msw_ts = output_meta_data.timestamp_msw; - param.lsw_ts = output_meta_data.timestamp_lsw; - param.flags = time_stamp_flag; - param.uid = prtd->session_id; - if (q6asm_async_write(prtd->audio_client, - ¶m) < 0) - pr_err("%s:q6asm_async_write failed\n", - __func__); - else - prtd->out_head = - (prtd->out_head + 1) & (runtime->periods - 1); - - runtime->render_flag &= ~SNDRV_RENDER_STOPPED; - return 0; - } - return 0; -} - -static int msm_compr_volume_ctl_put(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int rc = 0; - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct snd_pcm_substream *substream = - vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - struct msm_audio *prtd; - int volume = ucontrol->value.integer.value[0]; - - pr_debug("%s: volume : %x\n", __func__, volume); - if (!substream) - return -ENODEV; - if (!substream->runtime) - return 0; - prtd = substream->runtime->private_data; - if (prtd) - rc = compressed_set_volume(prtd, volume); - - return rc; -} - -static int msm_compr_volume_ctl_get(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - struct snd_pcm_volume *vol = snd_kcontrol_chip(kcontrol); - struct snd_pcm_substream *substream = - vol->pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream; - struct msm_audio *prtd; - - pr_debug("%s\n", __func__); - if (!substream) - return -ENODEV; - if (!substream->runtime) - return 0; - prtd = substream->runtime->private_data; - if (prtd) - ucontrol->value.integer.value[0] = prtd->volume; - return 0; -} - -static int msm_compr_add_controls(struct snd_soc_pcm_runtime *rtd) -{ - int ret = 0; - struct snd_pcm *pcm = rtd->pcm; - struct snd_pcm_volume *volume_info; - struct snd_kcontrol *kctl; - - dev_dbg(rtd->dev, "%s, Volume cntrl add\n", __func__); - ret = snd_pcm_add_volume_ctls(pcm, SNDRV_PCM_STREAM_PLAYBACK, - NULL, 1, rtd->dai_link->be_id, - &volume_info); - if (ret < 0) - return ret; - kctl = volume_info->kctl; - kctl->put = msm_compr_volume_ctl_put; - kctl->get = msm_compr_volume_ctl_get; - kctl->tlv.p = compr_rx_vol_gain; - return 0; -} - -static struct snd_pcm_ops msm_compr_ops = { - .open = msm_compr_open, - .hw_params = msm_compr_hw_params, - .close = msm_compr_close, - .ioctl = msm_compr_ioctl, - .prepare = msm_compr_prepare, - .trigger = msm_compr_trigger, - .pointer = msm_compr_pointer, - .mmap = msm_compr_mmap, - .restart = msm_compr_restart, -#ifdef CONFIG_COMPAT - .compat_ioctl = msm_compr_compat_ioctl, -#endif -}; - -static int msm_asoc_pcm_new(struct snd_soc_pcm_runtime *rtd) -{ - struct snd_card *card = rtd->card->snd_card; - int ret = 0; - - if (!card->dev->coherent_dma_mask) - card->dev->coherent_dma_mask = DMA_BIT_MASK(32); - - ret = msm_compr_add_controls(rtd); - if (ret) - pr_err("%s, kctl add failed\n", __func__); - return ret; -} - -static struct snd_soc_platform_driver msm_soc_platform = { - .ops = &msm_compr_ops, - .pcm_new = msm_asoc_pcm_new, -}; - -static int msm_compr_probe(struct platform_device *pdev) -{ - - dev_info(&pdev->dev, "%s: dev name %s\n", - __func__, dev_name(&pdev->dev)); - - return snd_soc_register_platform(&pdev->dev, - &msm_soc_platform); -} - -static int msm_compr_remove(struct platform_device *pdev) -{ - snd_soc_unregister_platform(&pdev->dev); - return 0; -} - -static const struct of_device_id msm_compr_dt_match[] = { - {.compatible = "qcom,msm-compr-dsp"}, - {} -}; -MODULE_DEVICE_TABLE(of, msm_compr_dt_match); - -static struct platform_driver msm_compr_driver = { - .driver = { - .name = "msm-compr-dsp", - .owner = THIS_MODULE, - .of_match_table = msm_compr_dt_match, - }, - .probe = msm_compr_probe, - .remove = msm_compr_remove, -}; - -static int __init msm_soc_platform_init(void) -{ - init_waitqueue_head(&the_locks.enable_wait); - init_waitqueue_head(&the_locks.eos_wait); - init_waitqueue_head(&the_locks.write_wait); - init_waitqueue_head(&the_locks.read_wait); - init_waitqueue_head(&the_locks.flush_wait); - - return platform_driver_register(&msm_compr_driver); -} -module_init(msm_soc_platform_init); - -static void __exit msm_soc_platform_exit(void) -{ - platform_driver_unregister(&msm_compr_driver); -} -module_exit(msm_soc_platform_exit); - -MODULE_DESCRIPTION("PCM module platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.h b/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.h deleted file mode 100644 index d6e3ec6956b1b..0000000000000 --- a/sound/soc/msm/qdsp6v2/msm-compr-q6-v2.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2012, 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. - */ - -#ifndef _MSM_COMPR_H -#define _MSM_COMPR_H -#include -#include -#include -#include -#include - -#include "msm-pcm-q6-v2.h" - -struct compr_info { - struct snd_compr_caps compr_cap; - struct snd_compr_codec_caps codec_caps; - struct snd_compr_params codec_param; -}; - -struct compr_audio { - struct msm_audio prtd; - struct compr_info info; - uint32_t codec; -}; - -#endif /*_MSM_COMPR_H*/ diff --git a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c index f314de4101c98..3dd0ea1692db2 100644 --- a/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-compress-q6-v2.c @@ -42,8 +42,6 @@ #include #include #include -#include - #include "msm-pcm-routing-v2.h" #define DSP_PP_BUFFERING_IN_MSEC 25 @@ -63,6 +61,7 @@ #define COMPR_PLAYBACK_MAX_FRAGMENT_SIZE (128 * 1024) #define COMPR_PLAYBACK_MIN_NUM_FRAGMENTS (4) #define COMPR_PLAYBACK_MAX_NUM_FRAGMENTS (16 * 4) +#define COMPR_PLAYBACK_DSP_FRAGMENT_SIZE (32 * 1024) #define COMPRESSED_LR_VOL_MAX_STEPS 0x2000 const DECLARE_TLV_DB_LINEAR(msm_compr_vol_gain, 0, @@ -81,15 +80,6 @@ const DECLARE_TLV_DB_LINEAR(msm_compr_vol_gain, 0, #define MAX_NUMBER_OF_STREAMS 2 -/* - * Max size for getting DTS EAGLE Param through kcontrol - * Safe for both 32 and 64 bit platforms - * 64 = size of kcontrol value array on 64 bit platform - * 4 = size of parameters Eagle expects before cast to 64 bits - * 40 = size of dts_eagle_param_desc + module_id cast to 64 bits - */ -#define DTS_EAGLE_MAX_PARAM_SIZE_FOR_ALSA ((64 * 4) - 40) - struct msm_compr_gapless_state { bool set_next_stream_id; int32_t stream_opened[MAX_NUMBER_OF_STREAMS]; @@ -172,6 +162,11 @@ struct msm_compr_audio { wait_queue_head_t close_wait; wait_queue_head_t wait_for_stream_avail; + uint32_t dsp_fragment_size; + uint32_t dsp_fragments; + uint32_t dsp_fragment_ratio; + uint32_t dsp_fragments_sent; + spinlock_t lock; }; @@ -274,11 +269,6 @@ static int msm_compr_set_volume(struct snd_compr_stream *cstream, if (rc < 0) pr_err("%s: Send vol gain command failed rc=%d\n", __func__, rc); - else - if (msm_dts_eagle_set_stream_gain(prtd->audio_client, - volume_l, volume_r)) - pr_debug("%s: DTS_EAGLE send stream gain failed\n", - __func__); return rc; } @@ -328,10 +318,22 @@ static int msm_compr_send_buffer(struct msm_compr_audio *prtd) prtd->gapless_state.initial_samples_drop, prtd->gapless_state.trailing_samples_drop); - buffer_length = prtd->codec_param.buffer.fragment_size; bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < prtd->codec_param.buffer.fragment_size) + + + if (bytes_available < prtd->dsp_fragment_size) buffer_length = bytes_available; + else if (bytes_available > prtd->cstream->runtime->fragment_size) + buffer_length = prtd->cstream->runtime->fragment_size; + else { + /* + * do_div divides in place and bytes_available is modified + * to the quotient after the division. Essentially, write + * the remaining data in dsp_fragment_size'd chunks + */ + do_div(bytes_available, prtd->dsp_fragment_size); + buffer_length = bytes_available * prtd->dsp_fragment_size; + } if (prtd->byte_offset + buffer_length > prtd->buffer_size) { buffer_length = (prtd->buffer_size - prtd->byte_offset); @@ -419,7 +421,11 @@ static void compr_event_handler(uint32_t opcode, if (prtd->byte_offset >= prtd->buffer_size) prtd->byte_offset -= prtd->buffer_size; - snd_compr_fragment_elapsed(cstream); + prtd->dsp_fragments_sent += token / prtd->dsp_fragment_size; + if (prtd->dsp_fragments_sent >= prtd->dsp_fragment_ratio) { + snd_compr_fragment_elapsed(cstream); + prtd->dsp_fragments_sent = 0; + } if (!atomic_read(&prtd->start)) { /* Writes must be restarted from _copy() */ @@ -430,7 +436,7 @@ static void compr_event_handler(uint32_t opcode, } bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < cstream->runtime->fragment_size) { + if (bytes_available < prtd->dsp_fragment_size) { pr_debug("WRITE_DONE Insufficient data to send. break out\n"); atomic_set(&prtd->xrun, 1); @@ -442,8 +448,8 @@ static void compr_event_handler(uint32_t opcode, wake_up(&prtd->drain_wait); atomic_set(&prtd->drain, 0); } - } else if ((bytes_available == cstream->runtime->fragment_size) - && atomic_read(&prtd->drain)) { + } else if ((bytes_available == prtd->dsp_fragment_size) + && atomic_read(&prtd->drain)) { prtd->last_buffer = 1; msm_compr_send_buffer(prtd); prtd->last_buffer = 0; @@ -507,7 +513,7 @@ static void compr_event_handler(uint32_t opcode, spin_lock_irqsave(&prtd->lock, flags); if (!prtd->bytes_sent) { bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available < cstream->runtime->fragment_size) { + if (bytes_available < prtd->dsp_fragment_size) { pr_debug("CMD_RUN_V2 Insufficient data to send. break out\n"); atomic_set(&prtd->xrun, 1); } else @@ -899,26 +905,6 @@ static int msm_compr_init_pp_params(struct snd_compr_stream *cstream, }; switch (ac->topology) { - case ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS: /* HPX + SA+ topology */ - - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_1); - if (ret < 0) - pr_err("%s: Send SoftVolume Param failed ret=%d\n", - __func__, ret); - - ret = q6asm_set_softvolume_v2(ac, &softvol, - SOFT_VOLUME_INSTANCE_2); - if (ret < 0) - pr_err("%s: Send SoftVolume2 Param failed ret=%d\n", - __func__, ret); - /* - * HPX module init is trigerred from HAL using ioctl - * DTS_EAGLE_MODULE_ENABLE when stream starts - */ - break; - case ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX: /* HPX topology */ - break; default: ret = q6asm_set_softvolume_v2(ac, &softvol, SOFT_VOLUME_INSTANCE_1); @@ -1041,12 +1027,38 @@ static int msm_compr_configure_dsp(struct snd_compr_stream *cstream) runtime->fragments = prtd->codec_param.buffer.fragments; runtime->fragment_size = prtd->codec_param.buffer.fragment_size; + + /* use smaller DSP fragments to ease gapless transition by reducing the + * minimum amount of data necessary to start DSP decoding + */ + if (runtime->fragment_size < COMPR_PLAYBACK_DSP_FRAGMENT_SIZE) { + prtd->dsp_fragment_size = runtime->fragment_size; + } else if ((runtime->fragment_size % + COMPR_PLAYBACK_DSP_FRAGMENT_SIZE) != 0) { + prtd->dsp_fragment_size = runtime->fragment_size; + pr_debug("%s: runtime fragment size %d is not a multiple of %d\n", + __func__, runtime->fragment_size, + COMPR_PLAYBACK_DSP_FRAGMENT_SIZE); + } else { + prtd->dsp_fragment_size = COMPR_PLAYBACK_DSP_FRAGMENT_SIZE; + } + prtd->dsp_fragment_ratio = runtime->fragment_size / + prtd->dsp_fragment_size; + prtd->dsp_fragments = runtime->fragments * + prtd->dsp_fragment_ratio; + + if (prtd->dsp_fragments > COMPR_PLAYBACK_MAX_NUM_FRAGMENTS) { + pr_err("%s: Invalid fragment count: %d", __func__, + prtd->dsp_fragments); + return -EINVAL; + } + pr_debug("allocate %d buffers each of size %d\n", runtime->fragments, runtime->fragment_size); ret = q6asm_audio_client_buf_alloc_contiguous(dir, ac, - runtime->fragment_size, - runtime->fragments); + prtd->dsp_fragment_size, + prtd->dsp_fragments); if (ret < 0) { pr_err("Audio Start: Buffer Allocation failed rc = %d\n", ret); return -ENOMEM; @@ -1057,6 +1069,7 @@ static int msm_compr_configure_dsp(struct snd_compr_stream *cstream) prtd->app_pointer = 0; prtd->bytes_received = 0; prtd->bytes_sent = 0; + prtd->dsp_fragments_sent = 0; prtd->buffer = ac->port[dir].buf[0].data; prtd->buffer_paddr = ac->port[dir].buf[0].phys; prtd->buffer_size = runtime->fragments * runtime->fragment_size; @@ -1253,6 +1266,7 @@ static int msm_compr_free(struct snd_compr_stream *cstream) kfree(pdata->dec_params[soc_prtd->dai_link->be_id]); pdata->dec_params[soc_prtd->dai_link->be_id] = NULL; kfree(prtd); + runtime->private_data = NULL; return 0; } @@ -1601,6 +1615,7 @@ static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) prtd->bytes_received = 0; prtd->bytes_sent = 0; prtd->marker_timestamp = 0; + prtd->dsp_fragments_sent = 0; atomic_set(&prtd->xrun, 0); spin_unlock_irqrestore(&prtd->lock, flags); @@ -1661,8 +1676,8 @@ static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) */ bytes_to_write = prtd->bytes_received - prtd->copied_total; - WARN(bytes_to_write > runtime->fragment_size, - "last write %d cannot be > than fragment_size", + WARN(bytes_to_write > prtd->dsp_fragment_size, + "last write %d cannot be > than dsp_fragment_size", bytes_to_write); if (bytes_to_write > 0) { @@ -1742,7 +1757,7 @@ static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) if (atomic_read(&prtd->eos)) prtd->gapless_state.gapless_transition = 1; prtd->marker_timestamp = 0; - + prtd->dsp_fragments_sent = 0; /* Don't reset these as these vars map to total_bytes_transferred and total_bytes_available @@ -1836,6 +1851,7 @@ static int msm_compr_trigger(struct snd_compr_stream *cstream, int cmd) prtd->app_pointer = 0; prtd->first_buffer = 1; prtd->last_buffer = 0; + prtd->dsp_fragments_sent = 0; atomic_set(&prtd->drain, 0); atomic_set(&prtd->xrun, 1); spin_unlock_irqrestore(&prtd->lock, flags); @@ -1983,20 +1999,25 @@ static int msm_compr_pointer(struct snd_compr_stream *cstream, gapless_transition = prtd->gapless_state.gapless_transition; spin_unlock_irqrestore(&prtd->lock, flags); + if (gapless_transition) + pr_debug("%s session time in gapless transition", + __func__); + /* - Query timestamp from DSP if some data is with it. - This prevents timeouts. + - Do not query if no buffer has been given. + - Do not query on a gapless transition. + Playback for the 2nd stream can start (thus returning time + starting from 0) before the driver knows about EOS of first stream. */ - if (!first_buffer || gapless_transition) { - if (gapless_transition) - pr_debug("%s session time in gapless transition", - __func__); + + if (!first_buffer && !gapless_transition) { if (pdata->use_legacy_api) rc = q6asm_get_session_time_legacy(prtd->audio_client, - ×tamp); + &prtd->marker_timestamp); else rc = q6asm_get_session_time(prtd->audio_client, - ×tamp); + &prtd->marker_timestamp); + if (rc < 0) { pr_err("%s: Get Session Time return value =%lld\n", __func__, timestamp); @@ -2005,9 +2026,8 @@ static int msm_compr_pointer(struct snd_compr_stream *cstream, else return -EAGAIN; } - } else { - timestamp = prtd->marker_timestamp; } + timestamp = prtd->marker_timestamp; /* DSP returns timestamp in usec */ pr_debug("%s: timestamp = %lld usec\n", __func__, timestamp); @@ -2106,7 +2126,8 @@ static int msm_compr_copy(struct snd_compr_stream *cstream, /* * If stream is started and there has been an xrun, - * since the available bytes fits fragment_size, copy the data right away + * since the available bytes fits dsp_fragment_size, + * copy the data right away */ spin_lock_irqsave(&prtd->lock, flags); prtd->bytes_received += count; @@ -2114,7 +2135,7 @@ static int msm_compr_copy(struct snd_compr_stream *cstream, if (atomic_read(&prtd->xrun)) { pr_debug("%s: in xrun, count = %zd\n", __func__, count); bytes_available = prtd->bytes_received - prtd->copied_total; - if (bytes_available >= runtime->fragment_size) { + if (bytes_available >= prtd->dsp_fragment_size) { pr_debug("%s: handle xrun, bytes_to_write = %llu\n", __func__, bytes_available); @@ -2420,23 +2441,6 @@ static int msm_compr_audio_effects_config_put(struct snd_kcontrol *kcontrol, &(audio_effects->equalizer), values); break; - case DTS_EAGLE_MODULE: - pr_debug("%s: DTS_EAGLE_MODULE\n", __func__); - if (!msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - return 0; - msm_dts_eagle_handle_asm(NULL, (void *)values, true, - false, prtd->audio_client, NULL); - break; - case DTS_EAGLE_MODULE_ENABLE: - pr_debug("%s: DTS_EAGLE_MODULE_ENABLE\n", __func__); - if (msm_audio_effects_is_effmodule_supp_in_top(effects_module, - prtd->audio_client->topology)) - msm_dts_eagle_enable_asm(prtd->audio_client, - (bool)values[0], - AUDPROC_MODULE_ID_DTS_HPX_PREMIX); - - break; case SOFT_VOLUME_MODULE: pr_debug("%s: SOFT_VOLUME_MODULE\n", __func__); break; @@ -2465,7 +2469,6 @@ static int msm_compr_audio_effects_config_get(struct snd_kcontrol *kcontrol, struct msm_compr_audio_effects *audio_effects = NULL; struct snd_compr_stream *cstream = NULL; struct msm_compr_audio *prtd = NULL; - long *values = &(ucontrol->value.integer.value[0]); pr_debug("%s\n", __func__); if (fe_id >= MSM_FRONTEND_DAI_MAX) { @@ -2485,28 +2488,6 @@ static int msm_compr_audio_effects_config_get(struct snd_kcontrol *kcontrol, return -EINVAL; } - switch (audio_effects->query.mod_id) { - case DTS_EAGLE_MODULE: - pr_debug("%s: DTS_EAGLE_MODULE handling queued get\n", - __func__); - values[0] = (long)audio_effects->query.mod_id; - values[1] = (long)audio_effects->query.parm_id; - values[2] = (long)audio_effects->query.size; - values[3] = (long)audio_effects->query.offset; - values[4] = (long)audio_effects->query.device; - if (values[2] > DTS_EAGLE_MAX_PARAM_SIZE_FOR_ALSA) { - pr_err("%s: DTS_EAGLE_MODULE parameter's requested size (%li) too large (max size is %i)\n", - __func__, values[2], - DTS_EAGLE_MAX_PARAM_SIZE_FOR_ALSA); - return -EINVAL; - } - msm_dts_eagle_handle_asm(NULL, (void *)&values[1], - true, true, prtd->audio_client, NULL); - break; - default: - pr_err("%s: Invalid effects config module\n", __func__); - return -EINVAL; - } return 0; } diff --git a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c index 76bce5fff50d6..f5c265e139792 100644 --- a/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-dai-q6-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -1714,6 +1714,11 @@ static int msm_dai_q6_set_channel_map(struct snd_soc_dai *dai, pr_err("%s: rx slot not found\n", __func__); return -EINVAL; } + if (rx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { + pr_err("%s: invalid rx num %d\n", __func__, rx_num); + return -EINVAL; + } + for (i = 0; i < rx_num; i++) { dai_data->port_config.slim_sch.shared_ch_mapping[i] = rx_slot[i]; @@ -1744,6 +1749,11 @@ static int msm_dai_q6_set_channel_map(struct snd_soc_dai *dai, pr_err("%s: tx slot not found\n", __func__); return -EINVAL; } + if (tx_num > AFE_PORT_MAX_AUDIO_CHAN_CNT) { + pr_err("%s: invalid tx num %d\n", __func__, tx_num); + return -EINVAL; + } + for (i = 0; i < tx_num; i++) { dai_data->port_config.slim_sch.shared_ch_mapping[i] = tx_slot[i]; diff --git a/sound/soc/msm/qdsp6v2/msm-dai-slim.c b/sound/soc/msm/qdsp6v2/msm-dai-slim.c index b46d0a53adc2f..4bb8f59c27e99 100644 --- a/sound/soc/msm/qdsp6v2/msm-dai-slim.c +++ b/sound/soc/msm/qdsp6v2/msm-dai-slim.c @@ -482,7 +482,9 @@ static void msm_dai_slim_remove_dai_data( dai_data_t = &drv_data->slim_dai_data[i]; kfree(dai_data_t->chan_h); + dai_data_t->chan_h = NULL; kfree(dai_data_t->sh_ch); + dai_data_t->sh_ch = NULL; } } diff --git a/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c b/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c index bb0f890d300f5..8fc1825b903df 100644 --- a/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c +++ b/sound/soc/msm/qdsp6v2/msm-dolby-dap-config.c @@ -1,4 +1,6 @@ -/* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. +/* +* Copyright (c) 2013-2014, 2016-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. @@ -18,6 +20,10 @@ #include "msm-dolby-dap-config.h" +#ifndef DOLBY_PARAM_VCNB_MAX_LENGTH +#define DOLBY_PARAM_VCNB_MAX_LENGTH 40 +#endif + /* dolby endp based parameters */ struct dolby_dap_endp_params_s { int device; @@ -677,7 +683,7 @@ int msm_dolby_dap_param_to_set_control_put(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { int rc = 0, port_id, copp_idx; - uint32_t idx, j; + uint32_t idx, j, current_offset; uint32_t device = ucontrol->value.integer.value[0]; uint32_t param_id = ucontrol->value.integer.value[1]; uint32_t offset = ucontrol->value.integer.value[2]; @@ -754,6 +760,19 @@ int msm_dolby_dap_param_to_set_control_put(struct snd_kcontrol *kcontrol, default: { /* cache the parameters */ dolby_dap_params_modified[idx] += 1; + current_offset = dolby_dap_params_offset[idx] + offset; + if (current_offset >= TOTAL_LENGTH_DOLBY_PARAM) { + pr_err("%s: invalid offset %d at idx %d\n", + __func__, offset, idx); + return -EINVAL; + } + if ((0 == length) || (current_offset + length - 1 + < current_offset) || (current_offset + length + > TOTAL_LENGTH_DOLBY_PARAM)) { + pr_err("%s: invalid length %d at idx %d\n", + __func__, length, idx); + return -EINVAL; + } dolby_dap_params_length[idx] = length; pr_debug("%s: param recvd deviceId=0x%x paramId=0x%x offset=%d length=%d\n", __func__, device, param_id, offset, length); @@ -799,7 +818,11 @@ int msm_dolby_dap_param_to_get_control_get(struct snd_kcontrol *kcontrol, __func__, copp_idx); return -EINVAL; } - params_value = kzalloc(params_length, GFP_KERNEL); + if (dolby_dap_params_get.length > 128 - DOLBY_PARAM_PAYLOAD_SIZE) { + pr_err("%s: Incorrect parameter length", __func__); + return -EINVAL; + } + params_value = kzalloc(params_length + param_payload_len, GFP_KERNEL); if (!params_value) { pr_err("%s, params memory alloc failed\n", __func__); return -ENOMEM; @@ -818,8 +841,7 @@ int msm_dolby_dap_param_to_get_control_get(struct snd_kcontrol *kcontrol, pr_err("%s: invalid param id to set", __func__); rc = -EINVAL; } else { - params_length = (dolby_dap_params_length[i] + - DOLBY_PARAM_PAYLOAD_SIZE) * + params_length = dolby_dap_params_length[i] * sizeof(uint32_t); rc = adm_get_params(port_id, copp_idx, DOLBY_BUNDLE_MODULE_ID, @@ -896,6 +918,11 @@ int msm_dolby_dap_param_visualizer_control_get(struct snd_kcontrol *kcontrol, uint32_t param_payload_len = DOLBY_PARAM_PAYLOAD_SIZE * sizeof(uint32_t); int port_id, copp_idx, idx; + if (length > DOLBY_PARAM_VCNB_MAX_LENGTH || length <= 0) { + pr_err("%s Incorrect VCNB length", __func__); + ucontrol->value.integer.value[0] = 0; + return -EINVAL; + } for (idx = 0; idx < AFE_MAX_PORTS; idx++) { port_id = dolby_dap_params_states.port_id[idx]; copp_idx = dolby_dap_params_states.copp_idx[idx]; diff --git a/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c b/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c index ad2f2e9865c3e..c10bfaf071620 100644 --- a/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c +++ b/sound/soc/msm/qdsp6v2/msm-ds2-dap-config.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2013-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. @@ -198,7 +198,8 @@ static void msm_ds2_dap_check_and_update_ramp_wait(int port_id, int copp_idx, uint32_t param_payload_len = PARAM_PAYLOAD_SIZE * sizeof(uint32_t); int rc = 0; - update_params_value = kzalloc(params_length, GFP_KERNEL); + update_params_value = kzalloc(params_length + param_payload_len, + GFP_KERNEL); if (!update_params_value) { pr_err("%s: params memory alloc failed\n", __func__); goto end; @@ -1642,6 +1643,7 @@ static int msm_ds2_dap_param_visualizer_control_get(u32 cmd, void *arg) ret = 0; dolby_data->length = 0; pr_err("%s Incorrect VCNB length", __func__); + return -EINVAL; } params_length = (2*length + DOLBY_VIS_PARAM_HEADER_SIZE) * diff --git a/sound/soc/msm/qdsp6v2/msm-dts-eagle.c b/sound/soc/msm/qdsp6v2/msm-dts-eagle.c deleted file mode 100644 index 7a23a170be67d..0000000000000 --- a/sound/soc/msm/qdsp6v2/msm-dts-eagle.c +++ /dev/null @@ -1,1624 +0,0 @@ -/* Copyright (c) 2014-2016, 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 -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "msm-pcm-routing-v2.h" - -#define ION_MEM_SIZE 131072 -#define DEPC_MAX_SIZE 524288 - -#define MPST AUDPROC_MODULE_ID_DTS_HPX_POSTMIX -#define MPRE AUDPROC_MODULE_ID_DTS_HPX_PREMIX - -#define eagle_vol_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_VOLUME: " fmt "\n", ##__VA_ARGS__) -#define eagle_vol_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_VOLUME: " fmt "\n", ##__VA_ARGS__) -#define eagle_drv_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER: " fmt "\n", ##__VA_ARGS__) -#define eagle_drv_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER: " fmt "\n", ##__VA_ARGS__) -#define eagle_precache_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_SENDCACHE_PRE: " fmt "\n", ##__VA_ARGS__) -#define eagle_precache_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_SENDCACHE_PRE: " fmt "\n", ##__VA_ARGS__) -#define eagle_postcache_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_SENDCACHE_POST: " fmt "\n", ##__VA_ARGS__) -#define eagle_postcache_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_SENDCACHE_POST: " fmt "\n", ##__VA_ARGS__) -#define eagle_ioctl_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_IOCTL: " fmt "\n", ##__VA_ARGS__) -#define eagle_ioctl_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_IOCTL: " fmt "\n", ##__VA_ARGS__) -#define eagle_asm_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_ASM: " fmt "\n", ##__VA_ARGS__) -#define eagle_asm_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_ASM: " fmt "\n", ##__VA_ARGS__) -#define eagle_adm_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_DRIVER_ADM: " fmt "\n", ##__VA_ARGS__) -#define eagle_adm_err(fmt, ...) \ - pr_err("DTS_EAGLE_DRIVER_ADM: " fmt "\n", ##__VA_ARGS__) -#define eagle_enable_dbg(fmt, ...) \ - pr_debug("DTS_EAGLE_ENABLE: " fmt "\n", ##__VA_ARGS__) -#define eagle_enable_err(fmt, ...) \ - pr_err("DTS_EAGLE_ENABLE: " fmt "\n", ##__VA_ARGS__) -#define eagle_ioctl_info(fmt, ...) \ - pr_err("DTS_EAGLE_IOCTL: " fmt "\n", ##__VA_ARGS__) - -enum { - AUDIO_DEVICE_OUT_EARPIECE = 0, - AUDIO_DEVICE_OUT_SPEAKER, - AUDIO_DEVICE_OUT_WIRED_HEADSET, - AUDIO_DEVICE_OUT_WIRED_HEADPHONE, - AUDIO_DEVICE_OUT_BLUETOOTH_SCO, - AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET, - AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, - AUDIO_DEVICE_OUT_BLUETOOTH_A2DP, - AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES, - AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER, - AUDIO_DEVICE_OUT_AUX_DIGITAL, - AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET, - AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET, - AUDIO_DEVICE_OUT_USB_ACCESSORY, - AUDIO_DEVICE_OUT_USB_DEVICE, - AUDIO_DEVICE_OUT_REMOTE_SUBMIX, - AUDIO_DEVICE_OUT_ANC_HEADSET, - AUDIO_DEVICE_OUT_ANC_HEADPHONE, - AUDIO_DEVICE_OUT_PROXY, - AUDIO_DEVICE_OUT_FM, - AUDIO_DEVICE_OUT_FM_TX, - - AUDIO_DEVICE_OUT_COUNT -}; - -#define AUDIO_DEVICE_COMBO 0x400000 /* bit 23 */ - -enum { /* cache block */ - CB_0 = 0, - CB_1, - CB_2, - CB_3, - CB_4, - CB_5, - CB_6, - CB_7, - - CB_COUNT -}; - -enum { /* cache block description */ - CBD_DEV_MASK = 0, - CBD_OFFSG, - CBD_CMD0, - CBD_SZ0, - CBD_OFFS1, - CBD_CMD1, - CBD_SZ1, - CBD_OFFS2, - CBD_CMD2, - CBD_SZ2, - CBD_OFFS3, - CBD_CMD3, - CBD_SZ3, - - CBD_COUNT, -}; - -static s32 _fx_logN(s32 x) -{ - s32 t, y = 0xa65af; - if (x < 0x00008000) { - x <<= 16; y -= 0xb1721; } - if (x < 0x00800000) { - x <<= 8; y -= 0x58b91; } - if (x < 0x08000000) { - x <<= 4; y -= 0x2c5c8; } - if (x < 0x20000000) { - x <<= 2; y -= 0x162e4; } - if (x < 0x40000000) { - x <<= 1; y -= 0x0b172; } - t = x + (x >> 1); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x067cd; } - t = x + (x >> 2); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x03920; } - t = x + (x >> 3); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x01e27; } - t = x + (x >> 4); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x00f85; } - t = x + (x >> 5); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x007e1; } - t = x + (x >> 6); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x003f8; } - t = x + (x >> 7); - if ((t & 0x80000000) == 0) { - x = t; y -= 0x001fe; } - x = 0x80000000 - x; - y -= x >> 15; - return y; -} - -static inline void *_getd(struct dts_eagle_param_desc *depd) -{ - return (void *)(((char *)depd) + sizeof(struct dts_eagle_param_desc)); -} - -static int _ref_cnt; -/* dts eagle parameter cache */ -static char *_depc; -static u32 _depc_size; -static s32 _c_bl[CB_COUNT][CBD_COUNT]; -static u32 _device_primary; -static u32 _device_all; -/* ION states */ -static struct ion_client *_ion_client; -static struct ion_handle *_ion_handle; -static struct param_outband _po; -static struct audio_client *_ac_NT; -static struct ion_client *_ion_client_NT; -static struct ion_handle *_ion_handle_NT; -static struct param_outband _po_NT; - -#define SEC_BLOB_MAX_CNT 10 -#define SEC_BLOB_MAX_SIZE 0x4004 /*extra 4 for size*/ -static char *_sec_blob[SEC_BLOB_MAX_CNT]; - -/* multi-copp support */ -static int _cidx[AFE_MAX_PORTS] = {-1}; - -/* volume controls */ -#define VOL_CMD_CNT_MAX 10 -static u32 _vol_cmd_cnt; -static s32 **_vol_cmds; -struct vol_cmds_d { - s32 d[4]; -}; -static struct vol_cmds_d *_vol_cmds_d; -static const s32 _log10_10_inv_x20 = 0x0008af84; - -/* hpx master control */ -static u32 _is_hpx_enabled; - -static void _volume_cmds_free(void) -{ - int i; - for (i = 0; i < _vol_cmd_cnt; i++) - kfree(_vol_cmds[i]); - _vol_cmd_cnt = 0; - kfree(_vol_cmds); - kfree(_vol_cmds_d); - _vol_cmds = NULL; - _vol_cmds_d = NULL; -} - -static s32 _volume_cmds_alloc1(s32 size) -{ - _volume_cmds_free(); - _vol_cmd_cnt = size; - _vol_cmds = kzalloc(_vol_cmd_cnt * sizeof(int *), GFP_KERNEL); - if (_vol_cmds) { - _vol_cmds_d = kzalloc(_vol_cmd_cnt * sizeof(struct vol_cmds_d), - GFP_KERNEL); - } - if (_vol_cmds_d) - return 0; - _volume_cmds_free(); - return -ENOMEM; -} - -/* assumes size is equal or less than 0xFFF */ -static s32 _volume_cmds_alloc2(s32 idx, s32 size) -{ - kfree(_vol_cmds[idx]); - _vol_cmds[idx] = kzalloc(size, GFP_KERNEL); - if (_vol_cmds[idx]) - return 0; - _vol_cmds_d[idx].d[0] = 0; - return -ENOMEM; -} - -static void _init_cb_descs(void) -{ - int i; - for (i = 0; i < CB_COUNT; i++) { - _c_bl[i][CBD_DEV_MASK] = 0; - _c_bl[i][CBD_OFFSG] = _c_bl[i][CBD_OFFS1] = - _c_bl[i][CBD_OFFS2] = _c_bl[i][CBD_OFFS3] = - 0xFFFFFFFF; - _c_bl[i][CBD_CMD0] = _c_bl[i][CBD_SZ0] = - _c_bl[i][CBD_CMD1] = _c_bl[i][CBD_SZ1] = - _c_bl[i][CBD_CMD2] = _c_bl[i][CBD_SZ2] = - _c_bl[i][CBD_CMD3] = _c_bl[i][CBD_SZ3] = 0; - } -} - -static u32 _get_dev_mask_for_pid(int pid) -{ - switch (pid) { - case SLIMBUS_0_RX: - return (1 << AUDIO_DEVICE_OUT_EARPIECE) | - (1 << AUDIO_DEVICE_OUT_SPEAKER) | - (1 << AUDIO_DEVICE_OUT_WIRED_HEADSET) | - (1 << AUDIO_DEVICE_OUT_WIRED_HEADPHONE) | - (1 << AUDIO_DEVICE_OUT_ANC_HEADSET) | - (1 << AUDIO_DEVICE_OUT_ANC_HEADPHONE); - case INT_BT_SCO_RX: - return (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT); - case RT_PROXY_PORT_001_RX: - return (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER) | - (1 << AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) | - (1 << AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) | - (1 << AUDIO_DEVICE_OUT_USB_ACCESSORY) | - (1 << AUDIO_DEVICE_OUT_USB_DEVICE) | - (1 << AUDIO_DEVICE_OUT_PROXY); - case HDMI_RX: - return 1 << AUDIO_DEVICE_OUT_AUX_DIGITAL; - case INT_FM_RX: - return 1 << AUDIO_DEVICE_OUT_FM; - case INT_FM_TX: - return 1 << AUDIO_DEVICE_OUT_FM_TX; - default: - return 0; - } -} - -static int _get_pid_from_dev(u32 device) -{ - if (device & (1 << AUDIO_DEVICE_OUT_EARPIECE) || - device & (1 << AUDIO_DEVICE_OUT_SPEAKER) || - device & (1 << AUDIO_DEVICE_OUT_WIRED_HEADSET) || - device & (1 << AUDIO_DEVICE_OUT_WIRED_HEADPHONE) || - device & (1 << AUDIO_DEVICE_OUT_ANC_HEADSET) || - device & (1 << AUDIO_DEVICE_OUT_ANC_HEADPHONE)) { - return SLIMBUS_0_RX; - } else if (device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO) || - device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) || - device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT)) { - return INT_BT_SCO_RX; - } else if (device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) || - device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) || - device & (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER) || - device & (1 << AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) || - device & (1 << AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) || - device & (1 << AUDIO_DEVICE_OUT_USB_ACCESSORY) || - device & (1 << AUDIO_DEVICE_OUT_USB_DEVICE) || - device & (1 << AUDIO_DEVICE_OUT_PROXY)) { - return RT_PROXY_PORT_001_RX; - } else if (device & (1 << AUDIO_DEVICE_OUT_AUX_DIGITAL)) { - return HDMI_RX; - } else if (device & (1 << AUDIO_DEVICE_OUT_FM)) { - return INT_FM_RX; - } else if (device & (1 << AUDIO_DEVICE_OUT_FM_TX)) { - return INT_FM_TX; - } - return 0; -} - -static s32 _get_cb_for_dev(int device) -{ - s32 i; - if (device & AUDIO_DEVICE_COMBO) { - for (i = 0; i < CB_COUNT; i++) { - if ((_c_bl[i][CBD_DEV_MASK] & device) == device) - return i; - } - } else { - for (i = 0; i < CB_COUNT; i++) { - if ((_c_bl[i][CBD_DEV_MASK] & device) && - !(_c_bl[i][CBD_DEV_MASK] & AUDIO_DEVICE_COMBO)) - return i; - } - } - eagle_drv_err("%s: device %i not found", __func__, device); - return -EINVAL; -} - -static int _is_port_open_and_eagle(int pid) -{ - if (msm_routing_check_backend_enabled(pid)) - return 1; - return 1; -} - -static int _isNTDevice(u32 device) -{ - if (device & - ((1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) | - (1 << AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER) | - (1 << AUDIO_DEVICE_OUT_AUX_DIGITAL))) - return 1; - return 0; -} - -static void _reg_ion_mem(void) -{ - int rc; - rc = msm_audio_ion_alloc("DTS_EAGLE", &_ion_client, &_ion_handle, - ION_MEM_SIZE, &_po.paddr, &_po.size, &_po.kvaddr); - if (rc) - eagle_drv_err("%s: msm audio ion alloc failed with %i", - __func__, rc); -} - -static void _unreg_ion_mem(void) -{ - int rc; - rc = msm_audio_ion_free(_ion_client, _ion_handle); - if (rc) - eagle_drv_err("%s: msm audio ion alloc failed with %i", - __func__, rc); -} - -static void _reg_ion_mem_NT(void) -{ - int rc; - eagle_drv_dbg("%s: NT ion mem", __func__); - rc = msm_audio_ion_alloc("DTS_EAGLE", &_ion_client_NT, - &_ion_handle_NT, ION_MEM_SIZE, - &_po_NT.paddr, &_po_NT.size, &_po_NT.kvaddr); - if (rc) { - eagle_drv_err("%s: msm audio ion alloc failed", __func__); - return; - } - rc = q6asm_memory_map(_ac_NT, _po_NT.paddr, - IN, _po_NT.size, 1); - if (rc < 0) { - eagle_drv_err("%s: memory map failed", __func__); - msm_audio_ion_free(_ion_client_NT, _ion_handle_NT); - _ion_client_NT = NULL; - _ion_handle_NT = NULL; - } -} - -static void _unreg_ion_mem_NT(void) -{ - int rc; - rc = q6asm_memory_unmap(_ac_NT, _po_NT.paddr, IN); - if (rc < 0) - eagle_drv_err("%s: mem unmap failed", __func__); - rc = msm_audio_ion_free(_ion_client_NT, _ion_handle_NT); - if (rc < 0) - eagle_drv_err("%s: mem free failed", __func__); - - _ion_client_NT = NULL; - _ion_handle_NT = NULL; -} - -static struct audio_client *_getNTDeviceAC(void) -{ - return _ac_NT; -} - -static void _set_audioclient(struct audio_client *ac) -{ - _ac_NT = ac; - _reg_ion_mem_NT(); -} - -static void _clear_audioclient(void) -{ - _unreg_ion_mem_NT(); - _ac_NT = NULL; -} - - -static int _sendcache_pre(struct audio_client *ac) -{ - uint32_t offset, size; - int32_t cidx, cmd, err = 0; - cidx = _get_cb_for_dev(_device_primary); - if (cidx < 0) { - eagle_precache_err("%s: no cache for primary device %i found", - __func__, _device_primary); - return -EINVAL; - } - offset = _c_bl[cidx][CBD_OFFSG]; - cmd = _c_bl[cidx][CBD_CMD0]; - size = _c_bl[cidx][CBD_SZ0]; - /* check for integer overflow */ - if (offset > (UINT_MAX - size)) - err = -EINVAL; - if ((_depc_size == 0) || !_depc || (size == 0) || - cmd == 0 || ((offset + size) > _depc_size) || (err != 0)) { - eagle_precache_err("%s: primary device %i cache index %i general error - cache size = %u, cache ptr = %pK, offset = %u, size = %u, cmd = %i", - __func__, _device_primary, cidx, _depc_size, _depc, - offset, size, cmd); - return -EINVAL; - } - - if ((offset < (UINT_MAX - 124)) && ((offset + 124) < _depc_size)) - eagle_precache_dbg("%s: first 6 integers %i %i %i %i %i %i (30th %i)", - __func__, *((int *)&_depc[offset]), - *((int *)&_depc[offset+4]), - *((int *)&_depc[offset+8]), - *((int *)&_depc[offset+12]), - *((int *)&_depc[offset+16]), - *((int *)&_depc[offset+20]), - *((int *)&_depc[offset+120])); - eagle_precache_dbg("%s: sending full data block to port, with cache index = %d device mask 0x%X, param = 0x%X, offset = %u, and size = %u", - __func__, cidx, _c_bl[cidx][CBD_DEV_MASK], cmd, offset, size); - - if (q6asm_dts_eagle_set(ac, cmd, size, (void *)&_depc[offset], - NULL, MPRE)) - eagle_precache_err("%s: q6asm_dts_eagle_set failed with id = %d and size = %u", - __func__, cmd, size); - else - eagle_precache_dbg("%s: q6asm_dts_eagle_set succeeded with id = %d and size = %u", - __func__, cmd, size); - return 0; -} - -static int _sendcache_post(int port_id, int copp_idx, int topology) -{ - int cidx = -1, cmd, mask, index, err = 0; - uint32_t offset, size; - - if (port_id == -1) { - cidx = _get_cb_for_dev(_device_primary); - if (cidx < 0) { - eagle_postcache_err("%s: no cache for primary device %i found. Port id was 0x%X", - __func__, _device_primary, port_id); - return -EINVAL; - } - goto NT_MODE_GOTO; - } - - index = adm_validate_and_get_port_index(port_id); - if (index < 0) { - eagle_postcache_err("%s: Invalid port idx %d port_id %#x", - __func__, index, port_id); - return -EINVAL; - } - eagle_postcache_dbg("%s: valid port idx %d for port_id %#x set to %i", - __func__, index, port_id, copp_idx); - _cidx[index] = copp_idx; - - mask = _get_dev_mask_for_pid(port_id); - if (mask & _device_primary) { - cidx = _get_cb_for_dev(_device_primary); - if (cidx < 0) { - eagle_postcache_err("%s: no cache for primary device %i found. Port id was 0x%X", - __func__, _device_primary, port_id); - return -EINVAL; - } - } else if (mask & _device_all) { - cidx = _get_cb_for_dev(_device_all); - if (cidx < 0) { - eagle_postcache_err("%s: no cache for combo device %i found. Port id was 0x%X", - __func__, _device_all, port_id); - return -EINVAL; - } - } else { - eagle_postcache_err("%s: port id 0x%X not for primary or combo device %i", - __func__, port_id, _device_primary); - return -EINVAL; - } - -NT_MODE_GOTO: - offset = _c_bl[cidx][CBD_OFFSG] + _c_bl[cidx][CBD_OFFS2]; - cmd = _c_bl[cidx][CBD_CMD2]; - size = _c_bl[cidx][CBD_SZ2]; - - /* check for integer overflow */ - if (offset > (UINT_MAX - size)) - err = -EINVAL; - if ((_depc_size == 0) || !_depc || (err != 0) || (size == 0) || - (cmd == 0) || (offset + size) > _depc_size) { - eagle_postcache_err("%s: primary device %i cache index %i port_id 0x%X general error - cache size = %u, cache ptr = %pK, offset = %u, size = %u, cmd = %i", - __func__, _device_primary, cidx, port_id, - _depc_size, _depc, offset, size, cmd); - return -EINVAL; - } - - if ((offset < (UINT_MAX - 24)) && ((offset + 24) < _depc_size)) - eagle_postcache_dbg("%s: first 6 integers %i %i %i %i %i %i", - __func__, *((int *)&_depc[offset]), - *((int *)&_depc[offset+4]), - *((int *)&_depc[offset+8]), - *((int *)&_depc[offset+12]), - *((int *)&_depc[offset+16]), - *((int *)&_depc[offset+20])); - eagle_postcache_dbg("%s: sending full data block to port, with cache index = %d device mask 0x%X, port_id = 0x%X, param = 0x%X, offset = %u, and size = %u", - __func__, cidx, _c_bl[cidx][CBD_DEV_MASK], port_id, cmd, - offset, size); - - if (_ac_NT) { - eagle_postcache_dbg("%s: NT Route detected", __func__); - if (q6asm_dts_eagle_set(_getNTDeviceAC(), cmd, size, - (void *)&_depc[offset], - &_po_NT, MPST)) - eagle_postcache_err("%s: q6asm_dts_eagle_set failed with id = 0x%X and size = %u", - __func__, cmd, size); - } else if (adm_dts_eagle_set(port_id, copp_idx, cmd, - (void *)&_depc[offset], size) < 0) - eagle_postcache_err("%s: adm_dts_eagle_set failed with id = 0x%X and size = %u", - __func__, cmd, size); - else - eagle_postcache_dbg("%s: adm_dts_eagle_set succeeded with id = 0x%X and size = %u", - __func__, cmd, size); - return 0; -} - -static int _enable_post_get_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - ucontrol->value.integer.value[0] = _is_hpx_enabled; - return 0; -} - -static int _enable_post_put_control(struct snd_kcontrol *kcontrol, - struct snd_ctl_elem_value *ucontrol) -{ - int idx = 0, be_index = 0, port_id, topology; - int flag = ucontrol->value.integer.value[0]; - struct msm_pcm_routing_bdai_data msm_bedai; - eagle_drv_dbg("%s: flag %d", __func__, flag); - - _is_hpx_enabled = flag ? true : false; - msm_pcm_routing_acquire_lock(); - /* send cache postmix params when hpx is set On */ - for (be_index = 0; be_index < MSM_BACKEND_DAI_MAX; be_index++) { - msm_pcm_routing_get_bedai_info(be_index, &msm_bedai); - port_id = msm_bedai.port_id; - if (!(((port_id == SLIMBUS_0_RX) || - (port_id == RT_PROXY_PORT_001_RX)) && - msm_bedai.active)) - continue; - for (idx = 0; idx < MAX_COPPS_PER_PORT; idx++) { - topology = adm_get_topology_for_port_copp_idx( - port_id, idx); - if (topology == - ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX) { - msm_dts_eagle_enable_adm(port_id, idx, - _is_hpx_enabled); - } - } - } - msm_pcm_routing_release_lock(); - return 0; -} - -static const struct snd_kcontrol_new _hpx_enabled_controls[] = { - SOC_SINGLE_EXT("Set HPX OnOff", SND_SOC_NOPM, 0, 1, 0, - _enable_post_get_control, _enable_post_put_control) -}; - -/** - * msm_dts_ion_memmap() - helper function to map ION memory - * @po_: Out of band memory structure used as memory. - * - * Assign already allocated ION memory for mapping it to dsp. - * - * Return: No return value. - */ -void msm_dts_ion_memmap(struct param_outband *po_) -{ - po_->size = ION_MEM_SIZE; - po_->kvaddr = _po.kvaddr; - po_->paddr = _po.paddr; -} - -/** - * msm_dts_eagle_enable_asm() - Enable/disable dts module - * @ac: Enable/disable module in ASM session associated with this audio client. - * @enable: Enable/disable the dts module. - * @module: module id. - * - * Enable/disable specified dts module id in asm. - * - * Return: Return failure if any. - */ -int msm_dts_eagle_enable_asm(struct audio_client *ac, u32 enable, int module) -{ - int ret = 0; - eagle_enable_dbg("%s: enable = %i on module %i", - __func__, enable, module); - _is_hpx_enabled = enable; - ret = q6asm_dts_eagle_set(ac, AUDPROC_PARAM_ID_ENABLE, - sizeof(enable), &enable, - NULL, module); - if (_is_hpx_enabled) { - if (module == MPRE) - _sendcache_pre(ac); - else if (module == MPST) - _sendcache_post(-1, 0, 0); - } - return ret; -} - -/** - * msm_dts_eagle_enable_adm() - Enable/disable dts module in adm - * @port_id: Send enable/disable param to this port id. - * @copp_idx: Send enable/disable param to the relevant copp. - * @enable: Enable/disable the dts module. - * - * Enable/disable dts module in adm. - * - * Return: Return failure if any. - */ -int msm_dts_eagle_enable_adm(int port_id, int copp_idx, u32 enable) -{ - int ret = 0; - eagle_enable_dbg("%s: enable = %i", __func__, enable); - _is_hpx_enabled = enable; - ret = adm_dts_eagle_set(port_id, copp_idx, AUDPROC_PARAM_ID_ENABLE, - (char *)&enable, sizeof(enable)); - if (_is_hpx_enabled) - _sendcache_post(port_id, copp_idx, MPST); - return ret; -} - -/** - * msm_dts_eagle_add_controls() - Add mixer control to Enable/Disable DTS HPX - * @platform: Add mixer controls to this platform. - * - * Add mixer control to Enable/Disable DTS HPX module in ADM. - * - * Return: No return value. - */ -void msm_dts_eagle_add_controls(struct snd_soc_platform *platform) -{ - snd_soc_add_platform_controls(platform, _hpx_enabled_controls, - ARRAY_SIZE(_hpx_enabled_controls)); -} - -/** - * msm_dts_eagle_set_stream_gain() - Set stream gain to DTS Premix module - * @ac: Set stream gain to ASM session associated with this audio client. - * @lgain: Left gain value. - * @rgain: Right gain value. - * - * Set stream gain to DTS Premix module in ASM. - * - * Return: failure or success. - */ -int msm_dts_eagle_set_stream_gain(struct audio_client *ac, int lgain, int rgain) -{ - u32 i, val; - s32 idx, err = 0; - - eagle_vol_dbg("%s: - entry: vol_cmd_cnt = %u, lgain = %i, rgain = %i", - __func__, _vol_cmd_cnt, lgain, rgain); - - if (_depc_size == 0) { - eagle_vol_dbg("%s: driver cache not initialized", __func__); - return -EINVAL; - } - - for (i = 0; i < _vol_cmd_cnt; i++) { - if (_vol_cmds_d[i].d[0] & 0x8000) { - idx = (sizeof(struct dts_eagle_param_desc)/sizeof(int)) - + (_vol_cmds_d[i].d[0] & 0x3FF); - val = _fx_logN(((s32)(lgain+rgain)) << 2); - val = ((long long)val * _log10_10_inv_x20) >> 16; - _vol_cmds[i][idx] = (s32)clamp((int)(((long long)val * - _vol_cmds_d[i].d[1]) >> 16), - _vol_cmds_d[i].d[2], - _vol_cmds_d[i].d[3]); - eagle_vol_dbg("%s: loop %u cmd desc found %i, idx = %i. volume info: lgain = %i, rgain = %i, volume = %i (scale %i, min %i, max %i)", - __func__, i, _vol_cmds_d[i].d[0], idx, lgain, - rgain, _vol_cmds[i][idx], _vol_cmds_d[i].d[1], - _vol_cmds_d[i].d[2], _vol_cmds_d[i].d[3]); - } - idx = _get_cb_for_dev(_device_primary); - if (idx < 0) { - eagle_vol_err("%s: no cache for primary device %i found", - __func__, _device_primary); - return -EINVAL; - } - val = _c_bl[idx][CBD_OFFSG] + _vol_cmds[i][2]; - /* check for integer overflow */ - if (val > (UINT_MAX - _vol_cmds[i][1])) - err = -EINVAL; - if ((err != 0) || ((val + _vol_cmds[i][1]) > _depc_size)) { - eagle_vol_err("%s: volume size (%u) + offset (%i) out of bounds %i", - __func__, val, _vol_cmds[i][1], _depc_size); - return -EINVAL; - } - memcpy((void *)&_depc[val], &_vol_cmds[i][4], _vol_cmds[i][1]); - if (q6asm_dts_eagle_set(ac, _vol_cmds[i][0], - _vol_cmds[i][1], (void *)&_depc[val], NULL, MPRE)) - eagle_vol_err("%s: loop %u - volume set failed with id 0x%X, size %i, offset %i, cmd_desc %i, scale %i, min %i, max %i, data(...) %i", - __func__, i, _vol_cmds[i][0], _vol_cmds[i][1], - _vol_cmds[i][2], _vol_cmds_d[i].d[0], - _vol_cmds_d[i].d[1], _vol_cmds_d[i].d[2], - _vol_cmds_d[i].d[3], _vol_cmds[i][4]); - else - eagle_vol_dbg("%s: loop %u - volume set succeeded with id 0x%X, size %i, offset %i, cmd_desc %i, scale %i, min %i, max %i, data(...) %i", - __func__, i, _vol_cmds[i][0], _vol_cmds[i][1], - _vol_cmds[i][2], _vol_cmds_d[i].d[0], - _vol_cmds_d[i].d[1], _vol_cmds_d[i].d[2], - _vol_cmds_d[i].d[3], _vol_cmds[i][4]); - } - return 0; -} - -/** - * msm_dts_eagle_handle_asm() - Set or Get params from ASM - * @depd: DTS Eagle Params structure. - * @buf: Buffer to get queried param value. - * @for_pre: For premix module or postmix module. - * @get: Getting param from DSP or setting param. - * @ac: Set/Get from ASM session associated with this audio client. - * @po: Out of band memory to set or get postmix params. - * - * Set or Get params from modules in ASM session. - * - * Return: Return failure if any. - */ -int msm_dts_eagle_handle_asm(struct dts_eagle_param_desc *depd, char *buf, - bool for_pre, bool get, struct audio_client *ac, - struct param_outband *po) -{ - struct dts_eagle_param_desc depd_ = {0}; - s32 ret = 0, isALSA = 0, err = 0, i, mod = for_pre ? MPRE : MPST; - u32 offset; - - eagle_asm_dbg("%s: set/get asm", __func__); - - /* special handling for ALSA route, to accommodate 64 bit platforms */ - if (depd == NULL) { - long *arg_ = (long *)buf; - depd = &depd_; - depd->id = (u32)*arg_++; - depd->size = (u32)*arg_++; - depd->offset = (s32)*arg_++; - depd->device = (u32)*arg_++; - buf = (char *)arg_; - isALSA = 1; - } - - if (depd->size & 1) { - eagle_asm_err("%s: parameter size %u is not a multiple of 2", - __func__, depd->size); - return -EINVAL; - } - - if (get) { - void *buf_, *buf_m = NULL; - eagle_asm_dbg("%s: get requested", __func__); - if (depd->offset == -1) { - eagle_asm_dbg("%s: get from dsp requested", __func__); - if (depd->size > 0 && depd->size <= DEPC_MAX_SIZE) { - buf_ = buf_m = vzalloc(depd->size); - } else { - eagle_asm_err("%s: get size %u invalid", - __func__, depd->size); - return -EINVAL; - } - if (!buf_m) { - eagle_asm_err("%s: out of memory", __func__); - return -ENOMEM; - } else if (q6asm_dts_eagle_get(ac, depd->id, - depd->size, buf_m, - po, mod) < 0) { - eagle_asm_err("%s: asm get failed", __func__); - ret = -EFAULT; - goto DTS_EAGLE_IOCTL_GET_PARAM_PRE_EXIT; - } - eagle_asm_dbg("%s: get result: param id 0x%x value %d size %u", - __func__, depd->id, *(int *)buf_m, depd->size); - } else { - s32 tgt = _get_cb_for_dev(depd->device); - if (tgt < 0) { - eagle_asm_err("%s: no cache for device %u found", - __func__, depd->device); - return -EINVAL; - } - offset = _c_bl[tgt][CBD_OFFSG] + depd->offset; - /* check for integer overflow */ - if (offset > (UINT_MAX - depd->size)) - err = -EINVAL; - if ((err != 0) || (offset + depd->size) > _depc_size) { - eagle_asm_err("%s: invalid size %u and/or offset %u", - __func__, depd->size, offset); - return -EINVAL; - } - buf_ = (u32 *)&_depc[offset]; - } - if (isALSA) { - if (depd->size == 2) { - *(long *)buf = (long)*(__u16 *)buf_; - eagle_asm_dbg("%s: asm out 16 bit value %li", - __func__, *(long *)buf); - } else { - s32 *pbuf = (s32 *)buf_; - long *bufl = (long *)buf; - for (i = 0; i < (depd->size >> 2); i++) { - *bufl++ = (long)*pbuf++; - eagle_asm_dbg("%s: asm out value %li", - __func__, *(bufl-1)); - } - } - } else { - memcpy(buf, buf_, depd->size); - } -DTS_EAGLE_IOCTL_GET_PARAM_PRE_EXIT: - vfree(buf_m); - return (int)ret; - } else { - s32 tgt = _get_cb_for_dev(depd->device); - if (tgt < 0) { - eagle_asm_err("%s: no cache for device %u found", - __func__, depd->device); - return -EINVAL; - } - offset = _c_bl[tgt][CBD_OFFSG] + depd->offset; - /* check for integer overflow */ - if (offset > (UINT_MAX - depd->size)) - err = -EINVAL; - if ((err != 0) || ((offset + depd->size) > _depc_size)) { - eagle_asm_err("%s: invalid size %u and/or offset %u for parameter (cache is size %u)", - __func__, depd->size, offset, _depc_size); - return -EINVAL; - } - if (isALSA) { - if (depd->size == 2) { - *(__u16 *)&_depc[offset] = (__u16)*(long *)buf; - eagle_asm_dbg("%s: asm in 16 bit value %li", - __func__, *(long *)buf); - } else { - s32 *pbuf = (s32 *)&_depc[offset]; - long *bufl = (long *)buf; - for (i = 0; i < (depd->size >> 2); i++) { - *pbuf++ = (s32)*bufl++; - eagle_asm_dbg("%s: asm in value %i", - __func__, *(pbuf-1)); - } - } - } else { - memcpy(&_depc[offset], buf, depd->size); - } - eagle_asm_dbg("%s: param info: param = 0x%X, size = %u, offset = %i, device = %u, cache block %i, global offset = %u, first bytes as integer = %i", - __func__, depd->id, depd->size, depd->offset, - depd->device, - tgt, offset, *(int *)&_depc[offset]); - if (q6asm_dts_eagle_set(ac, depd->id, depd->size, - (void *)&_depc[offset], po, mod)) - eagle_asm_err("%s: q6asm_dts_eagle_set failed with id = 0x%X, size = %u, offset = %d", - __func__, depd->id, depd->size, depd->offset); - else - eagle_asm_dbg("%s: q6asm_dts_eagle_set succeeded with id = 0x%X, size = %u, offset = %d", - __func__, depd->id, depd->size, depd->offset); - } - return (int)ret; -} - -/** - * msm_dts_eagle_handle_adm() - Set or Get params from ADM - * @depd: DTS Eagle Params structure used to set or get. - * @buf: Buffer to get queried param value in NT mode. - * @for_pre: For premix module or postmix module. - * @get: Getting param from DSP or setting param. - * - * Set or Get params from modules in ADM session. - * - * Return: Return failure if any. - */ -int msm_dts_eagle_handle_adm(struct dts_eagle_param_desc *depd, char *buf, - bool for_pre, bool get) -{ - u32 pid = _get_pid_from_dev(depd->device), cidx; - s32 ret = 0; - - eagle_adm_dbg("%s: set/get adm", __func__); - - if (_isNTDevice(depd->device)) { - eagle_adm_dbg("%s: NT Route detected", __func__); - ret = msm_dts_eagle_handle_asm(depd, buf, for_pre, get, - _getNTDeviceAC(), &_po_NT); - if (ret < 0) - eagle_adm_err("%s: NT Route set failed with id = 0x%X, size = %u, offset = %i, device = %u", - __func__, depd->id, depd->size, depd->offset, - depd->device); - } else if (get) { - cidx = adm_validate_and_get_port_index(pid); - eagle_adm_dbg("%s: get from qdsp requested (port id 0x%X)", - __func__, pid); - if (adm_dts_eagle_get(pid, _cidx[cidx], depd->id, - buf, depd->size) < 0) { - eagle_adm_err("%s: get from qdsp via adm with port id 0x%X failed", - __func__, pid); - return -EFAULT; - } - } else if (_is_port_open_and_eagle(pid)) { - cidx = adm_validate_and_get_port_index(pid); - eagle_adm_dbg("%s: adm_dts_eagle_set called with id = 0x%X, size = %u, offset = %i, device = %u, port id = %u, copp index = %u", - __func__, depd->id, depd->size, depd->offset, - depd->device, pid, cidx); - ret = adm_dts_eagle_set(pid, _cidx[cidx], depd->id, - (void *)buf, depd->size); - if (ret < 0) - eagle_adm_err("%s: adm_dts_eagle_set failed", __func__); - else - eagle_adm_dbg("%s: adm_dts_eagle_set succeeded", - __func__); - } else { - ret = -EINVAL; - eagle_adm_dbg("%s: port id 0x%X not active or not Eagle", - __func__, pid); - } - return (int)ret; -} - -/** - * msm_dts_eagle_ioctl() - ioctl handler function - * @cmd: cmd to handle. - * @arg: argument to the cmd. - * - * Handle DTS Eagle ioctl cmds. - * - * Return: Return failure if any. - */ -int msm_dts_eagle_ioctl(unsigned int cmd, unsigned long arg) -{ - s32 ret = 0; - switch (cmd) { - case DTS_EAGLE_IOCTL_GET_CACHE_SIZE: { - eagle_ioctl_info("%s: called with control 0x%X (get param cache size)", - __func__, cmd); - if (copy_to_user((void *)arg, &_depc_size, - sizeof(_depc_size))) { - eagle_ioctl_err("%s: error writing size", __func__); - return -EFAULT; - } - break; - } - case DTS_EAGLE_IOCTL_SET_CACHE_SIZE: { - u32 size = 0; - eagle_ioctl_info("%s: called with control 0x%X (allocate param cache)", - __func__, cmd); - if (copy_from_user((void *)&size, (void *)arg, sizeof(size))) { - eagle_ioctl_err("%s: error copying size (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &size, sizeof(size)); - return -EFAULT; - } else if (size > DEPC_MAX_SIZE) { - eagle_ioctl_err("%s: cache size %u not allowed (min 0, max %u)", - __func__, size, DEPC_MAX_SIZE); - return -EINVAL; - } - if (_depc) { - eagle_ioctl_dbg("%s: previous param cache of size %u freed", - __func__, _depc_size); - _depc_size = 0; - vfree(_depc); - _depc = NULL; - } - if (size) - _depc = vzalloc(size); - else - eagle_ioctl_dbg("%s: %u bytes requested for param cache, nothing allocated", - __func__, size); - if (_depc) { - eagle_ioctl_dbg("%s: %u bytes allocated for param cache", - __func__, size); - _depc_size = size; - } else { - eagle_ioctl_err("%s: error allocating param cache (vzalloc failed on %u bytes)", - __func__, size); - _depc_size = 0; - return -ENOMEM; - } - break; - } - case DTS_EAGLE_IOCTL_GET_PARAM: { - struct dts_eagle_param_desc depd; - s32 for_pre = 0, get_from_core = 0, err = 0; - u32 offset; - void *buf, *buf_m = NULL; - eagle_ioctl_info("%s: control 0x%X (get param)", - __func__, cmd); - if (copy_from_user((void *)&depd, (void *)arg, sizeof(depd))) { - eagle_ioctl_err("%s: error copying dts_eagle_param_desc (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &depd, sizeof(depd)); - return -EFAULT; - } - if (depd.device & DTS_EAGLE_FLAG_IOCTL_PRE) { - eagle_ioctl_dbg("%s: using for premix", __func__); - for_pre = 1; - } - if (depd.device & DTS_EAGLE_FLAG_IOCTL_GETFROMCORE) { - eagle_ioctl_dbg("%s: 'get from core' requested", - __func__); - get_from_core = 1; - depd.offset = -1; - } - depd.device &= DTS_EAGLE_FLAG_IOCTL_MASK; - if (depd.offset == -1) { - if (depd.size > 0 && depd.size <= DEPC_MAX_SIZE) { - buf = buf_m = vzalloc(depd.size); - } else { - eagle_ioctl_err("%s: get size %u invalid", - __func__, depd.size); - return -EINVAL; - } - if (!buf_m) { - eagle_ioctl_err("%s: out of memory", __func__); - return -ENOMEM; - } - if (get_from_core) - ret = core_dts_eagle_get(depd.id, depd.size, - buf); - else - ret = msm_dts_eagle_handle_adm(&depd, buf, - for_pre, true); - } else { - s32 cb = _get_cb_for_dev(depd.device); - if (cb < 0) { - eagle_ioctl_err("%s: no cache for device %u found", - __func__, depd.device); - return -EINVAL; - } - offset = _c_bl[cb][CBD_OFFSG] + depd.offset; - /* check for integer overflow */ - if (offset > (UINT_MAX - depd.size)) - err = -EINVAL; - if ((err != 0) || - ((offset + depd.size) > _depc_size)) { - eagle_ioctl_err("%s: invalid size %u and/or offset %u", - __func__, depd.size, offset); - return -EINVAL; - } - buf = (void *)&_depc[offset]; - } - if (ret < 0) - eagle_ioctl_err("%s: error %i getting data", __func__, - ret); - else if (copy_to_user((void *)(((char *)arg)+sizeof(depd)), - buf, depd.size)) { - eagle_ioctl_err("%s: error copying get data", __func__); - ret = -EFAULT; - } - vfree(buf_m); - break; - } - case DTS_EAGLE_IOCTL_SET_PARAM: { - struct dts_eagle_param_desc depd; - s32 just_set_cache = 0, for_pre = 0, err = 0; - u32 offset; - s32 tgt; - eagle_ioctl_info("%s: control 0x%X (set param)", - __func__, cmd); - if (copy_from_user((void *)&depd, (void *)arg, sizeof(depd))) { - eagle_ioctl_err("%s: error copying dts_eagle_param_desc (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &depd, sizeof(depd)); - return -EFAULT; - } - if (depd.device & DTS_EAGLE_FLAG_IOCTL_PRE) { - eagle_ioctl_dbg("%s: using for premix", __func__); - for_pre = 1; - } - if (depd.device & DTS_EAGLE_FLAG_IOCTL_JUSTSETCACHE) { - eagle_ioctl_dbg("%s: 'just set cache' requested", - __func__); - just_set_cache = 1; - } - depd.device &= DTS_EAGLE_FLAG_IOCTL_MASK; - tgt = _get_cb_for_dev(depd.device); - if (tgt < 0) { - eagle_ioctl_err("%s: no cache for device %u found", - __func__, depd.device); - return -EINVAL; - } - offset = _c_bl[tgt][CBD_OFFSG] + depd.offset; - /* check for integer overflow */ - if (offset > (UINT_MAX - depd.size)) - err = -EINVAL; - if ((err != 0) || ((offset + depd.size) > _depc_size)) { - eagle_ioctl_err("%s: invalid size %u and/or offset %u for parameter (target cache block %i with offset %i, global cache is size %u)", - __func__, depd.size, offset, tgt, - _c_bl[tgt][CBD_OFFSG], _depc_size); - return -EINVAL; - } - if (copy_from_user((void *)&_depc[offset], - (void *)(((char *)arg)+sizeof(depd)), - depd.size)) { - eagle_ioctl_err("%s: error copying param to cache (src:%pK, tgt:%pK, size:%u)", - __func__, ((char *)arg)+sizeof(depd), - &_depc[offset], depd.size); - return -EFAULT; - } - eagle_ioctl_dbg("%s: param info: param = 0x%X, size = %u, offset = %i, device = %u, cache block %i, global offset = %u, first bytes as integer = %i", - __func__, depd.id, depd.size, depd.offset, - depd.device, tgt, offset, *(int *)&_depc[offset]); - if (!just_set_cache) { - ret = msm_dts_eagle_handle_adm(&depd, &_depc[offset], - for_pre, false); - } - break; - } - case DTS_EAGLE_IOCTL_SET_CACHE_BLOCK: { - u32 b_[CBD_COUNT+1], *b = &b_[1], cb; - eagle_ioctl_info("%s: with control 0x%X (set param cache block)", - __func__, cmd); - if (copy_from_user((void *)b_, (void *)arg, sizeof(b_))) { - eagle_ioctl_err("%s: error copying cache block data (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, b_, sizeof(b_)); - return -EFAULT; - } - cb = b_[0]; - if (cb >= CB_COUNT) { - eagle_ioctl_err("%s: cache block %u out of range (max %u)", - __func__, cb, CB_COUNT-1); - return -EINVAL; - } - eagle_ioctl_dbg("%s: cache block %i set: devices 0x%X, global offset %i, offsets 1:%u 2:%u 3:%u, cmds/sizes 0:0x%X %u 1:0x%X %u 2:0x%X %u 3:0x%X %u", - __func__, cb, _c_bl[cb][CBD_DEV_MASK], _c_bl[cb][CBD_OFFSG], - _c_bl[cb][CBD_OFFS1], _c_bl[cb][CBD_OFFS2], - _c_bl[cb][CBD_OFFS3], _c_bl[cb][CBD_CMD0], _c_bl[cb][CBD_SZ0], - _c_bl[cb][CBD_CMD1], _c_bl[cb][CBD_SZ1], _c_bl[cb][CBD_CMD2], - _c_bl[cb][CBD_SZ2], _c_bl[cb][CBD_CMD3], _c_bl[cb][CBD_SZ3]); - if ((b[CBD_OFFSG]+b[CBD_OFFS1]+b[CBD_SZ1]) > _depc_size || - (b[CBD_OFFSG]+b[CBD_OFFS2]+b[CBD_SZ2]) > _depc_size || - (b[CBD_OFFSG]+b[CBD_OFFS3]+b[CBD_SZ3]) > _depc_size) { - eagle_ioctl_err("%s: cache block bounds out of range", - __func__); - return -EINVAL; - } - memcpy(_c_bl[cb], b, sizeof(_c_bl[cb])); - break; - } - case DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE: { - u32 data[2]; - eagle_ioctl_dbg("%s: with control 0x%X (set active device)", - __func__, cmd); - if (copy_from_user((void *)data, (void *)arg, sizeof(data))) { - eagle_ioctl_err("%s: error copying active device data (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, data, sizeof(data)); - return -EFAULT; - } - if (data[1] != 0) { - _device_primary = data[0]; - eagle_ioctl_dbg("%s: primary device %i", __func__, - data[0]); - } else { - _device_all = data[0]; - eagle_ioctl_dbg("%s: all devices 0x%X", __func__, - data[0]); - } - break; - } - case DTS_EAGLE_IOCTL_GET_LICENSE: { - u32 target = 0, size = 0; - s32 size_only; - eagle_ioctl_dbg("%s: with control 0x%X (get license)", - __func__, cmd); - if (copy_from_user((void *)&target, (void *)arg, - sizeof(target))) { - eagle_ioctl_err("%s: error reading license index. (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &target, sizeof(target)); - return -EFAULT; - } - size_only = target & (1<<31) ? 1 : 0; - target &= 0x7FFFFFFF; - if (target >= SEC_BLOB_MAX_CNT) { - eagle_ioctl_err("%s: license index %u out of bounds (max index is %i)", - __func__, target, SEC_BLOB_MAX_CNT); - return -EINVAL; - } - if (_sec_blob[target] == NULL) { - eagle_ioctl_err("%s: license index %u never initialized", - __func__, target); - return -EINVAL; - } - size = ((u32 *)_sec_blob[target])[0]; - if ((size == 0) || (size > SEC_BLOB_MAX_SIZE)) { - eagle_ioctl_err("%s: license size %u for index %u invalid (min size is 1, max size is %u)", - __func__, size, target, SEC_BLOB_MAX_SIZE); - return -EINVAL; - } - if (size_only) { - eagle_ioctl_dbg("%s: reporting size of license data only", - __func__); - if (copy_to_user((void *)(((char *)arg)+sizeof(target)), - (void *)&size, sizeof(size))) { - eagle_ioctl_err("%s: error copying license size", - __func__); - return -EFAULT; - } - } else if (copy_to_user((void *)(((char *)arg)+sizeof(target)), - (void *)&(((s32 *)_sec_blob[target])[1]), size)) { - eagle_ioctl_err("%s: error copying license data", - __func__); - return -EFAULT; - } else - eagle_ioctl_info("%s: license file %u bytes long from license index %u returned to user", - __func__, size, target); - break; - } - case DTS_EAGLE_IOCTL_SET_LICENSE: { - u32 target[2] = {0, 0}; - eagle_ioctl_dbg("%s: control 0x%X (set license)", __func__, - cmd); - if (copy_from_user((void *)target, (void *)arg, - sizeof(target))) { - eagle_ioctl_err("%s: error reading license index (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, target, sizeof(target)); - return -EFAULT; - } - if (target[0] >= SEC_BLOB_MAX_CNT) { - eagle_ioctl_err("%s: license index %u out of bounds (max index is %u)", - __func__, target[0], SEC_BLOB_MAX_CNT-1); - return -EINVAL; - } - if (target[1] == 0) { - eagle_ioctl_dbg("%s: request to free license index %u", - __func__, target[0]); - kfree(_sec_blob[target[0]]); - _sec_blob[target[0]] = NULL; - break; - } - if ((target[1] == 0) || (target[1] >= SEC_BLOB_MAX_SIZE)) { - eagle_ioctl_err("%s: license size %u for index %u invalid (min size is 1, max size is %u)", - __func__, target[1], target[0], - SEC_BLOB_MAX_SIZE); - return -EINVAL; - } - if (_sec_blob[target[0]] != NULL) { - if (((u32 *)_sec_blob[target[0]])[1] != target[1]) { - eagle_ioctl_dbg("%s: request new size for already allocated license index %u", - __func__, target[0]); - kfree(_sec_blob[target[0]]); - _sec_blob[target[0]] = NULL; - } - } - eagle_ioctl_dbg("%s: allocating %u bytes for license index %u", - __func__, target[1], target[0]); - _sec_blob[target[0]] = kzalloc(target[1] + 4, GFP_KERNEL); - if (!_sec_blob[target[0]]) { - eagle_ioctl_err("%s: error allocating license index %u (kzalloc failed on %u bytes)", - __func__, target[0], target[1]); - return -ENOMEM; - } - ((u32 *)_sec_blob[target[0]])[0] = target[1]; - if (copy_from_user( - (void *)&(((u32 *)_sec_blob[target[0]])[1]), - (void *)(((char *)arg)+sizeof(target)), - target[1])) { - eagle_ioctl_err("%s: error copying license to index %u, size %u (src:%pK, tgt:%pK, size:%u)", - __func__, target[0], target[1], - ((char *)arg)+sizeof(target), - &(((u32 *)_sec_blob[target[0]])[1]), - target[1]); - return -EFAULT; - } else - eagle_ioctl_info("%s: license file %u bytes long copied to index license index %u", - __func__, target[1], target[0]); - break; - } - case DTS_EAGLE_IOCTL_SEND_LICENSE: { - u32 target = 0; - eagle_ioctl_dbg("%s: control 0x%X (send license)", __func__, - cmd); - if (copy_from_user((void *)&target, (void *)arg, - sizeof(target))) { - eagle_ioctl_err("%s: error reading license index (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &target, sizeof(target)); - return -EFAULT; - } - if (target >= SEC_BLOB_MAX_CNT) { - eagle_ioctl_err("%s: license index %u out of bounds (max index is %i)", - __func__, target, SEC_BLOB_MAX_CNT-1); - return -EINVAL; - } - if (!_sec_blob[target] || - ((u32 *)_sec_blob[target])[0] == 0) { - eagle_ioctl_err("%s: license index %u is invalid", - __func__, target); - return -EINVAL; - } - if (core_dts_eagle_set(((s32 *)_sec_blob[target])[0], - (char *)&((s32 *)_sec_blob[target])[1]) < 0) - eagle_ioctl_err("%s: core_dts_eagle_set failed with id = %u", - __func__, target); - else - eagle_ioctl_info("%s: core_dts_eagle_set succeeded with id = %u", - __func__, target); - break; - } - case DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS: { - s32 spec = 0; - eagle_ioctl_info("%s: control 0x%X (set volume commands)", - __func__, cmd); - if (copy_from_user((void *)&spec, (void *)arg, - sizeof(spec))) { - eagle_ioctl_err("%s: error reading volume command specifier (src:%pK, tgt:%pK, size:%zu)", - __func__, (void *)arg, &spec, sizeof(spec)); - return -EFAULT; - } - if (spec & 0x80000000) { - u32 idx = (spec & 0x0000F000) >> 12; - s32 size = spec & 0x00000FFF; - eagle_ioctl_dbg("%s: setting volume command %i size: %i", - __func__, idx, size); - if (idx >= _vol_cmd_cnt) { - eagle_ioctl_err("%s: volume command index %u out of bounds (only %u allocated)", - __func__, idx, _vol_cmd_cnt); - return -EINVAL; - } - if (_volume_cmds_alloc2(idx, size) < 0) { - eagle_ioctl_err("%s: error allocating memory for volume controls", - __func__); - return -ENOMEM; - } - if (copy_from_user((void *)&_vol_cmds_d[idx], - (void *)(((char *)arg) + sizeof(int)), - sizeof(struct vol_cmds_d))) { - eagle_ioctl_err("%s: error reading volume command descriptor (src:%pK, tgt:%pK, size:%zu)", - __func__, ((char *)arg) + sizeof(int), - &_vol_cmds_d[idx], - sizeof(struct vol_cmds_d)); - return -EFAULT; - } - eagle_ioctl_dbg("%s: setting volume command %i spec (size %zu): %i %i %i %i", - __func__, idx, sizeof(struct vol_cmds_d), - _vol_cmds_d[idx].d[0], _vol_cmds_d[idx].d[1], - _vol_cmds_d[idx].d[2], _vol_cmds_d[idx].d[3]); - if (copy_from_user((void *)_vol_cmds[idx], - (void *)(((char *)arg) + (sizeof(int) + - sizeof(struct vol_cmds_d))), size)) { - eagle_ioctl_err("%s: error reading volume command string (src:%pK, tgt:%pK, size:%i)", - __func__, ((char *)arg) + (sizeof(int) + - sizeof(struct vol_cmds_d)), - _vol_cmds[idx], size); - return -EFAULT; - } - } else { - eagle_ioctl_dbg("%s: setting volume command size", - __func__); - if (spec < 0 || spec > VOL_CMD_CNT_MAX) { - eagle_ioctl_err("%s: volume command count %i out of bounds (min 0, max %i)", - __func__, spec, VOL_CMD_CNT_MAX); - return -EINVAL; - } else if (spec == 0) { - eagle_ioctl_dbg("%s: request to free volume commands", - __func__); - _volume_cmds_free(); - break; - } - eagle_ioctl_dbg("%s: setting volume command size requested = %i", - __func__, spec); - if (_volume_cmds_alloc1(spec) < 0) { - eagle_ioctl_err("%s: error allocating memory for volume controls", - __func__); - return -ENOMEM; - } - } - break; - } - default: { - eagle_ioctl_err("%s: control 0x%X (invalid control)", - __func__, cmd); - ret = -EINVAL; - } - } - return (int)ret; -} - -/** - * msm_dts_eagle_compat_ioctl() - To handle 32bit to 64bit ioctl compatibility - * @cmd: cmd to handle. - * @arg: argument to the cmd. - * - * Handle DTS Eagle ioctl cmds from 32bit userspace. - * - * Return: Return failure if any. - */ -#ifdef CONFIG_COMPAT -int msm_dts_eagle_compat_ioctl(unsigned int cmd, unsigned long arg) -{ - switch (cmd) { - case DTS_EAGLE_IOCTL_GET_CACHE_SIZE32: - cmd = DTS_EAGLE_IOCTL_GET_CACHE_SIZE; - break; - case DTS_EAGLE_IOCTL_SET_CACHE_SIZE32: - cmd = DTS_EAGLE_IOCTL_SET_CACHE_SIZE; - break; - case DTS_EAGLE_IOCTL_GET_PARAM32: - cmd = DTS_EAGLE_IOCTL_GET_PARAM; - break; - case DTS_EAGLE_IOCTL_SET_PARAM32: - cmd = DTS_EAGLE_IOCTL_SET_PARAM; - break; - case DTS_EAGLE_IOCTL_SET_CACHE_BLOCK32: - cmd = DTS_EAGLE_IOCTL_SET_CACHE_BLOCK; - break; - case DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE32: - cmd = DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE; - break; - case DTS_EAGLE_IOCTL_GET_LICENSE32: - cmd = DTS_EAGLE_IOCTL_GET_LICENSE; - break; - case DTS_EAGLE_IOCTL_SET_LICENSE32: - cmd = DTS_EAGLE_IOCTL_SET_LICENSE; - break; - case DTS_EAGLE_IOCTL_SEND_LICENSE32: - cmd = DTS_EAGLE_IOCTL_SEND_LICENSE; - break; - case DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS32: - cmd = DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS; - break; - default: - break; - } - return msm_dts_eagle_ioctl(cmd, arg); -} -#endif -/** - * msm_dts_eagle_init_pre() - Initialize DTS premix module - * @ac: Initialize premix module in the ASM session. - * - * Initialize DTS premix module on provided ASM session - * - * Return: Return failure if any. - */ -int msm_dts_eagle_init_pre(struct audio_client *ac) -{ - return msm_dts_eagle_enable_asm(ac, _is_hpx_enabled, - AUDPROC_MODULE_ID_DTS_HPX_PREMIX); -} - -/** - * msm_dts_eagle_deinit_pre() - Deinitialize DTS premix module - * @ac: Deinitialize premix module in the ASM session. - * - * Deinitialize DTS premix module on provided ASM session - * - * Return: Currently does nothing so 0. - */ -int msm_dts_eagle_deinit_pre(struct audio_client *ac) -{ - return 0; -} - -/** - * msm_dts_eagle_init_post() - Initialize DTS postmix module - * @port_id: Port id for the ADM session. - * @copp_idx: Copp idx for the ADM session. - * - * Initialize DTS postmix module on ADM session - * - * Return: Return failure if any. - */ -int msm_dts_eagle_init_post(int port_id, int copp_idx) -{ - return msm_dts_eagle_enable_adm(port_id, copp_idx, _is_hpx_enabled); -} - -/** - * msm_dts_eagle_deinit_post() - Deinitialize DTS postmix module - * @port_id: Port id for the ADM session. - * @topology: Topology in use. - * - * Deinitialize DTS postmix module on ADM session - * - * Return: Currently does nothing so 0. - */ -int msm_dts_eagle_deinit_post(int port_id, int topology) -{ - return 0; -} - -/** - * msm_dts_eagle_init_master_module() - Initialize both DTS modules - * @ac: Initialize modules in the ASM session. - * - * Initialize DTS modules on ASM session - * - * Return: Success. - */ -int msm_dts_eagle_init_master_module(struct audio_client *ac) -{ - _set_audioclient(ac); - msm_dts_eagle_enable_asm(ac, _is_hpx_enabled, - AUDPROC_MODULE_ID_DTS_HPX_PREMIX); - msm_dts_eagle_enable_asm(ac, _is_hpx_enabled, - AUDPROC_MODULE_ID_DTS_HPX_POSTMIX); - return 0; -} - -/** - * msm_dts_eagle_deinit_master_module() - Deinitialize both DTS modules - * @ac: Deinitialize modules in the ASM session. - * - * Deinitialize DTS modules on ASM session - * - * Return: Success. - */ -int msm_dts_eagle_deinit_master_module(struct audio_client *ac) -{ - msm_dts_eagle_deinit_pre(ac); - msm_dts_eagle_deinit_post(-1, 0); - _clear_audioclient(); - return 0; -} - -/** - * msm_dts_eagle_is_hpx_on() - Check if HPX effects are On - * - * Check if HPX effects are On - * - * Return: On/Off. - */ -int msm_dts_eagle_is_hpx_on(void) -{ - return _is_hpx_enabled; -} - -/** - * msm_dts_eagle_pcm_new() - Create hwdep node - * @runtime: snd_soc_pcm_runtime structure. - * - * Create hwdep node - * - * Return: Success. - */ -int msm_dts_eagle_pcm_new(struct snd_soc_pcm_runtime *runtime) -{ - if (!_ref_cnt++) { - _init_cb_descs(); - _reg_ion_mem(); - } - return 0; -} - -/** - * msm_dts_eagle_pcm_free() - remove hwdep node - * @runtime: snd_soc_pcm_runtime structure. - * - * Remove hwdep node - * - * Return: void. - */ -void msm_dts_eagle_pcm_free(struct snd_pcm *pcm) -{ - if (!--_ref_cnt) - _unreg_ion_mem(); - vfree(_depc); -} - -MODULE_DESCRIPTION("DTS EAGLE platform driver"); -MODULE_LICENSE("GPL v2"); diff --git a/sound/soc/msm/qdsp6v2/msm-dts-srs-tm-config.c b/sound/soc/msm/qdsp6v2/msm-dts-srs-tm-config.c index 7c35d19bb6103..8fc49b29000cc 100644 --- a/sound/soc/msm/qdsp6v2/msm-dts-srs-tm-config.c +++ b/sound/soc/msm/qdsp6v2/msm-dts-srs-tm-config.c @@ -1,4 +1,5 @@ -/* Copyright (c) 2012-2014, 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-2014, 2016-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 @@ -19,7 +20,6 @@ #include #include #include -#include #include "msm-dts-srs-tm-config.h" #include "msm-pcm-routing-v2.h" diff --git a/sound/soc/msm/qdsp6v2/msm-lsm-client.c b/sound/soc/msm/qdsp6v2/msm-lsm-client.c index c5c75a0495e92..0557e0ebf33b3 100644 --- a/sound/soc/msm/qdsp6v2/msm-lsm-client.c +++ b/sound/soc/msm/qdsp6v2/msm-lsm-client.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2016, Linux Foundation. All rights reserved. + * Copyright (c) 2013-2017, 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 @@ -84,6 +84,7 @@ struct lsm_priv { atomic_t buf_count; atomic_t read_abort; wait_queue_head_t period_wait; + struct mutex lsm_api_lock; int appl_cnt; int dma_write; }; @@ -730,8 +731,13 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, switch (cmd) { case SNDRV_LSM_SET_SESSION_DATA: dev_dbg(rtd->dev, "%s: set session data\n", __func__); - memcpy(&session_data, arg, - sizeof(struct snd_lsm_session_data)); + if (copy_from_user(&session_data, arg, + sizeof(session_data))) { + dev_err(rtd->dev, "%s: %s: copy_from_user failed\n", + __func__, "LSM_SET_SESSION_DATA"); + return -EFAULT; + } + if (session_data.app_id != LSM_VOICE_WAKEUP_APP_ID_V2) { dev_err(rtd->dev, "%s:Invalid App id %d for Listen client\n", @@ -820,13 +826,6 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, break; case SNDRV_LSM_SET_PARAMS: - if (!arg) { - dev_err(rtd->dev, - "%s: %s Invalid argument\n", - __func__, "SNDRV_LSM_SET_PARAMS"); - return -EINVAL; - } - dev_dbg(rtd->dev, "%s: set_params\n", __func__); memcpy(&det_params, arg, sizeof(det_params)); @@ -874,10 +873,18 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, case SNDRV_LSM_EVENT_STATUS: dev_dbg(rtd->dev, "%s: Get event status\n", __func__); atomic_set(&prtd->event_wait_stop, 0); + + /* + * Release the api lock before wait to allow + * other IOCTLs to be invoked while waiting + * for event + */ + mutex_unlock(&prtd->lsm_api_lock); rc = wait_event_freezable(prtd->event_wait, (cmpxchg(&prtd->event_avail, 1, 0) || (xchg = atomic_cmpxchg(&prtd->event_wait_stop, 1, 0)))); + mutex_lock(&prtd->lsm_api_lock); dev_dbg(rtd->dev, "%s: wait_event_freezable %d event_wait_stop %d\n", __func__, rc, xchg); if (!rc && !xchg) { @@ -978,45 +985,43 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, break; } case SNDRV_LSM_LAB_CONTROL: { - u32 *enable = NULL; - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid param arg for ioctl %s session %d\n", - __func__, "SNDRV_LSM_LAB_CONTROL", - prtd->lsm_client->session); - rc = -EINVAL; - break; + u32 enable; + + if (copy_from_user(&enable, arg, sizeof(enable))) { + dev_err(rtd->dev, "%s: %s: copy_frm_user failed\n", + __func__, "LSM_LAB_CONTROL"); + return -EFAULT; } - enable = (int *)arg; + dev_dbg(rtd->dev, "%s: ioctl %s, enable = %d\n", - __func__, "SNDRV_LSM_LAB_CONTROL", *enable); + __func__, "SNDRV_LSM_LAB_CONTROL", enable); if (!prtd->lsm_client->started) { - if (prtd->lsm_client->lab_enable == *enable) { + if (prtd->lsm_client->lab_enable == enable) { dev_dbg(rtd->dev, "%s: Lab for session %d already %s\n", __func__, prtd->lsm_client->session, - ((*enable) ? "enabled" : "disabled")); + enable ? "enabled" : "disabled"); rc = 0; break; } - rc = q6lsm_lab_control(prtd->lsm_client, *enable); + rc = q6lsm_lab_control(prtd->lsm_client, enable); if (rc) { dev_err(rtd->dev, "%s: ioctl %s failed rc %d to %s lab for session %d\n", __func__, "SNDRV_LAB_CONTROL", rc, - ((*enable) ? "enable" : "disable"), + enable ? "enable" : "disable", prtd->lsm_client->session); } else { rc = msm_lsm_lab_buffer_alloc(prtd, - ((*enable) ? LAB_BUFFER_ALLOC - : LAB_BUFFER_DEALLOC)); + enable ? LAB_BUFFER_ALLOC + : LAB_BUFFER_DEALLOC); if (rc) dev_err(rtd->dev, "%s: msm_lsm_lab_buffer_alloc failed rc %d for %s", __func__, rc, - ((*enable) ? "ALLOC" : "DEALLOC")); + enable ? "ALLOC" : "DEALLOC"); if (!rc) - prtd->lsm_client->lab_enable = *enable; + prtd->lsm_client->lab_enable = enable; } } else { dev_err(rtd->dev, "%s: ioctl %s issued after start", @@ -1057,11 +1062,6 @@ static int msm_lsm_ioctl_shared(struct snd_pcm_substream *substream, return rc; } #ifdef CONFIG_COMPAT -struct snd_lsm_event_status32 { - u16 status; - u16 payload_size; - u8 payload[0]; -}; struct snd_lsm_sound_model_v2_32 { compat_uptr_t data; @@ -1094,8 +1094,6 @@ struct snd_lsm_module_params_32 { }; enum { - SNDRV_LSM_EVENT_STATUS32 = - _IOW('U', 0x02, struct snd_lsm_event_status32), SNDRV_LSM_REG_SND_MODEL_V2_32 = _IOW('U', 0x07, struct snd_lsm_sound_model_v2_32), SNDRV_LSM_SET_PARAMS_32 = @@ -1125,14 +1123,17 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, rtd = substream->private_data; prtd = runtime->private_data; + mutex_lock(&prtd->lsm_api_lock); + switch (cmd) { - case SNDRV_LSM_EVENT_STATUS32: { - struct snd_lsm_event_status32 userarg32, *user32 = NULL; - struct snd_lsm_event_status *user = NULL; + case SNDRV_LSM_EVENT_STATUS: { + struct snd_lsm_event_status *user = NULL, userarg32; + struct snd_lsm_event_status *user32 = NULL; if (copy_from_user(&userarg32, arg, sizeof(userarg32))) { dev_err(rtd->dev, "%s: err copyuser ioctl %s\n", - __func__, "SNDRV_LSM_EVENT_STATUS32"); - return -EFAULT; + __func__, "SNDRV_LSM_EVENT_STATUS"); + err = -EFAULT; + goto done; } if (userarg32.payload_size > @@ -1140,16 +1141,18 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, pr_err("%s: payload_size %d is invalid, max allowed = %d\n", __func__, userarg32.payload_size, LISTEN_MAX_STATUS_PAYLOAD_SIZE); - return -EINVAL; + err = -EINVAL; + goto done; } size = sizeof(*user) + userarg32.payload_size; - user = kmalloc(size, GFP_KERNEL); + user = kzalloc(size, GFP_KERNEL); if (!user) { dev_err(rtd->dev, "%s: Allocation failed event status size %d\n", __func__, size); - return -EFAULT; + err = -EFAULT; + goto done; } else { cmd = SNDRV_LSM_EVENT_STATUS; user->payload_size = userarg32.payload_size; @@ -1164,7 +1167,7 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, err = -EFAULT; } if (!err) { - user32 = kmalloc(size, GFP_KERNEL); + user32 = kzalloc(size, GFP_KERNEL); if (!user32) { dev_err(rtd->dev, "%s: Allocation event user status size %d\n", @@ -1198,7 +1201,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "REG_SND_MODEL_V2"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&snd_modelv232, arg, @@ -1239,7 +1243,7 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "SET_PARAMS_32"); - return -EINVAL; + err = -EINVAL; } if (copy_from_user(&det_params32, arg, @@ -1282,14 +1286,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if not using topology\n", __func__, "SET_MODULE_PARAMS_32"); - return -EINVAL; - } - - if (!arg) { - dev_err(rtd->dev, - "%s: %s: No Param data to set\n", - __func__, "SET_MODULE_PARAMS_32"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&p_data_32, arg, @@ -1298,7 +1296,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: copy_from_user failed, size = %zd\n", __func__, "SET_MODULE_PARAMS_32", sizeof(p_data_32)); - return -EFAULT; + err = -EFAULT; + goto done; } p_data.params = compat_ptr(p_data_32.params); @@ -1310,7 +1309,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: Invalid num_params %d\n", __func__, "SET_MODULE_PARAMS_32", p_data.num_params); - return -EINVAL; + err = -EINVAL; + goto done; } if (p_data.data_size != @@ -1319,7 +1319,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: %s: Invalid size %d\n", __func__, "SET_MODULE_PARAMS_32", p_data.data_size); - return -EINVAL; + err = -EINVAL; + goto done; } p_size = sizeof(struct lsm_params_info_32) * @@ -1330,7 +1331,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: no memory for params32, size = %zd\n", __func__, p_size); - return -ENOMEM; + err = -ENOMEM; + goto done; } p_size = sizeof(struct lsm_params_info) * p_data.num_params; @@ -1340,7 +1342,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, "%s: no memory for params, size = %zd\n", __func__, p_size); kfree(params32); - return -ENOMEM; + err = -ENOMEM; + goto done; } if (copy_from_user(params32, p_data.params, @@ -1350,7 +1353,8 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, __func__, "params32", p_data.data_size); kfree(params32); kfree(params); - return -EFAULT; + err = -EFAULT; + goto done; } p_info_32 = (struct lsm_params_info_32 *) params32; @@ -1376,10 +1380,25 @@ static int msm_lsm_ioctl_compat(struct snd_pcm_substream *substream, kfree(params32); break; } + case SNDRV_LSM_REG_SND_MODEL_V2: + case SNDRV_LSM_SET_PARAMS: + case SNDRV_LSM_SET_MODULE_PARAMS: + /* + * In ideal cases, the compat_ioctl should never be called + * with the above unlocked ioctl commands. Print error + * and return error if it does. + */ + dev_err(rtd->dev, + "%s: Invalid cmd for compat_ioctl\n", + __func__); + err = -EINVAL; + break; default: err = msm_lsm_ioctl_shared(substream, cmd, arg); break; } +done: + mutex_unlock(&prtd->lsm_api_lock); return err; } #else @@ -1391,7 +1410,6 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, { int err = 0; u32 size = 0; - struct snd_lsm_session_data session_data; struct snd_pcm_runtime *runtime; struct snd_soc_pcm_runtime *rtd; struct lsm_priv *prtd; @@ -1405,27 +1423,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, prtd = runtime->private_data; rtd = substream->private_data; + mutex_lock(&prtd->lsm_api_lock); switch (cmd) { - case SNDRV_LSM_SET_SESSION_DATA: - dev_dbg(rtd->dev, - "%s: SNDRV_LSM_SET_SESSION_DATA\n", - __func__); - if (copy_from_user(&session_data, (void *)arg, - sizeof(struct snd_lsm_session_data))) { - err = -EFAULT; - dev_err(rtd->dev, - "%s: copy from user failed, size %zd\n", - __func__, sizeof(struct snd_lsm_session_data)); - break; - } - if (!err) - err = msm_lsm_ioctl_shared(substream, - cmd, &session_data); - if (err) - dev_err(rtd->dev, - "%s REG_SND_MODEL failed err %d\n", - __func__, err); - break; case SNDRV_LSM_REG_SND_MODEL_V2: { struct snd_lsm_sound_model_v2 snd_model_v2; @@ -1433,14 +1432,10 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "REG_SND_MODEL_V2"); - return -EINVAL; + err = -EINVAL; + goto done; } - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid params snd_model\n", __func__); - return -EINVAL; - } if (copy_from_user(&snd_model_v2, arg, sizeof(snd_model_v2))) { err = -EFAULT; dev_err(rtd->dev, @@ -1465,16 +1460,11 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if using topology\n", __func__, "SET_PARAMS"); - return -EINVAL; + err = -EINVAL; + goto done; } pr_debug("%s: SNDRV_LSM_SET_PARAMS\n", __func__); - if (!arg) { - dev_err(rtd->dev, - "%s: %s, Invalid params\n", - __func__, "SNDRV_LSM_SET_PARAMS"); - return -EINVAL; - } if (copy_from_user(&det_params, arg, sizeof(det_params))) { @@ -1492,7 +1482,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: LSM_SET_PARAMS failed, err %d\n", __func__, err); - return err; + + goto done; } case SNDRV_LSM_SET_MODULE_PARAMS: { @@ -1504,14 +1495,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: not supported if not using topology\n", __func__, "SET_MODULE_PARAMS"); - return -EINVAL; - } - - if (!arg) { - dev_err(rtd->dev, - "%s: %s: No Param data to set\n", - __func__, "SET_MODULE_PARAMS"); - return -EINVAL; + err = -EINVAL; + goto done; } if (copy_from_user(&p_data, arg, @@ -1519,7 +1504,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: %s: copy_from_user failed, size = %zd\n", __func__, "p_data", sizeof(p_data)); - return -EFAULT; + err = -EFAULT; + goto done; } if (p_data.num_params > LSM_PARAMS_MAX) { @@ -1527,7 +1513,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: Invalid num_params %d\n", __func__, "SET_MODULE_PARAMS", p_data.num_params); - return -EINVAL; + err = -EINVAL; + goto done; } p_size = p_data.num_params * @@ -1538,7 +1525,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: Invalid size %zd\n", __func__, "SET_MODULE_PARAMS", p_size); - return -EFAULT; + err = -EFAULT; + goto done; } params = kzalloc(p_size, GFP_KERNEL); @@ -1546,7 +1534,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, dev_err(rtd->dev, "%s: no memory for params\n", __func__); - return -ENOMEM; + err = -ENOMEM; + goto done; } if (copy_from_user(params, p_data.params, @@ -1555,7 +1544,8 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, "%s: %s: copy_from_user failed, size = %d\n", __func__, "params", p_data.data_size); kfree(params); - return -EFAULT; + err = -EFAULT; + goto done; } err = msm_lsm_process_params(substream, &p_data, params); @@ -1571,17 +1561,12 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, struct snd_lsm_event_status *user = NULL, userarg; dev_dbg(rtd->dev, "%s: SNDRV_LSM_EVENT_STATUS\n", __func__); - if (!arg) { - dev_err(rtd->dev, - "%s: Invalid params event status\n", - __func__); - return -EINVAL; - } if (copy_from_user(&userarg, arg, sizeof(userarg))) { dev_err(rtd->dev, "%s: err copyuser event_status\n", __func__); - return -EFAULT; + err = -EFAULT; + goto done; } if (userarg.payload_size > @@ -1589,17 +1574,19 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, pr_err("%s: payload_size %d is invalid, max allowed = %d\n", __func__, userarg.payload_size, LISTEN_MAX_STATUS_PAYLOAD_SIZE); - return -EINVAL; + err = -EINVAL; + goto done; } size = sizeof(struct snd_lsm_event_status) + userarg.payload_size; - user = kmalloc(size, GFP_KERNEL); + user = kzalloc(size, GFP_KERNEL); if (!user) { dev_err(rtd->dev, "%s: Allocation failed event status size %d\n", __func__, size); - return -EFAULT; + err = -EFAULT; + goto done; } else { user->payload_size = userarg.payload_size; err = msm_lsm_ioctl_shared(substream, cmd, user); @@ -1622,12 +1609,14 @@ static int msm_lsm_ioctl(struct snd_pcm_substream *substream, if (err) dev_err(rtd->dev, "%s: lsmevent failed %d", __func__, err); - return err; + goto done; } default: err = msm_lsm_ioctl_shared(substream, cmd, arg); break; } +done: + mutex_unlock(&prtd->lsm_api_lock); return err; } @@ -1644,6 +1633,7 @@ static int msm_lsm_open(struct snd_pcm_substream *substream) __func__); return -ENOMEM; } + mutex_init(&prtd->lsm_api_lock); spin_lock_init(&prtd->event_lock); init_waitqueue_head(&prtd->event_wait); init_waitqueue_head(&prtd->period_wait); @@ -1773,6 +1763,7 @@ static int msm_lsm_close(struct snd_pcm_substream *substream) kfree(prtd->event_status); prtd->event_status = NULL; spin_unlock_irqrestore(&prtd->event_lock, flags); + mutex_destroy(&prtd->lsm_api_lock); kfree(prtd); runtime->private_data = NULL; diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-afe-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-afe-v2.c index d65108e04e0bd..b1a1ea54a73e7 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-afe-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-afe-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -684,6 +684,7 @@ static int msm_afe_close(struct snd_pcm_substream *substream) mutex_unlock(&prtd->lock); prtd->prepared--; kfree(prtd); + runtime->private_data = NULL; return 0; } static int msm_afe_prepare(struct snd_pcm_substream *substream) diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c index 65c0e51e47636..a7619fdae5460 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -478,6 +478,7 @@ static int msm_pcm_playback_close(struct snd_pcm_substream *substream) pr_debug("%s\n", __func__); kfree(prtd); + runtime->private_data = NULL; return 0; } diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c b/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c index 05c5e1e8a50ac..289049c7fac2d 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-q6-noirq.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2016-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 @@ -375,6 +375,11 @@ static int msm_pcm_trigger(struct snd_pcm_substream *substream, int cmd) q6asm_cmd(prtd->audio_client, CMD_PAUSE); q6asm_cmd(prtd->audio_client, CMD_FLUSH); buf = q6asm_shared_io_buf(prtd->audio_client, dir); + if (buf == NULL) { + pr_err("%s: shared IO buffer is null\n", __func__); + ret = -EINVAL; + break; + } memset(buf->data, 0, buf->actual_size); break; case SNDRV_PCM_TRIGGER_SUSPEND: @@ -539,6 +544,8 @@ static int msm_pcm_close(struct snd_pcm_substream *substream) SNDRV_PCM_STREAM_PLAYBACK : SNDRV_PCM_STREAM_CAPTURE); kfree(prtd); + runtime->private_data = NULL; + return 0; } diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.c index e6cf312009ad9..07aca5cb5eca9 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-q6-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -738,6 +738,8 @@ static int msm_pcm_playback_close(struct snd_pcm_substream *substream) msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->be_id, SNDRV_PCM_STREAM_PLAYBACK); kfree(prtd); + runtime->private_data = NULL; + return 0; } @@ -841,6 +843,7 @@ static int msm_pcm_capture_close(struct snd_pcm_substream *substream) msm_pcm_routing_dereg_phy_stream(soc_prtd->dai_link->be_id, SNDRV_PCM_STREAM_CAPTURE); kfree(prtd); + runtime->private_data = NULL; return 0; } diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-devdep.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-devdep.c index e57db7d9c4945..da177c99763b6 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-devdep.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-devdep.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014, The Linux Foundation. All rights reserved. +/* Copyright (c) 2014, 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 @@ -14,8 +14,6 @@ #include #include #include -#include - #include "msm-pcm-routing-devdep.h" #include "msm-ds2-dap-config.h" @@ -53,23 +51,6 @@ static int msm_pcm_routing_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER: ret = msm_ds2_dap_ioctl(hw, file, cmd, argp); break; - case DTS_EAGLE_IOCTL_GET_CACHE_SIZE: - case DTS_EAGLE_IOCTL_SET_CACHE_SIZE: - case DTS_EAGLE_IOCTL_GET_PARAM: - case DTS_EAGLE_IOCTL_SET_PARAM: - case DTS_EAGLE_IOCTL_SET_CACHE_BLOCK: - case DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE: - case DTS_EAGLE_IOCTL_GET_LICENSE: - case DTS_EAGLE_IOCTL_SET_LICENSE: - case DTS_EAGLE_IOCTL_SEND_LICENSE: - case DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS: - ret = msm_dts_eagle_ioctl(cmd, arg); - if (ret == -EPERM) { - pr_err("%s called with invalid control 0x%X\n", - __func__, cmd); - ret = -EINVAL; - } - break; default: pr_err("%s called with invalid control 0x%X\n", __func__, cmd); ret = -EINVAL; @@ -81,7 +62,6 @@ static int msm_pcm_routing_hwdep_ioctl(struct snd_hwdep *hw, struct file *file, void msm_pcm_routing_hwdep_free(struct snd_pcm *pcm) { pr_debug("%s\n", __func__); - msm_dts_eagle_pcm_free(pcm); } #ifdef CONFIG_COMPAT @@ -105,23 +85,6 @@ static int msm_pcm_routing_hwdep_compat_ioctl(struct snd_hwdep *hw, case SNDRV_DEVDEP_DAP_IOCTL_GET_VISUALIZER32: ret = msm_ds2_dap_compat_ioctl(hw, file, cmd, argp); break; - case DTS_EAGLE_IOCTL_GET_CACHE_SIZE32: - case DTS_EAGLE_IOCTL_SET_CACHE_SIZE32: - case DTS_EAGLE_IOCTL_GET_PARAM32: - case DTS_EAGLE_IOCTL_SET_PARAM32: - case DTS_EAGLE_IOCTL_SET_CACHE_BLOCK32: - case DTS_EAGLE_IOCTL_SET_ACTIVE_DEVICE32: - case DTS_EAGLE_IOCTL_GET_LICENSE32: - case DTS_EAGLE_IOCTL_SET_LICENSE32: - case DTS_EAGLE_IOCTL_SEND_LICENSE32: - case DTS_EAGLE_IOCTL_SET_VOLUME_COMMANDS32: - ret = msm_dts_eagle_compat_ioctl(cmd, arg); - if (ret == -EPERM) { - pr_err("%s called with invalid control 0x%X\n", - __func__, cmd); - ret = -EINVAL; - } - break; default: pr_err("%s called with invalid control 0x%X\n", __func__, cmd); ret = -EINVAL; @@ -167,6 +130,6 @@ int msm_pcm_routing_hwdep_new(struct snd_soc_pcm_runtime *runtime, #ifdef CONFIG_COMPAT hwdep->ops.ioctl_compat = msm_pcm_routing_hwdep_compat_ioctl; #endif - return msm_dts_eagle_pcm_new(runtime); + return rc; } #endif diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c index 1f534f565f3bb..5c0206ef7bcfd 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-routing-v2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -33,7 +33,6 @@ #include #include #include -#include #include #include @@ -170,10 +169,6 @@ static void msm_pcm_routing_cfg_pp(int port_id, int copp_idx, int topology, __func__, topology, port_id, rc); } break; - case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX: - pr_debug("%s: DTS_EAGLE_COPP_TOPOLOGY_ID\n", __func__); - msm_dts_eagle_init_post(port_id, copp_idx); - break; case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE: pr_debug("%s: TOPOLOGY_ID_AUDIOSPHERE\n", __func__); msm_qti_pp_asphere_init(port_id, copp_idx); @@ -205,10 +200,6 @@ static void msm_pcm_routing_deinit_pp(int port_id, int topology) msm_dolby_dap_deinit(port_id); } break; - case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX: - pr_debug("%s: DTS_EAGLE_COPP_TOPOLOGY_ID\n", __func__); - msm_dts_eagle_deinit_post(port_id, topology); - break; case ADM_CMD_COPP_OPEN_TOPOLOGY_ID_AUDIOSPHERE: pr_debug("%s: TOPOLOGY_ID_AUDIOSPHERE\n", __func__); msm_qti_pp_asphere_deinit(port_id); @@ -1732,12 +1723,18 @@ static int msm_routing_lsm_mux_put(struct snd_kcontrol *kcontrol, dapm_kcontrol_get_wlist(kcontrol); struct snd_soc_dapm_widget *widget = wlist->widgets[0]; struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; - int mux = ucontrol->value.enumerated.item[0]; + unsigned int mux = ucontrol->value.enumerated.item[0]; int lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_5_TX; struct snd_soc_dapm_update *update = NULL; pr_debug("%s: LSM enable %ld\n", __func__, ucontrol->value.integer.value[0]); + + if (mux >= ARRAY_SIZE(mad_audio_mux_text)){ + pr_err(" %s: invalid mux value %d\n", __func__, mux); + return -EINVAL; + } + switch (ucontrol->value.integer.value[0]) { case 1: lsm_port = AFE_PORT_ID_SLIMBUS_MULTI_CHAN_0_TX; @@ -1978,6 +1975,11 @@ static int msm_routing_ec_ref_rx_put(struct snd_kcontrol *kcontrol, struct soc_enum *e = (struct soc_enum *)kcontrol->private_value; struct snd_soc_dapm_update *update = NULL; + if (mux >= e->items) { + pr_err("%s: Invalid mux value %d\n", __func__, mux); + return -EINVAL; + } + mutex_lock(&routing_lock); switch (ucontrol->value.integer.value[0]) { case 0: @@ -2137,6 +2139,11 @@ static int msm_routing_ext_ec_put(struct snd_kcontrol *kcontrol, uint16_t ext_ec_ref_port_id; struct snd_soc_dapm_update *update = NULL; + if (mux >= e->items) { + pr_err("%s: Invalid mux value %d\n", __func__, mux); + return -EINVAL; + } + mutex_lock(&routing_lock); msm_route_ext_ec_ref = ucontrol->value.integer.value[0]; @@ -6118,7 +6125,7 @@ int msm_routing_get_rms_value_control(struct snd_kcontrol *kcontrol, int *update_param_value; uint32_t param_length = sizeof(uint32_t); uint32_t param_payload_len = RMS_PAYLOAD_LEN * sizeof(uint32_t); - param_value = kzalloc(param_length, GFP_KERNEL); + param_value = kzalloc(param_length + param_payload_len, GFP_KERNEL); if (!param_value) { pr_err("%s, param memory alloc failed\n", __func__); return -ENOMEM; @@ -8421,6 +8428,7 @@ static const struct snd_soc_dapm_route intercon[] = { {"VOIP_UL", NULL, "VOC_EXT_EC MUX"}, {"VoLTE_UL", NULL, "VOC_EXT_EC MUX"}, {"VOICE2_UL", NULL, "VOC_EXT_EC MUX"}, + {"VoWLAN_UL", NULL, "VOC_EXT_EC MUX"}, {"VOICEMMODE1_UL", NULL, "VOC_EXT_EC MUX"}, {"VOICEMMODE2_UL", NULL, "VOC_EXT_EC MUX"}, @@ -9509,8 +9517,6 @@ static int msm_routing_probe(struct snd_soc_platform *platform) device_pp_params_mixer_controls, ARRAY_SIZE(device_pp_params_mixer_controls)); - msm_dts_eagle_add_controls(platform); - snd_soc_add_platform_controls(platform, msm_source_tracking_controls, ARRAY_SIZE(msm_source_tracking_controls)); return 0; diff --git a/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c b/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c index 65c24973036ef..c1493a46123eb 100644 --- a/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c +++ b/sound/soc/msm/qdsp6v2/msm-pcm-voip-v2.c @@ -823,6 +823,11 @@ static int msm_pcm_playback_copy(struct snd_pcm_substream *substream, int a, (sizeof(buf_node->frame.frm_hdr) + sizeof(buf_node->frame.pktlen)); } + if (ret) { + pr_err("%s: copy from user failed %d\n", + __func__, ret); + return -EFAULT; + } spin_lock_irqsave(&prtd->dsp_lock, dsp_flags); list_add_tail(&buf_node->list, &prtd->in_queue); spin_unlock_irqrestore(&prtd->dsp_lock, dsp_flags); diff --git a/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c b/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c index 5887c1f72ade4..da82df8e4b110 100644 --- a/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c +++ b/sound/soc/msm/qdsp6v2/msm-qti-pp-config.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -341,7 +341,7 @@ static int msm_qti_pp_get_rms_value_control(struct snd_kcontrol *kcontrol, uint32_t param_length = sizeof(uint32_t); uint32_t param_payload_len = RMS_PAYLOAD_LEN * sizeof(uint32_t); struct msm_pcm_routing_bdai_data msm_bedai; - param_value = kzalloc(param_length, GFP_KERNEL); + param_value = kzalloc(param_length + param_payload_len, GFP_KERNEL); if (!param_value) { pr_err("%s, param memory alloc failed\n", __func__); return -ENOMEM; @@ -573,7 +573,7 @@ static int msm_qti_pp_set_sec_auxpcm_lb_vol_mixer( static int msm_qti_pp_get_channel_map_mixer(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) { - char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL]; + char channel_map[PCM_FORMAT_MAX_NUM_CHANNEL] = {0}; int i; adm_get_multi_ch_map(channel_map, ADM_PATH_PLAYBACK); diff --git a/sound/soc/msm/qdsp6v2/q6adm.c b/sound/soc/msm/qdsp6v2/q6adm.c index 418aad964b35a..6ba2c7e9ffec4 100644 --- a/sound/soc/msm/qdsp6v2/q6adm.c +++ b/sound/soc/msm/qdsp6v2/q6adm.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. +/* Copyright (c) 2012-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 @@ -23,7 +23,6 @@ #include #include #include -#include #include "msm-dts-srs-tm-config.h" #include @@ -251,222 +250,6 @@ static int adm_get_next_available_copp(int port_idx) return idx; } -int adm_dts_eagle_set(int port_id, int copp_idx, int param_id, - void *data, uint32_t size) -{ - struct adm_cmd_set_pp_params_v5 admp; - int p_idx, ret = 0, *ob_params; - - pr_debug("DTS_EAGLE_ADM: %s - port id %i, copp idx %i, param id 0x%X size %u\n", - __func__, port_id, copp_idx, param_id, size); - - port_id = afe_convert_virtual_to_portid(port_id); - p_idx = adm_validate_and_get_port_index(port_id); - pr_debug("DTS_EAGLE_ADM: %s - after lookup, port id %i, port idx %i\n", - __func__, port_id, p_idx); - - if (p_idx < 0) { - pr_err("DTS_EAGLE_ADM: %s: invalid port index 0x%x, port id 0x%x\n", - __func__, p_idx, port_id); - return -EINVAL; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("DTS_EAGLE_ADM: %s: Invalid copp_idx: %d\n", __func__, - copp_idx); - return -EINVAL; - } - - ob_params = (int *)this_adm.outband_memmap.kvaddr; - if (ob_params == NULL) { - pr_err("DTS_EAGLE_ADM: %s - NULL memmap. Non Eagle topology selected?\n", - __func__); - ret = -EINVAL; - goto fail_cmd; - } - /* check for integer overflow */ - if (size > (UINT_MAX - APR_CMD_OB_HDR_SZ)) - ret = -EINVAL; - if ((ret < 0) || - (size + APR_CMD_OB_HDR_SZ > this_adm.outband_memmap.size)) { - pr_err("DTS_EAGLE_ADM - %s: ion alloc of size %zu too small for size requested %u\n", - __func__, this_adm.outband_memmap.size, - size + APR_CMD_OB_HDR_SZ); - ret = -EINVAL; - goto fail_cmd; - } - *ob_params++ = AUDPROC_MODULE_ID_DTS_HPX_POSTMIX; - *ob_params++ = param_id; - *ob_params++ = size; - memcpy(ob_params, data, size); - - admp.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - admp.hdr.pkt_size = sizeof(admp); - admp.hdr.src_svc = APR_SVC_ADM; - admp.hdr.src_domain = APR_DOMAIN_APPS; - admp.hdr.src_port = port_id; - admp.hdr.dest_svc = APR_SVC_ADM; - admp.hdr.dest_domain = APR_DOMAIN_ADSP; - admp.hdr.dest_port = atomic_read(&this_adm.copp.id[p_idx][copp_idx]); - admp.hdr.token = p_idx << 16 | copp_idx; - admp.hdr.opcode = ADM_CMD_SET_PP_PARAMS_V5; - admp.payload_addr_lsw = lower_32_bits(this_adm.outband_memmap.paddr); - admp.payload_addr_msw = msm_audio_populate_upper_32_bits( - this_adm.outband_memmap.paddr); - admp.mem_map_handle = atomic_read(&this_adm.mem_map_handles[ - ADM_DTS_EAGLE]); - admp.payload_size = size + sizeof(struct adm_param_data_v5); - - pr_debug("DTS_EAGLE_ADM: %s - Command was sent now check Q6 - port id = %d, size %d, module id %x, param id %x.\n", - __func__, admp.hdr.dest_port, - admp.payload_size, AUDPROC_MODULE_ID_DTS_HPX_POSTMIX, - param_id); - atomic_set(&this_adm.copp.stat[p_idx][copp_idx], -1); - ret = apr_send_pkt(this_adm.apr, (uint32_t *)&admp); - if (ret < 0) { - pr_err("DTS_EAGLE_ADM: %s - ADM enable for port %d failed\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } - ret = wait_event_timeout(this_adm.copp.wait[p_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("DTS_EAGLE_ADM: %s - set params timed out port = %d\n", - __func__, port_id); - ret = -EINVAL; - } else if (atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx])); - } else { - ret = 0; - } - -fail_cmd: - return ret; -} - -int adm_dts_eagle_get(int port_id, int copp_idx, int param_id, - void *data, uint32_t size) -{ - struct adm_cmd_get_pp_params_v5 admp; - int p_idx, ret = 0, *ob_params; - uint32_t orig_size = size; - pr_debug("DTS_EAGLE_ADM: %s - port id %i, copp idx %i, param id 0x%X\n", - __func__, port_id, copp_idx, param_id); - - port_id = afe_convert_virtual_to_portid(port_id); - p_idx = adm_validate_and_get_port_index(port_id); - if (p_idx < 0) { - pr_err("DTS_EAGLE_ADM: %s - invalid port index %i, port id %i, copp idx %i\n", - __func__, p_idx, port_id, copp_idx); - return -EINVAL; - } - - if (copp_idx < 0 || copp_idx >= MAX_COPPS_PER_PORT) { - pr_err("DTS_EAGLE_ADM: %s: Invalid copp_idx: %d\n", __func__, - copp_idx); - return -EINVAL; - } - - if ((size == 0) || !data) { - pr_err("DTS_EAGLE_ADM: %s - invalid size %u or pointer %pK.\n", - __func__, size, data); - return -EINVAL; - } - - size = (size+3) & 0xFFFFFFFC; - - ob_params = (int *)(this_adm.outband_memmap.kvaddr); - if (ob_params == NULL) { - pr_err("DTS_EAGLE_ADM: %s - NULL memmap. Non Eagle topology selected?", - __func__); - ret = -EINVAL; - goto fail_cmd; - } - /* check for integer overflow */ - if (size > (UINT_MAX - APR_CMD_OB_HDR_SZ)) - ret = -EINVAL; - if ((ret < 0) || - (size + APR_CMD_OB_HDR_SZ > this_adm.outband_memmap.size)) { - pr_err("DTS_EAGLE_ADM - %s: ion alloc of size %zu too small for size requested %u\n", - __func__, this_adm.outband_memmap.size, - size + APR_CMD_OB_HDR_SZ); - ret = -EINVAL; - goto fail_cmd; - } - *ob_params++ = AUDPROC_MODULE_ID_DTS_HPX_POSTMIX; - *ob_params++ = param_id; - *ob_params++ = size; - - admp.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - admp.hdr.pkt_size = sizeof(admp); - admp.hdr.src_svc = APR_SVC_ADM; - admp.hdr.src_domain = APR_DOMAIN_APPS; - admp.hdr.src_port = port_id; - admp.hdr.dest_svc = APR_SVC_ADM; - admp.hdr.dest_domain = APR_DOMAIN_ADSP; - admp.hdr.dest_port = atomic_read(&this_adm.copp.id[p_idx][copp_idx]); - admp.hdr.token = p_idx << 16 | copp_idx; - admp.hdr.opcode = ADM_CMD_GET_PP_PARAMS_V5; - admp.data_payload_addr_lsw = - lower_32_bits(this_adm.outband_memmap.paddr); - admp.data_payload_addr_msw = - msm_audio_populate_upper_32_bits( - this_adm.outband_memmap.paddr); - admp.mem_map_handle = atomic_read(&this_adm.mem_map_handles[ - ADM_DTS_EAGLE]); - admp.module_id = AUDPROC_MODULE_ID_DTS_HPX_POSTMIX; - admp.param_id = param_id; - admp.param_max_size = size + sizeof(struct adm_param_data_v5); - admp.reserved = 0; - - atomic_set(&this_adm.copp.stat[p_idx][copp_idx], -1); - - ret = apr_send_pkt(this_adm.apr, (uint32_t *)&admp); - if (ret < 0) { - pr_err("DTS_EAGLE_ADM: %s - Failed to get EAGLE Params on port %d\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } - ret = wait_event_timeout(this_adm.copp.wait[p_idx][copp_idx], - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]) >= 0, - msecs_to_jiffies(TIMEOUT_MS)); - if (!ret) { - pr_err("DTS_EAGLE_ADM: %s - EAGLE get params timed out port = %d\n", - __func__, port_id); - ret = -EINVAL; - goto fail_cmd; - } else if (atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx]))); - ret = adsp_err_get_lnx_err_code( - atomic_read(&this_adm.copp.stat - [p_idx][copp_idx])); - goto fail_cmd; - } - - memcpy(data, ob_params, orig_size); - ret = 0; -fail_cmd: - return ret; -} - int srs_trumedia_open(int port_id, int copp_idx, __s32 srs_tech_id, void *srs_params) { @@ -967,9 +750,10 @@ int adm_get_params_v2(int port_id, int copp_idx, uint32_t module_id, char *params, uint32_t client_id) { struct adm_cmd_get_pp_params_v5 *adm_params = NULL; - int sz, rc = 0, i = 0; + int rc = 0, i = 0; int port_idx, idx; int *params_data = (int *)params; + uint64_t sz = 0; port_id = afe_convert_virtual_to_portid(port_id); port_idx = adm_validate_and_get_port_index(port_id); @@ -978,7 +762,16 @@ int adm_get_params_v2(int port_id, int copp_idx, uint32_t module_id, return -EINVAL; } - sz = sizeof(struct adm_cmd_get_pp_params_v5) + params_length; + sz = (uint64_t)sizeof(struct adm_cmd_get_pp_params_v5) + + (uint64_t)params_length; + /* + * Check if the value of "sz" (which is ultimately assigned to + * "hdr.pkt_size") crosses U16_MAX. + */ + if (sz > U16_MAX) { + pr_err("%s: Invalid params_length\n", __func__); + return -EINVAL; + } adm_params = kzalloc(sz, GFP_KERNEL); if (!adm_params) { pr_err("%s: adm params memory alloc failed", __func__); @@ -2312,13 +2105,6 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, __func__, port_id, path, rate, channel_mode, perf_mode, topology); - /* For DTS EAGLE only, force 24 bit */ - if ((topology == ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX) && - (perf_mode == LEGACY_PCM_MODE)) { - bit_width = 24; - pr_debug("%s: Force open adm in 24-bit for DTS HPX topology 0x%x\n", - __func__, topology); - } port_id = q6audio_convert_virtual_to_portid(port_id); port_idx = adm_validate_and_get_port_index(port_id); if (port_idx < 0) { @@ -2340,8 +2126,7 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, flags = ADM_ULL_POST_PROCESSING_DEVICE_SESSION; if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID) || (topology == DS2_ADM_COPP_TOPOLOGY_ID) || - (topology == SRS_TRUMEDIA_TOPOLOGY_ID) || - (topology == ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX)) + (topology == SRS_TRUMEDIA_TOPOLOGY_ID)) topology = DEFAULT_COPP_TOPOLOGY; } else if (perf_mode == ULTRA_LOW_LATENCY_PCM_MODE) { flags = ADM_ULTRA_LOW_LATENCY_DEVICE_SESSION; @@ -2352,8 +2137,7 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, flags = ADM_LOW_LATENCY_DEVICE_SESSION; if ((topology == DOLBY_ADM_COPP_TOPOLOGY_ID) || (topology == DS2_ADM_COPP_TOPOLOGY_ID) || - (topology == SRS_TRUMEDIA_TOPOLOGY_ID) || - (topology == ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX)) + (topology == SRS_TRUMEDIA_TOPOLOGY_ID)) topology = DEFAULT_COPP_TOPOLOGY; } else { if (path == ADM_PATH_COMPRESSED_RX) @@ -2423,20 +2207,6 @@ int adm_open(int port_id, int path, int rate, int channel_mode, int topology, (uint32_t)this_adm.outband_memmap.size); } } - if ((topology == ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX) && - (perf_mode == LEGACY_PCM_MODE)) { - int res = 0; - atomic_set(&this_adm.mem_map_index, ADM_DTS_EAGLE); - msm_dts_ion_memmap(&this_adm.outband_memmap); - res = adm_memory_map_regions( - &this_adm.outband_memmap.paddr, - 0, - (uint32_t *)&this_adm.outband_memmap.size, - 1); - if (res < 0) - pr_err("%s: DTS_EAGLE mmap did not work!", - __func__); - } open.hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_SEQ_CMD, APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); @@ -2764,10 +2534,6 @@ int adm_matrix_map(int path, struct route_payload payload_map, int perf_mode) for (i = 0; i < payload_map.num_copps; i++) { port_idx = afe_get_port_index(payload_map.port_id[i]); copp_idx = payload_map.copp_idx[i]; - if (atomic_read( - &this_adm.copp.topology[port_idx][copp_idx]) == - ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX) - continue; rtac_add_adm_device(payload_map.port_id[i], atomic_read(&this_adm.copp.id [port_idx][copp_idx]), @@ -2881,21 +2647,6 @@ int adm_close(int port_id, int perf_mode, int copp_idx) } } - if ((perf_mode == LEGACY_PCM_MODE) && - (this_adm.outband_memmap.paddr != 0) && - (atomic_read( - &this_adm.copp.topology[port_idx][copp_idx]) == - ADM_CMD_COPP_OPEN_TOPOLOGY_ID_DTS_HPX)) { - atomic_set(&this_adm.mem_map_index, ADM_DTS_EAGLE); - ret = adm_memory_unmap_regions(); - if (ret < 0) { - pr_err("%s: adm mem unmmap err %d", - __func__, ret); - } else { - atomic_set(&this_adm.mem_map_handles - [ADM_DTS_EAGLE], 0); - } - } if ((afe_get_port_type(port_id) == MSM_AFE_PORT_TYPE_TX) && this_adm.sourceTrackingData.memmap.paddr) { @@ -3367,10 +3118,6 @@ static int adm_init_cal_data(void) {NULL, NULL, NULL, NULL, NULL, NULL} }, {NULL, NULL, cal_utils_match_buf_num} }, - {{DTS_EAGLE_CAL_TYPE, - {NULL, NULL, NULL, NULL, NULL, NULL} }, - {NULL, NULL, cal_utils_match_buf_num} }, - {{SRS_TRUMEDIA_CAL_TYPE, {NULL, NULL, NULL, NULL, NULL, NULL} }, {NULL, NULL, cal_utils_match_buf_num} }, diff --git a/sound/soc/msm/qdsp6v2/q6afe.c b/sound/soc/msm/qdsp6v2/q6afe.c index 3a32b14394051..d50233e601bab 100644 --- a/sound/soc/msm/qdsp6v2/q6afe.c +++ b/sound/soc/msm/qdsp6v2/q6afe.c @@ -1521,7 +1521,7 @@ static int afe_send_codec_reg_page_config( static int afe_send_codec_reg_config( struct afe_param_cdc_reg_cfg_data *cdc_reg_cfg) { - int i, j, ret; + int i, j, ret = 0; int pkt_size, payload_size, reg_per_pkt, num_pkts, num_regs; struct afe_svc_cmd_cdc_reg_cfg *config; struct afe_svc_cmd_set_param *param; @@ -4277,7 +4277,7 @@ static ssize_t afe_debug_write(struct file *filp, lbuf[cnt] = '\0'; - if (!strncmp(lb_str, "afe_loopback", 12)) { + if (!strcmp(lb_str, "afe_loopback")) { rc = afe_get_parameters(lbuf, param, 3); if (!rc) { pr_info("%s: %lu %lu %lu\n", lb_str, param[0], param[1], @@ -4306,7 +4306,7 @@ static ssize_t afe_debug_write(struct file *filp, rc = -EINVAL; } - } else if (!strncmp(lb_str, "afe_loopback_gain", 17)) { + } else if (!strcmp(lb_str, "afe_loopback_gain")) { rc = afe_get_parameters(lbuf, param, 2); if (!rc) { pr_info("%s: %s %lu %lu\n", @@ -6018,6 +6018,7 @@ static int afe_map_cal_data(int32_t cal_type, } + mutex_lock(&this_afe.afe_cmd_lock); atomic_set(&this_afe.mem_map_cal_index, cal_index); ret = afe_cmd_memory_map(cal_block->cal_data.paddr, cal_block->map_data.map_size); @@ -6030,10 +6031,12 @@ static int afe_map_cal_data(int32_t cal_type, __func__, &cal_block->cal_data.paddr, cal_block->map_data.map_size); + mutex_unlock(&this_afe.afe_cmd_lock); goto done; } cal_block->map_data.q6map_handle = atomic_read(&this_afe. mem_map_cal_handles[cal_index]); + mutex_unlock(&this_afe.afe_cmd_lock); done: return ret; } diff --git a/sound/soc/msm/qdsp6v2/q6asm.c b/sound/soc/msm/qdsp6v2/q6asm.c index 9efdc184ed789..9a0e64c7075f6 100644 --- a/sound/soc/msm/qdsp6v2/q6asm.c +++ b/sound/soc/msm/qdsp6v2/q6asm.c @@ -38,8 +38,8 @@ #include #include #include -#include #include +#include #define TRUE 0x01 #define FALSE 0x00 @@ -317,12 +317,12 @@ static void config_debug_fs_write(struct audio_buffer *ab) } static void config_debug_fs_init(void) { - out_buffer = kmalloc(OUT_BUFFER_SIZE, GFP_KERNEL); + out_buffer = kzalloc(OUT_BUFFER_SIZE, GFP_KERNEL); if (out_buffer == NULL) { pr_err("%s: kmalloc() for out_buffer failed\n", __func__); goto outbuf_fail; } - in_buffer = kmalloc(IN_BUFFER_SIZE, GFP_KERNEL); + in_buffer = kzalloc(IN_BUFFER_SIZE, GFP_KERNEL); if (in_buffer == NULL) { pr_err("%s: kmalloc() for in_buffer failed\n", __func__); goto inbuf_fail; @@ -1124,6 +1124,7 @@ struct audio_client *q6asm_audio_client_alloc(app_cb cb, void *priv) spin_lock_init(&ac->port[lcnt].dsp_lock); } atomic_set(&ac->cmd_state, 0); + atomic_set(&ac->cmd_state_pp, 0); atomic_set(&ac->nowait_cmd_cnt, 0); atomic_set(&ac->mem_state, 0); @@ -1172,15 +1173,16 @@ struct audio_client *q6asm_get_audio_client(int session_id) int q6asm_audio_client_buf_alloc(unsigned int dir, struct audio_client *ac, unsigned int bufsz, - unsigned int bufcnt) + uint32_t bufcnt) { int cnt = 0; int rc = 0; struct audio_buffer *buf; size_t len; - if (!(ac) || ((dir != IN) && (dir != OUT))) { - pr_err("%s: ac %pK dir %d\n", __func__, ac, dir); + if (!(ac) || !(bufsz) || ((dir != IN) && (dir != OUT))) { + pr_err("%s: ac %pK bufsz %d dir %d\n", __func__, ac, bufsz, + dir); return -EINVAL; } @@ -1199,7 +1201,7 @@ int q6asm_audio_client_buf_alloc(unsigned int dir, return 0; } mutex_lock(&ac->cmd_lock); - if (bufcnt > (LONG_MAX/sizeof(struct audio_buffer))) { + if (bufcnt > (U32_MAX/sizeof(struct audio_buffer))) { pr_err("%s: Buffer size overflows", __func__); mutex_unlock(&ac->cmd_lock); goto fail; @@ -1628,6 +1630,7 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) ac->apr = NULL; atomic_set(&ac->time_flag, 0); atomic_set(&ac->cmd_state, 0); + atomic_set(&ac->cmd_state_pp, 0); wake_up(&ac->time_wait); wake_up(&ac->cmd_wait); mutex_unlock(&ac->cmd_lock); @@ -1690,14 +1693,29 @@ static int32_t q6asm_callback(struct apr_client_data *data, void *priv) pr_err("%s: cmd = 0x%x returned error = 0x%x\n", __func__, payload[0], payload[1]); if (wakeup_flag) { - atomic_set(&ac->cmd_state, payload[1]); + if (payload[0] == + ASM_STREAM_CMD_SET_PP_PARAMS_V2) + atomic_set(&ac->cmd_state_pp, + payload[1]); + else + atomic_set(&ac->cmd_state, + payload[1]); wake_up(&ac->cmd_wait); } return 0; } - if (atomic_read(&ac->cmd_state) && wakeup_flag) { - atomic_set(&ac->cmd_state, 0); - wake_up(&ac->cmd_wait); + if (payload[0] == ASM_STREAM_CMD_SET_PP_PARAMS_V2) { + if (atomic_read(&ac->cmd_state_pp) && + wakeup_flag) { + atomic_set(&ac->cmd_state_pp, 0); + wake_up(&ac->cmd_wait); + } + } else { + if (atomic_read(&ac->cmd_state) && + wakeup_flag) { + atomic_set(&ac->cmd_state, 0); + wake_up(&ac->cmd_wait); + } } if (ac->cb) ac->cb(data->opcode, data->token, @@ -2225,9 +2243,6 @@ static int __q6asm_open_read(struct audio_client *ac, open.src_endpointype = ASM_END_POINT_DEVICE_MATRIX; open.preprocopo_id = q6asm_get_asm_topology_cal(); - if ((open.preprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX) || - (open.preprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS)) - open.preprocopo_id = ASM_STREAM_POSTPROCOPO_ID_NONE; open.bits_per_sample = bits_per_sample; open.mode_flags = 0x0; @@ -2479,16 +2494,9 @@ static int __q6asm_open_write(struct audio_client *ac, uint32_t format, open.bits_per_sample = bits_per_sample; open.postprocopo_id = q6asm_get_asm_topology_cal(); - if ((ac->perf_mode != LEGACY_PCM_MODE) && - ((open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX) || - (open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS))) + if (ac->perf_mode != LEGACY_PCM_MODE) open.postprocopo_id = ASM_STREAM_POSTPROCOPO_ID_NONE; - /* For DTS EAGLE only, force 24 bit */ - if ((open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX) || - (open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_HPX_PLUS)) - open.bits_per_sample = 24; - pr_debug("%s: perf_mode %d asm_topology 0x%x bps %d\n", __func__, ac->perf_mode, open.postprocopo_id, open.bits_per_sample); @@ -2672,10 +2680,6 @@ static int __q6asm_open_read_write(struct audio_client *ac, uint32_t rd_format, ac->topology = open.postprocopo_id; ac->app_type = q6asm_get_asm_app_type_cal(); - /* For DTS EAGLE only, force 24 bit */ - if ((open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_DTS_HPX) || - (open.postprocopo_id == ASM_STREAM_POSTPROC_TOPO_ID_HPX_MASTER)) - open.bits_per_sample = 24; switch (wr_format) { case FORMAT_LINEAR_PCM: @@ -2924,7 +2928,17 @@ int q6asm_set_shared_circ_buff(struct audio_client *ac, int dir) { struct audio_buffer *buf_circ; - int bytes_to_alloc, rc, len; + int bytes_to_alloc, rc; + size_t len; + + mutex_lock(&ac->cmd_lock); + + if (ac->port[dir].buf) { + pr_err("%s: Buffer already allocated\n", __func__); + rc = -EINVAL; + mutex_unlock(&ac->cmd_lock); + goto done; + } buf_circ = kzalloc(sizeof(struct audio_buffer), GFP_KERNEL); @@ -2933,9 +2947,7 @@ int q6asm_set_shared_circ_buff(struct audio_client *ac, goto done; } - mutex_lock(&ac->cmd_lock); - ac->port[dir].buf = buf_circ; bytes_to_alloc = bufsz * bufcnt; bytes_to_alloc = PAGE_ALIGN(bytes_to_alloc); @@ -2943,16 +2955,17 @@ int q6asm_set_shared_circ_buff(struct audio_client *ac, rc = msm_audio_ion_alloc("audio_client", &buf_circ->client, &buf_circ->handle, bytes_to_alloc, (ion_phys_addr_t *)&buf_circ->phys, - (size_t *)&len, &buf_circ->data); + &len, &buf_circ->data); if (rc) { pr_err("%s: Audio ION alloc is failed, rc = %d\n", __func__, rc); - mutex_unlock(&ac->cmd_lock); kfree(buf_circ); + mutex_unlock(&ac->cmd_lock); goto done; } + ac->port[dir].buf = buf_circ; buf_circ->used = dir ^ 1; buf_circ->size = bytes_to_alloc; buf_circ->actual_size = bytes_to_alloc; @@ -2985,7 +2998,8 @@ int q6asm_set_shared_pos_buff(struct audio_client *ac, int dir) { struct audio_buffer *buf_pos = &ac->shared_pos_buf; - int len, rc; + int rc; + size_t len; int bytes_to_alloc = sizeof(struct asm_shared_position_buffer); mutex_lock(&ac->cmd_lock); @@ -2994,7 +3008,7 @@ int q6asm_set_shared_pos_buff(struct audio_client *ac, rc = msm_audio_ion_alloc("audio_client", &buf_pos->client, &buf_pos->handle, bytes_to_alloc, - (ion_phys_addr_t *)&buf_pos->phys, (size_t *)&len, + (ion_phys_addr_t *)&buf_pos->phys, &len, &buf_pos->data); if (rc) { @@ -3113,12 +3127,6 @@ int q6asm_open_shared_io(struct audio_client *ac, goto done; } - if (ac->port[dir].buf) { - pr_err("%s: Buffer already allocated\n", __func__); - rc = -EINVAL; - goto done; - } - rc = q6asm_set_shared_circ_buff(ac, open, bufsz, bufcnt, dir); if (rc) @@ -5372,7 +5380,7 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, struct asm_buffer_node *buffer_node = NULL; int rc = 0; int i = 0; - int cmd_size = 0; + uint32_t cmd_size = 0; uint32_t bufcnt_t; uint32_t bufsz_t; @@ -5394,10 +5402,25 @@ static int q6asm_memory_map_regions(struct audio_client *ac, int dir, bufsz_t = PAGE_ALIGN(bufsz_t); } + if (bufcnt_t > (UINT_MAX + - sizeof(struct avs_cmd_shared_mem_map_regions)) + / sizeof(struct avs_shared_map_region_payload)) { + pr_err("%s: Unsigned Integer Overflow. bufcnt_t = %u\n", + __func__, bufcnt_t); + return -EINVAL; + } + cmd_size = sizeof(struct avs_cmd_shared_mem_map_regions) + (sizeof(struct avs_shared_map_region_payload) * bufcnt_t); + + if (bufcnt > (UINT_MAX / sizeof(struct asm_buffer_node))) { + pr_err("%s: Unsigned Integer Overflow. bufcnt = %u\n", + __func__, bufcnt); + return -EINVAL; + } + buffer_node = kzalloc(sizeof(struct asm_buffer_node) * bufcnt, GFP_KERNEL); if (!buffer_node) { @@ -5597,7 +5620,7 @@ int q6asm_set_lrgain(struct audio_client *ac, int left_gain, int right_gain) memset(&multi_ch_gain, 0, sizeof(multi_ch_gain)); sz = sizeof(struct asm_volume_ctrl_multichannel_gain); q6asm_add_hdr_async(ac, &multi_ch_gain.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); multi_ch_gain.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; multi_ch_gain.param.data_payload_addr_lsw = 0; multi_ch_gain.param.data_payload_addr_msw = 0; @@ -5623,20 +5646,20 @@ int q6asm_set_lrgain(struct audio_client *ac, int left_gain, int right_gain) } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, multi_ch_gain.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] , set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), multi_ch_gain.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -5691,7 +5714,7 @@ int q6asm_set_multich_gain(struct audio_client *ac, uint32_t channels, memset(&multich_gain, 0, sizeof(multich_gain)); sz = sizeof(struct asm_volume_ctrl_multichannel_gain); q6asm_add_hdr_async(ac, &multich_gain.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, 1); + atomic_set(&ac->cmd_state_pp, -1); multich_gain.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; multich_gain.param.data_payload_addr_lsw = 0; multich_gain.param.data_payload_addr_msw = 0; @@ -5729,17 +5752,17 @@ int q6asm_set_multich_gain(struct audio_client *ac, uint32_t channels, } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) <= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, multich_gain.data.param_id); rc = -EINVAL; goto done; } - if (atomic_read(&ac->cmd_state) < 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%d] , set-params paramid[0x%x]\n", - __func__, atomic_read(&ac->cmd_state), - multich_gain.data.param_id); + __func__, atomic_read(&ac->cmd_state_pp), + multich_gain.data.param_id); rc = -EINVAL; goto done; } @@ -5767,7 +5790,7 @@ int q6asm_set_mute(struct audio_client *ac, int muteflag) sz = sizeof(struct asm_volume_ctrl_mute_config); q6asm_add_hdr_async(ac, &mute.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); mute.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; mute.param.data_payload_addr_lsw = 0; mute.param.data_payload_addr_msw = 0; @@ -5789,20 +5812,20 @@ int q6asm_set_mute(struct audio_client *ac, int muteflag) } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, mute.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), mute.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -5810,233 +5833,6 @@ int q6asm_set_mute(struct audio_client *ac, int muteflag) return rc; } -int q6asm_dts_eagle_set(struct audio_client *ac, int param_id, uint32_t size, - void *data, struct param_outband *po, int m_id) -{ - int rc = 0, *ob_params = NULL; - uint32_t sz = sizeof(struct asm_dts_eagle_param) + (po ? 0 : size); - struct asm_dts_eagle_param *ad; - - if (!ac || ac->apr == NULL || (size == 0) || !data) { - pr_err("DTS_EAGLE_ASM - %s: APR handle NULL, invalid size %u or pointer %pK.\n", - __func__, size, data); - return -EINVAL; - } - - ad = kzalloc(sz, GFP_KERNEL); - if (!ad) { - pr_err("DTS_EAGLE_ASM - %s: error allocating mem of size %u\n", - __func__, sz); - return -ENOMEM; - } - pr_debug("DTS_EAGLE_ASM - %s: ac %pK param_id 0x%x size %u data %pK m_id 0x%x\n", - __func__, ac, param_id, size, data, m_id); - q6asm_add_hdr_async(ac, &ad->hdr, sz, 1); - ad->hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; - ad->param.data_payload_addr_lsw = 0; - ad->param.data_payload_addr_msw = 0; - - ad->param.mem_map_handle = 0; - ad->param.data_payload_size = size + - sizeof(struct asm_stream_param_data_v2); - ad->data.module_id = m_id; - ad->data.param_id = param_id; - ad->data.param_size = size; - ad->data.reserved = 0; - atomic_set(&ac->cmd_state, -1); - - if (po) { - struct list_head *ptr, *next; - struct asm_buffer_node *node; - pr_debug("DTS_EAGLE_ASM - %s: using out of band memory (virtual %pK, physical %pK)\n", - __func__, po->kvaddr, &po->paddr); - ad->param.data_payload_addr_lsw = lower_32_bits(po->paddr); - ad->param.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(po->paddr); - list_for_each_safe(ptr, next, &ac->port[IN].mem_map_handle) { - node = list_entry(ptr, struct asm_buffer_node, list); - if (node->buf_phys_addr == po->paddr) { - ad->param.mem_map_handle = node->mmap_hdl; - break; - } - } - if (ad->param.mem_map_handle == 0) { - pr_err("DTS_EAGLE_ASM - %s: mem map handle not found\n", - __func__); - rc = -EINVAL; - goto fail_cmd; - } - /* check for integer overflow */ - if (size > (UINT_MAX - APR_CMD_OB_HDR_SZ)) - rc = -EINVAL; - if ((rc < 0) || (size + APR_CMD_OB_HDR_SZ > po->size)) { - pr_err("DTS_EAGLE_ASM - %s: ion alloc of size %zu too small for size requested %u\n", - __func__, po->size, size + APR_CMD_OB_HDR_SZ); - rc = -EINVAL; - goto fail_cmd; - } - ob_params = (int *)po->kvaddr; - *ob_params++ = m_id; - *ob_params++ = param_id; - *ob_params++ = size; - memcpy(ob_params, data, size); - } else { - pr_debug("DTS_EAGLE_ASM - %s: using in band\n", __func__); - memcpy(((char *)ad) + sizeof(struct asm_dts_eagle_param), - data, size); - } - rc = apr_send_pkt(ac->apr, (uint32_t *)ad); - if (rc < 0) { - pr_err("DTS_EAGLE_ASM - %s: set-params send failed paramid[0x%x]\n", - __func__, ad->data.param_id); - rc = -EINVAL; - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 1*HZ); - if (!rc) { - pr_err("DTS_EAGLE_ASM - %s: timeout, set-params paramid[0x%x]\n", - __func__, ad->data.param_id); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - rc = 0; -fail_cmd: - kfree(ad); - return rc; -} - -int q6asm_dts_eagle_get(struct audio_client *ac, int param_id, uint32_t size, - void *data, struct param_outband *po, int m_id) -{ - struct asm_dts_eagle_param_get *ad; - int rc = 0, *ob_params = NULL; - uint32_t sz = sizeof(struct asm_dts_eagle_param) + APR_CMD_GET_HDR_SZ + - (po ? 0 : size); - - if (!ac || ac->apr == NULL || (size == 0) || !data) { - pr_err("DTS_EAGLE_ASM - %s: APR handle NULL, invalid size %u or pointer %pK\n", - __func__, size, data); - return -EINVAL; - } - ad = kzalloc(sz, GFP_KERNEL); - if (!ad) { - pr_err("DTS_EAGLE_ASM - %s: error allocating memory of size %u\n", - __func__, sz); - return -ENOMEM; - } - pr_debug("DTS_EAGLE_ASM - %s: ac %pK param_id 0x%x size %u data %pK m_id 0x%x\n", - __func__, ac, param_id, size, data, m_id); - q6asm_add_hdr(ac, &ad->hdr, sz, TRUE); - ad->hdr.opcode = ASM_STREAM_CMD_GET_PP_PARAMS_V2; - ad->param.data_payload_addr_lsw = 0; - ad->param.data_payload_addr_msw = 0; - ad->param.mem_map_handle = 0; - ad->param.module_id = m_id; - ad->param.param_id = param_id; - ad->param.param_max_size = size + APR_CMD_GET_HDR_SZ; - ad->param.reserved = 0; - atomic_set(&ac->cmd_state, -1); - - generic_get_data = kzalloc(size + sizeof(struct generic_get_data_), - GFP_KERNEL); - if (!generic_get_data) { - pr_err("DTS_EAGLE_ASM - %s: error allocating mem of size %u\n", - __func__, size); - rc = -ENOMEM; - goto fail_cmd; - } - - if (po) { - struct list_head *ptr, *next; - struct asm_buffer_node *node; - pr_debug("DTS_EAGLE_ASM - %s: using out of band memory (virtual %pK, physical %pK)\n", - __func__, po->kvaddr, &po->paddr); - ad->param.data_payload_addr_lsw = lower_32_bits(po->paddr); - ad->param.data_payload_addr_msw = - msm_audio_populate_upper_32_bits(po->paddr); - list_for_each_safe(ptr, next, &ac->port[IN].mem_map_handle) { - node = list_entry(ptr, struct asm_buffer_node, list); - if (node->buf_phys_addr == po->paddr) { - ad->param.mem_map_handle = node->mmap_hdl; - break; - } - } - if (ad->param.mem_map_handle == 0) { - pr_err("DTS_EAGLE_ASM - %s: mem map handle not found\n", - __func__); - rc = -EINVAL; - goto fail_cmd; - } - /* check for integer overflow */ - if (size > (UINT_MAX - APR_CMD_OB_HDR_SZ)) - rc = -EINVAL; - if ((rc < 0) || (size + APR_CMD_OB_HDR_SZ > po->size)) { - pr_err("DTS_EAGLE_ASM - %s: ion alloc of size %zu too small for size requested %u\n", - __func__, po->size, size + APR_CMD_OB_HDR_SZ); - rc = -EINVAL; - goto fail_cmd; - } - ob_params = (int *)po->kvaddr; - *ob_params++ = m_id; - *ob_params++ = param_id; - *ob_params++ = size; - generic_get_data->is_inband = 0; - } else { - pr_debug("DTS_EAGLE_ASM - %s: using in band\n", __func__); - generic_get_data->is_inband = 1; - } - - rc = apr_send_pkt(ac->apr, (uint32_t *)ad); - if (rc < 0) { - pr_err("DTS_EAGLE_ASM - %s: Commmand 0x%x failed\n", __func__, - ad->hdr.opcode); - goto fail_cmd; - } - - rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 1*HZ); - if (!rc) { - pr_err("DTS_EAGLE_ASM - %s: timeout in get\n", - __func__); - rc = -ETIMEDOUT; - goto fail_cmd; - } - - if (atomic_read(&ac->cmd_state) > 0) { - pr_err("%s: DSP returned error[%s]\n", - __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); - rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); - goto fail_cmd; - } - - if (generic_get_data->valid) { - rc = 0; - memcpy(data, po ? ob_params : generic_get_data->ints, size); - } else { - rc = -EINVAL; - pr_err("DTS_EAGLE_ASM - %s: EAGLE get params problem getting data - check callback error value\n", - __func__); - } -fail_cmd: - kfree(ad); - kfree(generic_get_data); - generic_get_data = NULL; - return rc; -} - static int __q6asm_set_volume(struct audio_client *ac, int volume, int instance) { struct asm_volume_ctrl_master_gain vol; @@ -6067,7 +5863,7 @@ static int __q6asm_set_volume(struct audio_client *ac, int volume, int instance) sz = sizeof(struct asm_volume_ctrl_master_gain); q6asm_add_hdr_async(ac, &vol.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); vol.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; vol.param.data_payload_addr_lsw = 0; vol.param.data_payload_addr_msw = 0; @@ -6089,20 +5885,20 @@ static int __q6asm_set_volume(struct audio_client *ac, int volume, int instance) } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, vol.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), vol.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } @@ -6141,7 +5937,7 @@ int q6asm_set_softpause(struct audio_client *ac, sz = sizeof(struct asm_soft_pause_params); q6asm_add_hdr_async(ac, &softpause.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); softpause.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; softpause.param.data_payload_addr_lsw = 0; @@ -6168,20 +5964,20 @@ int q6asm_set_softpause(struct audio_client *ac, } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, softpause.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), softpause.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -6221,7 +6017,7 @@ static int __q6asm_set_softvolume(struct audio_client *ac, sz = sizeof(struct asm_soft_step_volume_params); q6asm_add_hdr_async(ac, &softvol.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); softvol.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; softvol.param.data_payload_addr_lsw = 0; softvol.param.data_payload_addr_msw = 0; @@ -6246,20 +6042,20 @@ static int __q6asm_set_softvolume(struct audio_client *ac, } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, softvol.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), softvol.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -6308,7 +6104,7 @@ int q6asm_equalizer(struct audio_client *ac, void *eq_p) sz = sizeof(struct asm_eq_params); eq_params = (struct msm_audio_eq_stream_config *) eq_p; q6asm_add_hdr(ac, &eq.hdr, sz, TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); eq.hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; eq.param.data_payload_addr_lsw = 0; @@ -6353,20 +6149,20 @@ int q6asm_equalizer(struct audio_client *ac, void *eq_p) } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 5*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5*HZ); if (!rc) { pr_err("%s: timeout, set-params paramid[0x%x]\n", __func__, eq.data.param_id); rc = -ETIMEDOUT; goto fail_cmd; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params paramid[0x%x]\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state)), + atomic_read(&ac->cmd_state_pp)), eq.data.param_id); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_cmd; } rc = 0; @@ -6955,7 +6751,7 @@ int q6asm_send_audio_effects_params(struct audio_client *ac, char *params, q6asm_add_hdr_async(ac, &hdr, (sizeof(struct apr_hdr) + sizeof(struct asm_stream_cmd_set_pp_params_v2) + params_length), TRUE); - atomic_set(&ac->cmd_state, -1); + atomic_set(&ac->cmd_state_pp, -1); hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; payload_params.data_payload_addr_lsw = 0; payload_params.data_payload_addr_msw = 0; @@ -6974,18 +6770,18 @@ int q6asm_send_audio_effects_params(struct audio_client *ac, char *params, goto fail_send_param; } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) >= 0), 1*HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 1*HZ); if (!rc) { pr_err("%s: timeout, audio effects set-params\n", __func__); rc = -ETIMEDOUT; goto fail_send_param; } - if (atomic_read(&ac->cmd_state) > 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%s] set-params\n", __func__, adsp_err_get_err_str( - atomic_read(&ac->cmd_state))); + atomic_read(&ac->cmd_state_pp))); rc = adsp_err_get_lnx_err_code( - atomic_read(&ac->cmd_state)); + atomic_read(&ac->cmd_state_pp)); goto fail_send_param; } @@ -7657,7 +7453,7 @@ int q6asm_send_cal(struct audio_client *ac) q6asm_add_hdr_async(ac, &hdr, (sizeof(struct apr_hdr) + sizeof(struct asm_stream_cmd_set_pp_params_v2)), TRUE); - atomic_set(&ac->cmd_state, 1); + atomic_set(&ac->cmd_state_pp, -1); hdr.opcode = ASM_STREAM_CMD_SET_PP_PARAMS_V2; payload_params.data_payload_addr_lsw = lower_32_bits(cal_block->cal_data.paddr); @@ -7683,15 +7479,15 @@ int q6asm_send_cal(struct audio_client *ac) goto free; } rc = wait_event_timeout(ac->cmd_wait, - (atomic_read(&ac->cmd_state) <= 0), 5 * HZ); + (atomic_read(&ac->cmd_state_pp) >= 0), 5 * HZ); if (!rc) { pr_err("%s: timeout, audio audstrm cal send\n", __func__); rc = -ETIMEDOUT; goto free; } - if (atomic_read(&ac->cmd_state) < 0) { + if (atomic_read(&ac->cmd_state_pp) > 0) { pr_err("%s: DSP returned error[%d] audio audstrm cal send\n", - __func__, atomic_read(&ac->cmd_state)); + __func__, atomic_read(&ac->cmd_state_pp)); rc = -EINVAL; goto free; } diff --git a/sound/soc/msm/qdsp6v2/q6core.c b/sound/soc/msm/qdsp6v2/q6core.c index cc26af528abaf..d4e4819340345 100644 --- a/sound/soc/msm/qdsp6v2/q6core.c +++ b/sound/soc/msm/qdsp6v2/q6core.c @@ -169,7 +169,7 @@ static int32_t aprv2_core_fn_q(struct apr_client_data *data, void *priv) generic_get_data->valid = 1; generic_get_data->size_in_ints = data->payload_size/sizeof(int); - pr_debug("DTS_EAGLE_CORE callback size = %i\n", + pr_debug("callback size = %i\n", data->payload_size); memcpy(generic_get_data->ints, data->payload, data->payload_size); @@ -344,115 +344,6 @@ int32_t core_get_license_status(uint32_t module_id) return ret; } -int core_dts_eagle_set(int size, char *data) -{ - struct adsp_dts_eagle *payload = NULL; - int rc = 0, size_aligned4byte; - - pr_debug("DTS_EAGLE_CORE - %s\n", __func__); - if (size <= 0 || !data) { - pr_err("DTS_EAGLE_CORE - %s: invalid size %i or pointer %pK.\n", - __func__, size, data); - return -EINVAL; - } - - size_aligned4byte = (size+3) & 0xFFFFFFFC; - ocm_core_open(); - if (q6core_lcl.core_handle_q) { - payload = kzalloc(sizeof(struct adsp_dts_eagle) + - size_aligned4byte, GFP_KERNEL); - if (!payload) { - pr_err("DTS_EAGLE_CORE - %s: out of memory (aligned size %i).\n", - __func__, size_aligned4byte); - return -ENOMEM; - } - payload->hdr.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), - APR_PKT_VER); - payload->hdr.pkt_size = sizeof(struct adsp_dts_eagle) + - size_aligned4byte; - payload->hdr.src_port = 0; - payload->hdr.dest_port = 0; - payload->hdr.token = 0; - payload->hdr.opcode = ADSP_CMD_SET_DTS_EAGLE_DATA_ID; - payload->id = DTS_EAGLE_LICENSE_ID; - payload->overwrite = 1; - payload->size = size; - memcpy(payload->data, data, size); - rc = apr_send_pkt(q6core_lcl.core_handle_q, - (uint32_t *)payload); - if (rc < 0) { - pr_err("DTS_EAGLE_CORE - %s: failed op[0x%x]rc[%d]\n", - __func__, payload->hdr.opcode, rc); - } - kfree(payload); - } - return rc; -} - -int core_dts_eagle_get(int id, int size, char *data) -{ - struct apr_hdr ah; - int rc = 0; - - pr_debug("DTS_EAGLE_CORE - %s\n", __func__); - if (size <= 0 || !data) { - pr_err("DTS_EAGLE_CORE - %s: invalid size %i or pointer %pK.\n", - __func__, size, data); - return -EINVAL; - } - ocm_core_open(); - if (q6core_lcl.core_handle_q) { - ah.hdr_field = APR_HDR_FIELD(APR_MSG_TYPE_EVENT, - APR_HDR_LEN(APR_HDR_SIZE), APR_PKT_VER); - ah.pkt_size = sizeof(struct apr_hdr); - ah.src_port = 0; - ah.dest_port = 0; - ah.token = 0; - ah.opcode = id; - - q6core_lcl.bus_bw_resp_received = 0; - generic_get_data = kzalloc(sizeof(struct generic_get_data_) - + size, GFP_KERNEL); - if (!generic_get_data) { - pr_err("DTS_EAGLE_CORE - %s: error allocating memory of size %i\n", - __func__, size); - return -ENOMEM; - } - - rc = apr_send_pkt(q6core_lcl.core_handle_q, - (uint32_t *)&ah); - if (rc < 0) { - pr_err("DTS_EAGLE_CORE - %s: failed op[0x%x]rc[%d]\n", - __func__, ah.opcode, rc); - goto fail_cmd_2; - } - - rc = wait_event_timeout(q6core_lcl.bus_bw_req_wait, - (q6core_lcl.bus_bw_resp_received == 1), - msecs_to_jiffies(TIMEOUT_MS)); - if (!rc) { - pr_err("DTS_EAGLE_CORE - %s: EAGLE get params timed out\n", - __func__); - rc = -EINVAL; - goto fail_cmd_2; - } - if (generic_get_data->valid) { - rc = 0; - memcpy(data, generic_get_data->ints, size); - } else { - rc = -EINVAL; - pr_err("DTS_EAGLE_CORE - %s: EAGLE get params problem getting data - check callback error value\n", - __func__); - } - } - -fail_cmd_2: - kfree(generic_get_data); - generic_get_data = NULL; - return rc; -} - uint32_t core_set_dolby_manufacturer_id(int manufacturer_id) { struct adsp_dolby_manufacturer_id payload; diff --git a/sound/soc/msm/qdsp6v2/q6lsm.c b/sound/soc/msm/qdsp6v2/q6lsm.c index ec734722b4158..2bf0c490e834d 100644 --- a/sound/soc/msm/qdsp6v2/q6lsm.c +++ b/sound/soc/msm/qdsp6v2/q6lsm.c @@ -348,6 +348,7 @@ void q6lsm_client_free(struct lsm_client *client) q6lsm_mmap_apr_dereg(); mutex_destroy(&client->cmd_lock); kfree(client); + client = NULL; } /* diff --git a/sound/soc/msm/qdsp6v2/q6voice.h b/sound/soc/msm/qdsp6v2/q6voice.h index 73e02d0fd37d6..a4c3a4be19ee5 100644 --- a/sound/soc/msm/qdsp6v2/q6voice.h +++ b/sound/soc/msm/qdsp6v2/q6voice.h @@ -141,7 +141,7 @@ struct share_mem_buf { struct mem_map_table { dma_addr_t phys; void *data; - uint32_t size; /* size of buffer */ + size_t size; /* size of buffer */ struct ion_handle *handle; struct ion_client *client; }; diff --git a/sound/soc/msm/qdsp6v2/rtac.c b/sound/soc/msm/qdsp6v2/rtac.c index 641a17bded648..22bed9249f2c4 100644 --- a/sound/soc/msm/qdsp6v2/rtac.c +++ b/sound/soc/msm/qdsp6v2/rtac.c @@ -883,6 +883,14 @@ int send_adm_apr(void *buf, u32 opcode) bytes_returned = ((u32 *)rtac_cal[ADM_RTAC_CAL].cal_data. kvaddr)[2] + 3 * sizeof(u32); + if (bytes_returned > rtac_cal[ADM_RTAC_CAL]. + map_data.map_size) { + pr_err("%s: Invalid data size = %d\n", + __func__, bytes_returned); + result = -EINVAL; + goto err; + } + if (bytes_returned > user_buf_size) { pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", __func__, user_buf_size, bytes_returned); @@ -1105,6 +1113,14 @@ int send_rtac_asm_apr(void *buf, u32 opcode) bytes_returned = ((u32 *)rtac_cal[ASM_RTAC_CAL].cal_data. kvaddr)[2] + 3 * sizeof(u32); + if (bytes_returned > rtac_cal[ASM_RTAC_CAL]. + map_data.map_size) { + pr_err("%s: Invalid data size = %d\n", + __func__, bytes_returned); + result = -EINVAL; + goto err; + } + if (bytes_returned > user_buf_size) { pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", __func__, user_buf_size, bytes_returned); @@ -1364,6 +1380,14 @@ static int send_rtac_afe_apr(void *buf, uint32_t opcode) bytes_returned = get_resp->param_size + sizeof(struct afe_port_param_data_v2); + if (bytes_returned > rtac_cal[AFE_RTAC_CAL]. + map_data.map_size) { + pr_err("%s: Invalid data size = %d\n", + __func__, bytes_returned); + result = -EINVAL; + goto err; + } + if (bytes_returned > user_afe_buf.buf_size) { pr_err("%s: user size = 0x%x, returned size = 0x%x\n", __func__, user_afe_buf.buf_size, @@ -1586,6 +1610,14 @@ int send_voice_apr(u32 mode, void *buf, u32 opcode) bytes_returned = ((u32 *)rtac_cal[VOICE_RTAC_CAL].cal_data. kvaddr)[2] + 3 * sizeof(u32); + if (bytes_returned > rtac_cal[VOICE_RTAC_CAL]. + map_data.map_size) { + pr_err("%s: Invalid data size = %d\n", + __func__, bytes_returned); + result = -EINVAL; + goto err; + } + if (bytes_returned > user_buf_size) { pr_err("%s: User buf not big enough, size = 0x%x, returned size = 0x%x\n", __func__, user_buf_size, bytes_returned); diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c index 42683715fe321..5cee1733e0134 100644 --- a/sound/soc/soc-compress.c +++ b/sound/soc/soc-compress.c @@ -531,6 +531,11 @@ static int soc_compr_set_params_fe(struct snd_compr_stream *cstream, cstream, &async_domain); } else { be_list[j++] = be; + if (j == DPCM_MAX_BE_USERS) { + dev_dbg(fe->dev, + "ASoC: MAX backend users!\n"); + break; + } } } for (i = 0; i < j; i++) { diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c index 6c44757f17bf5..e6de6ad04a0c3 100644 --- a/sound/soc/soc-pcm.c +++ b/sound/soc/soc-pcm.c @@ -2320,6 +2320,10 @@ void dpcm_be_dai_prepare_async(struct snd_soc_pcm_runtime *fe, int stream, dpcm, domain); } else { dpcm_async[i++] = dpcm; + if (i == DPCM_MAX_BE_USERS) { + dev_dbg(fe->dev, "ASoC: MAX backend users!\n"); + break; + } } } diff --git a/sound/soc/soc-utils.c b/sound/soc/soc-utils.c index 7f22ca35a4131..9afc766065ab2 100644 --- a/sound/soc/soc-utils.c +++ b/sound/soc/soc-utils.c @@ -130,6 +130,9 @@ static int snd_soc_dummy_probe(struct platform_device *pdev) { int ret; + memset(&dummy_codec, 0, + sizeof(struct snd_soc_codec_driver)); + ret = snd_soc_register_codec(&pdev->dev, &dummy_codec, &dummy_dai, 1); if (ret < 0) return ret; diff --git a/sound/usb/Kconfig b/sound/usb/Kconfig index d393153c474f2..b0887bd736b66 100644 --- a/sound/usb/Kconfig +++ b/sound/usb/Kconfig @@ -160,5 +160,13 @@ config SND_BCD2000 To compile this driver as a module, choose M here: the module will be called snd-bcd2000. +config SND_USB_AUDIO_QMI + tristate "USB Audio QMI Service driver" + depends on MSM_QMI_INTERFACE + help + Starts USB Audio QMI server to communicate with remote entity + to perform operations like enable or disable particular audio + stream on a connected USB device. + endif # SND_USB diff --git a/sound/usb/Makefile b/sound/usb/Makefile index 2b92f0dcbc4cc..db00376ac455b 100644 --- a/sound/usb/Makefile +++ b/sound/usb/Makefile @@ -24,3 +24,4 @@ obj-$(CONFIG_SND_USB_USX2Y) += snd-usbmidi-lib.o obj-$(CONFIG_SND_USB_US122L) += snd-usbmidi-lib.o obj-$(CONFIG_SND) += misc/ usx2y/ caiaq/ 6fire/ hiface/ bcd2000/ +obj-$(CONFIG_SND_USB_AUDIO_QMI) += usb_audio_qmi_v01.o usb_audio_qmi_svc.o diff --git a/sound/usb/card.c b/sound/usb/card.c index 63868d36b3de5..b51db0fb9ea19 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c @@ -110,6 +110,71 @@ static DEFINE_MUTEX(register_mutex); static struct snd_usb_audio *usb_chip[SNDRV_CARDS]; static struct usb_driver usb_audio_driver; +struct snd_usb_substream *find_snd_usb_substream(unsigned int card_num, + unsigned int pcm_idx, unsigned int direction, struct snd_usb_audio + **uchip, void (*disconnect_cb)(struct snd_usb_audio *chip)) +{ + int idx; + struct snd_usb_stream *as; + struct snd_usb_substream *subs = NULL; + struct snd_usb_audio *chip = NULL; + + mutex_lock(®ister_mutex); + /* + * legacy audio snd card number assignment is dynamic. Hence + * search using chip->card->number + */ + for (idx = 0; idx < SNDRV_CARDS; idx++) { + if (!usb_chip[idx]) + continue; + if (usb_chip[idx]->card->number == card_num) { + chip = usb_chip[idx]; + break; + } + } + + if (!chip || chip->shutdown) { + pr_debug("%s: instance of usb crad # %d does not exist\n", + __func__, card_num); + goto err; + } + + if (pcm_idx >= chip->pcm_devs) { + pr_err("%s: invalid pcm dev number %u > %d\n", __func__, + pcm_idx, chip->pcm_devs); + goto err; + } + + if (direction > SNDRV_PCM_STREAM_CAPTURE) { + pr_err("%s: invalid direction %u\n", __func__, direction); + goto err; + } + + list_for_each_entry(as, &chip->pcm_list, list) { + if (as->pcm_index == pcm_idx) { + subs = &as->substream[direction]; + if (subs->interface < 0 && !subs->data_endpoint && + !subs->sync_endpoint) { + pr_debug("%s: stream disconnected, bail out\n", + __func__); + subs = NULL; + goto err; + } + goto done; + } + } + +done: + chip->card_num = card_num; + chip->disconnect_cb = disconnect_cb; +err: + *uchip = chip; + if (!subs) + pr_debug("%s: substream instance not found\n", __func__); + mutex_unlock(®ister_mutex); + return subs; +} + /* * disconnect streams * called from snd_usb_audio_disconnect() @@ -324,6 +389,7 @@ static int snd_usb_audio_free(struct snd_usb_audio *chip) list_for_each_safe(p, n, &chip->ep_list) snd_usb_endpoint_free(p); + mutex_destroy(&chip->dev_lock); mutex_destroy(&chip->mutex); kfree(chip); return 0; @@ -390,6 +456,7 @@ static int snd_usb_audio_create(struct usb_interface *intf, mutex_init(&chip->mutex); init_rwsem(&chip->shutdown_rwsem); + mutex_init(&chip->dev_lock); chip->index = idx; chip->dev = dev; chip->card = card; @@ -580,6 +647,7 @@ snd_usb_audio_probe(struct usb_device *dev, usb_chip[chip->index] = chip; chip->num_interfaces++; chip->probing = 0; + intf->needs_remote_wakeup = 1; mutex_unlock(®ister_mutex); return chip; @@ -614,6 +682,9 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, chip->shutdown = 1; up_write(&chip->shutdown_rwsem); + if (chip->disconnect_cb) + chip->disconnect_cb(chip); + mutex_lock(®ister_mutex); if (!was_shutdown) { struct snd_usb_endpoint *ep; diff --git a/sound/usb/card.h b/sound/usb/card.h index 97acb906acc27..a04fd22302b49 100644 --- a/sound/usb/card.h +++ b/sound/usb/card.h @@ -164,4 +164,8 @@ struct snd_usb_stream { struct list_head list; }; +struct snd_usb_substream *find_snd_usb_substream(unsigned int card_num, + unsigned int pcm_idx, unsigned int direction, struct snd_usb_audio + **uchip, void (*disconnect_cb)(struct snd_usb_audio *chip)); + #endif /* __USBAUDIO_CARD_H */ diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 38520f818b19d..7b4a7e84f06b4 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -334,7 +334,7 @@ static void queue_pending_output_urbs(struct snd_usb_endpoint *ep) err = usb_submit_urb(ctx->urb, GFP_ATOMIC); if (err < 0) usb_audio_err(ep->chip, - "Unable to submit urb #%d: %d (urb %p)\n", + "Unable to submit urb #%d: %d (urb %pK)\n", ctx->index, err, ctx->urb); else set_bit(ctx->index, &ep->active_mask); @@ -350,12 +350,7 @@ static void snd_complete_urb(struct urb *urb) struct snd_usb_endpoint *ep = ctx->ep; int err; - /* - * Add this dev state check to avoid to call invalid ctx which is - * free during disconnetion handler. - */ - if (urb->dev->state == USB_STATE_NOTATTACHED) - return; + if (unlikely(urb->status == -ENOENT || /* unlinked */ urb->status == -ENODEV || /* device removed */ urb->status == -ECONNRESET || /* unlinked */ @@ -434,7 +429,7 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip, ep->iface == alts->desc.bInterfaceNumber && ep->altsetting == alts->desc.bAlternateSetting) { usb_audio_dbg(ep->chip, - "Re-using EP %x in iface %d,%d @%p\n", + "Re-using EP %x in iface %d,%d @%pK\n", ep_num, ep->iface, ep->altsetting, ep); goto __exit_unlock; } diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index 0d8aba5fe1a83..9d5a4b2231da8 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -226,7 +226,7 @@ static int start_endpoints(struct snd_usb_substream *subs, bool can_sleep) if (!test_and_set_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) { struct snd_usb_endpoint *ep = subs->data_endpoint; - dev_dbg(&subs->dev->dev, "Starting data EP @%p\n", ep); + dev_dbg(&subs->dev->dev, "Starting data EP @%pK\n", ep); ep->data_subs = subs; err = snd_usb_endpoint_start(ep, can_sleep); @@ -255,7 +255,7 @@ static int start_endpoints(struct snd_usb_substream *subs, bool can_sleep) } } - dev_dbg(&subs->dev->dev, "Starting sync EP @%p\n", ep); + dev_dbg(&subs->dev->dev, "Starting sync EP @%pK\n", ep); ep->sync_slave = subs->data_endpoint; err = snd_usb_endpoint_start(ep, can_sleep); @@ -524,6 +524,64 @@ static int set_format(struct snd_usb_substream *subs, struct audioformat *fmt) return 0; } +int snd_usb_enable_audio_stream(struct snd_usb_substream *subs, + bool enable) +{ + struct audioformat *fmt; + struct usb_host_interface *alts; + struct usb_interface *iface; + int ret; + + if (!enable) { + if (subs->interface >= 0) { + usb_set_interface(subs->dev, subs->interface, 0); + subs->altset_idx = 0; + subs->interface = -1; + subs->cur_audiofmt = NULL; + } + + snd_usb_autosuspend(subs->stream->chip); + return 0; + } + + snd_usb_autoresume(subs->stream->chip); + fmt = find_format(subs); + if (!fmt) { + dev_err(&subs->dev->dev, + "cannot set format: format = %#x, rate = %d, channels = %d\n", + subs->pcm_format, subs->cur_rate, subs->channels); + return -EINVAL; + } + + subs->altset_idx = 0; + subs->interface = -1; + if (subs->stream->chip->shutdown) { + ret = -ENODEV; + } else { + ret = set_format(subs, fmt); + if (ret < 0) + return ret; + + iface = usb_ifnum_to_if(subs->dev, subs->cur_audiofmt->iface); + alts = &iface->altsetting[subs->cur_audiofmt->altset_idx]; + ret = snd_usb_init_sample_rate(subs->stream->chip, + subs->cur_audiofmt->iface, + alts, + subs->cur_audiofmt, + subs->cur_rate); + if (ret < 0) { + dev_err(&subs->dev->dev, "failed to set rate %d\n", + subs->cur_rate); + return ret; + } + } + + subs->interface = fmt->iface; + subs->altset_idx = fmt->altset_idx; + + return 0; +} + /* * Return the score of matching two audioformats. * Veto the audioformat if: @@ -541,13 +599,13 @@ static int match_endpoint_audioformats(struct snd_usb_substream *subs, if (fp->channels < 1) { dev_dbg(&subs->dev->dev, - "%s: (fmt @%p) no channels\n", __func__, fp); + "%s: (fmt @%pK) no channels\n", __func__, fp); return 0; } if (!(fp->formats & pcm_format_to_bits(pcm_format))) { dev_dbg(&subs->dev->dev, - "%s: (fmt @%p) no match for format %d\n", __func__, + "%s: (fmt @%pK) no match for format %d\n", __func__, fp, pcm_format); return 0; } @@ -560,7 +618,7 @@ static int match_endpoint_audioformats(struct snd_usb_substream *subs, } if (!score) { dev_dbg(&subs->dev->dev, - "%s: (fmt @%p) no match for rate %d\n", __func__, + "%s: (fmt @%pK) no match for rate %d\n", __func__, fp, rate); return 0; } @@ -569,7 +627,7 @@ static int match_endpoint_audioformats(struct snd_usb_substream *subs, score++; dev_dbg(&subs->dev->dev, - "%s: (fmt @%p) score %d\n", __func__, fp, score); + "%s: (fmt @%pK) score %d\n", __func__, fp, score); return score; } diff --git a/sound/usb/pcm.h b/sound/usb/pcm.h index df7a003682ad6..d581f94b3fbf1 100644 --- a/sound/usb/pcm.h +++ b/sound/usb/pcm.h @@ -9,6 +9,7 @@ void snd_usb_set_pcm_ops(struct snd_pcm *pcm, int stream); int snd_usb_init_pitch(struct snd_usb_audio *chip, int iface, struct usb_host_interface *alts, struct audioformat *fmt); - +int snd_usb_enable_audio_stream(struct snd_usb_substream *subs, + bool enable); #endif /* __USBAUDIO_PCM_H */ diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c index 7da345b0cdafe..4ab1e43b7a920 100644 --- a/sound/usb/quirks.c +++ b/sound/usb/quirks.c @@ -138,7 +138,9 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, usb_audio_err(chip, "cannot memdup\n"); return -ENOMEM; } + INIT_LIST_HEAD(&fp->list); if (fp->nr_rates > MAX_NR_RATES) { + list_del(&fp->list); kfree(fp); return -EINVAL; } @@ -146,6 +148,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, rate_table = kmemdup(fp->rate_table, sizeof(int) * fp->nr_rates, GFP_KERNEL); if (!rate_table) { + list_del(&fp->list); kfree(fp); return -ENOMEM; } @@ -156,12 +159,14 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; err = snd_usb_add_audio_stream(chip, stream, fp); if (err < 0) { + list_del(&fp->list); kfree(fp); kfree(rate_table); return err; } if (fp->iface != get_iface_desc(&iface->altsetting[0])->bInterfaceNumber || fp->altset_idx >= iface->num_altsetting) { + list_del(&fp->list); kfree(fp); kfree(rate_table); return -EINVAL; @@ -169,6 +174,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip, alts = &iface->altsetting[fp->altset_idx]; altsd = get_iface_desc(alts); if (altsd->bNumEndpoints < 1) { + list_del(&fp->list); kfree(fp); kfree(rate_table); return -EINVAL; @@ -456,6 +462,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip, fp->ep_attr = get_endpoint(alts, 0)->bmAttributes; fp->datainterval = 0; fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize); + INIT_LIST_HEAD(&fp->list); switch (fp->maxpacksize) { case 0x120: @@ -479,6 +486,7 @@ static int create_uaxx_quirk(struct snd_usb_audio *chip, ? SNDRV_PCM_STREAM_CAPTURE : SNDRV_PCM_STREAM_PLAYBACK; err = snd_usb_add_audio_stream(chip, stream, fp); if (err < 0) { + list_del(&fp->list); /* unlink for avoiding double-free */ kfree(fp); return err; } diff --git a/sound/usb/stream.c b/sound/usb/stream.c index 310a3822d2b72..6b431e6b8e7eb 100644 --- a/sound/usb/stream.c +++ b/sound/usb/stream.c @@ -69,9 +69,14 @@ static void snd_usb_audio_stream_free(struct snd_usb_stream *stream) static void snd_usb_audio_pcm_free(struct snd_pcm *pcm) { struct snd_usb_stream *stream = pcm->private_data; + struct snd_usb_audio *chip; + if (stream) { + mutex_lock(&stream->chip->dev_lock); + chip = stream->chip; stream->pcm = NULL; snd_usb_audio_stream_free(stream); + mutex_unlock(&chip->dev_lock); } } @@ -315,7 +320,9 @@ static struct snd_pcm_chmap_elem *convert_chmap(int channels, unsigned int bits, /* * add this endpoint to the chip instance. * if a stream with the same endpoint already exists, append to it. - * if not, create a new pcm stream. + * if not, create a new pcm stream. note, fp is added to the substream + * fmt_list and will be freed on the chip instance release. do not free + * fp or do remove it from the substream fmt_list to avoid double-free. */ int snd_usb_add_audio_stream(struct snd_usb_audio *chip, int stream, @@ -668,6 +675,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no) * (fp->maxpacksize & 0x7ff); fp->attributes = parse_uac_endpoint_attributes(chip, alts, protocol, iface_no); fp->clock = clock; + INIT_LIST_HEAD(&fp->list); /* some quirks for attributes here */ @@ -716,6 +724,7 @@ int snd_usb_parse_audio_interface(struct snd_usb_audio *chip, int iface_no) dev_dbg(&dev->dev, "%u:%d: add audio endpoint %#x\n", iface_no, altno, fp->endpoint); err = snd_usb_add_audio_stream(chip, stream, fp); if (err < 0) { + list_del(&fp->list); /* unlink for avoiding double-free */ kfree(fp->rate_table); kfree(fp->chmap); kfree(fp); diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c new file mode 100644 index 0000000000000..5b710bb12b444 --- /dev/null +++ b/sound/usb/usb_audio_qmi_svc.c @@ -0,0 +1,915 @@ +/* Copyright (c) 2016, 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "usbaudio.h" +#include "card.h" +#include "helper.h" +#include "pcm.h" +#include "usb_audio_qmi_v01.h" + +#define SND_PCM_CARD_NUM_MASK 0xffff0000 +#define SND_PCM_DEV_NUM_MASK 0xff00 +#define SND_PCM_STREAM_DIRECTION 0xff + +#define MAX_XFER_BUFF_LEN (24 * PAGE_SIZE) + +struct intf_info { + size_t xfer_buf_size; + phys_addr_t xfer_buf_pa; + u8 *xfer_buf; + u8 pcm_card_num; + u8 pcm_dev_num; + u8 direction; + bool in_use; +}; + +struct uaudio_dev { + struct usb_device *udev; + /* audio control interface */ + struct usb_host_interface *ctrl_intf; + unsigned int card_num; + atomic_t in_use; + struct kref kref; + wait_queue_head_t disconnect_wq; + + /* interface specific */ + int num_intf; + struct intf_info *info; +}; + +static struct uaudio_dev uadev[SNDRV_CARDS]; + +struct uaudio_qmi_dev { + struct device *dev; + u32 intr_num; + + /* bit fields representing pcm card enabled */ + unsigned long card_slot; + /* cache event ring phys addr */ + u64 er_phys_addr; +}; + +static struct uaudio_qmi_dev *uaudio_qdev; + +struct uaudio_qmi_svc { + struct qmi_handle *uaudio_svc_hdl; + void *curr_conn; + struct work_struct recv_msg_work; + struct work_struct qmi_disconnect_work; + struct workqueue_struct *uaudio_wq; + ktime_t t_request_recvd; + ktime_t t_resp_sent; +}; + +static struct uaudio_qmi_svc *uaudio_svc; + +static struct msg_desc uaudio_stream_req_desc = { + .max_msg_len = QMI_UAUDIO_STREAM_REQ_MSG_V01_MAX_MSG_LEN, + .msg_id = QMI_UAUDIO_STREAM_REQ_V01, + .ei_array = qmi_uaudio_stream_req_msg_v01_ei, +}; + +static struct msg_desc uaudio_stream_resp_desc = { + .max_msg_len = QMI_UAUDIO_STREAM_RESP_MSG_V01_MAX_MSG_LEN, + .msg_id = QMI_UAUDIO_STREAM_RESP_V01, + .ei_array = qmi_uaudio_stream_resp_msg_v01_ei, +}; + +static struct msg_desc uaudio_stream_ind_desc = { + .max_msg_len = QMI_UAUDIO_STREAM_IND_MSG_V01_MAX_MSG_LEN, + .msg_id = QMI_UADUIO_STREAM_IND_V01, + .ei_array = qmi_uaudio_stream_ind_msg_v01_ei, +}; + +enum usb_qmi_audio_format { + USB_QMI_PCM_FORMAT_S8 = 0, + USB_QMI_PCM_FORMAT_U8, + USB_QMI_PCM_FORMAT_S16_LE, + USB_QMI_PCM_FORMAT_S16_BE, + USB_QMI_PCM_FORMAT_U16_LE, + USB_QMI_PCM_FORMAT_U16_BE, + USB_QMI_PCM_FORMAT_S24_LE, + USB_QMI_PCM_FORMAT_S24_BE, + USB_QMI_PCM_FORMAT_U24_LE, + USB_QMI_PCM_FORMAT_U24_BE, + USB_QMI_PCM_FORMAT_S24_3LE, + USB_QMI_PCM_FORMAT_S24_3BE, + USB_QMI_PCM_FORMAT_U24_3LE, + USB_QMI_PCM_FORMAT_U24_3BE, + USB_QMI_PCM_FORMAT_S32_LE, + USB_QMI_PCM_FORMAT_S32_BE, + USB_QMI_PCM_FORMAT_U32_LE, + USB_QMI_PCM_FORMAT_U32_BE, +}; + +static int prepare_qmi_response(struct snd_usb_substream *subs, + struct qmi_uaudio_stream_resp_msg_v01 *resp, u32 xfer_buf_len, + int card_num, int pcm_dev_num) +{ + int ret = -ENODEV; + struct usb_interface *iface; + struct usb_host_interface *alts; + struct usb_interface_descriptor *altsd; + struct usb_host_endpoint *ep; + struct uac_format_type_i_continuous_descriptor *fmt; + struct uac_format_type_i_discrete_descriptor *fmt_v1; + struct uac_format_type_i_ext_descriptor *fmt_v2; + struct uac1_as_header_descriptor *as; + int protocol; + void *hdr_ptr; + u8 *xfer_buf; + u32 len, mult, remainder; + phys_addr_t xhci_pa, xfer_buf_pa; + + iface = usb_ifnum_to_if(subs->dev, subs->interface); + if (!iface) { + pr_err("%s: interface # %d does not exist\n", __func__, + subs->interface); + goto err; + } + + if (uadev[card_num].info && + uadev[card_num].info[subs->interface].in_use) { + pr_err("%s interface# %d already in use card# %d\n", __func__, + subs->interface, card_num); + ret = -EBUSY; + goto err; + } + + alts = &iface->altsetting[subs->altset_idx]; + altsd = get_iface_desc(alts); + protocol = altsd->bInterfaceProtocol; + + /* get format type */ + fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, + UAC_FORMAT_TYPE); + if (!fmt) { + pr_err("%s: %u:%d : no UAC_FORMAT_TYPE desc\n", __func__, + subs->interface, subs->altset_idx); + goto err; + } + + if (!uadev[card_num].ctrl_intf) { + pr_err("%s: audio ctrl intf info not cached\n", __func__); + goto err; + } + + hdr_ptr = snd_usb_find_csint_desc(uadev[card_num].ctrl_intf->extra, + uadev[card_num].ctrl_intf->extralen, + NULL, UAC_HEADER); + if (!hdr_ptr) { + pr_err("%s: no UAC_HEADER desc\n", __func__); + goto err; + } + + if (protocol == UAC_VERSION_1) { + as = snd_usb_find_csint_desc(alts->extra, alts->extralen, NULL, + UAC_AS_GENERAL); + if (!as) { + pr_err("%s: %u:%d : no UAC_AS_GENERAL desc\n", __func__, + subs->interface, subs->altset_idx); + goto err; + } + resp->data_path_delay = as->bDelay; + resp->data_path_delay_valid = 1; + fmt_v1 = (struct uac_format_type_i_discrete_descriptor *)fmt; + resp->usb_audio_subslot_size = fmt_v1->bSubframeSize; + resp->usb_audio_subslot_size_valid = 1; + + resp->usb_audio_spec_revision = + ((struct uac1_ac_header_descriptor *)hdr_ptr)->bcdADC; + resp->usb_audio_spec_revision_valid = 1; + } else if (protocol == UAC_VERSION_2) { + fmt_v2 = (struct uac_format_type_i_ext_descriptor *)fmt; + resp->usb_audio_subslot_size = fmt_v2->bSubslotSize; + resp->usb_audio_subslot_size_valid = 1; + + resp->usb_audio_spec_revision = + ((struct uac2_ac_header_descriptor *)hdr_ptr)->bcdADC; + resp->usb_audio_spec_revision_valid = 1; + } else { + pr_err("%s: unknown protocol version %x\n", __func__, protocol); + goto err; + } + + resp->slot_id = subs->dev->slot_id; + resp->slot_id_valid = 1; + + memcpy(&resp->std_as_opr_intf_desc, &alts->desc, sizeof(alts->desc)); + resp->std_as_opr_intf_desc_valid = 1; + + ep = usb_pipe_endpoint(subs->dev, subs->data_endpoint->pipe); + if (!ep) { + pr_err("%s: data ep # %d context is null\n", __func__, + subs->data_endpoint->ep_num); + goto err; + } + memcpy(&resp->std_as_data_ep_desc, &ep->desc, sizeof(ep->desc)); + resp->std_as_data_ep_desc_valid = 1; + + xhci_pa = usb_get_xfer_ring_dma_addr(subs->dev, ep); + if (!xhci_pa) { + pr_err("%s:failed to get data ep ring dma address\n", __func__); + goto err; + } + + resp->xhci_mem_info.tr_data.pa = xhci_pa; + + if (subs->sync_endpoint) { + ep = usb_pipe_endpoint(subs->dev, subs->sync_endpoint->pipe); + if (!ep) { + pr_debug("%s: implicit fb on data ep\n", __func__); + goto skip_sync_ep; + } + memcpy(&resp->std_as_sync_ep_desc, &ep->desc, sizeof(ep->desc)); + resp->std_as_sync_ep_desc_valid = 1; + + xhci_pa = usb_get_xfer_ring_dma_addr(subs->dev, ep); + if (!xhci_pa) { + pr_err("%s:failed to get sync ep ring dma address\n", + __func__); + goto err; + } + resp->xhci_mem_info.tr_sync.pa = xhci_pa; + } + +skip_sync_ep: + resp->interrupter_num = uaudio_qdev->intr_num; + resp->interrupter_num_valid = 1; + + /* map xhci data structures PA memory to iova */ + + /* event ring */ + ret = usb_sec_event_ring_setup(subs->dev, resp->interrupter_num); + if (ret) { + pr_err("%s: failed to setup sec event ring ret %d\n", __func__, + ret); + goto err; + } + xhci_pa = usb_get_sec_event_ring_dma_addr(subs->dev, + resp->interrupter_num); + if (!xhci_pa) { + pr_err("%s: failed to get sec event ring dma address\n", + __func__); + goto err; + } + resp->xhci_mem_info.evt_ring.va = xhci_pa; + resp->xhci_mem_info.evt_ring.pa = xhci_pa; + resp->xhci_mem_info.evt_ring.size = PAGE_SIZE; + uaudio_qdev->er_phys_addr = xhci_pa; + + /* dcba */ + xhci_pa = usb_get_dcba_dma_addr(subs->dev); + if (!xhci_pa) { + pr_err("%s:failed to get dcba dma address\n", __func__); + goto err; + } + resp->xhci_mem_info.dcba.va = xhci_pa; + resp->xhci_mem_info.dcba.pa = xhci_pa; + resp->xhci_mem_info.dcba.size = PAGE_SIZE; + + /* data transfer ring */ + xhci_pa = resp->xhci_mem_info.tr_data.pa; + resp->xhci_mem_info.tr_data.va = xhci_pa; + resp->xhci_mem_info.tr_data.size = PAGE_SIZE; + + /* sync transfer ring */ + if (!resp->xhci_mem_info.tr_sync.pa) + goto skip_sync; + + xhci_pa = resp->xhci_mem_info.tr_sync.pa; + resp->xhci_mem_info.tr_sync.va = xhci_pa; + resp->xhci_mem_info.tr_sync.size = PAGE_SIZE; + +skip_sync: + /* xfer buffer, multiple of 4K only */ + if (!xfer_buf_len) + xfer_buf_len = PAGE_SIZE; + + mult = xfer_buf_len / PAGE_SIZE; + remainder = xfer_buf_len % PAGE_SIZE; + len = mult * PAGE_SIZE; + len += remainder ? PAGE_SIZE : 0; + + if (len > MAX_XFER_BUFF_LEN) { + pr_err("%s: req buf len %d > max buf len %lu, setting %lu\n", + __func__, len, MAX_XFER_BUFF_LEN, MAX_XFER_BUFF_LEN); + len = MAX_XFER_BUFF_LEN; + } + + xfer_buf = usb_alloc_coherent(subs->dev, len, GFP_KERNEL, &xfer_buf_pa); + if (!xfer_buf) + goto free_xfer_buf; + + resp->xhci_mem_info.xfer_buff.pa = xfer_buf_pa; + resp->xhci_mem_info.xfer_buff.size = len; + resp->xhci_mem_info.xfer_buff.va = xfer_buf_pa; + resp->xhci_mem_info_valid = 1; + + if (!atomic_read(&uadev[card_num].in_use)) { + kref_init(&uadev[card_num].kref); + init_waitqueue_head(&uadev[card_num].disconnect_wq); + uadev[card_num].num_intf = + subs->dev->config->desc.bNumInterfaces; + uadev[card_num].info = + kzalloc(sizeof(struct intf_info) * + uadev[card_num].num_intf, GFP_KERNEL); + if (!uadev[card_num].info) { + ret = -ENOMEM; + goto free_xfer_buf; + } + uadev[card_num].udev = subs->dev; + atomic_set(&uadev[card_num].in_use, 1); + } else { + kref_get(&uadev[card_num].kref); + } + + uadev[card_num].card_num = card_num; + + /* cache intf specific info to use it for free xfer buf */ + uadev[card_num].info[subs->interface].xfer_buf_pa = xfer_buf_pa; + uadev[card_num].info[subs->interface].xfer_buf_size = len; + uadev[card_num].info[subs->interface].xfer_buf = xfer_buf; + uadev[card_num].info[subs->interface].pcm_card_num = card_num; + uadev[card_num].info[subs->interface].pcm_dev_num = pcm_dev_num; + uadev[card_num].info[subs->interface].direction = subs->direction; + uadev[card_num].info[subs->interface].in_use = true; + + set_bit(card_num, &uaudio_qdev->card_slot); + + return 0; + +free_xfer_buf: + usb_free_coherent(subs->dev, len, xfer_buf, xfer_buf_pa); +err: + return ret; +} + +static void uaudio_dev_intf_cleanup(struct usb_device *udev, + struct intf_info *info) +{ + usb_free_coherent(udev, info->xfer_buf_size, + info->xfer_buf, info->xfer_buf_pa); + info->xfer_buf_size = 0; + info->xfer_buf = NULL; + info->xfer_buf_pa = 0; + + info->in_use = false; +} + +static void uaudio_dev_cleanup(struct uaudio_dev *dev) +{ + int if_idx; + + /* free xfer buffer */ + for (if_idx = 0; if_idx < dev->num_intf; if_idx++) { + if (!dev->info[if_idx].in_use) + continue; + uaudio_dev_intf_cleanup(dev->udev, &dev->info[if_idx]); + pr_debug("%s: release resources: intf# %d card# %d\n", __func__, + if_idx, dev->card_num); + } + dev->num_intf = 0; + + /* free interface info */ + kfree(dev->info); + dev->info = NULL; + + clear_bit(dev->card_num, &uaudio_qdev->card_slot); + + /* all audio devices are disconnected */ + if (!uaudio_qdev->card_slot) { + usb_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); + pr_debug("%s: all audio devices disconnected\n", __func__); + } + + dev->udev = NULL; +} + +void uaudio_disconnect_cb(struct snd_usb_audio *chip) +{ + int ret; + struct uaudio_dev *dev; + int card_num = chip->card_num; + struct uaudio_qmi_svc *svc = uaudio_svc; + struct qmi_uaudio_stream_ind_msg_v01 disconnect_ind = {0}; + + pr_debug("%s: for card# %d\n", __func__, card_num); + + if (card_num >= SNDRV_CARDS) { + pr_err("%s: invalid card number\n", __func__); + return; + } + + mutex_lock(&chip->dev_lock); + dev = &uadev[card_num]; + + /* clean up */ + if (!dev->udev) { + pr_debug("%s: no clean up required\n", __func__); + goto done; + } + + if (atomic_read(&dev->in_use)) { + mutex_unlock(&chip->dev_lock); + + pr_debug("%s: sending qmi indication disconnect\n", __func__); + disconnect_ind.dev_event = USB_AUDIO_DEV_DISCONNECT_V01; + disconnect_ind.slot_id = dev->udev->slot_id; + ret = qmi_send_ind(svc->uaudio_svc_hdl, svc->curr_conn, + &uaudio_stream_ind_desc, &disconnect_ind, + sizeof(disconnect_ind)); + if (ret < 0) { + pr_err("%s: qmi send failed wiht err: %d\n", + __func__, ret); + return; + } + + ret = wait_event_interruptible(dev->disconnect_wq, + !atomic_read(&dev->in_use)); + if (ret < 0) { + pr_debug("%s: failed with ret %d\n", __func__, ret); + return; + } + mutex_lock(&chip->dev_lock); + } + + uaudio_dev_cleanup(dev); +done: + mutex_unlock(&chip->dev_lock); +} + +static void uaudio_dev_release(struct kref *kref) +{ + struct uaudio_dev *dev = container_of(kref, struct uaudio_dev, kref); + + pr_debug("%s for dev %pK\n", __func__, dev); + + atomic_set(&dev->in_use, 0); + + clear_bit(dev->card_num, &uaudio_qdev->card_slot); + + /* all audio devices are disconnected */ + if (!uaudio_qdev->card_slot) { + usb_sec_event_ring_cleanup(dev->udev, uaudio_qdev->intr_num); + pr_debug("%s: all audio devices disconnected\n", __func__); + } + + wake_up(&dev->disconnect_wq); +} + +/* maps audio format received over QMI to asound.h based pcm format */ +static int map_pcm_format(unsigned int fmt_received) +{ + switch (fmt_received) { + case USB_QMI_PCM_FORMAT_S8: + return SNDRV_PCM_FORMAT_S8; + case USB_QMI_PCM_FORMAT_U8: + return SNDRV_PCM_FORMAT_U8; + case USB_QMI_PCM_FORMAT_S16_LE: + return SNDRV_PCM_FORMAT_S16_LE; + case USB_QMI_PCM_FORMAT_S16_BE: + return SNDRV_PCM_FORMAT_S16_BE; + case USB_QMI_PCM_FORMAT_U16_LE: + return SNDRV_PCM_FORMAT_U16_LE; + case USB_QMI_PCM_FORMAT_U16_BE: + return SNDRV_PCM_FORMAT_U16_BE; + case USB_QMI_PCM_FORMAT_S24_LE: + return SNDRV_PCM_FORMAT_S24_LE; + case USB_QMI_PCM_FORMAT_S24_BE: + return SNDRV_PCM_FORMAT_S24_BE; + case USB_QMI_PCM_FORMAT_U24_LE: + return SNDRV_PCM_FORMAT_U24_LE; + case USB_QMI_PCM_FORMAT_U24_BE: + return SNDRV_PCM_FORMAT_U24_BE; + case USB_QMI_PCM_FORMAT_S24_3LE: + return SNDRV_PCM_FORMAT_S24_3LE; + case USB_QMI_PCM_FORMAT_S24_3BE: + return SNDRV_PCM_FORMAT_S24_3BE; + case USB_QMI_PCM_FORMAT_U24_3LE: + return SNDRV_PCM_FORMAT_U24_3LE; + case USB_QMI_PCM_FORMAT_U24_3BE: + return SNDRV_PCM_FORMAT_U24_3BE; + case USB_QMI_PCM_FORMAT_S32_LE: + return SNDRV_PCM_FORMAT_S32_LE; + case USB_QMI_PCM_FORMAT_S32_BE: + return SNDRV_PCM_FORMAT_S32_BE; + case USB_QMI_PCM_FORMAT_U32_LE: + return SNDRV_PCM_FORMAT_U32_LE; + case USB_QMI_PCM_FORMAT_U32_BE: + return SNDRV_PCM_FORMAT_U32_BE; + default: + return -EINVAL; + } +} + +static int handle_uaudio_stream_req(void *req_h, void *req) +{ + struct qmi_uaudio_stream_req_msg_v01 *req_msg; + struct qmi_uaudio_stream_resp_msg_v01 resp = {{0}, 0}; + struct snd_usb_substream *subs; + struct snd_usb_audio *chip = NULL; + struct uaudio_qmi_svc *svc = uaudio_svc; + struct intf_info *info; + int pcm_format; + u8 pcm_card_num, pcm_dev_num, direction; + int intf_num = -1, ret = 0; + + req_msg = (struct qmi_uaudio_stream_req_msg_v01 *)req; + + if (!req_msg->audio_format_valid || !req_msg->bit_rate_valid || + !req_msg->number_of_ch_valid || !req_msg->xfer_buff_size_valid) { + pr_err("%s: invalid request msg\n", __func__); + ret = -EINVAL; + goto response; + } + + direction = req_msg->usb_token & SND_PCM_STREAM_DIRECTION; + pcm_dev_num = (req_msg->usb_token & SND_PCM_DEV_NUM_MASK) >> 8; + pcm_card_num = (req_msg->usb_token & SND_PCM_CARD_NUM_MASK) >> 16; + + pr_debug("%s:card#:%d dev#:%d dir:%d en:%d fmt:%d rate:%d #ch:%d\n", + __func__, pcm_card_num, pcm_dev_num, direction, req_msg->enable, + req_msg->audio_format, req_msg->bit_rate, + req_msg->number_of_ch); + + if (pcm_card_num >= SNDRV_CARDS) { + pr_err("%s: invalid card # %u", __func__, pcm_card_num); + ret = -EINVAL; + goto response; + } + + pcm_format = map_pcm_format(req_msg->audio_format); + if (pcm_format == -EINVAL) { + pr_err("%s: unsupported pcm format received %d\n", + __func__, req_msg->audio_format); + ret = -EINVAL; + goto response; + } + + subs = find_snd_usb_substream(pcm_card_num, pcm_dev_num, direction, + &chip, uaudio_disconnect_cb); + if (!subs || !chip || chip->shutdown) { + pr_err("%s: can't find substream for card# %u, dev# %u dir%u\n", + __func__, pcm_card_num, pcm_dev_num, direction); + ret = -ENODEV; + goto response; + } + + mutex_lock(&chip->dev_lock); + intf_num = subs->interface; + if (chip->shutdown || !subs->stream || !subs->stream->pcm + || !subs->stream->chip) { + ret = -ENODEV; + mutex_unlock(&chip->dev_lock); + goto response; + } + + subs->pcm_format = pcm_format; + subs->channels = req_msg->number_of_ch; + subs->cur_rate = req_msg->bit_rate; + uadev[pcm_card_num].ctrl_intf = chip->ctrl_intf; + + ret = snd_usb_enable_audio_stream(subs, req_msg->enable); + + if (!ret && req_msg->enable) + ret = prepare_qmi_response(subs, &resp, req_msg->xfer_buff_size, + pcm_card_num, pcm_dev_num); + + mutex_unlock(&chip->dev_lock); + +response: + if (!req_msg->enable && ret != -EINVAL) { + if (intf_num >= 0) { + mutex_lock(&chip->dev_lock); + info = &uadev[pcm_card_num].info[intf_num]; + uaudio_dev_intf_cleanup(uadev[pcm_card_num].udev, info); + pr_debug("%s:release resources: intf# %d card# %d\n", + __func__, intf_num, pcm_card_num); + mutex_unlock(&chip->dev_lock); + } + if (atomic_read(&uadev[pcm_card_num].in_use)) + kref_put(&uadev[pcm_card_num].kref, + uaudio_dev_release); + } + + resp.usb_token = req_msg->usb_token; + resp.usb_token_valid = 1; + resp.internal_status = ret; + resp.internal_status_valid = 1; + resp.status = ret ? USB_AUDIO_STREAM_REQ_FAILURE_V01 : ret; + resp.status_valid = 1; + ret = qmi_send_resp_from_cb(svc->uaudio_svc_hdl, svc->curr_conn, req_h, + &uaudio_stream_resp_desc, &resp, sizeof(resp)); + + svc->t_resp_sent = ktime_get(); + + pr_debug("%s: t_resp sent - t_req recvd (in ms) %lld\n", __func__, + ktime_to_ms(ktime_sub(svc->t_resp_sent, svc->t_request_recvd))); + + return ret; +} + +static int uaudio_qmi_svc_connect_cb(struct qmi_handle *handle, + void *conn_h) +{ + struct uaudio_qmi_svc *svc = uaudio_svc; + + if (svc->uaudio_svc_hdl != handle || !conn_h) { + pr_err("%s: handle mismatch\n", __func__); + return -EINVAL; + } + if (svc->curr_conn) { + pr_err("%s: Service is busy\n", __func__); + return -ECONNREFUSED; + } + svc->curr_conn = conn_h; + return 0; +} + +static void uaudio_qmi_disconnect_work(struct work_struct *w) +{ + struct intf_info *info; + int idx, if_idx; + struct snd_usb_substream *subs; + struct snd_usb_audio *chip = NULL; + + /* find all active intf for set alt 0 and cleanup usb audio dev */ + for (idx = 0; idx < SNDRV_CARDS; idx++) { + if (!atomic_read(&uadev[idx].in_use)) + continue; + + for (if_idx = 0; if_idx < uadev[idx].num_intf; if_idx++) { + if (!uadev[idx].info || !uadev[idx].info[if_idx].in_use) + continue; + info = &uadev[idx].info[if_idx]; + subs = find_snd_usb_substream(info->pcm_card_num, + info->pcm_dev_num, + info->direction, + &chip, + uaudio_disconnect_cb); + if (!subs || !chip || chip->shutdown) { + pr_debug("%s:no subs for c#%u, dev#%u dir%u\n", + __func__, info->pcm_card_num, + info->pcm_dev_num, + info->direction); + continue; + } + snd_usb_enable_audio_stream(subs, 0); + } + atomic_set(&uadev[idx].in_use, 0); + mutex_lock(&chip->dev_lock); + uaudio_dev_cleanup(&uadev[idx]); + mutex_unlock(&chip->dev_lock); + } +} + +static int uaudio_qmi_svc_disconnect_cb(struct qmi_handle *handle, + void *conn_h) +{ + struct uaudio_qmi_svc *svc = uaudio_svc; + + if (svc->uaudio_svc_hdl != handle || svc->curr_conn != conn_h) { + pr_err("%s: handle mismatch\n", __func__); + return -EINVAL; + } + + svc->curr_conn = NULL; + queue_work(svc->uaudio_wq, &svc->qmi_disconnect_work); + + return 0; +} + +static int uaudio_qmi_svc_req_cb(struct qmi_handle *handle, void *conn_h, + void *req_h, unsigned int msg_id, void *req) +{ + int ret; + struct uaudio_qmi_svc *svc = uaudio_svc; + + if (svc->uaudio_svc_hdl != handle || svc->curr_conn != conn_h) { + pr_err("%s: handle mismatch\n", __func__); + return -EINVAL; + } + + switch (msg_id) { + case QMI_UAUDIO_STREAM_REQ_V01: + ret = handle_uaudio_stream_req(req_h, req); + break; + + default: + ret = -ENOTSUPP; + break; + } + return ret; +} + +static int uaudio_qmi_svc_req_desc_cb(unsigned int msg_id, + struct msg_desc **req_desc) +{ + int ret; + + pr_debug("%s: msg_id %d\n", __func__, msg_id); + + switch (msg_id) { + case QMI_UAUDIO_STREAM_REQ_V01: + *req_desc = &uaudio_stream_req_desc; + ret = sizeof(struct qmi_uaudio_stream_req_msg_v01); + break; + + default: + ret = -ENOTSUPP; + break; + } + return ret; +} + +static void uaudio_qmi_svc_recv_msg(struct work_struct *w) +{ + int ret; + struct uaudio_qmi_svc *svc = container_of(w, struct uaudio_qmi_svc, + recv_msg_work); + + do { + pr_debug("%s: Notified about a Receive Event", __func__); + } while ((ret = qmi_recv_msg(svc->uaudio_svc_hdl)) == 0); + + if (ret != -ENOMSG) + pr_err("%s: Error receiving message\n", __func__); +} + +static void uaudio_qmi_svc_ntfy(struct qmi_handle *handle, + enum qmi_event_type event, void *priv) +{ + struct uaudio_qmi_svc *svc = uaudio_svc; + + pr_debug("%s: event %d", __func__, event); + + svc->t_request_recvd = ktime_get(); + + switch (event) { + case QMI_RECV_MSG: + queue_work(svc->uaudio_wq, &svc->recv_msg_work); + break; + default: + break; + } +} + +static struct qmi_svc_ops_options uaudio_svc_ops_options = { + .version = 1, + .service_id = UAUDIO_STREAM_SERVICE_ID_V01, + .service_vers = UAUDIO_STREAM_SERVICE_VERS_V01, + .connect_cb = uaudio_qmi_svc_connect_cb, + .disconnect_cb = uaudio_qmi_svc_disconnect_cb, + .req_desc_cb = uaudio_qmi_svc_req_desc_cb, + .req_cb = uaudio_qmi_svc_req_cb, +}; + +static int uaudio_qmi_plat_probe(struct platform_device *pdev) +{ + int ret; + struct device_node *node = pdev->dev.of_node; + + uaudio_qdev = devm_kzalloc(&pdev->dev, sizeof(struct uaudio_qmi_dev), + GFP_KERNEL); + if (!uaudio_qdev) + return -ENOMEM; + + uaudio_qdev->dev = &pdev->dev; + + ret = of_property_read_u32(node, "qcom,usb-audio-intr-num", + &uaudio_qdev->intr_num); + if (ret) { + dev_err(&pdev->dev, "failed to read intr num.\n"); + return -ENODEV; + } + return 0; +} + +static int uaudio_qmi_plat_remove(struct platform_device *pdev) +{ + return 0; +} + +static const struct of_device_id of_uaudio_matach[] = { + { + .compatible = "qcom,usb-audio-qmi-dev", + }, + { }, +}; +MODULE_DEVICE_TABLE(of, of_uaudio_matach); + +static struct platform_driver uaudio_qmi_driver = { + .probe = uaudio_qmi_plat_probe, + .remove = uaudio_qmi_plat_remove, + .driver = { + .name = "uaudio-qmi", + .of_match_table = of_uaudio_matach, + }, +}; + +static int uaudio_qmi_svc_init(void) +{ + int ret; + struct uaudio_qmi_svc *svc; + + svc = kzalloc(sizeof(struct uaudio_qmi_svc), GFP_KERNEL); + if (!svc) + return -ENOMEM; + + svc->uaudio_wq = create_singlethread_workqueue("uaudio_svc"); + if (!svc->uaudio_wq) { + ret = -ENOMEM; + goto free_svc; + } + + svc->uaudio_svc_hdl = qmi_handle_create(uaudio_qmi_svc_ntfy, NULL); + if (!svc->uaudio_svc_hdl) { + pr_err("%s: Error creating svc_hdl\n", __func__); + ret = -EFAULT; + goto destroy_uaudio_wq; + } + + ret = qmi_svc_register(svc->uaudio_svc_hdl, &uaudio_svc_ops_options); + if (ret < 0) { + pr_err("%s:Error registering uaudio svc %d\n", __func__, ret); + goto destroy_svc_handle; + } + + INIT_WORK(&svc->recv_msg_work, uaudio_qmi_svc_recv_msg); + INIT_WORK(&svc->qmi_disconnect_work, uaudio_qmi_disconnect_work); + + uaudio_svc = svc; + + return 0; + +destroy_svc_handle: + qmi_handle_destroy(svc->uaudio_svc_hdl); +destroy_uaudio_wq: + destroy_workqueue(svc->uaudio_wq); +free_svc: + kfree(svc); + return ret; +} + +static void uaudio_qmi_svc_exit(void) +{ + struct uaudio_qmi_svc *svc = uaudio_svc; + + qmi_svc_unregister(svc->uaudio_svc_hdl); + flush_workqueue(svc->uaudio_wq); + qmi_handle_destroy(svc->uaudio_svc_hdl); + destroy_workqueue(svc->uaudio_wq); + kfree(svc); + uaudio_svc = NULL; +} + +static int __init uaudio_qmi_plat_init(void) +{ + int ret; + + ret = platform_driver_register(&uaudio_qmi_driver); + if (ret) + return ret; + + return uaudio_qmi_svc_init(); +} + +static void __exit uaudio_qmi_plat_exit(void) +{ + uaudio_qmi_svc_exit(); + platform_driver_unregister(&uaudio_qmi_driver); +} + +module_init(uaudio_qmi_plat_init); +module_exit(uaudio_qmi_plat_exit); + +MODULE_DESCRIPTION("USB AUDIO QMI Service Driver"); +MODULE_LICENSE("GPL v2"); diff --git a/sound/usb/usb_audio_qmi_v01.c b/sound/usb/usb_audio_qmi_v01.c new file mode 100644 index 0000000000000..6f6f194e89fba --- /dev/null +++ b/sound/usb/usb_audio_qmi_v01.c @@ -0,0 +1,833 @@ + /* Copyright (c) 2016, 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 + +#include + +#include "usb_audio_qmi_v01.h" + +static struct elem_info mem_info_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_8_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint64_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct mem_info_v01, + va), + }, + { + .data_type = QMI_UNSIGNED_8_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint64_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct mem_info_v01, + pa), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct mem_info_v01, + size), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +static struct elem_info apps_mem_info_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct apps_mem_info_v01, + evt_ring), + .ei_array = mem_info_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct apps_mem_info_v01, + tr_data), + .ei_array = mem_info_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct apps_mem_info_v01, + tr_sync), + .ei_array = mem_info_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct apps_mem_info_v01, + xfer_buff), + .ei_array = mem_info_v01_ei, + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct apps_mem_info_v01, + dcba), + .ei_array = mem_info_v01_ei, + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +static struct elem_info usb_endpoint_descriptor_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bLength), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bDescriptorType), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bEndpointAddress), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bmAttributes), + }, + { + .data_type = QMI_UNSIGNED_2_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint16_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + wMaxPacketSize), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bInterval), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bRefresh), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_endpoint_descriptor_v01, + bSynchAddress), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +static struct elem_info usb_interface_descriptor_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bLength), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bDescriptorType), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bInterfaceNumber), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bAlternateSetting), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bNumEndpoints), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bInterfaceClass), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bInterfaceSubClass), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + bInterfaceProtocol), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0, + .offset = offsetof(struct usb_interface_descriptor_v01, + iInterface), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +struct elem_info qmi_uaudio_stream_req_msg_v01_ei[] = { + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x01, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + enable), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x02, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + usb_token), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x10, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + audio_format_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x10, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + audio_format), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x11, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + number_of_ch_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x11, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + number_of_ch), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x12, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + bit_rate_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x12, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + bit_rate), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x13, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + xfer_buff_size_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x13, + .offset = offsetof(struct qmi_uaudio_stream_req_msg_v01, + xfer_buff_size), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +struct elem_info qmi_uaudio_stream_resp_msg_v01_ei[] = { + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct qmi_response_type_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x02, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + resp), + .ei_array = get_qmi_response_type_v01_ei(), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x10, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + status_valid), + }, + { + .data_type = QMI_SIGNED_4_BYTE_ENUM, + .elem_len = 1, + .elem_size = sizeof(enum usb_audio_stream_status_enum_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x10, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + status), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x11, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + internal_status_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x11, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + internal_status), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x12, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + slot_id_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x12, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + slot_id), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x13, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + usb_token_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x13, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + usb_token), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x14, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_opr_intf_desc_valid), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_interface_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x14, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_opr_intf_desc), + .ei_array = usb_interface_descriptor_v01_ei, + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x15, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_data_ep_desc_valid), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_endpoint_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x15, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_data_ep_desc), + .ei_array = usb_endpoint_descriptor_v01_ei, + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x16, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_sync_ep_desc_valid), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_endpoint_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x16, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + std_as_sync_ep_desc), + .ei_array = usb_endpoint_descriptor_v01_ei, + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x17, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + usb_audio_spec_revision_valid), + }, + { + .data_type = QMI_UNSIGNED_2_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint16_t), + .is_array = NO_ARRAY, + .tlv_type = 0x17, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + usb_audio_spec_revision), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x18, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + data_path_delay_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x18, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + data_path_delay), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x19, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + usb_audio_subslot_size_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x19, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + usb_audio_subslot_size), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x1A, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + xhci_mem_info_valid), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct apps_mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x1A, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + xhci_mem_info), + .ei_array = apps_mem_info_v01_ei, + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x1B, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + interrupter_num_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x1B, + .offset = offsetof( + struct qmi_uaudio_stream_resp_msg_v01, + interrupter_num), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; + +struct elem_info qmi_uaudio_stream_ind_msg_v01_ei[] = { + { + .data_type = QMI_SIGNED_4_BYTE_ENUM, + .elem_len = 1, + .elem_size = sizeof( + enum usb_audio_device_indication_enum_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x01, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + dev_event), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x02, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + slot_id), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x10, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_token_valid), + }, + { + .data_type = QMI_UNSIGNED_4_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint32_t), + .is_array = NO_ARRAY, + .tlv_type = 0x10, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_token), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x11, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_opr_intf_desc_valid), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_interface_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x11, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_opr_intf_desc), + .ei_array = usb_interface_descriptor_v01_ei, + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x12, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_data_ep_desc_valid), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_endpoint_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x12, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_data_ep_desc), + .ei_array = usb_endpoint_descriptor_v01_ei, + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x13, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_sync_ep_desc_valid), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct usb_endpoint_descriptor_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x13, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + std_as_sync_ep_desc), + .ei_array = usb_endpoint_descriptor_v01_ei, + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x14, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_audio_spec_revision_valid), + }, + { + .data_type = QMI_UNSIGNED_2_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint16_t), + .is_array = NO_ARRAY, + .tlv_type = 0x14, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_audio_spec_revision), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x15, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + data_path_delay_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x15, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + data_path_delay), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x16, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_audio_subslot_size_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x16, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + usb_audio_subslot_size), + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x17, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + xhci_mem_info_valid), + }, + { + .data_type = QMI_STRUCT, + .elem_len = 1, + .elem_size = sizeof(struct apps_mem_info_v01), + .is_array = NO_ARRAY, + .tlv_type = 0x17, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + xhci_mem_info), + .ei_array = apps_mem_info_v01_ei, + }, + { + .data_type = QMI_OPT_FLAG, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x18, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + interrupter_num_valid), + }, + { + .data_type = QMI_UNSIGNED_1_BYTE, + .elem_len = 1, + .elem_size = sizeof(uint8_t), + .is_array = NO_ARRAY, + .tlv_type = 0x18, + .offset = offsetof(struct qmi_uaudio_stream_ind_msg_v01, + interrupter_num), + }, + { + .data_type = QMI_EOTI, + .is_array = NO_ARRAY, + .is_array = QMI_COMMON_TLV_TYPE, + }, +}; diff --git a/sound/usb/usb_audio_qmi_v01.h b/sound/usb/usb_audio_qmi_v01.h new file mode 100644 index 0000000000000..aa1018a22105b --- /dev/null +++ b/sound/usb/usb_audio_qmi_v01.h @@ -0,0 +1,150 @@ + /* Copyright (c) 2016, 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. + * + */ +#ifndef USB_QMI_V01_H +#define USB_QMI_V01_H + +#define UAUDIO_STREAM_SERVICE_ID_V01 0x41D +#define UAUDIO_STREAM_SERVICE_VERS_V01 0x01 + +#define QMI_UAUDIO_STREAM_RESP_V01 0x0001 +#define QMI_UAUDIO_STREAM_REQ_V01 0x0001 +#define QMI_UADUIO_STREAM_IND_V01 0x0001 + + +struct mem_info_v01 { + uint64_t va; + uint64_t pa; + uint32_t size; +}; + +struct apps_mem_info_v01 { + struct mem_info_v01 evt_ring; + struct mem_info_v01 tr_data; + struct mem_info_v01 tr_sync; + struct mem_info_v01 xfer_buff; + struct mem_info_v01 dcba; +}; + +struct usb_endpoint_descriptor_v01 { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bEndpointAddress; + uint8_t bmAttributes; + uint16_t wMaxPacketSize; + uint8_t bInterval; + uint8_t bRefresh; + uint8_t bSynchAddress; +}; + +struct usb_interface_descriptor_v01 { + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bInterfaceNumber; + uint8_t bAlternateSetting; + uint8_t bNumEndpoints; + uint8_t bInterfaceClass; + uint8_t bInterfaceSubClass; + uint8_t bInterfaceProtocol; + uint8_t iInterface; +}; + +enum usb_audio_stream_status_enum_v01 { + USB_AUDIO_STREAM_STATUS_ENUM_MIN_VAL_V01 = INT_MIN, + USB_AUDIO_STREAM_REQ_SUCCESS_V01 = 0, + USB_AUDIO_STREAM_REQ_FAILURE_V01 = 1, + USB_AUDIO_STREAM_REQ_FAILURE_NOT_FOUND_V01 = 2, + USB_AUDIO_STREAM_REQ_FAILURE_INVALID_PARAM_V01 = 3, + USB_AUDIO_STREAM_REQ_FAILURE_MEMALLOC_V01 = 4, + USB_AUDIO_STREAM_STATUS_ENUM_MAX_VAL_V01 = INT_MAX, +}; + +enum usb_audio_device_indication_enum_v01 { + USB_AUDIO_DEVICE_INDICATION_ENUM_MIN_VAL_V01 = INT_MIN, + USB_AUDIO_DEV_CONNECT_V01 = 0, + USB_AUDIO_DEV_DISCONNECT_V01 = 1, + USB_AUDIO_DEV_SUSPEND_V01 = 2, + USB_AUDIO_DEV_RESUME_V01 = 3, + USB_AUDIO_DEVICE_INDICATION_ENUM_MAX_VAL_V01 = INT_MAX, +}; + +struct qmi_uaudio_stream_req_msg_v01 { + uint8_t enable; + uint32_t usb_token; + uint8_t audio_format_valid; + uint32_t audio_format; + uint8_t number_of_ch_valid; + uint32_t number_of_ch; + uint8_t bit_rate_valid; + uint32_t bit_rate; + uint8_t xfer_buff_size_valid; + uint32_t xfer_buff_size; +}; +#define QMI_UAUDIO_STREAM_REQ_MSG_V01_MAX_MSG_LEN 39 +extern struct elem_info qmi_uaudio_stream_req_msg_v01_ei[]; + +struct qmi_uaudio_stream_resp_msg_v01 { + struct qmi_response_type_v01 resp; + uint8_t status_valid; + enum usb_audio_stream_status_enum_v01 status; + uint8_t internal_status_valid; + uint32_t internal_status; + uint8_t slot_id_valid; + uint32_t slot_id; + uint8_t usb_token_valid; + uint32_t usb_token; + uint8_t std_as_opr_intf_desc_valid; + struct usb_interface_descriptor_v01 std_as_opr_intf_desc; + uint8_t std_as_data_ep_desc_valid; + struct usb_endpoint_descriptor_v01 std_as_data_ep_desc; + uint8_t std_as_sync_ep_desc_valid; + struct usb_endpoint_descriptor_v01 std_as_sync_ep_desc; + uint8_t usb_audio_spec_revision_valid; + uint16_t usb_audio_spec_revision; + uint8_t data_path_delay_valid; + uint8_t data_path_delay; + uint8_t usb_audio_subslot_size_valid; + uint8_t usb_audio_subslot_size; + uint8_t xhci_mem_info_valid; + struct apps_mem_info_v01 xhci_mem_info; + uint8_t interrupter_num_valid; + uint8_t interrupter_num; +}; +#define QMI_UAUDIO_STREAM_RESP_MSG_V01_MAX_MSG_LEN 191 +extern struct elem_info qmi_uaudio_stream_resp_msg_v01_ei[]; + +struct qmi_uaudio_stream_ind_msg_v01 { + enum usb_audio_device_indication_enum_v01 dev_event; + uint32_t slot_id; + uint8_t usb_token_valid; + uint32_t usb_token; + uint8_t std_as_opr_intf_desc_valid; + struct usb_interface_descriptor_v01 std_as_opr_intf_desc; + uint8_t std_as_data_ep_desc_valid; + struct usb_endpoint_descriptor_v01 std_as_data_ep_desc; + uint8_t std_as_sync_ep_desc_valid; + struct usb_endpoint_descriptor_v01 std_as_sync_ep_desc; + uint8_t usb_audio_spec_revision_valid; + uint16_t usb_audio_spec_revision; + uint8_t data_path_delay_valid; + uint8_t data_path_delay; + uint8_t usb_audio_subslot_size_valid; + uint8_t usb_audio_subslot_size; + uint8_t xhci_mem_info_valid; + struct apps_mem_info_v01 xhci_mem_info; + uint8_t interrupter_num_valid; + uint8_t interrupter_num; +}; +#define QMI_UAUDIO_STREAM_IND_MSG_V01_MAX_MSG_LEN 177 +extern struct elem_info qmi_uaudio_stream_ind_msg_v01_ei[]; + +#endif diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h index 91d0380431b4f..11fb928a87dda 100644 --- a/sound/usb/usbaudio.h +++ b/sound/usb/usbaudio.h @@ -59,6 +59,10 @@ struct snd_usb_audio { bool autoclock; /* from the 'autoclock' module param */ struct usb_host_interface *ctrl_intf; /* the audio control interface */ + + struct mutex dev_lock; /* to protect any race with disconnect */ + int card_num; /* cache pcm card number to use upon disconnect */ + void (*disconnect_cb)(struct snd_usb_audio *chip); }; #define usb_audio_err(chip, fmt, args...) \ diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 2f9e68025ede6..02333234a0960 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -2067,12 +2067,15 @@ int perf_evsel__open_strerror(struct perf_evsel *evsel, struct target *target, case EPERM: case EACCES: return scnprintf(msg, size, - "You may not have permission to collect %sstats.\n" - "Consider tweaking /proc/sys/kernel/perf_event_paranoid:\n" - " -1 - Not paranoid at all\n" - " 0 - Disallow raw tracepoint access for unpriv\n" - " 1 - Disallow cpu events for unpriv\n" - " 2 - Disallow kernel profiling for unpriv", + "You may not have permission to collect %sstats.\n\n" + "Consider tweaking /proc/sys/kernel/perf_event_paranoid,\n" + "which controls use of the performance events system by\n" + "unprivileged users (without CAP_SYS_ADMIN).\n\n" + "The default value is 1:\n\n" + " -1: Allow use of (almost) all events by all users\n" + ">= 0: Disallow raw tracepoint access by users without CAP_IOC_LOCK\n" + ">= 1: Disallow CPU event access by users without CAP_SYS_ADMIN\n" + ">= 2: Disallow kernel profiling by users without CAP_SYS_ADMIN", target->system_wide ? "system-wide " : ""); case ENOENT: return scnprintf(msg, size, "The %s event is not supported.", diff --git a/tools/testing/selftests/powerpc/copyloops/asm/processor.h b/tools/testing/selftests/powerpc/copyloops/asm/processor.h deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/tools/testing/selftests/powerpc/primitives/asm/ppc-opcode.h b/tools/testing/selftests/powerpc/primitives/asm/ppc-opcode.h deleted file mode 100644 index e69de29bb2d1d..0000000000000 diff --git a/tools/virtio/linux/hrtimer.h b/tools/virtio/linux/hrtimer.h deleted file mode 100644 index e69de29bb2d1d..0000000000000